glom-1.22.4/0000755000175000017500000000000012235000132013750 5ustar00murraycmurrayc00000000000000glom-1.22.4/depcomp0000755000175000017500000005601612234777116015363 0ustar00murraycmurrayc00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: glom-1.22.4/macros/0000755000175000017500000000000012235000126015237 5ustar00murraycmurrayc00000000000000glom-1.22.4/macros/lib-prefix.m40000644000175000017500000001503612234777072017573 0ustar00murraycmurrayc00000000000000# lib-prefix.m4 serial 5 (gettext-0.15) dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing dnl the basename of the libdir, either "lib" or "lib64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. The current dnl practice is that on a system supporting 32-bit and 64-bit instruction dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit dnl libraries go under $prefix/lib. We determine the compiler's default dnl mode by looking at the compiler's library search path. If at least dnl of its elements ends in /lib64 or points to a directory whose absolute dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the dnl default, namely "lib". acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ]) glom-1.22.4/macros/ax_boost_python_murrayc.m40000644000175000017500000001141212234776363022507 0ustar00murraycmurrayc00000000000000# =========================================================================== # http://www.nongnu.org/autoconf-archive/ax_boost_python.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_PYTHON_MURRAYC (based on AX_BOOST_PYTHON) # # DESCRIPTION # # This macro checks to see if the Boost.Python library is installed. It # also attempts to guess the currect library name using several attempts. # It tries to build the library name using a user supplied name or suffix # and then just the raw library. # # If the library is found, HAVE_BOOST_PYTHON is defined and # BOOST_PYTHON_LIBS is set to the name of the library. # # This macro calls AC_SUBST(BOOST_PYTHON_LIBS). # # In order to ensure that the Python headers are specified on the include # path, this macro requires AX_PYTHON to be called. # # LICENSE # # Copyright (c) 2008 Michael Tindal # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 20100412 #With large changes by murrayc and danielk #Note that this previously said it was checking for the library, but it's techically the both the headers and library that it looks for. murrayc AC_DEFUN([AX_BOOST_PYTHON_MURRAYC], [AC_REQUIRE([MM_CHECK_MODULE_PYTHON])dnl AC_LANG_PUSH([C++]) saved_CPPFLAGS=$CPPFLAGS saved_LIBS=$LIBS # Note that this requires PYTHON_CPPFLAGS from MM_CHECK_MODULE_PYTHON() # Note that this expects boost/ to be at some top-level such as /usr/include/ # We couldn't check for anything else anyway because there's no pkg-config file to tell us where it is CPPFLAGS="$PYTHON_CPPFLAGS $saved_CPPFLAGS" AC_CACHE_CHECK([whether the Boost::Python headers are available], [ac_cv_boost_python], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include using namespace boost::python; BOOST_PYTHON_MODULE(test) { (void)0; } ]], [])], [ac_cv_boost_python=yes], [ac_cv_boost_python=no])]) AS_IF([test "x$ac_cv_boost_python" = xyes], [ BOOST_PYTHON_LIBS= ax_python_lib=boost_python AC_ARG_WITH([boost-python], [AS_HELP_STRING([--with-boost-python], [specify the boost python shared library to use. For instance, --with-boost-python=boost_python-py25. Defaults to boost-python. If you use this then you should probably set PYTHON too, to avoid using multiple python versions.])], [if test "x$with_boost_python" != xno; then ax_python_lib=$with_boost_python ax_boost_python_lib=boost_python-$with_boost_python fi]) AC_MSG_CHECKING([for boost::python shared library]) for ax_lib in "$ax_python_lib" "$ax_boost_python_lib" boost_python do # Note that this requires PYTHON_LIBS from MM_CHECK_MODULE_PYTHON() LIBS="$saved_LIBS $PYTHON_LIBS -l$ax_lib" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[boost::python::object test_object;]])], [BOOST_PYTHON_LIBS="-l$ax_lib"; break]) done AS_IF([test "x$BOOST_PYTHON_LIBS" != x], [ax_result=$BOOST_PYTHON_LIBS], [ax_result=]) AC_MSG_RESULT([$ax_result]) ]) CPPFLAGS=$saved_CPPFLAGS LIBS=$saved_LIBS AC_LANG_POP([C++]) AS_IF([test "x$ac_cv_boost_python" = xyes && test "x$BOOST_PYTHON_LIBS" != x], [AC_DEFINE([HAVE_BOOST_PYTHON], [1], [define if the Boost::Python headers and library are available])], [AC_MSG_ERROR([[boost::python is required to build $PACKAGE_NAME]])]) AC_SUBST([BOOST_PYTHON_LIBS]) ]) glom-1.22.4/macros/gettext.m40000644000175000017500000003457012234777071017221 0ustar00murraycmurrayc00000000000000# gettext.m4 serial 60 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST(INTLOBJS) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) glom-1.22.4/macros/gnome-doc-utils.m40000644000175000017500000000357212234777071020541 0ustar00murraycmurrayc00000000000000dnl Do not call GNOME_DOC_DEFINES directly. It is split out from dnl GNOME_DOC_INIT to allow gnome-doc-utils to bootstrap off itself. AC_DEFUN([GNOME_DOC_DEFINES], [ AC_ARG_WITH([help-dir], AC_HELP_STRING([--with-help-dir=DIR], [path to help docs]),, [with_help_dir='${datadir}/gnome/help']) HELP_DIR="$with_help_dir" AC_SUBST(HELP_DIR) AC_ARG_WITH([omf-dir], AC_HELP_STRING([--with-omf-dir=DIR], [path to OMF files]),, [with_omf_dir='${datadir}/omf']) OMF_DIR="$with_omf_dir" AC_SUBST(OMF_DIR) AC_ARG_WITH([help-formats], AC_HELP_STRING([--with-help-formats=FORMATS], [list of formats]),, [with_help_formats='']) DOC_USER_FORMATS="$with_help_formats" AC_SUBST(DOC_USER_FORMATS) AC_ARG_ENABLE([scrollkeeper], [AC_HELP_STRING([--disable-scrollkeeper], [do not make updates to the scrollkeeper database])],, enable_scrollkeeper=yes) AM_CONDITIONAL([ENABLE_SK],[test "$gdu_cv_have_gdu" = "yes" -a "$enable_scrollkeeper" = "yes"]) dnl disable scrollkeeper automatically for distcheck DISTCHECK_CONFIGURE_FLAGS="--disable-scrollkeeper $DISTCHECK_CONFIGURE_FLAGS" AC_SUBST(DISTCHECK_CONFIGURE_FLAGS) AM_CONDITIONAL([HAVE_GNOME_DOC_UTILS],[test "$gdu_cv_have_gdu" = "yes"]) ]) # GNOME_DOC_INIT ([MINIMUM-VERSION],[ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) # AC_DEFUN([GNOME_DOC_INIT], [AC_REQUIRE([AC_PROG_LN_S])dnl if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) ifelse([$1],,[gdu_cv_version_required=0.3.2],[gdu_cv_version_required=$1]) AC_MSG_CHECKING([gnome-doc-utils >= $gdu_cv_version_required]) PKG_CHECK_EXISTS([gnome-doc-utils >= $gdu_cv_version_required], [gdu_cv_have_gdu=yes],[gdu_cv_have_gdu=no]) if test "$gdu_cv_have_gdu" = "yes"; then AC_MSG_RESULT([yes]) ifelse([$2],,[:],[$2]) else AC_MSG_RESULT([no]) ifelse([$3],,[AC_MSG_ERROR([gnome-doc-utils >= $gdu_cv_version_required not found])],[$3]) fi GNOME_DOC_DEFINES ]) glom-1.22.4/macros/libtool.m40000644000175000017500000106000712234777105017172 0ustar00murraycmurrayc00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # 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. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS glom-1.22.4/macros/po.m40000644000175000017500000004460612234777072016155 0ustar00murraycmurrayc00000000000000# po.m4 serial 15 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Autoconf >= 2.61 supports dots in --with options. define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix], [ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIB[]NAME[]_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) glom-1.22.4/macros/intlmacosx.m40000644000175000017500000000456512234777072017720 0ustar00murraycmurrayc00000000000000# intlmacosx.m4 serial 1 (gettext-0.17) dnl Copyright (C) 2004-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on MacOS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in MacOS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], gt_cv_func_CFPreferencesCopyAppValue, [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFPreferencesCopyAppValue(NULL, NULL)], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1, [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in MacOS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent, [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1, [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) glom-1.22.4/macros/ltversion.m40000644000175000017500000000126212234777106017551 0ustar00murraycmurrayc00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # 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. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) glom-1.22.4/macros/mm-python.m40000644000175000017500000000724612234776363017470 0ustar00murraycmurrayc00000000000000## Copyright (c) 2009 Openismus GmbH ## ## This file is part of mm-autofu. ## ## mm-autofu is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published ## by the Free Software Foundation, either version 2 of the License, ## or (at your option) any later version. ## ## mm-autofu is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with mm-autofu. If not, see . #serial 20090721 ## _MM_PYTHON_SYSCONFIG(expression, [action-if-succeeded], [action-if-failed]) ## m4_define([_MM_PYTHON_SYSCONFIG], [dnl mm_val=`$PYTHON -c "dnl [import sys; from distutils import sysconfig; sys.stdout.write]dnl ([sysconfig.]$1 or '')" 2>&AS_MESSAGE_LOG_FD` AS_IF([test "[$]?" -eq 0 && test "x$mm_val" != x], [$2], [$3])[]dnl ]) ## MM_CHECK_MODULE_PYTHON ## ## Check whether Python is installed, and determine the include path ## and libraries needed for linking a C or C++ program with Python. ## The resulting configuration is stored in the PYTHON_CPPFLAGS and ## PYTHON_LIBS substitution variables. ## ## Note: We should document why we use this instead of AX_PYTHON(). ## AC_DEFUN([MM_CHECK_MODULE_PYTHON], [dnl AC_REQUIRE([AM_PATH_PYTHON])[]dnl dnl AC_ARG_VAR([PYTHON_CPPFLAGS], [compiler include flags for Python])[]dnl AC_ARG_VAR([PYTHON_LIBS], [linker flags for Python])[]dnl dnl AC_MSG_CHECKING([for Python headers]) AS_IF([test "x$PYTHON_CPPFLAGS" = x], [ _MM_PYTHON_SYSCONFIG([[get_python_inc()]], [PYTHON_CPPFLAGS="-I$mm_val"]) _MM_PYTHON_SYSCONFIG([[get_python_inc(True)]], [test "x$PYTHON_CPPFLAGS" = "x-I$mm_val" || PYTHON_CPPFLAGS="$PYTHON_CPPFLAGS -I$mm_val"]) ]) AC_MSG_RESULT([$PYTHON_CPPFLAGS]) AC_MSG_CHECKING([for Python libraries]) AS_IF([test "x$PYTHON_LIBS" = x], [ _MM_PYTHON_SYSCONFIG([[get_config_var('LIBS')]], [PYTHON_LIBS=$mm_val]) set X dnl On Windows the library is in libs/, not in lib/, so check there as well: _MM_PYTHON_SYSCONFIG([[EXEC_PREFIX]], [set "[$]@" "$mm_val/lib" "$mm_val/libs" "$mm_val/lib64" "$mm_val/lib/i386-linux-gnu"]) _MM_PYTHON_SYSCONFIG([[PREFIX]], [set "[$]@" "$mm_val/lib" "$mm_val/libs" "$mm_val/lib64" "$mm_val/lib/i386-linux-gnu"]) _MM_PYTHON_SYSCONFIG([[get_python_lib(True, True)]], [set "[$]@" "$mm_val/config" "$mm_val"]) _MM_PYTHON_SYSCONFIG([[get_python_lib(False, True)]], [set "[$]@" "$mm_val/config" "$mm_val"]) shift mm_pylib=python$PYTHON_VERSION mm_pylib_win=`echo "$mm_pylib" | sed 's/\.//g'` for mm_dir do AS_IF([test -f "$mm_dir/lib$mm_pylib.so" || \ test -f "$mm_dir/lib$mm_pylib.a"], [AS_CASE([$mm_dir], [[/usr/lib|/usr/lib64]], [PYTHON_LIBS="$PYTHON_LIBS -l$mm_pylib"; break], [PYTHON_LIBS="$PYTHON_LIBS -L$mm_dir -l$mm_pylib"; break])], [test -f "$mm_dir/lib$mm_pylib_win.dll.a" || \ test -f "$mm_dir/lib$mm_pylib_win.a" || \ test -f "$mm_dir/$mm_pylib_win.lib"], [PYTHON_LIBS="$PYTHON_LIBS -L$mm_dir -l$mm_pylib_win"; break]) done ]) AC_MSG_RESULT([$PYTHON_LIBS]) mm_save_CPPFLAGS=$CPPFLAGS mm_save_LIBS=$LIBS CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS" LIBS="$LIBS $PYTHON_LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[(void) PyImport_ImportModule((char*)"sys");]])],, [AC_MSG_FAILURE([[Failed to compile test program for Python embedding.]])]) CPPFLAGS=$mm_save_CPPFLAGS LIBS=$mm_save_LIBS[]dnl ]) glom-1.22.4/macros/mm-pkg.m40000644000175000017500000000271012234252646016710 0ustar00murraycmurrayc00000000000000## Copyright (c) 2009 Daniel Elstner ## ## This file is part of mm-autofu. ## ## mm-autofu is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published ## by the Free Software Foundation, either version 2 of the License, ## or (at your option) any later version. ## ## mm-autofu is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with mm-autofu. If not, see . #serial 20090710 ## MM_PKG_CONFIG_SUBST(variable, arguments, [action-if-found], [action-if-not-found]) ## ## Run the pkg-config utility with the specified command-line ## and capture its standard output in the named shell . If the ## command exited successfully, execute in the shell if ## specified. If the command failed, run if given, ## otherwise ignore the error. ## AC_DEFUN([MM_PKG_CONFIG_SUBST], [dnl m4_assert([$# >= 2])[]dnl AC_REQUIRE([PKG_PROG_PKG_CONFIG])[]dnl AC_MSG_CHECKING([for $1]) AS_IF([test -z "${$1+set}"], [$1=`$PKG_CONFIG $2 2>&AS_MESSAGE_LOG_FD` AS_IF([test "[$]?" -eq 0], [$3], [$4])]) AC_MSG_RESULT([[$]$1]) AC_SUBST([$1])[]dnl ]) glom-1.22.4/macros/ltoptions.m40000644000175000017500000003007312234777105017560 0ustar00murraycmurrayc00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # 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. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) glom-1.22.4/macros/nls.m40000644000175000017500000000226612234777072016327 0ustar00murraycmurrayc00000000000000# nls.m4 serial 3 (gettext-0.15) dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ]) glom-1.22.4/macros/intltool.m40000644000175000017500000002772412234777073017406 0ustar00murraycmurrayc00000000000000## intltool.m4 - Configure intltool for the target system. -*-Shell-script-*- ## Copyright (C) 2001 Eazel, Inc. ## Author: Maciej Stachowiak ## Kenneth Christiansen ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## As a special exception to the GNU General Public License, if you ## distribute this file as part of a program that contains a ## configuration script generated by Autoconf, you may include it under ## the same distribution terms that you use for the rest of that program. dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 42 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' AC_SUBST(INTLTOOL_V_MERGE) AC_SUBST(INTLTOOL__v_MERGE_) AC_SUBST(INTLTOOL__v_MERGE_0) INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) AC_SUBST(intltool__v_merge_options_) AC_SUBST(intltool__v_merge_options_0) INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be executed at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) glom-1.22.4/macros/lib-ld.m40000644000175000017500000000653112234777072016675 0ustar00murraycmurrayc00000000000000# lib-ld.m4 serial 3 (gettext-0.13) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 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 ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) glom-1.22.4/macros/ltsugar.m40000644000175000017500000001042412234777106017205 0ustar00murraycmurrayc00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) glom-1.22.4/macros/lt~obsolete.m40000644000175000017500000001375612234777106020111 0ustar00murraycmurrayc00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # 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. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) glom-1.22.4/macros/iconv.m40000644000175000017500000001375312234777071016653 0ustar00murraycmurrayc00000000000000# iconv.m4 serial AM6 (gettext-0.17) dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) glom-1.22.4/macros/progtest.m40000644000175000017500000000555012234777072017401 0ustar00murraycmurrayc00000000000000# progtest.m4 serial 4 (gettext-0.14.2) dnl Copyright (C) 1996-2003, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. AC_PREREQ(2.50) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # 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 # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) glom-1.22.4/glom.service.in0000644000175000017500000000006712234252645016721 0ustar00murraycmurrayc00000000000000[D-BUS Service] Name=org.maemo.glom Exec=@bindir@/glom glom-1.22.4/xmldocs.make0000644000175000017500000000615412234777071016314 0ustar00murraycmurrayc00000000000000# # No modifications of this Makefile should be necessary. # # To use this template: # 1) Define: figdir, docname, lang, omffile, and entities in # your Makefile.am file for each document directory, # although figdir, omffile, and entities may be empty # 2) Make sure the Makefile in (1) also includes # "include $(top_srcdir)/xmldocs.make" and # "dist-hook: app-dist-hook". # 3) Optionally define 'entities' to hold xml entities which # you would also like installed # 4) Figures must go under $(figdir)/ and be in PNG format # 5) You should only have one document per directory # 6) Note that the figure directory, $(figdir)/, should not have its # own Makefile since this Makefile installs those figures. # # example Makefile.am: # figdir = figures # docname = scrollkeeper-manual # lang = C # omffile=scrollkeeper-manual-C.omf # entities = fdl.xml # include $(top_srcdir)/xmldocs.make # dist-hook: app-dist-hook # # About this file: # This file was taken from scrollkeeper_example2, a package illustrating # how to install documentation and OMF files for use with ScrollKeeper # 0.3.x and 0.4.x. For more information, see: # http://scrollkeeper.sourceforge.net/ # Version: 0.1.2 (last updated: March 20, 2002) # # ********** Begin of section some packagers may need to modify ********** # This variable (docdir) specifies where the documents should be installed. # This default value should work for most packages. docdir = $(datadir)/gnome/help/$(docname)/$(lang) # ********** You should not have to edit below this line ********** xml_files = $(entities) $(docname).xml EXTRA_DIST = $(xml_files) $(omffile) CLEANFILES = omf_timestamp include $(top_srcdir)/omf.make all: omf $(docname).xml: $(entities) -ourdir=`pwd`; \ cd $(srcdir); \ cp $(entities) $$ourdir app-dist-hook: if test "$(figdir)"; then \ $(mkinstalldirs) $(distdir)/$(figdir); \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ $(INSTALL_DATA) $$file $(distdir)/$(figdir)/$$basefile; \ done \ fi install-data-local: omf $(mkinstalldirs) $(DESTDIR)$(docdir) for file in $(xml_files); do \ cp $(srcdir)/$$file $(DESTDIR)$(docdir); \ done if test "$(figdir)"; then \ $(mkinstalldirs) $(DESTDIR)$(docdir)/$(figdir); \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \ done \ fi install-data-hook: install-data-hook-omf uninstall-local: uninstall-local-doc uninstall-local-omf uninstall-local-doc: -if test "$(figdir)"; then \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ rm -f $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \ done; \ rmdir $(DESTDIR)$(docdir)/$(figdir); \ fi -for file in $(xml_files); do \ rm -f $(DESTDIR)$(docdir)/$$file; \ done -rmdir $(DESTDIR)$(docdir) clean-local: clean-local-doc clean-local-omf # for non-srcdir builds, remove the copied entities. clean-local-doc: if test $(srcdir) != .; then \ rm -f $(entities); \ fi glom-1.22.4/docs/0000755000175000017500000000000012235000130014676 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/0000755000175000017500000000000012235000130016747 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/sv/0000755000175000017500000000000012235000130017377 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/sv/legal.xml0000644000175000017500000000645412235000130021216 0ustar00murraycmurrayc00000000000000 Tillstånd att kopiera, distribuera och/eller modifiera detta dokument ges under villkoren i GNU Free Documentation License (GFDL), version 1.1 eller senare, utgivet av Free Software Foundation utan standardavsnitt och omslagstexter. En kopia av GFDL finns att hämta på denna länk eller i filen COPYING-DOCS som medföljer denna handbok. Denna handbok utgör en av flera GNOME-handböcker som distribueras under villkoren i GFDL. Om du vill distribuera denna handbok separat från övriga handböcker kan du göra detta genom att lägga till en kopia av licensavtalet i handboken enligt instruktionerna i avsnitt 6 i licensavtalet. Flera namn på produkter och tjänster är registrerade varumärken. I de fall dessa namn förekommer i GNOME-dokumentation - och medlemmarna i GNOME-dokumentationsprojektet är medvetna om dessa varumärken - är de skrivna med versaler eller med inledande versal. DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET TILLHANDAHÅLLS UNDER VILLKOREN I GNU FREE DOCUMENTATION LICENSE ENDAST UNDER FÖLJANDE FÖRUTSÄTTNINGAR: DOKUMENTET TILLHANDAHÅLLS I "BEFINTLIGT SKICK" UTAN NÅGRA SOM HELST GARANTIER, VARE SIG UTTRYCKLIGA ELLER UNDERFÖRSTÅDDA, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, GARANTIER ATT DOKUMENTET ELLER EN MODIFIERAD VERSION AV DOKUMENTET INTE INNEHÅLLER NÅGRA FELAKTIGHETER, ÄR LÄMPLIGT FÖR ETT VISST ÄNDAMÅL ELLER INTE STRIDER MOT LAG. HELA RISKEN VAD GÄLLER KVALITET, EXAKTHET OCH UTFÖRANDE AV DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET LIGGER HELT OCH HÅLLET PÅ ANVÄNDAREN. OM ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT SKULLE VISA SIG INNEHÅLLA FELAKTIGHETER I NÅGOT HÄNSEENDE ÄR DET DU (INTE DEN URSPRUNGLIGA SKRIBENTEN, FÖRFATTAREN ELLER NÅGON ANNAN MEDARBETARE) SOM FÅR STÅ FÖR ALLA EVENTUELLA KOSTNADER FÖR SERVICE, REPARATIONER ELLER KORRIGERINGAR. DENNA GARANTIFRISKRIVNING UTGÖR EN VÄSENTLIG DEL AV DETTA LICENSAVTAL. DETTA INNEBÄR ATT ALL ANVÄNDNING AV ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT BEVILJAS ENDAST UNDER DENNA ANSVARSFRISKRIVNING; UNDER INGA OMSTÄNDIGHETER ELLER INOM RAMEN FÖR NÅGON LAGSTIFTNING, OAVSETT OM DET GÄLLER KRÄNKNING (INKLUSIVE VÅRDSLÖSHET), KONTRAKT ELLER DYLIKT, SKA FÖRFATTAREN, DEN URSPRUNGLIGA SKRIBENTEN ELLER ANNAN MEDARBETARE ELLER ÅTERFÖRSÄLJARE AV DOKUMENTET ELLER AV EN MODIFIERAD VERSION AV DOKUMENTET ELLER NÅGON LEVERANTÖR TILL NÅGON AV NÄMNDA PARTER STÄLLAS ANSVARIG GENTEMOT NÅGON FÖR NÅGRA DIREKTA, INDIREKTA, SÄRSKILDA ELLER OFÖRUTSEDDA SKADOR ELLER FÖLJDSKADOR AV NÅGOT SLAG, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, SKADOR BETRÄFFANDE FÖRLORAD GOODWILL, HINDER I ARBETET, DATORHAVERI ELLER NÅGRA ANDRA TÄNKBARA SKADOR ELLER FÖRLUSTER SOM KAN UPPKOMMA PÅ GRUND AV ELLER RELATERAT TILL ANVÄNDNINGEN AV DOKUMENTET ELLER MODIFIERADE VERSIONER AV DOKUMENTET, ÄVEN OM PART SKA HA BLIVIT INFORMERAD OM MÖJLIGHETEN TILL SÅDANA SKADOR. glom-1.22.4/docs/user-guide/sv/glom.xml0000644000175000017500000013137212235000130021066 0ustar00murraycmurrayc00000000000000 ]>
Glom User Guide V0.2 for Glom v1.6 2004 Murray Cumming 2006Daniel Nylander (po@danielnylander.se) Gloms utvecklingsteam Tillstånd att kopiera, distribuera och/eller modifiera detta dokument ges under villkoren i GNU Free Documentation License (GFDL), version 1.1 eller senare, utgivet av Free Software Foundation utan standardavsnitt och omslagstexter. En kopia av GFDL finns att hämta på denna länk eller i filen COPYING-DOCS som medföljer denna handbok. Denna handbok utgör en av flera GNOME-handböcker som distribueras under villkoren i GFDL. Om du vill distribuera denna handbok separat från övriga handböcker kan du göra detta genom att lägga till en kopia av licensavtalet i handboken enligt instruktionerna i avsnitt 6 i licensavtalet. Flera namn på produkter och tjänster är registrerade varumärken. I de fall dessa namn förekommer i GNOME-dokumentation - och medlemmarna i GNOME-dokumentationsprojektet är medvetna om dessa varumärken - är de skrivna med versaler eller med inledande versal. DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET TILLHANDAHÅLLS UNDER VILLKOREN I GNU FREE DOCUMENTATION LICENSE ENDAST UNDER FÖLJANDE FÖRUTSÄTTNINGAR: DOKUMENTET TILLHANDAHÅLLS I "BEFINTLIGT SKICK" UTAN NÅGRA SOM HELST GARANTIER, VARE SIG UTTRYCKLIGA ELLER UNDERFÖRSTÅDDA, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, GARANTIER ATT DOKUMENTET ELLER EN MODIFIERAD VERSION AV DOKUMENTET INTE INNEHÅLLER NÅGRA FELAKTIGHETER, ÄR LÄMPLIGT FÖR ETT VISST ÄNDAMÅL ELLER INTE STRIDER MOT LAG. HELA RISKEN VAD GÄLLER KVALITET, EXAKTHET OCH UTFÖRANDE AV DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET LIGGER HELT OCH HÅLLET PÅ ANVÄNDAREN. OM ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT SKULLE VISA SIG INNEHÅLLA FELAKTIGHETER I NÅGOT HÄNSEENDE ÄR DET DU (INTE DEN URSPRUNGLIGA SKRIBENTEN, FÖRFATTAREN ELLER NÅGON ANNAN MEDARBETARE) SOM FÅR STÅ FÖR ALLA EVENTUELLA KOSTNADER FÖR SERVICE, REPARATIONER ELLER KORRIGERINGAR. DENNA GARANTIFRISKRIVNING UTGÖR EN VÄSENTLIG DEL AV DETTA LICENSAVTAL. DETTA INNEBÄR ATT ALL ANVÄNDNING AV ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT BEVILJAS ENDAST UNDER DENNA ANSVARSFRISKRIVNING; UNDER INGA OMSTÄNDIGHETER ELLER INOM RAMEN FÖR NÅGON LAGSTIFTNING, OAVSETT OM DET GÄLLER KRÄNKNING (INKLUSIVE VÅRDSLÖSHET), KONTRAKT ELLER DYLIKT, SKA FÖRFATTAREN, DEN URSPRUNGLIGA SKRIBENTEN ELLER ANNAN MEDARBETARE ELLER ÅTERFÖRSÄLJARE AV DOKUMENTET ELLER AV EN MODIFIERAD VERSION AV DOKUMENTET ELLER NÅGON LEVERANTÖR TILL NÅGON AV NÄMNDA PARTER STÄLLAS ANSVARIG GENTEMOT NÅGON FÖR NÅGRA DIREKTA, INDIREKTA, SÄRSKILDA ELLER OFÖRUTSEDDA SKADOR ELLER FÖLJDSKADOR AV NÅGOT SLAG, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, SKADOR BETRÄFFANDE FÖRLORAD GOODWILL, HINDER I ARBETET, DATORHAVERI ELLER NÅGRA ANDRA TÄNKBARA SKADOR ELLER FÖRLUSTER SOM KAN UPPKOMMA PÅ GRUND AV ELLER RELATERAT TILL ANVÄNDNINGEN AV DOKUMENTET ELLER MODIFIERADE VERSIONER AV DOKUMENTET, ÄVEN OM PART SKA HA BLIVIT INFORMERAD OM MÖJLIGHETEN TILL SÅDANA SKADOR. Murray Cumming Gloms utvecklingsteam
murrayc@murrayc.com
Glom 1.6 20 Juni 2004 Murray Cumming Murray Cumming This manual describes version 1.6 of Glom Återkoppling To report a bug or make a suggestion regarding the Glom or this manual can be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla before submitting your bug to ensure that yours hasn't already been reported. Användarhandbok för Glom.
MY-GNOME-APP mygnomeapp Introduktion Glom låter dig designa och använda databassystem. Komma igång Starta Glom Du kan starta Glom på följande sätt: Applications menu Choose Office Glom . When You Start Glom When you start Glom, the following window is displayed. You may open an existing Glom file or create a new one, possibly basing a new Glom file on one of the examples.
Glom Start Up Window, Opening an Existing File Shows Glom main window used to open an existing Glom file.
Glom Start Up Window, Creating a New File Shows Glom main window used to create a new Glom file.
Using Glom as an Operator To open an existing Glom document, either open that document from the File Manager, or choose Glom from the Applications menu, and then choose the document when asked. Glom will ask you for a user name and password to access the database. Your administrator will provide your user name and password. When you open an existing document, Glom will be in Operator user level. This user level allows you to find and edit records, but does not allow you to change the fundamental structure of the database. Navigering Each database has several tables. To look at a different table, choose Tables from the Navigate menu. Then double-click on the table, or select it and click the Open button.
Navigating to a Table Navigating to a Table.
Viewing and Entering Data When in Data Mode, you can view or enter information in either the List or Details view. The List View The List view shows many records at once and usually shows only the most important fields. When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you. To create a new record just click the New button, or start typing into a field in the last empty row. A new record row will be created with blank fields for you to fill in.
The List View The List View.
To sort the records just click on a column header. For instance, you could might click on a date column to list invoices in order of their date, and click again to list them in reverse order.
The Details View The details view shows only one record and usually shows all the fields arranged suitably. When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you. To create a new record just click the New button. A new record will be created with blank fields for you to fill in.
The Details View The Details View.
Finding Data Choose Find Mode from the Mode menu. The fields in the List and Details views will now be empty, and a Find button will appear at the bottom of the window. Enter information, or part of the information, into a field to find records with that information in that field. For instance, enter Jim into a name field to find records with "Jim" or "Jimmy" in the name. When you press the Find button, Glom will search for records and then display them. If only one record is found then it will show you that record in the Details view. If several records are found then it will show you those records in the List view. Printing Reports If your database developer has defined some reports for a table then you will seem them listed in the Reports menu. Just choose the report from the menu to create the report. If you have previously performed a search then the report will contain only the currently-found data. Otherwise it will contain all data in the current report. Remember that each table has its own reports so you may need to switch to the relevant table to use a particular report.
A report A report.
Using Glom as a Developer When you create a new document, Glom will be in the Developer user level. You can also change to the Developer user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it. Adding Tables You can see the list of existing tables by choosing Tables from the Navigate menu. You will also see this window after connecting to a database server, after creating a new document. To create a new table, click the Add button and enter the name for the new table. Glom will suggest a human-readable title for this table. Operators will see this title instead of the actual table name. You can also mark a tables as hidden from Operators. For instance, Operators should see "Invoice Lines" as related records from the "Invoices" table, but they should never be able to navigate directly to the "Invoice Lines" table. You can also specify one table as the default table. This table will be shown whenever an operator opens an existing document, without asking him to select a table from the list. You can also use this window to rename an existing table. Click the Open button to look at the selected table. Editing Fields Choose Fields from the Developer menu. This shows the list of fields in the table. New tables automatically have a primary key field, but you can change this field if necessary. Click the Add button to add a new field, then enter the name of the new field. Glom will guess an appropriate human-readable title for this field, but you can edit this. Operators will see this title instead of the actual field name. To specify more field details, select the field and click the Details button.
Editing Fields Editing the table's fields.
Primära nycklar Each table must have one, and only one, Primary Key. The value in this field will be unique, meaning that each value in this field will appear in only one record in the table. For instance, each record in a "Customers" table would have a "Customer ID". This value will be used to refer to that customer from other tables, such as "Projects" and "Invoices" records. See the Creating Relationships section to see how you can relate tables together. Fälttyper Glom offers a few simple field types: Number Text Datum Tid Boolean - either true or false Bild Calculated Fields Field values can be calculated in terms of other fields, using the Python programming language. This calculation should be the implementation of a python function, which should return a value. The return value will be used as the value of the field. This value will be recalculated every time one of the source fields changes. TODO: This only works for default values at the moment, and you can not use field values in the calculation yet. You can also use calculations to specify a default value for fields, by selecting the Default Value tab in the Field Details window, clicking on the Calculate Value check box, and then entering a Python calculation. You can test this calculation in the Edit window.
Arranging Layouts Each table has List and Details views, and by default these show all fields in the table, in order of creation. You can edit the layout by choosing Layout from the Developer menu. Arranging the List View For the List view, you can specify the sequence of field columns, and whether some fields are hidden.
Editing the List Layout Editing the list layout.
Arranging the Details View For the Details view, you can create groups of fields, and give these groups titles. You can then place fields in these groups and specify the sequence fo fields in these groups. You can also specify the sequence of these groups. For instance, in a "Contacts" table, you might create a "Name" group, and place the "title", "first_name" and "last_name" fields in that group. You might have other groups for the "Address" fields.
Editing the details Layout Editing the Details Layout.
Creating Relationships Tables in the Database are often related together. For instance, an "Invoices" table might have a "Customer ID" field. A value in this field would specify a record in the "Customers" table with the same value. Glom can show extra information, such as the customer name, from that related record. Or it can show a list of several related records - for instance, several related "Invoice Lines" that are related to a record in the "Invoice" record. To create relationships, choose Relationships from the Developer menu. This will show the list of existing relationships. Click the Add button to create a new relationship, and enter a name for it. You should then choose a field in the current table, and a field in another table to which it should be related. This relationship will find any records in the other table for which the values in both fields are equal. You can use the relationship in the following places. To show a related field on the List or Details view. To show a list of related records on the Details view. To lookup a value from a field in a related record. For instance, to copy the current price of a "Product" into the "Price" field of an "Invoice Line" record. To calculate a field value. Users Administration To define the Operators who can use your database, and to specify what access they have to the various tables, choose Users from the Developer menu. Translations Glom's user interface (and this document) is translated into several languages, as you should see already if you are using your computer with a non-English user interface. In addition, Glom automatically shows and understands numbers and dates according to the current user's local conventions. For instance, a user in the USA might enter a price as 1.99 and a date as 1/13/2008, but a German user of the same database will later see that as 1,99 and 13.1.2008. However, the Glom system that you create also contains text that must be translated if it will be used by people who speak different languages. For instance, you must provide translations for the titles of your tables, fields, and reports. All of these text items can be seen in a list when you choose Translations from the Developer menu. In this window you can specify the language that you used for the original text, and enter translations for each text item for additional languages. When the Glom system is opened by a user of that language then these text items will be shown in the user interface.
Translations Translations.
Experienced translators may be more familiar with the .po file format, or you might wish to use the many tools that work with the .po file format. By using the Export button you can create a .po file to use in a separate tool or to send to a translator. You can then import the resulting translation by using the Import button.
Defining Reports Adding or Editing Reports Glom can produce reports to show specific fields for sets of records, sorted and grouped. For instance, a shop might need a report listing all products sold in one month, grouped by product type, and sorted by price inside each group. Each table has its own reports, which are available to the operator from the Reports menu. To define a report, or to change the definition of an existing report, choose Reports from the Developer menu.
Creating or Editing Reports Creating or editing reports.
Notice that each report has an ID as well as a human-readable name. This allows your report to have a translated title when used on a computer that uses a different language.
Editing a Report A Glom report has three areas: The Header, which appears at the start of the report The Main area, in which the records and summary lines are shown, with the actual data from the database. The Footer, which appears at the end of the report. Inside an area, such as the Main part, you may add report Parts, such as fields, text, or images. These will usually appear in a row on the printed report, with one row for each record. In the simple case, this will look much like Glom's list view. You can add parts to your report by selecting them from the Available Parts list and then clicking the Add button. The part will then be added to the Parts list, in the selected area. To specify details for the parts, such as the text or image to display, or to choose the field to display, select the part in the Parts list and click the Edit button. You may also specify field formatting by clicking the Formatting button, just as you would when defining a details or list layout.
Editing a Report Editing a report.
Some parts may contain other parts and have extra properties to control how they present their child parts. For instance, the Group By part groups records together by a field. For instance, a products report might group a list of products by product type. You can even add a second sub-grouping inside the main Group By part, by selecting your top-level Group By part in the Parts list while adding a new Group By part from the Available Parts list. For instance, you might group your products by manufacturer, inside each product type group. To specify the field by which the records should be grouped, select your Group By part in the Parts list and click the Edit button. You can then choose the field by which the records should be grouped, and select the fields by which these records should be sorted within the group. You may also specify some additional fields to be displayed in the group's title row. For instance, you might want to group products by a manufacturer ID, but also show the manufacturer name.
Editing a Group By Part Editing a report.
The Vertical Group part may contain other items. For instance, it allows you to arrange fields below each other instead of just one after the other in the horizontal row. This is useful for grouping related fields such as address lines, or just to squeeze more information into the records's row on the report.
A Report with Vertical Groups A Report with Vertical Groups.
When you have finished, click the Close button to save the report's definition. Your report can then be chosen from the Reports menu. See the Printing Reports section for more details.
Dialogs Dialog: Initial dialog This dialog allows the user to choose an existing document or create a new document. Existing documents may be selecting from the list of recently opened documents or by select a file with the file chooser dialog. Documents can also be opened via the network if other users are running Glom on the local network. Finally, a new document can be created either by opening a template file which already contains some initial tables and records, or by creating an empty document. Dialog: New database Dialog: Create database Dialog: Connection This dialog requests a user name and password for connection to a database server. This is usually not the same username and password combination with which you log in to your system. All Glom systems require a database server on which the actual data will be stored. If the database server is not running on your local computer ("localhost"), then you must also provide its network hostname, such as "glomserver.openismus.com", though your hostname will be different. Your system administrator can provide these database login details. If you are the system administrator, see Glom's Postgres Configuration web page for help with installing and configuring a database server. Dialog: Connection Error This dialog is shown when Glom could not connect to the specified database server. Either the database server is not running at the specified hostname, or the user name and password were not accepted by the database server. See the Connection Dialog section for more details. Dialog: Database preferences Dialog: Change language Window: Textobject Window: Imageobject Dialog: Notebook Dialog: Data invalid format Dialog: Relationship overview Window: Groups Dialog: Group by sort fields Dialog: Group by secondary fields Window: Button script Window: Field calculation Dialog: New group Dialog: Choose user Dialog: User Dialog: Translation identify original Dialog: Translation copy Dialog: Choose Date Dialog: Import Into Table This dialog allows the user to import a CSV (comma separated value) file into the current database table. It shows the first few rows of the file to import and allows the user to select the target field in the database for each column in the CSV file. For auto-incremented primary keys, the primary key field cannot be used as a target field, but otherwise one column must be imported into the primary key field. About Glom Glom is maintained by Glom and GNOME community volunteers. To find more information about Glom, please visit the Glom Web site. To report a bug or make a suggestion regarding this application or this manual, you can submit them using bugzilla. Another excellent source of information are the Glom mailing lists. This program is distributed under the terms of the GNU General Public license as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of this license can be found at this link, or in the file COPYING included with the source code of this program. Concepts Glom is easy to use, but you must understand the following basic concepts. Database: Each Glom document allows access to one database. Table: Each database contains several tables, such as "Customers" and "Invoices" tables. Field: Each table has several fields, such as "Customer ID", "First Name", and "Date of Birth" fields. In other documents and applications, fields are sometimes called "Columns" Records: Each table contains several records, each of which has values for each of the fields. For instance, the "Customers" table will have a record for each customer. In other documents and applications, records are sometimes called Rows. Relationships: Each table might be related to other tables, via fields in both tables. For instance, a "Customers" table could have a relationship to the "Invoices" table, so that people could see all the invoices for that customer. Only developers need to understand this concept. In other documents and applications, relationships are sometimes called "Joins". Calculated fields and button scripts Calculated fields and button scripts use the Python programming language. The calculation or script is the implementation of a function whose signature is provided for you.
Editing the definition of a calculated field Editing the definition of a calculated field.
Field values For instance, record["name_first"] is the value of the name_first field in the current record. Related Records For instance, record.related["location"] provides the related records for the current record. Single related records For relationships that specify a single record, you can get the value of a field in that record. For instance, record.related["location"]["name"] is the value of the name field in the table indicated by the location relationship (often called location::name). Multiple related records For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance, record.related["invoice_lines"].sum("total_price"). Testing for empty values How you test for empty values depends on the type of field: Non-text fields Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0. You can test whether a field is empty by using Python's None. For instance: if(record["contact_id"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] You might also test whether there are any related records. For instance: if(record.related["contacts"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] Text fields For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance: if(record["name_full"] == ""): return "No Name" else: return record["name_full"] Using the full pygda API pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the current database directly. This allows you to run any SQL query, for instance to read data from the database with a SELECT, or to change values in the database with an UPDATE. Note that the connection is already open so you can avoid the difficult work of specifying the connection details. The record's table_name attribute also provides the name of the current table. This example reads all data from the current table and prints the values to the terminal: # Use the current database's connection # to get all the data for the current table. # # record.connection is an already-open gda.connection object, # saving us the bother of opening the connection, # or even knowing the name of the database. query = "SELECT * FROM %s" % record.table_name data_model = gda.gda_execute_select_command(record.connection, query) rows = data_model.get_n_rows() columns = data_model.get_n_columns() print " Number of columns: ", columns for i in range(columns): print " column ", i; print " name=", data_model.get_column_title(i) # Find out whether it's the primary key: field = data_model.describe_column(i) if field.get_primary_key(): print " (primary key)" print "\n"; print " Number of rows: ", rows for row_index in range(rows): print " row ", row_index; for col_index in range(columns): print " value=", data_model.get_value_at(col_index, row_index).get() print "\n";
glom-1.22.4/docs/user-guide/sv/sv.po0000644000175000017500000007432612235000130020403 0ustar00murraycmurrayc00000000000000msgid "" msgstr "" "Project-Id-Version: glom doc\n" "POT-Creation-Date: 2006-11-16 04:17+0000\n" "PO-Revision-Date: 2006-11-16 20:13+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: C/legal.xml:2(para) #: C/glom.xml:2(para) msgid "Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual." msgstr "TillstÃ¥nd att kopiera, distribuera och/eller modifiera detta dokument ges under villkoren i GNU Free Documentation License (GFDL), version 1.1 eller senare, utgivet av Free Software Foundation utan standardavsnitt och omslagstexter. En kopia av GFDL finns att hämta pÃ¥ denna länk eller i filen COPYING-DOCS som medföljer denna handbok." #: C/legal.xml:12(para) #: C/glom.xml:12(para) msgid "This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license." msgstr "Denna handbok utgör en av flera GNOME-handböcker som distribueras under villkoren i GFDL. Om du vill distribuera denna handbok separat frÃ¥n övriga handböcker kan du göra detta genom att lägga till en kopia av licensavtalet i handboken enligt instruktionerna i avsnitt 6 i licensavtalet." #: C/legal.xml:19(para) #: C/glom.xml:19(para) msgid "Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters." msgstr "Flera namn pÃ¥ produkter och tjänster är registrerade varumärken. I de fall dessa namn förekommer i GNOME-dokumentation - och medlemmarna i GNOME-dokumentationsprojektet är medvetna om dessa varumärken - är de skrivna med versaler eller med inledande versal." #: C/legal.xml:35(para) #: C/glom.xml:35(para) msgid "DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND" msgstr "DOKUMENTET TILLHANDAHÃ…LLS I \"BEFINTLIGT SKICK\" UTAN NÃ…GRA SOM HELST GARANTIER, VARE SIG UTTRYCKLIGA ELLER UNDERFÖRSTÃ…DDA, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, GARANTIER ATT DOKUMENTET ELLER EN MODIFIERAD VERSION AV DOKUMENTET INTE INNEHÃ…LLER NÃ…GRA FELAKTIGHETER, ÄR LÄMPLIGT FÖR ETT VISST ÄNDAMÃ…L ELLER INTE STRIDER MOT LAG. HELA RISKEN VAD GÄLLER KVALITET, EXAKTHET OCH UTFÖRANDE AV DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET LIGGER HELT OCH HÃ…LLET PÃ… ANVÄNDAREN. OM ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT SKULLE VISA SIG INNEHÃ…LLA FELAKTIGHETER I NÃ…GOT HÄNSEENDE ÄR DET DU (INTE DEN URSPRUNGLIGA SKRIBENTEN, FÖRFATTAREN ELLER NÃ…GON ANNAN MEDARBETARE) SOM FÃ…R STÃ… FÖR ALLA EVENTUELLA KOSTNADER FÖR SERVICE, REPARATIONER ELLER KORRIGERINGAR. DENNA GARANTIFRISKRIVNING UTGÖR EN VÄSENTLIG DEL AV DETTA LICENSAVTAL. DETTA INNEBÄR ATT ALL ANVÄNDNING AV ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT BEVILJAS ENDAST UNDER DENNA ANSVARSFRISKRIVNING;" #: C/legal.xml:55(para) #: C/glom.xml:55(para) msgid "UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES." msgstr "UNDER INGA OMSTÄNDIGHETER ELLER INOM RAMEN FÖR NÃ…GON LAGSTIFTNING, OAVSETT OM DET GÄLLER KRÄNKNING (INKLUSIVE VÃ…RDSLÖSHET), KONTRAKT ELLER DYLIKT, SKA FÖRFATTAREN, DEN URSPRUNGLIGA SKRIBENTEN ELLER ANNAN MEDARBETARE ELLER Ã…TERFÖRSÄLJARE AV DOKUMENTET ELLER AV EN MODIFIERAD VERSION AV DOKUMENTET ELLER NÃ…GON LEVERANTÖR TILL NÃ…GON AV NÄMNDA PARTER STÄLLAS ANSVARIG GENTEMOT NÃ…GON FÖR NÃ…GRA DIREKTA, INDIREKTA, SÄRSKILDA ELLER OFÖRUTSEDDA SKADOR ELLER FÖLJDSKADOR AV NÃ…GOT SLAG, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, SKADOR BETRÄFFANDE FÖRLORAD GOODWILL, HINDER I ARBETET, DATORHAVERI ELLER NÃ…GRA ANDRA TÄNKBARA SKADOR ELLER FÖRLUSTER SOM KAN UPPKOMMA PÃ… GRUND AV ELLER RELATERAT TILL ANVÄNDNINGEN AV DOKUMENTET ELLER MODIFIERADE VERSIONER AV DOKUMENTET, ÄVEN OM PART SKA HA BLIVIT INFORMERAD OM MÖJLIGHETEN TILL SÃ…DANA SKADOR." #: C/legal.xml:28(para) #: C/glom.xml:28(para) msgid "DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: " msgstr "DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET TILLHANDAHÃ…LLS UNDER VILLKOREN I GNU FREE DOCUMENTATION LICENSE ENDAST UNDER FÖLJANDE FÖRUTSÄTTNINGAR: " #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:180(None) msgid "@@image: 'figures/start.png'; md5=b8c9acc03f9f1cdb213e37c9da91817a" msgstr "@@image: 'figures/start.png'; md5=b8c9acc03f9f1cdb213e37c9da91817a" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:248(None) msgid "@@image: 'figures/glom_design_fields.png'; md5=e7137a37c7c74a96a914b0df777f5f6b" msgstr "@@image: 'figures/glom_design_fields.png'; md5=e7137a37c7c74a96a914b0df777f5f6b" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:494(None) msgid "@@image: 'figures/glom_design_fields_dialog_calculated.png'; md5=3306db510932ab3bb99f7e1c676b2512" msgstr "@@image: 'figures/glom_design_fields_dialog_calculated.png'; md5=3306db510932ab3bb99f7e1c676b2512" #: C/glom.xml:28(title) msgid "Glom User Guide V0.1" msgstr "Användarguide för Glom v0.1" #: C/glom.xml:29(subtitle) msgid "for Glom v0.8" msgstr "för Glom v0.8" #: C/glom.xml:32(year) msgid "2004" msgstr "2004" #: C/glom.xml:33(holder) #: C/glom.xml:99(para) #: C/glom.xml:100(para) msgid "Murray Cumming" msgstr "Murray Cumming" #: C/glom.xml:47(publishername) #: C/glom.xml:60(orgname) msgid "Glom Development Team" msgstr "Gloms utvecklingsteam" #: C/glom.xml:57(firstname) msgid "Murrayc" msgstr "Murrayc" #: C/glom.xml:58(surname) msgid "Cumming" msgstr "Cumming" #: C/glom.xml:61(email) msgid "murrayc@murrayc.com" msgstr "murrayc@murrayc.com" #: C/glom.xml:96(revnumber) msgid "Glom 0.8" msgstr "Glom 0.8" #: C/glom.xml:97(date) msgid "20 June 2004" msgstr "20 Juni 2004" #: C/glom.xml:105(releaseinfo) msgid "This manual describes version 0.8 of Glom" msgstr "Den här handboken beskriver version 0.8 av Glom" #: C/glom.xml:108(title) msgid "Feedback" msgstr "Ã…terkoppling" #: C/glom.xml:109(para) msgid "To report a bug or make a suggestion regarding the Glom or this manual can be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla before submitting your bug to ensure that yours hasn't already been reported." msgstr "" #: C/glom.xml:119(para) msgid "User manual for Glom." msgstr "Användarhandbok för Glom." #: C/glom.xml:124(primary) msgid "MY-GNOME-APP" msgstr "" #: C/glom.xml:127(primary) msgid "mygnomeapp" msgstr "" #: C/glom.xml:135(title) msgid "Introduction" msgstr "Introduktion" #: C/glom.xml:136(para) msgid "Glom allows you to design and use database systems." msgstr "Glom lÃ¥ter dig designa och använda databassystem." #: C/glom.xml:149(title) msgid "Getting Started" msgstr "Komma igÃ¥ng" #: C/glom.xml:152(title) msgid "Starting Glom" msgstr "Starta Glom" #: C/glom.xml:153(para) msgid "You can start Glom in the following ways:" msgstr "Du kan starta Glom pÃ¥ följande sätt:" #: C/glom.xml:157(term) msgid "Applications menu" msgstr "" #: C/glom.xml:159(para) msgid "Choose OfficeGlom." msgstr "" #: C/glom.xml:170(title) msgid "When You Start Glom" msgstr "" #: C/glom.xml:171(para) msgid "When you start Glom, the following window is displayed." msgstr "" #: C/glom.xml:176(title) msgid "Glom Start Up Window" msgstr "" #: C/glom.xml:183(phrase) msgid "Shows Glom main window." msgstr "" #: C/glom.xml:198(title) msgid "Using Glom as an Operator" msgstr "" #: C/glom.xml:199(para) msgid "To open an existing glom document, either open that document from the File Manager, or choose Glom from the Applications menu, and then choose the document when asked. Glom will ask you for a user name and password to access the database. Your administrator will provide your user name and password." msgstr "" #: C/glom.xml:201(para) msgid "When you open an existing document, Glom will be in Operatoruser level. This user level allows you to find and edit records, but does not allow you to change the fundamental structure of the database." msgstr "" #: C/glom.xml:204(title) msgid "Navigation" msgstr "Navigering" #: C/glom.xml:205(para) msgid "Each database has several tables. To look at a different table, choose Table from the Navigate menu. Then double-click on the table, or select it and click the Open button." msgstr "" #: C/glom.xml:209(title) msgid "Entering Data" msgstr "" #: C/glom.xml:210(para) msgid "When in Data Mode, you can enter information into either the List or Details view. The List view shows many records at once, but does not show every field. The details view shows only one record, and shows all the fields arranged suitably." msgstr "" #: C/glom.xml:211(para) msgid "When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you." msgstr "" #: C/glom.xml:212(para) msgid "To create a new record just click the New button. A new record will be created with blank fields for you to fill in." msgstr "" #: C/glom.xml:216(title) msgid "Finding Data" msgstr "" #: C/glom.xml:217(para) msgid "Choose Find Mode from the Mode menu. The fields in the List and Details views will now be empty, and a Find button will appear at the bottom of the window." msgstr "" #: C/glom.xml:218(para) msgid "Enter information, or part of the information, into a field to find records with that information in that field. For instance, enter Jim into a name field to find records with \"Jim\" or \"Jimmy\" in the name." msgstr "" #: C/glom.xml:219(para) msgid "When you press the Find button, glom will search for records and then display them. If only one record is found then it will show you that record in the Details view. If several records are found then it will show you those records in the List view." msgstr "" #: C/glom.xml:226(title) msgid "Using Glom as a Developer" msgstr "" #: C/glom.xml:227(para) msgid "When you create a new document, Glom will be in the Developeruser level. You can also change to the Developer user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it." msgstr "" #: C/glom.xml:230(title) msgid "Adding Tables" msgstr "" #: C/glom.xml:231(para) msgid "You can see the list of existing tables by choosing Table from the Navigate menu. You will also see this window after connecting to a database server, after creating a new document. To create a new table, click the Add button and enter the name for the new table. This name should not contain any spaces or special characters. Glom will suggest a human-readable title for this table. Operators will see this title instead of the actual table name. You can also marka a tables as hidden from Operators. For instance, Operators should see \"Invoice Lines\" as related records from the \"Invoices\" table, but they should never be able to navigate directly to the \"Invoice Lines\" table." msgstr "" #: C/glom.xml:232(para) msgid "You can also specify one table as the default table. This table will be shown whenever an operator opens an existing document, without asking him to select a table from the list." msgstr "" #: C/glom.xml:233(para) msgid "You can also use this window to rename an existing table." msgstr "" #: C/glom.xml:234(para) msgid "Click the Open button to look at the selected table." msgstr "" #: C/glom.xml:238(title) #: C/glom.xml:244(title) msgid "Editing Fields" msgstr "" #: C/glom.xml:239(para) msgid "Choose Fields from the Developer menu. This shows the list of fields in the table. New tables automatically have a primary key field, but you can change this field if necessary." msgstr "" #: C/glom.xml:240(para) msgid "Click the Add button to add a new field, then enter the name of the new field. The name should not contain spaces or special characters. Glom will guess an appropriate human-readable title for this field, but you can edit this. Operators will see this title instead of the actual field name." msgstr "" #: C/glom.xml:241(para) msgid "To specify more field details, select the field and click the Details button." msgstr "" #: C/glom.xml:251(phrase) msgid "Editing the table's fields." msgstr "" #: C/glom.xml:260(title) msgid "Primary Keys" msgstr "Primära nycklar" #: C/glom.xml:261(para) msgid "Each table must have one, and only one, Primary Key. The value in this field will be unique, meaning that each value in this field will appear in only one record in the table. For instance, each record in a \"Customers\" table would have a \"Customer ID\". This value will be used to refer to that customer from other tables, such as \"Projects\" and \"Invoices\" records. See the Creating Relationships section to see how you can relate tables together." msgstr "" #: C/glom.xml:265(title) msgid "Field Types" msgstr "Fälttyper" #: C/glom.xml:268(simpara) msgid "Number" msgstr "" #: C/glom.xml:269(simpara) msgid "Text" msgstr "Text" #: C/glom.xml:270(simpara) msgid "Date" msgstr "Datum" #: C/glom.xml:271(simpara) msgid "Time" msgstr "Tid" #: C/glom.xml:272(simpara) msgid "Boolean - either true or false" msgstr "" #: C/glom.xml:273(simpara) msgid "Image" msgstr "Bild" #: C/glom.xml:266(para) msgid "Glom offers a few simple field types: " msgstr "" #: C/glom.xml:279(title) msgid "Calculated Fields" msgstr "" #: C/glom.xml:280(para) msgid "Field values can be calculated in terms of other fields, using the Python programming language. This calculation should be the implementation of a python function, which should return a value. The return value will be used as the value of the field. This value will be recalculated every time one of the source fields changes. TODO: This only works for default values at the moment, and you can not use field values in the calculation yet." msgstr "" #: C/glom.xml:281(para) msgid "You can also use calculations to specify a default value for fields, by selecting the Default Value tab in the Field Details window, clicking on the Calculate Value check box, and then entering a Python calculation. You can test this calculation in the Edit window." msgstr "" #: C/glom.xml:287(title) msgid "Arranging Layouts" msgstr "" #: C/glom.xml:288(para) msgid "Each table has List and Details views, and by default these show all fields in the table, in order of creation. You can edit the layout by choosing Layout from the Developer menu." msgstr "" #: C/glom.xml:289(para) msgid "For the List view, you can specify the sequence of field columns, and whether some fields are hidden." msgstr "" #: C/glom.xml:290(para) msgid "For the Details view, you can create groups of fields, and give these groups titles. You can then place fields in these groups and specify the sequence fo fields in these groups. You can also specify the sequence of these groups. For instance, in a \"Contacts\" table, you might create a \"Name\" group, and place the \"title\", \"first_name\" and \"last_name\" fields in that group. You might have other groups for the \"Address\" fields." msgstr "" #: C/glom.xml:292(para) msgid "Date and Time fields will be displayed, and entered, in the correct format according to the user's locale, but stored in the database in a canonical form. Therefore, a German user can enter a date in the German format, but this will later be displayed to a U.S. user in the U.S. format." msgstr "" #: C/glom.xml:296(title) msgid "Creating Relationships" msgstr "" #: C/glom.xml:297(para) msgid "Tables in the Database are often related together. For instance, an \"Invoices\" table might have a \"Customer ID\" field. A value in this field would specify a record in the \"Customers\" table with the same value. Glom can show extra information, such as the customer name, from that related record. Or it can show a list of several related records - for instance, several related \"Invoice Lines\" that are related to a record in the \"Invoice\" record." msgstr "" #: C/glom.xml:298(para) msgid "To create relationships, choose Relationships from the Developer menu. This will show the list of existing relationships. Click the Add button to create a new relationship, and enter a name for it. You should then choose a field in the current table, and a field in another table to which it should be related. This relationship will find any records in the other table for which the values in both fields are equal." msgstr "" #: C/glom.xml:302(simpara) msgid "To show a related field on the List or Details view." msgstr "" #: C/glom.xml:303(simpara) msgid "To show a list of related records on the Details view." msgstr "" #: C/glom.xml:304(simpara) msgid "To lookup a value from a field in a related record. For instance, to copy the current price of a \"Product\" into the \"Price\" field of an \"Invoice Line\" record." msgstr "" #: C/glom.xml:305(simpara) msgid "To calculate a field value." msgstr "" #: C/glom.xml:299(para) msgid "You can use the relationship in the following places. " msgstr "" #: C/glom.xml:311(title) msgid "Users Administration" msgstr "" #: C/glom.xml:312(para) msgid "To define the Operators who can use your database, and to specify what access they have to the various tables, choose Users from the Developer menu.." msgstr "" #: C/glom.xml:321(title) msgid "Dialogs" msgstr "" #: C/glom.xml:323(title) msgid "Dialog: New database" msgstr "" #: C/glom.xml:328(title) msgid "Dialog: Create database" msgstr "" #: C/glom.xml:333(title) msgid "Dialog: Connection" msgstr "" #: C/glom.xml:338(title) msgid "Dialog: Database preferences" msgstr "" #: C/glom.xml:343(title) msgid "Dialog: Change language" msgstr "" #: C/glom.xml:348(title) msgid "Window: Textobject" msgstr "" #: C/glom.xml:353(title) msgid "Window: Imageobject" msgstr "" #: C/glom.xml:358(title) msgid "Dialog: Notebook" msgstr "" #: C/glom.xml:363(title) msgid "Dialog: Data invalid format" msgstr "" #: C/glom.xml:368(title) msgid "Dialog: Relationship overview" msgstr "" #: C/glom.xml:373(title) msgid "Window: Groups" msgstr "" #: C/glom.xml:378(title) msgid "Dialog: Group by sort fields" msgstr "" #: C/glom.xml:383(title) msgid "Dialog: Group by secondary fields" msgstr "" #: C/glom.xml:388(title) msgid "Window: Button script" msgstr "" #: C/glom.xml:393(title) msgid "Window: Field calculation" msgstr "" #: C/glom.xml:398(title) msgid "Dialog: New group" msgstr "" #: C/glom.xml:403(title) msgid "Dialog: Choose user" msgstr "" #: C/glom.xml:408(title) msgid "Dialog: User" msgstr "" #: C/glom.xml:413(title) msgid "Dialog: Translation identify original" msgstr "" #: C/glom.xml:418(title) msgid "Dialog: Translation copy" msgstr "" #: C/glom.xml:423(title) msgid "Dialog: Choose Date" msgstr "" #: C/glom.xml:447(title) msgid "About Glom" msgstr "" #: C/glom.xml:448(para) msgid "Glom is maintained by Glom and GNOME community volunteers. To find more information about Glom, please visit the Glom Web site." msgstr "" #: C/glom.xml:453(para) msgid "To report a bug or make a suggestion regarding this application or this manual, you can submit them using bugzilla." msgstr "" #: C/glom.xml:459(para) msgid "Another excellent source of information are the Glom mailing lists." msgstr "" #: C/glom.xml:464(para) msgid "This program is distributed under the terms of the GNU General Public license as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of this license can be found at this link, or in the file COPYING included with the source code of this program." msgstr "" #: C/glom.xml:473(title) msgid "Concepts" msgstr "" #: C/glom.xml:476(simpara) msgid "Database: Each glom document allows access to one database." msgstr "" #: C/glom.xml:477(simpara) msgid "Table: Each database contains several tables, such as \"Customers\" and \"Invoices\" tables." msgstr "" #: C/glom.xml:478(simpara) msgid "Field: Each table has several fields, such as \"Customer ID\", \"First Name\", and \"Date of Birth\" fields. In other documents and applications, fields are sometimes called \"Columns\"" msgstr "" #: C/glom.xml:479(simpara) msgid "Records: Each table contains several records, each of which has values for each of the fields. For instance, the \"Customers\" table will have a record for each customer. In other documents and applications, records are sometimes called Rows." msgstr "" #: C/glom.xml:480(simpara) msgid "Relationships: Each table might be related to other tables, via fields in both tables. For instance, a \"Customers\" table could have a relationship to the \"Invoices\" table, so that people could see all the invoices for that customer. Only developers need to understand this concept. In other documents and applications, relationships are sometimes called \"Joins\"." msgstr "" #: C/glom.xml:474(para) msgid "Glom is easy to use, but you must understand the following basic concepts. " msgstr "" #: C/glom.xml:486(title) msgid "Calculated fields and button scripts" msgstr "" #: C/glom.xml:487(para) msgid "Calculated fields and button scripts use the Python programming language. The calculation or script is the implementation of a function whose signature is provided for you." msgstr "" #: C/glom.xml:490(title) msgid "Editing the definition of a calculated field" msgstr "" #: C/glom.xml:497(phrase) msgid "Editing the definition of a calculated field." msgstr "" #: C/glom.xml:505(title) msgid "Field values" msgstr "" #: C/glom.xml:506(programlisting) #, no-wrap msgid "record[\"name_first\"]" msgstr "" #: C/glom.xml:506(para) msgid "For instance, is the value of the name_first field in the current record." msgstr "" #: C/glom.xml:510(title) msgid "Related Records" msgstr "" #: C/glom.xml:511(programlisting) #, no-wrap msgid "record.related[\"location\"]" msgstr "" #: C/glom.xml:511(para) msgid "For instance, provides the related records for the current record." msgstr "" #: C/glom.xml:514(title) msgid "Single related records" msgstr "" #: C/glom.xml:515(programlisting) #, no-wrap msgid "record.related[\"location\"][\"name\"]" msgstr "" #: C/glom.xml:515(para) msgid "For relationships that specify a single record, you can get the value of a field in that record. For instance, is the value of the name field in the table indicated by the location relationship (often called location::name)." msgstr "" #: C/glom.xml:519(title) msgid "Multiple related records" msgstr "" #: C/glom.xml:520(programlisting) #, no-wrap msgid "record.related[\"invoice_lines\"].sum(\"total_price\")" msgstr "" #: C/glom.xml:520(para) msgid "For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance, ." msgstr "" #: C/glom.xml:526(title) msgid "Testing for empty values" msgstr "" #: C/glom.xml:527(para) msgid "How you test for empty values depends on the type of field:" msgstr "" #: C/glom.xml:532(title) msgid "Non-text fields" msgstr "" #: C/glom.xml:533(para) msgid "Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0." msgstr "" #: C/glom.xml:534(para) msgid "You can test whether a field is empty by using Python's None. For instance:" msgstr "" #: C/glom.xml:536(programlisting) #, no-wrap msgid "" "\n" " if(record[\"contact_id\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" #: C/glom.xml:543(para) msgid "You might also test whether there are any related records. For instance:" msgstr "" #: C/glom.xml:545(programlisting) #, no-wrap msgid "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" #: C/glom.xml:555(title) msgid "Text fields" msgstr "" #: C/glom.xml:556(para) msgid "For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance:" msgstr "" #: C/glom.xml:558(programlisting) #, no-wrap msgid "" "\n" " if(record[\"name_full\"] == \"\"):\n" " return \"No Name\"\n" " else:\n" " return record[\"name_full\"]\n" " " msgstr "" #: C/glom.xml:569(title) msgid "Using the full pygda API" msgstr "" #: C/glom.xml:570(para) msgid "pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the current database directly. This allows you to run any SQL query, for instance to read data from the database with a SELECT, or to change values in the database with an UPDATE. Note that the connection is already open so you can avoid the difficult work of specifying the connection details." msgstr "" #: C/glom.xml:571(para) msgid "The record's table_name attribute also provides the name of the current table." msgstr "" #: C/glom.xml:572(para) msgid "(Note that the record.connection and record.table_name attributes are only available since Glom 1.1.6.)" msgstr "" #: C/glom.xml:573(para) msgid "This example reads all data from the current table and prints the values to the terminal:" msgstr "" #: C/glom.xml:575(programlisting) #, no-wrap msgid "" "\n" "# Use the current database's connection \n" "# to get all the data for the current table.\n" "#\n" "# record.connection is an already-open gda.connection object,\n" "# saving us the bother of opening the connection,\n" "# or even knowing the name of the database.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "command = gda.Command(query)\n" "data_model = record.connection.execute_single_command(command)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Number of columns: \", columns\n" "\n" "for i in range(columns):\n" " print \" column \", i;\n" " print \" name=\", data_model.get_column_title(i)\n" "\n" " # Find out whether it's the primary key:\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (primary key)\"\n" "\n" " print \"\\n" "\";\n" " \n" "print \" Number of rows: \", rows\n" "\n" "for row_index in range(rows):\n" " print \" row \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" value=\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n" "\";\n" " " msgstr "" #. Put one translator per line, in the form of NAME , YEAR1, YEAR2. #: C/glom.xml:0(None) msgid "translator-credits" msgstr "Daniel Nylander , 2006" glom-1.22.4/docs/user-guide/es/0000755000175000017500000000000012235000130017356 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/es/es.po0000644000175000017500000022464312235000130020340 0ustar00murraycmurrayc00000000000000# translation of glom.userguide.HEAD.po to Español # Spanish translation for glom manual # # Jorge González , 2007, 2010. # Daniel Mustieles , 2008, 2011. # msgid "" msgstr "" "Project-Id-Version: glom.userguide.HEAD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-01-13 13:25+0000\n" "PO-Revision-Date: 2011-11-03 15:26+0100\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Español \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: C/legal.xml:2(para) C/glom.xml:2(para) msgid "" "Permission is granted to copy, distribute and/or modify this document under " "the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any " "later version published by the Free Software Foundation with no Invariant " "Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy " "of the GFDL at this link or " "in the file COPYING-DOCS distributed with this manual." msgstr "" "Se otorga permiso para copiar, distribuir y/o modificar este documento bajo " "los términos de la Licencia de Documentación Libre de GNU, Versión 1.1 o " "cualquier otra versión posterior publicada por la Free Software Foundation; " "sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de " "Cubierta Trasera. Puede encontrar una copia de la licencia GFDL en este " "enlace o en el archivo " "COPYING-DOCS distribuido con este manual." #: C/legal.xml:12(para) C/glom.xml:12(para) msgid "" "This manual is part of a collection of GNOME manuals distributed under the " "GFDL. If you want to distribute this manual separately from the collection, " "you can do so by adding a copy of the license to the manual, as described in " "section 6 of the license." msgstr "" "Este manual es parte de una colección de manuales de GNOME distribuido bajo " "la GFDL. Si quiere distribuir este manual por separado de la colección, " "puede hacerlo añadiendo una copia de la licencia al manual, tal como se " "describe en la sección 6 de la licencia." #: C/legal.xml:19(para) C/glom.xml:19(para) msgid "" "Many of the names used by companies to distinguish their products and " "services are claimed as trademarks. Where those names appear in any GNOME " "documentation, and the members of the GNOME Documentation Project are made " "aware of those trademarks, then the names are in capital letters or initial " "capital letters." msgstr "" "Muchos de los nombres usados por compañías para distinguir sus productos y " "servicios son mencionados como marcas comerciales. Donde esos nombres " "aparezcan en cualquier documentación de GNOME, y los miembros del Proyecto " "de Documentación de GNOME están al corriente de esas marcas comerciales, " "entonces los nombres se pondrán en mayúsculas o con la inicial en mayúsculas." #: C/legal.xml:35(para) C/glom.xml:35(para) msgid "" "DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, " "EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT " "THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS " "MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE " "RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR " "MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR " "MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL " "WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY " "SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN " "ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION " "OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND" msgstr "" "EL DOCUMENTO SE PROPORCIONA \"TAL CUAL\", SIN GARANTÃA DE NINGÚN TIPO, NI " "EXPLÃCITA NI IMPLÃCITA INCLUYENDO, SIN LIMITACIÓN, GARANTÃA DE QUE EL " "DOCUMENTO O VERSIÓN MODIFICADA DE ÉSTE CAREZCA DE DEFECTOS COMERCIALES, SEA " "ADECUADO A UN FIN CONCRETO O INCUMPLA ALGUNA NORMATIVA. TODO EL RIESGO " "RELATIVO A LA CALIDAD, PRECISIÓN Y UTILIDAD DEL DOCUMENTO O SU VERSIÓN " "MODIFICADA RECAE EN USTED. SI CUALQUIER DOCUMENTO O VERSIÓN MODIFICADA DE " "AQUÉL RESULTARA DEFECTUOSO EN CUALQUIER ASPECTO, USTED (Y NO EL REDACTOR " "INICIAL, AUTOR O CONTRIBUYENTE) ASUMIRà LOS COSTES DE TODA REPARACIÓN, " "MANTENIMIENTO O CORRECCIÓN NECESARIOS. ESTA RENUNCIA DE GARANTÃA ES UNA " "PARTE ESENCIAL DE ESTA LICENCIA. NO SE AUTORIZA EL USO DE NINGÚN DOCUMENTO " "NI VERSIÓN MODIFICADA DE ÉSTE POR EL PRESENTE, SALVO DENTRO DEL CUMPLIMIENTO " "DE LA RENUNCIA;Y" #: C/legal.xml:55(para) C/glom.xml:55(para) msgid "" "UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING " "NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY " "CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE " "DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON " "FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF " "ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, " "WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES " "OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED " "VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE " "POSSIBILITY OF SUCH DAMAGES." msgstr "" "BAJO NINGUNA CIRCUNSTANCIA NI BAJO NINGUNA TEORÃA LEGAL, SEA POR ERROR " "(INCLUYENDO NEGLIGENCIA), CONTRATO O DE ALGÚN OTRO MODO, EL AUTOR, EL " "ESCRITOR INICIAL, CUALQUIER CONTRIBUIDOR, O CUALQUIER DISTRIBUIDOR DEL " "DOCUMENTO O VERSIÓN MODIFICADA DEL DOCUMENTO, O CUALQUIER PROVEEDOR DE " "CUALQUIERA DE ESAS PARTES, SERà RESPONSABLE ANTE NINGUNA PERSONA POR NINGÚN " "DAÑO DIRECTO, INDIRECTO, ESPECIAL, INCIDENTAL O DERIVADO DE NINGÚN TIPO, " "INCLUYENDO, SIN LIMITACIÓN DAÑOS POR PÉRDIDA DE MERCANCÃAS, PARO TÉCNICO, " "FALLO INFORMÃTICO O MAL FUNCIONAMIENTO O CUALQUIER OTRO POSIBLE DAÑO O " "PÉRDIDAS DERIVADAS O RELACIONADAS CON EL USO DEL DOCUMENTO O SUS VERSIONES " "MODIFICADAS, AUNQUE DICHA PARTE HAYA SIDO INFORMADA DE LA POSIBILIDAD DE QUE " "SE PRODUJESEN DICHOS DAÑOS." #: C/legal.xml:28(para) C/glom.xml:28(para) msgid "" "DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS " "OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: " "" msgstr "" "ESTE DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO SE PROPORCIONAN SEGÚN " "LAS CONDICIONES ESTABLECIDAS EN LA LICENCIA DE DOCUMENTACIÓN LIBRE DE GNU " "(GFDL) Y TENIENDO EN CUENTA QUE: " #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:181(None) msgid "@@image: 'figures/start_open.png'; md5=adac27f11f2324c3da2349f72d554994" msgstr "" "@@image: 'figures/start_open.png'; md5=adac27f11f2324c3da2349f72d554994" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:195(None) msgid "" "@@image: 'figures/start_create.png'; md5=f1e4c22fd6811e4ba908e290e76f0474" msgstr "" "@@image: 'figures/start_create.png'; md5=f1e4c22fd6811e4ba908e290e76f0474" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:226(None) msgid "" "@@image: 'figures/glom_tables.png'; md5=a61ac5516314b38c6c7a3f3fd534427f" msgstr "" "@@image: 'figures/glom_tables.png'; md5=a61ac5516314b38c6c7a3f3fd534427f" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:252(None) msgid "" "@@image: 'figures/glom_data_list.png'; md5=3b7469ee1de77081b435db5ac2d48953" msgstr "" "@@image: 'figures/glom_data_list.png'; md5=3b7469ee1de77081b435db5ac2d48953" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:275(None) msgid "" "@@image: 'figures/glom_data_details.png'; " "md5=455bde435350fd53401213dff235bfb3" msgstr "" "@@image: 'figures/glom_data_details.png'; " "md5=455bde435350fd53401213dff235bfb3" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:305(None) msgid "" "@@image: 'figures/glom_report_result.png'; " "md5=2b752779eb0ed68724d094f6e1fef699" msgstr "" "@@image: 'figures/glom_report_result.png'; " "md5=2b752779eb0ed68724d094f6e1fef699" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:343(None) msgid "" "@@image: 'figures/glom_design_fields.png'; " "md5=39a13053db33b9c45bc1f61a0f31a199" msgstr "" "@@image: 'figures/glom_design_fields.png'; " "md5=39a13053db33b9c45bc1f61a0f31a199" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:393(None) msgid "" "@@image: 'figures/glom_design_layout_list.png'; " "md5=213888ef5cd3037b2fa61155b4fe5136" msgstr "" "@@image: 'figures/glom_design_layout_list.png'; " "md5=213888ef5cd3037b2fa61155b4fe5136" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:412(None) msgid "" "@@image: 'figures/glom_design_layout_details.png'; " "md5=6f1d78f90d6ec0ea338014d2ac697a90" msgstr "" "@@image: 'figures/glom_design_layout_details.png'; " "md5=6f1d78f90d6ec0ea338014d2ac697a90" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:458(None) msgid "" "@@image: 'figures/glom_design_translations.png'; " "md5=92b8e4905d0b85ef7f7d248420942a97" msgstr "" "@@image: 'figures/glom_design_translations.png'; " "md5=92b8e4905d0b85ef7f7d248420942a97" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:485(None) msgid "" "@@image: 'figures/glom_design_reports.png'; " "md5=697eb7cc6baebae8b374e474b4fa0899" msgstr "" "@@image: 'figures/glom_design_reports.png'; " "md5=697eb7cc6baebae8b374e474b4fa0899" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:517(None) msgid "" "@@image: 'figures/glom_design_reports_details.png'; " "md5=00ac05c3515a4db2175a47047ec3b98e" msgstr "" "@@image: 'figures/glom_design_reports_details.png'; " "md5=00ac05c3515a4db2175a47047ec3b98e" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:534(None) msgid "" "@@image: 'figures/glom_design_reports_group_by.png'; " "md5=21168c2a89f9febf6905a59c24a3d6de" msgstr "" "@@image: 'figures/glom_design_reports_group_by.png'; " "md5=21168c2a89f9febf6905a59c24a3d6de" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:550(None) msgid "" "@@image: 'figures/glom_design_reports_vertical_group.png'; " "md5=001b3021da2dc0de68358b0b41215afb" msgstr "" "@@image: 'figures/glom_design_reports_vertical_group.png'; " "md5=001b3021da2dc0de68358b0b41215afb" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:766(None) msgid "" "@@image: 'figures/glom_design_fields_dialog_calculated.png'; " "md5=21b9fc570ff40883d1d283d960e45767" msgstr "" "@@image: 'figures/glom_design_fields_dialog_calculated.png'; " "md5=21b9fc570ff40883d1d283d960e45767" #: C/glom.xml:28(title) msgid "Glom User Guide V0.2" msgstr "Manual del usuario de Glom V0.2" #: C/glom.xml:29(subtitle) msgid "for Glom v1.6" msgstr "para Glom v1.6" #: C/glom.xml:32(year) msgid "2004" msgstr "2004" #: C/glom.xml:33(holder) C/glom.xml:99(para) C/glom.xml:100(para) msgid "Murray Cumming" msgstr "Murray Cumming" #: C/glom.xml:47(publishername) C/glom.xml:60(orgname) msgid "Glom Development Team" msgstr "Equipo de desarrollo de Glom" #: C/glom.xml:57(firstname) msgid "Murray" msgstr "Murray" #: C/glom.xml:58(surname) msgid "Cumming" msgstr "Cumming" #: C/glom.xml:61(email) msgid "murrayc@murrayc.com" msgstr "murrayc@murrayc.com" #: C/glom.xml:96(revnumber) msgid "Glom 1.6" msgstr "Glom 1.6" #: C/glom.xml:97(date) msgid "20 June 2004" msgstr "20 de junio de 2004" #: C/glom.xml:105(releaseinfo) msgid "This manual describes version 1.6 of Glom" msgstr "Este manual describe el uso de la versión 1.6 de Glom" #: C/glom.xml:108(title) msgid "Feedback" msgstr "Comentarios" #: C/glom.xml:109(para) msgid "" "To report a bug or make a suggestion regarding the Glom or this manual can " "be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla " "before submitting your bug to ensure that yours hasn't already been reported." msgstr "" "Para informar sobre un error o hacer sugerencias sobre Glom o sobre éste " "manual, puede enviarlas en la página Gnome Bugzilla, seleccionando el producto Glom. " "Para asegurarse de que otros no han informado antes del mismo fallo, busque " "en Bugzilla antes de enviar su error." #: C/glom.xml:119(para) msgid "User manual for Glom." msgstr "Manual del usuario de Glom." #: C/glom.xml:124(primary) msgid "MY-GNOME-APP" msgstr "MY-GNOME-APP" #: C/glom.xml:127(primary) msgid "mygnomeapp" msgstr "mygnomeapp" #: C/glom.xml:135(title) msgid "Introduction" msgstr "Introducción" #: C/glom.xml:136(para) msgid "Glom allows you to design and use database systems." msgstr "Glom le permite diseñar y usar sistemas de bases de datos." #: C/glom.xml:150(title) msgid "Getting Started" msgstr "Inicio" #: C/glom.xml:153(title) msgid "Starting Glom" msgstr "Iniciar Glom" #: C/glom.xml:154(para) msgid "You can start Glom in the following ways:" msgstr "" "Puede iniciar Glom de las siguientes maneras:" #: C/glom.xml:158(term) msgid "Applications menu" msgstr "Menú de Aplicaciones" #: C/glom.xml:160(para) msgid "" "Choose OfficeGlom." msgstr "" "Elija OficinaGlom." #: C/glom.xml:171(title) msgid "When You Start Glom" msgstr "Al iniciar Glom" #: C/glom.xml:172(para) msgid "" "When you start Glom, the following window is " "displayed. You may open an existing Glom file or create a new one, possibly " "basing a new Glom file on one of the examples." msgstr "" "Cuando inicia Glom, se muestra la siguiente " "pantalla. Puede abrir un archivo de Glom existente o crear uno nuevo, " "posiblemente basándose en alguno de los ejemplos para crear el archivo nuevo." #: C/glom.xml:177(title) msgid "Glom Start Up Window, Opening an Existing File" msgstr "Ventana de inicio de Glom, Abrir un archivo existente" #: C/glom.xml:184(phrase) msgid "Shows Glom main window used to open an existing Glom file." msgstr "" "Muestra la ventana principal de Glom usada para abrir un archivo existente." #: C/glom.xml:191(title) msgid "Glom Start Up Window, Creating a New File" msgstr "Ventana de inicio de Glom, Crear un archivo nuevo" #: C/glom.xml:198(phrase) msgid "Shows Glom main window used to create a new Glom file." msgstr "" "Muestra la ventana principal de Glom usada para crear un archivo nuevo." #: C/glom.xml:212(title) msgid "Using Glom as an Operator" msgstr "Uso de Glom como un operador" #: C/glom.xml:213(para) msgid "" "To open an existing Glom document, either open that document from the File " "Manager, or choose Glom from the Applications menu, and then choose the " "document when asked. Glom will ask you for a user name and password to " "access the database. Your administrator will provide your user name and " "password." msgstr "" "Para abrir un documento existente de Glom puede hacerlo con el administrador " "de archivos o bien puede seleccionar Glom en el menú de Aplicaciones, y " "después escoger el documento cuando se le pregunte. Glom le pedirá un nombre " "de usuario y una contraseña para acceder a la base de datos. El " "administrador le proporcionará su nombre de usuario y su contraseña." #: C/glom.xml:215(para) msgid "" "When you open an existing document, Glom will be in Operatoruser level. This user level allows you to find " "and edit records, but does not allow you to change the fundamental structure " "of the database." msgstr "" "Cuando abra un documento existente, Glom estará ejecutándose a " "nivel de usuarioOperador. Éste nivel " "le permite buscar y editar registros pero no le permite cambiar la " "estructura fundamental de la base de datos." #: C/glom.xml:218(title) msgid "Navigation" msgstr "Navegación" #: C/glom.xml:219(para) msgid "" "Each database has several tables. To look at a different table, choose " "Tables from the Navigate menu. Then " "double-click on the table, or select it and click the Open button." msgstr "" "Cada base de datos tiene varias tablas. Para ver una tabla diferente, escoja " "Tablas del menú de Navegación. Después " "pulse dos veces sobre la tabla o bien selecciónela y pulse el botón " "Abrir." #: C/glom.xml:222(title) msgid "Navigating to a Table" msgstr "Navegar a una tabla" #: C/glom.xml:229(phrase) msgid "Navigating to a Table." msgstr "Navegar a una tabla." #: C/glom.xml:238(title) msgid "Viewing and Entering Data" msgstr "Ver e introducir datos" #: C/glom.xml:239(para) msgid "" "When in Data Mode, you can view or enter information in " "either the List or Details view." msgstr "" "Cuando trabaje en el Modo de datos, puede introducir " "información en la Lista o en la vista de " "Detalles." #: C/glom.xml:242(title) C/glom.xml:248(title) msgid "The List View" msgstr "La vista de lista" #: C/glom.xml:243(para) msgid "" "The List view shows many records at once and usually shows only the most " "important fields." msgstr "" "La vista de lista muestra cuántos registros a la vez y habitualmente muestra " "sólo los campos más importantes." #: C/glom.xml:244(para) C/glom.xml:267(para) msgid "" "When you enter data into a field it will be saved into the database " "immediately after you finish editing the field. If it is a date or time " "field then the data format will be checked for you." msgstr "" "Cuando introduzca datos en un campo se guardarán en la base de datos " "inmediatamente después de que termine de editarlo. Si es un campo de fecha u " "hora el formato se comprobará automáticamente." #: C/glom.xml:245(para) msgid "" "To create a new record just click the New button, or " "start typing into a field in the last empty row. A new record row will be " "created with blank fields for you to fill in." msgstr "" "Para crear un nuevo registro simplemente pulse el botón Nuevo, o empiece a escribir en un campo en la última fila vacía. Se " "creará un nuevo registro con los campos en blanco para que los rellene." #: C/glom.xml:255(phrase) msgid "The List View." msgstr "La vista de lista." #: C/glom.xml:261(para) msgid "" "To sort the records just click on a column header. For instance, you could " "might click on a date column to list invoices in order of their date, and " "click again to list them in reverse order." msgstr "" "Para ordenar los registros, simplemente pulse en la cabecera de una columna. " "Por ejemplo, puede querer pulsar sobre una columna de fecha para listar " "facturas por su fecha, y pulsar de nuevo para listarlas en orden inverso." #: C/glom.xml:265(title) C/glom.xml:271(title) msgid "The Details View" msgstr "La vista de detalles" #: C/glom.xml:266(para) msgid "" "The details view shows only one record and usually shows all the fields " "arranged suitably." msgstr "" "La vista de detalles muestra un único registro, y habitualmente muestra " "todos los campos ordenados adecuadamente." #: C/glom.xml:268(para) msgid "" "To create a new record just click the New button. A new " "record will be created with blank fields for you to fill in." msgstr "" "Para crear un nuevo registro pulse el botón Nuevo. Se " "creará un nuevo registro con los campos vacíos para que los pueda rellenar." #: C/glom.xml:278(phrase) msgid "The Details View." msgstr "La vista de detalles." #: C/glom.xml:289(title) msgid "Finding Data" msgstr "Buscar datos" #: C/glom.xml:290(para) msgid "" "Choose Find Mode from the Mode menu. The fields in the " "List and Details views will now be empty, and a Find button will appear at " "the bottom of the window." msgstr "" "Elija Modo de búsqueda del menú. Los campos en la lista y " "vista detallada estarán vacíos y un botón de búsqueda aparecerá en la parte " "inferior de la ventana." #: C/glom.xml:291(para) msgid "" "Enter information, or part of the information, into a field to find records " "with that information in that field. For instance, enter Jim into a name " "field to find records with \"Jim\" or \"Jimmy\" in the name." msgstr "" "Introduzca la información, o parte de la información, en el campo para " "buscar registros que contengan esa información en ese campo. Por ejemplo, " "introduzca Javi en un campo de nombre para buscar registros con «Javi» o " "«Javier» en el campo «Nombre»." #: C/glom.xml:292(para) msgid "" "When you press the Find button, Glom will search for " "records and then display them. If only one record is found then it will show " "you that record in the Details view. If several records are found then it " "will show you those records in the List view." msgstr "" "Al pulsar el botón Buscar, Glom buscará los registros y " "después los mostrará.Si sólo se encuentra un registro entonces se mostrará " "con la vista de «Detalles». Si se encuentran varios registros, entonces se " "mostrarán con la vista de «Lista»." #: C/glom.xml:297(title) msgid "Printing Reports" msgstr "Imprimir informes" #: C/glom.xml:298(para) msgid "" "If your database developer has defined some reports for a table then you " "will seem them listed in the Reports menu. Just choose " "the report from the menu to create the report. If you have previously " "performed a search then the report will contain only the currently-found " "data. Otherwise it will contain all data in the current report. Remember " "that each table has its own reports so you may need to switch to the " "relevant table to use a particular report." msgstr "" "Si el desarrollador de su base de datos ha definido algunos informes para " "una tabla entonces los verá listados en el menú Informes. " "Simplemente seleccione el informe del menú para crearlo. Si ha realizado " "previamente una búsqueda, el informe contendrá únicamente los datos " "encontrados. De otro modo, contendrá todos los datos del informe actual. " "Recuerde que cada tabla tiene sus propios informes, por lo que puede tener " "que cambiar a la tabla oportuna para utilizar un informe concreto." #: C/glom.xml:301(title) msgid "A report" msgstr "Un informe" #: C/glom.xml:308(phrase) msgid "A report." msgstr "Un informe." #: C/glom.xml:320(title) msgid "Using Glom as a Developer" msgstr "Uso de Glom como desarrollador" #: C/glom.xml:321(para) msgid "" "When you create a new document, Glom will be in the Developeruser level. You can also change to the Developer " "user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it." msgstr "" "Cuando cree un nuevo documento, Glom estará ejecutándose a nivel de " "usuarioDesarrollador. También puede cambiar al " "nivel de usuario «Desarrollador» después de abrir un documento existente, " "desde el menú Nivel de usuario. Glom permitirá este " "cambio sólo si el administrador también lo permite." #: C/glom.xml:324(title) msgid "Adding Tables" msgstr "Añadir tablas" #: C/glom.xml:325(para) msgid "" "You can see the list of existing tables by choosing Tables from the Navigate menu. You will also see this " "window after connecting to a database server, after creating a new document. " "To create a new table, click the Add button and enter the " "name for the new table. Glom will suggest a human-readable title for this " "table. Operators will see this title instead of the " "actual table name. You can also mark a tables as hidden " "from Operators. For instance, Operators should see \"Invoice Lines\" as " "related records from the \"Invoices\" table, but they should never be able " "to navigate directly to the \"Invoice Lines\" table." msgstr "" "Puede ver la lista de las tablas existentes escogiendo Tablas del menú de Navegación. También verá esta " "ventana después de conectarse a un servidor de bases de datos, después de " "crear un documento nuevo. Para crear una tabla nueva, pulse en el botón " "Añadir e introduzca un nombre para la tabla nueva. Éste " "nombre no debería contener espacios ni caracteres especiales. Glom le " "sugerirá un título legible por humanos para esta tabla. Los " "Operadores verán éste título en lugar del nombre actual " "de la tabla. También puede marcar una tabla como oculta " "para los Operadores. Por ejemplo, los Operadores deberían ver «Lista de " "facturas» como un registro relacionado de la tabla «Facturas», pero nunca " "deberán poder navegar directamente por la tabla «Lista de facturas»." #. TODO: screenshot #: C/glom.xml:327(para) msgid "" "You can also specify one table as the default table. This " "table will be shown whenever an operator opens an existing document, without " "asking him to select a table from the list." msgstr "" "Puede especificar una tabla como la tabla predeterminada. " "Esta tabla e mostrará siempre que un operador abra un documento existente, " "sin preguntarle que seleccione una tabla de la lista." #: C/glom.xml:328(para) msgid "You can also use this window to rename an existing table." msgstr "También puede usar esta ventana para renombrar una tabla existente." #: C/glom.xml:329(para) msgid "Click the Open button to look at the selected table." msgstr "" "Pulse el botón de Abrir para ver las tablas seleccionadas." #: C/glom.xml:333(title) C/glom.xml:339(title) msgid "Editing Fields" msgstr "Editar campos" #: C/glom.xml:334(para) msgid "" "Choose Fields from the Developer menu. " "This shows the list of fields in the table. New tables automatically have a " "primary key field, but you can change this field if necessary." msgstr "" "Elija Campos del menú de Desarrollador. Esto mostrará la lista de campos en la tabla. Las tablas nuevas " "tienen un campo de clave primaria automáticamente, pero puede cambiar el " "campo si es necesario." #: C/glom.xml:335(para) msgid "" "Click the Add button to add a new field, then enter the " "name of the new field. Glom will guess an appropriate human-readable title " "for this field, but you can edit this. Operators will see " "this title instead of the actual field name." msgstr "" "Para añadir un campo nuevo pulse el botón Añadir e " "introduzca el nombre del campo nuevo. Glom supondrá un título apropiado y " "legible por humanos para este campo, pero puede editarlo. Los " "Operadores verán este nombre en lugar del nombre actual " "del campo." #: C/glom.xml:336(para) msgid "" "To specify more field details, select the field and click the " "Details button." msgstr "" "Para especificar más detalles de un campo, seleccione el campo y pulse en el " "botón de Detalles." #: C/glom.xml:346(phrase) msgid "Editing the table's fields." msgstr "Editar los campos de tabla." #: C/glom.xml:354(title) msgid "Primary Keys" msgstr "Claves primarias" #: C/glom.xml:355(para) msgid "" "Each table must have one, and only one, Primary Key. The " "value in this field will be unique, meaning that each value in this field " "will appear in only one record in the table. For instance, each record in a " "\"Customers\" table would have a \"Customer ID\". This value will be used to " "refer to that customer from other tables, such as \"Projects\" and \"Invoices" "\" records. See the Creating " "Relationships section to see how you can relate tables together." msgstr "" "Cada tabla debe tener una, y solamente una, Clave primaria. El valor en este campo debe ser único, lo que quiere decir que " "cada valor en este campo sólo aparecerá en un sólo registro de la tabla. Por " "ejemplo, cada registro de la tabla «Clientes» tendrá también un campo «ID del " "cliente». Este valor se usará para referirse a este cliente en otras tablas, " "tales como los registros «Proyectos» y «Facturas». Lea la sección Creando relaciones para " "obtener más información acerca de cómo relacionar tablas entre si." #: C/glom.xml:359(title) msgid "Field Types" msgstr "Tipos de campos" #: C/glom.xml:362(simpara) msgid "Number" msgstr "Número" #: C/glom.xml:363(simpara) msgid "Text" msgstr "Texto" #: C/glom.xml:364(simpara) msgid "Date" msgstr "Fecha" #: C/glom.xml:365(simpara) msgid "Time" msgstr "Hora" #: C/glom.xml:366(simpara) msgid "Boolean - either true or false" msgstr "Booleano - tanto cierto como falso" #: C/glom.xml:367(simpara) msgid "Image" msgstr "Imagen" #: C/glom.xml:360(para) msgid "Glom offers a few simple field types: " msgstr "Glom ofrece algunos tipos simples de campos: " #: C/glom.xml:373(title) msgid "Calculated Fields" msgstr "Campos calculados" #: C/glom.xml:374(para) msgid "" "Field values can be calculated in terms of other fields, using the Python " "programming language. This calculation should be the implementation of a " "python function, which should return a value. The return value will be used " "as the value of the field. This value will be recalculated every time one of " "the source fields changes. TODO: This only works for default values at the " "moment, and you can not use field values in the calculation yet." msgstr "" "El valor de los campos se puede calcular con términos de otros campos, " "usando el lenguaje de programación Python. Éste cálculo debería ser la " "implementación de una función en Python y debería devolver un valor. El " "valor devuelto se usará como el valor del campo. Este valor se volverá a " "calcular cada vez que cambie alguno de los campos de los que obtiene sus " "datos. Por desarrollar: Por ahora ésto sólo funciona para valores " "predeterminados, y tampoco se pueden usar los valores de los campos en el " "cálculo." #: C/glom.xml:375(para) msgid "" "You can also use calculations to specify a default value for fields, by " "selecting the Default Value tab in the Field " "Details window, clicking on the Calculate Value " "check box, and then entering a Python calculation. You can test this " "calculation in the Edit window." msgstr "" "También puede hacer cálculos para especificar el valor predeterminado de los " "campos, seleccionado la pestaña Valor predeterminado de " "la ventana Detalles del campo, pulsando sobre la casilla " "Calcular valor e introduciendo un cálculo en Python. " "Puede comprobar este cálculo en la ventana Editar." #: C/glom.xml:381(title) msgid "Arranging Layouts" msgstr "Ordenando las distribuciones" #: C/glom.xml:382(para) msgid "" "Each table has List and Details views, " "and by default these show all fields in the table, in order of creation. You " "can edit the layout by choosing Layout from the " "Developer menu." msgstr "" "Cada tabla tiene una vista de Lista y de " "Detalles, por omisión ambas muestran todos los campos de " "la tabla por fecha de creación. Puede editar la distribución escogiendo " "Distribución del menú de Desarrollador." #: C/glom.xml:385(title) msgid "Arranging the List View" msgstr "Ordenar la vista de lista" #: C/glom.xml:386(para) msgid "" "For the List view, you can specify the sequence of field " "columns, and whether some fields are hidden." msgstr "" "Para la vista de Lista, puede especificar la secuencia de " "los campos columna, y también si hay algún campo oculto." #: C/glom.xml:389(title) msgid "Editing the List Layout" msgstr "Editar la disposición de la lista" #: C/glom.xml:396(phrase) msgid "Editing the list layout." msgstr "Editar la disposición de la lista." #: C/glom.xml:404(title) msgid "Arranging the Details View" msgstr "Ordenar la vista detalles" #: C/glom.xml:405(para) msgid "" "For the Details view, you can create groups of fields, " "and give these groups titles. You can then place fields in these groups and " "specify the sequence fo fields in these groups. You can also specify the " "sequence of these groups. For instance, in a \"Contacts\" table, you might " "create a \"Name\" group, and place the \"title\", \"first_name\" and " "\"last_name\" fields in that group. You might have other groups for the " "\"Address\" fields." msgstr "" "Para la vista de Detalles, puede crear grupos o campos y " "darlos títulos. Después puede colocar campos en esos grupos y especificar la " "secuencia de los campos en los grupos. También puede especificar la " "secuencia de los grupos. Por ejemplo, en una tabla de «Contactos» puede crear " "un grupo llamado «Nombre», y colocar los campos «Título», «Nombre» y «Apellido» " "en ese grupo. Puede tener otros grupos para los campos «Direcciones»." #: C/glom.xml:408(title) msgid "Editing the details Layout" msgstr "Editar la disposición de los detalles" #: C/glom.xml:415(phrase) msgid "Editing the Details Layout." msgstr "Editar la disposición de los detalles." #: C/glom.xml:425(title) msgid "Creating Relationships" msgstr "Crear relaciones" #: C/glom.xml:426(para) msgid "" "Tables in the Database are often related together. For instance, an " "\"Invoices\" table might have a \"Customer ID\" field. A value in this field " "would specify a record in the \"Customers\" table with the same value. Glom " "can show extra information, such as the customer name, from that related " "record. Or it can show a list of several related records - for instance, " "several related \"Invoice Lines\" that are related to a record in the " "\"Invoice\" record." msgstr "" "Muchas veces las tablas de una base de datos están relacionadas entre sí. " "Por ejemplo, una tabla de «Facturas» podrá tener un campo «ID del cliente». El " "valor de ese campo especifica un registro en la tabla «Clientes» el cual " "tiene el mismo valor. Glom puede mostrar información adicional, como el " "nombre del cliente, de ese registro relacionado. O puede mostrar una lista " "de varios registros relacionados - por ejemplo, algún registro de la «Lista " "de facturas» que está relacionado con otro registro de «Facturas»." #: C/glom.xml:427(para) msgid "" "To create relationships, choose Relationships from the " "Developer menu. This will show the list of existing " "relationships. Click the Add button to create a new " "relationship, and enter a name for it. You should then choose a field in the " "current table, and a field in another table to which it should be related. " "This relationship will find any records in the other table for which the " "values in both fields are equal." msgstr "" "Para crear relaciones, escoja Relaciones del menú de " "Desarrollador. Esto le mostrará la lista de relaciones " "existentes. Para crear una nueva relación pulse el botón de Añadir e introduzca un nombre para ella. Debe elegir un campo de la tabla " "actual y un campo de otra tabla con el que se creará la relación. Esta " "relación buscará cualquier registro en la otra tabla para los que los " "valores de ambos campos sean iguales." #: C/glom.xml:432(simpara) msgid "To show a related field on the List or Details view." msgstr "Para mostrar un campo relacionado en la lista o en la vista detallada." #: C/glom.xml:433(simpara) msgid "To show a list of related records on the Details view." msgstr "" "Para mostrar una lista de registros relacionados en la vista detallada." #: C/glom.xml:434(simpara) msgid "" "To lookup a value from a field in a related record. For instance, to copy " "the current price of a \"Product\" into the \"Price\" field of an \"Invoice " "Line\" record." msgstr "" "Para buscar un valor de un campo en un registro relacionado. Por ejemplo, " "copie el precio de un «Producto» en el campo «Precio» de un registro de " "«Facturas»." #: C/glom.xml:435(simpara) msgid "To calculate a field value." msgstr "Para calcular el valor de un campo." #. TODO: screenshot #: C/glom.xml:429(para) msgid "You can use the relationship in the following places. " msgstr "Puede usar las relaciones en los siguientes lugares. " #: C/glom.xml:441(title) msgid "Users Administration" msgstr "Administración de usuarios" #: C/glom.xml:442(para) msgid "" "To define the Operators who can use your database, and to " "specify what access they have to the various tables, choose Users from the Developer menu." msgstr "" "Para definir los Operadores que pueden utilizar su base " "de datos y para especificar que acceso tienen a las distintas tablas, " "seleccione Usuarios del menú Desarrollador." #: C/glom.xml:447(title) C/glom.xml:454(title) msgid "Translations" msgstr "Traducciones" #: C/glom.xml:448(para) msgid "" "Glom's user interface (and this document) is translated into several " "languages, as you should see already if you are using your computer with a " "non-English user interface. In addition, Glom automatically shows and " "understands numbers and dates according to the current user's local " "conventions. For instance, a user in the USA might enter a price as 1.99 and " "a date as 1/13/2008, but a German user of the same database will later see " "that as 1,99 and 13.1.2008." msgstr "" "La interfaz de usuario de Glom (y este documento) está traducido a varios " "idiomas, como ya debería poder ver si utiliza un equipo con un interfaz de " "usuario que no esté en inglés. Además, Glom entiende y muestra " "automáticamente números y fechas de acuerdo a las convenciones actuales de " "localización del usuario. Por ejemplo, un usuario en EE. UU. debe introducir " "un precio como 1.99 y una fecha como 1/13/2008, pero un usuario alemán de la " "misma base de datos lo verá más adelante como 1,99 y 13.1.2008." #: C/glom.xml:449(para) msgid "" "However, the Glom system that you create also contains text that must be " "translated if it will be used by people who speak different languages. For " "instance, you must provide translations for the titles of your tables, " "fields, and reports. All of these text items can be seen in a list when you " "choose Translations from the Developer " "menu. In this window you can specify the language that you used for the " "original text, and enter translations for each text item for additional " "languages. When the Glom system is opened by a user of that language then " "these text items will be shown in the user interface." msgstr "" "Sin embargo, el sistema Glom que crea contiene también texto que debe " "traducirse si personas que hablan diferentes idiomas lo van a usar.Por " "ejemplo, puede proporcionar traducciones para los títulos de sus tablas, " "campos e informes. Todos estos elementos de texto se pueden ver en una lista " "cuando selecciona Traducciones en el menú " "Desarrollador. En esta ventana puede especificar el " "idioma que ha utilizado para el texto original, e introducir las " "traducciones adicionales en cada idioma para cada elemento de texto. Cuando " "un usuario de ese idioma abre el sistema Glom, se mostrarán esos elementos " "de texto en la interfaz de usuario." #: C/glom.xml:461(phrase) msgid "Translations." msgstr "Traducciones." #: C/glom.xml:467(para) msgid "" "Experienced translators may be more familiar with the .po file format, or " "you might wish to use the many tools that work with the .po file format. By " "using the Export button you can create a .po file to use " "in a separate tool or to send to a translator. You can then import the " "resulting translation by using the Import button." msgstr "" "Los traductores experimentados pueden estar más familiarizados con el " "formato .po, o puede desear utilizar la mayoría de las herramientas que " "funcionan con el formato .po. Al usar el botón Exportar " "puede crear un archivo .po para utilizarlo en una herramienta aparte o para " "enviárselo a un traductor. Puede importar la traducción resultante usando el " "botón Importar." #: C/glom.xml:472(title) msgid "Defining Reports" msgstr "Definir informes" #: C/glom.xml:475(title) msgid "Adding or Editing Reports" msgstr "Añadir o editar informes" #: C/glom.xml:477(para) msgid "" "Glom can produce reports to show specific fields for sets of records, sorted " "and grouped. For instance, a shop might need a report listing all products " "sold in one month, grouped by product type, and sorted by price inside each " "group. Each table has its own reports, which are available to the operator " "from the Reports menu." msgstr "" "Glom puede generar informes para mostrar campos específicos o conjuntos de " "registros, ordenados y agrupados. Por ejemplo, una tienda puede necesitar un " "informe que liste todos los productos vendidos en un mes, agrupados por tipo " "de producto, y ordenados por precio dentro de cada grupo. Cada tabla tiene " "sus propios informes, que están a disposición del operador en el menú " "Informes." #: C/glom.xml:479(para) msgid "" "To define a report, or to change the definition of an existing report, " "choose Reports from the Developer menu." msgstr "" "Para definir un informe, o para cambiar la definición de un informe " "existente, seleccione Informes en el menú " "Desarrollador." #: C/glom.xml:481(title) msgid "Creating or Editing Reports" msgstr "Crear o editar informes" #: C/glom.xml:488(phrase) msgid "Creating or editing reports." msgstr "Crear o editar informes." #: C/glom.xml:494(para) msgid "" "Notice that each report has an ID as well as a human-readable name. This " "allows your report to have a translated title when used on a computer that " "uses a different language." msgstr "" "Tenga en cuenta que cada informe tiene un ID, así como un nombre legible por " "humanos. Esto permite que su informe tenga un título traducido cuando se " "utiliza en un ordenador que trabaja con un idioma diferente." #: C/glom.xml:499(title) C/glom.xml:513(title) msgid "Editing a Report" msgstr "Editar un informe" #: C/glom.xml:503(simpara) msgid "The Header, which appears at the start of the report" msgstr "La cabecera, que aparecerá al principio del informe" #: C/glom.xml:504(simpara) msgid "" "The Main area, in which the records and summary lines are shown, with the " "actual data from the database." msgstr "" "El área principal, donde se muestran los registros y las líneas de resumen, " "con los datos actuales de la base de datos." #: C/glom.xml:505(simpara) msgid "The Footer, which appears at the end of the report." msgstr "El pie, que aparecerá al final del informe." #: C/glom.xml:501(para) msgid "A Glom report has three areas: " msgstr "Un informe de Glom tiene tres áreas: " #: C/glom.xml:509(para) msgid "" "Inside an area, such as the Main part, you may add report Parts, such as fields, text, or images. These will usually appear in a " "row on the printed report, with one row for each record. In the simple case, " "this will look much like Glom's list view. You can add parts to your report " "by selecting them from the Available Parts list and then " "clicking the Add button. The part will then be added to " "the Parts list, in the selected area." msgstr "" "Dentro de un área, como la parte principal, puede añadir Partes de un informe, tales como campos, texto o imágenes. Habitualmente " "aparecerán en una fila en el informe impreso, con una fila para cada " "registro. En el caso simple, se parecerá mucho a la vista de lista de Glom. " "Puede añadir partes a su informe seleccionándolas de la lista " "Partes disponibles y pulsando en el botón " "Añadir. Se añadirá la parte a la lista Partes, en el área seleccionada." #: C/glom.xml:510(para) msgid "" "To specify details for the parts, such as the text or image to display, or " "to choose the field to display, select the part in the Parts list and click the Edit button. You may also " "specify field formatting by clicking the Formatting " "button, just as you would when defining a details or list layout." msgstr "" "Para especificar los detalles de las partes, tales como el texto o la imagen " "que mostrar, o seleccionar el campo que mostrar, seleccione la parte en la " "lista Partes y pulse el botón Editar. " "También puede especificar el formato del campo pulsando el botón " "Formato, simplemente como lo haría cuando define la " "disposición de los detalles o la disposición de una lista." #: C/glom.xml:520(phrase) C/glom.xml:537(phrase) msgid "Editing a report." msgstr "Editar un informe." #: C/glom.xml:526(para) msgid "" "Some parts may contain other parts and have extra properties to control how " "they present their child parts. For instance, the Group By part groups records together by a field. For instance, a products " "report might group a list of products by product type. You can even add a " "second sub-grouping inside the main Group By part, by " "selecting your top-level Group By part in the " "Parts list while adding a new Group By " "part from the Available Parts list. For instance, you " "might group your products by manufacturer, inside each product type group." msgstr "" "Algunas partes pueden contener otras partes y tener propiedades adicionales " "para controlar como se presentan su partes hijas. Por ejemplo, la parte " "Agrupar por agrupa registros juntos por un campo. Por " "ejemplo, un informe de productos debe agrupar una lista de productos por " "tipo de producto. También puede añadir una segunda agrupación dentro de la " "parte Agrupar por principal, seleccionando la primera " "parte Agrupar por en la lista Partes " "mientras añade una nueva parte Agrupar por de la lista " "Partes disponibles. Por ejemplo, puede agrupar sus " "productos por fabricante, dentro de cada grupo de tipo de producto." #: C/glom.xml:527(para) msgid "" "To specify the field by which the records should be grouped, select your " "Group By part in the Parts list and " "click the Edit button. You can then choose the field by " "which the records should be grouped, and select the fields by which these " "records should be sorted within the group. You may also specify some " "additional fields to be displayed in the group's title row. For instance, " "you might want to group products by a manufacturer ID, but also show the " "manufacturer name." msgstr "" "Para especificar el campo por el que se agruparán los registros, seleccione " "su parte Agrupar por en la lista Partes y pulse el botón Editar. Entonces puede " "seleccionar el campo por el que quiere que se ordenen los registros, y " "seleccionar los campos por los que esos registros deberán ordenarse dentro " "del grupo. También debe especificar algunos campos adicionales para mostrar " "en el título de la fila del grupo. Por ejemplo, puede querer agrupar " "productos por ID de fabricante, pero mostrar también el nombre del " "fabricante." #: C/glom.xml:530(title) msgid "Editing a Group By Part" msgstr "Editar un grupo por partes" #: C/glom.xml:543(para) msgid "" "The Vertical Group part may contain other items. For " "instance, it allows you to arrange fields below each other instead of just " "one after the other in the horizontal row. This is useful for grouping " "related fields such as address lines, or just to squeeze more information " "into the records's row on the report." msgstr "" "La parte Grupo vertical puede contener otros elementos. " "Por ejemplo, le permite ordenar campos junto a otros en lugar de uno detrás " "de otro en la fila horizontal. Ésto es útil para agrupar campos relacionados " "tales como direcciones, o simplemente apretar más información dentro de la " "fila del registro del informe." #: C/glom.xml:546(title) msgid "A Report with Vertical Groups" msgstr "Un informe con grupos verticales" #: C/glom.xml:553(phrase) msgid "A Report with Vertical Groups." msgstr "Un informe con grupos verticales." #: C/glom.xml:559(para) msgid "" "When you have finished, click the Close button to save " "the report's definition. Your report can then be chosen from the " "Reports menu. See the Printing Reports section for more details." msgstr "" "Cuando haya acabado, pulse el botón Cerrar para guardar " "la definición del informe. Puede seleccionar su informe desde el menú " "Informes. Para obtener más detalles vea la sección Imprimir informes." #: C/glom.xml:573(title) msgid "Dialogs" msgstr "Diálogos" #: C/glom.xml:576(title) msgid "Dialog: Initial dialog" msgstr "Diálogo: Diálogo inicial" #: C/glom.xml:577(para) msgid "" "This dialog allows the user to choose an existing document or create a new " "document. Existing documents may be selecting from the list of recently " "opened documents or by select a file with the file chooser dialog. Documents " "can also be opened via the network if other users are running Glom on the " "local network. Finally, a new document can be created either by opening a " "template file which already contains some initial tables and records, or by " "creating an empty document." msgstr "" "Este diálogo permite al usuario seleccionar un documento existente o crear " "un documento nuevo. Los documentos existentes se deben seleccionar de la " "lista de documentos abiertos recientemente, o seleccionando un archivo con " "el diálogo de selección de archivos. También se pueden abrir los documentos " "a través de la red, si otros usuarios están ejecutando Glom en la red local. " "Finalmente, se puede crear un documento nuevo abriendo una plantilla que ya " "contenga algunas tablas o registros iniciales, o creando un documento vacío." #: C/glom.xml:581(title) msgid "Dialog: New database" msgstr "Diálogo: Nueva base de datos" #: C/glom.xml:586(title) msgid "Dialog: Create database" msgstr "Diálogo: Crear base de datos" #: C/glom.xml:591(title) msgid "Dialog: Connection" msgstr "Diálogo: Conexión" #: C/glom.xml:592(para) msgid "" "This dialog requests a user name and password for connection to a database " "server. This is usually not the same username and password combination with " "which you log in to your system. All Glom systems require a database server " "on which the actual data will be stored. If the database server is not " "running on your local computer (\"localhost\"), then you must also provide " "its network hostname, such as \"glomserver.openismus.com\", though your " "hostname will be different." msgstr "" "Este cuadro de diálogo solicita un nombre de usuario y una contraseña para " "conectar a un servidor de bases de datos. Normalmente no es la misma " "combinación de usuario y contraseña que utiliza para autenticarse en su " "sistema. Todos los sistemas Glom requieren un servidor de bases de datos en " "el que almacenar los datos actuales. Si el servidor de bases de datos no se " "está ejecutando en el equipo local («localhost»), debe proporcionar el nombre " "del equipo, tal como \"glomserver.openismus.com\", aunque su nombre del " "equipo sea diferente." #: C/glom.xml:593(para) msgid "Your system administrator can provide these database login details." msgstr "" "Su administrador de sistemas puede proporcionarle esos detalles de conexión " "a la base de datos." #: C/glom.xml:594(para) msgid "" "If you are the system administrator, see Glom's Postgres Configuration web page for help with installing and " "configuring a database server." msgstr "" "Si es el administrador del sistema. lea la página web de Glom Configuración de Postgres para obtener ayuda con la " "instalación y configuración del servidor de bases de datos." #: C/glom.xml:598(title) msgid "Dialog: Connection Error" msgstr "Diálogo: Error de conexión" #: C/glom.xml:599(para) msgid "" "This dialog is shown when Glom could not connect to the specified database " "server. Either the database server is not running at the specified hostname, " "or the user name and password were not accepted by the database server. See " "the Connection Dialog section for " "more details." msgstr "" "Este diálogo se muestra cuando Glom no puede conectar con el servidor de " "bases de datos especificado. O el servidor de bases de datos no está " "funcionando en el equipo especificado, o el servidor de bases de datos no " "aceptó el nombre de usuario y la contraseña. Para obtener más detalles " "consulte la sección Diálogo de conexión." #: C/glom.xml:605(title) msgid "Dialog: Database preferences" msgstr "Diálogo: Preferencias de la base de datos" #: C/glom.xml:610(title) msgid "Dialog: Change language" msgstr "Diálogo: Cambiar idioma" #: C/glom.xml:615(title) msgid "Window: Textobject" msgstr "Ventana: Objeto de texto" #: C/glom.xml:620(title) msgid "Window: Imageobject" msgstr "Ventana: Objeto de imagen" #: C/glom.xml:625(title) msgid "Dialog: Notebook" msgstr "Diálogo: Cuaderno de notas" #: C/glom.xml:630(title) msgid "Dialog: Data invalid format" msgstr "Diálogo: Formato de datos no válido" #: C/glom.xml:635(title) msgid "Dialog: Relationship overview" msgstr "Diálogo: Descripción de la relación" #: C/glom.xml:640(title) msgid "Window: Groups" msgstr "Ventana: Grupos" #: C/glom.xml:645(title) msgid "Dialog: Group by sort fields" msgstr "Diálogo: Agrupar por campos ordenados" #: C/glom.xml:650(title) msgid "Dialog: Group by secondary fields" msgstr "Diálogo: Agrupar por campos secundarios" #: C/glom.xml:655(title) msgid "Window: Button script" msgstr "Ventana: Botón de script" #: C/glom.xml:660(title) msgid "Window: Field calculation" msgstr "Ventana: Cálculo de campos" #: C/glom.xml:665(title) msgid "Dialog: New group" msgstr "Diálogo: Grupo nuevo" #: C/glom.xml:670(title) msgid "Dialog: Choose user" msgstr "Diálogo: Elegir usuario" #: C/glom.xml:675(title) msgid "Dialog: User" msgstr "Diálogo: Usuario" #: C/glom.xml:680(title) msgid "Dialog: Translation identify original" msgstr "Diálogo: La traducción identifica al original" #: C/glom.xml:685(title) msgid "Dialog: Translation copy" msgstr "Diálogo: Copia de la traducción" #: C/glom.xml:690(title) msgid "Dialog: Choose Date" msgstr "Diálogo: Elegir fecha" #: C/glom.xml:695(title) msgid "Dialog: Import Into Table" msgstr "Diálogo: Importar a una tabla" #: C/glom.xml:696(para) msgid "" "This dialog allows the user to import a CSV (comma separated value) file " "into the current database table. It shows the first few rows of the file to " "import and allows the user to select the target field in the database for " "each column in the CSV file. For auto-incremented primary keys, the primary " "key field cannot be used as a target field, but otherwise one column must be " "imported into the primary key field." msgstr "" "Este diálogo permite al usuario importar un archivo CSV (valores separados " "por comas) en la tabla de la base de datos actual. Muestra las primeras " "filas del archivo para importar y permite al usuario seleccionar el campo " "destino en la base de datos para cada columna del archivo CSV. Para " "autoincrementar las claves primarias, el campo de la clave primaria no se " "puede utilizar como campo destino, de lo contrario se debe importar una " "columna en el campo de la clave primaria." #: C/glom.xml:719(title) msgid "About Glom" msgstr "Acerca de Glom" #: C/glom.xml:720(para) msgid "" "Glom is maintained by Glom and GNOME community volunteers. To find more " "information about Glom, please visit the Glom Web site." msgstr "" "Glom y la comunidad de voluntarios de Glom se encargan de mantener Glom. " "Para obtener más información acerca de Glom, visite la página web de Glom." #: C/glom.xml:725(para) msgid "" "To report a bug or make a suggestion regarding this application or this " "manual, you can submit them using bugzilla." msgstr "" "Para informar sobre un error o hacer sugerencias sobre esta aplicación o " "sobre éste manual, puede enviarlas usando Bugzilla." #: C/glom.xml:731(para) msgid "" "Another excellent source of information are the Glom mailing lists." msgstr "" "Otra excelente fuente de información son las listas de correo de Glom." #: C/glom.xml:736(para) msgid "" "This program is distributed under the terms of the GNU General Public " "license as published by the Free Software Foundation; either version 2 of " "the License, or (at your option) any later version. A copy of this license " "can be found at this link, or " "in the file COPYING included with the source code of this program." msgstr "" "Este programa se distribuye bajo los términos de la Licencia Pública General " "GNU (GPL) tal y como fue publicada por la Free Software Foundation, en la " "versión 2 ó (a su elección) cualquier versión posterior. Una copia de esta " "licencia puede encontrarse en este " "enlace, o en el archivo COPYING incluido con el código fuente de " "este programa." #: C/glom.xml:745(title) msgid "Concepts" msgstr "Conceptos" #: C/glom.xml:748(simpara) msgid "" "Database: Each Glom document allows access to one " "database." msgstr "" "Base de datos: Cada documento de Glom permite el acceso a " "una base de datos." #: C/glom.xml:749(simpara) msgid "" "Table: Each database contains several tables, such as " "\"Customers\" and \"Invoices\" tables." msgstr "" "Tabla: Cada base de datos contiene varias tablas, tales " "como, por ejemplo, las tablas «Clientes» y «Facturas»." #: C/glom.xml:750(simpara) msgid "" "Field: Each table has several fields, such as \"Customer " "ID\", \"First Name\", and \"Date of Birth\" fields. In other documents and " "applications, fields are sometimes called \"Columns\"" msgstr "" "Campo: Cada tabla tiene varios campos, tales como «ID del " "cliente», «Nombre» y «Fecha de nacimiento», en otros documentos y " "aplicaciones, se suele denominar a estos campos «columnas»." #: C/glom.xml:751(simpara) msgid "" "Records: Each table contains several records, each of " "which has values for each of the fields. For instance, the \"Customers\" " "table will have a record for each customer. In other documents and " "applications, records are sometimes called Rows." msgstr "" "Registros: Cada tabla tiene varios registros, cada uno de " "los cuales contiene valores para cada uno de los campos. Por ejemplo la " "tabla de «Clientes» tendrá un registro para cada cliente. En otros documentos " "y aplicaciones, a los registros se los suele denominar filas." #: C/glom.xml:752(simpara) msgid "" "Relationships: Each table might be related to other " "tables, via fields in both tables. For instance, a \"Customers\" table could " "have a relationship to the \"Invoices\" table, so that people could see all " "the invoices for that customer. Only developers need to understand this " "concept. In other documents and applications, relationships are sometimes " "called \"Joins\"." msgstr "" "Relaciones: Cada tabla puede estar relacionada con otras " "tablas, por medio de los campos de ambas tablas. Por ejemplo, la tabla " "«Clientes» puede tener relación con la tabla «Facturas», de tal manera que se " "pueden ver todas las facturas de ése cliente. Sólo los desarrolladores " "necesitan entender éste concepto. En otros documentos y aplicaciones, a las " "relaciones se las suele denominar «uniones» o «joins»." #: C/glom.xml:746(para) msgid "" "Glom is easy to use, but you must understand the following basic concepts. " "" msgstr "" "Glom es fácil de usar, pero debe entender los siguientes conceptos básicos. " "" #: C/glom.xml:758(title) msgid "Calculated fields and button scripts" msgstr "Campos calculados y botones de script" #: C/glom.xml:759(para) msgid "" "Calculated fields and button scripts use the Python programming language. " "The calculation or script is the implementation of a function whose " "signature is provided for you." msgstr "" "Los campos calculados y los botones de scripts usan el lenguaje de " "programación Python.El cálculo o el script es la implementación de una " "función cuya firma se le proporciona." #: C/glom.xml:762(title) msgid "Editing the definition of a calculated field" msgstr "Editar la definición de un campo calculado" #: C/glom.xml:769(phrase) msgid "Editing the definition of a calculated field." msgstr "Editar la definición de un campo calculado." #: C/glom.xml:776(title) msgid "Field values" msgstr "Valores de campo" #: C/glom.xml:777(programlisting) #, no-wrap msgid "record[\"name_first\"]" msgstr "record[\"name_first\"]" #: C/glom.xml:777(para) msgid "" "For instance, is the value of the name_first field in the " "current record." msgstr "" "Por ejemplo, es el valor del campo name_first en el " "registro actual." #: C/glom.xml:781(title) msgid "Related Records" msgstr "Registros relacionados" #: C/glom.xml:782(programlisting) #, no-wrap msgid "record.related[\"location\"]" msgstr "record.related[\"ubicación\"]" #: C/glom.xml:782(para) msgid "" "For instance, provides the related records for the current " "record." msgstr "" "Por ejemplo, proporciona los registros relacionados con el " "registro actual." #: C/glom.xml:785(title) msgid "Single related records" msgstr "Un sólo registro relacionado" #: C/glom.xml:786(programlisting) #, no-wrap msgid "record.related[\"location\"][\"name\"]" msgstr "record.related[\"ubicación\"][\"nombre\"]" #: C/glom.xml:786(para) msgid "" "For relationships that specify a single record, you can get the value of a " "field in that record. For instance, is the value of the " "name field in the table indicated by the location relationship (often called " "location::name)." msgstr "" "Para relaciones que especifican un único registro puede obtener el valor de " "un campo en ese registro. Por ejemplo, es el valor del " "nombre del campo en la tabla indicada por la relación de ubicación " "(habitualmente denominada ubicación::nombre)." #: C/glom.xml:790(title) msgid "Multiple related records" msgstr "Múltiples registros relacionados" #: C/glom.xml:791(programlisting) #, no-wrap msgid "record.related[\"invoice_lines\"].sum(\"total_price\")" msgstr "record.related[\"lineas_de_factura\"].sum(\"precio_total\")" #: C/glom.xml:791(para) msgid "" "For relationships that specify multiple records, you can use the aggregate " "functions (sum, count, average) to get overall values. For instance, " "." msgstr "" "Para relaciones que especifican múltiples registros, puede utilizar las " "funciones de adición (sum, count, average) para obtener todos los valores. " "Por ejemplo, ." #: C/glom.xml:797(title) msgid "Testing for empty values" msgstr "Probando para valores vacíos" #: C/glom.xml:798(para) msgid "How you test for empty values depends on the type of field:" msgstr "La manera de probar para valores vacíos depende del tipo de campo:" #: C/glom.xml:803(title) msgid "Non-text fields" msgstr "Campos que no son de texto" #: C/glom.xml:804(para) msgid "" "Non-text fields may be empty, indicating that the user has not entered any " "value in the field. For instance, Glom does not assume that an empty value " "in a numeric field should mean 0." msgstr "" "Los campos que no sean de texto deben estar vacíos, indicando que el usuario " "no ha introducido ningún valor en el campo. Por ejemplo, Glom no asume que " "un valor vacío en un campo numérico deba valer 0." #: C/glom.xml:805(para) msgid "" "You can test whether a field is empty by using Python's None. For instance:" msgstr "" "Puede probar si un campo está vacío usando el código Python «None». Por " "ejemplo:" #: C/glom.xml:807(programlisting) #, no-wrap msgid "" "\n" " if(record[\"contact_id\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" "\n" " if(record[\"contact_id\"] == None):\n" " return \"Sin contacto\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " #: C/glom.xml:814(para) msgid "" "You might also test whether there are any related records. For instance:" msgstr "" "También puede comprobar si hay algunos registros relacionados. Por ejemplo:" #: C/glom.xml:816(programlisting) #, no-wrap msgid "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"Sin contacto\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " #: C/glom.xml:826(title) msgid "Text fields" msgstr "Campos de texto" #: C/glom.xml:827(para) msgid "" "For text fields, you should check for zero-length strings. It is not " "possible in Glom to distinguish between zero-length strings and the absence " "of any string, because there is no advantage to doing so. For instance:" msgstr "" "Para campos de texto debe comprobar las cadenas de longitud cero. En Glom no " "es posible distinguir entre cadenas de longitud cero y ausencia de cadena, " "ya que no hay diferencia. Por ejemplo:" #: C/glom.xml:829(programlisting) #, no-wrap msgid "" "\n" " if(record[\"name_full\"] == \"\"):\n" " return \"No Name\"\n" " else:\n" " return record[\"name_full\"]\n" " " msgstr "" "\n" " if(record[\"name_full\"] == \"\"):\n" " return \"Sin nombre\"\n" " else:\n" " return record[\"name_full\"]\n" " " #: C/glom.xml:841(title) msgid "Using the full pygda API" msgstr "Usando la API pydga completa" #: C/glom.xml:842(para) msgid "" "pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the " "current database directly. This allows you to run any SQL query, for " "instance to read data from the database with a SELECT, or to change values " "in the database with an UPDATE. Note that the connection is already open so " "you can avoid the difficult work of specifying the connection details." msgstr "" "pygda es una API de Python para la API libgda. Los atributos de los " "registros connection proporcionan una conexión gda que " "puede usarse para acceder directamente a la base de datos actual. Esto le " "permite ejecutar cualquier consulta SQL, por ejemplo para leer datos de la " "base de datos con un SELECT o cambiar valores en la base de datos con un " "UPDATE. Nótese que la conexión ya está abierta, por lo que puede evitar el " "difícil trabajo de especificar los detalles de la conexión." #: C/glom.xml:843(para) msgid "" "The record's table_name attribute also provides the name " "of the current table." msgstr "" "El atributo del registro table_name también proporciona " "el nombre de la tabla actual." #: C/glom.xml:844(para) msgid "" "This example reads all data from the current table and prints the values to " "the terminal:" msgstr "" "Este ejemplo lee todos los datos de la tabla actual e imprime los valores en " "la terminal:" #: C/glom.xml:846(programlisting) #, no-wrap msgid "" "\n" "# Use the current database's connection \n" "# to get all the data for the current table.\n" "#\n" "# record.connection is an already-open gda.connection object,\n" "# saving us the bother of opening the connection,\n" "# or even knowing the name of the database.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "data_model = gda.gda_execute_select_command(record.connection, query)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Number of columns: \", columns\n" "\n" "for i in range(columns):\n" " print \" column \", i;\n" " print \" name=\", data_model.get_column_title(i)\n" "\n" " # Find out whether it's the primary key:\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (primary key)\"\n" "\n" " print \"\\n\";\n" " \n" "print \" Number of rows: \", rows\n" "\n" "for row_index in range(rows):\n" " print \" row \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" value=\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n\";\n" " " msgstr "" "\n" "# Usar la conexión actual a la base de datos \n" "# para obtener todos los datos de la tabla actual.\n" "#\n" "# la conexión de registros es un objeto gda.connection ya abierto,\n" "# evitando la incomodidad de abrir la conexión,\n" "# o incluso conociendo el nombre de la base de datos.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "data_model = gda.gda_execute_select_command(record.connection, query)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Número de columnas: \", columns\n" "\n" "for i in range(columns):\n" " print \" columna \", i;\n" " print \" nombre=\", data_model.get_column_title(i)\n" "\n" " # Comprueba si es la clave primaria:\\n\"\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (clave primaria)\"\n" "\n" " print \"\\n\";\n" " \n" "print \" Número de columnas: \", rows\n" "\n" "for row_index in range(rows):\n" " print \" fila \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" valor=\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n\";\n" " " #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/glom.xml:0(None) msgid "translator-credits" msgstr "" "Daniel Mustieles , 2008-2010\n" "Jorge González , 2007\n" "QA: Jorge González , 2008" #~ msgid "" #~ "@@image: 'figures/glom_tables.png'; md5=e725285aae974272ca99dc991c7ae9ed" #~ msgstr "" #~ "@@image: 'figures/glom_tables.png'; md5=e725285aae974272ca99dc991c7ae9ed" #~ msgid "" #~ "When you start Glom, the following window is " #~ "displayed." #~ msgstr "" #~ "Se mostrará la siguiente ventana al iniciar Glom." #~ msgid "Shows Glom main window." #~ msgstr "Muestra la ventana principal de Glom." #~ msgid "" #~ "(Note that the record.connection and record." #~ "table_name attributes are only available since Glom 1.1.6.)" #~ msgstr "" #~ "(Nótese que los atributos record.connection y " #~ "record.table_name sólo están disponibles desde la " #~ "versión 1.1.6 de Glom.)" glom-1.22.4/docs/user-guide/es/legal.xml0000644000175000017500000000636612235000130021177 0ustar00murraycmurrayc00000000000000 Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre de GNU, Versión 1.1 o cualquier otra versión posterior publicada por la Free Software Foundation; sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de Cubierta Trasera. Puede encontrar una copia de la licencia GFDL en este enlace o en el archivo COPYING-DOCS distribuido con este manual. Este manual es parte de una colección de manuales de GNOME distribuido bajo la GFDL. Si quiere distribuir este manual por separado de la colección, puede hacerlo añadiendo una copia de la licencia al manual, tal como se describe en la sección 6 de la licencia. Muchos de los nombres usados por compañías para distinguir sus productos y servicios son mencionados como marcas comerciales. Donde esos nombres aparezcan en cualquier documentación de GNOME, y los miembros del Proyecto de Documentación de GNOME están al corriente de esas marcas comerciales, entonces los nombres se pondrán en mayúsculas o con la inicial en mayúsculas. ESTE DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO SE PROPORCIONAN SEGÚN LAS CONDICIONES ESTABLECIDAS EN LA LICENCIA DE DOCUMENTACIÓN LIBRE DE GNU (GFDL) Y TENIENDO EN CUENTA QUE: EL DOCUMENTO SE PROPORCIONA "TAL CUAL", SIN GARANTÃA DE NINGÚN TIPO, NI EXPLÃCITA NI IMPLÃCITA INCLUYENDO, SIN LIMITACIÓN, GARANTÃA DE QUE EL DOCUMENTO O VERSIÓN MODIFICADA DE ÉSTE CAREZCA DE DEFECTOS COMERCIALES, SEA ADECUADO A UN FIN CONCRETO O INCUMPLA ALGUNA NORMATIVA. TODO EL RIESGO RELATIVO A LA CALIDAD, PRECISIÓN Y UTILIDAD DEL DOCUMENTO O SU VERSIÓN MODIFICADA RECAE EN USTED. SI CUALQUIER DOCUMENTO O VERSIÓN MODIFICADA DE AQUÉL RESULTARA DEFECTUOSO EN CUALQUIER ASPECTO, USTED (Y NO EL REDACTOR INICIAL, AUTOR O CONTRIBUYENTE) ASUMIRà LOS COSTES DE TODA REPARACIÓN, MANTENIMIENTO O CORRECCIÓN NECESARIOS. ESTA RENUNCIA DE GARANTÃA ES UNA PARTE ESENCIAL DE ESTA LICENCIA. NO SE AUTORIZA EL USO DE NINGÚN DOCUMENTO NI VERSIÓN MODIFICADA DE ÉSTE POR EL PRESENTE, SALVO DENTRO DEL CUMPLIMIENTO DE LA RENUNCIA;Y BAJO NINGUNA CIRCUNSTANCIA NI BAJO NINGUNA TEORÃA LEGAL, SEA POR ERROR (INCLUYENDO NEGLIGENCIA), CONTRATO O DE ALGÚN OTRO MODO, EL AUTOR, EL ESCRITOR INICIAL, CUALQUIER CONTRIBUIDOR, O CUALQUIER DISTRIBUIDOR DEL DOCUMENTO O VERSIÓN MODIFICADA DEL DOCUMENTO, O CUALQUIER PROVEEDOR DE CUALQUIERA DE ESAS PARTES, SERà RESPONSABLE ANTE NINGUNA PERSONA POR NINGÚN DAÑO DIRECTO, INDIRECTO, ESPECIAL, INCIDENTAL O DERIVADO DE NINGÚN TIPO, INCLUYENDO, SIN LIMITACIÓN DAÑOS POR PÉRDIDA DE MERCANCÃAS, PARO TÉCNICO, FALLO INFORMÃTICO O MAL FUNCIONAMIENTO O CUALQUIER OTRO POSIBLE DAÑO O PÉRDIDAS DERIVADAS O RELACIONADAS CON EL USO DEL DOCUMENTO O SUS VERSIONES MODIFICADAS, AUNQUE DICHA PARTE HAYA SIDO INFORMADA DE LA POSIBILIDAD DE QUE SE PRODUJESEN DICHOS DAÑOS. glom-1.22.4/docs/user-guide/es/glom.xml0000644000175000017500000013701312235000130021043 0ustar00murraycmurrayc00000000000000 ]>
Manual del usuario de Glom V0.2 para Glom v1.6 2004 Murray Cumming 2008-2010Daniel Mustieles (daniel.mustieles@gmail.com)2007Jorge González (jorgegonz@svn.gnome.org)2008QA: Jorge González (jorgegonz@svn.gnome.org) Equipo de desarrollo de Glom Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre de GNU, Versión 1.1 o cualquier otra versión posterior publicada por la Free Software Foundation; sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de Cubierta Trasera. Puede encontrar una copia de la licencia GFDL en este enlace o en el archivo COPYING-DOCS distribuido con este manual. Este manual es parte de una colección de manuales de GNOME distribuido bajo la GFDL. Si quiere distribuir este manual por separado de la colección, puede hacerlo añadiendo una copia de la licencia al manual, tal como se describe en la sección 6 de la licencia. Muchos de los nombres usados por compañías para distinguir sus productos y servicios son mencionados como marcas comerciales. Donde esos nombres aparezcan en cualquier documentación de GNOME, y los miembros del Proyecto de Documentación de GNOME están al corriente de esas marcas comerciales, entonces los nombres se pondrán en mayúsculas o con la inicial en mayúsculas. ESTE DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO SE PROPORCIONAN SEGÚN LAS CONDICIONES ESTABLECIDAS EN LA LICENCIA DE DOCUMENTACIÓN LIBRE DE GNU (GFDL) Y TENIENDO EN CUENTA QUE: EL DOCUMENTO SE PROPORCIONA "TAL CUAL", SIN GARANTÃA DE NINGÚN TIPO, NI EXPLÃCITA NI IMPLÃCITA INCLUYENDO, SIN LIMITACIÓN, GARANTÃA DE QUE EL DOCUMENTO O VERSIÓN MODIFICADA DE ÉSTE CAREZCA DE DEFECTOS COMERCIALES, SEA ADECUADO A UN FIN CONCRETO O INCUMPLA ALGUNA NORMATIVA. TODO EL RIESGO RELATIVO A LA CALIDAD, PRECISIÓN Y UTILIDAD DEL DOCUMENTO O SU VERSIÓN MODIFICADA RECAE EN USTED. SI CUALQUIER DOCUMENTO O VERSIÓN MODIFICADA DE AQUÉL RESULTARA DEFECTUOSO EN CUALQUIER ASPECTO, USTED (Y NO EL REDACTOR INICIAL, AUTOR O CONTRIBUYENTE) ASUMIRà LOS COSTES DE TODA REPARACIÓN, MANTENIMIENTO O CORRECCIÓN NECESARIOS. ESTA RENUNCIA DE GARANTÃA ES UNA PARTE ESENCIAL DE ESTA LICENCIA. NO SE AUTORIZA EL USO DE NINGÚN DOCUMENTO NI VERSIÓN MODIFICADA DE ÉSTE POR EL PRESENTE, SALVO DENTRO DEL CUMPLIMIENTO DE LA RENUNCIA;Y BAJO NINGUNA CIRCUNSTANCIA NI BAJO NINGUNA TEORÃA LEGAL, SEA POR ERROR (INCLUYENDO NEGLIGENCIA), CONTRATO O DE ALGÚN OTRO MODO, EL AUTOR, EL ESCRITOR INICIAL, CUALQUIER CONTRIBUIDOR, O CUALQUIER DISTRIBUIDOR DEL DOCUMENTO O VERSIÓN MODIFICADA DEL DOCUMENTO, O CUALQUIER PROVEEDOR DE CUALQUIERA DE ESAS PARTES, SERà RESPONSABLE ANTE NINGUNA PERSONA POR NINGÚN DAÑO DIRECTO, INDIRECTO, ESPECIAL, INCIDENTAL O DERIVADO DE NINGÚN TIPO, INCLUYENDO, SIN LIMITACIÓN DAÑOS POR PÉRDIDA DE MERCANCÃAS, PARO TÉCNICO, FALLO INFORMÃTICO O MAL FUNCIONAMIENTO O CUALQUIER OTRO POSIBLE DAÑO O PÉRDIDAS DERIVADAS O RELACIONADAS CON EL USO DEL DOCUMENTO O SUS VERSIONES MODIFICADAS, AUNQUE DICHA PARTE HAYA SIDO INFORMADA DE LA POSIBILIDAD DE QUE SE PRODUJESEN DICHOS DAÑOS. Murray Cumming Equipo de desarrollo de Glom
murrayc@murrayc.com
Glom 1.6 20 de junio de 2004 Murray Cumming Murray Cumming Este manual describe el uso de la versión 1.6 de Glom Comentarios Para informar sobre un error o hacer sugerencias sobre Glom o sobre éste manual, puede enviarlas en la página Gnome Bugzilla, seleccionando el producto Glom. Para asegurarse de que otros no han informado antes del mismo fallo, busque en Bugzilla antes de enviar su error. Manual del usuario de Glom.
MY-GNOME-APP mygnomeapp Introducción Glom le permite diseñar y usar sistemas de bases de datos. Inicio Iniciar Glom Puede iniciar Glom de las siguientes maneras: Menú de Aplicaciones Elija OficinaGlom. Al iniciar Glom Cuando inicia Glom, se muestra la siguiente pantalla. Puede abrir un archivo de Glom existente o crear uno nuevo, posiblemente basándose en alguno de los ejemplos para crear el archivo nuevo.
Ventana de inicio de Glom, Abrir un archivo existente Muestra la ventana principal de Glom usada para abrir un archivo existente.
Ventana de inicio de Glom, Crear un archivo nuevo Muestra la ventana principal de Glom usada para crear un archivo nuevo.
Uso de Glom como un operador Para abrir un documento existente de Glom puede hacerlo con el administrador de archivos o bien puede seleccionar Glom en el menú de Aplicaciones, y después escoger el documento cuando se le pregunte. Glom le pedirá un nombre de usuario y una contraseña para acceder a la base de datos. El administrador le proporcionará su nombre de usuario y su contraseña. Cuando abra un documento existente, Glom estará ejecutándose a nivel de usuarioOperador. Éste nivel le permite buscar y editar registros pero no le permite cambiar la estructura fundamental de la base de datos. Navegación Cada base de datos tiene varias tablas. Para ver una tabla diferente, escoja Tablas del menú de Navegación. Después pulse dos veces sobre la tabla o bien selecciónela y pulse el botón Abrir.
Navegar a una tabla Navegar a una tabla.
Ver e introducir datos Cuando trabaje en el Modo de datos, puede introducir información en la Lista o en la vista de Detalles. La vista de lista La vista de lista muestra cuántos registros a la vez y habitualmente muestra sólo los campos más importantes. Cuando introduzca datos en un campo se guardarán en la base de datos inmediatamente después de que termine de editarlo. Si es un campo de fecha u hora el formato se comprobará automáticamente. Para crear un nuevo registro simplemente pulse el botón Nuevo, o empiece a escribir en un campo en la última fila vacía. Se creará un nuevo registro con los campos en blanco para que los rellene.
La vista de lista La vista de lista.
Para ordenar los registros, simplemente pulse en la cabecera de una columna. Por ejemplo, puede querer pulsar sobre una columna de fecha para listar facturas por su fecha, y pulsar de nuevo para listarlas en orden inverso.
La vista de detalles La vista de detalles muestra un único registro, y habitualmente muestra todos los campos ordenados adecuadamente. Cuando introduzca datos en un campo se guardarán en la base de datos inmediatamente después de que termine de editarlo. Si es un campo de fecha u hora el formato se comprobará automáticamente. Para crear un nuevo registro pulse el botón Nuevo. Se creará un nuevo registro con los campos vacíos para que los pueda rellenar.
La vista de detalles La vista de detalles.
Buscar datos Elija Modo de búsqueda del menú. Los campos en la lista y vista detallada estarán vacíos y un botón de búsqueda aparecerá en la parte inferior de la ventana. Introduzca la información, o parte de la información, en el campo para buscar registros que contengan esa información en ese campo. Por ejemplo, introduzca Javi en un campo de nombre para buscar registros con «Javi» o «Javier» en el campo «Nombre». Al pulsar el botón Buscar, Glom buscará los registros y después los mostrará.Si sólo se encuentra un registro entonces se mostrará con la vista de «Detalles». Si se encuentran varios registros, entonces se mostrarán con la vista de «Lista». Imprimir informes Si el desarrollador de su base de datos ha definido algunos informes para una tabla entonces los verá listados en el menú Informes. Simplemente seleccione el informe del menú para crearlo. Si ha realizado previamente una búsqueda, el informe contendrá únicamente los datos encontrados. De otro modo, contendrá todos los datos del informe actual. Recuerde que cada tabla tiene sus propios informes, por lo que puede tener que cambiar a la tabla oportuna para utilizar un informe concreto.
Un informe Un informe.
Uso de Glom como desarrollador Cuando cree un nuevo documento, Glom estará ejecutándose a nivel de usuarioDesarrollador. También puede cambiar al nivel de usuario «Desarrollador» después de abrir un documento existente, desde el menú Nivel de usuario. Glom permitirá este cambio sólo si el administrador también lo permite. Añadir tablas Puede ver la lista de las tablas existentes escogiendo Tablas del menú de Navegación. También verá esta ventana después de conectarse a un servidor de bases de datos, después de crear un documento nuevo. Para crear una tabla nueva, pulse en el botón Añadir e introduzca un nombre para la tabla nueva. Éste nombre no debería contener espacios ni caracteres especiales. Glom le sugerirá un título legible por humanos para esta tabla. Los Operadores verán éste título en lugar del nombre actual de la tabla. También puede marcar una tabla como oculta para los Operadores. Por ejemplo, los Operadores deberían ver «Lista de facturas» como un registro relacionado de la tabla «Facturas», pero nunca deberán poder navegar directamente por la tabla «Lista de facturas». Puede especificar una tabla como la tabla predeterminada. Esta tabla e mostrará siempre que un operador abra un documento existente, sin preguntarle que seleccione una tabla de la lista. También puede usar esta ventana para renombrar una tabla existente. Pulse el botón de Abrir para ver las tablas seleccionadas. Editar campos Elija Campos del menú de Desarrollador. Esto mostrará la lista de campos en la tabla. Las tablas nuevas tienen un campo de clave primaria automáticamente, pero puede cambiar el campo si es necesario. Para añadir un campo nuevo pulse el botón Añadir e introduzca el nombre del campo nuevo. Glom supondrá un título apropiado y legible por humanos para este campo, pero puede editarlo. Los Operadores verán este nombre en lugar del nombre actual del campo. Para especificar más detalles de un campo, seleccione el campo y pulse en el botón de Detalles.
Editar campos Editar los campos de tabla.
Claves primarias Cada tabla debe tener una, y solamente una, Clave primaria. El valor en este campo debe ser único, lo que quiere decir que cada valor en este campo sólo aparecerá en un sólo registro de la tabla. Por ejemplo, cada registro de la tabla «Clientes» tendrá también un campo «ID del cliente». Este valor se usará para referirse a este cliente en otras tablas, tales como los registros «Proyectos» y «Facturas». Lea la sección Creando relaciones para obtener más información acerca de cómo relacionar tablas entre si. Tipos de campos Glom ofrece algunos tipos simples de campos: Número Texto Fecha Hora Booleano - tanto cierto como falso Imagen Campos calculados El valor de los campos se puede calcular con términos de otros campos, usando el lenguaje de programación Python. Éste cálculo debería ser la implementación de una función en Python y debería devolver un valor. El valor devuelto se usará como el valor del campo. Este valor se volverá a calcular cada vez que cambie alguno de los campos de los que obtiene sus datos. Por desarrollar: Por ahora ésto sólo funciona para valores predeterminados, y tampoco se pueden usar los valores de los campos en el cálculo. También puede hacer cálculos para especificar el valor predeterminado de los campos, seleccionado la pestaña Valor predeterminado de la ventana Detalles del campo, pulsando sobre la casilla Calcular valor e introduciendo un cálculo en Python. Puede comprobar este cálculo en la ventana Editar.
Ordenando las distribuciones Cada tabla tiene una vista de Lista y de Detalles, por omisión ambas muestran todos los campos de la tabla por fecha de creación. Puede editar la distribución escogiendo Distribución del menú de Desarrollador. Ordenar la vista de lista Para la vista de Lista, puede especificar la secuencia de los campos columna, y también si hay algún campo oculto.
Editar la disposición de la lista Editar la disposición de la lista.
Ordenar la vista detalles Para la vista de Detalles, puede crear grupos o campos y darlos títulos. Después puede colocar campos en esos grupos y especificar la secuencia de los campos en los grupos. También puede especificar la secuencia de los grupos. Por ejemplo, en una tabla de «Contactos» puede crear un grupo llamado «Nombre», y colocar los campos «Título», «Nombre» y «Apellido» en ese grupo. Puede tener otros grupos para los campos «Direcciones».
Editar la disposición de los detalles Editar la disposición de los detalles.
Crear relaciones Muchas veces las tablas de una base de datos están relacionadas entre sí. Por ejemplo, una tabla de «Facturas» podrá tener un campo «ID del cliente». El valor de ese campo especifica un registro en la tabla «Clientes» el cual tiene el mismo valor. Glom puede mostrar información adicional, como el nombre del cliente, de ese registro relacionado. O puede mostrar una lista de varios registros relacionados - por ejemplo, algún registro de la «Lista de facturas» que está relacionado con otro registro de «Facturas». Para crear relaciones, escoja Relaciones del menú de Desarrollador. Esto le mostrará la lista de relaciones existentes. Para crear una nueva relación pulse el botón de Añadir e introduzca un nombre para ella. Debe elegir un campo de la tabla actual y un campo de otra tabla con el que se creará la relación. Esta relación buscará cualquier registro en la otra tabla para los que los valores de ambos campos sean iguales. Puede usar las relaciones en los siguientes lugares. Para mostrar un campo relacionado en la lista o en la vista detallada. Para mostrar una lista de registros relacionados en la vista detallada. Para buscar un valor de un campo en un registro relacionado. Por ejemplo, copie el precio de un «Producto» en el campo «Precio» de un registro de «Facturas». Para calcular el valor de un campo. Administración de usuarios Para definir los Operadores que pueden utilizar su base de datos y para especificar que acceso tienen a las distintas tablas, seleccione Usuarios del menú Desarrollador. Traducciones La interfaz de usuario de Glom (y este documento) está traducido a varios idiomas, como ya debería poder ver si utiliza un equipo con un interfaz de usuario que no esté en inglés. Además, Glom entiende y muestra automáticamente números y fechas de acuerdo a las convenciones actuales de localización del usuario. Por ejemplo, un usuario en EE. UU. debe introducir un precio como 1.99 y una fecha como 1/13/2008, pero un usuario alemán de la misma base de datos lo verá más adelante como 1,99 y 13.1.2008. Sin embargo, el sistema Glom que crea contiene también texto que debe traducirse si personas que hablan diferentes idiomas lo van a usar.Por ejemplo, puede proporcionar traducciones para los títulos de sus tablas, campos e informes. Todos estos elementos de texto se pueden ver en una lista cuando selecciona Traducciones en el menú Desarrollador. En esta ventana puede especificar el idioma que ha utilizado para el texto original, e introducir las traducciones adicionales en cada idioma para cada elemento de texto. Cuando un usuario de ese idioma abre el sistema Glom, se mostrarán esos elementos de texto en la interfaz de usuario.
Traducciones Traducciones.
Los traductores experimentados pueden estar más familiarizados con el formato .po, o puede desear utilizar la mayoría de las herramientas que funcionan con el formato .po. Al usar el botón Exportar puede crear un archivo .po para utilizarlo en una herramienta aparte o para enviárselo a un traductor. Puede importar la traducción resultante usando el botón Importar.
Definir informes Añadir o editar informes Glom puede generar informes para mostrar campos específicos o conjuntos de registros, ordenados y agrupados. Por ejemplo, una tienda puede necesitar un informe que liste todos los productos vendidos en un mes, agrupados por tipo de producto, y ordenados por precio dentro de cada grupo. Cada tabla tiene sus propios informes, que están a disposición del operador en el menú Informes. Para definir un informe, o para cambiar la definición de un informe existente, seleccione Informes en el menú Desarrollador.
Crear o editar informes Crear o editar informes.
Tenga en cuenta que cada informe tiene un ID, así como un nombre legible por humanos. Esto permite que su informe tenga un título traducido cuando se utiliza en un ordenador que trabaja con un idioma diferente.
Editar un informe Un informe de Glom tiene tres áreas: La cabecera, que aparecerá al principio del informe El área principal, donde se muestran los registros y las líneas de resumen, con los datos actuales de la base de datos. El pie, que aparecerá al final del informe. Dentro de un área, como la parte principal, puede añadir Partes de un informe, tales como campos, texto o imágenes. Habitualmente aparecerán en una fila en el informe impreso, con una fila para cada registro. En el caso simple, se parecerá mucho a la vista de lista de Glom. Puede añadir partes a su informe seleccionándolas de la lista Partes disponibles y pulsando en el botón Añadir. Se añadirá la parte a la lista Partes, en el área seleccionada. Para especificar los detalles de las partes, tales como el texto o la imagen que mostrar, o seleccionar el campo que mostrar, seleccione la parte en la lista Partes y pulse el botón Editar. También puede especificar el formato del campo pulsando el botón Formato, simplemente como lo haría cuando define la disposición de los detalles o la disposición de una lista.
Editar un informe Editar un informe.
Algunas partes pueden contener otras partes y tener propiedades adicionales para controlar como se presentan su partes hijas. Por ejemplo, la parte Agrupar por agrupa registros juntos por un campo. Por ejemplo, un informe de productos debe agrupar una lista de productos por tipo de producto. También puede añadir una segunda agrupación dentro de la parte Agrupar por principal, seleccionando la primera parte Agrupar por en la lista Partes mientras añade una nueva parte Agrupar por de la lista Partes disponibles. Por ejemplo, puede agrupar sus productos por fabricante, dentro de cada grupo de tipo de producto. Para especificar el campo por el que se agruparán los registros, seleccione su parte Agrupar por en la lista Partes y pulse el botón Editar. Entonces puede seleccionar el campo por el que quiere que se ordenen los registros, y seleccionar los campos por los que esos registros deberán ordenarse dentro del grupo. También debe especificar algunos campos adicionales para mostrar en el título de la fila del grupo. Por ejemplo, puede querer agrupar productos por ID de fabricante, pero mostrar también el nombre del fabricante.
Editar un grupo por partes Editar un informe.
La parte Grupo vertical puede contener otros elementos. Por ejemplo, le permite ordenar campos junto a otros en lugar de uno detrás de otro en la fila horizontal. Ésto es útil para agrupar campos relacionados tales como direcciones, o simplemente apretar más información dentro de la fila del registro del informe.
Un informe con grupos verticales Un informe con grupos verticales.
Cuando haya acabado, pulse el botón Cerrar para guardar la definición del informe. Puede seleccionar su informe desde el menú Informes. Para obtener más detalles vea la sección Imprimir informes.
Diálogos Diálogo: Diálogo inicial Este diálogo permite al usuario seleccionar un documento existente o crear un documento nuevo. Los documentos existentes se deben seleccionar de la lista de documentos abiertos recientemente, o seleccionando un archivo con el diálogo de selección de archivos. También se pueden abrir los documentos a través de la red, si otros usuarios están ejecutando Glom en la red local. Finalmente, se puede crear un documento nuevo abriendo una plantilla que ya contenga algunas tablas o registros iniciales, o creando un documento vacío. Diálogo: Nueva base de datos Diálogo: Crear base de datos Diálogo: Conexión Este cuadro de diálogo solicita un nombre de usuario y una contraseña para conectar a un servidor de bases de datos. Normalmente no es la misma combinación de usuario y contraseña que utiliza para autenticarse en su sistema. Todos los sistemas Glom requieren un servidor de bases de datos en el que almacenar los datos actuales. Si el servidor de bases de datos no se está ejecutando en el equipo local («localhost»), debe proporcionar el nombre del equipo, tal como "glomserver.openismus.com", aunque su nombre del equipo sea diferente. Su administrador de sistemas puede proporcionarle esos detalles de conexión a la base de datos. Si es el administrador del sistema. lea la página web de Glom Configuración de Postgres para obtener ayuda con la instalación y configuración del servidor de bases de datos. Diálogo: Error de conexión Este diálogo se muestra cuando Glom no puede conectar con el servidor de bases de datos especificado. O el servidor de bases de datos no está funcionando en el equipo especificado, o el servidor de bases de datos no aceptó el nombre de usuario y la contraseña. Para obtener más detalles consulte la sección Diálogo de conexión. Diálogo: Preferencias de la base de datos Diálogo: Cambiar idioma Ventana: Objeto de texto Ventana: Objeto de imagen Diálogo: Cuaderno de notas Diálogo: Formato de datos no válido Diálogo: Descripción de la relación Ventana: Grupos Diálogo: Agrupar por campos ordenados Diálogo: Agrupar por campos secundarios Ventana: Botón de script Ventana: Cálculo de campos Diálogo: Grupo nuevo Diálogo: Elegir usuario Diálogo: Usuario Diálogo: La traducción identifica al original Diálogo: Copia de la traducción Diálogo: Elegir fecha Diálogo: Importar a una tabla Este diálogo permite al usuario importar un archivo CSV (valores separados por comas) en la tabla de la base de datos actual. Muestra las primeras filas del archivo para importar y permite al usuario seleccionar el campo destino en la base de datos para cada columna del archivo CSV. Para autoincrementar las claves primarias, el campo de la clave primaria no se puede utilizar como campo destino, de lo contrario se debe importar una columna en el campo de la clave primaria. Acerca de Glom Glom y la comunidad de voluntarios de Glom se encargan de mantener Glom. Para obtener más información acerca de Glom, visite la página web de Glom. Para informar sobre un error o hacer sugerencias sobre esta aplicación o sobre éste manual, puede enviarlas usando Bugzilla. Otra excelente fuente de información son las listas de correo de Glom. Este programa se distribuye bajo los términos de la Licencia Pública General GNU (GPL) tal y como fue publicada por la Free Software Foundation, en la versión 2 ó (a su elección) cualquier versión posterior. Una copia de esta licencia puede encontrarse en este enlace, o en el archivo COPYING incluido con el código fuente de este programa. Conceptos Glom es fácil de usar, pero debe entender los siguientes conceptos básicos. Base de datos: Cada documento de Glom permite el acceso a una base de datos. Tabla: Cada base de datos contiene varias tablas, tales como, por ejemplo, las tablas «Clientes» y «Facturas». Campo: Cada tabla tiene varios campos, tales como «ID del cliente», «Nombre» y «Fecha de nacimiento», en otros documentos y aplicaciones, se suele denominar a estos campos «columnas». Registros: Cada tabla tiene varios registros, cada uno de los cuales contiene valores para cada uno de los campos. Por ejemplo la tabla de «Clientes» tendrá un registro para cada cliente. En otros documentos y aplicaciones, a los registros se los suele denominar filas. Relaciones: Cada tabla puede estar relacionada con otras tablas, por medio de los campos de ambas tablas. Por ejemplo, la tabla «Clientes» puede tener relación con la tabla «Facturas», de tal manera que se pueden ver todas las facturas de ése cliente. Sólo los desarrolladores necesitan entender éste concepto. En otros documentos y aplicaciones, a las relaciones se las suele denominar «uniones» o «joins». Campos calculados y botones de script Los campos calculados y los botones de scripts usan el lenguaje de programación Python.El cálculo o el script es la implementación de una función cuya firma se le proporciona.
Editar la definición de un campo calculado Editar la definición de un campo calculado.
Valores de campo Por ejemplo, record["name_first"] es el valor del campo name_first en el registro actual. Registros relacionados Por ejemplo, record.related["ubicación"] proporciona los registros relacionados con el registro actual. Un sólo registro relacionado Para relaciones que especifican un único registro puede obtener el valor de un campo en ese registro. Por ejemplo, record.related["ubicación"]["nombre"] es el valor del nombre del campo en la tabla indicada por la relación de ubicación (habitualmente denominada ubicación::nombre). Múltiples registros relacionados Para relaciones que especifican múltiples registros, puede utilizar las funciones de adición (sum, count, average) para obtener todos los valores. Por ejemplo, record.related["lineas_de_factura"].sum("precio_total"). Probando para valores vacíos La manera de probar para valores vacíos depende del tipo de campo: Campos que no son de texto Los campos que no sean de texto deben estar vacíos, indicando que el usuario no ha introducido ningún valor en el campo. Por ejemplo, Glom no asume que un valor vacío en un campo numérico deba valer 0. Puede probar si un campo está vacío usando el código Python «None». Por ejemplo: if(record["contact_id"] == None): return "Sin contacto" else: return record.related["contacts"]["name_full"] También puede comprobar si hay algunos registros relacionados. Por ejemplo: if(record.related["contacts"] == None): return "Sin contacto" else: return record.related["contacts"]["name_full"] Campos de texto Para campos de texto debe comprobar las cadenas de longitud cero. En Glom no es posible distinguir entre cadenas de longitud cero y ausencia de cadena, ya que no hay diferencia. Por ejemplo: if(record["name_full"] == ""): return "Sin nombre" else: return record["name_full"] Usando la API pydga completa pygda es una API de Python para la API libgda. Los atributos de los registros connection proporcionan una conexión gda que puede usarse para acceder directamente a la base de datos actual. Esto le permite ejecutar cualquier consulta SQL, por ejemplo para leer datos de la base de datos con un SELECT o cambiar valores en la base de datos con un UPDATE. Nótese que la conexión ya está abierta, por lo que puede evitar el difícil trabajo de especificar los detalles de la conexión. El atributo del registro table_name también proporciona el nombre de la tabla actual. Este ejemplo lee todos los datos de la tabla actual e imprime los valores en la terminal: # Usar la conexión actual a la base de datos # para obtener todos los datos de la tabla actual. # # la conexión de registros es un objeto gda.connection ya abierto, # evitando la incomodidad de abrir la conexión, # o incluso conociendo el nombre de la base de datos. query = "SELECT * FROM %s" % record.table_name data_model = gda.gda_execute_select_command(record.connection, query) rows = data_model.get_n_rows() columns = data_model.get_n_columns() print " Número de columnas: ", columns for i in range(columns): print " columna ", i; print " nombre=", data_model.get_column_title(i) # Comprueba si es la clave primaria:\n" field = data_model.describe_column(i) if field.get_primary_key(): print " (clave primaria)" print "\n"; print " Número de columnas: ", rows for row_index in range(rows): print " fila ", row_index; for col_index in range(columns): print " valor=", data_model.get_value_at(col_index, row_index).get() print "\n";
glom-1.22.4/docs/user-guide/fr/0000755000175000017500000000000012235000130017356 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/fr/legal.xml0000644000175000017500000000643012235000130021167 0ustar00murraycmurrayc00000000000000 Permission vous est donnée de copier, distribuer et/ou modifier ce document selon les termes de la Licence GNU Free Documentation License, Version 1.1 ou ultérieure publiée par la Free Software Foundation sans section inaltérable, sans texte de première page de couverture ni texte de dernière page de couverture. Vous trouverez un exemplaire de cette licence en suivant ce lien ou dans le fichier COPYING-DOCS fourni avec le présent manuel. Ce manuel fait partie de la collection de manuels GNOME distribués selon les termes de la licence de documentation libre GNU. Si vous souhaitez distribuer ce manuel indépendamment de la collection, vous devez joindre un exemplaire de la licence au document, comme indiqué dans la section 6 de celle-ci. La plupart des noms utilisés par les entreprises pour distinguer leurs produits et services sont des marques déposées. Lorsque ces noms apparaissent dans la documentation GNOME et que les membres du projet de Documentation GNOME sont informés de l'existence de ces marques déposées, soit ces noms entiers, soit leur première lettre est en majuscule. LE PRÉSENT DOCUMENT ET SES VERSIONS MODIFIÉES SONT FOURNIS SELON LES TERMES DE LA LICENCE DE DOCUMENTATION LIBRE GNU SACHANT QUE : LE PRÉSENT DOCUMENT EST FOURNI « TEL QUEL », SANS AUCUNE GARANTIE, EXPRESSE OU IMPLICITE, Y COMPRIS, ET SANS LIMITATION, LES GARANTIES DE MARCHANDABILITÉ, D'ADÉQUATION À UN OBJECTIF PARTICULIER OU DE NON INFRACTION DU DOCUMENT OU DE SA VERSION MODIFIÉE. L'UTILISATEUR ASSUME TOUT RISQUE RELATIF À LA QUALITÉ, À LA PERTINENCE ET À LA PERFORMANCE DU DOCUMENT OU DE SA VERSION DE MISE À JOUR. SI LE DOCUMENT OU SA VERSION MODIFIÉE S'AVÉRAIT DÉFECTUEUSE, L'UTILISATEUR (ET NON LE RÉDACTEUR INITIAL, L'AUTEUR, NI TOUT AUTRE PARTICIPANT) ENDOSSERA LES COÛTS DE TOUTE INTERVENTION, RÉPARATION OU CORRECTION NÉCESSAIRE. CETTE DÉNÉGATION DE RESPONSABILITÉ CONSTITUE UNE PARTIE ESSENTIELLE DE CETTE LICENCE. AUCUNE UTILISATION DE CE DOCUMENT OU DE SA VERSION MODIFIÉE N'EST AUTORISÉE AUX TERMES DU PRÉSENT ACCORD, EXCEPTÉ SOUS CETTE DÉNÉGATION DE RESPONSABILITÉ ; EN AUCUNE CIRCONSTANCE ET SOUS AUCUNE INTERPRÉTATION DE LA LOI, QU'IL S'AGISSE D'UN DÉLIT CIVIL (Y COMPRIS LA NÉGLIGENCE), CONTRACTUEL OU AUTRE, L'AUTEUR, LE RÉDACTEUR INITIAL, TOUT PARTICIPANT OU TOUT DISTRIBUTEUR DE CE DOCUMENT OU DE SA VERSION MODIFIÉE, OU TOUT FOURNISSEUR DE L'UNE DE CES PARTIES NE POURRA ÊTRE TENU RESPONSABLE À L'ÉGARD DE QUICONQUE POUR TOUT DOMMAGE DIRECT, INDIRECT, PARTICULIER, OU ACCIDENTEL DE TOUT TYPE Y COMPRIS, SANS LIMITATION, LES DOMMAGES LIÉS À LA PERTE DE CLIENTÈLE, À UN ARRÊT DE TRAVAIL, À UNE DÉFAILLANCE OU UN MAUVAIS FONCTIONNEMENT INFORMATIQUE, OU À TOUT AUTRE DOMMAGE OU PERTE LIÉE À L'UTILISATION DU DOCUMENT ET DE SES VERSIONS MODIFIÉES, MÊME SI LADITE PARTIE A ÉTÉ INFORMÉE DE L'ÉVENTUALITÉ DE TELS DOMMAGES. glom-1.22.4/docs/user-guide/fr/fr.po0000644000175000017500000022515712235000130020341 0ustar00murraycmurrayc00000000000000# French translation of glom documentation. # Copyright (C) 2008 Free Software Foundation, Inc. # This file is distributed under the same license as the glom # documentation package. # # Bruno Brouard , 2008. # Claude Paroz , 2008. # msgid "" msgstr "" "Project-Id-Version: glom\n" "POT-Creation-Date: 2012-02-24 12:39+0000\n" "PO-Revision-Date: 2008-06-10 11:58+0200\n" "Last-Translator: Claude Paroz \n" "Language-Team: GNOME French Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: C/legal.xml:2(para) C/glom.xml:2(para) msgid "" "Permission is granted to copy, distribute and/or modify this document under " "the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any " "later version published by the Free Software Foundation with no Invariant " "Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy " "of the GFDL at this link or " "in the file COPYING-DOCS distributed with this manual." msgstr "" "Permission vous est donnée de copier, distribuer et/ou modifier ce document " "selon les termes de la Licence GNU Free Documentation License, Version 1.1 " "ou ultérieure publiée par la Free Software Foundation sans section " "inaltérable, sans texte de première page de couverture ni texte de dernière " "page de couverture. Vous trouverez un exemplaire de cette licence en suivant " "ce lien ou dans le fichier " "COPYING-DOCS fourni avec le présent manuel." #: C/legal.xml:12(para) C/glom.xml:12(para) msgid "" "This manual is part of a collection of GNOME manuals distributed under the " "GFDL. If you want to distribute this manual separately from the collection, " "you can do so by adding a copy of the license to the manual, as described in " "section 6 of the license." msgstr "" "Ce manuel fait partie de la collection de manuels GNOME distribués selon les " "termes de la licence de documentation libre GNU. Si vous souhaitez " "distribuer ce manuel indépendamment de la collection, vous devez joindre un " "exemplaire de la licence au document, comme indiqué dans la section 6 de " "celle-ci." #: C/legal.xml:19(para) C/glom.xml:19(para) msgid "" "Many of the names used by companies to distinguish their products and " "services are claimed as trademarks. Where those names appear in any GNOME " "documentation, and the members of the GNOME Documentation Project are made " "aware of those trademarks, then the names are in capital letters or initial " "capital letters." msgstr "" "La plupart des noms utilisés par les entreprises pour distinguer leurs " "produits et services sont des marques déposées. Lorsque ces noms " "apparaissent dans la documentation GNOME et que les membres du projet de " "Documentation GNOME sont informés de l'existence de ces marques déposées, " "soit ces noms entiers, soit leur première lettre est en majuscule." #: C/legal.xml:35(para) C/glom.xml:35(para) msgid "" "DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, " "EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT " "THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS " "MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE " "RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR " "MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR " "MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL " "WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY " "SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN " "ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION " "OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND" msgstr "" "LE PRÉSENT DOCUMENT EST FOURNI « TEL QUEL », SANS AUCUNE GARANTIE, EXPRESSE " "OU IMPLICITE, Y COMPRIS, ET SANS LIMITATION, LES GARANTIES DE " "MARCHANDABILITÉ, D'ADÉQUATION À UN OBJECTIF PARTICULIER OU DE NON INFRACTION " "DU DOCUMENT OU DE SA VERSION MODIFIÉE. L'UTILISATEUR ASSUME TOUT RISQUE " "RELATIF À LA QUALITÉ, À LA PERTINENCE ET À LA PERFORMANCE DU DOCUMENT OU DE " "SA VERSION DE MISE À JOUR. SI LE DOCUMENT OU SA VERSION MODIFIÉE S'AVÉRAIT " "DÉFECTUEUSE, L'UTILISATEUR (ET NON LE RÉDACTEUR INITIAL, L'AUTEUR, NI TOUT " "AUTRE PARTICIPANT) ENDOSSERA LES COÛTS DE TOUTE INTERVENTION, RÉPARATION OU " "CORRECTION NÉCESSAIRE. CETTE DÉNÉGATION DE RESPONSABILITÉ CONSTITUE UNE " "PARTIE ESSENTIELLE DE CETTE LICENCE. AUCUNE UTILISATION DE CE DOCUMENT OU DE " "SA VERSION MODIFIÉE N'EST AUTORISÉE AUX TERMES DU PRÉSENT ACCORD, EXCEPTÉ " "SOUS CETTE DÉNÉGATION DE RESPONSABILITÉ ; " #: C/legal.xml:55(para) C/glom.xml:55(para) msgid "" "UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING " "NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY " "CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE " "DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON " "FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF " "ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, " "WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES " "OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED " "VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE " "POSSIBILITY OF SUCH DAMAGES." msgstr "" "EN AUCUNE CIRCONSTANCE ET SOUS AUCUNE INTERPRÉTATION DE LA LOI, QU'IL " "S'AGISSE D'UN DÉLIT CIVIL (Y COMPRIS LA NÉGLIGENCE), CONTRACTUEL OU AUTRE, " "L'AUTEUR, LE RÉDACTEUR INITIAL, TOUT PARTICIPANT OU TOUT DISTRIBUTEUR DE CE " "DOCUMENT OU DE SA VERSION MODIFIÉE, OU TOUT FOURNISSEUR DE L'UNE DE CES " "PARTIES NE POURRA ÊTRE TENU RESPONSABLE À L'ÉGARD DE QUICONQUE POUR TOUT " "DOMMAGE DIRECT, INDIRECT, PARTICULIER, OU ACCIDENTEL DE TOUT TYPE Y COMPRIS, " "SANS LIMITATION, LES DOMMAGES LIÉS À LA PERTE DE CLIENTÈLE, À UN ARRÊT DE " "TRAVAIL, À UNE DÉFAILLANCE OU UN MAUVAIS FONCTIONNEMENT INFORMATIQUE, OU À " "TOUT AUTRE DOMMAGE OU PERTE LIÉE À L'UTILISATION DU DOCUMENT ET DE SES " "VERSIONS MODIFIÉES, MÊME SI LADITE PARTIE A ÉTÉ INFORMÉE DE L'ÉVENTUALITÉ DE " "TELS DOMMAGES." #: C/legal.xml:28(para) C/glom.xml:28(para) msgid "" "DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS " "OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: " "" msgstr "" "LE PRÉSENT DOCUMENT ET SES VERSIONS MODIFIÉES SONT FOURNIS SELON LES TERMES " "DE LA LICENCE DE DOCUMENTATION LIBRE GNU SACHANT QUE : " #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:181(None) msgid "@@image: 'figures/start_open.png'; md5=adac27f11f2324c3da2349f72d554994" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:195(None) msgid "" "@@image: 'figures/start_create.png'; md5=f1e4c22fd6811e4ba908e290e76f0474" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:226(None) msgid "" "@@image: 'figures/glom_tables.png'; md5=a61ac5516314b38c6c7a3f3fd534427f" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:252(None) msgid "" "@@image: 'figures/glom_data_list.png'; md5=3b7469ee1de77081b435db5ac2d48953" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:275(None) msgid "" "@@image: 'figures/glom_data_details.png'; " "md5=455bde435350fd53401213dff235bfb3" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:305(None) msgid "" "@@image: 'figures/glom_report_result.png'; " "md5=2b752779eb0ed68724d094f6e1fef699" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:343(None) msgid "" "@@image: 'figures/glom_design_fields.png'; " "md5=39a13053db33b9c45bc1f61a0f31a199" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:393(None) msgid "" "@@image: 'figures/glom_design_layout_list.png'; " "md5=213888ef5cd3037b2fa61155b4fe5136" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:412(None) msgid "" "@@image: 'figures/glom_design_layout_details.png'; " "md5=6f1d78f90d6ec0ea338014d2ac697a90" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:458(None) msgid "" "@@image: 'figures/glom_design_translations.png'; " "md5=92b8e4905d0b85ef7f7d248420942a97" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:485(None) msgid "" "@@image: 'figures/glom_design_reports.png'; " "md5=697eb7cc6baebae8b374e474b4fa0899" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:517(None) msgid "" "@@image: 'figures/glom_design_reports_details.png'; " "md5=00ac05c3515a4db2175a47047ec3b98e" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:534(None) msgid "" "@@image: 'figures/glom_design_reports_group_by.png'; " "md5=21168c2a89f9febf6905a59c24a3d6de" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:550(None) msgid "" "@@image: 'figures/glom_design_reports_vertical_group.png'; " "md5=001b3021da2dc0de68358b0b41215afb" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:766(None) msgid "" "@@image: 'figures/glom_design_fields_dialog_calculated.png'; " "md5=21b9fc570ff40883d1d283d960e45767" msgstr "" #: C/glom.xml:28(title) msgid "Glom User Guide V0.2" msgstr "Manuel d'utilisation de Glom v0.2 " #: C/glom.xml:29(subtitle) msgid "for Glom v1.6" msgstr "pour Glom v1.6" #: C/glom.xml:32(year) msgid "2004" msgstr "2004" #: C/glom.xml:33(holder) C/glom.xml:99(para) C/glom.xml:100(para) msgid "Murray Cumming" msgstr "Murray Cumming" #: C/glom.xml:47(publishername) C/glom.xml:60(orgname) msgid "Glom Development Team" msgstr "Équipe de développement de Glom" #: C/glom.xml:57(firstname) msgid "Murray" msgstr "Murray" #: C/glom.xml:58(surname) msgid "Cumming" msgstr "Cumming" #: C/glom.xml:61(email) msgid "murrayc@murrayc.com" msgstr "murrayc@murrayc.com" #: C/glom.xml:96(revnumber) msgid "Glom 1.6" msgstr "Glom 1.6" #: C/glom.xml:97(date) msgid "20 June 2004" msgstr "20 juin 2004" #: C/glom.xml:105(releaseinfo) msgid "This manual describes version 1.6 of Glom" msgstr "Ce manuel documente la version 1.6 de Glom" #: C/glom.xml:108(title) msgid "Feedback" msgstr "Votre avis" #: C/glom.xml:109(para) msgid "" "To report a bug or make a suggestion regarding the Glom or this manual can " "be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla " "before submitting your bug to ensure that yours hasn't already been reported." msgstr "" "Pour signaler une anomalie ou émettre une suggestion concernant Glom ou ce " "manuel, faites une soumission d'anomalie à GNOME Bugzilla pour le produit Glom. Merci " "de faire une recherche sur bugzilla avant de soumettre votre anomalie pour " "s'assurer qu'elle n'a pas été déjà signalée." #: C/glom.xml:119(para) msgid "User manual for Glom." msgstr "Manuel d'utilisation de Glom." #: C/glom.xml:124(primary) msgid "MY-GNOME-APP" msgstr "MY-GNOME-APP" #: C/glom.xml:127(primary) msgid "mygnomeapp" msgstr "mygnomeapp" #: C/glom.xml:135(title) msgid "Introduction" msgstr "Introduction" #: C/glom.xml:136(para) msgid "Glom allows you to design and use database systems." msgstr "" "Glom vous permet de concevoir et d'utiliser des systèmes de bases de données." #: C/glom.xml:150(title) msgid "Getting Started" msgstr "Premiers pas" #: C/glom.xml:153(title) msgid "Starting Glom" msgstr "Lancement de Glom" #: C/glom.xml:154(para) msgid "You can start Glom in the following ways:" msgstr "Vous pouvez démarrer Glom comme ceci :" #: C/glom.xml:158(term) msgid "Applications menu" msgstr "Menu Applications" #: C/glom.xml:160(para) msgid "" "Choose OfficeGlom." msgstr "" "Choisissez BureautiqueGlom." #: C/glom.xml:171(title) msgid "When You Start Glom" msgstr "Démarrage de Glom" #: C/glom.xml:172(para) msgid "" "When you start Glom, the following window is " "displayed. You may open an existing Glom file or create a new one, possibly " "basing a new Glom file on one of the examples." msgstr "" "Lorsque vous démarrez Glom, la fenêtre suivante " "s'affiche. Vous pouvez ouvrir un fichier Glom existant ou en créer un " "nouveau en se basant éventuellement sur l'un des modèles." #: C/glom.xml:177(title) msgid "Glom Start Up Window, Opening an Existing File" msgstr "Fenêtre de démarrage de Glom, ouverture d'un fichier existant" #: C/glom.xml:184(phrase) msgid "Shows Glom main window used to open an existing Glom file." msgstr "" "Affiche la fenêtre principale de Glom utilisée pour ouvrir un fichier Glom " "existant." #: C/glom.xml:191(title) msgid "Glom Start Up Window, Creating a New File" msgstr "Fenêtre de démarrage de Glom, création d'un nouveau fichier" #: C/glom.xml:198(phrase) msgid "Shows Glom main window used to create a new Glom file." msgstr "" "Affiche la fenêtre principale de Glom utilisée pour créer un nouveau fichier " "Glom." #: C/glom.xml:212(title) msgid "Using Glom as an Operator" msgstr "Utilisation de Glom en tant qu'opérateur" #: C/glom.xml:213(para) msgid "" "To open an existing Glom document, either open that document from the File " "Manager, or choose Glom from the Applications menu, and then choose the " "document when asked. Glom will ask you for a user name and password to " "access the database. Your administrator will provide your user name and " "password." msgstr "" "Pour ouvrir un document Glom existant, ouvrez-le à partir du gestionnaire de " "fichiers ou choisissez Glom à partir du menu Applications, puis sélectionnez " "le document lorsqu'on vous le demande. Glom demande un nom d'utilisateur et " "un mot de passe pour accéder à la base de données. Votre administrateur vous " "fournira votre nom d'utilisateur et votre mot de passe." #: C/glom.xml:215(para) msgid "" "When you open an existing document, Glom will be in Operatoruser level. This user level allows you to find " "and edit records, but does not allow you to change the fundamental structure " "of the database." msgstr "" "Quand vous ouvrez un document existant, Glom se place à un niveau opérateur. Ce niveau d'utilisateur permet de " "chercher et de modifier des enregistrements, mais pas de modifier la " "structure fondamentale de la base de données." #: C/glom.xml:218(title) msgid "Navigation" msgstr "Navigation" #: C/glom.xml:219(para) msgid "" "Each database has several tables. To look at a different table, choose " "Tables from the Navigate menu. Then " "double-click on the table, or select it and click the Open button." msgstr "" "Chaque base de données possède plusieurs tables. Pour examiner une autre " "table, choisissez Tables dans le menu " "Navigation. Puis cliquez deux fois sur la table ou " "sélectionnez-la et cliquez sur le bouton Ouvrir." #: C/glom.xml:222(title) msgid "Navigating to a Table" msgstr "Navigation vers une table" #: C/glom.xml:229(phrase) msgid "Navigating to a Table." msgstr "Navigation vers une table." #: C/glom.xml:238(title) msgid "Viewing and Entering Data" msgstr "Affichage et saisie de données" #: C/glom.xml:239(para) msgid "" "When in Data Mode, you can view or enter information in " "either the List or Details view." msgstr "" "Lorsque vous êtes en mode données, vous pouvez afficher " "ou saisir des informations soit dans la vue Liste ou dans " "la vue Détails." #: C/glom.xml:242(title) C/glom.xml:248(title) msgid "The List View" msgstr "La vue Liste" #: C/glom.xml:243(para) msgid "" "The List view shows many records at once and usually shows only the most " "important fields." msgstr "" "La vue liste affiche plusieurs enregistrement à la fois et habituellement " "n'affiche que les champs les plus importants." #: C/glom.xml:244(para) C/glom.xml:267(para) msgid "" "When you enter data into a field it will be saved into the database " "immediately after you finish editing the field. If it is a date or time " "field then the data format will be checked for you." msgstr "" "Quand vous saisissez des données dans un champ, celles-ci sont enregistrées " "immédiatement dans la base de données dès que vous avez fini de le saisir. " "S'il s'agit d'un champ date ou heure, le format des données est " "automatiquement contrôlé." # BUG en anglais : bouton Add et non bouton New #: C/glom.xml:245(para) msgid "" "To create a new record just click the New button, or " "start typing into a field in the last empty row. A new record row will be " "created with blank fields for you to fill in." msgstr "" "Pour créer un nouvel enregistrement, il suffit de cliquer sur le bouton " "Ajouter ou de commencer à taper dans un champ de la " "dernière ligne vide. Un nouvel enregistrement est alors créé avec des champs " "vides prêts à être remplis." #: C/glom.xml:255(phrase) msgid "The List View." msgstr "La vue Liste." #: C/glom.xml:261(para) msgid "" "To sort the records just click on a column header. For instance, you could " "might click on a date column to list invoices in order of their date, and " "click again to list them in reverse order." msgstr "" "Pour trier les enregistrements, il suffit de cliquer sur l'en-tête d'une " "colonne. Par exemple, pour afficher des factures dans l'ordre chronologique " "vous pouvez cliquer sur la colonne « date », puis cliquer à nouveau pour les " "afficher dans l'ordre inverse." #: C/glom.xml:265(title) C/glom.xml:271(title) msgid "The Details View" msgstr "La vue Détails" #: C/glom.xml:266(para) msgid "" "The details view shows only one record and usually shows all the fields " "arranged suitably." msgstr "" "La vue Détails n'affiche qu'un seul enregistrement et affiche en général " "tous les champs dans un ordre approprié." # BUG en anglais : bouton Add et non bouton New #: C/glom.xml:268(para) msgid "" "To create a new record just click the New button. A new " "record will be created with blank fields for you to fill in." msgstr "" "Pour créer un nouvel enregistrement, il suffit de cliquer sur le bouton " "Ajouter. Un nouvel enregistrement est alors créé avec des " "champs vides prêts à être remplis." #: C/glom.xml:278(phrase) msgid "The Details View." msgstr "La vue Détails." #: C/glom.xml:289(title) msgid "Finding Data" msgstr "Recherche de données" # BUG : les champs dans la vue Liste ne sont pas vides #: C/glom.xml:290(para) msgid "" "Choose Find Mode from the Mode menu. The fields in the " "List and Details views will now be empty, and a Find button will appear at " "the bottom of the window." msgstr "" "Sélectionnez le mode Rechercher dans le menu Mode. Les " "champs dans les vues liste et détails sont maintenant vides et un bouton " "« Rechercher » apparaît en bas de la fenêtre." #: C/glom.xml:291(para) msgid "" "Enter information, or part of the information, into a field to find records " "with that information in that field. For instance, enter Jim into a name " "field to find records with \"Jim\" or \"Jimmy\" in the name." msgstr "" "Saisissez une information ou une partie d'information dans un champ pour " "trouver les enregistrements qui contiennent cette information. Par exemple, " "saisissez Jim dans le champ nom pour trouver les enregistrements qui " "contiennent « Jim » ou « Jimmy » dans leur nom." #: C/glom.xml:292(para) msgid "" "When you press the Find button, Glom will search for " "records and then display them. If only one record is found then it will show " "you that record in the Details view. If several records are found then it " "will show you those records in the List view." msgstr "" "Quand vous appuyez sur le bouton Rechercher, Glom " "recherche les enregistrements puis les affiche. Si un seul enregistrement " "est trouvé, celui-ci est alors affiché dans la vue détails. Si plusieurs " "enregistrements sont trouvés, ils sont affichés dans la vue liste." #: C/glom.xml:297(title) msgid "Printing Reports" msgstr "Impression de rapports" #: C/glom.xml:298(para) msgid "" "If your database developer has defined some reports for a table then you " "will seem them listed in the Reports menu. Just choose " "the report from the menu to create the report. If you have previously " "performed a search then the report will contain only the currently-found " "data. Otherwise it will contain all data in the current report. Remember " "that each table has its own reports so you may need to switch to the " "relevant table to use a particular report." msgstr "" "Si le développeur de la base de données a défini des rapports pour une " "table, ils apparaissent dans le menu Rapports. Il suffit " "de choisir le rapport dans le menu pour générer le rapport. Si vous avez " "effectué une recherche précédemment, le rapport ne contient que les données " "actuellement trouvées, sinon toutes les données sont présentes. Souvenez-" "vous que chaque table possède son propre rapport, il peut donc être " "nécessaire de basculer vers la bonne table pour obtenir un rapport " "particulier." #: C/glom.xml:301(title) msgid "A report" msgstr "Un rapport" #: C/glom.xml:308(phrase) msgid "A report." msgstr "Un rapport." #: C/glom.xml:320(title) msgid "Using Glom as a Developer" msgstr "Utilisation de Glom en tant que développeur" #: C/glom.xml:321(para) msgid "" "When you create a new document, Glom will be in the Developeruser level. You can also change to the Developer " "user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it." msgstr "" "Quand vous créez un nouveau document, Glom se place à un niveau développeur. Vous pouvez également basculer vers " "le niveau développeur après avoir ouvert un document existant, grâce au menu " "Niveau utilisateur. Glom ne le permet que si " "l'administrateur de la base de données l'autorise." #: C/glom.xml:324(title) msgid "Adding Tables" msgstr "Ajout de tables" #: C/glom.xml:325(para) msgid "" "You can see the list of existing tables by choosing Tables from the Navigate menu. You will also see this " "window after connecting to a database server, after creating a new document. " "To create a new table, click the Add button and enter the " "name for the new table. Glom will suggest a human-readable title for this " "table. Operators will see this title instead of the " "actual table name. You can also mark a tables as hidden " "from Operators. For instance, Operators should see \"Invoice Lines\" as " "related records from the \"Invoices\" table, but they should never be able " "to navigate directly to the \"Invoice Lines\" table." msgstr "" "Vous pouvez voir la liste des tables existantes en choisissant " "Tables dans le menu Navigation. Cette " "fenêtre apparaît également après une connexion à un serveur de base de " "données et après avoir créé un nouveau document. Pour créer une nouvelle " "table, cliquez sur le bouton Ajouter et saisissez le nom " "de la nouvelle table. Glom suggère un titre convivial pour cette table. Les " "opérateurs voient ce titre plutôt que le nom réel de la " "table. Vous pouvez également marquer une table comme masquée pour les opérateurs. Par exemple, les opérateurs peuvent voir les " "« lignes de facture » comme des enregistrements reliés à la table « factures » " "mais ils ne doivent jamais être capables d'aller directement vers la table " "« lignes de facture »." #. TODO: screenshot #: C/glom.xml:327(para) msgid "" "You can also specify one table as the default table. This " "table will be shown whenever an operator opens an existing document, without " "asking him to select a table from the list." msgstr "" "Vous pouvez également spécifier une table comme table par défaut. Cette table sera affichée à chaque fois qu'un opérateur ouvre un " "document existant, sans lui demander de sélectionner une table dans la liste." #: C/glom.xml:328(para) msgid "You can also use this window to rename an existing table." msgstr "" "Vous pouvez également utiliser cette fenêtre pour renommer une table " "existante." #: C/glom.xml:329(para) msgid "Click the Open button to look at the selected table." msgstr "" "Cliquez sur le bouton Ouvrir pour afficher la table " "sélectionnée." #: C/glom.xml:333(title) C/glom.xml:339(title) msgid "Editing Fields" msgstr "Modification des champs" #: C/glom.xml:334(para) msgid "" "Choose Fields from the Developer menu. " "This shows the list of fields in the table. New tables automatically have a " "primary key field, but you can change this field if necessary." msgstr "" "Choisissez Champs dans le menu Développeur. Cela permet d'afficher la liste des champs de la table. Les " "nouvelles tables possèdent automatiquement un champ clé primaire mais vous " "pouvez modifier ce champ si nécessaire." #: C/glom.xml:335(para) msgid "" "Click the Add button to add a new field, then enter the " "name of the new field. Glom will guess an appropriate human-readable title " "for this field, but you can edit this. Operators will see " "this title instead of the actual field name." msgstr "" "Cliquez sur le bouton Ajouter pour ajouter un nouveau " "champ, puis saisissez le nom du nouveau champ. Glom propose un titre " "approprié et convivial pour ce champ, mais vous pouvez le modifier. Les " "opérateurs voient ce titre plutôt que le nom réel du " "champ." #: C/glom.xml:336(para) msgid "" "To specify more field details, select the field and click the " "Details button." msgstr "" "Pour fournir plus de détails sur un champ, sélectionnez-le et cliquez sur le " "bouton Détails." #: C/glom.xml:346(phrase) msgid "Editing the table's fields." msgstr "Modification des champs d'une table." #: C/glom.xml:354(title) msgid "Primary Keys" msgstr "Clés primaires" #: C/glom.xml:355(para) msgid "" "Each table must have one, and only one, Primary Key. The " "value in this field will be unique, meaning that each value in this field " "will appear in only one record in the table. For instance, each record in a " "\"Customers\" table would have a \"Customer ID\". This value will be used to " "refer to that customer from other tables, such as \"Projects\" and \"Invoices" "\" records. See the Creating " "Relationships section to see how you can relate tables together." msgstr "" "Chaque table doit posséder une et une seule clé primaire. " "La valeur de ce champ est unique ce qui signifie que chaque valeur dans ce " "champ n'apparaît que dans un seul enregistrement de la table. Par exemple, " "chaque enregistrement dans une table « clients » possède un « numéro de " "client ». Cette valeur est utilisée pour faire référence à ce client dans " "les autres tables telles que les enregistrements « Projets » et « Factures ». " "Voir la section Création de " "relations pour apprendre comment relier des tables entre elles." #: C/glom.xml:359(title) msgid "Field Types" msgstr "Types de champs" #: C/glom.xml:362(simpara) msgid "Number" msgstr "Nombre" #: C/glom.xml:363(simpara) msgid "Text" msgstr "Texte" #: C/glom.xml:364(simpara) msgid "Date" msgstr "Date" #: C/glom.xml:365(simpara) msgid "Time" msgstr "Heure" #: C/glom.xml:366(simpara) msgid "Boolean - either true or false" msgstr "Booléen - vrai ou faux" #: C/glom.xml:367(simpara) msgid "Image" msgstr "Image" #: C/glom.xml:360(para) msgid "Glom offers a few simple field types: " msgstr "Glom propose quelques types de champs simples : " #: C/glom.xml:373(title) msgid "Calculated Fields" msgstr "Champs calculés" #: C/glom.xml:374(para) msgid "" "Field values can be calculated in terms of other fields, using the Python " "programming language. This calculation should be the implementation of a " "python function, which should return a value. The return value will be used " "as the value of the field. This value will be recalculated every time one of " "the source fields changes. TODO: This only works for default values at the " "moment, and you can not use field values in the calculation yet." msgstr "" "Les valeurs de champs peuvent être calculées en fonction d'autres champs en " "utilisant le langage de programmation Python. Ce calcul doit être une " "implémentation d'une fonction Python qui doit renvoyer une valeur. La valeur " "renvoyée est utilisée comme valeur de champ. Cette valeur est recalculée à " "chaque fois qu'une des sources de champ change. À FAIRE : cela ne fonctionne " "pour l'instant que pour les valeurs par défaut et vous ne pouvez pas encore " "utiliser des valeurs de champ dans le calcul." # l'interface ou la doc n'est pas à jour #: C/glom.xml:375(para) msgid "" "You can also use calculations to specify a default value for fields, by " "selecting the Default Value tab in the Field " "Details window, clicking on the Calculate Value " "check box, and then entering a Python calculation. You can test this " "calculation in the Edit window." msgstr "" "Vous pouvez également utiliser des calculs pour spécifier une valeur par " "défaut pour les champs en sélectionnant l'onglet Valeur par défaut dans la fenêtre Détails des champs, en cliquant " "sur la case à cocher Valeur calculée puis en saisissant " "une formule Python. Vous pouvez tester ce calcul dans la fenêtre " "Édition." #: C/glom.xml:381(title) msgid "Arranging Layouts" msgstr "Arrangement de dispositions" #: C/glom.xml:382(para) msgid "" "Each table has List and Details views, " "and by default these show all fields in the table, in order of creation. You " "can edit the layout by choosing Layout from the " "Developer menu." msgstr "" "Chaque table possède sa vue Liste et Détails et, par défaut, tous les champs de la table sont affichés par ordre " "de création. Vous pouvez modifier la disposition en choisissant " "Disposition dans le menu Développeur." #: C/glom.xml:385(title) msgid "Arranging the List View" msgstr "Mise en page de la vue liste" #: C/glom.xml:386(para) msgid "" "For the List view, you can specify the sequence of field " "columns, and whether some fields are hidden." msgstr "" "Dans la vue Liste, vous pouvez définir l'ordre des " "colonnes de champs et le masquage éventuel de certains champs." #: C/glom.xml:389(title) msgid "Editing the List Layout" msgstr "Modification de l'agencement d'une liste" #: C/glom.xml:396(phrase) msgid "Editing the list layout." msgstr "Modification de l'agencement d'une liste." #: C/glom.xml:404(title) msgid "Arranging the Details View" msgstr "Mise en page de la vue détails" #: C/glom.xml:405(para) msgid "" "For the Details view, you can create groups of fields, " "and give these groups titles. You can then place fields in these groups and " "specify the sequence fo fields in these groups. You can also specify the " "sequence of these groups. For instance, in a \"Contacts\" table, you might " "create a \"Name\" group, and place the \"title\", \"first_name\" and " "\"last_name\" fields in that group. You might have other groups for the " "\"Address\" fields." msgstr "" "Dans la vue détails, il est possible de créer des groupes " "de champs et de leur donner des titres. Vous pouvez alors mettre des champs " "dans ces groupes et définir l'ordre d'apparition des champs dans ces " "groupes. Vous pouvez également définir l'ordre des groupes. Par exemple, " "dans la table « Contacts », vous pouvez créer un groupe « Nom » et mettre les " "champs « titre », « prénom » et « nom » dans ce groupe. Vous pouvez avoir " "d'autres groupes pour les champs « Adresse »." #: C/glom.xml:408(title) msgid "Editing the details Layout" msgstr "Modification de l'agencement des détails" #: C/glom.xml:415(phrase) msgid "Editing the Details Layout." msgstr "Modification de l'agencement des détails." #: C/glom.xml:425(title) msgid "Creating Relationships" msgstr "Création de relations" #: C/glom.xml:426(para) msgid "" "Tables in the Database are often related together. For instance, an " "\"Invoices\" table might have a \"Customer ID\" field. A value in this field " "would specify a record in the \"Customers\" table with the same value. Glom " "can show extra information, such as the customer name, from that related " "record. Or it can show a list of several related records - for instance, " "several related \"Invoice Lines\" that are related to a record in the " "\"Invoice\" record." msgstr "" "Les tables dans les bases de données sont souvent reliées entre elles. Par " "exemple, une table « Factures » peut avoir un champ « Numéro de client ». Une " "valeur dans ce champ se réfère à un enregistrement de la table « Clients » " "avec la même valeur. Glom peut afficher des informations supplémentaires " "telles que le nom du client à partir de cet enregistrement relié. Il peut " "également afficher une liste de plusieurs enregistrement liés. Par exemple, " "plusieurs « Lignes de factures » reliées à un enregistrement dans « Facture »." #: C/glom.xml:427(para) msgid "" "To create relationships, choose Relationships from the " "Developer menu. This will show the list of existing " "relationships. Click the Add button to create a new " "relationship, and enter a name for it. You should then choose a field in the " "current table, and a field in another table to which it should be related. " "This relationship will find any records in the other table for which the " "values in both fields are equal." msgstr "" "Pour créer des relations, choisissez Relations dans le " "menu Développeur. La liste des relations existantes " "s'affiche. Cliquez sur le bouton Ajouter pour créer une " "nouvelle relation et saisissez un nom pour celle-ci. Choisissez ensuite un " "champ dans la table actuelle et un champ d'une autre table auquel il sera " "relié. Cette relation effectue la recherche de tous les enregistrements de " "l'autre table pour lesquels les valeurs des deux champs sont égales." #: C/glom.xml:432(simpara) msgid "To show a related field on the List or Details view." msgstr "Pour afficher un champ lié dans les vues Liste ou Détails." #: C/glom.xml:433(simpara) msgid "To show a list of related records on the Details view." msgstr "Pour afficher une liste des enregistrements liés dans la vue Détails." #: C/glom.xml:434(simpara) msgid "" "To lookup a value from a field in a related record. For instance, to copy " "the current price of a \"Product\" into the \"Price\" field of an \"Invoice " "Line\" record." msgstr "" "Pour afficher la valeur d'un champ dans un enregistrement lié (par exemple, " "pour copier le prix actuel d'un « produit » dans le champ « prix » d'un " "enregistrement « ligne de facture »)." #: C/glom.xml:435(simpara) msgid "To calculate a field value." msgstr "Pour calculer une valeur de champ." #. TODO: screenshot #: C/glom.xml:429(para) msgid "You can use the relationship in the following places. " msgstr "" "Vous pouvez utiliser une relation dans les situations suivantes. " "" #: C/glom.xml:441(title) msgid "Users Administration" msgstr "Gestion des utilisateurs" #: C/glom.xml:442(para) msgid "" "To define the Operators who can use your database, and to " "specify what access they have to the various tables, choose Users from the Developer menu." msgstr "" "Pour définir les opérateurs qui peuvent utiliser votre " "base de données et pour indiquer leurs droits d'accès aux différentes " "tables, choisissez Utilisateurs dans le menu " "Développeur." #: C/glom.xml:447(title) C/glom.xml:454(title) msgid "Translations" msgstr "Traductions" #: C/glom.xml:448(para) msgid "" "Glom's user interface (and this document) is translated into several " "languages, as you should see already if you are using your computer with a " "non-English user interface. In addition, Glom automatically shows and " "understands numbers and dates according to the current user's local " "conventions. For instance, a user in the USA might enter a price as 1.99 and " "a date as 1/13/2008, but a German user of the same database will later see " "that as 1,99 and 13.1.2008." msgstr "" "L'interface utilisateur Glom (et ce document) est traduit dans plusieurs " "langues comme vous avez dû le voir si vous utilisez un ordinateur avec une " "interface utilisateur non anglaise. De plus, Glom affiche et comprend " "automatiquement les nombres et les dates en fonction des conventions " "actuelles de l'utilisateur local. Par exemple, un utilisateur aux U.S.A. " "peut saisir un prix comme 1.99 et une date comme 1/13/2008, mais un " "utilisateur allemand de la même base de données les verra comme 1,99 et " "13.1.2008." #: C/glom.xml:449(para) msgid "" "However, the Glom system that you create also contains text that must be " "translated if it will be used by people who speak different languages. For " "instance, you must provide translations for the titles of your tables, " "fields, and reports. All of these text items can be seen in a list when you " "choose Translations from the Developer " "menu. In this window you can specify the language that you used for the " "original text, and enter translations for each text item for additional " "languages. When the Glom system is opened by a user of that language then " "these text items will be shown in the user interface." msgstr "" "Cependant, le système Glom que vous avez créé contient aussi du texte qui " "doit être traduit s'il est utilisé par des personnes qui parlent une autre " "langue. Par exemple, vous devez fournir des traductions pour les titres de " "vos tables, champs et rapports. Tous ces éléments textuels peuvent être " "listés si vous choisissez Traductions dans le menu " "Développeur. Dans cette fenêtre, vous pouvez indiquer la " "langue utilisée pour le texte original et saisir des traductions pour chaque " "élément de texte pour des langues supplémentaires. Quand le système Glom est " "ouvert par un utilisateur de cette langue, les éléments de texte sont " "affichés dans l'interface utilisateur." #: C/glom.xml:461(phrase) msgid "Translations." msgstr "Traductions." #: C/glom.xml:467(para) msgid "" "Experienced translators may be more familiar with the .po file format, or " "you might wish to use the many tools that work with the .po file format. By " "using the Export button you can create a .po file to use " "in a separate tool or to send to a translator. You can then import the " "resulting translation by using the Import button." msgstr "" "Les traducteurs expérimentés sont probablement plus habitués au format de " "fichier .po, ou vous souhaitez peut-être utiliser les nombreux outils qui " "s'appliquent au format de fichier .po. En utilisant le bouton " "Exporter, vous pouvez créer un fichier .po pour " "l'exploiter dans un outil séparé ou pour l'expédier à un traducteur. Vous " "pouvez ensuite importer la traduction effectuée en utilisant le bouton " "Importer." #: C/glom.xml:472(title) msgid "Defining Reports" msgstr "Définition de rapports" #: C/glom.xml:475(title) msgid "Adding or Editing Reports" msgstr "Ajout et édition de rapports" #: C/glom.xml:477(para) msgid "" "Glom can produce reports to show specific fields for sets of records, sorted " "and grouped. For instance, a shop might need a report listing all products " "sold in one month, grouped by product type, and sorted by price inside each " "group. Each table has its own reports, which are available to the operator " "from the Reports menu." msgstr "" "Glom peut produire des rapports pour afficher des champs spécifiques d'un " "ensemble d'enregistrements, triés et regroupés. Par exemple, un magasin peut " "avoir besoin d'un rapport listant tous les produits vendus en un mois, " "groupés par type de produits et triés par prix dans chaque groupe. Chaque " "table possède ses propres rapports accessibles par l'opérateur dans le menu " "Rapports." #: C/glom.xml:479(para) msgid "" "To define a report, or to change the definition of an existing report, " "choose Reports from the Developer menu." msgstr "" "Pour définir un rapport ou modifier la définition d'un rapport existant, " "choisissez Rapports dans le menu Développeur." #: C/glom.xml:481(title) msgid "Creating or Editing Reports" msgstr "Création et édition de rapports" #: C/glom.xml:488(phrase) msgid "Creating or editing reports." msgstr "Création et édition de rapports." #: C/glom.xml:494(para) msgid "" "Notice that each report has an ID as well as a human-readable name. This " "allows your report to have a translated title when used on a computer that " "uses a different language." msgstr "" "Notez que chaque rapport possède un numéro d'identification (ID) ainsi qu'un " "nom convivial. Ceci permet à votre rapport d'avoir un titre traduit s'il est " "utilisé sur un ordinateur configuré dans une autre langue." #: C/glom.xml:499(title) C/glom.xml:513(title) msgid "Editing a Report" msgstr "Édition d'un rapport" #: C/glom.xml:503(simpara) msgid "The Header, which appears at the start of the report" msgstr "l'en-tête, qui apparaît au début du rapport ;" #: C/glom.xml:504(simpara) msgid "" "The Main area, in which the records and summary lines are shown, with the " "actual data from the database." msgstr "" "la zone principale, dans laquelle les lignes enregistrements et résumé sont " "affichées avec les données actuelles de la base de données ;" #: C/glom.xml:505(simpara) msgid "The Footer, which appears at the end of the report." msgstr "le pied de page, qui apparaît à la fin du rapport." #: C/glom.xml:501(para) msgid "A Glom report has three areas: " msgstr "Un rapport Glom possède trois zones : " #: C/glom.xml:509(para) msgid "" "Inside an area, such as the Main part, you may add report Parts, such as fields, text, or images. These will usually appear in a " "row on the printed report, with one row for each record. In the simple case, " "this will look much like Glom's list view. You can add parts to your report " "by selecting them from the Available Parts list and then " "clicking the Add button. The part will then be added to " "the Parts list, in the selected area." msgstr "" "À l'intérieur d'une zone, telle que la partie principale, vous pouvez " "ajouter des Éléments de rapport tels que des champs, " "textes ou images. Ceux-ci apparaissent habituellement par ligne à " "l'impression du rapport avec une ligne pour chaque enregistrement. Dans le " "cas le plus simple, cela ressemble beaucoup à la vue liste de Glom. Vous " "pouvez ajouter des éléments à votre rapport en les sélectionnant dans la " "liste Éléments disponibles puis en cliquant sur le bouton " "Ajouter. L'élément est alors ajouté à la liste " "Éléments dans la zone sélectionnée." #: C/glom.xml:510(para) msgid "" "To specify details for the parts, such as the text or image to display, or " "to choose the field to display, select the part in the Parts list and click the Edit button. You may also " "specify field formatting by clicking the Formatting " "button, just as you would when defining a details or list layout." msgstr "" "Pour fournir des détails aux éléments, tels que le texte ou l'image à " "afficher ou pour choisir le champ à afficher, sélectionnez l'élément dans la " "liste Éléments puis cliquez sur le bouton " "Modifier. Vous pouvez également indiquer le format du " "champ en cliquant sur le bouton Format, tout comme vous " "le faites pour définir l'apparence dans la vue détails ou liste." #: C/glom.xml:520(phrase) C/glom.xml:537(phrase) msgid "Editing a report." msgstr "Rédaction d'un rapport." #: C/glom.xml:526(para) msgid "" "Some parts may contain other parts and have extra properties to control how " "they present their child parts. For instance, the Group By part groups records together by a field. For instance, a products " "report might group a list of products by product type. You can even add a " "second sub-grouping inside the main Group By part, by " "selecting your top-level Group By part in the " "Parts list while adding a new Group By " "part from the Available Parts list. For instance, you " "might group your products by manufacturer, inside each product type group." msgstr "" "Certains éléments peuvent contenir d'autres éléments et posséder des " "propriétés supplémentaires pour contrôler la manière dont leurs sous-" "éléments sont présentés. Par exemple, l'élément Groupé par regroupe les enregistrements selon un champ. Par exemple, un " "rapport sur des produits peut regrouper la liste des produits par type de " "produit. Vous pouvez même ajouter un second sous-groupe à l'intérieur de " "l'élément principal Groupé par en sélectionnant votre " "élément Groupé par de premier niveau dans la liste " "Éléments pendant que vous ajoutez un nouvel élément " "Groupé par de la liste Éléments disponibles. Par exemple, vous pouvez regrouper vos produits par fabriquant à " "l'intérieur de chaque groupe de type de produit." #: C/glom.xml:527(para) msgid "" "To specify the field by which the records should be grouped, select your " "Group By part in the Parts list and " "click the Edit button. You can then choose the field by " "which the records should be grouped, and select the fields by which these " "records should be sorted within the group. You may also specify some " "additional fields to be displayed in the group's title row. For instance, " "you might want to group products by a manufacturer ID, but also show the " "manufacturer name." msgstr "" "Pour définir le champ par lequel les enregistrements doivent être regroupés, " "sélectionnez votre élément Groupé par dans la liste " "Éléments puis cliquez sur le bouton Modifier. Vous pouvez alors choisir le champ par lequel les enregistrements " "doivent être regroupés et sélectionner les champs par lesquels ces " "enregistrements doivent être triés dans le groupe. Vous pouvez également " "indiquer des champs supplémentaires à afficher sur la ligne de titre du " "groupe. Par exemple, vous pouvez regrouper les produits par numéro de " "fabricant mais également afficher le nom du fabricant." #: C/glom.xml:530(title) msgid "Editing a Group By Part" msgstr "Modification d'un élément Groupé par" #: C/glom.xml:543(para) msgid "" "The Vertical Group part may contain other items. For " "instance, it allows you to arrange fields below each other instead of just " "one after the other in the horizontal row. This is useful for grouping " "related fields such as address lines, or just to squeeze more information " "into the records's row on the report." msgstr "" "L'élément Groupe vertical peut contenir d'autres choses. " "Par exemple, il vous permet d'arranger les champs les uns en dessous des " "autres au lieu de l'un après les autres sur une même ligne. Ceci est utile " "pour regrouper des champs reliés tels que des lignes d'adresses ou juste " "pour condenser plus d'informations dans les lignes d'enregistrements sur le " "rapport." #: C/glom.xml:546(title) msgid "A Report with Vertical Groups" msgstr "Un rapport avec des Groupes verticaux" #: C/glom.xml:553(phrase) msgid "A Report with Vertical Groups." msgstr "Un rapport avec des Groupes verticaux." #: C/glom.xml:559(para) msgid "" "When you have finished, click the Close button to save " "the report's definition. Your report can then be chosen from the " "Reports menu. See the Printing Reports section for more details." msgstr "" "Quand vous avez terminé, cliquez sur le bouton Fermer " "pour enregistrer la définition du rapport. Votre rapport peut maintenant " "être choisi dans le menu Rapports. Voir la section Impression de rapports " "pour plus de détails." #: C/glom.xml:573(title) msgid "Dialogs" msgstr "Boîtes de dialogue" #: C/glom.xml:576(title) msgid "Dialog: Initial dialog" msgstr "Boîte de dialogue : boîte de dialogue initiale" #: C/glom.xml:577(para) msgid "" "This dialog allows the user to choose an existing document or create a new " "document. Existing documents may be selecting from the list of recently " "opened documents or by select a file with the file chooser dialog. Documents " "can also be opened via the network if other users are running Glom on the " "local network. Finally, a new document can be created either by opening a " "template file which already contains some initial tables and records, or by " "creating an empty document." msgstr "" "Cette boîte de dialogue permet à l'utilisateur de choisir un document " "existant ou de créer un nouveau document. Les documents existants peuvent " "être choisis dans la liste de documents récemment ouverts ou dans la boîte " "de dialogue de sélection de fichier. Les documents peuvent également être " "ouverts à travers le réseau si d'autres utilisateurs exécutent Glom sur le " "réseau local. Enfin un nouveau document peut être créé soit en ouvrant un " "fichier modèle qui contient déjà quelques tables initiales et des " "enregistrements ou en générant un document vide." #: C/glom.xml:581(title) msgid "Dialog: New database" msgstr "Boîte de dialogue : nouvelle base de données" #: C/glom.xml:586(title) msgid "Dialog: Create database" msgstr "Boîte de dialogue : création de base de données" #: C/glom.xml:591(title) msgid "Dialog: Connection" msgstr "Boîte de dialogue : connexion" #: C/glom.xml:592(para) msgid "" "This dialog requests a user name and password for connection to a database " "server. This is usually not the same username and password combination with " "which you log in to your system. All Glom systems require a database server " "on which the actual data will be stored. If the database server is not " "running on your local computer (\"localhost\"), then you must also provide " "its network hostname, such as \"glomserver.openismus.com\", though your " "hostname will be different." msgstr "" "Cette boîte de dialogue requiert un nom d'utilisateur et un mot de passe " "pour la connexion au serveur de base de données. Il ne s'agit normalement " "pas du même nom d'utilisateur et mot de passe avec lequel vous vous " "connectez à votre système. Tous les systèmes Glom nécessitent un serveur de " "base de données sur lequel les données réelles sont enregistrées. Si le " "serveur de base de données ne tourne pas sur l'ordinateur local " "(« localhost ») alors vous devez fournir un nom d'hôte réseau du type " "« glomserver.openismus.com » (votre nom d'hôte sera certainement différent)." #: C/glom.xml:593(para) msgid "Your system administrator can provide these database login details." msgstr "" "C'est l'administrateur système qui fournit les détails de la connexion à la " "base de données." #: C/glom.xml:594(para) msgid "" "If you are the system administrator, see Glom's Postgres Configuration web page for help with installing and " "configuring a database server." msgstr "" "Si vous êtes l'administrateur système, consultez la page Web Configuration Postgres [en anglais] de Glom pour " "obtenir de l'aide sur l'installation et la configuration d'un serveur de " "base de données." #: C/glom.xml:598(title) msgid "Dialog: Connection Error" msgstr "Boîte de dialogue : erreur de connexion" #: C/glom.xml:599(para) msgid "" "This dialog is shown when Glom could not connect to the specified database " "server. Either the database server is not running at the specified hostname, " "or the user name and password were not accepted by the database server. See " "the Connection Dialog section for " "more details." msgstr "" "Cette boîte de dialogue est affichée si Glom n'a pas pu se connecter au " "serveur de base de données spécifié. Soit le serveur de base de données ne " "tourne pas sur l'hôte spécifié soit le nom d'utilisateur et le mot de passe " "n'ont pas été acceptés par le serveur de base de données. Voir la section " "Boîte de dialogue de connexion " "pour plus de détails." #: C/glom.xml:605(title) msgid "Dialog: Database preferences" msgstr "Boîte de dialogue : préférences de base de données" #: C/glom.xml:610(title) msgid "Dialog: Change language" msgstr "Boîte de dialogue : changement de langue" #: C/glom.xml:615(title) msgid "Window: Textobject" msgstr "Fenêtre : objet texte" #: C/glom.xml:620(title) msgid "Window: Imageobject" msgstr "Fenêtre : objet image" #: C/glom.xml:625(title) msgid "Dialog: Notebook" msgstr "Boîte de dialogue : pagination" #: C/glom.xml:630(title) msgid "Dialog: Data invalid format" msgstr "Boîte de dialogue : format de données non valide" #: C/glom.xml:635(title) msgid "Dialog: Relationship overview" msgstr "Boîte de dialogue : aperçu des relations" #: C/glom.xml:640(title) msgid "Window: Groups" msgstr "Fenêtre : groupes" #: C/glom.xml:645(title) msgid "Dialog: Group by sort fields" msgstr "Boîte de dialogue : grouper par champs triés" #: C/glom.xml:650(title) msgid "Dialog: Group by secondary fields" msgstr "Boîte de dialogue : grouper par champs secondaires" #: C/glom.xml:655(title) msgid "Window: Button script" msgstr "Fenêtre : script de bouton" #: C/glom.xml:660(title) msgid "Window: Field calculation" msgstr "Fenêtre : calcul de champ" #: C/glom.xml:665(title) msgid "Dialog: New group" msgstr "Boîte de dialogue : nouveau groupe" #: C/glom.xml:670(title) msgid "Dialog: Choose user" msgstr "Boîte de dialogue : choix d'un utilisateur" #: C/glom.xml:675(title) msgid "Dialog: User" msgstr "Boîte de dialogue : utilisateur" #: C/glom.xml:680(title) msgid "Dialog: Translation identify original" msgstr "Boîte de dialogue : identification de l'original de traduction" #: C/glom.xml:685(title) msgid "Dialog: Translation copy" msgstr "Boîte de dialogue : copie de traduction" #: C/glom.xml:690(title) msgid "Dialog: Choose Date" msgstr "Boîte de dialogue : choix d'une date" #: C/glom.xml:695(title) msgid "Dialog: Import Into Table" msgstr "Boîte de dialogue : importation dans une table" #: C/glom.xml:696(para) msgid "" "This dialog allows the user to import a CSV (comma separated value) file " "into the current database table. It shows the first few rows of the file to " "import and allows the user to select the target field in the database for " "each column in the CSV file. For auto-incremented primary keys, the primary " "key field cannot be used as a target field, but otherwise one column must be " "imported into the primary key field." msgstr "" "Cette boîte de dialogue permet à l'utilisateur d'importer un fichier CSV " "(valeurs séparées par des virgules) dans la table de base de données " "actuelle. Elle montre les premières lignes du fichier à importer et permet à " "l'utilisateur de sélectionner le champ de base de données correspondant à " "chaque colonne du fichier CSV. Pour les clés primaires incrémentées " "automatiquement, le champ clé primaire ne peut pas être utilisé comme champ " "de destination, mais dans les autres cas, un champ clé primaire doit " "absolument correspondre à une colonne du fichier." #: C/glom.xml:719(title) msgid "About Glom" msgstr "À propos de Glom" #: C/glom.xml:720(para) msgid "" "Glom is maintained by Glom and GNOME community volunteers. To find more " "information about Glom, please visit the Glom Web site." msgstr "" "Glom est maintenu par des volontaires de la communauté Glom et GNOME. Pour " "obtenir plus d'informations à propos de Glom, visitez le site Web de Glom." #: C/glom.xml:725(para) msgid "" "To report a bug or make a suggestion regarding this application or this " "manual, you can submit them using bugzilla." msgstr "" "Pour signaler une anomalie ou émettre une suggestion concernant cette " "application ou ce manuel, vous pouvez les soumettre en utilisant bugzilla." #: C/glom.xml:731(para) msgid "" "Another excellent source of information are the Glom mailing lists." msgstr "" "Une autre excellente source d'informations est la liste de diffusion de Glom." #: C/glom.xml:736(para) msgid "" "This program is distributed under the terms of the GNU General Public " "license as published by the Free Software Foundation; either version 2 of " "the License, or (at your option) any later version. A copy of this license " "can be found at this link, or " "in the file COPYING included with the source code of this program." msgstr "" "Ce programme est distribué selon les termes de la Licence Publique Générale " "GNU, tels que publiés par la Free Software Foundation ; soit la version 2 de " "cette licence ou (à votre choix) toute version ultérieure. Vous trouverez " "une copie de cette licence en suivant ce lien ou dans le fichier COPYING fourni avec la source du code de " "ce programme." #: C/glom.xml:745(title) msgid "Concepts" msgstr "Concepts" #: C/glom.xml:748(simpara) msgid "" "Database: Each Glom document allows access to one " "database." msgstr "" "Base de données : chaque document Glom permet l'accès à " "une base de données." #: C/glom.xml:749(simpara) msgid "" "Table: Each database contains several tables, such as " "\"Customers\" and \"Invoices\" tables." msgstr "" "Table : chaque base de données contient plusieurs tables, " "telles que des tables « Clients » et « Factures »." #: C/glom.xml:750(simpara) msgid "" "Field: Each table has several fields, such as \"Customer " "ID\", \"First Name\", and \"Date of Birth\" fields. In other documents and " "applications, fields are sometimes called \"Columns\"" msgstr "" "Champ : chaque table possède plusieurs champs, tels que " "des champs « numéro de clients », « nom » et « date de naissance ». Dans " "d'autres documents et applications, les champs sont quelquefois appelés " "« colonnes »." #: C/glom.xml:751(simpara) msgid "" "Records: Each table contains several records, each of " "which has values for each of the fields. For instance, the \"Customers\" " "table will have a record for each customer. In other documents and " "applications, records are sometimes called Rows." msgstr "" "Enregistrements : chaque table contient plusieurs " "enregistrements, chacun d'eux possèdent des valeurs pour chacun des champs. " "Par exemple, la table « clients » possède un enregistrement pour chaque " "client. Dans d'autres documents et applications, les enregistrements sont " "quelquefois appelés Lignes." # jons = unions ??? #: C/glom.xml:752(simpara) msgid "" "Relationships: Each table might be related to other " "tables, via fields in both tables. For instance, a \"Customers\" table could " "have a relationship to the \"Invoices\" table, so that people could see all " "the invoices for that customer. Only developers need to understand this " "concept. In other documents and applications, relationships are sometimes " "called \"Joins\"." msgstr "" "Relations : chaque table peut être reliée à d'autres " "tables à travers des champs dans les deux tables. Par exemple, une table de " "« Clients » peut avoir un lien avec la table « Factures » afin de pouvoir " "afficher toutes les factures de ce client. Seuls les développeurs ont besoin " "de comprendre ce concept. Dans d'autres documents et applications, les " "relations sont quelquefois appelées « jointures »." #: C/glom.xml:746(para) msgid "" "Glom is easy to use, but you must understand the following basic concepts. " "" msgstr "" "Glom est simple d'utilisation mais vous devez comprendre les concepts de " "base suivants. " #: C/glom.xml:758(title) msgid "Calculated fields and button scripts" msgstr "Champs calculés et scripts de boutons" #: C/glom.xml:759(para) msgid "" "Calculated fields and button scripts use the Python programming language. " "The calculation or script is the implementation of a function whose " "signature is provided for you." msgstr "" "Les champs calculés et les scripts de boutons utilisent le langage de " "programmation Python. Le calcul ou le script est la réalisation d'une " "fonction dont la signature vous est fournie." #: C/glom.xml:762(title) msgid "Editing the definition of a calculated field" msgstr "Édition de la définition d'un champ calculé" #: C/glom.xml:769(phrase) msgid "Editing the definition of a calculated field." msgstr "Édition de la définition d'un champ calculé." #: C/glom.xml:776(title) msgid "Field values" msgstr "Valeurs de champ" #: C/glom.xml:777(programlisting) #, no-wrap msgid "record[\"name_first\"]" msgstr "record[\"prenom\"]" #: C/glom.xml:777(para) msgid "" "For instance, is the value of the name_first field in the " "current record." msgstr "" "Par exemple, est la valeur du champ prenom de " "l'enregistrement actuel." #: C/glom.xml:781(title) msgid "Related Records" msgstr "Enregistrements reliés" #: C/glom.xml:782(programlisting) #, no-wrap msgid "record.related[\"location\"]" msgstr "record.related[\"location\"]" #: C/glom.xml:782(para) msgid "" "For instance, provides the related records for the current " "record." msgstr "" "Par exemple, fournit les enregistrements reliés à " "l'enregistrement actuel." #: C/glom.xml:785(title) msgid "Single related records" msgstr "Enregistrements reliés unique" #: C/glom.xml:786(programlisting) #, no-wrap msgid "record.related[\"location\"][\"name\"]" msgstr "record.related[\"location\"][\"nom\"]" #: C/glom.xml:786(para) msgid "" "For relationships that specify a single record, you can get the value of a " "field in that record. For instance, is the value of the " "name field in the table indicated by the location relationship (often called " "location::name)." msgstr "" "Pour les relations qui spécifient un enregistrement unique, vous pouvez " "récupérer la valeur de ce champ dans cet enregistrement. Par exemple, " " est la valeur du champ nom dans la table indiquée par la " "relation location (souvent appelée location::name)." #: C/glom.xml:790(title) msgid "Multiple related records" msgstr "Enregistrements reliés multiples" #: C/glom.xml:791(programlisting) #, no-wrap msgid "record.related[\"invoice_lines\"].sum(\"total_price\")" msgstr "record.related[\"facture\"].sum(\"prix_total\")" #: C/glom.xml:791(para) msgid "" "For relationships that specify multiple records, you can use the aggregate " "functions (sum, count, average) to get overall values. For instance, " "." msgstr "" "Pour les relations qui spécifient des enregistrements multiples, vous pouvez " "utiliser les fonctions d'agrégation (sum, count, average) pour récupérer des " "valeurs globales. Par exemple : " #: C/glom.xml:797(title) msgid "Testing for empty values" msgstr "Test de valeurs vides" #: C/glom.xml:798(para) msgid "How you test for empty values depends on the type of field:" msgstr "La manière de tester les valeurs vides dépend du type de champ :" #: C/glom.xml:803(title) msgid "Non-text fields" msgstr "Champs non-texte" #: C/glom.xml:804(para) msgid "" "Non-text fields may be empty, indicating that the user has not entered any " "value in the field. For instance, Glom does not assume that an empty value " "in a numeric field should mean 0." msgstr "" "Les champs non-texte peuvent être vides, signifiant que l'utilisateur n'a " "saisi aucune valeur dans le champ. Par exemple, Glom ne suppose pas qu'une " "valeur vide dans un champ numérique signifie 0." #: C/glom.xml:805(para) msgid "" "You can test whether a field is empty by using Python's None. For instance:" msgstr "" "Vous pouvez tester si un champ est vide en utilisant le « None » de Python. " "Par exemple :" #: C/glom.xml:807(programlisting) #, no-wrap msgid "" "\n" " if(record[\"contact_id\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" "\n" " if(record[\"numero_identification\"] == None):\n" " return \"Aucun contact\"\n" " else:\n" " return record.related[\"contacts\"][\"nom_complet\"]\n" " " #: C/glom.xml:814(para) msgid "" "You might also test whether there are any related records. For instance:" msgstr "" "Vous pourriez également tester s'il existe des enregistrements reliés. Par " "exemple :" #: C/glom.xml:816(programlisting) #, no-wrap msgid "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"Aucun Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"nom_complet\"]\n" " " #: C/glom.xml:826(title) msgid "Text fields" msgstr "Champs texte" #: C/glom.xml:827(para) msgid "" "For text fields, you should check for zero-length strings. It is not " "possible in Glom to distinguish between zero-length strings and the absence " "of any string, because there is no advantage to doing so. For instance:" msgstr "" "Pour les champs texte, vous devez vérifier que les chaînes ne sont pas " "vides. Il n'est pas possible dans Glom de faire la distinction entre des " "chaînes vides et l'absence d'une chaîne parce que ce n'est pas avantageux de " "le faire. Par exemple :" #: C/glom.xml:829(programlisting) #, no-wrap msgid "" "\n" " if(record[\"name_full\"] == \"\"):\n" " return \"No Name\"\n" " else:\n" " return record[\"name_full\"]\n" " " msgstr "" "\n" " if(record[\"nom_complet\"] == \"\"):\n" " return \"Aucun nom\"\n" " else:\n" " return record[\"nom_complet\"]\n" " " #: C/glom.xml:841(title) msgid "Using the full pygda API" msgstr "Utilisation de l'API pygda complète" #: C/glom.xml:842(para) msgid "" "pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the " "current database directly. This allows you to run any SQL query, for " "instance to read data from the database with a SELECT, or to change values " "in the database with an UPDATE. Note that the connection is already open so " "you can avoid the difficult work of specifying the connection details." msgstr "" "Le module pygda est une API Python de l'API libgda. L'attribut " "connection d'un enregistrement fournit une gda.connection " "qui peut être utilisée pour accéder à la base de données actuelle de manière " "directe. Ceci vous permet d'exécuter n'importe quelle requête SQL, par " "exemple lire des données de la base de données avec SELECT ou modifier des " "valeurs dans la base de données avec un UPDATE. Notez que la connexion est " "déjà ouverte ce qui vous évite le travail difficile de spécification des " "détails de connexion." #: C/glom.xml:843(para) msgid "" "The record's table_name attribute also provides the name " "of the current table." msgstr "" "L'attribut table_name de l'enregistrement fournit " "également le nom de la table actuelle." #: C/glom.xml:844(para) msgid "" "This example reads all data from the current table and prints the values to " "the terminal:" msgstr "" "Cet exemple permet de lire toutes les données de la table actuelle et " "d'afficher les valeurs sur le terminal :" #: C/glom.xml:846(programlisting) #, no-wrap msgid "" "\n" "# Use the current database's connection \n" "# to get all the data for the current table.\n" "#\n" "# record.connection is an already-open gda.connection object,\n" "# saving us the bother of opening the connection,\n" "# or even knowing the name of the database.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "data_model = gda.gda_execute_select_command(record.connection, query)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Number of columns: \", columns\n" "\n" "for i in range(columns):\n" " print \" column \", i;\n" " print \" name=\", data_model.get_column_title(i)\n" "\n" " # Find out whether it's the primary key:\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (primary key)\"\n" "\n" " print \"\\n\";\n" " \n" "print \" Number of rows: \", rows\n" "\n" "for row_index in range(rows):\n" " print \" row \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" value=\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n\";\n" " " msgstr "" "\n" "# Utilise la connexion à la base de données actuelle \n" "# pour récupérer toutes les données de la table actuelle.\n" "#\n" "# record.connection est un objet gda.connection déjà ouvert,\n" "# nous évitant de nous occuper de l'ouverture de la connexion,\n" "# ou même de connaître le nom de la base de données.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "data_model = gda.gda_execute_select_command(record.connection, query)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Nombre de colonnes: \", columns\n" "\n" "for i in range(columns):\n" " print \" colonne \", i;\n" " print \" nom =\", data_model.get_column_title(i)\n" "\n" " # Recherche s'il s'agit de la clé primaire :\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (clé primaire)\"\n" "\n" " print \"\\n\";\n" " \n" "print \" Nombre de lignes : \", rows\n" "\n" "for row_index in range(rows):\n" " print \" ligne \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" valeur =\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n\";\n" " " #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/glom.xml:0(None) msgid "translator-credits" msgstr "" "Bruno Brouard , 2008\n" "Claude Paroz , 2008" glom-1.22.4/docs/user-guide/fr/glom.xml0000644000175000017500000014316112235000130021044 0ustar00murraycmurrayc00000000000000 ]>
Manuel d'utilisation de Glom v0.2 pour Glom v1.6 2004 Murray Cumming 2008Bruno Brouard (annoa.b@gmail.com)2008Claude Paroz (claude@2xlibre.net) Équipe de développement de Glom Permission vous est donnée de copier, distribuer et/ou modifier ce document selon les termes de la Licence GNU Free Documentation License, Version 1.1 ou ultérieure publiée par la Free Software Foundation sans section inaltérable, sans texte de première page de couverture ni texte de dernière page de couverture. Vous trouverez un exemplaire de cette licence en suivant ce lien ou dans le fichier COPYING-DOCS fourni avec le présent manuel. Ce manuel fait partie de la collection de manuels GNOME distribués selon les termes de la licence de documentation libre GNU. Si vous souhaitez distribuer ce manuel indépendamment de la collection, vous devez joindre un exemplaire de la licence au document, comme indiqué dans la section 6 de celle-ci. La plupart des noms utilisés par les entreprises pour distinguer leurs produits et services sont des marques déposées. Lorsque ces noms apparaissent dans la documentation GNOME et que les membres du projet de Documentation GNOME sont informés de l'existence de ces marques déposées, soit ces noms entiers, soit leur première lettre est en majuscule. LE PRÉSENT DOCUMENT ET SES VERSIONS MODIFIÉES SONT FOURNIS SELON LES TERMES DE LA LICENCE DE DOCUMENTATION LIBRE GNU SACHANT QUE : LE PRÉSENT DOCUMENT EST FOURNI « TEL QUEL », SANS AUCUNE GARANTIE, EXPRESSE OU IMPLICITE, Y COMPRIS, ET SANS LIMITATION, LES GARANTIES DE MARCHANDABILITÉ, D'ADÉQUATION À UN OBJECTIF PARTICULIER OU DE NON INFRACTION DU DOCUMENT OU DE SA VERSION MODIFIÉE. L'UTILISATEUR ASSUME TOUT RISQUE RELATIF À LA QUALITÉ, À LA PERTINENCE ET À LA PERFORMANCE DU DOCUMENT OU DE SA VERSION DE MISE À JOUR. SI LE DOCUMENT OU SA VERSION MODIFIÉE S'AVÉRAIT DÉFECTUEUSE, L'UTILISATEUR (ET NON LE RÉDACTEUR INITIAL, L'AUTEUR, NI TOUT AUTRE PARTICIPANT) ENDOSSERA LES COÛTS DE TOUTE INTERVENTION, RÉPARATION OU CORRECTION NÉCESSAIRE. CETTE DÉNÉGATION DE RESPONSABILITÉ CONSTITUE UNE PARTIE ESSENTIELLE DE CETTE LICENCE. AUCUNE UTILISATION DE CE DOCUMENT OU DE SA VERSION MODIFIÉE N'EST AUTORISÉE AUX TERMES DU PRÉSENT ACCORD, EXCEPTÉ SOUS CETTE DÉNÉGATION DE RESPONSABILITÉ ; EN AUCUNE CIRCONSTANCE ET SOUS AUCUNE INTERPRÉTATION DE LA LOI, QU'IL S'AGISSE D'UN DÉLIT CIVIL (Y COMPRIS LA NÉGLIGENCE), CONTRACTUEL OU AUTRE, L'AUTEUR, LE RÉDACTEUR INITIAL, TOUT PARTICIPANT OU TOUT DISTRIBUTEUR DE CE DOCUMENT OU DE SA VERSION MODIFIÉE, OU TOUT FOURNISSEUR DE L'UNE DE CES PARTIES NE POURRA ÊTRE TENU RESPONSABLE À L'ÉGARD DE QUICONQUE POUR TOUT DOMMAGE DIRECT, INDIRECT, PARTICULIER, OU ACCIDENTEL DE TOUT TYPE Y COMPRIS, SANS LIMITATION, LES DOMMAGES LIÉS À LA PERTE DE CLIENTÈLE, À UN ARRÊT DE TRAVAIL, À UNE DÉFAILLANCE OU UN MAUVAIS FONCTIONNEMENT INFORMATIQUE, OU À TOUT AUTRE DOMMAGE OU PERTE LIÉE À L'UTILISATION DU DOCUMENT ET DE SES VERSIONS MODIFIÉES, MÊME SI LADITE PARTIE A ÉTÉ INFORMÉE DE L'ÉVENTUALITÉ DE TELS DOMMAGES. Murray Cumming Équipe de développement de Glom
murrayc@murrayc.com
Glom 1.6 20 juin 2004 Murray Cumming Murray Cumming Ce manuel documente la version 1.6 de Glom Votre avis Pour signaler une anomalie ou émettre une suggestion concernant Glom ou ce manuel, faites une soumission d'anomalie à GNOME Bugzilla pour le produit Glom. Merci de faire une recherche sur bugzilla avant de soumettre votre anomalie pour s'assurer qu'elle n'a pas été déjà signalée. Manuel d'utilisation de Glom.
MY-GNOME-APP mygnomeapp Introduction Glom vous permet de concevoir et d'utiliser des systèmes de bases de données. Premiers pas Lancement de Glom Vous pouvez démarrer Glom comme ceci : Menu Applications Choisissez BureautiqueGlom. Démarrage de Glom Lorsque vous démarrez Glom, la fenêtre suivante s'affiche. Vous pouvez ouvrir un fichier Glom existant ou en créer un nouveau en se basant éventuellement sur l'un des modèles.
Fenêtre de démarrage de Glom, ouverture d'un fichier existant Affiche la fenêtre principale de Glom utilisée pour ouvrir un fichier Glom existant.
Fenêtre de démarrage de Glom, création d'un nouveau fichier Affiche la fenêtre principale de Glom utilisée pour créer un nouveau fichier Glom.
Utilisation de Glom en tant qu'opérateur Pour ouvrir un document Glom existant, ouvrez-le à partir du gestionnaire de fichiers ou choisissez Glom à partir du menu Applications, puis sélectionnez le document lorsqu'on vous le demande. Glom demande un nom d'utilisateur et un mot de passe pour accéder à la base de données. Votre administrateur vous fournira votre nom d'utilisateur et votre mot de passe. Quand vous ouvrez un document existant, Glom se place à un niveau opérateur. Ce niveau d'utilisateur permet de chercher et de modifier des enregistrements, mais pas de modifier la structure fondamentale de la base de données. Navigation Chaque base de données possède plusieurs tables. Pour examiner une autre table, choisissez Tables dans le menu Navigation. Puis cliquez deux fois sur la table ou sélectionnez-la et cliquez sur le bouton Ouvrir.
Navigation vers une table Navigation vers une table.
Affichage et saisie de données Lorsque vous êtes en mode données, vous pouvez afficher ou saisir des informations soit dans la vue Liste ou dans la vue Détails. La vue Liste La vue liste affiche plusieurs enregistrement à la fois et habituellement n'affiche que les champs les plus importants. Quand vous saisissez des données dans un champ, celles-ci sont enregistrées immédiatement dans la base de données dès que vous avez fini de le saisir. S'il s'agit d'un champ date ou heure, le format des données est automatiquement contrôlé. Pour créer un nouvel enregistrement, il suffit de cliquer sur le bouton Ajouter ou de commencer à taper dans un champ de la dernière ligne vide. Un nouvel enregistrement est alors créé avec des champs vides prêts à être remplis.
La vue Liste La vue Liste.
Pour trier les enregistrements, il suffit de cliquer sur l'en-tête d'une colonne. Par exemple, pour afficher des factures dans l'ordre chronologique vous pouvez cliquer sur la colonne « date », puis cliquer à nouveau pour les afficher dans l'ordre inverse.
La vue Détails La vue Détails n'affiche qu'un seul enregistrement et affiche en général tous les champs dans un ordre approprié. Quand vous saisissez des données dans un champ, celles-ci sont enregistrées immédiatement dans la base de données dès que vous avez fini de le saisir. S'il s'agit d'un champ date ou heure, le format des données est automatiquement contrôlé. Pour créer un nouvel enregistrement, il suffit de cliquer sur le bouton Ajouter. Un nouvel enregistrement est alors créé avec des champs vides prêts à être remplis.
La vue Détails La vue Détails.
Recherche de données Sélectionnez le mode Rechercher dans le menu Mode. Les champs dans les vues liste et détails sont maintenant vides et un bouton « Rechercher » apparaît en bas de la fenêtre. Saisissez une information ou une partie d'information dans un champ pour trouver les enregistrements qui contiennent cette information. Par exemple, saisissez Jim dans le champ nom pour trouver les enregistrements qui contiennent « Jim » ou « Jimmy » dans leur nom. Quand vous appuyez sur le bouton Rechercher, Glom recherche les enregistrements puis les affiche. Si un seul enregistrement est trouvé, celui-ci est alors affiché dans la vue détails. Si plusieurs enregistrements sont trouvés, ils sont affichés dans la vue liste. Impression de rapports Si le développeur de la base de données a défini des rapports pour une table, ils apparaissent dans le menu Rapports. Il suffit de choisir le rapport dans le menu pour générer le rapport. Si vous avez effectué une recherche précédemment, le rapport ne contient que les données actuellement trouvées, sinon toutes les données sont présentes. Souvenez-vous que chaque table possède son propre rapport, il peut donc être nécessaire de basculer vers la bonne table pour obtenir un rapport particulier.
Un rapport Un rapport.
Utilisation de Glom en tant que développeur Quand vous créez un nouveau document, Glom se place à un niveau développeur. Vous pouvez également basculer vers le niveau développeur après avoir ouvert un document existant, grâce au menu Niveau utilisateur. Glom ne le permet que si l'administrateur de la base de données l'autorise. Ajout de tables Vous pouvez voir la liste des tables existantes en choisissant Tables dans le menu Navigation. Cette fenêtre apparaît également après une connexion à un serveur de base de données et après avoir créé un nouveau document. Pour créer une nouvelle table, cliquez sur le bouton Ajouter et saisissez le nom de la nouvelle table. Glom suggère un titre convivial pour cette table. Les opérateurs voient ce titre plutôt que le nom réel de la table. Vous pouvez également marquer une table comme masquée pour les opérateurs. Par exemple, les opérateurs peuvent voir les « lignes de facture » comme des enregistrements reliés à la table « factures » mais ils ne doivent jamais être capables d'aller directement vers la table « lignes de facture ». Vous pouvez également spécifier une table comme table par défaut. Cette table sera affichée à chaque fois qu'un opérateur ouvre un document existant, sans lui demander de sélectionner une table dans la liste. Vous pouvez également utiliser cette fenêtre pour renommer une table existante. Cliquez sur le bouton Ouvrir pour afficher la table sélectionnée. Modification des champs Choisissez Champs dans le menu Développeur. Cela permet d'afficher la liste des champs de la table. Les nouvelles tables possèdent automatiquement un champ clé primaire mais vous pouvez modifier ce champ si nécessaire. Cliquez sur le bouton Ajouter pour ajouter un nouveau champ, puis saisissez le nom du nouveau champ. Glom propose un titre approprié et convivial pour ce champ, mais vous pouvez le modifier. Les opérateurs voient ce titre plutôt que le nom réel du champ. Pour fournir plus de détails sur un champ, sélectionnez-le et cliquez sur le bouton Détails.
Modification des champs Modification des champs d'une table.
Clés primaires Chaque table doit posséder une et une seule clé primaire. La valeur de ce champ est unique ce qui signifie que chaque valeur dans ce champ n'apparaît que dans un seul enregistrement de la table. Par exemple, chaque enregistrement dans une table « clients » possède un « numéro de client ». Cette valeur est utilisée pour faire référence à ce client dans les autres tables telles que les enregistrements « Projets » et « Factures ». Voir la section Création de relations pour apprendre comment relier des tables entre elles. Types de champs Glom propose quelques types de champs simples : Nombre Texte Date Heure Booléen - vrai ou faux Image Champs calculés Les valeurs de champs peuvent être calculées en fonction d'autres champs en utilisant le langage de programmation Python. Ce calcul doit être une implémentation d'une fonction Python qui doit renvoyer une valeur. La valeur renvoyée est utilisée comme valeur de champ. Cette valeur est recalculée à chaque fois qu'une des sources de champ change. À FAIRE : cela ne fonctionne pour l'instant que pour les valeurs par défaut et vous ne pouvez pas encore utiliser des valeurs de champ dans le calcul. Vous pouvez également utiliser des calculs pour spécifier une valeur par défaut pour les champs en sélectionnant l'onglet Valeur par défaut dans la fenêtre Détails des champs, en cliquant sur la case à cocher Valeur calculée puis en saisissant une formule Python. Vous pouvez tester ce calcul dans la fenêtre Édition.
Arrangement de dispositions Chaque table possède sa vue Liste et Détails et, par défaut, tous les champs de la table sont affichés par ordre de création. Vous pouvez modifier la disposition en choisissant Disposition dans le menu Développeur. Mise en page de la vue liste Dans la vue Liste, vous pouvez définir l'ordre des colonnes de champs et le masquage éventuel de certains champs.
Modification de l'agencement d'une liste Modification de l'agencement d'une liste.
Mise en page de la vue détails Dans la vue détails, il est possible de créer des groupes de champs et de leur donner des titres. Vous pouvez alors mettre des champs dans ces groupes et définir l'ordre d'apparition des champs dans ces groupes. Vous pouvez également définir l'ordre des groupes. Par exemple, dans la table « Contacts », vous pouvez créer un groupe « Nom » et mettre les champs « titre », « prénom » et « nom » dans ce groupe. Vous pouvez avoir d'autres groupes pour les champs « Adresse ».
Modification de l'agencement des détails Modification de l'agencement des détails.
Création de relations Les tables dans les bases de données sont souvent reliées entre elles. Par exemple, une table « Factures » peut avoir un champ « Numéro de client ». Une valeur dans ce champ se réfère à un enregistrement de la table « Clients » avec la même valeur. Glom peut afficher des informations supplémentaires telles que le nom du client à partir de cet enregistrement relié. Il peut également afficher une liste de plusieurs enregistrement liés. Par exemple, plusieurs « Lignes de factures » reliées à un enregistrement dans « Facture ». Pour créer des relations, choisissez Relations dans le menu Développeur. La liste des relations existantes s'affiche. Cliquez sur le bouton Ajouter pour créer une nouvelle relation et saisissez un nom pour celle-ci. Choisissez ensuite un champ dans la table actuelle et un champ d'une autre table auquel il sera relié. Cette relation effectue la recherche de tous les enregistrements de l'autre table pour lesquels les valeurs des deux champs sont égales. Vous pouvez utiliser une relation dans les situations suivantes. Pour afficher un champ lié dans les vues Liste ou Détails. Pour afficher une liste des enregistrements liés dans la vue Détails. Pour afficher la valeur d'un champ dans un enregistrement lié (par exemple, pour copier le prix actuel d'un « produit » dans le champ « prix » d'un enregistrement « ligne de facture »). Pour calculer une valeur de champ. Gestion des utilisateurs Pour définir les opérateurs qui peuvent utiliser votre base de données et pour indiquer leurs droits d'accès aux différentes tables, choisissez Utilisateurs dans le menu Développeur. Traductions L'interface utilisateur Glom (et ce document) est traduit dans plusieurs langues comme vous avez dû le voir si vous utilisez un ordinateur avec une interface utilisateur non anglaise. De plus, Glom affiche et comprend automatiquement les nombres et les dates en fonction des conventions actuelles de l'utilisateur local. Par exemple, un utilisateur aux U.S.A. peut saisir un prix comme 1.99 et une date comme 1/13/2008, mais un utilisateur allemand de la même base de données les verra comme 1,99 et 13.1.2008. Cependant, le système Glom que vous avez créé contient aussi du texte qui doit être traduit s'il est utilisé par des personnes qui parlent une autre langue. Par exemple, vous devez fournir des traductions pour les titres de vos tables, champs et rapports. Tous ces éléments textuels peuvent être listés si vous choisissez Traductions dans le menu Développeur. Dans cette fenêtre, vous pouvez indiquer la langue utilisée pour le texte original et saisir des traductions pour chaque élément de texte pour des langues supplémentaires. Quand le système Glom est ouvert par un utilisateur de cette langue, les éléments de texte sont affichés dans l'interface utilisateur.
Traductions Traductions.
Les traducteurs expérimentés sont probablement plus habitués au format de fichier .po, ou vous souhaitez peut-être utiliser les nombreux outils qui s'appliquent au format de fichier .po. En utilisant le bouton Exporter, vous pouvez créer un fichier .po pour l'exploiter dans un outil séparé ou pour l'expédier à un traducteur. Vous pouvez ensuite importer la traduction effectuée en utilisant le bouton Importer.
Définition de rapports Ajout et édition de rapports Glom peut produire des rapports pour afficher des champs spécifiques d'un ensemble d'enregistrements, triés et regroupés. Par exemple, un magasin peut avoir besoin d'un rapport listant tous les produits vendus en un mois, groupés par type de produits et triés par prix dans chaque groupe. Chaque table possède ses propres rapports accessibles par l'opérateur dans le menu Rapports. Pour définir un rapport ou modifier la définition d'un rapport existant, choisissez Rapports dans le menu Développeur.
Création et édition de rapports Création et édition de rapports.
Notez que chaque rapport possède un numéro d'identification (ID) ainsi qu'un nom convivial. Ceci permet à votre rapport d'avoir un titre traduit s'il est utilisé sur un ordinateur configuré dans une autre langue.
Édition d'un rapport Un rapport Glom possède trois zones : l'en-tête, qui apparaît au début du rapport ; la zone principale, dans laquelle les lignes enregistrements et résumé sont affichées avec les données actuelles de la base de données ; le pied de page, qui apparaît à la fin du rapport. À l'intérieur d'une zone, telle que la partie principale, vous pouvez ajouter des Éléments de rapport tels que des champs, textes ou images. Ceux-ci apparaissent habituellement par ligne à l'impression du rapport avec une ligne pour chaque enregistrement. Dans le cas le plus simple, cela ressemble beaucoup à la vue liste de Glom. Vous pouvez ajouter des éléments à votre rapport en les sélectionnant dans la liste Éléments disponibles puis en cliquant sur le bouton Ajouter. L'élément est alors ajouté à la liste Éléments dans la zone sélectionnée. Pour fournir des détails aux éléments, tels que le texte ou l'image à afficher ou pour choisir le champ à afficher, sélectionnez l'élément dans la liste Éléments puis cliquez sur le bouton Modifier. Vous pouvez également indiquer le format du champ en cliquant sur le bouton Format, tout comme vous le faites pour définir l'apparence dans la vue détails ou liste.
Édition d'un rapport Rédaction d'un rapport.
Certains éléments peuvent contenir d'autres éléments et posséder des propriétés supplémentaires pour contrôler la manière dont leurs sous-éléments sont présentés. Par exemple, l'élément Groupé par regroupe les enregistrements selon un champ. Par exemple, un rapport sur des produits peut regrouper la liste des produits par type de produit. Vous pouvez même ajouter un second sous-groupe à l'intérieur de l'élément principal Groupé par en sélectionnant votre élément Groupé par de premier niveau dans la liste Éléments pendant que vous ajoutez un nouvel élément Groupé par de la liste Éléments disponibles. Par exemple, vous pouvez regrouper vos produits par fabriquant à l'intérieur de chaque groupe de type de produit. Pour définir le champ par lequel les enregistrements doivent être regroupés, sélectionnez votre élément Groupé par dans la liste Éléments puis cliquez sur le bouton Modifier. Vous pouvez alors choisir le champ par lequel les enregistrements doivent être regroupés et sélectionner les champs par lesquels ces enregistrements doivent être triés dans le groupe. Vous pouvez également indiquer des champs supplémentaires à afficher sur la ligne de titre du groupe. Par exemple, vous pouvez regrouper les produits par numéro de fabricant mais également afficher le nom du fabricant.
Modification d'un élément Groupé par Rédaction d'un rapport.
L'élément Groupe vertical peut contenir d'autres choses. Par exemple, il vous permet d'arranger les champs les uns en dessous des autres au lieu de l'un après les autres sur une même ligne. Ceci est utile pour regrouper des champs reliés tels que des lignes d'adresses ou juste pour condenser plus d'informations dans les lignes d'enregistrements sur le rapport.
Un rapport avec des Groupes verticaux Un rapport avec des Groupes verticaux.
Quand vous avez terminé, cliquez sur le bouton Fermer pour enregistrer la définition du rapport. Votre rapport peut maintenant être choisi dans le menu Rapports. Voir la section Impression de rapports pour plus de détails.
Boîtes de dialogue Boîte de dialogue : boîte de dialogue initiale Cette boîte de dialogue permet à l'utilisateur de choisir un document existant ou de créer un nouveau document. Les documents existants peuvent être choisis dans la liste de documents récemment ouverts ou dans la boîte de dialogue de sélection de fichier. Les documents peuvent également être ouverts à travers le réseau si d'autres utilisateurs exécutent Glom sur le réseau local. Enfin un nouveau document peut être créé soit en ouvrant un fichier modèle qui contient déjà quelques tables initiales et des enregistrements ou en générant un document vide. Boîte de dialogue : nouvelle base de données Boîte de dialogue : création de base de données Boîte de dialogue : connexion Cette boîte de dialogue requiert un nom d'utilisateur et un mot de passe pour la connexion au serveur de base de données. Il ne s'agit normalement pas du même nom d'utilisateur et mot de passe avec lequel vous vous connectez à votre système. Tous les systèmes Glom nécessitent un serveur de base de données sur lequel les données réelles sont enregistrées. Si le serveur de base de données ne tourne pas sur l'ordinateur local (« localhost ») alors vous devez fournir un nom d'hôte réseau du type « glomserver.openismus.com » (votre nom d'hôte sera certainement différent). C'est l'administrateur système qui fournit les détails de la connexion à la base de données. Si vous êtes l'administrateur système, consultez la page Web Configuration Postgres [en anglais] de Glom pour obtenir de l'aide sur l'installation et la configuration d'un serveur de base de données. Boîte de dialogue : erreur de connexion Cette boîte de dialogue est affichée si Glom n'a pas pu se connecter au serveur de base de données spécifié. Soit le serveur de base de données ne tourne pas sur l'hôte spécifié soit le nom d'utilisateur et le mot de passe n'ont pas été acceptés par le serveur de base de données. Voir la section Boîte de dialogue de connexion pour plus de détails. Boîte de dialogue : préférences de base de données Boîte de dialogue : changement de langue Fenêtre : objet texte Fenêtre : objet image Boîte de dialogue : pagination Boîte de dialogue : format de données non valide Boîte de dialogue : aperçu des relations Fenêtre : groupes Boîte de dialogue : grouper par champs triés Boîte de dialogue : grouper par champs secondaires Fenêtre : script de bouton Fenêtre : calcul de champ Boîte de dialogue : nouveau groupe Boîte de dialogue : choix d'un utilisateur Boîte de dialogue : utilisateur Boîte de dialogue : identification de l'original de traduction Boîte de dialogue : copie de traduction Boîte de dialogue : choix d'une date Boîte de dialogue : importation dans une table Cette boîte de dialogue permet à l'utilisateur d'importer un fichier CSV (valeurs séparées par des virgules) dans la table de base de données actuelle. Elle montre les premières lignes du fichier à importer et permet à l'utilisateur de sélectionner le champ de base de données correspondant à chaque colonne du fichier CSV. Pour les clés primaires incrémentées automatiquement, le champ clé primaire ne peut pas être utilisé comme champ de destination, mais dans les autres cas, un champ clé primaire doit absolument correspondre à une colonne du fichier. À propos de Glom Glom est maintenu par des volontaires de la communauté Glom et GNOME. Pour obtenir plus d'informations à propos de Glom, visitez le site Web de Glom. Pour signaler une anomalie ou émettre une suggestion concernant cette application ou ce manuel, vous pouvez les soumettre en utilisant bugzilla. Une autre excellente source d'informations est la liste de diffusion de Glom. Ce programme est distribué selon les termes de la Licence Publique Générale GNU, tels que publiés par la Free Software Foundation ; soit la version 2 de cette licence ou (à votre choix) toute version ultérieure. Vous trouverez une copie de cette licence en suivant ce lien ou dans le fichier COPYING fourni avec la source du code de ce programme. Concepts Glom est simple d'utilisation mais vous devez comprendre les concepts de base suivants. Base de données : chaque document Glom permet l'accès à une base de données. Table : chaque base de données contient plusieurs tables, telles que des tables « Clients » et « Factures ». Champ : chaque table possède plusieurs champs, tels que des champs « numéro de clients », « nom » et « date de naissance ». Dans d'autres documents et applications, les champs sont quelquefois appelés « colonnes ». Enregistrements : chaque table contient plusieurs enregistrements, chacun d'eux possèdent des valeurs pour chacun des champs. Par exemple, la table « clients » possède un enregistrement pour chaque client. Dans d'autres documents et applications, les enregistrements sont quelquefois appelés Lignes. Relations : chaque table peut être reliée à d'autres tables à travers des champs dans les deux tables. Par exemple, une table de « Clients » peut avoir un lien avec la table « Factures » afin de pouvoir afficher toutes les factures de ce client. Seuls les développeurs ont besoin de comprendre ce concept. Dans d'autres documents et applications, les relations sont quelquefois appelées « jointures ». Champs calculés et scripts de boutons Les champs calculés et les scripts de boutons utilisent le langage de programmation Python. Le calcul ou le script est la réalisation d'une fonction dont la signature vous est fournie.
Édition de la définition d'un champ calculé Édition de la définition d'un champ calculé.
Valeurs de champ Par exemple, record["prenom"] est la valeur du champ prenom de l'enregistrement actuel. Enregistrements reliés Par exemple, record.related["location"] fournit les enregistrements reliés à l'enregistrement actuel. Enregistrements reliés unique Pour les relations qui spécifient un enregistrement unique, vous pouvez récupérer la valeur de ce champ dans cet enregistrement. Par exemple, record.related["location"]["nom"] est la valeur du champ nom dans la table indiquée par la relation location (souvent appelée location::name). Enregistrements reliés multiples Pour les relations qui spécifient des enregistrements multiples, vous pouvez utiliser les fonctions d'agrégation (sum, count, average) pour récupérer des valeurs globales. Par exemple : record.related["facture"].sum("prix_total") Test de valeurs vides La manière de tester les valeurs vides dépend du type de champ : Champs non-texte Les champs non-texte peuvent être vides, signifiant que l'utilisateur n'a saisi aucune valeur dans le champ. Par exemple, Glom ne suppose pas qu'une valeur vide dans un champ numérique signifie 0. Vous pouvez tester si un champ est vide en utilisant le « None » de Python. Par exemple : if(record["numero_identification"] == None): return "Aucun contact" else: return record.related["contacts"]["nom_complet"] Vous pourriez également tester s'il existe des enregistrements reliés. Par exemple : if(record.related["contacts"] == None): return "Aucun Contact" else: return record.related["contacts"]["nom_complet"] Champs texte Pour les champs texte, vous devez vérifier que les chaînes ne sont pas vides. Il n'est pas possible dans Glom de faire la distinction entre des chaînes vides et l'absence d'une chaîne parce que ce n'est pas avantageux de le faire. Par exemple : if(record["nom_complet"] == ""): return "Aucun nom" else: return record["nom_complet"] Utilisation de l'API pygda complète Le module pygda est une API Python de l'API libgda. L'attribut connection d'un enregistrement fournit une gda.connection qui peut être utilisée pour accéder à la base de données actuelle de manière directe. Ceci vous permet d'exécuter n'importe quelle requête SQL, par exemple lire des données de la base de données avec SELECT ou modifier des valeurs dans la base de données avec un UPDATE. Notez que la connexion est déjà ouverte ce qui vous évite le travail difficile de spécification des détails de connexion. L'attribut table_name de l'enregistrement fournit également le nom de la table actuelle. Cet exemple permet de lire toutes les données de la table actuelle et d'afficher les valeurs sur le terminal : # Utilise la connexion à la base de données actuelle # pour récupérer toutes les données de la table actuelle. # # record.connection est un objet gda.connection déjà ouvert, # nous évitant de nous occuper de l'ouverture de la connexion, # ou même de connaître le nom de la base de données. query = "SELECT * FROM %s" % record.table_name data_model = gda.gda_execute_select_command(record.connection, query) rows = data_model.get_n_rows() columns = data_model.get_n_columns() print " Nombre de colonnes: ", columns for i in range(columns): print " colonne ", i; print " nom =", data_model.get_column_title(i) # Recherche s'il s'agit de la clé primaire : field = data_model.describe_column(i) if field.get_primary_key(): print " (clé primaire)" print "\n"; print " Nombre de lignes : ", rows for row_index in range(rows): print " ligne ", row_index; for col_index in range(columns): print " valeur =", data_model.get_value_at(col_index, row_index).get() print "\n";
glom-1.22.4/docs/user-guide/fr/figures/0000755000175000017500000000000012235000130021022 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/fr/figures/glom_data_list.png0000644000175000017500000014362312235000130024523 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¤ð€×¸ˆsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ 9vª#I IDATxÚìÝu|ÇßðÏ]ìâî$!,×â^(-5 ‚µh¡Ð-N…¶O¡Jë¯Ð–´8‚;’qñËé>wÉY ø¼yí‹»ÙÙ™Ù½Ýûfv÷D¨"ÑãDxØ$Q""""""¦, ÕB™DDDDDDTÿƒÏJ§¢jæ™ñšˆˆˆˆˆˆ­`T0„š˜Šª˜G¤5•Ï'bPJDDDDDôH£‚€T¨J`jöå·',Qs=>öoYíý£¡j=Á¨¡ÀÔ`Pji*<õµÄ³^݃[ƒˆˆˆˆˆè1bØ©°$3ÿmzËUOª6ðùÀTd((µ4ŒNŸ: šSÌ­ADDDDD¥ì¼b(UU»hÔÒB wg»zYî„áÝt€»ÿmzË·\ð©=©JãȲ÷Ð ` ¥–¦‚Ñä¬"î}DDDDDôX£9ùE¸~ö`•–íÔjµP!x¬åfäJÝú €Ôÿ6½ÕH+Õž”Z¯E¥ÿ› J ^²+ñlvoIAàHDDDDD¥œ|)²r uþúƒf®•Z>:ñ.þû;šwèps²­—åjň¥©RkR°(ý_;Õ”êé{?pÂõó/¿Žb™Bo%cbn!;¯j3cU (Ñ¥S;îÍDDDDDT¯¤çâìÑ=è5p$|ܪTÆ•ØTD?„N½ž‚wiõ­\HÍ*À™ý¿`ÿ–ÕOh¢òr“¢tÒ=-»Ä·Bpjì¡F048jaa W³T’Ÿ ´Õœýá§{wegT¢ŸêZ¿q;Õ}¢Ò!<7¨ÔU j¼ÜUZVY\TßÊ-Ç¥4è”iMÄÐôÔ~ø‘É{HERýkïÓÒC{µ‡¾üJ¥Rw––¸qŒH‰ˆLQ(•¸“‚Ìì»–È6ÖV°·³E»VÍŽžÆŸï? ùö/ЫKm\.GTÌdçæA¥`ei‰5º¶oUëë.ßOÌê·GOë~‹`ce7Wg4nØ6ÖÖµR¿º¼‰ˆgbÑý0I­ª]VYŒ¥¯ÜÝ#Ì*ghÿî•*W»ìòËš_¾\=©¼4- Õ HµQíI; Õ¼6øP#PÖ,ý矻4³üüüakk[!äU«U°±¶6\ŠKJƒQ½š¢Kh{x¹Þ{@AnA 3ò±á÷KhÖ¬Âruõø*—ˇICÛ Mˆ7$Ö(*Q 3·K¾=†ÎíÂjýôõÛ¡cg4Ab•Jœ‚\‰MÇ/‡n $¤q¥õa;=îDÚ^5Õ"‘HS†¡r7Îa´ŒYëÿªPSåþ{脦ÜYëÿÂ~ÝŒÎ×Wn9®ZÁ¨Ui0Z¶â²§ì å^—Ja2 5bĈQ¨ÕÔjò òqûöm‚ ÈÊÊâ%»DDÆ‚7…ÑÑ1xÿõ~pq”à‹ßÏáÌõˆ  E°'Fõjað¸|ož€ø¤4¤¤e@&“ÁÆÚ~>^ ðÕÖ?hŒ„¤”Èä°³• qpòò –‘ ¹B{{[4mÔÎNÕjÓõ›w0kt;´oæ‹5?ÇÅ›©òuÅsZB"‘hÚRz%¦¤!öV¬­-ááæ‚Æ aiia²~¦ÎKe£ª¶6–xê‰&˜8¤5ü<±nÛi´oª©wß5Ë”Ÿ—›W€¸;‰(**†ÀÅÙ~>psuFß5ëèÛ£3áþòÍ›#!)Ò’ØÙÚ¢iã ¸8;iê”’†äÔt”Èä°¶¶‚¿¯ýý4—i[¯9éDDt_ÍV¿Üòù+SîÆù#0ký_zƒ_cå–ãRŒZ—Æ”Ú#£åŸ¾[”Š g”Ô²\*‚9#¤Ôj5þüë‚‚Z€—·l$dgßŵ7——µZ wwØÙڢĥ;¬%öÜ£‰ˆô¸Ÿˆçú·„»¾þã<¢“‹Ð¡}k@òò ðñŽóhݲ©Þã²ZPãêõôk뇅ϵ»³rò¥Ø{:/ÞD«Ð&8§ùûü·³xsì@¸;Û"9³›ÿ½‚Þ­¼Ð·}'8ÛÛ !=_ÿyjpvªúq;7/­{b“ràâì lðÅ—Ñ*ô^[Â#ÎV¹^I)éhé/ÁGÓž… È-”áìüïà 4oÖÔôÉÜŒ¿”öîÞ %2vŸ¸Ž‰CZ#¤ ‹pøøËm{wï¤Ó–‘oÿ‚6aÍ¡’æ`ÉÄ®hèë€ëw²ðωXdßpåÚMƒ—oØysFõƒ·›R2 ðõ_p€“£#®GÅ {Ko,xf<]ìp· {NÆâÈå›hÙ¢ òò Œ®W$MwuaPJD¤M+¾«Rhd.·,`ÔLêËoªÜ½»bÖú¿4Ë—Dg­ÿ {w5Zn9N¥Á¨•V0ZöS0e5*{¯¸tÒ”šz¨‘þÔ 9ž|rT*”*Ô*%Ž;Ž„;ñpv´ƒ­µ%d²(¤EÈ“!ëö/pi9vŽîÜ«‰ˆÊÉÊÉEçÐ''#“ЬY³{áW¯ß„GœE¯n+,Ÿ˜Šþíü1þÉVØ…íû#1þÉVÿd+‚€óqi:ùC¸aî§ûì%/÷ÄÒWzbïé8Ìüè?ͼÙÏt¼Ï¡“Ëjž8§ó^_½,-¬P(•ÁÕÑæÆÙ)¸q'ç¢s‘”œ?ïjÕK¥RÁËÃ3?þéÙÅèÕ.³žî ±;Âo™ìss~Ö,<â,$Ö–xê‰ÀÍÄl8:Ø#/¿°´Œ²>T,ëÆÍ8|½`Üœl±ö§ã¸—ŽæžxnP+|øó£ë mè‰7?;€6½ð΄î˜9¦#æl8?oOôl僗ŸjƒCçïà«]ç0¦O LÒ*µWÒ”’ft½…EEFÓËFb‰ˆèžy©¶þ=uŸ-pðØiƒùÍ)·Ï.:A©v0Ú¿g½u0r©=tGFË~¦üSwµt$ÒWÑ€T®Pé¯ÔP(ؽç¨Õjj5Ü==” KK1” %Äb1Äb1Tj5JJ¤XY +5>îÕDDå(J8ÛÛòŠd ‚\¡Â©³uîi,IÓ–š–‰'_¼÷ ¹?E£iHcüq4#{6Ó]ãïûtòoÛ{M›†àµ(ͼíû"Ñ´YÎ]¹ðuwDII‰Þó@ù:•Õ«k¹Ÿ÷jÜ(Ÿür¯mƒ†¾.èס!úuh•J/vÇí”ÌjÕËÞÎ[þ½…B APãÐù;˜õtgtjá‡/w]0Ùç†ÎqeÊ·Q¡Tã‡Ý—ØÀW¯Gkµ"½e©T*ØÚXA¡T#+¯jµÑIw±æ§„…6Å©³ ®{ûþ«hÚ¸1Îܸ·o7Èd2$§f`áóm;^ƒL¡Â_Ç£ñÜ€–xê‰&ø÷ô>“ë={á²ÑtSýBDô¸Ñ¾'³¨D^í²Ê޳¦Ê5¶®òi•)לòô•«' ÕFËѲËx­JcͲ€Tûé»FGHͺdW¥J‰þýûC¥RB©RB©TâÚhDߺ{»{—x)•J( B¡Ã½ek>´ˆH+++Ü-(‡‹\m!—ËaemÎÛbäÛ¿TŽt+¹æG«s e±“ ·°àîl¹\÷$“W$ƒ•µ5Tªû?–[X++kÍ_AËó^™cvù¼ŽŽÈËðÎWá°—ˆÑ¡™/&n ;kLÜ ¯¾·§ÊõÊË/€X‘å¯ô@°Ÿ+$Ö–šK”íl T)+]ßòÊ‚kK <Ùµ1&o‡ÉÃÛcõæf•ÕÀÏÛö]ÅÄÁ­ññìAP«ÜJ¹‹-ÿ]En^¾ÑugçIѸ‰¦/ÊÚ-WÈáî|ïaW_½5Tg/W;Èd ø]¯©z999òID¤}޶k^«Ô÷ŽËgÏ_6kÙNÚ,Ä÷Ê‹EP”Ûõ•«Mß¼òi•)÷ìùËz˜TvOiY] •[ŽMYhXŒJô£Ú©z.×Õ– < ¤¸÷ô\µZ •Z µJ µZAàâìg''‚€œœJ¡VÊace ‚Y—H=n\]q22 Ã{4EÿŽ ñßÙÂÊÊÒä²–VÖÈ-ÂÝÙ.6(*–ÂÙ^RØÃÚÚ2™ÜäñÝÜy:´©0RÛ©C½ySRÒàçë ‰Ä‘‰yxë‹øbþS°•XA­TU¹±·âñÍÛCàêh‹Õ?Ã…˜4XˆDعúic¿™fÖ9®|»dJ9öŸ‰ÁäáíÒÀ…ERMºX|/ –J¥pw¶Õ ½-[Àbà„%%Ï¿ü:Òs+µ±2oìƒÒ!‚ÈÏÏGNv6 áèèÇÃáÐ’{5‘¡ŒZ@FF&îæåA&“CXˆÅ°¶¶‚­­-‚.\º hß¶Uið" 559¹¹P(”°²²„»»|½=5‡ùòËTf^UÅÝŠ‡´¤J…êÒ?N:;9ÀßÏ–––ÕªWAA!“S “Éaee ooO$&¦èä)¿Œ9m+Ë£ÍÂB {4ð÷ͽÛf ‹” ™Lk+køx{!>1I§üüü¤ed¢¸H ˆ[[ øùÂÞÞÎìúé›—•ƒÌ¬l””È ‹á`oO8•þF«©õšJ'"¢ûœí%Ø»û7Œ{öEÄ&gW© [Ýÿ'ž:yE%õ²\àÞþÎìÿû·¬þ€ €@!€|wK§œÒ)@AizIi~íß&÷VöD¶þíp7..lml ‘ØÀÆÖ Á"÷æpö æCˆˆŒ^Þžðòö4z\nÛ&¬ÂqÚÇ×>¾Þåò£ìx¯wsçUUpp ÉsLUëeï`æÍšè”éîæf´lsÚV–ÇT½íìí*¬ßÕÍE'ƒ£BÌn»¹}áææ 77WƒåšZ¯©t""Ò:5—Ž8¦åVùg_2r 4e©ËÝëY_ÊÕÿ­Eg€³üý¢b­|Úÿë¨ÒC ¤î°n9 E¹éÈÊMƒn°òs€Ÿ›?lÜ ¶´â½)DDDDDTo”(T8t,öïþ š?g‡J-Ÿ›Wˆ¤¨“8t,J*MIרºjt„”ˆˆˆˆˆèQS$•ÁÍÙÃF=[¥åe %Ф²z_®‘ØRTÕ¾e@JDDDDDdBvnác_®ö| £&/Ñ5+ m?öã^GDDDDDD:±âþ,ÏàéŸï?‹œì,)%"""""z\•Œ&'%â›MGj´l1»—ˆˆˆˆˆˆ¤DDDDDDôPX𓉗ì=ž <̨Fp„”ˆˆˆˆˆˆ ¤DDDDDDôPÔ™Kv½¼}‘žöHtj]m‹©z=JÛ€ßÏû˜´>°} bGp¿%"¢:ªÖGH½¼}êT9ãdNDçgÆP[x\ÐOD^¹Œ;·ãj´\O/ov.QUc#¤Þ>¾楧¥"=-ÕìVcù*SNMÒ×®²ú˜Óíz{ûøš\®:uªL½ª³­D_ÛÛÛ£}ûöX»f5š6mZg?@5µMÍYOÓ¦Mq4üˆÎMå‚  g¯Þˆ‰‰©v=j{Û{ûø¢oß>øyûö 7Æk÷ãÃú¬×ƾP¾-úŽ õaÿ«ª#ïÿl¶¥¥%$¶¶pssG@P¬¬¬+䉆£“Zµi ¥B‰¢¢Â v'ÆöÊî7|°!=ô€Ô\uù‹Ñ£Ô.íúÔõ/¤Um[~~>¾ûî{¼>}:8ÀO*;[[ìß¿ƒÝ¿üð¿ÿöÂÞή޴ÁÅÅßÿð&½ú*7ècbÜ J¥ùùy¸‹ógN£}§Î°¶¶ÑÉÒ¤¡P(P\TÄÎ#""z Ôú%»Ú£^ …ËÞ}-B[¢i³føò˯tòþôÓftèØ ÑÀDF^Ó[ŽJ¥Âš5kÚ2 A ƒ1uÚk(,,ÔÉûõכЮ]{øøúÕjûär9æÌy ƒ!¬Uk|þÅzÛ¯ý¿±ÎêˆÇ„‰/¡Qãáù^@VV–NžÏ>ÿ-ÃZ¡ap#¼ñÆ\Èår½e™êデ¡Wï>hˆ;aÛ¶m5Ú'''̘1ÑÑ7ÍnŸ·¯Ñö™J—Éd˜÷æ|„4iŠ&MñæüùÉd÷+CÛ´¶úfÆÌØøÙg:ó6~öfΚ©3ÏT;Lí³¦¶}u¼ÿÞ{øþ»ïkô˜‘››‹¡-‘›—§“–››‹–a­›—g²žæì/ÆŽW椙ú|*ÏÜýÅX ­Óœã£±úÔÆñ3#= 9ÙYP)•n‚À `$%$ÂÂÂÀ½¸[±±ˆ8Ž=ý³§OA¥TB©T âè(”Jò”J"Ž…C¡Tê,{ôðA\‹¼ U¹üeÔj5¢o\ÇñðÃ8~ÑQסV«5éGîGBüD ÇÑ#‡}ýÁütSuÑ1Ö7ïÈÁýHJHÀÉãGõæ­ •ù¼›:†ÕZ@*‚ÉÉP>íù®_è¨h<°gΜAJJŠN¾ˆøûï¿uC† Á›óçë-çÿ>ý—¯\Æýûyõ $ V­Z­“÷ü…óØ¿RS’ͪeÛU6­{ï}degãì™Ó8tðŽ;®³LÙë´Ô@Zj ÒRSªU'Cõ?a"¦N™Œk‘Wyõ 7nŒeËÞÕÉ{òä)9|gÏœFFf&Þ{ÿý*õñÌ™³°`Á|ÄÅÆàÏ?váÜùó5Ú–¼¼¿7Jºqãg˜>}:Äbݱ©v˜ÚgÍù|UG·nÝн{w|¸~½Ñ|S¦LÆ?þeé“R©Äæ-[0mÚT³êiÎþRÛ_ªÒ†šØ~5yüÔÇÊÚ …Ö6÷.ÙMMIAë¶íáèä„üü<øù7@jr2РAÄÆDC"±ÕG)ÉÉiÚ%R)R’“ .[q¤6­Ûu€ÄÖ…ù Frr5yÚuè{GG ¨a0’aïà`Vº±v˜«mûް·w@NvV­œ»ÊŸ›+»¿˜{!""2WÞCZö{C222h0ÝÅÅEóÚÖÖVóE´ÂzÒÒнGOyå’âããý@Ú•‘™‰ÀÀÍ{cí«mgÏžÃêÕ«q52ÅÅÅzûE»®ÈÌ̬RÿÝ·øø“Oðáúõprrª•+1hÐÀékA¹óÞÄÕÈHÔXûŒ¥gff!((Pg[f–»äÙœýª¶úž7ëׄ]»þÀõ7ðÓO?VÈcª¦öYs>_Õµð·1tØpôïß]:wÖ›'$$Íš5ÃîÝ{0räüóÏntêÔþþþfÕÓœý¥.0¶¿T¥ 5±ýjòø©B.‡¥••æ)r™ á‡*Þ+n#‘ÀÖÎövöÈÉ΂ÄÖ™prq†›»;îæd]ùº—|Ëå ¸¹»ánÎ]¨ÕjØØH +)D"AAA>ÀÞÁÙYYP«Õ°¶±)M·EaAÉôÊÔÅÛÒ6j_J\Óç.í ´²û‹¹ç""¢ H«û”\ÍeI^^ˆG£FÌ^^ß*½¼¼°ûŸ¿áããc2oM0V–§§'âܰ! >!Áh]jcÈ»¬Ì)S§bùòwÑ·O_8:: °°M›5×Y§v]áááQ¥>nÓ¦ ~úñG‚€C‡cÞ›oâòÀ‹5Ö–   |þÙF òzöè‡iŸ±tOÝmww“Û¯ü¼Úì+++Lšô*fÍž·ß~ VVV:—Õ™ÓSû¬9Ÿ¯ên_KKKlÜð)&O™Š=»ÿ1ø9™:e2Ö¯ÿ#F Ç7ß~ƒ÷Ö­3»ž¦öKKKÃÖöÞÈÛÝ»w¶ÓœüæÃÌý,™³Ï—_§©~©j;jòš’’ W7w¨Õ*‚kk 2¶zÐ%|ýýq3: º>ä¤x„¶j…\¥RirYí×ÖVVK¡T*Ri1¬­¬ ¶°Ðä-*,ÔJ—ÂÊÚf¦›ª‹H$‚ªô¾WP*zëªR)kýÜUÕó©©c,Qe‰äÊÆ{‹/Ajj*òóó±ìÝåU*gâÄ ˜¿`î܉‡R©ÄQxíµ×JŽ= Ëß]ŽììldeeaÙ²eó:99!..®ÖêRRRH$6HHHÀ‚oUÈSV×ììl¼ûî»3ft•úøõ×§ãæÍ›P–~¹24š]¾¾¾èܹvíú£ÆÚg,}ÄÈX¶l²²²••…%K—a䨑Fë¨o›ÖvßÌš9‰ ñ˜9c†ÞtSí0µÏ>¨ÏWÓ¦M1qâ,^²Ä`žÞ½{£ °ßÿðìíìfv=Mí/¡¡¡øò˯ •J‘––†·Þ~Ûh}Må¯êçÛØþbª úÖiª_*ÛV©PXX€¸˜›HOIFhXd²{Äñõ÷ÇÙÓ'‘©)Ɉ‹‰Ááû4#|®nîPÈåHOM……ؾ¾~šŸ„1µ¬6oo\8wæÞ½¬r9boÞ„—¯Ô*•&Ï¥ ç îÝëz+ö&¼}ü 23ÝT]ìu‚Z ¹L†›7£ú—€Ê~ÞÍ=‡ÕÉ€ôÍyo¢6<º| IDATi“&è×:w銥—ÞUå yçÎñ̸qhÔ¸1¦Ï˜!O ©µzûúùW˜Ê¼ýÖ[pvqFÇNÑ·_t{¢›Ár¦¿þ:žÈÏפW_EF†ñKþ¦L™Œ¥K—aúô×+UOSûËGë?Ä¿ÿý‡¦Íšcøˆ‘èѽ‡Ñz˜Ê_ÕÏ·±ýÅTô­ÓT¿T¶ÝÕµcû=|'#ŽáfÔuXZY¢w¿pwó@aée²AprvÁå‹qô¢nDÂÛÛ..®÷à àÊ¥ hÜ´)µEéè¢9Ë– n+k+œ:qgNŸ„D"A›v -‘ÞZ=½pæä œ>yVVÖhÓ®JÌL7U—¦Í›#)!ÇÁÅ çàîæŽ‡­²ŸwsÏ!DDDæ•Ne¯Å,fM­dÃç_jª ý“Du•Ÿ¤$'U9ˆjžv°\6,“ÉPTXPá>IGØÙÛÃB,†R¥DaA¤ÒûÁ =œ]\“Uá¼dlY_?¤¦$ß;щDprvÑ\²,•J‘Ÿ— ApìÈ!Œ{a òó`ïà‘H„©yf¦›S+++8»¸ÂÊÊ ªÒQcggMý´ëZߎ±DDôè²)}arR"¾Ù´ ¿øj7)€"ùî–NÙZ¯óKÓ¥¥ù•TÔ †jäçß@ïüú~â2Ô®‡Ý>}õb_?Ú¶¹øe‘ûg]qìÈ!³òõìÓOóº°°……󡸸Hoš±eµAêƒä¤D£ûª©t"z¼£½û=ç™JܱDDDU!f™Dsô‘ˆˆ¨fq„”ˆˆˆˆˆˆ ŽÑCaÖéÛqì)"""""¢ÇP‹Ð°‡ÖfˆˆˆˆˆˆèñÄKv‰ˆˆˆˆˆˆ)1 %""""""b@JDDDDDD H‰ˆˆˆˆˆˆR"""""""¤DDDDDDÄ€”ˆˆˆˆˆˆˆ)1 %""""""¤DDDDDDD H‰ˆˆˆˆˆˆ)R"""“Ü=<áîáið}]«R""¢’žžŽ _BPÃ`xzy£qHôéÓ·^±e“¯Ú´m‡™³f!--•ˆˆˆ)Õ³fÏÆž={ðõW_"))¿ÿö+ƒ‚êEݳ³2‘•‰[q±xå•—ñóÏÿë“&ÕÊ:ˆˆˆˆ)Õ°ãÇŽÚ¶m kk´iÓ›úQ'OÙHäæ-[оCøúù£g¯^Ø·?V­^ƒ–a­àãë‡>}úâìÙ³:Ë~õÕ×p÷ð„§—7Z„¶ÄܹóPPPP£m°³³Ã”É“—.^ªPo}m)qâž< áß O?3‡6˜¿ìýÏ?ÿ:w·/ºuMAðÅ_¢cÇNðñõCë6mñé† ÁìõšJ'""b@JDDõž‹«+ g¯Þ˜1s6oÙbð²×Ë—.ãØÑ£øá‡ïqýú <ÿü ¸›“ƒ3§OáÇÀÕÈHLŸ1Sg©TŠÇ‘”˜€%‹có–-X¸hQ¶¡¸¸ß}ÿ= C‡:i"‘Èè²S§Nùsçðͦ¯ƒyóæâ›o¾1¹Î“§NâÈáCøîÛo9sÞФ}öùçXºlºtíŠÛ·âðâ‹/`åÊUøâË/Í^oUëEDDTÛD¥SÙk1‹YÓ_+Ùðù—ÈÉÎb‘ÙŽ=Š%K—âÚµëšyVVVøhýz¼øâ  !ŒŽŽ‚‡»; ||ýQ7®ÃÓÓjµž^Þ‰DÈÊÌл.•J/o¸»»áft´NÙe—Å–¯¡‡ ÙX[cÏžÝhÛ¶­&Ÿ……2ÒÓ*,[V~PÃ`(ärüûï4oÑ6ÖÖz×U¾~‘W¯À××WÓÚín×¾=qîì#//‡ ((Ο7k½¦Ò‰ˆˆÌ‘œ”ˆo6mÂÆ/¾Ú @@  @>€»¥S¶ÖëüÒtii~%5à)Õ ^½záhx8®\¾„>ZWWW( ¬\µªB^wwMÀZÆÓó^€&ß;=i_–zòÔ) 6A ƒááé/o@NÎÝ©{Ùý)ÉIX»f dr9ÞYX¹Ñ×E B$£_ÿDÿnr9___¾ÐnwJJ* c§Îp÷ðD£Æ!€ÄÄ$³×[ÕzÕ6¤DDTãüýýñòK/á¿÷@Üç9iÒdœÕ.[¥Rœœœ “ɰjõêZiƒL&Ö-[Í›5ÓÌoXú´à½{÷¢¸¸ïðA…e'¾ô2®_¿Ž°°0ôìÑ ‘HªUŸiS§–¯X‰¼¼<âÀƒxú™qf¯·6êEDDT,ÙDDTS°rÕJ¤§g@¡PÀÍÍ Ï=÷V®XQí²7}ýÞY¸#GŽ‚¯¯/æÌ™]£u×¾—ÔÙÙƒÄêÕ÷/5Þ°áSÌ_ð^~åU4ð÷Ǽyó4k™ ÆcùŠ•8wîD":wî„Ë«×öiÓ¦Bb+Áwß}‡æ-Baccƒ.]:cÆô×Í^omÔ‹ˆˆ¨&ð¡FDDDDDDdjDDDDDDD ¤DDDDDDÄ€”ˆˆˆˆˆˆ1 %""""""¤DDDDDDD H‰ˆˆˆˆˆˆ)R""""""b@JDDDDDDÄ€”ˆˆˆˆˆˆR"""""""¤DDDDDDô˜°d—ˆÿýï8zô(bbc‘›› xzz¢eh(ú÷cÇÂÅÅ…EDDDDDÄ€´úär9V­^M›¾R©ÔIS*•HJJBRRöîÛ‡w—¯@RbBª¿»‡§Îûì¬Ì:×Çõ¡ŽDDDDDT{êÔ%»å”ʦ×™L†qÏ>‡/¾ø²B0ªT*åžDDDDDTÇã b@Z/,\¸ÇŽÓ¼‰D?þEìÛûâï )1ÇŽÅ’Å‹áååÅ#""""¢‡B­V㥗_ÁúõÕËú×Ê%»Æþ2Q×/˼ví:6oÙ¢3ïóÏ6âÙgŸÕ™Ú¡¡-0uê¼³p¡Þ²AÀÞ}û°sçNœ?™™™^^^h×®-Æ=ó  ‘Hd²³³2qúô|õõW8qâ$òòòàííÁƒãí·ÀÍÍÍhß»<6&&{÷íÃéÓg´´4”””ÀÎÎþþþèС=Æ¿8;w2Úw‡ÆŽ;pîüyddd@¡PÀÏ×Ý{t×Y¾*u¼ví:¾üêKœ:u©©©P*•pssCóæÍѽ[7 6Í›7版ˆˆ¨s÷ðD³fÍqü˜Îw`AЭ{ܼy³ÎÇ eßYE"Ð0(ýúõÃôÓááîþÀë³tÙ2´oßsfÏf@ª/p÷ð¬W÷nÛ¾ ‚ hÞ5²B0ªÍÞÞ7l¨0?''“§LExxx…´ÄÄD$&&⯿þFïÞ½ñí7›4¥!Ÿ|òX³v­NÝ’’’ðí·ßâÈ‘#8x`?ªÔæ®OtÓ;¿  QQQˆŠŠÂ¶mÛ1göl,[¶´B¾ÜÜ\L6 ªv'>wâã±mÛö*ïGųÏ=¹\®3?##8zô(Ö½÷ïA%"""ªlmm±wß> ~òIͼÿývvvõ¦ eß;‹‹‹‡Ÿþ½{÷Á¿{ö 00àÖeÍêÕõzx —ìމNj/ŽG`PCøùùcܳÏ"++K'φѬy 4Ĭٳ!+„”Q©TXµj5š5kÿ˜ ™™YšïËÈÉÉÁ°aºßo׬Y‹´Ô4œ;{gÏœFRrÖ®½ð­[»ÙYÙ¸tñŽ ×yLmÆ †L?G´¤LÕ¿¬íÿîÙ[q±:t(æÎgvº©ö=èöW•¨t*{-`1kúk%>ÿ9ÙYÕ^±Kv¥R)Ú¶m‡èè(MÞsgÏ 88pëÖ-Œ5W¯\®PVÛvíñëÎ dff¢g¯Þˆºq½ZõõðôÒ‰LOK…¥eå®l=f,Ž=ªyÿá‡àÕW^ÑÉóÝ÷ßã­·ÞÖ¼ïÓ§~ûu§Á¿Î,^´óæÍ½8ß¾Ž:ëüu&1!ÞàòU½œµ¸¸Aš÷^^^¸qýšæý˜±OëŒÏû–,^lö¾aNƒ5F~~¾æýüùobÐÀ ³³3êDDDDõDÙ÷ùŸ6oƾ}û±më<3n†މ&è|ßoÖ ÿõ'5jˆ‹‹ÃÈQ£yõ ¬UküýןšØ!..»t­õxÁP|£P(„´Ô³êïîá‰Ø˜›puuÕÄF ƒ!=-Õ¬tSí«ö''%â›M›°ñ‹¯v(àné”­õ:¿4]Zš_ @@ @ðïž9s+V®À•+WQ\\|/ .÷@ŸÀÀ@×zËJMME—®OèF×zTYvvv(**Ò¼/((ÐìæºvMwDoX¹ÑL>l˜N@yõªÑ2ÇŽ«óÞÏß¿BàXUضm;<ˆ˜˜deeA&“é½DøîÝ»:ï##uëýòK/Õø~3 ü¾k—æýúõiž"æçç‡>}zcêÔ©hÆ£<Q=ðÜsÏáý÷?Ào¿ÿŽk×®cëÖ­òdff"(èþÀHPP23ï‚:±ƒvÞÚŒ IOO×y.Œ©úЉ3lmm+ü䤱tSí{Ðí¯ªzÉî«“&aò¤É¸yY™¸sûV… '!!Aó:11žžú¯ãöööFäÕ+:—xfefT»ŽÁ 꼿|ùr¥ËÈËË×ý+Šž§m•ˆQ^~¾Ñ24Ð @­­¬jd›Ü¾sÝ{ôÄâ%Kpøða$%%¡¤¤Äàýª …Âh[}||j|¿Y»vÁ'ü¦¤¤`ûöŸ1`À@:t˜Gw"""¢zÀÆÚS§NÁôé30mÚTØX[WÈãéé©ÄÇÇÃÃÃCóÞËËK']ûumÆ †lÙº½{÷6»þÕeª}ºýõ" -))Db‰ñ ˜;o^…zô˜Ñõ„…éÖûÇŸ~ªñ:–éСæÏß÷ކ‡#â¸nÝ"Ë=üˆˆˆˆˆê¯%‹ÃÓË:vB‡ŽàããƒÅ‹iÒ-Zg´iÓÝ{ôD÷ÝH¼P¸zxz¡Yó˜5sl¬m~ä°ÎO¾˜ªu™j_m¶¿FãÔòCê£9o¼­[·éNãÇ¿ˆ‰& yóæ‰D¸}ûöíÛ‹Mß|‹ôôt›·mÛ®¤:::âÃ?ÀSC†þÛ»o¾9š<7lÀ /3n\¥ï½Ô^J¥Âˆ‘#u~úÅœå*SGs/èÙ³'þØõ;DDDDDõ$ ³[+’H$ØùëNL:¥Â½›úØÚÚê¼·´´ÄömÛУG“ËvïÞÛ¶n5k=•1yòd³ò­\±NFî_}ã7Œ.oaa­[¶ _¿¾µVGs¸¹¹aÍêÕÜy‰ˆˆˆˆê¤ØX[cÝÚµ8sæ4,˜®]»ÀÝÝ °±¶Fƒ ðä Aøàý÷4¿“ªÍÝÝ »~ÿ [6ÿ„#†£Aƒ°±± üýý1|ø0lþéGü±ëw¸»»ÕxýGŒŽï¾ý]ºt†ƒƒƒÁ|-Z´ÀáÇðÜsÏÁÛÛ–––pwwC¿~}±mÛV,]bú7E]]]±ã—_°ã—_ðôرh[[[XYY¡aP^xáyìÑs­¹u©H$ ív$Ôjuï±H@X›¶ððôªs—W•Z­FVf.ž;K++¸¹¹sO'""""¢Ç# µ«¦­ðì[ß@"‘ ° ÿ‘Ú°‰-Z¶DÔµkèÖ³÷t"""""z<RK1 ¨ÕêCˆQ/Fr«ÂÑÉ ùùyÜˉˆˆˆˆè1 HBÝI-Åõ£žUõ(·ˆˆˆˆˆV`¡¹³îCbmDDDDDDL@j)ju=!1 %"""""ztÒ{¿þäÿtFf?\ÿ:uy-[µÁì9sQXXAиI3@ã&ÍиI3Í2 ˜2í5´jÓ-Z¶Â+“&#++K“®W»GÂÃ1ø©¡hÖ¢%zõé‹_vìà)1 -ci ¨õO€yiÛ¶nÅÁѵk7„µl…Ý»ÿ5ZFJJ Ú¶m{{GØÛ;"8¸1233 ®KP—Õµr—?óôÓ8qBóþ˯¾ÆÕÈHü¹ë7œ:q6¼ÿÁz‚€˜è€˜èˆ‰¾¡YfÊ´×ðòKqúdN8Žà†ÁX³ö=½ëÖ~=ÁÛ˜3k._<í[·ââÅK H‰ˆˆˆˆ¨^ªÕ§ìÂèÓrM§uèÐ;vüA°oß~LŸ1OÅÆ,ÃÇLJ€ŸŸŸÙë² …Â`º¾4WWÜÍÍÕ¤íØù+¾ÙôÜÝÝsçÌÆ¨1OcÉâ…Ëùë]š×˜3{& |R'Ÿ¾×666HMKCFF¼½½±bù»FëODDDDDTWÕâ=¤ª{é˯¼‚¨¨P(ä †R©Ô¤9;;#&æ¦Î²“&½ŠY³gãöí[P*¸v-/½ü2LÞCZÉÒŒŒ ¸ººhÞ§§§cè° kаÖèÙ»/rrrŒ–sñâEŒŸø:tê‚аÖhß±3îææš!ýô“qâF}ƒ?…Çp„”ˆˆˆˆˆê¥ÚûÙˆ "ƒy+Ì+ÈÏ/ ¾î-7ô©¡xþ…ñ¸}û6š4i‚o¿ýV“6gölôèÙEEEšåæÍ‡O>ùC‡GjZš4i‚·,0Z MðlHÅ´_ûOtíªIóôôÄöm›áíåedYÝræ½¹ ¼‰=ºÃÁÞEEÅèòDw#ËÜ{ŠÏ7~ Apìx–.[Žð>¸'Q½S«OÙ5ô ¡üü<½SYZY¾±OÅùóç““Ó§O¡ÿ~š´ù æ#55E'¿H,¼7ç!òZ$²³³pêÔIŒ;ÆèCÌ!•J¥¸~ãÖ½÷~ÿ}fÌx]“ö츧±|ùJ$$$B©TâæÍ›xsÁÛštGGGܾ}[§ì™ ÖÖÖ°¶²BRRÞ]±Rg}†^Ï_ð6bcã P( ¨ÕP)•!%""""¢z©–î!"@„ºYŠE0·…µn‘H[[[4@÷nݰsÇÿàææ¦YîÕW^Á÷ø“&OEFf&6lˆiS'kÒ_~i"Æ=÷"Š‹‹qõòEÀÊåïâƒ?Âsß„··^~é%ü÷ß^ºè{Ý·o_Ì™û&ܰ!Ö­[ÆDDDDDÄ€Tä`ôRÙºÂàHâ•K .§½ŒH$¤W_Á¤W_Ñ›gÊäI˜2y’μ¾}û oß>:ùŸîYMú•Kô¾üä ~rÁº=Ö©…¡~ŒZˆÐ=2©¥Dõ!5>BJDDDDDDõ0 Õ—`@JDDDDDôè¤âúÓ¦ö…ˆˆˆˆˆˆêM@*‰êMˆD"Ž=*i}À”ˆˆˆˆˆè He²’zÓ 7®]{¤7ò¿ÿüÅ=ˆˆˆˆè1%‹áäìŒ&M›ÁÃÓëñHœQŸWç7΋½Ïª IDAT/½Ê=”ˆˆˆˆˆYjµéi©8yì(Úuìg×G? ­/êCÐLDDDDDThÞ27®_G×nÝëL½ÄÜ4DDDDDD>'gäåÞ­Sub@JDDDDDô‰DP«Õ H‰ˆˆˆˆˆˆR""""""b@JDDDDDDT«ÚϾìúu{Ÿˆˆˆˆˆ¨~zRsM|u ÷"""""¢°ùûoê]-vär÷"""""¢Çï!%"""""¢‡â¡ ‚À­@DDDDDÄ€´~¤çÏžF×n=¡PȹEënnâöàö n"¢üd@Zµˆ´n–EÜÜÄíÁíAÜDDôh¤5yÉ./ÿ­kß'j~{ØÙ; ¸¨ËÏ·q{p{Ò8éÔѲèál{{™8¹Ìö0g[WÜÄíADDõ; }@#¤7oÞÄòå+pìØ1!,, óæÍŨQ£jdÝŽ(,,¨±¶˜SžvG€H$‚ƒƒ‚ƒƒ1`@Ìž=ufÛ–ÕSŸÂÂh–3ÔüËyÍ~>ôm“òÛ¢¶öß`×®ß!‰jõóTß¶Gm´Û¤îž?ôù…Û£~x·;=žþϾBõ'eÅÅÆbȧЯo\¾t©)Éøè£õعóךYYjª,sËÓΠ° ùyˆÁ—_|©TŠ'žè†øøøš­[5¶GaA¾f*«³æ½9}PÓýü8L¦>k嶃ÞmQKû¯«« 6}½éñÚÎflZ[/·IÝ<<èó ·Gýé žÃ8qâTÙã'Òªý´º“©²Ö¬Y‹¹sßÀ¤I“àêê kkktìÐ[·lÖä‘J¥˜1s|ýüáë癳fA*•jÒðí·ß!4´%\ÝÜÑ­{w\¾|E“ŽNpptÒ,sûöm<3îYxûøÂÝãGAFF†&].—ãw"¨a0üàÓ Œ–§¯Ýú^ÛÙÚ¢uëÖøàý÷1qâ¬Z¹ªFú¹¦¶‡¾:k÷³±>Ð^F©TbÙ»ï¢ap#xzy㥗_FAAÁmk}˜LmCiÚýîà脟}†fÍ›ÃÑÉ‚ `ï¾}èÔ¹ \ÝÜÚ?þøc¥÷ßO>þ_}ý5¢££ ÖÉÔçÈÁÑ ß|ó-Z†µ‚›»:uî‚'N`ëÖ­hÓ¶æóY'öªnsú‚Û¤îž?L}¾*{~)ÿ™ôä`ìÜù«Î:Ò¤é#u¼ª©íQÙý³6öéªlwCŸqNœ8qb@ZÇÒ#áá3z´Ñ2V®Z…ÔÔT\ºx/œGbbV­^­³ŽcÇŽaß¾}HLˆÇ°aÃ0köl‚€ü¼\@~^.òór5Ë<3îYLŸþ:nÅÅ!.6!MBðÎÂEšôµk×áÿٻﰦÎöà_‚‚hâ@T\U‹K+´ÚºZ¥€‹·oq"‚ E[ê*.DÜXµµ?uÔÕ·ŽŠUkÕ*ÕŠ ™Õ2…äüþD" CF€ï纞‹äyÎ9„û>Oœsò÷íÛ8> 7ÿŠFrrò+·WÖ‚´ps;gΞ­5©²¯¤^gå7ßàÏ?¯#*êÜ¿‡F!0p!Ÿ”*©zyÿºòÇD;‡¬'™'NÂüùóðOrNœ8ŽËüQîý×ÀÀkÖ¬Æø !•J‹ýÝ¥Í#8sæ Ž?†Ä„xŒ5ÃGŒÄÉ“?ãÈ‘ÃHJL€‹‹ ¦ùúiľó:ii±`N4÷õ£´ùUÞ×——ç¤ÿìYX¶|9är¹j™eË–aÊ”Éuêùª²òQÞý³*öéŠä½¤9ÎÆÆÆV›i4åmíiÞ“óÖ……##=­B=þÓaŒv‡§ÙY%.óã¾HŒ7á•Ë”Uô?a÷Á‡%^}ÕØÄ)ÿ>Fƒ%Ÿ2ûf—.8vô(:tè¸ÿ>?ý1·o?ÿ'Ͱ)âãÂÈÈ ‹aÞÚB#檒ˆÅb¼eÕ±îºví†#G£cÇŽE–-Ëö /SÒòùùùhѲÒÓR«m§*-¯úKû› ÷½eÕ<€N:RRRðAï>¸ï.Æ/G> ›éËÎzR$wbbвe Õ2ݺ½…éÓý0ÔÑæ­Z½Öþ¸p!h7À¢E K]ÿåyd`Øqcall¬oÞ¢e‘¾Âóµ&÷²ä£´Ø• æDs_?J{®+ïëKqs²_ÿ˜ê=£Fƒàèø)®]» ==½:ó|UYù(ïþYûtEòþª9NDüÏîƒñÝ·Û1l¤k‰Ëeggáì©_ààèT¡ß“œ”ˆ-›7#tÃÆ£$ÄrdÈ,hé…ngŒ‹ –—P àv5~Q#©TZåÛ222£Gмyó×MIIE«V­TÛhÕªRRRÕ¶Ù¤IÕ}mmmÈd2µñ—ÿå?þÀ’ÅKý×_ÈÍÍ}^õki©–{üï¿j¿³"±yÕ¤$Wjœ+3·Å-SÚߤì{ôèlÞ}Oý–Bñ¥²ç#-5¥Øe ¯cb¢¾EDlÇ7!«ðõÒ¥Ð×7À×Á_aРAÊÿœ€8 ŠþúÃÎÖVm¬´yo¼ñ†ÚÜ,®¯ð|Õ„}çU¿«¤±ÒbÁœhîëGiÏuå}})nNΘ>‹—,££#¾ü*>Ó| ­­]+Ÿ«:åÝ?«jŸ.oÞK›ãDDµQ½¸ÊîG}ˆC‡a„ %®Û¬Y3ÄÇÇÃÒÒSSÓ"‡½êw¾<îå5K/Æ€ý¡¯¯gÏž¡}‡Žªåš7oޏ¸8Õ»¸‰Mio×îÝèûÑG5òQ~yYÿ¦ñ3ÃñcÇвeË*Û§ê’WÅ¥¤±WåÂÚÚZuÞÖ©S§à7}nÝ´¯Pþ6lˆ°õë1ÎkNž8¡6VÚ<*Ë~¤‰ûNEòQZ,˜Í|ýhРrssUŸTfdf–ë¹®¬ñ4È_/]Š/¿ü üñB ®KP—ž¯ªëõ¼¢9(ï>]ÞßYÚ'"ªêÅ9¤þ³gcíºP|»s'223!‘HpõÚ5xŽóR-ãâìŒ/,@jj*RSS1ÿ‹æâRæs€ qïÞ}µñ<±ºº:ÐÕÕE|||ˆüü|üý÷ߘ0a"Ï#¨¢sH_Ÿ8qbîÜ4? Åó xTtÿ;w‚ûXwÌ7Om¬´yTÚ~¤iûNEóQ–X0'šùúñÖ[ݰ>, ¹¹¹øçŸ0{öìrÅ«´çÂÂ}3fLÇú°0Ìœ9 6¨sÏWÕñz^ÖçÀ×ݧ+’÷WÍq666þ¿Ç‚Tƒ RKKKìß·§OŸF¯^½`Ù¾æÎgÕ2óæÍE3Ófèek‡^¶vhѼ9æÎSæï)Sð‰½=Ìš·Põ­^½ ¡m;K¸ Ž÷z½§¶Î¬Y3Ñ©S'ôëßï½× æææ¯Ü^i/–fÍ[ y‹–èö–|ý¦CGG§~ùZ·n]+ ÒâbPx|šzõê…á#F¢m;KLš<C†8ðI©š ÒÁƒÁÓÃíÚYbÉ—_bCXX…÷_eóò‡””µ±ÒæQEþQ¬É}§,ù0kÞ¢H+K,˜Í|ýù&ÇG‡Ž0ÔñSôéݧ\ñ*í¹°p‰Dhß¾=\Gª“ÏWÕñz^YiiûtEòþª9ÎÆÆÆÿ÷j«¿¨QÊ¿_û¸w7v|X­î!æƒù æƒùÐ4cÝ=0ÌÅÆ c>ˆˆêáë/jTÁOH5q[Ä|0Ä|0µ…B¡À÷{öàáÇprrªõçQýÁ‚”øóAÌóQËóÑʼ5,,,°iãFhii± %""¤,H‰ù`>ˆù`>ªÇ?ÉIujßâü "bAZ«^t,ÛwÄ¿1›‚ù`>ˆù`>ˆù "âógYˆ˜>""""""ª uê]""""""bAZ&‘ßïbˆˆˆˆˆˆXV?×Ïݘ"""""¢J°sû¤±pÑÄ܉)Òßݪ;,âžEDDDDDTiDAs'>>U}¹9blݶ‡""""""bAZµ¤Ò<<Œ‹‚ À¬YK€ëg#K\ÇÖÖ³fø3‹DDDDDD,H+./O‚œœÜçw 1)#G ‚D*D€–ÖKl>Nœ8Ç ± ­<·nÅ!++@t±ã-ZÃÚÚŠÙ#"""""bAZ¹²²rùþÇ_u/U=sss$''3DDDôZDšò@är9òó¥Ë媾ÌÌô"M)??ŸÙ«‚ 88]»vE·nݰtéR‚P®bû÷ï_dAЯ_?˜››3ÈÕ\T0šåþýû˜0aÞzë-´k×C† ÁÑ£G5îqÖ—b4%%óçχÚ¶m‹nݺa̘18}ú4wV""¢ºT*Š‚Ÿ/ ÒëׯiJyybf¯|÷Ýw¸téΞ=‹3gÎàÂ… س§|WCÖÓÓÃ/¿ü¢ÖwòäI4nܘ®̇æxøð!F…?üçÏŸÇÝ»wŒC‡185àñãÇprr‚©©)öîÝ‹à·ß~ƒ‡‡¶mÛÆÕ¥‚T"ɃXü¼)Y[[iT³"##1wî\4oÞÍ›7ÇܹsY®mx{{#,,L­/,, S§NUë377Ç–-[ðî»ï¢uëÖ ~)O>^V¸¯¸|×tîÜ–––3f ÒÒÒÇ/R|%''£gÏžxúôiÏEHH¼½½1vìXAGG={öÄæÍ›Ë•‡;wâý÷ßG»ví0`À\¾|‘‘‘èÓ§Ú¶m {{{ÄÄļö:…oïÚµ ¶¶¶ªeoݺ¥ÏË˃ŸŸ:vìkkklذ¡V|ú¾råJ|þùç˜9s&,,,РAáã?Æwß}§ZN.—céÒ¥èÑ£:tè€)S¦àÙ³g¥ÎòÆüUs§´<Ô÷¹EDD,HK¥Ý°¤’|H%/ÅŠúž^žë1VÕ>u ±XŒS§.A[[¡ë×2‹ÕèîÝ»èÑ£‡ê~=pçÎrmcÈ!HKKÕ+W/^Dff&Š,{íÚ5œJS\¾^îóððÀ„ èèhtèЋ/øúúbõêÕª#&`õêÕ?~<ôõõë|.Ο?ggç×ÞNTTöïßÛ·oÃÅÅnnn8uê"##GGGøûû¿ö:…]¸p‡ÂíÛ·áàà€€€ÕØŠ+ðôéSüþûï8uê._¾\+òqúôi¸ºº–º\hh(¢££qòäIܸq5Bppp©s£¼1ÕÜ)-õ}n‘æÒ*hÊÛ"ÚÓ¼'ç­ GFzZ…6zü§Ãí>O³³J\æÇ}‘;n€ç)Ò××GjjªÚ2ÎNŸàÍ7ß„ÁóK…B™\A…§Ï\Àµkѯ¼U. ÄÇÇC$©rÒ®];$$$”i}å…PvïÞS§N!""£GÆ!C0zôhµ ¥˜››ãÚµkhÞ¼9_EÊ›—Ï,-_eÉ¡X,†­­-¢£Ÿ_U{èС?~<† ¦:„5** zzzu>m۶ŃРAƒRsöª<ܼyFFFªøvìØ±H_—.]ÿZëþ·nÝBÓ¦M‹]ÖÆÆ@Û¶mqqqèÝ»·ÆŸ‡Z\> ²«|ü¶¶¶øþûïÑ¡C@jj*>ùäÕi&%ÍòƼ´¹SZêóÜ""ª/vnß‚a#K~35;; gOýG§ m?9)[6oFè†GHˆäÈYÐÒ ÝÎ.,/   t•]ßi^Å^çÙ³,ÄÆÞ‚ÖKßC ƒâþý8îyÕ¨I“&ÈÉÉQ½£ž““ƒ&Mš”{;®®® ÁÁƒñ÷ß#""¢ØåXŒV²æ£4Ååëå¾+W® 887oÞDnîóï.<¿}}} '''|óÍ7ðöö®7ÿ0!##fff¯½%eì^î“Éd¯½NaÊ"¨¸eSSSÕ»¯-‡à#-- -Z´(R„.L?~Œ>úHmÝ—_³Š›åyis§´<Ôç¹EDDšKcÙ !áN‘–‘ñ"‘ZZZjMºuë†7B,ãñãǘ3gN…~O^^tuu¡««‹„„µs çŸøøùù!<<~~~hذa½ÉÁ¬Y³°~ýzìÞ½Ož>2™ 111˜2eJ¥?žÒæNiêóÜ"""Í¥‡ìÚÚÚb]è€BQò»½"Ñ‹C“ ÆFFðññe«Ñ˜1c~ýú©þûïÿËÀÔ+W®Ä¬Y³°fÍ´hÑS§N­Ð÷c†„„`ñâŘ0aZ´hÉ“'ãðáÃjËhkkÃÒÒ£FªW1¶´´Ddd$–/_Žàà`ˆÅb¼õÖ[ðöö®ôßÕñ‚T¡Pü|Q^¿~½HSÊË3{5øO)?%©ý¦OŸŽ;v@&“d2¾ýö[LŸ>Áa>ˆˆˆˆêWA*‘äA,~Þ”¬­­‹4"ªÝ»wÇ›o¾‰cÇŽŽ=Š.]º sçÎX´hììì`gg‡   H¥RÕzR© ,À»ï¾‹¾}û"""Bm»¥'&&ÂÇǽzõÂ;#ɓ'#==ù¨`>¢¢¢àââkkkØÛÛcÿþýe+-VVVصkˆîÝ»«úʳ~dd$ìííamm‘#G"&&¦VæFùw¿|dHY÷ewww?~\­ïÑ£Gèׯž={Æ'#""bAª ´6€T’©$¿Ð?S¿ÂÓËc=ƪڧÎC!‹qêÔ%hkkc{ÄVf‘¨‚|}}¹\ŽˆˆL›6 k×®EJJ Ž=Š£GâÑ£GX·njÐÐPdddàäÉ“8pà~ÿýwµm–6îãã777DEEáܹs°´´ÄÊ•+™Œ æcþüù˜:u*._¾Œo¿ý7nÜ(ÓXYòpãÆ ìÝ»ýõW‘ÇZ–õ/_¾ŒÝ»wãâÅ‹8p ‚‚‚je^”G„¼|tHY÷å‰'"<<\u$„‡‡ÃÍÍ o¼ñw|""ª×4æ¢F'Ž]@jjªê¾“‹#œ>ÁìYÞ00Ððü°^™\A…§Ï\Àï—Ç8OžóFT:u›o¾‰… ¢k×®èÔ©Ž;†;vÀÄÄDUÔxzzböìÙžrWx|Þ¼y:t¨j›¥:tHu[WW~~~°··g2*˜]]]¤¦¦"33-[¶Ä’%KÔâ[ÒXYò0gÎûX˲~`` žžžØ´iSÊWY÷åÞ½{£qãÆ8~ü8†ŠøøxüöÛo˜?>wz""bAª)ÄwšA(ÒÿìYbcoAë¥ï!‡ÁqïÞCf‘è5L:ªC 322кukÕ¸¹¹9222T÷ÓÓÓann®6^Xiãׯ_ǪU«pûömˆÅÏÏ/n~3eËÇš5k°qãFlذúúú˜3gúõëWêXYòЬY³gYÖW£Ð¨Q#Õù±uEyöå‰'bÕªU"""¤5¤ð•"‰ˆˆê¢—¯4MDDDR*-\´1wbŠôw·êŽÀ‹˜%""""""¤U#æN ||Ü!i«úrsÄØºm3DDDDDDÄ‚´jI¥yx A€Y³–×ÏJ¾¯­­-fÍðg‰ˆˆˆˆˆXV\^ž99¹Ïï@bRFމT-ˆ-­— Ø|œ8qŽ$"""""bAZynÝŠCVV€èbÇ[´0†µµ³GT‹˜››óâ.Ì+‘æ¤YY9ˆüa_‰ã¯:Œ—ˆˆX¬Qí 1_ˆ&—Ë‘Ÿ/…\.Wõef¦iJùùùÌ^ 8sæ \]]Ѿ}{¼õÖ[˜6mÒÒÒ˜Z\0ôïß‚ ¨õ ‚€~ýúÁÜÜœAª…ùД¼.Fkë¾”’’‚ùóçÃÎÎmÛ¶E·nÝ0fÌœ>}š;,Q]*H EÁÏéõë׋4¥¼<1³W6oތɓ'㯿þ¯¿þ }}}x{{30µ˜žž~ùåµ¾“'O¢qãÆ N-Îóúú?~ '''˜ššbïÞ½xðà~ûí7xxx`Û¶m Q]*H%’<ˆÅÏ›’µµu‘F5kÏž=0`š4iSSSâ?þ``j1ooo„……©õ………aêÔ©/ÍQ üýýÑ¥KtéÒH$e/,::666غu+PÁ|Èd2¡{÷îèÚµ+6mÚ¤qyU~*Zø§òöðáÃqèÐ!µõ“““ѳgO<}úT#r±råJ|þùç˜9s&,,,РAáã?Æwß}§ZN.—céÒ¥èÑ£:tè€)S¦àÙ³gªqssslÙ²ï¾û.Z·n­‚-òÕ IDATêÛ¹s'Þÿ}´k× ÀåË—‰>}ú mÛ¶°··GLÌ‹ï莇‡‡:wî KKKŒ3FísssìÚµ ¶¶¶ªõoݺUkâMDD,Hk”vÃJò!•¼87*êWxzyb¬ÇXUûÔy(Äb1Nºmmm„®_Ë,Ö sçÎÁÆÆ†¨Å† ‚´´4\¹rpñâEdffÂÁÁAm¹åË—ãñãÇ8þ<¢¢¢œœŒ+V”y\é—_~Á˜1cðõ×_cüøñL@ó‚»wïâçŸÆï¿ÿŽGil^•‡î&''«nûúúbõêÕª£c`õêÕ?~<ôõõ5"§OŸ†««k©Ë…††"::'OžÄ7ШQ#«-síÚ5œlllJœ{š’׿§ðm¥!C†Abcc!77WcòѦM!??¿ÈߤlJ½zõîß¿¯ºŸ’’"¼ýöÛjë<~ü¸Èv222T÷sss‹íkÓ¦M‰/77WèÞ½»Ú6333K\_ÓãMDD¯ïÛm›_Yƒ%%Æ »wl«p}ýš0Í{²à'ûì° ÀJóLà àïè À€1€&t jN‘²Õ˜«ìúNó*rxö, ±±· õÒ÷€Ãà¸?Žo)Ô€‹/ÂÏÏ›7oFûöíZÎÕÕ!!!8xð þþûoDDDY&-- mÚ´QÝoÓ¦Úá‚¥ÏÏAvuuåá÷•””µxׯ¼úúú"88NNNøæ›oàíí ===Ƀ±±1ÒÒÒТE‹"Ÿö¾HÓãÇñÑG©¿ÓûÒkVóæÍ‹lßÈÈHu[ùw¿Ü'“ÉT÷¯\¹‚àà`ܼy¹¹¹Åþž¦M›–¸¾¦Ç›ˆˆê'9dW€€„„;EZFÆcˆD"hii©5AðäIôñÅ´º>|S§NÅ–-[XXÔ:::ðòò‚ŸŸÆ"˘šš"11Qu?!!&&&e€ýû÷ãÈ‘#gÐ_3fffHHH¨Õyµ··GÆ ±téR\½znnn•‡¾}û"22²ÔåÌÌÌpõêUÕ!ÉÉÉÉj‡æV–I“&ÁÓÓ×®]CRRbbbŠ}#·¶Æ›ˆˆX֨̌4šÂÀÀDÕ M ú 7嘲³³xÅÈj¶yóf|õÕWø¿ÿû?¼ýöÛ Hâããƒøøø"½QrrrÂÂ… ‘––†´´4,\¸ÎÎÎe€–-[âÀسgBCCô×ÈǨQ£°`ÁüðCˆˆˆè5iÌ·c+Š‚ŸrUßõë׋4¥¼<1³W"""0fÌüúë¯øùçŸÑ¹sg̘Q¾¯æÑÓÓï¿þªÖwúôi4nܘ®7oÞÄÍ›7ñ×_á§Ÿ~B‡0sæL¦†TÖü`^__JJ F ccclß¾W®\Á±cÇðßÿþ»wïf€ˆˆˆêRA*‘äA,~Þ”¬­­‹4ªYÛ·oÇÇ }}}4iÒîîî¸}ûv¹¶1nÜ8lÛ¶M­oÛ¶mðòòRë³²²Â®]»0pà@tïÞÁ¯bZZZ011ÁäÉ“qÿþ}U¿T*Å¢E‹`gg;;;A*•Ù/úöí‹wß}EÆ©òç‡L&ÃòåËñá‡âý÷ßÇ·ß~˼V²ÐÐPŒ1ÞÞÞ077Gƒ дiSôíÛ›6mR-'—˱fÍ|ôÑG°±±ÁìÙ³‘““óÊç2+++üßÿýŒž={ÂÅÅ×®]ÃÁƒ1tèPX[[cäÈ‘¸wïžj;‰‰‰ðññA¯^½ðÎ;ï`òäÉHOOWû=‘‘‘°··W­pwwÇñãÇÕþ¾G¡_¿~xöì'± ÕnØRI>¤’‡âFEý O/OŒõ«jŸ:…X,Æ©S— ­­í[™Å"‹±k×.ØÙÙ•k½?þªO¼ÿøãdeeaàÀE–½qãöîÝ‹¿þú‹¯ؼy3Þ~ûmUßÚµk‘’’‚£GâèÑ£xôèÖ­[§¶Þ•+WpàÀœüüóÏø÷ß™×J—R—Û²e nݺ…½{÷âܹshÔ¨V­ZUêsÙ¥K—°cÇ\¼xC† Á”)SpîÜ9lÛ¶ —.]‚½½=-Z¤ZÞÇÇnnnˆŠŠÂ¹sç`ii‰•+WªýžË—/c÷îݸxñ"ˆ   Àĉ®: ÂÃÃáææ†7ÞxƒˆˆjŒÆœCzâØ¤¦¦ªî;¹8ÂÙéÌžå }Ïë•Ée@PÈqúÌü~ùwŒóäw¿T7å9j&&&صkWùÞ‰àáámÛ¶!44[·n…§§'D¢¢ïÌ™3ÆÆÆ x5äRÉÀÀ;wîTÝ?vìvìØ“ççoÏŸ?žžž˜={¶j™¹sçªÆç΋qãÆñðÐ *ëü8tè¶oߎæÍ›˜×JöäÉ“"Ï?…ãª<Ÿ÷Àؼy³*3fÌÀðáÃøÊç²E‹¡iÓ¦€±cÇbݺuX¸p¡Z߆ Ôr®¤«« ???ØÛÛ«m300†††OOOÕ'¹½{÷FãÆqüøq :ñññøí·ß0þ|N:""bA ¾Ó¼ B‘þgϲ{KíJƒâÞ½‡Ìb ¸yó&ž={†Ý»w#00°ÄÃKâì쌰°0;v wîÜAhhh±Ë5kÖŒÁ®†\*eggã»ï¾ÃÒ¥KU‡fdd¨]ÇÜÜjÛ077W»]ø0B*¿²Ì´´4µ¸3¯•¯iÓ¦ÈÈÈP»h›2®… Ó””8::ª­ûòkVqÏeÊÂ5jTlŸL&SÝ¿~ý:V­Z…Û·oC,û{”ÅhqëOœ8«V­ÂàÁƒ†qãÆ©~/QMјCvHH¸S¤ed<†H$‚–––ZOžd¡‘._LkÊo¼OOÏ N«££ƒ1cÆ`þüùpssƒŽŽª àåå…?ÿüSÕgllŒäädÕýääd©­WxüŸþá§Ú¯©,óÃÔÔT-îÌkåëÝ»7}ðÍ7ß00µXáCõôôðÎ;ï $$DÕ7}út|õÕW2dÀÞÞ~~~jÛxçw0lØ0äää`РA˜6m[ż½½‚áÇCL™2…y­d­ZµÂ÷ß 6ÀÍÍ ™™™xã7ðöÛocË–-jo(¯„œ’’KKKLš4©ÒÏ’%K°råJ̘1fffðððÀ‰'ʵ mmm´mÛNNNœDDD¤´ šò¶€ö4ïÉyë‘‘žV¡ÿé0F»ÃÓ쬗ùq_$>6’ ""ª&Ó¦Mƒƒƒƒê""ª[Žü¸ÃF–|JFvvΞúŽ{c29)[6oFè†GHˆäÈYÐÒ ÝÎ.,/   tQ#"""ª …@BBÌ€‘Æ`AJDDTÇõèÑæææ )ö+¶ˆˆˆêeAúò‰ˆˆ¨ò•õŠÌDDDõª UZ¸hbîÄéïnÕ 1KDDDDDD,H«FÌøø¸C$ÒVõåæˆ±uÛfˆˆˆˆˆˆˆiÕ’Jóð0.‚³f-®Ÿ•|%^[[[ÌšáÏ,± ­¸¼< rrrŸß€Ä¤Œ1©ZZZ/°ù8qâ3HDDDDDÄ‚´òܺ‡¬¬ÑÅŽ·ha kk+fHC˜››¿ò¢)¥óZãGDDDZfeå ò‡}%Ž¿ê0^""""""ª4æËÈär9òó¥Ë媾ÌÌô"M)??ŸÙ«Axï½÷`nn^®õÌÍÍÑ¿‚ Ö/úõëWîíQŹºº"""B­oûöíøÏþÃàÔʘÌk忣¸ÛDDDT R…BQðóEAzýúõ"M)/OÌìÕ o¾ùcÇŽ­Ðºzzzøå—_ÔúNž<‰Æ3°ÕhÞ¼yظq#d2@&“aÓ¦M˜7oƒSƒ^w~0¯DDDÄ‚´$’<ˆÅÏ›’µµu‘F5ïÞ½{8{ö,&NœX¡õ½½½¦Ö†©S§ªõ™››cË–-x÷ÝwѺuk¾’õìÙݺuÃÁƒ?þø#Þzë-ÁÃÃ;w†¥¥%ÆŒƒ´´4ÕzR©3fÌ@ÇŽammððpµí–6ÿÊí×we2™ AAAèÞ½;ºvíŠM›61¯UDù騹¹¹Ú'¥eý›‡ŽC‡©õ%''£gÏžxúô)wz""bAª ´6€T’©äÅ¡¸QQ¿ÂÓËc=ƪڧÎC!‹qêÔ%hkk#týZf±š-Y²þþþÐÕÕ­ÐúC† AZZ®\¹¸xñ"233áààPdÙk×®áäÉ“HJJbà«Àœ9s¹\ŽððpÀÃÃ&L@tt4¢££Ñ¡C,^¼XµÎŠ+žžŽK—.áÿû~ûí7µm–6^Úö뻲Îܽ{?ÿü3~ÿýwÄÙ³gñå—_r‡'""¤šò@|§y¹<{–…ØØ[Ðzé{HÀað@Ü¿Ç,V£Å‹cé񴁾£<\]]‚ƒâï¿ÿ.r¥æÍ›3èUlöìÙøàƒpáÂÀ•+WŒ›7o"7÷ùwÎwjj*,,,T÷Û´i£¶½ÒÆKÛ>•m~¤¤¤‰-óZ½Êó7ûúú"88NNNøæ›oàíí ===îìDDTïiÌ!»$$Ü)Ò22C$AKKK­ ‚€'O² ×ˆ/èÕ)&&Æ S;—ª"WŸÔÑÑ——üüü0~üxèèè0¸5¤mÛ¶j?'MšOOO\»v IIIˆ‰‰Q{³¨Y³fHLLTÝ/|»,ã¥mŸÊ6?ÌÌÌÀ¼Ö òüÍöööhذ!–.]Š«W¯ÂÍÍ;:‘&¤™i044…‰ªšônÊ13dggñʬÕLyUás©*úÅï>>>ˆ/r±ªYyyyÐÕÕ…®®. 6îââ‚   ¤§§#-- .,×xiÛ§²ÍQ£FaÁ‚xôè²³³ÕÙe^+Ÿø \ã¥mŸÊfÖ¬YèÔ©>þøcØÙÙ•z¤óúz¦L™µ8—÷oÖÖÖ†¥¥%FŘˆˆ¨€VASÞОæ=9o]X82Ò+vÉþã?Æh÷qxšUâ2?î‹ÄØq˜""ª<==áììüZ…#""z•Û·`ØH×dz³³pöÔ/pptªÐö““±eóf„nØx€€@€l™-½Ðíì‚qqÁò2r  A5"""ª‹ öìÙƒ¸¸88991 DDD…° %""ªB°°°ÀÆ‹ýz+"""¤5$33“ "¢:íæÍ›|Ý#""ÒÄ‚T)dÕJܽw·H·®Ýàç;ƒY""""""bAZ5îÞ» wˆDÚª¾Ü1¶nÛà ± ­ZRiÆÅ‚A`Ö¬%`Ò”’¯Äkccƒ‰ã'3‹DDDDDD,H+./O‚œœÜçw 1)#G ‚D*D€–ÖKl>Nœ8Œg‰ˆˆˆˆˆXV’[·â•• ºØñ-ŒammÅì± ­\YY9ˆüa_‰ã®Ÿd戈ˆˆˆˆXV¹\Žü|©Ú…23Ó‹,gddÈÏÏgöj€•UÑO¦ ¥Õ¾|2š7¿´´´Ð¤I´nݽ{÷†»»;Œ š…Ç^^îÞ½{˜0a<==áîîÎ@Õ†‚T¡Pü”«ú®_¿^d¹þýòòÄÌ^ aCTõóK,#..‡ˆ#°{÷n˜››3@îÆðõõE@@†Ê€•B¤)D"ɃXü¼)Y[[iDT5áããƒ^½záwÞÁäÉ“‘žþâ(+++DFFÂÞÞÖÖÖ9r$bbbTãr¹kÖ¬ÁG}Ìž=999 lééé¡k×®˜;w.FŒõë׫ƤR)-Z;;;ØÙÙ!((R©”¹¨a/^„ŸŸ–/_Îb”ˆˆ¨¶¤Ú @*ɇTòâPܨ¨_áé剱cUíSç¡‹Å8uê´µµ±=b+³XÍz÷î kkk :[¶l\.gP긹¹!** ç΃¥¥%V®\©¶ÌåË—±{÷n\¼xDPPjlË–-¸uëöîÝ‹sçΡQ£FXµj[ FŒ‹/ªî¯]»)))8zô(Ž=ŠGaݺuÌE úßÿþ‡ÀÀ@lذvvv QiÌ!»'Ž]@jjªê¾“‹#œ>ÁìYÞ00Ððü°^™\A…§Ï\Àï—Ç8O~÷KuQN(—ËñàÁ,[¶ ™™™`pj¹C‡©nëêêÂÏÏöööjËÂÐÐàéé‰M›6©Æ8€Í›7£yóæ€3f`øðá dp_S³fÍðäÉÕýcÇŽaÇŽ01y~Nýüùóáéé‰Ù³g35Äßß+W®D·nÝ ""¢ÚXúNó‚ EúŸ=ËBlì-h½ô=¤à0x îÝ{È,ÖmmmtîÜ+V¬À§Ÿ~Ê‚´¸~ý:V­Z…Û·oC,~~ŽöËóNYŒ@£F “ÉT÷SRRàè訶|qó–Ê/55M›6UÝÏÈÈ@ëÖ­U÷ÍÍÍ‘‘‘Á\T2‘H¹\mmmµ~¹\‘Hý£E‹!((FFFx÷Ýw<""¢ÚV p§Ä ^¦P(ðäIé6bk––V±o$Pí3sæL OŸ>hÒ¤ rrrÊuè¡©©)¾ÿþ{˜™™1˜•lÿþýøàƒT÷‘œœŒ6mÚ’““addÄ\T²-ZàþýûxóÍ7ÕúïÞ½‹–-[ªõ 6 M›6…¯¯/‚ƒƒÑ¿ˆˆ¨ 4æÒÌŒ4šÂÀÀDÕ M ú 7嘲³³ §§Ç,V#Ü»w2™ ‰‰‰X°`>ùä¦H$ÐÑÑŽŽ’’’ÔÎ- WWW,Z´‰‰‰Éd¸wïžêR*¿¼¼<ܾ}Ë—/Çþýû1uêTÕØàÁƒ±lÙ2¤§§#==K—.…ƒƒsQÉ\]]±páBDGGC*•B*•âÆX¸p!>ûì³"Ë÷ïß¡¡¡ ÄÁƒ@""¢2ЈOHmll°.t@¡(ùÓ6‘èÅ!g …£¦MáééÅ,V£O>ùsæÌAll,Œ1hÐ LŸ>©–,Y‚•+WbÆŒ033ƒ‡‡Nœ8QæõÇmÛ¶ÁËË )))°´´Ä¤I“Ør²²²‚––ôôô`aaÞ½{cß¾}ªóE`úôéøê«¯0dÈ€½½=üüü˜‹Jæåå===,Z´ñññ€¶mÛÂÕÕÿýïK|=Û¾};&Mš„ÌÌLxzz2DDD¯ UД·E´§yOÎ[ŽŒô´ môøO‡1Ú}žfg•¸Ìû"ñé°‘ÌQ ÉÍÍEß¾}ñÇ0DDDDuÀ‘÷aØH×dz³³pöÔ/pptªÐö““±eóf„nØx€€@€l™-½Ðíì‚qqÁò2r  A‡ìQõ‘ËåØ¿?¯JDDDD5ªC@TÿôìÙíÛ·Ç×_Í`Qý,H _’ˆªObb"ƒ@DDDDõ» UZ¸hbîÄéïnÕ 1KDDDDDD,H«FÌøø¸C$zñåã¹9blݶ‡""""""bAZµ¤Ò<<Œ‹‚ À¬Ùó/wý¬ä+ñÚÚÚbÖ f‘ˆˆˆˆˆˆiÅååI““ûüŽ$&%`äˆAH%ЂÐÒz©€Íljç˜A""""""¤•çÖ­8deåˆ.v¼E cX[[1{DDDDDD,H+WVV"ØWâø«ã%"""""¢ÚA¤) yŸ¨ IDATD.—#?_ ¹\®êËÌL/Ò”òóó™½ò÷ßãóÏ?G§NðÎ;ïà‡~`Pj)sss¡–惹«Ù|{úô)-Z;;;´mÛݺuøqãpþüù"ë…‡‡£M›6g€‰ˆˆ4© U(?_¤×¯_/Ò”òòÄÌ^ ˆ…‡‡ÆŒƒèèh9r—/_f`ˆ¨Þšu ±XŒS§.A[[¡ë×2‹ÕüWJJ zö쉎;bÒ¤IÈÊÊb`ê€åË—ãñãÇ8þ<¢¢¢œœŒ+V00µ Ì]Ízï½÷€«W¯"//¯ÄåvìØOOO€»»;"""<""ª÷4æ¢F'Ž]@jjªê¾“‹#œ>ÁìYÞ00Ððüp'™\A…§Ï\@Ôù(Lóñc&«IFFpæÌ@PPæÎËó¡ê€ƒbÿþý055|ùå—5j ÏsW³¶mÛ†°°0øûû#..¦¦¦pppÀÌ™3ahhˆÇ7°uëV€³³3¾úê+$$$ M›6 "± ­i¾Ó¼ B‘þgϲ{ Z/})8 ˆû÷ã˜ÅjÔ¸qcªþÉ B¯^½˜: --Míã6mÚ --©ù`H$‚\.‡¶¶¶Z¿\.‡Hôâ#Ì›7óæÍƒ xðà6mÚ„I“&©.ú¶sçN¤§§£}ûöjÛÚ¹s',XÀ` Òš&@@BÂÿ)x™B¡À“'YÐk¤Ç,V£®]»é+îͪ}LMM‘˜˜ˆvíÚ`bbÂÀÔ‚|0wU£U«V¸sçºuë¦Öûöí¯À«¥¥…Ž;bÉ’%ªçK‰D‚½{÷âÒ¥K°°°P-›GGGøûûCWW—'"¢zIcÎ!ÍÌHƒ¡¡) LTÍÐд ¯pSŽ™!;; 7f«Ñþó,Y²YYYÈÊÊBPP>þøc¦prrÂÂ… ‘––†´´4,\¸ÎÎÎ L-ÈsW5ÜÜÜ0kÖ,\»v R©R©W¯^ŬY³àîî®ZnäÈ‘8räRSS!—ËñÏ?ÿà믿† àСCèÙ³§Z1 <ÿ$ûí·ßÆáÇl""ª·4âR[[[¬ ÝP(„’«gÑ‹Oâ ÆFFðññe«ÑgŸ}†¤¤$ôéÓb± ÀÊ•+˜:`îܹøâ‹/лwo€££#æÌ™ÃÀÔ‚|0wUcêÔ©hܸ1üýý hß¾=ÜÜÜàáá¡ZnÆŒˆˆˆÀœ9sðìÙ3˜™™¡o߾ظq#€ç3š={v±¿cìØ±X³f FÅ€Q½¤UД·E´§yOÎ[ŽŒôŠƒtü§Ãí>O³K¾úêû"1vÜf€¨†äääÀÚÚ÷îÝc0jY>˜;"""*ÎÎí[0l¤k‰ãÙÙY8{ê88:UhûÉI‰Ø²y3B7l< @@ @6€Ì‚–^èvvÁ¸¸`y9РCv‰¨úÈårìٳݻwg0jY>˜;"""ªK0DõO»víЩS'¬]Ëïñ­mù`ˆˆi% úþof€¨x-? Øÿ°ÿ/ÎÃÚ”æŽê‹ Ï»1DD嬭ڳ -å÷Žfþ¹“oaÑFÖ£¹w‘Æ277Grr2A5JY[± -EAÐ'=€;D¢_>ž›#ÆÖm{`ø¶À½‹ˆˆˆˆˆ¨ µ ÒrUñ/nK¥yx A€Y³–€;?•¸¾Y;+4}k$÷>"""ªR¥}V×>!ã'~DµO-­G5ã]ÈË“ ''·`HLJÀȃ ‘J  ¥¥¶®Tš'ÎÁ°Ûî}DDDÄ¢ŒˆêyAÊOH+-h·nÅ!++@t±ã-ZÃÚÚªVž¨¾ùÚ½æ]ë¶MŒ;iFa¨¤¯¯¾}ûâ믿†‰‰I•þ^£DÄ‚´Ž¤%眕•ƒÈö•¸žëg#KÝižªœ¯|.¨{9%*®8LKKÃ’%K0gÎlݺ•!"ªå¯É¢š®â••¼\.G~¾r¹\5ž™™^¤)åçç«mƒ­zÚ2·‹´ ÑVŒM-oY5Ã×î=ð‘U³*ûU9_ëÊsAqók™ÇÛûxëúsð«b_xìååš7ÕÅ®Ýðá[ÍøüòšûWqLMM±dÉüú믪>‰DtéÒ]ºtA@@$‰jüôéÓ0`Ú¶m [[[|ÿý÷e+üÉ,lذo¿ý6:v숙3gB*•y|ÇÇ¡C‡ŠÓ={öÄÓ§O‹,tîÜ–––3f ÒÒÒJüûÍÍͱsçN¼ÿþûh×® €Ë—/#22}úôAÛÿgï¾Ã£(÷6Žß»)¤„T!P„Е¦G@P©"HSÔc9ÒÁÐ)Š DQŠ"G=z|<‚¢¨Aš""-ô’ÐÓCBÚ–÷%›º ¡úý\W®læ™™ç÷lvçÞ™­^];vÔþýû^GVV–"##U»vm5mÚTóçÏ·[§ÙlÖ´iÓÔ¸qcÕªUKC† Qjjj±ûxùk—ZHHˆCõÌ;ÿgŸ}¦V­ZÙú¸wï^‡ûX–º•¥ßÀõÎVÒ+¤‹åÒïËtçÎ~red¤H¯ÃÏøþ´ûY¹í”¶í§67õNŸUwÖ ÐÊm§tg]IÒ빞ÿlüGHoÀþå ˽è¡jëÛßOé—Ýçx޹ T’ ù®+ñæ›oêìÙ³úõ×_µqãF:uJ3f̰µ5JcƌѡC‡´|ùríØ±Ã¡¶ü¶nݪ5kÖhëÖ­ŠÕ[o½U`ž‘#GêÝwßµí×HһᆱÈËË«ÀüO?ý´¨]»vi×®]ªU«–¦NZlÿ7nܨeË–)**J=ôžxâ ­Y³FK–,ÑþýûÕ­[77Îáu̘1CñññÚºu«~úé'mÚ´Én}sçÎÕ®]»´zõjýõ×_rssÓ믿~ÅûŽÔ3¯Í›7ë›o¾QTT”ºté¢ñãÇ—ªŽ¥­ÛÕê7@ µwÃ\e733CéévíM›6-Õ2pm9 º»~ Þÿö ãp«WÍ[éY&ýº7VwÔòÓm!ÞÚ“bk÷÷ª îw†¨V/9 :r悾ÜpB©é&IÒ[ýo×Êm§Ô¶a¼=]4þßÊÙÉ Þw‡©Ix%ed[´a÷9I’»«“Æ÷©¯7—îSzæå7Ÿ<*8i\ïúš±lŸ<\K½¾¼ÏÕ<ôt‡šúe×9mÜ{¾˜>½×Ý¡Š‰½¨ß^>S¤Åmþ ôÐòM1ÓòÍ1jר²|<]—œ©e›bäïíªûšË·¢«Î%fèË_NèLbºí>ßý~Z÷4 R£vMÔòÍ12™­¶×h0¨s³*jY×_®.Fí;‘¬¯~Vf¶å&qw¬Íj•n ñR¿{ªëÿÖסÓxr¹JâããõꫯªM›6¶iÿûßÿ´lÙ2H’^}õUõíÛW“'O–$¹¹¹éüùóŠWHHˆÞ~ûmÛ}‹kËï•W^±­ã•W^Qß¾}5qâD»yÚµk'OOO}óÍ7êÙ³§Ž;¦õë×ëÕW_-t™ëÖ­³Û–^xA­Zµ*¶3f̯¯¯$iàÀzóÍ75}út»i3gÎtx_ýµ]ý^yå»ú~ñÅú¿ÿû?U©’ó /¾ø¢:tè iÓ¦]ÑX:Rϼ¦M›¦J•*I’¬Y³f•ªŽ¥­ÛÕê7pU_³ ÒRÉʾ¼Cêä⬬Ìì|ïdý¢>ùÄî4Þ\kÖl•§§§âvÿOÞõäxÜ C§R›œA1nbwÖ Ð/»Ï++Û¬{Îë®zÚu4ÑÖþt‡p-û5ZýxDÎFƒº´¨ªZTÕgkŽÙæ©à®K÷ÚÂOçfÕäîꤩŸï’dÐã÷Ö$%¥fiçÑDµ¨ã§ŸÿùäY­V­[·NcƌџþYb[~y×qòäIÛѽü:vì¨3fhÚ´iúã?ìŽäå7hÐ ½ôÒKjß¾½*V¬¨ÔÔTÕ«W¯\kWÒ:íúcwÿ   ­\¹RÁÁÁ³³³ÒÓÓmÁ/11±Ìõ,>–EIýn¦×,©E9¢¡ELMMÖÑ£{ }GªKçû´s7èz¸½–ŸÎ'eèlGnf­ª¢»³f>ÛÌ~zý@ýïR讨w…*4ÀS®.9;·æûÿMJµ¿…—GÎ)¡¹óäE·Z­:›˜®3 éj^I;'¨iM?=›ª„ ™e^Ÿ$µo¬mbuâÜÍ}Á‰ïÿVd[ÊÅ,ýv0N]š‡èëÍÑJ¹x¹ŽÔ-5ýrˆÏ¼tt/ÿ4£Ñ`wŸ¼ã—’!o»öÜÛ•<]4éÑFöÏñº¹¿šËjÍ9ó)ÿU CΣy¦ñËq=Ú®†RÓ³u˜Óu¯¹îÝ»kÊ”)zçw$IS¦LQ=líC‡ÕsÏ=§ððpY­V»£`ŵå÷òË/ÛNé|饗ԳgÏBç3 5j”† ¢·ß~[...E.3##C*TP… ­éÓ§—{}JZÇC=dë›ÕjÕ”)SìÚŸxâ 7N¯½öšBBBtøðaÍž=»ÀÅòª_¿¾,X Áƒ+99¹À2KSÏòècY8Òo¾«Ò[(ZeUtôBç3 ^{Éb±())Y'WéuÐᎪZ²á8µ¿‰¹8Õªn€^út§â/\¾¥¿wëÓ@ßn;©l³EÏtª­å›¢u"IYfUpuÒÛ›J.§lùy¹Ú‚¨ŸW»ùÖí<£®-«éCñº§qe-þåòc©,들Y_ïÓ¨‡"t1äŸÿ>vÓrŠÚ×6÷І¥¤H¯‡Õ+)+Û¬#§S(ÆMìŽ:~:~.Uq)öŸŽKÎЉóiº£¶Ÿ¶î•‹“QÙÙfe™,òórU÷»Â ¾¡”ïpûÁxõº;Lÿ]{TI}ZW·›o_t’zµ®®¶*+3ˬ˜ó©vA¹´ë“¤Ä ™zwyN(5 ZýÇÍùŽuQÏg®.F=u-}üãa>"³Åªg:ÕÖÌe{•m²”¹n%MËGIêÝ:LÛĺÌ{ÎéÑöáZ²á¸.d*Ø×]›‡è£Õ‡nÚÿ‘{Îéñö5µdÃ1ÅÄæ„ÒÐ@O=rO m¸tݼuØu4AddëÙ®uµ|Ó mŠå‰¦œ”tÊÍÍM3gδ» M^=zô°;bêh[ÞõæÞ:t¨CÛ¸téR;VÎÎÅïjuîÜY;w¶›öÌ3Ï”ª%M+i*TÐìÙ³5{ölÛ´!C†ØnF1B#FŒpxÌ6l¨Õ«WÛM{òÉ'íþ:th‘õ,ï>–¥nŽô›££ Þ"Ô·Z„æÌýD’d±]H£ñòi»‹UžÞò¬Ó…@zuj¢wœ¦î7¹¶*ëÛ­1…Žã†ÝgÕµE5m‰:¯ÿ®9¢Þ­«k w%¥féç?O«YÿbƒÎÊ-ÑzìÞšzí©Û•‘mÖÏ;N«AõJvó­ÝyZµ¯¥÷VDÙM/Ëúr§%¥fêÝå{õ\Ï2¤U¿Ÿ¼éÆeÞð; L:w‹úÝ®uÕ¡SÉ’¤]Gà]AÜSCŸý|äŠêVܴçS4鱯ªà⤇âµ2ßc&÷öêí'Õ±YˆF=!OWKL×÷¿Ÿ¼©Ÿ'~Ü~J™Ùf=Ö¾¦‚*¹I’Î'ehãžsúe×ÙBkvèTŠf}½WûG¨¢›³~Úqš'›¿‹Å¢/¾øBÇW÷îÝ)i º|q`ƒr¾—ÔiÄÐÁsæÍWB|\™úý·+ôøSÏèBJr‘ó|½t‰6§6ä‘7¨#ïÒà9[(®Ûãïf¢ÐÐP-X°À¡¯¯û»ºÕ>{ÉgIq#!^¡¡a£”BªUSbR¢²M&ê˘Q?)ÊÂb±Üt§ßÝœ]d6›eµX¨/cFýnômgønl\MôÆ©ïÚõë5æù vÓ¦¿öª:u¸ŸBò?)PþL&“Þ3Wÿ·x‰:ßßVvë®?vl×ê~Ô “&ké×_ëù1£U»V-Šu,ÿz™–|µ¸ÈöáCGè®»þÁ…«¤ÀÍaëo¿kÕ?håw«lÓ¾ûf™,f³|¼+©NíÛÔ ~C½?žÎŸŽQßÇþ)IêÓ«§zvï®úõ(â5²ä«Åêׯ»‚‚ ´?§÷ÞŸ+Ijݺ Å"àj6b¨âe4 ÙïÌ¥(¥ôóÚu7áE½:e¢ìÚY>>^JN¹ Y¤÷çÏÓÖ-ÛÔ°Qõíó°úõë§ŸþYÿó1¥¦¦êüùózüéiþÜ9º³e Šy(*jWéåçë¦÷ÞŸk ¦EéÔ±³þõô3“@ )ç³r¥ý¼\||œ¦½1]GÕ‡‹òy»2ÔwÜ„5÷7XY ‰ JMMӉǴeË&ý±}‡Îœ9£#GŽ(::Z½{÷VDD„ü|ýe6›Õ°ACU©RUCFŒÔŽ­›)ò5üŸHII+0mÛ¶-êØ©c‰Ë=~|¸î½÷ÞëÖß[)ø$$\Ð’/—:<ÿÃýú”x&ÁÞ½{õüóÏë×_•$µnÝZÓ§OWÆ )À­ëJO¹-Ëý-‹,X ™3gjöìÙŠŒŒ¼ªG\¯çiÅ…­»~D„¾ÿá'µl~»j†×’Á`Pvv¶¼½¼e2™&³Ù¬ô‹i2§¨t1-MgÏž•§‡»¼½½ ]ö£>ªš5kê§Ÿ~Rhh¨´~ýz½öÚkjß¾=ø+x¼äŸž˜_â²|}ýmù¢N>räˆ:tè —_~YŸþ¹$iñâÅêØ±£6lØ Z\]¹ÌŒ”ùýðÃòõõÕ°aÃäïï¯Õ«WÛµ»¸¸ØngddhРAò÷÷—¿¿¿¬ŒŒŒBçÍ?-ïï¼ó™ÍfMœ8QU«V•···üq]¸pÁîþ³gÏVxx¸\]]˽ÿ>ÒWkׯ“‹««¢cNhÍÚŸ´{Ï.:|H‡ÒŽÛõûömÚ³o¶lÛ¢M›Õ‰ãÇ”˜ sgÏê¿_.U·Î…nqýúõš6mšjÔ¨!'''ªoß¾Z³fC5˽ýöÛo+$$D>>>0`€233KÕž¿~ù—ÿÁ¨N:òôôT“&M´iÓ&}úé§Šˆˆ‡‡‡š7o®={öÜ0cfµZe±Xd2]>]zçÎ%þ8â•W^Qdd¤(oooy{{kàÀŠŒŒÔ«¯¾Zâ¸%$$¨J•*JLL´kKHHPHHˆ“«Y?)Jeøˆ¡zü‰G üTòñ‘$ ùxûè±ö³ûyü‰G5|äÐb—½`Á 6L’4dÈÍŸ?¿Èy§L™¢3gÎ(**JûöíSLLŒ^zé%‡úmû{[’¦OŸ®;vè·ß~Ó©S§äææ¦ &ØÝ÷·ß~Óo¿ý¦¬¬¬r¯m×N´cç_znÌXmÙú›ªW¯©ŒŒ ]¸pAçccåSÉWq± ÚuPÉIÉ2™ÌÊÊÌÒ¯[¶iÿƒr65&rt¡ËþÇ?þ¡!C†hëÖ­JOO/ó6nܸQþù§:¤óçÏëå—_.U{Iõ[³fÖ®]«ØØX=úè£zðÁõý÷ßëÇT\\œúôé£Áƒßc–FÍ&‹,–Ë´iÓ¦%þØ‚Q1g¬Y³F>úhÁ7.}Ôî„¢øùù©W¯^Z´h‘ÝôE‹©_¿~òõõu¨>Wó1½pÊ.ÀM*åBЦ½1½ÐsƒÁ WWW=ñÄ“2 Úß›Wô×_;vLÛ·o×’%K$I?ü°^xá?~\5jÔ(0ÿâÅ‹µfÍI’fÍš¥:èÍ7ß,sß>þøc­ZµJÕªU“$½ñÆjÖ¬™Þ{ï=Û~rv±?2eÊÎ’Ùd’Ùl’)+SÉÉÉ SlbJ‘ËüꫯôÖ[oiРA:zô¨‚‚‚Ô£GMž<ÙLñÎ;ïØjþÎ;ï¨C‡š6mšÃí%Õoþüùò÷Ï9uäÈ‘šUä¶yx¸ë¥—¦è¥—¦ÈjµêСCš={Žyä}ûíJ‡kVµjÛßU«VÑÙ³gKÕ^XýòþíåUÑö·³³S¡ÓL&“íïë=fƒA&“É.æ=ê¨Â¶ÏÏÏO'OƨjÕªvÓOŸ>-‡ëáá5T¯^=-Y²D}úôÖW_-U«V­\ÙvŸ’Ƥ<êG €Ã¬Ö¢/àâíå­ /¾PèôþýÈ`0hÑ¢•r!Åv)÷PåÊ• ]nFF†>ÿüsíÝ»WÕ«‡Ù¦?~BíÚµÓ¤Iåææflƒ‚‚tüøqÕ¬YSRÎÖÀÀ@[»³³³ÒÒÒäáá!)çssyïŸÿ¶$kíÚ5@q÷)ïúJ9ŸÛsrrRÅŠU¹²Uun«£Ô´TUò­¤èèùøøÈÕÕUf³ÙüFƒÝ%©S§ŽfÌxSÕª…–ªfyk~âÄ •ª½°~—¦=ÿ´aÌriîc9]ƒ† rx¹‹ç¼ðô3OéÍi3lG—%©]»vúòËÅŠŒ|Îî>_~¹XíÚµsx܆ ª7ÞxC½{÷ÒûïÏÓ»ï¾{ÅcB ÀÕŒ¤EýÖÌB§ò¬\\\d0”v1M-ú¸ˆû‚Ë]ºt©š7o®°°P»öêÕÃtÇ·kéÒezüñÇìîß»w/7^óç¿/I7nœúôémkoÔ¨¡fÏž­‘#G)))QÏ?ÿ‚Ýý}||tðàAÕ©SǶ¾þýŸÑˆ#ôÖ[o)44TÐ[o½­O>ù¸œwÎ ¯oÞÏè™ÍfU­ZU‡V%_EDDèĉ’$777999ËÅÅEþŠ‹‹SRR²$)33Ó6yƒi—.]5pàµnÝZþþþ:sæŒfÏž­-Z8\3Izþùôþûó$IãÇ?¯¾}û–ª½¼éõ³?ùXf³Ysæ|dZG>7Jté¨fÍ)++UéY²XrÞ80[,—>sj–ÅlVvv–ÜÜ=”–š­eË¿““““Ý:&LxA;v’··—úöíkû_™={¶~úéG‡ÇíÞ{ïÕ /LЂÈÓ³¢7nü·¤\ÔàFŽ£—Ž•æGÊ9²W¡B…Rß÷ƒjàÀ…¶õïß_ .´;õ×jµjòäÉ RãÆMÔ¸qWѤI“lísæÌÕ·ß~«ÝµmÛÖîþ#GŽT›6måååm›©;ï¼K<ÐMAA•õÌ3ýÕ­[7»>–Tƒ²Ô×l6Ëd2éâÅ‹vóå^¡ÖÕÕUžžžòööV%_ŸKGPvÓÉ)çôÖ3gÎèâÅ‹2›Ívëxþùçµté25kÖ\þþºÿþû•–vQÿùÏ'×L’îºëNµlÙJõë7ŸŸŸ&N|±Tí…ÕÌÑö¦]¯1Û¶m›&M¡—¦<§—§<§É“GjÒ¤á2¸ŸêE„)!ᬒ’“•šzA©R•ššª´ÜŸ´T¥¦¥)55MÙYÙJJN–Ùl±ÒÜŸÚµkkÅŠZ¹ò[Õ®]Gµk×Ñ7߬Ð7ß|£Zµj9©'Ÿ|²À}Ë2&·)ÀG¯ðè‡Á`pø³ŒŽú믿 |ñV©¯ÉdVzzºâãs>û—ûU4¹Ÿ›-NJJ²<==e¶Z$å!õððPÅŠm÷¯T©ä«è&%%:¼íWÒ~«Œ™‡‡§¬V«222eµZlŸçµZ,²Xr¨ٜóµ<&³9gšåÒïK¡433SV?:yF5ÃkËÉùr udÌJ3n ÜD;ße ™™™²Z­rrr’Ùl¶FZ:uêl»Bì­V߬¬ÌKGIsNÙõöò¶µ™ÍæB—‘––f»íçç«3gÎIʹ@TÖ¥£r¹ëHLL¸â I µï›«««²³M2™LÊȸ()çM‹Å"‹Ù"‹Õ"“Ù¢ìÌ,™-VY­—¦[.!5[”••)«¤Ô´‹ªTÉ ÌŒL¹8»8?XÁÕUÔׇªÎ÷·“)Û¤àà*ÊÈÌPrr²Ý¢c¢Õ¶m[yx¸+6.QSXµjªèé)· äd4–{­â‹]fIí·Ò˜y¸»kåÊ5z¨Gg%%”Õj•Ål•Åzéé¥à™••-³9çöÜ£§9GSÍÊÎ6Ëb–“T§¦›232TÑÓ“§)y´´G^&ÔS,ZxÅËnßù>…‡‡ËÃÃ1#@7ùW:Ülõ5 rrr’‡‡‡\]]åãã­àà`uíÜINNF9_ñbµZe0l[,™L&™Í R… äììlûRÆðꙋ‹‹5j¬Y3gûu)KÎŦrÇ,÷B_¹mf³YÎÎÎòð𰻊4¤ç}ovŒ¯C}F£\]]m_ïreë`ü®ö˜åŽWù­ƒ1#üÍFY8BZj–K&¢¾Œõ#  ƒ|}ýtêd´üó\D%KHLŸŸ¿ F#õę¥åää¤&M›jó¦Mjuç] °}æ …³Z­Š‹‹ÓoÛ¶ªyó–ªPÌ)œÔ—1û»Õ@ €RR£ªT­¢&MšjçŽ?”œœ,³ÙLaJñ•|}Õ¤IÈÍÝú2fÔ@ €Ò3ÈÕµ‚jש­jÕBe2›d½t•PS5£Q®..r÷p§¾Œõ#àJ899˳"»lԌ٭ÉH R)€@êÐBFY¸âÜ0¬V«ŒÆë˜äUÙŸJ•{ž€DJr’|*ùÞPÛtU®—Q¿~]¿N·EÔS%_? F®«Õª¤ÄŒÚ¯Û›7¿õ©O%_5lÒD‡Ôî¿þâô]¸NŒF£¼}*©Q“&#¤’¤€À FPxX¦)€@ @ €@ @ Há(ÿ€À¿EÁó÷µ¤¿Q~,‹žzú_zûí™8´ß°oy“ÒÜ`õPÏ^²Z­»z#õñf®wTT”é×OaÕk(¬z =Ò¯Ÿöí‹*Ó²&O™¢;î¸]cÇŽá €tß)ÿÏõ{Ëï\¯m?räˆz÷é«j¡aª¦Þ}úêÈ‘#ezŒ\¯>”÷¾åø?p-8_ílܸQ}ô‘ú÷ïÅÿì·‚’úúwªEIŽ;¦‡zöÒ„ /hчJ’–-_®ž½zé‡ïW)<<¼TË{ýµ×(*7ñ~nýûP—®]ôÑ¿I’æ½ÿ¾ ¨uëÖ:ôøð¼î—òÜ·¼Ñúv-]õSvï¿ÿ>½<õ;~¼ÄwR-TA•ƒuîÜ9[ûÙ³gT9X!ÕB•˜˜(«Õª÷ߟ¯æÍ[(¸JU5nÒT³çÌ)p$vÁ‚ä¨À ÊЍß@‘‘£uáÂ…ë-l[y£¨iWrJnþöM›7«Sç.ª¦j¡êÓ÷a­]»Îá~·nGêèHrÿ^´h‘7iª€À RÕ®(o¾9CÆ ÕÓO=%///yyyéé§žÒ°aC5cÆ[vËœ3w®êÖ‹PµÐ09R™YY¶v³Ù¬W_}MuëÖSHµP 8P©©©v÷Ÿ?5nbÛöã'NèñÇÿ©°ê5Tµjˆ~äÅÅÅÙÕ4_YOaõ(n;Àå×É?ùDMo¿CÁUªª]»öÚ½gO±¯£%½6gddhè°áª¦zõ5gîܯ͹~þyînÝFÁUªªéíwè³Ïþ[ì~AY¶Ç? P}ü±îhÖLUª†èîÖm´uë6}ñÅ—jѲ•­ßyÏsd™EÕ­¨m/ª¯ÅMiÓ„_´›Ç`0”©_ÅÝ/ï;ñq±WôdzÏÒöíÛõáÂtäð!©/-t¤ŸÅm‹£ut´FQQûµeó&ÅÅž/—ÇÎú_~Qß>} LïÛ§Öÿò‹Ý´-›·hÓ¯µóÏŠ=«éÓ¦ÛÚÞ}w–vþõ—Ö­[«û£äææ¦©S_±»ÿ;þкukmÛþØckðàA:x`¿öïRíÚµ5iÒd»šæ¯§#ë)Iþí—mÚ´I߯úNGÖ< ÈÈÑžޖôÚüÆÓ”’’¢;ÿÔ¯¿nÔ¶­ÛŠ\÷ÐaCõÂóÏëĉãúvå mÿc{±ûeÙIúå— Z¹b…Ž9¬>½{ë‘~ýôÓÏ?é_/×±£GÔ£GEŽ]ªý¢êVÔ¶Õ×òÔ©SGÍ™=G)))JNNÖ¬Ù³Õ±c‡2//­_ý =sVÛÿM¿ÿ¶M'OÔoL+q9¾¾¾êþ`wýçÓOí¦ÿçÓOÕ§OoUªT©\öùUÖ~\˱¼R†K?¹·’œF œ1gÞ|%ÄÇ]Ñ»X¹ðï¾ûNO>õ´¦N}YÇ ³kË?ï¾}QjÓ¶­ê×ÐÆ $I­Û´UTT”~ݸAºýŽ;£í¿ÿ¦ððp%''«f­Úª^=L;þø£Ðí1›Í ª,?HÒÑ£GÕ㡞ڽë/IRÓÛïÐÒ¯–¨víÚ’¤ØØXµi{öGí³ÝïžÝ .r[ÒÓÓÕ´éí:p`¿í>ùëéÈz {<ä­cIÛÀ­ª¨#Hy_':(___Ûksðšvûù_GKzmnب±¾ýv¥jT¯.)çãBÍ[´´[gîíÆMšjäˆáêÚµ«ªV­ZäëyÞi¥Ýÿ€@:x@~~~¶>V +0-o¿YfIuË¿íÅõµ¼œ9sF]º> ˜˜IRhh¨~ø~•ÃûA%íC5hØH+W|£š5kJÊùÌj‡zjÏî]%î—:tH}ú>¬?¶ÿ.ggg™L&µhÙR+W¬PµjÕJ¬yyü/änÛ•ôãjŒå©“1úpáBÍ}Áw’2%¥KJ“”")ñÒO|žÛ)—ÚÓ/Ío’d–d‘d•®ÑUvxà=þøczãi:xð`±óÖ¯¡Ö­[kß¾(íÚ½[»víRTT”Ú´i£ˆˆIÒéÓ9ÿ@Í[´”@ jÖÊy0ÄÄœ´-gËÖ­êÖíAU¯®€À UÎy€&$$ÞTOÎ/N˜ ƒÑ¨{ï»_¡¡aºïþú%ÏÑÁ+é§#u,Õ?O9†ÑÜw¨bc ¾1k{RÎfwûüùóvOx­î¼Ëv:J½ˆú¶Óosåòûí·ßõ@·n «.ÿ€@U S|BB‰O¬%­§$„QÀßY¼?ù÷ r¹»»Ëd2û:ZÒkóùóçZ­šíïÐÐÐ"·í?Ÿ|¬uëÖëžvíÕ¬Ysý°zu©_×ÙWÈ»ãîî^è´¼ývd™%Õ­<úZZÆÐ#<¬£Gëè‘Ãzøá¾:lx™——¿Ö±±±ª~éIª^½z¡û•…©S§ŽêÕ««•+¿•$­X¹R-[´TµK•òØçsÔ•ôãZ啺f_û2í7T%8ءڠgJ’/^¬//¶›&I!!9é~Ô>»'¬Øó—?wÚ¿ÿmÙºU ~ 3§OéÔÉœw_òÎÔl6ÛN%>sæŒÃý)ëýJkРguäð!ýôãjMœø¢vîÜ©g .u? ãH¯e_ó»§m[}µtié_-]ª{Ú¶µ›m»£ÀÀËï²V®\Y{vï²ëcI§Ä>Ó¿¿ô ½{v+.ö¼Ž;ZbMKZ³³³ÒÓÓm'”pÀ•)éµ900P1'OÚíCåöÛo×çŸÿWì×ô7§8]¸<¶çjô±,Ê£¯%Ùºe‹Fm÷Ò­[¶”ÛòíöOœ8¡€€‡÷ˤ.”$}ðÁB >ìªÖüjõãZŒåMH===µ`Á|íÚµ«Äy;w°P-]ºLË–.SõêaêÔ©SžÀ:H’ôòÔW”œœ¬+#.ÎËIDATÔÔTýüóõéû°]ˆ’$oooeffêÕB®‚•{zÆêÕ«uñâE½9c†C}qä~ÞÞÞ’r.Žs%ž|êiíÛ·O 6T›Ö­%Innn¥êgQÛâHËZ£¢”æ¢FãÇÓ¼÷æé“ÿüG.\Ð… ôŸO?Õ¼÷æiܸ±vóNš4YqññŠ‹×ĉ“Ô§wo[Û¿ž~Z‘‘£uìøq™L&íÛ¥»îŒŒ ¹¹UP77ˆŽ¶û¬†$ùøøèðáÃvÓJZOƒ ôÞ{󔞞®3gÎhÌØ±ì)p•ôÚÜ«WOMž«(;;[V«Uf³©Øý‚²lÏÕècI ÛöâúZÔþ]iÕ­[W³fÍRrr²’““õλïªÞ¥³!ËCÏžéÅ'*..Nqqqšðâ‹êÕ«§ÃûeíÛ·×… ´hÑ"yzzªq£FWTó²^ÔèJûQÚ±¼¥©$µhÑB‘‘Ï•¼QF£ Søøxõïß_FãåM4èY½óÎLíÞ½Kõ"ê«a£Æúpч6tˆmž…,Ðm·Ý¦=ÒÝ­Û¨V­ZÖ3gÎlÝvÛmzú_ϨM›¶jѼ…Cýpä~ãÆŽ•š5k~EßôÄÿÔËS_Qðšz°{µlÙB^z·ÆÑ~µ-ŽÔ±¬5*µk×Öòå˵jÕ*ÕoÐPõ4Ô·ß~«eË—èg«;[éî»[«iÓÛåëç§ ^°µ5RwÞÙJ={öRµÐ0=;hèú@ñc<{–&Mš¬ÐÐ0õèñZµle×>|Ø0Ý{ßývõ,i=³f½«U«V©FxMuéú€Ú´iÞùvÚËó;Kzm~qÂUôôTã&Mô»ïVóæÍåââR貺tí¢'ŸzZ¡aÕ5uê+Z0A±ûeÙž«ÑÇ’¶íÅõµ¼|ðÁm޼Ŷ·mÛoZøAù­gÒĉ T³æ-Ô¬y kbž‹›:²_6xÐ Mxq¢Fä9:zµÆñjõãZŒå•ºj5®å‹ß[®Ô¡C‡ôH¿~E^$ø»»i/j܈&N𤤤$?^“'OQ×®]) p Hð·¦–­Z©y‹–òññÑ„ÿoï^vÛ¶¢0Œþ–ÜmÑëCÆ( tœ÷m;íIl]¨BÂ[LJº¸@S3k-S  zôaRoÞ¸(ðºu xé,מëîîuîî^»ð‘˜ H¤ H¤ H¤ H¤ H¤R¸Ø¡³¥³¤ü? R®ÑNE{ÓÒúÞY·§þúËÏ.5Õ0†æ0¢/á ÒŸ~üÁe µ/ÛPöÓv2B«›q›~^%YÛ«$Ÿ'ù2ÉWI¾Iò}’o“|7¾þ:Éãû^»ÏSÏ ÀËS§œS|î’l’¼Oò.É_IþLò{’?’ü6¾þ;ÉÛ$÷Išˆ=$ý i;j­¥»+Ûvü#¦Íøž• Xd%H·ã65bœg—îÞŽ¿¼IÝï¡SÂÓ‡oÆÊbt?žoU~'H–¥µ ·ù0ùœ¦Ÿ5Pk˜'Î7;!‹Ñm ÑûOFw%HÛ¥À¼Ü ­}Xƒô}'Jw9ž”Î=ühö¡FÓ÷½/á™ñø6Kw×%HÅ(Àr‚´6â4¨|›÷’Þw¢tŸþ×Á$ÉáöLù¶7­öbt4Xr&ýMSÒwyœ–nr<%}ö„´Þ°º.[ʱ‡$Ÿ•P]•¤/?Hë}¤uÙnÒº|wš’™ŸæÜ„t*ßõøAí2Ý£ë&H#H¤i‚´ÞÚùÇ廽e»g'¤‡½Vë2Ü¡ Òzïèª QA °Œ(mŸ¶Û{øí¦éÉ­AÚû úxÞm96}pýÒúÝ£+ÿ+€Å†é§“ÒéVÏ)P{Òö<ÝCÚ~ð¤u*z“ã)jb: °¤mÛ°mÄ]Ùö¹rBÚ.ÛÆÈìEé´Œw㩨¥ºËŽÒºt÷ã§éî›}×'qÛ Çvʹº`/F>Ý(=·£—éôúÜvîœ,'Hëës[® ÒS¡Z´7£ŸN”:û¹ï=\ž—„©¦saz2D¯ É›y€åGéÕÇŸ“€çê‘•ëÀÇðÑæƒ‡¾nDÿIEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_design_fields_dialog_calculated.png0000644000175000017500000007242512235000130031057 0ustar00murraycmurrayc00000000000000‰PNG  IHDR³Ê‰À¥ŽsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ ]‰« IDATxÚìÝw|eþÀñÏÌn$¡’" ¥ªØ~çéyb•& *žT=õô<ÏŽ ¨wJoÒ›ôNB Ù$$¤m¶Ìïl–Ýd³%”ïûõÚW6Sžyæ™gæ»Ï³³ó(øNA!„¨Xš/ «R^B!ª;¥–‘–šBˆŠn‰iå¨ó$  !„(@¦¹ ^š¯Á¬¤ ¦¸fÔ„B”wÓ^ƒšË ¥išUÊX!DER%¸H€òô*1 é¥8…B\#AÉj{ïé¯Kz/ZjNÌŸ#Å/„£³çzZ$°H ³ØÞ[ÞÎW‹4Å1¸¹ü¾ËU7ã‚ùsˆŽŽæî{ï—#$„£¯¾øŒ³gÏ–ÔE¹¾HËËb{™^‡À檅¦yÌÌŸÃÔgf™™!GH!j°+™˜L¦R­ëççG½ú!×­ À¯½â2 )ŠÒ½HK¬0€åÛþšl/s‘V›ãwh%3EÓ4KÑ@–‘qYްBÔp—/“}…õëÖ–jýþn&8¸! ا]LºÀª•+Š4EQi™lÌhû[ø2•ÐJ³·ÁôE[eEÞ]ØZ“£,„5XfFW23ظq=ûˆ½…åK‹î£,§_¿þÔ )KŠhP$m/WŸP¥9´È¬\ý‰˜SPrõ›1UÓ4Sa«ì©)ÓȺrE޲BÔpW23YýãJþüà_iVª4Ο;Ãwß|ÅðwP¯~}ûôäK‹µÎEW¤E–äÚ^Ù@ŽmZ^‘šµHëLóêÖü’Ze‹^ Õ?ȧmÈCÞN§“š#„UP£Ð°R÷Æ5iÒÌcì(Ò23;2½C‹ÌBñBÜáÄÕ­ùŠ·ÁìÐÙT’rü}ÚÑ0ÅÀÿÝ{AAARcj°—^ZÀÌ™3ªdš‘¿ªš‡ª°¯¢zP¥\Óò"˜…Ø‚”ð§ {[«Ë±ÅVØí¨âü4*­¤`æSËlÌàÞ <EUQUEQQUU-ø[𿊪(öe^]´MÓä;¸*Êl6óûöí9|„´´4, uêÔ¡qãpî»ï>ŸÓ«ˆãìKš ,`ƌ镖¿ªPFUu_E•f.'O|òI–¼ý¶WÓ Óò¢ÎÕ·,?Ìh›®·ÍÓ¹i™)®‚™×-3EQ|¡I0«¢ŒF#ŸýûßR ÜzË-tìÔUU¹páÛ·o/Õ1»ÖÁ¬¤u¦ON‚™ž.þ.‚Zaà* dîÒò¢ÎÕ±3Ç®Å|[+Í1¶ÈжÌpl™9Þü¡øth ¨ª=P©ÊÕ‡ru:Ë((̪¨6réâ%n¾ùfb»ÅÚ§GEEåtÌvìÜÉo¿þ†¢(Ô©S‡ë¯oÃÀñ÷÷/±îì߀]»vb0¤R§NúôéCll /¿ü Ï=÷¬}yWÓŠ¦é.…ë,\ø²SZEÓÖ4mÛ¶±wÏ^®deQ·^]bcc¹¡wo{×Ká:#F gËÖmd\¾LÃF2x0QQ‘nËvûŽìÚ±“+YY4lÔˆÞ½ã‹í¦iìܱƒ]»÷™™IݺuéÞ½ñññ»Ü•íÕeö»Í·§cZ¸ÿC‡eëÖ­\ÉÊ"´Q#úèObB" ''‡ðð0BóæÎåvÛ¶mûôôtêÖ ¦WÏžÄÅÅɉW¥fŠËólñ’%Lš8Ñe[¼d‰Ëë¹—ÝŒAEZd&‡@æçÐ"Sq=þ¦½«±L-3”"­3Ç å0OuXF³¥'Á¬ê9zì(:´÷x|Lù&Æ}˜ 8tø0?­þ ‹ÅÂðáÃ]Ö]»vñ믿qÝu×qÏ=÷°eËV§í”Tù‹Nsüß]>ž}ö^yåUž}ö·imݺ 6ß«}ûõeÃÆlX¿EƒÞ7ôvZçü¹ó<ô—9}æ +¾[ÁêÕ«™0á‘Ëj×®]¬ùm íÚ¶åÁ!ƒøåç_Šåá÷íÛY·v»tfð­·²ý÷í¬[·EUéÕ³§Ûô=•­7ùöö˜^¼˜ÄÃÿ•sçÎñÍ7ßòõW_ËøñãìÓ~øñG?Îi½ÇŽó§ÿ»EQøåç_øÕ8»wï.'_ïf,Ч¹Kˋ뼿C‹¬°%¦/Ä<ÖBIÁ¬³)ßMSRAQ‹w'ªŽ-3Ç`¦Y1›ò1ëånƪ&++€À·Ç gœí¤Yißöz~Zý'Nœ,¶^áÿ;¶ïàæ7áïWPíôïç´¼¢(.·[Rš¥ÉGIiïÙ»€nÝb@³Ò½[,;¶ï`ÏÞ½ÄÅ9_l{ߪ@«è(222Ü–×Î;èwS_û¾÷»©/ÇŽwÎÃîÝÄ÷ŒCA#6¶+›6of÷Î]t/ÒÊräMÙz“ooËòÆz£*Ùâê´Þ½Pˆ¶µô.§§[ÏqÿûöëÃÑcÇØ¾}]»t–“¯ÊÄ2ÕáÜðüwË(b‡C ²ºb…ß¹ h¾3·ß™©]‡W[g®›s NZfUSpp0W®\!++‹º¶Çи’˜˜È¦Í[IIIÁd2Ùe^^^‰-ŸLÛoëÖ­ëöØûÒ2+M>JJ»ð·”AAAhšFP`ÁóO¯\¹RlݺÁÁhšfï’ñTŸ323Ö¨_¯^ñ2Ê,ÈÃ?>üØiýLy(:ß›²u—o_Ê200Ð)Çrsܧ’ÊÍqÿ¯xØ7Q¹Tõê1µX,Nó¦M›Vlù)S¦°hÑ"§i…?»R«Õã±Õi…9v)ªî‚Wù³b7xù«ÜÕ¨ØZjh iòetUÔ¦ÍuìÙ³—#GŽÒ£GÉ]??þøYÙÙŒy-££°Z­,yû]—°ÂÿëÕ«Gff&™™™„„¸~ª€ÕjÅjµ¢( YYYƒYiòQRÝ&++‹ì삃ë“cËw]¯ÒrWŸëׯOFFW®\¡¾íG¤%–Ñ„GÆS§N×é{S¶žò]Ö²ôfš«ý¯W¯ž\ ªh7£Õzõ½Ï>{õ{ëW^yÅiÚ´iÓìÓƒ™—ÝŒžnìðؽè˜WÁÌÕ«0`©Žß•©UÇÀF±–™¼ªÖ«w|<áaalÙºýû`41™L$$$òýÊUö嬶 àç‡ÉdbÓ¦Í%~"/ü¿»í†’µëÖ“C^n.ë7l´Ï/¼Ÿ º½._vÚ×¢ËuìЀ]»wc2™Ø½« Ë¯s§N%®SÒ´¢¯Â1ÖoØHnn.¹¹¹lظÉE,·qÓ&òòŒFNŸ>Í·ß­p›¾§²õ&ߥ9¦ÞN+´~ÃFrrrœö¿[lŒœ{UèåØÚ¶Z,öW¡… ا-\°Àí²E¯õnz#‹Þ„èònEO-´2µÌ¶ïøã'ŽÛ3~õ¯âô=¢ã¼ôô4@º«"?î¾ç.öìÙ˾ýX¿a#V«•ÀÀž0tð­¬Û°¯¿ýŽàà`ââzxlEÅÄtE¯×³wß>>øð#êÑ;¾—}þ-· díÚuüðÃjêׯOÏžqüãÛ4½ÉG|Ï8~ß±ƒ>þ€§&=é2­øø^X5#G޲gÏ^‚ƒëлw}eëM¾KsL}ÖºUK¾üê222®ÃM}ûÓU®U©aV¤§¤ÐK/¾Xlš»é…iUæ±-U@§iZ\}6câùs.WÎÏÏ/Ö¯êM360  \i.„¨º/y€IŸÂ¨â‚êóÝ7_2iò4ÒR ¥J£nÝz,{w1£ÆÜCnN¶}ºÑhtõlÆ)øqtá³3tÛ+Õá}¦m~®myÇ!a´2·Ìüüüðóó+Õ˧1!j9ç«AËÌÖÈHK5`µXK•Æ¥KIö´*ó˜ë¥ !$˜ (¸•~Ô˜»ù×'1è–Á„úøäüÔT¿ýú_F¹³)_‚™¢æxâñGå:RMäææÈÈ;ÇðýŠoJ•ÆÈ;Ç`6™ÈË˫ԼK0BáÐê֭ǘ»ï+Õú³™ÜÜÜJÏ·3!„N®\ɬvyö̾øìS9²B!ªw0»÷þ0Vrß§Bˆš%1á<«V®¨°ôU)b!„Õ3!„Ì„B fB!„3!„Ì„B fB!„3!„B‚™B f5RhXxÍCUØ79þµóØT×ý“sF‚™¢š²Z­üå¡¿òÚk—ÂÌäÕÓì矧{÷nLútµiíÈõC”–^Š@ˆšé¥_”BÒ2«gΞåþûÿLTtK""šsϽ÷b0Š-—žžNÛví¸|ùr±éíÚwàòåË^§`±X˜?ÿEÚµkOó‘Œ?ž¬¬,·Ÿ§…†…³té2ºt!,¼±ËmóóyrâDZDFѾCG–¼ý¶ÇOœî>…šL&fÍžMÛvíh}]Þy÷]§ù}ü1±ÝºÓ´YÜ̃½.çаp>üè#º÷èA³ˆæôéÛmÛ~çóÏÿCÏ^ñö4:ì´Îâ%Kh×¾-"£˜8iÆüüóÿ믿ѧo?š6‹ ¶[w>ýô_>¢åíËñ®MõÎÕ2ž¶ëîØx[O §…†…;Í÷¦î•TwKJÓÓþøz.úšž`VÌŸþt?>:cGpäÈaÚ´iìY³‹-×°aCî¸ýþùÉ'NÓÿùÉ'Üu×4hàuZo¼ñ&{÷ícíÚ5=r˜ÀÀ@æÎçSÞwíÞÅÚµk0¤$»œ¿pÁBR ©ìݳ›Ö³qãÆ2•Õ+¯¾Ê‘#GY·v-{vïâÂ… Nó7oÞÌO«äÔÉŒ1‚É“§øTÎë×o`ÕÊ•œ:y‚»ÆŒáÞûîã¿þß}ËéS'9r$“§LqZgë–­lÞ´‘½{v“’œÂË _.1ÿ?ñ8Ï=û,gÏžá‡U+Ù¹k§OÇ£hyûr¼kS½sµŒ§íº;6ÞJ5¤Øÿ¾÷¶¬Kª»%¥ék9z:Ë㸈ªG±½ ß«€NÓ´<€óçðÔ”i>gîTÝÉÍÍ%6¶G)6ïøñãÜu÷=ìÚ¹½^Ùl¦g¯^¬Z¹’-ZxLË1±ÝºóõW_Ò¦MRRRèwSŽ>Tbž§…†…óÇÁ4mÚ´Ä}éÜ¥+«V~O«V­8yò$½â{;¥ánEuéÊï¾åºë®sYÆ'Ž£aÆö}oÙª5—.&yUΡaá?v”FÙç·ˆŒ*6Í1ÍаpvîØnß¿S§N1òÎQØ¿Ïå6»ÆÄ2iâ“ >œˆˆ§yÞOåí®îx*ÛšTï\-ãi»îŽ7yrW§½)wu×UšžöÇ×sÑ×ôDù(ÏlÆì¹W¢ü\ ÈÒm¯T‡÷™¶ù¹¶åÍ€°Z¥·Ì¶oßÁˆÛn#2*šÐ°pZDF‘š–ærÙ믿žöíÛ±jÕ¬\µŠ^={Ù/(¾¤•””D|ïìÝí;tôº‹ª» @rr2QQQöÿ£££ËTV—.]r›FáÅ ((³ÙìS9­Âõ]MsLpÚ¿¨¨(’“Kn-üóãX»výÜLqüüË/>¢åíËñ®MõÎÕ2ž¶ëîØTÆ9î®î–G9z:Ë㸈ZÞÍøðØ±Œ;Ž?À’̙ӧÐ4­Äå0÷–/à½÷–óÄ“O”*­&MšpðÀ~{÷Eª!Å©ÛF¯×“››kÿ?ÍË‹¤£ÆsîÜ9ûÿŽïK³&MšpöìÙJ)go9îÓùóç /ù;¿nݺñÙgÿâØÑ#¼üÊËNÝ žŽGyïSM®w¥Ù®»cSÖŒÿò‘QÑÌ;eK—y}<Ê{Ÿjr½+ÍvÝ_òôäO0pÐ-Nw–µî¹JÓ×úâé\,MýU_¹ß"j&_nìBˆ¢jÔ B!DE`&„B‚™¨¤‹Q!ÁL!„`&„BTb0+Ë›·l¡kL¬ QÁå,„Ì*М9/ðê+/_³ïg$@Q¾çŠœS¢V³C‡1hРkv2Vduüy«Ö×ñðرRSå‚ ª%oϹqHÔÊ`f4ñóó«Ñ€TC ;¶ÿN€S¦<-5P!ªz0óe CWóFþ6y2-[µ¦e«ÖLž<£Ñè´Ž»A*KತAß—uÛî„……±`ÁK¬]»€Ûn»o¿ûÎi™„„:vê\b^ÁýåW–Tv®¦y; ¢7dz³oîòânp梆 ’êM>Ê{TOÛ,ë ¨®Cç©·À]I¯‚¨ÁÌ— ] Ì÷ÒK ¸˜t‘;¶³cûï$$&°`ÁB§õÜ RYÒ—% 訬ÛöDQûû)S¦°hÑkX­Vû´E¯½Æ„ ¸Í«»í—wþË:ø¨·"z3@¦7ûæŽ/ƒSº$Õ›|”÷ ¨ž¶Y–AQŸ"ÿƯ3dð`¯ÊÓÓ@²BT†JœÓ×;ußÓºuk `½‘wŽâàýöåÝ ôçi€Kwƒ–uÛî¶gHMeΜÈÈÈà_Ÿ\´o¹u0>:»ÆŒ±|¹ý÷m•˜WwÛ/ïü—uðQ_Dô4@¦7ûæ./î§,Ê]ò&å=ª§m–ePÔ«x=/¼0—U«VR·n]õÙ×óLÔNÕúÙŒeP±ðdsX/::š”””bŸä èÏÓ—¹í’.¡aáÄÅõ$;;‹7^ÿ»}ÞÓS&³hÑkX,^~ù&Mœh4³$î¶_Þù/ëࣾ ˆèi€LoöÍ_§tW‡¼ÉGy‚êi›eõèÑ£Lö Ÿ|òÏ™/e$Dèf,ë@}áááNë={–°°0¯×/Ë—eÝvI]©©†Μ>ÅÇ}ä4¸åСCñ÷÷cþüÙ±sù˃eÚVy翬ƒú: ¢»2=í›§¼¸œÒ—:Tu¤hÙÕÓ6Ë2(ªÁ`àÁ¿<ÄÛK–Y)ç™Õ"˜•u ¾Q£îdÆŒ™  ÓgÌ`ôèQ^¯ïn€KWƒ–ç¶}îïU¦LžÂ’·ßæé)Oãïïïu^+#ÿe|Ô×Ý éiß<åÅÝà”¾Ô¡Šª#îAõ´Í² ŠzÿŸ`òßž">¾—Oùõe Y¹!DTË`VÖúfÍœIxãpzÄõ¤G\Oš6mÊÌ3¼^ßÝ—®,Ïm—†N§£uëÖÜwß½NÓ=åµ2ò_ÖÁGK3 bIdzÚ7Oyq78¥/u¨¢êˆ»AP=m³,ƒ¢îܹ“'žœèÕ݌ޖ‘•Eç¬BîÿóŒ=Š1£GW‹üÊ—ûR¦Bx«¢oÑK_{V«•}ö§OŸfÔwJ!„$˜Uá›É?>øU• „B‚Y5T]»•¤;LÊTˆªBšB!$˜ !„Ì„B fB!$˜ !„Ì„B fB!„3!„Ì„äißBQ‹‚™\ô…BTû`VÇ#V!$˜ !„µ+˜9¶‚BÃÂùð£èÞ£Í"šÓ§o?¶mûÏ?ÿ={ÅÓ´YÜÌ¡C‡ÖY¼d íÚw Ed'M˜ŸoŸo4ùÛäÉ´lÕš–­Z3yòŒF£ÓúK—.£K×ÂÂÛóãi°Á¼¼<âIZDFѾCG/YRâòÞäÁ×ýBQ…[fë×o`ÕÊ•œ:y‚»ÆŒáÞûîã¿þß}ËéS'9r$“§LqZgë–­lÞ´‘½{v“’œÂË _¶Ï{é¥\LºÈÎÛÙ±ýwX°`¡Óú»vïbíÚ5R’íÝž©†·]  ,$33“½{÷°iÓF~ßö{‰Ëz“‡Òì·BˆÒ)÷‘¦GÊ çø±£4jÔ€ÜÜ\ZDF›Ö²Uk.]L²¯³sÇvZµjÀ©S§yç(ìß@§Î]Xµò{Z·n ÀÉ“'yç(Øo_ÿƒhÚ´©Ë<•¤s—®üðÃ*ZFGpúôiâzörÚ—Â÷ÞäÁ×ýBˆš¬¢Gš®ð–YáÅ ((Èå4³Ùì´NTT”Óûäädûÿ)))DÛ@tt4))ÎÊ1y+99™È-ìÿGFF–¸¬7y(Í~ !„(*yȹsçìïÏŸ?OxøÕï®ÂÃÃæŸ={–°°°2o3<<œó NÛu·lEäA!D f³fÍÆšŠ!5•™3gqט1öy£FÝÉŒ31  ¦Ï˜Áèѣܦ‰'Ü.3zô(fÏ~žÔÔ4RSÓ˜5kv‰Ë–&B!jY0‹ïOŸ>}‰íFÃF˜>ý¹«næL‡Ó#®'=âzÒ´iSfΘá6½'Ÿx‚ƒnq{7ãŒéÓ©LטnìÓ‡¸¸8üüü\ÛRäA!DÅ)÷@ÊÊ››5*Ãñãǹ÷¾ûؽk—Ô!„(£jHu2sÖ,._¾Lrr2³g?ÏðáÃ¥P„¢`æ *2Š^ññÄõìEHHÓŸ{N E!ª}UËеìbœ0á&LxDj…BHËL!„`&„BH0B!ÁL!„`&„BH0B!$˜ !„`&„BH0B!$˜ !„Ì„BH0B!$˜ !„Ì„B fB!$˜ !„Ì„B fB!„3!„Ì„B fŽBà÷y½ï¿_IטX—jýÊÈce§YZ?ÿò 1±ÝœÊ²4ùóvÊÞ÷ŠÜÞ믿AhX8úÓýÕöd/Z>úÓý„†…óúëoÈ•PH0«hÏMŸNbb"›6n ÕR+JE]”§OŸNBBÖ¯¯5eYòòòXºlŠ¢ð sjÌ~Í™ó<Š¢°tÙ2òòòä@ f)99€öíÛËÑ*£óçèÐájY¦R$°yðãêÕ¤¥¥1hÐ@Ú¶m[cö«]»v 4´´4Vÿô“h!Á¬¨¥K—Û­;M›EpcŸ¾|ñÅÅ–Ñ4wß]J\\Oš6‹ kL,o-^Œ¦iN-_Z+Ÿ}öo ¸™ˆˆætîÒ•O>ýÔiþ²eïNxã&tèØ‰É“§påÊ•R§é*OÞäÓ]>Üí³7e段W¸\a7£ã«¬Ûðæ˜»’žžNó‘4nÒ”K—.Ù§_¼x‘ÆMšÒ¼E$ééé¥:~Þoö÷çŸ~`ÔwºLëƒ>°w…ûR†îê–ÕjåÍ7ß$¶[wš4mFLl7ÞxãM¬V«Çíûr< ÷é§Õ?UxÏ€Õ*˜-_þ>³fÏ&&&†?dÕÊ•ü¸ºø§¾·ßy‡ÙÏ?O|ïÞœ>u’ûïÿóæÍçÝ¥KZ Þ¶ Þÿ&=õìÛ·—õëÖqèÐ!§erssÙ²y çÏ1kæL>ùôS¦Ï˜Q¦4Eñ¹ŒÜåÃÝ>{Sf%q•®«ò,Í6¼=æ®4lØ»ï¾ ‹Å—_}eŸþåW_a±X¸çî»iذa©ŽŸ7ÇÇ›ýݽ{7ñññ.Ó8|ø[·lÆ’ìušžêÖ[o-fþ‹/qçÈ‘œ=sš;î¸_z‰Å‹{ܾ/Ç£pŸöìÙ#WCQ­)¶Wá{Ðiš–°`þžš2 £ýé=zÄqæìYvïÚEttgΞ¥G8§‹j·îÝ9wî<;wl§U«VdddÐúº6DGG±{×®b­3O]aÝ{ôàìÙsìܹƒV-[z̧Åb¡q“¦„†6âØÑ£.·å)Íаpt:É—.–˜_Où÷&…¼-3w-•¢éæÍ6Š®ãí1/É¡C‡éwÓMtìØ6зßM>|˜M7СC‡R•›7ÇÇ›ýmÞ"’¼¼<’.$âïï_,­cGÚȧãä©nÅÄv#!!Çþ qãÆ\¼x‘N»ÉÞ=»Ýnߗ㑟ŸO³ˆæ’˜p^®ˆ¢Â$&œgÕÊ̘=×ñÃæ€È²L ÝöJuxŸi›Ÿk[Þ X+ èË;à ‰‰´hÑÜ>­EóæÅ–»p! €¸ž½œ¦~¯ãsA%^ *2Òåü­Û¶ñÒ‹/qààA²³³í]>iié¥N.×ö IDAT³4J“Š*³òÚ†·Ç¼$;v oß¾lÚ´‰ý€¦qøðaúõëgde)·²î¯§.VÇ@âmšžêÖÅ‹8,, €ðð‚À•””äqûe=BH7£ÃI“XìärÔ¼yGrêöJI¾Tªí¦wî¼ëO—cÇŽcë¶m,_þIíŸBÝ]¨<¥YØB(üÃÕ…¦<òQQeV^Ûðö˜»3á‘ñ|ñÅüÇöýNá´²”›§ããÍþ6mÚ¤ ]¸Pneè©n5n\ðý—Á`púÛ¬Y³r; ‚jÁô¦MšÈÕPH0s4~|Áèù9sHKK#--9s^pqñšÀ sç‘‘‘AVV¿þúwÝ}O©¶ûØ£0sÆLRRRHOOgöóÏ;]ÔêׯÑhdþ‹/–9Í–ÑÑüòË/äääðÊ«¯zÕ½é)õë×·w Ud™¹*¾oÃÛcîÎСC‰ŠŠä믿ᛯ¿!::Š!C†”éøys|¼Ùߘ˜¶ÿþ{¹•¡§ºuï½˾ûîRŒF#ï¼ó.>ð@¹ƒÛ·o/èöìÞýjKOnÌ`„G˜;÷öìÙCÇN6|Æq¹Üë¯ÿöÓ¾CG:wéÊû¼Ï?VÊ :Ž·Þ|“ÄÄDºÆÄÒï¦þ´½þêmÔËß[FÛ¶m9òNúôíÇu×]Wæ4/~‹¶mÛòÐ_¦_¿›è×ÓcšÞäcÚÔ©„„„УGœÓE¥¼Ë¬¤ãçë6¼=æn+¢ª2nÜ8 †ÔTÆŽ‹ªªe:~ÞoöwØÐ¡|÷ÝŠr+COuëÙgžá©I“øú›oˆŒŠfÅ÷ß3ý¹çøÛßž*·sÐqŸ†*WCQ­•û BÔ4999t‰%##ƒÍ›6֘ߚ;vŒûô¥AƒØ¿   9Ø¢ÂTô òlF!<¨S§=ú(V«•¹sçÕ˜ýzá…¹hšÆã=<{z)‚šÃÝ÷×ú)U9oÞxúé)<ýô”U_þýïÏä¤ÌDÕS•ƒ‚<2KQ‘¤›Q!„3!„B‚™B!ÁL!„3!„B‚™BqmUé[óøþ;9BBQ…Ý6r”´Ì„Bˆß2«j‘_!DªÖs&-3!„Õž³Z¤Kט¿Û·o§ÿ€›kžŠÚQ§¥.{GžÍ(ìßWcöëÍ·óÊË éÝ»·}?+zÿjjYJ–r¬Nå¨Ö–ƒ"Š;°ŸSe-,¯ê\nÇŽ#..®\NFWåàªŒŠ–cy×MoŽKiŽ]Mþ¸ÔåînßÏ'$0qâ$â{ß@q<öøã¤¥¥9­ÿÅ—_2løpº÷ˆcÔè1ìÞ½‡ï¿_ɈÛn·§yüø û:žÊʛ։ãË]9mܸ‰Q£ÇЭ{† Æ7ß|ë¶þÔæOõR§+¿Nå)oYŸ«úyP­ZfûìçË/¿`ÿ¾½|ðÁ?øãÐ!¾üò Ö¯[K@@o¼ñ¦S÷RišÌE·°cÇ>ýäŸlÙ¼‰AƒyqØ—¼¼»t)'Ožâ«/¿ä—ŸâÒ¥Köy‹/!ùR2?þ°ŠV­$ébK–¼ív{o/y›ô´t~ùù'¾ùú+¶oß^êrw·ï'Nâþ̆õëX¿~-[¶dѢלÖß¶íw>úðC¶lÞÄðaÃxü‰'ذqÿøà}¶nÙÌàÁƒyaîÕ¡Ô=••».&Çcîê¸-§™³fòøcñûïÛøø£Ù`™ëOM%uºòëtQžòV›ë³b{¾W¦iy æÏá©)Ó0æå]“ÌþŽá¶‘£èÒ5†5¿ýJxøÕ‹‡ Æ{Ë–Ò²eKRSSs×ݬ[»ÆþI¢èó4ÍÕvºtaÓÆ „„„——Ç 7öaÏî]%~‚ñ5¯·Ü:˜|ð>ÑÑÑÅÒ8è>þèC¢¢¢8{ö,Ço¿þ¯Äí ºåV>þèC"##íëÜvûNûéM¥öußóòò2d(ëׯ³¯¿qÃz4h`Ÿß³W|±iŽiz*+Où-ú‰»c{ëà!<üׇ8p Mš4ñXW|Ù¶¯Ÿj+óF_ó uºêÔiwy«¬ú\ôúìÄ„ó¬Z¹‚³¯yEQ~Œ@. dé¶WªÃûLÛü\ÛòfÀX ªÙÝŒŽ 99™Ûïé¥Ü·Ø+>@`` f³¹\ój0hÞ¼¹Ë´ÒÒÒœæ5oÞÜ©kÁÕöRSS‰ˆˆpZ§´ÜíûÞ½ûxãÍ78|ø¹¹¹.Aá ^¸¾«iŽiVÔquUNo¼þwÞ{o9ï.]F½ºuyæÙgп¹×]o>TU´²æAêôµ¯ÓžòVYõ¹*ªÖß”‡……ñÙ¿>¥qãÆÞï°^O^^ž½^¾|¹Jä5,,ŒÄÄD—Ÿb5jÄ… ìŸHiذ¡Ûí…††:­sáÂ… Ù¯§§NeÚÔ©ôíÛ‡àà`²³³¹áÆ>•~\K«sçÎ,Y²MÓØ´y3Ï??‡k~“>E©ÓU²N{Ê[m®ÏÕúnÆ{î¾›^˜Ëù„Ìf3ÇŸ`Ú3ÏØç׫W3gÎ8­Ó¶m[>þøŸäå呜œÌ¼ùó«D^ï¸ãv,|™K—.qåÊ^]´È>oèÐ!¼üò+¤¥¥‘––ÆË¯¼Â°aCÝnoø°a¼úê"ÒÒÓ Öyù• Ù/£ÑH@€?þ$$&2wÞ¼ /«òôÌ3ÏròäIÌf3š¦a±˜ÝÖ!uúZÖiOy«Èú,7€T ±c¦{÷nŒ7žž½âyö¹ç4p}þ_zˆ{ïû?§ƒð sX³f 7ÜØ‡ü ñññU"¯?ö­[·bÌ]w3tØpš5mfŸ÷Ô¤I„†…2|Äm qáááLš8Ñíö&N|’zõë3xðFCÏ^=+d¿æÍ}E‹^£W¯xÆŽG·Øn^Våéæ7ó·ÉSèß›7Þx“… º­?Bêôµ¬ÓžòVQõyÏž½të[¥ëcµ¹D”¯kñ”©ò¯žåùðØq<öèzöìYêë³Ü"*´²‚<ú§¼ÊQH®©õùÃ|Påó-Á¬–ª®'»»Àq­öI.œR§kR®®å(ÁLÈK©ÓÕ^µfBÃäH !„(‘­9#‹„#[¹uÄòL9§%˜ÕÖ`&e ĵ”•“G@ Ío?}KB)Ò4l4Æ|39^þNMH0“–™¢ÜeçiÌmwÞ[ªõ&3Ù¹Fs)\ fÌ„•'õrV¹§éx§¤`V#µ¯g`Å/¥ „¨çº`V£}ÿʽ¤¥JE¢¦JL8ÏûË×IAT!ªB fB!„3!„B‚™B fB!„3!„B‚™B!ÁL!„3!„B‚™B!ÁL!„`&„B‚™BQ}ÉSók Mƒ´l3)&òÍVüô*!uô4 Öä/Ÿi„ÌDU `À‰Kyl>’ÉÁó¹ètP×_Á_¯`¶@N¾£Y£YâZ×£W›àjØ^yõUÞzk1‹^}•ûïÿS¹¦@ª!¥JìkUÊOE䥪•·`&ªÄ4ŸoN!#ÇLd¨Ž¡1õhXÏUU°X5ôª‚NU¹’›O‚!—§2X½'[c0 C}ôºÊI·ðb#ø6hЀ~ýú²à¥—hÖ¬™Ë@öÕW_óßÿþBçNªô\.ÔBH0¥´þP&?îI§m3?nl߀<“‰ÔŒ\Î&§c¶hAUQ ÔZ?ˆþMB0\ÉgçÉ+ì9™Å£CšR/PW©ùN5¤`ÌÏgé»ï2ÿÅ—È̼Â7_Ul¹gŸy†gŸyF´ÂN¾,©a¾Û‘Ư/3°s0­›rùôS¯÷§4iúZÞBH0l>v…=g®pS‡`òóMOH#ßl¡~â;4cL¿ë¹í†ë¹µG+†ölŘ¾í׊VM ª É—s8™”Al«º\ßTÏ’ÕçÉÍ·Vú~^”ëÔ©ã4ýíwÞaöóÏß»7§OäþûÿļyóywéRû2<2;wòþò÷8yâ8S¦Læý÷ßwJGQ¼ïBuìL5¤ë.ÌÍÍeËæM$œ?Ǭ™3ùäÓO™>c†Wëµ|ùûÌš=›˜˜þ8xU+Wòãꟊ-çM9¸òþû0é©§ˆˆˆ`ß¾½¬_·ŽC‡y½?¥MÓ—òB‚Y-—˜žÏ;Óèu]2²óHJÏF¯S‰l\ŸÛz·æúæð÷Ó£8]d ´~7tŠ oçøé1[¬œLºLûõhTOåã5*u?òóóY¾|9£î¼ÓiÞ‡~ÀÔ§§Ä£¶Ü?þñû2YYYøû¢ªÜxà |þù¿+½Z~Õ~òä¿Ñ®];¸ï¾{øïÿ[ª´Þ{ï=æÍKhh#BC1oÞÜbËyS.[}Ë ‚ÝK ^"<<œÐÐF¼¼pa™öÇ›4˳¼…`VÃ}±Å@»æ~€…ÔÌ\ô: ‚èÛ¹9~zŠªª (ß•©ªí¥Lk^˜ëã§SPPHHΤG›œOÍåÔÅœJهаpšE4gþ‹/Éܹ/8Í¿p! €¸ž½ §õum8>Á¾ÌŒéÓQT•ƒn!22ŠA·ÜÊúõë+$¿[·mã¶Ûn'ºe+ÂÂÓ¸ISÒÒÒK•^Bb"-Z4·OkѼy±å¼)—x >˜DEF–ÛþxJS fÂk'.æ‘•k"24€¤Ôlô:zBûèPô:õj³1EÛËäTE¡UÓêù£Ó)˜¬™9ùti̧ë+§u–jHáÄñc<øÀœ;wž¯¿ùÆi~óæ9|ÈÞm—jH!%ù’}™ áä‰ãüï¿¿0sæ öîÝË#uJÇb±`µtŸ&%%•:¿cÇŽcë¶m,_þIIL8àÕwW®®„„ÄbÎ×rp¥p½sçÏ—ÛþxJ³<Ë[ f5ÜÏ{Ó‰÷ãrVª¢ ×)èU•úuüíLQ : ˜âü*¸d¡×«Ô«€Ÿ^‡¿^%3ÛH‹°:\É5‘˜šW)ûÒ°aC.\@XXóæÍ'%åê÷L)èN{aî<222ÈÊÊâ×_ã®»ï±/óà_âСCtîÜ™~}ûhŸß2:€_~ù…œœ^yõUyª_¿>gΞ-v‘.œo4™ÿâ‹^¯ëÊøñãx~ÎÒÒÒHKKcΜŠ-çM9¸òØ£0sÆLRRRHOOgöóÏû´?¾¦YšòB‚Y-d²jœJÎ¥i²rLêéÒ*œ†õ1š­¨Šh(€ªPb7£ª( ÙRðt½^EUÀ˜o!2,ˆíÇ.WÚ>òØ£HOOgšÃ-ø&<Âë¯ÿöÓ¾CG:wéÊû¼Ï?f_æþÌ sçѲUkn¿c$½zõä}Ûwp‹¿EÛ¶myè¯Ó¯ßMôŒëé1?Ó¦N%$$„=âœîÂ[þÞ2Ú¶mËÈ‘wÒ§o?®»î:¯×ue„G˜;÷öìÙCÇN6|Æq¹œ§rp,ÇñÖ›o’˜˜HטXúÝÔŸ¶×·õi|M³4å-Diö6¾W¦iy æÏá©)Ó0æå]“ÌýðýwŸ¶_m tÒ±ø¥¤¥*e{Ç/æòŸÍ—èu}0 W¸©k$a!u¸”žCRZ7vl^Э¨v/*϶*<ê (hh$§ç°ÿ´³Ù‚ÙjÅd¶âï§Ã˜oe߉tæÿ¹£œ1B‰ çyùr¿³´Ö–Á'Ü%|ÛÈQ^—Ùª•+˜1ûêMMŠ¢ü\ ÈÒm¯T‡÷™¶ù¹¶åÍ€°Ú®bÒ2«îÒ³Lù©X,VÖ $¬~ªAþ:²sMKL/ø^Ìv{´ÙbÅh¶—o!ßd-ŒeäÍœ¾˜QÐE©×¡WUô:MÓ¨äGZ–I [QeÉ@ª¹Œl3~:°X­4ªWÇö›£É‚N¯r1=‹#gS‰ ¯O“†uðÓ«øé žìaµj¤fä²ípI†lÚ¶lH“†u+*VMâiùqùŠQ [QeIˬš+øFÌjï>,ìRL½’Gz¦‘å+ðó¶3ì?i -+|‹µ  Ñb!;ߌ¦ShÞ¸z>øþO¥¢×©èª¢S4MC§“²BHËLTð?2ZðÃp%—ì<3Ùùdd瓚‘‹ÉdaüÈ[÷¡JN¾£©àÆ ½ªÙ¤aÁì?‘B“†uPUNê©ø¡p)=Ȱ )l!„´ÌDÅhß<˜ÄÔlÛƒƒaÛ‘$N&]FUÚF5Äl“ÙŒ^§¢×éð×éð÷Óáï§àg{¯Ó‘‘•Ov®™è¦õlOÔ/¸Ã±nöŸLep·ÆRØB f¢bø©ÜЮœÎ AÝ t (ª‚ªB¿žÖÍC8~îrA0SUüô*þ~ª- 5?½Ê¡Ó©tn†^§CUÕ‚'êèHÏ2’œ–C¿NÌ„ÌDÙ«1Ï^M!À_j»{QQÅE\ðcjÛïÇ ~]ðòÓéÐëUœ2Ð¥MØÕ'„¨ õë°fçyÔU•‡Å !$˜‰ Ô°®?}Ú‡²ýXJÁS?(x^•ª(D„ѸžýÒ:UÅOUñóÓ¼t*Æ| éWréj[‚ôœH¼ŒÉdâ†2\‡B‚™¨cú4ãÈ™Ëdf›ÐSð¸`Û¤ÁöÔÛÆU?]A«LQN$^&¾c3ütÕA§¨úëY½å4Žh‹Œà!„`&*E½ ?îˆ`ÓKøy1†”f{Á%C6]Û\ýN,ÀOÇ‘³iÔ ÔÓ>²®B‚™¨¿¶?²™zWg)D!Dµ"®¡î¾±.Qº¯ùt÷mü¸µm#RŸà:~ùë°Xár–‘”ôË9{™ðúÙ<1h/ÍýÁO£ B‚™¸öL9çh¥ßÂgOjœInÀîÓ9ŸZŸÔä`róýÑëÌ4mÉÀëÓ™64…f ²H8~¥Ñ\)<„†…“jH‘íV“ü f¢šI?ûOš´lªÖ¥Íõp]ôïhy›(ü¡´#«U#åüy’Ξ"ªYÍý®ÌjµòׇÇÒ¥sg¦N}Z*‰5ˆ|gVS¬®9™ å`ÍùÍtÂe ƒ‚G\…GFÑ4²%‰__“Oû•aöóÏÓ½{· d¥ÙÊÚ÷ÚÔRÒ25HH‹{8¿íSꇆÒ´hyh–¤—7›òIO¾Hh‡jl™¼ôâ‹R1„–™¨N2“¾§e§®Ôm‰ÚàyÔs×Ïk´Z,¤&%’—“ƒ_VUj?, óç¿H»víiÞ"’qãÇ“••åö“ùÒ¥ËèÒ5†°ðÆ^¥ñ믿ѧo?š6‹ ¶[w>ýô_n?é»›î4ÿÌÙ³ÜÿŸ‰ŠnIDDsî¹÷^ ƒÛuŠ2æçóäĉ´ˆŒ¢}‡Ž,yûm¯óãŠÉdbÖìÙ´m׎Ö×µáwßõ*¿¾¤ãkž|9æ%/oËSZpÌD5b5g¡iVвÑrVbÍùŠ»u:šDµ¢it+2Îÿ§JíÇo¼ÉÞ}ûX»v G&00¹sç¹]g×î]¬]»CJ²Wi<þÄã<÷쳜={†V­dç®>ç³ðf†TCŠÓ úÓý<úèŽ=‘#‡iÓ¦ ³fÍv»NQ ,$ÕÊÞ=»Ù¸a=7n,S™¾òê«9r”ukײg÷..\¸àU~}I§"yIÇËÛò5“t3ÖP ¢þÌé-# ¦ÿ~ÐòÜ?«•Œ4õ¢ZV©ýø×gŸñõW_ÀœçŸ§ßMýY´èÕ×yqþ|ÂBC½N#00ˆK—.’j0ТE ÞzóÍrËÿ–Í›ìï™=k±±Ý|Jãëo¾aÕÊï ³·ôŠï]ê<}ñÅ—¬øî[{y8v¿ú’_wéTä1/ã%ÁNZf¢šÈºø-;t&$¼%jƒY¨ æPR7#€ªª„4 #/c•Ú¤¤$â{ß`ï:jß¡c‰Ý^…š6mêSÿüø#Ö®]Gÿ7Ó£G?ÿòK¹åûöŒ¸í6"£¢ §Ed©ii>¥‘œœLTT”ýÿèèè2åéÒ¥K%¦áK~Ý¥S‘Ǽ"—`&ªMÓ0›Í³ÑùémÝŒ+°fNIÝŒöʠדŸs‰¼¼<Œùù˜L&4M»¦ûÓ¤IØoï:J5¤Ø»Ë+nݺñÙgÿâØÑ#¼üÊËLž<åj×…^Onn®äx IDATýÿ4ÑÃcÇ2nì8þ8xCJ2gNŸò¹L7n̹sçìÿ;¾/M›4iÂÙ³gËœ_w锥ÜÊr¼„3QY­VòóóÉËË#''‡œœ‚"ÆqæÈÎÚGfâ›ä§ŽÅlÆl2a2æcÌÍ%;ã2i—’H‹¥Ò÷í¯=ÄäÉS8}æ f³™C‡3nüørMcüøG8zô¨=x[,fû¼N:ñöÛï››KRROOZâvBBB8qâ„Ó´¼¼< äì¹sLž2Åã:E=šY³fcHMÅ`00cÆL§ù¾äà¾ûîåÙç¦sáÂ222˜9k–×ùõ6_óT^ÇË›ò¹D‚™¨rAÌd2‘okEFûˤ4'¨Ýw¤äßÅûÌl\½†ÿû‘¿®fךŸØ³î¿ìß¼-ëösúl™þOAôäX"ÈÉɶ§“—Wð·pùùùX­Örß—Â.%ÇÀSOM¢wïxFM‹È(™0ÃGø”¶§4† ƃyˆÈ¨hæÎDz¥ËìóÞ|ó V¯^MËV­6|ýúõ+q;O>ñÝât¡\ü֛̚5›ÈÈ(F޼“ø^ñ×)jÆŒé„4h@LL,}úö£Oß>Nó}É#À3ӦѶíõÜÔÝ{ÄÑ¢y ¯óëm:¾æ©¼Ž—7å)j&…«_¤(¶à¦Ó´‚»ÌŸÃSS¦aÌË»&™ûáûïxðáñÕ¦@'=ñ‹ßYJZª¡Rº-‹Ã_ ‹¹ ›1?c^ž= }»r%gΜ IXôòÍz.ò cÔ·àï¿@Á§ò€ @¯×£êtèu:ôz=z½í½¢(r‰Z)1á<ï/_Îâw–ÖÚ2øäÃ÷¸mä(¯ËlÕÊ̘}õ‘yŠ¢ü\ ÈÒm¯T‡÷™¶ù¹¶åÍ€°bûþDZf5„¦ihh5 Íjµ.mÕ¬Ü:ðfêÖmÀñ3iœHÈãøÙtüô ¼©[0´jÖ‚å­鏸¾¤¤éBq­È­ùÕµI­(¨ªŠ¦ièt:§à¢(JÁ|½^‡ÞÏÀ€&ŒKÒÅ$.%hØ Íš6FQUô:=~~züüýñ÷óÃ? €t::½ª¼×éPlïUU> !$˜‰rPT _‹ÅRðW§ÇßßK` VkÁHÓ‹•ðÆáhßyE:Z$½«Ó _ªªJ÷¢B‚™¨˜ZáwY…ߣY5 «Åbë2´¢išý¯«îA{KNUíUUEÕéPméKBH0•Øüüüœ¦9~÷UÐ\­WÈ _B!ÁLT©Wœt:H9¨MKÊ š¢ºoñ…BH0B!$˜ !„ÌDuçn0Æ©S§ñïî´ügŸý›©S§ž“ çÃ>¢{4‹hNŸ¾ýضíw>ÿü?ôìOÓf p3‡vZgñ’%´kß‘QLœ4 c~¾Ïy¯íû*„3Q«¸ŒqÁ‚—øüóÏY±â{¾ûnÿùÏX¸pàÝ`’ë×o`ÕÊ•œ:y‚»ÆŒáÞûîã¿þß}ËéS'9rd±ênݲ•Í›6²wÏnR’SxyáË>ç½¶ï«•IžÍXÎ*ëÙŒ5Il·î|ýÕ—´iÓ€””úÝÔŸ#‡Ùÿ2t(£îÅw+¾ã—Ÿ&<Üõƒdsss‰íÆÑ£Gì-ãÇŽÒ¨Q#ûü‘QŦµlÕšK“ìëìܱV­ZpêÔ)FÞ9Šû÷ÙçÞáç)ïµy_k2y6cÕ{6£Üš/®¹ÂÁ>e9üÖ-<<œ{E‹^cÞ¼¹N÷íÛw0wÞ\öï?@NNN±uû… ((Èå4³Ùì´Žã`˜QQQ$''—*ïµy_…¨LÒÍ(®9Oƒ1üã>ûìß|òÏYºt§OŸ¶Ï+Á/]qóüùó%¶Ž|<´6í«ÌD­ân0Æœœ{ì1Þ{o#FŒàµ×ñðÃcɳu}û2˜¤/ìƒa¦¦2sæ,î3Æç¼×ö}B‚™¨UÜ Æ8uÚ3Œ?žo(èÞ:d÷ÜsÓžyðm0I_Ä÷ާOŸ¾ÄÆv£a£FLŸþœÏy¯íû*De’@Ê™ÜRýÉ㪄'rˆ Î)„B”; fB!$˜ QÓÔ¦n7ébÌ„B fB!„3!„B‚™B fB!„3!„B‚™B!ÁL!„3!„B‚™B!ÁL!„`&„B‚™B!ÁL!„`&„B‚™B fB!„3!„B‚™B fB!„3!„B‚™B!ÁL!„3!„¢:ÓKQ}XÌÇSŒäækX5)Ÿ?½+ Wh×4NÊC‚™¢ÒiÀ$#—3sذãÒÒ³°jѼd ¡ ëѧ{;LˆB“ò“`&„¨\Ç“òÈÈÌæû_wp{ÿÎ êÕ9…½eÌ7óË–?Xµv£oéÅ©?Z…IóL‚™¢Re5Öo?Ęÿoï¾ã£¨ó?Ž¿ffwÓI!$´„""Eª`E=ïõ°rzbG@@ņ"6±Ë©xwØ9¨ç©'ê!RŒ€t 5”@H!„´-S~$Y³a!HÈçùx̃M¦òo¾ïý~gvvHO.ÐU ¤Ž6þtA;?ü¼‰?^Ü0;mzÞRB4pèp1çöN“Âh€ û¤q¨°S.:JÏLqj˜–…ÃaCšáús8ìr­QÂLqê»hV£Þ¸°ð‡ ¼ñéÏè¦Y±m°*âòâ¾i sNÿ³9|¸ ÖÇUS !=3!¤oÀþ¼#L~å+ºvLbD¿ÎØË?$|Á=oú,7aÎçhšÂ%}Ó˜:ê"ò ‹}úGâ½gômwµŸwÞšGŸ¾}‰ˆˆ¨Å±Yuü¿ !a&ÄéeµúÀïš-Y<1ÿ.;·'];ijí@1=Ú…óêÔ‘ØT°i  ì6• ;¡Á( ä–bfùM"ûºoÒdFß|7ß2Uý}PÇívó·yoðÙ_±sçNz`2K\‚®{|îù¼öæ[ÄÄÄx—¯Ü^T« )Àår1é¾±üß§ÿ"4,”{ÇÞ糬a<õäã,øÇ»—”0tØpæ¾ü¡¡aÞm=õôs¼úÊ\ìßO~a©T”F†…8 }üÝfþãGFDb\4Û÷—?ñbóžB2ö²u_!Û²³}![÷°uo>›3³ÉÎ/"· ˜ŒÝ±¬òkj•zôèIÛvíùâ³E>ûú×Â9ûì>tLMãú‘Ws×=÷²mç2vì&-­?8¥Æã9c:yyy¬Ý¸…Ÿ–ÿÂKþç3ö¬çXûë¯üoéJ¶îØMP`?ú°Ï2«V¥ó¿¥+%Ȥg&„h=3Ž?øöäüïÙy ˜ëÿt>Å.“ÌÜ2‚ Šª¢¨Šw¦ea˜ *ºªQþaiËR°i*.NPµ§L˜4™Çyˆ?¸Êû»W_žËÜW^Ç–§¯ñþ> (ˆ‡ŸNÏn}¶áïõÂO>â‹ÿü—èŠÜÓÏÍ¢_ï³¼óüã].ú‚„6mxtú Î=§/ÏÏžëÝÖŒ™ÏÑ::Z&%̄͡{Ðuý˜ó]nOùíö€Ç°p&6CÅr–è(XØT‹ »B ]!Юz_[¦*ØÉÎ/"%.û÷5úõ着üïûÅ |.?|ÿtïÞÛÅ/é?3ã‰Çذ~=¥¥å=$EQ|¶áïuÎÁƒ$$$xNLLô™àÀ~úŸÝÃçÿY}»­[Gùü,Zf¢™1­ò^Õ±¦Gn9Ÿó{¶áÃÏÿ‡”ÖÁ—ìËwRX¢ãt›èU& ݰ0 Ã4±ÛTÂC‚xÿ¿ë8·W»£¶?vü^yéELËâµW_f̸û¼ón} };k6üFVÎ!2võßò~@Ûßë˜ØXvïÎôþ¼{w¦Ïüظ8Ö¬ßÌþÜsÈï¶j3 3!Ä©fYX&Ç®»èLÆ_ÓŸO¿^Jvn>]’ÂÐT…!=â9¿{ƒÎˆ£—XÎN‹¥GÇXÎhCjr4¥Nõ;²yfÁ8> óQÛ¾ø’Ë8°?Ÿ|ôùyy\pÁïËÞ2ú6ï2{³óü¾¶;ìÌyéæ¼ôŠw½;ïóû¶3n3Ó4Ñu]×1 ç´%.ÜÆ;_!ÿP¾w9UQQTMSÑ4 M³a³•OU?½;+§†ãjyÃ|Ò6I˜ !êf¦yü!5C×q{<èºÝ£ã©ø·kb0c/ïÌ¡C‡°LEU±i64›†ÝfÇf·yÿµÙì84M“Bf qù#š]®Z½Fj•8±aF-¾iºbè°ê0båPbJl(†ab©Š¢ iªwˆQQ*–GAÓ4TUm‘=®Ó¹’0B4 ¦…UCÏLv;v›ÓIJ, ÃÀÐu ÓÄ0 °,TM«3­|ˆQ-r¬^¬i?BH˜ !ê—eåyVK Šª¡ªfÃî¨m^ !a&„81TEA×u,ùLU½ytõ8wm 3!Ä ¤‘!ü¸z眕,RO¿lÞGdD(š<ÿHÂLqò…8Îï{‹¯ÂéÖtV »´Èµåö˜,ß°—ŸÖerõ¥ýid—B‘0Bœlã8F\ÚÞIJu™òÐÜ:P…¨ˆPF\ÒðVÁtˆixó·aŸ»e( )AvHi€Ú„ÞKI˜ Ñ\Þyj*ÝÛ³#ßÎåCúÖêÛ¦Eµ@SÂm´oÝ8Mß¿¾YÞâÊ0Àa£W—¶f©ñMæ£fB4«ÆØ"-Æ&ºMÄÜÉW·¨ÿ¯a˜ü²)“¿]Kp`­B㈠‘ž™BˆfDÓTœÕ»ÍÆ'ß®%>®51!Mã 1rõX!DôèÔ†2··Çh2Ç$=3!„¨§–ú¨/­âs Mé¿/=3!„Íž„™BˆfO†…¢žä¤g&„BHÏL!šMCk;vS«ëz½·Yßu%Ì„BxÕv˜Ñãñx_ÛívŸŸ2T)Ü¿“aF!„8E Ã`Ú´i$&&ÒªU+n¼ñFŠŠŠ¼ó¿þúkzôèApp0©©©¼óÎ;Þ@¬ü·òµ„™BˆSâ™gžaÍš5¤§§“••E`` >ø wþ_ÿúW{ì1 øþûïY¹r¥OOÏãñøôò$Ì„BœtóçÏgîܹ$%%ÆÌ™3Y´h‘w~PPÙÙÙäææ’’’¼yó¤ÐŽA®™ !D=¹\έ—••E·nÝ|æ)Šâ¿`Á?yöÙg™>}:áá­xöÙç6lhƒ÷/a&j-kß^)!Nsõ½£r½øøx¾ûn1‰‰‰~ç÷îÝ›>ú˲øï¿e̘1 º­Áû—0µ2nÌÝRBH˜Õ¸Þ­·ÞÊØ±ãxþùçHNN&##ƒY³f1þ|ïü)S¦Ð¡C,ËD×uïºááálݺ•´´49fïñ'ž”B¢‰Ú°ÏÍ¿¾YÎsã†ãv7ü[¢f&ÜÇ‹/¾Èå—ÿ‘ììlÒÒR™\àÝ·¢(L˜0 &ø »«®ºŠ«®ºÊï¼I“&1iÒ¤…ª„™B4÷03M) 3!„hÎi&½ 3!„höYfI˜I˜ !D33Ë”0“0BˆæHQÊÿ5Mé™5„aX>å)a&„'‘¦X:ì¬ým/]Úµ–©§­{ò tØ °ifBq²…: ÷ö|úã†{ÒèÖ>MS¤`êÐ#Ûœ™Ï—Ë·r~¿3–0Bˆ“®M”—Ñš=áÛU»øbùV)”: pØгÉ ­‰ k:Ç%a&„h1TU¥cl a!mh—‡Ûc —ÎjOQÀa×hd#6¤iœ„™¢…5Èq¡ªšH½4½wò}fB!š¯[Š@!„„™B!a&„BH˜ !„0B!$Ì„B 3qúYºt)»t¥utŒF-H9 ÑÌÃÌ4Mn¾å¯ÌšõÂI[¿¡û5{rÆSÌ{ó òór¥±B4Ï0ËÉÉaÊ”èÕ»7ñ ‰tLMcäµ×òíâÅG-ûÈ£Ò»w/î¿R½öUŸõºOQ³M›61hÐ ïÏ•¡&½éá q"4úã¬8À°áùþºëùlÑg$$ÄSTTÄ/«V1oÞ<.¹øbŸåŸš1£Aû«Ïú ݧ¨™ÓéÄf“§¥ !šiÏìégžá/£þ”)“IIIÆn·Å.½”O>þØ»œa<ùä :wîB›¤dn»ývŠ‹‹}ÞaÎ÷]zö*ïÝ]pÁ…lظ±Në¿þút?«Ñ1±µZÇ߻ܗ^~™Î]º’”œÂØqãp¹ÝÞù™»wsã7‘Ò¶‰‰myíµäåå÷êûnº¦ò¨Í±¼3>½Ï>›„Ä6 |.+WþÌ|Hß~ý½Ûܼù·Z—qMÿŸÖÑ1>ÓñÊeñâï4ø\âéÙ«7ÿüç¿ÛªK¥¹”Wu5[c—•f~,^ü×]wmËÍ™ó"k׭ㇾ'cËo2}ú>Ë,[¶Œ¯þó%;wlgøðáL˜0±Në¯^³š~øž¼ÜœZ¯SÝŠå+XöÓRÖþº†Üœ\žyúï¼n¸‘»îº“­[زå7RSSyøáGŽ{ q¼ò¨Í±,Yò#_|þ9;wlçš«¯æÚë®ãÛÅß²èÿ>e×Î\qÅL˜X·2ö§rH1?/×;UW½\îsSx€Ý»3ù÷Ÿ³jõ*¿Û:Ë«ºšŽíD”•ÍR1U¾VͲ,'ÀÌ'cüÄɸœÎZo0.>¬}{}†˜ª¾K¬ü#ëÙ«7 ?ù˜ÔÔTrss9÷¼óÙòÛfï:Û·m%22€²²2ÚµïÀÁìµ^ÓÆ ÄÇÇ{÷]Ó:þÞݯú%öíÛ°sçN®¸rÖ¯ó»|YY={ö"#cË1¡¾j*Ú˶­DEEyç'%§õ»º”qMÇ[µA­ú³¿r9«GOƽ—aÆ‘˜˜xÜmµ„ò:Þ±5vY q2díÛËŸ/â¡G¦ÿ@Šò%àÊ€àPP1åWy}¤b~YÅò:`&ðoô‹QQQäææ’pT€U µÐÀ@ßdU|¿ñµ²! B×õ:­_=Dj³Nu)))>¯sr~ïa¥§ÿÂô'¦³~ýJKKku q¼ò¨Í±T6•ëûû]]˸¾ª—ËßßϬY/ðìsÏÓ*,Œ§f>ÅeøC‹,¯šŽíD”•2ÌXÍE]ć~Ts..ŽÖû EÕe(®>ë×g={öx_ïÝ»—˜˜ßùÖÑ£¹mômlÚ¸¼Ü2wíÄ:Eßôw"Ž¥¡ç¨.zõêÅ{ï-`kÆžyöŸ!Á–V^5ÛÉ.+!Zd˜M}` o½ý6Ï=÷<»wïA×uJJJøþû|–ûë-·0aÂDvef¢ë:›7ÿÆm·ß^ëýÔgýú¬óðןO^~>Ó¦=Ì5W_íçt: 0Ý{öø\?©ëXC5Ö±4æ9ª‹Ûo¿ƒŒŒ <–ea¿÷xÂÃÃÙ¾}{£–[S.¯šŽíd—•-2Ì’““ùæë¯Ø—µaÇÓ&)™ž½zóÖ[oñ¯…Ÿx—?~ôgĈ«HJNáŽ;ïdø°áµÞO}Ö¯Ï:ýôgРÁôìًȨ(|pªwÞKs_äá‡!99…+®¸’þýúŸ²y"Ž¥¡ç¨.†Ê_n¾…ä”¶LŸþo¼þ†wÞ½cÆpÑ‹}äŸN§ÿ~§eyÕtl'»¬„hýÓ‰\Loº®¸r“ïŸÄàÁƒ¥0¤¬D3ÐìnâdølÑÿI!HY á%a&êÝk=éÍJy !aÖ„H##e#å%Dó _#„BÂL!„0B!$Ì„BH˜ !„fB!„„™B!a&„BÂL!„0B!$Ì„Bˆhôg3š†npоqù´¦(hšŠ¦É#5›*©ÿM§þ˹hYmQ£‰Çã!kß>6mÜ@AAœðÆìB«*á­ÂéÒµ+)íÚa·Û¥Pš©ÿM§þ˹hymQ£…™iäæä°fÍj.¼ðBڶiræ‰aìÚ±—,A³i¤¤´E•òmR=2©ÿM£þ˹h™mQ£…™n¬_»–‹.¾˜öí;Êodš¦‘Ú© šÍΊŸ~"..Ž à)˜&BêÓ©ÿr.Zf[Ôx7€X‡ ‘’ÒNÎö ””œÂáÂ<] £)‘úßt꿜‹Ù5êÝŒ¦iJwþ³Û톉e™RMŒÔÿ¦Sÿå\´¼¶è„ÜŠb5ÚÝC9Ûß%w×{¸ŠwÚ˜ö7›z  4â:BœÚúŸ·r%û¿ü’ü¥K(X·OiŠªѵ3­ŸKÜ…‘tå• H>5m‘hêšì=Þ¦ádË#P5;m{=IPxgÊ 3È\5“ËþKIôHræRT\@Xh±q1çL||1m{ÿ¾Î¾ O“—ù1].ü?T-Pκh2ô’~pY ?!9%š”ØVtÞ‡ ¨p<%eÉ9DÁÏß²qÑB2f=Ç€÷> ¤];)¸&àÃÅëyéãè¦ –…eEyxþ¡'žºó)$ 3ÈÚ0L¾Êöåwp$g‡7õ#~aÃ.%mr'ôDP`ee¥ääæ°íƒ_§³÷Ö©DtK§Uì RÏ™Çöe·‘µa&É=Ÿ³.š„œdÅ ×Ó:TãÜa}±NÔ²#³va ¦uH+¢:FÑ¡g™k·òu³èñìs¤Þu—à©|b˜ÌþpOÞ1„À KA7Á´àH©ÎÓï|%a&aV.wç?éráÿ±}Å´Š=]ﵡdÙO œ5‹„¤$Œ¤dLÓÄ0Ê/>’Ü–ö·ÞNÖyòëŒç$iBG¶¯¸“v}g³å‡f¢I8²u+Kÿx9g™LL»x¬=[±J À¦ i Š ¸ ±Ê 1 ÓD»N]ˆNhÍêé …„Ð~Ô()È“hÛ¾|:&F¡ªŠwø2<$%k÷à6\:¸ …!=“åsÚ§@£?Îʲ¬F™\%{ ‰<“Ò‚ ü:g îíÛùÃ{ïwäž'g`dîö·, sÏ<ÿñÀ%ÿøÎŒ ~³…Ò‚ „Dž‰«do£_å¤iZ£o³¦I4]µ9¦a°âÚ‘¤¶%*& }Ó*”âTUAÕT›‚Í®b³«h¶Šß¹Ë07¯!ÐSBíøuÜXJ³²NzÝk '»-²,‹ïVíà¯3¢(U®ÃY¦ܺ…ǰðèN·UQNYyžÌ6鴳ƒLIÁF­K£léJ.š=õ§Ÿ0>Y¢~õš¦a³Ù°Ùlhš íë¯QÖ­Ã\úÚÆ\ôüó”.YÆ¡ui”l$ $¹î]W›<:J4®-³fAÎÛ' ïÈ@1MTT 4›ò{©=5¬}; ¥M$?ÿEzf'þÍ ¼þi:s?^N™ë÷[Ð+ÃÊ´@7Á0A7 Øá4i“šW˜ÅtÅÎÉ›¿ƒ><ŠöóÏXÿþBKK#ÿKøöɼ=ÿ-Þžÿ‹g<É¡e˱u튲e ÖÏ騶láì"ÿíìc²qIDAT\1‘˜þÿøgÍšE@@³fÍ:jž®Ëç¹Dã1].6>þ8Ó1öï€Ù<õ]!2–€7¿#ðÙ÷½¿2vm¥m§dŠ6¬#wéÒcîëxõZÔ¬Ôéaü‹_²zk6nâ;S 0­òsPTâÄrÑ­]´Ï¢III8N¿û8|ø0={ö¬Ó#·¤M:‰aÖÝׄnSÉ-Ž'hð@â1?ûrrÐ:t`Çþ,ÒÓÓi߯wÜv7wÜv7íúôeåÒ¥ìØ³[çÎ(6`._ABj*—\ÄÁühºM=j?†aðÆoð /ðæ›obF»Ù2Ì(j[ÿ Ö¯'04˜Àà Œ¼ïòjt<¶žçøò0Ãc1t #,Ûœ£vëƒÑ¬òž‚UZŠUZLT«`òV®ô»Ÿ†ÖëÆ¨£M¡þ×wûr ¹áñ  庡ý°—÷†úÜú}n}~£_Dz`œÏùÏëø1}=1Á&OßqÑA>û4hï¾û®ßý¼ùæ›ôë׈ˆˆF+Ï“Ù&IϬ6¦RÖêz:=ú8ÆÀ0ç”Q7‘çr±eW&X¿ž³F\…ÃáÀáppÖUWó‡õëùmKùN'ê ×ÃÄû0ûö!õþ)¸bFù½-ÿ믿&22’1cÆÐºuk¾ùæŸùU¢ér¹=z4ááá$%%ñ /ø,kÓ¦M#11‘V­Zqã7RTT$­»ð*X½š°àÌÒR,ïT8öZŒ]¨í:0÷Kôä.åAÖ¶Ff%SnÂ4-¬ŠÉ,*&,ØNþÒýî§6õzÞ¼y¤¦¦LŸ>}X·n]æWw¬ÎÖôwa·Û™;w.íÛ·Çápœòs”¾y7Ïø”szŸÁ ^Øv  xuêHÞ|h$o?r-ÿ|üZ>~ê>{ö&þûâ_Yúú<6ú"ŠË\†‰ªþþyÀx€9sæ`š¾.v»Ý¼þúëÜÿýìÚµ‹#FIhh(—_~9999~¯1Û¤¦Vö§e˜8p€˜˜,ËÄJIA;–u}{Óñ附Åŵ|X\]^{ui©hwß ÉÉX–Ell ð»7Þxƒ1cÆp÷Ýwóúë¯óx{ì1òòòضm«W¯æ‡~ð™ÿÌ3ϰfÍÒÓÓÉÊÊ"00|PZpá•÷ÓOÛŒâ¢òP2-LÃÂÈͦpôPo ½½ÄdÅw ÅÈÉÁ4À4+¦’b‚Cƒ9´zu½ëõ’%KX²d ¹¹¹\yå•ÜUívÿšæ×Vmþ.ÒÓÓIOOÇívŸÒó³à›u<úÖüyè ã¢Ù¾¿Ӵؼ§Œ}…lÝWȶ¬Ãlß_ÈÖ}lÝ›ÏæÌl²ó‹È-(&c÷A, ”*nïÕ«:tàÓO?õÙׇ~Hß¾}IKKãŠ+®`ܸqìß¿Ÿ¬¬,:uêÄäÉ“k<ÞÆh“šJÙŸÖaVTTD``Pù0Œª¢ª*»cZÓ톹N§áÃÙ¦i¨ªŠeYûí!íÚµ‹U«Vqíµ×0räHV­ZEff¦ßmøá‡Ìž=›ØØXâââ˜3gŽÏüùóç3wî\’’’ cæÌ™,Z´HZpáU¶ovMÃtyÊCɨ˜tÐfsdÒ(,· Å€åvQtÿ(ô샺…Y9†ÓMÕp®w½~ùå—iÓ¦ !!!Lœ8‘µk×Öi~mÕæïâùçŸ'&&攞›‡Þ\Ì¢e;¸îçãÁNfn ¨*ŠZ~Ž…‚i•ßða˜ºiaåš¶i*.Np€ïM<ðÀQ½¦9sæxkýúõ\xá…ÎŒ3øöÛok<æÆh“šBÙ7†F¿-F×=~RQT¥<Ì<7à¼Öãñø¬SõVZ·Ûå³ì«¯¾Jnn.aaaGýþ©§fT(_/;;›ÄÄïÏmÚ$úÌÏÊÊ¢[·nÕŽ]9j¿âôUSý8âD…„bVù]Œ  €OجzƒLqúÜ?9|Ëe–‡˜Qf–=€âÂ"ZuJ«w½ ñ®k³ièºî³­šæû«×þæ×æï":ºu£ÿÔµ-rº=` x ·ab3T,·Aa‰Ž‚…Mµ²+Úíª÷µeZ B`€ìü"ÚÆGøü€ªª,^ü-çw‹/&22’=ÎÂív±råÏ<òÈì[·ž’’¿eäïuc´I'¢ìO‹ž™e5ÞÅÇÐÐPœÎÒò[“+zímó³í?ÿ9æ:›?ø€ŽÎò°SPU…²²RBCC}–+++ã½÷ÞcÓ¦My§7²`ÁÊÊÊŽº˜Gff¦÷çÊwº•?ÇÇdzuk†ÏöŠŠŽÈ -HMõ?âì³)6À²”Ú°0t +"–È|­Cgôä_=}G¶ Ÿÿ5VD¬·wf؃8RXJÄÀs\¯ýÝ8PÓ|›ÍFII‰÷çüüüc®_Óß…¿}5ÎçÌê¶Ý§ï¸KÎNâ£/–`G'¥u0Åeûò–è8Ý&ºA•ÉB¯xƒa˜&v›JxH|»ž!}ÚµýI“&1{ö,ËâÅç2qâï¼Q£Fqçw²mÛVŠŠŽpàÀþZ›†¶Iu-ûvHã5Úqqqäää–?ï?€±|g¶ïÀ–I“(:˜sÔòEsØñÄœyv_Œ­Û°rò…œœ\âââ|–]¸p!}úô!%%Ùç÷mۦлw/.ü×Q'ûϾ†˜Jnn.999L™2ÅgþèÑ·2vìXvî܉ÇãaãÆÜ|ó-f-+ÎŽ{îÂ{õ¤¸ðHù#¶ò»u‹è×ÞÇÞ±3žíä\w)ÎMȹþR<;2°wìLÔ{—5u0í”èÕ¿ƒëu}¬{÷3™;w.%%¥dee1nÜøc®_Óßʼn ³ú´E7_Ö©7àÓ¯—’›O—¤04UaHxÎïÇ 3âèß%–³ÓbéÑ1–3ÚÅšM©SgýŽlžYð#¡AvFœÛå¨mzYYY¼ÿþäååqñÅû¼ Àáp™™É½÷Ž=fy6f›$avzf†^FPþv?ñÊÜ—1®¾ý…hAÚ¨›X|Î@6}¶·ÛÛífÓ矱øœt¾‰­£ñÌ}óŠ+PgÏf÷Ô)„ˆ¡—U¹%v·ß~›ß}=šyóæu²§M›FDDgœÑþý0xð`Ÿù&L`À€ ~9±±qÜzëh.¿ür 3é™y§À„ÂRS9x %:ÎPz^Î5鏿ܲÑ=îÙd_s ÎôeèÙ0<åËÒ*Š’¢R ‹K‰¾àüj·z×½^×'Ì^zéeþýïÓ¦M.¾øÎ;ï¼c®_ÓßESé™UNÎhÃ듆²rõÖlÞɀέ1-˜<{!f}½Ï~Â]OÌm3>â–'>â/Ó?âþWþÃû߬ãÏçwaæù R€ îãž{îaüøq>ó^}õ¦N}¸¸x†Æ€ýkf m“N§0«­÷¾VͲ,'ÀÌ'cüÄɸŽñ?Ÿ±r—‹?ú;î¾§QîŠ9¸ù)ÊòÒÙ|óÎéÓ‡§37µkWwÜNvI)›2~cWxù7œ¦–éœ9ø\bÃ[á|õ5Ìï¾C‰Šâ°ÝΊõë9ãïÝ ŠîGÜÓš}ƒùîÛoñÇ?ý‰ðˆHI&¢.õ¿xÛ6–ž{]£±—AI‘÷)ªª€Rå›^¬ßeÓ4;jb2›v$mæÓ$ßxC‹+ëšêcµE%Nÿí¸LCÎfÆ›Ÿ±äå¿He¯g[”µo/_|¾ˆ‡™^õúÝ—€ (J€#@AÅ”_åõ‘ŠùeËë€Aù%N NÀ •Ø{>àŒ!Ÿ±ÿα¬ž·Š ‡\Œâtbþö®—_!vÚ4ÚüñòŠ›B”ò‡ïÚIÙóÏc-[ŽŠËê%ÿ#âήt8›Íß]AlׇNÈI¨ád>\ 5¿EôÌj®ÿ!©©¤M}€Ì_$5&P1Š Q0UËç¶îß· £EÇ’u Ÿà³ztÃõõú[k)uµ¡mQp€Yc†ðÆ¢5¼ýé’ò t»±¬òsT9©ªzÔ9“¶áä;aÖ8_ˆç)Ë"$òL¢zlcï…ƒY¾|çœ3õàAÌÌLŒèÖ˜.g•Ž¥…©iX+V¢FGcDG³âç•XKT„Dž‰§,ë„u Õø‡%ZÎ0cMÚß{/¾þ†ŒM›hB`lf~^ùã­ ¥¢^[X j¨Q­1íìÜŸO‰f㌧f ëz½¾M¹¥ÔÕú¶E¦iâñx0 ]×¹îüö$DØyý‹"ï.å½ UUÐ4ÍûœXMÓ°ÛíÞ;¯¥mhÆaæi {PJ 6Ù”Ñ lsöä‡Å‹9»O"ÿ| ÄÇaš¦wWŠÄÄ ]}‡–-gÍ’%”3´Ñ ©Ý))؈=¨ òÝ â7¡5Ö1ÇCNNAO>Aá{ïóÛûïDLd,šMËíF±ÛQ°L(8RLæáCõèý–[È,8LÙŽ$$$*ÅÞHm‘®ëx<ïTùs”¸ê Â4MTUE³Ù°U„—ÝnÇf³a·Û1 ‡ÃQ¯7¢)…Y#õÌÂÛŒ$󗉤z‹íËï ÝÈeîÖeóÒ ²“²c;±±q„cYPZVBNN{~]EéšÕ„ßq&qݾ%HDêÀò/ç o3RÞ‰“Ð~ÖfN— §Ó…kð òcb(Z°€ý™{QBl6Zi¥F…¦Çƒ3(ˆí—^Š£gâLƒ²²RÊÊœ(Š"uºÛ¢ªÃ‡Õ‡ÛŇaš†w˜QU5ïcõe+Ø šq˜Y4Î5³èNÙûË(v¦ßGJ¯' ïLYa»/˜ÉöíkÖüBY™WÅÞ‡ƒ  @Z_ Ýî:‡v}ò®³3ý>tS%¡ÓD©`â·Ÿ5×ÿÀÀ@Ú$&bÓ44M% €CS§’™Ÿ‡gÇl{öœMq«V”ÆÅ¡''Ü:š˜ˆp"#"‰ŽnMÛ¶íˆÃápHnĶHQGyË4½“®ë†á}`såТ¦i¨š†V`•ËrNN‹žY#ݲ©8Hî÷!‡÷~ÀŽ_ÄSº [P;B㮤ÏW£ëåˬؗª(ãÖ—Qvð_lOŸŠ^–‰=¸=­¯&.ùz@ÞÅŠ݂֮þÛív’’’HJJÂívSRRBii)N§§Ë…ÛåBQìv;Jpp°Ïa¥>Ÿ¸¶¨j8Õö!¼r>N§ž™Õ¸'4<éz“®¯Ó:AíFÕnÔQÇu¬G` q*ë¿Ýn'""‚ˆˆi0›p[$ZP˜©ªŠi™RN Ã4åÂr%õ¿éÔ9-¯-j¼0S"""Ø»gÏiñæ¦êP~‘‘Q(Š*…Ñ”Hýo:õ_ÎE‹l‹-Ì4U£{÷³X¹|ýú :&Öç êDئE^n¿¤ÿLÏÞ½q8¤Pš©ÿM§þ˹h™mQ£…™ª©$$$rf÷î¬ýu G 1ª}³ªh@c©i„GDpf÷3‰nÝšÀ @)”&DêÓ©ÿr.Zf[Ôha¦( 6‡:ЦMtÝÀ²¤5jƒ©¨Øvƒ¤0š©ÿM§þ˹h™mQ£ßͨÙìÛìr¶EË|×*õ_Î…85+E „BÂL!„0B!$Ì„BH˜ !„fB!„„™B!a&„¢E«Õ‡¦³öí•’BÑ|Ãlîì祔„Bœ–Ÿ ?ÿÖH©˜*_«€fY–SÊX!ĉ¤(Ê¿P”G€ÃÀ¡*ÓáŠß—T,çtÀÌÊÀ“kfB!NuÏìx½4jÓK“0BqªTö¬Ìc„X­‡%Ì„Bœ*F•ɬòoåTc¬’ß@E @„á@DVüÜ ®XÎQ±=­"$«^‹BѲUí]U—^mªn¾×ÅŽÛ;³g‡UwZ9UÝ©pW °Ê.£*a&„¢†0«ÌwEžxü„Ú±‚ÌòfVEàø«´Ž‘¢îŠÉU%ÈŒŠí©U~'a&„¢z UÍଘ\Õ­j¨™Çë|«gv¬ óT 1gµ™^%Ìé™ !„8N¾˜Õ¬ÌO U¿ÿX7ŠóCÓ• ~‚ÌY%´*{d~nÔª„™™BaV5_*;H%@iÅëêfàÿ–}ËVCjVí•+ÈÜÈÍB!jfpô¨Ÿ»JהּJ/Í]­wVïžYÕ tZ•‰*ó\€½JÈ©U‚LÂL!Dõlß›@<Õ­êceïÌäèo¨±Æž™U%xü] «:thV ³ª×ÊÔj!&a&„âx½3÷fTÞRfÇ 2=3ªY%O•y•;vûé‘)ÈSE„BÔ.ÔL?=´ÊK[•áæ¯gvTo¯6×̪ï¸2̪öÆ”j½7é• !„8V¾TÏËO/íx >nϬúPcåÓ<üZåУV­7&ËB!jhU‡«>¾ªêsý}Îì¨`ô:Õ{Wj-þ• BÑVÓ¿þzx5†YåÏ5M5mS!„àXa„ÿï3«õ÷›+xŽrþS%×É„B44Ðü=Lø˜Oü¨MhÕ¶ç&!&„âD‡ÚqC¬.!¤4p¾BQ—@«óüú‘„—BˆSn>äÎB!š½ÿic7aÝõbIEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_data_details.png0000644000175000017500000050056512235000130025177 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¤[U{RsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ  ¾}rÉ IDATxÚìÝw|SUãð'éHÒݦ»´¥ì½ËÞKE”áA‘‚ C¦L'¾¾‚àÂÁôŠ ”=ËFÙmÙÝ+Ý3͸¿?Ú†¤Íê‚–>_>ùÜ{î¹çÜÜÜäé¹¹¡zˆ@DDDDDDõ‰ð°ƒ$ƒ(ƒé ”¢¨“ˆˆˆˆˆˆê~ø¬P8U±¬ÈŠûDDDDDDôh…QÁBµ*˜Š*YF¤w+[NÄPJDDDDDôH†QÁD *L­>ývÈÄ%Z>DDDDDDõÇþ­«`|4Tk$Œš ¦&C©­¥0:lê‡Z©Ws¼òTo>DDDDDDõˆcPhnajþþj¾»‘ª5ñÙ`*2Jm-…ÑéS'ÓóùlQ½”–•µ¦r'ÚÚˆ!wu¨“õNÙ@OÈøû«ù~e§þMS’#KC/Àš ¥¶–Âh¼"{Õë0šž‡ëçVjùV¡ƒ Õ åÂc]¨7%³ÐsàHHüû«ùô¨þM­w_Tò¿ÅPjò”]©Wóâ%{ ÕKéÙPdæ"òÂ! þ4šºWhù¨Ø üë´è<àá"«“õêeD§’@ªÖ»©Ø”ü¯F…R"c‡L\¢}þ¥×‘¯TmäÍ›w–•­•YÕjt íȽ™ˆˆˆˆˆê”äô\œ;¶}‡Œ†¯‡S¥ê¸|+‘!´ïãð)©£®Õ ‰ŠœÝÿ#öo]ÝC/ˆ•¹©Jnú£§¥§ø– §æ.jSƒ£66¶p÷õµºC…Ù™à@+QõÙô4`H¿îÜØNµm»ñy$"ªýD%Cx¾NÐh+j¼=œYRWi.ªkõ–áV:•z7bzê_üÈâwHEå©ñµ÷o-Ⱦ`¬¼Z­6\­-nÜŒÂÛL¤DD–¨ÔjÜ‹I@jZ •‰½dèØ¶àÀ±3øíƒç£üˆÁ}»ÕÚþ!òæ=¤efA£`gk‰ÔÝ;µ­ñu—ÝN¬ÚnŽ1ü "AbgwW4nØ{ûi_m~‰ˆê3±è~LÒj…*×Uš±ŒÕ»û`¸UõŒÔ«Bõê×]vYSÓËÖk$•ÑBzT?ˆêßô©î¾É‹€ÖÔ°fÉäß~Û¥›äï™LV.òjµHìíM×EDD€üÂBDFÞÄ“}›¡[«Nðv/¾@AfN!bS²±î—‹èЦy¹åjëñµ¨¨7oÝÆäíѾ‰¤ö6È+T!53K6G׎mjûŒm·CÇÏêBb)F‹ôœB\¾•ŒE I“ÆÕJëÂóHDT߉ô^Õ"‘HW‡©z×Ïe¶Ž°µ¿—k‡¥zÿ:tRWoØÚß1|`O³ÓÕ[†»^µ+ £¥+.½Ê®Pæ~ÙP ‹ÔBŨQO Õ Ðj5ÈÎÉÆÝ»w!€A¡Pð”]""sáM¥FTÔM|ðú@¸9K±ñ—ó8{="hâ…'û¶4y\.ž& :. I)P*•ØÛÃß×Á~ºÃúágÍ›„ &.…Ê"8Ȥhˆ¬¬$¥¤¡H¥‚££ Í5„«‹S•útýÆ=„=ÕšûaÍæø÷F"‚ýÜ1npkH¥R]_ªÒ®Ø„$ܺ@{{[xz¸¡qà ØÚÚXlŸ¥÷¥ÒQU™Ä÷hŠIÃÛÁßÓïm?ƒNíZéÚ= wWÝ2e§efåàö½XäååCàæêŒ@_x¸»b@﮺u èÝ‚pùMC—ˆ‚ÂB8ÈdhÖ8n®.ºvÇ%$!>1…Ê"ØÛÛ!ÀÏAþºÓ´Ì­×šùDDt_õV½Þ²å+Rïú¹£¶öw£á×\½e¸•„Qû’L©?2Zö껥¡T#£¤¶eB¨ÖŒÐjµøí÷_!ZZÞ>ÞH¥HKËÀµˆdeeA«ÕBî)‡ƒL†B·^°—:r&"2ânt,Æ j _¹¾üõ¢âóйS;@²²sðŸЮu3£Çe­ Å•ë71°ƒ?Žk¹«Ò³ °÷Ìmü÷Ú¶jŠ£áçu#~>‡·Æ ÜU†øÔlùë2úµõÆ€N¡pu” &9_þö´àêRùãvfVÚ6öÜŠK‡›«+T`㯗жUq_ކŸ«t»â’Ñ:@Ч=A™«Ä¹ˆüï`Z4ofùÍÜŠ¿”öëŠB¥»O^ǤáíФrrópøÄYƒÓmûõ 5èËè?¢}›Ð¤cɤîhèç€ë÷øóä-¤e¸|í†ÉSŠ×ýt³ž'$¤æàËßÿAgg\¼‰^­}0ïÙÁðrs@FN!öœº…#—n u˦ÈÊÎ1»^‘Hlv¾»C)‘>½|W #¤ÐÉ4]oi`4&•·Tï~ݶöwÝòeƒhØÚß1¤_w³õ–áRFíôÂhéOÁ”^Ô¨ô ¼â’›±Pjé¢FÆ7¸  Rá±Ç†B£Ñ@­Ñ@«QãÈñˆ¹ WgÈìm¡TBU‡¬‚<(îþ·Ö£àà,ç^MDT†"=][õœº‡æÍ›ÿ…S\¹~p4üúöìRnÙèØD ê€ µÅ®£‘رÿ*&<Ök Apáv’Aù& <0ûÓ}hâ‰%/õÁÒ—û`ï™Û˜ññߺi3Ÿ ÅœÏ!ÔÄiµÇNž7xl¬]¶6vÈ-PÂÝY†u³‡á\D"î¥â|T&ââ“àïS¥vi4x{ºcÆþBrZ>úv DØ3]a#açÑ;·¹5?kv4ü¤ö¶x¼GÀØ48;9"+;·¤ŽÒ >”¯+âÆm|9o8<\dxwó \¼Œ^7´->úá¬Ùõ¶jè…·>;€ö½ñöÄ^˜ñtÌZwþ>^èÓÖ/=Þ‡.ÜûÎãéþ-1ix;h´Z\ŽIB\B’Ùõææå™_:KDDÅäwHõ êcxmƒÇϘ,oM½ƒút3¥úatPŸnFÛ`æ;¤Ž0-ý˜²WÝտБÈXEfi‘JctºVÐB¥Va÷ž?¡Õj!hµ{y"&.¶¶b¨UjˆÅbˆÅbh´Z@jgEb4|¥nÜ«‰ˆÊP©Ôpu”²ò” B‘JƒÓçþ5øNcéHš¾Ä¤T<6¾øBs¿B³&ñë±(ŒîÓukŒ?Nî3(¿}ï4kÖÿ\‹ÔMÛ±ï*š5o‚ó—#~rg}(Û¦Òvu/óó^á“Ïâ•íÑÐÏ ;7ÄÀÎ ¡Ñh±q×ÜMH­R»°õ¯¡R©!ZºpaÏtEhK|¾ë‹ÛÜÔ{\©²}T©µøn÷E5À•ëQz¡Vd´.F™Ä*µЬ|hµZDÅe`Íæp´iÕ §ÏýkrÝ;ö_A³Æq6¢x=>NP*•ˆOLÁÂç;v¼¥JƒßODaÜàÖx¼GSüufŸÅõžûç’Ùù–¶ Q}£ÿ̼¢*×UzœµT¯¹u•W‘z­©ÏX½F©~- ¢¥§ñÚ•dÍÒ@ªõ]³#¤V²+€Z£Æ Aƒ Ñ¨¡Ö¨¡V«q-" QwîÀÑ¡ø/µZ •J…ÜÜ\¨TE·nÇ‹6agg‡ŒœBxº9ÀÝY†¢¢"ØÙÛ£k—½àÇráÈ0Xé~´:3W‰&Rdæä®(*2|“ÉÊSÂÎÞÍýŸËÌ-„½î¯ ¥—y¯È1»lYgg'de xû‹£p”ŠÑ¹¹& k'{LÖ¯¼¿§ÒíÊÊÎX•å/÷Fˆ¿;¤ö¶ºS”œ$PkÔnoY¥áßÞÖuoŒ)#;bÊÈNX½å¤Uu5ð÷Ãö}W0iX;ügæPhµî$d`ëßW™•mvÝiYhÜT¢Û¥ý.RAîZ|±«/æ0XÆÛÝJ¥ Áþf×k©]..Î|Aé¿GÛˆu÷5Úâãò¹ —¬Z6´s{€¸¸±XUɱÝX½úŒM+;¯"õž»pÉè“J¿SZÚVSõ–!)†%aTj$ŒêRŒœ®k,– ž&)Нž«Õj¡Ñj¡Õh¡Õj Ü\áêâAžžŽüÜhÕEØÙB€`Õ)RDDõ»»+N]ÃÈÞÍ0¨KCü}.!ÁA°³³µ¸¬­=2s wu€›“yùpu”–›|ØÛÛC©,²x|·vZhçöåFjC;·7Z6!! þ~>J%¸›…ù`ãÜÇ!“ÚA«ÖTº ·îDãëÃáî,Ãêï㟛I°‰ðÓêgÌýfšUïqeû¥TaÿÙ›˜2²#š4pGn^n¾X\œ‚ w•DoO¸…ýçî"ÐÛíû`Òðv˜3®[¹0nmûìíí¡È̇‡#^\õ›îe?ø˜[oÇv­,Î'"¢ûD&Nµêj¸%åK3¢HïX‘…SvÍ…ÞŠÖ{áßËí-{Q£ÒPÚ¹c;“õ–Íé(µÓ ¡ve¨ØH-{Ú®ÈÂUv0(*RÂÎÎb± l5¶ÐØj ÑÚÃÖÖµYYÙ°µµ…ªH‚ÂBäææÂÉÉÀ@JDd„¿~:‰¶½1np›â+®^¸‡ôÜøx˜¿°§‡]¸‡g¶Âè>ͱcÿUŒZü;ŸûÎÞ§Üñ IÕH K§vËEݸœz`wø \»‹ìü"tmå¸t3Î.NÈ*3RX‘v•~G&¯P©-Æ n]¡mnÍûѹ —t#¤“œ™T F‹¤ô\øz8¡kK\¹}¯Œho°ìÍÛ÷°pboü°ï2nŦ馩µ‹*×>o/Oü~SFvÄ‹·Ç¦?þ Bëo<= ÞÛz "±Øìz-µ‹ïÓDD†ôÙU¿.ô¾ëiºœ¥°[ÙzKÃhÇömu÷õ×e®^#Tc$„–ŽŠ–ÞD0<]eC©-L\a·øÍÐèß•j‡ÈmÇËÜôø,¸ØÙÁÅÅ‚    R‰ØÚÚ@ÀŸ!"2öfg#FpH#,þò(ïÙ½ÛbìÀV°µ#_©ÂÝÄL܉π\´ ƒeý|}ðÇÉ»‹Eèß©!F÷iŽôœìØwûÎÇ¢Iã†F©±dÝ4«û$¶A^A& o7g)ìlÄÈÎSâÐ…{ض÷*ãÒ•ë•jC£à |ü¿3˜:ª#ÖL€´ìü|8¢‚Ôü|ýÓ¤ó T8™€ïw_A£ ¨T*|öçñÚ“°`b/(2ó°óÐu éÚH·Œ—܆GbÂc­Ñ,H@d´ß﹌F ƒyãv…Ûçíå‰W£Q¤:Ç{4Á–¥O¢H¥Ad´?ºo/O0»^Fkv>ß§‰ˆÊ¤¿jêJ¸ÁÑÈï…–Nzõ¶o×FWoûvm,N7VoÙ·ù2Á³ìMl"Œê‡R¡l-]ÀfÈÄ%…Ï¿ô:b’3+ôd¥Fìƒ ’!‚666ÈÎÎFzZrssáììç–#áØš{5‘©7­€””TddeA©,‚ °‹aoo™L†à €.^têж$¼HLLFzf&T*5ììl!—{ÀÏÇKw˜/»LE¦UÖí;Ñ((,„Z¥†¶ä“®.Nð÷ƒ­­m•Ú•““‹Øø(•E°³³…bc Ê”]Æš¾•–Ñgc#†“£øB")þÚLnnbââ¡T*aog_oDÇÆÔŸƒ¤”Täç"@&“¢¿¬nŸ±iŠ´t¤*ÒPX¨„X,†“£¼<=áRò­–Öki>Ýçê(ÅÞÝ?cìsãq+>­Ru8É$8¶ÿ7<6b ²ò ëd½@ñþÎîÿû·®þ€@€\Ù2Jné%·L9%ó KÊëÿ6©XøiE/@$ 舌ÛGá&UB&‘@*•@"s€J°HÞ®Þ!¼¨‘9"ÀÛÇ Þ>^fËÚ·)wœöõó¯ŸO™ò(=Þ]ÆÚi•dñ=¦²írtrD‹æM ê”{x˜­Û𾕖±ÔnG‡rëw÷p3(ãäì„&ÎNV÷ÝÚmáááw“õZZ¯¥ùDD¤÷Ö\2☔ž[éŸ}IIÏÑÕ¥-ó]ϺR¯ñO-œe¿/*Ö+§ÿ¿J]ÔÈd u’þõÈËL†"3 jxÀÎß þ9y@lkÇï¦QQ¨Ò`Ȉ1Ø¿ûg4hÑn®NZ>3+q‘§0dĪ4ºà+€ƒL†ýû÷cèÐû§þý÷^8:8Ô™>¸¹¹ãÛï¾ÃäW^áZOŒ}a"@­V#;; woßÂ…³gÐ)´+ìí%e›4m'gg¨T*äçåqãÕ5~Ê®þ¨—J¥Â²wÞAËV­Ñ¬ys|þùe7oÞ‚Î]BÑ 0ƒÆÕ«×ŒÖ£Ñh°fÍ»hÕº ‚†`ê´×››kPöË/¿BÇŽàëç_£ý+**¬Yo¢aH#´iÛ6n4ÚýÿÍpVEtt4&Nz7A`P0žá( ƒ2ŸmØ€ÖmÚ¢aH#¼ùæl­ËÒ6>xèúöëAèÜ%Û·o¯Ö¾¸¸¸à7¦#*ê†Õýóñõ3Û?Kó•J%æ¼5Mš6C“¦ÍðÖܹP*•&÷+SÏiMm›7f¼õŸ}f0mýgŸaFØ ƒi–úaiŸµôÜWÅï¿o¿ù7oÝ2{ÌÈÌÌDËV­‘™•e0/33­Û´EfV–ÅvZ³¿˜;^Y3ÏÒëÛT}Öî/æú`jÖ͵§&ŽŸ)ÉIHOS@£V#¤Q‡ .&666ŠGàîܺ…ðcG±ç÷_qîÌihÔj¨Õ*„;•ZmPŸZ­Bøñ£P©ÕË;|×®^¦LùRZ­Q×qâèaœ8zQ‘סÕjuóܘè{?~ÇŽBÔõkëç[j‹þˆ±±iGîG\L N8f´lM¨ÈëÝÒ1”ˆˆ¨Æ© o¦ÊéOÿhíZDEFáàý8{ö, Ê…Ÿ ÇüލÈ >oÍk´žÿ~ú).]¾„û÷áê•ËJ¥XµjµAÙ ÿ\Àþýû˜oUû+Ú¯ÒÛ{ïEZÎ=ƒCàÄñË”ÞOJL$%& )1¡Jm2Õ¾ 'aê«Spíê\½r7Ʋeï”=uê4Ž>„sgÏ %5ïðA¥¶ñŒa˜7o.nߺ‰ß~Ý…ó.Tk_²²²°þ³ÏЦM›jퟹùï½÷>’’’pêd8N†Ÿ@|\<Þÿ“û•©ç´¦¶ÍˆÇ‡B¡ÀÙ³ç ÂÃÑ‘‘ŽÇ‡7Øv–úaiŸµôÜW¥..ÎøðÃðÆ3PTTdô¹WWWŒ|â lݲՠŽ-[¶âé§ž‚«‹‹ÅvZ³¿Täõn®¼©}Áر ì}sû‹¹>˜Z§5ÇGs}«îã§~ÝZ­*U<är$'%ÂÑÑ ‚ úÞääd¡ï€õÔ3pttDll4lmíàåã‹ìÌLˆD"]= qqðõõƒŸŸ?b¢ï]¶t½úm¸{ûŠ”J : ÃG> A+ >6Æ lA~>úõ„#ŸD"ÄÇÅZ=ßT?ô—÷öñ-·J§€²H‰Þý`Ìs/ÔØ{WEßO­=†òÆo¼ñöèÞêÌ©¯Ÿ¿Á­¬;šw×ÀÏÏ®..X¹rE¹Ñ?__888`úë¯ãêÕ«F׳cÇxwMq=NNNX²xvïÙcPfÅòËå5Ò/ý¾íúå¬Z¹žžžðòòªիÚ_Ž=‚Þ½{C*•ÂÅÅ‹.Ä‘£G Ê”¶ÕÓÓ«V®Ä/¿ìªÔ6–J¥HINAZZðŸ?®Ömݬy lÞ¼_}ùEµöÏÜü]¿î2x.W¯Y]»vUx¿ª©m#‹ñúë¯ã³ Å£¤ë׆éÓ§C,6|[ꇥ}Öš×WUôìÙ½zõÂGkך-÷ê«SðÝ÷ßC]2¤V«±eëVL›6ÕªvZ³¿Ôæö—Êô¡:ž¿ê<~cgo•ªö’âSvЮC'8»¸ ;; þ gg4hзnFA*•éÂQB|<š4k‚$ÄÇ›\¶üHm"Úuì ©Ì¹9Ù A||œœœue:v…£³3rssÜ0q±±ptr²j¾¹~X«C§.pttBzš¢F޻ʾ7Wt±ö=„ˆˆÈZÕúÒÒ¿Ø›’’’‚à  “óÝÜÜt÷e2™îƒh¹õ$%¡Wï>ÓÊ^$Å××çô+%5AAºÇæúWÓÎ;Õ«WãÊÕ«ÈÏÏ7º]ôÛˆÔÔÔJmão¿Ù„ÿ|ò >Z»...Xµr%†R-ÛZDGGcöœ·påêUV[ÿÌÍOMU 88Èà¹L-sʳ5ûUMmxnìX¬]û1víú×#"°yó÷åÊXꇥ}Öš×WU-|{F<1ƒ B·®]–iÒ¤ š7oŽÝ»÷`ôèQøóÏÝ í‚€€«ÚiÍþR˜Û_*Ó‡êxþªóøiŒª¨¶vvº?¦)•8z¨üwÅ%R)dŽptpDzšR™ ©))pqs…‡\ŽŒô4³Ë"Ûð”ï¢"<äÈHÏ€V«…D"…²°R©99ÙG''¤)Ðjµ°—HJæË›“cq~EÚbЬ¤ú§W÷{—~(­èþbí{QµÒª^%WwZ’·7¢££Ñ¨Q#«—7v…JoooìþóøúúZ,[ÌÕååå…蘄4lˆŽ‰1Û–šò.­óÕ©S±|ù;М››‹fÍ[¬S¿­1±±ðôô¬Ô6nß¾=6ÿ=AÀ¡C‡1ç­·piÈ¿ÕÖ—àà`løl=† }z÷†““SµôÏÜ|/OOÃç2:žr¹Åç¯ì´šÜ6vvv˜<ù„Íœ‰ æÃÎÎÎà´:kúaiŸµæõUÕç×ÖÖë×}Š)¯NŞݚ|L}u Ö®ý£FÄ×›¾Æûï½gu;-í/¶¶¶ÈÏχLV<ò–‘‘a¶ŸÖ”·öfíkÉš}¾ì:-m—Êö£:¡ ñp÷C«Õ@ØÛK0tøÈŒ\ KøàFT$B»÷@|\4ZµmUQÔjµÅeõïÛÛÙ¡ ¿jµ PP{;;ˆmlteórsõæÀÎÞ6VηÔ‘HMÉ÷^@­Rm«F£®ñ÷®Ê¾ŸZ:ÆU”øA®lìØg±hñ$&&";;ËÞY^©z&Mšˆ¹óæáÞ½h¨ÕjDDDâµ×^(ð©§žÄòw–#-- …Ë–-3YÖÅÅ·oß®±¶B"‘@*• &&óæÍ/W¦´­iiixçwðôÓOUj¿þútܸqê’W¦F³«ÂÏÏ]»†b×®_«­ææ= Ë–-ƒB¡€B¡À’¥Ë0úÉÑfÛhì9­ém6cbc¢1ã7ŒÎ·ÔKûìƒz}5kÖ “&MÄâ%KL–éׯrrsñíwßÁÑÁmÚ´±º–ö—V­ZáóÏ¿@AA’’’0Á³íµT¾²¯osû‹¥>[§¥íRÑ~W­FƒÜÜܾyÉ ñhÕ¦ ”Êâ âøàÜ™Sˆ‰¾‹Ä„xܾy‡ìÓð¹{È¡**Brb"lĶðóó×ý$Œ¥eõyúøàŸóg‹¿ËZT„[7nÀÛÏZFWæâ?硊¿ëzçÖ øøúCcå|KmqtrFTäuZ-Š”JܸùÐ?Tôõní{~‰ºÏ IDATQ­ ¤oÍy Íš6ÅÀAƒÑµ[w4(9õ®2È»víŠgÇŽE£Æ1ý70üñá5Ön?ÿ€r·R æÏ‡«›+º„vÅ€ƒÐ³GO“õLýu<6l¸ÁòÕé“ÿ|ŒåËW Qã&ó̳íZ®L×n]ÑÀ@„víwwwÌŸ7¯RÛø±aá•ÉSШq¬^³>[_#}š0~<¶nÛVmý37áÛoÃËÓ =zöBž½àëヷ-|X7öœ>¨mcŠ¥~XÚgäëkò+¯ %Åü)¯¾:K—.Ãôé¯W¨–ö—×~„¿þþÍš·ÀÈQ£Ñ»Wo³í°T¾²¯osû‹¥>[§¥íRÑ~WÕÎ[qìðAœ ?Ž‘×akg‹~‡@îá‰Ü’Ódƒ‚áâê†KÿþƒðcGq>>¾pss¿nЗ/þƒÆÍšAÐ P•Œ.Z³l©FM`go‡Ó'Oàì™SJ¥hß±3 î‡V/oœ=ugN„=ÚwìˆB+ç[jK³-ƒÇŽàßÎCî!ÇÃVÑ×»µï!DDDÖ•ÜJï‹Ø„M­p݆ÏuUÐÿÉ¢ÚÊ? âã*=ŸˆªŸ~X.V*•ÈËÍ)÷=I''g88:ÂF,†Z£FnN î‡AG¸º¹!=MQî}Éܲ~þHLˆ/~£‰àâê¦;e¹  ÙY™ÇÂØ&"'; ŽNΉD(,(@–•ó­i‹\ÝÜaggMɨ±««›®}úm­kÇX""ztIJ.D‹¯¿ú ë7~±€@€<Ù2Jniz÷³Kæ””WÐЀjº¨‘@£Óëú—©~=ìþk·õ£´­Å‹Ü?k‹ãGYU®Oÿºû¹¹9ÈÍÍ1Y6??ùùyFç™[V?à ‚€¬Ì def˜\Onn®ÙßÞµ<ßt[T*©)†ýÊË3ÚÖš>fp¿%"¢Ú Zé£ú¦V[ûõ(no~0â¶ásðhéÓ Õ§/×ÖAî¯DDDµ$ò zTÄÇÅšÝW-Í'¢úŒz÷`ö=ÏÒüú~Œ%""ª 17‘u!š£DDDÕ‹#¤DDDDDDôPp„”ˆˆˆˆˆˆ «FHïݽÍ-EDDDDDTµlÕæáÒšlÕO©DDD ¤DDT„Íœ‰={öàË/>G\\,~ùùÿ\'Úž¦HEš"wnßÂË/¿„~ø^™<¹FÖADDD ¤DDTÍN?èС$ööhß¾=¶lþÞ LéHä–­[Ñ©sgøù O߾ط?V­^ƒÖmÚÂ×ÏýûÀ¹sç –ýâ‹/!÷ô‚—·Z¶jÙ³ç ''§Zûààà€W§L\ü÷b¹vëK©ð“'ñذáh„€xæÙ±8tè°Éò¥øáíÚ >¾~èÙ«7ÂÃÃueAÀÆŸ£K—Pøúù£]ûøtÝ:‚`õz-Í'""b %"¢:ÏÍÝЧo?¼1# [¶n5yÚ륋—püØ1|÷Ý·¸~=Ï?ÿ2ÒÓqöÌi|ÿýw¸rõ*¦¿1Ã`™‚‚œ ?¸Ø,Y¼[¶nÅÂE‹ªµùùùøæÛo;w6˜'‰Ì.;uê4œ?_õ%nߺ‰9sfã믿¶¸ÎS§OáÈáCøfÓ×ˆŠŠÂ¬Yoêæ}¶a–.[†nÝ»ãîÛ?þ¬\¹ ?ÿÜêõV¶]DDD5MTr+½/`6ýµÂu>Gzš‚[ˆˆˆ¬vìØ1,Yº×®]×M³³³ÃÇk×büø@7B O¹*• ¾~þ€Èˆëðòò‚V«…—·D"©)F×¥Ñhàíã ¹Ü7¢¢ ê.=-¶ìccL]dHbo={v£C‡ºr666HIN*·liýÁ C **Â_íA‹–-!±·7º®²í»zå2üüütÛB¿ß;uBLL,Ο;‹dee¡Qã&Â?.Xµ^K󉈈¬‹¯¿ú ë7~±€@€<Ù2Jniz÷³Kæ””WÐÐŽQ5êÛ·/Ž=ŠË—.âã×ÂÝÝ*• +W­*WÖS.×ÖR^^ÅM,.~{Ò?-õÔéÓx≑nO/oxûøÒÓ3ª¥í¥ßïLˆÃ»kÖ@YT„·VlôuÑÂ…‰Å8h0ƒ0hð=zÔâr~~~ÛB¿ß ‰€.¡]!÷ôB£ÆM±±qV¯·²í"""ªi ¤DDTíðÒ‹/âï¿ö@µ|Ïsòä)8uú4¾úêK$&Ä#>.¶\x«‰'N\ºtÉ`žF£V«$&&–[vÚ´©¸}ë&öïÛ‹Å‹áâÅ‹˜:íµ*nËû£Ç¥¡9M‘ŠÔ”d«×[í"""b %"¢ZeäÈQصëW¤¦¦¢¨¨‘€ýûW¹nFpqqR©ÄªÕ«k¤J¥[·n´hÞ\7½aÉÕ‚÷îÝ‹üü||ðá‡å–ôâK¸~ý:Ú´iƒ>½{¤Ri•Ú3mê4Àò+‘••…ÜÜ\8pÏ<;ÖêõÖD»ˆˆˆªƒ-7U'''¬\µÉÉ)P©TðððÀ¸qã°rÅŠ*×ýÕ—_àí…‹0zô“ðóóìY3«µíúß%uuuÅÐ!C°zõýS×­ûsçÍÇK/¿‚˜3gŽ.¸–š8q–¯X‰óçÏC$¡k×P¬X^µ¾O›6R™ß|ó Z´l‰D‚nݺâé¯[½ÞšhQuàEˆˆˆˆˆˆÈ"^Ôˆˆˆˆˆˆˆ ¤DDDDDDÄ@JDDDDDD ¤DDDDDDD ¤DDDDDDÄ@JDDDDDDÄ@JDDDDDD ¤DDDDDDD ¤DDDDDDÄ@JDDDDDDÄ@JDDDDDD ¤DDDDDDÄ@JDDDDDDÄ@JDDDDDDõ„-7y11±øßÿþ‡cÇŽáæ­[ÈÌÌ„ ¼¼¼ÐºU+ 4cÆŒ››7iÕaÕêÕøê«¯¡V« æ©ÕjÄÅÅ!..{÷íÃ;ËW .6¦Vµ_îéeð8M‘Zë¶q]h#ÕœZuÊnÙ€RÑùÕE©Tbìsã°qãçå¨1Ü“ˆˆˆˆˆjyž Ò:aáÂE8~ü¸î±H$„ ã±oï߈‰¾‡¸Ø?v K/†··77=Z­/¾ô2Ö®ý¸N¶¿FNÙ5÷—‰Ú~Zæµk×±eëVƒi>[çž{Î`Z«V-ѪUKLú*Þ^¸Ðh]‚ `ï¾}øé§ŸpáÂ?HMM… ðööFÇŽ0öÙg1lØ0ˆD"‹Û0M‘Š3gÎâ‹/¿ÀÉ“§•• 6 æÏƒ‡‡‡ÙmoîôØ›7obï¾}8sæ,¢¢¢””„ÂÂB888 ;w„ñеk¨ÙmwèÐaìܹç/\@JJ T*üýüЫw/ƒå+ÓÆk×®ãó/>ÇéÓg˜˜µZ ´hѽzöÄOŒ@‹-xD""""ªÅäž^hÞ¼9ÂO7ø ,zöê7nÔú¼Pú™U$ÁÉÉ ƒƒ1pà@Lc:<åòÞž¥Ë–¡S§Ž˜5s&©± !÷ôªSß Ü¾c;AÐ=~òÉÑå¨>GGG¬_·®ÜôôôtLyu*Ž=Zn^ll,bccñûï _¿~ØôõWº@iÊ'ŸükÞ}× mqqqØ´iŽ9‚ƒöÃÉÉ©R}îÞ£§Ñé999ˆŒŒDdd$¶oßY3gbÙ²¥åÊeffbê´i8xðP¹y÷¢£q/:Û·ï¨ô~pìØ1<7îyLOIIAJJ Ž;†÷ÞŸßA%"""ªd2öîÛ‡a=¦›ö×_ÁÁÁ¡Îô¡ôsg~~>nݾ~øýúõÇ_{ö ((ð¶eÍêÕuzx §ìÞ‹ŽÆøñÜþþûÜsP(eÖ­_æ-Z¢A`Âf΄²L)¥Ñh°jÕj4oÞ 1åÕW‘››kÕ_3Ì ?nðxâ„ î§F£Áø Œ†Ñ²Ž=Š 'B£Ñ˜-·z̓0ªïÖ­[ذqc?Ÿ®[‡¿÷î5ÚWca´º¬Z½¦\%"""¢ºifXÖ•ÐùtÝúr#|J¥oΞ†!Ð0¤fÏž¥Ry~Qf„…¡A`Z´l…õŸ}ö@ò‚>´kÛï½û.&L÷Þ{ÏêöË=½ðÝ÷ߣCÇNðõóGÿþpåêU«ç[ê_eúÿÈÒ^×^›†Q‘ˆŒŒ@“&M°d‰áˆÛ©“§~â8.þûRSRñþ{ï­ë“Oþ‹‹—.áðáCˆŠŒ€T*ÅŠ+«ÜÆ»÷î߸÷îÞALô=|ñÅçpttÔÍ?sæ,vîüÉl{{|òÉ}ï."®_È# æïÙ½G÷×c#…¥ÓÍïСÖ¬^ƒöãö­›HINB|\,Ž9ŒÑ£G”ݲy‹Áã;ÂéÓgîïPb1fÍœ‰ Î#)1QQ‘ØüýwèÛ·o¹¶XÛÆkz/<øá‡HJL@\l Ž=‚Õ«V¡]»v<ºÕ#G>ÔT…îórxx8ÒÓÓñĆŸo׬yI‰I8î,Î=ƒ¸ø8¼ûîýÀ÷Þ»ï!M‘†‹ÿþƒãÇŽ\¦&ó‚)'LÀ½)Kí/íû_{vãÎí[1bfÏžcõ|Ký{Ðý¯,QÉ­ô¾€MØô× ×møéiŠ*¯ÀÜ)»èС#¢¢"ueÏŸ;‹À;w0úɧpåò¥ruuèØ ÿ÷ÓN4iÒššŠ>}û!2âz•Úëéåm0™œ”[ÛŠÙüÔÓcpìØ1Ýã>ú¯¼ü²A™o¾ýóç/Ð=îß¿?~þ¿ŸLþufñ¢E˜3göýà|÷.º„v5øëLlL´Éå+{:k~~>ƒ‚u½½½qýšîñÓcž1 ž=ûM,Y¼Øê}Ú6†4jŒììlÝã¹sßÂÐ!CФI¸ººò¨NDDDTG”~žß¼e öíÛíÛ¶âÙ±c1räHLš8Ñàó~ë6mñÇï¿¡Q£F€Û·ocô“Oáê•Ë€6mÛáßÓe‡Û·o£k·î5žLå•J…À `$%&XÕ~¹§nݼwww]6jÒÉI‰VÍ·Ô¿šè|\,¾þê+¬ßøÅnJòdÈ(¹¥éÝÏ.™_PR^ @@ @ðïž={+V®ÀåËWŸŸ_œ‚Ë\Ð'((Èà~JJŠÑºÑ­{Ãtmäâ@åàà€¼¼<Ý㜜ÝN`­k× Gôž(3š #Ÿx ^½rÅlcÆŒ1xìP.8VVNN¶oßâæÍ›P(P*•FOÎÈÈ0x|õªa»_zñÅjßo„_víÒ=^»öcÝUÄüýýÑ¿?L:mÛ´áQžˆˆˆ¨7n>øàCüüË/¸ví:¶mÛV®Ljj*‚ƒïŒ#5õ~LII1Èúek2/˜’œœlp]Kí`3d2Y¹Ÿœ47ßRÿtÿ+ëž²ûÊäɘ2y ®]½Ej îݽS.ôÄÄÄèîÇÆÆÂËËøyÜ>>>¸zå²Á)žŠÔ”*·1¤aCƒÇ—.]ªpYYÙ†E1rµ­²1ÊÊÎ6[gƒ†ÔÞήZž“»÷î¡Wï>X¼d >Œ¸¸8šü¾ªJ¥2ÛW__ßjßoÞ}wÉ+ü&$$`ÇŽ0xð:t˜Gw"""¢:@bo©S_Åôéo`Ú´©ØÛ—+ãååe ¢££áéé©{ìíím0_ÿ~MæS¶nÛ†~ýúYÝþª²Ô¿Ýÿ:H !•J ‘JƒÙsæ”+³dÉR(ÒÒ HKÃâÅKðL™‘ÁR/¿ôfÏžƒ»÷îA­VãúõLyõU³ë·æKÊ={õ,·cU”««‹ÁãôôôreÊNsuq1[§MüucéÒeˆ×=ž2e .þûR’“¦HÕ`m_“’’ª}¿ñòòÂ_{ö`ßÞ¿±ðí·1zô(´nÝÊàTjµZ>üGw"""¢:âÍY³œ”hòçJžzêI,Z´ … … -ÂÓO?¥›?æé§ïg…‹-~ yA_AA._¹‚E‹cÛ¶íXøöÛV·¿ª,õ¯2ýäéºOÿ‹%K–"00£G?‰n]»•+Ó­{7ôêÕ:t„»‡.|Ûh]³fÍD÷îÝðÔSO£A`¦N›†¨r'ŒŸ`ö~ýõ7ìܹÓdù¼¼<Ìœ5Ë`ZëÖ†§Žþ¹{w¹åÊNkÓ¶mµnë²ÕÔˆgÙ/¯\±º|ìØq³ëiÓÆ°ÝßoÞ\ím,Õ¹sgÌû¾ýæ;zá' ÛvµÌňˆˆˆ¨îZ²x1¼¼½Ð¹K(:w …¯¯//Z¤›¿hÑB¸º¹¡}ûèÕ»zõîõ@òBipõôòFó-6# { Ž9lð“/–Ú_U–úW“ý¯ÖÜ‚¾¨Q]4ëÍ7±mÛvƒà4aÂxLš8-Z´€H$ÂÝ»÷°oß^|õõ&$''|±yûö!ÕÙÙ}ô!>ð÷Þ½xë­¹ÈÉÉÑ•Y¿n^xáy“1öÅiseÊ^èûï¾ÃðáÃÊ] ©A` tçÍ›‹iS§B&“aÿþ˜;w.ii&×óÃÿÃŒ°°ûá‹13, “&MB@€?²³³qîüylÚ´ ?• öÖ¶±ÿxò©'ѳGO4nÜnn®(,,Äo¿ýŽ0½¿¨Éd2ÄÅÆðèMDDDDTjâ¢F ¤FbìØç~ò¤ÕËè‡4µZOŒÄùóç­Z644»ÿüÃà´ÜªÒQ£F›miÙgÇŽ­ðw/õ×£Ñh0jôhƒŸ~±f¹Š´ÑÚS'úôéƒ_wýÂ#Q ¤bnÖò¤R)~ú¿Ÿ0uê«å¾»iŒL&3xlkk‹Û·£wïÞ—íÕ«¶oÛfÕz*bÊ”)V•[¹b\Ì|õÍ7ß4»¼ ¶mÝŠÔX­ááá5«Wsç%""""ªCHMØÛã½wßÅÙ³g0oÞ\tïÞ r¹lll ±·Gƒ ðØÐ¡øðƒ÷u¿“ªO.÷À®_~ÆÖ-›1jÔH4hЉ‰9ò lÙü=~Ýõ ärjoÿ¨Q#ñͦMèÖ­+œœœL–kÙ²%>„qãÆÁÇǶ¶¶Ë=0pàlß¾ K—XþMQwwwìüñGìüñG<3f C&“ÁÎÎ ƒƒñ Ïc‘ïÑZÛÆS'ñlÙR 2AAH$°±±««+:vìˆÙ³ßDø‰ãhݺw\""""¢:„§ì‘Eú/½ø"V¬X¡›§V«±téRÁC.ÇÄI““A spÈ sp¸ßÏ;w0æ™gàåí 7wwŒ=)))ºùúeõÛ±wï^têÜ.®®hÞ¢¾ûî;‹}$"""""ª_T«5y³4ßš[uÔakp•]c7ãó^zéE:|X÷øÃ>Ä¿ÿþ‹S'ÃqïÞ]ȤR,Y²€€ü¼\@~^nÉýâežyæ̘ñ¢ïÝEô½»hÖ¬),X`bÝ÷ïOž2K—,AJröïÛ‹³gÏši?)ÕÇ@jfÔÎÜüÆM›ëî9zÃæ-[£oÿøqçN]hÜ´¹AyµZÖ~ŒÐn=кm{Ìœ5¹¹¹&×e#¡øÛ™ÆÿÁÄ\_¤§§ëoÞ¼ÿg-üüáä䈕«Và·ß~7[Ïù çЯ__HeR8»8cùòwpààA£Ëèß—ÉdHLJDª" `ÃÆÏÌô ´DDDDDD ¤©þ¼¹ó`VX.ý{;¶mÿÿ^„ ¸¸›QºòŸñ%®\½ŠßvýŒÓ'O@"•àƒך>Õ@пƧ'&$A.—ë'$$ C‡Nptt†££3BB#55Õl=§OÁàÁCáíåGGgxyù --Íè2ú÷·oÛ†ƒ¢{÷žhÓº-vïþËdû-`k܈ˆˆˆˆêY U©T&oææëÏ“H$HLJBJJ ¼¼<±bù;fëØùÓÿaÑ·!—ËaooÙ³fbï¾}&×UÙSv7oÞŒúëûúúâFT$rs²u·œì,³õLœ4 ¯M›Š›7o '; ‰ ñ%Üü)»;wÂÎ?"úÞ]¬]»aaaà)»DDDDDÄ@ª§:FH?ýä??yOyC‡=ŽÃ‡˜­#99#ž…VmÚ¡U›vèÓo@ñ©µf/ø#XHóóóqéÒ%Ì_°›·lÑ}G0yò+›9wïÞZ­ÂµkWñâK/éæ»ººâæÍu@"•@"±Ç½è{˜f2„êßéå—•ª´P«Õ ¤DDDDDT'ÙÖ\ÕBæÏkÓ¦6¬ÿ‚ àø‰p,]¶Gû0Y‡——vlßoo«ÖUü“("‚éïY:9»B$ÁÁÁ5 Aƒ~â¼¼¼PúË6sfÏÁ'Ÿ|‚#F"1) M›6ÅüyótõΚ9½ûôC^^r²³7lÀÛo/ÂøØ‰ð÷óÃÌY³ðóÏ¿´ÅØýÀó/LÀÝ»wÑ´iSlÚ´Élûù³/DDDDDTï©¥ß!57¿tÞ¼ùoãµiSA«…F­ÖÍsvvÆÝ»wѰaCÝrÏ}Ë—¯Ä·ÀßßwîÜÁ—_ƒµ¾o¼óâÒ¸j¼-ÙÙYf"óýeDbæ¼5sÞšc´ÌÜys1wÞ\ƒi#žOŒ0(?mÚTÝüìì,£÷Ç<3cžc²-¦úHDDDDDT©ùùmÚu,7íÊ¥ –0`fÍ~ ±±±iØï½·F7ï¥'aì¸ñÈÏÏ×-÷ÊË/ã[|ÉS¦"%5 6Ä´©SL¶ÅV,D€Èâhn~‚y•]"""""ªÔtÈ»|ñ“Ë\¾ønÙa Űdž­÷Õ)“ñê”ÉÓD"&¿ò2&¿ò²Um±`ö”׺H¹“i­c#Dx´GHùR"""""b ­‚èQŽ£!%"""""ÒZÖõoX2Q½ ¤@Ý8e÷QÇSv‰ˆˆˆˆ¨ÞÒº0B*=úW ­}$"""""Ò:H‰ˆˆˆˆˆè ¤×®Õ‰  T>òOò_þÎ=ˆˆˆˆ¨ž‹ÅpquEÓfÍáéå]?éø_©3OPNvÖ#»óե爈ˆˆˆªŸV«ErR  w IDAT"N?†Ž]ºÀÕÍýѤzÐcØ&""""¢ºÂÉÉ -Z·BÄõëèÞ³W­i¯ÁJDDDDDT¸¸º!+3£Vµ‰”ˆˆˆˆˆ¨‰DÐjµ ¤DDDDDDD ¤DDDDDDÄ@JDDDDDD ¤DDDDDDD5Êöa­X¥RqëU#;;»:Õ^Ž)1’rO/È=½¸!ˆˆˆˆˆˆ¥@‡aahÕº |ýüѺM[Ì C||<Ÿ1"""""¢G„mmkPll, ±XŒo¾Ù„Î;ãÂ… xå•É8pà Ø€€€‡ÞÎ4E*÷"""""¢*¨u#¤ïð! V,={ô€ÄÞ={ôÀŠåï 55ï½ÿ>222Ð Þ>¾HNNÖ-›””o_4DFFAÀÆŸ£K—Pøúù£]ûøtÝ:‚ [¦ôÔÛM›6¡]û{zYUwÙSv-­«K—PÈ=½pùòeÀÏ¿ü¹§~þåÀ¥K— ÷ôB—ЮÜ+‰ˆˆˆˆˆôa8tè`à AÓ•<>|øÜÝÝñì³Ï@£Ñ`çO?éÊìüé'h4Œ}öY¸»»ã³ °tÙ2tëÞwïÜÆøñ/`åÊUØøùçåÖ‰S'ѦHµªî²,­kÐàÁ€“'OþøãƒÿO: Â3ô4²jÕ*lÞ¼6l@AA6mÚ„wÞy§YÏ+ïG¼uìÐo¼ñF«_°víZŸikÖ¬AbbËðþàÁƒ7nŒ¯¿þûöíÃSO=…>úˆ8"""b Õ¢E‹1ëž{pç¤IèÔ©Ì&.¾øbüå­·<óØl6Ü›Ÿ®Ýº£k·îÈÏŸ ›Íæy=9%oýå/¸à‹Ð9=C‡ÃΟ~ò¼æþé]«s¨°·Ý6Ù9]‘‘‘‰ñ7ߌ²²2Ïë‡s}½z÷F÷¹XöÊ+!×§Wbb"úw>ý4&L¸ .äzY½z5æÌ™ƒ´´4¤¥¥aΜ9X½zõ)Ý­ó2ÚÍgŸ]Œ×^û÷ï:O¸ÏRrJ*Þ|ë-\tñÅHÏÈÄåƒcóæ-xç¿cÀ%—z>³»víö,#Ë2žxâIôî}62»d!oÊÔÖÖF]&Ó§ODzeË|¦-[¶ 3fÌð™¦U[ê=-33¯½öú÷ï.]ºVXXˆ‰'¢W¯^èÖ­&L˜à)“o¼1 Lá /DMMMÀö—,Y‚éÓ§ãŽ;î@ÇŽa2™pá…âÕW_h¿ÿú׿â²Ë.C×®]qÅW`ëÖ­X½z5 „œœ\}õÕØ³gOÌËxÿþöÛoãÒK/õÌû¿ÿýÏóºÕjŬY³››‹ .¸¯¼ò ›ü1žz¿ücÇŽ 9ÏSO=c%Çðýw[ñÝÖ-8ZtO?íä¾ùæ|öïá—Ÿ`Ô¨QÈÏw dí®5ò¯AºõÖÛ0mÚTìÛ»{öìFnn.æÎ}´)(/^Œ={öbCAþ»í‡\_4nŸ06näzÙ·oúõëçyÞ¯_?ìÝ»·ÕOûöíñü’ç0íîép8šó„û,ÀÆ_â“?Æ/?ÀM¿ý-nþÝïðÅÚ/ðáïãà/?côèÑÈŸÝ4øüÒ¥/`û?¢ `=öîÙ ‹Å‚ùóD}#GŽDYY¾ÿþ{À·ß~‹ÊÊJŒ1"âumÛ¶ kÖ¬ÁÑ£GƒN›8q"¦L™‚;v`ÇŽèÑ£æÏŸ¸çž{°téR(Šâu¼K‘——‡¶mÛlï믿ÆèÑ£c~/¿úê+¼÷Þ{ؽ{7ÆŒƒÛo¿ëÖ­ÃêÕ«±gÏ\wÝuøãÿó2Þ6mÚ„>ú»wïÆˆ#ðÀx^[¼x1jjj°eˬ[·[·nå"""ÒS¯²²ÉÉÉ!çyïý÷ñôÓO!%%©©©xfáB¼÷¾o“Þg/Fzz:1sæ ìܹ3ä:7}ó5 ‹Å‚víÚáѹsQPPàyýÿXEÏ,DFFÚ·o§ž|2îÇž––†ÊÊJž¡§‘ºº:$%%yž'%%¡®®®Ù¶×œ÷º]~ùåûœ>>Í€£1~üxlß¾~ø!víÚ…qãÆE}!)Ü´ï¿ÿcÇŽEÏž=‘™™‰ÜÜ\Tx•‰»–T–e<÷Üs˜>}º§\´þFVø•g´ký߃p7£YÆ[‡‚Î[ZZêiâ Àçw"""b =e†üæ7øè£CΓššŠÃ‡{ž"%%%¦íÞ9y2ò&çá?íDYé :ø‹O/œiii(,,lÖc{åJ 2„gèi¤W¯^>5F;vì@ïÞ½Oé> 444xžÇ#̘L&,eògϸ—3Üg)ÚÐ÷ÓÎ>a»¬ôDÌÇ0yòdÌš5 yyy0™LaË.Ú S§NŤI“°mÛ6=z{öìñ)“«¯¾F£ .Ä?ü€Ûo¿=èº „O>ù$¢÷¼5´¼HIIñiöìý;1ž2>ø^øÓŸðÿþúWTVVÂf·cÛ¶m˜8i’gž±cÇàá‡AYYÊÊÊðÐÃãÆÇêÞFûöíqàÀŸiV«‹f‹…‡ûÜ¿¿ûÝÍxpÎC(..FUU™;7äúôjhhÀŽ;ñð#`åÊUxhΞ¡§‘qãÆaÑ¢E8~ü8Ž?ŽE‹aüøñ§túöí‹—_^†††”””à¾ûïËz{÷îI'âÁ9EôYŠÆ¤‰‘Ÿ?‚ÓéÄ®]»‘7eJÌë9s& :3rëÓ§V¬X††;v >ø`TÛ±Z­0›Í0›Í8|ø°Ï½“ fÍš…åË—cÖ¬Y0A×uß}÷áå—_ÆÊ•+qòäIØívlß¾wÝuWÜ÷ûT=z4,X€ŠŠ TTT°É.鯣{÷îøðƒ÷±nÝz\ܺv톜ƒÇÞè™gî# õ¬T\Ü.î?;wÆ#?¬ÿK茸âÊ«|î±{ñO/`îÜG‘••Ñ£ÇàÒK.õYæ?þ½zõÄo† ÅE÷G—Ì.!׎{ÒÞgŸƒ?ÌüÌ&36n(@vvÏÐÓÈ„ pÉ%—`èС:t(ˆ[n¹å”îà /,Å¿ÿýotíÖ#FŽÂàÁƒã¶î)SòpâÄqŸiá>Kј5ë x)ÆŽ½]²²q×Ô©5rT³—ݳÏ>‹Ï?ÿgŸ}6FAƒEµž%K–`þüùÈÍÍŸqã0`À€€y$IB·nÝÂ6îÖ­V¯^ 6à²Ë.C¯^½ðÈ#øtt¯ý>•xà$%%aÀ€6l.ºè" þ!"": ÷ï"éÓ§Y_\¶åÑÝ—õÙ§ã¶ß߉šêª óë•“ôkh¨ÇÒ%Ï!ÿ¾É{¬N÷ç߃疾õçZÿgeÒ¤I=z4ÆŒÃ7Àpûí·ãÛo¿eaÿV…ªuUuu6¬[‹×ÝÕº‹ŽÁk¯¾Š—^Yñ/6 êT¨l|”{ý^ÝøzCãüN2€ ´ðR"¢3‰¢(Xµj:„n¸áŒ.‹yóæ¡ªª 'NœÀüùóqÍ5×ð!"": ± Q ‘••…¬¬,¬X±"ªagN']ºtÁ Aƒ`³ÙpõÕW‡Ó”ˆˆˆH‰ˆ(FEEE,„FyyyÈËËcAæØd·•“$ Š¢° N²,C’$?+DÄ¿ÕDD ¤ÔÂß瞇nݺòb1QëW_W‡`ËæM(..f„!IÒÒÒ0ð²ÿCÏ^½`±$ЮùTdÇŸÀwß}‡aW\‰ìœ®$)ªí*ŠŒƒ?ÿŒ7À(‰ÈéÚ•o1Qëå°Ûp¤èÖ¯ûW¿YYÙEve:*8rä0Ö}±’SЭ{Øm6Íy²Œí?|+¯Žœ®ÝbÚ®(Jèѳ F#6}õÒ:w†ÑdâBDgV MNI <¼ÿ¯v*î×ÊËJùµ6»_oü×\; — ÈÑ)+;;§ã“>Àî4ªªŠòŠrdeeÇmÛ™]º òd%N')5›iò«¯¾Â›o¾ÉwŠˆˆ¨S%%ÅHÏÈ`aD(§kW…­QV¢$AUÕ¸<$ÉY–¡ò~_":“éUW]‰yóàà¡C!ç[±âÏHNIEêYi8§O_äçÏFMMçõä”T$§¤â¯o¿‹.¾é™ü›ßà?_|'ž| }Ï=Ó30tè0|÷ÝwžåTUÅ+¯,GÿþÐ9=ýοzñŘ{¯#"":ÓȲÌfºQ$ ²,³ ˆˆô×ðÒ‹/"!Á‚™3g†ì‘¯¡¡›¾ùGÆÜGÁ_ß~=üpÀ|?nÿ_}ù%ÞzëMìÚµ·Ür+*+*°uËfüå/oaçO?aúŒ™žù_^¶ >ö.8ù·Ýv+,x¯,_γ‡ˆˆˆˆˆèt¤gu–>ÿ<6oÞ2æçߋ޽{Ãl6ãw¿»ðŸÿü'`¾‡~III¸òŠ+š¦=4III¸zøpÀÁƒ=¯¹› ßßl$$$`ÚÔ©€7Þxƒg5‹o6mB¿ó/ðô™pªœêíQüÅ«¹®ûADtÆR5jn»íV<ýôBìÛ·/àõo7oÆu×]œ®Ý’zÎJë ¨¨¨ ˜7%9€ïÝ©©®ÀîfDÞ€‹‹Ký\‚ä”Ttï‘ 8rä(Ï""j?>‹=Sç} —DDÄ@G Ÿ~é;û4§u›<9ßnÞŒW_ý3JŠ‹PtôH@°ŒVf¦«ó…=»w¡¼¬Ôó(=qœgQ+âîK %õ,tíÖC‡ÂO ¬¼¼Å½]»váÊ+¯ {,îG÷¹¸ýŽß£°ð°gžpa¶%ÖÌÌLÏ#š×½©ªŠ§žz çœsúô郅 ú|ð^—Þu†š·ªª S§NEnn.Î;ï<,Y²$è²îÇÙgŸíy}ýúõøío‹nݺ¡oß¾¸ûî»qìØ1~`‰ˆ´¥IJJŠ˱cÇŽ€×Ü7ú·k×6› O<ùdܶ;õ.WÝy󠪪 µµµX»vn7žgQ+S^VвÒØõ¿ŸðâK/¢ÁÚ€!C†âðá#-j?m6›OKž`Çâ>ž­[6£wï^˜8iR«|_ŠŠŠPTTõëÞV­Z…Í›7cÆ (((À¦M›ðÎ;ïh®OïzCÍ7gÎ$$$àûï¿ÇW_}…ÇãÿøGÐmÍ›7·Ýv›çõåË—#//?þø#¶lÙ‚sÎ9wÝuWLåÉ&»DÄ@ÚL €üü{¦¿úçèÕ«FƒË F=âH§Þ…çŸ_‚;wàìsúàÜóúáµ×_ÃŒéwóì!"j¥Ñï¼ó°ðé§1aÂmX¸p¡çµC……¸í¶ ÈÎ銌ŒLŒ¿ùf”••hªUt×LºÉ²Œ'žx½{ŸÌ.YÈ›2µµµ!ç½ùùèÚ­;ºvëŽüüÙ°5Ž/lÁ‚€””üñþû±wÏÏtïe“SR±|ù œ×ï|¤¤žroýå/¸à‹<=Ïïüé§VõÞ®^½sæÌAZZÒÒÒ0gά^½ºÙ¶·nÝ:ÌŸ?:t@‡0þ|üýïל×ápàÍ7ßÄ”)S<ÓþùÏbĈh×®Ú´iƒ»îº ?µ²2'":-©ûʯ¿‡æÌ xmÈ!øvÓ78qü~Üþ_Ü9iRÀúˆL":cptj"":£?~:uò<ߺõ;Œºî:deç 9%]²²Q^Qr%%%¸tàež&°gŸÓÇÓÌWKii)rrr<ÏsrrPZYºÞíý|`?¦MŠ9=tþ`µrþÜaàt:[Õûé@ýª›$I8çœs°lÙ2Ÿ{>#õÌ3Ï ªª ]t† ‚¬¬,ŸóÉíÓO?E=гgOÍõaÏž=˜4ifÏŽ¾VÚápÀf³ÆíADÄ@JDDÔŒÞ^¹C† ñ<¿sòdäMÎÃÿ~Ú‰²Ò8tð—°»¤¥¥á§;|BbY鉠󧦦âðá¦q =µ¥ÑèСî™u¶nÝzÆ¿Ÿ½zõòéqÇŽèÝ»wð/B¢Sç=:uÂë¯¿ŽŸþÛ·oGzz:.¿üò€ù^~ùe̘1#äºÚ¶m‹iÓ¦á¿ÿýo %ÀqH‰ˆ”ˆˆ¨EkhhÀŽ;ñð#`åÊUxhÎÏkV«‹f‹…‡#߯¶ª}ûö8pà€Ï´I'"?6:§Ó‰]»v#Ï«ãcÇŽÁÃ?‚²²2”••ᡇÆ7Žúxª««±ìåeè™›«{­ãh­¼‡c7n-Z„ãÇãøñãX´hÆoêúô騳gœN' ‘ŸŸQ£F]_8÷ß?JJJ`µZñùçŸãùçŸG~~¾Ï<ëׯGBB °ü¬Y³°ÿ~8Nœ8q‹-ÂÅ_}Uµ{ÙmÛ¶]DÏH‰èTá=¤DDtÆHNI… HLLD·®]qÅW`㆟ÚÉÿôæÎ}G&NBzz:fΘ>øÐóúÌ3pÅ•W¡®®ÎÓ!ЬY÷àÅ_ÄØ±7âØ±cÈÍÍÅ}!š]Î}ä<ðàƒ¸¸¿+ Œ}yøáˆÅ-11^Š7Þx]÷òZÇÑ¥ûwïaV½îm„ (,,ÄСC·ß~;n¹åÏë#GŽÄÌ™3±ÿ~¤¤¤àúë¯Ç¯ ‘î_ÿþý1jÔ(TWWcÀ€xóÍ7zû饗0}útÍu>wß}7öïß:`ذaX±bE ¥»˜gB#GŽÄ3Ï<ƒï¿ÿýû÷Ç·ß~‹ÊÊJŒ1"`ÞmÛ¶aÍš5HNNfÁµR+W®ÄM7Ý„›nº) ”ºÃè!C°råJEdÌodzˆ(n>|o5Ìf )i+ú’µjÞýçjdddì1 þÍÒ0DQÄ´iÓ°lÙ2¼õÖ[xùå—q÷ÝwCûÄš7oÃ(Q+g±Xðî»ïzBéóÏ?áÇã?ÿùî»ï> 2ï¾û., ‹"f³Y[Ä~Œ¿ßUc+DQ„ ž‡{ºÿs$Ñçuo’$ù<÷=Øt­ÿ§Á–׳NQôíó!Ôò±î£÷6Bí¯ÖOï}ó_ÖúŽ;ü>Fsì¡ÊNëq=QB~¯ Å{=ÁöÅw~5¢ãU&îéþ¯¹§©ªŠÇïèÎ?dÄ@­’’\:ð²ˆ>¬Ôø{üx,Y²~ø!víÚ…·ÞzKs¾´´4Q çp8àt:Â|ÁV­Z‰[n¹Ó§O÷L>|8V­Z Ah9Á"^ØOÁ™Å;¸C…Ö´€À¡>ôÇPóGŒ¢ Qá‚i¤Û :õFãU&z—‹f_´.HøÌbŸô–“þ`ªÆ¥L¼/øwdÉïÍÔ¬ϤƒMKKÃO;wxzç-/+EYé ž:˜L&Lž<³fÍB^^L& …¨ÕR}®v{˜Ífüío«0|øUaô*üío«`6›u-ß§ûÑ­{Ü9y2ÊÊË=¯ë £nìôàBÝïçZ¿«Eõe¡ŒÖ#Üë‘Îêxýç ¶\¨uEsl¡–ÓZVy«ªñqëÙÇp宬´B¹ÿ:üϳpÇì ·L¨i‘,lßÃÕîñ´}ûö8pà@Ð×'MœˆüüÙ8xèœN'víÚ¼)Sxè4sæLbÆŒ, ¢ÖGUè ”îPºjÕ*<ôÐCXµJm‰Ô:ËËJñÝÖ-0›Ì˜=û>žgê ƒÑ ¹šàŠ‚ç¡ ®f¹ÞÓÝ¿ ’ðå\EH’¤;h¸ƒUü?×jÐ`êl¾HBT¨ÐnÙ`Ûкh`0„nØê8õ„6­ýUV‘„<½!_ë"H¸í…z/õ”½ûü µ)1ê L3fàŠ+¯ zõzÖ¬{0pà¥;öFtÉÊÆ]S§bÔÈQ< ˆèL‹¤ºC¥;”Ιó`Da´¥R·””<ýôS(((ðLóþßáp80÷ÑGÑ«wotï‘‹e¯¼â3»¦UkY­iÉ)©X¾|Îëw>RRÏàêùý‰'žDïÞg#³Kò¦LAmm-OÏSDoY¤`ë÷ßv¨çÁ¦E2=X° µÑÖ܆Ú7­ ã?´åª<‚½ß¡ÎPÛÓS“ìù)ªa·Éyé¹ó;ÔÅ¢3:j5§òž6{v>ò™æý»(Џ÷Þ{±ý¿Ûp¬¤_õ%ÆŽó „¢¢"ݯ‡›—ˆZHUÕSòh $˜E‹cÏž½ØPP€ÿnûÅÅÅ>ÿSÜ5­‘øaÛ((Xï¹UÄ»ç÷½{vÃb±`þü­ý‹W“Ý`µjц¾pûq“]QõyˆRà4ATA‰xºû5ÏOÏ~ª?€âù]ß2ÁßËxÔlûˆâÍÀ" ":©¢œÑePV^ŽÇŸ‡!C†h¾þ¬Æ‡¼ïé•ý©'ŸŒy›O>ñR¼z!gÏï-ç‚D¸ûÿ´z†¤'Ôp5‰ñïÔH BãÙ™w¸wÜ¡zâÕšî^§÷þºï! ¶¬²#¡àÛÓs-òN‚”ˆk:ÃO4ëˆd^­s#Ò‰H‰ˆHG"E«¨Álîf´mÛ¶ÅСC°ôù%šó?~999qÝvçÎ}ž³ç÷_W¨û CuÊã=¤JàkbÐ/õ¡‚•ª*šï¿ªF7J¨Z¬Hj¸ôö$,ljµ–vŽ–Iøž]…ˆz² ?4M´Û <ýËAO€õ½ ù/@ ?LŒ{ž3õ1Q³æQõŒý’¡·™mZZ Ñ£G}ÿL 444 !!PQQ¡kk>ÿ ééé<)Á¾Ð‡Îªî *4†ª¡õš+Še" nÑ3½óê=îX‚ îçq(¯H;§â0ôK¬!4Ú‹\¼8F§‚iTU¡œ‚Gkö»ßÝŒç<„ââbTUUᑹs=¯iõèÞ·o_¼üò2444 ¤¤÷ÝØm°ç÷_ùs >H" ‰PEŠøºûÑ\!…ëÙTÏP4zzµ=ûm¯¯‘¬;\¯·zËFÏráÞŸ`µÔ¡z:×Sn¤çJs¼§áz,&b ¥¸“$ Ê~_Ñ™H›¿c#Y–!IR«-£þøGôêÕ¿2]Ü]2»x^ÓêÑý…–âßÿþ7ºvëŽ#GaðàÁa·Ážß]á:wñžÏÿg°Îv"iyà?o¨eC £µžHzÁdµÊG«,Cís¨}ÑÚ^¸NÒB5Ö³.½ïC¨²ÞÄ[»s"U•áî¼ÈýPUª*ëêðÈ=oÓòD­›ì’ëÊ„("==%ÅÅÈÊÎfÆêëš}åHINiQ¹Â5×õ~Ýh4âé§žÂÓO=0ßìÙù˜=;ßgZ¿óÎCAÁzŸiwNšrÛîžßï½÷^ž”¿R Õ î`¬]¨¡›ìê ¥±ý¬ƒ½ÇërÑ ÁíëñÚV,ÍPõÜCÛDVÓîx6áGgCl–K ¤Ô¢& 2Ÿ}ú ÚwhÜž½Zuíל÷ªªŠ²²2lݲW]u5ìv œZM@ Õ³h4,Ö{HCuÔÜ!'’P§'ÅëÞÍPÃê„ìIàîù6ü~hþuÓXVñ›_ÕìèÉÿâA´eÄ{H‰”Nkf³9Ù9¸þ†1øìÓOPr¬²,³`ˆN3ÙÙ9øÇ;k¶õK’„N:á7C†"£K—SRKín­ZF­ZN½½ÍÆ?P}ëŽO ŒÇÐ(Bœ; ÕCmÐi‚WQB\;5 ^C ¸îŠSÂUÉûü<ŒoçI ¤Ä@J¿‹%}úž‹~\ț։NS6›f³¥Y·¡( ;Ã(µhþÿç|kHý¿”«>_þ…`_ÚU¢VøðZC¨/ú5iÁC¦w­\$!§9{θ—\Ñ?È©AöÙ{Y;0{å2­÷Í5MŠú¸µß/÷üþß™Üc‚c¸¡]\÷Šjï‹ûˆÀ÷S ±ÑÞ6ÁñG‰”N1‡ÃÑøÓΠ:ÍÕÕֲ茬cžpó‰ˆî¾J½÷cÆÒä5–õÇN£­Õ³+Ñ4Ž$,ÇNƒ×~JˆGgCájÅõS¨ ½E1)Q3ÒHîu×F”âUÃmøG‹¤ùpèåb¢z§Gz¯m¬MœµjCÃݧì¢è:†Su)Ã(15³`5]A§#x‡CþÓTëôubä¿ ïeB ¥뽜Ñ6k ¢Ô˜÷#ÖPïù›Þ—¦çþCñhu¾ä½œžýÙS7’Þœ‰H‰ˆˆˆâøÅ<ò¿ðCƒÄ{¸’È›É QÍÙ°':GǾīÖ8Úæ©±t椷³+ß‹ ‘ïK<{Zwq„ˆ”ˆˆˆ¨B¨V £fÐ@lÅkØ”`A«¹k 5×/ªÁó¥ h,§F]~Ñ^LˆÇ¶" ²MÓýk±ý‡íÑ»}Q#¶+Ü=°±^Ä b %"""j¦@ª9¢ë€¨¹:5òoKÀ ·ïÑtëP0Ѭ7–0Íòñ'xGs,ñ“ ¤Ä@J§„ÑhØì68ìvO×âDD‘EF£ &“‚ÐÔ‹7QK¢ç¼p_ći ´Â §iˆ u¢Öåì]áî×TEóuI’‚¾ï‘Ô¨Æ+X1RÔêëêpàÀlÙ¼ ÅÅÅ,"Š˜$IHKKÃÀËþ={õ‚Å’ÈB¡É BÕ.j~ùö m*4î‰ÔZN ý%?\ˆtˆ­f¡±Ôœº×­ÝÉSðŽ“¢í 8XXôôÔGÛAPèZo1è¼Zcà6½OÁÃd¨å‚]$‰$\†󔈔š•ÃnÑ¢#X¿î \9üdeeëºRJDäMQ9rë¾XƒNÉ)èÖ½Ç7¦)TÍf$µp±Þë*4é uZÁMO(‰¦ykðe„¨]Ï¾è ¸zÃX¬!Wßr‘…Üp#鹘K¸ÍQMÄ@J±Ùíøzã—¸æÚQ¸dà@E-+;;§ã“>ÀîÍ¡Hµ;™ÑNüC@4¡ \ µN­f±Á–ño>é~]§ý=°ÁÖéX§‘„Ê`M­c ¤¾áþç`¨‹z/(„Û®VÓÞx܇LÄ@JQQ%%ÅHÏÈ`aQÌrºvEqq[ZP‹¤zCÞ^mc­%Œ4|„ ñ·3–Úß`)’}Ñ[SªõÚ¦×"=V÷4EQƒö¸ð  ŠAÏŸX6ƒ)1ÂPìÒ`a Üp&áA ÑœÔ+¯º²Mc˜TÃÝ£¨Õ“ ƒÁеjíTÍÚ¸pAFÝÇìÞÝÁXèY6T˜ÑsOh|Ç)U®huBÝËy·øý^S¡ªN¿íˆ!›Ø»è`44ÊFiœ_ñÚUPAP¡¼W‚®+!B˜«&zʇ茤É)©(/+å»HDDDQ‡ÒH‚M¸Ú+­Àõ=’*†€ ëÑÙ|8’ã×ê*Ô±ë)K=å癢¼ïTU#(÷!MïrªY¹ÆT¦QÞ·íç„(ÞZÅ ƒÉ)©1…Q÷:ÂÍ3nüxÍ&(z–?dffbذae ª*†ŠÌÌL~Šˆˆ¨UQ=P¡!Ôzb£ÛÔ³®€¢½4ܱ[¿ç‹£(†Ý¯H§‡[Fë‚í«ž÷/šýгoÁÊZëy4A/’ò‰5@F{ÜD§m u‡OïǩұCG¼ñÆgôI’€µk×úL[³f 9à=µî@ª'Ä„ûâéõp÷Z6m£éájb ¦&ÅZ“ðh»Þõè ×Zû.èE³ÿ‘Kÿ‡V³íh·Ö:õÜÉûë#Ô¢3&jñ®¥LNIÅòå+p^¿ó‘’z`íÚu¸|Ð`tNÏÀ^„·ß^鳜wmk0Ï>»¯½þöïßtžC……¸í¶ ÈÎ銌ŒLŒ¿ùf”••ùìÛ›o½…‹.¾é™¸|Ð`lÞ¼ï¼ów ¸äRtNÏÀСðk×nÏ2²,ã‰'žDïÞg#³Kò¦LAmmí¯RÎÓ§ODzeË|¦-[¶ 3fÌð™¦U[ê=-33¯½öú÷ï.]ºVXXˆ‰'¢W¯^èÖ­&L˜à)Ïo¼}ô‘Ï6ŠŠŠpá…¢¦¦†Ÿh""ÒHƒýŒô˽»ÖPkýþ¿‡z¯F=á!ÒÍ>é©u¦v9Þûî½Ñ[ƒ®µÎpÁ7šN¦´š1‹6^nD‰T§¶ý€‚‚õ(+=á R3¦c΃¢°ð>ýäc|ÿÃ÷ššúê©mmß¾=ž_ò¦Ý=‡Csž[o½ Ó¦Mž½{°gÏnäææbîÜG}æÙ¸ñK|òñÇøåç¸é·¿ÅÍ¿û¾Xû>üà}üågŒ=ù³›_ºôlÿñG¬ÇÞ=»a±X0þ‚_¥\Gމ²²2|ÿ½«ü¾ýö[TVVbĈ¯kÛ¶mX³f Ž=tÚĉ1eÊìØ±;vì@=0þ|À=÷܃¥K—BQ¯²Zм¼<´mÛ–Ÿh""ŠúËv$ãë3mûöížùW®Z…EÏ,DFFÚ´iƒÇ{ Ÿ|úé¯s’ˆ"¦M›æ©%}ùå—q÷ÝwG5fé¼yóìõiM+((Àå—_‹Å‚¶mÛbΜ9ظq#`èСHJJòÔ’Ïÿß_ÞBAÁ : _ÜŸ¯Yõö~ø!`óæ-¯mÝúF]w²²sœ’Š.YÙ(¯¨ð™§S§Nžß4§9NÏó’’\:ð2O?ûœ>>Í€OµñãÇcûöíøðñk×.Œ7.ªõ¤¥¥…öý÷ßcìØ±èÙ³'233‘››‹ ¯òtגʲŒçž{Ó§O÷”)Q´_þCÕvzOóïØÇ»çWQ}šðªª EQ" ‘þM€£i^ëœÞûl=¢(B’$H’ä™ßûá¦ý×®ÌB­3à juy?Bí«Vmu°×ƒ=WíUžMûüªæ×=°Žg€AD‚$º†Ÿ»ËÁû¡gÿµ’$ÁÐ8ô kH‰4.¼ðB¬ZµûöîÁ3‹žA~þì¨×e2™°ü•eÈŸ=;à^Î;'OFÞä<üï§(+=C‰ùêTZZ~Ú¹Ã'„»›"ÿL&&OžŒY³f!//&“)`ƒÁ€††ÏóÊÊʨ¶5uêTLš4 Û¶mÃÑ£G±gÏŸò¼úê«a4±páBüðøýöÛùI&"¢ˆÃ¨Öóp_ÄC…®P¡7\Ö ¢ QQõy„¢r¬ML£kš+DuOl°²Šwﯱvài o¨€ª9n4÷7GrÜÑÔn1†1eÊ]Ø»w/TU…,7Õ@¶o߈h}½{÷Ƥ‰ñàœ‡|¦[­VX,f˜->ìs/h´&MœˆüüÙ8xèœN'víÚ¼)S~Õòœ9s& :3rëÓ§V¬X††;v >ø`TÛ±Z­0›Í0›Í8|ø0xà€?޳fÍÂòåË1kÖ,F~’‰ˆ(æ É}’áÂk´ý„ë IO­U4ÛŒæõºXz² µÍHÖir¬ëŒ%¼GzîÆR¶á‚¸óƒˆ4Œ#GàŽßODVvæÏ_€ËW4…«3pÅ•WE<žè”)y8qâ¸Ï´ÿôæÎ}YYÙ=z .½äÒ˜÷}Ö¬{0pà¥;öFtÉÊÆ]S§bÔÈQ-º¼Ÿ}öY|þùç8ûì³1zôh 4(ªõ,Y²óçÏGnn.ƇÌ#IºuëuÓa""b¶ÛP!+\ÓÎpµpîŽiô ûKÑl¨­áb"éø&ر„ëÀH»s¢Æ¦­ª ï‘­#’rñÞßX/0„º°j]þ?£ …ñò…”šƒ¡5ìd°{F½§kÍsãØ±¸qìXÍegÏÎÇìÙùoWüsõjŸi#GŽÄÈ‘#‚k¨õ„›&Š"î½÷^Ü{ソjÙé~ýÜsÏÅ¿ûtï¸ãŽëÒšvíµ×âÚk¯õ™æßiѻヒûᅢŸb""Š*Ÿ¦ê˜'pZ°ŽŽÜ!'š/ó‘îC¨°n=‘›žý ~ÜJÈõÛïûuõ†ôp¯iõLiYúÏé~†ª™ÖÚ…xÃPM»›c{D­6yþ}) Þyç:t7Üp „ˆˆ¢þ"î_Ís=÷Ý…[FEÍZDQŒl˜—Hƒ™Þå ‹Ý4Á'héi>KXŒ>˜«/îxô„U­@êîÕ¸•C¨ZmQb %ò“••…¬¬,¬X±"ªagˆˆˆÜ_èÝO+, ¢îçýå^½kâT¿§@4– ”TU¯#ñ ¢ÆYáîçŒ$è85 lýCuà*Å€^н3¹ÿÿø¦ýW#.¼¶înêÛ4¿Ò¸˜"¨ÔÆí "¢ ˆ‚îqÐ(JcÀ  A†®‹ fI„"; H€C–a0ºz¿u8c© T@jÜ'ѽo‚³éAcPTCcï=Š_8õ~;hœÃ*  ï“êz¨þÁÔHý>D ¤tÆ ×„˜ˆˆHPa&X3S=MJƒOSu…Dý5˜úkÈâQcúØ”ˆ·¯glRí²‚îãöžGR¨¢ Q÷WpÅ5¯uHîP*ø_”¼‚¨Fhö ª;< * ¸†g—•²â€$I€*@P…ÆëzAÑ ~‘¼¿‚ „ŒŽî°ÚJµ^ôçý£Ä@J§€$IW툈b#˲ëKQ+ ¤Ñ„ÂHjè‚-i/»^O‚\DÖô5Úi9‡j'Ô}œzi¨f¦®|¥B€êIeBc-¡ªª®p¦ŠUw¼vמº¾*«‚Ô8IðÄWwhSUî_É«y­ ‚ A€Em\R!@r /Ú E¨€ D{½µÖ¡©VSpÏü!îMe+4b ¥SNE¤§g ¤¸YÙÙ,"ŠIá¡CÈÈÈäE.j54š°I(õŸ-òDS3kØÖ }Ñ–es—‡Ï>ºãžàú©âÜM¤Ý—ÒÁ·S*U” z5ûE㽿‚*CTWÀl?VQd¨ª®‚(À  ¨D¨CªÚØ$ص=Q3°‡|O"¹â½>1°Ã-ïž¡ƒZ"RjF£ ƒ† ÁgŸ~‚öÚ#·g/ÖnQÄdYÆýûðÞ»«qÓ¸›a·ÛX(Ôê©o(ÐŽËx7ûtÒP=ñúÁÁút$½Ü+«P³†*K­ãÕ»]=Ëú¸Õ' qV§ö¸¨WwÔeJèÑ-ÕÕÕH2™pòd9jKkÚ¡#LR5Ú´U ×Cyy=ê¬õ°Z­pZ,8\z‰–´mßrE9Ž/BÇäTtJMƒÁ áàίյ7jŠJa—EMmPg¯Cƒ9ƒ’$yŽÁétÂápÑ`åäý, ¬¯sI:rŸƒM àFy)1R32›Ý‡ÝîÓL„ˆ(¢(Âh4Ád2Cšzñ&jyTAÓ`Œî߯×T¯iïÕ8›kz¬ÛŽ´3¤h]ë¾Xwø‰tßÜ=Á \=ª¾Ë(c†ª¢Ð8Œ‹+MI’UÈv Õ¨©,CUùQD õÕPì (>|Ç‹ ®²ª½ÚH€àÀÉŠ$H’‡Ý ƒ$ ÁbBuUY…( ¡Àd2AÔ×7àĉR´oÓv» ‚ AÔÖÖz¾[I3*ªeXëjQ^Y‹:£g¯sP]^¹­ Å`€91 K"Q„Ó)Ã&;`2Z`0˜ %ˆ‚ª»I·¥·§H4îÕ|;,r½ÞJˆ>ç=<Ͻß3Sb ¥fR_W‡`ËæM(..fQÄ$IBZZ^öèÙ«,–D µÐ@ª‚ Õ}VP\÷^ ªë‹¸Ð>U×|PÏÚ!LÕÚˆçW£( mÚ=÷ªPÅ`¡O ÙY¨†‡AÇžŒ¶é¬ hîc`1øÞµèn꽌GDM}†#Q¡xm[… *Œ& T°5X‘””«ÝHF8lv$JjjËQwüg8*ŠÔ±ŽFѱb”?kC RÛ% ¡'kN"##5µVØl6äöèU2 ]ÇÃnµãÀ¡Ÿaµ;Ѷ]Xí6tèƒ! õÕ0M¨¯³Âd4 a2˜á´ÙQWWújŽ;ëaw 5Ça«)‚%©êÔ}PD#ÚwJERûN®f¼6RÏÊ€S±Áiw@–M@4BM0ÀÐLÛõ~j5ÏwÇIÞ'˜çb‹÷ظMÕó9a%Rj.» GŠŽ`ýº/påðk••¶I ‘?EQpäÈa¬ûb :%§ [÷ߘZf kzšªÑ{múé ª‚;¨ Ír¿c°åU .ûè½—SÏþÇZCMoÀ_ð¼g¢;Ô6֔ЂEqz.:X­õp*2ìNíÛ´AÉÏ?Áè°¡´øœUŨ®Px´Õuµ°Zë!« ªëj¡ª pØPQY‰”äd f¤¥5 ¶¾uÅÇñÃDbb"Nž< ƒÑ‚zk9êëëQUc…½¡ªl…*;pÖY) PX­VØívŒ&Xj`2 0Œö† 8uètV7f ª³ 5eµPu€Á§Õ Áƒ`‚¢¨"TQ… ŠDµ±ƒ&ÿrR<áÓÝ@UpÕƒúfXw(Ðt%Ä»vÔëu"Rj6»_oü×\; — È!¢¨eeg£sçt|òÑøÃ½³Y Ô2i„=Ëê]>šÀ!N¼§ aÖØd3²Ò€é14Žtºÿ<ŠçG¯škÙu!Ñb†ÝÖ‹A‚]V À E¶£¾ö$Nž<‰êÇ ËN”UV¡Þi‡Íî„Óé„S°B„fƒŠ¢àà¡Ã$#Î:«3JŽCeyN”–CQJ!Ë2Ú¶m‡ÓÕ ‘Ýn‡µ¡©)!«2 HJL‚ÍfCyy9Ú¶i«ÕêÚWÑÕ{®Áh†$`0&Á®E„di“¨ÂàhC RÎÊ„%±=)Q„Á`„Á,Ái—¡úµÛu×EKBSxwÿ›ªŸÝ¥è;UU4{yf“]b ¥f£( JJŠ‘ž‘Á ¢˜åtíŠââ"¶´ Hµ‚`$Ï£ ŒºƒlŒ¡9ÚàqmgË!ü>©š½ ‚AQ!‰€S•¡ª $É8m0š @ÁÉòR´kcÁž}%°Û­(--…(аÚmp**pª T§ ‡]AƒM†$IHlÛªSÆ/…‡a0`´$@«ÝÅ)Cj!JF$%%yΩ“'O ÂÕɑÎN:y:"r80ˆ"l6²ª 1¡ Û$¡¾º‰í:B‘í°×4 BuÀd±À¤:!ÙÛÁœh À)K"dQ…$šÐt/t µñQWMÀ7@ÝŸûB ¤ÔìdYæ—G"Š I’ Ë2 ‚ZmX6¼… [‘„=÷ý‘~±Às V@kœ"ôl?År¼úæÑ>V®¡\ˆP;d»p4@µ[!™Yv¢¡¶Κ2”/ÂÉŠ2ÔÕÕAD4ØŠ(A’ŒPjëí°Û0%9Z“Á‡ ”••¹†dQd’¢*Âîa¢ Q  &£klS¨¯¯G]]dYFBBl6ìv;ì²N‡ÅÝ¡¨Âb4 m›XD׽̎Ú2¨V$glIfX$ÆÄŒ*I€àT“bÀøµ€Øt*4Þÿìºo´qªOó禦먪¾÷žˆ”ˆˆˆ(ÊЬÉl¤áMkþÄ ƒ8†ZŸ„Pcob« ²Ær¾Ãxø¿æûÓ7ÕjuVä;-t€ý¾QížyA€äÙ€’*Á"((«*Eyi 2Îê»jÂî}»q²¢{wþˆº“'pòxd»Íµnɧ¬ÀfµBV˜D² Âj—aI`u F+¯F}ƒ’$!ÁÒÖº:˜L&ˆP!I"ÊÊÊЮMXLh›`ÍÖ€vmÚ¢ÁàÚËúšjtîÜuuu¨®«‡Ãé„Å’§ª ¶¦õµ50)´oc†Ãá€Q’`±XÒÑ£Ñ TÁÿgïÍãm9Êzïo ݽ†=Ÿ}¦}¦Ì eˆ@T€PW®\T¹’ÄpÁ €÷ Q@?^Ðû*|¸æŠÊà‹ˆ†€ˆ†Œ'ãræ³ç½Æî®ª÷îµöZk¯µ‡s¦¾|š^«ªºººzþõóÔóÔ“%ÜØfDiœ¸^† Laò,œT8ò¼¤¹!Ô9Çò µæ¬ã»N·ëN*qÎ俇Î(Ô^z¼ }DØ4¹™™é“ëª_«­Çãñx<ž]A:Pìbú“Õ"ßâÖßß²P^ßxÖ·ýÎÕÏýòTâzÇôhô×Y&@J…ŽÄÄ,ÎOsøÀƒ¤µ“J°ÿþû¸ï¾»6áð}DÚQY\ X,ÓHH€ ÐZ㜥7I“&©³Ø4E%ëbœ$ÆÐ\XBJI­£q†‡pΡ”"Pšf³I¡P ÎSé•J%çfYXX R© T€”h­Ñ#­%s'3{òFƒ±ñƆ"¢@P¯/0Z( laë(7." E‰”.[#*3K²qáDÏ‹‘q¿†»n÷ïiðïÆãñ‚tƒ‚Óãñx<§•²7°Oï~e@ –åh¥0rÎô`ƒ„_g`¡=u ÜõXc»¬ˆÆ×Ùn­%:»šX\y]ýRæô¯[ÅM´ÿ¹\šPYZ ^[äð¡ýõV¤³>ðI£ÊÒÜ4Jg÷? $iJ„8$HÓ¬C*M1 ´ÀjM35Ôã¤maTLÒD:m*¥Ä9G†$IBš¦lžØÄÂì »wíb~~“¦Xk©ÔkDQÄÔ¶)–+Ôj5Î8û,æææpy¦¹¹9¶mÝÂHy+¤K„ÊP3 HƒËÓ¶‘¥mqÎ!d–«:SÙec¨Xíþ·~{.¿oÿ6|´]Ï#ËÄ‚ÁM“›yÖ¥—­x+ãœã™Ïº”M“›Ûe1ºir3¿ôò—÷}“Ô9^ÇãñxN¥VåðáÔ‡ŠŒŽ”bd¸ÄPQ3RÐ %Ê¥(gØLpbé{ ÅrÎÝV:£µ¶µî©Çó¸¤Åb‘/ýó?w•}ñ‹_¤Tzì&]çŸø„ÿ•y<Ç󤽢´÷Á{£èkµïw¾ýµ„ƒtí­UÖY×¹ï'4VƒDàéÌÉzô)Ï©ëYîèºe[ÁÔ¬K¦Z™§²4ÇâÂ,z ›Äm ¢C‚PXkóï6[*€ÜBiŒÉÒÈ Bëò±ZJ8'°Ö¢òuŸ###‹E¦§§)•JLLL05µ °h-Ù1µ¹ù&&ÆXšŸcóÄ8\pß¹å{ÜüÍã¡ýû˜_ <<ŠŠ÷ IŠ…Ñr¡BÀp9d¢¡0(çPT>?RTç¼I×3ï@.`WÛ¼õxAÚÁo¾éM|øÃî*ûЇÿ„7ÿæov•uZ›qÌßô&vîÚÍO¸?ùÈGºÚ®Ußûî÷ÿpþù°cç.^{ÕUT*•UÇüþ÷ßÀÿúø'¸ÿþû¶Ùà¯zÕa÷ž3˜šÚÁË_ñ ¦§§»®ç/þò/yÚE±}j—^v9ßþöwøô§ÿOÆÅlÛ>Åsžó\î¾ûžÓ«Çãñx<'V³Bd« µõXšY!×#×:÷FǶž>OõOEÔ¯v ýÊ%ßs±X(BÇ1‹‹‹(¥¨Õ*4jK`R´È,¨BRgI$ÖtCªÖKƒåÈ·"w­sJ)Q* "œ¨0 Ifff¨TªJEŠÅ"ãããDQDµZeÛ¶m 355…sŽÅÅE aÄÂüö|˜…¥ ©±Ôj5jÕ%šõʤŒDŠ‘¢"”é‹®=Ö•XºÝŽ…Ôãéºù¹Ÿ{1'ONsË-ßà›ßü&³³³¼øÅ/xÌ{þà=ÌLÏpÛü;ßøú×øÆ7¾±¡úNþø?Èmßÿ>7Ýô¯Ü»÷ …ïz×»Wóèè(ô?äêÿö’$éÛæ—ùU\}õë¹ïÞ½ìÝ{çœs×_ÿŽ®6_ûÚ×ùüç>ÇC>À/þÂ/ðŠW¾’/ÿË—ù‡¿ÿ;ö=ô W^y%×^wÝiÕãñx<žÇ³(í´˜¶¬˜½ÖÌLˆ(”R]m[e½åõý,•½çîý®D÷&ÉDÑšeR¬{yœÎM©Á}ô¯“¯aPÙZm•+™‹/)òkÍ륤ÙL¨V«ÌÏÏ3=}‚ùùYŒM³@G 6n’¦)$¥¬‡@¡ZZ”0héÂ"\Š´a Îän½qÒ¶¨B¦Ó4E(IPˆh6›<üðÃ,--±°°ÀÈÈ»wïæî»ïæÈ‘#,--±uË$㣜}ÖœuÖ( ÎZŽ>ÌæÉ †Êe&FÇ8û¼ó8ï‚ Š%–ª5B-*R R*Ó™?|?ªz‚á@R’H"! …BK΢%HIÏÜçeJ Þü{ðé=kA*¥äoü >”[I?ø¡ñ¦7½qÕû™Ïðð?™œœdóæÍ¼çþ`Cõ|òSŸâ}ï}SSS ñ{¿û»|þ _XsÜ—^z)—_vï}ß }ë¿õÍ›¹üòËÛîï¸þznºé¦n1üG`ÇŽ‹E®¾úõT*þðýïï*»í¶ÛN{¬Çãñ<žÄh¯0í|à~¤\v×c½\­¿õžo­1ldíçj}œÎœ¬u=§kËr·Jj333Üwß},..Çq×Ë©*‘:Xy.g‘Šå¶R¢µ$ZëvÙr®OÐ:$‚ Š"J¥óóó8ç¨T*,--11>žå2mÆ4 ¤”c¨WkJ³wïÝ !åb„Ž(Šˆã€ÉÉIÊÃÃÄqL(Ã…Å@i`KRJ…’…ÈÝu;Dü:~ +'sÙ7Ú[F=6?RQv_ùÊWò¾÷ÝÀgþîï¸ë®»ùä'?¹jû'N°{÷îö÷={öl¨¾“£Grñ%Ïø³ÕxûÛßÆÏ¾ð ~æ§šK.¹¸«î–[¾Ë»Þý.n¿ýjµZß~'&&ÚŸ‹Åbß²4M‘±z<Çóx¤mQÓ7Ã’½Ã·QF ×Ì_º\ÆÀºAcôŸîA¯uŒ[ãZŸ¯U׸ûøVÄUÛ§¾÷¹ê¼wÏ«êúžµm•‰ž:I¿øÅÍÜMkPÕF¥:ˆHl–’E °Æ’X‹µ)65X%À,¥Úæ`Ck…–¹•–l‰jæÒ›¦7 ‹&©Õj EE¶nÞÂÒ K‹ Œ •ضõl¼ÿ>FGGÎQ,F pàÀ†‡F©V«$Í”‡>ÌØÄ$‡ei©B©T"®70IÊ™{ö`ëŽ;†”’‘‘†††ÐZ!TŒqu„“¤"À ¨®ùÏ´¥‘¯]÷¿õ»òx7‚4 C^÷º«xÃ~ƒ·¿ýmDa¸jû-[¶pðàAÎ<óL<¸¡úN¶nÝÊ—þé‹lß¾}ÃãÃ}ôOyͯþ_þç/uÕýÚ¯ÿ:¿ÿîwóS?õ<†‡‡©T*œqæY§5O§3VÇãñx@ZwDÂï\W—¹3.‹¯–ÐÊ6-EÏC:}>»•eª»n])a¤\¥M7­T/Ž~©9ÜÀ¥Ëc”íT8¹‘µ}¬]V6®;²pýÒ¹t§®é*o"®cnmGŠ‘Îûb;>ƒR*aàR!òïÍz‚֚Ņ*R+FGG¥2{­‚B1 \”$“ œ@H!²¹B!„£Yo „ ŠØ¦È( ÐCQX 6‰1RbMBA°B›€¸Ñ¤Y«31>F) *Q­.±mÛ6¦Oœ \,Ñh4hʘ±áMT*ULâ-Ž3{r“KÆF'fxx˜¡r‰R2?;ÇäØSÛ·rôèQÂb‰¢ŽHâ&•#{It™‰íg2]­à¢ Œ(]su×¶_4Øü>;çÖ|Iáñü ø‘s¿æÍoæø±£+‚õã^ö2®¿þLÏÌ0==ÍÛßþ;ªïäW_ó®½ö:öíßOš¦Ü}÷=¼öª«Ö=îóÏ?Ÿ_}Íkxë[Wy£Ñ Pˆˆ <صôT9ݱz<Çóx¦ÛbêÚùûçukö±Vù`7JwŠ}Ú5(<:¢ÖtÓ•s²¼-Gf]®|âe¡Ùݶ3?¬ë»o»Ìb°Ö`­ÅØëRfg§Ù·oGfdd$õÙ ­5Z)©Ð"sÏ‹3ÙšP!DÛ%7·¥AæZ[¯(A(a¤H›iÎ ÉÜlC­±ÆHEj2÷\%iÖ)F…LdK —†)!ã#ã` ÒJÌÍW¸óÎ;¹åÖï±÷î{8yì(ÍF•‹ÈjµN½Þ¤Þˆ‰ tШM3{â ³GÑÒ„ÙÙž°²ãwa7˜šÇãñ‚ôyûÛ߯èØO~òS¸ô²Ë¹ô²K7TßÉ›ßü›\rÉżô¥/cç®Ý¼îõ¯çEW¼hCã¹êª×râÄñ®²èƒ\ý;صk7W^ù.~ÆÅ§}ÝÄX=Çãy<Ï~ß—Å×àh¤ƒÊO%’ìZ}m¼OÕÞ²G=ÙUÖ[Ÿ}îè_º ‰’ÕÇãV^KO ’~}ô %¥ìHmãºÜ”¥„8n²ibœb!Ę„f½F!ŠK(´ÎÖƒê@fëDó4/2L«%(! ”@«,€S eÞ”gR0i{­f %ØÌ 6Ô•GùMÓá$‹ó ,Í/Q¯7) (¥(Ëh­§P*¡Ã“ ÚΦÃÃÃ(¥HÓ”f³I„D…JkŽ;Æôô4$;×ìì,333È|îZ©mÞ±þµÆϣ̈́ËîÌôÉu×w~Ž¢ˆþéGøèŸ.§syÓ߸îú\sÍ5\sÍ5§Ã— {÷9ä†ç‹Wæ2b‘åÚ„Lx aIsté8gŸ¹S{ÿöõ¯`  ¤ Â9B)ÐQˆÑª³4Û;$YZÂ@*Â@á\: •)#ªK“ …¤T.5 —ËÙïÆ˜v¤zµN82LÚLyèþ}lÚ´ ‡t)4Í4ejjŠÊþ‡ea©BEŒŒ’4šÄõ˜‡zˆ'ËœöYŒ{6å‘a¢R‰M[¶033ÃÉÙYÊÍ2ˆ G£VAGÜh‚RÙïX©Ì=9»«aó}6bÀ¼/»³{<^z<Çãñ<â´,AÞË¢Q®KPnÄöÔéúÄäz¢Ï®¿ÏÞù°¹@mGeê<º%_×)À{݊źÆßÕ¯´äd®¶ÖZp‡Ã¦†±á!ª•JæFjl“$¦í’hM(5©2i’àœCºÜEÖŠB ³õ¢&Áš„P!ËCh©Hã‰Ã9йõ6uYà¤(PÒÒl6›ÜLÜÈÒÍ$±! ‹4 †ÇÆXªÔˆŠ%ssÊ%ªµZ‡ˆP`­F G!*'†ÙÙy*[+ÌÏÏÓl6ÛÖÓf³I¥ÑÀ¤–¸YÏtúHÞ IDAT¬· 4Öf)•-.Îó¶æ‚¿vÔã©Çãñx<ÏM¶ö-ׯ嵗}Ü[n]V¾n×Öå~è^™ø•k>ô¯×R¸Z”ÝS¥½b´;’p«í“ë2ý-‹SÛwW½!°y€ç"·rKáhÖjŒ •˜Ÿ>ÊÃû¢VY"Цµ$iB RI­ÐBbŒD)Aͤ»à áÖ¡•D+Bb„&MµB•ФZcŒ!U&ì¬Ë¢ñ ‰³6³L"¢P„a„µ¢Õz­-’ Q‰J½°‰ C¢( T* ¥dqi‰¥J )%'NÎÐŒSâ8¦\.ce€µ‚ju‰$Ѭp(%8­ÀS®Kâ¼õxAêñx<ÇóC¤"rU+h+èŽ[¿xìuûݸݘÕt¥è[[Œ®¬³=Âtp¿«÷¿–бž“쨴ý WYY-¶éˆ›u¾yó×9räΪ•E­ÀX\ž›3* ^$T$"K'£„@J•¥A´-ˆA"$µ" Ãb9$I’,õ^œ`ŒA)…Y~Q'AR­V)E%”Ò *• * °8‚ `©V§P('U¤” ÛÀ¤@fh¨LÇ!˜™™i[GµÖ ”i¦†Z½A7 ±8cP¡ÂËŠØR"O³Á—¤žGåPêÇsz´Î<žÇ*-WÝloWˆ(!Ru»›:çú¤1é·¦¨ÍÚK)®ËëN³œÓSJ5P¬-÷åVÁÞ´/ýSÓ¬šRôö×kÑl I±fþÕÎ4:ýçKÒ«” àÎrk,a1DÉ€……†J%´ ‰«H7íkÜu׸4!idb/‰›!(„Q¢¥"ЉI3k¤Ê;É|Þ¤(@8C 5Bt(H6M1B¢„$iÆY”^k±T ‰¢… C´’¤‰%V)KKUŠÅ"&uX õz“¥Å*¥R™“'§IÓ4¦…ˆB1¤Ùl2=;‹ŽR©@š¦X'˜›_dÛ¶m©I’&&6,Uk™+o’X°Î¶ï© e!¥-äéù=®¶lÔ‹U¤žG)%Û·OqôÈvíÞí'Äãñœöïgjj‡ÉåyÌÒomãjÒ~î¸ëY':ès¯8]ïÿÚkQý-œkuÜ \$VÀq+^«Î­1Î~åQQ«×p¶Áèð0³Ó3ÄÍ:*iðû7Ìœ8L4c§ºÐDIAlê™e³X¤„A@Ý„ƒr©ÆbmŠsÙ9­KqÆ¡´n§‚i«G¸µê¥”™•T)‚@Gà Íf€á!™EÚ B ‡‡YZ¬RmÔI’”(Ѝ7bLjhº­5ÅRD‘B13?Çøø8aròäI‚ `Û¶màR°†{'\´ )C´Ö˜$mÙ ¬X;ÍÆFÖ({<^z‚ ä²g?›/~áóŒŽrιçyë†ÇãÙ0Ƹÿ>>ó·7ò‹¿ô â¸é'Åó¤ÆnñÔ²Œö¦$Éì;ëVøB"d¯ \i)ìïŽÛOðš¼Jfý: e‹@e.˜­ü¡ÂuYYWö¹Êœ ˆ®+êîÊ>UŸyí¸VÑ?Œ`ãëj­5 —†‘RR«TÙ21ÎôɘþÑGxò“Îc¬àâû¸Ó¬Òh4H“%%¥R™‰Ñ1‚ TŠH Ò4k0Æ`l’Ý ÖZ¬µ¸$Áaq‚ hç@2ÁªA,§«)%Aà„d¨t³.¬£‡‡°Ö e&>ó_6.¿>·R\¯õ²Åãñ‚Ôó¨E{vïáç~þ%|ñ Ÿçè±£ípèdz^”Rlß¶Ÿûù—pÖÙçP¯Uý¤xãÂT¬°~®æŽ*V +:D í„k5\fsÕ`²C‹– f.€;ör@Ü•¢y°®È£× ׿[ß:Ô"¸¯â±}æy(ê>^!qÆ’$)65ÌÕæ¸õÖ[yÊý8cÃÇ« ,-.211Á{¦)¡Ž(D% …,H–ŠR©„M µÊ"R©,µít)Zk\‡+tf$mQ.¥DŠ,ËòK ‰s›Gê58šI  QDT*†–æ©Uë$‰Aˉ Ñ¨·-±RfkQ«Õ*a! P(ण4<Ìôô4âÈQ¢(B"8¾0ÇüB•DqáÇŽaçð&ÕyoóG®c•¬Çã©ç1B¡PäÂ'>‰ÊSû®‘ñx<žõ`­%Ib/F=y!:è{¿º^AÚ_Dж²ZW ¤‚x¹ÎµEîr>Ðeëg&Œ:Û@§s#ù=—E¡XEl¯Göœ[ô;ÿúRèô+sΡµ¦^­Q.9tr[.½ôRN;Èô‰ÃìÚµ‹{îüÅb›Th6j™U4ÌÜX[ÖÏ@…X‘f®µÂâ\&“ÄäâW‹y{·â>)¥–-£R÷ù;hˆ‚ ˆ2ñ(d–þ%I8ÿü H’­C*• …B!‹•RjkSR—ÝóBTâà‘ýcˆ¢h9õ‹—P«Õ8tè#Û :tˆíg^HJJ¤ƒìwÃòýÈ^<€tb`ì©~é</H=*I’äûØO†ÇãñxþÓÓùâµ-4D·Ëj·±™kª£GÒŠ®§n£kLW~w}úéu«]Í-×õ9ßúDúÊ´7­.×»«]m‹Þµ¯}@¹')ÊHÃÃÃ\tÑEL -Œ–Bš*Ç?ÈìÌ ¤Ô‹e´ÖA€RÆÄX—¥fÌKÌšc2K³Ó!-+®R!,¢3íËiOõXHB(Œ³%‰ŠEŠÅˆ4NhÔÔë öìÙC¥R!M,wWk¤Í4‹dÖÐÄdii\“¦) •%LêÊ¢õ.,Òh4”fó¦1#¨¤™ûpšÆ(%)áòKŠÎw&¹ ]ÐôbÔã©Çãñx<Ï£$Hœè£¢K€f‚Ne¹)EËB)éŽÛ»ÕõwƒÅWK¤IzsvŠ·ÕDízêÖ#.V @äV @d¬©í¹áó®(W’J¥ÂÄÄ8&‰¥¸y’´^¥V[dx|’¡¤ÄâR•¡¡!L}ŽF½NP.Fš0 ±6BJ¤Ó lv}Æ€„@i¬M±Ö’—kSÙŽ­áœhl[¹ÎX€H ”À9A½ÞDKIhFGG™šš¢P(Ðh4¦P ±Æ`¬¥h„-ÒL%±,õz“ÇŽCÕGŽi»ÏV«DáV†GÇÑF"MŒLÄõy”.âT€peÉÓ½8\žö¥•[V:‰™¯C¶Â¢]ûÎv¤Çãñx<§‰ÃfP´Òy´ÒÀ´Ä…CÊN+d^n{ÖdÊåïÝ¢­3¢.¹•m¹¿eÈN±Û=F%û‰·åãV ÑÌZgm‡Ðî¾èÕ]vûÕ·–¬ö¸w¥ba°{g?wÞeÁ?XÈLA"!*GÔ›u¤p¨@›´BGˆŠægbêšq .%­¥R‘$i¢TæšÇqæì,$BB \æÎ+„BJ—[?]>§2¦ë@e÷[ I„ EîÚ›b (‘¦ŽF#Ʀg†Ë%ÊC%‚@SC&'&(„!»wîäÈ¡#T«U"ÐêMG­V%µ I²s× sóìœÚ•¹ ;X˜]àŒóΧ^o²ubŒÅZ“‡ü>g]°›[6Q58…¶ ¬$Õ)N‹ì^‡tä¹\—ÿ t~Î"[k~íϤÇãñx<§-QhûDÀÍ,¡™®(@{×êëRû×k•¥mµêµkY=»Ö¹ Á µ «Ž7ð˜G2í˲8Ýx$W¸VM!²{§VhÂr i5Çgf‘* 1‡!*¿ŸôqùË+d[x+)™…Ðå/'ڢܵÖfQ•­µYôåü¥ƒÌÅ©s®½.5ŽcJ"$T«K› ÅæÉ žxá$qÌÂó •Š4“ã4ÖŠQZÃP]\¢Yo0<œEŽë Ò4etd„[¾÷]Î=û<6jÆJŠã•ifÝ϶³Ÿˆ,”pŽ\xæcD ‘(òù®Ъõò¡³lyý©ëZCíñxAêñx<ÇsÊ‚TôY+ÚŠŒ+—ëÛ1ßr·Æ~â©7 `ïúÉ•cm™µÜVöãj"pýîÁk´µƒ-«;«Á‚Tôés-QjEæÚ,È\üeã)BB`CšzÜDÚlž¥Ö¨ À¢Î`¤A8“õá2+¯CdÁ‹ò—2³[— ÕåhÆR€Å`M²,”Ûc2d–p‡s‚ÄZš‰€ºãÀ¡‡¹õÖ[Ùµk8È9çœÃ³žõ,.¹äþæoÿ”G†YXXÀ:G õ¸I}©ÂøÔ‹KKÌÍÍQ.—azþ8³GC&Ç7ñ²ç=û￟'èÃ&¦*5ZKœ³D€u:[ <(ç‹Çã©Çãñx<Ï£‹”2·úµ,¤ÝÖJ!òœ¢®ÇÙ¶˜®g=f§ÀS+ÄiwJ˜•T±ŠP[+Bí©aÊÌAë?[‚¾{nljî@Aíök1»+E~K î:c…¨N ¥ÊâpVd/ÚÂߴŬ@bmæší!3Ù«òV­-/îÖšS‡‘}wÖá+À% ÆYb%ƒ€Ðê¬阞žæØñãLlÚD©Ölß¶ „`ûÎ)Ž9B­VØ„ñ±Jň™¹Y¦Oœ$P’É-› ´dvv–ĤLŒŒ2?3ËÄÈfŠ¥Û¿ýo¤f 0kcâD–+ÕÉ<º.#\g6Ç RÏ— hÆM’8n/Ö÷x<žSyЂ0Œb9Š·ÇóXBtä—ì-ï—ò¢%H…` 0\M®–eË몖ÇÓPÔ¿Þž¢ëíúÏÙ]a7œ–²<¤Y;»òÆ86oÞÌ–íÛ8øPDÚ¥$±±X›ÉP'H°E&2MkM1%‡œKÎAË·õBÂ9R›f…Ç%[šåM0ÖfQoM†8 Ö…¸Ôðàþ}œuÆÙLOO³}Û6¤”<á æèÑ£ÌÍÂ0Ì#ç¦45Ž:Œ1†ÉÉIFGG0ư4?Í–MÔjægg˜53?Nió¨,7ªdù%‹ïëñ‚Ôó˜¢V­òÀðo‹#GŽø ñx<F)ÅÖ­[¹ä™ÏâÜóΣP(ùIñ<6_œ`Ûë {]v[éDËkH …è²(õO·âúæ'ܧuì²ûîzÄíêùDý,®ÝcsýÏ·Bè¹¶€$j[ú½ÿì†ìÚ×.»fP8ÛŒ(‰µ†°ñÔ§^Ä{ïæÐÜaPyþOãÐR zRž8—»äÚÖ¼ÙvÿÖš¬ÞYÈ_V´6áGj¬% hä,Æ læÌK(3Åëk1Æ0:6Ê·ßu7õz“r¹ÌÎ;9ç‰r.1;ÏØI1Œ˜>q’ï}ï{Ü¿÷^†Š%äÖm4ã:•…Ešq©›7of¾3S?ÆÖ]g26RfáÐAŠÖrô¾ûˆ&·¢dJ"äòZÒ–¸ç~{<^z~¨$q“‡?Ì¿~åËüÔϼ€]»v¯º^Äãñxú>zZËÃä+_þ›&9ó¬1ŸßØó˜dP žÕ,¤ƒY¿ï[§be]!¨Ö8¾ßøW' ¤´š8n• ö¸ÊS¬c¾º^$È<]‰í°öåKkpa ?þä'ó›ÿ•ÃÞŽÒ!©É#å¶žmœlùÜ僵iî–k»Æ/¬mÇ¡m Ò|ÌÆ˜Ì2ê²@FGPÎQ(Ã¥J)¤’ ›·mÁ¤)dxx˜F­N…ìyÒù4––¨T*œ}î9LMMqËæoóÍo~!];ˆ’ÒŠJe‘¥(`¨X X,ƒ5ÌÏÍð³ÏþI¾ú™ÏrdßCœû¬K¤d‚Ú.‹í, ‘7‘z¼ õû¹¿góŽMlÙ¼•°X`|ÛHIq|”þÂK¹çÞ»Ùºe’Ûÿýß9sǶm™äØ‘£üøygsïÞ½Lê–ªÜýý;øÙ_ÁGÿäç¿‘I VYœÍ^(™­ÉmÍuK\Óa!öx¼ õü@1Æø‡GÇóˆ ”Âã'Âó# FÝ`·Ü~nº}ú€ÕDªè ²Clöæ(•"@ôM“µ=Ÿ]Ç÷üØcXmÌÝу7⎼^—ã•uËmÚº'm1Ú@–0 IâCCel£ÆÌô QXÄÄÕÌJèÒlÁCµºDܨáLŠ™¨ÔJà\ŠÑšPd/ì#'Û§Ræ"Üå.¼Yè]ë&IHClb’${¦²PšB ˆ¢"ZK ddtœÙ™“$…(b¨X µ:#ÃÃYJœ4b HÉ ®xÿö›Ùºu3µÅÊQÈÎm[iV–¨/,P.éû￟ɱobŠ6(”•X$HHóÛ¼ü>À»íz¼ õx<ÇãùÁ¾4‘¹®KÚ<º­í–v])Fä†DÔJÁgW€,½Œëpáíï.Û£¿zèÖ®÷ü«Y>{DI;ú­[Ñÿà“‹UÎ'úöÓ+Ê{çlÝ©lº‚òdb±ÙlãããŒMl¢2g1EŒIHÓ˜8ŽI Ò4m[S,Ò¬³¤6!µ%$RØ|ý§¥2Wg¥’1Â’GbRÇ)IÒd¨4ŒÖš ,`‘è0¤–”Ëe A@†™Ö9â8F2?}k …(¢²´ÄÀÐ0ÁùO¸€ý<ˆ0 4lßD#¨pà®ÛI—¨Ì5)lÙB]%ÜzÇ”¶Ÿ‡ "”pF #Ö!—ïP&¬s iЫó%Çã©Çãñx<Ï£@Kôt0,6{EÔÆiK„º¾b4‹vêVí{=‚­-HWÓàïùùô=H¤,ç]oÊ60o}[w¿,èX—kC)…³©Â@ñÜç>—OýÕ_PÖÚÌM7i`Ò˜( (F&IIMŒµ)Ífë‰18R¦H)‘:s6N ¤ÆÙ' ™Rk2k%Ѳ€ÔZ)‚€ ˆPJP. 7*ŒŽŽÒ†Jví˜bia‘G±}÷N„PXÒ¤˜<¯éå?ù“|çë_CoÛÎÎ>‹ûÆÍ,NO³©T&­ŠŽÙÅ%žöìs@Gh§Á )F:‚žVJñãñxAêñôaÇŽ>|ØO„ÇãñxÖDæjz]cWFßíueu«ü±ƒ-‚Ò ¸ƒ¬ý¢ývöÙ_TfÂZvduév9î¤,çð´o#îÈ‚S±sŠyO;©è´6 ­4–¥¥~ò9Ïã;ßú:Ç=ØvÛ•R¢£ˆPeÇJ¦)q’' â8nßí$IbpÁÐP”çUvA€µ)Î „Ò(!³ HDJ‰B†* AŠ,Ê®PRP¯×‘ÎR C´RŒ±uó&.¼à|ÆGÊŒŽR(•¨5q%Q¡€Ò#¨ÔqÑE1V(@£ÎÅý·ýë?3V"P!‹M-¨7šlÛupíJ(œ'­Â-ÿV‹Àìñ<ª¹iró­ßM“›ù¥—¿¼ï?ÌGk\5x஺ê*žøÄ'rÆgpÅWðÿø¹qz1êñx<žõ’ ËÞMtíÛ.¼›”²~CÙÚC©:מÚvÝò¾eÙ\¹ïd¢¬Ÿ5´·¾«Îe*Ôæ×á:žôlîËÛÚ;ÙQƲµ¶ßùVÛd¾®²ßÖïºõ»Z?í68¤0ùXŠl/…C8C¡ HÒf&<µ¢<:Æ/¾âÿÉÒÉÅBR.—B…Ä2;;Ëôô4GŽŸàȱi¦gç™™[dv~‰j£I¥Ö ÞŒ±¬%¡B‘‡@…E¢°H‚ZG!qŒ±¤qJ܈iÖêÔ«5j• .5ØÔ …dË–- cŒ¡P*¡” ®Õ³h¿iBcq‘ÚÜñÜÊÁÄäVd±„›`êÜs‰THs©Š±Mªµ%â4¡ÞlBXÀ¹ñ‰OðÚ×¾öqwíûöíã—~é—¸öÚk¹á†(—ËÜu×]|ìcãE/z‘ÿqx<çGT‘¦A_+¤”Ý¢°³êt­•½Ûo¹».j[V…íÀ­^ZíVFñwJ–CÑgq¨ÃeiH:Īq!D;݇”²#}ÊF\g—…]ëV;ˆÛ~Ášè–ݧW<¸ ÓÓ°e]±J`uJafýŠ%¬µ<ù’gó²W>ÌßüÕÇ1©`rt„Êü ÝwV@Hè°„ŒJ2¦óó_ÿõ_sñÅ·ÛÞu×]íúF£Á›ßüfÎ9çžò”§ðÑ~´ïux<ç?ëP&¢dnýéýÞú¼¢Í*Ö¿õX¥”+¶~VE‘‹˜õnÒ‘‰žV?€ì³×J¡¤loRˆöçÖ Y)D{ëWÖUßrký7!]f=nY•;·uÌ[ÿM®ºenÐÙg)(ÉSžzJ‡'0Öap­allŒ‘‘FGF¦\*…Z* …( µÄ˜kÓü¥h­ÐZ!´@)Ö©BÖ¥TæÛÎUšmÆ”RùºÒìÚ¹‡g<ã(¥¨U*Ô*U–––¨V«Ø4Å‹‰pÛhb*UjKRáð8»Ï9‡§=ãbvqgw^&àµD)‘eË‘`%¤Rw¼¤¹¥Y ×òámGáµP*Gª,©ô®¼/HWðË¿ü*®¾úõÜwï^ösÎ9‡ë¯G»þ ¿ñþû[ßÊûùÂç?Ç÷ný3Ó'ÛûÖçAŒŽŽòGøC®þooÈ×l|_ûÚ×ùüç>ÇC>À/þÂ/ðŠW¾’/ÿË—ù‡¿ÿ;ö=ô W^y%×^·œDþÿøƒÜöýïsÓMÿʽ{ï¡P(ð®w½û:¿7ß|3W^yåi÷óo|ƒÏ|æ3ÜsÏ=¼ä%/áW~åWøÊW¾Â7ÞÈÞ½{yñ‹_ÌoÿöoŸö1|ë[ßⳟý,÷Üs/|á yË[ÞÒ®»á†XZZâ;ßù_ùÊW¸å–[ü_ÇãyœÑÏ=¶_}§Kc¿º5…i.¾Öã’º–KìZ¸%Nö^X×þÜ­Š‘ܧ®ósç¾·LåVØÕÆÔ9?«Ï¯X3®¿ÇRh6mÛÆYçO3I¨Ö›è b÷î3˜˜˜dddŒ±á†Ë%JÅ"Öáœi‹êîµÅ¹›°”h­ £€ ÔèP£Tîö-3kh§ÍîEkí²¢Ñˆ™™çرãœ8qá$‘1‰%n6‰Jèä IDATë18‡– œ£\*Q­V‰ë l’‚ŒŽŽ2_©±m×.û©Ÿáçå¿rÖyç3·¸ÀÐP ‰C ‹–¥AYÚ—$0-¤Cºe+~v?-R´ês×ni1JjðÈãéJÑñÍ›¹üòË) ŒŒŒðŽë¯ç¦›nj× EŽ?ÆÌô4;wîäCüà)çÒK/åòË.ã½ï»á”ÆðÇôvìØA±Xäê«_O¥Ráßÿþ®²Ûn»­Ýþ“Ÿúï{ï{˜ššbhhˆßûÝßåó_øÂt~çææ˜˜˜8í~n¸á¦¦¦(‹\•[zßûÞ÷v•Ý~ûí§}L'ïyÏ{ضm¥R‰«¯¾š;ï¼³]÷ÙÏ~–ßû½ßcÓ¦MlÚ´‰w¾óþ¯Çãñ<®Äh+~ëÚ*k­ùTB „ÛØÖnÎvm ·êÖ^Ï׳Ö5[ÛêVÝTQUáPrÙ Ö¹oCG‚YÛÎc[eíquöÑ‘ýÇ‘9~ڮϧ·e¢t½23õ•ÊÃ<÷g^@=¶¨¨„u’R¹LEmѯ”B XB-)¶åYK‘‹PÚ_+,B ÂPDid r—o—¹¸:Öu™5RJ …BžîE ¥&Ð33sÌÍÍ!Q"òc´(!I›1i³IÒh¶­ÙTk()q:b¶Zgïƒû Xâ¬sÏ#Š"FÊHëÖq¶™Yj4ÈP!D‡U]æëp¥Í·4ß B¬X)H•ÏWïñ‚t·Üò]^ôâ³k÷6Mnfç®ÝÌÌζëÿßÿý—ÜtÓWyösžËEýÿô¥/ò¹Þþö·qÓM7ñíogÃ㺄]±Xì[–¦iûûÑ£G¹ø’g¶ÝŠ/xÂ…]nÀ?ÆÇÇ™í¹ŽSí§÷Ú{Ë:¯ýTédlll`Û“'O²sçÎö÷ÎÏÇãy<Òµ­zý-n]–ÊÕ,~§âò»‘MI‰V*³àå{™»åBg\ÚžÏn¸Ÿeg4ÝŽöËãwºþGû¾õbˆ äi=‘±qÆ&&ˆSK½ÞDÊåT?J$ J!ÒDQDDH©ó47g[ë³t0ZëÜW!´Ê-Œ¢míuׂ)%Æ‚ ¢\fll‚m[·21:†›¦ØÔ ¬# Íf“Ñáâ8¦Z]™LìþÜ•/arËvî½ï!ê'NrÉåÏæòË/§¶8GY Ê $-¡KQÖ $„:³~vÞ;':¬¿­dkvX©²Å¥¤ÝüÚ¯ÿ:¯ýõ×r×w0}òû÷=Ô|à©O}*ŸúÔ'¹ïÞ½¼÷}ïåÚk¯;ås…aÈÇ>ú§\{Ýu+Ör®5ŽSaëÖ­ÜyÇím·â™é“LŸ<ñßË.»ŒÏþó«¶ÑZS¯×Ûßçææó¿›ÉÉI:ÔþÞùÙãñx<Eº¼Æ±µõ®}l•u®y\`Ý¿µ,–kŠÝ>ªe©ÜèÖ²Ævî׳õ³Ü®Çš+7-äÀu¯Z2pdm>•ˆ¿…CPçâK/Å)MÈV+$ á$X‡D¡Ö(!áŽÐ:DX°"|ÎR»(T&ND©F„aˆR -EÞ’\èf¢·Yo4ÒfÊô‰<Ììì<‡¢•(•ÊA€¢75¢P…Íz“¤¥¨Àwo½•û|€}ðo’&ãÃà k‡«-6–(»&C"¦HBhMkËaóu¢Nœä:‰Eå÷]ãN"œ _à+çq/H…BDT(pààÁ®5˜W]õ:î½÷^’$É’/[ÉFGGyà6t¾óÏ?Ÿ_}ÍkxëÛ†Æq*üêk^õ×^ǾýûIÓ”»ï¾‡×^uÕt~ë·~‹|ä#|ò“Ÿd~~ž8޹í¶ÛxÝë^×nsá…ògögÔëuŽ;Æ[ßúÖÇüïæÊ+¯äÝï~7³³³ÌÎÎz—]Çãy¼éÑuX.[eË´\OW?fµóm|ÝêúûoÑz!Þ¹ï´Ô­ºu­éL[Ó)âÛŸ{÷}ʺRå¬H…óÈZ†;GõÖ9¥‰­ã'Ÿý\ªµ…ÒÅb‘8N‰ã˜f³Ù~VŒ¢ˆ(Є:@ I6­ I)Un1uí2-uf-• ×÷ZÃK¥išæn»Ž'NðÐCñÏ_úfNž$¢(¢\,ጥV«‘$M¢(baa PLŒŽ7ëDQÄÑ£Gi&1J)î¾çNÞ€ÙG9±ÿ!ï£9}Y¥dª Ó h„.F‰ü÷,NHœÈü‘…ÈDºD ,( úÏ <^ž-·ÕÎ àÃú ×_ÿvíÚÍ•W¾„‹Ÿqq×q/¼â…¼ú¿¾†]»÷ð®w½›?ûØŸµëÞø¿Áó~ê§7œOôª«^ˉÇ»ÊÖÇ©ðæ7ÿ&—\r1/}éËØ¹k7¯{ýëyÑ?ØT+gžy&7Þx#_ýêWyæ3ŸÉyçÇïüÎït:zÿûßÏ?ýÓ?qÁpå•WrÙe—=æOoyË[(—Ë<ýéOç¹Ï}.O{ÚÓÐÚgAòx<žÇ+-›­²ÖºM°8gÚ›p‘e£ÌÖ] ×õ½UÖoëצ÷Ø,õ†ü<ý,°ƒÖ•¶×Ž ‡V%i¯•y™Vb¥55o§¤Ë6!ÚŸ%dn`¹.¯×R¢h)»êZe­½À 0Ëývì;­‡­M8‡p®o]öÐêXNûÒ¹ojêv™u*DFEF·lã9?ý3­i&çDnçm‹gÒŒ±©Ë\tÑ8§ˆtDÒH1±Ã&ŽHI›E@9¢ "âjÌÒì"iµA½V!‰kÙ½tß7kÓ,UŒµT«K¹nòàƒrÇwðÙøGn»ýŽ=N3‰)”ŠXkXX˜GG¹\$Š"k‹!¨V«4ÓKµETF…¯|éÿã½ï|ßýòçÓh>ø}Øw|ö¯Iîý.»Ì"S²ÆU´ˆQ.É~ﬕ8+QN£"D9MÑ@ÑBÑø¿žGž‰'ðÕ¢à^qÅ\qÅ+c‹—½ô¥¼ì¥/í{ìu×]Ëu×]»ás !ø¿7Þ¸¡qôëg­2)%×\s ×\sÍuþÏ=÷\>þñ¬Ò“žÄ—zÖæ¾úÕ¯n>|øðŠcÖ*;ÝcÖj[,ùð‡?̇?üaxà>ýéOû¿Çó8A‰ÁËjZ­•†ÉŽ4']‚¨e¡\ÎQڧןéûœÙÎqºú‘ËçîüÞÿš·És‰ »Ê˜ú÷ç:ì«YsWæJµ«Œ³ÿý‘­ü¤.Ïûê–ó¿ è.s¢3zN ¢B=gœIDTbC¨$Î:„“gqÎæëpZidT$Í-£Z‡c8´RÄÆà¬%5†¤ãâaR„ÔHi³™?mëì…:œäHlš­'„%ŽX³ÿáƒ8&7±mËã£#h))ŠÄi‚pÙúÓB±ˆR‚Åj…‘M£4𠵤ɦ¡IþãöïS©T¸ý»ßeËO<í"ïcLƼóV¶LnB‡)b%$h V™¹Z Ò)$vyþ„wØõ<:xË»çqË;ßùN8qâïz×»xÁ ^à'Åãñx'¬7ÑÊ2Û·GrLRocí‰Q±æ1Í :hW›ÛÞómä^¬w¯{p¿²Ž5ÁNd/ú…ÒlÚ²y9·ËR¼tæ8Í‚eî¶RAšÆÄq)ɬÏJHÁäøÃ¥"õ¥ElÜd¨1:KèhïúôẮLÑÕJ°2/¨ËÿOöîžÎWŒÓµÜc]ï5¸º]ï =²v~ÏuûÕFºþçs"Ëý©µ– ò趘”Vü`)4H‹ýÿÙ{Ó ËÒ³Îï÷.g½÷æÍ¥2kíªV/j--Äb Ä`A °MK°pŒhÙÁxæ‹A0H¨™Àò„Ã1†ñÐ FL‹EŒ@RkëVwõR[VeUfÞ›w=Û»øÃ{òV•$†·PhFçב‘ÕuÎ]ÎÉS'ïÿ}žçÿwà½Ã8K¹˜c=¤±ÆyÞ‘%)õçÏŸ'MSšºh½DRS!D‚i*ŠåÓØ €Mƒ$ÆoÆy¼wWßGGc¬«©›%J{¬köz8ç8}â4‘RXïX. œsìœ<Éÿü+¿Ìþî.¿ñþÎó×®Qx˜5 Ë¢äðàÿæOÿ„¯ýš7ðìSAdáÆ OsF ’H’æŽ(BµoOcë_´îâ¶~ïèèiGljG}”G}´;_¼'üãÄ;‘_À<èe‹©Ë뼜¿{¹ÏáïxŸûþ?w¿Ï5múb¿ÿ;_ÿó_ïó÷ÿëŽûå&Üõ|"ˆ>¥¦©‘>̇FQ„uO¨žzB(¬µ8ëñ®¡1†$Ïè÷3ªå$dIÌ`-c{kÈÖÖÓ£[ÜÜÛ£ªk¬1xc@«Ðž«ÔjfÔPS–A«(¹vF|‡•Ä[Íb¹Ä˜!  öƒA¢Z¢µÆÊ(T0¥ ßï–ͳ§˜55Óù‚ç®\¥F Ò©eµd½ßãÚ¥yàÁWÓD1ÕÑ>2ÏÖ¯iœŽi¤¡&ºëj"Ì0[ V(|wëèèiÇß$Ç7ÍŽŽŽŽWе¥º¼ºŽ¿é|Üç´ì¾±ÕîýŠÞß´ }eçÒ~óñ…Ï˧ýsEèËyÏÿ¶Ùß;_ëÎ9`&!Bàœ 3™YFÓ Q![qض;ç°Î‚wä½”(‰QZ¬Ì¤œ9 7nìR•sæ³ “ñˆÉlг©RÅ”uâ[¼Å0&´å Ñ8ÉãöÛpy8ëI²‹a¶˜#öÒXëˆõ5ªµUD‘Yå³W¦!ï÷QIÂÎù{øÄü!{ã1g··©=,«)%—.½ÄZ?ÇšŠùb†-ØH“ˈ(é‰MŒ ĨÄc… W½0Xy÷¼pGG'H;¾¨H)9}ú 7®_çžóç»ÒÑÑñЏ|égΜí¹:¾lé AQW`*-œ@븮îjuµxTÛRéœ[-àzïQJ­*‘ÖÚ»"GîKB\{=²Ueò‘u,¥w+qf!ãrõËZ e˜k <)Ò(Æ;Cµ,Bh„¬µx/VNò1†$I¨ëš$M©kƒÄrbk@c*ziF]V(¥XÌ–(¥ZÓDznB4ˆ’46Ì5Ʊ^½gÉíʨ÷%4ÂÝ®Ø š†=Á È…þX¤ -£ÇçRŸ/~¼3AzÚ™}ˆ” Q«¿C8¤—à}pù•’OÙÔ¤YΙÓç(¯] &I²ÄÛš¦©1ÞÑÔ³›IŽ3s¦‡S´r˜ºa23›ð‹ŸEzhKÓ4Zs¥ST”Ç ÎbåQQƒµ–e¹¤J "%@AEÄqŒ±Þ^1+àÒ•}&ÓšÑá„3ß¾ƒW‚Æ.±õ‚´—Ó¬³¸±Oïôi~ä?Ìû_³ÕϘì]åÄ^ǽ›CªÉ”éÁˆ×¿æ!þü£ã¥ÃÞøMßÈásŸd»˜pVV¨Á Ö§˜7§h’(<‘sDXb«±H¬zèèiÇß QóÍ<Âï>ñÛ ×‡<ðà«»êFGGÇ¿3ÖZž¿øÿ׿ø?ù®ïþêºêNJÇ—%kƒq©¨ëçCK§÷¢]Dq­ñŽ&2Üž ³ Û½Äډ鑭S­Ç"¼Â ‡Dµ¦¯v%áx>T„¸ç[‡X·ª£ Ê)üÁàrêÀyâH!¥"‰5Yá¬B›¡•mp>´‰ªV4Kþ}Z[‡X ï÷™L&!Iò˜ñá>‘DÞ¡„`-Ë¡iX.—äiLÅÌ– ãPiŒ’­ehwõ¼ 4á^„cþö)áx¥—8á0m6¼׺ÛzßV:8/ÿ C&ׂÁ±ø=Ž‘áInϸ†¨Ë%yžƒ÷ììœä“ó9ƒX@Sã›ßTá:°ëC5t1›àL³Z00¶Ž9Š¢Ö#@(–Qû¾$Ö+”Òx!Báeû¾¤$Ëz4M÷ŽÚ„ó8ï±Î‘Ä=Bm2¤~+hCU5ÔUA£$J‚WaÄ[‹3*QÄý.pùâ3l¯¯±1È9±>äÔ°Çæp ‡ë,¯_gŸÁÆ:G·n’¦›÷D¤Ù:‚ŠÁzʼl×@|ˆâQí`©èzv;:AÚñ7E’$\8·þí¿Ãï>ñÛÜØ»±Z-îèèèx¹(¥8}ê4oýÛ‡ûî€b¹èNJÇ—%q¯*qUmÂaq­˜‘x)έ„¨h«uRx¼·DQ Nд¿+•lS2ÛÊexŒ_™9ÓV>¥_I³ðßáüíß· a»Ä#|»A®T1¶ª‘‘BÇ‚H…8‘(KZ¡qvõ{<Š"¼ n¬B€wÛT¬m®Q.çãXN'ôz MU1®&ô’˜TExÓ œ§˜Í@*úi—¸Ð͉œwÛW»‚ àBŽ©oEâñù >ðÄ”GNol`fK¦£C¦MÅù3§/Lª]¶ÏœãÖþ„ƒÉ ¥&WD“;ý”ÔÑ÷S¬UH)BeTðve®%D'::AÚÑÑÑÑÑÑÑñŠÙ?‘¦éJü9üJ”‹ÊãvM!‡sé=ZjjzoCK¥D ÙV#Ãc¬µ(Ä“µ­5RØÐ^ël+ Û\KÀ8G‡ŠfSq¥£ˆª6+Aº£„ª „dQÖ8çHÓ ç#•¿c&1Ì :' U[EU7¨(ã`úÉÏ ìœØb9™rñ¥«œ={†^¯‡cA¶mÏ^„V]‡ÁÝ·iddWí¥B„ ï-VçÃùˆã˜¦i°Mˆ¤Âcm¨ Jé1¦Æ{A6H°®B‰0ÐèCŠ`L”& “É„(Š‚® N¾BJ¢(¦,K’$ÃËÑd«z-Išƒ´,›šhI’„4Ï)k®J³QL‹Œ1˜¦iRê¶"l±Æ æDÎ9eAÞ ,gsf³e]qöô´–è8µQ<:’áZá¸b/p6T–½c°ÖÐï÷™Ïçœ:}‡ ª*~ïwÿ”sÃižG!ʨŸç\¿u““NlŸ$ëõ)ë†eQ±¾Õ§v5‡G#d’2<}š^½Ä‰×)I)‰­jªå’´¿ªÓIwÿèèiGGGGGGGÇ+â#ùKæËÂKzƒ>oyË·ðû¿ÿû,—KÒ4½£2Êmö8BD¨;æCœ‡Bá„C ÖšÚÖÜïýìíïQ.J’$b}£O?`|CSÛ6*ÅÓ4 Q!´jE-+aé¡$Z*´Ö(-Ð"SkmØ.^*tQéŒ$RÔ®æ8º&TDY¹¸ºªAJf …dÿÚ.³¢¢:š3î¯$x'´lb“Eɉ›<õ©gxþÒexà¶··±Æ“e½ðþ” ±-£„Äж¹â['Ù6Gµ­+áÀšº­LJ”ŒÛj«Ä´‘3I’å Öxf“#Ò<á™/f@pnš†_x¾­V7¢”âàà€ïüÎïÄŬ@Z‹ûYFU/¹ï¡WsñÓGèi ÎK´ÐDQ2¸ÇZÇUŒ°„(­°6ÄÁ,—ËU»n¸f$UaØØØ É3œL§Sf‹Æ9Ö××ɲ¬míU´vM¡¢íìm'ßöZ¢ˆ^/œã²ªFœØ>‰NbF|ô£eooÅ|‰‚4ЉdÛÒMLÕÔxµó8©¨Ê!Âvgaccƒõµã[×ùW¿ôOxñp†O¼ê¡I#ÅÙÓ'ù[|+ÅbA¢cèu}» íèèèèèèèxEç±Ò8¡±ž8Ë1PÓ:ºJr?Ûv½˜¦)ÚJ–Ç Îà…CK‡ÖŽÚT †\¹¾Ë²¬q€Z”…a4Q–5yž“e@˜ß“·ÝU• âtY4x¡P¯ÚV¥ðw ¡p^„ê¨õ(-QÞ!¼kgdo·™?w]×á{S’ç9gϧ7Xãh¼@ Âì«7¡Êê<KQ.™.ƒ »µ?f4þ8Zk¼÷¼úÁ‡HÓ”8Žƒ`×-$G?Ï1Î!äíã’R¢…äàÖ!ëëëÄqÌþþƒA-nÝÚ£Iõ>å IDATßˈuÄúúƦ“9R*âLašŠªªˆ¢ˆµµ5®_¿ÎÿôØ»VÇå½çÖ­[lom±³³Ã›ßüfž}ö9^|é2óùœýý›ÄR²‘*®>ÿ|ÈMS„’¨J­Î“P. [SÖJ ê¦ÁªÞeY†ŠºTÄQp"Îó­cöoX[[çp<¦6–å²Ä{Á`0$ÏsÒ4 ó¤¢5¹j]œÃÌ/­ãU0YRQÌÚÚÖÚÖÔ¨Y=>Žc>ö±§˜-æØ¦!‰"´R4UMá-Z9â4%ô™.æ,Ë­5UQÒ˜û{»è¦&yÃë¬ ʃü¼AË„ÉîMv^uËŸ~–ßøÌEÒlÀ©S§yë÷|{wéèiGGGGGGGÇ+¡¬kâ(…ÖõÉ?úc¼ íšÇ³·g+B¥B¨Ukï·ùJ}<‡ªˆÓ}GHEH/‰•kB»mtœ_é0Æ …G+Áúp[]p¢ÅxTÛkŒAxŽb ï$Æ6ÄQŒX™+Ý6 Â{ ãˆ,ËÈ|Ît:%Š"Æã1q”ã¥lãiB;rˆð´ †}ʲ$ËrâÔ³X,hªš,ËøÄ§?C’$«×Š¢pnŒiVÇ-Õñ¼m¨(K)ƒ‘“¢9Oã•àJ’o/¾p‘‹/’¦).\ I®ÝxžÍ­ ´Öc¨ëšÝÝ]–óóùœ¦iX[[CJÍt2§*Þý¿þžyæ9ª¦áôéÓ4MC¬%W›%1†T†\Ú8Ö4JÐ4ëÖ[tœ02ÛêyÌÉ“'ž²µ¹½j5IÇ­H ‹Å‚ÝÝ]’,GAžçlll´¢<ˆOáƒàwÌÌZçPmýøZŒ’˜é|ASln­Ç)u]#uÄxr„šÆÕÄYŒ‚¢œ“«ˆª©Ió„Ú¬‡¢ª(ƒ1Ž<¹ðÀY6†&£1õM~ðA^xòÏÙÞ<ÅÞÕ]¶‡k|ú©Oð oüZ¤‡ÿñŸv‚´£¤¯”õõMªª¢ßï32 nçF ÑŠOq—ðtönú¹Q-!j#âÆî5p–< B­XLN"4$Q„”!2Æ;G¬D+Z%¢1ç‰ñTutÛÒ‰°¡ji X…À“Ä=”•;ç(ãI¢6~¤ub _á!ë(ŠÅc醔EÌw¬Àµñ*B„Ø¡ÃõÝ]ªªÂ9ËsÏ=by\Áb>oç)-J)ŽŽŽ0ưÖP×5±ŠØX[_:}ä#e}}…kG£Qx¬+9¹¹Fc †iL¤5*N@Áæ¤IÆÆÖIÖçÊ•ËïðR‘æ}‹'$qœ´ù£’ª±xã¸ví:JFÔµ¡?HÂB‡€$IÂâƒiVב÷wüsâ8b¼³íq†íº®©«Š,ËZážð—}вjh\Ûþ=až5Iúh-Y”û‡œ9{)%‡‡‡è(b6/1§®¼dIÎüÆÿˆ¥êñ©Ë×Éú=Ö7·ø¦G¾…j±¥¸ïÁWw7ŽNvttttttt¼Rní ”"Ic®ïÝ`}}ý6öĘÖ-Wú;Úuo;ÛÞ®<ªv6S¶q ­¯„ëEE’D€D)-4¾´,š†ª*0Mƒ1†£Ãâ(|$«ŠN¹:‰ÃcÛ9Pï ¶®)Š‚ÑhDœe¬Oà‘X'øê7~¾1,Ku;>þX‡Jæb>%ŽSò<¥*K<–<ËðÆR– Œ1( UYâC£‚Á“3 Q”æƒõ5"Œ[#´'J#´V<ôšxík"ÏSÒ4¥1ubdúý>J)Š"ÌtJ)1U÷ž¤56ªëk-{×opáܘº *âäÉ“¨8´o˜n’÷S|SRWi’‚0¨D!…Fê”$î±¾¾IU,—K.>w‰º×I¿ßY¶­ÑQ¥œÚ9igÏ0EjEÚËV-ÓÆ"%€©}p²5GX\0M“d)½^$N©ª ¤ ,jzÇ}èIþÕÿý;,+CYÖ$I†ŒbÆã™ö,Êt¹³g醨8Tì{½ãéŸåŒ ô…¦¯c^º¹ÇFóª¯ú*îäÛyþú ¬7k$i¾Æ²¨º›GG'H;:::::::^)½“ù!ÞCÜWQôÖx©Qq†uÄ1±Òô{I¨~«¥Ršù²¢Ÿô‡kXo8X[?Á™ XÔ%ãɘýƒþh‰­mwóèèiGGGGGGGÇ+Eºà6f+”·$IBmš]éBÚ휣 )Aëà¶bZÂìgQƒ…BâW±%††hÐ#Ѧ)IbM$ÖÜsak’XcêÙLXÎglnmPÃõ5²8ÁÅ * q0JÈ•ØÈó>Q1ØØØB)EUפ)èu¼LX¶ÂAJ‰­²D!„ƺ&ˆ¶Mʲ$Š"Šå oB”ŠßÎ1Æ:F¥)BjjãðBàîhÉQD¬#””hÞ@ÞßàÍ“í iˆ\9õwµCKÏ 'Øß¿ÉæzŸóçNQ7%‘Ò(%pÖ uÄl2æùçŸg:²µµÅöæiʲæÖ­=nÝdkkƒ$Šéå)Ÿýìsììì0è9}ú iÖ£,+tšÑxO”qlU0Vº´{‹K/<ÇhSζáÜÎ Ú“g)eSࣄD8j‘ÖDJ‰{´‹pÎ#£˜<ÉÁŠyI{k Æ.‰µÀb© ‹P!3‚‘s.”³•$Òš²X’ÄŠ¢\pr{ 96wÖ¹|ù9zÃuæç>ôaŠZ°(*Œ ÆHGỦSÅt¹@Ä’z4#Žc"ï9wö,ålâˆÄ$,Çk*EII]-Î`êŠÑÁ˜ƒæßð0×Ç3nî0“‚>ûõÔG8uòËé˜^–òÿ~ðwÑZòmßömÌŽyá¹OqÏ=÷ ·¸±·Çl6gmm,˘N§¤iŠ”šÑhDžç+ó›×¿þõô8QRe›w*ñÎaÚ ¡’pæÔ)ÒT²{ù»W®"œñQ._»ÆÙsÛÔ®ÆËPáÔh´?΀Ux ‘Ô”÷B¥ÓC¨è‡µ¡õYJŒB;´µ %ØÆ#• ó¥>\™º!Òañ!Öa¾v{g‹ùrŒæEÉôòU.>û(Mp!²Åùcëà^,}ø9(ÁÊQ9ÖÖJœuD*Uá<Ãþ€aÀ ¿Á /\Ä:ÉÍý‹é‚Ýë{ô{=po°c‚Ô†…ˆÊ…•ÉlÁ™­Ó°qⱎXT©‚{óµkWˆ_u’ù"¤i̵k×xñ¥ç¹zõ*iœ…ÙC ¶®°µaYÎñm„†P­ãÒ48ç*}ÆÒ˜%$Q¢)›’µ~Îá­«œ?w–Ñè€{Nopóæ †ƒŒ›7ö8ÝàÂùóÔMÃ¥—.'=†ý„¦‘xWÓ3â(âôöQaû Yfa‹¢`o÷{‚^/ƒrJìjR-Q‰¢—FÔµg>?"Ž"z©$NÚÌØì+’t½ƒIœáÍ‚å´aØï#uDYU\»ô,½þ€SgΑGž¼¿AÔ‹±½ˆa¯Ï­[·O'Äq 1ª”f-‹0f±6ddÆ1ÖFÂð]ßùŸ³¾Üp'G#ƒà9Ày¦Ó)ãñáêsŸ©j¶¶7˜ÍÇ”EAQ5ÁØ[f³y¨4Ú©£0k›fÁùWJ.>ûÖÀk^÷z„u$Q >´`§Ã ¦ó’¼?Ä–K^ýگ♧?ÅÁÍ ½LqéÂu`ðHïq2ı„ÿÜÊÉXs]#C^mßžËõ~匆QÒƒ·-QšpîÌi®\¹‚ж·wôטNf¼ôⲬ¢m*C”&H¥¨ª:8»àÆëlpR¢-Ü:8âäzÎÁhÌàž3ì]¿ŽžHKŒñ6'Oï0[.8“žæþWÝÇã¿õ{ŒE7¼ù-\¿z|Ðç oxYžüƒ?ìn_Y‚ôÉ'ŸäùçŸç­oý¼‡'žx‚}èC<òÈ#wí÷+¿òOùÕ÷¼‡½½=î»ï>~üÇ~ô >ßËÙ︅÷ù‡¿À/¾û—¸~ý:û·ðÞó+¿òOyüñǹ¶»ËÎÎ?ôCÿ ?ö£?ººQþéŸý=ö.>ó™Ïà½çMoz?òÃ?Ì[Þò­/k{GGGGGGÇ—†g?ýÏ=ýq”R,3¼w ú}´Ö4Ë9±«@J¬ Bg™o¡U˜Á[Ve˜ÜsŽ4MñÖ2±ÖÆ yÄÙbYÑ`XN‰²ÌŽn¢…¥^†ý˜$œ=»Íb¹¤—'ØyISó-%ƒ4e¸¶Ž”’ñxL„'"Œð¸*$¥Ê£¥Å;Ëtÿï-Y’´í½àm«–œÜê#„ .+F×Ù9±M" 7¯ðêFÆueè œ>{ìŒxðÁ‰³ÛÆ‹x·DÔåO}ô)®_Ûet4f8²¶¶ÆÆÆƒõðçÝë×qâáYo¯=ÂxúçvR¢µf{sfxëš½kWùº¯y#qS”‹Pq¤“L"&Ó)i…6`ïPJP,ç!ÃÓZzùc Q”RÕ†4_c}¸…Pš4†CÖCU×xŸg “£ëƒÓ±%ÚÚàþW?„i˜âÑæ±:²mçvxT¤ ÍuÎáðaþq¼l$ñþó+k‚@—á=Y³µµÁë_ûU± J2úý>ÆÀ•+W™Ì*ŠÊS×5MY1„ˆ›ÚÖ(Ðà½Âz×.HJ㑾a4™³ÞÛä`tÄææ yFyTb`YU|æ™]ΟÛâæÍ›”E-k>ùñ±½ñkY.fc8qê$ßöŸý§ÝÍ£ã+K¾÷×ÞÀÛÞö6ðž'žx‚÷þÚûî¤ïyÏ{ùéŸù¾ã;¾ƒ?øàø{ï|çç=×ËÝï˜gžù,þ³?¥× ÙZ¿ôË¿ÌÏýÜÏó½ßû½üñ?þGüâ»ßÍc½ ­5ÿíüoû;ØÛÛãýÿÛoð­ßú­|ìãçÝ¿øî•àüë¶wtttttt|ixþ™¿ ®Kêº&ƒqQY,™Íf¬¯¯aªg¢("Š"’(EkIžjLS³¾±I.BgÓ4Ä:§iN#Ž&æ£ÔRÐÏ{diB1·Õû©?£¬¼ˆÖ(Mr²,ct¸”’Í ¨ߨc|¢(T*³þ!%»Ï.YZ)Ò, ËÙ<´:Ö™ÏçL'Ò4åww?Ž ­õêËÃdÞæ9ISUXGœh¬­éõzŒF#’(a4¡ãˆápƒÁ`ÀøpÄb1ãÄÎIk1Î3/+vvNrâÄ ®\¹Ì¹Óg8wê$‡û\¿õ'‡98ƒ”Â8·ŠÀqµÃÓ„9Q묬8iÚ?_k‘­ƒ®h}uMS#½Ã)J"Ò$as¸Î©í`¶6788<♫7˜Î挎欭1NÅñ-æk^¤A c<ˆ¤fVHb( ×÷GH6*¢—gìN©|¨ÔƱ òžÑdÂÁþˆûï~œ?ÿì%þå“OòÜ¥9sïyþì>ÄüpÆìhÆ|HÇW† ½zõ*øÀxÝë^Ë7}ã7ðÚ×¾–|à\»vsçÎð«¿ú«<öó?ÏÖV¹~챟çw~çwîz¾—»ß1?õS?µ£?þ8ÿÃO¼“,Ëø»ïxÿèýcÞ÷¾÷­é|>'‰cΜ9ƒ’o|Ó›øÆ7ÝþGû×mïèèèèèèøÒ`«9u¹ ÕÍ^ðœÜÜáU÷}=ŸøøSÔÊ‚¤qBÇÁ©4аM–º˜bŒCjÍÆÆ÷Þ{|ä/9°¹¹ÉÎö&e¹× ¥b{c f5GGGbDíÐZ³sâZkæË%R ó)‰ŽH’ÛÔÄZŽÉxníß\)I)±Æ¡”"N3F‡#jcpÎãœÅZÇÑtÎr¹DJI–e!–%Î1ư˜ÍGkªå¢3±DQB`Œ#Š"Æ“J)úý>Q#0HjÓCœ3ÔÅ4<BK³€ííž{æã¡ªb”ÄQŠp)óŘ *[qëú>Ãá“[)Î{lÓ µGJ‡k 1Ã<£(ÒÈ1ºy•²\Eq¢q®Æ›®)ÉúšS;}¬µlÆã›ä±gØë³(H³ŒÍS;llï°¿Èîåg¨–Kž{ö&¶nXNnÒÏs”¶8[!œïÐ2Â:óáƒuH$àP޹yõ y³>ìS,z½>7¯_âhÿN*¤VA@–%eQaŒáàÆe$‚,–¸X1ØÚ:ÉæzBÖË)æEQ‘gÁxIZ‰ ¤Ä„øR¢(´r7ævÔT t ίÄh]×TMÔ ¡$G£ /¼ð"{70^“d="S–52Ò¨8¢,ë•É“ðÐ4 ‘Tµ ⇫k„l–%Ã8¡¬*.^z‘ÞÚÆCi„‚YQãœesû$79ªÞG¼îu¯Ã¦IŠY…—Šªjº›GÇW† ­êš÷ÿïïàïü ÞùΟ¸kûûßÿ~þþÿø÷Iâ˜sgÏréòe®]ÛåÂ…ów‰Ï;y¹ûýUœ={†Ë—¯ðÙgžf{{û îóŽw¼üÁàé§ŸæÿäOxì±wñöwü]žýì3/k{GGGGGGÇ—†õAŠbHkF£fãeˆt‰‡H,R‚%Òi¤€ÁZŸ¢(ˆ“„óçÏ­"b®^½Ê¥K—‚Xõ–² ­²‹Åï=ÓE0ÝQJa-TUEÓ4Ìf3„,æK¬ Ñδ3‰ml‹1&8³ªAsñâEN:E]×+¡$N©ëšå²ÄzPšº¬°M‰3Žõá8‰pÖSúšTEh¥yi÷:®1œ<µCž)ê² JR¢(jŸs‰lãEz½I’„8[1_”DJrbkHg!ZF)â8éôÖ¸víiž¡P”MIµ¬˜-ØöÐÃaQŽU|µ6TQE¨ø©T £SÕœÝ9A’æ(¥hš†Až ÄBѬ”ÂÔÞ{ò7Ç‹^î2þ´çß8ë±°XïÓKåˆÒŒ´—cª#Fó’ qFí_¼ÌÉ2œœ0¨qD:#‹údYÖÝ<:¾èÈ/Ç7õ[¿ù›Žxä‘G8<Ø¿ëë‘Gáàðù[¿´ó¥À?øÙŸe41øÙŸý¹Ï{Η»ß_Å;Þþ~îçc2™0ŸÏùàÿ€ïúîÿbµÏüàÅÓO?ÍÃ?Ì›¿ù›HÓôeoïèèèèèèøá¬)Þd<ÚG ÇZ?#MƒV‚8Rĉ¦×ÏzdY‚15UUPZk¢4áÁ×<È}ÞÇÙógÙÚ>A’$\¸pûî»ÓçNs߃÷ñвµu‚ îåž{î!ÏsNœØáüù{9qâý~ŸáÚ:[›ôó^¨¢ Ù¶ §DQBšæ ‡<øàƒ¡íWÖ‡l¬oÒ4 7oÞd±˜‘(XK5›ƒ”T:¨ &{ì]y‘£ýŒoîr´ƒbrÈz³ÞKˆ¥g|pˆ5Ž<ëᜣ,Ë0ǤIf\oíqùÒ‹¼øÂE.½ôW.]b|x@],æS¦“1ÅrÎr>ct¸Ï¥_À6u‰ÎâLƒV’›,g%ż¢.  ´ÐØÊ3ÍÙßÛg:ž0O˜Œ'TË %4uÙ°˜ÌYLæxcé¥}6†›loí%9Y’“§Ò¸GªÖ{CiŸs'Ïqró½¸G?铪˜mÎ:Kì±S¤*a-°–õÉâ”$JÙÞÞ&ë÷Z±4†|°†“Š£ùëCœ‹ðœ_UBµ­8ôH‹¢Bj…Ž#ãB÷çÚØ!kñ¦AX^b½À!ï¥Ò;’$¢ªBå7ËsnÆäÃ!Kë¹5:bïà€ÊI¥yéúM¦UƒUËÚpéòUööo¡µb4qpp@¢“îÞÑñEç˲Búkï óšß8h} IDATÿýß÷yÛ¾ÿû¿'Ÿ|’÷þÚûøžïùÞñŽ·c¬á=ïy/¯{ýÃ\¸p¿÷ßÿ8O<ñÄÝ‚òeî÷ÿ±÷æÁ¶åu•çç7ìé ÷Üù¼—ù^f’I&“ ŠTCVSÝvTÿÑV4”€hG…%D†ÑšIY]]åv–¢¡­%D@µX¢™ *š’$d’ )äøòÝ7Üûîp¦}öðúß>çÝI‚‚Dîqâûœ=óö»k¯õ]ë+Ò}+i–ò[¿õ[Ü|Ë H’„ÛoÿÛÿØâ9ÿôŸþ0w¾ë_qß}÷!„à¯x9ïºó]_óò-Z´hÑ¢Åت¤›ÅD $–µµ””ììì°¼¼„Öœ#Ïs¬µÌf3Š¢XôJvz}Š¢À⛺’ ð­®®!EH„ÝÞó€ËËËl9B2žÏfÄqÌ™3gˆ¢„'žx‚¥¥%„(Ò\½·/ÙÅ{AYÕo:Òét¸é¦›Âö­]Xqo½õVú½.[O=I¿Ÿ‘eÝÐGY–äy”Vk雄$ JWÿÈÆ‚°œ8vœ¼˜1Nèf)q” U ¾ÇÁÁùt†T‚¥¥%ƒ>e>%ŠyžSY–[Æœ={–íËWØßßg:“ç9iš2èo0ç˜Ê M¬ƒêZRã­gmm( –â²,ÁyÒ´Ã n¾étJUUAmÆ2›É§Žª4$i„p‚ÙlÊhÏ5Õ‘Z¢, Ãáq>¥¨Júƒ²n‡NÖCvT8QB>™bŒAixâÉK,-÷éöcfµåÔ‘ctò—Ï_kð¦I–!èÉ7dÔ:‹÷–ÐS:mç0Æ€BOYUìîïQ–%ÖÎ2*确щ¡¨ëðˆ†”zúF±‹@xA˜jàú(RJƒiÚAzPJQššX•Ù”£i¨név»äyŽÖB@UÕJi"]Eaî3/!W‘Æ» ä¬EkMÒt‘ ãÈ‹šng™²–hë=I’P›’ªª8vìE—’$ÁOY×Ìê‘d¤YŸny1G6QÏ >÷™Ïpþ±GQu‰ªK„7$jë°>Ì÷z,fnE|CJ áDÞ‡”Ü$IÞ‘%q”àexOàE8WZ+\YàÅÕ®*¡¶kÑ2Ez‡ö5‹—©"D’ÑËb½„”¼åÄéëø£šIé™–Áê E=AEš¾ô¥¨¥ÓŒk˜ÔžþÊV†{˜©Á’|\ðWûÍo™ëʇÿˇøú'L&ãö"{óp±gÂh4äÿûÓ?á ßÿ?üÖ½uþiÞó¿Á¯þ_ÿáÿJ`L°ßORÉPa”OH—R´ ‡#d3MH;ËL¦%(8~Ý Ö6óà“Ûˆ¸C­bvÏo!dDz¿µO51Dª5kñGKH[´hÑ¢E‹Ï9Ô¦diÐC*BgeÑëõ(âŠÙ¬¤²5³²&Ïs¼©]•²¹¹IšÆlo_!ŽcFCf³Ï…ó[L&#VWW¹áÌYŠº@8OÒYÇ%)¶ª)êŠ~’qüøqΟ?ÏîînPqéÑZSÖ&)©Cªi’°ºæL§Ó)¬ÇÁÁKÝ §UU±?’u»,-‚jkBçi1â¼ ß_¢¨*TäX^] vWãØ;Ø@:Ç®1tÒŒN‡Äߢ`2™ µÆšŠ$I(Ë2¯³!YVItš‘f]z½Þb~QAUUL&²,#ëv(òHA'Í@‹© ç‚ʹ”,¡"Òší+;loo#¥ ×ë³¼<@E¥"¶/ïaŒaee )%ãሣGN°—.\d°Ü'ÕiSÍ LYÑ[^F H#Íø (Œº“5äÅ á-²I§õu…[¬­¯pdcº*È’œ¥ª+´h)ñÖPXK7ëÐm‡æÚÉd²¨c™ÃÔO]ͨ«œ8ŽQR1›æ˜*Ìæ“yžÓívé¦ieµT¬®,³}é"B²,#I–zA¡p&Ì=ú=öööHãˆX+:iRs}†Ã! z«Ë\÷¼“Œ&cª¢dww—HB¾¼ºÂpÿ€íKŒGC”÷¤ÝXÇtGŽãìÙ³(%˜LrºÝŒ$ÉèelmQ:t­Îy‹"Ç{ÏC=ˆRŠº®›:”šN§ÃåK; VV9~ôkëH)yôÑ/x°Ä‘Íun¾á,EQEÝn—¥Í‘t»}JãÉKG']ãÕßý‘x²$¤'™žÝÿ8|Ï'˜æé¸åì ¦Wxäá˜ì_a¼-e]"¼Ãy‡#|Žöxâ ÇÍ7ßL–uC”Ö`-ÂX’D‡`#ãÎ…~R$®IâE ¼ó8OEy¡‹t‰@IE$4Rx”wÔ¥Ç ÐŠ(Ò¨HôØiÅ~qÀ‘ã×s÷'ïç©K{ä2æ–ï¸swxâÜEŒAKÖ1޲*¬”‡ÿµx|Uâl½øœ¶hÑÒ-Z´hÑ¢E‹¯7œ9 B1¬eÝ ÕŽÑ$GkÍÓ[ç9{Ãõ|þóŸ'ÉâEkÅÜòü›¹téu9#J")XÛÜ ’Š$ÒÜvë­ô_ÞåìMgŒC¢í`%Ì[fQ1ËK´Ö ì˜Rj¢(ZÌžJg‘Z)Ô áJÖ–W˜Ž'H!±Â+ ‰b}u¥$AIð^ d¨H9~ìi'#ŸÌPJe Â[¦“1I¡TŸ8Ž™•9ZFˆµUžzÓ cÅlZ0+sö÷÷‘(–µM꺤®-y>Y$ Ÿ:~„µµ ¶¶žfee™­§žd0è3¬°±ºBžìíî°Üëã*˜äã†ÉÆ¢ì¹éÌõ jÒzg³ËËËÔÖS×u r†4Mxá­·qûË_Áh4BkM]×%IãÂä¼ÁÚŠ8N°NSV DD¤c„8[’%2Iq¦æy“‘¡“ V:=D]ኳÉ[ :‹@$)Ф"’’Ê9¦Ó1»»»¬­­)¨À/礟†j !¶kï=Búg4ÅJ?ÿ.Xh¿ó’H)jvÞakCÁŒ“’ÚZ{òi¶ó‚‘ñtÖ×9ñ ¥™DA™¯ emûRUÕ¢É{‡Çbëgëf.¶E‹–¶hÑ¢E‹-Z|]xò±'AI–úûXëÙÞ¹NÐ[êsæÌn~þ\ºt‰Û^p+“|L–¤¡ò¤²l^”ï{ÈT¤)‹œ8IðÎE*’̦9‹IbÖ××.Eç‘R$K=¬µ  DÌû&UÆ8þDS”ðSQÍ fU‰sAŃġ• Š4‘(¥ðÆ è(Æz‡© Z*†û{D2bVغ$‰4Y’EŠªª(ì© ‰ƒŠ%šZòÙëf$©¢×͈TŒÃâ-¸D!¥Æ ºH)Éó‚~¿Ëêê:i¢èõ–H’„(Räyw†4‰XîmR•3ʲD HÒdQƒâ\˜•-‹)JJ²$¡* @%1‘N˜S$žn¯ÃÁÁi’‘eeY¢£g<"–D‰Æø²™¿Lè$‚ªr8‚ ŠÚ²~â<ô7|ôOÿŒ½ƒ1K½6+¬-uÙÝzšétL‘O±¦"Ò2Ì…Jæ²ÁZ_sá±Ï1˧ÓaPM+pHí *7„†Ýƒ}ŽWQ–-ŽÏ‰«Dò™à\°þ΃¬¼÷HÎ:„·×SÂì© S§˜ÊP{K­Âk­pxkÈkW1;³œ“gofä%ûÛ{Ôe‚G⌥¶^H´R˜&8+I’ B{‹s5® Ó’>„(µhÑÒç æÕ²*©«jaïiÑ¢E‹¿-Â{1qœ ÔuÝž”ÏIÜpÃMt¡$Á¹«=‘Æ[âH5 ·ž¢œaŒ/9º±IEØ:Øx]mN¦€GG dYgA÷¦{˜Â,þ?¢„,IC¿§µMu‹ !5 .(aR¢¥@Fz±ÞûEênU •Õ5¤ÕÒûÐm*%‡R’²®ˆ´ÂÖJ ¬©±&¨¯ùÄ!‹ÙAoìb_¥Ò 50â¹òÖ5$ГdÙ"XA·~oê:¨¿@U–È&MWŠ@t}Òg휤y© uU6ÇjÉ'a¦ 몪@¦mUcU¨MñÖ!¤yž’Ép²¸æ!5•ëÎXª:Ç•†a1%YZãòÞ„?ù‹ûùÔáUJ7‰9¾6@šœ/~ö l‘3î!p>ôƒ:çš@¢`Ãuž¦Þ%\W…|áÑ/rûË_–‚É$¤:O&“&ŒH4$4Xm*b„C.”ò@J•i»B„ƒwAÎ/TT©R)¼µ”e°— ±~â•N˜UŽÂ¹0ŸJ,ª¬!Ò Bêº"Š"Šb¶ø\âÃ{ä8Kév»íÅ£EKHŸ«È§S}ôQîý«OpáÂ…ö„´hÑâo ¥GŽᕯú.n¼é&Ò´Óž”ÏYÌ݇ޛ…úèš?î•Rä ÄÁ˜k EéJŠ¢XÌ7*%èt:!ñ4а®} Uµœge°ŒRв,Ý¢Q£*¦iº OsÂ)„ ¨Š…R6's:O؇È\x½·ÛXëXØa£(Ø;± ©r =ÒIT$ñþª;_o8~³ D‡ÉñœHÎU¿/ÛQ sŸ×ÞPï4Öà@ÌÜ¢ÖdQoÒ$Î ¡šmk’$iÞ¿ù±Í÷×`ê°~/ä5*£µ0-CmÉg¸²"ö’no™Ç·.óò1ÎïŽð2ãÊÞgVW1“!O^|’,Ø2ÇÖ%Þ.Xs½À9¬­Þã›äÛ9¬ Š÷d:fÐ AVU‚£|s~ý—œ7Mª.¨æÜIÑ$ëŠ@@ç/¡-&h¥IQ†º¬ƒZŽGê˜ã×¥·ºÉùƒ [#¬Ç«^ª…eÛ9”õ†ì iš2qÓ)Ä1ÇŽ#‰â¦b¦E‹–>çPW%Oo=ÍÝúQþáëÿÏ{Þ©Å-Z´hñ5ÿîO?}Ž?ýèGX][çú3ËÔuÕž˜ÏIìïš9¾`=L¦ª¦Nä09 D Ò8a{¥ý~wÑ TÎ@n£X“&Qœ '-ûûûäyŽ‚$ÉÐZSÞ{¦Ó)âKH”÷©ƒ(¥D5}©sâ:'…ó¯ÖÚÅ~ù gB0’õ)5:ެnÔ7…Öš,‰(‚”‰,ôf6ëoû*õ_b7 $Êš«¤Êº&§9†º®IÓ%‚«DSJɬ.B!%tj‰@¢‘ÙY'Eeû&„D¢R€XW4çP-Î¥5aR/1ãS’¤‹š»~ïÿá‘'. ;Ëì\™†ÙS"ße8½ÄæJŸÝ=òbJ9›¡„GIe ©¸>(œÎya˜Æf«µdfY7e8ÒË:˜ºÆc)MIžç ñç¸úYS ïQMÍ‹lúH­·xhhxMØj:ÂC'KXYY£ÓëR9ÏN-ùìÎQˆ˜R%A)® ÖL‰µæà`çL¸£#"-ɧc¨kº+klllнî:†ûCŠjvÍûÒ¢EKHŸC(«Š?ÿØÇùGÿý÷ñŠW¾²=!-Z´ø;ãy§Nqôè1þèƒÈ?ÿooOH‹ç,öG øFs˜|)¥Åk^¸Ñ0ï›:Eš¦ uÉ{ß(–ïkðk=®¨°ÖS×%Û;—©ªŠ$I Y–¡T N“iHö“Î9á4µE· ‡Õ´`MåšßC W­¼\=6wH‘“Íq*!»oMÝê!««Ä7vM×XFç_¿BÄ\áóóÆŽ ç}H2váx¤wÍÍÙX_ß„þ\ ˆüΉû¡V¼sKŽñº;=ª68RE”ÆUÍž£?Øäò•}©)ó",q*É"Áh´GUÎpÖ¢¤Ä ®±G !B—¨$Þ9$Á&­µF˜ŠN§Ã¹'ŸÂ­­°ÔëQÏ* $×ÎÏQx»vŠhúFçï¯pÁª»PVÖ»pL"[ÅJ!c6špPVŒbG¥3J"fµ£¨ „ô(E9A)AUWxYæF¥<ïº1}=Ÿ[xœd!hª,Û‹G‹–>áœãâÅ ;~¼=-Z´øºqúºë¸pa«uZ´xNcnýœ“)¿9i:l?“›y=É<Ìfno­›yÒ(Š5%¡³Q"„gsscÌBE =ŸfiçPÒ®_X[‹¢xÆ}B,fù“Ôùú¼³ ¡ ë§óWçcç¤Ê9‡mf…Pe³QTµ¼FADÑ.È«¿s¡²9^ôB¡d„³ç-ÞeT«¡ÆVx/q"¨ÏBB3àx•äÎO<E9›]c öÞc›s6¯Ñ¹Æ+Ê;bkDLjG%5ÛÓ#« öx§ˆ´ ƒ£«‘0èH“OK¬­ž0wëEØÖœJÁÕ{~±?A)v(>Kûû»€#mlÖsëu©Ò,|¸‡ˆ½œSpgIôªÅ×á‚æA¥³,¥ËÞö6½åUNž<ÅçÆ5yé©áf€ñ(íq²¦¬¦¤QJ'ͨëšÙtL”d¬¬¬à±dY祯¢*U¶UH[´„ô9 kmûÇc‹-¾!PJµåæ-žó(ŠêÑkf ÿ.Œ1H)‰u´PìæÏãÐ#”Ò)e3/X6$c®fBè ÔHB:’4E[ ¢( *ZPä} 1þ¡šWÂÞþÜîZU×ÚíçvÜk‰\˜ÁtUÖ óÂôÎ IDATÍuG‰lTÙ8‘ R„Ÿ…|ê¬q!ÁGˆ@²¥/šê bΛ‚¼'DX÷l6kÈvP^…xç5øùܤ ;ÂÏócYÌ3‚vu_"­`îÓ¤Kõ6Æ4ÁTáý”"mœ'Å#pL…Æ*Í_?ô¥LØ9˜°ÇÔãR_“zO™çÔ•o”òPå"…¤®+¬«ñ>̳^ÕaÝ‚Œ*¯ðÂSÛÐßjmÖšýý}"% ‹×Þ‹}–Bjj¸fN׋&ÐÈ_ âJãˆÙlÊJÖ库gÈ––¹”ÏØ93ö^K"b´a+J;CÈÇ#Ò,Ø gjÒN‡ÕÕU”R\æÆÐ+;+¸|ù2W.ïPÄIÖ^r÷Ÿá\—åNŠEÁr/…jB–¤ÌÊok¼€ä6èù=wM/§Nºð\Ó„6 è-õ¹té—wv‰ÓN Ð"k¡$꛲ÄKli(—ñWmã.̨âÊY„ƒHH–W78º¶I·?`¯¨ØåDYŒ„iYS”9‘Å:ƒÖ∺¶¨(fu}ƒ¬ÛçØ±c|Çw¾œ#Gޱ¶±A¿¿Äl6ãñÇŸdx0f4µ-!mñõãĉlmm}Ó×Ñ¢E‹-Z|³à…læJ6á:[Ï;&«PÑÁ!ÂàKx­MÕ‚+ÑÐâêŸ{qÓaêl¨-‰¤f>éœEèx¤”ÂK"| *äœ<^ _Þ€ç ŽUÔXG¢cR쾕5(ÝHQU%SŒqD‘¢®ƒ’˜O'¬¬¬0™NÑILeêйEäyNGwB8’»JÐ Ô×DJ“ç9išR6©I’¢u ÎSxÁÔ:îýôýDJ³®bÊÝ]VM%jLm±uzI—ª*@8l“Ä<'¤ó9YkR-›µT‹äß8‚~¿Kk¦³ë=Ó²dgŸ“Çž‡q‡R€› ¦8Ž1Êí…%ÁºEx’·5®¬I„@;3–X*Ž 6¬m’–9¨jÎ s.N E y1EGBAUÏð®BD–ª¬Pªƒõ‚Á`•îÒÞ{VV×Og$£^I†ãRJÎÞx&|–tKZ´„´E‹-Z´hÑâë†snÑÓá°4ÕŸAÅôo.P±kúJ½ÅUår>»fO=È ª¡‚â‡X´®  º ’ByÊã¡€"¹°¬^«J:ç˜N§ÍïÔBQ ûщC‰¸îP½ˆ”HÈÂgnE¡ÒDøÐ·é^‚¤!뜳‹:çÂyzi‚÷:à&üGx‰—Ž^·Ãd?„5©P‡âl,¯ŽFYNç¶×ë] ŠjȳqAñŒ¢h1»+û.Bú-¢!ªk*’X#¥f2ž"’T„Eô<öÔS¡Çtv@W (¦([ã…AJóc,Þ‚W×Ö³\sSãðï¥hÎ[ «Æ@'K±Ö’õºŒG8ã9q—8JY_]g2™P—q£„`VL‰uÔ¨Üi]¨™ñAõHP¬c‰„dÐé‘¥}JãØß³[W ˜8£r­5UYâL*dô‡žã'N…ª"kI²”‡úGvY]]¥ÛïqöìY’$a4dee…áp¯<Ý^@Z<÷éh4âÿø·ÿ–øÃ\¸p‘^¯Ç«^õ*Þú–7óš×¼€µõ v¯ìü½ïË«í|-8qâÄ—ýîÛAµüvTWŸë/Ý÷{»îº‹ûî»,ËxÝë^ÇwÜÁúú:wß}7¿ök¿Æý÷ßO§Óá5¯y wÜqGm¯@-Z´hñM‚\Uû¤h¸i˜ÕSjN%ì’Nƒ” ^z„H!C÷'‚ˆ”ëE Ö;Œ÷àj(ë@+%h©ˆd£Òz’hç·QC%ॠÄy×ZB~„D)±Hæ×ÂRísˆ^†ÚÀM>Ðå¡õ¢™ŸuüUr|mÐ’¿œä\`„2á|>“¾è ïÀp<&É2¦Ó)Òh„VØFÕÝzú lll1iš².$ÎZ~øa.\¸@Q?~œ›n¹™ÍÍMŠÒ]}oœmTç0ZUKƒÎ9òYH.î b„J(*Ͱð|àw?ÀC?JYV¬FÄ4§œHƒ)fĉÂ;AQUHÈ©µ–Ú,WkvæçÇá›ð(¹PžƒãÇW(Ë’i>áù7œe:r0ž"F¿ßçÇüÇËïºë.Þüæ7óÀpï½÷rË-·ðÖ·¾µ=©-Z´hñÍ$¤2ÌLJÈ„’%$–Z†À"-š‡äÐ̦Xäû¸Fõ’y‹ÉÕï•@4%ƒÆ*ñ(qí#$Û^U9£(BE ‘TDJ)–,¾{ª ’-šõ)Î9êºÆÖ[;¼štÛEP“>+”D¨Æ;_®µ&Š"â8^TÑH)¯©;™µ6ØpÃ<¤©r/…GÈ ÐY/Ⱥ}–VV,¯ÐëHâ”÷ýÞïò©OÝG)*S"µ N¦³œÓ§OóÒ—¾”WÞ~;7œ½žXK¦ãaØOÔO¥¢æ«ZÌÜc˜:’d'ã|† ŸûâÓ|ñÉ ”6¤ÅÚª¤žMPÞ ¼Cx‡7Íœ¨H‰C½Š»F%ÏûÎo˜¦WT4õ0UU°»»C’Ƽä¥/æäñM$ 5lï\f<ÚÇÖ%8ƒ¦1I¬I›ZU×PUˆÊ@eˆUL§¨8¡ŠaYsqÕrþuþýüç»îú¼ðE/f}c³¹«hù¹Ÿû×<ÿù7sâäóxó[ÞÂd29t×ñ+/ÿJÛùVÃSO=ÅßøFnºé&®¿þz~ø‡˜+W®<ãsï¾ûn^÷º×qúôin¿ývÞûÞ÷.–c¸óÎ;yá _È-·Ü¯ÿú¯_óÚßû½ßãöÛoçôéÓ|ï÷~/?üðW]ï\i^÷º×ÑívY__çg~ægøä'?¹Xþ|€7¼á ,--Ñëõxë[ßÊC=Ô^}Z´hÑ⛎FœvzÔÖÅzËë<öÔ6vïuÉgUP°ó)H¡½E¸ …ÇÔ%¶±U{Cçödï¯êå–pÌóO‘q®Iø¥Âß³Ù¬I5¯ º\wÝ)^õª°¶–GPÕ9C¯Ÿ1XîÑëdôã鶨¨Š2Øk]HüUIŠÊ2*!ØL¹°{À•IŽ\^¡ŠSÆÖ115µ¡$Ö”H¥ð¶¦˜ÍpÆv:t²%¬õ ‡C¼÷t:n»í6¾ÿû¿Ÿƒƒvvvxä‘G˜M¦loo³··ÇÁÞ>>úèÂ*Þ¢Ås޾â¯à'òí|ò“Ÿ¤(Š/[>·Ðî^Ùù2;í§îÿ÷Üs7Wv¶ø÷ÿþ—øÌpÏ=wó7|ž4My×»þÕâù϶üÙ¶ó­„7¾ñ¼å-oáÁäÁäìÙ³¼ë]ïzÆçþÄOüïxÇ;øâ¿ÈüÁpÿý÷/–ýâ/þ"_øÂøã?þcî½÷^.^¼xÍk?ñ‰OðÁ~Ïþó¼á oàï|çW]ï\e|&Åñþûïç#ùçÏŸÿšŽãÙöýÙ–ýê¯þ*>ø ùÈGxàHÓ”ŸÿùŸÿ†ÿüã|çw~ç3.ËóœßüÍßäÕ¯~u{õiÑ¢E‹oê@Áæ)šòŽùæáŠ5!Nr¹ ˜B …oExh!QMâ¬p~ñ¾™wô.lÓÏgíbÔ„~I/XY–‘$É5‰¿UUQE8gÁ[poêÅÙ kCG«µ–ÍÕNŸ8Îj§ËÉþ2/¸îzn9u»/SÏJΞ9³˜!UJÑëõÈ:=ð’ÚÚ@ÿ„ ƒ„P[ˆRâNgTFâdÌ¥Ÿ¸ÿ!ž¸°‡%¢¶"̲Ö±0HWƒ©ÐÒaL…÷¶©ó±WS|¹v†ô0I]üÜüeEa¿Ó4euu™º.ÙÝÛA)Á±ãGxÍ÷|7¯~õ«øŽ¿ˆ›n8ËéçäøÑMV–{xcpU…©ÊP3ã-D ™ÆL]ÍAQ²7+¸2ÉÙ« *¡ñq£4…óT•ÅÖ&Ôôø ¾cÀ{ân‡¥åU cBàÓ©S§øîïy5/zÉ‹™Íf<õä“ìlo“ç9—/_¦.Jb¥™L&(!¹¸u¡½x´ø†ãÛb†ôwÿïßáW~åWù?ùvžxâ 666ø¾ïûǼó_þË/»[ö¥ø×?÷s¬¯­-~þ¿ÿûü§¼ŸãÇpÇÏþ,ßóšÀ¿ûwÿç×´ü[ _:GºµµÅ=÷ܳø9MS~ê§~ŠÛo¿ý_Ÿ¦)ÛÛÛìîîrâÄ ~á~a±ìøïÿû9vìwÞyç5¯}÷»ß½8ÿo{ÛÛø¥_ú¥¯i½_ wÞy'k‡Þ«¯v϶g[ö¾÷½÷¾÷½‹ãúéŸþi^ÿú×óîw¿ûë~?~øaî¼óN~ÿ÷ÿ+¾Wëëë|ðƒl¯>-Z´hñM„hÊ¿´j%3¿9b®˜6ó”‡ ë¢~µ0$÷µ¬é‹€w!•·é‘U×ËPM"EÃBçd¨*ƒTEP_]m0Þ¡UL’$¡h¤!B u¨›süÓ$y cßð`ôõͳü—ÍGŠC$])Ål6[t¢'I²rFà˱òž0¬*ðsE9ŠIT„ðžDizYÆ?ÿ7|èýà¿{éËX;yò’nš0* vw® "M7N1uÍt:e8±?²¶±ÎRöQ€\8~ï-B*´Òã|B”jFÿõ£Î#î ³>Ãi‰ŽÊ|ˆ²5³ñ„”çjt¸Q|­µózÐ…:ªXÂrç\ó^‰FI Š·Œ4£!à‚*+t”!„àÒ¥‹(!‰{³±5ùd„1eU>ÃMM ߨª½Ö\913ŽZ( ï1D$qÆ´¬©…À£ÁVafÙXT¤qƧô—–ɺ=*cñBrë­·ò²—½ŒÚ|ðA è4ÏY]]åòåË\¾|™¥•eF£Qµ7¿ 0 ø™Ÿùßù‹?ÿ3¶Î?ÍúÀûÉóœö#oþª¯ýÒà˜‹/rû+_µ°ÝÞ|Ë ®±~µåßjx¦Òûî»üÁäÆoäĉÜpà ìíí=ãëßóž÷ð±}Œ×¿þõ|×w}ýèG˶··9uêÔWÜöá›Y–-,9_m½_ G޹æç¯v϶g[véÒ%^óš×,lÃ/yÉK¾!ïñ_þå_ò¦7½‰»îº‹3gÎ<ã{õÈ#ð¦7½‰·¿ýííÕ§E‹-¾©ŒT £ˆ(ŽIÒ”ª®qÞSÕa&r2ͱ.¤ìm1XCëºF –Y’!‘ÔeD¢¥Fx‰ðïZ‡žG)T蟔ŠÒÔÁÆ›¤x¡ðHʪ¢Ûë#”Æáɺ}J‚tº½%¬X:NRcœÇ¸&I(¬‡¢®qB t6 köô²”X+²8"ŽÎÖ˜ªÄ;C)Š|B9ËéfÉ"´(„øX¤ÖMEM½èYí¤¶6HÎX´–HY!}lZêõé&]¬ñ¡p&<¿±Óœÿø›ïaïÜ9&OmñÅû>Mµ?F;è%YœÐëtA§L¦9ŸúÌgxøóŸã3}–ÇžxŒƒñ^Z¤Ô¶"N#*ç1^òô…+üŽŸâîý½ûüáÿ„¿¾ÿóÌŒbVƒ±çhRƒ©Vg‰#EYÌ!UQôi,˶ jšÏÑÎob„.R×(©áF†W‰|Y†@¡°Ü¡„ ×ÍèvRŒ©pÎPæ9¾©ÿ©Š’zVQU+¢“ⳄoØšìsàjFÂ1žR¬ŒQ‚–Åx†Í‹p+Áz°_b¥Á9zƒ%âN†ˆ4I§Ë÷¾ásýÙ3<øÐg¹÷Þ{9wîÃ!ÓýéO°¹¹É¹sçž‘\}5<Ûz¿QÇñlÛøjÇõGôGßДÛ}èCÜyçüöoÿ6/~ñ‹¿âóúý>o{ÛÛøå_þåöêÓ¢E‹ßDLg9K+Ë'M¦$Y7XB¥¤·¼†ˆb¬wØff¥¨LÒ Æ:”Š8ŽñH’8ÅyÉþîN‰8î°½µ…ÖW×)­ Žb¼€`imçšNK?ò¶ey9A©%#Ž<ÉÑM¦“}âDÑïô(ê á<›ÇŽòò—¿œÙd†PŠ~·K·ß'ÍeQã%”ÖÒïu©ªšI]SKKKDZ£"Ý(©!phww—µµ5Š¢@Am µ5tÒ,ÔÀ4ÖTç\°{ó£ u5Þ9|]SNK )AF *Öt+ì^¹Dòÿ³÷æÁ’¥g™ßïûΚ{æÝoÝÚ—Þ»ÕÚPBRkÄh4  aAØØcÙˆ‘…`"Áf 1dRˆ!Ä@ÄØafÌ¢ÅjIH#  u«wuwuUuݪºu÷¼ys;ûù¾ÏœÌ¬ªj„ˆ>¿ˆŒÌºynfž/³ÎÍç¼ïûõI>ýÐCüɧ>ɧ>óY.]~‘ÞဠIùê£ðó/p81 À(KI”&Í5q¢°áø`Ùhiçšåµcüîø=þç_ý_øÐÿþ~ï÷ÿ€ßøÈoò©‡>ÇŸ|ò!ž|æy´pÓ §Rc¯×ç?ñI¾ë{^Ç]÷ÜGµÙbay™\)vöºØ®G0&Qšz£…_o0†|â“ñ™Ïÿô‡Äo~ì·ùèo~Œÿø‡çÉo<Ë£O<ÉîAŸç/]æÒÕklíPŸëàÖk(,ªÍJÈ¢êjó‹ËDI†2E;ñÔ°ÈC–e³Þiå ÑÇ1I’Ìþ¾A@µÖ Ñœ'×6ãÄ ‡«Ûûüá}‚Ýý.Añcïþa–[MÆ8¶E¥Rá-oyϾpžÏ|þsü»ßþ÷|ãü üÅWÿ’ô7Y_¿ÊÿñÇyòÉ'ùôgâ‹_ús6¶w9Œ¹tù*ÝÞ€ëÛ{àx ã”q¢ñ«-–ž$È •æ<¸éd.V›ГìÒi2,EL Œ¡'m×z–5jŒ¹!FM1ï«njßÖS!{S<ÏtgÛhQšŠëaaQ­ÖÀz}†ƒ1J b$‡QÆ N‰µAY6 ‹LirÒK HËõ–Mž§B[iar…_«sò¶ÛÙ=èÑœ›ç-o;Q’qxxH’$$I2Û¯iµ×²¬Ù²R ×u ÃðF6¬ë–’¿uþATHé—~‘ßþ÷¿ÃñF,//óàƒoãw÷wfÛüÜ¿ü—¼ý½ƒ ^ÖpèýïÿW|øÃæŸÿóagg‡³gÏòÁ›Ú'ÿºû¿Ýçù»äCú¿ò+¿Â{ßû^VVVø™Ÿù>ñ‰Oü•Û¾óïä§ú§¹zõ*gΜá#ùÈì¾~ðƒüê¯þ*ïxÇ;0Æð|àÛ~ /÷¸ï{ßûx×»ÞE/Uó×íÇË=ÇËÝ÷s?÷s|ô£å=ïyÏì=~ÿûßÿ²ûóRG`¸aÐ45ZzÛÛÞvËï\¸pZ­Æ÷ÿ÷ó¾÷½‹/Òn·yðÁù­ßú­òèSRRRòw‰%…I’1F|ãü he¨Õj¬®®Ç×67é÷û¸žÃ±cÇXXXàÈÒ vÕ#Èsrc¨ÕëäJÑíöøÊ#ráòe„e‘"‰u1OzáÊZ ?õ ÇŸy–µ£Gh·Û¼øâEâ8&N3®]¹Ä8 ê!K+«äi†W«SQ a9ŒÃ˜8Žñý‰1 P©5ˆ¢ˆ ùÆóÏóÄÓOSo4ØØØ@ÁÊê2žçqæÔi’$¢^­Òn7Y^^æÈê2arîôT3?¿Àx4˜E½ û„a8‹I‚€4MiÔ긖M’$X–…ç;8~­aØÏÈŒßhQŸkòþÿ›—/b ›ÃË—8Ö¬rýÊUÞpÛ=y yì™§øÃ‡¿È{ÿõ/ð¥¿üë›\øÆyÂÁ˜{#«Gù¾HsaŽõM®lìáº6íöGŽŸdgHœƒ2W®]gåÈI¢QÈ8JÙÜÐY\*ĨPØÆ` ……ARanlPH”¦hÏ6mFé[Ä(“™â›ŒŠëÉ4®(®Õ$ËÕ²,ò<Ƕ c´$y®±&Ù²‡½Aà¹UŒðrC˜«Âµ×hQ´£(úŒ§ÙB¶ƒpl´U8?ë,E°­¢Ö”ªœùÖ q¢¸çþ×rî¶Ûyô±¯³¿Û%ìñÿÙ‡x÷¾‡$‰ÿ^¼ž÷¼û­ôûClË¥^o’+M¿ßgaa Û¶cæææBë Ïqq I§Óáòå+àV|Ò4esk‡ùùy„å0ŽX[[css“\VW–(²,ãĉc…c©]T Zy’±µµE³Ùdo¯K£Ñ Vk ¥Æqm<Ûc0#*µ*ŽãÐiµÙ?è¢2M{®ƒk;ôû}ªõû‡}®m^'ËL®¸ãŽ;X¿| Áâ•8ä‘Ï}Žs ,6ÙS)'ßx?—†TV—Y=}†j­ÁR­ÍÅçÏã»®ë’ _¯ñ™/>Ì /sìÈ*‹+Ë ‡Cò l¯Æa‹e¯/ IDATL{a„K÷`D’Â(4tææ‰ãc)<òh€ŒF´†TtްAž™œV½È:ÏHÑh¹Ñ³ê¨2…P͵AÈ'FXB€´$¶SL55N>Fµ:i¦¨º¢4®p F!W·È¢ÇrÆ»™‹Ö9Ze(•‘«ä†y’åb°@HDµI¥ÞBÚI8$#LªÒA"ÑÆâÄwqüì°-ž9ÿ\‘ߪ uË%ŽcߣV¯3??Ïêê*µZÓ§OÏ «ªÕjqîÆ²fíÝ?ÿßû÷æ¸òЧ>Á»ô=ŒÇ£ò {/×Z=øÒ>Ï»þÙ}G½y}ƒßþØÇøÈoþÖÿ$@À8œ\nº=œÜM¶Ï)N±- üœ!-)))))))y¥4[º‡ä*¡btá^ëùTëÍ¢ZÔMFGÂ8f8"¥dóú6Fƒ<×`IT–c;.ÇNMâJ,­Á®Vqëu:ÕûûT½Â('ºx‰••z‡(¥˜››# ö{‡ä¤í¢Œ SŠf½N–%ìôðk>§ÏÅ«V tæpªUÒ(%NSº½ÃˆÇqX:z§Ñd0„A¦èöGÔj5Ž7ÛDaH¦AØ.ÿÔC4ê5V–@)’¸¨Š?zl6+Ç1žS´ìîõ±EaØãºnáþk  eyé,^¼ÊcOŸgûpˆ×lrôôqn¿ûv=ÉœI訜óçÙ}qNg‘Ÿþ~†‡/>Ë›ßôZD«Æ_<öO<ù4w;ǹ£'0ư´´Äç>ÿ9Üj…A?$Ï¿BòÌyúý>BJNœYâäéUNŸ»ƒÍ=íxB2±%£Šo¾f’kڈɜ¬ 7`´ÀhjÒ²+ æ%‘/p“±(J§¦0,ŠÖÜiRjV„‘“Èi9Œ‡!Ýý¢0Æä†4Ž¥9¡íb ‰1 ò¢‚+XÆB)C. 86¶m#,IŽ!3­R´phwæè,.°¹»C€°h6›tM~àÁ·Ójµ°<%ŠyW(rbwö÷f†Nõzc ½^4Ši4“ø¡ï- %«”‚´¤¤¤¤¤¤äUÇÖõmƒF5iS‡#®n\Á÷}ã•zp8¢ßï#¥d~~žÛﺛ ÜŠÏüÂìv¨T*¤I†_«ÓnÔ  Û¶©6ê•c».ûÝ‹K+X¶ã®]ßáío}ƒþˆ^¯Ç±cÇèõzlmíà9k¸®K­Vcay ײ¹víKKKlîlS¯×q}ŸÜä4Z-Œ%ÙÞÛÅŒ„aÀ\»MµZŲ]â$ã‰gžÃ±ll «QJ¿wÈ<À`ñÅ?ÿ*R(ªÕ*_{ä1â8¦Z­Q/n!N“‰0©T*̵ڤ*geí£0¦wé݃]¢(AX†×½æ­¸2§Vñ°s ZËKlíìrîMob; 8}Ͻ\îuù£?þ8_ú)†ãhžxìÉ"*¦^e ñª®ìŒétæév»„QJ¥Ò¢Rop÷}ßÅúÕküéÆr+ Â8b8ލÕjä \©r’¯ªˆI¿à´]˜Ìˆ‚“˜SScЍ™B(Þ$P'zTSÄì¤g¡L‘ת•‘Ò.âpºû}„]!J"ÆããÕ0Bç)d)Âh{ÒÞk&µBÚXÒA !¦-¼6H)Ça~y‰ÅÅEÎÌ-°¸ºÌ‘£ÇÚ`!èmn1l²ßï¡´&Š"¤”ŒF£âdÌD V«UÖ××i·ÛÔk5®¬¯Óï÷áú©òRR Ò’’’’’’’’WÂâÜ¿Iš'DQ„¶ váxD½V£¢}¶÷v‰£Œ4Í™ï,±»;`qÑÆq+ìîî²³ÛŲŠùÀ4NÁH*®Go¿K¿ß§ÓéÐïuÑZ†!¾ëÑjαµ¹[ÌŽF…XúôgþÏv¨Õ[¤™faqײ07ÏÉÇØÙÝe0ÐOÈ2®­_fiu…Ñh€ë{ F”R Æ#úý.õdÈòÂ"µºÇáÁƒ®¡Ù¨ÑŒh4šìw{H)F×h·Û|öKŽÑ9Z]DÌÔëœ=sš{îZE+…É36ÿ,·Ÿ9ͳ—Qia¨Ó>y‚ÃÝ]ÎÛ_ú½?`Œ±<Ÿ¥ÕUÒ¡¡æ´™?r‚$ yá…¨ä)áxLG VÚTë ¤ë°´v’q˜1eü§?ús¤í«k S¸âbFDa„ë5± u-‘¦xߌ,"}2£ÉÁõ}¢4Á•mKr4¹Åü§š V4€he@ ¤%AJ ãJDÍGW,Œ8–ƒHs¤¨(gÿà€­Ý>Ajµ&S6ÊŸÃv-T܇4¥È 5 % ÅpªSm¢R…ÁÁ÷í1®Ûª î¿ÿu<øàƒ,//3Œèw ‡c‚½_¿xµxsÃx8aB'aá¬5Y–¡µž™UMsvÝý™¡UII)H_ÅLÝÏJJJJ^)J©Â`£¤äU̵ëWÂppØ£ÙiјkÓjµHÒœÃãј(̨xUjUŸN»ˆ{æOQ¯×qœ¢ Óé0??ÏÞÞµJ•ÌÎ0JÓn¶¨úE‹­Õ°H’Û¶öÔëu’4ÂM¯×£R)æ kRÄQqùÊ:ív(Üo+µ*ŽçbE…©Ð`0À²,êÍŽãàº.ífƒýí-jµ žWa8Ój6Ñ ÑF ¥E³Qcmm ß÷éõz,.Ì‘D1µŠÏx¹mÁÙ(§‚ߨ£”Á«¸´Û>K« üØOüKK+\¹r…+h —.½ˆq38†!RÚ“ ¨&Š´É'm¸EºÁ4{UO^w±.æ–üÕ’’R¾ ‘R²ºz„í­-Ž?^.HIIÉ+âê•+9²Vžä*yUS­yc¨¦•"·A·Ûess«‹qaddY‚ñxĵdííšíQÑjµ¨×ë³*’RŠv»M¿ß¿%jÌq„,//ãñ˜ñx\9N!tñ…ß÷}Â0¤Z­’M·{Èþþ>Íf“f³ REa2èt:h­ö$IÂÒÒ"ÃÁ˜•åEN<É•õk¼ñõ¯åÅõ«T\‡÷ÞÍ•õkX–D"Ȳ”`4âÌ©Ó8–dgg‹ãÇ“¦)çÎãá‡f0Ðn·éu s¡<'‰"NžI«Ýâì¹ÛÊêFIIÉߥ—.^àÿïÿÈýøO¦I¹(%¯Z¶·7±,‹j½6q¤ŒúClé§ šížçQ­x4ª5ª5Ÿ(N ‚p"4ŠjÓô‹|§Óáàà`õa“«Û¶i¶êT*žç`Û’4] MS¤ea€ù…y”RDI\8ÛÚ…è˜[X"JRœ$Åq²$%MsÚí6½.ƒÃ¢õ¶Õ¨“¸i²Ð™Ã¶aNös•eìîì ”Á¨ŒŠï"1´ZM‚AŸ$ Ù277G÷°Ë\«Í³Ï>Cž§¤©æüùçx×»ÞE’$öz¬¬.Ñh6°B‹,˘_X@ÁÕk×©Õ ÷^»eÅ›»»<üÈ£ÌÍÍqçw2Êr¾üè£\¾x™3'ocirr,Lvö·9vâµz•Ýn—+×6Â.beŒdk·Ïüò*Ž_gw¿O˜ªÂˆG0ׯ`Yƒ*bP¤ƒÀ"W…qU¦ J(l£ŠYP Eªè !x«85c&•ÐÂJwz[J‰–ÜTÑœP)ñXZa‰bÞ3JRAL÷pÌ(ÎQÂ*¢[,9É|MÑQˆ7Ü‘Œ“â¨#1F`{>Iž+îÍë¸ÿþ×±³½K†Å\mâ8išá¸0(ºñ9ÍIÓ´hWçjû¢&9¤ú%±6/]—’’R¾ ñ<ÇOðƒ?ônúÔ'ÙÞÙ.{ùKJJþÆX–ÅêÊ*?øCïæô™³DaP.JÉ«–Õ#ËaˆeÙ¤i†e¹¨ÜШ6ÐGãyi£TFäy\˜âȬhúåÜó<:½^ß÷gs¥®ë’$ žç1 ¨T*,..²¼¼ÌÖÖB´ÖT|¥W®\a~~ž4M©V«,uÚXÂ$IaŒ£5qsäÈ ¹Êp])%QQ«U8zô(ƒÃ>/^º@Å\ºx¹h¹Í5KK 4uÚí6¶]´ü¶M²Åyæ;mjUÇuñª+‹K¬¯¯³±±Á=÷ÜßøÄ'0Æp÷]wñÜsÏqöìY”RtææŠH”~Ûs¶C”ft·¶¹pñ"J)‚ àäIMoôB’$aîÈQ,ßã…Ë/’ç++Kh­yöÙgY9²F†Üwïýaóâåk C µúa¤880 qŸ Œ@„ëP­ùH ò¼Y–t0(È9Jirip&-©3³"nˆP·dÞ,Äf×Ó^&ÕTQˆQ)%–ØB •AHSEÐŒè‡1q®±¼ ÒrHUNGE­”Qc= 6°@J×'Ó†#«Gø¾·<Èü ÝýñᘠªÕ*žç±¾^TJ…H¬ÙØ×´š_¼Î"/Uk=»oó3Û73]«²³¦¤¤¯b|¿Â]wßÃ}÷¿ö›%%%%ß.…qEZŠÑ’iŽä°ˆcW¢Vk`YEm³Ùdmm™îÁÆhúýƒñvg1 PJQ«Õ¨Õj€a{{‹îÞ>ŽãÌĨcYìíîâU|ÏEH¨Õ«Tkææ;HYħ„aˆ%m,Û¦R)Zˆëõ:ÕzF­N’$ŒF#,[ÒôͱcÇØÞÞÆè"Vd¬s._z‘4MY;²‚1†¹¹9{¸®O†ôû}æç±m­5–×’Äá˜(MÃ`ÌÕ«W9yò$gn;G·ÛåúõëdYF»ÝæòúUNœ8ÁaX̬¶çˆÒc ­V‡þ`Dš¦ØŽÇʤúi„$¢Áˆ½½=¤å€1ìº]VWV°uÎúÕkÜqÛ9Ž?ÎÆæAñâ‹ëD©¡ZoQkÌ‘kA+â8ÅõjøjÒ^Ç`Iª&~ÕGkE–¥  “!g)1Ê«œÜÒ®DfÿÂ-m»ÓRu“H Õ©ÅLf+'m½R „”… E µ@ ƒÉ Ã4`o¿G’*‰plR%F“ëlv²ÁöltªŠZ­!hc„°l÷Þy/ßóæ·á¸ž{î9º‡…€´ààà€F£…ïg`TVdéæù$ŽF’e y.䦡B€ž\ŒÛ‚é~OD,Æ tÙ¶[R ÒW%Óüª,KËÅ()))))ù[ ךµµ5yVdOÎ/´BÌa’Ä Z­:®gãû>ÝnÇ-DãÔüEÊ¢ºT­V9<,ò@§q)Ãá?‹9}î6Ò4e001Æà8Ãáååe0ÅcèIÔh4¢ßíröô)’$!VV—p]—jµÊx<ž˜ u‡3Ÿ}úý>:Wœ>}šÕÕ*gÎÝÆSO=E03??ÏÑ£GÙÚÚbww)e!Šòœ0‰ÙÝëâU+DQÄúú:W®\Ár&hò<§^oÒn·g†HŸþô§1¢ÕjñÀ0†ìîî¡”b4©T*líìQ©U ‚€ååe‡#¤”ŽÆ¤ù&¾ëà¹×¶¶©Ôê ŒQ‚6¶’4Ûs´æ8è8Œ€¢Â—†!xÕv ß÷q‹4Î —X !e”FSäŽê¼]â[·ž ó-ïƒB¸™˜™™-Ä@ Fæš È88¦ϯa9†‡‡HÛž}v@aŒ@¥V@íÁ²È-Òæ‡ßýc¬®àâ‹/²½³‡ëú)èíàyÞÌÐÉPœ¤˜››# Â[2S§¯OcfóªÓ×=­Œ¾Ô¼hú{7•””‚´¤¤¤¤¤¤¤ä°Ó=$Î •J K¸HÛ" CT®±d€ÊrâdˆkÛ„A@’&ÌÏwèt–I’b޳Rñq]—ž?OÇ(Ñ™kqß±{°„áçÄ­V ¿QaL¯7âäÉ“?~œýý}jŸ­­Â8"Iv¶w©Õj!¨¸.AP«ø,,,`´àì™Ûð|‡Ñ0+!׆æÜ[×QZpæìíŒCúƒB°zÕ&'Nž¡ÖëÓíðÈ×¾Žã8ôz}|ßçMox=ív›ýý}ææyþ ¬­­ñÔSOñÀpÛmw0¸|ù2矿@«³ÈÎ^—8ŽÙÝÝ£V«“¦)®åqñü%öº=zÝqš „Åp"¥KåØÒ£»ß™ÐäZ0ˆR29Æ|ù+p×=÷qîžÓ=y–•µ“\zñ*_}ô vöFdq‚㸤iJšf`YX®ï»aè|â «ŠÙyÇqP¤-°4£Q*G›ÐK¢ò ¤!×RJ²ÌÌ* †Ù¤Ó†U3rB@–渎Äu݉`“Ä9l¶¯í1 4®ïAD`;…8V„!Ð:Çõ«¤Q €×l‘ Cîýî7r×ݯáúÎ>—7v‰³”<Ó '†Ey^ÌÇ*UDÝ!PÆÐívq]·ˆrÉb„8^ß÷Ñ’<<Çó<â8¦R© ”šµû¾O£Ñ MÓ‰©T§lÙ-)iIIIIIIIÉß~¥Ž6’0JIã"ŸqanŽÓ§O£²œjÕçùóÛŒÃ1Päˆ6Ú’$@i1š,«ãº.GÖŠÙñxÌ‘å%î¾ûnvwvˆ¢žç1¼J…ckGˆ¢dbÔ¥wpPD½Ô*¬¬¬ðä“O’¥ öå²rôÛ[»lítéC²$âÔ©Slo_g&ø¾Ï“O?ƒ_­"Œ¡R«b»Ãш'ž~Š;ï¼s&dNž*Z‘…$E’'…p¶ 3L…Á¶-lÇÆqš`Ù6u·mÛ!¨V«³ÖñZ­F«Õbii‰Z­6‰Œ)))iIIIIIIIÉ+¢Ò(Ús³T1¿ÐÁ(MElnn`”fkû:•šÏ•+W‘²ø’ž©CªµÕj•n·ËÁÁBîͽäyN«Õ•óè£R«úA@¥R¡V«Ç1{;;dJá;>v‹F£Èdz¢#,--qîÜ9Z­6/<û,J)â8fccƒ«W¯bÛ6Õj•ƒƒNœ:…ëUÙ?èsåú‰2$ƒ!hÃ¥Ë×ÈócrÐí§JD,Ìͳµ³G’$,..òš×¼–íím6·¶¨ÔÜu×]|úÓŸæÞ{ïåÒÅËôú7á ­5›×·9<<,Üþe‘qYõ+t{‡dYV>a#Œ Sù,³óæ9Dmƒ_iI{‫XY>‚ã5¸ÿ÷ñèßcS©µ–K%Dq *­@+$Dz'S¥4Z+Ì$3“Ùü§Â ¤iŠyR­uáÈûWݩё0 c$ÜdzT([QÌ[N¶ŸŠÝ©èBÄŠ JHsÒš¼>…š‰Q ˜"Ò…"š@Öj(#Ѓ€ü£ï¡Öhrms‡V»C.ƈÈ!Í3tZĵè‰ë/–@d! ¶mcY­%Y–áyÞlýmÛÆqœ¢úÙª“ç9‡‡‡ÌÏÏÇ1µZJ¥2û™eY¬¬¬Ìöoii©b×ë˜4aam•ûßð]¼áõð•¯}ƒ~H§3Ï8ˆÑ’$ö,´Qh•€É‘º1ÿ¨LqÑPG§Yšª˜UЉtC¢'?¿‘:¥7¹ïjcŠýšHÒ)f3ÍŸ•r*D‹ýÔF0 3’„å£ä™&›Vnµ.uo$¼LâdzãÎ/òOô'ˆEµÑ¡ÞY$MrÖŽ¡Ò¬0ˆŠÒ,&•“kEÄäyŠãxSÌ‘ !p, LÑR\¯×g.ЭvqB¤ÑhÐl6‰¢ˆJ¥@«Õ¶mz“jøÊÊ Y–ÑëõʃGI)HKJJJJJJJ^)•z‹TA8 ÙÜÞ!I"lKP«U¸pñ ++mƒK+GhÏ-Î¥• ŽçÓ{þy|×£Z-æñÖ×שT*ÄÁ˜z­Bš¦œ:uŠñxÌÞÞ.sssäyN”ÆXÂ"I|áÏÄl%(iØØØ Ñh ”šDºÀÎ΋‹Ë¬¬¬Po6¹|ù2O>ýŽm„1F ®om#,›8Q$i„0`Ù>Y–¡TŽëú¤iŠ’Li‚0¦x(Š8Øß/D‹ïṂ àôéÓ<ÿ Ç ý~Ÿƒƒƒ™±-¥©Jq|èI÷©@3I¨Â çFåðƵ1¿Ù&¹ó5¯åÝ?ò£Ì-,sÐëó—<‰´=r$ÃÁZ¥^T¨³ LA) ¨b*žµÞEK­‘ct^8éRaÔL\ζŸ W1sÏ}iÜËÔ…y“©diŽWqg‘(–e¥ Ijȱ3 \ç3Ã*q“ÑÐô Œ°¡Ú䟼럲×= ÞœãλïfÆ;v‚,UiH’ˆ,‰È²”pp8’f9Ãá$IB9I¢(ÂóùEò\“fŠýýFÁ¸øâ︴ÛM*A!DÜf“ñh€RŠçž{–£G‚ÖÐjµ¨ú…{ïÔ…Š™Æíí]:W._buíO?ý4·ÝvW×·ÙÜܤ×볺ºÊp°¹¹…ày4†gŸ{·RÃñ*it1*'‰üJß²Æ!^­NŽq+¢$£ÕhÒŒ‡)B€çH†ƒ„7¿ùM! Ã¥Z ß«ríêŽWˆ.×ö0²¨ÒcPIŽ YJ¡m˶g­¬jâÚ*oú™‚0 ùž·¼…ÿî½ïãp4FiÁïü‡ßÛe4 ©Õ3æ—QiÆh4"‰b¤ÑHÒhÌ$;Sh1²˜ Õ 'ùšÖÆè[¦˜F™L[qÅDÈâ›fJ§Ñéí©ˆ”R¢ß÷É'Ï1JTÀrɳœ,S7Ĩ¹Q¥-„é¤+-‚7}ß÷ñüÅKÜq×Ý?vš½n—Ng‘á¨0r‹N§…% Z+Ò$â0¡ Câ8ÆS¸íCïàß÷†Iô ³9ÑÑh€ã84›M¤mãyyžãU*4 â8FkMš¦ÔëuÏ# ÃòàQR ÒW+apéÒ%¾ö—_akk«\’’’¿1–e±¼¼Ìßý=œ»í6|¿Z.JÉ«–Í —Y[;BÁöÆu\×¢^«0?ß!ËSº‡=Ïcgg8Ž‘Â&Ë2â$äÔñ5’$cinžÛ3‹^dooÆ%æôõ IDATÃaá@»×çž{߀Ááüù 4ç×øêW¿ÊwÞ_ë0¿TÌçI)ùü—¾Ìöî>‹Ë«$I:‰£iòð_ü%Q±Ûqùêõ"~Ei¤tÃIõÑ&‹2²-£:GX¤ÑD€IÒ(DHHãv»M¿_¸ìz¾ËÉ“'Çl^ß­ÔƒMeÄѯ⮵ƤRJlY´˜*rLš‚Ñ`Ù8j`8ÂeÙ`$™6dyŽtœ¢)ÞüÖwa{.ÿëo|”4Éép<„"‘ZM¬Âr$i¦0Ò€]K)]8Å"퉰4EUTk´Î1h¤1H@*…Ô94š"ZÅC, E¡×Õ ”,¶s £TS÷,’XQñ$I¦@Bá0ʶÐÚA —q¬±½q”ÒhÔèïïáy6)@ž#­Â(Év<I6õùEªí[;C„°¸xéëWv°,‹N§Ãòò*­N­sΞ=Ëx<¦Õ(Lµ<·Šã8,Î2f!ˤ´gŸ c iž‘Æ yžƒØÒ"S9hƒ°$F@¶ë ²”LåxŽËá _Å Æ*c_JJAúª$K667øÏ_øSþÑ÷¿“cÇŽ#¥,¦¤¤äo„Öšk|áO?ËÜü§N·Ë|ã’W-®íÐnµØÙÞm¨ú5Ž=B·»Çx ¥d<î’ç…[l’ ‰¢ˆÓ'³³¹ÅñãÇ9þ<•J…J¥Âp8,f;ÇXê+ v¶wñ|—…¥e”–X¶K®)éFø¾OšÆ¼éøâ¾ÄÜÜ•J‘1úÄO§Yá#ÒvŠ*#9R•Õi›è´2Wü;ÿæ¬H¡'ٖʼn©"çÓàº.¯ýëÙßßgww¿R!ŽSÆatËÜgžçßô½cZi4z’g騠4~ŦUoàÉaoB#¤…”=ÍÀ4Œ‚&„AZ8Ø"Á²0Ç™ˆF]™¢M)0ZNœs§Ù¢k2»931šU,‹j§4º·Za¤¾±v²ˆs1´0HQxY“ýŒSMÝ·Hs…c Ɖ¦Ýª‘æ^Me9™Xn•0Öhò êí9ÃX’d4õv“0£3E’¤^sŽLiR Ë­)¥4ƒÁ˲f3QÑ´©×ë\¼x‘ÅÅEFAÈJ£9©† â8Ř˲&FrÖU',‰gy“Vðbî6MSÔ¤r[C’$™´f× ‚`VMæœæQ^qv#¢fz ÏsÂ0äÔ™Ó¬¬¬°¶¶Vd¿Nrj§¢2Ë2ò<§R©à8ÎLtŠ—ÌñNoO×B)>@¥QÚ ±ŠÊ©ø®Ú “ˆ’’R¾êÐZ³½½Åê‘#åb”””¼bNœ<ÉÖÖfÙiQòªæÒ¥KضM–'t÷{tæZ?~’^x¾I™&I@kƒÀ"Mr\×¥Róiµh­¹ýöÛ ‚€ýýý™@œ››c8òÈ#çΣ^oòøãŸA©Œ0 iµÔj…¸ÍóœÁ`€e9\¿~Á 0¦1FÜÔ‚[8ÖNEñÝà&ƒfâpjÀó­½&¦ó…A¦)Ãápf|“Ä1›››h¥°gâ +g‚ø¥ST%Z ÛC9ËrfU)åd»¢Y@ …ë»…ólªfÆGÒ)"mFy>‹_ÑZ£óœ<Ï'¾I!°fD…¨úVû<•”·¾~5u>’Vá|“ã­1Eæ¨DbÛ† ÖxŽM¬$¸U†aÂÒÚQZo~Û[xݾ׫a´D ¯ZcÔê¾ñäcüÙ—¿ÄÓO?Žc JQ8Ù8Àjt°FkézŒ‚1Êòf¦VJ)ÆãqÑÒhpÛm·E¶ÍÞÞµZí–ùd,«¨ï&I‚mÛ³}šíûÄíwz=ƒBÌ|¤,¶s­5£Ñh¶]II)H_¥Lÿ(””””¼RŠØU.DÉ«š(‰Y\\¤ÙnÐhušh ƒQ0Õ|8®e»¤¹Â`Óh´ÈUÌA¯?sÑ ¢V§Cš¦\¾²Îý÷ßã¹ììî“$ GÖbÂ0D©"2 CŒ14›M²,Jzè³LŠvHYÌGê i&<§Aå·VÑ”Rý×ÿ¿.Œm4ý~Ÿ……’$ŠêšeÛ¨I¥T1«šš›ao®ŒNs;‘48¶K–åôz‡Ø¶U8ÒP*#7i[h£ÁTk>y®1BNžK£08އ_­Gc”*¢Ktž¡&¹£S8øJQ´ =sÕµnXµb31ÿÕa@š[µ¦¡Zk“HPnÚ?J, ~¥F/0HßçØÙs|Ï[¿ûßðzšíQœŒRlÛ¥»·I½Ñd0±°0Ïɳ·s×=÷qáâóüçÏ}–G¾öÕâEÕ}”……j&I–#],Ó¸®;›/ît:Ü}÷ÝÜu×]Œ‚1PT±§Y¡Åç(›UµµÖ$IRdž¾ä»ãôó2}³,›µôN#b ¨I’ÏKÁ8ÍÚ}KJJAZRRRRRRRò yàxúé§Â0†X–Åîî6–´HS…°´´@£ÑÀs+,-U8rdAεu²,£ÓéP­VI’”«W¯"eáN;©×š\¸p¹¹9<Ï#MS’$c<ÏÜK1\½zÛž´ææ“Ê£”è\Í„èÍ󜅷ÎÞRA5ßr¿…ø¾ã8ÌÏÏóì³ÏΪ­öÄÕ_L*›3Wÿ© žˆ™›Eê”$‘šˆo…eÉYÛo^)1Z€) —a)Û¥ªØ/!%žç'!Zk²,EMc-!'¹ !&k4ÅE+ót Š9Òi< ¨bnTQµP…âœÔN‹ é¤ú<Ùg)‹Lß÷é‡XÕ%j­EÞø½oážû@[ÛûC<¯B†$Ñ€ç¿ñ<~­JµÖà±ÇŸäÁ·}݃CŽ;Éÿ³?ÇíwßÃïÿþï£â¿ÝÀ­Ö°]-©ÒÌÏÏS¯×9rägΜaqq‘0 ¹víC½^ŸUÍ¥”DQ„ã8ÄqŒ˲ˆãxVÉÌo:Á0½L«¡Ó“7WK-K ¥$I ó£,+N¤L7ŽãòàQR Ò’¿ß¬­­±¹¹Y.DIIIIÉßk¾þÄã ªµ Q”°pHš(ßÇr,¤´‰Å~·ham¶:ìu8º¶ˆíø<þÄ“Üÿš× ¥ÀqlNŸ>…Öš“'OqáÂÏeåÈ*­V‹^¯ÇëßðZ¾ô¥‡±ØÚÚ"Iêõ:[[[ìîuI…ç»H’xb66Ó–!&¦RrÇwEãñ˜á`Lš¦H˺e¦ôå˜Æxc 1zÓ|¡=©ÀæyþMâóæë‚TaÙ% YTqý*qƒí"”m6Âò1*l<¿M¢!NÓ";sRyËTQ±õ<+Ò8#Kc@cÛ6RØ BÚH$FÕd£s”*¢^…øZÉ1J!&åg! ¹Ñ Âhlm¡t±ÌÓʸFOw£ ‰bçæé« 'ÏÝÍàÿeïÍ‚$»îóÎß9箹־tõ‚ÐØHˆ š’LQ"Hi‚òh¡B”FR„åq˜²ÖpÅ™óg9wÏJk¸zý"͘N>ýÌç(+MmßüÈïóØ7<ÂÕ›„aÀ«_ÿ-¼æõ—þê ãiR  Ìçn|{:œ.ÝÎñxÌþþ>I’¸QZ)ØØØ`4±¶¶†1†N§C·Ûe:²¶¶ÆÚÚÚòöeY",w9¢‹ß«ªÿ^£æY–‘eóe—j’$ÄqŒ±ÏóHÓ”v»M’$Í‹GC#H¡ÙÐÐÐÐÐðÕ’Ìç(ß'ËKðYQ"‚mAHE™H`ª?Ž©Œ¦¿ºÂh2#nù¤iÊþþ>ëëkœ ŽÉ‹”µµ5ŽŽn‘çxá…+œ9wž½]T=/ÚétXYYa0ðÉO=]»]Ε,ŠÊéÏZœIa1Ú¹tJ)‚À‰ˆçŸ!„íô£-~P·“³¿4ÀfñYkÍ`0`0 Ꟶ, ä—sGjï2µuy™Aë á­ (ŸÒhð¨ VJÚHåc5 B:.é¼Âxƒ®Æ=f±tC¥°”¶bQ0Z™/[Ý‘.lÜãRBb„[ÆÜa;GÖ3_‚Àíq ,RBi\uËb?UXuרÐH•†ñxH{{_yL§Sö6¶ÁÁþ!{;›t»]^<ºÅ×hÇ!£iÆd2¡,s>ög}}•ÝÝm>ù ¸Eom+$ÓÉ”“Ó!“Éc`6rµAív›ápHUUh­ˆô=Æã1ív{)&ó<'Ö××)Šb)•R(!™Ïçôz=NNNhµZtâyž3N‘ &“ɲï¾EL§SÒ,ccm•£££åÉ‚8Ž9AóâÑðò¤ë›ÿÅëNŽ/{‘øÀð'ò'wE¼[kyÓ›ÞÄóÏ?ÿ5‘mhhhhøÛÄÂJ o$„@I-*Š¢€zïÎó\àŽ®óùŒn·ËÚÚ*>x‰£•ø‡ÿ™V«EߺÑÇÑxÈÇ¥K—ðWn 8::Æó<æ“Ùrÿ3I’¥X4Æ`kq𦮖guuu~¤µs2ó<_ŠÐyýýUU†.,IZW!0›Í‚`„¤µf8âyW®\¡Óé°¹¹É•+WH’„V«Åh4j^<¾æüßL>9,?^êë—;qóGôGw]öÑ~Ôíf4444444¼$¶2X½¨ ‘HÂJ0]U¥À'%ðk«+ø¾OY–ÜsÏ=DQÄd<&ô|}äýNk5N‹••¶w¶÷æcyÕ«¾ 899á`ÿy^º#áa…é9wT:¡ekgÔó<·Ç'!}”'1Z“gy–¹ýQá’d=_ÞU}ÂBëk)Pït_qÝ+"Ý^¦PøÝ6Ï]äáG#huI³ŠÓá”áhÆdš2™Í)‹¼bªw=Må>´A '¾ç-Sc©4¶Ì85ÕÒ]Ð…@!n‹ÏZˆbÜíd¶kÐXá§Ü¸VÖbÕ¢­¡6§]ýŒ5h]Re^L§Ü:8 * ÒdV‡-:P5U™cÊŠ2ËÉæsfã §ƒcníßâé§?ƒÕðüóW¸zõ:¯~Õkø¦×3JxL&™ÍfTUE’$TUÅÊÊ ív›n·»¬êv»DQĹ çÉËby»0 —Âòôô”¢(8c+íò”ÚmÐët)ó‚ù,¡*JnîÓïvÖ‡yš1Žð•‡5ódêžë††—› ý/‘ç9ÿË»ÞÅ=ïåž‹÷ò®wý¯Ë¤¸ÇÏ=÷Üò¶¿ò+¿²ü÷sÏ=Çã¿pîë‡þãä±W¿†Ý3|Û·½‰g>󙯫çáÿãÌ?øÁ».ûà?ÈÿøßuÙÞÞÞ—}ï—íííñË¿ü˼þõ¯çÂ… |Çw|Ï>ûìKÞ¶ª*Þóž÷ðè£òðÃóþøë~ÿk÷ÓÐÐÐÐÐð7 !\ØÎbœUJ)|߉¿¢ÌѦÂó<|ß'n…ùÉO’LgLFcŽŽŽˆÃˆoý–7²»»Ëææ&›››lllEyž3›Í–“ 1*„XŽézµpŸN§h­ Ãk-[[[cØÚÚZö™^»v$I˜Ïçt:”REÁvÝ·[Ų–èòåËËdÞ“““¥+ßÐÐRà_þËÅáÁ!ÿ‹?ç/þü)nܼÁ¿úWïà‰'žàÉ?û3Àüä?ûçÌf.*ûOŸ|’'ÞüæåýüéŸþ)¿÷ýŸ|ñÊeþÞßû{¼ë]__EñßùßÉññ1ÿøÇø³?û3†Ã!o}ë[ÿÊ÷õä“Oò‘|„Ï}îs¼õ­oåÝï~÷KÞîø_øÂøƒ?øžzê)¾¢ûihhhhhøëÂW¾ô݇RxR"­`a‹yBâKEèùHkÈ’GûÌfø“?ùNNNøô§?M·ÓBXK; ÙÚv"âää„Ïþs<óÌÓEIQfupLÆd2£ÕŠ\min»RÔoÍnðº4YA†AÀ}÷ßËúú*N U ¥Ö˜;ê;îPWwÔ¶|í…©DF¨eév,»>qÜÆIž—+¨Jç¤Î¦“ ³é”,™skÿ€+_¸Âå/\aÿú NNNxÓ›ÞÄã?N§ÓAJÉ™3g¸téçÏŸgss“µµ5º]×cÛjµˆã˜²,ñ¾ç{߯{ßûžxâM|ø7~ƒýûŸ_ÿð‡‰Âßú­ßæ‡ø‡xòÉ'yûÛß¾¼Ÿ÷ÿë½<ƒùÎwþ8ÿæøú:£ %ïxÇ;øà?ȇ>ô!~é—~‰û±ûŠz¢Þ÷¾÷±²²À;ÞñþÝ¿ûw/y»_ÿõ_ç×~íרÝÝà=ïyÏWt? ],¤ÅÿK#]PŒR^½“ç*H<ßMf=ýÌ'ð}Ÿ"/ù»ÿ÷±³¹A¯Ûf22›ŒÑUN¯·Îk_ý*^÷º×ñûðQ>óìç°†Ã!·÷ÙjE¤iÂâæ•^î;bêŠ2ŒxìÑÇØÚÚ"Ë2ž|òcEÁh4b:.]Óå{¥–‰ª‹ÏöŽ÷ ‘ûµ£B„õ0©¯ÃÞùû±HŽ YY"<·¿èiW£³p,5%ˆ _XŠbs øà(év&Kc0U‰Ä ið„¤¢cV`¥ÀÚÅû;C˜GijáiJºÄ]ëT#¬ P¤ÈÅI!\Œ#ÓÜ"”Ä¢(ç§Ã1}0M³åÞf·ßãxô¡}E÷³‘ÿ­çâèèˆóçÏÕ÷ÓÐÐÐÐÐð×…F`êqÎÚ“s;ÖbÊéû¨À§²+aÜÆUQà—Ÿÿ"Þw/ÝVŒÎs|¡ØÞÜa8E1›ÛžO§Õ¦( ._¾Ì­£cNO§nMT ´®°6XŠ;W×yÛÅlG1ý^0œÏŠåX¦çyXëú$­1.ÔHÜý2‰Z&Ϻ ¾dÐÊúª:àÉÖ52õ÷Xáîà åú@…ÀÊöê½Þ&ýÞ:K«Ó§¨JÊBS™’¢ÌÉó”²t‚ÔÕ²8‘¬<‰¶¸(Ûª@ËÊm‚ZP‹"k–ݬԡCîX„Û5LY rw¸®]וc5xØzäÙýt´X¡±H¬ôêÇZ(¬0©@IDØ+±Äàùé! ôWÖ‚ v`q'"jÅ$Ó1ž/AƒÖÕò8ª:8˲e¬ïǤÉÔUÓHËÑÑ!Ãã÷Y_Ygmsƒ,™/§Ñâ8v¡•&ÏsÒùœþê 'ÃSâ0Bá’rÓa¡×î0OgxÒg:ãy£“S¢(`gg‡étÊàøˆV«åÄ©µDQ´¬ oÙWºøÜÐÐÒšÍÍM®]»ÆÅ‹¸zõêÒ-m·Û\¸pßþíE1ßñíßÎûßÿoø½ßû=î¹çž¿u?AðþÁ?à'~â'x÷»ßý’‘Ü‹©8ŽúLíWÈÖÖ×®]ãÞ{ïmþ jhhhhøº¤U»Jóù å Dà.@;·Q±‹EYR”ßWŒFc67v9><`ku‹_ýÕÿƒïxË·££ÝòØ/¤k ÆZ„0îøês¯°¦¢,4“±KÀµ¦¢,Sæå ‰d{w›ýk×Y]_cme•ãÓz½£Ñ¨vñ{{{ÌgJ]0N™ AElon‘§sº6½^‡ÃÃ)Ê—h]qr4påù/^¦Õj±¾¹¹tQg³~Òîv)Š‚Ã£câ8&I’¥ønhhiÍÛÞö½üÔOý4¿ø‹Îíüç?õS|ß÷½myý›ßü?ó/þ?ñOþ oÿþïçÝ?ùÏø‡ÿðþ[ù‹|ç;ßÉ;ßùÎÿâõ<òÿþßÿ{ÞñŽw0ùÙŸýÙ¯øg½ýíoçg~ægøÀ>@»Ýæç~îç¾ll·¡¡¡¡¡áo2n„Õ9m(ëRmÊÎS·G-ëžP­ëë¬Á÷Zìîîâ Ƀ—àèpŸ<Í8=>F>§Ã!³<_V¦mllpnï,kkܸþ;A@’äxõeQTXã’e5 «Š   —ì:¯ƒk„pÎhQï2.ÁÖZ´uÂT©E®ç\D¬«A‘õ㲆²\Œ`J¼°Ee4h7ºi„%PãAQ0†¸»Îù{.±¾±MVYÆÓŒ^»CUd¬¯®Ñ_éúžÛ•=vb¦ßnÁ¸$K\]‰T’nÜ%-g¨Z¨E­÷E <ªªXî¼.ZW¬µO¹täÅn¬± 4Öh|ÏÃXÑ%J Œ-±TàáVt#Œ1¥&ˆbºë[\¼ï~66w0Hü be}k7÷9Ø¿EÐHç•1` /݉€Às¸,K¦Ó„ÖhìRq‹Œ0 ÀR—`'4nŸX8½NhŠ"§, ÒtŽP®KÕó<Ô‘¬Çf+泄4MYí¯Pd9Q°|æégèõz¥ˆã˜N«ÍÑÑCoÈ`0ÀTÃá)Bª¢d>Ÿ³Òë1Né}vwwÇìïïc­eccƒù|Îúú:ãñ˜8ŽéÖU6QáyÞ2“¥¡ákúzüõzà?óÓ?ÍæÖ&¯}üu¼öñ×ÖÞ IDAT±³³ÃOÿÔO-¯â‰' ¼­©ß÷}oãèèˆ'žxâeù‹~ÿûßÏïÿþïóÐCñ=ßó=¼á oøŠïëŸþÓÊ¥K—xË[ÞÂ7~ã7¾d‚oCCCCCÃßd<)PB"¹ýYâŠ'¥®RD ¤S•õ>£ ît‰‘$K <Ïí8vúmz½.Ê“|ñ‹—¹|ù2×®Ýâ¹çž#có™gR0 ©ª’<Ï Ž8‘¥s®½ø§8:<`kc8 ÁXŽÜJ[ÇL“„Õõu†ã1yž“ç9kkkììì µfuuu™¦kŒAÕ{É‹çaÑßÛÐð5}=þz:Ø;»G£(â~þçù…Ÿÿù—¼í£¯|%·o§¿nllÜõõ—Þßí²¿©,μþ÷\ÿÊW¾’~ô£w]ÿ#?ò#ÿÕûºó²;ÿíyï}ï{yï{ßûßuLÿ­ãlhhhhhøÿ›…[·Snåâß0i Áh„5xRÐíô±hâ8"MS´.‰â€‹/¦ ±/èv»dY†çyıa2™‘åÝnõµMnÝ,…h»ÝfždKa"ëÚk-÷Þ{/·Ž¸qãEQÇ!UU!¤Kr½kzRÜv>¥p#´F;Ñ&¥F¿9²hS¢«<µõ\¯µÚõpZ°¤ôœKŠ@ EÆÄ­ëëÛ´££É Sid(\WhbLEž&XmPJÐëtI“(!Xíöè·;¤«%i>çú­«dÉœ²,ñ¥ÂâeµŠ[uûŸF)k+|,fñû¶ݵÈZˆ %]Ú.`¥ Œ:”Fcµdïþ‡xã¿ÇœR[6ΜåppB–—L&3žþÌg¹zõAÔf8NðȪЮ ¨þXìY‚ËÔ¨ªŠ³gw˜LG¬®õ‘R.kRx‰TãEµÐ2`èŽÏàœâEQ”eIžçt»]’$A)ÅÕ«WÙÚÚ¢Óé¸c±šÁá¾çqzZÐï®0<9¥ÛínÍ­,Kªª"Š¢e¯µ–íímò<'IÚí6¾ï³±±A’$Kñéû>yîÒ„ïÌ ihxY Ò††††††††¯Öj'î„@g)ZŒKpu·p{˜VƒÕHa‘Êc<E[[LfcÂÖE†Ã”ݳÛììmQ­ÓN§ÓŠ0RLÇ)‡ƒcâ äd8bck“ÑpBÜj‘$)ÊóëŸg±F"…GY–<õÔS Ým” Ës·â‰^öu.wHïtJ‘Î1¬g]…’uè‘&Œ"ʲtbÃM-³¦åc$Où(?&M3î¹ÿQØ&Ë |é#ÏÚÖŽ«/¾ò°Ò"¬F—%­(d<-Åœçyø´œÙÞa2s:¢Ë )(t…P« µ•AH‰XiV8×RJWG"$q䜪ËW®òÈÃ0iw[tWW¸zã*?ò(e¯xÅ£œ>ùçd©FzŠkWopõêu”D{í<ó©§ñü€ª,]-‰xO«ÕBë’Ñd BFYVÜe¸-vZ¥wÛa[ˆkAàzNŽ£RŠ0ŠHçn U*7²[äurª„¼(†• m A¨»Â[¾ó¤EÉh𣄤È]7¥h[!èÒ… k}Ï“¤ó”N9qV‡DÒy ‘Z›´‚Áà“É)%í0¢ª Œ]§ë\E­ ᙄ@Q'ç–  Â‚'ATÜ¥2Š~Œ·|×ÿHgí •TíUÒBóÇÿÏS\¹ü½^Ÿ£Á EQQUaÐÅZKžS¢ËÜ¥ì~Éøs‘¥tÛ-Ò4¥(3Â0¬ÿ^Tí@J„¸;™Vá¦äínØ…«*¥@Jƒ5¾'ñ”`6u'@²4áúµY]]E)Át2¢ßïrz2`}}•dãøø˜ÓÓSÂ0d<žÖé·)Y~KË]ôŒÊå×išR–%ív›^¯G–Í]0Oàêfö÷o µ%<ª¢ªCo HE¼²Á…‹—8á^æ…Fz¥N)t‰Õm4ešPÌ*¤‚N+Æ÷<$W9yî\ÑélæŸç¡¼« E•#j]ÖiµÉ;]’éŒ2϶ڪv{­YîÄ*«œ[*  °¢ªÝG@ùnÌW(@à-ü°Íù‹÷RäIšÑï¯2šÌ8>>åÏŸú8»»» ¢0ÆWÎAÖ y%ºÞ¹µueËÂrñ{KÓ”íMF£áÒ…t#»·o·`á˜..6µ«ë®Ö0Rw¤CU\•eÉöö6“ÉÏóR.;GgÓ1eQpzzÊÎηnÝ¢,KööÖèöVÇìnlq||Ìt:eu}²,9þ<Ƙåþëöö6Y–±µµÅt:%I’»va•Rôz½æÅ£¡¤/W”RÍ"yCCÃׄÅè\CÃË!,R‰åž¤­*ªzwi)ËŠÅ’fa5é9± +ƒÖ–[·ŽyèþûP*D]A+î àÂ…>/ÞÇxü4º,èu6ÑeNÔm3<ÐŽbÎÛãÊ•–Ù%îf%H)O†ììì°sf‡yUU‘ç9ׯ_'Žcæó9iš.…B·Û­Cw$³ÙŒn¯MAÀµk/Òí¶ÑºDkÍÊÊ ZkÞüæoçóŸÿ<ôWVÉŠœÕõm’B²wþ>vÏœc0Q•$sf“):Ï)³%%QàÅ!A rAšº}Î@yøž¢(r„° ¡Ô%¥ÑnÔV€-5B)å±±¶†¯ƒÁ€Ét‚‡‡ßóð<7¬µ¦Ò%±ß¢ÐÏó±¶Äkµ¨²9ø>n™6äÂ=9»w/¯ÿ;oäÚþN—Ð÷)37Jû‘ßü-úÝ.Óñ$Ÿ'X+XLU`k§×”U½¯j”G î~ë<›ÍØØ\c:žÐŠbJ]aÜòní–ºcwU-b9.½¨P¹­.\JøÆ:ªµfccƒñxLY–îo¶>™ày²vaÝèùÆÆ‡‡‡D‘s£ƒ MS†£ kkkŒF£¥Ë©µ¦Ýn“$.½÷âÅ‹‘eÆæó9ÖZÖÖÖê¿É‚ÉdÂd2a{{»yñhhéËõ,îîîö÷9wþ|ó„444|U\}ñEΜÙkNr5¼¬Yé»à¡,Ëȳ êäS£.ñÇ"‚`1YIe467(¿…°–ù|ŽRŠ ˆŽÈ³’ÍmnqvïBÄQ@;Ž0XÂ@at‰§Óñˆ[ÊãèÖAívêÚ™ÔËñM„¡( NNN ËݽV«E»Ý¦( ªªZ†Þh­ÇEAàGEÁptBEõ¦ëÌìõz èvû”¥æþûàÌ™³\»qUirm¸ïÁ‡ Â6£é„ñxB–V$IBžf„Jâù®u6Ÿ"Š ¡ ZAH…øJb€ñ‰OeóyFQtÛÝå.V /Ù¹¹p<]m‹% C¢(@JתtA·Ûe\N0ÂU»Üó½}‹×ßEÕÐâþò<§ÕŽ8==¥×ë1—!Y‹“ eYR–Æíãú>A2Ÿ³½½M·‘uR–—ËÔÂx\dŒa<±¶¶¶<¦$IX__§(ÜHïq]Ûã×õD­V‹,Ëš†F¾ñý€7|ë·ò{¿ûŸè¯ô¹ÿÒ»ÑÐÐðWFkÍåç¿Ào|ø×øþ·ÿ E‘7OJÃËI‰¯ Ö«%%[YÐá{X£±Y†vïÖAI‰K2•GGG¤É”~•NË ‡étŠÖ–­uFgw¹vóe:#f$"£×‘B³ºÒc>?DPƒ ðÂŒqniJ‘e‹"Nâv›^§³¬!ÉsçøéÒÕtTº¢ß÷‘¾Ç|>ÃI’ÅI–D-vΜ ÏKnÜbeeãã!YnXßÚb–¤”…æhpƒÑ$¡È+ªÊàû!»Û¬ô»tâ)eUñâõ•KqÕÊ¥ó:GÖ××o§Ko¹3©˜²pÏgýø=©hµZDQÄk^ý8ÓdF’L™N¦Ó1³4£šÏ@xÚª"$ßñÖïæ›¿å (éc ŸŒX]Ýdp|ºº¬(òœ/^¹‚ŒvñOE±eBÔªÑX¬©î£Ò‚0.ÙB2O±Ört²¶¶J–et{íe×(è;öz-ÖJÜ8õí}ßE Ö‰Ô0Y]Û cÂ0tɺžG^´ÚѲ¿T)'€£(r=¶Ö„1Bz©‘Ê'I&lnvH ÷7âû>Ýn!ÜHr«Õ" CNOO—£ÄƘåžh»Ý¦Ýn“¦©; ËäÞ††F¾Ìà ç/ð]ßý½üÞïþ'ÐZ7OLCCÃ_ ¥»;»|×w/÷Þw?éBTHeñ#…”«J1)<òª¤HËZ½J„)$e•¸PŸÒróÚuö¶7ÙÚXáÖÁ>ÝNk5Óɘk×®ñ…ç/3OÙ\ïråÅ#|ÏUmó”"Kyåáµææþ¡K¼­]DƒsËÿÝzA°¬ÑZs||¼<É„µÈ;ªH¤R¤iŠK7¯Õj±¾±JQ¼ð €$Š"Ö×7±¦;åÌÞy*qÀ…‹29N˜M¦m]*®.ØØÜàž³»¾sæ¤táJk›N §sת\ðÆ"#ÐÖ" F<á\«¢¤2nôÔàÜD©ý~ŸÕÕuÊÚ<<ºÅxQ+"|Þ Q«ƒ(¤ï±o’$ e™Óétð}ßÕû"„äáGïc8.îÚÆƒ£úý>÷ÜsYæ’€=Ï#ÏóåÈz§ÓY:íÆªªÂ÷ýåi¿ßg0 ê“ }²8ëV–Eód444444| U†À¢‹Š~;¤wï9Î=C–yYðÂÕkœ O™N§U…5°Ò™g9—¯|Žƒë/b©X[[ãé§?E¯Óbx: ÓmÇ!Ãá a(ˆâˆngÝÕŠXÃÎÖ6Y^rmÿÑxÊõƒ#ò¢Ä·)H#1ªvÓj‘)*½4¡ïß%r„t5.ÊóÈò9Ê÷ñý­­-¤”lnnâyûû‡DQH–e ‡cν—Gy”²2Ü:1Ÿ$„A@>›£óKÅÞö9¶WWð<£KÀ¢ 0VPVŸ:L¨t­ÆZNzÂÕÐ8±ã¿5NÔEÄV ±èÅΦu}£EQb¬ ²Bz !I:g6Ï(µ l÷ÐFµzìïó±ý.ÇÇÇ$óJ ºÝ.I–2<c´â„ i–£¦Ò. ·(+®Bƺ ÷5u/íRLß- DB¦£1gÎìRUý•.žçy®1¦Z ½å~0 åíQÞÅn­{ŒÏó™Ng¬®® ”bss!''¤”xžs̉ʫ››TÚÐêtÉŠrn¥„`§>.O*ZTU¥èu:ËŸ$É2ìn±kÛëõˆã˜££#†Ã!a2 \hVCC#H¾:Ò<ÃZëÆDµ@x>¾°h¯¢,5½(à±G¢ª**­B!<7R9ÏR<+ØÝÝ£ÈrFÃzè!fã q+ ,sæÉ¥|VWûL§ ÂJÖ××9=Ò_[ç×~õÃ̲Œ~„ðDRa-¬°x€¯'ò´A'$~ PR` µkjn‹«ž Š=BO²¹Þg<’%ct™Ójµgä³ü€ë‡øÒgÿÖ!~€­(òŠ<ÒmµÀövw¨Š a}¼ €¥P´øžÂX–6b!â„@Z0Â"¬\V xH´²¨z<µ²`¬Å ÒCH‰•Š4ÍÑV#…G§ßekk‹Õõ ÒjNQÌ’¬`4™Ñ›LùÃ?üC´Ö®ªD Ò$ÁÆ!yVÒjµ˜&3ŒqÇG-Æã1aºÝNYW¸Ö_fäöAï¬p±Ö9ÒAÀ‹/¾Èöö6eYÐiµ(Ò5_Vé;NÔõ5Êâ±F"•s¹•/ Ÿv»…R’0 —#¼àö7•ò1¦"ŽcŠ¢XºæÁµk×°Ö²½¹Él6CJÉètX `ÉÖÆÆrǹÕjaµÆ Cªª¢ÝnSæ9–Btggg¬d°¬ôûL“YóâÑÐÒ††††††††¯–¤´ÌÓ½^CA:Fq ˆ|ï ¦ÉÌEÎXð” ôC4†¾ßA(‰Îf°¾¶AV¤Œ’)*X£¬Uåqzœ’§’G_ñ F“ÓIÂêê&É,áÍo~3W®\áðÖ¾-ñ(‘ø¾çÜ-%(ŒbžÏ‰CE’”¬­õȲŒ²,0‚ÀGE^ày¢õ´()J“çsNn]EÍé䄵Í=NŽÇX¡hml²¾¹‹V>§§'UŠ$'ONjád˜Ì‡<òàÃh[¡ÂVJjÇYWæhÀíU']¢.F¢ë>M‰Åh³uuO©¹]¹£<*)) èJc„%¯,aóš×þV×ט¥svvwAh¢(âw~çwè÷WØÚÜäÚµ/2K†”¥kÐ¥!}â8m)´qn®qiÆU¡ âª,Qžü’‘ZÀZ¬¨óo­Ä ò½å´s= ÆXÒ4eww›élBèûžGdH ^ (*[÷Ü:g´( '„1H%Á üÀC I¥Kt® Ÿv·M–§ÄqLÜj¡µÆóCfIJ»Ý¥(KüÀ¥Þ–YA¿ß§ÇLÇ“Ú9–ëx8b6›±²²âº`³a³ÙŒ3{-tYa$©û¹§§§¬m¬µb*kœÓ]iFvAÚÐÐÐÐÐÐÐðUÓꮂ HÓ‚ÙlL+ H’„ÐSdiê„” ˆ£6•…,Í)Ó9¾A@YUÄÝ—.݇Zk^ùè£Ü<äsÏ=Ë¥{îÇóc²TsùÊu‚Ð'Í2мb–LR²··çœÕtŠ(z½.a’¦ …®h÷w¸ysŸÁà„gŸ}–Ùl†ÀŠªÒlo­†!“ñÌí*…Á2JFtÛ]:+tCÁá!½î:Ù|Æ#ý‰ObME;ɦ'èjŽBHBߣՊâÀ¹‡Ây…V€5Ö9£uJ.TÎÍÅ9ŒBÔß” ‡Ð,D©^î9Z Ó%¥–T(Ê *]ñÍßüFòE´×ÖèÛ)™NNA¹]Ï“áÁÉ ÇÇÇ(OP„EH‹”‹ÝMq÷/^˜Ú¦”w…Ùz¯uáäš;Ft]îÝ5Y‹¤étÊ`0`cs7n°µµÅp8D*ç+”'—©ÃaŸ²*ð<(j/Çu=ÏCàЏÅ®‡4Š¢eg©Öšn·ëB“’9AÒnwð•‡Õn÷SJ‰)ÝXí­ñ«««®¨¬è÷ûËê–v»Mè¬ôúcHf3æó„3»L&¬dYÆéñ HAÔv®²Lšü†F64444444|Õä…DŠß 0Õ„JJªR`´¡ß_£ª*¦“„ª4ϧ,ÝÈf¨’yFØî0O±R <ŸK>@–e<ó̳¬¬¬ñÇüÇÜÿý\8w4M1¢B›Š*+е£~ì±Ç¸58¤(ròªÄI»Ý%K.œ?Gàù¬ôº¼øâ‹L&.\¸Èùóçi…ZkªÊEBò<%h‡ìß$Ÿ²µ¶ÊüÜ67Ïq:Í™å0+,Ç79Oh‡EZ0=SU©sq®^+Ž] R Œ@ îfµ¬ÅÔbMJ‰¨ˆ¤p‚OI¹tFû“Uå*j¬hc)+K¡’‹‡€”dYÁÚÆ&E–tûºÝ.³É”ù|Nš¦T¹ %’ÂÃZ7†-P(é#…H÷˜ìí>PiõRXZ·Àº|lÖš»„ç »  n\:Š":I’Ðjµ(Ë’^¯W‡¹ŽØeRÝçén}Z­ÖògøµÃ½Ÿ‹ ­Ýß^Yº~ÐÃÃC.\¸Àáá!Q#q'I‚ @JÉ8I0ÆÐé¶B,«[†ãÑrÜ÷ðpŸ•Þ*yža­A)‰ç¹ª ªÌ•.ê`*ƒ)=¤5”YÚ¼x44‚´¡¡¡¡¡¡¡á«å?ÿñÇñ}Ÿ{Îeee lÉj¯¦ (2E™¢¤B#âv™ÎÉÊ‚ýÃ[TUŽ÷=ÈÉÉ3{8{á>NGCnî?ÇÉ鈿óøë˜ŽÇ<{pÀ¹3ç8z>£Éˆµõ5|ßçôô¥{çÎ’ç9Ï=÷÷]ºŸ8Ž‘ÒãôtÄd2! bÆÃÒ4ammƒ«UIž—tâã¢ÄêŠ0„H,­(¦ÓéP9&Ï Nð‚ˆ•Õ ï M IDATŒß&¯,Ç'Cn NFcñ=ÐõîåBhÙZ¨Ýh·ƒ~$uOg}€¥s*ê]I!Ø;Fa¿d4ÖZ‹’JkÊJc…D ‰R.8 ãe÷eÔnqãÆ þòÓŸäóŸi ÂhçŠÖ©µBÂ0$O³¥¹pcé¶w²L̵öËþ.n»¨â®ÝÒ;¯Â]V¾ï/Pc Y–QUÎ…ŒãxùýÝnc žç‘Ö;š ×tñX©ŸC)år\·¬+¤”´[!7oÞd>Ÿc­uADõ(pžçœžž`­uû¤í6I=^»ººJzn”غcIÓO)æó¹%ÂP,+_´ÖH)9::raTJ1O’/Knhhéˈy’pùòežúØ“ìïï7OHCCÃ_¥ÛÛÛ|ã7}3—x€(j5OJÃË÷ §È ƒ? P¾2" =ŠQÉh<åéÏ2Ï 'ã1Ú·›§”e†Â „pœ€µ!ýe÷©Û¯´N}*V ­k°‹ÅKkëÓÛ£½ËX)o Qc\õ‹µh\Âmi,^uº„Q‹¬¨‡DQ‹ç¿øù—ÁédD«Õ¢å)¬•xõñù*àÿeï̓%ËîúÎÏ9ç.¹g¾µêÕ«µ«Ô rK­îÖ†‚AŒ=¶ÑXx°#€ˆÐBØŒmÄÂH`áÁ3Cà‘ÃŒÂl3ò? Xì2c¶$ ©[Ýê¦Kݵ½}Ëý®çœùãܼ/ß«jIÐ"¢î·"#_.wÉ›Yù½ßïïûÕ™q$>¬„ÎCUrN!Ü )ì z<'jp“¢ªØORÜe×½žYǪ³Ñf²vî•ܹs‡ååe&…e6MÓÕ*žç1™L¨ÕjÇ„»Vãèè¨ ‰Ž¨ú¾Ožçôz=7׆®FÁ™3g˜L&\¸p­­-ƒQ“$1a2™LÜçu¡ËþÞ{û;å:ÃÉš¦)GG´ÛnvYJÉÎŽSBUÂ4ì»ãn ¤qR‰"*Bz¿"KnoÜæwç?ó7þÛ¿É… ï:ÛW¡B… _ Ænß¾Åïüçßbqi™+ôª~ã ÷-ή-2+0yÂöö&BX”'Y\\dqq‘ .±»»KžçPo´Ù;3r'„K–R"qꧦPC˜9Ž2¯8žì÷<þ{vEA«Ãââ"^pçΆ£ Ú šµyš¡uꈮt6Ú<ÏJ°ÓÎ.`O¨»3bZv‹Î]æ÷õ^$ë^ÊééÒf³Yî‡Ö®Ê¦ÑhÐl6‡ ‡Ci6›¥BÚjµØÛÛ+וç9ÖZ¦SGƒ (‰ç‚S;}I–elooÓëõ¨Õ\€Òîî.ZkΟ?O0(×Ûžç¡uVÉ8ŽI’ß÷©7BŒN\õN±œ#áîïF­^&ƒË3™)¦*T„ô>ÅìÌ\… *¼\(¥JÅ¢B…û÷ÿAÆàp‹ñ”k\ ››wh4Zôz=–––ùÌgžBÁÙ3çƃ!Q2e0qþÂ#,..²»µÍàðˆ$Ih4,¯¬ðÑ~”Ç{ŒƒCj­6ÿïo„Çœ4Ý¡V h¶ôzvv¶YXìÊ¡DkSªiaPgýÜÆÓ £ÑéI<© '4š567¶iwš,v{d&#Os¢èß«Sâ,ExuÚÍ.±†ýæÓ1äd˜ÌÍó®¢WTJ‰5šv§éê?ò…À—žk­páF3R*ÊH¬8îöT¸êk­›Ð,I#'fIC!è÷û ¶¶O,’õõ di Ú ŒA¿ƒŒ¶¤IL.]E‰R Ïû‚”Xu<êH–ÛŽÄxÊͶZס pJ©ž ÏJQÑùÚÏ‘NŽIîŒ°Îæ;ÃÐ…OΪ^„t»]’$a2™œHMVJ1 ÃÏóÇA@¿ßwéËGG˜‚.//Ç1Fƒ$IØÛÛÁ’4Š ‚€V½Áp8äÖ­[h­u»Ý&M"<%H¦nÿò$%K"öv¨n»ƒ#gÉMÒ˜<ÓeÏL~ÞÞÝÁ÷]È”6†,Ó˜4«,»*BZ¡B… *T¨ðå@·½HšìóЃ—ëuòÌÐl â(Å |^¼yƒF£A§Ù"N¦î'S|áÓm5ù³Ï=C£ÑàÌê*½n¥z.'ŽyøáW¥ÝÅ%~ÿ÷Ÿ°^ã~-Æäø‡µ~ ˜ÆSº½Ez½GGv66Ù¼³åpT@P i÷ºxÂC „Ô‚€½í-@b2Ÿ,éuZÄÓÄÍ*ކlmnpf}ÞÒªÖâù›w0¹¦U¯1L]‹1( Æ+¤Qöq*ål´R‚0ÚQLéˆÙ¬ÓÀ Eý‰D0“KEŠ3¯ŠÎ«“ÖZ’iD«»X„&ájE21¹#¸Ö gJ¨µØYš­Î0Ââ)@!¬ bòdAvgžÞ‚˜2#ÃB ‹kk-f.Q×=½Ø7II:g$Ô2×a*E8 ÃÒ΄.ˆh†ÃÃCâ8.Óug¡Siš’¦i"¤µ.Û<ÏcyimÜÜît:%ŽcŽŽŽÐZÓé´˜N§L§ãÒ†Eí†{L]ΙJa û4›M5§â'QŒ =WíØBu„´u¯ÁóC¤Rd¹!É3¬q Ê^P«¾<*T„´B… *T¨Páåb4ˆ9î"+Ëgø£ÿ1õz“V§C–å4[-&‡ûh!¥¡ÛmÒî6Œ'lnn²²¼ÌÙ3gÃ×½éDQ„Öšõ‹xæ™gœ3‰ùƒ?øCΜYá«—Èó?Sø~Àp8d<2ŒØÙÙ&Š"†Ã!Ñ4ÅóÞ¦D XY]b}}V³ÎÅsk%Qú˜¼îÈM3:’¢¤ÏíÛwÐ2d0Œ¨yŠÃýC|3³3˜R¥:ÏË™L¥”ëîI’”ëKÓ”h3&eõŠç¹ùÎ……vv¶h4L§SZ­‹‹‹”³­3Û¯KKKqeKžfåìêl›i©zJ î5J!ÈŒvý®€±‚4I¿`T… !­ðõõu666ªQ¡B… ¾¢1%|êÖSŒ†Ìæî6išrí¡ùÆoü^¼yƒ;wîP Ö×Ö0¹­¨5ÜÜèåË9ÜÛg21¶C¢4!IÜÅj,,,09<:"¬Õ°¤ÜÞØ`{{“[·n MNH,šétµk ¥WTu,P¯×9:ðšW?Lú„an·Mš¦ÒYè‘ç9ív›Z¸NIO1ìÑm·h6Û/d”XÐ eäQ‚IžI•!- ql½óÛqM©y–U5®aÕÊã¦U[¶ªžTu‹MŸ°éΈúŒ(ÎÈe†'úH}ß/g>­µ ‡C§¸w:ìììeI’”½¥RJF£õZOù~ˆõ]uÌxõ°Fjr´…¦€Z­†RŽtxa@,,,°pÄÎÎ_ÿæo`gwŸñxJ¥%aÙÛ; Ù¬“e‚4Ñ:ãêÕ ý€½½=:h3Ĭ./âyÓñ„éx‚ÖšV³°O'xR0-ÒZ/¿ò [[[tºËD™¥¿?âÙë70(¢Ì©©žçaót®ÂÄQ0+1Åh¹”:ÍHcG²=ÏCÌúûÂóa‰&1­FI’qks›i” ήáÒåk<õÔSlîn³¾¾Nǹ~ý:+++\8å+Î]8Çh4b2™ç!Ï<ó Æ¸ÙÊ$I9<<"K5‰u=2 ‰’Dóè#±Ô[c<pñÂŽÈ  ¶wiµZôŽ1²9Q<åìò&ω§S´¶´Z]®þíÖ»CRQgï0f;ÒÃh‚ð|²úÑ?äG~䇹té"J)–—–xûÛ߯¯þê¯Néœ]Ïþ¸qó&ßþíßÁÅK—9wn¿÷÷ÿ>ûûû_p­5ÿâ_üÏ<ôÐ×°~þO¼óŒÇã¯øc$„`yy™ïÿþïç¹çž+ï¿yó&ïxÇ;xðÁ¹rå ßñßÁþþ>ý~ŸW½êU ƒëé÷û<òÈ# ƒ—\v†õõu~ú§š×¾öµœ?¾¼ï‹m»B… *Tø«Æùàky„+¯¸R²¶~ޝýÚ¯åÒWÈóœ>ÿ"ýþé$™æ°?d8™†u²,c2’e.¦Ùl²¸¸H†D‘«Öxúégxæ™gÈRM½^§»Ð¡^ñÅd2¡^¯ó-oÿfzè!ІÉd°ßgŸg>÷Y>ñ‰Oð‘ü7nܤÝëºßåU<å³wpàˆG’‚ݽZÍÊ«“å’Í>{ý)“X“E¢”RTØâb ÕOŠÙBãTNëȪ֚ÁQŸ;wn0…Ö…óhS$®J;—žë‰sÝŸ³š™Âêæ1-×J`O¨®ê¸ïãÖgó’l9•U‚•'lÀRÍzDuA\OÖ»”ûxÏÂé:šùYWcLJT^Û¼ ~Q1ËKE¥²|:‘v¶¾(žÇS’$"˲,!ÏÖ”g ‡}ÆÃ;Öò<%OÝú¢hR#eY†1†0 ÑZ»Š˜‚$O§ÓR)N§'*\„øA8ɨ… jÍÆ&q‚±–$IP›o•žâÊ•+œ;wްV+íÂ*Üw„ôõ¯=ï~÷ð‰O|‚8Žïz|f»=Øß;aÁý¶oûv¾÷{ßÅŸ=÷,Ï>û9®]»Æ{ÞóÞ/¸ÌOþä¿áÓŸù ¿÷{¿ËsÏ~ŽZ­ÆûÞ÷£_oæÁÁïÿûyüñÇËûÞñŽwðÎw¾“'Ÿ|’'Ÿ|’«W¯ò¾÷½^¯Ç[Þò>øÁžXÇ?øA¾ù›¿™n·û’ËÎãSŸú¿õ[¿Å;wîÚŸ/eù *T¨Pá¯Â*âiŠçù,//šÉ´ÏptÀŸ~úã|ò¿|Œ}ì¸qó:BZ––8þ<+++t:=¬ô†L§1APãâÅË,..òðà !Üœ£ ¦±dyÂÚÙVVyÝëá‘W_cíóé'ÿˆád“ýÉïpý…§øø'þ€Ý›žàÊ¥ót»-ž|òOùÝßýmT 0h¦q„Šg?“O}æi¦ìNH¬äÅž|öϸqó6ûû‡.Gù¡ƒB(BúX©8ž™tFÚÀ 4Úd€Æ’Ópëö ìîn¢uâBž”#Šq2FIƒ$G Úõ›ZÄT“å1`Jâj„Û–Kò¸$\sW`Љ÷j®kÔZw™‘R­ iê{f½©å:Ñ¡‘Åœ©¶$Öˆ“÷›—„[vFô¡òöïýÞï8ÿìŸý3Þð†7ðÄOðmßöm¼ë]ï*g>øÁòK¿ôK_tÙþù?ÿç,--Ýsß¾”å+T¨P¡B…¿ DÓ„n·K·Õ†^Š6 ióÂõ@@£éÓí.Ðl¶hÔ[´{ $IB»Ý-RýÃ#úL¦·¹~ý:ãñ˜«×äÂ… dÚrëÖ-¶ww©×ë<ôà5vv¶H¢úéϱÐS\¹¼ÆdtÈ ¿‡RŠ­Í>çÎ-rfeå<üªWòä“ObŒáãÿcüqš6ãñ”îÂA½CØlsf=àOŸ|†Ñ8!ѶȒ åyŽçÈ‚ì¸ô!X£];gA¬ {kI ;«ìîïRoÖiy-Ç/¥+µÖ"È@øŠÐ ‚3jc@¸ÖR£MAîÀZ˜uΘy%sN­¼+Õ÷îYO§:Z¾#ž³êëêi¹1·ìéॗºš„˜)‹Þ‰ý±Ö`Œ.m½î’OºYRŒ›J!0 Óñ_ J’Òu·Î”Op¡OBˆRõ¿$î3â;«‰ãk-Íf“0,,¹…r:¯ŒR¨ÒRJ&“ QÖ×ÄIB»ÝfùÌ*Dh0ðs?÷s¼÷½ïå~áøä'?ÉýØñÙÏ~ö®cpíÚ5zè!~ó7“·¾õ­üÆoü¯}íkK’û…–áÌ™3/¹o_Êò*T¨P¡Â_Q‘Dz½€V³FçÌ"K ºÝ.B°Áx4e8œOƤÚàK§Ä%ITþØB0YYYqI»¾Ïh±¶¶Æ+þk!¸}ëÝV›Fs™­Í›ŒÆS^xáyþúßøF&ã>ÆÀd2ayy‘V«ÅÎÞ>Ú¹zõ «««°¹¹ H–WÖ¨…už{þEâD³±½‹ ëÔEÉaŸY…1š<ÏðT€çäYŠž… I ÆU}€Áa³RÔÏ÷»¾û»y⻟àéÏ>ÅþÞ.7^|á%ϊͬÏ>õdiå=Øßco÷«âØt»]¾ïû¾O~ò“å}ïz×»øÎïüN>õ©OqçΞ}öÙÇà‰'žàg~ægø™Ÿù¾÷{¿÷K^ö‹áå._¡B… *ü¥ý² ³ ¬ÆèœñxÈdÚ'NÆôö˜Œûî±¹q›;wnrp¸Çt4äèèÀõEÖFÏ—¬­­±¶¶†19++Kœ;w–µsghwšìïïò±}ŒN³Ãx4âé§>K–D a¡×áù瞥ÓnÇÓ¢RÄÞ¥Å岫rkg›Z£Î4J¸tù¬Rlî°´ºF’[Ú½e&IÎÁÑå9k®´NqC»êé)¤§R!¥‡V(Bø TIæ(lµ8K]Ý?<$7ky®±V”?ëRpm6+ªTfdÔœø§”Bú³|^!-J‚'AÍÏ{ž"ó$rÞâ Ì)”sv\1Kõ¯q±÷\ïéßš%‰.«jÜe¦Šjãy^¡Žæ“Ÿ “:O1yŠN3tš Ó„üë¿Ê·ÿßÅh8xÉ眎®ðÒˆ¢)?ù?λÿ§b½¨W©P¡B…—ƒúîÌÿäûÿÂßó*üyñÛ¿õaÞþwÿIEìÏëÞø0“ɘFÝçÜÚ»{›œY]¢Y Ë´R¥B¤PL&qšsx8dð;;;xžG£Q#Ï ü'Ÿ ÕjÑé- ”âà¨O4‰é6ÑyÊ£¾š³«‹X ¿ÿ»¿Ãý×ßÌt:%ð|öég¸|ùÒ ðTÈ`|àÔ­4§Þl²°¸J¦úäsöɵû '=¬ 3Ïóð¥ÂhM–çeò« œU¶8µ-#r‘'©#x…õÔ… ÛB`²œf³Iž¤AÀÙ•Uz½JZ|™ã+‰ï‡¥’æ’pqê«’å­ÈsM’¥'há‘hK’K¼ ê…å5AŠ«¶ƒÅXPR:zÂnë`©8eãÍK¥/Ë9©¶äö´RzzfÔ÷äqµÌ)¥ÓZ}OÀãnõÕœ²3wœm±Žù¹Ð™ ›çî}YXZ,CŒfJk†Lã µšKÞu ¼.P©Ñê0Œ†8Õsaak~ KKK´ZN]ö<¯üë¿ÊÛÿîßc<U_²sð}ÿ%üþïü6û¿{ë_hÝwnóÓÿþßóoê¿$@L€!pT\æþGÅósŠI€âìÐWG¨Q… *T¨P¡Â—õ[`Xnt¨…ÃaŸF­F³Vg2•¶G­ õFÓ©ŽžbzgÈp³¸Ô&ͦììl0i4hÐïÑ:s?Þû}<Ï£V«±~î“þ„vk‰§žzŠÁùsG³Ùææ Îž[c8sõÁ‡ÈRMMöX;·ŠA2ŽL¦)*ˆ‰âŒi£¼šëé,¬¨º /¡çc ¢å:3µ+E`­&MMIx”VKñ<‹çh,Ò PbÎnj k ´1%I²”­ÝR³ºØƒ\#|˜ÿ \;!…$s~Z”ò@HÒùÖóŠ3EtR$9™®{Lèü,©µæÄ{|Lúb.\é´ê:O2O߯ӗš=eŽzÎ)&¦óMB쩪›AÌsWg3S˜Ó4u ñÜ쩵–V«E’Ä弩ï;•9Š"†ãY–Q¯×]üâÖΞ#F“ N§ -šSò”_Z’ó<'Žãr¶µB…/7*BZ¡B… *T¸ïpæì"»»»)X;w†íÍM†Ã!N‹ñhD­Vc:qj®‚f„!ai©çæö&#üÀÇXÍt<áöí›\¸pz½In,“É„isÔ?@dž?{þ9Ö×רÜÙFkM§ÙàÅ7étyþùϳ´r†ápH³ÝÁbÙÚÙ¥ÝîÒi/2ž$loíÑLÈR[ô›êÒ¢«Ñ{ÁžÚ÷ã›öžôärE’®ØBÅÐÖ2£ÙNÙ•ÌvT)U?¹d^UÃÙìé|©Ktž>J)¢(¥h·Ûlooãû!ív›Z³Å‹ ËXIæ”n)Í;MS’$!ðC V¦ófY†”’N§ƒ1”Šs… !­P¡B… *TxØ?ÜÂõF@<Òjµ0yJ¿?D §ØÕa©¦i‚”‚kW× ‹9¾£ƒCÒÔ½ŒÇcÖÏŸ£V¯#…¤ºõû‡Î*9röì2KK <öè£|ä#¡^o²¼¼Êò™U®¿pƒþp€1†£á+++ R…X<ÆÓˆá f8’eÂÛΑ)%MªórNÓÚã™ÄI“ÊݶƖVÐ2-V+‘ÍL´Â%1ÚædI ¹{lMØÞÓÔ‚KÇj*”sP¨xÚàIF¢g‰¼Åv°ÇÉ»óœn–lkŠ.T+\—èl&aNt‹Þ‹DΫ“÷®X±wYm_J=}û^Ë–ï`…qs§±žîl_f½ §-¿3’8#³cé‡Á=ëiœjéÈëLÍô}ŸÕÕUŠÅÅEÚ½gã´’4w½¢B(â8&ÏóRùLÓ”z½Îp8D)Uâ,ËH’¬¹«PÒûJ©ê¬T… ¾,ÐZ—Õ*ܯhÖF£YÐnµHG1yn¸|ù2ãá!,+Ë+h㢽ýˆÅ¥‹ +ìÑn7ÒGS´vÏYZZ¢Ùê2è˜FÓID¿ßwÊUñð«^I¯»È;w¸zõ*ý£!Gƒwnorx´’ÅÅE&Ó Z÷¨Õë ‡c&Ó„I”&¶ .Rž‡R>J9N ):0µqó“V»ß ³Xy‘‰É&Jl¡²yž‡~ˆ$Š™TW¥’cÓØÕº˜´`ˆ`lÎt:åàà€¤Õ¢Óéà+W)#¥#»yæÒd…rê§Ír¬v ©ŒFZEŽ &´Ña;ùž•É»ÖÌ©§²È(2HQPTë_i%`(ÇYOÓÙLäRIÝzL±> ¥¶è:-ÿÝcYQÞBA58õS ¶n¿fD~¶­YÂî¬Ïv¦€k­]Дw)¼zƒÉdìH«ï#<÷óþÜú:ÓiL»Ý.gRµ5e¯i®-ÆZ‚"­7CÒ8=¡"k­‹”^WS¯×«/ !½!¥dmí[››\¸x±: *TxY¸yãçέW'¹*Ü×&¹xá’„žG2óä‹/ÒlwÉ5ÔÃõšD>O¿p@œ‘$.¬F5²,ÃÊc+­Á±(… Îqu#3US ‚™ËRJ‰´Ž ÙIžpttD·Ý¢Ónâ×Br­™ÆH…’~IŒ‘) ¡¤¹)d3$_H´kHÅRLáŠL¡à‚-­¸Çv[×"!8Þ¿Y¹¨ÑöTE‹u¤ÑÎ÷“¬Ÿ´`§_Ú‡I ç½²ÇÄNδÎÈòqÅŽDjƒæØR|bö´xŽÎ ºHVJÑjwéöXX\¦Ó]@kK†lïíøîD R“Ç£ 7Š"ò$%I"‚ V샸‘ŽÉpDÄ“)έ“ÍáÞ>Ò¯¨C…ŠÞ·¨Õê¼ò¯=Ì«_óè‰hð *TøóÀC–¥­pß# ëìïïÒë,0èo1ˆãØuk*E¯×#¬7ˆâ˜N§Ãp2FËââ"O?õ ~ÍgíÜY¶··ñ</<îœõ9ã:£(Bg)¯yõ« ŽX]]% BþË'®óØc!}E#lÓZ ÙÙÝ'Ê2†Ó XY¦­j­ïi³?Ñs9 :õÜýš¡uëc"' Vg |¬eî9î"Ô©®Mk2XÜÌtŠ'q–²½»ƒ±K,,,0Oˆ³•'¾Â‹•ÏE‹ *͉SƒÎs<¯Ž€5n®‹+\PÑ 2Wü;-$ì±Bi­EÈb˜t6,* B:Ekа&s‚è“\wá9`Fdç”ÒâÐ!gK Š’4ÛB•uj´EX‹”¬t¯'ôœr­-x^@³Ùdqq‘K—®êœþhL½^çLÑ3zý…éõzL§SOù3‰\g©ï)„TeרRŠÀóIã„<͈§Z»ÏŸ_œ‰ã¸úò¨PÒ *T¨P¡B…—‹ñxLÔ8ô©ÕëlnlpæÌ¢hÌùóç©7(Ï£·¸ÈÖÖA°·@§Ñ%Ë2{üQF“ Êw*ÕùóçÙ;ØG ‰ÖK*.^<ÏÂB—-ö÷¨Õjììnñú×½‰ßø³vö™udGˆc¥lf—õQÎ'­Î®Bš¡¬9•ÄjŽ %sj¢±'8Õ<ÓÅœ§Ã±"'¥ÂØY9ÁÍ’,uY²B2‰¦Ü¼s›Z­F³ÖÄ„Jù!ÊS€Å˜øžDŠÏ Dža‹Z_@θk-ƤɔE­M‘¤k Bx÷TJ…pdÔZ°Bò¥.žë*lf¯ó´µö u”~!œXî®õˆ{?oî!#fõ1ÅódEâ®çy4›ÍRŒGt»]תÝg{2™Ðl6Éóœf³IšdDQD£Ñ`{wv³A4ñ|Ê”t%Ü ½½=0†(ŠXì- ”â`oŸÑhT}yT¨i… *T¨P¡ÂËÅh¹깡Ýn ¼?¨Ññ}ŽúCFã)õf•³+ÔëujÖZ²(ea¡ƒd&£»ÐÁ÷Bâ4&ÏS4†zÃ'Kc_Ò?Ú'Ïsê5n·ÉÅ‹—yþùÏsóÎMVΜe{ÿ€~d±x¤¬ \efèÒV; 34Æ”6ÞÓ¤tfÙUR¸ÞQS á±Å¶´ô] .¨H•)»Ö˜9¢vLœ¤”ŽŒS²§\ç %X‹TÏó16'N3⢿rG´Û1n—F­‰ò™Î‹ÎW‰P h”ôehá‚‹ŒkÅq¢P¡p–× ‹™S;·ß³R§2:jíükš¿Ì2g=yÿ]„rFÈÕ‰e ~>ÛÈqro©º g?‹.W)¤ë&g….¼ª˜#5Öâû>µZV§M¯·H»×¥ÞjS XÓ(!I2Úí6By¬¯¯óÌÓŸ£Ùl–óÇJù4jujµZyXLùþ§iJÅLF#–––èQ |îܾ‰çyøRq¸¿[}yT¨i… *T¨P¡ÂËE£Ñ ^¯—ÝW®>€É5Ãá!aÝCcÙØØ@kÍh2¢Q¯Ô|öw÷È&Ís¶w7X¿xf³‰µšƒÃ#Z­¾Z@­*¶·wF,ô–ÈuÂóÏ?Ç`0Áókœ;¿ÎÕ¿–§ž½Édš0˜Ä(/À AŽ¡&%¦˜Ù›‘Í<ÏËNÉÓdÑÍ[lÅ=ÔBá:;­á®iÀ"\G[V¦0¿n!B"­ÄXመ-H³? "š „ÅóÁ¦ Q3WóÒxž¤îY¤ÄN $Ô<@A”ÅXaQ´ËF[B„Ï…ÿ¸ë" WÌHôik­)ƒŠŽI(w¿yByâÚþù³;NXœOuÎÛ©g×3ÜÆc§(—Ìm- í½^¥¥Ú½nY #=Uœ¨ðñ¼€N§ÃÁÁ·nÝ¢×ë‘eõz<Ï988 C677i·šdY†/Uy¢£ˆV O*:í&“É„^»CÿðˆÛ[[ÜxñÅêË£BEH+T¨P¡B… ^.üF £›{;„^€Õ_*¶¶¶H’„¥¥%Î_^ ñKõ}¬Fù‚õõ‹ Ç#ò<'I§lïl •O»P¯+šKm”òQ"§û5W¹u{f³ÍÆæ™1Œã„ç®ÖÛ F™³ézŠÜlî*I²<=1é.Ežç':7g„\ˆRž¥ÎN+²&Q%!ò=UZ~‘N=EJGH<’E%Œ°NµÖ Až;ò#…Â*°&›±8À寑KéˆknÝ\¤*Sœ§ÜÙÞdkwßWœ[]aya†ØÌ=«žçQ÷Aä! ABŽÈ5žW¤Ï¢¤Ä6)=¬™åÓÎ[bÝE N=rlc–âø¾r93§tŠ™½wFL‹YÐY*Îz^ß÷ ë5ί_äpÐGk )%I”Òj ÒÔ¼˜…eIŠ'wn†¡³yç9&ÏXÈÓŒq6 ô|âiVœÌHÐ:cÔ0FäIŒÀP«ä~ÕôP¡"¤÷%fgÁ’ôÿgïÍÃ$9Ê;ÿODuö9Ý3Óshft ’ !aÄ #aî…Ållñ[°È6ɲÀf%Ð…0ÂF6xÙå4 –XÖXkt`Ö~¸„°=º4£9zfúª»òˆˆß‘™]ÕݺÐh×Ú‰ÏóÔÓ]™Y‘™‘ÕÕõÍ÷}¿oDÇkÚ¾;Ç£ú.%A†%„Xvñv8Ž6â8f×®]LNŽÓnté¶ÛŒŒS©TH’„r¹Š2šz}”R)ÀØœPž·ýCk#›ÆÛ6…QiÑCT¬ñsUÿQc0:Å ‡Í‹ÒG‡×`ÌV$C=J‘s.ðÖ4ÊëV3¡&=+¢lC§ß£×èv»lœ^ÏØÈ(Ht‚1¢è¡êIi{ªJA?QÙ±šL’K$£m»™‰F-†Ôû£¡æQ Õ•?Å “"#ìôyÕƒ!a†aqlyûøL¬Ÿ¤V®P¥ØH¨çyA@Ç…ÁUš¦T«UÊå2:Ut:„±©èÍf“(Ѝ×ëT*˜ÅÃÈȾïÓl6™¥Ñï÷ú”ëQ¿‹ CšÍ%„1ìß÷ QÔCÅ ž/)•B‚ÀÏL 'HJº÷Þ{/ßÿÞ?°ÿ~7!‡ã1ãy6làŒçü;Nع“r¹ê&ÅqÔ²å˜Í”*!½^Äâ\ƒé ˜?4Oª õ‘1æØ8³€½ö“$ ¡/I㈉±1Î"(•„~/eËæíT*î¹çÖ­[G%,±oMLÑn%´»}º½˜n_ÓîÄøAM€ÑYz§a O¨2-ZK”®%˜–Å’u µu¥Ìjñ:(lFhµJXZä ‹QIJè´2khYžkŒFi;ž'ò4V{<m$í~ÄþÃiu;ŒÕG¨”ʤq H¤ñAiü¬·ªgÚhT.r%xRبªØ`¥±ÂÔŠRoåm¹ì§^%4×zn§:WTh? ðŒÏèøXÑŸVà166† |¤ô ‚€J¥B©â•}ªå HA9¬ØÈ§ðI”a©Õ¤”ñ´È† ›i¶:x²D?NXZlQ«Ž2RG+RÐn÷˜žž¦Raÿl›ù…&©¤J ´‡N%"ñÉ(Û¾Äè¬ríˆÝà ҇©ùïšåæ& Ó‡ç!$*6u× ï8Kו RVÅrÿM„ô$JiZI’$ £µ:¥,­Ue†•"0ŸÛâ&Õ*«±ž—9ñ.›9egýóµzÞVSTQ'šÏ‘>K†Ò‚³èêÊýø¾o³LNNZ§[!¨VëLLLàû>Bx))•J•€^ÔÍ„¶,ÒžµÖC.Çý~Ÿ~¿_\Y§b(Š(•JmŠö@˜ŸŸGAµZ¥V«±w÷Ò$¢õé÷»ô»ºÝ.q¿o#¤ÂöJ•]RÛH®ç¤ƒÃ Ò£’(Žùßßù;^òÒ—ó‹gœá&ÄápüÜl=æ6nœá›7|w¼ë"7!Ž£–à slÚ´™ÅÅyšÍ&A¿¿D©T"ž_dll„f³‰ $Õj)%K.åPЋþl7“ST«5ší9¶lÙB£Ñf||й¹9Tlü •°Îü\“ÅÅ>½nŠÒ ¼ýDg¢Î¦¤CÍa$‚³†˜Z)2‹ŸÙCf­N¬Šˆ®%8W ©—©R”¤ÀËêbƒ À ‚Ì«„ç‡øA€ÌRš“$!R“Ó“ÌÏÏS«Õhµ:LLL M­Vcan‘¾‰XZZ¢^­¡µ&ðBzQ¤ÌÍ/033C³Ù´5£:¥¹Ø¢,,,ÐZR,>D­Z¥×Mi.5ÐiL§ÓÁ÷%ýn‘—þZuo[ÐHÛËÕó¬;²ÃáéQˆÖšö3³i“› ‡Ãñ¸Ù¶};û÷ïs™Ž£š°gðÚ 3cãLŒ%zý”…¥Fû,6»lÛ¾•$í±¸Ô@鈑Úó‹‡gLNV™;|zµÄx½ŠŽ–ðEJ¿¯(•ÆHRAl?½§ÉR»5´(aŒÀ$)F€ @…N³h¨°f@BŒPeB 2wVc„­Mô|„Q™Ô m»Ï(kì£Ò, ÛëÒT‘uš T¡!«YÕ€—ÕeÆI¦Y Î\x+Þ„gÅš¶âÎÓe$BdÇ?(dsmª4BÊì<|Û—SgfL2xVI*­I3»q £t&XA I =&§§ GÙ4íÒét‰â? üx>~P Bß:ý ¬‘уýW "wÒz =Úàg=_±½R‘VhzÂ/œr­ V6ø+$BÛ”bƒÄHAèy$.óýß÷ÙGŒÔÇ(UÊT*5š‹mÊÕ*cccÔj5¤ç‘ê”v£g:Õr•¨“Ç1i/ÁÃF=ƒ  õh:@9 AkBéñàý-\¢~—$‰PIJ’$¤ÊÖ îßÛ!é÷é·[ÄýÈÖAW*„aˆJúTGlŠo”Ølš¦,µš³m;wît'HV”RîË£Ãá8"Ø4EgLá8ºÙºq A¹DJjc#ìß7‹'$£cìÞsˆ^7¡±Ô¦×o#áÇ9hcb“*Úí&¦'¨ÕC:Ý“ëÆ™Þ0A¤ª>ÜbÿÁ >ýØÃˆJËBtš¢åˆÎ‚Š6åÓŠ"•5Ë‘Ë<ÕUJ¹¯%ƒ}GA°,¢ªkÔž®é²[¬Ï"|ë¢;&jMað0F¼ÆÃ¦«ÚÚP“‹ÑAQš?ÕbEàU³f¤1§BÚsÎÓoc4 KóE:oÇôû1ƒJD‘K¯‡A"ý€‘‰ „œ®M»]{>ìõ°meŒ½9 L¦³m4wð³S;/ž ™ÀWH<Ò¨žDš¥5‘±7úý2ó‡ؾã8J%EÚq9+¥H’ß÷yæé§3::Êìì,•J…¹¹9WCêxBxÒDHó”×¹¹9þàþ‹.ú=¾ðùÏõpß¾}t»]î»ï>®¿þz^ô¢qà 7°uëÖ‡|Ý[ßúV^ò’—ðçþç|êSŸâmo{7Ýt_úÒ—øÞ÷¾Çm·ÝÀ›ßüf¾üå/óº×½nh¿9Ÿþô§™-ž_|ñÅT*~ô£ðÁ~¿üË¿ä×ý×Õþ‡Ãáx"YjÏ3µa’ÙÙYê¦L¯×eÏž½#XXšcltDD¯ßBõ„MYLb„–üã÷P FÑZ29±8ñÙ½·C”:±DzF´IP4/‹ZcèÂ]6¤yí¦`Ù´È ü¢VÑ #¿è/x¢›Zk0Yý¢ÐH[‰Îë#‡¾îÉe¦mD07Nôs“$­‡„Ÿ6iV' ¾Hß mÛ/5/*ÌÓ‡ûv‚^UÛº,ÄW/¥EMfÖSzZH„ôèlÞTÖæE[§Ú$c¯6°°0G=M©ÔÇíi¡–£±EZ z¥È܈Ó4.{}D¥` ^裵Fzx 3“#•…k¯¡ëR¬SæµåÈ7Ró66:N§±„R Õj=k³" ·[)|š$VYôS¡MLªSŒ²C½Ì%c’4Áƒïû™Ž·ç†aaÌ$„@Íøø8[·n%JccžŸ£V«‘$±Ê[Ê:G”'mëÔÔW\q9·Þzk±,Š"Þuá…lßq,ÛwË…^4”ãþíoßÌ™Ïý%6Îlâ§>“/~ñ/€åèh}ÍI’„üÁ°ó)OáØãŽçOÿìÏõ¾¢8æwßñ¶l=†O:™O\wÝÐñ+¥øÐ‡>ÌSžr"›·låÍçŸO»Ý~ÜóR­VyêSŸÊe—]ƹçžË5×\ó°Ûß{ï½¼ãï`tt”ÑÑQ.¸àî½÷Þbýõ×_ÏÅ_̆ ذa_|1×_ýšc%IÂg>óÎ?ÿübÙÍ7ßÌ¥—^Êøø8ããã\zé¥|å+_yÔûw8‡ã‰¤T èEŒÐÌ/ͳëî]Ôj%º½ëÖãÐë·ƒHÚí6I¢XjDHY§Tš V›f¡Ñg±ÑO$q ˜¬GfÚG›DBá!¤Gèùø¾–hƒN2¡Zkëk ÂP8ºzž7Ðn|ß/ÄH.&† €”*j1VxaÓjSmÍrrc"l¦«@“Æ1*I²±¾´5™ ñ‰1Š ôQIŒJ"| Bê,‚kÓ‹=϶Á(ŒN׎ØÂÐqÖÈæs0(L—ÛÞX±¬ÓÔ A)‹zG„ MJå2~Ø^l„3Ò4±õ•©Mmã¸0êv»t»]:ív›æR‹f³M»Ý¥×éØÔ×(Æ$)(ô}ÂJ•E…În3aRßÞPPi‚R)ZÛFQ)‡ž@¢‘Ð Õﱸ0O{q$Žè¶[,.ÌÓX\ ±¸@§ÕdiqžÅù9’¸Oõh5—ˆ£>MøxT£UbÅhÖ&&¼ìˆÙJ%Åw¸T+[,#cÔGÇ™˜˜àž{îaÝä4_¢¹ØÄÃãð¬óDq8Aºê.Àå—_ÁìY~ôÃðÃ|Ÿ½ûörÅWëßþ;oçâ÷½Ý»àÆo~ƒÝn£vyÔu~îðéÐÕùwÞy·Ýz+ÿøãÛÙ¿ÿ£ÞוW\ÉüÜ<ÿô?æ»÷¾ûÝïëµ×~œúÉO¸õÖ[¸ëÎ]”Ëe.½ô²#:?¯{ÝëVíw%/|á ùÓ?ýSZ­Íf“ë®»Ž¼àÅú»ï¾›SN9¥x~Ê)§p×]w­9Ö_ýÕ_ñœç<‡7®ú‡3ÈwÞù¨÷ïp8ÇÉáÅÃì?´ŸN§ÍÔÔÓÓëaÇŽmŒ×Ø´ya%¤GøA m<:}E??C™F3¦ÝN‰cH•°-QDž]ª1&"V@ >ÖJ·]ùG˜µSs‹^šÿs‡ÍƒÔ#|‡)»ÚÖWf&=Åv”N0FQ }Ò$¢V ‰ûmÐ F'$ýF+ŒŠ U‚JӬǨ\3]÷H²jî¤\ŽàI{.6 hÝd•R¤iš¹ÑZƒž~¿_ˆÉüÚ ¶ÂÉ·‘Lû(DôPËo(µ!—ׯ˜‡<úëyžÔY$5(—ñ}¿Úh¦°Ñë~Ô£ÙjdÇ™dç’déÇ6ònß+ªˆìæxEOÕe—àüøƒ ("îRJ&''©V«xžGš¦œ|òÉÌÎÎE­V«0ùÉOò¶·½mhùóŸÿ|.»ì2FƒË.»Œn·û¨÷ïp8ÇIPòmm¢'‰¢ˆ0,¥^è!%h¢”!V %|šÝ>K.Ò«ãûuº]M«Ñ©‚Dit®=„‘‚±­“åHåà£øgj#¢ùC2ì8»RŒæ‘Ñ•ëòb¶¢ÀŒ\QÍë)£¸‡6Ö•µ0F2¡#ÕÍñ;Žáßq:ÇmÛBèÊ!ø$,ùÖIh„´©Ãd©´Ë;’߇l’ò¹ÐÊö7xHá[±†°MÊå*Âó—…âÀ9kmv±êRz!‹ˆrEfõ³ž,„§çá¡‘Hág)ÕÞ²s²”˜\Èz&ÛVx­-ö}¼ ÒÇ÷CªÕ*Òh)Ù¼û|Òhtš€V£A+<'Wœ“zå‘u›…-²>·Â¶ñ‘?´¿¥R‰‘‘‘B,W*5þå_vq쎴šM&&&étº¬Õ7Öá8jižV{úéÏ¢ÓisíÇ–Mr>̶mÛŠçÛ¶mãðáåˆçç?÷Yn½õ6Î:ûùœvÚéüÍ#Ô)<Gœ'©ÑZLOO³gÏvìØÀîÝ»™šš*ÖŸzê©|éK1†oß|3ï|ç¼ô_ÿå!ÇÛ°a»wïæ¸ãŽ{ÌûZ¿~ýÐú={ö¬û¦¿ù333OØ\ý·ÿößxÞóžW<_i@ðýïŸ/|á Å?ã .¸`È%wçÎÜqÇœyæ™ÜqÇ<å)OY5Îu×]Çå—_¾jùää$ÿå¿ü—âùW¾ò•b¬G³‡Ãáp8žH¤°ýUbèô#Ê•Q¯ÆGz5 JåvBmdšÀ¯’¤’v·‡ÒÖtH0„'—͉òeF€ÎRdµÉÚ¯`[¬@VÛ9ìp+Ír JJÛãs°½Iáš»Ü÷eµ Yͨx(M'VùÉf^è¡$:%Ñ)©Q(µlâ#ÄÓi<<í=D•R¨$%mÏÈ4M³ôZÉê‹”Ïègá8 vÛµZÈä顈!¤\pö8µÌ†FXÓ)á¸ã·qúéOã¥/;›ß|ý¹lÞ0MÉ7è¤MÒ]¢Ý8ŒH»¬«qÖYÏáùÏÿ%Ö¯#$A~¸FOÒ#ráB+¤±f@a¡¤©B!ˆA@}t‚DC¬XÂPûŒÄhV RCšhTj¬K¯°i´E´Tfé»™ ÔZ£Ò¬·©ðAz<>Bh!PÂÃxž_ÂÊøAÏ/¡Rcû· ¥q¢mÊ·8MHT Rà>Ò÷lªpà“¨e4Cª„A)$Ž’âX¤ðð¤'}¤ðHREªlßUc$©”ªu&§ÖóôgžÊôÆ ŒŒ–Ët»]|ß§ÛíÒjµ ¨™™fgQ.—iµZîÃÃáéZ|àýïgzý4§þ,N;ýYlܸ‘÷_rI±þeÿþeüæoÇÖc¶q饗ñ©O~ªX÷»¿ó;üò ^8ä²ûÞ÷¼‡;OàygÍ3O;-›·<ê}]rÉï36>ÎÓŸþ Î|î/qæsÏ:Ö .x'gœñlÎ9çÕlÙz ¿ý–·ðòÿòŸûÜó>¤OúÓ¹ð Ãÿõ¿þ×ö|ÙüÞ÷¾Ç©§žÊ©§žÊøC®p~ýë_Ï/þâ/röÙgsöÙgsÆgpî¹çñ‰O|‚·¿ýíkŽúé§óò—¿œ§>õ©|þóŸç3ŸùÌPÄù‘öïp8ÇJb 1$ý˜V³ÇÒb‹V'f~©‡Òe‚ò[¶^™f«ËáùEÀšä„aHE(¥ŠtJ¤bo •“\ÙKD 5kFƒ¶I¿hÁP*îZ¦E¢hõ2)HÅ-–£³¢¶¯Íë Í s$¥³tQ5Ü4³ñ‘Q‹KÜ{÷=ìß»v³…”’4Nˆ¢ˆÑ‘BÏgrl”ÑZràS«–¨”Âí`ô¶(Ï|lˆá4åÕ7ì2ÏóltP€¤YídÇ…¡ÑJwâÜ\hДHcPFgõ¤r¨öV`kLÍÀM‚â'¹#ðr/U#lý¨}½=>!m+ß÷ C¥R©T¤ëÖ|z^EÍLŒ„X®õ}èFF¾¼H/.Òš—oF„aHµVF+H“å´Þn·KµZell )%ëÖ­a˜_˜CÃÁƒ¨Õ*î³ÃqÄÉòHŠß%à½ãíoíÿÉŸ~’…ùŸ¯¶ñ[7~ƒÿï·ÞD«ùÐyæI’¸Ù”ôz]®ý£ráï½—Í[¶¸ q8›w_øN>zíŸüÜŸóÇcåÛ7}‹W½æµDQÿßÄñœóÊ“IR ø$ªD·¯HRƒ‘e”ÔÆ&iu ‹MúIJšh’DQý"Ú9(Žr#¢|™Ô`ÒÆyoˬžT,o£ÈRl¥XŽZf&GJ‰YoÌ~áyLaHdë)S+:Ó8ëqécýr=|¿ R¢Û$McÛoS$` o…¨QƒaÓúqÎ|îsX8|ˆ‘zJ)dqq‘‰‰ ‚ `i©‰RŠF£ÁÂÒ"A05½žM›61{ø÷Þ÷3zQÄÜ|‹$|¾•ÿÉV× IDATÆVm#˵¯Â ªK„·,òDžgºœÌ E/×b†Š”\ŒGPaÝÔ4 ÍŽíó©WD“…XåX¼²M^¬T‚Öš ìõR¦¥Rá–k—/·éÉ¿çæ¯Éû€–J%”Rt:ªÕ*Ýn— ¨Õjôz ±½ZØÖ<Ú Î¤Û@–˶'©2”J5Ê¥ óT«  Õjc ½^ß³.º©VÖ9W+†±ñqvlßÎÔÄîÙÇÔÔqsðàA*• µZr¹L³Ù$ÑŠjµJ»Ý&&&&øŸ_ùó3Ÿ+ߺñ¼ê5¯¥Ýv‘ÛAò÷ÝZ4› n»ùÛ¼ì¯ü¹ÆÞ·÷A>ýŸÿ3Ÿø³OýO z@h‹Ùc~à÷f¶¾—mŸöîJv·Êw—Ìáp8Çц'|JU›Jyp®G«Ý£ÛS$ºÏú[‰bA£Ù£)Œ±‚0 Åpêl.bÌr+å4Z†„ÏÀw¯Â%¶f <`l–I¡ÓÌr[’"ê˜ *¡‡‘y+QDZS<áž­´ª§8&B+CŸ4Naݺ ¤N™ÝOT®$ sss#h·;” ¾0=>‰‚»wíâÐÁY6mÙÌÓN:‰°Zá_']wßV-Uv¸¤g¥²ç¢Ú,OÃ'cXž¯˜2VlaK? xY}oÖ«T3lê3hô³Ò8jðºao4X÷ÜÁÈ·†,uw¥©RþÚåºÔÕ×0RæÑY)eq¬‰–äoå0²àø>RæQp+€“$Á+—ñ}IÙv6ùùåí[ŒÒ˜lÒi‘>®SE¯×+ZàØH¬´RJ$Š^¯S]¥iì><G'H‡ÃápuŒOƒ‘DIJ”Ê•*õ2ø%*•Q:½>ý~Ÿ$±}MfLÞ²ƒbcHl ªeQ2øsX åbhÖ/y»—Gêï9 è ¤,ªkMqDu¶©”’ ´ÙÛ´i ´šM¢(¢–ðI«ÙAJŸ8ŽH’!cõ:Q±qãF­&wß}7¥R‰õ›f˜ššbýR‹¥f‡(N12kÑ"%:ކDÜМ˜Ì йœJ“‰x±ÆúYZuš¦66óœ÷ÁôæÁzÝA¡ºR\ÞpXËýxÐ9O½Í·]n¿¢‹ôÜ<êš/·)¶ùMŒe!jÜ“•Òø¾š/Ç$†%*•J1^»Ý.æÐCé"MXQÔŠæÑb­5qg—!7s²iÄiªÝ‡‡ãˆ#Ý8‡Ãá8ÚèvI ž_eËÖí³u£ch%8xxŽÙCsÄ*]nâûxa°¦ˆÌEÆZ¬8+V°lYnËÚ‘5£õš½a=º"ê'tqŒy ¥éy䱯4ÕÄq† ÓLLÔQ:¡Ùl’¦)½^!mt¶Ûí"¥dtt´S{÷îåÎ;ïbjjŠ™™™Â©µÝîHgœòtN~ÊNf6®§^¯âù÷1(´²•ÂmíÉ\ûk«­I•Ù×Z‰”ð}kd²Hâʾ­ƒó´²}Π‰ÔPK½,äVŠÕÁñóÔÝü½±RpçB4bæ¢0¯1Bl?\pk²Þ« ³ã1”ªÕâ<òÈg’$T«ÕáV6†¢]ŒçyèT ç<õ8¿)‘ßÉEn^‡ëpi\„ôIBþáp8¥TñÅÃá8Z‰ðÂ2åJ¡:½.‡æ–8xhƒO”¦¿Œ”‚TŒÑ…XÊ££ƒâ¦TfØ]Vˆ¼…ÈòÂ|›Uâö¡„˜ÐE n1fáæ;¤c×ܧ=f›zìû~ÖÖdXwÜv¶lÙB·Ý" CZ­*Š˜ŸŸ'<’4¢Ûmg<’Z­ŠçIüRÈØØë7n >:Bà‡ì9°ÅÅE”hÑh¶è¶Ú¤qJµ\¢:9Acqž~?¶=K…ƒ­1·†ÍRW q*XU^šÝ@°";E ²è£·b~†o¬ü½x.V¿&¢+·¼0m\7ø].Ë74²š_aÏÕ¾G2f!‘~)ësk/z’Ä_R.—ètªÕãxBÒn·¾0::ÊI¿p2·ßþC*å*;¶K¹2;;kÝÓ­S„ð‹›Ò`M°PH Kó 4›MÀö‘—RÒï÷íu–––¨V«„aèþo8œ =Z ‚çžuߺñ›Œqü ;]tÃáp~àG¶îVƒïKb¥³s#F£6]Wúë,ë{a!ãL>šºÑa9jVE9óíòtØ4M‡{ó,”Áˆz.|óV-½^0 ×Â!¼âæ‚=/kŠ%38x³CJÉää$ž`Œ T*Q­V Áœ¿ò4]9`êÔn·é÷­™QÇö=Ÿ,÷ÇMÓøT«Uz½žçQ­V݇‡Ã Ò£‘R©Ä¶c¶ñ^ù*¾uã790{`¨>Ááp8 žç1³q†ÿðÊWqìqÇÓëvܤ8ŽZ–:DqB¯¯‰b…ç—ÂvìB(+"¤uOb¤A íÌÅG€¬MÌ£¥ZcDnX£Ñƒ(sçEŠU)·:뚉•ü¿À¦êj­QYI.4´®B!Fò¾¢RÚècnXÏ·â{nni \.qï½÷ñŠ—¿ˆ±ñ:ÍùEØyüq”Ëe”Rôû1 ¨Ô££uFGëÄ©bËf-›_ ÑhÑíö‰â!`÷}P èvFG+t:=ªÕ*ýnמ§J¹D§Q.—ÑYÿPŒ@fÑI°¢ !‘žVk\&,W0änÇ‚Ôh+FãxMC£<â™×o ½e¡¸,TWšåQÖAqëû>aÇ1¥RÉFƒ•$¤qLydĶdñ}‚ °¢OJ‚  Óéà¥ýKd‘.Qéòqå稵&ðík¢$fai‘T%ôãO,§«$¶ÎHJ¥2¾ï#}N§Cªb¤årH»Ý¤T*‘$‰ˆ½^ÑÑQ”RD‘»‘ép‚ô¨¥\®pò/<•Sžqjñèp8­5I;1ê8êi4;DIB·Û³Ñ3ižÖ /(‘»›b$×+¢j«u×f0Ò¹EâiÖ’T˜e!:]Íj,X]ÿ8\3ÊP{“œ4M1ÚÓˆLA)ƒR)µZ•r9¤ÙlÒj5‰»FGG9pà###”ËeÚí.Æ‚ ,ÜbÃ0Dú½^ééifff¬h÷|æç牓„éé1¤q=¦— ›n«KXöè¶µš‡NSüÀFJ…1¡—¥°BGö;½è4Íå9^"¤‡‘clTQc¬°‡µ#ÚkÔ€å5¤+Û»<ÔœFC=ϳîÄå2Q!<?›«¡Z䕽fó›Ù»~àz Añ0’$¡V«1:2Ž‚jµN­Z' CúÝNažT˜&y²–¡E½!QíùbØØIZAEѲ°ÃáéÑGîv–$®÷“Ãáp8G‚f»K¢Râ8±u{ )$B„¶‘OVŠAÍ„²–*CÂ2‘ ´æÈn‰íbR¸ˆ§¼‡©162[ˆ±<QDbí1 b–{•Úßí2™Õ= i#z¹3+ ::Mi·Û¤i‚Ž#‚ÐCbØ·oqœ"ðÃA«Õ¡R+#µG­6Âbo‰8ŽÙ¹s'ÓÓÓT«UvíÚE7ê#¥5AªV«‡Ï! ÔGGØ}ÿÜ»Ÿf'"(Iú=+X¥'È«”ßôXó£ìÚA€Ÿ9þZ1*ÑhL& Œ1EO×µLŒÖªŒ¤ Ò\4æ½C×Ck™í÷ûŒŒŒQÐR©d‹Wì+ßÇjAjÂÞ€°¿//…ÁhC÷iµZDiJ[ñ;:’¥K´¶5ÃZ¥ <|ÏG%)Q¯íN‹(êe.º­+ÄilÏ •9K’$B)•ÝÀp8œ u8‡Ãáx\t{6â“jðm½¤%¬Ž4®íÌkµ5k!2—XaŒ­‹ÔËâqµ¯£3ãU\Y³º²ïäJÚ¤(¥I2Ã)}ŒNH’_ZgUÏó©ÔBz½Õº­œ™YGšèLÄ›r÷˜ezÚP.—™åø'P*Ùö+Õj•õ¦ypß>*ÕIj#›gf(%Îæ¸ãv°cÇwßó3–šË5™iŒÒÖïIz%[G‹@kÒÇ/•¾Ñ™Y«ëyÎŒg­Ò•"5>!|_ ¶«É£¤ù²r¹\¼6÷L÷Íñ<“]_Öhû#¤•¿÷¬3±Ò)¥R‰±± zíVqÎI Ga…–#Ÿ¶·®¦ßöFI“$IV/ ”Â7†0 Ò„ûðp8Aêp8‡ÃñxéEYÈ(d`£„F,;±jchóˆgž\Õf¥@/GKÍPŸÑ‡N×]+ 4?¶fT/÷(ÍB«2K³ÔÊŽ/’¬¾µˆ†êå~§B㡇R©œõzM›6¡“˜f³‰Ð ­`ÃÆiT±}û1TJeZí{ÜO%ŒŒŒP*ÙhY–Ù¼¹ŽR†N§C¥R¡^Á>iœP©–é÷ûŒÔèwÚ¶©ÑBÒí´©ív›rµÂøH³Î<ƒF»cë…m‹²´´ÄÞý³Ì/´0H„o£¢Ò~ˆV`²è¢ÑÙÀµÀ°¦£nÞ[s-ašg© :âæA×Ýâ-‰¶4M©Õjôû}êõ:išÒív—Sx3—G1¶æ4«wµ¦F&ë!›¢´Bz&/¡ð! ÷ïyÐî[H4n¸ç¡t‚øHÚóÔöØ’4FEÖôÈÀóL!oÇ1µšÎ©Š‰â¾E}ÒÔeë9œ u8‡ÃáxÜX—Ú\¤eu™y”SÛö Z®+kHY!BWn âS¬±mñzñ^¤Ž§êʇ“ÂÇþÌT~®yz騨>ÖÜÈhu¢”âàÁƒŒÔê´Z6W¯×©×Gè´{4š‹ŒOŽ377G»Ý%ðCfffxàHÛftlÄ~é”ý$!MªÕ*³û÷1??ÏÆ™Ÿ@x’F£Òž'(—C¤ô‘žG¥R"zýHR‘~"¼€ÌëÇFA³H·‘¢h…3˜=XZôŽˆz:âæ©¾ù¶ƒQÏ•7r!šGbsÇÚ¼–47ùd^ÿú×sË-·¸¿L‡Ãáp8‡Ãáéãå¾ûîã•¿ò*Î:ëyüàûßãîç#W_Å×¾þµ£úâÍÎÎòÊW¾’©©)þê¯þŠŸýìgüýßÿ=çwÿõ¿þW÷îv8‡Ãáp8N>^®¾ú#\ðÎwò¦7¾‘ÉÉIJaÈi§Æç>ûÙb›(Šx×…²}DZlßq,^xQë׊p.[75Íg?÷9žqê3Ù8³‰³Ï~>?ýçÚnÝÔôª×|ò“Ÿâi§<©éõ¼âÿ¯}}¸FfïÞ½œü O¥Ùlñy¹æškxÝë^ÇE]ÄÖ­[ñ}Ÿ‰‰ ^øÂò¥/}©ØN)Å•W^É)§œÂqÇÇÛÞö6Úív±~óæÍ|úÓŸæôÓOgË–-Ų/|á <ç9Ïaûöíüò/ÿ2?øÁ¸þúëyîsŸË¶mÛxñ‹_ÌwÞYŒ³{÷nÎ;ïív›«®ºjhÙwÜQlë­·ræ™gR.—áâ‹/æ;ßùÎИW^y%7n¤Z­òÖ·¾•΢ÐgŸ}6µZ­ˆ’ÞÿýÜvÛm¼éMor¥‡ãˆp¤²m>óÙÏòÌÓNcfÓfÎ|î/ñ½ï}Ÿ/ù+<ëŸ]dØüë¿îz\¯QJñ¡}˜§<åD6oÙÊ›³ÏàÁ1kVÏ·¿}3g>÷—Ø8³‰gœúL¾øÅ¿po ‡Ãáp8Aúh˜˜˜`~~þa·9|ø0Û¶m+žo۶Ç?æýäT*Ò4}Ä×lܸqèùï]t!×\óQ”R\uÕÕ¼óï R©ŽT¶Íw¾ów|óßྟÝ˯¾æ5üúoüûí¿å|ýkÜßÏø•_ù.¼è¢Çõšk¯ý8ÿô“Ÿpë­·p×»(—Ë\zéeCc>Ö¬ž·ÿÎÛ¹ø}ïc÷î¸ñ›ßàG·ÿȽ)‡Ãáé£á¬ç=nøÆÃn3==Íž={Šç»wïŠú¾O¯×+ž¯JGŠ—¾ô¥„aÀ‡>ôa~ø£ò[¿õ›Oܼœu×_ý#n·~ýzn¿ýöB¬îÛ·o(5÷Hñ–·¼…7¾ñüøÇ?fïÞ½Üyçcõë_üâW^y%·ß~;oxÃÜ_¨Ãá8b©l›k?öGlÞ¼™J¥Â[ßúÚí6½æš¡eÿôOÿô¸^ó_úW_u%›6m¢^¯óÁ?üC¾yãCc>Ö¬žr¹ÂÁƒ³ÌÏͱeËþøãwo ‡Ãáp8AúhxßûÞËÇÿøùü¾Àââ"Qóãÿ˜óÞøÆb›sÎy—\ò~æææ˜››ã÷/¹„W¿z¹9ì/üÂ/pÝuJ¯×ãÀüÞ»ßý˜ŽallŒ{ï½÷·BpÑ…ñ‰ë®ã÷.ú=Â0|ÂæåÝï~7ŸûÜçøØÇ>Æž={HÓ”N§Ãm·Ý6´ÝÞðÞóž÷°{÷nÒ4åÎ;ïämo{Û?ž~¿O©T¢T*±gÏž¢>ôÑ"„à‚ .à“Ÿü$\pA¸¿P‡ÃqÄ8RÙ6“““ÅïyÇÊe+3lëk8À³ÏxN‘v{âI'¯Êly¬Y=ŸÿÜg¹õÖÛ8ëìçsÚi§ó77ÝäÞ‡Ãáp‚ôÑpì±Çò?¾þ5n¾ùN;ýYlß¾ƒ÷¾ïb^}Ϋ‹m>ðþ÷3½~šÓN§þ,6nÜÈû/¹¤Xÿñ_Ë_ÿõ_³}DZ¼ìÿgïÎãl¬û?Ž¿çœ3ƒ fß-ck%YJÝå.wvF)ò«‘}e'{£P)uÇŠ …ÊVvÑB–È`ÌÒlÖÁœ3çœß89ÌrÎÌX†×óñ¸ι¾ßë{]×ç:Îu}ÎõëÛ´™yä—¶¡WÏžú÷ãO8õäB£Ñ¨J•*©]»g¯i\´lÙ2%$$¨uëÖª\¹²êÕ«§¹sçjÁ‚ÿl{¯^ª[·®žyæU®\Y={öT“&MŠ|{¦L™¢Q£F)**JmÛ¶U:u\nÃh4ªbÅŠjÛ¶-ÿ;©¢èms½j÷®ßíÝnÓÓR•–šR¨6kÕª¥ùóçéÏýû4aâ{_n$÷ⲡU«VÕ?ù8×r///ÅNŸ®ØéÓs,¿÷ž{´ví‡y/»ÃzåÓs¯œ×¿Œú÷ɵür‹>ûLo¼ñºÜݯ}xCCC5eÊ”¼u0Ô»woõîÝ;Çò+ÿæ´ ó7n¬Æ;Æø²‡9Óæ_|¡×^{íºÄÀíåõתy‹–òôòTË-T²T)ý±{·bg̰?ØèRo›3b%éªÞ6×K§ŽÓ_ã'ŒWxX˜þüó€Þžú¶æ|ðSË_êÕeŸ×µëËzíµWU±bEÙl6Y,Ù|(7œ«Õªÿ~ú©âââݺ5q1vóçÏ×áÇղeK ÈEo›ë¥oß>ª_¿ž¢£Û(,úè#IÒk¯ö—···ºwë&I9&YæÍQ£äë[^å˗רQ#%I³f;ªÞ 7ÞP©R¥ôä“OJ’9b/ûø“O$I=z¼"///õìÑãâüÿºÔNAöŠ ÷â¶Á‰‰I’¤êÔu˜¬H– ýçuè…×Ç®ª,Iòðð$‡n´ÉÉÉ’$???I’¿ÿ…¿ƒMJJr©‚ì+^#¡¡!:rä¨öíÝcOôŠr™cÇáˆ^JL ÄÄD¥¥¥) @iiiÉçµÜW(.Š]—Ýn/_è¶:rÔ›:yò¤Îœ9£~X­§Û>S$Ë 1BééÊÈÈЈ#/,±«¬³ž}öB»3gÎRVV–Þ}w¦$é…矿æû ÅE±»CÚ­ÛËòòöÒ‡~¨ê5î”§§§êÕ««ž=^)’eš4~RM›5Ó‘#G Ño¾©®]»¸´¯(«ÅªÏ>ÿ\3gÍRPP½ñ†úõë{Í÷HH‹HNã¾øÂ zñ…Št™KÚµk§víÚ¹Ôö•ó<<<4|ø0 >¬Pí¸²ÝPÜ€„pÛp'äÔ]píp‡@B !€„@B ) øbØ\7’¤,S–Ì&“¬V+AP ƒA%T¢„§ÜÜ$³ÙLP !òv63SÔÖ-›”˜˜H@¸Ìh4*00Põ|HUªV•—WI‚ )7³)Kñ ñZ³ú{=ÞèI…‡GÈ` ×8×X­VÅÇÕêïW©¼¯Ÿ*V*+³ÙD` !r—e2iÃúõdãfª[¿>P`á Ö²¯¿Tï~ý Å·§pÝX­V%%%*8$„`(´È ”˜˜@O HHçX,. £Ñ(‹ÅB !€„Ô%¾~þŦýk½­@B !½ÑªU¯¡,“ããüŸáE‡÷YYYªV­ºÒÒÓ¯Ùvøúùç:nÁ„´N:Z¹b¥ýýñãǵråJ¥§gØç-ÿæÕ©[W~¾¾×l;ÒÓRíSNï·XBú\ûvZ´h‘ýý¶íÛeµZµ}û6û¼ ê¹ö픕•¥~11ªP±’*T¬¤˜˜þÊÊʲ×óõó׬Y³uϽ÷ÉÏ?àªuýöÛoºûž{õÞ{ï;½}‹E£GQµjÕ®.]»êÌ™3ªëëç¯Ø3T­z ……G¨wŸ>WÝžûñǪYë~‡è±Çj×îÝö2gö?¯å]Ù¸åÒFé×ß~SZZÚ…„të65lØP[·^HH“’’ôǨQ£F;vœ’“’õóömÚ¾m«Ž%Ó¸qãÚÛ±s‡Ö®]£´Ô‡ù«¾ûNÏ<ó¬&½5Qݺ½ìôöM:M¿þö›Ö®]£ýûöÊËËK£F½Yປ7mÖÆ ?é×_v*5%UÆOp(߸q£V|ûýuPÍš5SLÌ?Â;³ÿy-ïʾÀ-Ÿzxx¨uëVúâ‹Å’¤­[·êõ´uÛVIÒ¢E‹ÝZZ¼d‰Æ+???ùûûkÂøñZ¼d‰C{cF¾ªkï‡~¨þý_ÕÂ… Ô¤I—¶oÞüùš8a¼BBBTºti>\Ë–//pÝKÛïçç§qãÆê‹Å‹Ê'½õ–‚ƒƒU²dIõêÕS»ví²—9³ÿy-ïʾ@a¹‡lß¾½z÷ê­Î;éÄÉ“ªS§ŽŽ?¡,“I .Òœ9H’RSSi_.22R©©ŽãtUû3gÎR»víT«V-—·-))Iõê?è0ÏÍÍ­Àu#""^§¤8ÞÉ-W®œýµ···²³³íïÙÿ¼–we_ °ŠÅ°/÷Ü}·$iÁÂ…ª]û~IRíÚ÷kΜ9òòô´—ûûûëèÑ£öåŽ9"??¿|Û_¶l©¾þúkÍxç—·-00P»wýîð£+»»R÷òí—¿¿óOñ-èþd_à¶HH%©]»v3f¬4h Iz¸AMœø–Ú·oo¯ÝZƒQZZšÒÒÒ4hð`µioÛ!!!Z¾l©æÍ›¯iÓ¦¹´]:vTLLÅ>¬ììlíÙ³W]ºv-pÝ¡C‡)-=]iéé2d¨ž~ê)§·¥ û_}€Û&!}ºíÓ:}ú´¾˜>ôP™L&=Ýöé’¹!Cäà¯ÚÔQíê(((HCvªý   -[úµ}ö¹&OžâôvõíÛGõë×Stt……GèånÝÔ¬i³×­W¿ž4xX5kÖR¹òå5hÐNoKaößÕ}€Âr/.êçë«ä¤Dûûˆˆp‡÷’äå奨éÓ;}zŽmä4fèåó´yÓÆ|·åòe ƒúõë§~ýúº®$õéÝ[}z÷.ÐövÿÙ>(*B !âúË©K-EÀh4Êjµ…f±Xd4 $¤€6ƒAÁÁ!JJL$ íÈáà åG.HHüyx”ÐÃ>ªU+¿Ñþ}{e±X —Y,íß·W ÌS“fÍe2eŠ)wB€ëÅÓÓS‘‘jѲµV,_¦¤ä$’R.3  V‹–­U©r”ÎÍ$(ùóòòÖwÝ­{kÖ’ÁÀ zcµZe6›HF !œc6›/þk"øR )€„R )Eƒ§ìâºñðð$e™²d6™dµZ €1 òð(¡%<åæöÏS¼ )«³™™:xð ¶nÙ¤ÄÄDÀeF£QªÿàCªRµª¼¼JHH¼™MYŠOˆ×šÕßëñFO*<þ¨V¿Jå}ýT±RYÆ7€„È[–ɤ ëÔ“›©nýú@…GD(((X˾þR½ûõ' SÜžÂucµZ•””¨à‚ Ð"+TPbb=- !œc±X¸xP$ŒF£, €„Ò<ùúù_“º×{Ûn¶mR9(ŠÅSv}ýüU­Z5mÜð“ÜÜÜìóm6›jð°þüóO¥§¥ÉºŠ¢¼’Ú¢ÚN(îŠÍRooo­úî;‡y+V¬PÉ’7߀èéi©ö)§÷€b”öéÝ[±±±ó¦ÇÎPß>}æeee©_LŒ*T¬¤ +)&¦¿²²²êÄΘ¡jÕk(,¸ÒF~u}ýüóÜIšûñǪYë~‡è±Çj×îÝNÇÉ×Ï?Ïå‹"HH‹…-š+55MÛ¶m—$mܸQjÞ¼™C½±cÇ)9)Y?oߦíÛ¶êXÂ17Þ¡ÎæM›µqÃOúõ—JMIÕ„ñò]ÿÔ©Óôëo¿iíÚ5Ú¿o¯¼¼¼4jÔ›.íƒ+m8S7¿ýظq£V|ûýuPÍš5SLL—â”×òE$¤ÅcC õêÕSÓ/Þ%6}ºz÷îuÕ˜–‹—,Ѹqcåçç'M?^‹—,q¨s©ÜÏÏOãÆÕ‹ç»þyóçkâ„ñ QéÒ¥5bøp-[¾Ü¥}p¥ gêæ·“ÞzKÁÁÁ*Y²¤zõê©]»v¹§¼–/Šx¸½¹§m×®&N|K‹—,ÑìѼy󮪓ššªÈÈHûûÈÈH¥¦:þífDD„Ãë”””|×””¤zõt˜wù–œáJÎÔÍo?Ê•+gííí­ììl—â”×òE··b5ì‹g‰zùå®êÑ£§ºu{Yž%J\UÇßß_Gµ¿?räˆüüüê\^/ÿü‡z Ôî]¿;< (-5Å¥íw¥ gêd?\‰ÓµŽÒb¥_ß¾ú;9骇]ÝZƒQZZšÒÒÒ4hð`µiíPgèÐaJKOWZzº† ª§Ÿz*ßõvêØQ11ýwø°²³³µgÏ^uéÚÕ¥mw¥ gêd?\‰ÓµŽ€Û›û­¶CC‡ ÑÀ×_WíêH’Zµj©!ƒ;Ô©W¿ž4xX™™™jÕª• z#ßvûöí£ØØXEG·Qrr²¢¢¢ôjÿþ.m›+m8S· ûáJœ®u<·—ÿ~ôA8p»8]zmdìÝ£ûùØwg)#=­@®X¾T^ì¬Ó§NæZÇl6ýBðõó/vãšž;wVS§LVÌ«ÆAPh¯ÅôÑ䩱>_p«ñððȵìÔ©“Z·ú5iÞ²@m'‹×￯3g#)KÒ9I™’NI:~qJ¿ìõ©‹åç.ÖÏ–d‘d•d“Ša—]À­„@B ç·îº@BŠÊh4Êjµ…f±Xd4 $¤€6ƒAÁÁ!JJL$ íÈáà åG.Š1wB€ëÅã„~ôQ­X¾L>e}U¥*w7¸Ìb±èà?µø‹ÏôtÛge2e”bq¸ðÔÇ,S–Ì&?$(0ƒÁ *QÂSnnŒÞAB 8ÉÓÓS‘‘jѲµV,_¦¤ä$Y,À%F£QÁAÁjѲµ*UŽÒ¹³™¥˜8›™©_¦è›Ít(á8àzòb4("ÐGÍTQ­ªAòò*IPHHçyyyëλîÖ½5kÉ` Ç8€‚±Z­2›M$£ÅˆÙ”¥?eèÓïþPóÇj«}«9p‘ÅjÕ‘c)úïªò/_NwV.+³ÙD`HH'.F.v§àKn?Y&“–¬Û¯VOÔUÛG«ö`µò2ºõé·;4¹kRÌñÓ$¸æ¬V«â’Ž+,È—`(´° _JÌ Ç )€s²-Vºé(FƒAÙŽFB )מ¯Ÿ?A€„’\Š3ž²‹ë†AÑWE¯V½†~ÿý7y–(aŸ÷ü /êÓÿ~bŸ••¥{ï½O7m”ŸoÑ=xçÔ©Sš0q¢V¬X¡ÄÄ$•.]Z>ø ^îÚEÿú׿$Iéi©Ééåï !ŠÈÙÌLÿüsµmÛV’´ÿ~uêÔI’Š¤Î¦M›ÖªñãÇkÖ¬YJJJR¥J•4aÂ>|X±±±ŠWµjÕ«êÕ«Û—IHH¸ªKóBCC5räH½÷Þ{JNNÖ±cÇrœwäÈ1B›6m’ÙlVƒ 4mÚ4ùùù©M›6zñÅÕªÕ?Ÿ„„5oÞ\?þø£¼½½5fÌ-^¼XÙÙÙêׯŸºuë–c|³³³s­›••¥¡C‡jÙ²e’¤–-[jôèÑòôô,p|€„7µ,“IÖÿ¨'7SÝúõ € ˆPPP°–}ý¥z÷ëŸoýF鵕––&???mÛºM 6ÔÖ­Ò¤¤$ýñÇjÔ¨‘¦N¦_ûMk×®Q™2eôÆ A5êMMšô–½½Í›6k㆟$I½zõÖ„ñ4bÄð×]·n]ÅÄôW×®]tÏ=÷ÈËË+×í¼””^Ùe×™m*Ž{ì1mݺUÕªUSRR’†ª&Mš¨téÒÚ²e‹6l(›ÍV$uròÓO?iñâÅ*W®œ>øà=ÿüózì±ÇôÙgŸÙç 0Àž´9cçÎZµj•|/»Ó~弎;j̘1š={¶Ìf³&Ož¬Q£FiÆŒêÓ§FŽ©-ZØ´:uªºté¢;î¸C'NÔŸþ©ï¾ûN¥J•ÒÛo¿ë¶L™2%׺'NTrr²6lØ ›Í¦~ýúé­·ÞÒ°aîi|àJÜžÂucµZ•””¨à‚ Ð"+TPbb‚S=-<<<Ôºu+}ñÅbIÒÖ­[õúÀÚºm«$iÑ¢EŠŽn-Í›?_'ŒWHHˆJ—.­ÇkÙòåí7V~~~òóóÓ¸qcõÅ⏮û¿Ÿ|¬ððpõ‹é¯J•£t_ÍZ}4uêTY,Mž}Z_LHz¨L&“žnû´½Nß¾}T¿~=EG·QXx„^îÖMÍš6sh§^ýzjÐàaÕ¬YKåÊ—× AoäºÎ^Ó’/¿TýRpH¨7iª³gÏê£>̱~¯ž=õïÇŸpøÑ™m*®{ì1¥¥¥Ù“¡V­Z)55Õáï>‹ªNaMš4I+W®TõêÕÕªU+=üðÃjgÊ”)5j”¢¢¢Ô¶m[Õ©Sçª:F£Q+V´?-ø’W_}UUªTÑO<¡úõëç™dçU÷7Þ¿¿¿½Ës```l( ·‹Ó¥×IÆÞ=ºŸ}w–2Ò ö÷)+–/U‡;ëô©“¹ÖÉoóËå5HøÍ4€x^w'óÚÆ¢Ü‡›y@õsçÎjê”ÉŠyu BÃÂøß Ð^‹é£ÉSc |¾Âõ=t›´RÃ{=£ºUÊ|têÔI­ZµRëÖ­ ƒmNèÍw>Óòé/s¸Âå½*®têÔI­[ýƒš4oY ¶ŽÅëƒ÷ß׌™³¿‘”%霤LI§$¿8¥_öúÔÅòsëgK²H²J²I ûR¤.OoæÄÜœ¬V«,X Ã‡«eË–À-ï–ê²›••¥~11ªP±’*T¬¤˜˜þÊÊÊrH?š;W÷×®­àP5xømÙ²U ,Tºõ¢Çk¨={öÚ—±X,=zŒªU«®Ð°pu¹øØsW¸ÒF~u}ýü;c†ªU¯¡°ðõîÓGY&Çáç~ü±jֺ߾?»vïv)Fy-_ñ9 ׌34uêTžJ€„´¸;vœ’“’õóömÚ¾m«Ž%Ó¸qãê¬_ÿ£–-]ªCÔÓO=¥gÛµÓ÷?|¯¯¾\¢¸C©U«VŠéÿÏ ë—F¾ß^yyyiÔ¨7]Ú.WÚp¦î¥Ùýe§RSR5aü‡ò7jÅ·ßèÐ_Õ¬Y3ÅÄôw)Fy-_ñ9KHHЖ-[T³fM‚€„ôfriìµ+§Ë-^²Ä>X¹¿¿¿&Œ¯ÅK–8&|oOQhh¨¼½½Õ½{79sF“'Mr˜÷믿ÚëÅ`ä®´Q²Ozë-«dÉ’êÕ«§víÚåRŒòZþVœpí¹ ²X­@¡Y¬V¹éEpKœŠË†æõP£KRSSi©ÔTÇåÊ—/o}iç+ç]>Èó¥ÁÈ/çæææÒ¶»Ò†3uó=¯A«‰Q^ËE<·ƒÁ ŠÁåt,9]ªVž€(”cÉéªR^V~ä"!½™øûûëèÑ£ªX±¢$éÈ‘#òóó+T›Zµr…‚ƒƒ¯KÎÔ½|]½(bTñÜ~<–¢oÖíЀÿ’É”EPHHoÑÑ­5xð͘+I4x°Ú´‰.T›—#?a¼ÂÃÂôçŸôöÔ·5烮IÎÔ:t˜¦ÇN—¤|d/êE<·OOOUôS÷èºúbõïZôÍe[¸³ÀÅäÅhP…àrêùôƒº+*XçÎfÒ›ÇÐ!C4ðõ×Uû L·jÕRC.T›}ûöQll¬¢£Û(99YQQQzõ²‡uÎÔ½4 {ff¦Zµj•ç€ìE£¢ˆàöäåå­ºw•ÕC5+óYfµZe6›HFon§K¯ ’Œ½{t?ûî¬2»bùRux±³NŸ:™k³ÙLô  8ozîÜYM2Y1¯ThX@¡½ÓG“§Æ2(:yxxäZvêÔI­[ýƒš4/Ø8Ç ÇâõÁûïkÆÌÙßHÊ’tNR¦¤S’Ž_œÒ/{}êbù¹‹õ³%Y$Y%Ù¤[lØ@ñAB !EþŠkw] !Å e4/ @‘°X,2RÀ‰›Á àà%%& …väða…„„ò#Ř;!ÀõâáQB?ú¨V,_&Ÿ²>ŠªR•»\f±XtðÀŸZüÅgzºí³ Š^lΞú˜eÊ’Ùdâ‡f0äáQB%JxÊÍÑ;HH'yzz*2"R-Z¶ÖŠåË””œ$‹ÅB`¸Äh4*8(X-Z¶V¥ÊQŒCWŒœÍÌÔÁƒµuË&%Ò[@ϪÿàCªRµª¼¼JRÀy^^Þºó®»uoÍZ Š À½ø1›²Ÿ¯5«¿×ãžTxxçúþ?ªÕ߯Ry_?U¬TVf³‰ÀN\Œ\ìNÁ—Ü~²L&mXÿ£žlÜLuë×' ,<"BAAÁZöõ—êݯ?)æøi\sV«UII‰  ! -²B%&&ÐÓ‚„À9‹…‹GEÂh4ò,RHH¸©ùúù_÷6¯Å: !à6MB¸•ð”]\7 Š ¨dPôÜ’Ãô´Ôk¶®¶=ãw4zô 6T½{õâ)åñ IDAT@HH¢Ä è «0ƒ¢_Ëä³°¬V«æÎ«±cÆhöìÙêÙ£E…AÑUâv-E÷õóפIoéwÞQRR²*Uª¤)“'+..NoOªøøxU¯VM3gÎÔwÖ$>rDCÑO6(ÛlÖÃ<¬™ï¾+???{›Î&Á?¬^-Ÿ²êÚµ‹}ö™V¯Y£FOMC‡Sxx„Zµj­zuë¹ÜÆœ?TçÎsN;uÒœ?’$ eËê¾ûjªÁèÁà êæWž“¾}û¨~ýzŠŽn£°ð½Ü­›š5mf/oÒ´‰^x±£Â#"5jÔ›š=k¶Se8«X¬P~ä"!½±ò|÷hþüÿ鿟|¬Y³f+..Ž#À àáQB?ú¨V­üFû÷í•Åb!(\f±X´ß^-\0OMš5—É”EPŠ9÷â¼ñWH>fÌ{ÙÙ³gõÊ+¯è½÷fë¡”ÑÝ];¿¤+¾•——G€ëÈÓÓS‘‘jѲµV,_¦¤ä$’R.3  V‹–­U©r”ÎÍ$($¤7Î¥Éã;vRpp°zõì©/¿üJ’ôÚ€êÚµ«zðAIÆr‹;§jFl,G€ëÌËË[wÞu·î­YKƒ€(«Õ*³ÙD2JBzýä6i^’_>0ø%¯¼Ò#À `6›/þk";~žHH !Å­ƒAÑE€„pþÃÆ èŠƒ¢Pü¹\/—E_±|™|Êú(ªJUînp™ÅbÑÁjñŸéé¶Ïº4(ºÕbQ¶Å"ÙlÒnn2 2¹l¢˜bPtE¡ ƒ¢›Íf%;¦?vïÒñãÇ ¤“ ƒ|Êø¨zЍPA@BŠâ‰AÑWE·Z,JMIÑÎ;Ô°aCEV¬L 'Y,Åýu@?®_/£»Q‘2; )ŠEp£d[,úý×_õï'žPÅŠ• ˆ ŒF£¢ªV—ÑÝC›7lP`` ¼K–"0€"Á-*À­ÏfSÆñ EDT ¡'ËlÎ&€"ÃRÀmÁjµÊh4ÊÆ vÁàî.‹Å*›§ŠwH$¤€Û]v· ›ÍF—]n"Ü!p=¹»»ç:¦MW×ëçç§§žzJqqq…ZOa¶R®±KÝvm6›Ìf³}’äðþòz®LW®#·:—Öc2™ôǨFzæ™g µgÖ]˜ R®1‹Å¢!C†($$DeÊ”Q‡túôi{ùÊ•+uß}÷©dÉ’ŠŠŠÒG}$Iòðð°ÿ{éu~ÜÜÜ !C†hÏž=öù9-yûW®'·uŸ?^ݺu“¯¯¯|}}Õ½{w?Þ¡Í÷ß_QQQ*Y²¤xàýöÛo|$¤Ü&LÐÎ;µmÛ6%$$ÈËËKƒ ²—wêÔI#FŒÐñãǵfÍmÙ²E’®ºÓê¬ÔÔTM˜0AõêÕsª~NëÉmÝÇWRR’öîÝ«={ö(>>^#FŒphoýúõZ¿~½RSSÕºukuïÞàºàM¸Âܹsõí·ß*,,L’4nÜ8Õ®][ï¼óŽ$ÉÛÛ[ÉÉÉJMMUDD„Þÿ}—×qåÐråÊiݺuE¾/‹-ÒêÕ« Iš6mš5j¤‰'Úë̘1CåË——$õïß_cÇŽåC ! (™Ífegç~ç2+ëBWÖ„„Ýu×]ennnöòyó>Õĉ5jÔ(ùø”Ñĉo©iÓ&Wµ“—3gþé|âÄ Íš5[}úôÑ7ß,ϳËçåW.Iÿý·BB‚íóCB‚õ÷ß;Ô+Uª¤ý½ÑhPvv¶Sû@aÑepqî!AAAAÚ¿ŸNŸ>eŸN:i/¿ÿþûµhÑ">§I“&«wïÞ.?Ôèò÷>>>Љ駭[·Úç¹»»+3ó¬ý}zzºÃr9­'§y:|ø°ý}\\œüýý ôp$HH(h:j“SIbçÎÕ»w:tHf³Y»wïVÇŽíå:uÒÞ½{e2™d³Y•í\þùçŸ.%¤'OžÔô鱪R%Ê>ïî»ïÖôéÓuöìY%$$¨oß¾Ëå´žœæµiÓF¾®””¥¤¤hÀ€zê©§HH$¤\ç”Ô©$1&¦Ÿ|°¾š7o¡ÀÀ ½ôÒKjÞ¼¹½¼iÓ¦êÐáÿ¬áÇëƒÞ·—õéÓ[ÿú×£*SÆ'Ïu•)ãcŸªV­¦M›6iîܹö:3fÄjùòå S£FÿÑ¿þõ/‡mÌi=9Í6l˜üuß}5uß}5¤¡C‡’n n§K¯ ’Œ½{t?ûî,e¤§¨ÑË—ªÃ‹uúÔÉ\ë¸òôA Ô•¥Ï-T×î¯Èd2úä£Õ¢eKù”-G0à&•×°c§NÔºÕ?¨Ió–j;áX¼>xÿ}͘9ûIY’ÎIÊ”tJÒñ‹Súe¯O],?w±~¶$‹$«$›ÄC·›Í&›ÕJ ¸In£ŒTt=€„€‘ò·p#R›MVRHH¸ž ƒ¬Vî”Åb•Ñh$R\âæ¦²eË*þèùûûÈHOU¹rå忯ˆqRœf4uÏ=÷j˦ª[¯¾üüd0¸'X­6¥¥¦hû¶­ªyÿý*Q“ HHp–ÁhPppˆî¾çýúËN:yR†q.™7åS¶¬î¾çnùùúÊËÛ‹ HHp–›››ÜKx¨R¥J Uv¶E6 ©Ó ½›Aî%<äååM0$¤„ÑÝC%Ý=7 žL !@B !€„P|ݰa_<ÜθC !@B ! H¸ßè ȶdËj±Êf³q4œàææ&£Á(ƒÑ(77â{+3à¼Ìy+âLœo—kÍššÍf‹?ªßûM|šòa0äãSVwÞ}*V¬ïÐ9Ä·ø3à¼Ìy+âLœo§kÍ–Z-ýýwжoß®†ÿ~\‘d4ùTå3«Eqý¥õë×ÉÃhPd… 2ä3â[üŽÜÐï+Μ§9V+â̵æí”f[,úuÇÏzü‰FЬP‘O“S¿€U¹JU¹{xhÓO?)0(H%K•"¾·È1€‰óçiŽÇŠ8s­yCöáF­Øf³)=#]áá|’\¦ã'ŽËœM|o¡c7ç ÎÓ+ŽqæZó¶JH%ÉjµÒ}±ÜÝ=d±Xd³Z‰ï-vÌ€ó2çip¬ˆ3n§kM÷›a#xŠÖÍß5ëÖéÕ×9Ì›0f´žlôÎ Þ+g)Æ!…$);;[“ÞžªW_¤ÆOüKïN›¬Î/´Sh@y½1t˜ºö詃ýE à6sï3ÓT-z²ªEO–Élqj™—îpº. 磯&7¹–l#׈ÉlÑÇKw8]÷ÒwÙ½ÏL#x7wBpûÚ²m»¾]¹R˾ùÖ>Ëj±È§LYU‰ªª»î¼[3g½«”Äxµ}îÿ$IO·‰VtË–º³Fu‚·¸,s¶š4o¨ËÖæ{×Âf“ÆÌY£—þ¬öï#x×Í&ž³FŸ,ýY[=@@nb± 7ê¿þÖ”þÍd4r/¨hÿØ4úƒÕŠÿû¤†vùwžcpÚl6É&5iÑP+–¯%x$¤…Ó³wed¤Ë`0ÈÏßOÓßžÁ‘tÑkÖjÀ Á=|ˆZ4m,Ÿ;tòÔiÉ*Íœõ®¶lÞª»ï¹KmŸ~FíÚµÓ?ü ÿ÷œÎœ9£””uèØI³fĪ~Ý:nqCþÑÙÙVõ™´T{§Ëhp#h×Ð¥Xï‰K'Å€ÅjÓ/SôÂðÏõÁ°6*éŘäEÉhpÓšŸã””ú•b¶”»»¡Ðßg¸ÍR›Íær?ñôô47A‡ÒsÞ§Ÿyâ;`Ð`Íx{¢ü•qüEg›Í&77©æ}UµûCj?hæŽzZ¥¼KäX7¯÷¸qŠõO×òw÷[¿7sÅŠ••’š"///ÝqÇŠTHHˆš4m¬ððpýûñ†ªX±¢öíÛ§*QUuüD†<<<©²>>Åòä(Z)gÔªÿ§:c’ªV­ ›ŠïÝÑ›ý<‘v"S­_§Óç-ªZ-R6Ãõ©ÕjUÛ¶m5f̘ëºlqgusS¥Êòð.¥–1Ÿêhò >×E_››ªV­ Ó&©uÿO•’q†ïâôÝ{;ïüäÉ“5dÈ;V¯½öšCYQþ*w3þÊ'IÞÞÞª}ÿ:DÙÙÙ ’ÑhT•¨ªªP¡‚Ξ=«S§N) @ž^ž ”ÁÍ ¸#qÊ8ž‘k»'OžÔ¨Q£´téR;vLwÜq‡yäõêÕKÿþ÷¿oØþf3(©CÇ2ôÜEòó+«Ð°%fœS°oIyº÷Ùé¹.çYÂ]¿/ê›ã™5j¤3fÈßߟóÄEG«ýà…*ç[V¡aÁ:–zVa¥ån4è®¶Ss?×—ðÐÏó{åzìj¼  :uêhàÀ.ïCa–½™¯ÃþÓã#%¤žÌµÜl¶Èjµ*éøy‡È`0¨Í«óõÉè§uW¥À<Û.Škªëõ¹¾Vq¾÷ÙéÊ2åÞn £Qf‹UIçªøc‰jó©þ7öYU +ïRRèææ¦;î¸C+VÔ“O>©˜˜˜kþ=Äõé-2ìKA–·Z­š={¶¦L™¢éÓ§+&&æšÞq½‘ÝrZ÷5jhÅÊïU÷ZªT±²ÜÜÜd6›UæŽ2Êζ(<ÿüóÛ:Þ—ì:¬Ž#¾PXx|ý}õ÷‰s²Z¥ã§³ô裵¥œw“,«6lø%Çö ïÉ“'øºÆÕe‹òÚ©¨ÚÊ©ã§Ïëûï”§W‰—qssÓéó™³­JÎ8'_¿r2 ê0x‘Þy½¥ÔŒÌu}ÅíšêZÄ9Ë”­G®õÏø¤9<¹èÄé¬ I鉳  ”Ñݨ6æë£mT«ZHŽÛ–ÛwPff¦8 O>ùDµk×Ö?þ¨ÈÈHN ×ÐmûW½+W®T¹råÔ³gOùúújÕªUåÿüÁùùóçÕ­[7ùúúÊ××WÝ»w×ùóçs¬{å¼Ëÿ½¼žÅbÑ!C¢2eʨC‡:}ú´ÃòÓ§OWÅŠU¢D‰"ßÿö϶՚ukåQ¢„ŽÆÑê5ßk×îßuààüë€vîüYÛÞªÝ{vkóÖÍÚ¸iƒŽŽÓñŒ ýœ¬y ¿PóÆÿɱíuëÖiüøñªP¡‚ŒF£üýýÕ¶m[­^½Ú©˜]z=yòd…††ÊÇÇG]ºtQVV–KåWÆïÊöß{ï=U©RE¥J•Ò}÷ݧ7ê¿ÿý¯jÔ¨¡’%KêÐîÝ»ošc7‹ÕÛªÓÈ/¬2åÊ*íT–.Å~êœY i™JHwœŽ¥]˜lny_zèí·ßÖ÷ߟç÷«3ßÉ®~ÏßLçéKÖïˆÓóÃ?WxDˆÊ”+§ôÓÿÄúd¦IIç”tüê)ùø9¹¹åß}º¨âm6›õÚk¯)88Xþþþš:uªÓ±ÌÊÊÒK/½$………iÊ”)Ûè̱xÿý÷e?®¿ýö[ž×aEÎͨ´“&%?Õ””qNÇO_¸F±Ú¤ÔS&•¼ãU‰ŠTï·–ê«u{rm¶¨®©222¬ãÇ;ÔËÈÈPhh¨Ž?®¸¸8EGG«\¹r*]º´š7o®”””›"Î67ƒ3Î^˜Ò3¦„´L:w!™´Z¥ôÓY*S¶œ*D«ãˆ/´zÛA—ÖUªT)Õ¬YSS§NU§N4bĈB}/ä·›õ{‡„ô2½z÷P‡çÛ_5]úûE777ù”ñÑsÿ×Îaêð|{õêÓ#϶gÏž­ž={J’^yåÍš5+׺ÇWRR’öîÝ«={ö(>>ÞáÙ—K¿¶˜ÍfûkIš0a‚vîÜ©mÛ¶)!!A^^^4hò۶mÓ¶mÛd2™Š<¶MŸ|R;ýMý^}M›·lSdd%?^§OŸVJjª|Ê–SZj†öíýS'OœTv¶E¦,“6lÞª}ûÿ”»Á WcúçØöC=¤W^yE[¶lѹsç ¼?ýô“~ùå8p@)))9r¤KåùÅoõêÕZ³fRSSÕ¾}{µhÑB+V¬Ðwß}§´´4=ýôÓêÞ½ûMsÌàfð¿¿iÀ´•ªT)\Þ¥ïЉ³ÙÊ馈͖ód±Xó¿¶Ï!‘ºòûÕ™ïdW¿ç/w3|ç/^½[1“—«b…py—.­“gÍWÅ:·8[­R¶Å¹»UEï7ß|S{öìÑöíÛuàÀ;vÌéXŽ1Biii:pà€vìØ¡µk׺|,Ö¯_¯õë×+55U­[·¶×ܮÊšÕj•ÕfËõx\éäÙl<½T9ª‚Æ|°Vïç2ViQ]S•/_^mÚ´Ñœ9sæÏ™3GíÚµS¹råÔªU+õéÓG‰‰‰JHHPÕªU5`À€›"΋ó±µÙ.Ä׫ôª\9B¯½ý­æ¯øµ@ëíܹ³Cò_Ðï…Üâv3~ïÜn§K¯ ’Œ½{t?ûî,e¤§¨ÑË—ªÃ‹uúTîýé³²²ô¿yŸªWßY­9Ÿœ^èø3zl4›ÜÜÜ”˜˜(«ÕzÕ©ÍfÓ;ïÎÐÿæ-̱ݸ¸85hÐ@‡’———Ο?¯J•*iÓ¦MªP¡‚ýˆKÿ¡"##µzõjEEEI’8 FéðáÃWÕ½üŒKór*ŠŠÒ·ß~«ªU«J’þþûoÕ®]Ûþîáá¡#GŽ($$$Ç}˜9cº¢Û<¥²åÊ8¾µl —^h¯U«VéÌ™Lù”÷“»‡ã¯-Ùf“,ÙÙ²X²•mÊÒÉ“'¡¸£ Ú±ycŽíž8qB“&MÒòåËuèÐ!¨U«V6l˜Ê]Ü^gb¶oß>U®\Y’tðàA5jÔHqqqN—_¿+ÛONN–¯¯¯$éìÙ³òññ¹jž¯¯¯ýp­ÜH¹7j<õ¶šµ|\ß|½Zï ÖK£«ZµŠòòöÖ©sæz‹Úþ¹´°Ùߨävé2〠*寧þCû–ôÏñû955Uo¼ñ†Nœ8¡Å‹çúýêÌw²«ßó—oÇ>Ooþý¨^¶H5ªW–»§—ΜÏvˆµ›ÛÅ(_vAn»<æ6)°¼·vü¼[{—ôÏõ|[Tñ®X±¢¾ûî;U©Råª}ÉoÙ *hõêÕösútçwºt,þþûo•/_>ßãz-ŽUÝf)²R„N³Èjµ]üü»9v[w»p¡m³¹Ù¯¼Ý$•ör—›%[»÷Ð䘦jñ¯×äšÊl6kÿþýjÚ´©öïßoÿ{ÏêÕ«kÍš5Šˆˆ¸j¿Îž=«¨¨(%&&ÞÐ8Woó¶jÝ—ROœ¿:ûWŠÍþæB´mÿöâ?e¼=dÊ:¯½{éƒamôʸ¯Ô¬Õãúféjí]œówÐåÌf³|||töìÙ/¸·ëq­yêÔI­[ýƒš4oY sE±x}ðþûš1sö7’²$“”)锤ÿoïΣ£¨ò=€{IgßW²²…}I ‰¢0"8ƒ@Žc€ ”=à2#.ã( (›(Λóf|oq|n£( Ê ‹‚$„’ÈB6’ÎÒUõþHwQÝé5龟sê$ÝÕ]]õ»Ýuï¯ï­Û•Æ¥Bñq½Þøx€h*´N¿†Ô`h¶{1¯$I(..–¿Á3÷VþoJJM·M›š­nsË–-(++ƒ¿¿«ûŸ{îÚÌo¦ç_¾|11Ñò혘h\¾|ÙlûÖ^ËÞúââb 4¨Õ7”ÊÇ………Ú<wÅWëá??$%'áҥˈ‰AQQêêêPPpñ q4pöïÿýû÷G~~>FŽü Å6÷ÍÇÇO=µO=µ’$!77›6mƬY³°oßGNÇ,:º‡|;:º.]ºäÒzkñSÞö÷÷“okµ«÷ ùöõ*3"¢®Z/èÌ£ñ·Ï~BtL4$AÄU½k½!zoÕ:À4lÍßßwÝu'6mÚh÷üêÌ9ÙÕó¼r¿:»ž5 s~3ÿûõDÇÄ@h6 ¾ÑµÉOlĺ#â]RRbÖVr¥ÍséÒ%³:=&&Úå²ðóóuª\;¢¬$IBƒ¾ uuÍD篡ôöÔBò.còmý11¥W«ýtW›ª©©½zõÄ€ðÞ{ï!=}ÞRRR‰¦¦F>ü=Ö­ËÆñã'PWW×¥â¬×7¡®¾Á¥íøz{ ¹(¹x s~3£DÚŒ­}/,,Dhhh»Ï ÎÆífmkvß!µ}t€V¯YeõþŒŒ¹P©Tعsjjk R©ä"##­n·¡¡ýë_ñóÏ?#!áÚ·AçqÇw ;{-¼¼¼ÌÛˆˆ wïÞZzXÃÃÃåõZ­uuuðñiùM©+W®˜=fyÂ? IDATßòˆŠŠÂ—_~Ñê{Ïqw|M’F£ŸŸ"#%ôí×Wë®"(8."00:‚ ȉ¿ÚøƒçÖz§­éÛ·/^zéEÄÆÆ¹3eÌÏŸ?ˆˆ—Ö[;nWÖ[Þw½ÊŒˆ¨«ÖË’$añ¬Ñð÷ñÀÖŽ"*º|½´¨kp>Q2‡ìZ¾ÆÕ«µ.³ÛzNv¶nè õô“¿ _/ÞÝ‘=¢O­KI©­XwD¼£¢¢ŸŸ/&s幑‘‘fuºiZ{Ëâz–•Á‰¡èJ^: |tj\,,ÆÄ”ÞX7÷v§ö³­m*ÓÿYY ±aÃ̘1o¼±¯¾úª¼îá‡ÆóÏoÀĉáïï«W¯¢Gè.gWãë륅N ž¿€ßß;ó§j5S¯3¿KúÎ;ï`üøñn}/v…óNWÓ®!•äYû,——ÿôgìÚùv«Eß —/š®«¯Ã®oã­»°sû[رm'vlÛ‰çŸ{Áê6÷ìÙƒ¤¤$ÄÇǙݟ‘#G`Ïž½f=­’$aÆŒéX¾|JKKQZZŠåË—#=}†¼~ÈÁØ´iêêêQ\\Œ%K3{~`` rrrÌ^/#ã,^¼çÎCss3~úé'Ìž=ÇlC[qqíhýùÊ €A@tt44 ‚ƒåÉÀËË  …ªªZ†b766ʉªrÛ“&݃½{÷âòåË0 (,,Äúõ둜œìtÌ`åÊU(++CYYV¬X‰™3gº´ÞZÌœ]oí¾ëWfDD]§^¶lI’„Ù÷ÇòßÞŠ’¢bH¢>ž×¾ßöÔiäç‰`ó%Äß !þ^h6ˆ­Î—Μ?-ïkË9Ù•º¡³ëiÓ²`F²Ò“QR\ Dxé4cmŠ·µXwT¼|ðA<ñÄ(**BUUV®\éôsgÎL—ëtÓ¬¿í- Gí0w–4 "ü}tôóD•ŲÜ<4*\,ºˆw&";#Íæ¾¹«MeúÿÎ;ïDMM-¶nÝ__? :T^§×ëáéé N‡‚‚,Z´Ø¥¶SGÅÙ”úyš-¦ØúyÂS_oO- ЏXT„ÇfÁ¼i#ížÏ,£®®ÇŽÊ+°{÷»ÈÎ^Û Ï;LH­~ âÊ´ôìyzzºüÜmÛ¶cÞ¼¹V×edd`ûöí­ |ݺuˆˆˆÀСÃ0tè0DEõ@vv¶¼~óæ×°oß>ÄÄÄ`„‰HKK3{þ’%Kššÿù¾¥K—b̘[1eʽˆˆˆÄ#dàÞ{ïuûÎ2¾‚ À`0ÈcáML ªN§ƒ¯¯/hìAU›õ„jŒÓn—”” ¾¾‚ ˜½ÆÊ•+±gÏ^Œ•„ÐÐ0L˜0uuõؽû§c·Þ:£G§`àÀA ÁÚµk\Zïî„ôz•QWª—m5à¦OÄÓóÇ£ìbË妡V£Æùsù8—“g¶äåœE^ÎYœË̓JÕþ„´-çdWê†Îª§­-NŒU³Ç¢ôb DÁO–X{hÔÈ?›×*Ö¦xŸËÍTîIHÅcÕª•èׯ?n½õ6 <±±±N?wíÚµ ÂÀƒ’2ãÆkwY8j‡¹³¬<4j"?7¹yÈ·\ÎæAclFé´j¨$¥/bÞ}#°xÖh»eá®6•r› >Š+Và±Ç–˜Ý¿eËëXµj5"#£pÏ=“1fLŠKm§ŽŠ³Jœ=‡c| ,â|á\>´µœì ÍM(½xë2nÇý9u>ÿ¢wïÞxôÑG¡ÓyâÛo ..®ÛwºšNŸÔhþ£ ]ž%êѬX½j ´Z-Ö?µ;·¿åÖ ˆ¢ˆÐÐ0TV^é²÷Î[;º0Ü2¾ÍÍÍÐëõ(++ÜùbÑ‚ |þùgHKKCyy9ÆMÅ•Ê ”––âÓO?Å!C½{?À„‰päû#èÛ·¾Êü·C› ¸í‘·äIŽþ%ó¦‹1ÀIl| Ò¾Œ^¥R9}-£³Ž?ÞêzÄ÷›nóø ôz=**®È *ùºY{jjªáëë AjTRRøùùÉÏ rœlUUU:½ïíYODDî­—•=¢(BEŒ…WŸ€¥¿€§_ <_PJ¢j•Ôj5ÔjµÍs¸£zÃÙ:£;ÆÛÒ]É=áé1Ë7}¯€`xz·Ô½¢`0¶‰`œë¡ed“iD“+õ¥µòèîeÐÞ²R~ñbú\\»œ©e6ØfƒC³úª d?’ŠI·Ýâ°ýêÎ6Õgk_l™ÎAÍ’`lߊhÔëÑxµ //¹I‰‘hll”Ï?jµÚÊO&INÇ™ŸƒŽÕ¥'5²§±±’$A£Ñ@ù¤ëwß=IžÍìÆÿP›Ç·©©ƒz}ËÝÿy V·aši BB‚QRr@ËQMMMò]Nõ*;W&¤DD]«^6š!‰ÍEQžC@ôñÃË‹R±üõo ˆ-uI}}=ƒjµZþ_ÉQ½ÑÝÏõŽÚA¦ËmLñÞ'Z|;–¿þ/ˆR€k™’Qe¬mÅÝkåÁúÖ~Y)ËGù¿rŽF}k«±>c núúúVåc™œº³MÕâlùYú†–Ž•úº«êkñ§¬4ôm™Éò³`ù»¼®´]ù9èæ iË“¹VÀ1Ñ1Ø´y#DQDPPP˘c7¾I.•\¼ö‰¸ñ?ÖfÇ!‰"4 >Þ(+¯DN^>âccáçë /OOhÔj·ÇªòJ…Ým:ZODD››š ªƒÁ 7 MKlˆ^ÈLÁšG ˆôõõD´ÆÆ V«…¤ÕBEhµZ†Ù‰xK’$ÇÚ`0Èÿ÷‹ñÃK nÃÊm‡ZÒÚZ¹GT£Ñ@­Ñ´Š»F­f¨; ¬”å#—“ @T$NÐXS‰õ$cxï 464Èee*QàáááÖÝ)ÎÊd_ùYhlh‚ J®â…)ˆ Ñ¢îêU«Ÿ…Võ²É„Ôü=çÚbõÊÕú­EHh˜ü[¯£íZŸiŰã„†"}ÚTücß~ìÿ¿/ÄþýQ[SÓ2„D­Æ¨‘I-ë{z£üJ%Οø5Õ5è{Ë-HI‰=¢ O.EDDÝ¥-hýœ.Š"T¦Æ¡±HnŒ‹"z„xâÅÌd<µë(A„$Š ’/¯EÑ8tŽu†³ñ¶\LqïÕÃ/eŽÆº·~D³ÁµJmö[í–qgÌÝ_VÊ¡ëÊQ’òs!ˆòÖá‰YCÐ?.àÚh4•yù˜Q–“õÏ„e¬•Ÿ…ð o<ûHƒ<|T0^²ÈX3!µ|Ïu½Y¡*Ê˺͛Õ2¾-×ó„…†B£Öà÷ÿÿ>vGÃGÿƒšÚZ³!º@Ëõ¥>^^ˆˆˆÀcoícRàãí øûûC£ÑðCMDÔmÚ‚­ëåÿñ BËãd–- =• jòÐÄÞ¾¾xeI¼½=¡ÕjÌz‚´Z-ë ÚA¦^OI’ä^eeÜûƇá•Åãàëãsí÷ØÕjhÃMqgÌ;¦¬Låcm*µZ#Çý…GoCt˜Ÿ\>jEo6Ëȹ8+? ÊXÃK…W—¤!,ÐK1+¯õÏ‚J ‚„ÿñ…<û41!5e||C\Çøš>Ð>>>Ðét @TT&OºZžÁô6ÝEQþ¦O¥<==¡Õjåá%,C"¢îYoØ6[¾mš­ÕÔ¤ìµPöHøùù™M&bªKZ6Ïú•vJ¥’G7yxx´Šû-qÞ‰ã~½ËJ™P*ŸÝTF}â[~Û]Y&¦ëGY>ÎÇÙôYðððÏA^’_ïVç [Ÿ…ƒ;çÈaÌ™*ßs|CtB|Õj5t:t:^ƒåGDÔ]ë ­æÚ/Ä)|®^ʺ¢ýí Æ½ë—•+H±|Úç¶~”3ö2öLHå¤Hd©ËDãÄDŒo÷+3""Öˬ§‰eÅ83Î7S[³ÓR•J…àà]@¨b!rìJå„„„BegÆ<Æ÷Æ+3"¢ÎÄzƒõ4ËŠeÅ8³­yS%¤ÆÇÁï¾Cʘ[Æ©®$ ååå8òýa$%†§á¶ŒïWfDD‰õëi–ËŠqf[ó&KHÕèÝÆ DZEuuõµ©°Éæ5(8Æ CXX¼¼½ßnTfDD{¾b½ÁzšeŲbœÙÖ¼‰R@Î}úöAll ‚’(ò]å(jj5tðöñf|»]™uêÙŠõëi–ËŠqf[ófJHMY½¾~Z¾“_""b½ÁxËŠqfœo2œa…ˆˆˆˆˆˆ˜R"""""""&¤DDDDDDĄԹªÕ9+Q—!IÔê®Õ'Ù!{„ò²R–8QQS]…À à.µO2§râÀAøö__¡_â‡@¥R±ô‰ˆˆˆˆˆ:$I¨ª¼‚œÓ¿`DRR÷OHƒ‚1xØ0äæäàäñã¾KDDDDDÔIÔj5ƒ0dذ›£‡ÂÂ#ÁÒ'""""""ëÉ2C@DDDDDDLH‰ˆˆˆˆˆˆ )R""""""bBJDDDDDDÄ„”ˆˆˆˆˆˆ˜1!%""""""&¤Î GhXøMpËcut›ÜGEÌžó{¼üòŸ """rªÝFÄ¶å šš«û¦M‡$I7]Ú•ŽñFŽ÷éÓ§1ëŸÐñ =1ëpêÔé6mkÝúõ9rž|ò VPDDD]´íd¹t¦Šò²nß.è¬}ÏËËÃŒô™ˆ‹Gl\ÿü Œ—ЍÑ>b$þò—ÿ²Û.hËþ„†…c×Ûocä¨Q胱ãRqøð÷øïÿþ’G§ÈÇ­-æÌ6mÅÍÖ¾Û:V{e㪜Ü\<þøã D`` žX¶ 9¹¹m~oXƺ±±/]Šž½z£g¯ÞXºt¶Ë*++ѯTUU™­«¬¬Dÿ‰¨ªªrswŨ=ÇÑÖ²ì– ék›7ÃÛÛ ‹-‚(ŠvŒ™3Ó!Þ{ÿ}ùþ÷Þ‚ àþ™3Œ×·lÁºõë‘2f òÏåᡇijÏþo¼ù¦Ùöôz=~÷-Š / {íZ¼û—¿`õš5fQ©Tm:.{ÏS~£QQ^Ö®o8æÏÏÄ?þˆÛ·!ïl.–-[ŠÆÞBgŽÓÞ¾8Ggctúô/8tð;”—•ºå½ó¯¯¿ÆÌôôV÷ÏLOÇ¿¾þÚì¾Cá»oàØþ²Ò2¼ðü òºW_݈cÇ㫯¾Ä™_NÃËË Ï<ó¬Ùóþû(¾úêKyß|ð!,X‰œ3¿à—_N£OŸ>ÈÎ^gSËx:ó:ŽXî]óÝwßá“ýã\ÞYL™2K—.³[:ª›7lx5558vì?øöÛøþð÷6_{aÖB¬Z¹çÏ`ßGâÇ£?Úm´eà믿ÁG~ˆsyg‘>cf=ð>ûü3üïÿ|€üsy˜:u*–.[æRûÃVÜlí»­cu§»ïþ6oÚŒššTWWcã¦MøÕ¯&¶y{–±~î¹ ¸Tr ?þp?ùEÅEذáy‡Û Æo~ýì~÷]³ûw¿û.ÒÓg ((È-m>gµõ8®gY¶—ʸ˜þWÐ,^¸ aó–7q¥¢¼]ßb™Þàü1~7{žyæi,ÊÊ2[gùØS§N#5- &âÀ7߯¥¦áôéÓøöÀ7HLLĈ‘#qáB!~üázõê…êêjô¾¥âñï£G­î ˆˆŒBhhrΜ‘_W£Ñ ôò%«ûmïØ=ÏÖv=ÎòvBÏ^hnjÂ'ŸìÇ€ÄDxêtvãnë8­í‹3qtåXsΜAhhˆÛÞœ‘Q¸X\­Ö|d¹Á`@Ll._*‘_ßt pîÜ9L½oNž8>b$ö¼ÿúôé(++CjÚíøåô)ùù?ÿtQQQ6÷E¯×cøð8sæù9–ñtæu¬½”qt´DDDÝ•­$e=y67ÁÁÁrÝܳWo³ö€e=ê¨nWÞçêþ„†…#7ç BBBäcŒ‹ouŸò¸Ù¦£¸Ycu—’’Ü3y qqqøç'ûn9jC <}øôîÝ@Ë5«SŸNžpØ.ËÍÍEúÌûqôÇ Õja0úðCÄÆÆ:Œ¹;> ¦}kÏqtDYbÇöíxí­h P @¥q©Pü_c\¯7>Þ@ €ë4Ëî”)SðÐCbÆ瑓“c÷±&bܸq8uê4Nœ<‰'NàôéÓHMMEbb"àâÅ–PRòh„†…£÷--o†ÂÂ"y;‡ƽ÷þ ={!,<‘-oÐ+W*o¨“óšÕ«¡R«qç]»&LÄ׊ÞÁö§3qtéÃãÆdÔô UYYë/ÊÊÊ䓲I||¼Ùÿ¥¥¥f'¼”1·ÊÃQ$”‡ßšXžüŽùSî½qñ  Gl\<*®\qxbuô:Ž0%"¢›™©§N¹X¶ L¼½½a0ìÖ£ŽêæÒÒRÄÅÆÊ·ãââlîÛîwÞÆW_ý ·ß1£F%៟~êr½îL[AÙÆñöö¶zŸò¸Ù¦£¸¹ãX]•µh1fͺçòÎâ\ÞYÜÿL,ÌZÔæíYƺ¬¬ Æ/ !!Áj»Òš¾}ûbÀ€þøè£}€?ú£“G#Öø^qG›ÏYí9ŽëU–íuÝ~öåù Ð#*Ê©7Zæüy€¿ÿýïøÛßÿnvÄÄ´d÷¿œ>evÂ*+½vÝiFÆ\:|Û·oCÉÅbµ|ûby© òPâ’’§§­ÏsUfæ|äÍÅgÿ÷)Ö®]ƒcÇŽa~æ—Ógâx=ÕÒíiixÏžV÷¿¿gnOK3»ïÂ… òÿ………¿ö-kdd$~:yÂì ‰}$#s3æâçŸN¢¼¬ùçÆÔÑëhµZèõzùö .µ£º9<<…EEfm[FŒ¿þõ¿sæ¼ðâ ­† »c:âÛÂÇêÈáC‡°lÙ2³kH:ä¶í‡‡‡›µÏŸ?°°0§Ûe 23±mûvÀ¶mÛ‘µ(«CcÞQÇq=Êò†IH}}}±uë›8qâ„ÃÇNš4 ññqسg/öîÙ‹„„xÜ}÷ÝŠ„5ðô3Ï¢ººW¯^ÅçŸô™÷›%Q€ÆÆFüÁÊ,X¦áŸ~ú)êëëñâK/9u,Îc†¼î÷sæ`éÒeÈ/(€Á`À©S§1wÞ<»¯ÝÐÐ//Oxzyáü… f×j@`` Ξ=kvŸ£×4h^} ôz=JJJðÄ“O²¥@DDÔÕÍÓ§OúuëQQqWäù"¬™7o>Μ9ƒææfH’A0Øm´e:â±¶ïöŽÕVûÎUýû÷ÇÆQ]]êêj¼òê«` éӦ݇5kÖ¢¼¼åååX½f ¦OŸæt»lüøñ¨­­ÅÎ;áëë‹¡C†´+æmÔ¨½ÇájYvë„’““±téãŽwJ­ÆÜ¹s[_QŒŒ ¨Õ×v53s>^yåÏ8yò$Äà!C±cçd-|T~Ìöm[ѯ_?LzÆŽKÅ-·ÜÒêu6oÞ„~ýúaÎïAjj’“’:gž·üÉ'ˆQ£’ÚõûA?ü[<ý̳èÙ«7~ý›©=:;ŒßÖ8{œ¶öÅ™8¶5FîЧO|ðÁØ¿?Œƒcß¾}ØûÁÞVÇ™2&cÇŽÃðá#‚Õ«WÉë{l ÆŒIÁ´iÓù™™˜2yŠý2Þ´ÙÙë©SïCÊè³õ‹²²pç]Ìâéèu6n|û÷ïGÏ^½qÏä)HMMeKˆˆÈ¢ÑîÎß`tT7¯Y½~¾¾:ln;IIIððð°º­{&߃ßÍžƒ¸ø<ó̳ØúæV»í‚¶ìOG£#ÖöÝÞ±ºË¶m[qðà!¹÷ý÷G°}›û^'{íZ„G„cTR2F%%#** k“›:Ó.[™‰ÕkÖb±¢w´£Ê±£Žãz”e{uؤFD׳òâï–Q{åææbÖØœ$“èfwÃNjDDDDDÔ­ÍÎFUUJKK±nÝzLž<™A!ºŽ˜ÑM+>.£SR”<X½jƒBtiºÑq¸.µUfæ|dfÎg ˆ: {H‰ˆˆˆˆˆˆ )1!%""""""bBJDDDDDDLH‰ˆˆˆˆˆˆ˜R"""""""&¤DDDDDDÄ„”ˆˆˆˆˆˆˆ )1!%""""""&¤DDDDDDDN“¬,°ò— )uMLH‰ˆˆˆˆˆÈ–½¢ÖzK•µIkoeqQ!CMDDDDDDJ¢1Ñm$¢Náµ™.Éz”a&""""""K‚bM‹Ý$TIe\Lÿ«hŒ‹€7_þ„l¼ÀÇø81ÁÕ·£Ü.Ýx”½œ¦äÓ  €@=€Õ*T¸b¼]  @€F‹$V¬÷Zvµ*3]ƒbi6î„) …ñ1j&¤DDDDDDÝ2! i³q1刖 §Ã¡»Zã*X÷+YÉ„M/ÞdÌrMɨ`ÜžZqR"""""¢î‘”*óÂf´ô|šz?• ª21ílÏf©­d´Y‘ˆ6À¼gÔ HH-‡Ñ›*óCeBª·’”`ÞSjkò#›“™(XIF‰'Œë›qmè®F‘2%"""""ê> ©2G4uTÖ¡åZÒ+I©ë?’ÖAækyѪµd´ œÐˆˆˆˆˆˆ¨;'¤€õ‰L½¤õ¸Ö[Úó^Ò6÷*/XÕ((Ö5ðP$ªjE2Ê„”ˆˆˆˆˆèÆOH•ב*‡í*“Råð]S/©Û=¤pÔCjÊ|5Ʋ¦«LF5 )˜u‹„ ©òÒÎF\¾kmØ®ÃRI‘Ô|¬'Cõ¶hÑbi¥R‰c•*øÓ¡Cï?¥¬,ó'„â¡DzfMK{./"ÝqcÇLbÅÇ—*Ý‚Û5¿PºÅ ôòB½>}úÔj jµŠ”»)\½zFƒ hÀßߟ„„ù¢B<ÒÒÒÒøæ›oIKK£Gî<öØch4bbb?¢÷YÞÏ›7nâÊ•+<óÌÓÔ¨Qƒ[ññ;ðÐó]œ@/Ï´ioÍÑ£ìÞ½›¤¤$†j¶|åíC¾ÿ„â?ˆóÌœ–¶çí?JwÜØ±Ú ÎXP© C7Ñ€Z­æÏõ Ñ¨Ñ¨5xxz`ckKbâmΜ;Grr2jµW7WìíìèØî ª”Á/¥BQìÝ»;wîЭ[Wêׯ¯DPPÁ@O£ÑpèÐ!N?ÁÝÔT«8Êã­Zi‡z,Yò.=zôààÁƒÜMMÅÕÅ…öÚéS§HKKÃÝÝnݺãëëSê2EFFàåå…R©ÄËÓ“ú딥4ù:rô(;þÞB¡ÀÞޞǫE§N°¶¶.u —·Ž¥¥%Mš4f÷îÝÄÆÆiççåûí·§*KÞ¼¨¨(öìÙí[ñh4üüühÑ¢9AAAz×Ï›îÕëIù¤Ù½ììlŽ;€·Î¶E}QæÍ[¿~©©© 0€  @bcã8|ø0ós=ê:/¿ô"W¯]ãßÿ`óæÍŒ5€ÃááìÞµ›à†ÁtëÚ•ðÃáìÞ½…RI‹æÍMÚ¯©ùBˆJé™5-cC,Ë2ÝüÁž± ²PºEz9ÙYú¿ Õ*²s²Ù´y#jµZ«»QÑ1XZ*ÉÉÎA©T¢T*Q©Õdd¤£À‚‹—/SÕ©Š4\¦÷œ›7÷NS;;;4 v¶¶Ü½{·Ð6¶¶¶h4! yÛåO·8çâ¢Öõó«ÎІp÷î]®^»ÆþýÈÈÈ`ßþ04¨_ª|ÅÄİ?ì ñññdggkçgddíÁ3¥l“&NÐ~O:uš]»÷°cç.ž{vÑ´òæµiý8ûö‡ñÝ÷?¢T*qww£]Û6øûûLÃÑÁA§.ò—;%%÷X¯þòkmRòkcû55_BQ™)•¾oT*U‰Ò°°°¸„)P߸¡t í'ÿ²â¦;eÊ”Âßc“&ñþûïÍo ½Ü§iªÕjTj5j•µZ…F£¡ªsœœÐh4$%%‘–šŽ:' +K(æÅ…BTµjÕäøñœ>s––-š›PåM;88ššÊ½{i88Øsï~ï`•*Ž&9Å}ÐËÄ7Æ+prtt¤ap0¾¾¾|óͲ²²J¯M›¶zï}ûö!0ÀµZÍŠ?Õ¤–f覅…ÁÁ ص{7oÝÒÙV­V£V«Q(¤¦¦Ú644„àà$$$pýz4ûðyËVF^ìüåÍ«R¥ )))Œ9{{;½ëÛ¯©ùBˆJ-ß‹jµZûÿ©S§ÜìÝwß-85Ä2ºú¦‹ZVœtóç7/oyó¦L™b<¿Å ô4 Y™YXYY£TZ`©²De©B¥¶ÆÒÒUNÉÉ)XZZ’•CzF©©©8:VAƒzBˆGS«–-‰¾ÍÁƒ‡@£¡~ýzØÛÛë NׯW—ð#G‰8vŒÇ[µäXDîð¾à Ê$Ð3ÕÏ¿üJH£FT¯^[kð÷÷+u¾Ô÷ÿµ±²";;;·ÞL œŠèåääpúôi\]]´óINNæò•+øûëÝÿÆ›hÞ¬)îîî¹7¯–%Ê_Þ¼&Cؽgûöï§ýO PÀ78~â$ýûõ5i¿¦æK!*wœ—/p*FžÎºVVÚ´ô=4¥`º†‚ÈÒ¤ °xÑ"íüÅ‹1mút“Ò-V `miÉ}ûPxhòd,-­prª‚F£!== [Ðh°´´@£‘ÇL !MÖÖV ô ÇŸàß‹—?rµZµ•nn®xxx´lÙµFÃùó8~üö´jÕ’fÍšþ§žµµ5ûÖ–†J¥ÂÎΖzõêÑ®mëRç«G·®ìÞ»—_~ûš5kjÖ@ï£enb·±±&(('ÚµÕnÛ¥K'víÚÍÆ›qrr¢yófœ>sV'ý °oÿânÞÀÇÛ›6&”ÝP¹CBB°°°àä?§ù|Õÿ°´°ÀÛÇ›ÆCMÞ¯©ùBˆJèå²òõ-\°Àp §§W®¨× <Ìt n_Ôü‚éZ¶pÞlÍ„ISˆ¹U¬ Ý´uñ‰7Q À‚””’IMM¥J'zõzŠÐ7è !„B!„9ÙÙ;ðû¯ë?q I‰ %JÃѱ Ÿ}ºœþO"=í^…L 33“ ëÿ`ú¬¹¦¼0]¿fM³c÷²s2±¶±ÁÖÖ[;{4 «]—Ú5‚äE!„B!D™Ê ™”˜€Z¥.Q7oÆjÓ*8IJ¢¤[P‰=wWW<Õ›¸›7‰Ž#ÍÙ…úuñ¯î‹K5¬­­$ÐB!„B”©œì,ú?=ï¾ýŠÎ]ºáêêV¬íØñ÷6ú?=œì«héš-а²²Â¯zuüªW/´L‚==[[[úö{š?ÿøµDiôí÷49ÙÙdddTØtÍè !„¢|zsÅVlÝë0nÂD© !D¹6ýÇýdÄ_àƒqÝKì9:VáéÏ–h{UNééé>] ô„BˆJlòÇÛ=r±IiR!Bˆ2‘˜œFN ï1³´PâêlÀЧZ­ysÅW,Û­Äù¹{7¥LÊYÑÒÕ ôÖ~¿FZªBQ ü‘Êè‘ÈI¸'•!„(Ó /)ågì(Ñöõ›wF­ÖàêlÏ­;¹=S­;=Åä70°©£T°¹½ÁC†’y|§ôì !„׆¨ƒò}.„(SI)é$ÜIå|ÄN:÷@¿jÅÚþÂõÛìØòu›vÀÅÉN»ÌÖ½}<.•\LyOòŒ‰¾Î†õ<ô„BQñ=7i9Ͻü:Q·îJe!ÊLfvç#vòD×¾¸:Ù‘œQ¬í]ì¨Û´ç#vÒü‰'QßÿaÊÅÉŽujðܤåüø㥢KI=!„¢’)ª3oßoŸ ´±+^bJkïþJ¥Å#]§—¯Eyýukáãí®¿}Ï!º¶oUæyx˜û*Ïy¨ˆy«lîwáåâˆJ]²Ñ.U8?-€ð=ê!„BTô@OÿwyJJ±iÖÅ» K‹§YÇX7@,ç²²²8ñ‰w’Q©4XYZ`ckM«& ­qò,=ZðÞÈÇùâÏcDÇÞÂÇË¿÷æÏwÐwêZº<ÑÒ,yû{ïaôÊj_ÅÍWÁ<ü½÷ð’Sò&ÊŽ2/ÒÔù½M;ÂèÕ¹ÎúEÍÏKKß9Kb’âß ãžB!*6uHOwkE÷nÝP(•(•J %J¥¥2÷ßÜi%J…B»Î[sÞE­Ñ™fE ò.^ºÌ°^!„ÔòÄÖÚ‚{ÙÄßIcæÿöÑ¢q°vÝ«‘1ôn]ƒvü˜òñv°r$(ÀGo}˜£Žvî × X:µkQ¬cü_W†òYÞ>ÂüAE^]oÙy€“û0nézzvjmp~þ´äx• ô„BˆJ¦¨k&…BQü¿ûéU¦ë°³ÿ^c\ÿÆ4©ãÍÂoösüßX¼«ñl—ØÚÚj˪р……?n?Ú-'±¶¶¢º#jõƒ¡kë]£èqÄÄÞ$#3 kk+|½=ð÷õÑÙ&öfѱq¤¥¥ceeE Ÿ/>^îz¿Žm[бm úN] @Ƕ-îçQCdt7ân‘™™‰µ5>^øy¹;Ûµ?€ºKzFövvÔ®@Ug'ƒõÇõØ›dffaogkR›ËÛ_Ƕ¿‚óJ“'SëíÐÑŠL÷ú8.]‰X[[âæR•šþXZZèä¯N­ ¢¢oq¿ü5ƒüHN¾KÜ­D²²³qp°£v@œu¶«÷X ¢bbIKÏÀÆÚ ?_/ªûxUªsLQ=zyVLîø¥ëµÿ× Â ¬ŸÛ£'çí‡è=ŒnRO/nÝŒ«X^Ëb,_•éˆG÷ó'u,¤Þõ+ò×q (”Jm§T<þP<˜O¾uò~m¯L¿¸ßIN¦aMO.E'QÕÙ™lløô“4¬_µFƒFgÏ_¤MO¦ ìŽ{U{nßÍ`óÁKì>ù/ ê=V(]•Z“o›.z·Q(àÜ…+4 râµ'ÛQÝÉ”´LÖí8Ë_ûôæ:={§Û·iÆ©³éêôgCpu¶')%­‡/³ãø¿4¬ÿ{ÂŽj·Yþs8úuÂÓÅ‘ñwù|ý1nÎNUôÃç/òx}OÞÜW';n$¤òëžsÛÜž°#òؼмüå(nžŠª·+q·tÖëÜ,ˆg:ÖÓ›nô›4ðµåƒQƒÑh4ÜIÍäȹü´ãuëÔ&ìð1mþ>ùõo>ÝWg;bâïòí–hßЃŽMšãì`CÔÍ>ÿój œ8uV»ÝGë3¦O¼]¹}7ƒ?÷]àÐù‹Ô¯S«Ò|†òÿh‘wnèھ㖮×v¼qK×Óµ}«Bç…Bÿ9K†nš! 7÷—lyJ翸ÈB<šŸ™¢Ê"ç…". Õj^yuüßÿIe”F£÷E^=€Ž|àƒur;Ž4E¦Yÿ,-¬HMÏÌ 6&öàùε©ãm êl¢câÐh4DÇÄÒ®¡¯öå쵞›ó½Ê‹=Ñ®¡'Ñ7 ÿ¨`Ê6Ñ7nÒ¢Ž ãžiABr#–làÍÛ ®åƒ¯·‡6Ê ŒúN]Ë­›ÚWäõX:7öehF„ýsggÿÊS×y¡{C:…úu]7õÝyóã¿yÿûøy:1v@3Î_¼ª·~bnÄѲ®Ãz‡r9æ6//\Ϭÿí¡U}_ƒmîÁÿó°aøB½8y2To÷œ®J¥Âícÿo ƒfþÆw[ÿ¡[‹ éZŸËW£tÒ©UÝ…‰Ë¶±dM^ÎÌz¥ŽvVŒýà/¯ #ȧ*ã6çÂ¥+:Ûµ¬ïˬU{xyÁŸ\ŠNbøSiþ˜1±7+Íg¨`^Þ_çv-µ=yƒ¼ÎíZꬫ Fîߣ§=O ³)Qž§—w¡y7ãb¹kò2´^qÒ1'}åÊË)eÉŸoO/o£Û•&OÅÉWI—?¬ºvpp I“&,Z¸€Úµk—Û‹¹Ž©)û©]»6{÷ìÖ¯Ñhh÷D{.^¼Xê|”õ±÷ôò¦cÇüøÃ…nÎ_ÿÕg½,ÚBÁ²è;/T„öWÚÏ´B¡ÀÑÑ‘€:vèÈ믿†««k¡õgÏ™CãÆ¡Œ;Ö¬màQ¼HÐ×6²²UE®¯@BYxˆ¦2^þ@O£!+[…F©ª4uV³†?® çÕ^!zW¥SÓ@:5 D¥Róéï\½OLì-¦= ÀºgÈÌV±~ÿžíÒ€'Œ-‡·J×Ôm¦êÀÿ6Ç×ϾÛ~Ž@ÿêÄÄêöNµjÞXïñŒ‹§û&ü¹ïµkÕä½èÛ®Ý[ÖdÃÝüý°ýµkÖ$üÜ…ÜvãâHff¦Þ´£oÜbÊ .|µéþ €¯6¤Upu¼õº¶Ps?‡ ƒí°øyŠ3¹Þ ¥ë`oÏš-ÇÉÎÎA£Q³3âãžiAóz>¬üý˜Î>¿ßzŠÚµkqìÌùio;Mí:µ8úOn醴k22t_-ðÕ¦øV÷C¡€¯7äñàêômW›ñËþÆMÏù°"ÊÿÝ~/#ˤmŠZO¡ÐßV$è+ƒ@ÏTåù‚£4Ê[¹òç§¼_è•´l)))¬^ý%¯ÍŽ¿ÿ–O%`ogÇöíÛéÖ­›vÞ_mÅÁ޾”¡jÕj|ùÕW {õU9 ˆ¼ÏtZZ—/_aíÚµtêÜ…Öãçç§³îüyó¤ÂÊPQÃ,s{ñ¹Áž¶WO_З¯çjMåz¸E•*Ž$§hxû³=8Ø*iZÇ›{4ÂÑÞš{4äÕ%›Qådãêœ{Îýì­^:Û{T³'33»PºYÙYF·Q(4¸UÍ]çÖí{øÚ¡P(ð÷ó-Ö^²²³´/™¾“šI-{[î¤æ®Îödeé^T'&§Só1T*õý¶Ûó¦/ý̬LÜ«:' ÿ [@Aü{…òÖ¢Yh‘y4ÖfŠ“§¬¬,“ë­¨t“Sî¢ÌNáWÚäS [kKíÄ*ö6ä¨rtÒI¾—‰•µµ6ܺÎÀÊÊZ„è{5€¾:s¯š{L*ËçÈÊâÁ @•úAý‰8YhÈ&<¸g¯yÓí< enJ¥‚ì|u,ÌǬC7ó÷Òdgg3{ÎêÕo@í:uX¹ò3u¿ùæ[š6kNu?:wéÂéÓgô¦£R©X¸põÄÈQ¯‘ššª³îçŸAãÆMðòö)ÓÊÊÊÊb„7 ªApÃF|òé§zËŸÿ_C=r¥ÉÐ_¢FÍZøùðÜóÏ“ ³ÎÇŸ|Bƒà†Õà7&:é›ZÇ;vîä‰ö¨îçOÓfÍùþûïÍZ'''ƌͅ ÿš\>O/oƒå3¶<33“IoN¦Öcµ©õXmÞœ<™ÌÌÌ"ÛUQÇ´¬êfÌØ1¬øøcÝ“äÇ3vÜXÝ/c#å0ÖfûÒxwɾ\ý%/]2xθsçõê7àNr²Î²;wîÐ ¸!w’“æÓ”öbè|eÊ2cŸï¢Ò3µ½*CQû4åüh(?euþ´··§aÃ`,˜ÏóÏ?Ç’wß5šgs´ƒâ|6J{)¯uŸ§¨áVú¶Rà_EîÓ7÷{ø4Ò«È7nÄáã퉧wuN_Oå­Osh´³µB£ÂÚÚš„;¹C_šÿ§veß©ké÷ö:š7mT¨ÞMÙ&ÿ:Õ¸wï9Ù9D])òóúæ[ZYsçnzîkŽ6ÜKKÇÙÁö~ “†µµµÞ´Li+ÖÖ6:JZZ:iiiÚ௨mµ—ÊÜè)==Wg;£mÕ´<¿Þ ºt%’)Ï·¢~;üx§gþÌÀ™¿°ÊŸ!îUí¹wO·Îâïä“ÊòùQèºY0È·t½Î0Γûp$âd¡¡› ºùð=SnQëåŸÿþÒ¥\8o'<<œ7nè¬v Œ Ösáü9zöìÉ›“'ëMç£eË8ùÏIþÞ¾Ó§þÁÖÖ–ùóè¬q,‚íÛ·{#¦TÖXù/y—„ÄDŽ„f玿ٿo¡“°F£!.öq±7ˆ‹½a¶Uþ}½0ôEFŽΙӧ8}êjÖ¬ÉìÙstÖ=xð»wíäHøanÅdzäÝwKTÇcÇŽcÊ”É\¾t‘?ÿø£f-Krr2+>þ˜àà`³–ÏÐòÅ‹—ÇÁaÛOLt K–¼[d»*ꘖUÝôzòI?‚F£!,,ŒÛ·“x²gOº3VcmÖØ±/MœœªðÞ{ï2fÌX²²²ô{gggžêÝ›5ß®ÑIãÛo×0 œœŒæÓ”öRœÏ»¡õ‹j úÎÿo¨½*CQû4åüh¨lãü9äùçÙ»wŸÑ<›£ç³QÚsHy­{£Þý`N™ÿÞt†oV¦¿ó.1ãÅÇñqÒ}›7ðràäÅ›TqrÄÃÝ a¹?@¾ôdvV8ØYÓ¢~u–ŒéÆ¿¯º¨2ewwÖïÏR8ü©ÆÜˆŽæÒåK îX‡¨ë7°°° -#··ÐËÅ‘#'õ^üº¹TegÄ5ú¶«Ã¥KWè÷D¶…_ÁÍÕ¥ÄA•‡»+›Â.ðJ¯P¢¢"‰¾Å˽B nkcmC\Rî-êùpùòUžël–@ÏX½™šnÞ½e÷2²±µ²dhF%ÊŸ!¯ô åFÌu¢¢"µu¶!ì_<ÜÝ*Ñ=z ôò·t=CÒ8¤a¡{ö ߣ‡Þ@¯2þÀT–ú”xèfÁ_ ó.Dò¬[÷3¿üò3ÞÞ¹¿`Λ7·Ð¯ýU«V`ôë¯óá‡éÝÏ?üÈÚŸ~Ô¦3sÆt:uîÂ’%‹µëÌ}g®Þ{@ÌQ®üeûý·ßøí·ßpssËz´`>;Û´ýO"ô½{vkÿokkËôiÓhÖ¼E¡¡QڼΛÇÓÏ<ì™3‹]Ƕ¶¶Üºy‹ÄÄD|}}ù¿>0{]{zz²qÃz³–ÏÐòßÿøß~}p,,\À3O?ÃìÙ³ŠÕ®Êªn”J%¯¿þ:ò1ß|ý5+V|ÌèÑ£Q*u›1VcmÖ”ÏWi´nÝš6mÚðþÒ¥LŸ6­ÈõFŒÎàgŸãµ×FaiiINNß®YÿÿfR>Mi/å¡öR’2˜ãø™óü©‡‡·oß6)Ï¥mÅùl”öRÞê>ï|ÚuèÌûHú×[¿ó0O^ÔþŠþà_…ÎSôò/»v#‰j +×ë”J î¥gñbÏFT­b‹•…’”{™ìŒ¸Æw[O耥¥%ûOG’•}”'¯Å·³ú‘•­â|d?ï<ƒ‡»É)w zƶqrªBØÙ(2³ŽÐ«Íc¬žþÉ©™¬Ýy[[¼½<øiÇwjÀçSs‡æ@Ko/O6¸ŠR© C“@ú¶«CÒÝt~ØvšmG¯S«f 1£¿ÇJO”›{O_ÃBy’Þmã›}ˆKºÇ/»Îòx¾{ô nàËÇ¿åµ~M˜:´ wî±nçYº¶¨a 2mž‡»«Áz3%þ|ðÓaFöiÌ‘ILIç×]çŒz¦ÍË/ül ‹FuÄËÅÛ©|¹ñûÏÜ¢fP@¥ùé{^H£`mPÒ(Øè|Ý=é}+ %ô vݺu‹ÿ"—çyvvväääèßO\mÚ¶+²qxyyš­B •ëV|<þþî31T¾²väÈQ,XÀ©Ó§IKKÓ[/ùóêïïG|||‰êøËÕäõ< IDATÿãÿ>ü÷—.ÅÉɉùóæÑ­[W³ÔµF£!22’‰“ÞäÔéÓÚûxÌQ>CËããð×9–ñ†¾šÒ®ÊªnÄÒ¥ðûïpöÜ9¾ùæëBë+‡±6kÊç«´¦½=•^½Ÿ¢sçδl¡?p©U«uêÔaÓ¦ÍôíÛ‡7Ѽy3|}}Mʧ)í¥<0Ô^JRs?sž?‹ú.pqq1)Ï¥mÅùl”öRÞê>ï»kè[ŸìqhÐujuñªÚ@…¥u¥RU³FË=AzF9Ù9¨5,--pvrÄ×Ï 4 Aþœ»‘ÄÞÏ÷‘‘‰R©ÄÑÁw77œœiÚP„5 mhÒ6† ?.ÜL"ìó=¤gdbee‰·§®÷{á".'°1ìí½aMBê|yÓ5j²-"–Ÿvœ#;;++K\]]¨Y#7 Ð—?}óô  üR<›ýEvv6ÖÖxzzÜÖÁÁÔTxó“dffbmeWm –£xy*ºÞ\]ªMàî]Íýüeaee‰§§{‰òWpÞ±§´ùÜq§cÉÌÊ݇‡»5ý+Õg(ÿS7óߣ\¿Ðb$›7m,òs2rÄp–.ý€>}žbÕÿV±dñb“ói¬½XZZ’––†]î½"y=LEu0a}SÏa¦~–Lió÷i¬^JZsž?¿ûþ{Úµkgò±,M;(Îg£´çò^÷E=ðAii…«â§Oå{^PPÑ?Öæ¯?—j¸¸T+rÐàboàR­.Õªé]îææŠ››«IûòòöÄËÛ³@:yGMÿ6úæé¿îqÃÝÝMg^µjηµw°§nÝw Vs©j´¦æÉP½™’®ƒ£C¡ü¹Þÿ1ª¸ù3”çºu3é3YQåý°—”ª÷…é&ý˜tW›–¼G¯Œò²JxРLŸ1“ØØXRRR˜=ç¥óâ‹C™ÿ’üÉŸüýw÷GUöòfd«èÚëiönÿ“„¤rTêbý%$¥p>b']{=MF¶JÆRѽ7'½IíÇ£Sç.´hÙŠê¾¾%¾ÐmÑ¢ ¢FÍšŒ3†žOö,³ ñöñ-ô—gê[oá\Õ™fÍ[бSgZ?ÞºÈtF¿þ:Ý{ôÔÙÞœ>ü¿xç¹Ô¨Y‹§ŸHóÍ ­Ó¢e :tìDó-©V­oM™R¢:îÞ£;¯NšµX°p!Ÿ|¼¢LÊôÂ!¬ùî;³•ÏÐòio¿»›;·nÃã­ÛàåéÉÛF.ÄôÓ‡U7E1Vcmöa~¾†½ú*·nÅ\gĈáÌš5›Ñ£_/V>µ—–¾Ï–¿þ¢vº<Õ§/mÜ[klý’~¾ µceзOcõRÜr›ãüéã[†Bxã‰X[[³}û6W+˜ÒæJÚŠóÙ(í9¤¼Õ}á‹Lù“?ù{˜6Ð>aµQÕ¾¼©idfåйç¢ÏäôáíÅú‹>Î=™•CjZ†NÚÂŒ=¯ çÍÖL˜4…Ìû/{Ìÿøi!Ê+ßê܈‰.ñr!„œC*ã9䥷?ã¹—_çrL¢d!D™sqvÀƪdüÈÌÎ!)ùž¾ð„ðíkùfÉkRÁÅ`c“ûP¢˜èëlXÿÓgÍ-þÃX||«ë_Ñ/ª‹*×]>}ù’º®ÜŸ¦’@VÚgEk·Rwe_÷žº)?‹ !Ê^âT³§Y¦VQ;Ы¬_Ôåµ\•±¾åbOêFŽÔ™(›º_¼plÝ'#„¨ÐêVIJ(‹@O~ALôuƒmÕØr!„œC*ë9äÏw“”(IBˆŠ{~^õÅn¹Ž3¥TB!„BT.Ò£'„B!„(W$&)=éÑB!„BˆJ¦PÞµ«—¥V„B!„ÿ‰IЧ^ý`ãž¾•„BQ¬•*BTÚÀE ÝB!„B ô„B!„BH '„B!„B=!„B!„è !„B!„@O!„¥õî{ïáã[ï¿ÿAg¾«›;®nî%s_å91oB ô„Bñܼy“¡/¾D@`îžÔ¬õ:t,2Èûùç_ضm+C†úˆÐÆMðôò&$´1~øjµºÐ6?þøÍ[´ÄÓË›ÖmÚf´ŽV®üŒÐÆMðòö¡u›¶¬]küeõúz#‹*GIòTT½åg,ÝÏ>ûW7wÜ=<©W¿'NâîÝ»…ò÷íš54iÚo_Ú=ñÛ¶ogþ‚…4nˆ—·:täÈ‘#…¶[»v-­Û´ÅÛÇ—ÐÆ|þùòB=!„B< U«U Ýí3vß®YC\\œÎ:ò ³fϦe«V\½r™!CžgÞ¼ù|ºre‘隲ͪUÿcü„ øøøpòä öìÞÍÙ³gtzìŒõà-[¶œù Ò¯o_"¯]¥OŸ§X°p!Ë—//´îÁCÙ½k'«ÿ·Š .0aÂëç‹/V1sÖ,BBB8sú4Ö¯gÓæ-&Õ­B¡0i½âæÉP½'Ýôôt„í'úz3gÌàÛ5k˜6}z¡tNž8ɾ½{ùê«/9{öÏ=÷<·“’?|ˆ¯¿þŠS§O3zÌØBÛmÞòÖ¯çÌéS„††2}Æ V¯^-:!Ê€bá¼Ù𠓦™‘!µ!„BT`ïÌžÅòOV’”˜PªtöîÝËÌY³8sæA `eeÅK—jïÃkܤ QQ×9z$œ   ’““©Q³þ‹ˆôÀåd¦lÓ¤iS"#£8zôA…òV0͢懄6&::šsgÏàááA\\ ‚âççljãÇt¶9}ê¼½½ÉÎÎÆËÛ…BABü­"ë§iÓf\‹ŒäXDþ\‹Œ¤iÓfzó–?ܺWd¾Kš'Së­8éªT*<<½puuáß tÒ¹páÀ€˜èë¬úâ Þ™7_*£„õ·aýLŸ5Wzô„B¡ë‰'ž`ïž=üsò|°”jÕª‘ͼù.¼n܈ Y󸺹S£f-®_.2]S¶‰‰¹€¿Ÿ_©Ê×éææ€»{n ]ooom0 ~ @õê¾ÚyÕ}}Íz Š›'SëÍPº¢wï§ ÂÍÝO/’’nJÇÍÕU'üu¬T*‹Ì³¾:Ë«O!„yI '„B½|}}yù¥—økËf{µ|}ôâä £LLˆ'þÖMéß&o¨ë×K•wtþÍ tJC DÇ þŒQ©TÚûõ%?V¥¯·aÆsðÐ!¾øâsboÄ}ݤ ³8ôÕ™¹ƒd!„zB!„Ðã©§úðûïOVVçΠc‡ÚuFÀ;s瑜œLjj*ÿ½ƒg*2]S¶yýµ×˜1}ñññܾ}›Y³gk—;99¹Ãþ <87ÍO?]Iff&Ÿ|ò)/Zêú1b³çÌ!))‰¤¤$æÌyÇèv÷Ÿ\ºuëVÒÒÒx÷½÷Ìv̌՛©Ah^gff2Á³·­Ùs昨[g£F’eÀRª@!DyRÔ=KååÑùå-?eÁÑÑ‘yóçqóæ-²³³qqqáÙgŸeÞܹ‚¶Q#±µ³eõêÕÔ­WZ¶lÁ˜Ñ¯虰͈ñ³³cÕªU4 ÅÕÕ•©o½¥]>eòd–~ðÑûᦾõj•šu?ÿ̧+WâååÅ´·ßæ7&”º~FIŽ*‡/¾XEýÁ0ñ lܸÑàvË—/cò”·xù•W©îëˤI“X³æ;³3cõfŠ/>ÿŒ·§M§oß~x{{3aÂx³·­ž=ºód¯^DFFâááÁüyó1b¸œø„(ò0!„:nÞ¼Éä)o±wï^ÒÒÒprr¯zuvïÞUn½‚¬·²²ÂÓÓ“víÚ2sÆ ¼¼¼‰@Ï\cB~ ÿyKéëOÆ"„B¯â¼,»¼É»çëÊåK¼òÊËüøãO¼:lX™ìC!„(Ï$ÐB¡Ã”—e—ô¥É`ü…Ìæ`ooψá¹ÃÁN?Q(ßúÊ’'ìÀº÷èIu?|«ûñÌÀAìܹ«ÈõMyÁµ)/ 7¶_cË…B ô„BÉ”—eç)ÉK“M}!si¤¥¥±úË/hÚ´©Î2c/¬9rGeÕŸsùÒE&MšÈªU«ŒîÓЋ¨MyQ¸±ý–4_B”Ò.„zB!þcŸ­ü” ê“””ÄO?ýÄĉ“mÜ„ï¿ÿ¡ÐºÓ¦OÃÁÁÎ:=˜7ímèÖµ+W¯^ÕÙfâÄ7¨S§666<ûì`¶mÛf–¼çõ®ùù0wîZ¶ŒqãÆ¢Tê^¶üúÛo,Z´777ÜÝÝY²x1¿þö›Î:ï¿÷ÞÞÞØÛÛ3vìN:etÿ æÏÇÍÕU;ýÝ÷ßóî’ÅøøøàèèȜٳٰq£Ám 1–ž­­7oÆ‘˜@õêÕYöÑGfÏožaûi×®¶¶¶8991kæLvíÚeò±*í1(nYKRŸæ®o!$ÐB!„(¡gŸ}–ãÇóëo¿qæÌY\høøx´ÓÄÇëöú›œ¾³³3—.]2ºÞ+/¿Ìĉ“¸zí999œ={Žá#F”¸\ÆÒ1b$.\ ;;FƒJ•cÖôóËÈÈÀÖÖ[["£¢˜8iR±ê¨´Ç ´e5¥¼e]ßBH WDE]ç½÷Þ§w裡S·ž^ÞøøV'$´1Ï??„Õ«WsçΩ¨ N£ÑнGOíŽ~ýH¥T2}ûõ×ß=ŸD£ÑH¥Q Íœ1wwš6kNÓfÍñòòbÆôé&o?vÌ:uî¢óG}&LO«V-éßÕýü9j½žìUâ|K¯ç“=yñ¥—ñó`îÜy|¶ò3³¦Ÿßòe1sæ,üüüéÛ·-[´,V•ö”¶¬¦”·¬ë[ˆòJ±pÞlÍ„ISÈÌÈxd+!++‹ù ðÅ«ŒŽÝ·³³#úzT¹ÊÁ“oy|ùkyÊãÚµk=f¬vzÓÆ´jÕ²R´ei ¹:L¯Þ½µÓ+W~Ê åŒ/*½wfÏbù'+IJLx(û»›’ª/V2kÎ|llm ®›™‘Á‚y³™3o!)ÉÉr°„zÅD_gÕ_ðμùR%¬¿ ëÿ`ú¬¹ÿÝ=z®nî/ðŒ-7—ÌÌL?ûûöí3iýôôtiAXvv6KÞ}W;Ý´iÓJä‰ZµjIÓ¦M‰ˆˆ`É’%ôï×+++©!ÌH¡Pðxë6,˜7Û襖––<Þº-H»B<üÃX¦M›®ä) † yž‡¥nݺ(•J®^½ÆÖ­[ùbÕ*nݺ%­¦ûå—_‰Šº®~åå—¥R*©—_zIèEFFñûï¿3hÐ ©!ÌÈÎÞŽŽºÐ½§‰Ã523³¤â„µZÍ+¯£ap0“'¿Yq=CãÚËã°±üΜ9Ë·kÖèÌûäã…á\¿~=êׯÇÈ‘#x{Ú´"¾»4lݶŸþ™ˆˆcÄÇÇ£Ñhððð qãP H=P(Fë01!žÃ‡ÃùìóÏ8pà ÉÉÉxzzÒ£G¦¾5ƒuohhÜŋٺm‡‡sáÂâââÈÈÈÀÞÞ___š6m C^ E‹æënçÎ]¬[·Ž£ܺu‹ììl|¼½iÓ¶Îö%Éã™3gYùÙJ:Lll,999¸¸¸P·n]Ú´nMïÞ½¨[·n‰ŽùªÿýOûkkžzª·YÊ)m¡üµ…>}žbòäÉdfeÝ?ö«%ÐÂÌ,,,ÉÈÈ ã¾ýCQþä][(   S§NŒ3Úä÷]šÓ¬Ù³iÒ¤q‘–*+f½G¯8Ã-ËÃÐÍé3fðùç_h§ûõëËê|€©’’’>b${öì1¸^ûöíùߪ/´çE]èΜ1ƒ…‹é}€D­ZµØñ÷vÞ<®ïÂÙÔm&ŒÏìÙ³ Í¿sç#GbÇŽ&í³¸yÜ»w/ƒŸ}ެ¬,“Ëdªÿý—Ç[·ÑNwéÒ™µ?ý¤wÝâ–SÚBùl ƒÖÉß‘ðÃÔ¨Q!*«‡}žB˜›9îÑËG¤¥¥qéòe~üñGÖ¯ßÀ–Í›ñ÷÷«Ôõ—w^™=uóZd$C†¼€@ >>¾ <¸ÐË:—¯XAºõ¨îçϸñ㵿¼¤R©˜?uêÔÅ·ºÃGŒ 55Õ¤HÞ°ýa:ÓC_x¡ØåT©T yá£ö{öìá…¡CQ©T×[°pa‘O ¼téŸ|úi™7’eË—zah^Y]Ø—Æü ^Ø—ÔÖmÛt¦Û´ic𘷜ÒÊ_[hÛ¶­Îô_ÉKp…BˆŠÌÔŽóØÛÛÓ¨aC/ZÄ / añâÅÚe™™™¼1q"A5 ªÁĉ“ÈÌÌÔÙ×W_Mhã&xyûСCGN>mòrc1LIbœâ(³@ïùç‡ðÚk£ø÷ÂyΟ?G­Zµ˜9S·Wààƒ„íßljãLj¿Ï’ÅKô¦õá‡qâäIvíÚÉ…óç°µµeîÜy¥ÎãÕk×t¦CBBŠÆÚµë?¢vpp`å§Ÿpíê¢"¯ñÙg+qppÐ.?|8œuë~6˜¦µ5~øD^»Ê¹³gèÕK÷އ͛6¹=úz3òæë[Ê Øñ÷v._ºÈ­›qÄD_g÷î]ôíÛGgÝo¿ùVgzݺŸ9tèðƒÆ£T2aüx""Ž{ƒ ÎóÍ×_ñÄOÊ‹©y<“ïÃðã?{ƒèëQìÙ³›óçÓ¨Q£ïÇÃu뢈ã]’rJ[(Ÿm!¤ÀòÃááò )„B<¢†¾ð»óý ¿pá"âbã8z$œ#á‡‰Ž‰fÑ¢Å:Û„……±eó&®\¾D¯^½˜8q’ÉËÅ0eãäyhC7ÓÓÓ mÌ… çµë=NPPW®\¡o¿þœúçd¡´B7á—Ÿ×Q«V-âããi÷D{Ο;[ªüº¹{èô–ÜŒ‹ÅÒ²x·-öð4{÷îÕN¿ÿþ{¼úÊ+:ë¬þòKÞzkªvºC‡üúËÏEþ21cút&Mšø ½z•fÍ[èü2q=*²ÈíK:ä5-- ?ÿí´‡‡çΞÑNxúÞª‰ß`æŒ%úõ¥¨<Õ¨IJJŠvzòä7éÖµ+µjÕÂÙÙ¹TÇ»y‹–\¹rE;}âø1üü wÝ—´œÒÊ_[ˆŠºNã&M´ÓµjÕâð¡ƒòM'*-º)„¨èÌ=t3¿ììlüüˆ‹½@ƒà†lXÿ§ö¶ŽË—/Ó·_NŸúG›Î¥‹ÿR­Z5m<Tƒ›q±&-7ÔEŒóP†n†‡¡WïÞøùàêæNu?“’tÖñ÷÷×ùQO´Œ¥e«Çµ/@®[¯~¡a %aoo¯3}÷îÝb§qæŒn¯Cï^…Ÿ<öToÝ~œ>uÊ`šO?ý´Î´¯o¡‹ð’º{÷.Ÿ}ö9Ï DHhc|«ûáæî«›»Î…=ÀíÛ·uó}Z7ß/¿ô’ÙÛM—Îu¦—.ý€nÝ{P£f-6 aÜøñ:]âÅ«3í뿤唶PþÚ‚‡‡»Á6 „BˆGÇÍ›7užO@Àƒkž€€âãuļ rß§]ðU2†–‹aÊ*ÆÉSfޫÆ1|ØpΜ>EBü-®]½Rè^£¨¨/¿~ýz‘Þžžžœ>õÎð®„øÒ¿æ (0PgúäÉ“ÅN#99E÷=Oò)øÀ䔃iV¯®{1om¦w]½v6mÛ1cæLvíÚEtt4EÞ–m°¬^^^fo7‹-,ò)7nÜà‡~¤K—®ìܹ«Øiçs `mmmÒ15µœÒÊ_[(xŒå=˜B!Ä£kÍwßѾ}{í´»»»N<‰›››Ùög,†)«§Ì½ŒŒ lmm°±µ%2*Љ“&ZgæÌY$$&’˜ÈŒ3y¦@ïŠ ý IDATEžW^~™‰'qõÚ5rrr8{öÃGŒ0¸SnÔlݦu¡ƒ_\ÎÎN:ÓIz-õÍsvr2˜¦………δ¾Çð—ĬY³‰‰‰ÑN>œÇqëf‰ ñÚnfSËgövãîîΖ͛ٶõ/¦½ý6}ûö¡Aƒú:Cjsrrx÷½÷жÎtQú(i9¥-”¿¶P0¸·µµ•o9!„¢+îÃXÒÓÓùçÔ)¦Ï˜Áwß}Ï´·ßÖ.ëß¿Ó§Ï !!„„¦MŸÎ€ýÍ–Wc1LIbœrè-_ö3gÎÂÏÏŸ¾}ûѲEËBë´lÕ’6mÚÚ˜j..L›ö¶Þ´&LO«V-éßÕýü9j½žìUê<¾0ä ç?þø“uëÖ¹þ½{÷?a‚μ ‚u¦7nÚTh»‚ó‚64k]¼ø/ªW&ÿ‹áæÍ}???m0±wï>ƒû ÖÍ÷×ß|cö<æiÚ´)“'¿É—«W³wÏÂöëæít †oìu*Ø5_ÚrJ[(máÖ­xƒm@!„•7 ts÷ NÝzŒ;köìÞ¥ój…™3fàîáNÓfÍiÚ¬9^^^̘>Ýly0ÔUŒS&^þ›Ÿ|òI""Žrëf'OgĈá:Ëâ?nΟ#úzŸ|¼B§Ç%ÿºJ¥’7ÞxƒÇ{ƒýûöÒ¿?“óRô…y}† y^gÞè1cycâDŽ;FZZéééœ={Ž>úˆæ-Zòý÷?è¬_°rîÜyüüË/Ü»w{÷îñëo¿1¯ÀͤO`Ö†\¥JÝ`bã¦Bã‡Bòÿð£¸}û6lذ‘×_Ýà~>óŒÎô²eË™?‘‘Qäää””ÄÖmÛ¨ç¥Ô¦æ±C‡Ž|´lááGHLLB¥RqïÞ=§Yê LQðÅÚ× |¸Iê¼¹s9z4Bç‘õù½ñÆ|ôÑGEnoaaÁwkÖ0rÔ¨b ¦æÑ...,\° ØÛõèÞ]ç¢?l˜Þ@¯¤å”¶PþÚBÁãЭkWùâ—MLt4gNŸ*ôDa!*3¥R‰³“3uëÕÃ?0+3=àM”_–R¹/¥^¼h£Fâ§Ÿ~bß¾}\¼x‘;w’±´°ÀÝÃõëÓ¹s'èjçêêÂï¿ýÊ_ýÅÏ¿ü±cǵ÷¹¹¹Ñ¤Ic>ó ={öD©4ÿm‘}ú<Åêÿý/V}Á™3gIMMÕ»^½zõصk'ï¿¿”]»v‘˜˜ˆ³³!!! 6ŒÝ»¼¸‡ÜGÈ®[»–;w±nÝ:Ž=ÊÍ[·ÈÉÉÁ×LJÖmZóÂJœÇƒÂØò×_:xˆóÎsófnÚŽŽŽÔ¨QƒÚ3rÄ<<<Š]Oµk×&$$DûtÕ={÷’žž^(x/M9¥-”Ÿ¶ššÊþ}½j×®-'QôññaÚ´iŒ9’jÕªa``@‹-øñÇ5iRSS5öjÕª1jÔ(RSS5v===6n܈³³3ÆÆÆ¼ñÆ\¾|YcËúŸµ LŸ>}°´´ÄÔÔ”ž={­±gdd0uêTìíí±±±aåÊ•ùæwèÐ!š6mб±1ÎÎÎ|óÍ7R9+©©©|ýõ×8p€æÍ›мys8À×_­U'qôAAž‹>ú˜Q£Frëæ nÜÂÙÙ™Ù³çh¥ù3àONôçÒÅ ÄDǰØoq®y­\¹ŠK—/süø1nÞÂÐÐùó}^èñ;vŒ~ýúå›fîܹDFFÄõë× cÞ¼yZiþøãþøãbbbpwwgÔ¨Q‡-ëÖ2@ïÞ½ñôôäþýûDDDРA¦M›¦å€^¿~³gÏrûömÂÃÃóÍoÈ!Ì›7‡rìØ1NŸ>-•³’ahhˆ¿¿?Íš5ÓŠoÖ¬þþþJ! %3tóâ­Hvý~ƒÐ¨‡åîuuÔ°­Êûí]hÖÀ^A„DÀ©“ZÑ9³gãêªÝ]´ÈkkkÍro÷>Ì›77G^ß}ÿ=;wlÇÁÁ€ysçÒ¶Ý;,[¶4Ïý?ïÒ¸¸8llò*øã?rôèQlmmXµj;wfÉ’%š4k×®ÅÊÊ €É“'ãëë›ožše###.\¨5ƒâwß}Ç‘#G¨Q£Ë—/Ï7?###¢¢¢ˆ‰‰¡V­ZlܸQ*§ ˆ£Wtn„ÄòÍ/—y«y#:½cƒŽNùzH¨R©‰|Ë×?_£K o4ª+ª ‚  ௿Î2ßg>WHNN@¡Ph¥©U«–Örö!ŠÙ‰ŒŒ¤e«·´âžÍ«¸(32P*3rÄ[YYq?"œêÕ«ç¹íƒpt°'=íéÐ8G{s†9³çp9ð2IIÿ–[VºÈÈH­}>˳ñß·•ÅK–0þ|,,ÌYºd)Ý»»I­À䥽 äÇs{e?¹ÊëMcQÕš¤TO’•å*$¥fbnaIs×&ì ÅAá1tØ0†ε«Wˆ‰æ^ðÝ“H„††j–ÃÂÂò|‚fggÇÕ+ÄÅÆhBlLt‰§5*uÎоý;ìúiw®¶¬`kkKð½{šõ»ÁÁØØØhÖÛdËÍ>pà >ù ·nÝâñãîß@Í^½zuîçz<¹å×ìõ×ùñǹw/˜eË>cÜøñùž“„ò²x6>9%…;qáâ%­ø /Ñ¡c'’SR •¯P¹yî'z÷£âÒÄ‚'©™åúD L,¸óˆÿ?HHH¨<žºŽ3ssœë¿‚­]u©Ñ‚ B™‘ššŠ¡¡††„„†²páÂifÏžÃê5«øôÓÙôýàƒ\óâáÁ¤I“ñ[ìGÍ5¸uë6+V®à«M›òÜagU«sŸÅpæÌ™¸¹uÇÀÀw÷ÞsõêUV­ZÅÖ­[xÿý÷ñòšÎ矯`Ú4/>øà­ürË;+΂[·nQ¿~}-%%ôõõ¹wïóçÏ×Úæ£>dÊ”©¬_¿SSüü³x±_žù :///êÖ­‹Z­B©TÊÌœœgõ300`ðàA¸»»óÓO»hÖ¬.\àƒúâã3Ñ\x~GO¡P|•JUþ"…šFM]±¶±-wCL‹‹J¥"6&š‹çÎQEO+«jR«A„2aÍêUÌž=‡0!ØÛÛ3nìXvïÞ£•¦e«–´ió6IIIôîÝ›™3gäš×„ ž¬Y³†>}Þ'** ggg¦Lž\RÝæ\;ÁuëÖeß¾½,X°€¹sç’’’B£F˜8q‚&ýœ9s˜6m*M›ºЧ;³gÏ.´£çé9žvíÞ!))‰„„G¬[·Ž™3g1`À@ìííñôÏ®]?i¶™>}:sæÌ¡uëÖ¨Õj¼¼¼òͯ{÷î|üñ‚ƒƒ©_ß™M›6J§¿’9z @­†®]»áââÂ7øì³Ïþ‰½PøúÌUO˜<´bNÃ:jñOü¸tD…8ÙÿxmbÍä•RÈGò÷­[´nÛNjµ ÂKŠ÷Ü9¬Y¿ø¸X)Œ\HOKcûÿcĨѤçñYA(O\ ¼D«ÖmIL|’gšï¾ûމ'±jÕJ P¨|ÿûÍ׼׫U-ËÝ9G„‡±iãF¼}H(fùíß·‡Ysæ?ÿ½*: V©¨¿TÑ¡Bš††F¤¦¦äjKMMÉs»ÂæQÙ½:Nõ¸|Gj¦ ‚ ¼tttP©UòïP!hðÊ«%>‹n¦J…®®®®8z£«ÃÓ¡›ª¼/˜ùÙ KIäQ’ïè©T*ÆŽOƯ2~ü¸çÊË©®3Áwÿþ÷\åæ#‚ %BAÕªU ÅÆÆFÊCx)‰‹ÅÒÒ …BG £’óÜ gŸu3·@>6#ccÍòáÇy½ysÌ-,xÅÅ…o¿ýV“ÀÈØX+½R©dΜ9Ô¬U «jÕ8hŸ<És_jµZóD/·àT×§ºÎÔ­WŸÆM\éÑó=–,YJ\\\®é}}ѤiÆ›#ŸüŽ!·p÷ÎíB•WAAA„¼ÑÕÑ¥qã&œ8Ѩ(23UžçJPÑBf¦ŠQQœÀ¥á«èëÈE¡’SbC7óŸu³`Û°áÃY»f nnÝˆŽŽÆÏo1ƒINJÄØÄ”ä¤D­ôK—-åâÅ‹üp s ¦N™ÊìÙŸ²zÕªüÒ|Æ8ß¹}€ä”î³s×nzôxíÛÿG GG­´ŸÎšùôhrÉïyÇQË8lAA(yttu°·w QãÆ\ºxÇ dÊ=WxY~èÐÕÅ¢jU5n„uµjJ¡ˆ£WЯc ž¾¡—ÏÐÍBØŒŒŒˆŒŠ$&6†5k°þóuZÛ=›Çÿ»…}ûöààè€Ï‚ù´lù«V­Ì÷Xó{ò•e324äÕW_eÎìW133eÅÊU,_¶€ÌÌLV®ZÍö;INN¦SÇŽ,ò]€‰‰ Î \¨Wÿþ¾u€°°0ø.âôé3(•JZµjɲ%‹©V­Î \4i³Ç'N°xÉR‚ƒïaggËØ1£é߯ŸÔZAA( …‚*úzÔ­[GGG”ÊLÔjqô„—èÇ…Uôõ044’ÂG¯èþó=š|®“…±}ÿÝw,Y²_ßEX˜›³déRº»¹å™Çýû÷qu}=Ç<¿}==Ö‚½ìôëÛ—¾ýúkl¾ø’+W¯²w÷.ÌÌÌðYèË’¥Ÿ1ß{.·oQÿ•W¹}3H+¿#G1wÎlV¯\AFF«×¬ÃwÑb–¶4×}g-O6ó½éС=±±q¬[¿ž~}ûJ­A„ç@·ŠÆUô¤ AG/ß Jhèf󿝳}û¨ÕjŽù•1cÇÒýïÛyæQ½zuŽý ‡B響dddäiÏÍfiY•‡ilÛwìdÓÆ/4Oã&MðÄýý¾ÌþtfžùìÛ³ûß›‹®.<Çñnç®Zér[600 2*Šèèhììì˜ï=/ßãAAA€šŒåŸéXòÊæ1d7n‘‘‘ŽJ¥Rc³°°àöí[ZÛ6”ñžžßE©ÌàÚµ« öðÈ÷Xò›Œr·EGGciYU³þàÁzôìEÃFMhب mßé@|||¾ù\¼x‘ƒÓüÍ–4lÔ„×ßhÁÃGrÝ&ûòê•+8@ŸúÑ¥[wŽÿ]&cAA¡`?íy3ÐÕP V+òLcjf‘#îÉãÇÿ85O·ëѽ~4€àà`êׯÏW_}¥±Mðôäí¶ï””¤Ùnò¤É¬\¹’=Þ#2*Šúõëã5mZ¾Ç¡«qJó"§m箟x«U+ÍÆÆ†¾ß‚­m>Ûjç3yÊ4¦M›ÂÛo·ÁÔÄ„¤¤dZ¾Õ&Ÿmž.7jÔõkW£V«ñ?yŠ9s½ù£ýoRkAAAÈ—z¢—5KοÇr Y¶¬tôý€óçÏÇ™3§éÔ©£Æ6uÚT"#ïk¥Wè(˜½ŠBEpFA¡Âtü³=á155ãÝwße÷îŸr¼¿ojjFbâ)°J¦w^$&>!1ñ‰&½è_ùèÚµ+ ,ÀµZ…¥eUvìØÎÉ“'¥ßþ˜ššâòZC‚®_§Uë6âè ‚ ‚Pf=­UK˪lür##G~R`Z¡bëøäñ¿S3s­õ\µý+½{÷Ö|7/‹ªU«Ò½{wÔÙâ„¢cnQ•„GK$/)NAAŠ×ïWkÀÊ+øâË/¹yóf[ÖrJJ cÇÇÞÁ{GÆOJJŠÆnjfΦM_ñZ£ÆXU³æÍ- à»ï¾£©k3,­ªÑºM®^½ªµ /.ä¦w^úf×1ë–3˜—¿vÝ:^qqÁÌܵZR©dî¼yÔqª‹­ƒ=|„ýû÷Š»»;ã='H‡¼;zYqð8áiÙÏ=‡ÿ‰$22’æo¼©•F¡PˆÎå„¥‹I!ˆ£'‚ ÂËÀ³C¹²ÖõôôX¿nC‡ åð¡CZ6BBBprràÞ½{X[[ç"XоòŠJOï¢èSýììl9xàööö¢s9ÃѾ:›4EO__óãKa8{æ´^ewôvïÜ.%-‚ /‰£РA}ÌŒ™3µlî½{óéìÙ¬^µ €YŸÎ¦»»8z•ØÑ³°°àöí¿qv®—ï6ƒfò”),òõ¥Fܾ}›•+W±qã—Rø/!•ÙèÓ·åqô !5VA^ çÎ.7ŽÀ°aCùð£´l3gÎ`æÌY´hÙ €^ï½ÇŒÓÅѫĎޘѣéÜ¥ III<ˆŠÌs›ñãÆ±vÝ:Þÿ /< ^½zLž4Qt~I©¬¾Ã–o6•Ú¾JuèfzzšÔZAA¨„dïÀg¡P(øß¶mZq†††¬\¹‚•+W:ŸÂÆ åGûìq'N`âÄ n£££ÃOO&xzJ¡ â7T4GOA„ʃy @Rr2ß¾ÍwßÏ[oµæ·ß~¥v­ZeÑs:ÿ#€©™¹Öz®ç[Ø8á¹ê“–%UÆ…ÈÃÒ²*¿ÜÈÈ‘Ÿ¼|:çw~/êÜE“ò{ÿ(íûË ¢ÿGåZ+•”Òü¨wE¿–gtJÛ3ÞPP^¾¾‹˜4i"Æ ÃÒÒ}}}ÞhÞœï¶nѤIIIaì¸ñØ;8bïàȸñãIIIÑØMÍÌùꫯiØð5,­ªÑºM._ÔØ²S3sÍ6ÁÁÁôëÿìªÛSÍÚ†>}Þ'::ZcOOOgÆŒ™Ô®ã„cš¬^³&ßür;ïÜ–ŒhÒ¤ K—,aР,ðYP"å\RzävÌÙË9¿2ȾR©dî¼yÔqª‹­ƒ=ÂÃBqwwg¼ç„rQwžÇÑ+¨,D“ò{ÿ(¨}õþòl›œ6u ‹—,!33S“fñâÅŒ=Jz†‚ ˆ£'Ž^Ù8z¥A|||ï©íܹ“%‹ý°±±ÁÖÖ–eK—°sçN­4+V,ÇÁÁccc&xz˜ož9Í;íÚaddˆ¹¹9ÞóæqìØ1}Û¶m|¶l)ŽXXX°ØÏ¯ÄÏÝÎÎŽøøøJÙØ·lÙª)?SSSæ{{³oÿ~¹ s‹ªZ!7-Z¤ÕŽŒ yEl\5jÔ`ÝÚµÅÚw۷ߦ]»¶,ZäW¬v°fÍjj8:bddÄØ1cHLLdåÊZq/^¬ðu§ ²MÊïý£ Šzy¶MvêÔ víÚ<rzô·£Œ9R.p‚ ‚†R}G/==ý…çeiiIdd$vvvynƒƒƒƒ&¢£c´ò411Ѭëêê¢T*µìÏîÿ¯³gñ™ïCà•+$''O'KÉJõàÖ>‹S6ùí <<++«-ç’Ô6·4SV\dd$ÍßxSË–½|…ÂëkÚìÛT«¦]¾ýö>[¾‚E~~˜™™³Èw!]»v-–þÓ½¼pëÞƒ;ЪeK-[AíÀÔÔT«mæ—½½–‡º“ß¾ò²T¢Iù½t­+êý%·69iâDæûøÐ³gO,ôeÜøqš²A¨ì}¡pTº¡›íÚµeïÞ½ùæaccCHHˆfýÞ½{X[[ièͳöaÆ3lØ0®^&úAwïü­e·³³ãÞ½{E¾U”¡›[¿ûŽwÚµ«pC7 c·³³%ðò%b¢hBôƒ(®ù‚†n>kwuuå»­[¸Äb¿ELš<¥ØõWOOõëÖ1yòdž$--ó.0dè0M÷Þ½ùtölbbbˆ‰‰aÖ§³éãî^è­……·okwvRSR00ÐÇÀÀ€&Ož¢µÍú÷gÆÌYDDÜçÑ£GÌž='ßü ÛHNN&00O?Í÷ßÿÀôé^ÒÑË­ ²ÛÌä)S&##ƒëׯ3bÄ'âÜ•’£÷É'#¹qó&é¨TO'Ó(nýU«Õ4hPŸÁƒ3cæL-[Aí¨8NEYÖçqô * Ѥ|Þ?^{­!ëÖ¯'99™û÷ï3uêÔ"•WA×Âìq“&MdÝúõLž< =½*âè•1ŽŽŽR‚ Žž8z/òFíääÄ®;8vì-Z´À©n=f̘‰»{oMš™3g`cmC‹–­hѲÕíì˜1cz¡oÄcF¦s—.ØÚU×Ä­\¹’9sçQ»Žî}ÞçÍojm3eÊdêׯOûxóÍ8::æ›_Aq[»êØU·§ákðœ0}}}Žþö+5jÔ¨Ž^neÝ>~Ü8Z´hÁûô¥v'FŽM÷înâÜ•’£×­[W†x ¡N'|,àóõë‹]ÿ}R4”èèh-[Aí¨8NEYÖÂèakW=G(LYˆ&åóþ±ü³å><”'òL³{çv Aôƒ¨ç>àÛ·nЪu[âbc¤”DÑC=D²aÐ`ú¸÷¦OŸ>š¸…>óY³~ñq±/tß?ïÝÍ ¡#JÝÑŠˆˆxiò«Hüý÷ß,Y²„€€’’’hذ!cÇŽ¥GV«ìi²œ|…B©©)µjÕ¢}ûöŒ9’jÕªUJM·|³‰ž½ûhµùÆM𢧝_¤÷Ïž9­•OaˆcÓÆÌž;¯R–í¡_öÓ§oÿ<í'ðûÑßpëÙ«XùG„‡±ßfÍ™_º“±”¤+¿\–¿_]ÑC=DJ¥â‡mÛ¦W¯^R¿„2%88˜~ýú1iÒ$–.]Љ‰ ×®]cÆ %æè•²œ¾äädîÞ½ËöíÛéܹ3{÷î¥fÍšRäZ].©tC7%¨ËåÐM ¢‡è!Aô(™ààXƒÕ«×°jåJ E™ Ê ¥R‰··77æÕW_åË/¿ÔØÒÒÒ˜6m...¸¸¸àååEZZšÆîèèÈÖ­[iÙ²%µkצK—.\»vMcËúŸ}eHH4hÐ''' @lllÇ“W~ù‘=]zz:“&MÂÙÙWWW6lØðÒv$—/_Θ1c4h–––èëëÓ¬Y36nÜXi´Ïޱ±15ÂÇLJ?üeË–‰7QŽýyGO= ¢‡è!Aô=*L¸ΙÓâêÚ´L;yuúoݺő#G8sæ ‘‘‘Û’%KˆŠŠâäÉ“øûûÁÒ¥Kµ¶`ïÞ½áææ†———ÖÓ”ˆˆ­!wŒ1‚ÀÀ@©W¯óçÏ/ðxòʯ°,]º”¸¸8NŸ>ͯ¿þÊ©S§^ÚÎøÉ“'éÝ»w¾i*“öÙùè£ð÷÷L½rëèU¸¡›Nuy)µ¿œ zˆ‚è!zYìØ±ƒíÛ·coo€···Æ¶gÏvíÚ¥ùðû‚ èׯsæÌѤñóó£jÕªŒ5ŠU«V廿ãÇk– ™1c-ÿùdAÇó<ìÞ½[ë\|||hÛ¶íK©ùDZ²²Ê7MeÒ>;vvvÄÿó ¡|ú /;U¤AA( ¢££©U«V®¶ØØX-[­Zµ´†ÚšŽ>€‘‘J¥2ßý;w___®^½Jrr2ðtÂŒÂÏó£õ^Ö‹ØGEÁÒÒ’øøxlmmóLS™´Ï΃ trá¥qôÄ3A„Ê‹­­-¡¡¡Ô­[7‡ÍÚÚš°°0êÔ©@hhèsÏX8räHæÍ›G‡055%11—BÏó`cc£u.aaa/­æo¿ý6û÷ïgذay¦©LÚgç‡~ ]»vÒðÅoGoû[¥´A¡Ó¯_?fÏžÍòåË111aÅŠš!s½zõbîܹ¬X±€¹sçønWvÌÍ͹sçõêÕÓÄ¥¦¦b``€¡¡¡,^¼¸ÐÇ“[~…ÅÝÝooo–/_ŽZ­fîܹ/­æS¦Láý÷ßÇÀÀ€ž={bllÌõë×ùüóÏ5²T&íSRR¸sç;vì`ÿþýìÝ»Wþ âԉߥ*Š£wæRÚ‚ ‚ðB (óNÿ‚ x÷ÝwQ«ÕLš4Ic›1cŸ~ú)mÚ´ gÏžLŸ>½Ðy=777’’’4“h,_¾œùóç3bĪW¯Î¨Q£Ø·o_¡Ž'·ü ‹——^^^´hÑSSSFűcÇ^ÊçääÄöíÛY²d ¾¾¾¤¤¤ðÚk¯1f̘J¥½££# …cccj×®Mûöí9räˆæ½CA|‡ÂR—Ò›¼©Ô>˜~Ç 5/n!*üNŽ4Õk6ÀÒõc©Õ‚ ‚PL¬«´L¡ô(L·l=®R–m½´€Ê÷ÁtÕ?ãl£Âï0nÜ`ttþ­$ÉI)|õõ6,šÊX\AAAxÙQÉ;zÏM©9zÙµJOO%øÞ]øç{¶6O§¾½ù³wžÛÛÖiDÕ×úŠb‚ ‚ ”8ù}<ûy¿·&ÂóùB¹wôþU+55¤¤ä Jߺ’–ž†È6=îSÇ0ƒC‡N`ÑðQLA„Gœ9A(oŽžxzÒÑËεk÷HHHsµW¯n…«k#\AAÄÑÊ›£—×8Û„„$¶ÿogžÛõÿ¿¾æ!‚ ¼8{4eÆæËR‚ B©!ýþ äèe÷Ê333ÉÈHךåáøÛXZ>ý˜fFF†xöe€p{ï<ÕáÌX¤°*,âʃG©¬Ü}Ck0¹ ¶U ™þí%)èRBô(ØXÒ­¹=u«›b §Cd| ¿_‰æÊ½Gåê8_–zaf¤G'W;\j˜cn¬GºREhL×c¹þX*¬ B)"ýþ êè©Tªþgjâ.]ÊÙ‘èС©©)"xÐÒÅ';–ÿÀ ŽN¼Qߊ¿nÅ: ¥ —šæ\ý÷ó k[®T‰¦e€èQ~°67`¤[=~»ÅΓ¡¤+3q°2æÆ¶?”*e,ŒõÓ³>çnÇñÅÛ¦ò¿?Bˆ|˜ò\ÛhíóTšÚan¬Çƒ‡©üèÂý¸§iõtuøàíš4©S•Ô '®FÓãM‡çQÞèòº=gnÄrôòMœ2SÉõЭFt º5·§Å+ÕÐ×ÓázH;N†’–¡Ê·mµÌók;ùé,—9A*£WIOLQ ½ôŒ;mºzUHOËвûûÿÁ7›7“™™³swôèiLLLˆ½²s—÷¤æ—vU ¹ùD£]päìª:iiYçoÇÑ­¹=ŽÕŒŽJÄÙÁ c]Îߎc`Gí¼jX±tç5MGF(yŠ¢Gn:¤×³qØu2”oŽÜ¡ŠŽ·7èñ¦[sèü}Þo]‹³·b5óNMíøãÊ'¥Wz-œLùéThí© êÙ›²zï ’S•¼ÓÄŽa]ëú˜µûnjâÞoS“•»ƒžk›ìûtªnÂÊÝ7HISÒ±iu>h]Sóä¿ûèWÑÁûû§l}ؾNžçQžx¥†9Ÿí *ð8»6·Ç¡šKw\'%=“Þ®I·æìðÉ·mµÌók;ùéðÙ¯r¡rPÞïÅF¿:zÙ¿:@LLŒf½—{Oz÷êÌÔ)c077žïTf*Q«A­ÊäØñ.\Ä앞RóK =]RÓ•šNxJº}"=JW©Ô½E'×êl:x›w›Uçè¥(T*uŽzñÓ©Pž$gHÁ¿@Š¢Gn:¤×³q‹þwõß 6°ÿt8Þš¢V« M íÍL^¯gŹÛqØXâRÜþ!/Åp ƒ*ÿù&ÓØ÷g83þóÛOÜË·mµÌók;ùé ‚PY¡›ÔÑó?,Wñ¸{÷ EÎgšnÝ:qéÊß"z)’–‘‰~Í:C=]ÒÒUEÒ@­VsæF Ýßtäug+«³ñÀ-MÙóz”˜.…^ í°°zä`ä¦×³qNÕMéýVMjZ› ¯§ó4lù>ŸÞoÕäüí8º¿éÀo#IËÈ|)´HJUbb Ëã~Ü(H‡Ä” ­6›[œŽŽâ¹·É¾œ”šwZ3c=â§iÖc§Uˆvbª3Ã*<Êö4yüç°vL ÍñW5Ñcö‡µõ(DÛ(j™ÔvòÒAA=¡L=5jBCoæšNGG'GœJ¥âÑ£ºú"z)ŸBMcný3Û\ c"ã“‹ìèe(Õü~9ŠAê²ÿL8ÿLüQÇB(ùvX=T*5zº Í$-&†UŠì íêÌO§B yDjz&úº|6â MºÀ»ñôháÈ{­jP§º)[ŽÞyiêÁÍðÇ4«gÅïQy¦))Jz›üÒ>IÎÀÒTOãàY™Tˆöš@‹Wªqøüý|ïa É,ßyMË!,jY&® ¶S‘®™ŽŽŽåöcäþù'žžžÜ¿¿Àc|çQžË¦2R½EgqôÄÑ+¦Xãc±°°ÖŠËzЧ­iÖS‹£WÚœ¹Ã{-k°)þ6ﵬAÀõ˜";z‡ÏGpø|D‘;ŸÂ‹i‡é›L'W{~»xcƒ*ôm[§X΂ž®™¤+UX™éÓë­ZZéÔÀ¡s íZŸïÝE™Íé¬ìüòWû¼F†2“‹wâIËPQÃژί;°éà­Õ¡4½s·ãèÓ¦?» ÀûmjUˆöýó™0¦ö} gnÄð01=]êÚ›i¿ÿÕ|ØÁ‰í'îÿ$ê–Ft{Ñoß.QG¯ ¶#×Ì’aáÂ…øúúÒ¥Ké̋ޢ³8zâè=¯X–5^eÍÚÍš÷‚r#û•J±‰9&õÝDôRÄÿJÕÌ ˜óQM'àÚÔ%ØH¥ÓR¾.šYöïÝa@§z¸½éÈ£¤tŽœ ™³U‘…ïŽÞჷk3ÂÜ€G‰éüvñ>ÍëWÓþ®¦JMô£Tþ Š~©êÀƒ‡)¬Þs^­jáÞºzUt‰ˆMâÈ…û%®Ci:zûÿ 壎uYèñ:©™¿Ià ðŽ^ÜãT–í¸J÷5˜òÁk˜é‘’žÉݨ'¬ÝsýßIÎ…Ó¥¹#Ü_ÅÂDŸS8x6ü¹Ë÷Ù¸Â´ÊØ^J»DÇŽK$¯²x"X^4ƒ§?Ø›ššR«V-Ú·oÏÈ‘#©V­Z¹Ò¾ ½³Î% sssZ·nͼyó¨U«ÖK­³8z…¯Ï\õ„ÉÓHKM-VÞÇǃ‡òäqÞßÚ½s;‰¤´AÈÁ˜ž.œ½ËÙ[±R•ê–FŒëý*³7_Â(ôonaÍú ÄǽØöôóÞÝ :¢Ä;ð¥ÝI.ÍcËmûÊàd?‡äädîÞ½ËöíÛùùçŸÙ»w/5kÖ,7Ú´ìvµZM\\_ý5ÇçСC/•Î[¾ÙDÏÞ}´Ú|ã&MÑÓ×GWW·Ðùœ=sZ+ŸBýhƦIeP¥¼N·6½JŸ¾ýó´?~œÀïGíg¯båÆþ}{˜5g>:¥é•K ABV5o¿f‹MUÎÞŠ‘2©D¡_Û:éëbfT…¾mkséNœ”K©µ«²%==I“&áì쌫«+6l⇄„àááAƒ prrbÀ€ÄÆÆj:ÃYÿ³?YÉÌÌÄÏÏ&MšP¯^=FMbbb¡Ž'--iÓ¦áââ‚‹‹ ^^^¤¥¥å»¿üøüóÏiÚ´)ÎÎÎLž<™ôôt­Î|öåM›6ñÆoP£F|÷µuëVZ¶lIíÚµéÒ¥ ×®]«°Xccc5j„~ø!Ë–-+UíKRo…Bµµ5'NäæÍ›¢s ×éçG= $”IøÂ³5noÖ`ó‘Û¨TR•)Ä>NeÁàf,ôxäT%{B¥\^GoéÒ¥ÄÅÅqúôi~ýõWN:¥e÷ðð`ĈH½zõ˜?þÓ_¡ÿyâ¡õôcíÚµrøða._¾Œ¡¡!¾¾¾…:ž%K–ÅÉ“'ñ÷÷'""‚¥K—滿ü8}ú4GåôéÓÄÄÄh92ÏráÂ>Lxxx¾û `ïÞ½áææ†——W¥è¤ôÑGøûû—ªö%­w\\kÖ¬¡y󿢳8zò:]jïè-ÜPj¬ >|ˆ0ªk-)ŒJHFj"@}»*ø|ôŠH)1ovÙî÷îÝìÚµ kkk|||hÛ¶­Æ~üøqͲ¡¡!3fÌ eË–ùæ¹mÛ6~øáìíŸ~'pÖ¬YtîÜ??¿gÏž=Zdz`ÁúõëÇœ9sŠu~>>>ZçÖ¯_?>ýôÓ\Óz{{ê5???ªV­ À¨Q£XµjU¥¨‹vvvÄÇÇ—ªö%¡÷³Oâ,,,ؽ{wžé_vÅw(:ûw_¯|Ž^ËW,ãÖí[9â¾Ú ž“¤V ‚ B%&&F묬 ,²8wî¾¾¾\½z•ääd€\¿›¨¨(Úµk§WÐ6YÄÆÆjC­Zµ4ËCös«Y³&111ù::…!«ó`dd„R©¬uáÁƒXYY•ªö%¡wö'q |óÍ7Ì™3‡íÛ·‹ÎB…£Ô½[·o1nÜ`ttþ}‘39)…¯¾Þ&j‚ BÆÆÆ†°°0êÔ©@XX˜–}äȑ̛7:`jjJbb"...ùæikkËþýû©^½z‘ÇÚÚZëxBCC‹4ä³dÏ+<<\óäHÈÉ?ü å¤•†ö%­·……cÇŽeíÚµ"¨P!Ñ)‹¦§§tã AA\¿~™ää'O/£Gä6~õ…¨%‚ åwww¼½½‰‹‹#66–¹sçjÙSSS100ÀÀÀ€ÐÐÐï)™››sçέ¸2mÚ4BBBP*•ܸqƒÑ£GêxzõêÅܹs‰ÕOïÞ½‹}~YçǼyóèÓ§ð³ ævn•””®^½Ê¼yóضmS§N-UíKZï'OžðÅ_P¯^=ÑYG¯°¤¦¦‘””LRr ÉÉ©„…‡Ò÷ƒ®¼÷^{z½×‘^½:i…nÝÚqþüyQKAÊ1^^^XXXТE :uêDëÖ­µìË—/gþüù8;;Ó¯_?Þ|óM-ûèÑ£qssÓzOjܸq´hÑ‚þýûS¯^=ÆŽ‹››[¡ŽgÆŒØØØÐ¦MÚ´iƒÓ§O/öùµhÑ‚Ž;Ò²eK,--™6mZ¡·ÍíÜ* ŽŽŽÔ¨Qƒ¦M›2iÒ$ôõõ9räˆÖP×Òо$ôΚ1ÓÑÑ‘×_3gÎðÅ_ˆÎB…¤Ô¾£÷^Ÿ¾ÀÓ§vƒ¹ó÷Û\»z„„¤<·­^Ý W×F:t‚/7lÅ¡ŒiÔ¨W¯^-¶]^ÆvQZÌ›=«Ü}GO„ŠGyøŽÞü…‹*eÙîß½³Ô¾£W¥¬O6!!‰íÿÛ™§½ÿÿõ•Ö&‚ð’:.‚ ‚ 2qô233ÉÈHךåáøé,-Ÿ¾@›‘‘!J•ag/ éôU\† F§Nøè£4qßÿ=Ç端¾’=rð²µ÷쎭8¹‡ü†Çö[i/"/A„—ÖÑS©TÿüÏÔÄ]ºt)Gº:šš"J•qg/»Ã'T<&NœÈ”)Sèß¿?UªTA©Tòßÿþ—+VHሂPa)ILœ9A*e2KZZ*))OC®®®9‚ %CãÆyå•W8pà¿üò ...4hЀyóæÑªU+Zµj…··7éééšíÒÓÓ™={6o¼ñï¼óß~û­V¾ÙÃÂÂ4/Ó¿þúëŒ5Џ¸8Ñ£˜zøûûãî«+]ºta×®]…²¤C£Fغu+:u¢qãÆš¸¢l¿}ûvºté‚««+}ûöåÆR›¬ónÔ¨Q‘Ê ‹ÁƒsðàA­¸ÈÈHÚ·oObb¢\ŒA„ÊíèéêU!=-ƒô´Œl”?2lƒ<iÂ{½{’’ÂÑ£§ÑÕÕå›oeˆ™ OOO¾ýö[233ùöÛo?~<«W¯&::š_~ù…_~ù…ÈÈHÖ¬Y£ÙfíÚµÄÇÇsøða~úé'Μ9£•gAöqãÆ1pà@üýý9qâNNN,[¶LÄ(¦³fÍbìØ±üõ×_ü÷¿ÿåòåË…²F‡Ë—/³cÇ®\¹’ãX ³ý_ýÅwß}ÇŸþI§Nðöö®ºdb¸zõªÖðÍÂÖåO>ù„ 6hF®lذbjj*_A(5Êdèæ¡ÄÄÄhÖ{¹÷¤w¯ÎL2ss3àéðNe¦µÔªLŽàÌ_g:d¸¨&Å ~ýú¼òÊ+Ì;—W_}•úõësàÀ6oÞ¬ù ì¬Y³2dˆæÛG¿üò‹–}æÌ™ôèÑC“gAö½{÷j– ˜0a]ºt1Š©‡111<|ø{{{|||´Ê7/[at˜>}:VVV¹ka¶Ÿ3g 2„/¿ü²RéUغܦMŒ9xð =zô $$„S§N1ð•µ{ IDATkÖ,©ô‚ Båwô<ÇC­VçˆOLLàîÝk(Š6·n¸};X„ç ëDYCËâãã©Q£†ÆîèèH||¼f=..Nk‚‚g'+(È~éÒ%V¬XAPP))Oߵͭ}‹…ÓcÕªU|ñÅ|þù瘙™1}útÚ·o_ ­0:ØØØäyœ…Ù>ËÉ044D©TV*­ŠR—?ùäV¬XA·nÝX¿~=C‡ÅÐÐP*¼ ‚Pù=5jBCoæjÓÑÉ9šT¥RñèQ†r£„ç!ëãµYÿ­¬¬ˆˆˆ V­ZÀÓÉ,--5é«U«–Þ‚ì“'OÆËË‹·ß~’’’hÕª•QL=5jĺuëP«Õœ…!"<ŒM72á¢JY¶ûwï¤OßþyÚ?Nà÷£¿áÖ³x?F„‡±ßfÍ™_6C7A¡2¢R©Ø¹s'¡¡¡tëÖM ¤”yvB(A4yJ=* U¤A¡dhÒ¤ ŽŽŽ,_¾<×ÉÅ„ÓÑv"(A4¡½ì3Ç ‚ BeD:ŸRæ/£ÓUÚº5ï 6àççÇÌ™3=z´ˆVAß¡9zYÌ7›7oäˆoܨ1sfÏEAAÄÙ.T*[¶lÁÛÛ›¯¾úŠ‘#GÊÓvᥡÔkú›77n0žžC5aø°¹rõЍ!‚ ˜ÌÌLüüühÒ¤ õêÕcôèÑ$&&j쎎ŽlÙ²…·Þz‹:uêбcGþúë/¶oßÎÛo¿MíÚµéÒ¥ 7nüûƒpHH4hÐ''' @ll¬VžBù¥¬5?~ü8 :KKKÍ÷E³HOOgÒ¤I8;;ãêêʆ ŠdwttdÓ¦M¼ñÆÔ¨Q£PíàØ±ctìØ‘ÚµkÓ²eK~øá‡BÙ¡Ü;zOM*A7®Èõë—IN~@ÿÿë›gX¾r™¨%‚ 嘵k×Èáǹ|ù2†††9>ïïïÏ®]» ÂÝÝrôèQ¶oßÎ7èÙ³'Ó¦MÓ¤÷ðð`ĈH½zõ˜?¾v¢,5ß¼y3C† `ðàÁ|ûí·Zö¥K—ÇéÓ§ùõ×_9uêT‘ì.\àðáć‡ªL˜0)S¦pûöm~úé'.\¸P(› •2™Œ%55¤¤ä§+j ¥ï]IKOC(Ï8†:tBÔA„r̶mÛøá‡°··`Ö¬YtîÜ???­ŽsÖ»7#FŒ`É’%,^¼X+nùòåšôÇ×,2cÆ Z¶l)…]ŽÈí [öáœe¥yHH—/_櫯¾ wïÞ,\¸ÐÐPjÕªÀîݻٵkÖÖÖÀÓof¶mÛV“GAvoooªU«Vèv`hhHtt4qqq8::òÙgŸio^6A¨Ž^v®]»GBB˜«½zu+\]‰R‚PÁnú2A‚è*¼|DEEÑ®];­8Å3?ÞfŸ`ÁÈÈ(×8¥R©Y?wî¾¾¾\½z•äää\óÊ–‚® e¥ù–-[ˆ‹‹£nݺ9âgÏž @LL 5kÖÔØ²À, ²ØÙÙ©lÚ´‰U«V±|ùrÌÍÍ™?>;w.Ð&ÎÑKHHbûÿvæiïÿò¡uAq…Š€­­-û÷ï§zõê%–çÈ‘#™7o:tÀÔÔ”ÄÄD\\\¤°+1%¡yZZ;vìàôéÓZŽZhh¨f¨¨666„……Q§N´ò)È^œvàêêÊæÍ›Q«Õ?~œ)S¦pñâÅm‚PTÊä½ÌÌL22ÒÉÌÌÔÄ=|—#d‘‘‘!J•ǧÿþÔ­[—×^{ñãÇk½ -T¼Žx‡P«ÕZñjµšöíÛË„Tò¢kv'¯¢Ö¥èèhfÍšE«V­¨]»6 6dÀ€;vL*l!8p Ó¦M#$$¥RÉ7ž{:ûÔÔT 000 44///)èJNIh¾wï^š5k¦åäÁÓ'rM›6eß¾}¸»»ãííM\\±±±Ì;W+}Aöâ´ƒ1cÆpëÖ-”J%jµZëif~6A¨ŽžJ¥úçÿ¿ŽÞ¥K—r„|Š(Ulܸ‘Q£FqåÊþøãÌÌÌ3fŒLÆÈȈß~ûM+îðáÃKáT`=D×ç'**Š^½zammÍŽ;¸sç§NÂÃï¿þZ ¨Œ7Ž-ZпêÕ«ÇØ±cqss{®<—/_Îüùóqvv¦_¿~¼ùæ›RÐå GGÇ¡¬5ß¼y3ƒÎÕ6hÐ 6oÞ €——´hÑ‚N:Ѻuk­´Ù‹ÓºvíÊðáÃqvvÆ××—µk×Ê&ÂÑKKK%%åiÈÂÕÕ5GÊ–m۶ѱcGLLL°¶¶fΜ9œ={V ¦3fÌÖ¯_¯·~ýzÆŽûLMcÚ´i¸¸¸àââ‚——iii…¶g'00æÍ›k^†Š®‡R©ÄÛÛ›Æóꫯòå—_–;]³:vÙÿg-¿ÿþûìÝ»Wkûˆˆš5kÆ“'OÊ…Ë–-ã£>bòäÉÔ¬Y“*Uª`iiÉ»ï¾Ë÷߯IW˜Ï<;Õú‹š^~ëÖ­´lÙR³ýµk×ʾS¡£Ãøñã9sæ !!!=z”^½ziéþ,ÅuëÖ€€BCCù믿:t¨–=¯e¡tˆˆˆÈ5”µæ cÇŽ¹Ú:wîÌ/¿ü€«W¯æÎ;\¾|™Ñ£GkåY=·ýÔz÷î͉' áØ±c´oß¾P6A¨Žž®^ÒÓ2HOûwH¦¿ÿ 6„Aƒ4á½Þ=HIIáèÑÓèêê²vÝjQ¬ 9qâÍ›7—‚¨ÀtïÞØØXÎ;ÀŸþÉÇsüâ¾dÉ¢¢¢8yò$þþþDDD°téÒBÛ³øí·ß0`‹-bøðá"@1õX¾|9·nÝâÈ‘#œ9s†ÈÈÈr«kV§'{gÏÓÓ“•+WjFs¬\¹’áÇcffV.´8vìýû÷/0]a>ðìTëOïq%?½|@@{÷î%((777Ò(‚ ”½£wè@÷ ¼Gjj*½Ü{ÆÔ)cð]8 ß…³Xà3ƒyó¦2wîTf:‘¦M_Ãÿ¤¿(VF\»v ooï\;}Bjð::Œ5JóôgݺuŒ=íKÁž={ðññÁÚÚ,XÀž={ m‡§Ãf¼¼¼Ø²e ]»v•Â=vìØÁÂ… ±··ÇÜÜooï ¥kûöí111Ñ<Õ æ÷ßgèСåF‹øøxÍôéYä6 mÛ¶m-LMM™5kÔÚîÙ©Öáéôò1bÄY¼x±V\`࿳O?~œ6mÚ`hhˆ™™3fÌà?þÐÊÓÏÏêÕ«cll̨Q£¸zõª4*AAC™Ìºé9~Xމ¸{÷Z®SèºuëÄßßÅÊ€?ÿü“ &°qãÆS þýû³|ùröìÙÃõë×s|< 66Vk éZµji +ÈOßñìß¿¿ Ã.=¢££sÒ»"éêé鉯¯/½zõâ³Ï>c̘1šiÖËVVVÄÆÆjÍ’—õD2»£W˜Ï<;Õ:¼˜éå«V­šçö‚ ‚P&OôÔ¨ ½™#ÄÇG¡££ƒB¡Ð jµšG024ÅJ™}ûö1vìX6mÚ$öJ‚¾¾>Æ c„ >}}ýi¬­­µ¦ ÕzBQ`×®]ìß¿Ÿ 6H¡?§¶¶¶„††Vh]»t邞ž~~~œ?ž–+Þyç¶oß^`:[[[Ο?¯õ.Rö!š%ÅÈ‘#2d.\ <<œ7näú© ‚ ”+Gïa|,Ö˜›WÓ ëⲇ,›-'È r¥ÌÆY¸p!?þø#M›6•©DŒ7Ž“udÑ«W/æÎKll¬f:éÞ½{Ú`ooÏO?ýĶmÛdÖ°çÔ£_¿~Ìž=›ÈÈH?~œcèfyÓÕÜÜœ;wîhÅ) &L˜À† ˜0azzzåJƒ©S§²yófV¬XAhh(J¥’¤¤$~ÿýw­t/âó¹!ŸAž—RºÙ²eKÖ¬Ý €J•÷¯“::ÿQQ©ÔXYZ2nœ§(VŠd½øÿìŒO·nÝÂÄÄD ¨3cÆ >ýôSÚ´i@Ïž=™>}z¡íYØÙÙ±sçNú÷ïOff&'N”Â-S¦LaÁ‚ÿgïÎ㢪ú?€fÙDAÜ!5·(ÜÌ…rÁOᎊ¦"®˜j®hjšúTfQVj‹”dŠ!˜š¢(î K¢€‚ ËÌüþ@ÆfØd™>ï×k^0çœ{î½çÞ;s¿sî=÷#¼õÖ[ÉdX¸p¡VoWOOO¸¸¸ 77WiD:tìØnnnZׯmÚ´ÁñãDZyóf¸ºº"##ÆÆÆèÝ»7>¬Lïܹ“&MBjj*ììì°`Á‚_ž’áå=<<`ee…¹sçÊŸûEDDT‚ 5+e ù"_,~© ~ýéÞ›:O³³Ê,óÃwa˜2íMDÔˆMŸ>ãÆƒ««+£–øÌ÷Äö»ð8#½VçóÓÑ×fœ¨2H>ÑãÆ+ó={½ݦM¡££SézþމVª§2R’“°÷ÓO±}güõãóý{1~bÙ£zOžúZÞ°5…±Al>z[5Ãî-`f¨‹±1·2qUôT¥®’:û¾PÛmyòJ:þ;Ä¢GyxœS¨v™´iŸ#jžD"AaaÒ€,™™*åÌÌZ ke9víØÊ=€¨ æÏÅã†Û•èù‰´ú“¶æú8|&ù…RôyÅÃ_³À¡ÓÉWÇVø#6ÇÿCG(À€®-ðf÷–øåâCùôíÌ ðMd ļaÛãûY!áá3|{ö_yÚð×ÌñÕ™€cg3´2ÕÃ&#¿P ç^æÜ­N^I+wù7ýx‹]m±éÇ»ò´Å®¶JëeeV\oÞó `Ôøýrî¥>ƒ¡žúu5ClB¶Úº¸/ ÖÛR\ Áï—ÓàÒÛ_IT*S™·6ísÔ8ÎÓ=½>hÜžôùeR©Džvùòe•rNNÊdq^ï8í۷LJ~<Šˆˆ¨ÁøpQÝ`”uaÜïWÒ .(þžÿûöôëb&/{ "I^®P"Cäõ xŒh¯T×o—ÓWP|~pñî êÖ¿_IWJðê‹:{¶7ÁwQÿ";¯p:.ÓœÛâ÷JžtËÊyêj†¼çŠ$2ê7ž²òŠþOZ¥Ú¤¡[ìj«ôþãçAZm·¥ @bzÓò0 «"¯?V™^÷9ªäçY==Oÿö›C‰DZði$ÐËÏ#/O¬”foo_g¿”ì8ÙÙY<Šˆˆˆ^滼°HmzVnB@(È˶iiç^°j®Ý&Bµu=ÉÍWš^]šbF:˜ñV»J/_EåßgWù.*ƒ^m‰]Í_(Åo—áö¿9UžgCôíÍ Û¶6Ú²¤LDì#LunKS]ùªÚ¼ÏQå”užþ4;륯öÓÕÕ…±‰i­Öû®ÛdÀ–×k<ØÓH §£ÛùÊ yû„D"Q) CCCì?°3¦¿üЛ%A^VÖ=DDDÕP™ËõJ§½Û¿5~¿üwSs_(…ž®¾ã;+MSÞôêÒròŠp B„§yE5²å-KJF¾9[|ªµF÷µÂÖ”§¶ ÷…ÚiË’2EŽÆ<ÀÄ6Ø2Aë÷9ªœ'™™0mÞ\ù‡¤'O›û§ÿ<õRu¾9Ô ‰´VëÍyZ¼ëŠ];¶j4ØÓH wâ—(¤¥½èÞë:ãÆLJ‹çÁÄÄ@ñåE’"Èd€L*Á§¢s>¦Z^ûöíõ1‘&½&:I¤(,’¢¹a8õ´¬0 ¨(íâÝ'x§N\zˆ¬ÜB˜›4Å næøþ\Jzïö·Ad\:çA(Èˈ %ha¤‹Œ§Üê¨-ëLËãâÝLŒ|£•ÖïsT9OŸ÷虘÷”egeáiv"#OcúÌÙeöÌ•WßÏ>ÅàÁoÖI½Š±G£ ô|¼gª=€rr²pï^¥ž£.£†áöí—&Ê®[±`‘/23óÈ!""ªöÉ}åÓKÒŽŸ€áö­à6° ²ó q.þ1º·3Qš¦¼éÕ¥½žŽ¯¶„ûÐv06h‚ô§ˆŒK¯ôÝK—+oYⓟÂmP˜é"#»?D§ÈËœ»ñ³FtDÓ&B¬ùú÷…:hËÒuÆÜ|Œ÷Þl§õû\}!2D„èÎKLiˆÑ/9ÏÈÈÓxû±J1Cdäi¼?ez•ƒ1061Åø nøáÈ·uR¯e++ôzíuöêi$ГA†ÄDõ×s …B•4©TŠ'O² ¯§_k¿:mܼ ¦Uª«¹¡>¦My:::üÆ'"¢Fvr¯ú}xøz¹i7’²q#)»ÔÉyF¥§W—&“‘q鈌K¯ò:”®[ñ½ºù^eášHý}CgâÒp&®ñ Æ¡®ê¢-Ëšï—Š”ÞkÛ>WŸ½;f$dR$2dR)$2@&•!¿P™L‰T9] ::ªÆ?kZ´4é«óZµ²®óz5I#^æãt˜š*7fI/žrÛÈž§ ƒßYJ\eàÁ³¦UªË\ŽÿûÏÄY."¢†&(h`Ù²€z»lÚ¼ÚèQÃöT\‰T©Túü¯ â‚"H¥2•ôÆzÕžŸ@á’^uWüis½2ÐëÝ»7¶‡¥ç”&¾ht©T³æÍ1}úÌZûbš0¢FŽP¡P@¡P¡°øoñ{!„¼Ì†!“ÉøeGDƺuÁò/3ÀÒÂÝztGîÝÕ~ajógdɲ•¬W@ÀR5•n;í_ÆÀ÷º—™·êP7"‘¶S œÊȼ½¼Ê­"tÇŽjÕ[zú²ÒUêmŒÞìYs1{Ö\©«‹À«ü‚Œ5JþþK •Hð83ÿüó~:þ®Å^ÅD·‰hÒ¤ø«eéR­ ’ÊZ¶Òïµy4MZÚdŗ׸¡ˆêsœ§ðù+ÐP½Þ^^ò ®¢ R^º©Qe6¾ …ò N(xüAð" e0Ð#¢FI&“A ¢eË–xë­· ÛD碣qö¯(¼9d0 $d½<(€ÄÄDœ>}¥A&“¡mÛ¶pp苎;*•gô;ˆŽŽAff&ŒŒ áз/úôé£4ïèèh\þç2žæäÀÈØöööè߯Ÿ¼G±²óò÷_"ÿ‚ƒC”–¹ô:TfÞòõxçmD‹FÖ“'0kÑ#GŒ@»vmþ÷)QMde\bYúóg{h¨Úé}¼½Õ~VU¦Þí¡¡ðñöVàm ­°^zÚôÅ$(Õ«§Ð)ä ÊÈž×Ç/;"j쟥ö¯Ûã\t4®ÇÅaÈàAjË;v999x÷Ýwѱc£ Ëù¾*|éz+[Ÿºzµ!ªó½•«–#þf¼JzÏ=±bù*}1÷â_Žù¢WO]ЧÜóÇ="jŒJîe?} 064,³7là€þˆ<û¾Û¶ï€ŽŽôõõÑÂÌ ÃßrF×®]Õ~É•¼ïÞ½;"ÏF!õáC@kkk 4@¥|§ŽöídeeÁа† ˆ×^ë%/çèè©L†øø›øçŸË04l†~ýѧOï*ÏK^gß>ˆùûo8ø9`—úr•˜7="¢ ô þ1Š=oAk×–[‡ºÞ¾ªÔ[zú²ÒK×Ûh=Eqq ÈÊÊ«6ßʪìí{ÔØüÊjüysç”{}o?3 iÓ¦üâ&¢FÃÇ{~¥?cKÊ–¤µoßíÛ·«ðs¹k×®èÚµk™eôF¹¬Ê¼J/›ýëö°ݾÂr•™wéiÊJ#"¢ŠÏµÕ]b)‘J´¿^z@VV.¾þ®Ìx = IDATüò.ç¬É@OWWºÏ»]kªN""âg*i¯sçÎÁÇÇÿþû/RRR*,occ#/§ø?UÛ’*7©^bù8#R‰ô¥ê{øðAÕÛh=‰D‚ÂÂ¥Y233TÊ™™µVb¨Sž@1Ð#ªŠµk×"((#FŒ`ci™ñÜPTX ÿN(*,Àø nøòóöÖ´li^¥ú22Òqò·:«·Ñz%×´JºG/?6‘"'§a±8'DD Üüysù9MuêÆpvvfCTƒJZMöÎÙØØ`èСøòË/•Í(ÉcO`ÃUTX±X,Ÿ——}}}Œs€£?y©:ǹN¨³zm —Ÿ/F^žrCØÛÛ×ɼyADDDÅç#ùhÒ¤ ¢šj;ØjÞ¼9<ˆéÓ§³±‘¼¼<µiFFƘà6ù¥ê”Õi½2ÐÓÑm‚‚|åË1##OcÿÁƒjD‰ˆˆ†¡¡!Bwlƒ·×zDDDZÈÆÆ!!!رcRSSÑ¥KlٲݻwˆD"¬Zµ QQQ(,,ÄÀ±uëV˜››Ë§Æ®]»ðàÁtêÔ !!!HHHÀöíÛ‘””„.]º`ûöíò{$ 6l؀Ç#77#FŒÀÆaddTá²*þMIIQÛCÄ^£—ßjª-ƒƒƒ1zôh <vvvjËhÓ¾E5£¬sö§O³ke~µUo£ ôNü…´´4ùû±®£1nìp|¸xLLŒ_ÞY$)*~ ¹T‚?NE!òldµ½o}Á£†ˆˆ¨EEEáèÑ£011Áž={àç營þ0mÚ4¬]»»wïFaa!>þøc"44T>}dd$Ž9333ìÝ»îîî:t(ÂÂÂäi¾¾¾8~ü8 44±±±‡±±1V¬X   —»œev¤}LLL°~ýzøøøàرcj{aµiߢšs.ŠP=ï™j£ôœœ,Ü»§r 6¸Œ†;wª5ßÿ¼çŽ|-»v–ˆˆ¨¦\¾«ñeFóæÍsçÎÅÖ­[åy§N’ÿ¯¯¯8::*M¿aØ™™<<<°~ýz„„„(¥mÚ´I^þðáÃøê«¯`mm ÀðáÃy2^‡Jß§WÁsÿþý1`À|üñÇð÷÷WÉç¾Õð¸Np«÷ë’œ„ãÇ~l\ž 2$&ÞT›' UÒ¤R)ž<É‚¾÷z"""-Vä€ŠŠŠäï/\¸€   \»v Ïž=•wKNºK¦W—¦Xgjj*† ¢T‡ºŒ©Ofë¨WtÉ’%;v,œáàà ”Ç}‹HK½ÌÇé055Wy.(wôÉž§ …fÍšq‹ÕSsæÌÁªU«àää###äääÈï‡zY–––8~ü8¬¬¬ªRÔ¤ òòòäA@ff&7šµ¥®®.¶mÛ†Ù³gã§Ÿ~ªWûQ£ô±=ô @*-{`¡ðÅ/&R© -ÌÌàååÃ-FDDTO‰ÅbèééAOO‰‰‰ ©vîîîðõõÅÚµkaccƒ;wî`Û¶mصkW•ëêÖ­vïÞ¹sç"++ +W®äF{IµÕ–;w†»»;–/_^¯ö-¢Fè-^è‹Å }ÙòDDD̦M›XYYaîܹ8vìXµêôòòÂÎ;1iÒ$¤¦¦ÂÎÎ ¼ÜÀm7nÄâÅ‹±uëVXYYaþüùòdH{ÚrÆŒxÿý÷ëÕ¾EÔ(="""j˜ÔÝ«¥˜6jÔ(Œ5J夽²Ó«K …ðöö†··wµ—·GWJ›2eŠÚò­³üv¨©¶T—'pèÐ!¥4mÛ·ˆ´M@DDDDDÔ°ÔYoh&""¢ºTzØEì‘#¢†Õù¥››6oÄ­Û·TÒ»½Ú |rO ""¢Á`Žˆ³:ônݾ/¯© uäiÏró°ï³ÃÜDDDDDDõ1Ѐ‚1î'Üd2Èd2XZXæxz”9MïÞ½1{Ö\n1""""""m ôÄâ|äæ>+~#’’1qÂHääC! ” qâÄ`7‘VzŠââ•• Vm¾•U ØÛ÷à–"""""j$žfgklÞB¡Mtu¡§§Ç@¯:²²röõweæOš<‘{:Q#º}«Fæ«££ËV–ppè;»W o`™LÆ@¯²$ ”dÉÌÌP)gfÖPXXȽˆˆˆˆ¨‘X¸ØO#ó•J¥HJJDÄïá0kÑ;Ú"?_Ì@¯* XüW"O»|ù²J9'§a±8{;Q#aÓ¦ÆæÝ¶];XYYãèßc¾·½ªÈÏ#/O¹Áìíí¹G‘ƵïЩþ…P(¬·ë ‘@OG· ò•/ÇŒŒ<ýB"‘¨”ˆˆ†¡¡!ö؇Ó9ô&UŸ ªNDêãµq ½ œø% iiiò÷c]GcÜØáøpñ<˜˜(¾¼³HR™ I%øãTbÎÇ0Ð#"""""ÒÆ@ÏÇ{¦ÚÑkrr²pï^¥ž£.£†áöíûÜbDDD¤UsÏ`m­{eêµ±±ÁСCñå—_ªœ;²·–HCž 2$&ÞT›§î:X©TŠ'O² ¯§_oº¥¹ #=­FÊ5vÍ›7ÇÁƒ1}út6Qé¸J3Í|œSSs˜˜´”¿LMÍŸ§)¾Jò,‘j彨üÀU[ë#"¢šcccƒ/¾øŽŽŽhß¾=FŒ¸¸8y¾H$´iÓйsgtìØï¿ÿ>ÒÓÓ•¦ÿüóÏÑ¿tèÐÎÎÎ8þ<ÂÂÂ0hÐ yñññòi$ ‚ƒƒÑ«W/ØÚÚÂÓÓ999U^öŠ–í?þ€³³3Ú·oGGG|õÕWòe.ù[ò?Õ]›ãÀ¸sçÎK/‡&÷;¢èõîÝÛCbë¶زõÅkó–ýؼe?¶l-~mÛ~Û¶Ķí±uÛ~9ò+ÆŒ§±†ÊHO“¿ÊK#""jÌ¢¢¢pôèQܸq...ðó{ñ,¬iÓ¦ÁÃñ±±ˆ…­­-•¦ŒŒÄ‘#GpãÆ ¸ººÂÝÝ C||‚‚‚ª¼Ü-Û‚ °xñbܾ}ßÿ=.]ºòËSRRx© ÚÔÄÄëׯ‡ŠŠŠ^j94¹ß5¨@oö¬¹Ø¿ï öï;ˆƒûÿW櫤LI¹-›·¡WÏ^ZÛ»wïAKs XX¶Â«ÝºcáÂExúô©J¹o¾ù‚uk¼fÿ:öìù´Üze2>ùdúôé +ëÖèõš=¶mß®öGEUéi,,,Äò+йKt²µÃÎO>‘çåççヅ Ñ¡c'tèØ .B~~¾Ò|<û×߀•uk ê„«×®ÉóÔ-K‚H„÷Þ{íÚw@ëÖ6˜ôŸÿ(ý²VÖò”UßÉ“8h0¬¬[Ãþõ7ðÅ_òÈ&"Òàà`XYY¡Y³f˜;w.®=ÿN€S§NaàÀÐ×ׇ±±1üýýqúôi¥é7lØ€Ö­[ÃÀÀÈÉÉAHHˆRZll¬¼üáDZvíZX[[ÃÈÈøõ×_«¼Ü-›¾¾>=z„ŒŒ ØØØàã?æÆÖ’6íß¿? PæôÚ¼ß5¨@¯¡ÊËËCÔ_g‘œ”ˆåË–áó/¾ÀÒ€•r¿üzÇCܵ«°··GÀ²eøì³ÏʬwÇÎX±r%ûõÃý{wñÞ{ÿÅš5á“]»jlÙ×oØ€øø›øóÔ)üsé"þý÷_y^PÐ:¤>HÅ…¿Ïãïó1HNIƺuÁJÓÿõ×_øõ—Ÿqïî¼óÎ;X¸p€÷–îõüïßÃܹspëf<âãoÀÎÎË—¯¨pyʪoÞüyð_²"Q~:~ .^àID¤!Í›7—ÿo`` ÔËráÂŒ?¯¼ò lll`gg‡Ç+Moff¦4½º4Å:SSS1dÈùe~öööJ?VVE˶wï^œ>}ÇÇ€ðûï¿sckQ›.Y²§OŸÆùó竼šÜïˆèÕ ~€.]º@OO“'ÿðÛo¿©”[ˆ–-[ E‹ \ صkw™õîß¿ðáâE000ÀÜ9s ÜàP]0Tžo¾ Ãú`´nݦ¦¦Z»Vžwäûï±n]ÌÍÍaaaà`ùþ{¥é7nØkkk4kÖ ^^óqõêÕrçõ×Y <úúú011ÁŠåËqêÔ©J-:úúxø0ééhÓ¦ ¶mÝÊ’ˆH Í™3Ó§OÇ¥K—œœŒøøø ¯P©ˆ¥¥%.^¼(¿Ì/%%ÉÉÉ5¾lööö8xð ®^½Šµk×*]’JšoS]]]lÛ¶ ~~~*÷Êió~GÔ =333¾jÓ¹èhŒ=í;t„¹…%,[Y?ÎT)ۦ͋›ŠÛ<¿Á8¹œëÏÿý÷ O_´4·@'[;@RRÍ}˜<|øíÛ·W›—––¦”×¾}{¥g –lÛ¥ñRçüù¿ñÎèÑhÛ®=Zš[ MÛvÈPøe­¼åQçàÔ©?ñæP'ôîÝ'ÂÃydi!±X ===èéé!11±F‚%wwwøúúB$¡¨¨ñññðôô¬ñe›7onݺ…¢¢"Èd2¥ï:ܽ{—XÃmÚ¹sg¸»»cùòåõf¿£Æ¡®bz%V®ZŽI“'ª¼>ZXo7ÞÌ™³p.:Ÿ~ºþMAJr¨ýµ(9ùEPWàµ)gD)›Ö€øוI{ô°Æ–¿U«V‰Djó,,,˜˜(/‰`nn^­ù͘9³fÎBܵ«HO{„„û÷”Úª¼åQçõ×_Ç¡C_âÖÍx„¬‘_:JDDÚeÓ¦M „ÜÜÜзoßj×éååLš4 ¶¶¶˜?>\\\j|ÙFމY³fÁÎÎAAA •çyzzÂÅťюºYrù¢âKSm:cÆ •¤µy¿#ªMuþ½ø›ñðòš ¡PGžö,7û>;\oQ"‘(þõ)??Á!!庫°yÓ&ÀªU«_RP–9³ç `Ù2¬\ƒuAk¡££ƒèèìÞ³ß}VætUyßäÉÿÁÿ¥Ø¾m+ ±aãFùå’ãÇ»" `BC·–àÝwÇWºmLMMqçÎØÙÙÉÓÄb1ôõõ §¯Qb"Ö–º4³¼åQWŸ‡Çl|øábtìØ2™ Il"" P7B¢bÚ¨Q£0jÔ(•óÊN¯.M(ÂÛÛÞÞÞÕZÞŠ–mܸq7Nýèß>>>ðññá6/¥¶ÛTݼ:T¥å¨ëýލÁzPP Æý„{€L™LK kÀ¤ÉËœÆÑÑ‹úje#~ºg7ü—`Ü8WX[[cÁ‚²?˜\FÄÛ1HKKK|´f <}Ÿ(Å25ƒÌ”Åkþ|8{ ¹¹¹ò sû¶­X¾|’¦M‡µµ5¼æÏÇ?üX©åQWŸËÛ.˜2u`gg‡ÝåÜóHDDDDÄ@¯–ˆÅùÈÍ}VüF$%'bâ„‘È/ȇB@ (âĉ3ZÓh¥{ÉÞ|óMœ‹úK)mÆôéeN3yòäJ× S§LÁÔ)SªµŒåÑÕÕź  ¬Sóü}}}lß¶ Û·m«ô|Ó-ZˆE‹*å¿ýöÛxûí·•ÒƒÝò–G]}ïŽwÇçÑLDDJÊ»ìϼ#"zµ,..YY¹bÕæ[Yµ€½}n)"""ªsDÄ@Oƒ²²röõweæ—w9'iI '‘HPXX 4 Kff†J93³–€ÂÂBn)""""""mô¤Réó¿yÚåË—UÊ99 ˆÅyÜRDDDDDT'$ tttèUU~¾yyb¥4{{{îQDDDDD¤q¢„XY·–wP1Ы$Ý&(ÈW¾32ò4ö<(&¢ˆˆh"tÇ6x{-àžGDDDDD5N"‘àÎí[8ò]\߀üü|zUqâ—(¤¥½‚¬ëhŒ;.žcÅ—wIŠ “2©œŠBäÙHzDDDDD ܇ }42_Xµ²ÂÛïŒF§N¶x–›Ë@¯*|¼gB&“©¤çädáÞ½8J=G\F Ã; Ü뉈ˆˆˆ¸›46o©TŠ‚‚‚zäi,ГA†ÄÄ›jó„B¡ÚÆ~ò$ úÜ뉈ˆˆˆ¸ì¬,6B} ô2§ÃÔÔ\©W¯¤O¹£OöÜbDDD¤µÁ±íˆm ·x¡//ôeËQ½Ã@E5xëܹ3þøã¥1d2œœœpûömy›iKÛÙØØ`èСøòË/UÆ…`0J ‰M@DDDD/ËÀÀ'OžTJ ×ê[nš7oŽƒrã="""¢ŠØØØà‹/¾€££#Ú·o#F ..Nž/‰0mÚ4tîÜ;vÄûï¿ôôt¥é?ÿüsôïß:t€³³3Ο?°°0 4H^g||¼|‰D‚àà`ôêÕ ¶¶¶ðôôDNNN¥—·ªó³±±‘ÿ_PP€… ÂÎÎöööصk—Rýå+ªÎzhÚ¼yó°sçN¥´;wbþüù*í­-mŒàÎ;e–Ѷý•Hk½ÌÌL¾ˆˆˆ¨öEEEáèÑ£¸qã\\\àçç'Ï›6m<<<‹ØØXØÚÚ"00PiúÈÈH9r7nÜ€««+ÜÝݰ°0ÄÇÇcôèÑðõ}q Hhh(bccŽ+W®@__AAA•^ÞªÎOц ‘‘èèhüþûïøë¯¿ª”¯¨ºë¡Io¿ý6ÒÓÓqáÂÀ¹sç™™ —2§ÑtÛ™˜˜`ýúõðññAQQ‘Ú2Ú¸¿Rý¤©˜¤Î{ô6mÞˆ9ž*¯mÛ·p/ ""ªç‚ƒƒaee…fÍšaîܹ¸víš<ïÔ©S8p ôõõall œ>}Zå¿uëÖ000€‡‡rrr¢”+/øða¬]»ÖÖÖ022B@@~ýõ×J/oUç§è‡~Àš5k`nn ¬Y³¦JùŠª»š$ 1wî\y¯ÞŽ;àéé©ö‘YÚÔvýû÷Ç€ðñÇ«Íׯý•¨*ê|0–[·oÁËk*„ByÚ³Ü<ìûì0·Q=×¼ysùÿJ½%.\@PP®]»†gÏž€Ê`fffJÓ«KS¬355C† Qª£tå©êü¥¥¥¡mÛ¶ò÷íÚµ«R¾¢ê®‡¦Mš4 ›6mÂ?þˆëׯãÀå–×–¶[²d ÆŽ ggg888(åiãþJ¤Õˆq?á “A&“ÁÒÂ0ÇÓ£Ìiz÷îÙ³æÖÛ†ninÈHOã^GDDÒœ9s°jÕ*899ÁÈÈ999èÚµkµê´´´ÄñãÇaeeUçëcaa¤¤$tèД”T¥|mYšÐ´iSÌœ9 ,€ŸŸš6mZ/ÚNWWÛ¶mÃìÙ³ñÓO?5èý• Æ"ç#7÷rŸåáÙ31’’1qÂHŒ3cÇ8cìØaJ¯Q£†àâÅ‹ZÛˆb±[¶lÅСNhÓ¶,[Y¡{ž˜è6‰{‘Â÷¥žžôôô˜˜¨tÿÞËrww‡¯¯/D"ŠŠŠOOÏ:YWWW¬^½HOOÇÊ•+«”¯-ëQS¼¼¼ ‰TaÑö¶ëܹ3ÜÝݱ|ùò½¿½:—€ÈÈX|w$Çÿ‰cÇÿÀ±cò×ùóÿhufggÃÅåmlܸS§MEܵ«%ÜǞݻÐTW—{Ñs›6mB`` ìììàææ†¾}ûÖHpáàà€I“&ÁÖÖóçÏ/wšäççSSS888`ذa0`@•òµe=4AÛÚnÆŒHKKkÐû+5>M4½YY¹ûú»2ó'Mž¨Õ ¸~ÃÄ^½ŠÕ«Waú´iòôAƒaРA*åþ›·lAbb"lmm±qÃz 8Pž¿{÷,[¾B¡æææ5r$Ö¬ „±±1€—€nÙ²[·nŃ©°³³ÅŠ+s_ý5222еKlܸAþ¡T2Ý';w`ÛöPÜ¿–––˜çé‰9sfËçÿWTÖ¬ùqqqÉdèß¿?æyzÂÙÙ‰G •K݃¦ÓF…Q£F©œ`WvzuiB¡ÞÞÞðöö®ñåU—¦ø¿žž¶mÛ†mÛ¶ÉÓ{g*ʯ©õжm®ím§n™:¤”¦mû+QUi¤GO"‘ °°‰Dž–™™¡ò*QXX¨µ xüxñõÜ'L¨TùsÑçðç©?ðÙ¾½¸yó&,ø@)?//QErR"–/[†Ï¿øKTê¹rù "ÏœÁûqýú üßÿý™ã|L4<€«×®aÞ|/•é~ùõŽ;†¸kWaoo€eËðÙgŸÉógÏžƒ .`ï§{p÷Îm,Z´{÷îå‘BDDDDTh¤GO*•>ÿû"л|ù²J9'§a±8OkðÑ£GŠo®Œ¥þþ044ÄÈ‘# "‘RþÂ…/¿É“ÿŸ ðÛo¿©Ö°†††æìü"miqÝ#†Ü¿_eº5hÙ² 0p5~úé'ìÚµ3gÎäää@¯iS´nÝ¡ú÷Ç€þýy¤Q½£ø€îÒ*ê‰""b ÷òóÅÈË+¥ÙÛÛ×Ë´´´DJJ ÒÒÒ`mm]aù’2ºÏïß“Édò¼sÑÑZ„«×®!77Wž÷ø±êÃÍ[¶TªG1Ø,ynbÝ%Ú´yñ¥×æù`²Â—]ÀÒ¥XóÑGpötttгgO¬\±o¾ù&""ªWÌQc¦‘K7ut›  ¿ù/.ÉŒŒ<é3§cÊ´)òטqï //ÑÐÑÑÁþû´®G~päûï«]×Ì™³p.:Ÿ~ºþMAJrR™ÛËJN~ñ¥WàµQøÅsΜٸ{ç6~ÿ-Ë–àòå˘=g.""""¢zD#=z'~‰RÙh¬ëhŒ;.ž“âAG¤R)Š$EÉ™T‚?NE!æ| fLŸ¥U ¸ÄÏgϞźuÁ066Æ»ãÇCWW—þù;wìÄ¡C_Vº®’{MLLŸŸà_Þ•«Vaó¦M€U«V?îæÈó§L†ø Gò4}}})DDDDD ôÊçã=Sm/UNNîÝ‹ƒ@ PÉs5 ·oß׺455Eø‰øä“]øì³Ï° ………033S –*ãÓ=»á¿4ãÆ¹ÂÚÚ øÔøòºŒ‰·ßy"‘–––øhÍxx¼žÝÝßÇêÀ5¸páú"pu """""zå“A†ÄÄ›jóJî/S$•JñäIôõ´³gÉÀÀ‹/ÂâÅ‹Ê,“‘žVaÚ›o¾‰sQ)¥Í˜>½Êõ”•“'OÆäÉ“Ë\Îáo½…áo½Å#ƒˆˆˆˆˆ^Õd>N‡©©¹R¯^I/žrGŸìyšÙÙY000à#"""""Ò¶@¯wïÞØz •–=ȈPøâòM©T³æÍ1}úLn1""""""m ôfÏš‹Ù³8Šc]+ëRN"""""b GUôÓÑØDDDDDÄ@¯¡™2Ã@DDµîÂEO6B-³±±áƒØÙ–D ô™™™5ê†.(ÈçÞFDDÄàƒmIÔÈh*ªó½•«–#þf¼JzÏ=±bù*î DDD¤±@Dñ=•ŠÛ¯,)))lK" «ó@/þf<¼¼¦B(Ô‘§=ËÍþÏ7è†V÷€x"""¢úŠ=bÜO¸ÈdÉd°´°Lš<±Ìi±x¡/=¢Fââß1è7`0 ¸\Dõ„ BBB°cǤ¦¦¢K—.زe ºwï‰DXµj¢¢¢PXXˆbëÖ­077—OŒ]»váÁƒèÔ©BBB€íÛ·#)) ]ºtÁöíÛѵkW€D"Á† pøðaäææbĈظq#ŒŒŒ*\VÅ¿%AJIÀRV¾¢—wcÚØ–Dš#ÔÄLÅâ|äæ>Cî³<<{&FRr"&N‰1c†bìgŒ;Lé5jÔÄÄÄÔï––Éøâ‹¯ª¼´õØá1ÍW}8n4(** GÅ7àââ???yÞ´iÓàááØØXÄÆÆÂÖÖJÓGFFâÈ‘#¸qã\]]áîˆ„……Ýám IDAT!>>£G†¯ï‹~CCC‹ððp\¹rúúú ªp9K‚Ò—V6¿:ónlØ–Dš¡ñQ7ãâ•• Vm¾•U ØÛ÷¨÷ Í=¢†uìhÓr534³ÜΗ´Bpp0š7o˜;w.¶nÝ*Ï;uê”ü}}}øûûÃÑÑQiú 6È.ðððÀúõ뢔¶iÓ&yùÇ㫯¾‚µuñÕA>|8‚ƒƒk}]59mIÔ½¬¬\„}ý]™ùå]ÎY¯NV¹¯Õú±chh„Ü: dõ¸8_ªM%A ¨¨HþþÂ…  µk×ðìÙ3€@ Pš^qt:µiŠu¦¦¦bÈ!Ju”®³¶hrÞ Û’¨z‰……J²dff¨”33k (,,¬ÿ'« ¿þã­·ÞÂ?|¯ò!fddŒœœ§Ü3‰Ê8vÊ’“ó99OååkûX*Ý£§éãZS=Œm¾T=sæÌÁªU«àää###äääÈïµ{Y–––8~ü8¬¬¬ê|}49mITó4ržT*}þW"O»|ù²Ê«„Xœ×ÎV•î¡03kŽO÷|ªþþ ÞgÂ_jœ§Ùòå÷uu,©;¦5}\kês£±Í—÷èU›X,†žžôôô˜˜¨tÿÞËrww‡¯¯/D"ŠŠŠOÏÊ=8ÞÄÄwïÞ}éüêÌ»±a[5’@/?_Œ¼¼âW {{{•WC"{>ÂhɯÐ[6oÆî={póæM•¼’ÿóòò0ßËÖ­m`ÝÚ^ÞÞÈËË“ç›`ïÞ}èÞ£'Z´4G_GDEEáË/¿Äkö¯Ã¬EK 8×®]Sš_|Õ‡—ºc§¬cEñ˜(ù FÆ&ò´’ôÐ;Ð¥kW›˜B&“¡¨¨+W­B‡Ž`aÙ S§MÃÓ§O«¼\š<®`Ë–-èØÉ––­0×sÄbq®·X,Æœ¹ž°´l…N¶vòû®Jò«Z_AAüý—¢}‡Ž°iÓÛ¶o¯tUµ=÷íû ݺu—·Ý•+±•ίh½Âû }aÖ¢%ºu뎃jÅq£­6mÚ„ÀÀ@ØÙÙÁÍÍ }ûö­v^^^pppÀ¤I“`kk‹ùóçÃÅÅ¥RÓzzzÂÅÅ¥ÌçÁU”_y76lK¢Fèéè6AA~! ò_\’yÓgNÇ”iSä¯1ãÞA^^""¢¡££ƒÐÛL gbb‚­[·`–Çl¨=YóÑGxðà.ÿs ÿ\ºˆ¤¤d|´v­RÙS§Ná×_AR¢nnñÿ ÇCrR"\]]áí³€_"Ð+IËÎzÈÎz‚ì¬'Jùþ¾€È3gõ$2™ ?þÿüs‘‘gp÷ÎmèëëcÅŠ•/èi글³E!ú\®^Å£G°6(¨F×û£µk‘žžŽ«Wcõ×YüyúŒÒzUµ¾uë‚qýÆ œ=‰kWc‘’’R¥6ªJÙÈÈHüöÛoHJaôèÑðöñ©t~Eë5{ö,Å¿)É8qâWœÿûïFè•7z%Œ5 QQQHLLÄùóç1cÆ ¥üЦW—& áí혘ˆD"DDD`ìØ±•Z^ܺu«Ìe¨(¿:ónh*ÚNlK¢º'Z³R¶`‘/òÅâ—ªàןŽá½©3ð4;«Ì2?|†)3<®bllŒ´´4¥2ãÆG—.]`bR|ŽT*E‘¤¨øj©œŠÂ¥K±åÜRžu­BuÖóeýtôL™á¡Ô>&¦Íå'¢+V®D&Xµj¥J^—®]ñËÏ?ÃÖÖpçÎŒ3ñ7nÈË&Ü¿‡-ZòòòÐÊÊZ%ͦM[<ÎHçÞNõJì•ÐoÀà2GWTÖÖ/îéÞ£'~üá{¼òÊ+€GaÀÀA¸sûV•–K“ǵ‰is\þç:uê¸{÷.Fƒ7®×Øzw}õUüòóÏòyܹsoôî#_¯ªÖ÷ê«Ýpüø1ØÙÙ©äU¦ªÒž¢„ûòÁ<Ôµ]yù­W·nÝñÁ ðÎèѰiÝZãÇͲ¥þؾsW­æ—|·QÃôùþ½=n¼üýÂí¿áÝ1#‘ý¬© R©ôù_ÄEJe*é-Œõ…->#ªö£Arö~ú)V¯ù¨þÿ’œ„ãÇ~DÀŠ@¥¶?qR™Ódggáψ“p=¶ÚóÔÈ`,>Þ3Õþò˜““…{÷âÔŽ²ä2jîÜI¨·º  @íû%~~pyû89;¡ßó!¦Kò=JCëÖ­åï[·nGÒ”ê222’¿×ÑÑQ›VTT¤2¢úzìT”§˜¦.¿eËJé<@ï>Ê— ‚ ™òæ­‰ãÚÚÚZþÞÚÚ=Rʯîz?|øHi­Ÿ5%ï«Z_êÇJí ¨2mT•ö444,·íÊ˯h½Ø7mƺà`›`]ÐZŒ9’®–(ë2Ae>ψ¨¡ÐH 'ƒ ‰‰7Õæ …ªW“J¥Rbrssñ0õA™Óx{y!tǼ;a">|[[[,ZøAµzô4q\;8:`ð7‘››‹±cÆ`‰Ÿ_¹uVu½ý—øáC__¼þFoaÞ‹¦hz0–GS¹·UÁí[ñè7`02ÒÓ¸\D•´vM c!¢jã`,5£QÆÒñ^¢†uìð˜&"""mÆ@'…DvîÜY­ €ü2M𼨤ÅѼ°8ž—Édò¼˜˜¬_¿qqqÈÍÍ•çUfD«’‘¬Jæ¥X/5^¼?•ˆˆƒ½çÁž““S•îÉ«)sçÎÅ£Gð¿ÿýC‡EQQlmm´1Уê{999044¬óy—<ÐÒØØb±ü17QÁ{ô4LAìØ±¯¼ò ÜÜÜàìì\釗QùG«åóôˆˆˆHSØ£WÏ©»¢2iƒVùsÊ”)åNSÙyñ˜$"""Ò,öè1Ð#""""""zDDDDDDÄ@ˆˆˆˆˆˆèQ=SÙ‘iÏ;‡¾}ûr$[""zDDDÔP¬]»AAAÙ–ˆ¨’øx"""ª666µˆÝ¸qÎÎÎld-Üæ¥1'b GDDDT)ùùùhÒ„§-Úˆ‘v⥛DDDTm%=;666J½<‰ÁÁÁèÕ«lmmáé鉜œœj×-‰0mÚ4tîÜ;vÄûï¿ôôt€¿¿?¾ùæ¥:¾þúkøûûsCÕn"zDDDÔ”ôꤤ¤(õð„††"66ááá¸rå ôõõTíº§M›ÄÆÆ"66¶¶¶ |ôÑG ÃñãÇÇŽ÷ß~‹µk×rCÕn"Íã5DDDTk>Œ¯¾ú ÖÖÖ€€€ >ÁÁÁÕª÷Ô©SòÿõõõáïïGGG€®®.vïÞ±cÇâÚµk8vìŽ;ÆK?kIéûôRRR¸}ˆèQ}û çuøÜ~DDU‘ššŠ!C†(¥ ‚j×{áÂáÚµkxöì™J½˜0a¶lÙ‚•+W‚£–¨ûnáö!Ò<^ºIÔ€9""mcii‰‹/Ê/»LIIArrrµë3g¦OŸŽK—.!99ñññÉdòüëׯã믿ƾ}ûðé§Ÿ"!!£qû1Ð#-rçÎxxx {÷îèСÞ~ûmüüóÏl ZU­½uD¤i&&&¸{÷®Rš»»;|}}!‰PTT„øøxxzzV{^b±zzzÐÓÓCbb"üüüäyÏž=ƒ··7vìØ„„„`Μ9‹ÅÜHu„Û‡ˆi‰û÷ïÃÍÍ ƒÆÙ³gqëÖ-áèÑ£l""ªOOO¸¸¸(ýPåååLš4 ¶¶¶˜?>\\\ª=¯M›6!00vvvpssCß¾}åyK—.ÅŒ3Я_?ÀðáÃ1qâDp#Õn"z¤EÈóæÍÔ)S`ff†¦M›âõ×_ǧŸ~ªTî‹/¾€££#Ú·o#F ..NžWÞPÊ@qÕ矎þýû£C‡pvvÆùóç†AƒÉëŒWšæ“O>Ák¯½;;;,Z´å®Ky=aEEEX½z5zöì‰W_}{öì‘çåççÃ××]»vE×®]áçç‡üü|¥zËZÿ²†¯¨MÊZž²ê«ìz`áÂ…°³³ƒ½½=víÚÅœˆjnݺ¥t…P(„··7bbb ‰±cÇÊó+{5Bér£FBTTqþüy̘1C^fÛ¶mxï½÷”Ê{xx`óæÍÜH5¬¬íÇíCÄ@´ÄÙ³g1nܸ ËEEEáèÑ£¸qã\\\”.Å(o(å‘‘‘8ränܸWWW¸»»#""aaaˆÇèÑ£áëë«4Môÿ³wçqUÕùãÇ_ì‹@"D¯" .å”:n)ZJn”ƒÚ ô&³\@ÅÔPSD Dq/—jê—~óŽ[Ô˜–©IˆkJšˆ:Ê( . ,wùýaܼ —{Ù|?}œGp>ç|Îù,Ð}sÎyŸ¤$öîÝKRR¹¹¹,Y²¤Zmjj*{öìáðáÃdggëÊ/^LNN III|÷ÝwüôÓO2É…B!$Л‚‚š5kVåvQQQ¸»»cooÏĉ9}ú´®lß¾}øøø`kk‹££#³gÏæÀ -[¶ÄÎÎŽqãÆQXXHtt´Þºääd½}"""P(( """ؾ}»Ás4•¿§§E‹899®+Û±c‡îX®®®,\¸;vÝþŠTÕ'†Î§:¶oß®×–ˆˆ™äBˆz­ü†Š!„¦“×+œ¹vínnn·kÚ´©îk;;;T*•îûªR)—çÞý+Zwo­[·Öû:77÷¡ÛyõêU<<<*,ËËËÓ+óððлͲªöW¤ª>1t>Õ‘››«×oâBQ“$¡”BÔ,¹¢'èׯñññÕª£ªTÊ+##C÷uff& …â¡ërss#==½Â2…B¡w¬ôôt\\\iŸ:ŸêpuuÕk˽_ !„B ôÄcbÆŒ¬Y³†M›6qýúuJKK9yò$ãÇ7ºC©”«#<<œüü|òóó™?>£F2¸½¡Û|˜;w.ÙÙÙܼySïVIæÍ›G^^yyyÌ›7ϨçËU”V¼ª>1t>Õg¬‘#Gêú­¼-B!„B=ñ˜iÛ¶-qqqìß¿Ÿ>}úСCÂÂÂL t ¥R®Ž^½záëëKïÞ½qvv~ Y‹©mûöí4hÏ>û¬^P8{öl\]]ñññÁÇLJæÍ›3kÖ,£ë®(­xU}bè|*ªÏX3gÎä‰'ž W¯^¼ð ôíÛW&¹B!ÄcDžÑ:íÛ·çã?®´¼¢ç'î]7lØ0† ¦W>vìX£÷¯l]pp0ÁÁÁF·ÃÐs–––,X°àl ¶¶¶ÄÆÆûPí !$$D¯¼ª>1t>Õgl»mllX¹r%+W®Ô …B!ÄãA®è !„B!D##Wô„h ÝÂ)Ùê„B!„z¢ÁFúB!„B˜NnÝB!„B ô„B!j†±™…&±µ5?e ô„B!„B¦ÔQÕ¶J¥’°°0Ö¯_OQQþþþDGGcmm]cs8::ºÒýe¾Ö_uÕJ 7êouÞÁ«W.“Y&„B<"YYY^)Y½z5ÉÉÉìÞ½GGGÞ{ï="##‰ŠŠ2ù‰‰‰ìܹ'''Ö¯_ÏÌ™3ùæ›oX¼x1999$$$ Õjyûí·‰‰‰á½÷ÞÓíðàA¶nÝŠ³³3}ô£GfÀ€ÄÅÅéÖ…††ê>h×ä¹?îêëø˜R‡1Û&%%±wï^¦M›Æ’%K «±9lh™¯õW]ÅB’ŒE!„ÌæÍ›Y´h-Z´ÀÁÁ9sæ°k×®‡ª+** wwwìíí™8q"§OŸÖ•íØ±ƒˆˆ ®®®,\¸;vèíCË–-±³³cܸq­·.99ù‘œ{c¦T*+\îU_ÇÇ”:ŒÙ¶¼ …‚ˆˆ¶oß^£sØÐþ2_Åýä=aÒ/r¹§]ÆI!L‘““ÃsÏ=§·ÎÌÌì¡êjÚ´©îk;;;T*•îû¼¼<<<>¦Ôa̶­[·Öû:77·Fç°¡ýe¾Š: ô.ý÷ßíÙEi™Ê¤ýRJ½jäø%¤È !D­sss#>>ww÷Gz…BAFFžžž¤§§ãââÒ ÎýqP_ÇÇ”:ŒÙöÞ6fff¢P(j­d¾Ö_¬Y¥•%C£m»¶+ÐËÊÊ"!áGžàËÓÏtÑ{(µ"Z­€˜è÷yù/CkäÎì:'³¬ .\`ñâÅ$&&RTTÄSO=ŤI“x饗¤sêQP'™Ã„õ•““/^ÄËë?ÒŽ=šÐÐP-Z„R©äÂ… ¬\¹’µk×Öè±ýýý™7oË–Ý}&Þ¼yŒ1¢ZuÖÖ¹?êëø˜R‡1Û†‡‡ Àüùó5jT­õ‘Ì×úëíéïðË©S’ùZYXXÐõÏfèP?%&ÖÚqk%ÐËͽJËV­tœ± €Z«E­©þ" ‹%88˜×_ggg¬­­éÖ­6lÐÛnãÆôîÝ›6mÚ0dÈΜ9£+KKKc̘1tèжmÛòÚk¯éÝ[®T*ùüóÏéÓ§žžžøúúräÈâââèׯŸ®Î””½}>üðCºté‚··7Ó§O§´´Ô`[ ý•D©TÖzÔj5QQQ<óÌ3xyyDaaa•croªò{Ût óŠz¯î±…âa„„„ššªw§¹¹9S¦Láðá䥥±wï^üýýuåÆÞ•PÑv÷®³µµ%66–sçÎqîÜ9bcc±µµ5zÿŠÖUuîÂðøÕ×ñyØùiÌñ‚ƒƒ9uê.\`ÅŠºW#ÔÆ–ùZ•Ç6-[)Éͽڸ=µZ¹¹9ZæE£Vsòز³2(înS‹0,!!Á¨ÛÊÓúž={???fΜ©+3fŒ.#Vrr2^^^,X°@oÿòÔÉgÏžeäÈ‘Œ=š½{÷GJJ Çà¯_婊“’’ÈÍÍeÉ’%Õjkm·áÞtǧNÂÖÖ–ÈÈH£ÿG”••eð—{eåÕ9¶B!„¨å±¹™9jµºqz•ljµš“?çÆÍ¸·lYÉ=äŠ^-((( Y³fUng(­ï¾}ûðññÁÖÖGGGfÏžÍôö75u2Tª¸²¨¾´¡.ÓKªe!DCQYŠþÚz–E!•ººøTk¹(µZ­^ã´Z-¿$Ÿ¤àZ>/ ŠZ¥Ö%aѵh$P{䜹vínnn·3”Ö÷رcDFFrúôinß¾ <˜Ö×ÔÔÉPuªbSÕvê2ݱ¤ZB4’XJÈ9Ы µè¡E«ý£‘Yd¦§Ññɧt X* Õp IDATRR¦¦¸T%3äëׯñññ¼ùæ›]Ç„ ˜?>ÄÁÁÂÂB:uêTís«NªâúІºLw,©–…B!êÖ½1Pmªµ[7Ue*JJJt‹‹«+žmÉÊÌ ¨¨P¯¬|¹Û1w¯èUw†Í˜1ƒ5kÖ°iÓ&®_¿Nii)'OždüøñF×Q\\Œ 666¤§§ë=ûVáááäç瓟ŸoTªâêÜæó(ÚPžî8-- •JEJJ AAAFí[žªüaË«sl!„BQ}÷Ç7.Ð+¿u³|Ñjµ´mçE3'O§¬¬¬âgô4’u³6´mÛ–¸¸8öïßOŸ>}èСaaa&½¿%66– àííM@@={ö¬‘s«NªbS=Š6T'ÝqE©ÊM)—TËB!„uë1xF¯âƵñlKÚ¥ÿRZZª—‚V·Ÿdͬ5íÛ·çã?®´¼ª´¾Ã† cذazåcÇŽ5zÿÊÖlt;ŒMõ\[m(Owˆ7¦+rÕŸ1ïС?üðff¤¾Ójµ 8óçÏ×X?ÖD=’MH 'j”)Ï$ !„B4$vvv|ÿý÷ üG’‰Ý»wcoo_¯ƒw¹…R4vrëf­z²È"‹,²Èòè—ºT~¥D©Tê]5Q«ÕDEEñÌ3ÏàååEPP………UÿçŸNŸ>}ðôôÄ××—#GŽG¿~ýhÓ¦ C† !%%E·OII ¡¡¡têÔ‰N:1sæLJî{gï‡~H—.]ðööfúôé”––>ЦûÕT›‹àà`>øà½u|ð“&MÒ[WŸÇÔ:ªÚV©TlÀÆéÝ»·nÞž9sÆè~R*•÷—ù)$ЫÕ@O+‹,²È"‹,|©WJ²²²ô®’¬^½šäädvïÞÍ©S§°µµ%22ò¡ŽqðàA¶nÝÊÙ³g9r$£GfïÞ½ÄÅÅ‘’’Âðáà Õm¿xñbrrrHHHààÁƒdee£WgRR{÷î%))‰ÜÜ\–,YRåyÔd›ƒ_|‘¼¼<Ž;À¡C‡(((ÀÏÏOo»ú<¦Ôa̶Uµ#11‘;wröìYüüü˜9s¦Iýdh™ŸB½Ú ôäŸü“òOþÉ¿ZøWmÞ¼™E‹Ñ¢E ˜3g»víz¨ºbbbhÙ²%vvvŒ7ŽÂÂB¢££õÖ%''ë¶ß±c( \]]Y¸p!;vìЫ³¼\¡PÁöíÛkµMâä¹9'NÔ]Õ[³f AAA˜›ë̬ÏãaJÆl[U;¢¢¢pwwÇÞÞž‰'rúôi“úÉÐþ2?ëŸÒÒRÔ*u­ßy!ÏèÕʽÆÑŽÈן&ìó_d@kQ;wþç¹Ö4±µ”¾B4H999<÷ÜszëîMÚa gggÝ×vvv®S©TºïóòòðððÐ}ïááA^^ž^­[·Öû:77·VÛÔXËŽ;øõ×_ùôÓOئ>‡)u³mUíhÚ´iµæ­¡ýe~Ö?ÿùúkžúÓÓ´m뉕••z+ÐÓJ[ÄCòçæ|ùc:²ïÞ[ÿþ?ŸaÎÿK–ŽB4nnnÄÇÇãîî^ëÇV(dddàéé @zz:...zÛÜ[ž™™‰B¡¨×mª¯¬­­yóÍ7™:u*3gÎÄÚÚºA‡)u³íôÔ~’ùÙ°ôéÛ—öceaNOOÌ-,jå¸rëf-G aQ8Yóm˜û?Y8úi‚_ò¦s'½g?ä˜Ú]Üm¹˜S¨ûþÝÏN=t]ïÿóéSYd‘gô)'''.^¼¨·nôèÑ„††’––†J¥"%%…   Z9æÍ›G^^yyyÌ›7#FèmN~~>ùùùÌŸ?ŸQ£FUYo]¶©>›>>øøøÐ¼ysfÍš¥·M¯^½ðõõ¥wïÞ8;;ë%s1ÐÔU›²ú<¦Ôa̶ÓSúIægãlÕŠ‚ë”Ýs›í£f1O;uz(%]îúú+þñϱܺy£^wîê•˨N;Ö×;·s†žõ~òýýù6däÝ&áLå÷Â/ە퉙 xÆ '{+®\/fËéüvíÍ­ñïÝ ¯˜››q1ûq?¦SX¬ÒÛÿù§Ýx¢‰y7JØ–˜ÂɆ]šãì`Í•ëÅ|y œ‚bÝ>ÿ9úÏ=톥9§.]g{b*µÖàyÎú×ÉzÓs33†vw§g¬­Ìù5ý&[Ò))Ó“Åc»V¸¾¼m‹ÇvåëÃYôÿ“NM¬˜ý¯“tlåÄK=[¢x†›·Ëøáäޤæ?PWeý#„hØî_ϪÖr-?ï‘ÿ¿íõ±ã¤Ã…¨è}#x?ßçÿúˆá#þ¸ 9mÕ^þËPnÞ.C­Ñ¢Ñh~ÿ¯–âRöõÍmHJJdyÈ“Ž•™ÁG6±°ÁÏ…¬Ì â¿ÚÁ»sÃïÆ#+–1êå¿Òôžg‹ïwóæ öïý¿áþÕ:æœ÷È3zµ¡!<׿ÝÒ‘¯dUy®íÜ›ða|*wJÕ<÷´/û´fõWç3¸;e²é‡KXX˜1äÏ-Þ[Éæý—uû·oéÀºoÎST¢¢gWÆñâ\æM6üç‚nÝ_}Z³&>U·O[w–m; @`ÿ6 îæÎŽþöÐ}^Ûmص9J{VìH¡¸T͈>­ñëÑ’í‰Û0󓟉y³3?ùY·.æÍnzmkíz·Þ¢ßÑWžó`ÛOœÍ¸ƒƒº¹sø\^…u !„BˆÆ È­›µ1¸ `±·±àV±Êà6Û3¸~»Œ•†ý¿\Eéb§+_ºõ,ç»E©ZÃR5ÿ9ö”ŽzûoIÈ  ¨”R•†ÏäbceÎÖŸô×µRØëíóUR&·î¨¸uGÅΤLºy53xž¡Ÿü\¯Úгƒ Ûep½¨Œâ2 ÿ9šÅŸ<›5.øà«ÃYÞ3nej ŽöVØÛZRPXÊ–ƒé•Ö%‹,²4¾¥!+ÑzE‹BÓɽZP¦R×ûs,*QaciÆÍÛ†ï¾QTª×.ss3]ûÚ6wà/϶¢•ÂkKs]`qoûo•<Ð/÷¯»·N€+wÐüþ—+×ïàhgY­>­í6­í6ܼ]ƲígõÌꜯ¡sI»ZȆ]ç1žôx‚¿hË{Ÿ4¨¹(„B!ªOnݬ¥@¯¾/ÿ9šÅ n-èó¤+vÖX˜ƒ‡«=o ñ2øz…{×YYšS¦ÖPªRãìhÍ+Ïyê•WµEëFõñ ‰­Ml-Õ׃cçó ¶eåÄžS×vÎ\åžoƒ‹£5ffТ™ÿäetªtC}sÿöÿÔŽæMm)/ª…¹™®ìN‰×'l$½,²Èë„BÔA,PÛäŠ^­ ný?ǫ׋Y½3…á½[1âÙÖX[™“™w›ïÎÖ;ÿŠÚR¾î¸Ä(ÞêÍ¢2öþœÍŸ½›½eë.fßâÝWžÆÆÊ‚Ÿ/^ã›ÃYUö©¡òÚnÞ¿1¸[K&ûwâ‰&Ö\½^̷DzŒž÷ogè\’/]ç­aíQ8Ùpåz1ÿïû‹ºmöžÌ&ôo±±²`ʇGäSˆFÈLº@!„zµÅ7Ù×nóÑ®ÔJË'pØàºSÿ½Æ©ÿ^Ó+ߟœcôþ•­ûîÄo|wâ7£ÛQQuÙ­vÏb÷qÓïÙ¿¿î{¿¯è¸ÇRó8–ZqZõoeñí1yn@ ô„BH '«@OúO!„BˆÆñYV½Z\é鿊}8åÙJË‚W'Éà !„B ôêm ‚Dz+hõ!iŸB!„èÕÃ@O.é !„B!$ÐklžôBQ¥RY§/˜®ë㋺›š¬_æ‘0¤´´D½ÆèI¤'„B!„Äè5*Þö‘NBñÈ…LÚT§Ç—«üü||}}9zô(ÖÖÖºõo¾ù&Ÿ|ò‰îû’’zöìɾ}ûpqqydó®22Åãè™K× !„BS¸¸¸Ð½{wöìÙ£[wýúuöìÙõk¼v×®]ôèÑã‘yåÁ\ùRÑ÷BÔ‡@¯.‚= ô„BQmåWU”J¥ÞµZMTTÏ<ó ^^^QXXhRÝ}ûöåܹsºï·lÙ¢ûúܹsôíÛ¸{õ(44”N:Ñ©S'fΜIII‰Þ9~ôÑGôèуV­Z=pœäädºwïÎÇ,j„ÀÀ@½±8vì†cÇŽéÖÅÅÅX'ccÊÜ«j[¥Rɇ~H—.]ðööfúôé”––êÕ±qãFz÷îM›6m2dgΜѕÓ~Cû×ÄÏ‘@O!„Âd÷_M)·zõj’““Ù½{7§NÂÖÖ–ÈÈH“ê0`‡ ;;›¹sçê>ä&%%1pà@/^LNN >^”ãuîÜ€/¿ü’nݺЭ[7>ýôSllltåu16¦Ì=c¶½÷ü333Q(FŸËö¿&ŽD]Æyr릨c.\`ܸqtîÜOOO^|ñE¾ùæé˜FÀPêi!„¨)NNN\¼xQoÝèÑ£ %-- •JEJJ AAA&×=pà@ÂÃÃùë_ÿ ÀË/¿LXX˜îù<æÍ›G^^yyyÌ›7#FTYw‹-ضm›7ofõêÕ2&  ::š>}úw“çÄÆÆX§ccÊÜ3fÛððpòóóÉÏÏgþüùŒ5ÊèsyØö×ôÏ‘@O<†.]ºD@@ýû÷'!!ÔÔT"##Ù¹s§tŽB£áçç§÷ǥɓ'Ó«W/ñòòbÒ¤Iøùù™\÷€ÈËËÓ}81b¹¹¹ºçófÏž««+>>>øøøÐ¼ysfÍšeTýÍ›7çßÿþ7[·neÅŠ2˜&xùå—¹uë–.ûé³Ï>KII /¿ürŽ)sϘm{õê…¯¯/½{÷ÆÙÙ™ÐÐP£Ï¥:í¯ÉŸ#!žx ÅÆÆÌë¯¿Ž³³3ÖÖÖtëÖ 6èmg(õoZZcÆŒ¡C‡´mÛ–×^{Mïþs¥RÉçŸNŸ>}ðôôÄ××—#GŽG¿~ýtu¦¤¤èíSU:ãûºzUUúâGцšJ‰\Õ¹ýðÃøúúÒ¦Mz÷îÍ_|¡×÷§<BˆšBjjªÞ³ÅæææL™2…Ç“––ÆÞ½{ñ÷÷וûrçÎIKKÓÝî¦P(HKKã©§žÒmckkKll,çÎãܹsÄÆÆbkkkðX÷®ssscÿþý¼ýöÛ2˜&pqq!---ZwŸ_»w¬jslvîUµ-@pp0§NâÂ… ¬X±£Ï¿ºí7æü„zè‰ %$$u ¡Ô¿cÆŒaܸq$''“œœŒ—— ,ÐÛÿàÁƒlݺ•³gÏ2räHFÍÞ½{‰‹‹#%%…áÇ?ð²ªÒ›ª¶ÛPS)‘«:·©S§2cÆ ÎŸ?϶mÛ8qâ„Þÿ(äå±B!„uè©Õj,,,$е¯  €fÍšU¹¡Ô¿ûöíÃÇÇ[[[™={6ÐÛ?&&†–-[bggǸqã(,,$::Zo]rr²Þ>U¥3¾_UÁLm·¡¦R"Wun¶¶¶\½z•üü|”J%K—.•‰-„h0Êï:¨hBˆ†è]+¸F³f.˜™×^ø%¯W8;;síÚ5ÜÜÜ ng(õï±cLjŒŒäôéÓܾ}x0õ¯³³³Þþ­»·N¨:±©j» 5•¹ªsûè£X±b±±±899±`Á,“[Ñ ÈBæ§h¬®^½Ê‘ÃIôèÑ këZ;®\Ñôë×øøøjÕ1aÂÞxã Nœ8Aff&)))5r?ruÒׇ6ÔTJäªÎ­k×®|öÙgüòË/,Z´Hï–T!„BQ7Nü™.]º P(°ýý"z¢Ö̘1ƒ5kÖ°iÓ&Ý‹NOž<Éøñ㮣¸¸lllHOO¯±@ÃÔtÆÕ¹ÍçQ´¡¦R"WunÁÁÁ¤¦¦¢R©ÐjµzW+Jy.„B!½ç ¤ukjõ¸è Ú¶mK\\û÷ï§OŸ>tèа°0“ÞñË‚ ðöö& €ž={ÖȹU'±©Ej*%rUç6tèPÞzë-¼½½‰ŒŒÔ{ßPE)Ï…B!Ä£÷ÄO`go˜Õêqå=¡Ó¾}{>þøãJË«Jý;lØ0† ¦W>vìX£÷¯l]pp0ÁÁÁF·ÃÐ}ôuцò”ÈS¦L1yLL9·#FT˜‡„„"“\!„â1!Wô„B!„¢‘‘+zBÔ!C·RJ†/!„B!žh”{°#ÁœB!„xª}릹¹9FzR!„B!ªA«Õb^C/U¯v-O4mJ^îU!„BT›d–qâqvóÆužhê\#uUûÖÍ'ŸêLÂþ}tx²M›aff&#$„Bˆ: ä–x!óAÔ»àíæ*·Ñjµ\/¸FêÙºõèQ?½'š:ó§.]8ŸšÊ/§NÉmœB!„¨÷~¨—ùV~~>¾¾¾=zkkkÝú7ß|“O>ùD÷}II ={ödß¾}¸¸¸ÔØñoݺÅÒ¥KÙ½{7ÙÙÙ4iÒ„gŸ}–±cÇÒ¯_?™¢^Ù¿÷û*·177Ç鉦<Ý¥Ký¹¢ puCáêV¯;x݇«e– !„BÔºwïΞ={>|8ׯ_gÏž=\»vfÍš°k×.zôèQ£AÀĉiÓ¦ qqq(•J®_¿Nbb"+V¬Ðz¢æ9ÚZ¢ÖjÑj4¨µ Õh±µ2G«Õ¢Öè¯×Jwéø ÷¯“ãÊ{ô„BQm}ûöåܹsºï·lÙ¢ûúܹsôíÛµZMTTÏ<ó ^^^QXX¨Wׇ~H—.]ðööfúôé”––êÊ~øá|}}iÓ¦ ½{÷æ‹/¾Ð••?çuïï}ö˘c ãêó±cÇÐh4;vL·...ŽÀÀÀjûý~úé'ÂÂÂðððÀÂÂþò—¿ðïÿ[æÃ#ÐÉú"¿îþ³ß­%õûuœÿaÿÝ·K>â·Ä‘}èS®þŒÜ£ŸsíØçœØÈõéd}Q:¯I '„Bˆj0`‡ ;;›¹sçê>4'%%1pà@V¯^Mrr2»wïæÔ©SØÚÚ©WWRR{÷î%))‰ÜÜ\–,Y¢+›:u*3fÌàüùólÛ¶'NJ¥’¥K—}ŽÆ[ÏÒÒÝø=z”3fè½-[¶àï便eµÇý~Ÿ|ò ­Zµ"44”§žzŠ^½z1þ|nܸ!óáÒh4¨ÕjÔ**•в²2ÊJK).¾Ã;·¹}û6·‹Š(’+£艆åqM}\U»%%´B€Ç×zË—/çË/¿àĉøøøw¯ò<÷ÜsºÛèºvíª»"T®uëÖz_çææê¾ÿè£8pàƒ¦oß¾|÷ÝwFŸ£1Ǧ)¿}³¬¬Œ7nн{w®_¿Nii)[¶l!00°FÆý~NNN¼ûî»üðÃ\¼x‘/¾ø‚Û·o3a™B”ÿ1Fº@!„ÕÕ¤I<<<ˆÇÖÖ–^xeË–±{÷nÚ´iƒ½½=nnnÄÇÇãîî^i]xzz™™‰B¡Ð•uíÚ•Ï>û ­V˾}û˜1c?ÿü³Qçẖ…i:wî À—_~I·nÝèÖ­Ÿ~ú)666ºòꎻ!fffx{{Á“O>iô¹Ë|\Ñ:.\`ܸqtîÜOOO^|ñE¾ùæéa¹Â)ÄãkàÀ„‡‡ó׿þ€—_~™°°0Ýóy£G&44”´´4T*)))éÕN~~>ùùùÌŸ?ŸQ£FéÊ‚ƒƒIMME¥R¡ÕjQ©Tž‹““/ê'‚0æØÂtDGGÓ§OànbžØØXÝÕ¼š÷ûýío#>>žÜÜ\Ôj5¿ýöï¿ÿ>Ý»w—ùP ²Ë¢¬L?YŽJUF^îUé ôD}séÒ%èß¿? ¤¦¦ÉÎ;¥s„BeÀ€äåå1bÄFŒAnn®îù<€É“'Ó«W/ñòòbÒ¤IøùùéÕÓ«W/|}}éÝ»7ÎÎ΄††êʆÊ[o½…··7‘‘‘¬^]ñë“‚‚‚ðóóÓûã“1Ǧ{ùå—¹uë–.³ê³Ï>KII /¿ürûý¦M›ÆÎ;yþùçiÛ¶-þþþܾ}›uëÖÉ|¨¹Wr8’”ˆJU@YY§~>Áí¢"¬ml¤ƒê ¹uSKpp0¯¿þºn]·nÝØ°aƒÞv7ndÍš5äääбcG–/_®»-#--ùó瓘˜HYY>>>¬X±Bwë…R©$**еk×’M»víˆŽŽæòåˬZµŠŒŒ :vìȪU«èÔ©“nŸ°°0Ö¯_OQQþþþDGG뽜õ~†^ŠZÕ9–––2kÖ,âããqppxà^ÿªÊ•J%ááá¬_¿žœœ233Q«ÕÄÄİyófŠŠŠ2dK–,ÁÁÁ¸›*|Ñ¢E\¼xwww¦NÊ«¯¾Ze™!*•ŠE‹±uëVT*o¿ý¶î\KJJ˜;w.ñññøûû³páBl~ÿÅ\QÿÝ»N©T]á<¸?•õ½ûÜÛ/½zõâŸÿü§îÃ`ù¶Ã‡çÇÄÑÑQ~(…h€:wîLZZšî{…B¡÷=Ü})ð”)S˜2eJ…u”ÿÞ®°|Ĉz¿;*Ú $$„W­Ð IDAT“Ž-Ž‹‹‹Þ8·nݺÆÇý~>>>ºç>+#óáÑyºëŸI>õ3‰ ?âêæÆ•ìl\›»ó§gºrãzAã—ÌÒZm“™X˜i±³ÌÁå°Zô\®äçåÊOI=’À¼yóªÜ.11‘;wâääÄúõë™9s¦îöÎ1cưhÑ"Ö­[GYYK—.eÁ‚zm=xð [·nÅÙÙ™>úˆÑ£G3`ÀâââtëBCCuAü‘nîþoÉ’%„……=T;«:ǘ˜òóóIJJB«Õ2mÚ4½ý«*‡»IvïÞ­{9ì½é›yï½÷ˆŒŒ$** ¸›*<::šÁƒ“››ËòåËuÁœ¡²ª÷ÔÔTöìÙC“&MX¶l™®lñâÅäää€V«åí·ß&&&†÷Þ{Ïè~¬ldeeUhßÛ/û÷ï'<<œ¿üå/˜ÿþ›tùòå¼õÖ[ä !„õœ™™zº §9Å¥‹iëåÍŸžîÂ×kì[w'Öz»l¬-éÖ© jMs¼ÝmÐjökßk$Ð+Þú÷ïÏöm[133“À®)(( Y³fUnEÓ¦M˜8q"+V¬Ð•íÛ·O÷µ­­-³gϦwïÞJÎÎÎŒ7ŽÅ‹­·.66VoŸòtËå_ ô*»šgÌ9nß¾­[·ê¯ÿþF—ÃÝg ʃ<¸›¾ù‹/¾ E‹Ì™3‡Áƒë=C©Â6ø–-[ˆ‹‹Ó3<<\W¶cǽ6,\¸€€“=Có 2÷öË€hÒ¤ ;wîdÔ¨Q\ºt‰ýû÷³páBùaB!H°÷Tç§Q(´låÁ­›7j´þ•¡­Õö¨ÕŽž¹LÜw'±·µÁÉ¡9®MöÕèEɃò¯ýËà6ùy¹ôÕCÎÎÎ\»v­ÊíÊ?ÜØÙÙé=ìØ1FEûöíQ*•x{{?Pgy@W¾Eëî°Þ”tËU©êsssõŽçáá¡·UåÍ›7×û¾ªô͆R…?lñ«W¯Vxnyyyze&§“64*s¿„„„°|ùrÔj5K—.%88X7'„BÑ0‚=·æîÞjðm±°0çÙgÚñ¿:yž‚"UƒoSzƒ½@ø‚.]¾\é6. W\® lÕ·æî\¹rEïC±[sw”­ZSPP€V«åÃ×Ò£GOÜ[´ä™.]Y¹jÕ—R×­[‹ÂW·æ<ùTg¦M›Î­[·ä'ÐHýúõÓ»]òaL˜07Þxƒ'N™™IJJJ\òÎÈÈÐ}mJºå‡9GWWW½ãÝûµ1åqssãøñãdeeé–ÌÌL]yyªð_~ù…E‹1sæL£Êª:fzzz…e …Bï¼ÓÓÓõ®@ZZZrçÎÝ÷dÎ 2+++¢¢¢8~ü8£G–D!„¢žt¥¥¦=3§V«ôîòk(ºtPr§´ŒÒ2õ#;Fùß¿Ÿ~ýqoÑ’®ÝþÌÆ›êg ·zÕ*ììl™ùD¯®iÓÞ¦cÇŽØØØð?ÿó {ö쑟L#µmÛ–¸¸8öïßOŸ>}èСaaa•f6«Hll, ,ÀÛÛ›€€zöìY#çfJºåêžãÌ™3yâ‰'èÕ«/¼ð‚.U´±å©*}³¡TáÆ¦¯(poß¾=ƒ âÙgŸÕ ~gÏž«««.cYóæÍõ‚¹%K–ðí·ßÒ©S'FŒA¿~ýLêãŠRXWÆÂ‚¶mÛ ?„B!D=5ôÅ9tè'Χž«òÎZ­–+W¯péÒ%†¾øâCS«ÕÖÙR›lmí¸r%‡ü¼%ª•F£aóæÍ\¾|é!ø@!Dãׯӓ6žžÒáÎ;º„s÷'*ìÖ­ÿû¿›Ðjµ|¿w/!!Söë™9î#y`“&MX·n-ÉÉÉUn;lØ0<œÐÐP½}’’’Ø»w/IIIäææ²dÉ’j´©©©ìÙ³‡Ã‡“­+[¼x1999$$$pðàA²²²ˆ‰‰©öù›ºÏêÕ«INNf÷îÝœ:u [[["##‡òÀ.++K/Ø:u*3fÌàüùólÛ¶'NȤBÔ+*µšä“'ñ4ˆvÞ$Èk,,,ðîЉ/ âì™_)))®tÛÂ8üË3¼'îÔF‚¼F1þæ<ûL;þá׃C'ÏSPdâUZ­¶î ôDcRPP@³fͪÜ.** wwwìíí™8q"§OŸÖ•íÛ·lmmqttdöìÙ8p@oÿ˜˜Z¶l‰ãÆ£°°èèh½uÉÉÉzûDDD P(P(DDD°}ûvƒçhèù´-[¶°hÑ"Z´h““ááẲ;vèŽåêêÊÂ… Ù±cGµÏßÔ}6oÞ¬;GæÌ™Ã®]»Œ‡ŠØÚÚrõêUòóóQ*•,]ºT&½¢~Ñj¹Vp Oé‹F¦Uk®ß( ÌÀí˜j­Å¥etöVJ‡52]:(¹SZFi™ÚÄ_ Ú:[$Ðг³3×®]«r»¦M›ê¾¶³³C¥úã—ö±cÇ5jíÛ·G©Tâííý@ÎÎÎzûW´îÞ:Z·n­÷unnîC·óêÕ«xxxTX–——§WæááA^^^µÏßÔ}rrrxî¹çP*•(•JºvíúÀy‡Š|ôÑG8p€ÁƒÓ·o_¾ûî;™ôBˆzG£ÑÈ•¼FÈÊÊ µZƒV«1çÈ•¼FÈÒÒBoŒ%Ыž—é'úõëG||3¯–Í077Ó O4±åÀÉtJ5f”¨ DmÆ ][#wJ W‘Ôô|l­­°±¬¹ç…ã¿ÚQ7Þœ÷<“åý…óå'F!„hîÕ<­FáWñnëF3WGTgŽai®ÅÜÒ s 3Ìö0úî9hKï þõ¶îméÒÅ“£!Shîë‹]Ë–õ²ÿ,--ôíùÕÿŽÿ—ùÏÁµãÿ¨C«E£…2 ”ª´”©¡LÅ¥e˜›™Õø\kèýÿ8zjµ–_/çóMb*Ï÷zŠ'ìk.Ы«xK’±!„â±²t)\ͦe¯¨.œÆÒLƒÙïWñÌÍÁÜ,,ïzwCИkÁ ´™ÿ¥Iû.x(9üúh|¿W:´Þ°nû¾=œÊ’?‚¬ò@N£•ÔPiÌPkàú[Õ:¦F£á•W^¡K—.Ì;W‚øG òóŸjý˜6ÖV<Ûµ­[¸àæØðûP=Q¯º S!„0úƒyI §ÃÃéÕ»êß20++ksš,ÛŒ¹³ ¥ï½·îy}³6 ¿À27›Âé@})•6:q(á¹âÚ¿…ÇZºt)aaaDFFòÎ;ïHç?B·‹Ë˜½v·KÔL{íÞY~Ï»vÍ@ h´wƒ»R5Ü**ÆÚ¬ŒÎ¿gؾ×7X°`_}õ™™™8::Ò¿&OžŒ¯¯¯Þ¶¡¡¡ôìÙ³ÆÏÔ=nW ÿ:´o­ÏÌ ¬­,p²³Ä­I㸯W=!„BÔ+â–­‚ädlì±µ·CqK«»W{ÌîX>ÝóÕÿ¡dêK¨oäB37,—y›hN&‚öîU#ííÛp»fNöä%%¡è×ïÁ€R£aݺuÄÆÆ²råJ¦M›†¹¹yƒï¿úxþY¹7™¼ìk:yµÂß·#6Vwoµë1öC½í¦-¿›ÎÂÂŒÁ=Û3{´/y7 8ÖßÿþwÚµkÇwß}GëÖ­¹víû÷ïgÑ¢E 8ð`¾²s­©þÜ_/ðt+뺚¦åõ B!„hô ŽÇÑÞÍíÛh5è–S^A}éæž°Yù ªÖtAžúò9Šf¾†F£Eûû¢¹Uˆ£½ù¬ð8ß~û-ÎÎÎLš4 vïÞ­Wneeņ ðööÆÞÞž=zpêÔ)“ÊïWÑ:µZMXX-[¶ÄÉɉüãܺuKo¿•+WÒ¶m[¬­­Ôxù5“.ÚFß??…O·œÏ.D |0;õsùä½WØþ q‘¯²sñkìYñ×N`þ›¾Þ)A­Ö`n®ŸVqÿþýDEEáé鉅…®®®°wï^£ûÔ”þ/++ãwÞ¡E‹¸ºº²|ùr½ñ´²²ÒÛ{¿...f„ ¸¸¸àââÂĉ)..®±yÖ˜çÎãD=!„B4zy Ø[š¡.¼u7`ÓhѨµ¨ss¸ñ¦Ÿ.سûä€.È+ï‡úêU4jÐh~_Š ±w°çÚñãgݺuLš4 ¸ûº›µk×>°Í8p๹¹Œ9’‰÷½²¡ªrcEGGsâÄ Ž9BVV¶¶¶¼ûî»úÓ‘#9r„ÒÒÒ3–›vŸbÞÇûðó¡es~+D£Ñòkú ÎeÞ 5óç³®sá·¤fš‘ϯ—sÈÉ¿EnA!çÒ® Õ‚Ù}ùóûöíKPPIIIܹsç¡ûÔØm#""øõ×_9zô(çÏŸ'33S–ÿ·üëûÍ›7ììlΞ=˯¿þJFFóçϯ±yÖXçŽzB!„ÌÌL¬,,Д”Ý ØÔ¿/*P]ÉáæŒÑhKK0³¶A[Z­wF£Ê¹‚Z¥ES¾¨µ¨‹K±4· ¤àúǸtéÇŽã•W^ 00cÇŽqù¾—­¯^½¥RI“&M˜>}:'Ož4©ÜXŸ~ú)+W®¤U«V8::òþûï³c‡~š÷%K–àêêÚ`ÆqÎúïÙñÓEþç/ÏS†—sï ÌÌÍ137ÌÐb†F{7ùŠZ£E¥Ñ¢VkÑ¢E«K sJÊTØÛè?Á´eË<<<˜0annnxyy1}út LêSc·Ý´i“®¼iÓ¦•¾Þ©"_~ù%Ë–-ÃÍÍæÍ›³bÅ ¾üòË›gqî<Žä=!„BÔ*UÙ#I:Ñ´O 7£Y´j-ff¿¿Ù Ìî8.ݨ ò̬mpˆÙÈõ1ÃP_¹r7ÀSß ô´V6Þ¸…S‡ö”––èãƒ> 77GGÇÖGF.Ò}ïàÐD·¯¥¥*•J¯®ªÊï?îýëÊ¿ÎÊÊ¢sçÎzÛ™™™ém«P¸TX_}ÿâÒ2Ђ(Sk)Uk°T›£-Us£H…Z,͵ØY™ake†­•¹îk­F æ`kcENþ-Ú¸7Õk»½½óçÏcþüyhµZΟ?ÏÊ•«xå•Wøúëx£ûÔØþÏÎÎF©lYiÿç+W®èí«T¶äÊ•+&Í#Cå qîˆÉ=!„BÔZíïR«É¥i÷îªAkes÷Eèj-j•mS7œ?ÿËvQ]üÿìÝ{|uþ=þ33™4mi“’6½Ò¹ðÆÊ.¬(¨‹‚ ˆëR‹–‹å¢?]À”¢ÈE”ËG\ñ‹®®,‹® xA­Š à… -ÐB›Þ(Þ’™ùýÑ664½Ò[Êy>ȃfÞ™ÉÌû5“äd&3¿"ÿîá8þ+t±WÁ¸y4“ŹWOQ4@öÆù¢b˜®»Þeú%%%ؾ};Ž=Š‹/8oGŽÁë¯¿Ž’’çÉ5.·êÃêk×ét°ÙlÎûùùùµŽ‚cÇ~u™Ÿ Î×ù\-uk®ú/{xF ˆÀŽ÷÷C†‘f\,Q™_Š"›¥å* ªÝ48*ƒº¢ªu"Œ¾Þøçÿ~ÀŸÆÔ9¿ÝºuÃ?þñ¾øâ‹&õi} Azzz­Ï_×0‹Å‚ŒŒ çýôôt5xüúÚ›{Ý!="""bÔk‘ a¼æj\,:_qØ&tPA/ðå7 w½ öß~…õ¾?£ôè°Žÿ3ìÇ…Üõ*t^ÿ–ó±ªPel óàÁ.Óß¹s'ˆÈÈ..ã¢"Ñ¿ÿ5عóífùß)))°ÙŠ‘••…Y³f×:~BÂdÌœ9'Nœ€ÝnÇ‘#Gð׿>Ø®ƒ^Cêÿבñ˜?qÞÙó²sóÑ#Â’(àOýBð‡ø`ÜÐ+ƒ{X0 ›ýºZÐ+:q]Q\êÀdz±üõOÑÉ[Ƙ›z¸LwäÈ[ñöÛo#''‡§OŸÆâÅ‹qíµ×6©Oë{ì„ ðøã#33çÎüyó~__F;v¬Öõàî»ïBRÒ\X­VX­V$%%aìØ»›-è5÷ºÓåee­+/‡¢tœËXðÐM"""j?1Ok™ÓÊBCᇜ³VXƒ¡dgBÓG^J¦Â:y,Ô¼œŠ‹¥ŸÍFöØÚðO(ùyPì'oŒfØ.£èb1oþƒË|nذ &»÷„„<÷Ü?0aÂxçäšË­¹ýûÒakÖ¼ˆGçžûBCC‘˜˜ˆwß}×íø‰‰‰xá…Õ5j4²³³Ñ­[7$%%Õû\žPÿ!½Â±îñ[ñÄÚPP믎ƒªIÏïtûxA:û{#<Ð÷þ±nêY*̼yó°qãFÌžý.\¸€`üñÂÖ­[šÔ§õ=vþüyX¸p®«Ü;l’½þþ,¤&|Ó_XXPoÈaýÖªªÂn·CQ˜ö1P IDAT8Ü÷‡„šd¬{ÿ‚ó5 "DQ€$I$ :’$A–eˆ"OUA5Et‰Ä¹¢BØíx{ø²0èQ{ú¨´Pà±Ûí°Z­ð~æÿCÑö7ðóo ÄÇAH:°—C+/‡ ˽¼ ©@áù‹È8W€ ýúA~ðAdžCÉñã E§NX®6¨¿Ãáp^LÜn·;ï÷‹ôż»z¡° ªªBEH:t•ÁN–eèt:Ȳ UQ ×ë›Ø©c“eŠ¢BÓT_="""jgŸó[.è•–•¡´´ e7Þ€ü  \xýuœÉ8 A¯‡¯NIB±R‚"»ªÝŽRooüöç?Cu?« JJŠQRR A¸®ê_ýÌKÏŒñƒª*ÎC7EQr¶yécEQd ÛóªÀÚ0èQGúœßr¿Ñ3  ƒN’ I"¼¼¼P0>2òó`?~ºS§á“‹þþ(†£K|Ì2` @` QQÑ †^¯çÑ6ª¿ Ðëõ{æTÕys8PŠRôª×”$ ¢$Aª wU‡l²~Ä GDDDÔjŸô[ö˲,#""(//‡ÍfCqq1JKKQZy--A Ë2¼¼¼àåe€Ÿ_'øøø@¯×W›M†„öPÿêÁ­z}ê~ ÖŽôˆˆˆˆZûs~«}—e&“ &“‰á ¬?ƒQ+Eª¦òƒ~£¨j½'=©ºòª²þ¯þšKú¹0è‘ç˜L&œ>u AAAì¤ ?!µ_Î@4ô2ý’‰ÑfvZrìT> z^:žá”Aˆˆˆ®8’(!>¾/¾:ð ‚À D‘¸ödªª!/׊oR¿ÆÕýûC¯÷ªõ±ôÀàø¼óé/eï†Þ1$Öß“)ІŸ2òñŸÇð‡A½`ôaÐcÐ#""¢+Ž(‰ CŸøxúþ ÎAQUvŒ'‡wI‚ÑdBŸø>4›að6ÔúØðÎ2Ê3†\ üïÛt¼à;°ðÒËruwt 5Ãâ׸qyè&ƒu‚ @§—‹ððp8J‡¸`ñà:½ ƒÁ»îlj"ºZ ðó GtD0Êí ø9ßÓ·i@/Kð÷ÖÁâÛøbN›6 «W¯†ÁPñ,˰Ûí.©>L–e,[¶ /¼ð.^¼ˆqãÆaíÚµðòªØ“¬( /^ŒÍ›7ãâÅ‹¸ýöÛ±~ýzøùùuØ0èQ»!édøèdvÄ 4w‚;Ix˜_ÇÑ´Ä~úôi,Y²Ï=÷\ƒÇùì³Ïðý÷ߦL™‚§žz Ë–-,_¾Djj*ŒF#{ì1,X°/½ôR‡íy‘+µ'«W¯ÆŽ;5ÎóÏ?‹Å‹Å‚çŸo¾ù¦³móæÍHIIADDüüü°téR¼û¹GˆˆˆˆˆÚ•ðð0äää ¼¼Ì9¬úß……:…";;Ûy?++ ½{÷vW·Óì(¸GˆˆˆˆˆÚ•ôôtAÓ4hšN›Í漟ŸŸÎû‘‘á¼òäIX,çý;ö+.^¼à¼]¸pÞÙ^ýÆ GDDDDDÔ’’’0vìÝÎðß)))°ÙŠ‘••…Y³f×zóæÍGnn.rss1wî<Œ7ÎÙž03gÎĉ'`·ÛqäÈüõ¯2èµ–P,\¸Ð¾Ö¬y»víBxx8†¡C‡Öz×]7ƒ F¯^½Ñ¹sg$'?élOLLÄ!×aԨѰX‚1yrFÝ¡ƒ£GDDDDDíÊK/½è rзo<>ýôS—Ç$$Lv f³gÏÆìÙ³]SÕ.æÌIÄœ9‰nÛ;"="""""jWšÀx‘u="""""bÐcÐ#"""Ï‘•yš@Džžôõð‚üFàGDDDcÖŒéì"ê9¡AˆˆˆkÖ®c'P‡´íµW0úÎ1nÛÊËÊðÖŽ7‘ððT”•–²³ôˆAˆˆˆˆ:P2`8 bÐ#"""¢–óôˆôˆˆˆˆ¨£Eª¦2èÑeST’$1èµ)A€ÉdÂéS§Äþ ËRŸ‡€€Î‘Aˆˆˆˆ¨­H¢„øø¾øêÀ4xƒ,EC¢ªòr­ø&õk\Ý¿?ôz/=""""¢¶"J"BCÃÐ'>‡¾?ˆóEEPT•CûÂ@’`4™Ð'¾Íf¼ zDDDDDmEèô2bcc‡C¦1èQ¾4Dèô2 ï±< zDDDDäñ$ ÌŽ ª ®ì""""""=""""""bÐ#""""""=""""""bÐ#""""""žu“ˆˆˆˆ:UQàP@ÓØÔ4‚I!I#"1è‘G³ÛíÈÊÌÄÑ#?¢°°B&Š"ŒþFôèÙ‘ÑÑeÏ¿Tƒy,UQkµâàÁï0lØ0DÅt…$IìjEQ~< ŸîßI'!22 ¢‡¯G zDDDD䱊‚‡GLLWv5‰$IˆëÞ’NÆ—ŸŽàà`xûøzô2ñd,DDDDä¹4 …ˆŒŒf_Ðe‹è‰sE…°Û¿, zDDDDäÑTUåášÔ,dY†¢¨Ð4Õã—…‡nQ‡ ñŒ›DNÜ£GDDDDDÄ GDDDDDDíÝ$"""¢+ÒŒ™   ¢("0()Ï¿ÈN!=""""¢öBÓ´FÿF/??Ë–.lj'ðʦü_s ‡ƒÑÆxè&]وŖûH¬Óq¿ 1èyœ•+WÂËË +W®¬ÑÖœ{¶Ùê'vu—{èeSÆWUëׯǪU«’’‚ÄÄÄÝCè)‡—¶ô|ò0ÛúqQíÙ³˜1cÌf3>øà—vY–—––bêÔ©0›Í0›Í˜6mJKKÝ>öÒaÕÿ¯þ8EQœœŒ°°0øûûcâĉ¸pá‚Ëø)))ˆ‰‰^¯w» u=oÕß7nD\\|||0pà@>|¸Î~Y¹r%ÂÃÃa41eÊ”••µh?4dš]=""""¢vìÑ™`â¤ñ5n&£ ŒþFL¸ÿ>—ÛÄIãñè¬Gêœöúõë1cÆ ÀôéÓ±nݺZ»xñbœ={?ÿü3~úé'œ>}K–,iÐ2ØívçÿUÀòåËqðàA¤¦¦"++ ƒ ,p755©©©(//orîß¿û÷ïGnn.þò—¿`Ú´iu>þ³Ï>Ã÷ß´´4X­V<õÔS-Ú ™fc—ÁÓ Ú²ßsé3K0{Nʪ%ûÖ°ë½áÉñ–ˆˆˆ¨‰¶½ö Fß9Æm[yYÞÚñ&UUÝ>æïdzÏü½ÆpMÓ Μ9UU!Bö—Ö¾ˆ7^ÓítÓÓÓqà 7àĉ0 (--Ell,8€èèh{’ªITTöîÝ‹¸¸8@ZZFŒŒŒŒ­R}˜»ö¸¸8ì޽ݻwäää`À€ÈÌÌtŽsòäI„……ÕÚ¿ yÞœœtîÜP\\ ³ÙŒ’’’Z§÷Ë/¿ k×®€ß~û #FŒ@zzz‹õCC¦ÙÐexùÅÜ~Ç0š.k½ÍÊ<÷ÿý.ž\ôt›l7üy<‡Ã^ç‰O4MCVV€Š=xUû:ªÿ]öªîWý_^^ævšk×®Enn.üüüj ÿûߟý=ŒVŽŸ““ƒðð0çýðð0äää¸LßÝsÕÕž••…Þ½{» ÁåqæZ—¡¡ÏÛ©“¯ó¾N'ÁápÔ9Ͱ°Pg{XX(²³³[´2ÍÆ.ƒ§cÐ#""""§iµŸ ÃßÏ žœïvxB‚€M›^Áù ç!‚óÁÁÁn§[ZZŠíÛ·ãèÑ£ˆŠŠtÏÈ8‰›o¾ &Ã`0¸F‹Å‚ŒŒ ÄÆÆ¨Ø#äl×ét°Ùlðññ¸Œéß‚}ûöÖØcW×85Až·¾éV_Γ'OÂb±´h?Ô7ͦ,ƒQÛG½Z?´¯\±Êíð©Ó†,˶b^Û´¹–Ysº;wîÄÀÙÅ¥=**ýû_ƒ;߯ĉ\Æ¿ûî»”4ëÖ½ HJJÂØ±w;Ûããû %%³fÍÆ¹s…˜7o¾ËøF£ÇŽC·nݜϗ03gÎÄŠ+Ð¥Küúë¯X±b%¶lÙÜà0Sßó6%$Í›7/¿¼0wî<Œ7®Eû¡¾i^‰A'c!""""Ïy•{ôs*~»åååÕèq7l؈‡šâ¶-!!7nt9TÓ4,Z´‹}ûöCß¾ýŠ… :Û׬y»víBxx8†¡C‡ºŒ?kÖ,ÜtÓPøùù;‡%&&bÈë0jÔhX,Á˜<9£GvYÆú–¥¾çu7º¦ ×]7ƒ F¯^½Ñ¹sg$'?Ù¢ýPß4³ OÆÒÂx2"""¢ËÓ“±<<ý‘FŸUrúŒiX0ÿIèt:,^²›6¾Ú¬ó­ª*Ìæ@°ˆdË«›x2""""¢öàr÷Æ‚àöÌ›—ãðáÃ.¿M#bÐ#""""jTÐkÚï­ÊÊÊ i$I‚¢($©Ùæé–[FbÉ’Å zÄ GDDDDÔĨW‘ö!<,)kVCUU˜L&U‰±™dŸ=ó{ %bÐ#""""jJÎk\ Z0oAÍÉ0”ƒQ{ÉyCƒu¬¤Ç GÄ GDDDD-ç1è1èQG!Š"TMeУ˦¨j³žy•Aˆˆˆˆ¨)&“ §OBPPûƒ.KA~:CD=""""¢¶"‰âãûâ«_`Ðà! ²@v 5ŠªjÈ˵â›Ô¯quÿþÐë½ôˆˆˆˆˆÚŠ(‰ CŸøxúþ ÎAQUv 5î I‚ÑdBŸø>4›að60èµA ÓˈExx8šÆ GMøÒ@¡ÓË0¼;Äò0è‘Ç“t2|t2;‚¨*¸² ˆˆˆˆˆˆôˆˆˆˆˆˆˆAˆˆˆˆˆˆôˆˆˆˆˆˆˆAˆˆˆˆˆˆxÖM""""êTECQMcgPÓ$I„$uŒˆÄ GDDDDÍn·#+3GüˆÂÂBv5š(Š0úÑ£gODFGC–=ÿR zDDDDä±TEA®ÕŠƒ¿Ã°aÃÓ’$±c¨QEAúñ4|º?$„ÈÈ(ˆ¾1è‘Çr( ~8t>11]Ù!Ô$’$!®{H:_~þ9‚ƒƒáíãëÑËÄ“±‘çÒ4 22š}A—-¢K$ÎÂnwxü²0è‘GSU•‡kR³eŠ¢BÓT_ºIDDDD‚Æ3n9qƒµgDQD`P Rž‘B zDDDDD­MÓ´fû^~~–-]Ž'Nà•MùÛ¿êáA§ƒÃá`GxºIDDDDäØr•u:îo!="""""³råJxyyaåÊ•5Úšs¯˜§„ÆæžO†åzú‡]@DDDDAKbٔ骪Šõë×cÕªUHIIAbbb‹î!lÍÃK/繚{>yXmí¸Gˆˆˆˆ¨™íÙ³˜1cÌf3>øà—vY–—––bêÔ©0›Í0›Í˜6mJKKÝ>öÒaÕÿ¯þ8EQœœŒ°°0øûûcâĉ¸pá‚Ëø)))ˆ‰‰^¯w» eeeHHH€ÑhDDDV­ZUë2Ô5¬©ó9cÆ lݺÕe:[¶lÁŒ3š¼Ü zDDDDDÜ£3ÁÄIãkÜLF#@ý˜pÿ}.·‰“ÆãÑYÔ9íõë×cÆŒ€éÓ§cݺuµ>vñâÅ8{ö,~þùgüôÓO8}ú4–,YÒ e°ÛíÎÿ«þ€åË—ãàÁƒHMMEVV ,Xà2njj*RSSQ^^îvÚK–,A^^ÒÒÒðÝwßáã?nr_7e>_xálݺÿïÿý?À[o½…mÛ¶aõêÕ—µÜW ºIDDDDW¤óÎcÙÒå5†kšA ×ë1iÒ¡FûKkk¿äBzz:¾ýö[¼õÖ[€{î¹óçÏGFF¢££k<~ÇŽØ»w/, `õêÕ1bž{î¹&/ÛæÍ›±{÷nDDD–.]Šॗ^r>fÅŠ ªuo¾ù¦Ë|½ð èÕ«W³Ö ®ùÔëõøç?ÿ‰o¼‡Â[o½…Ï?ÿ¼Ö½† ]n="""""ápØ›t‚MÓ•• b^Õo¾ªÿ­ªªËýªÿËËËÜNsíÚµÈÍÍ…ŸŸ_áÿû³ÎûUãçää <<Ìy?<< 999.Ów÷\uµgee¡wïÞ.ÃApy\` ¹Öe€ììl„……ºÌW}Ï[W¿4e>L?~<–-[†eË–" ÀtÙËÍ GDDDDä!4­ñ'æð÷óÇ‚'绞0‚ `Ó¦WpþÂy‚à¼@pp°Ûç+--ÅöíÛqôèQDEE:‡gdœÄÍ7ߌ… “a0\£ÅbAFFbccTì r¶ët:Øl6øøø \Æ¿ôo Á¾}{V#ØÖ6Î¥‚ƒƒ]æ+##Ãe¼†Ì—»`ݘùüñDZmÛ6¼ñÆxâ‰'0jÔ(çü4u¹¯üu„¨ç¼hzCo+W¬Âk›6׸•”–8Oòa+¶áµM›ñê+¯aÓÆWñʆMxeÃ&,ûûr·Óܹs'ˆÈÈ..ã¢"Ñ¿ÿ5عóm—=ƒš¦áî»ïBRÒ\X­VX­V$%%aìØ»íññ}’’›­YYY˜5k¶ËøF£ÇŽsy¾„„ɘ9s&Nœ8»ÝŽ#GŽà¯}ÐåÂòõõϸqc1oÞ|äææÂjµbîܹ.ãÕ7_—Þ;Ÿ6› S¦<„W_Ý„ÛoÕ«_À¤I ¸¸¸ÉË݃Q{‰yôêú /Ë2¼¼¼=î† ñÐCSܶ%$$`ãÆ5‚Ö¢E‹`±Xзo?ôíÛ!!¡X¸p¡³}Íš±k×.„‡‡cøð:t¨Ëø³fÍÂM7 …ŸŸ¿sXbb"† ¹£F†ÅŒÉ“0zôèF½ääd˜L&ôêÕƒÁ7Þè2^}óué­±óùØc‰˜:u*®¿þzhš†‘#Gâ¾ûîÅœ97y¹¯¤ 'hWÈ~Ì¥Ï,Áì9I(«vªÚÖ°ë½áÉñÕ—ˆˆˆ¨‰¶½ö Fß9Æm[yYÞÚñ&žþH­gl¬é3¦aÁü'¡Óé°xÉ"lÚøj³.ªª0›QXXÀâ¶C[^Ý„Ûï¸FSÀeM'+ó4Þÿ÷»xrÑÓm²üy¼–Ú#‚ód,ÍåðáðX,¼Ø71èÕôš÷„eeeÐ4 ’$AQH’ÔlӾ喑X²d1ƒ1èÕõ*Ò^3 GÊšÕPU&“ BU’l&ÙgÏüžN‰ôˆˆˆˆˆêÊyÍœÌ[Psò eÄ GDDDDÔÚ9Oc#bÐ#"""¢Ž•ôôˆôˆˆˆˆ¨£å<="=""""ê(DQ„ª© ztÙUmÖ3¬2è5… Àd2áô©S bÐe)ÈÏC@@g‚È GDDDDÔV$QB||_|uà <Aˆ¢ÀŽ¡FQU y¹V|“ú5®îßz½ƒQ[%¡¡aèCßÄù¢"(ªÊŽ¡Æ}a I0šLèßf3 Þ=""""¢¶"tz±±±‡Ã¡@Óô¨ _"tzƒw‡X=""""òx’N†NfGUWvƒ1èƒ1èϺIDDDD€ª(p(  iì jA€$‰¤Ž‘ôˆˆˆˆÈ£Ùívdefâè‘QXXÈ¡FEF#zôì‰ÈèhȲç_ªƒAˆˆˆˆ<–ª(ȵZqðàw6l¢bºB’$v 5Š¢(H?ž†O÷“ÑÃ×#=""""òXEÁ‡áÇ#&¦+;„šD’$ÄuïI'ãËÏ?Gpp0¼}|=z™x2""""ò\š†‚ÂDFF³/è²Et‰Ä¹¢BØí_=""""òhªªòpMj²,CQThšêñËÂC7‰ˆˆˆ¨CÐxÆM"'îÑ#"""""bÐ#"""""¢öŒ‡n5³3AAA>DQD`P Rž‘B zDDDDD¡iZ»ú^~~–-]Ž'Nà•MÞt:G“Û©ãà¡›DDDDD-õa[äÇmbÐ#""""¢jV®\ ///¬\¹²ÅŸK§ãÁ~ «IDDDDB{¾¼BSæMUU¬_¿«V­BJJ ´‡°¾çª«—¨è8¸Gˆˆˆˆ¨Ú³g0cÆ ˜Íf|ðÁ.íeeeHHH€ÑhDDDV­ZÕ¨öºÈ²Œ 6 [·nðõõE¿~ýðÅ_`Û¶mèÙ³'|||0pà@9rÄ9Nzz:ÆŒƒ€€têÔ £G†Õju¶—””`òäÉÎùY¹r%dYv¶+Š‚ääd„……Áßß'NÄ… ¸"4÷è5Ñ£3Aá¹ÂÃMF#@ý˜pÿ}.í‚ /­y¹Öi¯_¿3fÌLŸ>ë֭í·Þêl_²d òòò––MÓà2~}íõÙ»w/öíÛ³ÙŒ5kÖàöÛoÇ-·Ü‚?üÐ9lÚ´iøüóÏwÞy'RRRðÆo ¼¼O?ý4’’’°uëVçüá·ß~<üðÃ.Ï·|ùró÷Ã5Mƒ 8sæ TU… 5Ú_Zû"ÞxýM·ÓMOOÇ 7Ü€'NÀ`0 ´´±±±8pࢣ£ÑÑÑØ»w/ºví HKKC¯^½`·ÛÔ~)Y–m²,#;;f³P\\ £ÑXc˜ÙlFII‰Ûé#..gΜqÎÏÇŒ˜˜ÀñãÇÑ£GçsÆÅÅa÷îÝèÞ½; '' @fff«ÖôåSpûwÀh ¸¬édežÆûÿ~O.zºM¶îÑ#""""çpØÛ첚¦!++ @Åžºªý(Õÿ® {U÷«þ///s;͵k×"77~~~5†ÿýïϲ³³êœFxx˜Ë4ëkwœ«µùùurÞ×é$·Ã‡óþW_}E‹âðá`³Ùœ}P}~BB‚÷CCC\ž3++ ½{÷v™Ÿêãƒ]a4­mN$âïçOÎw;ùäcg@ºÔÈ‘#1räHhš///¬_¿ëׯs¶Ïš5Ë9^}í—**:çl«þ·»vwÃF…Q£F¹´?üðÃÎvƒÁ€7`ãÆ €cÇŽaëÖ­.¿iœ3'sæ$^âyè&ƒ]™1¯ïÁí™7¯D <‰y󿢬¬ÉÉÉ5jƒƒQmA¯ýíù)++ƒ¦i$ Š¢@’¤+¾N‘‘]0`À@”––âÖ[oÅ“O.`ÐcÐ#""""ª5êU¤½v"<,)kVCUU˜L&Uiô 7mêTL›:µfJ'=""""¯â¢ IDAT"÷9¯ý†óÔœEbÐ#""""jLÎÓ¤ˆôˆˆˆˆ¨c%=="=""""êh9AˆAˆˆˆˆ: Q¡j*ƒ]6EU;ÌÙQôˆˆˆˆÈs L&NŸ:…   ö]–‚ü<t† ˆ zDDDDDmE%ÄÇ÷ÅW¾À ÁCd(òÂäÔ8ªª!/׊oR¿ÆÕýûC¯÷bÐ#""""j+¢$"44 }âãqèûƒ8_TEUÙ1Ô¸/ $ F“ }âû Ðl†ÁÛÀ GõÛöÚ+ì"""¢ tz±±±‡Ã¡@Óô¨ _"tzƒw‡X½6úÎ1ì"""¢&édøèdvQUpe1èƒ1èƒñ¬›­FU8Ð4v†'H’IÒ±î¬;ëΚkJí¨¦DÄ ×êìv;²23qôÈ(,,d‡x(Qaô7¢GÏžˆŒŽ†,ˬ;ëκ³¦ÄšR;¨)1èµ:UQkµâàÁï0lØ0DÅt…$Iì¤( Ò§áÓýû!é$DFFA¬¥–¬;ëκ³¦ÄšRëÔ”ˆôÚ„CQðáCøãðሉéÊñ`’$!®{H:_~þ9‚ƒƒáíã˺³î¬;kJ¬)µaM‰È=žŒ¥¥i ;è "ºDâ\Q!ìvëκ³î¬)±¦ÔÖ5%"½¶¢ª* é@dY†¢¨Ð4•ugÝYwÖ”XSj5%¢šxèf+Òxf/ÖX÷Ø÷É'x|Þ—aËŸ}·ŒÎŽí Û²Ív?=ŒÌÌÓPÓÕªþA§“áïç£Ñ„ @ ¢"£!Šün¶=Ö”µ$"=j6|y ·\×q¹jÌÊ:Ï.À¯ÿz‚åá^Xó"ÞØñFŠÛGßï~‹ö|ˆù aç¿þ…yÏA\Wþ®ÈÓýpäBCÂpÝà!BvEQ`+¾›í"òòóðþþ…¾ñ× :*Æí㉵$"bÐóp/lÿkw@˜AXð·›Ù!WLP1*@…X-ùíø÷ì$õUê7ؽgÞÿÏnç°ÿ¼÷6TEÑß„nqÝÑ»W¼¼n-¬gNcÜ„ûcïƒ1wÜ^={°=ÐéÌS¸~ÈM(,ʇÃဦiPUª¦BSU‚N†—Á !–Pt톴´_±{ÏûþÇ[àååÅNd-‰ˆô:ŠÆ{aÄЫñî'?Ãß×€÷ aÇ\!4øédÀf+EqI`Ø5]Ø9ê£}#iÁ“xfq2n¿m$ŒF?¿¨ÀËëÖâ«/¿FŸøÞ7öÜwß}øè£0ñþ ¸xñ"¬V+&>ø7¬{q † º–éa¥"ØívhšVyS+B‚¦AS”ÛË¡k8wî ŠèÍøuòþO>Ÿ‡äoÌXK""½vñ!½òÅ¿©>þæ8–½ö ÷ï‰2UÄ€~ݰåßßÂÏGI£®ñŒ•M§ƒÃáhõq=¹îÕ9Íyø¦¦Áù·Ý¡:Ÿ‹ë€gÕ=iÁ“xñùç` FAa.^´áäÉt|ùåøîÛƒ8{ö,Ž?ŽS§Náî»ïFÏž=Ñ9À EQЧw„††aúÌY8øÕ¾Èzж\}{UUÛ¶m­ó±w޹g²Îbcãpî|öº7ÿáO<ô¯ÔÔ“kYÛëêÇŒ‰'Âjµzä{/1èyŒC¿žÅì•»pMŸ8«²òÎÃÏK‡«ãã°zûðóÑã/Ãz³£:8EUœWÿ8PôÈ3ÅÄtEzú têÔ ¾¾¾ˆì¸õ¶‘ØýŸÿ"<" &“ ¿üò n¸þFž+€,ˈìEQ<ïMÇC¿´iþQ±ÝªšŠûrOPe›¦iÐT­Úß¿oçW÷½Ÿ|ú1òòrdáFÄZ6û¶™œœŒÿû¿ÿßþô'n·DŒ§}jçNdàÁ§v¢G·(ÀË€B›dØ{¾}zÇâé {ñÑ׿Õ9ˆˆ”––ºm;wúj^¹ßxèÚÿwå÷ožµjIÏ®4,èqhŸ¼½½1 ÿ@x{{Ãáp $$1ѱvóñÈŒé1b®ºê* 0^/ÄÆtEט8¤ŸLGAaA­Ó-**œ9sƒÁ€   Üu×]Ø·o_Û®Çü°X± «¿ïžÿ}ÏRå®zM¨8]£€Êßå ÐÉzlÿçëØøÊzäää ,$ g“ÂðÃ:Ø^ãõìÒ_s=·–}ûö­±çQÓ4ÄÇÇ7k?Vß6üñGüáàvKäéŸoÙ­øfÐÈCD¬1!y"#Bàãï‡ü 啪øïl¾ 0û¢G<þüðò‚;q}¿(·Óºá†°eËL:µFÛ† 0hÐ ˜L¦?üïr¦ßžç­5¦«¨Õ§ó{Òkè¡›\ÚßöÞ«gOüwÏÿ0hà5ˆéêü¿Ÿ?]ºDBQ”Û Šòòóð󯿢ØfCvv6|}¼áïïçö¹ÆØØXüïÿC—.]PPP€O>ùÏ>û,† Æä6^ÿªNïi¶oßÞ¨qÿõî;¸îÀ£¸j>à•6?lü+L×MpyŒÝno÷ÛN{˜§æ˜‡–®¥··7víÚ…Ñ£G;‡½÷Þ{ðññi–ep7~II $Iâåˆ<÷èµS‹Ë0!yLFuFÁÅòß_”«=îl¾ ¥ [\$¦/{ßÿzÆíôæÍ›‡^xªêº÷§¼¼ëÖ­ÃO<EQœœŒ°°0øûûcâĉ¸pá‚ó±²,#%%111Ðëõ€={ö _¿~ðññA\\^{íµ†…–zžË7"..>>>8p >ìlKOOǘ1c€N:aôèѰZ­.ó~©ªaÕÿw÷¸ÖVnWPVîp¹UôYõÚý¾8*ß»tœ²r‡K8ìëÀÊ•+£Ñˆ)S¦ ¬¬¬Áë@Sç³%¿wö}ò1d½§NŸÄÞ}ÿÃG~@Úoiøíxüß|û5Žüt_~ý%¾8ð9Nf¤£° 9ÙÙxýÍ=òÏn§ýÉ'Ÿ`Ù²eˆŽŽ†$I ¸qã°wïÞmU×Õç i¿t}¹tú6l@·nÝàëë‹~ýúá‹/¾À¶mÛгgOç¶~äÈ‘¯7îž³]‡F ˜0q"&Lœ€ *þ?a<ÆûÆÇ}÷ÝWãV=”¥~Ú¨ç---ÅÔ©Sa6›a6›1mÚ4—=ýµÕ¬±uªk{lo¯¹í½–O<ñV¬Xá2lÅŠHJJjTmËÊʣшˆˆ¬ZµªA֩£lƒD zÔ&ì O¿:G„àœ­¼Îk¨Í·AtˆŠ ǃKÞÆÏéÖ¹æšk‹wÞyÇeø›o¾‰k¯½ݺuÃòåËqðàA¤¦¦"++ ƒ ¸^´955©©©(/¯žûÛß°dÉbß¾}øê«¯´Œ y®Kíß¿û÷ïGnn.þò—¿`Ú´iζ;ï¼³fÍ™3g••…îÝ»×x¬µ¿+¿ù¶Ûí5¾o ›Þý}Æ­Fß{RÐïÞŠ›A¯ƒ£ZЪíÑ+³«0èuÎÇö»7}Æ­Æ­nFþ9[‡Z>ûì3|ÿý÷HKKƒÕjÅSO=Õàu ©óÙ’n»åoHû¥ëË¥öîÝ‹}ûö!77ãÇÇí·ßŽÿþ÷¿øðÑ——‡±cǺlëMYGÛe8¨üF«úÒFA«Üº‚Q ŠRÅMªø¿àÉ®.Áà×Ó@ð˜§ü¼‹/ÆÙ³gñóÏ?ã§Ÿ~ÂéÓ§±dÉ’zû¯±uªk{lo¯¹í½–wÝu¬V+¾üòKç{a~~>ƌӨÚ.Y²yyyHKKÃwß}‡?þ¸A֨£lƒDWA»BöË/}f fÏIBY-¿Qj)åeexkÇ›xtvb=)î¿Yþÿ–‹ØØ.u§\.wÅe{vŠ‹Ka+®øÖÜÔÉ þ>zçåÕ Ï‡5'﬘ˆ˜ð€AiþüùÎ7‹ªÿ7nĵ×^‹¸¸8ì޽ݻW\Œ='' @ff¦ó[º“'O",,Ì9~ll,žxâ ÜqLjˆˆ¨sÙdYv¾aÔ÷\îÆÍÉÉAçÎ+û f³¹Ö°ÅÅň‹‹Ã™3gj<·»ùq×^——_LÁíwÜ£) Yê~©¹){pà‡,Dw„,ë j@i¹%åJuÀ談Ñ× ‚Xÿ Ρ° ÿZ9ác‡Z~ùåt­¼Xøo¿ý†#F ==½Aë@cæ³5ë>àºðÀx|ðÁ¸xÑcç@èd×oÁör(ÅGyŠŠŠÞ%é§²ðݗxîÜ9¬X±»ví‰'`±XpçwbÑ¢EhðvQWŸ7¤ýÒõåÒégggÃl6;kf4k «¾­7emËm¹6[ÿïU$üm*NŸ9‰7x¸ßŸHv ,w$רamÞ£¢¢°wï^ÄÅÅÒÒÒ0bÄdddÔY³ÆÖ©)¯ÉÍ¥µkÚÒµ´ÛíØ´ivïÞwÞy£FÂ]wÝ…„„—~¬¯¶ÑÑÑØ»w¯s{MKKC¯^½Ü¾^ZŸÆ¼v7vlŽšµWY™§ñþ¿ßÅ“‹žn“ççoôZ‰ÃaoЙ_Üñ5>ùö84 (øîheøÓ0hðÕÕó¹ó/_ƒŒÃ‡®v!í OïÄ–§Æ $ÐÏ9ìºë†@E|ôÑÿ0tèP|ôÑG@¿~}Q^^†¬¬,ôîízöNAP^þû¡Xf—ûÛ·¿ŽåËŸÃÓO? £Ñˆüã9ÜvÛmµßÊqò\—êÔÉ×Ù®ÓIp8Îû_}õ5-ZˆÃ‡€Ífs;=wÓ®¯½µê~©§§ÞŒiKÿ™ˆˆŠ@I¹—ŸèU[Šlå(²•Ãìo@Yi ò¬yرô™ 5–ÉÓ×°°Pg{XX(²³³¼4v>[³î:YF'¿Nxí@dgç "<™™™°ÙlÈÈ8‰È¨.èÝëìÞý_\uÕUHOOÇ€k®Fú©¬ZûËÇÇK–,Æ’%‹¡iÒÒÒ’²÷Þ{/víz¿ÁÛE]}ÞöK×—K§ïç×Ée»v7¬ú¶Þ”u´-·åÚTý®KELšô@Å-Îÿ/ÝÒÏ<^#üÖ}®ùÊÊJkœšßf»è¶Ïsrr漆œœœzû¯±ujêkr{|_nëZ–——áÞ{ïÁÓO?×_?üðÞ|óŸÎþkhm³³³]¶×ðð°:ßkÛnÛj$"½v«âºgõï<}ôžAxôžA.ÃúÜó’Ëo­4—ßg©PT GÞšQËóº>çã?ŽçŸ7ÝtV¯NÁœ9‰ÎÇ„„„`ß¾½5¾…«>K§×¿¼õÖhš†?ü<2ÇßZG?4ü¹ê[–êÃ&Mš„eË–bĈðóóÃÅ‹æl×ét°ÙlίԻl­Y÷K‰°&é6LLÞ‰¬Sg‚òj×Ñ»”ÑWÒ’X³­xý™»j¬õy=yÈÈÈ@ll,àäÉ“°X, ^;Ÿ­YwY–!I:uê„à` ݺwÃEÛE˜L8uê4ŒF#ôz=EªV\œY+> VݯO·nÝð<‡ˆˆ.Ú.êêó†´×µÝ6¤½)ëM{Ú–k^åkº(ˆ•¡@@Å¿jÿWÊL © ®úÿ¾Å—|Qëµàj›W‹ÅâR³ôôt]VMšòšÜRuj‹š¶F-õz=¦OŸŽ‡z‹/†^¯w>¶êÿújìÒ^µ§¯¶š¸;Óg[nƒDÔxü^ë½¥8_Ä{vÆÅ†Ün½u$²²²ðÆÿD^^†îlKH˜Œ™3gâĉ°Ûí8räþú×]æãÒé=øàßðóÏ?£¼¼š¦ÁápÔ¹ }®ºÆu7¬¤¤^^^ÐëõÈÈÈÀ£Îti”ØlÅÈÊʬY³]ÚF#Ž;Ö¨š´tݽd ¯.þ  ”âlV6DÁÝøt(/+…5;¯,¼Ý#Ív˜7o>rss‘››‹¹sçaܸq ^3Ÿ­U÷ê'.Qaaa$ &c€ó$`0 I:ȲŒÀ 3|||pî\€Š,TÀêÓ9òV¼ýöÛÈÉÉÃáÀéÓ§±xñb\{íµ Þ.êëó†´×µÔ×Þ”õ¦1¯‡­µ-×õÜ¢(bëÖ-زu3¶lÙŒÍ[^ÃæÍ¯áµÍ¯âµÍ¯º !O|Ÿ˜P5Íyèa}}Xu»ûî»”4V«V«III;öî˪IS^“ûšÛÞkÚµœ3'……HL|Ìm{}µ7n¬s{µZ­˜;wn­Ûc]óÑÜÛ`óÖ”ˆôÚð›Ã¦¾À¹žˆã÷½ªk¨5fZ‰‰á‘GÁìÙ³\Ú1dÈu5j4,–`Lžœ€Ñ£G×ùâ}Ûm·a„‰Á¢E‹±iÓ+ ú_ßs5öCÅÚµ/aþüÁ­·Þ†!C»´¯Yó"víÚ…ððp >C‡uiŸ5knºi(üüü›õMçrê®iü}õزä/(µ]€5Û T^˜·*éyÉÊËË›mEÊã·¢o\p‡^®»n Œ^½z£sçÎHN~²Áë@cæ³¥ë®( Š‹‹]Æ« ~z½¾¾¾ð÷÷‡)ÀX¹ÇOtÙs'I‡Ï={ÅÅÅPÅå9æÍ›‡;߯€a6bøðá°Ùбuë–oõõyCÚ›;è5emÛrÍ[Ŷ,"&OÁ”„‡ðД‡ñД©xø¡©˜úÐ4L}¸âä&ÕƒAÌKðŽ¾ÆeORCú°ê¶hÑ"X,ôíÛ}ûöCHH(.\ØìA¯¾í±±¯¹í»¦mSËKÛë«mrr2L&zõêÁƒ‡àÆolRÐkîmA¨åðd,-¬êGßO¤ÉgŸê7~z_ÝÇù­b[)l% z ™é8üÏé\›[Ñ–W75èÇþ—S÷êÒNåcÒ’wásçÎ(³ÛQZZ(œÏ³bÙ£#0l`4 ã!u·Ûí())Ann.|x:–àüÝd^^n¼á&æÃjµâƒ>@||<,A¼ýö;>b8R¿NE·nݱï³Xýe†Ùl†··w³.¯ÑhBQѹ&·s[®Ýëÿ܆G¦ÎD^¾‚ ¸Þ*ÏÔx|Fú¿̸wäTDÌÿ†È«+¾ò7aÍK/àû„(ò;Û¶¬)kÙö5%j¯x2–+DS¾•Ҫʡ(*„Ê7€êS©Ú£§(J‡}ƒ0ÕóÂ~î\a‡ª»»u *ÄÏ?ö'$¾ð4M€·»ós±ào7àÆ~á\<¨î‡‚’’äç8ƒPqˆf}Ο/‚¯¯/”ʽgÏž…:uêäßÔ€C í³úÖß+åÛöæÞ³PµGlzõ·™ÿ:pð~ êÉU0D]óû<U{M*~ŸÉ=m[Ó–ª¥©¡¦=¿QÛaÐkµ7”†} ª:¬«ê77JåŰUÜ|†W”ŠiC’$ˆ¢I’œ‡uu……ûA³)?öw·¨ªŠ«"üðÄ„X¹ý(þQv¡Ý¡}C`³Ùœuç:Ðþë^^^‡Ã’’ŠC7ýýü«mÓŠÛqªÎ\;àìÙI.//wºÙþjLŸ1è5}[nh¿=4åaçžTÛôÈôG'ôP5Ð*OÆU9®ªò°¶öPÓ–ªeC¶ã+m;$"½öú–ÔóB\õ¡¾ê÷;‡Ãù¡¯Ì^ÉQ‘ôìv;ÔK> –•–B’$èt:h:4U…NÇòzBݲTÝ_€ #âðÚ~Á¤?wÇ-ÃPZRQ’ « w\ÚÝ5U…$IðÒëÑ·w/¼²yF¿»!!¡(-+EQQ‘Ë8§NŸÂСCáããܼB;žŽÈˆtòõ…ÁË ’(6j]kPÀ.ȯsšõµ_ÉÛr}¡âÃyÕ^œªklWü[4Zåo2×¹€Á9.ø¿ÍkÊZƒßOô͸ªª.7EUáõÔÉZÇó÷ÑWÚ)ÎñDQä7|R÷†¬UÐápà¶Áè䃾±fç5 A€Rù-2×ö_÷ª Zw6›1vÌxo×nìþp‚ƒ-èyÕU¸pþ|ÅeDú„¦i½¼‘WPˆ“?Åù¢óèÖµ+ìÐÐ0øûûÃËË‹õnGÛr]ÊÊÊa6á·ãiˆëÚ­A—Ǹôuâ·ãi°X‚QZZ//=ëÓF5e-‰ˆA ¡þClA€$IÐ4ÍyØ x{éh¨š­ÚéÓ?ôEHÕÕÓétÐétÎéPû¯{CÖE JdY†¦iÜÛ›ë€×]–eˆ¢ˆ@³’(áo“îÇÁC‡ñÝáCøæ»ïqþ—C5Šßïù °X,¸ù†ëqÝÁðñö†ŸŸüüüXïv¶-×FUUäååBÐìÿôìþïûP/½Nªæ\æB«8'ßN0ú‘——‹žÄ£ jÊZƒU½Â7è EȲ Y–{qªï婚FÕ‡|Q]nUß&òŸgÕëÀ•U÷ª@ïãã½^£Ñ!!!¸mä-¤ßëXõ¥NÕ}UU+çU!€——tºŠëëñ¤ío[®­öf³ݺu‡£ò$11]Ù!—I’$ÄuïI'ãËÏ?Gpp0¼}|=rYx2"""""O¥i((,@dd4û¢Et‰Ä¹¢BØí]="""""¦ª*×lf²,CQThšê±ËÀC7ÿÿöîî·©ó€ãøï;‰ãcçͱ±'DPo ýÓ&5ÐJ£PÄ6(t-¥U˜ö, á%0Mš–R¡q±²›v»™6 $$¸cÚ2•‰®[&1ÛIHÈ ØIHü¶ À+…@b^m¾é\øÉ9çqŽ“‹¯ŽÏ9@ÈrÇM|gô€Ð<Ëøê&ðÒ{G:Eô…E‹õæoÉívßs݉‰ ýâØQ}òÏOõÎÛïÈëõq gô€—Ífg¼t¾÷sÕzjôòÚWT^^®ö}mŠÇãw­766¦¶öV•••jíÚ—å÷ûÕy¤sVsòBè(ÑhD suùò%~ÍmlTû¾6%‰Ü:ãããjßߦººü€Âáÿ*ªS,åzž5Ë–-Www·þ€b±¨êBuš;w®Ú÷ߌ½Û‘ª ©¾>¤ÞÞ˜üsüêîþ–/qÚýÚíö»<=} Ìôë†Û^Cû´Ën³©¾>¤þ+W …$eµk÷÷e˜¦šššÔP_¯¾þ~ùçø‰D500 ÿ¨í¾ó$“ɼÞ=ÎèÏ˲ÔÖºW½}}ê‰Däóù40xE zá…EjjjRcC£äóùÔ‰¨·¯Om­{eYÖ¬çK§ÓÚ³g‚Á ***´iÓ&ÅãñÜÏKJJÔÙÙ©yóæ©´´47vìØ1555ɲ,-_¾\çÎÓ‰'´hÑ"9N­ZµJ/^|¨y=EÃétª­u¯úúú¾V­§Vƒƒòü ƒ¼:¨ZO­Â—ÃêëëW[ë^9μæ:|ø°ÎŸ?¯®®.Åb19íÚµëŽuºººÔÕÕ¥©©©ÜØ™3gtöìY jãÆZ³fN:¥Ó§VÔä‰IDATOëêÕ«Z·n¶oßþÐó+#ûœœOíØß¦ww~O“7n🠀¢059©ß~ô¡Þ~·E™LfÖÛ뇻 úPH õ¹²¸\.Å¢½ºëpÇOfy%%%w%“I-X°@'OžÔÂ… %IW®\ÑÊ•+FsÛ…ÃaƒÁ;öÕßß/Ç“{Ÿ•••wy<MLLHR^óÜÏÑ#Z³v­*«ªóúlbшþø‡ßkwkûSùÛà= À¥RI¥R©Yo79yC™tZ¦ÍT:Q:–$¥Ó%S)eÒiMNÞÝn›ÑþÆÆw†èÔ¤b±˜/^|ǸašššÌ½®­õÜñZ’ÜnWnìöüŸK¥R¹×ùÎS¬øê&Pà²YÍú9q‰DB;¨±±QÁ`PñøuY–%˲_WCC½u°ã€‰ÄŒž;w¯q¿ß¯îî+‘ˆç–xüú}·Ëg,ŸyxŽ€g9õfy‡Êë­•ß?GÃÃCr¹ÜŠFcŠDbrY. ÉïŸ#¯·V‡>0ö¦ ©mÛ¶jÇŽºt钒ɤ.^¼¨Í›·<òÐËgBÀ³›y³8£766¦C‡;T]S%ŸÏ§á‘a¹\nõôô(ÒQ4Õåp,Ë¥á‘aù|>U×TéÐáÍ:ôZZZ´zõWôÒKÍòùæhëÖmjnn~ä¡—Ï<Åz\£~êÍ8N>øÍq9-K^ïÍÈ«¬¬T8ÖèȨv¶|W¦iêý£ï+N)ðߌ=¯OéTFÇ?øµÞüÎ[²Ùî¾fïÚµÑ{¾Ã0´sg‹vîlù\œf§Ý.Ÿ±|æ)f„Pè™7óP‰DBÿúôS}qåŠ[×义D52<¢×·lU6{óF,ßþæfýêø/•J¥ OÄåõyõñù544$˲î¸gÕ4w¦áÃ!ôäzz`èMNNjbbB~P±hL@@ÑhT£#£Ú°þ5ÙívIY†!›ÍÔ«ßX¯~÷¡’SSª««SooLs¼>Ë4MÙl¶ÜƒÇGF†§ P<\£~êÝ®½i»Í&›iª¹¹Y’¡ .È4Lmxuƒjª«e9ªp»åv¹ä,wÊSS­6ÊápêÂ…(5•Ô×¾úõÜ~l¦ùÀ9 z)pœÑŠ¢óî'¦iʲ,ýmùÖæÜs÷ìv»‡œNgî¡çv»]¥*-+Ókë7(“ÉÈ4M•”–ÊQV¦òòr™¦É;BÀãë¼™]£g·ÛUQQ!·Û­L&“ @Ã0nîçÖ>l6›\.—,ËR&“Q6{ó+÷Z„€ÇRz³$€išŸÙ<;£õ™¦ÁÉS&“ÕÕÁýµë/zqÅ •––zž,Óf*jÉÒ¥úûßÎëúµkJߺ›&òg›M•UUZ²t‰j=9Ê„€'Ë0 ÙKK4þ|ÕÕÕ)•J+›%ô*ž SöÒ9åý{z@³ÙKä´—p ðÿ`å¡ ô„€Ðz@è=¡ ô„zBðdÙŸ·_8ð© ôŠEçÏ~Ê' èÙl6Ëa€âÁ5zPdþUÏѱN”UIEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_design_reports.png0000644000175000017500000004210312235000130025575 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÀÄ®´úesRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ 7‘#À IDATxÚíÝw|eâðgfKzÝdÓPB¯RNª6TN±!"( ¨ JÑCEŠTÏóðôÄCïXE)ÒDzO#!½'[fç÷Gv—Ýd7Ù„D6Éóý|æ“Ýéó¾3ûì;3;P7ýyä[\ >""jA(ÔÃ4 E""ºaW£0nr\Á…×DDDu~r5¡çR µG°é*Ž'0‰ˆ¨ÂOv€rm‚ÐåÓ™CÆÍ5±ˆˆèϲë“E¾NZ{&áç,† ²ºðþìßLž¡mðô}ýXDDô§ñ‰íYT–y;6Ì rx&'+¡à,•Õ…ßägÇÒrJXDDT­ìü¥Ú4T*Dh¼ãîé  /äîØ03¢BØÙv’9·L6­CT‚ÊêÂ/5«˜µIDD.‡_NA1Nÿ¶»VÓ·ëy'L&šodä•úºÒvl˜ÙÂ&ðl;£ÍkÁü·Útz Ô3´Mù”²Ì%"¢jå”"+¯gìÁ#îG›˜ M.9»¿û m»û{UÌ$_sm:…ù¯mø9 ÁÊ­½Šï‡Œ›kûä$”è ¬Q""rÉõœ"üöÓ·0d4ƒ}k5ÓpöÈôpÂlæ‘–UˆC»6c×'‹úØŸ¾Bg0w¶­CË)ÓJaXÕM0pÖøûù« zxÕl«D5ú  QTp/¡Fe×Þ€!éÍ &M07©Âƒ}!™jwöP쇳æy9É @sÈél:±B£Îöf™j¯ •ÐñÒ rV¢®YÁ”d¢ÇÀû¡®ip¹±ÿýt[ß~0zÖf Ћ…BM–(܈“M~³ûÀÝwÞn7¾³þ–y9É @skO  @©MÚŸmg€Ö×No‚““|`ho :‚(BE‚Q ŠåËß‹Á:ÎÌùoÃ$ËNçIÔpÿ¦¦Ý* ßíù«^˜òÎ6ŒÔ·Êþ¶órr<Ù„ŸÊ~–[î•+¼–áâM0 ó¬qgž?¨!I¹–ŽäkסÓéáí剨¨œ¹p0°ßm¨|Ö¤ü hbJ:®¥g@§ÓÁC­Fd¸Íb"¬‡×ûÚÄÇ!)åÊÌóoƒüüB¤gdCo0ÀÇÇ ­[4G€¿/+ƒl ÐbÕË£0åmÖ×v_+Œ_Þ„³`µ9Ãl[~﵄ à¨¨¬z‚+-@È€ ŠÖp…¡áFØŒcIs~C¦†âô¹‹èÕ&3¿®eá˽gð–Í)ÏÊ-@þ8}ƒºDbö#¡ ðFNA)¾?x »GÇv­°÷—ÃÖÓ¦|ù^z`4^HÍ,ĦïNà/µØ­'|q¡ñCYYY•Ç#‘{´oäLq™Þ¥iœ'‚³}Þ§BøY‚¯Ì¦e¨´ @Û»C«lºt ´¼Õ'”‡ µè( mZŠ`’y“5 z½¡Aå§3òŠç @@FnÕOFÒôÖïæéï퉼¢2€&Àz½ýÁž_¬ƒJ­†d󨍼¢2¨Tjë·_Ëíà/VèÞW<å)8jý9 ÀJ ^iéJD¨j\82OãPrõjf=v;>Ûq—ÒòìïgG—ßáùŸN#L “,£K畎—ðˆ0„G„U8ž,GNãj?"wo¦ç9<ꊌœB뼪Øï+†\Åà« ¿jaEMY@`þwèž»¯;š‡@gpùZ.–nÚ‡‹×ËÎc„ÈF™A»À®o¾DtÛ> ¨ÙŒòò‹rv?†ÜýÊ ’³ã«â5=ÑÉð*ÃÏ…d…R@$ç`ÎÆŸPZ¦ƒBáéé‰ "#Ây|UPTRoO5îq?v÷Rj1;GÜÞˆç¿#ttW§Ó;=«Z[€DUð÷÷ƒ¿¿ "—êàƒ‘÷>\«éu#ŠKuÕ4ü\9 ýi²óŠê|ž¶w˜: ¿jOyº€mý²ðßÿÌZ$""·ÑÖ/ »êp~N[€[ß~9ÙY,q""ºåRS’±qÃu:O‘ÅJDDMˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b5Ô„„Z»P-â[µÆSO?´´´]˜–m"""`•²³2‘šš‚žŸŒmÛ¶ã…)SY#DDÔø<ÔjLœ8°ÿþJÃ×­[MH(BµaHh×Ó§Ï@aaa¥V×æÍ›Ñ÷ö~ˆˆŒBç.]±~ý‡­³êÆ3™Lxÿý÷Ñ¥k7„…G s—®X¾ü}˜L¦JóúðÃÑ©s„„jíZ~[‚¿üú+† è˜XDEÇàÁ1aÏž¸÷5åY–ÞÞÞ•†•––â×_ö!%9 sçÌÁ¦O>Áì×^«4Þ·ßíÀömÛpêäèÒ¥ ^›3ÿûßk<ÞŠ+ñæ¢Å¸wôh$^½‚Q£îÁ¢Å‹±råÊJó:sæ,öÿú ²23•iײµ}ÿì³qøðalܰ—.^ÀŒÓ±qãFî}DDM9õz=6l(o…Ýwu†OŸþ"Ú´i<òÈÀ;wVï… ¡Ñ#88 .¬]»®Æã}üÏ&OžOOO}ðïƽˆ¨© &$‘QxsÑbÄÆÆXÉbÿ9ò4k‡P-´aလœÜJóŠŽŽºñ:ªüuJjjÇKOO„„„BCËOe:ºAG£ vi;_›=‚(bЃ‹;ÁÞ½{¹÷5ÕÌÎÊÄÅ çñø¸qHJJÆ–/¿´>~ü3Øà6lX´k©HMIp㔩­””!f 4KÀÕd<­V ÈÊʲûQëíœ8ñY\ºx»v~9s^ÃñãÇñìÄç¸÷5Õ€   ,]º!!!xã7‘™yãÚ™$Ièt:¼¹h‘Óù¼>>²³s““ƒùó˜ƒgbÇ{øá‡kÖ¬…N§Ã¬<>n\µÛâï︚˜h×ÿñ'žÄéÓ§Ñ¡Côï×àééɽˆ¨) % &=7¹¹¹xeæLkÿ ëסuëÖ=ú^ÜÞ¯?Z¶lét#†Ã]wßví;àØ±cxó70aÂ35oÖÌ™˜6u*¶|ù%bb›áÿ¶nÅìW_Å‹/N«v;^yùe {÷vwŽ÷,|ÍãZàžQ£qÛm=±qÃî}DD·`î,¯EŠ)“Ÿ+[ùÁZädg¹ýX‚Æö®Ë›ˆˆÜOjJ26nØ€UkÖ}@ @1€¹æ.Ûæuyx©y|# € €ì6-@""¢?ˆˆš$eCßWOiòÔ'¹}~½õ¿¬"¢F`äèû€5õøÓ¸ç5`›>rïG>ºõ)P½^Ç=ˆˆˆêo‚!"¢&É­[€ŽyFDDĤ&éÈoÑ»o z‘£ À›K@îIÄýƒˆØ$âþADM#Y?TÇû‡/Š‹‹XxDÔðZ€¾¾~>šÇµ@¨6 O<ù$ YìØUsŒ2ë!ýýýñþûËñÌ„g¡×ë~à½ñæ›HKKÃñcGqìè$'§àÍE‹ìÆýá‡ðÝwß"9)cÆ<ˆûx߿۷oCJrî½÷^L™:;t# @K¿‚ü<@A~ òóì†þí0~þé'äçåB–e,{ç;v?ÿü.]¼OOOÌ›÷:ë‚;à­Ñ¿_? ÐK–,u8|Ë–-xû­¥ …V«Å²¿½-[¶Ø³rå DGEÁËË ÏOžŒ¢¢",_þž]¿cÇŽñÚèÖëÇk€DDÔ$1‰ˆˆHDDÄ$""bº‡¨¨(Ö±HDDÄl Øª­{/^Ä„ о}{4oÞwÝu¾ùæ·­³›_TT”]—€ñãÇ#))ÉmËÇ1‰êØ•+W0fÌôïßûöíÃùóç±xñblݺµQowjj*RSS‘’’‚Ÿþ­[·Æ³Ï>Ë2$jL¸fÍtîÜñññ˜1côz=àþûï¯t€¦¦¦¢k×®(,,¬ržF£ ,@ÇŽ‘€õë×[‡ét:¼òÊ+hÛ¶-Ú¶m‹™3gB§ÓUùMÕ¶_TT>ùäôêÕ Íš5ÃСCqêÔ)»ñ,ßÜm§Ù¸q#zôèèèè›Ú¶¦æÝwßÅäÉ“ñøã#((jµ]»vņ jT§5­³ÄÄD<ùä“hݺ5âââðØc!++«Ú}ÌÙüöìÙƒAƒ¡Y³fèÕ«>ûì3—¶_„„„àÅ_ĹsçjulÔUò¸ `;pàvïÞ 33Ë–-L:Ë—/‡Éd²Ž»|ùr<óÌ3ðóó«öCóüùóعs'<ˆ´´O1ûí·‘žžŽ}ûöáçŸFjj*þö·¿ÕhýõWlݺgΜÁˆ#0sæLëÁjûíÝÖÑ£Gñý÷ß#%%妶­©Ù·oF]å8®ÔiMëìÉ'ŸÄ„ pâÄ œ8q-[¶ÄÂ… «ÝÇœÍoÚ´ix饗páÂ|õÕW8zô¨Ëe•+W¢{÷îµ:6êª y\PC ˜;åFó˜2ù9Y–e9;+ó–tÿüûÙ‘ÈÈHùÊ•+Ö÷—/_–»wïn}×]wÉ_}õ•ݰ’’¹:Ý»w—/]ºäpX×®]åË—/[ß_ºtIîÖ­›Ý:9ZOÛ×¹¹¹Ö÷%%%rlllµÓ§§§Ûõ«í¶55±±±²Á`¨rWê´¦uVQII‰Ü±cG—ö1GóëÑ£‡üÑGÉ×®]«vY‘‘‘•º„„ùìÙ³µÚêª y\Ð?ÿ¾¡ÎráÄñ£ò”ÉÏɾð%€X`€×Lð€!zh @0æŒ-¹×àZ€111v¯333­ï-ß%IÂ;#ɓ'ÃËË«Úyfdd 66Öá°¬¬,»a±±±v§¶\h}íåå£ÑXí4aaavïk»mMMPPrrrªÇ•:­i>|÷ÝwZµj…¨¨(ÄÇÇÛ­GUû˜#7nÄÞ½{1dÈôíÛ»víªr|Kk)55§OŸÆ„ 0oÞ¼Zí?uU†<.ˆ§@ëXrr²õuJJ BBB¬ï‡ •J…¥K—âÈ‘#7εjkµZ§wÌ…„„Ø-3)) Æú^©T¢´´Ôú>77·^¶»¶ÛÖÔôë×Û·o¯rœêê´6&Nœˆ§žz GEJJ Ξ=k÷JÚÇéÒ¥ >þøcüñÇX´h‘õô +ðüóÏãðáõÚê¢ y\°,X°ÙÙÙÈÎÎÆüùóqß}÷Ý8—+˜6mÖ®]‹iÓ¦A¥R¹4Ï1cÆ`îܹHKKCAA,X`6jÔ(¼þúëÈÊÊBVV^ýu»ë#íڵúuëPZZŠôôtÌš5«FÛãïïK—.Užº–ÛÖÔ¼ôÒKX½z5þõ¯!//z½Ç·»#²º:­M•••ÁÃÃHJJªXUícŽæ7yòdœ?F£²,»Ô:²(,,ĺuëвeËZí?uQ†<.ˆXn»í6 4½zõBPP^yå»á …qqq3fL>4[µj…Áƒ£wïÞvwž½úê« Åí·ßŽÛo¿aaavó²e˰cÇ´mÛ£GF¿~ýj´=“&Mˆ#\úÝSm¶­©‰‹‹Ã_|ü}úôAëÖ­1gλçêê´6uöî»ïbáÂ…ˆÇ˜1cгgO—÷1Gó6lžyæÄÇÇcñâÅXµjU•ëdû;ÀnݺáàÁƒX·n]­öŸº(CÔXn€±¼(¦L~®låk‘“uKVêë­ÿÅãOO¨Õ´O=õF{ï½·ÑUVcÞ6âþÃíj|6}´#GßW'óJMIÆÆ °jͺoè”(P ×ÜeÛ¼.0/5o 07þ‡¸5e2™ðïÿW¯^ŨQ£ÕNÔ˜·¸ÿp»èVi4ƒ˜˜¬[·¢hf·ªÓ(gÔж¨©î?<.ˆèB5„«í¶5Õý‡ÇÝ,~m""" ˆˆ¨sÛk€ëw&³vˆˆ0w(Û ÍS¤ˆˆˆšNš˜€DDÔ4[€ @""j’ÈÊ!""¶SînŽUß\e­ÕËŒˆ¨‘´Ù2dkšˆ¨Q ³›`ÛÍ1/Þ‡÷·_¹%eéîë]Ûõ²¥3˜’]†½§²QPb¬Õ<ƒ}UèÛ6Ñ!^P)dèqøb>.¤7š}¤.Ë­â¼l¹ã>C @7lµÈ5êß°[hrƒœ¿»ÖÅòm—­¯½=èÚ"#{hñéÞš?;2ÐG…úFàà¹\ìú= £ ¡jôˆÄùkEf©Ër³ÏôQ-ìÞ¹ìÿ @ìÕ³ÇÜwDiiÉ-Y©óç΢īE¥þ}ÚÁ(ɸ§gú¶ F  W®—Â$÷‹„A’‘U ·Žïç¥Ä“ƒbðGb!Œ’óQ0 ½#ºkq[« H²Œk9ºòo¢€;;‡š‡"À[…ÄŒòeÀŒÑ-°ÿl®ÝülûÍÝÅeîé†í‚Ñ*Â×rËP\&aÆèòmìÓ&}ÚÙM£7˜pw0ü¥ƒ±!^µÞ¶ú(3gë]UY==8I™e(ÑI€v1~ÈÌ/_®ÆOGúGâØå‚*ËË}ÚÙÕ‡Á(ãZvþÒAƒçòj¼Íƒ:†àüµb»\£$Ã$E¥ΧÞhý5ô}¤>ÊÍÑ|Ýaÿ ?—wé´n›P'ó*,(ÀÑ#Gpè·ÃPþýŒ (ÿ_eæ®ÔæµÎ<¼âÿ”l 0*ØÿÜSþ”˜áÝ´èÛ6?ÊÆs¹ØQƒs©…Ök^½Ûâè¥<”é«>8ú´ ‚ÆO…O~HÞhBŸ¶ÁÖå÷M†¯§ß•Ñ]‹¾ AØ{2»Êuµíâ‰ÿ” Á„­0¤s(>Ý›‚wÿï^º·%Þý¿K•¦òÀ'?¦ T'¡¹Ö»ÖÛVeæl½«*««%ˆÒx «@?/%uÒàµ"è&DkR×åæh¾î²Y?n€:ØóGŠuŠuöü‘…¶Ñ¾\É(Þ(£MTùû@_šk½qôr¾ÃyÙvíbü°ûD J(3˜ðÃYÖam£}í–¹ûÄeÊNÖ^ïú=…eFè%~»m ºÚéø#%:馷­¾ÊÌÑzWUVW®—":ÄË:žQ’ÑÚ¼ÜèO\É(u©¼\Y¯—îmií&hŽ.-ð¿ß³jµÍžj%:S•ËlèûH}”›£uw‡ýƒÝŸÛ¹;·mê Ž/¼gä—Z¿fäIðñTXÇýùtu ÅïWóлu(öŸÍAQ™¡Úeùz*‘‘Wæðf%®çÙ/ÓÛCa·~ŽÖÕ¶_~±Þ¦? BµÓg–Ù½¯í¶ÕW™9ZïªÊêbZ!îì¤Î`DÛh_lÿ- ·'hpøb"‚<°õP F“KåUÅÿ9g}í©V g| îè¨Á§{“k¼Í¥: QFi™óå7†}¤®ËÍÑvºËþAäþ-@Y®Ô@ ·Êú>À[‰â2Éúþ\j!$“ŒC¥ñ‘K¹çS±+,3"ÀGépXQ™Ñ~™>öË4É2”¢`}ï©íÖßѶÔdøÍn[}•™£u¬ª¬t ¹E$˜¿Ý_¸VQÐ*Ò9Eè RÊÃÕõ*ÕñË™lDk¼jµÍW2JÊ[)U,³¡ï#õQnŽæëû»?·cÖq—Z„—ZÄ.ZœLÌ·gßé,ôiŒ}§³`”L.UÒ‰+yÞ5 ~^Jx(Ëçkv:©Cºháí¡€·‡úhq*©À:üzž½ÛA) ðõTà®îa5úð*3HöU¹t@×fÛê«Ì­wueu1½Cº„áÄÕòåÿ‘˜á]Ãp)­¨Æö®~«•z· Fv¡®VÛ¼÷d&no«A×ðT‰ "ÈôjpûÈ܇Úþiåæh¾î°°c6ˆS ÎÊ.)³Ï oµJÄé¤BüðG¦Ý¸&S¨ÇñËù.ÿüÇ“YÒE‹g‡ÅAðÓ©,ë´»Odà®îáxáî–€ÓIØs"Ã:|û¡4Œº-ýÛ‡ ª€ IDAT°¤ü[sBŒ¿Ý²­‡¥ßþ39xfhÔJo|~¦Êij³mõUfŽÖ»º²º”VŒCÍ œL,ÿ@¼˜Vìry¹bÞÃ7î:3MHÊ,Å–_RkµÍÙzlú! ƒ:…âÎNZ¨”"®ç•á×39 j‰ ñBrVi•ÛZ—åæh;Üeÿ ²°üôÁòZ ˜2ù¹²•¬ENvÖ-Y©¯·þW¼n¯Õ´ ˆÁÉÄœLÌot•U_Û֘ˬ©m³³ízbP3ì=•…«×‹Ynô§‰+ý#GßW'óJMIÆÆ °jͺoPþ‡RÅ äš»l›×æá¥æñ+þ¢ñü7Aºµ B°¯'óÕ7ÂúÚ¶Æ\fMm›«Û®w_e¹UÐhþÄ‚¿¶G^±_üœ “É~ØÂGÛ;nþ§§Ü¾’êkÛs™Õf›²úÞ®ÆZnÔ´¹í)Ð ê>¬"¢¬•~?OÖ®Ès,DDTøq‰ˆˆÈ 1o±%Otbí5`›>:èÖë'²Šˆˆ¨)bˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$"" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$"" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$"" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$"" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$"" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$"" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDD @1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b¹ ¥»®Ø¦6²vˆˆ¨iàÈÑ÷±fˆˆ¨^ñ(1‰ˆˆ€DDD @""" Qƒ§dPM˜$ FId™…á A€B!B¡P²|Yg,? 5Tƒ©))8uòäææ²@ª!Š"üÐ6!±Í›C¥R±|Yg,? 5Ä–_fFŽ=‚¢Y\K( L$I•KðÓÞ½P(ˆmÑI™±|YgM­ü€Ô`% 'ŽÇ Áƒ×’â…BøÖm¡Pª°ß>„……ÁËÛ‡åË:cù¹K‹•UF.‘eääæ 6¶9Ë¢†¢cb‘—Ÿ ƒÁÈòe±ü€Ô™L&ž–«•JI2A–M,_ÖËÏð(Õ¢1È»ÝÜ¥|÷üø#^š5Û®ß[‹Þİ!ƒY<&ˆHÔøF,_¹ ŸmþÃÀ=#GáÈÑÃø~ÇN¼:w¶ü÷¿˜õÒ Ä·äµ©[á«ÿ~‰/þ³Ùéð&OAŸ>}Ùzd‘+ú ßîØíß|kí÷ÍÖ/a’$ø¢U|k´o×kÖ~€ŒkÉó×ÇÞî5 íÚ²ÿ$_üg3yd´ÚJÃ22²°zÍ*@¿~ýYX @jÌžŸ299ÙE!¡!XñÞ*J ýoÏxeökxóõ9¸ç®áðC~A!`Ö¬ýöD‡Ží1æÁ‡ðÈ#àÿû}ì¯(**BFF}ò)¬]µ½oëÉÂü“hµ!8sæD¥þ ä‰ÕkVYƒÐ™aC‡ã©'Ÿfa2ÉȲ\ãëÙÙYXºä-\¾|?ÜÀë%µ(ßWf¿†Uï½ mhrrsPTTŒÄÄ+Ø¿ÿ9|iii¸té’’’ðÀ !!ÁAH’„í; ""“¦LÅÑ¿²ÿÄc¢  ¸R¿ƒ÷cè°¡ÕÎ÷êÕd|¿sž|â)2:Q¬¿›Ž•J%ŒFc£.¿¸¸–¸rå2|}}áããƒØ˜f€w Ç·ß|‡¨èHâìÙ³¸½o?äæå@¥R!6¦$IjxN N‹‹K×®e#'§Ð&ÏT9]p°†ˆޱN€DÀ;#9sæ`ñâÅxùå—í†ÕåA鮹——ºwë¤äDF„‡‡C¡P U|k4oÞ%%%(((€V«…‡§ "®$^ANnŽÓùæççcá…ضmRRRàçç‡þýûã…^À AƒnÙö6¦ÚœœB|ñù—Çè‘«=SrêÔ)Ìš5 ûöíôë×o½õ:tèÀ:aR}¹ÙS˜µ™Þd2aݺux÷Ýw±bÅ LŸ>½^[”·ò4­£e·KHÀw;vá¶]Ñ"®%A€Á`€¿Ÿ?ŒF 11±$ ¥%ÅE²²³pæÜ9”#==>Þ^ð÷÷s8ï±cÇ¢E‹صkbbb““ƒü‹-ÂÀ¹ÃßÄþR±nnvµó ÒX÷yg§W/]º„!C†`Á‚øôÓO›7oÆÐ¡CñÓO?¡%ïþu O ÂŽ;„çŸßÿ½Ýpۇ•aâĉÐh4Ðh4xî¹çPVVæpÜŠýlÿÚŽ'IæÌ™ƒÈÈHøûûãÑGEaa¡Ýô+V¬@\\Ôjuoÿ؇Ç`Ï?@¥V#)9»÷ìÂ'OàÂÅ ¸xéŽ=ŒßÄÉÓ'±ÿà~üòë>$^½‚Üœ\OOÇ¿>ß‚‘Ã_wúñDZtéR4oÞ …¡¡¡3f vïÞíR™Y^¿óÎ;ˆŠŠB@@žyæètº ¯X~ç¿~ýz´jÕ >>>èܹ3~ùålÚ´ ðööF=pòäI·©3Y–a2™`4Þ8ý|üøñj;W¼ñƘ>}:&L˜øûûc„ ˜>}:Þ|óÍjë-''•à““ƒ¨¨(äææºT'õY~ @jP^˜2Ž[© ‚€ÿüõ±GìºGÇÅ S'W9ïuëÖáùçŸLš4 k×®u:îë¯¿Ž´´4œ9s§OŸFrr2æÏŸïÒ6 ë_Ëkxë­·pôèQ:t©©©ðôôÄìÙö?@?tè:½^_çe{×°a8züw¼øÒËØàš5k²²2"#3AÈÊÌÁÙ3瑟—£Q‚^§Ç¾ýqöÜy(E/MŸápÞ}ûöŤI“pàÀ”––Özþùg;v .\@FF,XP£áÕ•ßîÝ»±gÏdffbìØ±¸çž{ðÝwßaçÎÈÊʃ>ˆçž{Î-êÌ~’Ñ“éFvéÒ¥ÚÎúá\ÅŽÝ»wcìØ±[ó¶_\œ Æý÷ß?üЮÿ‡~ˆGyAAA.•O}îó<J JAa–.yËᇠP«Õ7îq‚Piøêœß~åÊ>|_|ñࡇ«¯¾Š«W¯¢y󿕯߼y3vïÞ ­V xÿý÷1dȼýöÛµÞ¶üãøöÛo X²d ºwïŽÕ«W[ÇY¶lBCC뵌€ÍŸŠ¿¸Á!Pªì¿y zHF#$É£^‡üü|DÅÄ"3·Àé<ÿóŸÿ`Ù²e˜8q"._¾ ­V‹Ñ£GcÞ¼yÖBW¼÷Þ{Ö2ï½÷0dÈ,]ºÔåáÕ•ßÚµk¡Ñ”Ÿœ:u*æÍ›‡Õ«WÛõ[¸p¡[Ô™ &Ùdw Ó•ÞÀwÚÍÇ‘¬¬,„……Uꆬ¬,—ÖqêÔ©¸ë®»0}útëuï 6`Ïž=.—ÏŸ±Ï3Ém†*/„˲ŒÔÔTëÁk9øm_›L&»÷–¿z½Îá€ÿüg zõê…ðð0ë4ÕÕI]” Yv~Áßßϳ_{Õaÿñ㟠øðÃ((,°~C¶|à s8ß²²2|úé§8uêš5‹µö¿z5wÜqæÎOOO» Õjµ¸zõ*Z´hamA†††Z‡+•JÃÛÛ@ùuÛé+¾€ððpìÙ³»ÒNUÓÔuùå×] |}}&£UëV(*.B`P ’’’µZ I’¬_4DQ°ûâQV­Záo{ÑÑ15*3Û2OLL„V«­ÑpGÛ]“áû¹C• e_.ÅÄI]žïæÍå_>ž|ú ¼½ôoÖÖ3ÜqÇøüó͘>ýE»i>ÿ|3î¸ã—ëíùç'cÉ’%xàû±fÍX¾|ùM× s:ÝéßYö®Ãþ'= •JAP\RŒ>ü‡ÓÖcE[¶lA=c7¼Y³XtëÖ[¶|‰Gý«Ýô çÏŸG«V­¬Ë?þiL™2Ë–-CLL Î;‡eËÞÁÇÿ£Ž? —¯í5I’‰‹/"0  HLLxzzB¡PB¥R!$Tƒ¬¬,äååt:µlƒpĈ»0aÂ3èׯ4 ÒÒÒ°bÅ ôìÙÓå2€Y³^Åš5fΜ…1cÆÔhx]à­ª³|üH’„•+?² É©/NÃÝ#†¢{ŽÐë‹PZ¦‡ÉTþEE2™Ì× %˜$ ƒž^Þ(.2à˯¾B¡°[ÆìÙ¯bèÐað÷÷Ø1c¬ÇÊŠ+°k×N—ëmРAxõÕÙX·n=|||Ñ©S§&€¼ †jõm·&¥åâááQãiׯ߀ žq8lüøñذaƒÝ©TY–1oÞeee:ȲÉz=V6™`2•‡Ÿ$•ÿLÅ(IåýLæ¿æÔétƒ5HMIC‹¸x(”7Е:«I½5e @ªÕ)КÒéte …’$ÕéÿA6l¸õÆÆV¾z½ÎÜ ,?êïçoæìùžÅÅ7À„´´ëÊo(Ò›[–eäVñˆ´šWÓ @ûmS«Õ0Œ0(++Pþ¥Ïd2Á$™`’M0J&tzH&²lîo2·%ôzdEÅ%  +ÓA¥T¹\g¹¼€t+w †VTdV¬|&“ ,Ÿu$=íÚO¢FV¾²©üú‡ZNíÛaã?6aøà;`42]òóóíæ”œ„ÀÛÛ ™Y¹8é b££áëãO(D±ÎË*7'»ÊyV7¼1Õ™·—¶oß{GG^ÞùòÅK2L²¹h:½ÞI2?îÌÜ:,o-J0$˜$ 77­ZxBWV_~ü0éÖë5û ›=kv½~; ÖÜø§£9ÙYª|-×ô‚5J˜Ì!g*o*š¯ &“€2dÈE”M2 [·}Oµbcc T*Yg @ºõǺûÝá••Y/Áêå«R©Êÿ‘°F…¨ÀSãÃÑã¿ãÈïÇñÛ‘c((,´;å ”_ôöô„V«Å·÷EŸÞ½àíå???øùù9¼¡‚ê®Î4 î»÷>¬ÿpÃMÏ{àð;oooÖnýÑ.ó@üËW( x{{C­V# Àááá¸kø0("DQ´>U§üGï¢õF#£ÑI2A(•JëïY‡õWg*• ;vÂûï¾_åÏL¦ò›“,uf¹1ÌúQI‚R©„···Ý]ÎĤ[w¬ó@¼å+Š"Ôjuw~•Ë1 µZ'b ˆ¨Þùøø`þ¼¸––†¤ädhµZdd^Gll,Ú¶M@«V­Ð,¶223 Õj‘”œŒkii˜?o||jþX0I’0gÎDFFÂßß>ú( ­ÃU*V¬X¸¸8¨Õjk¿õë×£U«VðññAçÎñË/¿`Ó¦MHHH€··7zôè“'OÞÔr€DDMŒ··7æÏ[€´´t$^MDˆ&™™Gdd$2³2¢ AâÕD¤¥¥cþ¼ðöö®Õ²Þzë-=z‡Bjj*<==1{öl»q:„C‡A¯×[ûíÞ½{öìAff&ÆŽ‹{î¹ß}÷vî܉¬¬,<øàƒxî¹çnz9 ‘`î,¯EŠ)“Ÿ+[ùÁZädgq'¢FO¯Óá‹ÍŸã…iÓa2Õü±]%%%xõµYˆ‰ŽFl³ë0¾¾¾HM¹†«‰‰xkÉÛ.…Ÿ£d0o¿ý­[·\¿~Ý»wGJJŠuºÄÄDDFFÚÍ+==ƺž•úi4”––@­–S•5«VàžQ£tSu”š’Œ6`ÕšußÐ(P  @®¹Ë¶y]`^jß@` ¼HDde4`4ÖüÁÍ:]L’Q!B’L$ I&ŒF˜$ :]”Jמ5Z\\dÐzRSSѾ}{ûŒ @¯×Y߇„hìÞ€ŸŸ¯µŸeùûFëûÚ.§!â)P""3YFçVTT„ÅK¡Y³fˆŒŒDaa|||àããƒÂÂÄÆÆ Y³fX¼dŠŠŠ\úÝœ£þááá8þŠŠ ­]aaA•ÓÕ¦_m–Ãß5ü¬qø-Yº¡¡!CNN6|}ý’’ŠääTøúø"''ááa Á’¥‹« Ag3~üÓ˜2e ._¾ ƒÁ€“'Oâ‰'ž¬ó¬Ír€DDM¨X\\Œ¥o-APp ´Z-rrsàë뇤¤$$'%#%%W“àã㋜ÜhµZbé[KP\\\ãœ>}:z÷ï ­6 O?=#Gެó¬Írjò Q… +þùÉÇðöñAhhyø 11y¹y˜1ý%ˆ¢ˆÕkVC’Œˆˆ/ÁP-$£ ÿóxvÂD‡ÿ0??Ïá:‚€3¦cÆŒéB[v:]múÕf9 ˆÈæCÞ•÷¢¢"œ=s]»w3_óóErr rsrñÔ“OC–Ëo€yü±'ðÑLJÑhDdd ‹ ª Å‘£G »;CÜ)™——ËÊaÕgVÿÔN‡ÒÒR„‡G"5%HIIA^n~èó£Ëd‚…BĘÂæÿ|ƒ^¨¨(\»–аP-JJJ Š" …õå¹¹9Nƒ™ê¯݈K :í” ¢ˆ‘#Gðûï¿CD<<æaÁÇÛþ~~ðóõ…·—74ÁAûðXxzzã÷ßOÀ¨7`ØáÖù(D±Úe6èŽ-@"¢†’Uh‹¢D†GàÉqOX7¨T*áéé oooëÙ•J%JKÕP{xà‘‡†Éd‚(ŠP©Õðôð€——DQd HDt«óϵk€J¥þþþðóó³>9FEBùƒµ,óP(ðõõ…L&d¹üÔ¨£q‰HDt °æ·î‹¢h3¹ìÒx > ‘»åƒ‰HDÔ´ˆ¢“lbÖ!Édrø[G ‘»"9) ¡¡¡,:’“…  `‚{þà€HDMžBT cÇN8ðë/¸­Wo„„j!Š ¦–L&Y™øíÐAtéÖ jµˆÈ‰ Šb´ «IDAT‘èб#Ž;Š‚ü|Hµø¿€dþB¡P 0:v@ˆFO/O ‘;Jµ -Z´@TTŒF ²Ì¼©/‚¥ZOO/·]G ‘¥å¢TÁ[©bA4•fˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$""b1‰ˆˆ€DDD @""" ˆˆˆHDDÄ$"" ˆˆˆHDDäfdüe1‰ˆ¨±´«j •֠²ª©)É,j""r'&s°™œŸË§DàÔç'±˜‰ˆÈÝH6Éæ¯¥«¶åg!˜;Ëk€ÂÜ©xðà @0€@Aæ÷þ¼Íã©Íª0ÏÇv¾DDD5eÛŠ³„€@)€òäÈc~_ @]…Дµ+6%m“ÕhÓÌ+a =KÓTdQ= É& æÎ’I®ÚS¡JsOŽÏ£Ê’ײp½9U6ÍR¥M+ @""ª£´Í!ƒ¹egiÝÙ¢mšªjä9k: ?ƒMð•UhùmP` ˆˆê(móÈ6K„ ±BKÐÙÍ2No‚±Œ(9¿2› ³´ü ¸q*Ta€ ?""ª«´Í$KC¬å×Ë„ Ç?YYMÒV¼èè(üôà 0DDT8¾ÆÒ ,±i ê+´kÝ´½à¨°é`3L@eŒ¢Mø1‰ˆ¨.Z€€ý0† !h{:ÔÒ 4UÑDu-@KÒ*Ì ªxÚÓ6ü-@""ª« mÚ^šÓáÆéPG§A«mÊ6aåè‚£íiMS…´½ö'V> Õu+ÐÑý)–a,Xeø9j¢BøYl†Y¬wÐòÀç‹Qý¡ÉAKÐr©ÎˆŽZ€•Z•®\¬¸`KÚ¶ú„ ­D¶þˆˆ¨.ƒ¯bÉZƒUý(¾Ê`ÅÓ –§º8 AËiQE…VO}Q}† í©Pöw{V|>¨ì (WÕJ«ØŠ]øËð#"¢[‚ÕýuÔ’¬6-ï«ëª›'Q] íûê:Ô$« FG8ãu?""º!èè×NŸüâJйÚBdð‘;a•ÁW“ànr8Q}‡`‡×&¼xDDÔÑ´NDDMÒÿLl'Ã%±ÞÉIEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_design_fields.png0000644000175000017500000017761712235000130025370 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÞQ³üo’sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ (8±+² IDATxÚìÝw\÷ÿðWØeAA\ˆŠ ¬{Õ½W‡{ëµî½[­¿:ºm­£¶j«Õ:ëÞâÀÊV–¬„ÜïK$Lðõô‘‡¹ûÜ}î³îrïÜåý±c«"""""""*"A Þ+–.dËé¸9ó³ô-ð^±t!*W®Œþ dËé¸Ýì@DDp} ¼W,]ˆéŸÏ¤¦¦°eˆˆˆˆˆHo¤¥¦@,k]cccXÛØêe¾–VV€ukV3øÖõÀ;/èNIIf‹‘^IINÆë×i8súT±ÖoÕº ,-­a[¡‚Þæóöïc𭣌 råÊ?÷&"""""ÒY©))HKMÁ¹sg0|ä¥W˜•IKMÁ/›@‹­6¶¶z™oþ¸Žthù’Âä HOKS¸ÀÞ³a¸ð0R cr[Ó\,À–%""""¢R—–šŠC÷cÐá°³w(VQ‘ϰ÷ÏÝèÒµ¬mlô2_ˆ‹åUoe”÷FÙÕîL‰*º¸hœaVj2¯œQ™²³w(vâìì eq‘¾åKzx·ñµÀäºþ…æ ‚‰D"Ÿ™‘…=dçihùò€¹sç°1ŠÐNºÖnìG"¢wG$i5¯¼XFßò%=¼óæþý÷^Ù<77w˜››£àRi.LMLØùDôÞËÊÊÂ…‹ñèQRRÞü¥+KK8ØÛããO>.|¬Õñãfzz:Ž=ŠˆgÈÉÉ©©)lmm1räˆ2-GÁvRÕn+V¬”›600€•µ5ªTöDëÖ­aõßS`K³|DDT&‘·Vó’Ë•ä;q•Ylظ±Dù\_ÙüBù’~Þy¡w½JH¥¹HMKExx8A€OOO$&&²ó‰è½–‘‘_ÝŠŒŒ têÔÕªUƒ xþü9‚ƒ¯*}11±²ùyåž5kf¡ºäÍ‹ŒŒÄ™3gŸAàáကÆðòòR¸|Þt×®]pñÒe¤$'£¢:vèOOY¹®]½Šë7Bšš +++4hP²¾V·]uéDDïEàï rIƒPe·„Ìwý† ן4q¢Â2h’ïú 0iâD…÷ú ÔæKzx  ç cÇÈÍÍ…$7Ò\ NŸ;Èg°µ¶€¹‰²³³ Î|”Ìר¶ó7ôïÝööla"zï„……ªW¯®ñ‡aÞr—.]ÆÙ³g€æ-šãì¹s8{æ,DÐäƒ&rëÄÆÆ`ĈሌŒÄŸþ…=»÷ ž¿?F%›÷ÏÁƒ3zT‰ëdnnŽôôtlÞü3ªúT…»»;|ªVUx»vqÊ%ÎcÔȰ­P÷îßÇáC‡‘››‹.]ºh-ð‹Å¸qãÀÍÍUn]e'.yóöï?€ôôtôéÓ^^U‹+W® J•**Ë…aC‡ üÙ3ìÛ»‡ÂرcW‚ƒqúÔiøÕñC‡?Dð•`œ>}"4n¬Ñv5-Q9¼µš—º[ÂK3ßüÁ·º ¿P¾¤·Dœ£ø„Eš ±DŒƒ‡þT*… •ÂÞÑ‘ÑÏadd‰X W*EVV&D0DØ“'¨`cÍ&¢÷NFFÀØÈPîØºö«ÿ“½Ÿ4En¼åBnÞÔ¯_¤hPßWƒ¯"äæM4jÔ@n¦4ðô¨ôv^“ˆ€Êÿ]UM~õJéñ½`™•+OçNqúÌ$$$"ôN(Bï„â_|ؾüüj—¸\óê&HQ³z5>t?)TvuÓŠ¬^ý…Ü´¡¡!Zµl)·®H$R˜WÞ¼œœÂÂܹ1\]œÐ«gwµåiòA D€WeO@JJÊÛ¾þïK€ÀÆ ‚ÿº8án\»Žþõ4Ú®¦å""*ßq·A¾ã°¸dyå;–«ÊWÕv¥iš¯¦ù)Ê—ô$ðVþp5’\ Úµk‡Ü\ $¹H$ܽÿŸ>…¥…å›!‘@,#==bqêÖ©Ço_ˆè½dii‰´´4¼~ýZîŠpÐÔÉøjÝ× ¹yÓéiiÞ\aæff€´´´B똙™A¹[ÖòÖËŸoQŽÅÊ–õð¨„Áƒ"-- áÏžáüù‹ÈÊʹóP»¶o‰Êõüùsœ¿p ‹Å²ùYYYj¯pkR· ©“eŸSwî„âÔé38qò>ùx€Ú¼òæ5kúο€í;vÂÀÀŽŽhѼ<==Uæaei)×ùëšú¦¯7ÿ¼EnÔ|}­n»š–‹ˆ¨<30xûy“››[¬< ÿ ŠEJµùªÚNþ´¢æ;cƌŸcAAøòË/Õ–—ô>ð~ó´r©TŠ\©Ò\)¤Ò\‚€ ¶Ö°µ± xùò%2Ò3!•äÀÔØ(âÉQyáãS!!7z÷kàæM[ZZ"==¯_gÀÒÒ¯ÿ»znmm¥QÐYÔ·M2©H¬••êøùÁÝÝ¿þº 999%.×Áƒ‡‘þú5zöì*•=!•J±aã7 ¿4(ɭ憆†ðó«S§Ï .>^n]©T ©T ‘H„ôôôBëúû׃Ÿ_m$&&"**ç/\Ä¡ÃG1v̨"—/ožµµ5RSS1vÌhXX˜+\FÝv5-Q¹–ï‹^©T*{?sæL•«­^½ºP «ì–ðüù*šV–V”|ó—7¯lyóf̘¡¾¼¤¿· ÈÉα± a”k„\£\äJM`dd„\‰))©022‚8G‚̬,¤§§ÃÊÊxÑû©I` ¢£¢qéÒe@àë[  º‚Ó¾µj"øê5\¿q4 ÄëonGö«]»ToMíÞó'êÕ­‹J•*ÁÌÔI‰IOO—Kúßÿ¦ÆÆ‹ÅoÚMÃ@¶(·D"Ahh(ÀÞÞN6ßÖÖ)))xòô)*{z*Üþ?ÿDãF áèèøæá' ‹U¾¼y ê×Ãé3çpîüy´jÙ"ðâÅ „ܼ…Þ½zj´]MËEDT¾ãî|l®xË-kl,ËKÑCÐ æ«*¨/I¾°rÅ Ùü•+V`öœ9åKzx€‰‘.ž;Qß§$§ÀÈÈ66Ö™™035FF†>ÚžˆÞO&&Æè? BBnâQØc_½©T cc88ØÃÉÉIi€© àÁƒ‡ ¹ KK 4iˆF¾ÓÀÛÄÄç/\DFFrssann†Zµj¡Eó¦%.W§âôÙ³Øó×^XZZ¢Q£†Z ¼ÿïë·¥155—W´lÑ\¶nûömqêÔiüóÏ!ØØØ qãF½{O.ÿÚµkãÜù‹ˆ‹¸¹º¢™uWUïzõêÁÐзn‡âû‚‘¡!\Ý\Q¿¾¿ÆÛÕ´\DDå:ðÎô滂¼|Ù2Õ·‚«ÖÊþìWYæ[p}eó æK:>N—/Y LšçQ‘EZñàÑcHHŠƒ""55/“’žžkktíÚþ¸CDDDDD¤Mæ–Øûç.Lš:/“‹•‡••5¾ûf=z÷€ÌŒ×z™/dggãÀþ}˜31†ŽQÿw¼•hÔ >Nœ>±$&¦¦033…™¹‘!ªU¯‰êÞ^üö…ˆˆˆˆˆJUÞ­Û/“!Í•+¸¸Y^o ×—|©œÞŽööèÓ½bãâ‹ [;øÖ´‚g%wØU´ƒ‰‰1•*‰8½ûöÇö­¿ ]û°·w(ÒúII‰8qüz÷í‰øíCCõ-_*§7ãR%xTªT(€ˆˆˆˆˆJ[ff&ÌÌÌгW_ü½ïÏbåѳW_HÄbdeeém¾TŽo""""""]¾­¬¬Ñ·ÿÇÅZ?W"Aff¦ÞçK ¼‰ˆˆˆˆˆJMZZ*ó%ݼÿر-ADDDDDDTZ÷G#û¿ßðÊ7‘þÈ{Rúóè(Ø¿ ¢ƒ ØDDDDDDD ¼‰ˆˆˆˆˆˆô’QÁ¼ÕœˆˆˆˆˆHäÝjNº‹W¼‰ˆˆˆˆˆˆxé§wr«¹“³ âãbËEêj]Ô•«<õ½¿ûÛ˜Øîl?"""} Õ+ÞNÎ.:•Ï»8i!¢÷sŸQV“J¥>b$Ö~õƒˆˆˆÊ½b]ñvvq-4/.6q±1_1Wµ\QòÑ&EõÊ+&uÉ_ngWµë•¤LE)WqÓ˪­---Ñ A¬X¾ Õ«W×ÙE[}ªÉvªW¯Ž³gNË=(C´hÙ aaa%.Gi÷½³‹+Ú´i¿ýVèaùÛñ]íë¥1 ÖEÑqAÆ_I÷i‘H+++T®ì‰6­Ûà³Ïþ{{ûBË/X¸õëûcâ„ ZïãBU¢Ž>`•ˆˆ¨ŒoMéò `IèZ½ò—G×O¼‹[·ÔÔTlÞü3>7'Žç^ ÀÂÜÿþû/:tè ›wäÈQXZXèM*T¨ˆŸù#GŒ`‡¾'òö錌 ùôS$&&Ê-³qÓ&Ôö«ƒ*^Þ˜2e*rrr楮Oœ<‰–­Z£’‡'6jŒ;vhµ.666?~>|¤qýœ]\UÖO]zvv6‚¦M‡Oµêð©VÓ¦OGvv¶Òq¥¬OK«mÆO 7ÊÍÛ°q#&Lœ 7O]=ÔYu}_«W­ÂÏ›FØãÇ*ÉÉɨå[É))riÉÉɨíWÉ))jË©ÉxQu¼Ò$MÝþ­,?MÇ‹ª:(Û¦&ÇGUå)­ã§……êÔñòeKñé§Ÿ`ÕêÕjˬqP”}£¤Ç]m{UŠÒ~êêODDD% ¼APûR¶\þù_®Yƒ‡âÄñŒ/^È-wáâ8°ÜGçÎ1mút…ùüß×_ãÖí[8þï1„Þ¹ 333,]ºLnÙë7®ãß!æÅsÊ_Ôzå½V®ZĤ$\ ¾‚“'Žãü¹órëä½yˆyؘ%*“²ò <cFÂÝÐ;½sU«VÅ‚ å–½té2NŸ:‰«ÁWŸ€U«W«'L˜ˆ3¦ãÉã0ü½o/®]¿®Õº¤¤¤`ÃÆðóóÓjýT¥¯\¹ ±±±¸tñ.^8çÑϱjÕj¥ãJYŸ–VÛtíÒ‰‰‰¾ Apá¼zõ]:w–k;uõP7fÕõ}Iê`cc/¾Xñã' ''Ga߀­­-ºwë†m[·Éå±uë6ôéݶ66jË©Éx)Êþ®jyecAѱ à{UãEU”mS“㣪º•Åñsà§ŸâìÙsjˬqP”}£¤Ç}hûâ|žjZ¾øâ‹/¾tëEºO´|ÉarÐ dgeÉ®T«£èÛùؘpqu“ ÖoÐ{öìFUoo…ë?¸*Tdff¢ZõˆŽŠ”¥çåÓ¨qþø}'ªV­ HHH@Ûvíqçö-Ù²7CBàââ\âÆPvÕAV§ú ð×_ÁË« àÉÓ§hÖ¬¹,=¹ó¿×Uyfff¢QãÜ ½#[öÒÅ‹²²>}޾ýú!äÆõ"·qƒ†0aüxtîÜ ®®®Z«‹ÜÕgg…·£–¤~ªÒýë×Ç_þoo/Y_öëÛ!!7”Ž+Eí_ZmóÛ¶oÇñãÇñë–-øä“Oѵ[W 8P®êê¡n̪ë{mŒÕ%K—ÁÈÈsfÏVºŸ<~ü}ü ®\¾###H$|дöíý îîîE.§¢ñR°ïTíOê–/Jzþ÷E/šÔA“㣺rj󸩍=Åb1¼«ú *2Bm™K:вo”ô¢km¯JQ>Oó—OUý‰ˆH·žGGáÀþ}˜31EÇû7Þê‚ÊøøxTöôTšžt€¹¹9$‰âíÄÆ¢YóòßxX“6N\4©W|B<=߆ªêWÚ®^½†eË–áNh(222¶Kþ²zzz !!¡XmüóæŸðÕºuørÍØØØ`é’%èÐáC­´µ ˆˆˆÀÔ i¸* ¼µQ?Ué ‰¨\ÙS®/ ܪ¯É¸*­¶€ Àš5k±wï>Ü»¿þº¥Ð2êê¡nÌj²•ÔìY3ѵ[w´k× —ñññA5pðà!ôìÙÿüs7‚»»»FåÔd¼èUã¥8uÐFÿióø©ì³ÀÎÎN£2—teß(é1D×Ú^Õ—HÅ-³¦Ÿ!DDDTŒÀ»¤O%Ï›ïä䄈ˆx+¸â­l}EOvrrÂÁÀÅÅEí²Ú */GGGDDF«J@Dd¤Ê²”ÆmyyŽ3‹-D›Öm`mm…ôôtT¯QSn›ùˇbµq½zõðë–-'OžBдi¸õaˆÖêR¹relÚ¸:wA‹æÍaee¥•ú©Jwtpïˈ8ØÛ«í¿‚óJ³mŒ1räLœ4 3g~ccc¹ÛA5©‡º1«ÉþUÒþ522†õ_cÔè18tð¥ûɘѣ°fÍZôèÑ?þô#V­\©q9Õ###dddÀÜÜðêÕ+•õÔdyMašîKšŒù‚ÛT×.Å­‡6ŸÛwì@‹-4îË’Œƒ¢ì%=†èCÛ—ôóT]û‘æ J+ãúcÎÜyˆ‰‰Ajj*,\T¬|† Œé3fàÙ³H$Ü¿ÿÿûßg櫓z÷î…E !)) ‰‰‰X°`ÒemllðäÉ“R+KVVLMMaffŠÈÈH̘ñy¡eòÊš””„… ¢OŸÞÅjãÏ>‡GA"‘@¥w'”„««+cïÞ}Z«Ÿªô={`Á‚HLLDbb"æÍ_€ž½zª,£¢>-í¶™8a¢"#0aüx…éêê¡nÌ–ÕþU½zu 2sçÍSºL«V­–žŽŸù––ðóóÓ¸œêÆ‹¯¯/¾ýö;dff"66ŸÏœ©²¼ê–/îþ­j¼¨«ƒ¢mªk—¢Ö[[233Š bço;ñùŒé—¹$ã (ûFI!ºÚöÚü<Õô3„ˆˆˆÞaà=-hªW«†¶íÚ# ° *ýw«`q€€ô0ÞU«bÜøñèÜ¥s©5ˆ«›{¡Wž™ŸÛ ¶hÔ8mÚ¶CÓš*ÍgÜgŸ¡c§ÎrëkÓº¯ÖbÑ¢Åð®êƒ¾ýú£q@ãBË u›¶hˆŠ+âó3ŠÕÆ;uĈ‘£à]ÕË–/ǦJ¥NƒĶíÛµV?Ué³gÍ‚£ƒ#>hÚ 4mggÌRsb¬¨O˪m”QWuc¶,÷¯‘#F >^õ­ª£GÂüù 0nÜgE*§ºñ²vÍ—8|äª×¨‰î=z¢y³æ*Ë¡nùâîߪƋº:(Ú¦ºv)j½µqüts¯„:uëaÊ”©011Á¿ÿ“{vƒ&c®¸ã (ûFI!ºÖö¥ñyªég©WèájùÿÜ ‘®rs¯„Ï£‹ND<†ðÖŸˆ¨œ055À‡«é²"?\Íͽ’Âùúþ­¬^ïº~ŠÊŶ.ß'»šâI1ǧ¾[¶Ûžˆˆˆ÷{~²¯«õ*íÍ@¶ û€mFl{""¢÷:ðæKI<ŽR9VÕ¥!<†€õ'""*#l""""""¢ÒÃ+ÞDDDDDDD¥ˆW¼‰ˆˆˆˆˆˆJQ¡+ÞÏŸ°UˆˆˆˆˆˆôD-_?6‚¾Þì4"""""""íá­æDDDDDDD ¼‰ˆˆˆˆˆˆxo"""""""ÞDDDDDDD ¼‰ˆˆˆˆˆˆˆ7o"""""""ÞDDDDDDDÄÀ›ˆˆˆˆˆˆˆ7o"""""""bàMDDDDDDÄÀ›ˆˆˆˆˆˆˆ7Ñ;eïà{G¥ÓºV>""""ÞDDT$qqq ;wþŽ#G–Ê6ˆˆˆˆxQ±œ?wàïïSÔ«W[Ý"·LÞ•å­Û¶¡AÆpusG‹–-qìß±tÙrÔö«W7´nÝW¯^•[÷»ï¾‡½ƒ#œQË·6¦N BZZšVë`aaÑ£Fn†Ü,TnEuÉsáâEtìÔ•<<á^ÉýúÀÉ“§”.Ÿ7½sçïhgW4mÖ.\-#¾ùæ[4jÔ.®n¨[Ï_¯_A4Þ®ºt"""bàMDDz¢BÅŠ€-[aü„‰Øºm›ÒÛµoݼ…sgÏâ—_~ƽ{÷ñÉ'ŸâÕË—¾r[¶ü‚;¡¡7~‚Ü:™™™¸xá<¢£"1oî\lݶ ³çÌÑj222°ùçŸ 6”K‰D*×3f,®]»†øO‡!(h*~üñGµÛ¼tùNŸ:‰Í?ýˆ‡bòä)²´›6aþ‚lÒáOŸ`àÀO±dÉR|óí·o·¸å"""¢wO´|ÉarÐ dge±5ˆˆgϞżùóq÷î=Ù€ƒ½=Äb1\\Ýî߃££#¤R)œ!‰˜¯p[¹¹¹prv½½=|(—wÞíܧQö°3S:tþþþ²å [hݼü+Wñ‚8'‡BÍZµ`jb¢p[Ëzç6\]]em‘¿Þõ4@dd®] †——RRRà]Õ•+{âÆõëmW]:Ñóè(Ø¿sæ/fcè^ñ&""9-[¶ÄÙ3gpûÖM¬]»+V„X,Æ’¥K -ë`o/ Ìó8:¾ D Þ|Ää¿úÒåËèÖ­;*Wñ‚ƒ£œœ]/_¾ÒJÙó~ýây4V,_ŽìœÌš]´«ésfφÈÀmÛµ‡‡‡'ÚµÿgΜQ»ž«««\[ä¯÷‹1€F`ïàïª>€¨¨h·[Üro""ÒQîîî6t(Ž>ZùöÈ‘£péòeüðÃ÷ˆyñÏ££ ©Ú`jjŠÁƒnݺ%—–›› ©T ˆ‰‰)´îرcðäqþ=vsçÎÁÍ›71fìÿJØ–oïÈûr )1 ñqo·4ÊEDDD ¼‰ˆèèÞ½öî݇„„äääàþý€6­[—8ïÜÜ\€ ²³³±tÙ²R©Cvv6¶mÛ¨Y£†l~•ÿžÎ~ôèQddd`õ_ZwÈÐa¸wïüüüТys€™™Y‰Ê3vÌXÀ¢ÅK’’‚ôôt?~ýúÐx»¥Q."""*Fl""ÊÏÊÊ K–.A\\<Äb1ìììðñÇcÉâ’ÿ^ì‡ï¿Ã¬Ùsгg/¸ººbòäIZ-{þßzÛÚڢÇbÙ²··È¯_ÿ5¦ÏøÆ@%wwÉô<ƒ¢ÅKpíÚ5ˆD"4ÆâE%«ûرc`fn†Í›7£f-_˜šš"00ãÇ}¦ñvK£\DDDT6øp5"""""¢r€WÓ]¼Õœˆˆˆˆˆˆˆ7o"""""""bàMDDDDDDÄÀ›ˆˆˆˆˆˆˆ71ð&""""""bàMDDDDDDÄÀ›ˆˆˆˆˆˆˆx1ð&""""""bàMDDDDDDD ¼‰ˆˆˆˆˆˆx1ð~¯EFFá‹/¾D·nÝQ£f-8»¸Âͽêù×ǧŸÄæÍ›‘œœÌ†Òs‚  c§Î°wp„½ƒ#zõîÃF)gzöê-ëßN»@6 ½3Fl ''K—-Ã?ü‰D"—&‘Hèèh=v -FtT¤N•ßÞÁQn:)1AçÚX—ʸk×.\»vM6=kæÌr3–9Þ!…. IDAT˜=kºvë¸zõ*vïÙƒýûó`GDDDDïÄ;»â]ð仨éÚ’}Œo¾ù¶PЭHff&G‹ÅXµzµlºaÆhÒ$ SÎ4iˆ† ʦW­Z±X̆!""zÇÊꟈ·Ž™={Î;'›‰D4h Ž=‚ȈgˆŽŠÄ¹³g1oî\899qÄè¹={þDdd”lzø°al”rjØÐ¡²÷‘Ø»w/…ˆˆˆÊœT*ÅÐañfÍZ6Æ{¬Ä·š«úÖJosÍïîÝ{غm›Ü¼M7à£>’›çë[ ¾¾µ0fÌhÌš=[a^‚ àè±cؽ{7®_¿„„‚'''Ô¯ïýû£S§N‰DjÛ0)1W®ã»ï¿ÃÅ‹—’’gggtêÔ 3?Ÿ;;;•m¯êVÞ°°0=v W®ãáLjEVV,,,àî `ÐÀAh¬²íNž<õæ–íë×±X 7WW4kÞLnýâ”ñîÝ{øö»oqùòÄÄÄ@"‘ÀÎÎ5kÖD³¦MÑ­[WÔ¬Y³X}þãO?ÉÞ›š˜ {÷nZ©'Ç‚î…=ºcúôéÈÎÉù¯ï7cÀ€<ê©9·¯Q£.œ?'w®"š6kŽGéü9~Þ¹…H$‚••ªT®Œ¶mÛbÜøqp°·/óòÌ_° ÔÇäI“8ÀÞc¢åK“ƒf ;+K+ƒ\ÓQݲEÉ«¸æÌ‹ï¿ÿA6Ý«WOlΘiêåË—5z Μ9£r¹V­Zá§KÊysçbùŠ åããƒÇÿ…•••Æ·êäoGM×™úH®|Wƒ¯ÀÛÛ›G~"""çàþþþ˜1c::uì(›èÐ!¬ýjnÞ¼Y¢sô²8ÇÏ¿ŒŒ <~ò;wîÄþýpøÐ!xzz”Ûþ{…û÷aÎüÅÌ:¦Ôn5Á³r¸¹¹cÀG!11Qn™õ6 FÍZ¨ä቉“&É®L”››‹¥K—¡Fšp¯äQ£G#==]í§Î…óä¦Täzæææbà Aj-8sæ  ŒÜÜ\•Ë-[¾\éS˜?~ŒMß|SêãëõëqäèQ…uUh•ÄÒeËÕZÅuôØ1¹éfÍš©ìÓ¢Ö“cA÷ÆBóæÍå¦9Ê£>‘“&NÄúõë œl(tÅ6;;S¦NE/oTñòÆÔ©AÈÎÎ~›ž“ƒ '¢’‡'jÖòņËä?? Ô­S+W¬À A±råJËoïàˆ_¶lýpquCëÖmp'4Tãtuõ+Ný‰w!Ÿ~:ÿûßX«V®R˜×ºuÿ‡›·náÔ©“xøà>ÌḬ̀xñ’—1üÙ3¹ézõê9?þØ…à૲iKKK|ûÍ&< ŠÈˆgøî»oaii)K¿r%»víV™§©‰ Ö­û ÏÂqÿÞ]tíÚU.ýÐÁCÞ\éSôaÞ|EéþþþX¾lNÿO‡!>.Ï££púô)ôìÙCnÙ­¿n•›Þµk7._¾òvð`ò¤I¸~ýbc^àáÃøuË/hÙ²e¡²hZÆ»ùV°sçoˆyè¨Hœ9sË–.Eݺu‹ÕßW®Ë·…’þ.N=9ts,Ô+~%8˜G}"""5ºw„DÙyÍ… ðòåKtë&²|ù ÄÆÄâÚÕ`\ ¾‚èçÑX±âm`»rÅJ$%&áfÈ œ;{Fî¹J¥yޝÌàAƒp:ßuåÏ«ûáCñôÉctíÚS§iœ®®~e]z·ÊìVóÌÌLøû×ÇÇdË^» ///ÀÓ§OѳWoܹ}«P^þõ`Ïî]ðññ$$$ EËVxpÿ^‰Êëàè$w51.6FFEûÙ{ï>}qöìYÙô—_~ÇË-³ùçŸñùçoÿdUëÖ­ñçžÝJ¿¹›;g‚‚¦¾ý‚ <È}s¡týâÞ¾“‘‘Ïʲi'''Ü¿wW6ݧo?¹«¹S§NÁ¼¹s5š”ÑË»*RSSeÓÓ§OC‡?„lmmKÔßñôéSÙôÍðð(|«Qqëɱ {c!22 õ4MûøøàÊåK<ò©9ŸÿuëV;ö/vl߆þ {÷î2x°Ü9zm¿:8°ÿoÙϸžÿÆ@Áƒ©ŠÊ¯_¿–M§¥¥ÉvMݽ+U®[+’н[7¹`+ôΕyöíÛWnÚÍݽPPT\iiiرã7?qaaaHLLDvv¶ÂÛ™_½z%7*_îüOÖ–öíÚá¯|OŸ^³f­ì nnnhݺÆŒƒ:~~EÎ;&&FnÚÑQñ­JÅ­'Ç‚î''G•c€ˆˆˆûøã±zõøó¯¿p÷î=lß¾½Ð2 ¨\ùíõ•+WFBÂÛ€7>>^î|?ÿ²¥yޝL\\œÜóuÔ•€\l`nn^èÏ«JWW¿²®?½[¥v«ùˆ‘#1jä(Ü ½ƒÄ„x< Zè„>22Rö>**Ji äììŒÐ;·ånGMLˆ/q½ªT‘›¾uëV‘óHII•›¶Wð¤Ä‚ÐJIMU™g¥JòÁ•‰±±Vú$üÙ34kÞsçÍéS§¬¬,¥¿!.øw ÖÕÅÅEëãfÅŠåJŸ¢ýâÅ üöÛN´oÿ!Nž""²i'''¹ôüïKó_™mÛ·£U«V—¿¤ÔÕ¯¬ëOå4ðÎÊÊ‚™™)LÍ̉©AA…–™7o>“’˜”„¹sç¡_«{y††©Sƒþì$ îÝ»Q£G«Ü¾&^hÚ¬i¡±¨lmmä¦_¾|Yh™‚ólmlTæihh(7­­o¾æÏ_€çϟ˦G…›!7‹¤ÄÙm1šÖ566VëãÆÑч±£G0{Ö,ôìÙµkûÊý@"‘`õ_ýÄÔTnZÙƒ»Š[OŽÝ ¿l133ãQŸˆˆHCS&OF\lŒÒ?ƒÕ»w/Ì™3‰‰‰HLLÄì9sЧOoYzß>}Þžï'&bΜ¹erŽŸ_ff&nß¹ƒ9sçbûö˜=k–Æå/)uõ+Ný‰w!ë¿þ?Ì›7žèÙ³ -Ø$Íš5‡¿}T´³ÃìÙ³æ5yò$4iˆÞ½û ’‡'ÆŒ‹®]º–¸Œƒ’ döíû»víRºüëׯ1iòd¹yµkËßæúÏÁƒ…Ö+8ϯN­¶uÁ`LÙUË‚´X²x<< ?oÞŒ³gÎàÂyù²…xð–& ^•-x+QIëɱ {c!>>Aå ""¢â›7w.ѰQc4lÔ...˜;gŽ,}Μٰ­Põêù£YóhÖ¼Y™œãçèŽN¨Q³&N˜SSœ9}JîO‰©+I©«_iÖŸtV®¦&O™‚íÛwȃ ÄÁƒQ³fMˆD"„‡?ñcGñÃ?!..Nîa ;vü&Œ[[[ãË/¿@—ÎGŽÅ´iÓ‘––&[fÃúõøôÓOä ù)z„ªe >„jË/¿ sçN…WÉÃSîVÛ3¦cì˜1077Ç¿ÿÇôéÓ‘˜”¤t;;wþŽ '¾ýÖÆÀ“&NÄ!Càîî†ÔÔT\½v ?ýôvøCÓ2¶nݽz÷BÓš¢jÕª¨PÁYYYøûïý˜˜ïÛVsssDGEí‹–ÁCpøðá·_´ìý -Z´(´\qëɱ {cáÌ™3èÓ·ŸlºsçÎØ¾m+üDDDT.ñáj ¼uVVV ø.^ÔxüˆD"A×nÝqíÚ5Ömܸ1þs@îâ’[=zôTYþ¼eûPäßFçßNnn.zôì)÷g¤4Y¯(eÔôö¡-Z`ßÞ¿ŠT—õ6Èý‰†%Kcü¸q…–+n=9to,ìóÅ‹aÂøñ<òo*Sï{˜™™a÷žÝ3ft¡ßÓ*bnn.7mdd„ßvì@óæÍÕ®Û¬Y3ìØ¾]£íŨQ£4ZnÉâŰQñ›â)S¦¨\ßÐÐÛ·mCÛ¶mJ­Œš°³³ÃòeËŠ¼^§Žå¦/œ¿ Õzr,èÞX8þ¼Üt‡?äQŸˆˆˆˆÊÜ{Å;¿gøý÷ßqîÜ9„……!99F††ptrBm__´k×}úôQø'ǤR)Ž9‚Ý{öàÆÙï‡РA}ôï×;w†Aáï:Jz•xóûô~üwïÞCzzºÒeŸEDàË/×àÔ©SHJJ‚­­ êÕ«‡‘#G¢SÇŽ•Eœ@\Ü›¼­¬¬àííýæOH ''§bõqÛvíeO¯733Ãã°G…¾L)i=9tc,¤§§£zõÈþï!zõêÕÃÉÇyÔ'""¢r‹W¼xé„ß~Û)÷ûào¿Ù„°aÞƒ¾Þ¸a>ùäc6 1ð¦2gÀ& ÷I¿~}ááñöi–¿lÙÂF)§ò?iÝÃÃ}ûöa£o¢Òfbb‚Ù³fʦƒƒ¯"8ø*¦œ¹|ù ®_¿.›ž=k&LLLØ0DDDDÄÀ›¨, 05’M¯X¹’Rά\µJö¾Q£Fü9½SFlz߈D"=r˜ QŽý½o/ˆˆˆˆt¯x1ð&""""""bàMDDDDDDD ¼‰ˆˆˆˆˆˆx1ð&"""""""ÞDDDDDDDïŒVþŽwÈ£üyú"c_é\ D¨äT}Z×Dýê®ìq""""""Ò¯ÀûAD"~>x 4ôC»VŽ00Э‹èR©€˜¸Dlþç&†uÈD#?oö:éOàýÛ±P4¨W¶ìñ:K @ªs•´±­ˆ†þuñ÷ÅG ¼‰ˆˆˆˆˆH¿ïñ¯P³®-Ò²ruº¢¦–¶x‘Œ‹çÎ %%¥Üt Ö66ð©VNÎ.ÑDDDDDDå-ð‰ƇB*•ê|e DüêùÃÁÑIçn‰/.©TŠÄ„x„\»#ccØÙÙsT•§ÀÛÐX:®«^Tö£Ï„™™ÒÓRËU'š™™¡VíÚxp÷.š¶hÉQMDDDDDTžo#@J!èCe  Wæ‹ÃÚÆ©©)ÑDDDDDDå2ð ºzèG9‹«<׈ˆˆˆˆè½ ¼ e?•Öý ÏЀÁ)éYàmd ¤R=¹â-bàMDDDDDDúx¿ùËÝÅ hMÍÌ•U†7¯x‘Þ (¹ÕÜÌÌYY™ Ó²²2•®§iå-ð®âUÏŸpd1ð~ÃÐon5—*hU¥iJyhó7ÞR©ãÇO„¯o-Lœ8¡Dyyyû üéã·uåUy"""""¢ràđ{¾§š+zAEš¹……ìýÑ£GÑ aCØØÚ¢FÍšøå—_dË€¹……Üò‰óçχ‡§'ììí1xȤ¦¥)Ý– ²+ÞŠ^^Þ>ðòöwÕj¨S×]»uÇêÕ_ ))IáòË—¯@Ýzu1aÂøBù¨*ƒ¢×Ó'aµ—º•ÓÀû AÉK³´‘£Faþ¼yˆ‹Å¿ÇŽ"88€€Œ×逌×éÿ½³ü_~\ºxÏž…ÃÜÌ óæÍU±-áíßWð€'añøÑ\ºx«W®@ffºv펨¨¨BËÏ3cGR˜²mhò*ÉúDDDDDDToCÞüÂ[ñ?¨HÍŸfnnŽ˜Ø$$& ’G%lúf£Ê<~ýu+Ö~µnîn°²²Ä’¥‹ñ÷ßûU”D€áO5WweÞÜÌ µjÕÂüysп?|µîÿä®´¹f-~€ÚuêaÒä©HOO‡ ¨Z­ jµ¨Z­†lÈÈHŒû?Ô©Wµj×Á𑣘˜(KÏ¿lþrœ>sºtEZµÑ²uü±k¯x½o·‘! € Uü4KÛ±};N?&MšÂ¯vc†Êrʾ$P¦pÚž?ÿÂMšÈÒñÛŽ­pvrR±®|>AÓf`ÆŒihÞ¼¬,-ñúu?h¦b7ïýü|±iÃ×çÎ_Àü‹p¦õqŽZ""""""=¢µ§š+{ YjjŠÂW^ZÞr}ûõÅõë×ðòe®\¹ŒvíÚÊÒ¦Ï˜Ž˜˜rË‹ Dš„л¡HJJÄå˗Чo•WÓôŠwff&îÝ¿•«¾À_íÅøñŸÉÒ>Ћ-Add$ =z„i3fÊÒ­­­.—wVv6LLL`blŒèèh,\¼Dn{ÊÞOŸ1?X,† •"W"áo""""""=£…ßx‹ ‚î~F"¨ŠOýêÖ‡H$‚¹¹9<<*¡YӦؽëwØÙÙÉÖ1|8~ÆŒ5ñ ¨R¥ ÆŽ%K6t|<¸s+°dÑB|ñåZL™: ÎÎN6t(Ž9*WEïÛ´iƒÉS§!** ^Uª`åÊå`|MDDDDDôÞÞ¨¼Å[wo(½2|ûæ ¥ëå_G$aäˆá9b¸ÂeF‰Ñ£FÊÍkÓ¦5Ú´i-·ü'$K¿}ó†Â÷:v@§Ž”–…ˆˆˆˆˆˆÞƒÀÛÐA?®x0p%""""""= ¼ A¤a·ê+ÞDDDDDDD:x‹ô¥² ¼‰ˆˆˆˆˆHßoCý©¬ú?'FDDDDDD¤c·H$қʊD"^ñ&""""""ý ¼õ o""""""Ò»À;;;Ko*|ÿîÝrÝ¡‡ÿÙÏQMDDDD¤G `ck‹jÕkÀÁщ ÂÀ[1k[¤¥¦è|eÁ'""""""•JƒKç΢~£F°­P‘ÂÀ[é×DDDDDôþ±²²BÍÚ¾¸ïš4mÆ)g ØDDDDDDïžm¤$¿bC0ð&"""""¢Ò ‰ •JÙ ¼‰ˆˆˆˆˆˆˆ7o"""""""ÞDDDDDDDTeòçÄöîÙÅ–&""""¢÷^ï~Ø ¼KÏ£ÙÚDDDDDôÞÚúólÞ¥/''›-NDDDDDDïþÆ›ˆˆˆˆˆˆ¨•éoAØâDDDDDDÄÀ[—ïëW¯ IÓ‹sØ{:€ýÁþ öûƒØDDD:xC›W¼yõ\·°?ØÄþ`ûƒˆˆèÝÞÚ¼Õœ·­ëÚy“öûÃÂÒ ¯ÓÙ¸Ü?ØÄþ`1ðÖøÃUGó¢wÓ––Vx­&°f?—MhÒÄãûƒØDDDúx—ÑïGaÑ¢Å8wî^¿~ ???ME¯^½´²m++k¤§§i­.šä—++k€H$‚••¼¼¼Ð¾};Lš4 ïæÄIAä•S‘ôô4¤§§ÉÖSÖ¼¢ÝýCQŸì‹Ò¿íÛ·ÇÞ½A$•êþ¤oýQugŸèîçGY¾°?ôÃûØïDDýsb‚Pò—š¼ž<~ŒÎ» m›Ö¸u31/žcíÚ5ؽ{v¶ŸWmå¥i~ù—ž–Š´Ô<~†o¿Ù„ÌÌL|ðASDDDh·l%èô´TÙ+¯Ì²iMÚ@Ûíü>¼ÔíkúAa_”Òø­X±~øþ‡÷«Ÿ5èRÛ.ûD7??Êúó…ý¡?mÁÏ0¾øz¿Ž}ÄÀ»´¿Õ.éK]^Ë—¯ÀÔ©S0räHT¬X&&&hÔ°!¶oÛ*[&33ã'L„«›;\ÝÜ1aâDdffÊÒ­¬mðÓO›áë[íìÑ´Y3ܺu[–VÖ6°²¶‘­Žþ>‚³‹+ìÑ»wÄÇÇËÒsrr0kÖlT®â÷Jøzýz•ù)ª·¢÷ææ¨[·.¾X½C† ÆÒ%KµÒÎÚêEeÎßÎªÚ ÿ:‰ .D/o8:9cè°aHKK+ÓºêÃK](KËßîVÖ6ذq#jÔ¬ k[‚€£ÇŽ¡q@ *ÚÙÃ×·6¶lÙRäñ»î«¯ðÝ÷ßãáÇJˤn?²²¶Á?þ„Ú~u`gï€Æ¸xñ"¶oߎzþõeûkhh¨NŒâö‡&mÁ>ÑÝÏuûWQ?_ î“:vÂîÝ{ä¶ŸjÕËÕñJ[ýQÔñYcº8ý®lç‹/¾Êǹ1ðÖûÀûô™3èÓ»·Ê<–,]Š˜˜Ü ¹×¥Ë–Émãܹs8vì¢"#Э[7Lœ4 ‚ 5%š’ŒÔ”dÙ:ý|„qã>ÃÓ'Oðäq|ªù`Öì9²ô+VâÞýû8þBïÜÆóçÏUæ§iàÿ5tÈœ:}Zoï¼yÊÚ ÿ:_®Yƒ›8wî,ž<ƒ™™æÏ_À¸–½‚ãëÚÕk8wö,R’_AŒ3sæÌÆ‹çÑ8rä0‚¯^-òøµ±±Áÿýß:Œ=999 ·­n?€S§NáðáCˆŠŒ@ÿþýЧo?=z ìGtT$zõê…‰“&ëÄØ)Ià­®-Ø'ºûù¡nÿ*êçKÁ}rÆôiXµz5rsseˬZµ Ÿ}ö¿ru¼ÒVu|–Ƙ.N¿+ÛÇùâ‹/Þ¤ŸDË—,&Í@vVV±28üÏ~ :i©)J—Ù»g†Œ­rMݾ‚&M[(}Úµ½âãbad¤üçë5jÖÄ¡ƒQµjUÀãÇÑ­{w<¸ÿÍɨmD< GÅŠ™™™p¯ä—I‰²ô¼Je233QÛ¯ž>y ¨UËì‡O¡e5É/ÿ2Ê–‹ÅpquCRbB™ uý¡ªŽêê”^m¿:Ø·÷/T«V ¦ÍšãqØ#îÅEèÛ …楦$ꋇÀÕÕE¶Œ¯omL™2]»uƒ»›[‰Æïü `dh„… ¨]¿à~dc[ÏŸÂÎÎN–îìâZh^þýõ]ŽMúC]Û)k ö‰î~~¨;ÖõóEÑ>ÙºM[Œ÷ú÷ï'Ož [·î¸qã:ÌÍÍËÍñJ[ýQÔñYcº8ý®j'"ýµwÏ.ôî7@izjj NŸ8ŽÎÝz+ÿçÑQ8°æÌ_ÌÆÖ1eúpµœœœRÏ«bÅŠˆ‰‰³³³Òuããàææ&ËÃÍÍ ññ ryZZZʦ !‘HäÒ n?øêU,Y¼·ïÜAFFÆ›o5D"Ùr±qqrÛ,NÛ¨Ú>DGGÃÎÎN«í¬Í¾U´Œº:åÍ‹‰‰AÃFå¿5Ê×¾¤y$&Ä+\6ÿ:ööòãè—_~Æšµ_aÅÊ•°¶¶ÁŠåËбcÇbõÿÌÏ?Gç.]Ѧm4 ”KS·€•••ܾ©h^þýUÆŽªm)KS×ìÝýüPw¬+êç‹¢}rê”)X¼d ºu놥˖cÂÄ 044ÔËcbi÷GQÇgié¢ö»º}œˆˆx+UO5oÙ²þþûoŒ=ZéºŽŽŽˆˆˆ€——àÙ³gppp(të›X»Ì- IDATªmL9r–,^Œ¶mÛÀÚÚéééð®ê#[ÎÙÙÏž=“}+_œ¶QW¾mÛ·£UË–ïä6–¢–_Ó:½m?'>t®®®¥6¦ÊUí¢,MU_øûûË~WyâÄ Lž2wC;«ÿ±iãFŒ9G‘KS·i2Žtqì§?ÔµûD7??ŒŒŒ‘‘!»òüòÕ«"ë4mÏŽ;`ÅÊ•Xºt®^½Š ÿ=7¤<¯Êêó¼¸}PÔ1]ÔmªÛljˆH¿”»ßxϘ>_¯ß€_·nÅËW¯ë7n`øˆ‘²ezõ쉹óæ!!! ˜3wz÷ê¥ñoôlmmöX.=+3¦¦&055EDD‚‚¦É­óÑ€˜5{ž?äädÌ›7_e~šþÆ;##·oܹ߯ó°cÇo˜9ós½û·²6ÈŸ>tèPM›†ððpˆÅbÜ»w£Gáo…Jé7ÞÓÇŒ‹"G,†TúæABÅ¿‚  zõj:d(fÍž-—¦n?R7Žtmì·?4i ö‰n~~Ԯ틛6!##/^¼ÀôéÓ‹Ô^ꎅùçM:7mBPÐT•»ãUY|žkz ,é˜.N¿«ÚÇùâ‹/þÆ›x¿óÀÛËË îÙ“'O" ^ÞU1kÖlôêÕS¶ÌìÙ³àèàˆ€À&lggÌš5SãÈqŸ}†;t€“³‹lÞºuë0ÁBT®â…^½û q@c¹u¦M BµjÕкM4nwww•ù©;)prv³‹+|kûaÒä)011Á‰ãÿ¢R¥Jzx+jƒüé'L@@@úôí‡ÊU¼0öŸ¡K—Î<€—QàÝ©SG 6UªxaÉÒ¥øfÓ¦bß¼×È‘#/—¦n?*Î ñ»;šô‡“³K¡—&mÁ>ÑÍϵkÖâðáèêS ]»uGófÍ‹Ô^ꎅù_ðööÆ€þýËåñª,>ϵx«ÓÅéwUû8_|ñÅÀ›ôO™>\->.¶Ä{ôMš¶(ÓˆûƒýAìö‡®2tz÷ê‰Þ½{³?ˆˆôÄ‘ƒøpµ÷T¹û7½ìö±?ØeC*•â·;Ž=zè}}¸oÞÄþ`ûƒý¡SÜÜ+ÁÃÃß÷D"o"""Þ ¼y"Kìb°?´éÅóèr5¶¸oüpõòöA\l {NG°?ØÄþ`ûƒˆˆH56QéÑÛ[͉ˆˆˆˆˆˆxç³ë·mlm""""""bà]Zî¡![›ˆˆˆˆˆÞ[Þ¸ÀF`à]ºòn3²±ÑO ¥»xTGEÿì""""""bà]ÒÿïØè'˜0a( ei¯3ñÓæ°­Ç߀ïbÉÿ\µœœ,„?{ A€“£+àá?‹”®ïTÅj÷coÅ÷ÛÈ;++¯_gü—DEG¢_ߎÈÎɆ€H$·nNŽGŽœ…­o_ö1ðVxçw÷î3¤¤¼p[aº‹‹üýýTæADDDDDDôÞÞR%AsJÊkìú}Òõ|ÜOmDDTzV «‡Y[n±!ˆˆˆˆt=ðε:77bqŽÜÖ^½J*´NÅŠö±X\(*}"¹! Æ›~¸ò G®Ç@Ó^X=ÜqÉYX·÷Ü:"A½k©‚fþr“ ]FغÇÑÖ ºÂÛÅ ¦Æˆy™‰ÓwâqçY²N•ó}ÖæÆhç•l`caŒ‰‘ ¯qñ^"D§rÀ‘~ÞR©ô¿ÿseónÞ,|bצM;@VV&ïw °¦¼œ-±ö¯û€!m½Ð¨š‚%iœ‡X"EMÜ‹L‘Íó­l‹‰”}ú°?t‡ƒ)Æv®Šã!±Øs>9’\¸ÙY U'ÜÅ*c¶Æ×­®…%á»CaHýöî;¾©ê}àø'馋îÅ*{)”¥ ŒÊF@EôûSFÙ£P@†"Kp#(KDPœˆ²d)ÙCF–Qè¢@-]Išä÷Gihº[°¥ð¼_¯¼hÎ9÷Ü›çÜî“»Ò4X˜™PÝÕš6 ¹™$AB!DEH¼ü­RežžaTïëë[¢>Äϯ¶#ÛOÅ”šuÆÁöS1tiæÁ±Ðâ'Þ{Ïݦ}c7.„?Øimߨ½çnÓ¿£·aLç iÊ–cѼà㊵SVý+ð(ÉxLÎ59Ëò¯üÊœl-èÕÚ‹Z¶˜(\‹¹Ç/ÂIIÏdt:¾Ç™°IfesƾT—y¿_"C­}¢Ç¢SSöž½ÃáKq†²ð;©|¿ûz¾1/hþ8IûÆnØ[›—¤â÷C‘8Ù™ãï뎃9·3øe81‰é5Ñ<EÒ¡‰v•̸˜Á¯ùŸÕÖÌDÉ«m«òLÊdht¾Cžy>Çã¦s3ޅıûìmCY¦6“‹IF?T) ºúyвžæfJ.†'ñÛ?¨4ºB·’Ƽ°m§¨qxÚ·-!„x¬)$’xÿÇÔšÿÑ›˜™¢ViŒêÜÏ·kÖ ÕæÝ!ؽû(ÖÖÖÄ߈]ý—dÔʈ[eKÂbîÆîzÌ=Ü*{eQN]‰§«Ÿ^NV\¿•BmO[*Y˜pêJ<ý;÷UÅÙŠÏÖ_0ìXŠG¯$ã‘ß85^¹Ëuòæ÷"øö¯k˜*tkáIž¬Ý}§nòÊsÕ8q9Îðû7qcÿùÛ$§ªŸø±¨íiÇ"ŠÜžŠ‡Z6,ÜBZF&ížqcH—š\ŠHfñæPCÙ+mªòņK5MÎyz»[óņÒU™tlâΫÏU5œÓ½¹'æ¦Jfÿ˜uÃÌÿµ¯QàçxœÔ«bÇç¿_*r9»øyàédÅg¿]$]­åÕ¶UéêçÉoà Ý6J󶢯áiß¶„â±f.!Äû?–óÖÛkxß«OOz÷êĤ·Gcgg dŽž©ÍD¯½NËž½‡9}ú¶õzʨ• 32Ô™†·tu&æÊެÓéÙ}æþ¾î¬Ü~…›º³ûÌ-t:}žõâCÜKÓHàÿC%üƹ¨ñÊ]öÑ/Á7`ËÑ(f¿Õ½^Ï¥ˆ$T-´4«åÈÉ+ñ¸Ø[R¿Šë†?§¼[[˜r/]Säg-j~ÙwƒÔŒ¬oßÙ[ôléůŒËº7÷|èirþýëþpÒTYmwŸ‰¡‹Ÿ‡¡¾Ym¾ÜbX6ŠÀ§zåÇ~Lm,MINS-ç¢Q- [v€Öõ]øêÏPSTl>Å;¯7bÝ…n%yaÛNQãð´o[B!„$ÞÙ;0c‡äûŸJJaaP(òžƒÑ­«?gÎ_•†2¤Òh17UNK´43A¥Ö•h ôz=ÇBbéÞ‹fµñrªÄŠm— }äìënЉ)‹í°¸ãQT—ßxå.óv·¡÷³U©êl¹™2«ýì § 9Yï²v,$–—ZUaeÂ^jU…ÃcKœxì<ÍÎSÑ%Nij5Qqiøûz°ëß›T²0¥ïó5J•¼™™(Ñh´¨3u8ÚšÓëÙjFíôÀŽ“Ñ îR‡÷„‘™ãG€'ÝÖ㑌¹šL-ÿ^K@¥ÑQŹšy²rûåG:e™xŸ¼ÏËmªñÓž0^iS­Blß‹dRßF(• Ž…Ä’˜¢ÆÌDIM[£å?|›ÿuðfÝ$ÜSáî`E׿^|»óÊ#M¼‹ÚvŠšþiÞ¶„BI¼‡* X´x €áºÒü(•N7×éôT²¶ÃºN7IÎÊÐÁó·p²³`Æÿ=cØá<|á6úRŒ{qêelËn;,ªþÇ=×xË¿ÝZxq7UÍ_§¢iZÛ±ÄÉÛ»¯ñjÛê ³³ànŠš]ÿÞĝޓQ;­NÏ»¹tç©Zn'¦³pãzµ®FŸçªafjBt\*¾ùÈÇ¡,ï-G"ø¿Ž5ù`P324Zöž‰¡a¸Æ;>9ƒy¿Ó½eÞ~µ¶Vf¤«µ„ݺÇâühu2ŠÎ~^õi€½µ9·ÓÙ~"ê¡ã›»¬8ÛNQ}>­Û–Bñ8R|8g¦>hâdT¥ê`ûŸ›ysà`î%üŒÓ ë×q8ÅG¢-„ÈctÏúœ¸ljËqŒ'»ƒ½0}Íi †l[BñÔ{Î&˜—ûö+°>99‰}»wÑ­g¯RõÉ–Í™6ã} öc¦\N5B…Ú6rÃ¥²'.Ç"_OŽ~/xóç±HLMô}¾:g®ÅËÿ²m !„’xKâ-„(k˃ÚŸ¬bŶB/;O\rs6ÅÌTÉÙk l:!ÿȶ%„BHâ]>ØP¢-„0HLLD ŒìRM‚ñÒd¤ 긙2çÿêI@dÛBlÙpQ‚ ‰wÙ˜¿`—¯\ÎSÞ°AC‚ÆMB!„B!‰÷ø|å2Q*M ei©é|³êg !„B!„’x? ju×o„^^¯ÇÕÅ€£†8ŸŸÃ‡Ž”B!„B!‰wQ22T¤¦¦e½ÑCdT}_í‚J­B2ë–¬F‰º†;ÀP0!„B!„’x—È… 7HJJÎå[ïî¯<\ˆÇ…ÁÁÁ¥®âiÜ.„B!‰w¹JJJeÝ/ë ¬ï÷F_%!„DR!„¢ÂR–ÇLµZ-­Vk(KLŒÏóʦÑhd¤Êqç;û%*®!C†ðÓO?•ýøã *×oÈxäïiKºs~ÇÉ÷B!žˆÄ[§ÓÝÿ÷Aâ}æÌ™<¯lé2Rå¸ó-G½*¾ñãdzfÍ233ÈÌÌä»ï¾cüøñ!„Bñ$&Þ*UééY¯l¾¾¾y^BˆG£qãÆÔ«WmÛ¶°uëVêׯOݺu™5k­[·¦uëÖÌž=µZm˜N­V3}útš7oN»víX½zµQ¿EÕGFFHË–-iÖ¬#GŽ$>>^Æ£”ãqðàAúô郯¯/;wæ÷ß/V]QãàããÃÚµkñ÷÷§qãÆ†²’L¿nÝ::w¯/}ûö%$$¤BŽMöçÎ}¦Oq×å²}ûv£²˜˜Ú·oOJJŠ| !„’x—3SÔ* j•&ÇNã~†0`ÐÃë¥Þ=HOOg÷˜˜ðíêodÄ„(¥qãÆ±zõj´Z-«W¯fìØ±,\¸;wî°uëV¶nÝJLL ‹-2L³xñbعs'üñÇŽ3골úÀÀ@ú÷ïÏÁƒ9pàÞÞÞÌ›7O£”ã1mÚ4ÆŒÃñãÇùî»ï8{öl±êŠ3gÏžå·ß~ãüùóy–µ8Ó?~œ~ø#GŽàïïÏìÙ³+ä¸dŸá“ûlŸâ®ËÇgÙ²e†3»–-[Fÿþý±±±‘_!„xJ•ËÍÕvl;Lll¬á}¯>=éÝ«“Þ-u:z¦6½ô:-{öæØñc kR…(:uêP¯^=fΜIƒ ¨S§Û¶mcÍš5899’·€€&Mšd‰ÍYÿî»ïÒ£GCŸEÕoÚ´Éð·……AAAtîÜY£”ãaaaAll,‰‰‰xxx0gΣøTWœq˜:u*ŽŽŽù.kq¦Ÿ1cööö°|ùò'j¼Š».·iÓ†J•*±}ûvzôèAxx8‡bÚ´i²Ò !„’x—­qc‡ ×ë󔧤$vE®çxtëêÏ•+×eÄ„xcÆŒ¡[·n†Sa¨R¥Š¡ÞËË‹„„Ãûøøx¼¼¼Œês*ªþÌ™3,X°€K—.‘žžu¯†ü¶oâÇ—_~É×_ÍW_}…­­-S§N¥}ûöEÖg\\\ \ÎâLŸtXZZ®_R”d]>|8 , k×®,]º”Áƒcii)+¼B!‰wÙÒ£'""4ß:¥2ïÙï:Ž»w“°´!FÕªUþutt$::šjÕªƒƒƒ¡½““SžúœŠªŸ8q"S¦L¡mÛ¶X[[“ššJëÖ­e J9>>>,Y²½^Ï?ÿüÃŒ3Ø·o_‘u;2Ž%‹A‡X¼x1_~ù%gÏžåÃ?”•]!„xÊ•Ë5Þ‰ qØÛ;cgçdxÙÛ;ß/ËùÊ®s%99 +++1!¡®]»òÉ'ŸO||<ü1ݺu3ÔwïÞÏ>ûŒ„„âããùä“OŒ¦/ª^¥Rann޹¹9QQQöºßÇe<&OžÌµk×ÈÌÌD¯×=’±°º‡‡§mmmm¹qãF©c P(1b«W¯fĈ˜™™ÉÊ-„B<åÊüˆ·ŸŸ‹¯@§Óü‹€òÁ)|:‡Ê• "#VÆò{¶­<^ìÉ1~üx>øàºwï@çÎ 2Ô7ŽÙ³gÓ©S'lll4h,výœ9s˜7o&LÀÕÕ•Aƒ±cÇ |)Ç£cÇŽE5Œ~è(¬îaÇáiÇ€€úõëGZZšáû®¤1011¡zõêôêÕKVl!„B øpÎL}ÐÄɨ22JÕÁö?7óæÀÁÜKN*°Í†õëxéå¾m!„O…±cÇÒ­[7Ã(B!À– ëy¹o¿ë“““Ø·{Ýz–î‡Ûè¨H¶lÞÈ´ïK°3¦!„(_¯- KÖP!ÄS“tGÇ¥J0„BñD&Ý É©\<±»TÓ7láN§Ï“$W„~ïÜM๎/%ßežx‡„†8¥ÒÄP––šÎ7«~–5TñT°t©€^¯—`!„≒œNÜÝBNíÁ¿Û+Ô«Z²3ŸC#Ù½ýêûuÀÑΪBö›sŸ¯\oµ:ƒë7Â@¯G¯×ãêâ@¿7 ¾óy«V­x{ÂdY“…Zç3øß QDܹ—oý•+aÄ'¥¢+fNnB&­Z4•À !„â± Òdrj/tê“qI%{z–“õý:rj-^èŽîþŠŠÖ¯£êÕ¤ó€üõýÜòI¼32T¤¦Þ¿¦Q‘Qô}µ *µ JP(r%êvì8 k±â‰QÐÁnSÜÝ‹ÿ}š|9p.Ä£uíFá‘7©_ÛOCy\|"—®\G¥V£×C§v­ù{ÿQ ëïâ*î4¥é»¬•Õ2V„X!²d§rîŽ6hu¥ÛIqu´%ä~_Ùû9­ßÜÊý®æ.Ü ))8—o½»»#¾¾>² Qxyy-(4ñÎÿ[¹}#+z¼Ð,ßö™™™Æ_দ\¾Ê®k’y ‘Ÿ]Žvª %ff¦ØXWÂÝÅ 7'@‘gšSg/Òµeu>þ,+6&*æžî.Ä%ÜÅ\—Â’‰]p¶¯„B½§þʦO_²þ~ñ…VÅZ¦ÜÓd/gÎéók÷8Æ·,–±"ÄBñ€2ÇATNÿÐ}eï3å×ïÖ݇ŠÕOÿ6%ê7gß¹§-¨O;'4¬Áå`ïÞ½,[¶Œ“'ObeeEÇŽ™5kÎÎΜ ÈËË‹ºuë²gÏ£/½^O‡¸r劥.CEäÝôêÕУÓéÑé´$ßKæúõëèõzôèAÕªU#..NN5¢}Þùs3<]ìèÔ¼A¯µâìÕ[ÌÿõM7D©T¢×ƒ‰‰ ?ÿ}µÛÏbnnFOtº¬#æ*.•­ˆ¸ý éî=õW:´m‰^{ÿ9@ý:ÞDDÅž‘A%++êÖªNe{;:´mi4Mvûœ?thÛ2O»¬í\OxÔ-nÞºƒJ¥ÂÂÜOwWªWõ ûè}Qó¸›tk7"IMMCT¶·¥ª§;Žö…Æ1*ú‘1·Q©ÔT²²Ì÷{M¯‡¨›·ˆŽ¹M†J¹¹^®TóòÌ}%a1·ãˆŠ¹EZZ:fffԨꅧ»KžvGOžË÷sDÞ¼ÅÕ°@¹¹)ÎŽ•©U£¦¦&Fñ©WÛ›ˆ¨›dÜÿ,µ¼«’”t[wâQk4X[[Q·f ìílŒ¦kP§&Ñ1¤¥g`anFU/wªxºËF&Dþˆ÷Ã÷›»}Iú]<©c?ßœo’_X¿Eâ­Óéîÿ«5”9s&O»üÈÈH—5¸¬X±‚‘#GÒªU+ÒÓÓY°`£Gfݺuœ ÊÊÊŠ]»vÑ©S'CÙÎ;©T©’§¬¿ É–u:›6oD¯×¡×équsÅÂÒ’øøD.\ºDRR:'g'*YY‘Q¹ æ–ÖT! ѺESÒÒ3øy÷eT-¯¶o@¯çjqàÂMjTóâbÈÚ4rcòk]p©\‰Ä{l;r•}g/Ÿx×pT`ã'¯çé?;IÎn·è·ãõ鈛£ 7cï±|ói3çCŒŽpçì7gyî÷íÚ4çüÅ+tôõäÝ7šàd_‰„ätv»Æî/Ó¸aö:YäüõzЦ'0}@kjxTF\¼ÇŸ‡¯Ÿ¨Ç¡rþÉ÷Å+<ÛÐ)¯wÂÉΊ›q)ü¾ÿ’Q­NŸ#Ž/æ‰c£u L¾/…†ñŒ·#»?OW;’ÓT¬Û}‘°[wŒÚù7÷¦o‡y>—½-Q7oÓÈË’ù#^G¯×s7EʼnK7ùe÷%ê׫ˡc§ ñYúû Þ~µNöVDÇÞãûíçhר•ÍZ`omAÄíd–o:NgÎ_4L÷åºcŒéÕ'ïe°é`(GC®Ð°^mÙÈ„¸/çvþðG¼Éqdºà~³ãü’æüÚÕo§v­ûùfÃô¹o¦S»Ö…öûX$Þ*UééÆw‹óõõ•µô1óóÏñfmmÍŒ3hذ¡¦=z4K—.5J¼—.]ʘ1c>|xŽmTÅôéÓÙ²e ½zõbîܹXXX«>§sçÎÀ¨Q£:t¨ Â}]ÿ£×éÑhÔtéÒ­VK¦V‹N›É¾ƒÿq#{ÛJX™›¢Re IO%)=•¸ë¿R¹Q/*Ù:I`…(D%+K֯Ɏ£×xµ}Ú5­Îú}—15Qò|cwuožS7øzÃI^i߀ÝžA«Óq.Â6Ïõܹ“åÜÖpáí%»hRË•wú·!ð•æ-Ú•ož»ßžkÎÃ'Ú…GÆàßÔ‹·º4fÃþ~ú;˜·º4æ­.Ñëõœºv«Xó×ét,ŸÜ G;+>úîÎ\»Mýª.¼Ñ¹1ó~>ntô8Û͘۴ªïÊž¾ ŽâíÅcbbÂÈÞÆOTˆŠŽ)"Ž·¨âé–§ÿè˜;´¬çȰ^Í8qé&ï» †ôjÁùðb}®–Í£Õjquv pÁvnǧñBÓªŒíÛ¥‚uûÃŒú©]Å‘ ÿ¢¡·3Ó=ÏŒ€çÙyìówÊÆ½Ö‚‰KöMת¡3Vî'33“1¯¶`èKMÑjOs9æ6žî®²‘ AÙ^ãmôÃÜóÆ÷Ø}ðXí‹Ó¯ÿ󭌒ïœI·ÿó­ò]†Çîo3SÔ*ãÓÇÜÏ·kÖ Õjó´ß½û(ÖÖÖ,^²±A²6—“àçç'¨ÀºwïÎ'Ÿ|ÂÉ“'iÞ¼9GŽ!11‘nݺµûôÓO¹uëÿüóz½žñãÇóÙgŸ1cÆŒbÕgÛµMz〠IDATk'NdÞ¼ytéÒE µF›o¹N¯C“©aë¶?Ñétèu:œ\œ‰ˆŠÆÔTI¦&¥R‰R©D«Ó‘‘‘Ž¥™ q1á¸[V–À QÄ6§P˜Ÿœu&£*µšè˜;¼û¿¬ëv_@¥Ñ²ùŸPÞx±ÝŸ­Ãöcåé¯u‹¦=ñoóûéïóÔ­U‹ã—Bps´A¥R¹œ­[4Í÷û!æV,]Þ̺ñ⦃¡Ô­]‹Béý|=º´ªÅ–ÃkþJ¥+ 34™:â’ÒÐét„F%òáw‡ðiX7ßyGݼÃä~/°zëªU¯ X½õ,­}ª%ÐEÅÑÕÅ9Ÿþo1µ_g¾Ùò/^U«aaaÁ_¢Fµ*DÇÜ)òs©5Z¬+UbíöÑh2Ñëuì9uƒ±}[Ò¢'Ë6œ6šç;ÏS·nmN_xØÿôW0uëտ乬#ùN¶dd(Z½õ ^Uª¢PÀš­gyÖ§ ½Ÿ¯Ë¸…»pv’?…Èúž}Ȧf¨º¯ßß…÷[ؼrו¤ßâô—_¿Eâ½cÛabcc ï{õéIï^˜ôöhììlïÿÚ #S›™u½NËž½‡9øÏAI¼ËÉ… ˜={6?þø££S*•Œ9’¥K—²zõj–,Y¨Q£P*•Fí6nÜÈï¿ÿn¸žîܹ¼öÚk†Äº¨z€5kÖ°hÑ"¾ÿþ{9£%ß»€#ÞzÈÔfâïïV›I¦6“ÌÌL.\ %4, ëJY§”gff¢ÑhHIIA£QãÔè¹áÅØæTj5NvV$$§cnf†Z£ÆÉ>ë’›¯§ô0šÎÕ¡*•¦ØÛp¶ø¤tjÕ±@«ÕÝߣX÷c(¨_µFãýå¾›¢¢v%Kî¦d%…Nö•P«ÕÅšO~üë<º>ÂqÑéô„ÝLdíŽóÜMJ6ì‡å¤R?¸¾=önÕ¼-±wSó,cQqÌïó©Õjœ+gMw'1•ª5¬P(T«ê•§}AŸ+)ùJM2³Úâí逥¹©áôQÛJdjŸ ‘”ªÂÌÜÜÐOV\30337­ÊoÌòûü.•³â/ßÁBd13y°_©½‰ñ‰Sg‹5m ¿&˜Üß7U*hîo§ùõ›S~e¹ëJÒï‰Sgó½q[ö5ßÙËZP¿Eâ=nì|Á§¤$vÁèW‡lݺúsõê Y“ËÁ‘#G bÅŠÔ¬YSRÁõë×ùóç³qãF.^¼Èêի󴉋‹£Zµj†÷Ù7ñ*n=dÝ# _¿~’t ÀSÍɺÿ…N§C«Ó¡ÓêÐé´èõz*ÛÛbog‡^¯'!!´”tt™j,ÌLÑ£/°O!DÖújÂnDðZû:ìÿ7G'‰»›†›£5çn2$´9wsï4g{+Í6Yà)ŠfæÜ½—Ž“}%*ÛXš–Ž½µåýd4 sssT*u‘}¹º:³ëT(Ÿ¸NUW[ž©åÆ€nÏ0ñV þdMŸÉ{I™¹¹±wSqw´Á¥r%ÒÒÒï'œÖ¹Ú™Çü–)çt®Ö¤¦¦biaÉÍ[·©ZųX1ºÎÊ©Ýp°µâƒ59}å& ¿}зÀ=ò맨1s©\‰ÔÔt Œ~Œ077—ï`!îSpêv±î>~¿}v.¬Èqê¶¢ˆSÍ KîKÚï©Ï-oe'ß~MŸ)°ßÇ"ñÖ£'""4ߺÜGÞ²ÿ³¼{7 +K+Y“ËØæÍ›™={6«W¯¦I“&'€¹¹9C† !((ˆ)S¦`nnž§³³3‘‘‘Ô¨Q€ˆˆœrœBWT=Àï¿ÿNß¾}±··gÔ¨Qøbîð©Õ*ÌÌÌQ*M0Õš¢5Õ¢Õ™cjjŠ63“¤¤dLMMѨ3IÏÈ %%[Ð#;}Bâܹ xºØòæ‹õèñ\]Î\¹Å¦®R§N-LMLØrè2C_jÊÀîMøfËi@A#oW^éÐ×)UR]œ6&&&¤eh¨di†»£ 'N¥y³gò~/;VfÏ©¼Ö±!½Ÿ¯ÇOófçÆüu< g'G¢oÞ*rþW®ÝàÝþmùù¯s\|ðDu¦¥¢€dÝʼn­‡®0䥦ôðeé'Q*ŒzÙ/W;ç"ãX§¶w>ý»°ùŸP†õjÆÐ—š²dý t@@Ïæü²'´ØßŸÙ×i¦fh°43å•ê{¸0=|ùzãi´:c^iÀ–C—quq–ï`!²ó9…&È…É{-69®Å.¸]QI}iûÍNº›6ilø;ç¼ ë÷±H¼â°·7þ‚Êþ¥Áx9õ÷Ë$''É—ËØŠ+øæ›oøõ×_©S§Žä H```õ½zõbæÌ™,X°€™3gÒ»wïb×xxxðÇðÚk¯‘™™Éرc%ðF;wù•*5#䇃d?([BtvffØÙÙ¢×ëIOOÃÒÂôzLMM ñBäµñ“×ÑhµÜKUu'™E¿ãèÅ;Ô«[…B‰«‹3ÿ‡£Öœ¤û³µù~FÔ-!áqü¶ç®.Î$%ß+Æ6L‰Ûx¸»òËî ¼Þ±˧fžóæmÚ¹±åðu”Jí›Õ ÷óõH¸—ÎOó×ÉHjת‘Oâw~.NŽüy(„·º4¢n5'ÐCHxk¶£fjùOãìÌà˜(ÏÒ³M¾{¯·RY¿÷"Ïæ¸Æ»8q̯W']Œ@¥>A6uX5í%’RTüºç––ÅŠkÍêÕ˜ÿË1†÷jʇÃ;ŸœÎï{/•x|гã£ùhDÜ­ILÉàÛ?ÏðÏ…;Ôò®.ßÁBäÊëÀøò™‚î†~›<ãSdy~ý–{âݪU+-^Sä/ J¥ñ!GÇÉš\†Þÿ}Ú·ooT~ùòe¬­åÑEO²wÞy‡÷Þ{6mÚгgO¦NZìúlnnn¬_¿ž~ýú¡Õj?~¼×°s—ÿ÷ŸÂÂ…EÞÇùèc®¢'ää{˜˜˜ Ñd’qÿˆ·­­(•r´Eˆšù66$° (Pbjf‚¥…%•©_¯&ðà”@ïÕ¸t3Ë÷“‘‘u2ëJ¸8;cggcÔ_3߬;‰ç.Ë™4· À©kqüyh£ázã‚ÚÕ¬Yƒ¿NÅðËîKh4™˜™™âääH­šYI_q—1!ùÿxœ´ÔtP€••%U<=°®T©ÀïïêÕ9~5–­Gw ÑdbanŽ››kžùÇ‚û¯Jèí-ßOz† 33S<Ü\qrrÄÉÑ¡XŸëÞ==o/݃J¥ÆÌÌ77—O~e§Ïœ7,çžS78ƒJ5Wçû?XÈ÷¯†<.G"›}Í´OñžŒ”û:í‚î>þ_÷›³ïÜÓTž»ßrO¼ßž0™·'L–5²ˆŽŽ– CÏÉѱÄýT–­~ý:õ}.Ä“.ûò­„”R?NìNÂ=C_º\×bW”~Ë=ñBQòë±­lœ0oÔ“Ô»·‰»{‹L1ó´ÁÓÑ +G”¦frÄE!Ãïo!ž6-z¼Êß[§Jýg©loS¢éï&¥r„N=^%C£5ls­_I¼…â±Øq+ù4JslªbëTõ‘ô'„¢hÏ4nd8õü™ÆäûVˆ"¤¤ePÉÒÿn¯°{ûD•¢ÿn¯ Rg’–ãyÙ­ßrK¼e-BC¢,{nBQQ4¾M§|w Q<©é*í­éÙçõRM¯Òd’š®ªðýæ¼Yn™ñž¿`—¯\ÎSÞ°AC‚ÆMµT!‰·B!D7å©ï7çÓË<ñ¾|å2Q*M ei©é|³êgY;…O¼ú¶qlÜyP!„Bñ”ìû•Kâ  VgpýFèõèõz\]<1jXÓøùù1|èH9!D…·éÓ×Iˆ“@!„B<Á¢£"Y¹b_ù%Þ*RSÓ²Þè!2*‚¾¯vA¥V¡@™õÀM£D]ÃŽ`¨ žB!„BˆŠ¥Üïj~á ’’RsùÖ»»;âëë##%ÄcÀÇLJàà` „B!„)ñNJJeÝ/ë ¬ï÷F_%!„B!„’x—„V«E£QÝ`-11>O;'4ŒT98xð «V­âܹsXYYñì³Ï2eÊ\]]‹5½µjÕbãÆFwôÓëõôîÝ›°°09zZ†||ŒÏ±µµ¥eË–Lž<™*UªH€„B!„ø(Ëc¦:îþ¿ZCÙ™3gò¼²ed¤ËH•ƒÕ«WóÖ[o±ÿ~þúë/êÖ­Ë„ %{䛕•û÷ï7*Û³g•*U’—ƒàà`‚ƒƒ9þ<þù'µjÕbâĉ!„B!ž´Ä[¥Ê ==ë•Í××7ÏK”¯o¿ý–_|[[[¬­­8p —.]*QƒfÕªUFe«V­bÈ!Fe>>>¬]»7n,Áÿ) œœœ9r$W¯^5”«ÕjfÍšEëÖ­iݺ5³gÏF­VçY/ÚµkGóæÍ™1cFžz!„B!Äcx›˜™¢ViP«œB~ðà~†0`ÐÃë¥Þ=HOOg÷˜˜ðíêodÄÊIzz:k×®¥uëÖ%šîÅ_$!!ÁpÉ'HJJÂßß?OÛ³gÏòÛo¿qþüy xHHH`ÅŠ4iÒÄP¶páBîܹÃÖ­[Ùºu+111,Z´Èhº“'OòǰsçNâââX²d‰S!„BˆB”Ë5Þ;¶&66Öð¾WŸžôîÕ‰IoÆÎÎÈ:=S›‰^z–={sìø1È3ÅÊZöµÁNNN¬]»¶DÓ*•J ĪU«X¼x1ß|ó (•yó™:u*ŽŽŽð2Ëlvvv|ÿý÷†÷Û¶mcÍš589eÝ_aÚ´i0iÒ$C›wÞyÇPÿÎ;ï0xð`9]]!„BˆÇ-ñ7vz½>OyJJaaŒnÄ•­[W®\¹.#V‚ƒƒIIIá‡~`ÆŒ|÷Ýw%š¾wïÞ,]º”mÛ¶ÊâÅ‹ómçââ"Á.ƒ±Ì–œœÌ?þÈÇl¸ !!ÁèFk^^^$$$õáååeôw||¼V!„BˆB”Ë©æzôDD„æy%$ÜB©T¢P(Œ^z½ž»w“°´°”+'666”ê4psssÞzë-¦M›Fÿþý177—€>ììì2dÿþû¯¡ÌÑÑ‘èèhÃûèèhŒ¦ËYóæM9KA!„BˆÇ1ñNLˆÃÞÞ;;'ÃËÞÞù~YÎWv+ÉÉIXYYɈ•¡iÓ¦Fff&qqq,\¸Ðèzà’:t(gΜÉsS5Q~RRRX³f ÞÞÞ†²®]»òÉ'ŸO||<ü1ݺu3šî³Ï>#!!„„>ýôSzôè!ÁB!„¢e~ª¹ŸŸ‹¯@§Óü‹€òÁéæ:‡Ê• ¤­,µoßžI“&†½½=mÛ¶åóÏ?—ÀT`9¯ñ¶²²¢Y³fÌŸ?ßP6~üx>øàºwï@çÎ 2ê£Y³f¼üòˤ¦¦Ò¥KÆŽ+B!„âqJ¼‡Éð¡#%ò@çÎéܹs©§Ïy=qQõEµ¯81¶°°`îܹÌ;·Ð>,B!„¢˜”!„B!„Bo!„ÿO?û O¯*üøãOFå;voSœ]\qrÎz–³‹áïâ*î4¥é»¬•Õ2V„X!„¢dÊìTóÜwFBñh“5…B……ŽŽŽ4hPŸ¾¯¾Jß¾}Q*•ù&Ý¿ý¶ž¿þÚ‰O£FFuï¾û.QQQ¤‘OcÜ=¤Oïބ߸N¯^/ñÁ‡²hÑ¢ÍøðœcMš4áBp0[6ofë¶íyÚÇ‚¬\ù ã‚‚ðôôäìÙ3ìß·‹/–8®ééé>ôQ‘Lï=¾_»–w§MËÓÏÙ3g9xà«WËÅ‹—øßÿþÄ„Ž;Êš5«9Ìè1y¦Û¶}[6oæBðy|}}™öÞ{¬ZµJ6*!„¢Ι©š8UFF©:ØþçfÞ8˜{ÉI¶Ù°~3$×ôáêµ+Y•z011ÁÍÕ•Z…%(¹u ;v`Ý/ëeĄڸ1£X´t ñq´ß‚®Öh4¸{xbnnNÌÍhš6kFDD$'OÇÛÛ›¤¤$jÖªMõêÕ8}êTýå.Ë~|þ†y) âbï:MîåÌ]ÞÄ·)QQQ\ºxWWWnݺE#ŸÆT­Z•3ÿž.öü«×ðF£V³}û6ê7h€…¹y‘±ôókÎðpNŸ:EõêÕ¸ŽŸ_s£e,NóÓÌÏððNž”lÛB!D©”{â””Zè‘ì~oô•QBˆRZ½z5}û>ø.õòò$<<ÂpÔóqäêêÊÍ›7‰‹‹ÃÕÕ•¸¸8£d´¸FŒÎÀ¸xñ"ÿù‡9sæ2|ÄHBC.8M//n„‡m8â›_ÂYÚ8fO™ïïâ2d(·oßæ§Ÿ~¤c‡hµZ¼ªT}$?z~€Èçóç÷„B!ŠV.×xkµZ45Z­ÖP–˜Ÿç•M£ÑÈH•£„„Z´hW w¸¼¼¼èСCžA½^OûöíKÜŸ(½~ýú°lß~û-¯¿þºç ¤V« åÝiÓX¼d íÛ·çí‰$£ÃG0ûý9$%%‘’’®]»éûZ¿ÿ|Ùìì쀬S— óúëYËòÕWËP©T,]úú÷/Ñü ÄÅ‹ñññáù¶mòÜÝ=·aò.š9k $$$0kÖì¼I})ã8jä(Þ›ö±±±$&&2cæÌÿ?šO•JÅÜ>xäc5sÖ,âã?ÿˆ#dB!J¡\Žxgß•V§{xŸ9s&O»üÈÈH—‘*GŸþ9 à“O>)ñ´VVVìÚµ‹N:ÊvîÜI¥J•$°eèÝwßeäÈ‘ôïßSSS233Y¾|9Ë—/—àŸ??ÏõÒ¹M2VǺß~ã«eËpwwçÝwÞaüø ͯÿ·˜ýþNž<‰B¡ e˼?ûýB§1b8™ÚLV¬XIÃF>T¯^ ãƒøóÏ?ó´+M‡ Š••+W®ä™&¾899øX·‚¬Xþ5ï¼;Þ½ûàááAPиG>Vݺv¡{„‡‡ãêêÊÜ9s6l¨ldB!DEI¼Uª ÒÓoææëë+£ñºrå ûöícïÞ½¥J¼GÍÒ¥Kï¥K—2f̆n(óòòböìÙ,_¾œ[·n%Á„š6mJÆ Ù¸q#}ûöeÆ 4jÔ ÄáÇÑh4´iÓ†/¿üÒp]­Z­fêÔ©lÙ²›{à€ 0 Dýå.+M›Ñ£G1:ŸÄ4w;333fΜÁÌ™3j;½ø"^|±D±Q(ŽCà˜1Fåo¼ñF‰ãX·Þz“·Þz³ÔŸ«]»v9lüx±Á%î§°uç7ÞÈ÷3 !„¢äÊåTs3SÔ* jÕƒSÈÜOÀ `x½Ô»éééìÞ}/Y(#VÆæÌ™ÃäÉ“±°°(ÕôÝ»w'..Ž“'OpäÈéÖ­[ž¶§OŸfçÎ’tÿG¦NʲeËÐjµ,[¶Œ)S¦0hÐ † ƹsç8wîµjÕâý÷ üì³ÏˆçèÑ£üý÷ßyž#\T}Qý !„Bñ4(—#Þ;¶&6öÁ/ì½úô¤w¯NLz{4vv¶@Öéè™ÚLôzÐë´ìÙ{˜ƒÿdl`ŒZ9pà ôéÓ§Ô}(•JFŽÉÒ¥KY½z5K–,aÔ¨QF§½f›={6N÷ï¾+½úõëÓ°aCÞ~ûm|||¨_¿>{÷î5Ô[ZZòÎ;ïЪU+CÙ† øý÷ß G¨çÌ™ÃóÏ?_ìú¢úB!„Bïÿȸ±Cò½ójJJaaPäzŽ7@·®þ\½zCF¬ ½ÿþû|üñÇùŽGIôë×ùóç³qãF.^¼˜ç&_ÙÜÜÜ$èÿ±I“&ñÜsÏqøðaNž<ɇ~Hpp0iiiFãKÕ<ªV­šQEÕÕ¿âñSÒË„Bñ˜&ÞzôDD„æ[—ß‘PNÇÝ»IXYZɈ•¡^~ùe£²Ò<£ÙÜÜœ!C†Ä”)S077—à–“êÕ«ý;bÄfÍšE‡°±±!%%…úõëÚ»¸¸Iû<ŠŒŒ4ꯨú¢úB!„BïÿHbBööÎFG½³‚×ß/Sœœ$wÂ.c¹ìÒ$ÝÙ ” >f222°°°À‚ˆˆˆ<7ÐëÓ§³gÏfþüùèõzfæzäQQõEõ/„B!„$ÞÿV­Z±hñt:}í”ʧ£êtz '#&Ä#4þ|Þÿ}† †»»;#GŽdóæÍ†ú)S¦0eÊZ¶l‰ #GŽdÏž=Å®/ª!„B!žŠçÌÔMœŒ*#£Tlÿs3o̽ä¤ÛlX¿Žƒ‡I´…O½qcF±hé2âã$B!„O°è¨HV®XÁ¢¥ËÊçqbB!„B!ÄÓBo!„B!„â?Tf×x'&&J´…B!„BHâý_›¿`—¯\ÎSÞ°AC‚ÆMB!„B!‰÷ø|å2Q*M ei©é|³êg !„"—/¾ø’S§OóÃÚïŸøÏúæ[ýiÑ¢9ヂdà…BHâý°Ôê ®ß½½^«‹#F|çs???†)#&„åÀÉÙ€ø¸ØGÒNOZZ_ý5;vl*>ïœ÷gÓ½{FŽ¥¥¥¬B!$ñ~*RSÓ²Þè!2*‚¾¯vA¥V¡@ E®D]ÃŽ`¨ ˜BüˆC‡‘ššJÆ 7Ž^½^zdqz”±xØþþüóOZ?û,ÞÞÞe¶ž”çç¯U«Í[´`Ûöí¼òò˲á !„ÄûQ¹páII©À¹|ëÝÝñõõ‘‘Bˆ‡3ù©¨G¥ÃÂÂèÕ»“'Oâ‹ó±¶±!øüy/YòÈïÇÍŽ;éÑ£ûSµ®¾ürvlß!‰·Bˆ'J¹?N,))•u¿¬/ðuëV‚Œ’BüǾþz9NÎ.¸¸ºÑ a#&L˜È½,ïÙž IDAT{÷ò´ûõ×_y®M[<<½hâÛ”åËWÚ¯^¯ç«¯–Ѽy Ü=üð#nÅÜâä‰ãœ8~Œ¨è(>úèc£6‡bû¶­„]»J=˜0a"ðà €ø¸X£³þïÿÞdäÈ\ !$äµk×fúô~øì3BBBÙ·w/ÿž>ÅÍ›7 íoô˜Ñ¼3u*áá7øsËfNž:Yàç¹}ûînnÆ?@0¿'åó{yzsë–l”B!ž(ŠçÌÔMœŒ*#£Tlÿs3o̽ä¤ÛlX¿Ž—^î dÝ@íÿëÁÕkY;qü ë~YÏÞ½»óLסƒ?ýÞèK›6¾:t†åËVʈ•q¢|ÿHˆñƬéÓX´t ñqå¶ Ej®ÕjqusÇÉɑˡ¡FÓœ>uŠêÕ«YGBýüšã]£'OžÈ·ï¦ÍšÉÉÇñöö&))‰šµjS½z5NŸ:U¢åvs÷ :*SÓ‚¯’jäÓ˜-›7Q³fM®]»Fï>/|þœaù®^¹Œƒƒƒá‡Þ5¹}+ÆP_Ô)øéééøú6%44€ÆÏ4aã†?¨U«V¾±ÎÝß3M|76îÝ»ãééYè¼<½ª~ã:fff†²Âæ÷$|~FC ïšDGEʆBˆ -:*’•+V°hé²ò9â­RežžõÊæëë›ç%„øoDFFHË–-iÖ¬#GŽ$>>Þ(I_·n;wÆ××—¾}ûb”˜}ùå—¼ð øùù1iÒ$RSS%°Ô‘£GéÙó%ª×ðÆÙÅW7wó´­RÅëÁß^YGEGØ÷Í›Y ]ó-qrv¡f­Ú÷×Á¨/§ƒƒƒÑzšŸØØXªW¯nx_½zubccóô“ÍÊÊŠÌÌÌBû<~ü=zö¤jµê89»P¥j5â\uûöm£yå»5«Ù»wíÚwÀϯ9;vî,°­»»›!†Å™ß“ðù£oÞÌs”_!„¨èÊ%ñ613E­Ò V=8…üàÁý `À †×K½{žžÎîÝG111áÛÕßȈ•±6mÚàëëK=X¹r¥Ñå¢â ¤ÿþ.–Ø;·K¼œí^xM›6ÚÆÅÅ…ˆˆÃûððpœ*>ƒ‡ aè¡\>O\ìn\3Š››áááÅî¯iÓ¦üøã\ á“O?1œê__ß<§b6¿'áóŸü`sç¼Ã¬Y“˜9sÓßO“&8vü˜ŒX æÐ¡Cœ:uŠ/¾ø‚#GŽ0þ| Ì`Ó¦M´jÕ lll âðáÃFmf̘««+VVVñþã?xï½÷pssÃÚÚš &°k×. l•ýƒš*•й|P`Û™³fŸ@BB³feý3bĈÛžU7ûý9$%%‘’’®]»éûZ¿B—)¿›«M:…/.ä»ï¿'11•ZÍéÓ§`hóòË}˜6í=ââ∋‹ãÝiÓxå•âßÛÞÞž«W¯•edd`ii…¥%áL˜hœ(¾ñÆëL}ç]nÞ¼IRRïMŸ^hÆ '44Fƒ^¯G«-øˆs×.]ظqS±ç÷$|þM›6Ó¥kÙ0…BHâý°Æœ÷§½üü𙄅]àúõ‹„‡‡u•›ÑW‰‰¹N·®þØÚÚʈ•êÖ­ËgŸ}Ɔ $ O€3gÎ0`ÀZ´hÍ›7'111Ïx6KKK£ÓQïܹCÏž= 7Ýk×® ò‚ŠjÅò¯©[·.½{÷¡MÛçó½V7[·®]èÞ£ ùðï¿ÿ2wΆ Zpâ=b8 ÌçüùsÔoПÆÏ°ò›•Œ=ªÄËY³fM6nøƒÝ»÷à×¼5jx3eê;¼òò+†6Óß{Wüš·À¯y ÜÝÝy/Ÿ›Ä$pÌ:ú¿h”ô/Zø%Ó§Ï jÕjôî݇V-[M3eòdêÖ­Ã íÚÓ̯9U¼ªÚ_·îÝ0pU«Uçý÷çðõ²¯ \ž—^z‰ãÇŽqýúõbͯ¢þ°°0Ž?NÏ=dÃBñD)—›«M›DDxh±ç¡Óépp¨Âºu[ø`îG2jå$>>ž=zpôèQ F”óæj;vdÊ”)´mÛkkkRSSiݺµ¡>¿±å,{ñÅùé§Ÿpuu•À–Ðãps5Q±|ùå—œÿüs ®Øøñ㟚Ïú4ü¸ „âéT扷ŸŸ‹¯@§ÓØN©TþÖéô8T®L@À±2Ô©S'¦NJXXŽŽŽtéÒå©Ú|’Í™3‡yóæ1aÂ\]]4h;vì(öôC‡eÕªU 2„;wîàíí]èu¾B!„BHâ]††Éð¡#%ò@çÎéܹ³â ––ftƈ¿¿?þþþFmÞ|óMÃßù=ï;g™R©dذa 6L‚+„B!D”!žlZ­–ßÿ† J0„B!„(¦!žlM›6¥fÍš|ô‘ܘP!„Bˆ':ñvppøöî<.ªzýø‡MF\XDGQ½d©´&enˆt 4—VISATQ‘UEKôÊoù«®æ•¢©×P£RTr7S¶B6EY˜å÷‡1zfS–áó~½æåÌùžõy¾g<gF›¨äää0DDDDDm¡ð®²|)._¹\gxÿçûcÙÒå̱ðþ;._¹ Ÿ©ÐÕÕS«(¯Äæÿlc6ˆˆˆˆˆˆˆ…÷“P]-Á›¿  ,-º&¿3±Áiœœœ°À?€#""""""ÞêH$U(/¯¸ÿAääfcâWTUWAº€ŽÎ#…z øÙ"""""""ÞuáÂM”––Ȭ·Ýʪ žg¦ˆˆˆˆˆˆˆ…÷ã(--ÇÎí»lWuù9QK§Û •Éd¨©©†L&S»}»¸Î«VMM 3ÕL.^¼ˆ÷Þ{}úôÁ‹/¾ˆíÛ·3(­”X,fˆˆˆˆˆÚJá-—Ëÿú÷Aá}öìÙ:¯ZI%3Õ ~ÿýwxzzâƒ>@ff&RRRðóÏ?30DDDDDDÐ,—šWUIPY) spp`6Z˜¸¸8ÌŸ?o¼ñ€ûgL׬YÃÀhªª*,]º)))wwwDDDÀÐÐÁ!""""Ò†Â[Ï@ÕUÂËÇÓÒŽá³-[—Ÿ×:|8:t@üúO1×ÇYk"'NœÀ?þñ¼ð ¸wïFŽ‰ØØXtìØ‘ÁiåV®\‰üü|?~ …óæÍCll,–-[Æà´1ßìÛà Q«4Öc¼àsÖÍ›8}ú U×£zzèbf†—^| ½z÷ÖÞÂûÀw'Áp7î.X¸`6LMMÜ¿]*“B¡rŽ=‰´ãi,¼›PII ²³³qôèQ@hh(‚‚‚°qãF§•Û»w/¾þúk˜››"""0iÒ$ÞmÔ‡^3"""jU¾ø,Qðù?ÿÀ?žÀ(—1°îÕ zzzPÈåP(P@iôþ{…2© 7oÞÀÉÇa`ØÝ»u×ÎÂÛwîGP(u†—••â÷ß/@ç‘ßñ·1#ñÛo7ÙÚ‘‘–-[¦<à GGGF ÁÚÚZùÙÚÚEEE LV]]Å Q«•úÝw>b$lžyr¹2©r¹r¹ …UUU>Ëå°´´„ R¿ûÓ>š®…· dg_©·MW·îóÞär9îÜ)E{Q{ö¨&ôì³ÏÖVßE¨õ177GNNzÿuiMvv6ÌÌÌ""""j•j¤Rô{¾£¦é÷ÜsÈüõ×&Y¿f)¼o—¡cGsÁYïÚ‚Nx"\ñ×0ܽ[ ###ö¨&ôöÛo#<<!!!îŸñ5j£ÜÝÝ¢|X^HH<<<˜6¬¾«ˆˆˆˆZÓ±L»víê}fXCôôô›ì¨É o'''¬‹ßËÞH]ÝgVårºtî _ö¨&ôÎ;ï 77¯¾ú**++1bĬZµŠÑAAAX²d œcÇŽÅ¢E‹Þ¤åNÿòy 55Õ sÊíå¶µê}ESr¹Û¶mÃøñãšu½›¼ð^à€þì1­ÄÂ… ±páB¢•+//\1"‰‡¸¸8‡j+oÆ€ù&æ”ÛËm#Ò*r¹>sçâË/¿Äiiˆ[Ý|'õ™"í&“ɰmÛ6ôïߟÁ Çy<Ðc¾‰9åörÛˆ´«èžãビ'OÂ×w.RR¾Á‚ ±jU,šã©U,¼‰´\ï޽ѧO|úé§ 5| Ç0ßjtè`Œòò2ûp›ØÞæìï -Ù¢ææããƒÌÌL=r:u„ÏLœ8‹°*v¥öÞ·oßfö‰šAff&÷CR WÏccŒ5 {öì®ó‹ÆÆ&(+»ÇÀiY¾RVvee÷”Ó1ÿÚ‘SmÛ^u}³1ýöáþÞ’¶­–©©)Fމµk×ÀÜܼEn‡&ÍÉ… àá1¾¾sáëËg;ÑßãêꊈˆtìØ …;wBRÒN?~¼YÖ§ÉÏxÇ­Y…«×®ÖÞïÙ~ðóõg!"jž#½zwîÜ ›þ½ 3g~¬ñ4Ô:ó]vïaSÁçzsÍük_Nµà;ëoµµ‚m«Íaaa!Ãw®/¶ný¯Väò§Ÿƻヌ˜èhLž<‰ß1ô·yxx(·»V§NðÆo@ñа¦¢ÛÔ ¼zí*||¦Â××KùšþÑ»¸xé"{Q³÷(ê¼`íš5Hø÷¿qåÊ•:mµï+++1Çg.ºu£[w1|æÎEee¥²ÝØÄ‰‰›ñÜóýÑÅ̃pòäI|õÕWèð:w1Ãggœ?¾ÞõàëɽT廡ü>œÇÚk ¹ÚaµÃãׯÇ?ìíabÚ …R©!Ë—£·Í3°°ìŠ©žž¸wïsÑŒ9í:II»mÙ99°ëÓ¥¥¥061ÅÚµkaóŒ-,-»b–÷lH$å¸ÍSuÛ«i›±‰)6oþúõ{Nùtî\fþ®P( ‘H0s–7,-»â[;|òÉ'uú~CûKcbÖ˜m377GìÊ•øþða•ûà£ëÙØïâ7n`Òä·ÑÕªÌÌ-0~ü[(((hp™êúWCÛtøÈ¼÷ÞûØœ˜ˆI“&ª›ªåð{¡í|ïµ6ºÍ±Ðêj .]þ—.eââÅs¨¨¸‰ÉLï ¾6mNà‘1QÞ¦¦¦øä“µ˜>ãcTWW×{?ÿügÏdàLÆiäää""2R0îÑ£G±ÿwÈÉΤIñÖ„‰HM=ˆ””däædcܸq˜ëëÇŠ\x×»[zp·ôî–Þ´ŸúåÒ~ø¥wnC¡P`ÕêÕ8sæ,ÒÒ~Àõß®A$aÙ²æ¢s°pbV®„L&S¶ÅÄÄÀÛ{LLî_Ê|üÄI¤ÿx¿þš‰‚‚DFE)Çmîœ>©ÂÒÒÒpðàAädgaìØ±˜ëë[︑‘(**¯¿fâä‰ãøß±êÌKÕ²4Yc·íÑñëÛmoìwñ¤Éocöloü~ý:®ÿv v}ì´8¸Áeªë_õmÓÞ}û0göìJÚ‰aÃ^×(nª–Ãï…¶]x·ä¼Y o‰¤ åå(¯¨DE…9¹Ù˜8Áo¾9 îoŽ€»ûHÁk̘¡8}ú4Œ‰ˆšÁk¯¾Š¡C_ÊÑõ¶ïÚµ +c¢aaaKKK¬Š]‰]»v ÆY·îSô‹Ñ¾}{Ì™=eeeX»v`Ø™3gìVnÅŠ‚ûM¿øâK¬^ q÷î066FXh(’SR¨f4räHtèÐ_ý5àúõë8üýaÌš9S9Níþlaa•1ÑHÚ™¤•9]³&Ý»wƒ‘‘ü|}ÏDyXRR’à;.veL£–ó4bVTT„ Å‹1|ø0•ûà£û]üóOéx}èP´o/‚©©)B—/Ç‘#G\¦&ýëQÓ¦y!fe ¨qÜg9DÍ­ÙŸj~áÂM”––¨ÿËÎʪ žg¦ˆZ‘çŸçÏŸouón˪««U_·7þ‰á#†c°““ ­  Ý»wW~îÞ½; ó466V~ÖÓÓ«w˜T*mp=¨iò­nœ‡‡Õ×nfÖE0üÏ?ÿÄK/Œ£££Ã<7sNýçÍCXx8ÆŽ‹ˆÈ(øÌõžžž²½[·n‚÷· ”Ÿ[JNZž®®.*++•ß3µd2tuuÓuèÐAåwPíû[· 1éÞ½»FûÃãÆLU,M;v˜˜˜`Øë¯cõªU‚ñÝ_c¿‹þ儇…#ó×_QQQQïº?ºLuýëQqq«1w®/:ššâ•W^Ñøû£±Ë¡¶!6f ––cçö] ¶O~g"{ÑSÖÐ¥YµÃ °aýzx}ä…ÔmÈÊÊ‚ àæÍ›077¯s)¤&Ëäï×6o¾“Mò×µ«%ö÷ºuëÆ<· œººŽÆŠèhDDDâ—_~Aüºu‚éÞŸ³³³aaa¡lo)9mhyâîÝqéÒ%<÷Üs‚á.\€X,nT®}oii)ˆIVV– ]__hß¾= ä¯_yܘ©ŠeaÁ­¿µ_6ö»ø£¦#<, #F ‡‰‰ ÊÊÊðŒ­Êyªë_zïÝwÑ¥sLùp*â׭Ø1®Å­±Ë!í'îf…þ ]»:|Så—ŸÒ›dýšåRs™L†ššjÈd2å°Û·‹ë¼jÕÔÔ°'5ƒçŸ¾ÎkðàÁ L+÷ùçŸcàÀøüóÏ Ȩ»Ÿ°oß>˜úáT-^,hçá%K—¢°°………^²ãÇÓøþGMîÍä«åÜã­P(бcG\»ö›Úi¦NŠù àÆ¨©©ÁÅ‹1cÆÇÌE3çüýçaý† ˜?ßú‚¶eËBPTT„¢¢",]º o½5¾ÅäTÝöN:~óæáÔ©S¨ªªBUU~ùåøÍó‡×´i÷ñ‡ß?^“ÂÂB,YºTÐþÜsý°~ÃTTTà?þÀÂ… íšÆLݶ©Ësc¶IÓa’ÊJ¶ƒ¡¡!²²²0þæÙPÿjhY®®£ñÅÿý|ýü°mÛvâÖ˜åðŇ«µÍrÆ»ö‘îrùƒÂûìÙ³uÆ>|$@"©äQq3xôrÞ/¿ü·nÝb`Z1¹\Ž;v 00_}õ¦N ]]]†4>óòÑG^x÷½÷m‹añâ`8:ÝÿÜû›o"(hÏx·Â|kšŸÙÞÞp=åå帕ÿgƒÓÌõñAüúõxkÂDܺu ¶¶¶˜ï?yn9ÕÕÕÅ3Ï<ƒÉ“&Õ™ÖÑɯ }åååpóM, TŽÓRrÚÐò||æ ½Q{Ì_°ׯ_ØÚÚâç( oM¿ƒjß- Ä€¼ðâK066ÆìÙÞøþûÃÊö¸ÕqðŸï5kÖÂÊÊ s}|’òÍcÇLU,çÁRç»xíÚµX²Ó¼>‚••fÏöÆÞ}ûÔÎSUÿjhYNNŽØýõ.¼ûÞû(*.Ò(nYQ›,¼«ª$¨¬”†9880-XMM þûßÿâ‹/¾`0Z±ãÇÃÔÔï¿ÿ>RRRpâÄ ¼öÚkÊöœœ¬\¹?ÿü3¤R)333÷¯‚X´h¶lÙ‚‚‚üú믨®®Fxx88€:ÀÓÓPZZбcÇâÛo¿…©©©r¥¥¥pwwGJJ JKK½¼‡]¸psçÎÅ´iÓ0eÊ&ø {¸ ª¥££ƒíÛ¶ †‰D"¬]»k×®Ñx>𣖓û‡‡Í›ç‡yóüÔN£«« ?__øùú2¨-,§II»°úúu}æÌÏœ9õΧ¥çTGGÓ?úÓ?úèoõñ‡ß"~Ý:į[§¡|ß¿ÿóøþÐ!Á¼<=§>ñ˜©ûŽlÌ6i:ÌÍm ÜÜÆÚŽmC뤪©Z~¿~ýpî샇»©‹›¦Ë!j³…·ž>ª«„—§¥Ãg[¶.?¯uøp::tè€Ï>ß ¯iÓ™µfœœŒAƒÁÒÒ’ÁhŶmÛ†wß}ðÎ;ï`ëÖ­‚ÂÛÇÇÁÁÁˆ‹‹CMM 6lØ€U«V!&æÁ\Ï;‡¤¤$téÒ’’¤¦¦–,YèØ±#\\\””„úO:)) ÿüç?ajjŠ)S¦4zyµŽ;†eË–!44#FŒ`rÿ&ž)`¾©mäT.—cë¶m¸qãÜÝÝ[í•'-aŸÖ:´æýS“þÕš–CÔê ïßDaa¡ò³û¸±ðpwÁ³ajj¢Ü¡¤2) @!—áÈÑ“øéçŸXx7Ó—ègŸ}†øøx£ËÉÉÁ… ðé§ŸÞxã ¬Y³¹¹¹èÑ£`ß¾}Êñ áçç‡Ñ£G æ³hÑ"Aüí·ßbË–-ʳԋ/Æ?ÿùOÀ”)SðñÇcêÔ©Ð×ׇT*ERR¶lÙòØË«ý¦M›ð¯ý Ï?Ï_=`!FÌ7išÓîâèÙ³'þÞ,¼Ÿ(MúWkZQ«/¼}ç~TïRVVŠß¿:mncFâÚµÌX38xð lllðÌ3Ï0­ØŽ;PRR‚_|±Îð î?,åìÙ³X³f .]º„ÊÊûÏVxt´°°|...†X,V~~ø½ ìììðý÷ßc̘18tè”O(}œåÀ_|qãÆ±èæ1ßÔÈœþ‘—«rš?òrYxkGÞï_­m9D­¾ðV@ìì+õ¶Õ÷ '¹\Ž;wJ!21cÍ`óæÍÊˇ©uª®®Frr2RSS…qnn.Þ{ï=Ì;íÚµÃüùóˆW_}:t@yy¹Ú'Ù›™™!//ÖÖÖ€¼¼ÀÀ5“/>k]·²ð&"""¢6ï𡃈ŠYCCCµãJ$,_º˜Eûûµ¼Â»sçÎŒ6µ(< ÿ  a|˜Ó¶²¿Èd2 .‰DÉdìhì µ¼Â»VÈò¥¸|åráýŸïeK—3#DDDMìáb¥ÙI IDATŠŒ`N‰ˆèÉkòŸ»|å2||¦Â××KùšþÑ»øõü¯ÌQ ‘••OOOôíÛ666øàƒPTôàpÕÕÕð÷÷‡°qãFÁôêÚÅb1ñòË/£GîŸiˆŽŽÆ€`kk ooo”••)§9räFŒ^½zÁÉÉ [·nÕ¨­!µgÅb±àì`UU`oo{{{¢ªª ÀýŸÇ»råŠrܤ¤$åû+W®`È!Êy~ùå—prrB¯^½0zôh\¸p¡ÕõÆBû¨ÚÏ‚‚‚°cÇÁøÛ·oGPPPƒû‹ºý–ˆˆš©ð¾@&Á¥Ë¿âÒ¥L\¼x÷“ß™Øà+ní*f‹ˆ¨‰xzzbÆŒÈÌÌDff&lmm¦lEqq1ÒÓÓqèÐ!œ8qB0½ºvÈÈÈ@jj*rssñññÈÌÌDjj*Î;‘H„¨¨(åø~~~X°`®]»†Ý»w###C£¶†ÔžÌËËœ \¹r%òóóqüøq¤¥¥!//±±±€aÆ᧟~üùçŸXºt©²ÈHOOÇðáÕó9yò$öíÛ‡K—.ÁÍÍ ­®0ÚGÕ~;w"%%œœŒ¤¤$DFF6¸¿¨Ûo‰ˆ¨ o‰¤ åå(¯¨DE…9¹Ù˜8Áo¾9 îoŽ€»ûHÁk̘¡Êÿ܉ˆèé;zô(œ!‰`bb‚   ;vLÙ¾gÏ„‡‡ÃÜÜL¯®BCCaff¦ü¼mÛ6DFF¢[·n066Fpp0öïðtY‘H„‚‚C,cõêÕµ5ÖÞ½{ë½{÷*‹Íü°{÷n"99ðã?bذaÊùDGGÃÊÊ FFF˜5kΟ?ßêúc¡}TígHHHÀŠ+èèh$$$@__ÿ±æGDDÍ\x?ìÂ…›HKËÄ®¯S‘’ò?$§AròaåëçŸÏ0KDDMìÔ©S?~<úôé±X ;;;”””(Û Ñ³gOågkkkÁôêÚ k×®‚Ïùùù:t¨òRVÁå퉉‰8vì\\\0dÈ:tH£¶Æ***¬¯µµµr=œqúôie±¹víZ她pvvVNשS'åûöíÛC*•¶º~ÀXhuû™……&L˜€õë×ÃÓÓk~DDt_³ÿœXii9vnßÕ`ûäw&2KDDMlæÌ™X¾|9†ccc”••ÁÞÞ^ppž““ƒÞ½{rrrÓ«k¯¥¥%RRR`eeUo»ƒƒ¶lÙ…B£GbÁ‚8sæŒÚ¶Æ277¬{vv¶òÌ|‡`mm””ˆD"Œ9kÖ¬Ajj*zõê###­êŒ…öQ·Ÿ]¼xÛ·oÇæÍ›±téR¸ºº*óÿ8ó#"¢ûšåŒ·L&CMMµàü·o×yÕª©©a¦ˆˆšD"¡¡! ‘]çžÜqãÆ!44ÅÅÅ(**BHHH£Úë3eÊ ++ R©—/_†···²}öìÙ¸zõ*¤R) …଩ª6ULMMqýúuÁ0www„„„ ¨¨H¹îÊöáÇ#44&L¼õÖ[X²d‰àžfmÁXhUûYEEæÎ‹õë×ÃÍÍ 111˜9s&$Iƒû‹ºý–ˆˆš±ð–Ëåýû ð>{öl׃ÀJfŠˆ¨ ÅÅÅ!,, vvv˜4i $h DÇŽáè舑#G*Ÿ`­i{}|||àèèˆÉ“'ÃÖÖsæÌ›››²ÝÕÕÓ§O‡¢¢¢¯Q›*ÞÞÞpss<¥9((pvv†³³3ºvíŠE‹)Û‡ †¢¢"eêááÂÂBÁ=ÍÚ‚±Ð>ªö³Å‹ÃËË ƒ¸¸¸`âĉnpQ·ßÑ}:Qá! ¿ù¨ú믙µÿ›d¼?Õ ÷î–68Ξ];ñ¡× ÷/ë­‘¸zí*àü¯9ع}—à w­ÎÍ0ù‰pvvÀ‰gU^’NDÔøÎñƺ QRÜ2îüfßå÷3Q[¶h¡?Â"£!‰ÔŽ+‘Hº,1«Ö0pì \3ùâ³DŒõ/8¦é?` ÚµƒžžžÆóùå§tÁ|ž¤¼Ü$nÚ„u66Ï=Þzú¨®^>ž–v ŸmÙ"¸ü¼ÖáÃéèСâ×й>~ìeDDDDôDrqEè²`nUÑ××Ç(W}€A#5Ká}໓(,,T~v7î.X¸`6LMMÜ¿]*“B¡rŽ=‰´ãi,¼‰ˆHc_û¨‡‹˜ˆÈÅu \\Ç0ì iOáí;÷#(Š:ÃËÊJñûï ££S§ÍmÌHüöÛMfŒˆˆ4ÆâšˆˆˆÚlá­€ÙÙWêmÓÕ­û¼7¹\Ž;wJÑ^Ôž#""""""ÞêÜ.)Bǎ悳޵g¹…' ÓÁÝ»¥üMP""""""bá­Ž““ÖÅoÈåŠÇÓÕ}p¹¹\®@—ÎáããËŒ oUø`#ODDDDDDm‚.C@DDDDDDÄ›ˆˆˆˆˆˆˆ…7±ð&""""""j2ú = b±yyyÝNDÔœ¦îÇÁû5WOO£\\áâ:†c`àˆ…7‘&:ˆ¨˜U044T;®D"Áò¥‹Yt±°Æx©9Q=Äbq“LÓRÜ»wË—/ÇàÁƒÑ«W/ôë×^^^8~üx›Ikï¿ ½šrŸhMd2™FˆD"Èd2v4ö4Æ3ÞDDD„Y³f¡W¯^عs'Äb1îܹƒ“'Oâ“O>Á«¯¾Êµ2ßÖÁÛ<ˆˆšÏxQYYYðôôDß¾}accƒ>øEEEÊöêêjøûûÃÎÎظq£`zuíb±‰‰‰xùå—Ñ£G÷Ï4DGGcÀ€°µµ…··7ÊÊÊ”Ó9r#FŒ@¯^½àää„­[·jÔ¦JCÓÕžÙ{ô ¡ª¸44ºíj)Nœ8%K–ÀÚÚzzz033Ûo¾‰]»vµÙ˜h#U± ÂŽ;ãoß¾AAAÌ% o""zÒ<==1cÆ dff"33¶¶¶ S¶ÇÆÆ¢¸¸ééé8tèNœ8!˜^];ddd 55¹¹¹€øøxdff"55ç΃H$BTT”r|???,X°×®]ÃîÝ»‘‘‘¡Q›* MW{v0//Op¦PU\šFÝvµƒ B`` NŸ> ‰DR§½-ÆD©Š}DDvî܉””@rr2’’’É\±ð&"¢'íèÑ£pvv†H$‚‰‰ ‚‚‚pìØ1eûž={sssXXX <<\0½ºv …™™™òó¶mÛ‰nݺÁØØÁÁÁØ¿ÿÁÓeE" P\\ ±XŒÕ«WkÔ¦Jc§S—ú¨Û®–â?ÿùzô耀ôë×ŽŽŽX¾|9JKKÛlL´‘ªØ !!+V¬@tt4¢££‘}}}æ’ˆˆ…7=i§NÂøñãѧOˆÅbØÙÙ¡¤¤DÙ^XXˆž={*?[[[ ¦W×]»v|ÎÏÏÇСC•—²:88.oOLLıcÇàââ‚!C†àСCµ©ÒØéÔÅ¥>ê¶«¥055ÅâÅ‹qäÈ\¿~[·nEEEfΜÙfc¢ÔÅÞÂÂ&LÀúõëáéé æ’ˆè àÃÕˆˆ¨Ž™3gbùòå>|8ŒQVV{{{ÁÁyNNz÷î ÈÉÉL¯®½>–––HII••U½íزe  Ž=Š àÌ™3jÛTiìtêâò8ÛÕéèèÀÎÎáááxöÙgÿV_Ñ–˜h u±¿xñ"¶oߎ͛7céÒ¥puuUîÇÌ%Ñãão""ªC"‘ÀÐІ††ÈÎÎF``  }ܸq Eqq1ŠŠŠÒ¨öúL™2ÈÊÊ‚T*ÅåË—áíí­lŸ={6®^½ ©T …B©TªQ›*ª¦355Åõë×—ú¦Q·]-Åĉ‘’’‚ÂÂBÈd2üñÇX±b^zé¥6m¤*ö˜;w.Ö¯_777ÄÄÄ`æÌ™Ê{þ™K"¢ÇÇ3ÞDDTG\\ÂÂÂ0cÆ XYYaÖ¬YHNNV¶"00ŽŽŽ066ƬY³päÈÛëããム6`òäÉÈÏχüüü”í®®®˜>}:²²²`kk‹øøxÚTQ5··7ÜÜÜP^^®|˜”º¸Ô7ºíj)üýýñùçŸcÑ¢E(++ƒ¥¥%^ýu$$$´Ù˜h#U±_¼x1¼¼¼0xð`€‹‹ nÞ¼‰àà`¬Y³†¹$¢ípVÎúí1¦ì€±M°~:Qá! ¿ù¨ªç ¦šØÿM2ÞŸê…{w~øÊž];ñ¡× ö"jó|çxc݆()n÷@~³o¿Ÿ‰ˆ,Zè°ÈhˆD"µãJ$„. F̪5 û×L¾ø,c=Æ+?û¯;ˆ·Þt…B®€L¡€B.‡L(ä TÕÈ P( “ ‡+¤§ŸÄZßÑOeórs¸iÖmØÈ3ÞDDDDD£\\º,X£[Uôõõ1ÊÅ•Ac`ÐZ {)drärù_ÿ* ©–B.WÔÞÅİÉÖ‹…7i-±XÜ`ÛÿELDäâ:.®cö‚Xx5‹k"""j øTs"""""""ÞDDDDDDD,¼‰ˆˆˆˆˆˆˆ…7 o"""""""ÞDDDDDDDÄ›ˆˆˆˆˆˆˆ…7‘6ÒgˆˆèI‹ÅÈËË{ìv"¢æt0u?دѸzzzåâ ×1 ûG,¼‰ˆˆˆˆ4qøÐADŬ‚¡¡¡Úq% –/]Ì¢‹}€}€4ÆK͉ˆˆšX,nqëôÛo¿aÆŒxî¹çлwo¼ñÆøöÛoÛtLZsÿjèÅüÔO&“iTp€H$‚L&cGc`Ј…7iîÆ˜4i^{í5?~W¯^ETTöíÛÇà´ByyyÊW}Ÿ‰ˆˆ…75³¬¬,xzz¢oß¾°±±Á|€¢¢"e{uu5üýýagglܸQ0½ºv±XŒÄÄD¼üòËèÑ£€ûg¢££1`ÀØÚÚÂÛÛeeeÊiŽ9‚#F W¯^prrÂÖ­[5jSE*•"44ýû÷dzÏ>‹ÿûßʶªª*ÀÞÞööö DUU•`õð0±XŒ/¿üNNNèÕ«F .Æ{ô ä£qyë­·ê¾yyyxá…pïÞ½'šó¸¸8Ìž=~ø!:wîŒvíÚá…^À¦M›ÚlL´‘ªý,((;v쌿}ûv5˜uû-±ð&"¢xzzbÆŒÈÌÌDff&lmm¦lEqq1ÒÓÓqèÐ!œ8qB0½ºvÈÈÈ@jj*rssñññÈÌÌDjj*Î;‘H„¨¨(åø~~~X°`®]»†Ý»w###C£6uÅæÕ«WqðàAüôÓOøóÏ?•m+W®D~~>Ž?Ž´´4äåå!66¶Qq___¬]»r¹\Ù¾víZLŸ>&&&O4çLJ‡‡‡ÊqÚZL´‘ªý,"";wîDJJ 99IIIˆŒŒl0?êö[""báMDD 8zô(œ!‰`bb‚   ;vLÙ¾gÏ„‡‡ÃÜÜL¯®BCCaff¦ü¼mÛ6DFF¢[·n066Fpp0öïðtY‘H„‚‚C,cõêÕµ©R[TtëÖ ¦¦¦ U¶íÝ»W° Ø»wo£â +++aÖ¬Y8þ¼ÚiŽË°aÃСCåÞ7nàÿû¼¼¼žxÎoß¾.]º¨§­ÅD©ÚÏ €+V ::ÑÑÑHHH€¾¾þc͈ˆàS͉ˆ¨ŽS§N!** çÏŸGEE@GGGÙ^XXˆž={*?[[[ ¦W×]»v|ÎÏÏÇСCÃ^fbb">ùäÄÅÅÁÔÔaaapqqQÛ¦JAAA½ëEEE‚6kkkÁåöšèÔ©“ò}ûöí!•JÕNóh\|}}www¬^½³gÏFûöíŸxÎ;w’XZZ68N[‹‰6R·ŸYXX`„ X»v-BBB`aañ·æGDÔœv'm¯3l¸«G³¬ ÏxQ3gÎÄ´iÓ‘‘ÜÜ\\¾| …Bppž““£üüð{MÚëcii‰Ó§O U{:888`Ë–-øõ×_©¼DY]›ºefgg×Ûfnn.XïììlÁz}}}TVV*?ß¾}û©äbôèÑ000@tt4NŸ>)S¦<•å¼úê«ÊKŒÒÖb¢Ôíg/^ÄöíÛ±yóflÚ´ 7oÞü[ó#"jNoMzã&¼1oNÀè¾…‘nã›m]XxQ‰†††044DvvvBvܸq Eqq1ŠŠŠÒ¨öúL™2ÈÊÊ‚T*ÅåË—áíí­lŸ={6®^½ ©T …B!8SªªM•I“&aéÒ¥øóÏ?q÷î]Á¥æîîî AQQ‘r¾º_¿~HHH@ee%òóó±hÑ¢FÅØÔÔׯ_W;žŽŽüüü°qãFøùùÁÀÀà©ä|Á‚X¿~=¾úê+ܹsÕÕÕ8{ö,>þøã6m¤j?«¨¨Àܹs±~ýz¸¹¹!&&3g΄D"i0?êö[""báMDD ˆ‹‹CXXììì0iÒ$ 4HЈŽ;ÂÑÑ#GŽÄ!CÕ^8::bòäɰµµÅœ9sàææ¦lwuuÅôéÓagg‡¨¨(ÄÇÇkÔ¦®ØìÓ§F…Áƒ žÖ 8;;ÃÙÙ]»v’«V­Â`oo¼ú꫊±··7ÜÜÜ4úmd===ØØØ`Ò¤IO-ç666عs'þ÷¿ÿá•W^Aß¾}±dÉAaÝÖb¢Tíg‹/†—— pqqÁĉÜ`~Ôí·DDÍiwÒvìýz¤|ƒßîÆáý{šm]t¢ÂC~óPõ×_3kÿ7ÉxªîÝ-mpœ=»vâC¯Ì<µy¾s¼±nÃF”µˆõùfß~?·Ó¦Mƒ‡‡ÆÇ`0&ô”,Zè°ÈhˆD"µãJ$„. F̪5 û×L¾ø,c=\:î¿î ÞzÓw+j “+ —ËÿúWIµr¹¢Îð.&†HO?‰µ¾£ŸÊ:æåæ qÓ&¬Û°‘W#""j©är9¶mÛ†›7oÂÝÝaLè)åâŠÐeÁݪ¢¯¯Q.® ûƒFcáMDDZKÕ%ËþVtKÔ³gOôìÙ ÐÕåÝaŒ =M.®càâ:†`` ´HKzª9 o""ÒZ­¡¸ÖæõgLˆˆ¨9½5éz/5oüS1 o"""""""ÞDDDDDDDÄ›ˆˆˆˆˆˆˆ…7 o"""""""báMDDDDDDÄ›ˆˆˆˆˆˆHé3DDô$ˆÅbäåå=v;=ù˜3Dš;˜ºì×h\===Œrq…‹ëŽ}€#ÞDDDDDš8|è ¢bVÁÐÐPí¸‰Ë—.fÑÅ>À>@,¼‰ˆˆšSk;+‹•ïMLLðúë¯cÅŠ033ks±Ð–þ×ÇÍ…¶çQ&“iTp€H$‚L&cGc`ÐHc¼Ç›ˆˆˆ”Y^^Ž?CCC,Z´ˆAi幬-”ýLDD,¼‰ˆ¨™eeeÁÓÓ}ûö… >øà)Û«««áïï;;;888`ãÆ‚éÕµ‹Åb$&&âå—_F=Ü?ÓÀÖÖÞÞÞ(++SNsäÈŒ1½zõ‚““¶nݪQ›*b±ÿú׿0pà@ØÙÙaþüù¨®®V¶WUU! ööö°··G`` ªªªÔ.·öl£X,œy”J¥ Eÿþýñì³Ïâßÿþ·ÆËRSuñk sss„‡‡ãرcm>ÚFUl‚‚‚°cÇÁøÛ·oGPPPƒyd¬‰ˆ4Ód—šñY"£MDÔJxzz"22 ¨©©ÁêÕ«†øøx@ll,Š‹‹‘žž…BÁôêÚ ##©©©ÊK™ããã‘™™‰ÔÔT˜˜˜`Ù²eˆŠŠBtt4ÀÏÏ111pqqAaa!Ö®]‹÷Þ{Om›:ééé8|ø0Àßß«V­Â’%K+W®D~~>Ž?…Byóæ!66Ë–-S¹Ü¼¼¼z/Ë‹‹ÃÕ«WqðàAtèÐkÖ¬Q¶©[–º˜ª‹_céèè>·åXhU±‰ˆˆÀ;ï¼###¼ùæ›HNNFRRvìØ˜˜˜zóÈXµ Â{üÄÉŒ4€S§3ZÅz=zTù^$!((NNNÊa{öìÁ×_ sss@xx8^{í5Û 44Tpÿð¶mÛ°uëVtëÖ  å¼H$BAAŠ‹‹!‹±zõjÁ:6Ô¦Nxx¸`='Mš¤,¼÷îÝ+ØŽˆˆLš4IY6v¹IIIعs§rCCC•mê–¥.¦êâ×ÅÅňˆˆÌ¿­ÆBÛ¨ŠàîîŽóçÏ#99ÉÉÉÐ×׬ùѼԜˆˆêþàÔ)Œ?}úôX,†JJJ”í………èÙ³§ò³µµµ`zuíеkWÁçüü| :Ty)«ƒƒƒàòöÄÄD;v ...2d:¤Q›:¯gÏž=QXX¨ü\TT$Xwkkkש>õÆB“e©‹©ºøi¢vZgggTTT`åÊ•m6ÚJ]l,,,0a¬_¿žžž°°°ø[ó#"¢ûøTs""ªcæÌ™X¾|9†ccc”••ÁÞÞ^ppž““ƒÞ½{rrrÓ«k¯¥¥%RRR`eeUo»ƒƒ¶lÙ…B£GbÁ‚8sæŒÚ6u^ÏÜÜ\åYTàþ½Î·ggg ÎÒ7v¹–––ÈÎÎÆ3ÏølÒ¤IXºt)âââ”÷5×^b­nYêbª.~c¡TŦ¢¢sçÎÅúõë1xð`èëëcæÌ™Ø·oD"Q½yd¬‰ˆZPá}ÿ§I~ÀÐa#ÐÀ@´k×Nåø …³o½éÊ,‘Ö8üyZ«Xϸ¸8„……aÆŒ°²²Â¬Y³œœ¬l D`` allŒY³fáÈ‘#·×ÇÇÇ6lÀäÉ“‘ŸŸ;;;øùù)Û]]]1}útdeeÁÖÖVù 7umê8::bĈ(//ÇØ±c l Â’%Kàìì ;v¬à'¶T-×ÛÛnnn(//WžI^°`"""0jÔ¨:S·,u1U¿¿‹±Ðªb³xñbxyyaðàÁܼyÁÁÁX³fM½yd¬‰¨¥1éC¦P@!—C¦rDºP(É…ÃM¸^:Qá! ¿ù¨’Hkû¿IÆûS½pïniƒãìJJ°aÃÑ£{¹²:6ϺxãžDÊDDZá—aX·a#JŠ[Æ=ßìÛƒ½f´Ù|Ô÷”f"j›-ôGXd4D"‘Úq% B—#fÕŽ}€k&_|–ˆ±®Ró_wð±çµÖwôSYǼÜ$nÚ„u66ÍïÂÂtïÑr¹¼ÑÓÊþúËÑÓ2Êš˂5ºUE__£\xU&ûû@K2²W9úƒví §§§ñt¿ü”Þ$ë×$…·L&ƒ®®.dõtb…BÌ3§Ñµ[wXuë^·].¬‚ˆˆH,7ØÆ3ÝDô0×1pqÃ@°0Ôz ï† h…BÌsgpïn)¾ô2䲺¶Lžñ&"¢Ç¢®¸fñMDDDÚUx+‚Â[¡Pà×̳¸]RŒ‘.®Ieʇª vä,¼‰ˆˆˆˆˆˆ…·šÂ ( <äfgáÏöƒL&kðròª$Õ|¸±ðVIZ#EUU•ò³™…¬{Û /7ݺw‡®ný7Àß?SÎ3ÞDDDDDDÄÂ[¥G/5›glg3N£ÿÀê}úœLΧš o ïúŸNÞ«· ²nüŽêêjÖŽO5'"""""èz9J IDAT"ÞªéééA&“AÑ@Ý«· Ú¢ú¡KÑkñ©æDDDDDDÄÂ[ Käåä¢s—Î Ž#©¬¬w8ŸjNDDDDDD,¼ÕxeÈþþ¬­{¢ÿÐÓÓ|± ]L ™)"Ò ·""""ÞOƒX,Æk¯½ŽCàÂ…‹õþ^wCÒÓO2KD¤5:¶âu‹ÅÈËËk‘ëöã?Â××üñ‡Úu|ÛÑ’c£“oæ™4u0u?دѸzzzåâ ×1 ûG-§ð›glðñ,oFœˆÚ´%‹Ó„§ 22QQQ=z4‹+æ›y¦ÇrøÐADŬª÷a¿’H$X¾t1‹.ööjy…7µM]Ô\ºt #FŒx"ójŽ3æ-%g ££cccX[[cذa˜9s&ÌÌÌZTîÕå»v[j™ššbÈ!X¾|9¬­­ÛLž[SN[™L¦QÁ"‘2™Œ_öì iL—! "¢Ö®ªª úúü[ò“ø£Cnn.222°fÍH$¸¸¸ ''§Õå;//O¹=iiièÛ·/>þøc洅攈ˆ…7µ9ÕÕÕð÷÷‡°qãFA{VV<==Ñ·o_ØØØàƒ>@QQ€gÙÄb±àÌ£L&Ctt4 [[[x{{£¬¬LãB+ ööö°··G`` ªþú ʆ–§Ê¿þõ/ 8vvv˜?>ª««•mÏC,#11/¿ü2zôè¡rY_~ù%œœœÐ«W/Œ=.\hµù722ÂóÏ?ððp¼ûî»XµjU“æþIæ[GGæææ˜7o®\¹ÒfóÜÜ9%"báMDDôˆØØX#==‡‰'ížžž˜1c233‘™™ [[[„……xp oíÇZñññÈÌÌDjj*Î;‘H„¨¨(ÖgåÊ•ÈÏÏÇñãÇ‘––†¼¼<ÄÆÆª\ž*ééé8|ø0ÒÓÓQXX((B•‘‘ÔÔTäææª\ÖÉ“'±oß>\ºt nnn ÔŠ¾ðÞ{ï!--­Isÿ¤ó]\\ŒuëÖᥗ^bž›)§DD,¼‰ˆˆ±gÏ„‡‡ÃÜÜ´=zÎÎΉD011APPŽ;¦ržÛ¶mCdd$ºuëccccÿ~Íž»wï^ÁúDDD`ïÞ½½}µó277Gxx8öìÙÓม¡¡Ý +++aÖ¬Y8þ¼Vô…®]»¢¤¤¤Isÿ$ò]{†V,cÀ€øüóÏU†m)ÏÍ‘S"¢¶Ž7ÄQ………èÙ³§òsí©j:u QQQ8þ<***Ü¿¤W•üü| :T0LÝ4µŠŠŠë`mm­¼öq<¼m={öDaa¡Ê"E:uR¾oß¾=¤R©Vô…[·n¡K—.Mšû'‘ï‡ÏΖ––â³Ï>òe˰sçÎ6ŸçæÈ)Q[Ç3ÞDDT‡………àáK>ˆiæÌ™˜6m222››‹Ë—/C¡P¨œ§¥¥%NŸ>­¼dµö¡Oš077¬Cvvv£žÊü¨‡ç•›› sss&½[·nXM‘û'ïŽ;bΜ98uêÚL9%"báMDDôˆqãÆ!44ÅÅÅ(**BHHˆ ]"‘ÀÐІ††ÈÎήsŸ«©©)®_¿.6eÊ ++ R©—/_†···FëãîîŽ)×ÇÃÃã±·¯vÛŠ‹‹±|ùrŒ?^ãiëÛ6mSYY‰óçÏcùò娶m.\ؤ¹Òù¾wï`kkÛfóÜÜ9%"báMDDôˆÀÀ@tìØŽŽŽ9r$† "h‹‹CXXììì0iÒ$ 4HÐîíí 777ÁS}||àèèˆÉ“'ÃÖÖsæÌ›››Fë 8;;ÃÙÙ]»vÅ¢E‹{û1bÄ899¡sçÎÐxÚú¶M[ˆÅbôèÑ„¿¿?Úµk‡ƒ .ÍoŠÜ?‰|?|÷‹/¾ˆŸ~ú m.Ï-%§DDmNTxˆÂo~ª$’ÇšÁþo’ñþT/Ü»[Êh©±dqÖm؈’⢱>ßìÛƒ½f01DÔæ-Zè°ÈhˆD"µãJ$„. F̪5 û×L¾ø,c=Æ Žiúƒví §§§ñ|~ù)]0Ÿ')/7‰›6a݆|¸Ñ(W„. ÖèyúúúåâÊ ±0h¤1ÞDDÔìT]Ϋéo5?yQÛáâ:.®cö‚Xx‘vz’1‹k"""jiøp5"""""""ÞDDDDDDD,¼‰ˆˆˆˆˆˆè¼Ç›ˆ¨ Ýz‘A ""¢VåÞDDÔš( ¡ {ÿ9AK,ÿ…7µì›1 â>LDD,¼‰ˆè)´ó¨½-‹Þu•AhÀâ‰}¹ o""zíàA;÷a""báMDDOï ÇìD܇ :…g É=¥Ù¸ººu r Ž}€#ÞDD¤ÉA;Ú‰¸SõˆŠYCCCµãJ$,[ó ûG,¼‰ˆˆí ‰öˆÅ[αüÅ̤^ÞÖíÑN_¥UH¿r—sïiÕv.žØWëîk¯oŽöl¸xÜ~¯íûŒB.רà‘H…\Î?z°° o""Òô ÛÞÖu1n‡÷_ïã—J°ÿô-TKåèÚɃÿÑEë ï¶Òƒ>P ÇL(øÌ}†ß!Ä>@,¼‰ˆ¨Éê5èéêÀmPw¼hÛºº:8rö~8_pÿ?=]x¼"Æ›N€Ìßï`_z¤29`¥—öœÌÅëý-ѱƒŠJ«°ûdÌM 1|`Wt6n‡[w$Øq, ù·%=®Ž\_²Â ¾fhg ‹‹ÙwñõñlTÕ×cØK˜àÖ ’~ÈÆ%•Xéå ,H`ÑggÿèaŠê󎆸[Qƒ#goáç«ÅZß^íg†¯ÜFÆõ;Êa”H°ûÇ?0èé`´ƒ%ì{˜.åÞá³Êî÷ŸÅû"õLœúv†I{}Ü.«ÁþŒ[èbl€Wì» “‘ ïV#å—|–V=ö4::ÀëÏ™c MG´Ó×ŵ?ÊðÝ_,¨çŒ[xž LDú(¼[oOåãÖ*åSÊkÿ­=ómkÕ#X ‹±îI¤8q©çn”¶ê}¸¡qTí7ã‡ô@NaN]+QN7¨oô07Â`{óz÷uûa[üþ$þJÄ›ˆˆ4:hõB7tí$Â'{/£ºFŽQ/Z)Çs}Ñ ¦í ›tðÎÐ^ý¢¾ý9O9}ŸîÆHøöÊ«¤xí9 x¶Å•Ü»ØôÝoÊaœ{b}ÊÕÇžf¸CWˆÍŒðÉÞËTËàñJO¸½Ü{Næ(çùŒUü+å**«eÚßo9÷D|òþç b?zÿ9#Øî·‡Zc÷‰\Ê)…q{ŒzÁ ?])Òú>ÐÛÒG2 UŽ3ô9s·×GÂÐÑÆ²ÂÐçÌÓõ¶4Âå ²J†A}:ãíWÅø=¿Û~ÈUs{©+¾8’ýØÓ ±7ƒUg>û> U5r¸8Xbxs¤ž)Pγ—…¾<šIN}ïO¿åp6¢w]­÷Ró7YaÆ-üög9:ˆôðê³fZ[x«Úoöý˜‹nv¨®‘ãÜÛøLg¼h׉ûÃî9õî3šì‡,ºˆ}€ž ÖµººÌQ?h¨çõ’]ìý1wÊkPQ-Crzž²ÍÁ¶3ö¥çâ^¥÷*¥Ø›ž ÛÎÊvH:žƒÛåÕ¨–ÊñÃ…BèâëÂa=ÌþÖ4ƒúšaÏ_ë(©‘ã»_òð|ïN‚yî>™ƒ;5¨’Êñ¿_ 6k/ht»kdr˜ÀH¤ÛeÕHJË®7>ÚðzX{C]TTÉTö“çzšàû³…¨¨’¡\"á³…è×ÓD0ÎþÓ·p·BŠ™¿\»vúº8Q Ö­³áßšf )-À½J)ª¥rüï|!þ!®Gê™ûí5R9~ºR‚®Tß³Y#SÀ¸½>Œ õp·BŠïNßjõûð£¹Öd¿‘ÊøêÈ ¸ ê·—￾:rR¹¢Á}FÝ~ØZ÷‰'{¾ØøjYùjN<ãMDÔÆÕHë\&FúÈ¿] ¹¼îmÆíõqëv%äý•?ÿv%LDú‚ù”–WÕ™ÿ£ÃtuuþÖ4 8±_ á<«U.óÑmÿ,õ:\_ê—¬ ©–a÷É\Ⱥ£õ} ²J#C=”I¤ ŽÓA¤ÛÅóNY :ˆô„ó©– ŠÙú†éêèü­iLÚëãc×Þª·GÍ2µûÇ?àÜÏ ¯õ3CUߟ-Àµ?Ë[õ>ÜÐ8êö›’{2ürµ®/uǾsPr¯Jå²4Ùµù ¸5n'±h ÞDDÔŠÔw™ÜÝŠ˜·CA©¤NÛ½ ):›Ü¿ÌŒ q¯R*˜O}óT7¬±ÓÜ­¨Áš=—Åõß]fVA6í¿ÏZwÄ»Ãl°ì‹ÛZßnTÀ¾‡1NýÖðÊ%Rtê`€Ûe5€Nƨ4ýgY¥ _ÍÆ½Jé›çŸ·%Øuâþ­¶VðÏ—»âÚ7¿·ê}øq÷±™œìÍñŸÔß0ñUkdÞ¼­Ü×ë[–&ûa[ûþ$ö¢úðRsúÿöî3<Ê2ûøwZz%=„. (°ÂJS,(¨¨X@E¤-®¡÷ Øh‚È_]Ë£ î®¸‹mÁ†"¨HQJHBi@Ò¦O>ž&zµcwÒ…¿âù/ŽÓïš‚ý, Â=¹ýÚ(·ç/(¶âïá2ì¶k£ ðÀd4`0Piymø Wçsc1¸¿g#þñ¿ýl;Ūoñp¯¦˜M†r?3•}këg¢¦j¯‡ö=.­öº˜Ôã-"Rçƒ÷ÙÃÖþ˜Âí×5`â]møô§#Îé>Þ”Ì]Ýâ˜v_»’ ô{oJvYNYˬlXUçù|Ëz]ͨ[[èëÁ±ã|úSŠÛË\·5•ñ[ãi11úåÍl?xœGú6#4À“£Ç øÇÿö׉[Ådåñÿ¾Iæ†Ö¡ôh†ÅdpÞÇ»Ô×;3è}U8#ú5J®jþõ® ṿfÑ™z î^/3™¹E|·'Ëíù7íËâ¡¿Æâa6:/²öÛ‘\îèM°Ÿ…¬œbÖlN«õŸáê|nîêÖ¯wå÷”’TvùÏî{p(9'O¨š""•˜?‘EK—‘•yi\)û?ý‹ÍùíÔ0uÐ’‘לu…oùCémÇ.u£–nRcÕïï2{î|¼¼¼*¶  €i“ã9ÕøNû€ w‘tòÞNÿÛ¸|§iÛ®=L&“ÛËùqÓ.Ë©I)ÉI¼ºb‹–.S·ˆH]§óÓDô ¤Ó&Çc·W~í£Ñ„#´­j¯}@û€¸MÁ[D¤ÎiW Dô–<ÿVàߪŠÅWÝ´¨n¢à-""n}gз}†EDDÁ[DDÎß—vu—Õiµå—ªS-årñùgŸðù§Ÿ¸5­ÉdâÆ^}èÕ§¯ §}@…“ ¼ƒ‚ÈH?†···ª)""Åœ9s˜;w.½{÷V1D¤ZÖ}ñ9sç/ÀÓÓ³Òi ˜>%^¡Kû€ö¹pÁ»e«ÖløêKš·lAPp= ƒª*""Ôž={èÙ³§ qbbbÎV“½×111Üpà ¼ýöÛg}WPOù…iÏsm×˽l6›[ ÀËË ›Í¦Mû€Šv IIM#%5íò ÞAÁ´ißžßöícǶm:ì\DD.¸ÂÂBÌf³ q®_ZÎs¨ â7Þàá‡V±/`[ê‡ ©+&ÄOÆápüñ°ÛKþŵØzz¸Ý9>çäIÞ~û­Ú¼BàWK‹ˆTbÓækÅvÆÄÄ0þ|–,YBZZW\q/¾ø"­[· 11‘éÓ§óý÷ßS\\Ìõ×_ÏK/½Dhh¨sþ„„–-[Fjj*7fþüù:tˆE‹‘””ÄW\Á¢E‹hÑ¢PÒÓðì³Ïòî»ï’——GïÞ½Y°`~~~•në™ÿ¦¤¤”4>ª¿/ÔT-èß¿?ݺu£iÓ¦eNs)í[—£Šj1qâD®ºê*î¾ûnçôï½÷[·nå­·Þ:ës¦ÚŠÈ¥Èn·c·Ûqœþ×n·ãpØ),,úè#öìÙC¿~ýxúé§ãzè!}ôQ¶oßÎöíÛiÒ¤ 3gÎt™ÿÛo¿åÃ?dÏž=Ü~ûí 2„uëÖ±zõjöîÝKÿþý?~¼súÅ‹³}ûv>ûì3¶mÛ†——sçέt;K@JJŠ‚õ%. €gžy†1cÆ`µZËœæRÚ·.GÕböìÙ¬^½š?þ€5kÖðþûï3gΜr?gª­ˆˆ‚·ˆˆœƒ„„"##ñññáñÇgçÎÎq_~ù%×_=^^^øûû3qâD¾þúk—ùŸ}öY¢££ñööæÑG%77—ùóç» Û¾}»súwß}—9sæ…ŸŸ“&Mâ“O>QC\@111.ó¡K—.\wÝu<÷ÜseŽ×¾u~UT ‹ÅÂòåË™7o $$$°|ùò OãPmEDÜ£âDD¤LAAAÎçÞÞÞ.=”?ýôsçÎeçΜ:u ଠf»Ì_Ö°3—™––F÷îÝ]–¡ v^Xêˆ &pë­·Ò³gO:uêä2NûÖùUY-¸óÎ;yñÅ™6maaaç´<‘‹å£>¢k×®:‡?~œ 6Я½z¼ED¤Ê†ÎÃ?Ì–-[HNNfïÞ½8ŽsZfxx8?ÿü³óPÖ””’““«µ,³ÙL~~¾óuvv¶­šÎG-- .äé§Ÿ&77·Ví[µ]eµØ½{7ï½÷+W®dÅŠ:tHµ‘Zé³Ï>£ÿ-·8ÿßÊÎ>ΠAw±~ý—e{¼ED¤Ê ðôôÄÓӓÇ»œÿ]]C† aüøñ$&&bµZÙ»w/#FŒ¨Ö²ZµjÅòåËÉÏÏ'-- &¨Ñªé|Õ²yóæ 2„)S¦Ôª}«¶«¨§NbôèÑ,Y²„~ýú1þ|†NAAPrŽþþýûU[©–,YB»ví¸¡Gâ'M¢Oß¾´iÓ†gŸ}FÁ[DDj‡çŸž™3gÒ´iS DÇŽÏy™£F¢S§NÜu×]4iÒ„‘#GÒ¯_¿j-kÁ‚|úé§´hÑ‚Ûn»®]»ªÑªé|ÖrèС¤§§×ª}«¶«¨ñññ :”Î;ЫW/ȤI“1býúõs9ÿ_µ‘K•Ñhdé’%\ýõ,]ú2]ºtáùçŸÃh¼8Ø0wÖ4ÇØ'ÇSxú×L9fL›Ê¢¥ËÈÊ̸$¶ç?ý‹†>ª†‘:oÂSã˜9'//¯J§-((`ÆÔIÌ_ð‚ §}@…»HÞ|íUúß6Àùú•å˘?›ÍærË0«ÕÊ»ï¾Ë€·œu«±·ß~‹áŸŸ#uR’“xuÅ -]¦‹«‰” #3#]…©ƒnìÕ‡S'•{«»3™ÍfnìÕGEÓ> ¢ÕF£‘{ïì¼÷ÅrÁƒwHhÉÕ1ëBÀùó{­ìµ¸Ïn·óðÐa´mÓ†§žú» "r™«èÖVºw·ˆÔ„^}úÒ«O_Bû€ QK ŠŠŠ0™LnÏc³Y/Øj$x—Ènݺñ¯~è²ñu!\^Jï±¶Ö»t» ~~~4Œ‹£gÏž<1ò BCBΚ~ê´i\}õUŒ3FeDê…k©ˆÅlf÷δm¥ÛóìÞµ ‹ùÂôE×èZ¾ýö[^{í5† Vî4u©w·²÷ªžî²ëqêÔ)~ß¿Ÿwß}—¿üå>Y»–ØØ.ÓÎ3GúÜt_¹/ooâ6ÂTÁEÔGåàÁƒô¹é¦Ú¼o¼ñ¯Ì˜9‹žý+6,sšÒžÍßÛG›¶í(..fÇömDDD––F»öWb±Xعc;AAA,[¶œ×^{ä”ÂÃÃ6l(cFvéY_¾ü&O™‚Ñh$44”¾}ú0kÖLüýý]Ö{fØu§w¸²ùJŸ—5meËÿóøï¾ÿžY³f³k×.]ºtá‰#èÙ³‡[ï³¢mq8•ÖÑ•¾~f~‹/áÈ‘#d¤s»vîðññ¡]Û¶´kÛ–€€X¶ìel6óæ%ðöÛo“›—G¿~}yéÅ)..æÚÎÙ¼iAAAÎeeggÓ¹Ëulúa#þþþeÎëççwÖ62aâDþýïpûíÌŸŸ€§§§ó½MŸ>¥K_&//nç¹çžÃÓÃíñå½Òm)ë|ó3‡…„†1göl^^¶ŒÔÔÔrÛ@Äo¾öªŠ """µZtT4×]וßÇ>^ƒÍf+wZ“ÉDHH]ºv%:*ºöïÅ‹ѵ[7FÅÇkÖTx©öàà` È[o½Íê÷ßgô¨Q¬~ÿ}l6÷Ý{/ÁÁÁ,^²„3frÏ=÷ðí‚gY´x1³fÍÆl63ò‰'œËËÏÏçûï6аaC>øàCÆŒK±µ˜%‹;§©îñûÍwfø>×ìÇNZZo¿õ&=zô`Ë/¿°xÑb—à]Ñû¬h[–,]êVÝ­Ñž={Ùøýwøúúž×tÈý÷Ó«÷®xñŗغm_~¹ž€€&ÆÇ3sæ,,x–[o¹•¼ù¦ËáçÿxóM¼“   ž{îùrçý³¹sç‘–šÆO?nÆápðÄȑ̛—ÀÌ™3œÓlü~#ßmø€Q£F3?a>Ó§Osk|EïÃ]?où™/¿\_æ¡ø"î:ój """"µY\ÆĕÓ|±ÕÈíÄÎ {ÿýïyàÁ‡˜9s£Fެ°x÷î=tëÞV­Zòí7ßе[wöìÙÆo¿¡eË–\uõÕ>œÄO?n¦Q£Fœ8q‚ÆMšË–Ÿ.s{l6á‘„„Ôc߯¿:×k2™8v4­Ìí®è½U6_yË©êÅÕâ6¢¸¨ˆO>YK‹–-½£å)ï}–µ-îÔ±*ïu߯¿R¯ÆvÄò®(^\\LƒØ8ÒRpåUWóÁû«iÚ´)ééétëþöîÙÍo¿ýÆÀAwñóO?b6›±Z­tìԉ׬¡~ýúÎûçmhݦ-¯ùˆÆ°ÿ~n»};wlwN[ZK€pÛíر}›[㫲-eÕ($4Œ];w©¿°µÌ¥v;19?ÎëíÄn¾ùfî»ï^æÍK w¯^NÛªUKºvíʆ ؾc8ìÙ³‡nݺѲeKŽI CÇN.ó&%%;ŸoüáæÎ™ËŽ;ÉËËÃáp••]«fR|<³fϦç_oÄd2Ѷm[¦MÂ_þò—s~ŸîÔ±JA¹CwEŽ=J½z¬+55•k;wqýõèt/}³fÍhÑâ >þø? p;k>þ˜N;Q¿~ýJçý³ôôtâââþøõ,.Žôt× ëòüرcn¯Ê¶”G¡[DDDD¤v0ž…&Ì›GTd$OŒUé´Ã{€U«VñÞªU.ÃbbJ޹߻g7™éÎGú±£Îi† {„?üÀНz$…”ä$g0-Uz3õÒàã®êÎWUÇ?Æþßã‹Ï?còäIlݺ•dž?^å÷Ywêx!ß«»ÞzûmçìܱÝå=œy~óãÇóÊŠ¼òÊ FŽéö¼g ãðáÃÎ׉‰‰„††ºLsæø¤¤$ÂÂÂÜ_Ù¶˜Ífòó󯳲²ô×JDDDDDÁû¾¾¾,_¾ŒíÛ·W:mß¾}‰mÀ|ȇ|H\\,}úô9#˜`ÆÌYœ8q‚ÜÜ\þ÷¿u t—KX °°Ùe\ñºáéÞËÏ>ûŒS§Nñ̳îKëÎ|JL<§º=ðàCìÞ½›6mÚЭkW¼¼¼ªô>ËÛwêXÝ•'$4Ìå‚oîÊÏÏgûŽLš<™·ß~‡ø‰ã~è!Æ{’ƒ‡aµZÙ½{<úÇ5=zô ''‡•+WâëëK»¶²–:W»IDATmÝž÷LÜΤI“ÉÈÈ ##ƒøI“¸ã×sa§L™JFf&™™Lž<…wÞéöøÊ¶¥uëÖ,Y²”üü|RSSùûSO鯕ˆˆˆˆˆ‚·«Ž;2nÜß*ߣ‘Gy¤$àdf2lØ0—‹² þ/¼ð<;vl§EËV´iÛŽWW¾ÊÈ'F8§YñÊrš7oÎm·ÝÎõ]»Ñ¤I“³Ö³hÑBš7oÎC¥[·îtìÐÑ­÷áÎ|ãŸzŠÀÀ@®¹¦Cµ‚f©!CîgÆÌY4lÔ˜[n½N:òêéÞ[wßgyÛâN«[£šFhX8W´hÉèQ£ñôðä믾t¹•ØØ±cèÜùZ ¸ƒú byløpn¾éf—å<>|8ñ“&3úŒÞnwçu†æÉ“ ãš¹¦CG"##™ýœ‰S¦òÁ¿þÅ„¿?IÓ&:÷øbøç¿>dõû«Ê?ê‰Ñtérz˼EDDDDäRòÃæYûé§|üßµÎaÿýèCì6A4kڜ֭Úðò²¥;’Ä {ï`àpë­´jÙBE¼@V¿¿Š{ððгÆ;–Á’—еk7KÁ[DDDDäÜýYY™FBÃBYøÂb¥Šþ·þKÆÇObö´ÉÜrS_ý9q2ìðò²¥ü°qmÚ¶fÐÀ»¸çž{øßÿþÇ}÷ßKnn.ÇŽ㾇fÙâEtîÔQż@ÂÃCÙ³gûYÃ[¶lG½`/–¼¼ØÀËÓ§w_~h¨Š©à-""""u‰Ãá¨òù¬™™$Ì›Ïxuå [úŽŸÄâž!<,‚¬ì,rsóHL<ÈÆßñóO[HMMeÿþý>|˜;3–-[R/8›ÍF›ÖmˆŠŠfÄè1lùá{ù~&NžÌ;kئMéݧw¥Ë=t(‰Ï>ÿ”‡|XEVðqÑxþnúc6›±Z­—uý5jÂÁƒðóóÃ××—Øqô»©/kÿû 1õ£ bïÞ½\]W²ga±Xˆm‡Íf«}aê2hÓ¼¼|ŽÉ$++çŒð½§ÂùêÕó§wïüðÃ/jo‘ ç¹çžcòäÉÌ;—§žzÊe\M†K5\x{{sÍÕ8œ”ˆÕj%22“ÉD³¦Íiذ!§NâäÉ“„‡‡ãéåIDDFƒ‘ƒ‰ÉÊÎ*w¹'Nœ`æÌ™¬Y³†äädüýýéÖ­£F¢gÏžíý^N?¤deå°ú½Üžþ®{VzdÈ®]»˜0a6l k׮̟?Ÿ6mÚÔ¹6Qð‘Ëι*^ùív;Ë—/çùçŸgáÂ…Œ7î¼ö _ÌÃáËZw«–-ùäÓ/èÔá*7j‚Á` ¸¸˜ÿ¬V Äb³ÙÈ?•‡Ñh"#3ƒ=¿þÊ©¼<ÒÒÒðõñ& À¿Ìe<˜ÆóÅ_РA²²²øê«¯˜3g=zôÐûËŸ‡gggVº¬ààç>_Þaìû÷ï§W¯^̘1ƒwÞy€U«VÑ»wo¾ùæšÔ±«Ùµ Šˆˆˆˆœ»O?ý”àà`FŽIHHŸ}ö™Ëx‹Åâ|^PPÀðáà !$$„Çœ‚‚‚2§ýó°3ÿ=s:›ÍÆäÉ“‰ŽŽ& €ûœ—ù.\H£Fððð¨ñ÷?øîA¬ÿêK,NJdÝú/رs;¿ýþ¿ïÿ-[~âÇŸ6±s÷N6nÚÈwßo ñÐA²³²8š–ÆÛï}@ÿ¾eŸWüÕW_‘@Æ 1™L„……1hÐ Ö­[çVÍJŸ?÷ÜsÄÄÄÈ#ú(ãÆcöìÙ•¶[VVQQQdgg»ŒËÊÊ"&&†ììl·Úä|ÖOÁ[DDDD¤ £F?Á}CŸõ À`0Ƚ÷ßãò¸oÈ`Fy¢Âe/_¾œ‘#G0bÄ–-[Vî´Ó¦M#55•={ö°{÷n’’’˜>}º[¸Øùoés€ùóç³eË6oÞLJJ ^^^ÄÇǻ̻yóf6oÞLQQQ×ö¦>}زuûûSlüa3qq)(( ''‡céé“‘žÅÞ=û8qüV«¢Â"6lÜÄÞ_÷a6ùû¸'Ë\öu×]Lj#øá‡ÈÏϯö6~ûí·üòË/üöÛo;vŒ3fTi|eõ[·nëׯ'==ÁƒsË-·ðÉ'Ÿðù矓‘‘ÁÀyüñÇ/‰6+ Ý6«»ýà}å•WVúp†É ŽèX·nƒ>ûšÁƒ]~0)O½zõ¸ãŽ;X¹r¥Ëð•+WrÏ=÷ìV}Îç>_:Ô\DDDDꌓ9'I˜7¿Ìb0ððð`È0 g_²´üÛ* ,`øðá8p€ððpn»í6¦Nê `îxá…œ5á…èÕ« n¯¬~Ë–-#$¤ä0ì1cÆ0uêT–,Yâ2læÌ™—D›  v‡ÝåPqwz´{ôø«ËrÊ’‘‘ADDÄYÃ#""ÈÈÈpkÇŒÃM7Ýĸqãœ×5X±bëׯw»>bŸWð‘:Çj-®ðK‡ƒ””gh( g>·Ûí.¯Kÿ-**,s™K—.%==ÿ³†Ï;Çùºtþ£Gí|ÍÑ£G]–_Öº*Ÿ’’BëÖ­Ï WgNRî{¨©úš-üüýèбiiG©Crr2yyy:”Hl\Z·ºŠµk?áŠ+®ààÁƒ\sÕ•<œRî¶ùøx3}ú4¦OŸ†Ãáà·ß~cáÂEÜ}÷Ýüç?»]³èè(çëèè(ÒÒÒª4¾¬úùÚßßÏùÚl6•9Ìjµ:__ì63 X­V—à}f¶»ÊÚ¾zõꑜœDtt´Ëð#GŽâÖ¾Þ¨QCZ´hÁêÕ«8ðNÞÿ®½öZ"##œóTÖ&5Q¿ Þ)ÉIú+-""""µžÃQþ…¤üˆŸ4±ÌáÆ=‚Á``åÊW9™sÒÙ#XÚ£Qær xçwصkqq±Îá‡%rà 70eÊd¼¼¼\|xx8‡¢qãÆ@IyXX˜s¼Ùl&// ä¼Ö3çÿós€ÈÈHÖ¯_wVЩhžš®/”œWk2™ðóó#"ÂA³æÍÈÍË%(8ˆÃ‡“ ÄÃÃ›ÍæüÃh4¸üàQ™fÍšñì³ÏP¿~ƒ*ÕìÌš'&&^¥ñe½ïªŒÿó°K¡ÍJ‚w龜ÏðÃÝ^îªU%?z<4ôAžIxÖy´À 7ÜÀ{ï­bܸ¿¹ÌóÞ{«¸á†Ün·‘#Ÿ`Þ¼yÜyç¼üòR^|ñÅsn“‹¼¾°@¡EDDDär‰Þå~Ù~nÁóe>â1, ƒ¼Sy¼¶òõrÌÙËýàƒèС±± \ÆÇÅÅrõÕWñÁrß}÷ºÌçw0~üÓ,[ö2ãÇgàÀ;ãÛ¶mÃÂ… 3f,Çg3aÂD—ùÙ·oÍš5s®oذ¡Œ=š РA~ýõW,xŽ7Þx½†CHÙõ=óZ›ÍFtt4¿ÿþ;AÁ´lÙ’ÄÄD¼¼¼0™ÌX,BÃBÈÈÈàøñ:ÛáÌÞ¯ßM<úè#tíÚ•RSSY¸p!;vt»f&Läå——ðôÓ4hP•Æ×tð¾Xmöú¯c³ÙX´è5—p>æoc¹¹_o®éЖ¢¢\ò аÛK~ ±Ùí§Ï ·a·Ù(..ÂËÛ‡¼Üb>üç1™L.눟HïÞ}ðgРAÎÏÊÂ… ùâ‹ÏÝn·ž={2qb<Ë—¿‚¯¯íÚµ«Á{ÒÔ™úÛ,"rŒ9BE9ß±ÛQ½/Û¥=µåÝ©<¯¼²‚)S&—9ϰaÃxæ™g¹÷ÞÁ.!`êÔ©<õÔxÚµkÀ€˜2eŠsü¢E‹5j$Ï<ó,QQQŒ7ŽÿûßÎñcÆŒ¡[·îäååqòdIh7n/¾ø7ßÜŸ´´4š5kÆøñãÏ{ïié-¥N:å2]éÁ=<<ðõõ% € àÀÓu6ºk“©ä°ìÔÔTBCCO‡sÓx+V¬`ìØ¿‘““Cdd={þ•üã ·kÐ¥Kg:uº–ÜÜ\ ÀäÉ“ª4¾¦ƒ÷Åj³M›61eÊh,f Àæ( Õ»ƒ¢¢"²²Ò°Úl[±ÛìØO·ÛíØl6l6;ÅEE˜LŽŸ8Íf?+x7mÚ”5kÖ0mÚ4âã'®o>úè#š4iR¥v{≌û7þùÏϪG­êñ¹Œ¢wµ¾l›L&Ìf³3Hºë«¯¾,÷ ~ß¾}éÛ·/6› £ÑèœÆËË‹%K³dÉâ2C»vmùæ›oþâ‡:Ç?õÔßyê©¿»Ìc0xòÉq<ùä¸2—yâÄñóÒ{jµZÉÏÏ'==ÝeªÒ«—N[ÖížO‡ô’ÞòôôtŒF#!!!x{{;§ë޽ݻw+'TºW3€±cÇ2vìØrCZEã˪ߙÃ*_Ö°‹ÕfF“›ÍN~þql¶’CÍm§ƒ·Ýn‡»ÃAqQQÉ)GÉxÛéàm·SXX„ŸÝN^Þ)üÎ Þ­[·âÃ?¨0»Ón<ð<ðÀYóV§M¼EDDDDj"b8çôeÛ`0¸}®±»¶mÛvÖù—K}­Vùùùdf–œ›[z‹³ÒóÚ+ròä |}}±9ì@I·~~~Îùƒ‚*¿jùñãÙnoû¹Œ¿\ÚÌÇLJÃAAA!‡Ýy¾½ÃnÇn/ Ý6[ÉíÞ¬6[É0ûéO‡ïÂÂBõBHIN¥q£¦˜ÌowÚ¬*ív9Pð‘Ë,dT/@âp80™LØl6—CÏUŸ>}Wä¾Üê[TTxº×»äPóÿç8›ÍVæ2òòòœÏëÕ &5õ(Pr¡º¢Ó½¬¥ëÈÎÎ:ç@­àíúÞ<<<(.¶bµZ)(8œ‡’—ZnµÙ).,Âfwàpœ~Æ¡æEE…8€Ü¼S(,(Äb¶¸Ýf—s½¼EDDD¤.Do¨âú˜è.z »ÝNPP†Ò´RCÒRü‘€.³ú:ì%ç÷zzxЮu+^}ýMúÞxÖb+‘‘QpâÄ —%N:L÷îÝñññ&=#›}û[¿>~¾¾xyzb2k¼VÙY™.³²ñ—S›ùx{óñÇë¸ý¶¾?¾‡ÃÝæ8}.·Ã°‹ŠŠ±ÙJN½(í /é·Q\lÃnƒììã4kìEaA~¾¾úó£à-""""u'wW-@ÅOˆ?{15Âê…„:Ÿgef\Võ-=g»^HÜÆGÿYËÚÏ×NË+® çäÉ’C÷F®¹º‡‹§7YÙ$nßÅÉ'iÖ¤ ×v¸š¨¨hðôô¬S½¡ºÍ†Ü7„eË_æ—_vàãkÆ~:\ÛKºÆOŸó v» 0bÀF£ fŒv&“ƒÖ|†—‡7±± 0›Íj3o©;Ãqɀ̌ôóè/…úZ,ŒF#¡!!˜Œ&r?[¶nãçm[ùñç_8™“ãrh9”œÿíãåExx87\]:_‹·7þþþøûû—y¡.©¹6 aÀíxeåŠs^v¾¥Q£Føøø¨Í¼EDDD¤î¤ ‡À¬¯Á`Àd2áãデ‡DFFrSß>˜LFŒÆ’[‡9 ƒóµÝnÇjµb³Ù1ÀÓÓ³Ùì¼·Úðüµ™Åb¡mÛv¼ôüK.^ûós»½ä¢w¥mVzÁÁÒq6› ³ÙŒËUûEÁ[DDDD.ÿŒ¡pêk4ñððpÞ6ìÜÖ¡ö;ßmVÚ^5·µ™‚·ˆˆˆˆÔ F£»Ã®PE¶ÓHS}ÕfªŸ‚·ˆˆˆˆHù ‚‚‚H:|˜°°0Õ£ ²23®‡Á`T}ÕfªŸ‚·ˆˆˆˆHÙLFmÛ¶ã‡ï¿£Óµ Çh4¨0°Ûd¤ãÇÍ›¸òê«ñððT}ÕfªŸ‚·ˆˆˆˆHÙŒ&#QQÑ´iÛ–­¿lá䉨N_JÊ f&AA´iۆм¼½T_µ™ê§à-""""R6ƒÁ€ÙÃBãÆ‰‰‰Ájµáp(VÆh0bö°àåå­úªÍT?o‘Ê™Ì|ÌBõµÙ¥öUooQðQðQðoooQðQðQðo‘K“Y%©½ì6ÉÙÅä9°Ú *È90ÀdpàmØOŒ5ÔU­à-"""""R‹ýž^Äät~Ù}ˆÂb« rŽ<=Ì\Õ"›=‚¦‘ž8o‘º*)³”´,~ܱŸûo¾†öÍ`2éŒâê²Ùìü¸ë«¿ØŠ—'~„ùžûr¼EDDDDDj©ÜBØ´ãõïH»+¨ çÈd2Ò¹]c,f3ﱕȈÂ|Mç¼\ý""""""RKÙ ŠŠiÝ4FŨAí›Ç_TLQ±­F–§à-"""""RK•ž~¬ÃËk–Ùlr©ï9/O%¹B¸CE¸Dégo‘ÚI‡š‹ˆˆˆˆˆÔ!™Y™,Z¼ä”$ZµlÍc Çßß¿ÌióóóYþÊËìÚ½‹¨¨hÆŒCXX¸ŠXEêñ©å‡Û…‹^"4¤·Ýz;ÞÞÞÌœ5œœœ³¦ËËËcúÌ©xzzpë­·ÉÂÅ «´®ÚüPð‘jINN"6®!‡ **’†qqÌœ5ÜÜ\ç4§NbæìéÄÄÔ'2*ŠÄăԯCJJ² ¨à-""""""i×®=ûöí#*2Š””dbêÇаaCfÎ. ߥ¡»~L}4¨Ï‘#)DFD²oßo´oe¹Ë5›Íg=ätmT‘ÚÏÝã‡=ü³æÌÄl2Ñ A}ÒŽ¥~ýú€ƒøIOc0iÖ¬± š–FdD$IIÉ;vŒiS¦W¸žâââjmÓåN=Þ""""""uˆ¯¯/Ó§ÎàHj*‡“’çXúQbcciÑ¢%Íš5#.6ŽcéÇçpRGRS™>u¾¾¾U^ŸÍfcòäÉDGGÀ}÷ÝGNNŽs¼ÅbaáÂ…4jÔç°W^y…fÍšáëëKûöíùî»ïxóÍ7iÙ²%>>>tèÐ;wžÓz¼EDDDDDä¼ðññaúÔ¤¦¦‘x(‘ÐPŽ¥§Itt4é鄆„’x(‘ÔÔ4¦OOµÖ5þ|¶lÙÂæÍ›IIIÁËË‹øøx—i6oÞÌæÍ›)**r[·nëׯ'==ÁƒsË-·ðÉ'Ÿðù矓‘‘ÁÀyüñÇÏy=‚Á¡¾‘ fÌÈ,ZºŒ¬Ì CDDDÎÙŽä">üì{^zêìv{•ç?uê'M AýúÄÆ5p^`ÍÏÏ”ä#JLdþ¼gÜ Ý‹å¬aÅÅÅ4mÚ”µk×Ò¼ysŽ=Ê5×\Crr²s¾ÄÄD¢££]–•––FHHˆs;ÏB~~>@µÖS‘'_ø7wö¹Ž¶õ«×;ž’œÄ«+V°hé2ã-"""""RÛY­ÅX­Ö*ÏWXX€ÝfÃh2b³Ù±ÙlØlvŠ­Vì6……˜Í&·–———ëòº¨¨””Z·ní2Ü`0PTTè|âòÀßßÏ9¬týfµZ¯«»ž A‡š‹ˆˆˆˆˆÔrU¾Ounn.sçÍ!..ŽèèhrrNâë닯¯/99'‰m@\\sçÍ!77×­û^—5<22’}û~%77ÇùÈÉ9Yá|ÕVõè>Þ""""""ânô®rèž—0—°°P"##ÈÊÊÄÏÏŸää’’Rðóõ#++“ÈÈÂÂB™—0·Òð]^°6l(£GæÀ³sçN|ð¡ÞÕY‚·ˆˆˆˆˆˆ¸»«Ðã——GÂüy× "<<œ¬ì,üüü9|ø0I‡“HNNæPâa|}ýÈÊÎ"<<œàzA$ÌŸG^^^•ƒ÷¸qãèܹ 7ßÜŸðð†Fÿþýkþ~ŸŠrŽ<=,t¾²9 ¢B÷¯™e*x‹ˆˆˆˆˆÔRF£‘&á^øûÆÐ°~EÅ6tªwõ àa1àm&Ü·æ ©à-"""""R«Ã¢ƒ?ˆð3&¤FÔì¯FTDDDDDDäüQðQðQðoooQðQðQðooo9f•@DäÂKINRDDDD¼EDä|3r„Š """R‡‡Ce9?þ? ¼ß.oIEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_design_reports_vertical_group.png0000644000175000017500000014770012235000130030713 0ustar00murraycmurrayc00000000000000‰PNG  IHDRŠÓP{üssRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ 1ÍßÕ6 IDATxÚìÝw\×Þðg—.Kov `W4Q£Q£W4‰æÞ1QŒ5𨢯 ‰•˜øÆ$^“›¢Æ»56,ØÐØh‚² t–²óþ¬»ËV@¤<ß|æãîœ3gΜ3™3?¦¬•C""""""ª„à1@$"""""ªe£è9,Ãà‘ˆˆˆˆˆ¨z…F¢ æ𙈈ˆˆˆˆª&Hô‡Œ¢ræ)MêùD ‰ˆˆˆˆˆª4H´ŠByFƒo#í;r¾œ}@DDDDDôâÚ±Ôš¯Ê5‰ÚF­Á¢©¾ ±ÿ¸UrK§3´;{ƒˆˆˆˆˆ¨°ö—r ni¯!0”kùW=`i Mõ‰ƽHJËaoQµ’šžƒÂ¢òÝühj"†£]½YîÈuÐ žü¹u¦›ZP¨<•Äw¥ß¡Xj Mõ‰‰Òlî}DDDDDT-ƒÄ´ŒlÜ8¤\Ëûu|r¹P&¨« å>~š èÖû_ôçÖ™•Cå©P鳨ä_½Á¢Ö[O-Z/)܉ˆˆˆˆ¨ZIËÈ…ôib¢Žâ•¯£…—½QËߊ‚#ûoûÞ[«Y®RìfS(*MLJþU5‹*Dš¾÷9_þŸÑ"GVÀ=ˆˆˆˆˆªGiY8ÿ×x©o0\lÊUFô$ÄDEÇ—^ƒKI5­\H’fâÜ¡]8´ciW¥1_m*(™”¯6–ÞªZ&hÔõ2h»˜ùˈ-¬ŒÛ*±9ºöûÄbîÕDD8èûr—[·ê° Õ¹‰ˆèù•\òru°A‘¼|wA:;ÔGLIY¥±OM+WMƒ’`P¦4™Cõ"¡òKoô>£(*(j^{FF’rÌëÈœtèõ:Ì 0‰ˆjÃU "‘ff¦°±®W'G¸¹8*µ‡ÿ:‹Ý+ßÏÚ…>/u®VÛ ^·ÒíR®gu؆êÜŽ/zd[Qm'= _är¡Âe•Æ>šÊÝwä”Aå |%Ȩr•ËV_VÛ|õr5Šù%b€\¥@Q9@Tž”EÅg­/³¹–@ñW» ß«¯B$C,C$C,A,.þ·ø»b‘H‘g梕 ‚Ö2‰ˆjº£‘çA‹ …EÈÌÉGì£tüu9g¢®£C€¯Æ;+ªó±Q=ëÝ£“Æ|Õaêú£¼êê+"¢Ú@¤xUðø/‰eh+÷‹Oë,còš=eꡯÜýGO+ʼfôî¦s¾¦rÕØ+‰f%AbéŠKßz*¨}V¡7PÔÖÞ"‘Èø©¤<ƉDT ™½ æf&pw²Eß 1uXg\¹“Œµ»Î#°zuï„àY»½ºw‚ OÓ3q÷A<²³s h`W^î®p°·;yвYcÄ%&!'7æfðòp…§»«ÒÚÄ&$ãaòcÈd2X˜›ÃÝÕ>^nŠC¼®u©×­t½ÊÁH¯î4nƒ!ë.-Ï·Y#Ä%$!7/õ¬¬Ð¼‰ØÙêlׄÄdÄ'=‚L–zV–eÒáYù½º? ’4ÍSWš§YÄ%$!??=ƒŠóÇ?LÆ{qD077…Ä¡š4ô†©©‰Q}S™}¨©¾šG]ÛLDT“UþÅŠ—«žß˜r¿ød0&¯Ù£1(ÕU®š%A¢yI¬§|%Qým¨¥Á¢®*šª‡"pE ‹A Xô,x„èÙ|(å)zyE‘ˆêŠ.‘“›‡GnCVP„7z¶ÄànMð×õ‡ˆKx¨råÇ¿µ/ŠrÓ0T4tk€¤øýô¤>}ý¶"ÿúÏbâàžps´Á“Ì<쎼…31ÿÀ¯ES®Þø½Ü1çßþp´«‡´Œ\8{G.ÝF¿fxšžeðº‚gíR| 2_ýûËAô®ûÄ© ŠeÂ:‡©CzÃÅÁS2±eÏE<`g[_c{Þˆù]ý\0ó­¾p´µÂCi~>q³L°§Z§Ž8qê|™yê”ólÝ}³ßêGÛz:g7ôF+K¬ y ‚ ài– ço>ÄÜ„o‹æ8uö¢A}£¼ŽŠö¡r;*×WéDï6ÕtÊǼŠ_Q„Ò•?íå–rš‚ÔV_A€Æ¾âØKDµQU>£¨ì•ªÏ€‰<«5¿!å¾Ò£³J°¨$¾Ò£³Æ:èxFѪWK.Cý-¨Ê/¸i*Hg ˜_P¤=ê†"qÙ[LÅÊW•EA@~Aq÷j"ªJ¡"‘ R3Š×ÁÖ 2 ·ÁÊ …rHÓs —Ëq+á –ýß)´ökŽ3ç/)ò~³ï2<<½ Û÷]A×ÖžîÑS>? úhØy Í›6ÁoÝBpè×¹ öž>hÔº4éÒ1Pãø”œ¢wÝÊ~8tÍ›4Á¹›·.6ÉdËNxø3†÷Ql¿·OC@|³ï º´öÔ Š4–¥kl€ï\…o‹f077G~A¬ëÕÃŽý—PPPAãhÔL~³:¶tǦ_/ª,«³o Íg@j«¯zßië+"¢Ú@ù™¿ì¼ü —õlÜÖ]®®u©§S®!åi*WC ¨$–ˆ¥·£š•Ä€¥¢òÛPu^Q4èÖÓ⫈¢â`QqUQSШtå"Ⱦh€ˆêŽÒã,?ŽJ?¶knfV&XôtwÃ÷¯bTÿ¶ølÊ«ËÜ{ø;þ¼Š§é*ySžæÀ»‘%RžfœÔ+yFMPüïÓ,šÖ³ÄÓ¬<€£]qoOƒ×¥k»Ê`ùz×­,5=MšY ¨H^2¶_ ÔT¾,_§ÖZ·ß˜ºê‡2²e053ƒ\™™qABßëŽFîö°47UÜ:T¿ž ‹ è›ÊëCmõ5v[‰ˆj23±âs‘¼x,9uÅ e;¶÷˜ˆ‹Ë‹E((4•«LÓ<õ4cÊ=uEã‹rJŸY,­«¶rÕX”ü+”‰–‚Då@Q ·j UºÅ2/«QûWTüöSQÉF¡¤<ÞþBDu&P”Ë‘——{â0¬g3À‰K±pp´G’Ú­ˆÎÎŽº…CçïÃ˹>Ú6qÁ¨m1ýß1fÅ*yÔCvv.D"¨Oæææ žfæÂÑ®ØX ;'vÖ–%YqcÖeÌØ`jf®wÝ2Y¾Þ²4Í37·@ÊÓl¸:ØÀ©A=äää–´…µÆºˆÅÅÑ\nn.í¬ ª¿¦Ú^%Ÿ…¹’Ó²àê`ƒN-Ýqõî}Œè_î@QÅ3%Ùy°43Å¿û´Òºœ®¾‰OH¬´>ÔÖŽ†öQm }AhyË- ýÛ(>+¯KW¹Å" ÁaéUÄÒIÕÛN¡,šBËO‹Í °çèYü}å•ȸø_‘ÊÛ|”ÓÌÌLáì$³“D)h”ôiOŸ¢  ff¦ptt€›‹“býºÖ¥©nS¤HJ~¤xž°t¾z>CÖ­¾Œ¶yš‚·Ç))H‘¦¢  ææpqqFl\¼Ê²YYÙˆKH„L&ƒ¹™9\]œŸ ·|muÈÌÌB|âCÈdÅííââ„øø‡Š¼†öMe÷¡¶újë+"¢ÚÆÎÚöýŒáoÀÄÔr•ace¿íF¿o =;¯F– …rœ;´ ‡v,Ý @ @€ OJ¦´’é)€Ì’ô¼’üÊ¿­(zžQÔö¼ØÔ b˜½a¥Ï)ÕVþ­uSK„ªyKµ6õmд¾AÇb_ßf:󸺹ÀÕÍEëúõ­K½n‰#$G½ù Y·¦e4ÍÓÄÉI'¥€ ìííT–­g]¾-TÛÇÞ¡ÞòµÕÁÚÆºLyŽåî›ÊêCmõÕÖWDDµMé¨ä´¬rÿ<Æã´LEYrµg kJ¹ššªÕŸG+åSþWEù~G‘ˆˆ^(Ÿk~ß°‰ˆ*&¯ }¾Cû~†§oW4°³1jù§éYHˆù}¾¼‚"Åq¹¦•«!HTþ,Ö’®3HôÜzzïa÷@"¢j"úêu@Û6­Ø5´o؇DD•«ž¥9ÌLMpdÿ/åZþ•¯£ °9j¿WXÓÊ”Þzºeo=}Šg·–Þzš »$Ÿ @!Œ¹õ”í$"ª>Ú´öã±¹†÷ ûˆ¨reçÊà`gACÞ*×ò²‚BdçÊj|¹z. – E"""""ª±RŸfÕùrµ¼0TÓO_8j }ëKñÛHîuDDDDDD5€o})UbyZ¯(î^ùÒR¥lq"""""¢j,1![Wj™b6+1P$""""""ŠDDDDDDÄ@‘ˆˆˆˆˆˆ(E""""""b HDDDDDD ‰ˆˆˆˆˆˆ"1P$""""""ŠDDDDDDÄ@‘ˆˆˆˆˆˆ(E""""""b HDDDDDD ‰ˆˆˆˆž»|™ Y™™ÈÌÈ0hÊÊÌDaaa…×{üøqø¶ôƒ£Ä pìØ1øµj­øn(có—GU¬£*Td;ªº ô­¯&÷‰iuÞ9R¥)•’ˆˆˆˆjx ˜Ÿè+—qêT¤Þ¼&&&èÒ-½_鋼ÜÜ ­wÉÒeزy^~ùeÀÒeŸbÓÆ ŠïާZ{.Z›·^P ¨/ræW5ÿ3òn"""ª-AÀ™3§ºd9,,,tæ•ååaÉâè?` Aâ_~‰%K–bÁ‚ù˜‚ î=àêæŽ€Àvرã;þ_@DDDuÖá#G`g×cÇ~{9zTåÜMù|JÓwåó,]牴ž–ÁK–,E‹¾ððôÂcÇ"++K¥.›6mF›¶þ89Të*Oý\XÓy£ò|méêu2f½ ËÏǤɓáéå ß–~øâË/˽êôGÒ†”þÅháÛž^Þ˜ýt¹Êò§NÂþ?öáÞÝ;8p ¦M›àÙ¥}õ«®o¿=ãLJàö­ÄÄÜDÓ¦M1þ½õÑVÞ„‰0{Ö,ÄÆ>Àï{÷àBÔŽDDDTg}½íkŒýàÀûcÆ`ÛWÏÎ5Õϧ´}7ä~üÞÞÞ*çÏ•µúΣ+« åú{{{ãñãÇ/´O*K•ßzúþûàï3g°uë$=LDbB<h|Ž0!áYPX –Œšxx_!‹¹yCå–€”Ç*­þ...ˆÕ˜æä䄸¸8Å÷ØØXH$’ ­oÌûïãƒ÷?ÀõkW!MyŒ÷ï©´•®úhˆï¿ÿ·oÅ`ÅÊ*·<Õ2™ ÿýïqéâE•óÆ‹QQعs§Ê{&*ã<Ñe¯]V©‹!·˜VUyÏk½ÎÎÎ*çÏÊŸ+ºúΣ+« å:ÇÇÇÃÉÉ©ZõI Kß@ekk ™L†%K—jÍ»pÑ"¤¦¦!-- ‹…BBB´æWœº8 éééÈÊÊÂáÃGðæ°á:ëdÌËlþýï·0kö<|øééé˜7¾"mèÐ!˜;w¤R)¤R)æÌ‹×_jpÛØÙÙáÎ;*óòòò`ii KKÄÆÅaÚôé×GSycǎí[·PPPAPTT"""¢ºæ—_~Eûöíáíí¥2ßÇÇøõ×_.S×y™>ïiÓ¦ãþƒ(,,Ä7ñÁرåÞ>cËÓtÞhLzy×ûÆë¯cþü¦¦B*•bîÜy•Ö.úΣ+ã\À³ú§¦bÞ¼ùxó7ª¤k] ¸uËf4oÞÁÁCÔ½‡Æ{¸K è߯ ¿V­qéÒ%, ÃØ±hCÆá³ÏÖâêÕhø¶ôCë6mñU&Nø°Òê?sÆ 4oÞ /½ÜíÚw€§Ò­ óç̓“³Úwèˆö:ÂÕÕó4¼¤G›I'¢÷+}T‚ÖðÏ×cþüðòòFpðtîÔÙàúh*oÀk0êÝÑðòöÁâÅaؼi3G """ªs¾Ú¶ cÆŒÑ|BÿÞ{øjÛוzž¨ÏÔ©SÐ¥Kg ú:<½¼1.$_Xîí3¶NŸ<‰~ý¢S—.l"ª“¼¼½áêê†Ý¿ý‚‰“§ÔÉ@‘ãQõø§;ªR‚\Žää$¸¹»³1ˆ¨NóiØÉIëìU4ŽDDÕ{<` HU®¨¨ˆ·Qgbb‚¢¢"ŽˆˆãAµxt&""""""ŠTýxxx°ØfDDDDÄ@±úq”8ÁQâĆ ""ŽiDDT§=··ž–N=zôÀ¯¿ü ‘HT&-UšÂ¨æ'ì§òóðð@bb"ëMDÏíø¬¦ãvM9¦«ß-akk‹nݺaÑ¢Eðöö.W™wîÜÁÊ•+qúôidggÃÏÏ'NÄÀkÍqµ2ÛM×+ˆêŽç~E122_ý5[šˆˆ¨’¤JS“¶yêé5Ibb"‘€ÈÈH4oÞãÆ+WY÷ïßǰaÃУGœ>>xõÕWqýúu•|e–‰ˆˆ@‡àééY¡m{m¦­ÞºÚª[·n¸uë–"ïO?ý¤ø|ëÖ-tëÖMo{QåS>.ë:¦k³AÀƛСCG¸º¹£­>‡ Ï}<(%‰ ‘HðÑG)Ž3ÆßÖ®]‹ &`Ô¨Q°··‡¹¹9±uëÖZ5Tv»i±€ˆb¥ú"<VV–˜4i’Jp¢ìóÏñdé2 Fìƒû<ø_XºlÂÃÃËä½rù "ÿú ß|ó5nܸ‰ÿüçmøõë××YæÚµkqûöm}»wïÆÍ›71`ÀÌœ9S1ø–þ«þØ‹/âÀHHH¨Ð¶=6ÓVo]mÕ³gOœ={””„ùóç#++KQ¿^½zém/"z¾ 9¦«Y_nØ€ ¢s—.¸ï.FŒxaaK°qÓ¦ª­{j*ÂÃÃѾ}ûrßNž<‰àà`ë¨ ãAe·›±íı€¨v•Lb?³h1yÂxA!UšRî €@H•¦ßþßv€°xqh™´TiŠàéé)nÞ¸.¤JS„ë×® //¯2åݺ#¤JS„䤇Šy17o©Ò!åñ#€ ‰tÖ­¡@¸¥˜u¡L½&&&Z·Kß¶ß¾uKg¾Ç’‚££C™e5Õ­QÆFç3¦mÕëkȶ;=¸wWøø£ÉBB|¼ ÌÝÝ]¸ÿ¾âû½{÷„öíÛ+¾¿öÚkÂ/¿ü¢’–““#èÓ¾}{áîݻӅ{÷î)¾ß½{Wh×®JÔ)Ïswwž99Ye^y·íyµ™¦zëj«ãÇ3¾üòK¡M›6Â÷ß/‚ „„„4¨½ˆê¢?š,äWÚx«k¾¾|êc€··—@¸pþœ*Mîݽ#||¼Ÿûx >µlÙRˆ‰‰)×ñÍÛÛ[(((ÐÙ5}¯ )èŠ_Y-“ɰdéR­y.Z„ÔTÕº…„„¯"mkkk x«7oe¼¼ 44©©©HMMÅ¢E‹0tèPEšH$ÂÔ©S±iÓ&L:U劲.Æ Ãüùó‘””„ŒŒ „†>ëçÁƒcáÂ…J¥J¥X¸p¡Ês,~~~ؼy3rss‘œœŒY³fµ=¶¶¶¸{÷®Þ|åݶçÕfšê­¯­zõê…ÐÐP¼ñÆŠ_š0oÞ<•gRˆèÅ2æ˜!ãŠÇ’ÐÅaHOOGVV>‚7‡ îã²ÌÌLlÞ¼Mš4)×ñíã?Æ—_~‰ï¾ûOŸ>E~~>._¾¬ò6К2xq÷SEÛMŽD Ÿ›Ž;bÚ´ÊÌŸ5s&¦N™‚ÿýü3¼¼}ðÛîݘ3{6>úhês©GHÈ8,^ŠK—.Á¯Uk xm ôïW&_xøçhÞ¼9F¿7=z¼„Ž:Vh½[·lFóæÍ<AÝ{¨¼Õ è߯ ¿V­qéÒ%, ÃØ±¯"m;ã“O`gg‡öí;TÉ6wêÔ ½{÷FçÎaoo3f¨¤›˜˜ Q£F6l˜Áe~üñÇhÖ¬úôéƒ.]º¨ ²³gφ““‚‚‚•ÁõêÕøóÏ?áëë‹àà`tïÞݨíùðÃ1`ÀƒöòlÛój3MõÖ×V={ö„T*Uœ0#%%={öäQ–¨š0ö˜2Ÿ}¶W¯F÷¥Z·i‹ˆ¯"0q‡Ͻ®¥oõðð@»vípöìYlÞ¼¹\Ç·FáÇÄñãÇѵkW4oÞóæÍS pjÂxpþüytìØ±ÊÚMŽDuKé‹lJ?‹˜Lž0>/|Ã&¤¥JÙBUÌÐD®)?œ¬.3#_„¯Ç´gÂÃÓÓ¨eß{ï=cÈ!µ®ßŸ×¶Õæ6#ª >™6+V¯EFzzÛöŠŒµùø¦m»† †iÓ¦)~f‚ãÇe‰ ñˆØº_lܼ€ @.€lž”L©JŸ3JÒsKò( GñKÎ`Ên¡êN.—cçÎxðàÌm«ãmFDjãñMßv)ÿ.!ÛˆªEªö¼¼¼àåå…Í›7+Þl[J×m<‰Z^PT¶­6·qLÐv|ãvÕ½v#"Šu†¡·’Ö´[N+BWðRÓ›çµmµ¹Íˆ¨n«­Ç°ç½]<ö‘±ø'%ªr&&&ŠŸ!"ª«ŠŠŠ`bbÂñ€ãq<¨–ãEªR"±®®nHzøADuZìƒpus¯³Ç"¢ê=0P¤*enfŽnÝ»ãÀŸûp+æ¦â·%‰ˆêŠ¢¢"ÜŠ¹‰ÿîüý €L&ãxÀñ€ˆ8T»ñ€Ï(RÕžX˜ÃÛ˯ „?öîAò£džQbbbWW¼6p7n‚œìlŽˆˆãAµ(R•³´²„¯ŸÚøðÍkDT'Éåräçç×Ù ‘ãQõ(R•²<dy26ÇŽDDÕÿ|GDDDDDD ‰ˆˆˆˆˆˆ"1P$""""""ŠDDDDDDÄ@‘ˆˆˆˆˆˆjI ˜/oÌ_°€½@D<¶1PfÍžƒ~ý^Å’°0öñØBDDDÄ@øþ»ø*""‘He¾£Ä Ž'ˬ\µ îžøþûê\G©·‹®vªÉõ­îÛEÕ-DDDDgZÕÁƒ6©ÒË®\µ ?ýô?‡ Š<¥·”}»cÚµo7wôxé% :·wëÖÌ_°þþþ¸~íöîÙƒ}ì×ÛN†®ëýbïž=¸~í*0wÞ>Þ¸¥²Ì­[18:¢  ®n›7àää¹\'gˆD"HS]öµ«ÑpssS”­\޶çˆ|6BA~>öïÿ¾-[ÂÂÜ\oµoßbcq1* >>Þ€±±hß¾ƒÎvÒ·®ÒüšÊmÔ°!.\(¾âˆ„„ܼqÎÎÎHNNF«Ömàåå…Ë—.–»M ]yú¿<íLµ -Ü版ˆê²Ä„xDlÝŠ/6nÞ@ @6€ OJ¦T¥Ï%é¹%ù €tE±ô¯ãÊ“6&:tìG‰7i ˆO(“Wâè033SÌsr*>Ñ‹‹7UùÖ/cÊvssS)[¹mæÎ™‘XŒÞ¯ô——7^éÓ'NœÐ¹LBb"ÀÓÓC1ÏÓãÒÖ¥©ÜÒu@rrrq[J$*í—””T)m¢oýåéÿò´3ÕN<¶UŽj멇dz¿Þ+Ÿü¥<~T­Ë€q¸{ç:xóæÍÅåË—1.d¼î@ª4xJH,ùkÖ®-óáÈ‘ï tq.\¸‘H„N:bqèb½u*,*ÄÖ­ðkÕ>>>˜öÑTüþûï:—3t]ú÷Ãk"66ÎÎÎX†±c?P¤Ïš9ò"9~üé'lÜ´ ®®®˜3{6>úhj¥ô½¾õ—§ÊÓÎT;ñØBDDDT9ªôe6ôâO ùû†DDDDDµK­y™ U_ ‰ˆˆˆˆˆH…)› nà-§DDDDDT#ÅßwÿÊ¡jmPðP6U{—n'áçã1ˆK~R§¶ÛD,‚§s¼ÞÓÍݸ#Õ–@FË^¡jéÛ¯#ØTíÅÄJñõ¾+èÚ¾5^yÙ bqÝyÂ@.ôHŠm¿_ÆèWsÑ¡ucîDDDµ%P$"¢òûáà5´óo»ŽÈΓ£øåeu‡­=Ú´ÅîÓ·(1P$"Òíñ£dܹ} éééµrûÄbêÛÚ"ññø¶µCf^Qík k;?ýôÜÜÜ™™‰¨¨(lÛ¶­ZŠ¡¡¡Ü+‰(–ÿ .ry­ß^s äËd:Û"QùUËWÁõìÙÇŽƒD"Á±cÇ B™I9Ý V¯^·ß~Ó§O‡——LMMaoo>}úàûï¿Wäóðð@DD:tèOOO€L&ÃŒ3àëë ___Ìœ92¥“2ëSžçáá7ÂßßM›6ÅôéÓ‘ŸŸ¯H/**ÂòåËѶm[4iÒ~ø!²²²´n‹¾òbcc1zôh4oÞ5Â;ITªs‰j{ X&Sqñ/'Vf™æÕªå[‰uµC]éóê6Åç,þôÓO6lŽ?®’vüøq 6 ?ýô“ÁA"=zÇ7(ïÅ‹qàÀ$$$V®\‰äädœû¨ß~û aaaH$prrÂ’%KðÛo¿µþÒå% ÂÂÂð믿*Òvî܉¥K—ÂÍÍ 666˜;w.öïß_îòŽ;†   XZZ¢~ýú˜={6Nœ8¡s‰(>ÿ)??Æÿo¼1 ¹¹¹•^¾‰Å·žÊäæä 7'W££ann &jÍ_]':ÓM*(6lÔä¹^í¬h~ŠDDTçEõ`144´ÜA"888¨Ü~ ‰‰‰HLL,“×ÅÅEå»T*…···â»··w™²ôñòòRùœ’’¢øžœœŒ—^zI´è-_Wy.\ÀСCѬY3xxx iÓ¦HKKÓ¹Du5PlÔ¸©Æ©"'ËÚ–_²tF¿; !!ãº8Ì eŒ½¢(èØ^å¶H$X³z5Ž9¢˜gU¯ÂÃÃÑ´Y3Ô³¶VÌSNˆˆ@ __ØÚÙ¡s—.¸råŠJ >p”H‚¼¼ûì3ÄÅÅ¡°°ÙÙÙežÔdðàÁX¸p!¤R)¤R).\ˆàà`EºŸŸ6oÞŒÜÜ\$''—œÐ¨ Ejj*RSS±hÑ" :T‘6räH̘1±±±(,,DLL >üðCuÒU^^^,,,`aa¸¸8Ìœ9“{;Õí@±Wtš4kï؉—zöB‹–­0hðܸqCg~hÒ¬š4k¡˜_XXˆÕkÖ¢cç®hÕÆS¦NCVVV¹—Ñ|ë©0ðÙ¾i fÌœ…^½zª¤¯X±ŽGËÀúõëàæî†zÖõ0uê”â+Š%ÿ}ÿÃX³v Ü=Üakg‹•+Wh-gÕª•8I q’`Õª•ØõãŠô QçñòË/ÁÒÊõmë#4t9bð3Š&%o=Õ×ߘ?"#OªôŸ¡í/“É0sÖl´nëÎ]»akÄW:÷'}ùíï&ÍZ`ËÖtêÒ ­ÛúcÖì9ÉdŠô¸¸8Œ 6þhÙª Þ{ÿH¥REznn.>™1KQŸ-[#*´ÿñ’DD _kkë -ïé鉽{÷"11C† A“&Mйsg|óÍ7عs§ÎegÏž '''!((...*ÁàêÕ«ñçŸÂ××ÁÁÁèÞ½{™2:uê„Þ½{£sçΰ··ÇŒ3i“&MB§N0|øp4iÒ'NÄ€tÖIWyk×®ÅâŋѴiS 6 ;väÞN Ë(ÀÙ³g±kç¸xá^íÛóæ/ÔšÿŸ[7ÿܺ‰nÝTÌß´y ®^»†Ý¿þŒ3§OÂÂÒ+W­)÷2o¹4äš§âci}X[×GëÖm‘••…ðÏÃUÒ]]ÜÊ,£ü¹½â»•e=*¾'''£¡OC­ëVþìãí£øîãíƒG)¾Ÿùû,úôyÎN.°¶®''—âÛC5”¥i*nÃú[}Qþ¬¯ý?[ÿ9RÓÒpìÈaìݽÿ}Fçþ¤/¿±ý çΟǾ½»qìÈaH¥R¬[ÿìvß±!ã1úÝQ8û÷)œ9}6²OW(Ò×­ÿ™™™8~ôöí݃ QQªE"¢ÚCT2•~0™Ï³Ž¦b‘ÎþÑ·?”¦ëkÿI&"lÉôyu¬­­1úÝQø+ò¤Öòõå7¶¿ 00ÁCßDNNú½Ú'LPä ]„U«×â£iÃÅÅ£ß}þyàYý'NÀâ°¥èÓ·?¬­­ñΈ·qòÔ© Õ‡ˆˆj¾Ì†È@|™M͵ÿ÷=hX'¶5òï‹xôäççWëzÚÚÙ!#=ý¹•¿ã‡ŸÐ£k»ZßßmÚ!úòÅJ+ïþý˜0i2öïÛ[î2¢/_âËlˆˆª_fCDTNuå–8qé_«÷öf¦?Åó|ÎÍD\wú¼¢Û¹zÍZ„Œ‹ü‚¬Y»½{õä-¤DDÄ@‘ˆ(ÖªƒºD¢:ÿªSŠsssÿ‚‡"??/¿ü>Â@‘ˆˆ(ÅÚ ‰ØÝu&P¼u¾ÂÛùöþ·ÿóï:ùÿ iǽý IDAT1P$"†Šub+Mø.k¥v`°CDDÄ@‘ˆHW˜XG®ˆD¼žXÚ¼*FDDÄ@‘ˆˆ"±Ï‰ˆˆ(VoHLLdCU7¯_¯3Û*“å±ÃëXŸW7ûßÃF "ÒA,ÃÖÎÍš·€ÄÉ™"Ñ‹2âÝ1uj{33ÒÙßDDDÕ”\.Ç£ä$üù;t€]{еÅ;w°råJœ>}ÙÙÙðóóÃĉ1pà@6ƒ'b_édccßV~¸yãºt b XÜ¿Æ ôiÓ°jÕ*X[[ãúõëØ´iE¢jî×ÿýÈF ""¢nè›Ãak×éOŸTËú1P,‡µk×b„ 5j”b^`` ¶nݪ’oÇŽøòË/‘œœŒ-Z`ݺuhÕª 66‹-ÂéÓ§QPP€   ¬_¿‰@ñ3ŽË—/ǦM›””„ÆcÅŠxðàÂÃÃ-Z <<¾¾¾ŠeæÍ›‡-[¶ ;;ƒÆŠ+`nnÎN#R2jÌX6½0ß~ ø-Ýr¹œbmqòäI,\¸Po¾Ó§Oc÷îݰµµÅ–-[0sæLìÛ·0zôh,]º›7oFAAÖ¬YƒÅ‹ã‹/¾P,‰ŸþöööˆˆˆÀÈ‘#ѳgOüøãŠy3fÌÀÞ½{Ëœ9sGŽL›6 «W¯Æ¼yóØiDjòóel""""-øÓÌåðäÉ888èÍ·|ùr¸ºº¢^½z?~<®]»¦H;vì‚‚‚`ii‰úõëcöìÙ8qâ„Êò«V­‚»»;¬¬¬0vìXdeeaÅŠ*ó¢££U– ƒD"D"AXX~ýõWv…WËÁÞÞiiipvÖý*Û (>[YY¡°°PñýÂ… X¶l®]»†œœe(ÛÞÞ^eyMó”Ë///•Ï)))ì0" ø{DDDD +U÷îݱwï^¼ÿþûå.#$$‹-B¯^½`ccƒ¬¬,ų†† Ï<Eªù¢ÎŸE—n=PPÏÆ ""ŠÕÍÇŒ×_4hêÕ«‡7n`ãÆe^h£M^^,,,`aa¸¸8¬X±¢Rêеk×-Z„¡C‡²Ãˆ4GŠg'&&¢÷+}pøÐA•+ôD5aÿ%""b ø5jÔ?þø#V®\‰eË–!77­ZµÂ„  .cíÚµX¼x1ÆŽ WWWŒ?{öì©pÝ:uê„Þ½{#;;ƒ ÂŒ3ØaDϳ5ŸhOÿø|¶v <==yêYÛ ';‹FÕ~ÿ}Ñøÿ Å:¯Y³føê«¯´¦'&&êœ×¿ôïß_%}̘1/¯mÞ„ Œ X‰ê쉶–ù;wþ 1]ý»\.Ç;#¶mÛböìÙlPªû¯¡*sÿµ¶¶A¶RpÈkDD ‰ˆjÒ›úódeej̳gÏAûö0}ú´~uÇÆ¦¾J]©ní¿Êû°H$‚ 5j„>}^Á”)S4>«®mÿ-Ͼ”••©RŸÿ%"b HDT“Ï´UOv33tçQË¿rÅró«ËöPÝÚ•÷áìœÜùç|÷ý÷èÚµ>ooÃ÷ߊîK܉ˆjþŽb-¢éÖT"Òv.+(&õïê“rzaa!.Z„†ÃÉÙïŽÌÌLEºM}[DD|…V­ÛÀÁQ‚Ž:ãôéÓøî»ïà{Gt µk׌*󫯶Áϯ•bù+W¢i`Sß6õmun§š?iÚÕ÷ÑzVVhÛ¶-V­\‰Q£FbI؃ö5mûÒýû÷1lø[pquƒ£Ä C‡¾ŽÇ«ìŸšêqààAtìÔöŽðók…íÛ·³9qâÄIíxÎ@‘ˆ¨–Ы׬Á¥K—ùîÞù–––X°`¡JÞcÇŽaÿþ?‹aÃÞÄëo¼‰bïÞ=HˆÃ!C0yÊT£ÊŒŒŒÄÁƒ‹Aƒaò”)éOéO‘‘þ”ƒ/E•éÝQ£pìøqƒö5mûÒ°áoa„qïî]ܽóš6kŠÙsæj\·òçqãB0wîdmÝîD•NÛ§ù,ã0V¬ æ¨P¿´÷ã,õñcG @'>;Š—^^…»Õwpø¯iX±*?”³chÀ¹V¨ÁÌÙs ÓV²3ˆˆ°Ïƒß ¨®¾ƒœ¬/¡\º¬Gõ••– e÷n$%ï: @-€{ªÜz°éZìW?H¯}_ @ÀE"¤¸²Aœ¿DDDÇ@‘ˆøE›ˆó—ˆˆˆ"¿hç/Å^#“ÉšVVVÖí:»[–ˆøE›ç'¼a1PìZt ðˆˆˆˆˆˆ"=Tcc#âã㑚šŠ{÷îaÑ¢EHHH€µµ56mÚ„iÓ¦á_ÿõ_…üùË_ðÕW_aß¾}BÐÙ2í¨>"ê9®(1P|ä’’’ V«‘™™ üÇübcc‡·Þz ÿöoÿ†aÆá_þå_pôèQ¤§§ã¿ÿû¿±}ûövW&;ªˆz&íÀ>vÅG/55€½½= 22 .D\\žxâ ìÚµ Ë–-C~~>Ž=Š£GÂÌ̬[õQϼÈN ""¢ÇfïÇ) ‹òòrÌ;WtÌÄÄDØ=z4~ÿûßã½÷ÞÖ-[0zôèÕGDDDDDÄ@±Ÿ³³³Ã±cÇ0vìØvÓ¿ùæüå/ÁÿøGlÞ¼‹/†““S·ë#"""""zTLÙ½#00ááá(**‚^¯‡F£J¥Ü¿ëׯǎ; T*±}ûv¬Y³uuu[[[\¿~½Óõ1PÖ­[www@.—#44J¥ðÿþßÿêU«0sæLÀÂ… ñ / 22 R© T*EÏhì¨>"""""¢G‰—žö@Ë;•šššbýúõX¿~}›|ÿõ_ÿÕæXpp°°ÿꫯâÕW_GðÔGDDÔŒ=˜Ï &"¼¸¢HD4È455!88ï¿ÿ>;ƒˆˆˆ(õ…ŠŠ DFFbæÌ™pttĤI“°|ùrœ:uª_´/&&nnnxíµ×8XD]Ðò'"DD ‰ˆ~rrr`bbÒé-''§Sõ–——cÙ²eJ¥HOOÇõë×qîÜ9áOúS¿8÷¨¨(„††rE"¢–æÍ›‡ììlH¥RdggÃ`0´ÙZ¦Ï›7¯Sõ&$$àÅ_ÄÆáàà333H$,X°Ÿ~ú©O&“!%%Ó§OÇøñãõõõ‡««+\]]úúzQ™ÖZ“ÉdHNNÆÔ©S¡P(°qãF444鈋‹Ã”)S —Ë¡R©PSSóÐs1V_QQ‚‚‚àââggg,_¾Z­¶Ãs¤GÇØx444àõ×_‡B¡€››vîÜ)*o,½½ñ46§N:ooo8::ÂÃÃèTZGôz=¢¢¢ðôÓOã©§žÂG}$¤õÆghß¾}ððð€££#-Z„«W¯ŠòÉd²6eZöËï~÷;dddˆÞ£¬¬ Ó¦MÃÝ»w9Q‰ˆ"Ñ@ÓÓÓáïïßfÅ0''þþþHOOïtØüå7  Syóòò™™‰ÒÒRÀÛo¿òòrœ={gΜAYYâãã»tN¹¹¹ÈÊÊBnn.*++‘ ¤%%%A­V#33W®\……bcc»]_PP‚ƒƒ¡V«¡V«!—ËÝá9Ò£cl<âãã¡Óé››‹“'Oâܹs¢òÆÒÛOcsjÆ  õk×pèÐ!äååu*­#‰‰‰(,,Ä_| .àæÍ›BZo|†ÎŸ?ŒŒ @©T"""Böšÿl}ƒŸ–ýòꫯâ½÷ÞCSS“þÞ{ïaõêÕ°±±áD%"ŠDD5XìnUUUJ¥¢cÍ+­W3¢¢¢0jÔ(áõ‘#G©TŠÑ£Gã­·Þ‘#GºôþÍå¥R)bbbpøða!-55Û¶mƒ½½=¬­­‰'Nt»¾ììlxzzÂÂÂ666Ø´iNŸ>Ýá9Ò£cl<>,š_111¢òÆÒÛOcsÊÂÂÐétÉdxçw:•Ö‘ôôtá=mmmÕ«Ÿ¡¸¸8Œ;Æ ÃÚµk‘ŸŸo´LË~™7o¬¬¬„UÅ7n ''«V­â$%"ŠDD5XŒŠŠêv#GŽ]î´¿cÆŒ½Öjµ˜0a‚ðz„ mê2ÆÁÁA´_YY)¼.//Çܹs… ÕÍÍÍhýÕwéÒ%øùùaâĉÉdP(¨ªªêðéÑ16•••¢ñl9×:“ÞÞx›S)))8}ú4.\ˆÙ³gãäÉ“JëHEEE»më­ÏЈ#„}KKKèõz£eZ÷Kóªbcc#Þyç„„„ÀÒÒ’“”ˆ( Ô`1::ºÛA"<ûì³HKKëVY©TŠ’’áuqq±hõÆÌÌ µµµÂë[·nµ©£eùÒÒRÑê¦._¾,®eeeF/ í¨¾5kÖ`åÊ•ÈËËCii)4 'ÓcbliÒ$ìÚµ µµµ(//Ço¼Ñ¦Ž¨¨(èt:èt:lݺ~~~BZ`` ÂÃÃQTT½^F•JÕa›:ª¯®®æææ077Gqqq§¿èÓ£al<|}}…ñlž_]Io±9‚ÂÂBèõz Ñê\Giñ÷÷ÇæÍ›qóæMTWW‹.=íÏPGlmmqýúu£ùLLL°aÃìܹ6lÀO<Á JD ‰ˆ2++«•?~<Ž;†²²2øúúB.—ÃÃß|ò RSS;,»iÓ&Œ=žžžðôôĘ1cD_dðùçŸÃÕÕ>>>ðòòjS‡»»;¼½½ááá‰D‚ððp!mݺupwwG@@är9BCC¡T*;lSGõ%&&":: …þþþ˜1c'Ðcdl<"""0|øp¸»»ã¹çžÃìÙ³»”ÞcsjñâÅX½z5 bcc‘””Ô©´Ž„……aâĉX°`fΜ)úíoo|†:¢R© T*;õ<Å!C†ÀÙÙþþþœœD4 ™<Øš÷M Y²¶îƒw¢J§íÓÆ|–q+VsT¨_Úûq –úø±# ŸÅK/¯ÂÝê;8ü×´_ìß32™¬ÝßBö—úˆ“•+WÂÇǾ¾¾ì "j÷{¥ß ¨®¾ƒœ¬/¡\º¬Gõ••– e÷n$%ï: @-€{ªÜz°éZìW?H¯}_ @˜q˜ˆˆˆˆzGSSRSSñÏþË–-c‡Ñ€Å@‘ˆˆˆúŽ.ë+ÜpppÀ®]»`jÊ_øÅA÷/Ç"¢þ¦·ÿ^âßsôK˜Çl?Q÷𿺈ˆˆˆˆˆˆbo’ÉdØ»w/fÍš'''x{{ãâÅ‹HKKƒ——±hÑ"h4¡LQQ‚‚‚àââggg,_¾\ô@຺:lذ …nnnHNN]ŠÓØØˆ¸¸8L™2r¹*• 555 """""b Ø_œ9sDAA|}}ˆ¬¬,¤¥¥A£Ñ`éÒ¥¢[Ê!88jµjµr¹ÑÑÑBz||<îÞ½‹ . ++ /^½_RRÔj5233qåÊXXX 66–ADDDDD û‹øøxŒ7–––FMM ¶oß.:¦V«…üÙÙÙðôô„……lll°iÓ&œ>}ZHÏÈÈÀÖ­[1jÔ(Œ5Jô0aHMMŶmÛ`ookkkDFFâĉ"""""ê¼™M/H$¾¥¥e»Çôz½ðúÒ¥KˆE~~>îß¿011Ò+++1~üxáuË}(//ÇܹsEÇZ–'"""""ê ®(>kÖ¬ÁÊ•+‘——‡ÒÒRh4 !]*•¢´´TxÝrìììpùòe”•• [ëL·½ë;öüóÏãù知¯ZµJØ·´´Ä|€>øðÝwß!55õçèÞÔëׯÇúõë9DDÔm2™¬ÃÄK'"¢_.®(öSQQQ¸sç***Å‹³Sˆ¨_ijjBpp0Þÿ}vEê ãLJ——¼¼¼0|øpÑs‰hp¨¨¨@dd$fΜ GGGLš4 Ë—/Ç©S§úEûbbbàææ†×^{ƒE}F&“±ˆˆú/=í§V¯^Õ«W³#ˆú¹œœÌŸ?¿Óù³³³1oÞ<£ùÊËËáëë‹€€¤§§ÃÞÞwïÞÅåË—ñ§?ý ÞÞÞýÜ[ßh‹ˆˆˆ~9¸¢HDÔóæÍCvv6¤R)²³³a0Úl-Ó;$@BB^|ñElܸ033ƒD"Á‚ ðé§Ÿ ùd2RRR0}útᙫõõõ‡««+\]]úúzQ™ÖZ“ÉdHNNÆÔ©S¡P(°qãF444鈋‹Ã”)S —Ë¡R©PSSóÐs1V_QQ‚‚‚àââggg,_¾Z­¶Ãs¤¶ŒõcCC^ýu( ¸¹¹aç΢òÆÒÛcsáÔ©Sðöö†££#<<,š111¢òÆÒÛcsÁÂÂÐétÉdxçw:•ÖUÍùyóæáïÿ;àСC077ÇÑ£GÿûßEŸÍ¸¸8Œ;Æ ÃÚµk‘ŸŸÏ‰EDƒV¿ûâG_”pT¨_²dP‚ÅÐÐP|øá‡Ý `äÈ‘Ðjµ;v¬p¬y¥u 8fÌÑk­V‹ &¯'L˜ º±3Dû•••ÂëòòrÌ;W”ßÄĤÛõ]ºt ±±±ÈÏÏÇýû÷Û­¯õ9R[Æú±²²R4-çHgÒÛcs!%%ï¿ÿ>akk‹èèh,\¸ÐhZWu4ç===±yóf!P|ï½÷ðÁàÅ_D^^Þ}÷]¡Üˆ#~þ;ßÒz½ž‹ˆ­~·¢h0pãÖ?7¢®‹ÑÑÑÝàÙgŸEZZZ·ÊJ¥R””üüŸnÅÅÅ¢U 333ÔÖÖ ¯oÝºÕ¦Ž–åKKKE«›vvv¸|ù²pù_YY™ÑKB;ªoÍš5X¹r%òòòPZZ F?t]f¬G-‡–ûIo±¹àææ†={öà믿ƶmÛD—rv”Ö›sÞÊÊ &LÀ±cÇ`aaçž{z½™™™pttİaÃ8yˆˆB Ød0pãÖ/7¢®‹555ÝàøöìÙƒwß}ÅÅÅÐëõ¸wï^›ß@¶gÙ²eزe ´Z-´Z-¶lÙ!}Ò¤IصkjkkQ^^Ž7Þx£MQQQÐétÐétغu+üüü„´ÀÀ@„‡‡£¨¨z½*•ªÃ6uT_]]ÌÍÍannŽââbþ.¬›Œõ£¯¯¯0Íó¢+éí16BBBPXX½^ƒÁ Z¡ë(­#¶¶¶¸~ýz—æüüùó…ßÿþ÷€ßýîwxóÍ7»tÇb""ŠY{w 䯭?lD]aeeÕ£òãÇDZcÇPVV___Èårxxxà“O>Ajjj‡e7mÚ„Ñ£GÃÓÓžžž3fŒ(LHHÀçŸWWWøøøÀËË«Mîîîðöö†‡‡$‰èY®ëÖ­ƒ»»; —Ë ¥RÙa›:ª/11ÑÑÑP(ð÷÷ÇŒ38ºÁX?FDD`øðápwwÇsÏ='Üí³³éí16/^ŒÕ«WC¡P 66IIIJëˆJ¥‚R©]‚mlÎÏ›7Z­V}||PYYÙ£ÿÌ!"ú¥3y°5>dmÝîD•NÛ§ù,ã0ªÇ.â¨P¿d[þ–úø±# ŸÅK/¯ÂÝê;8ü×4¬XÌNé€L&ÝQ²¿ÕGDD4Ðíý8~/ ºúr²¾„ré²ÕWVZ‚”Ý»‘”¼ë8€zµî¨pëÁ¦k±_ý ½öA~=€FM @?¼™ WnèaÖÿÖ IÇÿÉŽ """"zÄúa ÈAù¥yu©>øìŸœDDdTë»ú¶Ä•i"¢A(”›†X™»Ë8Û ƒµÅüØhÀÍ[õ¸r£7*îÚ õÚ¿8ãýc7DÇZ¿ óƒh ëí/ãürOœ/DD {l \zjma†õ‡«%w‘~þÿPS׈¡f¦'1‡›óp|ÿýA=©åòÒd""""¢A(öÿN›å*Á×EÕ¸Px[8VÛØˆëå÷q½üçÕÄ>Oât¾¿‘‡¥ÞÍøf¦&˜?EŠ_É~º#â·e÷­ÖBßdʼ›ñ½èýZÛèó$Î|S…gäÃ1ÔÌß–ÕàË+Z4>(obx>5OO°Áf¦¸^~'¿Ò¢Aß$ªÓb¨)V>ç€O¾,AÝM¢ãAÞØ“U‚z}S‡uµ>¿f¯/{DmnÞ755ÁœI#1ÉÁ¦&&È-¼…ËßÝ ·zó= R ˜šš D[‹Ïó*q¿¾q@Í"""""н(öÿHÀÙnöç”vª­c%æØ—SŠÚĺ IDATÁÎì§FÂÚbþt² |ƳŸ’àt¾®Ã>hyL6Ò>õÓƒ…Ÿÿf»Jð?W*ïá"Á˜á?½gýMðž"ÅœI#ñå•JQ}µõ(,»‡§mpñÚÏïÓŽ6((­AmC#fþÊx]­Ï/ÌWŽÄ#×ÚþY¿’`”ÍØ—]Š}f¹ŽÒ|=Æà”Z‹cÿ[‡!¦&˜í:ÏN…¿]þa@Í""""¢®ÿ=Gql–榸Wß(:æ+¶æcýµ÷[äuoS_kq¯¾÷ê‘¥ÖÂu¼µ¨Lë÷C«ý–åO}-.ÿ´£-²Ô•¨®Õ£^ß„ÓWu˜8ΪÝó¸üýmL}r8LLL``bb‚)NÃqù»Ûª«½ó3ÖþI6ÈRkQ]«GÝMÈþZ+¤}’U‚¢ÊZüØh@ÝM8óŽv–ÖÝ—Ñ`ÑïVëÔ÷ûN»_ß³!Ü­ý¹­±éßÞôÿ•ètwëDe­ÌÍðÃíZáÊŠÛf>DT¦½>hy¬âޏ¼•ÅÏå­-‡`Õ‚ ê×›UzTÞ©‡ó |Sr“lPª½ÊêºN×ÕúüŒµßÚ ·ëÚ½)ÍøQ–ðž2cG˜ã 3Óvë󃈈ˆˆˆb/—~_~O;Úâ\Îè9´>Ÿš:=F {U5 €áÖOà^]£¯É`€™© ~lüéw€–C‡´©GTÞJ\¾¦VO²ŠDAlG.Vaîd)®WÃ}¢'ò~èR]Æ.“m}ìníÌPu·¡Mžß͇“_Uàzy êl‚ù¦÷sé°?‰ˆˆˆˆ¨÷õ¿KO †~¿åäWbºB‚9“Faø03˜xbˆ ž3LtíÏ7ÅÕXèf‡aæC0Ì|»ÙájqµþÃízÌü•f¦&°¶‚%ÏŒiSç7;X5…åPS,t³C~Ñ!ýòõÛøíô±aõLŒ¶ ¿™ãz.×oÖÀÜÌÓ#РoÂͪÚN×ÕÞùÕý؈‘ÖOˆŽµÌ§¾qÏOK3˜›ýÔþæ4³!&Ð76áG}FX™aÉ3cög_nDDDDDƒïzÚ ·k~ÄÇ'ÿ‰g-EÐsN?]úÙЄ]-öç‹Î¡õùd©+°ä™±X÷[9à›âjœRWùŽ]¼‰eîö˜3YŠ»÷õ8W ÃS¶¢zŠ+ïcíóObè¦ø¦ø.²¿®ÒÏ~£…çS£8ol,Í ½Û€3Wµökna–N·ÇÓâ¶w¦®Öõþ½  «9c¨™)bþRÐ&_N¾ ÝìðÊbg˜øŸõ»x ÝÆÀßs<ªkÄß5U˜<Á¶Ã÷#""""¢A(ŒHàö½d\ø¿óD§~ÓæØz2.üßCËÞ¬ªÅGŸ‹ñ¿×ªD¯Ï}£Å¹o´ ´Ï\ÕâÌUm§Ï%ï»[ÈûîV—ëjïüþçj%þçjåCó56ðùår|~¹¼MÙ‚’j”T‹Ž]øV×áûQÏÉd2>äœ8‡‰ˆˆâ@Ç>"""‚DDô(õÃß(rëhc=Þ¾'ˆ¾ûî;còäÉprrÂ’%Kpüøqv u)P{œõ1H$"ê{ýnE±‰ßÈ;ôûóÙ DÔi7nÜ€¿¿?^ýuÄÇÇÃÊÊ W¯^ÅÎ;ñÛßþ–DDDDíâ]O¹qã]Oé,11!!!X±b$ †ŠiÓ¦a÷îÝ¢|ûö탇‡±hÑ"\½zUH+**BPP\\\àììŒåË—C«ýù·Ë2™ {÷îŬY³àääooo\¼xiiiðòòêÔh4¢2ÉÉɘ:u* 6n܈††XèõzDEEáé§ŸÆSO=…>úHH«¯¯Gxx8\]]áêꊈˆÔ×׋Æãas yõO&“‰VÍ‹‡µçaõu¤e¾††¼þúëP(pssÃÎ;9øDDƒ#P䯗žõ–³gÏÂÇÇÇh¾óçÏ###P*•ˆˆˆÒ‚‚‚ µZ µZ ¹\ŽèèhQù3gÎààÁƒ(((€¯¯/‘••…´´4h4,]ºááá¢2¹¹¹ÈÊÊBnn.*++‘Àëá â‹/¾À… póæM!íí·ßFyy9Ξ=‹3gΠ¬¬ ñññšÍ—}–••‰.56/Öž‡Õ×YñññÐétÈÍÍÅÉ“'qîÜ9>Ñ#`ò`kÞ70d}ÈÚº>܉*¶OóYÆah†xpT¨_rm¼€¥>~ìˆèÄgGñÒË«p·úÿ5 +VšswttÄõë×aföð_Èd2\½z#FŒÔÖÖÂÕÕEEEíæ¯­­…‡‡ÔjµP>??‰DHW(m޵¬S&“áܹsprrðó%²—.]â„í¦éÓ§#-- O>ùd›´ßüæ78xð œßÿ=üýýqùòåNÍÎÜL¦õ¼è¨=]½9MËüÏ<ó <(Ìï¿ÿsæÌáï‰h@Ùûq ü^@uõäd} åÒe=ª¯¬´)»w#)y×qõjÜP àÖƒM×b¿úAzíƒüzš€~øÅÿ|y gõÓôv 8‰UUU°³³ë0_s€–––ÐëõÂëK—.!66ùùù¸ÿ>ÀÄĤÍû´,ßÞ±–u€ƒƒƒh¿²²’Ö˜0aB»iZ­V”6aÂÑe¢Ææ@{ŒÍ‹ŽÚÓ•••¢¹ó(ÞƒˆˆúᥧDDÔ{¼¼¼pìØ±Õ±fͬ\¹yyy(--…F£é•ßí–””û¥¥¥J¥°°³³Cqqq»iR©TÔßÅÅÅ5jÔ#µ§'F-:—–ûDDÄ@‘ˆˆ:!,, ;vìÀþýûqûöm444૯¾Â+¯¼Òé:êêê`nnsss‹~¿ØQQQÐétÐétغu+üüxiwOøûûcóæÍ¸yó&ª««%¤-[¶ [¶lV«…V«Å–-[:õÛÕf¶¶¶¸~ýz—æEGíi¯¾ÎòõõæNó¹E""êggg¤¥¥!''³fÍ‚‹‹ Þ|óÍ. ‰‰‰ˆŽŽ†B¡€¿¿?f̘Ñ+msww‡··7<<< ‘HÚÜ솺þŸ'NÄ‚ 0sæLÑB7mÚ„Ñ£GÃÓÓžžž3f ÞxãN×­R© T*Eu›µ§½ú:+""LJ»»;ž{î9Ìž=›ƒODôô»›Ù ¦›LÐÀ²÷ãÞÌf€Ì7³é¯ºz3""¢_Ú÷Êþ~3®(‘ˆ»@¬©© kÖ¬ÁäÉ“ñÚk¯±=DDDXG— r噈ˆbŸþCdee…iӦ᭷ނ‹‹‹p<&&nnn ímîoí!"ê üòOœDD »,''óçÏïtþììlÌ›7¯Kÿݽ{ü1Ö­[‡/¾øBHoyW¶þ ¿µ‡ˆˆˆˆˆ~ùúåoçÍ›‡ììlH¥RdggÃ`0´ÙZ¦w6HlÉÆÆ*• ………€ÆÆFÄÅÅaÊ”)ËåP©T¨©©òŸ:u ÞÞÞptt„‡‡8 ¤µwÉLËc2™ {÷îŬY³àääooo\¼xiiiðòò‚££#-ZF#”1Ö"""""¢A(6‹éééð÷÷GNNŽ(-''þþþHOOïVü´¢˜œœŒÉ“'’’’ V«‘™™‰+W®À±±±Bþ 6 ,, ×®]áC‡——×¥÷;sæ <ˆ‚‚øúú"00YYYHKKƒF£ÁÒ¥KE·†7Ö"""""¢A(>,Xìi(“É “ÉàêêŠ?ÿùÏØµk 55Û¶mƒ½½=¬­­‰'Nå,,,PQQN™L†wÞy§KïqãÆÁÒÒÁÁÁ¨©©ÁöíÛEÇÔjµßX{ˆˆˆˆˆˆ•~3›–Ábhh(>üðí$–••Á`0 ¸¸aaaÈÏχƒƒÊËË1wî\Q^a?%%ï¿ÿ>akk‹èèh,\¸°Óï+‘H„}KKËvéõzáµ±ö Ú@±e°8þünÿ&±uÀåè舤¤$,Y²sæÌŽ;†±cǶ[ÆÍÍ {öì~†üã?u¢™jkk…ðÖ­[=>gcí!"""""zTLJCçÍ›‡ššš‰-ÙÛÛcÆŒ8r䎢¢"èõzh4¨T*!oHH ¡×ëa0D«“&M®]»P[[‹òòr¼ñÆ=n›±ö ú@øéÙ‡½í¥—^Âþýû±nÝ:¸»»# r¹¡¡¡P*•B¾Å‹cõêÕP(ˆERR’–€Ï?ÿ®®®ðññ——WÛe¬=DDDDDDŠÙ`:Ùöèûì³ÏâÙgŸ¬_¿ëׯo·¬|||ÚMûõ¯ÌÌLѱ+Vtø¾ÆŽ™ššvØ""ê¿d2"ODDš)»€ˆˆè爈ˆ(ýâUTT 223g΄££#&Mš„åË—ãÔ©S [á* E"¢~#''&&&ÞšŸ-kLyy9–-[©TŠôôt\¿~çÎCPPþô§?±ã‰ˆˆˆ"Q5oÞýôS!ŸL&CJJ ¦OŸŽñãÇêëëWWW¸ºº"""õõõ¢2­µ<&“ÉœœŒ©S§B¡P`ãÆhhhÒ‡)S¦@.—C¥R¡¦¦¦M·o߯ÓO?;wî´9>uêTܹsÇh]­Ï¯¹2™¬M››éõzDEEáé§ŸÆSO=…>úHH+**BPP\\\àììŒåË—C«Õr"E""êý`1==þþþmV srràïïôôô.=&èÔ©SèTÞ¼¼]8‡ÎÔÕúüŒ©¨¨K—.]Bll,òóóqÿþýÛNDD4qE‘ˆ¨‹ÑÑÑÝŸž›––Ö­²R©%%%ÂëââbÑŠœ™™jkk…×·nÝjSGËò¥¥¥¢ÕM;;;\¾|Y¸ü³¬¬L¸ìµ=«W¯ÆÿøGÀÿøG¬]»¶Ûuu†Š‹‹ÛM[³f V®\‰¼¼<”––B£ÑÀ`0pâE""zôÁbMMM·ƒDøÃþ€={öàÝwßEqq1ôz=îݻש»¦.[¶ [¶lV«…V«Å–-[àãã#¤Oš4 »víBmm-ÊËËñÆo´©#** ::[·n…ŸŸŸˆððpA¯×C£Ñ@¥RuôÖÔÔà“O>••~ýë_w».°µµÅõëךîïïÍ›7ãæÍ›¨®®]zZWWsss˜››£¸¸œ°DDÄ@‘ˆˆú†••UÊ?ÇŽCYY|}}!—ËáááO>ù©©©–Ý´iF OOOxzzb̘1¢`0!!Ÿþ9\]]áãã//¯6u¸»»ÃÛÛH$ÒÖ­[www@.—#44J¥²Ã6­^½[¶liv§.•J¥RÙîÝ[ ,, 'NÄ‚ 0sæLQ¾ÄÄDDGGC¡PÀßß3fÌàd%"¢_“[ó¾)€!ëCÖÖ}ðáNTéúöVߟeÆŠUÁê—ö~œ‚¥>~ìˆèÄgGñÒË«p·úÿ5Ïô™LÆØ=ä{¥ß ¨®¾ƒœ¬/¡\º¬Gõ••– e÷n$%ï: @-€{ªÜz°éZìW?H¯}_ @ÀEêä—½T/õ ÅG¤©© ÁÁÁxÿý÷Ù"""""PøxŒnh¹fee…iӦ᭷ނ‹‹‹p<&&nnn ímîoí!¢_>^vJDDÄ@qÐ~º{÷.>þøc¬[·_|ñ…ÞòîxýAkõ_¼ô´‡lll R©PXXhllD\\¦L™¹\•J…šš!ÿ©S§àíí GGGxxxàÀBZ{¿ÙkyL&“aïÞ½˜5kœœœàíí‹/"-- ^^^pttÄ¢E‹ Ñh„2ÆÚÓZCC^ýu( ¸¹¹aç΢ô®Ö§×ë…§Ÿ~O=õ>úè#Qú¾}ûàáá!´ýêÕ«BZQQ‚‚‚àââggg,_¾\ô°ïîô‡L&Crr2¦N …B7¢¡¡™ˆˆˆˆˆbï¹{÷.’““1yòd@RRÔj5233qåÊXXX 66VÈ¿aÄ……áÚµk8tèòòòºô~gΜÁÁƒQPP___"++ iiiÐh4Xºt©èöóÆÚÓZ||ùd»ýxõêUŒ1¢Ý¶·V[[ ¨Õên÷‡L&ùsç„ó»qãüýýqéÒ%£ãÎÇc \|<õ'áñübw£¬ ƒÅÅÅ C~~>P^^޹s犣qa?%%ï¿ÿ>akk‹èèh,\¸°ÓïÛ€¥¥e»Çôz½ðÚX{Z«¬¬„ƒƒƒðz„ ¢ô®ÖWQQÑ¦Ž–šƒÄöÚ~éÒ%ÄÆÆ"??÷ïßo÷½ºÚDççàà€ÊÊJNh""""¢(ö€‰‰ ‘””„%K–`Μ9°³³Ã±cÇ0vìØv˸¹¹aÏž=0 ÈÎÎFXXþñü4ff¨­­ž[·nõ¸ÆÚÓÚèÑ£QRR"¬¸•””ô¨>;;;·»¢hÌš5k°uëVÌŸ?ÖÖÖ¨©©««kû¤åù•––B*•r2µÀß(ö{{{̘1GŽA`` ÂÃÃQTT½^F•J%ä Aaa!ôz= ƒhµkÒ¤IصkjkkQ^^Ž7Þx£Çm3ÖžÖ|}}N­V‹-[¶ô¨>lÞ¼7oÞDuuu—î¾ZWWsss˜››£¸¸XôûÅžh>?N‡­[·ÂÏ—“1P|^zé%ìß¿ëÖ­ƒ»»; —Ë ¥R)ä[¼x1V¯^ …BØØX$%% i øüóÏáêê xyyõ¸]ÆÚÓZDD†www<÷Üs˜={vê Ãĉ±`ÁÌœ9³Ý;»>Lbb"¢££¡P(àïï3fôÊX¹»»ÃÛÛH$mnvCDDDD4Øñf64¨´wàÎâÍl.Þ̦ÿ¾ˆ8Ljh07³áŠ"õ›@ˆˆúŠDDÔ)ß}÷‚ƒƒ1yòd899aÉ’%8~ü8;†z-(l¹ZÈ ‘ˆˆ"QŸá%KDÝÓüÌÑ9sæàìÙ³(,,Dll,222Ø9DDD ‰ˆh0JLLDHHV¬X‰D‚¡C‡bÚ´iؽ{·(ß¾}ûàááGGG,Z´W¯^ÒŠŠŠ8;;cùòåÐjþ-¼L&ÃÞ½{1kÖ,899ÁÛÛ/^DZZ¼¼¼„:5¨Lrr2¦N …B7¢¡¡aPŽ‘L&ëóþollD\\¦L™¹\•J…šššNµµùÏ–+‡-·—ÞRwß›ˆˆ(Q/9{ö,|||Œæ;þ<222PPP¥R)z¬MPP‚ƒƒ¡V«¡V«!—Ë-*æÌ}ZT>>>ãÆƒ¥¥%‚ƒƒQSSƒíÛ·‹Ž©ÕjQ™˜˜H¥RH¥RÄÄÄàðáÃvœúºÿSSS±mÛ6ØÛÛÃÚÚ‘‘‘8qâDŸœëã|o"¢ÁÀŒ]@DDÆH$TUUÁÎήÃ|#FŒö---¡×ë…×—.]Bll,òóóqÿþ}€‰‰I›÷iY¾½c-ëÑ~eeå §¾îÿòòrÌ;WTGë:•ÇùÞDDƒW‰ˆÈ(///;v¬Gu¬Y³+W®D^^JKK¡Ñh`0zܶ’’a¿´´R©”ÖGýogg‡Ë—/ —ˆ–••¡´´´OÎçq¾7E"""aaaرcöïßÛ·o£¡¡_}õ^yå•N×QWWsss˜››£¸¸Xôû¹žˆŠŠ‚N§ƒN§ÃÖ­[áççÇë£þ Dxx8ŠŠŠ ×ë¡Ñh R©:UÖÖÖׯ_ïvzOÞ›ˆˆ(Q/pvvFZZrrr0kÖ,¸¸¸àÍ7ßìÔ nš%&&":: …þþþ˜1cF¯´ÍÝÝÞÞÞððð€D"is³ztý¿nÝ:¸»»# r¹¡¡¡P*•*«R© T*zWScé=yo""2ÎäÁÖ¼o `Èúµu|¸U:mŸ6泌ÃX±*˜£BýÒÞS°Ô‡+щώ⥗Wánõþkÿžù‘Éd|>* Èï•~/ ºúr²¾„ré²ÕWVZ‚”Ý»‘”¼ë8€zµî¨pëÁ¦k±_ý ½öA~=€FM W‰ˆˆˆˆˆ¨Þõ”ˆˆˆzÝÃ.ÀU`""ŠDDDŽ =¼ô”ˆˆˆˆˆˆ(E""""""b HDDDDDD ‰ˆˆˆˆˆˆ"1P$""""""ŠDDDDDDÄ@‘ˆˆ™LÆN N;wî¦NÊyCDÄ@‘ˆˆˆè'qqqرcÊÊÊð?ˆˆ(Ñ€ôÝwß!88“'O†““–,Y‚ãdzc¨[ 0kÖ,áusÀØ 2‰ˆ(ÑcpãÆ øûûcΜ98{ö, ‹ŒŒ vuK]]ÌÌÌØDD ‰ˆh JLLDHHV¬X‰D‚¡C‡bÚ´iؽ{·(ß¾}ûàááGGG,Z´W¯^ÒŠŠŠ8;;cùòåÐjµBºL&ÃÞ½{1kÖ,899ÁÛÛ/^DZZ¼¼¼„:5¨Lrr2¦N …B7¢¡¡aPŽ‘L&ëóþollD\\¦L™¹\•J…šššNµµùÏ–[Ëô””LŸ>ãÇœ:u ÞÞÞptt„‡‡8Ðn]DDÄ@‘ˆˆúÈÙ³gáããc4ßùóç‘‘‘‚‚(•JDDDiAAA†Z­†Z­†\.Gtt´¨ü™3gpðàAÀ××ÈÊÊBZZ4 –.]ŠððpQ™ÜÜ\dee!77•••HHH´ãÔ×ýŸ””µZÌÌL\¹rˆ5ÚÎæËLËÊÊ„­µ¼¼dmÝîD•NÛ§ù,ã0V¬ æ¨P¿´÷ã,õáJÅ@tâ³£xéåU¸[}‡ÿšÆ¿g~Ad2ïtIDDò{¥ß ¨®¾ƒœ¬/¡\º¬Gõ••– e÷n$%ï: @-€{ªÜz°éZìW?H¯}_ @ÀE""""""jÅŒ]@DDD½­£Ë@¹ LDÄ@‘ˆˆè‘aÀÁ±!"¢Gƒ—žE""""""b HDDDDDD ‰ˆˆˆˆˆˆ"1P$""""""ŠDDDDDDÄ@‘ˆˆˆˆˆˆ(Ñ€"“ÉØ ÄùBDÄ@‘ˆˆˆˆˆˆ(Ñ õÝwß!88“'O†““–,Y‚ãdzcè±âÊ$E""zLnܸÌ™3gÏžEaa!bcc‘‘‘ÁÎ!""b HDDƒQbb"BBB°bÅ H$ :Ó¦MÃîÝ»EùöíÛ8::bÑ¢E¸zõªVTT„   ¸¸¸ÀÙÙË—/‡V«Òe2öîÝ‹Y³fÁÉÉ ÞÞÞ¸xñ"ÒÒÒàåå%Ô©ÑhDe’““1uêT( lܸ ƒrŒd2YŸ÷cc#âââ0eÊÈår¨T*ÔÔÔt¹íÆÚvêÔ)x{{ÃÑÑ8pà€Ðææ?¹²HDÄ@‘ˆˆúØÙ³gáããc4ßùóç‘‘‘‚‚(•JDDDiAAA†Z­†Z­†\.Gtt´¨ü™3gpðàAÀ××ÈÊÊBZZ4 –.]ŠððpQ™ÜÜ\dee!77•••HHH´ãÔ×ýŸ””µZÌÌL\¹rˆír»µmÆ  õk×pèÐ!äååÊÊÊ„?›÷‰ˆˆ"õ‘[·naäÈ‘FóÅÅÅaìØ±6lÖ®]‹üü|!-;;žžž°°°€ 6mÚ„Ó§O‹ÊÇÇÇcܸq°´´Dpp0jjj°}ûvÑ1µZ-*©T ©TŠ˜˜>|xÐŽS_÷jj*¶mÛ{{{X[[#22'Nœèr»µÍÂÂÐétÉdxçwø¡$"b HDD›D"AUU•Ñ|#FŒö---¡×ë…×—.]‚ŸŸ&Nœ™L…BѦN‰D"*ßÞ±–u€ƒƒƒh¿²²rÐŽS_÷yy9æÎ+\úéææ&ºd´³Œµ-%%§OŸÆÂ… 1{ölœê;;;\¾|Y¸ô³¬¬ ¥¥¥½Þ6777ìÙ³_ý5¶mÛ&º¤–ˆˆ(Ñc†;v`ÿþý¸}û6ðÕW_á•W^étuuu077‡¹¹9Š‹‹{íË~TTt:t:¶nÝ ???Xõ`` ÂÃÃQTT½^F•JÕëm Aaa!ôz= ƒhUÓÖÖׯ_ç1P$"¢¾æì쌴´4äää`Ö¬YpqqÁ›o¾Ù©Ü4KLLDtt4 üýý1cÆŒ^i›»»;¼½½ááá‰DÒæf7ôèúݺupwwG@@är9BCC¡T*{½m‹/ÆêÕ«¡P(‹¤¤$!M¥RA©Tò®§DD½ÌäÁÖ¼o `Èúµu|¸U:mŸ6泌ÃX±*˜£BýÒÞS°Ô‡+щώ⥗Wánõþkÿžù‘Éd¼Û% Èï•~/ ºúr²¾„ré²ÕWVZ‚”Ý»‘”¼ë8€zµî¨pëÁ¦k±_ý ½öA~=€FM W‰ˆˆˆˆˆ¨3võ¶Ž.å*0E""¢G†džˆˆ ^zJDDDDDD ‰ˆˆˆˆˆˆ"1P$""""""ŠDDDDDDÄ@‘ˆˆˆˆˆˆ(E""""""b HDD4@Éd2v1P$""b€GDDÄ@‘ˆˆˆŠŠ DFFbæÌ™pttĤI“°|ùrœ:uŠAa+eeeœ0DDD ‰ˆú‡œœ˜˜üöî;<ª2oãø=%½“Bz( ‚RADYuAED Y@Q—*ˆR|UTpWÄ tq]q]E¥¹¢ˆŠ‚¸ ˆ!½’6åý#ɘ!!3 - ßÏÅ\$ç™Sòü朙û´1¸ýظq£[ÓÍÈÈаaæwÞyGûöíÓæÍ›5f̽òÊ+t< (@suñÅkÆ Ó† d·Ûë}ú(66V’T^^®3f¨sçÎêܹ³fΜ©òòr§qŽV{XLLŒžþyõèÑC‰‰‰š:uª***íV«U .T÷îÝÕ±cGMš4IÅÅÅu¦™ŸŸ¯nݺ©   Îð=z¨  Àå´Žþûj–3&&¦Î2×°X,š?¾ºuë¦.]ºè¥—^r´%''k̘1êÔ©“Ú·o¯[n¹EÙÙÙ¼EÀ‰‹ï¼óŽFŽYçˆáÆ5räH½óÎ;n‡DIZ¿~½FåÖs·mÛ¦µk×*--M’ôÄO(##C_}õ•þûßÿ*==]O>ùd£þ¦-[¶hݺuÚ²e‹²²²´hÑ"GÛÒ¥KµcÇ­]»VÛ·o—···}ôÑ:ÓÖUW]¥•+W: _¹r¥FŒ¡   ·¦Uûï«9Å4==ý˜§›>õÔSÚ³g>ûì3}ûí·:tè£m̘1?~¼vìØ¡;v¨cÇŽZ°`/bApjÂbSC¢$åææ*,,ÌiXÍQ´£Ο?_¡¡¡Žßßÿ}=üðà Sxx¸þïÿþOï¿ÿ~£æ_3~XX˜~øa­^½ÚÑöÖ[oé‘GQTT”üýýõÀè“O>©w:wÞy§^ýuY,IUGûV®\©ñãÇ»=­£ÿ>WÞyçÇ45þ|GÛ† 4`Ày{{+ @³fÍÒ¦M›xZ 3]Í7,Þ}÷Ýzî¹çš%©M›6ÊÎÎVdd¤cXÍ´£ƒbÛ¶m~ÏÎÎV||¼ã÷øøøFŸ^çôsVV–ã÷ŒŒ 8Ðéùƒ¡Þé$&&ꬳÎÒš5k4lØ0}üñÇêÓ§ãopgZGÿ}®dff:ýýµ}ÿý÷zôÑGµsçN9r¤Áe %âˆ"4ã°¸`Á‚&‡DIúÓŸþ¤U«V5iܰ°0¥¦¦:~OIIq:"g6›UZZêø=//¯Î4jŸ––ætt3""B?üðƒãôÏôôtÇi¯õ¹óÎ;õòË/K’^~ùeMœ8±ÉÓrGDD„RRRêm›0a‚î¸ãmÛ¶MiiiÚ½{·ìv;/\ApòÃbqqq“C¢$MŸ>]+V¬Ðßþö7¥¤¤Èb±¨¤¤Ä­»¦6LsçÎUvv¶²³³5wî\ >ÜÑ~öÙgëÅ_Tii©222tÿý÷×™Æüùó•““£œœÍ›7O#FŒp´Ýzë­š1c†’““e±X´{÷nMš4©ÁÐ[\\¬×^{M~~~êÚµk“§%IÚ·oß1ÛGŽ©|P‡Raa¡Ó©§eeeòòò’———RRR4sæL^°‚"àÔðóó;®ñcccõá‡*==]×\s:vì¨~ýúéµ×^Ó[o½ÕำfÍRxx¸  ¨mÛ¶NapÑ¢EúôÓOÕ¹sg >\^xaiôíÛW—^z©úõë§͘1ÃÑ6yòdõíÛW£FRÇŽu÷ÝwkÈ! .ÓwÞ©¹sçÖ M™Ö¤I“4dÈzïÞ*IÓ¦MSRR’ ¤óÏ?ßéyO=õ”,X ÄÄD9Rçw/V@«b¨~Ôül”dºç®‰eÏ<÷‚rsNí­¾?ú`µn;žª YzãÕå:|Ñ}òÑ4úö±**,Ðê¯b;sŠÄÄÄðöãsåˆëG©°°@×}¡!C‡×ôÒÓRµ|Ù2-}þÅ%•K*•T"©PR^õ#§ÖÏ…Õí¥ÕÏ·H²J²I²KQ…  (N>N;€  (Š‚"€  (@PEÀ)C'´²šQS (@P¸ï·ß~ÓøñãuÎ9ç¨]»vºòÊ+õñÇÓ1h6NÕPŽ´ ( iÿþý9r¤.ºè"}õÕWÚ³g}ôQ}ðÁtEÀ™è©§žÒ]wÝ¥Ûn»M!!!òôôT¯^½´lÙ2§çýãÿP¿~ý” Ë.»L¿üò‹£-99YcÆŒQ§NÔ¾}{ÝrË-ÊÎÎv´ÇÄÄè7ÞPÿþýÕ®];]zé¥Úºu«V­Z¥ /¼Ð1ÍÝ»w;óüóÏ«GJLLÔÔ©SUQQqFÖÈUÿVTThÊ”)JLLTÏž=õ /8ïª=&&FË—/WŸ>}+I²Z­Z¸p¡ºwﮎ;jÒ¤I*..vŒ³~ýz]zé¥JHHP¿~ýôÏþÓ­¶†k¼š£|111NGüš²Ü µk>@Pœq¾úê+ >Üåó¾þúk}ðÁÚµk—† ¢™3g:ÚÆŒ£ñãÇkÇŽÚ±c‡:vì¨ 8ÿßÿþWï¾û®víÚ¥k®¹F·Þz«Ö­[§U«Vi÷îÝ:t¨f̘á4Ζ-[´nÝ:mÙ²EYYYZ´hÑY#Wýûä“O*''G[¶lÑ矮͛7;ïª]’¶mÛ¦µk×*--M’´téRíØ±Ck×®ÕöíÛåíí­G}Ôñüûî»OÓ¦MÓÞ½{õÞ{ïiÛ¶mnµ5äX㥧§;þ¯ù¹©ËÝP{Có‚"àŒ’——§6mÚ¸|ÞÂ… )___Mœ8Q;wît´mذA ···4kÖ,mÚ´©NX‰ŽŽ–Ưââb=þøãNÃvìØá4ÎÃ?¬°°0………éá‡ÖêÕ«ÏȹêßÕ«W;ú*<<\?ü°Óø®Ú%iþüù uüþÖ[oé‘GQTT”üýýõÀè“O>q´{{{+33S999Љ‰ÑâÅ‹ÝjkHSÆkìr»j‚"’BBB”››ëòyÁÁÁŽŸ}||d±X¿ÿý÷1b„’’’£ÄÄÄ:Ó q¿¾aµ§)IqqqN?gee‘5rÕ¿YYYN}ï4¾«vIjÛ¶­Óï8p ã4Ìž={:îº|ùrmÚ´IƒÖ\ Ï?ÿÜ­¶†4e¼Æ.·«v8˜é€+^x¡>üðC7®ÉÓ˜0a‚æÍ›§K.¹Dþþþ*..VçÎ{ÙRSSÕ®];IRZZšÂÂÂÎȹêßððp§¾JMMußU{}"""ôá‡*22²Þöž={jÅŠ²ÛíÚ°aƒ¦M›¦üÑe[Cš:^c–ÛU;œ 8¢piÚ´izöÙgµråJåçç«¢¢B?ýô“þò—¿¸=²²2yyyÉËËK)))N×/ùóç+''G999š7ožFŒqFÖÈUÿ^sÍ5޾ÊÎÎÖܹsÕ^Ÿ[o½U3fÌPrr²,‹vïÞ­I“&9Úïºë.íÙ³G‹Ev»ÝéhpCm ih¼ÀÀ@í۷︗ÛU»»ó‚" Ukß¾½V­Z¥7ªÿþêÔ©“æÌ™ãÖ nj<õÔSZ°`5räHwÞy'dÙúöí«K/½TýúõSHHH›Ýœ)\õïÌ™3¤¾}ûêÏþ³.¸à‚Fµ×gòäÉêÛ·¯F¥Ž;êî»ïÖ!Cí—_~¹î¼óN%&&êÑGÕÒ¥KÝjkHCãMš4IC† qy7RWËíªÝÝù@Kf¨~Ôül”dºç®‰eÏ<÷‚rsNíùø}°Z·OUÐ,½ñêr >‚Žh>ùè?}ûXhõ¿W±iEbbb¸ó$ E~®qý(hãº/4dè°ãš^zZª–/[¦¥Ï¿ø±¤rI¥’J$JÊ«~äÔú¹°º½´úùIVI6Iv‰#Š€£p3Ðl4t:'G€ €Kj 898õ@PnâEgœùÿüN›Eh~ìv;@P€ÚA‘> (€SP$) vPA€ µƒ"9ñ¤xô¶nšóÆÏtD+ª5e=@P€3((’é[¸[3jÊz€ |HÃ1…yéòs£Ô>Ò_^FÊ-Õ¦™Úy €¾%(¶ ÇôÐìÛÙAÀ™ùÁ˜>h¬°@/¿"Që~Êл›ÓTa±*ªþÔ5B?ï/ o[ñúp¦ÕôTü½¬'ŠÐ,?ò)­±õl«;ë›]ÙŽa)™%úÇúýNÏëwV¨.î¡@_Î/Ó;_¦è`n©$©M€§†õ‹UÇ(í;T¤U_¦¨¸Ì"IzblO­þ:Mê¡ ?e”뽯Sè¥Kz´Uˆ¿§ç—éíMÉÊÈ+sŒ³æ»ƒØ-B^f£¶ïÏ×ê¯Se±žy5vÕ¿f“A#.ˆSöÁ*¯´éË™N냫ö'ÆöÔGߦ뢮 ôóЬW’Ñ`Ðå½#u^§Pyzõ¿”B½ûUŠÊ+m’¤³buÕyÑ òRá‘J­ÿé°¶îÉqÙÖW57›ŒÞ?FÝÛK’vüž¯¶¤Ëbmx™žÛS’ôø=$I÷¿ú“$Éd4hÈyÑ:·cˆŒFƒÖÿtØÑ7®æåªO]õ€ Ø¬%F裭é.û®C¤ŸžÿpJ+¬Ø-B׈ÓÒÿü*I3¸ƒ>ø&M+×ï—ÉdÐeçFih¿½µñ€cü¤h½øñ^•”[tÑ9á{YGýšV¨ek~s »n@œžýpcœö‘þúÛ{»$I£.JÐà^‘ZóÝÁ3®F®ú÷²s£åçmÖÂU¿H’n˜à´>¸j—¤¸p_=ýþn•T‡ÏKz¶ULhÕ°² «†÷Ó>ÑZýujõ4âõÞæTíJ-¿‡õŠÔ·¿f»ls¥¡š_~n¤}<ôä;ÿ“$Ý80A—©·¦78ß™¯ü¨'ÇõÒÌW~tÞIÒ+Jmƒ½õôû»UQiÓ s#}âj^®úÔUÿhÅ ÍT Ày4úáëeRQ™¥ÁçHÒ{_§*ÿH¥Ê-6mü9S1¡>ŽöÅïîÒÞƒEª°ÚTZaÕšïªSL€Óøï|•ª¼’ UXlúò—,yyõîfça±a¾NãügKšŠJ-**µèƒ-iêÕ±ÍY#WýÛ³cH¾ª½>¸j—¤ÿ|›®âZ¯ƒó:…jõ7©Ê/©TY¥Mk¾KW×vÁŽöJ«M¾òõ6+¯¸Bïü7Å­6W¯³†jÞ³cˆ>¨Õþþ–4õìâÖ|ëÛ>ôNl£÷«ÿÆ#VýgKºÛórÕ§®ú­÷ÑpDÀ§Òb¥©¤Ü"/³A…G, >¯ ¤Â©ŸFƒ£¿Û·õ×ÕçÇ*6ÌWžf£ãsíz””שÓÑÃjOS’ç•ÊV}„æp~©|Ìgd]õo€Ù©¯2òJúÙU»$å–9Í3È×C3¯?»ÎŽ˜šq^]»O—÷ŽÒà^‘*«°ê½¯SõKr¾Ë6Wª¹=G€·Ù­eªoûàkVF^©l¶ºí\ÍËUŸºê?­˜AšN=m¼=i…êÙ!D›~>Üè¾­6fp­þ:U»S TVa•—§IOŒ=×iœ†Æ?Ö°€ªë%)ÄßSE¥•gd]õoÑ‘J§¾jãïåÔ—®Úë«Eá‘Jýmõ.§µ%gkÙ'{eÔ%>H7]Ü^½‘ç²Í•†j^tÄâÔê異R‹£ÝÕ|ëûCý=•YPVg9\ÍËUŸºê?88õÀy4î±æ»t ê¥þ]Âåãi’É(ŇûêŽË::žS_ßÖæa6ªÒjS…ŪOÝ0°S»«ñë&I#úÇËÏÛ$?o“F\¯ï÷朑5rÕ¿?ìÍqô•¿·Y׈kT{}µøê—LÝø§…xÊ`¢ÚøèöA¼&nÔAmƒ½e¨¾Çd4¸ÕÖÐÃUÍ·ý–£k/ˆ—¿·¹úïˆ×¶ßrÜšoi¹UáA^NóÛº;[×]¯ ?y{5â‚8·çåªO]õ¢/~<äÔŸõõmͰ7×ï׈ñwy¢ J*µîÇC:7±ÛãkؾCEš}C7yy˜ôã¾\}ümúYcWýûÑ·éºñâvZpKO•UZµî§ ìv{}µølÛA î­ÉÃ:+ÈÏS™ùeúôû?úÇþ|ÝyE’½t8¿L¯±Ï­6Wªù‡ß¦iÔE š;º»$éÇßrõá·inÍwÝO‡4ãúsäåaÒ=Ïo•$­ù.]×\§Y£ºJ’>ýþ ÛórÕ§®úN'ƒþ¸çŽAUGM÷Ü5±ì™ç^PnNö)]˜>X­ÛÆŽ§*h–Þxu¹†AG´@Ÿ|ô¾}¬Š ´úß«´µ´;ÒJ<{w?M~î[:‚š@‹Ò×g‡F\?J……Ú¸î :츦—ž–ªåË–iéó/~,©\R©¤I…’òª9µ~.¬n/­~¾E’U’MÕ÷Ûáˆ"€3×(ROPs@ÊÎÀ™ôõDsõü=ç³í®¥[¨9à$ ñ)³µ˜´ô:á «)5‚"œœ Èá‚"8Eú€ NA‘¤@P€Z–ýuN›7^ý_³_F#eEA@PEApŠ˜é­Ñh”ÍfsüþÆ«ËépÚÙívÍóØA@«¬ì¬LùøøhÄõ£èÐ,ä+(8„ §C—³ÏÑW7¨S—Î i#ƒÁ@§€ÓÆn·+?/W{víV¯>}Šp:‡¨kÚ»g~Þ¾Ýé4T€SÍh4*0(XÝzôàˆ"œNaá  #Ü ³t€  (Š‚"àxq×Sg ›Õ*‹Õ*ÙítFsf0Èd2Êd2S×3 ~¬ß¬»ÔŒúÑßE8m*++•ž–¦_vþ¬¼¼<:¤™2 Rç.]ß®<<<¨k+®ë7ë.5£~ô÷©ÛVf€½lt’÷ªÙ¬VeefjÛ¶tÉ%—(¡}G™L&ú½²Z­Ú¿o¯¾Ü´I&³Iññ 2£VÔµe×õ›u—šQ?úûÔm+ Š@3À^¶Æ9{Õ,V«vüô“.4HíÛw¤Ó›1“ɤÄNe2{蛯¾RÛ¶måãëG][aýX¿Yw©õ£¿Oݶ’ œfìek¼S²WÍnWn^®âãÛÑá-Dl\¼ò òTYi‘umõcýfÝ¥fÔþ>uÛJ‚"pz±—­ñNÕ^5›ÍFhoA<<þà]Ù¬V+)±“Î9»«žá9eLÕÈ›o‘$]í6LgwéL'žB©i)ºàü‹”W#‹Å"»Ý.›Í&›Ý&»Í&ƒÁ ³ÙC^Þ^ŠŒˆRÇIÚ»÷W­ùôC ºôryyyщÔE8¹Þ^»]ÿüô' ØSïoÜ¥@?oÝ=ê|:¦³Ë ÿ%çJ’JJÊt¤´\’tI¯8:§úbý͘ý€þoî]}å PAa‘d“žá9mùæ[uívŽF^?J7Þx£¾øâ ¾åf+33S£ÇÜ¡–>£óûžGgž"VkU˜¨¬¬”Ýn¯~ت‡Ý.»ÍªŠÊ ÙØ•ŸŸ/ÙŒ:·WoøhýÆ/tÙ +8³‡ú ÕoXîÚðÝ>-|u£úÛEå6£z÷HÒŠÿ|¯_OÝzU¯–±‘7›e±XNù¸Í¹®«Ýqú©ÝþÇ×VZlŽéQ×Ö³~Ϙý€–þí E„·Un^®Š‹K”œ¼_ß|³Y?|¿M‡Ò¾}û”’’¢ë®»N]ºtQ›PY­Vu=§«¢¢¢5éž{µmË×lDOQÍj†Ùl6½ñÆë Ncøˆá:˜~H’Ô¡C¢ò ´éËõºøOæ4Fêw¶6lÐèÑ£•™™Ù*·ŸE ™»ûž»”››#£Ñ¨°ð0-ùÛR:å4úé×CºoñGêÕ5QGl¥g*ÀˬžÝõô››àë©k.9‡Žj¬6«ãçÚCj‚"ZŸöí;jÿþßåïï/???ÅÇ%H’†\y…Ö|ü‰bb£¬Ý»wkÀ*/?WŠKÕjmyîZøÎ€škÕmv›n¹åVIÕG¥ªÛìv»ì6{­ŸÿXw{vï¥_nPvv–ÂÃ#Z÷‡øfZçÖR¿Úý;gÎýãÿПÿüçV±Ž¹‹[ 'e#ioô#''[=ºPcï§Ã‡›4–þh.~OËÕ˜ùÿVç¤ÉË[y%•2È ŒÜeV¨ë9´à¥uúâÛßœNll¬ÊÊÊêmËÏÏWÏž=•——wÆ®'fóéÙWi±þñZ³×JŠ•V÷‚"umy|||ÔûÜ>òññ‘ÅbQdd¤Ú·ë K.¾TwÝ=IƒÖYg¥Þ½{ËËÛKÚwTÇö‰ÚŸ¼_¹y¹ÇœnAA¦NªÄÄDy{{+<<\×^{­Ö¯_ZÿÞ–þÖnûãÿïÕ‡ÿ톪[gT}­±AfO½ùÖJ-[þ¢>¬èÈhš­cÌÊûúÍ:Û£-aÛXß°æZç“]¿îÝ»×ùÌ`·ÛÕ­[·ZÏÚýûóÏ?ëOúS«YÇÜ~-òö4³½7'ñÑgÊ0W!¾!™¹ÅºyÎÛŠ”o`€rŠ*ªG¬úïPN‰ê§ÎÛkÚß>Öó³‡ë‚ õNkÀ€Z±b…&L˜P§í¥—^Rß¾}|ÒCòñL¿9/[S§cµÕ~îIÑÝSO©kËZ¿ÏîÒEŸ|ú¹úöé¥í;:® ”ÅbU\\¼¬V«J”Èh4);'[»~ýUGJJ”‘‘!?_Ô;í›nºI:tÐ矮¸¸8åææjãÆzä‘GtÉ%—ð†ÖÄšÕ|¥‚Ýn×›o¾Ù¨é­~ÿ=õÿz²Îš%yí¨ËnWpÿ›žSYYÙìׇ†Né<Óëçãã£>úHC‡u ûàƒäëë{Bú©¾ñKKKe2™Î¸rDhe/^,///-^¼¸NÛ‰ ‰Íq/ìñ*>R®›ç¼­à @…„·QnqÅoµžw(§De))1^“~ =Xïôî¿ÿ~ýýï—Íæ|¤ª¢¢B/¼ð‚¦OŸ.«Õª9sæ(::Z=z´ŠŠŠÏõððÐ’%KÔ¾}{yzzJ’>ýôSõèÑC¾¾¾JLLÔ«¯¾ê^@r1¯ú,[¶L‰‰‰òõõUŸ>}´}ûvGÛþýû5bÄ…„„Èßß_C‡Uff¦Ó²­fXíÿë{Þ‰PQiUy…ÅéQÕµëñGe-Õ§=Ny…Å)\¶†º.^¼X111 ÒwÞ©òòr·ëÚÔå<]nºa¤ÖoÜ OO¥¤&kÝúÏõóÎÚûÛ^ý¶o¯¶mû^ß}ÿ­vþo§¾ùömþú+%د¼Ü\ÎÈÐÊý[C¯¸¬ÞioܸQ .T»víd2™®‘#Gjݺun­5?7TwÚ~-=ý—^zIIIIòóóS=´yóf½ñÆêÒ¥‹cÝÞ¹s§Û¯©úæyR‡]ºyôhÝ<úfÝ|sÕÿ7Ý|“nºé&ÝxÓMºñÆë\÷Þ{¯<¨ôôtuêÔ©Îõ1û»z~eee½û'ÊËï§®#ŸV÷QKÔㆪ‡·§Y–ZAÑPëˆby¥MÞžfÇs{ܰD]G>­!“_SN~I«ªëÿû_ýøãÚ»w¯2335þ|·ëÚÔå<]®¼ürmûi»þ:mº¾Ù²U TVV¦¢¢"efe)(8DÙY¹Ú½k ò d±XUQ^¡¯¾ùV»Ý#³Ñ¨iS¦Ö;í .¸@“&MÒ–-[TZZÚäel¨î´ýZ:Úºuë´~ýzeee馛nÒÕW_­O>ùDŸ}ö™²³³uýõ×;­ÛMyýžÐ÷Ïê3öš9vƒd°W¯±  ¦ª‡©êÿÜ::…Œ_S¥¶#æ»=ß¹sçêСCÚµk—þ÷¿ÿ)55UóæÍsùw7¶ZÇêÛ6º»½lh{=oÞ<è·ß~Ó?þ¨Í›OÞWìú]{íµÊÌÌÔ7ß|ãø»srr4bĈFÕsÞ¼yÊÎÎÖÞ½{õÃ?hÆ n½_]ƒÓ½¾œLýqÞ¡:8šî¹kbÙ3Ͻ ÜœìSº0}°Z·OÂ@³ôÆ«Ë5tøˆ†`”—kÕÛÿÒäû¦Ô9ÚàÊͷܨ…=®è¥e/êŸ+ÿÕèe\³fæÏŸ¯­[·ªÿþš;w®† â´W«fWVV¦ûî»Oÿþ÷¿%I#GŽÔÓO?-ooï:Ï=zü£÷BÖ<Ïjµjîܹzíµ×T\\¬«¯¾Z/¾ø¢œöŒ?ýôÓJOO¯³Á|~é]=l˜‚‚CNhí\ÕÅn—îzümÿ-K:ÄÉh®º-w…E:R^uêÈ‘2•©Ú‹ìï¥@_OÇWñåå*óp¶Þ[4ZícBê¼qÏš5Ëñ†V4–-[¦óÎ;O‰‰‰Z³f:uê$I:|ø°z÷î­´´4GŸ%''+::Ú1~‡4}út 6L±±± þíµëèj^õ{øðaµiÓ¦ºŽ(44ô˜ˆ9¢ÄÄDöý~ M± ±*­°ÊéÅZu-(©PAI…B½U^VªìÌl½ýØ(…{×YΖ^×èè(G{tt”222Ü®kc—ót¯ß5ÌòðWŸóú(#ã°bcb”––¦’’8¬ø„8sv/­Yó‰Î:ë,íß¿_½{õÔþ”ôcö¥¯¯æÍ›«yóæÊn·kïÞ½Z²äÝpà úè£Ý^ª‡;íG¿–Žž~@€¿Óz\ß°ÚëvS^¿'²f5׸™ŒFÝzëmUk©Áàøÿèµ÷à´˜:!ã·N·ê¬+¦«¼¼¬Î×,””×ÛW‡VLL´ã÷˜˜h>|ØåßÝØþ=ÛÎú†5´½ÎÈÈPdd[ÇïQQ‘ǽ >]õ«¨(× 7ŒÒ‚ ´råJíØ±Cÿú×[Ž¿ÅÝzfdd8­[11Ñ ¾Gk;UëËé@PN±Â¢B-|ìñ:Ãív» ƒ<==«6¬Gmív»ž}îØ_™±ÿ~}ÿý÷Zµj•$iÔ¨Qš5k–8 víÚÕyþÛo¿­uëÖ)"¢êöÓO?ý´ìVP<–×^{MkÖ¬qexì±ÇÔ»wo§ ¸hÑ¢Ó«ú°þ‹Ô'ê«É£ú: ë:êY§ëÒìNײÙdµÙµsÕÝǘó<¦M›¦¿ýíïºè¢‹ôôÓK4uêÇs"##µ~ýº:{kOãèé{î¹ZµêmÙív}öÙgºë®»µoßþn÷çåêo©=ìÖ[oÕÂ…iðàÁ Pqq±¢¢¢íf³Y%%%Ž äææºüÛNd]%Éhž™q¥FÏù·ÒSªmL¤*j}âÑ‚üù„bcãµ4TwÚ]ÝøÄÝ£Ïë÷DÖ¬æÔE£ÁX0 ªúWëÿjiS"넌³þ^߬Ýìò{þŽáÔ×û÷ïWxxøqõeS¶MOCíJNNQûöí¯£ã­ã鬟§§§&Mš¤ñãÇkîܹòôôtº,Æz¶mÛÖ©½æHã±ú´¾;­žÊõåtàEà$íÙ®¨(¯÷Q³ÁHKKSZZšÒÓÓÿ§§§;Nã°Ùª¾_Èf³95{°ê{<÷ÜsÊÊÊR@@€<<< ¬¬,=÷ÜsNó®ù¹öž¶ŠŠr§=mG?·¾aõµ×ìU«¹Ð;66V™™™NãÔìU;Vߜ䒺^Ò»cºó2ä ¥§§ëŸÿ|KÙÙÙ4h£mܸ±ºçž{ôûï¿«²²R;wîÔí·iðZÐ1cîЮ]»TQQ!»Ý.‹ÅâÖµ¤®æåÎu¨µ‡•––ÊËËKžžž:pà€&O¾Ç©½[·®Z²d‰JJŽ(==]÷Þ{ŸS{PPöìÙs®Ym¸ÿ½,‹Å¢ÔÔTÍ;WçwžÛë«z¸ÓÞÐëÃU{S^S®¶'bÝ•ªîþúë+´âõ×´bÅkzmÅ«zíµWõêk¯èÕ×^©7dDNÿB¾í{ËVýþyô²6´ì×]w­f̘©ÌÌLeffjÆŒºþú뎫/›²í¬oÛXß°ÆÔùúë¯ÓìÙ³•­ììlÝÿ¬cöEK©ßÔ©S”——«)SþZo»«zŽy½cÝÊÌÌÔÌ™3Ù§ -Ç©[_8¢´ íÙ ÔìfÕ;|ܸ;e0ôòËËUXT(ƒÁàxÔìýªoºeeezóÍ7õË/¿(!!¾Ö^èd]|ñÅzðÁ9ŽkÝÝÓÖ”£AÍ}¯š«#u¿ÓMOþ¯æûö3­)SþªI“îÒ‹/¾à4Þ”)Sô÷¿?­«®ªŒŒ %%%iÆŒ öÙ•W^©›o­ýû÷+))I/¿¼Ü­£‚îÌ«1{°Ÿ{îYÍš5[©©·(**J÷Ýw¯Þ}÷]Gû3Ï,ÕäÉwë‰'žTTT”¦L™¢÷ßßÑ~ï½÷ꢋª¤¤D……'µ®~žZ1ïšýŽ23 “ FGRôò0©¢¢\y™YzfúuOlëV}[j]û÷?_}ûöSqq±FŒ¡9sp»®]ÎÓµ~ׄº#GŽ8=¯&8zzzÊÏÏO  ª>âht:rh2UFxèÐ!………U‡I“£ýþûïײeËtß}UQQ‘"#ÛêÒKÿ¬×__áözàªî´Ÿè#ŠMyýžÐ#RÕ_Øn05nìµÞ 2Ô:2µò§ÑþÙ\ÕÜÉØqC•FQ|衇4}ú uïÞC’4bÄ=øàƒ'üˆ¢«u¬¾mã±¶—î.Ûƒ>¨{ï½O]ºœ-Mš4I_|ñÅÉ9¢xšêwt»«zΙ3G÷Ý÷W}ö9ò÷÷×½÷Þ£µk?kôÅSµ¾œÜÌpScnf3á®»}'Ç “þ¢)*ƒÁ ÅO-Òò—^v{Ü7ß|Sï¿ÿÞygU¶ë®»N×^{F¾Y***”$Íž=[{÷þ¦^¨ºæq„ êܹ³{ì1IÒÀuå•WêÞ{ïS~~žî¿–Þÿ}Çø±±qÚ°a½’’’óZ¼x±¶lÙ¢E‹)..N¿þú«-Z¬+^“$§ù×çÕåËNêÍlþ2é.·ï8Öã¦tNÏ®ŽëÙŽ””©¤´ê¦·§Iiûhû[“X1N¢¯¼ìÖ S×½)9ºuÞûò Qh›6*¯¬TYY…dµ¨0;S 'Ö%}ÚÑù§ ~'{ý®¬¬Tii©²²²4æ/“4yâ8Ç5¥ÙÙÙºpÀEÊÍËQff¦Ö®]«nݺ)"*++Ó!CôÀ³OÒ©§'§~î¬s­}!(­âÍïøÞ  ƒÛwÙs×öíÛëÜ)ïL ðGßî²&@X­VY,Y,LJÈòÊ ™,UI±²²R¶£>\–—•9½Ýl–Ýf“ÙÌfµ9×µæÑï¬Ý<8Q¯~¼[·^ÖI—÷‰VYi©Œ&“ÌÕẶì×Ýf“Éd’—§§ºŸs¶–¿ö†®t±,•EFF©¬¼LÎׯ¦¤¦hàÀòõõQVvžöìÛ¯øØXùûùÉÛËK&£Q:ÁÛмܜ§éª½µ­»UïÜ Ün·;¾¯½êZqƒd7È^ýþhpžš 28ÆaÁÉÄ 4q„ºiú œÊ Ø´½Yååå²Ûí2™L²Z­'ôHÆå—_áø®¯3ûsdÝ‹ÑkßYÖf³Éj³)Ð×S™)ÉÇœT ¯gÕ©©Õ¡Þf³9±Eó¬kM€´X,º²_¬âÂ}Õ½C¨ã»À ƒ¬Õ{¿©kË~Ô|±z›ÐP]?b¸>øhÖ|¶^mÛF¨ËYg©¨°°j‡œÑ¨Þçö‘Ýn—‡—²só”¼ã*©cGõës®¢¢¢(///^ 'yÝ-/¯Phh¸~Û·W‰“½ÃÔn·ë·}{ÑVeeåòòò¤Ÿ©Š@³Ûz6jŒ˜è-yæiÙl6Wíe;H2ü#Åž±U©{¤×`08® ­ æƒAï>6T6»]öZ·Ãw\Œo4ÊTë´D³Ù,³Ù옚o]­ƒŒ&“<<uÛÊVßxu9¯´ÜŸ½lv*öª ™==Ô¡CÅÄÄÈb±ÊnçM­¹2Œ2{zÈÛÛ‡º¶âú±~³îR3êGŸºme‹ŠC‡àUƒ–½Ò³—­ñáúîU3™=äkö Ó[Ûkˆº‚×5õCëŠ@KÇ^¶&ì°W € ะ— -™‘.EA@PEA@PEA@PEA@PEA‚"€  (Š‚"€  (Š‚"€  (Š‚"€  (Š‚"€  (ŠEA@PEA@Pî¶Ú¡øIDATEA@PEA@PEA@P€  (Š‚"€  (Š‚"€  (Š‚"€  (Š‚"€  (Š‚"EA@PEA@PEA@PEA@PEApÆ1ÓÜe³Ze±Z%»Î8^ƒL&£L¦æËŠÜRYY©ô´4ý²ógåååÑ!ÇÁh4*(0H»tQ|»vòðð (hYlV«²23µmÛºä’K”о£L&ÓDV«Uû÷íÕ—›6Éd6)>>AÆfÔŸE.Y¬Víøé']:hÚ·ïH‡'“ɤÄNe2{蛯¾RÛ¶måãë×l–›ÙpÍnWn^®âãÛÑ'Pl\¼ò òTYiiVËEPà›ÍÆé¦'˜‡‡‡¬V›ìv[³Z.N=Ð(vîxÚêqD@P§ž8)rrsôÌÒ%JKOÕÙ]ÎÑ_€€€zŸ[ZZª_z^¿üïEEEëÞÉ÷*<<‚Nùä}öÙgÊÎÎÖõ×_¯‰'÷|ZCõ£æg£$Ó=wM,{æ¹”›“Í+€*Ê˵êíiò}Sd³Ù=þ‘#G4ëû«ø„8Ç müýý•žvP’“õøcO¸=<<ê «¬¬Tbb¢Ö¬Y£N:I’>¬Þ½{+--Í1^rr²¢££¦•‘‘¡ÐÐPÇrÕªÒÒRIjÒ|òüÒ%ºzØ0‡4©6éi©Z¾l™–>ÿâÇ’Ê%•J*‘T()¯ú‘SëçÂêöÒêç[$Y%Ù$Ù%®QÐK¥,K£Ç+//“Íj•Ñd”Õj“Õj•$Y­6UZ,²Y­*//“Ùlrkz%%ÅÎA¶¢\ééé:çœsœ† UT”;~ uú]’üÃjæô0‹Åâø½©óiI8õ€Ûìv5ú{‹‹‹õèc(!!AÑÑÑ***”ŸŸŸüüüTTT¨øø8%$$èÑÇQqq±[ß;XßðÈÈHíÙó«Š‹‹¢¢ÂÇkʰ¦Ì‡ïQК£b£Câc Uxx˜"#Û*77GþþJKKWjjºüýü•››£Èȶ Óc uÄÆ«{î¹G¿ÿþ»*++µsçNÝ~û˜›2‚"€ÖqD±¤¤D L!m‚¡Ü¼\ùû(%%E©)©JKKÓäùùù+7/W i¬…?¦’’’FÅ)S¦èüóû몫†*"¢­ÆŽ§¡C‡žð Ø”ù´´ È5ŠÝ7¯ÿc…|ýü^ƒ‚‚”œœ¬ü¼|M2MF£QÏ>ÿ¬¬V‹¢¢"«Âbx„¬›V¼þšþ2~‚L¦º×,ä×» ƒAS§NÑÔ©SŽ ·öcŽ×”aM™OKCPà~Ltó(Xqq±vïÚ¥^½Ï­¾&Ñ_©©iÊËÍÓcÆÊn¯º‘Ím·Ü®WW¼"‹Å¢èè()<"\?lûA999òóósºjð1î šŸŸGqŠNOP”Ë X^^®ÒÒREFF+=-]QQQJKKS~^¾nu£Ìf³$» ƒL&£F^7Jo¿ó/UVT(&&F¦«mx„Ž9"£Ñ(“Éäøâú¼¼ÜcXœ8\£ 1Q±&-óa6™d25tèPImß¾]FƒQ7Œ¼AmBBäçë«À€øûË×ÇW¡mBtÓ 7ÉÛÛW۷異R—¾Â1“Ñèrž-úÑ qD@#sbÃáÆh4ÊÏÏOÑ‘QsëíŽï]4›Íòöö–¯¯¯<<<ÃJK=åéå¥GÝ ›Í&£Ñ(OOy{yÉÇÇGF£‘#†EÍ7'ºw¢ÙlV`` d³ÙÒ`0TM§z&“Iþþþòóó“Íf“Ý^uJj}ÏA@³LŠÿJ£ÑXkt»[Ï# ´œœH€#(@£Ñ(›ÝFP<¬6[½ßIPÐü VjJŠÂÃÃé$7'[!!md04¯/¤ (pÉd4©[·îÚòõfõíw¾ÂÂ#d4è˜&²ÙìÊÎÊÔw[¿UÏsÏ•§§A@Ëb4­®Ýºé§·©° @Öê»™¢ ÁÛdRPp°ºv몰ÐPyûx´,ƒAfOuèÐA111²X¬²Û ŠÇ¾ F™==äííÓì– Àm&³‡|ÍtDk±tøÿöî­·"Œãð?v¨(|K„Ä—n9Um¹èŽòz2ëC©RžGmœµÖUzõÓ;»¡€P@( ŠE„"B¡€P@( ŠE„"B¡€P@(€P@( ŠE„"B¡€P@( ŠE„"B¡€P@( Š ŠE„"B¡€P@( ŠE„"B¡€P@( ŠE„"E„"B¡€P@( ŠE„"B¡€P@( ŠE„"B¡B¡€P@( ŠE„"B¡€P@( ŠE„"B¡€P@(€P@( ŠÿOûÁÊà(¸ŒPø<ôSÄÑt±¾wÖí±“¿ýú‹?5À˰›p7ˆgoE ÅŸúÑŸà娖µ+Ç¶ŽÆau3­öó"ÉrZ¯’|™äë$ß$ù.ÉI^'ù~zým’¯¦÷½šÂs9]§^€O§N[n’¬’¼Oò.ÉßIþJòG’?“ü>½~“äm’»$÷]\î“ñD±MÖÝ”µžþ-3½g!ž4w%×ÓjíÖ‡àÉ-¨·Ó/o2Þ¿ºjûðÕTŸ-·ÓõåwBັX{m“Â6-¬áXƒqwäz³ŹH\—@¼Ëá$qSB±ßÒ À§ÅÚm5ßbq“ÃÉâÜCoffÓÞ¸Dâ] ÂLç×yØ‚º,¡(®еÝÚ`ïm>Ü«x7ˆÅmÆ_›‘$ûÛEÚß9ŠÄU<Èà9B1?ЦMßåaº¸ÊáTñ£'Šõ†ÈeY)çî“|QrQ"Q(\/ë}Šuûiź µMw™Ÿ(æÔD±érú ~»iÄeŠŠW Åt¡Xo¼ÏÃ6ÔÑöÓ“Å}‰ºÑ ‘u;é® Åzo⢠D¡pÝXìŸ~:z骄âÑH¬¡8ú ú¸Ôu9×>¸~‡býîÄ…ÿ+€'Æ]OÛ­„-GÅþ:gÝ£Øp Å:E¼ÉáÔ11MxŠ@ì›­o·MYÛ\8Qì·Ÿî¦øÅbÛŽºÌáÑ–S€ç‰ÅºuŸÃ§›n»cÊGÑ9 º~*¸8ã(þ{±xêø(Ï ÅöúÔ:uM®Šõõ©•KBñX@Ö0ME"ÀóÇâ~pœûÞÄý9AxN0 D€—ŒGñ’À»ù—çx¾X¼øüÇDž0ø¼ÂñÀÂß €ê¥¢.szpìØIEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_tables.png0000644000175000017500000007473212235000130024035 0ustar00murraycmurrayc00000000000000‰PNG  IHDR& €¸ÆsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ . Ê’ IDATxÚìÝw|ÕÚÀñßnv7›lz/¤@Bï%€Òlˆ(6°b¡Ø@»¢"Åîõµ]»×+êõ‚×^AzïÒI(!½÷ºÙöþ²d“m >_>û!;çÌ™3gfgž=gfVAëP"„Bˆ¿+Ë)¦5£€D!„g00iQ¾S L”§™.„Bˆó‹¹Á‡¥µ¥‹iJ N„Bˆ¿%£ƒàÃâ$± ¨N# Q:F”œ!„+–&7¼v¦5PØ N\&Öàâ’Ûæš¤Ý…BÑÔòÅ }š(Nï˜1Í‚…« äò¯˜´¡]¹ëšáÒòB!„hæªAÁÁØöŠ˜ýon2Íâ,XQ¹ Jî›1€œâjiy!„BØ£mt4¼Lþ§Q@bwÇQ`b”dVIs !„Â'{DL^Æÿ7¡1Ÿˆ5Ì‚k âðmhW,‹4·B!œñŶ—Äp"(1œx)ì'/Œµj˜(¡þB×«Æ "=¿ÂîÒ>FQYf7cŒ Iê/›M!„8?p²—ÄÐè¥?[Ø BìÞ¥ãô®G%*#"Ü®mmy)Òñ"„­gùšÍ\2r¨4F Ú©­µÛy´&u'^µ€'ïðmz JC/ŠÃeóÀÄ~41ª§ã/€½üF£í3VT*)‡“ùó¨D&BáŠÁhäxz6E%ÔÔêðÔ¨Ñy{Ñ¿w7þ\»…^ž ÀÕÿ—‹/Òf×§®®ŽC‡STZ†ÉdA­òÀS«aè€Þg|ÙMÛ p«Ýþ\»Åæ½B©ÀS­&(П„øxj4g¤~my;º!ˆ“C7u@M“ ¤ñ0‡³àÄáůfGÝ'&ÿðÃwÖIQQÑxyy5»ÄÖl6á©Ñ8.K!Õµµ:t˜‰uaH„zPZQKF~9o}ûýzum6_[=¾ÖÕÕqøÈQ¦ŽïKßÄp´ªj ”V3÷ãu îßëœÖÏ^»­\·Õ,40™ÌWÔ²çHÿ]yÄÄ„V NÚÃvt“£Þ’Úñ…GCžZ¿š^s‚[‰‹¸„«®šX0›-˜Í&Ê+ÊIMMÅb±`Áˆ¥°°P†r„ÂÙIÜ`$9ù0/ß;†_-ÿüv;[d£ÀB÷Ž¡L¼¨»Ããrý4 i™¹dçæ£×ëñÔhˆŠ#.&Òzü_µ~+];’ž™M­¾o/- c(+« 7¿ˆ:ƒ΋.âñ÷ó9­u:rœY×ôg@×Hý{=»Rrˆ‹ 䯋{¢Õj­ër:õÊÈÎåȱt@F£"$(€„øXT*—õsu^jèeñòTqÅ™2®Q!¾¼øåôéa­÷èჭó4VZVÁÑãTUUcü}‰‰Š (ПÑÃ[—1zø`,–“ówëÜ‘ôÌjjkñöò¢KBþ~Özgfç’•“G­¾FMtd±ÑQ(Nœê-×ôSp"àÐ;AICOJC/вQpb·Ç¤ñcä]÷˜f³™~ü‹ÅŒÅl!,< O­–¢¢ö2pàx!?or^Z5f£é”ëpäX=>Ž@_/~¶Ž‡sñP(XºðzëIÜwÎGIû¢7Ö±|ëa¦MèOb‡@*«jN~›WÖŸ2kjjö÷² ÂBøsG2Ë·¥æKŸ„p¦Œë܇4 ÊÜ­ŸF£¡°´šð ·/øÁ€6®/àt¹ýûôp™~ TÔß4 H†vœ'N…«ÀÄb±PW§G­Ö Tz 2©0©L˜ÌT*&£‘²²rT*†:#5µµTVVâãã yĽBØÎÒU‡èÆ÷ª¿CcÇqŠ+kr~jHP+wç†1=¸zDW¾Z¾[.­NȲ­Ç "+;·Õ€Aú¸Ì—œr”§§\À/RØ,ƒòê:÷ˆ`÷á<|ý|(kÒsÐ’z)Ot‘TÕЪUÜxqϵ¹;ç£m;v[{LÒóÊðÒj1™ÌäWäÃàîQì=šÊ]ãûÚÌ{øèqž¼m8ÿY¶‡#E'{¸Œf”ŠS«_Xh?mHaÚ„þÜ~E_>þi'  gÇ0®݃oB¡T:]®«zâyÚ£I¡…;©°½#GaÛ(ØíPI.Psè‹uÍ–QœU†ŸZŸŸ/‹…ššj´žž`± Ry`± · !„J%q;ñôk¸âÂN ïä1=Py(©ÖHÍ)åXV ÁÁ•ØÌÎOSQ*ŒÏÕ#ºR\QÃWËö±l{‰ ñv{'B÷¦¹½NJªjê˜2®¾ZÔJÊ«ô¬Üqœ/þØG|l»÷8¥:tŠ‹åõ¯·0ãªþ,š1š¢òþ·ê` çé‡Ïªj l?”Íg¿ì¥SÇX ï|³{&àñÛ†QXZÅ’•¸dp'ë<¡ÁAü¼á·^Ö“.±Á`Ci…|öë:ÅÇr(åh‹ëÂú}iÔ¶sʼn|þÌDê &¥²tå~ÂBCœ.×d2;M?Åmîê¢V—C836LT€æ’Ûæ–Ýtǽ¤ç•¶¨V—áG xxxP^^NqQ•••øúúáÛ}¡1=å$„˜Íòó ()+C¯¯Ãb±à¡T¢Ñ¨ñòò".¶;ÿÚ À€~½­ß®srò(.-Å`0¢V«"2<Ôzh:OK¦ª£ÇÒ¨©­Åh0b>ñ%Õßχè¨HT*ÕiÕ«¢¢’Œ¬lôú:Ôjáá¡dddÛäi:;ëÖǦ;ÀC‰Î‡ÑxzÖ_¤\YYEzfz½ZCDxi™6å——W›_@uU (ÀËKK‡¨Ht:o·ëgoZaQ1…EÔÖêQ*•øè¼ ÁïÄ3^\-×UzKÍ»¹çÏÔßSTå@)PÜèUzbzÕ‰|zNþú°õ—†&ÇsKZT±êŠB*®!@«GçíEeE9EÅ¥TVëñ íFt¯KPi¼äÈ#„BœGæßÒ«Õ“Szމ#^>Áhz^IUi…¥¹ BåCTP4^>A(Uj¹ÆD!„8ÿ(ì¼À¡›¦Né×…Qzhð ŽÁ78¦UÊB!ÄßG«ö˜!„BH`"„Bˆó70éæ[È÷¬“ÖB!ĹL þþíâ¢B@zN„BáXÈ+g!0çÞ®”þ·&™ŒÞ¶ÝVx(•D…ùsÝÈ®ôï)T!„&íUrZ!Ÿþº‡ýúrá…¡ÖßchOÌf ù|úënfzªé"V!Äé&2”sö}¹|?ƒô'4$¸þ$ß·ÂÂB4 ?_.ßÏóS/’ +„âôqöeæ•4$ð¼ ƒY“W"U!„&í•ÉlA¡Pœ¥S(˜ÌÒë&„¢•“³ñ­=,<‚ü¼Üó¢Q[k]Z»ÝïÅg«²O9½­­ÏŸ´±peÕŸË}ñ¥Òíh¿Už•jK國zªÌ–Ö}¹*óL,³qÙBœÏŸõ–¬Ëù´Ž­ýåeßžÝO=ڪ円…Kãþ{LÂ#šßš—›C^nŽÛß”åkI9­ÉÞz5ÔÇui\ïðˆH—ó¹ÓSÇF;œç“Y§µ-Ïd»*»q[ët: À ‹Ò¥K—6ûjé6=åtéÒ…µkV£P(lÚtÄE#9|øði×ãL¾Â#"=zÿùê+›uhÚŽçê³~&ö…¦ëbï¸Ðö¿SµzÅò“'• ­—AAÁÄÄÅ¡Vkšå?r8_??z÷í‡Ñ`¤ªªò¬Î7ÎöÖ:ÓÀÄ]mùÒ×ËѾðñŸ'ƒiGÛ¼?Õ2ÝM?[m]^^Î'Ÿ|ʽ÷ÝÇŠ?ÿ”¯€·—Ë—/çÒKOvKÿþûè¼½ÛÍ:òé¿þÅÔ»î’ ú71éæÛ0”——‘zô;¶na@Ò`4O›¼‰»âãë‹Á` ºªJïoêŒå4þl0xö¹çèÞ£']ºvå½÷Þ·ÉûïÎÀAItˆ‰eìųoß~»å˜L&-z={ß‘wßCee¥MÞ>øþýuFׯ®®ŽœM|ÇNôê݇wÿùO»ëßøG½0ö¢TW¯Æù|´\Ú7˜ÛGGqç˜(.ëŒV­°ÉÛ'·[.ŠäŽÑQ\Ô#¥»e…A‰~ÜzQ$wŒ‰bL¯@T'Ó;{rÝÐ0îÅÃ#èåí²ž-áççÇý÷ßGrrŠuZZZ·M¹N ‰ÄÄÆqÓÍ7SXXhÓÖï¼û.={õ&¾c'fÏ~ˆºº:·Óõz=s~„ÄÎ]HìÜ…‡y½^ïp¿r´MW¬\ÉE#GÑ!&–ƒ’øòË/[e_»æý¼ýÎ;6ÓÞ~çfΚi3ÍÕz¸Úg]}¾NÇË/½Ä§Ÿ|Êá#Gœ3JKKéÞ£'¥ee6i¥¥¥ôìÕ›Ò²2—õtgqv¼r'ÍÕçÛQyîî/ÎÖÁÑ2Ý9>:«Ï™8~æçåR\TˆÉh¤c§Dbã:’™ž‡‡‡õ¸sìÈ6¬]ï?~϶-›16¬]Áh´)Ïh4°aÝ F£Í¼kW­`ÿ¾½˜šäo`6›I>x€õkV±~Í*’Àl6Ûôð¤§gú5¬]½’äû±XÜOwU—Æ=Hö¦­^±œÌôt6­_k7ï™Ð’Ï»«cèY LZz‚t4ýÕ×^#ùP2+þ\ÎÖ­[ÉÎζɷaã~úéG’dܸq<üÈ#vËù¿7ßd÷žÝü¹|ûöîA«Õ²`ÁB›¼;vî`ùòeädg¹Uÿ–®WÃëÅ—^¦°¨ˆm[·°rÅŸ¬_·¾É ¾þïÜœú‹Jss²ÉÍÉvk¹f‹Åå«q¾Ëú³'­‚ÏWeñùêlJ« é`“7"@ÃÒ¹|µ.­Æƒ ~vËêïKˆ¯šo6çòùê, f ƒý­é£z±ýhŸ®È⇭y„úk\Ö³%m]VVÆÛï¼C¯^½¬Ón½m 3¦Ocÿ¾½ìÛ»‡„„ž}ö9›ù7mÚÌêU+Ù¶u ù¼ôòËn§¿øâKäææ²iã6nXOVf/½ô²ÃýÊÑ69s>úGæ‡ï¿cûާµ6,{üWPXXÈÖ­Û°X,lذ’’b®7Φí\­‡«}ÖÕçëtÖÁÏÏ—W^y™ûïŸI]]ƒ üýý™på•,þ|±MŸ¾˜k¯¹??—õtgiÉçÝY~Gû‚½cAÓ¿í/ÎÖÁÑ2Ý9>:[·Ö>~6.Ûl6c0ÔL^n:‹…´ãǨ¨(ã¢Ñc¸êšëÑétdd¤¡R©  ¼´ôÄ]ŠõådgfIddéi©vçm:a±XH=z„:½ž±—^θ ±˜-de¤Ûä­©®f䨱ŒŸ0 ²23ÜNw´ç hÖF Óôuz†Íu“o>cç®–žOÝ9†¶Ù“ˆÈ(›WSK–,eÑ ‹ˆŒŒÄßÏùóŸoöm*2"oooî»÷^öíÛgw9_}õ^XT_ŽsŸ~Š_~ýÕ&Ïóóž'88øŒ¬WãuûîÛoY0>!!!„††²`á‚VÊqõjœï¿rÉ,ªÅ`² 7˜Ù’RF‡`­MÞ ‡J©Ö›¨Ö›Øp°„ÎÞvËê­cýÁ*kLÔ,lN.£c¸—5Ýh²à¥ñÀS­¤¢ÆÄê}Å.ëÙ’¶îÒµÿþ÷ç|øÁÉ^µµkV3|øp´Z-~~~<õ䓬^³Æfþ†m‚ùóùöÛïÜNÿîûïl¶åÂE ùî»ïZ¼_iµZòóò)**"::š¼þzë|X•Jî½÷^Þy·¾×äí·ßá¾ûîC©´ý»ZWû¬;Ÿ¯Óqá…2lØ0^}í5§ù¦OŸÆ¿>û ã‰oœF£‘Ï/æî»g¸UOwö—¶ÀÙþr*ëÐÛ¯5Ÿö¨5 †:4žõC99ÙÙôé7_??ÊËˈŠî@NV¾¾~tèÐ#‡“Ñj½¬'Éì¬,»t£¶¦†ì¬,‡ó6ï¹É¡Oÿh½¼©¬('®cG²²2ñññµæé?0 ¯/••ÄÅw$3#[éÎÖÃ]ý B§ó±þV]kŸ»šž›[º¿¸:ƶ†V½Æ¤!‚wØ—ŸO\l¬“ñçëß^^^ÖR³åäæ2lø›iM/¦‹ˆ?+ë•_P@llŒõ½³õkñ0‘ÁØ¢|‘Z†u$Ôßµ‡Ân9…åµÖ@¡¨Ü„—§Ò&½áoÖƒ‡G:\Ö/ÛóÜ9€A þèfÖî/"5¯ºUÚÚb±––ÆCsfï¾}ÄÄÔ·ï¶mÛY¸p!{÷í£ººÚîvo¼-bcc(((p;½  ¸¸X›mYPXØâýêÓO>æo¼Á«¯½†ŸŸ æÏçÒK/i•}bò¤I¼öÚë|÷Ý÷8xÿû³fy\­‡«}ÖÏ×ézò‰ÇåÆŽËÁƒíæILL¤k×®üò˯\}õUüüó/$% "::Ú­zº³¿´Îö—SY‡ÖØ~­yü´ÇPW‡J­¶Õuz=kV6¿–ÌS«ÅË[‡Î[GqQ!Z// òóñ ð'(8˜’â"§óR^ÖdèÝ@Pp%Å%˜Íf<=µèkkÑjµTT”×û||(*,Äl6£ñô<‘îEeE…Ëô–ÔůëØxˆ©µÏ]ƒ“–î/®Ž±g-09Ý»j¬ÝUaa¤¥¥Ñ©S'·ç·wE{XX¿üü.ó¶NÏ…ã²BCCIKO§c||ý˜pzºÓº´¤^îfmÈ7n`ëö‘VPƒÞ`F£Rrï¸8›rü¼Ô”VðõVQ­7Û¤7ü]UkbÉúl*kMöwø=?nÍ >Ì›Kú…ðѲôÓÞòÄÅÅñî;osù¸+1|8>>>LŸ1ƒyóžcô¨ÑøúúPYYI—®ÝlÊm¼-Ò32 q;=4$Äv[¦¥ìrû5Ö·o_þýÙgX,V®\Åœ‡f÷%»Ze?T«ÕLz³x€Ç µZmÓÝêÎz¸ÚgÝù|îgI¥Rñö[o2mú ~ýåg‡Ÿ“Ó§ñÚk¯sÕUøèãxéÅÝ®§«ýE¥RQ]]—Wý7ñ’’§ëéN~waÿv¶¿¸³Ï7]¦«v9ÕõhÍchvvAÁ˜Í&, '—Ž— ¹- ‘ÑѤ$"iède¦Ñ£w_ uuF—ó6þ[£VSS]ƒÑX ¬©©F£V£ôð°æ­ª¬l”^ƒZ£ÁÃÍtWuQ(˜N\`4ìÖÕd2žñsשžO]cÛÜPŽ+“&ÝÀSOÏ%''‡òòrž}nÞ)•3eÊm<òè£?ž†ÑhäàÁCÜsϽçäÛÎ5×LdÞsó(**¢°°gŸ}Öa^???Žuÿþü–^c¢R*0˜,ÔÍøz©Ó'Ø&`D <ÕJ<ÕJFô âPf…ݲö/gLŸü¼ëc× _5—µ¦_> ”@5 X° Pಞ-ÉàÁI|÷Ý÷ÔÖÖâéé‰VëIzz:>úX³y¶EQQÏ=÷×^{ÛéW]}Ï>û,………2÷™g¹zâÕNëho›Þ{ï}¤¤¤`t‹ÙL^OJÊ¡sÞc×ÒÏ»«cl» Lžó0]:wfÌØ‹O¹ji'Ù?Û¢u«Wº•oĨ1Ö¿+++¨¬¬p˜·ººŠêjû^s6oã½Åb¡¬´„²RÇ¿x^YYéôÙ=®Ó×Å`0PXo»^&×A‰»ÇŒ¶ºß¶J`r¾~(Ïõz9º&û•v„È]ÚF¶ÁùoĨ1nkµÕÙ_Ûp`"¿ {nœoí~¦×'+3Ãé2\¥ !þÞ'Èá#G;=V¹J?ß­c¨J>:mùD.m „m)˜’Þ³3OzLÚt`"=&B!$0m„YNäB!$0iîxêQi©³ìöáÀžóf}º dã¦Í²aÛ‘¨ˆPi!DÛ Lº÷è%-u–eç®â†n†çÄÒ¥Kås/„8'”ÒB!„ÀD!„B!„BH`"„B!‰B!$0gÌ¡C‡¸îºëÆÓÓ“¤¤$¾ùæ›V+_¡P´j}[»>ž?þX6®B LÚ›+V0yòd§yæÎKvv6‡&%%…ôôtžyæ›<«W¯fÆ ”””pÍ5×0cÆ àäïÙX,›ß¶™0a³gÏ&??Ÿ¼¼<ºvíÊœ9sl¦ýû÷³k×.RSSÉÌÌtZÞ”)Sxþù穨¨`íÚµlÞ,O…BŠFÁ‰’ú'ÁjfÝwOÙ[ï¾GqQ¡´Ð¹ @VÚò«Z­¦¦¦•ÊñC{£££Y½z5;w %%…1cÆXƒ…BAQQAAATWWãïïÁ`°¦»úÁ½êêjâãã­½&111¬X±‚.]º4ßÉì”Ëc=ÆÄ‰éСƒlð6féÒ¥Œ3ZBá–àÐ_=PTå@ɉWQ£¿ËO¤×œÈoL€°HI{ÜøÁÁ8Í“——G§N¬ï;uêD^^žMž† ÀÛÛ£Ñè´Ì72bÄ|||P(èt: O®9996ËtåÿûË–-£_¿~$$$ðÓO?ÉÆB!I{3vìX–.]ê4Oxx8©©©Ö÷ÇŽ#,,ì´–;iÒ$fΜIVVf³™²²2›^ÈÈHŽ;ævyIIIüøãðöÛo[‡’„BH`"Ú‘yóæñÒK/ñá‡R\\Œ^¯gëÖ­\ýõÖ<“'O¶^’ŸŸÏƒ>È7Þèö2HNN¶™VSSƒV«E«Õ’ššÚ,¸ýöÛ™5k™™™”––òÐC9-鍊nâÀ ,‹Ë!„˜ˆ6¨sçάX±‚ßÿ„„üüü˜9s¦Mà±hÑ"ÂÃÃILL$11‘¨¨(.\èö2yä dsÍ'Ÿ|œ9sÐétŒ=šaÆÙÌóÜsÏѽ{wúöíK§NˆuZÞÕW_͵×^‹N§ãñÇç‹/¾+„B.~m«]ü*ÄÙ ¿Šö*8$€¢Â»ïÛZýΣv—‹_…B´=yyyÜ6åvââ;NBbgFjÛAnpH¨Í+"2оýú3sÖ,rsse£že˜!„h5³x€_ý•ÞÌÌ ¾ýß7įŵ‹ºPTXÀ±£G¸óÎ;øÏ¾æ®©SÏÈ2„&B!΂õëÖЯ_?<5úöíËçÿþÌ&OCÏÄç‹3`à@"£¢qÑE,[¾œ ѳWo""£5j4Û¶m³™÷ý÷? 8$”аpº÷èÉCÍ¡¢¢¢U×ÁÛÛ›éÓ¦ð×®¿šÕÛÞº4ذq#—]>Ž1±Dwˆáú&±rå*‡ùÞÿç?_“4xá‘\8l86l°æ±X,üóŸï1hP‘QôéÛ7ßzËæÎHWËu•.‰BˆóR@` #.Éý3gñùâŇCvÿµ›uk×ò¯}ʹ馛)).fë–Í|öٿػo÷Ý?Ófžšš6nXOfF:sŸ~šÏ/æÉ§žjÕu¨®®æ“O?`àÀ6i®~”tÆŒ»Ù¾};}øGfΜ‡øè£\.sÓæM¬^µ’O>þˆääd|p¶5íwßå™gŸeÈС¤;Ê-·ÜÌüù øç{ï¹½ÜS­×¹ ¿¶Qrñ«8—äâWqªÖ®]ËÜgžaÿþÖijµš×_{[n¹ÙÚKœ|ˆà` ‘Q:x€ÐÐPÌf3¡aá( òí.Ëd2App)'Ip*¿6íià©Ñð믿Я_?k>òór›ÍÛP~\|G uuüöÛ¯tëÞOÆî²šÖoßÞ=DFFZÛ¢ñz÷0€ôô ¶oÛJÇŽ)++£SB"qq±ìܱíåºJ?]rñ«Bˆ6颋.bíš5ìÙý¯¿þ æ/XÐ,oHp°5piZ¢V*ëOO‡+6mÞÌ•WN .¾#!¡a„…GP\\Ò*uo¸þ#;+“-B_WÇO¶¬7æ©'ŸD¡T2fìÅÄÄÄ2öâKX³fËù"##mÚ¢ñzggç0(i0Á!¡tJH ##Óíåžj½¤ÇDXM™ÿ­4‚8§>öZiqÚŽ9¡àééIvV¦Ã^ w¦õèÙ‹¼¼<¾úêKÆŒÉd"ºCŒÓ’–ô˜4ÎS]]MLl†œì,›|ùy(•JrrrèÕ»O³ykkk9pàëÖ¯gþü„„„|è Ûõk:mÀÀ¤¥¥[{“q¶\wÒÛJ‰J>6m×M×_- Ήÿ|óƒ4‚8%&\Å]wÝÅðáÃð÷÷çàÁCŒ5ê´Ë6™Løùù¡×ëyñ¥—ÎÈ:èõz/®èc·®]­Óããâ8ž–ÆüÁÈ‘#yù•Wš©¼ýf?ø½zõ²NÓjµ§UŸ»gÜÍSO?ͼççó¢…xxx°yóÞÿà¾YºÄ­åž‰z)˜´af¿ð+„móÌ'//ƒÁ@PP7Þx#óŸþ´Ëþðƒ÷yâɧ¸úê‰DFFòàƒ´jÝ_kâïïÏ¥—\ÂÂ…'‡ ÞzëMyô1î¸ó.:DG3gÎkÓà¶ÛneÞóóÙ¾}; …‚Áƒ“x~Þé­ûÝwÏ@ë¥å“O>¡[÷xzz2dÈ`î¿ï^·—{&êu¦ÈPN5eþ·Lºv‚4„8'–|û“ å!ZÔÉPÎßt˜!„ø»‘À¤ “¡!„˜ˆ6ã\Æ%w‰âÓ•Ù²„BH`"“æ‘ÉÔ±Ñ|²"ëŒ/ûl,C!„À¤q4”#C*¾Ù”‹ÁhaP‚Ÿ5­G?B|Õ|³9—:£™aÝ’èϺƒõˆÝ+ˆuŠI+¨ÅK£d`‚?3+eã !„°K~+§÷˜4}5ž°ö@ •µ& F ¥Vì§Áb=i•ôŒñAq"¿èÑAÇîãX,é͆ƒ%TëMTëM¬?XBb„·Ýåt‰Ô±î` •5&ô3•ZÓºEëX"­Î`asrý¬éF“/žj%5&Vï+¶»^òj[/!„ÑŒÞ`t9½¼º®ÑtP*êÓóJ–×âIJv]¢td×RT¡À[ãAAy­õ$TXfÂËSiSvÃßÞž–éí^Û¢ÓzpãðH‡uüy{ƒ;0(Á½ÑÌÚýEË«–+„B“ö×câz(Ç^ž†i»Ž•2´k ÉY•ôëèϪ½…Ö´j½ ?/¥Uü¼UÔèÍvË®Òñóò äDÞÆªjMüw}6•µöƒ¨Ü’Z~ÜZ?\Ô1Ì›‹û…rtYšl\!„vÉPN›L\å8K?ž_ƒF¥¤o¼£™¼R½5-9«’‘=ƒñÒxà¥ñ`d¯`eUÚ-gz%£z‡ ÓªÐ¨”\Ô3Øš¶çx9cû„àï­F‚`_ ã„YÓÇ #ÈGƒR¡ÀB}Ž •ÈPŽBHI;äÎíÂöò4ž¶ãh—ô åÛÍ96Ó×,blŸPî[ÿ“á)ÙU¬?Xd·ìÉÅŒìÌm#;€6'—XÓ¶.apb ×]‰ÖƒâJ›SN¦É©âʤpt*J* üº#_nwBáüˆ_5eþ·Œ=FBœ«W­”ñB¸M~ÄïoB:„BüÝH`âBzz_ý5k×®åð‘#”––âááAhh(={ô`ìØ1\wÝu´ú²eÈC!„&€ºº:,\ȇ~„Ñh{ljÑh$33“ÌÌLþX¶Œçæ=OfFz«×Aâ!„˜œCÁ!¡œrzkÑëõL¾ñ&Ö­[çVþššš3R‹D&B!$0O>ù”MP¢P(¸å–›™rÛmtëÖ ¥RIjêqþøã>üè#òóóÏH=d(G!„&­ 8$ÔaÚÙèñ8û÷àóÅ‹m¦½ûÎÛLž<ÙfZÝéÑ£;3fLç‰'Ÿ´[–ÅbáeËXºt);v줠 ‹ÅBXXýû÷cÒ 7pùå—£P(ìοiýÙC…BH`rºgkø¥µ|ùÕ—6C('^Ý,(iL§Óñö[o5›^\\Ì´é3X³¦yp‘‘‘AFF?þø#GŽäã>$((È&Ïíùá†dçÄÒ¥K¥„çÄY}òëñ´4n¹åVbã≊ŠfÒäÉÚ>+孷ߦk·îtˆ‰eÖ ¯«³[–ÉdbÁ‚…tíÚè1L›>ÊJç¿Zë¬'§Á†õlÞßvë­-^O“ÉÄ-·Þj7(ijÍš5ÜzÛm˜L&Ù…BH`r6vóÍ·pÏ=w“’|ˆC‡’˜˜ÈÜ¹ÏØäÙ´qÖ¯ã¯];)È/à¥_²[ÖoüíÞͪU+I>t­VËóÏÏ?í:¦?nó¾oß¾-.ã¿ÿ]ÂÖ­Û¬ïu:ïýó]ާ#=í8ï¿ÿ:Κ¾eËV–,‘o¨B!ÄY L6nXψ#ÐjµøùùñÌܹ¬ZµÊ&Ï /,"$$„^xaßüïvËúâË/yù¥‰ŠŠÂÇLJçž}–Ÿ~þÙéòÝRª®¶ýå[__߯çÒo¾±y?oÞsLš4 ___t:7\=Ï=÷¬MGë)„BH`r†lݺñW^ILlÁ!¡tˆ‰¥¨¸Ø&Oll¬ÍߎîxÉÉÉaÈÐ  %8$”nÝ{4:ÞÞÞ6ï+**Z\ÆþýûlÞ_9~|³<®¼Òæý¾½{eoB!ÉÙ\Ø]S§2mê4öïÛKaA>ÇS5{VGzúÉ•eddjÿºððpöíÝCQaõUXpú·ívŒ·y¿{÷î—QVVnó>88¸Yž¦»–•—·©ÃÑBB!Äy˜ÔÖÖ¢Õzâ©Õ’–žÎCsæ4Ë3wî3QXTÄÓOÏåú뮳[ÖwÜÁCÍ!õøqŒF#dÚôéN—ïÎů»Ðæýâ/¾hñzúûûÙ¼/nÒ+doš¿ŸŸìB!$09› {ëÍÿcîÜgˆ‰‰åê«'2dðfy† °aÃéׯ?AA<ùävËzðÁ:t×\s-bb™q÷ÝŒ¿büi×ñÖ[nµé-øþûX²d‰ÃüUUU<ðàƒ6Ózöìeóþç_~i6_Ói½z÷v»'£áÀ¤I“((h»·cKÏ‹Bˆ7'JêŸk¢™uß=eo½ûÅE…ËFypöl¾øâK›“ë­·Þb}ò«B¡ 5õ8Ë–ýÁ‡}L^^žÍ…µ_~ù•M°âëëË«¯¾ÂãÆðûððÃØ\¿òö[oqóÍ7Y߯X¹ÊîsL …uø+??Ÿ‡~˜ªª*¾ýöÛV(Zã‘ø­UŽ8»–.]ÊØ1£¥!„n  ýÐ5@P”œx5ú»üDz͉üFÀ˜ËYï1i/^~é%†]xrHÇb±°xñ\réeÄÄÆÑ!&–]Ä‚…‹ÈËËk6ÿäÉ“4hõ}EE÷Üs/±qñÄÆÅ3cÆÝ6AIRR“'Ojq=ÃÂÂxóÍ7Y¶l™M ðÆoƒRY¿ykkk™>}:þþþøûû3cÆ jkk­óèõzî¼óNt:¼úê«.{=O3 Ì™3‡ÐÐPyýõ×mò4ôð4øí·ßèÕ«†øøx>þøcÙé„B ‰Z­–¥ß,eÆŒéxxx¸Ìïååeó^¥RñÕ—_2|øp—ó6Œ/¿øÂ­å8ê‘hjË–-ìܹ³Ù ÀܹsÉÎÎæðá䤤žžÎ3Ïœ|~Ì3Ï|˜ÒÒ2T„†…ѳGÆŽõ×^K```³yÍf3¿ÿþ;K¿ù†;wY¯ aÀ€þÜpýõŒ7Îڳј;C9<ú裔––òý÷ß[Ó³²²ˆŠŠ²ÎÍêÕ«éܹ3)))Œ3Æ@tèÐÕ«W“˜˜hMïÚµ«u9ö†cO‹‰‰aÅŠtéÒÅi}ÄÆÆòØc1qâD:tè ŸÂ6H†r„-ÑšC9˜´QΓ~~~\rÉ%¼û‡‡; T*z½ÞÚ+c4ñòòÂ`08LW«Õn&*•ŠÚÚZT*•[ɶmÛX°`7nÄßߟÿû¿ÿc„ ²Ñ%0BH`rf~ÄOœY-½˜4<<œÔÔTkȱcÇ ³¦GDDؤ§¦¦6 lª««­Ÿ+**²IŒŒäرcv{LìIJJâÇÄb±ðÛo¿1uêTrrrdà !„kLþ&OžÌìÙ³ÉÏÏ'??Ÿ|o¼Ñš~ÓM71gÎ ÈÏÏgöìÙ6ó÷íÛ—×^{êêj²²²¸çž{lÒo¿ývfÍšEff&¥¥¥<ôÐCÖ´€€’““mòßtÓM8pƒÁ€ÅbÁh4ÊFB!ÉßÅ¢E‹'11‘ÄÄD¢¢¢X¸p¡5}Á‚GïÞ½5j”Íü}ôßÿ=þþþ 6Œ1cÆØ¤?÷ÜstïÞ¾}ûÒ©S'›Ÿxä‘G4hÍÔÕW_͵×^‹N§ãñÇç‹SxˆBˆó“\cÒF9ºÆDˆ³A®1B´„<ÇD!„ç% L„B!‰B!„&B!„ÀD!„B!„BH`"„BÑRgì‘ô»RrøßêC¤ç–´¹•öP*èÀµ£ºÑ¿K¤ìB!Äù˜J+äÓ_vsÁÀ^Œj÷×sÏ%³ÙBN^!Ÿüüw\Zà^dOB!Î×Àä«eûз7þÁTÕš© [ÛâçÈÀ~}øacŠ&B!Äù˜dç—Э?µ¦6½òž:² JÙ¸n eeemªno_Ù;…BH`Ò ¹©û0›Ím¾” ½úö#$4¬M 9ýò˯guyË—/ç¶Ûn#//‹ÅÒì½BÑn%,¸o|»h€É}„V«¥²¢üo½#<õÔS|ñÅ\|ñÅvß !„g¥ÃàŒD;J°˜Í˜ÛÁK¥¤MÖË‘²²2fÏžMÇŽQ«Õ1qâDV¬XaÍ£P(Z¼ÍöïßϨQ£¾B!Úm‰JYÿÛÅía@¥¤] ULž<™„„V®\Ill,ÅÅŬZµŠ 0vìØS.·¦¦•Jåð½BÑn{L<¬¥ZÚüËãD`ÒÖ^ެZµŠ—_~™Ž;âááAhh(“&MbõêÕ6½% …¦ç䨱c\uÕUøúú¢Õj7nùùùvçqT†BÑ.•Rf3³¥Í¿TJE» L† ÆŒ3Ø´i555ÍÒæmZ΄ ˜={6ùùùäååѵkWæÌ™cwGe!„í40©rÉ©œ5žžg5Pµ³“o¿ý–¸¸8¦OŸNPPqqqÌž=›’çOØÝ¿?cÆŒÁËË ^xá–-[&Ÿ!„ÀÀâàŸ§Vë0­¶¶Æaš»e´ä_{ LxñÅÙ·oÕÕÕüñÇTUU1iÒ$§ÛdãÆŒ1 :ŽÂÂBù!„hSÎØí C9Ž8KsWk”áÑŠ¿šÍfî¿=ztgÖ¬™g|ã) ºuëÆ›o¾I`` Ó¼“&Mâõ×_çòË/ÇÏÏŠŠ üýýå „âïÑcÒpWŽ£ÞGi^ÞÞÖ¿ÿøã ˆŸ¿?]»uã_ÿú—5€—··M~£ÑÈ3Ï>:æ/xž~øÑé5&NîÊiܳã¥ÕÒ½{wž™û7Üp=ÿxãÿlzj^}íu’†\@ÏÞ}yàÁ‡¨¬¬Äb±Ð¹+ »’й«užôôt¦ß}½ûö§{ÏÞÜ9u……….{LÆŒ÷ß~Kqq1F£‘ŒŒ >ùäÂÃíyž~úi*Nô5˜8q"GÅh4’––ƬY³lÒ›.SîÆBqþô˜x€Å³ýW}‚ë´/¿ø‚®`èÐ éÕ³7¿üò›Ó2²³³é×o:/:/;&PPPàpYsC][6ätÃõ׳qÃFëû÷Þÿ€½ûöñÃwÿcóÆõxj=yù•×°X,N>ÀáäƒN>hgúÝ÷pÇíSزi›7®§c|G½ð’Ü¢+„âoíŒ=ùõDèà$—ë´°dɱX,,[¶œû+ŽvXFDD+WüITT”ÛËR)Á`08L·—@Ii©5mÉÒoøèÃ÷ à¡`âµ×3÷é'–óã÷ßìaòðàÁfrñ%—9­‹B!=&§˜8{â*n¥Ýqç:tƒ¡ fŒF£5ÍßߟÇSlæ:õ.f=ð©©Ç0 ìß¿Û︗ט´°Ç$??ŸÀÀëû¼¼<Æ_y=zõ¡G¯>Œ9šââb§åìÚµ‹[§ÜÎÀ¤!ôèÕ‡ƒSRZ*=&B!¤Ç¤µÕ?’^Åâøqæ>¾ÍoU­(/?q¯Ÿoüã¹éæ[IMM¥sçÎ|üñÇÖ´x€á#FRUUeoÎCsxã7?~9¹¹tîÜ™Ç}Ôi=<”-ïÙùæßrÁСִÐÐP¾úòsÂÜÌk[Μ‡åÑGføðaøètTUU3ä‚a.ê"„BH`rŠ=&X/Rmª¼¼ÌA`¡¼¼Ì:ßu×_Çu×_×,À#>Â#>b3M¡T0çá9ÌyxŽÝyÕÕYECZmm-©ÇóÃ?±lÙr/þÌš6yÒõÌ›7Ÿ'Ÿxœ¨¨HŽ;Æ}Âk¯¼€¯¯/©©©ÄÇÇ[Ë­ÕëÑh4hÔj233ù¿·Þ±YžB!I²„;û IDAT«& P€‚öð렜ŽúôG¡PàååELL†]x!K—|MPPu¾»î¼“OùŒ©Óf_P@||mªÍ´Ñ£G1zô(›ü7Ý8YzL„BH`ÒÚ<”  }ô˜´æ#é…BÑ•, E»¸ŒSÕ†“¥K—Ê*„B“Ö8Ù+ÚK´áÀä†n=THP,„Àäty(ÛO¸¾]X!„í:0iüãqmB¡kL„Bˆó90io$0B!ÎóÀD¯¯m7ppÿþ6W'·¯ìâœúí祄çO`âëçO…ƒ'¼¶%·Ü~W›¬—\|(ä³!„h/n½cjÛLÚ‹ö<9RS]ÍŠå¿3æâËðÖéä“!ä³!„h÷”Òí×ÎÛ0h°Ë dÉW‹Ïj½ÎöòN§.m©®B!$0i׆ITt‡v4!„MÉ]9팣ÀbÒÍ·¹5ã|K¾Zìö|meÝÛS}…BH`ò· 'g!„˜ˆvÁl6±}ë2ÒÓP«TtíÞÃ&½¡×¡¡ç¥áÿ†`Çb±°w÷_¤=‚Ñh ªC Iƒ‡¢R«­ùû Dò¡ÔTW» ’\•—“Åž];©¨(GëåE^}è”Ø¬Gõ­ª¬d׎mäçåb6[ gÈÃðÔj­ó:°ŸäC0ÄÆÆ1pð”J3VW!„˜ˆöîÞ¾¶–+¯º °uÓ»ù‚“¦ÅÁý{)).âÒqãQ«ÕìܱÝíd`Òkž¢¢B.7OO­Ëú¸*oë¦ <”¨èhjkjÙ¿oÝ“½£ú®[³’ƒsÁð‹0›ÍìÛóíÜÎ ‡[óäçqùê—·y#ûöì¦O¿g¬®B!Úa`òÝ7K¤õðò p˜fï:“†vzZ*£Ç^jí1è?(‰ß~úÁíå;z„‘£/ÆËÛ€>ý°ìןl“~¹”¸Sž‡‡ŠÚšôµz¼u:’†\Тvº|üUÖ¿=<<èÓ·??ÿðMžþ“N¶ÇÀ$V­Xf709Óumoä3*„øÛõ˜L¹kºlœ=`ÍÙðImM :ë{Ÿ–=A¶¦ºšß~vÈxyyµZyŽÉ}{Ø·w7jµšþ“Zt§Qaa{ví¤´¤£Ñh7OãöÐùøP[SsNêÚÞÈçSá®Û§Î8?€º:½lÑV¤õò¢ª²ßú€¤ª²²Eó{yy3öÒË­½§ËUyAÁÁ 9¨¿†cÛæM\uíõn—¿iýZúõHDT4jµƒÁÀwK¿¶ÉÓ´=´«3]×öF>›BˆsAžcrž‰‹ç¯ÛÑëkÑ×Ö²kÇ6‡yÕ åå6Ó:waûÖÍTVV`±X(+-eÓ†u§\WåmÞ°Žò²2Ìf3‹¹Eõ5M(=<ððøÿöÎ<,Šckã/;È&ˆˆ î"(Š"^MÔ˜ àFåf‘â.‚»‰Ÿ{4F ¸ qIŒ&šxj4Æõ^5‚‰" (" Da˜úþig``dàüž§ž™®ª®î>§«ûíªêjU!êöÍjëqö(+ELt¬¬m}_ ‚ ˆÚbB_ö­;µ1±ë·oâS'¡®¡>}m‘õO¦ÌrúôµÅ/œ…P(äÖïcÛ‰?/ÿ¥|>ô `ÛϾÞû*¯<ó.–ø+òO½zC©A«Šìïçaˆ‰ŽÂß‘ÅÐi×½ûÚâYZªÔz&Mqáì…BXZYîÿ€Fß×ÖÕM‚ š‰VÕJ¡¢¹pþ܂ݡ{ÁËË­W¡çÿøŸNŸQë·6~;†ÏfÌBi)ÿ­âî[pþ×;(/´Çœ9ó¦NJg(Ñ,„‡‡c„ñdˆF 5^¯È„ŽN»³Êð(_ò$þV¦ó+ó T`JÑb‚†|*kãOxò¦›§‰ÙªOd_‚ü¡ì´ª®œ¶ÞôLƒPÖºI}ÉDË&JZA´uÚé꡸¸ˆ Ñ®}ù£5Ñìoå0ÆÞ:(RVRR>þøtéb ##c¼óλøí·ßdûŒ1èêê5XY¤Ü e@üvRcÕ]]=xxxB$5z}R¦ ïzÕXÇN>QÞûGSß_ÓŽ­B˜€±·rÊz’œ 77w¼7zbcî!ëŸL}ƒððã ³}ñ>4TY$L¥x„läúÀȨ=ì?ÐøõI™‚<û6Ö±“O”÷þÑÔ÷—Æ´#µ˜(¦x7oþ ‹/‚ŸŸŒŒŒ ©©‰ÁŽŽ8zä'.ŸÏÇÿ…èlnÎæð_¸|>ŸK×Ó7À÷ß„­m?wÀ¿†Gll—zúÐÓ7àÖyúô)¦zýÌ:£ƒIGLšô!rrr¸t@€Ï?ÿÖ]m`ÑÅ»vï–* šÉsYOß!{ö wŸ>Ð70c /]§¡02î[Û~8|øp­õAV½ÝŒ}û÷#))©Zš¢õHOßß}÷=úÙÙøƒ †8 Åßÿ£Gb€Ã@®¾ÆÇÇsë…B¬]·]mº¡£i'L÷ñÁ«W¯”â ½¶4y¶ Ÿ(ïý£j¹UëW]ï/Uë¤ËXW„‡—ÚFú³gèѳµ˜(£0ùóÚ5|8iR­elüòKdee!æ^4îEßųgørÓ&©mDFFâÒ¥Kx–ž†ñãÇca@c(,x (,x‰Â‚—Ü:S½þùóç!åÉœ</^™3¿#ãY:<==±0 [gû7ßàÞ½DFFàIòchkkcÍšµJ/LäÙ‚|¢¼÷Úü\ŸûKÕ:¹|ÙR|½u+***¸<_ý5æÍ›Ûâ„I³ÏcR[E‰‹½ç½ƒ’êw0AÎól¨«×<Ö·wŸ>8wö,ºwïHNNÆø ˜ðº²¶GZêSø|>,ºXr620l/WPðù|ô³³GÊ“d@ß¾¶8sæwôèQý µ.^¢yLˆf#<<^^^Ü9m`ØI‰‰èÜÙŒËckÛ‹bÜøñ°07—Z_‘ú ™gÍÚµPWSǺukå®_µ¶GêÓséÌ:W‹“¬¯ýììqê·“èÙ³' ''ÿ>É5ºmå]¯±]M¶ Ÿ(ïý£ªí$ãês‘U'G~ æÏÃÔ©SñäÉŒ?ÑÑwëô}³úb`ؾõÌc"½,###dee¡S§N5®›“óæææ\æææÈÉy!U¦®®.·¬¦¦¡P(•^uû·ïÜÁÆ wÿ>JJJ^+A._öóçRÛ$eCòÜìÐÁXjùСðMP0¾Ú²úúøjó&Œ;¶Nu[œgåŠps‡Ñï†óСRiòêèééIÕMYq’õ5++ Žƒ‡H?¥U)³9¯}5¥É³ùDyï²Ê›û‹¬:¹xÑ"lظãÇÇ—›6á?ÔÔÔZÜ=¦Mtå¼ûî;8}út­etìØiiiÜrjj*LLLêÔW5ÝÏo&üüüp?.9ϳ‘ò$Y*½S§NHMM¥·rˆÑ•SõuppÀÑ#?!1!_où ‹—,U¨;BV „îÙƒ%K–àÕ«WRiòꑼº)+®S'SÄÅÆàEÎs.ä<ÏVú®y¶ Ÿ(çýC]]%%%Ür'·~Õ%]ÆŽu††¾ürîܹƒÏ¼?£·r”U˜,_¶ »v‡àÇŸ~/?eee¸ ß~\OüßêÕxñâ^¼xUÿ·“<=>1 ñø±tå,åó¡¥¥ ---¤¥¥aÉ’¥RëüÛË Ÿ± ™™ÿàåË—X½z ¢Å“Ù³ç 1) ‚òrˆD¯/ÖVä]X{õê‰éŸMÇç_|!•&¯Õç&8}út,YºOŸ>Eyy9>|ˆY³f+½0‘g ò‰rÞ?úõ³ÅžÐP”””àŸþÁ²eËêd/Y¾«iÅ‹aOh(–,Y u&Ê*Llllpâx8®\¹'''ØtëŽÏ?ÿžž\ž/¾øM:Âi¨3œ†:ìS'|þùJ…Oœùóæá˜v2ãâvìØ5k×Áº« <'}ˆ!NC¤ÖYºt zöì‰Q£GcÈ'XXX0Q"äMñ//½±ÖUaâê:¾>¾èÚÕ¿ü߆†ÖZ¹QùùÍ@NNŽTš¼zTŸ›àB899áÃÉS`ÝÕsæÎƒ»»›ÒÓNfÕ‚"¶ Ÿ(çý#è› œ?Ý{ôĸñ0bøˆ:ÙK–ïjÚgUUUtëÖ ^S§¶ØyLš}ðkÎóì·>ˆÇáü¯w—û¢ÕܯEDÖ{ðkØ/Ghzú&µÙñmì,¹®¬rc¸q=íŒ`k׿É=<<#ß}‡N‚F 5^¯ÈÊÃgÓ}0ÉÓ“&MjÒív2ëÜz¿Ò·rêGRÂÄÅÜC‡èÝ·ŸTZCŠ’Ö"r”ù8díWì½»0î`‚>¶ýZEÝ$ȾäÆE$á—cÇðôéSLœ8±E “Z’?‚ƒã`¶PQQ¡+K+ÂaÐ`ºPÓ (Œ¹EXZZbÿ¾}PQQ!aB¤iÉÎúšššèÙ«Òž¦ ;ët6·Ù:PQQ{Q·ñ,= `i݇p¯ïÉjIljÇAˆÅùc¸ƒ§O’!–ü‹%†89C]CƒËï0h0’‚_R"³E ¶íŠÿ;Š„‡ñ(åóa`ØNÎÃÐÞÈX¡}¨Z®¬ã(.*½»wó<"ƒi§N:l8´´µ¹u>@RâC…BXYYÃÑi(TUÕdž{ŠîOm¶WÎÛl‡ê݉Öë23Zͱ´ abÓ­žggµ™ ”ü( =zõôèÙÉ’¤„‰$ñq1àóùpŸà àö¿ƒånG,Nª ˆ„÷‘Ï˃‹Û8hhh úîÄÆDÃqÈP.O^^.\ÜÆAKK»ÞÇ™“óc>p…†¦&%>DÔí›x¬»Âû ï8"¯]Á ÁN6â]ˆD"ÄÇÅ &: Cÿ5‚Ëó"ç9\Ý'nßüñq±èï0¨Ú6ê²?µ!¯œ†ÚÝ8›¶v½"uE•Lв(.*//VÖ]¹^^Š‹dÏZ˜žú‡@K[ÚÚÚ8xÒÓRßjRž$cÐ`'è´ku ôw„ÌgéRy ~+QŽC*·¡®ŽÞ}l‘_ùî¿¢û ×qaÚÉ jjjÐÐÐ@ÿ‘%}ÛNK[‡ -õi½mÒ¶m¨íAP‹ =•5LkÉã$”••âį¿T‰„«?É—––BWO[ÖÓÓG)ŸÿVûÀ/)Áù?Nך§!¦@ÖÔÔâþ«©«K+Šìƒ ¨è´%ÆP¨¨¨ B(„Zåw eer÷MG§Ƹ¸B§]»ú_=¶ÛÐûpãz:ÂÌÜ(//Çoáÿ‘Ê#i»â¢"h× ¸b)§¡¶£EüI‘ ˆ¶%Lh®š ¯÷,-LL¤D‰øIÞ¸Có+x}4þþÓ¥^Ã,)æãûƒÇöŸãm¶Å¤>3¿2Æpü??cêÇÓèì&šüü#¢Š •Ö3ó« OSS€Êy÷M;væDKM :K/§3B‚—ù<©1$„ò!9¶ŠºK‚ ¤QaRZZ†ââ’ÊÇ~àYF:¦L‹2AT  T™ÙT (Ç… äÁ*\¾tý’!”#A-@˜HòàA* ŠÄÉL733†ƒƒyOS>ú„Œ@A0iH Šk[R[÷AÑøXXX 33“ A48J3ókEEÊ˨¨¨àâòóóª1åååä=‚hDF 2D“œœŒY³f¡_¿~èÚµ+ÜÝÝqöìY¥Û϶"Jrrr°jÕ*8;;ÃÚÚ¶¶¶˜6m®\¹B'k#¡4-&"‘¨ò÷0‰‰‰©–oôè1€ÒR~«wެ¹L¢©hד¸Ò<}úS§NÅâÅ‹±mÛ6èêêâÁƒØ»w/ÆGjb²³³áéé ///„‡‡£sçÎxõêîÞ½‹ƒâ½÷Þ##5ªxóª°6ƒ…óç2ÆËË}Q¯pôðAÆc…/k ?<ÀÄLý÷dvì×oÙ†M‹Ø†M‹ØÔOfŒ1ÆãåV âü;wÉå#šŽ &°ëׯsËׯ_g ¯onnÎΜ9Smñãdz?þøƒ™››Kå=pàsttddüF ®þµ~mþ’—ššÊ¦OŸÎzöìɺvíÊ>ýôSöâÅ Æc“&Mb§N’ÚFFFspp`………­Þ ,`ë3y~øñÇ™³³3³¶¶f£Gf·nÝb¿þú+>|8³²²b|ðKHHxëu$ÿÿôÓOÌÉɉËÏ¥óù|ÀºwïÎ ÀBCCe‡²±dɶk×.¹ù„B!ûꫯ˜½½=ëÖ­›;w.{õê•ܺQW›×Vwäù¡±ë€?œpÀ~Û¬0€€ Ð €cº´*õ‡*^Oa¢¢4]9jꔕCPö¦‹&2ò|ý|ñ™Ïg\˜à1|>—/ß„ššBöì"iÙ„Ä¡C‡dæëÔ©½ PÔò寪qQQQؼy3âããQRòzî"Éú€Í›7câĉøæ›o0þüùZuKÀÈÈ<¦¦¦o]Ž±íªÆUý¢v}Ö‘¤}ûö5æ}ñâºtéÂ-KþWfŒ‘›› 333.N<èWr`xvv6Þ}÷]©u«Þ³dÕºÚ\^ݑ燖R·”¦+‡!==©Zàñ²¡ªª ©ÀÃË—ÐÑn,e¡W¯^ˆ‹{3¿L\\z÷î]çr455áçç‡ÀÀ@Ìœ9šššdÜfD¨««ƒÏ3èÙÙÙX¹re½¶SZZ ---hii!==]j,‚ø 000{÷îE`` 444ÚŒ–.]Š={öàèÑ£xùò%bbb0{öì÷CSâáá7‚ÇãÇãaýúõ-ÂË–-ÃáÇŒôôt…BãÏ?ÿ”ÊçííåË—#-- B¡‰‰‰˜7o^ƒï¼º#–R·”¢+gèСØr Õ¬þTUß4Y‰D ÆFFð÷ ;J2mÚ4¤¥¥aÔ¨Q\…üøãÉ0m€íÛ·céҥعs'ÌḬ̀`Á‚zͯ„ 6`Ö¬Y033Ãܹsñûï¿KåQSSƒM›û  °uëVlÞ¼|>ýúõÃüùóÜMÉŠ+°råJ 2zzzðóóÃÕ«W•Þ]ºtÁ™3g OOOäååA__ŽŽŽ8v옔¨ …——²³³Ñ£G6øþ(RwäÑê–R|]˜ B___xxxÀÓÓ“ŒÑ INN†··7nܸAÆh%u«!¿.¬Jn"BY‰DøùçŸ‘ššŠ‰'’AZëׯGAArrr°aÃŒ;–ŒBuK&êä.‚ ”KKKXZZbß¾}PU¥ç¦ÖD—.]0bÄ”••ÁÅÅ¥Ö9Qˆ¶]·šU˜´„ÑäA4ñññt}h¥Lž<“'Oæ–†ê–r 1AÁÛñèñ£jñ¶}m°˜Î(‚ ‚h#(…0yôøüý§CUU‹+)æãûƒÇÈCAA¤éJñ45` Œ1˜vì ˜3¯æ7w1{æ\ò"AA0iXJKËP\üzŠ]0àYF:¦L‹2AT  T™vW (Ç… ÀLr"AA0iD‹. ñã?bÑ¢EdòA0)++Ÿÿ:ˆqpp¨‚hìííÑ»woœ;wpöìYôéÓ½zõºuëàìì ggg¬_¿^j",@€Õ«WcðàÁ9r$:$U®¼ôgÏžÁßßNNN4hæÎ‹¼¼<òG=ý OOO888ÀÅÅ'NœP(MžìììpäÈŒ3öööÕZ Y?,, ...pppÀ”)S˜˜Ø¢[Nª¶+z.OŸ>çÏŸ—ŠËÊʨQ£PTTD#e&jꔕCPV.Q©®Á×ÏŸù|Æ… ãÀçóqùòM¨©©á‡Cß“ ¢žàСC¨¨¨À¡C‡°páBìÚµ 9998{ö,Ξ=‹¬¬,ìÞ½›['$$</^ÄÉ“'qëÖ-©2å¥ûûûÃÛÛ‘‘‘ˆˆˆ€ ¶oßNΨ§?V­Z… àöíÛøñÇ«Pš"~ˆExx8îß¿_m_YÿöíÛ8zô(nܸ1cÆ`ýúõ-Ò/â⪭ŊžË³gÏÆÞ½{¹žØ»w/¼½½¡§§G'~”fðë…sãÅ‹ÜòDÏñð˜ø–-}¯»{„B00Q®\ý·nß _ê'ˆúгgOôîÝk×®Eß¾}ѳgOœ;w‡F‡¸››¯¯/–-[Æ=ÉK¦ñÅ7nW¦¼ôÓ§Osÿµ´´rF=ý¡¥¥…/^ ??;wÆÆ¥ì[Sš"~X¹r%Œeî«"ë¯Y³†††^Õvÿþý­ë \À6IDATÊ_ŠžËÇG»vípþüyŒ7iiiøë¯¿°jÕ*:é•Y˜,ôc¬Z|QQRR@¥Ê<&àæ:?%/Ä[°`Á¸¹¹qMÍ<]ºtáÒ-,,Àãñ¸å¼¼RSSëmÌ™3‡œ9s ¡¡A'·2·˜8::bwÈáÊ–V³ŠRU‘h1a0jß¾¾~äÅ&FÖ»ýôúpëaÑ¢EØ´iÜÝÝ... äÒ°~ýz|ðÁÐÓÓƒ"##N߸q#¶oߎŋÃÔÔ>>>¸pᾞþxï½÷ˆŒŒ tíÚUJÖ–ö¶~hk~ôõõ…——JJJ¸ë]]m ¦¦kkkLœ8‘NìZP‘h5Q­*š çÏ-غ¼¼ÜzzþßñéôxUXPcžßއaÂ$šÁ• ‚h,\¸nnnœÈlMŸP€ @!€üÊ'ñ¿°2_™_ €Sš‚ ‚h­ˆD"œ—/ß„ššBöì¢+Y3GGG2D ÆÝݹ¹¹ˆŠŠܸqùùùpss“Ê·uëVdggãúõ눌ŒDff&¶mÛ¦pº˜ÿýï˜6m¾úê+Ìœ9“POáÑ£G¸ténݺ…¬¬,¥õ«¸K'33“û€;vp­å°cÇÌœ9úúúJá‹+W®ÀËËKn¾ÄÅÅáâÅ‹ˆ…¶¶66oÞ,•'::/^DFF†Ä=.'Nœ@BB<==áííË—/#,, ‰‰‰?~<–/3%†fÍš…¸¸8ÄÅÅ¡{÷îØ°aƒÔvþþûoœ>} pssÊ+ZŒ½«Šñ—…µ,œ?—1ÆX^î‹z…£‡2Æ+,xYcøñà&fê¿'³3}ØqRáûƒ;Yäõó,6î:‹»ÎîÅD°;w¯°ÛQWØ­Ûÿe[¶n`Sÿ=™ÍC||>ñññ¸ÿ>þøãtïÞK–,!Ã4 U?ȯoONN>ýôSã‡~@TTÎ;‡?þG%µvaRVV >ÿuãààP-ÍË?ü€÷ßúúúÐÕÕÅôéÓ‘P§2f̘ƒJÅ}:Ο?/u|YYY5jŠŠŠH˜ÈBMC‚²rÊÞtÑDF^ƒ¯Ÿ/>óùŒ <ÆÏçãòå›PSSǾ§+Y3ÁçóqäÈ8;;×i½÷ß<k»sç 0f̘jycccŽû÷ï“Á›‡`À€\Ü®]»““ƒ³gÏâìÙ³ÈÊÊÂîÝ»¥Ö‹ŠŠÂÉ“'qñâEäææbÏž=dÌz¢hýøöÛoñäÉ?~—.]ÂóçÏɯ Ldd¤B»ûî»ïðàÁ„‡‡#""ÚÚÚ–{-»yó&>Œ7nÀÝÝóæÍCDD<ˆ›7oÂÅÅëÖ­ãòûûûÃÛÛ‘‘‘ˆˆˆ€ ¶oß.µÛ·oãèÑ£¸qãÆŒƒõë×fÏž½{÷r½°wï^x{{COOO¹’ÐŒ_ž0éõ Ö9ófA__/^¼Êã1ñôîÝú^w÷+„` `¢ \¹ú7¢£ã°ïwt5kbÄ}Ø:tÀ‘#G`ee¥ðzñññ\ Áœ9sðÁ`Ê”)RoØÙÙáêÕ«èØ±#¼‘ý(‰~úé'ôèÑ0zôh>|ÖÖÖ€´´4øúúâÊ•+\çÎãδ´4̘1—/_&×ÊÖ1cÆà‡~àüB~mxuuu™¶ûÂÅÅ@×®]yyyøðù.9Y×2;;;\¿~íÛ·”––bðàÁÕ✥†1HRZZ DDDpeþõ×_044”¹þG}oooŒ7ŽóçÙ³g¡­­ýÖ¶266n}_XèÆXµø¢¢¤¤<&ÆÍu ?~JW³f >>EEE8zô(Ö¬YSc3rMxxx 44çÎCRRBBBdæ#QÒ4¾SXXˆŸþ[¶láºx<žÔ€I ðx<©2,,,¤þK6/uG‘ú‘››+ewòkÃÓ¾}{ðx<©Áý’Nbrrr0~üxé§þ*÷,Y×2±À‰ƒªqB¡[މ‰App0ÀçóenG,Jd­?{ölÃÕÕ¡¡¡˜1cFƒˆ’†FiºrÒÓ“ª/ªªªPQQ‘ Œ1¼|Ym-mºŠ5zzzðõõ­W7‹¦¦&¦M›†U«VÁÛÛšššdP%ÀÀÀ~~~¸wïžä“233¹åÌÌLI­'™þÏ?ÿÀØØ˜Œù(R?LLL¤ìN~mx†ŽS§NÉÍgbb‚+W®pŽÅƒŽš%K–à“O>ÁÕ«Wqÿþ}ܼySæ}MŒ=عs'bccáå奔vWa’ÏË…¡¡ :pÁÐФ2N2ˆÓLQXXºŠ5!«V­BJJ „B!rss±k×.©~ëº0sæLÄÄÄTÔG4EEE8|ø0lll¸8WWW|ýõ×ÈËËC^^¶lÙ777©õ¶mÛ‡­[·bܸqdÌ·D^ýðððÀæÍ›ñüùs¼zõ Û¶m#¿60 ,À±cÇðí·ß"##B¡%%%øë¯¿¤òyyyaݺuxöì„B!?~ŒeË–5øþ”••ASSšššÈÈÈàÆ(ŠŠŠ æÌ™ƒC‡aΜ9ÐÐÐPJ»+EWŽ££#v‡ˆD5«?UÕ7MV"ƒQûöðõ¥›ZS2jÔ(,[¶ )))044Ĉ#ðÍ7ßaZ0’MÒ:::4h‚‚‚¸¸E‹aÓ¦Mpwwðº?=00PªŒAƒaÒ¤I(..ÆØ±c±páB2l#3þ|áÃ?c óæÍ#¿60æææøå—_ðí·ßÂÛÛùùùÐÓÓÀðÝwßI‰Hñ›S999°±±Áœ9s|6n܈íÛ·cñâÅ055….\¸P§2ÔÔÔ`mm‰'*­Ý•bð+AAÏÂ… áææÆ Ò†¢U~%‚ ¢q‰D8yò$ÒÓÓáêêªÔûJ„ ‚ Z9ýû÷‡……‚‚‚ ªªªÔûڬ¤êp‚ ‚ EßàjóÂDÌÚu«‘˜”X-ÞÞÎkV¯£3Š ‚ ”&#@ÆoË&‰I‰ð÷Ÿ.õeá’b>¾?xŒ\MAm¥c"”âij Àc0íØàõQÍoî :K/'/ADóRµ•DVë‰d^å&¥¥e(..ávùYF:¦L‹2AT  T™vW (Ç… t*ADó#~ÝWTƒ Q¸kG)ßÊyð Åâd¦›™ÃÁÁŽN‚P,,,j\'/ ¿¶Eûµ2*$‚HâWj#’¨TñUj•‚E€]úÚWãÊ_ÃÊx]Ú•ù5*ËP­R.AA­ÉV±àõÄi%x=‘Z^Oªö¯rù^O°VŠ×¬IŠ™Z'X“Õ?T!±q!€òÊ À›ÙcE$L‚ ¢M ‘„0k±V¨*<ävé¨×²Áªj¨BB*C^·° 2]½rYrö&AÑ:ʼn¨Š>(Å›ÖI¡")PDµiõ*‘ŠŠ’R¼îº‘%•å‰[K¨Å„ ‚ Z¯0aZAR˜ðeˆ“ªßÄ©i,Ô+#Td‘ %$î?·Œ0¼i¾Ç©I%AѺ…‰dFY¥()Æë±&¥2ÄId¿F L]Té–±ø@eš¯[O$»q¨µ„ ‚ Z·0d€·š”àMë‰Ò­&µ¶˜TÝXLHvã”ãÍxU QR@«²q7Žª„(!aBA­S˜HŽ3‘ìΑ'’Ý:âVjn1‘)LÄêGEbCªAºÉF<¶D­Š0 ‚ ‚hµÂU„‰äÐ2¼éÖ‘Õ£p‹ P½ß¨êxÉî±(‘ÕZB„ ‚ Z·8©úvNÕq©â°baR«(‘&5 €E!9úVÖ€WU#AÑæЬ—fÄZAr-&UË©u“ªâ¤ê± Q­A”@!‚ ˆÖ-HªjYSÔ6ÙZµ•Z–Uªˆµ*¿âÿâtÉõI”ADÛ'’]: ÒoßTý~ޤˆ©&rT*ª ü’(!‚ '!>jú­&Jj²Ä‰¼ ¯L‚ ‚ Z·0‘\–PaR›`‘5Õ<+!‚ 'Uÿ3BEž¨‘+$jkQ!ABA„¢¥VARA¡ò–éAA´MqRçôúˆ "AA4”P‘B•ìEA„²ðÿ%1«Àï?¥IEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_design_reports_details.png0000644000175000017500000013177612235000130027321 0ustar00murraycmurrayc00000000000000‰PNG  IHDR‹(Àì~—sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ åÝm¨ IDATxÚìÝw\×Þðg—.Ko"ÄØMÔhÔèM¢¹7FcLc&–X5öhH¬ÄÄ7&ñšÜ5ÆØ5¨±aÁ†ÆF„¥³”÷`Ý]¶Q$”çëg>ìÎ9sæÌ9ëœù픡zˆ@DDDDDDµ…ðOy ‰ˆˆˆˆˆêaÐ(zË0€$"""""ª}a…GQóŠ xMDDDDDD5( zDƒ‚FQ%óˆ”&õ|"ŒDDDDDD5( Z‚E¡2A£Á—”ö½@Î> """""ªï\fÍgåEmA£Ö€ÑX_ 8pÂj¹¹C+ŒÞ“½ADDDDDTKXzvÎÎO½?¶Í¶ÕʵüUEÚFc}⤠ï’ÒsÙDDDDDTë¤e䢨¸rB‰aoÓ¨N–;ú_=ô€'l›í¢*OÅ¥1^Ù{(—ZFc}b¢4‡Ÿ>"""""ªµbzfn^8Z©åý:¿¹\(ØÕ…rSžæzôý$ý±mv3¥àPy*Rz-*ý«7`Ôzª¹C«’%Ÿ@"""""ªuÒ3ó }š˜¨cxiЫhåa[¡åoÇ?ÁÑ?÷c_€µE,W)~³* ‹”¦BF¥•EM£ ‘¦÷ýG/ÿgìûÈ•òHDDDDDµÒãôl\øów¼Ð?ÎvV•*#únb¢Ž¡ó ¯À©´ŒºV.$I³pþðnÞ¹¬»RX 6–NÊgË.[-8êzÀ ´TŒüy#ÄfÛ*±)ºøÄb#~ª‰ˆJ>yÐÿÅnu¶nµajs;Ñó#*=õålg…by守t´kŒ˜Ò²Ê⟺V®š&¥¡Li2 †êÉBåáè½gQT>XÔ¼öÌÌt$åšV¬#sSѩϫ0­hIDTÇùóœb@‰Ä011†•e#8;ØÃÅÉ^±»=òç9ìYõ xÎnô{¡k­Úõº•m—r=kÃ6Ôævü§?ƒl "ªïÄ¢g!Œ\.T¹¬²øGS¹ûž6¨œÁ/U¨\å²Õ—Õ6_½\ ÁbAi˜ O)XT•'å`QñZën@®%X|íånðòˉŋʼnċE‹Kþ–¼C,)òÌ^¼ rAÐZ&Q}p,ò¼"p °¨Y¹ˆ}œ?¯ÄâlÔ t ðÕx•EmÞ?ªd}{uј¯6lCCg”?ƒºúŠˆ¨>)_UÜÿ‹D"EÚÊýü£¡:˘ºvo¹zè+÷À±3Šr§®Ý‹A}{蜯©\5¶J¢Ii X¶â²§¡ j¯ÕFè µµ·H$ªøTZcE"j(†ÍÝ S#¸:X£§¦˜>¢+®ÞMƺÝØÎ}zvAðœÝ€>=»@€§Y¸÷099¹4±i WgØÙÚŽŸ:hݢⓛ—3Sx¸9ÃÝÕYiíb’ñ(92™ f¦¦puv„—‡‹b7¯k]êu+[¯r@Ò§gÛ`ȺËÊómḄ$äå磑…Zúx¡‰µÎvMHLF|ÒcÈdhda^.]ž•ß§ç³@IÓ¬/œì¬ð(5 [÷^Â6Ö5¶ç͘¿ÑÝÏ ³ßè{k <’fã§“·Ê|ªuꌓ§/”›§N9϶=—0÷°·n„áïF³¦žhãfŽu!o@<Í–á­GøïÑ[ðmÕ§Ï]2¨o”×QÕ>TnGåú*‡èÝf"¢ºNyŸWõ3‹P:¨½Ü²`NS §)¿¾rû¿Ø S×îU,¯$N]»ý_즳\5Ö¥¢‰R Xöse¸){Rª¸tÒ0ê{À¶S‹jgU‚B(‘Ïò”|Ù,ð§8ˆ¨Áida?ßføãì=¼Ö»5^ ôÂÿNÜ)—ïÖ{Ø:kì¬-ðÉÿ•{áëဿÜkv©žÙëê熅'QTT„ɯuÆ{ÿ Dqñ%ÜIzŒ¢¢b¼膷´Ã/'cðýáëxk@;¼5 A@Ô½d$&?6x]êcYøBNøóÌE•|±ñIz׭̯©>üâü}1wt¦¼Ú ÓàK‡våêð(é1ºú:âÝ!øëz>üü0ŒŒŒ018PËVvó¿`øøVÊËÙS?=ˆ³¨,  ‹!ˆ‹ù©&¢£l?*!-³ä‡sí¬- Óp¹`qq1,ÌLPX$‡4#r¹·ž`ùÿF[¿–8{á²"ï×û¯ÀÍÝ"°cÿUtoëŽà^-1í³#€ `À¨€=‘·Ñ²¹~ýó6‚{µÂ€®>ØwæP…Ö¥I·ÎLj¤äT½ëVöýákhéãƒó·nœì¬ “É4–ð(³FöSl¿§WS@|½ÿ*ºµu׊4–¥k|€o^ƒo«055EAa1,5ÂΗQXXAãXÔCL}½ :·vÅæ_.©,«³o Íg@j«¯zßië+"¢ú@ùÀœü‚*—õlÜÖ]®®u©§U¤\CÊÓT®†`Q9P, Ë.M5)Ë‚E姤ê<³hÐe¨%gE%£â좦ÀQé $D |ð5,eûÍ…§·9RŸæš4*½gMPüHïÓlš72ÇÓì|€½MIOw7ƒ×¥k»Êaz×­,-#>-ÌP\,/_JÎj*_V ƒCK­Û_‘ºê‹2sd061\•• qa&Bßé oW[˜›+.#jÜÈ EÅEè›êëCmõ­è¶Õe&FbÅëbyÉXr!êªAËvîè0—”!‹PX:i*W™¦yêi)÷BÔUÏ)»‡±¬®ÚÊUcVúW( Í5ŠÊÁ¢.AÕ,ªt‹å`£öWTòTTQé™F¡´<^CD *X”Ë‘Ÿ_€ûã0¢w ÀÉ˱°³·E’Úe‰ŽŽ‰ºÃÀñ1Úû8aÌ ö˜ùï®·òw•¼M!''"T(SSSÈO³ò`oÓM¬Ì“›KóÒà¬$OEÖU‘ñÁØÄTïºe²½eišgjj†Ô§9p¶³‚C“FÈÍÍ+m Ku‹K"º¼¼<ØÛXTMyîÞEÄœA°mle;"qéïd‰DøqÙëãJWßÈd²jëCCÚÑÐm%"ª«DZ.ë4è©¥¥ùËâ7‘Òe"=—¡ê H+ZnÔåh•úª?à¦,`ìØ^k¹ê14JÎ(š(ˆ&j¢XC ¨~)ªHÏÓPµ‹¥¡Xù^E±Ò_±rà•KQ9hQC}®1ª_+ îÑWþNÆžSwÑ¢…O¹`ñï{ññèžØu(wãÓó Šä«í¾ß€-¿^B±\ŽÉ¯vì;}ŽâXÔCŒèë‡à^­ðýáëõrÉ=€‡Î߇ÄÞ®Bë###俢‘¹ œí¬p!ê*:uh_.ŸÄ®‰Þu'>J®T°èè`ý§ÿÆ»ÿ Ä;ƒ°ñç‹‹DxxG•|f¦fHNφ³º´vŵ{0n°¥ƒEA÷˜ääÂÜÄÿî×Fërºú&>!±ÚúP[;ÚWDDõò˜Uõ§–BéÞBíùô¢•-·,P ôo§x­¼.]åj‹5ˆegË&T/A…zÀh -OB-x47ÀÞcçð×Õ¿U¢ã’¿"•'ü(§=|”Ûvüé "j8~]ù ‹‹‘•S€„”L„ÿxgo¦ UËf‰Äåò;ØÛá·Ó1xk@´ô´ &VŠ¿G£YSOÄܹ§È{þf"> ég;K<ÉÎÇW¿]Á©)ðñö‚ ØwæÄbzwhŠà^­ž•‡ï]Ç¡‹ñhîÓ™™Ù¯ \œñߣ7ðFß6Ø:g0€gOQÍç¤wÝåƒMZùy þ¼þFâ«Ôÿ7(’Ósð¿ã7Ñ]éžÅ¦^nøâ1qXÌéÓüpì&úwi¦w|ÓT‡f^žX÷ßs˜04Ë'ôAZf~:~KërºúF9X¬jjkGm}Uö4Q}¢í÷µ=±T%¨Óð{ˆe³j²\ÿömåú·o«w¾¦rÕchµ P}k •FA=@,[À¨ÿèùÿû>â?Õ¸ö¢ÂÈå»Y^ŒMÍTˆˆ¨>ºtåZéNA c#˜›™ÃÖ¶ ìílTöËey;”|‹˜™™…ä”Täæä"ÀÂÂî®.°´l„KW®©<åÒÜÌ ²‚˜˜ÃÑAG‰Rà )é1ÒŸ>EaaLLŒaoo'Åúu­KSÝRR¥HJ~¬¸¿°l¾z>CÖ­¾Œ¶yš¸”ÔT¤JÓPXX3SS899"6.^eÙììÄ%$B&“ÁÔÄÎNŽˆOÐ[¾¶:dee#>ñd²’övrr@|ü#E^Cû¦ºûP[}µõQ}cciŽƒûÂÈ7FánbZ¥Ê°²0߇÷`Ààב“_'Ë€Â"9ÎÞÃ;—í  @&€'¥Széô@Viz~i~åß^=÷,j»)^ll1L*¼ae÷-ÕgþmuìWËö†ªyËö·V­Ð¼±•Aûc_ß:ó8»8ÁÙÅIëúõ­K½n‰=${½ù Y·¦e4ÍÓÄÁA¥  lmmT–mdÙ¾­TÛÇÖ®‰ÞòµÕÁÒʲ\yövv•î›êêCmõÕÖWDDõMÙ‰¨äôìJÿtFJz–¢,¹Ú½…u¥\MMÕƒê÷'Š•ò)ÿUQ¹ßY$"¢÷Ñu¿o؇DDU“_XŒþƒ_Ãáý?ÁÝ·;šØXUhù§ÙHˆù ý¿†üÂbÅ~¹®•«!PT~-Ö’®3Pô\†zÿQ:?DDµHôµ€öíÚ°1êhß°‰ˆªW#sS˜áèŸ+µüKƒ^EaQ1rÕ~ϰ®•+(» u?Ê_†úÏ.A-» 5@Ni>€"Tä2T~ãIDT»´këÇýsïö!QõÊÉ“ÁÎÆC†½Q©åe…EÈÉ“Õùrõœ ¬‹DDDDDT§¥=Ínðåjy¨¦ŸÅ08xÔ,ú6–â׃‘üÔÕ¾¥8\åi=³¸gÕHO“²Å‰ˆˆˆˆˆj¹Ä„xDl;Q­eŠÙ¬DDDDDDÄ`‘ˆˆˆˆˆˆ,ƒE""""""b°HDDDDDD ‰ˆˆˆˆˆˆÁ"1X$""""""‹DDDDDDÄ`‘ˆˆˆˆˆˆ,ƒE""""""b°HDDDDDD ‰ˆˆˆˆˆˆÁ"1X$""""ªõ d2dge!+3Ó );+ EEEU^ï‰'àÛÚöÀñãÇáצ­â½¡*š¿2jb5¡*ÛQÓm o}u¹OŒkó‡#MšZ-ùˆˆˆˆ¨‹ˆ¾z§OGêÍkdd„n=‚Ð÷¥þÈÏË«Òz—.[Ž­[6ãÅ_,[þ 6oÚ¨xo/q¨·Ç£õyÛè õEÏüÀÕÌFþç&""¢úDœ={¡KWÀÌÌLg^Y~>–.Yˆƒ,~þÅXºt.\€©S¦¨¤ÅÄÄ ((Hëûúr¼¥éØQù}C8¶äñ³ªçrjš4U1éšGDDDDTÅÅÅzE037Gqq±AeÊår|ýõ×X¾lv|½r¹\%=??ÆÆÆZß1X¬F[¶l…½ÄŽNhí×3fÌDVVV¹|»wïF žpquƒ@ ¶nݦ³\A°iÓftêÔÎ.®hï€ÏÂÃ!‚Þo ½–¸°° .DËV­Ð̧96nÚ¤H“Édø`Æ 4õn†¦ÞÍ0cÆLÈd2•õ|½c;ÀÙŽ{÷Áµë×išêò06£F½O¯¦puuÃÈ7Þ€T*Õ[må9rA={ÁÙŰsç·ü_@DDD Ú‘£GacÓãÇ¿[;;=vLåøMù˜JÓ{åc-]ÇŠ´ –ÂK—.C«V¾ps÷À{ãÇ#;;[¥.›7oA»öþ88Xë*OýxXÓ±£ò|méêuªÈz@VP€)S§ÂÝþ­ýðù_Tz;Ôé;–6¤ )#üóÏÑÊ·5Ü=<1uÚ4È ªÜ' 6XÌËËÙӧ‡óçã›;ññ¼yåòý~àìÛ»7®_C@@æÍŸíÛ·k-÷‹±pÑ"tíÖ îßèQo",l)6mÞ\mu_µz5bbnãÄñã¸|) =R¤-_þ ’“’qñÂy\8 ‰ øä“*ËŸ>}~ßû÷îbðàÁ˜1c&€g§øÕϾ¾ùæ(Lœ‚;·cs Í›7Ç‚ õÖG[y“&OÂÜ9sû¿íÛ‹‹Q9BQƒöÕö¯0þ½÷í_>;ÞT?¦ÒöÞcE]Ç‚°~ý\¹zÇÃí˜[077Ç’%a*ËG]ŠÂñãÇ MMÑ»]†”§m;+’®^§Š¬V|²iÒ4\¹| ‘žDddd¥·C¾ciC¶Ñ2þ:óNŸŠÄ•Ë—š’Š•+VV¹OjQéTöZ Àh꤉ùá7#=MZåè{Mqq1œaoo‡;·o«,s)* ^^žŠˆ¾cÇNðnÚ/^ÐXv`‡ˆ‹‹ÇÅ çáí파 4ói//O\ŠŠª–k×Þ¿þò3|||Ê¥µiÛûöîA³fÍ÷îÝCð°á¸~-ZQ߻߭­­"hnêÝ ““éú.ÓÍËËC@@ nߎÑ[Måµ÷À´©SðÊ+¯ÀÕÕ•£ÕY™™Ø²ù ¬Xý©Aù?ž=K?Y…ÌŒ ­yÆÆbÀË}fffÉdhßÞ‡R‡ªSéz¯ïØL×±`@`üïÇмys@jj*z½ð"bnÝT,ãú58;;ë<ö.«‹¾ò 9vTž§-]½N]oÛví±oïx{{+Ž¡»tíV­Û¡íXº"Ëj+Ã^â ˆ?àþýû6×¢¯V¹O*"1!Û¶áóM[öÈ À“Ò)Méufiz^iþ"Åäàxê_gÏbù²å¸vý:rrr—ˆ¦§?)—×ÝÝíÙk·’× ‰‰ZË~ô¨ä?Z§Î]TæÇÇ'T[ý?~ ///i©©©*i^^^HMUý°•íÀÂÂBïãœÏŸ¿€%aK} ¹¹¹%Q½HdP}4ù¿_cíÚuXµz ¬7ÆòO–cà€}ˆˆˆ¨Aúú«¯!MKƒ«›»êü¯¿Fhèâj=VÔw,˜””„®Ýº«äW>î 3PTgHyÕA½N]oJJ <==UŽ¡«k;ôKWWÊõ÷ôôDJJÊ?Ú'Õ¥Æ/C}÷Ý÷ð×ٳضm+’%"1!4ÞW˜ð,0, Ë‚FMÜÜJΔÅܺ©ri@jÊãj«¿““bcc5¦988 ..Nñ>66‰¤Jë÷î»xïÝ÷pãú5HSSððÁ}•¶ÒUMñÝwßâÎí¬\µRåÒ"""¢†D&“á¿ÿý/._º¤rìx)* »víRyöDu+²ìõkÑ*u1ärÓš*ïy­×ÑÑQåZùuU·Cß±tu•¡\çøøx888Ôª>©3ÁbÙS©¬­­!“ɰtÙ2­y-^Œ´´t¤§§cñâP@HHˆÖü!JÒB—„!##ÙÙÙ8rä(^1Rg*ò€›ÿû Ì™û1=z„ŒŒ Ì_°@‘6|ø0Ì›7R©R©Ï›‡W_npÛØØØàîÝ»*óòóóann3ssÄÆÅaÆÌ™×GSyãÇOÀíÛ·QXXAP\\"""¢†èçŸAÇŽáéé¡2ßËËøå—_*\¦®c3}Þ;3fÌă‡QTT„›7oá½ñã+½}-OÓ±cEÒ+»Þ×^} ,„4- R©óæÍ¯¶vÑw,]ÇãžÕ?- óç/À믽V#}\ï‚Åm[· eË–† ž½4^Ï]fÐÀxeð`øµi‹Ë—/ciXÆO{°2Ÿ~º×®E÷µÚ¶kˆ/#0yÒûÕVÿÙ³f¡eËxáÅÞèбÜ•.YX0>бSgtìÔÎÎΘ¯áÁ=ÚL™<}_꧸†¶ ,„‡‡'‚ƒ‡¡k—®×GSyƒ^„1o…‡§–, ÖÍ[8RQƒôåöí7nœæƒúwÞÁ—Û¿ªÖcE}¦OŸ†nݺbøðWáîበ!!üÊàJo_EËÓtìX‘ôÊ®wÞ¼aÓ¤ üýÔ³‚zU[»è;–®ŽãqèÚ­+‚‚z" ¶vvøøã¹5ÒÇÏÛsÀ QuÈÊÌDĶÍX¸x)ÌÌÍuæ•åçcYØ",[®ó7DõE½xÀ QeˆD"tï„ea‹ô>$ÐØØÝ{ô*x)ý?bQ]`ÑÈ}úöÀA^¶'É ØpD ‰ˆˆˆ¨>322F~~>òóóÙD5@Ì& """"""‹DDDDDDÄ`‘ˆˆˆˆˆˆ,ƒE""""""b°HDDDDDD ‰ˆˆˆˆˆˆÁ"1X$"""""¢ÚʘM@5NPPPˆ‚Âr9Ûƒˆ±X c˜™™q<àx@Djí˜À`‘j\n^îß»‹ çÏ#)鄈###8:9¢K—nhÞ¼Ì-, ÇŽDÄ1¡Ö ©F 11'OÇKýÀÃÃb1¯†&¢†C.—#>>G„­¼½} “ås<àx@DjݘÀ`‘j”¬ gN€ƒÑ¥[765HžžpvvÁž_Æä©Ód°Èñ€ˆ¨ö ü j” —#99 .®®l "jмš6ErÒ£{6ãQí,R+..æ¥FDÔࡸ¸˜ãÇ"¢Z;&pMDDDDDD ©vrssc#°ÍˆˆˆˆˆÁbíd/q€½Ä ADDÓˆˆ¨Á{nOC- zõê…_~þ "‘¨\Zš4•=PË4ØO•çææ†ÄÄDÖ›ˆžÛþYMûíº²OW¿jÂÚÚ=zôÀâÅ‹áééY©2ïÞ½‹U«VáÌ™3ÈÉÉŸŸ&OžŒÁƒ×›ýju¶›®+W8>5,ÏýÌbdd$¾úê+¶4Q5I“¦*&móÔÓë’ÄÄD$&&"!!‘‘‘hÙ²%&L˜P©²]Û˜%6mÚŒN:ÃÙÅíýðYx8AxîãA‘H‰D‚>ø@±Ÿ©èþmݺu˜4iÆŒ[[[˜šš"00Û¶m«WãAu·›& ˆ,V»ÏÃÃaaaŽ)S¦¨(Ê>û,K—-ǰà`Ä>|€¡Cÿ…eË—#<<¼\Þ«W®"òÏ?ñõ×_áæÍ[øÏÞÄ“ôtœ?w;v|kׯcÒä):ë´m[,\ܸ~ûqç«w IDATöîÅþßhÝáVÖ­[1øëÌiHSSóòòòpæô)$ÄÇaÁüùøfçN|ü`ª/(suu¨O­[·bbb*µóôô uöC]žG»iª;Ç¢Ú=&D_¹$L4Qð€Ÿ| `+€5æxÀHýtЀ;–ÌJãAqYŒX#OC|¸"M$aúô騼y3¦OŸ®rfY—#F`Á‚HJJBff&BCŸõóСC±hÑ"H¥RH¥R,Z´Hå¾???lÙ²yyyHNNÆœ9s*´=ÖÖÖ¸wïžÞ|•ݶçÕfšê­¯­úôéƒÐÐP¼öÚkJ¤0þ|•{TˆèŸU‘}:„L(KB—„!##ÙÙÙ8rä(^1ò¹ʲ²²°eËøøøTjÿöá‡â‹/¾À·ß~‹§OŸ¢  W®\QyJh]Ü*pTUÛMŽD Ÿ«Î;cÆŒÊÍŸ3{6¦O›†ÿýô<<½ðëž=øxî\|ðÁôçR X²$—/_†_›¶ôÊ` 8 \¾ððÏвeKŒ}gzõz;u®Òz·mÝ‚–-["8x‚zöRÙ«4p^<~mÚâòåËX†ñãß«p¾ª´í¬>‚ :vìT#?ìÜ¥KôíÛ]»v…­­-fÍš¥’nddoooŒ1Âà2?üðC´hÑýúõC·nÝTÚ¹sçÂÁÁAAA ‚“““ÊÀš5kðÇÀ××ÁÁÁèÙ³g…¶çý÷ßÇ Aƒ Ü+³mÏ«Í4Õ[_[õîÝR©TqÐŒÔÔTôîÝ›{Y¢Z¢¢ûô øôÓu¸v-¾­ýж]{D|É“Þîu-{r¨››:tè€sçÎaË–-•Ú¿y{{ã‡~À‰'н{w´lÙóçÏW rêÂxpáÂtîܹÆÚMŽD OÙÃmÊ^‹M41?|ãf¤§IÙB5ÌÐM®+?®¬.+3Ÿ‡oÀŒgÃÍݽB˾óÎ;ưaÃê]¿?¯m«ÏmFT|4cV®Y‡ÌŒŒ·íUêóþMÛv13fÌPüÇ"Ž êâ±m>ß´e?€<92<)Ò”^g–¦ç•æ/P @Ž’‡ŸÁ˜ÝBµ\.Ç®]»ððáC :”ÛÖÀÛŒˆ8&ÔÇý›¾íRþÝB¶Õ‹TëyxxÀÃÃ[¶lQ<ñ¶Œ®Kzµ<´¨!l[}n3"☠mÿÆíjxíFD C/+­k—ŸV…®¦®7ÏkÛês›QÃV_÷aÏ{»¸ï'¢ÊàWKT㌌Œ?GBDÔPÃÈȈãÇ"¢Z;&0X¤%‹áì삤GØDÔ Å>|g×,q< "ªýcƒEªQ¦&¦èѳ'þ±·cn)~{’ˆ¨¡(..Æí˜[øï®o1`Ð Èd2ŽˆˆcB­xÏ"ÕìÁ™)<=¼ðÊà!ø}ß^$?Næ5(FFFpvrÆ+ƒ‡ Y3äæäp<àx@Djå˜À`‘jœ¹…9|ýüÐÎ?€Od#¢I.—£   ÁŠˆˆêƘÀ`‘jœ åË Ë—±1ˆˆ8p< "ª¥ø51X$""""""‹DDDDDDÄ`‘ˆˆˆˆˆˆ,ƒE""""""ªçÁbBB<<½°`áBöqÿBDDDÄ`±Äœ¹cÀ€—±4,Œ½@DÜ¿1X,ñÝ·;ñeDD"‘Ê|{‰ì%—Yµz5\ÝÜñÝwß7¸ŽRo]íT—ë[Û·‹êî_ˆˆˆˆªÎ¸¦mÒ¤©:—]µz5~üñ8tè Ú¶iSë#C¶ˆ¸áþ…ˆˆˆ,êP™ƒž9³gcÎìÙì±*´!ëGü¿Áý ‘¡jýÓPAÀ¦M›Ñ©Sg8»¸¢½> ‡ жoß®Hÿì³p,]¶ƒûð†ý–-_ŽððpƒÛD}ë¯LÿW¦‰âþ…ˆˆˆ¨"D¥SÙk1£©“&æ‡oÜŒô4iµ®Ì{ŠÔïÏ ìÐqqñ¸xá<¼½½‘‘‘f>Íáåå‰KQQ*Ëܾ‰½= áìâ ˆ¹uËåppt‚H$‚45¥Âe_¿ EÙÊåh»§È«©7 pàÀïðmÝf¦¦zÛ¨cÇNx‹KQQðòò<ŒEÇŽt¶“¾u•å×T®wÓ¦¸x±äŒˆ@ pëæ 8::"99mÚ¶ƒ‡‡®\¾Té61tý•éÿÊ´3Õ?Ü¿ðsODDÔ%&Ä#bÛ6|¾iË~2yrdxR:¥)½Î,MÏ+Í_ €€üCg˾!Wž´yô( ЩsØKÐ̧9 >>¡\^‰½=ÀÄÄD1ÏÁ¡ä@K,.ÙTåKÀ*R¶‹‹‹JÙÊåh3ïã!‹Ñ÷¥~ðððÄKýúãäÉ“:—IHL¸»»)æ¹»¹UÛº4•[¶NHNN.iK‰D¥ý’’’ª¥Mô­¿2ý_™v¦ú‹û"""¢êQë/Cus{ö ¾òÁ_jÊãZ]6„„LÀ½»ã𡃘?®\¹‚ !uSeTBb¹²:Ö¥©\å`ÔÑÑ •JUþ–ÌV•¾õW¦*ÓÎD qÿBDDDT¯‚Å !€Ð%aÈÈÈ@vv6Ž9Š×GŒ¬5e[[[(¹¬RÙ˜·ÇâæÍ›hÛ¶-zõì 077×YÖøñã‹/Fzz:ÒÓÓ±xq¨Þ:º®E‹#-MµÜEúo”lû¦M›!“ɰq㦒òG®–þÔ·þÊôQeÚ™¨!î_ˆˆˆˆ*âùé M÷i»T,$dÌ-̱}ûvø¶öƒ™™ºví‚ɓޯúÁ\5•=룰vݺr÷ŽýB—„áâÅ‹‰DèÒ¥3–„.Ñ[§¢â"lÛ¿6máåå…LÇo¿ý¦s9C×5hà¼2x0bccáè舥aa?þ=EúœÙ³!/–ã‡Ħ͛áììŒçÎÅL¯–¾×·þÊôQeÚ™ê/î_ˆˆˆˆªG>à†þùhþþ!QýSopCDDDDDDµƒE""""""*ǘMÐ0ðòS"""""ª³Áâo{~aP­7$x8j½Ëw’ðÓ‰Ä%?iPÛm$Áݱ ^íí‹À–.ü Õ—`ÆŒÏ^¡Z뛯"ØTëÅÄJñÕþ«èÞ±-^zÑbqùã@.ôXŠí¿]ÁØ—óЩm3~ ˆˆˆêK°HDDUóý¡ëèàß6Mì‘“/GÉCÍk h=gî0X$""b°HD¤_ÊãdܽsõrûÄb[[#1å |ÛÛ +¿¸Áöµ™¥ ¥>řȓõ¶¿këç¯y‹Vptrfƒ1X$"ªÒÓÓpëÆ vꉃc½¼4S.—CššñŸG‘üà:äryƒîs±H@[ÿ€zÛßµõówùâE›˜ÀÎΞBDÄ`‘ˆ¨ö‹¹q­Û´¹¹9²³2ëívš››ÃH ,4¸Á÷ù³#ê}ׯÏ_ë6msãzôz BDÄ`‘ˆ¨öËÌÌ@ckëq¶ÍX r9„†>À‰ÑàÏ®þ[[#3“—þ1X¤j'—Ë‚6mÚàƒ>`ƒUATþÖû`±l«Þv~øÿÁÿoDDÄ`±NIIIÁ† pìØ1$%%ÁÒÒ:tÀ¸qãзoß¼~aaaÀäÉ“ùé$âl¥)nÏkØìF ‰ˆˆê_°xâÄ ôéÓÇàüÇGïÞ½õæKNNưaÃ0räHüøãpqqAVV¢¢¢°}ûöZ,†††òSIÄ`±j;v±Ëëýöšš™¡@&ÓÙ ‰ˆˆ*¯V>®wïÞ8~ü8$ Ž?AÊMÊé†аfͼù曘9s&<<<`ll [[[ôë×ß}÷"Ÿ››"""ЩS'¸»»d2fÍš___øúúböìÙ)¤¸¹¹•[Ÿò<777lÚ´ þþþhÞ¼9fΜ‰‚‚Ezqq1V¬XöíÛÃÇÇï¿ÿ>²³³µn‹¾òbcc1vìX´lÙÞÞÞxë­· •Jun#QCÂd,.ùeÅê,ÓÔ̬V•£|Y±®vh(}^Û&""b°øÜÆü#FŒÀ‰'TÒNœ8#FàÇ48P€cÇŽaäÈ‘å½té<ˆ„„ÀªU«œœŒS§N!22‰‰‰X½zu…¶éìÙ³8zô(Ξ=‹ÔÔT¬Y³F‘öùçŸ#::ÄÕ«WannŽåË—Wº¼±cÇbüøñˆŽŽFtt4|||°dÉÛHÄ`±þ‹ hùgfn®˜œðæ¨7‘*MÕš_€€üü<é†þ«®r„ÒKlu¥ÿ“Á¢WÓfÏ5?ƒE""jÐÁ¢¶€±²"¤§§C"‘¨ÌsssSLÊBCCaoÿì7¢~ýõW„……A"‘ÀÁÁK—.ů¿þZ¡õ—-/‘H†_~ùE‘¶k×.,[¶ ...°²²Â¼yópàÀJ—wüøqÁÜÜ7ÆÜ¹sqòäIÛHÄ`±f¦‚‚Œùo¼öÚäååU{ùFb”\†*4N—›‹¼Ü\\‹Ž†©©&Mš¬5mèL7ªB°ØÔÛ繞õ¬j~‹DDÔàƒEõ€144´Ò"ØÙÙ©\Š ‰‰‰HLL,—×ÉÉIå½T*…§§§â½§§g¹²ôñððPyššªxŸœœŒ^xA¸è-_Wy/^ÄðáÃÑ¢E ¸¹¹¡yóæHOO×¹D 9XônÖ\ãT•fmË/]¶c߃ ]fÐ2=³(èØ^å¶H$X»f Ž=ª˜gѨÂÃÃѼE 4²´TÌSNˆˆ@+__XÛØ k·n¸zõªJ0<{θ{xÀÙÅ>ûLeYå×ë>ýž^^°—H‚üü|Eúýû÷ñÚë¯ÃÁÑMlm148)))Õrªr·÷Ää)S‘––ölÝ÷þf°È`‘ˆˆÁb]¨dYÀ¸dÉ’JŠðâ‹/â‡~¨Ô²‰ñññŠ÷qqq*g匑——§xÿäÉ“re(/Ÿ r–ÓÑÑQQQŠà511Qïå¡ºÊ Á;#K—.!!!111À‰Á¢\®u€{ß.7éZFߤm¡‹bà€—ñRß>ødÙRƒ–©Èd¬ò4TM“jšH¤ž¸pñþ:s9ÙY–þŒüÇŽÁ£Ä ú/Lž2E‘¾|ùrܺygÿ:ƒ˜[7‘˜˜ eÝÀ©S§pñÂyܺySR°téREú믿Ž)S&#öáÄ>|€–-[`Μ9Z·C}RüÞ¤žþ>zø LML0oþ‚*·}eû±:ú½6MDDÄ`±ÆÆìììJŠðÑGaÇŽøôÓO‡¢¢"äää”»'R“¡C‡bÑ¢EJ¥J¥X´h‚ƒƒé~~~زe òòòœœ\z@£*44iiiHKKÃâÅ‹1|øpEÚèÑ£1kÖ,ÄÆÆ¢¨¨111xÿý÷uÖIWyùùù033ƒ™™âââ0{öl~Ú‰ÁbÎìø´h…ï¾ß…z÷A«Öm0dè0ܼySg~ðiÑ >-Z)æaÍÚuèܵ;Ú´óÇ´é3]ée4_†* ¼×/UšŠY³ç OŸÞ*é+W®€½Ä^ã2°aÃz¸¸º ‘e#LŸ>­äÌbé¿ï¾ÿk×­…«›+¬m¬±jÕJ­å¬^½  $¬^½ »øA‘~1ê^|ñ˜[˜£±uc„†.Æ‘£G ¾gѨôi¨úúÛÎÎ ÌGdä)•þ3´ýe2fÏ™‹¶íýѵ{l‹øRççI_þŠö·O‹Vغ-]ºõ@Ûöþ˜3÷cÈd2Ez\\ƇLD;ÿ@´nÓï¼û¤R©"=//Íš£¨ÏÖmUúüñ‹I""‹ÿKKË*-ïîîŽ}ûö!11Æ ƒºv튯¿þ»víÒ¹ìܹsáàà€   ÁÉÉI% \³f þøãøúú"88={ö,WF—.]зo_tíÚ¶¶¶˜5k–"mÊ”)èÒ¥ FŽ Lž<ƒ ÒY']å­[·K–,AóæÍ1bÄtîÜ™Ÿvb°X…`Î;‡Ý»¾Ç¥‹çñrÿ~˜¿`‘Öüß¾øûö-ü}û–bþæ-[qíúuìùå'œ=s fæfXµzm¥—Ñxù¥ € ×<•ìOÃÒ²1Ú¶mììl„®’îìäRnå×Mllï-Ì¡¨¨Hñ>99M½šj]·òk/O/Å{/O/<~üXñþì_çЯßËptp‚¥ec888•\*ª¡,MSI;ÖßêŸå×úÚÿÓ Ÿ!-=ÇÁ¾={ð×_gu~žôå¯hÀù °ß?zR©ë7<»ôw|ÈDŒ}{ ÎýugÏœ‚wSo,ÿd¥"}ý†Ï••…ÇŽbÿ¾½¸U¥ú0X$"ª?D¥SÙk1£©“&æ‡oÜŒô4iVæ·=¿`̸ñõ²¡ÝÜÜ4ÞY[Ê#Ã|óU†gCÔA~Û‹´iâ×¶½Æù7¯G+Òÿ: %gï;wíŽkW/ë,³lù2ý^ˆˆm[àÝ´) -- Ã^}‘'Wzuÿ;x³'½…¢¢BéV­‘•©µÞšÒ•çéKoåÛûÛ‡æÍ›ë,Ûª±5¢¯^A³fÍ÷ïßÇÀA¯àÎí@ËV¾XñÉrôïß7Fvv6\\ÝtÖCÙ§Ûvãõ]õöMú“'X»v2³²ðEøgåÒõµŸ¾ýð;¾RÜ×þða,^ò¯rýXF_þŠö·_Ûöøã÷ßåÅÆÆaì¸wqüèaùóóóѯÿœŠ<©¨Ï7ßì€GéÏ(ÅÅÅaà+C*]¸tñ ÊQ JLˆGĶmø|Ó–ýdòäÈð¤tJSzYšžWš¿@1J ŒÙ¬DÔPè;ãqãÚUËX[[+Þ›™™¡¸¸Xñ¾M;娯óñãǬv-‰Êݪè2ÊJîYT¾¯Ockèk-=ó´§zó?øð£°iãFXYYâ“+±jå ËÎû16mú0gÎ\Œ1B‘ž——3s3˜™™âaìC„†.1°ÏÚAWŸ—}A`ee‰îÝ»#tÑBý ¯ý¥R)\ÝÜïÝÝÝt~Þôå¯hP)ÏÍÍUq™)\¹rëÖoÀ­[1Š{ëÕëïââ¢xïêêZåúQýÀ`‘ˆR¸øÒ…ÒñŠAA•ƒƒ¾ÿî89:ˆ¶Ì3FbAD:g‘žÀZ¤sž®ô¹s?Æ‚ Э{‚€9sæh]¶{÷îèÜ¥r²³1|øpÌŸ?_‘¾iãFÌ;£âGÃÕÅÓ¦OÇO?ý¬·ªí èøràŠA±¾ö—H$HLH€§gɪŸ=œLóºõå¯hP)/11{{Eþ™άY¢gÏ XYZ"'']»)Òí%öHz”÷Ò3‹Ï®Z©|}ˆˆ¨~³ jFu_2ÊKP‰**VñžÅŠ.Ó¸qcDDT?ð7DÀÜÔ]~Û‹ö b[#ÿº„wÇŽBAAA­®§µ 232ž[ù;¿ÿ½ºw¨÷ýÝ> ¢¯\ª¶òà†ˆ¨†ñ7DDUÐP.3—}X»·7+ã)žç}oFâ†ÓçUÝÎ5k×!dÂxbíºuèÛ§7/'%""‹DÄ`±ÞíØÅ€ 5øÇ3X4˜‹‹ þ<xñÅðþÄ‹DDÄ`‘ˆ,ÖÇ IÄîn0Áâå¨ UÞÎ7ÿóo¼ùŸ7Èÿ/DDÄ`‘ˆ ë:-V IDATåQÿF|εR;0à!""b°HD¤/Tl gJD"žW,kž#""b°HDÄ`‘ØçDDD k?777$&&²!ˆj‘[7n4˜m•ÉòÙá ¬Ïk›¿íe#é ‹amcƒ-[AâàÈ`‘ˆèŸ4êíq j{³23ØßDDDµ”\.Çãä$üù';u‚M[‹õÅÝ»w±jÕ*œ9s999ðóóÃäÉ“1xð`6(b_éeeeß6~¸uó&ºõb°X©•õc°X ë֭äI“0fÌżÀÀ@lÛ¶M%ßÎ;ñÅ_ 99­ZµÂúõëѦM@ll,/^Œ3gΠ°°AAAذa$ €’{W¬XÍ›7#)) Íš5ÃÊ•+ñðáC„‡‡#>>­ZµBxx8|}}ËÌŸ?[·nENN†Š•+WÂÔÔ”F¤f̸ñl"""úÇ|óU€’§wËår‹õÅ©S§°hÑ"½ùΜ9ƒ={öÀÚÚ[·nÅìÙ³±ÿ~Àرc±lÙ2lÙ²………X»v-–,Y‚Ï?ÿ\±|dd$~úé'ØÚÚ"""£GFïÞ½ñÃ?(æÍš5 ûöíS,söìY=z0cÆ ¬Y³óçÏg§iPP c#iÁŸn®„'OžÀÎÎNo¾+VÀÙÙ5ÂĉqýúuEÚñãÇsss4nÜsçÎÅÉ“'U–_½z5\]]aaañãÇ#;;+W®T™­²LXX$ $ ÂÂÂðË/¿°Ãˆˆˆˆˆ¨Âxf±lmm‘žžGGݸmÒ¤‰âµ……ŠŠŠï/^¼ˆåË—ãúõëÈÍÍPþ‡´mmmU–×4O¹LðððPyššÊ#Ò‚¿ÁGDDDÄ`±ZõìÙûöíûï¾[é2BBB°xñbôéÓVVVÈÎÎVÜ{XñññhÚ´) !!Aq$1X$í¢.œC·½PXXÀÆ ""b°Xy~ø!^}õU˜™™aÈ!hÔ¨nÞ¼‰M›6•{È6ùùù033ƒ™™âââ°råÊj©[hh(Ö­[X¼x1†Î#Ò-jœ˜˜ˆ¾/õÑÇTÎÖSÃýL1X$ƒx{{ã‡~ÀªU«°|ùräåå¡M›6˜4i’Áe¬[·K–,Áøñãáì쌉'bïÞ½U®[—.]зo_äää`È!˜5k;ŒHk\ 90˜ùáGøtÝZ¸»»+ò4²´BnN6­~&þiüüƒÅ:¤E‹øòË/µ¦'&&êœ7pà@ 8P%}ܸq/¯mÞ¤I“*´5èÀ@Ëü]»¾×˜®þ^.—ã­·ÞBûöí1wî\6h=þLª:?––VÈQ yΓˆˆ,ÕT` tÉʪ±Æ<ÙÙYóÀܹ£cÇN˜9sÆ?~FÊʪ±J]©êŸ åÏ…H$‚••¼½½Ñ¯ßK˜6mšÆ{µ}&*Ó?ÙÙY*eð[""b°HDTs‘êÁyV¦îÅ;Iïâ`mmƒÿߌ¹sçrðˆˆˆÉ"Qo¹ó}—„´•âˆCÿ;œïº}guéZÖuòn™½LÜmÙž½{1}Ú´ßÿüÏÄÅÆÂÏo&¬­­Q__ÇÄ’»nÓ6ïé鉽{vC­V#++ «^{—òçpðˆˆ¨×ñ2T"ê׉Á½üfñ•W^Áê¨(\½z·nÝÂ?þˆððßë¬Kß²žÖikk‹Ë—æo@îãooÞ¼ ©TŠ7ÞxŸþÖ®]Óåñël|šaf6fff(..ÆêÕQZû»Ûüï¿…?ý„–[· Rݾ¹Ç'Nœø›Åûg‰¨_'‹í9qê°Î/åÖ_¹b’?üÏ=ÿ~ùåˆÅb¬~ýµYìi‘˜=g´ÚL=;&ÚŽ @€bøðá˜9c²¾= ¡PØåñël|Þ{ï=üiÃF,Zü?prrBddöedè=³8oÞ\, [„C,cëGñ¬2݂֩mÞ€ñÊÈeM|´ ÕrÙmÌ7éxyq8G… ÖîOwb~@Ñúf?^ze1êjo ýo©xyq8*©``p¹¨“§> ¹¬ŠÁ "¢âðÁz!µµ7“õ-üç/èQ}e¥×°sÇ$oÝ~@3€F jÔ´Nòvóµ­å­ë+(¨¨žY$¢~ŒgcˆÇÑÝ1Y$"&D<&ˆˆˆ˜,11 DDDL{H$ºkYYYÙ=×y¯Ûê9÷Ç$¼1“ÅžiŸÔ1É#"""""&‹¤“R©Ä–-[’’‚††Ì™3‰‰‰°²²Âºuë0aÂü×ý—fý¿þõ¯8þ<öìÙ£I<Û'£ºê#¢ÞÁ3‹DDDDLï»äädH¥RdffÂÚÚúÓŸ„„lÚ´ ¿ûÝï0pà@üö·¿Åþýû‘––†/¿üo½õV§g(uÕGD=—úňˆˆˆÉâý—’’‚/¾øÎÎ΀õë×cöìÙHHH€©©)¶oߎ  ??û÷ïÇþýûabbrOõQÏ…¼Ê ÑC³ûÓLû‹ŠŠ L›6Mk™@ ÐÌ;88àùçŸÇ{g 6ÀÁÁ¡Gõ1YìqàÀ899uZþã?â¯ý+>ùä¼ù曘;w.†~ÏõÝOF Aï Ett4Š‹‹¡P(PXXˆˆˆÀÍ›7±råJ|øá‡ð÷÷Ç[o½…¥K—¢©© `ccƒ+W®t¹>""""""&‹}ÄŠ+àåå…ˆÅb,_¾þþþ€?þñX¼x1&Ož ˜={6^xá¬_¿­g8ꪈˆˆˆˆè~ãe¨=Ðþ¦FFFX¹r%V®\Ùa½ÿû¿ÿë°,<<\3ÿꫯâÕW_ÕÎâuÔGDD†Mßsxùœ^""ê xf‘ˆ¨R©TÇûï¿Ï`“E"¢¥²²ëׯÇäÉ“áææ†Ñ£GcáÂ…8vì˜A´/..žžžxíµ×8Xôеÿ1Y$"zèrrr º<åäät©ÞŠŠ ,X°B¡iii¸rå N:…°°0üùÏ6ˆ¾ÇÄÄ`ùòå<ˆˆˆˆÉ"Ñf̘ììl…BdggC­Vw˜Ú—Ϙ1£Kõ&&&âÅ_ÄêÕ«áââØÛÛcÖ¬YøüóÏ5ë‰D"ìܹ'NİaÃÍÍÍˆŽŽ†‡‡<<<°fÍ477kms§öËD"¶nÝŠñãÇC"‘`õêÕhiiÑ”+•J$$$`ܸq‹Åˆˆˆ@}}ý]û¢¯¾ââb„……aäÈ‘pwwÇÂ… !“Étö±¯Ñ×Ç––¼þúëH$ðôôĶmÛ´¶×WÞYŒôÓ±cÇàçç777x{{ã‹/¾èR™. …111;v,F…?þXSÖÇåž={àíí 777Ì™3—.]ÒZO$uئ}\ž{î9dddhí£¬¬ &L@]]?Јˆ˜,õ~˜––†àààgsrrŒ´´´.'Šm_ÖCBBº´n^^233QZZ xûí·QQQ“'Oâĉ(++Ö-[ºÕ§ÜÜ\dee!77UUUHLLÔ”%''C*•"33.\€¹¹9âããï¹¾°°0„‡‡C*•B*•B,#66Vgû}}ܲe är9rssqôèQœ:uJk{}åÅHß8­Zµ QQQ¸|ù2¾þúkäååu©L—¤¤$áÈ‘#8}ú4ÊËË5e½q\~÷ÝwÈÈÈ@AAüýý±fÍMÂ×öÿ;oúÓ>.¯¾ú*Þ{ï=¨T*Mù{g%K–ÀÚÚšfDDL‰ˆLÂx¯‰"TWWC(j-k;kr瘘˜ mllÓ«ÇeBBœœœ0pà@,[¶ ùùùz·i—3fÀÒÒRsvñêÕ«ÈÉÉÁâÅ‹ù!FDÄd‘ˆèÁ$Œ111÷œ(À Aƒ´.S:?kC† Ñz-“ÉàêêªyíêêÚ¡.}\\\´æ«ªª4¯+**0mÚ4Mâêéé©·~]õ={AAA1bD"$ ª««uö±¯Ñ×Ǫª*­µ¿®”w#}ã´sçN?~³gÏÆÔ©SqôèÑ.•éRYYÙiÛz븴³³ÓÌ[XX@¡PèÝæÎ¸´]T*•xçw ~€1Y$"z0 cllì='Š0}út¤¦¦ÞÓ¶B¡×®]Ó¼.))Ñ:ãdbb‚ÆÆFÍëšššu´ß¾´´Të,§££#Î;§I^ËÊÊô^ª«¾¥K—bÑ¢EÈËËCii) ¡V«©ãB_´bÔ~¾+åÑ7NžžžØµk.^¼ˆÍ›7k.éÔW¦oŸ%%%÷í¸ì sæÌ©©)pîÜ9„††òƒ‹ˆˆÉ"уKëëëï9Q€?üáصkÞ}÷]”””@¡P ¡¡¡KwS]°`6lØ™L™L† 6 @S>zôhlß¾¨¨¨ÀÚµk;Ô¹\¹\Ž7"((HSŠèèhC¡P °°:Û¤«¾¦¦&˜™™ÁÌÌ %%%]NLú}} ÔĨm̺SÞ}㉢¢"( ¨Õj­³tºÊt Æ›o¾‰òòrÔÖÖj]†ÚÇ¥.666¸råŠÞõV­Z…mÛ¶aÕªU055凓E"¢ÇÒÒ²GÛ6 @YY!‹áííÏ>û ))):·]·nàãã 2Dë‹wbb"> À××·C^^^ðóóƒ··7ìíí­)[±b¼¼¼±XŒåË—Ãßß_g›tÕ—””„ØØXH$cÒ¤IÜñ ¯kÖ¬­­-¼¼¼ðÌ3Ï`êÔ©Ý*qš;w.–,Y‰D‚øøx$''w©L—¨¨(Œ1³fÍÂäÉ“µ~_ÛÇ¥.ð÷÷ïÒóáîîŽàà`~XÝg‚Ö©mÞ€ñÊÈeM|´ ÕrÙmÌ7éxyq8G… ÖîOwb~@Ñúf?^ze1êjo ýo©ìgH$êô·‘†RQO-Z´ d0ˆ¨Ï¯ z!µµ7“õ-üç/èQ}e¥×°sÇ$oÝ~@3€F jÔ´Nòvóµ­å­ë+(¨¨À„ÃDDDD†N¥R!%%ÿþ÷¿±`Á„ˆè`²HDDÔèºÄ³/œ=vqq‹‹ ¶oß##þІˆˆÉ¢ÿÁåeYDdˆzû³‰Ÿu<6Ø~"¢þ‹ÿ4GDDDDDDL{›H$ÂîÝ»1eÊ >~~~8sæ RSSáëë 777Ì™3………šmŠ‹‹†‘#GÂÝÝ .Ôz¸qSSV­Z‰DOOOlݺUëò!¥R‰„„Œ7b±¨¯¯ç`“ECrâÄ |õÕW(((@`` BCC‘••…ÔÔTbþüùZ·š Cxx8¤R)¤R)Äb1bcc5å[¶lA]]NŸ>¬¬,œ9sFkÉÉÉJ¥ÈÌÌÄ… `nnŽøøx1Y4$[¶lÁСCaaaððpÔ××ã­·ÞÒZ&•J5ëgggÃÇÇæææ°¶¶ÆºuëpüøqMyFF6n܈ÁƒcðàÁZF€””lÞ¼ÎÎΰ²²ÂúõëqèÐ!õÞà¦ØÛÛkæ-,,:]¦P(4¯Ïž=‹øøxäççãæÍ›@ )¯ªªÂ°aÃ4¯ÛÏ@EE¦M›¦µ¬ýöDDDDDD=Å3‹ÁÒ¥K±hÑ"äåå¡´´………P«Õšr¡PˆÒÒRÍëöóàèèˆsçΡ¬¬L3ݹ“Å>¦©© fff033CII Ö¬Y£U€¸¸8TWW£ºººÃe¨¡¡¡ˆŽŽFqq1  ÁÀ“ž,)) ±±±H$ƤI“´Ê׬YKKKLš4 3gÎÄ“O> “_¯^±b¼¼¼±XŒåË—Ãßߟ%""""¢^Ãß,Þƒöîì!Áú–Í›7óæÍÓ*_¼x±fÞÂÂ|ð>øàÀÏ?ÿŒ”””_3|##¬\¹+W®ä` ‘H¤ó!òúʉˆˆ Ï,¨˜˜ܸq•••ˆÅܹs"28*• áááxÿý÷ """&‹ô 6 ¾¾¾ðõõ…­­­Ös‰¨ÿ¨¬¬Äúõë1yòd¸¹¹aôèÑX¸p!Ž;fí‹‹‹ƒ§§'^{í5V'‰""ÒÂËP Ô’%K°dÉ‚¨ÈÉÉÁÌ™3»¼~vv6f̘¡w½ŠŠ "$$iiipvvF]]Î;‡?ÿùÏðóó{è}¿ó\DDDôèà™E"¢š1c²³³! ‘ µZÝaj_Þ•Dñâ‹/bõêÕpqq‰‰ ìíí1kÖ,|þùçšõD"vî܉‰'jžËÚÜÜŒèèhxxxÀÃÃkÖ¬Ass³Ö6wj¿L$aëÖ­?~<$ V¯^––M¹R©DBBƱXŒˆˆÔ××ßµ/úê+..FXXFŽ www,\¸2™Lg}mkiiÁ믿‰DOOOlÛ¶Mk{}åõM_|;???¸¹¹ÁÛÛ_|ñE—ÊtOÛÿÛºŽ£©S§â§Ÿ~Ò¬›––¦™ÿé§Ÿ0uêTM{öì··7ÜÜÜ0gÎ\ºt‰DDL‰ˆúO˜––†àà`äääh•åää 88iii]NÛ¾ô‡„„tiݼ¼>(úÚ¶eËÈåräææâèÑ£8uê”ÖöúÊ;뛾ø®Zµ QQQ¸|ù2¾þúkäååu©ìnÚn¶ÓöìÞ6ºŽ£3fàôéÓ€òòr¼ù曚„677Wëlûwß}‡ŒŒ Àßß¿Ã#£ˆˆˆÉ"Q¿Kï5Q€êêj…B­emg~î<3ƒÁƒk^ïÛ·qqq …pppÀ¦M›°oß¾ní¿m{¡Pˆ¸¸8¤§§kÊRRR°yóf8;;ÃÊÊ ëׯǡC‡î¹¾ììløøøÀÜÜÖÖÖX·nŽ?®³о¶¥§§kÅ:..Nk{}åõM_|ÍÍÍQYY ¹\‘H„wÞy§KeÝ¥ë8š1c¾ÿþ{À×_ 333ìß¿ðý÷ßkï prrÂÀ±lÙ2äçç󃈈É"QÿMcbbî9Q€Aƒi]ît<óÓfÈ!Z¯e2\]]5¯]]];Ô¥‹‹‹Ö|UU•æuEE¦M›¦I\===õÖ¯«¾³gÏ"((#FŒ€H$‚D"AuuµÎ>>(úÚVUU¥Õ·öqïJyg}Óß;wâøñã˜={6¦NŠ£Gv©¬»tG>>>8wîœ&Y|ï½÷ðå—_¸}¦ÔÇÇG³fÞ …‚DDL‰ˆúoÂ{ω"LŸ>©©©÷´­P(ĵk×4¯KJJ´Î\™˜˜ ±±Q󺦦¦Cí·/--Õ:ËéèèˆsçÎi’ײ²2½—‡êªoéÒ¥X´hòòòPZZŠÂÂB¨ÕjƒO}msppÐê[ûù®”wF_|===±k×.\¼x›7oÖº¬SWYoG–––puuÅ`nnŽgžy …™™™pssÃÀùa@DÄd‘ˆˆ:Këëëï9Q€?üáصkÞ}÷]”””@¡P ¡¡¡Ão";³`Álذ2™ 2™ 6l@@@€¦|ôèÑØ¾};QQQµk×v¨#&&r¹r¹7nDPP¦,44ÑÑÑ(..†B¡@aa!"""t¶IW}MMM033ƒ™™JJJ ê7múÚ¨é[[¬»SÞ}ñŒŒDQQ ÔjµÖ™:]eºØØØàÊ•+Ý:ŽfΜ‰˜˜<ÿüó€çž{o¼ñF·îLDDL‰ˆúKKËm?lØ08peee „X,†··7>ûì3¤¤¤èÜvݺuppp€|||0dÈ­„011‡†‡‡àëëÛ¡///øùùÁÛÛöööZÏ{]±b¼¼¼±XŒåË—Ãßß_g›tÕ—””„ØØXH$cÒ¤I3ŽúÚ¶fÍØÚÚÂËË Ï<óŒæ. ]-øÎ;K–,D"A||<’““»T¦KDDüýýµ~«ï8š1cd2™& @UUUþ‘„ˆˆ ‡ uj›7`¼2rYÓmCµ\ö@óMF:^^ÎQ!ƒµûÓ˜Ä@ôA‡¾Ù—^YŒºÚHÿ[*?kô‰Dþ6ÒPê#""z¾W½‚ÚÚÈÉúþóô¨¾²Òkعc’·n? @#€µjZ'y»ùÚÖòÆÖõ”TÔÏ,RûòJDDDDD† C@"Éã"¢‡ÿY|7üŒ&""&‹½¨²²ï¿ÿ>Ž;†òòrXZZâÉ'ŸÄâÅ‹áççÇÄ_Bˆú´Þ~ßòsàÑS""zôñ2Ô{PQQ @("-- W®\Á©S§†?ÿùÏ 1Yìñâ‹/bõêÕpqq‰‰ ìíí1kÖ,|þùçšõD"vî܉‰'bذa€ææfDGGÃÃÃX³f š››µ¶¹Sûe"‘[·nÅøñã!‘H°zõj´´´hÊ•J%0nÜ8ˆÅbDDD ¾¾¾Cׯ_ÇØ±cqãÆËÇ7nè­ëÎþµµ³í!Òµ_¡P &&cǎŨQ£ðñÇkÊŠ‹‹†‘#GÂÝÝ .ìöCĉˆˆˆˆˆÉâCsìØ1„„„tiݼ¼ÄÅÅA(ÂÁÁ›6m¾}ûºµÿ¶í…B!âââžž®)KIIÁæÍ›áìì +++¬_¿‡ê´ž%K–à/ù‹æÍ …{÷îExxx—뺳ú¤¥¥iê´±±ALLŒ¦,;;>>>077‡µµ5Ö­[‡ãÇó€#""""zxƒ›{0hÐ Èd2899i–µI»3Y2dˆÖk™LWWWÍkWW×n_jéââ¢5_UU¥y]QQiÓ¦i­/:­G"‘àñÇÇßÿþw,X°Äĉ5}èJ]wöOŸÊÊJ­þ·wöìYÄÇÇ#??7oÞÔÙv"""""º¿xfñLŸ>©©©÷´­P(ĵk×4¯KJJ´ÎÌ™˜˜ ±±Q󺦦¦Cí·/--Õ:ËéèèˆsçÎi.-++Ó\Û™%K–à“O>|òÉ'X¶lÙ=×ÕŽŽŽ())é´léÒ¥X´hòòòPZZŠÂÂB¨ÕjpDDDDDLû†?üáصkÞ}÷]”””@¡P ¡¡999z·]°`6lØ™L™L† 6 @S>zôhlß¾¨¨¨ÀÚµk;Ô¹\¹\Ž7"((HSŠèèhC¡P °°:ßúúz|öÙg°´´ÄOøhªåö±ßd¤ãåÅá:{è==8»?݉ùA Dtè›ýxé•Ũ«½ô¿¥ò³†Ÿ-Äよ衯 z!µµ7“õ-üç/èQ}e¥×°sÇ$oÝ~@3€F jÔ´Nòvóµ­å­ë+(¨¨žY$""ê×É ÑÝ0Y$"ê~þùg„‡‡c̘1>|8ž}öYnÞ¼ öÓ~ûΖµ¯\\\´æ«ªª .~•••puuí´L&“i•¹ººj]2ª/®Ñk]í鉪ª*­ñ¸û "¢¾…g‰ˆq¾¾¾8pà@êXºt)-Z„¼¼<”––¢°°jµºÇm»víšf¾´´B¡Ðàâçè舒’’NË„B¡VJJJ0xðàûk]íé ­¾´Ÿ'""&‹DDôŠŠŠÂ‡~ˆ½{÷âúõëhiiÁùóçñûßÿ¾Ëu455ÁÌÌ fff())Ñú=cOÄÄÄ@.—C.—cãÆ 2¸øãÍ7ßDyy9jkkµ.û\°`6lØ™L™L† 6té÷¡mlllpåÊ•nÅZW{:«¯«5ãÑÖ""b²HDD0www¤¦¦"''S¦LÁÈ‘#ñÆot+©IJJBll,$ ‚ƒƒ1iÒ¤^i›——üüüàíí {{û7À1”d{Ĉ˜5k&Ož¬uÑuëÖÁÁÁ>>>ðññÁ!C°víÚ.×­:õÅZW{:«¯«Ö¬Y[[[xyyá™gžÁÔ©Sùæ!"êç­Sۼ㕑˚>øhªå²Ú˜o2ÒñòâpŽ ¬ÝŸîÄü€ ¢:ôÍ~¼ôÊbÔÕÞ@úßRùYcD"ŸKDDýú{eÐ !¨­½œ¬oá?Aê++½†;v yëöƒš4hP  ¦u’·›¯m-ol]_@ @@ ðÌ"u‚wC½ƒJ¥ÂÒ¥K1f̼öÚklõYº.GåY]""b²x—?š–––˜0a6mÚ„‘#Gj–ÇÅÅÁÓÓË—/7ˆ6Z{ˆˆz “Ƙˆˆ˜,v[NNfΜÙåõ³³³1cÆŒnýᬫ«Ã§Ÿ~Š+VàÈ‘#šòÞz¸qo1´öQÿ`¿Yœ1c²³³! ‘ µZÝaj_ÞÕD±=kkkDDD ¨¨ T*‘€qãÆA,#""õõõšõ;???¸¹¹ÁÛÛ_|ñ…¦¬³Ë|Ú/‰Dؽ{7¦L™‚áÇÃÏÏgΜAjj*|}}áææ†9sæ °°P³¾öõ»d±-aLKKCpp0rrr´ÊrrrŒ´´´{JÛg·nÝŠ1cÆ’““!•J‘™™‰ .ÀÜÜñññšõW­Z…¨¨(\¾|_ý5òòòºµ¿'N૯¾BAAЬ¬,¤¦¦¢°°óçÏ׺e¼¾öõËdñn cOE‘H‘Hüå/ÁöíÛ)))ؼy3œaee…õë×ãСCšíÌÍÍQYY ¹\‘H„wÞy§[ûݲe † „‡‡£¾¾o½õ–Ö2©TªY__{ˆˆˆˆˆˆî'ƒ¿ÁMû„qùòåøè£ztF±¬¬ jµ%%%ˆŠŠB~~>\\\PQQiÓ¦i­+4ó;wîÄû¦¤$ØØØ 66³gÏîò~ííí5ó.S(š×úÚCDDDDDÔ¯“Åö ãÌ™3ïù7Šw&]nnnHNNƳÏ>‹§Ÿ~ŽŽŽ8pàœœœ:ÝÆÓÓ»víÒü^2** ?üðÃí š˜ ±±Q“ÖÔÔô¸ÏúÚCDDDDDt?õ•†Î˜1õõõ=NÛsvvƤI“°oß>„††"::ÅÅÅP((,,DDD„fÝÈÈHA¡P@­Vk=z4¶oßŽÆÆFTTT`íÚµ=n›¾ö1YleiiÙëu¾ôÒKØ»w/V¬X///„„„@,cùòåð÷÷׬7wî\,Y²‰ñññHNNÖ”%&&âðáÃððð@@@|}}{Ü.}í!"""""ºŸLúSg;{8ñôéÓ1}útÀÊ•+±råÊN· @@@@§eO<ñ233µ–½üòË:÷«o™‘‘‘Îöõ&‘Hĸ?"¾ÿþ{¼úê«øÏþÓ¥1m?ö<ˆˆ¨=#†€ˆˆèѱyófÄÇÇ3é#""&‹DD¤ßÏ?ÿŒððpŒ3ÇdzÏ>‹ƒ20 ‚‚øùù1DDÄd‘ˆˆt»zõ*‚ƒƒñôÓOãäÉ“(**B||<222œGPss3LLL""b²HDDº%%%!22/¿ü2ìíí1`ÀL˜0;vìÐZoÏž=ðöö†››æÌ™ƒK—.iÊŠ‹‹†‘#GÂÝÝ .„L&Ó”‹D"ìÞ½S¦LÁðáÃáçç‡3gÎ 55¾¾¾š: µ¶Ùºu+ƉD‚Õ«W£¥¥Åàâ'‰xl”J%0nÜ8ˆÅbDDD ¾¾¾Kmmûûù»­GDDÄd‘ˆ¨;yòä]oÐÕÞwß}‡ŒŒ Àßßk֬є………!<<R©R©b±±±±ZÛŸ8q_}õ ˆÐÐPdee!55………˜?>¢££µ¶ÉÍÍEVVrssQUU…ÄÄDƒŒáƒŽMrr2¤R)233qᘛ›#>>^o;Û~§XVVÆß,“E""Ò­¦¦ƒ Ò»^BBœœœ0pà@,[¶ ùùùš²ììløøøÀÜÜÖÖÖX·nŽ?®µý–-[0tèPXXX <<õõõxë­·´–I¥R­mâââ  ! ‡ôôtƒŒáƒŽMJJ 6oÞ gggXYYaýúõ8tèf""z ø£"¢Gœ½½=ª««áèè¨s=;;;ͼ…… …æõÙ³güü|ܼy :ì§ýö-k_'¸¸¸hÍWUUd tl***0mÚ4­:ˆˆè~ã™E"¢Gœ¯¯/8У:–.]ŠE‹!//¥¥¥(,,„Z­îqÛ®]»¦™/--…P(ìsñ½±qttĹsç4—“–••¡´´ôžê211Acc£æuMM ßDDÄd‘ˆˆ€¨¨(|øá‡Ø»w/®_¿Ž––œ?¿ÿýï»\GSSÌÌÌ`ff†’’­ßìõDLL är9är96n܈   >ßû›ÐÐPDGG£¸¸ …………ˆˆˆ¸§ºFíÛ·£±±X»v-ßDDÄd‘ˆˆwww¤¦¦"''S¦LÁÈ‘#ñÆoté¦7m’’’ ‰D‚àà`Lš4©WÚæåå???x{{ÃÞ޾à pú‚û›+VÀËË !!!‹ÅX¾|9üýýï©®ÄÄD>|€¯¯/ßDDÔ%üÍ"Q?0bÄ|òÉ'w-ïìΙí—Í›7óæÍÓ*_¼xq—·¿Û²ÈÈHDFFtìFlŒŒŒ°råJ¬\¹²Çí}â‰'™™©µìå—_ît}ÞA•ˆˆÚã™EÒë~=‹Ïù"""""2\<³xŸ¨T*,]ºcÆŒÁk¯½ÆöQ¯Ðõm<3HDDL èµ¥¥%&L˜€M›6aäÈ‘šåqqqðôôÄòåË ¢Í†Ö""&6Œ1Y|¤ÿX×ÕÕáÓO?ÅŠ+päÈMyLLŒAµ×ÐÚCDDDDD†¿Yì!kkkDDD ¨¨ T*‘€qãÆA,#""õõõšõ;???¸¹¹ÁÛÛ_|ñ…¦¬³K‹Ú/‰Dؽ{7¦L™‚áÇÃÏÏgΜAjj*|}}áææ†9sæ °°P³¾öÜ©¥¥¯¿þ:$ <==±mÛ6­òîÖ§P(ƒ±cÇbÔ¨QøøãµÊ÷ìÙoooMÛ/]º¤)+..FXXFŽ www,\¸2™¬Gñ‰Dغu+ƉD‚Õ«W£¥¥…2“ÅÞUWW‡­[·b̘1€äädH¥RdffâÂ… 077G||¼fýU«V!** —/_Æ×_¼¼¼níïĉøê«¯PPP€ÀÀ@„††"++ ©©©(,,Äüùóµn=¯¯=wÚ²e är9rssqôèQœ:uJ«¼»õ%%%¡¨¨GŽÁéÓ§Q^^®UþÝwß!##ð÷÷×z>YXXÂÃÃ!•J!•J!‹Û£x@nn.²²²››‹ªª*$&&ò@&""""ºƒ uj›7`¼2rYÓmCµ\ö@óMF:^^nðA»ó  ££#öïßÍÙB±X ¨ªªÂìÙ³qþüyÀ¤I“‰yóæÁÙÙ¹C½wþ¥ý2‘H„üü|ØÛÛ!‘H:,óðð@qq1èmÏžzê)|õÕW>|8à_ÿúž~úiMº[ßĉ‘ššŠÇ{¬Ó8^ºt vvv¶ýNðöö†T*½çxˆD"œ:uJÓ¿«W¯"88gÏžíÒØïþt'æñ“£:ôÍ~¼ôÊbÔÕÞ@úßRÑ8lƒBDDDEéa½‚ÚÚÈÉúþóô¨¾²Òkعc’·n? @#€µjZ'y»ùÚÖòÆÖõ”TÔ³xïƒQVµZ’’DEE!??...¨¨¨À´iÓ´3r@3¿sçN¼ÿþûHJJ‚ bcc1{öì.ï·-  ‹N—) Ík}í¹SUU\\\4¯]]]µÊ»[_eee‡:ÚkK;kûÙ³güü|ܼy³Ó}u7´úçâ₪ª*ÐýZÍéÂd±ÜÜÜœœŒgŸ}O?ý4qàÀ899uº§§'víÚµZììlDEEá‡~¸=&&hllÔ$=555=n£¾öÜÉÁÁ×®]Óœy»víZêsttDIII§gõYºt)6n܈™3gÂÊÊ õõõðððèqLÚ÷¯´´B¡s?¤b¶HDDD¤³Ø œ1iÒ$ìÛ·¡¡¡ˆŽŽFqq1  ¡Y722EEEP(P«ÕZg½FíÛ·£±±X»vmÛ¦¯=w DLL är9d26lØÐ£ú‚ƒƒñæ›o¢¼¼µµµÝº+kSSÌÌÌ`ff†’’­ß3öD[ÿär96n܈  ^VÚ©ÕjNœ8qâĉ§‡61YìG^zé%ìÝ»+V¬€——BBB ‹±|ùrøûûkÖ›;w.–,Y‰D‚øøx$''kÊqøðaxxx ¾¾¾=n—¾öÜiÍš5°µµ…——žyæL:µGõEEEaĈ˜5k&Ož¬óaÒwJJJBll,$ ‚ƒƒ1iÒ¤^+///øùùÁÛÛööön€Cý%Yäĉ'Nœ8qzxS_ÀÜP¿ÒÙM„ºƒ7¸é»î¼ÁÍ!³”vVþf8’þ›x@ñd¼y Ùþr”7¸!"2DüÉ"cò°ãÉxó&"2tL‰¨_êo7¸deŠ©ö&´€©±²Úœýù.—7ôÛ˜<ìc¬?ÅûµßºãýWù¾&"b²Hd¸zr *=ZÔýèK¥¥)žŸêŒÓ?Õàèn)Tp°€‰;ý§¾_ÆÄޱþïÑ_ÃDDL‰ˆzáKeÿéë”ÇíñÏË×qþj­fYyu3œùEk½±n6ða+scÈëná𕨺Ѱµ4ÅÌ'ÃEh##®Éq8¯ 7›•€Õ!K*ÃDÉíí¯7Ü·d°³4…×H;ØZ˜@^w ‡ò*!«mÑlsâÇj<%¶Å#üTVo/È TÖàèë»±‘³Æ ñ¸È - Îþ|CëÓW¾:à1Ï—ãI±-¬-LðnÆ¿ >£a¬«5LMŒp¥¢GÏËТP܇ Ä´1ƒ`oiŠú&%NÕàbqÞ2]ô‡‰‘3Ç ñ¸ÈðSY²¥2(ZËï¶ßÕ·ôú‚Ûÿ7ã_##ž=£]¬`$ ·¨çZc£o_úbª/~DDÄd‘ˆHG²Ø²EW ääËôöÙEhŽ””¡ù– GØböx|~¼è=Ǥ2øgŒ˜ê1ÓÇ ÆßÏýšpº -ðå‰24µ(ñ¤ØA“ðï_n"íä4Ëfâ‹üz†_4È9vûy®óžtÄT{üã’ܠ⧯ïS=Áb€1v)ø?é¨uŒé+'{3ìÉ)Eckê=ÒClo/k¾¥‚ß8!ž=ß^¨j•Žž¯Â¿*nÂÒÌ“=ì!ýw­Þ2}tÇÔQƒ`enŒ?-¹Ý§1u”=ŽçËuî7ißDŠ‘´ïJ‡ÄlmŠ=Ù¥hQ¨0ÅcЯ1Ó³/}1Õ?""ê>:ƒˆúg²Ø&óF¸Ù¬Ò¹½P…º&Z”*üóòu8Ú Ð”–u ÅU¸¥T£é– '~”ÃÍÑBkû#ç«PÛ¨@‹RsW®c€‰Ž^i-bo¦µÍ±‹244+ÑЬı‹2x ³2¸øéëû(+­~d]”icúÊ û¢7›•šecÝl%½Ïf… Ç/É1b¨¥¦\¡TÃÒÜfƸѨ@æU]*Ów èawôCª]®k¿½çF»X#Kzûøhº¥BöEY—÷¥/¦úâlj'N†0õ<³HDýRó-E¿ékc³ÆFj46éîó†–vñŒMœ† ¶€ß88Ù™ÁÔĨÓ8^ohÖÚ¾³eíë€ÊšK+¯+ainlpc£¯ï–f&úÑr×5iíÓÊ‹g¹Þõ¸ýÛweð5S=ìÑ|K…#ç+q¹õ÷§ºÊôÑ5–f&øåºvù@3ã.µ©³÷œ•¹ *¯7uzS}ûÒS}ñ#""&‹DDwÕŸ.C½ZyìðÏË5ÝŽIÛ²ç¦ ÅÑó•¸RQæ[*˜™!:h¤Ö6º¶¿Û2»¦¨®ÿõw‘ MJƒ}}¯oRtèGû~ê+ï,Nõ |–UŒºÆÎ“›2y#¾‚ãÇ÷7ß»3Žãýà>+™,€[--¨¯«ÃµkÅ;v< ø¯mz¨TjüR^†‚‚K°¶¶Á€fhnnêݨը®©†«ëp¼æâŠë7jpë–×Gsüøþæ{—cÆñc¼Üg%“E¢‡¯¹¥ÿ)»†qã&`°ƒ#T*% £‡Ã'ãòåŸàëìÜûÉ"•JÅĽ155…R©‚Z­â¸>ÂãÇ÷7ß»Äñc¼Üg%“E¢‡L­R¡¾¾öƒC¥Tôúå”2;{{Ô×ÕÁÈèþ>Õ‡còˆ¾÷8®ÔÍãàXN¢ÖþQkÙ[›7aîìY äC³††z\¼t¥¥× Ò”«Ûþƒ‰‰)l¬­akk¡#Ü\‡ß÷¿Äñë˜,Ý*• FÆÆP(n1Ý`dl •ß(óû"Ì2’ÕÇ=ôŽÎ»¼ ÀOé` a …ï}Œ/¾LżYÓðÛù p.ï,2Áº7ÿ„¿¥§cmÔjHÄü-ÖÃ"Í?g§¡˜âí @С\©T¢áf=ê!“Ëpà`:Æ€ánî®O?b²Hd`Ô|îÐ#ä½ÏOâ£/¿Ãÿyá‹f0 }:QP!xÁÓ·³B€ FíÞ«_î?Å =‚rÏü?|þ]³ì`ÆWP)•°µ±ÃÉHŒý¶nû•ÿ¹†à^x.A `ô(ñºVZ‚©“ŸFÍ 9ŠÛWé¨T*¨Ô*¨U*˜˜˜ÂÌÜ NŽÎ?6—/ÿ„¿>€Y~sïÛµ‰ãÇd‘ˆz3]¤GÀ—™ðÅáó˜=Íûr `ciŽå!“˜>ýÞàÇâj@CCn66fNpapAßËFô×cÓ†7ðÛgçÁÖÖ7jë°uÛGÈýþ4ž;Á/„àw¿û¾ýö[¼´ðEÔ××£²²/…-¶ä0Ùkƒù€(•·Š[·nA­V·NªÛI‡Z µJyûñT7Õ¸~ý: 2“ž‚µ•5Žå|‹9³æñ÷t?b²Hdà™"Ï,Þ°´þÑêªì^A§9ð~ršUFxjüìÚÖ ô7úƽ‰É=ßd©'Ûò¸*”jÍÛSÝî"€[ •¦>Žë£óþŽþãz$¿û6† º¦õõ (.¾Šï¿?…sgóP^^Ž+W® ¤¤Ï?ÿ³³³ñÒK/¡²²²_ݸÉ"‘ù± ·ZZ `:`Fy𲧇éüOåXõÎ7˜ð„7U”Éjamfϱ¼ÿù)X€À™c¨>H©RjæÛiKéÑãî.ÆÕ«ÿ‚••,--áêâðvþ~ðDÆÂÎÎ………ð™ê‹šëÕ055…«‹”Jeßû‚×ÇÿA íÎ*µ †h=;ÕZ¦V«¡V©ÛÍÿúÞõ79ÿȆLVÇGû‹¼Žó£2~íãûÆo`Ïž=xæ™g‰÷XWñ¶CD÷ëƒò¦––xŒòÀ0477ßS}}2ÿ*­FXÌßà1 03GMÃ- @Euªj[ðĘÇûq¾=ý³Îz† †¦¦Îrýúuxzz¢¦¦¦ß¾OLLοY*”¿mêvÙâ-e×’EŽkßcaa§žœ ( 899Á}øc˜9ÑË#0{öl<þøãxê©§`fn†ÇÜÅ»Kpµø*ªkªïZï7°zõjH$˜››ÃÁÁÏ=÷Ž;öPûÛ׿ĪU¿žúÿõìUëejÁí?´þöXÓø}ú#óëò±È?D÷1]ìî¥l­×à ÚÍ÷¶Cßì‡ÿüý{dôĵ²º/¾ñ%\‡9a 5äu-¿þ €ry0Øîˆz÷ ¶þ1SÇ»uZ—víÚ…¥K—v(ûøãáåå;;»û~ÙcOê7ä¶Ýk=JUûuÍ»z*ǵo½¿G…C‡Âkâ<æ.Öü–ÊÆÚ …..®P*•h¼Ù##cÈä2üôn64 ¢¢–-`ccÝiÝÿýßÿÇ{ G…‹‹ ª««‘““ƒÍ›7cæÌ™üSxcÖö¸µZÏ?ÿ¼[õ¥ïûS¾[Ç×f—§AºãØMyQk[·nüûA×åý}ü,,,ðÍ7ß`þüùše8p`¯Ä©³íallÜïÓÄ3‹D÷7]|(Ó¿®üŒÃà_W~îP6oþXÛØöÊ~}³ÿ‘;³X³/¾ñ%ìlm`ï0Õõ-ZãÙæÿÛ»óø¨ê{ÿãïsfɾ‘…lìA6·ö^½v¡UA-.X´¶UÚª­bQ\é½U[ímQ[w¯÷^Û{õ¶¿Z\ XÛZÅbA„„„$$dϬç÷GfÆ™É$™„’øzêy„9gæœ3ç3ç̼Ï÷,Õ‡ÚÔé•J¦Ž×5÷üN|r æøn¹åýüç?ïvK·Û­‡~X+W®”ÏçÓêÕ«UXX¨ôôt]vÙejii =×áphݺuš4i’œN§$é•W^Ñܹs•œœ¬©S§êÉ'ŸŒ/$õ1­XÖ¯_¯©S§*99Y't’¶mÛVVV¦Å‹+++K©©©Z´h‘jkk#æ=Z°_øßXÏ nO.·7¢ëZþ¨5µ‹7p¸aôk\noDÀ u½ÿþûUTT¤ŒŒ }ç;ß‘Ë劻®Ïceé%kóŸ^—ÃéÔþŠrmÚüGý}ûG*Ý]ªÝ{Jµuë{z÷½w´ýÛõÖ;oéÍ¿ýUåûÊÔØÐ ƒ55zîùÿÕ¢³¾sÜúÓŸtÏ=÷hâĉ²ÙlÊÍÍÕÅ_¬M›6ŵÿÝ[=âýYŠÿ£>ª’’¥¤¤hîܹzóÍ7õì³ÏjÆŒ¡u{ûöíq¦bMsHˆ%]zÙeºô²Kué¥]—^ºTK—.Õ×—.Õ׿þõn]xÐpmùs¿¦ÛÙÙ©«®ºJÙÙÙÊÎÎÖÕW_qAO˺¿Ë··u,Ö¶±§íeô¿{Û^wttèÊ+¯TFF†Š‹‹uÿý÷Ù¶w¨ë·råJÝwß}ýî»ï>ÝtÓMýª§ËåÒ²eËBËäg?ûY\ßWÑu8Öë a™»JÐE§§þÃòûµ¿|ŸfΙ«ÊŠý]³¨ç47àüEu’ÒÓ3g\Ö±¿ÕˆÇëÓ²µ/Ê'»Æçëp›»×Yª>Ô&Ÿaׄ Eúö𴣬¶ÛsN<ñDMž•s¾úUmýp›~xãJ½õöM˜0YjiiQm]22³T_× ;v©ép“¼^ŸÜ.·þúÖ;ÚùÉ.ÙMS7®¸!æ¸?ÿùÏëšk®ÑÛo¿­ŽŽŽÏcoõˆgxôg)Ú¦M›´yófÕÕÕiéÒ¥:÷ÜsõòË/ëµ×^S}}½.ºè¢ˆu{ ŸßAý 윱‚;s,C2¬ÀkÈ0 ™†!Ó´uu¶®¿ ·M‰ŸTHcß÷tï¼óNUWWkÇŽúÇ?þ¡ŠŠ ­Y³¦Ï÷ÝßåÛÛ:kÛïö²·íõš5kÔÔԤݻwëƒ>ЛoÝm‚†º~\pjkkõÖ[o…Þ÷¡C‡´xñâ~ÕsÍš5ª¯¯Wii©Þÿ}½þúëq}_E×àX¯/CÉЧÇßðh»îûWw>ðˇÕp¨þ¨ÎÌK¿û?}óÊï20l=ûäcZtþâ^ŸÓÒܬ¶¾§³ÎYÔï ¶miÆŒéjoïPyy¹æÎÓïy¬«­Ué®úÊÙ‹´ñÕ š5祦¦~Ú"ð‡ß묅ç†ZWv~üwUWwµŠåiÆñ³d³™ÝžýúWþðûˆþÁçY–¥]ŸìTUE…|^ró 4{öÙç¼ò‡ßkúñ3U¶w\ÝÆ¿yãkZtþb575 jíÜ.—~óëçuíõ+ºµ³ý÷ïý¶í®ÓäÉãdÚ».ÙíöJí®®Ö¨ööNµµwíÍÏLMPz²3t«¾ÆÃͪ=X¯ï»L“вº}yßzë­¡/µ`ØX¿~½N>ùdM:U6lдiÓ$IÔüùóUYYÚ#Y^^®ÂÂÂÐë'Ož¬•+Wê¼óÎSqqq¯ïÝáp„¾ØúšV¬×ÑüSN•7l—ž‘©¦Ã*ݵC®N}åì…²Ùz÷í¿©lïnM)™öiËaà¹áÒ32õÕséÕ /iÉ¥—‡ú7nԞݻÔÜtX_øÒ%§¤èƒ­ïi÷îR7}Fhy´µµé _Z Ô´tµ47Õºx½ž˜'¥?øëwô§÷öȲ¤†÷?ßSN=!jÿZ—”D‡¶mÛvc÷.ËÖþ¯ž¾k±òsÒBý>÷¹Ódš¦6nü£Î8ã mܸQYYYš;wŽÜn—ªªª4sæÌ¨Zr»?=Ì,'';âñþçsº÷ÞŸhíÚµÊÈÈÐOúsÎ9=ÿ˜¼6žiEKMM ·Ûmòz½¡Ço¿ýŽî¸ãvmÛö‘ÚÚÚbŽ/Ö¸û>Xu•¤µW©«ïþÚ»¯RÅŠÕáö)â”Űº6µ¹ÕÔæVvz¢\ª¯­×¯ï^¢ÜÌÄnó9ÒëZXX^XX ššš¸ëÚßù<Öëwø665-U'|’jjª¸¨H•••jkkÓ¾}å?aœf¢6lxYÇwœÊÊÊ4ÿÄT¶¿ªÇe™œœ¤5kîÔš5wʲ,•––jݺtÉ%—襗~÷zÐ[=âýYŠZZjÄz«_øº=Ïï`Ö,xΛÍ4uùåßìZK #ô7zí=pcQ· ±{Úå:r¹:»Ý‚¡­­5æ²:xð ŠŠ C‹Š uðàÁ>ßw—ï`l;cõëm{]SS£üü±¡ÇùG¼ >Võs»]ºä’%Z»v­ž{î9}ôÑGzþùÿ½—xëYSS±nöúÕÓ:v´Ö—c°‹4>¦OŸ+bJ2dšf`o½ÑmxYÙ¾ÇÛÑÞ®¦¦&}þô‘ÛÕ©±…EúdçNù<±¿ƒY³àaŒ¦aB†¡®ÿÃþ¿wVäw Çýè=½õê›}Þ0Z^^^IJ.++Snnî-Ël;:Þ†çå婼|¿&MšúieýœN§®¹æ}÷»ßÕwÞ)§Óznø{î­žcÇŽlqìi™ÆºëÑ\_ŽÎY†,zåv»cv^¯W^¯G­­-®5ìokhOÇã‘×ë ;FÞØK{¼ee{åv»ô»ÿG¿ÿí‹ÚøÊ¹Ý.íÝ»G>Ÿ/â°Øàk22³ÔÜÜ$—Ë%›Í¦ÎŽN9ΘÏîk¸«³S›ÿøª^üÍózù¥ÿ§×7¾&—Ë%»ÃzMRR’š›º¦ýŽÂÏÉЗO_ßU3ãéÎ>û,UUUé¿þë¿U__¯/ùË¡aË–]©ë®»N{÷î•ÇãÑöíÛõ­o};b>¢Ç÷ío_¡;vÈív˲,y½Þ^ßG¼Óêíµ±úutt(!!AN§SûöíÓµ×^1|öìYZ·nÚÚÚUUU¥å˯ž‘‘¡]»võ:ýÁ¨k‚æ'îüšäëTuUL#VU¥”D»Ü®NÕÖÔc·Ÿ«iã³Gm]o¹åVÕÕÕ©®®N7ß|‹.¾øâ¸ëï|ƒ¸s>Â/ãóùTXX(›Í¦ÌŒ¬ÐH$)11Q6›]‡C9¹ÙJNNÖáÃ]G?¸\®Pˆ ÷Yg­^xA”×ëUEE…î¼óN|òÉq¯}Õ#žá½}>ú>ÏT_Û¿ÁXw%É4M=óÌÓzú™§ôôÓOé©§ŸÔSO=©'ŸzBO>õDÌ ‘¿r£’'Í—ß²B‡Höõރ݅^ ›nºYµµµª­­ÕM7ݤ‹.ºðˆ–å@¶±¶±úõ§Î]t¡V­Z¥úúzÕ××ë–[níqYŒ”úÝpà 566hÅŠÆÞW=/¾ø¢ÐºU[[«›o¾¹ÇeÚÛ|½õ…–Eà3Án³kÇŽÝ÷zÛí7~¼$Cû÷Ë8´#|\bBì«hùý~Õ8 /~å,åää†ú·µ¶jã«/kJI‰|Q­…N§Síí¡Nwt´ËétÊ4»ö#†!_Øá%Þ8.B’àLЂ³*)ðã«'=Wt¬[º‡þð ¡|úºàýøú3®+~¨k®ù¾yäáˆ×­X±B?ÿù/´pá"ÕÔÔ¨¤¤D7ÝtS¯{$Ï9ç]zée*++SII‰ü±¸Zã™Vödÿò—éÖ[W©¢â*((Ðõ×/× /¼þÀêÚk Ÿüä§*((Њ+ôÛßþ64|ùòå:ýô3ÔÖÖ¦æ#8$9žº¦§8õôš¯iɪÿQm¡ìÜÉ0Ci1Áa“ÛíRcmXy¶æLW}Gj]?÷¹ÓtÊ)§ªµµU‹/ÖêÕ·Å]×þÎç±Z¿ƒÁ®½½=âyÁðèt:•’’¢ôôtefeZ͈D›­ëÂêêjåää¥-4ü–[nÑúõëuýõ?TKK‹òóÇê‹_ü’žyæé¸×ƒ¾êÏðÁnYÈçwP[¦7u7 SË®üŽ ÃÔÅÖBUvíꈠ1顯pºÈJ?Zï¸ã­\y“æÌ™+IZ¼x±n¿ýöAoYìk‹µmìi{ï¼Ý~ûíZ¾üz͘q¼RSSuÍ5×hãÆCÓ²xŒê=¼¯z®^½Z×_ÿCüL¥¦¦jùòëôꫯõ»eñh­/„E`4éåÇkðèhÿãã@‹‡!׫YQÇ¿÷¶Á9XS­ŒŒ “­Cõu¡(Iiiiª¯­UjZZÄ8rÇŽÕÖ÷¶hÚqÓåóùTúÉNÍ/ ýÀJMMÓ';ÿ¡ìì¹Ýí.ý$âõv‡]-ÍÍóSX\¬wßyK“¦L•ÓéT{[›öí+ÓÌY³ûµ¡ê–‡xE´,†ýÓãõõû},Y²DK–,éö:Ã0tà +tà +b.£¦¦Ãݦsá…è /ˆk™†¿¾¯iõöÚXý.\¨… F ÿÞ÷¾>gÎlýùÏ‘—>_¶ìÊÐð•+oÔÊ•7Âg"¾ºæg§ê‰ÛÏÓåk~+Ÿ e#K–l6C^[Íõµº÷Ú:uVQÜó3Rë*I×_}Ìç÷U×þÌç±\¿½^¯:::TWWñ¬à?‚Ïu»‰ôôŒ@°ì:â¡®®N¦i*;;[III¡çqÆé:ãŒÓ{ÝV÷µkÑS=úÞ×zÚ×ð|¦b½~0×]Ø|tëWÓÜóƒ,Í{Nú§SËRñ­’Í4#Zr|>_hhoï=´C61Q=ô zèÁ-ëÁÚvÆÚ6Æêן:'&&jýúGµ~ý£’¤]»vé™gž’mﱪ_¬÷Ü[=ôÈ#ë‘G [¾|y\Ë÷ج/„Eà3Ï0̸΋‰v ¢B%3fÈãñDEI*(*ÒîÒOtêçÿ9¢ÿä)%*Û»G{ó/²,Kycó5wÞþûGr&$hâ¤)ª«=zýøñõÇWþ ¯×«3¿´@’4nÂDÕTЇ[ß“«³SIÉÉš, à8ôðí{ñ:ñäS4&;Gm­-Ý^7&;G…ÅJLL Q˲d†¦L-Ñ óæ+1±kOygg‡Z[Z-‹©šêiÊHÏÝáÏçÓ¤Àå¥-ËÒ¸ 5}æ,¥¤¤Ê0 ¬©–$åjÊÔiJJN–ÍÖu5¶¶ÖVY–¥ùâ—韞™éÚƒ<')¸ý~É#3ø|]ãhoo—Íf“iš²Ùl‡§t #æÇkêê÷ûu\qšV^z’îÿÏwåK#WK£¾{þl1'_mmm¡ZRב<"çßívZ»CMOK[‡}1Ǽ2¥$“¥êêƒmc§Ün·|>_h}-Ëþ,ÏÏnXìû0Ãï~ç{¡Ö(…µP}ÿškC‡3ú-×=úôž½~¿EPŒ2~ü8ÍŸ’:;;uöÙgë¶ÛV Ña¨CS¿xֹѾÎ Xo÷Fu¹:u¨¾VN§£ÛÆ´¹©©Çûz=ŠoGØù?m­­jkmñƒ«µÛ¥Éƒ‚¡òXÅøèË`C„Ïç \|Èú!éò¸eóv¥EÇ#ÔLWg§l6›ìv»,»]–ß/»Mëp®k°;õ¸,]º`ªžüÃN]þ•iúêI…êìèi³ÉˆÔud,¿_6›M N§æÌ<^=õ¬Îúò™òz¼ÊÏ/P§«SMQÛ¾ýûuÆg(99IuõÚµ§Lã‹‹•š’¢Ä„ÙLSä¡ ‡zg_ÃGÛº+uÝ]!¸SÓ²¬Ð=ÝÀUÃe²;?ȱɱÝBIDATz­ ®¾ê*]}ÕUÝõa8ÚßýߣiY]‡=šf×^·x/Õ¯­ï½§©Ó¦É¶gü³ù[²û ê~¿?¢óùýJOvªvy£JOvv¦¨•ßï—v¾†g]ƒ!ÒëõêœS‹5.7Ys&g‡îf†|2¨ë(øÏA“­‹Ÿ¯ß½´A^Û¬±có4ã¸ãÔÒÜܵ5MÍŸw’,Ë’#!Iõ *ÿèc575«dÊzÒ<*==] |†xÝu¹ÜÊÎÎÕî=¥š:¥¤ß߃–ei÷žRååUg§K =\Ô„E`DILLPYÙÞ®•ÓáÔ (I§ŸùÍ/8&÷7>ßkÝC¼a²Ùl²,+t¸¡azáîEò[VèààžNÃ0d˜¦la‡(ÚívÙíöÐx0|ëê3 ™6›‡,ËÒ©3“¨ë(ý8™¦©œìlÙL›®¸üÚúá6½¿íC½ûþjni‰8ì´k;œ¨äÄDåååéÌú¼>wÚ©JNJRZZšÒÒÒø, qÍü~¿êëëdX†ÞøóŸ´áåßË}¿[+2XDŒÍêº]CjJª2Ò2T__§üüüQ{2õaø ™ÁÉÉÉr:ÊÈHW~~¾Î9뫲Ù>­qpGPð±ßï¶ì—at]1Ñnïºÿ"Lúšegg«¤dZ\·kêõG®Ã¡ììljFý@X†åösØmÜN?ó‹*(, =®>PE]b0 £ßç§ñEF]1|?¦iÊét†n‘qdÓà31Ô5s8?nÜ NƒšQ?Äå³Ã0ú-?_<#„/pqê:ºëÇúͺKͨË{ø^q›° ‘Ý:CÇ0”™™©Šýû•››ËòÕ++kŒ 䮣µ~¬ß¬»ÔŒú±¼Þ¶’° œˆ=ü–Í´iöì9zûooê”SOSNnžLÓ`C~¿¥úºZ½»å0ožœÎê:JëÇúͺKͨËûèm+ ‹À0`˜¦RSSU_[«¤ädH?t´·+5-M~¿ðC¨ÍTAA¡fÍž­?تæ¦&ù†`:„þ6›2235kö,ådg+1)‘ºŽÒú±~³îR3êÇò>zÛÊQŸ}ò1>=Ñœ§ ‹Æiwé'š<¥D)©©,”8´µ¶jïžRÍž{¢\.×à‡xÃÝéÐäÉ“UTT$¯×'Ëâ‹m¸2 Sv§C‰‰IÔu×õ›u—šQ?–÷ÑÛVŽø°¸èüÅ|j0òÃb‚S™š>ãxíݳ[­­­CÒR6ª6–ÖØãgÍVvNŽÚ£î{6˜lv‡’íú(C]Á瀚úa”‡E`´HLJTzfº ‹Çqþbœü~¿Ün÷Ecʲ,¹:]ruºX‘hò„Ea@X„Ea@X„Ea@X„EaÂ"€° ,‹Â"€° ,‹Â"€° ,‹Â"€° ,@X„Ea@X„Ea@X„Ea@X„E‹Â"€° ,‹Â"€° ,‹€aÏÎ"Ð~ŸO^ŸO²,Æ‘2 Ùl¦l¶áÍ‹âæñxTUY©·ÿ],#`š¦2Ò34}Æ Ÿ8Q‡ƒ°`äñû|ª«­ÕÖ­ïë _ø‚&Lš"›ÍÆ‚ ŸÏ§²=¥úóoÈf·iüø 2‡Ñò$,ˆ‹×çÓG~¨/~ùËš4i äÙl6M6]6»Coýõ¯;v¬’’S†Íüqñ±,546hüø‰,‹ATþÇÇ*((Ôòk—+77…xŒÐ² _,ËŠ»[÷À/”“=FçŸ÷5%%%iíÖ¨¥¥¥ÛóÚÚÚ´fíJHpê¼óÎW~~¾Ö=¸®_ÓÉaÀgJee…ÆO˜¨}ûöª  _'LÐÚ­Qkkkè9íííZû¯kTTT¬ü‚•——©¸¸HUU•,@Â"€ÑhΜ¹Úµk— ò TUU©¢â"Mœ8Qkÿµ+0ƒbqQ±Æ+ÖUÊ›¯]»J5wî =Ž×n·wë0¸X¢ú-ÞC'—]ñýèßÖÊn³iܸbÕ<¨ââbI–VÝv³ ÓTII‰Æ§êšåÍWEE¥jkkuçíkzŽÇãд,2)))ZsÇ]:P]­ýÊËËSmÝA?^Ó§ÏPII‰&ŒŸ ÚºZåååiE…TWkÍw)%%¥ßÓóù|Z½zµ •žž®Ë.»L---¡á‡CëÖ­Ó¤I“ät:Cý}ôQ•””(%%EsçÎÕ›o¾©gŸ}V3fÌPrr²N:é$mß¾ýˆ¦CX€0ÉÉÉZsÇ]ª®®Qù¾råd稶®Nùù*,,T]}r²sT¾¯\ÕÕ5ZsÇ]JNNдî½÷^mݺU[¶lQUU•µjÕªˆçlÙ²E[¶l‘ÛíõÛ´i“6oÞ¬ºº:-]ºTçž{®^~ùe½öÚkª¯¯×E]¤«¯¾úˆ§3’.øoS’íºï_ÝùÀ/Váz>Ù$In—K¿ùõóºöúòûýý~}{{»n½í+.Öø ãB¹IMMUUåí+/×½wÿ$® èp8ºõóx<š:uª6lØ iÓ¦I’<¨ùó竲²2ôºòòrFŒ«¦¦FÙÙÙ¡ùÌÈÈèÖ/;;[’4 éôæW®Ó¹ç§ŒÌ¬Õ¦ª²B­_¯õÈ$¹$uHj“Ô,©1Ð ûws`xGàù^I>I~I–Ä9‹úÉëõÈëõöûu.W§ü>ŸL›)ŸÏ/ŸÏ'Iòùüòx½òû|r¹:e·Ûâ_[[kd˜u»TUU¥™3gFô7 Cn·+ô8'';â±$¥¥¥†ú§ÝÏëõ†t:# ‡¡èËR¿ï#ØÚÚªßýoš0a‚ ÕÒÒ¬””¥¤¤¨¥¥YãÇÓ„ ôã»ÿM­­­qÝ—0Vÿüü|íÚõ‰Z[[B]KKs¯¯H¿L‡û,íq±ßAñî{~¬ÜÜåçUCÃ!¥¦¦©²²JUJMIUCÃ!åçUnnŽî¾çÇ}ÆžÂØ²eWêºë®ÓÞ½{åñx´}ûv}ë[ßô°8éŒî¨Ø–Ŷ¶6ÝsïÝÊ“©¼¼<546(55Mû÷ïWÅþ UVVj_ù~¥¤¤ª¡±AyyyÊ“©{î½[mmmý‹+V¬Ði§}N .R^ÞX]yå2-Z´hÐÃâ@¦3ÒÂ"ç,èo\Œ;à<óO+9%E¹¹]A1##Cååå:ÜxX7¬¸Q¦iê¡_=$ŸÏ«‚‚ü®À˜›'Ÿ×¯§ŸyJßûîU²ÙºŸÃØÔt8æ<†¡nX¡nXp­_7~™ÎHCXп¨gkXkk«vîØ¡çÏ œ£˜ªŠŠJ564êŠo_)Ë꺸Í7¿ñ-=ùôòz½*,,PKk‹rórõþÖ÷uèÐ!¥¤¤D\!5³‡+†>ÜHq‹Ž]XTŸaÑår©££Cùù…ªª¬RAA*++u¸ñ°.YòuÙívI– ÃÍfêâ —è×ÿó¼eš¦ü–Ÿ°8ˆ|~Ì{IŒ †¡ÌÌLUì߯ÜÜ\–Ç i8T¯¬¬12Œáu³ Â"€¸ØL›fÏž£·ÿö¦N9õ4åäæÉ4 Ìùý–êëjõî–wt¼yr:‹FÓfª  P³fÏÖ‡lUsS“|«œbáÛfSFf¦fÍž¥œìl%&%Œ<†aÈîthòäÉ***’×ë“e(€¦ìN‡“†Ý¼ô‹ÍîP²ÝÁ‚íA–E ,‹Â"€° ,‹Â"€° ,‹Â"€° ,‹Â"„Ea@X„Ea@X„Ea@X„Ea@X€° ,‹Â"€° ,‹Â"€° ,‹Â"€° ,‹„Ea@X„Ea@X„Ea@X„EaÂ"Œ.VŒN1þýGX€Ñ#º51V+cøs{dïm`Ue‹F ú{‰q–ÚcX\þƒkXÌ0²øÂ:Øß`×k@ gºà¿MI¶@ç””$)ERš¤ Ic$eJÊ mñ„0¸Â[ƒÁÐ+É-©CR»¤fIM’%–ÔxÜ"©MR§$WTÀ´¤Ø-‹ÑM”á)ÔÖy3 ˆ <Ç$,ÀQ‹þ°°è tÁüû<Õèi(ö±¬VŒ”œ¸;@ƒAÑŸÖ°CÃ3›G]-†ÁVÃððý½Œ¯Ç–Åž‚¢',$v*²EÑ£o MX Ïnáa±#F`ô*²…±§ áôx›à}1‚bgX(T`¸GŸŽj ‹E8:a1<¿øÚÔuîbgŒÀèSì[jH’eï#•FŸ$+(ºÅÅmàX…E)öEn‚­‹íú´•Ñ­ÈÖÅ·,†Ÿ i ë6Ì%É"Ͱ HX€¡ ‹áç-†ŠÃI ¶.úÕsË¢újY ¦R[`Bчž†E[TXa†<,**,†ŸJèÒ§‡¤Æ:µÏ–E+,ØÅ:A2üÐRTX ?WÑŒ ‰„EúÀ}UÔX)u‡…Å^ƒbxXŒ5¡ð˨z†'~Åð{+šÔ ŽIhô«{ cðÔÂ`xŒÕ²=ž¸ÎYŒžp0,†·&Šl}”hU€££s[t~ó†u>õ³e1úPT Æ ŒÁCSmŠlMäðS8v1üpTK‘W=õEý –Ý‚g¬PÝ:hÆñ— Ã30öõ·[PŒ',÷Õõ5NÀÑ ‹áûêÔŸ°Ø[ˆ ‡±Z Š0<£ãoO÷U´â …ñ„FB"ŒÌÐØkHìOÈ3Žp8àØÆ~HÐ#Àè L– Úÿ€c¶¿vìIEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_design_translations.png0000644000175000017500000013342712235000130026632 0ustar00murraycmurrayc00000000000000‰PNG  IHDR(ÚõÉ0sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ )õž£ IDATxÚìwxTÅÞÇ?»› ! é½€tBGŠ ¨H‡{T@)JQ:H¥]¯¨WD$`ÆúŠ‚TEz•&B …t!mÛûG²ën²›FÐ ù}òÌ“³gf~SΜ™ï™3畃AAîôÿ´(Q!‚ "2îZ(îMAAlWH”Kh(î2¬¢ Û‚ ‚ T a¡/EP”Id(*Fa⊆SˆÀA„*%,ôVÄ…¾""£Ì·82G'Ç@Aª>?¯]ä‚åY aaMdXv¥ ‹'F.Ñ9y?Àðþåh‚ Â}@ÍÖY¹)çÙºjZm bBgåQ‘¡°&0ìJ/@bz¶ Aá¾"íV6mÅ&æíTJ<ÝjTI»Cz·Údl]5Í¿ˆ0uÚBM 3™Õ 4aWš°ˆO½#­OA¸/…EzæÎÞQ¡ø [wE§ÓUÁnòÍÚwé ¸uÕ´:&bÂÔiL¶…ÿKVo‹8y?PS¯—(‚ ÜW¤gæz3‹sGwÒµû¿x ¸v¹âŸ¿žÁŽ-ßS¿e<\«¤]“ñÞ¥P\hLœPþ7–FñYŠ¢¿2G÷ÌÐ1dç©-fòâÅ+¤Ýºƒ®ŒºC…†¶­›KkAl‚¤ô,ÿ¾™‡닟‡K…lœ¼”ȹ£;iýP| mT5»‰©·9ôó:~^»èAQ‘_Ä© 鬆á6J1¡QÒ‚N¬MZ¨TvÔöó+sr3o" ‚`™ŸwేÛÝWi ‚-£(¼´öópA««ØåãQ‹s…¶ c\U³[÷B‘gâT€²Èd„éÂÏR×\(Š‹ Ë©?ÒÈ™žµÀRxFcž€.žç—Ë¢.Ûç—ß–èÿèCm+=½ß@ßéë*;¡¦öîUZ‚PQ*þòt:ý]Û2Œ—–ìnÚ±·LvzvíP.»¦¶‹Æµ¶¿¨] â"¿PTä9&âÂTT˜:Sqaܶº @gmº¡p÷?®7î ÄÙÙ¹˜|Ñé´8:8X·%6ÂÎ݇Œƒ¯5úN_G—NmîY*ã<1-GIù•sR¨Þ3ŠJ; …ц5»ïMíS¢qom(–ÒìnÙ¹ÏhwÜ[èÞ¥}‰û-Ù-Bmaa_(, žÑÙÖSÆŠ¿f"JÔôéÓУÓéÑé´dÞÎ$&&½^=è!$$„ÔÔT¹-"Ø<;¶¡ïôuÆß¦tÑÁ»nD(×âÉÏÏ瑃÷õ„\ºr Pàà`‡—‡;a!ØÙ©Œqãâop=1‰¼¼|j8;?·ôðëžCÆü°´/1)•¸Ädgç`ooOXp ~ÞÅFçŽmÌÊ×¹c›ÂsROlÜ n$“——‡£ƒ~>„û»CÚõë†s-.‘œÜ\j8;S/"w7WnÞºÍå«×¹s'=àîV‹à?›À×;ÎRÿzØÙ©8sî"6ôeÚÀÇðtu&!5‹ÿÛuÖ,_÷˜Ï:M×°ïìù+4 wetNù¸’™Ç7;ΰuùìKQdn§§Î\¤KT3Ÿn†§[ Ò3sØvð2;þ¸@“†uÙµ÷ˆ1βo1¡_|=\HH¹Í‡Ž‘Q(ˆ´9éÌy®aþî(€3WSùiß%Ò2ôÔv!ØâÌ•8sÉ ƒu»†Áß’0°¾4»=ÜŽqom0Æ/**ƽµÇnW¢Ý"¸ {aax<Õ° Óð$‰²ÐY¥-è´\ázµ:ŸnÝG«Õ¢ÑjÑi5ü¶{×®ÆâV«Îväåå¢Î¹Ã­œ;¤Æ¬Ã½QjÔò”V-T9Šž ¡~nŒûß6ròòéô`+®Å%âãU›±ÿÛBRZ65fÜ“mP)|³ë .5i[߇½¢Ø:Ž)ïýŒJ¥btßæVÒ3,º*~Æ%$Ñæ^ìÓ‚Ãg˜ÿÑ.P(ѧ5§b3é;}]1QñPûVü¾ïˆ™Øë‰tmÈànMX¿ë_þ|šÁÝš0¸[ôz=G/ß0 ß0Ì›)ïÿB³f éÀصb²_Ðét|øJw<\ùϧ{8~9‰úÁÞ<ýxÞüêqvCîï™ }™ìvíd¾ÖiÇÌ0”l·k§¶fÃTXtíÔÖbJXsQ³ÈŒ…áÑÔ¢O˜.ò´ø‘ÅE¾ZkyÖB¯C­Q³ióOèt:ô:žÞ^\‹‹ÇÎN‰F­A©T¢T*Ñêtäææàd¯"51?'wiÕB•£è¹ðù¶SÔ .䫵ԬQƒµ[þ@­Ö ×ëØyô*ãžlCë¬XŒ›·nóÊ€GøxÓqBBÃ@o:A»ÆAVÄŒÂâ9—pƒé`õÆ? ÁÑÑ‘Ï>KXHñ‰ÉfáÛµnnÑN⺠*X˜ýãîóÔ‹Œà‡ßÏÓ·ÓtkÁÆ}ÛÍÂùó)êEDpèìy|=\ÈËËC©TâìhZ£#õV6:Žóq,þt/Ö³ÚÂ?;sñטx'7ÿ®mÚyivKJ«¨_yì–Åž%»Ä…©°0ˆŠ\“ ;qaúI‰3eº-¢×ƒF«¡k×®hµ4Z †?Ïžçü•+Ô¬QpûC£Ñ V«ÉÊÊB­ÎdzQSYD&TIжÛÌ;yØÙÛ£Óë¹}; ¥:“׆u$< 6NvÆ)ÌZ5 έo÷‚ó"åf6!áN€‚”›wÊ•.@~~>^îoîKθCp˜3 …‚à@‹á­sùê|ã‹tnfåYÉ›Y¹xºÕ ?ß¼cJ»•CD]G´…¯6<ÎàÏÛOñÜMùßøÇÑéô\IÈ`íÖSܼ•‰«k-i@‚Ía¯R·µº‚6}øè‰2Åmݲ*e ¥Rºð¼°d×KûŠú•Çîá£',.5¬Á0äÕšÝ"8†ùBaádAXØY˜¹(û:ÿºz²°Ÿ‚§@t:ZV‡N§E¯×ãîV 7WWôz=ééédgå Óäãho‡½¼ñS¨’Xj·†}—®Ä=½;µk9³è“Ý»x•BÁ·‹ž4ÀŽŽŽ¤Ü¼ƒŸ‡ Þî5ÈÎ.xõ®ApE©,P'999xº9›ù988z3_šøÔ®É;wprt"áFÁAe>íì¸y;O·¸»8r';·šN…B"òòòKµåããÅ/GÏóóá‚}jÑ4—çº7eòÓmþßÍ4oÚP`Ó3¦·ÊôTGaxÃx¯0¹Í (å¶HI¦¼vþqÒ,¿EtFËæM­Ú-ª¹ g,ìM…}a¡´ ,н³”§E,w¨ùùyØÛ; Tª°ÓÚ¡µÓ¢Õ9`gg‡V£áÖ­LìììPçkÈÉÍ%++ —Z —׉ ÷Ÿ¸ÐëõÆû¡wrÕ8ÙÛñô£Ì`oO6í½ÈˆÞÍÖ3о?‚R¡`Lÿ–æ— ŽÜHÏÂÏÃ…6 8u9†á=›±å͆=çy±O ^èÝœ÷¿;ŒÖ«_ïÈÈ>ÍY<²3i™9ü߯æOx{yñû髨”'èÕ¡.ŸÎîÃô;|÷ë4YsÈûßat¿LÒÔ›wøfçkSÇL¨ì=s¼üÃôìP—5³zs++u;ÿÄÉÉ?¾Þñ'»4âÃé=âÓøûù²q_ J¥‚GZ„Ñ·Ó¤ßÎáËí§Ù~ä:‘aÄEñzðöôà§½çÜ­õBŠ¿Þ¤ù÷ÙmÖ´±Ñn³¦KÝoÉnQÍUDDuJ+ÂÂT`”þ-kW G7ŽÅ/Ó'^BO™™·Q©T¨Õr g.jÕr¥R®b„*A‹¨&ƹETÁÓ–ö¸ÔªÉíÛz¦|°“¼¼|ìííðõõ6 zÂCC9t)…M¶¢VkptpÀ××§H8ÈÊ¢ÐVöø £×ë  æ|R:{?ÜENnöövøûúàééÀÑË©ü´÷ãúƒí¢iÕ©Æö£‰|½ã,jµ{{;<==ˆ¨Š^_¶zHϼÍë_"ûN(ÀÙÙ‰ jÖ¨!ç¼`£3†5 —í^ÑuÖžê¸×vMmkmQ»Ä…©Sù]ô6ˆÂÒ¬…5qaUE•†s`s2.ïÂÝ)gGGœœqt®Z¯BáY7ŸpYÐ)T¢š5.vXÚPÓ¥&õ¨k¶ÏÓãXXoo/¼½½ÌÂÕ.|Ñ”!\š5ŠÙªíá^Ì–GíÚxÔ®mñœõòòÄË˳Ø~Kù÷ó÷ÅÏß·ˆ  eª—Z.DÖr¹ë>DþéY~59ý¶ÑVÑ7iV»V&LDQQ¡,MX”*.Ê{Åáìâ‰C£^ܹ™DêÍhðÀ>À…@œ][»ÖLYŠWô·N§céÒ¥D5o¯Ÿ?Í¢šóÎ;KÑétÅâ|õÕ×´nÓ_?ÚwèÈÞ½{aöîÛG·'ºB`P0O>5€;•–+‚ ˆ¸(+gÏžcÿ¾½¤¦$÷åää°oïâ®_cÎìÙ|¶v-3gÍ2ú¯ZÍœ¹siÖ¬ž>ÍÆ Ø´y‹Eû …¢Äô££W3~Â8qâ8»~û3gΛHKM)q¶âÝw—±pÑbúõíKìÕúôé͢ŋY¶lY±°ûìç·_w²fu4çÏŸg„‰F¿‘#GqäÈ¢W}ÈåK™XAzZê=›¥(:Xö]8OO«qµZ->¾~xzzpáüyZ¶lÅÕØXŽ=JhhWcciÙ²•Y:ž^Þ¨T*’“nXÍK‹–-‰½Æ‘#‡  +SÞ-íoÕœ¸¸8ΞùnܸA£ÆMæøÇÌâœ>uÔj5~þ( £¸ GŸÏ–-›©ß ŽÒjA„J#>î:Ñ«VñÞò•›€< ¸d….Íd;³Ð?§0¼Ð:@o“3E…ÅþèÕ«7¡aáxyûàãë@zz†1L\|<AAÆ}A«äøB‚ƒïª7n///¼½ „Dbbb±°þþþØÛÛ ×ë~³fÎD¡Tҥ룇ÐõÑÇØµk—œ ‚ ‚Íbó¢Žñû`ÕªILˆ'>îz±Ø $âââ‹ K3†u–úÀÀ®]¿~Wùöñ)X3’ššjöß $ÊʨQ#¹|é"?o߯ìÙ³8~ü8#G––+‚ ˆ¸¨(Z­WWWòòòX¸hQ±0/¾ø"ó^}•ôôtÒÓÓyõÕ׊… `Û¶mdggóÆ’%ÅÂŒ=€Ù³f“’’BFFsçÍ3ú»ºº·]JbàÀ,_¾‚¼¼<>ø`9Ï R®ò?÷üPΜ9CãÆéÔ±#NNNÒrAeÕ‡+©W¯}ûö£CÇNDDDX¼ºŸ?ÿ5þøã6jL÷=éþD·bá–-{—zõê1tØp:uzˆÖ­Z[*/ðîÒ¥ÄÇÇÓ´Yz˜zuëý_™:777Z¶lUâ»;¦O›Æ„ñãùîÿþàP~øñGfΘÁĉÊUþ!CóÚü„…סwŸ¾´iÓšèU«¤å ‚ 6Ë?² SAÛ Z,èA¡j#âBA‚ ‚ ˆ¸AAÄ… ‚ ‚ˆ AAD\‚ ‚ âBAAÄ… ‚ vR‚ ÷V‹F«“. B…P(P©”¨T¶;„‹¸„¿„„zôìÅO7$RÍP«ÕÄÇÅñçéSdddH…F©TâæêFý  ÃÞÞ^Ä… üxzy“–šrÏÓyç¥=vŒÏ×~VÌoÆÌYü÷¿¯WKa1hðZ·nÅÄ ªeûÓiµ¤$'sìØQ:wîLhx*•JNL¡BhµZb._ä÷]»PÙ© EiƒíIÄ… T‚ÉÎÎfåÊ•lݺŢÿgŸ~RmëjÁü×èÑ£'£GÂÉɩڵ)VËÉãÇéò裄‡GÈI&Ü*•ŠÈzõQÙÙ³Ï|}}q®QÓæòis :=½¼Kü”¹pòÞûïããëÇ{ï¿ÿ棢3?ýôí|ðððbm¹¨3õ¯ÈùQçXeØ/k]EDDЪuk6oÙR=·^OzF:!!ar¢ •FPp7oe Vkl2ò´ˆð£ÓéøøãY¼hŸ|ü :®Ê•aë¶môìÙÃâ\ÔUGú÷ïÇÖ-[«u—[!BebooV«C¯·Íþ²JŠ‹•+?ÄÓËo_4lĤI“¹}ûv±+Ư¾úšÖmÚâëçOûÙ»w¯™U«¢‰jÞ?ÿÚwèȺuë,^]½š+ºO¯×³|ù ZµjŸM›Eñî²eèKY¾wß>º=Ñ àƒ‚yò©ìÜù«Y‡´téR¢š·À×ÏŸfQÍyç¥fƒoYògø½zõjš6‹ÂËÛÇè÷Å_òÈ# ¤q“¦|¶ví]—«¼³O¿ìØ››;/¾øµ=<رsg1{ò‰ñX=òHgN>môÏÍÍ套ÇBý YöÞ{VÓ¿Ë Aƒ # ’ššjñÊý—_vСc'üüˆjÞ‚µk?·Z†ãÇÓºuërÏ­«’òg-NyòYÞŽ’ê½Å† ?²aÃF‹é)Šóóþ0wÞ<Ú¶kGÌ•Ë ô, ,dùŠ%Æ9rGŽ!zÕ‡\¾t‘É“'mô÷Ýe,\´˜~}û{5†>}z³hñb–-[V®ü8{öû÷í%5%€èèÕŒŸ0€€Nœ8ήß~ãÌ™3w]®òòÑšxñ…1|8kV¯).ÄöîeËæM\¹|‰ž={2iÒd£ßþó:™™™?þ{öìæàƒVÓzöÙAŒ=Š çÏqîÜY"##™3g®Å°/½ü3¦O'6ö*?mÜÀ‘£G¬ÚMJJÆÏ×·Ìe6Ì`Í()Öâ”'Ÿå¥¤z/O]xã†\nZàäéãøùúóÔ¿Ÿá駺Á<=`0Ï Ì¿ú>Ƀí:JvÎ6nZOÌÕ+6?¸ÕE¡3l+Õ¸—Fç.û`éi©{† WCe>ÖjµøøúáééÁ…óçÍlœ>uÔj5~þ( ãÀÚªUkb®^åèÑ#„…†C«ÖmÌÒ÷ôòF¥R‘œtÃj›·hÁµk×9røáááܺu‹:‘„††pìèQ«y GŸÏ–-›©ß ŽfþÍ¢šÇÙ3âããÃ7hÔ¸ ÁÁÁÿãX™ógø}áüy<==ŒáZ´lIlì5Ž9LxXX±üU´\åájl,ÝïÆÉ“'ptt$//¦M›±}ûvBCCŒù¿tñµk×6ŠË°ð:$ÝH q“¦üôÓÆbÇÑ´üÖÚSNNQQÍ9þ\±°M›E1~ÜXzôèA@@@‰å "öjŒÙcaÖfOÊ’¯²äÏ@yòYZº¦~¥Õ{yêJ­V^‡ø¸ëÕ®“ÍÏËã›u_3nâd‹‚à›ÿû’O"ãV½^N§C§×¡×éP(ØÙÙLƒ«uÔtqáâÅó\»Ë£]ºáèèXἩT*´ZíßR¿þú+Ï>û,ÉÉÉ÷$Í¿³,¶Âûï¾Cï>}ps¯}Wvâ㮽jï-_¹ Èr€;@&QèÒL¶3 ýs Ãk- ôUræbÿôê՛аp¼¼}ðñõ =½ø³ãþþþÆßôľ@°É£ÁÁÁÊSBBAgÛªu<½¼©YÆõ¸ãÍš9…RI—®B×Gc×®]Fÿ…Wz^^^x{ V‰‰‰n& >>€+å®h¹ÊÃÇ}LjZAxzyDjZü±Y8ÃàììŒFó×"¦äää2ÇC‡Ó³W/‚CBñôò&(8„´ôt‹a?ýäc~ýõ7~¤3-[¶bë¶mVíúùù뫨(Ïš‹òä¯,ù´´T©TZ섵Z-J¥²Ìõ^žºŠOH(×ÌNuB«-jµº@Tè î£ëõztz=­†ìœ;ܼ•Áõ„XÎ;K³¦ÍiÔ 1;ûŦTÓu&³gÏæóÏ?7æWÖ ÜßT¹GQGŒx¤¤$¾üò ºtîŒV«%0(¸ÜS„ÁAAÄ\½JBB‚q0º~ýºÕÙN‡R©´8°{sgÏ@Y5j$Ï?ÿgΜa÷ž=,X°‘£FsþÜY|||HHH 55ã½wƒh*kþ¬aÈ÷µë×-Î\T´\e%//¯¿þš?Ž#$ä/A{Çœ™3g”éªÌÛÛ›ëqqÆ™ kÇ`øˆ,\°€®]»P«V-²²² ¯c1lóæÍùâ‹ÏÑëõü²cãÇOà‰3Z Å‘£GŒ³-¥<ù+K>-‰™ÀÀ@Ξ;GãFÌöÿyæ AAÊwiuuäÈZ´hQ­;[k÷É ût:Ÿ}öi‰6úöïKB|Á9^§N$73o±ë÷<òpW‹·Gíìì¬ Â¢éßõ`b!-ÃL ÀÉ“'y衇Œ¿Mý*³ŽÛ ÊÍ\T¯««+yyy,\´¨BvFÀü ÈÈÈ --Ýâ½wÀµmÛ6²³³ycÉ’â"ad­×æ/àÖ­[deeñË/;xò©%æá¹ç‡ræÌ7nL§ŽÌÞ0p`AüåËW——Ç,/ˆ7dH¹òg1£Ç\QÌšMJJ Ì7ï®ËUÖß¿ž–-[š €ÐТšG±~ýú2•ã_ÿêÏܹóHKK·z äææâä䈣“±×®1iòd«a_|q$çÏŸG­V£×ëÑj­wÒOtëÆ?üX®6èææÆ¥K—Ê•?KqÊ“O€¡CŸgüø 9r„¼ü|òòó9|ø0ÆO`øðá:ŸJËÃ?n Ûݤǵ8 ,ÐÖéu <„Áƒ3hÐ ž4ˆgž}†§Ÿyš2`ÀS8ØÙ£7YÐÕ´9J•©Uà)¤œœììäÕJ".þa¬½`Õ‡+©W¯}ûö£CÇNDDTì¥4/¼ðÿY¼˜Ã‡Ð a#zôìI=ŠM×-[ö.õêÕcè°átêô­[µ¶8ñ¿ÿ½Í©S'©ß !›4%zu4/¿4¦Ä< 2˜×æ/ ,¼½ûô¥M›ÖD¯ZeôŸ>mÆç»ÿû?‚CBùáÇ™9c'N(Wþ¬/ðîÒ¥ÄÇÇOˆœ IDATÓ´Yz˜zuëÝu¹ÊÊê5k¬fÆ cõšÊdgÖÌ™¸Ô¬IÓfÍhß¡­Zµ²úJÜeï.eΜ¹‡Ð·o?Ú¶ikÕn÷Ýyîù¡‡„2þV®Xi5lïÞ½9tð 111ejÇc_~™.]5ÛWZþ,Å)O>&ŒÏ3O?ͤɓ  '<,œÉS¦0xð Æ[¡cYR®\¹Â¡C‡èÕ³§ô¸–Ä…NoP&³ú‚oèw°€¢`‰œ½_|õ9«¢W’””D€_‰¯pr¨û¾(q¦pĈ¸ººÈ[o½UìÂmöìÙøûûS«V-ž}öY³§ðìììøðɈˆÀÙÙ™–-[râÄ £Ÿá¿©€0Ýoê_4\YÒ^ºt)ae|Ýõ•+WèׯîîîÔ¬Y“ž={’œœl5üÖ­[iÚ´)ÎÎÎDDD°fÍ3Á?jÔ(<<<ððð`ôèÑäææ+cÑYœ’ò®V«™:u*~~~xyyñ¿ÿý¯ÌuQU°¹ÿ$—/_¦MÛvDFFrðÀ~éõª(/^dàÓOWÚ¢Ó²²téR޵üúïêÌà!ÏѪUËjûúoÂα&Y|‡Ëç_}ÊÐ!#ˆKˆå‹/¾(—íZ.n<¸o,ÌÇ‹qòÿ~§ÉÇj£¿½½=juÁï3fpöìY¢££ÑëõŒ1‚mÛ¶ý/^Ìž={ˆŽŽÆÍ͉'âììÌû…/¶³··gÀ€,Y²wwwÞyç6mÚÄþýû‹¥e)ý¢þ¦¿ËšöÒ¥K­Þ¢5µ×´iSÞ}÷]ÚµkG~~>óçÏ'--O?µ|ÛÉßߟ>ø€ž={’””Ä¢E‹XUx¡7mÚ4Î;ÇêÕ«Ñëõ >œÆóÆo”¹ÜEó>wî\Ž=ʪU«pqqaáÂ…¼ýöÛeª S–¿÷®Í.è¬Öââù¡Ã˜>žFao_ðØkPPP±[ aP£FR‹–yp+CÚeyÌÚÀþýûyä‘GpwwÇÞÞ777³—åå›o¾á矦U«VÔ«WŸ~úÉè—””dVWááá$%%•«|E󞘘X¬þËSUj½º¦wï^ôîÝKz·û€Q£F2jÔH©¡ê‰ Ãë› ¾,ãm‘ÇOζ(,|ú̶ÇÏÏ«W¯g. WÞüýýÙ½{7{TvÚÏ<ó K–,¡[·n¸ººrûöm<==­†oÕªëׯG¯×³uëVFŽI¯^cƒ¯¯¯Y½ÅÄÄàãó×[ŽíììÈÎΦF¤¥¥•©¼111g.þÉãP™È·EAþ45ùùyÅœ®ðv‡J©dÈçxnÈs<÷Üó<ÿÜó<ÿüP£Zè, ‹Kõ†àþÄTòòrÍlÆí'Ÿ|’É“'“O||'N4ó1b8£Fâܹsdgßá?ŽñÌ3O[´eiŸ››þy򻄿w›vIyÉÎÎÆÎN…R©àÂ…óÆ kqŸ}öNž<Á;Y¨Õù¨Õ«ÿû_Lœ8‘øø8âãã˜0aO>ùo£“&MxóÍ%ܼ™ÁÕ«1Œ3ºÄr¤÷,ãÆ#&æ ))ÉLš4±ÌuQ´Ì".Aªõ …åo‹n‹(J”Jeáí¿þ«”*T…·D¦,8BŠw+«ßž0lÏ;wwwê×o@ëÖmèÔ©“™ÿäÉ“yðÁéÙ³'^^Þ :ŒÞ½{[´eiß„ èС#5kºXô/ÿnÓ.)/Ë—/gÆŒx{ûн{ÚµkW¢ž={òôÓÏàííÜ9sY³fµÑoÞ¼yøøxÓ¸q7n‚¿¿sçÎ5ú¿ÿþ{lÜøþþtíú(?üp‰åÖëõÌœ9ƒx€¶mÛѰa#‚‚‚Ê\UåÛ"ò´ˆ Â=İ sÔK/[\pøÅWkõâK$§$òñ'[µciÆÂoê/ø7ëÊû+ÞåùÁÃÊü!áþà£èU6» SÞh"‚ð7Î\ß_°æB¡P2bø (ŠB‘ @¡(XÖ‰bÆÎ6áï§úñ¿…Ê*AÄ… Âß#/,þ†5Qaæ Ÿ¹ürmZ|/«saA3~C¥TšM»[ú6Œ ˆ¸A¸Ÿ¥…µo‹èþ«×D[Œ;ãs86Bg½Shó¿l) â¢àãg2s!ˆ¸A¨Vâ‚?\ðâ #³˜Ì`¼4f¬ñöˆN¯+|±–Þøb-N/ÂBq!‚P å…Å·l*Ã0ó`x‡–ÂðQ½}áBM…¹5(Œqq!ˆ¸A¨ŽÚÂ\äååãééͥˉŒ¨[î§=ôz=—._ÄÇÇ—ÜÜ<¤ž‚ ÕG[˜ßºÐét¤¦¦ Ð+ØõûolÞ²No½¹0³¦¥R‰KMÜj¹‘šš‚ŸŸŸ,êD\‚ Tua.. žžžÔ­[•n•¹#··ÇÓÓSu ".Aª™¶(6ðÛÛÛ\‰iˆ°D\‚ T ”J%:½N¡ÒÐêt¨T*‚ Õ…www®_»†···Ô‡P)¤§¥R»¶ …m®±q!‚pQ)U4iÒ”ûöÒ¦m;¼¼}P*å BÅÐéô¤¦$søÐA¢Z´ÀÁÁQÄ… BuC©Râï@ã&M8þÇ12oÝB«ÓIÅ«*nîî4nÒ/OOœœD\‚ T7 vöÔ©S‡ÀÀ@4­ñce‚P!ÁªPbç`““³ÍæQÄ… ÂßqÅigO ;{©¡z ©AAD\‚ ‚ âBA‚ ‚ ".AAøg‘§E„JC§Õ¢Ñj >¢ ‚ Ü T*%*•íá".„JA­VÇŸ§O‘‘‘!"‚pP*•¸¹ºQ¿AB°··ÍÇ›E\wN«%%9™cÇŽÒ¹sgBÃ#lúƒ:‚ U­VKÌå‹ü¾k*;!!¡(m°¿qaÃxz|ä(-5Åâï²Æ»×h´ZN?N—G%<*;{öïÙƒ¯¯/Î5jÚ\>mnA§§—·qpªz=éé„„„I]‚ ü ‡póVjµÆ&ó'36Ìß5óPèt:T*zYÌ)‚`Æþ½¿Ó®}'ŠÊû®Z­Îf¿SS%E]¹òC<½¼ñöñ¥AÃFLš4™Û·oý ³_}õ5­Û´Å×ÏŸö:²wï^3;«VEÕ¼~þ´ïБuëÖ›9±4“RtŸ^¯gùò´jÕ?ÿš6‹âÝeËÊ4Ð~ñÅ—<òHgiܤ)Ÿ­][bÚëÖ­£}‡ŽøÒ,ª9~¸ª”‰…ŠåOf‘A„j#.rrrØ·wqׯ1göl>[»–™³fW‹öóÛ¯;Y³:šóçÏ3aÂD£ßêÕ«™9k7æôéSlØð#6l´˜^ijóý>`î¼y´m׎˜+—4èY,XÈò+JŒ½šñ&À‰ÇÙõÛoœ9s¦ÔòoÞ²•6ðçéSDEE1kölÖ¬YSéùA„j#.&MšÈ<€££#O?=€íÛ· 7sÆ jÖ¬I·nݸk6û°hÑB¼<=ñòôdÑ¢…–+IYr5}ôÑGL2gggFP‰beÁà¾ø?‹ñööÆÓÓƒÿ¾þz©å_0>žžxxx0þk¶V¬¬ôü¥¥¦T©[3‚ ‚mPåÖ\ì?p€Å‹sêôiîܹcœÚOO/þnãsÀ¦·®ÇÅdÜ\¡<%$$Ъu³ýׯǕ/>>€r¦ø×v`Áv\||¥ç¯¼èõúj»æâõ×_çðáÃ|ÿý÷U*ßýû÷§]»vLŸ>]zCA¸Ç”Ö?^ºt‰ÈÈH™¹ø'1âö8ÀªU’˜O|Üõ2´¢DEBB‚É`{ÝbX­V‹NW°h&11±˜``çΞ1^í§¥¦’œTb ñ®YI×qq ƒ¨0ˆŒ’Ò)oþªÒ¶«˜Ö¾sçË–-cÉ’%U®Ìo¼ñK—.%''G€ üƒ|üñÇ4nܘ?þXÄÅ?V«ÀÕÕ•¼¼<.ZT!;£Gܘ¿`¤¥¥3gÎÜbáÂBCضmÙÙÙ¼aa5²ÀÖkópëÖ-²²²øå—<ùÔ€ó0fôfÏšMJJ Ì7¯Ô¼Ï{õUÒÒÒIOOçÕW_+ÈCá­KT4•µ ÓÎή˜³E4šŠ=Òµ~ýz:vìhvÅQUÊ\¯^=Úµkdž ¤w„PXŒ7ŽfÍš1nܸûB`ØìmKƒZZj «>\ÉŒ™³èÛ·þþþL˜0¾Bö_xá´ZËW¬ AÃF„††2~Ü8¶nÛfövÉeËÞeê+Ó:l8ALž<™µk?7¼GÄÉÙ‰5kÖP¿ACiÛ¶ /¿4¦Ä<¼øâ 8;;MÓfQxzz2}Ú´RóÞý‰nôèÙ“ØØX|||X¸`/¾ø‚uqQÁüUk3HjµºLáª"?ýô}ûö-V¦ªRæ§žzŠ72`Àéåáb©øä“O˜9s&¿ýö-[¶äèÑ£ôêÕ €¡C‡ÊÌEea:m_Ô<üðÃìß·—䤜8þÇ +¶ðÐÒBDKûFɉãp#1ƒöÓ®][ÂÃÃa:tèÀþ}{Iº‘ÈÑ£G4èY‹¶žî9~ßµ‹Ä„x®Æ\aÝ×_Ó¹sçRË;xð víúÄ„xNŸ:É!ƒ­æÙðûé§ŸæàýÜHLàä‰ã¼TD$TVþîõ‚N{{{Þ}÷]ÂÃÃqpp &&†þýûS»vm\\\èÕ«ÉÉÉfqV­ZEdd$5jÔ U«Vœ8qÂl@Ÿ:u*þþþx{{óÎ;ïýÊbÛÀÖ­[iÖ¬5jÔ 22Ò¸(ÖGŽáÁ´É2kµZfÏžM@@®®® 4Èì±m€víÚqèÐ!éùáo&77—5kÖ°yófZ¶l @Ë–-Ù¼y3kÖ¬!77WÄEUäù¡Ã8qâjµšØØk̘9€É“&J«ÿ›8tè‡"??€¾}û2~üxˆ§^½z¼òÊ+fqvíÚÅ®]»HII¡_¿~Œ=Úè·`ÁΜ9Ãáǹxñ"qq-Z-‹mÆ ãÕW_%##ƒ;wràÀ«eHJJÂÏÏÏ&Ëüßÿþ—cÇŽqèÐ!âããqrrbfa;7dq-‘ ÷'''vïÞMóæÍÍö7oޜݻwãääTe˦(t†m% ÷ÒèÜe¬ =-õ¾>°7þÄ;K—ræÌœœœhÚ´)£G¤GÒêËA~^߬ûš±&¾½Z/ŠZ­ÆÞÞžØØX¬ÚÎÎÎ&22Ò¸ðÖÞÞž¤¤$<<<ŒþžžžÆ‰ááálß¾ºuë–šoK¶ ·2êÔ©ÃÔ©SéÓ§A&OY¢V­Z¤§§›•ÓVÊÉæÍ›©W¯žQµlÙÒL€¨Õj<==ÉÌÌ”Æ,÷€ƒû÷Ю}§J¿5ºü½wéݧnîµïÊN|Üu¢W­â½å+7y@pÈ2 ]šÉvf¡Nax  t€ªùë¿{÷îEïÞ½¤åWµFmÑïNÖí"‚¤`ºÏËÓø pààAæÎ™Ë‰“'¸s'»@õ*fa\jÖ0þ¶S)Ñh4Æß‰‰‰ø›…/mÃöŸ¯å¿o¼ÁüùóqsseÉKèÑ£»Å²ùùùså aa¡6Wæøøx5jd~EQÄvLÌUüü|-Æ¡2/ĪÏ9¦”Ã-TzôèôÅPæýC†<ÇÈQ#¹pá™™·HHˆG_JÓ}~~~\‰‰±˜^yl7oÑ‚uëÖqõj o¾ùcdzhS§×Ó¼y :d“eöóóãüùsܾit™™·ÌÂz½Fc± z½žîÝŸàûï¿·É2>œqãÆsåÊÔj5§OŸfèСf¶Ö¯_O÷îOX-Ÿ8qâîÎýÕGšïwttäù矣_¿~;v ½^ÏÑ£GéׯÏ?ÿŽŽŽe²+âB¸ÿç.îR\¼ÿþûÌœ9 ??zôèIÛ¶mË5ÐNŸ>¨GûöíiÒ¤)AAA²Ý£G ŒŸŸ?óæÍ#:z•Õ¼OŸ>8p€Ë—/Û\™'MšÈƒ¶£W¯Þøúú1bÄzõêeô¿té¤gÏ^2ˆ÷7‹ ½^ÏàÁƒ™?>ݺ=ÁC=ÌOtgþüù <¸Ìvm‘j½ S¨¬ûˆ :_=Æø„-°xñbÜÝÝyùå—ïyZÿûß;9r„/¿ü¢J»gŸDëÖ­™$OH Â=ãôÉã´k߉¬"ë°LùüóÏ™8qK—¾ÃàÁƒËd÷ÓÖÈ‚N¡úܱLÇŽx饗îyZ†Á¹ª½ì‹/>¯’ù„ªÙGZ?Ï ă>H:uî‹óQÄ…P™§ŽÍœuëÖ#++‹gžyFNAl^\@Ácå÷K%âB¨ÄÇv®€/\8_æZÁÄÅý„ˆ ¡2OÈAD\ˆ¸*ñÄÑéÑ[xC§ ‚@µêE\•‚R©D§×ÉÌ… Bê=Рҟ¾Ôêtf_ðq!Ü(¸»»sýÚ5¼½½¥>Aî1éi©Ô®íBa›¯«q!Ü5*¥Š&Mšr`ß^Ú´m‡—·J¥B*F¡’Ñéô¤¦$søÐA¢Z´ÀÁÁQÄ…p¢T)ñ÷ q“&ÿã™·n¡•µ‚ •1§RáæîNã&ñòôÄÉÙ6?Ë.âB¸k vöÔ©S‡ÀÀ@4-z½ˆ A„{rA§Pbç`““³ÍæQÄ…PyŠÚΞvöR‚ Õ]I‚ ‚ âBA‚ ‚ ˆ¸AAq!‚ Â?‹M=-òÓë刂 Õ‚^}û›ý޽z•£G’’Rb<•J…‡§'-[´$4,LÄEYxnø‹ÒâA„ûšÏ>Š6û˜Àþý{yô±' E¥R¡×|¯IZS°­×¡Õh¹z5†}{÷`ïè@€€ˆ‹²ŸŸ'-OA¨6lÛ¼™Î]º^§:­FƒN§C§Ó¡×ëÈËËûë·N‡ááálÛ¼™a#^°¹òÈš AAø‡Qk44lܤ\q6j„Z£±ÉòØäÌ…|¶[A¨NèõzÐjµeŽ£RÙÙìx)âB¨r=|ví;¡VçKeÒî„ûNÇW_}EÿþýªT¾móÛ"".„»l'ñññtéú(¿ü¼àà`©+Aú'¡J ‹±ãƱvíZ~ß½›·ßzSÄÅÝ»Uûä­QÓ…ì;Yrfüƒídò”©üïí· 2†“ã"TµþIÚlõ/˾}û?~7þÄ”)SyóÍ%(D\Tðä­$;5kºp§Œ'fyÂþe*VÇ_}õ¥Å0z 'ðàÁƒiÚ´)3fÌJlîܾWéUvŸ'T.cÇŽåäÉ“üºs'îînŒ}y,O>ù$Ó¦MçÍ%oˆ¸¨Œ+ƒ3gÎ0gÎ\öîÝ @‡X¸p5*ÑNVÖí2_e”'¬­]ÝÈd..µ¬[kqf̘IË–­˜jéÒ¥ÅlMÓt_~~>3fÌ$4,œÀ `Þ]¶¬Ä¶eº““ÃËcÇáˆ@ cÇ#''§Ì}¢¸Š·§û›¿þöO=5 Øyê©üúÛofêÈá#ìþýwnÝÌ(v²/\´ˆ[™·8}úöïcßþýfþE·wïÞÍöíÛ¹~-–^½z1nüø¿Ò0—^Õ˗¹|é"‘u#™1s–ˆ‹*$.Þ|ë-þøã8»wÿÎåKqrrbîÜyfaýõW¶lÙÌõk±<õÔ“üëßO²mÛv6nÜ@Üõkôë×qã'”˦µv•yë&™·n’yë¦ç*..,õG¥õ -"55•S§N²oï~Ûõ»Õ>ÊÒ¾ÿüçuΜ=Ëž=»9}ê$ñññ%¶-Ó¸ .$11‘ããcG¹~=Ž…‹•¹OW9ââ~ŠBgØVªq/Î]öÁ ÒÓRÿÖÌüôãzžþ"·3o÷Õöð$%9 ;;ó;8_?c]ÝÜ9îþþ~Æ0®nîÆ«~ƒlݲ…°Â¼\¹r…¨æ-Œþ¦a]Ý܉½CíÚµÈÉÉ!0(Øj}äääШq®\¾TÌ–Pùœ<ñíÚw*¶ŠÞÕÍÝbxKǸQã&ü°þ{êÖ­ @rr2í;täÒŠưWc®àááa<ƾ~þÅö™¶‹²Ø,©]I»©šíÎRc©?*­ß¨ß ›7m2Þê½té-Z¶²Ø~-¥Ù AC6nÜ@ddd‰y³´ïúõÙ¼iÆ´{õî͹³g+Ô' ¥³þ»oÌ>\öáÊL›1Ëìß%½þÛ°ýùçk5zÌ]å%>î:Ñ«VñÞò•›€< ¸d….Íd;³Ð?§0¼Ð: × Ûè·EþzIMíÚµ‰Çßßß,Lbb"fa==Í›ÚJJJÆ×××øÛÏϯXZ¦Û5kÖ4þV©Th4ãïC‡³`þNž:Evvv2S(¬Úî};1š’\b8Ãvbb"-[µ6WÚEŽ¡‹‹‹Y°´Ï´]”ÅfIíJÚMÕmw–üŠöG¥õIIÉøûû”ØGÝw#)‰€€«ù+)nrrŠYÜ€€’“SÊÕv…»gÉÿsߔſŸyè¡N|ûÝwŒ;Ö,Ì·ß}ÇCu*6]iÍ–··7ׯ_'44€k×®‹SV[#F¼À‚ùóéÒ¥3µjÕ"++‹:‘¥Æî];)k½ü}}}زys1ÑZÖ6p¯lJ»©ší®,Dz´~ÃÇÇ‡ØØXÂÃÈ5³cggGvv6ÎÎΤgdi¾\½zÕ8ûPž¶ëíím–öÕ«WñòòªÐù TŒ@?š4m†½ƒƒñb¦,>xÀ&Ëcók.¦N™Ê,ç“O?%33“ÌÌL>ýì3>ø`9S&O.óýÈþýú1wÞ«¤¥¥‘––ÆÜ¹óÌü­m[Ú—›“ƒ££ŽŽŽÄÆÆ2yò”R㋳­5Ï?ÿ<“§L!&&µZÍ™3gxñÅ‘en÷¦››/^’c|Ÿ¬¹(ê_Z¿Ñ¿æÎGjj*)))Ìž3ÇÌ¿Q£†¼ÿÁdgg“ÀÔ©SÍüÀŒ™³ˆOàæÍ›Ì™3·Ä¶e·_߾̞3‡””RRR˜5{ýûõ+÷ù NtVqQ‡ï¾ý†-[¶Ð¤i3š4mƦM›øö›uÔ©S§ÌúôiÔ¬Yƒ¨æ-èØé!Z¶l½½}…ÄÅ;ï¼ÃÜy¯N¿þÿ¢u›Ö".lD\øøús–ŽË¸±ciÓ¦ ÿú÷“„†…3jôzôè~Wâânm¾4f =þ¸YžÅÝ?⢴~cÆôi¸¹»Ñ¼EKzøÚ·ooæÿö[o³eË""ëÒ³Wo:vèhÙ]Õ IDATæ?eÊdêÖ­Ë#;ÓºuKl[¦qgΜ·—7mÚ¶£MÛvøùú2cÆt".*ŒM.èLNºqÏÓºxéÏ>;ˆÃ‡Ê|\ãâ…s´k߉´Ô© AÚP%Ùºi£Ù‚Ο~\_áÛ"¦v*BµYÐy¯Tݼy¯2eÊdòòòxõÕ×èþÄrϰ #ÇNv'¶IµAÁA<ؾyyyt{üq^yeªtÒÉ ‚´;AqQq^1‚FŒŽB:yAv'".á/ÂëD’t#Q*Bv'6ŠRª@A„ÊDf.AA¸¿ÅÅ7_®•£"‚ ".*Ï‘£"‚ Ü×|öQô}]>Ys!‚ ‚ˆ AAD\‚ ‚ âBAAÄÅ](• Ç_¤ ‚ˆ AŽ_¤= ".ä¤îaÝ\½zõ8p .\ø[Žq||¼Áf0mÒ' ".¡:ÕøøxŽ=Jûöí;v¬TŠ ‚ˆ‹âW‰Ë—/§Y³fDFF2yòdòóóÍü£££iÕªAAAäååñÊ+¯P¿~}êׯϴiÓÈËË3ÆÉÏÏgÒ¤IDFFÅŠ+J½25ݧÑhxíµ×hÒ¤ 4àÃ?4 c¸z6°sçNºtéBhh(mÛ¶åË/¿”Öw©U«cÆŒ1Î\hµZ^ýuš6mJDDcÆŒ!++ËbÜØØX†J½zõgðàÁ¤¦¦–xŒM·Kk¬]»–¶mÛÊã?Οþ)­Šb‹}”i;•>Iqa…°cÇ8@JJ o¾ù¦™ÿ±cÇØ¶mqqq¼ñÆܸqƒ={ö°{÷nâããY²d‰1ü’%KHKKãÀüüóÏìÝ»·\ùyûí·¹páÛ·oçàÁƒ$&&¯šM¯ž L˜0)S¦pñâE¾ÿþ{Ž;&­ïsûöm–/_N£Fxï½÷8yò$Û¶mãĉ899±xñb‹q‡Ê‹/¾ÈÉ“'9yò$ÌŸ?¿ÄclJií`ß¾}üøãœ={–îÝ»3mÚ49hU[ë£ HŸ$ˆ¸( àåå…—— ,`ýúõfþ¯½öžžžÆß?üðƒ1Ž··7 .ä‡~0ú¯_¿ÞÌÁ‚åÊÏ·ß~Ë¢E‹ð÷÷ÇÕÕ•×^{­ÄðNNN$''“––F`` o½õ–´¾{xHýúõùôÓOY¹r%_}õ•ñ˜¹¸¸0kÖ,¶lÙbÑÆ¯¿þJ‡prr¢V­Z̘1ƒ]»v•9¥µ?€×_???jÔ¨ÁèÑ£9}ú´¼*Œ­õQ¥!}’ â6ÛNII1ó÷õõ5ûššJHHˆñwHHˆqZ %%Å̦iزœœ\®8ÑÑÑìÚµ‹Ç{ŒöíÛóóÏ?Kë»GÄÇÇǾ}ûˆˆˆ0Ú7nÜࡇ2Ѝ¨(³6aÊ‘#Gèß¿?uëÖ%00ÈÈHÒÓÓËœ‡ÒÚ€»»»qÛÙÙF#¯ ck}”ôI‚ˆ‹2pýúuãv\\^^^%†÷òò2‹síÚ5³«ooo3Óm;;;rrrŒ¿322Ìü}||¸víZ™óÅ'Ÿ|©S§X´h‘Lßc ¡¡¡¼÷Þ{Ìš5‹¬¬,|||8zô¨qzØ B,1jÔ(† ƱcLj‹‹ãܹsèõú2§_Zûî?l­’>IqQ^{í5ÒÒÒHKKãÕW_¥ÿþ%†ïÓ§óæÍ#55•ÔÔTæÍ›Gß¾}þýúõ3Ú4ø›Ò°aCV®\INN7nÜ`úôéfþO=õsæÌ!11‘ÌÌL³Û"®®®\¾|Ù,üK/½Ä… Ðh4èõz¹Jý›ð÷÷§uëÖüðà 2„W^y…ØØX4 çÎc̘1ãåææâè舣£#×®]+ÖñZ:ÆåiÂý‡­õQ¥µWé“@›6mèÒ¥ mÛ¶¥víÚ¼òÊ+%†Ÿ1cÞÞÞtèÐ:àëëkvòM›6 777Ú´iC×®]iß¾½Yü7ß|“­[·R¿~}úöíKÇŽÿŸ½{kêÊ÷ÇÿFðn”Km”‹‰«ˆ8RÐN9¢“êˆÌœØ™V´¢‚ú›Ó2 UÁ–Rtèô)–*zÚŽr´ÅC­Îè|±ö@´ÊhŠ%CQ‡* ¢\ ä÷G!e—ûU.ï×óì‡d¯}YÙ듵?Y{“ÊCCC1cÆ ,^¼ ,Ü… ™L&˜·téRlذR©111HHH`ôõ“—^z ÉÉÉØºu+<<<°jÕ*H$lÙ²2™¬Õuâãã ©T ¹\wwwAykmÜ•ø£¡g õQÅ+û$êK&SÓãL·…l®y÷½÷Q¦Óöke>K;‰µëƒZÌ‹Åü‚""°ØGQWùà–ûÎ.s\1Òܦ¦¦ÞÎW—³Û麇’’xà,€ZÕ¨PÞ8éš=®l,¯n\^ @๠""¢ÁÉ ¿ä‚ÃDÄ>ŠˆÉ1¹ """brADDDL.ˆˆˆˆÉ“ """brADDDL.ˆˆˆˆ˜\5ÓÖu¶œˆˆ˜\ð$BDDÔ‡ÌËI¿?¾^—_á;t“C¶-õwìõ4æøK«Ää‚hhÞ³c¦ÇDÃÝ »,"‹qôèQxzzÂÞÞK–,ÁÍ›7QQQÜ»wO°|EE\]]qïÞ=ÔÖÖ",, ÎÎÎpvvFxx8jkk[ýô¡×ëÌœ94–Õ××#66sæÌD"App0ªªªŒå/^„¯¯/ìííáéé‰cÇŽ1Ò£ÂÂBÂÉÉ ŽŽŽX½z5´Z­`™ÄÄD¸ººB*•âÕW_E]]]«Ûê¨í‰º{mõ3M}‘X,ôK­ü´üСC˜?>¦NÊþŠ˜\tEVVÒÒÒ——™L†ððpLœ8Ë–-Crr²`Ùääd`„ ˆ‹‹CII 233‘‘‘Fƒ½{÷¶ºøøxäççãÂ… ¸|ù2Š‹‹e P(8þýôSäää0Ò£ÀÀ@A¡P@¡P@"‘ ::Z°Lvv6ÒÓÓ‘ÒÒRìÛ·¯ÕmuÔöD]‰½¶ú™¦QFÓ呜œœ?jµšý=6&SÓãL·…l®y÷½÷Q¦Óöke>K;‰µëƒZÍÌ›Þ`b±7oÞÄĉÕÕÕpvvFaa! ðâ‹/"++ fffÐëõðññAjj*Äb1æÍ›‡ÔÔT8::nß¾ ¹\Žk×®µØÏüùó‘’’‚éÓ§·¨OSv/‘H¥¥¥ðóóÃõë×îîî Á/~ñ L™2…Qö˜F¸Úꔫ««áéé …Ba\öË/¿„ƒƒàÎ;Ëå¸zõj‹muÔö4|ãí§Z‹¿ŸÆ^{ýLk1ÜÑ<±XŒœœØÚÚ²¿àŽ|pËýç?—9®inSSÓNoç«ËÙ‚ít‡F]„CIIHH>ãÇGtt4üüüønzL®^½Š˜˜äææâáÇ-Ú ¦M›&x\ZZÚ­¶§á«µd¢£Øk¯Ÿé®æ‰û+z\†Ü¿¢nذ‡>|›7o6–YYY¡¨¨Èø\¥RaòäÉ­nÇÆÆ*•ªÍ²k×®‡,5qæÎ‹>ú_ý5Þxã „‡‡3Ò£M›6aݺuÈÉÉZ­†R©„Á`,Ó<.Ôj5¬¬¬ºÕöD]‰½öú™Ö˜™™¡ººÚø¼¼¼¼ÃuØ_“‹^ðì³Ï¢ªª ~ø!ÆŒƒÙ³gËV¬XÈÈHhµZhµZDFFÂßß¿ÕíÈårìÚµ ÅÅŨ¬¬DTT”±lÍš5 Caa!ôz=”J%‚ƒƒå!!!ÈÏχ^¯‡Á`0ެÐãQSS XXX@¥RµÚyFEEA§ÓA§Óa÷îÝh}˜±£¶'êJìµ×ÏŒ?·nÝ,ÿôÓOãÀ¨®®FII ¶oßÞaØ_“‹^½ˆŒŒlÑéGDDÀÚÚÞÞÞðöö†­­m›oÎÐÐP̘1‹/Æ‚ ×T·nÝ ¬Zµ ‰[¶lL&3–/]º6l€T*ELL iQ||<¢££!•J!—ËáîîÞbøúúÂÓÓ"‘aaa­n«£¶'êJìµ×ÏC&“ æíÛ·ûÛßàìì øøøtXöWô8 Š:‰ˆˆ†’¡~C'¿þ›ˆˆˆz“ """brADDDL.ˆˆˆˆÉ“ """brADDDL.ˆˆˆˆ˜\“ """brADDDL.ˆ†•æ?EDDL.xÒ!""àÌËI_£Ñôù~újÍëß”À˜˜˜`ìØ±°³³ÃÏþslÚ´ “'OfDö‚‚‚ÄÅÅ!++ <ÀÓO?-[¶`Ù²e<8ÔoLzÚŸôW¿ÇþŠúG.FµZœœ¼ýöÛ¨©©ŸŸŠŠŠxpzèÎ;ËåX¸p!233‘ŸŸ˜˜¤¥¥ñàPŸ¿¯›O쯈ÉÅ û„pôèQxzzÂÞÞK–,ÁÍ›7QQQÜ»wO°|EE\]]qïÞ=ÔÖÖ",, ÎÎÎpvvFxx8jkk[ýô¡×ëÌœ94–Õ××#66sæÌD"App0ªªªºüZFÙ³gcÏž=øío‹}ûö1"{(>>!!!X»v-D"ÌÍÍáææ†¤¤$Ár­ÅP“ÂÂBÂÉÉ ŽŽŽX½z5´Z­ NŽ9///888À××W®\AJJ |||ŒÛT*•‚uáêê ©TŠW_}uuul°!®£Xj«Ÿiê‹Äb± _jm„ä§å‡Âüùó1uêTöWÄä¢+²²²––†¼¼<Èd2„‡‡câĉX¶l’““Ë&''# &L@\\JJJ™™‰ŒŒ h4ìÝ»·Í“T~~>.\¸€Ë—/£¸¸ØX–…BóçÏãÆ°´´DLLL^Ó‹/¾ˆŒŒ FdeffÂßß¿[1Ô$00AAAP(P(H$ˆŽŽ¬Ÿ‘‘ÔÔTäååaåÊ•X³f ÒÓÓ‘’’¥R‰åË—#,,L°Nvv6ÒÓÓ‘ÒÒRvÎÃ@G±ÔV?Ó4òÑQœœœ?jµšý=6&SÓãL·…l®y÷½÷Q¦Óöke>K;‰µëƒZÍÌ›_¼yó&&Nœ¨®®†³³3 QPP€_|YYY033ƒ^¯‡RSS!‹1oÞ<¤¦¦ÂÑÑpûömÈår\»v­Å~æÏŸ””LŸ>½E}<==qìØ1H$@ii)üüüpýúõ6G[š×¿µÎB¯×C"‘ °°QÙööö¸uëÌÌÌÚýj+†ZS]] OOO( ãú¹¹¹‰DÆr©TÚb^ómŠÅb|ùå—pppðã囫W¯²Ñ†€ÎÞsñÓXj¯Ÿi­¯èhžX,FNNlmmÙ_ pG>8„åþ‚óŸËWŒ47‡©©i§·óÕålÁvºC£.¡¤$$$8  @5€*”7Nºf+Ë«—רÐÀ ’:ªé¤£F‚^¯H¥R<õÔS8wîV¬X³gÏbþüùÆ7¾V«…q];;;ÁeswïÞ,Û\II -Z$ÌÒLLzôš¾ÿþ{Lš4‰ï¸‰D(++ƒM·b®^½Š˜˜äææâáÇ­¶oSÑ´~kóšo¦M›&x\ZZÊBZ; wKíõ3ÝÕ<±`EË»¡sÆ 8|ø0àðáÃØ¼y³±ÌÊÊJp’J¥jóŽg¨Tª6Ë®]»&¸y«i²»Ž;Ö¢ ®óññÁ™3gz´M›6aݺuÈÉÉZ­†R©„Á`èqݚǞZ­†••lˆë(–ÚëgZcff†êêjãóòòò×aEL.zÁ³Ï>‹ªª*|øá‡3f fÏžm,[±b"##¡Õj¡ÕjÙæõy¹\Ž]»v¡¸¸•••ˆŠŠ2–­Y³aaa(,,„^¯‡R©Dppp—ëZ]]ÜÜ\ìÞ½ÇÇþðFd…††bÿþýHNNFEEêêêpýúulܸ±ÓÛ¨©©……,,, R©÷côDTTt:t:vïÞ€€6Ø×Q,µ×ÏŒ?·nÝ,ÿôÓOãÀ¨®®FII ¶oßÞaØ_“‹^½ˆŒŒlñŠˆˆ€µµ5¼½½áíí [[Û6ßœ¡¡¡˜1c/^Œ ®©nݺXµj$ ¶lÙ™LÖéú‰ÅbL:®®®xå•W`nnŽ .†Í©{‘’’‚K—.ÁËË NNNعsg§nòlèèhH¥RÈår¸»»÷JÝ<<<àëë OOOˆD¢7|ÒÐÓQ,µ×ÏC&“ æíÛ·ûÛßàìì øøøtXöWô8 Š:‰»Çõ…HD40 õ:ù%ZDDDÔ«˜\“ ¢Á†—DˆˆÉ“ """brADDDL.ˆˆˆˆ˜\“ """brADDDÄ䂈ˆˆ˜\õHó‚"""&DDDÄä¢w ((³fÍ‚ƒƒžþyœ={vÀ~šíÌöš/#‹?mìììŒ%K–àÍ7ß„N§c”°X!bÅ>І@rqçÎÈår,\¸™™™ÈÏÏGLL ÒÒÒ†Tch4¨Õjäääàí·ßFMM üüüPTTÄHe¬ãŽ}1¹èMñññ ÁÚµk!‰`nn777$%%—©­­EXXœáììŒððpÔÖÖ ²î£GÂÓÓöööX²d nÞ¼)ÈΛ2ó&……… „““±zõjhµZc¹^¯GTT\\\0sæLFj/Æ €6c¡3í.‹qäÈxyyÁÁÁ¾¾¾¸rå RRRàããcܦR©¬“˜˜WWWH¥R¼úꫨ««cƒ £¸cEL.˜ÌÌLøûû·»L\\JJJ™™‰ŒŒ h4ìÝ»W°LVVÒÒÒ——™L†ððpc6Þô·ù¯W"(( … …‰ÑÑÑ‚%??.\ÀåË—Q\\ÜîöºãÅ_DFF#µc¥½XèL»@FFRSS‘——‡•+WbÍš5HOOGJJ ”J%–/_ް°0Á:ÙÙÙHOOGvv6JKKÙ!³¸cEÉIãÔôxÓm!›kÞ}ï}”é´ýZ™ÏÒNbíú óíííqëÖ-˜™™µ¹î¼yóšš GGGÀíÛ·!—ËqíÚ5c†~óæMLœ8P]] gggË;z“UWWÃÓÓ …0þ|¤¤¤`úôé-–íÌöš/ÓÖòz½‰ÄXOj_gb¥£Xè¨ÝÅb1rss!‰ŒåR©´Å¼ŸÆ×—_~ ?£_½z•6LâŽ}5wäƒCXî 8ÿ¹ÌqÅHss˜ššvz;_]Îl§;4ê"JJBBâ³jTx @yã¤kö¸²±¼ºqy=€z ƒfäB$¡¬¬¬Ýe´Z-ìììŒÏíììÃŒoZ5jôz}»Û¼zõ*0cÆ ˆÅbH¥RA=îÞ½+Øg_øþûï1iÒ$¾{1V:Š…ŽÚ½i?Í×omÞOãkÚ´i‚Ç¥¥¥l°awì£h8É…Μ9Óî2VVV‚›ŠT*&OžÜ£ýnÚ´ ëÖ­CNNÔj5”J% ƒ±ÜÆÆ*•ªO_û±cǰhÑ"Fj/ÆJOÛ½»šÇ§Z­†••lÅû(br1À„††bÿþýHNNFEEêêêpýúulܸѸ̊+ ­V ­V‹ÈÈÈN]{o2~üxܺuK0¯¦¦°°°€J¥\—¹\Ž]»v¡¸¸•••ˆŠŠjw{U]]ÜÜ\ìÞ½ÇÇþðFj/ÆJG:j÷îŠŠŠ‚N§ƒN§ÃîÝ»ÀFqÇ>Š˜\ 0ŽŽŽHIIÁ¥K—àåå'''ìܹSðÆŒˆˆ€µµ5¼½½áíí [[[lß¾½Óû†L&Ü9èèhH¥RÈår¸»»·èPf̘ŋcÁ‚‚u[Û^Gšþ‡ÜÕÕ¯¼ò ÌÍÍqáÂÁp:õІ“AqC'Ñ`×™›çˆhøà DDDD]À䂈ˆˆ˜\ 6¼$BDL.ˆˆˆˆ˜\“ """brADDDÄ䂈ˆˆ˜\“ """"&DDDÄ䂨GºòCMDDÄ䂈ˆˆ3³ÁôIÓÄÄcÇŽ…~þóŸcÓ¦M˜ì˜…BóçÏãÆ°´´DLL #cÊÌÌ„¿¿‡Ëeee!-- yyyÉdïT5ÉÈÈ@jj*òòò°råJ¬Y³éééHIIR©ÄòåË&X';;éééÈÎÎFii©à¤CCû(br1ÙÚÚ¢¬¬ÌøüóÏ?‡··7,--1nÜ8DDDà‹/¾hwÇÇo¼)S¦`ìØ±Ø±cþú׿22©òòrLš4©ÃåbccñÄO`ôèÑØ¼y3rss»G{÷îÅ“O>‰Q£F!((UUUxë­·ó …`={öÀÊÊ VVVسgNž<ÉâØGÑpe6˜+ÿý÷ß N$W¯^ELL rssñðáC?Ü`Õž’’,Z´H0¯£uhà‰D(++ƒM»ËMœ8ÑøxÔ¨QÐëõ]Š#‘H$X¿µyÍ· Ó¦M<.--eƒ q죈#ƒÐ±cÇoºM›6aݺuÈÉÉZ­†R©„Á`hw666¸víšq(²é¦,œ|||pæÌ™m£;qÔÍoìS«Õ°²²bƒ q죈ÉÅ Q]]ÜÜ\ìÞ½ÇÇþðcYMM ,,,`aa•J%¸ŽãÇÇ­[·óÖ¬Yƒ°°0B¯×C©T"88˜‘1H…††bÿþýHNNFEEêêêpýúulܸ±ÓÛè(Žº+** ::»wïF@@lbE4ˆ’ ±XŒ©S§ÂÕÕ¯¼ò ÌÍÍqáÂÁPs||<¢££!•J!—Ëáîî.ØFpp0d2™àNì­[·ÂÃëV­‚D"Á–-[ “Ƀ”££#RRRpéÒ%xyyÁÉÉ ;wîìÔMž£îòðð€¯¯/<==!‰ZÜðIƒû(¢™4NMG0ݲ¹æÝ÷ÞG™NÛ¯•ù,í$Ö®b«Ð<ñðË‘ˆ¨É‘a¹€àüç2Ç#ÍÍajjÚéí|u9[°îШ‹p() ‰Î¨P à€Jå“®ÙãÊÆòêÆåõê40 ª‘ """˜\“ ¢Á†—DˆˆÉ“ """brADDDL.ˆˆˆˆ˜\“ """brADDD4¸rˆˆh(H/ƒô‚n¬9Ë™\=~ü"ˆ~õË¥04Po0ÀÐЀz`h0 öQ= ê„ó ²³³äkarADDLèˆû5zÔ7ÐÐÐÐø×€š:= -æOg1`_Ç ¹ç¢  AAA˜5kðüóÏãìÙ³CòMHŒbÜ ¥>ЉÅð3(’‹;wî@.—cáÂ…ÈÌÌD~~>bbb––Æ$Æ 1\t]||¦NÚ©:“‹>‘™™ ÿv—‰‹‹CII 233‘‘‘Fƒ½{÷ –ÉÈÈ@jj*òòò°råJ¬Y³éééHIIR©ÄòåËÖ£u P(pþüyܸq–––ˆ‰‰l3++ iiiÈË˃L&Cxx8€‡5 ‡û0VÚk DPP  $ ¢££{KÙÙÙHOOGvv6JKK±oß>6Ø0Š»¡ÜGuæ=Ó\NNΟ?µZÝé:ÑàcÒ8À7xZl Ùl0 ¶´_§¿üw’¡5vvv†GÚãææf¸}û¶ñù­[· óæÍ3>òÉ' eeeÆç>luž]Öñðð0Ÿß½{×àêê*Øfyyy»û¤îëL¬tÔ?õðáCƒ‹‹KcéÎ;Æç·oß6üìg?cƒ £¸N}Tkï™æKJJËwT§¡è/ÿ$8ÿ­ü鯴†#_>üü;ç« I/28¯2¼sæ¶áí´[†}' q©ù†7OüËðÆ'JCâ¹;†µ‘ÿÓãs¯âzŽa[Èf€Ï¤HpÀ>;XÀÀ|NÄ&À¢1Ñ”S Šÿ‰D(++ƒM›ËhµZØÙÙŸÛÙÙ †åš¶ÓdÔ¨Q­ÎÓëõ=Z§¤¤‹-fo&&‚ç'NlwŸÔ·±ÒQ\½z111ÈÍÍÅÇ[mÃîÄÒ´iÓKKKÙ`Ã(î†rÕ™÷Ls¶¶¶‚ç©ñ²H¯óññÁ™3gÚ]ÆÊÊ EEEÆç*• “'Oî÷ºÚØØàÚµkÆaCFcú£+Ù´iÖ­[‡œœ¨Õj(•J †×­y|ªÕjXYY±Á†QÜ å>ª§ïö›L.‹ÐÐPìß¿ÉÉɨ¨¨@]]®_¿Ž7—Y±b"##¡Õj¡ÕjÙ©kï½mÍš5 Caa!ôz=”J%‚ƒƒ;½þøñãqëÖ-FfÆJGjjj`aa ¨T*Áý=NN‡Ý»w# € 6Œân(÷Q=}Ïô´NÄä¢[‘’’‚K—.ÁËË NNNعs§àkkkx{{ÃÛÛ¶¶¶Ø¾}{¿×uëÖ­ðððÀªU« ‘H°eËÈd²N¯ ™LÆÿéÃXéH||<¢££!•J!—ËáîîÞ+uóðð€¯¯/<==!‰ZܘGC;î†rÕÓ÷LOëDOÓÍœMG0ݲ¹æÝ÷ÞG™NÛ¯•ù,í$Ö®b«ÐÃo($¢æŽ|pËý½|åÝ øÕ/—¢òá£.}Cgvvþüÿ-éQ]4ê"JJBBâ³jTx @yã¤kö¸²±¼ºqy=€z ƒf䂈ˆˆ&DDDÔ«øÃeDý€—Dˆ¨«>=ñq‹yÏ-õugrADD4ýJþ›Vï¹ xY„ˆˆˆzG.ˆˆˆ ^!""¢^ÅË"DDDD8rADD4ñ²õ*^!"""brÑ,ŒíLDDL.x#"öDŒÙ`~¶÷•ʽý+”Íë1nÜ8<ûì³xóÍ71yòänÕúNAAâââ••…àé§ŸÆ–-[°lÙ2êó~ª¯û‡öú¶¦²îö›D½eÀ\h4ãÔÚóÇQ—ÌÌLXXX`ûö팠æÎ;ËåX¸p!233‘ŸŸ˜˜¤¥¥ñàаéR¿IL.•ÚÚZ„……ÁÙÙÎÎÎGmm­àS„X,dð……… „““±zõjhµÚ.ïÛÊÊ {öìÁ_|!øÄpèÐ!ÌŸ?S§NmñiF¯×#** ...˜9s&>!!!X»v-D"ÌÍÍáææ†¤¤$ÁrG…§§'ìíí±dÉܼy³Óq"‹qäÈxyyÁÁÁ¾¾¾¸rå RRRàããcܦR©¬“˜˜WWWH¥R¼úꫨ««cƒ A]í"""ðÉ'Ÿ¶ññÇ#""‚“˜\ô·¸¸8””” 33Ðh4Ø»w¯1Kož­7 DPP  $ ¢££»µ“órrrpþüy¨ÕêVOzùùù¸pá._¾ŒââbcYBB Ο?7nÀÒÒ111ŒÎnÈÌÌ„¿Çÿž••…´´4äååA&“!<<¼Kq’‘‘ÔÔTäååaåÊ•X³f ÒÓÓ‘’’¥R‰åË—#,,L°Nvv6ÒÓÓ‘ÒÒRìÛ· 6Du¥xýõב’’‚3gÎNŸ>'Nà7Þà¤AkÐ~ÏÅ©S§šš +++ãT.—ãüc›ë|þùçÆÇ–––ˆˆˆ€§§g—÷­Óéðúë¯cáÂ…‚ùQQQm^c=qâRRR0eÊã²MŽ?ŽcÇŽËvìØ???ÄÆÆ2B»¨¼¼“&Mêp¹ØØXLœ8°yóf¼óÎ;]Š“½{÷B$‚‚‚‡·ÞzK0/>>^°Îž={ŒñºgÏÈårìܹ“6Ätµ9r$8€+V 77§OŸÆéÓ§afÖv÷Ì›A‰ÉEÑjµ°³³3>·³³ëðÇÕ«WƒÜÜ\<|ø°ÍO½¡Ç‡E‹!..NPnkkÛæºwïÞÔ·¹’’,Z´¨ÃO>Ô1‘H„²²2ØØØ´»\Sb£F‚^¯ïRœ4%Më·6¯ù6`Ú´i‚Ç¥¥¥l°!¤'ýƒµµ5~ýë_ãÏþ3"##ammÝî¾Ú»¡“ˆÉEXYY¡¨¨•JÕîÙ°iÓ&ìÞ½Ï=÷ÆŽ‹ªª*8;;wzŸ=¹ÊÆÆ*• Ó§OoµìÌ™3xâ‰'‘=äããƒ3gÎàå—_îö6z'mi¯jµÚ8ŠACCOú‡o¾ùü1>Œ]»vaéÒ¥ÆX!Œí=+V¬@dd$´Z-´Z-"##×ÚÇ[·n Ö©©©……,,, R©×Ùûš\.Ç®]»P\\ŒÊÊJÁe‘5kÖ ,, ………ÐëõP*•ftvChh(öïßäädTTT ®®ׯ_ÇÆ;½¾Š“¨¨(èt:èt:ìÞ½l0ÂDZmÛ6ìß¿2™ o½õ6mÚ„ššbrÑß"""`mm ooox{{ÃÖÖVð¯_ÁÁÁÉd‚aÂøøxDGGC*•B.—ÃÝݽ_Oz3fÌÀâÅ‹±`ÁA½¶nÝ ¬Zµ ‰[¶lL&ctvƒ££#RRRpéÒ%xyyÁÉÉ ;wîìÔMž}'ðõõ…§§'D"Q‹>ixzíµ×°~ýz,X°àçç‡ÿüÏÿÄŽ;xphÐ2iœš`º-dsÍ»ï½2¶_+óYÚI¬]ÄV¡!§·¿Ôˆ·#ÂrÿG/_y÷~õË¥¨|øÈøe?ümùÃeMó'³@vvþüÿ-éQ]4ê"JJBBâ³jTx @yã¤kö¸²±¼ºqy=€z ƒz䂈ˆˆ&þä:Ñ1ÎÒ õ ¨7†,GŽ€ÁðÃÈEóù&DÃ/‰QG>=s~ȼ&DDDÙØ?€ËWŒ47‡©©i§×ûêrö€|=¼ç‚ˆˆˆ˜\“ """brADDDÄ䂈ˆˆ˜\“ """"&kþcbÄv&""&DDDÄä¢sŸ2ÛšúãÓéíÛ·áææ†ÚÚÚVË+++ñÿñ¸wïàý÷߇Þÿý¿êž‚‚aÖ¬YpppÀóÏ?³gÏòÀP¿÷Q=í;ˆ˜\ôFcœZ{ÞצOŸwww|òÉ'­–9róæÍÄ ÐÐЀ#GŽ ** GECCÀx ÃÉ;w —˱páBdff"??111HKKãÁ¡~ï£zÚw1¹ègµµµ ƒ³³3œnü„Ð4"ðÓÑÂÂBÂÉÉ ŽŽŽX½z5´Zm‡ûÚ¶m<Øâ ÿèÑ#|ôÑG|þùç˜0aÖ¯_‘H„K—.1ÂúY||6ØǾƒ˜\ 2§Nž={`eekkk¼þúë8uêT»ë|þùçðöö†¥¥%Ƈˆˆ|ñÅþòÓk¡À–-[ŒŸvoܸ•+WüýýqãÆ ¨T*FY?*//ǤI“:\.66O<ñFÍ›7#77·Kq²wï^<ùä“5j‚‚‚PUU…·ÞzK0O¡PÖiŠW+++ìÙ³'Oždƒ “Ñ öÄäbÐjµ°³³3>·³³ëðÇÕ«W€3f@,C*•¢¬¬¬Sûóòòˆ#••¸téD"æÎ à‡ë§:Ó§O‡X,ÆôéÓ¡ÓépäÈFY?‰DjÓ‰'5 z½¾Kq"‰ë·6¯ù6`Ú´i‚Ç¥¥¥l°a€}1¹D¬¬¬PTTd|®R©0yòäv×Ù´iÖ­[‡œœ¨Õj(•J †.}ILLlñÉ£¶¶'Nœ@vv¶àf®üãHIIiónqê}>>>8sæL¶ÑÓ8iKóxU«Õ°²²bƒ £Ñ öÄäbX±b"##¡Õj¡Õj)¸Ö>~üxܺuK°NMM ,,,`aa•J%¸ÎÞ~~~(..ÆÿþïÿB§Óá¹çž¤¥¥ÁÍÍMðÉ´i4ÅÕÕ§OŸf¤õ“ÐÐPìß¿ÉÉɨ¨¨@]]®_¿Ž7vz=“¶DEEA§ÓA§Óa÷îÝ`ƒ ì;ˆÉÅ kkkx{{ÃÛÛ¶¶¶Ø¾}»±<882™Lðß"ñññˆŽŽ†T*…\.‡»»{—öibb‚„††ïò~¸ëw¿û]«ë¬]»}ô#­Ÿ8::"%%—.]‚——œœœ°sçÎNÝäÙ[qÒøúúÂÓÓ"‘¨Å Ÿ4t±ï aóSÓãL·…l®y÷½÷Q¦Óöke>K;‰µëƒØ*4äˆÅb~¯ ùà–ûÎ.s\1Òܦ¦¦ÞÎW—³Û麇’’xà,€ZÕ¨PÞ8éš=®l,¯n\^ @๠""¢‰É1¹ lxI„ˆ˜\1¹ """&DDD4ä˜ ´ Eû†­BDDCÚt&ý«7¾f™ˆ¨/E¿4‹ºm÷ÿÜò¯q& <""º†ÃyŽ#DDD<Ï ñäL.ˆˆh'Ãà<7àþ[Ä`x|Ók\ëþùšùš9 މ¨§ç9Ž\ ³á¢ÞÜÿ›¿›ƒQ<Ö×Ó™: ÇKQ¼üFÈn¸'¼,òØzl k›Ë¾öÑ6Ëb]Û-ïj£7¯GM]=¾ýî>Ò²5xP£ïVýºcŒ¥þkåSˆ;ñ ôõ?Ös¯Ž^ü÷jj‚ùÓøó© êÐÖ1éL [·ÀF™{ÿW¸ï&–æ¦Ø$“"鯨®«ïõvé ë X:o Ÿ ‹‘#P\V/rï"÷ß÷˜\PŸ$ MƇgŸ}o¾ù&&OžÜæ:ÝI,šï§+4 ‡¬¬,5E¥ñ°¶¾OÚ¥³¬Æ[ èR¤_/Aê—jÔéë1eÒ(<;Û_ß¹×/u á§)YÐjµØ³g¶oߎÇ÷É>:ùøiÙ;w —ËñÊ+¯`ïÞ½3f nÞ¼‰÷ߟÉÅ9Ï1¹]S¹™éø{‰1Çq"@q»iÙèë·~®1€í\LgŽžS!™2#F˜àVñ}¤üŸ UÍFÚÛSÙýêG8­Æk/Ì2΋[?Ÿ]Ö`álŒ3\GÜú¹Æ}›Ž0ÌýIÌ“ˆ0b„ .^ÿÿ—{0ÂÄKöÜ&Ã|ä|£ªDj¦ µZÔáê·epwš År€õh˜˜üð÷Õ'Ï- ƒ±m“¦Äàçsl0~ôH|_Qƒÿ§ÂweÕ-öýù¼ôœCã¶œo:Â^ÎVHú[DcG¶yŒÛ«CoY<×—ßãyZã<ÕÝ8zñN‹d¨­×ÜQœÄ­Ÿ‹“Yj<ëbƒ cFB{¯ŸfÁj¼žsµ…h¬9¾¯¨Á'_¢¤¼Æ¸Î¹¯¾Ã"X˜À;8™UÔê( ^VVVسgÜÝÝ'û¨¨(ùä“^«Off&"##Ù0í ¶cp!§¶ca0oÆ$\¿]}ƒ¡EÐÆëú4«¡V߀K_ß…xò¨6ÃÅ%xÖÅV0o‘‹ .*¾ïñ1îi´…)î7kC7^sg^ÉÌ"”?¨C¾ÿw³#G õKἩV£…ñÑ,^Ó²Õp“LêÓcÁ©ï¦¶èt:ìÞ½ .ÌŠŠjõŒ‘#GâÀxóÍ7‹ØØX8pff½÷¹¯¼¼“&Mâ}€ç8rÑÏéë;U>v”¾/¯6Ž ””Wcœ¥™`ýŸnËÑv,~¹`*¦Z†¹Ùc#··Nsû^vðà ÿRWâã/þ-X^WYÓf}Ç6CIy5Z†Õ„Ñ#þŸO·¾¶ê’WŠŸsÀ_—ÀÒÜßUb”¹ †üL: ù·Û|M­móÞƒ:Aùˆ&mî[Yt¿øÙ“p°o¿»çiãñ ZÛÅ÷{å÷ÔƒZ=,ÌLPùPßîrí½æÎ¼†{j[¼žŸÎûéql¯ßWTcÜ(³>=Ôšn¶7n-Z„¸¸8A¹­­m›ëZ[[ã׿þ5þüç?#22ÖÖÖ½Z7‘H„²²2ØØØ°¡Òyn$“‹þ.êDùý‡zˆÆýp½&µÀýj½`ýŸn+Ðo:NfAYt5uõ°07EÜúyí®ÓÜï|Õåº7Í«|ø“Çšãî½– HåÃGxûdžà„×µö`<žšŒÂ»U0 ø÷Ý*øÌ²Á£ú†ÊÛ¨W{uìl;üýŸßÁwîÈ×Tâ¹9Oàÿý³Ø¸|OqOå«+1wº_|ý}·Ûª»¯¡£yÍãU4Ö÷«ñ¿V†ˆžü[é7ß|ƒ?þ‡Æ®]»°téR888ôZÝ|||pæÌ¼üòËl¨Arž F ăÞÖÔ¼<§@‡_=c‡±–fki†_yÛ!§@g,¯®­‡õ Áú#ÍFàQ}êôõ3Ç ‹Ûloÿ]©[kó®(µøµ&Œ Kóxfš±,óæ]üæY{Lg`ʤQøÝbI»û»ü/-–{LÅ·šJ |«©„lþ“¸Üx#gkuhí˜tTïÖ¦Ü;å˜8ÆógLÆØQføFUÑécÜZzs:÷•‹Ý¦Àk¦5F™›ÂtÄ7»®["éôkîNœt4¼ì0ÆÒc,MðŒ®~«ë³ãÀ©o§ÞòðáClÛ¶ û÷ï‡L&Ã[o½…M›6¡¦¦¦×öŠýû÷#99¨««Ãõë×±qãFžå™\ §‘‹Î•Ÿ¹¬Æª…öˆ|iàŸe8sYm,O¿^Œ°ÿœ‹‘¦Ø–xð?ï ÀÛ//•âÞƒGHÿg1æI' öÙÞþ;[·ÖæûJƒ•ÏLCĪـ¿]ýÎXv!ç;ø¹=‰­+œ1aŒ9îVÔàoW5íîï«|-ü½¦!_sð­æ>ÌLGà«|m‹õÚ;&Õ»Õ× àï9ßaµït½x[°lGǸ­:ô–»5HHSb¹çTø/˜ó‘# Ö>l]é\[u7N:šw«ø>^{Á#MñÏ[e8{YÉæ^{í5¬_¿ ,øùùáßÿþ7vìØ·ß~»Wöáè舔”ÄÅÅ!&&ÕÕÕ˜5kBBBØô<7˜àÇ{VMG2L·…l®y÷½÷Q¦Óöke>K;‰+Õsy4äìß≭ï]æBíIÔ][ß» Q ,÷œÿ\æ¸b¤¹9LMM;½­¯.g ¶Óu%%!!ñÀYµª<P  ¼qÒ5{\ÙX^ݸ¼@=€†ÆÏŸüúo"Æ6±/è]ƒî²ÑàíPx ˆˆßÐùx:r† à„ð Ѱ9Ïñ²ÏsC=¹`àÑPN.†þkäÈQm|çK¢Á”\$ý—7[…ˆˆ†´#|3¤_ß611¹ """&DDDÄ䂈ˆˆˆÉQw‰Åb""&ƒÿäÂ㇈ˆÉÅî´5M¿×¿¯ö9œOðM“““^xáäçç÷K›²-‰ˆQrAÔÕ$Q£ÑàÚµkxæ™g°uëV""&íb{mÝïïÿ{„††âÛo¿Å§Ÿ~ŠœœœaÜ÷ïßGbb"fÍšÕåv DPP  $ ¢££##ÍGHZÓ™Xk¯­‰ˆ˜\ô³ØØX<ñÄ=z46oÞŒÜÜ\À† ð—¿üz½Þ8úœœŒ   À©S§°gÏXYYÁÚÚ¯¿þ:N:Õê>Nœ87ÞxS¦LÁøñãe,;~ü¸±lìØ±Ø±cþú׿öékëÌ~---q÷î]èt:ˆÅbüéO–AÝ4¢àì쌿üå/8pà@—ÛíóÏ?‡··7,--1nÜ8DDDà‹/¾èt:kíµ5Ñ`f6+=qâDããQ£F“ ©TЧžz çÎÊ+pöìYÌŸ?ß8\­Õjaggg\×ÎÎÎ8ÔýSwïÞ,Û\II -Z$˜gbbÒ§¯­3û=tèÞyçÄÇÇcüøñˆŽŽ†ŸŸß° jFƒÁ•J…ÐÐPäææbÚ´i]j·«W¯"&&¹¹¹xøða—Û¸3±Ö^[pä»™ IDATqäbÙ°a> 8|ø06oÞl,³²²BQQ‘ñ¹J¥ÂäÉ“[ÝŽ T*U›e×®]3‹k4¨Õê>míwîܹøè£ðõ×_ã7ÞÖÃì&&&°··GBBvìØªªª.µÛ¦M›°nÝ:äää@­VC©Tvé{»kDDL.¸gŸ}UUUøðÃ1fÌÌž=ÛX¶bÅ DFFB«ÕB«Õ"22þþþ­nG.—c×®](..Fee¥à²Èš5k†ÂÂBèõz(•J÷ùkëh¿!!!ÈÏχ^¯‡Á`à'aS¦L»»;N:Õ¥v«©©……,,, R©Z$jãÇÇ­[·ÚÜoWbˆˆÉÅ ½ˆŒŒlq∈ˆ€µµ5¼½½áíí [[[lß¾½Õm„††bÆŒX¼x1,X øO€­[·ÂÃëV­‚D"Á–-[ “ÉÚ­Sóï_øétVGû]ºt)6lØ©TŠ˜˜$$$0¼ôÒKHNNîR»ÅÇÇ#::R©r¹îîî‚òàà`Èd²6Û±+±FD4Ô˜4NMG0ݲ¹æÝ÷ÞG™NÛ¯•ù,í$Ö®b«ÑväƒCXî 8ÿ¹ÌqÅHss˜ššvz;_]Îl§;4ê"JJBBâ³jTx @yã¤kö¸²±¼ºqy=€z Cv䂈ˆˆ&DDDÄ䂈ˆˆ˜\“ """"&DDDÄ䂈ˆˆ˜\1¹ """&DDDÄ䂈ˆˆ˜\Э“#""&DLNˆˆ˜\ü   AAA˜5kðüóÏãìÙ³öÄÀÍã;Á7MNNNxá…ŸŸß/‰„F£a –äâÎ;ËåX¸p!233‘ŸŸ˜˜¤¥¥±©Õ“¼F£Áµk×ðÌ3Ï`ëÖ­<(DDL.„âãサk×B$ÁÜÜnnnHJJ2.S[[‹°°08;;ÃÙÙááᨭ­|Òtÿþ}$&&bÖ¬Y€„„( œ?7nÜ€¥¥%bbbZ]·½¶o«}{+‰ˆ;³ÁPÉòòrLš4©ÝeN:…ÔÔTXYY^ýuÈårüñ4.‹‰'6oÞŒwÞy§Ým~þùçÆÇ–––ˆˆˆ€§§§qÞ‰'’’‚)S¦¢¢¢ÚÝž¥¥%îÞ½ N±XŒ?ýéOŒÀ>Ð|ÁÆÆ§OŸ?~ÇŽ3¶×Ž;àçç‡ØØØ.·}Gú"‰ˆ8rÑ‹D"ÊÊÊÚ]F«ÕÂÎÎÎøÜÎÎNp €±#€Q£FA¯×·»Í«W¯" 3fÌ€X,†T*ÔãîÝ»‚}väСCøâ‹/àçç‡gžyÿûß}@£Ñ@­V#++ ‰¹¹¹€’’,Z´Èx9cîܹ-b¤³mß‘¾ˆG""&½ÈÇÇgΜiw+++Ÿ«T*Lž<¹GûÝ´iÖ­[‡œœ¨Õj(•J Á§b•JÕéíÍ;}ô¾þúk¼ñÆïC&&&°··GBBvìØªª*ØØØàÚµkÆËMIHwÚ¾#}DDL.zQhh(öïßäädTTT ®®ׯ_ÇÆˬX±‘‘‘ÐjµÐjµˆŒŒìð>æÆ[·n æÕÔÔÀÂÂP©T-’¹\Ž]»v¡¸¸•••‚Ë"­m/$$ùùùÐëõ0 ü¤Ú¦L™wwwœ:u kÖ¬AXX ¡×ë¡T*Üêzµ}kíÛ\O㑈ˆÉEsttDJJ .]º///899aç΂Î:""ÖÖÖðöö†··7lmm±}ûöNï#882™Lp½>>>ÑÑÑJ¥Ëåpwwo‘ô̘1‹/Æ‚ ë¶¶½¥K—bÆ J¥ˆ‰‰ABB#°¼ôÒKHNNÆÖ­[áááU«VA"‘`Ë–-Éd­®ÓQÛ·Ö¾Íõ4‰ˆ3“Æ©éñ¦ÛB6×¼ûÞû(Óiûµ2Ÿ¥ÄÚõAl""ÒŽ|pËýç?—9®inSSÓNoç«ËÙ‚ít‡F]„CIIHH>!!!X»v-D"ÌÍÍáææ†¤¤¤v?M6ŸwñâEøúúÂÞÞžžž8vì˜`™¦OÏMjkkggg8;;#<<µµµ‚m9r^^^ppp€¯¯/®\¹‚””øøøÀÞÞK–,R©4®S__ØØXÌ™3‰ÁÁÁ¨ªªlóÐÿßÞ™ÇGQ¤ÿÿÝÝ3¹CrAB€€ §Š÷±ë¹¸Ê"Þ¬(*(‡"r(°¨‹«"ˆˆÊáíº¨,ûuý­,ñ@ä>E"$r’IæêîßI†™3H$Çó~½ê5Ý]ÝÕUÏÓSõ™ªšêW^aðàÁ¤¥¥µ»/gtt4÷ÝwŸOÏů¿þÊÈ‘#éÕ«ݺuãöÛo§°°ÐÇf/¿ü2$33“‡z§Ót|0~ööICÏ‹ ‚ªª¼¸p!‹-bþsóZ°h•â ¨¨ˆ^x3Î8€ &0þ|ŸÿýΟ?Ÿ»ï¾›èèè:×óÍ7\wÝu'”‡x€I“&±gÏ–/_Ά <¢Æû×s Ï<ó yyy|óÍ7¬^½šÜÜ\æÌ™ã“æêÕ«ùøãÙ±c×_=#FŒà‹/¾`Ù²eìܹ“!C†0yòdÏù .dóæÍ¬\¹’M›6Æ“O>铿† X¹r%999íî‹YVVÆË/¿Lß¾}=ÇFŽÉ=÷ÜÃæÍ›Ù¼y3=zôàñÇ÷¹nÍš5|ñŬY³†‚‚ž}öÙ ãƒñ³·Oz^AjÆ­·ÞÒª„E«Þcé à7Þð4¤¿ÿýŒôô^ìÛ·ÿýïÜu×]õ¦URRBÇŽO(?aaaäççSTTDjj*sçÎõ{þŠ+xâ‰'HHH 11‘¿þõ¯¬X±Âçœ9sæ’’Bxx8÷Üsååå<ýôÓ>Ç6oÞì9ÿ½÷ÞcöìÙtîÜ™¨¨(}ôQþóŸÿø¤ùØcß®¾Œ5ÏIïÞ½yë­·X¼x±'¾âüóÏ',,Œèèh¦M›FVV–Ïõ5~JHHà‰'žàŸÿügÐñÁø¹=úDÿ(ŠâÓ  ºîFQ'BÍ/»ÜÜ\¶oßÎ=÷ÜÃÌ™3=ñ5½º®3wî\î¿ÿ~ÂÃÃëM+..ŽâââÊÏ+¯¼BVV—_~9çw«V­ò{~aa!éééžýôôtŸîøš|ÕP“÷ÚÇÜn·g?//‹.ºÈÓ˜4¨NšÉÉÉíîKZ37ç»ï¾£GlݺÕ·nÝ:†JÏž=IMM%33³Î³Ð¥KŸí‚‚‚ ãƒñs{ô‰ þ±Z,lߺ¥Q×lß¶ «¥e.´Ý*‡Ebbb;v,ëÖ­ó»âŠ+°Z­<õÔS¬_¿ž#F4xý\À'Ÿ|â÷‹…ÊÊJŸÞo Ä›o¾É–-[˜={6S¦Lñ›^BBðìïß¿ÿ„½&%%±~ýzáÕ‡?úеkW.\È£>ꙋ2zôhî¼óN6lØ@NN;wîÄ4MŸk½ý”““CBBBÐñÍágAÚ>¸új¾ÿþ[öìÞåó#²>LÓäpþaöíÛÇ®¾ºeÖÁÕ¡f[´ñ÷±¿ðÒ"Š‹ ÓÌüû_ÿ”'LAh ¹n¨Ïþ¯ÙÙlذž¢¢"t]oð:MÓˆç´3Î £kÆ ç#7ç¯,]Ê— 8€JÀJªC‘×öÑêøÊêóÝ€€ -ìÅeµ -‚ í…®tÍÈhe‘:AAq!‚ ‚ˆ AAD\‚ ‚ ˆ¸Aá$Ó"Wß0t·®C­õ„@QÐ4M³ˆÄþ‚ ´£úDÄàr¹ÈÍÉaÛÖ-u®ŽUU‰éCï>}HÏÈÀjµŠÄþ‚ ´ƒúDÄEõ¯µ‚ü|6lXÏÅ_L×n=Ð4Mž¦D×uöíÝÃ×YYhôô®¨ ØU| ö¡mÔ'".ªqë:›7nä’Ë.£[·ò5š¦‘Ù«7šÅÊ÷ß|Crr2á‘Ɀ m¸>9™´¬ ¦IqI1ééò5i]Ò9RZ‚ËåˆýAhëõ‰ˆ‹c†!ÝÀÍ„ÕjE× LÓˆýAhõÉÉ¢ÅN55e–¼ø@ì/F¡Ubi-]þÏYöá Æ»<çž{žüâ;I }-¼Á¸¿8DTH¬IAÄEËbÙ‡póÍ$))¡N\~~!/¾¼€ .¸P¼zPT•oûžp-›^L‰{?O~4 ‡³LÄ… ‚ˆ‹–IRR;vl®s¼OŸtŒ ãÅ—zDFCüáŠ+¹sä]âùf@ÇEŽc#¹ÎMl³}Ê%±“Ä(‚ ".Z¦i68Þ|ô¨­Î±~øž+þpEÀt³³°ò¿Ÿ1òŽ;Åó'àƒ“™–Ø_h1•§Å‚Ûíþͯm©e„/.üa³Upð`ÅÅe^c‡ßë:vŒæŠ+.fÍšŸÄë'€Ûíæãå’“{À·ñëØð5K^y™³jXDQÒÓÓùÓõÃe~Lk0böìÙlݺ•÷Þ{EQ¤•gKò%â¢åR\\Ʋ÷? úüo¾Áï/Á–ø€µÄHö³F¢)VàØ5Š¢bQ¬Œû×@ϱ7†å’ѵ¿ìÛËÀƒê¤ïr¹Z¼ NÖ½þùg.»ì2f̘Á¢E‹ˆŠŠbÓ¦MÌ›7?ýéO-º¢™}úÁàÁƒÙºu«Ï5sçÎ%55•˜˜î¾ûn‡'Þn·3zôhâãã‰g̘1ØívŸë,X@·nÝ ñ¼ŒÆjµú¼˜F×u¦OŸNJJ :tà¶Ûn£¬¬¬ÁtššÂ¢bcã…ëN}ØÈxþvó ž¾ùSޏs09¶ Ë>û÷L¶˜Çn|—ØÈx.M…Ãé ºC4EEºïرcyë­·|޽ù曌;¶ÝØÿ‰'ž`òäÉžr„††rÖYgñÁ4ªœþìÔÔeÝ·oC‡%..ލ¨(† B~~¾ßïž¿üJ/X?ÖÞT‡ÃÁ¨Q£ˆ‰‰!--yóæùIJ•?c#å©]†@é*S}/Äò>ær¹xøá‡éܹ3‰‰‰ÌŸ??`óœ.]º”ÌÌLO}»iÓ¦mèÏþÁÔ5|öÙg 8ˆˆ233yýõ×ý–)˜ç±¡ro#⢙„…î60ŒcâbРAƒ§°jðÅýâ‹/øòË/)((à–[náÚk¯å?ÿùÿýï),,ä†n`̘1>׬^½šŸ~ú‰={öŸŸÏc=æ‰ûË_þ¡C‡Ø±cÛ·oçÀÌš5ËçúµkײvíZœN§ç¼Ëåòù5ÿôÓO³aÃÖ®]Knn.aaa<òÈ# ¦ÓÔ>8räÕëØÿ±÷$2:œÎ⯦àÔ+)Óûœ_äú‡ncéW’ÞŸ«3Än·Iq#ßö9þ|Þzë->üðC–-[ÆÛo¿ÍóÏ?ßnìÿå—_2|øp¿çSNvò¦)ÊzÝu×1aÂ(**4—¾ºØ´Û+ÍÒ£G̲Íýû÷™÷¾wŠùTÖu毕kÍ-åÿg~Z4Ë\˜s™ùCéÛæôU™÷¼ÛËܵ{»¹s÷vsç®mfII‘¹hñB³¨¸¨Nyë ÞeÍÈÈ0§L™bfdd˜999íÊþ‹Å¬¬¬l0í`ËéÏNÞe>ѲÖJKKÍÄÄÄãå/PzÁú±ö÷=P9RSS}òµ}ûöFÙÊßýÇFõ T†Úé*S »¥¥¥™Û·ooTóœ>|¸Áú¶±ßË@uGÍv—.]Ì ˜ûöík”Ïü=þÊq×'$Ä×É[íýÜÜ\úöí[Ç.Òi äÎ#55—Ë…a¨šFeeÏø'¾¿„”¸÷¹â”Qrnç´¨X½c¿ÜÆ´3Vâr¹PUÓ—ÛMRr2‡ õ¹‡ÍVÞ _ââb¹å–[xê©§xê©¿Û®ìß±cGÌ¥S§N ^L9ýÙÉ»ÌMQÖ5k~`æÌlÚ´›ÍVoµñ—¿`Ò Æµ*G^^žO¾RSSm«†î<6ª/®v¥¨LìvèÐ!Ÿg-˜<6æûé·¾mÌ÷2PÝQ³ý¼ÃÓO?Ãã?NLL sæ<ÃÕW_Ý`™‚ñ] rO#Ã"ÇÝý~ìþµ'`ºÝnÏœ »½’Ñ÷n¼ù>øàFÞu‡®“~}ÛÁÈÎÎöìÿúë¯$%%yö“’’|â÷íÛGbbb£ïÙ©S'vïÞEyy™'”•õ{M}v<‘˜ŒË夸¨˜˜8BCB1tßÿ]þõãv¬å”ðËøùàV¾Û¶’1}ÞÂp›(ªŠ5$‡ÓŽÃá >>âââ€åõ›7oæí·ßæÝwßeáÂÙ»wo»²ÿïÿ{–/_î7ý`ÊéÏNÞù?Ѳš¦Éˆ#=z4{ö즬ì(‡ hù ”Þñ~w•#99Ù'_ÙÙÙ²•¿û‚9(Ý@e²X,Øl6Ï~QQQ2ïÛ·ï¸òØTßÇ`í¨î¨Ù>ýôÓY¶ì~ý5›¹sŸeܸñ'dããyöó,‰¸h¼¼ð1àëo¼Ž®ë¼ðÂë8PLNN1†a2áÁ¸æª+øËÌIL›:š¸“ñãÿÌØ±·3æ¾[¹wôÍŒ5œ;Gþ‰ÛoÂÝwßÈ-7%$$MÓš\\L:‚‚ ˜2e*Ç÷Äö'&OžB~~>ùùùLž<™næ7ý˜˜vïÞíslÔ¨»?~<¿üò .—‹­[·rÇ#›¼q«íÓ4)))"!>»ÝŽ­ÒÆœlbbâHOË 5>“{û½ÆÂUÈÚó>Ÿ¬yƒQ½—Ó„„$ÂÃÂ())Æî°c·Wß1žÂ¢Â +›ÍÆÝwßÃk¯½Êµ×áùçç3bÄŸ©¨¨h7öôÑG˜7ï9^ýuŠ‹‹±Ûí¬[·ŽÛn»½Qåôg'ïüŸhYMÓ¤²²’ÐÐPBBBÈÎÎfܸñ~¯ ”¿@éëÇÆŠ‹áÃoðä+??Ÿ)S¦4ÊVþêŽÆÚ(Py‚M7P™ú÷ïÇ‚ °Ù*ÈÍÍe„|âo½õV&MšDNNGŽaêÔ©Açñx¾þlâÏþÁÔ5éŒy';vìÀétb𦧧¼¡2Ïóè}ìxêMØsñÃ?0cÆxfýåAû˃̜93Æqߘ›éÝ'ââ<Ž”–V©¼²rÊË˱Õ[9å6åå6\NGJKÑu£YÄŹçžÃYgÍ©§ö¥cÇŽLŸþ¨'~æÌ™$%%1`À@ H§N™1c†ßô'L˜À…^Dttϱ‰'rÎ9çrÍ5CHJJæ®»F1dÈßä—sNîA:tˆÁVaã›Õ«)//gמíìÏÉÆÊy}®bÔ™óøhÍ ÜyÆ\ÎìyVkùùyäÌ¡Ò^Éúuë±U”ÇÁƒuU~tt‡:Á4M|p"£Gæ¼óÎÃ4M®¼òJn¾ù&zhR»±÷îÝùä“ÿcÕªÏéß))©<ôÐ$† Ö¨rú³“wþO´¬¦iòÒK/2mÚ#$'w⪫®æœsÎ(.üå/PzÁú±±âbúôéÄÆÆrê©}9ûìs¸à‚ e+uGcm¨<Á¦¨L/¼°ÿûߤ¦¦rÙe—sÑEùÄO›6•^½NáÜsÏ£_¿þ¤¥¥Çãù>ú³‰?ûSwÔ¤sõÕWsë­·‘œÜ‰™3ÿ«¯¾â·LÇó³¶ÇMË„ #q:+Ñu7¦ ºa`Uÿ Á41L§Ã‰®ë¦Y¯躎n8NØ¿ÿ0[¶ìäñY%""¢ÉòKié‘?öæk¯ríÿHLl\£|°ôÕÅŒûÛwnÅá°“”˜LÞáCÇöê/ žýZ_LLº¦w'5%Å‹_äîQ£ÅþAÚ¿=Ø©µøQZC},¹9xeéR¾¼øSÀT6à(PRм¶VÇWVŸïtÀ z±£Vñn‘ˆˆHLÓÄnw`šU‚Á0 LÃÀ0ª„…®ë8Nܺ^ųþ¬‡³c<¹9‡èÞ-Í¢5¹òkK‹¡Ô§ŒMªÄÜi{ŽuïÖó¸Ò·UØ0̦µY[·{±“¼SEZ?-T\øV0!!!¸\nÜn7v{ `FUÐ ÓÀ­¸NtÃÄ4«Õ=ºÓéÀÊmÄÆ*8쬫TŠAú K— æ¿0M­û~ˆÈÈÈc¡zÖtdd$ølCÕj©I D\4Âþ".AqqbÕKUíZÓsÎ'Ÿ|Áõ×]É‘#U“_ ÝÄ0«{.ªE„ÓéB׫—ø®îÕ¨êåÐq¹t JJŽÐ³{ŽêÅœšŠ’â"Ÿ<·æ­NyR“;óÔœùÄtˆ¤ô¨ EQ±Z ±`Ñ,„Xª¶ûô9…={~¦OŸÞü¸î'N?} ÿ]õ?N?m?¬Û@ÙÑr&Mßd6köovj{~-¬^=VÁŒ¸m‹¿ÌO?m!"Ò‚Q- Ïø>膨(U£ý¨ª ŠÕ0Ñ4“ýßJÂBÂIOï‚Åb‘_HðÀѣǖ é‰ª(hšŠ¦j(ª‚¦ª(ª‚ntïÑ»ÝN¿~}p8ôë{ ¦ ö꥜ ”ª¡*ñAÐöAqqBõªïxs||qQ¢(XB¬tïÞÔÔTÜnӔеI„›¢b ±.>û ‚Ð굕™ÅJD/Í-ˆÄþ‚ ¿‘‚ ‚ âBA‚ ‚ ˆ¸AAq!‚ ‚ˆ AAD\‚ ‚ ÔEL B[ÂÐMrJ\Øœ&nC–NoJ4Å$Ü éñ¡¨j0þÐqëzÕ«~…&wˆ¦©hZËkÊE\‚Цø¹ÀÉ/9ü´=‡Ë-ibBC,œÖ»+º‘Lf§P¿oïu¹\äæä°mëJJJÄxMˆªªÄtˆ¡wŸ>¤gd`µ¶¬E÷D\‚Ðf8Pä 7¯˜·ìåökÎ``Ï.hšŒþ6ºnðã¶l–­ÚHDX(¢’IŒ¬ÿ\C×)ÈÏgÆõ\|ñÅtíÖ£E¿"¼õùBgßÞ=|•…fÑHOïŠÚ‚ì+âB„6C¹~Øò #‡œÉ€SºˆAšMS9g@w¬ ®ÚH§äx#ëoÐÜºÎæ¹ä²ËèÖ­‡¯É}¡‘Ù«7šÅÊ÷ß|Crr2á‘-&"éAh;¿æL»ÓEßÌT1F32°W*•NN—ÞðI¦IqI1ééb°f$­K:GJKpµ°!@‚ ´j†ÿe(¤y±X4{7„a2ÒÌX­VtÝhqoO–aAÚ¨Ðhü¿ ׬áà§ŸR´:‹’M›qUT¢¨*±}N!þ‚ I¾øÒ®¿¾êoB³úBhåTL B{Çm³ñÓÄÉýèCº¤'žÔþ× &¼c .[%Gó‹)ùa[W|Ä®¹s8ç!†k¼ÿùf^Xö=nÃÓÄ4Á¤JÌüáì^<9úr1’ˆ A„ß–ü¯¿æû[o!>Jã«ÏĪÛQ+Bþ/ðkÖ°â#;бGGºêIöÆÝ|6pŸ™Cæ˜1bÀ“) uƒçÞÿ–¿Þ{)‘a¡è¦‚ÛÄ£nžzý?".D\‚ ü¶ݽ›Õ×a@¿.$ftÂÜ¿³¢, 𦠍€£³²C71,ádôêMBçxÖ?>-2’n#Fˆ!CöäÑ#¥#ªªx†[b"ÃÈÚ¸§¡àpƒCW¸tPY·ë$"³žAhs˜¦0ºÎ÷7ÝHf·$:&FãÞ¶¥¼UUP5Õ¢`±ªX¬*š¥ú˜³cûÂ\6Ìà§ ã©ÈÍ ê~'#hšÖli7¥/‚ _¬Û˳?BQ¼æq˜&† .œn—nâr›Ø.TE9iölNÛ¯/D\‚ 43;çÎ…üC¤tëŒ{ï.Ã@Q@QAUAÕ@³(Ç„…ZÝ“¡€™ó ‘Q¡¤§Æñߥç¢ùÅ",Z¾–˾£Òqì/—5âÁ0Ám€n€ÛPÐ 8RZÖ¬y²X¤ã_Ä… ‚†ÃÁÖÇ㔞)è€Ë @äsï±t%tLò½ .‰Ð%_öÌ»žCú¾ÝtíÕ…²-›(X½ºÁ{Í;—ÐÐPæÎ+†?*ì.xþSÖïÎcâí—úF*`†Y%(œ:”Ùì˜Î2úf$øœš––†Ýn¯÷GŽaРAZ¢Üí–¥åýŠ/1 mó×nÃÝÅ%›7AXD8ú]X¬U¿€Õ„NXúŸ‰ºðÿáxàôÒ蘄eþ¿Q»öÂØø˜U¿¤ÍŠ ¨(§c‡ ׬!á‚ êŠÃ`ñâÅÌ›7 0qâDTUm1vhéyÈ-8ʸçþMïiüñ’SµV­™1ø®—}Λ8ÿÿÐ4…ËÏìÉ´—PXZîsïóÏ?Ÿ7ß|“Ñ£G׹ϒ%K8묳ˆ ˜×Æ IÏ… B;¡dýz¢#B1**0 <¡tüMèûv¡fô"tÁ§¸»ôö ={¶)·c&fu0ÊÊ‰Ž°R´úëzïóÙgŸÇرc‰gåÊ•>ñV«•¥K—’™™IDDƒfÓ¦MНMC/°ÒuéÓ§“’’B‡¸í¶Û(++ó¹nÁ‚të֓Ûs¸cörÎ;ýTÎ?­{•c/M»‘%ÞÈk3oâïÝIJ'oå_ÏÜΟ¿“Õ‹F3kÔ%”W:ÐuU=¶ÉÔ©S™?>†á»Ø”ÓédÑ¢E<üðÃìÛ·¡C‡GTTC† !??¿ÞüyÛÙáp0jÔ(bbbHKKcÞ¼y­Úö".AŽƒÂo¾!¢ ——U‰ÃÄÐMô‚-ZT眬¬,²²²(((àúë¯gL­¿·Š–§Ÿ~š 6°víZrss ã‘GñmÐ×®eíÚµ8ΓêŸwVnâ/¯~Åð«Î'%9Ÿ–c&Û÷—²+§”Ý9¥ìÉ=ÂÏKÙSÂîElÏÎ#¯¨Œ‚’rvýzÓÅk±³ÓN;îÝ»³|ùrŸ{½ÿþûœyæ™ôìÙ“ë®»Ž &pðàArsséÕ«“'O˜ßY³fQXXÈž={X¿~=_}õU«µ½ˆ A„ã¤2'«¦a8\U"A¯npÎã褘NJH(¦ÓAÙÃ#pçFw›5A7ÑíN,ª†£äH{ìÛ·uëÖqÓM7pã7²nÝ:²³³}Î[¸p!©©©DFFòÐC±qãÆFÅËo¼Á‚ HKK#::š¿ýío¬X±ÂçœgŸ}–ÄÄÄ“ê›G—|Ίo÷róµ¿Ã…•ì‚JL@QUµjF­‰‚aVMàÔ ·a¢ë&&U‹hY4‡ËMD¨ïÈÿÔ©Sëô*ÌŸ?ß# 6oÞÌÅ_Lxx8111Ìž=›U«VÌóûï¿ÏsÏ=GRRÉÉÉÌŸ?¿UÚ¾)‘9‚ ´9Ün—ß w±çžKù;»è…©›UÿQÔ„NDÏý»GX(!¡DÍù;GF^‰~øp•¨Ð«Ä…i ¥¼´Œ½zât:|îñÒK/QPP@tttãO>9Û³é¹ÖbÑp»Ý>iН}ßÚÇj¶ssséÛ·¯ÏyŠ¢øœ›_ozÍé‹ÚØ.0Á\º‰S7°è*¦S§ÔæFÁÄ¢š„[¬ aVÕ³m&¨j%¯¨Œ®b}Êsî¹ç ª*Ÿ¾Š‹.ºˆÏ?ÿœ¸¸8€Óé`Íš˜9s›6mÆf³Õk£ú¶óòòHIéìÙOMMi¶—ž A„&Ä4ý¯¯{Æ”ë`ZC«ÇÒMt·‰›DÜÛŸaé~ î½»(vî½»°t?…˜7>ÃŒMòô^èº ÖpŽ–V{îy>éWVVòüƒmÛ¶Q^^æ [·nåwÞ¡²²Ò3Ù¯¾5 êÛ®ï˜ÅbÁf³yö‹ŠŠ¼¾S§NìÞ½Ë'?eeGýÞ«iÖ¹h\ºOÝ{1—Ÿ‘ÆŸdaÅMz|å•:9EvJmnìN·ŽW0qW >Ý0°ZTb"ÃyoÕf.Ü­Nú“&Mâ¹çæcš&Ï?¿€‡šè‰1b£GfϞݔ•åСƒAù&99™ììlÏ~MïTsÙ^Ö¹A89òÂoesÚ ÊKV ‰`AwW‰‹„—ßÅÚã\?ï"ÿæ+°oÛBþ-WàÚ» kSè¸x™ç\à †5 ›:ž}¶Oú}ôƒ&=½‹Ïñ®]Ó9ýôÓøè£›D\ôïß `³U››Ë„ 4xý¨Qw1~üx~ùå\.[·nåŽ;F6»¸ä‹úÂWögÚmç°ü³ÕäÑ;-MU¸t`'~×?™óOMæìÞIœÑ3‰=’85#‘Ì. TØÝlÞ›ÇÓï|MT¸•¡ö®“öUW]Inn.ï¾û………\vÙe>¢044”²³³7n|ƒöôÞ>ü¦NFAAùùùL™2¥YmßÄ… ‹‚Ðf{."¬sg¢339|(Ÿ¤„dô¼LÜ……Ø7¬%ÿ®0 ƒÊ#ï†ËI\òzQ!º«j¨­¬‚Òò ~ÿ;Ÿû-Y²”3¦×›‡Q£FñÌ3s¸õÖ[ö 7n,Ï<3‡Î;3qâDV¬XQïõ'Ndþüç¹æš!äååѳgO&Ožð^Í틆8çÔTMºŠ‡_úœâÒ Î”‰aÂäç>ª÷|EŽÂIMèÀM—œÊ…Ó«…MÝs'N|ûŋùäí¥—^dÚ´G8pàv:wîÌLàã?nÐF5ÛÓ§OçäÔSûÅ„ ãY¹ò¿'Ýö'“êQF϶ hãïcá¥EJ-%B«aKŽ“W~Çœ לu_¾g«/¼ˆ>) X+ËÀVæY…SUP¼Þ¬nk$ Ь¨)]Øöëazþí)ºÜvk»³õŒÅ«ö‡óèŸVÿ_'Ë>xŸ{ï»ÿ„þa³»˜ñÊÿpC/=ƒÙKþEÖÂ?ËÃîÅ›¯½Êµü#1±qÇu}nÎ^Yº”…//þp•€ 8 ”T‡"¯í£Õñ•Õ绪©2¦ô\‚ÐF{.wGffÒsÚT²ŸžÌÄX@E/+EQÀPMŸ¿1K‹@KH"÷P’vë-Çõ«36@CpäHI»ñ…?"B-Ì{)‹WlàµåYUÂÅéÄ4«|TTU­ã³öhï–‚ˆ AÚ ¸®›¹Û¸qúl%»¶m##&’°¤ÎE…UË+&JuÇ®‰ ª†Ú1ÃÊ/‹°iN}r6n·MÓÇ’’â€r{òEm ÃÀår¡ë:n·››×αV}R晸  (*ªª iš¦a±XÐ4 «Õê³j{±·ˆ A„ækÒô¾m—ËE~~>á}‚ҼˎwߥSD8‰qIh\NL§ÅjE Å4 äh9ÙGŠ)8ëÈ‘d—¡rï^:wîLTT”˜ý8}Q·ÛËåò„šýé‘LýÓ©”cªª¢Y,XªÅ„ÕjÅb±`µZ1tã~‚ˆ A„Ú³ÀâÂîp`·;p\p>E‰‰”½ó³ „„i±ÐAÓ¨Ð+)u¹0\.ìááü|Å„ H²¡SYYAe¥¥úíœÂñù¢6Þõ‡>2:EcºgXDU5ÏHísUU¿ˆ¸Ahªö,ð8XX©))X4 MS ¥xÚ4²‹ qíÝ‹eÿ"òò(ïЊädÜ]ÒˆˆO 16†¸Ø8âéÚ5ƒN’ ‘Fì|QŸ¸ ©ê0 Op»Ý躎®W‰‹š¡MÓP5 ­ZPÔ ‡ˆOD\‚ 4a‹\ƒfµZIKK#-- §Ó‰Íf£¢¢»ÝŽÝáÀép ( V«•ÐÐPBCÃˆŽŽ"""ÂçSÒˆ¸/Â[,ûR/ñ‡ˆ A„æhÏÝÀX­Vbcc‰•ì$ûBq!‚Ðb¨ù'¢aÒ 5#ºaúØ»!TUÅ0ÅÍë £ENZq!B›ASLÂB¬lÜ™CïŒx1H3±{a!VB-š_¥ËýûÛÔÛ>[ÅE…ÄÅuDQZÖÛšÃ0),Èçǵ?0èôÓ q!‚Фv´âÐã9g¬Z·O¾Û-FibBC¬œ3¨]:Ç“Ýðyª¦Ò¹s ýú÷gãO8ZZŠnbÀ&BÓ4bbcé׿ ññ„…‡‰¸AhTU¥GRÑ‘©d¤%ãtéÈpÓ¡(bÕèn!)Ò p®‚%ÄJ÷îÝIMMÅíÖ1MMú¼+*–+aaá-.o".Ahc  Ir$Gi€¬ÎØ<¯Ø4‹•‹ULÖÞ„˜@A‚ ‚ ˆ¸AAÄ… ‚ ‚ˆ AAD\‚ ‚ âBAAÄ… ‚ ".AAq!‚ ‚ˆ AAÚ=f=z>E\‚ ‚ðÛ"âBA¨Û[Q_/†÷¹ â÷­¨¹9ÄÔ‚ ‚Ð>0ªEƒÑ€¨z˜¤Aq1aì}bfAAh?è^Áðú¬ ~…7Ju¨ÙV­:„á@$ ÄX ®z¿Q}^HµXѪÓñNWA„–ƒwïCpN ¨Ž¥@ p(®Þ/l€pÔ$&ÔßsQ» Ä[µ¸½‚«:5‚‚êsT‚ ‚Ъąá%.\Õ¡¦½¯-Xª*Ô?¶bÖ£jjnî¬V,5ÂB¯NOõ:&âBAZ¶Àðnã]Õ=5½ÞbÃ[dþ:'ê¹hHX¸¼D…½V…ÛK\(Òs!‚ -^\x·õÞ⢲á®ÕƒÑÐÄÏ'tÖœ¨×#,ì^"¢¦ÇÂűáÍK\ˆ°A„–/.¼ÛûšUs/ìõ úÿ¢ `Z¨˜Ú“<êNd2§ ‚ ´FqõOê¬é½¨ðêÅpÖê½8îž ï šWÀ+ÎX½D‡ê%,D\‚ BËî¹ßI®ZÃ{ˆ¤¦÷ÂðÓsA ž‹£UߨöPˆ·°Ðj‰ é¹A„–ßsá-.¼§B886DRßÐHÀž ÓKÔ7ÁÃ{¨Ã¨%.¼çZ¨µD…ˆ AAh=½õ͵¬™ÔY#.ü ‹úz.¨%,jpyÅÕÜØYO…‚¼¯DAZ£È0êéÁ¨™Q#6ê빨NPs.j߸F\x÷V(øönH¯… ‚ ´QQ»¯ÝÞ{/ ©7¶ç¢öÐHÍj›õ Œš¡­Vo… ‡‚ BëÞÃ#&¾ÿ ©ý¾³žž Ó_ïBíÞ5ˆO‚ ‚ÐöF Ï:Â"qQ³(JSA„–/.¼÷#.ü‰Žú–õ–y‚ ‚жF}/'kpEÎ`DD0"CD… ‚ ´?‘áWT4F('/‚ BëŽ?a bBADl4ˆ,x%‚ B“òÿd¥H_gõIEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_design_layout_details.png0000644000175000017500000031653012235000130027131 0ustar00murraycmurrayc00000000000000‰PNG  IHDR³“D?–sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ *0/\Á IDATxÚìÝuxÇÀñï]\H î¸K$¸S¤P¨B*x‹ Š-Ô Å@[J[jÔ€¢ÅÝ ®qBüî~„\sÉåî’4÷ó<÷$»;;7óîìÞíììžbýºo4!„B!„ⱦÐh4…:æÍž!‘B!„Fíº¢– !Ê´­ßÌ– ˜H§ƒ`ÞìT®\™ú½"‘B!„Eê3z!¶îµøL †¢L[½a —ؼ|‚ÃÔ‚y³g0~â{ܹ“"‘B!„z ˜ú5o @LršDñ@$¥¤‘£*Ù(%K %®Îö¸9Ù°rõé$0¥ƒ ¯s %å¶DD!„BéÕißðÖÐAD%Þ“`!hç@ò{œ?º£Dë×kÖ'm'@Âí{Øù§t` P¹reô<Ž@!„B-[÷Úò½Qñ@%ßI'ñv*ï¤sg©í_©Xë_Š¸ÅŽÍ¿R§I'\œì Ä~й³¦kÆŒ›@êÝ»zlØs…ý—î 6ñ3ÀÙFÅŒ×B$²B!„˜—ðÒëo’–™-ÁB<0qÉ©ݳ‰vOôÁËűDyœ¹ÃÅã;iÖîI<óå“x—#ÛÖ˃ ‹`™÷OQ½Àé9J*yy™œaÆÛÒ£,„Bñ+ê«ÞÞ_£´±+^fJkZv{ ¥Òⱎ鵛‘„EDS§FU|¼Ýµó·í>Àí[<ð2<Ì÷*Ëe(e{Ô(¹½\Q©KvnéáR‹÷ó’ÓS3vt¬gϘFAz>4äääèffiÉå+—¤ƒ@!L4wî<¦LyO‚QŒ8•µ¸Év_þïzwî$“f]¼´šv|ëâv,”qYYY\¼r“¤Û)¨T¬,-°±µ¦EㆅÒ?}žî!•ùphKVü~‚Șx|¼ÜÙ¾ç0¿/è@Ÿw×Ó¥]s³”mûžÃ:ù=¨÷*n¹ –aûžÃÿIYL)›xp”y=€:_ÁÆûèÙ¹µNú¢æçå%ç§fì È›ûûï´ó|||±³³£àjµ kkÙBˆÇ^FFûàòå+¤¤äþ2Œ£ƒn®®¼øÒ‹&Ù.+RSSù{ËÂn†‘••… ÎÎÎ 4ð?=)1·yó>Ðý‚ TâX¡U*СCxù„xT©‹hëÏumA·®]Q(•(•J %J¥¥2÷oî´¥B¡M3qÆÔM‘y–×Î+W¯1¨g 5<±µ¶à^F6 ·Ó˜ú¿½„7Ц½E¯VÕhÛÈŸ _n+GªVöÑsÄhçÞ#:'ºÚ†kÿ'å†ÊYÖöaŠü÷c½yçï À¨ÿ G§VççÏK¶—;òºz÷~РVkP«Uܹ{‡7n ÑhР ˜˜(_„µ´´4¾þúÒÒÒèÞ½5kÖD£ÑÅ‘#Gõ#Ëúqó¯¿6rýúužþ9ªU«F|Böxèå.NAžÉ“'ͱcÇÙµkÉÉÉ 0ÀlåÊ{ùü‹¢šºB¡(þë~~ÒîsþòMF=LãÚÞÌýz'/ÇPÙ»/v©­­­¶® XXXðý¶s¬Ý|kk+ü|Q«ÿb]0î DFÇGFfÖÖVøz{à룳NL\"‘1±¤¥¥ceeE_|¼ÜõvtlBÇ6!ôyw=Û„Ü/£†°ÈX¢cãÉÌÌÄÆÚ/*û{¹oöϾ#Ô©Y•ðÈÒ32°·³£VõÊTtv2§È¨X"bâÈÌÌÂÞÎÖ¤6—÷~ÛüÛaPp^iÊdjÜ;Sd¾ѱ\½(°¶¶ÄÍ¥"Õ«`ii¡S¾Ú5ªMÆýúW¯êOJÊ]bã“ÈÊÎÆÁÁŽZÕªàì䨳^ÝšÕŠ!-=k+ü}½ðóñz¤Ž1E ȳh|oF}ü‡öΛésGÈqÛ|P«ÕüþÇoh4j4j žØØÚ’”t‹s.’’‚Z­ÆÕÍ{;;:¶mG…peF!ʃ={örûömºv}‚zõêiçW­Z•ªU«ì Ðh4:tˆS'Oq75Ç ŽѲE moúüù èÞ½;änj*®..´ïО¨È(Ξ=KZZîîntíÚ __ŸR×),, ///”J%^žž<ûì3:u)M¹Ž;ÆŽí;P(ØÛÛS³f :uꄵµu©;òÒXZZÒ¸q0»ví"&&V;?¯Ü“&½[¨.yóÂÃÃÙ½{7ññ h4üýý iFÕªUõ¦Ï›îÙóIL~1Wg{’盧åð5vœ¼LÃz5Ù½ÿ˜v…?aÌÓðtq$:á.Ëÿ8Á-ÀÙ©‚þN”‹WhYÏ“‰ýžÀÕÉŽèÄT~Ù}Á`›Û½ÿh26+4/=Š[¦¢âv=6^']ç¦Uy¾c]½ùFFÇQß×–O†õC£Ñp;5“£¢ùaÇêÔ®ÅþÃ'´å[üËQÞyî \íˆJ¸Ë7›Ïо¡7ÃÙÁ†ð¸;,ÿýj œ:{^»Þç?fDïx»:rën¿ï½Ä¡‹W¨W»Æ#³åïìÊ;6<Ѿ£>þCÛ!P°c`ÔÇðDû…Ž% …Œø0kFÙÙYtëÖ•JEŽJ…Z•î½û¿†s{ì¬-ÉÌÌ ;ý)é÷Xûýw¼ð̳¸¹ºJ„…+W®P«V-“¯(ç¥;xð{öì¡yHmÚ¶aÏÞ½ìÙ½…Z´Ô}(Rll ¾Axx8¿üò+?ÿô3AA 2X;ï¯:dp©ëdggGjj*«V­¦zêøúúR£zu½ÃôKR®ì¬lˆsÅŠœ¿pÍ›6£R©xòÉ'ÍÖA͉'ðññÖYWQÄý‰yóþøãORSSyöÙg©Zµ 11±>|˜*Uª,ODx¯¿ö*7nÞä· ¿±iÓ&†  Àá#GØõÏ.4l@×'žàÈá#ìÚµ…RIH³f&½¯©åÂÜŠÜ÷Fèt¯ãàß4šû_8¥8–V¤¦gR©‚ Çvçè…h.ÜLàØ¥ÛDFÅâëãIdT,mzñú“ì<~“eŽñl‡º¼Ú£*µš3á±…òŒŠ1ºŽB¡ ¤¶ Cz7æè…hf®Þ ƒz7ãlØú¼»¾Ð u»VMÙsà˜nÇpD ƒ}éß­!v_ä»m¡ôïÖþÝ¢Ñh8~M·|õª¸óÎ—Û ¬îÁ¤­ùlSÆ,ÜNˆžg.DÇÄѼŽƒzq04’wmÂá}‚MjsMÞƒç ·™â”)*&Þ@Ü.šœ¯J¥Âí#?ÝL\Rí‚ýõ|J?î¾®“O ?Æ~±•zUݘúz[¦½Ñ–-‡¯1ò“¿µóF¿ÐŒq_îÔY¯y=_¦­ÜMNN#žkÆà§‚Q©Np9&/Gb*jAç¶Íu: òwtnÛ\ïhyA ;r²³ôïŒjÙ9ÙlÜôjµZ«»á‘QXZ*ÉÉι_™•ZMFF: ,¸rí‹èBˆGYZZV–:ÇÖO>ý\ûÿ;ãÞÖY'/ÝÉS§šÆÁA=r”“§NÑ´icuZµlRþ~ÿÎk‚R•ï_¥¾}ëV‘Ç÷‚eÒW®<=ºwc×îÝ$$$z6”г¡lS*y¢Kg4¨_êr5Ë«›FMZ5Ù¼i3W¯^+TvcÓú,Xð¡Î´……íÛµÓYW¡PèÍ+o^VVØÛÙ ÊÉÆÛ˃§û¹±ÎÀÊê߇¾ëû‰>}1s¯˜»M•ýÈÊB©ý_¥þ7>GŸ.4zþ}&A³&ÚyÊÜ<”JÙùb,JÝAûëjµ•ZZ¥F­V¡Ñh¨è\g''4 ÉÉɤ¥¦£ÎÉÂÆÊò‘*&„¦ªQ£:'Ož"ôÜyš‡43éD&oKK+knßMÇÕÙžŠŽ6ÜKKÇÙÁöþ rÖÖÖdff•èøommCÂí{x¹8â^Ñž´´ôû'¹&•M©Ì=ëNOOÇÕÙ®ØmU™¬K·«×ÃXùn*U°cÎW{9q% …‚Ÿæ<¯÷D¿$ŸÛy÷P ÓÑbýýšœBÏ-ÇOžÑé(øÂ¼N‚&Áîwü›—œ—šN™¿!|©Õj²2³°²²ÆÚÚ[k[lmí°³sÀÒÒUN))wHKK';+‡ôŒ RSSÉÉQ¡A£7OyÉK^òzÔ_-š7ÇÝ̓qøðîÞ½‹J¥ÒþÜ!z¾ çM׫['÷CðĉÜ{æçGlP¿~‘ëg^I_?þô3—.]æÞ½4T99$%&à_êrå]í°±²";;›}ûö“)u+˜&;;›³gÏæ^ýruÑÎwvvàÚõëdggsðà¡Bëþùç_$&$àîæ†¿ŸoîK‹b•¯à¼ÆÁ¹W9öîÛGFF&™™™Ü¸qƒ_7üfòû[./y™ûelßËëPæö€2ß_eþÎtn3x”^/]eÊ«-ñqÒA\\"•½r5§¯ÄQÁÉw7þ܀מ ÄÁÎ ;kBêù1DW._¹^è‹»)ëx¸»óǾܡ &:2’«×®Ò¯cmÂ#¢±°° -#wt‚—‹#GŸÖ{òäæR‘ÇoЧmm®^½ÎÓíj°õÈuÜ\]L>Ù-øòpweãþÜçõ¼Ñ3ˆðð0"#Ây½g Áum¬mˆMÎíÄ ©ëõk7x©Kƒu.“ḙšoÞ½ó÷2²±µ²d@÷FféÀÈïžADGE¦ÙŸû/ãáîöÈìCÊü)Tk =[`ÔÇØàÀ†ÚŽ‚¢Ò+ú?E GX[Zr`ï^èþÖJÊí,-­prª€F£!== [Ðh°´´¸ÿ3,²„kk+^èû<'Ožâò•«9z µZµ•nn®xxxy¥¹yóÔ /^âäÉS88ØÓ¢Esš6mò@F˜^'köí?@ZZ*• ;;[êÖ­KÛ6­J]®î]Ÿ`מ=üüëhÚ´‰ÉWäM©Ûç_,ÒþoccMÕªUh×¶vÝ.]:ñÏ?»øë¯M899ѬYSBÏ×É¿~ýúìÝw€Ø¸8|¼½imBÝ Õ;00 NŸ eùÊÿaia·7ÁÁA&¿¯©åÂü#ôÏÿcçaž¾¢s0÷¯Bç©äù—ÝŒN¦RÃGëg•J î¥gñjFT¬`‹•…’;÷2Ùyü&ßn ¥J@e,--ÙFVö1žlYƒo¦=MV¶Š‹a‰ü´óîn¤Ü¿)±uœœ*°ÿ|8™YGéÙº&«Þ{Š”ÔLÖï<‡­­ Þ^ü°ãý:Õgù»¹·)ä=¬0?o/Oþ!„Ä$²³s°±¶ÆÓÓƒ°ðƒë¦¦Þ#<2ŠÌÌL¬­¬ñòô ,"Ò`=L-“±¸™’ïÝ»©DDE“™™…••%žžîDÜPÜòåŸwâÔY_Ÿ°µ±!3+÷=<ÜÝðpw{¤ög[¶lü…¾ý^ájTR‰òp´³a϶ßéÖó9Rîý{;NvŽš#ÛÖ³õ›ÙrP×Ãè‚¢4mÌŽ]»ÉÎÉÄÚÆ[[líìÑ(,¨Y«µªU•+B!„ ¢„¦´´B‰U±óÓðè<­Z5À¤ø¹¸TÂÅ¥R‘i‚{—J•p©TIïr77WÜÜ\Mz//oO¼¼= ä“·Õô¯£ož>îîn¸8±­TÉÙàºööÔ©]Sw—ŠFëaj™ ÅÍ”| •ÏÕÅ¥Då3Tæ:ujš´O–Wy†±É©zºÐñÉwµy©å¼ôÁw¸»ºòìS½ˆ‹#2&–4gêÕq$ÀÏ—J.X[[IB!Ä#H¾ã !ûàƒ”‘­â‰žÏ±mã/øÕiIEgÇb­;%•È‹y¢çsdd«ä˜õ0:¬¬¬ð÷óÃßÏO>8„B!›“‰S£†õµÏŠhÔ°þ#¿¦¦e`okMçϲcó¯D– Î=ž%3+‡´Œ,i@«ƒ@!„B<Žò½Qˆ‡­aƒzÕþw/=gz=ݯDëgfçp/=SÏ…4&é B!„ÒA „(O’n§š=ÏGí¨æf °~ÝZ‰„B!„0¨N…D~Û²W!„(÷Ç2¡Ÿ%@¿W™‘ûÓÒ#,„B!ô9uú ¿/èGr’|¹B”OQ‘¬\±KQ¥„@!„B!„ÒA „B!„BˆR˜Gn1B!„B!?2‚@!„B!„ÒA „B!„BˆÿèO/âãb‰–Õº+×£´ Äã»ÿIŒ…Ä]â'„Bó1ëO¯2•ÏñåJñxî3EÕEŽ ú©ÕjÞ8ˆO>ýT‚!„BQF”h§—w¡yq±1ÄÅÆ˜<ÁPºâäcNúê•WSê’¿Üž^ÞF×+M™ŠS®’.X±vpp qãÆÌ›;‡Zµj•ÙÅ\ÛÔ”÷©U«{vïB¡Pèl¯¶íÚsåÊ•R—ãAo{O/o:vìÀ÷ß}§S‡‚qü¯öõÑ ÖEßq¡<´¿ÒîÓ …GGG*W c‡Ž¼ùæp\]] ¥Ÿ>cÁÁAŒ9Ò¬màq|Ю¡¶QÜv#*B!¤ƒ DÊòÕÒ(kõÊ_ž²~‚PҺݹs‡U«Vóæ[o±cûvÙ+{;;¶mÛF×®]µóþþ{ ööå¦+Vbõš5 8P6èc"oŸNKKãÚµë¬_¿žN»ðןàïﯓvö¬Y0!„Bˆ2Ƭ·ä¿*œÍô3¨[¯>µj×féÒe:i¿þúš4m†Ÿ»t!4ôœÞ|T*sçΣ^ýT®R•¡Ã†“ššª“vùò7ÆËÛç+++‹1cÞ¦JÕj4h؈ÅK–è­þ¿†F”FXX^}jÕkàP™—^~™ÄÄD4_.^Lý ©Rµo¿=–¬¬,½y‹ñŽ;i×¾~þ4iÚŒuëÖ™µ.NNNŒñ—.]6¹~ž^Þëglyff&ãÞOšµ¨Q³ïŒOfff‘íª¨mú b3bä}ù¥Î¼E_~ÉÈQ#u櫇±6klÛ—Æ‚ùóY½j5W®^5x̸}û6uëÕçvJŠÎ²Û·oS¿ACn§¤-§)íÅÐñÊ”eÆöï¢ò3µ½ªCQïiÊñÑPyÔñÓÞÞž† 0gÎl^~ù%æ/X`´ÌæhÅÙ7J{ )«±7¤8ñ3V!„B<&Æè«¨tùçôñÇ\ºx‰Û·qäÈ¢££uÒí?°Ÿ?ÿüƒK/УGÞ?^o>Ÿñ§Ïœfû¶­„ž=ƒ­­-³gÏÑI{üÄq¶mÛJLt”Iå/n½ò^Ì_@bRGfçŽíìÛ»Og¼ÿcc¢ˆ‰&6&ºTe*ª|ý¼ÊÐ!ƒ9z–гg¨^½:Ó§ÏÐI{ðà!vý³“£GŸÀü Jã‘#G1aÂx®]½Âï¿màØñãf­KJJ ‹¾ü’ ˜µ~†–ðÁ|bcc9x`?öï#*2ŠùóÙ®ŠÚ¦*6=Ÿ|’ÄÄDŽ9ŠF£aÿþýܺ•Ì“=zèÄÎX=ŒµYcÛ¾4uprªÀ‡.`Ĉ‘deeéÝöÎÎÎ<Õ«k¿Y«“Ç7߬åÙgžÁÙÉÉh9Mi/ÅÙß ¥/ª-è;üßP{1T‡¢ÞӔ㣡º=Œãç+/¿Ìž={–Ùí 8ûFi!å!ö%ù<5µþòz|_ÿ•~ˆ¯ëÖ}§3ßÕÍW7÷‡R†‡ù^e¹ å±lBÓ)æÎš®3n™@î•cô]툉ÆËÛGûE6¸q~þù'ªW«¦wý‹ÎS±bEÒÓÓ©Y«6‘áÚåyù4mÂú¾§zõê$$$ЩsΞ9­M{êäI¼¼}zó×_iÖ¬)¾¾¾&•Ó”öRj/%©ƒ9¶Ÿ9ŸE}¸¸¸˜TæÒ¶ƒâì¥=†”µØêì*i™Mý ¢$FÍŽ;Y÷íZ:vêÄÅ øäÓÏô¦}wâDÞ8ñ?/³œø !ìŠ=|W_>'O'&:JûŠŽŠ4ù¶sÞbàîîNXx¸v:,<¼Èr›³\úò2t(o |ƒ“'NÉåK ¥Í_ÖðˆÜÜÜJãÀÀ@¾þê+Î…žeîœ9ŒŸ0Álu¨\¹2‹¿\ĤI“¹{÷®Ùêgh¹»››î¶ ÃÍÕµØCÒdl¬¬¬4h £FfðàAXYY*‡±zk³Æ¶½9Úª¥¥%‹~Áøñ¸{÷n‘ûÉÐ!ƒY¹r%†•ÿ[ɛÇ›\NcíÅÒÒ’´´4ítrr²Á}ÔXúâÃòÿo¨½˜Òæ ¾§±¸”¤æ>~~»nmÛ¶5¹Ì¥iÅÙ7J{ )±/Í穱úËKn1(­¼[Þ‚‚‚°±¶&00o t„k4–,YJÓ¦Íðòö¡Q`_,\h°¦®³nÝwtèÐ_4lÄ7k×è ‘/8d¾à´Z­æóÏ?'(¸1ž^ÞóÙgŸ£V« ­óý÷?Ð,¤9ž^Þ´j݆ýû÷Ñҥ˺ÿœ’V­Û°~ýz£ëèæ_T=JR¦¢â–Ÿ±|—-[Ž«›;îžÔ­WŸ±cÇi¿ä/ß7k×Ò¸I¼}|iÛ®[·mcöœ¹ÔoÐ/o:tèÈÑ£G ­·~ýzZµnƒ·/AÁ,_¾BÎø„(M¹ôíûïM™JLL wîÜaúŒ÷K”Ï«¯`ü„ ܼFNN.\døð7ÿ“`=óÌÓ¼?ã}’’’HLLdúôéE¦urrâÚµk¬,ØØØ`kkCxx8&îYÏ+kRR3fÌàÙgŸ)QŒß|ó-._¾LNN¦ÈÑ¥áííMHH36løÍlõ3´¼wŸÞLŸ>ÄÄD™:m:}žîc°Œú¶éƒŽÍ¨‘#‰cäˆz—«‡±6û°ö¯Zµjñ꫘2uj‘iÚ·oÏÝÔTV¯Yƒƒ½ 40¹œÆÚK½zõXºtéééÄÆÆ2ñÝw –×Xú’î߆ڋ±:è{Ocq)n½Í%==ÐÐP¦OŸÁ÷ß}ÏÄ ãM.siÚAqöÒCÊjìÍùyjêgˆ%Q±R%Ú¶kψ‘£øfíZbccuÒ|¹x1Ó¦O§y‹ܸ~W^y™Y³f³diÑÂMYgåÊÿ1zÌ|||8}ú»wíâüùó€î(¤Äƒ£¾øb!³çÌåé>}»yƒÞ½ŸbÎܹ,\¸°PÚƒ‡²ëŸ¬úßJ.]ºÄ˜1oŒÏŠ+™:mœ åÏ?þ`ã¦Í&ÅÖÔÑLÅ-“¡¸'ßôôtìßGdD8S§Lᛵk™üÞ{…ò9}ê4{÷ìaÍšÕœ?—^z™[ÉÉ9|ˆ¯¾ZÃÙÐPÞ1²Ðz›6ÿÍŸüÁ¹Ð³ñÞ”)¬ZµJv:!þë‚wƽC­š5éÔ¹ !Í[àwˆhINBBBx¡o_ªU¯Î[#FÐãÉ, Þ>¾…^yÞ8çŠÎ4mBÇNiÕ²U‘ù¼õæ›tëÞCg}súìÓOxÿý™T«^ƒçžf!Í ¥ iB‡ŽhÒœJ•*1q„Ÿ[÷n 4˜jÕk0gî\¹èÔ©ÿ+¯°öÛoÍV?CË'Oš„»›;-[µ¦e«Öxyz2ÉÈx}ÛôaŦ(Æêa¬Í>ÌýkÐÀÄÇž9dÈ`¦M›Î[o½Y¬rk/Ÿ|ü›ÿþ›ZµëðTï>´iÝÆ`9Œ¥/éþm¨½«ƒ¾÷4—âÖÛÇO_?6 äí·ÇbmmͶm[už-bJ›+i;(ξQÚcHY‹ýƒø<5õ3Dˆ’X¶t õë×#99™~ø±cÇÜXç!„«W¯`ü;ã°³³cø°aOöLYgé²Ü΂¹óæâî« ó?ø Øuøêë¯sÏo½‰­­-#Þzëþüoô“èÖ­7àæ½|ùrfÍœ‰«« ®®.Ìš5³P:}J¥i_ï‹[&Sãf,ß±cߦvíÚØØØðâ‹ýغuká|Þ›Œƒƒ;uúwÞäܼ»>‘{{Þ7 ­—3fÎ|?·ì~MMa “±àC óÿ ”e•¯ÑQ‘%^.„cˆCú‹bû`î³<¤0OTTÛ¶ogΜ¹Üºu 777.]¼äþܦ¾‘yJ¥’„ø8 ðƒñLY'/M|\,…Òšú¼|âãP*•¨T*<<½°´´$.6¦È¼Ly˜Ÿ¾2æääh.µ¨u]Ýܱ°° >.¶È÷3g™ŒÅ­à¼ƒ‡1wÎ\Ά†rïÞ=í­ …‚Ä„øb•¯¨zé‹™•••Ù.Ê/yH¡aÅ~H¡¯ŸÞùåý‹DQõú¯ë§¯\ëGûK¹©äË»´ÏòÖn%v{! òõõåõ×^£MëÖ4oÑRç^t__¹xá<îîî&æg|¼4áT­R¥Äe÷ðð ::šÄÄD<<p52*ʤuU*jµ¥RILLŒ·Uéã6hÐ`âââøî»utêØ•J…¯Ÿ¿YŸo¡/f%É,Äã¨Ø·DGEê}•wEÕë¿®ŸÄúñb,6'iŸå¹Ý ‰½yžzª76üFBBYYY\¸p€Ž:hÓ š{{Àû3g‘’’Bjj*Û·ïàùú™¯)ë¼yÿÙSÞ›BBB·nÝbZ¾gô899ƇÜ÷ë—›ç’%KÉÌÌdñâ%¼:`@©ã3dȦϘArr2ÉÉÉÌ0áy^U*W`Ë–-¤¥¥±àÃͶ͌ÅÍÔ΋¼gff2{γ·­é3f”¤³a÷o5BWh9{ð„xP¢"# ¶UcË…r ‘cRñŸqttdÖìYÄÅÅ“‹‹ /¾ø"³fþ{Ÿý°aC±µ³eÕªUÔ©[š7aÄ[E?\Ó”u† Œ+W®¤Q`®®®:?£8aüx>þäš4i =ìþ݉Q«ÔüøÓO,Yº///&OšÄÛo)u|† JŽ*‡+VR¯~*W®ÌØ·Çð×_\oáÂ/?a"¯¿1?__ÆÇڵߚe›‹›)V,_ƤÉïѧÏÓx{{3fÌh³·­Ý»ñdÏž„……áááÁìY³2d°ìtB˜¨Ð32îÿB!„"¿ùóæšõB˜‹)ÏQäÆÈ!„B!„B<¸Ÿ9B!„B!DùQhÁÍ×$*B!„BˆrCn-Â< uÔ­×@¢"„B!ôX/!BˆG˜Üb „B!„Bé B!„B!„t!„B!„é B!„B!ÒA „B!„BôüŠB!„’{éYüsü&1‰©¨5j ˆøÏ)J¼Ý騤 vÖ!B!„B< {N†ááêD»¦5P*d­øï©5j.^cïépº·¨!e†!…B!Ä#-2á.µ«z P(Ñ€¼äõŸ¿ %µ«ywGvPQ¦È!„BñHS«Õ(Qæž™ QF(Q¢VË-/¢l‘!„BQ&eef’••…FcÚ™½B¡ÀÖÎKËÂ_qMÍ£¼ªêïÁˆx)ËcXn!¤ƒ@!„B<úYYœ9}Šýû÷MkaaA‹V­éÔù 2ÒÓ w<ñÒ<"e©æïÁõÿèD]c  jµšÃQ¯~FyGvP!B!„B<´“5†C‡ðþì°±±1˜63#ƒÙ3§Ñ½GO½ùO>kÖ¬Íß;ö P(tÞ«[§¶\½zÙl'§ÿå‰ny¡/Fe!fúÊ0oö ƒ3ü­Q²á„t!„Bñ°©T*£6¶¶¨T*ƒ ylíìØ±}+»tÕÎÛ¶e3vöö…Ò–Öüµ¡,ÝFQœ²”—rO™>«Ì•Ws“_1B!„<&÷0tø–/Y¤§ÑÀ²%‹öæH´™Lž8ŽÀz5¬Wƒ÷Þ}‡ŒŒLíòꞬ[û5íZ6¡v5?zuïÌùs¡Úeû·z€§Î:«W.§uó`jTöB£œÍŸK³àzÔ¯U™Ñ#†’ššjp‚¯üå6–ß®vнK;jWó£]Ë&¬ÿ~Þt€Û·oѵ{OtŸ~ôñqqìØsˆí»ÅgÏ×IsøÐ~~üõ/Nž½L×îO2eRî½éWÃâ´óþÏsêÔqþظ+7cXºø BÏžæÛ9|â¶¶v|øÁlƒëb,¿ñcG2fÜDÎ\¸Î÷?ÿÁÉÇ æW’òæ2°?o Æ‘ç9|âÕªUgÞ¬éFcdŽmP’º–$žæŽ·ÒA „¢Ìˆ‹‹cÀ«¯Q¹JUÜ=<©^£&:t, y//oƒ‚9j±±±²Q…ÚߟP(• úË—.B,[²ÁÃF P*uÒþùǦ̘‹«®nîL{.þ±A'¯™s>ÄÃË[{{ }‹sçBu–k ¼Þ›6‹J®®Úy?ý°Žé³æáé탽ƒ#ã'MeËæ×Ñ—¯©ùÙÚÚGRR"Þ>¾Ìûð3ƒù–¤¼yÿoÞ¾—­Ú`ck‹c'ÆMœÂÞ½»ŒÆÈ\Û ¸u-I¾´m׎­Û¶1{Î\ê7hˆ—·:täèÑ£:ë.[¶W7wÜ=<©[¯>cÇŽãîÝ»f­ƒ½½=CàÔÉS…Ê­¯.yö8@·î=ðóÀ×ÏŸç_èËÎÿ™>oúûï YHs<½¼iÕº û÷ïצÑh4,Y²”¦M›áåíC£À ¾X¸PçAWÆÞרr!„1º×†­­­xõõAL7Š×ÞŒµµ¯»º¹¦ŽÃÕÍ L¾þmlyîËÃÃ=OréFŒöuñz´‘|ŠÎ×X~ ²ô_sèø9¦½?—i“Ç›”oIÊ;fäú¿ö{äâõhŽŸ½|ÿØgZŒJ» J^WÓãYºx !B!Ê°Š•*ж]{FŒÅ7k×9Lÿô©Óìݳ‡5kVsþü^zéen%'säð!¾új gCCykÄHuÒÓÓ9°‘áL2…oÖ®eò{iii¬Z½€&Mšè,Ëÿ³fú :ŒcÇŽ±rÅr®]½Â¸qcY¹r¥Ñ÷zÓê›çääÄõk׊\ž÷zñ•W™6yü°Ðº¯¾ö:oMƒ ´ól\¹4fØÐa¼7e ïϜż¹s°°°àСÃ,[¾œŸúѤ÷}墬³³·£c§.tëÑÓ´423³ŠX$B!B!ŠÅÑÑ‘Y³gOvv6...¼øâ‹Ìš9³Ôy¯X¾ŒI“ߣOŸ§ñööf̘Ñf-{þ_pvv¦ëO0gÎlí¼… ¿`ü„‰¼þÆ@ü|}7nœ¶#!Ï€ýyæ,Ž;†B¡ $¤3ß/]݇ Š­-«V­¢NÝzØØØÐ¼y#ÞzÓä÷}墬³°°$##ƒŒRÞ «T(Pi4(<¤Tˆ‡I-mR”Aò !„Ba’‡ý sÙ|à*l©æï.'d¢Ìt\‹H 5-ƒ-kH@"ya2‚@!„B<ÒÚ°óø 6î‰C-·ˆ2@©PàíæH§¦Õ$B:„B!„xXì¬yªMm „B¡”!„B!„B:„B!„B!B!„B!„!„B!„B B!„B!„@:„B!„BüÌ¡B!„f¥V©ÈQ©@£‘`ˆÇ‹B…… 9Í,¯dË !„Ba&ÙÙÙDEFr.ô,·nÝ’€ˆÇ†R©ÄÙÉ™:uëP¥ VVVé B!„âñ¤V©HˆçĉãtìØ‘ÊU«caa!•JÅkWس{7–TF)í_:„B!„xå¨Tœ9uŠN]ºPµju ˆx¬XXXP£V,,­8¸ožžžØÙ;H`ÊyH¡B!„æ Ñ|+™€€* ñØòóàvÊ-²³s$åŒ B!„ÂLÔj5hä…¢8¸-ZµE¡P˜ïÓÒ•JF£–—C2‚ Ÿðð>üð#zõzŠÚuêâéå¯AÁ¼üò+¬ZµŠÛ·oK Ê9FC·î=pusÇÕͧŸyV‚òˆéóô3Úí۽Ǔò%M!„BÈ ++‹Ùsæ°bÅJrrt‡ÂäääIdd$[¶neÆû3‰Œ/Såwus×™NJL(s1.KeüñÇ9vì˜vzÒ»ï>2mYÚB®É“&ѳW/Ž=ÊO?ÿLß^ƒB!„üg# ž$w¹¹dffÒ·ß‹,Y²´Pç€>éééÒjʱììlæ/X nÒ¤ -Z4—ÀÈqYޜ߹sçùfíZy‹¿\D¿~ýtæÕ«W—zõê2tè&Mž\äÁ–­[ùé§Ÿ8~ü h4<<<¢ï /н{w½Ñ7äúðá#,[¾Œ’’’‚§§'Ý»wç݉pqq1{CC¸¯\¹Â–­[9|ø—.]"66–ŒŒ ìííñõõ¥I“Æô¥?!!Í ÆnçÎr‡ê?N||<ÙÙÙøx{ÓºMkõKRÆsçγtÙR:LLL 999¸¸¸P§NZ·jE¯^=©S§N‰¶ùÊÿýOû¿µ5O=ÕË,õ”¶PöÚBïÞO1~üx2³²îoûUôíÛWŽúB!„ŰfÍÞ|óM–.]Êo¼!yÄ)æÎš®3n™¥ÎÌÕÍÝäNci‹“WI½7e Ë—¯ÐN?ýtVå;4Urr2ƒ‡ e÷îÝÓµoßžÿ­\¡=©+êiê”)Ì7Ooï[5ر}ŽŽŽ&÷‚磩ëŒ=šéÓ§šûöm†ÆŽ;MzÏâ–qÏž=ô{ñ%²îŸÔ™³óéòåË´lÕZ;Ý¥KgÖÿðƒÞ´Å­§´…²Ùúöë§S¾£GS­Z59ò !D ½?} /%9)ñ¾OI/@ý×ß/³23ùqýŒ3¶È«¨/^dÚ´iìÞ½›ÔÔT6lÈĉyî¹çÌRKKK“n›ý¯òeË¡{iѪ­ÁÎQ£FQ¿~}Î;Ç¢E‹Lê$X¼ðsžêÝ犕Ê\£"#X¹b /• Ç»ÅàfX¯¼ÒŸ€ÊUðññ¥o¿~$&ê~˜,\´ˆÚuêâçÀ¨Ñ£µWú R©TÌž=‡ÚµëàëçÏà!CHMM-ñKžýûöëLèß¿ØõT©T¼Ò¿¿ÑB€Ý»wÓÀT*•ÁtsæÎ-òCåêÕ«,^²ä7Œ/.äï-[ôÖÕØ aiÌž3×è aImÙºUgºuëÖ·iqë)m¡ìµ…6mÚèLÿý÷9ê !D9”˜ }é›.Š¦Ý¥K:wîÌùóçINNfáÂ…¬_¿Þ¬CÆÍ=]†â?ž·¬Y³†É“'³k×.:Ä®]»˜T . bîœ9ìØ¾kW¯KTd»výCŸ>½uÒ~óõ7:Ó?þø‡þ·ñ(•Œ=šãÇÍ¥Kùú«5´k×®PYL-ã¹ÐPtßÿ±1ÑDF„³{÷.æÌžM£FJ´½>¢‹"¶wIê)m¡l¶…ÀË9"G}!„(ÇÊÃ(Cf͚ń 6l®®®ØØØÂúõëµi222´Ë]]]>|8ùFúZYY±bÅ jÔ¨½½=M›6åôéÓÚeyóþ¸qãÏ<ó •*UÂÑÑ‘^½z¯]žÍøñãñööÆÝÝÏ>ûÌ`~ÿý7ØÛÛS£F V¯^-ó“‘‘ÁªU«Ø´i“öÁÏMš4aÓ¦M¬ZµJ§M é 0ÉýûhÛ¶-¶¶¶8991mêTþùç4óæÍÅÍÍ 777æÍ›ËÏ¿ü¢7¯o×­cÁüðññÁÑёӧó猫k IDAT_íy6&--MgºB… Å®çO?ÿ¬3ýþû3èÛ·/*TÀÁÁžž3¦ë¤)ªžyÆÏ«àè與‡3ߟ¡³üú%Þ.;¶ocøðaQ±bE,,,°µµ¥aƒ|¹h‘NÚ“§N¬ë˜1¹CÏ«T®Œ••n®®ôêÕ‹ ¿þRâòÙØÚêL?~œ3gΕ•EƒúõyóÍáü³sG‰ò¾té’ÎtÕªUMÚ¦¦ÖSÚBÙk U«êÞNpñâE9ê !D9V.@²sçN^0ò³»Ó§O'&&† .pþüy"""˜1C÷ó÷îÝìÞ½›„„ž~úi†®=ÑÏû›ÿ×{úôéÃèÑ£‰ŽŽ&**ŠZµj1aÂŽ‹óçÏsôèQ®\¹Bdd¤ÁüÞxã f̘Á­[·Ø¹s'‡’Æùˆ±µµeïÞ½ëÌfïÞ½Øøž&¤ƒÀ¨#GŽÒ³W/ü*ãêæŽŸIÉÉ:itþÏß“™_LL Í[´ÄÕÍW7wêÔ­W¨·¸$ìííu¦ïÞ½[ì<ÎÓ½ÊÙ«À^€§zé>/ôìYƒy¼ÍÇ××`ÇFqܽ{—eË–óü } Æ×Ï7w\ÝÜñ¨¬“öÖ­[ºåÕ-wþ§Ä›K—Îu¦?þøºvëNµê5hØ(Q£Gs¶À•eSÅÄÄèL»»ë¿ PÒzJ[({mÁÃÃÝ`BQ¾”‡ P×OJ*òûGžõë×óé§Ÿâáá§§'Ÿþ¹Î€E‹áë닃ƒãÆãTŽü‚Μ9CÇŽ±³³ÃÙÙ™9sæ°mÛ¶cñí·|ñÅøùùQ±bE>ùäƒùÙÙÙKBB¬X±B§Ë•ñÀAƒ˜=k;w¢B… ¤¦¦R¥ÀÕ¼ððpíU܈ˆˆ"˜žžžlù{3ÞÞÞf-cÕ*U=wN;}úôi:tèP¬½©_¿––ÿöeåää°àË·î°ˆ{KZOi e¯-ì’ápBQ¾ 4ˆÁƒs.ô,‰ ñܼq½ÐÑÂÃõÿ»zöŒÎspâÍRN Ԛ¯Úó˯ô.Ë{yxxpãæMíôõ7pww×N…ÖÉ?Oßò^eè°¡\¾|™;wRˆŽŽB“o¹——×oÜÐ[}ù7nÌúõë¹yó}ô1#G2X'y•ÝWž‚óÓÒÓ騩3'NžÒ™âä):vêLZzºIù é ÐZøÅçL: ÿúôyšæ!Í ¥iÞ¢9­[·!((˜J..LžÙ³ÔeìÿJ®ß~ûü±Èô÷îÝcô˜1:óê×o 3ýׯ…Ö+8¯AÆfuÁ“Æ¢žºwï^éY3ßÇßß_{ºgÏ^ƒïÓ n¹¿úúk³—1O“&M?þV¯ZŞݻٿO·l¡%¸Í `o}BB‚Yë)m¡ìµ…øøƒm@!DùR.@å~¶é*üäÉ“ùôÓOY½z ÉÉÉdddpìØ1ú÷ï¯MóìÿÙ»óøîÿà¯Ý$v#‡Ê%±9‰[‰’ðuÖÝ:㬢nBiI„A¡®Rm•VÕÙãg•h(Ah«JÉ%‘‘D®ÍîïÈ6+›Ý AŽ×Óc2óžÏç3ó™Éfç=×ðáðññEjj*RSSáí]ü Duo(=­^½z¸uë–R<77"‘uêÔÁ½{÷0wî\¥2cÇ~/¯‘˜˜„ÇÃ××Om}“'OÆ_ý…‚‚Èå2H¥R¾ †½Å@$aâÄ puuELL är9._¾ WWWLœ8"‘ˆo1`‚@³Ò÷e 0—/_Bêƒ\»zÓ§OSŠg¤§aÞܹøûæ_HLˆÇ¦JgxKÏ+ 1þ|\½ƒ”äû8wöW æªõ²”@×ãÆUšæ>{æ{z"&&OŸ>Enn.þüó/¬[·Î.ñõ×{”æþNpp¾Û¿999ÈÉÉÁ÷ $d©Ò<#†¯ÔøüÃøáG•ï«}þ•zk׭ãG——‡£GÀ¬Y³Ô¶3jäH¥ñõë7`éÒeˆ‹‹‡T*ÅÇyìFýÂËøî»=±nýz\¼ø;22¢¨¨999e.3‘3éÍ›7W¿÷Ü[,^v=¹/T½}áÞ=å‡86kÖŒŸúDDÕXu8õìpKåAS£FpäÈaœ8qmÚ´…Db /¯•‹-‚……9Ú¶uBÛ¶N°²²D`` Ö ‚yóæ¢{÷06®§˜¶qãF,\èKK+ 0;vT*ãëë‹fÍš¢sçÎxûí6°¶¶V[߀0nÜxXZZañâÅØ¾}¶kàkÇàà`ôïÿºwï÷Þ{ÁÁÁJ -&jAhÈb¹Çoä×ÒWUäååaôèuþü %B¤R)ŒK—.iUÖÙÙ?þpTéÒñç³Ñª’êæ2d¨Úå/™wÔèÑ8uêô '}ŠŠŠ0dèP¥×Ûi› ÑvµÍÌwëÖ ‡¨Ø—Šˆ¥§‡„c¶»»ÊƒçYOî Uo_x~›aÎìÙüä'"zAA‹aæÍx˜‘ÎÎP¡ ?û¾ýÓgÎ*÷VF¢ªäFìUtêÜ ÙÙå?¬}÷îݘ?ßëÖ­Åøñ㵪÷‹;0xÈÔ{«~•[ç¤Älß¶ 6mæ ‚°¶w€X,Æwû¿ÃŒÓËÜï­Š¾¾¾Ò¸®®.ö|ý5ºvíª±l—.]ðõîÝZµSÓ¦MÓj¾à`«¹ç}þüùjËëèè`÷W_Uøá€YFm˜˜˜ tÙ² —{¯¥ñ¨sQ•ºžÜªÞ¾pîÜ9¥ñ~}ûòSŸˆˆ^¹òn1àÀ¡:]AP2Œ7.Dcܸq®—˜ ¨–Duê lùr\¼xÞÞ£S§Ž055ŽŽDuêÀÚÚýûõCøÊ¸{­LySS<ð=¾úò 2ÖÖÖ‰D‰DH$Ëý•˜  ZjôèÑØùù.ÅÛ–‡…UøTµ…­X¡ø¹C‡¼„ˆˆ^¡P™\Ƴ¨T-4mÖ¢Òo*’É*ýAÜÄÑ+#ù?³#j°Ã‡²ˆˆèM|ÉÀ[o½…„øx˜››³?¨Vz˜‘ŽúõM ðnv&ˆˆˆˆˆj)¡Þ~» ¢ÏGÁ¥c'˜™[@(°c¨VÉäHOKÅï/ÀéwP§ŽˆÂQí$ÔÂʪ!Z¿ý6®^‰Á“ÌLñÞnª%tttPï­·ÐúíÖ035…X_ÌNa‚€ˆˆˆˆ¨vЭ£‡FA"‘@*-‚\ÎÕBºuô ë³3˜ """""]=ÔÕÕcGQµÃ'GDDDDDDDÄ¡–=ƒàÊ­d|ÿËMħ<ª1ë¤#ÀÚâ- ·9Ú5µâMDDDDDDL¨s3.;¼†ÿµoÞ=Ì!ÖŒ‹'d29’¤cÇW1©_.:´nÄ½šˆˆˆˆˆˆ˜ (Ïžc7ðNÛ·Qï-SääÉÔœWÎ׫öNmpøü-&ˆˆˆ¨ÚûáðAvQ 7hè0¥ñ¸{÷pùò%¤¥¥©-§££SS´§=ììíÙ‘U1Aú ·oýÌÌÌ*·‚B¡FÆÆHJ}„æmê!+¯¨FnH‘A=$§=æMDDD5„)ÓÙ D5Ô—;·+ßO¾ß~‹BŸ¾ïÁÖÎ:::ËdËåCi¡´øg¹ EÒ"Ü»wç£ÎAOT ­²C«R‚àáà üõÇhסÌÌ-ªÜ¥û2™ éi©þz)wo@&“ÕØ)ȹGQQPÏN ª"ú ={õ†C£FÉd(’J!“É “É —ËŸŸÿ߸L 888 ò§Ÿ0yê4v`UJÜüã´hÕ b±ÙYOªäJŠÅbè¥îkôÆüÀg;÷h"""""ªV ¥R´lýv…Ê´lÕ ±×¯³óªZ‚àÉ“LWù3óºB_¦R“7&_ZIDDD5ˆ\Ϋ#‰jËïz:uPT¤ýíà::ºüŒ¨Š ‚’RÕ7Ž®×ð?4LTÝ\þý:uî†ÂÂv•ù HJH€©¹9;£º$ªË‡·Žâà¹æþ¡Ña‚€ˆˆˆjÖÑû€Û›jqràzìU$ÆÇÁÖÞ³S˜ ¨Ä €gO¬ÊêˆD(ÈÏñu$"""ªAÄíMµs_ˆ½vf Y‹–HJLØÙ;°s˜ ¨¬ «Äe•ÉdøpìX´mÓþþþ/U—H,F~^ÞK÷'o1 ""¢uÀ.àö.‡!rr²Ùi5Tì•ËÈz’‰Þ}û£¨¨V âjÌeÄÝý—I&*/APüÁ£zYÅb}€@ €‘‘ìÑ·o_ÌŸ?fffeæ÷ñõA‡ðñÇ^JuŠÅúÈË˭вååå*Õ!DDDD¥¿c¡OŸ>8xðå«& Å«aÛ»<ÙÙYÈÎÎRÌÏí_ó4°jˆ¶í; HZ™L¡Po·m‡‚‚Ô‰—›ËNª‰ ‡Fޏûïíײ¢:Bßb +YsŸ>äääàöíÛøê«¯àìì‚Ó§NÁÎÎNiÞð•áÅ뮢>umhÕŸ/XžÏ ""¢vĨ4Z¿þ[ضuÜÜfhœ—ª÷ö.ýútC#cåש«ÚÖÜþ5Š¥UCÈŠ”o×ÑÑè%nÇ&í+çwY^îàÐÈ±ÜØ¿wþQ[V›:´J¿Å@ÕPz=êÖ­‹6mÚ`ÕªU˜4q"‚ƒƒ1©TŠE‹ÁÆÖ&¦¦øhÂ<É*Î`ê×­ Я[úuëþ·žÿþ‹#GÂÜÂoÕ¯!C‡"55U/=oé刌ŒÄ;íÛø^=4kÞŸþ¹Æu$"""ª9Ç‹ÊßÕÖ~ò ¶lÝŠ¿ÿþ»Üïq¹¹¹˜=g.¬J`ÕP‚9sç"77W742ÆöퟡUë·abjg—Ž8þ* C–.Err2®^‰Á•˜ËHHHÄÒeË”æ=}ú4~þù'$ÄÇaÔ¨‘>b$"#áèÑ#HLˆ‡««+æÎóà\N”L{’ùð$ó1žd>VŠ_úýÎþú+2?‚\.ǪիqåÊUœ=û+îÜþb±‹-æ6¨" &jR‚@ÃÆ//Ö¸I3ÅÏ¿œ9ƒ÷ D³­ÐýÝžøvß>Å<иI3¥ù¥R)V­^çŽÿC«·Ûbž‡'²³³ËmKG(@ñÝýªÿ¡œhËxøð¡bü‹/¾ÄšOV£¡¤! ²4‡Q[ϥ˿£Gîë‹adl„  %8qò¤Ê2¥Ö××GrJ2ÒÒÓ`mcMŸnT³%ëHDDDTsuëÚÝ»wÃòåa*ãû÷ïÇÊa077‡……V…¯Äþýû•æÙ°a=¬%èëëc¶»;²³³±ví'JÓ®\¹Âήæ–/_®ô,±/¿ü «W…CÒ°! „#G²£ˆJy-Ï P/‰}ìí‹¥ÁAèÙó]¤§g`ã¦M5r$þùû/4iÖÿüý—Òü›·lÅõ7pøà÷022BȲP¬ _à ÅªWT§øÖ$¹LÍrªˆ%ßO©©©"vÿþ}89½£4@ P*û|=.\@à¢Eˆ½v 9Ïžs ®LÉÏ_ïÞ•+W"4t9êcex8¼ÿ~ùS‡;4Õ*Ç}}|ðþ€èÙ«':uì¨KMMCÆ ã 6DjjšR]†††Šq•Ó¤Ri™öéõnoM±ÒÓTÅMMM”¦'''£}ç2ß㹫†ðËÙ 5%APXXøÂñ’˜H$BrJ RSSÑ A-Q*÷|û¾ÛíÛ¶ÀÔÔàé1®ÃG"0`¡êUºÅ ÜA™)_|ñzö|W³´´Ä©“'аaC5e•ëùh„-Eß¾}add„ììlX5”¨)Süsûöï`ß¾o!—ËqìØq¸Ïž·ÿ)cò"""ªAž?ÉT2®§§‡M7bÊÔ)ˆü¿ÿSŠ™››#..ůB»wïÌÌÌÊ\Ê®©­ò¦ÑëÛÞÙ>Úl¿ ,ðóO?ÁÊÊŠÛ¹Š¹YÐÃ÷‡\&G‘\¹L†"yñÃÛó ‹ —ËQ$Sž.}žWÉÞè-¥cë×~‚¨óç1lÄ(ô{oNŸþEm<ÀÀACвu´lÝÝzô,¾@íüäÐæOŸ>ŵk×àãë‹/¾üRñŒ@Ž©S§`î¼y¸{÷_H¥…øã˜8i’"^¯^=üóÏ-¥ºsss!‹ ÕÁ½¸{˜3w®R{åýuê|8v¬RláB?,\è—ŽC†ŸŸ/¯ ¨†Û[Ûíã>kúö뇜œöþ{¬4mà 8h Òünn3ñ'O2Uþ}:Zµj{{{ 0?þøc­î"&ˆˆˆˆˆ¨V¹{÷.F…nݺáܹs¸uëBCCqøðavÑ+ÀU qqq˜4iš6m Œ?éééŠxAA<==áèè'''lÞ¼Y©¼¦¸D"ÁöíÛÑ¡CX[[ŠŠŠ†6mÚ qãÆ˜5k²³³eN:…^½zÁÎÎ;vÄž={´Š©#•J„·ß~-Z´ÀÖ­[±üü|x{{£yóæhÞ¼9|||ŸŸ¯´Ï+=M"‘૯¾BÇŽagg‡~ýúá?þPšO"‘”)Sº_†^æ=)) íÚµCVVV¥nó5kÖÀÝÝ&L@ýúõQ§N´k×Û¶m«µ}Bô*龎F ÙÓDDDDôR&Mš„eË–aË–-(,,ÄêÕ«Œˆˆ@xx8222 ¹\OOO¥òšâƒÈÈH˜šš"""‹ÈÈHaÑ¢E EXXÀÃÃ+V¬@ß¾}‘––†µk×bìØ±cšŠoݺ…cÇŽÁÀÀŸ|ò‰"¶råJ¤¤¤àܹsËå˜?>ÂÃñhÑ"­ûñüùó8|ø0Œ±uëVøøøàÇDRR$ ’’’ÔöË/¿ü‚   <BañùƵk×bÚ´i022ªÔm~îÜ9,^¼Xí<µ­Oˆ^%^A@DDDDÕÂéÓ§Ñ¥KˆÅbÁÏÏgΜQÄ<ˆ˜™™ÁÜÜ!!!Jå5Å ((H‘€½{÷bÙ²e°²²‚¡¡!üýýñóÏ?+âb±©©©ÈÈÈ€D"ÁêÕ«µŠ©óÝwß)Ú466FPP"vèÐ!¥uXºt):T¡~ ƒ¥¥%êÖ­‹™3gâÆË”î—wß}Š3æwïÞÅ/¿ü‚)S¦Tú6ôèLLLÔÎSÛú„ˆ """"ªõ.]º„aÆ¡I“&H$pttÄÇñ´´4ØØØ(Æmmm•ÊkŠ@ƒ ”ÆSRRн{wÅ%æNNNJ·5lß¾gΜAß¾}ѹsg?~\«˜:©©©*— ÒÓÓ•b¶¶¶JË£·ÞzKñ³¾¾>¤R©Æ2Ï÷˼yó°víZaõêÕpww‡¾¾~¥oóúõë+mcö oœ©™9LÍÌÙDDDDo››&OžŒ˜˜$&&âæÍ›Ë劸¹¹9ã¥Ö&®Š……._¾Œ¤¤$Ř˜¨ˆ;99a×®]¸~ý:–-[­bšÚŒW333SZîøøx¥+tuu‘››«ôèÑ+ÙýúõƒžžÂÂÂpùòe|ôÑG¯¤®]»âèÑ£jç©m}BT£‰‰‰˜3w.Z¶j K«†hÕúmÌ™;Wå}>DDDDT{åååA$A$!>>¾Ì·««+‚‚‚‘‘ôôô2÷®kŠ«òÑGÁÛÛqqqJ¥¸yó&fÍš¥ˆ»»»ãÖ­[ý­ÖÉ IDATJ¥ËåJgžÕÅÔ5j‘œœŒ'Ož(Ýb0dÈ,^¼éééŠu:t¨"Þ²eKlÙ²¹¹¹HII¯¯o…úØØØwîÜÑ8Ÿ@ €‡‡6oÞ èéé½’mîåå…7b÷îÝxüø1 põêU̘1£Öö Ñ«¤û&OHH@Ÿ¾ý  ±cÇghß¾=._¾Œ)S¦âĉ“8yâx•xïhFz÷lù4‚@DDô†¬Y³ÁÁÁ˜>}:,--1sæL9rD÷ññ\\\`hhˆ™3gâÔ©SZÇU™3g6mÚ„Ñ£G#%%ŽŽŽðððPÄû÷ïiÓ¦!..7V<0QSLÓAñÒ¥KѧOŸ2SôóóC@@ºté4hÒïªU«àåå…uëÖÁÒÒ³gÏÆ?þ¨uÏš5 ï¿ÿ>rrr4ž°ÓÑуƒFõʶ¹ƒƒöíÛ‡•+W"44¹¹¹hÕªÜÝÝkmŸPåX¾tI­^ÿEÁ*§ BCË=x#?/ï…*þù‡#7q ²žd–;Oyo1˜=g.¾ùælþ´øC·Ä·ß~ ÷Ùsðá‡c°4$­ßnƒÂÂB\½¦¸×'%%mÚ:AOO7®Çâ­·ÞÂæÍ[°sçN$&%ÁÂÂS§NÁ¼¹s!@q›ÀÊaرIII‹ÅëvlÒT)Q —ËÕ¶Õ¡ƒ3îÞ»‡Ó§N¢M›6øþÀ̘á†mÛ¶bÄðá¸vízõî\úý";«IbÀÎΣ>ÇÎ "¢Zëãó±aÓf<ÌH¥íüpø &L™Î¯â&OžŒ¡C‡ÂÕÕ•Á>©/wnÇ ¡Ã㞎aøàþxò´E29d2Ù³ÿåÈ+B&“—™nb$Btôy¬×¯Bm'%&`û¶mXýɺZ½ ¾ûökÄÅÅ•I¼Ñ+J2¶½z÷VšÞûÙøéÓ¿ ~ýú5j$¾új7ö}÷æÎ™Ø÷Ýw(**¸±cQ¿~}Dl܈  `Œ3gW…cCDBB–BWW³Ke௿nâ·óQ000À|OOu?oã¦MjÛêݧ>ûì3œ?ÿÚ´i£¸oêèÑ£1|8~û-ЧOo~:T“äÀÇ>þ€'jaDDDDµL&ÃÞ½{qïÞ= 2„Â>©–J¾×g=É,÷„¶&zzz02®§2VÕë>j €â+)J' Þh‚ ä‰¤õK=5øï)¢€ÓgÄïÛ÷ßAü¾ïŠc3гË;wî|ìµúúú˜éæ†ððUرcG™¿¿? ´®ûyšÚêÝ»Wq‚à·ß0iÒDœLœ}Rd>~Œ¬'™8{ö &OQîûòd=ÉÄç;¶¡[·ãzÅåŸdfV«zKóoø-={ö€2‡QÜzЫ§bšÛ³³ùß~û-¾ùö[¥i ‘4ÜüëOd¤§)†´Ô—CSÝÏÓÔ–¾¾>þ×¹3Ò32°vÝztèÐ}úô†³³3Ö­_ôôttîÜb±˜¿™UØ–O#à:b4=z¹\Î8Ôúˆ¨&9{ö ÆO˜\áƒm02®‡a#FáìÙ3 ô9Yêµh`‰6mÛ)ÚøF¯ ðóõʼnDZdIlllÐþwpéòe, †™™üJ=}ô½÷Þƒ­­ öïÿËagg‹þýû—:Èwƒ@‚‚C°Š8Uå}!ZõÉzëèW¨®· Ę4atttرDDDDDo˜‰©Ù '@4°*÷˜¡ºÕ[â&lmmpâø ¬X¹S¦LÅÇabb‚^½zÁÏ×ÖÖÖŠy…B!¦M›†Å‹‹3ó<æ)Ýßãæ6b}1vìØæ-ZB$¡cGÌvŸ¥q94Õ]&A E[}úôFà¢EÐÓÓðgO1>lQPP€Þ½{ñ·±š'þŒË@òÓ:ªËLŽ? }}}v,Q% ]ð¯¶ËV•׈¨¦)yÓ]eÕUrÌPÝê­R ‚’$Á§›6j5ïlw÷2,mâ„ ˜8aB¹ñ’×V´nUå4µÕ¤I“2åÞzë-$ßçýI5%A0¢_'ôïסB¡B¡BañÿÅãBÅ<á«Vñ2M""--_¦ø"£££}}}X˜›£eëVhݪ•Ê/KUùóµdÙJÖËßa…þîQ¥f*µ.Ågw9õ–<¿<7¾T½Ï—/oz™z«Z‚€¨º&AÅð>N"¢Šòó󅬨=•+WðÃÑp#ö:FŽ ]Ýâ¯2 úUÙƒëò–íùñª¼DD5.?PÉu)Îô¿¡zçΙ£HhJF&ˆ*;A9  ÿBÁIþ›ŽRó `‚€ˆè>‡B!LMMѧOèéêá·èhœ‹:Ý»V¬X©H&@||<Μ9ƒÔÔ4ÈårØØØÀÅÅJó4ÑÑðèÑ#ÀÅÙ:tPj;::W¯\EVv6 áää„ÿuꤸ‚AÛ¶üü|?@XØ ¥e~~´i[±àüoÑÈ|üõMLп_?ØÚÚpç!"*ï ¹Ôù—ýn^Þ­Ï×»!"Beùysçª\mêÝysçªL lˆˆÐX/D•• “&NÀÝ{÷pèà!üôÓOps›Á‡ˆ¨ü£úJ­KÓ­¯²ÞÒIMɈ2õ2A@T1Ò‚ò· €@XöVaé+J'ä2H Õå[ ˆˆ^ôsX,*~@lVvv™XÉxAAtttPW_„"i!¬,-à:tp™ù»uïŠ:zÅ_‡ºvë‚¿oÝÂÅ‹¿£ÍÛ­W®^´k×ËðN;'ü~ñw\¹z:¼S¡¶4??]›¶Ktú_G€ƒ- 33Síß/"¢ZŸPúÜ-|éºJ>sa¹õªkGULÛzµ­OU½LUÚg‹oøï*UÉå+ xÑË}?ÉÊ”{ö½Kçÿáì¹(ìþz/„B!ÌÍÍЭkØÚÚ*ÍoXªc#£âÄCV–bZö³¶ôõõ!—Ë¡/—™GÛ¶4=ƒàùéÚ´ýüz”\‚Ê¿5ÿ‘H$HJJzá8U~Ÿ³/¨J$J‘/**z¡:J^]. “æ …å׫®Ò±ŠÖëíí]¦¾ `ÕªU—— ¢ÊL”yásÿ Šßf xvEä€\ÎP½Ìçðµk±€fÍ›•{ÐíäÔ­[·Bzz:q.ê<~ú9n3¦)ÍŸ••cccÅgÝÀÈÈHQ²³³‘“óu‘óôé³y +ÜVEÚ´­®.þ­!"R›!Pü(“É?ûúúª-¶råÊ2ÜåÝ Pº^UãåÅ*Roéå-Y¶’iÞÞÞš—— ¢JJ?~Œzõê•ûwG›¶™  Šªng´%‰âg###ôèÑË—/‡©©i­ë ªìü@©î \A 4¯žž¢.U|¾^uɇ—©–/WL[¾ ýýµª— ¢JJ\üýþ¹ýÒ/lñÿ¥gˆ”Ž=zôDD±~ÃFèèè@,ä~}ôíÓ Í›7Wù§d¼U«V8{î‚··7âââ •JqóæMÌš5KwwwÇ­[· •J!—Ë!•JµŠiR²œX²d † ¦ˆ 2‹/Fzzºb=†ªU»ÆÆÆ¸sçŽR[£FB`` ’““ñäÉ¥Ëê5µ¥©O5õßËb_ÐË~ÇÏÊz‚ǾЕõ¤ÜÏËêToi¼‚ )**âm¯Ù·_ÅN ""ª"Ö¬Yƒàà`LŸ>–––˜9s&Ž9¢ˆûøøÀÇÇ...044ÄÌ™3qêÔ)­ãªÌ™3›6mÂèÑ£‘’’GGGxxx(âýû÷Ç´iÓ‡Æ#""B«˜&...èÕ«rrr0hÐ x{{+b~~~@—.]ƒ Rz¿ººvgÍš…÷ß999Š3ó^^^Xºt)úôé¹\OOO­ÛÒÔ§šúïe±/èE]øí<;AAhÈb¹Ço䫹AŸ8‚q§ ëIf¹ó²§_RnîS¬]³ž^>X[³C^ƒåK—àe~7ˆˆˆjš Å‹°aÓf<ÌH¥íüpø &L™^kûY"‘¨½¬ž¨ºûrçv úßU1žŽaøàþxò´E29d2Ù³ÿåÈ+B&“—™nb$Btôy¬×¯Bm'%&`û¶m YÊ QªOŽ9ÿEÁ¼Å€ˆˆˆˆˆˆˆx‹ÑkUòT~Uxå½IU*AðÏ?ÿ`YèrDEE!''-[¶„Ǽy2dp¥ÔojfŽŒô´J[^mê+=©™9€â×™ÂÞνzõ‚ûlw˜•z*Õ\š’LÑ›Ren1ø÷ß1d¨+zô莋¢qïÞ]„¯\Ô¨ÏHOCzZ*þüã6Dl@n^.zôxññ ܉ˆˆˆˆˆˆ ‚•+Ãá1o¦Lž ˆêÔAûöí±ëóÏóäççc¾§'ìÁÞ¡<= ??_753Çç»vÁ©Ý;°´jˆwßí‰ë7n(b%ÿ—ü ÷ââ0nÜxØÚÙ£aC FðÒÓÿ{ðNaa!-BÓfÍШ±#6}ú©Úú´U·n]´yûm„-_ŽñãÇ!,,Œ{#1Apæ×_1l˜«ÚyBC—#%9—~¿ˆß/^@bR"–/W>°ŽŠŠÂÏ?ýˆïÜÆÀáé¹—ùg¤§)Ý0vì8Ìœé†[ßÄÍ›ÁÑÑ‹þK\„‡ãæÍ¿ñËéÓ¸s÷ïßW[ß‹øhüxüræ ÷F""""""zcªÌ3=zS ÷áàŽ9 333Àа0 u†àà Å<«ÂÃQ¿~}Àœ9³±z͵už:§øY,cQ` œœÚ)¦}ûí>:x 6,NR,[VéëÞ ALë6êÕ«‡Û·o+MËË˃X,‚H,F\|<<,PŠó|ýâþýûÈÌÌD@` Úú´•››‹Øë×á€Ý»¿ÆB??îDDDDDDÄA£Fpèàœ¾~>l¸bžÀ€˜[˜£}g´ïà KKKøûkÝÆœÙ³Ñ«w¥·lX¿‹`cc‹¡C]ÑÑ¥£Roo4mÚÝ{¼‹wÚw€µÄZm}š˜š™ÃÌÜÍš·ÀÜ9s!ª#™_NÃÖÖ†{#½1ºUiaš6mŠ/¿ØUn\,cÃúõذ~½Ê¸ª· ”ž¶`',ðTŠ0 Pš6}ú4ÅÏzzzXŠå¡¡eêVUŸºö_ömDDDDT1‰III/'¢š)ëÉ“j¿B¡ºzz‰D53A@DDDDDDôªElXW­—_GG ,àâÒ ŽŽM Ö×Wz–DDDDD5Ü‹\ñP¯’ÈÊÊÂêÕ«‰ääd S§N˜2e ºvíZ+û„*‡§—Oµ^~™L†„„xœ<‰ú&&pphŒüü<&ˆˆˆˆˆ¨fš9s&ììì°oß>H$<~üçϟǺuë ¢!±¶®öë`ck KK+>t³çΫ”»Fõ¡££™LÆŽ ""¢Z)..“&MBÓ¦Máàà€ñãÇ#==]/((€§§'áää„Í›7+•×—H$ؾ};:tèëgEEE C›6mиqcÌš5 ÙÙÙŠ2§NB¯^½`gg‡Ž;bÏž=ZÅÔ)¯œD"Qü_ò³¦~)¯Œ¦õª*¢¢¢[[[èèèÀÔÔƒÆþýûkmŸ•fgo”äû +çО ‚jB(Âʪ!’ïßggQ­4iÒ$LŸ>±±±ˆEãÆ¬ˆ‡‡‡###ÑÑÑ8~ü8¢¢¢”ÊkŠ@LL "##‘˜˜ˆˆˆ@ll,"##qíÚ5ˆÅb„–zxµ‡‡¼¼¼ðÏ?ÿàÀˆ‰‰Ñ*¦NyåJ.‰OJJRº<^]¿”WFÓzUÎÎÎðññÁåË—‘—Wöìhmì¢ÒtttPTTTyÇìÒêAO¯ºöèÈÿûßü«Rw"""¢êàôéÓèÒ¥ Äb1ŒŒŒàçç‡3gÎ(âDHHÌÌÌ`nnŽ¥òšâSSSÅøÞ½{±lÙ2XYYÁÐÐþþþøùçŸq±XŒÔÔTddd@"‘`õêÕZÅÔ©h9Mý¢Š¦õª*vìØkkkx{{£eË–pqqÁ’%K™™Ykû„èUâ3ª ‘H;[; ⊟8Šä”d& ^1“úì""¢*äÒ¥K Å7ðôéS€@ PÄÓÒÒ`cc£·µµU*¯) 4POIIA÷îÝ•¦•nsûöíX·nÖ¬Yccc£oß¾cêT´œ¦~QEÓzUÆÆÆX¸p!.\¹\Ž;wî`ëÖ­pssÃ7ß|S+û„ˆ ˆÅúhÙª5Ú8µ«´{L¨|Ë—.y£í›š™2ÒÓ*e>""¢êÎÍÍ K–,AÏž=ahhˆììl4oÞ\777GBBìíí Jå5ÅU±°°ÀÑ£Gaii©2îää„]»vA.—ãôéÓðòò•+W4ÆÔ©h9Mýò"ëU 8::"$$-Z´x©}¥¦ô µTaaá³ÿ ØÕDÉ{yx@_~¿UfßTv}DDôæäååA$A$!>>+V¬PŠ»ºº"((kÖ¬\.ÇâÅ‹+Wå£>‚··7–-[‰D‚Û·ocýúõŠº»»cþüùppp€\.‡T*U”USG]9cccܹs7Öº_T•Ñ´^UÅÈ‘#1qâDtêÔ &&&xðà6oÞŒöíÛ×Ú>!z•xšèÉHOS ꦑvÖ¬Yƒàà`8::bÔ¨QpvvVŠûøø ^½zpqqAï޽ѹsç ÅU™3g\\\0zôh4nܳgÏÆû￯ˆ÷ïßÓ¦Mƒ££#BCC¡ULuåfÍš…÷ß_ééûšúEUMëUUxzzâðáÃèÑ£0dÈ<}ú[¶l©µ}Bô* BCË=x#?ïÅÞ™øóG0nâd=)ÿA!%g¿‰ª“-ŸFàe~7JSuÀ–-[¡P333¼×¿?BB‚add¤TæÓM±~CîÞ½ ¸Ïš7·åÖ-—˱yóìܹ‰II°°°ÀÔ©S0oî\µ÷ÑUäV…ÂÂB‡„`ß¾}J‹àåµ³ÝÝùùùðõóáC‡Ã\]±bED"‘¢Õ«Waýú HIIAófͱ1o·n]檋’e¹‡ÿœ=wÒÂBtíÖŸnÚ333µËS^}'NœÄ’  ܹs–––ðZ°}4ž;=‘A‹aæÍx˜‘þJÛùáðAL˜2NTC}¹s; ¦÷Üp Ã÷Ç“§…(’É!“Éžý/G^2™¼Ìt#¢£Ïcí¼~j;)1Û·mÆM5çÊ=çaŪ5x¢ááêúäè‘Cð_\5n1(ïK<ãŒW…ø«’››‹óQç`ooýû¿Ç<J ±ñ¹³ ?ýü8zäž_& IDATÀsü ««ƒ©S§ª¬wã¦M Ƙ1cpvU86DD $d)tuuñ/kex8nÞü¿œ> „¯Z¥ˆ…†.GJr .ý~r¹î³gcùò0)扊ŠÂÏ?ýˆzõêaÓ¦Oáé¹'ŽCFzšÊ[ÆŽ‡•+°cÇg(((ÀŠ•+¸[¶lV»<åÕç>ÛkV¯A¿þý–šŠU«W3A@DDDDµ^•Hh: cœñ7U<=ç+~3æÌóðÀ±cÇÊÌ SS@pp~øálÞ¼¥ÜÁÎ;{-€¾¾>fº¹!<|vìØ¡6AP‘~øöÛ}8tð6lXœX¶LûþÀ=rXqvEX†ºSJ¬ GýúÅo‰˜3g6V¯Y£¶½óQç?‹Åb, „“S;­–G±X¤ #=ÖÖÖX¿nÿÑkSú²öç%%%±ƒˆ¨f'x†šñê~‹ŽFè²P\¿q999Ë倇•™×Úú¿/ÖϾP$ªùòpÿ~2 ƒ³‹Òô„„ÄJ[þÀÎÎNe,--M)fgg‡´4å>-I€¾¾¾Æ‡6]¼ø;‚C‚{]嫊Ô-*_ìú«W¯ÁÊðU062BèòP¼×¿?ÿ"ÑkÁ$ÕêÏP3^ã¯ÂÔ©ÓðàÁìÙó5zõ쉢¢"H¬m‰‚Ò“`gg«”°VsæA"iˆ¸¸xÜüëO˜››¿’åoРââ┞ü[ÂÜÜñññpppÄÅÅ)®&xQS¦NÅÒôîÝ FFFÈÎΆ½C#­–G•víÚáë¯wC.—ãÄÉ“˜7Ïïýùÿ"Q­Æ·½EEEŠ_±“ŸŸ¥j.‰_¼d 22âáÇX²$@ñ»}Ëã6£8‚ÌÌLdggãĉ“9j´Úe253×øjÆcÆ|_¿…¸ÿ>233¨ˆ æ ÿ¤§§#== ýý1|ø0­û¦^½z¸}û¶Ò´¼¼<ˆÅ"ˆÄbÄÅÇÃsÁ­—GU}Ó§ÏÀßÿÂÂBÈårI¹Sì¢×oÛÖ-hÚ´)†uE—®ÝÔžù~ÿ½þ0p Z¶j+W®`iH¦OŸV~‚Àm>ùd ®_Eó-Ñúí6ØþÙvÌvŸUiËïãí¦M› {wñNû°–X+b0·0GûÎhßÁ–––ð÷׺î9³g£Wï>JÉŠ ë×!0plll1t¨+:ºtÔzyTÕ÷þ€÷1aâ$ØØÚ!88[6oáNIDDDDµž.»€èÕ{þ6†=zà·óQJÓ¦Lž\n™1cÆh]7Lœ0'Lx©eTGOOËCC±<4´LL,cÃúõذ~½Ö픞¶`',ðTŠ0 PšV:I¢nyTÕ7|Ø0 6Œ;&Q)¼‚€ˆˆˆˆˆˆˆ˜ """""""&ˆˆˆˆˆˆˆLUKEEEÐÑÑ©´úªD‚ äõj®Ã†—y|E^½FDDDDTšD"y©8QUwï,­B&“ÕœA‰³gÏbçÎÜÊDDDDDDDå(**Âß7ÿÂ7{w£ÿûï#??¿Rê­R¯9ìÓ§7‚‚CЫwo8ØÛ—;ß–-[¡P333¼×¿?BB‚addŠ+Ö®ýëÖ­Crr cÑ¢E¸pá"¾ùæddd y³fXµ*ÎÎι\ŽÍ›·`çÎHLJ‚……¦N‚ysçB p/$"""¢7J"‘ ))©Æ´£IVVV¯^ÈÈH$''ÃÀÀ:u”)Sеk×ZÙ'T9>öœW­—_GG– ,1`à 4jÔOsrj^‚ bÃtíÖ sæÌÁÑ#G ª¾À!77ç£ÎÁÞÞû÷y(”bcD„Ò|×®^ÃÙ_ÅÙsç0nÜx|øáXLœ0/D+¦¹Ïžƒß/^lÜ´ AAÁ3f ή džˆ„„,…®®.f»»ó·ˆˆˆˆˆè5š9s&ììì°oß>H$<~üçϟǺuë ¢±bÕšj¿2™ •–ªØ-XûÉ'ˆŽ¾€O7o.w>OÏùhÖ¬D"ÆŒùpìØ±2ó-ô_ôîÕë¿i ý```€~}ûîÞ½«ˆ•ÜÞð±×èëëc¦›`ÇŽü """"zÃâââ0iÒ$4mÚ?~<ÒÓÓñ‚‚xzzÂÑÑNNNØüÜ÷IMq‰D‚íÛ·£C‡°¶¶P|oXXÚ´iƒÆcÖ¬YÈÎÎV”9uêzõê;;;tìØ{öìÑ*¦NyåJž— ‘H”žð"Ë­.^^;oBTT`kk ˜ššbðàÁØ¿­íªO23«ý•…‚Jºµ J&`àÀ7n,–/í[·Êċޯ Aƒagï3s X4°<|ø¨Ì¼f¦¦===Å4sóâÛJ®N(ýPÄû÷“œ]`jfŽF ‰ü """"zÃ&Mš„éÓ§#66±±±hܸ1‚ƒƒñððpddd ::ÇGTT”RyMqˆ‰‰Add$‹¿ÿEDD 66‘‘‘¸víÄb1BCCó{xxÀËË ÿüó8€˜˜­bê”W®äòö¤¤¤2—ºWt¹ÕÅÕµóº9;;ÃÇÇ—/_F^^^™xmì¢W©J¾æ0lùrXYZÂ}öœ2±©S§á·èhlÛ¶É÷“”˜Pæ@ÿEI$ 7ÿúéiŠ!-õ÷"""¢7ìôéÓèÒ¥ Äb1ŒŒŒàçç‡3gÎ(âDHHÌÌÌ`nnŽ¥òšâÓg'™`ïÞ½X¶l¬¬¬`hhüüóÏŠ¸X,Fjj*222 ‘H°zõj­bê¼H¹Š.·¦xU±cÇX[[ÃÛÛ-[¶„‹‹ –,Y‚ÌÌÌZÛ'Dµ.A```€-[6#66¶L¬¨¨`llŒüü|,]¶¬ÒÚu›Q|KAPp233‘'Nbä¨ÑÜSˆˆˆˆÞ°K—.aذahÒ¤ $ ñðáCE<-- 666Šq[[[¥òšâРA¥ñ””tïÞ]qi¹“““Òm Û·oÇ™3gзo_tîÜÇ×*¦Î‹”«èrkŠWÆÆÆX¸p!N:…;wî`Ïž=xúô)ÜžÝ \û„èUÒ­ª æìì OÏùX½ZùáÛ¶nßB ê +++xxTÞÓ'ÝÜf@¬/ÆŽ;мEKˆD"tìè‚Ù§½annnX²d zöì CCCdgg£yóæŠ¸¹¹9`ÿìmX Jå5ÅU±°°ÀÑ£Gaii©2îää„]»vA.—ãôéÓðòò•+W4ÆÔyÑrYnMñªH ÀÑÑ!!!hÑ¢E…Ë×Ä>!ªlUâ ‚’KùŸ·ÐϯL¬Gøí|R¤àÚÕ+˜2yr™yTÕ§í´‰&à×3g|? ÷îþ‹o¿ù={öäžBDDDô†åååA$A$!>>>>>JqWWW!##éééX¼xq…âª|ôÑGðööF\\¤R)nÞ¼‰Y³þ;yäîîŽ[·nA*•B.—C*•jSG]9cccܹs祗[S\Ûv^µ‘#ÿŸ½;«ªÌ8þ‘Ò‹Š"rñ*¨ ’–i%” ¹¤B:n Ö8jh›:"*²#‚áZâRcS¦Ž+5†þ”J$l\IMGÐJTöûû£áÆ•ËæÆö}¿^÷÷|ÏyÎ9ÏsÏ…ó=ÏyΟ‰%;;›’’®_¿Î²eËxñÅ›lÑèB!„BT'**Š   ¬­­qvv¦ÿþZq ±µµeذa 0 Vq]fΜ‰­­-'NÄÊÊ ///œœœ4ñ‘#G2cÆ ¬­­ c]¹ÇnW«JUËyxxàääTíHúÕmwuñš®çqóööfïÞ½¼úê«tíÚ•1cÆp÷î]6lØÐdëDˆÇ©YX°¿zμè´&ö±¿¾=Û¿U>PHQQ‘Ô´hp6¬_ÇÃB!Dcè¿”µDs3÷ñÞ—ýÅÞÝLî*.D#õÉß73zìxÍ{ﵘð§‘üv·ˆ’R5¥¥¥ÿû©&¿°˜ÒRu…éíÛ(HJJdÕìµZwƵt6oÚD`pˆ4D¹:‰Ý·‡ÅKƒ¤B!„B!êñ …B4uÆJãs!„¢áªª‹zFF†T¢ÎH‚@ˆ:ŸŸOtôöîÝ˥˗),,ÄÄÄ„gžy†툑 B!1I!ê+¹Å@ˆ'ì·ß~ÃÉéuV¬XÁÛ.osîì¤^½ÂÆ Ñ´hÞ\*H!„B! !š‚ˆÈH’øE‹1ÍÅCCCZ¶l‰ƒƒÛ¶}VaþíÛÿI[;Ì:˜3ÀÞ£GjÅ7l؈±ÒS3žéÕoïyܾ}[7Vš`¬4á“O?å…_ļ£ŠƒqààABBÃèýìst0ïÈàÁCøÏþSa¹Ï?ÿœö˜wTñ|ß~lܸIkýGéèD§Î¨:uæÏÎ9|8^Z!„BI!ªû~ãÍÿ]Òw|˜>ÜÌ… ˜3g®VüÞ½{$MàZz~K–ðɧŸ²hñâ åœ9}†#ß~Ë–-çÇÏó—¿LâÖÍ›|,‰?ÞÂgÏâé5³ÂrÿÞÿ±ûöqîìôíÛ—ÅK–ðÑGiâï¾ëÆñãÇÙ¼i#—/ýļyÞlÞ¼YZ!„BI!ªrãÆ LLLj4ÿ"__Z·nÍÈ‘#¸ššª÷öžKÏž=Q(¼õÖ›8p b9‹Ѻuk† úÇ´E¿—=bøp®\¹Ra¹à  ŒÛÓ¾}{‚‚ˆŽþãÙÃyyy(Z´ cÇŽ4ÓÓcÀ+¯°}û6ih!„B!¤° jþ¿ûÜ (*,¤´´T*å 255%##ƒììlÌÍÍ«¿lž²vS«ÕšØwII„…†ñÃٳܹsG»yóV…r”ÆÆZå”ORèééU(»L§NŒ´Üé£._+7¸ÒâE‹ aè°×xê©§xî¹çð_êÇ«¯¾*-„B!„$D}w÷Î.]ºÄ±¤D®_¿.¢CûöF¥ÜÑ£G±qã&vîÚÅL/¯‡*ëwfðóÏ?³mÛg 2„’’T:ë<ÑP×®e`ii¡•èTîñLnnïòöÛSùñÇ9’@ppﺹs!å¼|ˆ„B!„¨ÏŠ HÏHç𡃠>’Î-4WÅþ±åñÜG¿ÐLJ„„–- §M›6L?žæÍ›sòÔ)>xÿ>ûlkË*)) mÛ¶¾|ù#ß^ÿ€VFEѬþ/)উO}Û…¹sfóì³Ïj¦éëëËH!„BIˆú® °„o¾e¤ã(l_~Y*ä 344$X¿>š>úˆÅ‹—PTT„‘‘‘ÖIvMlÚ¸ßE‹;væææÌ™3û‘o¯“ãH^5ŠÔÔTLMM ÆÕu†&>eÊdƒ‚9~ü8Íš5ÃÖ¶?AAÒÐB!„âíÚñÏ Ó†Œ+# ñ¨•––’™yóŽ¥2êHË–-™?óçÏ«tžÜœìj§½úê«|—¨ýØÃéÓ¦ÕºœÊ¦¼õÖ[¼õÖ[•nçð×^cøk¯I£ !„¨—T*åÆÎ©m\Q7&8¿Ei©šüÂbJKÕ””ªeì´'@ú•7Q%%%r[B!„B éA „B!D="½þ¨‡ÊHý4~r‹AÝB§Ên9B!„xÊ'$iÒôÈ-’ xhÆJ9© Þ{wK%!„:¤¦¦@bb"EEEØÛÛ³zõj”J%………,\¸ØØX ´žºS“¸J¥"007’••ŵk×())!22’íÛ·sçÎFŒÁŠ+000àðáƆrùòe:tèÀœ9s˜4iRµ±Ê”]5/ûYvR\PP€ŸŸ±±±Œ3†  `Ë–-ôìÙ€;vàìì À… ˜6m‰‰‰¨T*–/_Îûï¿OVV={ödÕªUôîÝ»A}¤.„$D“2uº«T‚Bˆzçø :]¿‹‹ ¡¡¡lذ¢¢"Þ{ï=‚‚‚X·n‘‘‘äææ’””„Z­ÆÛÛ[kùêâ'Ož$..cccÖ­[Grr2qqq´iÓ†¥K—Fxx8sæÌaùòå >œììlV­Z¥IT«LFF†Î«ådee‘€Z­fîܹDFF²téṞcÇèÙ³'™™™øùùáää„III 2DSNbb"{÷î¥mÛ¶lܸ¾üòËõ9”ºhäI`¬4©4–›“­•dhì ¤„Bˆrâãã5¿ëëëãëë‹fÚîݻٹs§¦GApp0¬q 00P“ؾ};Û¶mÃÜ܀ŋ3|øpM‚@__Ÿ7n››‹J¥â½÷ÞÓÚÆÊbµµgÏ­m ÁÙÙYsR¼{÷n¦NÊ®]»P(ìÛ·I“&ñÝwßñÆohÊ §]»v¸»»³zõê÷9ºh䃺Q¯†±/K”øßÿ^!„B4]ÇgüøñtïÞ•J…µµ57oÞÔij³³éܹ³æ½………ÖòÕÅÌÌÌ´Þgee1hÐ T**•о}û’““£‰oÞ¼™o¾ù†áÇ3`À#by8;vÄÀÀ€b¿øBZ\4¤ ¼ä%¯úþ’ãUꯩ¶Y‰ŠŠ"((kkkœéß¿¿VÜÇÇCCClmm6l ¨U\—™3gbkkËĉ±²²ÂËË '''M|äȑ̘1kkkÂÂÂ4&V«Š‡‡NNNš'øúúbbb‚½½=ööö˜™™±páBM|ðàÁääähN”ÇŽKvv6ƒntÿ"I]ñø<ÝXw,33»—_ÑšÖ¬Y3iqÑ€òr‹r¼Jý=i­Zp÷Nž¬·žrttÄÑÑQkÚôéÓ5¿+ Ö¬YÚ5k´N¶k¿ÿÉzzzÌš5‹Y³féܦ±cÇj]½®i¬*³gÏföìÙZÓôõõ‰ŠŠ"**Jç2½{÷&55Uó^©Tj½¯lÿtM«ÊogS¯ !$AðÌÌ̈ûj¿fÄY!Ü?ÌRB4Êãµukî4 ²¦ø}§–õ !„AÃbhhÈ¥K—°¶¶ÖŸæâ‚·÷<—‡Ó¹S'.^ü‰•«VòáæÍÒê¢aüÃ\A^{í5vïÞU¡'ŒAòònK… QŽ×ÊäåÝ&/ï¶f~9~+Ö_}øÎ«« Mm½MYù[î'W±…’ x3½¼:ì5îܹ£s Â9sf³víZÆŸ@VVÖÖÖÌŸ7OZ\4¤ÿ˜µÞµcÓÆM¸¹½[í¼Bˆº;^ónÿöÇÉl›¶Zïu«rüꬃ:ýΫ«6ijëmÂ$ „¨¯êí …ºNúËO›7Ï›´Ô«ZÓÊÿ®§§Çܹs9}ê$Y™×I8ò-ãÇ“ èÿeíQ£W­\Ɇ¹páB…XÙï÷îÝÃkæ,Ì;ª0ï¨bæ¬YÜ»wO7hÓ–Í›?¤÷³ÏÑÞXI[;Ùºu+Ï÷í‡Q{cØÛsöìY­[^òªÅˆîUÅïŸfЦ­ægY¡lZÙôuï¿OOÚ´5ÔŒ|î@—®Ý015ãmnß¾Ýhë¯.¿óV­ZE×nV˜ššáîáI~~þ#mŸüü|ÜÜ=055£›•5«W¯ÖÚ¯Ú–WXXˆ¯ï",»tEÕ©3kÖ®­qÕ¶>…BH‚@QmÛ¶eõêUÌp}—ÂÂBÿ܇„™™ÉéS'9uòéé× Õš7>>žýûÿMzZ*ÎÎfÂ&.î±±û¸–žÆ¸qã˜5{ŽœüÉK^)AP6í·_à·_á·_ÑŠÿÏqŽ|û-¿þr µZÍŠ÷ÞãÔ©Ó9ò-—/ý„¾¾>K—ú7êA]}ç$M$é»D~ø!™7nöHÛ'$4”œœ~ø!™Ä£ |ýÍ·ZûUÛò–- çÇóçIH8ÂÙ’ÉÈȨUÕf^!„’ BÔ4h Ë–…ëŒÿë_ÿ"by8&&&˜šš²"2‚ýë_Zó¬]»†N*-[¶ÄËÓ“¼¼¦¦¦Zë({>{Ùüµ-ÏÌÌŒ«W¯beeU!V›:ªÉ¼B!7¹Å ‰zê©§(--•Ѝçÿ0WvsÝy{êÛø.Z¤7v,KüüÈÎÎ&;;›ÅKü?n\nš¼ä%¯G;Z­ÆÐП~ºTí2o¿ý6óæÏçÊ•+ñã?âêún£ƒ ®¾ó–.õ'''‡œœüü–2aÂøGÚ>ãÇ׬#;;›%~~ZåÖ¶¼7'NÄwÑb22®óË/¿àç·ôê¨&ó !„hl®§‡¹yG2¯_—Êh  µZÍ;ïLçÆZ±E‹|1Qš`k÷2¶v/ÓÁÌ _ß…’ —¼êi‚ÀÓÃá#F`jÖ¡ÊefÍœ‰­­-Þø3–]ºâæîÁë¯;5™Á“üΰµ³eà WyáÅ—022b¡Ï#mß…>¶3¤ß /2èÕÁ 0@«ÜÚ–7þ<ºwïÎà!Cèßß•Jõ@uT“y…B4nÍ‚ýÕsæ-  ?ÿ ØÿÅ>þúötnÿök¥óIM×#¥¥¥\M½Êþ/b™øÖ$¬»÷ÐÜ—)þ°,$€‡96Ô{w3uº+7~Î’F¢žûéb /¨óѼBê¯1 bíÑÜÌÍy" …Ó'ßÌè±ã5ï½×`ŸFòÛÝ"JJÕ”––þï§šüÂbJKÕ¦·o£ ))‘U³GÔjÝ×ÒÙ¼iÁ!Òåê$vß/ ’1š"…B¥…%3Žý_Ä’™•III‰TÌ}Ú·7ªÓõËÕ!9^¥þ„BˆÆ@M”¾~Kzõ~–>}û¡§'wšè²,$@þaBÈñ*õ'„BH‚@4^e·|Éc‹äf!„¯RBÔ'*•ŠŒŒ ©ˆr.]ºDDD‰‰‰Ü¹s‡^½záååŨQ£¤í…ò³¢~èÚÍšŸ³2¥"¤þ„É•+WpvvÆÛÛ›ÈÈHZ·n͹s爎Žnt !êé[.„B!„ââbyî¹çxæ™gظq£&VPPÀ‚ °±±ÁÆÆ 4q•JÅ'Ÿ|Â+¯¼B—.]:t(ßÿ=111888`iiɈ#HIIy¨eJJJ§OŸ>XYYáááA^^žV™Ÿ~ú)vvvšåÏ;§‰•ý,ûàðáà :KKKìììØ¶m[“ió¨¨(<==™:u*FFF´hÑ‚~ýú±iÓ&i{!{‚ÀXi¢õ’¸ÄëSüI“GÈÉK^ò’—4†í IDAT¼êë£)ëòdñâÅ‹8p€cÇŽ‘™ùG”ˆˆ²²²HHHàÈ‘#ddd©µü‘#Gعs'çÏŸgܸqL™2…C‡CJJ £GfÁ‚µÌºuëHNN&..Ž3gΠ¯¯OXX˜V™‰‰‰ìÝ»—óçÏãää„€¦{yFF†VWó9sæ0þ|~úé'víÚÅÉ“'›ÌÉJBBcÇŽ­ri{!yÌ¡•ذ~]=æP___@!Dý;Y;šX§9|饗ˆ‰‰¡[·nb/¼ð;wî¤k×®ü÷¿ÿÅÙÙ™'N¿_™={ö,FF¿?¥èÞ½{X[[W˜fccCjjê/Sv•×ÊÊ €ììl†ÎéÓ§5ež;wŽvíÚUºÎûïCïß¿?žžž8::bnnÞ¤>s–––\¾|™§Ÿ®üÎhiû†GsX¿Èc…¨ç&Nš"• „¢^&êÒ7°°°ÐËÉÉÑŠYXX“£È(;±hÙ²¥ÎiÅÅŵLVVƒ Ò*£Y³fZïËN+[çý6oÞÌêÕ«‰ŠŠ¢mÛ¶1|øð&ñ™322âæÍ›˜ššV:´½Ž$š æÍ›PPX@Qa!¥¥¥R)B!„¨÷LMMIKKÓÙƒ@©T’žžN—.]HKKÃØØ¸N¶166–:<²2ûöíËÇŒZ­&>>žùóçsêÔ©&ÑæÄÆÆòÎ;ïT:´½’ éî;\ºt‰cI‰\¿~]*D‡öí¤„BˆzÄÙÙ???¢¢¢hݺ5+W®$00€1cÆàïïÏÊ•+ð÷÷¯öÞõÇaÊ”),X°€ÐÐPT*—.]bÍš5DGG×hù¶mÛrùòeM7uOOOæÎK×®]Q«ÕÕ^unLæÏŸÏ„ P(Œ=šV­Zñã?²~ýzÍ@…ÒöBH‚@<„¢ÂÒ3Ò9|è Æ¤sg ôôä÷ûÇ–ÍR B!D=;Y áµ×^C­Vãíí­‰ùúú²dÉìíí=z4 .|âÛ8sæL>øà&NœHVVÖÖÖÌ™3§ÆË{xxàääÄ;w4÷£9’3fššŠ••ëÖ­k2mÞµkWbbbˆˆˆ ,,Œ{÷îÑ»wo<==¥í…x dÂ&¨  ŸÏ·og€ý@l_~Y*¤ËBêlB]3 !„um¶—GR(„hdÂú¥ü …rÙ¸ *--%3ó:æ;Je!„B!„ASURR"·4Q*• •JÕä·Aˆ¦zü !„BH‚@!„xÂRRR˜2e =zô GL™2…”””:ÛžûŸ¯]ŸÅÇÇ3qâDºuëFïÞ½™5kV…Ç– !„B¢ž«î •\Áª™¯¿þšfÍšÕøõõ×_K¥ Q\½z•7ß|“‘#GrâÄ Nœ8ÁÈ‘#yóÍ7¹zõªTP56mÚ„»»;?üðß|ó mÚ´Ñ”L!„M8A`¬4‘ÖMÊàÁƒ‰G©TZ­®ð*aaaZóŸýt«Örå{#TfÅŠH6ø?ýôS¥ó\MM富…e:vT1ñÍ7µM2Všð÷-[xáÅ1ï¨ÂÞa IIÇØ¾ýŸô·µ£ƒyGÂ?ž×,SRRBHH(={Ú êÔ™®®Z]HŸ„~ýúÑ«W/öìÙÀîÝ»éÝ»7Ï<ó ,ÀÆÆ|||(((Ð,WXXˆ··7ÖÖÖôíÛ—èèh­r«‹§¦¦âââB=èÚµ+“'O–A¨ªI>tr C‡<ýôÓZ½g233°··G¥RñÌ3Ïh]µ?vì&L gÏžtêÔ nݺ¥™§l@´òÝšuAQ“õ•iß¾½| Dƒ`dd¤óû,''Gó9¶¶¶¦gÏžüûßÿàË/¿ÔÜ.••Å Aƒ4·ØôíÛ·B™fffšß«+¯¼ªÊ¶··çĉšÁªU«øüóÏß{,ØÛÛ?±züî»ï˜6mÑÑÑtëÖM>XB!„$*:qòññ‡Éɾ€§—'¾ ’šz•/b÷qüÄqà[jÒÁÐЕQïáîáIQQ‘Îy&Mú+îîn\¼BJÊy¬­­ñóÓ¾"úÍ7ß»oÿ½|‰?¿ño¾õÿï {vïâÊ/3vìX¼çÍÓÌ¿jÕjNŸ9C|üa.¤œG__Ÿ  à'^§ .$::š’’¢££ñññ!""‚¬¬,8räZWp"##ÉÍÍ%))‰ƒrôèQ­2«‹»¸¸àêêJrr2ÉÉÉXYY$GfI‚   ‡NT§cÇŽœ>}šŒŒ Í+==]3»»;ÇŽãƒ>àêÕ«\¾|¹B¢¡ì¤¤üÈéºFQ¯Éú„hhصkW…é»víÂÁÁAó~ÆŒ|øá‡|øá‡¸»»kb¦¦¦œ8qB븨îöšªÊ+¯ª²[·n……±±±èëë3lØ0Š‹‹‰‹‹ÃÒÒ’V­Z=‘:Ü·o^^^lÞ¼™¾}ûʇJ!„hŠ ]cÜ/4$åÿºTèë·ä石ÈÍÉ¡S§N¬Y½úÖmooÏ@–GèîÆ˜x4¢¯¯OÛ¶mYêçG||¼Ö<«VF¡R©hÙ²%îînäååñÞŠZÓNŸ>­™ëgŸ±<œŽ;b``@€¿?±_|ñÄëÝÆÆ†^½z1þ|ž}öYlllسgÁÁÁ(•JLLL Ñô2€ß{”k'6ª‹ÇÇÇcoo¾¾>mÚ´Á××—o¾ùFŽÌ*’yyy½{ï;ï¼@XX¿ýöyyy>|˜I“&iæ)-- M›6äçç³|ùò åL›6 €nݺŭ[· } õ ÑÐÌ›7 6°uëVnß¾ÍíÛ·Ùºu+6lÀÛÛ[3ß«¯¾J^^[¶l¡uëÖ<û쳚ؔ)SX°`©©©“’’‚‡‡G•ë­ª¼òª+{È!òÆo¿°dÉ’'6þÀ¦M› åóÏ?çù矗”BÑT5ƒ ¬{t™|¼…øø¯yuð^|ñ%¾Š‹{àõ/^¼ˆøøx’’ŽUˆ}ÿý5z4-,1VšÐ©³¹ÿ»—´Lù.Ð-[¶Ô9­ìþPø½{µÝ˯h"6Ïôª³nöûÛߨ±c‡fÀºœœM×q ­mËÎΦsçÎZñòª‹?~œñãÇÓ½{wT*ÖÖÖš{s…nOâþû3fÁÙ³géÓ§/½ô[¶lÁÍÍM3Ïûï¿O÷îÝqvvfèС:»þΘ1ƒ¥K—rúôiúöíËØ±c5cÔv}B44VVV|þùç|õÕW¼ð ¼ð ìß¿ŸþóŸŽ—3fàïï_áäæÌ™ØÚÚ2qâD¬¬¬ðòòÂÉÉ©Fǰ®òjSöàÁƒÉÉÉaìØ±Œ;–ììì'6þ@PP ÛŠZ­æÿböì98þxîÊjÑ¢Ñë?ÀeÚtÐN4LçB‚ƒ6l(mÚ´!//.]îžH333â¾Ú¹¹y×£¥¥¥ÖO¥RIzz:]ºt~Èθ\Ï ­øý]«‹»¹¹À!C000 //92#]]üuM› ……BAZZ>>>rT !„¢I&„BˆÓëNL}ۅΖ³!zƒ&6ÓË‹¡Ã^«ö)“3¸qãg­ik׬ÆÏo);[0vì8ìlízÛçÌ™ÍË/Û1~ü:u¶à]77F½>ª^Ô«¯¯/&&&ØÛÛcoo™™ .ÔÄ}||044ÄÖÖ–aÆ1`À­å«‹GEE„µµ5ÎÎÎôïß_ŽJ!„B4øôÚ–'½*wéÒ%\]]éÝ»7]ºtáõ×_çË/¿lÐmÿžT*:uÂÆÆ†#F°lÙ2rss¥ñÅWïn1¨lÌòÓuÍ3aüx&Œ¯sÙyó¼™7Ï»ÖëmÖ¬;bb´¦½þúë¼þúë U•SÝ4===æÎËܹsëE”ÿ¥¯¯OTTQQQ:çU(¬Y³†5kÖh¦•¿çµº¸££#ŽŽŽZeNŸ>]ŽL!„BÁ•+WpvvÆÛÛ›ÈÈHZ·n͹s爎ŽfÔ¨Qf?Ëþÿ¾{÷.ÿý‰aøðáìÝ»WkýôSììì°´´dĈœ;wN+ûYþÊnjj*...ôèу®]»2yòd­Áš+ÛžÊÊ«Jùù ñööÆÚÚš¾}ûÝdÛ<** OOO¦NŠ‘‘-Z´ _¿~lÚ´©Ñ´}y­ZµâÙgŸ%88˜¿üå/¬X±B|! !„B!t,^¼x‘pìØ12335±ˆˆ²²²HHHàÈ‘#ddd©ýØêÄÄDöîÝËùóçqrrÒŒ}Tvõ6##C«'¥‹‹ ®®®$''“œœŒ••AAAÕnOeåÕTdd$¹¹¹$%%qðàAŽ=ÚdÛ>^ó»¾¾>¾¾¾ØÙÙÕh{ÆîÝ»µö%88˜6É6¿uë–ÖãÂuiLm_ž™™™<þ[H‚@<O=õ¥¥¥RB!„h0nܸ………ÎXNNŽVÌÂÂB«K8 9AhÙ²%ÅÅÅU®ïøñã„……qöìYîÞ½ ü>FUM¶çadggkÝwþ8ÖÑPqóæMLMM+§1µ}y?ÿüsµÉ!5¹Å )6ºžææɼ~]*C!„ †©©)iii:cJ¥’ôôtÍû´´4Œj}nnnL›6“'OríÚ5RRRP«Õ5Úž‡abb¢µ/åojˆ­ržÆÔöåmÛ¶AƒÉ/$A ¯æÍ[àðê«Ä}õ%RÎSRR"•"„BˆzÏÙÙ???233ùí·ß´ºu3rrrÈÉÉÁßß¿Ú{×ËkÛ¶-—/_Öš–ŸŸB¡@¡P––¦¹o½&Û£«¼š7näææjö¥©š?>ï¿ÿ>[·nå—_~¡°°Ó§Oóî»ï6ʶ¿wïgÏž% €íÛ·ó·¿ýM|ñDÉ-MB¡ÀÒÂ’?Çþ/bÉÌÊ”$íÛI%!„õìd1$$„×^{ µZ·÷±öõõeÉ’%ØÛÛ0zôh.\Xã²=<Ü$Û¼k×®ÄÄÄAXX÷îÝ£wïÞxzz6ª¶W©T4kÖŒV­ZaiiÉàÁƒ9pà€f\!ž”faÁþê9óPŸÿ@ìÿb}{:·ûµÒyŠŠŠ¤¦ë‘æÍ›ÍP(<ݼ9zzÒ‘D—e!<̱ñ ¾Ø»›©Ó]¥„BÔ;³½ó˜1c A¡PhÊ]¾|¹Îý/ëjZö³lýÕÕIeÛSYyU)¿ß………,\¸ØØX 4û(„B!š¾^ñ@jôŒáÄÄDöîÝËùóçqrrÒzް‹‹ ®®®$''“œœŒ••AAAZË9r„;wrþüyÆÇ”)S8tè111¤¤¤0zôh,X µLRR‡"))‰ììlV¬XñP‰‹/ràÀŽ;Fff¦&AVV 9r„ŒŒ "##k´ÿe'æZ'óÕÕIeÛSYy5Inn.IIItaÃGÒ¹³zzr·Éýþ±e³TBˆåwÞyà2ÜÜÜ`È!——§Kàa¤§§Ó¥K®]»¦¹*þ LMMIKK£[·nbJ¥Rk]iii?Ô¶WW'UmÏÃ011ÑÚ—ôôtù !„BH‚@4v……$|ó-#GaûòËR!âÌŸ?Ÿ & P(=z4­ZµâÇdýúõ*¬L~~> ……BAZZË—/$Û¨¹í €ñãÇW9Uƒ:;;ãççGTT­[·fåÊ•šnýcÆŒÁßߟ•+Wàïï_£qÊ´mÛ–Ë—/ceeUã:©j{t•WSãÆÓÔ›Z­Æß_žâ!„BÑÔÈeã&¨´´”ÌÌë˜wì(•!X×®]‰‰‰á믿æ•W^¡G,Y²¤V'ÈQQQamm³³3ýû÷$ÛfkkËСC±³³ÃÈȨ †µM„tïÞ×^{—_~Yó”___LLL°··ÇÞÞ333.\Xã²=<>>bkk˰aÃ0`€|È…B!šéAÐD•””Èmâ¡uïÞ?ü°Ò¸®«òå§9::âè訟>}z—¯lš§§'žžž5Þª)|úé§ ªðtø}Á¨¨¨ ƒ$Öt[gÏžÍìÙ³µâÕÕIUÛ£«¼šî·B¡`Íš5¬Y³F+á „õ]U½ÀêÚwß}ÇìÙ³¹~ýzµÛø8ö£>×McT›ö–võ•œ! !„Bñ„††öHNÞ¤w˜hxí-í,êZ£îA`¬4!7'»FñêæBˆ†¦ª2äJƒ¢©~/>Éï¿óçÏ3tèÐGRV]ô@¨OËš5k† <77·Z ü$ꧺö¾ÿïrÛ¶m0`š§5Õv’ x" !DÓ#4¥.„¢¾(((àé§åŽÞGõ÷ìîÝ»ü÷¿ÿ%&&†ádzwï^­Gô6„ö.ÛµZMnn.}ôï¾û._}õ•4´¨êÝ-ÆJØ; V«µ¦«Õj^`±ÒD3­¾$Œ•&8OœXa›ËbB!„âáâííµµ5}ûö%::Z+žššŠ‹‹ =zô k×®Lž<™œœà«·*•JëJnII áááôéÓ+++<<<ÈËË«ñ á‚ °±±ÁÆÆ ª\_UÖ¯_ÏóÏ?µµ5óæÍ£°°P+_†J¥bóæÍ¼ôÒKtêÔ©Êu}úé§ØÙÙaiiɈ#8wî\ƒmÿV­Zñì³ÏÌ_þòV¬XñDÛþQ¶w³fÍP*•Ì;— .H; IT¥eË–Ä8 5mÿþý´jÕªÞV¤Q;#>úè#ùD !„B<&‘‘‘äææ’””ÄÁƒ9zô¨VÜÅÅWWW’““INNÆÊÊJ3¨kÙ•ÛŒŒ ­VëÖ­#99™¸¸8Μ9ƒ¾¾>aaa5Úžˆˆ²²²HHHàÈ‘#dddYåúª’””Ä¡C‡HJJ";;[ëø~'Ož$..Žk×®U¹®ÄÄDöîÝËùóçqrrÂÇǧQ|&MšÄ‘#GžhÛ?êöÎÍÍeíÚµ¼øâ‹ÒÎuà‡k… òu6£ó× ¸š]@i飯—zÙçiö¬Y¬]»Ç‘#5ÓÖ¬]ǜٳ™Vn4ïò·2þ|öìÙ‹^^Ú#˜W/¯¤¤„eËÂÙºu+ywîàääÈêU«000¨t™+"1Ò‘W_}•îÝ»ëœçjj*K/áHBÅEE8 t`ý T*5û³bE$ï¿ÿ>™™YtëÖ¨÷ÞãÊ•+¬\µŠôôtlzödýúõôêõÌo«B!DC´{÷nvîÜ©ùß)88˜jâñññšßõõõñõõÅÎήÊ2·oßζmÛ077`ñâÅ >œðððj·gÏž=ZÛ‚³³3K—.} ý ÖÚ7ggg–,Y¢sÞÀÀÀ݃N»vípwwgõêÕâ³`ffÆÍ›7ŸhÛ?Šö¾ÿÊ¿¡¡!»wï®tþ¦ÞÎÓθÄ»íŠOÓÏÆ’’R3¬;(tödoT ‚?ýi4¡aa|ÿý°µíÏÑ£G¹yó&£Gªü XNnN.§OD­Vã5sf­âå­ZµšÓgΘ¶mÛâ»hAAÁ¬XYé2†††¬ŒzwO¾Úÿoš7o^ažI“þJÄòp>úèC [•´L IDAT YŸßR6lø£{Ü7ß|Kì¾}´oßž 6òæ[o1lØPöìÞ¥™æ=oq_íàmB!„hˆ²³³µî9/Ø­ÌñãÇ ãìٳܽ{ø½+wU²²²4hÖ´ê–)“““£µ šní¢ü¾uîÜ™ììì*Ok¢ì¤~ï¥[\\Ü(> ?ÿü3íÛ·¢mÿ(Ú»ü•ÿ_ý•¿ÿýï,]º”˜˜iç'lÍ‚7äv—””òŸsW‰9xšVú Ú˜aÒúÑ•_/o1ÐÓÓcæL/Ö¬] Àê5k˜5k&zz•oî¿vîdÙ²0”J%&&&„/[V«xy[?ûŒˆåátìØüý‰ýâ‹j·ÛÞÞž,Ð}ržx4¢¯¯OÛ¶mYêç§•íXµ2 •JEË–-qww#//÷V¬Ðšvúôé‡ÞV!„Bˆ†ÆÄÄ„ôôtÍûò¿¸¹¹1mÚ4Nž<ɵk×HII©öÊš©©)'NœÐtÛÎÈÈàÚµk5Ú¥R©µ iiiµYÿ~å˺víšæJµ¨hÛ¶mZ'÷O¢íu{âååÅñãÇ¥AE=õ”/÷éÆ_^â»Ó?qëΣMéÕ×ë­·8uê;wíâܹyóÍ7«œÿÆZ=KKËZÅËËÌÌÄîåW0Vš`¬4Áæ™^5Î.^¼ˆøøx’’ŽUˆ}ÿý5z4-,1VšÐ©³¹åºFZ™Ð–-[êœV>#ø0Û*„BÑŒ7ŽÀÀ@rssÉÉÉÁßß_+žŸŸB¡@¡P––Vá>ì¶mÛrùòe­iS¦LaÁ‚¤¦¦R\\LJJ 5Úž1cÆàïïONNŽf{ÆŽûÀûW¶o¹¹¹0~üø/«kß›{÷îqöìYؾ};ûÛßžhÛ?êö¾}û66lÀÊÊJÚYÔÚó=TÜ+,¢°¨¤i$-Zðî»®xzzáæö.Š-ªœßÔÔ”´´4Íûò¿×$^ž™™gH&7'[óÊɾQ£ínÑ¢Ñë?À{Þ¼ £ Nçf¼3ƒsg 'ûW¯ü÷¡ïy˜mB!„hH|||044ÄÖÖ–aÆ1`À­xTTAAAX[[ãììLÿþýµâ899iÝ>sæLlmm™8q"VVVxyyáääT£íñõõÅÄÄ{{{ìíí133cáÂ…¼¶¶¶ :;;;ŒŒŒX°`A—Õµo…J¥¢S§N<ÿüóx{{Ó¢E 8 uKÆ“hûGÑÞeO P©T¼ð ;vŒ 6H;‹Z{úé§x„Ãü^n}Þé¹sæ0wΜÍûÆ„ øù-eÍÚ5 V³xñ’ZÅË›æâ‚·÷<—‡Ó¹S'.^ü‰•«VòáæÍ5Ú–ž={2ÍÅ……¾‹´¦çç磯¯@¡¯OjZ¡¡¡]G»­B!„ …B¡`Íš5¬Y³Fë„©Œ££#ŽŽŽZËL/7ÀõìÙ³™={¶V\OOY³f1kÖ¬Zo¾¾>QQQDEEéŒ×t4ûòózzzV[–®ruí›®ùj³MõAM·÷I´ýöwMö¥©¶s]P?ê3ëFB¯±ìÈâÅ‹0l׎çŸï‹½Ã@ììk/oΜټü²ãÇO Sg ÞuscÔë£jµ=®®3¸qãg­ik׬ÆÏo);[0vì8ìlíz¿Ŷ ñ¸HvûÉûî»ïèß¿ëþþç- !„Bˆ¦«Þõ ({laMâåW(¬ÿà}Öð¾fÚ¬rO*¨.^¾,===æÎËܹsx››5kÆŽûF#}ýõ×yýõ×+$ª*§ºiµÝV!DãJXX#FŒÊBˆ‡TUâ´¶WheYBÑdBˆ†ãÒ¥KDDD˜˜È;wèÕ«^^^Œ%½XêÊùóç:t¨T„B<òÄ]’Bˆ†@Oª@ñ ®\¹‚³³3$!!‹/ÆÞ½{¥rêPAAO?-¹_!„Bˆª¨Õêÿ’¢ÞˆŠŠÂÓÓ“©S§bddD‹-èׯ›6mÒšïÓO?ÅÎÎKKKFŒÁ¹sç4±ÔÔT\\\èÑ£]»veòäÉZéT©T|òÉ'¼òÊ+téÒ…¡C‡òý÷߃ƒƒƒ¦Ì””­eÖ¯_ÏóÏ?µµ5óæÍ£°°°Ê}©ªÛ§J¥zâûPRRBxx8}úôÁÊÊ  OE©j?ÊFG®lßd¬!„B! ¡ñÔSOQZZ*!XBBBžý›˜˜ÈÞ½{9þJcfΜÉ|ÀĉÉÊÊÂÚÚš9sæK\\œÖ´©S§êœ_ž| „U{˜gBÚ¼¦eÊçìÉx\ƒü5tÒ·\!„Bˆ*NÖ„´¹h|ä)ºÕ«ÆJ­÷¹9Ù—xÅÂå^mѰþi‘« BñèÉwkýü»÷8Û¥¶eGGG΢E‹ðððFk@ QÏ÷Ÿ°I\âuß°~|CÈ?r²B!„üí«Tii)Ÿ|ò |øá‡¸¹¹Éà’ hÐäÓ+„B!„’’ÂÃÃéÓ§VVVxxx——§‰«T*>ùä^yåºtéÂСCùþû‰ÁÁÁKKKFŒAJJŠf™ÔÔT\\\èÑ£]»veòäÉäääh•)꯺nóøøx ™>}:FFF|ýõ×ZñÂÂB¼½½±¶¶¦oß¾žHT]\¥R±yóf^zé%:uêT£ãàðáà :KKKìììØ¶m[bM1A ·H‚@Í›7§yóæ”ªK)(ÈçÞ½»òÒñB!Dý²nÝ:’““‰‹‹ãÌ™3èëë¦5Ï‘#Gعs'çÏŸgܸqL™2…C‡CJJJ…§Û¸¸¸àêêJrr2ÉÉÉXYY$•Ý€Ôe›üñÇL›6 €·ß~›-[¶hÅ###ÉÍÍ%))‰ƒrôèÑZÅNž7nÜ 77•JÅ{ï½§µ¿•Åš`†@.I€¢ÂÒ3Ò9|è Æ¤sg ¹WJ‡lÙ,• „BÔ#YYY 4HkZ³fÍ´Þ—´lÙRç´ââbÍûãÇÆÙ³g¹{÷®Î2Eݪn ‚ºjóO>ù„ÜÜ\ºuëVaºŸŸÙÙÙtîÜY+K”©.`ffV«ã`óæÍ¬^½š¨¨(Ú¶mKPPǯ6Öôò’   °„o¾e¤ã(l_~Y*D!„ ‚©©)±±±tèÐá‘•éææF@@C† ÁÀÀ€¼¼§Nª6& 2A“TZZJfæuÌ;v”ÊB!Dƒ1eÊ,X@jj*ÅÅŤ¤¤<ôcåòóóQ(( ÒÒÒðññ‘ŠnäE›ïÝ»—~ýúi%à÷Ï?ÿ<ûöí`ܸq’››KNNþþÚÑ®.þ ǧ§'/^¤¸¸µZ­Õ{¢ªXSLÈ’ ÿSRR"·!„¢A™9s&¶¶¶Lœ8+++¼¼¼prrz¨2£¢¢ ÂÚÚgggú÷ï/]ϨTª ¯ºnó?þ˜·ß~[glêÔ©|üñÇøøø`hhˆ­­-Æ cÀ€ZóVã`äȑ̘1kkkÂÂÂX·n]b’ È-B!„¢ÐÓÓcÖ¬YÌš5Kg\×½êÕMsttÄÑÑQ+>}útóVw/¼xôª«óºjóÿûß•nÓðáÃ5÷õ+ Ö¬YÚ5k4ñòWû«‹ëZuÇÁرc;vl­cM1AÐý?{wVUµ>püË|PFDŽ2’š9¤B8˜¦eÞîUº8 ŠS¨™Ššš¦†I¥™æ/ºf¦e”ˆ¦9e¦\®CŠ‚"ƒf¢"rà÷‡qâÈ ÈŒïçyöã9{íµÎÚïÞÏ~÷°T…÷û_ÓL‘B!„BˆÇJcOœ¾˜ƒB_]mW¢ÑP*•’¹oÛä ‹B!„AmP©Š8u!‡oœæY׎˜6kâ  K+r²³ê¥] K+¼¼<‰ýâ‹RCÔV¿Š‘#G2xð`ÆŒ£ž÷É'ŸÇ_|Ñ ú(BñøHHH ::š£Gbhhˆ——¡¡¡ê±Â…BˆêˆØðs£í»¾Ïtu¡M+ ¬k¶m¹‚àæfæ|üñÇŒ?þ±Zï7ß|“€€|||ÐÕÕ¥  €?ü?üPvŠz²gÏ<==«ôcÚÃã^û,I!DMY»v-¸¹¹qçΖ-[ÆÄ‰‰•à!„¨¶WžïÕ(û­¥úz:˜êbݼ毂hT±¿šÊ¨Q£±³wÀÖVÉÈüƒììluù®]ñôîÓ›V¶tíö4Ÿ}¶¸ö¿øßâ×åy÷ÝÅÄ|ô1gΜyä~XXZñɺu<ݽ;­l•ôîÓ—C‡³yóÿÑÓÕ ›V¶xxxrêT²ºŽJ¥âí·Ãyâ‰ö([·a¼Ÿ¹¹¹uÛnݺѱcG¾þúk¶nÝÊ“O>I‡ ¡}ûö´oßž™3gr÷î]u½Ý»wãåå…½½=nnn|þùç•*KMMÅ××=z´F •J%111ôèу֭[«çU¥þgŸ}†››ööö 8“'O6ª?~°´´$!!¡Ì'—–,¯lr øé¿›6mÂÝÝú÷ïO|||˜¸¸8¢££9}ú43fÌÿ•„UòÓO?ѽ{w „BQ‹U‚àÀÏûéÛ·/ …æÍKBB‚º\¡0äêÕ r²³iݺ5+–/¤ÏéÝ»7}ûô!jÑâGêÀ{Ë–¢T*144$ ÀŸÜÜ\–¼û®Æ¼ãÇ«—߸i‹¢"±µµÅÈȈÐùóÙ¾cGÆ·}ûötìØ‘3fЩS'Ú·oÏ×_ÍÂ… ±´´ÄÊÊŠ·ß~[}•Áý˜+ÈÌÌ$''¥RÉ’%K*U–@ïÞ½Q(3{ölöîݫџ `aaQf_+S?22š5kF@@IIIò´¬$Au“pÜÝæÍ›kÜÆðÆoмysú÷ïÀ… 4êãââ‚ÞÞÞìڵ롟BóæÍ8p /^”o_!D¥¬Œ¢îýôS<<<(((ÀÉÉIö…µæ›o¾aÁ‚¬[·Ž.]ºH@„BˆZÖ¨® ÈËËC¡0À@¡ õâE{øüü&ð¿ÿý{÷îQTT„Jõ÷cSSSΞ=[¥Ï{â‰'ãëˬÙoV©bŒ¯/Ó¦Mçü… pêT2ãýüê=æC‡eþüùdgg“Íüùó6l˜º|âĉœ>}š‚‚ŠŠŠ4ÎÒWT–——‡\¼x±ÊϨnýÆœ$ÈÍÍ­—Ñ 066&//¨¨(ùBÔšµk×Î_|!É!„âqN_f_rxÅræÎG›6v 67W7zƒ_Ìëÿö¥=aa Y½F]6)(¯þÏ=tƒùù'3óªÆ¼‡õãQL™Ì3ϸ1bÄË´ncÇ^|áÅzß³gÏÆÊÊŠÞ½{Ó»woZ¶lɬY³ÔåÏ?ÿ<ãÇÇÙÙ™ˆˆV®\Y©²¥K—†³³3ÞÞÞôìÙ³JýªnýƬyóæõò¹«V­¢]»vx{{ãåå%—ú !jUXXéééxxx¨GDQ*•ܺuK‚#„M”±BcC]L u1i¦‡i3=Ìšëcntja¤O c,Œ ªýYùwï6Þ)?_ãdxMÒŠX8¿hÊôîæå=R;w|èåæŸ7Ê]¦¼ÑDý¸sç6ï-]´3Qþ5„ (í·C©Î߯£Ú±m+¯õ“ „¢Á  äýÕÑ\Ë©Ýç$5•ÿ þùg&NœHvv6ééé² ñ— ŸÄ0dØõûiïÿðÈm½<°J˧§]"fíZœeì´µµ151¥}‡Ø98 §§Wí6ÓÓ.±ý›¯™3/¬q=ƒ@!„BˆÆ"22’U«VÑ·o_”J¥$ jˆÄ²iéo‹§:wAO_J×ûåð¡GþÌÉS§7ÊX©T*Ο;ÃO{÷¢£«ƒ=ÚUˆÙÃhËî(„B!DÍKNNÆÝÝ]ý¾:´J¥ò±M<8ÕE,•J%£F*óaÌë¶ ƒŽŽÎ.íñìÿÉ'Oq÷nÍ^í, !„B!jA^^žÆpÂâѤ§§kLuÅÌÌŒõë×Ë Rë6vüqã:÷îÕì³$Að˜ÒÑÑQ?•^!„¢1P*•|öÙg¸¹¹aooÏÀ9yòï!­SSSñõõÅÅÅGGGFMvv¶Fý 6àîƒ^^^9r„ØØXúôé£n3%%E]G¥RIçÎqrr"00ÜÜÜJõµøßÏ~ω‰¡G´þë™P»wïÆËË {{{ÜÜÜøüóÏËlKP'±ŒŒŒdݺuŽ„Öö9ñxÑÓÓC¥*¤¨¨fé$AðÒÖÖ¦U+[®\¾,ÁB!D£ràÀ¶mÛFrr2ƒÖêØ××???ILLÄÉɉ°°0úûöícË–-$''3|øp|||ˆ'66–””† BHHˆzù•+W’˜˜H\\'Nœ@¡PñÐ~Ÿé®èÌ÷±cLj‹‹#-- €)S¦0cÆ Îœ9ÃW_}űcÇÊlKP'±411aÑ¢Ek ×]RCÚçDÕ5ú©VŽe×xüèééÓçÙg‰ûþ[þ—’ŒJ¥’ !„¢QˆŒŒÄÆÆ†fÍš@RR’º,!!Þ½{£P(066föìÙìÝ»W£þâÅ‹±µµÅÐÐ???rss‰ŠŠÒ˜—˜˜¨^~óæÍ„‡‡ÓªU+ŒŒŒ˜3g;wuY°`ê÷ …‚ÌÌLrrrP*•,Y²D68å_…Q±tww§W¯^åÖolûœ#7E=† °·³ç¥¡ÃÙ¹c;W2®H’  -Z˜K„BˆÆÌÌLýÚÐÐPãÌîÑ£G‰ˆˆ ))‰Û·o ¥¥¥QßÜÜ\£~YóJ¶™‘‘A¿~ý4Úx°ÍGÕ²eK÷111,_¾œ¥K—bbbBXX xì·ye®š¨ÍXΚ5‹¡C‡âåå…«««FYcÛç„(“BaHÇ';ѹk7´µåB’²¼óv¨A!„hDüýý ÅÓÓ###rssiß¾}µÚ´¶¶fûöíØØØÔzÿ»víÊúõë)**"!!3fðÛo¿É†­çXêéé±bÅ &L˜ÀŽ;šÔ>'„$÷îÝûëß| †B!šŒ¼¼< 000àâÅ‹DEEU»MBBBG©TröìYV¬XAttt÷âĉL:GGGŠŠŠ4Î*›˜˜pîÜ9œœœdC×C,]\\ðññaîܹMjŸ{œÕÖ=üœ:B!„MÂÒ¥K ÃÙÙooozöìYí6'Mš„««+#GŽÄÉɉ   \+ýþùç?~<ÎÎÎDDD°råJuY`` ƒ–Q ê1–cÇŽ%++«IísBX)ßB!„(WE—¨WæÉûBˆúãïïÏþó¼½½Y¾|9 …¸ÿ`Êâç¶+9OOOÈÈHÞ{ï=rssñööfõêÕ R©˜?>ëÖ­#77——^z‰5kÖ`ll, ‚’ä µ”7¦r¹‚@QÝ6nÜXjx*¥R)U<ø’x‰†HöK!¯+W®œœLQQcÇŽ%44”E‹Uºþ¾}ûÔ#cŒ?ž  @TT«Ã³¹ IDATÇŽãÈ‘#˜šš2uêTÞ|óMV­Z% ‚ŠȤ\ÊryS¹‚`Ïž=xzzVzù„„<<<ä !j€™™ëׯg̘1Œj|ÉCÙ„BÔ´eË–amm ÀòåË0`@•%ë/[¶Œ¨ëÖ­ã»ï¾£uëÖ¼óÎ;tïÞ½Q$d!š8°´´$!!¢¢¢RSÉòÊ&”J%J¥’ØØXúô都½=žžž‰žžzzz´nÝšÌÌÌRmVw’â‘“_~ù%ÞÞÞìÙ³G£lÏž=x{{óå—_>Ò•‡&..ŽèèhNŸ>ÍŒ34ÊïܹCBBgÏžeÖ¬YlÚ´‰ùóKß¾‘˜˜È®]»ˆ‰‰!%%…×_ëׯ³oß>>úè#Nž<É”)SÔ˯Y³†°°0\]]IIIáµ×^ãwÞaíÚµ²ÁEƒabb¢E‹Öƒ»$___üüüHLL$11'''ÂÂÂ4–Ù·o[¶l!99™áÇãããC||<±±±¤¤¤0dÈBBBÔ˯\¹’ÄÄDâââ8qâ …‚ˆˆÙ B!Ä_.\¸ >Yvþüy¬¬¬Ôïuuu¹uë–ú}NN€úýƒõSSS±¶¶V¿·±±áôéÿ‘›{S=ݼùg™'êª3I‚@Q£I‚ê&BBBhÞ¼9àâÅ‹åÁÁÁ¸¸¸```€··7»ví*ÕÎÌ™3iÞ¼¹Æío¼ñÍ›7§ÿþê/âbŸ~ú)S§NÅÐÐ???Ö¯_/[4(îîîôêÕ‹%K–”Yž@ïÞ½Q(3{ölöîÝ«±ÌâÅ‹±µµUïë¹¹¹DEEiÌKLLT/¿yófÂÃÃiÕªFFFÌ™3‡;wÊÆB!Ô¿ag’™™Iff&!!!¼úê+êï§žêÄŠ+¸uë6éééO)• ˜5k6YYYdee1sæ,¼½½ÕåãÆeòäÉüþûïÜ»w¤¤$þýo_I!n’`Á‚ÕNØØØ «««þâ,vøða^~ùežxâ Z·nׯ_/ÕŽ………F;VV÷©­­]ªí+W®Ð»wo”J%:t --M6´hpfÍšÅÞ½{9räH©²£G2bÄÚµk‡R©ÄÙÙ™k×®i,cnn®~mhhXæ¼’W(dddЯ_?õ-<]»vÕ¸mA!„xÜY[[Ó¹s:wî‚M+æÎ«>ð~ÿý•ìØ±¥RÉsÏ  _¿~¥îîÏàêêFÇŽOÒ¢E ÞzkŽº|Ú´i<óŒ;/¾8kë–Œ;Ž!C†4ŠnSظÅOŸØCè*»œC’ÀÓÓ³ÖH@ff&Ÿ~ú)àääT#_h¶¶¶\¼x‘ãÇ« B4Tzzz¬X±‚ &°cÇ2BCCñôôÄÈȈÜÜ\Ú·o_í=Û·oW'ð„B¡iÕª•¬Z¥ùPòâߨ;?ÅO?ý¤Q6nÜXß°S¦LѸýµd}---¦OŸÆôéÓÊ,oÈÔkׯ`ai……¥11É^+D-& rssk}´‚ÂÂBŒÉËË#**ªÆÚ7nüùçŸäææ²{÷nþõ¯É ’‹‹ >>>Ì;Wc~^^pñâEfΜYíÏòññ!$$„ÔÔT HII!00P6‚BQâ`½:gîkúj¹Å Œ ôñ'Ÿ ££ƒŽŽò‰<\ˆZÔ¼yóZÿŒU«VÑ®];¼½½ñòò¢mÛ¶5ÖöøñãY´hIIItîÜ™=z°nÝ:üýýeãŠkìØ±dei^ŶtéRÂÂÂpvvÆÛÛ›ž={Vûs&Mš„««+#GŽÄÉɉ   ÜèâU|‹Äƒ¯…BI4ñ[ öîÝËÙ³gyé¥!ÁŽ;øé§ŸxöÙg5–‹Ž^Çk×’‘‘AÛ¶m™<¹Ìö*³\ñ-‹¢"yå*._¾LvV&EEEDG¯á“O>!-=kkkÆKðäÉhiiðó,\ø6'Ož¤¨¨www&âååY©r!»âñÉ+š×·oßR£&¼þúëUn§¼y£GfôèѲ1D£ùÑÒÒbÓ¦Mó Ä AƒJ%ªó7¢­­ÍäÉ“™àÓ144$à¯K–?þøï„Enn.úúØÚÚ¢¥­M/ww6oþ¼ÒåB!„¢iKNNÆËËKQ Å·•œjºýQ£F•y°%·5I‚@õdݺõ2~üxõûì3ÜÜܰ··gàÀœ(ŠJ— !„Bˆª;pàÛ¶m#99™Áƒk êë닟Ÿ‰‰‰$&&âääDX˜æm¦ûöícË–-$''3|øp|||ˆ'66–””† BHHˆzù•+W’˜˜H\\'Nœ@¡PñÐ~Ÿé®­³Þ¢æ˜˜˜°hÑ"‚ƒƒ)(((s™†´o IQ R¡££Óô}|ÿ~ÿQ£J]^<¯øa…þþ [Ào¿ýFÇ';1ø…<èùÒø•\®Üÿ–-[Êÿ›HûéôTgb>Š!hâßcHûøŒfAØBÛòÒÐa¸ºö$fíÚJ— !„Bˆª‹ŒŒÄÆÆ†fÍš@RR’º,!!Þ½{£P(066föìÙ¥nñ\¼x1¶¶¶âççGnn.QQQóÕËoÞ¼™ððpZµj…‘‘sæÌaçβ!êPm>ƒ ˜»»;½zõbÉ’%e–˾% ‚†6]ËɯܼZZ5{H_ï7Eíúñ‡rË^yùe^yùeõ{---&1)(Hc¹×^{Mã}e—ËÉÎ*÷³ÿýúëüûáØJðÜs xî¹G.¢" >?%AB!Ê`ff¦~mhh¨qÆ÷èÑ£DDD””ÄíÛ·Õ¿ K277ר_Ö¼’mfddЯ_¿R¿5EÝ©«+0fÍšÅСCñòòÂÕÕU£Lö­¦™ hŒ ‹ÈÎÊä—#‡éúôÓèë4­¢é|a !„õÉßߟÐÐP<==122"77—öíÛW«Mkkk¶oߎMõxëêrçÎõÁãõë×e£5 Xêéé±bÅ &L˜ÀŽ;Õ¾%ªî‹F:ÂœŽŽ¦fftzª–( kö6vIÑ !„¢ªòòò000ÀÀÀ€‹/Uí6}|| !<<¥RÉÙ³gY±bÑÑÑUn«cÇŽ¬Y³†€€nܸÁüùóe£=¢ÚŠ¥‹‹ >>>Ì;·Qí[¢ê^:´Ñö][K]}= Ão[B4Èd„BˆªZºt)aaaøùùaccC@@ß|óMµÚœ4i«W¯fäÈ‘dddàììÌ”)S©­wß}—3f°|ùrlll âÛo¿• ×Àb9vìXFݨö-Qu¦fæIÑHH‚@!„xPY÷¢—œ7hÐ  Tê`¯²õËš§­­ÍäÉ“™ŽŽŸnÅ7%›÷\P×ogkÄšoÏpën}Ÿ´bì@'þ—ö'k¿;«ž÷Jï6¬Ú~Z]ÇÑÆˆe_%0²¯=ºÙðÝ/—yÛÕõ:xvm‰Ò¢Ë¿N!/_Å0÷6 îaËÖ—*\‡™ÿÆâqݘùñoe®ßÃÊ«óÙB!„u!ö‹ÿk”ýÖÖÖÆÔÄ”ö:`çà >~”AvûÖ-Ξ=ËáC¸|ù²¤ž´hQc£>NWi73Ðáf^ÁC×ù«—¸}WÀžÿfò\Wu%[’ÿ^Pß½Ì[ÿxR£Í/÷_âöÝûgã:™Å ¶lùYsÞÀ§[iÔùæP7ïÜ/ßv(€Úñm ‚2˜ëszºXóýYþ¸u€ï~IgÚˆ|UɃô¢‡Ì«¨¼ºŸ-„BQ›&OÞ(û­R©8î ?íÝ‹Ž®vvöhëèH‚ ©º——Ké—Øÿ#ýψÞvŒ{Þ™·îÿÛžvnQéúåÍ;wå&oþã) ôtøíÜ5¾=œþHCÿÕ×:üpì2ºÙ2ih{L›ë“ùGßM¯Ôþü !¯>‰ž“?8Rªí‡•Wç³… —–„@Ñd~oËI!_X Ò•k·‰ÙyºÜòI«W8ïÄï×8ñû5ò=‰•®_Þ¼]æÇc•PhYmÖç:AܯéÄýš^åmòýÑt¾?š^nÛ+¯Îg !$AÐT(•JÒÓå{P! !„$d;!„BшH‚@ˆy`*1íP»>˜\þCP'®<$_!ÇùJ„ÚZ÷Ê´«T*ñðð`ãÆhiiÉ6’ ¨þù'Q‹±sçN._¾‚‘‘îîîLðO¿~ý°°´"';«ÖûRWŸ#D©S$CPßW”õB!sfff¬_¿ž1cÆH0šÚïm9#W¦÷$¼qãÇSp¯€¯·~Íåô4>Ä«¯¼Â’%Kek‰Çê K&™d’I&™dMJ¥’Ï>û 777ìíí8p 'OžT—§¦¦âëë‹‹‹ ŽŽŽŒ=šììlú6lÀÝݼ¼¼8rä±±±ôéÓGÝfJJŠºŽJ¥"22’Î;ãääD`` ¹¹¹UîûÃú¶{÷n¼¼¼°··ÇÍÍÏ?ÿ\Ýçâ‹_‹º‹idd$ëÖ­ãìÙ³ÜúÜïDÕéê>ÞÙ7¸Áþý?:{{;ttt°´°`øða|óÍ6àþYýâ‹_¿Ž^ÃS»`ie­þÃzûípžx¢=ÊÖmïç§ñ‡UQyyŸ#DÝ$d’I&™d’©áM ÁضmÉÉÉ <˜™3gªË|}}ñóó#11‘ÄÄDœœœ Ó¨¿oß>¶lÙBrr2ÇÇÇLJøøxbccIIIaÈ!„„„¨—_¹r%‰‰‰ÄÅÅqâÄ  Uî÷Ãú6eÊf̘Á™3gøê«¯8vì€ú2öôôt¹¤½bjbb¢E‹¦  à‘úQŸû¨ºò¶³$ꉫ«+Ó¦Mç—_~!//¯Tyñ%ÿ9ÙY¥.ÿÿõد$$ì&;+€÷Þ[Îñ'HHØÍÿR’Q(„…-T/_QyEŸ#„\A “L2É$“\AP?"##±±±¡Y³f””¤.KHH wïÞ( Œ™={6{÷îÕ¨¿xñblmm144ÄﯓCQQQóÕËoÞ¼™ððpZµj…‘‘sæÌaçÎUî÷Ãú¦P(ÈÌÌ$''¥RÉ’%KäQ‰©»»;½zõ*·~CÞïDÓþ½]+WP4´ µáÓõ¼ÿþJ¦N›Îùóç±²²âÅ_`fHfffÖ ûm,-,Ôï7nÚľŒÅÖÖ€ÐùóéÛïYÞ}wq¥Ê…¨/k§ö– !„hp‚ƒ6Ö{Jþ444Ô8ÛwôèQ"""HJJâöíÛ¥.gnn®Q¿¬y%ÛÌÈÈP?«ØƒmVÆÃúÃòåËYºt)&&&„……1`ÀÙéHLgÍšÅСCñòòÂÕÕµJý¨ÏýN”ÏÜÜœ{÷îáááÁ'Ÿ|‚µõý«Ðõôô¸wïßÿ=³fÍâÌ™3ØÚÚ2gÎÆŽ @^^S¦Lá?ÿùÞÞÞ,_¾…B¡ngõêÕ,^¼˜Ë—/Ó±cG>þøcºtéÒ ãÒà® 055eÞ¼¹ü¼éi—øÏ—±Ü¾}›±ãÆ?´®Æû+W®àöŒ»ú6ö:jÜô°r!„BÑxøûû3fÌŽ;FZZ)))Õ>Ëfmmͯ¿þª¾===´´´ï[×®]Y¿~=ÿýï ׸uBÔLõôôX±b3gÎ,õ,€†¼ß‰ò]¾|™ôôt\\\4nï(i̘1„††rýúuvïÞÍ¡Cô4þ|®\¹Brr2§NâÒ¥K„††jÔß»w/{÷î%++‹áÇÐàã¢Ý;§¥¥E»víˆ|ç¬ú·[¶lIÒÕ· ädg©o?¨L¹B!„h<òòò000ÀÀÀ€‹/ÖÈA¶!!!¤¦¦RPP@JJ 5Þ·‰'rúôi (**Ò8›lbb¹sçd×sL]\\ðññaîܹf¿å344ÄÔÔ”ððp~üñÇr—ÉÈÈ ++ ;;;Ö®]«.ûâ‹/X¶lÖÖÖ´lÙ’åË—óÅ_hÔ_¹r%J¥’æÍ›3}útŽ?. ‚ª:t_½¬¬,T*ééé„-\HîÝÕ˘ššVø$Ñbc|}™6m:ç/\   €S§’ïçWéòÊ~ŽB!„¨K—.%,, ggg¼½½éÙ³gµÛœ4i®®®Œ9'''‚‚‚ú˜o¼ÁÍ›7iÙ²%žž|òÉÇÿÁáÕÿ9nݺUá§L æý÷ßgĈ—ÉÈÈÀÙÙ™Ó§Wº¼²Ÿ#„B!j_YOœ/9oРA 4¨Ô]eë—5O[[›É“'3yòäjõ÷a}6lÆ +³àà`‚ƒƒe›? ¶cZÖgkii±iÓ¦*õ£®÷;Q9gÎœÆØØ˜ÜÜ\Zµ²Õ¸-¤øõÓO?MlìñÃ?0qbçÎÝOÔX[[sáÂÚ¶m  ~~^Yí”ÔPøÚh}ûö¥oß¾.3}ú4¦OŸ¦1¯¬xmmm¦NÊÔ©SËlçaåe}Ž¢î)•JÚ©ŽýüóÏLœ8‘ììl‰½B!š}}}.\¸À‚a¥Ü‹_3–Y³fÒ¶m[õm*Åe¯¼ò2!!3‰Žþ€^}õ•FŸ Ж]C!ă"##Yµj•:9ð¸^Ö*„)ëÒ÷’—À !®–-m<øžyÆM}à^|ð^üú…^à_ÿEË–6Ì›7Ÿ>ŠQ—Í›7kkk:wîBçÎ]°±iÅܹsËl§¢y2Ì¡B<àìÙ³,Z´ˆpëÖ-:vìHPP/¾ø¢§ž$''ãîî®~_«ä !DS%ßmB4^×®å¨_O˜0A}À}ãÆW ¼òÊËõŠË «V­dÕª•e–—l§XYó¹‚@Q¯ÎŸ?··7}ûöeÿþýœ>}šˆˆ¶mÛ&Á©GyyyèêJY!„MSMžÉ¯¯I  %â±°téR&NœÈë¯¿Ž¹¹9úúútëÖMc€Ï>û 777ìíí8p 'OžT—¥¦¦âëë‹‹‹ ŽŽŽŒ=šììlu¹R©dÆ ¸»»ãàà€——GŽ!66–>}ú¨ÛLIIѨóÁÐ¥Kœ™>}:ùùù®KE—”*•Ê:_•JEdd$;wÆÉɉÀÀÀRc7W´å].«T*‰‰‰¡G´n݀ݻwãåå…½½=nnn|þùçe¶%„B! IˆÊnmmZµ²åÊåË ñXØ¿¹O.éÀlÛ¶ääd¬1ư¯¯/~~~$&&’˜˜ˆ““aaaõ÷íÛÇ–-[HNNføðáøøøOll,))) 2„:‡">>žC‡‘••Å»ï¾[­u­ëuX¹r%‰‰‰ÄÅÅqâÄ  ígñ%³éééêéAÇŽ#..Ž´´4¦L™ÂŒ38sæ _}õÇŽ+³-!„Bˆ’!hü“$š>==}ú<û,qßËÿR’Q©TѤ]¿~-Zª–-[j¼‰‰aùòå,]ºÂÂÂ0`€ìàB!„h° ! ‚FA¡0¤ã“èܵÚÚr‘G}yçíP BèÓ§Û·ogܸq܆¿¿?¡¡¡xzzbddDnn.íÛ·¯vß.]º„ƒƒiiiXZZÖZjc¬­­Ù¾};666µ¾»víÊúõë)**"!!3fðÛo¿É.„BIH‚@“žžžDºj»+wïæq÷nž„B4y3fÌàå—_ÆÀÀ€!C†Ð¬Y3N:Å|PêA…åÉËËÃÀÀ.^¼HTTTômÁ‚,]º€ÐÐPFŒQáòÕί6ÖÁÇLJÂÃÃQ*•œ={–+V]ãÛqâĉL:GGGŠŠŠ4®d011áܹs899É/„BI4`rzZQ¯‰eÏž=¸»»ãââÂ[o½U©[ºt)aaa8;;ãííMÏž=k¤o®®®xyyáææ†¹¹y©‡Ö¤ÚX‡I“&áêêÊÈ‘#qrr"((ˆÁƒ×JÿŸþyƳ³3¬\ù÷˜À ÖA[[›É“'3yòä*o“Û.ù¾¬Ï6lX¹Iàà`‚ƒƒeGBˆð°«ÕJ–WçÊ6‰ÄîqH4f×r²17o–VÍžó—+„B!„h@±Bb'j_c½r@¥*äjF‡ }ÇèëÔh\ä !„Q䌉BÔù.ýÿ•‹‹ »wïÖ‰§¨¨OOOΜ9£ŽYC‰R©ÄÃÃ7–=H®Lh8¾Øüy£ì·ŽŽ¦fftzª–( ’ Bù&ë'„âñ`hhÈ®]»4†Ï‹‹£Y³f ¶Ïfff¬_¿ž1cÆÈl ^:´Ñö][K]}= Ão»Nª U…òÄÈJÒÒÒBG[m*3t¹ÄW!„M™R©$**ŠU«V‘‘‘ÁO<Á{ï½Ç“O> @jj*¡¡¡8p€{÷îÑ»wo–/_®¦V©TItt4W®\¡mÛ¶DEEqáÂÞÿ}.]ºÄO<Áû￯jV¥R±xñb6oÞÌ­[·8p ï¾û.FFF•êoU?¯äæüü|fÍšÅöíÛ122Âßß_£ý‡•—Tõ¨o'NdõêÕ ‚Õ«WÄ„ 4âÝPbÉ!CèÛ·/ÎÎÎe.ÓÐö×Ç©™¹¡>÷îÝ#íÒEOœàÚµkù‡e…´µ155£c§§pttxèP‘_!„B<8À¶mÛ011áÃ?dæÌ™|ûí·øúúΚ5k¸wïK–,!,,Lcd•}ûö±eËÌÍ͉‰‰ÁÇÇbccÕóBBBؾ};+W®$11‘¸¸8Œ™7oDFFVª¿Uý¼’/^LNN‡¢¨¨ˆiÓ¦U©¼¤ê®G}zá…ˆŠŠâèÑ£ôèуƒrýúõ Gæ©ïØ™˜˜°hÑ"‚ƒƒùæ›oÐÕ-}ØÕ÷W!´"Î/š2=„»yyÔÀÎß0êßc¹ùçr—)T©¸|%ƒ?ïÃÓ«?vöµ2$CSRX¨âü¹sìÝ»‡ž=zbïà€v91“øÖŽÈðTçoãQíØ¶•×ÇúÉBÑàòþêh®åd×Ëÿ…J¥’“'ObffÀ;whß¾=©©©e¶sçÎÜÜÜHLLT×OJJÂÜÜ\]îìì\j^É6ÝÜÜøüóÏqrr ++‹püøñ‡®Ç£|^ɳàÝ»wgË–-888ðûï¿Ó·oßJ——l«:ëQŸŠ×aãÆÄÇdznÝ:FÅ /¼À¨Q£Êy >cW²nxx8ºººÌž=»TYCÛ_ëÒ†Ob2l„ÆßüS» §¯_¥ã˜_Òh§2ÒÓ.³v- ¾-_ê%b²ý›¯™3/¬n® (P©8þëQú?7{GÙ• ­­ƒS;tõô8°o-mlhÖ¼¹ÄW!„µâäÜ¿7½  @ýþèÑ£DDD””ÄíÛ·J=$®øÀª¸~YóJ¶™‘‘A¿~ý4ÚЪ̽Ÿøy%eeeѦMõ{;;»*•—TÝõ¨o#GŽdéÒ¥|ýõל:uŠuëÖU¸|C‰Ý¬Y³:t(^^^¸ººj”5ÄýUˆ:æ°¨¨ˆœk9´ic'¯"eëÖ\ÿã:÷ÊùCâ+„BqŸ¿¿?cÆŒáØ±c¤¥¥‘’’Ríg3Y[[ó믿’žž®žÒÒÒêd}¬¬¬¸té’ú}Éו)o(ëQôõõ7nS¦Laüøñèëë7ŠØééé±bÅ fΜInnn“Þ_…$ª¤°°°ÜKäEùtuõP©TJ|…B!*——‡\¼x‘™3gV»MBBBHMM¥  €””ëd}†΂ ÈÉÉ!;;›ùóçW©¼¡¬GM™4i©©©5ªØ¹¸¸àããÃܹs›ôþ*$AðHŠŠŠdªâT[ñOH «ë3Ó÷?ü(1„¸ !„¢þ-]º”°°0œñöö¦gÏž5rPêêêÊÈ‘#qrr"((¨Â‡ãÕ¤™3gbjjŠ««+ýû÷§W¯^U*o(ëQZìÆŽKVVV“Þ_›ü»wJUP+q©“‡Þ½{—Ï7~Æä©ÓåÀë¬Zñ#^~3só‰oAAソ’Ï¿ˆeÐsýxiÈP~=v”¸ï =ó=º?ͬÓqþëá&«¨ˆ0yH¡BQB}?¤PÑ44„‡–7üdC§­­©‰)í;tÀÎáá£ÝU6&uúBQÿù…ï¾ÿžíß~§ž÷í¶-ªT˜š˜ÑÎÙ…';vâƒèÕd^¾„÷¿FðêË#1t(;´— ŠzSÑEÓÙŽå=‰Z!„¢¦Mž:½Qö[¥RqþÜ~Ú»]ìììkôVóŸ š<‘k×rÐÖÖÆÒÊ’ËVÊÞ\E»v'òæÞžÿ/½0SScnüy áƒèÕ:x˜NO=‰÷«#yíµ×صk£Fÿ‹ÜÜ\233å;†è•ïóŒkO ¦â‘BÑ¿÷Ê#߇BˆÚ ££ƒ³K{ttõ8¸?-[¶Ä°YóÆ™ x”{»sr²‰|'Šßÿ˜ÖÊ- ß7ç°rÙ"¬­Zríú5rso‘šzžƒæ×£Ç¸rå çÎãâÅ‹¼òÊ+tèÐæ¨T*:=Ù‰V­l œ̱C$È¢Vœ={–E‹qàÀnݺEÇŽ âÅ_”à4"òcX!ß{BQ7Z·±ã×¹w¯ÃlW»±@[»öºª«Ûôï´ptt"3+…B±±1vmì±µµeð ƒhÓ¦ ^ý=qtt$%%…vÎ.\ÿãzzzص±ÇÌÔ´Ñ­ïã°M›ŠóçÏãííMß¾}Ù¿?§OŸ&""‚mÛ¶Ip„B!„(ƒžž*U!EE…5{Üý¸pÉ’%°dÉ’Re5÷Ȇz`jhhH÷§{`hhHAA6668:´ÅÓˉA 0€'žx‚îÝ»c 0 ­£NŽÎœO=ϵë×Êm÷ÆLŸ>ggg VVV¼üòËìÞ½»^×·&·©¨]K—.eâĉ¼þú똛›£¯¯O·nÝX»v­ÆrŸ}önnnØÛÛ3pà@Nž<©.KMMÅ××=z4ÙÙ?@K©T²aÃÜÝÝqppÀËË‹#GŽKŸ>}Ôm¦¤¤hÔùàƒèÒ¥ ÎÎÎLŸ>üüü ×¥¢KM•Je¯ƒJ¥"22’Î;ãääD```©1˜+êï£Ä¬X~~>Ó¦MÃÙÙ™®]»­ÑþÃÊKªÎz!„B”EF]k ‚ê®ô£N¥R±fÍ–.]ʇ~ˆJ¥ªÕÔІ9ìØ¡;¿ÿ‘´´K´ut¢³ V–Ö8µuBiÛš~}=ðÜó¼0è\{¸aÑ‚ÓgÏrìøo$%äÆ7011.³íþóŸäççóã?’››ËÉ“'yíµ×—?8Q)û÷ïgذa]îÀlÛ¶ääd¬1V°¯¯/~~~$&&’˜˜ˆ““aaaõ÷íÛÇ–-[HNNføðáøøøOll,))) 2„:‡">>žC‡‘••Å»ï¾[­u­ëuX¹r%‰‰‰ÄÅÅqâÄ  •îï£Ä¬ØâÅ‹ÉÉÉáСCüøãüüóÏU*/©ºë!„B!h‚ >|ÿý÷˜››„……qqqå%‡†ÈËËÃßß ,,, ¯Ä0we #Q<¯ä¿%—S©T¼õÖ[ØÚÚbbb¨Q£¸yó¦Fý+Vàè舾¾~¯ÿ?ÿáÍî= èéësñR*ñ»ä¿I‰œ9{†³çÎpìØQ~9z˜¤SI<|Ÿì'õÂy®_»ÆÕŒ 6þß2h`™mïÙ³‡ÈÈHÐÑÑÁÊÊ oooâãã+³â×K–,A©TbjjÊøñã¹{÷n•ʌ߃íøá‡´k׎æÍ›Ó¥K~þùg6lØ@‡hÖ¬=zô ))Ic›‰ºqýúuZ´hñÐå"##±±±¡Y³fhl¯„„z÷î­¾…föìÙìÝ»·Ô©­­-†††øùù‘››KTT”ƼÄÄD: .ÄÒÒKKK.\ÈÖ­[+ìãÃîE­ëuؼy3ááá´jÕ ###æÌ™ÃÎ;+½m%fŶnÝªŽŸ•• .¬RyIÕ]!„BÑÈ“&Od”Ï?KMÅ÷¿kiiajbÊ¿F¿¦1òù'“‚'VØöš5k  00°ÂKYçÏŸÏ•+WHNNæÔ©S\ºt‰ÐÐÐJ­Ã½{÷Ôÿ¿ˆŠŠâرc9r„ôôt o¾ù¦FÝ#GŽpäÈ‘‡^Âü(^xþyŽ?ÁÔopðÐìíÛ’——ÇÍ›7ÉÌÊÂÔÌœì¬k¤$ŸæÆ7((P‘7Ÿý“ò¿Óèjk3cZÙÀôêÕ‹ÀÀ@:Ä;w¹ûöíã·ß~ãÌ™3dff²`Á‚*•?,~ñññìÞ½›¬¬,þùÏòÒK/±sçN~øá²³³yõÕW ÐØf¢n˜››síÚµ‡.gff¦~]|«L±£G2bÄÚµk‡R©ÄÙÙ¹T›æææõËš÷à­)mÚ´Ñx••U­u­ëuÈÈÈ _¿~(•J”J%]»vÕ¸m¡2Û¦ª1+–••¥?;;»*•—TÝõB!„•Ó`n˜ÿóæŸD¾Sú ¬¨¨---ôõõññy--­Rå«V—?ôáùóç9zô(±±±Œ9’Ù³gsáÂJ-ÿÅ_µµ5Ë—/gÀ€,Z´è‘×mݺu|÷Ýw´nÝ€wÞy‡îÝ»³jÕ*õ2ï¾û.VVVµãç<ûñÅÿmâãÖbÚÂ]=Í« îå£*(@¥*  ÿ.7nÜ@ÙÆŽ¬ë–Ûæ—_~ɻヒ¿¿?¿ÿþ;ÖÖÖ 6ŒyóæiH<̲eËÔ1_¶l 22²Òå‹_tt43oÞK«––t{ªVæÆ4Ó×&óò%ŒšéÓ뙞ܼñvvvѽ[× ãÛ¬™!¡¡óùå—#dgg±mÛ×ܼy“üãUŠ™­m+õ{[ÛVdddT©üÁø=ؾ±±‘ú½®®N™ó 4¶™¨3fÌ`ÕªUlܸ‘?þøƒüü|Ž?΄ *ÝF^^pñâE{û«cÁ‚äää““Chh(#FŒ¨pùŠRXëàããCHH©©©’’B```l×áÇ«ã—Íüùó«TÞPÖC!„M_m?h¾1°V§=-**?Scbl›sf—9ܸñhiiñÑG1üyóO´´´Ô@Ë–-Ël7//M›6qòäIìíÿ¾|õÂ…T<<<˜;÷- …FÉÚÚš .жm[àþVVVêr]]]nݺE³fÍÔ——üüûbccÃîÝñØÚÚ–›µª‰ VEñ…û÷âëèè`ddDË–E´siGî­\ÌÌ͸xñ¦¦¦èëë£R©(,,DKK mm-ubæÁ«7ÊÒ®];/^DëÖmª³’1OMMÅÚÚºJåå=в²åΓ3•uÇÑÑ‘ØØX-ZDDDwîÜùöî<.ÊjàøgföUQÐÀ%MÔrISSËÒ´ÅJ»×²¼.ánh¨i.˜ˆkЏb‹KiRVfÝ›·Ÿ[æ’™)¹/)Wdm–ßÈÄÈ2æß÷ë5/fžóœç9Ïy†ó³Ð¼ysFŽiñ1-ZDXXÆ ÃÛÛ›áÇóÝwßU¸líÚµ£{÷îdff–:!_e¨Šk=z4Ë—/§ÿþ$%%ȸqãîÉ}8q"'N¤]»v8::2|øp“ÕMÌ¥?(×!„Bˆš¯²Wµ»ûxÕi…µ{Ê(yvø… »=xÄÛ¨Õj ™·3ùä£OKh=îW_}E›6mðó«o’îïïÇ£¶æ«¯¶ðúëLò¿òÊË„†NdåÊ„††òꫯÓ[´x„ÈÈHÆŽÇõëéLš4Ù$¿‹‹ gÏž¥Q£FÆó 2˜1cư`Áêׯϙ3gX°`!k×~Z©‚’ê·ð¸|N‡¯¯/çÏŸÇÕŇ~˜¸¸8lmmQ©¬P«Õxxº“ššÊõë7ÈÉÉ1އ‚^½žcذ¡têÔ www®\¹Bdd$mÛ¶µ¸Î&MšÌŠËï4&ѯ_¿2¥Wv€`ÈÁòIy5jÔˆ>ú¨ÄôâztÞÖ³gOzöìi’>xð`‹ó—´mäÈ‘e T”Öóä~\ƒR©d̘1Œ3¦Ì÷¤<ç+üÜÆÆ†ÈÈH"##Û ëo.½²®C!ªF#=¥.Žh™Váƒê<|AyooBù–9T«ÕØØØ”9ïêÕÑ 6´Ø´!C†]diÂiÓ¦áååEPPK‚‚ZâííÃûï¿oL_º4Šï¿ÿFÃÓO÷ K—.&ùÇŽKçÎ]prr6n áñÇ;лw¼¼ê2xðúôécñÒˆå­_N‡V«åöíÛ&û¬`mmƒƒÎÎθº¹Üéa 4 ¨TùÝñ¯\¹ÂíÛ·‹,9iÒ$¾új =Öwwž~úi23o³nÝZ‹ë  C‡Çi×®=Íš5§N:L:¥Lé¥-7i.½¸m!!!ò©)„Bˆ*i´ ©KqÿݽêYáçÑÑÑW;;vì˜1ýâÅ‹ôíÛ777éÓ§ÉÉÉ&ǹ{U»²®šWÚù«ÚÓƒ 4*• +++ãü–Ú½{W‰œ‚oët:J¥Ò¸­­-Ë–E±lYT±Q   üüóÏ&iC† 6¦¿ûîÞ}w‚I…BÁøñ!ŒRì1oܸ^%=´Z-YYYEf^/Xm `ßâ–tvv¹LÈï}’’‚R©ÄÝÝÝ8›9@—.éÒ¥s©‘3su0nܸ"]†-M/®þ o3—^Ü6K†SQSÿ©’o[„¢ò>kïþL-üZ¾á®Øß*©KQUöìÙÞ={puueñâÅ >œðâ‹/ÉÆÉÍÍ%,,ŒÐÐPÖ­[G^^jµÚdE»»^5Ï`00xð`f̘a2)~iç¯Q‚²~#~7…BañXxK;v¬ÈxöêêîúÕjudee‘––?æ¿àZ0ïBinÞ¼ƒƒ:Cþ$W®\ÁÞÞGGGc~WWó«\¿žnqÙ+’.De«éÿdÈ?QB!ªÓß* ˆ{)**Š:uê0~üxÂÃÃi±±±ÆçvvvÌž=›ÀÀ@‹mɪy¥¿ªU‹!999äåå¡R©Štq¯èãÙg{2vì˜J=fe?Ê[¿¹¹9wzä1pvr6î«ÓéŠ=Fff¦ñy:n\¹rÈï “››kRÿéé×Ì>,½¾Š¤ßïzB!Ľ¡ÑhذaíÛ·Çßߟgžy†'NÓãââ4h7¦aƼñƤ¦¦šä_¿~=:t AƒtïÞC‡C§NŒÇ<}ú´ÉÿLÀˆ#ÈÈȰ¨¬? ^x{qé…•÷ܵéý u)*¢¤ÐJ\íìçŸæÉ'»àêêŠZ­ÆÅÅ…ÔÔT‹Wp³dÕ¼ÒÎ_žÕîÊâž1 Œ /¯†È¥KÐëõ¸ºº¢(h W’¤+ÿû»u]í™Ö¯A¯G¥RacmMPóf¬ùt==ŸîŠ6O‹··Ù9ÙܸqÃä—ã/Ó¥KìííHIMçì…‹øÕ«‡£ƒ¶66¨”ÊJ¯«ôki¥Ó\ºB!jýû÷³uëVœY½z5'Nä‡~`РAÌž=›U«V‘——ÇÂ… #*êï¡£{÷îeË–-¸¹¹±fÍH×®]‰‰‰1n eÛ¶m@þ7y±±±lß¾'''¦M›Fxx8¥–311±Ôo½Í¥WäܵÔe ¸‡W’H¼’tï[O%Lj^Údæ$"b=zôÀÉɉŒŒ |||-ÎonÕ>>Œ7–-[¶Ó VµËÌÌäæÍEòO›6wß %(¨%}ûö5®šWëÈØî{Z¿ …•J…½½=ÖÖÖ¸¸8ãííÍs=ŸE¥R¢Tæ/ih0P(Æ×z½­V‹N§G¡È_¯ÜÊÊ µZmÜ_!„âAÌŒ3èÖ­ŽŽŽdddдiÓ ÓËË‹mÛ¶áíí}ϯç~ž»¦‘ºwóõõ-vÕ3s«õîݛ޽{›¤¿ýöÛ¥®jW8¿¹Uó,]­ª<ð“ÊÃP¡úP*•X[[ãì쌛›+nn®8;;ãè舃ƒƒñ§]~{{ã¾®®®ØÙÙ‡+H½ !„âA• 666\¾|™‰'Vø˜$44”¸¸8´Z-§OŸfĈåuvvæÂ… åN¯È¹k©KQV½{÷–öÊý (•JôÒØ/óC§Ó¡R©¤~%@ „B3-ZDXXôë×¶mÛVø˜£G¦]»vôïߟ€€FE¯^½,Ê;bÄzõêUâÌúæÒ+rîÚFê²fÙºu+éé¦Ë¥_¿~ÿûß•vŽ)SÞ“öJ1îÉ…B›[.ã^hR@aÞµôkÔ©ãŽB©”úB!D­VÜ,õ…·õìÙ“ž={š¤<ØâüÅmS*•Œ3†1cÆ”¹¼cÇŽeìØ±%Û\zEÎ]Ûî½ÔeͲ}ûvæÎ›Çw[·âêêBzúuúõëO‹-èu×ïxy9ØÛËJi÷+@ R©hÙªû÷í£ýãðððIAÌ0 ¤¦¦rè׃´iÓkk©_Qk™[ºHH !„¢æX¶l#Fޤk·nôêÕ“ÿû?txüqæÏŸW©í-qßJ||}hÙ²GüÎ7ÐétRû¥Ö™ W77Z¶l‰‡‡¶wfÙ•úB!„x0”Ô « T*Y¾l#Ge¤_ IDATbùò 0€E ä7ì+a Üç(°¶¶!°Q õêÕG«ÓVÚ­ÉJ%Öj5vövR¿÷Á†õŸJ%Ü#çÏŸgÞ¼yìß¿ŸÌÌLš5kƨQ£ŠÌ+ªç?ÏòO²¢¦’Ï7!ª6H°,*Š':v¤oß—*eyC <‚|*•ŽVRëR¿B]¼x‘~ýúÂüùóqppàĉ¬\¹RB!„µ·³³3ùãqøðaÂÃÃ9~ü8·oß(ÒåÌÍÍÍ$qÛîþƒT¿~}“ç)))ºÖ{} IIItéÒÅäåéŠg®lkÖ¬aÉ’%,Z´gggÂÂÂèÑ£‡¼¹…²þ“5R BÔ¾>¾tìØ‰û÷ñý¶ïJ]‘M¥RáîîN‡Nðõñ-÷97oÚX-ëJ¥RáâêÊ#-ÁÃÝ[;Û+@ T*+}Â!DíÑ©S'¶mÛÆ!CÊ}Œàà`f̘A·nÝptt$##ƒ¦M›V¸lñññ4hЀ„„<<<ª¬ªâ¼¼¼Ø¶mÞÞÞUZ¶V­Z±víZ »víb„ üñÇòæB”[ŸûJ%QËø7h€ÿÿ»î…ç_x¡ÚÖ•R¡ÄÊZ­­]¥»ÂWWRS’ßf !DYL˜0—_~úô都½='OždÅŠE&*,Ivv6666ØØØpùòeæÎ[)e›9s&‹-`ÆŒôí[ú?¬YÒ¯*®aàÀ„††2{öl4 çÏŸ'22’•+WVjÙFŽÉ;ï¼CÆ ó'Í)Ô‹ÁÙÙ™ . ov!„B<0\\ݤª"@ðp³æü²{nŠ«[ Í$)„¨}6lHLL óæÍ#<<œ¬¬,š7oÎÈ‘#->Æ¢E‹ cذax{{3|øp¾ûî» —­]»vtïÞÌÌÌb'1¬LUq £Gfùòåôïߟ¤¤$7n\¥—íÙgŸeèСÄÅÅ@TT”1mĈôêÕ‹ÌÌL™¨P!„â§Ÿ5Ý0n|(9ÙÙå>HjJ2çΞåæë2Ü@Ôq—ã¨èïFy|¿õÞÊ(T'Û¾û–)ÓÂ*g’BO/<<½¤fE²jE”T‚B!„¢ÖU „¢Òh4%¦IÏ !„BˆÚIBQ ÉB!„w“B!„BˆZ%7'§ú^¡@¥R¢RU~s^B!„B!j•˜Í_TËr+•J\œ]húðÃø5h€Z­®ÔãK€@!„B!D­2æñÕ²Ü:Ž‹Îñóž=¨¬Tøùù£T©$@ „B!„BÔ&*•ŠÀÆMQY©9ðË/Ô­[;{‡J;¾RªX!„B!„¨>êÕ÷ãútòò´•z\ q‡»‡§T‚B!„â§V«Ñéô úJ=î=bPÐKKM©5 ΂k5÷ZXN¯×ó¯ÁChñÈ#¼ûî©!„BXö?„N‡V§ƒA*£&(Ãlîz„ô<2s hõ ©»êëQ) Ø©ÁÏÝe¿ú6Èg@Õ º;w曯· P(jU@àAºÆêZßåV(8::ÒÀߟîÝ»3rÔH<ÜÝ‹ì?mút}´5ãÆŽ•ßb!„BX$//Ä„Nÿ“ôôt©j®¬³¹ŸOÉ寄þ8y‰œJî–-îk+Z7õG§¯K ·4ú”A½{÷òÉ'Ÿ0dÈ÷©Mß–›»Vé9P|}ܾ}›ó.°iÓ&ž|²+ÿù÷¿ñó«o²oøìÙRaBˆI£Ñ˜˜Xît!Dñô:)ÉÉ9ò;ݺuÿaªJœù[Ü{e™Í=>-‡Ä¤küöçÞèý-ÕG¥’ÑÖÕûþëùíÄ%b~:н­ ÎŽuñtz©¨Jý­xú駘6‹‹—.•¸»‡'§§£©W¯ºÞ\½zÕ˜ž””„W]o4õꓞžŽÁ``ÅŠ•´iÓo_‚Z¶"réÒ"Ñ¡U«VãîቧW]nÖœñܺu«Èy‹+KiÌå+œv÷¾æŽwú¾ýûy¶g/êÕ÷CS¯>¯öëÏλ,¾ÎÒÎmI=ZRG¯?úè#‚Z¶ÂÃÓ«Lug {{{‚Z´ bÎÞxãu"""Lþ|ðÁlš4iЦ^}†FFFééé4nÒ„ëׯ›+==&Mæúõë%æ-NNNŽ|:TqH£ÑTÚ~B!„9ZŽØ£GéþôÓ<ØX‚5@ÁlîÝžzšS'N’““]â¾9ðëŸ1¨O[mê/Áqÿ•<ô¯÷jãçHÏ”^!\€ jéRììl=z4z}é“%¸¹¹Ñ¯ß«èt:b¾üÒ¸=æË/Ñétôï×777–-_δéÓiÿøã\ü믿>€Y³>`ÅÊ•&ÇËÊÊbÿ¾_Hˆ¿ÌûS§²~ÃÞ›2ÅdŸÂCÊ¢´|…{¤¥¦T¨WÀÛosøðaÖD¯æÂùsŒš5k,¾ÎÒÊbi=ZZG§NæÀþ}¤¦$Wétào°{ÏãëÅ‹—pôØ1víÚəӧ°µµ%,lnnn¼ðü ¬[¿Þ$ÿºõëyõÕWpuu-1oqÂÃçȧƒ¢R¬\¹???VÞõy+Ì+J PT ƒké×ðók uQÃX2›»Î  ;7æòyRÓ´l¬!+7Ü<]? ÕþñÀ¼¼¼Xüá‡<øk‘†g± âaoçbbþÄ|y§±< €O>ù€w'ŒÇÎÎŽáÁÁ|üñÇ&Ç y‡&Mš`ccÃ?þñÿýïM/VY¾Ë-o¾²ÊÈÈÀÆÚ___J%;t`Ó¦e¾ÎâXZ–^ë”)Spp(½OE&uëÖ5#øÙçŸ3on¾¾¾8::2cút¶}ÿ=ÁÁoóÉ'Ÿ¢ÕæÿqÐjµ¬[·ŽÇ›Í{·-_]c>4wïÞB¡°ø±{÷nùK#D%Ñëõ¬_¿ž™3g²aóÁsa*11Q†SˆJÿ”ž5%³¹´¥¤ç@Íce¥2¹Çâ ôîÝ›×_Àœ9œ={¶Ô}›5{˜N:qòä)bÿü“ØØXN:EçÎyøá‡øßÿ®Ð¦m;Ü=Ïãß !ž^xÕõàÚµê5ùÌ”÷ÞC¡TÒý©§©_ß§žîÁžBßžWä:-©Ç²pw¯sOêäêÕ«Ô©ó÷¹®\¹BûÇ;‡/4}¸©©©4jÔˆ¦M›°m[~£ÿ»mÛh×¶õêÕ3›÷n))5g~ˆ®]»²k×.<<<صkW±ÑÇÂé]»vµøØkÖ¬A£ÑP¿~}Z·nÍĉM†öìÓ¾}{üýýéÖ­_}õU‰Ç2·_Á7‰Ÿ~ú)mÛ¶5Þ[ƒÁ@tt4;vÄßߟ¶mÛ²|ùr“Èêxþùç $ €˜CÌ¥ Q»víÂÅÅ…ÁƒãææVä=•››KHH´jÕªH/sé†5kÖЦMãïƒN§#""‚   1b„Épª;wÒ½{wüýýiß¾=7n´(Mˆšä^~×ràÇÞŸOvf‹« _X[³ÙÖ–í­[rxÌhâ¿þƒ^_#¾Í¬.ߤJ}Õîû_ö„U­ú|¬’ZÄœ9øx{3rÔh³ûßé)°yóf¾Ø¼Ùd[þ??¾œ>uÒøtZj )ÉÏ[0dÈPù¤ñuݺu9þg¬É5æ0<8˜ÕÑѬ^ͨѣ,Î[˜§§gúEïÚµ+_~ù%ýúõ+Ò@Ù½{7ýúõãË/¿,Spò‡¼ìÚµ‹óçÏ3iÒ$>ÿüs¦OŸnLÿøã™9s&AAAüñÇlÙ²…ü±Èq,ݯÀéÓ§Ù½{7 ù®U«VF»ví8}ú4ÿøÇ?˜3gÑwÞ £FâÈ‘#,_¾œ'N0vìXcÏKÒ…(µk×ò¯ý €·Þz‹O?ýÔ$}þüù¤¥¥qðàA~úé'öíÛW¦t€#Gް}ûvãïCTT±±±lß¾cÇŽakkKxx¸qÿqãÆ1aÂÎ;Ç×_Í‘#G,JB”63“ßÞÆ/Ïõ$oÛ&ü¬3èÒ» }‚ûðÌ€n4ÕØbõëO7’:’YÊ^âÁõÅÿÅÒñíÕ´º’vCVÐvð Ú ^N›ÁË™ºú'© (|ƒJÕ&@àààÀªU+‰5»oÏž=ñó«ÏW_maËW[ð÷÷ãÙgŸ-@Èï ?3l7nÜ ##ƒÿû¿¼Ú¯¿I£ÀÙÙ™œœ>(f†ûþþlß¾Û·o3oþ|‹®Å’|ÎÎÎ\Š‹«P½½ùÖ Nž<É#ûìsÞ›<Ù˜ö¯Aƒ ÏÅK—Ðjµœüb3†vãñϱ`læŽéCÄèçyop/¶ÿzV*©(nyÌ‚m…Þ/;;›àà`ÜÝÝqwwgøðádgg›äŽŽ&00{{{Ú´iñcǪE}TÙ œ¶mÛòŽù(• :”ÔÔTRÓÒ2dˆÉ8øàà·ùðÃEüùg,MnÆ#-‚XóÑFaÜ'zõ*7nÌ‹/¾Ä:PäüöÛoØØØðØc±eË4hÀÅ‹éÔ©“ñ=n.]£Ñù}hÛ¶-Û¶mÃÛÛ»Ô2Ì?2aÂþøã‹Óî‡â®SÜcG`éò•\KK­veÏÍÉ!fóŒRe]s z=?µy oCõx`¸t +¥•••Z‘ÿS¥èutZº¼üŸzï†dè¬ùí×sô<~;_ß²­¬¬ŒB?H–/]Âó/¼€‹«[±é&ä²eû~–¼ûr¹ïÿÎßÿbÆGÿÇÞ•ù­kuzž^Í’>ìüã29ZÈÕAŽVA× Â?ú‘C¨õ¿…,ú†WžíH‹zÖf÷MLˆgMt4FFùßönüß½­¸tvìØA``þ¼nçΣG\º3TH­V›Ì¥vûömÜÝÝÉÊʪÔë^YêûÞR‰ ñlûî[¦L C¦ñ¢êÚµ+åƹ*œœœÈÎÎfîܹEö){ýÁžžNzz:³‹cé~%2dáááܼy“ŒŒ vîÜÉ€Œû :”Ó§OÓ¼ysžxâ lll,N¢,¶nÝJëÖ­M‚ß eË–|÷Ýw¼ôÒKÌœ9“´´4RSSMæð°$½8$44”¸¸8´Z-§OŸfĈ¿ÿA9r$gÏžE«Õb0LþÑ,-MaÞé… !ù ¾ }Ð^8ƒB¯G¡…”JPªÈX)Pª(• J@†„¿pp´ÁOãÆ¯o”Ê|€ °òëCDÆì'+çïÏE¥BÁ`@o­tzÐêèôpýÆ­ S¯×Ó¯_¿2ý?TÁ‡Ú$77‡ÜÜ“çÅm+.ýêÕ«h4¾Æ×/W¯^5Éãèè`|me¥B«Õ9NEUABÔRæ–©4gÙ²e4jÔˆ~ýúѽ{wzè¡"û :”iÓ¦qôèQZµjÅ‹/¾È3ÏÌþÞ½h×¶ º3G±Rç+¨óŬZ´Eé,9ãz£º‘u¼°Zü=JÿÆhîçÖ¿žA›—?ÜÿÆœ=ŸB·ÇÐôÝw‹"ôzš4iÂ;ï¼Cdd$§OŸ6™¿«ª×ÝúA`®«uá!–ÞÿÄ”›Œþð{šÔãévMp°Q1fþ—%î¯R)èѶ“>Iê úOý‚_?ú{ÜyïÞ½y衇˜0aõë×çÚµkìÞ½›U«V±cÇŽ{Zÿê},¯ñ~[æ!sæåOÈÞ¥Kž{î9ÆŽÇõëéLš4™o¿ý–[·nP¯^}víÚI£FŒÇxï½÷8wî<+Wæ™LÓ¦M™3gNNÎÆüŠÛVQŸ¬‰–!B!„B€­óÞà¿KþÅÞ•ÁÌÒŒ¬t:=J¥Â䘻wï&""‚  R©ðôô¤_¿~&ÁsuZ–úÏËËãÝwßÅÇÇOOO/^lr?ïž™¿2gé7—þ ¼w ¾…_º4Šï¿ÿFÃÓO÷ K—.&écÇŽ¥sç.899·M›6 ///‚‚ZÔooÞÿýу@B!„BTPê/¿`o¥@—q+¿¡¯7äOD˜’Ä!½ŒA»÷ƒo÷B—œŒ^zýGföŽö\ûý÷bϳjÕ*FÊ_©iĈ¬\¹²È>æfO¯¬ÙÕçÎË‘#G8t艉‰ØÚÚòÞ{ï™6´âСCäææV›{ùÙöcLÿhýz=o]Îÿ/½ÞÀÉË78“pƒ³ 78—xóÿ»ÁÙ„tÎÆ§qòRIi·HIÏàLÜU P(L;vdĈû̘îêêÊ¢E‹,®‡Í›7óá‡âååEݺuY²d ›7o®´÷ÙƒðÞ©ìÆúýxT+ù8B!„µ…V›W%“±¹vè@Ægg¨ãàˆAgÈ_½@(@éáÓ Æà€ÂÚÇù¸>¨'º«WóºüAmCÆ[87nTd–òåË—“’’‚““S‘íááÏv_0{:`2{º¥éÅÍŽ^\zbb"Í›77ÙO¡P˜ìëáá^e³­WÅýÏÎÍè<\+C®Ž™Z°R°S+°U+°U+Ï z(ÁÖFMRÚ-ü½]M®ÝÞÞŽ3¦3cÆt çÎ#2r)¯½öß¿Íâ:µ´þ¯\¹bœi¿8¥Ýç³ô&³ôWÆûìAxïTU»º“B!„¢Ö0ªæ›C×Ç#Cµ ú;}Ö€ÁÕ ·õ?bõP´ÎöJ'´Î`õP\>ýƒ«—±Ngµ7oÜÆµCG“ãgeeñùçŸsâÄ 22nÇç³Ï>#++Ë¢±ÏæÒË2£»··7gÏž1)Ï­[7«tÌuE¿I5wÿ#ÞîFÇê±yÛÔhñs·'#KGBZ672µdçêÑê(ô0 ½àÑéõ¨­”¸8رé§XžjÓ°Ôò6jÔˆùóç±oß¾rÕ©¹}½½½¹xñb‰ç/m[Egé7—^Ùï |TB!„¨Pˆ J¨.­[‘qãfþð¬Ðió+6¢hBÞù3$ÿã²OüIò?Ÿ!ïÂÔM¨³*Ƹ¯^ zµ-™Z¨Ó¾½Éñ¿úê+Ú´iƒŸ_}“íþþ~<úhìNçç IDATk¾újK¥4ÜZ´x„ÈÈH23o“˜˜ÈرãJÌ?dÈ`ÆŒÃ_ýE^^Çç­·=ÐKîÿ[=[0ùõÇùúǽ$¥¤Ñ´ž*¥‚§Zzód‹º<Ѭ.í›zñX#/ZxѬ'õ=¸­%öBs?ûG;5};759nÏž½Ø²e W¯^E«ÕÏôéÓiÛ¶m¹êÔܾ `„ $$$pýúu&Mšô÷ûÕÅ…³gÏ–ø>xå•— Hrr2ÉÉÉ„††òꫯTZ€ ²ß;å‹ÈƒâÈ!„BQ{†ªéZlëãƒS` W¯$ãåQ]RhSSÉ>rˆäÁ¯¢O½ àJI¯öÀsõ&ti©èòò'5T¸¸“yë672nãÑõI“r®^ÍûïO-¶ìC† aÞ¼ù ðOcç¸ÆPqÏïÞ¶ti£GbÞ¼ùøøø·ß~[lþ/^BïÞ}HJJ¢Q£F„††š=Wu¸ÿ7Ó°rB/Þ]þ\»Ñ€Ž­Ñ ôïŠÝ_¡€:Îvh<œy­{3:·ô»Œø{ŸI“&͸qïpëÖ-¼½ëÒ½ûS¬[·¶\ujnßÉ“'ñþûÓèp§7ʤIi3ógffróæ"Çž6mï¾JPPKúöíkœ¥ß’÷‘¹ôá½#C ЧŸ5Ýp?ÖzâA·jE÷ãwãû­ßðæàar„Bþz¹¹¹ ù÷³à¡T*‹Ü_ñà¿DQ B!„µ¨QPµ ƒ†£GsåÇíœ9q‚.Øzù OK…¼\PP߈4`¥ ewôjþú_™*+š…ÏF«Õ¢R©Ê|îôôkÒ ª¤û¯×ëÉËËC§Ó¡ÕjùÇ“ ñqU³rÛ-ãÄ …¥RJ¥B¥Raee…J¥B­V£TÊto ¨::½¾\Ÿ B!„âïfA•Íþ——Grr2vÌâÆç9µq#Þövxºy¡²RB^.†Ü\j5J zH¿™Á¥ë׸ղ%êAƒ¸”~¬ ðññÁÑÑQn×}¸ÿZ­–¼¼<ã£àuK?&½ÜŒôk×Ðëõ(•JTVVXÝ ¨Õj¬¬¬P«Õèu:¬­­«¤'$@p--7·:(•ˆ’â§ÑhHLL”ë–zBˆJjV]€ ;'‡ììr:=Aš§'·>ûŒÿ]ŠGamƒ•Î*·uYÜÈËCŸ—G¶çŸyëV-©«×‘•u›¬¬l …|ãŸîá¡w#hàí„^¯31P*UÆáwï«T*åJ€ ÒéõRS’ùíЯ´zôQ¬­m$@ „B!DùÚ‡U7­­-__¬T*T*%666\›<™Ki©ä]¸€Õåxì“’Èpvævݺhë×ÃÞÝOWÜ\ÝððpÇß¿ÞÞu±¶¶–Æå}ºÿ …kkëüžz½ñ¡ÕjÑétètù‚‚a*• ¥J…êNP `hÜ¿ÛæM«e¹U*.®®<Òâ<Üݱµ³•¢f9þ<óæÍcÿþýdffÒ¬Y3FEïÞ½¥rj{ÕãAzV!Jo!ª´á¦V«©W¯õêÕ#77—ÌÌLnß¾Mvv6Ù99äæä P(P«ÕØØØ`cc‹““#öööX[[*¦4.„û_¸Á_øþ”~ ¹wÕÁó/¼PmË®T(±²VckkWéÇ6âå]"„¸ç.^¼H¿~ý aþüù888pâÄ V®\)!„UÑ>¼g 8µZ««+®®®Ò°¬…÷_<Ø*º4`Meùá© !Ä}±hÑ"FŽÉ›oþ½¦pëÖ­‰ŽŽ6ÙoÆ ,[¶Œ¤¤$š4iÂâÅ‹iÞ¼9qqq̘1ƒýû÷“——ÇO<Á’%Kðððò¿QŽˆˆ`åÊ•\¹r…‡zˆ¹sçréÒ%–.]J|||¸R®ûî2>öØclÙ²Åx¾¿þú‹Î;ºæÒ5 GŽ¡nݺÆs´oßž7@JJ =zôàèÑ£´mÛ–‘#GÒ³gO|||LÊWZZiJËW\ý<å6—.!ªÎØQ#Xº|%×ÒR«]ÙuZÿKLàðáßh×þq<<½P*å+ÇêìîÙܽëú”8a[|jçÒØ{ä½;4¢yCT*¹ÿÕ™Ngàä¥4~Ø–'Û5£©¿'^Næó%&ij&:š™³>J,T'Û¾û–)ÓÂd’B!ÄýåææÆµk×ðòò*u¿Âã7íììÐjµÆ×‡&<<œãÇsûöm â»ÏS8qÛ  ~ýú&ÏSRRÊ}æÊ˜’’br>???“üæÒ“F6@RR]ºt1ÙVøœkÖ¬aÉ’%,Z´gggÂÂÂèÑ£‡Ù´Ò”'_YËm.]!Š£T)ñññå‘-8úÇnÞ¸N¯—Š©ÆÊ2›»¦Žš;·‚Ÿ_dÛþ³R5€µšÇ[5¦¾»EÁaž„÷U§NضmC† )÷1‚ƒƒ™1cݺuÃÑÑ‘ŒŒ ã\oüÆ>!!Á8_@U”ÑÓÓÓä|ññ¦ÇšK/Ž——Û¶mÃÛÛ»ØôV­Z±víZ »víb„ üñÇfÓJSÞ|e)·¹t!„(ŽB¡ÀÊZÍC=„F£A«Õa0H€ º³t6w¥RI€—-NÔ«KnžéG]ݧÁZ­ÂÙÎ /¹™ BÔ&Làå—_ÆÆÆ†>}ú`ooÏÉ“'Y±bE‘‰ K’}g©(._¾Ìܹs+¥l3gÎdÑ¢E̘1ƒ¾}û–ºi]ÛÍ•ñ¥—^2žÏ`0™—Á\zqHhh(³gÏF£Ñpþüy"##Y¹r%#GŽäwÞ¡aÆ “¥¥•¦´|ÎÎÎ\¸pÁ84 ¼å6—néy„µ“ÊJ½•Z*¢V6( Ôu„ºŽ*@Æ«×å äæäTëèˆJ¥D¥ªü漄÷UÆ ‰‰‰aÞ¼y„‡‡“••EóæÍ9r¤ÅÇX´haaa 6 ooo†Îwß}Wá²µk׎îÝ»“™™IŸ>} -÷±Ì•qâĉLœ8‘víÚáèèÈðáÃÙ¹s§ÅéÅ=z4Ë—/§ÿþ$%%ȸqãŒéÏ>û,C‡%..Ž€€“IKK+MiùFŒA¯^½ÈÌÌ,uŽså6—néy„BQ{Ålþ¢Z–[©TââìBÓ‡ƯAÔêÊ xÊ$…B”@&)¬Ýd¢;!„(ª:OR(„ð÷$…‘ËVTËòët:.^8ÇÏ{öÐúÑGñóóG©RU¸Nd’B!„B!„¢Q©T6nŠÊJÍ_~¡nݺØÙ;TÚñ%@ „Âb¦Ä4éq!„BqoÔ«ïÇõéäåi±«ÄãJ€@!¤±+õ"„BQ¨Õjt:}¥¯Æ"!„B!„µŠLÅW<¥TB!„B!$@ „B!„Bb „B!Ê&1!^*A!j !„B‹5B*AQíÉÅ“B!„°ÈÒå+¥D•ZÿÉú¼Ø×øúû­ßÐ"¨%jkkT*•ÅÇùí׃&Ç),7'‡˜Í_0z\ÈÑHüçë¯1g.—.]buô*6}¾¹ò}VVhµÚê×X­¦å®Îd!„B!„¨æ.\ˆ .,’V™l+«êñse—³º\w…¯S~•„B!„µÑƒØÍ¼+W®pêÔ)NžÛøº ÿÕ«WÑh|¯5_®^½jrüâÎUZzbb"Í›77Ù¦P(Löóðp/ñ’’’ðõõ1)—¹ó–V/å)§››+ÿüç?‰ˆˆ "bnn®¾îêF†!î«E‹1räHÞ|óMÜÜܰ¶¶¦uëÖDGG›ì·aÃÚ·o¿¿?Ï<ó 'Nœ0¦ÅÅÅ1hÐ 7nLÆ yã7HMM5¦k4Ö¯_O‡hРÝ»wçСCÄÄÄЩS'ã1OŸ>m’gÅŠ´lÙ’ÀÀ@Æ_b—¸ÂyJb®Œ¹¹¹„„„H«V­Št 4—®ÑhX³f mÚ´1F±u:Àˆ#ÈÈÈ0æÙ¹s'Ý»wÇßߟöíÛ³qãF‹ÒÌ]¿F£1©‹œœBCCiÚ´)M›6eâĉäääÿáìØ±#gΜ1î[ЭàÌ™3tìØÑxÌÒÞB!DÙëùï{õpvræ½)“Y¶<ŠeË£ˆZ¶”eË£X¿~VVVX[[³~ý:–¯XÆòËX¹j«V¯duô*êÖ­[ì1³²²øüóÏ9qâ·ŒãÇóÙgŸ‘••eh0 xyyqéÒ%ãë‹/âééi|meeEff¦ñuZZšIþÂÏ ÞÞÞœ={Ƥ ·nÝ,5Ïݺuëš”ëÒ¥K&ùÌ•ëîGyÊËúõëÙ¸q#QQ˸páB…ŽWÕ !jœ_~ù…_|Ñì~û÷ïgëÖ­œ:uŠ^½z1qâDcÚ Aƒ6l±±±ÄÆÆ@XX˜Iþ½{÷²eËN:ÅK/½ÄÀÙ±c111œ>}š>}új’çàÁƒìرƒƒ’’’‚ Ê}æÊ8þ|ÒÒÒ8xð ?ýôûöí3Éo.àÈ‘#lß¾„„¢¢¢ˆeûöí;v [[[ÂÃÃû7Ž &pîÜ9¾þúkŽ9bQZI ¾ILL4f0oÞ<’’’øå—_Ø»w/‰‰‰ÌŸ?€®]»ò믿påÊÞÿ}cãàÁƒtëÖÍ¢÷€BQŽÁ= ,\°ˆO>ú´È#+;Ë8ù]æíL>ùèS>^ó EÌšÕ±fõGD„Ï-ö˜_}õmÚ´Áϯ¾Év?}´5_}µ¥Hãö•W^&4t"ÉÉÉ$''Ê«¯¾bLoÑâ"##É̼Mbb"cÇŽ3ÉïââÂÙ³gMÎ7dÈ`ÆŒÃ_ýE^^Çç­·•)@Я߫Lš4™””’““ç--×ݲ–333“¡C‡ññÇñüó}X²d1¾ÉíÛ·Ë}Ý Bˆ2JOO§N:f÷‹ˆˆÀÛÛ{{{†ÎñãÇi»víâ‰'žÀÖÖ'''&OžÌž={Š4°}}}±³³cذaddd0wî\“m±±±&yfÍš…‡‡Ìš5‹o¾ùÆ¢rqÌ•ñ›o¾1žÏÓÓ“Y³f™ä7—0sæLÜÝݯ7mÚÄìÙ³ñññÁÑÑ‘)S¦ðŸÿüǘnkkKrr2iiih4“u“KK+«o¿ýÖ¤ì|ðß~û­1@pàÀ¾þúkllløî»ï8pà]»vµè= „B”9mÚ4¼¼¼ jIPPK¼½}xÿý÷éK—Fñý÷ߣÑhxúétéÒÅ$ÿرcéܹ NNÎÆm!!!<þxz÷W]BŸ>}Ê ˜:u*®®®4kÖœöí§S§N&ùÌ•ëîGYËùÎ;!Ó±cG ={öäÿxñã'”ûº«c€@a¨ ‹9 Qs>˜Á¸ñ¡äZöå^ø~ë7¼9xX­©çV­Zñßÿþ×8!MqŠ›ø®ð¶Ã‡Îñãǹ}ûvþ‡›Baü&Ý\þâ¶i4._¾ŒJ¥@«Õ@\\\¹®Ó\ýüü¸xñ¢Éùüýýå1—^Üõøûû[YøœGeÉ’%>|gggÂÂÂèÑ£‡Ù´ÒWŽâÊ^P—™™™tëÖC‡ñÔSO1eÊ–.]ÊÖ­[i×®»wïÆÞÞÞâ{(„¢z[ÿÉú¼Ø×äÿ¢A-Q[[ÿŽXâ·_š§°Üœb6ÁÛ#Fš>x/Œ5œ÷&OÁÊÊŠé3¦ñQôÇ•z|½^»»éé×ä Vìýø#žá\\Ý*tœÄ„x¶}÷-S¦…I!ÄýÕ©S'¶mÛV¡có¯ý‹#GŽÀéÓ§+%ªo|ž€‡‡G••ÑÓÓÓä|…Ÿ[’^///~ÿýwc—ÿÄÄDcp  8³víZþüóOfÏžmÒe¿´´²òðð0)ïåË—=ðóócÛ¶mØÚÚòÔSO¡ÕjÙ¾};þþþØÛÛË/‰Bˆ*ñ ô¸ûÿ…B^¯¯Ôã;v //¯æzå!C „¢D&L`Ù²e|öÙg\¿~ÜÜ\Ž=ÊÛo¿mñ1²³³±±±ÁÆÆ†Ë—/WÚØô™3g’––FZZ3fÌ oß¾¥î_Ú$…æÊøÒK/Ï—ššÊôéÓË”^œJ\\Üÿ³wßñQ”ùÀ?³³»éôlH! UzQOP¤ˆ jPA<A… H3Ò~Gä¢xŠõ”;¼óPˆ'("Fˆ FBzHB²ef~$²)»›BŸ·Î‹ì<3óÌ>ßdæ»Ï<‹Å‚'N`òäÉjù”)SpêÔ)X,(ŠbÕÛÀV™-žžž8{ö¬Õ¼Q£FaþüùÈÍÍU÷½ú¸ƒ ÂÂ… ñÐC|ðAÄÇÇ[?@DDÔô ‚–s‹Ñh„Ùl†(Š$©I·?tè0Lú/¨™ `‚€ˆZ¾ÈÈHlݺ{÷îÅ€о}{ÄÇÇ;4pa•U«VaÑ¢EˆŽŽFll,úöíÛ$ûÖ¯_? <ýû÷‡O­A ÂÞ>Κ5 ^^^èׯî¾ûnuô~GËëòâ‹/¢_¿~;v,¢¢¢ð /`øðájùСCñÌ3Ï ::K–,Áºuë*³eòäÉ>|¸U²dΜ9ð÷÷ÇÀ1pà@böìÙjù]wÝ…ÜÜ\5æ£GFNNŽÕøDDD× EP•%¸®“!Ä€5kßÀk+–ÃÛÛ•ìE“LY™0ùùç[Ä{åÔÄÓ5À1ˆêÁ1nn¼¿ˆˆ¨ù5çÏ<÷<ŒÆr6:µZ¾¿¥ÉÇ Ð²Y‰ˆˆˆˆèf£àÚuÓ&j­˜ ""‡Ùg=.ˆˆ¨UQ˜ ª‰ ""^ì²]ˆˆè¦S5H!]ÁÝT4 dEf‚€Z-I–4.‡£˜ """"¢›‡ ÀÛÛi©©ð÷÷g{P«”Ÿ— Ÿ6„¦}0!DDDDDtÓ5"ºví†?îG¿þ·ÂÏ?À†¡VA–äædã—ƒ?£G¯^Ðë˜ """""j ¨AppnéÚ‡KÄ¥¢"H²Ì†¡VAExy{ã–®·ÀÏ×Î.ÎL5† Ðêuh×® , ŠÂµA­^gg—&ß6DDDDDtÓµ:¸jul¢j4l"""""""b‚€ˆˆˆˆˆˆˆ˜ ¢–Ï`0ð}³]ˆˆˆˆèc‚€ˆˆˆˆˆˆˆ˜ ¢ëïÌ™3xöÙgÑ¥KDDD`Ĉøê«¯Ø07˜Æôx`/ """¢æÃ§Ñu•œœŒØØXÄÅÅaÅŠpssñcǰaÃÜwß}l """º&dI‚E’EacPë"E D±é/ç™ ¢ëjÕªU˜2e žxâ u^Ïž=±iÓ&«å>üðC¬_¿YYYèСV¯^.]ºRRR°`Áüøã0›Í8p Þxã øùù¨øzÙ²eذa233Ñ®];,_¾çÏŸÇÚµk‘––†:`íÚµèØ±£ºN||<6n܈ÒÒRŒ5 Ë—/‡^¯¯÷½ dddÔYfoM&fÏžíÛ·ÃÝÝ“&M²Zß^¹Á`ÀÂ… ±qãFdee!==’$aÅŠøÇ?þÒÒRÜ{ï½X¹r%ÜÝÝ X¼x1Ξ=‹   L›6 ãÆ³[fK}ëUõ¨ú·ªlµK}ëØ{_DDDö˜Ífd¤§ãØÑßQPPÀ¡VC£ÑÀËÓ ;uBXDtº¦}T'Dt]íÛ·óçÏ·»Ü?þˆ/¾øžžžØ¸q#fÍš¥Þ†ðä“ObñâÅxûí·a6›ñúë¯cÑ¢EX·nºþ?ü€mÛ¶ÁÇÇ›7oÆ„ p×]waëÖ­ê¼™3gbûöíê:Àž={qqqX¹r%âããõ>ííãŠ+——‡@QÄÅÅY­o¯±sçNøúúÖ­[‡¤¤$ìܹ˜7o–,Y‚eË–¦M›†åË—cÈ!ÈÉÉÁêÕ«Õ$€­2[ê[/##£ÎŠ­v©o{ˆÈY’“ÄÄ_1hÐ „GFAE6 µ ’$!ùìiüïûï!jE„……CÓ„Ÿ_AQا†¨.KÿºÓ¦Ï„±¼¼Yëýò‹㉧Ÿ½iÚ9<<gÏž…V[¾Ò`0àØ±cðöö”••¡cÇŽHII©sù²²2ôïßIIIêúG…Z]k^õm ìß¿®Ü qèС&yß5÷±wïÞØ¶m›Zß¹sçpÇw¨ÇöÊ ¨ÖÑ¿|òÉ'ˆŠŠäää`È!8|ø0 oß¾˜2e † †àà`«ý³Uf‹­õlõ°°»šëØ{_DDÔz}ðîfŒ=Æê¼¨k·îÐéõ ºˆÿåçVÛ©Îd2!a÷nÜzû@DFF±Ñ©UJ>w?íÛ‡»‚‹«ÛUm+#= Ûÿû¼2o)$¢ëË¡tVÝ IDATÇÇùùùv—«J€‹‹ ,‹úúСC3f bbb`0]k›U‰€ªõëšW}›Ð¶m[«Ÿsrrý>íícNNŽU}aaaVëÛ+`•€¬¬,Üyç0 0 èÑ£rssÕòÍ›7ãûï¿Ç!CpÛm·a÷îÝ•ÙÒÐõ‰]MöÞ‘MŠ‚ü‚|„…E°-¨Õ m†Â¢˜Í–&Ý.Dt]Ý~ûíVÝúcÒ¤Ixê©§˜˜ˆôôtœ8qMÑ9*--Mý9==]/àZ죿¿¿U}Õv¤¼.øõ×_‘‘‘¡Néééjy=°eËüþûïX¼x1fÍšåP™- ]¯1±³÷¾ˆˆˆì‘e™·P«¦Óé I2Ef‚€ˆn3fÌÀúõëñÑG¡°°&“ ‡ÆsÏ=çð6ÊËËáää'''¤¦¦:|1kÏÂ… ‘——‡¼¼<,X°cÆŒ±¹¼­GòÙÛÇx@­/77·Ö¸ öÊë2aÂÌœ9)))°X,8qâ&Ož¬–O™2§N‚Åb¢(V=(l•Ùbk=OOOœ={¶AíR×:öÞ‘£EáÄ©ÕN×Dt]EFFbëÖ­Ø»w/ €öíÛ#>>£Gvx«V­Â¢E‹ØØXôíÛ·Iö­_¿~戈ˆˆˆ¨{á¥)ÈÏσF£Ÿ¿Öüm…… ""r˜­qØã‚ˆˆZ“kywsËËËŲ¥ËqîÜ9l~gS³½/­Vksœ"{åÄQ«À‹]¶ Qk£Ñpˆ9ºÊÏ›€ˆˆˆˆˆˆ^ýu899áõ×_¿æuiµü®º%bTˆˆˆˆˆè¦t£Rؘ÷%Ë2Þ~ûm¬Zµ kÖ¬A\\œC=ìÕe«œƒD¶<ìA@DDDDDt“ûæ›oàããƒ^x¾¾¾Ø¹s§U¹ÑhÄĉáåå…ÐÐP¬ZµªAå¶èt:lܸ111pssC÷îݱÿ~|ðÁèÔ©\]]ѧO=zT]'99cÆŒÜÝÝ1räHdgg«åeeexúé§ÕýyýõסÓéÔrI’xzzbüøñ(..¾é?ìA@DDDDDÔ ¼øÒÔšïíå^ž^÷ø£Vå‚ ÀÇÇë×¾Uï¶ß~ûm¼ð €É“'cÆ >|¸Z¾`ÁäææâôéÓP'N´Zß^¹={öìABB|}}±víZÜÿý:t(víÚ¥Î{þùç±oß>ÀèÑ£±fÍ|òÉ'0™LX´hfΜ‰÷ß_ÝŸ¢¢"œ9sðÜsÏYÕ·|ùr$&&âàÁƒðòòÂ_þòÌ;ëׯg‚€ˆˆˆˆˆˆZ¶KÅ—°léòZóE Ðëõ˜0á ‚P«|ý›õ?ú099‡ÂÖ­[cÇŽÅœ9spþüyDDD>ýôSìÙ³€Õ«W£sçÎê6ì•Û³aÃøúú¦NŠyóæaýúõVó-Z¤.Ÿ””¤þìââ‚Å‹#::Z·uëV|÷Ýwð÷÷P1¾Â—_~©–¿÷Þ{رcBCCK—.EïÞ½™ àaFDDDDD7‹ÅÜ*Á§(ŠúT!AÔûø«ÿ,˲ÕëªM&cÛ|óÍ7‘““Zó—,Y ÈÊÊBHH°º ƒ!Äj›öÊëR½ÌÃÃ]}­ÕŠuγX,êë~Ƽy¯âÈ‘$”––ªmP}‚‚Õ×ÁÁAVufdd K—.VûS}}&ˆˆˆˆˆˆnŠÒúÉóôðÄÜWæÔ9âÄg Þyg3._‚ êu¾ßòòr|üñÇ8vìÂÃÃÔùçϧ஻ÆÃÙÙ8þ<ÚµkWY~Þ*ù`¯¼¾dG]?;2o„ X¶l)† ””” 88D-@JJ*"##)))Vë!!aBBBìÖÉÑu–‘™…ŒÌ¬k•"huƒ¯¯¬{à¿I“ŸƒN§ƒ (½\ŠwßyÏîy•ýë_èÓ§ÂÂÚZ•‡‡‡¡W¯žø×¿¶aüøqˆ}³gÏÁ[o½ EQ0kÖ,«mÚ+oêAYYœœœ ×ëqþüy,\¸ÈªüᇪS âÖŠÙ³çX•Oœø4^zé%¬\¹mÛ¶ÅÉ“'±råëØ²å=&ˆˆZ2ƒÁ v¥ãûf»ð³FDts™=7Š¢\™d¹â_(°˜-•óeµ¼øÒ%|ôчöÓÊõm±N§ƒ(Šj;8jãÆMxõÕø:×™8q"^{mÆ{ ñññ˜6í/èܹ ÜÝÝ1uêKعs—ºž½ò¦N¼ùæzÌ™3ii#88Ó¦MŶmÛÔòW_}S§NC§NáîîŽÉ“'ãÛo¿UËãââ°zõ¸ï¾‘ÈÊÊBLL fΜÉü•CDDDDD-™,ËeJ忲,CQdÆZeŽSn¨‹AQ¡Õj+ÛÆñ÷µwïwõ^Œ6 Æ ƒ¢(prrÂÛooÀÛooP˧Nª®g¯¼¦¢¢Bµ¬úÏu•×5ï¾ûîÃ}÷ÝgUþÜsÏ©åÎÎÎØ´i#6mÚ8uêÞÿ}«1¦OÃôéqv“7 ÝÑõvæÌ<ûì³èÒ¥ """0bÄ|õÕWl²b0ØDDÔd¬z%´ò©:AÔ$ÁÍ>Í™3ÈʺˆøøxÜwß}7lÜ› {Ñu•œœŒØØXÄÅÅaÅŠpssñcǰaÆZYa"""¢¦KÜXßF(ŠQ!IDQ¼écÖ½{÷Ayy9†ŽW^™{Ó÷°‡=ˆèºZµj¦L™‚'žx>>>ÐëõèÙ³'6mÚdµÜ‡~ˆþýû#<<÷Þ{/Ž;¦–¥¤¤àÉ'ŸDûöí‰Ç¹¹¹j¹Á`À|€ ""ƒÆÁƒ±uëVÜ~ûíê6Oœ8aµÎ[o½…îÝ»#::Ó§O‡Éd²ù^l}ÃmoM&âââ=z`Æ VëÛ+7 ؼy3úôé£>ÏW’$,[¶ ݺuCTT&OžŒ’’u„„ <áááèß¿?>ùä‡Êìµ­v3˜9s&:v숎;bÖ¬Y0vë­j[ƒÁ`Õ΋ .D×®]Ñ©S'lܸÑáºìµ©½ö#"¢æ÷Å_   Àj^aa!vìØÑ˜AU– ÕO†Ö¬}¯­XoooW2 7õôü¤I8súÒÓR±yÓF¸¹ºÞXï‘ "ºÑìÛ·£G¶»Ü?þˆ/¾øÇÇðáÃÕ‘qàÉ'ŸÄ³Ï>‹¤¤$$%%!** ‹-²Zÿ‡~À¶mÛpüøq<ðÀ˜0aöìÙƒ­[·âĉ9r$fΜiµÎ°gÏ8p999X¹re£ß§½}\±bòòòpàÀìÞ½û÷ï·Zß^9$&&bçÎHOO¬[·IIIعs'Ž9ggg,Y²D]~Ú´i˜1cNŸ>Ï?ÿ‰‰‰•Ùc«Ý^{í5deeaß¾}øá‡‘‘+VØ­·jàÀŒŒ «AW­Z…S§Na×®]øù矑™™ép]öÚÔ^ûQóÛ¹s'FÞ¿š$(((DlìX$$|×ÈüÀÑÕ|îì¹Xó·5X÷Æ:,ù¿%·ÜÓµ (ìcAT§¥]€iÓgÂX^Þ¬õ~ùÅ¿ñÄÓÏÞ4í޳gÏB«­ÿŽ'ƒÁ€cÇŽÁÛÛ@Åcm:vì¨>϶¦²²2ôïßIIIêúG…Z]k^õm ìß¿®Ü qèС&yß5÷±wïÞØ¶m›Zß¹sçpÇw¨ÃöÊ ¨ÖQõ |TT ''C† ÁáÇ}ûöÅ”)S0lØ0[ퟭ2[ìµ[¯^½°mÛ6DFFªï#66¿þú«ÝzëzÂ@Ÿ>}°uëVõ™ËÕÙ«Ë^›Úk?""jz¼»#GQ_o|{fχ$Ie’Å‚ÉS¦`ß¾}>|vìøn½+W®€€+ƒ~ôч˜ôüä:ë0ØúÙ§˜øÜ¤f?Ï#jJ}ð>î5 ^Þ>WµŒô4lÿïðʼEìA@D×—òóóí.W•X,õõ¡C‡0fÌÄÄÄÀ`0 ::ºÖ6«Uë×5¯ú6 mÛ¶V?çää4ú}ÚÛÇœœ«ú¬ַWÀ*9YYY¸óÎ;Õnù=zô°º­aóæÍøþûï1dÈÜvÛmؽ{·CeöØj·ÜÜ\«} sxŸê’]g[8R—½6µ×~DDÔü4 Þ\¿Ä›o¾…`ժסÑ4Ⲇß@sb‚Z8H!]W·ß~;¶oߎ‰'6z“&M‚ 0hÐ ¸»»£¤¤;v¼ê}KKKS¿]NOO‡ŸŸß5ÛG«úÒÒÒ¬Ö·W^—€€lß¾AAAu–÷èÑ[¶l¢(øî»ï0cÆ üöÛovË®¦Ýüüü¬ÊSSSáëëëÐ>Õ÷SSSëìA`¯.{mj¯ýˆˆèú% Ö¯[‡·Ý†1c€>ÞPÍpÀ:¢šÇ›€ˆ®§3f`ýúõøè£PXX“ɄÇã¹çžsxåååprr‚““RSS­Æ'¸ .D^^òòò°`ÁŒ3Ææò¶)´·<ð€Z_nn.æÏŸß òºL˜03gÎDJJ , Nœ8É“¯t·œ2e N:‹ÅEQ¬zPØ*»šv5jæÏŸÜÜ\õ}TƒÂV½žžž8{ö¬U]±±±xõÕW‘™™‰K—.aáÂ…×e¯Míµ]ß$Á¸q5®ç@åú²ÂGrj½“å=©‚ "º®"##±uëVìÝ» @ûöíïÐÀ…UV­Z…E‹!::±±±èÛ·o“ì[¿~ý0xð`ôïß>>>µ1l{û8kÖ,xyy¡_¿~¸ûî»qÛm·5¨¼./¾ø"úõ뇱cÇ"** /¼ð†®–:Ï<ó ¢££±dɬ[·Î¡²«i·9sæÀßßÄÀˆÙ³g;TïäÉ“1|øp«DÌŒ3ƒ{î¹·Þz«U™½ºìµ©½ö#"¢kO»OªI’,ÁÖFáíí´ÔT^hrjµS~^.||Ú@šö’žƒÕƒƒÞÜêØnDDtmդ𽿿ƒAƒïF×î= Ë2”ÊAeY†¢È0W^Wþ{äðo8~ü8žšøLÝ ‹„ é8tèôë+üü Ñl|jdYAnN6~9ø3zôê… À`8»8_Õ6«RÈ1ˆˆˆˆˆ¨E:b¾ÿ.Î..ˆ„hã–EQp1û"’““1tĈz—Óˆ‡à–®]qø·D\**‚Ôˆ1 ˆ®Qáåí[ºÞ?_ß«NÔÄDõ¸ž=ˆˆˆˆnVÕ{@ÊùóHLüyyy$Éæ…“¯¯/zöîˆð»õH3ŒF#, ŠÂµA­^ggÛ·Ó8ˆ=ˆZÑE"""¢›YxDÂ#"š|»¢VW­Ž LT )$"""""""&ˆˆˆˆˆˆˆˆ """""""DDDDDDD&ˆˆˆˆˆˆˆàS ˆZ$EÉd†Él‚Âçò¶jZNNN-/K,’ð ´­› @5E-ãΘ²íSj¡1%"&ˆZ…Ëee(*,@ff&JŠ/±AZqrÀÍÍ Á!øø´³‹ '–f³éé8vôw°[qܽ<½Ð±S'„ED@§³ý-Æ1%Æ”š?¦DÄQ«`6™PR\Œ´´tíÚmüü!Š"¦’e33püø1xxxB¯w‚ÑX^÷²’„œìl$&þŠAƒ!<2Šqo¥$IBòÙÓøß÷ßCÔŠ ‡¦žX2îŒ)1¦Ôü1%"&ˆZ £É„ ièÖ­'|ý Ë, ¦•ò ‚F#âô铸=8¸ÞE’tø0ßs"#£Øp­˜(ŠˆnߢV‡ŸöíC`` \\ÝwÆ”Sj!1%"&ˆZ E–QRRŸ6¾%‹Í.éÔ:xûø ¤¸qaùù ‹`ƒÝ BÛ†¡°¨f³.Œ;cJŒ)µœ˜D­‰,ËЈ",3ã EÈ 6)Ë2»­Þ@t:$I†¢ÈŒ;cJŒ)µ°˜D­ŒÂ‘’oÖÈ3îŒ{%ìÝ‹³çZÍ[¾ø¯:ä6ì r,—––à÷cGžžYÝ®Rõ?´Z<=<àåå ¿„‡EØîµD×-¦Œ%1A@DM4‰‚‚Bøøx³Ao"Ƽn3¿$Àɿ̆jå, V¯]‡O>ÛŠa÷܉ûGŽÂ¯‰‡°ó›]˜óê<üëßÿÆìÓÅû¦[»¤£‡‚ýo‡ µÊ%IBéå”–– 7/Û¿ú7ºu퉈ðÈ:—'Æ’ˆˆ ¢Ö–h‚o*.\ÈDÆ…L¢m¨ízÓ\8ʈuGE& CSíóôÙ÷³‘Z©ÁŽo¾Áö¯v¨ó¾úbdI‚—§7b¢Û£Kç[ðÖ†7‘}! ±ã<üàŒ5 ;ud#¶Bi驸íÖ;PP”‹¥b|Y–!+2Y† ÐjuprvBP@0¢ÚÅàô铨ñÍvÜ3x(œœœØˆŒ%D7³œÜ<\ÌÉ…¯¯/òò  ÕŠ bÃÜ$ø#%PZZŽËeFÀ žmÙ8­Ô· ßaæÜWð×ùñ¸Ä0xyy èR1 omx~ú·tí‚Ø‡ÇâÑGÅ·ß~‹ñCII ²³³1þɧ°aÝZÜÚ¯/³•‘¤Š G³Ù EQ*'¹ââRQ ÈLf”Ë Yƒ^={ÃÃÝ {¿Å½÷ ã=ôŒ%D­÷âîên1(**Bjz:¼=½ + <<=u1QD€¿«hƒ¯·á÷nöu¯kÜ+O›‚ERÔN(Jµ!-ÌY­«Åÿ‘Òjý˜Ï«Y·¥Æ}æÜW°îo¯!À?ùù())EJJ2~úi?~=”ˆÌÌLœ={©©©x衇ЩS'´ññ…$I¸¥Ë-Áä—¦"ñÀü%ÛŠŽåêÇ«,Ëøàƒ÷m.;zÌh\ÈÈ´kÂKEøþ ¸ëOw³‹z ˆikŽe}¿W¿ûî;Œ?ÙÙÙ|43DtÍR<)-½Œ³gÏÁÃò,Ãh2BÔˆðpwGFúˆ‚__ŸVÑ ž(¾TÔìëÞ$YR®~Y•  Ö)22 ÉÉçàîî777„µ  1 ;¾ú†Ðx{{ãĉxÛí((̇N§CXÛpH’ÔúNTZQ¢çÚ^œV·²"ãñÇ'¨üæ¹²LQ(²Ríç+Çyn=±÷ß!77þþ<ˆË&?6ãããñá‡âî»ïæqKÔÊqHT¢–"hðTn4âÄ©Ópus4Ì F³&‹nîî8Ÿ–Š‚Â"›ÛIؽ Iª³Ìl6cßÿ¾ƒÉlnÔ>::]M;\ͺŽL_ùßFíOs²HWjVªeÌ’c ‚ÐÐP”——×YVXXˆ=z   €j3sqqAï^}àââ‹Å‚   DF´Ã »cÊ “1dÈtèн{÷†“³ÚEF!*2É)ÉÈ/ȯw»EEE˜>}:¢££áìì <øàƒHHH¸®ï—•ǰ|¥;Еo²+ÉŠPñ‹F@å¸#´:=>þÇGØ´ùm\¼x!A!Èœ‚¤'µ(øñãZz5§–˜(b,‹e·nÝjõtP]»vmÒv¬~lþþûïøÓŸþÄã–èÀD-ö ¢á=Ìf3Ž? ghE-Ì&Kµm&£z=àîê†sçÎ#:*žžunËÇ· òrrTë7-å<¼½}àãíƒÒÒ’kßUýj¶ ÷ÍÓÓ —Š ¯ÁÛmš}–äêÛ¹’!pôƒbË–-˜4iR­²7¢_¿~ðöö¾æñ¿ší·¦GF:²¯;uÂ×ßìF¿>=Ñ.2J½ÙÓË„¶mà IÊ.—B£‘›—‹ã'Oâri)²²²àæêOO:ëzì±ÇЮ];ìÞ½mÛ¶E~~>öî݋ŋcРAü|?UÃSüqƒÖý÷>Ç€_D‡9€Óé;‘´éÏð0®Öß–~ì´„}jŠ}¸Ö±tqqÁ—_~‰‘#Gªó¾øâ ¸ºº6É{¨ký²²2ˆ¢ÈÇôÝØƒ€è!INœ< N^WÙs òyµåL&3dE«›+Μ=‡’ÒÒ:·×®]4Nžø:ÎúÄF–qþ|2Úwì ‹Å‚Çÿ@Âî]ØýõW8ü["¤jõ~óÕvœO>‡ïöìÆ7_mädgcÿ÷{±ë믰7á[¤¥¥:|BròÄñzëªËÙÓ§°7á[ìúú+ìÿáV·”]¾ŒÄ_b÷7;°ëë8tðLF£Õ¾×T5¯êß­Ÿ|XçrÍÍd–`4Y¬¦ŠÏDõžW>–Ênæ5×1š,VI…Ù³gcõêÕeë&“ 6lÀË/¿ I’xzzbüøñ(..V—ÕétX³f "##¡×ë+Úï›oн{w¸ºº"::ï¾û®ÃŸq[uÕåõ×_‡Á`€——žyæ«Å899cÆŒÜÝÝ1räHdgg_‰w#÷óZzì‘X$ìý:½©i)Ø“°¿MÂé3§qæìi$&Â/‡~ÆÑ?Žâ§ŸÂþ÷!å|2 òóq1+ }ú/ŒvoÛÞ»w/–-[†ˆˆˆ¢ÄÆÆbÏž=Vñ¬©úø:u‚««+úô郣G:ü¹©«ÎlP€qãÇcÜøq7®âßÇÆ=†Ç{ >ö}ôÑZSõ JãÁÿ5¨ÞòòrLš4 ¾¾¾ðõõÅóÏ?oÕ³¨¾˜54N¶ŽÇªÏ€N§«ó3ØjG×(–/¿ü2V®\i5oåÊ•˜9sfƒbk41qâDxyy!44«V­ªóدŸšqºQŽA"&ˆè:Ÿ@ ÚèÆ¶'Y–qòô(ôÎzõ±Iõýg4™ @³‹ Nž:ƒË—/×Ú¦‡§'\]\‘““m5?3#½¢÷@_;š„KE…t÷Œz0ÎÎÎ8sæ´Õ Pii)Ý=?:ž^ÞøýÈohß¹3F?‹{îŽÒ’ètú:ßWõ“©³gNÙ¬«®u³³/âŽ? ¨c?Ž…F£¢(øõ—Ÿ…ûF?ˆQ> Ÿ6¾8sê¤Õ¾{zy×Ú¦§—7†Ž¨øVfì¸ ;nB­ål½—káÿü‚[bß@·±kÐý‘ŠÉY¯…¥Z‚@¨ÖƒÀh–á¬×ªËvd n‰}Ã_|y…WF={öD»víðùçŸ[Õ÷é§Ÿ¢oß¾ˆ‰‰ÁòåË‘˜˜ˆƒ"##ÎÎΘ;w®ÕòÄÁƒa2™O=õ,X€‚‚$$$àÀ½OGêªé‡~Ào¿ý†Ó§O#;; .TËF©S§âÂ… ÈÈÈ@ûöí­N »Ÿ×Òˆ¡C‘xøþ2ãeütà ÂÃÛ¡¼¼ÅÅÅÈÎÉ—·rsòqâø)Áb‘`2š°ï§Ÿqâä)h5̈›^ç¶o»í6Lž<@YYY£÷ÑV›;R^óóRÓž={€œœ<öØc¸ÿþûñõ×_c×®]ÈÍÍÅÃ?ŒçŸ¾AŸ{u¶ˆ¿ •É;¥*Ù§€ TÝA€F Ñˆ“Xñoþ+QV”'Ó€À1 ®wþüùÈÌÌÄñãÇñÇ -- ,°Û~ “­ã±ªwƒÙl®ÕÓ¡Uþ}¿Æ±|ðÁ‘Ÿ~ú ðý÷ß#//cÆŒiPl,X€ÜÜ\œ>}¿þú+¾ûî»:ßOÍøÔŒÑr Ý,x‹Ñ àì¹d˜LæŠîƒŠQÔ@QPç€dZQ„¨+.EÀÉÉ ÇOžF—Nj=[9¢]N?†wܳ¹âvrò9ôìÕ’$!-5·Ý~'Ü<ÜQvù2"ÛEáǾG÷½PVvУWhµ"JŠ/AQh4"dIFqÑ%ˆZ:w¨;çéiiv목wß~åee 1àØïIpquEIq1Þy<<ýg¼ÚøA«³þÖÍb6A²X IXLFÁÐ6 9—êÝæ?ÿùO¬\¹“&M¹sç€Ñ£GcÞ¼yðñq|PS[mîHyÍÏKM6l€¯¯/`êÔ©˜7oÖ¯_o5oÑ¢E úÜØ«³e$+~‚€Oì–~oR|”£âk-[ó›ùª‹¼Ï>û {öìQcöÆo`È!xíµ×l¶_Cãdïx¼±¾¸¶±Ôh4˜1cV®\‰Ï?ÿ+V¬ÀË/¿ Æú{A{±ýôÓO­ÊW¯^Î;7øýÞ(Ç Dt]Y$‹C™ôÌÌ,äååCQ€²Ëßú)‚oooH–Š$KjwsQ£AA~A­‘óŽ?1ÑV'‰îeE…ÐêtÈÏË…N«…`0Š‹/ÁX^Ž„Ý;kÿbÑé`*2©'zy¹9j7õ.ݺãBzŽþ~¢("¦CGøùÙ>)0™LÕU“^ï„ÜÜuhEQ ŠZ˜L&âÀûQR|É*‘"jµVí^W ì•_UÜ-æF î´hÒ]x~éqî|:BÃCQf’`5AµE¥&•šàëé cyr³sñÙÒ±ð÷v†Éd´ÚB£ÑàÛowãÎ;ïÄ·ß~ tïÞ &“èÒ¥‹Õ:‚ XmÇÏÏ×êõÇ„åË_âE‹àåå…+^È#lÄ¿b]Gêª)$$X- FVV–úúÀŸ1oÞ«8r$ ¥•·ÚTß^C÷³9ã®ÕéàîáŽ>}û +ë"B ¤§§£´´çϧ ,¼-ºtî‰;¾F‡œœŒÞ={ 95£ÞöruuÁ‚ó±`Á|(ЂӧOcÍšµxä‘Gðå—ÛkÅ£®ÙksGÊk~^jnßÃÃ]}­ÕŠuγX, úÜÔUçõ:–ëSuߺ¨Ñ`„'*ŽhAPÿ­y¤_˜a¨uAy¦ýtö2ŒÆòZÈ+--©³Í/^¼ƒ!D}m0„àâÅ‹vÛ¯¡q²w<Ö÷ÙkÖ¿ËMÓkK“ɈG‹E‹á£>BRR>ýôjû9Û¬¬,«ãÕ`©[ñ¹ÞÇ 1A@tS BppÕ¼_;R{(ÿª+»¼÷îÙݡ퇅GâÔÉèÞ«7RSRÐ.¦=Y†Ål†“Þ C†ß—Êê=ªv»§§'Útï7W7äææàÐÏrw¨Õýÿuq´®š¹îûýž„;!,¢:ü¿ÿù©ú ‹ VcXš©[kÕ­% ¥€µ3G`|ü¿‘z† ˜$¥Þ1½Üô(/+CvV6>úëƒöª·Þ3fào[;î¸o¼±Ó§Ç©Ë!!aBBBj¼¥ÎŸ W¯^غõ3(Š‚]»vaÊ”pöìpmâx]5?íÚµ¤¤¤ @]~„ X¶l)† ””” 88D-oè~6gÜu:DQ„»»;Ä´AIi ¼}¼‘šš///èõzH’Y–+º,kõxtäùé111X±â5„†¶U÷M«Õ¢´´Tì,??¿V lµ¹#åuµCCÊó¹¹·5öX®ÿw™Ry¬k*/&Tü_íßJéqAµ.(;üß!ü´s½·=Õ·¯V1KNN†¿¿ÿUŤ®yöŽÇk§ëÓæˆ¥^¯ÇäÉ“ñì³ÏbþüùÐëõê²UÿÚ‹m`` Uùùóçm;u=9ázƒDÔ8ƒ€¨¥jÀµîw¯zn²ú$Eý¹j¾£ÛòõóCii òrr`6›Ð6,¥¥¥P!¡¡øå矖š‚‹Y™H>{ßíÙì‹YµþðWMÇ~OBQA òQTTY–àááiw {uÙZ·®y’E‚»‡LÆ2¤§¦`ßÿöZ•»»{àä‰? KÊËÊqâøVåZÅ—.9“¾±qwÒ‰øûü©™YÐT»¬~9èæ¬…ÉXŽì¬‹Øüêýhæks»Ã‡CFF>ùäÈÍÍÅ=÷Ü£–Mœø4^zé%œ;wf³GÅŸÿü¤Õû®¹½'Ÿ| LJÉd‚¢(WÆÌ¨§Ý­«®ugÏžƒœœäää`Ö¬ÙˆUËËÊÊàää½^óçÏãÅ_²ª¯!ûÙ\q¯> Ÿ$I (ŠðöòQgggˆ¢:~þ¾puuEaaÅ F£QMTßö°añmÛ6\¼x‹iii˜?>úöí«.Óµë-X³f JK/###S§N³j3{mîH¹­Ï€½òÆ|nêZÿz˶êÖh4xÿý-Øòþ{زå=¼·å]¼÷Þ»x÷½¿ãÝ÷þ^çeÐËßÂ5²7äÊ1kêúÝX_=ô fΜ…ììldggcæÌ™xøá‡®*&uͳw4¢.[:vî‚#¿%âri)œœœ‰œ‹YjyûNqöÔIû= z''DDF!'û¢ZÝß|‹Å‚»îÒtq»Êo¨<ÝôزàŒûOdg ðõ÷š!pÒ‰0™Œ(ÈÎÁÚ—‡£[t CõÅÅý“'OÁÛoo°Z>..«W¿û¬,ÄÄÄ`æÌ™6¿1bÆäädÄÄÄàw6Û܇ª2GêªiÀ€[ѯ_”””`̘1ˆE]þÍ7×cΜ¹HK{ÁÁÁ˜6m*¶mÛ¦–7t?¯eÜ«.æ/_¶o£*a ×ëáææOOOxûxUö0ÐXõÅŠnÞ™™™ðóó«L"ˆjùìÙ³±iÓ&L›ö#((ƒß÷ßߢîÛÚµëðâ‹/àµ×V 88qqqøÏþcµï¶ÚÜ‘ò¦îAИÏhK8–ëûÝ-L|ú‚P_BµoŸ“_Œ·º Œ\Ÿªndêàx èA0oÞ<¼üòLtëVÑël̘1xõÕW›¼½ãqêÔ©¸ãŽ;QZZŠKÕžHÓ¬W›ªÁuŠeÍr{±Ç´iAçÎ]àîS_Âλ܃àzƒDÔ8‚Â#’¨NKÿºÓ¦Ï„±Ú#šCñ¥Kø-ñŠ²Ë—µÄߎÀÓÓSýƒ+I¤Êo4e—ËÐËÁ[ ª8»¸ÀËËEE…(¯1¹››;\\]!Š÷”––” ¼¼b™À `\ÌÊ´Þ–³ ÜÜÝ¡Õja±XP\|©Þ[ j®o«.{ëÖœçäì Oˆ¢I’p¹´žžj¹V§ƒ—§´:$IBii <=½Ôr7ww¸¹¹C„ZõÔôÓþ0rô\*ªûÄÖd4bëgŸâ¹ÉSšd\ƒÓ©y˜°à?põño›60šÍ(/7’—r³±ìÅ!Ô'‚ú5¶åïïàþQ£àåísUq7›Í(++CNNž|n2^|~¢:.Dnn.nxò ò;w¢k×®ðÀ¶mŸãž!÷ààÏÓ ?üˆ7V,C`` |}}áââÒ¤ï·êwDcËo¦˜6ÔGÿøS&½„ܼlõ‚R*G¾?û‚z}¼ðH?LÔD蜽pëEQàééµëWã‰ÇŸ¬5XÓæ)cyýcJDÖ2ÒÓ°ý¿ÿÁ+ó±Ѫ¾Ü_cs‚åeeµUJKKj pU¥® çòò²z/êí­o«®*ß'|k³üOƒïËËk%€ª?ÁÀb6#//ת¼zÒ¦´¤¥%%M·«ÉÛV=ö2<ÈûË݈[ý-E€«‹+$³%y9˜ûÔ@ÜÞÝI’nØ“Ko;'……-àé ‰»Å"¡¬¬ yyùj¨¸•ÀžK—Šàææ©ò[ËÌÌL¸ººÂÝÝ]]ßÛ“hGÛÌÑo/o†ßÁ×b AðÎß7׹̜€ÄÇðWVÁ9¼ç•}ª¾m®‚ß ]ߘ^«Xz7àb¸¥ý$¢–ƒ ¢–{&âð‰HíûøYVÔîÅêPÕ~¶X,VßZÜHît7‚‚Cl.“•y¡¥†½Á' Š¢Tô©¼¯¼êß¡xy\¼þñ/<ÛÀX\€gGwÅÝ‚PZZ Q!Š"4úó¢  ¿U]¤Ú‹»Éd„ÅbQéééá©–Õõ8SêHðЦ23+n‘)//‡Éd‚$IjöÚ«!mÆAãeGÛíÙgžS¿iFµßãS&¿¨vO—¹bø\ù ˼?»%ÄôZÅÒ‘ãøf;‰ˆ ¢›ð„åÊ ²,#77‚"àûÿíÅŽ¯·[õ«èvn}iµJÅãôÜÝÜáåá…ÜÜqp»ëSÆ’ˆ˜ ¢fQýö€šãÔN"à†wàÆ9mø ¨ ÐétÐétjÏê= ª¶WwFc51AÔòã^•ruu…^¯‡——'‚‚‚0bØPˆâ•8Vu=®z-Ëråm'2prr‚V«…N§ã`u-ðX®/ö¾¾¾ˆ‰iKåà”>éÓéàëëËØ_§˜2–DÄ5þ<ä*¾©¨ž¨ÿ<‡'-ôüóªO@:Ž? ­'îz½z½¾ êdÜ[ò±\N§CXÛ¶M¸oŒýõŠ)cIDLQƒ±»àÍSFY‘yÂwƒ*dÜSbL©åÅ”ˆ˜ jîîîÈÍΆ‹«+äPvù2Ü=< ˲À ðööFZj*üýýÙh7€ü¼\øø´ hwÆ”SjI1%"&ˆZ ½NC[œ9}í¢bàæîÎFiÅJKJpîìitíÞF£±ÞåDˆ®]»áÀûѯÿ­ðó€FÃq"Z#YV›“_þŒ½zA¯wbÜS6"cJ-(¦DÄQëI8éáååŽ:ãÜÙ3())±ýÍ3µXšÊÞ oé _??\®1ʼղ¢ÁÁ!¸¥kWþ-—ŠŠ 1î­’(ŠðòöÆ-]oŸ¯/œ]œwƔȘR Š)1A@Ôª8»8ÃÓÛ!¡m9A+'Ë2L&“ÍäP9¸ ^‡víÚÁ`0Àb‘ (<m­4‚Z½ÎÎ.Œ;cʘ2¦ÔÂbJDLµ*Š¢ÀXn„±ÜÈÆ¸ÉˆZ\µ:6ãNŒ)1¦DDÍŽ_MDDDDDDDÄ """""""DDDDDDD&ˆˆˆˆˆˆˆL-›€ˆˆˆˆˆˆšƒ,I°H (lŒ«%E D±é.ë™ """""¢kÎl6##=ÇŽþŽ‚‚6ÈUÐh4ðòôBÇNNǵ|²$!';‰‰¿bРAŒ‚(Šl˜F’$ ÉgOãßQ+",,š&hO&ˆˆˆˆˆˆèš²H’Æà{îAddä*‰¢ˆèö!juøiß>ÂÅÕíª·ËA ‰ˆˆˆˆˆèÚRää#,,‚mÑ„BÛ†¡°¨f³¥I¶Ç]s²,ó¶‚&¦Óé I2En’íñ""""""j6 Ÿ`Ðb±1A@DDDDDDD¼Å€ˆˆˆˆˆˆZ ¼ü<¬]·éièÜ© ž{f<<<ê\¶¬¬ oo| Çþ8†ààL}q*üý؈ ÄDDDDDDÔ,EqxZ³ö øù¶ÁèQÀÅÅ‹þoŠ‹‹k-WZZŠ‹æÁÉIQ£F#((kÖ­iP]­yb‚€ˆˆˆˆˆˆnhééi Àùó焈ðp,ú¿())Q—¹|ù2ýu †P#%%¡¡dd¤³™ """""¢A·nÝqêÔ)###†P"""°è¯I‚ªä@¨!mÛ†âÂ… áÔ©ÓèÞ½G½ÛÕjµµ&ªl65G»ÅO|êüßâEЊ"Ú¶ EÖÅ‹  `î+³ h4ˆ‰‰AXÛ¶ÈÌÊBP`ÒÒÒ‘ù¯.°YÙlnÔ>ÝèØƒ€ˆˆˆˆˆˆZ777,˜·23‘𖆀€dç\DXX:v섘˜„‡…#;'HMKÃ…ÌL,˜·nnn ®O’$ÄÇÇ#$$žžž?~<Š‹‹ÕrN‡5kÖ 22z½^·qãFÄÄÄÀÍÍ Ý»wÇþýûñÁ S§NpuuEŸ>}pôèÑ«ª‡ """"""º©¹ººbÁ¼…ÈÌÌBÊùøùú!;'AÁA ANnü|ýr>™™YX0o!\]]U×òåË‘˜˜ˆƒ"##ÎÎΘ;w®Õ2ÄÁƒa2™Ôy{öìABBrrrðØcáþûïÇ×_]»v!77?ü0žþù«®§9 ûRÕié_`Úô™0–—³1ˆˆˆˆˆ®‚ÉhÄÖÏ>Å‹Óâ Ërƒ×¿|ù2æ¼2mCCÞV¨ÐÝÝép>%Ë—¾æPr@§ÓÕšg6›;v }ûö€‹/¢wïÞHOOW×KIIAHHˆÕ¶²²²àëë«î§——W­y¾¾¾(++€FÕcË[ëÖàþQ£àåíÓ¨Ød¤§aûÿƒWæ-âDDDDDDÔ<,3,Kƒ×3Ë!K4¢’$C’$€$É0[,% Fc9´Zѡ핖–X'0LFddd K—.VóA€ÉdT_ûùùZ½wu^Uý5çY,õucëi¼Å€ˆˆˆˆˆˆš…¢T Ø©¤¤K–.Fxx8BBBP\| nnnpssCqñ%„…µExx8–,]Œ’’»Û«ØÚ󃂂pêÔI””«Sqñ%›ë5f^cê±÷~˜ """""¢Ö–"hpr`é²%ð÷÷CPP òóóàîîôô ¤¥eÀÝÍùùy „¿¿–.[b7IP߸ĉO㥗^¹sç`6›qôèQüùÏO6y‚ 1õ0A@DDDDDD7Vz =JKK±lùRø´ñF@@ò òáîîÔÔT¤¥¦!==çSRáææŽü‚|À§7–-_ŠÒÒÒ'âââpë­pß}#ˆ§Ÿžˆ‘#G6y‚ 1õ4W‚€cQs¥¾¨}ÿÃ-pusƒ¿ErÀËË )))(,(Äô¸Ðh4XÿÖzH’ÁÁAIÿH[ÞÏ=; ¢X{L‚¢¢Â:÷ALŸ‡éÓãj$5”z×k̼ÆÔÓ\˜ """""¢æI8ø­wII N?Žž½{UŽ9àŽ´´täà©'Ÿ†¢T PøÄãÆ»[þ‹Å‚`—Ã?À¿&þм¼<¸¹¹Y=ÙÀ»ž‘þ &ˆˆˆˆˆˆ¨ù°› 0(++CPP2Ò3Œôôt⑱B«ÕP DQƒØ‡Æâ³~ ³ÉƒÁ€ 2è€Ë—/C£Ñ@Eèõz@AA~½‰ âDDDDDDÔ|)‚ª,A½“V!j49r$GŽFÐà‘ØGÐÆÇn®®ðôð€‡»;\]\áÛÆ=òœ]qäH,&3†¦nGÔhìÖÙª§&ÄDDDDDDÔŒùÛµnnn Æ“þ ‹ÅRqñªÕÂÙÙ®®®Ðétê¼²2=ôNNxtì#e:½ÎNNpqqF£a&ˆˆˆˆˆˆ¨eåƒ@«ÕÂÓÓeYM‚P±Êmˆ¢www¸¹¹A–e(JÅ­u-KLQ‹É4üÑ|¦ÚêŠCË11Ð8LQ³pdBº~˜ """""¢kN£Ñ@Vd&š$ËE±É¶Ç][‚ooo¤¥¦ÂßߟíÑDòóráãÓ‚Ð4(d‚€ˆˆˆˆˆˆ®)Q#¢k×n8ðã~ôë+üü Ñl˜F’e¹9ÙøåàÏèÑ«ôz'&ˆˆˆˆˆˆ¨åÓˆ‡à–®]qø·D\**‚Tùtj8Qáåí[ºÞ?__8»83A@DDDDDD-Ÿ Ðêuh×® , ŠÂÁÕÐhõ:8;»4Ù6™ """""¢f!jupÕêØ-”†M@DDDDDDDLDDDDDDDÄ """""""DDDDDDD&ˆˆˆˆˆˆˆL˜ """""""0A@DDDDDDD`‚€ˆˆˆˆˆˆˆÀ """"""" eÙ–‘žÆF """"¢D6¬ùÛJ6ÝEQ6ýÿFÁ(£`Œ‚Q0²dÒ zõSIEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_design_reports_group_by.png0000644000175000017500000005763112235000130027517 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¦Áè±sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ mMZ IDATxÚìy|Eú‡ŸžÉ$áÌ}““p „„pÊ¡‚Š‚.å’äVnÐÅû\äPX]~ºêz€‚· ˆ\BB $$’L¸!™$3ýûc’a&™É$$Èû|ÒŸôtU½]õVw}»ª«»jAAõF Š’ ‚P£¥\‡4"V‚ "BW-RÊ5ÆUª°.‚ Ü¢¤:£* ”r•q«¥|}YjCá&&ÿÜeJŒW7øå¢ÕàãQ€áÞÜpæ‡÷¦•!ëÅXª'&«ÞÎÄÉÅ™(Ð_’ÚAø ˆÒéó—8¸sÝU¥¿­}OL&ºäž-àödÿðÞ´(+!²^J¬Ö•ÒÿNÅÉáPž»_3sJU•A¸‰9}¾ýÙ‹$ï^OÏûûÓ,Ô«ZéS2ϰníW4ï€wÃ:åµ¢~©0•X-Å€¶ô¿µ(Ù§Š½£ò¿ï>Ç4dÄ\6K ‚ Üä䜾ÈÎÍkè~OÞõ¯Êƾ#Ù$ï^Oûî½ °²‘­¿@âÏÿåçO^ìl%HEå–âÒź7U6ôWA¤*›ü€£ÎÒ–¯ÞAãV§z¥Ò¸Ò¹×4­%Â_’£éYddž¤yt$ÁA~â¡Ö ”vA½ëc4]Ý(˜¿w’Km9ÐÏRñ1X-Z@S®d=IÂé=&¥¢0Ùßûùó§É¾ìZ=Ç\ΣÝ]ýq­®  ·Å%%¤?I^þ ¸¹ê¨W·q­›×Ú|ïÞ{û:„óúØÎ¼÷mYÙ¹Š8 µr¥y7Y Ó÷ë¶Чg›øŽ¶—Ùr  ž¥½#PX “µ Y/ÖÂdYw8ùÀä@˜ÜÛ‰^÷Þ‹¢Ñ ÑhP ‚Fcþoþ­A£(–8Óž{ “ª:´)— INN¥o÷¦t¼­-þ^æ@g/’™{ž…_í!¶U³Z—ïc'xàö(ºÅ„2uñÏ «Odx°ëB-ê1Y Séq¹vý6=óß\Åý=n¯t»µ-Ƕ—•(éJE©lÇe³òÔrë*Uœü \é19.dµ—R{r® ö(*.!%%•מègwÞýj‰O¢ Ò"Ò¾Ý[Ø“~M IãpŽgeSTTÄ]:*Y§8y*ƒÁ€›«+Áþ„‡Yí²´wuí`Ùùme¿[4‰âø‰l.âæª#4$FÁXŸ#Z­–OþƒOÖîÅÕUG£àú˜LW†OìQUû™'Oq$í8 àêꂯ·'#ÂpqÑ:ñ… TÞc*cÑ31ñÍU–ukÊÇ7÷˜pÔc*\KµÅº§T~¶^™8)özM.åÄH©J Æ":åŠX¡\ÙŽUœ2••«HÁ~¯#“Á=[èSŸ³›”—ˆo*œ;}¾›˜–M1©*›¶îäÛ×ðÞ·IÌÔ Ÿ†ué7ó¿xyzÐ#6˜™ƒÛàãQ—Óç øqÇQÖý~˜Ö·5aÓÖ]–´ ÓÿË]ÚÛØK˜þ_Ëï·?ßÁ“ÝIO}Î\(äÛ-)lONå¶fѨ*LN¥K˦>Ü ?Ϻœ¹PȚߎ°qïaZ¶hbWœ¬÷W™}€¬“9´ qç­qƒPU•³ ì^~–žõ„»ã .•¯+0 Š¦âÆºÇd-LªJQ±Uc”£D¨@qq õÜ8wÉ€ŠBQ±‘í;·ô¬{4e¬øq?Í›5ÁÕÕ•ß÷þA¯amÍ=ž-)4nÌ7›SHèÖŒ^³zÛOå.º”Jq€eßï!¤Q(ŠË¿ßKçVHèÖ”I ~UeæX>_÷†b#«~MaðÝ-éݹ kwü„¿ŸïUÛ÷õñ¡^ݺ|²öwŠ‹KPUëw§3q`Ú·fÉ×I}á¬\­ÖcºÒþ_*,ªRGñÅáyS¯œ(• R¡UOÊÅJ˜4åFëö˜ª4”gî%)fq²ôšì‰”UÏ “Š å vÑétœ¹Pˆ¯g]¼Ô¡¨¨«+ÚÅ’0ý¿6âdÍùK\t:LªJQq‘åÁ¿³ D×uçìÅB|<êRTTñDsv<æ½LX¤; wÖü?Ï2[ªå-K§õ±IçïUƒ¡øšìŸ;Mñyþ9²+‘Á^¸»ºX†dÔu£ÄXâЂ`s~i5–u£éÊ£C;wï­Ð[*Ö›øæ*ÚÇ·±lÓjÌ64…bû¯5r+»î+%w;¢äb§ÇTõ7?T6”grC¹ÿŠyvžRÚƒRKíÉð‚`//~;Ń]›Ò³]?ìæ«ÇÕ[ãïç‹¿Ÿ/«·šï=Ö» õêè¨WÇ•·5âÕ'ïåpjšÝ²VÕ¾ªª–{— ‹q×¹0ü¾˜*ùBY¬õä“ZáÞÑÄ7Wצ5qmZ[ÊQ|‚£ã¹L€Ê‹QY/©lQ¨øÐ­R¾ÇdwFžù ·ð¯Z¿ƒßö¦Ú(±ù¿b3ûÃ:,ýäi¼ZËtqÁ>­†ðÈ(fÿ{½o¢kL(ô¸ ­†Ë†bŽeŸ%íÄ||¼ÈÏ?ƒ½ã4(0€ÕÛŽ¡Ñ(ÜÙ6‚„nÍ8}¡€ÿûé?íÊ$ºqõëÕeñ—»ß·-Ó‡wAöŸ¯?È=¢ìæ+ñà ^wÞõ8s±¿ÛïäÒ82€_dPT¼‹Þ£ùxn_ŠŠ$gèùbý¥âRy¹+³_ÇÍ·>ÛÁ؇âxiì]äŸ/à9&9–'=¦Òƒ¤ML+‹µ‰iåt»µ-Ç™¦œ•_4DÉZœœ?`ëhX å=ã0™ªws5¶¥‚ÖÅU†‡¸h5D7‰æ×?òX½- ƒ¡UUÑj4¸ºê¨S§áamd™Ñ6¶µÍ1ÁO»³ùlÝ!Š‹KÐé\ðññ¦qT8ª õêÕãâEøÇ;ë1 ¸ê\ ð·±—´g¿ÅÞúÝél;¡¨Î?_¢"Â,ûŒŒãÐÉÓlþ÷& h4ê׫‹Ÿ¯/ Öwz¼Wf¿~ƒz\¸ –æÕàg“WÀ¡/áJ/çŠXßcjÕê¶ Û*Û^fËÁq¦)·hËý.?tçðkç•à;º‰ªqÑ¡AWmç¨2.8½´ÿ?üü*=&cÛ´rxŒP.]ÙuëÕ¥y³&6á^Þží5oÞ¤ÒóÂÛÛ oo¯*Ÿ?Õ±_¯~½ yõñö®²/ÁºÇtêôE»SÀ«Bîé [•kåŧ¼ iœ‰’Sa„ëÈy&\o ‹ÜÓg?ÿ?5GõÞ0~öÜE²’ãž>(,6::fËß3Ò8¯T”ª LR¡Â­GL떖᱘Ö-kü<¸Þö¡</R×Ý•ž÷÷gÝگȺ =ï„ËŽŸƒ²7ËÎáÌ»Êö%=&A°CëÒ1öëu\oû‚PžK¼=êñ@ßAW•ÞP\Â¥ƒ“ŽRÕÅG„IA ÿìÅ·©Ø[±½©àU*»ÂÔ¼žo~Ü"µ(‚ 8¥y=?× =‡=¦o_Äé|½x\Apȉ¬LÞocÚÔˆ[A„Ú„“ ‚ Â$‚ "L‚ ‚“ ‚ ˆ0 ‚ "L‚ ‚ Â$‚ ˆ0 ‚ ‚“ ‚ Â$˜yíõ× iÄÊ•ÿ'ÎAø“p¹Þ;8{ö,óç¿ÍšµkÉÊ2ÄÏÏfÍšòÅçŸ×jQúâ‹/ùé§iÕ²¥)‚ aÒççs_¯ûÈÍËã­·Þ¤÷ý÷£ª*;v$²ôßKkµc¦O›ÆôiÓäAø“¹®Cy¯¾ò*ÇÒÓyî¹gyxà@êÕ«GýúõéÙ³G…Þ’¯>¾~üç?ÿ!¦M,¾~þ˜L&Þ~ûmbãÚD›Ø8æÏ“ÉT!­={åÿ÷¿ÿåö.] ¡Mlÿþ÷{6éTUåÝw—Ю]{ƒ‚‰iË‚… ~›ªªö–.ý7>¾~øùÐâ¶–Lž<… .8õ… ‚Ó5²ö‡xðªœæÐ¡d~Û¶}^. ,ä…_¢oBéÇxè¡yñ¥—X¸p¡M:«ªÀšµ?°zÕ*þ8°ŸØØXfÍžÍ|` _üÎ;Ì}öY:vêı´£ 6”çŸw—,©ûlÛú+Y™Ç™3{6ò 3gÍrê A„[ëo±+¥B¥8a|áÂw–\ó÷˜ƒ‚)..&7çZ­Ö¦GPF¾>ÏfÛá”||¼-ámbãÈÊÊâÐÁ?ð÷÷çÔ©S´lÕšÐÐPöüždI«ÕjÉÍ9Uaåí'íÞMxxéÄÇ·#2"‚]»v×¶-Çg²kg"‘‘‘œ;wލÆÑ„‡‡‘´{w¥=¦ªØ/ÑhÄ? o§¤Tê A„Ú†ù{Lï±èݥߠ¸œΔ.ùVëçKà Jã—FÀ¨×½Çäïo‚ÊÉɱÙ^&vør ñ©Sf±ñõõÌ'²³³¯*O…\Y1¯g8aÙvò¤Ùn»öðñõ#ªq4™™Y5bÿ·íÛyà ˆÄ×Ïÿ€@NŸ>ãÔ‚ ·×U˜x Ÿ~úÙ5‹›^¯·ùT¡çQvß©2ÑÊʺ"e‚Q& !!Á$:H¾>ϲäåæT)¿Îì5šß¶oç½÷þMöÉœÈÊpzKA„©˜>m-[ÞÆëo¼Á¿þ5ŸììlŒF#Ç«lcРGx÷Ý% Þyç]þ6|¸%NDx8?þø#—/_æµ×_whïÙçž#?ÿ4§OŸæ¹çþ À¸qã,áãÆš×ÿ9ïyÎ;ÇÅ‹ùå—u |ø‘*å×™}£Ñ@Æ 1 ¼ðâ‹r ‚ Xq]§‹{xxðã?ðî»KøæÛoxë_ÿ¢¸¸˜ ЪeKbÚÄTIÜLFŸñï.YB`` 3gÌàïÚgáÂ<3u#F>N£¦L™Â'Ÿ¬°kïþûzÑ»O222ð÷÷ç…çŸg̘ÑW„iÜXÜë¸óÁмÅm¸¹¹Ñ±cžœðD•ÊìÌþ{ÿ^ÊŒ™³HHèKPPO?=IŽBA+®ëä‡ÚDùÉ7›}A„ÚÈM7ùAAª‹“ ‚P«p¹U z½‡ØdOAzL‚ ‚“ ‚ ˆ0 ‚ "L‚ ‚ Â$‚ "L‚ BíÂE\ Ü*˜ŒFJŒFæÞ\( Z­­ÖEê¹øW„IjˆââbNdeñÇýœ9sFr“ ÑhðhèAó-‹ˆ@§ÓI=ß@ÿŠ0 B ö”òrsIJÚÍ]wÝExdc›W µ£Ñȱ£©lÞ´ ­‹–°°p4êNêùúúW„Ij£‘}{öÐãŒl,¹‰ÐjµD7mŽÖEÇo¿þJ@@uêÖ“z¾þýS{rR5Â_Uåô™Ó„…Eˆ/nR…†qöÜŠ‹K¤žo”E˜¡f1™L2¬s£Óé0M¨ªIêùú÷ÏB†ò„[¬óTq¦Ö¥KÙÿÇ^²²21YÂÕ²?\\t4lÐOü|ý ‹@£‘k:©gA„I®ûì!(0˜Î»¢(J…p£Ñȥ˹té"ú|=«¿ÿš˜ÖqD„GÚ/H= "L‚pMdfçöNÝ8s.Ÿ’’TUÅd2aRM¨&Š¢àâ¢ÃÍÝ@ÿ G5!55…5?¬æî½pss'J= "L‚PsæF©¸¸UUK“¹áRUT“‘¢â"ÔË*gÏž“†¶qñ4¨ß€õáÞ»ï“ûRÏ­&L>¾~·ô‡øœ•ÿV÷OU)kŒìmóó?þ¨R ý8y"€¨¨hΞ?ǦÍë¹óŽž×m¸ÇÅÅ…’’©À¿x= Òc«Ë<ɤšxôÑá@éÕti˜ªª¨&ÕjýÊؘ̥86nÞ€^Ÿ‡ŸŸÿ5åÃd21hÐ Ú´iÜ9sþœà½ÚRÏ‚sjÅ”“ÔÔT1’è&M ¡çÝ÷°jÕj©›¼—wÓ4X&µ¬å²ºÚVÍïZSó”-P@ÁEçÊÊOWðÞûKÉÉÉ!80˜ì©Áìá™m+mlŸ;wŽ)S¦»»;~~~ôïߟõë×WÈÇÔ©Siß¾ýu%—Š×¡·ROìzÖ³‹‹K…¥ÖõB\nž~È ÏiZZ%ôeêÔg˜ÿ¯·¨W¿>öïgÑâÅ<ôЃÒ 5>ÌS¡§RºMUUV®\Y-{_ó·=E³à–Ú}ï=†gç¡–ð!C†ÅÏ?ÿLhh(§OŸfãÆ¼øâ‹Üu×]6¶Þ|óM‡yTkè…¤ê-òbÓ?»žÁüž¾Úî뛥þoxéµ×^çéI“x|äH¼½½qsu%>>žåË–ÙÄ[¶|9±qm æÎ;ïbÿ–°ôŒ † {”°ð‚ƒCxdÐ ôz½ÍÕû‡Ë–Ñ6>ž àºtíÆöí;øôÓÏhß¡£ÅæÁƒ‡lÒ,\´ˆfÍ[Ð(4Œ‰“&a(*ºæ^‚³¼ŠŠxjâD…†Ñ¼Åm,Z¼Ø&½³p_?–,YJë˜6ø–9F^xáEš5kNH£PFÃÅ‹-i~ùe]ºv#0(˜Ø¸¶|òÉŠ*…9󃯟O Ÿ<™ˆÈ(""£˜<ð¹¹¹•Ö¿“6mÞL¿~}ÆÛºu+k×|OÚÑ#ôéӇɓ§X†Æøñã8œ’Lrò!¢££™3g®í~6mfõªU¤=ÂÀ4x0?ÿò3ß|ýÇÒŽ’Àä)SlÒü¶í7¶þº…=¿'‘—›Ç«¯¼zÍåu–×W^~…|}>{~ObËæMlÙ²Å&½³p€ÝI»Ù°a=ú<óA9þÛìÙ»— Ö“’|wwwæÍ{Þ“˜1}:é|·z»vïªR˜#Ê&bäëól&e¼ôÒËœÊ>Å®‰ìLÜAÖ‰,^~ùzôèÁ¶ß~àäÉ“LŸ1Ó"ž[·m£GÏžU:®eˆÇ|·ó°Žb×QPP¢ ÑhÍ‹Öüÿô¬Æ6UJ&ôû§íÛo¿'žx‚íÛ·SPP`wÿ¯¾ú*III$&&râÄ ÜÝÝ™9sæUÅ}þùç9xð ;wî$55•¬¬,›«ùâââ Wöe<ûì³dggsèÐ!t€˜6±Lšø½{÷&88Ø&•…9ë5•Ÿ)زUkV¯ú–¨¨(KÞúöãÀþ}üðÃ|ù¿ÿñŸ÷ßgÁÂ…¼ûλ̙3‡áÃeÔèÑ<üðÃÜ׫Wµ€"ƒÏÿûO==“©â+W>úäFGæÉ þ¯ŠC<÷î›m·±òh¶M¼³gÏòÆoðÝwß‘––†¿¿? Ì;×R†èèhÖ¬YCÓ¦MÈÉÉ!>>Þ"*:ÎÒ˜8‹ÉO?ýD“&M*äÙÚŽ½mááá¬[·Îrœ¤¦¦rÏ=÷žžn‰›““c9g._¾ŒEp…W¥œ³w-àÁ‡ÂÃÓ«ÖÕ³½^HuüZ¾Ü:ŽS§Náããcñ¥‡‡G…mÖþ-ÏåË—‰ŽŽæäÉ“ë¿:þuĉ¬LÞï=½»ô{À—€óÀ™Ò%ßjý|ixAiüÀ˜ÌýÙZpÉËË‹üü|œÆ+£N:67mw2ïùyìÛ·ŸË—/›U¶Ü”β“¥,½½måo‡……Ù¬—u‹¯gyÍÍ͵Ùoxx¸Mzgá€(dggÓ±SgÛ+«}~´|o¾ù¯½þ 4ॗ_â¾^½œ†U—¼¼<›ü†‡‡“—g¯nݺ1}†ùêùË/¿dÑâEÌŸ?ŸáÃe×®Ý,Z¸°JÇBe””Û[vïA«Ñ0|øßÌWjŠbùo}pò!«#M‡Óì¾g0 m|[·nž{îYž{îYTU%55• 2hÐ ¾ûÎ<Áçĉ´lÙ²Bý®4º¥ëÎâfggl“Ö¦ñ¶³½l[NNŽMÚ`rrrlÒÔ¯_ÏòÛÅEKIII•ëRN__‡y¯*7¢žÁüÊ£«õ«½r7hP߯—ö¶YûwûöÌ;‡½{÷qéÒ¥J#ÊsÂÝ»óí·«®ÉÆã£F1zÔhþ8°}^.éÇÒjä&ßñãÇ-ë™™™øù]ûL3gyõ÷÷·Ù¯õzUÂíöJ8°Ÿeh-_Ÿg戋‹cåÊNIæÕ×^µ«,¬ºøùùÙä7##___êÕ«Gxx8ß|ó-îîu¸÷ž{()1²víZ"""¨[·n ÜcÀêÁJ«¥tˆG£hÐh4¥C9Wþk5Z´¥Ã;ö«fÏï"ϯ}Û63À I“&¼þúklݺղ=00ÇS¸xñ‚e¹pá¼MºªÆ 䨱c÷_Ù6ÒÓÓ-¿;†ŸŸ_•Ó; ¯N9å¿¶Ösey¿V¿VuÛðáÃ7n©©‡¹pá<ÙÙ'«œÇÚ6)↠ÓôéÓx{Á>úøcΜ9ƒ¡¨ˆ¤¤$FŒY­›‹îîn¸¹»“qüx…{EWËœ9sÑçç£ÏÏgöì9 0 J7ý¯%¯ú÷¿²_½žY³fW+Ü#GŒ`òä)KO§¤¤„ƒ1zÌKø˜1cIII±<o4–T)¬2<<<8räˆÍ¶~ýú2kÖlôz=z½ž™³fÑ¿?KxÏž=˜3w.<ü0È´é3èÙ³GMÝe¨ô¤Ôh4|ôÑr–´ŒåË—±lù‡,[ö!.û€—}@ÖäÀ Uà3¿P72SéëmÊŸü÷Ýw?ÿûßÿÈÉÉ¡¤¤„ÌÌLž}öYÚ·oo‰3jÔãLœ8‘´´4Š‹‹9pà=6Ânƒâ,îСCùÇ?þAVVgÏžeúôé–0>ì°±0 ?S§N#77—ÜÜ\¦NÊÀjL˜ªSÎkk8ÿüz®,ï×êתn+((ÀÍÍ WWWÒÓÓyꩉ6áöê_„ÉQQQ|óõW¬[·žøv퉈ˆdÚôôï׿Ê6.x›9sæFBB_:vèX#yëØ©#]ºt%66/oofΜqÍ6åuÖ¬™xxzÿŠä2 IDATÒ¦M,]ºv£K×.Õ ·ÇÓOO¢S§ŽôëןF¡aŒ7Ž>½ûXÂïï}?{l¡aáÌ›÷úh¹%ÎäÉ“éÔ©3}ú<€¿?>ŠxÀnãã,îŒÓiÚ´;ßN«V­iÔ¨‘%lÒ¤ItëÖ Úµ=wî\üýý‰‰iCLLƒ˜3gN SuÊy]zL×±ž+ËûµúµªÛÞyg13fÌ$ ûïïM§NmÂíÕm¦>ù¡¶"¯ùùëPvS|ììÎöZñéÇL7}~.Š¢Ø.¥³µŽ>éEÛðä ŒÒ%ÒhÆFÜÃbQU•† =Y¸x>{t„|&á:²üƒÿTiòƒÔóõñ¯#þ’“áÏÂá;ÔJ¯‚Eá?¼o7íŒô(„Ïz ÷ð¸+¶”²«Vó Bo•X¥ž¥ž¯'"LÂU÷(Q[{šeC<ö²2ÆŒk¹zÆêŠzÂO¡ €b~ךùãr¥¯³L&U+©gA„éú"ÃxEÿ\i`¬Qs£Uv%\öÜ¥Röò4UA-¬ØZCA±¤E,©gA„Iªß^Ù6*C>>~9šJtã&Õþ¤ªª9šŠ¿……ÜÜ\ÅÏRÏ‚“ Tµ½²†1™Lèõy(ªÂ¦ÍY³v5&“jÕ¶q²±¦š§ׯWèõyÊ©gA„Iª|ÙkÓè(Š‚Mš4¥äßæ¢Óáãã#7Æ¥ž&A¨V{U¡1Ñét„…†Öà>¤±’zD˜¡ h4L¥_&n>Œ&Z­VêùûW„Ij EÁÓÓ“ÌãÇkä}‡ÂŸÏé|=^^Þ(ŠFêùFùW„Ij­FKëÖ1lß¶•;áëçF£ˆcnL&}^.;wÛ¶-®®nRÏ7È¿"L‚Pƒh´‚‚‚iÕº5{~Oâü¹sí|¯G¨…Z-žž´jÝ _Üë¸K=ß ÿŠ0 B ¢( .®:¢¢¢ ¡¤Ähy¡§p\X(\\u¸»×‘z¾þa„ëqu袣®‹N!õ,Ôv±‚ "L‚ ‚ Â$‚ ˆ0 ‚ ‚“ ‚p3#³òA¸iQU8u®ˆü FŠLò©¤ê¢(યz‚½ÜPjÉóÈ"L‚ Üœ¢Î)äÌÙKlJÜOvþeL"LÕB«@°o]ºÆ·à¢ÁƒfAò€­ ÂU“{¶˜óç/ñÕOÛégK:·k…›«<¿T EÅlÛ¹¯ÙÅÀ{;SGK€ç÷¡“ 7%yJذ}?ÜC×v1â«ÀÍUÇ]]âÑ¹êØ°ãîëÙ¡V“L~ᦤÈÙù—iÓBœq´‹iÎÉÓ—)6ÖŽ›LÒcá¦DUÁ¨‚««¹µt='7WŒjí™<"Â$ÂM¯Pö> XpùÉ)ûÈ>™…É®–ýá⢣~½ú4ôðÄÛËFáh42ˆ$Â$‚p8”¼—FÁ!tíÜ ÅÎ>¾~äëóþRŽÿ+–©ªeû+—]¸ºäàSÙ6“ÉÄÇT©„~ œ<‘ @TT4gÏŸcÇötê|× Öó¨ïƹ‹† Û7oÚÈã#%//Ïn¸“ â'µ·Ãdùz­I5ñè£ÃÒ^Si˜ªª¨&ÕjýÊ×nccâØ¸yù§óðññ¿aåð¬ïÆÙRš÷Ϲ¼ÿáÇÜyWÔra%jÅ”ÔÔT1’è&M ¡çÝ÷°jÕj9ã*œª ¢ôçúûZÓ×*M¶‹Zö~"Ë0^i˜ª‚ª˜£)˜_‡‚‹Î••Ÿ®à½÷—’““Cp`0çf‡’6Þ ;þÏÆ¶g}7:µ‹-?«}ª&:Æ·Á³¾›Ã|Um¹R®³ -ëì§k·nvî}‘“…´´4JèËÔ©Ï0ÿ_oQ¯~}ìßϢŋyè¡åœÁ©.©v^’W6E\UUV®\Y-“_ó·=E³à–Ú}ËFR¿ý`›8uêÔá‡5ßsßý},Û¾ÿn5uëÖ5ï÷_Üg/}aAZöšmKÉ ¯½ö:OOšÄã#Gâí훫+ñññ,_¶Ì&Þ²åˉkK`P0wÞyû°„¥gd0lØ£„…GÂ#ƒ¡×ëm®^?\¶Œ¶ññ‡Ð¥k7¶oßÁ§Ÿ~Fû-6r8.^°±óî;‹hÙ"oºµ¸¿T „iÓæÍôë××i¼­[·²vÍ÷¤=BŸ>}˜·,à£?æÌ™3ŠŠHJJbÄÈ‘U¶QXXˆ»»nîîd?^á^ÑÕ2gÎ\ôùùèóó™={ °„3–””ËSåFc‰C;ú÷¿bK¯gÖ¬Ù6á#GŒ`òä)KO§¤¤„ƒ1żö<<<8räÈ5—¯*“œùÖYÙœ…ÛÙ?*ó}uêÅšÊÒÙó·3¿ØKSÝzªˆª¢š¨¸”6¶†>ZÎò–±|ù2–-ÿeË>äÃeðá²ÈšXA”Ÿù…º‘ñæFÛhž^nm®¬?9ñïdœÈcÂS·þPBæÎžI^ny¹yÌ5ƒ„¾,á}û ä¹9³ÑçéÍá³gÚ¤w´^þ÷ðÇç™)O“žvŒâ¢ýqñ£G9L[~a²"**Šo¾þŠuëÖß®=‘L›>ƒþýúWÙÆÂo3gÎ\BCÃHHèKÇk$o;u¤K—®ÄÆÆáåíÍÌ™3,a÷÷¾Ÿ¿=6‚аpæÍ{ž¥K–:´3kÖL<<=iÓ&–.]»Ñ¥k›ð§ŸžD§Néׯ?BÃ;n}z÷qhï©'Ÿ¤GÏ»ÿ”geœùÖYÙœ…ÛÙ?*ó}uêÅšÊÒÙó·3¿ØKSÝzª¬KØ}Ž©´µU £ÍèQc3z,cFcì˜qŒ3žqcǶ¢¹ø4u"âJrµtÔÏñsFΞCš1k~~~t騖.ÛÈô™³-áÓfÌÂÃÓ“m[ÓóŽ.Ü~{×rö©d¿W~?5ñi:tèÄ#hÌ“ãGsŸ>ÕÌsíà†O~¨­È[¡vS6ùá­ô£¸¸¸BøªoV2aÜDôù¹(Šb»”ÎÊ;ú¤mWÀ“ƒ:0J—H£q‹EUU6ôdáâùô0ü–øÆŒ…ßÉäA„šé1™,½#›í¥÷˜Eá?¼o¿1^IBø¬·p»ò†EµØVlì‡U}¤âx¶\Ü^ "LÂ-Óv„ôŒora2ÙK‚õd”1£ÇZzIXõœ&<ñ (æwê™?"xåS®&“ZÁvƉÜjäM¾­+ÂTƒHc%õ)Ü$„ý·‹›{:*Š¢˜{B¥Ï×*e/ÉSÔÒ)àŠ=ó#¸Öi&A„ê(Sñ(**ÂÃÓ—#GS‰nܤÚÏ‹©ªÊ‘£©xûøc0puu?‹0 ‚ \]Éd2‘¯×S\ë6ldÍÚÕ˜¬†ÔÌCu¶"dcM5O1ww¯Oº È×ëñ¸%&@ˆ0 ‚ Ô„0™Ô ¯$òôò"*²1Å%%×d[çâ‚gé[gì½öHaA°Óc²ÌU¸"(:WB…ÕÜ>ä6““ ‚34 ”K®¼A\¸*ŠKŒh›WŠ0 ‚ TW ùÔå÷©´n.¹’fìS¦v¼“ 7%>õµôèØ’/~L¤¨ØDë¦aè\d‚BõzJ&ö>Î/;ÓØ«#>õj‡ÿD˜A¸)ñ÷pá|aúßÛ-;ÿ`ÍöcÈó¬ÕC£@°O=úÝÛ‘†õëìí.Â$‚pµh5šº“í®pß](6*2I¡š( ¸hT¼ë@°wZ“/&Anê†5ØË`/ñÅ_ª''.AD˜AA„IAaA&AáfFfå ‚pSc2)1å…vW‹¢ ÕjÐjkˆ0 ‚pÓR\\̉¬,þ8°Ÿ3gΈCª‰F£Á£¡Í[´ ,"N'Â$‚p-=¥¼Ü\’’vs×]wÙ­V+Ž©F£‘cGSÙ¼iZ-aaáhjE˜A¸))1Ù·g=î¾›ÈÈÆâ«@«ÕÝ´9Z¿ýú+Ô©[ïÆ÷ä¤jA¸)QUNŸ9MXX„øâiÆÙsg(..©ùaá¦Åd2Éð]  Óé0M¨jíøJ¯ å ‚ðè%%%¨ªŠÉd¤šPM&EÁÅE‡›»þA4ŽjBjj k~XÍÝ=záææ&NaA¨9ŒF³ø£ªjéb2 ”ª¢šŒ¡^V9{ö,˜4´‹§Aý¬ßø ÷Þ}ŸÜ¿arŒ¯ùú<©-ñµ T Ltìmó‰?þ¨R ý8y"€¨¨hΞ?ǦÍë¹óŽž7dXÏÅÅ…’’Š3ä6lØÀ°aÃÈÍ͵.Â$ˆˆ‰ˆ µZ°Ì3ÌLª‰G”öšJÃTUE5©VëWf¤ÅÆÄ±qóôú<üüüol#m%R³gÏæ“O>¡gÏž• ØÍN­˜‚’ššÊc#Fݤ)AÁ!ô¼ûV­Z-gV-GDI¨ÕÂdRËʪW¥šß©§*æ©y æÏà¢à¢seå§+xïý¥äääLöÔ`öpá̶•Ä"&&¦BOMUUZ·n‹KÍ]ó[ Ïþýû¹ãŽ;ì†I©IKKã¡„¾Lú óÿõõê×çÀþý,Z¼˜‡zPÎ.AªÐ;ª8”W6E\UUV®\Y-{_ó·=E³à–Ú}ï=†gç¡6qêÔ©Ãwß}Ç<`Ùöí·ßR·n]‡yºÖ2 Õj¯Ù¶ô˜œðÚk¯óô¤I<>r$ÞÞÞ¸¹ºÏòeËlâ-[¾œØ¸¶sçw±ÿÀKXzFÆ=JXxÁÁ!<2hz½ÞîãëLJ˖Ñ6>ž àºtíÆöí;øôÓÏhß¡£ÅæÁƒ‡lÒ,\´ˆfÍ[Ð(4Œ‰“&a(*²„ÿòË:ºtíF`P0±qmùä“ËXY\£ÑÈ /¼H³fÍ iÊè1c¸xñ¢%¼¸¸˜9sçÒ´Y3¢GóλïZ Ÿ<™ˆÈ(""£˜}ú0yòKØÐ¡Ã?~‡S’IN>Dtt4sæÌµÝϦͬ^µŠ´£G8`ƒæç_~曯¿âXÚQ˜úäFGæÉ þ¯ŠCy÷î›mW”üš]¡S\\ÌþóÖ¬YÃW_}EŸ>}èß¿?£F²„„‡‡³nÝ:ËyššÊ=÷ÜCzz:¬[·Îrާ¦¦rÛm·YÒ[Û²^/ÿ;::š5kÖдiSrrrˆ'++Ë7##Ãá¹öî¢<øÐCxxzU«Ndeòþ{ï±èݥߠ¸œΔ.ùVëçKà Jã—FÀdîßÖ‚{L^^^äççà4žõØ®õM¿ÄÄÌ{~ûöíçòåËf•-7ųL€ÊÒÛÛVþFbXX˜Íznn~ù2Þ|ó-^{ý 6hÀK/¿Ä}½zÙÍ{eq³³³éØ©³íÕ‚UÞsrr·k7//Ï&,<<œ¼¼¼*û-77צŒå÷S¿Zc-JU)[u|(Ž())¶;  ì“V£aøð¿™¯ÀÅòßúêàä?B*ˆÒ‘¦Ãivß3 …Žý¢"ƒ=¼yóX±bûöíã³Ï>¥¨È` /;‡CB‚-¿CB‚ÉÉɱü>uêÁÁA6áÖé+[·þ}âÄ Z¶lYá|³ŽïëëS!½ åÙáŽîÝùöÛU×dãñQ£=j4Ø>/—ôci5rsðøñã–õÌÌLüü®Ü㈋‹cåÊNIæÕ×^µ"+Oeq8°ùú<ËR6Vž‘‘a×®ŸŸŸM322ðõõ­rùüýýmÒ[¯×„_•­:>‡Cv*VÐZ-¥CyEƒF£)²»ò_«Ñ¢-Ƴ'JÍžßEž_;»¶ÍûUquuå‰'ž`̘1L˜0WWW›pUUñ÷÷'==ÝòûرcøùùY~Ø„—õ¤Êï«üzùß>œÂÅ‹,Ë… 禵W&¦R¦OŸÆÛ ðÑÇsæÌ EE$%%1bäÈ*Û(,,ÄÝÝ 7ww2ޝp¯èj™3g.úü|ôùùÌž=‡XÂÆŒKJJŠå©r£Ññ´ÍÊâŽ1‚É“§p,=’’<Äè1c,áƒbúŒ™œZÎò–±|ù2–-ÿeË>äÃeðá²ÈšXA”Ÿù…º‘ñ˜J_cT™ L™2™3gN3yòßí†П©S§‘››Knn.S§NeàÀ–ð‡Èôé3ÈËË#77—iÓ¦]•0õ8'N$--ââb8Àcaº¢¢¢øæë¯X·n=ñíÚÉ´é3è߯•m,\ð6sæÌ%44Œ„„¾tìбFòÖ±SGºtéJll^ÞÞÌœ9ÃvïûùÛc# gÞ¼çYºd©C;•Å}úéItêÔ‘~ýúÓ(4Œ±ãÆÑ§wKø´©SiÚ´ Ý︓¶ñíhÒèŠpΞŸ¿ñíÚß®=Ìž5«Êå›5k&žž´iK—®ÝèÒµKúÕYÙªãCA¨v©ô[EÑ0êñÑŒ5†1£Ç2fô8ÆŽǸ1ã7v<`+J‘‹OS'"ÎlÛd¿A¯J#_¶>wî\üýý‰‰iCLLƒ˜3gŽ%|öìÙxzzrÛm-騱]»v½*aš?EQl—ÒYyGŸô¢í xrPFéi4c#îa±¨ªJÆž,\<Ÿ¿=:â–øÆòþ#“Aj¦Çäà]y¥½EQøÏïÛM;c$= á³ÞÂ=<îŠ-¥¬‡a~¬µ}Ïj4ÜgÏž‘ º D˜A¸É…‰J_â 0fôXK/ «žÓ„'žBAÅüN=óGK_[˜LEïÌ™ÓÕMA„©Æa§óõxyy£(µã>š“ 7%Z–Ö­cؾm+:vÂ×ÏFÇT“IEŸ—ËÎÄĶm‹««›“ ÂÕ¢Ñj ¦UëÖìù=‰óçÎa´ó]&¡q×jñðô¤UëVøúøà^Ç]„IájQWQQQ„„„PRb´¼¸U¨†À+\\u¸»×©5yaáæ¾êwÑQ×E'Žø+‰¥¸@AaA&AA„IAD˜A„›™•'Ö¨*EEÅ¡Ê31­Ð;ÑhpÑépss«5ya+.vô;ÉÎ>)n(aaá×Õ¾V«ÅÓÓ“fÍ[‚{:µâ½ƒ"L‚PJqQ'Nd±iãzÞÓ‹ÐÐ0ùpCùßÿeâß§\7ûF£‘ciGÙ²y#žžž4ôðÄ`(a„Ú‚¡¨ˆm¿þJ¯ûúСS'qˆð—G«Õݤ)Z­–¿ýÆ€G©Â$—ƒ‚PŠj2qêT6AÁÁâ á–¢Qh§Oçךé1 ‚F£Q†ï„ÚwÑtïû¸¸¸`4kMyå Aj"L‚ ‚Ó­ˆ¯ß I[÷cÍüùoóèð¿]×} {t8o/X ¡pS¢ªêŸ²ˆ0 pùòe–.]Ê ÏÏ»®ûy~Þ?Yòî Åé‚ =¦Úy•.Ô¾ûî;:uîLddäuÝOãÆi×¾=kÖ®½ê+Ö—^z‰-ZpÛm·ñÊ+¯Ôº+LAa„à‡¤OŸÞʾúõëËk¸ª´+W®dûöílܸ‘ 6°mÛ6>ýôS©@áO£²!¸~ø~øášãˆ0U‘ôŒ † {”°ð‚ƒCxdÐ ôz½MokÉ’¥´Žiƒ¯Ÿ?………Lxò)…†Ñ¼Åm,\´È¦Wf4yá…iÖ¬9!B=f /^¬´g½ÍÞ>Ëc(*⩉-yX´x±M¸³<Øcá¢E4kÞ‚F¡aLœ4 CQÑ•ý ü}òd""£ˆˆŒbòä) †Jóì,Wã‡ê–kÏž=´oß¾Z¾ññõãÃeËhOPp]ºvcûö|úég´ïБÀ `î¼ó./€—_~…óçϳgÏïüúëvlßaþü·Ù³w/6¬'%ùîîîÌ›÷|µòU~ŸåyååWÈ×ç³ç÷$¶lÞÄ–-[®9¿mû­¿naÏïIäåæñê+¯ZÂ^zéeNeŸb×ÎDv&î ëD/¿üJ¥yv–Ç«ñCuË•““K`@@µ}³iÓfV¯ZEÚÑ# 0€Aƒóó/?óÍ×_q,í( Lžbû—à`²OºªãððáÃÄÄÄX~ÇÄÄ’’"-¢P+X±bwÜq‡]q*¥;+VÜ4eRJ—²u  8a|áÂw–p:_Ý3àãëG¾>¯Jq ˆ#%%Ù’öû ´ÄiÕ:†ï¾[MD¸ùå‡ÇŽ£]û–}ÄÆµåË/>'::€¼¼<ºu¿ƒäCæÇz›½}–§UëV¯úÖrïäèÑ£tèØ©Êy°ç£];-öÒÒÒHèÛýûöвUkV¯ú–¨¨(ËþúöãÀþ}•ú©²<^ª[®àFd¤C§ÓUÙ†¯©‡Sðöö¶BÃ*l‹ˆŒ"çT¶Ånqq1‘QœÈÊtXoΟÿÿöî<>ªúÞÿøëœ3“ÉJ²B6­(êJ]Ð*VATZ[ZQ0‚²w¹WÛb‘EŠ,½Þöw HýQØ^ýzý¡]4м( •,“YÏ9÷d†™a’I€˜„|žÇy03ç䜓ï7œ÷ùœmXûúj ç½Dÿìlÿç999œ8qÂã­aäççsòäIÙ*ŠNõúª×xnn!F„'Ý;N~øavïÞÍÊ•+™8q"|ðóæÍã–[naûöíDGG·97Ö®áÙÙs¨¯«ëÐ:–•žâW›6±ö ï.ÀØz ¶e¨x]ß2ÞÑ2½Ð0¡›?ù¡¨èïüä_~Bqñ4555§§¢Mä„lT9s†1co NçyFÒV(ùÖ!77×ÿ>//ï’×!p~¹¹¹TTœ¯Ö*++ƒ–‘——GeeeÄvjk/¦:ú{effpúôòòr;4_ÄÄÄ„ýÌëõÿç9}ú‚ꬽâââ°Ûí$$$`·Û‰‹‹“­¦øJx<¼^OÛ†[¶lfÚ´ÇxöÙgýŸOœ8‘-[6£(t‹gà]‡ò¾7cߟñ}ø‚ªÊ JŽ‹x’.--S¥¥þ÷§Nï!gddpà‹bª«*ýCà!9‹Å‚Ãá𿯩©éðz§§§íM‡îYGZ‡pçqêÔ)ÒÒÒ‚~çÀñ'Nœ 55õ’ÖñbÚ¡£¿×È‘#Ù³wÏ%·M{ìÙ³‡ë¯¿þ¢~vÈ!ûß3tèPÙbНHûîC²Ùllݺ…‰ïl ¥;Ùºu 6›MîcºœœN'ÑÑ6lÑÑœ8yò‚óá<ôÐd–-û!ÕÕ5TW×\pNê»O>Iaá /)Áëõòå—ÿÍ÷ðÿø«¯¾š_þr‡ƒ3gÎ0oþü¯÷·zˆ¥K—QU]MUU‹/éÐ:„ãŸ_u5K–,åáo}Ë?nòäY¼x UUUTUU±hñbzhò%­ãÅ´CG¯»ïº‹;Þ½ä¶iwßýwÝ}×Eýì#<ÂòåË9{ö,gÏžeùòåL™2E¶—⫉%³ý7ÙÚl6¶lÙ¢E‹Ø²¥ý¡$ÁFßÔ´ €×׬féÒeäääòÀ2fô˜ˆóZ¼hñqq\[PÀÍãÆ1jÔ¨ ssçÎaìØ1LžüÙ9¹<5s&“îä¿zõ*Þÿ}ò äž{'1a„ÿ>‹/"1)‰‚‚‘Œ?qãÇ´áŒ;†qãÆ3räu$§¤°hÑÂó¡µd iéiÜ0êFnu#™™™,Y¼ø’ÖñbÚ¡£¿×ý÷ßOÑgŸqüøñKj›HŽ;FQQ÷Mº¸ù<ñÄŒ=š[o½•[o½•±cÇ2mÚ4ÙbŠnU1†ÓÂ… :JÝ-˜ºüâ‡ÎväȦ>ú(ûöî•¿ïnhõêÕìٻͿýN[ÆӿͨQ7ðüܹmN×ÚÅBt•×W½Æž~wÀí!åÿüû›rñCgZ²t)/ΟÛífÙ²rï½÷Ê_x7õüóÏwú2:3ô„èôzÉ41#\•w¥¹"ƒ)7'—ÑcÆàtº¸çî»Y´p¡üu !zh2ÑëuEÓÌ™O1sæSò-„¸rÉ”`BÑ‚É41$˜„è½4M‹x—½_m0uþ¡<]7Ð4M‚IˆîFQU23³8sú49OÅ¢+9šì¾ŒšêJRRúv›2 &!ZDY£¸yüxví|ĤD Ò­ö"Eo­˜:¯Z2 “ªÊ þ^ô·Þ~GзH0 Ñ‚ÉEnN÷Nº÷ÿøÊÏ–£ëº4Œè2¹¹yüî­­6MÓHNNfÜ„ ôëߟ&»½[üÞLBˆŽ‰fØðáŒ(隸]Åårb³Ewê2 ÃÀívw›P’`"„iš¸œ.\N—4†èáÔ ÿe—P!„“B!Á$„B‚I!„`B!Á$„BH0 !„`B!$˜„BH0 !„LB!„“BˆîFâ*D;ºŽW×›¿NT\^Š‚¦©hšEú¢‡õ…“]ÄãñPVZÊÁ_P[[+ r©ªJbŸD†}íkäæçcµZ¥/zH_H0 Ñ…•ReEûöíå¶Ûn#oÀUò­¶—‘®ë?z„wïF³häææ¡¶Ò¾Òݧ/$˜„èB^]§xÿ~n¿óN ¸Jä2Ó4AC†¡Y¬üíÏ&##ƒ˜Ø8é‹nÞ^½IwÑÓ¤¦¶†ÜÜ|i‹N”“˹ºZ<¯ôEOè &!º–arȨ“Y­VtÝÀ4 é‹ÒIå Ñîâ©ãWU}ú)§ß{êOvSûy1ž&Šª’ôµ¡ô?ŒÛn'ûÁAQ¤;¹/DÏ!Á$D'ðÚíü£ðyʶÿ_rrSÉMïÈI£ˆIIÄcwP_QCígr`Çv­x•±[Þ".?_®ØöQ1¯¿ý7¼†¦‰i‚IsÞ5f¯Ìœ($Á$DÏRññÇüí±iôטpïXu'ª£*ŽÁ‰¬Ñ±ôëCÊU) 9˜’ý‡ÙYp-Ë_eÐÓOKvå…n°rÛ_ø×§î .Ú†n*x 0L¨oòò³ÿLLBô,õ‡óÉý÷qí59¤ågbž<ŒÙT MSPTÀU‡é¨ÃÐM K ùC†‘šÕ—½?Y†Ç€éÓ¥!¿BGJ«¹ª_ ªªø&ÆE³{ÿI܆‚Ë .]᎑9rOïWD.~¢LÓŒ8ºÎߦNaЀtRÒð܃ÒX‹ª*¨š‚jQ°XU,VÍÒò™Ûñå>¢=v òùÇœÙ4••µky]1hšÖió¾œ}ÑÞá¿öå»/oGQÎ[™&† Ü^nâñš8ÝTEé²öì̶¿Ø¾`¢›ûŸ+ â ýdá=zÅ0PPTPUP5Ð,ÊùPR[*(ÌÒcÄÅÛÈíŸÌgß–Š©ów4`ý;E¬yû¯8\ç/‹öa‚×ݯ¡ p®®¡s_Yä–“—‘árqàÇ?fèà~è§OÇ @ÜÊ·ˆÝ´ RÒƒ 9ÛÆÿ"zùVÿGúñÃä É¡á‹Ï©üä“V—µbÅ l6+V¬†¿MNsW¿ÇÞÃå>qGðHLÀ0›ÃÈ­CƒÝ‰énàêüÔ I³³³q:a—qîÜ9FŽÙ¡Ç&y½^é_HKÑþCH­©-.&:>–èØôS‡°X›÷¼ÕÔL,#nD]û>®¹“Ðë*!%˪ÿDÍ‚±ÿ¯`6ïÁ›MMÐÔHJŸXª>ý”Ôñã/ @Ã`Æ ¼öÚk¬Y³†ÂÂBTUí6íÐÝס¬²žçVþ'Ã®Êæ›·Åfm¾'jÔ÷Þš®pÕÐ4…‰7fáôÛ©ªk Zö¸qãøÍo~ÃÌ™3/XÎÆ=z4III×µ£‡1¥bB´KíÞ½$ÄÚ0šš0 üCÝì©èÇ¡æÁ¶æ=¼9Ãü¡¤—ÂþÒ†‰Ù2 $ÄZ©þäã°ËÙ¹s'ÉÉÉÌš5‹¾}û²k×® ñV«•M›61hÐ bcc5jŸþy‡Æ‡jíažº®³dÉúõëGŸ>}xüñÇihhú¹5kÖ0`À¢¢¢º¼Š¾,å;/¿ÃÍ×gÜuC8r¦X·p OáÍeSùí§òö+ñîò'ø`õwùdýL~4ãv.tÝ@UÏßo¶`ÁV­Z…a߈êv»Y¿~=óçÏçøñãLž<™äädâãã¹ï¾û¨¨¨»~íìr¹˜1c‰‰‰dggóÚk¯õè¶—`¢ TýùÏÄZôƆæ€1L ÝD¯,§nÆ=þpŠys·?”Ÿº½¢CÃhìÄÆÇR³woØålذY³fðÌ3ϰ~ýú ¦Ù½{7»w零²’|§C.A4¾½~þóŸ³oß>ŠŠŠ(++#::šE‹‡AQEEE¸Ýî.íŸÍ»>ç‡ÿö'¹gý2RùçéF ÃäË“u*­ãpiGÊÎñÏÓu.­åð©j¾,)§¼ºÊÚF8‹i‚p#ôu×]ÇÀyçw‚–µmÛ6n¼ñFÌ<Àœ9s8}ú4eee 2„_|1âúþèG?¢ªªŠ#Gްwï^þô§?õض—`¢‹8JK±j†ËÓ0zËàïÙrêçMÇt»P¢l˜n ó§ã-?‹î51|ƒn¢;ÝXT Wí¹ –qüøqöìÙÃÔ©S˜2e {ö졤¤$hºµk×Ò¿âââxá…Ø¿‡Æ·×¯ýkÖ¬YCvv6 üô§?eÇŽAÓüâ¿ --­KûfñÆØñ—£1Q0Ìæ‹tÃÄk˜èº‰Ió ¶MÅåñk >û±`Á‚ ª™U«Vù縸˜Ûn»˜˜yùå—ùðÃ#®ó¶mÛX¹r%éééddd°jÕªÙöKÎ1 Ñ^¯§Í“ÓI7ÝDãæC¤ÄÅcêfóÕx  €ššIŠßúCI‰²ÿêo9÷äÝègÏ6’ÞL¦ÕFc]}† Æív-cݺuTVV’pÁ篼ò²ÿ}||œÿg- ¯×4¯HãC—ú™ïuYYW_}uÐtŠ¢M›šÚ7ìü:³/B9Ý0Á<º‰[7°è*¦[§ÎîEÁÄ¢šÄX¢­ ÑVÕÿÚ4LP!Úf¥¼º¼Ì¤ ß禛Ƣª*}ô!_ÿú×ùè£HNN¦ àZÜnŸ~úË–-åóÏ‹±ÛíaÛ(ÜëòòrúõËò¿ïß¿_·h{©˜„èFL³íûg’n¸FL«­ùÆYÝD÷š˜Ié$ÿÇN,‡â=zˆêoÇ{ô–CIüõN̤tÕ¤ë&Xc¨¯k"馛ƒæïp8زe ¤±±Á?8p€Í›7ãp8ü'ÆÃÝ“îu¸Ï, v»Ýÿ¾ºººÕŸÏÌÌäðáCAëÓÐPßæ².Ï}L›ïÏžº‰7dó»?îÆŠ—ܾ±4:tJ«ÔÙ½8Ý^€ÁÄÛ²³ V‹Jb\ o}XÌ£\0ÿyóæ±rå*LÓdõê5¼ðB¡ÜôéÓ™9s&Gަ¡¡ž3gN·«o222())ñ¿÷UÅÕör“=3šÚüœxÝHëê›ãaA÷6Sê[±^5Ï?Qñè7pü‚ŠißÀsôÖ«†’²ámÿ´† k4v/¤Œ4ÿíÛ·3jÔ(rss‚>ÏËËåúë¯cûöß_–`1âÖ¬YƒÝÞDYYsæÌmõçgÌø³gÏæØ±cx<8Àw¾ód§S¤¾7|çî,||,ïìü„òÊj†e' © wdrˈ Æ Ï`̰tnœNÁUé ÏOcPN*MN/ÅGËùù扱2y° æ}Ï=wSVVÆÖ­oQUUÅwÞ´Ca³ÙˆŠŠ¢¤¤„çž›Ýj{¾~䑇Y°`!•••TTTðÒK/ujÛw·`’CyBt`/½5ÑYY$ ÄÙ3¤§f ——bšà­ªÂ¹¯ˆŠï=ŒQuàL9åO$mã[èÕUèžæ‹%”ľØš¨kl"õÖ[‚–·qã&–.]vf̘Áòå¯òØcÓü¤ ×ß û:ô³×__ËsÏÍbùòWÉÊÊ¢°°;v„ýùÂÂBV­ZͤI÷Q^^ÎàÁƒyñÅ#.«³û¢5c‡÷gý¼{˜¿î#jêò¹yä ^\¹=ìôŠ)}bèŸÚ‡©·gBAnK(^8maáó<ó̳lذ>hÝÖ­û% .âÔ©'ÈÊÊbîÜ9üþ÷¿oµ|¯—,YÂܹÏ3|øÕÄÇÇ3gÎlvíú ËÛþ«ÒrÜÿZ´ÙÏ>í|}Ýzjª«d‹$z5·ËÅÛ¿ÛÆSÏ<ñê¦Æ#GødÂ×ùZ¿T¬Ž°7øŸî ª (ßnažßÀ YQûåpðÄYÿôgä<þX¯këß¼ùoÜÿÍo’˜”|É}Ñ»ÓÃÒ_ý\†Æä;nàåï²{í·å½}¨¬ô¿Ú´‰µolxpÀÔµ-CuÀëú–ñŽ–é½€Nói@S*&!Ú½—ùGÜ A ^¸€’Õ«”–¨è u( ªt©ñùyѱh©é”©&öÚ²›vQ{»I6"çÎÕöš¾hK¬ÍŠYw°aÇ>Þ|gwsè¹Ý˜fsùUU/è³ÞØÞ]A‚IˆËxøhÀsÏqfç.šF“î ÎãÁðxpÆÄðÏo|ƒ¨‘d:G‡EQdûú"Tà!ºÐÃuù™ †î?”§ªšÿ0^è´ªªJ¿H0 Ñ]¶…‘ÏkDGGÓ¿_?,š†¦©Øl6j.¤¤º ÏÑ£XNž"¶¼œÆ>}hÊÈÀ›“MlßTÒ’INJ&5µ/yyùdff%ÀKè‹pÁÕ\ù†ðz½èºŽ®ëþï<ò ª¦¡µ„‘ïžô‰“Ýhkؾ¡Õj%;;›ììlÜn7v»¦¦&œN'N— ·Ë…¢(X­Vl66[4 ñÄÆÆ=lS6€—Þ­ šö>àTúC‚Iˆî¸-ìðÆÉjµ’””DRR’lüº¸/„“WUU1LC6†H7Œv]T }Ñ}úB‚Iˆ®¢($%%qêäÉû¤æž ¦ºŠääE•¾è }!Á$D×ÑT#®åÓ¿þ…ÑcÆ’š–ôeqâÒ†IUe/úŒ‘×_OT”Mú¢ô…“]HÕT²²úq͈ìÿÇ>êëêÐC¾±T\Bðk‰II\3âRûö%:&Zú¢ô…“]HQ,QVHÿþýñzuLS6†—5üK”•èèé‹ÒLBt‡½I‹•X‹UBúB|)M „B‚I!„`B!Á$„BH0 !„`BÑÛ™aÂü+Á$„B*&!„½·bj«z¢=ÕS›7Ø–•ž’¦BÑFKà­R»íµLsf=#Í,„¢½ô€Áø×7D¬”|”–Á÷Z´–! ˆâ€ H’€ä–÷}€Ø–é¢Z‚Nk™Oà|…B\9«_y7àš€z ¨Î5-ï;à\!af¶V1…–^‰ç <-+á #_)§J0 !D¯ &# ˜<-ƒ/+Bƒ'â!=Kˇ ášaÑ·pwKÚieœ% êB‚I!®øp ÌOK%䫆ƒ*0 Œ¶Š¢Ö*¦ÖBÉHÎJÉLŠTLBqÅS`N“#L8yC*§Ö.’hõâß„z˜Pr¯RòpþžLJBqåS`Vø ;ÍçšœaÂI'üeä¦%B†žÔ JnäÂ!„èÁá/€ðUMMÕ“;¤jºèŠ)ð„–00ÎXK % &!„¸²+&¾ÂN‡õ|U“ÑFÅD¤ŠÉ—€ZË‚B߆’LR1 !Ä•_1Sà©çë…;œ±b2B$Ü ­ÀÃsFH0ž[RCI‚I!zOÕîºß¾`j3”ÂUL„„’'`œoÁî0•’‚<O!zc@a*'ß© _P…«˜.¨ÂÚsŽ)tÁ¾` ¬’”ªJª%!„èšf˜ê©­›mÛ¬˜Bçùžâ.œ|‡÷´*Iá !Dï §ÀCz&ÁWß…>?Ï S1™mU5¡UÚŽ%”„BÂ)4œ"ý®òŠL¾÷‘†HóBqåSàûH ¦¶+Ü£†ä¼’BˆHß½Ôê“Ú@í­¨$„Bt$ Ú ¤ŽŠr‰ã…BôÞpêðø‹  "!„—3¨‚ÈͰB!º•ÿº¬CìRT…IEND®B`‚glom-1.22.4/docs/user-guide/fr/figures/glom_report_result.png0000644000175000017500000044544712235000130025501 0ustar00murraycmurrayc00000000000000‰PNG  IHDR†V-ŒsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ  ß›… IDATxÚì½w˜×y§ûVUç&gÌ  €$R`´H‹”D[×”eʶ,+ÚÞ{m¯wWÞ•­½WöîÚZIkË–m9ȶ(J¤EQsÁ˜ÁÌ`0yz:çêŠ÷î™é †`EÕ;O?=Ý]uªêTÕw¾ó«ï|GàÒj/ ‹Ÿ/ÌÚËê'XXXX¼=lïëB¸„e…×Q†…………………………ÅÏn§déga…ÿ­~‚………Å›k{Ï÷Û%a[Å2Â*Þ-£oaaaaaaaaañÎ¯C",ùÿ|•-,,,,.ÝöšXæ’.òÛR/Ö^õ¿ u¿YXXXXXXXXXX¼ó:%Æ’ÎI}ge©TÿÙê'XXXX¼~Û[ÿ2j¯¥Ë^’@t>aH¸ážÏ6º#=¯™~“Èê÷ÙÂÂÂÂÂÂÂÂÂÂâgÃ0ŸýÃØÐK±ñÓ/æ:'[öÝ w^æokð? HV?ÁÂÂÂâC7̃££çþëÔÀÁ™©3¯X‚ôÚÿzíeð D+ %núõÏuõô¬ù²/Ú~Ç®ËoÅf³YgÇÂÂÂÂÂÂÂÂÂb†ª¯Á/°I"’´8°FÓutÝ|MåØm"¢¸¸UÓ1 ã5€Ó.‘-”÷ž85ðüLßÚ¯ËÅÜãc§s›®¹£cÏþ÷ü¿Á¦žk÷ìØ„ X#Å,,,Þa¶WÓÑ×f{6 A\lUUÇ0Wo{v‰t®xãÉþ37N­éý‡'r©/§gFŠ,ˆA ÖÞë¿›–ç[Ŷ—|¾ážÏ6®é]û÷Û·ï¸#ŽR¬h˜¦¥ò[XXXXXXXXX\¼cb’)ÈLOMP*dWµŽÃ塽£›ßƒMªºçšnΕ™?‹ªTVUŽ/¦µµ ÏÅœ^£¨:‰l‘ÉsgV} á†VZš x8mƒgGxùù'ï?ùÜ÷¿~Ë>ñŸ®Ü}õ5@ˆ‚¬aEYXX¼Ð “l¡ÌÔä8åb~Uë¸Ü^Ú:º ùÜH5Û«jé|‰Éѳhš²ªrüÁ(-­­½ ¶·¢ê$Òy¦Æ†V} ‘ÆvZšxœ8l"ýƒÃ:ðø¿=ú/òe!¨ÔÞ•Úw*‹#ŠVRµ.h¬—† ®HOØm¿#Ž’+)Öfaaaaaaaaa±JÒù2ããã†ÂÖ kpØ.<ÒÊ0M†Æf9;L÷š>"7¦ ©\‰sgÏ øÙ¶®ó¢Û•3#ŒMLÐÙ^‡TM'‘)1r”x|†€¯]7˜ž8G8`moNÇÅSêTm¯‹£¯¾D0ÀçvPÑ4Î §oí::;ZWm{‹šã‡î¾§CÂër°vmŸ÷š;?ñ§Ïÿo¾RƒŠ@(öÚç¹dÿsQEÕ¤ÿK#‡Î+­p¤fXE´%Ë.²ym3N§³®*«'a®hA€|&5òÌÂÂâíÐ@”Ë2劂aˆ‚€d“üÈr…R!d(A"¡àOu?‹¥2rEDI àó¾¡¹Ý Å2j)€AVô"™ ’Q¡`ó„—9I™ÜBø­ Ø$ ·Û‰Ã~iB’¦id3)l†L^ôF­‡ïж§ê!»—u•ùì6^·LÓ¤öÒ ø|Ø$‰rE!•Îw}Qiˆ„ð¸]8jOÉçüqÃÐiûÐ Ð ƒ|±H¹\¡©!<ßqÊäòhšNC$@0à…Z^ ³v¢("Š’W\¡ŸàÉŽÐ3ý /Æ:عÞO ,’Èß@Ep"8íôÙþYéÝôkw¡‰¾#“Í£jZÝq 8þ¿~D8ªÛ“T*ÎæŽ‡Ý0MJX6ƒæòãv9Wñô{i#.õ§ïÚÇ}åqôPQ²f.¶°°xg*CbÍFærú¼íVm9A0Ls¾ƒe&Å¢Ìää—­m]qýÇG¸vÏκrêʬÛF._ÀP DÝ6F'fèlo!™Êà+¸í"“3qZ›êú †QûhÎãÒãÒã´¦žã?º5´¡2G´-L¢L‡7ƒâG±w1]ÐùÔ•ÿJFìa̼nÙ1$SÚƒàwÛæ·¦i&éb™TºL(Z½øQ{è¢Êš‚|. YÕ™ÎdðBH’ô†žzÃ0Ȥlìðr6–Â8oÜð¹D2MWXÄë²Í všn*”IedBÁàªêgjz–Ë»WR8žÈS4MÜoqhz&Ζ¢ 0.R,¸ÝnÊ¥2Êlhv¢›&§'ã´47¼öòc >¸¿—ÝQ~ísßãý×oä÷íæSñ#|òÉù«^&[’ñû½«*3“ÍukD"ö¥—#Ïcs§ï’}!Ó0Éf’Ü}Ã:4Ýdp<Å¡áÁ ÿu_·¥b·¤Ò±Õ„h£ê÷i¾êµPç÷MÇb\Öå]tleE'žÏ‘W]x½ÞóŠCéLŽ&¯Ž7h£:NKÓk;oÅb%6¶,ª”t‘¢nbš&¼­[­1—“NtÄ\l{s…"33SlYÓ|Û{Žk÷ì˜qD„mo&›GÔ‹Dæmo3ñdŸME”`*¦ÒÒWk„z=Æ41uÝ ´Ö„!/ଉBsQAKs Õ×À\Rê ŠCKåOqîKjsn¿|>š¦Õ Él|¶ªì›&>ŸÓ41LǪB ‹7Ö'7I¥3¬kv°gs+/žšd:‘'èurùÚfŽ>6ˆßëYd* äX*‹§(Ë2—‹æÆ(Ý08=0ŒÏëA Å^› ßG&›§$Ëx=nÚš›^³˜Ë‰zà=×ôñôá1Ù"›×414•«>ÕÍŸœ! Q(–P5p0€Ýn#•ΡéáP¦hI’Ðté™Y²¹’$ hjˆr¡0Îz[oJ¹ÈÝ7_ÅÇ828CÀãäª-í |ÿùs˜„:;FsS”ÆhMÓ衱!Bsc”R©ÌäÌ,Š¢ât:hˆ†ñy<$rE>ÿõçpzƒT•Á³£>tÝ T.ã÷ùhiŠb·Û1 “Ùx‚t¶¹ hn¬:Š¢2OP(‘$‘p€H¨ê §39âÉ4š¦áózhjŒV…, ‹·¹N…iš«ž ¬^2k~÷âNŽIGSÛönXqýCýSU§VŽ(óö}¡“cÉØÜéaßö5<1Î㯜fsw”[v÷¡êõÀ!š#óÓÙfõXæÊ6—´¢¡Q‡‘´8vEÆ0Eú´1†žg²!Èôä ¢nÃ¥]…R>AkøYÎ¥wƒ´Ø>'R~eßVš#^þö{¯ ‰}í®ßÑÅ㯌ñbÿ†a°¶· §£35'“Ͳ®·»}¡ ®T* ¸}w'©\™#q$Q`CWS©šn i:3³Iò…"’$ÒÜ%¬>(`íšj~‘³£hšÆú¾bñ$ñDŠæÆ(©LÓ4iŒ† ühJ‰»oÞ×¾õ"Gú‡¸|ëFÒ™,“Ó³D£!²¹j´„ tw´áóUý‘x2Íl"Éš®v<î•s‘Ä“iî¹a;¯“øÁa$Q`]G”ëwtóè¡Q^¨ÖϺ¾nµº˜œž%—ϳ¶· »­úËåddºñqëî>®ØØÊÿú÷ƒ¨ºNº¨‘—s躾È:;:ŽiBWG+ªª1>9C{kn—“ÉéYÊe™ ëzÈd LLÍÐ “/Ñ4H(HCÍOy-LÎÄùì¯Ý‚Ó.ñÒ©I~øÒ$’d£TÊsÃîNvmj¥TÑøä£©1J¾P$ORQ¼7-Q\.EapxtQÙ¿¦Æ?yy”ǰ¦«ý‚÷¦ªjLÅâd³y$I"ªúWK‡ƒ¥39nÚÖÅ•Ûø‹{.ú- ’(hË|!¿ß‹®hšÊú¾5”Ê2³ñ$År—ÓIsSŸÇS€Sd6õ4òæá燸îš+)•ebñ$Åb »ÝNsc”€ßG2•!žLÑÖÚLÀç%_(29=KC$DCt!Z¼¢¨ØPh¸™ŒçpÙm\µµIùÞ³Øì‹ÎÝìl‚»?²‡—NMòØ¡6‰«¶´s•ßÍC/žC–mH6³ñ$Ù\Æh˜†H˜T&Çm;{YßåöC ì‰C&Ó±ÉTQñ{=´·6/:óÅ;{<üÒþM|ù[/Qì.?v·}Þî-h«³½f½í­EkÎÛLÓÄ4 »%t^Ûûâ©Éšx^'î5 *,ìK:›ãо0{¶vòÌ‘Qž9zšm½Ü¼«|Iák£©!¼Ê§Î†W÷EwÍ5aÈ]Óqæ*h.é´ÁÊÓ׬§h¸]V> ‹·Ž¹¾¢išµéŽWÑ91"}ª"Ì‚mÔEèüèà/Ÿšœïé†Áo½¼ö¿‰YéS‹<šo “¦ÆGÎNÓÚ`÷æv6t5àqÚA€¯=t˜Më{kåÌd¢ó=¦¹NW]{!•Óx³gŒ š.R2=œtöpÄ܆œ.3~ü8‚¢ÓÜ Î'‘üFak–ô5ªï²¢qf²@wg+O™à–ݽl]Åaƒý;{øòý¯ÒÐÜF2aïÆ;×o䋦©¥u~ˆX&“â½WwƒO›Âå Oãöx1 ƒ\:έ;Ûèn ¢jÏ›`,ž _(ñ·n@àk?@’$î~W/¯ƒÏýÓÞsíZnyß^>8ÌŽ}[p;í9HÐçä?Üuß{vˆé™4·íj§½ÑÏÿüÆËlé‰ðùîå‰WGémk'âwsx0ÆÉ‰,>h™¢Õ ”$iÅH“x¦DÈï&è6Éä DÜ~ƒx¦„×í˜ vé¼û–õ½N¦’ž9:‰nHÆcü—íšÜN;ÇÏÎò÷åcwngMkˆÿø•'رÆ^á N³k#[ÖTý«“# ^<3CccÓ¢Dæü½fpr4͆µ ׸SHú2_èÄÙ8¢(à÷8ù?¼ÊúÎ(w]ÛMKÄC2+ó̱I2YéØ,ÿíž=H¢Àû®ÛÈW®áOþéyzÛÃܱ§ƒöF?Ų³Ç&932ʶž0÷ܸƒáÜX†îF7¿ÿËÛyúè£É áÚÐ%›ÍF¾,qô\§ËC²$óJÿ4~÷e|÷™4Ý@—ãt²@,¿‹gŽŽñ‡¼ïáQâe…r!ε[[XßÙ‡i §¦9xrˆ=›šØ²¦§ÃÆÿøä~ž=6ÁÐlC7¸¢×Ï®ÛÖ£h:c³9~üÒ8--­HuÉûëó÷%È—UÚZí4»üóösÎf®ÖöÎÙ2qNÂ\ˆô1lïƒÏœâèPlþ7Ý0øðí;«¡:uË-Dk.D0é†IKs#/öOÑõsͶN¶ö6áuÙ1ÿÉqÖ¯í™ßç9a¦ÞΚ†a£:œlnøX½Ð£SB67…ýœ0T=Ts­6ÇP-±Õ•M7LTM¥«» E©`š&Ã##œ9s§]Bp;‘ËEfóYrÊñ­½—/lyo)²\¡½ÁNsÄÇ˧§ihî@7 L­LÀål‚bia|¾ªjˆºÌ/ß´žþÑÿöÈ)î¼v-w]¿–o4}ˆŸ‹·¾êm}ýÓ•ŽÆ±Ô4!Ÿ‹]Û87Aìz™¦°‡MDÓU4M¥)ìÅi˜æSŸ¼›$ò…o¾€¢™ì¿¢—ã#tE4…½˜†®k4…½4ÝÜûØi"~p÷UL%ò<}l”÷\ÝÃÕ[Úùê÷^AÕ ~ï»Q4'ò¾k{¹n{Ÿý‡§™J¸jK†¦’H¥ù£_¾‘OMðoœ 1ècs_ Óe+9£……Å[‡ u¾³¾ºÎ‰1×9©>%6ëÊÑ4U3€’¬ÒÞÑA(PíŒN¢jÕ¡^ª¦ÏÛtQ¨Ù÷:in_ÚZ[ùçå³¹žH ò×ß>HsK‚ ¢j 4„ùræD¦ªàU×v”eJ©8’ãeŽ<¹¶¡Y£ÓgT•™:ÃÎMAý4meÕı¤¯1·M‡]¢³Á…XÉpýåÕHŽ“çL% ˆ‚À5[[yüè º¢ŒLgPôꃗ¹ý*—ŠlëkâûÏ Ø<¸\.¨¾3Ó3üÊ»zqØ$þîÁ£ôµ¹û¦-|ã±Ó<7–%äsV‡w«*’nð:ˆøÝÈ• .»Tmí_}ð(ï½v-x×Fžâ¯8Äÿ÷±ý|ãѼ<g]o6±BSØ‹Ïm篾s„Ƌܾ½ÛÚøþÁq|;›{:˜MÉWLü’´¬V_?n‡öˆ±’aÿö4ÝàÔh’D¦Äþ"Wmná™34ílèŠ02•A1$„ºú±Ûí‹¢@4MÇc3ø•7.ó…þá¡cœJsó®^B‘¾V?í~¶¯kä©Ãc¬i 1<™Æår"‰TÛ÷€›þÑIöniáýïÚHÿ½/¢(ìu‘Õ…B£\—ëÈî# -;ÞsÓYÆbYöïèæ_9É{¯Ú«3¬ïаyM#eYÆïÐùÀþ <|œ§Nò+7nà}ûúøÆãƒ„šù¯_;€¡©ìXßÌGïØI¹¢c˜>·ƒhТªð“ªÁÇGâÜûèq:šü|æÃûPuƒ#çÒDë¢oŒº½-~ÔBbþ·²á"Ü -ó…‚Þ÷>ÞO"'ÓÓá®ë×2›.òçÿz€÷\»»®_ǽOœ¡³£/}ëEþç§nâ¾'Nñü‰iڛüÿÚ>вÊ_=ð Wmnåû7ðÇúy¹–ÞV?wîíå'/žeÿ=L§ NÓÓÕ¾èóú|H6;J1EÈ%±kS'Gâ‚}™¯8GcÈCÀ¡áРܸ»—Xª@±b0Oòë×°¦5Äß}ÿUÜ.;Ÿ¾kšaòä‘1.ëkd}W”?üë'èéªNÍžH¤˜Hyèž&tñGÚ‹¦™jhé¬dÂܨjK„!IGÓ4ÉÊå2¢$'Èd3Øl6 Ã@–eŠÅ"NÈe\AË;°°°xKQuAkÕDÓ Š¥2í!7¿vË$²%þŸ/?´×Œ¾ŽS2èh ðÍÇNâF86ãúÝØEݨó‘© ÓÁlªÚÈŲ4‘XºŒ( xœ6E[d;§fâüÆ-ëØµ© €ž:Íóg²ó Ÿ½/§' ”ž ·5@_{˜«·vpd0Æßþà¶êî—NOG™LT#^=3ƒ?a|6‹ÛiC T”qŠ&!¯¯\ƒ( ¸6šÃîjbë•À¢ý­†º[‚T¨Ú ú\L%ó˜ˆóa±s o}p©Ëé`2Q`cW”}—w‘Ê˼tjò¼‰ûÏ%>Fc ì6 ‡M$ɲ}]3‚ë:#hº]’ØÖÛÈŸ&SP(–Uvon#ž)3ËbH^ì'ÓÉÍ7]¹†x¦Ì‘ÁY" ËÚ3 ‹7“¹Î‰¢i”+*3³ñ æ@mlˆÎG‚0å9ש¨¨UentE©–[móôùNt¹¢Î¯TídóÃÁ€ùurù[{E°nßÐÆ¡Á$Ñhd‘¸E­0kC*æ:R‹Úœ¤eº$àõ ìî)Ñê{žTñ8³ygl4K®Ü¢ã°‡™eªDЖ?„p9l\±¡Ahú0L“lQa<^dp"Å®­‹)¹828ËÇîÜI{Ôƒ\‘ç” aå“wðÄnoˆx¦ˆÏSÕªžžîÎE»Ï§³«ƒR±È‰³q®ÛÞÅwžÀ!úèl ðݧðúçm³æ:ŒnçBý´5øÑt“|Iá\¬ÀÐdš]ø…a6wµð:yúÈ8‘HxyßN_8® ùB·£ƒ1ÞwÝFÖv„én rê\‚uíaF§ÓDn¾÷L?^¯o¾¿ùÂÉ ‚¡ñP^£ÿе1ÅF-áçÜÌ N“QµªæÜç…Ävó±œKlg8ä‘Cc<{´š« 'WÅ ¹eQ XÑxe¨@ÿdhŒ;¯éck_#…Bjn9PTÁ&Ì;åŠZupëE™éXœÿðK;pÚ%œ˜ _Tj3Љ‹Bo—9šõO}ë–;p|œS%ìvT®Ìû®ßÀ÷Ÿ=ƒiTŸ¤¨ªŠÇ¹ÐŒD£|~˜“ggéh ð {úؽ©Ì_~ëºÂM˶­h:æ’ã ö´\Õ Ù2ª¦óµ¦¢CWgÇÏe˜I¾JOk«¶´sýŽ.þéG§ðøüÓÃGéi ÒÝä¦+×ðô‘qžÈ\òÌ—Â\çÄ0ª‘5¹Lš;öm\qÙ' £¨œ¢£¶nÕ×wNtèŠ&5gr:Æl< @©\®V DaA`2 Içû+ºaÏi üÂU(”*|ïéS\±±½—u#Š"ÏžˆÑÜÔ€$Ö•£WûóCK||Óí'æÙL6ó" Í:¦ß P˜âÙá?kÅ!'øÈž"W¶ªÐÖÆÀéF$—w…~Bµü\±Â·Ÿ¤±1Š©Žóß?²ëš82”àå[{¹jsí~Fg2dË&!mQy’ÝÉølŽöF?‡ÏŽ£Ö’)ç EÜ.×üÌÊ‚° …¹0N}:íÒ “AÈŠŽË'ž7Ÿ¹$I·¢ê8E»ÃÉéñ,»7k\½¥M7Hçef² Ó‰jäMkKÓ åUßSù2÷?=DCCSçÏ~ûz.ëmäèÙ$/žaSw”=›Zéi0<™¦ @Øo[Vß+ú+øB©‚B¶(³{s;Eãß~rœßüÅìÛÞªéÌfdîP­/Z(8ûK}¤¦¦&¾ðÍ:ýµ¾Vد±Ù<ýc)ömïâÑ—Gˆe䮜…a<õ3:•K%ºÂ6Þ{íZÆb9~øÒvO© ¬ê~žó¯¼.;Ï'_P@›M¬5ª¿æÅT{ï§­µyÞ·injda¢¨Åþ¥É\]Wë)[¨Ê–IfËŒ‘.ƒÝ-¡¬ R÷&°'G7 ì’€Ý&Q®hØl"N»„¦kˆô•k3¼/qt$ÃLªÀ/ß°™ÇCÓtVš”íäHœ¾4Çëfp"ŧîÚEÈ#¢j†aRQt’Ù2šnð•QR!ð/óA㉷ïjcSw”'_=G¶P€wت‘sõõk·Û‰%ó˜†Icc¹lŽÑ™,ÕÙÐêséºA!—æ¯]Ùö>òâ ªšâDaQ¾¡9±ºþŸ˜žŸ¡®X*­h{E:Û+`RÖ–ÍåéŒØ¹uwÉl‰‡žëgÏÖN®Û±„s¼8§©1º‚í]˜ €j´5ÁÇ xj/oíÝ]*µe뇕ÍåZ)×Ð2ahѬdK…¦k&¢„$š˜’€$ÙEMS«IK• ¥bOÀS»(­Ôo-N‡“‰D†W¦¹ýšuä;Åé±104l¢HE×– I%Fg²ìÚÔÆ÷ŸäŠ8;™¦¢‰H¢´Ì);ïç%¶Óår"+"¥JµQ³Ù%ì6Ûü2¹|m]~ʲ“cC³TJ¥ŠÊèL§ÓyAÎ4ÍÅO#ÊezÛB N¤8rf†Ý \4Ë[]2QXÈqÕ)}³Ù,A¯“¦°‡’¬a""J62™Ö¨ÊÉinØÑ9¿N6—玽kyîð§Ï%èl ÐÑ@–+Ø…ÅÇ ø9xr’›®è¡\Q9>˜æâ‰itÝD–+4v†q9l|é¾pû#üäÐ.§u>x–†ht~Û‚`.J<=ר-ú,ˆdz¯áðC°WÂuÓVyß…]ëKDlEzâ4uº8ÑŸa´x—°B»V×ïÐTÒ©ë;«%YÅçó24•g|6Ç×®§XVxø…anï²²œn¾<ÂûÖ3“,òÔ‘q$IäŠ ­ŒÍp:б¦5„ãØ$Û6·’ÊËŒÆ ø¼^Òy™ŽF? >‰¦ˆ‡† gYÄ ˜KúV&Šªôºxupœ–ÖÖemžÃag:‘£,ÉM»zIfK>3ÃàhŒÏܳ—x¦ÌFiin\Q8PU…t*ÅÆ®pmöP¿ÏÇÀD–™d;®]O¹¢òýçqy|+¶ƒõû~1_Èëõrj$Áþ+zxîè™’Ω‘8ᆰCýÓ˜¢ã¢íûÒë(ð“¬ó<~ÇbŸ¤nÝ@ ÈãG¦yøà.o€@À`·ÙHT¦“yönëäÑC£l¹z3§Ï%$'Å\š»éZ&gsÜ÷øI&ã‚!X].ÜR©ê_›Îrd0ƺÎÈ|ÞÒcªÿßn³©›ùµT*_ÐY“83–$äsÑ?–Ä4a׿vÊš‚¼$"Í4Ml§GlênàÕ3§¸v[;3©3™\6ËÇÞsÙB…¯ýàwì[ÏnØÈßζÞ&2™Áñºèj‰pz4AE­NÅî”Lfgã”˺›ŒÑñb›ËÛ´¤~K¥2ëZ½š !袻«™X¾z7ÎÛÞšÍô¸çµ½-²½bX¼(ÇPMºeÏ:öm_µ x]7¤Å3K u¹ŠtÝD.Wh ±ÛDþÏý‡ñ£üðàn§µíeŒh$‚X{ø*õד‰‰)Ö´£&ú8k"«&¹ë>Ë5qhnXÙ\rê F Íe³^" -ïð$K6¾õÔ9LC_´O`7E¼.•J›$áp8E‘ó¾o*‚ à „xð… úÇÒìÙÒÆ­»× &£±,ýci"¤òÆ’ø¼>dÃÁ}OžaïÖV>~禒î{jUpáñ¸K’)(Ø$ —ÓÉÀX’d^®~v¹OÏÊØl¶evÏn·Ÿ×ñíëšx׎NLÓd2Qàþ§iiiAÑeƒ覈€ˆf Œ%Q SK"k&ííüÝޱG'¿uÇNõÏ00–$ž)ãõz˜J)+:^¯‡\Ie`,‰ÝîX´?¦ cIn¸¢‡®èÁ0LÒy™þÑ °û†½üëON²w[;¿qÛ6 T·“-©~N&yïõh yÈ*|õÁ£tw¶#+&cI$$›±$YGEìöêç\I¥¡!Ê ýIJ²Êþ=¼ûªµL& 8#1‘(²£·÷^·¹¢ño?9‰)yqI©‚Ì=·]FÀíà…“S~Þå{ºÃ‹g%3Y4lî·“ç’œ<÷ÜŠeH’ Ý4M{_kiæž~›&Ápˆ§ã<üÂ}½kD»3Ê¿?Ú¢*ôôt£›&¶ºI“ ÃÄ4E³’-kë:8³÷SßúkÊ1<Os-ÑR´‚Ø®rtØÇC“¿†»§oE»ìpØ™ˆçEÏýÖõÕN«ªóø+£>ÀÞ­­|ìŽíŒÎæxîø v·ŸJ¥ÂlºˆÝ.ñÑ;vÐ?–â¾'ú™I±ÛD¼^yYg`,‰d·ÏûB²bÒÝQõ¯nÜÙÅo½g¯ Ìpf<ÉlºŒÝn_´Ïv»XºÌàD—˵ØçDdE;¯/$Š"†äâ›O²gS3Ÿ¾kåŠÆ±³ Š Ø]ˆ¶Ú~ˆ‚„ËàÛO±o[+ùÅËÉeþýÑ~Ff‹\¹±Ixà™aÒ²Ÿáö=Ýì\ÛÈÀta^\“$‰‚lБø­÷\ŽÝ&2(ð÷?8†&z°‹Ò¢ãpÔüàõQ>û›û€j”ß7=ÍLÖ ½­•G^™"‘•¹ýšu8lÃS ¦hinä¹38íðÁ«8p|’Ã#9î}â ·_ÕÍoܾã#q†&Ó”+‡sYýN¥Jléòó‰;·#p|¬ˆ™«ÌG»ÍÛ^à ™¯\ÐööúÍe¶×\dà ÎrxpvÅ2ìvû2ÛkÖlïœô¢›&áh„ÇLñ½gϰvmou]gÿøðqtÝ »»³f{ç,ï;[ý_ª{9j/×hn{{M뙓$G -Ë3$Ô Cà¼ëÓ1³ÿÝwyâÙÒÅÔä9ôØ«¸DLƒd2I:“ÅÛÐGã–_ÀíZÞ……ÅOÓ4)ŠŠEtMG$IÄãvH§3 E::Ú¨&­Îæó¨ªŠÃn' àt:0 “ÉÉiü~¡PÓ4™˜˜Âçó®= Ÿ˜ÂãqÏçz-òòÅzmf‡£:.Üa·S*Ë$“)kS®Êe™x"ICC·Û]uvfD"a¼7ÅR‰l6‰‰Ïç%—+àq»‰FÃÄã TM£­µ…l6G.—§­µeÑlJE!6_ÔTØl6~O5ÃE¡P$—Ï# àóyÉfs~‚Á²,“ÉæÐT É& p{Ü‹ER© ÍMˆ¢ÀôÌ,¡P¿ß®éLMÏÌ—aš&¹\žb©„a˜8v‚§UUÉåò”Ë2¢$âózñû¼€@¡X¤P(¢ë:§ƒH(ˆm…™],,,,ÞLD­ÌäÄ9ºÖn¥X^ÝpA€øä9¡¾P‚ žÀf“p›PV™+MFú³eëå(ØpÚ%†O¥oÝòЏêcDÓGžgÏ5û)”+˜¦RQ=õWï¿T¾¼RÃKþ䋞ùͱ!üF{ÄÄXë%ÝÞ˨ÿfì]×#9ÝçÝîìlœJ]^^>=ÅýÏ så†&volá;Ï»wʼnb±8в´~Ü„B$Q"ŸÏ#é>sϵ|ïÙ3/áóùÎ;Sôj}!L(–ʤÒiÂá>¹¢O$ üøý>A T,‘L¥ijlÀérR.—I$R44Dq»_û ¡“S¸]®ùü+õ$’)*r…ööV0MJå2¹|MÓp:ƒ;ªª13³¸Sïv»hhˆ’HT§·ook%ŸÏ“ÉähmiÂ0Lb³q"‘^¯—R±D&—Ã4M|^ù|·{åýJ&S”å í­Ë~»/4ï‡) ¹\¹RAE¼µY¿%Iš÷Ñ"á^ŸLEUÉfsT”êÌ@ €Çã"Ÿ/’ψDB¸jAÉdŸÏ»(â @×tò…Åb‡ÃAÀïÃåt.»v Ã`rrz±½°Ióþ˜ ŠÕYÿryJ¥2†iâv9 øýØvÊå2éL]Óñ|„‚A*• ©TºåãqS–eDQ¤¥yùJMÕÈ Õa´f5òÌï÷UgñªˆÏNÓÖ³’¬®ÚöÎŒÓÜØˆËAâSçðx½Ø<‘ Îì»Ôö:Äö»u—ÝÆÀ‰WظyYÙ|M¶·ÿÈóìÞ{E¹z¯Wd™Ç¾ù%åÐ#_OSM4]ò@H³À4µï2@Åy‡Î7kç†Þõî»<³éÂEwÜÐU*Ù)Œâ ªœ§¢(6/Þ†^<‘vA´¼ ‹Ÿ AÀe™Aœø‚‘ùœçÃ4M²Ù †œ¡«»C°U6k S“cHî0^à¢_tà ˆá”tºzú(U4vr1KlzO¤—óâ³4ªšF26N$裹µ‹¢\Ó@QTÆjÂP"[<ï±È™8ÄÇ )ÑDF1ƒm8ƒMˆ’í’ë¶P(²®ÅÉî Uæþg†ÁáÏùñ³‚,WhöÁ5››‰=|ý‘S4 ¾jÒÚ’nÇír]Rýlluqå†&tÃä;Ï 8|Ø–<²°x§Ú^§“ãç0$7¾`d~¸Üyµ Ó$—Ia*yºzzÑLQ1U™é©1$OCUX½š®“NÄpÛM:»û(UTœv;¥BšØÌÞUÚ^EÕHÎŒÑ ÑÐÒA©6ÔRUûæ—Ô%ÂP±NŠ3+C¹:aH®†–&¥0W¶¤«&ˆv\¡.t_ v]Ã#€(Ù‘$;+… ZXXXXXXXXX¼S1MÅ€–önÎõ3<>¸h†¯óáöúظù2mèªØí.Ú:{8uü0ÓçäUm»¡©…öžõTÔê¬‘Šªãö…hïtpø•.*RÍu–º×¬¥©¥“REaIª¢‹¤‹p…š ÔˆYKkçžA¿¾4N§“á©Cc ÉŽÍÀ.Ù~æú6›étžûŸê¯ænuñûTµ*,:/혜N'g&² ŒÆ$6·›$Yý1‹ŸÛ«‰­Ý 9ÅÌøàª²HyýÖo܆„®ë‚ŽÃ᦭£‡Ç^eZUVµí¦–vÚ;×"«:¦YMÒãÓ*Ú8väåUÛÞ5}ë‰6µQ–•ù{wÉ=,,yÍå’jïö%ŸÅºWýzK-ƒ°¢0d.K2uaD›Ñæ¨[+Á……………………ÅϪª!Ø%¶lÛ~Ñ'Ö  (É ²¢Î;ÓEÅít°ûê}«L“[íXJ•êôìµKYVðy¼¼ë†[W} ºa’+”Ñ cYXVÛO¨¨.úúû’$!ùµ±‹§4ÿYBE\Þ ¦¨VSmö¯¹È§K=&I’ü?ûõcaq©(j5Jò²Ë¯X• ?weEÑæí•¬¨¸].®Þ{ýª·m˜&ù¢'öÌå²³8¯­î·•Ä¡úòLX>]=.JLÇd ²uuYXXXXXXXXXü”H¿Qå\bAs3›™¦‰¡ë8Œ"Ó±ùRÅ:9oKbïÛ»Èë*^ۢȥzag%‘è|‚Pý:ËX& uøÊìîóR©Ø,•ÙÂÂÂÂÂÂÂÂÂâç”ù™ÈL“l:ÅT¶Âε>Ånõ,,,,ÞD„ÚÌféd‚˜£¼ðõÂ{½(´ô%°ò²ó²Lò¹Üvu…|Þ2øï`ÎN¥ùÉ‹gIçJG€ ÏÍuÛ»ØÚÛdd ‹×A½041ONº¸íª^ŠÅ‚ÕO°°°°xÓû·£çt=ÏÏ,Ï7´’@´R´Ð²ßªÇ`þ,8/ÅB‘ïÂa“XßµN¶………………………………Å;¥ÂÐÜwâ ¿­1´Hº¨0d= xçqàø8-m݄áwܱCAúÖ®ã±CìëŒX'ÛÂÂÂÂÂÂÂâ¹P?Àê#XXXX¼y\ xã|"Ï…Ä ‹F‚XC?‡ä‹BA†ñÎlÐÝn7£…²u¢-,,,,,,,,V…®ë¼ú꫈¢Äöí—#I’U)? ,*vIÃ.( ™¦ù†> ¸ÿþûYÓÛË;w¾mkõĉ=zŒ_ýÕ¾åÛ¾÷Þ{Ù²u+—mÛ¶èûb±Èÿþß_äÿø3oÈvLÓóü¤§vݾÇ÷ì³Ï’ϸí¶w[&ižxâIt]çæ›o²*c¤SItÝ ¡±ñç¶þò/¿À‡?| ÖaaaañSw©Ì ¦x£|­§žzŠJEáÖ[où©ëÔô4O=õ47ß|óüòõÌÄbÜ÷Íûø½ßûÝ·ýyËçó<ðÀwxâ‰'øó?ÿ3Ž?Î}ßú¾çÃ\ýu\÷óögüΧ?ßï·n ‹Ÿ"¯3ÝË…†­ˆx©[*•JÄb±ùW.—ã‹_ü§OŸ>ï:gÏŽˆ'–}_©TøÝßý½7µbS©Ô¢ýÅb†±Âri‡†øØÇ?>¬åò¥E $‰eÛM&“+.;44Lj…ß4MãÕÇ߸F0LÃdÑ Àåª/»„]kËþô^›xIë]ìZH/™;Ð0 âñ8…Bá5ÕåôÌ cãcoعÑ4x<Ž,Ë‹¾/‹Èr…B¡Àïÿþ¼í ×ÒkzîÞ™œšdbrbÑw—bk.õþ{£œâJ¥B¥RA©TP]×—-g±™i&ÆÇ.ÙQ–eI’°Ùí?Ó ™¢(äóùeßçr9TU½àºÇŽ[vý[XXXXüì Ëò"¿7Nsï½ßä©§ž>¿(35ÍÄÄøŠ¿]ªÿ°Z²Ù,±X xßûßGccš¦-[®\*qüÄqþÓþ/¤Òi*•Ê"ßñèÑc|å+ó–Öw¡P ™L.j_Ï 2:zŽ?þãÏøÎw¿Ëï|úÓìÙ³û¢õyäðEy[]S…BJ¥r^ÿóþàÑG½à5Y,/iÛŸøÄ'Wì3¾•d³Y‰äŠýÌl6kKD×u2Ù,³³³ÌÎÎ’Éd.ê§¾ÔÛÇÙÙYr¹ÜŠ×Ø*ú+%–¾d5é’#†¾þõ¯sß·¾Mkk 7Üpü‚~¾u̹¿%¿;¾ô¥/¾©úµ{üˆâ‚öÕ¿ý[|>ß²}¤¶û7ƒišÜwß·°Ù$>ô¡ÿŸ½óªÌøïÞ©™’df2é!B'¤J¤­‚°¬Êº»ºßZ×ÞwWÅ^Ö^qEDŠ€4¤Fé’jHHïmz½ß“ „4ˆXöþžç>OæÞÜòöóž÷œó^×î÷>ýôLÊ+Ê)**B¡P’˜˜@ÇŽyêÉ'ÛΟ6,yB¿Ï®L[ï‰Ò«ßÇB­ÝGP/È¡2õ¿Üà0¾…¥Û+‘Ú•¶¦Rõ‡âïÿ÷\xá…464 R«IOOÇétRUYEff&¢(þ`~JüúÆáW^y•¡CϧïdùsÒUW¶~-_¾‚ÊÊ n½õÖv¿ûÍ7ßø±“ôŸxœ}ûøbÉbL&uuu\vùåœ×ï<^{í?rgulÚ´‰åËWPS[C0$>>ž1cF3nܸŸíÁ`¡Ã†3xð 2F¡$.>ŽiS§qÞyýZj}~ºÅÐÙS ý·Þr S¦LÿþzÝ:zõìI||<ååålÚ´‰êêÎ?}ûö O|?þx6‡ƒÌÌ  €B¡àóÏ1uêÕH’Ä÷ßÏ·ß~‡6BËðáÃéÜ© ,_±‚è¨(ò ˜1cz®]ßûѬYh4šV|^^›6one0gΧŒ}!ëÖ­CEªª«¹ãöÛ[(—~ˆ_|€÷ßÿƒÁÀ´iS)))áÓ¹s©©©!Öjå’K.A¯×pèð!òòŽ * 6ŒôôôVß»k×n¶m߆N§cĈ¤×¨»a IDATuìˆÏïg÷îÝìÙ³áÇѳgÏPúµÖq”Ôzؘ[‡(@ÇØ:Çé(¯ó¢T¤X´uJ|þ %5n] Z & ’:Heƒ—ò&ER×Dw³Q…Û¤¸ÆËÒ†Fé”$˜5(EÊ/• ¡{º'éitù±U(DF¤OG#56…Õnt‘1¨•õ?eu|– ù1¡“:¦¦²nÝ:®¸â –-_NÏ=Â×Ýn«×¬¦¤¸„ø„xÆŽCdd$’$‘››KVVj†òòr¢"£p¹\¬_ÿ Xc­\|ÑE­?†ÄÄDJËJÉÎΦÿ€ˆ't ‡/¾XJçôÎhµZzöè 6mÚDzz:&“‰o¾ù†cÇ ‰‹‹ãâ‹/B§Óáv»Ù±s'9Ù9ˆ ‘A’‘^šÛ߉uÿdwÊC‡S__Ï ÈÏ/ ¬¬”ÚÚ:*«ªxù•W8¯_?FŽÙæýÍçjëêØ¼y3………$&$2|ø0bcc©­­eíÚ¯©¨¬Àl23~ü8ü~ÿ í¯Š;︣éÝùlÙº‡ÃÁ€þèׯ/ …¢Õ{›ïÞ³‡²²2êjëk®™Þ®2‰Ž61dØ<7‡Êòrª«ªP«Õh4Zv»ŸÏGyyÑQѸÝ.|>?‘QQa“t[c ¥NOmM N‡•Z…ŃJ­>I!å§¶¦ǃF«%&&QTÐдšÑ¬xŠŽ6¡7$‰’â"´Ú\.'Z–˜ØØð b·Ù¨¯¥?:Ú„^¯[ÊÅÅLJû…Šò2â©©®FEv;º,1g×½­²²’M›6Q^^A×®]¹ðÂQ(•LJ¤Â¢"¾ûö[@ ªªŠþýÏcàÀíêedddd~¦LžÌ]wÝþ½}ûv¢¢¢èÚµ+uuulذ²òrz÷êň#(--eÞüùTWUÓ­{7†ž>:.<–K’ÄÈÊú–`0È!CèÙ3$»Íš5‹””>̤I“ˆo×~,Ï?ÿ<éé[ÉÊ%%%|óÍì;ñqÇŸ¹xɆ Æ’%_PRRÌ˯¼ÂŒ›nÂf³‘——ÇÈ‘#ñûý¬ZµšÂÂBbcc=úBÌf3äȑø\n*++éÒµ ÆC¯×µ;ŸKKK)(8ÆÄ‰Ù›ÍàÁƒø|Ñ"ŠŠŠyåÕWñz½+,äÕÿü§i¶(pçw IGŽakVÁ@€Q£F‘––Àž=ßs$ï¢ 2tèùtïÞ=”ÿ²}Ûvì;½{õbذa¨Õj_~ù%……E¤vL¥²¢‚k®¹FñcÇØ²e ô;¯›æ~g“]»v¡¥{÷îäääðÝwÛðüôíÓ‡ôôt¾\µ ‡ÃŽÛãáÖ[nA£Ñ——Ç–­[q»\ 8~}û"Š"³gBÇŽ©äää0bÄöîÍfúôi8p€­[³P(ÄÇÇc6™4hà)åOI’8|ø0[³²ðz½ 4ˆÌŒŒ3’e2z÷æ‹¥K¹ñ†ÂeÜ'³OøºÃá`í×_STX„1ÒȨQ£è’±c…ìܹ¨¬¬â–[þʱcÇØ¸qN—“îÝ»ãóz7nóæÏçª+¯DÕd¹¾hñb.¾è""""(,,dó–-Ô××Ó¯o? Øf9Îýì3’Ù—›‹Ùdf̘ÑÄÄÄàóùÈÍÍeÇθ]n2332d*• ¯×ËÊ/¿¤´´”N:QTTÄŸo¾I’8z4Ÿ­[·âp:8`}û†dþ#yylذ¯×K¯ž=2dê“déâ­·ßæŽÛo§_¿~‚ÀÑ£ù”••†8Ûwì`÷®ÝX­VF޼€˜˜ÞÿRSS9tè—_q9*¥’õë¿¡ªºŠ‹…‹/¾˜èèh¶mßNmM åå†J÷îÝHKKcÎ'Ÿ4Í9Ý,]ºŒ pÞyýƒ¬[¿žC1hÐ † |Îúí¬•Ò ñZZaíþñcõªÕ”””ÐÐØÈü ÈÏÏ'6.–¬¬oÃZö7¡T©Ðjµ,Yò¹û÷ãóù˜ýÉì°Rè“9s0›M8>_øyØ õµ×^£àØ1:¦¦¢ÅS[ÇÉßÚ|4Bv›½^ÏšÕk«Κ…V«Åk%66–.MJšö¼÷x~·–zë­·‘ä¤$öåæ²hÑâ°zíÚ¯Ñéõ8ìvæÍ_@III‹Š]»w3wî\,f ,\øyÈ]­¼œÙ³g£Õj1[̬[¿þ´y”$‚Á`‹£ù;›ÿV)ü安:4*F§•R =A‡Rz­Hfª­ZÀá Ð%Q‡5RE0¤{’žŽV-w€h½’Îñ:@B§é’ C) x|¡{,F%Á`ž)zÍj]~jí^ü‰Z»»ÛO0¤WŠJÀæò©S¡[§#(µ°:h~˜8q[·fQWWGQQ{÷~ÏÅ.—ÑŠ+ؼy3111ìܱ“Ï?ÿ<¬Dœ7o>AIB JlÚ´ùø=+W²eëbc­ääìcñâÅí®'ÉII 6œ+Vbkllayãv»™;w.e¥e¬ûz6› I’(** uðN'_,]Êwß}Gll,{¾ßÃÒ¥Ë$‰o¾ù†=»w‡(Š|±t)yyG›Úß'-¾ãÃY³Z}ÛýûÉÚšþ—w„ 6ŸF£¡Kz:111-ï?¡Þ7ŸûòË/Ù¹s‰ ‰Ô×׳ÿþEÑ;ïà÷ûINNæØ±æÎÛªýI’DQq1óæÍÃáp`4YòÅäää´ùÝÍ¿wlßÁïH¤¤$·³\B}¡ÏëÅa·ðû1™L¨”*Þ~ç]lv;‹™5k¾bË–-gT6+V¬ä‚#6t(õõõ!Š"‰‰‰˜L&º¤§Ó¹Sg"´Zº¤§Ó%=9Ÿ~Š$I0÷³Ïp»ÜDètìÙó}¸¼×|µ†˜˜\n}ô_ÈÏÏgù²å#$ÄdzzͶnÝŠ$I|ýõ×|½nÖX+¹¹¹¼ôò+¸ÝnJËʘ7>uuõ˜L&–.]ÊîÝ{ÎpEÛuM’ض}Ù99ƒÁ°Ìjµ²iÓ&”J%ñqqÄXbè’žŽ(Š”””ðÙ¼ùØl6ôzs?ËÞ½ÙH’Äû¼Ï76˜˜Ddd$³>úˆ`0HAAóæ/Àçó¡P(xûíwØšµõ´òçÑü|>ûì3~?µ†%‹—pðà¡3H?Lš<‰6RYYEyy97ndò”Éá<øè¿ÿ¥¾¾žäädjª«™÷YHV>zô(o½ý6uuõtì˜Juu5ó, ººš‹…÷ß{Ÿ•+¿D’$>ùä|>_ø½Íòvyy9ó, ¦¦‹ÅÂÒ¥KÙ¹sW›ßúñ?fùŠ•ÄÄÄpààAæ/X€×ëåÀ¬^³†è¨h, _®ZÅö¦ö¿jÕ*6oÞŒÕje÷îݼøâKƒAŠŠŠ˜7N§ƒÁÀ’/¾`ß¾}H’Ä«¯þŸ×G\l;wíÂápœAß&PRR‚ÍfC¥Rѽ{7.¼ðB$IbûŽ|öÙg˜Ífêê)**F’$^~å¾ÿ~)))Dhµ¼õö;H’DrR2‡aÁ‚¡>okï¼ûJ¥ŸÏǼùó(((hÕº$IbÆ,[¶œkL +ÆsÁº’ÎÎð™gŸãwÞmšhO _ª©®áÈ‘<xà~âbc[øÞþaü8&]u%’$ñúoPTXD÷nÝÂ×W¯YC¿¾ý;v,‡ƒ×_ƒÒÒ2¢££éØ1©W_Åb9#Óª /ia}ñùç ÉË;Š”¸öÚkÐëõ8NŠ‹‹O°ˆ¦wïÞ(Êiü)ÜrË_Ñétˆ¢HŸ>}xð¡‡Cn2Œ?ž«®¼‡ÃÉ[o½Å‘¼<úö9® ^¹r%ƒ dìØ1Øív^yõU***ˆˆÐÑÐÐHj‡Tzõê §ËŸSÄâ J©Ö®‡ x|A6ì«%(ÁáRGØG¥Ò5¥( IPcóq°ÄÛ$H¶h)«ó I[l§Ú棴VÁ°î&rÈ%û‹íø¡Î.!ZCE½7tO¡ƒFWÈ·»_Z$G+œáÉy„FA£ÓOY½‡@@Âë—ÚLÇië5йsg,1¾ýî;öåìcìØ±˜MæpÙ/Z¼ˆÇ{œNÒè? ?=ø7Þx#{÷fcµZ™>m‚ PQY~î¢E‹¹çw“––F¯^½yü‰'Úí~(5¹ 8€ÃGŽ0þf̸)üåÍ× Ȇ (--¥K—.ìÞ½‡ÄÄRRRxìñÇyàþûIMM¥gÏüëßO2uêÕ r>ýú‡F£ÆãñðñìÙ=z”ä䤟TŸûŸw‘‘‘?º}ÔÕÖ¡E22zc6›ÃV|7Þp#Z­Q9¯_?î¾ûÜvÛm¡ö§<ÞþBL¸øb"""pºœìܹ“ÌÌÌÓ¾wøðá\yå•DDD´3…m¸v ‚( ‚ RUUI¯Þh4ZJ%ùy‡éÓ·?uu5x=^tz§Q¡ 22Š¼Ã‡HïÚ½ÁˆZ£áÐ\:uîÒâ5ÕUôé7µZ…J©$/ï0IÉ€¤ä¤¤¦b·Ù°Ûíx½^4-ÚˆÒ»vC’‚(UJ Ž%.>‘ÚcDEG“˜ˆÃá ¾®)(¡P ˆ¢ˆâKAQ*C+E;uÆd6ãv¹ÚŒ«tº[´h1ßf}ÛjesÒ¤«¨©­%''‡Ûnû;qqq˜ÌfV,_ÁèÑ£7 z÷îÍÕS¦…J¥fýºõ¿êÍ dddddBƒÀGý—•+V0`ÀP º›6òä¿ÿMrrr‹9ÂСç3eòdT*A)ÈÁ¹pÔ¨ðõ¬¬,ââãùÃþš€ÎžÍÁƒIIé€5&†éÓ¦wFs„›fÌ@£>îUr(..æþûïÃb±¡Ó±xñ’pµ ƒD@hSúlÞg<øÀƒté’ΠAƒxèÁ‡¸é¦‘€Áƒqõ”Éh4 %¹¹¹íÞ¨£¶¶–o¾ù†G}‹Å‚B¡$;;‡Î;3hÐ ‚Á 'NÄáp0{öìð7¾üÊ«@hãÑÈ´iSÑét-bø\3}:½zõÂårqÛm·ãp8IIIá†þsÁ–-[9r$óæÍçî»ï¢[·n”••óÕš¯$8|è0‡ƒ«§LÁ`4âóùÈú6‹þýÛ?–?øàCO²Ä///oQï$)d“˜˜ÈyçõcÄðáDFFÒ·__*+*Ãy——’Ä5Ó§£Óë-[6Ó§O& …’믻Ž:´¨K¹¹¹DLŸ> •JEMMm+±•%ÓÎŒF.ºè"”J%ŸÍ›GNNNØr¤=ÄÇÅ‘‘™ÁW_}…Ïç¥_¿~ÄÆÆ†¿aò¤É¡8•Jôç±ÇŸÀét™Lž<‰¨¨(¾ÿþ{êjë¸ûî»0™L‚A²N’×N&/ï( õ ̘q‘‘‘ü¶lÝÂÀp8Ôju¸n\wíµôìÙƒÁƒóØ£qݵ×Ò¹sg®¿îz´Z¤`…BÁöí;8ÿüóY°`!=ö(iii—°|ùŠp .F«Õât8Ù¹k”——3ú Ÿ/\L&Ó§_CBB<‚ ðç›ÿDDD¢(Ò·oî»ÿn¾ùf@bÔ¨Q\uÕUø|>ÞÿàCrs÷Ó¡C≯q¡@û`£ÑvO]¼d1Ó§MgàÀ-,éqÅÐqÿý÷1eòä~‡üký~€Ÿ‹QÃq\âââÂf^ZÀßBU[[ËšÕkXøùçás0 ?i§šË—…+l3n·•Z12…(’œ’ÜB1t6ÉækÙ²å|÷ÝwØl6|~‹@ÈÉI‰¨T*ŒF·«eœ’ÚšZÞ}ï}æ~6¯É4£)99‰þx=‹—,áwßeü¸qÜxã §üŸ/€××2°žß/r´ÜÁÚï«Ñª HÂ!RÕà'!ZG·d=zQ³Q…?ÀçpxüØœ^‚Ô;¼X£Tx}¡r­nôàññûˆ"øü~$I‰×Äî )‚>ô& ^ŸŸ`P¢ºÑÝbîõúÃÝî–Ü2R ëfÂæò±ëh.ÏÉéðÿ`qDEEÑÿ¼óX¼x µuu¼þÚؾ}G¸¯­­#%%…BAbB!3M§ƒÑ€®É1!>‡3¤4;xð ?ñDxRu†”J%×^3þó_lܸ鄀dRx¤_¿¾¬ùj-&“‰ü‚|F^pZ­–}ûryô±ÇÃIhÐY`Ì›7£Gâñz())!½óqWÅ`0ˆ(Š§Í¿Wý?VQpÒ˜9uêÕ|±t)O=ý4zžn¸°ió&V¯ZMCc#~¿ƒ¶y¿Óá`é²elÛ¶ ¡É·Ù5L„p:BŠŒã7Ç'ÄŸR¨í1? ðûQªT8l6öïÛ‡( MÂ’^Á`¤±¡µFMcCÖ¸8@ÂåtrèÀþ°)±R©Dsbß$A0$BÃnG¥VáóxÃJ4N‡Ûå—…B¡@D % ¥‡Ý†J¥Æëõ¢Vkðû|”TWQUYÖGèôø|Þi”ZÔ3 ƒÁ€ÓáD’‚íγ«®º’ÿ«eŒ¡|(Tw|>6oÙBQqqØ ¹ÙEñć˜L&¢¢¢P(Ä'ÄŸÕ ü22222?7ÞxwÝyÜ•ìµ×^[6ØíâââZÍ,KX¾2èõÔÖÖ¶xfcc# ,䫯ֆ'iƒ $´ÚpÜÓ3áÃ>h¾!7w?Á`“É„B¡ 55õ$™¨µˆpâïêêjR;¦†Æ°¸8NGxÜ6›Ìá0£¡Ýo%Ibݺõ¸Ü.|ðAü~?yyyŒ3ºÅ‡œj½Ôáp¢×ëÑëõM …ãÓ¤¤$ E($‚ IAêêêøï?&;'§ÓICCú÷ ªºš”” ÖX+º—€ËåäË/W±gÏ÷a™çª+¯<£2šùôÓ\xá¨çÆŽk¹‹(Š<üЃ|þù">™3‡ÌÌLîùÇÝ­žåv»Ñh4DFF"Š"V«•°,yrY8.t:ú&ERbb¥¥¥§•?m6;Ÿ¾ˆ7"¡ôÿåÏ7ŸQú cÇŒáåW^E’$îùÇ?ZØ|ÿý÷,Z´ˆêêj|~?/ê™-f¢¢¢ÂÊYQ‰ŽŽ×ëfÅ€žs¤`Hîw¹]¬Z½š½ÙÙár¼ì²KxøáG(,*büøqÜò׿šÚ…BA\l,N—‹`0Huu5<›Üýûq¹\ÔÖÖ2vì D<994ïŠ Ë»‡ƒ¥K—òÝ·ß…eþë® Å}â‰Ç™3g .¤[·nÜqÇí-ú“C¯ž=yêÉ'‘$‰ÚÚZ,XÀ³Ï=Ç̧Ÿ¦®¶Žä¤D E —9FCbbBø÷W_…¬Þmø}þð¦;”€F£A­V£×éšuÐ¥KÖ¬^„B‘ÌùôS¾øb)={ö¤¶¦–”)M²½pNûmåéxÚ–û[Ým6Õjµ¨ÕjrrrèÑ£¤OŸÌVÁ•›Ÿq¢–·sçÎtJKcúôé(•J:DBBuõõ?- «Ôvz¢¢£hll䨱cXÌf¶lÙ‚Øä¦Öüÿ¢(âö¸ñûý?Á'ö¸™êâ%Kxê©'éÚ¥+{öìáñ'ž› nÝšÅàÁƒ©­­¥¾¡è訦’]ºt¡Wï^\=åj”J$66¯×‹Édâé§ž$7w?O>õ7ÜðÇS‰Ô–¥ á]ÈœÞû môëEY­‡îÉŽV8È/w¥W1:3¦©,Á¤W¥SÑèòoÒÐàð…ŸÕ!FG^¹k¤—7@ (áòÐ(E"#T¸¼b£B®cÍßsâw‚ TŠx|¡NJ§Q°3¯…(p~7‘JêþVõ Ö‘‘Aaaf‹¹)Ðñ2ïܹ7ndøðálÛ¾¤¤$$IÂceÇŽ”——#Š";vî¤G“ßõðaøâŠ+Ÿ/lêØîj*¯w7ÞxÿýøcªªªBþÝ'\=z4=ô0]Ò;èÖ­’$qÁ0õê) 8ÇCnnÈUkÓæMD›L¼ñÆØl¼ð‹a×%•RI~~>‰‰‰deeµ™j†ÚÚZjjjEíÛ·£P($ ¥R‰ÍfkSIj® '™™ìß¿ŸÛï¸3œ·'Üþ¬V+—]v)Ó¦N%)))l6-I!EÆèÔ©»÷ìÁáp†MÏ´ÿNèß‚Á ~¿ŸúºZ|>º¦8=fK »t%22Š`0ˆÝnÃãñ`ŒŒâXþQôF#¿è¨h|>ÆÈ(:¦u"Úd:þÿn÷ ß'¡Ö¨©®¬D¥VSWW–…P¯®ªBÙä“ݬü ¯ÇCMuJ•’ºÚô ˆ 2*šä”DQÓéhòéö I»@ @]]m+A2 œY×f~‡Æ­VËÆgúôi¡A°¶Žòòò–n¿À‘#G8zô(‰‰‰ìܹ“Rä Ô2222çæ¡öŸ>Õ!´Á‚H\\,;vìà¼óÎãÀÁƒôíÓ§Õ='Ê;ÍïJNN檫®dÚÔi˜LÑ=z”èèèããôYž#4[8xÎ:±~ýúcHˆ‚€ÏïÃëõ†â²HÇ]©»uëÆºuë¸pÔ(vïÞƒ5ÆÊÇ“7•9ƒMfêëëÉÍÍå®;ïdèС‚€ËåâÑGãСÃ'í7e‘$ «5†ƒ‡R\\Ltt4åtíÒ…ÝêN»;FÁ±cüó‰'°XÌÌžý EEEH’D÷îÝøfÃÆŽCvv6ÕÕÕH€Ùlæ’K&2mÚ4:¦¦R\\‚ßïkYI´¹Ñqyóøu¿?À£>Baa÷ÞwwÞq;¢ âõzñù|(•J¢¢¢¨o¨§ iþ·7{/‰I‰-êÛÉï°X,äîÏ¥´´­V˶mÛInš„äσtê”ÆîÝ»ÃògBBW\q9Ó¦N%66–‚‚"""Π®†Ê C‡Œ;AHII¦¨¸8\ΟÎˤIW1ò‚‘äçåž{ïm*÷–õ[o0àóû8rä:t`ýúoÂemŠ&''‡¾}û²ÿÀªªC»‰›¢M\2q"Ó¦M%--’’Ò° ùòË/µì€uëÖó‡?Œgov6fsH±zðÐ!ªkªyú©§Ðëu|øá‡x¼¡ºÐ¥k6nÜȈ#صk7 õ¡:Ëe—^Æ´iSILL¤°°…"$ó7Ô7pÿ}÷QUUÅc?ACCC»­†Ö­[G·n݉µ¢Óéèܹ3{³C.…Ó;³eëV:uêDm]*¥Š¸¸ØVõcÞüù<þØ£ôìÙ“ììlîàÁpܶ};#G^Ú©±²‚®]»´ÚTJ¡PÏáC‡‘$‰ô.élܸ‘Ë/»¬É¢PqÎúûŸÅ>)&&†aÆ3룑^½zѧOæºwâ„ ¡ ~ü $$âââ¸þúëÏÊwÝ}÷?OÈÜgf>M×.]èÐ!…_x­VK£ÍFJJr‹ûR;¤2wî\vïÞÍ^}õ'?4h ï¿ÿZKLÌ «ôPRR¿þý$n·‹¾}úеk×÷^zÙ¥|öÙg<öøã@\|7ÞpJ¥’¯Ö®åãÙŸà÷ûÿÑÔ›c µÕ±6Ÿotù±¹ýÄE«9Vå$-VGªU‡Û@£Bqv$ J$3-µBÄí °+¯¡éñ&5¬Z #¥¼þ Õ6/±NƒºFvw€ü G(>-¿«°ÊÉè EÕ.ö4bÐ*è™l@©p{ƒ48}­Òü‘­Õj=¥UÕõ×_ÏG}IJeË L6€~çõcÿþý<ùäSèô:*+*èѽ{Hƒûêú IDAT}ýu,Z´ˆ%_,A©TÒ­[7† ò“êJJJ ƒ bæ3Ï2qBK3娨Xú×Ù³?á¯ýKx•íÚk¯aéÒe|¾hJ¥ŠÞ½{1dÈ`z÷êÅ¢ÅKxüñÇ1 ”W„Üà”J%#GŽdæ3Ïi4†¬òÚÈ®]º°yóyô"#£°ÙéСäÞûîcÜØ±\Õ´3Ä©¨¬ªbÕªUÔ×7 Õj¸ü²Ë5j$³g³Ù6iNM µ¿]»wñŸW_%##ƒc……¼ùÖÛx½Ì&3'N¤cÇŽ\u啼ðâKDF±X,øÎÒv« ìÙµ¿Ï‡B!¢ÑjéڱɪÏE\|…Ç ÂŠ&"5•J…ÁIaÁQ:¤vD¡PàñxHHJ¢¤¤ˆü£GÂÂgz×î-ÞŸ@QÑ1‚Mq¾Ò»v ¯(:òæáóy‰Ž6£7ð¸Ý*ËËp:ƒAºõè‰ÏïÃl¶PSSÃÞïw Ñh4tHMCEô÷ç"A»ƒö)‹…Q£F2÷³y¸Ý.ô:=Çk5NÔÕÕñÁ‡âp80›ÍüéO’gi2222¿aÔ*W\qóæ/`þ‚…$&&¶™p:†Fee%/¼ðþ€Ÿ˜+S&OÂò¼ šù÷“Oµ˜TÞwï=ÄÅÅÒ@Þ|óÍ& †ÖÊ±ØØXJŠK¸ó®»ùç·¸vÓ7òÖ[o³êËU‚®¸òŠSNòÚ«&8x𠥂N:…•vŒ=šeË—sᨑ?øŒ>}úpèÐa^|ñ%4Z £FjR µMll,Fƒ_z­FKP’P7)¾áäõ7Þà«5_¡×ëq»Ý@·nÝÈ;z”÷Þ}×Ct´‰‹þ0¾•uÖÙTd~ûÝ·,\¸ŸÏÇàÁƒP($%%²zõjî¼ó.ž{îYºvíJ‡”^~éeâbc¹pʨÓ>;#£79ûr˜9ó"t:*++IN …c¸òÊ+xáÅËŸMòÚÀ(-+å•WÿƒßçÃb±pÅ—“œœ|Fé3L›:µÍkŽÉòå+XÓÇÇf³·=·HN¦gÏž¼úŸÿ Ñhñû|¨Ô¡rœzõÕ¼ûÞû zL&3GÈ+¢K—tº÷èÎû|€Çã!:*šñãÇÑåõeÇŽ|óÍ7x¼&\rKn²B{ö¹g‰ˆÐár9IHH ןwÞ}å+V ×ëñzCù—™‘Aaa!o¼ù&^¯7¤hl’ùsöå°`áB|^/ééÏhßcÇ Yûõ:v; ¥­Frùe—ñᇳxð¡‡ˆŠŠâê)SŠ¡–ýÒPf}ô‹Å‚ßÜú¯¼¬ŒgŸ}§ËIÏ=ÈÈÈ ¨¨˜Ûnm¨#Z­–Ë›,°¦MÊÛï¼ÃÖ-[™8q"—^zÉ9ëŸB¨@hþýÏÇËï{àAÝfÃçk=énntUUU(аYš(ŠTUU…V«ÅíEÚ÷x<ÄÄX1™¢©®®F«Õ† ®¶¶¥R‰Ñh E±O M2¨ª®F’$¢"#±X,¡ ¨UU$5ù(·‡`0H~~>.—«Åù.]º Ñh°ÙlTUU!Iz½Q¡ Öj¥  €Ž;†Óâr¹èÖ­}>¡Ín9uuuˆ¢ `U_OMMMH3Ýn'--ªªªp*A°Z­F‚Á Å%%tHI ¯TW×QQQ˜ÍfA ¦¦†úúD…H|\\ØDõdÞ]º125¬HÖJ‘µˆÍW­Z$ ˆA«D¼þ 1:Ѭ¥[²í‡êP*D\Þ.O ¸æ‚$–ï¨@¥ %ìn?þ¦Ä4*&d"çòp{C÷DëUÔ;Ž7(­JD¯Uâõ±¹ü¨”"­QpûBï:Ùò)Pž¿—{¯9ÿ”u!%%¥•‚Ïn·ãv»‰‹‹# RVV†Óé""BK|||8BsýTˆ"mDf“‰@ @UU6› Q¡ÀÓn“F¯×KuuuØÀåvSVZŠÕ‹^¯kQl6ÕÕÕ$%%…'õ@€Êª*ì6[ØÂÆh4âõz©¬¬Äét¢ÕjCñnŒ‘DF±ÙlTVV”$LMuòämZ=OÈ’­¾…B‰^Š“O}}=UUUDGG‡WD:vìH}}ªçÍç<UUUá@rV«•J…Ýn§¼¼I ‰Ýn§sçÎm¶?‡ÃAuuhÇ.½Á€5&µZË墬¬Œ@ @TTv»N:…Û_sÕÞþÃïóÐÔÓd2ìu»Ã R)(¡ÑjP«ÔˆJ^ÇC @ELf3Ž¦ËšË©Ù¼T©Tâõz±ÛíDFFâ÷ûñxìv;±±±áMn'Z­&,KÖÕÕá÷û1›Í¡4ÙíxšäÏ;ÆÙl6ìæ&7·°ÌèrQ[WGŒÅ‚ÓéÄjµ†æÅÅáż“󳪪šãõz=EEE$&&†ŸÛ<.‹¢šk44 ÅÐE’ˆ‹C’$Š‹‹q¹\x<^ž}öYÞzë-ŒFN§“êêjÜn7:½kLL«]¢¨–——‡Ý¸N¤  €´´4Q*DFFR[[rCb,¢££C;Ê6ÉÀééé(ŠpÚ‹“É„ -òçäüjhh ººAضm•UUÜ~Ûm§”?›çÕÕÕx½>ŒF–˜˜°BíÇÊ¡ÅÅÅX,–VùÖ,›'%%áñx(++Çï÷a0ñxܤ¤¤àñxÂu¡‡ÃAee%þ@€ÊŠ -ZÌ‹/¾€×르´¯Ï‡Ñ`ÀívÓ¡CÈ-ÌårQUU*G«ÕÚf9N¼äRÞ{÷jµšøøÐ&5~¿ŸêšQ*¡9w“_sÝn7n‡þóŸ,\°AZÈüC(¬ŒZ­¦±±1<7›—ß%`³Ù¨©­Åív# F£1úhÖÏúî?ÿù/”4ùŸ¼þÚÂÅ/Å»Kw#;´R ];ªmíõž£ ì+´µ­uމ =AÏúìêV×®™Ì¼M%‚çÖõÃPYݦbèÍ·Þ 4;>òçŸ?™–BÓÍþK›×~èA† ö»M{nNöiM~»vïVž ”œ‚Z­!ð·œrsö2tÄHêë±ür:LžrõiÿgÉâE?h´yófÖ­_Ïc>*7@™_¡bÈëõ¶ËËË™ñ§Ö1T®ž2å´±/ÿW(**⯷ÜÚæµÇ}äG[šýõ×¼øÒËm^3™LÌùdö9OÛk¯¿ÎyýÎ ïTvçwœKäM›61ó™gOy=33ƒgfÎ<çé]¾|Górûm·ý¬ïY´hïðáiÿç/þ3W\qù=?;'‡f}Ä‹/¾pV¾wâ%—²dñ¢vÉÆ>ŸwÞ}—~}ûò͆ DhµÜ}÷Ý?k¾>ôð#ìÙ³§Ík“']ÅŒ3~ÒóÿóÚktJKã’KÎÜâ§9ö×¹R ‘+Yff+W,ÿÍtÂûÛ­üío·þ"ï~ï½w•yl:Ndö7íºÝèöS\릭д‡Kí$‰à¹NÛi&ñ»õVþvë­È´ÄÄÄßT›?›ôÊÈ$2òô–F çNc0Ðjµm*í-1ÖöÛ£Ÿet:ÝY©+ñññòd2222¿Ú%>>þV^ø1¤¤¤œ•ü3f cÆŒùU¥­[×®¬ùê+¬Ö®¸üò³¶h6bÄFŒñ«+ËZ/²ÿ\uÕU?¦á§`6™rÄ/¾è¢v‡]E‘Ž;²æ«¯ˆ‹‹cÒϘÞfž~êÉŸõù½{õ&&Æò›êŸ~p»z9Ðçïr„Ÿ> –<5^jÛŽã’u°î—J^« {22?E ®¯¯ûÕ|ÉlADÖÁ“pºœ¿‹ºß¹sg:wî,·c™_x ü)×eþw7nãNŠqú{®½iLLLdò¤Ig-ÿ÷kw¾ˆ¢ÈÄ ˜8aÂï¦î4ï ÷[JÇïJ&óä¡Åîp¿K!F’ë®Ìï·ÛÕæù@ ÞšTFFFFFæ¬ÈT§¹&ËZ2222¿N«òû|áàÉ2¿"Tàܨ~§c¹(ЩC±NdNÈQDñwÔ“‘‘‘‘‘‘ùß ´e¼„ ÐænZ~ŸO^Œ‘‘‘ùÙænJ¥òœ½ï´or¹]xÜn¹T~gôMVa0úQ©<¿ßDvê@]}ƒ\ØM8N‚ÄXÌrfÈÈÈÈÈÈÈü($IBµºõîC>¿¿ÅÖÌ22222g¥Jynßwº‹KŒ\"¿CjëÈÌÌÄh4Ê™ñ?BII åee$&%Ë™!######ó£hvkkÃĤ$DQ!g’ŒŒŒÌÏ€×ëÁë9w†J9ËeddddddddddÚƒßïGƒrFÈÈÈÈü ´¥ÿ9‘C22222222222íC>-###ó³ö±ç9­ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒÌÿ(²ÅL˜üü|Ö®]Kyy9QQQŒ?žîÝ»ŸÑ³–-[Fß¾}III9£û·mÛ†B¡ ÿþ?úž 6°víZ ´—ÕjeÔ¨QôèÑ£ÍÝ4ÚÂét’••ÅÎ;ñûýdddpÁuVózñâÅ 2„„„¹âÉÈÈÈÈÈÈü6‘-†dddd~ÈŠ!ªªªxä‘G2d466òùçŸóðßÑó¾üòK¬Vë+†vìØZ­n—bhË–-øý~†N àèÑ£¼ñÆ<üðÃ$'ÿpÐe·ÛͧŸ~Êþýû8p J¥’}ûö‘À€Îj~/[¶Œ´´4Y1$######ó›DV Éüš ƒA|>~¿_VbÊüjQ(¨4T*Õ/ÚÇÊŠ!Þ|óMÆŽË5×\ƒZ­&àp8€ͬY³X°`ƒ3fpÉ%—àñx¸øâ‹>|8›7o&**Šgžy†Ã‡³`Á¾þúk222X¸p!eee|øá‡¬^½•JÅõ×_ÏÕW_MDD{÷îå•W^!//Ë.»ŒñãÇóÌ3Ï o¾ù&;vì ¸¸˜7ß|“M›6‘ÀßÿþwFÕ*ýû÷gâĉH’DCCwÜquuuÌœ9“?þñ <€7²fÍ{ì1Ôj5àðáÃÜtÓMôèÑAp¹\¨T*$I";;›çž{Žüü|z÷îÍÌ™31›Í<ñÄŒ?ž¡C‡ðÜsÏÑ¿úôéäI“4hYYYX,ž~úi²³³Yºt)YYYôë×O?ý”Gy„@ À®]»ðz½Œ3†?ýéO$$$àp8xë­·ÈÈÈ`ܸqˆ¢ì*######ó #I r>ü®Š47* †ãG € Šˆ¢ˆð*ï $áp8ÈݗჱÛí¡ÄÈÈœt:"£¢PüÄy™(ŠDEE“Ö© ‰‰¨šæ¥á>ö"+†døæ›oX¼x1&T1”ʰûÔ²eË8pàsæÌ¡¤¤„>ø€””ºvíJII çŸ><òk×®å_ÿú ,`íÚµüñdÈ!@Èš§oß¾Üu×];vŒ·ß~›îݻӻwo^ýu.ºè".ºè"Ö¬YCff&<ðjµš›o¾€¬¬,êëë™3gÁ`ýû÷·™Ž={ö`0äää Ñh0™LŒ=š… Ò»wo ü13fÌ+…ÊËËÑjµtíÚ5ìz¦×ëÐÎ/½ô'Näâ‹/æ½÷ÞãùçŸgæÌ™466âõzÃϱÙl¸Ýn‚Á ¥¥¥Œ9’Çœ•+WòôÓO3gÎÖ¬YÃí·ßNß¾}hhhÀáp0wî\AàÙgŸeûöíLœ8‘Ý»wSWWG¯^½d¥ŒŒŒŒŒŒÌ¯I“pF·„Ÿ<©ú±x}>Ô'­Æÿ¦²™Së4$IÂë¢Rˆˆâ™k>ü~?¶ÆFl 8¼ T*ÐFè0DFF£ùÙD%•ø©ñQ?Yçè÷ù8šw„ÒÒRÆŽÿ‘‘?í™QÑéôr»—açŽmôì•AÒðJ9}*q¬ Ÿ#‡M´Zƒ$ý2»=ÊŠ!™ð` T¶]8À…^HBBV«•ÄÄDÊËËéÚµ+)))L˜0•JÅE]ÄÌ™3Û|ƸqãØ¼y3o¿ý6n·›P[[‹×르´”‰'b0˜2eJ›÷§¥¥ñÝwßñá‡Ò©S'.ºè¢6ÿ/77—`0H0¤¬¬ŒØØX4 ƒ bÆ ìØ±›Í†Ñh [5Ó¼%`[Ê—`0HAA—^z)ƒ›o¾™Ë/¿üó5--?üá¨T*ÆÏo¼qÊÿ6m&“ A6l«W¯fРAlÞ¼™^½z‘˜˜(WT™_‡²â -†~?UÕ5ètDFFž“o-))Ń^¯ûMX9y¼~Öp°°–F»ˆÐ¨ˆ7è‘C¬IФªªw°=·”QýÓÐiÏLùår:©ª¬Ài³#ŠJ¥ÚB¨œ?uÕÕ4Ö×c±Z‰2™ÎúbeUƒçgoE©RpËUýÉͯ¢²6ä½Ð¯[}»Æ·KñØ—“è Ç`µZò÷ÕÕÖ ÖhIé*7~´Úˆ³òAHéŠÍÖHuUÑ&Ó/æõ(+†dèÝ»7Û¶mcôèÑ­®‰¢VšœhZ M>‘M+0J¥ò”Û–.]º”}ûöÑ«W/”J%Û·oùûžôüSѧOŒF#GeÛ¶m|ôÑG<ðÀ­þïšk®aòäÉH’DEE<ðUUUtéÒ…>}ú°dÉŽ9ÂóÏ?ß* µÉdÂëõRYYÙ¦F„Ð !EZó€(B8-~¿¿…õ(ŠáüQ©T§M§^¯¯ÀŒ9’… 2gÎòòòøÓŸþ$[ ÉÈÈÈÈÈÈüºhç & RV^Amm‰ ñçÌU¢¡¡Ÿ×G\œ£Ñø«v‰ª¨uðéê½ì%Ý»u$)%AkÀå“èÝ­©ÉV¡ýi;Õ¤=g_ýû`ôè±­ŽÞ™D›L|»í[ŠJŠ~pÒ/In·»•<ïr¹~Wm=´Xøþ½ q8 ÜnwØ à\R@I­úVY1$sÎéÕ«O>ù$ ,àÚk¯åùçŸgذaL˜01cÆpÿý÷3kÖ,¦OŸNff&J¥’ÌÌ̺9fÎäÉ“ùâ‹/¸õÖ[¸îºë¨¯¯çÆodÕªU >‹Å‚^¯ç®»îâàÁƒÜrË-aw¶aÆQXXȤI“ƒ$%%qäÈn¼ñFvíÚÅ=÷ÜÓ* )))¼÷Þ{L˜0Ë/¿œ·Þz‹3f––““¹á†ZE}ˆŽŽæ®»î"!!»îº‹¿þõ¯ÔÔÔœœŒR©äþûïçÀüå/Aî¾ûîpÚt:3fÌ`ÕªUŒ5 ³ÙŒJ¥¢wïÞÇ›(Ò§O ä66oÞŸÏÌ|fæóyÍ»øý455µùy=ž£*»å…p7¹Û-SSA¯Ó¡Ó騷¯œ†úTE9¦z~Êß²u¥|µf/^˜€§ £$Ó¦’d bÒ|(¡ c²Æ˜š ÆzuÍn608úúêêp»\ôÂÁ:Y‡ÉlAF±’$dIÂd2cÐP h`Ðé(Û³ç¸Ï¡ÇäÝÏ7SR W<*ýÔ»Cdegpþ¨„T MÕŽéØfuáv7a·Û©o¬‰üµ48jipÔ°¯¼”””*d÷îÝ8]ÎCµ6näÎ;ïä¶ÛnÃáp°wï^&L˜pRÝêK–,aΜ9¿˜ölÛ¶P(ÔáåƒAB¡±±±¨ªŠßï?¡ÓvŸ«'áJ&ˆ2`Àž}öÙ¶D¯gÒ¤ILš4©Õò˜˜˜V Nµø),,ä­·ÞŠ®ëܹ3>úh»õvêÔ‰Ç{¬Õ²=z´ŠÇ“‘‘Á}÷ÝÇ}÷ÝwÐöO›6iÓ¦µ»ÎçóEcõ´EíÏu×]Çu×]×f]^^O>ùd›å)))üéOj·¼Ùb±ðôÓOpÖYgE³˜Ìš5«Õ~UUU|öÙgÜpà …ì$#°|Å vïBÓ4bbb8ÿü±Øíö­ç®;ï¢ÉífÙ÷ßñòܹüûßÏP\¼“„Õ³o_9Ÿ}öé÷»¤¤DN?ýtrrr޹ÿ}òÉîû¿ÿ㛯—Ò»woqáàÅãõRUUM  ×GÝñ'‡³ÍäH–%zô<êzœ.ååUÑØ;­Ç²:%Áh4QU]ƒ¢ª$%&´ -ðsò¿v¡ª*9™ ˜­FõÏ`æyÝiòÙ²»–¯×”²nWzÙJX6Έ^'ƒvô_ûUU¥ÉéD§“ …"éÜcãâIJMÅÑPËÑïÛbIJIÅÝÔDuE9ápƒÁHÀçÇçõ¶qÕ:òú5>_Q†=òóóhð„…#Uf«ÊF?Цá†QTŽºT’$¡Óé©UÈ)³ÅBuMF£ £É@ccöøƒÏ~øáFÅ„ ())¡´´ô°^£ººšââb†ŠÛíæûï¿gìØ±øý~V­ZEŸ>}øî»ï:üƒ±¢(lÛ¶ “ÉD·nÝ~Ï”U«V‘Ýî‡þ>þøãà tªª¢ñi›šš¢ãñ¸¸8Ð4 ¹9+ŸÑhlõ¼ÐÐ:Ä•¬¥´Ÿ1ãœôhšÆõ×_Ïš5k>|8¶c|(V¬XÁ¬Y³HNNŽZ` Nñþó_¨®©FÕT¾ùö¶ösï}ÿÇŽ;‰Ãðóæ[oñÐC§¦¦æ˜Ë=çœsxú©§ÈÊÊ] Nâ1Ö¡~‡}û*ð‚ètq¦%Þ¢Ñhló³X-7¦Ã”ÛîOÕ"A“M¦6å ÂJE¸Iéôzêêê©®©% S}µµ58m–{=jª«C¹{k›è–›Ê„szÓ3'‘`/ζ IDATþ]“€¸#CúdqëÄ3(왂ËلŤ£ªÁƒN'¡hJ4Pô‘þ‚Á`Ä’X’PÕ0àõy‡C$¦¤gO &6–¤ÔT$Œ»É‰F$•½¢D,½^ï±]+Mcù¦},ZUFNn&MA §'@ & ã „htûiò0›MlÛçdCqu4Öé‘ü' éõz‚aO¿/åÉyëyíÓ­¸FBá0^¯—˜˜ØÃZ¥8N"âb~~>cÆŒ9æ{iÙ²e‘d:_~ù%ååå,^¼§Óýß‘¸Ýn¾úê+JKK5ÏiÓ¦v>מ±C{×Ïãñ‡QU«ÕŠÅ *m2™ˆ‰‰AUUÂÍ}Âáp¶Ì@ ÀüùóÛÍ ½víZ>ùä“ÃÊCGÒ‡ „Åà¤G’$î¾ûnÈÈÈøÅ··GÜÿýdddDN‚“‡//¦¤¤„éÓ¦‘ššÊ%_ý:ñÙÿË?ÿñO&MžÄ·ß~‹ÛíæüóÏÇn·óÉ' ðxÜ\tá…Lš4‰¸¸8jkk™3çI¾_¶Œøø8.0I“&a2™Žº]gu&—]v~¿ÇÓsžäöÛoÃãñðÛß^Ãm·ÝÆå—ÿ†òòr®ºj ×]w-S§NeÅÊ•<ó̳TUU‘››Ë”)WqΈlܸçž{ŽÁƒQ]]Íõ×ßÀyçGm]Û¶mcذ³¹öškHKKÃãñðâ‹/±dé$IæÒK'0}Ú4$IbOi)Ï=÷üð#œN'ƒfú´iäçwL N(t¨À¬n·‡½å‘@Å:®UŽˆ{P;GºõhÜœ%J9X»eކFJ8LFFúQ[59ÔÕÕÒ£Wqqñøý~Š‹w “u$&%õ1Ę \|N/ û¤ìDblk‹ˆ&O›+蜛Nr‚ÌäXŒ:ÐÔ£?oÁ@ "|´œ/IÃïõR¹o/Ù:‘”–M›]¹w/n·;2aECQ#–=þcŒ¥³ew-//XOÏ‚|üª„Ããk×k&“ÍHrZ*ÿþh÷N+$?'±CæÆ+ŸlħÖÐ%G#¤$òö—ë˜qþ`zwM§¢¼¿ïà®Dß~û-o¿ý6ü1±±±hšÆäÉ“¹úê«[õµo¾ù†×_ÇÃäÉ“?~ú(6l gÏžÜ~ûídddðé§Ÿ²~ýzjkkÙ½{7Æ cÈ!,X°€­[·2bÄ®¾újÚ=Ÿ›7oæ…^Àl6³}ûv&L˜ÀÔ©SÑëõÜqǰhÑ".¿ürÖ¯_ÏÝwßÍŽ;øä“OPU•Í›7SXXÈ 7ÜÀ+¯¼Bqq1cÇŽå‚ .`öìÙíÖ …0™L­Òøÿøøøý‚¯×‹Ûín÷yÒê¾ Y¸p!.—‹‡z(×vãÆüñ$??¿]«¯V®d?ÂbHpJЯ_?rrr¢1Œ~ÉØívúôéCRRÒ/:k†àØHKKÇ`ÐsÁ¸ñüîŽ;Y²d µµµ8Ù´y3Û¶ncÎO0tèPî¿ÿO|ûÍ·ÌyâqÆŒÃßÿß?X¹j4~ÇŒÍÇÿùˆÙ³fñÀßþÆÛo¿}Lí*--cÝúõ|µd ß}÷ "¿ŸÍ[¶ÐÐÐ}ámÚ¼™ÚÚ:î¸ãN*ÊËyrÎÜ{ï=¬Y½€úú6mÞŒßïÇç÷³iófÖoØÀí·ÝÊÌ3xöÙçøì³ÿðþ“·Þ~›Ûo¿›o¾‰G~„7Þ|€ÿûß¼ùæ›<ð׿ðØãáñxhlŒøñßsϽdgeñúk¯2~ü8V­Z):˜@ œ`q¨½_ ¤¼²EQ$‰P(D8>ìO +Çl‚¦E¿îî …+ ²,Sßè ±ÑqÔõåvêŒ=!í[·R]U…ÃÑÈÖÍ›èÞ£:î¨Ë¼wÆPò³l4:\x¼^öV;Ù¶§ŽŠÚ&œîϼMU¨®¨bÓ¦lذƒUk·“šhE–¤£ªKQ”ý¦›3‘©ªŠß磶ªY–Ñéô4Ö×ãijBUÔæ˜?ª¢ i*Šrt×KQU6íªáŸ¯/#15 £ÅHeƒ_ ˆ?Øöç ©hð`‰µ’œšÄO,¦h[%á#é'‡šK2߬­@Ó­¡O~#š±=ºn`ø«yûó5˜M¦ÃŽÁ‡ ƤI“xðÁY´h÷ÜsOKëåË—óÙgŸqçwòüƒ¢¢"–-[]ß"Fz<vìØÁÀñûýlÚ´‰Aƒ‡)))!;;›×_ž={²hÑ¢¨€´yóf’““yå•W˜:u*³gÏÆd2ñòË/3}úôh"¡ºº:6lØÀý÷ßÏïÿ{/^ÌêæñZuu5@€¼¼<žþyÌf3¯¾ú*ýúõcÓ¦Mm0Ï™3‡´´4^yåzöìŽY¿~=×\s /¾ø"µµµ<õÔSLš4‰W^y…@ ÀÂ… z>½^/7ndüøñ¼úê«lݺ•?üˆ$1r¹\¼öÚk\yå•”••‡q»Ýlܸ‘Ë.»Œ7ß|“Éļyó¸ûî»éÖ­‹-:¨(˜˜ˆÏçÃét¢ªj»×\Ó´h¬²ÄÄË’6›û￳Ù̬Y³X²d .äŽ;î S§Nüñ<¼À}„–o°‚ÈÌ™3ˆ‹eÕªU¬\¹‚÷ߟñãÆ1wîËÑm&L˜@rr2ùÝò¸ðÂñ¤¦¦Ò³gOšššðû|Q}—ËÅÂ…Ÿ q¹šØ±cç1µë믿¦´´´Ù쿜3ÎHLŒ·»9uæAÆGòòؽ{7Ÿ¾˜ììl.¿üòƒÖ1|ø°è)ŸÏ‡Ûùòò¿ÿ-B¯×S¼³½^O à«/¿bú´id¤g`µXøö»ïØSZJaá`ÒÒR©¨¨ +3“òòræò ;wæ‚ .L N‡ÊØ£Óɤ¥$SYUC0D‚VC‡Pšš]•”cjÒ쥦.I’d°ÇÇk;¦:³sòÐT­[6¡„ÒÒÓÉïÞY'S‡{ÿý%f«¹y‚RTêêL>·7—êÉ]S Ñ´H|ž–xÓ•õjÜÈ’vTÇ ÓéÐÉ2áp(D Y–‰±Å’œšJÀçCQâí ý~jkQT4 Y§CUTôzýQÕ)””7•bcåºb’S“ …‡žK^ˆí;÷Ñ#7Õ[ÊéšG¬õÐÖчê’$Ñè €”Dy}ª\MnJV³‰²jg³`³?KÔ±²k×.<EEEÍqµìÛ·ˆ$ÍùÃþÀºuëèÑ£f³™mÛ¶a·Û‰§±±·ÛÍé§ŸÞnÌÇ””.½ôRL&#GŽÄf³1qâDL&Ç C‘±ä…äææ¢ª*]»veß¾} 4ˆÍ›7“ŸŸÁ``ÅŠ<òÈ#ÄÇÇ3fÌÞxã6u®Y³†¹sçb·Û¹ôÒKùÏþ]wÞyçQPP€$I 0€ììlúöí‹,ËôíÛ—]»vò|õïߟÁƒc6›™0aŸ~ú)W^y%°?ÙÏ),,dÀ€èt:† uÁ;"!D¯'99™ºº:\.v»½8äñxðz½$%%a4ÔÇÚ¿ç233¹÷Þ{xè¡¿sÅW ×ë¹ôÒK¹ë®»°ÛííîÓò|T›Ûûª†?;«ƒ¬[PtÈ€]‚“ ÇC÷¬8w[p‚ÈÈÈàÖ[n¡¡¡UEE<üðÃ,þâ‹VÛX,–ˆ™{ó  åoéuÆï÷sÿŸþŒËåbäÈs°˜-‘ zÁÀ1µkúôi\vÙe455ñØcóúo0«9k^Kì í½÷ÞÃÒ¥_S\\ÌÛï¼Cß¾}yáùçÚ­Ãb±D¢í˜ëKDÒá"Á=÷ÜCVf&W\qii©lÚ´™Å‹¿Àd4òäSO’ž–΃>HÑê"ŠŠVóüó/pýu×rà 7ˆN&¿l6™UÕüHÊñfà§J¬Ñ(Vj§ü–/ð-Ù¶4M#1ÁNJrÒ1 6 dçæÁ@î={¡×PÕcKs­¨pF¿®ì®t‘•lÃépÑ·Sã‡v#Ælhž@jìªlÂåWˆ·šy÷‹íhJˆ³úe]ÛFtz}4’$Õf#-3ˆû˜ª(¤ef’’–N8¦¡®Ð"ã ,ëQÕiÔë8¯° cufÊŸçã †B¨‡Ò… DHQ˜5i0Éñtºãë?’$o3³uo:}SÿK…ã,öV%ô›HŒKlLÝRûñ‡ÑétœqÆQ±Y±bƒŽÌÓvî$;;‹ÅBii)@€Ìæ1Ñ‘e9>@¯×·ùû@Áí`ÃÆ™2eJô9œñãm¬Ãh4FïmN‡Á`ˆÞ[?v'=’kt`Ù111½¬ãh­lôz=‹å §¢(ÑXemÅ…p8ÔnyyyÜ{ï=hš†ÍfãŽ;~Gzz¡Pð õ„ög¶†NA*CèmIX "~Í©BcêÜŠ8¿Þ|ó-’““9ë¬3éÙ£ ‰Ç”"óÃ?0bÄ&NœÈ7ß|Óü†>¾öy½^êêë05¿Ü%IÂÏž={¨««ãÃ?jµý7ß~ÇøñãƒïÚÅÚµkºÎq\Àÿ-¢G÷ RÈæÍ›Ù¸qÉ<‘ŸŸÏÈ‘#yêé§™7ï}Ün7.‹“²²2&OšDee%/fûö¢ƒ Á äp“0«ÕJFz••UøýdYFÓ@QTÂáöû†cv¡…CÐNÀ`I’Z}U…””d’“i2ùã‰iNn§f×+ÝqMð4 ü!…Êé‰VŠK«Ø#£aÊʶ½N6ïuðø¶h Ë?êcÐétFÞ}÷]n¿ýv¶nÝÊĉ ‡ÃìÙ³‡Î;c2™¨©©A’$ÒÒÒ¢×ÌápS&ÛÏ>ûŒ³Î: ÇÃîÝ»éß¿?^¯—²²2zöŒdõ4²,“ž–Æ?ÿùO:w(üñäƒ?äÆoâü Χ{÷ü¨Ÿuï‚|è!ö–í%9%™ßß}7ö;Ý»çc2™Ð5gKÊW£ÑH÷îùÑ„wß})©)<ýï§yäÑGèÛ·/3¦O   ¯¿ñ&«V­Äf³ñ׿ü….;G¾ ëdî¼ë.êë˜pÉÅÜzë­¢ƒ Á/Dj!Æj%;+‹ŠÊJ¼’,£ª*™™$&$Ðl|rÜ$$؉k;ÕÒ`ËÖm4‡!BÓTÒÓÓHJLè°‰WK Ë£±ˆ8Øä0Áf&75–êF§÷íÊÚm{¹ë©¯8«oÉ6š|aæ/ÛKE­Ÿ×=ÆÀˆÓs©¶”ôtÙÙÙ(ŠÂöíÛÉÏÏÇh4¢( ÇgêÔ©Ü|óÍŒ7.ZO ‡ú;++‹x€@ À”)S0`K—.å´ÓN‹ºh]ýõ<üðÃLŸ>>}ú¹Ÿ¬VkôØn¿ýv~øafΜI·nݘ5kVó¶õ½×Ê Çf³6FOBBóçÏç‘Gá /ä²Ë.‹¶ý@+ÃÌÌLôz}«sËôääHÐ÷«¯¾šk®¹†Ñ£G2ÎP‹ëªÉd" ÒØØˆÇãÁjµb·Û£Â±¢(m- 5í0Ö©))Í›úÙ ©?ºz‰Hj Ц¿ýõÏU¿¿ç^«»©I¼ñNRþýáJ3ó…0t Q^QEšÙÄá=ÅÉ@pT⪪ìÛ»—%_}Å-·ÝŽÇã>r¤9p°9 µ»É‹†FfF‰‰ Ñ ‰$I‘Éxdæ~¬ nƒZ Þ¼e’$¡“eRR’#¢PóDó—”ècâ}ÿaxa/Ê*°ZMh’½^G“ÛGƒÓÛã§É@EC“õ(ŠÊà®ñüí†áÇì^ånjbÏ®]HÚþ‰²ÔòG4ÎNäÚÈ’Œ¢*ÄÚítêÒå˜3 2ùÏ HÊͦÚá=¬0”k¦º¬Š§oN—œ#Ëö xû­7¸ròTbbö»¼-ül“&M‰ºÏIÈQ÷ÂÝ ×oXGÀï'?¿;P]U‰Ñd¦k·ü½æóæÍÃår1}út¶lÙ¢E‹˜1c±±±<ðÀLŸ>Þ½{WO?ý4yyym²aýå/aäÈ‘Œ1"ºlçÎäåå±uëV^|ñEzè!âããò¾¿jÕ*æÏŸÏƒ>xBï9UUillŒô™`›ÍFLL >Ÿ—Ë…Ùl&“˜˜ØJúfé²rrZ SÇÃî’ÂáùùÝ£ñÉZúcéž=<øàƒ¡>žïÂ@ðùê¨oþ54¯s7oç@°¹ ¥ùæV›ÿ/,†NUÔ¨é›àÔ¸ÞâZ @ øi„£C 5š†ªi‘€Ô©)hj ®¦&E! 5[f´þÉÍ"ÑQ‹BÔ×’©L#ò5^§×‘”” 4­ªH-i륮Ÿè\†Bav•”Ó)ÕHXqSíÒð«2F“™Ä„xl±±ÄùC8›|8œMtJ¹bTW”pI2“Èe¶X°'$àht *ᨠMË¥•$9:– )aLf3±ññ„‚AtzýQש„ÃT×Ô‡QT“že¨öEU©®®&;5C;ñ^ڜσ,ÏÌÈ⇾?äÓëõèõzt:]«s©c½f³³É™(Js g5š‘K–åHÖµæÿïu²ÛíÇ·F:Šz%Y¦S§ÎïÜÉiýûc6™kž‡¾ƒ­g¿nÿq Cš¦áñ¸q{ÜdefµrM;Ñ–ŒB:U_æšö#ßZ­ùÃODñ#Ülé‘ie[…‡Fw«IO~†•½u~<~%úâÍM6³»ÚKEƒ€`XeË^71f=Ý3c0ê%TU#+ÑÄ–½œÞCºÛùð‡ªh+ZþÎN4‘—b¡ÆD§ƒ½ÌŽr/±f:Y"ÑQU³{&PRã%ÖÐÉ9If–ïp iš`¤{f ÕŽàA}‰[„Ù–õþP丌z‰ü +»ª}Ô:˜ :º¦[©uiò)m¬p4"eØc ôÊŽAQ#íI‰×ؾÏM÷ +Û+¼Ô¹‚tK·RVçÇPè”jÁé qZ§XjA‚ŠŠÅ¨#3ÁÄê].BJ(ÑeH A‡&ÞBåpn[ô%K:P”ú ëùIô!ˆ >¦#q™êÀc‘% Y¯?ü±ꔎµÏ!½ž>ýú±vÍjV­XŽ^ß1¢Î†õëŽ/ ºº §ÃAuUõq—¥ª ö„“’¢"ðÏñœÂx—GU±§'µ¼C1t¬ÛíÂá ã (¤Å›pzÂ$ÅPT¨s…Z -1&=¥µþvûoBŒ ëw7V5zåÄ‘`Äá 5ûf¶n˜¦ED–wˆeM(ŠFï\‰±¶ìuÓ'×FQ±+º‹¢jìªôQßD¯“9§O"‰6NO˜N)vUy +‡¾±FöIŒø›K`ÒëØºÏÛ§àô„I7Òà ’£Ç “¨j ´/25·=#Á„ׯ°eŸ£^¢O^,öå Òâøƒ*Ù‰fE£´Ö‡A–px"T{j}T;‚˜2çôND–A wÌõ@ è°±$ˆÏN‚_,²,“ÀÐaÃp:œ„Ã!Ñ_FVv£1âNy\H ,Vk4pþÏ…†NQ‚aC(ÜJ8ørC$nN–ÈKµž`dÛ¾&vUyœogo—t»‘•Üþ`«Ñ@ ¤ i*ÁP[C'ׯá FW›`(I_7G׊øCaE¥ÎÀåÄéiò…1éåýûPOXÕ¨hðE-x¶ìuÑ+;†]U^A…òzÁÐÁ]²TMãÛ- B*² 9É2ÌlØãdw‡AÝìXL¹)fJª<4ù‚펄ZÚeÒKÔº¸ýA$$¼þ0²¤±§ÆËð‚DœÞU?iv#{ë¼H’F˪j”×û…U|Áæìaåm?RŠ":½@ ‚Žã,†‚…#IzžäJ).üdÓf×ÍÏ-O$B:eßå­I —7N’ \©Òm@*ª¦Që Pï R˜o§Ñ¢¢Þצ£î«÷‘—j¥®)ˆ/¨ “%b-zÝ!ü!…¤X&ƒDXш³èñ”fáC%ƤÃãW°[õèe)ÿè@w·§•¤ˆ¥PËÀD9À¿sOµ—^Ù6ú䯲a ?""ÙÌzÀíû‘x¥E–`Ug. IDATù‚ kôʲ¡j MAju³ã (”Õy>jnŸ'&Î9ƒ^¨—ð‡|0aE%ÝndW•½N¢kº‡;P"©8Õ“)"®i¡w@\4@ àW5ßi‰3%†NQ"âKëe»Úˆ0cÒQ\á‰nSVç£Kº•o·4ОWÖžj/ö§uŠÆÄÑë$–oo¤Ö Ýn¢—xUè—)Þ){W•—Aùv\Þ0ŒA/¡jÄýÑö?Ø#iH#A™u³³§ÆKEc º¼…°ªQÕÀc ²ÑªE¬–:§Y )ûcE_Àiâ)ÁÉj’Ù]ã–YÞà§WN,˶5p¨p?-í(«õѯSºÄ£×I„:WEÕht‡HŠ3Rß$VsZ2Ÿ¯«‹3ís;×é˜^Œâ•(@ ‚vÂÐ)Ц¶N¯÷ÍæzÌÆHºzMƒÊF•ªÆý‘Öm¶—»ipÛM}îWaÍ.iv£.*‚(ªŠË§²¡ÔEJœI‚†¦žš¦±a“ŒD3zYÂé QÑàCUUöÔxšBGê/«ó¡“$TUeùŽFm|AUUùvs}«c‘uf£ÌŽ 7^Äõ,Æ¢'Ƥc{…¯MôøåÛˆ1ë¢Ç^Õ¨RíD·³ÇØUå¡ÎEEETVU‡IJJâ´~ý3f _|ÉÉÉ'´m¥¥¥TWGRÜ%&&Ñ­[×V·z„QÏs’­ îngm‰§7ü‹ÿ2TØ=‘›¥›ê †÷[©ŠvÔißÓãM ïÌÆRu®àÏ%¾#î@ ‚Ž¢{Ïôz8@ðà÷ùñû}'¬¾. }¾x1CÏ:‹˜˜˜VË«««ÙµkguV‡N†KKKyþ…xï½y8ÎV뫪ª¨ªªâ‹/¿$33“óÏ{BÏÅ3Ï>ËK/½ À¥—^ÊK/¾p…‚#³"ÙSãmcÉòKæ›ÍõVVec€÷¾+?),Bàðüçã¹tÂq"Ž€`0@8,‹!?ápè„ÖwÂ…¡×^{>½{·†JKËøxþü†ù÷3Ïòî»ïâõz±X,Œ=šk³QUUÍ÷ßÏšµkÑ´S+m“ªimbíN^„Å@ ‡gΜ'õ¦i|øÑGäæä2x𠟲"1¾‚“„ã†Ea̹çµY>fÌhþï¾û~Öƒ[¹róæÍÃëX¼Üwï½\~ùo°ÛíèõzW]5™… ’ššÚ楺fíZÞÿ}vlßÇë%..–ÂÁƒ¹ä’KÈÏÏoµýËsçòæ›o0xð îºóNæò ‹A“ËE=˜:m*§Ÿv%%%\Ô—ï·FY²d #G %%™yï½@]]_ó ËXΞ={pºœ òò:1|ø0Î;÷<Ú{ à‹/¾dñ‹Ù½{@€Nyyœ{œ±ìÙÝpÊÅU:•QÂa Òºˆ!‚“Š ðÚë¯óð?ÿI—.ûßsÿøçÃlܸ‘·Þ|ãgmß-·ÞÊ–-[Ñëõ¤$'3pàf̘ñ“†/Xôù甕•1zÔ(ÑA@pD·0¤ÓéøêË/¸ëîß3yÒ$ èOSS;vî$ Gff&:]Ŷ®‡Ó‰Ñ` 33«ÕÚ¦ÜòòrœN'&“‰ÌÌL,K›mšššðz½¤¥¥µY§ª*o¾õnw$5ù…ãÇsÝu×b0¢ÛX,òòò¸å–[Zí[]]Íc=Î[o¿Ï×گ﫯–ð‹/qÛm·2sÆ bcc#ûTU³aÃذ~«ŠŠ¢_RV¬\ɧŸ}ÆóÏ=GRRbtÛ‡€ÌÌÌèò;+…Ÿ~Úæø–/_Á{ï½ÇàÁƒù×£RPÐ+ºn×®]Ìš=›~XÞjŸU«Vñþ0{ölæ>ð@´í‚“Ÿòòrª*+ʼnÁIE}}UUÕ|úÙ¹åæ›e™¢¢"ö–•±sÇ ò±¯¡¡ššZt:™´´4âããðT”—ã÷HøÑ‡¶††ª«ku2éiiÄÅÅ!IR«mE¡´¬Œ.;·Û¾ââ]ü￟¡×ë©©­å«¯¾âÆ›næÿïïtëÖ MÓ¨ªª¢±±“ÉDFFV«¯×KUU:·ÛÍf#33ƒÁ@II 16 õ H¤¥§cG’$Ün7ݺv#''‡`0’MU’$4M£¢¢":¶ÎÊÊÂl6×¹×IX ÁO‰~ºvˆ+YËKR"’ÉÉårñö;ï°·l/I–¹zæLN?ýt^™û Hà÷û9gÄ9L˜pI«òvîÜÉ3Ï>‹ª¨„Â!FÍ„ —D…¥¨8²b+W¬äÿþ¯}ˤuëÖEÿ}þùç£×þp½^ï¼óï¾÷>Ÿ»ÝΠAg`O ¦¶†ï¾ûžúúzžzêi:åå1~üø6–7åååhšÆ¸qã0ô,[ö555Ô××3wî\þþ÷¿sÕUWQTTÄŽæAK^^C‡Àn–e³Ù8ýôÓÉÊÊ$&Ɔ,K455±zõjªªªY¹r%o¼ñ=ô ²,SWWÇß|+VššJß¾}INNÂëõ²{÷nÌf3åååÇ= üzhll'A '%cÏ;Õ«‹¨¯o 6ÖÆÒ¥_3âœlظ€ŠŠ ^}õUªª«QU‚^½˜\yå$$´<³gÿŽOæ|È6êt:2ÒÓ™rÕUHÀûïÀ½÷ÞCqq1Ï=÷<¡Pˆ°fø°aL˜0Í›7sï}÷qæ™gâtº\5y2ÇgÖìÙ 8&WN—“îÝ»së­·¢„Ã|<>«‹V£ª*v{<3gΤK—.ìܹ“gŸ}UŒ­Ï3†K.¹äø¬Ç5 íGB™@ :J: ÒÕ˲LAAS§LÁb±°xñb>úè?Qa¨OŸÞL™2…;vðòËs6ììVûÏû #FŒ`ìyçQ\\ÌOÌaܸ ÚX õìÑ»Ý~ó¨Q[[ý;''»ÍWžö(¯(gÑ¢Ïq»ÝȲÌôéÓ¸áúëIJJ¢²ªŠ{E‹>§¾¾ž÷?øsÏ=·À’œ”ÄM7ÞȤIW¢7˜3g?þ±ÚÉÉÉæ©'çð‡{î‰ C à©'ç´iÏôéÓ0›Íäææ‹$I8].Þ~ëmþü—¿ðÅ_ð·¿=€,Ë,_¾‚¢æAJJ 7Þp=¯¸‚Ô”<;wÑA8&‹îAQÄÐM '#999ÄÅű`Á D££‘Kø ¸ôë¯1M<ð׿ât:y饗ٲe ƒ bþÇó¹öÚk9í´~|ùå—,[öŸ¾³ÙÌ<€Óéäùç_ ¤¤„¶ªÛl6sýu×U{È’¥_0oÞûôë×+®˜Èö;xù¥—9ûìȸ811‘Ó§“››Ë‚ øß¢E >€3Î8ƒÑ£FQSSÃî¹ÛCyù>¶mÝÆM7ÝDNN6o½õŸ/^Ì7ÜÀË/ÏeäÈ‘œ{îvîÜÉãOÌaüøñÆcŸ³ü @ üŠ„!“É„»ÉÍìßýŽÚšZ¼>/¹¹¹Ñõ#GÂb±PPP@ Äï÷·Úý† ¬ZµŠ_xEU(..FQ”v999m‡N§‹Šá°rDmo¨¯gÇΈX£×ë™9céééäæä0uÊ-ú€¢U«ÚW:uêÄÅ_LBBš¦qæ™gF…¡†£´Ü8ýôÓùò˯xó­·Ù·on·UUp¹š¢Û”WTD]Ö¶ïØNccÝ»wçŠ+® ##€øøxÎ8ã 6mÞL^^žp%;…®d@ 8i‘`òU“¹á†q8dee‘{Àø°¢¢‚^½°ÛíÄÅÅ‘œœLCC#ªªRS[Àý1Œ=šGÿõ%»KX¼ø >_¼MÓ(//gôèÑmª6\xáø£jn(ÂÐlÅ^¼«˜I“'a±Xè]P@(ŠŽ‹ssséÒ¥ ²,Ó½G–,]-ãì¡C±X,äææ¢i ª ~ú)«×¬F–u8F5ÇZ·~«×¬æùçŸGQvî,>þ$$íˆBo¿û6eee­Æâƒ fÄ𢟠Á/˜ŸD*//ç½yóøÝìYtîÜ™µëÖñê+¯F×ï.)¡S^uuuèõº6.^éééÜvë-tíÖ 4 §ÓÙn"¯×‹ßï'11±íA’èÒ¹3[·m‹¾‡vX“Ù`(„Û퉖q`¼hÿ§Ñáh7Cl\,éÑ2¬X:ÍK¸²²’?Þÿ'-Z„¢($$$cµ"Ér+1-Dÿínr FRÛÅÅÆ’’’"z¹@ ‚“šÔ”†ÆÆM¹ãw¿Ãd2E×ÅÅÅQ[[K Àçóáñz°X,H’„Íf£²²’ììlJJJ¢û$&$rûm·qÁçGãü´g¥®ª*UUUmÆ‹í‡q»ÝÌÿäÎ<óL’’’(+-¥S^µµµÈ:9:.–%9:n•%©•£Óé£ãÌ,3.¹„ë®»»ÝŽÏçG–#ë332™={]ºtAÓ4ͱ†:šÍ[6rÑE££ã]w“‡+WгG϶“ƒ{¼½M¨ˆöX¼ø Ö®]Ëï·èìà”àWcèÇFbb¬¬]»–mÛ·³ü‡å­ìƒ?¤®¾ž]»v‘ß-ŸÄÄDª«k¢ë{õLÞyç] €¦iìÞ³›;ï¸£Í ìûeËcH’$Fކ>øà.»ôÒV–Kq9«¨¬ÄC||<&“‰¸¸8Ð4=¥¥äwëÝ~÷ž=Ñ'''#Ir»u· ŽÑÿú«%Køúë¯ñù|äççóè£pÆÀ˜L&/^Ì䫦´Ù'>>“É„Ïç£Ñá ¢¢¢Í1 @ œlüîw³Û]~æ™gòÆoðÎ;ïÐäv …èÑ£;z½žáÆóÒËs)(èÅúuë£ûœ{îÞ}÷]Bá0f“‰òòr.¼èÂVcB·ÛÍ7Ý|ÈCŸ|²½^‡ÏçgÏž=øý~.¹$_óâ‹.âƒ> ²ªŠÝ»wÓµkW[…C8RºtéJRR"~øYÙYÔ×Õ““›Ã¸ .àê«gòÖÛo3 óØz÷nî¾û®VIY:bÒ¢ªMnÕÕU iXÌ6<^'O?û-~횦¡×›¸áºIKKîïõzY¿~=µµuºtéB·®] +a‚¡ ÂqM œ:ÊЯ8ÆÐ¸ñãÈÊÊ"11‘™3f°~ýz<“&]ICCÄ…jÒ•Wogë¶­tîÜ™sFŒÀf³‘““͸ .ˆaÞºu+²NÇØóƶûâÊïÖ˜˜˜vÛ"I]x! .¤¬¬Œ­[·ñàC1cútúôéƒÕj¥®®ŽU«V1ÿ“\=sgŸ}6ÉIIôìÙ“eË–‡yñŹíÖ[IKK£¬¬Œ×^{-ZGaa!ñŸBƒÞ€,˨ªŠË墮®Ž¤¤¤èןºÚ:\.&“‘¤ÄDdY¦¸¸˜W_}­Ý2{õ* ))‰}ûö±}ûv^ã ¦MJVVMMMlظ·ÛMÿþÄÍ&àWÍÀà Qô®¿>û§OïÞ\5y2EE«‰‹çü±cÉÉÉA’$&N¼œ/¿úІ†Æ_8ž~§õ   €)S¦ðÃòå4:¼ ПÌf×ü1™Í̘>ý íûío¯¦¢²Y–±ÅÄPX8˜ÂÂBl6[tÌ«j[·l¥k—. >œØØX²³³¹`ÜÑrÒÒÒ˜pÉÅ̘1“il «&OÆf³Ãå—_ÎòåË©ªª&+;‹AgœÀ°aÃ$‰­Û¶¡ÓéŽ8)ËÑOZ4‚4ðz$&Ä„Z‰:ƒÊÊšˆÕ{s9‡W_}ºº:bccQ5•5kÖ0kÖ¬ýJÔ/,¦Q}}7n¤wï‚6VúEEEH’ÜÜGà—M‡ C£FŽŒþ{È! 2¤Í6]tÇkµ<### G’$Î>ûìhð½ƒÑ©S':uêtÐõ}ûöá†ë¯ã_ÿzŒ†ÆFæÏÿ„uëÖ‘–š†ÁhÀãñRQQNuu —ÿæ2²²²¸àüóÙ¸q#MMM¼÷Þ<Ö®]‡ÍfÃép°ióf ’íëŠ+&×—–ÔÔT, ‡¢¢"¦Ï˜Õj%)))’Ö>9‰ØØXÅÅ»¸éæ[HHHÀáp°eË–vË2¤!C ùÏ*illä•W^eéÒ¯‰‹‹#P]]Íĉ™0áÒv÷W…=»Kˆ·'”œ,î@ ¿Xúöí{ÐuWMž D’¢ôïߟþýû·Ù&))‰+&Nl³\’$zöìIÏž=Y¿Éhä7ÍcÈö¸òŠ+¹¿N§ãœ#8gĈƒŽ‹!b¥~î¹çpùo~ÓjÛKš#ˆ„<¸ì²ËÚ=žaÆ1lذ=ÿ?©„X¿¡˜úº:ŒFCςՃ^¯GQ4U£¶®žòòjÐö—ñÝwßS^QÎM7ÞHzz:áp˜}ûöa4"ÐÐ"–þüû™g)))!+3“[n¹™Î;SWWǼ÷ßgÙ÷ËÈÈÌdæŒéôîÝ›ÅÅ<÷ìsTWW3¸p0WMžLrr2¼òÊ«lÙº•ÓúõeöìÙFžyæYÎ?,]ºtàå¹s9ëÌ3IHHà‘G%-=5kÖðܳÏÐØØÈËsçÒ­[Wî¼ãŽèë•+Wò§?ÿ™É“&3`@q£ ‚SKú¥a±X˜1s&É))<ùäS”––RV¶—’’ÝÑ‚Éd"99‹%ÃÈd21uê¼^/¯½þ:õõõ¬[·MÓ$ ³ÙLvv6·ßvÇ ;®4Ÿ#GžÃ‚ Ø´y3.—+šb¾ÅOýÜ1cøæ›oX´ès¼^/›6mB¯×Ë•W^É[o½Õ¦ÌøøxþöÀ„Ba–.]5ɘìê£>õÃáˆc´ÅÚÚ]_]UICC=½ úà÷û;4åýê•+èÑ«›Š-@ð‹¦el| V«…Ë/»(šœE’$ =¿ßÝ.!!‡ÊŠªVû®\µ’aÆ‘••…$IèõzºýÈu`Μ'ùÍo.#33“¯¿ù†'Ÿ|ŠÇŒ¯¿þš=»÷pß}÷áv7±cÇz÷îÍ#<ʈáÃ:ô,ŠŠŠhhhÀjµòü /•™ÅƒWMæ½÷æñâ‹/qË-7³uÛV†=+ZßÎ;éÕ«&“‰%K—pß½÷1}ÚTâââˆåÚk®áïÿ;>¯[o½…7ñÄO0`à@®¼ò ÑQÁ¯ýÉ~€³™ËóFÅÿ-býúõTWW£„“)èUÀ°ag“ŸŸÝ'..Ž;#±cÏã³ÿþ—Ý%»ñù}ÄÄØ8ýôÓ3z4;wnõ2ì–ß±cÇpZ¿~­Ú]wàë³oß¾<ñÄãÌ›÷>¥¥¥C‘ Ñ‰‰ @Älø‘‡æÌ3ÏdùË …Bdfe2vìX232¨kþ´¨RSSyö™gøþûïùî»ïØ»o/Á`ˆœì,†ž}6öø¶Ákkj…‚‘—zL õuuddfµy᫪ŠÒü²ßºy#ýÂãv#Ë2–v„ ¡PUSOš¾W[SMJjšxÊ@ 8)…¡7ª8U‡ÜW’@’e4M‹–ãóú°Z,í–«iZÔºè÷ü­[¶²eËâãâYUT„¦iØívTMcõšÕäwëÆ¨Q£Ð4¼¼\öîÛˆ )(( 77ÇÃ?,çÚk®aûöäææòáGróÍ7EëiiG‹¥’¦iôìÙ“ñãÇE?ŒF,±ÎæOú¼ÿ~Þò&V«•É“&ñ»ßÍÆd2µ{<@p,ÏX! u Lž4‰É“&Ñö’$Ñ·oßCš(È'¶kŠ Ð³GÞ~ëÍv×õîÝ›¿þµ÷AËçê™3¹zæÌ6ëV&Db5’Q£F¶Y×âw ëV¯"#+»Õ²ôŒÌCZõ8€ò}{1šLtêÜEÜÁ°vuç]0^œ@ 'ífÚÕ4TU9¢ ¦©(ª‚¢D¶OKKcÏž=¶ÉT¦ª*ª¦¢( /½øN—³ÉŒ¢(ÔÕÕ¡( ƒ B§Ó³qãæ½ÿ>§vS®ºŠë®½–%K–²aã¾ZòW_}5éé8N6nÚ×tÑ…EÛ …P”HÛB¡PäèªbÐ0 ÑíZùyyèt:jjªí¬õ’:rè Î..äcoï@Hh(ÖÖ6ȲLA~™é—6þmñòöA¡P|p?.®näçaÐë©(/gwÒ/øµñ§m`W‹‹9Ÿv½N‡§·7þþ¨ÿ@Ž*@ ‚[IÃ/Ú22ƒþwTp­Žð邸ùµ¡k×®TTTðófì˜1¦ÄÕ²,³ã;xõÕW‰ŠŒä—ÄDâV¯6´¦PÀÃ?ÂÚøµ=r”ûï»»vÑ­[7z÷îżyóÉ»œG[úôéC—˜Î <˜¢¢"8€,˸»»³oï>ÂÃÂ8qâÇŸ`ü¸q¦Ä×M}ÅïÑ£¼?W<==„§@ øC´¤( &Ô¡ÕÖ ÕjM@II —.áããKÛ€@ òóMËçç]ÆÁÁ‘Ö~mhH§ãÈW¯“~éÞ>¾·ãrnW®‡]ÍÍÉF«ÕÙ¡#Î.棪ª’ çSqpp "²ÅE…dgfpæä œ]]ˆˆŒB­ÖPSSm±~^n.•DDuÀÍ݃ӧNàéåMT‡N8»¸zö,’$QYYIvfžž^µ#'+“+Æý»œ›CEE¡a(• RϦP\TDfú%ZûµÁ¯M[2Ó/QTh éËÍÎF§3î[t—®ØÚÙÝ¥«Éëäñ£xyû…$Ièô:Ñé@ Ü–4*|È¿5üA®7 eÖÌYÄÇÇ3aâfΚIII J¥Zµ1|ë±Çã½÷æqßýÓ8zäÎNNØØØ°yËVî0];w™òû8;93÷µ×xü‰'ñôô << ;;;~ø!~ILdâ¤Iüýï¯ââbLå0yòdNŸ9øqãùþ‡pqqA¥V£T*±³o:m‚R©$$$OO1x‹@ ¸ýC{v&™ýî7p0åeeØØÚàÓª5J¥’Àà`ÊËÊL˨T*¬¬¬±²¶6ÄPrµY–Q*• T*5%W‹ñôòÆJcEpHûëŽæVUUEyYž^ÞT×TãàèDA~mÚ`ckKuUxxzboo™$[©RÒ>4Ü´¨Ž(-)¥ªª ;;;.¤ž3=´ø´j¯/ ¥’ªÊ ¯\ÁÓË•ZEû0c¢A;{{v'ý€Ò’«89»àåc)¤¢¢Œ«W‹q÷ðÄÊÊŠàv×öM©TšµÏÖÖŽÊŠ 4 >¾­°±±N ÁíK#C²,£R5õœWçuc “ë A¯T(èÉÇ}h±Ö 4p È2ãÇŽeüر¦yo¼þ:È2Aüûí·,Ú7 ?ô·-",Œ÷çͳX>¤]0Ÿ}úI£­_ðÉ'û,7 J&¸ ¼ëîÆoø …É•M¥Týú3‚$S^ZÊeUŽi=çÚ¯0(×…gž]‚ IDATê¶YYYIÞå\SRmÚ$Ρaädg‘Ÿ—GNv!íÃprnèyd¾‹çÏS^^†R©D–d*«®Š¡T*M'\]Ä:TµÛV*•HÒ5÷aE={( $ƒô›ö-"ªÙÙY\¾œ‹!+“ˆÈ8a·@ Á­¢¡Dboç@òá“(~eYY’ÐÖèQ«Õ™E §%ƒÉ„0$¸.6¶¶äå]¦¬´kk²³2-†“W(•èõzdIB¡Tbïà€‹›A8:9S\TˆR¥úÍÛ´²²ÆÃÓ¿6þ¸{xR^VFU­˜s¥ ßVø´jÅÉcǨªªlD2';+“ðÈ(ÜÜ=¸ROvV¦iÞ•‚|ÊÊJ±²²¢èÊÜ<Œî¿ƒDfF:~þm¹œ“c­›²­¹ÙY”—•¡T*¸Z|_ßF·«T)ÑjµXY“äÓ¦?z½žcG’ÑjµB@p{"ËÞ3cF¥¸¸è7­Þ©ƒ=®®®ÂG £…s aH½b¶oÝl¦J:WJ]K8’|…R‰­­É[¦Î›ÇÅÕ•³§OréBC†Ýƒ›»ÕÕÕœ>¾$îø™€  BÚ‡°oÏ. ^Þ>ØÚ‰P2@ ·'æ‚jŸ¹‚ƒàß]@ ÌQ´ðö„0$à®a#,Ê W¯sêtèc6O«­aHí:žž^xlš§R©hãß–6þm-êÒÈvêèÞ«éß^Þ>xyûX,ãÛª5¾­Z_w_n£a[:wévm;>>„…GZÔ¡T©ˆ®M¦mv¨5´ ¥]­Ðu½íFuŒ&ªc´é·ÛüÛˆÎ&àö§!@ 4ã5¶ Iô:—.žot^p»¬¬¬…‘@ @ ¸iaH«3pòb>)—®P­Õ·øN(àêdG¯(?¼\íÅQm&¬mlèÒ­Ç»nîîMæ'Šˆê :€@ AȲü‡¦Áï¾Æ¶ðöÔÍÑàãçóøåX¾¾>89Y·tž$d KËX³ã„âíá,z’àWqpplrž_a @ ‚ë¼YH î þ¸0$ÉlÙw‰öaØßÂdºîÖödëdöžÌbHåŸÿ †” %VVVhjG­jIÊÊÊ$Iœ*++…@ 4:É`†‚›€••5ªß1²÷¥Y<†ŠJÊ©¬ª4 )~«¨ÖÖS–Gú¥Ûà&¥0Ž@§Vih„µuËåëqqqáÂùóâlû‹áéå)Œ  YÈÌÈ ²²BB n>¾­ð­1»%h–CN¶Jz·wâV;”få(¸âLhxjµºåÇxû=È ÕjÉÎÊ$;3Ã4{Kà׺5´n-Î6@ Á áææ†ƒƒƒéwNvÁíZô ·@ Ü.”–”p¥ €œœlªkj]F;{;|}|Ѩ5-Ú¾f†\¬éÕ¡í-3Nq¸LRQ!z½½^w[t/ooN;Ú¢Â@ @ðGðôò6û]xå AíÐh4Â8@Ѐ i©¤¤¤Õ77 ²,!Ë2ƒÁô7;+“¢"üZ´}Í" ©”µ èny^¥âö!A©TbЋøl@ @ îDÒÒÒð÷oKÇNA–‘$ I’0ôhµZ£8$IØÙÚr8ù™™¸»{´XûšER+kE¡[,È(Q*¸ ‡Îc:@ @p'¢Óë B©Tš÷×馿€••¾­ZQ^Ѳ9Üþ°0¤T %é7 2_.\ÈŒ§Ÿnþ½‘ÂmK @ ÁŸY¦Ñlååå!¸ …²Å}G”ÍQ‰º.”¬Áß,]ʱãÇ-Ê;uêhQVÿ¿ç_xI–®»Lcÿ)Qb %»USII ~øÑï[Oœ'@ @ ü%e™ÜœlNŸ>ÞØÙÛÛd™‚+WصkWhÛÖŸÝ»ãââ"Î@ @ þ‚ØÛ;Ò> •J…Á ÇÑÑ J%z½þ–´©ùr É2Rƒ©n ²†å`üÛ­k7”J%¯¿þ±±Ëqvv®·Þµå''“°aO=5yóæ“˜˜ˆV«m´^¥òÚÐouõòùØÚÚÉÓ¦ñãÛ$‰ÔÔ4âÖ¬A©T Ë26nâRz:­[µÂÆÚš€€$‰Åß|€¯))çHH؈$IìÚ½›ó.ÔŽÎft[½z .\ÄÇLJì¬l222,Ú&e @ @ð×@£Ñ ÑhÌZT*U­¦qkh6!£.cJfŒ«’)– cΜg©¨¨ >~+W®äo/½„B¡@’$T ŽNŽ<üÐC ÕjÞB êU Y²PÙ$I 7˜•·iãÇå¼ËèõzöîÛ‡—§ @’eV®ŒãÜÙsôéÓ'g'†Ü5½^σ<€­J¥²Ö‹éßLš4Á¸ ƒ½N‡\Û†üü|<<<艭­¶¶¶·L@ @pkø3§!n¶CM…Œ8q¥êšcRDDDYسg©©©R]S³“3 HBBQQQ´oÂÃ=ÄÆM›6t(‡’“ynγ8::šmK1ÇPC/dsÌL<ÜÝ‘$‰’’6mÞÌŽÿý P@·®]L ^ýõ~þég"<ðòò0æu ‰n]»Ð­kÓo…î¾û.î¾û.‹eë£P…!I²ô\Z¸ðkÜÜÜPk4ØÚØÐ¦ƒB’dºwïΖ­[ùì?_`$ÜÝ\=z..®øúúòÏ7ßb„{éÖµ+11Y¾âl¬­puuà IHÒµ|Jr]%I&7÷2kã×SQQŽmýÛ6Ú6@ @ w.íƒÐXÛbd £ŽP­Õ›~j#j*K]‹¶í¦z µ4 ŒÂPÃQÉžxâqJ®– P“:ÙÚÚâêꊵµ5²,ãææÆ¸±c),,BoÐãèà€››*•Š_xžÒ’R<½<‘e™'ŸxœÂ¢"eœœœ?~²,sßÔ)ØØØbccÍ?^›‹,ËôèÑ   ´Z-ŽŽŽ¸¹¹Z´ h|Ð6@ @ w :C$a0ÈhõÆ¿ÉXv«òýqaHq-Çâ+ÊÚC ÅO<=<,–¯¿œ½½=öööóë¯+Ë2NNN899™–qww3‰Kuøúú"Ë2ÖÖÖøùµnr›@ @ ·’?, )¨ç1t«÷FѸÇ@ @ À’f®þÏ€B*…1É´@ @ àú4‹0¤T(þ;£ÀØá1$@ @ð먛«¢?‹c0¨®®¾­‚$(/+½Q @pSQ(•XYY¡Ñh„1@4“0$×ûÿ­ÄÆÆ77wäÛlHx/o²23Do@ ÜT J•’¶AXYY ƒ ™BÉ”J4+ †ª[º3NNtéÖCU@  22ÚšRÏ¥“E@`0Š@ š/”ìOq³“$´ÚqT@ ‚FP(øøørüØ1! ¸Ã„!@ @p}Tj5z®E·YPP@EEÅïk§J…F£ÁÞÞ;;;T*՟Ɔ555TTTPSSƒN§C’$ …©Í666ØÛÛ£V‹×­;…¢¢"JKKwV«Õ¦>ÜÒý¡ªªŠ¼¼¼f«ÏÏÏOôé;qT@ ÁMå™gž!..î·¿¤¨Õ8::Ò¶m[ºwïÎ!Cèß¿?^^^(náˆÈ¥¥¥œ>}š;w²sçNÎ;Gnn.¨T*\]]ñ÷÷'<<œÞ½{A`` ¾¾¾*aëfqâÄ ÒÒÒÌÊzõê…Ïm¿oo½õŸ~úéo^^¥RáèèH«V­L}xÀ€´jÕ ¥RÙ"mNLLdĈÍVßÅ‹ ´;! @ ‚›ÊäÉ“‰ŠŠ"##ƒÅ‹›Í‹‰‰aܸqȲLUU¹¹¹$''söìYŽ=ÊÑ£GY»v-“&Mâ­·ÞÂÓÓ³ÅÛ/Ë2iii,]º”øøxRSSÑh4DDD0yòd“ð‘——ÇáÇY¹r%+V¬ÀÏÏ.]ºðþûïtç‡î}ûí·|ôÑGfe7ndÔ¨Q·ý¾1wwwŠŠŠøä“OÌæ…„„ðàƒ"Ë2Z­–ÜÜ\Ž=Ê©S§8}ú4§OŸfݺuŒ7Ž7ß|³ÅÅ•ºó¯!o¼ñ†Ùož}öY‹å~ùåvìØ!.dw0B@ 7• &0aÂvíÚe! EGGóúë¯#Ë2:Ž’’.^¼È»ï¾ËÆ1 òí·ßÉ3Ï<ÓâíOKKãÙgŸ%))‰ÊÊJlll˜>}:?ü0mÛ¶ÅÉÉ €²²2233ùþûï™?>éé餧§óÒK/ý%„¡;™aÆ1lØ0ÒÒÒ,„¡víÚ™ú°Á` ¤¤„ôôt>ùäââ⨩©¡¤¤„•+WÀ믿ޢd&L`òäÉfe²,[Cnnn¼þúëÖ!„¡;››. Ø·—ŠŠr(„µ@ ‚@’$|[µ"<2ê¶i³B¡ÀÊÊ OOO<<Ë—/7[÷µ×^#%%…µk×ZÔÛµkWâââX´h›6m"55ÕèIéëK¿~ýxùå—¯+ª aèæèBÈȸI’IÏ-æ|æjtzqô^è;[k¢Úùàáb/ "@ðE–oïö×ÔÔKee¥™¨qß}÷™~Ïš5‹2cÆ 3O GGG}ôQúôéCÏž=MÞG¯½öŸ|ò ööö¼ñÆ„……ýj;:d᥃µµõ¯®ëääÄÌ™3éׯŸ™g’$IÄÅÅñÞ{ïqòäI ‘‘‘Ì™3’““‰‹‹cóæÍ$%%‘˜˜Èk¯½Ftt4 …‚þýû³jÕ*þõ¯qúôéF·=nÜ8‚ƒƒ™3g—/_n²o¿ý6ÇçùçŸ7+ÏÎÎfþüù¬ZµŠªª*Sù… ¸té²,óÉ'Ÿààà@›6mXµjß}÷›7o6«ë•W^!&&ÀdskkkV­ZÅ?þÈÒ¥K-Ä­7ß|“øøx3ËÕÕ•Ï?ÿœuëÖ±víZ³y;wæé§Ÿ& [[[ž}öY”J%6là‘G¡oß¾¦ö¶:Žøøx3o…BÁ¤I“L¡]Ó¦M#**ŠçŸž¢¢"Ór†Gy„!C†ƒJ¥ÂßߟþóŸ,X°€ÒÒRÞÿ}[d_$IbýúõÌ›7ääd aaaLŸ>¶mÛrôèQâââØ¶m»ví"11‘¹sçÒ½{w<==Y¸p!Ë–-cïÞ½¦:U*3gÎdäÈ‘¦mìܹ“ÂÂBÀ˜×ëÔ©SÄÄÄ`ooÏ3Ï>žÒÒRÔj5¶¶¶Ü{ï½Ìž=ÛÔ:uêD‡HJJbÉ’%fõ]½z•1cÆ`cc€‹‹ ­[·¦¬¬Œ)S¦0yòäö^–eyë­·8~ü8²,ÓªU+Þ|óMÆŒƒµµ5ãÇÇÙÙ™>ø€òòr¶lÙ‚^¯gÁ‚ó裒™™ÉÁƒMÞ_’$accCŸ>}Œï\YY9r„êêjJJJ8pàcÆŒÁÅÅ…=zPZZŠ$IŒ=š)S¦˜Úi! egg“ššÊÊ•+qwwçÅ_4yÇɲÌÎ;Ù¾};'N7–†nä³…Ao…dãúeåÕ¨Õ*¼ÝD<`8Ù[söâec¬§J^§C’$dI†?èµuôØ1¢;uúËÙT§Õû¯Önm],´°áÛP+lø‡nA’d´¡,l(þ ÷]-·Ó£rlll“!a 0€|»ï¾;;; aæÌ™ìرƒŠŠ “Д””ÄèÛ·/`ôøïÿ‹B¡øÍ¢PÝzu/ªu8;;ßð y^^K—.åÌ™3¦²ž={ÒµkW“’““ãÇgùòådgg£ÓéHHH`èС<ýôÓ-òÀœ9sèׯƒY³fñä“Ošæ_¹r…äääë†Ý(………¬X±‚»ï¾…B§§'‡"++ …BÁ€èÞ½;&¯¡ÂÂB¾þúk.\hªçÈ‘#8p€Ç{ŒŽ;ÞT{mß¾GGÇÆßÏœœ0`÷ß?#GŽ´XN©T2sæLâââ(++3‰&äÿû#FŒ ´´”;vPUUÅ”)SZDª³íwß}DZcÇLe111ôêÕËäåèèȨQ£X¾|9iiièõz¶nÝÊúõë™3gVVVôêÕ‹6mÚ˜r*ɲÌÖ­[™5k;vŒ“'OZRÙÙÙ¸¸¸ ×ëÙ½{7—/_6…šÂËË‹gŸ}Öd¿W^y…±cÇšæWTT°k×.! µ¤0$scC22 ÈÈȲŒ$ÿÖM‚¦^€êÙªž-ËËPJJ ZŽŽÄ[>ýô öîÙý×µëo°ß… (*.¦k—.¢#Þ  ×¹ þQóÝðýH 7ˆˆ† ‚,ËÔÔÔP\\Ì… 8}ú4EEEìÝ»—êêj222˜}z‹C>>>&O'¥R‰ŸŸŸÙüšš³|MÍÉ€ˆŠŠ2í§ŸŸ=ô)$ËÉɉqãÆ±}ûv3o®øøxÞxã Zµj…,Ë,_¾gggFŽù›<¼þŒ3Y–ÑétséÒ%N:EYY ¦¦†ììl&Nœˆ¿¿¿Ùq føðá¬^½ÚT–““ÃO?ýD¿~ýppp ;;›Ÿ~ú‰»îº ÿ;?ÓÓÓ9xð Y™···E®&³DÛ²,³iÓ&ž~úiÔj5111˜BëÞ=Ïœ9ƒ··7GµÛLPP™^S¸¸¸Ð¹sg³öÕG§Ó]7ÌRC7 éF„!¹Öa¨VªËT$É2’$qæÔI¶oÛJ^Þe¼}|3v<ÁíBn¨}KÅø “qqu½¡õ·nÞH@`á‘ó.^8ϱ#‡7aΗœì,T*5...´ cøÈQ8886ë Œlfó†bÚ›o¾i‘½Ýϯ S§NASkãwÞyÇ"iô|¡’›Ø÷œœÞ~ûmÓož|ò)4«ßl§ÌÌL~ùå|ðÁFçÏû½zõbôèQfÈãÇO0qâ„ÛΖ írüøq233M±Å7ʆ  jtÄ…´´4–.ý–˜fvY¹rÝ»w3Kœx;ôÆÆúVII ›7oáСƒh4VôéÓ›!C†X|Uý£|ôÑGÌš5ë7åUøÓYN–¯kâ¢"V­ZŹs©ØÙÙ1pà tÓ$›ƒÆ®Õà¯Îíõ¼Ö³gO>ýôS´Z-%%%ddd°}ûvÞ{ï=rrrÈÉÉaçÎ;vŒ ˜Ýã¼½½¹çž{HLL4y UWW³mÛ6&OžŒ¿¿?{÷°aÆý®û£ƒƒVVVf#AUUU!IÒ ylm±†÷V‹{P]OK`kkk« …)$¯ƒÁ`–ש9 3Ê4 ³fÍ2[føðá´k׎C‡™Ê ùá‡xñÅIOO'11‘víÚ™F¼º™„‡‡›ú°N§£¤¤„¬¬,vìØÁ|@nn.Û·ogÏž=ìÝ»—Å‹›í£ƒƒ&L`Û¶m”––šÎ…ÄÄDΞ=KçÎÙ¿?YYYÌž=ww÷;?‹‹‹ÉÈÈ0+³··7y Õáììl1âÛÉ“'M¡cÞÞÞtíÚ•Ý»w›úŽ^¯'!!ÈÈHöíÛg1úœV«eÛ¶mŒ3†‹/rìØ1¦Nú›Îakkk3;5ìÃuB´Àˆ²Å¶TŠó{&Ó'rãúrÝ_Iâ\Ê>ýȘpkòÔû cû[%É4I’Á`YÖȼI‰”••š•IMÔÑXÝÇ%;+³Ñeóó.s8ù²$±ýÇ-<öÄt|øQúöHzú%æ¾ü"W‹Š,Ö»Ñ ÚÑÒþ÷Ýw3fÌÀÓÓ‹6~mŒ±Ö“&Dûöí‘%‰M›6ë¬<êÕaÚæÛÛi¢qs¥à 3fÌ`ÆŒL›6 ÿ6~DEEšÛG’,mV[Vxå {öì5[¦þ´~Ý:’’’8uò¤©ìrîe’j²ÎÆÊëæý–e[Ò†™Ưf¬Ód[ëÍ«+;räYYY¶?//Í›7±uë\-.6•ˆ8À¡C‡¸zõ* ¦|.¿GÐñóó³nüòåË7œ¯®¦¦Æ,¡6Ãáê’×·CÃvÖ%åm T*Õ¯~¹Y"•›››™·Tc¸ººrÿý÷›€”$Ö¬YCAA;vì ==‰'6âu³Ðh4xxxÍÌ™3™={¶i^yy9 ¬X±ÂÂÞ111tïÞÝBXÙ³gUUU|ÿý÷„„„еk×ýpUSSc\¯×g5EŸ-..6õ¥RÉСC-Χ͛7sñâEöíÛGŸ>},D¯-[¶PZZÊáÇ)))aÀ€¿é#¥B¡0ªó´^äõŽiK}µ¸¡P²ÚuLÞ.²Œ,$Á’Å_3í¡ÇèÛou©o$ ¯ðÕ—ŸqðÀ>˜”•ß/gÃúx–|½å+ã\¤j½ž$aá×nZ}úà«…ÿá‡ï—óÔÓÏ4Ÿ'™‡Ü5ôj_;|àžÝ{°µ³¥Cítyl,ååœ8y‚ÔÔTúõïÏô§žâ¨}Ö)++㇕+Ù¸q½žÑ£G1mÚ´;7£{!<²,ãââb²Àú„Φœåå—ÿFç˜. >ŒÃɇyå•WÈËÏcùòåèt:ºuíÆsÏ?Çã?AÁ•+ô;qœÏÿó9;š‡ð9»¸0zÔHâã×áî·wmˆ ñxîÛ·E‹sñâ%xúéé >œ¸¸8Ö¬Y‹½ƒéÓ»WO8ȹÔTBÛ‡ðÜsÏÚžœœþýÎ;œ;—Š‹‹3³gϦ¿~7Á„r£6l,4ôÔ©Ó|Ë¡C‡°¶¶bÊä)Lš4‘êêj>]°€½{÷¡Ñ¨™|»’ÿ{ïddΟOeô¸ ¬\»·þ=cÇŽ“M^þe¶mÛÂÃ?É·ßÇDï¾ý˜rßüóíw‰]¹¶Ñ6] „³œÓ³goRSÏ5±Þïÿ¯1!¨ISÏ £Ö+KFæ?Ÿ}FHHI‰‰L›6ÍL`JLLäÒ¥Küç?ŸñÅŸ“•eŒ÷¼‘c|[L lZ_¨<áË–}Dzeß±6>ÞhÎÚþªP(èÞ­6$0hÐ@b¿‹eöìÙ¬Z¹’¡CïF¥T²xÉbF޼‡¤ÄD:tˆ²Ø†B¡ sçÎxzyñóÿKuuum¾(c{ŽŸ8Á?þñ¶lÞÌ«¯þV®¬½(ƒR¥ä•—ÿFüÚµøû·áÇ·1ë™Y$¬_GhX[¶nA–e¾ür!1cX»v 3fÌ`é7KMñôÍ5aêj mÛxÿr˜¬¬,òóó9uêóçÏ#66¶6!ezðAæÏ{õë×5zœÔ Ó¦ÝϾ}û9}út½ë‹Lee%2ðŸÏ>cËæÍ 8€eßÅšÚçääÄŠå±,üò :H~~Ë–}Ë×_}ÅÙ³gÉÈÈ$//Ÿ 6òøã³!a=a¡a,_¾¢ymXO\«?eçäÐÊ׋yùùùlÙ²…9sže]|<žžž¬X±Âlÿë_ ê®*¥’'žxœÍ›6Ò¯__V¯^ͳ³gÓ©SG~üq+oýë_&ûøøø°fÍj¾Y²˜üü|Μ9ƒ^¯'içNÚâååõ§9—ëÞ––_¸xȈ”J¥Å¼3)):tˆ½õ/¾_±œŠŠ ¶lÙbª/$$„U«Vòáïóý?àååÅ÷+–óñG²yËVSÿR)•<7çYÖ¯#<,Œ 7òä“O°aC111$$$ÏÇ… ‰ŒŒ`íšÕ<ûì³üðýF7gÔ*/½ôë×ÅÄöíÛyû­·L×êgžyY–ùöÛeÌš5“Uq«¸çžî—˜Ä$¦;{º“h2R÷‘²!*•ŠQ£FYäÂÙ»w/~ø!ôéÓçw{ZDDDЯ_?3¤$3¡¨)®^½Ê?ÿùOºtéÂÌ™3Ñëõ¸»»ãããc¶\EE…EHKii©)§ŽÈÈH³↡1€Y¢ì¢¢"‹:î$y衇ÌlrõêU-Zľ}û˜0aB‹{ ý–>\w|-^Ì•J DXX˜Yù‘#GxçwðòòbÈ!¿*H67u£¡Õ§²²Ò"){YY:ά,,,ÌìÜQ«ÕŒ=ÚlƒÁÀîÝ»‰ˆˆ ::ºÑ„æK—.åÈ‘#tëÖ­Ù?¼ jMK}¶¸wKI2 Bd0˜TIƒ$¡Óe½Á€NoYïÙ”3ŒŸ8k[Â#£P©Tcïà@›¶tèJ¥&:¦+›7%\«O­¾.ÝzðóöIX¿VËáäƒL.FMM Z­–ŽÑ1XYÙлïtúÚ¶5уÁ–fÜˤkó›K„3  Sœ¦Á`hôAAªÝvÝñ1û][O½Š1 ¤¦¦qüØq>þøcN:E‡Qwìвd|n¸ƒ½^OE¥ÑµR©Râ`o,ídccÍÝwßJ¥Â`00jÔH¶mÛFRb}úôÆÊʪ6ôPnÚv²Œ Cï¢E‹ 5†1ÊÆc4tèPÖ®YK^^Z–ƒ¡«‰®[·n“2Fs_µ A©TÆ®]»1 ìÚµ‹¼ü|N>N«eÏÞ½èõúfé N^k¸Ÿ’Á¼ÿÕѳWO¶nÙÂêÕ«Ñjµ8p‡,Ã××—ˆð–-[†³“3&N0»64fGƒAB–%<<½Ñü”7»´mÛ¶ÑeÃÂÂèׯÇ7½^ÏÁƒ¹ë®»Z$_RCÚ´iC—.]HMM½ö|TP@qq±™è•mÖß #FŒ°û=z4ï¾û®™ˆdeeEÇŽiÓ¦ cÇŽå7Þ0{v9tèÞÞÞtîܹÙsh ZP’‘oH­6HšÚ¿z½¾vØu ƒ^GPP;Ž>D÷ž½½ UWUbÐ먩®®õ~0æR³YcÐë@–‘ ÆúŒ/Ezc9ðÊe ÃÀw¡T*È̸„^¯3*´²LMuêzêg]>¢ºõ rí6ed‹eöïÝM`Pp£ëþaH¯¿–ì·îåÙòeɘȻîøÔ½ éõzäÚ Qýg £`  {÷nôï?•JÉ„{ï%((èŽý"QçMÑpÿ ‰ví‚yìÑGMe›6o®gOjµÚ´ÞÔ©SÉÈÈ ==øøu‹ÜôùQgs___FÅ’%K=j²d\gÞ¼ytŽîLtt422II;Í\;¯s…ÉkÀø"i|QÖëõØØÚ0fô(œ˜|ø {„‡‡3oÞ,5Õ04Ç8-\øEEÅØÚÚ¡ÓëÑ h4´Z-GŽ1†œ4êW÷ïèèNôëÛ¯¾þÚ´â¢bìíí°³³åè‘£_VµAÛ,Ûjü}ßÔ©ü’˜hzéܾ}{³‡’Éõ„†Saa!çRSMSAA¥%¥¨5jœœœ8þéééÈ’1‘ô?ü@V‹­­-µ6sqv!55ÔÔÔ&Ãë¾6ŒêšcÒoYF¯ÓQYQ³³J¥’Ä_Mç@ÃchÊUûÛÍÍÈÈHΞ=‹ ………ìÙ³§EÂñzõêEii‹/æè±cý”Kéé8;;ãææÆÊU«8tèß,ù†»‡Ü,ËDuˆbÅ÷+8vì8?ü°’'Ž›®µæÛ¹ÖϽ½½Ù·o?9¹¹ÚÃÎÎŽ‰“&òÓÏ?sÏ=#°µµýÓ…VÈ„ã9’'Oò]l,ÇŽgï¾}¼óî{”••ѦMÊJËØ°q#{÷îcëÖéÑ£Gýƒëþ¾ÞùX÷{ÚÓØ±c‡1–,óßÿþ­VkÖßö?OOOöìÙK~A²,óÕW_SXTˆ­-z½Á$rŠILbú …’ý u¡œœRRRLžõ)))1 [}èÐ!âããyñÅéß¿¿i˜l¥R‰››Ï?ÿ<÷ÜsO“ÛéÛ·/ýû÷·ø0~üø?$@Œ;–¸¸8Œ““¹¹¹LŸ>ñãÇóí·ßrðàANœ8Á¶mÛxå•WèÛ·/gΜaøðá¼ýöÛ¦¡²U*Ó¦Mã•W^Á××…BÁ™3gxá…X¿~=ÉÉÉ|üñÇ|òÉ'”––beeE¯^½˜?>¡ Dþû€³²E‹áããC÷îÝqttl4/QJJŠi˜îôôt.\¸`±Lyy9)))”••qþüy‹Q©À˜X8%%Å,¤(::Ú"TnÓ¦M$%%ñÍ7ßЩS'‘$‰””‹Q’ÁèA•’’Òh»âîîÎÈ‘#Í kkkF¯¯¯E{ë>°xyyýn¡ðzíª¨¨0õá#GްaÃ^}õU ÄÖ­[M}ØÅÅ…3f4) tíÚ•¡C‡š•¹¹¹ñÀ4˹XwÜRRR,æiµZÓ¼º„Ó*•Š &0wî\üýýQ(¤¥¥ñòË/ÇáÇùÏþÃ|@QQ†®]»òî»ïÒ©S' ol{{{î½÷^³rÓy«V«™:uª…`ÓhÞÊììl3o¦:ª««IIIáêÕ«¿ÚÏËËËÿòÂP‹…’ÝPòišÎ«Ñ®}(O<9“Ÿ¶oeÇÏÛðñõeäèñȲL¿ƒ¨©©fÕ+pswgüÄ)xxzùDwîbj‹-]ºvG–eÆO˜Â†ukH¿t§fÌfÒÔX¿6ŽØ¥‹ c؈Q899ãìâ„ISÙ´a«~XΈ{F#Ë2}û$aݾûv1oüë³ýpus#"˜?¦O¿|¾àcT*NÎÆáêßxëaš/&Ü4Š›¥¨Ñ  @4VV¦yþmý£É2<ð±Ëc9r$Ç cРAȲLÇ 6nÜDñÕbb:Çàïïgu¿ö‚W'''ºtébVÞªö/˲É^u 8€Õ«× Õj3z4~­[£Õjé݉¯-æ…çŸ#88Øl ë1b8)))´k×Y–ùÛßþÆwß}GbÒNºÄÄ0nÜX mÚøáì|­Oùúþ?{wU}.~üsfÍ>ÙwHB „°D@ PA-( j{µÕª¿Zí¦í­^Ë­mµí½VÀÜXET¬^6¡Evd•-@ÈFöL2ûœóûc’!‹UÂâó~½0ž9ËœyÎ÷œ9ç™ï’p.aÄÆÆÐ;»š¦1yòdTUåwßÅh41vÌè?ï·ÂvÛŒO º¦†_ü£ÿµïìY³X²t)óç/ gVO&Mºðp aaa$''ñÎÛïÀS?{MÓÈËËcÙòeÌ_°€y¿ÿ}»†>99þ÷ŽŒŒ`t^eeeDFDË”©Søè£ÑëõŒ9‚’_âãÆoô'7Ü0€ÐÐPÿt¿~ý'<<œßÿ>«WÈü IJJ⎩S¾õsB;O9|ôÑGX³f o¼þ:&“™¡Ã†IPP3gÎdÅŠ,ÞÿÆ ã–[Æ£i³gÍbñ[o±ðµ…ôîݛɓ'ŒN§Ð·oÿû„……‘››‹¦i̽oK—-#¿ Ÿ<ø C‡ Ål6·Ú§ÚÚ:ÆŽCïÞ½¯ªkBÛ>†ÚÞl=óë_³téR^[øAÁÁÜ|³oÄ‹””î¼s:¬^ÍÖ­Û˜xë­ 6´ãs|äHÿùï{8ñõe‘p.YÄÄÆ’Ý¢LFÒ§)æ·MœˆÛåâ½÷– 77 ƒÁ@Rb&ã¹ku\\½²²Ð4îŸË»ï¾ËðáÙ>}yy£xoÉœN'ãÇ#-5UFÝB\q?þ8Ë–-ëpÞÊ•+Y¹re«DŒ^¯Çl6“@\\™™™Ü~ûíL:õ‚ÍÝ››mÙ²ÅßgÚ´ißx½^ψ#xë­·XµjŸ~ú)'Nœ`ûöí¬[·—Ë…¢(Ajj*cÇŽå¾ûîk—¼1<öØctíÚ•·Þz‹£GrèÐ!¦OŸŽ×ëÅd2a±XÈÍÍeøðáÜÿýv8ÇŸþô'žþ‡Nd™ IDATyŽ=J]]z½ž¸¸8òòòxꩧزeK«ÑÌ4M#++‹û￟… 2cÆ ¾øâ‹vÛÞ¸q#YYY¬ZµŠÇœÂÂÂvË,]º”¥K—²}ûvÿhZ#FŒ`æÌ™,]º”’’ìv;K–,áã?¦gÏž<ôÐC¤§§c·ÛÉÊÊê0ÖÏ?ÿ<Ï?ÿ<™™™;vì¢ÇfðàÁ 8ÒÒRTU%++‹^pèôôôtbcc¿Vxá…üCÒ·µyóæVŸ§eމ‰!>>žôôtn½õV¦M›ÖaÿP-×ýÁ~ÀÊ•+ýI·;ÕðößÄÛo¿Í£>Úá¼ÂÂBÿçøì³Ïü *ƒÁÀC=Djj* .äÈ‘#?~œ{î¹ÇWãÙd",,Œ¾}û2tèP|ðAú÷ïßá{˜L&† Ftt4èõz†ÚªÆÜ˜1cøÃþà¯5g±X3fL‡çþO~ò“V×–Ç;++‹ÿýßÿeñâÅlÛ¶­Ý2ëׯ'++‹Õ«W3iÒ¤ïô5Ziª5¤zÀü»ß>[ö³§ÔÐA§nç»ÙÞ¹}£ÇŽÃá°·›ÿ¯ÍŸssÞXêëë¾öÎYëë òÕ°p»(,­£´ÚNF—hùv½€­û ?8 “AOuU%1qñíû —þë@Y)iéØÚ Ó(.Ý™¢Ódçô¥®¶F‚ño*>SDVvõuµWí>žäää`2™p»Ý¼ôÒKŒqDD<ðÀ%}Ç¿òÊ+üò—¿¤¡¡Ù³góç?ÿ¹U ¯×ËÓO?ÍË/¿Œ¢(<ñÄüêW¿j7tú…lذ¡Uó§K)ÃDDDøËpddä%¨eµZý±æ£>bÔ¨QßJÙݳgëׯ¿èrÓ§Oo—ÔÔ4šš8À©S§¨©©Áív@TT”¿¹×ņ“¯¨¨`Íš5TTT Óé;v,}úôñϯ­­eåÊ•þNÞCCC™>}z»¡ìV¯^}ÁâØ±c9tè%%%ç]fÊ”)—}Ý«¶a¶Äƒ!¯·¹T ‡Ëƒ×«ù¦UÕתÃÕ@ªÅÍøÁéœ*,ä¹çžs¿ÿÁêZÀ¸ÐÔÕÀY ¨júWÝ4¯¡i9à\MÛðâûÍYmúÛYÃÕ³C-«Ï«š†ª©(ÈuŒ™ÚºÆzŽRq%,Å¿_2;®^ügøUÃU«>àÝ÷ÞeâÄÛHJJºêöóBÃÕ !Äõù½{uéÌ_ãccc™:u*;wîdÔ¨Qín¿ 111ÄÄÄ|£m(ŠBLLÌ7zà×ëõdgg“Ý4ÐH[K¬Ì˜1ã¢ï‘™™ùµö)$$¤]S¨¶ŒF#O>ùä·r,š›ú½òÊ+œ={–¼¼¼vÍĶlÙÂ'Ÿ|‚Ûí&;;›‰'~­¤@^^yyyR†ƒ‚‚¸÷Þ{Ù¼y3ƒn7RÙ7‘››Knnî¿ëÈÈHFŽùÏŸ9sæœw~xx8÷ßÿ%më|}޵$}]\'u>ýï=T7'šûè ðPV]o#Àd£×ú–`¾>¶5gÛZ‹fDâëÑétçú^ÿöM‹ê•2x=ÇpüøqÜ|óH‚ƒƒ¯Ê}Ô4½NߪI¥B\¿ß†ow‰«Xó(T!!!DDDø›ð„††b4™9s&R(®§çúzêêꈋ‹óצ óõÙ­[7Æ×jùÇó»ßýŽ#GŽÇO<ÁàÁƒ¯ªÏT\\ŒÉd"::EQP‹Å‚Á``Ê”)DGK‹qy]Õ5†‚š²¸Í=íG†Ð%6˜Seu¸<êu5ç·AQ Ðl ;- }Ó¨Ba–ðV#ˆ¯/2*Zšž|C±q ÔJ3²o$&6Žº«¸™ÙlöW¾:/ ‘Q\j3i!„¸¶¿wã©©©þN|VÇCJJ ·ß~;ûÛßHLL¤¢¢‚½{÷2hÐ rss/ØœK\{þò—¿ðÌ3ϰ|ùr&Mš„¦iìÙ³‡ÚÚZæÎÛ®¹‘^¯'$$„îÝ»óøãsß}÷]Rs®ÎÔ¯_?zöìÉ¢E‹HIIÁjµ²cÇz÷îÍ!CÎÛDSˆoK§V»ñ?*hš/‹¯s#MÓü'§Öáí|Ó_Brlɱa­æiþ¿¾ÿSÚ¾_‹÷9÷‚â_´sµ“Å¿ÅsÓÍKh-öGkñÉ”kµü<´Ø/Ú¬ÛòýiÓ4®Õ{øãÕ´\ÓtÇËpîÁ¬å¯í>5MkíÞOë`/ÛÆ¹eìÏE¦9 ZÍü”–ûÙæÐæØim"ÔúØ´ˆª¦´x¡õúJ‹ÿ¶ÝÿsïØþsvÿ¶ûíÛußK—VåMÁ_6::­Ëaûsƒ⎿L¶Øv‡Ë´ÿdç;Zeà¼ë·:ö´:Þ­KÂyÊ@‹sŠÎ :8ýëtx8ß¶=/|£´´½ðŸ+(ŠÖÁçiy}is­U“Öó]»ÚǶõ¾ó°iEé° v›ÖÛn}åê¸Ü7}¶¦rÙþÈv|í¤Íõµmùi·½VåºydœsçªÒîúÓú³·ßgZ”‘sÇç|×ÏŽŽYû/„ޝç­ÿ¿£#Ïy¯ëÚyÞ_iu¶¶Ü•Ö[Õ:¼Î¶\¿õµ¤uùo³ý¶×ÿv×­Åõ«åõêÜ|Z”óö×ÇÖ×WÎs]PÚ^k;8Û~÷·=î]×8ϹÑ6fÅ–®okí®¯\ô<¸ðõ¼í÷î¿{/t±kÜ )–ûïâ½ÐwíÔ-[¶ðÔSOÑ­[7Š‹‹Ùµk?úÑèÒ¥‹<ñ]‡4Mã¹çžc×®]¨ªÊöíÛéÒ¥ ßÿþ÷Û-›™™É¯ýk:tèU—jvàÀžzê)zôèAuu5›7oæÞ{ïýV›‘ qEC;·}Ûí–h !„BÑ \.'Køuÿ9u:sçÎeÇŽ¬^½·ÛM¯^½xðÁ™6mÚE;Áמrë­·²gÏ^|ñEÂÃÃ1bO<ñD‡#)Šòo÷©ÓYfÍšÅúõëùì³ÏøðÃIMMeîܹ̙3‡   9èâ²ë”ÄÐ¥áxÑ¡y\hšÚâ$Õ¡L(ŠTïB!„âÛbV­ ±\ÿ#Òêõz^zé%ìv;.— MÓ0›ÍX,I ]§FÅ Aƒp8x<ôz=AAA„……]³Ÿé·¿ý-O=õ”¿ ›L&,‹ô%:M§$†\š[M¶ÿGË>£]nê6sTº !„B!¾%:Í€oDâë_hhh»Q¨ÄõËd2ù;¾^„„„"W\1’R5 §ÓA×ähzegàq»Q…ÇOrüÔ—˜kJÛ­™„9"UŽB!„_“ŒÀ(„âRuÎpõšš†Ç롼¼[c#:žÐ3ÝìhjI«Î½^/ù'‰¿!EŽB!„_ûþ[b „âÒtZbÈ÷OÅëõât¹)È?…×Ûr„ ß߀#Ý»§á:qJ~éBt âÕEUåš#„âú ÷ÑB!.U§5%S}•†Ð4 UUILLåOÿU=×µN§0Á|ìŽj@C•/´Kj"ØlÀéöRÝàÂã½pì#qyT*ëþ׌z…¸ˆ@ê]Xí êEt‰ ÂjóPÛèò¿`Òf¦ªÞ‰Ýå• ]„¢@H€Ð #‚Ý奶ÑÛ£vê~t‹&4ÐÈ—'j®É 4bÔ+xT»‡»És !Äw—ÜG !„¸T\cHÃãñàõú’uuµTVVø—kRÓ×»üÒq©¢BMäõ‰ÃíU1èÖr¬ÄzÁ*ÄwìJiµ¶žÁæô%0ºÆsçð6(gËáJ ìE<ð½tv¯bížRn=“B™8(‰åÿ:Í‘3õ¤ P€¸ˆ@ú¤†c6êPp¹UŽ•X)(mèÔ}9^b½6c¨@Rd=»„a6êÐë¼*8\^v«¢Þæ–‚&„ßQr-„âRuN!U4¼^n——ËNñ5#SZô-Ôüÿ»Åzâbú§GPXÞÀ—5¤Æ“NAi.¯zcÕV ¡ìmª%‘b¡¸Ê†Öû[&RVã kl[WRVã`·àt{ñxU’¢‚8^b%0À@rLõß0“ƒºG±ùàYßɦWÞ;–ûÊØ= —G%%&ˆ’;Þ¦^IQATÖ;ù² šÉa¤Å‡àõj.ª£°¼‘™‘œ,oäl­ïX™õ ÈŒbËá ÿ6®&=Ù]-TY,¬ÅéV 6¡45éÛ?žµ_–ù—Ó?žõ{ËH‰ &!2£žð%U6ÎTÚè–BtXÅ•6öÖâpywC%UvÒâCPUý'k Г™Šªiì;QKq•.ÑA™ 9SÏ-)©²‘‚Û£²ëxgkè…n !du ÃáVitx(¯±wz«%K°‘¬.aœ­up¤ØŠÃåÅlÔfÆéò¢©á!&ú¦…j¢¨ÂÆ—5xUa½bh°»I‰ ¡°¼ ³‡›ÔØt:…cÅõØrRÃÑëŽY)(³¢ªHvŠ…àe5vv«ÆåQ’Õæ&-Þ7ªÆá¢z ËÔ=Š#gê©¶új×E[̤Æû÷E!ÄeH )r}Bq%†<Õß´Éåvã°; ‚úú:V}ð>§‹ŠšC:ª««ðzÝèŒ!4”ÆÝCŽÒEt‰âŸOÑèðPPbehV ªª]°9ŽWU9tª–œÔpª%4ÈHX ‘ÃEu((¸=*ý3"ùâ« ¶©¤¢ÖÑéÍ{®v EgIŒ ¤ ÔJ\x PXÖèKÒh™‰¡¬ßëKnè=“Ãø¿Ý¥¤Äl6°~_µ nòúÆffÃÞ2ª\ôêj!Ȭg×±*"BLôêF]£ ›ÓÃÀÌHVo=ƒôÍŠÆãU}I€kìþ/Ȥ'2ÔĦýå48|µË\vÿü^]-|²³äÜt Ÿí*!<ØÄ€ÌH>ß–Âòv¢WW {ò«):ÛHŸ´ì®PöäW““Ž¢ÀÞ‚j#¹uP"…åì;QC|DÃzŰdS!–`#!&ªôëÛãeÏñjRbƒ‘Ë{›NÑ5&ˆœÔpŽÕ£ûÅ³í°—#Wð¼6ÐéöÖboªùçty©oô%׃ÌznȈÀéVÙu¬šÜŒìN/{OÔ‘‚ÝéeËWÔ4¸¸}p2z½Â?žÅlbHÏh./_® 4ÐHïT õìN/7dDø“y}»EÐ;ÕÂö#U¤Ç‡àQ5¾øª‚ȹé”רQÈîjaã¾r4 _Zuœn¯tŽ*„—ëþ[CB!®¦ÄWõõ+TRR…ÑhÀår¡p’·Þ~ú1rä (Š‚WUQUMUÙòÅÉÇ™)Gé"ÌF=ªªaw©ô jS,ÏGÓ ¸ÒFzBé !d§„³é@9á!&ÌF=ªªÒhw³q_é+§Cªª‘_jåæè "¸±G›”Ó««Uk*ËhþãàUÏõ±¥iðùþ2 šš0išÆ¿–s¬Ø×ü¬Æê$,ÈH IÏY—Ô¸`ƒMì?YCV iñÁÔÛÜd&„ðÆÚ‚k®¶€††A§ÐàpŸ·v`Ë2ÜKMÓØw¢†=ùUhªFp€žøˆ@v¯Â«j :RcƒQU·WåÓÅ8Ý*'J­ Ίæ;‹qº½œ(µrCFTÓ1ÑüÇÆîò°vO).ÊÉ2+OLÍBUU’£9}¶ý'kPˆ 3û×¹RtŠïd¶;<¨šF|D ³Æt#<ØÄ«ÿ8†Íá%!2ˆÏ÷—awy9^l¥wj¸/vlØ[Jq•ÝMX»§”ÓgÑ) ÝCÙq´’ã%Vt ¤ÅdÒSVmcÍŽbBèu GŠê¸±G4[¿ª@Ó4Öí)¥¸Ê†NQÈL ÅdP8p²†Ñýˆ ÖbæÓ]ÅR[H!.ç}ŠN¥yp!„âŠ'†4M rrz2à†¼Þsý^¸Ý.ÊËO·{¸êÝ»_•“öÑ— Áî&$À@µÕEÙ€ÓåEmêÓébëWÚè×-’@³žcgêÔ#šÖU5°;¥ê ©©wRYç`HV ¯/‘ÕÅr®,Í÷Ä­zM£Ñáñ# ZM§Å‡Ð'-‚£EQHŽâxq=.·—ç}5½TMcw~Õ5[“ËëUq¸¼„Zuà}îºák‚ªi¾QÃð—k—Û‹·©©¤Ç£âö¨xš§›þ6Dz9±éñú¶åpyüÓ(-û@Ãÿ×é>·Ž¢(hš†NQp{¼xUpyTÿºWJó~™õXínJ«mÌ[v»F¤‚¦¡ ÀžÑx›ö³°¼ÁÛ†e4Nß´WÓðªvWóô¹Ø›:nîGh âkh4è|±Àßæm4Ç´¦ÁEy^]-Ä„›Ù|°Üœ„B\¶pI !„¸šC¾ ·Ë…Ífõ÷!¾ÎSÍæ vßcÕµõ 3\Ñ_ã¯Ç‹ëÉ͈äŸÏ’™Je½Ç{áØ5ÕtÈ/©GÔÛÝx½¾š,þZ.W¸6ĵpÃåUUö¨ÁîòR\ekJVøÊ»·©J\xÕV'}Ò"šjѺ¶‰¦µª]”‚Õîæ“g°›¸mpß6½¾š/½SÃQ…ûJ¯Ùcdwz(«¶qCf$;ŽVÒèðˆ^§PXÞ€Õî&-.„ÓgIO %8ÀÐ*Óü¹;Ž%—ᦵ¦Z+þmœgj«“nñ!„Ðëut‹ápQݵÕÃåå†ÌH¾Ì¯¢Îæ&Èl ЬGÓÀîòpôL{ò«8YÞ€%ÈDt˜¹és¶Ž[»86%åüó5ßkF=]b‚Xµå4u .öˆ¦WJx‹åÚoÃåòPPZϸ’p¸½œ(³ÊµE!.÷mŠ4%Bqµ%†ô¦@Ž”_PxÞ_Ø›;ŸÖ4 9cø©1t ¶®`ò°®ÕVÛ;Z•wMóÕ¾8\TÇô©x¼*g*ýãÍÉ£–5†ZNç×3¢wÞÒš'¦æš†ÝéÁjsSTÙH]ƒëš=FN·‡]Ç+Ð=šïßœ†É¨çlíG}M’>ßWÆ„AIh”45Mj®mÕ*vmÊj«eÚ”áŽÊ´¦©çÝVËuŽ×À½£Ó±»¼¾Z2ê•­1dµ¹Ùq´‚ÜŒ(î™F€QO£ÃCiµªz v7{ ªÜ3†[&Qos³ãHE«Ïéßÿvqm3¿©ÌÚnJ«lþr]Zmk÷6ÛP5úF7NÊö#x<Ò·BtÆý·Bq)@×ôW˜÷ÛgË~öôσ¬—6|³¦iìܾÑcÇápØÛÍÿ׿ÏYs2 ªCÓ<\òÓ€¢CQô¾*E⢠zNASÁÓԇͅ˜ :\4AÒë|ñöªÚy—¡ÖÔôF§S0´ˆ©NçëØÛ Wšj;~ªêk¾¾boÐéÐé iP?_ÓU#->”¾Ý"Øt œj«óš£^§ ×)M£‘+¿ŠF½šF)Ó) .ŠNçkVÖÜ?M»iEA§ó5k{ŒÚN :Üm¶y¡u|µ–ÀhP–GyÝÇ«®ªjšïs4Ç£mYòzUTÍ[×W{ÍWux[\;.TFõ:½^¦r® àöª¾mv° …œ´#Ù|°œF‡4QBˆË-LßÈí9úôëßn^cc;·mc؈‘½Ï_íÑ3EElܰ=ò(íGäÜ¿÷K†¸£Ñ(ÁBˆ6¬Ú†Ù†¼^¯ªâõj8\¼^_K”æ{qÍÕ@ªÅÍøÁéœ*,ä¹çžs¿ÿÁêZÀ¸ÐÔÕÀY ¨júWÝ4¯¡i9à\MÛðúž0Q›þvbS2Åðµš:ûZ.ȯ—Âíùzqj-O‹NŒÏ·Œ¸ôz½Þ–‹y;>^m§5 \jûí÷K¤g ¥Vªê×E=^ ·£ë8;ˆAÛŽ¶ÛMkÍÝ×´=Fm§]MÓÞ ”û–Ó=’Ã0ê 0 §¨¢ñªøEö|1¼PYrµYÁÝnúüeô|ïç:Ï6†eÇžü*ìn¹x!D'Ý !„—¢SC£ûD£è m!¾¡}âitxp8ìDõ‘€t²hK=»Z0èt”Ô“›Š–"¹Eá{7$RRe£!!Ôh“ÄD!:×nÂ÷c±Bqa’­¹)+’ŠÊ >û¿Ï°Zëý¯‡……1fÌ÷HNJ–#!Ä¥Ð<„šap÷‰Å•»ÕÕKz| éñŽKàr:‰ÑÝSÊ­Bt–ªJ(/•ÄBˆ‹ë´j<•¸= º±—¤›ƒqâD!Áíq7›ÍÊC—B!„B!ÄåÒi‰!ßH5*•eØÐë ë7|ʺõŸ¶[6=½sfÝ'GH!„B!„â2Ñu曩ª§Ó‰Íîäĉ3TWÕæûáûMŸ>=8ST$GG\—<È‘#G:œ·bÅ ¸¬ Ù½{·B!„Btb¡–TU-€Ûo¿£Ý¼ ×a·;åȈëÖ¾}û ¢gÏžíæ-]º”iÓ¦I:ÉË/¿ÌÃ?üZ÷ĉ=z”n¸A €B!„¢³k ix<¼^/Á!¡ôéÓ‡ŒŒtÿ¿Þ½{‰Û-Ã]wß}7“'OfåÊ•ŒNðꫯòÙgŸù§?ÿüsþú׿J`¾†?þñlÙ²Å?½zõj-ZÔ©û0cÆ †kwÄÄ}ûöñꫯððÃK¡BqÕóx<444P[[Kmm- ¸\.4MëÔýp»ÝØíöNy/›ÍFMM 555466¶ÛæyªªâñxüÓµµµþeêêêü¯×ÕÕÉó’â[Õ©ODªªâõxðx|²ÚÚZŠŠNûçÇÆÆàt:äÈ|MK–,á£>¢ººZ‚Ñ n»í6^xáŒN§ãÿø³fÍâèÑ£444JZZF£MÓ8{ö,ÅÅŘL&êëë ÀáppòäIl6ÑÑÑþ›"ÇCII èt:’’’ˆŽŽF§Ó]71=z4«V­¢oß¾x<Ö­[Çã?ÎáDZÙl„‡‡Ó­[7EÁn·súôi¬V+aaatéÒ…ÀÀ@ªªª(**BUUbbbHJJ ²²’ÒÒRÜn7111$''£×ë9xð ‹…³gÏ’œœLUUQQQ¨ªJEEeeex½^bccIJJB§ÓqàÀÂÃ騨@¯×“’’BxxøUC—ËE]]²cÇbbbHKKÃårqòäI¬V+f³™””ÂÂÂüëHtt´¿Ì?~œ=z\WåL!ÄÕ£ººšO?ý”-[¶pêÔ)\.‹…ôôtfÍšE¯^½:m_>ÿüsÖ­[Ǽyó.û{-X°€gŸ}ÇÃÏþs~ùË_úçíܹ“{Ö­[Ç™3g¸ë®»ÈÏÏgøðálÞ¼™/¾ø‚矞ݻw“ššJFF>ú(Æ “B%„¸CšŠÃéÄnw`½^Oee%µµµhhœ,,äÄÉØluhšââ3$ÉPöâ*”˜˜Hß¾}Ù´itëÖ’’6mÚDhh(õõõL˜0aÆQZZÊòåËýè‡âöÛo`Ó¦MlÞ¼‹Å‚ªªþ_öíÛÇ®]»hllÄf³ÅÔ©S‰‹‹»nb˜™™I||<_~ù%eeeäæærðàAvíÚEpp0õõõ̘1ƒììl>ÿüsvìØAPPf³™›o¾™>}úðæ›ob³Ù $00ûš>ùäq:¨ªÊäÉ“ÉÊÊâ7¿ù C‡`Ô¨QüéObÁ‚”––²nÝ:±Ûí ¦L™BFF¿øÅ/3f ‡ªª*RRRøáxUŲ9!¹iÓ&úöíKZZk×®¥°°»ÝŽÕj¥gÏž­š)îÞ½›Ó§OóÈ# ( ‡bÙ²eüæ7¿‘ÄBˆoÃá`Ñ¢EDDDðË_þ’ØØXl6›7ofÞ¼y$''wjb¨3ýä'?aéÒ¥ÔÖÖ¶J  :”Ù³gÓ¯_?bcc‰å‡?ü!O>ù¤¿Vp÷îݹ뮻|8iii¨ªÊG}Ä®]»ÈÈÈÀ`00jÔ(zöìIyy9?ÿùϯºÄЄ xã7xòÉ'ý¯%$$0dÈ, ¥¥¥¼ôÒKÜvÛmþù£Fâ™gž¡  €¤¤$Ö®]Ë„ ¾Sý- !„è<[¶lÁjµòÈ#ø¿ƒÃÂÂ?~Áív3vìX&L˜€ÙlÆjµ2oÞ<ÊÊÊ())A§Ó1mÚ4X¼x1?þ8k׮娱c¸\.~üã³`ÁœN'·Ür “&Mâ©§ž¢¾¾ž1cÆp÷Ýwc6›/KÜŽ;Æ’%KèÚµ+?úÑ®«{A!Äw41”–šB¿~½Q5³ÉˆÑ¨Çj­öuH† ALô`ÎWÊW­.]º@CC”••ѧOL&ýû÷çå—_|ÍšºtéBxx8𦑙™éßFEEÙÙÙF àOx³|ùrvìØÍf£ººúºûM§Ó‘••ÅúõëÉÌÌ$** «ÕJ÷îÝ1 8·ß~ÛŸøøàƒxì±ÇÈÉÉaÆŒÜ{ャ\¹’E‹qË-·ÐµkWL&‡âå—_¦¶¶–ÆÆFFŽ €¢(ôïßßçff³™Ý»wóâ‹/RWW‡ÕjeÒ¤I€¯fcïÞ½Ñét$''ãt^㇇‡óßÿýßœ:u ·ÛMqq1^¯×?ßb±——ÇŠ+>|8F£ÑŸ<B!¾mëׯgìØ±íúö3 ôïßß?½{÷n^}õUîºë.âââØºu+¿ûÝïøÍo~CDD3gÎäÉ'Ÿô'†t:'NdãÆþÄÐÔ©Syâ‰'x衇˜1cµµµ,]º”ÀÀ@ÆOPPwÝuÛ¶mã‰'ž@QbccÑétüýïç¹çžãÇ?þ1dÞ¼yØívFŒÁ?ÿùOòòò dÆŒ<÷ÜsÜpà F<ÿó|[öìÙÃÊ•+y衇¸é¦› ”‚$„¸öCæŠâÂã²à9OŸiš¦áõz0ÈW­€€âãã©­­%$$„ÈÈHNž?ü07Þx#½zõâ•W^á“O>aæÌ™¤§§·Z^QÒÒÒØ¸q£ÿµnݺ‘žžÎÝwßMbb"^¯—òòröíÛÇøñãÑëõ¤¦¦’ŸŸOvvv«íEDD0vìXòòòüß•%%%ìܹ»ÝŽ^¯§  €¼¼ `Ê”)˜L& L'7nK—.%--üü|&L˜@ÿþýY¾|9ï¾û.:ŽÃ‡ûkÿäåå±dÉRSS9s挿FGBBàã?Æf³qøða|]Ç/ €°dÉ’’’8r䈿/¦={öpúôiL&6›ÍŸ0úðà ÆétÑh$44ƒÁÀ† ÐëõìÝ»—˜˜˜ ¾wsm®µk×°k×®k®öL÷îÝyë­·èÓ§ 33“ýû÷SRRBuu5íÖ1›ÍdggSRRB¯^½äfS!Äeýžw8.>ÀÌÑ£GÉÉÉiõ]•ššÚêGžKåODéõzBBB.¹ÖoG}øX,222غu+±±±¬]»–ßýîwþùcÇŽm5ÈC[Íß±š¦µú¾Õ4­ÝkÍæÍ›Ç«¯¾Ê{gÇãáé§Ÿ&9Yú_B|û:-1Ô%¹ 7Ý”Gcc#ç«øÐ21J=å]"NGß¾}Û}ùˆË«oß¾þ›Œ±cÇAUUcÆŒaàÀ¤¦¦2uêT¾úê+‚‚‚xøá‡ILLà–[n!::šúúzÆOnn.àë¿(""Â?zVVViii×e o¾ùfÂÃÃ1Lœ8‘/¿ü’ºº:&Mšäann.F£‘êêjFíÿuï{ßû‡BÓ4FŒAHHiiiL™2…S§Na2™˜5k–ÿ½~ðƒ´zï¹sçú›P©ªJQQAAAÜwß}t¸NÛé+)55•qãÆ¾þöîÝë?÷ï¹çvî܉Ëå"##ƒŒŒ éÑ£‡ÿFÙëõÒØØÈèÑ£¯š‘Ö„B\Ÿ²²²8~üx«fcßDËdJGC·ëtºVƒ)|:ª]D÷îÝÙ¾};ü1ݺu#55õ’ïBCC©¬¬ô°ÚÌår¡ªj‡}üÅÅÅñ /ð /°lÙ2êêêxùå—ýµÒ…âÛÒi‰¡ÐÐPÜ0P"~™ÜqÇ„+ %%Åÿÿ >¼Ý2Š¢øÌÛ aÔ¨Qí^ 㦛núNİeßIáááÆ#22ÒßOPKiiiífôïß¿ÃϱcǶšn~¯ÀÀ@ À€.ºNÛé+)&&Æ_ª[·n­~ጉ‰ñ×Zk)))‰¤¤$4Mã‹/¾Àjµrã7J2Y!Äe5iÒ$ž{î9&Nœèïh ¡¡eË–‘’’ÂèÑ£éÑ£ûöícÈ!8N ý÷\Šâ¸¦9Á¢i_}õÕeßEQèÑ£Ÿ}öýë_™?þ×Z¿OŸ>:tˆ½{÷2bÄÿëååå8Žó&{RRRxöÙgÑëõþÚç/¾øâEkC !Ä×Ñ)‰!½^ßaæ]!Ä•1oÞû,<ð={ö¤¡¡5kÖí¯ ÝÐÐ@ii)ùùùdee‘˜˜ÈŸþô'bccyùå—©¬¬äg?û 88X »âë”ÄPhh(v‡ƒ#G·jÛk0Ó£{Oi „ìù矗 !ÄuÌnk¼êöiذaX,>üðCV¯^Ùl榛nâ–[nñÌqà 7ðÐCñá‡R]]MïÞ½ùÕ¯~å^à'?ù ï¼óóçÏ'##ƒgžy†?ÿùÏìÝ»—¼¼<>üðC¢¢¢Ø¹s'·Ür õõõìÙ³€‚‚ú÷ïOVV àÍ7ß$,,Œÿ÷ÿþ_~ù%!!!¬Y³†´êCÀn·c0˜2eJ«ZO-?ÛùtéÒ…¥K—²zõj¶lÙ† ˆŒŒdذaäååù¤9uê•••Ìš5‹Õ«WsÛm·ù?÷¯~õ+ùꫯxýõ׉‹‹£gOézCñÍuZS²“…'øø“ˆDQTU¥¢¢½þib&„B!ÄuNQrrrZu.ÝîáÄ``èС :ô¼ÛèÑ£ÿùŸÿÙêõE‹ùÿÿµ×^k5/::ºÕ|ð5_Ÿ;w®¿&øúA3fL‡ï;oÞ}Zª¢½^ß®ÿ±k…¡sßN4</§NUÑ--¶£K–•Ó¥kª×+%K|çñ‡?üW^yE‚q<öØcüío#**ÊÿšÛíf÷îÝ üðCn½õVÒÓÓ%HP__Ïk¯½ÆÈ‘#ÉÍÍõ¿¾ÿ~6lØÀ½÷ÞÛ*AÓÒúõë9~ü8sçÎÅd2ù_ûí·1›ÍLŸ>ý[ÛOUU)))àã?fðàÁWU.·ÛÍ¡C‡Ø³gÕÕÕX,úôéC¿~ý0›ÍRЄB\qS¦LaÊ”)!„¸Juê8–ªªâU½x›jUVVòÕW‡üÿš‡fl9r™¸¸U«V¡iYYYTWW3þ|‰a'øûßÿΧŸ~ÊÙ³gýåvÓ¦M¼þúëJ€.Âjµ2þ|Ö¯_O]]àKmذ \°ÊùæÍ›yûí·9xð ÿµãdzbÅ V¯^ý­î§ÙlfêÔ©|öÙgWUUxÇÃÿýßÿñþûïJß¾}‰ŒŒdãÆ”——K!B!„B\T§Öòz=8FCÁÁÁDFFàñøEŠNÁétât:Q5—ˉÉ$¿x_ÌìÙ³1›ÍF† Â~ô#\.œË(22’¸¸8¶oßÎĉ©¬¬dÿþý 0ð%B÷ïßÏ«¯¾JII ýúõã§?ý)¡¡¡466òæ›o²víZ"##™5k7ÝtS‹sÅË‘#GøË_þœ9s2dÈuÃÔÔT\.GŽaРAP[[Kff¦?Û·ogñâÅ”——3gÎn¿ýv&OžÌ;ï¼Cß¾}X¾|9·Þz+›6m ¡¡ùóç³yófbbb˜3gŽ¿9ØÖ­[yóÍ7©¨¨`Ô¨Q<øàƒû÷ëìÙ³¼ýöÛ î¼óNž}öY¾÷½ï±aÃ8@ß¾}™>}:{÷îeæÌ™DDD`µZY°`ÇgÀ€RcïôéÓìÙ³‡©S§Ò»woôz=^¯‡ÃA`` ªª²oß>Þxã 8p >ú(‹…Ç{Œ®]»²uëVÆO~~>ñññlÛ¶ §Óɸq㈋‹cÅŠØl6&NœÈwÞ‰Édbýúõ¬X±‚òòr²³³ùéOJLL O>ù$]ºtaË–-x<&OžÌÔ©Syþùç™6mš¿fضmÛØ´iO<ñF£Q.&B!„B\AZcÈnwRUYOuU=uµµìܹ÷–¼ÍßçÿŸÿ?üù¥?Px*Ÿº:»|ú9B— 44“É„×ëåË/¿¤Gò°Õ ÂÂÂÈÍÍåСCTVV²aÃ’““éÞ½;,^¼˜I“&±xñb"""ümNW­ZEyy9‹/æ`Íš5œ:uªé<±³~ýz^yåæÎ{Ý&…âããéÑ£;w®Žýë_dff’””øú\Z½z53gÎä­·ÞjU®‡ŠÛífçÎ:tˆŠŠ FŒ៿téRl6‹/fæÌ™¬ZµŠ²²2JJJøàƒ˜={6‹/¦¾¾žeË–ù×;qâóçÏÇd21kÖ,©©©áŽ;î //ùóçóòË/“••Eyy9_}õªª²{÷nÒÒÒ:­gUU•¿¶ Á`Àjµ²yófvìØAcc#,[¶ŒI“&ñÞ{ïÉÛo¿ @]]n·›E‹qÿý÷S__OUU¯¼ò ¿ÿýïÙ´iÛ·oç¯ý+/¾ø"û÷ï§  «ÕJaa!ÿõ_ÿÅŠ+èÝ»7o¼ñ†›Í5Ážþy¶lÙBii)7ÝtŸ|ò 6› §ÓÉòåË3fŒ\§„B!„ø®%†À@Lt))ÄÅGrªè8C†ärû¤ÑÜ>i4“&å1é¶ÿüsÖ¯_ÏwÜA¯^½¤ãéNINN‹/¦wïÞ¤¥¥µš¯ÓéPUðõÓü¯(Š¿¯-MÓZ­CBB'Nœ`èС­:W¾ÅÇÇ“ÍßÿþwFMbb¢^s9nŽa[999,]º”òòrÆߪJËØ7ÿmy^4ÇÝëõú @nn.ǧ¼¼¼U¢©##GŽdõêÕ¬X±‚êêjn¼ñÆN=÷BCCÑ4ÒÒRºvíJBBO=õµµµþeÂÂÂHOOÇl6“žžN\\œ^ˤàï¬Z§Ó¡ÓéZM7ǬªªŠ7ß|“œœºvíJpp0Gõo£¹¼¶\'&&†^½zñÙgŸqòäIžyæôz½\@„B!„¸ tZ!EQ°Ûl8<µéŸè0™‚1™Bšþc2…R__Op›‡ѱ5kÖðæ›o2mÚ4ºwïŽÃáh—l—¯\7Ž?þñ<ú裭’f³™øøx>úè#Μ9Ã믿îoê”››Ëûï¿Ï™3gøüóÏq»Ýþš&IIIüÇüGå½÷ÞÃãñ\÷1¼ûî»ùÓŸþÄ=÷ÜÓ*†QQQ(ŠÂúõë)--eÉ’%­ÖŠŠâùçŸç…^ð7ák6hÐ –,Y™3gX·nƒ‹ÅBxx8z½žõë×sæÌ–-[ÖªfÖ¤I“2d .¤   Õ¹ÂéÓ§±Ùlþ¤ËÔ©SY²d yyy¬at9tíÚ•¸¸8.\Èþýû©­­%??ŸÊÊJt:áááôêÕ €o¼‘øøx ¾Ñ{:NÊËËéÛ·/}ûöåäÉ“]Çh42`À ÈÈÈ %%E.B!„B\%:­ÆPBBæ ›ÿ¹Mí8i¡è|„šª‘œœÌ”ÉÃå]‚þóŸ8^xáÿk , 22R‚såääàï K—.„‡‡̃>Èk¯½Æš5k4h³gÏö'Ün7O?ý4±±±Ü{ï½tíÚ•ÒÒRºwïNbb"¿þõ¯ùãÿÈöíÛ6lØu?³ÙL=_Í•–µW222 $))‰™3g²xñbV¬XÁ}÷ÝàoÚ¤ÓéZ o4éÙ³'Ó¦MÃétòôÓO“ÀìÙ³ýµefΜɢE‹X²d ãÆó:–••EHH·ß~;ƒuëÖ1eÊreêÔ©¼þúë¬[·Žßÿþ÷¾ë•¦1pàÀVýu–àà`æÌ™ãÉ­¢¢‚øøx&MšD÷îÝ bΜ9¼ûÿþû¤¤¤0kÖ,zôèѪ6ZsÌ›uëÖÿtsÌcbb¸í¶Ûx饗ÐétŒ=Ú_³¨¹ùXËm6wê­i LŸ>ƒÁ !„B!® ¾ZC  Ì¿ûí³e?{úçA Vë%m@Ó4vn߯è±ãp8ìíæÿkóçŒ;“YFB\_ÊÊÊxá…x衇ü )ÑžÝngåÊ•8N¾ÿýï·kÂ&„âÛW^VJþ±£ôé×¿Ý¼ÆÆvnÛÆ°#/zŸ¾&ÙgŠŠØ¸a?zäQÚ-»ï— q³ , „X°jfK<ðzU¼ªŠ×«ápyðz5ß´ª¢i ¹Hµ¸?8S……<÷Üsî÷?X] x7`: 8 TUMÿª›æ54-gœ€«i^|}ù¨M‘Ÿm…âß°eË-ZDVV™™™ †<ee%466¢×é 6QWw–ýûÏúº¿nâõªìÛÈ~DŽB!„B!ÄeÒ©ühšŠÇãÁétqðà öï?ÆéÓe)¥¨¨Œ¢¢2jjj‰¤¶¦FŽŽ¸î=z”E‹I ®_üâ!„B!„h¡Sk išo„UU‰ïÊSO>¦kÿ¬(:^{}!‡$…¾‡ÃAUU.— “ÉDdd$\§¨¨³ÙLll¬ÿ5—ËEii)áááX, ìEœ8qÂ?Œ«N§#88˜¨¨(ôzýy×ill¤¤¤D‚‡¯aQQ‘‘‘­Ê›Õj¥²²’¤¤$L&S‡ëVVVRWW×tÝPüåþb#^?~üº‹£¦iX­Vêêêp»Ý ÿGÒ¹¿Bˆ«Å™3gÎ;Axx8‰‰‰$!„¸B:91¤áñxðz½(Š‚ÍÖHuu•~X˜EQp¹\rd¾†õë׳sçNœN'æÿÏÞ}‡GU¥ÿNO/“ÞH …@*„j €DЬ ¸‹Š¨‹² þD•EEEÖ‚R–fa¥ $”R!RB ‚¤ éu2íþþ\‰ ‚+QÉù<Ï<{ïÜIÞsçÎÜ÷žóŽ6mÚ0|øp4ÍO>g„ ´nÝšéÓ§ËtOœ8ÁÔ©SyôÑGùë_ÿ*û ~øaâãã‘$ ¥R‰­­-÷Üs;vÁ¹W®\aôèÑ<þøãüíoC§ÓQ__Orr2óçÏç?ÿù­ZÝ¼ÎØÒ¥K¹pánnn@Cb.<<œ‘#GbccÓlbhµZ9þ<{öì¡°°ƒÁ€N§ÃËË‹#Fàîî.4Aáá¹çžÃ`0àèèȹsçP«ÕSZZŠK—.AAø4ibÈb±`2™0(öX­VL&Óu9 ³Õ˜Í&Ñ2·ÁÍÍÇ yóÍ7IJJúÙÄR©ÄÛۛÇÓ¯_? !Á&o³xñb‚‚‚8{ö,C† !((Hû:ÞÞÞ¼õÖ[Ô×׳oß>6oÞLÇŽ±Z­ìÞ½›Ó§OãææFŸ>}ä;aEEE¬Y³†‚‚:tè@×®]›mϽ^OYY999„††RPP@AAA£žl¹¹¹|õÕW”––Ò§O"##øûßÿN‡°X,\ºt‰Ù³g“””„N§ãâÅ‹ìÝ»—šš:uêD‡P*•H’Äž={8uênnnôïß_N.ý•””°sçN|}}1bÎÎÎTUUqáÂùý_TTÄW_}EAAáááôíÛµZ͆ Ðëõœ:uЍ¨(*++qqqáÔ©SX­V:t耣£#ûöíÃd2ѹsgbbbP©T\¸pPQQAË–-8p :ø¯< IDATŽM›6¡×ë9yò$’$ѵkW"##Ù²e ;wÆÛÛ[nÓÓ§OÓ¯_¿Ÿía'‚ Ü]æÌ™Chh(óæÍÃÁÁ±cÇrìØ1>üðCA„ßQ_J& †z aXÍöÿngÙÇËXöñ2Þ}ï]¾ùægÏ^¤ººš“'ÓE Ý‚.]ºàçç‡Z­¦¢¢;;; ÅÏ>G­VϱcǨ¬¬$++‹¼¼<ºuë&o³råJΟ?O‡puuþ‹…+W®àèèÀþýûÙ½{7‘‘‘TUU±aꪪ¸páF£‘ÈÈHRRRøöÛo›mÜÐëõœ9s†úúzN:…££#-[¶ ´´”äädêëë‰ŽŽæÄ‰7žU$‰²²24 J¥’ÂÂB’““Ñh4„……±iÓ&Ž?.oÿõ×_Aaa!6løSOŸ^TTDmm-}úôA¯×£R©pqq¡C‡r’hÓ¦M”——Ë‘#GØ»w/©©©ìرƒ˜˜‚‚‚Ø»w/7n$<<V¬XÁŠ+ ÃÇLJ””òòò(++cÆ GFF;wî`Ïž=¤¤¤Ð¦Môz=6l ¸¸˜ââbvîÜ)½LII¡¶¶V uAhF¦OŸŽŸŸß ËCBB˜22’!C†àèèˆR©dïÞ½Ívø™V«¥k×®¬]»–ˆˆ:ĨQ£ÈÊÊ’åååŒ3''§F= g̘’$a2™>|8ööö\¸pI’:t(vvvX­V:Dûöíx衇ðóó#22’éÓ§3f̘?m¯ƒÁ '$/\¸À´iÓ(//ç½÷Þ“»ë?òÈ#¸ººb±Xؽ{7 <ðÀDFFÊïïQ£FѾ}{L&ÇŽãž{î¡[·nX,222(--% €qãÆa2™°Z­èt:Ö­[GRR’¼èèhL&éééTWWÓ»woV¬XÁÅ‹Q*•dddðÐC‰óŠ B3r­Çï9::Ò¦M¾ûî;^yå&MšDhh(gΜaÚ´i¼ýöÛŒ9’ÔÔT¦OŸÀÙ³gIKK£ººšèèhسgÑÑÑ„……Jrr2³gÏfÊ”)Œ?ž]»vñþûïóî»ï¢×ë(//§¾¾///ÑH‚ ˆÄPSˆŽnC§Ž1X,fy™ÑXOyYÁ ™ûq±de‰ºE¬^½š³gϲ`Á „½½ýÏ>G¯×ƶmÛ(..fêÔ©|ùå—?jµü¡)ܨE‹¬]»hJ¶yóf¾üòKÂÃé­­E¯×£P(pppÀjµÊ=Sìììä^]...r"®¹jݺ5¬\¹{{{Ú¶m+¯3›ÍrÌ®™¾æÕW_•‡’edd°xñb† "`¶µµE©TâääD]]ü<777 NNNÔ××˽XþŒlll$‰ÊÊJ\]] aíڵ̜9‹Å‚ÅbáÔ©S,\¸PN~EGÿl÷ððh”œ¹vÌjµZ4 z½¥R)?¬V+µµµ¬Y³†¬¬,êëë©««k”X»~ …I’ðõõ% €½{÷’““ÃÈ‘#±@¾ ‚Ðü,\¸ñãÇÓ»woüüü¨¬¬äÓO?åµ×^#<<œóçÏÓ¾}{ÒÓÓéß¿?»wïÆ`0È77cbbäáÔ666 :”ž={¢R©¸ï¾ûøâ‹/}/x÷ÝwÙ¿?»ví ‚H 5“ÉDuu&ÓÅ¥ Ðj_ \›eç§f$;|ø0aaaØÛÛ£V«±X,·t±«P(hß¾=555xyy¡V«E0%¥R‰££#555´jÕŠýû÷3lØ0Î;‡F£A§Ó ³™]¸pÀÀ@Ž9B```³Ý°aÃøúë¯éÒ¥K£áE×’jçÎ#$$„³gÏÒ®]»ŽcŒF#V«'''ª««ÉÌÌÄËË‹cÇŽáïï/o¿{÷núôéÉ'ðððøSgòööÆÖÖ–íÛ·Ó·o_ôz=ÕÕÕò°E[[[ºwïν÷ÞKDD%%%üO¯YYYIzz:ÿ÷ÿ‡Û·oÿÅ/Ó¶¶¶´oßž¥K—¢Ó鈋‹' Aá§NbÚ´i–EGG³fÍâãã9pà  ¤¤„Ž;RZZÊ‘#G$ ''§&^–o`ØÛÛ_ðÃ÷ä>}ú"‚/B³Öd™{{ ®péRÞO$-\»q-I®.n$ôI-t ÊËË™={6555ØÛÛ3hР[ž™ÉÃÃáÇ‹ þ ùùùüãÿ“... 6 €aƱtéR¦NŠZ­&11WWWòòò¨­­åóÏ?§¬¬ ~øáfËV­ZÝt2âââøä“O0›ÍtïÞ]N ½÷Þ{¸¸¸? Ispp ((ˆ°°0æÏŸÅb!((H¾óxíKçŽ;P(Üwß}?[¤ýN¯×3pà@vìØÁìÙ³1888àç燗—z½žž={²aÖ/_޳³3}ûöýŸ^óZŒ?øà´Zí-w½÷ðð@§Óqï½÷þ©c.‚ ÜÁ “«78¯g±XäÄN·nÝX°`YYYTWWÓºukÜÜÜX°`¸¹¹ÝÐÛýú^­ …â†aÌ×GAh¶çß&»ðkÙ’ O>}Ë…^Ujövö¢…nAïÞ½‰‹‹Ãb± ÑhpppøÅÞ? .¼éòʉ»ŸÚFh°~ýúF_4t:\ëÅßߟçž{Žºº:Ôj5ŽŽŽh4¢¢¢X¸p! …“É„Í2~žžžÌœ9ó¦ë^|ñE¹\bb"]»vÅb±Èñ}ê©§ ÁS«Õ888 ÓéÐét :”¾}ûbµZ±³³“‡U.Z´­V‹Á`@¥Ráääô§®s£T* ÁÏÏÚÚZ¬V+*• [[[lmmQ(tëÖèèhŒF£|,Ìœ9Sþ?ÀK/½ÔhøésÏ=×h¸×„ Ðéth4&Nœ(ÇßÖÖVò7cÆŒFÇó /¼ ×yÊÌÌ$88˜èèhQ[HA¸©øøxvìØÁ¨Q£P«Õ˜L&¾úê+:uê4Ü0òööfÆ âêꊣ£#—/_¦ººš¤¤¤[¾9zMMM &“I¾Ù$‚Ð5YbH¥Rãää$"~hµÚÛžrû§¶¿þBðÏ$IbÇŽ9r„Þ½{‹ã_¡™+++###ªªª}¾<ñÄLž<™ºº:|}}ÉÍÍåÛo¿åí·ß–?óúöíËâÅ‹ùä“OP(òL»ëÖ­£uëÖò¾ ÈÊÊ"--=z Ñh¸páW®\áàÁƒò"³gÏ5†Ahöš$1¤³±õ‚Aš!I’ÈÊÊ¢gÏžtíÚõ¶ïä ‚ ¿Îõ»wEE…œ úqbÈÃÃ3f’’ÂáÇñööfÆŒn*$&6”š’Eƒ B¯×7ªÛXXXHHH¥¥¥˜Íf4 ™™™ôêÕ‹ŒŒ y»îÝ»7ªE(‚Ð5IbÈÖÆ†+ÅÅlÛ¾U.Š àääHbâüDK‚ Ü¥^xáA„&¦Óý1CAAA¼õÖ[?¹¾U«VLœ8ñ'×ðè£Þ°Ï   FËÚµkwĉ‰‰rbéúe‚ Í]“ %+(,àò•\""B°Z%Ξ¹@Vf&žž7l¯R©Ä,Y‚ ‚ ‚ ‚ wP“e^$«¥R¢¢¢˜šÚÔ*5‚ÏW}ÊV~üPŒT’$bcãxòïO‰AA„?±ÜÜ\²²²D A¸«iµZ¹XþŸM“vɱX,êë©«5PRR…J¥ÆÏ×IBÎ iµôzÎwQYÂ]éÌ™3h4BCCoX·qãF†*‚t‡H’ĦM›nã´´4|||ðóó»«cMYY±±±â€AšÄÙ³gùòË/E A¸«999‰ÄÐí°X­˜Œ*ú¼ç†u_½Ÿº:ƒ8ª„»Ö¡C‡°··¿ibhþüù"1t‡-X°à¦1Þ¾};=zô¸ëCgÏžåÌ™3"1$‚ 4™›ÕöAþ8”MùbV«„ÙlÆb±àèäL|·xâÚ·—]»tÅÍÍ£Ñ$Zæ6Y,vìØÁ°aÃ8qâÄ/nÿØcñöÛo#I’¼,''‡Ñ£G“œœ,ú æÍ›Gjjªüóþýû™;w®Ìm¸|ù2Æ cÓ¦M–oÛ¶ûœœ›>ïÛo¿eÁ‚ŸŸÏ¼yóÍ0Ò\œ8q‚E‹ðÔSbè­ ‚ ‚ ·¯I{ Y­V, f³€ââbrr²åõÞÞÞÔ׋C·+77—ƒbggGuuõ/náÂìííùöÛoéС)))SZZ À¹sçptt¤¼¼œ-Zààà }Õ!C˜1c:uB¡P°råJÆŽË÷ßÁ`ÀÆÆ†€€´Z-’$QZZÊåË—Ñh4TWWcoo€Ñh$77—úúz\\\äDÅbáÊ•+”––¢T*ñôôÄÕÕ…Bq×ÄÐd2‘••ÅñãÇiß¾=þþþ––FNNõõõÔÔÔPXXH}}=>>>„„„’’™3gèÖ­G¥¾¾FÃÙ³gQ(xxx ×ëQ( òóóå_#IW®\¡¸¸êêêäåUUUa4qppÀßß•Jõ‡‹aMM äæærêÔ)Nž<‰^¯ÇÏÏ“ÉD^^555hµZ|}}åã¦ñµ±±‘cb±XÈÉÉ!00¥R)Þä‚ ‚ ‚ÐL4ybÈ`¨§®Î€Î NG]]-••UHH””–p)÷55¥HV ùùyøúú‰Vº{öìÁÏÏ‹ÅrKÛk4Ø»w/‘‘‘ÔÖÖrøða  oó·¿ý¡C‡R]]ÍØ±ciݺµôUÄÄİk×.lmmiÙ²%éééäææRUUE]]ƒfÀ€ñÙgŸ‘——‡çÏŸçþûï`÷îÝlÞ¼lmm1™zË¥§§³gÏŠŠŠ0 ´lÙ’Ñ£GãééyWÅ188;;;NŸ>··7(•JÂÃÃåÄÇæÍ›9|ø0*•Ѝ¨(ÆŒC¯^½Ø¿?¡¡¡œ}: ,¸¥ç(•Jbbb8~ü8.\ --víÚáééImm-:ŽþýûÓ¾}{Ôjµô 0€Ï>û ­VKRR 6 '''222øàƒ0`‡B©TòòË/c0˜5k–¼/¾ø‚G}”ØØXöíÛÇ€†Šö÷ÜsÁÁÁ”••±lÙ2Ο?×%†œœœˆåÈ‘#´k׎о}{òòò€†abÇŽcܸqsþüy:uêÄîÝ»IIIA£ÑСClmm ¦¢¢‚åË—óÝwßáììÌæÍ›yôÑG‰ŒŒ$55•ǰcÇ<==yþùç)(( ;»¡÷¢B¡ 44”x[[[:ÄÚµkÿЉ¡Ñ£GóñÇ3gÎy™=önnndgg3gÎ,¯8p S¦LáâÅ‹øúú²yóf†*’B‚ ‚ ‚ÐÌ4éÕ¾ŸŸ/Q‘áX­ ÃelmuØÚꨭ­Àjµ’<”ÆÇÇ›ÒÒZÑB·`Ù²eÜ{ï½·4ðõõ% €;vðõ×_3þüFusìììDRègáééIuu5ááá\¸pW^y…¼¼ ˆ‹‹C«ÕÒ³gOùÂÞÓÓ“U«VñꫯR[[Kaaá]Y,X¡PйsgRRRؽ{7¹¹¹Lš4‰-[¶P]]R©$,, µZMddäÕs‡-#FŒà…^`îܹèõzÖ¬YÃÌ™3©©©¡¨¨ˆˆˆ, %%%ÄÆÆ¢ÑhèÓ§óæÍz õïß{{{‚‚‚ zÓ™L&¦L™ÂåË—©¯¯ÇÙÙùOy|Î;—ÌÌLêëë¹xñb£…nnn$$$°jÕ*úôé@LLŒxc ‚ ‚ B3Ó¤…$ìíí°µU RP© TT\Æh4`61›MX,fÌf …[ÑB·   €9sæ0`ÀÖ¯_Ï /¼pKu†´Z-ݺuãüùóÄÇÇãááqÃE»H ý4;;;üýýñòòÂÉɉ7Þxƒ#F°dÉÞ{ï=lmŽ_GGGJKK©««£ººšÂÂByNNNäççc±XÈÌÌ”£kÖ¬Ád2ñî»ïòïÿ›¾}û6*~7qttdðàÁlذ¿üå/8995:FJJJ°X,”——ËëÚ¶m‹Éd",,ŒuëÖa0˜;w.‹/&11I’P*•ØÛÛSPP€ÅbáâÅ‹òó]\\(((Àd2Q^^NII €<$ëñÇgÙ²e¼öÚkr]´?2…BÑè÷|íµ×èÝ»7‹-âÃ?$((è†ç$%%qîÜ9–.]J§NpwwolAAAhfšìª_«ÕRVVÎ÷ß«h¸¾•@¡@\»Þ½VWW’Àb© uë(ÑB·àúác¯¾ú*ýúõ»åBÑáááÌŸ?_ñ¸¿VÚÇLJӧOSPPÀÅ‹åbÆqqqüç?ÿaÕªUH’DZZmÚ´ _¿~,_¾œ¶mÛrúôiùÂÞÝÝ3gΰwï^ÊÊÊHOO§GwmHHH¸a¹ÞÞÞ¬X±‚-ZÈõ®®ÅþÚ¿nnn°oß>ÊËË9qâ;wF£ÑЭ[7>þøcZ·nMzzº¼ï^½zñùçŸc0¨¬¬äÌ™3 'EµgggŽ?Îùóç=ç,,,ŒÏ?ÿœèèhbcc àüùóÔÔÔ››Û(!y111äääsW7AAáÖ¨ÅÕ‡P'ôé=9¾{Ñh¼åäçåÒ*8ä¦wÕs²³h‚½=µÚ;;ìí]±·s¹úÿÆ;;Z´$.®6:ÑJ·A£ÑÔ¨×ÅÍèt:"""nX®V«ñööÆËËë'·®{©TxyyáííMpp0……… âââhݺ5QQQèõz<==)((ÀÑÑ‘îÝ»Ž»»;-[¶Ä`0PQQAçÎ #22___yÖ,ooo:wîLxx8®®®wMì”J%„††Þô8 A¯×@uu5ÄÇÇ7êÕríõõõÅjµråÊ<==åx¹»»D]]•••tëÖ"""ðòòÂÍÍÜÜ\¼¼¼èÒ¥ mÛ¶ÅÝÝ___ŠŠŠ0›Íôèуààà?dñu¥R‰››-Z´ E‹dffÊCãÂÂÂ(**¢¦¦†ððp¢££‰ŽŽF§Óáé鉯¯/F£‘½{÷Ò³gO¢££EbHá.RS]MiI ^Þ>7¬3™ŒäçæÒ"0è–ö%I•••defÒ©sgL¦¯Š iô‡œÅSá÷v4#µ(ÕH’tõf‹IB^€Åˆ‹•=ååìÝ»×z6㜰^}˜®>ê: ¨½úÿkzÀxݶ–«†>WOï×~¿k !ÅÕ$‘næ«3 §LfW]UuËG¾9DßÄ u7¬ß¿w}¢ÕéÄÑ ‚ð!I»víbûöí̘1ã–{ ‚ E…\øîѱínXWSSÍ‘C‡ˆïÙë?+ a‚˜ÜK—ؚʄ‰“¨©¹±dAúñcÄ÷ìF£ÁAø‘Å¡söµ ‹‹ÕŠÅ"a0š±X¤†Ÿ­W“DÆj‚œM ìLvV¯¿þºi}òÆrÀLC’§–†dPP \Š’«Ò«ëªù!it-Qd¦!A$q]’¨I†’Y­Ö«Å¥A„?‚3f™™ÉK/½„8G ‚ ÜeîÖÚ„‚ Âo¯IC•••M&rr²1šLòr­VK€€¸S-‚ÐÄþïÿþOþEE…ˆ Â]¦ººFAA¸%MV|:;;‹-[7âªwF¡P`µJ”—UÒ¿ÑQÑ¢%AAAAšX“%†Œ&#.®´ öÅXo@©Tc±˜Øœ²‰öݰ}Ll,ݺċAAAA¸CÔMùb&“™ÒÒjjj°Z$œmpr²G²Jò\õ×fÅÙ·w¯H ‚ ‚ ‚ ‚ ÜAê¦}¹†)ØL&3¿¿Œ·? EµPV^LË–¾˜L&Ñ:‚ ‚ ‚ ‚ wP“&†$é‡Ê|}˜:efó •JÍÒeK¨­+-s6oÞÌ•+W䟈̶iÓ&† "ñ+ÕÔÔ°fÍš†‘Z³³3aaa„„„ V«E€nAaa!999têÔ©Ñòƒ‚F£!==ž={ÊÛ=z”:àéé)(‚ ‚ ʦ|1«ÕŠÅbÁb±PZZBFÆYùQTT€ÑX/Zæ6üç?ÿÁÝÝ///¼¼¼Ðjµ"(Mà³Ï>AøTVV²uëV¼¼¼ÐëõÔÖÖ²aÃRRR0"@·àÒ¥KìÙ³ç†å;w €’’¶lÙ@QQ .¤¼¼F#‚'‚ ‚ ÐÄ=†, õ†zêëëQ«°³³ÃÍÍ I’°±±Ájµb2™‘°Z­(•JÑJ· !!FƒR©D¥R‰€4¡òòrÖ¯_ÏW_}…N§cøðá$$$P[[ËK/½DëÖ­9rä<ûì³`6›III!99|ðA:uêÔìÚÎËË‹Aƒ!IF£‘sçαuëVBCCiÛ¶-ÙÙÙ,Y²„ììl"""xúé§±±±Áb±ðßÿþ—õë×£Ñhxàˆ=nB’$rrrX°`=zô !!Aáwýlª®®fË–-$''“““ƒB¡ÀÏÏ>}ú””D@@Àoúš;wîdÒ¤I|ôÑGôéÓç7ÿ› €··7Ÿ|òÉÏn·uëV¦L™‚Åb!00­[·²hÑ"æÍ›‡ÕjÅÆÆ…B-[¶dðàÁ 8¹ëÍ|ôÑG,X°@ÞÇõ¬V+#GŽäÅ_¼åëŠÂÂBž|òI&NœHee%={öÄh4òöÛo3xðà›>/%%…iÓ¦1vìXžzê)t:¼®´´”„„¬V+sæÌ¡ÿþâpìÚµ‹gŸ}³ÙŒN§C©TâììLtt4>ú(QQQ?{ÝŽ^x­[·’žž~Çÿ®œœŒÉdâßÿþ7Ý»wýgN Õ”•©(¯ÂÖVËñGÙ•º“ËEE hj&I H’‚]©;Iì'N¿$44”gžy«ÕŠ¿¿?C† ¡]»v"©ÖDöíÛGPP>ø —.]bíÚµøûûãããÃ÷ßÏðáÃyì±ÇHMMeþüùÌš5‹mÛ¶qâÄ Þ}÷]rrrHNNÆÛÛ›–-[6Ë* t:mÚ´áðáÃäå寒%KèС“'OfÕªU,^¼˜‰'’ššÊ‘#Gxýõ×)--eݺuxzzÒ¦Mq@þÈ÷ßÏÂ… ILL¤wïÞâ¼ ‚ üîI¡³gÏòÏþFÃôéÓiÕª¥¥¥¬^½šéÓ§³gÏV­Zõ›¾nuu5gÏž¥ººúŽ}ÞÖ×ÿò¨‡{ÔÔTæÌ™Ã¾} 33ÿýïgëÖ­ìß¿ŸââbL&EEEìÛ·9sæðÙgŸ1kÖ,Ú¶mû“õ&L`Ë–-=z”‚‚‚FëŽ?~ÓÆ?åÓO?% €ââbœœœø×¿þEß¾}©¨¨øÉç%%%‘ššÊäÉ“xâ‰'°·ÒèËÐ IDAT·@¯×óöÛo³{÷n‘ºƒúöíËСCyýõ×¹té:ŽÃ‡Ëß?ýôS ð›¼V~~>MòwµhÑ‚—_~™‘#GÞ±÷°H 5!“ÑŠ³“­Æ€ÓgŽÑ£{´Z\í!dmÈqî\EEE¢…nÁk¯½@]]dÕªU´iÓ;;;œ&À©S§Ø¼y3F£‘¼¼<***ðññ! €ž={¢ÑhèÕ«_|ñ'OžD©T²mÛ6Ìf3YYYTVV6ûX*•J …\‹,77—©S§booÏ<À3Ï<ÀÙ³g±X,¤¦¦b±XÈÍÍ¥¬¬LŒ7Q\\Lpp0z½^CAøÝUTT°dÉJJJXºt)­ZµÀ××—gŸ}–+W®pñâEyû²²2¾þúk P*•Ò­[7lmmXµj¥¥¥àèèÈ÷ßJ¥"&&†¨¨(Ôj5UUUlݺ€-[¶péÒ%äž/—.]âСC”••akkKDDíÛ·¿áóôàÁƒ¢R© ¤]»vèõz¶oßNEEJ¥’ùóçðÀàææö«b¤Ñhð÷÷gÔ¨Q´lÙ’'žx‚%K–ðÊ+¯àìì|Ûû‹%66–ÔÔT222ððð`Ĉ¬_¿žÂÂBBBB~³„³³3o¼ñ:Ž1cÆàèèxÓíêëë9yò$gΜ¡®®:vì(×J-//çóÏ? ]»vdeeQ[[KÛ¶mñõõ%--òòr¢££‰‰‰‘Ëi˜L&Î;ÇÉ“'©ªªÂÕÕ•öíÛÔ¬zç+•J<<GŽáÊ•+h4Ú¶mKLLŒÜËÌb±pñâEŽ=Jyy9îîîäååÝð7FΜ9éS§¨­­ÅÝݸ¸8ÄÍÐÛ=^šòÅ‚‚ˆoO·®QtëEhˆK-¥¥E”–Q^~…ÊŠb**Š ðÃÆF'Zè6ØÚÚÒ¹sg***ä:N·gÏ8€ÙlF­Vc6›åø+•J¹ž‹Z­–Oª×ÚK£Ñ`kkKRRþþþÍ>–eeeTVVâââð³]]mlläø%&&Ê_,›“kÇT]]¼¬¶¶I’äau‘‘‘ÄÇdzzõê&»«#‚ ?%//íÛ·Ó½{w¼½½oXÿä“OòÄO õ_yåV®\I]]555,X°€yóæQ[[+ך0a/½ôGŽÁjµ²qãF^zé%Nž<)Ÿ¸ö¹¨V«Ñjµ†Ÿ¿öÚk¤§§cµZIKKãùçŸçøñã’Y/¾ø"+W®Ä`0P[[Ëüùó™7ož¼O…BB¡@«Õ¢Õj“á: …‚6mÚЧO¶oßþ«nšÏœ9³Ñ÷†·Þz‹·Þz«QêÙgŸeùòå¿Yÿãÿ@¯×óÖ[o±råJ¹­~ìÂ… üë_ÿ¢¨¨«ÕÊÇÌ;ï¼#÷xR(¤§§3aÂæÍ›GEEÉÉÉLš4‰?ü²²2¶lÙÂK/½$Ç1›Íìܹ“×_óçÏ#Iß~û-3gÎäÌ™3r “æÆjµ"IJ¥ƒÁÀ§Ÿ~Êo¼Ayy9&“Ix­—ØÁƒ™3gÎ$%%E>L›6­[·b2™(--åÍ7ßdåÊ•r¯»“'Oòâ‹/²oß>¬V+/^$99ù†¤Ð¦M›˜5k¹¹¹H’Äþýûyíµ×ÈÊÊ'ÛÛ½®hÊ«70›L\{?* T* öö×g¾%$IAIIZ­H ÝŠU«VÑ£G\]]Ù¹s'NNN¢ÖJºxñ"ÎÎÎ$%%‘‘‘qKÝcbb8zô(½{÷F«Õ²gÏž[ê~|·2›Íäää°~ýz$I",, ¥R‰¯¯/;vì OŸ>¬\¹’¸¸8"""8xð ݺuÃÉɉýû÷7JŽ4îîîÔÕÕ±k×.yÜþŽ;$ WWWjkkqpp`À€8;;3oÞ<&L˜@dd¤xã ‚ ¿‹ÊÊJ233ñóó»iÍ»€€¹¾ÐºuëØ¸q#Ë–-£GH’„‡‡/½ô‘‘‘ 4ˆûî»î¿ÿ~ døðᤥ¥Ñ®];HLLdþüùôïßÿ†9Ï>û,>>>899QTTDbb"‹/æ£>’¿kïØ±ƒ%K–È3}¶hÑ‚E‹ Ãwœœœðññá±ÇûMãåàà@`` ÙÙÙÔÔÔüâö%%%tèÐAþ9;;›éÓ§гgÏz<ø7¿nèÕ«ñññ<þøãÌœ9GGG¹‡Òõyå•W@«ÕâååÅÓO?MïÞ½2dÎÎÎ$$$°hÑ"ºvíÊC=„ ãÆcäÈ‘Œ=gggÆŽ˹sçˆŽŽ¦°°?üàà`Æ»»;999<ÿüó,]º”·ß~»Qí£»=tåÊ<È‚ 0 <ñÄ=z”… 2räHžzê)T*GeìØ±,[¶Œ)S¦°gÏRSS™6mÝ»wÇb±˜˜È¨Q£ˆŠŠ"$$„o¿ýö†cþƒ> //©S§EMM F£‘óçϰxñbNž<ÉâÅ‹‰Åh4R]]Í‚ ˆŠŠ"..Ž÷ߟÒÒR^}õUZ·nMyy9ùùù|õÕWòëdffòÑGѽ{wÆ““.\`âĉ,_¾¼QRTø%†<=<1ÔK$oÜd•øq®VÅÕþK’üüü2d¨h¡[Á;ï¼CII áááLš4Iî^+Ü µ°î 2„O?ý”ñãÇFxx8ööö¨ÕêF½€ -Z´`àÀhµZ¦M›†Ùl¦wïÞ8884«j4òóó1b???èÝ»·|üþýïgñâŬ[·Ž¨¨(ž~úi aøžZ­æ7Þ ¶¶–îݻӹsçfwððónÝ:Ö¬YƒB¡ &&†±cÇâããÃ¥K—ðññA§ÓÑ«W/ôz=«W¯F£ÑкukñFA~7·Ò£fÛ¶mX,ºuë&÷ÀîÙ³'¹¹¹|óÍ7 4HÞÖßߟ   ¹ˆuMMÍ- ÓÏÎÎfîܹ>|Xîù“••EZZš¼MJJ *•ªÑï1dÈŸ,Â|§¾{Þ ½^ÏáÇåŸGÝäm«T*åz6O?ý4O>ù$ …¢Ñ2«ÕJjj*ï¾û.%%%¨T* 72ŠîîîX­VZµj…½½=îîîÔÔÔ`0¸rå ûöí#&&†üü| °Z­èt:’““yõÕW›Mbèž{îA§ÓáììLûöíy÷Ýw gÉ’%œ={–^½zɱˆ‰‰ÁÉɉääd¦L™‚»»;ŽŽŽ 2„øøxˆ¿¥ZUÉÉÉôîÝ›¶mÛ¢R©prrâå—_–×oذOOO¢££Q«Õ¨ÕjºuëÆÛo¿Í¹s爋‹cãÆ$%%ŠJ¥B¯×Ó±cÇF¯séÒ%Ž9 AƒÈÎΆ i4V¯^-CÔį¯Oÿ‡ˆøÅ{ï½'Ñ„ÌYYYò—ÀÀ@ùNÌ]¿ÜÆÆ†×_]þÀìׯýúõk¶qtwwgݺu¿˜ø¸VCëÇ_&{õêE¯^½šýñتU+žþùŸŒßµdÚµsETT”x ‚ ¿GGG),,¤¾¾þ†›™{öìÁÎÎŽN:Q__ßhx44ÜX²X,˜L¦’¿føÖÇ̺uëXºt)ƒ ÂÖÖ–¸¸¸F=¹ C£áh×¹Óª««ÉÎÎ&((H.äüs E£Ú*«W¯þMN¿&9Ô£GfÍšÅË/¿ÌäÉ“:t¨œ2üóŸÿÄÕÕ•O>ù„èèhNž À8räsçÎ%""I’°³³ÃÓÓSÞ½½=*•Šœœ4 ÿþ÷¿yðÁ?~ù$sçÎeÛ¶m :”³gϲjÕªFGhh(ƒ bÕªU´k׎Ž;RTTÄ‚ nZ¿Løy z ) ›ùêŒÂ)S§ÙUWUÝÒ$IâÈ7‡è›8ƒáÆ7Ûþ½{è›8ï3/²üã%¶±µ±ã¡1! ¡ ‚ ‚ Âo¥¨°€ ß#:¶Ý ëjjª9rèñ={ýâ÷|h¸£Ÿ{é»SS™0q557N´‘~üñ={Ë5x~i¿¥¥¥lܸ‘/¿ü’ÂÂBILLdüøñòp#I’8}ú4|ðgΜA¥Rѹsgžyæ|||P(Œ1‚'N ÑhxõÕW¹ÿþû騱#hµZ–/_NÇŽ)((àƒ>`Ïž=X­VÚµkǤI“°··gÖ¬Y¤¥¥áîîNRR6l ??ŸQ£FñÊ+¯ I‡fþüùœ?[[[FŽɸqãäá8›7ofΜ9TWWãââ˜1cxøá‡oøÛ·nÝÊäÉ“1™L³uëV-ZÄ{gÅbÁÁÁ…B­­- <˜âììü³C×>úè#>üðC¬V+‰‰‰|øá‡7ÝîòåË<÷Üsœ;wwwwxàfÏž$IL™2…Gy„>}ú——‡V«eÞ¼yÄÅÅÑ£GêêêäZ=ÁÁÁ7ì;%%…)S¦ V«Ù¿£šB‹…Ý»w“››Ë#<‚ÕjeË–-Ì›7²²2‚‚‚èÛ·/sçÎE§Óñé§ŸâææÆ½÷Þ‹Á`ÀÆÆ†µk×2bĈF?9Rþ½6lØ@HHååå$''“œœL~~>nnnôïߟ¿þõ¯w£]»vñôÓOc4 `×®]7}ÿ]¾|™åË—³}ûvŒF#aaa<öØctéÒ•JÅ;ï¼Ã’%KäY€‰eÒ¤I ½ŠfÏžÍÅ‹±³³#))‰'žxþûßÿ²bÅ rrrðõõåñÇgÀ€¨T*Ìf3ûöícùòå\¸pAž¡y̘1¸»»£P(¨««cË–-¬X±‚‚‚BBBhÙ²%«W¯ÆÆÆ†Ý»wãææFii)«W¯fóæÍãááÁ AƒxðÁåYŽÿ(o8„ÎÙÔ6X,V,V+‹„ÁhÆb‘~¶Z‘$ŒÕ9›Ø%˜ì¬,^ýuÓúäå€0µ@ P”—b äê£ôêºê«ÛÕõ€ñê>,€X¯þÛt‰¡é'øjßv¢¢ZËSyŸ:yOÏ€›Aõññ%(0H|ª ‚ ‚ Â]”Ahnþ艡&­¾e2™((È£¦¶•R…­­š¬ì 2³2mgµZqrtçùÉ/ˆ#HAAAáiÒÄ$Y1™MÔŒdea6[Q*U4$©ºFÚÙÙвe™ Eë‚ ‚ ‚ ‚ ÜAMœjxX¬VÜô><=éÙFUð +þó)õõÕ¢en“Ñh¤ªª ‹Å‚öööM2…fsVRR‚›››įd±X¨ªªúÙñ¿&“‰ºººß¤ØâÝú¾¯¯¯o4† ²²[[[4 F£‘ššL& …ìììäY9, •••(•JMq+‚ ‚ Âݯ‰Cf³ ‹Å‚JmƒR© ¬¬L^ïèè„Z­¡¶Î(Zæ6 V­ZűcǨ­­%,,ŒI“&¡3ÁÝQ>ø Û·oø• ™>}:Ë–-ûÉmÒÓÓY·no¾ù¦ØM¤¥¥ñßÿþ—W^y¥ÑòY³f1bÄÂÃÃÙ²e ¤¼¼•JEË–-IJJ’gRÉÌÌäÍ7ßD«Õ2sæLyšPAAAš‡&M Y,Ìf3&“ö˜L&jj~˜JS§k˜VÎd‰¡ÛñÕW_‘Í /¼€‹‹ Çwý›Õj娱c¤¥¥aggG||<-[¶=¶n3†ûöíãÌ™3¸ººÒ³gO|||n8lß¾ììl<<<èÓ§è±õ ._¾Ì®]»˜8q"¡¡¡ Μ9#Ÿ, RYYÉ÷ß/C‚ ‚ ‚ÐÌ4iö@B¢¾Þˆáj ƒ¡Žýö³vÝZÖ~±–ÅKóíÑ4ΟϦªºšôô¢…nÁ¦M›pqqaöìÙüë_ÿÂÛÛ[ž:S¸óNœ8ÁêÕ«qqq¡²²’Õ«WSPP s8ÀÆñôôäÒ¥K¬]»–ªÍŒ¸k×.vî܉§§'¬]»“É$‚÷3 õõõb0ptt¤sçÎDFFP__OZZ½zõ¢OŸ>ìØ±CMAAš™&M åå^&ãl.ÙÙW8wî,Ÿ|ººÇ·§G8ºv‰æþû“5ê><=õ|säÑB·×¼<Ìf3ãǧE‹,Z´ƒÁ ÓDöíÛGÇŽ>|8£GÆl6“••%sRRR6lÆ c̘1dff6f °zõj{ì1† ÆÃ?Ì¡C‡0EïŸãããÃÃ?LJJ =ô<òk×®•{jfff’““C›6mˆ‹‹ãĉ"©)‚ ‚ ÍL“v+‰‰‰ s§X,‹¼Ìdª§¼¼«ÕÒhÛønÈÏ/-t œœœ7n...²mÛ6L&¶¶¶"8M ªªŠ˜˜Ôj5NNNhµZêëëE`nCYYþþþ¨T*ÜÜÜäa§×+))!00•J…§§'uuuŠ×7G*• I’0™Lh4š«çT’$¡T*ÑjµôêÕ‹^½z!I/^ä“O>Ád21zôh>ÿüsJKKùÇ?þ€ÙlfÕªU<óÌ3b(¤ ‚ ‚ 4Mš2›ÍTV•a2¹6E½BÍõE’%$©áb[O¾5;w&==Î;sñâElllD¡&äïïω'h×®—/_¦ªª ggg˜ÛÌþýûñññá»ï¾C­VcccÓh›ððpRSSéׯ'Nœ@¯×7ûãÜÙÙ£ÑÈñãlj‰‰A’$Ž;†$I899QUUűcÇhÓ¦ z½½^——µµµäææRPPÀŠ+ppp ¸¸˜©S§RTT„···80AA¡h²Ä½½=EEÅ]þ‰»ü I"h˜ÒÞÙÉ•þ‰÷ˆºÇgñâÅ$''c48pà Õ“À'Ÿ|ÂË/¿Œ$IÄÆÆ,ó+Žá´´4$I¢G¸¹¹QXX(oóðÃ3þ|vìØÕjåÞ{ïmöÉã-ZÐ¥KÖ¯_Ï矀 ={öÄ×׃ÁÀñãÇIIIÁ`0 Ñhðôô$11‘­[·Ò½{w9)àââBDDûöícĈâÀA„ßÁ–-[X¹re£eãÆ£wïÞ?ùœ/¾ø‚7ÍóÏ?ÿ»üîŸþ9[·n@©Tbgg‡¿¿?=zô >>•J%Xþ€š,1ʤ‰Ï5‹ý©Ñ×F.H ÕjÅŒC·ÈÇLJñãÇSYY)_ø‰âÓwV]]œ”ð÷÷ç©§ž¢´´•J…‡‡G£‹máæ Z­hè1ôÜsÏQQQV«ÅÓÓN‡Ñh”‡H…‡‡3mÚ4jjjÐétxyy5û/vvv 8:P[[ 4$áÝÜÜÐéthµZzè!ÊËË1¨Õj\\\äLJ›ªÕjÆŽ‹Õj¨ ‚ üNΜ9CTTIIIò2__ߟ}NÏž=iÓ¦ ÷ß?¯¿þúïö»'$$ðþûïóÞ{ïáàà@UUYYY,[¶Œ­[·2yòdq'@M–=Ðjµøü?{÷U™=pü;=“Þ{H%A„ m)"MD@WDWÁ¶û±³‹ºêÚu×UY)‚TŽ  „’Ò{2}îﻄÀBvAÎçyò$3÷Î{Ï-™{æ}Ï!¿DBCC •@\'Nœà«¯¾¢wïÞ@ÃÈOÝtÄÅÉÌÌdÕªUtëÖMáÙÇðX¿~=;vTç¹Ð‡¢k‘Éd"**êœÓ´Z­š:×5ã\Î5¯B!.¯èèhõ3PKîÌf3±±±êó•••äææb³Ùðññ!66VíY““Cqq1:tàäÉ“X,¼¼¼ˆoÒ*»¾¾žœœêëëñðð U«Vøúúžs=ÂÃÃñòò¢C‡êgŠÞ½{3nÜ8æÌ™Ã_ÿúWf̘¯¯/n·›ÒÒRN:…Ãá ((ˆ¨¨(õ‹CEQ(//'??»ÝŽŸŸ­Zµ’r#B\—%1d³ÛQ$ÖâWâ»ï¾£¬¬ŒÉ“'K‘éÿÒºuë0ÜtÓMçáš5k§ÿþg!„¢…‡á*väÈ>ùäœN'íÚµ£K—.xyyµx9o½õyyy˜L&E¡ÿþLœ8€;w2}útž}öYŽ;FMM •••L˜0Ñ£G I¡¹sçrôèQ\.ƒèèhzè¡ tc2™?~<ûÛß8tè©©©dffªa¸\.<==éׯÆ Ãh4’——LJ~HYYŠ¢àááA¯^½5j”š<Bü<.KbÈR_OÁ©vìØN]]­ú¼——7½zö&,,Lö„¸j :”¡C‡ªÿ,EËMš4Iýû|1œ6mÚçB!ĹY­ò¥ÊÕJ§Ó‘­¶î]±b'Nœ`ìØ±-®#š””Ä]wÝEdd$GŽáé§ŸVC'NdΜ98Nžxâ ¼½½Ù¾};³gÏVC6l 33“Ç{ŒˆˆÊËËùðÃY¿~=#GŽlѺ„……áëëKqq1N§“+VÅÃ?Œ··7»wïæóÏ?§U«V$''³lÙ2¼¼¼x衇ð÷÷'33“%K–OJJŠ(⪖wò$EÅE¸\n‚B#ð þÅÖç² éSXXHÁ©Â#üˆˆô#,̇‚‚ò òä¨B!„Bà¶Ûnã/ù S§NeÚ´iÜzë­ìܹ“‚‚‚/küøñÄÅÅa4IJJj2°G£1cƈÑh¤wïÞäçç«Ó¾ùæn¹åZµj…Á` ,,Œ;U«Vµx] Z­‡ÃÓéd×®]Œ=š€€ )))ÄÄÄpàÀÖ¯_Ïm·ÝFHHƒ„„’““Ù½{·$âªLl\<ѭ∌‰ÅÛÇ÷]ŸËVcÈív¡×k°Úª¨¯«C¯7`4jY²ô–,]Ä¿+O($'§0iÂírÄ!„B!®g÷¦èÚµ+}ô•••-ZNVVï¼ó»wïÆb±‘‘Ñl¾€€õo“ÉÔdŠÒÒª`”‹ IDATRî»ï¾fu}ºtéÒâíª¨¨Àb±àïï¢(TVV6)Dm2™0›ÍÔÔÔðã?2räH4šß'j4î½÷^9HÄUO«Õ¢×ép¹´Í/º>—uè*—Ë…Åb¥®ÞBeE)z½‘øøõ„7ôøúzsäp¶-âšS[[ËÑ£GÕ¢Ìÿ‹ôôt–À^„ÇLHHˆC\ßÿ=;wnÖ  ±°f§N®èõ¯®®&;;›®]»ÊÎBˆKäÔ©Sœ8q‚믿^e¸¾¾N×âQ‡ß}÷]xþùçÕs[Ú+&&†Ç¼ÉgÓÒÒR>ÜâûÀ;v`µZi×®† hÕªÐ0êoMM ááᤥ¥ñÞ{著ÍÜn7™™™(ŠT¯W¿â¢B q¹º’…„EüË &¥ý%ÞÔårSW§Ò5NI=èÜ©’ºÓ)©;µµ,«)âšTZZÊâÅ‹–e}õÕWdgK‚õb}ýõ×dffJ ÄϪªªŠ•+W0þ|ªªªšÍsâÄ ¾øâ‹+~[ Y¾|¹ìT!„¸„ÒÓÓyôÑGÙ¶mV«•ªª*>ÿüsüüüZ<±ÛíF«Õ¢( õõõlÞ¼¹Å­ŽFÍŠ+ÈÉÉÁápŸŸÏo¼Áž={.øZEQ¨««ãÈ‘#|ðÁ|õÕWÜpà DGGc0HKKcÑ¢Ea³Ùؼy3'OžT¿€5jŸ|ò EEE8~úé'fϞͱcÇä@W½VqqtëžJç®ÝIêr=Á¡á¿èú\ÖCn·‚ËéÄåráïÀÁCšŒ6d4ÉÍÍ¥®¾TŽ”xþùç›\ M&o¾ù&žžžœK,??Ÿ… Ám·ÝÖâor®eeee<úè£Mž»îºëxì±Ç$8éÈ‘#üøãjÉFóçÏ'-- ³ÙÌêÕ«™:uª:ÿÊ•+¹õÖ[iÓ¦غu+sçÎÀÏÏ!C†0dÈŸm´+¾%Bˆ+GBB½{÷æõ×_Çb±àççGRR'N¼`«f§Ó‰Á`PßsÏ=¼ûî»,[¶ ³ÙL·nÝp:L›6÷ߟ·ß~›ôôt¦NÊÂ… xì±ÇÈÌÌdæÌ™¼øâ‹¤¦¦R]]ÍóÏ?O^^F£‘®]»rçwžsÞ{ï=öíÛÇÈ‘#1 ˜L&‚‚‚èÔ©>ø ‰‰‰hµZ´Z-·Ür .dÚ´iÔ×ד˜˜È„ ÔÏ(#FŒ`Ù²eLŸ>’’¸é¦›èß¿¿(⪗™A^^n·‚DFÇù‹­Ïe½‹U7.· —Ë 4´Ž8yò„:½±Ù Í&-†ZbÆŒ¸\.víÚÅáÇÑét˜KÌívsðàAl6Û·o禛n"00hh.[YY‰ÕjE§Óáï6›êêj4 6›¨¨(l6•••¸\.êêꀆV&“Iír¢( øøøàr¹¨ªªÂétb4 B«ÕRQQF£Áb±4éÞømÍfÃÏÏïŠI^ÙívÌf3¯¼òÊ¿/Hz=V«‡Ã——Z­§ÓI}}=^^^8Nªªªp8 ‚‚‚ÐétTUU¡( 6› —Ë…——F£‘ššœN'^^^øøø Õj9uê&“ «ÕªÆOsVŸ^‡ÃAUU6› ³ÙL@@@³y®555œ5ª¬¬T»7œ½-l6›ZO¢q½êêê ¸¸“ÉD]]z½þœÛáv»ÕùêëëÑëõ¡×ëq»ÝTWWSWW‡V«U×ÛårQVV†Á`P÷‘¯¯/‹EÝÆÆe@CÞêêê&ËBˆ_Jtt4/¼ðv»—Ë…V«Åh4b4ÏùY¤wïÞ|þùç‘‘‘A||¼:-))‰·Þz ‡Ã4| ?cÆ u9S§NeÊ”)MþÇ<ûì³üñT¯‘F£‘áÇ3`ÀœN'Z­“ÉtÞ/Pî¾ûnn¿ýßub5M“m8STT<ò6› ·ÛÑhÄd2©ë¨.¯ñ§‡‡‡|+~ââÛ‡ÕîÄåVPÐðKv’¼Ì5†ÜX,6,õVL&_Ìf3nÅM]m «•ÂÂSÔÔVbwh(--•ú(¡±eP]]¤¦¦þlßv‹ó«®®&##ƒpèÐ!6oÞÌØ±cسg[·nåÔ©S¸ÝnzõêÅÈ‘#9t课ú*IIITTTðâ‹/ò¯ý‹Í›7«ÿì\.+V¬ ((ˆo¼½^Oii)ï¾û.“'Of÷îÝ9r„ªª*´Z-wÞy':ubΜ98\.;vT×3??Ÿ+V ×ë™0aB“"¿4N‡O“çŽ9¶mÛ0`±±±ìÞ½›¬¬,nºé&6nÜHzzºšš8q"=zô`Þ¼y`4©ªª"00¨¨( (++#22’I“&Ãĉ¹á†(//G«Õrï½÷Ò¾}{õýN';vì`ݺuX,Ìf3S¦L¡mÛ¶WåqjµZÙºu+6là C‡ròžÅd2áããCBB]»v%/¯a´ÌŸ~ú‰Å‹«F'L˜@·nÝHOOgåÊ•TWWãïïÏ AƒHKKcõêÕlß¾­VKDD“&MÂívóꫯòöÛoðÉ'ŸP[[‹ÛífРA }úP\\Ì’%K8yò$Š¢Ð£GFŒ———œBˆ_„F£9gå||}}yõÕWIIIaß¾}L˜0¡É²Ìfs“„÷™uîΞœóú§Õj/úºèááѬ–Þÿ²­ƒ¡Ùÿ!~ >ïhÑ+4.—ÛëŒÂï¿êÄPyE5å.êjë0l|ýõ—TT–át:@£Aq»ñõ3ãëEnn!Ûwlcô¨1rÔ\¤ŒŒ ´Z-­[·¾"[7üÚPYYIÇŽ‰å­·ÞbèСxzzb·Û¹å–[ˆŠŠ"//>úˆ¾}ûàããäI“hݺ5yyyìÝ»—»ï¾›øøxæÍ›GVV©©©,_¾œàããÃÞ½{‰'88þïÿþ///öíÛÇÒ¥KÕ®*áááÜ}÷ݘÍf^{í5Ž;Ɔ ˆ‹‹ãÆoT¿µ¿R?~œ9sæ¨cbb=z4,_¾œÎ;“‘‘¡¶Æ2›Í<ôÐCøøøžžÎ¢E‹èÑ£AAAÜsÏ=(ŠÂ;ï¼Cii)÷ß?ƒyóæqøðabbb0 8ääd¶lÙÂâÅ‹yæ™gÔu¨­­eÆ Œ3†N:±iÓ&>ûì3žx≫ò8MOOÇËË‹ñãÇ“˜˜('îPQQÁÉ“'‰ŽŽ`éÒ¥ >œž={²k×.–-[F·nÝ8zô(L:Um± ÃêŽ=š^½zQPP€ÙlnÖÊ&..Ž[o½•ÌÌLuyúôéÆ ÈÉÉ!**ŠM›6‘––¦¶ :óú}÷݇ŸŸGeîܹÍCîo¾ùfZ·nÍÚµkY¾|9O>ù$mÚ´aÛ¶m¬Y³†=z`·Û7nÑÑÑäçç3wî\úöí‹ÕjåÀL:•ØØXþñP\\ ÀgŸ}Fbb"7Þx#999ÌŸ?ŸÞ½{·øsÝu×1tèPÒÓÓùì³ÏHMMm¶½&“‰¡C‡’@zz:sçÎeÀ€8n¸áÚ´iCqq1óçÏ'//_߆/žFŒAûöíÙ¹s'sæÌáOú‰‰‰ìß¿Ÿ… Ò§OÖ¯_Édâ¹çž£¤¤„… ’ŸŸß$Y,„W²W^y…­[·RPP@ß¾}2dˆEqe'†BCBHLh«èåe&¦U6[íé祡ëKLt4ÅÅÕ²‡.’ÅbáðáÃDGG«Ý™Ä¥µaölÙBAA™™™ìÙ³‡¾}ûÒ¶m[–-[Fff&‡ƒÌÌLuhÍØØXZ·nV«Åb± ( íÛ·Ç`0п²²²h×®F£‘C‡‘˜˜ÈÉ“'INNÆËË fÏžMii)‡ƒúúzuzõêÕ䛟•+WÒµkWÆŽ{Evðõõm2Üic—­îÝ»óý÷ß3oÞ<¦L™¢6‹ŽŒŒäÝwߥ¸¸‡ÃAQQ‘úÚ믿ž€€E!<<œèèhµÅaPP:L«¿¿?)))˜L&úõëÇ‚ š¬“Ýngûöíœ:u ƒÁ€Õj½â¿©REMŸ=R‡‡‡V«•’’Ün·t3=‡¥K—²mÛ6ôz=mÚ´!55hè’׫W/<<<èÙ³'|ðÉÉÉäææòÚk¯Ëøñã¸ùæ›Ù¸q#ëÖ­£W¯^j‚éLýû÷Çl6“˜˜ˆÝnÇjýw×éÀÀ@ÌâÅ‹3f ••• <¸I€Ö­[óþûïSXXˆÃá8o‘ù˜˜Úµk‡V«¥C‡„††’€V«%!!Ï?ÿ€6mÚ°|ùr233±Ûídee1eʵ‹VÛ¶mÑëõôïߟeË–pèÐ!öî݈ p¹\dddàt:IOOçÝwßà¹çž»`ì €Ùl¦sçÎ|ôÑG8Îfó‘””„V«¥cÇŽj+¥ØØX¾øâ þö·¿a³Ù8qâƒÆ××—ððp®»î:´Z-×]wê2:tè .ãØ±c|ø9Ï3FÓ¤hºÛí&))‰¨¨(*++ÉÉÉ!88˜¤¤$:t耯¯¯óÆm×jµMjl)ŠBÇŽ %88XÝo:t mÛ¶ Ün7DFFʉ"®J–úzêjk h6Íá°S—G«Ø¸‹Z–¢(TWW“sü8=RSq8šß'Ò*6NZ® !Ä9ì=’‡ÞôzE9ýN—[-§£–„pÙñ÷pÓ6:ªÊJ¶lÙâ>|ä¨pŸþqœþ± ¨?ýwã °Ÿ1¯ëôOC ŸÓ—wõóÖ鄿t’ÈôüsÏ>þäSžµ55ýb÷® 2ôŒ.bÿ¶mË&ºuï‰AFÉBüÂEa„ ,]ºT‚!®ÈãóàÁƒÌ›7?þñW\±øŸÛoû[>üðCùHˆK¤¬´”¢SùtNîÚlZ]]-»wî$­_ÿ ^— !!›—›ËÆo¿åÁßÿººÚfóîÿqiýHwe!„8‡VîÄäz\®†È\.¥a¸ú3F%SPìµÄù9Ö³ 'rrxá…+V}^ 8iHòÔÓ ªÊb (;ýS~zZ-ÿN5&Šœ4$ˆÎH]–®d5?„â—f6›åz$®HÿûßÙ±cÓ§OW[|ýšyzzªõ„—âó·Ä@!ÄŹ,‰!???œ.ùù8õyƒÁ@Dd$^žÒýIqy|ñÅqE:³˜úµ q„3!Ä¥a;GK~!„â\.[ñ鬬L/Y€' AQjk-Œ7‘””n²'„B!„B!.³Ë–²ÙlúЮ},v› ­VGVV.Ÿù9ßíú®ÙüÉ]’IëÝGöB!„âšpèÐ!^}õÕsN{öÙgÕ ÎGQöïßÏâÅ‹™2eJ“Âû?·72oÞˆV«å¦›nâ‰'ž¸¨¸îÚµ‹˜˜.\ÀîÝ»ùóŸÿL`` ï¼óááá|üñÇÌŸ?Ÿ{ï½—Y³f±jÕ*6lØ€N§C§Ó‘””Äm·ÝF@@ÇŽãÞ{ïå†nÀ`0ŸŸOpp0IIIdggsòäI‚ƒƒyàˆ§¤¤„Gy„ˆˆâã㩬¬T“k'N$!!¡Ù(N§“ï¾ûŽÕ«WSUU…V«%((ˆÑ£G“’’¢&Ô„ø9\ÖÄÛíÆårár¹N_@Ê(,<¥N Àn·ÉžB!„B\Ó²³³©©©!99ù‚ó*ŠÂŠ+˜6m>>>ôéÓ‡o¾ù†Þ½{7™¯W¯^ 8öìÙÃìÙ³ÕÄÐÃ?Ì{ï½GHH·ß~;‹…õë×SXXÈ¿þõ/zöìÉàÁƒQ…Í›7«#LFEEñ§?ý‰~øë¯¿³ÙLÿþýÙ¿?7ÝtÔÖÖ2räHÒÒÒ0™L,X°€/¿üRM ýéOâþûï§{÷îÜÿý?~œ“'Oªëír¹¨¨¨ --ñãÇÓ­ÛÀèµ×^S“bß}÷¯¿þ:‘‘‘Œ5ŠÐÐP–-[†Á`ÀétâëëËã?ÎÔ©SˆŒŒdêÔ©¤¤¤ŸŸÏo¼ÁñãÇ  [·nÜxãÔÖÖòè£âv»yþùçÙ»w/O<ñƒ7ß|“ýû÷Oll,“'Oæ³Ï>c̘1tíÚ•úúz–/_ΪU«xøá‡ñððh²þ§Nâ›o¾!55•¡C‡°~ýz6oÞL\\ÁÁÁr‚ˆŸÍeM ¹\.l66› ½ÎÔéžžžê|B!„Bq­r¹\lÛ¶Ž;rÁù:D}}=×_=Æ cÞ¼yTWW«µy4M“:;©©©;vq+ IDAT¬Ér<==¹á†ðööÆÛÛ›I“&±sçN¬V+ PïÙúöí«&u:tèÀÆÉËË#00ÌÌL´Z-íÚµº˜ÅÄĨó_wÝu|öÙgMÞ»M›6\ýõ˜L&›ÏÎÌÌdÞ¼yÜsÏ=tíÚõ‚-f†NÇŽ¨ªªj2M£ÑššŠÍfãÅ_$""‚î¸ãL&€š,ˆE¯×SWW×d9iii5”G #&&†ððpµ5Puuu“ùûõëG×®]1FFŽÉÿýßÿaµZ›%†òòòp8 4///È÷ßOII‰$†ÄÏêòŸv:©©vQ]U‡ÙìÉÑ£‡YóÕj N5¶R’BŠ‚Á`⛵_3lèpÙKB!„BˆkJEE[¶láƒ>hÖÍèln·›E‹Ñ¥K²³³î¬…6mÚ°dÉî½÷^ÒÓÓyùå—ÉÊÊR‹YŸ]ÛU«Õ6ë¶fµZq¹\MžoL5 !**ŠǾ}ûHLL$44§ÓÉêÕ«Y°`¹¹¹8Nêêê¸á†š¼ÑhT3g{òÉ'‰ˆˆ@£Ñ\0IIIôìÙ€îÝ»7K$iµZRRRøòË/ùþûïyæ™gðó󠸸˜ °víZµ¾O^^cÇŽm² u¹:oooõ±V«EQ”fó õqPPUUUçlaµZY¸p!ëÖ­k¶½·ß~»œ âguYCuµ6 þ¾xzNvîÚBŸ>Ý0›êÍ­¸QÜ Ó³9qâ„ì!!„B!Ä5ç³Ï>#--ððð Λ——Gff&‡VŸw»Ý¬[·ŽI“&áííͬY³¸óÎ;4hžžž(Š¢¶0úO<==ÑétTVV4‚®©©i2_ÿþý™3g)))ddd0cÆ ª««ùðÃyúé§éÖ­&“‰­[·²téÒ‹ŽÇ¬Y³p¹\,Z´OOO’’’.ºÎNc±æ¯¿þšáÃØívV®\I@@S¦LáÛo¿%11‘   6lØÀ©S§xÿý÷‰‹‹ºÙý¯JJJ°Z­˜Íf R‹ŸÉËË‹iÓ¦ñ裪-†, P»Ä ñs¹¬«Ú¶cÈàÞ Ô“Áƒz’”ÔE±QVvŠÒÒÊË ©¬(¦²²˜øÖ±˜Í²‡„B!„×”ªª*¾þúk&NœxQóoß¾®]»òñÇóÉ'Ÿ¨?ÿüç? áûï¿ FE¡¶¶–µk×6 è|Zµj…——_ýµšZ»v-û÷ïo2_||}:ÿûßÕ–0>>>Üzë­¼üòËÔÖÖLdd$«V­bĈ 6ŒiÓ¦‘››ËàÁƒ™={6IIIÌŸ?Ÿ}ûö1mÚ4–,YBQQ ,à‡~àÍ7ßlV„zÍš5|ùå—üðÃj×°F-œ,XÀ¬Y³ÔBV«•ŒŒ Þzë-vîÜÉc=Fff&<ðŠ¢˜˜ˆÍfã‘GaË–-üðÃ,Z´ˆ¯¾úŠÔÔT²²²˜;w.žžžôîÝ›ÒÒRÞ{ï=ôz=}ûö%>>€ÄÄDÖ­[Ço¼Éd¢{÷îÜ~ûíFvìØÁüùóY±b={ö$44”ádzbÅ >þøc, ­ZµbÒ¤IDDDÈI"~VZ i`zþ¹g ò)ÏÚ³šž¢(ìÞµ“AC†bµZšMß¶eƒ† #ÿT> Χ´´Å šÓ« ¨I¢ÓËt7 Õ8aÂ$âbãd/ !„BÑE…§ÈÊ8Jçä®Í¦ÕÕÕ²{çNÒúõ¿àç|hh=‘—›ËÆo¿åÁßÿººÚfóîÿqiý4©Ÿ"þ{6› ·Û}Ζ$g³ÛíÔÖ6ìoooŒF£:Íáp¨É/// uuu8N4 X, ÞÞÞÔÔÔàp80›ÍMÞ_Q¬V«Z›Èd2ár¹°Ûíj÷2hhS[[‹··w“.R‡‹Å‚ËåB«Õb4±X,xyya2™(//WçõõõU»Y,, Z­???, V«Fƒ··w³cÎf³5+ÝH«Õâïï¯.S§Óáç燢(ÔÕÕa·ÛÑëõøøø`³Ù°Z­(Š‚Á`@Q85æþþþ¸\.5Îþþþ¸ÝnµUŸŸ:Ž?ü›ÍÆ]wÝ…ÍfC£Ñ`6›1h4š&ûÊßß_­QÔsEQ0˜Ífªþ*ôÁʘüÂAïËåÆåvãr)XíN\.¥á±Û¢€b¯%ÎÏÁ°žm8‘“à /¼àX±êóJÀ 8€z ¨Êb (;ýS~zZíéùê`?½  ­rܧ_¾C­ãâ™õÇgåˆB!„Bˆÿà|˜ÏÅh46IÌœÉ`04›æããÓäñ™£a=íL‰Œ %«“-çZ—³“8g.ë|Ûpö{zzzª#£/vŠßÙËlL2—³G ;_̵Zí|\YYɾ}ûp:X­Ösnë¹öÕÅÆ\ˆÿ•^B „B!„B\‹…°°0êëëÏ›â—"‰!!„B!„≈ˆ`Ö¬YqŒΉB!„B!„×(I !„B!„B\£¤+™B!„¢Å–-[Ž¢¸INN–`!ÄULCB!„Bˆ EQ<==±Ö×I@„â*%‰!!„B!D‹õï×Oý»¼´D"„W)©1$„B!„Bq’ÄB!„B!Ä5JCB!„Bˆ[°p¡A!~$1$„B!„h±åË?cÞ¼ù!„¸ÊIñi!„B!D‹Ùív¾øòK¢c¢ €!ÄUJZ !„B!ZÌÇÛ›{îùƒ”`!ÄULZ !„B!Zì`@ÿþ!„¸ÊI‹!!„B!D‹IRH!~$1$„B!„Bq’ÄB!„¢Å4 z½T¦Bˆ«$†„B!„-¶jÕçh´r;!„W;¹’ !„B!Z¬}ûv8ìv „B\å$1$„B!„h±¨¨(Ìžž!„¸ÊIbH!„BÑbŸ,Z„¥¾^!„W9I !„B!ZìÁÀh4J „â*'‰!!„B!D‹ýýïïãv»%Bq•“ÄB!„¢Ån¹e.—K!„W9I !„B!Z¬¬¬“‡‡B!®r’B!„B´Ø°Z,!„¸ÊIbH!„BÑb·Ü2NZ !į€$†„B!„-öâ_þ‚Ãn—@!ÄUNCB!„Bˆ{ú©§Ðh4!„¸ÊIbH!„BÑb[·nC¯×K „â*'‰!!„B!D‹i4`³Ù$Bq•“ÄB!„¢Åúõë‡ÙÓS!„W9iû)„B!„h±ç_x‘§Ÿz²E¯©««£¸¸˜úúzEÁÓÓ|}}/k·´ššjkk‰ˆˆ¸äŸOYYþþþ´jÕ €ôôt¼¼¼ˆ‹‹kÑò***ÈÍÍ cÇŽèt:9…ÿI !„B!ZlæÓO¡Óéq:5AAkÖ¬!''‡ÒÒR¬V+.— ///î¹çºwï~ÙÖ}çά_¿žW^y咿׆ xôÑG±Ûí¼üòËÜwß}ôïߟ>}ú°jÕª-ïСCL:•C‡QUU…¯¯¯ŒBˆÿ‰t%B!„B´Ø²åË/zT²úúz>úè#ÂÂÂxøá‡yï½÷xï½÷˜:u*¹¹¹ìÚµëW§É“'Ó¶m["##Õ¤Ðÿ"--n¸A@!ÄÏFZ !„B!Z¬K—.8ö‹š÷Ûo¿Åd2qÓM7¡Õ6|7íååEZZï¾û.&“ ‡ÃÁ¦M›X°`ÅÅÅtïÞ‡zˆ°°0&NœHxx8³gÏÀét2hÐ FÅŒ3}ú¨I¡F:ŽÖ­[ 4t»Z¼x1Ó§OgÞ¼ytèЙ3g’ŸŸÀo¼ÁþýûÕ×ëõzž{î9233Õç^zé%>ýôSJJJxóÍ7yá…ؾ};«W¯ÀÏÏ矞qãÆ±zõj>ÿüsÆψ#ˆ‹‹ãµ×^ãÎ;ïdΜ9´k×///}ôQRRR˜2e >>>¼ôÒK„‡‡3~üxL&………”””\tì^xá|||èÙ³'«W¯fõêÕ„„„°nÝ:JJJøë_ÿÊ /¼À®]»øãÿHqqñ9—Õ»woFŒÁÞ½{¹å–[7nf³™áÇvYºË !®n’B!„B´ØÊ+±Ô×_Ô¼%%%\p¾E‹ñûßÿž®]»ÆÍ7ßLçÎY¿~=ÐÐÊèlžg%§<==iß¾=7ß|3111\wÝuôíÛ—¬¬,4 žžžF|||ðññÁh4b41 Lž<™N:Ѿ}{>üðCzôèARR¹¹¹h4¶lÙB¿~ýˆŠŠB£Ñðûßÿžçž{î¢cçéé‰F£A¯×«ë Õjq»Ý <˜Áƒ³wï^Ž=J@@k×®=obÈ`00|øpX´hN§·ÛÍúõë7n\³ø!ÄÙ$1$„B!„h±©SïÅh4]Ô¼^^^Ô_D)++‹:¨M&111äååµhÝÔ8:oooìö‹ëöÖ8jØ™üýýiÓ¦ ;wºšÍ›73vìXuú¤I“9räÿÓÂÂB^zé%ž{î9vìØAvv6•••”––b³ÙÎûº:п:ÄæÍ›9qâEEEôèÑCT!ÄIbH!„BÑbsÞy—ËuQóvìØ‘Ã‡_p>N×d™Š¢àv»›tASEQÔÇçJøhµÚ&¯¹Ø"Ù¯=›‡‡ dgg³lÙ2ºté¢v¸ùæ›:tèÿÓ'N°lÙ2 ĬY³xúé§6l.—«É6ŸM¯×sÛm·¡ÕjY´h›7o&>>^MŽ !ļîI„B!„-uÇwàv_\bè–[náÛo¿%??‡Ã¢(¸\. xýõ×Y»v-ݺucóæÍê<9rDmE¤Ñh0¡( 6›í¿Ѭ1éd³Ù(//ÿój4:tè@uu5ÿøÇ?¸õÖ[›L¯¨¨ ªªªe7b§»Ž¹\.¥¥¥X­V*++‰ŒŒÄËË ‡ÃqQ-­’““8p ëÖ­cáÂ…tíÚõœ]ï„âl2*™B!„¢ÅòòòMIÁj±\pÞˆˆ|ðA^{í5RRR ¾¾žÝ»wDÏž=¸ë®»xçw(**" €£Gb·Û4hÐе,99™÷Þ{nݺQUUÅO?ýDii)'Ož¤U«VlÛ¶üü|Ž?NëÖ­±X,ìÙ³‡œœŠ‹‹ % €šš–/_NAAÇŽcÆŒäææ²mÛ6êêêèÛ·o“mˆŒŒ$((ˆ~ýúÞdÚÔ©S ãwÞi¶í¤¢¢‚ºº:~üñG’““¸þúë),,dñâÅÔÖÖ²eËfΜI=XµjÞÞÞF¶nÝ ÀöíÛéÖ­›ºmÛ¶mãÆoZ[Ýÿý|ñÅøûûÓ±cǵ”B\»¤ÅB!„¢Å²²².*)Ô(%%…|»Ýξ}û8vìƒæ÷¿ÿ=~~~$%%ñàƒR]]Íþýû‰‰‰aúôéøøø ‰¡û￟ððp~úé'Ün7O?ý4)))PPP@ïÞ½)((Àf³¡( ±±±jË „„†Ê‘#Gp¹\LŸ>ÂÂBºwïNqqq“‘ÏÕÔÔ Óé1bD³áéÿSW²ãÇ3nÜ8&OžÜdô´_|‘ñãÇ“™™Iuu5?þ8íÚµã•W^aÀ€deea·Û™2e 3gΤ¤¤EQ())!))‰™3gräÈ‘&ïÕ¹sgúõëGZZr !.Š´B!„B´Ø˜Ñ£1MX­—Òh4´k׎víÚwNGrr²Úªæ\ˈ‹‹ãhòü /¼ þ}öè`þþþM¦øøø0fÌÆŒ£>׺ukRSSÏù¾?ü0ƒ Âår‘Ь%ΤI“λM#GŽ>xzz¡Ñjä ¹H»œœ¬V+±±±huÍ“oV‹•ŒŒ ´->¾¾—-„¿†Ï'!„B\nn·ûœÝ|®:·Û}ÞÓŠâFsÝ›\.YÙÙde@«ÕÒýún]ÓÇ–V«CQ”ÿ_åWß=O§Óãv»à1ÿú›o˜rçrABˆ«œ$†„Bñ‹‘Ñ·þ»Ø¸Ýn6nÞÂò+Ðëµèu:>B÷î©Ü8|()ÉɘÎê¦vm¯eñÍËËcç®ï°X,Mæ1›ÍôíÓÐÐЫªÖå:¯î¾ë.ôös´ÎBqõÄB!ÄUÀn·óý{ذq#yyùTUU1íÞ»‰Šˆ@§Ó±s×.–._FfæQ<½}èÙ£#GÜHDx¸ï¶lÝLIi¡Mž/*>ÁÒeK˜8a"!!ÿÏÞ}‡GQuþmMï!¤! „Þ‘B‘Š téEDé ˆ4E¤È§‘Q•€   ¡&$”ÐkHRH϶ùþØd$$ HQô¾ÏÃvwvvæÌììÌ™{ÏuºËG-fâÄ "‚ Ï8‘Aáí·ß÷²}ûH’D%__Ƽ6ö?‡Íß}Oä±(:w쀽ƒ… >X´£ÉDÇéÔ±=éé鸻{••Á[3f2yÂxj‰é>²³³¨XÑ‹ôôîlnäííΞ=¼3gV™£—I’D‡öíÔù?·‘#G`­þAžy"1$‚ Âßâ~u`“C³fÍpvvá—_yän2iii$$$P»ví¿oÝ`‚»×ó»ðpfN{Éd®‘sëæMNÅž"))™›7oPXX@Ë–-ñó«‚V«¡‚·7J¾ßJõjÕþÛ<::???þÖøÞ½ïI€B¡ ==ƒÁDA£ÑD|ü üý«”}­Va2I;E§Ž¡O5Ž{öì¡uëÖ÷]¿§áâÅK4jÔˆ‚‚|q@Ax†‰Ä ‚ Ï„¿RãåÀDGGÓ¥K*Uª@^^©©©y9V¬XÁ«¯¾úÔ×_¥RãæVžìì,$IÂǧ"jµ{nܼZ­F«Õââì‚R¥D¥T¡,#fF£‘sçÎqàÀRSS±··§nݺԯ_›'ºIIIxyy=ñÄÐ_UP #;;ònñõõ»ï´‘QGð²K½–ŸŸÏ‘#GˆŠŠÂd2Q¯^=š6mŠõcÁëêÕ«ÿˆx%&&Ф ¿€H ‚ ‚ð·y– %§‘¸5„$I,_¾­V‹¥¥%ÇÀÛÛooï¿ÜªbÍš5Œ5ê©ÇÆÙɉëר\¹Z $É„““U)(, /7µJMzfé餦¦•…Vk]b^±±±¬_¿ž*UªP»vmn߾ͮ]»°··â­¨BCCx»?bô.ÆÒ #Õ«×$¤eF£±Ì÷iµZ®]»†ÑhBºk}ôz=Û·o'""‚F¡R©Ø±cÉÉÉôêÕ ­VûÈk7tèÐDáöÐÐNhµ"9$‚ðŒ‰!AAþ1 yyy%.z Q©ÍCÛ›Œ&nß¾-¿¦PP”ø±*5¯¨¨($IbèСlß¾ääd<<<ˆŒŒdûöí¼óÎ;ܾ}›·Þz‹ØØX*UªÄ¤I“¨U«;vìàúõëŒ=€Ý»wsüøqRSS9þ< 6¤_¿~L˜0ììlÞ{ï=Ž9‚‡‡S¦L¡nݺ„‡‡³mÛ6ŒF#YYY„‡‡?RlÚ¶ižˆý88Ø‘}•J ê ÉÏÏC§×‘Ã©äææ“’’Âå«q¼~Wë¦K—.accC¯^½pppÀd2‘——‡¥¥%™™™Œ=š 6ȱïÝ»7áááL:•JÅ‘#G°±±áÕW_¥mÛ¶$%%1tèPˆ¥iÓ¦¼ýöÛØÙÙ1zôh<<<Ø·o:t 99™¡C‡b2™˜>}:+V$&&úôéÃþýû9|ø0*T`Ö¬Yøûû“ŸŸÏŠ+øá‡pttäµ×^#$$„ØØXfÏž‡‡'Nœ`ß¾}¨Õ~j{wbE’$L&F£ €+W®Uæ{½¼¼ï|c‰×9|ø0}ûö¥Aƒ°qãF4h€³gÏ&,, €ŒŒ FÅóÏ?½½==zô@­V“——ÇüùóéÖ­£G¦mÛ¶DDD°xñbÞ~ûm~üñG>øànܸÁÅ‹©T©‹/.s™ž”¹sßgÚ´·ÄKA$†AA3gN³îËuØÙÙÊÏiÔZ´hJ¥B£Ñ0ÁûòkF“‘jU«1dð°óÑëõlÞ¼™¾}ûÄž={8yò$îîîèt:9¹´hÑ"üüüxÿý÷Ù¹s'K—.å“O>!??ŸœœœÉ©¬¬,.\ÈÞ½{‰ŒŒ”_[²d ®®®„‡‡sðàA–-[FXXùùù¤¦¦²páBªW¯þȱiÔ +V­&==AAHHèõ”*y¹¹¤¦¦¢Q«ÉÉÍæÚµëÜÎÊÂÍͶmÚ”˜¯¯/{÷îåóÏ?'00WWW|}}±³³Ãd2‘––Vbú[·npûömòóóùæ›o8}ú47n¤R¥JhµZ’’’˜8q"ï¿ÿSA³¶ IDAT>‹/fõêÕLš4‰ŒŒ lllÇÆÆ†áÇ£×ë1™L$&&2vìXæÍ›Çš5kx÷Ýw™;w.3gÎdóæÍ,]º”eË–±nÝ:nÞ¼É÷ßÏ™3gX¿~=èt:RRR˜¾T—ŸóçÏsøðaT*§OŸæØ±cäççÓ¤IL&’$a4‰ˆˆàÛo7cggGÇŽøüóÏÐétEÓ˜äù/«ÑøÇßb»wï¦I“&¬ZµŠÂÂB>,'?š7oF@€?&“éî<ÄŸÄÆTjLF#NŽè óÙ¹óG”j VV6ääæ“V«ÁÚÊš[·n¢+,Ä»‚…c©ùT¯^‘#GrèÐA>L^^ÎÎÎôïß¿¨ÆÐëW|Áo41™Lôë×{êÕ«Ç–-[¸uë&îîîøûûÜ++kz÷îÍìÙ³åXõíÛKKKù±ÉdžW5hÖ¬)jµ†"""nZ­!88˜­[·b49tè666¬^½½^ÏñãÇÉÊÊ’çÑ A}yåðþI|‹—Cº£ ™B¡(ZOó“ùùùäåå•ùþ»[¨ÝùÙƒ¡Ä>öÇç™0 ¥ö!ó_‰  j|óØØXlmm8uêþþUpttÄÕÕ•N:¢V«K¼_’$ºv튫«K‰e0šŒOå;üóÏ?ÚùCï¿ÿ>NNN8;;ËI¯Zµj‘’’‚B¡`Íš5â (‚ C‚ ‚ ü—˜/d¥&çÎåúõ8¹KZ­¦Ní:¸¹¹±÷·½¢P€ƒÊ•+c0èK\ôïÝ»—¦M›R£Fu”JåÊ•c×®]$''c4Š.Òõ( 1ôèt:$ ùu½Þ€NWˆB¡ 77W~ùâÿÏS(øúVÂÎ΀™3gbnbD£ÑÕ­Ñó0™¡;?KN8(”J,,-¨ä[ ¥B‰‹« qqqädebo爫K9Òn™[¥¸—wãZBrŸ þø#IÉÉÉ,Y²”3gNS¯^=$I¢°°•JEVV¶¼ü’$¡Óé0  z9yUœ4Òéth4t:#I’°´´—¡ø=&“ •J)O§P _üØh4ÊïóööÆÇÇ€qãÆQ¾¼™™¨Õj E©u,nõsÿøäĤI’P(Ì-ÍŠ×)âÀ“Ê|¿J©âÒåËhµJrs øå×]4oÖFƒ¥¥J¥’k×®R¹reâ1ôØØØ`4Jĸ¸˜¸F£¡uëVlÝŽ——'ÉÉI´iÓI2¡T*Q«Õ%Ö³xXXhK}—îNª>)...èt…<ý¤I“ð÷÷gÙ²eØÚÚ2dÈbbbøøãÅQA$†AAø¯)«x®¿¿?¯~Ó¯|Ÿ~º†‰'¢ÑhéÞ½;`®Q£R)ÿÒEúI“âV6ÙÙÙòkƒ…B‰µ5ŽŽŽ8::`ii‰JenY¢R©ä>)))¸¸¸`ii‰B¡ÀÏÏ .2þÒÒÒ¨Xч^½zQ¿~}”J%£F½ZÔ¥NOçÎå„HÔ­[‡I“&cooψéX±"qqq¸ººËW_m eË– ð2’$€………¼.Uªøaee$™ðóó“Ÿ·´´Äß?@~¬Ñh¨Zµ*’$ñâ‹/¢TªxóÍ©H’DÇŽ°¶¶ÆÆÆ–Ê•+—_éÁâ+Iñ ñÔª@­Z IM&s‹"½ÂÂJ(jÜDñ.+)Íís,´ FVJ …I’°¶¶fðàÁlÛ¶éÓg`2iß¾=zôÀÖÖ K ̪U«1têÔQ^FÃàÁƒùúëM¼ýö4”JóþS«VíëYüØÇ§ŽŽŽ[bhÙ²eLœ8ᦽW $ ÜÜÌßéèèh–,YÂôéÓñ÷÷çÌ™3Ì›73f0fÌNœ8Á{ï½ÀÉ“'IJJâ»ï¾ã¹çž£[·nDEEѤIjÕªEíÚµÙ³gaaaÌ™3‡ùóç³{÷n–/_NPP®®®ÄÅÅ‘••EÍš5ÅAY‘AAxÊ©¡¼€•P*æd‡É\«¥¬¢¿\4×¢V­Z¥.«T©ÂôéÓùùçŸÑjµò…øôéo—š‡ ƒ dР¥.¸{ôèNÝåÇJ¥’‘#G0räˆÓ¶jÕê/_¤KwÄÆh4’››Ë­›·ä‚¹+–$s,EQ|ÀüX£Ñ 7Ñë͉!­V‹F£!++‹M›6иq#ùóÎ;ǹsçèß¿?­Z…ЪUˆüÚË/÷—[ø´nݚɓ'—Љ——³fÍ*õü[o½U"&ü‘D?~œü¼——S§¾)?vqqaöìYòãîÝ_ {÷JÌ?00€ÀÀ€{´È’þ4ÂÅuŸŠã—““}G9srH2™0Œèt:Œr×9Fƒ^‡Ö‚‚üB*x;È5ŠV¯^-Jpp ظÑ<ÒÛàÁƒi×îyÚµ{¾ÌdNHH!!!%žûøãe%Ö³øñ AƒÊÜÇ$“é©|ƒ'Mš„Z­B¯×?–ù}þùç¼þúëÔ®]€ 0hÐ ¾þúkæÍ›G@@QQQT­Z•³gÏÒ¶m[~ýõWrssÉÈÈ ++‹Ê•+—8>ôèÑC.ÞºukÂÂÂ(,ü£ûÛš5k8pà»wï‡dADbHAᩦ…$©tQæ2§Ã|1n4¢P*þ41t?………lذ‘ÐÐNôÙOnå<6ƒÁ<*Zv6J¥•J%·º›N§Çh0`é`A^^ƒÌÌLÜÜÜä¸ÙÚÚÝós Å}ãRÖ6»³eÓ³³ïýÑbH¥R¡P(Ñétäa*J>šŠºéõô:½¹%‘ñºJ:[[{²sò°²²Ád2׺_|‹=éX™žR‹¡uë×1dÈÇ6¿óçÏ—,((ˆuëÖЬY3~þùg:uêDZZÍš5ãöíÛ|`meÅÁC8…³“ó½ç^4j5Sß|OOO¤GH0=†µ°ìæÑÈ$,´Z 33 w÷òh4ò òÑétrBG§+¤re?róò¸zþ2¼½Ñj4¨”J$ìíìè×·Ï}îݦL™Œ³“S©×==<˜3çÝGÚ.Ó’„F­æò¥8ÜÊ9“››[4â— “É<ò—Þ`@¯3ÈÉ"“ɈÁ`4áÖ›ÈÍÉE!Ñ`@¥Õþy|ïãǺnOA«V­0<¦ÖB`îVvgk0's-,,hÚ´)ÿûßÿ¸zõ*¹¹¹P¾|yæÍ›GíÚµquuÅÙÙ¹Äû‹‹še~ßëÖ­+Æ‚ üç‰Ä ‚ [näAºY5iÜ„&›ÜuÝû×.| yeÔ«¼1e ;vøÇ&-Š×Q¥Raee…¯o%ºtêÈoûö³ÿÀQ¼½½¸~=“É„­z½‘œ¼Roe““K -š6ÁÓÓ [[[¹Î_åéáQfì5 ¼½ŸZ]›߃ÄW’$ªV%þúu¢£c±¶Ñ ™L˜¤?¦1×*šÞ$™»ù™Ì]ëöþvˆŠÞ¾”/ïöHûåã_ý§·Z|úAtêÔ‰o¾ù†aÆaccCNNÛ¶m£M›6¸ººÀúõëiÒ¤ ØÚÚ’ŸŸÏþýûyùå—Ñjµõ™IIIäää ŽÉ‚ üg‰Ä ‚ ÏÅ+ÒS¿¶°°`Ïî_ÿ– 臽°/^6¥R‰V«Å­\9Ô«‹·—/_ææ­4óè\&*• µZ½#V––x¸—§j`NŽŽØØØ”(ýߨ·lß“$ ž{®)ûöï#;'Ûœ°¼c $¹ø´B­(±ª9Ó ^<<<îÙ½ïïÚž†ßûo/¯‡zOJJ ‡‚®]»–©¬o߾̚5‹+Vààà@ff&ééé¼úê«ò4!!!|òÉ'Lœ8Qþ~´hÑ‚M›6áçç'OwéÒ%N:˜» YXXpìØ1®_¿Î–-[3f +W®5†AøÏ‰!AAþ®«×gª.ÍÓvgl –––h4œœœ¨€B¡(Ñ5¦øÿæ:@æQÄÔjµ\\ù¯íþoÜ÷JÖKrqq¡[×nr|îŒÓÿ¿3ÞÅñT*Í#Áý“âû´–cÀ€—Ñh4¥ºýÙ²5oÞ¼ÌåtrrâÍ7ßäàÁƒdddP¥J† ‚ƒƒƒ>>øøø”øþtëÖ­ÄüF##GŽÄÒÒR~®sçÎÔ¯__|'AøO‰!AAž:¥B!wÏùÏå$$ …ByÏ×ï—Ä).<ýOMüs⫸O|Í-ŠîÞÿîN´=Ëñ5jW>ñÏYøÁ¼ùÆõF}Ï×½¼¼èÙ³ç=_/_¾<;w.5O¢®ŽÅJukÔ¨5*õœ ÂH ‚ ‚ðT) \\\‰£|y÷ÅaÿíL&ééé89;—¹Þ …GR’“©X©Ò_Jý—I’DæíLlmmQ©Ë>͵µµãvfNNNrQãÛ>vóÖM\]\Ÿxrhü¸q¢š ¿€H ‚ ‚ðT)•JªVåä‰ãäæä¢ÑhJÔtù·R À`4ž–†¯¯_™Er •*UâäÉŒ,´ÿ‰Ø<žø‚Ñd"3#wwO¬­­ËŒ¯‡‡gΤsùÒ%lllþUñU @¯×“žžFPP 4Íý¼'OÒ´iS î;Ý™3g8~ü¸ØIAøW³²²¢{÷îÏä²‹Ä ‚ O÷âU¡ÀÑÑ  ê¤¦¦““ýiu @£Ñàë[7·r¨ËhÑ¢P(°µ³£FÍš$Ä'““ƒ$‰:L|b«Öàåå››Û=oÖ6ÖV­JrR2ÙÙÙÿªø*P µÐˆ““ãoq–žžþ§I!€ììl’’’Ä*¿ZY7$ž™ßO±ùAAxÚ”JåÜÜpqu5'…þ+ÝQŠêبTÊûÄF‰ƒƒ#vvöÿ­Ø<ÆøÞ¯{¢B¡ÄÎÎÛg| ” ʧР±}»öh-´äçßwºÆÓ¸qc± ‚ üC‰Ä ‚ Óõ«BÔбñ}†Í;—iÓÞAxÆ)EAAAxXÓ¦½%l‚ ÿ"1$‚ ‚ ÂCÛ±ãÇÿÔ¨‚‚ ÿVåH®P FÌAA„g„B¡xäyx{{£ÓéD0Ažq¥Æ••·33ÑjµåGFAA„ÇO’$²³ncgoÿÈóò÷¯‚•µ5ùyy"°‚ ϰGN ) Ü=<9{G§2‡^AAáï§×ëÈHKÇ¿jÕGžWاŸ2vÌTA„gÜcÉâ8»¸¢P*ÉLÏw AAáŸH_¿*ØØØ>òìÆ‡Z­F/º“ ‚ <ÓKbH©Tââ⊋‹«ˆ¨ ‚ ‚ ü|¶æ3FŒ.!‚ðŒÃ‚ ‚ ‚ðÐ:uêˆÁ`AxÆ‰Ä ‚ ‚ -?¿++kA„gœH ‚ ‚ ‚ðÐŽ9B~¾¨/*‚ð¬‰!AAAZïÞ½DAþDbHAAAá?ê©%†²²²8u*–¬¬ìg2P‰‰‰œ:‹$IddfrêT,¹¹¹èt:NŠåÆ›bo*CBBYYY"‚ ‚ðˆt:ׯ_xåææ’””„î_6¬{BB‚ظ‚ ÿe¸ú´´4víÚ…½=Á-Zààà@tL çΞ套^"""‚ñÕ—_Ò¡CûtPΞ=KLL ¡¡¡òº,úßÿX·n=7RSøy×.F¿ö:Û¶nÅËË“V­˜6í-&Mœø—>/++‹íÛ·S§N‚‚‚þ1q0™L\¿~ØÓ§ÉËÍÃÃÃzõêaccó`q éѽ;;‡’ÍìwÞ¥‚·7G## [½Š‚‚B>ýôSbOÇR§N¦LžŒ……ƒ¿fëÖ­øøc04pÎ.Î|±ö Þzk*/^dù'Ÿ@ãÆ8`S§¾Ell,¡¡™8q­ZµbÈÐaÔ­S‡ýÌ}oåË—gÕªU;€?oL™‚££#6l =#ƒ³gÏróæ-Ú¶mKõ  ¾ûþ{âããiß®½{÷ÆÎΖ´´4V­ZMLL ¼ùÆØÛÛ³nýzrsr9qò„††Ò£GÆŽKìéÓ„†vfü„ñ<ß¶-»vý̆Ðéôt ¥OŸÞ¨Tª±áQQǨY³¼ ÀG~Èܹïpåê9Rj>>r„ÄÄD&MžÂ…óç™5s£FâÀò´¹¹yŒ;†—-E©T2mÚÛ\½z•. ÿ~lÞü ööö\º|™io¿ÍÕkqÌŸ÷>J¥’·§OçÌ™3òº]»zMž÷‘£G¹|é²yÝΜåèÑHXóiõë×+µÜédÞμïö¢aƒ†,_¾œ   222Y¸pAAÕØ¼ùZ¶l‰$I9r„rnåXói|üñrlmíXºt)•}}YRôÛHDÄ^=š9ï¾CäÑ£¬X¹‚A0ïý¹\ºt‰ýæßòe/ÇÑÑ‘eË–Rѧ"K–Í#>ƒ‡2aÂfÍœIô±hŽEE±páBªU3/W«$IâþÃG°hÑäåça2™JŸP§#7/÷¶GpË`¶lÙÂéÓ§Ù¹k~~•Ñh4ôÞÔ”TŽ=ÂðaCY¸pÑÑÑlÛö#GŒà7¦°ëçŸÙ¿Ùç±±8;»”˜ÄÙ³gÍó»qƒã'ŽãááÁºõëINNæÃÿG«V­Xµj5ùù¥[ûèuºRçÎ÷³dñÊ—/Ï’%‹±³³eÙ²HJL"==Mž.%9…›·nb2™øè£1âþ1X6äÙ³º%”Ñh$..Ž¥K—Ò£Gš6mJ“&Mh×®Ó¦M#&&æ±gøálmmùñÇŸÈ1¡fÍštèÐáO§ûé§Ÿ¨P¡¶¶¶r÷ÓU«VáîƒõêÕ£^½z<÷ÜstïÞÅ‹síÚµ?mÕ¶|ùrÊ—/£££<âÕªUcÊ”)¼.ÁÁÁØÚÚòÞ{æë ¬¬,ªV­Š­­-_ýõ=ß·cÇ||pìâ IDAT|˜8q"™™%¯3ÒÓÓ ÄÇLJŸþYüˆ<„·ß~ggg\]]©[·.uêÔ¡iÓ¦L™2…3gÎ<Önnn <ø©¬×ÚµkñððÀÍÍMlä[bÈÁÁ·¦NåâÅKlظ¾¬{ zõìE^^‡&33“;~¤jÕ@Z´hÎHIIÁÞÞŽ«W¯¢V«Ù¾}z½N‡••·oßæÈ‘# I\¼x‰”¢._ …¢Ô˜û®|wIT*­++«RwšþL9WW 9M||¼|—«  {nܼIÔ±cH’DìéÓddfÊŸ¡Õh±¶¶F¡P=ž¨¨(\]\8yò6Ö6?~‚K—/?кÚÛÙÑ­Û ØÛÛ—º°yó7„­^}ßu)(,ÀÚÚºD¼,,´r’΂¡C‡àééIŸ>½9qò$—.]"/7øøxNŠE¯×s¹h¹íííéÛ§ÎNN¨T*&MœÈ­´4"""$‰˜è”J%Z­­V+þ•+WÈÊÊ"1)‘ã'N`2™¸Ptr|?:u$¨Zµ‡ÞŽ‚ ‚p?qqqÌ›7_þ·ö‹/ä× ˆµkׯÅÅ…œœüýiß®ööèt:Ž=ŠR©àà¡C8:8q €èèhºw§'-š7§Aƒ¥>?°jUââ®±ï÷ßñòô¤R¥ŠXZZ¢Tª°¶¶F­67 ww/O÷^ÀÑÑ¥RÉî={°µµåð‘ÃXYYËŸ ЫWOªU«†¿¿?5jÔ c‡Ô¬Y???ªT©BÚ-sÂaÏž=XÛXsèðalllØ¿ÿŽyôìI€¿?U«VÅÇLJÌÛ·±²´D¥T–X.¢£IëV­äçïÔ¢ys^9ò¶Gƒ ˆˆˆàÃ?bëÖmT©R¥ÌyÞKÇ©^½:–––\‹‹Ã¯ŠuëÖ¡jÕª4nÔ˜óçÏßó½^^žxxzpòä)t:/\@¡PÄ®]?ãéåÉÑÈH òó9~âD™¨5jĘ1¯?ðòFÇDÓ¿?<==2dH™7/Kœ}+Tñ÷'úØ1¢"£hݪu™ç‡ëwf?p®˜Éd"&&†×_ .°páBöîÝ˶mÛèׯëׯgÁ‚ý;kîF˜‹Ñh|BÉâ| þ¼KiÇŽéÓ§¹¹¹lذ€W^y…&Mš ÑhˆŽŽæèÑ£lÙ²…aƱk×.FŒALLÌ}“y¯½ö 4ÀÊÊŠèèèÿ¶lÙBõêÕx]6lØ@nn.z½^>ÿä“OÈÍͽo"44”ž={²dÉ>üðÃÉ!ggg–.]J¿~ýh×®øysçÎÅÃÃ"##ùñÇ™ý4¬Ì׬¬¬äß<…B„ùwI­ÑÈ7*$Ì­Ž’“S°ÈÈ w¯^òù‰R¥ücÊÒ7‚ ȹxé"GŽ¥ÿþT)£x²J¥.q“G§+$55…ÛYæßÛ¾}ûþ±Ü––ò'•Z……¥¥|M©RÊ¿¯………¤¦¤r»è7»_¿?æayÇ<”J%Üñ›|g’bÒÄIDFFröì9öìý.@[tcî¯ û”7ß|“Úµjq=>ž™3fÒ·OŸNZX[[Éç ’$¡,Zóz(äs®²Î9´Z-õêÖeÛ?pëÖ-öîývíÛaii‰Ñ`àæÍ›r½£n]»<–›U&“$/¯R©”ÏÁ F£ùüV’$ùÂÞó E1?Ëž½{YôÁ‡Nê<¬Y³ƒÁÀo¼ðGK…¤¤$NÝls-Îü‘k×®¡T*©V­;vÄÖրŋ“’’B@@NNNœn4lØ_|‘•+W¢×ë9yò¤¼Ϙ1s/™Ã‡9rä999¸»»Ó¨Q#j×®Vkn8pìØ1:DFFåË—'88˜   9IŸ——GDD‘‘‘èõzªW¯^ª°>@vv6Û¶mãòåËH’DåÊ•éÚµ«<(”ðd<‘áê»véBµjÕ8qâd™¯[ZZÒ­[W._¾LXXZ­–.;Ë;¦““žŒ>œn]»íLÉIÉDGÇP¿~}¼ü26E?Å?xNNN¤¤¦’’–ððû.£“£#z½ž .UbøWZƒZ­&­ŒõÏÄħWÏžŒ;g> ÀÕ«×8uê-‚ƒéÕ«'Ö6Ö%’8dçäÈw‘¼<=©Y£­–>}úðrÿþxyy¡×™à¹qãIIIlݺõ¡›7Žé3fÜwšÎ¡¡„……qáâEòóóùå×_‰‰Ž¡YÓ¦òÉå7ßl&++‹;~$À߀J+QÑLJ6mÚðÊȑԯ_¿D²æN´iÝš!C†È?ÅÛ '7G>¡ñññÁ××—V­BxeäH6lˆT”xtvqaÿþýäääÎíÌLñÍAþÑ,´Zš>÷Œ>œݻ˿åAAAüôÓOܾEtt 'Ž—.ìûÛo¿Q­ZUúöéƒ$ÁÔT9sû7YZ…´ÂËË›¡C‡Ò§wï‡jUóÇ>ž¨cÇäsó9G999lÙ²E^§   $Iâ—_~ávVõêÕ“/fílí4p ^~ùž]®Nž<Éú/¿|¨ÄäÖ­ÛÈÊÊâÛモGstt$66–Œ¢zQ¿ïû]Nvíß¿Ÿ¶mÛÒ¥kΟ?÷ÄZÎü™¤¤$~ýõWž{î9¹†èFŽÉ´iÓÈÌÌd„ ìÝ»—š5kR­Z56lØÀœ9sä–xõêÕcÁ‚|ðÁÄÇÇÓ°aCΞ=ËŒ3ˆŠŠ’¯=jÔ0ǨV­Z´nÝš:uêÈŸ9mÚ4 hÔ¨999¼ñÆ:ôÇ (ééé¼þú륖cþüùÔ¨Q+++œœœhݺ5­[·~àQ|ÿŒ¿¿?ÁÁÁìÞ½›7n<ôû_+ªG uéÜÌÚµkåçêׯÏâŋٶmÛcÛÆS§NÅËË‹%K–°fÍy[ÝíÂ… ,_¾www6lÈÎ;™3gñññE [ó Þ ðÙgŸQ±bEΞ=Ëøñãùè£ðôôäòåËÌš5KN&êõz¶mÛÆÜ¹sQ«Õ4iÒ„¬¬,fÍšELLÌ=¯IžE¨Õj9ù9vìXöíÛGÍš5 ä‹/¾àý÷ß—[ä,_¾œ… bccC³fÍð÷÷ç»ï¾“»WÖ«W¥R‰›››¼k4 ùòË/y÷Ýw±¶¶¦qãÆ¤¦¦2qâDÐëõlݺ•Ù³gæQÓÓÓyë­·8tè’$QPPÀÚµkY°`®®®Ô¯_ŸØØXΜ9Sb²²²˜6m?ýôÕ«W§fÍšìÞ½›3f<µ–LÿU¥ÅV£ÁÓÓkóÐÉɉAƒŸÏ™3gP*•XZZâé饥J¥’ZµjÑ AC:ÄÀäLrhh( ¥’õë׳aü<=éÔ©#*•Šºuë0lØP¶nÝFäÑH«âéé•¥%–––Ìš9ƒuë¿ä•WFЧ§Ž÷È,Ž3†ŒÌLÆŒGófÍðôðïŠ5nÒ˜6mÚðÆoR«fM–/ÿG<=͵­¬¬ñôô@k¡-ÊÚz`gk€woÞóñññØÙÙ2gλE'Áôï×Ï?ÿŒˆýûqrv2ÏC£ÅÅÙ™/¿Ì?þÈ/¿üLø–-T©R…9ïÍaݺu <;;{BZÓ¬YSÔj5ï¼3›µk×2êÕW íЇ‡ŽNŽr–>ÿO¾8W¯\½gö¾XÇŽ$‰Ù³g“––NÍš5˜0q¾¾¾EÉ8%7oݤo¿þx{{1yÒ$4¨O^^.Ë–.#1)‰úõêÉ}Uï>ýê(æ/X€Á` Y³æò•:uj³té26³™_ý…:uê““Ã'+V’OݺuåyN˜0žÅ-&¿ €àà¸>·±µÁÚÊZ|ËA„ÇJ©TOÈ#’V«Z•+>ÁÁÁæ–/öööXh-P©T8;ÿñ»kmm͈ÃY³æ3V‡…áââÂÈ#x±GÂÂÂèÕ»7•}}±³³C©T¢R©äßîòîî¼;ç=nܸAp‹Ô©S­VKÚµyñ¥—˜2y2Ï?ÿ<®®®w]$Žfõê0úöí‡ ^6×U´³³Å⎖,¶6¶rË'kTjsèõ×_',,Œ>}6`kkË AƒŠæaWr¶¶XZZ¡Õj©[¯/¾ô“'M2×aQÀðænbýúö+³åJnN·nÝz m2mÚ[,X°eË>ÆÙÅ…Ç•h)U–âsë­xÔ¯OJJ ³fÏF¯×Ó£GZµ?~K/‘Ï9<<ÜåÄCûv홿`3¦¿eQË…áDZrå* ‚J¥¢SÇŽe–2ÈÍËãæ›÷]^+kk s2gÜØ±|°h_}õUü«0õÍ7hß¾yûöëOåʾxyyÉçB&é˜÷ïßÿ‘Zh+Þ>“ÉÉÉ!>>www¹…Ç\]]åýöóÏ?'""‚ððpj×®-§† FýúõéÕ«Ï=÷œœœëÝ»7nnn888ЦMbbbxî¹ç°²²¢nݺԭ[·DW&I’X¸p! …µZMåʕټy3Ÿ|ò‰<ïÕ«ÍÅÖ¿ûî;9¡äééɪU«¨]»6ÖÖÖ899=önR666x{{“Pf}ª»¥¥¥É‰I€ëׯ³|ùr9eggWbúF=öV4uêÔáË/¿dÈ!Ì+Õù•W^)3éµpáB´Z- …‚œœÆO‡¨P¡ÖÖÖòvïÔ©]ºtA¯×³iÓ&ÆGhh(jµšž={rùòe6lHBBK–,¡yóæ <;;;9Y¸lÙ2V®\YâØö,Ñét\½z•¤¤$öìÙÃgŸ}F×®]iÓ¦ aaaDFFNÍš5åãÒ믿NýúõéÑ£_ý5:ŽV­ZQ¡B”J%®®®r µâ}ÁÝݽÄ~|âÄ V¬XA§N|˜K—.ÉI¤””|||˜:u*ï¾û.z½­Vˈ#Xµj …‚Ó§OS£F -ZĤ¢—ááátïÞmÛ¶Ñ¥Kù3NŸ>Í»ï¾K\\ÎÎΨT*öïßO@@€}ú™ì’T½zu’““iÞ¼9*• Ú´iChh(ööötíÚ•Ó§OsæÌy‹‹# €3f0}út†Îúõë)W®5jÔÀ××—N:Ñ¢E å}¡K—.%ŠŒïÚµ‹îÝ»³fÍúôéSªÎmtt4ÁÁÁÌ›7×^{ ¥R‰Á``Ò¤I|ñÅÄÅÅAÏž=Y¿~½Ü Îh4Ò¯_?¶oß.·j7nŸ|ò ›7o––F£‘Aƒ1xð`–,YòÌOöÆÂÁÔ–&Œ&F£D΀Ñ(™›LHHº*9èéÐĸk×xï½÷ô߇oÍ €ÈrÛ@:p¸¤ýK/z-§hº< ÐÍȹW»©èïã¯1$‚ ‚ <šß÷íãÆܺu O//<½¼DP„œÙ³fÉÿ?yüÁF³··§råÊ$&&RPPPªe×·ß~‹½½=íÚµÃh4šk>Ý‘üðC9uêuëÖ-³›cqìïõ·Xñ¾qíÚ5"##åçkÕªEýúõKK¹¿K``à=»üÇìîïŠÉd’_{óÍ7qww'..ޤ¤$¾ýö[¶lÙÂüùóï;™$IæÚw÷HâÇüÎmQ\£Í`0Èï7™L¥¦)k=$I"22²DK¶ñãÇË­Ç„'C$†„¿¬¸›œ ‚ ×ómÛrúôi´Z ªV Ä©èn® <ë¼½½iß¾=äÖ­[rñi€øøxÞÿ}ÆŽ ˜»‡EFF’˜˜(×yŠ‹‹ÃÁÁA.mð¨âãã1 caaQf š   ÎŸ?ÏõëשR¥ —/_fçÎ%jø±äJ¥¢Y³f,Z´ˆQ£Fñí·ß2aÂÀœºrå ÁÁÁ”ÈæQØÚÚR¹re5jÄÔ©Sånciii|öÙgÿªCwªQ£gΜ!))‰Š+Êß'''ù»³bÅ &Ož,×$:qâ}ûö%22ò¾‰!GGG¼½½‰‹‹C§ÓaaaAnn.ëÖ­£[·nØÚÚâççGjjªœìÍÊÊ"##ƒ5j V«qvvÆËË‹ÄÄD ƒ¼ ÙwõRòóóÃÆÆ†¡C‡âwÇ€ 111?~\@Ÿ ¥ðWµhÞ\AAžOOOžþyZ¶ ¦|ùòKKAxììì5jžžžÌ˜1ƒS§N‘””Ä?þȈ#¨_¿>={ö`ذa¸»»³lÙ2®\¹ÂùóçY¼x1Í›7§sÑÀ5YYYr²ãÎçòóóåÖ>VVV8::rþüyâããY¾|9«V­ÂÛÛ­VKxx8‰‰‰lÙ²…7nÈÃÛƒy8y+++–.]ÊÅ‹9wî ,(‘¨qww'''‡³gÏräÈz÷î]æúëtº2—³x”»ŒŒŒÿ³wçñ1ÝûÇ_3Ù÷‘Øc‰Rb'¤hc+ZK­·ÚjUÕ•jùuÓê‚^ªEWKmµ4ª‚Zj-EÔš[‘}Ïdæ÷Gdš[ï-·äý|<ÎCrÎwΜóc’yçûý.\¸À˜>}:#FŒ yóæ<ýôÓ×1”M~~>f³ùšÅž"""HMMeÍš5œûì3ëÿ•O>ù„û°®°råJÆŽËùóçñôôÄb±àççg­åHrr2GeË–- 0€ÐÐPºwï΢E‹Ø¸q#gÏžåÛo¿%>>GGG*T¨Àc=ÆúõëY¿~=çÎã‡~àСCŒ1êÔ©C·nÝX´h¿þú+gΜaÞ¼yìÛ·ÏæúêÙ³'5bìØ±ÄÄÄÀæÍ›yï½÷¨ZµªÞ@o!; ë Õ²oÛ¦õËá-[9>)"""""¥“Åb!--ø'hÒ´)ùù%?'œOH b¥Ê7üàm0ðõõ¥C‡ØÛÛ3{ölæÍ›ÇáÇy衇=z´µ¸íÛ·gï޽̞=›uëÖѨQ#Æg-PýÜsÏáããCjj*Ô¬Y“AƒQ©R%âãã©_¿~áMZ¼½ñññaãÆDEEáîîN¯^½hÕªƒèèh6nÜH… 0›ÍX,’’’Çßߟû￟˜˜æÎ˦M›èܹ³M!Ü5jÇ÷ßÏîÝ»éß¿?µjÕ*qþ7ndÉ’%T©R…íÛ·Ó³gOæÏŸÏo¿ýF¹råøî»ïøþûïÙ´i&“‰¡C‡2lØ0üýý¯Ï™3‡˜˜Ê”)ÃñãÇyà®Ú®iÓ¦\¼x‘èèh¶nÝJ»víHJJ"++ 777êÔ©ÃàÁƒ)_¾<çΣzõêøúúò …7 ùý÷ßiݺµµ&Mqëׯ'**Š_ý•=zX§m Ê•+GÓ¦Mqww'44{{{êׯOll,ÑÑÑìÙ³‡ˆˆ’’’ˆ‹‹£Q£F˜L&Þ~ûmªT©Â®]»hÙ²%o½õUªT!&&†–-[2f̪T©ÂÁƒ¹ï¾û(S¦ 4 ((ˆ•+W2gÎvìØAÓ¦M0`Àßv·¸Û©¨UÑHfÍš•hSTø|÷îÝÌž=›õë×Ó¼ysÞ|óMk«;wrêÔ)V­ZÅ?üÀÙ³gyñÅéׯŸõÿmQX·téRöïßÏÓO?MÍš5iÚ´)ÞÞÞ|÷Ýw,Y²777ž~úiÊ—/ƒƒ 4 lÙ²,]º”yóæ‘žžÎóÏ?OûöíqppÀÙÙ™¦M›âääÄœ9søá‡(_¾<8;;sàÀ:v숗—]ºtáøñã,X°€¥K—rêÔ)† Fxxøý>ºûðìÝÁhÅb¹¼€©àr]¡Ëë(ÈÃÛÙLH°/©))lÚ´É|èð‘ k™)¬3”OaÝ lþ¬#”]l)ª)TÔ¶àòb­+Tì_Ÿ‘«BpíâÓÅíۻ禊O‹ˆ”FÿôâÓšJ&"""""""RJ))¥ ‰ˆˆˆˆˆˆˆ”R †DDDDDDDDJ)C""""""""¥”‚!‘RJÁˆˆˆˆˆˆˆH)¥`HDDDDDDD¤”²¿ÚÊü¼|RSRÔ;"""""¥”ÅbÁ‚‹ÙŒÙ\ ¹K•†’“’˜1ý3rsrÔ;"""""¥”Åb±þk6›qssW§ˆˆÜ…® †,«~ZS733Ó+;;Ç?/?¯œÉTl6›+XÌæ²,þ Þ€+‹`o;Àpy¡Ø¿"""""r°³³cÜ[oú©'n‹ÅÂêÕ«>|8cÆŒá±Ç»j»uëÖ1lØ0ÒÓÓ©Zµ*³gÏÆÓÓ“1cƃƒO?ý4¯¼òÊ_>†—^z‰¨¨(âââ®ÙæÑG%66–mÛ¶ýGçùÖ[oñé§ŸÒ¡Cf̘‹‹‹Ív“Éć~È'Ÿ|B¯^½˜þøc^~ùe*W® À{gƒƒ=zô ""â?:†‰'òóÏ?_·Íœ9shРÁ|žo¼ñË–-Ã××—•+WÒ­[7 †?/·˜˜RRRpss»n(pÏ=÷°|ùr&OžL= Å`0ðÊ+¯`6›iÒ¤ ]»výŽó•W^áÇ´Ž¤»š?üµk×êâ•;Ž=Pte[Š}m ä9Åûb튂!9$""""r7Òïö·Q~~>3fÌ Q£F6!ɵÜsÏ=´oßž¯¾úŠ÷Þ{£ÑÈ‚ ¨P¡­Zµ²¶;qâ+V¬àÒ¥KT¨PN:Q®\9ëö””–/_ÎñãÇñõõ%22³Ùló\‰‰‰,]º”sçÎQ¦L:vìX",Ù·o?ÿü3©©©T­Z•®]»âééyÝsèÑ£K–,!<<œ²eË‘‘ÁÏ?ÿÌ}÷ÝÇêÕ«mÚÿñÇ,[¶Œ .àïïOË–-©W¯UªT¡cÇŽ,\¸† âììLtt4ŽŽŽDFFZæÌ~úé'N:E`` íÚµ£råÊÖþNKKcýúõÄÄÄàééIëÖ­1™L6Ç’’Š+ˆÅ××—x D?~œèèh.]ºDÅŠ騱£MŸ‹ü”1ÄŸ¡P>BYŽr.ÿ`(¸üµýååZÁ~ˆˆˆˆˆˆÜÙô;ým´fÍN:Å‹/¾Èܹsoüâ téÒ…}ûö±|ùrÊ•+G\\Ç· –^ýuêÕ«Gýúõ9pàŸþ9¯½öööö¤§§3a¼½½ #55•™3g’œœl}|JJ o¿ý65kÖ$,,Œ¤¤$¦NZ" yõÕW‰ŒŒäÞ{ïe×®]$&&òüóÏ_÷êÔ©ÃÏ?ÿÌ–-[èÞ½;ƒßÿÌÌL°³³³¶MJJb„ 4nܘ2eʰzõjæÏŸÏ–-[0 ´iÓ†˜˜.\H“&Mسg}ûöÅÙÙÙºI“&áììLÓ¦M‰‹‹ã믿æ…^À××—¬¬,¾øâ ësgff²téR›)béééLš4 ÂÂÂHKKcöìÙ\ºtÉæ¼ÆŒsÍ>ù§(1dàÏCÅG åP¥b;…Ì8ކCE£†Š–â?< ú"""""rç2üù;¾Üb±±±,^¼˜!C†Üp”Mq...<óÌ3¼ôÒK¸ººÒ¿‚ƒƒmÚL™2wwwœœœhݺ5½{÷&??{{{V­Z…‡‡ƒ ÂÓÓ“‚‚¶lÙÂ÷ßo}ü¢E‹¨Zµ*O=õŽŽŽ˜L&Ö®][búÔ¬Y³ðôôÄÑÑ‘ˆˆzöìyÃ`ÈÛÛ›–-[²víZš5k†§§'›7o¦nݺÚ´;w.õë×ç‘GÁh4Ò¨Q#}ôQëv'''† ÆÀÙ¶m<ðuêÔ± ÉÆŽ‹££#®®®ddd0|øp’’’ðõõeûöídff2pà@‚‚‚(((`÷îÝ,^¼Øúø5kÖàêêÊSO=…··7lݺզÍÕú¼W¯^˜L&CòRüj¼2Ê¥0JãÏP¨h{…£‡//ö\;R0$""""r'3ìÔ ·^ZZ‹-¢I“&Ô­[÷/?>00.]º°cÇÂÃÃ1ÿÌóòóóILLdÏž=äççpúôië4°ßÿ† âéé‰Á`ÀÞÞžæÍ›Ûƒþí·ß8p NNN888ЦM›ÏsöìYöìÙcz•p—˜&Mš°nÝ:vìØA`` §OŸæ©§ž*1n×®]Œ9Ò®TªT‰M›6Ù´qsscÈ!L™2…|ÐfÄ‘Éd"))‰“'O’sùnÜñññÖã=qâeË–%00ÐÚõë×ÇÏïÏúë¤N:xyyYÛ4kÖ 77·›îs)…ŒÑ€ƒ# ìŒ fŒFŒ°X GèÜöã*öuÑ423CÙŸ.>},©eÎü9j¨h:YQ8TüNe †DDDDDî\J– [àÈ‘#|ÿý÷4l؉'°cÇŒF#.\`ôèÑ6!Ì•ìììð÷÷ÇÝݽÄݽ6oÞÌòåËqvvÆh4b0HKK³n7›Í%ömgggÊØ,@‰‘/ÑÑѬ]» ƒáºÅ³‹sww§S§N|óÍ7ØÙÙѽ{w¼½½K´3™L×í‡"eÊ”ÁÕÕµÄ]ÄŠFÿ:ƒÄÄD›¾¸2Œ²³³³y΂‚k?^«¿6mÚÄòåËquuµöEzzº.ôR*þÔœ1[,X,…w4X°XŠ–ÂuYÙÙTöò¼­ÇVô¿¸h:YñúBE}±mùü9½Ì™Â‘DNØŽ*Z®5¤PHDDDDäÎa- a(üC±Üb•*UbÔ¨Q6ëNž<‰µjÕº©BÔ×òÃ?N×®]qrrÂl6³~ýz›ç>uêùùù8::……“‹‡:!!!:tˆ† Z×>|ØfÌìÙ³yùå—iذ!ŽŽŽ°bÅŠ›>ÎF±dÉÒÒÒ®y7µâââ  k}úé§Œ;ö¦žcãÆT®\™G}Ìf3±±±ÖíåÊ•ãСCdddàååŽô)êT¬X‘Ó§O“——gAuüøqrssmú¼U«VtéÒÅÚçëÖ­Ó…^ UðÈÇÕœ‰‹«Fãõÿgfš)ãfº­Çwµä¿hÄ?ï6f¡ä(¢+ƒ¡¢BÔŃ!Ý©LDDDDäÎôçïñƒ£ºãÖ+S¦ =zô°~Ÿ––ÆÉ“'±··'22ò†ÁÅb!33“ÜÜ\òóóqpø3Ï ä—_~¡Aƒ899±~ýzNŸ>Mff&®®®tìØ‘±cÇ@«V­HHH૯¾"%%…ÌÌLÜÜÜèÝ»7#GޤlÙ²Ü{|>}šiÓ¦‘ŸŸOvv6...T¬X‘uëÖQ®\9ìììX±b©©©deeáêêZ☳³³)(( ##ÃZ‹çÕW_¥  À:ê)++‹‚‚ë>úöí˸qãÆÇLJo¾ùæªÓ³222ÈÏÏ'77×Þ°cÇâââ([¶,¿üò  ##€fÍš±iÓ&æÍ›G·nÝHNNæÛo¿åÔ©SdddàááAûöíyã7ˆŠŠ¢uëÖœ?ž¯¿þš¤¤$kõyXX˜µÏÏœ9Cfff‰]rwóp2ãUÖO/ÏŽvKI6c0˜oû›ý•oüECEí/‡=N†@.—¿v\ù3r¼üuñ;”62^õ‹ˆˆˆˆˆüÓýþntttt?îw†ŽÌÌŒ ÷íÝCxDk› Bþ;yyy´k×ÎfÝúõë¯û¡2))‰îÝ»ðæ›oÒºuk›dæÌ™Ö[·wèЭ[·b0˜={6PX è“O>a÷îÝ”)S†ÇœO?ý”Š+2iÒ$ pä̇~Hll,åË—gðàÁ¼öÚk´mÛ–×^{ÔÔT>þøc~ýõW\]]yøá‡Y´h5kÖä£>*qÌ~ø!ÑÑÑT¯^/¾øâªç5räHvìØAóæÍ?~++‹E‹E~~>mÚ´!>>ž£G²zõj™9s&ëÖ­ÃÇLJ>}ú°bÅ 222¬wŠ;þy—÷QÀŸ¥„,× †Àv™C±È±XPäT,8*^gèÊBÔ1$""""rç†CvNNNNï½óöTC""Ý?=ºr*Yñ[×\±­¨þ‰?§•Š¡¢CŃ!P8$""""r'±Ž2 š÷""r—ºò®dE¡P‘¢zCÅïXVpy)š:–‡íh!#%ƒ!…A"""""w–¢š£FƒÁ¯î¹;]oÄAEë‹Â¡¢¡G&lƒ¡âE§¯,<­ÑB"""""w`og4šÔ""w'ûël+ ƒŠ~ Š­‡?GÙQÕ%*~73…B"""""w¦¢ßåínTCDDî\W †ŠF 1Sô&*¾…CWN£Ø¿ „DDDDDîû,¹¹¹|õÕWyÿQQQL™2€ *0~üxyýõ×9vìƒ ¢oß¾ÿÈ×iãÆ´hÑBÁÜñìÿBÛ+ƒ ¢uÅÿ½^P$"""""w`4Ú Ý&¿þú+S¦LaõêÕ7Õ¾yóæ¼úê«Ìœ9“±cÇ„ÑhäÕW_å­·Þ¢I“&tïÞý?:–Q£F~Ý6|ðÿÑþ;vìÀœ9søðà `ܸqŒ3†öíÛÓ©S§ìkõÎ;ïàì쬋Vîxö±ýÕ¡+·‹ˆˆˆˆÈÏúG`ƒ&Ü6ééé 4ˆÜT{"##9|ø0Ë–-ãå—_Æl6óóÏ?ãääDß¾}1 ‘ÁîÝ»IMMÅÍÍÚµkS¶lY †Â×7++‹˜˜.^¼ˆ»»;µk×¶n+R|Ô­[·D›3gÎpøða²³³  ^½z¸¸¸”8v'''ºvíÊX²d ƒ`åʕѭ[7뾓““‰‰‰!==Ýú¼~~~˜L&Ž;Ɖ'0™LøøøPµjUÊ—/ÅbáìÙ³;vŒôôtÜÝÝ©T©+VÄÑÑ‘ÜÜ\ââ∠Zµj„„„`gWx#¾ï¿ÿžòåËãççG\\YYYáîîΑ#GèØ±£5JNNæÐ¡C$&&âååEíÚµñ÷÷Ç`0Ïž={hÖ¬'NœàÒ¥K¸»»[ÏãÊ>¹ìÿƒÇhʘˆˆˆˆÈÝÏú{¿Á`Ѐo“Ö­[c0¬ÁÄÍ0 <öØc¼þúëlݺ___¶lÙÂàÁƒ­¡Pff&3fÌ 99'''òòòX½z5¯¼ò þþþdee1gÎN:e :vîÜIzzºõy233™>}:)))899a±Xعs'f³í€²·Þz ¼½½¹téñññôéÓçªÇn4:t(#GŽä·ß~`ûöí¼ñÆÖ°$==O>ù„üü|k˜³~ýz^~ùe<==Ù´i6lÀÙÙ™ÜÜ\âãã)((`æÌ™œ8q‚Å‹c2™°X,œ?žÄÄD^}õUÂÂÂ8zô(“&M"00ggg~þùgz÷îM£FX·n;wî¤_¿~äææò믿b4yöÙg5jÍ›7§\¹rÌœ9“cÇŽQ®\9233Ù½{7O<ñÞÞÞ$''óþûïÓªU+ÈËËã?þà·ß~cøðá899éâ—ÿû¿aú!!""""r÷±ÞpF£nã4ûÿì#š——ƒ bâĉøûûÓ¼ysªU«fݾnÝ:yá…ðõõ%==o¾ù†… 2tèP¶mÛÆÉ“'4h+V$33“+V`±üùqoÍš5$''óüóÏ[÷±dÉ›6ýúõãž{îÁ××—ØØX^yå•kC>>>ôíÛ—/¿ü;;;~øaë´2€~øƒÁÀˆ#ðöö&55•iӦŀˆŠŠâ cÇŽX,öïßOÿþý)((`ÿþýdggóâ‹/âááÁ©S§xýõ×9}ú4aaaòÌ3ÏpÏ=÷àààÀâÅ‹Y¹r¥54h111DDDP§NΟ?Ïùóçiذ!!!!6çA×®]©T©çÏŸçÍ7ßäüùóx{{F£F0<õÔSxyyqôèQ^}õUž|òICò?eTˆˆˆˆˆÈõ úcð víÚ4mÚ”¬¬,"##qpp°nÛ¸q#‘‘‘”)S{{{|||èׯË—/`ÇŽ4lØJ•*agg‡§§':uÂÝÝݺŸþ™öíÛ€ÞÞÞtïÞÝ:* Àl6Ó°aC IIIøøøpæÌ™{³fͨP¡¾¾¾„‡‡ÛìsÕªUtëÖ ìííñóó£W¯^¬X±€*Uª0gζnÝJjj*Õ«WgÆ 8::âëëËX¼x1 øøø0eÊÚµkj5jÔ ;;›ÔÔT¼½½¹pá‚ͱU®\™ºuëâàà@pp0 6,qü‹…ÐÐP¼¼¼HJJÂÞÞžŒŒ rssmÚEFFâç燽½=5kÖ$;;»Äˆ+‘ÛÍ^] """""rçspp Zµjœ={›mEµyŠóññ!55(œ&æêêjSëÆÃÃÃ& IOOÇÓÓÓf^^^6Ùµk_~ù%çÎ#??€K—.ÝðØ]]] &##Ã&ŒHMMÅËËËf]ÑÈ!€!C†P®\9¾üòK²²²(_¾<]ºt¡]»v´lÙƒÁÀÒ¥KY¾|9´jÕŠ‡z£ÑÈüùóY½z5)))˜ÍfRRRJ?vvv7ÉuüøqfϞ;}ûÈÎÎ`ÿþýŒ=Ú¦]ñs+š.xåˆ+‘ÛMÁˆˆˆˆˆÈ]®B… œ8q‚Æ[×:tÈ:*00sçÎa2™¬#Ξ=‹Éd²¶¯X±"ǧ~ýúÖuñññ6ÁÆ”)Sxä‘GˆŒŒÄÅÅ‹ÅrÕ6EÕªU9zô(*T°®;|ø°uªÜÚµk §wïÞœ?ž­[·2qâDÚ´iñcǰ³³cÒ¤Idff²k×.fÏžMåÊ•¹÷Þ{Y¸p!ï¾û.÷ÜsŽŽŽlÙ²…ùóçÿåc\½z5ööö̘1Ã: îñÇ×…'wM%¹Ë=øàƒ,[¶Œ={ö““ñcǘ:u*ÿú׿hÛ¶-Û·oç—_~!''‡3gÎðõ×_[GåtíÚ•¨¨(bbbÈÍÍåĉL›6Íf*”££#‰‰‰äå呞žNTTYYYÿÕ±÷êÕ‹™3gràÀrrr8xð _~ù%ýúõà»ï¾ã£>")) ???Ê—/ƒƒƒ½{÷2nÜ8öîÝ‹‹‹ +V´µc±XHIIÁd2‘@TTÔtŒööö¤¥¥‘MNN[·nåèÑ£ºð䎠`HDDDDDäböìÙ4hЀS§NÑ AÆÓ½té#FŒàÛo¿eÍš56ÛêÕ«ÇСCùàƒhÓ¦ /¿ü2mÛ¶¥uëÖÔ¨Qƒgžy†Ù³gÓ¦Mžyæ*W®Œ“““õ6òõêÕcðàÁŒ?ž6mÚð /дiS;v,£Gæ—_~¡C‡tëÖ¸¸8rss:tèuýÈ‘#¼ûî»|üñÇìÙ³Çf[“&Mèׯo¾ù&mÚ´aìØ±ôìÙ“¦M›ðÌ3Ï““C×®]iݺ5Ÿþ9#GŽÄÞÞž-ZаaCFŽIxx8£F²®óððà™gžáßÿþ7mÚ´aðàÁxxx°lÙ2¾ÿþ{þõ¯±fÍ4hÀîÝ»­Ç4uêT~ûí7k8ÕµkW¼½½0`‘‘‘,[¶ wwwú÷ïÞö~Ù²e<ùä“ÖºC“'Ofß¾}Ö6"ÿ+º½€ˆˆˆˆˆ\ñòçûÕCÜ”8tøsdff”h¸oïÂ#ZÛ;‘B[7oÄhO/o›º]W“’œŒÁ` F­PNÆÇ3nܸü¥QËRd™@*\K——¤ËÛ2.·Ër¼Ëû( ðîòæËÿjĈˆˆˆˆˆˆHi¥`HDDDDDDD¤”R0$"""""""RJ))¥ ‰ˆˆˆˆˆˆˆ”R †DDDDDDDDJ)C""""""""¥”‚!‘RJÁˆˆˆˆˆˆˆH)¥`HDDDDDDD¤”R0$"""""""RJ))¥ ‰ˆˆˆˆˆˆˆ”R †DDDDDDDDJ)C""""""""¥”‚!‘RJÁˆˆˆˆˆˆˆH)¥`HDDDDDDD¤”R0$"""""""RJ))¥ ‰ˆˆˆˆˆˆˆ”R †DDDDDDDDJ)C""""""""¥”‚!‘RJÁˆˆˆˆˆˆˆH)¥`HDDDDDDD¤”R0$"""""""RJ))¥ ‰ˆˆˆˆˆˆˆ”R †DDDDDDDDJ)C""""""""¥”‚!‘RJÁˆˆˆˆˆˆˆH)e¯.‘ÛáÒ¥KÄÆÆ’’’‚ÅbÁÇLJÀÀ@Ê•+‡££ãm;Ž‹/’˜˜Hhhè-®@PPaaaÖmçÏŸgçÎÜÿý¸¸¸••ʼn'8wîyyy8;;ãççGpp0~~~%öŸ˜˜Èž={ðóóãÞ{ïÅÞ^ñDä¯Ñ»†ˆˆˆˆˆÜr'Nœ ** “ÉDvv6YYY\¸pŒŒ †Ê}÷ÝwÛŽeïÞ½¬]»–>øà–?W||}:]ºt¡nݺxxx——Ç¡C‡?~<û÷ï¿­ÁÐíÔ¹sgÞ{ï=RRRèÙ³§Í¶ZµjѶm[êׯ——{÷îeâĉ<ñÄ 2777222زe C† Áb±Ø<>--}ûöÑ A~ûí7vìØA§NtÁ‰È_¢C"""""rK­X±‚Š+Ž——F£gggêÕ«ÇŒ30`ÙÙÙ,Z´ˆ‡~˜ððpž{î9bcc­Èƒ>H¿~ý¬û5™LÜ{ï½¼þúëÖu5bРA|óÍ7tèÐ6mÚðïÿ›´´4 p”γÏ>ˬY³hР7æ›o¾aáÂ…ÔªU‹ü‘ÁƒÓ¬Y3jÔ¨ÁÊ•+iÚ´)¡¡¡|üñǤ¦¦rÿý÷S³fMÆONNÎßÖOÉÉÉ?~œœœ ðôô¤]»vüòË/ØÙÙÙ´çÂ… Œ5Šàà`¾øâ Ìf³.8ùK ‰ˆˆˆˆÈ-µuëV7nŒÁ`°ý0b4âãョ§'?þø#?ÿü3'NdíÚµ´k׎ñãÇsüøqæÎKBB‚õñööö|ùå—\ºtɺnÖ¬Ylذ£ÑÈ‚ ˜5k±±±üðÃøøøðÙgŸñØc±{÷nvîÜÉO}S0`•+W¦lÙ²¼óÎ;Ü{ï½T©R‹Åb V¬XADD¾¾¾¼õÖ[L™2å¿î§êÕ«óÚk¯qÿý÷àAƒèܹ3=öo¼ñ§N²¶ýã?øý÷߉ŒŒÄÁÁGy€… ZG‰ˆÜ Õ‘[ÊÃÃŒŒŒ¶‹§zõêÖï dÿþýéù<==­¡ÑhÄÕÕ•üüü›zl```‰u^^^„„„°mÛ6‚‚‚ؾ};S§Nµn>|8...×ÜgQÁh³ÙlS<Úb±`±X¬#©ÜÜÜèÕ«áááœ7n\b[AAƒ£Ñˆ““¹¹¹899…ÁI~~~‰[ÙS®VãÇh4ÚL[»r ÛõnŠ899Q«V-Öœ¸¹ IDAT¬YÃÌ™3 ·¹ûWDDÄu÷éëëË… HJJ²y\vv6f³Ùz¾Û·ogåÊ•Œ9’Ê•+c±XÈÉÉ¡gÏžôìÙ“Í›7…#°¢¢¢ˆ‹‹cÞ¼yÖý~ü8f³™ôôtÖ­[÷—Ç`0`6›1™L¤¥¥qäÈ‘¶¯]»6ÙÙÙÌ›7¯ÄÝÅŽ;F||ü5ß®];ÒÓÓY¶léééÖóß³gYYY‘‘Á‚ Xµj•µX¶½½=Fš5kÀªU«hÖ¬d÷îÝÖåàÁƒxzz²jÕ*Μ9£ ODnŠF ‰ˆˆˆˆÈ-åííÍðáÙ?>eÊ”ÁÁÁ¼¼<Μ9CÕªU  o߾̘1ƒsçÎáêêÊÅ‹ñóó£E‹@áÈæÍ›3uêTªW¯NAA—.]âàÁƒMXXÕªU lÙ²T®\™¯¾úн{÷ˆÉdâàÁƒÔ«Wçž{ŽÃ‡3kÖ,‚‚‚8vìuêÔ±>Off&lß¾O>ù„×^{ ///]€"r]vê¹ ÃåÅèççëØ¨aÑMš6%??¯DÃó T¬T¹ÄíÔ‹  fÍšdgg“——‡››­Zµ¢C‡¸¹¹…S®ªW¯Nvv6‹…:uêеkWë¹ììì¨Q£F£‘‚‚‚ƒƒéÖ­nnnTªT‰€€bcc £B… ”-[–¼¼<.]ºD5 ÁÛÛOOOüüüÈÌÌ$00Gy„œœ|}}ñööÆÍÍÚµkÛrr2»ví¢mÛ¶T©RÅfzš 4 bÅŠW=wWWWÂÃéZµ*ÎÎÎ ¼½½‰ˆˆ ""ÂZŸÈ××—ˆˆjÕª…««+f³WWW6lÈ£>JÅŠIJJÂÅÅ…   ë9ÉÎÎÆÝÝÖ­[ãëëK:upvvÖ•,ò?vúÔI pºüÿÿzrrr0 øùš’¦M›Ì‡ÉÌ——üËK. dY—¿.Zr¼bm ./fÀrù©,ÅßìEDDDDD®d¼üyÁ¾Fõ÷Áƒ%þ™™%‹HïÛ»‡ðˆÖ888ܕѻwozöìÉ‘#GÂÛÛ›—^z‰C‡1fÌöíÛ‡«V­¢C‡téÒ…;vÁ½÷ÞK½zõèÛ·/ëÖ­ãÍ7ß$$$„-[¶0cÆ ZµjE@@€u?/^äþûï׋$"¥–F ‰ˆˆˆˆÈÿÜܹsyúé§©U«ÎÎÎÔ©S‡þýû³xñb¼½½ e×®]˜L&Ž9BëÖ­INN&--³gÏ’••EåÊ•1 Ö}víÚ•ÐÐPœœœ'''‡¼¼<ëöÅ‹óÞ{ï©óE¤TS0$"""""ÿsqqqÔ¬YÓf]HHñññ„‡‡³sçNINN&44”ððp6nÜȱcÇðôôÄÏÏÏæñ…yœ°X,Öí?þ8&LPç‹H©¦`HDDDDDþç|||HJJ²Y—’’‚··7P >|˜ƒ’““C­ZµèÖ­K–,áÀ–†ŠB¡k©Zµ*aaaê|)Õ ‰ˆˆˆˆÈÿ\—.]˜?>‰‰‰˜L&.^¼È÷ßOûöíððð N:Ì›7\]]ñõõÅÁÁmÛ¶Q½zuk½¢›uèÐ!¶l٢ΑRMÁˆˆˆˆˆÜ'Ož$::š¨¨(Î;g³­[·näåå1qâDÞ~ûm&Mš„‹‹ :u²¶iÓ¦ G¥E‹…fŒFî»ï>222lîzÃÖ­[™9s&ÙÙÙ¬_¿ž#GŽ0mÚ4k»ùóçóÆoè…‘RMw%‘ÛÂÃáC‡àêêj³ÍÓÓ“#FpðàA222¬#„ÜÝÝ­mxà*T¨@`` PxW³N:Q»vm‚ƒƒ­íüýýyýõ× ?ð\EÄĉqtt´¶ëß¿?;vÔ #"¥š‚!¹-|}}éܹó5·ûùùѪU«kn÷öö¦iÓ¦%öéëëk³.((ˆ   ›u5kÖ,QÜúÊïEDJ#M%)¥4bHDDDDDn™íÛ·³qãFu„ˆÜÕÜÜÜ6lØyì †DDDDDä–ñòò¢råÊ깫9;;߱Ǯ`HDDDDDn™ÐÐPBCCÕ""ÿPª1$"""""""RJ))¥ ‰ˆˆˆˆˆˆˆ”R †DDDDDDDDJ)C""""""""¥”‚!‘RJÁˆˆˆˆˆˆˆH)¥`HDDDDDDD¤”R0$"""""""RJ))¥ ‰ˆˆˆˆˆˆˆ”R †DDDDDDDDJ)C""""""""¥”‚!‘RJÁˆˆˆˆˆˆˆH)¥`HDDDDDDD¤”²WˆˆˆˆˆÈíd±XÈËË#''‡‚‚ìììpttÄÉÉ £ñïýûu^^éééxxxàèèø·ŸOJJ F£OOÏë¶ËÍÍ%##Ãz¾ÞÞÞdgg“••emc0 ?¨ÙÛãää„£££uݵdee‘}ÍíÎÎθ¹¹ÝÔ¹$''c6›quuÅÅÅ‹ÅBRRîîî899]÷ÜŠWœÙl&99à–½ÿ«½ƒ\]]ÿÖë1-- ³ÙŒ··÷-?¯üü|ÒÒÒðööÆÎÎNo>rU1$"""""·M^^{÷îåƒ>àÙgŸåÑG¥OŸ>ôèу#F°aÆ¿ý9£££ñ÷÷gõêÕ·äœ5jD×®]oØnëÖ­4lØž~úi-ZDhh(ôîÝ›^½zѧOüqÞ~ûmöìÙC^^Þu÷»páBjÕªEùòåéÓ§ÍÒ¾}{^{íµ›>—G}Þÿ}222h×®þþþ,Z´èšÛ¼y3 6dðàÁœ;wÎf[ZZ‘‘‘4jÔˆ_~ùåwM._¾œ{2eÊЫW/ºuëF—.]èׯ+W®´ þ[:t yóæ·å¼öîÝK³fÍð÷÷çøñãzó‘kR0$"""""·…ÙlfûöíŒ5 “ÉÄøñ㉊ŠbÁ‚ >œ 6ðùçŸßµçß¶m[yä¦M›À€hÑ¢žžž¬]»–U«V1þ|FŒÁÉ“'1bÛ¶m³Ž¬ºš'žx‚&MšàëëËš5kl–E‹ѶmÛ›>ÆéÓ§Û|ïááÁG}tÃÇ=ðÀôèу¹sçòÞ{ïqáÂë6oooÆOïÞ½iݺõ?îuéÕ«mÛ¶ÅÉɉ5kÖÅ|@™2exöÙgùé§ŸîÈë­qãÆ<ùä“zã‘ÒT2¹-ùúë¯quueðàÁàëëËC=ÄÉ“'mF”œ={–yóæqäÈììì £_¿~Ö)[£FâÌ™3Ü{ï½øûûó믿booO§Nh×®ŽŽŽ\¼x‘I“&0qâD,X@ݺuyõÕWØ¿? .äìÙ³xyyqÿý÷Ó¥K›ãŽgÁ‚;v {{{ÂÂÂxðÁ©P¡“'Oæüù󤧧ӿÆOÅŠÿ³hööøùùqß}÷áççÇ!Cøæ›o¨]»6yUªT¡J•*̘1ƒM›6Q¹reÞ}÷]Þ|óMŽ;FóæÍ6lØßò—+WŽY³fáìį̀Q£ð÷÷¿j»ŒŒ ~úé'6lØ@ZZ5kÖ¤{÷îÔ¬Y€„„^zé%:wîÌž={HII¡mÛ¶ÔªU‹¥K—’@ûöíéÔ©“uúZNN›7oæ§Ÿ~ââŋӥK6lˆ½ý?þF|||§bÅŠÌ™3‡õë×óðÓššÊ¼yóØ»w/f³™š5kÒ¿ÂÑp+V¬`Æ $''[ü*Uª0nÜ8¾ùæŽ;F^^žõZ=z4uêÔ!//íÛ·MBBeÊ”¡U«VÜwß}xzzb2™Ø½{7Ë—/çÌ™3øúúIëÖ­qvv¶9÷U«V‘””Dhh('Nœ¸jßg^^ÕªU£W¯^T«Ví†Óåî¤C"""""r[üñÇlذ¦M›^508p 'NàÂ… <ñÄ=z”ò裲fÍ^xáRRRxòÉ'™7o_}õf³™gŸ}€1cưeË p´J¯^½èÝ»7cÆŒ¡_¿~Öç|õÕW©T©Ï=÷•+WfÔ¨Q¬Y³Æº=!!Ë“O>É€øé§Ÿø¿ÿû?zö쉕*Ub̘1Œ3†²eËþ-ýU¥JZµjņ ¸xñâ Û[,rrr¬K·nݬۺvíÊîÝ»Yµj•uÝO<ÁÒ¥KÙºuëßö¿óÎ;Ô®]›/¾ø‚?þØZ[èJGŽaΜ9tèÐádzÿ~FMll,P6jÔˆyóæ±hÑ"kX÷ÒK/1iÒ$"##qvvæí·ßf÷îÝÖ`fîܹ¼ÿþûÔ¯_ŸçŸžråÊ1f̶nÝŠÅb¹©s°X,˜L&bccqppÀÛÛ›äädFŒÁš5kèß¿?´^›‰‰‰Ìœ9“‘#GR»vm^|ñEž|òI222¬}Þ±cG‚ƒƒñ÷÷·^+UªTÁd2ñÃ?0räHÊ–-ˈ#¸çž{x÷ÝwY¿~=‹… 6ð /àááÁsÏ=G£F?~<3gÎ$77—üü|–.]Êo¼AHHÏ=÷¾¾¾lÜ¸ÑæÜÒÓÓyçw˜9s&}ûöeÈ!dff2xðà›ºÆäî¤C"""""r[deeñÇàïïÕÄîî»…S­:ÄgŸ}FHHPX°¹k×®´lÙ’'žx‚*UªÐ°aCzõê…——O=õ_|ñ¿ÿþ;mÛ¶ÅÁÁàà`‚ƒƒ µ>_AAŸ}ö/^$''‡úõëc2™˜6m‘‘‘Lž<™Ó§OóÕW_Q½zukhñÕW_„££#®®®6ûþ;¸¸¸P®\9Î;GNNÎ Û'%%ÙL+ YKŽ®T©Òß^è»J•*,\¸§žzŠ)S¦`2™5jT‰v5kÖäÝwß%##ƒ¼¼<"""=z4¿þú+!!!8::ZG”õéÓ‡-ZpñâE¾øâ Ú´iC‹-ÈÊÊbÚ´iœ>>Ô®]›ììl\]]1™L¼óÎ;”/_žâïïO­Zµ8vìŸ}ö-[¶ÄßߟI“&Ñ´iSú÷ï§§'!!!ìß¿Ÿ#GŽXŸkÓ¦M,X°€©S§@… XµjŸ~ú)o½õ–Þ¨ ‰ˆˆˆˆˆÜvvv8;;“ŸŸÙl¾î]’öíÛ`3%«jÕª¤¤¤gÓÖÓÓÓ:½ÌÉÉ “ÉtÂͿýöo½õyyyT©RRRR8}ú´µMLL öööTªTɺ.44” &Üòþ*(( ''gg盺£”ŸŸŸÍT¼¢Ò·[ÅŠ™0a¯½öÓ§OÇÝÝ{î¹Çæ¼¾þúk,X@ùòå  ))‰´´4RSSKìÏÓÓÓz׺+¿7™LÖ)[ééé=z”ƒòÕW_a00›Íœ}¨U«ÁÁÁ„……Ý0lÉÍÍå÷ßç°¹ŽŸyæëöÝ»wÓ·o_|||¬Ûƒ‚‚¬ÇåîîΡC‡èܹ³5\uww§L™26ÏuæÌغu«õ:7›Í¤¤¤°yóf½I•R †DDDDDä¶ðòò¢zõêœ>}šœœœ·PŸ>}:>>>ôîÝûª·X,W­Rt{ñ¿jÉ’%lÙ²…èèh7nŒ££#Û·o'??ÿªÏ}»¥¥¥qìØ1jÔ¨aý°ÿWÕQº³Ù|KŽÛ`0P·n]ÞyçFÍäÉ“iÚ´)uëÖ §|M™òÿíÝ{pTõÝÇñÏn²›;$$„ „€! Ë¥\ªXÇÚNQZ „Ko”Ôky&2ã(´U* NKÁ:š©U£“òÔNåyÔNÊØ¤¤2b0á’DrBB–ìý<$»n6†÷kæÌîž=çÇÉ9áÌü>ùý¾g—²²²ôÌ3ÏhìØ±:qâ„Þxãn‹lû¯mO¯¡Ìf³¬Vkàû+V(,,,P‡¨'‹EÏ?ÿ|ŸÎÐ߉åË—kذa*++SUU•Ž9¢·ß~[ÍÍÍzæ™gúÕVOç ·}üÛôåw58h“Úk%&&r“ºEQcÀ€HMMÕ·¾õ-ª¼¼< :T'NœÐk¯½¦%K– E?ôÐC*))ѶmÛôÃþPG»víÒâÅ‹E•+**$I/^ÔÅ‹•˜˜XW[[«ÖÖVÅÆÆjèС=z´þõ¯)11QûöíSRR’¦L™¢ýû÷k×®]Z°`>øàÕÕÕ)..NÕÕÕJMMU~~¾:¤§žzJ?þñåóùTXX¨Õ«W~®‰'ª¦¦FûöíSkk«þð‡?è¯ýk—ŸÿòåË¿š;w®êëëÕÜÜ,Ç£²²2y<566ª¤¤D{öìÑÊ•+õÓŸþ´×)Puuujii‘ÛíÖ™3g:Mw ¶xñb¨°°P999úóŸÿ,·Û­Ë—/«¡¡AÉÉÉóç?®ØØØ@RUU˜Úª©©Iª¬¬Ô¼yó&³Ùx‚تU«d±X¡ÑìÙ³UVV¦={ö(--M………°Ên·+<<\çÏŸ—Ô¶µµ¹sçΩ­­­Ëq¥¥¥)??_/¾ø¢’’’tçwª¹¹Y{öìQNNN—K~ jjj’ÏçÓǨiléÒ¥*))ÑöíÛµnÝ:…‡‡«°°PÓ§O׃>8Î5kÖhË–-JMMUyy¹¢¢¢:=ån„ *..Ößþö7y<½üòËz饗ôÈ#èé§ŸÔP*++SEE…æÏŸ¯ððpýò—¿ÔæÍ›õûßÿ^_ûÚ×ôÑGéÝwßÕºu딑‘!³Ù¬ 6è·¿ý­ 5gÎ;vL{÷î ü¾eddhÁ‚úÞ÷¾§;vÈb±h̘1ª­­Õ믿ø9pë ã膩c1'&³Îœ1ã¿fÍž-·»kížúº:IÛ§:8111š7ož’’’ôüC‡RKK‹–-[¦x ÐFtt´îºë.566ª¸¸X§OŸÖ¼y󔟟¨Ã²k×.¥§§Ëjµ*%%EãÆÓo~óåä䨭­MÙÙÙ>|¸âããõXŽ=ªÔÔT-Y²D³fÍR||¼>üðCUTTh„ JHHаaÃäv»5}útÅÆÆjÁ‚ºxñ¢Þ{ï=UVVê;ßùN 8µ¿³o·ÛuìØ1ÕÖÖv*Œìøñã:zô¨l6›Îž=«{ï½Wû÷ïW}}½&M𤒒9rD•••Š×C=¤•+W*..®×sºoß>}úé§š0a‚ššš4wîÜn·›:uª ÃЩS§TYY©o~ó›²X,ŠŽŽVBB‚222´cÇeeeÉëõ*##Cñññ*((ÍfÓ¥K—4wîÜÀùVZZªÒÒRUWWëÞ{ï „@RûHž¯|å+JLLTzzºÂÂÂd³ÙÔÚÚªS§NéÂ… ºûî»e±Xd·Û£ÅvïÞ-›Í¦O>ùD³fÍÒÿøGÙl6544hÖ¬Yzíµ×Ç5gÎ%$$hâĉÊÌÌÔ©S§T\\¬šš-X°@‹-êq*Yqq±ÎŸ?¯ììlÕÖÖŠ2‹ŒŒÔüùóåt:õÏþS'OžTVV–6nܨáÇK’e2™ôÑGéèÑ£jiiÑ’%K”——ø½ÎÌÌ”ÇãÑÑ£GU]]­ÜÜ\Mž­èÊ•+úÑ~¤ûî»O2›ÍJOO×øñãuüøq>|XñññºãŽ;”œœ¬ÊÊJ-\¸PV«U³gÏVrr²Š‹‹URR¢K—.)77WóçÏçqõ7HuÕy™LRDdäçžc‡Ã!“ɤĤáj¾|YÅÅžòÓ9$ù:wÇâ”Ô&É.éjÇ{ÿâ”ä ÚÖÛ±ø$ù‡FÁ7{eîè/„gfŒýŸüäÓ‡Öý§ìöÖ.ž8^ª;æ-èÚ:x@f“4dhüç> ðrS“L&“2'NÒùsçô«_ýÊýæÿüïeIµ‡ëׯì³qãF. p“b* µµµ:wño(--M’4{ölýú׿ָqãúÝ^MM^yåUUU)%%E¹¹¹š2eJ¿Ú¨ªªÒ«¯¾ªêêj9RË—±WÅ ÏIDAT/WVVV¯ûTTT¨¨¨H.\ШQ£ôýï_ééé\``bÄ uuu:þ¼Þ|óMÝ}÷ݺçž{ô»ßýN™™™JLLìW[ zôÑG•žž®µk×jêÔ©Ú¼y³.\¸Ðï6222´víZeggkÓ¦M½¶QWW§M›6iòäÉZ»v­&Nœ¨Ç{Luuu\``"€AÀn·ë­·ÞÒ!Cô—¿üEEEEr¹\Ú¹s§.]ºÔ¯¶^yå}ýë_×Ê•+5cÆ -]ºTk×®Õ³Ï>Ûç6^zé%-\¸P+V¬ÐŒ3ôÝï~Wk֬ю;zÜç¹çžÓªU«´lÙ2͘1CË—/×Ò¥Kõâ‹/rAŠ`Ã0tçw*77WñññJNNÖêÕ«ÕÔÔÔ¯‘>’T^^.›ÍÖiÝܹsUZZÚç6>üðÃ.mÌ™3§×6Nœ8¡™3gvZ7sæL½Ïmdee騱cÖ•””hÚ´i=î“““£÷߿Ӻ#GŽ(;;› R<• qãÆiøðázùå—u×]wÉãñèwÞQff¦ÆŒÓ뾆aÈd2>¯^½Zùùù ÓĉuîÜ9éùçŸïskÖ¬Q~~¾L&“&L˜ ³gÏj÷îÝÚÝçg?û™Ö­['§Ó©ñãÇëã?Öž={´k×..00H1bððpÝwß}š2eŠvïÞ­?ýéOš6mš~ðƒ(&&¦Ëöï¼óŽ<$©¥¥EC‡ |—œœ¬§Ÿ~ZgΜQAAÊÊÊôä“Oê¶ÛnëµøøøÀw#FŒÐöíÛUYY©‚‚ù|>ù|^¹\®Ž÷>ù¼^={VW®\Ðc#†!Ã0a×ëí }Ì\€¯­­M­­­íÓÇ$†¡+W®Èír}iÇD00*++UXX¨ššù|†**þO»wÿ·êëë¿´cb*ÀHII‘Ýn×¶íÛe³MÕ‘÷(;;[Cãã¿´cbÄÀHJJÒÚTjjª^xáEM™2E+V,W\lì—vLŒ Cââôè#hÁüyš:uj õ—…C7ˆIêü˜L&Íž=[&“©ÓzÃ0Úw@C7ˆÙlV}míçnçõztéâ§2›6ª!¸ARnjќԹsgåöxdF—Åëõê“ Ôt¹I)))z|ÔÐ/N§SFд“É$»½Uáát/ TllŒÆ«÷ŠèêU{ût±&“YC‡QúøñŠ‹‹ÐããÎ  _Ž6y<žÀçÛFVcC='z0"e¤F¤ŒìÓ¶a=‡ìFЫq½Ž`@¿$%%Ëd6q"àðz¼òz=ýÙåš‚"‚!ýâv»8 0pŒ^Þ=|ßç ˆ` „Çë“ËíSpI Nõ É¡Hk˜ÂÃÍ]=!‹¯c …B·‘ú è­3âs¹Ü×ó†ýª=ìrss¸Ëé´8ŽH‡Ãát:#\.w„Ûí²z<^‹Ïç óù|fÃÉaú¬[bp6ÜT.6»TÓ`—aH†ÏÏ0dø|íOóë¤ôÔX%‹V˜ùz>øÝ¤††:Õ74x$µJòHrIrH²Kº"©¥ã»6IΎkO} ˆ˜  ·¾‚YíP¶HŠ”+i¨¤¤ e˜¤„Žï¢$Y%…uìk¢ßýêøÔö¸Ô9ÔÙÕ]éXZ;>Û%]íØÆy:–àÐÈ1 o#¤ƒâ‘ä鍸ûžŽ÷þ?Ÿ À¿÷ßwý÷[‡>%äVçà'tÔP¯Óˆ|^Ç$ø}p(äTû_£#Ô>¢ÈèXoQûˆ!“1×rï †üÓÉü£†ü#ƒê‡CþvºRF0 §N‰?ÐñuL¼ê YÔ>2Èèè”X;úá"€k¹û_ý÷`0 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. glom-1.22.4/docs/user-guide/C/glom.xml0000644000175000017500000012375012235000130020621 0ustar00murraycmurrayc00000000000000 ]>
&app; User Guide V&manrevision; for &app; v&appversion; 2004 Murray Cumming &app; Development Team &legal; Murray Cumming &app; Development Team
murrayc@murrayc.com
&app; &appversion; &date; Murray Cumming Murray Cumming This manual describes version &appversion; of &app; Feedback To report a bug or make a suggestion regarding the &app; or this manual can be submitted to the GNOME Bugzilla , under the &app; product. Please search bugzilla before submitting your bug to ensure that yours hasn't already been reported. User manual for &app;.
MY-GNOME-APP mygnomeapp Introduction &app; allows you to design and use database systems. Getting Started Starting &app; You can start &app; in the following ways: Applications menu Choose Office &app; . When You Start &app; When you start &app;, the following window is displayed. You may open an existing Glom file or create a new one, possibly basing a new Glom file on one of the examples.
&app; Start Up Window, Opening an Existing File Shows &app; main window used to open an existing Glom file.
&app; Start Up Window, Creating a New File Shows &app; main window used to create a new Glom file.
Using &app; as an Operator To open an existing &app; document, either open that document from the File Manager, or choose &app; from the Applications menu, and then choose the document when asked. &app; will ask you for a user name and password to access the database. Your administrator will provide your user name and password. When you open an existing document, &app; will be in Operator user level. This user level allows you to find and edit records, but does not allow you to change the fundamental structure of the database. Navigation Each database has several tables. To look at a different table, choose Tables from the Navigate menu. Then double-click on the table, or select it and click the Open button.
Navigating to a Table Navigating to a Table.
Viewing and Entering Data When in Data Mode, you can view or enter information in either the List or Details view. The List View The List view shows many records at once and usually shows only the most important fields. When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you. To create a new record just click the New button, or start typing into a field in the last empty row. A new record row will be created with blank fields for you to fill in.
The List View The List View.
To sort the records just click on a column header. For instance, you could might click on a date column to list invoices in order of their date, and click again to list them in reverse order.
The Details View The details view shows only one record and usually shows all the fields arranged suitably. When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you. To create a new record just click the New button. A new record will be created with blank fields for you to fill in.
The Details View The Details View.
Finding Data Choose Find Mode from the Mode menu. The fields in the List and Details views will now be empty, and a Find button will appear at the bottom of the window. Enter information, or part of the information, into a field to find records with that information in that field. For instance, enter Jim into a name field to find records with "Jim" or "Jimmy" in the name. When you press the Find button, &app; will search for records and then display them. If only one record is found then it will show you that record in the Details view. If several records are found then it will show you those records in the List view. Printing Reports If your database developer has defined some reports for a table then you will seem them listed in the Reports menu. Just choose the report from the menu to create the report. If you have previously performed a search then the report will contain only the currently-found data. Otherwise it will contain all data in the current report. Remember that each table has its own reports so you may need to switch to the relevant table to use a particular report.
A report A report.
Using &app; as a Developer When you create a new document, &app; will be in the Developer user level. You can also change to the Developer user level after opening an existing document, with the User Level menu. &app; will only allow this if the administrator has allowed it. Adding Tables You can see the list of existing tables by choosing Tables from the Navigate menu. You will also see this window after connecting to a database server, after creating a new document. To create a new table, click the Add button and enter the name for the new table. &app; will suggest a human-readable title for this table. Operators will see this title instead of the actual table name. You can also mark a tables as hidden from Operators. For instance, Operators should see "Invoice Lines" as related records from the "Invoices" table, but they should never be able to navigate directly to the "Invoice Lines" table. You can also specify one table as the default table. This table will be shown whenever an operator opens an existing document, without asking him to select a table from the list. You can also use this window to rename an existing table. Click the Open button to look at the selected table. Editing Fields Choose Fields from the Developer menu. This shows the list of fields in the table. New tables automatically have a primary key field, but you can change this field if necessary. Click the Add button to add a new field, then enter the name of the new field. &app; will guess an appropriate human-readable title for this field, but you can edit this. Operators will see this title instead of the actual field name. To specify more field details, select the field and click the Details button.
Editing Fields Editing the table's fields.
Primary Keys Each table must have one, and only one, Primary Key. The value in this field will be unique, meaning that each value in this field will appear in only one record in the table. For instance, each record in a "Customers" table would have a "Customer ID". This value will be used to refer to that customer from other tables, such as "Projects" and "Invoices" records. See the Creating Relationships section to see how you can relate tables together. Field Types &app; offers a few simple field types: Number Text Date Time Boolean - either true or false Image Calculated Fields Field values can be calculated in terms of other fields, using the Python programming language. This calculation should be the implementation of a python function, which should return a value. The return value will be used as the value of the field. This value will be recalculated every time one of the source fields changes. TODO: This only works for default values at the moment, and you can not use field values in the calculation yet. You can also use calculations to specify a default value for fields, by selecting the Default Value tab in the Field Details window, clicking on the Calculate Value check box, and then entering a Python calculation. You can test this calculation in the Edit window.
Arranging Layouts Each table has List and Details views, and by default these show all fields in the table, in order of creation. You can edit the layout by choosing Layout from the Developer menu. Arranging the List View For the List view, you can specify the sequence of field columns, and whether some fields are hidden.
Editing the List Layout Editing the list layout.
Arranging the Details View For the Details view, you can create groups of fields, and give these groups titles. You can then place fields in these groups and specify the sequence fo fields in these groups. You can also specify the sequence of these groups. For instance, in a "Contacts" table, you might create a "Name" group, and place the "title", "first_name" and "last_name" fields in that group. You might have other groups for the "Address" fields.
Editing the details Layout Editing the Details Layout.
Creating Relationships Tables in the Database are often related together. For instance, an "Invoices" table might have a "Customer ID" field. A value in this field would specify a record in the "Customers" table with the same value. &app; can show extra information, such as the customer name, from that related record. Or it can show a list of several related records - for instance, several related "Invoice Lines" that are related to a record in the "Invoice" record. To create relationships, choose Relationships from the Developer menu. This will show the list of existing relationships. Click the Add button to create a new relationship, and enter a name for it. You should then choose a field in the current table, and a field in another table to which it should be related. This relationship will find any records in the other table for which the values in both fields are equal. You can use the relationship in the following places. To show a related field on the List or Details view. To show a list of related records on the Details view. To lookup a value from a field in a related record. For instance, to copy the current price of a "Product" into the "Price" field of an "Invoice Line" record. To calculate a field value. Users Administration To define the Operators who can use your database, and to specify what access they have to the various tables, choose Users from the Developer menu. Translations &app;'s user interface (and this document) is translated into several languages, as you should see already if you are using your computer with a non-English user interface. In addition, &app; automatically shows and understands numbers and dates according to the current user's local conventions. For instance, a user in the USA might enter a price as 1.99 and a date as 1/13/2008, but a German user of the same database will later see that as 1,99 and 13.1.2008. However, the &app; system that you create also contains text that must be translated if it will be used by people who speak different languages. For instance, you must provide translations for the titles of your tables, fields, and reports. All of these text items can be seen in a list when you choose Translations from the Developer menu. In this window you can specify the language that you used for the original text, and enter translations for each text item for additional languages. When the &app; system is opened by a user of that language then these text items will be shown in the user interface.
Translations Translations.
Experienced translators may be more familiar with the .po file format, or you might wish to use the many tools that work with the .po file format. By using the Export button you can create a .po file to use in a separate tool or to send to a translator. You can then import the resulting translation by using the Import button.
Defining Reports Adding or Editing Reports &app; can produce reports to show specific fields for sets of records, sorted and grouped. For instance, a shop might need a report listing all products sold in one month, grouped by product type, and sorted by price inside each group. Each table has its own reports, which are available to the operator from the Reports menu. To define a report, or to change the definition of an existing report, choose Reports from the Developer menu.
Creating or Editing Reports Creating or editing reports.
Notice that each report has an ID as well as a human-readable name. This allows your report to have a translated title when used on a computer that uses a different language.
Editing a Report A &app; report has three areas: The Header, which appears at the start of the report The Main area, in which the records and summary lines are shown, with the actual data from the database. The Footer, which appears at the end of the report. Inside an area, such as the Main part, you may add report Parts, such as fields, text, or images. These will usually appear in a row on the printed report, with one row for each record. In the simple case, this will look much like &app;'s list view. You can add parts to your report by selecting them from the Available Parts list and then clicking the Add button. The part will then be added to the Parts list, in the selected area. To specify details for the parts, such as the text or image to display, or to choose the field to display, select the part in the Parts list and click the Edit button. You may also specify field formatting by clicking the Formatting button, just as you would when defining a details or list layout.
Editing a Report Editing a report.
Some parts may contain other parts and have extra properties to control how they present their child parts. For instance, the Group By part groups records together by a field. For instance, a products report might group a list of products by product type. You can even add a second sub-grouping inside the main Group By part, by selecting your top-level Group By part in the Parts list while adding a new Group By part from the Available Parts list. For instance, you might group your products by manufacturer, inside each product type group. To specify the field by which the records should be grouped, select your Group By part in the Parts list and click the Edit button. You can then choose the field by which the records should be grouped, and select the fields by which these records should be sorted within the group. You may also specify some additional fields to be displayed in the group's title row. For instance, you might want to group products by a manufacturer ID, but also show the manufacturer name.
Editing a Group By Part Editing a report.
The Vertical Group part may contain other items. For instance, it allows you to arrange fields below each other instead of just one after the other in the horizontal row. This is useful for grouping related fields such as address lines, or just to squeeze more information into the records's row on the report.
A Report with Vertical Groups A Report with Vertical Groups.
When you have finished, click the Close button to save the report's definition. Your report can then be chosen from the Reports menu. See the Printing Reports section for more details.
Dialogs Dialog: Initial dialog This dialog allows the user to choose an existing document or create a new document. Existing documents may be selecting from the list of recently opened documents or by select a file with the file chooser dialog. Documents can also be opened via the network if other users are running &app; on the local network. Finally, a new document can be created either by opening a template file which already contains some initial tables and records, or by creating an empty document. Dialog: New database Dialog: Create database Dialog: Connection This dialog requests a user name and password for connection to a database server. This is usually not the same username and password combination with which you log in to your system. All &app; systems require a database server on which the actual data will be stored. If the database server is not running on your local computer ("localhost"), then you must also provide its network hostname, such as "glomserver.openismus.com", though your hostname will be different. Your system administrator can provide these database login details. If you are the system administrator, see &app;'s Postgres Configuration web page for help with installing and configuring a database server. Dialog: Connection Error This dialog is shown when &app; could not connect to the specified database server. Either the database server is not running at the specified hostname, or the user name and password were not accepted by the database server. See the Connection Dialog section for more details. Dialog: Database preferences Dialog: Change language Window: Textobject Window: Imageobject Dialog: Notebook Dialog: Data invalid format Dialog: Relationship overview Window: Groups Dialog: Group by sort fields Dialog: Group by secondary fields Window: Button script Window: Field calculation Dialog: New group Dialog: Choose user Dialog: User Dialog: Translation identify original Dialog: Translation copy Dialog: Choose Date Dialog: Import Into Table This dialog allows the user to import a CSV (comma separated value) file into the current database table. It shows the first few rows of the file to import and allows the user to select the target field in the database for each column in the CSV file. For auto-incremented primary keys, the primary key field cannot be used as a target field, but otherwise one column must be imported into the primary key field. About &app; &app; is maintained by &app; and GNOME community volunteers. To find more information about &app;, please visit the &app; Web site. To report a bug or make a suggestion regarding this application or this manual, you can submit them using bugzilla. Another excellent source of information are the &app; mailing lists. This program is distributed under the terms of the GNU General Public license as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of this license can be found at this link, or in the file COPYING included with the source code of this program. Concepts &app; is easy to use, but you must understand the following basic concepts. Database: Each &app; document allows access to one database. Table: Each database contains several tables, such as "Customers" and "Invoices" tables. Field: Each table has several fields, such as "Customer ID", "First Name", and "Date of Birth" fields. In other documents and applications, fields are sometimes called "Columns" Records: Each table contains several records, each of which has values for each of the fields. For instance, the "Customers" table will have a record for each customer. In other documents and applications, records are sometimes called Rows. Relationships: Each table might be related to other tables, via fields in both tables. For instance, a "Customers" table could have a relationship to the "Invoices" table, so that people could see all the invoices for that customer. Only developers need to understand this concept. In other documents and applications, relationships are sometimes called "Joins". Calculated fields and button scripts Calculated fields and button scripts use the Python programming language. The calculation or script is the implementation of a function whose signature is provided for you.
Editing the definition of a calculated field Editing the definition of a calculated field.
Field values For instance, record["name_first"] is the value of the name_first field in the current record. Related Records For instance, record.related["location"] provides the related records for the current record. Single related records For relationships that specify a single record, you can get the value of a field in that record. For instance, record.related["location"]["name"] is the value of the name field in the table indicated by the location relationship (often called location::name). Multiple related records For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance, record.related["invoice_lines"].sum("total_price"). Testing for empty values How you test for empty values depends on the type of field: Non-text fields Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, &app; does not assume that an empty value in a numeric field should mean 0. You can test whether a field is empty by using Python's None. For instance: if(record["contact_id"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] You might also test whether there are any related records. For instance: if(record.related["contacts"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] Text fields For text fields, you should check for zero-length strings. It is not possible in &app; to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance: if(record["name_full"] == ""): return "No Name" else: return record["name_full"] Using the full pygda API pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the current database directly. This allows you to run any SQL query, for instance to read data from the database with a SELECT, or to change values in the database with an UPDATE. Note that the connection is already open so you can avoid the difficult work of specifying the connection details. The record's table_name attribute also provides the name of the current table. This example reads all data from the current table and prints the values to the terminal: # Use the current database's connection # to get all the data for the current table. # # record.connection is an already-open gda.connection object, # saving us the bother of opening the connection, # or even knowing the name of the database. query = "SELECT * FROM %s" % record.table_name data_model = gda.gda_execute_select_command(record.connection, query) rows = data_model.get_n_rows() columns = data_model.get_n_columns() print " Number of columns: ", columns for i in range(columns): print " column ", i; print " name=", data_model.get_column_title(i) # Find out whether it's the primary key: field = data_model.describe_column(i) if field.get_primary_key(): print " (primary key)" print "\n"; print " Number of rows: ", rows for row_index in range(rows): print " row ", row_index; for col_index in range(columns): print " value=", data_model.get_value_at(col_index, row_index).get() print "\n";
glom-1.22.4/docs/user-guide/C/figures/0000755000175000017500000000000012235000130020575 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/C/figures/glom_data_list.png0000644000175000017500000020147412235000130024275 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÚ;xãÔsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwxUÛÀáßÌlM…@ Ô„:RA±c6@TTP@E¾×ÞðUTD±7D M±¼*b§Hï-t%½l™9ß›„”Í&À†¢ÏÍ•+ììì™3Ï9»™gÏÌB!„B!„B!„B!„B!„B!„B!„BQUZ%Ë+û-„B!„Bü›¨Ê~Û‚¼H,»ÝÎ9çœCß¾}q8†Q}U ¥û¥i¥¿°, MÓÊ-ÇöÊ–YT‡ŠêV¤:ê€i‚¡jâC<ôÜa~O¢°På ,*ECC?ÂÊ 0 ëºjum¿(NEÛ<|J4v¥Ö)Ü’ô}¢èUEKŠú›*|RÓÀR £:úÁûwÉWü|`Ÿ•²ÐµÒ± õºcB)J¾ATQO.Q'Ë²Š—-WJ•z—\^rYQiÊ´@C!K)ô¢6?Tá¿B÷­’õ RD¹šØýë´¾G¨‚ÒR޶¾U«G Ýu½âÏ™`ŸûeûGXú¼R•ö§ãþþ*Á4ÍrËNôãˆI°ø‰#WÑñÙᨎ÷Ö‰Z/ñÏ$ýí𙦉ÇãaúôéüüóÏø|¾¢§¢E) IÉß ‚g\`ÕªU‹±cÇÒ®];Z´hÛíþ×V!„B!ÄÉaëÖ­üù矜sÎ9aË]=;vì`ݺu<ðÀìß¿ 6ÄÚ"0*Wò·XAG´cÇŽ¥OŸ>DEE?ŽoA„B!„Bˆê i¦i†-ѶÙl$%%Q·n]žþy†ŠÇãqH¬ý%~k…¿ K´¹à‚ h×®]©$[!„B!„8‘iš†Ïç ûÙØ6›äädÎ;ï<æÎë"T€W{þѾòÊ+iÞ¼¹Œ` !„B!„8ihš†ßﯖ˞ëÔ©ÃUW]ÅܹsÝì²Ivá$=Œh»\."""Š'B!„B!NtÕ5¢]TvDD€›ÀhvÙ$»hÖf‚Žh†!£ÙB!„B!N*Õ9¢ ÅwÐpQ:É6)}­vðm(+!„'!3ƒÕ¿ýÊÒÔlê_p g׳£[v¼ë)ÂOÚùä#m&„G­(Ñ®f®ÂßEI¶¿ð§ø^ÊÝG[NBˆ‚‚Í|òÚû,ðDsI×>œ PÁ–§ê©ÜÕL~f,sö%sÃc÷sE¢S‹p9ÚùhYžLöì<ˆ­~u\áë!ÕUîûµ™B/º®‡L´u]Êç»-¯€“ÒI¶@’]”h‡Ñ–ûf !Døø.cöGŸòõÂìÊòሎ§Q³®ô¾¹?=ÝèÕ´]¥¬ÀJº†Nà¢`ËJWv/ß¼ø,-ÝÍÁüÀ+ÃCBÓŽœÓë:®îVgþD˜kø}u:9æ"~ÛZÀ•‰Î£/4œ|[ùpø½|²Û ’ð4ãž÷Ÿå‚8ã„ýr Òv>š²½ûY2g*ŸÍ_ÅæíûÈ6mDÕkF§—3ðº®Ôµ‡'**c>ßú*+ͺôýUnhl?¡Ë ¹Mï>ÏúˆÏæ¯bÓ¶äa#ªNÚv»€¾×GŠ^½m&„ÿš¦U˜,ëºN›6mÐuM›6‘••@LL M›6Ų,V®\‰iš•mÆN Á¶¸.»T’ ÁG´¹g¶B„Uþ>xô)¾Øib~¾ægìaâ¿ØyãMè(ªåc·T¡в—-+ó:+Ÿ´ÍÛ9kb);n—FAN:Û–ÿć+þfû#¯po—G™K 0âNf'qáéµ°i~|Ö ô÷G),ÓÄ4ƒ$Ún'.› ‹©ÊŪÒÎGZtö2Æ?<Š9;L,UT®IæŽUÌûµ=ýûž*<£±J™x- ËÍfCC…%ÞÕUn…Û+3«(6&™»×ñûÿè}}Ïjm3!„ø·Ð4­Â\Öçóaš&†aдiS6nÜ@Ó¦M‹ôpM¤Va¢mYVñð¹Bˆ£ãÙñ óv›˜ª—<ñ2wu©‰•µ›õ2i˜ìFW^üžmÌzkß.OeGF>.j§t¡çq¤þü3‹S3°Å%ѱ÷mÜuYK¢ T.Ë'=Ë«?m$-Çg ZœÅõ·]Ï™ÜèeÿЛC9˜Wª8J¹s¯_Z÷‹¯ÿ{7¯-ËàÏŸ¶áí‹3ãg¸í ÖZ ô{ùEú%Z¬~}(ÌËÆÑõ1&Þßž(Ýäàß_0nò7,Ú–…OsQ3ùL†>|Ý\øäOYà!»uîLÚÜ·&ðÍÊmìIÏÅ«ìÄÔoFkqóY‰(ú³df±ú›˜8{kÓ|D×oɹ×Þ g&®ã¯x›q^ás¶Ò£Ó%’Å7¼É;ýq¯ ¡^6N¹Ÿ»¦mÁŠ»˜Ñ/ßJw:?޾‡×–éS¼rK"›?ÑFÞ#hwï6f½ñ߬ÚÊ®ô|L-‚ø¤VœÕçF®ï޷嵨CÆN‘³úcžyq.{_Î#÷õ!%R/“,¾÷ s¶û1UdÒ× X³ËCdÃæô¸âfn:7™HÀ~¼5oC´÷¡þº“‡^ÍG8ñÏ÷¢¾-/tÿPùlÿ1“fýÁÊ-)pÖ¤åEÿáñ+¬ŠËµ‡è³eûHU”Œõ9ÿŽ!\×=…·—ý[×°ü@ÚÕ0ÐÒ+h³ªÆñpúBüišrDÛï÷óÍ7ßЫW/ àY³fÅÏY–Åܹs‰Çf«0M®ò€t…™´Œh !Dø®Ü ‹ ËÖ°3ˇY—–š«ü˜à?ÀÒß×z Ÿe ™¹ì]ÿ3S'}Éï›àµLrömæ×I£y{Yn`ôM3гw³7ÏFd” -/­Kgñ˜YlóÍçx‰×j:šY@Ö½Èñ£€è„Xœ†HÈ- ËTè'6 P&¦ibjvœv•ñ'¯Œù”ßSÓ)pÇ_C#so>ÑQNt­pòMK¡6ëK~_Cê¾,òM›U@úö•Ìyõ)&­Í+q,`ã´Çy轟X½;§Û"cÇrf¼2’·gb*BnS«¤>ÅAÓ tåÇçóþxñ@£ÞÃè—¨°ö}Ík37³û÷˜ðw¾:—óÀMí‰sÚC·Ñ‘´»ÿKÿ\ËÖý9x•ÍŸÍžM ™>ö^žün7}e±ó‘¶`>+d³wÉ/,Ï. `¥/búÏ™X x‚‡®éJrh¢ãHéx.—t¬‰æ7Q*ŸõSáþwÿÇòí™xÍÒ·®`ÎðجíxŠö£Òö>ÄClÔ‰!ÂiC«´ÿ{ÙòùH†¿:‡›ö‘k*̼ý¤»¢‰0ô Ëå°úHåJƬÉÍsïiR;‡»õZtã¢3êcóûƒŸ&~8q<œ>$„ÿ@E‰vÑÄÞe g gΜ9(¥°ÛíÅIõœ9s€À¬â½þprd™u\!Ž£~O]:Ÿ'¿ÚƦ™/0d¶›Ä.=¹¼ÏUœ×,¦0A…À Ê5¸ô… ¯û'ßú2K}Íî~ŸW{úøòž¡¼›šÍâ_wàëÔ‡rÒjÈ8fÞ¥ãÍÉ&'m>ÏÜÿ¶/dmîõ$9J¥Ì…ŸíÁ—•Râñ¦·n£×ÛZá(·…ªÝ‹û®kŠSóSP²°¢¤¹LAÞôTvy-,•̱/Ч‘å71œ:¾ƒ¥RYT™Ü“²OI[ðÛü nÕuàwÞ±ÓlÈ€W^d@s;»ç<Ê qkøéó% :õlÜ!¶™»3D} ü¥ë_âÁŽ)Ãè=õP–Uóâgw[3ÜÎ$®ÞŸ?ÿó¦?Á¶|²Ìô½¿?m#>½Ò6:üv/ñšç'pO /K&ÜÇ#³w³bʧl8ç.Zig³ ±kxÉÍôËü•ý/âÂ.tÓƒ¿DAÞ´uìR E-:ŸZ‡åÃë·Jl'0Z~çÝY»0M'ío}’‡¯hJæ¬Ç:që§}̪ ··QÜÇêÓwôܘhMÇÀÇ ÝÿgýÆ»ŸnÆoê´8–§¯iN´Ê'WE‘µ©°ÆåËÍÕgËö‘*8³ÚtîT›åÅçW`å±sc*é>¨Æ)$´ÙaƱª}H!þ‰BhÔ©S§øù’ó’ÅÇÇWúÚÃòÔñ¢Œ_!ÄQÒbètëóL<ã7æÎýŽoYOê_³x}ÁOüu×ókøs÷³=-ö}ͨ—’yõ¾s¨S…×Ûëv¦kÝ/™¹{ ï »…O¿˜«®½œ‰!'€Ót¥Õ e³hØ–IÆ®Lü†{V±ÕT(¶3å?ý˜ªÊ´¤m&Ý:‡˜Û4ް>(NGÑßE;5c"q; ð[8{3bÀ_Ü5y#}І×ßÇ -#°|,+³ÊmTåv/'å¦ÕÅ‘8ç¶dob]¦F›¨ò»à­Bìbët¥ïÝݰ9lʇ¯lBf8  l˜xö¬ lËÙë.iCœá'ªÇ4Ÿ¸žµ›Y•â*oïCG"š¡cù}˜*0½+•ÄÖ—±œ>…rt¤ÿ¥Í‰ÆÏ4°ãÁSüå@ùrmUî#yüýì`žúÛ[¿‰U¼5…RZ¹:–ooTÑ5â&¦© _xª²Ø*¿/°ÍÀÐ ë Šê§Ö»|¹„ê³eúˆe.•(*×Ô¸:øM gÄ%Q ÒX¼$›ÅÇLYV`ôÄæ ÜDíeŽÅªǪô¡0MV'„'MÓÐu=ä¬ãÍš5+^§èòÞ½{_³½hÑ¢ªÌ:^©#Ú’h !D˜ø÷³ø·ÍD¶hAbí\š›Øh*ÈÂg”¿°¶Ìpàx¹“¬mÛÉS4¾ˆþ}.$! ?˜ÃæÜ¢utœ6À“Þ=y¨&nT°eAíbšŽæ÷áñç‘¶k?e#ÊmÇæ¨A|ÁÊUû0›D•+GùrÈ$‘ónz˜ únbÒÿ=Ìç{¶ðËÒ ú%XåÖ/ƒ²ñ-Hà6‘C^3¸þ²¢ ð¦ï&Ó]8Lü¡¶Ù8²âç’ë–®BÉ$G7ÐLo‰‘ÐCípà× ¼þ{V\:²Œ¥KÇ1æ«fâ¢ãCS˜éŒÀU4ô®éÊC^‰DVëÌe¦ðÊâ<¶Lz–·ÝwpÕiM©k3KŸ*®•o3ÇƱ*}HŽò„ÿD¡F´ý~?~¿¥sçÎ-N¨çÌ™Ã%—\‚R*ä=¸‡ÜÞK!ŽÏÖ¯÷æW¤YEשÀH–‚¸ÓzÐÈ©£ån©±É)ÄJúÖ÷vÇ$ư9¯Ä­¨ìñ´¬¿mòó÷Ø;yöÑ׸·me¢*¼UצqwqÝdðæàU–¥ˆèÜ›ÓjÛÐ|MèyZ ó~È uâ0®œæBË/=‰•gó§Ü÷øwdGÖ¢–ÛËž½ õkâ0ö†ÞÅ ŠŒ:gqSÏ™ü÷û¬˜ô}?°aÓLüÊÁiŒç¡ŽxClS¥Ná¾G*ª^êzã’vLÆeSKÉE»á¯ðxÛuL˜°ˆ\3ŽËxˆ[´úÐÖL|ƒï:?EÏÊÚè¨dñý#ýøÕÛFÅ÷¾ŽŽÑ r‚´sûÊbgcëWùèû=˜j u»Œåª„2—‘u8ïŽüòàD–çíä§÷žeÞ{%ÆæÝ§Q£ÃèXë ^:ƒ‡æìáï÷â¦÷µÂ>¯hrítŽÖ°ÒËìN° 8ѽ…¿–{XñÒ-\3ÎŽ?âž~ùV’*‰­Q÷,œ=“QóÒY<îúŽ·a`b5Ê{OžRa¹ÉÛCõÙÒ}DÓuðPà ÑLz-Î<ˆ›Þà·ômÌ}ûq¾‰¶JÞ:Î^;H›A…â_ªèÔñŠ.öûýL™2¥ñññÔ­[MÓØ»w/|ð-Z´Àn·u]äÔq!„¨v åjÂ]›ñÇÊìÊò¢ë$ѹç5 ¼¶ÑÊK~™YÊÊ7•=-[ál>€ÇY¼÷åo¬Þ³™5{8kаi{’¢4”Q‡žÃ†°}ÂÇü°ÎFíZѸœ‘å— ¯Y²pµÄãÞ³—<.YY€=’¸„¦t=ÿ2®»¼;õ ?^­>Æ]¶øâϵìÈÈCsD߈v§Ô®G¹©ïfåî4vd€+.…3zäÎî5г¬²{XîqÙ}VDÒþÖçx¶ÑÇ|ôÝ߬۞Žƒè„êGN¿Í±Mµ*‚ñnV«?¯ôß¾’§Â+‹Òg’åR ›¬ûø}þÌ5q6ˆÚFá½’[»Ïã¹ß70ùý¿8ãþxì6‹÷gTÐFAö¹²vW%úJD\Þýh1 èxþÍüg`"Lùz¶·)Úß*vñO£Ù¼oHk|ÜØ4¾2ß=Øê_ÄÈ7›òãgŸóý’MlÝ•ÇI\4ï܉Úº-<ÅÓµ>bòÜE¬ß[@d½–t¿ò6îèݧ?Ÿ<«|Ÿ/·¯ZMÎöìœðß.ÛNFŽFl‚»ÓAD³Ðý-šN·æÉFS™öÃ26ìÌÄk‹!1ÁŽáŒ§GåªP}¶l©"£vî}µ1ÝfLç«ëÙ¼# ¹ãhÜ´=8Ñluƒ¶YË#ˆcUúå !þi*K´ àU«V¥’éúõë_nùQÕ%È2ûÔ©S½={öÄår…e#B! v‡ ›aÞ"H,”߇ÇëÇBaY:®(7v]ÇÌÏ%ßgb¸£pÙ 4o.¹?ÊA¤Ó†¡ ÈÉóc)…nsàpØ0´RWâÍ/À¯ ‡Ó‰Ã®ãÏÏÅc[V¦Æ.N[‰û(k^ëëÃëó—¸Þl'v[á¾Í¢î/ Àk¢4;.§£èIÍBù¼xý˜¥ö9‡<ŸV*~³Ü>.1Uèv›íP¹(LO>¿…Ò+Þ¦Ua}Ìò)Š¥°GDâ2Sš¦XùÙènÜÝ* 7ße)tWn»ayÈÉóB…m”×<Ìv?°˜Q·f‘7†KÆN`x+†¦£¡P¦—OÑ­¢‚·s¥±Óì¸"œØðQïÅ š‘)”Ò±9ì>­kh`),ËϘ\L)…nsâ°ºXX>/Ÿ‰ Ò烷·B)»Óݦ¤”Ÿ‚|¦¥ÐBöÿ@ { zà ÓK~3h¹ø©z9 °Ù‡bV} A^+D›F«òÙ!‰¶âŸ&''‡U«VdFÐ0IMM¥_¿~Wù@^áOn‰ÿçrê¸B…“TyÍ L­£ë o^Þ¢%ºŽåÉ#ÏS¼Í_@^‰B4MC™><ù»ª¡aáóäãó„ZVæU:XÞò½ÁŸ/µ®¦Ïƒ´ äÅSlÏËïsÙÇÁö9°ÍÀdWj¡·YñsAÖÖ5üy!Ú 0óÉ+Q M×PÞ|òŠRƒ ÛèÈÚë*oyA³áàí\iìðãÉóSA×8T¶¦0}Þ Ú½Ä¶Lo¹/rŠÊ¨Z{khš…ß[€¿l¬´ÿÞêÅïÅS.~•[ƒ*ö‘áA%1 Ñf‡ÇÃéCBñOb³ÙÐu½ø¶]Ç­=!§Ž !„'¨2Ÿåo¶B‘‘‘ÄÆÆâ÷ûû­ªeÖq!„âdã:…‡&O#"&»®ãÏÍ–¿ÙB!ÏÖ­[‰ŒŒ<®£Úrê¸BqÒ œ*\“CÁñ®ŠBq‰‹‹#??Ÿ={öÃá8. w…‰¶Ûí–d[!„B!ÄIÃëõÒ°aCjÔ¨Á† ÈÊÊ kùUÍ‘eD[!„B!Ä?FAAn·›îÝ»‡½ìO>ù¤JëU˜h !„B!„'#ŸÏGFFÆqÛ~ÐD[f/B!„B!ŽŒláñ¾ç˜B!„Bq² šh !„B!„âÈH¢-„B!„B„‘$ÚB!„B!DI¢-„B!„B„ѱK´ýûøùÑŒ™³ω:¡¹™Î¢/&2åÏøOÔ:–ee°|ÖLúy7ÞŠê|2Ä^ÒO‚“¸!„BˆÃT}‰¶w3ï¹AÖg)°2YõËo,ÝU€u¢Þ:Ì¿‡_?ÿœï7æ`B}Èg×Ê…,H-|þDàÏ`ÑÌÏøzU&fEq=b"9ÛùX~œÄE!„B¦ ÷Ñ®ë_Ý{ ¯®³°Ê<Õ|ø$^;ÏE|B}ê׎@/º]˜R³ÃÔõkpÛ¼Ó?g»˜©’uÔÊìCÁ&&zŠõ}Þb\bF8î‚fîáË·óö¦òõ HaÄcéo£ÂÍY•ÿËØ‡be0ôžý}áYbë4¢u^ô»ö|ZÅïç±â©†v®LÙ¸‘Ä×o@Ó=¹þúž´s›¸œ(ý$Š>l÷òÉsgQ³DCfÿþ×<›Ë°w_äò„ï­"ÿ¤¸!„Bˆjwä‰6 eZ˜ ®á‰¡í‰Ò‹U ¢c0z=8†K5ý¸dNÕO'¢^öªÔÉ^¿Ü>¨ª$µ‡C¯Åw¢a¶ð’úÅXÆ­m˰{/£‘SC3¢IŽ9’ϰñ“•¶_ý>ŒÚ™h•ÇþÍ‹˜5í5îY²—×_@‹í¸ïoØÛ¹R‡âòøŽDä`×öüñõ[üßì™\þôó ë‹íxæ¤Rø I’•…iZX’= !„Bˆjp‰v¡˜$Ú¶k_j´MCó¦2qØp¾íü<“îh+Øk}é,ùr<ãg.dS†N|‹ô6ˆKšF†o±¢úx÷ñÇ´·xÿ»elÉ0¨›’êÐùôÞT&Ù‡m áÒÉòÚ=<•±=bŽüËÍNf툠÷/NHM UÇN´ri€Ÿ³ŸäÆÉKØgbiH§^ƒø¿~©]"ëÊ\üÿ¹u ÓLj$¶çâ›ïäÆÓâqTT¯P±§€Ôï&ðòGóX½ßƒrÖ¡ûíOóøÅõ+.ïp( &™SÚh—N]éÚð ýG}Ë·©×м•Í¢~Ö~æ™Élb׼޶8k äâ”#ÐV&+f¾Ãø™ X—¦ˆoÖ•«ßAŸ6±uÌtþúðM>øy©{³ñI§á¯òÌYì«\;Ÿá`Û÷Õ—ví‹úëy\vÕÅ|ùèÆ=÷&íÞz€³kÛÐ*l;Xúü­<¼îbÞxk Í\i_ÝËïÅ1râ#œ‘ÅÒ Û=ˆJcXŶÕ߬ Úá¢*~!!ßeTuŸ…B!Ä¿ÖÑ'Úʲ,¬¢ÓÃ5 £ðÿÊ41-*8åÒÆ©óàÌ.ü Cêæ°pÚ[¼2R§Áøatˆã(®¦¡ieJSù¬xïFζèÖ÷v4up`õ|´"J®dâ{?ÂÈ ëb×t"êEýˆ}QâFq‹—Ôhs1·Ý{5"MÒþþŒ×§áÍ” <Ö­FqàÏwÒîúaô¯åaýS™öÔxƾÉVA.Äû63õÚDôʨ® Ø2ÓÈiT3üIOq»¸¢kàR9ìË1+­_g-cw½¾Œ’‚;o çLãåÈ~k ×'ºÐð²iÚÃÜûQ]û æ‰dÍÿ›Ìø¡àõ—ìD33Y5ÿORk]Lj!m©aæ¢7æíÊ·³¹ó³c ÕÄeC.ã‹{¾à“ß÷Ó㲚l©06Civvìó³âàšÕ·ƒÊbío©è-¯¢U”SBŵlEªê´EeíYQ;„)ž–ŸÏ‡×:T Ï_òBÊêW¦¼*í³B!„ø7;úD{õ‹ô½ò¥Cãzóú»·Ó²’iÖTöR&ÎØE‹Û'pûEu°kЦîAþü)CçL IDATs7ÝFûö”ÍȪ¸î²±‡»Ï`Ìäéà[ćߤQ¯ïëò4b”"²Izti‰[+ÜÏü@íʶ³g뱊KiÎzmI´}ÁÚû(ÈN ›[žO;ûsÌ[žÁõâ1rÖñÃZh5¬ 1¹K[Y\KPÙUaemQ•ö,×á àšW¸¡Ï«¥—) ÓJ.ÞÏJëWV%û}|®—B!„'ˆ£O´“úóô‰2ƺ#Ž&Íúe¾ýëØVàg×k·qéë… •²,\ûò±6{š àÙáˆÖõÓlÑ4ré˜{6°ÃKÇŽ 8u=Ôkz•’{­pıÚsl|¤-œÎø©ß³hó>òõŒ {VAé±5ýP½œ éÚ*’×n`¿¯±eYYìíg^Fß¿2îÑÛÙxÎe\}e/ÎnV#¼×—üD)lzpdzÃ8»– j%}£UñN£&ÁFTsÎjãböÆuì÷uƹo [<ќҥ®¢öu5¤kÛH>^µ–4ïiÄè%Ê¡ü—&eÛÙ™r âŒ"0Qž߾бQ§´áÂÖÏý°œŒžçá^?¥¾¦ÜÑ.óÀú*Æ5ÀWöUaEmQÙ{½d{R _^%öå¿CÛSâœîÜåoó؇Ǖ~µ Rf%û]îì!„Bñorô‰vdš·jYâè*& – ]‡?Ãà–®×îÚaœô)¢)Íš•«ŸWÓÑ0ñælHšÇr–,ߎY<ñÔTrÎă[SËÚΜ1/ñK%¯³L 0Ð5Ê V{WWzŸ®‹¿ãóÏ>côˆÏ˜1àyÆôM!"\#uMðìðÎDyÖ2õ™ñü]«Ý›Æ`ÓÀ[ißÈ Z¤Ín&¦âйþeª(«ä ÁmgGRõÇ%ïÞ•l÷)âSjã¨,6†N‡‹Û`¼ø-‹Ò;÷ýßxZÜBç8-»²¸¦¯ÀİT[˜GÖžaÕˆÖmÛ–š§!'3MË <¨´~Ä¥Œ’û¬ò¾B!„ÿGŸhCðk ƒ¯†2×FÚj5¥ÝCj*$\”D„^§à©Ÿ=¾%‰Žé,ÿk§´$¢*ßN¢—‘¸gõ1Òöì\Êf³ Cô¢{‚ ÍŒfU !m•¿™ßVçálšBm;à?üØk¶Hw½’{N=Ÿ³ßÆ3g³þÊ´׌àõHi–BM£)÷?ºƒ¡ŒgôÌÖ¼t]•ÕϤ¾Ý,\›‹½~SjÙÁ^§9Ÿ²rñn¼m›âÒ4ðídáªlìšïÐ*>ë"D;W{\ÊPž­Ì7›½ݸíôx\ö”JÛ®F§«èæŬïçQc¡Iç]©mhh•Ƶt?±Çb¸*X †ˆa™¶°Õ>‚ö ·²Ÿ%þ[yýJÇ%¨2û,I¶B!Ä¿[xíª0¢HˆýK~fáöœÑ¸+{'pÏŒQŒÔûÓ»C.Ï~vf%rá%-KæyT²RY¹,¶Äí½Àp%мyGn½6‘!SÿË£Ö\ѹ‘kÙ–â~¹¶xÚ6uðÅSù¼Uo’Õ²ëv§g«Øj›iØQ·%õ˜ÆŒf}^º÷±3·üz¹Û–ò×â|Üù;Y4ûCfìOâæ'Ûöû0cïÞÿ'sY4nR·oKRs°"jîQ[MCÓtbÛÝÂc}þføäWøâ´1ôK¬¤o¾üàoÓø°ñy´­ícÓS˜¶³Wü_bu -º·ôiÄÐOžf´ë&.n›ÿ7™i»Òÿ¡ÎÄ„ú’¤‚v>;n5sWs\27³bi,®‚ƒìپ߿þŠEiu¸lÔ]œUÛ†¡Uþ¾ÑbÚrõ91Ü3eVôy<ß±Fà̆•½¶l?©z Cµ…^Ùvý#¢Çf\ê©J÷Y!„Bü»ÃD»çÞv ó_šÃ;³{ÐeX+Zß:–j¼Ã{ß~Äs3²0]5Hî~+g\Ô’˜ ÷:Û?åÉG§—^–p-ãÞ¾‰”~£y5f"fNå¹™™øl.bk·æÌ¤ nu¤× ÛÃéýüûLó_<î:téß’³[Å_? ‰}y÷~^™:…Ñ?xQ€=ª­ÞFȈ¤I‡VÔúc:ÏŽ,À´ÇR¿ywî~y —6q®s?ÌØÛÓ70ÿã¬8àA)µ›÷àί&ÙYMgènZöÎeóaʸùœ÷ô´¾%Dß(z™3‡ÅÓ_ãÓ}±Ûríãwrsë¢Yठx–±ï0~Ö[<¾_Q»é©ÜöÜí\ÓÌz¦ø Ú¹k›êŒ‹èøšè¿}ÎS}zµë7 I—ÁŒ½þBÚÇÕÙ]…÷‹æ½.¦Áœð]Ø›6ţ핼Ö^¾ŸT5†¡Û¢’íu쎒v˜qäFQÙ> !„Bˆ³`‡„ö©S§z/¼ðÂJOW–‰…ŽôÈ20™*ù|áCJ;´L) ¥Tñå°š¦£‡éHUY&Á/ÁÖÐ -Èö‹FYU²EËŠê«ëèa<…PpT#Úšn„ÉÕÐõ2Ïjºa”Y¾D¥\ BÖ¯*Û²A—…O°:kšŽb“š®W>¢~8±²n8o—#蚎®‡NÎBÇ.T[îØÇ¥‚u+}ßhÔ5äk+ê'•¾‘ªØAŸ®¾÷T…1ÕtʆçpãR•}B!„ÿNa¹ƒ–B!„B!ŽêÔq!Žê;ÕX®c[ü÷Y!„BÀ1:u\ˆã£zO߇ãߨÿÆ}B!„‡CNB!„B!ÂHm!„B!„"Œ$ÑB!„B!ÂHm!„B!„"Œ$ÑB!„B!ÂHm!„B!„"Œ$ÑB!„B!ÂHm!„B!„"Œ$ÑB!„B!ÂHm!„B!„"Œ$ÑB!„B!ÂHm!„B!„"Œ$ÑB!„B!ÂHm!„B!„"Œ$ÑB!„B!ÂHm!„B!„"Œ$ÑB!„B!ÂHm!„B!„"Œ$ÑB!„B!ÂÈv¼+ðOçõzùáçسw¨ã]›ÒºžÚ•Ö-[£iZÐç}~ËW,ç`ÆÁc\³ã§yJs%ïj!„B!Nb’hW³oþ÷ .—‹ÄÄD<^Ïñ®N1»ÍÎÚõkq8¤$§M¶—,[BbãDÎìqf…Éø?‰RŠ…/d×î]Ô¯WÿxWG!„Bq’’D»š8x€¤&Ix½^týÄ9Sß´L"£"Ù°i)É)A×ÉÌÊ$±q">¿¥N°áøj ë:íÚ¶ã¯Q/¡Þ¿âË!„B!DøI¢]Ýø|¾2ióú½šr¥–e£_–eâ„l+!„B!ÄÉCíc@Cƒ0wÓªX©Ãhv±Ñ® !„B!ª‡$ÚÇ€nè'ä(©nèPÉ`µRê_•hÿ›öU!„BQ=$Ñ>´Â' UÉî¿.Ñ–!m!„B!ÄQ:qfçú3 ã„ü©ÊälJ),e?¾½Ì?š1³·’oY’g !„Bˆ°1ÓYôÅD¦üy¿gWÝ1òïãçwF3fÎv<*ÈãjrR'Ú–'“]›6±· ¼“u…»\MÓNØŸÊhWë™ÇÎ X°%ÿá¼Î³‰IÃodð;kÈ5-”™Áªù¿±tg>–eq}„B!„ ÿ~ýüs¾ß˜ƒy¼ër¢ªîY™¬úå7–î*ÀRªüãjöSÇ•o‹fNá“y+Ø´5lÓNL½ft:û*õíF‚#<§P[?qXaÖ妷ßäÆ$gXNήŽruý(¯Ñöïå‡w§±¦É5 º°!®PE)/·o〳Më:C~“r8‰vPV&¿Ë²Teóy÷r+M´U‹Þyƒ™ÆåßГ»[Îà]õ_¢me°à˜±Í‡©â9ëÖ¡ô?³µÈfOê*6è§Ò è›+‹Õ_MäÝY±zgQZpÖÕƒ¸íüd" |[ùâ•·ùjùvÌÅ«ÄÖoÎÙý†2èÜD"J击˜<ôj¦h@Ò &½z m¹,›ð$Ïÿo={sLpÆÒ¸Õ¹Ü0äÎmýDå“úÓ‡¼óåo¬Øt€|GMÚô~Q}TÅåÚM,ü”×Þÿš…[3ðê.â’Ïážÿáô8[…oèÊm”…¥t4]G/Û+ôÚtí;®èT:­ƒR:z%IùQh+ø‰Nâ”v§PÃЀ³¹ôŠ ˜õøýLxþmÚ¾þάmCó¥³tÆ»¼7{1›2 ⛟Nß¡¹09£°üm“ïæŠujûà+Þ{€‘³-ºõ½MXý­ƒˆÂ*ûvÌdÔk?Ñg(£º&`ËL#§QMì€Âëõâõ…>¯Vd«ÜÔŒu Æ ºÉ)ÔUÓY—æC5p„œS–ea­¤išxÙ4­’},ËÄR¥Ë3M3p½³™Ëæ%+I«ßÿÜÝ wö6~™>™×FÚhøîÝtŒð°²’U5 >ã«{ -êœÆGÏ~ÎO{»Ó§A/c­&aK´}iëØi)µ8µK}\ú¡S6J&™ÖùŒûb;~ÓAû[Ÿä‘Ë›’1û1†M\Ǻ)°ä¢Çèf+ºŸq,½ž—{šíã“áw1që~ùq3w´m‹«¸ÄzôýFàZjM/LR]´>‘¹wyÉÉÌ"gß/<}ßlؾ€•éýHvü¸©›ð›­Žåé«›M¹¸på¦VX®7}+;½–jʱc¸º‘ å÷£;C\ AUF´ c¥iQèr#Ú…£Ô*P–Úÿ'}±白غ&FN:ùu¢±:ZaÜktïË]jbh®ZØŒò_TeD»hR±àõ>”°–=UۑЊƶ™¬Û¸‚ìT&ÏØMóAopËñØ5h€Ã>çÛM7Ѷ ÀU³ÉMb×_Ê(I§Ò#)Pf›æqìøå?ü°lÞS£q•I¬U™mÖ>2­ZvèB§ÖQè´¢¨à y¶%×h !„Bœ<,|ù9ìÛº„Ùæ‘éhǹÉ.ÈYÌÄ»hqûn¿¨v ÚÔ=ÈŸƒ?eî¦Ûh×t%?ÙBüU/2ò¦f¸õC 'Ù ˜4}+uú¼Ì#ýSpëgtNÂ3dÓ>\Âå#O#@)"›t¡G—–¸µÀkUÆ/|øMõú¾Î#7$áÒ5è\—Ô—²´¨ÆÙidZ‘´éÔSÛFcnWˆéÌïŠB/?ðV‚½n{ZGÌbÞg?ré=Ñ,Æ$}o È.¨Âtb«_¤ï•/z×›×ß½¾¥UÛ÷g¼F$vâŒ.-qi]èT?Å÷þʼÔÛi×`Q¥1Òªü{ùß+ˆYÊ~(HÉå`žÏþ¥¬÷)”½#ý.mN¬Ã@#’ÀÊ­¸\{½.tOø”Ïwmæ¡·òÓ™½¹¾ßÕœÕ$tlªrêxàéŠí¢D>p:8ù™ä*'I-[Ó*¹ðTø¢7hẎuiØ({ˆíý5ÚÅYvùk¢•ÂÒ¿½iëÙáñ³ûÍ¡ôyK;ô¼eáÜ—™8³áPM‹Êò³oá—¼÷é,Ùr€ÝQ`aËò`ªÒ×sm_©Cõq&_Â5íç½'îbó™—pÅåÓ#%¶ÂkÆ2ë¸B!ÄIaÕ \wÙØÀÿ•ÂÖ¨w<;Œ³kÙð§®c[Ÿ]¯ÝÆ¥¯S¼ŽeY¸öåã‰^Ãæ‚(NéÒ—^úÒLï¾5lñDsJ—‡žs5¤kÛH>^µ–4ïiÄBŽ¿‹Žó}6°ÃKÇŽ 8‹^«•.ß™r};üʸGogã9—qõ•½8»YÂãS ½ gœj1§r××0êÅqÜÙ\`¡Í´bé]…ô.©?OßÙ‘(#PÝG‡ŽWö½òÒ‹cCalœu›¯}ËÞ,?~gå1ªj¼Û¾gÖ–º\úÉ8u Ü͹ìâæÌ˺ëî¢]äñ»^?l‰¶­v u44ÒX¸x·6KÄlʼnŒVât…Â'!è5²î87òû±Tàµzáküþ@’UTLÞòwõñ2U#.ºérÚElå‹ñ³ÙlÎ V~o`¢3]ÇV&© U®ænÅ/¿@£©Sùtî߬Ÿ?§ù“^ËÀfOÿì3FøŒžgLß” Ç§ÁÙ¨Õu /M@^æ²-é3îåî™õ8µ³ò9"мUË×hÎ&õïG™Ý*¹ïš†]_¾/pªxò ÍpbÇħTÕbTe¬ÿê;vû2ùÎkø°h<Ï2±T_®HÛ®1T-e¿°ÝG[iÃ…mפ~ð4cg,`Ý® ²2°cí_|;+ù œõÚ’¨khžeLÿv éÞRøŠõJ¡‰´Š>©XÙ6Ô5ˆµìeå–,Àòû±0Éܺ•¥ ñBnès1_ÐÄ÷IJ×mI}44ÏR>û)•< P^r²½(Glå¾²ô¦ôò“¦áš emfÞ‚½øBÅFÓ+ý)üΧ‚狾-+|ì¨Ï¹ƒäáÛΣQú_Lyu ¯¿ ¯ ¬[ô­Êv+˜T¬âŸâõJ,³ò·ñõ»sIsw¡O×Z8ã’©oxØ–ªˆoØFѸð§n„ÒD9!?=?pÝ~a9;Vj&rùupj‹dRšµ 1šÀ—5EÛ TòP}4PþCe GаS/†<ùOõŒ`Ýœoؘ˜U¾ì¾X–%×h !„Bœ "ê‘Ò,…Ví{qÿ£½¨±l<£g¦R ÀV«) ìRS!!1‰&II$'%‘œ”H½(öÚ)4°g±rÑ.¼eYìñÍiìÈfåâ݇žóídáªlìšï¨x„Ôß’DGËÿÚFAˆÁÍIã®WrÏsoóüÅ‘¬™9›õ‡y»)MC7ìDÅÕ¥fö|&ÎI#öœk956ô%­%_¯ÿƾ1Ô‹[v‘wÇÍUQU¨œU̘ŸNÃkçµ—_ä—_â—_âÍ—GÒ¯a>Í^B¦©Šveºæ»ìãê¾YǺ\8ü~¼{3|ò+|qÚú%ve`ïî™1Š‘zzwHÀåÙÏάD.¼¤%15ºpËeõ¸û³ÿòý¹¤M]œùÈo|&ç4éÄ-}1ô“§íº‰‹›ÀæÿMfÚ®†ô¨31!Ž­µèŽÜzm"C¦þ—G­¹¢s" Ö²-çЦoïÌYdѸImܾ=,IÍÁЍE¤®ÆlÛ¹»6°~ûn6/ý™Ù_-`OⵌԎ裸G—]…}·'Ðã¼ÆLœ<ާæsi«Zè{6’YåmT£ªÅA‘µò+þÌIâÆ ;ÓªQɉϚyQ"Ÿ~0‡?žÁ%µ¢HˆýK~fáöœÑ°ppv IDATÌãĨjõë}´ /cÌ{ÉÌ™ò1ß.ÙDê® <¶HjÖi@‹SÛSC´ÿgï¾ã£(ÞŽf¯¤W„B@zïTš R,»¨¨ˆ_TlX±Ò¤¨ Rì ð± ŠŠQzH¿ÛÝßw—z)Ä\(yÞ¼ò"¹Û›ÝÛ}fvfgv6&c^ä¥È·˜ýùfvÍ ¸ZC:Ím}/É™Œ 8Z$—Þÿ0û_Çç¿$錃°ª ‡þ GóôNÞX¶žmGwñ×QåNlfÔ ¶ ,a´¿çU¦Õ˜ËÛk~gçá$²l¡Ô¬bE$—Ž˜ý¯L×iR£J¿ý›ÀÁ“ày ûâîE>w®D÷h¤a׎ \ÃF4‚ª×".À3Yškh¹qj+¶™T ÃÏy’GÓ1ýà ´jXl•¨k㛟¿äëÚ]¨N2i‘MhW+¸À6ªìë¢Ú‚*G múŒçŸü ´*EW#®õMý>^£é>æZÖ¿¼’9+ºÐöÎúùþnXò6èYð–¢mñâÅY½{÷.Ñ=¼y†ôæºgW)*{Flpßëúë¶³ƒL ÷£¿”û>cO¯7*÷ìs¦k°gEî{˜Uþô³¿mÎûÙÛëÞb×}ͪðtMÃ4rÝ‹ìúNZûiÁÂtíܵ˜†v럟ÂÂ}fåjÝø$Z¥²òÉi|ßx+vþõzzÞ5wO‘ë³9ïå¤í¾•­àœMÞö‰—vTѼï;/Û_èw÷¤“» @®v–·}ã:6äš?ªÈ}TÂýPôwÉ·NÏ~÷ÄGþ¿Ïš5k6lØ` Hsÿ¤æú=È(Ómï¬K) Uh½kuþå-–W…îü¢ÓϵŒ×’®RhÅ%ê…f)¦G›H.}ø5ºyÝ MEpÍS¯1Г‰.éÏ„gúåÙÞÜ÷WøG·ãƉm¹!O^¶ë¿÷>ñ’¸×Gh¹¶1÷¾È¶ç>÷;9…^®ï–÷=Ü*äOÇ3·c\È3´ƒs7/¡B!„( ¥Y¼ õõÞ~(ª ^ÔûŶUŠ˜»Èõª‚ÛYÒtó,éu”ÍçJÔŽÒ´BÒñöÎöØ”pöõ"¿K¾uæßïE‡²áƒ†¶ÈÏj±ß;ZÜq>Û8(Áò6›Í}µ¨pÅ6´/2J©b÷‰B!„BEÚå Ø{´Ï»ÝNVVV‘˘ÙC±/~¦2‹*/„B!„Å‘†v98_Ú‹¥D½·¥GÛÄ5»ZîÇ– !„B!ÄÙ’†v9°ÛíçecU)…Íf+rOCü|Üþ2§\ß×j•l!„B!„(=iQøXdd$[ÿÚJ³¦ÍΫƪ®ëü¹õOÖoXè2¡!¡œ8y‚J•ÊqËέ=ûö{^Ž@B!„B\¤¡ícWö¼’uß®ãÓ•ŸžW3Z¦A»Öí¨{IÝB•-›·ä­°{Ïî Ñð4M“º—Ô%¦Z̹Þ!„B!ÄLÚ>æççÇU½®ÂÛîÎ5…*²m·ÙiÝ¢u9nѹW.(!„B!|KÚå@)u^õfŸ ix !„B!ÄÙÑÎõ!„B!„ih !„B!„eHÚB!„B!D’†¶B!„BQ†Êl2´'Nð÷ß“žž^VI !„B!„eÎßߟ† å“ôˬ¡ý÷ßÓýòî2KµB!„BˆóÞW_~EåÊ•}Ò†-³¡ãÒ“-„B!„âBáË6l™>GÛ4ͲLN!„B!„¸àHC[!„B!„(CÒÐB!„B!Ê4´…B!„Bˆ2$ m!„B!„¢ •iCÛ0 òx/Q çqÖÏŸÏ1ù§o ü$d„B!„éÑ. #·måpp#ZÅa9_Ó<ײöð΄Çù¾É#¼2¦>dxÿŽz­ÿžßº^ƒa˜š´´+”üqRšã1æQv$>DY“˜ç‰G!.GCۑȯŸ¼Ë’¯þdÇ“dX©Z·%=†ŒbD»ÊXÿk;.c7 Ÿ|šƒ^ã͸@ʤ]X’4DV=x ¯[ïcñ³] W§ùnÚ<÷à œ&` ¢rL µ[\Î!—Ó8Òæ»ñzŸŽ¿ƒÙ» ¯ Ôáž·ÆQ)º1•г°ïhš˜y~|µÑâœðÄíö‚±RwÜ\¦÷ð£rî8)MœEþy#k ÓžI“-'¤ýÊã#ŸâøM3xe@46¹ÖSþò—o–2<_Ÿç‹ã‹z€({ç:Nʋģ„ ¾¡m¦ïdÑÃðþ.ê÷¼‚ÆI2û¶mãT¦»!÷ŸWbb¦QFé•4MÓÄÐuteb˜&&N;#f ÿ»µ9é'9rh7?®šÅƒ+>£ßÔg¹­e¨oN$*‚Žw=FÌ'à`ÿÇÓyk{cn»¿±v…²„P«R "'<Í•JCÃý½¼}G3ç?ih_„9±ÍC±)WE©Ûå}0=yý4­˜ÇÜÏ6³ýDÕmÃÕcÆru£P, ÐO°~Ö+,úi? 'Sq¨@¢ê¶eÈc¹ò’ ,îïuàÝq\½Ð•~“‰ï0­sGVNcò¢ß8šf` ©N˾£¸ghK*yZ»F ¯œÇ¼?óÏÑT´°º ˜ô£ã K3$OϯûwAjº^ ‰§i³¦î Késu/>›<·žŸI“×ï§ke«z¶­T®Ó„Jd°Áû«R¿y ø»Ö¦œûYxÛ¬mý4sn©‡aû­­§Ÿ3W¶ã¿}2—y+~aw’…¨zzÇÍ\Q;ˆ²ìèåÀ·!q4nÚ$oO¥Rµ…w厓$6/šÍÂõÛ8p,…,iy÷K<Þ+Œ¿\Àëï¯ç~Qtû8_Q {¡yÒKþ©Ô˜J¿ÏfꢼtsC‚5•óžgTN¯("/{ʈ÷‘p* D7ëÉ54¶¬ý–_ö&¡"âi7èvÆõ¯›sqÁK\_ÇÍô–¸.X¾8}sLÌ ö¯•ø¸è•Õy>ý/^ó;¯y…׮ŮÀyä3î½ýj>9‹¥±av)êüòÞœ|å×S ü}2O츂WÞÁ%~ …ƒ½‹îcÜêFL›s5™Ñ¦,•u}ðlò²/ò¿QÊzi' ;oJÀ Qî.ì†vêß|´ú0¶61´IN¡ €R(LL3‹½K&3ñýÚ ͤڊ½ë3÷á)¤¿2aµýPz*{·lãxµë¸çÎ:¤ä‡åïñæãªÏºƒfšëjaTß ü¯gUìJ€BÖ¨7Ý×—ˆ ƒc[>aæ’—˜uÉ›Ll†E9Ø·| ¢Åà‘LlT ’“ ©bsU༦™«Â™}•2§¡ýwÎEó‹ãª[úðÉýŸòÁÆtì[µœ†G™îmqMgzzˆ*‚²:Ï»G)¹zMÃ@×ݯ•¶`œôR~U£nX#lëakâjW³qší¿ÅZïFjø‘+þE™(ëúàÙäe_äÿÒÅ£~øã"ÊÅsvt„¨°.膶ž¼Ÿýi&UǬy_¿™ò;ï~x€ÊŸãÁ¡µ ÐZÄ‘y÷D–/ú¾“Új˜¦I@\s:´®¿jEóècl™¸‰oöeФ`‚Duj׊ŦÊÝé߆.ñ®u5®É¡ïîgÝïGÉj‚_Úï¼³|/•¯žÆÃ#.!@Ëip^Xš¹¾C®ÊgvC;÷ß¹µG7$Îú)Ûw'ÓˆÂâÓvr*žŠhööfo·{û¼}Ǭ¼=YÆ™ßYøÉê}ƒQ½¢°)h•ÈOw~Èÿí¾‘&Íäþ£ ŠçØÿý*7]ûZÎë‘WñâÌQÔ·äWþ ŒoEÇÖõñW€Rdý}œd#-ÚÒªQ0 ñd¼BcË[þQ"ÛeÒ Gxèõ7hvÉ#\–ÿ"–*2/ûg—ÍhÛ¢>þª1U6r×G±ôèÛƒÖÁª‘?nx†_·$ਇ-EâºHùË7/ í¢Ž‰:-ñQ”ÝyÏÞ\çªì²Ë¡³®8¼—_ø_JûK|óû)úTšº—Ÿ(ê^U›.âÉcÏ‘²¯–ën=+…½Jm*©/9vÚéºÆõ®gÍîJ¡“ã›?fÞ²ulÙ›H†€%ÃÀz:Ý4É:þ7û3‚iܺZκ!×pDoi’g¹¼ËçûÛÌ»¬¡ y¯Ìå4”<ëËÞ®ìÍ)â;ºGÀ{>›u|3yóÍȹGÒ0 üާ£›Ò³s!ñÄCÍë˜|[óìarš=‚š6º÷8Éÿ0M쵯âÚæ?0ï±»ÙÓõ*®p%]ꄹFkœMþÁÄTÔ»þ~nÜ:‘Ù/Nƒ‡kx& È\T^.¸V"j„£²’Hö\8ò‹ züs* Ý00%®‹–¿|ó2t¼¨c(ñQ!”Ùy>ÿ…`Èû¿—r¨Dõ€BÊ/pyC¿ú“=zzèg¶gÅ2¸AHé禅ò]}°yÙù¿Aéâ±Èó¦¢Ü]Ð m-$†h›âÏíÿ’®WÅêå¦6Ó41 ÏILwé”3ÄÙ½pN…O³cÃÀé.D]u7#Oî<¼’§Ÿ]Fj×›s}"Ìì~é ~À=¹®c Üåd¾‚¿4óm|áCÇóUL³ŽnãäríH¬øúXäï‰ÊÙÙÛíþñúsWpMSw¢ãOë;'ss½€<½8~•B°H¥äÂâ9ÖÕ¨S¿áÙÏQ(å-¿Òà²Õ`Àä7iµå+>ûøS^šð)+¯‚'®»„À³É?žuØj0àÞ›Ø<þm^ýâzÜ+2MGqyÙË6ZìVYî2Bӂ͆ÓÀ0M”ÄuÑò—oùöE±å«ÄG…Pfçy6 ²Òè¦é:Oæ$Pêz@¡ŒT0Mz5Åúò—lNì@Ý[HªÚf‘é]ô_Ö‹Ë˾Éÿ§ ¤Y¢x,ª\”!2B”»²mh&åz > !}»…ñӺŬ¼º>Cêjg¬Cœí¶ýz„̆µ]úGøy[*¶êu¨d1szØL3û*ažÿ•`?H?•ŽS7°ºW’qèOöé53¤mªZQz05CàÓÃÄQ›Ëglûõ_÷ºsß3ä=Í<ŒœS±k;òÿíþ=ó _Ì]ű€¶<Ю/•Ö²•«¡l¸~<Û›g?öÝqb:]3fZÂkcÉäÀ>“¨±j*O™†TI.(¹ãÖ4ÉTOÃ!œäÿ;wZZ ±­úr{‹Ké<禬\Í®¾wÐÄZŠüX¢{pßè7ë=Òt“x÷:3‹ÉËÞ¶1;.ݯ‘ïo‰ëb(ßò¾]\ùj‚ÄGEPVçy#˜ª¡pjïÒœqØ-ªÀ1*M= @y–½Uа¸,ô)¾øê7ZoJ¤Úeˆ¶Ê±õ ×ÉõZþ¼ì“üï(e‡?åŧ?ËóV½»gòL·¢‰ÄGÅQ6çy ±ýdÂé·xoõ[<»\ÇâBd|Sꆺvv©êµ¼—_.Vª÷@£f²5þ:V±JcLJ|Wtý]x^öAþ§tñغAå¢\á¢Üy»dn[¼xqVïÞ½QªäWÔ׬YCûŽíÏê3eÉ4 ×OA¢JiÙC‡²ïc1A¹ßË3?™¡c¢¡åÿäz'_þ¦Ø¼\`MW9yÀÛú$® g:ÞFÑ*Ïq)ê˜H|T8ÿõ<ŸÏ9T¹Ïc¥­x-¿<)¤üÁk÷½Lâð™Ò½²LJUʼ>X‚¼ì‹ü_ªx¤¸rQ‘ߦ6Ñ«W¯³n÷6l0®çH¥¹Rsýžd\ð=ÚÙ”«¡™w'å«)•§–gs•–ý,蜗´<˹>Ÿï~ÓézIÛs2/ðÙÂÒÌ»]yOš·@(ï«äJ¹z†ò¯×Û~,ä;*åîEÈwá ÷1”+°¨üqëåýÏO!„B!„¨x´s½B!„B!ÄŤL{´s3 ÃÐó¼¦i4MÚöB!„B!.^>ih¯ß°†µ_®Ä4s5´M°Ùíôë3”V-ÛËs!„B!„%Ÿ4´×}õ9íÛuD)…a˜¦«w;++‹•_,¡J•hjÄÆûbÕB!„B!Ä9哆vff&†¡³oÿŽì×LBCÉ«Q“YsžÇétæú„ÓÄf·Ñ«çÕtëÒKz¼…Bœ™;˜qÛ}|Ór Æ5%H“ó‘B!ÎŽOn˜Ö:ii©˜¦‰išKHbÓÆí¬^µ‘Õ«`×ÎcìÝ{’½{\?û÷"00œ˜jÕøbÕG˜¦YxâF2[Þy„áýºÓ沌|t)[Oëñ ñœÙð:õáÑ’Ð ìä,v-¸¶n`ÑA‡ƒ LâD”XÖ16½;•[†_M—ŽhÕ¹7ýÆ>ÊŒõÇpœ/Á¡P5¶±U‚±HûÜÈ:Ʀ…S¹eø@Wœt¼œ+FŽçéÿáŒq¾ŠBQ8Ÿôh;:‰'O’’ ÀîÝ ÌŸû6v»Ýûòº“ÑcnÆ? Ž´´T(´*î`ÿÒ¹mæaÚÝx/OTÝÏÇ3^eìÿøð•þT·I¨léœ>|œ,ý$+_ZʈE·Ð @ó—ãëxùí]8U8–âÄ4mÈ@„ŠHâD”Œ™¶YwÞÎÜ¿iÚïjnZ›(-‰]¿ÿFbœ7aa«Á ©3¹F)4 Örg¦mcÖ]w0w[Mû äö¡ñ„Iüçv$ûpW!„¢ ùä|åp8I8š@VV†¡c·Ûùæ»/½öV_~Ù†Á©“§p8œÞÏ–þï¿÷AWMç©[Úf5èqˆþ¼ËG{zqW½d„_Yr’|8 lU=¸”1½gVÎÖEsؤ¢ ä ÇSÝßé‰l˜ý<3¿üƒ½G’É0Chÿ¿¼6 ¹r±*Eœ¤ýÆäkîæïá‹xïÆxü8-aÄз©óê<Ù"ƒæ¼P0ŽúÚùÑÛë¢ø÷ƒ‡¹{öOü›¢c ¯IûA÷ðèèT±¦²iò`Æý5…ïÝFý E;gdø'-˜µüaZkçO#ïbe¦ó×ü©Ìý;Š!¯½Åø6áØÜvï¾×ÒÐÒ‹‹‹T¾|é f}·‹#'RÈ$êm0²›Æ¦•«Ù¸ó$ªRºŽ˜È£CjQ '°æÅ³üLÖnf¿™Ï:Îä£ñ 4¹Òذ‹#ÇSÈTÁD7ê¨ ãT?ÄÕëmœá¯OÞ`ú’ïøý`¦ÑqøÈŒ–sSÉyâd[×¾2ŸÚåĉišgg:ùiñt¦/ûž'-Tm܃1Æ1°^£sQ_¯_šzvñ€ƒýË +_rÅ˜×øPlž"åBTD>ihëNÄ'²ÿö´­[6oíµ³Ús?ö™Ó)èN½ànÎÄ­ürÂF“ËêjÕPJ#²Åå4à ~Ü~šÛëȃÁË”Îéc)˜µGóPÝ%<6û#vu¹…úæñ¯yó“$ÚÝý3ŸçdŠû‰žÄïë6°§òLß‚p#­^ew£K\œJ'˜ºŽ‘{¨i`耞ì=ŽŒƒ…Ä—…ÈæW3nÊP"ƒtŽü´ˆççOá…˘Ö5œFW´À¾v#¿&Ž¥~¬F2[<Œ­ñ8. TRÉ-©²èãØ;?͘ÖØsÉΙ“£¸¸HaçO¿q´Æ¤1þ‰[XôòBžû¹:½ÇŒå‰ÑÁœX?——^}„ÊMßçÁÆh¥ù `:ºáÞO±£™üPCÏìeÝ»³xv¼•šË¦mˆ“ÝïÜÍM³Òjø­<Õª*–#_ñ‹kø%!‹ÑõÊg_ Üqbíø·´-,N2ø{Þ8î\È{Ÿäþè6.x§ÇkÔX2¶þ…œ‹ŒƒgE–B¦› IDAT/XŠŒ‰4”òG!*$5´˜^Z¼[~ÿ]/Øcݽ[/”Ýiä›$-/gÒ!’ÌZ†ç AWþQT ‚?&ã4«`“a~eÇÌ$éTZH,n¾‰&Ãç²à—¡<Ó9ݾÍÏ¡ý™ß£&«ß1øýd::á® ¦IpNtïÔ„@ PR‘¸¨•6NŠNÔ{eQh|…ÔíJ¯ºî7‰âÀÚYñó¿dv '¤éU´ò{”Õ?'2¤z4ÖÔ|·G£áàI™Q.œI»Ø•jÓ¢¶»—°4L0!¨v;º´oB ÖŠêG¿fÈÂxúíOç Õ2€_¾šÀÆŸŽ’Õ¨6þîõg¼¬:¨v{.íÔ˜@­íb²éÖ¯ø¿=é´®õ3ßÝIä ¼xW3B4…q<‘·_ZSêýUQyâ¤zËz„'æéÍÌxÿ ï[Ê}ªaSÐ<æ뇼Ë'Ûï¦M³¢Ê³Œ¥Y¾Bñq/­›Hù#„‘oîÑÖuìš%ûo‹EãÓ‹ùuËFNµgù7߬$¶F(€»G»èOÞóRNOˆ(cF:'S! >¿˜–ÜÖc>÷Í_ˡ՘÷QMoBÃ'›!%1 Ý4±y>«Jåï¥ÿ'Å),Ž ¼îàè÷ï2}þJ6îL M š®cKÎÀTHsú7³0é‹Íï׈ý?°5+ž›…Éh‹òâ.û5kYŒ;ò;•kGBæI’2A…*T@5ÃáÏÄTŒ<ç…Ò|ÆÛz]?þÕêQ•O9’¬ãHø“éA´éQ‡`MËŽM ­RpljՖ8u;æÜÆß¶búÜ»¨wì/öf:94íZ:<çYÆÄÐ ަa4s¿Tè¹èlâÁYdù’7Í‚ñ¡BšIù#„OÚþ~X,9•©è`+§“OÒãÒÞØýü²g#7 3ûwÃ4p:¬øüc k4[ê¦R8šìÈ~ÍÌ8Á±T Ç*º²¥§q2 Âý±¨PÚÜt-±#ßå•7BØ ºóÊåÕ°YOi'R(|п¸¨•&N”†ÝYé ÓÌõì¬9ö/ã‰ó8Óë^¦ÞÓŒ(sLžÊ:ÏZ­¯nmʧ|¼¿ÞHbÌ•´‹’i•Ê‹5<žêvøeëAҌظ×-xž=Ž8îî‹] ò£BiÇDúnz˜Y£obÛ°tkT“J–ÓÞ¾•qù¿OL™ÆEyÑ":0¦OwÏ›Ä3A·Ò'^q`à v&-ÎõÆ]hTíïz˜¾?=ÌÌÑ7ó÷°kèÖ¤&•­gøsÇ™ì<­EvæŽkcµä!îׯ0¸mu2Žsàt-ú_Ý„°2ܤ•/Å‘òG!*ßÜ£íp²ýŸ?ˆŒˆÌ¾_I)-ûÃ00 ]×ÑuÃp¢ë:Ç'+3³ˆ”íÔö3²žå¥åÏ1!%„úîâ­‡ûk—V™32IÉÿ`{öäU ®çÑ)&JóÜ?gÁäGIqB”†Š§4qb±Q{Äó<—<7>xŽæ9ѨR¯ M"¬g=’Ü^k8ÏM<Æ3óæ2iU&˜&¶hšÅ…äéb§Ö€‘´~û)6×EêvyJA9³TêÊcï/ Íœ9,_ÿÓÞOÂaÚ‰¬Ù”K‡9Ð)Û¸(7*”ã_ã ¿—˜5g+Óƒ©^§2 a+õÄoWž8ùv!Ï,NÂaZªKË.͈²*4»k³"_áOç2yi2NÿHê^z7Ýû—mC»dåK±©Hù#„Œ·€mñâÅY½{÷>«‰¬Ö¬YÃСCQJ±bŇ,^¼€””TÈ7M³@ÏuPP×_#)rݦa¸îß׳W5~安eLÍRpˆgî¥ ÃÔÐ, åùŒÒ°ÈÕú ¢4qây-W^\ÏÈÕPª°8*<¾LÓÈûX(@¹Ë‡ìeNÿÈcCÿÇ‘;3£_´<ÛýœpÍÏ‘ÿ¸+M¹FDp–qaèhÏEüË”Åg¼Åë54‹{4UÞk6×Ý´–ž soyŽöÙó'^òtþ|_ä1ÃûëÅÆCqåKIâCÊ!„8-Y²„^½zu»wذaƒt Íý“šë÷t Ã'=Úýú ¢OŸ¥ú¬«2U̬ãš&÷c— …f)~O+Í’ëx”ì3âbRš8ñ¼VX^.,ÍÂ×¥”†×·Ìtþý{ÉF2¿¾÷,«ƒ1·{™í÷œq5ª‹Š˜³Š‹Ç=ÿ2eñoq—ûµ,ö®úŸ´XjFé¬}{ ÿÆ¡gœßùÛ^+>N ˆ|6eH±ñPÔz [—û53·Iù#„‘OÚJ),ÒØBœùè©ÛY°ÇJ•˜úòXšåtÿ‘Ê¡¿¾âUÿp4Õ‰ ¨Ì%­‡óÂ=7Ñ(Pb­B“òG!*,y¶„ââf¯Ë ¿áå‚|®·I\\´ºÜ?›ãsa–XHù#„˜4´…9¹AøžÜÒ$¼“òG!**™ôR!„B!„(CÒÐB!„B!ÊφŽ{ž•›¦YÐ4iÛ !„B!„¸xù¤¡½~ÃÖ~¹ÓÌÕÐ6Áf·Ó¯ÏPZµlVÏ*B!„B!.>ih¯ûêsÚ·ëˆR Ã00MWïvVV+¿XB•*ÑÔˆ÷Ū… =‘K—°µÆFu‰òþÜÙ’,#„¨xœ ¬}ã5¾«q “Åã'eƒBˆr擆vff&†¡³oÿŽì×LBCÉ«Q“YsžÇétæú„ÓÄf·Ñ«çÕtëÒKz¼…¨èÿòÕ¢Ål¾æ*nè\H#º$ËQZ™;˜qÛ}|Ór Æ5%H“+wFÿØÂft¨‚¥¤‡@?Å_}Íæ#ÑM¤N!„¢œùä†iÝ©“––Šiš˜¦É±„$6mÜÎêUY½úví<ÆÞ½'Ù»Çõ³ß)É©V/V}„išÅ¬Á é÷ùŒíÑÁQÜâBß0’X?¥m.½—ÏœäΊ™;fsMçK¹yÙA²J™GMÓÀÄ O $ˈsÌÇqâ3ZUck[%¸ä <ñßÇùxLWÚܶ–DÝ„ŒíÌyh"/—ˆ³øOçaš¦»lB!ÊŸOz´NÄ“'HII`÷îæÏ}»Ýî}yÝÉè17ãGZZ*EU˜õä¬yo¯,ÜH‚Ó ¾!'Q!Î-œN·ßBó¯^`ÆÂ¿è~3B4Æ ¾|s û£¯ã¾Õ±I#¥b»PãÄVƒASgrRhÒ#ZNL ]G×rÎ톡—à¼Bq~ñI¶Ãá$áhgN§pæt †¡c·Ûùæ»/ùzýÚ?v›Ã08uòGQ׬Zù/­·qÍcÑ9@Cª>Bœ[Ö˜>L¸¡&Ç>~ƒ‡˜˜¤þñ.oüèOŸûGÐ0PCIüöþãÜ8°'­;^NŸQSXøÛ)ôÜu笾ù Cú^FëŽ=é{Çëljh;1½ô•oùýt½`u÷n½P t§‘o’4/4«k£eŸç -¸9w<Ò—u÷½Ìÿ¯ÌÖÃ-yø…îT±)ÌÓ›™±pÑ#æòÔ˜iŠËÚ×&cØÌÞÌu/t!,y#³?9JõQïðÌØ:h :Tc÷ªÍüìÎêFRñË€FHÝ®ôªëþ³IÖÞÈŠŸÿ%³K8RnœSÿ5NNå¤DÓ]éØ< ‹j(×ù£ˆ÷Š Ó$¸N'ºwjB (…ÊÊ/%I‚j·çÒN Ô:Ñ.ö(›nýŠÿÛ“N›fArê*¥€¨xÔÇ®r.Î{,²)B›^E+¿GYýs"CªGcMÝÉw{4n@!„>à›{´u»–s=ÙbÑøtÅb~Ýò#†‘Ócí¹çê›oV[#ÀÝ£-'=!.,amïà‘žßñÀÚƒ4?¾Õìh@fŸìÊ ¡e§85 ¥@ÄÓ¥eïü¶•„ÌÎû›ýŽpÚµ«Ž¿{”–§Qâ(Á2ààè÷ï2}þJ6îL M š®cKÎÀ@œ{ÿ-Nê×»ŽQm¿âå{®gGïkqý`z5ŒÀ øñ^‰ãB¹æ…?õ¢¤ñ¥PÊõã_­Uù”#ÉEÖÅQ}|\Î.¯«æôofaÒ›9Þ¯û`kV<76 “§!„ð Ÿ4´ýý°Xrº´£ƒ­œN>IK{c÷óËžÜ4Ììß ÓÀép°âó‘Ùƒ…¸Y"iseC,kriûhìùFµäo»(Ùs+ :΢&7ÔŠ_ƱLœÇ™^÷2õžfD™ûø`òTÖ•úK‰2÷_âÄ¿6#^ùΛVòÞÂEL½ˆ%·Ìdƨñžý`ÙÄEiâKYý±¡ã‰;Kͦ«jàŽ³>Z­¯nmʧ|¼¿ÞHbÌ•´‹òI5H!„ðMCÛ‘å`ðõ#ð³Û1 Ó0HÏLçdÒ tg† †a¸Ï›&†a‚iY© éi¾Ø$!D9ð4’”Ê—b¯ÚˆZöwÙ²ñ0-깆ogä‡ßÎ`oD´ŸÂݘZöwù廽¤µlB°—E{Õâ—É8°™Îº?‚;—~ÀßC'Ñ:XCò^ý2Š ‰¯sÀâO¸?¤žLGÏÕÒ.ɱP ÌìYè4*uÉUa÷°ì‹éòm5ûô Î.÷g !„ð Ÿ4´ÓR3°Ù줦¥¢01Q`š£LÐMÃÝ£m¸â˜èºîtžž‰<ÅCˆ‹‡ mÏ]ÃãþöD&ÜÆÕu;>ŸÍüCqŒyº=aJ¡BÛq÷ µ6ïAî3naH‡8‚ÓÿboJÎdŠ%YÆ/¦ ÕÕ|–Ì]Nè•͉ Jà@Šù¯|؃Ž6%HÙ©5`$­ß~ŠÍõFÑ£ºÝ7Ï8B!ð>ë˜mñâÅY½{÷.bB˜‚Ö¬YÃСCQJ±bŇ,^¼€””TòÞo;=³@ÏuPP×_#)ÁºM ÝÀÔ,òÈ!Φn˜(‹¥@Ö4]#X\š–"3×2¦‘»‡P¡4ÜNÅ-“w=î%”†&=WçÒÆ‰éåy[¡y&Ä+ê½ézñÄ…û|¢4,ZÞóTþ×Ï>×kh$KÆ4t òíCÃÈÝ¢ihJŸ×=1‘ûøþ‘džþ#w.fF¿hlrL„¢B[²d ½zõ:ëvï°aÃé@šû'5×ïé@†Oz´ûõDŸ>KõYW¥ª$_T¡Y¤AˆóŠÒ(,[ª"Þ˽ŒúË”d=â+mœ( ­4ï—n¡ç“‚¯Ÿ}:r®:[J³ä! Ð¼Übóº'&Ìtþݶ‡d#™_ß{–ÕÁƒ˜Û½ŠÌ6.„§|ÒÐVJa‘Š…B!Î5ÇA>zêvì±R¥Å¦¾<–&AšL‚&„§ä¹B!„¸xÙërçÂo¸\·hÒÈBá{ÒÐB!ÄEL†ï !„(2á¦B!„BQ†¤¡-„B!„B”!Ÿ ÷<+;7M³ iÒ¶B!„BqñòIC{ý†5¬ýr%¦™«¡m‚Ín§_Ÿ¡´jÙþ¬žU&„B!„B\(|ÒÐ^÷Õç´o×¥†a`š®Þí¬¬,V~±„*U¢©ï‹U !*ýk_žÆÿÅÜÅSÃkã/ðDy¸B!D1|ÒÐÎÌÌÄ0töíß‘ýšiBhh8q5j2kÎó8Î\ŸP`šØì6zõ¼šn]zI·¢xúvlÚÄFc˜ Ïì墸¸ËÜÁŒÛîã›–ÓX0®)A¤sð-iF‡Ú!X$N…Bˆ‹žOn˜Ö:ii©˜¦‰išKHbÓÆí¬^µ‘Õ«`×ÎcìÝ{’½{\?û÷"00œ˜jÕøbÕG˜¦é=a3‹7Ìgâýh×±m.¿†QOÄ_§u ù„¢œÙð:õáÑ’Ð dÆ,v-¸¶n`ÑAGÙçUÉÿˆ²Ž“ó6î´ªÆÖ ¶J°«Q±9Mäåïqö‘WÖ16-œÊ-ÃÒ¥c'Zu¼œ+FŽçéÿáŒ!9^!ÄùÏ'=ÚN§Nâɤ¤¤°{wóç¾Ýn÷¾¼îdô˜›ñˆ#--•ª/æ™ß˜óÒ NuÆ£7UÃØµŠ7¼È=fM>~¤¡štQþtN>N–~’•/-eÄ¢[h ewòÇ×ñòÛ»p8ªp,ʼniÚ+QYÇÉyw¶ š:“k”Bs¯Ô0ôÂ/"‹<Ì´m̺ëæn  i¿Ü>4žp#‰ƒÿüÂŽdÎâ*„B”!Ÿœ¯' GÈÊÊ\ »ÝÎ7ß}éµ¢qùeW`§NžÂá(üz¿ mäÅKÑülh ¸¬%ôgâo[8–Õ’%#G…(wN’'­ ¡—2cà ¦÷ŒÂªÒÙºh›T4œáxj® $~[ú //ÝÀ_ &UtfؽãÞ<"ghmI–ÉÅ8ý¯ÝzË#ïâ—‡p‰” ç‘ÒÆÉiþøàU¦/ÝÀŸÿžÁш맽ʽM­çoÜi{˜9üf>ë8“Æ7&нÜÞY#è8Ûõ{«§?`Ô×£¸oÛ@¾wõ4Yìœ=’៴`Öò‡i¬U¼ø5ÓùkþTæn‹àÚWæó@»plî‹è¦9Phž‹êŽD~Z<é˾gÇI U÷`Ì„q ¬‚ÅHdÃìç™ùåì=’L†Bûÿ-ൾ_¿4•Yßíâȉ2 ¤z›Œì¦±iåj6î<‰ªT‡®#&òèF„Zà`ÿò‡¹{öOü›¢c ¯IûA÷ðèèT±*ÐXóâÌÚ°‹#ÇSÈTÁD7ê¨ ãT_±yÊ`Æý%ÇY!*Ÿ4´u§Nâ‰Ù{ÚÖ-›·öÚYí¹ûÌét§^pl¶€\½âfÇ“ ìÕ≰I…ZˆsCçô±ÌÚ£y¨î›ý»ºÜBý óø×¼ùIíî~€À™Ïs2Ås!-“óïfìÜÓt}/ÔSìü|6ÓoGú»s[×M•`™\[afîcÙ¤ ,2®áõ'I#û¼Sš8Éb×;ã=;‘ö7ÜÁ³-¢P§’‹ñC©¬ó7î²À4tt#ï¨:øižëƒ])‚c«ê×û—ù5q,õc50’ÙúãalÇqI`ßÔ?Yôñ¬Ÿà–¶Øs]ÙÈ;wKÏÇKrï“ÜÂÆ/ðôxK&ÐÖ?‰ß×m`Oå™4¾áF Z½ÊXƒìüé7ŽÖÃã4Æ?q ‹^^Ès?W§÷˜±<1:˜ëçòÒ«P¹éû<Ø8MYˆl~5㦠%2HçÈO‹x~þ^h°Œi]#°è)®4cG3ù¡†žÙ˺wgñìx+5—M¤á-°¯•ã,„ÚNL/woùýt½`u÷n½P t§‘o’´¢d²÷ã瘹¯c§t&B† qn˜™$Ê@ ‰¥ÃÍ7Ñdø\ü2”g:²û÷ù9´?ó{Ôdõ;¿ŸLG'uz33î!zÄ\žÓ€ MqYûÚd Âٛ¹î….„Ÿ)~™Ï68ްú©×xi_ž™s'í#mRy=ß”2NÞ|g'U‡¿Ås·7$ÈSÎ+…2Ï\pqOƒúñØ•«Ñh6½ŠV~²úçD†TÆšº“ïöh4Ü€  z…3i»RMª·¬GH³Æ™§73ãýƒ4¾o)÷ ¨†MAó˜¬ò.Ÿl¿›6ÍL0M‚ët¢{§&j¸â& 0!¨v;º´oB ÖŠêG¿fÈÂxúíOç Õ2€_¾šÀÆŸŽ’Õ¨6þJ#¤nWzÕu¯¼IÖÞÈŠŸÿ%³K¸kÄ‚ AµÛsi§Æjh{”M·~Åÿí¹—ÖMä8 !DEä›{´u»fÉþÛbÑøtÅb~Ýò#†‘ÓcíFþÍ7+‰­ àîÑ.æÄc¦³û£)ÜúÊ.{|&7Õ @ÚÙBœ#F:'S! >¿˜–ÜÖc>÷Í_ˡ՘÷QMoBÃ'›!%1 Ý41þdWf-;Ũi(* ž.-Cxç·­$dv&°Ë„»‹™+¦ð”^•ásàòh?)ÎG¥Š“?Ø™BËN5³cà¿¥wnãN«±ç¹^ÒœþÍ,Lúb3Çûõ#bÿlÍŠçÆfaî!ð»Ž`µåNÅŽ9·qç·­˜>÷.êû‹½™NM»–Ïy–11tƒ€£iÍÜ/¹÷wÁ'™x^·S¹v$dž$)T¨BDQ3þLLÅÀœýþ]¦Ï_ÉÆ ¤iAXÓulÉÒtýøW«GU>åH²Ž i&ÇY!* Ÿ4´ýý°Xrº´£ƒ­œN>IK{c÷óËžÜ4Ììß ÓÀép°âó)zá,ö}ü£_ÞÏ¥¿É#—Gc÷ÉÜéBˆÑÓ8™áþXT(mnº–Ø‘ïòÊ!lPÝyåòjج'ˆ„´)èä<ùë¾J‰é*Ì,ãØ´ ö®eɳóè:ã.ÚGX¥Gû|Sš81tLš·2þ‹;Wzî©Ê= ia´¾º5¶)Ÿòýñ4þz#‰1WÒ.ªâN÷e 'Æ¿n=Hš›k踉3%‘“'Îà0ÀÔøÓé¯r_“À\û]X5«:SòuÚm(²Ð³ç±âoÃé:ÞŽýËx`â<Îôº—©÷4#ÊÜÇ“§²®ˆ4•Õ:Ã-\޳BT@>i¢:² ¼úZ†^7œëc`ÿÁDW‹ádÒ ÞË¡Ãû8xÈõÿ¡÷qðð>ÞCw’ž–QDÊ&©¿Ïäž—vÒqÊLº<éºâÜ2ÒÁ>OF IDATIJ7ñöCöøŒiušoWí¡úà´ÕPÊ`»IʉTtÀ^µµì§Ù²ñ0žÊmÖA~øí öøFDû)ìÑÅ/ãÉýuóÂ[ÿ£kâRÆOúˆ½2»óy§4qR¥qÖd¶l<”ÿ%½swÂý!õd:yF©Q©ãH® û‡e_üÈÚo¨Ù§qö |ßnH3®ïAÚº™,ß‘æå±m®k¶¨úÄY3س[Sûê\âù©Mõÿڀͻ÷3lf§³.#n¹†nÍШi3ê„Í1’ã,„‘O.§¦¥f`³ÙIMKEab¢À4 F™ ›†»GÛÀ0\}ºn ;¤§gRèPôcüß›pø’QLˆMf÷Ž3®“”f§rÍx¢üä”%D¹32HÎ[ ŸëQF*ŠîwÝÎÀ¥I\vM-ü4X ÔÈLJ&Ó„ÐÐöÜ5<žáoOdrÀm\]W±ãóÙÌ?ǘ§Û¦ªËdSþq}yò…ƒÜ|Û+LXЈwnmLp÷xŠrVš8‰èÄ×U禅ð 9†-bðO;NZ­ô®~Ç]þïn‹¦y=¯šÇ{M¯¥®y‚Óպѷi8– & \ƒë<ÏGwwÅ^‘/ «0Úßõ0}z˜™£oæïa×ЭIM*[ÏðçŽ3Ù—)´ÈÎÜqm £–<ÄýÚ·­N@Æqœ®Eÿ«›V†›äÓ„êj>Kæ.'ôÊæÄ%p Å,rì]rœ…¢ÂñÍ=Ú'ÛÿùƒÈˆÈìû•”Ò²ÿ7 ÃÐÑu]70 'º®süøq²23 O8ó?îr¢§¼Å=cææºÅðyïs£@¹7Sˆòfd’’ þÁöì!2 ®çÑ)&JóÜgiÁäGIqÂÿ³wßáQTm‡g6»Iv“ !„Ð{¤×„® /‚ (ÝBQA 6ô}-¨ˆŠH/‘¢¨¨ˆ¢¨("vEº R!}wæ|¤HEV yîëÊ•d÷ÌÌîγ3óÌi¡6?ê˜ÆL×ËL]ñ"chÂê¶eÌôñ ©Ÿ?æÂٔɧƒÀÆÃù߈ šý?vËȺ2~Ã%ã¼âÄIô¨™Ì™ÊkïÎàáÅDZüªpÕý-¸2üŽ»§¤`FÇ=Dß'¦1÷ñûÉò¯DÌðFt¿¢6Ô¸n-æ?ÍæºCéZÅá¦f—[…<ñÖ]¤æÚår1`À-ôéÓï4ÛÎ褸»ÈʰɵEÞ÷Ò°;ÇpA)ËÄÒ†íDsI­s[µäR§xuÆ2yÛV¶ü¹v-KË1áÒs¡â$ß^ÊqWôyÐX–UpÞS†‘[èÔM<ÑÿaŠczÏpì·@î8.Ö) J'æÑ¦hlPð™·(þqmaZ`ØòoгOÝÎI¯å4û;w¥Ç!ÙÏBqéYºt)ݺu;ç¼wàÀ}L #ï'½Ðß™@–Wj´{ö¼=úœ×²¹3§NÃvö÷…ÿ†³û^*ÃV¤öG)ƒ3-Zr™¢Û.n;âRp¡ãäRŽ»â^›Â(4:“ƒ¿íæ˜uŒ­KžeMÀ Ìî&£PP(Cñ»|úýtºø(æñ"ë(fÿžc<<&ûY!Ê,¯$ÚJ)l’ !„ÅsïgåÓ#™·Û‡°¦×1iÊ¢]§Ni%.{²Ÿ…¢Ì’¹%„Bˆ›££­ç.•×4ýb¿&qáÉ~Bˆ2Km!„â_']¡ÊÙÏBQVÉ —B!„B!Ä$‰¶B!„Bqy­éxþ\Ù…† ÃÜ^!„B!Déå•DûË kùäÓÕh](ÑÖ`w8èÙ£?Í›µ9§¹Ê„B!„BˆË…WíuŸ}@›ÖíPJaYZçÖnçää°úÃ¥„……S5²º76-„¸\Y)l{ç-6_ǰ«ªà{qâß q'„B/ðJ¢e™ìÝ÷gÁcZCPP0QU«1cÖd<O¡%hÝa§ÛU½éؾ›Ôx QÖx’ظt1ïµëÀ-WFàc€ø7HÜ !„ ¼’h›“ŒŒt´Ö$9Æ®]ñX–•WB£s` T'44ˆ?ZI‡Ø«ŠO´Í£lY6+׳íïtl‘4¿f(F^M §ôýö†ãî£Ûƒ¿sÕ‹q<Ù.ÛI»%‡ó†3ðM¸wÙ\WµËü e‘•ÂgOŒ`⧇ÈÔ0ð ®Btëî 9„N¾gZkò¢º Ç‰»Ò-çß.›Áœ¶òûž#dàOh­Æt¼þNî¹¾†œm„B\Ú¼’h{<&Iɉ¤¥¥°kWÉŒ ;9”F¶ ¼a{†>0Žê)6?Þ—1¿öaÑ’;©ço ÈaÇÌ! z¯)3VR•ê&©GÒÐ5‡ñ`¥<1s%;ÛßN=ð9¯¿—BëÑ÷á|c2Éiy7HÌ~\·ÝoáÑqM ¶Ò0êVÌ»˜¥›B)…ÒnRlã½ÿÛ½Š¦¡v”ÊæÏ9£1;•öÃÆòB]ÅŽfòòÈ1d.œÍˆ:~äwþ03üh~ëý Íâ÷ç0÷»Èšµ˜ñW¸F+—³ó8žÃÎc63‰67ßųMCQGS(á‹Réye$îJ•ôŸYüî_ø´{’Û[…à(t7ää.eYü>g £–9éwïSŒOcã¼øß8ƒªK •ßiÎEÖ~v|÷‡«ç¿4Â/i‹§,âù-Uè>|O ñËÙ¼ôÊ#T¼â-îoäÄP6Ê7é͘ÇûSÞerè»ÅLžû8/Ô_ÎsB°™i¹ëŒÆÄà<¾‡u gðì8ª-Ÿ@ƒ«›âød#[“FP/Òë¿lú{£1Ôr*I²…¢”òR¢íAÓezÛßcšEk¬»tì†R`z¬SI+Ž&yíþóßm¸M“òÝŸâ¥ÿHm©WèlRŽfaFÒö¶[‰4›yß÷ç™X'»Þ™Ï– ^ÌíZ5 ,~LÎÄ$8÷¢UkjÇÐ%&§(¹(¶=Jטü=­ÑV¦Ž y  R72}ÑnÂÏæéáõqŠÎmj’5p8ófnæ¦Ú’·dÅ.ÃyS4NCÑ%¶>ÖÀaÄÍÛ°;RÞ&‘tÙ:ã‰JÝÌë vPiЛƚ-Iô«ŽOú¾ÚmРo}\RI „¥–wúh›&ÃVð¿Ífðþª8¶nÛ„e¨±ÎoF¾~ýj"«äÕh—tâQ·{ˆùo`ïOŸ2oÖܦ|ˆ{¼3¡RmzaY™$§ƒu¾͸³ë\ÆÎý„õ+3ge‡Ž™¨ÀÆôjlãÑ7“г'!û¾á—œêÜÒ¸œ´öBˆRÌ+‰¶ŸÓ›íD•vx€©Ç’éÚ©;_ß¼^5ÚÒ[ÚÂãv³êƒw9í`hyŒÀHê7®BýÆ-i¸kŸ[Àç#;pS„\ ]HfÉàì‡MÑòÖ‰²©ÓÙ º0õÊÊØ} qBFb%7ú¥ž+‚:õêäö•%š-£8Ú÷.V-ÿ•;Fä~§O½ÖU*w‚’¾ñ–i¢•Mšï^îÎãxâc™hFI“JHÜ•*>ÁÕ‰pÀÖ_ö“aEj:®ñ¤%‘œx·Úô`áGÌï06ÚYèܯpV*:~öÛtØQä`Œ!ミ,OnŒ¸÷-ç¾ s8Þí^&ÝÓ˜P½—·'Nb] ëT>~Ø1q[Œ`Zônýñ÷ù:¡+>ßHRÄ5´•aÝ„¢4óÎ`h9núŒ¯Ãei´e‘™IrJ"¦'K“;՗νر¬Ü&^å+„‘™‘uVÛȽ;m`wØP: %s³\pV&)™¿€ÜirÕ¯cxó…Lü(¨áOÒ"È@)_š´ÄtI´Ë¼µ9xÒIÉÖøùáÞˆŽElÛø7YMëâT röóÍÇqToH¸¯BÓkDgìàóŸ2ð«WŸ0‡Ô*^ÖÎãxâ «O”϶m<@VÓz¹qS„Ä]©ؘW…°áƒ7Xqs†Õwqj r ØCëå“Åî]Šˆëjá*TF)9ÿäEœ¼Á¬¿6³ÃS‡ûn¿žŽv”DírŠÏÎz}Ú á?åîaù‡›hÿE<Õzt%JbK!J5¯$ÚéYØíÒ3ÒQh4 ´Æå @i0µ•W£må&âhLÓÂô¸ÉÌÌ>ý|¦¿·p3¾5ªS¹œAÊîoX:ëGŒÆ÷Ð6Tj³/8+‹cY`wúb(*”.w¤Ï²:___C>¸œÙ)ÇÈ–{eÛ±]lÛL€™Áѿ狕‹Y—V…=kã,çàîAÕ4ýï¤wÅŸÌdî(†ÿ¯ å %Pé{6³áÛ œ±ñíY,;R‹»¦´/wçq< ‰aÔMU¸uÑ}ܯ‡Ó§i~ dÔèJ÷šy땸+]T9ÚÜý×~÷o »ß^OÇèjTô9ÎÏ/h…`”å®#ºôAÆÃéÛª þY ü•Zƒ^½£)w_’oD4UÔ\–Î^AÐ5MˆrÅóWZÉ-"ŠpE3¨oUnš7™Ýî(Fw‰Ä!Í%„¢TóNm·‡íüDùò'ú¼ô3°, Ë21MÓ´°,¦i’@Nvöi×ke¥ÿÛV-ÚKŠü+T¥Ñ5÷3ëŽë¨!s°\xV6iÙàà(™×Y=®OŒþŽ ‡Ë'‘æPÙ eÁa8ÖÍeüÝsÎr¡T½¢7Ý;„ë›aSPoÄ4fº^fêŠ{DV·-c¦gH}ÿÜæ¹¶ê´¼‚Š_.âÑñ™x|‚©Ú°ÍÅõµý¥ ïåî|Ž'6'Ñ£f2#d*¯½;ƒ‡Çò«ÂU÷·àÊš~w¥”­Bžxk-gÍbÅ‹x&.·¶áªI³ö õQ(œ4¾{3ÊOeÚû³™¸ì¿òÔé4š.½.l¢í¨1ˆç'á™9³yô£lÐ{`8£±yñüµPãº!´˜ÿ4›ë¥k•ß!„¥Sq—ö¸¸¸œîÝ»ŸÓ@Vk×®¥ÿþ(¥Xµêââæ‘––ÎÉý­ ¯O©¹v¹\ p }úô;Ͷ5–e´œRÊæWÞ‘;°Œ6lEšîTÊ2±´aS¨üe”M®PËŒÜ8åA¥0ÔÉXiÛŠ%¯Æ)\iËÂ:ù ^dâru>Ç“¼ÇNŠPFnßi‰»Ò,wë” ¥ŒóhS46(8÷œî\TÌãÚ´À°åßð)Z¦ÈvNz-Åm+÷1Œýüuê&žèÿ0‡FÅ1½g¸Ì–"„—€¥K—Ò­[·sÎ{ØÈ2ò~Ò ý dy¥F»gÏèÑ£Ïy-›{tº7ª0Œ³¿,þ)…a;óç­ [¡»úg·Œ(]NŽÊ)ƒ’ÂCÆ9Ô‰ËËùOò;MÜHÜ•f e¨3î—ÓïÛÓÅ[1YGÑ2%ÇPqÛÊ{Lgrð·Ý³Ž±uɳ¬ ¸Ù]Âd´q!„(¼’h+¥°I²%„Bˆ²Ì½Ÿ•OdÞnš^Ǥ)#ˆv:u™BˆÒHæ–B!„ðGF-ZÏ]Û%Á$[!Ê I´…B!¼BºS !DY%ƒ^ !„B!„$ÚB!„B!Ä䵦ãùsef6 Cr{!„B!„¥—Wí/7¬å“OW£u¡D[ƒÝá gþ4oÖæœæ*B!„B!.^©^^÷Ù´iÝŽvm;Цu,­[µ£eËÖ4¨ßÕ.åÀßû¼±Y!Dia&±1îuÞü*þe„8w¥‡'žO¦>Êãïì%[ö“Bˆ‹À+5ÚÙÙÙX–ÉÞ}<¦5Uµ3fMÆãñZBÖØvº]Õ›Ží»I·e™û Ÿ-ŽcóõÿáæØP|Š;œM!Î…ÄÝ¥ÇÊ`ÿOÛø+°1mkb;ÛÏÛ<ÊOŸ}Îæ®C0µ¹¦Bñ/óJ¶é1ÉÈHGkÖš#ñ)|»q;k>ÚÈš5ß°sÇöìIfÏîÜŸ}{âtQ¹2~´­Ïæö³›C?ÎÕ1±ô] w¬½åø†ûhӃǾIÁ,òç°sÞÍ´Š¹™ÅûÝÈ.(ƒ¬¾|¼-;ÝËÿÅ{NŠì?gr}l'n[¾Ÿœó­-4Jˆ¬³)#.ìx"qWzY ¼;¼-ïü„$SCÖvf=8)_%á9óÒ'ÑZçí'!„âßç•mÇ$)9‘´´tvíŠgîìù8ŽâË›† ¿ ?ÿ(22Ò9óÅ‹ÅÑo¦2ò™w{pZr"õ“Ô¿È1“YýÒ2/¾úþùõVÂ:¦Ì߉ÛÆ‘4ZÛ¥Ò ¬1‚‰y;M>{é‹~¥ËøÆ ¬D>}})ûÂobÁµU°K\ˆ y<‘¸+Å4–ib'Îë–ežå x!„âÒá•m·ÛCüáxާ¦q<5 Ë2q8¬ÿêS>ÿò“"?»˲8š|·ûÌ÷¬ÝVñؤ4ä1z…Ù$¹óÇþN{Aû—1}CR¡Z¨L~Y<‹oU8NÒIHÏøÎLbÃô ¾á?Ä´‹¡yÛ«¹ëýƒ¸å©Ôò‰èÁ7WãÈ»ÓXuÀF“þÓB¦mò£ÇøÁ4pšüµâ>z]ÕmchsÍ@‘#…;¸æÄóÅ÷ÓïÚδhw×ÞõjNº¶>c7ûδqÇñÀJå§åO1´ïÕ´lC›#xù§tŒÊweÉžƒi×.†æmc±.KŸËçžÎ·¯¦Õ oðG¦•w+?‡3ûÑê?Ïð}š%õÞB!.8¯Ôh›“¤ÄÄ‚ÿó/Hš5iQleu~ìã©i˜³hÂrv³hâtzOá¹3§]¨W-Š2I=’†®9Œë,剙+ÙÙþvêùè„Ïyý½Z¾ç“INË»Ab¦ð㺠ì®x ŽkJ°•†Q·¢ôc,Õ|©;øAú}p7¯¿¼Ž®OÕâ½É+Ik?‘Ñ­ƒñQšòMz3æñþ”w™ún1“ç>Î õ—ó\‡ldðÃk#¹o…Eû¡ã¸½®/ ?}Èœ_Á•¿ }e°•¼‰Á‹ì<Ž'ä°sÁ†ÍL¢ÍÍwñlÓPÔÑÊEø¢”Ä]R©ïÿx¾W¥ˆ ÄPê û·0' ®nŠã“lMA½H¬cü²éoìÆPË©Ý$„âBóR¢íASW¾íÇï1Í¢5Ö]:vC)0=Ö)ƒ¤*‡ÝËžfAÎL¿¥¶?K(+þ1MÊÑ,ŒÀHÚÞv+уf3ïûþ<ëd×;óÙÔ‹¹]«±fÅÉ™˜ç6‘К€Ú1t‰‰ÆiJ.bJ;#  w=r-ëÆNááÿVä—¿›ñÐ ]³+@X§ÝêäŽå¯OnaÕ–ƒd·ÆïØFf¾w˜*CðÌˆÚø ÚVf×G›Ù’8VʙˀQâvœÒôåâ:ã‰JÝÌë vPiЛWëׯ&²j@^vñ'=+a/-<Ê5Ï Ó@åxãÕ‹V&Ééà_Ý…oD3îì:—±s?á@ýÊÌYÏwö£A ‡ÍNHKÊÀÔ{þ²J¡ ]‰ÒΠ\«»x䪯¸ï“ý\1î9®­ìÈë›âæð× yyîj6îˆ'Ãpá“ib?–…¸üÎ>w0­[WÁÏ0r»‚(ã¤.!gSæLÛÙyO¬øŸØ‘H³˜j8S÷7HÜ• Î+¹ÎísWMèÕØÆ£n&¡gOBö}Ã/9Õ¹¥q9iq%„Â+¼’hû9}±ÙNTi‡øz,™®ºãðõ-\[ºàoK[xÜnV}ð.ņf‘´q%ߦ¼ëjVä×8˜&¼1˜Î?LfÍ”XÊrƼ`Ì ’3À?Ø› ¢å­79d!S§²Auaê••±û$ℌÄ4ÎÐè_”v¶ò´¼¦¶OÓ©M8޼C€{ßrî›0‡ãÝîeÒ= Õ{y{â$Öå/gØ00ñ”4¨áY”9ãvÄÅuÇËD£0JMDâ®ÔËM®uî¥AÞ)þœ?w£-z·Àþøû|ЕFŸo$)âZ‡zå2H!„ðN¢íÎqÓwÀ`|,K£-‹ÌìL’S1=9X,ËÊ;oj,KƒÖ”¯FfFÖiÖjP¾óYÞ( +¿ÓwÎnæ‚mW>Ë”ÁÍ$û²2IÉÔøø¢GõëÞ|!?J jø“´2PÊ—‡&-1]mQPÛ¤Ô‰v)Ymf‡§÷Ý~=#ì(3ˆÚåŸå=ï¨ÔˆŽ…|ÿÕ2šEPL+ˆ³)s¦íˆ‹ì<Ž'ΰúDù,aÛÆd5­wÚfØw¥˜Í`?HOÎÄ,”iŸÍç®è‚÷ *´ÂÊÝÃò7Ñþ‹xªõèJ”Cº6 !„ð¯$ÚéYØíÒ3ÒQh4 ´Æå @i0µ•W£må&âhLÓÂô¸ÉÌÌæt³xØ‚ªP3°ðˆ±nÊÛþ£¨îAD)Ž|÷ ß쉢KÍ@l®hõ­ÊMó&³ÛÅè.‘8ä½B/ñNm·‡íüDùò(¥ò~Œ‚ß–eaY&¦ibš–åÁ4MÈÉÎ.qÝ'÷ùU'~I_à ÏÊ&-üóÀ9ëà±Ç5ÊÈŸÿÖ†Ãå ‡“Hó@¨ìq GA1¹ßO–%b†7¢ûÀ%î¶p®3˜OŸóvŸ© IDATZÉÔwºÒîþ+p)5®B‹ùO³¹îPºVqxgŽS!„‚âG³ÇÅÅåtïÞýœ²Z»v-ýû÷G)ŪUï7´´tNîo]x}ºH͵ËåbÀ€[èÓ§ßYn[c™ZØä®´ä}¾†­Ä)j´ebiæP²OÊ6maZe³t«unë•”20 ňÖVî¸ 'J  ã¤ZË3•9›íˆ‹å|Ž'y²_•a;¹6[â®TÑ–‰EásˆÆ²¬- C©3îyÏ>éÔM<ÑÿaŠczÏp첋„¢L[ºt)ݺu;ç¼wàÀ}L #ï'½Ðß™@–Wj´{ö¼=úœ×²†aœÃU6©3ðž³û|•a+Ts#û¤LSÅí~ušÇO-£þa™³ÙޏXÎçx’÷Ø™ö«Ä]©R4†Qô>›¸0l€Îäào»9fcë’gYp³»„ÉhãB!¼Ê+‰¶R ›\u!„âbsïgåÓ#™·Û‡°¦×1iÊ¢]† ‚&„«d^ !„B”^Ž:ŒZ´ž»”Êm9w±_“BˆROm!„B”bÒ¥I!Ä¿OÜB!„B!. I´…B!„Bˆ ÈkMÇóçÊ.Ì0l†äöB!„B!J/¯$Ú_nXË'Ÿ®FëB‰¶»ÃAÏýiÞ¬Í9ÍU&„B!„B\.¼’h¯ûìÚ´n‡R ˲Ð:·v;''‡Õ.%,,œª‘Õ½±i!„B!„â¢òJ¢e™ìÝ÷gÁcZCPP0QU«1cÖd<O¡%hÝa§ÛU½éؾ›Ôx !„B!„¸,y¥Ã´é1ÉÈHGkÖš#ñ)|»q;k>ÚÈš5ß°sÇöìIfÏîÜŸ}{âtQ¹2~´­õi×myŸ›cÛÓ¢m ÍózMáç ‹Ó/%„ø·¤o~”1ý™¹+K¾”"Ÿu”OîCëvyÇíØ«é1`÷¾ô.Ûsäø-råìaVÿtxx©'@røcZ_Z]ý[Ò,´•À»Ã;ÐòÎOH2uA™½ïާs̵<øáA²%¨„B\D^©ÑöxL’’IKK`×®xæÎžÃá(¾¼éaØðÛðó"##J¸ä23‘¡Ã¸ééÇénG†(µü ¤\ˆK€¶0M «„f¢,r“zøy~|+œ‰ü½ï¾XùÃW,£ß+3¸¿u0>r /ó´eâ1‹9~ä[òþÁ2MLãD’}àƒIÜ>ùg¢Ç¿Á×TÆWbI!ÄEä•DÛíö8žœœ,,ËÄáp°þ«O‹­­¾²óÕX–ÅÑ䣸ݞ"Ïfe$“nT ºI4ÑmyɵBZš q)r³oÅCŒžùÓL|‚«Ñæ†{xlX[Â|˜ñ¬}ñIflØÉ¡„4²Uá Û3ôqÜP/›ÜI|÷2//ÿš?“mTjԕጡOݼçÅeCk \mš·lI›®áÆþ½ykìP¦LœLóÅ“è惲RøaÙT¦,ÛÀ¯ñšJõcxï85 9±Ï%.D|øÞþŽ:÷Nçùjá2$„B\\^I´MIRbbÁÿù¹u³&-Š­¬Îï}<5 Óc-Pˆ'íéÊŽ;-œ ÁøÉlaB\Âl”oÒ›1÷§¼ËäÐw‹™<÷q^¨¿œç:„`3ÓØñÝŽÆÄà<¾‡u gðì8ª-ˆV9ü1g £–9éwïSŒOcã¼øß8ƒªK UMZ²\vJ©¼ã¾Âæ¬Éãn"nh ¾8B—+°gîhFÌN¥ý°±¼PW±ãƒ™¼Ý‰RÜñ)þïcÎIfÇ·«˜öìlÆ>èÃÒ™7SËWI²-Ä%ÅÍá¯òòÜÕlÜO†áÂ'ÓÄ~, ë¤r'j9ý*×¥ïsè˜INü¯ìÉöpà¹iû|~YeZøÎÀ"À;#:Š—¦ râagv Íb¢pJò¯Nûf,øáâ³cq‘¸yB›ãØÈ†E“yóŠÓ.»\!„¸x%Ñösúb³¸Ì ð!õX2];uÇáë[0¹¶tÁß–¶ð¸Ý¬úà]J e`³þ¡Ôï|O鏿‘ù&~µ¢ŠlMñ/²~Ø1q[L~Ä<ü c£…n¤)œ•ÊËÀY¥DöÁØëÑ„×Ñwü?µFZ)ÐèÜg%.J/›/A¾’Šû¤K“ãñihÿrøÚ =\¹;_ņçÆñôø;9þÌ<Ò¥’$ÛB!.:ï †–ã¦ï€Áø:X–F[™Ù™$§$bzr°4X–:÷Âɲ4hMù adfdõv”R(maÊDTò!kûfvxêpßí×Ó1ÂŽ2ƒ¨]NñÙY®ÍZ(Ÿ,vïRD\W W¡‹g%mƒKµ›·§¬à³#£;VÂålD Ç"¶mü›¬¦uq*9ûùæ‡ã8ª7$ÜWI\”f¶j× @õ9?¤t¥k 3vðùé‘õ w¨“n®Øœ5èóälʹîäGFãxy&´•.B!..¯$ÚéYØíÒ3ÒQh4 ´Æå @i0µ•W£må&âhLÓÂô¸ÉÌÌæ´³¹ÿfÍ‚I‰¨Ady;©{¿åí77á®7’öávo¼!D‰2ùeæDæe4!6º*~É[X:cDßGó`~ÑTQsY:{A×4!ÊÏ_iú¬çL6ÊÇr× ]ú ãáômUÿ¬þJ­A¯ÞÑ”“þ˜—Ÿ”lÝŒf"ïý/Þ]É·‡+sãÔ t«äƒ¡Úp÷ ê š?‰þwÒ»ŽâÏf2÷@Ãÿ׆rJI\”jþ4¾u0õ>žÉÃwObX¿Xj8’øþÿæóv|EúMŠ¥‚¡Nnø¦†O]ÉÃyj£T÷2ƒkúI_}!„wúh»=lÿã'ʇ”/èw©”QðÛ²,,ËÄ4ÍÜùv-¦i’@NvöéWle‘¸û+/šÍ‘,#8‚úÆðÆÈ©-óh ñï³LŒ !]3Ÿ§—f œaÔj3‚×îëE¤C¡j âù GxfÎlý(´ÆNã¨@lg^;à¤ñݳ˜Q~*ÓÞŸÍÄeÇðø•§N§ÑtéM¹³[‰¸$øT©Æç‹yðÞÅ`Vµ*µcÇ2óÖž4¯äŸ7-—õFLc¦ëe¦®x‘±G4auÛ2fúx†Ô÷'wÖ&‰‹ÒÌ·ÆfÎ âÕiËygê§$ZADÖiÍèi÷2¤I`n 7ƒ‰oU®{l¿Þ2ž)O,¡å›C©ç/×B!.ŽâÎ?ö¸¸¸œîÝ»ŸS¼µk×Ò¿”R¬ZõqqóHKKç”ÛÎ…þÖEj®].ÜBŸ>ýN³í¼ZðBË)e  Mˆ‹Ek+w¼…ü”Â0N\ÜjÛr¥0¥ Œ¼«eË´ÐÊÀV0ïmîc6ò*²Ž“ʋ˅¶LN…¼±ÅÃOÞçy1¥J*ƒÄEi’7vKÁuBÞú»W[&§îó¼c Ã&I¶Bˆ’-]º”nݺsÞ;pàÀ¾@&‘÷“^èïL Ë+5Ú={Þ@}ÎkÙÜ‹©Ó:® ÛYÖ„ !þ J¨¾”*ÃâŸÅ(òdÑÇJ^‡¸\œËñûlö¹ÄE)¦FINOÅS„BˆŸWm¥69Ñ !„B!„(ƒdªQ!„B!„â’D[!„B!„¸€$ÑB!„B!. I´…B!„Bˆ È+ƒ¡sef6 Cr{!„B!„¥—Wí/7¬å“OW£u¡D[ƒÝá gþ4oÖæœæ*B!„B!.^I´×}ömZ·C)…eYh[»““Ãê—NÕÈêÞØ´B!„BqQy%ÑÎÎÎÆ²Löîû³à1­!((˜¨ªÕ˜1k2§Ð ´Æî°ÓíªÞtlßMj¼…B!„B\–¼ÒaÚô˜dd¤£µFkÍ‘ø¾Ý¸5mdÍšoعã{ö$³gwîϾ½Gq:ƒ‰¨\™?Z‰Öú [Ðdø’Y“ÆskÿëèzÛvfkδ”ÂûÒ7?J‡˜þÌÜ•%_Jqÿ4N$ÎJ©œ=Ìêßo"õ¤›ÃÓúÒêê§Ø’f¡±HÛ¾ŠÉcúÓµc,ÍÛv¦KŸ[¹çõ ñœVâFunO‹¡Ëù+G‚E!Ä¿Ã+5ÚIRr"iiéìÚÏÜÙóq8Å—7= ~~þQdd¤C‰)s6{V>É=¯ÿA•n½èsçMT­R“H»BêÀ…¸h Ó´°ÎxÃL”iÿ4N$ÎJ-m™xÌbökÞ>°Ž~ÃÓcžãcWFÜ;Œº9$ìûƒíF0ΓªrØýÞ|6åøaýº%¿÷`Bã ¹`Báe^I´Ýnñ‡ãÉÉÉÀ²Lë¿ú´ØÚê+;_eYM>ŠÛí)ò|aÙ»—󸛉ÜðÚ|†ÔÀG)@!-Í…¸DY)ü°l*S–mà×xM¥ú± ¼wƒš„`“ï­È÷OãDâ¬LÉÙÿ5[RýéþÔ#ÜÙ*0wëkÑ(ŒBY´Nû‰…o&úžÉt]3ž™ó¾eÄ‹Wê#A!„»¼’h›“¤ÄÄ‚ÿósëfMZ[Yßûxj¦Ç,Z Ÿ•ÌúWæðkV%Ò¼ž©¾TnÀ{îá¦Ar1%Ä%'›?çŽfÄìTÚË u;>˜ÉË#ǹp6#êøIÍ’àŸÇ‰ÄYYc¯X‹pÞcËêo8и;Õý P§¶l³Hþz1ë¬<{u3¢ÃÛ3û‘%¬=Ô‰AUíÒ N!„Wy)Ñö ‹éý½íÇï1Í¢5Ö]:vC)0=Ö)ƒ¤"kŸþœM¹æW3â¦D:’زäE^y׊)ô¬ä#'N!.!úøf¦/ÚMøàÙ<=¼>.CѹMM²gÞÌÍÜôB{B¤9J™÷OãDâ¬ì±UîÅSþÎýÏO↠ˆíy=nêIÛ('¶üBžƒ|´ä{ºM£E9\­pMð(Þú¿]\W=œr÷E!„y§¶iâ0 NuØl﯊cë¶MXÖ‰ëüfäëׯ&²j@^vñ'?+3#PõªëèÖº> EfñuŸ§Yúu×\_»œ7…¸d¸ÿÌÎì@šÅDá4 ”å_öÍYðÃ/ÄgÇì/ã+”uÿ4N$ÎÊ åKž²´Ë0~øüV¾3‡1+æÐbÄ ¼4ô ‚lŠì=«Y¶3‚>ëá¯8pSï*¼óÞ»ü~ËšJL!„ð¯$Ú~N_l¶UÚá>¤K¦k§î8|} F#×–.øÛÒ·›U¼ËéC3ì.ü HLNG«Š(¶À"4ß:ŽG‡c—Z !..˃Åɰ§~-•ÌP¦ýÓ8‘8+l¾ùBvJ*î“vœÉñø4´9|óïã+{@ZöA‹è?ëN†ÍþqpG-Íïï¬æoO"³nîÊ›ù«Ñ&¦•Ì[?ÞEÓØ`ér&„Âk¼3ZŽ›¾ãëp`YmYdfg’œ’ˆéÉÁÒ`YèÜ‹ ËÒ 5å+„‘™‘uúû…S?L±äëí¤ô"ÌGa¦ì`GªðÚåqH’-ÄEæ!y÷!r¤r¿†Ôp,dÛÆ¿ÉjZ§R³Ÿo~8Ž£zCÂ}¥F©lú§q"qVjÙB¨]+ýÕçüÒ•®r»„éŒ|þc:Fd}§Þ`1P¶ thAÅù«ù#Þ®ô+ËÖ%SíæÉ<ѹ‰„Z'±nÒÞZ±™ä¶WÉ hB!¼Æ+‰vFzv»ƒôŒt­q¹PLmåÕh[¹‰8Ó´0=n23³9íl-ŽZôÔˆÅS^ä‰ùC›Â–93ø½\w¦µ‘Án„ø×eòË̉ÌËhBltUü’·°tÆ.ˆ¾æÁ6 GîTAó'0ÑÿNz×QüùÁLæˆbøÿÚPNnŽ•ÿ4N²$ÎÊ ß:˜zÏäá»'1¬_,5I|ÿóy;¾"ý&ÅRÁPdþ6—I+2©wE-¢*¡Rv±~É{$ø4¦Cu_R·¾Ã—©5¹£W[W+<ð™‡À^5YøÆÛlHìBŸpÛE!„wx§¶ÛÃö?~¢|Hy”Ry?FÁo˲°,Ó4sçAµ<˜¦IBB9ÙÙ%¾Üª}'33ë^\ñ #çÚˆŒîÆgŒ¡m°MN–BüÛ,£BG×Ìçé¥(gµÚŒàµûzéP€õFLc¦ëe¦®x‘±G4auÛ2fúx†Ô÷—›ceÅ?&qV†øÖÂÌ9A¼:m9ïLý”D+ˆÈ:­=í^†4 ÄP¦BàÑÏXòÊ’²4ÚDd£ÿpß«#¹.<•OŸûŽŒZwÐ1ÂŽqÒ;‘{Pkú4–}~ˆkTÅ!ñ!„ Š;½Øãâârºwï^0íÖÙX»v-ýû÷G)ŪUï7´´tNîo]x}ºH͵ËåbÀ€[èÓ§_‰ÛÖ:·&¯Œ¡r÷¹¶L,m`+¶vn+: ›ôÑBˆ2néÒ¥tëÖíœóÞö2Œ¼ŸôBgY^©ÑîÙózôès^Ëæ^•üF•2°ÙJ,"„ø—äöÓväŽ0.„B!„B\ÂTôÞº/h¢m¨F!„Bˆ ¤qe;CZùSÞ_:BœŸ£™‹6gòÓA·×óV¯ôÑB!„âBº­] ¡2«âü…;`h[;ãßM*2Ö…æµD[¡QÚ<é1 ”t B!„ç¦r°6CÒl!Ä?QžÜV1—c¢]>}3áé1T¡W¯Áƒºêl@ñSx !„BQ”Ï¥h[)üðÞ 6—»–[»Fà(î¥zްnÆt¾ŽÊ„ÞQø^ÎmàÍd6½½‚_#ûrsLEì—ñ[¼R½–¾‘N±±tŒí@ûv±Ä¶mG»6­iÓ,šjYŸãçŽ÷Æf…e…áC³fé_ÃoØ Úw®ÂÃÍøÊÅCÙeØiß¡2c;Š¿hBü‹.±/aöfÝq=C^ÿ•tKƒ'™M+ÞâýŸâ9]›Tó(?¯ÿ‚ïdb^î¹±þ­e¬Ù~üò/BxWj´µÇe™ìÝ÷ç‰Ç4S§Fu¬oa™…›•+Ðmó!! –$WK.¹ƒ©âÒaØi×"„Æ?¥òî^/mCÙ¨^ÍIý}†Ê2ÃFýÚ4Þ™,óa q©±Røì¿wðÄ— x4€/åB#iÔ±'ƒ_K³ vï¿ Â"ªP%Ô‰-¿fZ[gî÷©KÏàÁZ[”žw#Ä…å•DÛ4=dd¤£óŽ4 GޱkW<–eå•Ð'„ àAƒê„†áÙýÉ®ÅNæÂÔ!‰*æ¨ùÛšÝ<²ÓÄ’ïºÄo®D“äîz;…ƒæ™—9_ åõQg•òþ6Ê åC÷›j0ªRѦT7íãžÍ9ä\ªÇo‰ƒÍÁ€Õ¸>ùo†}”AzAL(jÆVgJÃL[p˜_Ý>t»©£¬ÃÜúÎqŽéÜ2U®ˆàÅN¾üøé~¦lw_º1%.7©ñ ¸#𿱭 ²ÒIܵ™÷–¼ÂÝ÷ñêwÓ2ØÇ{ɶ=’Þ¿ÊuJq)·hB\ÞI´=&Iɉ¤¥¥°kWÆoOãµ·¿á·xMXývô»{ ý¯ƦÉî§óܼOù%! íW‰w¿ÄÓ½ªà „çÜ»yó¶ÛYÝæU–Žiˆ3ï%¥|÷wØÍöx“ò5šÑóöñ ‹ +¦ûI:ßMĸßz1wþpêú(rØ9g·ý_c^[r?Mò[U¹ùkåDÆÍÞ¡tŸrQ´ê3ЇniMè©}¨Ì#|:õÌþz‡’ÒÉÁIDókØÞà»Ö²içQTH-bŽgBßÙÔÙ­?ç_-x™™ne÷Q*Õ«)[áïš;™-Ë^ãµw6²ã¨°¸mÜ(zÕ Èý¬ Ëø‘IÆóG¿¹Ì\ ‡Ïß+zóbj¾¸„'g²~Ú³ÌÙ°“ ÇÉqÕ°=ƒFÝAϺE×—ÿ¾¿ÙÍ¡Ä4rT•ê·ã–qcè]7›:Ã{<¯Ïíß³(S¼’h»ÝâÇ“““€e™8ÖõiA-waWv¾˲8š|·ÛsÚ(Úô°ç çÄ‹*Ç€z>üñõ߬J–†+B\LÊןÛùóëC|]¯ ƒZºX¶ú8É™¶¢J“Êü·­‹Jðd¹ùáç¦mN'Ù Z¶ cP]?¢m80ùñ³¿˜ô›·a§uëP†4tRÝ©9r$å„Ü sƒf×Ôà‰JǸoI"»=¹×]¡WDñf¬‡çâ@ÝÊâ|deóë Žr¦\íʼ~_½·7X˜6}oŒâÆŒ#Üûa*GÌ3ÇOûNá ªéK%§‹øý©¼·š6 ¤yE:#‡-[ãyýÇ,Ž[¹ËÄv g`M_*» ì¦É߇ÓyoCŸ)á&‘͇&ÍBÚÄEM§&1>åëX[Ò2‹r“ìç¯r±÷«ýLþ9› ¹ (cT^ $(Î@ÚMF–d³cá8FÍK%æ–Ñ<[G±cÍl^3žÌÙÓZÛó¯·™øÂZüûÝË ±ø=Ìñj!Øw ÏhËÄ<å‹oføÑtÈXn©˜Íöç³à‘1d½>—{¹NiÑã¤ÞUñ]·‰’n£n¬T~Û|{û¨áT…n8Ù¹¢'w=r#å]&‡·¼Å”OñrÝÅ<|rBg¦±kóOÄGÞÊc6Ä/ùGÞz5Ž—¶FpÕ­CyìIæóÊëOP¡ÑBÆ6ôÇPgX?ü8} ½k{ó†ÖqøËÇÌÿ \Îâã¹÷múÞý8÷VJãÛ…SyþAƒÈ…ãhTtj6Ë4± 7¥×Vîcæqv|»ƒ73ážzøgüÅ·ï.â¹;ÿ$uÞ+ ©áwòúòßw•[xx|}œÇ÷òyÜl^xЇ¨%÷Ó"à ïñ¼>·sÏ¢ìð^vbbÁÿù¹u³&-ŠF]åÝž>žš†é)¹­é‰ÅmD·­@ãÌ£<ðë%ÜäPˆ2"¸z1*Éd°ãX{„Ð!(ÿKÉ?jR¦²ð“R²!4ª<#[…sÇ‘½¼°ÇÄT6ê×q•v”׿È$ÕPX &mа}$6VlÞ’Àò‹ò•Ëѯd`±c{&žº.¢]Iì>¦uk90e{–&ç¼¶k+xoÊÇAÏ•¹ÎHáÉ5ÇøK’ìF=¤ìN`æžjÜß­"â8Ö¨ƒB2yã£4ÌÜ…Î?Õ£ü MIæ•uYd;ýéÝ1„‘Qn¾Ú”Ì+ß™„Ô¬Àðö$ÚÃìÃKÙ¨QÍŸJÇ’™öE6Ù;ͯ¨ÀÝý} X²Ÿ•ÅÞÀUÔjU…IM5n8ÌÜTE³VaŒê—Äós–×g 'QD6 gB'»¿ÜÏó?I’]&Yr²³H÷¤“°ó;Þyã=|¢^×i›™·‡J¦óÄmõpŠ­ª“}ë],šó=7<ƒÿñx’-ZÇÒ¦q6š@^÷$³„çN§B§[qC#œ†¢S»ºX·ŽdÙ­Üúl{BN*©ŠîNSß'Y»5™¾•ðIßÉ×{ êõ®‡ë¤ÖŽåÊÚyÿ6¬Èþu#ø`ëA²cÊá,ò‚4Î-‰iÕ§Ñ”ˆÃ_0ä­jüçÆ´ 4PMýÙöÅÃlÚrwÃøžaý~©›˜³:žˆ›ßä¿Ckáo(h]™ÝÏÖüîéÇ¿gÖòý4½˜Ñ׆cW]9‰ C–°jÇHš4„,wÞq•Cì÷ IDATUùà´q:ï}´¦SlCœF c`»eóçþHï'[T¤Í¾ÆY£Ú6Âi´¥ed<ßݽžOödÒ<ÚUògxŸ›ã ï¹yóézT†y%Ñöx<ø3_ö¶¿Ç4‹^¡véØ-÷`æ±ðxÎî Ö§\ƒëlûô»Üra#ÄEe8èÔÜŸô?ÿæ—,Mæþ£¬ÏФW#“MVÞ4=! ‰ä~aãMªÔ¢k¤û“Ü›nIé|»7“,òÊ9mçðæ}¼ø]6ÙØç!ª¾“+ò6Ÿ~8•_ÌÊt¨jãƒT¦ÃÎáŠí_d’ ˜ç±Ý‚<[ÙétU(ÃÓyé$~ÌÖ3ÿHåÊ,~âwOÌ;ÄÙ¾þâ…3þ*ƒÿgï¾Ã£(÷6Žß3›lz%¡Wé½WQQAì;нb;rì=öþŠŠ ‚XÁн‚¢"*¤‰@%=Ù™÷MÂ’¶›d6˜ðý\W.Bvvvö÷<3;÷ÎÌ39íbôó'ëôy–]RïpúOÞö\-]—§|åjKR¢P¨O–ïÒ÷Žœ¿mõìÔRý[G+jK¡ ƒž³ä¯<å;Ò7kòeŸÒJ†Æëýws”]jñØÚß«•Ÿ¯Õ³+|ò9ÒoYQtJcIM×/lúGmjž¦Û››ÚôízŽdï c÷Á™’?HÒŠ»tìw~wÅ·¡©3¦i|s¯ü«WhuA’ú m£'p-u|; –ÿªtßpuît¼Nð™œvšVz¬&žxŒéÚPQ†×¹âÇv'¨à#ê’ LÓ”iR\[ 뙨çW¬Ô6ÿþjXê9fRëéÑ﯌±c•²áýRÐV§ön h3øˆ¶O[ÏÖC³ÞÑ7«¶*×LPTž¥èÌ9Á¯\–Á4cÔ¤C#©`‡vú ™¦)#.UmH¿lÏ•-É0ü•Îߟþ‡ÖûR4hPKÅ×Ñ4eš*Ç—þ›Öøõ÷½'ëÀÿ/Œ#Û²·e»–¾v®®ú*¿h<¥>ºkþéE¡Û(¥ø} ~OfI=Íä®:¸w¼^[ù›¶ù+9&¨FeÞ·¡¸æÔTois¦-ÃðkkX5 ¿n•¿ç|9FA{¡ mIÑ»ƒ¶ÇcêÍ…sôòodÛ»XŸFþé§o©UëdI£áéF¨àl¨u÷êìËÖMk}ÜRØË¼’4¶±_|Pª}ùzw…_‡÷HQ§¥[ôK¡äÈP“ö 5epõk¥8Û‘ßkÈg”:•.d‹Ï„ñ&Ī…ÇÒò >ÚEÛG{ŒÉàäçéãMŽ.ﯔ_3•×4I=£òõìF¿l§z¯[¬aæºÐðiÁ+[õU§×XF†nù(W™E…vlKÚÕÊÎÒ_4Ї&+uëVݹ2ø:Ûª¶££Œí–œ¨(%G9rò%Çç×ßyR—³ìsŠú”UP ¯7Ù:"5VMŸ¾ýz…ƒ¡•ðx5²s´²ÿÚª•ìÓ{—©Ž½¨™¥I'ï§ E+¤a2$o¹M¿þeÉHIÑÇ5VüÊmºÿ‹<í0¼:ü°fîT¾º§èÊ&r,ý´"_ΘꛣÝ»y›~Ì‘<Õ~Ý€¼Í™ZÝ0YGŽj¬¥¯¥kyÛœ),Ôª­y{\£½;K{Ô¾Uà¾åfj’%íÒ‚öªF;v„‚ƒ¸£BË‘iVÞö~K’YvttI’ÇG¶¾ÿøoÍÚlv‹äçX|ñ[SŽ£,¿äó”\`(1Ñ”ü– ‚w®³²õð ÕRÙZ ïmÐã«üòÑû–¤¶êÑ»§{Ì2YÍ›ÖMíbfkù7›”ß§SàëÂZ²­Y·Ö7RÃoózc‰­¶û¥*Î÷¾_“-'¡‰=’¿’Ç*’»ö{}ýmžâs7hÉk35?}?MÑOI†!E%«E²¡ôï>Ò’µ­u`‡$yzh±­ôæó÷é/_k`KyK}ÓÓ¼‡Z³4ÿÙ×”<¦—ZÇmÕ†l÷.e 5#y Î?¹½N{îZ]iOÑ CZ+1o…Öfï^͆Ã4õØæš:º®6Ïб[(.?]2Ûiì‘=ÔÀS*G·ÐAcÚêɧÔíÏåêèžiòlúC;J½©ŒÏfif»ÃÔ7µP+ßVÏml¢þ3@)U¼§Z$jê='g/ÕÜ®CnÑõV÷Û§D$hçæä+:Ú«œÜ Qã(!!Q†#YŽ]tDÛq9²,[–ß§¼¼‚óo§æ†OoïäZ8`oKjÙ@ƒc ôÒŠ\ý¾3ø6{†r-ÔqÃS4(!KŸdæk³küàeý‘§M¾hµˆ ýãäçè…ï õÀà–ºÁÈÐ[ë •§Ö1{•t rµà[wI“™¿KÿÝà—íH…Õ|Ý 9«pç.ÝÿV´fŸªkåëê%ùA÷÷E•ÄÆ¨GKÙAõ³ }Zµ#Z'JRîõÚ¦<ù>Ü®“ëÜ.YºùW¿ íX±†kRF¦~Í1Ô¾Kc˜â×Ûæ*Ó‘d[Ú’ï¨që$ hT¨Å9šó“Ow÷m©ë”¡÷7ø”¥±úhEÑhæ¨[¿·Ck:7ÖUÇ5×üåÙÚàR¯žtD¢Oo¿ŸØ /ÕôŽå×âO7èÑØ6ºp\ mš·Q 2O’«ÎgݯGÖ#¯> +·:Jí-]3ž{V7¾u1:©©z¶.ç6WÕzþ±êtúzªÁ“zô•çtÓ«;åóÄ)%­§FuH*:E:^½Î{L7zXO,|V7¿²Kþ؆ê8ò|8®‡”ùr"Zí&Þ¡ÛwÝ£Ç_ÿŸ®yÎ/3®R;õW†Q%_œ˜±ÙZ:ûÍÞj)¥]M¾cšÎé•På{—G¦†•¿çd9²ý~Yœî´O*¯[EÏ™3§p̘1{¬¢E‹ôâ–~rd(ö‹Kuøá©QÃF%ƒC†Yò¯mÛ²mK–eɲlÙ¶_–e)==]_}ý­ò÷(pƒÌ ¹ãÈvº¿[ž¦ÏÚ¬Ÿ9uØ{Œ(xL;]¿]çÏÛ®¥ŽôF¥4Ô§¥Êúü/]¹ÜRË©ºpp’º&Öo_O¿/Û¤[–(ߌѩ§¶Õèuë5õÓü’Ô$É0=êÚ³‰N.)EÙ¶23 ´øëôÄjÉ=˜£7Ö#“ËûÃz]øU¾òI2Õ®g5^×Súï†: i£zyî:ÍNg'¾JŒ(6¡½.J+çs%s‡f¬Œ×•Ýóuëì-ú>OrdªÛítw—<Ý6û-Í5Õ¶Ší˜Ð¾•æiê‘gÖëÃlÉñxuòä¶»qƒÎù$_yEÏ9ÁÉÓZ3Fí“ enÏÕ‡‹·ê¥5¾ÀÀ{’´i¢ÿŒNQ“ÕuñgùÊ7=êÕ7M§õŒ×~ <òøüZ·f›nû0S[8ŒêФ¦ tƈ†ÔÌ«††¥Íé¹Z´8]onô®Û/îOÖfúJ–vŸH¯ &µÔ˜üíº|~†Ö0Xj½òʹmå)•®Û’-³ÌßKsœÀÁIEã*fîøQÙÇ+{¬hÐ+ÇØýú޽ç%%e^+øõ‚Ÿ—¹T·žr½6Ÿ;KŽmZîåRŽc.» ú›aš2Ëq¼ôrɱeÙ’é)>%½œecþe§1Ц©d9ÊۧšùÖè‰SÏÔ‚ÁèåK»)®èöm¥_¯Ò÷]ô7™Ü*Õ«[åï¹üé±÷ðäZY¶49í6ft•sï¤I“Ž—”§ÀMpr%åýž')?"AÛÜð±»è‹ŠT´Þ–» @½°3ÏQjRÈ›/×…›ôækÖÚ(¥õ¯^‰QU>%ºÞ2Í¢/4wßÞ pCF¶¿²×D$hKFØCô¡<ùÙ6wPªR“"´ûZÛb:éüç?ÒyRàti“#Ù{ˆé óæ}ªs9í.ÊÈöëñÏ2êrÐà_Î*Ћ³þÔœJ.}ðïñݺ\óüº*â ÁÊ»)R\ Úo\Ô‰à_oþË?DlÞ®mi´û´Šî¡ª!b×hß+;˜izdšd{@ý‘ ýù—‹ôÁ‡oÉq‚‚¶#E{½?v‚ú÷Â)æ€z)"‡—?úøm k‡~úø-Ý'‹m€š²sµáǯôÕê¬=oßæÏÐ’—_Ò‚Ÿwº»­©m˜o“>~qŽÞþ=‹ùÊDª‹YYZ¹d‰~Ú”'»&³¯¨þ›¬ÔcgŒÕIþ¤œpÞ¼[µú·ÛÖÍÒm_Õ¾°ŠHжü–rssŠîSæhë–Z²ø½÷îb½÷Þ×ZõçVýõ×výµ&ð³níÅǧ¨EóæzçÝ×* ÚvÎ*-øßE:jôH ~˜ÆŸ{·ÞXY‡6PuLÖ—Ó4tøXý÷ëåÔ¸P«ž=Uƒ†Ÿª7øjå~tø²wèÃÿ£ÁÆ«ÿÐáê?t”Fuš.¹ïU}·­jýÂq9ô¤úÉÞ©¯?A#†(ê'ûkØátÎ 3õé¦Zvº^Ÿ2RƒN}\?dZ{ö‹œ%ºü ý5iÞß* §Ãäÿ¡§®¾F÷}‘!©‡Šï£ê¶Ú؆9Ž]ôûèZcmÒK§ÔÀ’ÏœÒ?géÕ­>YvdÚ¸„÷á­¤VU­í¯™qjÚªµZ¥%ÊîU nݳ¸hû0ðÜ”QÎŽÎÒé9|‚ž\]°WBý¿zÝ,·v…Zûú:hø8]ýΦÐg”nûêô…}LD®Ñöû-elߦììIÒêÕ[ôÌÓÏÉëõ–?½å×YSÎPl\åææ¨ÂjïÒâ{/ÕÍ_wÑÔ«ï×भútæ=ºå’B¥Î»NÃxD;»ÉRæßé*´¶ë­ÿÍÓäÏQ×8³¤ÆvúGºï¹UòùÒ´5Û/lj—Þï‹|ÊܼU¾Ö“5ãÊ¡J¶s”¾ê½6ëšúÕZ=>óR N‰bÝÜçjçÆMÊm{†þwå@%ú³´eõwzsÖL]ñC†fνR}MúÉ>Ï‘mYòÿ1K—ÜÐL³ï>FmcŒ’Ç,Ë’U…=hÛ¶8K®¾1›hÔµ÷©m¦%©P«çܤû~é§i7¯ö1¦ O²:6ˆÒËudcâN­ÅýµèÖ:î–Çu¬aȬõ¾ÀöÁ2+¨—c˲lÙ¬óå(]»Bm|û3ãgõ¼âqÝxxsÅ„jÎÒm¿WûBÝ‘#Ú>Ÿ_[6oQVf¶²2³eÛ–¼^¯>ýâC}òùe~¼Ñ^Ù¶­ÛwÈç«ä;½‚uúhñµ>éB~ðõr„λü(¥îüAKÿ)Œì7—û$¿vý½SŠNSò†yzìËŒ oIóôË‹Oi‰ÑLñÊQzNÑÀwV†¾|ìM>î 6\ý‡¦óßÜ$mS¯9ޤÕ¯? 2Rã&OÓƒw¡”¿ßÖüßrÛ;õãK7é´cÕ€a‡hì™7è…wTr6ŠOëæOÓ‘‡ŽÔ€¡Ã5äðIºä©ÅÚZ|N}­Î ô“ýÔ¯__ r€ÆŸ|™îº¼·”þ¾ÝR´ ÷eèÛYÿÕ¤q£4`Ø¡{özõâ³–èûŒÔ¾Jûî^]ñÔreUvÊZ¥ý%à¯'&kXÑÑϳ?ÚY²¾íë4þÀ0lŒÆN¹Eóz^eó­°Ÿ•^ÎPýu‹Ý}Ž;rŒ† ®þå-Gá}öø•:iÜA0ìP;ÿ-Þt¤ÖÉÓêwëÌ£Ö€¡ÃÕÿ ãtùëÃ;â_W^5ë6PÆ Ѱ!Õ«Y¬Œ¸æê=pHào»)-Æ¡ÊÚØ…¶ bgþ¨& ÌÓª|GNÛ¥lU?3«±¿VÝíiÁj=~Ò{ß åéÆzXa­ªøüð…hƒJ×qÖM)¼6 5MEíàß\¥>º§Bm|çuÛ·êtécºû¸ý”`Rîºþ°ýu¬ÝãLø7ÎÕ„‡kúwÙ²K·}a©ÿ[[õá½ëÄ£,ÓãtìwëµÒËT­íkuúÀÞ‘#Ú–ßRƶm%ÿ/îtýú (÷`uñäY™Ù²üVÙ ŠE7T»ÆÒ‚¯kݤöêï×–å+´#¡›ú6õr4Õu–2·fËép–®î4W7>ùšV펺ęrÒ?Ñ£oìÔà‹¦)þñÚž]ô‰µSË?úRkšœ¦é—÷UŠ-³sEÑ6ûC†a­Ï†¼ IŠ–O¹ù¶¤­|æ"ýt¦ö?ë2ÝÓÙПo?©ûÏ»XyÏ?­³;Å–ó­ŸGú­‹o˜ F –þùöEÍxæÝÓõeÝ5²¡<ôµ:ª¨Ÿ8>íܸLo,øSNê¡ê›-ÃÈ×o3/ÖóâuÒ¥·êŠfÙZüì=ºýrS­ç^¥AÉô‰}…ÙæDÝ}b3]8ý:ÝÞí9ÝvHZ9;,!úKÑš»î>²…¼†¡ÄVI2 I’·ý¡ºð”þjìß Ož{Tw^¥¶ó®Õ ¤Bý^Ù|c+êg™¥–/TÍÖŸßþ¨Í­ÎÒõWwS|Ö_úèù'tçåQjûòµ”˜¯åŸ§iómíæå:§sŒÒzG3WH E¯à[7O×Þõžâ'^¡F¶TÔŽ”Õ®‘¢#×4ÿ†Qt´v÷¿*úü ^Ý+nã¶MÌî×p ÖêåéWéEûX=|ëqÚ/ÖmÕÚ¥l-ÐÊ™!>3÷Ø®Uc­ÚŸ±ë娖,»øµC¬‡±•×Êõüäê­Zy„Z暯›aí÷aLSQ;Ø*_Ƥ ÎsòµnÁMºzÆêrÙ£šqBG%xvŸ5d[–ìೆ[¶eË.z|϶מÿ·²ôÇâïõwË35ýò®ŠË]§¯_yV·ù»2g?®Ó;Ćnï ·¯Õèÿ Ú~9å+_¶ü{YVÙ#Ö£-Ã,¿-¿¿’#ÚQ­t—èÛ‹ÒɾШ…úækŸN¸ë Há´q×9Ú¹#_fR+ =ãtõ<ùi=ûýÝ1"^«_}Nß%©gn«÷fÙZ¾=O–RaÉq”Øq¸F ï©xSAˆ¨×lŸ ò•ãËÑÖ?ëå‡_ÕVOoMí’ e}£Ç^X£f“ŸÖmSº*Á4tÐÊŸ4EÏ>¹T'Þ³¿–™¡©¤N#5ºSÑ{¦jý§iáw›T°Šâ%úZ]´lº¾ûCݱÛhâg«’GÊüZ½´A=.›§ËŽj®hCêÓb›>?éy½ñÇE80‘>±¯0¢”vÀ4ÝsÊT}ûíÔõWj#ád.­¼¿tL—ÚN]»´“×(úb¿0ð÷䮣tø=oÜüo}}ÎÇzMž´ÿ¡òùövÊïg¥ßD8Û0)¡Ã8¼‡âÍáÜj³–L ,GÿÖKôä›ÕòÌYºã쎊3 ihs­~w©¾+êÔVæfm·ÔkèH ëÓ@£Ÿ_fE Mê ŠÚx`ÍÀ®ÅGrÿÑ{·=¤ÿ­Ý_wêd.ý™<³jí¯Uó3¶pÏ7r=ì]y­B>`bµúsemÖ2×pÝt2—†lÔ¬ÐÓ4¬°*ï£ý:;Ê÷1`D)>¾¨0??¤s~ÎVÛ³žÑ]{„l—8RB‡¡u@Å›ûë ºË3ñ"=ýÔ2wÇP%e‡Sûúó9™k´-K^ÓSòÇÔ› çè‡eßȶw±.¾&åÓOßR«ÖÉ’TtD»¢rÚÊÙô—6¤jÄÑÃÕzËçú.•>{o©Np¸Z…¼¸Ubçi{Ž×.A1-úé܃ŸÑeÏ| ]›kæk[ÔëÜ“Ô-ɯ¥ñRvF®,ÇÙým­ؘq¿ô}ÈÏ·iÜÁ·~wÅw©óï¿FG5–oÕÏZU¤~ÃÛ(Þ4}#®öï—¤Y?þ¢-#”RæË9Ÿ6õ¼îæ--þs‹rÍEåYŠÞ•/;x2úZÝÒù=qÝ`%ªP9ÛÖêÛ…35óŠ©ò?ôœ.o¸Bøµñ®4ôîâ'8²-[q›se+F[éû3Q½Ï¾Mýp–î¹q¾úÜÝ~‡ ·†è/Ýû†TÒ'ö`ì> '¶Yg5Õ›úg—¥Â-!æÛ;øù•õ³0·aAgÅ6ß½¾˜ß´Î—¢Áƒ[*¶h»)ÃÜã}Äv>QgúX÷]2Q+Çœ É×èn #³sWUÐÆ5m›bÛÞ Û¬¦:ùéi:¤YLÉQ檶Ké>Z¸%ŒÏ̸ ðQý5ÃïÊglÈõ°wåµ ù|%Vë:ט.·A¸Ë\“u3œ6Œ§‹ãT…íPÞ2féÛ'ëÒ/ŠGzï«{ß½!ºSûh¸w±¾|a†þ¯×=ºxXª¢]ÿ¨Ü½Lž¤n:¤O¼^ùc…¶QL¸µ¯'ŸãÙÇÆÇÈãÙ½Z4KŒRæ®í:øÀ1òÆÄ”ŒFîØNÉï¶cËïóiáÛ¯«¢ÁМ]K4ãöw”xÁlÍ8¡•¼Æd6î~Mºô^Ý7f˜î‘¨wn²rµ=WŠK‰•ÇHÖÀÓOP«Sž×$éKc”8¤¹¢£¶©a¼”»-[•œô}A‡3uïUC”šÔ@§*-%NÓ”iHÅzJo/ CªhŒ^ߺ—5íš™Ê}©n¹¤·Rµzåú[ôQ¤ß"+¡…:ué¤ÓÔS¶ÑŽãÏ×—WhêY>ÙŠÕðÿ<¨ËzÆ}åj(¾i#9ëçÑ'ö1FL|ã%úòÔuÓ+Sœ,¥ý%Êø»h›S4äq%ûFT¬¢eÉg;aÌ7+¬e¯½þý­ IDATÎ6lå0M™²ä¯lð·ØšüÀ«±ä-Í~áEM?ëEÍ=çq=vfàèv ®mÛ¦H|¯Ñêúך{çL|ìB iX4ðgÚ¥²>ögf5ö×\ûŒ s}©°V!Ÿ_…e±ý²‹/'ˆ©¸ ¢ª±ŽWyÝ,~^emè„1Mì^Æu;g†>®h„yOŠº%˜úX’šÑõÿ»@_Þu¹n»â\eÝñ¸®Õ4¶ S^T˜ç ŒeáRÈŠöÈq¬ÀmÏ\Ú¾Ö Ú¾BŸŽŸ8Y1^¯lÛ‘cÛÊ+ÈÓöÛdù e;’mÛEÛ'p-€ã¨Qã4ååæW8_ÿŽ•ú3+N=÷k$¯iÊ4L5ì1\½¯iÓ?9²•"O…ÏF•ÙyÚ™ç(61F†$o»£4¥ÿóºþÝtµ™r³$›2Œ%zeoË!hïë’ÚªwŸ^jì1Ël›½M»«½÷y-[ü·òûvV¼aH…ôõYò¶ë®f1† _чKшùë—êO'M;çXÐ"Z†•¬Ž ŒÀê°àkù%ùs´³ÀQlr¬bÒºªMT¾Ö¬6Ôâ¨ý”Ô ÃPÖô‰}¡è6Gë¦+>ÓIw>¦ËVñ™®Ñ©]*í/*ˆUJ¬”³=OV¨¤$ä| +YZ·aÑM{ª½÷}ÿÅ_Êí×S‰åîô2¢’Ô~ÄD]7l¬1YÌ{E¿M˜®‰u÷tËHsëó%¾ãñºçººeê]º|zs;ïDuˆ ŒSV»xÊï£a}f/H5ö×ܪA¸ëKEµ ùü°ùµ}Í?*T’š'G>g*hƒ~5XÇ¥ðÖÍpÚÐÛ,Œv®Ö}ßL5د¿†v z_NzñoòÄ·×17?­ çêªë.’÷þ'uÕÐFŠŠj – ½ûçFå:W—.­ðo-ù%KÑ­;+ÍF{‡¨}]‘ ›“¯èh¯rrsdÈ‘#Cr%$$Êp$˱‹ŽhÛ .G–eËòû”—WPáèáÑi5<íÿôò}«Ï…ãÕ=)S¿¼ñ¾Ìo£³z7"d»ÍÎ×®|):>&0l¿‘ªQž§cæíÔAǶWŒiHŠRB¼©‚»Bßõ\q€*ç‘ä!ºðäv:ù¹kt}ܹ:º“¡•o?©g6¶Ñ”Û‡¨aHQÉj‘lhë·èë¿ÚhD‹žji<£¹OÏWòá}Ô&a‹Ögs—í:o×j-û!E‰V®vüý›>{íE}”ÝR“ÆwTBã®:ÿ„:sîպœ¢ãµT\~ºÖg¶×‘G÷T}b¥–ã®Õå‹NÖíKóJþj6QiiÝL}:Çjλ35»× êälSfó4®Kå=&ä|+\Lw·afò`]tjMšy¥.³ÏÑICÛ(1o…þÊÞ=ȬïŸÏôêb[í:¦)¾p“¾[%'1U‰ìU*Æ­m‰a*¶Í8ÝzÏqîºêÙîš5µ‡b¶~^»TÔG{…ñ™¬ûk \ªAØëKµJ õü OUÍÓ/OÞ gsûhDÏÖŠÝþæ>±Zê9MýS<òW²nT{/~Ïa¬›áì÷„µoTMeöÇœ=”•¦ƒ¯|H×oŸ¢[¯™®ÖÏÞ¯ÉZjÔáíôØS÷éæ™¹:¶Wš<›~׎*ÞÖiÛ'Ïè©öG¨_j¡þx÷iÍܪ ×RŠiÔ ö¶2>¾YgÌØ Ãþ÷ˆ.è/ÓðiíÜiš:;JS»KÇ·öÊpr´ìótÅânºí©k4|/á™k´}~ýñûOjÔ°QÉ‘ Ã0Kþµm[¶mî‡iÙ²m¿,ËRzzº ÊŒ&²[|]ôÐ-ŠºÿYýßô…Ú–ïUÃvtú—iJ™Qcv² ¤ØDoÉõ1ñ]'ê¿782ÌâÑ =ò&ÄH›3”í—Ri”+V]Î~DO&ܯæß«Ë¶:Jë¥'= GÞ|Z×ÏÛ%l#u:ð":²§´?™>±¯Šj¡£¯9_ '> ÝQ;¾òþÝP\~­Ž¿ñ=sÕÊkªáSzhL—P/b¾=ÍõmX¬:Ÿõ¨žMyTΛ©ÿ¾¼K>O¬6í¥ƒ;&)Ê0T˜ñ›>xnž–m-œX¥v?XWÝ:Yb¹'}e¢;¸µ-1$™Jê=E·Ÿ½X'?}»ž?ø^f»˜ôÑ^Bf«ÆþZ×¶§á®/å×ê¼Î!ž_ÑÂØ–ŒÆ µã½çtÛÜ\ñiÚoÈÙzxÚ‘jå5”WéºQÍu¼Dèu3¬ýž°¦‰#¦µŽúï-ZqÚºïÆÙøgªËäº{×]zä•»5m¦_f\¥u¨ž £*>“¼ÔßÍØ,}óÂz~‹¥†íúé´Wë¼Þ Eï§úµw[–åCÀ‘,K~¿¹Ç¸Ží—߲ƙýW^É¢çÌ™S8f̘*²±hÑ"M˜0A†aháÂW5gγÊÎÎQ©¯P‚~wʹNHHÐĉ§é˜cNªäµÙ¶ô\CFÑu p[`pÇôTzí»c[²S¦ÇQüÔ‡FÙg8¶%[¡ÛÜqì ÛF2ÍR§™=^Üöœ¾èY†)Ó4$úZØV”ú£aÈ,5ˆL™vjcúDýWñö$pö›J}&UÖ_Jï3ï/”í'¾#ÓS²?Qñ|+ég5Þ†•¿Ž|¤1h¿§øõvϼÌúTß¶+†LOpˆ ]ÛšµMÙÇ‹·o†é‘©ª´Ky}´¼í]9Ÿ™¥ßo•öת»=-ÿïUY_ö¨UÈõ­œ÷ Ýë—SºÎÅ_,„±nTm¯âºYîk”߆•OS•v(»ŒÕ®Ì|´{rl;pvÐû ,S©×Ì]ªkÇ_¢ß'¿¨¹gvP¬xªÞú„^¿¼{`4ö rZu·¯–í”Óo´Çú_þ6¡bsçÎÕèÑ£«œ{'Mšt¼¤=}­®q£ŸÐ'꿊û‰!O9í²O”³ÏP¶Ÿ”í;Ï·’~VãmXùËaT4R¯·/*¿¿„®mÍÚ¦œvÚc9ªÒ.ï׆ü̬tyË™ªT­ª·=-ÿïUY_Êk³pßkðskºnTm¯âºò5¦*íPy?w]1L³Âm°éñHvŽ6üºRk¾Ÿ«¯sèÀÞiòg7ÔéñTú…wu·¯¥*o>áîkÔ†ˆmÃ(ÿÃPG¬Òs×^¬×3›hài7è¢~‰œY\nµ-®·¦¿þ™®S𥒼tþü/t—o• hÂPµË öefèI@¸Ú¸(b§Žß+;˜izdšd{@ý‘ ýù—‹ôÁ‡oÉq‚‚¶#E{½?v‚ú÷R¥{•PWD$hôñÛ2x˜ ÃmÛE7·TXX¨·Þ™«´´fjݪ]$^€½*"A»  @¶miíº•%s)99EmZ·ÕOÍßïz†!9Ž¢½Ñ}èÑ:`ÿÑñÔI Ú–ßRnnŽÇ‘$¥oÝ¥Õ«·È¶í¢)9$I¦iª[·vJMMÖ;ᆭ‘#%h꤈m¿ßRÆömÊÎΑ$­^½EÏ<ýœ¼^oùÓ[~5å ÅÆµQnnŽJ8uLD‚¶Ïç×–Í[TX˜/I²mK^¯WŸ~ñaÉQî`‡t˜lÛÖŽí;äóùË<@]±SÇ3¶m+ùq¶î×g@¹«‹OÏÊÌ–å·ÊN@¡ í—SÎí²—-ÿ^–Uöˆõ¨FË0$Ëo—$ €º%2×h[–¼¦§äÿ©7ÎÑ˾‘mï>b]|ù§Ÿ¾¥V­“%©èˆ6¡ꦈíØøy<»i7KŒRæ®í:øÀ1òÆÄÈqœÀí”ün;¶ü>Ÿ¾ýº PWEf0´BŸŽŸ8Y1^¯lÛ‘cÛÊ+ÈÓöÛdù e; ÜêË Üè˶ÉqÔ¨qšòró#±HÔŠˆíÜœ|EG{•“›#CŽ’ã(!!Q†#YŽ]tDÛq9²,[–ß§¼¼•309uBd®ÑöùõÇï?©QÃF2 £èÇ,ù×¶mÙ¶%˲dY¶lÛ/˲”žž®Â‚‚H,µ""Aû”S¦hΜg•£=¯·äÌ)sä:!!A“'O‘i–3d9u@D‚öøñÇiìØcªõ\Ó4Kî« @]‘ m†<Oè ¨g8G´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA´pA¹´cccÝšÉ åÖŒºuë¦ (??_Žã¸5[\«nݺÉ0ŒˆÌßµ ššª&Mš¸5;"&R![r1hK‘]PêCÀEm\DÐÀEm\äê`hÀ¿ÏïÓO?ÿ¤í;·ïíE©ó:w쬶­ÛVø8µvµ®=¡j]SmÔ;Ë–/SÛ6m5rÿ‘ܧÇÑÒ–jÓ?›Ô¢y‹r§¡Öî Öµ'œZ×AõήÌ]jÛ¦­|~ŸÇÙÛ‹Sg™¦©Þ={ë›o¿QófÍË wÔÚÔºö„Sëš"h ^rG¶mïíŨÓlÛ–… "Ôºæ¨uí ·Ö5AÐ@½ÅQ?„YBjíj]{"\B‚6ê%Çq$.§†ÔÚÔºöDº†mÔKw8aú£Öî Öµ'œZ×Aõ’ã8²:p-«µCß¿ù¦~oq¤& i¬¨ò. gš0dÈpB¿Ø¿²Öþt}þÌ3ú¦Åɺd\kÅüËé®Óµ®c­uM´P/Õ™#¾Íúò•×ôãéøÁä©î4‘F ÿ•µ¶vjÅç_éÇ‘Çʶm9fˆ`eçiÓ¯¿èïÄîêß.¡vk\¬®Öº.âm êöV ±·ªég?¤Ûœ©§gŒWKoˆ€ç8²mGŽø½Ü%gš0dÔþuÃö.}q×4Ýýõ6ùIž5iÑBú¢“N:D=E+¬c‘EËdýrñòWë…[oןÇ=¤GÛÄ+T.wÛ^©uE|Ûôý›/jþÇ?ëuò'·P‡îCuÜi'jdÛ8™‘}õˆ ·Ö5AÐ@½´w‚¶OëÞ¯e…^9¼ª×V¬ º‡m%ËX«;M8rjÿ(«ãSæÖmòµ8Fÿ™ÚGñyÛõÏÆÕúæÝ'tåÂË:·_rèÓçƒ'¬ í8rl[Ž]»5.yù½QëòæŸû‡f]3]óÖ$©ÏØÃtú1iòìX«>x]w^ð¹¾»~†.ܰÖ._ˆ„pk]mÔK{#h;9+4ÿ­-ê:å: ÿäVÍž÷½&]?B‚S‰o›–¼ô¤žÿp¹ÖîŒVZÇ6Ò.G¦ð™¦زþnؽ í~’Ú©Wï^Jñ’ÔØ£GkÁõWéÿf<®ž_¡‘M¢døvèÇ7žÖÌ…ßkõNR;×ÄóÏИ ò”þr‘Æô럿XG¿xÏ=¯™¥»F$ÉôWò<—ç^©u™™çé·9÷ëå5i:î®;tz÷$E†$G‡?P¯N¿JÏ=ðœ†?v‘'íÒWO=¤Ù߬ѦŒù¢“Õ²ëwÖ©³_âîºTVs{›>â½øí:mÙž#Ÿ¯ÔNƒtÒùgëðýÜ«miáÖº&Ú¨—j?hÛÚ±ôu}eÖµöPçÔAzéî7ôÙ–Á:ºEÑéÎNžVÌün}ÛÑà“ÎÖÄý¼Úþë'š÷‡Wئ¶ÞR c…ävÐÌ)ø}2cÚèˆsÆê+ÞÔ+‹·iظ­{ƒ¦/ˆÓø³¦é즹ú~Þ“zøFCÍ›ªÞ1EÏ/9u¼@«*›>*0}긫ôŸC›ÊkŠk'Cùú³²ç%yÂ;•=”½QëÒr~Ók‹6+fèµ:¾kqÈ,œÛ^ãÎ8D¯_÷‘^ýáõ‘­Õßÿ¬ÍÍNÐÅS;*6w£¾{¾¾bµ²ºM'´‘¡5ÍÑ_Ë~UzóuÉ—½A_ÏŸ­Goò¨åç«w‚éNmK ³Ö5AÐ@½TëAÛ¿EŸ¼¾B #oVÏDSq}ÆëÀä´`Ñ:vÚ~Š5${çš³h›šx¯®šØN1¦¤¾©Z÷ÉOú©hy­]¡§©µk´í½pÝpÐiÞ¥Oùö6ë¦6QoêUéÊÏZ«çßøGÏ~DgŽNU´!uKÍз¼ª÷WŸ¦ž]‹Gæ.ºV;k¹^¨lúN’)¶aKuhßJц!ÃPèçõvçzî½RëR¬]ëµ!×QÓž­o”½×tl«îja| MfÈ7Ü+Çqצ¯† î¢Xc€† î(㢛4wÎ/:üê~JÈ Q»nvÑ<úhè€.Š5ú«O³­ZvÍ}º6_=»ÅEäZùpk]mÔK¶m×jÐ.Üð‘Þ^›ª1—´SŒ!9±5vtS½·è}­<þ\õL0åËX¥¿ “Õ§Oš¢KDñ/Î4µyv85tµÖ»SvÙk«G¶ø·pëJm,ðëŸGÏ×q»·mŤçÉê¢ÝƒÇ9Ž ÓWjCeÓw´åHAGP¯òyNœ+G]÷J­K/ƒmÉq$ÃQ¹ýÌ):ݺ8ì7…6 ™ ûiD·X½»f¥Ò}}ªv]ËÎÛÖAµ5Ó±¾n­k‚  €z©vhçkÕ;k³‡æ\zŠæg Û’íìÔ“Õm`’’,ùƒÜ* –ÅGCOóo Ú;u¼TÐ.Üü«6ú5éÐHQ–_–b5à‚ëuFç=|Æ4N’G;v¿ Ç‘rúg;ö5ý¼0Z çmïZ—b&·VËCË~ܱۨiJ.u‘tÞ¦úÇ1Ô´}ŠÏ¥÷½Wj]Zl?¸‰¿û‚Þ<²‹NîœPŽÂZ4ëc투©½Èt²w_oâ·Y?ü‘£¨fíÕÐ £æ>§Ì<öø7B}=ÜZ×AõRíÑv”¹â}-Íi­ ÷QçÁ÷y¶wHk½6ç=-Ý>X‡¦öÒäc[ëŠùwéV{‚Æöm®øü?µ!×Ù}”-!ô4µzí0^-"×hg®ÕŠŸ’›¿C[þ^£oß_˶¥éðégkx#L£ŸN>"M×¼uî0OÐa½Ò[¸]ÿdµÖ¨C;)ÉLPZ’”±ü+}¿±¹†´ 1½§±ºµ÷jágóõF—ÃÕÎÙ®ìÔA:¨K¨ç¹ØöJ­ËˆS÷I騟oÒüë®Òêqc4´Sš<;×jÙ‡ õåúD¼ò jè‘ü[díXòŠ^j}€º7òé¯Ïæë•iÜE=”dHFƒµsŠo³µûˆvàtÿ ÷wn­k‚  €z©Ö‚¶½SËÞY®ü65(5ªÔq2š 9@m_œ­·—lÕãš«Ýñ×ëΤ9zþWtßÛ™²<1JnÒEC[ÇÉp9òª}ÈijGQ´=«AÛ£„& e.Y ·.Ì85nÖ\mœ®[¥MbdÊ‘ãĪó)·èÖ³ôÂGóuÿ[Y²c¨í É<ª££kÿSÒW.ÒsïQß)CLŸ¬gNÕ˜gë•ûïRalõ;±£Ftn]ùóL—ÞöÞ¨u9Œø.:ã®ÔsÁ<½öÕ;zú­ò'¤ªm§Ñºè¢t@‡DE.ïH2crµüõ§ôú6K ZuÓ1×LÑÄ.ñ(ªTœ©ƒƒv©kô#ðíuM”÷õKôœ9s ÇŒ#è¥sR}ðÉÚØþòù}µòzŽmÉ–)O¹C$;²-[2=»OÃuì=C…aÈ0Ì=®a gšH3@ŠüãÏ?Ô¿OÿróA$jíØ¶ì’0ý[2d˜eOøÝ³N† ù»Ð²[’Yò·J§—#Ûvv?fš´YéçÕÜÞªuEÊ{¿{Ôß·^³/»Fõ½IœÙQ1†¢¦J/zeµslKNPû”·¾¸-œZWdÑ¢Eš4iÒñ’ò$åýäýž')Ÿ#Ú¨—ju04Ô©²·CÚý°©âQ¬‹þ"ÃP©üÒƒj…3MdÙªÂuÃn.˜aÈ,/ü”{„³l‚—Å( UN©à^ñôFÐc•·™›ïy¯ÕºBåô¿àúÿn”ý²¢ìâUR;Ã,„.¨ ʬ/î ·Ö5AÐ@½Të÷Ñ®§ ÃmÛ•NC­ÝQ§j]úïÁ"UE8µ® ‚6ê%§ä´aT—)SŽá„ø¹jÁå៓à}º¿{Èr¹ÌýÝäØhÀ‰¯ßšMö´¤-h0{ýNöŸß¯îh»u€Ùk;Ù¥œ¾ŸBÐ`öúlmø ýN¶Ž6L0ÖÉÖÑ€ Æ:Ù:Ú0ÁX'[G&ëdëhÀ$‹Þ¦zìýåƒöz½¾îà*‡²ö6ÉK7»$ûnJ7g÷ߟ’|Nr›äKsÖ×·Ýßoþå€ÿÌ6É&ÉS7¿ºyjÎÍÐF»äÈw9¤ôm’UŽÁ¼tŸÀ\¼ä´7IžsÜn×ÍvIÎß:^×Ýûî‚Uwq²w×ÀGUÑÏ9„íö6ò×ÛLJÂrÝfïr>d×sQ3rºÕ®ùyŸ\¶Ñ>²·ñ næ¥æä:Wm´ÛÝv¶—´˜—úÆk6nÏIíúz•·!ûÊ'ŠÀ»Tóq¸Ûóí’·Ï[ä¸ánæ¢ôfŸÓü<–ž0'eìü ë‰aõ‰ßVIEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_design_fields_dialog_calculated.png0000644000175000017500000006551412235000130030633 0ustar00murraycmurrayc00000000000000‰PNG  IHDRžµÉ’úsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìw|ÅûÇß³{5’z B/RTì Ø°|DAvEE¿òUA°+U¥ ØÔŸŠbÆ tÁB—!ý’»Ûß—@ʵ\ Açýzå•änwæ™ç™Ýggvv? P( …B¡P( …B¡P( …B¡8Ñ!>õ[¡P(Š’ÈP¿-~vo¼ñ†)¥ôóú¼Â–I‰Ë_ÅuWt?…B¡PÔ C† ‰Á—d$`–ù-ü%¤”ôë×Oà …B6Ÿ~ú)€_¢1£Ìo“@#‹Å¢B¡P(*Š_¢ñ–ø-Š~K@øñhš¦B¡P(*Š_’ÑÇÖ~ 8âÑu]%ʼná"3GŸà°êEâõJ,­묡2ŠÚ‡_Â)›tÌ¢ÿýx¤”jÄ£8n‡¾fâý¯²çä˜4<-p?ôîYÌÝ·Ìå¶÷°è½‰/³mÁ¦YŒ}ôS\ç<Áô‘i8ƒ”.¡ê¬‰2*â#…¢†qâí”M::¾©7¿‹ ÔˆGQýäüÈ=C'±Þ4)¹NÒÒíaæ_½?fs`ËAÞ~âdâ4(Üós^žÇ§ëö"“ÚÑoømŒèÓÝ,9^’˜¦AÖú÷y~úûü¸#G,˜’hibš¾zdÖ*¦M_I®7†>c'qϹMpj’‚Ãû(¬‹poaÁø ,Üp·´Q·õi »ýÎoîÄ,W§Äsp‹¦Ïç“_·‘aÆÓiØ1÷|LN¯GYð@{½q;7-ÚMûû^牦eÊ(ØÊ¢GÕg‚„‚Æ3h €FCyùÉÄ;±«¤öýļ—æòéº=xê¤qúF3úüTœG~âåIsønË>² %Τ4Îz+£Ïi†³ o{)EØ)t<ø’Nqâ <â1 C%EõaM±eýÄË V“ ×¡×È›(¼x Ã!$Þœßxí¡§ø`Ÿƒ–Ý:clZÍû“ž¤NÓÉ\B‰©:iâ=òÏO˜Ëw¹ÑÍÛÓ0g-M Ó÷wáîŸYŸg"›_ÉÈs𥙦ÄV'›0ðšœöZwm‰3{?ÿþ9Ï=ׂN“ú“l–®ÓÈû×îŸÀ{{ ¢š¶£c”Ab£:X10 C‚ÀÄ0¼†@”±Ûë«kJß¶ñí8¥sQ Z§oñ•Uì£ÜM¼6n"ìób©×ÛÍ|öòC¸â^âÎÆÛYóÛŽXšÐ©£Îöµ›ù¿çž¦I›§¸¤‘U–U_±໯S*é@€HAxÕŒ,>ñf³eÃÚ¢ãHÎbe©íòþø˜¥û bϹ‹ÿÞŽ±æ9nœ¸‚e¿b`×ÒÛælþŒy&Ö1{|ol«'på#?}/‹F+’‚»Èl)MHÐ ¼ÞÒ÷šÐêÓÿ‰ ´hy¿1uôƒüß®ß8àíO¢YºÎÜMïñû ¬'ÝÍÌGÎ Y“˜h¸/9&)½[é2Ì õ%ø<8Úý‡»îéL”¦aìú«´6-æÓýŽSbö½püþ*7ܳ˜o¯gÔh)%2m(ãïÊŽçGr÷çÛøiW!—4Ð1+<…¢r¨âøP<ôˆïËÓ¯ÝB§æ»Ò4Ü[J¦/9»÷Ë&0ì+á!˜’#gcv+¹­‡ÜxFí›-¼äzKŸà¢zµ˜ºD9‡ö‘ë5°¥Ìù·^žÁ{¿ì¥@JLÃDZ\x¥“^rvï§hÒ9ᥰÐ@…^ßHE¦/Ñ–Ü­T&FÖÞ|)D}B 0ðzðxJ¦ /9{}64m׌Xa`ÖkE=!Øx7ÙÆ±W,jâ›Ô‘E^–)¥lQ(ª5âQЧèÂÄã*ô­³¼^YbJà¨X:å¾+ÓˆÖ áHnûڷ­Ç…ÇÔˆJJÄÂ6lÚAŽ'±üÈÂô°-)hiYκ­o2çûNÜØ# ›³ ‹lá$÷Ó™,Z¹›” nat/ï_|ÏŽ5½DG¢Ï¾›w’뮃½¨Na‹ÁÞ¿‹,oZ©{C²Tö©‹+Pp$ƒ|Ó$Æ41Ò>ŠJJÄÆöÿ¶“œþ È›Ø'%2¡!ñ–½”¬X ­èO‰À,sÏJ¡¨~ÔˆGq|0JŽ$†é»•ø¾2±·êÇéq«Y¶þu¦ìoIj²¼ì8®xäNšY“¨#»ŸÉ“o7äÞ3Î㌄_ø|ÅDFßÝž&Æ_Jßâ)MLÃ7!¡'Ã.ú{ßÝÅ“oæKg]’£²¶:Ÿ³WòÉsÍè,÷“k:9ùÒ®Ô±ì)u?©T4ÍÒþV(j•xLJR';yô&¼ï«W󘘎t®{èfb.æ›õ[Ùp@'®i:"º3Æöä¥÷×’á¶]§׌»ÇüwùzýÖI°'4§cóX,ÒÄUœx°ÐüÒ‡™œò ÿo›vf_aIM»Ò))ÔSFrÕÖÙ|´j9K¶€f¥~»V$X€˜.¥ë¬Û™ëº‰èù°ü·M¬7£hÖTb‹kÃà[þCÎÜÿcÕ†_Ù­9Hh܆ŽÉVDlÉ2œ´è?’«¶¨/ªÃFœMÖ¢oøcÍjìêáÖJøÏÄ´µfèýcÐç¾Ã—öáNHåœ+oâæ>u0ÿ2Kmk}G0HÓP‰GQãøË,Ö… ºûöí«¢‘˜¦…Ø:±Ø49™yxKŒ€LìÄ%Dc3ó8’íF"AX±;Ø­¾‡›…ô’Ÿ“‹Ûh¶(¢¢ìèî²\Þ¢mØ­HŒ‚r Ͳf lœv+]Cß(À[G^!Ø£¢pØŠŸ“H³ü\^³|RØpFÙ±Yt4!ž<²óܘšè(V]øŽ8ÓÄŸ‹Ëc–.#_b R'ÑQv,º@˜nrr½8ãüø(ʉݢûVÒæ“WàÁ(éϬL[ 16d~&Ùe}¢PDÈÒ¥Kª^3‹Ë¿gÍžÌ@öx÷ñÝ»ïòù_¹þ·ˆŒpê® Ü[™}ûPFÎÚD¾)ËÛÌNo&«¿Ãÿm̪’xbºØ»a%?o/ãë*î7Uj[m§ô³ÒÇéE\ùø)ypÖæ¸s"Øx‚™œ±÷ÇÞÀ´-&þµ [1vÖLÓ¤jâãaË›OðÜò$®ýÝëÙ‰jØ»ÜIƒF H‰¶†—AeIIå@›„Þ&"ª«ÜŠ $×oHä(´buÙ²v³³Êâ naî„ÇøcÐT¦7‹A/)v[•õDB0Ûj;ǵŸ•ˆk³mµÇ)¢Ü±y"øöD°ñD&²Ä#¬Ôk݉d p.·Ãöú¤wíFº£H-Þ³d,{‚¡K3ÈöFS/­'WÍ€VѾ«ÏV¿?ƒ‹W²%S#¹M†ŒÉ©Ñ¥¯2 GòM²–>ÀÅ_ø¾h4ôe¦ù+co\D“ sx°Kš7HyþÚá>È‹¦òÚÒµlËÔIiÕ 2¥ŸÑS¿LÁ¿ŸÏKS¯£µC 09ðñ] {µ.ãgßCÓo&2nÞjöæXãÓmÀHîÜ$‹Ÿ3¼k“®Çƒ^fÚ•M° ðîý€1£Þ¤Åã¯r_§m9Z¤‹5SFpï†syqÆpÒì"-ÿ»öaþ6ƒ/l€U˜d,»Ÿ!/Ù¸oÆp¶»ƒ¥ÝŸbÎmpDú¬_^åÎÛøë€AB³ÎœíÍ ë•Œ­Ø¦pcZÄι£é?Ï÷E§2¥§ïh¯š~s„ó_fî7Ù¾?7Ñt»íyïWk}¥œmÝw2yx¸µ/`åëSË×w®Æ÷ÓžaîŠmìÏÈÃ-ü´©V÷³"Ì,Ö/žÉŒÅ?óûIrëž\:êFµ÷mà89¤ö2eUoÜñíŒg™÷ãöÎÅm‹£q›S¸bäuœß*]ûù^žz-­›­ónaô§í™üÒYH¡!}t¯§>F_øgY⢔¼¢¥>÷amz×_Ñ:ž=|÷æl^o¡ñ+·Ò5ÚÃ_ à¾ÅQ\4ê>F§ä²rÑTž¯ÑhƺÄê¥ÊABÜi·3ኖØ4 gb}¬.‰aEóÙ…ü¬<{û¥‹õ¯ÞËøMz_uW§Ú8üÛ2üQåEÚí±~ý ë3®¦uC+Èl6¿­í¥¤ÇX±µ?Ÿëﺘ„hƒ¿¾Ã‹‹&ñr«Y<Ô;ÁoÒ3M³ä•4ÃoËQß8hqJ–eëù#Ë$­ž†{ïj6åz9¼j;yë“ Ø¶rF³á¤Ç ¶†IÄÓ1^—NÿÃÄBþX¶EÝKá”—…&µûÉÇ1¾o V¡Õ Mª¨ßYlüö'¶'^ÉØÑH0òÐRëb e§%m!âfdû¯ÏÜÃÖÕ8Ðp0wÞÚgÎN–¿=¯D›´"›kk?p³eÑܵ —žƒGñHK­_Ìcƽã(xñ®ni÷mëï8õs2­Þ¸çòתµìmpcG·Â™ÿ7+?Zijcÿ$gê$þÓ,Š´3;`ûúÖg ¥UC+˜9lþu/Ö´4·ûÎi·ÑËÖP>2òÂì ÿl"O «/ü³©öÄS<"B`¯—J²øŒýÙ^<gg—=/\Oÿ‹6•Ó4qtaågÊ«hŒå'2!ËK/½½÷ðŸü펧k×úص¢{DAî‰Øôm§3qÙ:2Ï=ç_³Æ“ÊâÑ…‡?¿ÍŒ…Ÿ³jëA\Zz‰5» ¢UQñ–ÐŽÓšyYðý6 z6cãûiqå`¬|ÍÊ=nÚÚÖ°êH=zwMÄ*öUþjJh!|?öÆôLæÍrÈÓ›¨CéѲÊVµýFp¬ß¸CÙ™&CØÒI¥ê+ùyq¹ö”cm*µE-ígžƒ›ØVK‡p/ŽÆôìÍ7sÀÝ‹¸£Ž|œÝ¢¦â^T–“Æéí|ø×ïòt'6¦=}Ûé<¹l çGüß«øÍÝ„«ÚÅ¡‹½‘Ùx 2ê ÿdj ñCèv¬x¤Óƒ‰ƒž·=Ψ¶ŽTàLŠÇß”uPB–w¤Œ1¯椓K—óÛ£?ý«Žt§îç¿RØf8Ýëêxÿ~G[Hî#¹wT;Í]|4é–t„À¢ÇåñMy”íÙñžLS2ýãïÙšQÈWÛ8uÔéÄýò.­ÞÏyÖïø;¾;}ÛÕ0ˆ7 Ð}‹Lo…b*„s·ÊûMH;÷ú·-TÜ*@©6•¤¶ö³£e–­Bà›¸ òöxÅÝbÕC‚ÔbérAg,O}ÊŠÃ}hûýJ2ëŸM×D BFhc±*裀}áL&žR'¶¢‘µíÛ¡~¿æDi•;-†,ÏíëLÒð-·&·¥™ímÖ­ØIAǶD…<‰h$t»”ÞŽ ,ùükVtÛ“$]àÚ½†­F nºz'×· ŒX6ÆQê„P²nô8ÆÁ—Ûö/[”»É_1ßXitÆy4[´„>;ÀoQ=¸ºQ ѧÕgæ—Kù˜$y3-ìá炪”]~þ†tmåûßò±§¶"É –ÄÔðíÖíÄÚ ?Óå{&"Ì“xUô›vºØ"nUCíìgÖä4šÚÞbã/{qwHÅ!xv³rcÖÆi$Ûü÷¯r¯¸{ö²rsÖ†©$ZA ‘pÒeœûK–ýʾÑèœÓhhà‰ÌFkršÚÞ®¼þ·Ä£%ôäºõ¹ýƒ Œ×†0°K}…‡ØÝŒ¾´%®‚Ë;B—Cý88´úVîjÄ©M»2âŠfŒ^ø(šÃ¸¸{#¢ 6³37ðs"®—Çí¯ÏÂŒ=›§º&  °¥´¥‹ø`ÁbÏnOcçAvç•Ø±\ÝõésvSfÏ›ÎÓ ]ôOODÛ÷YúÆÒ [Ìåå…+I¾l(ÍlV¬§žMÃ9sxÇLaèÝM±û;xÊÚÕ¸ÌÿÍbÊÝ7ÈÛ¹†¿¸pºv³êÃù|p¨9×þ·1š¨˜Ý–d:¤ÚxïË…¼›>–ò09)'snj𫾪è7!Ëd[zJиUµ±Ÿ‰Øn Ô„›ÞüO:®áü°õ‹y,ÚÓ˜!÷w'.ÜÑ_ Æ=ãûEÌoz6’ÊwÕek6ˆñ·â¹…¯óä27°ÆÔ£]㢇ϴòu7ô0g¿È«½Èø…º=ޤ–]h› #„£b¾ÑS8¥[¦¾ÁÙg4Á.ZÊ)ôk1›éÞ¾œÓÈîÿ¹½¬]mÊÙé,ÞQ¦E—t|›'Æ`Xãi˜v2·>{ý[8‹æ×+S-Þ7ÞÆÀ§^cá¤G)t֣Ƕœ‘jÒ¦*úM¨¾À¶ô¸q §îp¨ýÌN««Ÿ`JÔLf,™ÊÇ$I©'qýĸ¼µ#üçÂj0îš=—_Þ~·šÄ7íÀß̵í¢KØj£i¿Ëéøæ³¬mùú¤Ø|£¨ˆm¬"ý ðç ëÂ… Ý}ûö zs°$Ò40¥@ÓK.ôÝø“hèG=.}÷4ýh¤4}o (žZ¹ù++‚òŠnFJq¬œ²Û#„oŸ€M—† ¢´-RšH³ähI 4Qê åê6ÍÒ¯6M;æÃð|S¼±‰Ï¬c¶KÓÀ,ëÿ²~,k—;UáÇ^? 2·[–z»E±íÕßoÂ)ßm¡â¤Ÿ†Ñ¦²¶×Æ~Vªþrñîïrþ¨®¸»·óÚ7óI÷ÉÌ݇ àq-s~å©çÀðéL]šÃsAŲòøvZ!$3‡ß>œÅŒ%?³io.z|—<ü?FµðU]^ )ƒ¹7߯gÅgš¨FA¦ŠŠ¯]‡$ˆx”g;sÆ”µ=@ûSÃ¢Ž ŠºzåV:9rØÌ?ለ×ç.ÓyÈçÛŸ¶²ÿH>nœ4èÜËNÖøué—¬Úš uZÐûò[¸ã¢4bu†xW€p3VÜŽpË ÔoÐGûÄ•KÊ‹ž™ Ü©‹E-¡r«ÚüŠ>å„Ë %„d°ý­qŒw„nW\ËCí“ +‹¸ú¶£Ký 4ÉRgaˆVE,ÈTQñ5­²RÆvÛµ¿È ÀBT%Å‚ ]9<¡«%"V¦+”lC±o áž;Ú`ÏXÏ;Óßáŵõ9kèPîMÆO ˜6ë ê¦Ï`LZHñ.‡Ÿx„ÿ‹ÀŽP"qöýF ÔGË÷¤ˆEÏì ÜùâS(Ž•^N]Nô)L±¬@BH›n`ö›ÛH¾ôiÆ_Óúػ„@•H éh áŠVE$È™øZ ñ¨.­JŸÄeΚÀí!DUNP,ÐU)ê1RÕ¬+½»µÅ!:ÒàÀ÷Œ|» ç]Ô—1¢“ƒµËÿ˪Õûñ´i†ýè>Å»bËV‘†ø_í°…]f€~S$ÒV®ú!bѳtÿ‚s!îüñ)ǃ*xŽÇדÃ}¯›¿ýJ !yüÆÖ‚:öh|LL©ìž!º"­ W)2ñ5ÿâQåmÝþpÊA„®Œƒ›Cû'¨¥ط6ê6«ƒpg’é.ŠŸ#‘& °)#¿Ì*ˆxW_xB º¥+3\;*^f™~sôbáˆÈE(zVÂÁ±c/¤À_±4…¢æ©úH#Ë*%„$½H"À®@“oã²û ªD©’âkAë‘FÐö‡]V0¡«ÝÅ;—)«¤ªPô Àb³ pK2Ò‚MÓ¾J­”xWYB ºeWÜŽÊ,ƒ õQe„=+oCxþ¨I EµQõ‰§’bYÖÄÖ4²¾Ç†U{pwhåS:ZvxMU&ZØÊJ‰¯-9±¬ïúo…,te­†Œš= AYñ.ƒRBg¡Ý*î»J—¡ÐYiB‰ú/³BB| ÅqÄoâ‘•Y j .> ‘Ѓá6àÖwå†pAûì®Ã¸šžÆ™ÍÂhªA&÷_L¿ñN>Iû/ îïBL™»Ã‹¯U¦ý+—BWaù§’qŒ”àâ]e…ÎBˆƒEPHÁ±P‘‹{UY¤6„Ú/6ïWž¹{ ›»?ȳ£Ú—ëÓ EMá7ñTü~MI¬4«”X–“¶Ã'39~&¯|2ÇßÎÅtÔçô19­EJ˜MU Èd’í2ˆk’€Å¯zg„âk! ÒþF-+€ÐUXþ©l##¨xW9áºôàâ`YBp,d‰ÈŇ%)Q9‚ï‹ÄôÕùv…" ü>‚ !²U!±¬P‚O¢„ÀY¸M•dâðçÜ~Ý,’}•‡ºÇúO"‘Н•j¯?úoÅE¤ ]…òO¨8–ÚªŒ]þç|¾*)XÊWáŠw…!æwLTã_ IDAT,;üú?D™åbXDο¿ü•QQJº(ø~DPP¡¨5 Bd«BbY| W ©r‚L¹;Ö°?é,F·‹",¡øZ©öúoÿö‡)"–ÐU¢b„óo—?Á¹p|E`ñ®cFW®¯„iGÅú_Y›"y;råÊî§PÔJ!1ÝîbÁ ‹ýÔêPBW …¢£O „†Õ~‚>õp" ]…ïR(ÿTâùGr"N©œˆ6+ŠH8A/é …Bq¢¢B¡P(j•x …BQ£¨Ä£P(ŠE%…B¡PÔ(*ñ( …¢FQ‰'Þƒ|3óI&}´‹BõŠ+…B¡¨4‘'÷Vfß>”‘³6‘oÖÒ3²ébφ•ü¼=#â2²Ø¸ü{Öì)ð+ù¬P(ŠŠyâ’ë7¤aRT™ Ö" ·0oÂcL_q„J½W+S( EøDþækCÜ7‰þeß\Ë%Þ¬P(ŠãOä‰Ç½9cnã³îO1çÆ68ä!¾žú4sÚÊþ#ù¸qÒ s?.;Yã×¥_²jk&ÔiAïËoᎋ҈Õ‡øvƳÌûq {çâ¶ÅѸÍ)\1ò:ÎosL8ËÌbýâ™ÌXü3¿$·îÉ¥£ndPû"q-ã+æ¿ÌÜo6²}n¢évÛó<~º/ãìœ;šþó|…uz`!SúÄ•N–f.¿ò*3>XÁÆÝÙHG<õµá‚ÛïeHS?Y+¤=+î …B¡ø—P©wµIÃÀ0‹DØŒ<¶®ÞÀFC¸çŽ6Ø3ÖóÎôwxqm}Î:”{G“ñÓ¦Íz‚ºé3ÓÆfäòתµìmpcG·Â™ÿ7+?Zijcÿ$gê$þÓÌÀÍ–Epׂ\zÅ#-5¶~1÷Ž£àÅg¸º¥ad±ñÛŸØžx%cGw ÁÈCK­‹E yà8Æ÷MÁ*4¢D—¡yØöÖÜ:ï ]Íë¡í_ÎËÓ¾aíA7ƒ›”mu8öDà •{ Å¿„ª}I¨”D5ëJïnmqˆŽ48ð=#ßnÂyõ¥GŒ†èä`íòÿ²jõ~ÖÄ–¤hÙlÚpO€b„i˜¾í“+aB¡P(j‡\Æ÷‹˜ßôl:$yزìuíNäâ;º¯ Dl7†jÂMoþ'×p~ ØúÅ<íiÌû»ì"K2Rm¼÷åBÞMHKy˜œ”“97=þèŠ9ß!çÄóÀ‚'y.jç6ì^ñÛLI=–úqphõ7¬ÜÕˆS›VÂ…B¡PÔŽÄ£Ùsùåíxë I|Ó\ñðÍ\Û®xõ™VW?Á”¨™ÌX2•‡I’ROâú‰7pyë«Á´zßxŸz…“¥ÐYCÚrFz„Þ¨)Žªp–õ££ÉL˜4ˆƒ¯<Æ´_cèßÃŒè‡ÊÎ0Ûi¼#¢:bX ‰ëÏ7?á ¶ÇüÊ“³ÆrRœ^}í©"JÅàìüüØ-<³:»^≰Õö(þ•Tñ™ÏÄ4%¦½f”lšÿ0ÞYɶÃ.¤®ãÎöR7ÆZ¥¦™ÒDJ‰¬ÂkÙŠ–if~Å]—]Í5·<Égûý-¶)ç  }ŒVë“P:Z"ÝÎjƒ. ùõµ¹¬Ì2N˜‘›âßE•Žx"³‹¯¿Ù‡aX8éîYüï¬$,B é'È_¤‰Ç,:QTuÙ~ü¨#еƒ¨Ö\zq3¿¶?¿\Íá‹»ùuÆOú½M/çÑqWý¼¨SœPDžxÌL–?}S¾ÏÅkJt»dÿAo™ øãõû¸óÍ]x 3ÆBÆßkxwò}qNãþÞu±Å³?":–x›†5©örg7[Þ¼›æmÁkšH©ë‡-NtÍ‚ÈÙË~—…˜Xù™lÿõ=žxÌNÓ—®¦•ß.Ï ˜¦a˜ÇF&¦‰aÁO´ÂAìhYbSkl±=)ª(aø*ÄÙ¯HS"¥Ä”2옔#¬x@‹§Ë9m`Íz²×ýÈNwgÒ­GXûã߆A‹3»SÏjåpEc(%FÈ8…Ñ^ó0ë~9ˆZœœFœ& p7_}ø\&Vì¹Þb,…ü2NAú*…lžs/cßÙ…×0‘@áöµ|ðìílÊz™g/o†Ã¨î,–O+õºt#™íìÛö#æžGƒ_³îP.ÆÁ/YuøRÒ¢máÅM¡¨&"N<Þý_±à‡< 3Žs|{N©CÎ×÷sÕÓ›0摇¿gÚÛã53ì¹§¹:;bÄ´M|ùæJnìÑ—ä£%ÆsÁ#³ÛΉM+}Uff,gúÂ-x v×Má—¥Ky8p ·Íæ“[Üäfe“{p9ÿ»{.îú™ GÓ*¾¼ýÁʳçmÐ+Ž v´to×€«ž|‰aÍí¡¡k3# _…Ê<þüèÝÁ¥Ú]‘˜#œxF£N×óh¯o`íá•|ÿ÷Òêlà«-)›sn¯zX…½Â1 ‡°Úkd±ëˆDJšÄ¢í뻟Ï€)¯p{;†GbÍý–»C”—˜¤oe,cú{»ð6:ø/ã.J%óÇ3ûw~}.«û=Do‹ÿºõŒ˜F ¬É-I‚ýÞ vçjô8Š«/cã~ôm`U£Åq'âÄã>ð{¤D:;Я[6‹†ÝYzA€{ï:¶É.æß9˜¦ïjôÀy%I%¶š†¦éø›^/ܽ†?<iíÊàþiÄÛtÑĘY¬Y4™Éo®á¤Ä4M$ydä{‘~NZÁÊ3ó"tJ(;Ž&Ðutýت)÷ž0|ea4Jû±ôî=k+“£û…ï`huºÑ/]gÝú},_±— .ã7S"›ŸÅ©õlˆbaùUº8âp’àÔË•!4 ]³`u@Á_¡Ë‹ Ò·\{׳ÍH{þsA{’œ:‰ç Íœ?ø­`ë¸éÕÐÝùaÆ@Øâˆ±F>Gò%ÖÖ½¹öî^H!Ъv) B'AÑIÐëÅàN¹é-À7P—ÞœA#DZ§Û‘:º@„y—]nßtЦa)“™ò×Íd«ɒMèwÍEtŠÚÁ{3>d«x­U°ò„f-rL>y&R†w°†²CQt¯BâõJ¤<¶$8,_…eEp¤·0¢˜„ï h œÔ/ˆõìúò3>­»¯”¤ž{ õl‚üµa8q ¯Ú‰wù…do\8åë[”XU(Šƒ4HÒ×Âtç‘ç°gQô´e EÍqâ±¥´£¡ø†?öþ¦)ù¡Ÿ¦©Vj»}!ÑHè>’GFÖe[úÅt‹­ý/-‡žLß#ÿãCô¼*í}íâß@¥§Ú5űé„3MY½ÔvûÂÃ7*ªøÍ×5Iñ2ý¶Š˜JMµIèô¡8~TlJ²æ©íö…ljÂ>‘“¦âß‚ß)ìÿàS( EmEI_+ …¢FQ‰G¡P(5ŠJ< …B¡¨Q"^N}èÐ!6mÚ„ËåªJ{ …BQËp8¤§§“œìO4¥âDœx6mÚÄÀÉÌ̬C …Bq|éwáÅüßï¡ûY¡úÝwß‘””T%‹Ï"N<.—Ë÷*µN¡P(þ˜¦yTF£,U9»¥îñœHGXõÞl^ÿé0^ PÀºç®£ï€œÛ îÿš C=ƒUe¸ÿdƨK8¯ÿ@Îí?ˆ[?Ú‡G¹·êù7õk†íá¢gëTÝ›à–õåZ‘xda&ùþ‰« &#qâÝÇwï¾Ëçå“/ÌÇl>œg¦NeÚ]½ˆ/°“V—ø‰:ÚÇqÔi‡}Çqµ:rrtìwđв.uSê’ð¸ŽøÝA\û¢¿â‚a ôŸlX7•Ù?ÏZÞo{šñŸÇ^âÕîçìx…ÞJ©þê(›p¶ù§ñoê׆†åCÖ­Uð²ÖãÙ—+ÉqW›ÌüœU—=I†·­f¿FË–öïY5ˆ”²ÜùV8iܸ u,‘/‘:#‘V‰0Ò~<,­,Ëó±D/1p=žƒ§©„æRê©f„Rظ,8¯A¿)‹¬6Ʊ—F ?~sØHHiL‚ÇE|U¼”Á_ecÎ6ÿ@þ=ýšÈ.˜üq<ûr%9þ#ÓÄ0 ¤é{Õ»R©ŠQÔït‰+‘)âLÌé<ÞÆE€W`ùRCtQp…ï)^¼€ÆnòÞÏÁÕYúÓ`8”ïgüæ{½sU™ämû‘¥+öP¨‡› Å/Œ:Otþiýºª©–¾\ýT͈dz‡½¯LgçÈÝ›× zóKèöòmÔud“ùÁt6¿³œ¬½nl;Rÿš[h}n‹2zô³åúóÙÐr }f\ATîçü|ùD2´zí5Z¶”dNºŠ•Ÿf¢õ™Ìÿ= «±×ÝÏ\HδçÙµz+®Ã¹˜Ò†­q:)ÃÆ’v^ ,eS®q„ó_fî7Ù¾?7Ñt»íyïW«÷«ßŸÁŒÅ+Ù’©‘ܦCÆŒä‚Ô"3‡ß>œÅŒ%?³io.z|—<ü?F¥G¡É,Ö/žÉŒÅ?óûIrëž\:êFµ÷í¬^ÏA~\4•×–®e[¦NJ«æ)ƒ_-ØLŒ¢%Èz^Œ®Óx5lÄàüLGß/@HÌ.n\“ò)ìä;‰ë¯Äû¤-¨kà¹.Ÿ¼;<¥÷ÿTG?àÓ+2O+Äu>ØÚ°nÔõ <7ç‘7Ò‹,îYn ë´(¢^±¡”˜]‹êì"q‘bauÞ(úèž,²Y‰ëãÄX”Iî)ëSÑD½oAÛ%HÏ ݺ7ÀáO^:Pl*ºMEêTýºvõk?µO ô…Õ×—eö/<{÷6u£ÚWÌðJP5‰Ç½‹½ïKf”Vt‹¯'›^HÖk·ñó‚˜Xb,î\ÅŽÇoÃ5—ާ&–Š‘ˆÇjÑГc|PJ¤a c£!i¾ÏŠå~ÕÍA³Ž\—š …;V³ó‰;!e>écJ¿LÑÈbã·?±=ñJÆŽî@‚‘‡–Z‹(äÏ…pßâ(.u£SrY¹h*Ï×h4c ]bM¶¿5ޱóŽÐíŠky¨}deW߆n¶,|€»äÒsð(i©±õ‹y̸w/>ÃÕ-íˆ@õâbý«÷2þC“ÞWÝÀÕ©6ÿ¶Œ¿CT°X‰û•lÜ…ä¼è@¡@ÿÆ‚ÖÂEîd/2KÇö|уÁø1o<˜½ ɹ3´¯D?CT§LrÏ—`íŸê"÷9/ò€ǃN¢¿5pßã"÷.‰ö©“¨ñ1˜=²Èï&A,OÇ;CRðXyMÖg¢‰ æwyxê„îZò¢\rn5Pß@æYÁ‹ï*ÏX[ѸÈ{‹ô è`Â_Nbî²!Gç‘ÓׄÃ:¢uéËBsx.¹C ¤ÙL‚†¿U)MÌ`ƒö@±©è6©SõëZÙ¯KÔ¾?ÕÜ—%n··'ˆên5Pu÷x¤DÊ¿°vHDËYÆÊE;0&´š>–m-¸>¸›ï_XÏÞפMmDËgŠîñ ¡‰ðá§nÝüŸDcŸ[D»6ûÙ~ãþÜ~ˆ}K·Ö©–²K¥$ºEúôh‹SB@Î f°‡67Ìâ†~õ° hŸ’ÁO£Þâ“-×Ó)u³ßÜFò¥O3þšÖÇ4P„€œŸ™óöê z–qCZáÔ§voNáè±,š¿š‹Æ÷">@½2s9ó?=@ƒ«^dÜÐæ84ÝSØþåÖ„òGÉKÇ’N‚lãÁs®©yð¶Ð±°bß,ðö”ÈnÜжíf¢/ŽÇþŽèçõÅB‚Lóà9Ó·¿¹ËFüK…# ñ$§H,Kb±~£AW²¬8§ëx'd’?Ô ¼5l§8±oÈÇÓ'ôÕ¡L21:%l/»Ètžs¼G·?kh¦Ä}–Oo Â[“»50ðv,š/þ<ߪ’pê¨j;T¿®uýºTx‚ØGfõöe×{_{ ‰†^ƒº%U¾¸@è:B· YÀøc ¹†v°eÌ…l@‘ä/ûÿ¤À-K$š†Ðôˆ_ë^²nòJ~®!œ¨Ó>vÁý÷‘ +}s ÅëØÝ‡~gg—=/\Oÿ‹6‘> fÇA…±›ØZCÇqh¥•!Ý7±­0–Ž=ûÎјž¢ycãf¸{§ù¯×søOþvÇÓµk}ìÅû†¡zÚIÇ~dc/&v´#¾¯´ÏD=mǺQCh™dÞßl#¡@C¸‹>‹21“À²¿hy·ÝÚ] Ô½§Øw€òoAØ7ôJP!Ú ;à:ÝFÔ• èƒ (¸±wçuUÒŸ…›_fØÝŸ’aJ†|žÁ½@ÊÏñêu©8ªøY·ÈêTýºÖõkBÛWý}Ù¿ÒpuS­«Ú¤×Ut‚O"yàÙD9yFÄuÆnˆÂâ›]>]ø’ÍR”¸ópç›Tn-„†^7 8^/aK™^Lô¼íqFµu”x°JàLŠÇ²Ï@"ÁL+Ó!|eH‚vP¡!0ðšÕ8¶•m9ˆ½Î —æ‘û˜ÓÐqŒŽ!èmG‘hZ‰,.-ø¦Â è9‰çéò»—¾ ” ÍJŸôâ4(X”‰çK;Ž—œÄôsà½7‡œ±EW¸?7ÄÖâJ&>sni°ÿó§x|í™ü÷ŽÞ$èGblÕð€u•Ô©úu`j²_‡²¯ûrMR­‰G¯ßhñ5Yäàmp&-¯lÕ"13vãv6Âi`«ƒÝ¸ö‘ùW²•¼^°XöDœ1@Ö2ÖÀìP¿rEp°$¦ÒÈZÈöíP¿_s¢´Ò«BdR+Yßeê=¸;´*u¥iMN£©í-6ü²w‡¢«PÏnVnÌÁÚ$d›8:r.‹5¹-Ílo³nÅN :¶%ªšß!¶Zѽ^òî)ÄÓ lç¤Ã IDATðJŒº•+S6ðbXè›ÁZ4]v´ÂÊ•«Äè[@Þ9…¸ï‹'v–ý/^«ÄŒË!Q%Ǭ°'Ó²uƒ˜µvô¨ú´jÝš$‹ÿ§¿«‚ª¨SõëÈ©t¿PüÀRXöÕP_®IªUT4ìGÚ€E¬úð ³ná«W,hšiÚHžô]{Æ!-¨×ÁÎþU.2&^ɲ—ìȨóé9ïv­itZö||˜Ü™×±l¾òó­TZBO®XŸÛ?˜Àxm»ÔÇQxˆÝÙÍè{A[âz0üÂÜúΣ<Â.hŸ‚ÝuWÓÓ8³E7†jÂMoþ'×p~ ØúÅ<íiÌû»ä ±]qE3F/|”Ía\ܽћٙ[þy‡ª@6ñbàÄ1ż܋£¡gW²Ð$®&q3b‰Ñ\žn ó5ôLƒÂa^ß³ÕÁNޝÀH7‘n Ëf1¦¯>›·ƒÄñ–ÇIRC4qSØ£˳EÉ“¶ðý_ݯ’ªdª_W‚Êôk‹‰Y´¯mX7p‡²¯ºû²g 3FßÁ§­ã{;Gî“ â7ñ˜f½A@Ä‘8öNj:¿>ü™¬†ŽµaQºo…Г¨ß#äNžÆß«wàÎvc«¯axMÝ›'Ó^{­Ë#ÿHØb°§4£N—$jæ^˜“v#¦09a&¯~¶€‰dc8hyòNí×–8ÝIÛá“™?“W>™Çãoçb:êsú˜ÎœÖ¢>­®~‚)Q3™±d*’$¥žÄõoàòÖŽöÛIü$ÏÇÍfÖâ…L\œ…Çâ >©§5®ú{ßm ȬýŒ“˜·|†Éxo«Êœ$Þ‡³ÉNŽ"êÿÛ»ïø¨ª„ã¿sgÒ -„Jè@i‚¸âº6,`yí »6d‘µ®«¬ºbau]uuÁ¶,X°ò®+®¾«®»"bo ½×´ÉÜûþ13É$L’!™œ$äùúrçÞ9sæžû̹çÜ™çÓhö˜4—àIù£Î‚Çlò“|Jhú)¡éµ{-$˜FhvÔÔ½MJ'ub&&Ý%p] E‡kÙ óÓé¬Ì?ÓX¤­Ícj¿®¹Zì×~—¢)…$_™BúSÅ|u¾/ Ùµ'HFÇ5:#TS±)iÖ¬YÅ£FªòÔ‚ 8çœsؾ};àáÃakr@dBAôÖ°ôð\·¬¯h ÆqJ—ázzaSzN9öcÇø» õ–³æ*×u+Ýáy¡)Ý‘bãàDݯüòPù#‹½ðó÷ÂÏÍ1åŸûþÿŒm;¶ÕwQ½Þ={“Û97aÛSðˆÈié²¥ävÉ刑Ghn-xžÇ¢%‹X·~9r²MˆvîÚIn—\%]ä^ Žãpð€ƒYøñB:´ïWðˆÈËó<\×­ïb4j®ë‚×€. ièÔÛI€W¡‚GDXžç)x Ñu¨à‘–‚'1¼wy<"rÀò<×ÓOm ÆKì¬@ˆ°ˆ[Àº¯¾`m³~ 隯>Ê 1‘øX žàFæ^s.w‰Ý¿êÉ•OßʼnÙ~ö»ïP¸œg§ÞÁ÷§?Èô.é8–/I2ñˆˆÄËZð˜Vö›[ÈÙ]Xõúý<þm~ýÛ“è”l0¾Lº5wÀ«Áh‰çá¹.žz.¶ûožz<""ñ²wªÍO›žÈ ´'êvô8ˆ¾©¡.Š)ÙÎÒ—ÿÆo,fùÙ½Æ9—]ÈñÝ3ðQȪ·Ÿâ¡Þçë-Ex)ÙŒ+¿?¾Éáò¯~æ N}6´­“gr×á™Vz?.®ÆxDDâU¿c<¡þ‚ÁPÄ÷/Ná¦yiŒ¹øZÆ·ËgñKò×[ 93&ÐoçLûë¿H;íR¦ kçFötnŸ²^Nöèë¸áØv$CZû4 VžšA=‘xÕOð”‹<¾·gÏÎYOïñå¢ã²I2—½•'½Ê[ËE¯¤ÍìtÓé;hCú5Ã!Œ f å©­:Ò½['’Œ /²ó¼Œ«1‘¸¹®[ÁãyáàðlþŽŸŠJX?ý2NŸ>mþ8Ÿ”ÍøGžÈ™ÿ÷\Ί#NäÔSN`dÏø ¥ãB&zûŸ’GâÃ[Á#"¬zëñxåß –$•¡“næÂÞiåÆfR²2ñ%·â”›§3dé»Ì{}.¾n.óϽÛÎêAºç…Îvyn½M.PðˆˆÄÉó<<×þ¡:òÓsC7_ËnäøŠX½Ò#ûèN¤;¦Ü´jÏõÀI§ÓÑLt$‡?v-SæÿƒF_Æ2ÍR `{%A¿åùÔ®q1û? ¼J 9`5”i1˜q'¶eòü?q§s&ÇÔ–Ôâm¬ßÝ™£ŽíEÚ¶OøÇR—N]Z“ØÄg«÷⦷"Ý|YäuKæ÷f3§Ï tõ¶±'{¿èÓŸ… 2¡i ݦ‚GDXõ?¹ 2 •ÞçßÎÔ3yöÙÜ?7nj r‡Çð£zâÛöÿyåM¾ÚZ„G Y=eü5'Ó% <ÓœC.šÀ¨¿<Ï+÷ßEqjŸÕ“Ã{gâXz6 ‘8ÕOð¤ÐûÒ‡yåRpÊ.õµ ÿ©—3í”HŒ1¡ûô<›ÛgœYÚS2Æ`ŒS:e:©ÝÏøõcBd=ÇÁ±4É .F•<"rÀª·ëxŒ õFö™ š ý¥j‘òãPþ»ÖÊK(ŒLÌeuÉEc<""q; >$´0Æ$ô›\<"rÀÒ×"Ôžƒƒg<%„mSÁ#"4õxj'ò!¡‰œ–®à‘Väô§L¨ýþÄÅ…‚GDHÍ3›³eÛ²ZeÕwQ½+WÐ)§S¹Iµ¡à‘Òàƒùì‹ÏX¾by˜M‘çyôêÑ‹œ9 Û¦‚GDHÉIÉ 4´¾‹q@Htp+xD䀥žNÃdãDDDJ)xDDÄ*ˆˆX¥à«<""b•‚GDD¬RðÄ+¸O^{Šç>ÚJIÅOßpwðÙ¼™<ýÞzŠõÉ’%›yï±iÜ=ÿ'Š´OÉÆnð¯à©«Îcüã_“oý{Ðk©dÿ~õUÞþaÁ}–íà“¹¯ð÷/wÔgB•ãå¯à¸–±gŒáØ“Æð˧W°gÕ«\3î×üyé.‚5©.·€õ_,âã•1^‹…»“/?øO×âÖvŸj õ%JÍ. nàõ«'ððr—Ø8Þ“«gÞËèlù¯2©d·Ï!§M:N#¼°ËÛçK¢¸®µ/fj<,éNø  gO¼…¡mSHÏéHŠ·š;Ð.#©fï|Š–3sêí|wú Émfå{çëEUûÛþh*õ%FÍ‚ÇÉâð+¦Òiw PÌÊ×îå‘o0éÚ“éœb0¾Lº7÷íûuI9Œž|7'G;ÿ/¸Ïo$óð+wôA¤;€1Žäwwÿ<Æ7.ÆÏSÐïÕ—4$5 “DÛ^“ @!i¤ÀÊöä B^ªàv>w7¿÷%+7 †\ùî8ªç~s%o ½‡§݇TÇ€»‡oß|‚Gç,ä˵»ðR[жcN¼êzÆõHÅxÕ,/ÙÎÒ×åѹ‹X¾Ã!»ÏHÆMω=2ð¹ÛYøìtfV,ÇñíIªj=oæ¿/ÌàÉËøq‡v=sa‡Wå;ô‹Ÿà·ÿÈ›‚´ÌÈ ü†_šM²ÙËâ»/æ†oOdúŒ è™j0³â™Ë™øþÜsßÏøç”ûøvèMÜišU–ÊÁÍükÆŸ™¹ðG6nÛK±É mïáœ;i"£{fà3ÖÌ»ƒžYÊúü IÍ;1dôx®;”6~S¶þG+ظ=ŸbÒè0ðxÎ8ÌaÉ‚wùdÅhÕg^Î5§ô&3òÖ8PM]U&XÀö|— nàÔ†îØñ¼é<ü‹%\ýëè<õin:¨EÏÍØ÷5Õ’µo?ÎýÏÿ‹¯¶á¥´å° äærHo~õ̉œôLh»ß0‹{G6¯ü Mc«»}TS>¯• X_"u¨æŸÕf"ßÂmJßµšÈßÝ]|õþG¬Ì:›«' ep/NÖøÍZ¼` KøB€_¾+žÙÌA§ŸÏ µÅÙøÓ~e›‹ÛÃÇÊ*—~˜u“ç¦sÊ¥“™Øn‹^˜ÁS:>:‰A);ù2f9Šø¾ªõšóÅ×3å —çNàüÉlýêžÿÒ«¨’’‚>g㲊øîY¼pûõÝ;‰yéôþÅ’ÿµ˜Ï·GÏœ$pwóÍ’õ$õ¾˜®©PR\Lq šoJ îeÅÒ/Ø”3–ß^Ñ‹´Ý«ù`ö3<8ÅO§¿]Áà -ûŸÀ%מJËŒ ›–¼ÂC/ÜÍôžó‡-ñEÖï8Žë®éCʶÏyå‘WxhY{Ž:ï<®›Á¶žçáÇï¤uÞ£L꓊S]]eÆèÙFó ùW1õ¬î$;iYíI*ðƒ¡±‹à®˜¯‘·öu¦>ø.é§_ÆÔáíñïÜĞέHŠz°ì172eT;’ŒCz‡Œª¢±îÊ©º|îš¹‰­/‘:TwêydtÆÈa}I3„©¸üžîí^ÊÌ—WÐrô=ÜzQ̓»u/>ò^hùž%Õ,_ÊSsÖÑgÂãL8¾-Iú·ÛÆG—¾Ì›Ë/a`ž³ì^Xåzu]̳ÿØD‡sâÆóº†zfCÛ±òÝOù´Š§œuø8.8¹/iŽáðá½p'^Íë/.cÜ-#h‘w 'OãÝeÛ9¥C[üù+X¸Ê¡÷è^4kÑšëŸ|_uGÏ#=w‡ëKªÆœM,¾ößükåõK£Y÷C9²{ø¾}²Xóþå,X¶‘À¡-ð•®?˜Cú’j¢Ã¦?»3Ç2ŠaÍÌÁ©,ûà6>Yº‘@Ÿ\’wZuL¯öt™¿egzôìAª }hcIA¹'ó5*þj;Ý úÁ!2Ce/}³’Úº3=zt&ÙÄùa°îÊ8U–Ï쮃ú©#uüéÔ¡¿²<°åk–d0èð®d8¡óýÑ÷ lþ¦šåß±º°„u^ÂI…ÿèy¸®KêæܼØå(Þòm•ëš}Ïšâ Üž”ðãÏx„q0Æ„n)ž—Á‹ß|Ï–ÀZ4ëϨ~>¦½ó)ÛŽ;Žk>á«âΜۯ9>c0Æ·_õJøù¤´ëA¶y‹»J€›ÍæÑYoóÉŠÍ8éø ]’vV˜ÍY?™Ö¹­0Å;ØQÚžIÍ¢sKøz[>®ç¨¦®\Ò㘠PVÞªîý¥ô<™sý›GnšÀ¿8™3NÍ‘½ZâÚDi]ï×1´±Õ]DÕå˨³úI¼úýZ7H¾ÊZŸ[RÍò.© ¿ò.í›u`3¤µißìªt»U­çÛè`RRË)ßnÐ|8Œ“É â¿ç,Ü:’¾.bGû£œåßÓ-û2¾’ð<kærËí³Øsäx®¿´YîOÌ¿û>>¨b}²CqÙ”]ÏO²Ü`xFU5u寫ƒXrWΘú$Ã/àÕW^aÚÕ¯0çü{¸ûÜž¤ê¸Öv´¼1Õ]`ͼªËg¡¾D¥^ƒ')«;íœ]|ýÅe²Ïò´s^«t¹?«'“ŠX¹Úß•t§ü©Šc·lV*×ó¼¾ä&Ïæ³…«)<¨/é5x‹è¬àïòIéÑ“6I-9ƒc2ÿÀ¼w–°á?[èxÌä¤$îÈ]´v+‚ݸìüÑÖÞ fòesª­¶|6ëK¤6ê5xL‹¡Œ;¦7wwÍÝIÀŸJ‹6ý8¢kûŒÆø2è6(¬ÿÎæÎ)…“ZÓû0®¸ÿBNê–u?™.ÇŸÉA/Ýϲîç0²]2ððpK‚kt™äÜÓ™rŘõÓÞ)Æ’šµ¥_§Ú\4X]]ժȕ*Ùþ=ï¿8‡Ï·áy©´é=’ßL>ƒî)cZ2â×W2æž'™u÷­¥µeظ¾Ù­]Ašwn‰?ßÕ7¸ºóµå¨KÎäýûæóØ#vÙÿpó[øK%å³]_"µkoKš5kVñ¨Q£âžùâ¹A\ÏàøœðC¨ûÎÒŠýwÏuKÏ“~|–K®xŸÿåa.핊câXO·qpSE9Â[éz±—cLè>1ª%ºŒ‘û:1&$x»—pÏ„;ØtÑ#Üu\vxºk¨œPþñc[ÆŸMï4ãî®zy½~?”¬ãï÷]Ç «ý´é<×ßv}Sù+áîú/Ó®|ˆo‚Qï´K¥pøŸåÖ!ö.Tl6äZžÔÅŸÒðë¶!Ô]cª/9°$äT[mTVÕ(xvîÚIn—\%<Ï«u!š*Çq8xÀÁ,üx!ÚwPÃh"Ô~#žö£ºNŒD«j<J@×ukõàMëºà¡Ài‚Ô~j/Þö£º®½D«j<€ÞA$‚ª°ÉRûI€8«Pu ¬ÂZõxôbÖžê°iRûIŒxêPu‰¬CO=óÔåi’Ô~#žö£ºNŒD«j7Æã5¢ó¦%›yÿÉ'Y˜3Ž+Gw&¥ « Ækë]û©:j{ñ¶Ÿ&U×u$ÑǪ¦Óã îàË÷?äÓ#þ×uñœrÀoDU(‰ÓèÚOmÔeÛ‹£ ›T]×¥&5ÆãnåÍß]ÊCþ«™5íZúÊvÚÝÿ¹™s§íeâã÷0¦½Ÿ*wçpyÝðφ°ŒDU'í'°•%sžáÅw?ç»ÕÛ(ô¥Ó®×`Ž>û"ÎÞ}½×ª£¶oûiÁØÂâ¹Ï1ûÝÏùvÕVJšçнßNÿÕY‘›ú™˜Çº?ý}×<¼œÁWßà G·£>Þ3'úXÕðƒÇópƒA‚&²ãF/  ºÝ8ʵ¸¡‡§O•èöã|Ïs¿¿‘~H¥Ï±ÇóËӺК¬üê+¶…ø {´ý-\Ô¯ l{ñ¶Ÿú/ÿ[fN¾‰—Vd2ð¤ã¹à´¶ø¶¯dÉÛ¯3mÒû|ró=\9¼þ}ŽuÖ¿ó®›þ5}&Nãê_dc¨ŸcW¢U"x¿ì³Ó†~÷J—ØÎ§sþÆo,fùÙ½ƹ—]Ȩîø*n§d+ÿ~ìAž_¸‚u[÷HjNǾ‡rúÅ¿dTfø,¼«pq5ÆÓD%´ýx…|û¼ðCkFO½‹ñ›“¾ÞâçÇœ„g¬™w7?÷)ò]ü™<ú"®V5ŠàñÜâbŠ¢¡¨Ä*K!?¼8…›æ¥1æâkß.ŸÅ/=ÊC·:̘ÀÁ)áíDºûÁ=,_ü9ÚŸÉz’š¿†Åÿ;›‡~»œÝþ‘3sSª>u—¡ýOš „¶Ÿ½_óÚ?Ö’tÈõœ3 ,t0&ü.ÙТßq\põhZe¸lZ:‡‡_ü3ô˜Îäá-ð÷òãÒ¯ØÜá,®œÔ“´=?ñŸÙÏ3ýV¹Œƒ3‚¬š=…ëžÛΠ3Îgr¿,ع“̶I@!ßïOÛKÔ>gû©×àÙû5¯-Ø@ʈßsFßHèœÔnŒ¾ð^¿ñ^]r>C~~:^!kÜÏ3>§Ç¥ä†Ñ]ê5tÂÅmz=Ͼù+ž=½Â2— Ûðpw/ãÙ9ëé=þ¯\t\6Iò²·òñ¤Wykù¯Ð72«%²ó»xžGZ—A6¼©f(‡üV^œõ'\?˜fu|2Õ¸ãiªÙ~‚;W±*ߣ]ÿN4s*;@Ò»ÂÈ®¡õïÝš5ü–w–m øLRKÛÃ@F íCªÂÀö›X:ù#þµ²þ]¾dæìisê]üþ¼¤EÚ†1x»—ìgÛKÈÓŽ»ýÔgðw®æ§|v:‘#+T!Å›¿ã§¢ÖO¿ŒÓg˜Òu]×%esÁ>áM•¾ëŠœó6¡Æàdôàð¼TÞ\ñ›ƒÈH®ã§F=¾“z•Èöã¹ÁÐ.ì˜*ÆrJؼèužxù–þ¸•B' _¡‹WÁJÚCrÛîd™²iW Å›¾aUa3úí@JtªFm/!O;îöcíXCékãóµñ§¯Ê…cë<†$/eÑkòBßßsÁÖõ71$,ÑǪÆÑãÈèHŸ¼¼r³ÚöîÈĘüÐ}JJ’ÊÐI7saï´r3?R²2ñ±=²Áòe/×<|~'4iÁ­ûA<OÓ•ÈöãdæÐ>Éðù·ë(¶Ãc€²dí|î˜ö2{¸€k.ìC+o-ÿøó_ùe³ÍÂ+kN2I¸”¸.^°Î¥òP/¸¿m/!O;îöSŸ=§yg:¦–~½†ü“ÚÒ¼ÂkS°îKÖ{†vÝZâ‹\¢Ùöp.ÿÃ8>yø¦O½‰=×ÝÎe‡µ!©çakc:uÙc„Þ5E•!üÏõðµêFޝˆÕ+=²îDºcÊÑxÅ^¨Ñ”¸xnhÒóΑßXòí^üí»ÑÊñ¨ëkÎ\ãbê~$I „¶Ÿ´ËÜ“û0®wFékã¯aÁÌwÙž>œ ·Àñv†W2˜”Îwå4K›Âݺ¤›ngüà–õÖóIô±ªqôx*馗½Ió0Í3îĶLžÿ'îtÎäøƒÚ’Z¼õ»;sÔ±½Èt2h› [—}Èâ58´}hzàö^á…Î?§_ë?¾7›WÖ·fôåýÉ´p^5<ì[§! SbÛO:½”£–ÞˬɓùáäcÖ+‡–Î6þøësNæün=iÇkÌéM2ŽìKNêÖæC¹3^ô¿+¼Ñk>ˆq'µcòëw1Í=“có²I)ÜNA§Ã™»Ÿm¯s¾<ëxÛOýN§N£ßØË9åó[™}ãu,=нÚâÛ±’¥ÿ|ƒ¯nÆ¿»a­|ûëð·fÄ%7ñ›72ýžûh÷œÒŤ§}¬jÁú%FðD •ÞçßÎÔ3yöÙÜ?7nj r‡Çð£zÒ,)‹‘¿<…§/àé7eÐix€“’ϲ×ãõ-AZtÊã´É—pnŸt+óå½ðÒô$ºý8-‡ò›û§1àÅ—ysÑ<òÆ.‚$Ñ"§7ÃÇ”`:Ạ[yø•—¹ï½b’2ÚЧCFhÂRéeÑÁ}ú-•^çÝÆíÍgòÌÛ/rx©íøÙ%ýÑ¥íþµ½Kz—MN¨…xÛO}_ÇcÒûpá]0`ÞK¼öáßùÛü”dd“Ûë8.¿üL~Þ½þH½‡J\v¬KjÏQ“®âûëîâ©¿Ìcô=gે+H}¬Šõ ’fÍšU>Ø•Ûå¢öwã„{?Qí%ÔÀʇU¹öUÕ²ÊÛ^"ÄÛ~ê»ÇSfßú)ì¢Òc‰ñÚØ”ècU㞺sV›}Æ};bÔèÛOOûQ]'F"UMçk*òw✞ælœðg#Ùæàà¯Aœ»}ûiâm?ªëÚ‹U×k6¬dóÖ ´iݎκ{ä&¶¦ýÕ×õÜ}õ¼WoS=¥^5úöSÏö§ý¨®k'V]oÞº‘`0Èæ­éÔ¾ë~×ê“ @/h­˜P=úýµÊi„Ô~ Îö£ºN€uݦuÛp§í~OȪѯyfs¶lÛBV«¬š¬.QV¬\A§œNšÑÖ„¨ý$NuíGu8+V®`Øa¥uݹCרžÎþ¿j<ƒæ³/>cùŠå:`Ö‚çyôêÑ‹œ9õ]±Hí'1âi?ªëÄð<>}z°ìëKÇtÖlXewŒ'9)™¡ƒ†ÖdU©@¡éQûIœêÚê:q>ýêãrc:õ2Æ£¦HÍ©ýØ£ºNŒŠc:ÖÇxDD¤i©8¦c}ŒGDDl¯Ó©8¦S›1§ÎJ-""VôŽçUÿïý¡à‘}´iÝÇqÊéTõïýóT›ãDDš¶êÆt4Æ#"" Vñ“Ì«ûwü* ž·ß~»f[‘&)ü±D $| nøVú¶±òʤ©@ZÔÏÈï©áåIuùDD¤Ñ E@aøV¾Fý,ª¬ÇãJ¨ ¡Ô >Ê‚Ê ÿ]DD$¢„PðÅ”õ~"=bŸj‹t‡Üð ¾ðÊÑ¡¬d]iº"•bBá}Ú­ôt[eáéí‰:‘@‰ˆdFäéõDòÄ…øz<±B'€®‘ò"¹¹Õ¨Ç:Ñc> )/2ƒ-’Ñ?÷«ÇùÝGùÐÑU¦""-’Ñý³ÊGùy׆²PôMDD$«psÙ7O* çO‘h^u?ÿ [ZÎCeŽ@IEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_data_details.png0000644000175000017500000113056112235000130024746 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÐ ëŸÞsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝw|ÕÚÀñߙٖPB A@šb½vŠŠ »( "ïõÚ°]Å.Š]•"E±`¿6lH‘ŽtB路Ý9l6 †¢>_>ù„Ý=sæ9'É<{Μ!„B!„B!„B!„B!„B!„B!„B!„8~¨jž¯î»B!„Bñw «ûîò&õÑGÓm¿ßßïGk…ßoaš ñ!„BQ,Ë>ÖUBˆ¿-Û¶±, §ÓÄ4‡‰Ãá oß+£ $¸°+|×Áh¼^/–ecÛŠÖ­[Ó¢E """PJž…B!„B=›6mbîܹœqÆ5–“³uëV6lØ€mû±m à!0Û€Uá»MU#Ð>ŸpЧO¢££Ë^ÐZF›…B!„B]J),˪±ÚápššJ½zõøõ×_ñz½f¹ïªä»TÐh0hݺõAɳB!„Bq,(¥ðù|5>+ÚápœœLFÆŒ@ûðq`í¯²iÝAG ý~‹æÍ›Ëˆ³B!„BˆcN)…ßï?"—×­[—7B`ÚGåäÙ.y|Úét‰mËB!„B!Ž­#5]Z¶Ëå‚@mR9y6 L麈˜2 CFŸ…B!„BŽä4PzÇ)'Ï_ ]Õ5Эµ$ÑBñWbe±òçŸXœ‘Kƒs.ãôúNT°çŽu=EÍ“vþë‘6BˆCRš@až’ï¥É³¿äË $±: Èôm!„ø«)ÚÀ{/½Í¼â.èÒ—Ó“4:ØsǨz:%“Åì=M¹ê»¸(Å- CM9ŽÚùϲ‹³Ù¹m?Ž©ÔõÔ\9Rå¶¿Q› !ÄÑ`FȺd¹R[ÕóUpspòì#<—&ÐÁG µܲJîû,„‡Ç¿ ³¦Lç³ùëØžãÓHr³.ôºvg§D`¡ýjmf ƒ’yîàÊîâ‹çž`Êâì/ üa2#bIJëÀ=¯àÒnõq×ÀŸ+ë~Y™Ižµ€Ÿ7qqŠûÏZ“|›xgؼ·Ã’È4㎷Ÿàœó¸Mú«mç?S¶w/‹fOåƒ9+ذe¹–ƒèúÍèØ£×]Ñ…zΚ‰ŠÎšÃ}7¼Èr«^~‘«;ërCîÓ»‡…ŸLáƒ9+X¿y8ˆ®Û„¶ÝΡßg‘nÙ6Bˆ¿¥T•I°a´iÓÃ0X¿~=999ÄÆÆ’––†mÛ,_¾˲ªÛ“@âì pÝóAÉ3äžÏBqØ ×2ñþGùh›…Uò»´0k'küƶ«¯Á@sD~ÅT¨BSñRœÒç*¼Ï.d÷†-ìË·°µ“¢(/“ÍK¿ãe¿³eÄ ÜÙ9óOæHfÒ9 ¿ÕÇÜÜTÎ=¹6åÇgGk´Æ¶,,+HáÆãp``s–eaš&iii¬[·€´´´²Ä»¦ «2¶m»l¸[!DøŠ·þÈ÷;,,Ïæ¶Îµ°sv°fm6šF`h/þâÍ|òÚ8¾\šÁÖ¬Bl<ÔIïÌÙ§$ñÃ,ÌÈ‘J‡^7r[ï–Ę t>K'<Á‹ß­cwžîX’[œÆ•7^É©Éÿ¨[ËB9I׺,1J¿u /_XÓ·Ïþ{;/-Ébîw›ñvŽÃõwßø «ì$ú~Žþ)6+_ˆïsquy€ñwµ'Ú°ØÿûGŒ™ô 6çàSj5=•!÷ÝH7ÏZÞ{c:ó¼±ä¶>‘[Sw2ûµq|±|3;3óñj'± šÑã²›¸ö´ÆD–þ ²rXùÅDÆÏšÇªÝ>b´äÌ˯çªSSJ¶ñW½ÏȬò5ÇÁ£Éå’À†W½ÊRp•m 0L/ë&ßÅmÓ6b'œÏ“£o MD&ß>y/-*"ñÂGyáú6L ÑFÞÃhwïf>yå ¾X±‰í™…X*’ÄÔVœÖ÷j®ìÞˆ*5ji;‡Œ&oå»<þÜçìl܇ÿéKz”Q!&9ÌëfoñcéDN½a(WÚŒ•ÇÎŒ•¬SHvh¯mç²ú‹w˜ðÙ<þØ^LT£æô¸èZ®9³)Qãxm_†hïýuï ¹”) H¹Ž±Ïô¤£ tÿÐ…lšó.>ù•å÷Sä®EËóþ̓ÙU—ë Ñg+ö‘p” ø×-ƒ¹¢{:I^önúƒ¥ûšÐ.ÞDeVÑfáÆñPúBüÅ)¥BŽ@ûý~¾øâ zöì‰iš4kÖ¬ì5Û¶ùüóÏILLÄá¨2ý {¹Ê YF …âð˜žX"4@k—üÁ¶fT=ZžØœ8íDzÿ>ÿòûòðÙ&ÊÊgך˜:ác~Ù°¯m‘·g?Mx’×—äFË”‰‘»ƒ]¢¢=¨‚L6-þ„gŸþ„ÍÞ?ó;»Ü{•²ŠÈÙ·‹}y~4“‡Û4‰¶mc[Ã寡maY–râv謹¼ðôt~ÉȤ("ÄxEö®Bb¢Ý*ð·EÛeš8ì},úå2öäPh™8ì"2·,gö‹2aUAÉaë¦=Ƚo}Çʸ#l²¶.eÆ ñÚÂl,MÈ}ªjêSU”abh?>Ÿ¯äËKq$÷Jÿ½ç3^š¹¿¾Å¸ß ðÕíÃÝ×´'Áí ÝF‡Óîþ},ž»ŠM{óðj‡?—ëçóþ¨;yä«TÝôÕÅÎÇîysX¾/—]‹~dinå“;sïÿ­¡ñÀ‡¹÷².4­CLBéÎ䂵P~ ­ Y3yw½ù?–nÉÆk‘¹i³_¹›>ÙBqéqTÛÞ8bb‰‹§nb,‘nªÚþïeã‡1ìÅÙÌ[¿‡|Kcì%ÓC¤iTY.‡ÔGªW>fM®};/êD“:Q¸"â©ß¢çÒ‡ß|ºö¡ÄñPúBüÅ•&Ð¥ ]Wü2M€Ù³g£µÆét–%˳gÏÀ4Í*ß(¹oÈ)Ü’D !Ä¡3œÍMÎá‘O7³~æ³ žAJç³éÓ÷Îj[’xB`¢p<>;Žaõærß £Yì³ivûÛ¼x¶ï›¹,üi+¾Ž-pi7­aæmÞ¼\òvÏáñ»&²vË|Vå_Iªë T¸ä÷xðçRîñú×n¤çëªdTÚF×éÉ®Híü•/¬4®P73ƒí^ð¨gé›ìBû-L·oÿA)*ºB îHßÃ{wÜÆ„MûøyÎ6µJCïû…7glŲ1ð…çØÜÉŽÙ÷sÓ˜?øîÃEÜtÒéD„Øgþ¶õ)ò\ÿr¶NJ¯©²§Zç?Θ›áNåâa˜ûï)¬}ÿaîv’c5¤ß]h¥ñ;«m£Co÷rïyfw´ð²hÜ1kË&Ogí·Ñ*H;[aÄ®Ñ×Ò?û'ö6>sz0¬büå òî^Ív­ÑÔ¦ÓI pÙ>¼~»Ü~‰ ½ïÞüd;–å¦ý pßEidòCƯfÍ´wYqΜHõím–õ±ô{ò®Nq‚20ñSl…îÿs~æÍéð[­®Åc—5'F’¯#‰ÌY_RãÊ忆ê³ûHĬ:ÖÃa{ñù5Øl[—A¦Ï ºq:©fmvˆq · !Ä_]¨h€ºuë–½^~=¯ÄÄÄjß{(BNá.Íä…BKÇžaü)?óùç_ñåkÈøí^ž÷¿Ýö ÷œYWùÍ "S8! oo¡…6biÖ<6e“·'ÛTàÍbÉû/ñÒGKÙ§)ÖhòÙW 1j`M.ۀƵLüù{Ù²;ö|ÆÈç›òâΠnïwÖëD—z3sÇFÞz=ßž|>—\Þ‡)‘!NS†Vñ´l›³ÉÚžß4`ç 6YÍ&ÿ»?S m,[Ãî dÚgbŸæaÖíÀí*ýè¤Vl.ü6î”^ ø·MZÇ~Ÿ¦Ñ•ÿ᪖‘ؾbl;;ì6 »Ý+ÆIGÐêüóH™=‘¹ëY­h]ù¼aÄ.®núÝÞ ‡Ë©}ø*&Z¦»äDÁÄa‚UÅÉGñÎå}¹OäŠ Ú`ú‰îqÍǯaUÑVdBÇ„êÛûÀY‡B™¶ß‡¥K RMl}YKYçÓhW\Øœüø,'Å—%ý•Ëu„ÝG øý‰A<ú»·lT×uÒ}L¸§Ñ凪Ë>Ì0P ìÒ‹×3eäH~Ê·i}מj_3q «ù%ƒBüµ•®J||<-Z´¨t»«nݺ±jÕ*²²²j¤.2-„G‚r’Ðât®jyW ÙÈgÏÞϘE9ü6ý[vžz%Éǵ”‡8(ÚÒ€Âd£- 4,ÏÓ.!W7â¼k.â„ÈM|[ž}Œþõ+×åàÇŠˆ¸’c.ùÃgû‹ ¬—™@× O§‘K•]“jĵ¥–ÓÄP!öÙ$ÄkM=!®ÍRp–<£ ey£ðv[6ì.‹÷ž5ëÙ_ؘÚJS¸ìÛ(Œv¯ô[£nL ¿VAÚ9œØ)¿ÆÆïõìÆ ÎÚM¨ƒb»Yðû.®I®‹ rjPþ|A)ŸßÂ.Û›Fk…ªTÇÊí.½Û²tÉ{/U[í÷ö LL£¤º´~FI½+—K¨>[¡Øvà’…Òr-åÂã2Àw`á93!•:(²ØÍÂE»¹&9±,fÚ¶# •.¯pÞvÃéC5´È›B+J) ù w³fÍʶ)ÊÝ«W¯²k¢,XÎ*ÜÕ 9- ´Bÿ^þ¼¨-H©‹GEã ÑE9øL“Ê®V8Á œ—c‘³y Ú†Æç1 ï¹$.bþÄÙlÈ/ÝÆÀíŠóع³Ý$ì¹ te ü>ŠýìÞ¾—bí :‰ÃOb$›Åò{°šDW*GûòÈ&…³®¹sú­gÂÿÝLJ;7òãâ,ú'Ù•¶¯ƒŠ\‰-HâWÖ“GAÝS¸²w:Ñ&x3wQŸ,ü¡öÙ8ªêךÖ;¸ å“ÃDYÞr#—ÚaßOãxù—ì„éÀ/ÃÓŸ6ãÑ ë‘½¥š6 r̡۽|rjãóÚ }lŸ7‡Mh´³>Mj9ÐVåvv†»¢} ùøýŸØÛà,®¼  µvÝ’³Z;Yµ¢˜Œ‰1Úq=½:¦R?Â&gçzVíM¢{÷dÜu[‘¬~äâ%|ðå*ŸÓ€Ìï¿d­Öhw ­ë:Q•FAƒœc¸bˆsE»Y¶!»~$¶ÏUml]‰Í¨Ç/ä/æÃo7‘þ¯úx𑟯‰tEWQ®åÑê#:Ü;™™îH<¥CåÊÀÔÅ”KP„Nôî8™°q¼q —tM£žÃ:xʶªÜf®ÃŒc8}HÎè„u¡F ý~?~¿­5ŸþyY¢<{öl.¸à´Ö!ï!}(ä6VBQÊ7}ƘW?e·]zýŒü¼ÞÏï£nå‰û_âζAž;1ºÊ[R­sWLo~^mcÛšÈN½èZÇò5áì®±|ÿMã‡rñ4ªðàÅŸŠ7Lç?~EnTmjGxÙ¹ËFã¢~J-\æ®Ð‡äÏŽY÷4®9{&ÿýzË&ÜM¿‰ʯ]t1–{;Dâ ±O1™ÿŒ¨ª>ÆA×ó–·uòPzO-$톽ÀƒmW3nÜò­úÜ}/׫) ¹w6Œ…¯:=ÊÙյџ’Ã×#úó“ŠŠ·GJìub@çiçöÕÅÎÁ¦OÇ3åëXz#õ:â’¤ —n™u9ë–üxÏx–lã»·žàû·Ê¥Gt%þÄÓ¡ö)\wá ßߺ—kÞV%}^Óäò«é£°3+N° ¸“éÞÂÉoK‹Yöüõ\6Ɖ?ò }©ÕÄÖ¬wOŸÉÈï3Y8æúu`ba7Â[œPe¹M·„ê³÷eà+¢È¢™ŒÚœ:è&æ­…Ÿ37óùëòŘÀȱ]þiÎ:AÚì0â(„ÿ¥S¸«ºÄØï÷3yòd´Ö$&&R¯^=”RìÚµ‹‰'ТE œN矮‹LáBˆ¥Ñž&œÒ¥¿._Çö?à"¦n*ξŒë.?‘í¥°Âê^•LJ*NÖ¸›äÁ›lÞúøgVîÜÀ;5¸ãi”ÖžÔh…6ëröÐÁl÷.߬vP§v wTåçL×*_¸‹Ú ‰Ø¹‹>99€3Š„¤4ºü«7WôéN}ÓO‘×Cëëà6ÇD>š»Š­Y(W ‰É´;¡6NÅ:‚‰,ß±›­YàIHç”^×qk÷xŒ»âVz\ñ˜5Q´¿á)žH~—)_ýÎê-™c“”NƒÈÀ4ØÂûÔ+"i˜Á²`õñüw®ü”tmsð,¯|Š ‹Õï¾ÍÜ| O×›¸ªm ‘Þ‹¹¡û÷<õËZ&½ý§ÜuÜhóöŒ*Ú(È1W×îº\_‰LˆÆ»7 Ûÿº–_׆H«˜B#HÛ;4ío ;“Ä]iöýìn|“"p¨b|>Sp48‡^MãÛ>äëEëÙ´=‹bG uÒ¼SGê¸\ Z |”ÇjOaÒç X³«ˆ¨ú-é~ñÜÒ+ ·¿»rŸ¯t¬ª§ ý?¶›Â—K¶•§ˆKrãt»ˆlºÿ£bèxó“<’<•iß,aí¶l¼ŽXR’œ˜îDzTQ®Õg+ö‘0™uzpç‹é6ã}>·† [3)TDÓÚÑ£¡å¨´ÍZFÃéCrF'„ø+«.6M“V­Z”$7hЀÄÄÄJÏÿ©ºyÎ9eÊï9眃Çã©‘!Ä?‹FãÀérà0Í’[á(ÀFû}{ýØhlÛÀÓ0° ó)ôY˜Ñxœ&Ê›O~±íŒ$ÊíÀÔEäø±µÆp¸p¹˜ê «3ñá׉ËíÆå4ðæSl{®Bm0=ÜŽr÷V”\KëÃë󗻞.7NGɱ•®*î/¢Èk¡•Û‰Yú¢²Ñ>/E^?ÖAÇœGOƒ"¿U阗pj § —Ãq \4Vq!Å~mT½O»ÊúX•S[㌌Âd…1e˜Ø…¹D¸L »ˆüB?¶­1<‘D8ML»˜¼/TÙF…x­Cl÷} yã“,ðÆrÁ¨q kåÁT ¶¼—Þ)x;W;åÄ鯢B/VÐLK£µÃå ôiC¡`klÛÏX”Kkápãrš˜†ØØ>/Å> ¤ÏooÖ&N· §Ãœ4i?E…ÅX¶F…ìÿ:˜Î@ÿ4À –—Â"/VÐr‹ð~9p8]bV}Q^;D›BÃùÝ! ´â¯,//+VdÕÌ’‘‘Aÿþý/ ‚’¯ürÿ/Šd ·BÔ¸’żVÐ…™J·1 · oé3†]\@AqÙ(å QJ¡-Å…UÍ!U(l|Å…øŠC=Wá]ØÞ" ½Á_?h[–¯+hIIqQ°#¯|Ì;æÀ>‹DûƒìT…ÞgÕ¯ÙÚPø‹ B´`RP®ÊPho!e © Ê6:¼v§Ü¶Ú[DAÐ,7x;W;üø©¢k([i,Ÿ·Šv/·/Ë[éšÒ2Âko…R6~oþŠý±Úþ_r›¿—âJñ«ªÜ’„ÙG…‚jb¢Í!Ž‡Ò‡„â¯Êáp`FÙí©ŽY=ªzA¦p !„Ç ‹åï³Bˆš¨¨(âââðûýÇüV˲ ·Bq<óœÀ½“¦…Ó0ðççÊßg!„ÿ8‰‰‰lÚ´‰¨¨¨c: -S¸…BˆãZ`ÊnQ^EǺ*B!Ä1’@aa!;wî$22—ËuLé*興I¢…B!„Bs^¯—FÏÚµkÉÉÉ©ÑòÃÍ}eZ!„B!Äq¯¨¨ˆˆˆºwï^ãe¿÷Þ{amWe-„B!„BO|>YYYÇlÿ2-„B!„B„Á8ÖB!„B!þ $B!„B!Â4>†·ÕB!„B!ŽK2-„B!„B„Ah!„B!„" U$ÐG`·?¼ñ$OÏÞBññºÀ·•É‚Æ3yî>üÇk+²³XúÉD&ü°oUuþ+Ä^{ÒO‚“¸!„BˆGnÚ»ñw\ÅMãþ ÀÖ`g³âÇŸY¼½ûx½E–'?}ø!_¯Ë ÇPÈöåó™—QòúñÀŸÅ‚™ðÙŠl¬ªâúWˆýñäxlç£AúIp!„BQ¢Êû@WËÞǧw^Ï‹«mì /56—Îò˜Ô€u"1JW%Óš£vú¢~ ¯z•7¤à2ЮË×QU8†¢õLù(kú¾Æ˜”hÌš¨·vòñð›y}}åz¤3|â(z&:ªž`ÛT{^4cŠÅœ'‡óÄ/{KFù]ÄÕM¦užô¿ü_´Š3Äü‡CS|Ú¹:ãbF‘Ø !i'žÍ•WžMÛ×щËñÒOjBéïǼ÷ÔiÔ*×¹¿Œà²'òúæsôI ñ³Uêï!„BqØ?F£-«áe<<¤=ÑFé)¨ItJ,¦ËEÏ{žæBe`“Œ¨ªúDÖOÂNœ *ƒ'Y=FmN¹}$rý€—ŒF1fU[†ÞÙ›d·B™14=’Êã'g÷^| úòÐNÄèönXÀ'Ó^âŽE»xùÙ´ˆTÇüxk¼«u .î@dá>¶oYǯŸ½ÆÿÍšIŸÇžah‡8Ç:0)%¿Œ ɯ¶±,[²b!„BqþD]"6•¶íÚ4ºƒR(oã‡ãËNÏ0á–x‚½×—É¢Ç2væ|Ög$¶èÁ€¡7qAZTÍúUU?ï~öoµ„Y&õÒS!K˜×îÍ`BcØ¥=ç_{+WwMÄUU½BÅž"2¾Çè)ß³ro1Ú]—î7?ƃç7¨º¼C¡Ø¦œÐî„@»tìB—Fû0òK¾Ì¸Œæ­"Pþõ³÷2gìh&ýºžíûòðºbiÔâd.¿é:ÎO/7blg³læŒ9Õ»5‰ÍºpÉ [èÛ&.°•Éoï¼ÊÄV±+/Qtö"ŸȪ*µó).6}äãÒ®}i=‹Þ—œÏÇ÷gÌS¯Òîµ»9½ŽUeÛÁâgnà¾ÕçóÊk×ÑÌ£PØìþôN®~+‡ÆàäÈWÙîATÃ0Û"T³«h‡óÂü «&„üy¨ ÜcB!„;Ah}(CoÚÆ¶mìÒiÚJa–ü_[–MS‹Y;õ>î™IŸA÷0¸^󧽯 4;”cjpÔU)TÅ›[ëB–½u7ͲéÖïf¦¹Ø·ò¦¬†Èò›9†Ä^#xèÜz8•Adý¨??Â^šÐ£ÊîÁ­Êž7‰os>7ÞyñQ»ÿ€—§=Í«éãx [|Ùɽ¿ÐM»+‡2 v1k¾™Ê´Gï¦xÔ« näB÷бo“5“‘/}Kdß!Œì’„#{7yɵj>™)kOL<Çž<«ÚúèÎcÝ‚%ì¨ßáƒÓ‰(ØÊüÙÓ=|-¹¯=Í•)^ÖO»;§äÑ¥ÿ nj°á“{÷Š^~žMÝ(+›sæ’Qû †nK¼•‘–€Cí*·³µíƒ£…éI¥÷àÞ|tÇG¼÷Ë^zô®ÅÆ*c3„f§·ÁùýB–íH³NÐ9¬ú9£å%´Šö±nr¨¸V¬H81 §-ªkϪڡ†âiûðù|xíúüå/˜¨®~Ê ë˜…B!ÄßQкR²ÊÊçèwñó'ôâå7o¦e5Ë“éÜÅŒŸ±7ãæóêâTЦÞ~æšÎçëo¤}ûH¥UZñ,WôuàqÄ)<=éNô-à/vS¿ßËŒ¸*¡ S=2¾]ÌâjŠô$$“––ŒKb¬‹AtÓ®œÞ´äa‹Úls_-Ù…¯k\Y]û”\Û»%†â”.Ͱçãw—0àánÄW(±ºØ·tî&ÛŽ¢MÇnœÔ6&°u$¦UÛø óسi³Æ}O¶«g6õ@ÞÂÐ}£•­‰LéDn-‰0ºrr÷æ·Œ`Ê;Ëé9¢Ñù‹™ðþ&êö͈é¸tJ¥xðp¦½³ˆ>u%@k¢št¦Gç–D¨’ã, Ô®b;o:Zq9˜»¹.6A IDAT~[R±jÝŠr3BÆæž–ÿ¢ó)¾_šÅEõ1óVóÍ*h5´ ±ù‹U]\Ëѹáǰº¶§=+µCMð¸ªï‹?§m,»iÙqV[¿Šª9æ˜csÝŠB!„8ÂþüîÔ¡ ç¶6yꛥd}k¾g±/[ÚÅaí[f\|%1ln «j‹ê~ÖË·'GàC©”~üwH{bËÍ­Î_ú:¼x\íï¢VAʬæ˜c*æ !„Bˆ¿ƒ?Ÿ@G5¤y«–å®13±´ýØxè2ìqµô”;iVDÔ©ÁÅ’"ë“Þ¬Y¥úy•ˆ«)Gsu)ßÖOxøÑ©ä~wjMm{ ³Ÿ~ž«yŸmÙ€‰¡‚ÜÕ»ºØ{¸täÛtYø~ðOÿ€Ÿáé~éDÖÔÈZ“<1¬ÑÅ«˜úøX~¯ÝŽîi±8x«í9A‹t8MÀÂÒ˜s_¡º²Êo\Ðvv¥ù¸áݵœ->Mbz\ÕÅÆ48ñü6˜Ï}É‚ÌN$|ý;Å-®§S‚‰Ê­.®™Á+p1<¨-¬ÃkÏLë¶mZ!/;¥òª­_q© ü1k‚üÜ !„Bˆ¿¼?Ÿ@CðkŒƒo†¶×:j§ÑÐYLF$—J¤q§Â©Ÿ3±%)®÷YúÛfŠNhId8Y¿é&ÆY…{.…!èâm‹Ù`5aÈÀžtOr ¬VÄ2Ö…øyeî´tê8ÿ¡Ç^9¢hÜåbî8é_œþêPîž9‹5§}M­YŸôféÔ2Ó¸ëþ­ 1–'g¶æù+šàª®~Þ 5ðí`þª|œ Ò¨ígÝæ4vMgùÂxÛ¦áQ |Û˜¿"grs]ªêY!ÚùˆÇ¥]¼‰Ycf±+²7žœˆÇ™^mÛÅw¼„nž‘|òõ÷ÄÏ·è4¼ uL…ª6®÷gb †+‚ŰQˆVh GÃhÏšVñw@¹ÿV_¿ƒãT…c–äY!„âï©fèp˜Ñ$ÅÂÞE?0KCNiÜ…ëz%qÇŒ‘êú4ýSªé%oßÿó4Þi|mëøXÿÍd¦m«ÍEÿw"q†BÅtäú¾É yï1žô\ÃùM`Ãÿ&1m{#ÜÛ‰ØP~TÑΧ'¬äó…G8.ÙX¶8OÑ~vnYË/Ÿ}Ê‚Ýué=ò6N«ãÀTÕÿܨض\zF,wL‡sÏtˆÌDˆ¯î½ûIø1 ÕFuû­¹è#îãR_W{ÌB!„âïé(&Ðu9óÆË˜óülÞ˜ÕƒÎC[Ñú†Q<ÿo}9…§fä`yâiÚýN9¯%±Aï©s¶Lç‘ûß?ø¹¤Ëóú5¤÷’cÇ3næTžš™Ïá!®NkNM­â–>F<ÝnF¯gÞfêÓÿ¥8¢.´äôVqÁ·¯®”¾B³ŒZöFïïG0yÌÎzìZ_¢o”¾ÍÇÂ÷_bú›¸Æm¹üÁ[¹¶uéªènÒ>Á¨È7ûÉk<¸WS'í$n|êf.kæ ½rzíܥ͑Œ‹ƒ˜ÄZ?È£|F$u4¤IçAŒºò\Ú'–Ö9"ŒŸÍ{žOÃÙSðÛ‹6e£ãÕ¼×Y¹Ÿ„ÃÐmQÍ~ÿtìþ$uˆq¹)MuÇ,„B!þŽ‚ê9§Nê=÷Üs«–­m 3èc`]þõ’…y´:ðœÖ6Zë²ËM•20jè TÛÁ/qV¦ ²ÿÒQÑ@‚Cés¥õ5 ŒœÊ¨óúQZG»üȸBªl¿Ú¶±Ë_¯«FÅÑ%ö¥Û†*ïÏc¥~£±­0ëçÍàí[nåóNÏ2ap <¥«6—µ[ùÃ.»JǬ}+¼V¾áÈÇ¥|U UÒÖ•jWíÏÆ²lP•-ä{«ê'UÅðPÛ"è~CµÃŸSåï(mcÙTþ9 '.þMa³B!„økøê«¯èß¿ÿ¥@!PPò•_îÿ…@ÑŸV†bäUa^U Ã4+Ûwl§AýA·ùâ_àñxHII¡Ø[|”kxô9NV­Y…Ëå"½iúqÕ^B!„BˆcOè#,;'›”Æ)øü¾ãjusÃ0h×¶¿ÍûúIõƒ&‹ûöï#µI*^¯ÃøûÏö·l‹¨è(Ö®_KzÓôc]!„B!ÄqFè£@kmÛǺ±m4¡GY5ø|¾ÔH¬×ïÅTæ±®†B!„â8$ ôQr<>— £J ÿœü9p¼B!„B„$ÐGÖú¸L Ã©“aÿ¨hÃ4àøš, „B!„8NH}· tCЪäß?…B…!„B!Ä?$ÐGÖ[_Ú …ÒÕ'Ʀiþ³F  ˶Žu5„B!ÄñÌÊdÁ̬jЇ~]kãøçœ.‡ïHÇÈ¿‡Þ~“¹ 2¼g2n«Âã#Ô&饕íâl¶¯_Ï®¢šMNkºÜÒèÃú*^Ï„aW3è?È·ìÐÛZl[6yóð‡Y~u”R­/;—•_Í`Æ‚}X^B!„B„äßÉO~È×ëò¡—*éÙÙ¬øñgo/ÂÖºòã#¤ÆG µo fNæ½ï—±~Ónr-'±õ›ÑñôK¸©_7’\5“ ØYßqçÀçYfÕãš×_åêTwL4>å†LVí}|þŸA¼ìÎÔ'O%Þ¬¸77u’êÓ vÕ\·\´žwF>ÎÚ¾/ñjãHŒW¨ð®6ŽÒ5ÐÚËþ-›ÙçN&­ž;üOvü»øæÍiüÑä2n:·UÄÖ«ÙxBw´a„ŒA0’@ !„BvsžÎ¿ìů\ÄÕM¦užô¿ü_´Š3»‹ µ®ù ÿì‚|=qS¾[Îö‚H’ZõàªÁ×snÓ(*¥ eoÚǧw^Ï‹«íJKù46—ΫsÌFÈÿlŒìýßqï£YÔø&Æ?Û›FsÉŠå6©¨Fh;g ¯ýçAflñckM ?³Èܺœoç´çª+»ÕÜδ϶±m]³k>rC&ÐZc[–ÒåbVŽ£>çßõ8ç)ƒ ¯W(KÛ6ÚÖÕvVkîjhÏò÷ÞdúÊ\l âj'”ÖžSOkOJŒ#¼_vÅ»ù~êûlïq3C’"ÂO|M7ñµ¨Ó00l«†kã0èÂý®…B!Ž?~rvïÅ× / éDŒ.`ï†|2í%îX´‹—ŸH‹È¿ùÊKÆ=Â3ÿ[î< Üq4nu&W ¾Š3FrÑ…d|÷o|ü3ËÖï£ÐU‹6½îad_]u¹N‹}ó§óÒÛŸ1S^ÃCBÓ3¸ã¿ƒ99¡êD±ººä?%ÛUxÝ·‰wn½“¯;=΃šãQÅlúz®’7ožt;½¨MÛ{&òÔ)1•:šÖ5ÐÕ'К¢¬\¬Ú'Ó¿gSÜÞöïÝɪyŸóæÜyt»îzz¥‡ÑÑ ÐÚÆæ_£]ú]G ”lE`$ùphB!„8F4Û”Ú@-SAÇ.ti´Ÿ#¿äËŒËhÞ*åÏdÑÇc;s>ë³ [ô`ÀЛ¸ ­d„ÖÎeå¬qŒýdìÈÃŒkÎÅ>Æ V‘:›e3ß`ìÌy¬Þ­IlÖ…KÝBß6q÷Z™üöΫLüa»rñEÇa/òøyI8}{øuÚk¼ýÕ6f™ÔKO…,}`Ö¤."ã«qŒžò=+÷£Ýué~óc{7­=DobÒ» ¸úáSI8Æœ×XmgÎgÚw™Ø|˜{.kJ„©P$P»~cÚ  ®‹X5án†°¿e£âŒ%Ì}d¿ÊèËRðøöðûÏËÙXh¡ . Ù¿e)3FÝ•8–;Nˆ:hßΘXb wÈÀ)äî`W¡ƒèYûÉøý#žxÔMãW’îñ±á½{2i=~ÛFk ÷²ÏAù4¸b¹væO<óØT[ØÑ‰$¹ Ù¿3+ô¨eu tà•*è’jɨ²oÛ,ž|å{".ÄC“pdï"/9F{ÞÅ}g×Ã¥Iu¥+–«kÚ4ªYDL›$5²>iÍÒ‰) E÷S:óËø1ÌžþMo¿œvñÊÊeÝŸóé/kØ‘§ˆOnË™}ΣsC†a¢Pìùêuþ:PF“þ÷pó nöÏ}—·¾ZÇþ"3ªͺžÇ¥g5#ÖTàßÍW/¼Î‚7rg¯F¸ #ðCªLLÃÄÄË®…_ðÑÿ–±)Û‹vÆÓº×µ\Õ9!èTÓ0«ŠB!„8rÊÖ¥1ñÄÄãÑyìɳ€bÖN½{fFÒgÐ= ®—Çüi¯ñÂC ÇåÄ›Œé#>)“Ž—_Ëmê@v6±I.”ò²~ê}Ü9%.ýñpSƒ ÿ›ÄØ»GPôòó lêFYÙ¬˜3—ŒÚW0|p[â­|Œ´²ì­»yh–M·~730Íž•ß0e5D–TÙ·u&#_ú–ȾCÙ% Gönò’káT¯×‹×WÍüVG<à«y ØzIcÒ",v¯XCvd3Ú$:B'ÏÚÆ¶mìÒ •ÂT ð²~Z5Çض˜QZ®<˲×[ùlX´œÝ úóïÛ›‘»™ߟÄK9hôæítˆ,fy51 ;ØdÍû€ín¿ÍK^vy{~ä±ÿLdí–y,ÏìOS׌™º¿eÒúºQ¤™râ»÷ãêε0•ÂS;‡©ˆir\Ù·&kíÌøöf5ÎU­£1JG®u ®eS°KF õÞ¹Lùh)îS{q]ëZ˜y™ÖÁio3B!„8Öl|…yìÙ´ˆYã¾'ÛÕŽ3›z o!ãgl§ÅÍã¸ù¼º8´©·Ÿ¹ƒ¦óùúi—¶œñïm$ñ’çxèšfDIrç1áýMÔí;šÒ‰0§tJ¥xðp¦½³ˆ>u%@k¢št¦Gç–D¦5¢³~ä/vS¿ßËŒ¸*¡ S=2¾]ÌâÒçî&ÛŽ¢MÇnœÔ6³d¿ ¶w¿=Mi®RG}zß9ˆE#Þdð ßèѲ˜ßçYô~ðº†s øÊçèwñó'ôâå7o¦…oqxÇ’­‰LéÈ)[âQéØ`7 ïü‰ï3n¦]ÃÕÆH…ÿ.þ÷Ñ2¢N{’ö1&.æ¬Ø{ùø« z^›(ÿ©±Z9\%…™8B\GZ¼c-vŸÈ•´¡N„Ií³{ÒbÂVmdÙn/]”+×00Ýõiß26g‘µ=/”K Ê4·[*}ÊÎfñ´gyö½ÅìÕFqmM>û üï]ÌŸF;;ÐÿÂæÄ¹LQÄv~Õå:ëw¦{Òt>ܾ7†ÜÀw§öâÊþ—rZ“б k ·®zºl’·Ö¸›^Àeíá­‡océpQŸóé‘M-Ùö@wªúšiMx«pWŸ@—L¦dÊt¹ÎìIlB]ó'¶lÏÃ_´‡/ÜGã>ÿ¦O—xLMjç²ò™˜·óBš%ZW|=%'â,·Ï¨F­éаäAj{—¾Ìü ÙXmcqèÒDØ(ÛiBof“¯Ý¤¶lM«¦%Ó÷UÕ×ÏÈ5ÐB!„ÇЊg¹¢÷¨ÀÿµÆ‘܃[žÊéµø3V³¹ÈÏö—nä—)ÛÆ¶m<{ )Žùƒ EќйÃ8hÄÖ»ç6ÇpBç†^ó4¢KÛ(Þ]±ŠÝޮĖª²K|ûÖ²ÕG‡I¸Kß«.ßÞ›~'þĘûofݽ¹ôâžœÞ,¾dÆ£Âk–£Mþ®Íl/N ëù'Ñ`Ï\–x×ñËw‹¹¤ÝY4¨î¾L©xìÖD— L®š¸ üÛÃ8ö0jWJbã®—F¢ú’]9~üîêc~À»ùk>ÙX ÿ¯)nCADszŸŸÄìÏ?gõ·Ñ.êØ]_c ´£N:u•b7»™¿p'74KÁlÃrI›*7½ äEz]®IDB…öû±uÉ5®%ïñû‰bi1Kß`介ÈÖÉœwMÚEn⣱³Ø`f-k¿7°@˜aà¨ðéE¨rUD+ný,ÉS§2ýóßY3gý8—«^Åuͪ^øêÏNá.ÛNk´3™>¾JÇEßòÉÇ3yî®™Ìî÷\žF¤Ö™ÙÚk±šJ I©Q)F•F윭ìòYìû`÷|x ¶­qgù qé£a˜åbi‘¹â;>ùßBVmÏ¢Xy0‹m)~”¡0JèÒkžK~`UI}Üɧð¯f+˜ùÆólïx2§ŸÚGW¹Ê·Œ@ !„BCMòİND¯bêãcù½v;º§ÅâPàµýØxè2ìqµô”;oSDԉñÓB£JOAƒ«pª(£dg•ï1P.©¬’+•KG¾M—…_ñáðäð˜1ðžî—Nd˜£¥:çw^ý Q×½ÊC½àT—rå9opËý¯3æôÎ<Ü¥šÁ¢Ò¼UËr×@f£zËŽ£Âa•?v¥pà+ô¦l‡qN¬L7N,|Z‡£°±æÓ¯ØáßϤ[/£di'´maë,>^~m»Är¬.¼¬±á6#¶ ç¶u¡dL|ŒQ3æ±z{9Ùûغê7¾œ³‰B îúmI1ªx ïù™Þ"2¾ù”5Z£])´J ¾WÅ6T®x✻X¾1°ý~l,²7m"OkH9—«úžÏùçt'ÅSîÚæz-i€B/æƒï2(°í%/׋vÅUQ.àË#ÇH£×àG™0íi.KRh{ßÏÛ…/Dl´Ö•±«ø*Û®ªm…ØÞˆ¤QÇž ~äy=;’Õ³¿`]­\D»¡0³0p}yˆ}Ú¶Þ*Üʨö«$õ­ô¼•™Án j''àÂFã¢ÕC¹û®áÜs×pî¹ëÿ¸ïž;¹î„ØÀ Úªò>í=¿0~Â7l­{*ßοoîÃIñ U¶¿ÒO«¨«gº‡ûn<‹äÌߘüâÓ¼üõv¼ºêãB!„ÇHd}Ò›¥Óª}O'ñKÆòäÌ Š48j§ÑÐYLF$¥¤Ò$5•¦©©4MM¡~´gt:sX¾`;Þ EÎÄæ4vå²|Ꭿù¶1E.Îäæ$ºªÑt&¶$Å•ÇÒß6SbJ9¢hÜåbîxêuž9?Š?fÎbMQø·Uòg¯gC¾‡äÔZscÃA\ó“Hs²kWAxå”\?®J.å ûØÍXêǾÛ)8Œ8Ü…Cç­`ÆœL]ö /~ŽWF?Ï+£ŸçÕÑÑ¿Q!¿ÍZD¶¥Km¸¦ºâã#¡æVá6ëqî°ëùöö±,.ØÊ7o<·o”.¦Ñ'Ûþ^ºÕ9A½§3|Æ~ën®x[®aµ5M®¸š“b TQûó¤rZk¿,*béó×Ñg¬ +òlž;˜¦é-ˆcû3ÞbÈ-ßÓ¤Vë ì²Nç¨wןõ÷³Ÿ…¯ßÎEc˜XØ-†3íéU–›¾i2Cÿó91u¨YÌŽ6' RcC²Úh äd°lq$Qå–ImIzTéí¦JÛ=Ÿ/Ù4jœ@„o7K7çcGÖ ¬LnÖ¦U³~xŸ-Î'Uï'/±3g´¨üi• ,-Vm˜M³ºEÄJ_¥0L³ìhíÝɯ3~&ÓÝ–>íˆp&“hÎaçNƒº'7ÄmTø%åóíože% €wß:¶Û ¸ô‚ShWÛaG“­Xb%‹„•ŒV+Ó40Kë£Uà±R`FÓð„3èߦ ßÅ+?þÊö3®$=¢ò/J™Â-„BqŒ)…Rqí®ç¾¿3lÒ |Ôõiú§táº^IÜ1c$èubžâ½lËIáÜ Zß™ë{×çöþËà à‚6õpñ©œÑ¤#×÷MfÈ{ñ¤çÎoþ7‰iÛ1àÞNĆ8ßU1¸áòOý/÷ÛWsQ§†D­bsÞ³iß®_™½À¦q“:Døv²(#;²6Q† {õigöt®ó3ǼE›ΡEt.«>“ߊ1 uÜa|ª˜0ŽÝ™D³3~Òž›ZÈ…­jcì\GvØû¨>FáÅA“³üSææ¥rõ¹h•\~Á°&D—Âô‰³™»ÿ.¨MR,ì]ôó·4ä”F§D‘Qê½´«Qož~«)³'¿Ë—‹Ö“±=‹bGµê6¤ÅIí‰W€Š¤í£x.ac?ÏšED×oE÷‹oà–ži.ö¯Ž‘Àéÿ¾—M/¾Å§K¶•ë#®žÂg§Õ <>ÄÏ+Óç°rç:VìÔ(w<ÒÛÑ$ÚD™qtö"O%¿É„¯–°v[^g,)um¼$púÿÝ˦—*—ëב$×`ñö]lÙž„4þŸ½ûŽ“¢H?þ©êž™ l ç—," ˜1 žè©`8QQÄp¦“ŸÞ‰gΑû¢`@P0{ Þyæt†*ˆˆ ‚‚ä%m˜é®úýÑ=³]X »°>o^¼^»;=ÝÕa¦ú©zªzб£¸h@Ým¦ST)…û—€[: IDATYÜuóKe^êtуÜ22)Þñu?ðÑó¯òíÚb,1êwØs/;–V°*›}GÇ÷Oçù{o#žÖ€}þØA²¶úÀÙðßvsUÆ@lYÁⲈÅ7²zÅ2¾ùðC毯Çü‘¾õ#¸ª;ÇXŸ»ÞyœÉÎ î\ŸX|«¶4aÀÀÖdFêÓ¡E„w?{“wÚ ¦9(¨×> ÚЀ7xïµÉì׎F±õ¬.²€Fi¶eÇ<ëHfBþ÷_1UcºEññ|Kãf9ļu,üµ›–K†[ñ䪦,'„B!:.#.áØw¯áɇÞ盧먻¸3w2¾6ÛfnÄOË¥Ýþg3hh²tºŒº“;s&óȫӸù¹Í˜´&8¶´mB‡ÓoᮌÉLzi"×®±4h¿/çÜv'uLÛΣOc´q+÷gOááY3¸mÖn9 ºr@›L ±~!ï?=“oÖcm : æÂq'Ò.¦Pq‹ïùøþvî½Ó;sîÍãp'=Í“·¾Îº¢9­zqò_G3¢}åÃE·/V…}Ðzøµ\»q¾2ñ3|œX6 Úõ¦KîvŸUÅcU8&ŸÏf}Aa›3Ø¿I]fÚ:”6ScÖ‡+9üM8øœ“xÿžW˜üò`úí\î÷¼ªÇ–¿AEkŒLŸ>=>tèКL;.5žW)·ªT¯£µ¦$=9L3(9@>âJ…ãa“½Ô¨ÒO0†6œ†ã`Uùõ§ö¶äõTJ;ÆÍªÊ×k-ÆšR㔃}ÒÛ8No¼óƒ÷L«<ÉÛ–Ÿ2>¹öä¾KX¶rePa ]IJ—]AfÅK¦*/X¸€>½úTx®§<1…°íëÀlâó‡ïàá9ùÁ”ù*܆hÞ¹?C‡îG§º±Ôö­¿‘o½È??\ÀÒÕ[0Ñ,šõ:ž±gô£¡«ˆ¯žÍ3S^â“%HÄêÒíèósh=VøO¾ú‹ó€ÅM¯G»CGsñQ-ˆyË™yÃm|Øí2n:¥ 1›æ¿ÄCOü—õ=Ç2®ß\&?ö. ×'€(¹­{rÄ)äÖ åoÈg媕uøQ2Z!„¢Yãc¶š¡9Œ JÅ•ßÃSÁëeï‡ËÇ z«ûhSé,Ñå·›ì)×aÆmðÞ’×JÖŸ¤l9+9 [Å!©müæcWAù+Ý÷äzL0ºô~hªðØç†RómóUñ8l{_Êm3yÜ“×Gù߃×_#Fœáÿ-¥~.ŠvC-J{ã74`Ð6èš ÂFïø~›ô‡l÷:°¥¿,J6n£Ü²e ˜¯äCX¦Ñ£ôRùüR_$Ölé˜äòá„peß[vLHyùùù¬øu…ÐB!„BüŽT5€Þ¥)Ü¢bÛLá®AJ©°¨r®ãn?Ü•ƒ vd]»pû‘Hd»ÇD!„Bñû$t5°aÚõžD£±Ên·g|»c k™h4J<ßþ‚B!„Bˆß  «ÉžÖm f÷¶ ¾.å÷@;Ž#=ÐB!„Bˆ I] ’ÙD« \®»íK îYåÞÍ”RD"‘š.†B!„b$ôn–•Íšuk¨_·~Me+‹—,¦E³•ö0׫W¹óæÒ³GÏßEíû>ßÌý†¼Îy5]!„B!ÄHèÝlŸ^ûðõܯY´xÑ• m­¥cûŽ4kÚ¬ÒeŽ<ìHÞzï-f½2‹­çÓ®}Œ5ôïÛŸŽí;îQçJ!„B±gz7‹F¢ôíÝ·¦‹Q¡í‰±XŒ£? »õCªj->æJ!„B!Ê“ºìÍYòyÑB!„Bñ{§kºB!„B!ÄÞ@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@èÝ2ÇþrÇõwž_R„­é !„B!„Ø£¸Õ±_ÉìNãéw¾aáÒug6 U»îòÇ39±o#bª:J±mÞúy|0o›ýµ¼¿¨€Z§áìåB!„B±gØí´Ùô¯¸–™Ë<Œ±AÏîÆ•,þj?~ý.oŸx÷ŽêFV G«‘fGrÕ¥qÞ_Ûš#öÏEKð,„B!„¢”Ý@›|>|'3—&ðmS9ÿF jOÆÆ…¼3c}¼–ÅÏßÅcý&pQ÷ïþílnÿÚ#ý€™~UoêhŸžº˜ÑOþŒi{.ß{<-ôæ¾2…ɳ>fþ¯ ²›åqÈÈóuP24XÁ[Ó¦ðÒÇóùqÕz åß?ødXɺonÎô‰Oóqq[zîË¥]ÓQ&¿òm±Ž×®:‹»ç²Ž¸'/ü.3•¥]¯àé[‡PwÓû\yÆÝ|ígqÌpI×t Ì…B!„b/µ[Ç@›õ³yêíõ ­ÏøW¿/í×£Y‡þŒüËßÞHƒ]É«ÏÃFrè}hg0†_ÌÒ¸ÅúëùêãŸñ}Ÿ6õ¥‘[Ì÷OŽãòIo0÷—-DÓ ë~žÃ wŽãžÿ­Ã³@âÞyù#æ.[æb«|6û­9phg°ÛZ7Xk±Æô“m{[*‡î[bŒÏºùß³Æ7lþás–ú>‰ÅŸóS±¥øç9,ñ<¼´n lCIð,„B!„{­Ý@'V-àc±4d@ÿf¤i…P •цÁ=ë ÿüëšÜÞ‡ÓÍQ¨µ³ùðç8~þ\ÞYd±¶ ‡í×g݇<øÜÏx~ θïif>û4ÓÆæá°‰·Ÿ™Íz?˜úËZ‹%‡cîšÁË/½Ì«ÿ8…ÞûA÷m¬;R.º5ÛÝ–¦aß4CÁ²ÏY¼e ‹>^ˆo-lšÇ—¿²rÞ|6`‰v=ˆŽá¾ !„B!„Ø+UË$b Pt¿–ÿ›®×‡¡y_ó+üoÇ6{‹oŶ9˜A¢$~ÍßbYÆ—`º¬Á7V-bgiPzýZãh—HÝöº•_¶lñå_m[Íöã€Æ3xjÅ">_ü#‘y…X7¿2{þÏ4ûì¬ué~h²%w[!„B!öj»5€Ž4è@#¥XÇ*>ýìWÎêКXòÅ¢¥|üÍ&¬…HÓ¶Ô€Ò¹ì;4wî7,{û5þSožµ´?l ¢ ß+ ŽBó´’^]'«u…2•f;린ìâÆ+Þþ¶"­8p¿z<=k-Ÿ¾öœ5–v#FRï…ÇøúÍ×xm±UÝ8¼{¶Œ}B!„Bˆ½Ün  uýþœ20“þ»‰§ÞĽu.fäÀÖ¤oþwžx€ç~5Xr9ô„žäh(ê÷?‰Á™syç——˜ö‹ÅFzqòAMˆ*0ºÒŒÿ²Í4ÌÈá]Èq,‰õ+XŸÞ”ƉJK³Íu—k”·ým¥í!©ÿÒˬzï=¬mÌéÒbÞã|þõøÊZT÷Ãé[בôm!„B!„ØËíÖ1Ðèz ¾ðrŽh¨ÁþÌë¯æì3NcĘñLúï*| ÍŽ¹‚óöÉN=sYe÷äG4Da±r8™ýë¨ÓôFY¥â|ýø_øãñ'pÌqÇsÌ—0q^!Ön»8ÛZwyNÓC«´­hÛC9°¾k¡þ~ lÑ}íŒV`qéqä>Ô•J !„B!Ä^o÷ЀSw?®œô ×<€nÍs‰ø>&–K‹®ð§ñ“yxl_꺥ÌŽù•FÑ„cNÈ#39VZeÑwìÜ=úPº7ÏÁñã% ³Q{š8>•eoWiÝåUu[Ñ6ux3”‚Ü~ƒhsh°Ï!tR •Ö‡áûÖCâg!„B!„ØûUÚE¦OŸ:th…í(kM0;v²—X)´Ò•<ÚÉb|ƒE¡´ÞjüpEëR*¹\ò½ ´SÁØãÊÖ]ñû¶½­’eŒ± 4ŽVe¶¡-éÛB!„B±{ýõ×1bĉ³c„ÿ·”ú¹(ª¦Y¸AU,W¸4Úqvp]Û~oå¯Wü÷ª”[)MÙ·n¯ B!„B!ö6»=…[!„B!„¨ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ ªí9Тú%q>üø]òó×c±5]!„hÕ² }zï‡Rª¦‹"v‚Ô¹BQsª³.•ºûè••Ãà×tQ„¢ÁŒÝfLSù‹eß·ë£?ù€¹ß~E÷®½$ˆÞ‹I+„¨ýv¼>­Mu©еئM4`ZK¦¾Bì©z÷ìËÜysjºb'I+„5§:ëR  k1¥ ‰H†BìÁÇ‘ «:W!jNuÖ¥@×bJ)©Ì…b§µÂq¤:ÞÛI+„5§:ëR©±k1­5®ëJe.„{0­µô@×Rç !DͩκTjìZLnÈ„bϧP(ù¾ÞëI+„5§:ëRù¶¯Å”’Ó+„{½;{-½Õ¼7ùVneŶ‚ßÅ.±[ë\ooýãïÜ0ó'9gBQ‰ÝZ—–ÞNµlew3…,Ÿ;›O—lÆß“×Yͤ5\!öJíÞ´_³y|ÈœåEk·þ]컵Îõ×óÍ»ïñùÏ…ør΄bk»».-¥zÆ@Ç×ðù¬©Ìxë+,]G‘“I“ŽûpèÉçrÆ~ pwv_‹1íÆø~øDj]gW»ª¬Ó¬å_WŒâ~÷ ž¹í@êª ¼ë¥ÜòÑ< 8™4lÖœö½ã”S£{½(Õ92ª²‹ÈlYÄ«ÿƒ)o~Ãò-4é6„Q>Ÿ£;ì¢c'„â7Ùf¥Ÿ¬kL¹—:]ò8 ­B=jmÙ§n–ÿ½Ü¶ˆçÎÛΤG–.©· >çÚÓ®gõY“˜p\S"R_”Qá94ù¼ý÷ó¸îýÕÁ}1r¶ ÛÃ8í´cا~¤ê÷•³eòy÷¦±Üðö -€&–ÓŒ®ýåÔsGp@ÓXµÞ³!ÄΪ5´-üž©ã®búÂtò?’?Кúj?ΛËúø.ÜŽ1Ûy¨÷îX§Åú_'+5«Öh6œkÇìCFáZ–/ûÿ=‘Ë^žÅq7ÝÁØ}rv¾Á Š*l 7ùßýWróÇ8û²;è—½š÷§ÜË-WÄiøÄUì—ãH…)„ÕHm·Õ<¬kšŸÄuô¢ŽN.ëP§uö.nø ¶å-z–¿Þш‰;Š–1•zÍßHhE*îN°qåj-NåæKû“m¶°fÑlfN¿Ÿ ?þ‰¼}sݪwäÿ²‚‚V§sû¥}Éô6±rñ¼òäTÆ}¹Ž‡ž¸”ž™Zî „{…í×¥»Îî  m žº›é ësÜÍwq~ï"áŽtر 4Zfß̤̚YŸ²`•¥aÇþœ0ú|†wË n üÕ¼;ñn¦þïGV®ÛB\eÒ¨SN;†c:dâ„›[:u GO ÖßóêÜ58å/ßÌÕÓ¾dEO$»}Ž9—ËFô¥A2Š5›øö凙ôÒ§Ì_±'§¸ö&F·­lÙèmßç@v;zöêE]G‡pì GòÏ¿^ÊC·ý='^Åѯ¸ïÊ»˜ß÷¯Ü;º[©›¡]«Â‹¨x)o’O‹ÏçôƒÛSйÎ÷¼>æ¿|ök‚þÙ2¨BT¯*UúÙmèÞ3Y·¤Þˆ*œËíg]Ã÷ÃÿOnIT·b&cG?CÛ›e\—xëw§Áœ‰\÷d+UY=•àç—¶QÇ&ëîO³r}qÒiÚk('î¯ùâõ·ùlq>ÔmË€“.â²ã:‘•ܯÄz¾üç$&͚͢|MÃ΃9ö\ŽjŸ‰Þô9÷VCý¹#*=‡á}AïÞ½¨ç(è7Á‹8é²ÿðâ‚Qôퟲøêù0áùøv¥¥Q—ý9ù‹9¥Gn% $ –¾x-—=ò+¶ø¸9­è÷‡±ü¿3ûÓÐUà¯ã£Gïáá·¿aÉŠ‘E¿¿LâîcÊe¤îYz’«ƒ² ¨ûÃnþ‚Ù+ôhCyëøì™ Lxác®wh”7„³.˱ëà¨]T!„ØjG]ð-Ïýûg"ý®adÏ\¢¥*º’Œ³è©«¹búfúÍuí4‹ßœÆ¤«®¡hÂ=œÞ.†ò·°øË¹¬j6‚Ë/îHú¦¥|ðÜ4ïÒâ‘‹Ù'lôm8ìÆјˆÒd4ÍD+En·#9çŠãÉÍôYõÅóLxêvþ¯ÃÃüm@.ŽJðã³×pé´õôùãŸø[·°aÙMJR­·^g÷=Õ ¢pÒÚpì˜cyñÏ/òÌGk4Älj'Ê'ãíZ¶†GriSþýñÿXzr:fx¬üf>ù™]èÙ8"Á³BT³*·š[ƒ1“\V)œðgc|Êt [ƒïû;<ÆY7?–ñ4äª[n徎÷óÿhPÁ ƒ³í:6Yw7É_.ëLlÝ7<ÿÐóLøª Ÿv‘ɺO¦óà÷P/oc;§¡U1 g\͸Y7zcoföS¹o¼¦ù¤±ôÂVKý¹#¶=Z•:ÏŠhFQ›  ÈÅ,œvc§ldà™qkGÅÂÿ<„‹/§ð‘‰ŒêVÁ„5u{ ã‚kN¢^¦Ï¯Ÿ=Å=SoäÞNOrã \?ŸoÞùëŸÆU÷"×lÆéX¿’ ¸°l6Á†_¾â¥-Â68˜^ \”*⻩—óççÓ9ñÂñü¹ñf>™v·_¥i1í2úfïÊr!ÄŽ«5=ÐÞÆ%,)€&=Z•´,—c7Íáñç~¢Ñð{¹fdÒµbPß6¹”§žø’ãÆïG€µd´îà~]HSýèÓlŸ_ñ_Þ]r½ÛëJ«×’öíƒÖ÷ä¬Ón?†„¯Ó¹>?¿¯µ’Ä~9èÍs˜òÌ4<ánÆŸÙ‘t]rS¢ +_玈5íNk÷E¾ûa5ñaûrÕcÏbÑ8»±õ¼ÂAÝæœpÍX>»|":ý#êVÌìO èÓ…4Õƒ¦«>äÜçZrøqGЯŽFõLã«®ç³/W’èÜšè¦9L™¹œÎç=ÌyCQЭñ:>ý,¯.:‡^½úVKý¹#¶9 ·ñˆ±ÅÛÂê>å…g²ÚíÎ92aÓl&Ïø‘ƧN亳:“©ôkCñŸ.à‰G?gø-©»Õ 5Yqh‡ð×® XöÖ¹üë‹åÌ!ÀZ2; `È€ndh‚{›ŠÊöÕß9êà’4}kZòÇ;G±O–?aò³ËÈ»èI.:¦ Ý›®å¿§Oçå…cèӧή+‡Bì¤êzŒÕîí6>Ö‚v*C“X=Ÿ‹³èѯ9iZ= i-èß=“§ç}Ǫø~d§ŽE°¥±Æíi¨^cåFä¬É–‡’87ÁªÙÏ1iÆ|¶x5…:§ÈÙX„$VËâ¢:ôè×¢dÛål½Îd & ˪µ³­¥w ­u­1†‚_â—â 6€«þËE øàÏ9µÏ4Iµ&„ÕI+]µœÛŒä¦ ÷¡Ž :Z¶Q*Þ]Ë ëéWsÎ7—òw¾L·k[•[`Ûul‰dÝ¥^뺨x>ùñ°~M«OË\˜¿®c-‰5 XZä±üs8zBøvk1ƶºCn5ÔŸ;¢Â:7ùó¼Û8á¨ÛƒŸ­%£í λ㠆5â-šÇ¢â,zhE¦ã™nmØ»O|õ-«©›ZgòžÄcåÇÓy`ê¿ùß«(Й¸…>‘ÅØ2eÐh­Ð56$—éx>ÆíKâlYóŸýëqw!þ=sqî|–{ür×H†Ü|£Åø†ô•EX•ƪ-‡BìU®KwÝ@»Ù-i…¯¾[N¡iFd[3”{)øÒµPÉœ“ʉÁ'¦§‹—]6ñóK\wà 69—«Fw¥¾YÆ+·ßÃɬEQY£qEëÜQñ•sY–°4ìЀhu=£¬‚‹Ènø”{nÿuÎ{œ›‡7'ªNåô£'pÆå÷qÿa¸uÿ™‰[!ªY•2œ2›Ó)¯K©1Ðaã®RD4$ AÊö.¬cT´5ï<‡ÿ]øw¾|:é¥2§·[ÇVÀº(â%©åÖ%ê€ñÃÉ8‡!þ—ÜÌè.i¥Ž‹"½AõM¹#¶yãÖöLn¿¬õ³r¨W¯ sÓqt0L1@§-yd-[Ý#%–¾À¸¿>ΦC/düØ4°?ñÏëoá)xf3:tìŒîÜ>}Z’ê%üëùùœsVcÓÙÿ/wqQ·ŒRÅPd4ª‹]öü®+‡Bì¤êJáÞ½azîüá \ >˜Ê¬E…T4qg¤a'ZE71÷óÄ“jâfÏÛD¤e'F«êãÄÈŠBA~Ùç#ÿ2‡Å~[N<ýöïÚ‘Îy]i›]jÛõ;Ð<²‘¹Ÿ-/ÙövÖ¹#lñO¼üÐˬÌÀ)VÛ @E‘—¿6¥Óº]]¢Z£µKn—tŒ°bÅ–­‘"„b7SAËyÕ–U[gF9Ù4͆µ?.§ ’êJ)°¾©ô÷m‰4?’¿ŒéÆÒgç˸I5ko¯ŽÝnýö4³d 4i݆¶mÚЮMÚµiMÓ:Õóä͵ͷ¬ÖtëÙnZÓ¬~&G§æT‰6Ê£Ml#sþ·œ¢äýFüg>ùjÑÖy4Ž÷A¥ÏYѲÏXèuàÔ³gpÏÎäuïAûœOV¥¯+¯€ü¸%-;hÃδŒ±x±¢iÛv´oWò¿Y–»ËË!„;ì·Ô¥;i÷ÖFªûœu‡~S/½„'ÉþZRÏÙÄŠæóK‹áœhF oÉÏÜÄ­igrd[Xüæ4žZÞ‚‘ÿ¯/ÙUiIpÒ½}”ßžÁ yÃhgײ©ñþ iÔ…¦<ÅÌé/‘uH7Z¤¯æ—-¥Š—ÛQÇ6åâçÿÎuŒä¨n‰®¥°ÕÔºâu–W…Ú ‹ùfNiEëøuÙB>ú÷¿ølU#޽ñ"làÂÆÏ¹§f­¨5<Ò°>Æó*jÉŸzÔeÏLŒBˆÚm§ZÍ#M|H+¦L{ˆ»grt^}ô¯?°!ùº“E“lXóå{Ì^ÖœA-ê”ý½uí|÷»4=ìbƼ;†{ç”$gGo»ŽÝ:·?g kŸgÞÈx=’a½›V¼†_6¶æˆ£ºµå‹=vîí¥V6Le÷cÌ)­ùÓåúôs9¶ƒbá«0õ—–œu}?r”7›fÙŠÕŸ½Å'KZ²Ón4WSynÊ‹dу–é«X¶yŸ½a1_ÏÉ%Ó/`ý/ßñÁ¬§xgs3N>ª™õ:qÞ M9ﹿr•>‹ömFzÑj–mlÃÑÇv#}W–C!vR­˜D À©;€+ºŸÞO<ÉKŸ¼È/nÀ#Bn‹<žàaˆÒáô[¸+c2“^šÈµk, ÚïË9·ÇIÓª6ëµÎeÀù—0ìŽÇ˜qûß)NoD¿‘]r \{ñîŸñ$·¾Ç‘:èÚ¢N§ÓeÔÜ™3™G^ÆÍÏmƤ5áÀ±½8 mãŠ×™—³ —¬†uѾÀ {t š5§m¿ÑÜuÊôjìÅâ{>¾¿{«˜ /¢Œ®\pÏxܦñØuÿbma”Ü6ûpú sV‡*o!„»ÌÎÏ¡õðk¹vã}eãgø8±l´ëM—\å4âàsNâý{^aò˃é7¶s¹ßóJ&ѬŒÛ„¡âµó&Sþ)Úz8ã/^Ã}•Ö±;"®gߏ“yôµéÜ6s#~Z.íö?›AC»UMõçŽØñs˜F§³ïå™øÇ ÷qå*KÃNý{ÿ%ŒèœÔËNc{*oß2“ ÿ<ˆý.=™›¯XÍOáº×ŠÀB$«1Ý[fý†cï’Û´!Ñw¦ò—?O2rТÛ0®¼p$Ç÷ž1ÞcÌD&Ô›ÀC/Oáúç7à¥Õ¥Ã0ä˜nä´9e”C!v^uÎÂ]ÑV"Ó§O:tÂbÅ&Çò@˜†V’Âd­ — ^Óªô¤^Á"egÝ &±@‡n$—IN(¦5Z©²ë wYi….µoÖ¬M–M…ï­|eöÌø˜Rå²å%¢*Üf©-bŒ!9©Æîòùœÿqà C*8e÷«ì> !„¨NùÖ³øÇèØ¾K¥õnùº¦âeLÙÇV)Ll©‰¸¬ ×Qþ÷*m«|½ËvêØ ênkVQ2¹hEÛ+[/3\õeõÔŸ;¢²:·*ç‚}6&µÃåîƒcfSçlëc_ú>%8Wß­ÊV¾-¢‚moµ­RëÝåBˆU•ºt{^ýuFŒq"P„ÿ·”ú¹(ª¦EåÈ –PUi×®ª`Öj…vœí,³½õ–Z¦ÂÂU¼Î2Kh§Ltùß+yWµÌÂ]ùÅS=ÛB±} UqsvéeªP·(­+_F•«3Ëÿ^¥mmýžß\w+MùÍVk[BD IDAT´½©—kJeunÕî ‚}®ä”$W„.s ·sì·¹²ß^¶Ê¶µ+Ê!„;«*ué®R=#­…B!„Bˆ½œÐB!„B!DìÙÏ„;­:Ô !„¿gRç !Dí't-g­Ýî£5„B±ó¤ÎBˆÚOèZ,=-“ù æÑ-¯ŽLâ!„øÝ)õä‡rOýd+þûÖ¯WöÚÎ=NÉÃÂE È̬#=—{9©s…µ×ÎÕ§ÛªKK^ßñú´ºëR  k±Ží;ñÃâïyï¿oÕtQ„BT¢^Ýú´hÖª¦‹!v’Ô¹BQsª³.•ºsÝ;v­éb!„Ø>~CìÕ¤ÎBˆTu©еœ¤ !„ÕCê\!„¨ýd¦ !„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!öfñÅLùóiœûð| ŒÝö²¦åsgóé’ÍøÕS:!„¢Vq«e+ñ%L{ 3–C»“oå®3»’¥`ÙðþÕœ|Ç<üô¹ëñ+è•©QÕR(!„bgòyÿÖK¹å£5x Jvƒæt8”“OJ¯z”J£a“f4kVÛ©A‹1íÆø~øDj]G*\!„â7©ž°¾ï>=ž›=ÀõG5'¦kðÃ×ìvÎ…Bˆß«Öh6œñô%˰öÇ/ø×3qåìeÜyÏhzç4ã˜q·s´Òè*ÄÖH}+„Bì¨j  “¬-àÓ 72­õ]œÝ5³‚6óÕÃ×sǛ߳r³±ZåÌicNãàVéèÄO¼xßDþ5gËÖaH§a§9¸?¾ûŸ.Îǩߞ~Çæ’º‘›l^÷ó™ûÊ&Ïú˜ù¿&Èn–Ç!#ÏcÔAmÈDv!„{* d·£GÏÔuôÙý;sæÕo2káô걆©^Âk}ïàñó;“¦˜M|ûòÃLzéSæ¯ØŒ“Ó‰?\{£Û«\:u GO êÇžWÏாK¹sÔ5|?üÿxðä–Dx+f2vô3´½ùQÆu+bö“™úÞ<–¬ÜDœLú\r?7mBÄ[Ï—ÿœÄ¤Y³Y”¯iØy0#ÇžËQí3¥‡[!D­Sí´ÎŽb6.å©[¦û?."¯üÊ…M+XYèR'+JAþ:–|ñ"·Ü£Õ?N§ƒYÍÎãÇB«#¸f3¿~÷SÖ¢³j!ï>z´|„¿öÏÆQE|ÿä8.fž¯H¯ã²îç9¼pç8Ö§?ÈÿPW*y!„{2¥PJŠhz&ëQXì6Èò2A¬ ~|ö.¶ž>üëÖ6l »I45Dªá°kDc"J“Ñ4­ÀŸ2C¨Ã 1c-ø™÷þ',©2—ŽéN®¿ݾ®*fጫ7+ƒãFcLãÍÌ~j"÷×4Ÿ4–ÞYŽ ËBQ«T{ßk«ãÿÂÙyÔÚ7¸e¬JXÊf’¥Ñý’)¼úü4¦Lx€GïEG¥°Ë>eîú`Êk-Ã1wÌà•'®¤·«ÀX:^ôÿþç$Îk£PfŸ½·˜Bk1ë>äÁç~Æó[pÆ}O3óÙ§™66‡M¼ýÌlÖû’Ë&„bf$âÅl\ËÒ¯^gò„³ÆÍã€ö”öl7ÍaÊ3?Òð„kæPè·/v(½ê¹©`6­^KÚ·oO‡ömižéT¡¬%³m?÷Û‡~û¦oã(lšÃ”™ËéÔ¯“MnÝú4ÈIí$8ÆúXª’ÈU)تkX)"…‰ e»ª‘µñ0¤Ñÿ’›Ý%-Xƒ"½AŽ BQëÔ@ (‡ÜÞâÊ¡Ÿ0î?kKÆ>ùKb³µÐúN~$Íý¯ù|ê+,ÞR…õ&WT®ÂŽ5êJ3þËB6SØx0#‡w!DZ$Ö¯`}zSG¤†B±«Ó’®Ýò¨ëT4—©ß摘ûÙrâÝ;Vú NŒ¬(äâ—”lšfÃ[?.§À¶%­ŠÅrë·§y¤˜%K ÉÐ6dhiBQ»ÕL  ³ØçOrÈG7ñÖƾu;t&‡Å¬[ò(œÿ.mëñC©¸÷¹Šœ¦‡0úÈç÷ê¾~ü/üqªKDû$L”×OãïûÖÙ46!„¢U1åZåöcÔ±M¹øù¿s#9ª[cb…k)luµnH÷öQ^|{/ä £]˦ÆûsX^cÒŠ)Óâî…WýëlØÎ¶tnÎÖ„?ϼ‘ñz$Ãz7!­x ¿llÍGu![¦áBQËÔ\ 8uû3æÂ|rÛÇlÿ––w67_àñgßçÛ_`ޯ˥E‡ž´­³ƒ³yª,úŽ}€»[<Êc¯~Á‚eë)ò²›¶§‰ãc¨ÙÔ„BˆÝ".£îäΜÉ<òê4n~n3&­ ŽíÅm3àüKvÇc̸ýï§7¢ßÈ. É˦Õðk¹vã}eãgø8±l´ëM—\g{:]Ͼ‹;s'óèkÓ¹mæFü´\Úí6ƒ†v!»*ó“ !„{‘ŠªÄÈôéÓãC‡-5–ig…YPÚA—^mr2/ÚÑC³ Ö”›[)´Ö(,Æz¤“ë²ÉGohGï7Æ‚Ò8¥6f­ÁZ[2ôK)”ÒeË#„BìA¬ñ1”­ÏÊ-N¶¹­:O¡t²¾+©“ðï*Ü– Æ@'•®{+ØFÅÛ"¨[¥rB±yýõ×1bĉ@!PþßRêçB ¨šz ZWÒ ­4N¹—”Ò¨J[­ºÜ”v(ýUÁ:Së•ú\!Ä^¤|WÁÖ±•×y•×ÉJëJ¶µz|›ÛB!jÉ\B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª@h!„B!„¢ $€B!„B!ª šž-Dʼn8~ü.ùùë±Øš.ŽBT‹V-ÛЧ÷~(yx²B±W‘ZÔ¨þ÷YY9 xpMEQã‚F4[a[ÚÖ,»ÜÎ7Àiíìô:¶ÅZ‹µ€?ù€¹ß~E÷®½$ˆB!ö"@‹µiÓF ‚Ö2š@ñûÑ»g_æÎ›SÓÅB!Äo$´¨QJA$‘!ÄïŠã8Òp(„Bì…$€5J)%´âwGk…ãH,„Bìm¤ö5Jkëº@ !~W´ÖÒ-„Bì…¤ö5Jn …¿G …’ï?!„b¯S;joo5ïM¾•Û_YF±< i¯¢Tí¸…â·Ò’y#„Bìuöìè%¾˜)>sžO±` Y1w6Ÿ.ÙŒ_z9³y|ÈœåE˜ŠŸ"öPÒ-„ø]RJ†®!„{¡ýÏ‹çÁE>¦ÂW;pé#—Ñ I3š5ÈZê‹1õÆø~øDj]§ô½‡µ»à) ¢ºUv¹é£q ûëw|ë4®Ý/§ì¹&΢ið§)– Ÿ˜Ä©-"Èm¨bo#´B±÷©ÑzÐÅ7Ðb“ÄYòâ]<ô]wÆ^q,-c ådÑ®~+ê»c”F‡÷Ö¤“¹ö¨¸ÚgÓòµÄý|^½ÿyN2ŠÎi:$›5ïòÀ“‹H$²z³‡µä>T±7QÒ-„Bì•j4¶QÇžìÛ§ûöéM^ä5!oŸ>ôëÓ‡}{u¤¾ú‰ÇÏû#úŽ"S5/:†£ÆaGãò6Vœ¶XÏ—ÏÞÆ˜ÓNäðcþÈÈËïç•¶à[°?çîóF0zÒ\6‰ÆkRÅ7–çC¤!Ù??Ïä×á§NS!ß>õ(ŸªÆdPÀê‚0™ß_ÇG“ÿƨSçà!³ÿã¸ä•$äô !v¡¥Ë~â±Çá»ïæc+¨{,øŽÇ¦<Â’Ÿ~Üîº$€B!ö>5û+¥Â^E•êATeþÖ÷ñ eÒ³»†ñG4&¢4M3+˜ˆ¥˜…3®fܬ Ž=Ž173û©‰Ü7^Ó|ÒXzaIÄãÄ'‹êSiôª-ضgrYûç¸éÑY,4ŠNi»æ}zyûŽù3“ïaýf/|K>ß¼ó!?Ö?«.îE®ÙŒÓ±>®ÜŸ !v!­6oÞÌëoþ‹¥Kç¼T üÝ‚ù¼ñækc¶ûŒgé®F]y7®vˆ¸.®vp]—DÂdzÇqp°(¥ð}å:h¥ˆD\”ÖX­ˆhe,V;8J“ŽƒÕu‚÷;V)¬µ(kÁï¢\…Ö«Ai…õ ZƒçyX㢵ƷA}©”ƒRÏó0Fãà³víZ0Á{\×£‰Œ!â8¸€o ÖÃZ‹oÁÕ‹ãâŽ"‹ŠHXN­5éh×!êe0”=¼ïS( c Öú(‹VGi”Ü#hå`]µ–47Š*5®K+…5ãùxž:8¾ñx¥nøYô|/|þºCÔup”‹g||ߎï‡ûfRË‚cq” –A[¬µ¸Va”Áó J9XkñÏOˆûÄEXë«À÷}Œ1€N=ÆÓ¸dffáº.éié¸:®?(«ï|ãçËóñŒëºø¾‰¡ ΙR Gß-ZëÔyòŒÅq4Ö÷ÑèT§Sé@­Ö ­§ƒ«5®Áb‚Çî9*¼©J®_k”Ñó0> hE°…«\Œ2(­Qáukm*Ÿ0õèû6,Âø>Z)¼D”Bkk ®œGc ~ ¶e ÆÚÔubµBÙ0†0¦dMHÄã ´Öxž|¾²Áwv$;Öóñ ®c ¾oÁ‚1>Q­QÆÇZÂÏQpÍ8Ú1'BBƒ£¾ñÑ6<'ŠÔ5ä§Þ ®ãb¬ ®ãѾñq”&‰`Lp =3'Œ’| ƒUJ¡Â×’Ç4¹ïž±ágÏâëÇÅ÷}L ?{Á²ŽÃZ?Ü7‹çû¥q¸nð™±:(ƒµëÇ­(ö(eqœŽŽ„צÏ»Å'(‹¶AùŒ18Jc•Á³ÁqŽé(Xß<Ï >—ÛPèàºr5J9håb´I­û¦KOAëê©W÷Êç@§ÕkIûö-‰†_Ä˾n7ÍaÊÌåt>ïaÎÚˆˆ‚n×ñÉègyuÑ9ôêÕ—«{‹Æ©¦-*Vá,Ü6N~~ºNsö;ãtºžõ8O|q×ïŸÎâ™OðEÖÑ‹µqÔzܨƒïY A”ã •E©`9¥\ü0S(¯Wi0>ʆe4A ‹²Á2És|ßMØPI54DÂF•d¬ F“Ÿ¥T*Èt]7h#‰^§ QGß`ƒ KÄjÒc±Ôû ÁužH$R/AÃY²,n“(¥ˆÃbP¢‘(¾op $<å!´ëFRÇœ œ&ÙHœ­5Æ ‚^n/î%@kt$‚ ¿›ÂXPÆ ]ÇqƒuzAcï,`-$lpL"Ž“úìhíઠÁ kð áù[\|ƒñ žñ‰ûÖóSƒ®ã`ÃF-Ï÷îDP &Ú˜Š>JL<S½wü{ela©¬ñ>±fK‹<–?pGOÿ~A§­.Ä´œŠ§ÃVÉ2=1¦ˆüHoE¬YoF4+§½Íò.M˜:kÝÏ9‰¼,/2`óºB| ’z¿FkUm-PBˆßŸ¼.]QJñúÿá7_cùò_øvþ<Œ1~ØPºæuÛnï²V%7¢¢öˆ(ôx‹Ž„Á‡ÕA/²…ŒXV+¬õ‰š ø±,Ö| ?AÄqHø ¬ÇwˆôÀxÖÞ™A²_Ò å†ATò&=è ÔøVA…±8¬ Ö›ðhcƒS/–Íb±ÆZŠ<å=v©Œ?ßÃÑAî»:ÜÃ)a‹‹ ‰º q¢™a¯¹ƒÖõÖÕA|cƒàÀVåA‰RŠDÂ#¤nì]í‰E±aïVé@k-¾1Á1Oö jô‚&@tªq‚›uöž%=’J“ÒZ‹¶_Y¥ƒûÈägÖ(\мb”Òx “ ‚ÒÒÒR½Ì¾’ÖuƒýÑn¬%{o1†ôŒRÁs$ì uc‚¿N²çWá8Apq\¥¦ã _•º¿2nIϤõ ìðø…Á[ýé’ìÖáud(ÝÈ¡°Éûoc‰D¢©õà8eHmËZ¾aÖ…–ݘàšUapì£Á÷ ŽRÄã~Ðk­`ñâXŽ«±©@Sc­ñ‚ N™ ضáužÜ~²£Áu•¼æ’ç ‚FKÉyJf©h¥ñ^ªÀ-ÕˆQzR(­ƒÞÙd#—“<ÿaãPò;C‘H$¼Ž-¶tGVòÚ3[Æ{”U*@µA$M®ÖëqRóU™Ô6ƒó|Æ­V8žöz'´*ÛHá J¾JGÇq°¾W¦ãM)…«ƒÌãTï˜Í½.€®ñí$ãaH£ÿ%73ºKZ©EzƒIë݃Txé°®À’–ÅQÙô9ýšz’ fñ‘Â]7!â®%7 Ö–{¤™BìfJ)ºtÎàõ7þÃÜyßT9x.½Q»¤nøÂÔFÇqÃzõƒMe@‹v S–Æøa¾ÕAð­qã¡Âéj”ß÷RiÆKqtì,x¾kñU¦j­_LG’ÿ¢x&‡ÂûøøaÏdبÂóÃtf«ˆh ø*è1²ø¸eHDñ”ïYâqÇU$?H¥w”ýdf@,Iõü& µ%âjŒ ®E­­ñMÌ—Nóµa°c•Aá”WßÇ {ÇSi¾Æ=„a6‚çy©Tôäñ°~p«nÂF¦[‡Ÿ” ³2“ðH$ø¾¥° k-ÅÅÅa¹ƒ@Wk§º$ó€ð:QŽNõVb:l °ÉïWkQÆ ÂõÅb1üð\§VÀ„sJiâñ µ5hŸ¥Ò½õ6UŽX,ì‹.Õˆ¡@ë’`ÖZ‹U¤®·äùÕ:8Þ(‹B§®Áä¶’ïó=¯dŸ“ƒ_K—Z© I0Œ(Ȳõ^xm*}?î%‚sj|Ï[©cbŒ RÅUÐ •LVÐ6hH–#èõ6h'ÈTIdx„ÛJgÏó‚F´äþ)ë*\4¨ù6ùw…öØcÆ ,XˆE¢ÁqWß|/žÚ ñ'Ȩ{WíÄÈŠBA~aZQêæC)R_jnýö4³d 4Ú† -©¼{ª o M!Š ­N D[ã¬^Ó¹þµ5´<ëZöÉÖ(¥NÔ²eMÐBˆj— ¢•R,ZôíÚ¶§K—¼Š¿Ó*\AÐ -j—Í[ I·–X,Ê£¨8H/Äü⛽bâ¾GÔuˆD"h.Aª1”Acqü4üD7CYÖ¢B‹A(ªÊªŠ q"yýh‚y˜lrȃ zÁ1A³£5VYb¸˜p_ÆGYÆà™`È…ëºcq\*kòú ¶oSç3™`mɵbm¼d€(E29=9ö=ÈlPA¶oÃ4k}œˆf_å±ÖUÁë Ž ‡44 T逅plz¢8¸æMª1Ê”ú¬(¥0áuãFž‡¶É¦àïÇ 2ETI£Br¬µ5¦Ò;:œ÷J9hH²‚rxÆO5DY6"ú‰m9ïb{Wí6¤{û(/¾=ƒò†ÑήeSãý9¬SšdÚ/ßcö²æ jÕŸ³†5áÏ3od¼ɰÞMH+^Ã/ÄQ]ÈÚò÷\yßõý+÷ŽîFI÷­1ö@›b6A$#~Y4`È£9îù|<¾ 1­—ÌtMñ† Äe¦m!D PJѹS:wê’úý·¾_Ô.Ñô4"‘¾ñˆ:éÜÔ™¸‡ñÊ÷‰F£ø~?'#’¦‘;ø6Œé¶†xa¾õðÿ?{ï+ÛyÞ÷ýž÷²ÖÌìÛ¹gÏžY³Öœõþ·Ò›µ×БóEÍ&RJ™s Òd缄z>8G%¥JsI°³À¢·ÅÙ4ÖåK=_m!f`]䬔’æã@ Ô¤€- §*q§^ ¯×üéÐî ßûWÿM~ò?ýïùŸÿÚİ|€ïúWžæ‡Þñ?üWþ%>ú_ü_üõ¿ùA¾ëßxÏüåÿœÿìÊ_ç¿û;?ÏòÜ%/®ðØ÷ýe>ðá§9¡q×=0=p>À⨛{ÖVOý ÿÞ¿oR&ûOwÔÃ×nqžá¾×ï)æ0‡9Ì<\üšì‡Ã¼)FÒ–I3ÙÁv3°)#Œc½ß(&}G*u‰*8HT2]ì¸À‡€k²äÈœ2û]Õ9z-5`‘R"8Gç<“‚¸ )²'hóžŠXzmV|ˆUJêðDoÀv"Ù n)øÊ1Nl×çd-¤‹Â½ÆÑ꘲ºØU€™JõÆaš†šédà)ÆhÒWïpNiAX¥²ë¥¶ÓÖ˜õÔn°#Á³å½G‹±`í&¾y˜©€;£ ÓTA¬±®‹Å‚"B*…]lð6S!¨'•̶$¢†r>öäm²cˆ’ÆÄ´ÝîÀI•Ðk b<)[ UßuøÐ1eÑõ3P6@lÊ‘Á…9aºU kcöêZø›«àÅÓ˜R°Ï¯©©+P æmrövÜlÁª\¾\íë톜3Ûí–< ãÈz ØR‚-NBìX-–, “aÇ…1Ñ [X9çX.—øi¤ïˆ@ðÆÓfœù´L7/#R)È`€z €9™ñr •Óy!²© Þ@e˜—8˾³k™~æ„–L^ÕdÕ©¦`oK—’w×eN‰\L©áª|¶H•ÿ{7{•›¿ÀµãŒ‚GÕU¦Jhx°KšŸ• bŒÕN öšµ£ÿm.Öˆ,HÃÈTlÙà.y³c0¥À0ŽÈ^]ç4Ž¢»d{ qó³÷¹ùÞÅØvNqõóQDpjÇ#û ÅÎÙ®35Bé¼^òmþŸþç~üð‡?üºþã®%STpÞí=©ê¸”–ÝüöRMó4߀ìþn»Xç¿;K8Ú¼'é8Ì2¿ñ›¿Ê~àG^u®)%—Zãñ‡¯3–89’Õs˜Ã|ëÏWnó…/>Ç?}Òo¢ù×ÿ­¿†âÈ‚ ƒ$dH3 §íÌuqA×u¬VÇ5Ì©‚“X¸Ž Õ7è0Ƭ.ý‹T“ ^Ë,ÿnÞh)ÊÔ˜¢¢,œUØ´¨\ ›@Ó¤µºóòzqxÍé,Å;çL@™ÒÀ+·¾Á”FnݺE8=9ãÆÍ·ÐwKŽV'øf¶”BªÒó‹í!txg å>ìB¤Ìûè ¡3ivõº¦4—•j;À'3£—´à]Ä‹šTT ¹2¾¡²¾ú-½7oÛiN)N-ìJª<vì6Ž‚C\FKÀ3@†!—D,—KržX®zŠvÄγˆo`É+>S¾Þl˜.ü22©#kN¯Ÿp~¾Æka;l·[<;Öt˜&ö~¥q˜È6e!"ÅŽT¸#[’¶cšeí3ûÌRuŸýlçF=ïùnw¹e:W‡Í Zík%úXß™%Û¥ÖÛ ÛqdJ:™„{¬ çk8\[bˆ=×#Á{ýªú—¨ÂÉÉI½––„ØáÝ.ˆË¾ßáüNÚ¿ÏÀK“K‹3ìÝüúÉ•Ýÿ×Ы¥y´û]¢7À˜ªØÒ©fíI÷[û‚«²çœ­6Êculyïï¶tj;öÞ2Å®í®‚f©²îýätØO—×ú}Åäú5i4`¶“b*aœæ¥Ò4M”)á\˜ÍÄ;ræs«ŠXÒ¶©,‹ wíü£ÈK©ªïk¥Ÿ mÏÓ,9gºçç¶ôøÿíŸùãº|ä#üÜÏýÜO`]]ìý~l¿ehqž×æb·­×õ5Ì»ãý«¾äøƒïKþÇ8Ìë>ðãkßË?ð{/3ÿdßs˜Ãæ0ß cU,oô³8Ì7{ÊjGŒ‰am^N©aRË“Sú¾Gœã¨["±ÊdÁR¨:D•¡$|ôa<¨2Up*Þ£R¬£™= ê„cyüž47çiþ9>võfYP¹Ì•\Óqë[EªTuAß÷”R8½rTr x²Î×Åb…xgÞÖh7¹c)lU¿»ao>ÝB˜´ùsóóŒ>\¾O˜e¹» %€)§ 0Ì,¥ÐWpXÔº§Ê˜ÈEîmFÔëÜG뜱ÖªdµHC)LyBTYQï˜DÌ*Ê”ZÄú¼ëñúI8:êX®"/|íErò<øÐuî¾p—xO>ñ(Ç«O¿ãQ†‹¿õ~Œ“G¼xÇó—þüOñéôiþÆÿýKl‡ç`=â*û\ÄØRUØN‰®ëèlÇÁRª5@/ù˜S ÈS!9;oJ©IÛ%Õ*°'Úóý¦ªZÞ¼ó-•ÛÒÊ|ŸÇ<ƒÕv¾¹à)•ÙõÞStçÍ/¥p¾^ðNjL-–D/NG S ¥L‡Ž ðx‹çÇǧ8ñ,WÇ5fÕ•¾VqZΙ)í– ìºy“ç0¯œÒ ô¼÷U~¼óIƒPÄ<ä¾Ê³ÏÇñ5áfS.HÙ…hµþfç®…ÔÁÜÿ.âæò–JÞBîv*LÉYÞ½³yK±¶¤ú¹{¶§mà\ª¼½I¨Ûsš¯ÍÀ¶èíg§lÀ~] iQ”aÈ93ÔåSôÆîw]ÇbÑ‚-©ÚÌ‹Aiä¦ý×zŸM12¿7UþݵnøªÁ;$˜ EÔ:èçðºW-^¯ù–Ї9Ìas˜Ãæ0šÇ«uÑnÓ–€H0VÐ{ÏÑ∾ïçdè&ItPuÁ 9[Zu Dï Мæ*cš<ÙÙMcçŒjýÀ*R=Êkm*ÕZõTÙ¦æ±KØU.Ë;½p’}êÙl6¸Scq‡a ï{ºÐÏO9gëã…ùù´›t uªà7xœ÷ÄÕƒìúcaDå™ÁÛœhÞ@Ih7ì¼£df!ª-Q¸ùK‘9#õF߀O[2xëy®Ï¿sžß¬…"&¿6ÑÒƒâ-<É1Péq³XKMuw&/ë•´Öãäy4)rMÆÑ*I•Ê5¨(ÙRw}DB`”³Å“ÛŽ‰åòhfìpñ¾SGI ñ‘4™ Û¹@Î1Z°•sïâìa-Åê,ÔHk¥Žy6Eöê§p-x©ÊV¥²À%7™§¦LF)Sí ®LUI¶ã©ÉdÁª¹Ê^µÊ¨ ]·j •÷Þ*»\R±B¤¢¸ |ŠV°\ß›’F|ìªÀdÍMQ°Nfjr´8c?KÉè^jvß÷&£Ök>¤‘Åbaì³7ð¶G¼ h*ô5t.ÆHì–„8::¦ï"Ë•½žvî·EIû¥‚ ¤–ªM™jGÑ]“U¯Í _v•g9gœ÷3ÀT`Ǻ rõX©Y)àLª-N•9mºÈ\V¶S$í'—Ûûׯö‹ÈÌ4·j¯ù÷•iöU¥Ñ@©½'ç÷|à\fªëm!wöÙq~~Î4M Ã07«ˤq ÔÇòÞ#¹Ðw †ì,AÛí’ä;oUôíÀ×Ê-UbeîK)8µJ1×?5?ìñæžkïg/w[˜¼žsЇyÃç¦s˜Ãæ0‡y3LWžÝžÆ”ÜnŽreaû°°ù€I's©÷‰‘Uï ÁQª¤R¼'ÖäåXÿ½tìØ£âŒÆj }¾q.…iq] hÄÇ@vZ¢±ˆ3ßf›©…o5¯fÈš3>F óçF|eŽZPW)Öÿœs6™¥ÚRaœ¶l§Ñjw|Oì:–‹­ç׋Ãu—=©d“¥Ö×Ñ€Q·èpÉ<™Æh›WÓË¥ý쨌ÃÁú…§äÑLÉÀ$¨ønelcÌ”Éã< #Zð¡÷RfutÌÅzÃÛçˆß’Ç#\ùŸþÇ¿Áý>`)ëIqAÉY(yBèH©JökÇtÊ â(Ùü¤Z™OUeÊ#^ ô]7K˜Å¹½:4«J²°º¸ç‡ŽX]˜tk*¦­CÚ G ‘›åø{Lãv4¦s³Y3Ž£ýlçðjÁgÎyBœ­ˆ!Ò-,=ÑùT•’(EH%“³e&YºzÁ[&ÅØÍŒ­gµH{ri-;ƒjMcÏ™#ã8X&YÙÝ"l';Þv~%&5Ÿ.âvþðVB09~ÆÞ9BÎNçdq€àwÖ†ÐíŽÿ«ÙéÞ{´¢³XJÁ…WÕvµã•,É:¥DÖÌúb3÷rß¹s‹”iÑÕз Î×w¹8¿GΦ{ œ¬N99ºßG–WNé— \ÍðÞ[ºstR¯sm6‘ÝëÀ»ùZ§.Ó\Weÿ.›Ê¥½†ˆ³”ÿœ9H¸óm7»„ÈÃæ0‡9ÌaþôŽx:©l‘à\¶@Q‚,ºÞºkc@“ÌÞËR }ð,dAB‰R2ã.¼IÊeùl®URS¶: ÆêÂ.Ì!#8Á«Ý z'ø bb­ò9ÏÁ_RiÇ®^ÊÕà2 Lõf6ëuh,YEÀ9œD\œpžž¾Vа×ÿÛ<Õ*JZOdTÇD±5á7³è‚¨åª§dÙ"bòv dˆ]G.1RÉø>Zò²˜wutD&»…y>—Ž<²^€®(¶ãÇ‹Èïxˆ¯¿ôuž~òAî}ã¹ <òØM¾tç瘆{\»z„悦‰4®Y-<¤ÀéIÇråü9ÁÕeAÀ±{¯&”Åb1Wh9ç¸yã¥$¶Û-«£Žã£§…û¸Ág?õpÞŒIUç»vñØùu¡±{ í3d?HmŽ&Ëy¶a ƒ¥¤ç”(šØn )l6l·[...Ç-÷8^,¹X_ ÎÓs‚[Ûç‹øLJËzÛ9Qdä³î>Ó2 U Þ¼è`ùA\µ(Xœ8óÍ‹ì*Àö«é^9èü¡³\ñ™Ï}Šw¾ãݯûÉ˜Ãæ[evm û_^õõËÉþ쵉žúÚû'šâý—þ£º ;ùÝÏŽ££ãƒúæM6GWNÈcí%-Š.øRp‚ÉŒ©m.(h E*h%R€EpÆ Åe­Rg½¿tã,jlqt;fJ´Þ8Ë.ÍW| j²OXo } ðÙcßÚ+톩Këòu(.zÀ+ƒlÝ´-eׂ—rQºãcV!ÌÉ¿@õ/ïÀD˜¦Øwó×›¬»1m&û޻闈†LN‚çhÑÛBaYÙïpL)–¬’€€ÁEe»]sõôÌj‚$píú .Âן¿Çéé ½w¼ðümžzìŽüÄC7ýä¸ÿ¾3ÞñÖ3$%¾÷ƒï¡üê§>ò¯þ쑆W gn¾å?òcßMH[¶Ã9WOîG]ayõÈ<²yƒJ‡OðŠˆ#ŠÕ ŒA !§ï”㣑D.™ûï[á}á±G¯zå»ÿÌüÆo~Žgßý8Ÿüäs<öÄ£<ÿ•¯3N[†}à|½f¬l"0Ëz›öâb3^^lÖ””‰]GÐEºPƒØŠÂ1Móyfì°Øù¦:ÈÙùZß_1 ²)üÌ.­¯sS¿³~P$ã‹3¥‚s¸½÷6í³upv9h.k™ÃçëÙêµrΤº Š1"ÍÆP¯™PíMæL)à—ùzñÑÏì}Ù÷\Ö~öž|ÚÀiÁ¹|fˆ=¦Ø:È÷%×`b(”TåØÒœÖ-j5wªQÇTlÁäÅQ´ u ðjßpëQßn·&»Ï‰‹‹sRÞ2MÜ6&càûe‡jfu´BB ®–LA‰ÁáÕÓ¬°Öt}/¦¾™U3¥P’Ö$S;xçðØ²…)ÏAf¯þ7½IÇsN”|ÙÇýzÍ@æ '’ç¾ð;ü½_þ…7ú©æ0‡9Ìë6×®^çm>üF?Ã|“'H Dcp’ØM9> )‘ 9#>ÌIÏT©´÷žÐ€LÅªŠ´~Ý9;@bVSµ°  .^b©íç9reˆ |8ó¦6o$b¾Çý$î tDÅ•›DR̈IJ_AB ü#Æüe1¹§«à"—¼²1\¥”Ê ïäã  ì$èJ×t¯Ã×{OÉ‚ ÅÂRœA«ÄT«Ìv¤ëHA± ,«šX-–ܸÿBâ¥^¡ž§ÞñýêoÖ…gŸ}·ïòþ÷=E×”)“‡‘aH„#cÝÏN–\Y,8_l9[yRבr¦tÊé}GhI8<Ž2÷þªf|ô ÓDŒV-FΤš¶Þð•æBë]¶Å„P0bðŽO|ç{ŸBÅó…/|·½õ~¼/|õkœß»Ãw¾çY>õÙÏÀO' ‹“]oöjµ0‰n*Ï d®³_ÞYØ@LÆ”šìw²÷˜åÝ Ð]=GöÏ›PÛoöÏO ÛYùúºìAÕÂîê9*£Ý‚¿^ *í1pNg zjíÜi ÎwwÝ6Iyò @‡°{Îûÿk­|™¼ ñÛ¥f»9Lm~\Ò˜Èõ5OÓ4ííÂÞäR‚x[€å¢{×E™?Úì/ÑÚs,%£ê(©²{{àÊÚŠgµs-Y¼yœ‡­%¡÷}OÞ sïuK oVR"v+ºþ˜åâ×Ebß!•ýŸR"ÔžzU%M…¢öû ¥˜Â$W]œ¿ôš.³åàü4«ZÒ¾–CˆØa¾&„ÈSO<óF?Ãæ0‡y}§¦¤æÍ5±v@Ï~¼z£/Þ¡õ†O°”Þ.ûU°þYªç±u9·P Š’[}yÝd™rY>:ßT²wS^ M êœÌl°É]kº®*¥²OÀœt+õ¦_‹’Ê.õçñQg@Û@q{^ŒmÊR}Ûµ¯v y¿zÆÂ«òüö»iE,¹7Æ„R&“ãk± Ngj/ÊñÉ /¿tË^wŽÄàÐ1ñÈc÷³’Àf}¤ o¹ï˜´Óá©Çopí,’†%Û‹{,Bb¸·F®/+›ºåú•%#…UïˆG§§lÇ-ggÇLcgaSÞGRž,K¡¤„ }eë!å„&?w5¤¸õàzoàG‹1‘³4Y|æÚõD„û®ÐùÄõk'xWX¯×xŸ¸ÿê _{ùbˆäª°§¬V+rÎl6›9±|;„ÖN` ]fo.@Ìöç%gºÔUUBKx®½;"‹Y‘1Ûœ³z±v>T0˜÷êÉڹ蜳ôùÒÎù2ÿhJ»0viïU"œw)Íâ­«¸]ê55Må5@Ô9 ÜŠ±¾1µxüÛyXá ˜x™™Ü¢ͻסªtÕëß%Àv½™—^v`Ý@xóï½Ù]ßóñªÊޤ»Dm;Çã4YOs}\_ÁpRšæ…À4%¦1Í¡píøZJ´tìà‘a`;nQÍôÝß-ñqIVöÙ‘ .Úg˜¯¡kTuÊ4ÚòL1v\œ#8[–©ˆ#ëôTËü¹Ðù0‡‰•½€À×sú0oø$Œ‡9Ìas˜7Ã$-¤R, ÛÕï[ »)­riQ˜Èv3_“±5[š±Š±Æ"&v]•EÞ /ÂXòì§UUÆdA`ö…6_aß›Ì9O“ݨ¹Ú íƒ1qSNs7³u,Wðî|Mûv8vŒÜ˜Òüû”3¡yÀ±Ey«b²ÉÄýüv~ÈÆ†pÁ¤sj¿dÎÎÎP.ÖwxäÁˆâùÊó/qžÀ‡Èõëg ÃÀ½»#e‚>äùñü÷—~/éeJ\rv厖=÷½ýïn¢L¼ïñ©?‡äÄÍû„;ßø‹…ÉÓŸ}æa>ÿÅy÷“O³ ï–ˆ ¼í¡ë–.à=HI,Â’$‰Zû3$ú•CÔ3ËÅøÀ”¶øq.°Þn ˆHS¦qk燺ÚùëHbÅBq¤É*…~䇿$SJ ”ë¼û]0Ž#O>þV^xñŸüÔs £Õp©jeƒ=ËZý”J&§ÓÊÜFD´þò•öM,Ú$O&æWû;ÖOœ,¡[­ÏWŠÒEOÊ:ƒðœóÌœ–çó¹Í¼*;¿o*ÞGsé6Ïký»Í¦ ¥€zT=Û­ùdV²Z×y»Z5UÝóïÝÕ.5¿ˆRŠ»ÈíZØÐ- Ó¬ÎpÎ1LMI"3ÀÛï\6öÔÈö–†‰$» ±¬e»}Mð7 ¿cËZWg;åD)Ê8õµ«œjP –Bß-ëGCž+¡²f¦aºä«>>>f†Á±¶„à™&áhµ`Ä£S¢÷·èˆ¡çìä„€£[-çÇ-Û¬ªÜ¾$[ eÍóbePË%§.!RÙäzM‘aß»ËRRxÓ}˜Ãæ0‡9ÌaóM˜ì Ö(Ïé¾!ºê¥2‰Y ‡N…ìÅ xÁ‹ùÿÄâÐÊäR˜Î›2Û£˜—9çL¤&f™©ö&»XoÚ© B¥z+íFtLFBÎe–¯6 qc·Œ`KæO® ÂÀÆ.íW+x,MÛíæã²X,¦Ñ|¬©@*&MO…â”Þu&öµjh NÙ–_úý¯ð³ÿÂrëk/ó;Ï}‘Ÿüs?Èöâ­|ô£¿Ë7çŒï{ÿ»yùö×øÜg¿ÊÅzâüÖ‹\{è?ðìcüÃÑñù¯¾ÂæöWÞ~“ÍúœÞ&º€“%>tJÙ*ÒE.îÝÅKºEäþùòïß2àŽGž¼ÁW_x‘~¹"Ot[Ñ12€x ’Êe@deýÄ! J±q ³ò8ï…b}d”â(j>ÜR 8GÁ”+ª‰¨Ü÷°ºP«¨Šyší¹8ÀíG¡Õ!ð‹ÄS=ß­ô8ãX%VÏæpV×ú¿Sž¦j¦ Õ_—K³}@Ód>ðTm yª•Vb騩.“b»–¤ÝÏÇ4ç2/¬´._ò”v‹Œ½Þö4fbíWUú®›—e)¥×$O[ø×@)Ê0 ¶€È™©&š7{Ji:58uyјë#Ó4c¬ï“õCû. ÷ϯÕRù9¨D\J3`/)¡ãš¿\ÄÀ30Õ °¢Š$³x õœ¯2ï<ͯµrÁXm- ç#â^_ÿ3ôas˜Ãæ0‡9Ì7eD¤58ƒ‡Ý§´c™M⬨3¶J|4¯°7ÉcN:WÖÄ L:’Z2mÖ2{Kw2m(9)ÄÒv`GBÀ;ºEO×u¤rY²c ”Ýcµ`¾–p=ûŽ÷*ªv’Ï$¬5 IDATi¾)vÎ!•›ÿ~pŒ©”¥TÙlΉ¾‹$¬“Z¢ ÙR±—㑇opýlÅW~ÿ˼ôÂÈâÊÄâè*ç#çÏ~ø¼ýñ÷ñËÿϯÒugüèÝÏqÿ$¿ôÏ|â·yïw>ÂS?ú!ó·ÿßó‘ÿí7øÙù|Ï÷ß䃋§øÒï½ÄsŸù>z“íú#™‘Å•:)z±å¤$Élη-Nxú™·qûÖ9§WŽIcâêiÏÑêaÊ4â]d½Ýâ{?W eQµ¤oïñ±@.çœ1–ÅÒÅr1Qcu–M7v-ç„˶lp1¢55Ù#»P)œ%‹Îá%Ò÷…‡¾ÂÑqä«oçSŸü®Ë¬–=ë-Þº^·&½žR™UóbDuƲÿo,¬T€«3°« Ž÷ƒ´ÚcÍþçêk}ÂUN..ïüʪL®zå›w×¼ÊÍ\ha`ÛÊÊKcŽ‹öåªÚ5¥ÀjWÒ¦)ã¼-/’Øâ«ÙlB•ãÝà5¼] ©þu7'äÏ^é9ÜÌöJ1JóM‡ç×B@‹©Yú¥æ®[àkvsréÚoÇi3l†¡ÊÃólφ¡Ú¦bq»k¶*]Ú4Þ>"}ßÏiåÍö‘RbJ. ÒˆHÈèÈ+wiò­Þ3Žã%†{^ 4<%ˆ•nÇ®ýÚlGr6¦ß ãÔRÄÛ;úúÌ@æ0‡9Ìas˜Ã|FĘÄä³è3&QÎ̤Yš±´Äßð5X(Ïp¼2ÕŸé«l;7–¦âl]ÛaðÞPJ"å@qÖ]’õÿ6Ö¯É&/%×›óXë¯Dí4ùè>Ú½îÝÍðå°ÚßœáóâX#«eÚ‹e`3lqሢk¦±à/àæë<öÐï~úí¼ðü×øè¯ü6?y“ç>ûy¾ô¥»<ûÌ#<ûÞ·ðk¿ö"·_Œ¤ÕWøà÷>ÊË··äq$•Ì ¼ïÙûù\ÁK/]ðÀõ#6÷nñîw¾[/C^s´\1M!›aïŽ- }½E—‘®ëØŽ#W®s÷î]´$ÐÈ6ƒFcó1Ðá] •„WE³åˆó¨fœ·Š–ö~Šc‹ÛqõÞ@X“ƒI¥ÊN¶Ë”aéT'DwÒ^Þy¾ãÑ·â|B’ãsŸv\¿qóõç‚Uˆ¥ haaÕ›¿·hik•ÙÛ<ƒasôÃ^hݾ/W•iÌ3ˆš½Í¯ª€j²m-vÆkJ³OߤҶġD EÊì™·Ÿ·Ö–JªäTÌû+‚:pÞW_æEÇv»¥ì…=à¶ÿ¸v 瘝öý¶¯>&íZr) ¥Ù7PÝþ~ÀXi°„þqQgêK¦œ¯K§—ŽeÎy–Ž7vVÕ*âÚslàsWW^,‡!TY¿aN"·×œgö½=ïÝÏ.Õ³lUyí³ƒbË­òôºd¨Ç¶-š/^uW·e‰âréøîè"˜O>O–`ž'riK™C ÷as˜Ãæ0‡9ÌŸºÉÛ©zL-ùº ”Ò£{=®^=S®òG,è'Lvãš5[}®ªXљəÁIðHbª7ï!S\a*#cÙ¬ÏIÓ†aØ .°<¹Bªµ0¡‹¤RL.Y—[•0§íŠw—t“v6Ÿò>ë˜5Ñ…~fµZÂvQ $JjÚvu޾ Û-‚çÆ[npáóÏýë!òþüO±ô›á‚ÿú§¹*OqóÁ \ÍüÕ¿øžÿÊ=®„'xú½ñÊ­çYžñ#ö û…Ïr÷¥s¾ïû/¸~ßÝÙ5^¾}ËR¤·Ê³ïìyéå‰Íj˲+|íùϲ<:eÊ™qI©3tEÉdyÄù­Û¸µŽ–]{€q¼`½Þ£²1gU Ü-ŒÓ€XÕ¨`<»êžz•µÐ…ˆ ‚š ߨ½qBÝ.e¹HíòÅ!}@ŠÂ4Œ„iJhp–È®Â0 5¬ª£¥èD׺¥ã‰'orõþ«|ý¥[üþï¿Ì0)ŠÉzK”ËšQµçàd$U-‚; ª5UyÍÉä÷&'f>o¬ër²|[Ì­¦Î°sÝ3L/…\k”.‡‹i=ÿv̰³Pv¦”A!ÔóUJ²¤¶æYž¦iö6·ôvï H§”èûï ™¾÷lÓ´ ð£¾/º{Þ­v­‹ùyζ‡*m§dUW5̬S””ö7×ÈÉ«Êêï/ŸGeÎ(ȹ%£ƒ8Ç4ŽÆÞWÉùþbÃBÛ»n ØÑ[u™ýœ]øWÖBšö{âU¡?3¾©õ°§‰ºjMhçJÆûÀz³Ù%‡×óaÊ“)ªDvTϺ“šâ¯Õ¼P2N S*ÕoßÚvÇëõš€>Ì:Ó4ò±¿ÿ‹Ü¹s{Þªæ0‡9Ì›}~è;xß{¿ç5LÞaþ”OÉxg ÓBÆ~A¡”*2,Jvvƒ ’,a×uˆ!¥Rß]òµ“3&b7¹ÚšÄ˜‘÷¤vßîj_S–gfQ\õ]ï§lÚ¼‰bl1OvóÜnàsXu­›Ù¥ö¸L^ëƒ34àD9::Bñ<ÿâ ükñ§yòÑ·ðÙÏ}™¿ý7ÿÿü?û!nÞ<æ'~ì{øìo}Õâý"p÷Ömî»øê—7|é3/òô3³ï¡üÐ>ͯüÒ§IC`{oCŒâ"2nºÅ‚²ÞpóÆ…@Œ™‹Wîâõœ‚ƒ:6ë «Õ—ÕRòûžñüœ¤…ÅY®ÐÀcˆŽa°4j“¥G´¦w>{š'TIl·7Y©Ç.3m¹Ì Åk®~Þˆ¨Gœ XE”“€)‚Hõ$«*y´ómB°÷,géÇ(7î¿‚[,ÐiUµ0­xù57KC õÊ9C­™ aççžÙï¼ ÆÈ©0ŽâO¦ ¡dÆ´æ5µç#Ö Ý^óÞ¿íújh“ÀnµX¾œUzf×ë’@DèBÜ{žMríæÏ)ri16+^‚Ÿk»r»}w¾¦¹[¥Y«¯3fÙ:²KζÈ&-gáÔ¥RÎyþ< Þ$ÝóÒDdf²SJ$‘yI•ÒøG|8sç ó†Î¯üê/qrrÆ¿ÿ‡ßè§r˜ÃæM?åøÇÿùk¾ªÿø?ÿãÌÇþÁ/ñÉO‚w=óìD¿‰FUgà4³¢÷â%‚/ŽØ|•MæÜ˜%©]¨j7’ЪŸªï]}àœ±¨ãHìp£cµ:FÉ,PB¿ †…1ÎÞSĤۅ^VŒ •=_t)ÅØg’Í”Å2¶êyn}s]Ô«” ì¤Ü¡ôÞ!x\è¸~ý:ûåòúÞöÀ)¿ö‰Ž»¯¬9> t®Ý·d³½ÇbuLÉŽí<öø)ÿû_â÷¾øy>ôϦŒw§üà¼/òsl׉œ_FNΈ¾Ã!mG¦ÑA·bØf4MŒë‚Ä@ì„ÐñÊ+¯FGðŽÞw\¹~·6tªò×¢˜ÂÔÀãr¹býÊ=ÄËÎGš ø`án™Ë,¤ÛIàíëæËÕZÞds¥8…Êø> œóä¢ä)S*ŒÑÔRÏ#U¥ŒA€èL²\”TŒ]Ç„ï=iJܸq?¥Àf=‹çü…¯“saÓ˜B”~ÙÁl5Øã®‚Ù¶h¡SM*\ŠÎ²Ûùº˜F|¡!”Yêܬ `aZÎëo¶‡œ-œ®>>@a¨Œ´ˆÌZãE^ hÆ‹-x¶Û-ã”f9õ@« ó¸âPݱ䳲"ˆ—í * ÓÎ/Ü€·ß[0´E†s®ZB Ó+,—Ë99¼±±*Z-Š»öR,åÜ‹ûî’Å Ô{o ¹¤Ìr¹äÞÅ9xÇÑÑ‘/µl…ÖïíDp]¤°íóÀµEÂîý+¥Ìj î*U&^«±êçÀØj¹‚gÑõš÷z°ó´û  ÖéI±ts[l`K#Q¦<¡©z߃ß«* o ½_ÌjiþXŸÙÜ9èü¡sïÞ]>ð½?t)Ðä0‡9ÌaÞìóÞ÷¼ŸO~ê7ßè§q˜oòL …©ucA<¾Ê 'à(dλzãjý¾&Í\qPû¦Öm¬¥0P»è;KoÎJð‘åé1qµ`Ê&YíºŽ¾h˜™'‡àbg‡© E„ $iÙóáª~'×ì&Ö›·Õnn™ÁM  }Ÿ—ÊȵkK–«@ ÿÕý¿òþ÷<Äûž},|­+Þúð Ò8¼@¡dúnÅüèãhYñéßþ<ïxæí”’¹¸»áÆÃ‘Ç ·_ú:7®E†)ácÄ^eóü‹Héô˜EwD™Î))ãÃß/Y]#äÂ'ò°Æ/—\}øQJ.\ܹC¿è.îZßí" .£A)ÓRéEñ¡#,z$)®ÎøÝàœg.x'¦R ô”Í„tÆdç¤h•û®7ÛZ;f~Ö®ëoD>)4Xê{)JÙ®k|v­+Jtžõù––àBÀ•HtŠï•“ÅŠqL¼ãé‡Ðì¹rYŸÿâóüîç¾B¿Œ,.–¸ \½vFNÖʈøif,¸žjׯHÍÃêP­K"ñ ªõ~i­‹jõDÁ2´¤ ¸jvðäa¢—My×!Ý~¾Ã&áVoÕ_µDóœñÁ”±3 9Ëë«*#Õë«[ôõ\çRý”yw â½Õ³¹€3øïº°ó¥ µ. ëïî­7»›sv€=¥Ua ”T¡ðçxÇùú,RÎWð:A€aA¬’NDèºnöU/@qéÓ4Î2ðv7ð_’-ç6›”Æ ¯2ð¾Ê¼—Ý‚£êaVaÎeþ¯-UÄ9Ržæ€µN„èIãd]Azʉ”F{9œ¥|»hU^}gaƒ1Æš«ÕñŸôãûÿ×ôaÞбìx``s˜Ã|[Íì;Ì›jDÀÇ@ãqZâuÀX—R™B'Bô®ÞpÊ,§‡“Êøy¬rªz[Å·ŽÓ¢g’p/&í-ðŽà=^JaÊ& w-ø§z} V%{¡_Êì#T‘¹ïYÄÒ…çà€š î*£Ü:ªöo dNNŽ˜r²š¦¢ù0¿ó™ßʼnR¶[NÏŽÙL[\ SÒ’pxŠN¸’Ùæ'ðЃWY_¼ÂñÑK¦N„ÈÙµûÖ£Nœ“p&edZâº%Ó¦àc@É””È(1:q„.¢^p!Ð;ÏÅí;LÃÈvY!o7d:´JÀcòäàð±0Œb°Ú¢’•4İ L5,.ÛûÙRÙýX+Áœãbšj7±°^¯‘à9;¹†e7ƒ ŒÛ÷¬·KvN;¦·ï{r){žÕ}cË r"'³,ºÀÛ÷¸yó”n±¤s‹¿ÿ5Š34Xo¢¤2™ÿžÿ½uSŸc kaT¡«òf¬oÙûK;Ëç0Á-Ì ,ˆ*>RN¨œ« ©œæÇjÎÑfS¨Œçž Z‹)ø<9^ ‚-›`½ÛgÝ÷¥Ü®VgÙÿë †s6Æ{f]ÙUÌA½V½z‡ZU#q æV¯3£,í3"—Ë!lµŠ®1±ö¼#¥LóõÜþ}ñÞ¤âÍËÆøOµg¹É°K²ôîýïW5åCŒqõZ._ë²XÌÏKD˜ò4Kò¥þwç'÷ŒÓüéh^õi²÷5ÛqUU¼ƒ©XHX'ÔÀõÏcÌs¥X“ŸÇyAðúÌ@æ ¶A:èÃæ0ßNcÌÂáŸà7Û8ç˜*Ø” ŒAæ £¾¦Û.I¡qÞRwSMV®uUPÙ¹b>çÆB‰:Ã"æÄ$‘.´«ƒ¡‚5±@¥öófv¬è\Ïc¯¡Þ û¿5 ¾¿ôiÄ¢àªg²TàÐ|¢ÞuŒSf±²ÎØ\ïyÏý\=yŒ>d´8¶[|`ÉÍ›o'Êiœ¸·¾ƒ¨â§ºâÑ‚+{wï°<¾NÑDðƒ±—e T‹nÉ&;ÂQ ¤‰Í;œ\9ãü¾û‘íÄæÖ9«Ç¯Ñ÷òÒ­op;ÄÃñÕ«/ŽxéÅМYàqZØ\ œ\¿Æ½[w8>»W ›ó-Á{‚RQÒ½ E G'Ç´:cø„ Ö[óE;Ar"¬·,cÅ1–LGb‚‹«'œQîÞ3I.êÈãdÚí„÷‘€G'e=Uv dq¸(ÓX&ŽÖQ<„ýÙ/R4TÖ˜ÙC¼ŸèÜj„|=×IÞ1¸ûì­ý¹\ú³Ù hÞ±º¡žëÓ`®@jЖ©Z¨žŸ¯-jWr)…T29—Ù¿›T™ÆDê+àìäl½ìêð.‚k)ø¶põ:šJÝj·œ³kº1¬)%“'³[짆‹2‡biëÒTæY¿KÝ/péx8gá€LÒ@¬ÃVƒÖeæ!n×ü8Žö|ê²+¥\ýß08“|·ïoǸhëÔö8·KõnþgÉ5…={¤©U$!®Ø2N÷‹Z¶y²ê=ª—ë².tx'È^pY;†qcÒñå‘õAK \{ç ó†Îáò0‡9Ì·ãr)´é0o’±Î\•^¶ð¯&Ãl7÷8ëÆ9\í1jB0`½¿ªxE­ x–~¶Þ`5©6ÞXåÖÜë¼ÌõW8!ú°“{Š……諺U«¼{79g´VµïK)#]óTάcc좭èH9ã4SòÄéjÁÙ×9Zößxñëœ=òV Z)9øÒ3m‡Ùê»H!J²çSœ#Æž2ޏà9>½j=¾hD=lÇí\ý³X¬Ønפ¢¸RX§ããc¶¯ Ld¼ älÞÝièâ‚EבÄ3mGFgÌí"V'+†ÍÚºrCdýòޝ_Apl‡5qažå…óLÉ<œ>â"ÃzCÒ‰^ ªyb)%$gRÉLÃH׬NO8?_3Ž#9%†q¨ž]¡” >&…©d(™„{´.U‚)Q&cüÆq´Ÿ£v SÉô«€/–òn€fdûÊ=‚ô&nÞ¼ÊÉjAï•G{‚/õE¼« Ø*6€x¹¹fæxü”¤³'»aHæš§v^AØfCè[‚¼)3˜® ¥T(¹¾f·Ã8V°¨—–;;o×—üþ¯ £ú9Ôal¼}ßÏJÆá p©òÊÑêÊØg'hJ6õÉ~ˆÙðVU\ý3Q»ëUNÉJÉjé×âë‚ÄbœÓÊ/ɺUHNçÏ_߇išè»ŽÅbaª–º,ñރfÅ(—RÆU•©("Ðw=ÛqCôu‰‘wu\³r]À^Îy®ÁÚW&øyá—æ¯Ù}!ÆX·Îj÷:óp}˜7tDþ)Þ@¦¯ó ÿíÃÇÞö—øwÿÜ#ô’û0‡9Ì·Ð4ÜaÞDÓGºl ô8ŽÐGÔ7©ª Sžû•5g“½–vS¯xç¸È#2ª±Q5ZUÑ~ÔþÕ´zK§&WÍX8Suž»„K¡ˆÉ¸‹*®²6#НaIÍ» ì±=: /BXDJvàDz”R褣¸‘)y¸zÊ÷Ÿq´\âˆkWOÑ”99]ÐwWr­­ˆÞ‘G —<áòÔj¿2A…) ä±Êw¦¡«’ׂ÷™…4Œ„a2i¨Oš\t,WWÀA  93¤Lr? 6 Ê­5›‹5ÝÑCÉlÖkܪ#Ýð>2j"ëªÊ@Æm·tãw¾ø{|G÷„y;»Èù+kb'Ü­Ø"ŽÍfCô“ÝèŸ,×[D"“)™´Ý Sf»q.p|ý–«ÛÍ-Bš=Ô\àÎÅ=ÞúÈÃ/:²*)Õ¥ŒKɂʦa¤¨€¯j€J}Æ*+ÎIŒ¹%QÆBÎÂp±…莎9‹žtq—?ó]ïᾫ§\¬ïá¢c»]3 ZYK%åÍ}‡–l•eÑXp ¤Ñ€‘yS'”¢UÞ^kÍ\c©ý¬HL%í|Íb,è”"ÆÒ6ÖÔUõD!ïÔ¹(SVœS\‰] Sè*î]˜¯¦¬x¬î[+Ú×ì84 Z±k tö9S»ÓÕÞ*€v¢Q«ÂJÉöÚbÁdÔøgKµ¢Š8o‰õ¥P4¡Å‘SBêòÍáp^Í´!Êjµ°åsˆ âvA~šíú.©KÁ¥‘¸ò3PÁ£Þ¡âP'LÅ'9µ€±º$«l¼ï"ZýsÄRX[rõ‡;<8OX:’fòf„úY§¥˜¢þì2ÖNë)[š;ZíãœåЉ¹$[¢h©’{…üúÐßâzüÿÿóò±wýü—åiVœõBÙðÕO’¯¿ƒ÷Ç1¯óñ=Ì1ÿTè|›ßþÅ¿Ço|ègm³~¸Y=Ìaó­2¯’5æÍ1A¬–¦±"¥Ês*3œC‹Z/j19oJ©VÒx|M–U¬Õ|–m,ҫΛ&oDvuQ]×Í^Õöï¬3>¬‚×]êöX®Ó+´¤Cç”dAéWáÿcïÍÃ-KëúÞÏ;­µöÞg¬ª®ª¦ººè¦QÉ«4 1êMD}Œ#Aˆ®QcŒ¢!jÐ( JB4Q4à}Tb’›hž¯‰qBÑxÁцªk:ÃÖZïtÿø½kSMÓ`ÀÛý{žzªÎ©}ö´ÖÚçý¾ß‰ªªñ>ŠìR;bÈ •Vì_Y0?¸Ì³žõÉÌÜ”Új¶6§xßRYCôǪm¯¸¶´¥†ÆÙZ¡”»w•*½»%7 ¤ˆÒ¦RÌh[Ñvg5mèÍÔV´«”„¶u]Oè=ÎՄЬ®ª ^|1…˜̦Ę1V’Œ¦©úŒ[n¹…®MTÆP×¼ïé[ qòEÊ® ËÉL‹ì:¹+1‘úÈÊ·ô‹[9N6ºÅ‚¬X…Þ>TmkÎ^wšìË劘Ҙ< ’h]9B‘#'Ÿ@‰ÿ·²c ýªÞ ³k´øåWí’¬$ôK•@¸®ë¸áúSyÌ­7³½½Í{˯° kJ*4"¯ns‹„/gt0GÞØ®'„£L€˜Ê>ŸËñ¶ÖR×5Jú¾AHßó¢]HhXÙRY~& “óãˆWZA<Ëõ•Â5I·×²ÝÇÿÀµ?;&k#ÖT² hWRI6$ k¹€ÐYRÆu2Y‰'9–Ÿ %¹|d»‡ëR UMq”v!gCàœRŠJU©š2%!|xm£Ü¾lZÄxô9Áðú­Ø1šºÆ—,é¸NøØ )+ªjíÄjbPc¸sŽä­³Â*ƒ«&ô};ÞWÎy '$%ŒОb/µêü¤¶ ÀiKÊ[*á|ˆãÚ~xïªùøèt™ÿø_ÉÿQ"Ýï¿ó ?É«?£áº³à§¦ÿû;õÝ»ù©Wü#þø ^Ë?¿ió@wSžÇ«û/àûÿÉ—ó„ÍcInËßæÛ¿ô»¸ø¯ã5Ÿw=n½Þù˜Î. ÓoùÎòò_¹HÈ5Û×ÝÀéù|é—>O>é>òˤš¬g=ëYÏ'Ú¬ôÃo&u#Õ- 1ö†>¿‡l]*{R"†(¾×²ø¼°ªí¨ëZ˜#rÌ>x]AJÊ•„ ýÄ"Ñ6¨ûõÒŠÊTÉ÷S™ì±ß :—*˜,ݾª,®SJ(#À]ü…ܫʒ²$8Ê'ßÊÞÞ>òÞ{Àz´Úâô#¶ «C5ð;wòœÏx‡WÐCb~0o¸Ûù IDAT`ÇRãTÕ5:•>e„µ2Zcàœ#1zœ1Wƒ2´]5’^Õ «½«4Ö0ÙÚà0öàu#¬gè=ÄDH-f X‡‰™`¶rìß{7õÖ £ 1b„HÆ*M=‘ãQUݪe1_‘¢‡lq;š>´8Wc³£ë:R׳Z­˜mÔRï¤*rßB"» Îլŋ­5„ù’Ù™Ót:¢?XˆX[Röµ¶SñhLj+Þô¶•¤nã!t=-ëj ˆÓ µ%ÿoèzŒ‘÷>Öc-}/ì·™Ö«0*Sº&û}¢vìnetØ£_x| 2’”BW\iß÷ *Û¾Ôå,ýèÞ{–Ë9!D‹å(nš†ªª˜Lg¤©´ÅV¥ ºø÷Y¯0ªaü7 ÞÚàU:ËMåj ¬µL“Hº|Nè¡úX6ÀpMÇ<ÅÇBÏ”=òké`7£Ü|—Dû$ ×®¼'ÀègŽÅ,¡"‡¡.Kס*×õJ¦ò¸°Ô)CÀjKÌG_:RYº†²Þª˜J‹”^”)Ƈ4ÚbŒxïY-äÎ¥Kºb2¹ºòÒ%=Té%%MÖ(V}¥±ÆR«J’¶Md:Žï0ÚP†÷×ZK P+G^e¬±LÊ玙–ã’s¦BæÂQ?÷C1gºì>œû"^þuOdcd˜ 7maªŠç}Ë+ù«JTÚv)ýþðÏ#¼ûßðmßwš×þÃÏáü¨÷•À˜Ö0ìÏb˜ö\¸ˆ¿á‹ùî—>•­´àÒ»‹7¿á‡yɯý ¯þg/áSwìC¼×´žõ¬g=»¹°Îzcµ&Šõxd—Ii”vjt‘xù*G¦«°]ÖZ–íJjƒB {ÄØä£$]à(Hi¨íQG©ËaÅŽ5óJêma¼LöEj 럅#FKk‹5šnÕò¶ßùMžý—žE\̹:Ì»Ìï¿À þÏOgïžûXî·\ºx…Ó§·Iø°„(Ì%1})2d¤µ¦ª+Œ‘…zðJ¤¢B÷§[-ñ)3™nÐw+f³)+šMúƒüå«L¯Û%„Žè=M3!j©íé±Ç(MòòwH‘Ë÷ÞùéÍøÐCBKΑåÊÓ÷[›¤Gvôê•}¦õ”Õb ZQ7S¼ u·l !Ð.@;…ïW¨é–ÆFªÆ†´gŸ‹®c[)ðå#«ÕŠÄœ˜¯V˜Â2²êÉÚpدijº¹‰‰†ÕJ˜=k+´v¸~„u]ÓÅ®È]MÓ $¤¢vPRFåD ªrhkX¶-Î)”:vw·¸÷—@kú>Ù­YÚ Î±(RaÝC´­$’Ïçc Q=ÖVø©j6“(îº"‡$ìæ±Ç9žâ=„ßåœiÛVÎ!@9ƒ.M/Ê:(ê‡ÊUãu7¤[g¥Hb‚–š(͸¹‡*v¥ xãˆa½Ÿg{˜¬ä|Ž1’cD¡Áhb”p-ïýxmÚâ‡ÇK)áû@RÒ¯”Cs‚”cù[€¸¨C4ÎJ·¶Fa´‘Tü(Ö =$éïC©±3“z¥ð^?D9V>ETʸÒ%­”–äöÒ±=lâ6‘œX•þfm,ÞGé›/ïõàÝ–M…RèC’ Ä>rFøË†‰s5…FQÕö/µ÷“e“`â_À«­›yü'=‘Ýãô°R¨þ}üÄ‹¿_ü”ïã'ÿöm4yßøéåõÿïÛyß…Czf<ù~˜ï~Îwý—ãUoøeÞq©#×§yú ÿ1ßþÙ *wwçë_Ä_ý)¹ÿOúÖ7òOŸµõÁ üäã9õ»¯ååÿúF^ý•wôÇÇó_øn¾õ§ÞÆ=ˈۺ'?ïkxÙ >…SVA¼È/¿öxý¯¿‡ W—ôL¸þ‰Ïå Ÿ®ù_z o}Ïì>’§}ÑßáeŸ÷6‡×ì¯ò¶Ÿ¯ûw¿Å»÷4×Ýö,¾äÅ_Ãçüm^õ÷þ)ð)߯«¾öC=¯?Ÿó!ØzOzÒ9a<å<ë¶–/zÙæçþè+ù”§n¡ò>¿÷¦á5oúŸ¼ãBæôíOço¼äëù›OØy`¥ž;îÛyÙ¿•{»}#Oùüó÷¿ü©\gÄ+üÏùƒüØ[~Ÿ÷Ýs@Ë&Où¦×ñÏ[+Ö³žõ|ìg  ~s¦ï½È8S¥–þ˜Gs >JŠÊÕÄœ9ì¯3¥ÛÔUã}=ƒX4ë"ý47ô¼Þ¯®†$É!LÈ(âp?Y˜D5HBAª—¬eìd-@:‘QY‘¢ÁÅ­|"º‡Ç?j å,›'N³¿ßÑ^=`s³bwÛ2mrx°ÏææŒ®ך ½÷´Ý•Á™!ÜH¤¿ºÈŠÛ¾4‹uŠ.xLUc€¾[QÍbÿŠ€¦Ùן¥ï–¬®ìc*G×µäxT¡gúU Ö‘;O¿ lŸ¼ŽÃ½C2çfg!ƒgÿ@jµÌâ,“É ƒb9_Q55ýrQ˜ÃDÕÔ(cÙ¿r‰èW8—SÏæÎ.–ŒŸÏéWKBЏ™íì²uú$1­¨& ÎÕ\½z•º™0›MÉ b $ Õ¬aûÄ6Z+æ‹1F6·wG–wÞ­PI¦ªº’­UKÕÔ„ ©ëØ¿ºG]ª‰TÊd¦ª*ªª!¦D»X1™L FVm í–Üxî:þøÝè´g:k˜N'Ü}×ÎdüÆœºÀc TΑcÂjÃl6£í;ª¦&æ@ErˆãÆBRGêaóA¥Lå’Ôu´±|ÀYµÃFšÔ7 Í›nµ#å0Ög õT"×9÷qÉxòŸJÒÿð»(+’VX£ÐuÓ†”#¡d1¤²ñB`Õ-E¹` ©´‰=ÓwKÉ8ÊšyND"S>WRù9MR £S=tVWÂtS6ì û?ö‡+ >$ð±„6¦,Må|bèá—Æp•%9F‰Èˆû¼ýW~÷ü¼ôEg'.Ð>A¾ëçyÅ«ßÂô ¾ŽW<õ,vÿ>æçw¯=×=ÿðÏ9ƒSšéõ³d´õ¹Ïå;¾î:¾ù{¾—ºõ‡ùûŸ~êÞ ÃΟÍWã_cg¹ïwÞÄk~æ•üè-?Æ?|Ú&.xÏÛþ?î;÷%|ÓËn£¾òû¼éŸ¿‰×üÞYþ/ýR¾é3®üúøg?ö=œxìëxñm Zu¼óßÊ·ü»)Ÿ÷µß‹ÎÌù­Ÿy-?ôšs¯{1O$Ën¢¿¿ÐýÏÿ<¸ú¸'EQM7©²gÙ& ã?õ2^ü<ãËÿß{«âÿùÇyÍ×ÿ_¬~üµ|å- |φÝ'<Ÿ¯û_ĉYäÞ·þ ?øúWðªÇük^ñÌLÜã÷ÿÛ¯òÞ“_Ê7ýÙIsÌ­'±ë5îzÖ³žñ¬è‡çt¾—Egö™Î{Leð÷]Îã,FY ÂúT a¢x #~K5zM)Œž€õÀ6kM*}Ñ#k“x5Ë)7ôªæ Ò”1Y“G"¾ë˜$±[1zccÈÔ“š?úÃ÷’æ'¹í&q‰xxÀ©™zƒ¬9pbw“¾KÔ®"Ç„OÂ2oonÑu9öT•#+Gè„IM)ˆ·2KèQòœØkãÐEšê*ƒJ"ƒwΑ}OÔ™„¦ÞÞ&¬–˜²–Ò¨'“J[6f3V jÛ@ŸØ_\Å)Ãþü Û›Õæã$¨-ÇDÛ¶ÌœH´'ecãÊÞ›Û[4Ó ¡ªR¦šlµ§žÜ{ºå>¹š2™z*—Y,–tËõt‚m Íî BN(8\\¡ë:ªª¦®kVm‹­Ó ^9Ó­8«Ãá|oôÀVÓ NWd-Àx>Ÿ³µµÅáá!ÚUÔZ³±±÷Â.v]G𞪞ùuBkzËÅœÐ.0Õv jqYÑÅÈÙ³§˜45ûûĤǟ-'öx~;çˆAØt:%¯ÄÃ>›Í¨ëš¶m…©t5µ«˜mlPϦ4U…Êrµ¹Ös¦*×ÔhƒÎ÷”Áiw©gJÀªÂl:J ˜Îi¼”$Ù9”^íáºó¡(>”_Þ K°Ë,=‚è˜i»îš .c-¹®F¥IòÅ®P*Ÿ†Äê#¡?ò‹[kHE‘c,²s]poÉÈÒ/tr&úHVÒó~\ír|dÓJSÕµôj«ìfÁH{@0Ò1Ÿ³"ö~¬Ye"DÉc¤Ï«åúÔª¨Z´¡ÒU9*†*3¥•±  mç™5’6²Ñ‘ÓÑïH=„±ÉfŸO!ÆLë[©¬ËGV™‡b>1ô;~€/þü<úúÄóyÍ¿Û[åÌì‘OáYO¹‰”¢Ç}ì§w<ùi|êã7E¤Ô5T~sâ<~ôy*õ »þÊpòi/æ;¿èyÙ½Š'Ýòrž·sÿi6õi<ûQåËÛNò_ù;üÒï]ÀÚ¶ëóžÃS64ê“~ï¿o}Ûüm7Qþ.?ñ滹í…?Æ Ÿ{§àŽ3Wøõ¯ý7ü§w5O|â§ðÍÿêßј‡û &…;ú®e\|×oò³ÿìÍ\´ç«3ƒÃßâ_¼ñ½œùâ×òò¯¸™V|úSn¦û[_ÇOÿËßæ ¾çì~Ðj6oy&ŸyKùòq§xÿýþãïÜM÷Œm¦ ç×-OãÙO»ƒ©$1¬¥âëYÏzþLf]cõð•EÚ*U2•Â8+Ð3$*mPÊT"ªŒµç*RŠ%Q[Ø©ª°,CõÔsJçDÚª nV›1ƒÄ5çL QhŠ(g!Cí é}v™1lJk+Éà 52jôd'¥Ð‚’š•[QëŠÜk6Oœä?p…Gž¿ž ¯èû £¦Ö@)ƒkàg-¼uU±X¬0•#&C»òh—Ç׺^R/!^ÍÖŒùrAP¾‡ä©ªF*|¬¡ÙPôËó½«L6·ÐÆAí¨·v°ûû¤²PmOèzÔtƒœ;ò*Ð׎jwÂÞÿ!§¯?‹³ vRч@íÓM|׳¹¹Iç=©ˆ>⪚Íím ÀÊ%¤,i¬Õè™TŽSgAï#ø_ÿƒpáÎÜx†®;$8h[nzÄõ3•(¿âàê’ùÞ!Íö6ÆÚ 5F[VÝ’œLW"Ïž6 ]·Ba°•Ã8',Ÿc+ŒƒÊÑ÷g*lR¤(4!&ŒFþõ´%akmɪ!ålmÌ8wÆêmn¿í «xß{.Ы«ÊXúàCe}hѹ"¨=´›âcZaëŠ*Ʊs¸i¦¨ ³ÙLBÅŒ+2í„uÓÊ|±U†Çk/¥4‚AmL9çVXÒ¬ƒß°QŠd GRŸûà% M"‰"µr Ì˜àãQ*¾±rͬ ì’äh­GyöÈX-©Ñ9áW+ªª¢m[bŠTF‘s"«£Ð²-N9³\­$éÝÆ£¨i;?ú†¥s>H/3Úå)‰è)†4ôÉêhC ö=¦0ÞmÛb*é·¦(-”ÁLªÂ0‡éÉèÚa:-\1£°ÀÖ8t²&kQÛ8'–«ô±ÏÙP¨­Ã‡@V‘ÙF#Ì¿«ÐY¼ÔG6ÆÏ?k-6h|” :•²„…£sᡘO }ó—ð_òÉl9Euu‚GVõ!ýàr»×·|._ü¤ÿÁ?ÿ¶ò®¿ü¹|áç?gߺs sx”°÷až‹žò¸/ûV¾ú÷_Ê~ÿ¿çŽo¿ñ~7ðÜ÷[ÿ–×½ñ¿ðÖ÷\d¥§˜6áZ®=tÃNYʼn›vQý{}yÍIÎïÀ\Y’rÆ_ú#îlw¿ú«ù«¯)?^.¢æâŠÄTüÃ9ž€8Îðï·ÿþúç¼Rþ3ÓG>“~ß7òüë+»ßλ»Mžô´™#Š‚éÍ<ãIüôc‹þìŽ÷9ûÀ…_{¯~ýÿÃo¼ë>–z†]EÜA'»úãíKùüÃl³b=ëYÏ'Îh¥?Œg=gÕu¸å)¡*+‹ê$RÙ˜J=UŽ%Ð+µ,ú]I®ÍE¦¨­EUNüZc²Â”jWzއð/Ê¢>†#_êÀ–}¼³Y@Eމ˜E¢„u òP• ) ,Š©GkÅÆ´áô©\¾û2]0MÇöÆ”§¸g¿¦]púlƒFQW–œŠïÓV%xI‚ƒ”RWáCbks‡uã $¬v8g$ˆÌ(zé:Ç´¶(u–ƒÃp¤¤P&Ò.*­èR¤r±£ÝÀZ;V9g‹ôÙ”c¯‘rë!Ùšfd7s â±¥n+F 5m ÎrÙ¨ÊmZ-Ri¤jð9—j¸H.Ac†ª2"™/Ýï1Fl%>jUlJ‰šB)Emdhê†TüøöXº<=È·såo{dÏH0™LÆ@.I·ãzz`ª•RrGŒ¢üèJ¦BŒ^ùÅ·0¥à±O»fTu_ð÷¾šßxÉóýÿþ˘SNûü/ÿGodþì¯á›¿öqœLïç?¼òùïr¶²(z‘<dKeäÉ)hxê7|7_{{s È)&§¶Öâ]@>òËyåËžÂÉÍmNœ8Åu;Œ–@¹àš©É\>jéÇßù³|Ë·ý$‡Ÿù¾ãÅOàTþ~þ»¾‡ÿö±}IëYÏzÖóÍZÂýð›¢Þ,ÐxèSV4Æô:“&+ü ©,!F#Û¢†/鎆¡ªê¨b*S<ŸöZ@‘c¢ï„åS%©¹tÝ&I:C°3nd“Þæ±¦&GØÜÜbÖ(n~ÂyÞÏEÎ<âFvv¦Z6N4˜Õ.«Åœ¶,—sšf:=‰çQåz%èÊ¥û¤§y6%5:ƩIJòšªJ|Û¶¥žLJ •;’l'a™L?ô^+}´P䣾•¾â qµbÒ4"ó*cÉÎ`Oì³qIÛ9#QØZŸ¥<®ÉÔ“ þêUªª¦ïV¤$RßÁÏÞv-Þ'Î?_<¶‡˜j²[Q5•ÖTtQº¯‡ÍµÞ{”34•CkÍÕË—ñ10™IuU DZ¾µµ5ú„µR4UMµU‹ý¯íèûžå|ÁÖdƒlaqpˆ³•㨘pÎÑ4S’Ä”IQ¤SÌ#ëŠNLšŠYcÐ:sbk“i]QMÚÅ’Ù†åÔu;\½º¢Û›cÜòèë¹|uI.Óu‘I½A™Íft¾'¤ÄlÒ`µ9Ê ˆ‘>´18#@Ë8;ú\m/ÁøñšäÖCJàS Ø’þï>Eœ‘tw«‹—¸\Îâx½Jеέ Öš±–n8-HÚ~ñ+£FVZ;§ÉÇkž—B‚±¬6%i[B­I!’È¥ÏÛ`-cªöÐ=œ÷Æ|å<Ï#S;ÔMÕ±de &I½–µ]*Ù”ÖĘpÚ}BÆš(ç)†‘Ø‹CýÀ®gÙdƒKG*+Á_C:zΙìÜ •’¤ò¬ÎÖcšÕÐÄ’¤žR"…„Ò‚—âp.–ú«ÐGº^êÐb~hm®Ÿ>êNLegÜøÔÏçï~êgòì}1ßüïþ=üù/剶f³‚åÞêOÕìÎ}6ßô¢_ãk_ý“,cbPlwwý.ï‰äë¾ìy<ý¬EÅM޾Ńè7öä£9ç:Þ÷>8ûÜ›™ê¿8²á=æ›7qÇ'=ž“FÐa«N?–›ë7ð»¿q7íoeªôà×ïê¦Çr¦V(_ î˅ݾÿ­¼3ÜÂK¿ê¯ñ¬ë*nñ¿¶¿üg÷òÖ³žõ¬çG ½ž‡×C걺ÔGE$Œ*Ç’,F€º*õQ%ô'‹åÌÈ\Á‘Õɧ"O-Á`º,P‡Evv¹Â* >‹ìÚhb.‹à¤EºZ€%¤læœÇЀA)Sš÷à.Vû5çŸtž;n?Ãt6!‡M@÷àf7ÝÆj ÙŽ¾Ïœ#)&ºn5‚ÊÖt~EL¹S˜iƒï=‹P‹:™LŠ3RWVÀPLß“BŠ¥œ%\)eŠº™¢°\£´71‚v¥—.^b÷Ìu¨¦e ì_=`:«Hdvv¶@+÷ö±Nz¡ƒW[f›„”©ÜL€¹óöÎ&ÎYªj ß_¡_õlìlsp¸Çöî.ÏüìÏfçôóÕí,^evw6Y.Z–W÷°»[L·¶Ø»|Àj¾ää™]œQr|#>©üª¥]H€FÓT5íÁ\TFÞrÎÌSDkÚ€ÖlnoX•™nN‰Þ3?8D#`ÒWNú’µ‚$¡m>r.Rf £}Ïj®©¦Cä¶[®ã=rŸþ™O¦¶èù•_}VižóÜgðî?|/—÷9¹»ƒÖ–Í)/MX­Ìô&J˹k”Èœ“DÂCAáœ9¦$5¤º$ScGï²T)©_pG ±FØV è”ÀµÉW×Ìr&„^®Ãá1 +މv ò` sI’ò1-j,J]žÇý{œgBNä$ìªoûñú¿¿º†h,˜žLêñÿRŒ’Ê­¤£¹*9Ñ„.bÌ”ÞwL&ÚV@gS±E ®ô°ù4¼ŽH×÷¤è%t­°ñÚU’­#º0èUUa4cà ûwZ*ÜŽ‘™I7>rJä”QS„%=\ç”äs¯ëäù×uMÕ¸òy•þ¦p”ã/üÿá­‰yЉ¿—·½oNšžd¦Øëxü£+~î-oägû|•/sxæéü•Çnˆ¤æa,×ÿ•¯çE¿ü"^õ»GDuæv®çgxó~Íϸƒ&¹kñÑ=½óT¾âùgù»o~ß¡¿„ç?é,Mw‰»nâ9Ÿs;›‹ßyئp8 ㇒ݫ­§ð¢¿yë§¿ïš| Ÿ{‹âÿéÇyý]çùŠïzŠÔAØ-±¥¸øÖÿʯ¿ï>³f ~“µÔ@åc‹9ÄÅÖ%âb ä‰Â ]­ a¤RI–BÃr>¾ðöx`«­®ŒA—ųRФ„•ÕEV‰É„ˆ¨‡anV%w+­Q9 {ž³Ôr¥ÈlcFVh«éú9u5à –«t_:^CúœâG5VTaZ2ÏÆs¾š4l4›´óûW°Î•z'[dÒïÓÈ@K²‡ýý}\]K70J²a c[`1Ö iM¥–ûdV¯°uâ”H“b:Bì ±Ç…™8´‘žmÐ,çlLgø¶Con¡rÆûŽ5ÍFƒOâó^sΙz2£ïSª˜jºeO ‘•å̹óèè¸põ^¢l)ÃÁÕÚ¾'!`ÆUÎ9Ú¶å`o­ŠéÆŒJk| 'æ^dºEºÛu¾wšFR­ûN‚ÖÐFg30”†åjEð‰Ù´A‘P®ÂŽk3ƒ¶–{R Öª&µ€Û(v„Ic¸í–ØÝu,l6èìÙš&•"yÏ© Ξ¿ž½½=n»í<崢k=ËVÂÏ4ƒ7V’Ìc”×á´D] g“ªÄÒ#l ƒðÐUFÒRÆV]Ø`a=% Ë ® Ú^±Ò +tÐò<”–ÇÒF ƒ[®gñ?»£z+I POI¬ iú™( ÔÆà”!Årm¸|´¡ÅQð”°/e$hÙJ5YÊqL¤VYÊ ´úÖËQ”ׯåyÔµd'ÄR³e*+ïk(«H} &‹ Uy.ö˜õh5TÎuòbŒ8[]£v‰£ÂF{È‘<ªk°È8cǦ GSd¤5 ©RÃ5|&jENr½XÛüi?®?ªyXèpõüÊÿýf~ÿrGÎ §ó,^ò-_È£j…R;<íoÏÿ¾Å_ùt“Ó<åKnçÙ-_6ö,Ïýú¯ä_ø/hË·ª›¾€ïøúKüÐÿ5ßû_{2à6Nó¸6> °™ð¸¯ú§|ÿοà_þâø'o> 6;<êé_Å3Ÿ{;›dbˆÄøðƒzÿû ȆÇ|Õ«ø‘Ùkø‘Ÿý!þÞ}™ëóT^üÃßÀ n›ˆ'Úœá³^üżå{ÞÌk~þ/ói/ý|÷7^äû~ò'xù/aÈP] IDAT¶Ámžáñç7?Šc·žõ¬g=úY§p?<Çï ÊŠœ¥ßU äÐ"«.U,¶ô;+ƪk-¡jS«©Šœ¥CØZK,­ËÐÃë¥?v3tÊt±Ü>¥±s:„€2¦Àz$í6gYìëŒÕ dÅÁá‚O}Ò­ø^ãl…RI”MLt%à­T®e«™Hßû"•:Zµ,~“ÆØŠ§&Üóþ»ÉYÑ·Íö”¡/øɪïqµ,O:AFÉÏ0®o«Ö[kÒík´a÷ä ö/\`RÕ,»^ú¤«Š{Ù@0z‘‹:SỞIÝs.ÉÂj:íHF䳫ŒÅáõ¤Á55!„1‰:‘ÉrH$%ðÕ¼grj‹fkBï3ó+—I>•¥k=}Û¡µaûÌ P‚/—KrJTuM3©±UÃü`Aß÷4pYc¨ê)ír‰¶FÖ‡lˆ4Ø'LŒôË–ØG\S‘Ï Ét*r4—.ÜKÝWlïî´ES‚ ’o °ÉÄ>ÐéK…JŠÓ§¶°õ”vu•Ý-²wœÜÙä7^Ï…{ïâÜ™œÄsÌ ¹ =¾áôxÃ.óø<ÇÂöÒãÆQûÃe~ûwƒ¿ôÌÏø síÁÏ‹c·Ëiô…}ðq§T¤e²’ûúàcwü|c=Üv=ëYÏzþ¬foÿ*ïyﻸõÑ·¯ôÃh¾çG~ŽÁ‰§ _¦Œj¡kW%ôÆ‹§hꙀÄtp­•Ð$£íQ4G tÀ1x9i¶÷ž¨œÇÿ[-[a†7† >ëÉd‚ÕÒÿÛöý¸è*‡zߢáäé-n>w=·žÝbs³!çn ÒZÀzôvÇfXSúo­¡ë:´†Uüø È1€J4MƒÒöƪmûòÆÊB9‡8†<µË%¹0¢@ñw óUϦ"£õ‘nÙ²ZIײq¿X@aU, šiC=ÎÕ¥êÈBO»XûÈæÎ&íª—Š¨ƒËlìnBdw÷F|/ÒSÓX´™Ð­ZÂü€í3'ÙÚÝæêÁ!ÆT,W„®'.#Qƒ™ÔÐ÷´‹9Íd2¥ž4lnoÐ{Ïâ`çj666ä=tëDNlŒVHÂÜÇéÛ–ªªÅ‹jQXWã}W¼2}'¿©kBèºÅ‡9!2Æ(BìÅÓß4h%Ç[‡2šÍí)«E`¾ìØÜÚB ò }d¹\qòº“h­„=NŸ=—.îñÖß~ÕtFïW´Kƒ2-Zm⊺QÌ&S|ßIRvÒø} øØ££4Æ9´§ÍÈ2GޤIЧŒqšœ6é^GÚî(@gºZ¶”rJ#@~|Íž!kRrÍQZØ{­AÉÏ2x¥‹;^³-çªyòàãUy¨›Ê#0Û®•5㱉Qn7²éZK‚’þw ùŠ×ÜFÂûJrÿ±äoŸdã$§$á‡Ñ_ÃÒç,×{Œ±0ìiLwÎƒlv ý]$õÃ}úÇà²,ÇÇ4smŽÞ'`|Îɵ©‹ôüÛ^ü×?jœôK¿ôK¼à/øB`,˟ű¯€öãÎ@+m„ –ð‡ýõðmU:Ñ>ÒûùÓ<¾o¥4êCÞÝ<–ÒÜÿé=Ðã©ûƒ¿»Ï‡É|¨…ミÇþƒßÛûÝÇߺ{ìôÎÖ³žõ¬çc3 õÀ[Øëùó=1‘µÂØ’¾ÍQXÀtÈ$2ÕÐ)K"„<‚59WþˆyIPÕNä´%qÙ{OFØÐA0î‹\Ò(ÅÊ{†mû˜©ëF©äÐ),ɵª€Z-ݺMÍÎÎ67Ÿß¤±\½Üñþ{ÞÃEå9¿s ÖefSGŠQ~.'žjÒ{ `‚Œ÷$é7¦„O‘ 3‚;I™¦~ ©B|”xi£¼ßv8S‘Qô¡£v­ïqFVR“‰øÕR¼œÆŠÏó ë¥8gf[›ø¬IYŽOLô½§©jÄ®ñ>Ò4†v%lš$A;ööEr¯JGRø~I&‘‚'æH» Lf³fÆ…ËWqÆQMgL¶fô!ÐÔMarų|0_°yúѯÈ>POgèªfww—ƒù!}H,W[ê–² ³Š(ëè}Ä:‘äVU…±ÂZš NbçéŠTwkc›®•c “f†«¥û8õ"•wÎŒr­,JK×oJ k„õ6JÖE骊náÙß?ÀÙŠä—˜˜ð]‹ï³fŠÉR¤6•ø»1œ:±Á©®?m;ç`±ä®;¦òÔzF»ZpëN1?X°¿ßqϽ{]ɯ2>‚&bJÈ€«dʵ eµí,Ég‹oNrýhʘ"Σò#c(…Ç@$¹€R¥0åº2V•Í Á­)²D}!ùrM«ñ¼ÎýázMùˆ> ë"p %SJç‹G;Üe]­•*¿gŽ~ÑwlòQ€`.ab:gôòs"k!d¥<¶H·“’îýwZÔ1CØÛÈÀ»òR&¨"+7FÔ2éH v 1â{ŸmLðÞËg]ÎX *eRÞ›8æ%˜‡xýþqÐëYÏzÖ³žõ¬g=‡ Þ£j‡V²P5ƒT¿,°µµ¨TaÉcp)—è#?cÖq ËZÉÒ•œû@#!ÊâÚ—_ŸÄx\Ò:xÛ¶/éÞ ½”¦”ŽôˆûÒ½X\ºÂ'ßñhž|Û&OÒ“ØÚ¹Ž‹÷ÝK¿ŠTÊÑ4 õ¤aoï2µs¬æ‹cÕ3RM´Æ‡Àææ&},LF±X“La®êªboŸ¬ÖV$•¨¬#t½üDò>LQ!ÑTRiŠ3åŒG@›R :ÙVÐ@Ûfux(}Â>àµøÃ•RX4C§îr±ÀZÃ勌é*67¶˜L&8kÉ1°\îéÉ}æž÷¾s7ÝÈÁbÅÙ³7PO{W/pá¾{¹ñ¦›¥ëÚB $Dv"ÆXLUSm&¶7&\>DíLØÚÞáêåsú>pñÂÝÔuMèZÚi`6qc !=8SqòºôEAúRÄ[™X*k©­6Ô±"FOç{öç‡#¾èÙö*GV‹%N‹DvÕ/°ÖŠOˆ¾ªVhå0ºÏÓvuHm3¤%iÕ“Ràð`éÖ.}·ÀÚDUiÝœf²A 2Oÿ´Ç“"¥ jSÑRËü…ßâú6¹ã™d{šÈ7l3oóå Üu÷þ×|§g(W—™²Uâ‘&—z7¥ˆIkÁ$±à*i,–6tàU²¬²äT¥Øg->g­‰¡ø”GÛÃÀòUH j‹”3²q”eÊõ>ãDÆæ"å.gk-F):¤æ¨ëúv9+Q¾Š3xžÇ´þ¡[Øt]ß±W¹<r.¬³('b*ábY>ƒRŽ£´\6ŽXb¥)s”^»fÝ5)àãk5P‘˜+­Ñ΢㘺OÖ(}Œ}Ök*Ù„,½Ï²ñ—0¦o£õC i×z=ëYÏzÖ³žõ¬çc0JkñŽÆ„6f± d¡HµÖÔ¥û4¥„JIX¿œ0ÎJÝ=ÁBä— *ñfð]_¤’¥"*E| =02÷c5а¸¾BÊÒ1©«/USUUáËÿÍßäÝwžâyŸõ©^äÄö)Gæ‡WèÚ%“ª¦)Œ²²Z<¶E:Þ·õæ&)%º®;z/æ2+Œ…1Å£s*éÒ±÷E^šhWKb5Ÿc1ØÊÒ÷â—ìV+ªJê§R¤!gzïI©€’JXóUìpÆ¢UÂM¤êI¡˜_ÝcçÄ6m fä³hW«1ì-ú–ùâ€élJí}çé»È 7œe¹œ£É\¾p×;5øà©£¢ëZ¬µômËls‹+æó%óÕ›sÃb¹dkwƒÕj)³œ¯M]5Xc9uö«~…>ˆu:›à\Í|~€+,ô¤iðm‡ ½gár¬“tp'$•ÝZK=‘ê°¶mÅW=/yò…™-µMÞ{¬õ@ÎÂ"Š^“£t5G<©T~™‰¡ëu=$Rñ”¾óxQºÉ®q•ÈZSi‡ÉkžóÜ'1­¶hœ¦>.˜Õ5MSÑ4§yï÷±ZA6¥újð=ò~21ÅqcH¤Ñ’œ­•¢Ï‘â ÌEþ_®Gm† Ü!«âZÙu"_ð5Ø”Rlµ&Ĥյþèáߨ¼Ý˜£¾v­5¤4‚æãLõxUÅrÄ"«A¢=–ϦÂnK˜Z«uóð=¥¤#>—”~†>m0Æ¢Œü!uœ,rÂù,«Œy¶zçÞ»\s`ÐEÉ¡Æ÷£ª*|ªÂL5n Z{Ôùs>–°.Ìþð\ÊYèõ|Üg¦³žõ¬g=ëy8Œ©j´¿sV í¬%p®+{téÿµU% ge1)V-½Ã9‘‹¬³ï…I¶“ 8Ó s¢Ï !a‚ÇͦTV•}$y·Û¥?X[a(³‘®Û˜Êº‰sxÜíwpë£wÈíhYð*•™ÔŽØG–óJCåj𦯹J<ÄÅËé[ñÌ.æ%øªlNl̶ÑÎÒašzŸ™ÖÄë{¢ïGÑ4 ¡ké— mbcgt"ÇH\-¤_¹nÀg¢÷(kе£ÖCßSU5¤Ìb±`¾·Ç©›ÎaŒF¡˜mLØ»z•Ê5hU¡µçôé“,–äžùác wÝó.67¶IÁÐL2–“§ÎréÂB;g¾w/§ÎÜÌf5%/{B·¢í³Íï¹›ëNsäòåKllžàö[ÅwßÃÎ$Ìç`3§N_ÇrÙ²¿wX¼îŠeèQZ‘¢ÃÅÓ­ <=Ítƒ«—¯2ifÜyçTÎcÀ§Ä‰3'!ȹ3Ù˜BPÒõ+ürN]×X UÒ,÷¹rå »'NÐL*Hr¾ù®eQŽ_]×8§è—Kó&yêÊ–sœ¶„¨pÕåqÞ‘2ñ±ÃV ÙwàO×¶Ô›3ñ›;…aÊVµ‰Ñ–2I-ÈÁ“Ñ,»•«ùô§?–·¿ã]¼ÿÞ³®ë øhã‹§7ƈ:•ÐQÀgOÀdã*—¬#ãœt_—<‚Œ†,Á{`ÑáO´& ©ß&ÖŠ>ïÂ<£åg]ab ì‘äyX £LI•×Ä ˜4ãóRJ:Õ“IôPÛ*׌èÔGð­häáµÉóÑ™1\nx}Y2Šˆ*êu¹vU]¼¬²#RíÊ9°¢ð0FKíYÙ8UL"•ðÜ#XPè#Û)¼qd|éöHÖT&'+–4è$ç †DüØ?»Yèõ|ÜgØ•^ÏzÖ³žõ¬çÏód-iÍ:K}ˆ\Y—6!Ø+daøTp­Kð1n¤”¦ÙœájI„ÐVÑ¥„ωjRSMV%(lob¤Q ÓLJ2/h«©g39XÍ%i×Y¼’dn^E©«êzaxä”ÑNóÞÜÅ™“SvU‹®*ºd°ÚЇ€s†>öØlq-Ãj±’ûÈ#Á&Í„ÙlFò6DêzŠÆ€Ïôsy\ÓT´mv“É#›¥—Vg g¦Ó)‡‡÷á[K½½CÐPÛŠ~µÂV)Eü¾G÷ç*º©¦Sb׳XÌ¥úËjÌÖ”èµn˜îSUc+:˜nÔ\\2i6©6f´±¢ÊŽîò*[ã}"w+b8qú,ð«%ýª¥í “é&~±ÂlL¸çž{8þ¯^¡ï<*ÀòàS[Ûä*ó®?x7·Üq óÕ’ÝsדBäÞ».Ñuƶv¶8þ.\€  ÷¶;[[ô}ÏéS'Ùßßç‘yÚhÚUOŒU˜Œ1øÕc))¬2øäY-;BNL&5Ó­U]sxxH×¶4•¥þ$EŠžƒý%õ¤a2™°¹³Cž˜vÒ Áû@]Uh ]ë 1âœ-žd‡Aãû–2Ø k©‹àÏpÖUB¡ÁàƒÁè@¥•HÔ£áÜÙ“¼ÿâûIÚBJºu‚bY°ÈæSVÐûˆQ”"†Ò3܉¥@ÒÏ5“Y)ÊkÕZKÐ\JD_r BÄGùyk­Ø*Œ¢iU€»ïˆâ£JhŸÊR5§ÌS:0ÕF)G 3–ûWJч”|>8%²îœ3( KKœA9¸’PT’îxeäyg•ËsI´^˜}­FYÐà•Æ ›Ó•¤„çR]ŒþgH’W¦mQwÈ{ ¬ÆGÑ%E\erŽR•$°M|ÛR=¥M&våƒ3•~n•ä³HeRÖåýŒØ¡PÉF"ZÎa•ËqW õ%'}ìf  ×óqI3ãþèíÜñØ'<äëYÏzþ¢ÌQ»Áý¿ÜïÿîŸúÁß{°ï$“Râïþ#f³µúæa6Öiz]¤xµ.ÌSñG çò;OfkHÓÍ)aŠT1) ¶Å«Ñ•cËU¥01´T U<!ôØÉ«D2žBDEe-”Š,À)]<¶1Ää‰:¢•¢2…12 ¿ú¶?ä–¿þéÕaR$øžü˜ÞÝwžÃÃC677é¼ÈVS”Ŷ®ÕÆ¡íh—K™z¶RšË{WÈ)‹,XY®\fs{W6c ‹-_uU±8اrŽ'Ïœaoo—3UUãsÏÖÎ6mÛ °ÙÞf~yUèi&LåÐJỞ¾ï‰$¶6¶˜Öt,kÍ|¾d6›±µ3aµZ±»»Ë•½«læHU ó—§[Ì‚çâ=wSYQœ9÷.]ºÄÄV䬸îº3¬:Ozâï¿“ÉÖ„ÎÒ¢åì¹ë9Ü?`ÒH}ÐâÂ%¦»\ºzc-÷Ý{ù|Ní¦ØJ’ØOœ8Á{ßû'@‚'vGi+ÀÞÞJeö¯ÞÃd2cÕµX«©' J%kƒ.õhJØzc¨k ß2ÊЭV¤"ßߨØÀ÷=Ëå|ôÔkkX.W#¸$µ»'O¢Å·­H¥µV×'´¶TõD$Ñ9C h 2¦F•:$BZñÆ;­ÉdB (m¥Z,tEþ/L³Ù •3]¿‚6)ñ rIhÚè±îi ̬±¥ƒô´µåg3)ÊæÀt7\c)%Bß•ÂÕ5ZÙ£Ôj¥ð¾ÔR ^Å£?°¾ö8þäq£M>7†DuÉM0cJ¶*á„)­1j¼ï¡;Y+EÖš4&z—×â‡$íLe¬ÃÅHˆ½R5”1ŠQò Žg1äá5Àø˜j(uV*eŒ±Ä$½Õ!uBoÙ»"EJ¯6(eèZ?Ú%†tïQÖ^~.„(!€F!ƒDý¡š5€^ÏÇuþöÞ,Ö¶<¿ïúü§5ìéÌw¨[U]ÕU=¤»ã¡Ý¶[pQ0Ê„ˆ@H𠊀EðÄð‚‚„!xàD„H(‘ÝŽã¸ívhÛq5ßéÜ{ÎÙÃþ#ÿÿ^çVÛXH´ªDõþJW÷êÜsö^{í½Öùÿþßé3o|–ï|ï[ü½_û»÷¡pÀ|d8=9ãå—^ý¸ã€2ÒàHZå ¶ï3V纡´¯¤ñž¶0{û IC ÅÀnÌÔÌTQ#¤Q )3ÒB”o±ZÓjå¦@ô)Ñùœüë÷ ’À´ MÓ2Ž#míQÊPÕ+bŒœŸ,¸wç‚ó³E–nûžù¬B‡ˆ$Ë6moQ•Êé¹Ñ³¾Ù”ÎäÒ“ÜõŒÃ@Š‘Åéõ|EeLaé5/­ŽK¸ÙÀ8ŽÌÎݺû)*¨òÀÐowý0°:;A›šz¾`F\7dI²³¥",²éy‹J;Z¶ý@­ ‘Ìt]áÏ;ßâú꯽þ:ÞE*'‘kƒ—°¨Žˆ!ðüò’$çç÷¦bØ<{zI,³ã¨Æ„4 ,ŠV7,«Gêst—ϸþà÷>ý W<¥¸|ú”åñõùÍb¹À…À“GÏ‘v]WXcÍÓÇOsTHœß9Ï2^™{¶sqÂÔšÓ³cê¦" H´Ñ„à¡°:W™UM“d¹²‚z6'„@×uy ‘‚£££Ûa] VÇ'y´x¹Þî¨ê-âÄžš’Š½Ùl2C™  ‰±€SçÍœ)äjÑ@Ä‹šÕWäÊ”"A ™uLI Hái¤`³îq}Ä¥¼ycC¥ôô¼÷ëˆ>Ö”Ñ ýx;”©Û¹ªR¤Fe5IŒ‰cNM7Xú¾'ÆH;krP^Ü«(sú½sŽà³¼9ôC¾6ÉÕMR+ŒÑˆ}Ou™&÷žä}hX*Œµ”ŠàB¹ÞKçs 5Ë®·þèýƆ+áËÆšsÛÄʱK-!‰ÒAÍÔ ‹'[‘‡tŸ.x´4r«÷H·ai"åÏ2XµÙKÞÁGD •F”ìƒXäó!¸rïSåxó†Œ6YêmŒÁ—l¸õã ‘P¢tD#ÊÔ%0m_ øÑà0@ð±BkÃç>ó…û08à€>Z>òó>ˆ˜%Á–‘üè °ºJ‘"Ó´gyH‚X:vd¦‚ÀçÇÚÚí,FånÕy;×ä`OÊ,[Ê•N&P’ Éi¶)Þ¦×*I•ÃÐs~~Áç>s‡/¼yŸ~óœºÒôc=Gs8Z.iæÖEÜèINdöYkbIl^Ì—h­iÚ:¿òâ}>ŸgVMêù mLfÊl ®5×××8çh›)¦iH.’”gè#„-ç%1¦Æ!ig†¡·°sY&"ZÜ0RU†0ØR·¤ #˜¦À¬ÝnG¥ Æ(FÛS׆årILž~è‘B£µf,€]„¨PÕWÏo¸Ù\ÑÖ Çwî³<½K¿Û²Ýv\œ_°ÝîŠT9b´dŸmؼÿ„‹÷xø½wìn@iM½ZdÉþÙ¬×<}zÉÝ»¯¡¥¦FÆq¤ï{.//±vä7Þ@jÅv»%Ušùl†s=)Áf³fµZÿ¨BJAÕÔx—½ã¹{9û|¥”Œb 1 WÏŸ³½Ùâƒçâî UU1ŸÏÇ1‚EQÐ÷}öÐK’“ßAˆ#¢–Ké}f+Se ’‚íóçÄ0uE’)Sމ]À柯´ÌÞ†˜Ç¡LöÓÆ!÷KGçP2#ø2oB‰˜Š„¸\R¢ëìµê6žRý¤¤@ÄÒ‰\6 |ò°O.‡)É~ Ûbþ£e Ρ|>&BЏnœdÙR*rUméB.áYÞûÌèú[¿6?³y-iÚÆèi(Þo®‹JÅÿ/îß”€?Ú’¢>îƒÍÊ÷kEÓ4SÚ>”kïÎab1ç°•Aʽ…væ½£ð>K´•Ê)䲜çiÃ"%ödûÏ«’TBß„Ô#®¼V%ófLðaºOÆÒϤž6 5VüÈá a<à€8à“€qïW.rC_Ø“$rÕK }‘Äz̉×QøìÞKc ›´÷N¦{ze‚>v JbÚos•™m©ó">yŸ«^T…ˆùkR œ‹Œ6³ÚFä>i)%ã8ð[¿õ-þþßýuîžÌùé/‘»sNŽkêy¬ ãh‘¾Ãu=uÝ2_döRÍl1'”¶µ¶ÈÅ%í¬@-Z„ÎádÑ hSOÖ9ŒÊ`Ç,»ö›%ºj9i•û./´]>ÂÐŒ»®x@A—Åþ:’³HAæŽZ%$]?€Ì–Ç4MC¿ëB²s#QjNÎïçš ÆÐ¹‘“Óì8°}vÉòÈÐ,\¯#‹Õó:×6m¶‹Å‚ÝnÄÏõ¦g·Ûq÷þ=ŽVKl#™™š!%vJ²ùî[œ¿ü*•P\/:NÏÏH£c74UÃПòûßü}Œ©if-÷ïßǹ‘^bG¬w´F²:šæÒÓÎjªÊ°Ûå𥺮‰Á“< Γw ¹}8w¹)%\t4m›‡9¸¾Ù È}¼·ŸG™ëÏ„`èúi03uãÈbÞ‚lž]3Ž#MÝÐ,g(m@IT;Zl\àbî4†qö”ÊŸÇVj¢·øq—‡Ðº&bÑH¹þm·Írn¡$ºjÈmЙÁlŒ.i² @ìè©ç3ü®xmËõÙ4Ít½îž}ô²ìØÃ±$d¿ôA+¡ègpžÁ•k>q[u•"Ñ—Îg²u]UáµÊ£—ïò0Øû|íL½ïSòv®¯’’¯@¤Ûz(!H6L›hºôÊÇâu!æN*$Î9¼÷ŒÑçÍ”2¬‹òÚSˆP*o6¹2‹Ê”‚J9Å=©²A£§ÞévŒ(Ââ„DêjJ!'ŠBÙr;6 IDATöû^l‡ˆ¡4Rªâ¸}§59{çÍ•ë¡2„&/ –à\Âá©„AÄ„ ë=¡<¦õžõzMÓ4(¥¸÷ò ?óË_eØ^#ãH3«i´ÂÚ0¥“Cø 1‚¨Úº¤I„’ˆµ6Œ]1Y&Ý÷=QÀl¾ÌžM½ï„ ™a’¥>K FkËÂ8/¤ƒËÂFUŒ>W?UMf‚ÝhIÁfNp|tD·Ýf?¤”Xg±ý€ÐФÉCmjoyúä UÚ¥6™y-U(%@äê±õnÇ|Ñb”ÆÖÔÚÐ9ËzÛç!­6ìÖWœœž¡ë‹Å‚º6,VK¢Lœ,VôÃ@÷äŠîÉ5_ú'~†¡±ÖrÌw½c›,< &FÓ4-—·TJs|qL–ÕjIŒ‰£“BJôÝ5ggg¹æGK‚·l·Û‰ÝÛwAËÂ4+­&&/ƈÊ.'gÇ8çPËÇi@·èûžàóûÑu]–PÎYêÆPvKH)ût¥R<}vI;oiª7æŸûº¨ºB&I=[æZ.©&3á–)Îù[‰ëçÏ)"‹”!lÄ˜Š¨a?W•„gg‹ÏW)b°@îÞ³’Rä¬Àɱµvz]{ɹ”’‹¤XJPÙS›Rš’.B“÷òlê½'¤D(åîXGÊ]Æ 4›2‹âm ª*¼È^L­sânTV÷Èi¾ª0…Š">úZUYžZB‡*•Ö•Rx$§§§Ü=kñCÏ“§þàñ5~»áçá‹\œ] \d;0‚Z+B€f~ý†}IØ–T¦)²ìy³Ë}Ìãˆ1¦H;a'6ùX›Ué"öøÝ3ÆÑÔåµ’OHu{†­s ÖåÑoÄDL‘¾ÑÍŒ¦‰¬×[R,+ž=¿Ìƒ)Ëu­Ga0F3ĈÑ5µWŸcæ3´3™ÑÞm&b-ã0²:9&!1ËhÁùé)!EšªÆ®¼q÷Çyúþcâ8¢¥âÑõ5¦mxðÚ+\]]ÁÐSÕ+ž^nik‰VÂHˆ‘]7rrvŠ’Ž*4ŠçAÈŸ“aס¤DjÀ(tU“|@U†ª2Œ}O3_R¢ifxƒàÝwÒÎjêÚÐ4UfΑcËîfãÀLë\Ý%%~ô$ç©*Íh{„sÌ-)I”4ô›¹šs|çIè€ D)°Ö²\®ò{;Žçik‰Ô’D$ =ÉGl—û¼UÓKÊt,ÒÞœT­IH¤2„èqEºëÓȼ^bD ÅÓ9õ[ˆüÜ!¤T(•@æÏ¦R*ú ‘­Z"…FêÛ+Èá~ZK$šÞå5k-1„,wÙ> Ca±‹üYùúˆ1«HBô‰R锲ü[0 !ºREFžNø€,¬¶’ÄÐÚàCĆˆH’`-QØÜ½6)[ø,—2o^‡)y€¦É÷m ¢ÒÙj‚ ¦R•@ŠˆÐ!JU¤‘1³9cÁCt%$6ZRÊÌpŠ ¡4ÉÛ)´p? Ë$1R£Kº8BNâ1oü¥˜ÙüRƒU+IÒ08‹™²Üs>*è8à€8à€¤D>:d‘Ok­³g“=s“¦]tXyÁ/ñ@ efž”%ب nšìç,‹ïã8Rdt™=«MöøJ]¡t‘jF'TR`gw|ûû7¨¿øg~’?ýÆgU¤ÛاOð: B^¼»”hš†q·cì·ˆfÉr¹$¶ÈBSJE>*rUUŒ´Bà‚Gø²øž$ I ªÕ B(rJÜí†s÷+Éa´dwuƒ÷žÅlÎõõ5ÚTh! šÙŒÝnGßç¡K“†n»¡Ñë› Bi.îÜÃÅ€h$ç÷î"„¢ëÆ~‡už£ÓcŽæ5ÁȘ¨Æˆz¶77­Ž‘Jc‡‘f>ãùÍ5g÷/x÷[ßE"™-•D)Ãý£ûï )rýô9}×q||LòŽfµ`±¼Ke Íf Àöòš4XÆèÆ”©QmÍ|1c{³%¥ÄK÷ðþÑ78^­hš†Õü”¡ëpÑ‹eCJ‘ùêUj­Ü8fvP¤1h-$¼9¿¸KA}À‡gVg+ŽÎÎP(ªª&„ÄêÌäÏY—SÞ·ÝŽ¶c¤aèFL]Ѷ5U•‡°Ýn—Ã}0^ˆèÆäP·"µmç-n´9|Ëg/ëöfM ªž1xvð¸1Í¥%ÆT) z70ÇlÖÒÛVÏɦiAæ])…lR’b–û¶õKÊué2÷›'2;®”"íù Èļm‘Iv¸†ô!‰1@Œ•TîížVú,¸÷ï}À{vU)Eò'%ŽHm*DLÌ3taðw£-÷€Ò$£qÅ2’f9=¦1†”mSÑÔu©2»}~ ¤~{„È¡iRJLaóis`ÏÀ'sÒ·Lrx™Öï|@ËêyÙ£®•*Ê?yµeÊ6ƒT ë1 B ÒdñÞO½òû÷5gÉç°:Y|Ðú€8à€8àÿ‡P*÷ÆŠ˜kfbIï­ªŠPÆ(£©oÇRa# Ûu+/ÝKÁ•ÔÓ¢sŸºëœË_¯â´ B@‘>§Bʢϋà^~@ ‘oüî·øƒ¯‹ŸÿÒ¯¾r†S4xÇÉù %`·Y3\]²»ºb˜Ÿr~q—ããc¢Ëé;,ˆSIîû>?_(«®¼ø”PFÓí²Ô;”P³ÙlAJP«ŠJ*¼·ØÍ.¿>S3Ž#ÝvGU5yXnš\s”r0Ör¹ÌC~?püàŒ›ÅM>FFÇ[ßýÁƒ7^cÞ,ói-~èY, ÃÀéâ=’„ƒ yËÍÍG'§„!b¢mjº®ãÕ7>Í£÷1zÇqÛ’d~L¼çúúšaݱÝmYœàS mØnÀ‰o-º®PmM‘ˆf±Xàmà¤mYßlXoÖ|úõOóþûïóòý—iš†mßñöûï±X-p1p|²âèhÔ"tÛÖæàªºmQäîcçJ“æw~ãëÄ^ðö[ßáòÑøñ†ÅjÆÑ|Æóç'œ\o9ð JUV©X¯×ÔíŒ~Q3ƒ1uîÜv­K˜U‘Òš*{¤ oGD‚¡ë¨ÛvÚ( ±H¡'EÑ ]×c½GW"eo–í‚/ýêRJlIrγSN²–R29]›`µ—j+%§P•z¤øÂ5¢µÎ£Ü ^äÉŽQ½÷×§ ž\‘˜%í•ÖheŠ#ÒV%e¿„€½8¬ÞV:•îâaÞKñCñ k¡JµVÙ4K9ÈK•>ù|‘ª‹Ûk_å:¬ýã )†ºÎι)%}ÏØÇíÿåTìÜ &¸”*'¦‡åà1+Gô^6¨Â¦ AéÖ ÍÞ›^þRÊv$oP=ä‰|ïH©|-eº\JI"¥I)síV¤ä?´yñQá0@ð±Â9Ë×þþÿÉõõ·N“8à€O6^}å5¾ü?{Qü¤¡RàB–Ƭծ´ÆÔ _ü¸ÿŒž. Ø›œ˜l‡‘å|)uK·þ>±°-'¬J·oÊɵÎ}®­ÙKGYÙ̉)f<|ò ])V‹#ê6‹7ø¿>xÊ;ßüö—~ ÑZnnJ”i8yí ¼ôÅ%ëgsr¸u™Yòm4cŸÊö:{ÿ¦n«²(ÎÞYB¤iSÕTSµÔ&/꣆ªi°[nZ’ÒD$³UCÛ4Xçh ³†ÌNe?s®%껞ˇYΗXïèì€6†‹/!•bµZâS`‡ì×y¨óÖñ¸8š7t]GðBdyt† ;z¤T,ª†‡Ò=‹Ï~޳×^EEG$ÐÖ-vÛ1ì:¾÷‡ßæ+æðdw·Ùb=Ç6Š¡ë™Ë·µx-hKªnd¸épÁã+Çl¹ä;ï¼Íêè)«ã%Z*\ðŸ²<^rzvŒ‚Í͉¤_ˆ8½çh¾`;:”lÖ»nÇÍõ³ò¾(ÎÏîa.?ó©¯#캑H¶j)ñ!0öW¶ûçmÓcähµb·íQ"0Z6rê3Ác¤A$ApyÈtvD„ˆÔ¡$Õ,³ÚÃh‘FCŠXˆ.¨ ¢ ôn[¤å9Ú»ëÆTdë´Âû„³ž›ë-ÎK¼·(e²|¼l2I ù”ë£dœ]1Q»qÄQ|ÒRd©ºÐb’Xß‹åkLKÁà1ŒÚ‡yEšÆääð"O–¦ÈÞ“œØæ¦2¤2hî‡i]e†_r{ŒÖZ¹ÿXÆœÐmñÙ.±÷ ÇP’ÒCa„#ÇÇÇ™y.Š[u­ ÑùéýÚÿ[H1©YBÔuû‚^Žªª!}¨›9¥„,}÷¹×:ŸoøäH†xû|é…äî©¶p!oXM¡h1ß甎$Êû¨¸}¤™ò!ö÷›¶mó9üˆGˆÃ}ÀÇŠ_ÿ¿ÊryÄ/üÜŸý¸å€øÄ£ÈÝþÑþñÿqûý?¼ßÐ_û_囿ÿ»|é ?~¢?AHB°eQL^PÂäI”BK… J¢ÐŒ|LD‘J¯œ†æ}ânö‡\%<ö6ƈ!ûË÷í%ÞÙÌlU gG67E“¨[øÉŸü2 O¥ -ŽŸûé/Óþ¹¯òîÛï D@ªD„Hw³Áv!úÛ„àÅucvݦ0ˆ’GŸS×5”YÚ²`Ž¥/Z)ÅÉÉ Ö:¼wø°ÃȰëÊà”¸¼|NÓ4¸ÍÈóî’—^ùÖ{6Ûº2Ôí€èÜhÙír˜õŒÆ„H³EW¢£ï{º¡çìþ}ªõ5WWW¬ŽNPÊ0Ž=NZBŒŒÞñÆ>‡¨4:E?zÄÌÔ™5u0Z®íÀ¶ïøô›op}sEH°+ád~»e£nøêO…Ýn‡‰Íö!%>æË%ž<%%rÝ”$%ÐÒд3¶}GU5<¿|ÆÛÿøû|ûÛÈk¯½JŒ‘““v›°çóæHU)|ŠŒ£eÓyŒÊ–óû´\,&örGæóù¤~ÈÊ-ÚÖPd)ôžÕì»,(ÉÑñ1ãv‹s‰¤$Á¥ic(¨« ¥ÄTÃcÄ9—¥ÁFâÆ*Ä{ëGb ¤$ÑJ!¤Ä‰ÝW=‘7”¤ÌÁb)0…)e¨Kÿp¾Vo™à©n©|Ni¸M)Muû¯c †òsjJ¼–’©ºÊûÛroÉÈþÞø!–[$ð:éíí4Ó‹ÇW ˆÉf[Ç ’ìéØÊãÃÓ@œïEº$þ !JãÄ~εTÆT/¤fG¤4úy„À‡Tdéù¾%„`ô#¹¢JUy.„xá—ém‚·© §ÉɉmÞ?׋¯}_cµ?_Zë[»€ühè>Vl6k~þ«¿ô‘{8à€>NüÄýßü½o|܇qÀ’„I •bLU“R–Pf‰%¥–FRkI”‘f±@{O»˜O Å*Id„~èPJe¶)%‚O­!xLSåúSQUR ¬Ï wÅ<¯WCDIÕÌÑRð•Ÿü?õ¥ûÄË·ÃHÕ¶è6 *ÏÕûoÑUiØâ”DW´$„„Ñ­!Œ™Iîû>§ë*EUúi·» MÓ°^¯iÛ–ªªÐó†FT$g‰8ì®C-æ$‘ ’J)DÌIºÞ;T?ôeøÞ£dÈ·»!3j£Cš<è­5T2ƒ®4.€’½rÌÂUÓâû‘ng1./¾·ÛŽ“£êô„‹û÷°Ö2Øž¶]±8>Á‡€V5£µ ݽ8¢n º5Õg˜"'ßn6Ìš9ÎÆà8»‡vÖÐw[Æ]ÇÙÉëõ]IÖãÀn´|úõ7yï½÷°1Ð.çÔ³³MÇvÛq÷þ=®×Wß¹Çðîû¼ûÎ;H «ù‚ñzÍÕå5¯¿ùÞ[‚éû<ÔªzALT¬ožÓ.*¾üK_ægþ©¯2ºD°Ž~7°¾¹Ah@MGUiæó¥ >Ö×7ÅÿjØívH¡!)”P$©æ†&å4s¿Ýâüˆ·™u )Ò´-J dR¬NOž=æÉãÇ<}ë=ªº¥:>Å´3êEC3k3Ûë,Á[¬pÁÓ …Œ¥³»ë7t»ºªñÔ<¿Ùq~|Îã'Ïú‘¦…µµTµFe¿©xs•ˆˆ(èFKŒ·Òi£F)BJÓp'QP6¤tIO>aÐ800pÀöÕ)|²D®g껡$6xÜ=¿Jɉ½«Éþe!˜7->å %€#Öy´”Xo§0~ñ1Riƒm±ôÂîŸzßCS–Á)ݪ&¬ëøú׿Ãüî;ü¥æ´¸·Á†3dØÅÌ,·«)uÕb]f’릙B‚¢OxáZÈJããc| ,LŬx‹SˆÄÂÚãÈ8Ž,šZgìh-»í–ZRSW£ðÞsrr†,¾ÖZÚ>Ÿ ¥J'ªJ‘‚mfAµ¨)A ëqã *S³X.‘ bôTÇùæüÞ)ÏŸ­yõÕ×øÖ·¾ÃññŠvÖ™¸„ òùϽÁ;ï¼ÃËîó¿ü÷“Y3ãÞK÷9~霪n¨›šYUÓÞÃn·ãüì!†]GÓ4, ŽŽæôý–í¦CˆºY ”by”ƒÈF—Içu½@*MŒ …¦®*V+AòŽ¡ï™Ïçl6tȉé{2Ëgg³†õMϬnp}Wb¼,(…nFk©NN¹¿X²¾¾!ÆÈñStU#“,RnÉ0y8TIx\ÙpÒº"©\ݶ¾¹D«Š#ÒÀÝ{wyüí·†-M»È¬la±§{k¢ÎIõÞÆÙ—çR· nÙæ}Ïñþ!öCcÀãŠôzºæ¤Ì,¼S¥›,÷©$”Š+`’?K¥ Î1x2Y"ž\þ\¥ñI9I}?@æãºU¥T•™¤ÐãX’þåmºõt?zaèÍ9 1¿V•™æ}Í^yMBB©¼Ú?^)Ô$÷~±JêÙîE “íu]ç{Wß#@NJ ã€DM¯e?àg‰{ñwËý9¸eÔ•”¹'¾HÏ¥”Y™óâ0@ð±bï“: ÐpÀ¤(uøüIƒsk-£³„! ŒAjÅØw9+g¿`og´m…VTB£+3ù.í¦›«ûÁ%385Âä,eQ y0ÒLRn)efu +Õ˜3äÆ~àüß¿Å/ðÅÏ-вf¾:¦i¤ñ1fÖÍ(„P„$PÊœŸÀ!Hb&†a`¶˜£«ëË£Þæ¡»ï{š¦¡ÏÐu3É_çóyï"ƒ•¤ž/rØWÙç¦i FÖÝšÅrÉl6cè:vÛ-2å@¸÷ß~®8šû÷^¡ï,wîÜáèhÉz}MU’W¼úà5~û·›£Õ ßøúïñ™ÏžÙl†c»~ÉóìÝÉ3 ''g|ðîìv;î¿|Ÿ#›.˾¥x[žu®1JÉEd¹š—Z0Á0X‚s4u›ûŠ÷ÃaÕ°¾¹b>ŸÓwcéím°ÖbÇ,ÕÊ{h­¥j´¸aàñÛÏX,—Ý» E½œqwqDLXkQ"×> µBývƒH‘0:RÊ õ" œõœœœà½§™ÏðÉà£`ÞH^ýeÞzçÉä#öB Y$ÈZkœsH¡ …¥Ô/H°ÃÞW\þžú¦[“¿ØZ;}6¼÷(Se…ä¬HÜ™ 1±ï.u)%ª ® ¦çÝ[4öÁ[pËZ¿>&åÞ? Ó½—?Só6…;JÐB¢¤‘{¸E,¸Ñ`mþw¹Oåç(òuÞ"± ®¡¼Žý¹™ÎkÙØûÂ÷m”ÏY¢oÃ)ÌMÊîcî¨jú9Rbº©…@ë*{à9H¸ø”zx 8à€!ÜCðIB°™åJ2K-ûa@MJ/$j+ƒ žZ@U™)Uv ,*UH‰%Ø©®kª¦)1äÄîN›ànèÑ%™·Ö&w³&Ç‘Ùl†‘†F æ+Ák_z“-gGG ã†0ˆº%UŠ~ìiP$Àä!*Äqdì´ªI1M¿·CÄ_‡ŽÝzGÓdVhÓ ²Ü²]Ì1uR²»~ŽÔ’º®}Q3wqç^N Æ\}TΫ” UÂ=£l-×#b¦pCÂè#nèÚà“çèü˜¶¡UE×uø‡’ºšÓuggg¹ø(%êºÎ)ênD)ÁÕÕ5G«Óœ}v¼e.•ìÖ‘ùê”áñÃ'X;p´\ÐμõÝ·xóO}†‡;Ç£ËgÔMÅÝ»<¿¾Êx2„Øól}Ég¿øºÝÀ§—¯CÞ”A³~¾fÖ4Ømf““ èº"8;_qv¾"I0•âxqÌàF¼÷Ü}y…ÒšõfGðžäZ*ìèÇ)«£“,µ×šoþþB`±Xд5Zkf³)Eê&Ÿ—§ï<¢ª*–Ë<4×uNI—RÒ;Ïb± j*ÎWs¶×W<ýþÛˆ¶a±XRÍ3K¬+… U ¿„~ô$³ãcR ȸœ6i¬µ ø€®$ÝnM?\Ä(¹Ùm !‚R#z4¥nÙ_m JBA×zR?j »~œ†Õ”RfjSf¢sÏz˜ÓBˆÔu= Ñ!¬·YV-@?vH -%Qæ{}H”k2ÑÙþ DV‰ Tf•D r±”Ìfí$Ù–”)˜BÒàÃ\/¦†ïeÍMSãœ/Gb ˆ˜bD( ¥+¥D¥ômÆAJS‚¸ˆ·al¡¤–g–ÙO›!ä¦}’÷þØl?dõFð¨ÂjOAƒZOç(]Ú’Jé{®“ÏnïqÎa퀵£$ý˜‡i%r<Ñ } øXqX@pÀ?ŠÄáþ÷‰Ãv»Æy˶ßfvJ7Cf'V ªªžªû šaòÂ2íÙ0AÛ¶Y¥•RY„ƒƒ””$".y¨¼í}õ>/š’«g—ˆ©æ-/ÏŽ!p÷ô˜a³#…-s¡`wƒˆ2y.¯Ö™-6ʹѳ»ÙR×5)ÊÛ@´òùõ¥S·®k*cÇ‘ÝÍšÅb2Ë2—‹%(A?Ž¥#7oøJ¡£`¶XàËyð£Å6{c÷õ?)WÕºfÞhúí!›Ív´Œ£dÝwT³¡$÷ï?`GRð\¯7(¥èv»ì•V©}×1›Í2¨ö]¸–¡wÌÛ9¶ôC_Þ…l4Ö:š¶áÉûñIq÷î]>|ŸO¿þ)êºâÉ“§œŸŸóþûï’n³¡ª «ÕŠ÷>xŸº®™Í2Ë®Mͳç×8縸¸ 2b0ô}Ï®ßñÊË/qssÅÍúLËS*ݲ\ͳ„•Ä\UøëÝM‘¢ÃÎõÄ*]MŸ»²j!ÆHˆžõæºÔ iÞ|óMB¬×ëì™õž£ùŒ]·e6kék-——ÏiÛqÎr³¾âj IDAT"æÕjIUe©¯·.$fMƒ‘Šä!Aßo>œ°k4•V$‘ûU÷ gö©Û•!$dÊ}½ÖŽ CϬ™M ÉËå’n»æìØðs?÷¾ðò]^¾‡–+~ç7›£Ù‚{wô3Á\h6›>3ÜjAwӳݼÃÑÉ «£ü|AŒ o‡\§S¿™ÕÊL÷>©Ù{O»\0&Ï\Öøhæ->F”µŸ_Ð6 Ý8d©­nZ(ýÙ…-µ5Cr(©èû\-\àjÜaTE]×Ä.D¬õD¸8?£žÏRróè»›5ÈD7X*S!¥fèÞyû!ȧ^u]s|zB,C}Ó¡”œªÀÆàÐR°h¬·=1 ÚÅëÎ.î°Ûö¼óÖ;|泟apý¶Ã‘]·ãâøŒïïûTó#j1$^~ð)>xø>ðåäôˆÅì„jW£•áêêš³ó’—D™0«U+Lk¸ò H`=•©ðÖ"¥B%r7‰v–RgÞYÚvŽw‰ªmuƒ-C·ÉÉÑI|BiƒÒï¾÷R)ÚºeµZ¡¥¤ßn¹|öŒ¦Í2èÕê=äÏÖÕÕ3D‘á­q:L*@+5ÁGlJÔÕt€),ifosbv°Žº)8jçô}ÏÓGO‘{濈"±\ž"LEL‚G—;.¯¶ˆÆpv~“Ǘè¦btsÈ•S!rèÞJ„·]Çþök”!¾ ª˜<ÏÁ#SéÊRkˆ2‹{/¿žM žÊèÛ¡° Þ9¢óò% ‘åù|9.£³ €BšK)©šÂâæŸbÊ0Á;K,éé®$Ûß2ÓÍ4¼îÃັŸ²jcˆ¤ÒSïJFƒ D2‘Ⱦð)5» ³"Š©Î*³½·iØÞ{Dð$Aö®§Ûz¬=•0“Bf:"Ÿß˜J‡·HŒ£ÇŸýÚ~ÏvçO¾B±¬ƒI µÂ»CôŸ û=þÛû¯ñµ/ýUþÆ¿öyf\l¹įýí¿Íïüù’þgÏþøùƒßoø½_ýßøÅ.^6  ôð#‰©"ä€OĬFÛCNÛB‚/ì©@6&{T„ÂJeÆH¨œ¢k¢Fˆ%Ýv‡Ö:'wÁ:‚_n/À(Ð*'UG"Z $à³YÃÓñ?ý­ÿÏþ•¿Ì§>uFÂÝÙ›xá@DL2(#QºÆTšmESsЍ½Ñ23b)DbH4M“Ì¥ WWÇ‚ŒæóyN‘÷ß}a7p¼:aÜZBkÙº¥5í2/¨ÝèÀ;DˆØíš]ðyá]kæmCT3¼‹ø~CRŽgÏÖTÕ ’ ÅÖ[Z)é×9à+Ž‘ˆa=’†ï}÷=pvï.Ÿù±/b‡‘çÏž±8ZÒ÷]fÿ´‹Co‘Ze&µÎ’øªªÐÖáœ'¬=ÇÇÇÄ&òüfGLçFD‚¶óþÛ8Z,y÷ݸ¾ÙpyÄùù9?d~ºà•7^¡5%áújÍè1öœœ_Cb³yžƒ¢lä·ÞÍ’ìûwp£EHO%%ÁGœ·„½¥nD»\ ¤¢ ÛíuMß[$ -ÕlŽ{‚ 4u×È!p"Âå“g¸ùˆ® u[óêk¯ðÖw¿Çl6ÃZ‹‹ë#ó§”Âûˆ®ò@cbÓw™IÖšÁöè¨éûˆÒ‚¶®±C¨²ÂÁÛ‚Š~tÄËã3d–ž|ð¦£Ú¡ )$îÝ?åS¯Ý'¤D7ž]ÝÐw®È‹#Æ(”(rcòМ¢ÀTŠ#u]‚àS¶Wˆ¬ð øùEJ­ìˆ<"¦ÌôÏgÓpê}@)p¤Îl­Ðyx×)!"!HB!Ts©r‚~ñ6WU…Ô eZ”îö”Ðøä§^î¡0¯J)úÁ2 ÃäÅŽAb*EÓ01»pÞâý-Ó.ËÜ$”"PB•*¼„V²x§ó&AHY:n½Í‰ÿJâ­+IÙ‚"Ä®FÐT4Rйž!æÁX›:‡¿%A…åÖ†J•߃eHwÁ#b(­‚˜"Ûí¶°Í¹U@늘.XeÁçv‚û½ýͿοð|›_üë¿Â¿ó•#Ô‡ÖŽïÿÍ‹ã¿KüëÿÕÊ_|`¢áâÞK¼t>ûwï÷£? ä{þ_üÌ‹øŒÿõ¯ü«ü ûÏòŸü‡™?½”· üîëüµ¿ôïóô_ù/ùÏþÂ}Ìa½ô!pÀ*÷¿OfÍ ±J·a9…… œñÃHŠHGo-Úhda½Ž—+Beo¥4†¶m'cŒy ´Þ“„Â˜ŠºÑÙO )DdÊMUiÜè˜Í<ö˜o½õ=^=;ÁwV'š0zäìˆJåJ)dîa½¸x!É]Ë1K+%bB‰‘’±ÏõZ]ߣuUMA ç77\Ü»KÕ´ŒƒeÑf™ªYιºy†US³:>¥V•"Îb?Ðo¶t»-¡ï°CÏ͸äĸÙ1[¡çK¼ö*Á[‚Hôväôüœ³¯PUÏ/Ÿ°q=r>c¾X°ˆ—"?ñé×0u‹–’÷ß}ÙlÆ{wY­–Xïxúä)7›uqš¡ï™ÍfôýŽÕñQéCnˆ1Òmw¼ÿÞûœÝ½ iZ–Ë]7°X澩g¼ôò«¼õö?dytÌÑñï¼û.÷ïßÏ]ÅÝÀ ÑYjÕfù®Ñ C‡Æ’¸¬‘Ò³\.Y,l67ÌÚ:‡´Yˬ™ñèiö$[;LIì»Í¡$³ù!&–«µi軑íÍ‘"¦ÒDÛ]NÚ¶Îá£àæù nô¹—ÚHNΖж,‹R¶Ù°\.Ë0“ýһͥ 1æð'xk‰1K5¦"¨Œ!–M£#Z(Œ©QÊÐw;RÌ›¢´%¢ŸœE@Dx*e0B|Ï[ï­yüäŠÝnt m»ÈC¹L€,~\…÷ùºÔReEEt%-û–€’)9A^Dˆ‚I~œ1o%Bè)è ò¦Y–‰CH%!ð/¤„ÇÑZOá}RJ”/HÀ™dÖ{Ùô^î\iÅP†p%eÎq:þü¥‡ÛÚI&®¥œ’õµÖ%H|È]™»Ûa„„ÌIç±ÈëóÏû1×w¥”ˆÎ3ºü\ƒ§<ˆà<®|=„\Ý%”¦ë¶!¨Ûf:¾öóØ<|Ž ×ü¿òwø‹¿ò/ó™ZLÃg|ö«üÿÃ÷ñþœË]$%æ%~ùßýø§…ü¨;³ÿ¤œùݿſ÷ßá?ÿ«žW& x"ÆPÒ÷øAè8àGâÀ@"±\®X-VÓàÜ÷=£³Ø.‡uùqć€MŽˆ F®jš¦a¶œ£D!Pƹ÷T)Q7¯•QÄÑ{ï‡Û…s’•¥Œ–D1UÅñs¾ó­‡Ô_˜ñêÝ»˜4àUpžÁ‚©Ñ;¼Øn/s€Ô|IU7l7›Í:'N°Ûl©´F(E×u„Á28Ç|>çâάµÄTmC[7øà¬eq²Ä”Ú¼ãêÉš@nãZ±én0J¡s‰»ó«ãÇW^e»Ù1ÞlhK^¹¸—½°>¼-Qó9Maã}ï±Î}¢ê=#„ÀéÅ)Fäp´ÞY”Ëë¡¥B—Níªº[*Š>¤®k–‹Özf‹9R Âè¹÷Ò}¢H“çöÑ99;çÝò³?ÿU~í׾ƫJq||ÌzsÚB×u|þ‹_¢žµ|ý7¿Îýû/±š¯X__³Ýl˜Ïç|÷ÛÈÉÉ ‹Õ8G)Ã?üõßàéÃøÒÿ;c8:YQ×5=áòò¥óùœ¡ËÞð¦dózNi©D‚è<½ßcdq´B±OwNØÁ1îF†a ÒÅ,$Î{v»1¢+@$Ðuk”Ò4Í )ó{öÚ˧|öÍ{¬{KoA¾ñ[ßdF¨sUVΕŠ m›³ú~D%hLÅès§°H@Š´m›ý´B œ&…ÛDiï³!DG]WH¡I„ꢊ”CŒ=)‰€§åäõÝW;i!PB`‡!'ôC‘R—A<ýßì½y´e÷]Ýùù gºã›kTUI*Í“e‘ñƒM“š` Á˜€IÒÍ"NÒ!é¤BH€@‡Hl'`º v3ì0¹±±A²­yª*©æ7Þ錿!üνU¶e£kID~{-­zºï¼{Ï=ïÞû~û·÷wo°ÞR—U˜×n®ç†Çq˜q×Ò)‚éÝ^oñù#”DàqeMã<:šwH·ç.XÜßüï’mÉ»1¡ûzþ™I…õ¢–Îù`³nŒ!N:€ n6(MkMUW8Á¢÷}6›…§è¯l6Zk±>Ì”7uCYáy7ùB½ïDYpêDÁònêÄ•Æçô¯×èŸ{¿ðá¯æ¼z>³\òÈ»ÿ#ÌS¶s$PŸæÞþ×ùÍ{þ)¿ðWn"•êMþð]?ÍÏ¿ÿãœÚS8yö<ŸBÍžË1ŸŽf—ûþŸŸág~å£<¹'Y¿é•¼éíßÉW]ßý4¥¼Åêí¬ÝÿÓü½ÿtŒŸüË·Ñ{V†ßpöWÿë?ÜÇ…Ü ŽòÒ¯þN¾ï÷°¦ØM~ç§ÿ9ÿþÃOqi7§&ãÐ]¯ã^.ù“÷=µË×rï7þU¾ï 7ÒŸŸÈç8W9ùc~üoü3¾çïðãoûlçõÂ`¹}ìãóûŸ/>h©hšf24õ±Æ!<Ö5à-±Ö8o褤֔EC§Ó%IB²–ª%µ-ig’·½§ª *žó0#¥Ö;jcª&Ž’ªä¶lxÍë¿UM1Í 2XJ3¦uM]DqP¯qiZ„à2gÐëc½#/ ùtJ7î„ůó(!ƒ•SI’AE\[ÅyËh2aZÔÆÑétH£˜"Ÿg)¦ª. qœT³1ƒ,#MS¼÷,/ q:Â:ÃÆ`•éÖ.8I¸ŒŒ#¦ÓJÓé"ilC)dœP ÈGOÃòú*x˜Î& W–‰t®W]ãœ'™ÜÝÙAµs³Ýn¼äÀCŒF»ìíí¡TÔvU[””ììí1+fœw]¨ÂMÓ P8×€ðD‘F!hìŘ«Â¼æ\Ó÷¢ 5Q¡ +ØÜ«ª¢jÓ°çÓǶ˜-®C–eÄJ/®wÕ~–UUÔg‚?ÿ\='>·É+¥p•këü$^Þ/º¼çA„ Aô<ÿ=}á ôæ Ž¿‘ï½î=üèø9uï·r2øíñó¿>âîïø²_ø—ìæW¤yoÃl@p/øä¿ýA~轎{¿ù»ø–ëc¶úïx:‹xÇ|*çßâoþJ‡7¼íoòݦ|ô]?ÍOüäÈϼ—ô?³qLùZ~è{ÖùÁüÃüÄ ÿ‚ÿíUkÏrK·½ž·~ÿ×±Ôµ\þ“wóSïúþåÉŸã¿w egò&~àûn"Ùù$ïþ×ïæ§>~×¼ùÍüÀ»ì|øü«ŸûǬÜò3¼ý¦)>÷¹ÞEعªŸçûç‚}zûØÇç#öè'F;;ˆÖ9_H:ëP:FHI#5qšam³P½RHœ”8Ö„€ª(È’„n7Cø b5ÖàÊ šcK$ %¡±†¦(Hâ !¢váºWñ’$ÉøÕ_þ ãÉدûŠ/ÀvR9 dT㊚Úä4MÃØ+†ë$IB*BRë„h“Ï úý>³é-$éÚ*©ót“.;Û—™vI;IÖ%Ë:XÎZêª"I2‚¸¯¢V=Š3Íd:ffC-PÒïKEQ…€4ï<·Lªœ•d@gÐ¥›u(Š‚²Ìƒz¨Rj¬ƒÙlŒP¦¡4é`@Ç$Ý…sǵ¡š…yÝ´ßC(IÆ€8ŽÉ'9ÓIì¤R0X s]VıæÈÑÃÔÖp`}…éhJ·Ûe{k—$I˜M¦˜²aTyðÁyÉ=·ó’—ÞÅÖÎ&JHv¶÷¸é†›°Î°·³KœF\sâ08pè »»»“Ñ$+"¦ãŠÙä,ãñ¥"Ö®S›|AÄæÖW­5RĬ,™µ–X‡d:ËQqŒq%KW9xô³ñ„¦iØÚ‘v:DY&[Zæšk#.^8ÏÚÚ È vê(¢ã{ŒG»xïû¡¯Ú \mð¼žÏÇè8"‰b²N§%P µ vc)l]±´2s­ÂQ5:–BZK„_f4‡,çqNàðœ~ü—6÷˜–©$V8V†’´ÃÞxÚ¦i+¤“¤YŒµ~á*°Ö!¤³»þ ±n\ƒjÓ¶Cv¨L›¿§¼à%ÎY´ŽpÖáG¨ë¼ 3(U-z™ç³ÊóÞôDëEÚùl6 –äÖ".¥D£1uŽãÅqQû½E÷{cH" Ö!‘xë(Š¢­c Vùb–_ù[£$B‡ïUEm"%©Ä E,BIÊ¶Ž¯¶óÇc¥1ëýB±ÖiÂl6ÃZK–d4ÖËPoVQÒõY;Ûliš6ÿlœ‡'ö:ݰi(µi¨MPT%Eãpm·ÞÿJ~âU×ðÁ_t<¸[-,WÃ>ÆüËúæŸâo¿ùDP¤ï9ÀéÞÏýÿ?ŽùŒS›ÜÏ¿{Ïynú®Ÿã»^·A$à¶;|øm¿È¯?ùVó™9cB±zïÛùûßøý|ßOü8/9ù÷øê¥O¿gIïº/âK®kÿ÷¦UÎþÞ_åý¿DóEÃÀç=ãwsïKo&wpèò‡øÎ_º†¯xÃWò…=‰¸3åã¿ÿð±û.ÑÜtœøO=×{øÁŸÿEËGoiVbñèX£u„Ä“çS"'I|˜q\Y]c2™±uñÈ@¾Ï½È±ëo`ãøÀ#lnn†$Þ¶>ËiÉt2ÆZÏÒ°ðž©l°Æï©ššÁÊ2ÓºB6-5iœç9AGPʲnm²¡Vki}­+++\<‘¦œ:}¥'o<‰ÖšÉxF§\¾t~·Çhg„Ö1÷¼ô‹8x|™ —."\ô¬™Lj’,#‰¢¶;!í*t¢Ù›ìg1“É„ƒÒÔ–SO=Å ÛçÂùK¬®®²´ºBYTMI¬£–d |«Dã˜q’P[ƒP`kKÝ¢“e£Ý=:ËKL§S:¢ljŠÙ˜ªÎév»¤ƒ;;;ìníräèagÑQ„3žN§G]54MSv/\¤Ûï‘t2ʦ!ŽÒ«dIÇ€$îtÛÅ4n†1%Î…‘€,ˈ²ï ŽÁg`TÌ`c™(±ÎáðTuM“l³tx¥ã¶¿ÙrñÜ{{{ÁZ-äB…žL&a#¡½6MHYã i” µ ]Ó‘ÄÖMàÎ&X»…’a¬ îÜ‚ÔÝbñÚ”(I°-‰+¬ó¯­µTÛ²i,JiÂȧ[ÊyŠöt: ½ÓZ/f½÷$­¹6Í"<Š"ª¢DEAíž÷?WU…G’¤1®¹ê\¼Ã7–(i»—¯ªƒÐO­åu{šç‹þgß&¥gYH¿—è4 Ä_k„÷TUµPü½êvc-Rˆð¯”8®¸ XÙËyíYQUáw(”áem x¨ä ›\©ý~^ðÂhW²—{Òc’ƒ_Ê·½ò]üÝwýçoØà¿¶É-ßúnèZîÏ<³Ýû,'l¶çl=äî»’´ƒóù)äö¹óéh¶åéÒpþ'ßÊ_ø©öÆöÅŸn8:Ïnÿ–ný–¿Å[?ù¿ò/ô½Üöw}ú=sù£¿ÄÏ¼ó·øØS›²ƒ*ѸäS÷NæÅè1+Ç—õ{u«Z¤«\³ïä!…î9œ«–Ïó+ë9âêêŽ}ìcûø|lç¶öñ"ƒ³ ‹¥£$ív¡BŽ,í0èŬ‹qÒÁ»ï ª"§, UÙ dÍtTÑ4†¥•Õ–x$D>ÚŠÒd*‰kk4¶¶Ä=ÍÒpÀ-7Ü„pŽ{_v3½,%‰E¹K¬<:‰©ê é<å,X3Ó¸‹ ú†X‡…i'ËE™OéÄYXœGÅ 5KZO‡DñÚ”Òdàé3 ê"GW !꺤ß „ ÛéaµFé˜Y1Å65ƒ7–FòÉ”4Š9ýø“xÃÁëi§Ëò‰kÑmÀšRЦªQLSµj–B É ß ©-eQ’&"–\8‰´Û¡œNÀ¢$£(K†Ã%¤Vœ?ý uY¡“”n·‹Œbb%íìn)óÛBrðð Zg1—.\¦®,½¥U.]:G'Öt³Ïœ:Ï}€o~ë[PfJ>žqæ±SEEw8¤“¥<óÄã¬9Âòp‰õU¶v.a­%‘‚r6¥›¥üɇ?†V½•%¢^7Þ@Y–œ»x#GŽw‚…Z§ ï-ZEx+iŒe2Ò±¥5ƒáÞÊÆx.;¯QÜ¡nÂL÷dwDšE!e]¥˜ªAÆ1'o½™'z˜O|ü“œ¸ö(Ë««ÔÊ’t¤LÆ#¢(bic-(ÙÛÛ ‡Ë8kñ"BÉyP€£™å-¹’à,Ó¢"dÈ$nû¾Ó=|SRæ3²,ÃÄ#Œb”Œ1¥¥M9wi‹s—¦¨(&Ž2¬¯-yt!‹8ŽÃk¦lpÀ¤(ÂëHºYÛ»¿”’²0‹±ˆðZÓ¸Úµ¤8Z¶PÉ$QJ.ŽŸ«ÃeY’·½î!¸+Zy…T}MY–ÌËã–|Ûvæ‚ú*„çV7TUx>*Òt³µ ½ÖßöBƒ“‚´µEçÍüñB@'KÂsÁÓI³ðÞ­kò|†‚X‡M­5Ãa8ߢ(pÞ…º1ë°í`¬5¦±DR##Mš¦DQÔÚÕìíí.ˆ~UUá3ć1“(Š)áiË$bq ½XcÁz¼±t’”A·×ö±—m?w¨îRBQÓ€aÅ_ô'^Xm vKH Jô¹ë›¾–Cßû‹üì¿íñGâ‹ù‡¯>@¤wfPḭ̀þY.,æs…t=—c>ÎàHyÙ_ÿG¼íæô*‚'ÈÖ†ÏÞ-=?">Î×ÿ·ò‘ïý7üè{¿…ì*çtsöWù{ÿàL¿ä;ùÁ·Ýʪ{†÷ýÈñûŸãTt¬Ô¡^ Àkâ¶OÐÿÏõ…ÆþrûØÇç+ö7_|P‘ÆWaƒDkÖQÛ­â……3IâV-ÊQ¤º =Óê2³bLW4Î3 hÊŠ4Ji‹t%Zh+«ÔÖ`mLoÁ[︉»_z«+ ê½ Ø Ó²!Ö’Éh‚Žk´J@FÄq˜1uÆa•gØÎÑ8!˜ä¢vÉaA¢p&$íZk)ËbA0¤”dÎÂ’ëˆ, ê½½1qæEÃ%.oo±3žuz<´ž¢((¦3&£ ן<ÉÎÎÃá2I¯Ã(¯èt:tû=ªª&ë$L§SÓ,B•BZ¯%J"ª2¨óóE»–м¨ˆã˜$” aµ£Ñˆ Ó¦)`6™R·¡cå, ÒÖ’ÆtÓ å[Û—.Ò3-V×Öxü©SÜxÓµtÒáeUR[Ã×}Ó_eÁ žüÄ# `ãèa²$#ùâW¿ŠÆ… g.©YYY!î†ßYÕÔ<þÿ}ŒÆÃ5סqW*ÔšÚÒé 0uHì±'ˆ•æØñ£ï8yÇmh­ÙÞÜekCª"_Ì0×UE¡qÓÓCcq…%MCð\ÇŒÇcŠ¢`Ðë£TGaðÎPçÎ Ò4¢¬ &ãÒ{p’Iaif%³¼Æ£¨Ãö¸b{k­Y Äiw@ã¬2(”dçB¥–oíÆJiª¦ÁHªoÉñ<Å9$ŸFúƒ˜ IDATËÅçòíØ«’³#!Bà™w¤YŠo´çéìI´õ®u•´Õm¯{©6%›O±CKÂýº–Ø ç±mæ‚b6ÿ|ˆ¢.ŽE:¶ž÷G‹ÅŒ³· £0?¿Ú”H-IÓç¢Åó *|PЕ§í¿ö!`úâ^` wɸ„´vdãk^Ç›nÿ%~äƒÛyÓpgO"DL7†Ùvγ¹Û£õ›9ÿŸøÈÓ”wÜLçY.às9‹ݷV½z=G¢ŠÓ§áàëNБâ3fž?¢#¯ç¾ûyÛOþ¹uÌÛÕ¹ûyÊ^Ë÷|ËWóòƒaû<8àsè? Ös}!±¿€ÜÇ>öñy HÖ>^\:¢ßï· ·†¢*Q·A@–n·×n ’,ÆO5žá­À˜oJ[µ Ïp¸Š-kPŠJAA$":iV‘HzÝ¿ý¿Í'>ú1¾ë­_’… °$Rx/H“.‰Ìpx¬õXaÑB© ¡+Æ£m´T(%(šŠ8ɨ«Ö†)5ZEª,«Öv 8›³YP …„¢˜…™iç WpÎ"¤b{o!'¯=IÖë²³u‰HÀƒŸx€¥áñ?ø]nºùVbU^ Ó”(K)ª -{{{AÙj•»Yž£UܪS‘R˜Æ ÚZÒ*/@iŠé ¼$ù4ÌLÇiÂh4¢“õ¨›’ªªÉË"T+II11s3z½U>ÄÚÆ*V:V×7˜ÎFÁ.¾´Äd2!KQ¤p2aýÀ§ÏžãÎ¥›yô‘§J°ººF^W4:âȱkغt'q't"wF,w<óÌ9²^Æ¥ÍËÜûE¯æÒ¥Ët»]¶¶¶(«Š~¿R‰ÝnÆÚÆ*ãñ”sç.pðà:³|J‘WDI„‹‚ x©»ÌZZB]‡Ó´“ÑTAáD dk‡?qì(<üUY!½#ív¸îæ›øÀûÞGUU¬cY_?Àx<¦j,‘ŠmíÑï÷Èz]×I«&å­5kkkÄr„­+Ƴ)•u$Q¸…-¼±Ž(ÎÐiCE˜Æ1.fãœñ„Æ c˜E' Ò—‚ØGHïÀxJ,þRëŦ•3á56€J¥CÕ[Ó´ö÷+¤y>c:®C%º”AE!äOA'Aa•&ô¹’ÚÖP!‚r aƒ­šÍˆ¢`ož“ÛùfP§Ó¡n礃Õ/¾ç–îùψ6P0Œo(¼+¼5ÔuéJÓ4¨¾ó¹ê8Á8 í9:ç0u áu]#Z«µÇ‹÷ûœ FíFÂ|¬y×B"¸Òu °Öá[¢%ñÂò)Ý>~ˬà Úð»cæóÑó^y³¸Æd;C>ßH˜_—ç/°…»b\‚ÎÂÜr•W¾õ-|â=#¾ø/#‘Ðt2I=S?›Ý¿›ïøŸóÝïüûü÷­|Ý=Gè–ðôôJ§ós9Õãà¶îû]>úÌ^qìe|û×äyÏ?ä‡ä›øš—$­¶87>ÎW~ÕÍ ž5†ûjh½ö¯ñÝ¿óÝüøýW¨|àfñ.ÞóŽ_¥ÿe·q4ÛäÜìÏvåÒç>×þìOþܦpï+ÐûØÇ>>_±¿øâÃòÒ Ò{ò<§ÊgLšP[%tr£`çL’˜Æ’(&Nui‘2&Ò=dÓ0LûèX1˧HÑítQ8ŽÜp×¾ü.þ“Gù¥w?Èêјoÿ¶¿Bç/½åiK&·/oã•ĺë~ö½¯ä ß~ ·~Ç?ãG—~–û›ïàŸ¼gŒM—¸îåßÁ+^w3ƒç²Ñ¡òº¿ö—ùÍïúYÊö¦øø×óCm‹Ÿxçâ‡?P㨷Á­G{Ï^õœ}Îsíã±Æb퟿.êýä>ö±ÏGìg?¼8¡¥$ŸÍhÊ‚ÆTÌfʺ 2%5KËëh¥èv» ’J:Æ[#ª<â®;y-¯xÅ=¬­­pùÒgΜEÉ„íÝþè£|ãk_Î×|í½¤‘gk«áì#g¸þxÊ$“¥)I“t"òÉ­bšÆÓí-…𨴇1JEØ:'‹ŒqW‘öEA§¿¦!X|…B¶sÛUUQÏj¼mç9¥ Rš~¿ÂÇu]£uL–dÄYzEák•ê~¯GU$½¬Çý<ÄM·ßJ”hò­")qJ°±~„|V¢•"M;4e…BP– šbºKã=q’¡uRb”Bª°´uÞ!]ÂxoŠ’y]Ó“ ã8Bê`ÍfEA]Vlnn†ß£ÖÜxãI.]Údg{—Ç|c oø†7 ¤'‰£ÑˆÉîˆþpH]–ha­£)YœðØ#óe_þ ~÷äØ×qèØQÆ;ÛdYÆ«¾âËx䡇ÙHט՞ÿ‹ÿ‘4N8sá,·Þu×]=E‘#%\¼x‘ƒ¼÷}¿Î·¾å-ŒF;4¦b0ìqùò„?úÃû¸ùŽÛ8{úÛÃ:ˆ£ˆ8ë‘®ÂÔ^XªiE5+ÙÜcÄq˜·×‘ÁZP2 õOP¡.É R’8ŽC/z¤¨gÏdf qA!Ê.°¨q é×v‘ž]{‡²Ù¦×u3/bžÐÝÎ@{ï1΢¥Â·Ä:R ïA I–…‘KSפl1×?ORã©%³èÓ¡[¢¬ÖAÁ]œ¾Ýpp•Õ{.XI®Üz¬üÁ:î‚E»µp«H‡ ­@*„w-ñv­šˆ·P'@´®¤šÇqŒAᮊrQÉå…X`½¯ËùõC‚ðÔmÕÕ¼:ü¾¬sW”ì( ýÝ<ÿ|âÙ-zÇ;ÞQ¿îu¯{NƇî@>œ?ëQÎâ ÒÁ ÿé‰ÒÞÏw.ÚDès»ú~ÿÔcZŸ½WîûÓF‰|–“ýÔsüÜÏÑûw…Î „HñYžŸw„»‹_س=Þg?Wß¾0ŸýÜ_HüñýáÕ¯ø²ý…ä>ö±Ï+ìvyêÔÜpýÍûŸ/"üÝÿó¸|ñiŒivÏrʦ"Q¥"’þ€îp€T¯}ÃWr°Ÿqïm×ÓÍbòÉ„í½]¬8´”×4t²eY ”F*Ö*uÍlo ßáÐÖáœGꀺ*Àœ3Tt”ÑíôZ£â'xg .(MM¿?ÄbAÍ+ct6zŠY‰hí˜UU¡´ ®k”Œˆ¢°8ËËË<óÌ34¶F)ŵ'®g{{‡n¿‡ÒaÑ^+ƒ(=õnÍS—/r×ËïF”%¦Ì)ªšåƒBƶwTµÃµÊ›š"/^C)Éææ„–dYF'í2™L0¦&I2ê \c Öt²æœ#Ë:è8ÅWy]ÒÉ2.]ÚâñGO!…æØ‰ƒXãÈÒ”¢,I;]œ«©«Šßýà‡xõ—¼†¥Õ:ììì0¾8ãØM×a]Éx2áè£tº)§Oe//Ù9{žÛq^røèVú)gžºÈÇ?ò ÙÑ>7Ÿ¼‰åAÆåK.]¸@g¸‚’œ­ˆ¢˜|wʬ²ÜpëqzƒÖ7Ü|Ýmüóý|ù뿊Ú4|òÁG¸íŽÛ9}ú4‚C+8õÀcìMÆäåŒ×¾þ«8sê4Ë«KÄqL§Ÿ!%<øðcÜvÃÍ$™f¸ÔAG’í­M–:¦ù S7øÆ U6Eª‚ìÔ£1KiÊêáƒ8!qÖ²·µI…¹âCGo$Y_Ç”;[»ÄIÂÊêï 2‰Ù»x‰ÝËPËkdKë¨8•´¤âH!¤&/{Óœ¼ª1:BEÏœ?KUºÑ!ŠVbY×ÁÊ”NÂQLkŒ ßó>d¢@,•l{š]˜÷5Æ.Ꙭ«iŒA˘$ÕXçè÷zx'p„y\áaÐíá kñÆ;ê²jC²®„æª(‹v†ºí‡¾:XkNŒç¤=Žcú“½ $9#¤Px)B]K°!Ì-C›Ä$mJö|nÙo稪­Õ"Ôl€Wq^%ëp>(ʆ¹¥\“$ ÞZ„Ф‘uY-žÿ}+Š<¤rU¨'K¬ð!Ûš«°)gÄZÒTõ¢޴*t¯ÓAŠpŸB+vG{xopbñó?úý¨?£³õýï?o|ã¿(€¼ýovÕ×P¾À=Ðù<ëBª«ÒÉòY¥ÅŸ’ªýœŽŸy>Ïå~?ó?å;Ï~ŸŸõi?Ëó’O¿LÏöxŸý\ŸýšýyÀþÂqûØÇç#âÙ·°÷ñ?4&“-ã*jWcECœ(lÕ ã­%8O§—pÇõ×st¹O5Ú¤Üs$B±1âU„­+„RH!¨Ëa“|ŒuŽ•åe¼¤½ Ñhª¢@¦1JŠ|œEGá½'Kb Ð`ˆ¥®.°ÎÐ4JÊ`Ç40‰ãMmˆ ÞR%¦¶¨Hcê&tç“…b§”¤,K–—WØÝÝa}}åÕf³ /\ / V7‚p:{Im-{T|Á+^F=!œa<žrôºk)kƒ‹r:c<‰ˆ‡Ÿ~œ“7ÜBe¶6TΣ¢Ã¥¥`»Æ0\Z¡ª êÚ $$ÝO¦H)ÚZ  IfAxÆ£ ù¤!Kz:¼ªŠê •UèO¾xñ<k¬®®.ÈéËŽ~E9¦“¤LTɬÐïtéô{ îºç¥Üß}\sÏÝœ»tšã'®eÐï £Œ>ö·¿ìKt³³³E‘WÌFcʪÂN÷PB"¥'¸æèq~ù÷ÞÍí÷ÜæÒÔy÷ÛÛxÙ½/çìÙsÜÿñA9’´OÕÔ8|€³OŸãÑ'ŸäБÃÜvÃ]<üàèHñÄ™LFŒF{t»C–——¸¼¹I”jÊ¦ËÆÆ++T³)QšPä3"¡‚ͺ©É’ˆ£ÇNpö‰ÇèvºÌ&¢,!íw9±~=OÜ÷Ö——Øn2L#ºÝ>n—HëE’û0ëräøq>Ä¥KÐ"ByÆ¡"‘Z ”²Ä}XYNѺG’e7^âÜÖ„§/o¢d‡ðè}ìcûØÇ>ö±Ê2gg4 ˆ².½6ÅÙjK¯“ÑévHÒ”5°%»Û9k=…µ •¢˜MðB‘u;(ïašƒ¤Ÿv0Þ’Çı&K*“Ä¢]d§²‡ó •ó!¼‹¼ÄØš¢ÉƒJe½NŠñ+±ÐäÓU]€”e‰ kÊ"¨Iܧ6 ‡sa‘>Oð5¦¦Ûï1™Œ©ë†n_±¹¹”µ$æäÑ#Xï8wîRJŽ®å©Ó¼óFrS:Ë4ÏÑi‡ÝÑ„¥¥%œLöFŒ7·B°3pË ·ðÀÃp↛I:ÞX6ÒZSyQá¼£¨J:Ù€½½=†ƒ•Åâ<Ïgh­9}æË«G©«š­½Kh)Éú’´C¤4 ‹óétÌáC¨jÃö·B^êt¬nÒasëQ¼ò¼ä¥·sáé³8åéõ»ìLF¬¨4cX-±¾±‚Ö’'xšÿë§ÿ5¿öûïcçâ%„7ŒvÇEÉñk¯#/floo/¬ÀG]Ëc=ÆË^~/'n<ÊtgjVE GçË^û<ôð'9yà ’t‰•ež:õ=ø0·Ür©K^ò÷ðä“Oréìz+†Ãe”îñÕox®2\òÇ{!%Q±;š°²´DÞTdYFše$J#ŠÔeÅCiŠ)ž| !‡¯=†uA%>|ìz¦£=:*"‰¢I0!XËxƒj„¬l .v/]BKEÖIÉ:Ð=¬SêFë¼VXëí6̦%»Õ ©%ͨd¯S”5:Ù¶6_­Up0D)L怕’(-Þ»s…8Ö®%}M;-¥À:‰÷ Q#„/‘X„‡¤QH¢¥eY/ÂÀæJlHÁVU mõ•rW’¶ççpµú,¥¤nÏ%R o"ŠB_µR =Î[$ž,N„Y B`˜18ëA`J)”‹~hѦaCPÑ¥Ö!ý¼1xêºìÜÛW›+UVøtŸèëLø»x>A}¿b;Ïó<\lÓ&ZH `ê†Æ¤ëÑB"£˜Ê´Ál˸Özd(…€$mg´ÝçÑ ô>ö±}ìcûØÇ‹R%dýu¢$Fé˜H ´P8Îà<:ŽX[Y'6ý,f¼µÒ:vH%i„£ÈË`±l“i…ÖT¦ní¥ÁZZKSÍðMÉl÷2QÖaéÐu”µ#Í¢Xã°/‘µ@!„'ê(œ·$QJâC°wŽ4M©ÊÖÔL&9«kôzŒk˜Œ¦DH¤óÎ ¤V(QS¦Å„õµ ¢$]ôÝgI’„²Ì)Ë’‘R3«,Gn¿í"7X­é¬­QîNYZR›ŠÙ3›äe‰tši]ràÄ5È8æå¯ùbšº¦..íl’v1ÖDaƲn^†Îáao…kŽ\ÃîÞVp2)"fEÃp°Æx{“ןd°z€ÓO=Å…GOqòúëÈ}Eš%ˆ,3™–¬­­a­%Îb¶··fIÓ›Û9qãIn¾óVžyúiâ$a¼»G÷¨fS]s‚ßùýßáºÃ‡9æ,ë«yð“Â=ôÁ©S§xú™ó\sì0îò6Öz"²yþ++<ùä<õèì: ZÓí÷xÍW¼–½½]¤HímsôØ:þÃQ7+««üá‡?Êáõ#üÚ{õ ¦•¡º´Ët\±¼Ö剧.ðOÿéÏñªW½Š—|ÁMÌf3¼„nw2ee-Ììk©hÊŠÞ`€ÇQÏJ.o^¦·ºŽß¼0.Ôž?À•îh/XX½TD‘D¿Ø¼Ï³¥kŸ@ïãÇ~˜Î>ö±}ìãEgIcI’%H‘¨`™nlÊ™3”qìîî2.ÑÌFx}¥H-‰Ó$„9G§Xa©ª I7Å:‹Ž4I¶„5%"íà›š¤¿J•—ì]Ú$‰4y*PUÕZ65Jh¢,Á9Cí ƒ¥> i*‹š*§Ê ¬©ÙÙÜ"޼€¦*)¦3­ZÑT%Ó"giy ­bªª öK·=µ­’§$q!\¾¼Åòê ½^s6Y?xˆI>c˜D<½yžcÇ®!³‚'O¡³Òcûâeê¼$í÷!ÊXÏ60Z"ŒåòÙózc*òñ”Vé÷ûÔÕc yÑ0Þ+Y]_§ÛK©½Á;Ál–SÖ†¥•V†1y>%ëu¸ýÎÛxÿ“g8õØÒe͉cG)g9ËËKœ={žO>ôI޾†%µÄu×]Ç?û'?Æ›Þô­ W—‚õVÀxwÄ_x“½Ïm+ÏùË—¹ã¶[0yIœFüñï”7ç·ñÁ÷ÿ6gÏmŽ(Rœ:ó4×]{=“ñˆéxBS•T¦f}}ƒÑæ§{Šª²ô:}Ò,ãâö&ç.œãÖ›oa{{›Ùlµ×ãòÖˆ|6á%wßÍ™sçÙݱ1Xf÷òV "q‡ãÇŽsñÒ›&hu™oøú¯fuu™bVã¢Û¦ Ryò<̾ kR³7Þci0DEš$I©ª’[û?öžyüGŽ Ž£Í²4C¦1õx‚§D„þp€©-Þ ¦ÓPWÎ[„qyMÖërìö»Çhç_¼DYV7AÅZKÒ¼ Jbn>qˆ“×bmm‰ÓOï±³;fo´‹ÔšÒ„dèXŠªDë.Ö5(-HHh³úRqÈPmfhÕ_ßZ½µX ¬CE“p©C¯x§ÔMHœ3ï¨Úîñù˜Ã|þXJIST@œÛ›µHÿ©óÏЦK«Pi5OúöÞgÉ¢V*¨Êó¹ïšºnBUa}mYÔO !ð€i»„!à« ÍX·P«ë[7‹P18ÛG¡ã]'!E[2´Æ‡wUŸ¶õïÖ‡Î÷<Ÿâœ£Óéà= û"I»Mò6Í|:\7 äZÅ‹±nšàZb­Å¼úëùÁ>ÞÇ ŽùLÆ>ö±}ìcÿ#Ãæ‰Ë‘8„—TUEi J“3Í+n¼ñFî~é”yNj=¶(ÁƒP ìAÒéâµFš°ÒSO ÀQZ, ©MMm MÇÒ[^m;aKšÂbjƒõ¯,¢”øÚ(É™3§èôútÖV™N ’Hb‘$¿þ¦“’ËN‡Ê§¬‹Y;Ý,¥®>j0MAYt2h«ŸÚ #)‚mÉúê:—·w˜ÎŽ8Žoj´JØá•!¿õÿnýÂ;yùë^Ïôa|$X½î8‘LÈ÷ƈºavqÄæ™M>ùð#üOo{ ;çÎ.lÖ¾v\8{™ßýƒßã%wÜÂÎÞi'cecÈÓOŸáàÁ#ôû}ž9u†ÉdƱ'ÂÜv] dçâEŠ<çî—߉”’s§.ð¯~ò§yë_ý^N?ý47ÝtÛ[]z½Í…ó—¸û®»ùøßÇÆá5n»ûF;Û¬¯¯sþ©3¨a†§!ZZf÷Ò&>ŽðZðȇB,'üÆûþ+R&Üý…/…(âè¡!UiøÐ‡>Ì7ÞÁé'%Þý˿«¿ôÕ<ð‰px^ûU_Á^QqͱC¤©`ee|àCx¡.¯`.l’—JHøä$qŸX'<ðØ#”eŽÔŠ£kGyçþe^ùÊWR–c.Ÿ-yê¡'I£”cÇðÞsäÚÃôú ÝnÂp©¯˜P ¶¶qíÍP3&…ÆØ-§Œ˜ã IDATÜxûí\8uš>ùq–z]ˆ%¦‰I§ÝYAhI^NØ;µËÊáø8aûâ3œ{êËêj† ×èwt²eÖÒQ3\î ’‚Ê6”UEi".mOøå_ÿ•ñG1½Îg ʺb¹ßÇzG' ².,b0è,ªÙš&¼·b#¥@XB€ñ-@ÒDcmŒòàŒ%Ã`ª²%ºžÆz¦Óœª*YÏÂüq”$ø–xj­A8h‰$Îc›I ÑN±Ø0¦4Mæ…•fØíÒíõ16Ìå :ŠAŠEjµDàÃY*ÁÔu˜³–)uxžIÆ3¤ ù Z-f“…TµÁ4EU2Ës¬ ¶k%$Uc"ôJÏÇ7æR’ȰYPšº•ȃý¾Ý@°Ö2… »ÆÖXÛPrêÆ"D›ÔÝZĻ݅sDmøškíçÎ;T¤›Þ{t’Òƒó`Ÿg!nŸ@ïãE–vyøÑ¹í–;ž÷ô}ìcŸ/¸ª}áÓn>í{Ÿz`øÞgþðg»ý¹À9ÇãO>J·ÛÛw߼Ƞ: {Ó ©JqÎâÜg ãÉœ¥,f<öøCØrËZ—Ò–Xá±Î£½G:–¼ªd]|¤‰„ ®+ò*Ç™ï ³éƒ¥ OS¡hLHÆR…Er¬hêœÀL÷BR¸)Q¤éö;œyè!Žž¼Õ™`¬ÿoì½Y¬eéyž÷üÚ÷tæSó\=³›Cs’DJ¦dš6!Ù–aÙ1dÇ (2 N€ Araø*®bG‰í@pÙal‰’mJ4‰¤Ø-™ì®®®î®®î®®áÔ™÷¼ÆÈÅÚu¨  2 û U¨}ª°ö>gïÿ~ßóRLǸ¼$‘öpB3=:$ 2Tâ:C8‰-gØrFÐßDé„Ùè€ ÐÄÝ5ªª@«njŒ›ÝoÞ| çÎRÖ‰•ãÏ~âS\zî)Þ|é÷Ù?8äC?õ)̼æþÛïSiPN⌥éh~î¯ÿ%&‡û¤¥fÓ’¨±}!â³§·ù×ð‡˜ªFé˜ñhÎéÓØßÛ/ lmmñöÛosåÒe¢ à½wÞ%Ž"¦“ašdk§Nñ ÿî/ñ‡ÿú>ó™?Åðð[ qêüY<Ï<û$ÿìÿ•÷$”ËWÏÒ‰–YÄI@~tH˜Ä¨0äá›ïÐ̦ÇüÌO}˜d½ËJÒÁvêø­ò;œ¹|†û÷Þ¡È¿ñ…_㉧®óÁ?ʯý“ßâ§þì§é­ö9·¶Ê7¿õÛ[§1~‚ 4½î€ãñ ´½ÄÃÃc®\¹Æ­7ï°µ±µakeÉlÊÍéMÂбÿàZÂÃÉ©ç˜Ö%çÏŸç­›7 V¹xá Æ×ˆ¼ä×npù‰kô×Äë4ãºÓv ?¼?Ä!eƒuÌ&SÒ^Be …¯È"λ!óÙnº‚èu9}ñ%"L_ÿÝ—8½¾Æµ gè…ŽrzˆòïZÅ]Q”3¤ÚÀ;‹Ž4lèSWùâàÅâkpÎã*kæmßl¶U—JÑÉúchPÔMŽ ÖȲmg.]À…¾–?Õ¬$T’y$µ#?اf‹ª°$aʬΠã_EtÒ ã¦žÒ˜9:nwL½k°Npçë[§Hû{ãΜ?C‰! òÙ”RxV⌻ß|•ýÑW?ô<ý=J/Vºø²! ÛÔ«¿¹ÍÑáˆH‡ÜßÙe4l?|yE”¤(¥xöƒ/b½Ã6–o|åëÜ|ýçÎâ7ÿù—øsösEÁJ•Ù,g<¡T@>/±ÖñÞ»wIÓ”@L‡c^üñ3œÎÚÑp!Án½rƒ³çÎf1¿ôŸÿ¯¿òe£yÍ ×Å”ÓÃ98µ€_lo®ó?ýÚ¯ó7ÿË¿Á_~þC¼ÿÞ#²¬Ï|Ì¿ø­ßåþλ|þç?òððÑ!矸„Oú$+«tV»ü÷ÿãßáðøƒ÷©çÜúö+ŒÎw»¬on‘¥]¾öµß£Óé E›6¾õæ-îÝ}@]Îh0އRPÎæ â„ûï¿» ”g Ç{dÝ.ûÞg6<¤ÛëQ—muØ Ýg°¥E¹š÷n~‡÷Þ¸…’Á*§®_¥i Ï]`ZÌ9m/p¯4<|@’EDa„÷׬¶˜ñ!ÍÄ…]&ª¡)kêÚã¼bcû2yÝÐÉ’®¥48‡‚ÝÝ’ôb8‹) Rœ‹»\~ú…cw´ÆÑ¤æ`8"Šcú«„o,•hKSPí¸³³í³scÚ´X-![µDíE]Ûl6k §ñŒÇcêEÅÒcêµ^ì[kÏ?…1ö„ÜÝÖEµdicÚ¤Ø{Zü›ªªÈ«ò„<êIkbgyÖ Aðxæñ ˜3 Z*À/ ´?÷¢5ËuÝ $Ô¦ÁYO9žP7¦i“Ý Žp8ʺÂV͉IBÐÉR‚ ÎR´jA|,Œê,/Úñvßšu`<»¨¤rÎ1/r¬÷Ä”„^–Ò4 ©©ñ4åœ@Y"`ðĸ­ú•ž¢*‰ÃE;ÖíþÈyóãÝtÍަ¿¿–vi —úJë€'®=ýƒ¾Œ¥–Zj©ï¯Ä¢Êj©*y¡ÛJ/@I¢$FÇ cWá* câ$åwàêš+ëŠTKöw¥ ½Þ&ÞI„ó˜r Þ`…!/ ¤%©Œ-Û”·2Œxü“åxà­Å AD¬moÒ4¦vTÎ%Æy*eÁĬžSZHƒ.Åhˆõ†¢¬É‚„Ñü˜ºnÀõ‚€ÒZ”©q΀ÒÚ‘õ¦j¶O"NSŽöXÝÜD*EW*Æå‡ B)«’g>ø…·hÚñï•Á C3¥ß_a82M)Ë’,Ê"¢ÓptâÉ'Ÿâµ‡ôÒ.n%Ì'5ÿÅõ·HϬðÍßýCÎ;Ë»¯¿ASÔ¤‰ãɧŸÀYIÓ4üħ?Á?øû¿ÂOög8s~‹ï~÷»œÚØFJE^Ö|å·¿D #ì<"ëÄÝÁ"]nAT£É¦*vv²½¹EÕ8â À45¦©H;ådÂf¿Ošd¼sç]Â(`ÿà€'Ÿ~ŽýØãµ#[Ðß:K™O)« `¨êœéðÕÕU=|„T‚ÚZº…¨6•µ–²¬O€bjQG%†õ1™[)…uö„ðíðøEE”´é7‚Ç&8 C¤kéçyU´¥ÅئÝkn¾×Iýø@ð‹XX)…@œTc‰Ç»Ô :7pr«ªüb‡ÛS–H‰p‹CJ )=J:D]£u@FÈ å,LšœØD…FJE°¨«O€jéAI±¶Óßß)Ö¥^ê®åãRK-µÔR? Ò¡ÆG Áâm­ÄSƒ•2ŒˆÃ–:«•&Y’pçökl¯¬‘f1óùTH·³Š­ žI 2ž|z„Ö‚$°uIÙTˆ(A ¨*ƒV!iœ€ÔEN]Ü¢Î&MSâ^ÆðàˆÚ4¬žê£k‘–PDXé¨çUûJV‚æè£éÖ:Êxr›S›Šþ`…@ÌË)U]²Ú[áèhBÖë³i¹ [„t˜ªbsu“ÒBm ÍxQ=T6ôWVg\ýà³ÊyW0èô§¤qÆ£=‚(d{ë4iœñêwoPTù|Ž1ž,‹xýõ7¸zýIÂPsîüEö÷÷Ù?<䳟û3üÃ𿳺²Â믿ÁÙ³§™LG¼õö¦“Ï<ý4ï½÷ue¨ëš,ËÈë’n¯Ë·¾õmþÚ_û«˜ªæþÕ7xúúu6ΟW^' BFG#@HÁƒwîqý™³ ‡C6No ¾âÍ›7yê©g©mÉþÍ1GG#lm¸÷>ÿôÇY_]áî£cê|N”õ¹sûMê¢aeµËý{w9}ú4û#l]ðÛ_þW úgÏ_âÑÞ.GÇ#²ý}Î>ËþþMÓf]ꦤ¬ ¬k¨ë-$ãñ-%©98ØÃ8Ëp|Ì ×gçá}„—ÄiÂd6fÐK9ÞßÃÖ9‡GûD:`íôiŠ|Æè8d4:Fù’Ùî1‡çøðˆDJœµHâ­c>‘öV@8ªÆpþê5Ž÷˜OÑ‘@…ý¶?98:ܧßë`MHÖí‘Sò¹Ç›Š€†Âh©qu…A2iÖa°¹ŽPê¸ÃLJ ª¼Â)Eœ&S#uVÀÉîl›²z¬5'†Ìzƒpš0ŽÁêÊPÖ ÖCYVXk)ª‚¢*iš†AÇ'{¾AØŽ:Ã÷à¸ß3ξ}>wRg%%í¸´k+¤Úªµ6¹M’ä$Õ•²=\ikãÚ??îbVªÝcVRR-ö››…Q·ö{½Ïjû¦ƒ @KÁ¼˜·nk±AGq‘Eñ‰~<¶}²^é[£nàµf‘V?®³ÖR›S׋ô¹5ÚÎTà]Û[-T„ð ï:Àêˆõµ B Î{ʼ`ee±©8uñ|;†*œóÌ놲0Äq:"Hbjã˜M îÞ½Ï;ä¹ÁzÉ;wÞåµWo²²²ÁWo UZ§ïÝ~›£Ñˆíí-Œ5LæSööH³.´O’¤Ü¼õ&W¯=Á`e•~¿‡³ŽËöùÓ\úNŸ=E•ÜøîMT 9{z‹ãã •1a€÷‚ùxÊtZª€ñhL–vx÷Öûll÷ù»ÿÃ/“®¯2èIöÆt;«TME %7^½CÇŒ§WÎ]ä¥o½Ì`uƒßý./_£Óí³¶¶Î`°ÂåkWÙß?àÆ«¯ò‘|‚ Ò$áðð¼gµ7`6ž…’¦,©Š³ÙˆÆ–äÓ ¦Ê1³ n>C¹šñtLÕT$IF’öXY_çÌÖ6¾±€%Ë:tz«lmŸgãô)þà¥oRLfH+èÆ;;÷t€s–º,(æYQäƒA¡ƒõ &óœ²hbÊÆ‚¤qÄñÁ!óƒ‡Ô³iãÁ ‡$ MwH;}â´ƒ–[Îѵe½rñTÆ3Ooñä[\ºtš+—ÏÑé¤ìaŒYÔ5µi+8¬i°¶AV%MUQ©G”EÁp|D^Ì™LÆÔM±5,!M"ú½”0 ‘B`¬ÃáqÞà¬;IhA,Ù5Î;ò¢ ŸçLç9ÇãE‘3Ïsò¢laYZ¡”&Šª©q®ÝÝöÞ#¼§n ÖX¼s8ÛŽÛ—MÛ==™ÏçTeÙÞf q’ ¥$ÉÚ=æ@'0°“-5HIEdYÖŽn§)J·;ÓÆZ¬óÔuƒ³Ž@ªðåa^äÔ¦a43™Nñ@·‡JtÒQ…1Zi "‰Rt’ ÈPÅDaˆF«EXkÐJEQ›b/FÖ¥xßRA„ŒB·-Ð?ýÉçþ{×wÞy‡/|á ÿ0@óÇü2€Y&ÐK-µÔRK-µÔR ˜º0 ±†*ŸÓT5Qà•&TA[{c °ìf­$ô’݇¤ÝM„°Äw‚Nw '¥³Ô“#„©iêhdP ½¨µi“¯,ËHÓ ë[²oSWdYÒ&«eEêÆ‚LH¤Gu»Ô“œÚ—ªƒ²!£ý¸ºÀ—1²žPÚ‚mV×6I"Åpo‡ë×®èÃ9Ýõˆ¢0ôû¼µŒF#Ö76Тl*  ¿ÞÇû†¦j˜M§-±×ú+«Z#­g<Ëiš†0ˆ¨ðÔÎ#”£±m‚%¥ems‹½iŽò’b6çܹóœ:uš»wÉk²²ºŠ4ó¢`´7aemÀ…KWxæ©'xçΛlm¬³0åÇüÇ™L&ŒÆcvÜ#KRÎ\<RpöìY~ú§ÿ4¿ó•¯ò—ÿüŸçŸõ+ YÝZ%¯+êÊQ— *Ò¼óàú韦i*”r(‚×_¿Ã‹y‘£ýJ?gcýžzâ:åßù«ÜþÖï IcÅ›øÄGŸÇ Çózž?|ù ~ûK_åÏ?Ãl6áÙgŸ¦ÓÛàá½{ÜxåU‚($ÊR.\¸È¥óøÎ+7Y[éj‰k¦ã1+gû„aH1™ÑT­™*Ë‚²œc«œ§²5I“Ïrj ½õM„ ÑaÂ$¯ÊaG]k IGahЮ˕'žæèÑ#fã U)É’k›“ýbÓÔ„aÈÝ;w¸xù2s×pæü&“ ùèˆ8ÉpŽöhŠœ<Ÿ cÍt:&ŽS@é°…LEmG°©jR€©˜xâ Ýp¡Î·¾³KGè4ÁϬÌÑ |P-RSëš“1jcÚé¥Ô¢ ½Úqe)³Ù á,US#½k{=ÉaЦŸJ‚±ëš6%ö’ERìOª©¬µŒ§c´lÉÔ“É/E1ÃCš¶`ɦi¨„eQ¦±)Û½hcj¬± h·ÓmuU³› ±ïv­¡ŸÏçt³ çq œÇé€Pi¼lͨÖ펵R á]›¦KEžçZãþ¸Þ*Òy‘·Ýè ‚¶hÑívIãôEÑâv1ŽxуÝ45©‹°ÆS%ÆÇâqcªæ„â]ÖrA LW* UíkŸ7Í÷õµ~i —Zj©¥–Zj©¥þäT›êÖe…-kŽÇÇ8¢ ‚ˆ¦iÏ{’*E&½¹Í…«gÑæ‡ˆÎ\dï>Q Ùyÿ z+=¢(Âyƒ©*œiá=eÑÐío¢T@–uPA@€¡ T1¦ªES§”Ê`ª9G3C§×%ét)çcÂÉÆKÄdÌ£Ýïâš‚þ™§Yê£X$ŠÉtDw­‹©Ž÷îÓß>E±;„È"š´·‚ñðï2ŸÎؼzk+šñ”´¿FeøÚ"#Ál>Ea‘ô 4ÓY O Ã$K™Œ§l¬žbÿpÈýwµiX¬évFÇSê£9³|Ò¦ÕÓ“ÉŒG;;DQÀÞái–±¾±Æ™Óg¸õêk|ⓟ¤ª*¦“ _û¯âå_û6GÓ1ýÍ­ òYÎÙ3™Ì'¼ôÍ—‰â_|´âg>÷gXÛÜâ¯ýÛ“ÑxÊÕëWÙyw—÷’özÔMßù짨ëœÍÍuÂHòò7ÞáéçŸâsáÏñå/ý6ýî'¼õÖ6®žåÎÍ×ÈfVäd݆7o¿IÖépñâEþ×_þþÎ÷_ó«¿:¥”žã£œN‘ôk²^—ëO=Åt:Å9ÇñшÝÝ]®\º€n½ù:ïÜ»K’$TuÎñÑ»JÏg°UN”ÄÙ†Æ6Ì*K†x­8žqŸg/ž¥Jì‚J}t°Ïäøí­ ÒNF•9VW·Yí¯sçÖ 3žLô8 L3$†"/±vŽÒŽÝGï±¾y†ºÌY[[¥ª F£1®j(çsð– žjiÎ(¤k!^Æ7X,ʸ®„ë fî0e8nðÂe]žv‹Ú:†Óš½á˜ñ(g›*‰¯J¬ÌvoRŽw©¬cûÚ‹Lg3D1f6Ù§R³s÷§/>I=œ ; fbIúøÑœƒý;Ìw÷Ø?ØçÌ¥KTeâ´µŽ$IO& Igu‡¤)k+`6âÄI—ûww¦æÝ;ïñýÚ¹yã]’¤Ëý½÷Ù{°ËæÚx˜ŒÇDq[Gt<2év{DJsþì9†Ã1/]b:›2xïÝ»!øÌg>Ãøø€›7^ÃÙ¶þGв,I☽‡{\½r•ápÈhƒAŸõÍuÞ~÷}&ÃI³¶¶N·ÛÅ#X[[Cƒ•UÊÆÒít™LfHßpïþ{¡b:a…¡® :‘&Thp®Fk0MI£CªªAGO]»ÎÆ`•l¥”Ц&#â$Ã8BF««+(¡(óùÚÕ`L…·†ª* £¦.‰b÷Ž(é3<>¦×ë"ƒ€ Žíí3Jãœe:™2ŸM™N§íˆðtÜŽ+{‹·Žº*ÛÙ̱UN$R†Lç–7îsëÎ_õ.ïäF:ÞÒ4†ºj(Š’ªª©ÊŠ0l`Ö9¥„kç1ï˜ÎfTU‰P‚ªnˆÂ@©¶:MPjQmUXÓ`šªôÀ/L{ÕŽ+É,Ÿ3͘—9JIÒ(!Âöù!R*„mM|Ç픆„a@hÄ"ýVj± ,E]a¼%‹czY‡NÖ!Œ¢“ºD­õÉïeUâÝ÷ˆÝRJ’$id@ž4ÆbCÝÔhµ‹yO…A@¤4Y7#Š"Â0\ÀÓÚß[2xûõÑ¢;ZJu’–C[q§´^Ôq¹“ä!ÐB.4Ú‚Ç$s| Ió®í˜ÖZ¨v @kÅŸúä³Ëî¥~4Ô45ßüý¯1 OÛ¥–Zj©~?w‘½ð±åAõ¡&óÉ‚ëڔ˺Ý.¶©Éëë@N‡¬®té%Þ|õ}.õ»œÛ¾ÀtxJDºYFc*¼«IãÆY”îàtÓ5¤ô4¦Bmëd2m?Lªöçêqʦ$Œ§9’„¡&Ö’£‡¤Ý¡s¼»Cé=—¯ckCäk¬wôÒ5úk¼õö+ÄIă÷_# S´Ø&=}–8á_ûuÊÉŒ»·ï’KÁóÆ"È@Q–½^ÙlHÂ8ÂG:ŒG-hªÓA‡iœÐé¨+Ït:fum‹¼l8{9æ?~ñü{û-nÞxµ•sÄÛ1wîÜÁzÇh4B)AYädYÆl6ãáƒ$*àÔÖ6_úÒïðõ¯îê€A·Ãúú:³ÙŒ8ÔŒ‡¡pÖ¢Ð2àS?ùiŠyοðëìì>âc?öI>ðüUöö÷ÐJ ¥"É"Â$¦;p¼óî]²NŠpŠ«×N1ãµäµWoðÁ{zRrúô)¾ñÎïóÔ§ŒÑñˆñxÎêú~‡½½=6¶Ö˜NÇ|ãßàCyšíÓ[ÄQÊña² Í‚PrëÆVûÖÖÖèvÛÇ5ÿù9Í IDATM;Ü}x%Œqœ9w‰sç.ðõßù"JUÅã#4ù¬„,À8Gh†Ã)/]ae°@ã,·Ôùœ~¢™SdIÞQKUØbÎÃ{Xë§LÆcž0Pd½”áaM„H_3 ‘R’ÆOÂhxÄÊÆ&ó¼`eclûµqRV,‹³yI’$uCÕ8‚ÈÆ)Q¨p¾„÷ŽJìîòþî’ ¤ ëdh-Ì uˆóª5²¶!Œ‚PÛˆÚòÃÉIw›óOàâ¦ÉÑq†²žÙxiqÌ• Ïpp´Ïzg…ƒã!ž»/}‡W‡û¨2a8ÜãŸþ º›áƒô‚ɬ ŽÖ¦EƒÒ!µ«‰ŠŠ£á˜Ú{ÖÏE(Åñá!ƒNŸÃÝcjké¯tÒ²{ÿý¶Bh4á­›oÑ”¿òü}Vë\¾z(ÆÓ—/]äÝwî°yj›ÑhHÌ×7¹uëÏ<óÆ;Þº}ßÔ¼spÈç?ÿyþç¿÷Ë<õÄ5>ýŸjÇsë[[þéþ/žçsŸÿsx)ùòW¾ÌÖÖ6û#^»ñ&qóì3dww—ãÃ)I¢(‹çÏŸç`oŸ¢œq<,"Éí7Þ# CÊñ„³çN±³Èj7àåo½ÆîÑ#6×OóĵËh2^þÎKüìÏ}–ÃÃcòQÍÎäµÍwoÝ¥ßíqîÔy®ÿÂuvww(Š‚S§Îðë÷ïñ©Oý$gΞÅ{Áööiö÷÷ÙÝyÄÕ'ŸgçÁ=v½‡õ¤ÇV5s¦Çã–®,uYD1×/?Áñ|οÿ7ÿ* h”g­7`<bªšÍõ rc0Æ ¼£©k$žA/cí…çxpçM²$¦,æ(é9ØÛÃV5‰±#‰Šù”Ñp—^ƒ£9ï¼Ã™óçÈ»)kò,M‘c\¼v „UCg„aH^Tu…Æ Rkþà;·ÙÎ :cðQDA¥"CE'IM…D’éŒÈDEѦ@9ϱހ„q€q BK S“W%E•ÓàÐIDdJ1J´•mr±‹ìÃ{Ël^bœ#Ôši]1Y’"ñÈ0 ‹Vz=¬1xÙv&'QŒk eY¶$ko0¶A‰€4ŽZ†!Bzbãšï¶Wf=&scðÖQ؆ÆX\ݾmÓÆÉ¢Ëc\›ìj­Ûtš¶Óº®k’Dâ½[¿óù|a'{×Bʲßšò(Š@ˆ6…æ{òÇõ[~T д»Î²=HÚÛdÐÂø„„Z#а(ÊBõúxo‰ƒð¤èËè¥~„4Nø±ºEÐ/µÔRKýˆè…|˜›¯¿òƒ¾Œ¥þ„Õ4M›¨xþq¢"Q ØWä ¡÷²­•QALm`^×sæì²™2«jzQLœö)ò9JhöwvPœ­‡ó²$ɺÄq@eÚNÝ Pt:J ŠbN]7(! ;Ò4#ŒLS’G¸ª¤š7èî€0Íã”zš3žÏ¡˜be}ó,G“=²~—×o¼ÄæÙmŽï ±£ §Ö6xé[_£»v´ÛŽŠÎf3d2 8Ü?`0 ÃÆdYJy|Äþá×?ôaŒ„ÙlN%L¦stÜ% %ݸCYXƓְM'&GSŽøìOþ ÷îßãуDiBµIåÆÖ:qá%JRíî¥Â,ÁZK'Ësýê5¾øÅ/ògžescƒßøß¤ßïsîüyƒ>ù±3žM9<<"Ë2®\ºŒ­>òÁñöÛ·¹páþ“ŸÁ8Ãý‡X[ë1Lèô¬õtûëÄQÈýw‘(Μ9Å…sç‘Ròñ?Úöz[Ëææ&q¬ÙÞÞ$Žcz½.]äKÿü;“—9YÖ¥“ö˜7%Æ;’$!ŽFG¬¯m3ËK:: ¿ÒG’^¯G3c¥D:Ëèð€4íÐæ£1¦#¶¶·É‹ ï- ±Æ2¬°óà!V‚#f³C’$ÀT9Þd$IÂp¶ÏþÎ}.>ùóI¦AHÏÁÑ!½^¬ÛÇá(Š‚^¿Gê:íDÇÊj[±ÔßbgÌ«·î ”FF 5›Y„¡–‚²e­¥©-uÝþl™Æ!dÛ¡mw³ÇP³Ù¤…ré·@A„¬#Žãv7XP -|Û­l UÕöF×EI¤4>M‘‚@!¥@ŠÖx ­ÉËo,¦i(Ê‚¼*©š’HÔôWÞ„ )ÚT·Èk´ÈP¶÷a‘ÞÖÆà›¤@6aÆYâ”e‰P-•ý1ôë’¸­õ *9'Òmϵ& ¼oZˆW^• cËÉþrš$ÔΞÐÇwZ;Bø˜ØcÞ4cÚTYk¥­Ï²ŠF{ÒdÑhD§ ÖÖ™ÎsT˜aà§;ïÞæÂ‹%Š¿ÿû'ˆû.~ð9¦Ž8™×S6¼ë-Þ½{—­Ó[¼sç6ÆÔ¼úÖ«”EI·ÛEËvDt>:äþýœ½|™$8>>àèèéQÜ¡³²F'Ë8<:àú>2¼zãuž{î9n½u‹>MYìÜg8ž²}æ,ÜçÊ•+Üÿi°¹¹É »Â®ÚááÝG\½vž|RòÆk¯õ:ln­£{šW¿û&§/”ŸàLÄ™+«\»p‰ýGû<Øg:™±sï}f£Ï|îçèt5oß~ŸSÛgè Tá½à­[w8îI²½½ÊÊÊ ¿ø‹¿H1+X_Ûâ?ý[ÿ÷<àü•‹á½çÆ×8uæ§ÎnÐïv‰Õ_äõ×_gÿøˆ£é¤Ý- ”jwsQ’l°ÊOýÔçZbr(ð²N†ÃR›ŠÙ¼@Ëv”W)4Ž—÷w BÁO^e|øˆ¬³ŠÀ(Çh:Á"8{æ4yQ£¤beå™SSüQéëd°:àý·ÞàÎ[¯²qê Ju(Êc.^¼HÄxƒ¨-Y`]ÞÖ&K1ª)&šɵ•€ç?ûQÚÅŠQ^p瀃‰)ðÖá‹ ïբﻡiš8Xm ÎÙEbêiê²Ý®JвA E,Ûƒ°Ph4­4½•A›úþY×5©µTuKËÇ:ºÝ.„¡&Ð-ÀšŒÇ*ë(çí}+ë’ª.ilCYÎ ¢V´ïeÙY]Í —j…UmQJtIÛ ¤,K&³–ìí…`Zµ#éÑÖ%üâ°¯Ñm½R8ÐŽ‹?Ù–‹e)Õ áûq¯µkLkØiÓp?…ºÛÅIE´P2…ÀÕ a(pBþ„J®R„ySXÔ?»ö@£×ëµ£åe…í5ˆÅ~´DPÙ'ôI¢ÝTæûúR¿4ÐKý@Õö¸- ôRK-õ£%)J-ß‚è$¦nPBSU%¶iˆã˜²,éuº„aŒô¦)BévŒ³nÚ¤Ç:æÓœ·ß{Ÿa$HdÅjÚ*I9/Iƒ˜¢vä%ô72dê1ù>“ш# ;;·)ªš¬³Êý}d8æ©g®Òï÷¡.q“1G3Ý#12æÒsŸ`šp6Ç©-"fó ᢞsïömë« ¶ÎÓäsêù˜éñ!‡£Ï|ø#ÔåŒ(ˆQ²MÈŽØÜÜf4Ë  Êy&‡Ç<ý‰Ñ¬ó¥_ûU‚8f}ã"¯]¢N8Ñ*àho|2¡q–ÁÚ*ïÜ}ápˆs†áxD%L&”x=ߦ{(¥èö:ŒF#¤°>¬)öpæô9>ðÜ üëï¼Ä{wßá?ø÷þ#ò²`üòˆù|Σ‡Mw¥ÏÃý]ºÝ.ö÷(g9§Îœáɧžå·~óË4¦à‰§¯pëÖ›œ:uŠõ­u^xáyâ$äÍ7ßäò•óH)˜ŒÆ¤+iÐ᛿÷.ž¹Ìèèëoü<¿ü÷¾ÀÜü2û“+üÒø‹¬­Ÿâ­Ûo°¶Þ£ß[¥ÈNŸ>M’ÄH/ûe.]¾ÊßþÛ›ÛoÝ¡,k¬³lÙÄZËÚÚ*írùò%´–tº E‘síúu¤Òììí2œÍèÆ}Ö·6 cÍh4^Ô¬EÔMɃG;|üÒ9ÒNºH“Û„òqâ—ç%]èüØÏ|[•¼yóœ)I“†haÑÒ3™N¨‹v„wmµC "¼Wóñƒ•uÎ\¸Âî£ wØØÎ0Uͯ~›ÕõµÖ|Ei‰;}¢0B«ÊŒkhæ¾4 µ­ £”T…¬w;ö™Ïs„T¥?9°|L«ö‹ ëÛÝf­5Þâ8¦( ©PIJ¤4à0¾]Ïå4q¶µPÎQ5Æ;tQà“[Wíh3œ<Ž^€qk-yY0/ &ãq[ÕT–H-pÎ0ŸO‘UCStÒŒ¢œ… : ˆC…Uí#êÆÐTÐÞDz¬(Ë–ÞÅ}o“ÚÖìK)ñÞS[ƒ7 R+p޲,;Ü‚¦™þ?ö˜›¦¥s×ukÚZ.„'/K@ Â€ Œ©…Ë“-$ÆZªE%•_Là8ç°6wò½y 3Æ‚^<^R …>!…‹  *s¼÷˜ªjõ}¦pÿq®%øGÿèÕŸýìg—¦f©ãú—¿óüÅŸû+ËŸµ¥–ZêGJ‡{Ü|ý/~øË׿"ý'ÿíÿ‚75Κ¦"¯ÚÆ8l÷'»Ý>Ž”¢v-jñÁT†: PJ(E¬ž¼¸«À̘<:Ä9Ëp:Ã{]«Y/cûÌ)¼—xë˜Îƈ0eûÜ%º+«ÚÃû¸bDs°Ëøè>Eå¹þ™¿Ä|rÌj”2+%ýÕ voç+ÒÁÂ4¡ñ Ķäíï¾D ÖKfµáìõ«t“¤Äù%ÈáƒG$éôyôæ ’­Ó„ƒ>{·Þd8±œ¿rfT³œö«¿Î·os0ŸsöÌöv¢¼g^È0 ÖŠñxLÑ´nS(¬'éeí‡!ÙÜ£ñ*h V’†˜¦â…^àí·ß¦œ5\zr›ÁÊ)ÆÇ#æ¥G‚͵_ýòËüì_øit¤øƒ—ßâÂ¥SXÛ¢Žñ>˜šº®YYí‚óó¥cÂÀ3Xé3<1/J¢8$ûûû˜ÚÒï÷É󜕕UUÒTc,‡‡Ç„AL¯Ÿr8œPGÖIhÊ‚¦.B臥Ûë ”ßàŒ¥šÏQ¢µn»Šƒ|žÍµ5öîÝ#ß¿‡u Ã€H+ªª€ !$î¿K·㬢×`m{°´rj“ ?àîkoKM¸–°²²M(:f2ŸR™ÇÆ´\|}ÂST5,Òq-’4! cVúë„*$JRÛÐÔ á"Œ²Ö-ˆÛíkR7í,ö§Û‰Ïº.©švÌÚ8KÙ´ Á¢,0UƒXì%?>$PjÑ{½Ø•Îóüä@¥iÚj0³¨ÔöÒÊÓ÷’)ÛnìH?&fk¬µ$qDQ•U…÷­ÁÇ:¼„(ŠÿoöÞ<ʲ¬®óýì}æ;1ffä™YUYsE1 È, Ø ”ÕKÃCÔž-´m«­´vÛذô‰ôëâSÑ•Ö.ƒ"V‰UEYY9gÆqç3îáýqn%Ð"h?)±ˆïZ¹2reœ{νqï‰ýÛß kKy¹-éq¼ÀEq<.Yð/Ú ÆòžŸzóÿoe×wÜÁk_ûÚW OÿL¾èëHw·¿wñŠ] ã.v±‹oDÄV`OÌtºô{[X-ÀX¤rˆ‚×u¯øõÊTZ‰Q SåБ ]‚ÀÇs ^àáG~XDZ^T2ÙvÒ`Ïž}س§”N«œ­µ²ëx\B7Þp-aT#וOHÒ nÓo‘GÈFã‡o"ô™i¶Gµéd•§ŒF Ý¥Éx‚u%¾Î)âÍjB¸¬¬®rÍ5×@V >ãñ€Nw‘>aª 3µ9ÆÃGf{{é:“Í6._âÚ7’ŒÇ·½â[8räûÄ_²±¹F{¦Šîƒ+J•Ãå‘C‡9uêל8ʥ˗©uÖ/_¢Ö™aiOD%Üñá{˜›å3Ÿ9É£§Î²g©ç°‚Qލ²3îS©„(«NƨÂxÕÐgkgÇwžƒ«ò\‘ç Gúd&F[C«Óæ/>õižö´§a Œ&öì[dkc“Z³Åúæ€Ð F23¿À¥Ë—õ{ì]ÜÃÆÆ*Q%¤Ûe´³I­Vc%ø¾_¦ºM˜+Fã>•jȧ?õçÌ6üÕ_}ŒZ¥Ê|{–ùù•ˆ¼™EZ­J'„‘Ož—Ç<ø{G#]w‚¥Ã‡9ýàCìíÔIÆ)þLÈâþ}ÌÎα±±E(s„Ͱ*'É4i1 "fæ%F—¨;GžçXk9²Ü{qœ°°Øaqo‡üö§QŒf³‰ë–ýÄŽãàkSizà•òæJE`…ÆNýËBú„~te¸{‡Leåæ›+OÊAÒw‚ ˜VGI”5øÂ¢µ¹âw¶Ö’æÖZ†ƒ¹VŒFe‚¿ïûØL\t…µT£Êt`.¦¬±ž>~9Hçi1 ƒ4N‚ðKlJZërxÏr\×¥˜*sâ4¹rœ1cJ?¹#&“1BH„(Óµ…8ž$/ ²¬ÌF¼¬OSOh—ÏT±»€ÜÅ.vñ ¹Ëd)ŽDÖNœ¸)Fý ’"Ç‘¥¼RJIwv–Vg–Ñ$F©r᪊1¾gIÆ›„6Å«‡äÖ’ ŸÀ)˜ŒÇÔff±&c°s #}´ç¡tu<§É)vÖN³³=F¹ÇOœÀZEsƒ¨Ó¡V¯°µ±Ž/%;Û4»3xQ•|sßw±÷Ú뎃äÒåÓ4gæQiÊhuåã×à×]¬[†/­^^!Íb²¬ôÝzŽd<á¸`fØß*½œÂ‡Éd2BkG>ÅÜÜ"I’°ÿ~„Ô Ç#õR¸´º|' H JåȼÊÖΈN·‰z\X[CÖÖ>î¿ïAŽ_æâ¥ DQDµ‘æ®ï¡M)»ÇeM—çllnQ<ÝZ<×Ç Bê~Àx<Àu¾ë\òÎQTö^cq]gº¦)”Bk‹ô<Š"§(¦éÜž‹‚<ÏpY¦‹;i–àN=ÖÃñèÊ=¬Õh¢µž†¤iŠïûT«5ÆãqÉÞe§½.Ò•XUJÏŸHÉlDÍ—NF§Ö¢=×%ÉGè ã›g ’#ê­vÚ‹]2¶*‡"EZ²!Jj‹{iø¹Ó¥â[vÖú4lÂêç`áֱК'Ë7iv[dé„ËœGå’”I“ñy 2 º´H<è“šÞæ½s—éœoÿ®7qúüEüŠ {l57 ßïÑOc*Í}„aÀc÷݃Πs×_C«ZÇf†Ím.^^áéßô,Ú¶¹ûÁ“l¬nà:ƒÆAàù6G ÂChEn Shâ$' CVVÏS©TpÈöêïàÌÃg8p`/YžRi/b¤åª£G¹xþ""I‡¬¯­pç'ïᛟÿ\þÇGþˆ[n½™"N¸îÆëyôô)®ºæÃá€ãÇofn¡Î`'&Ib¶··©Õ*!XXXÀA²u~ÚÑ«éÅVïÂu­V÷Òï÷¸é†ë«!ÕPb­"ÎF:¼^¯G½V%Mjµ£aŒÐ.žÐ¹éc€µ-š­ŽyaH’ cÍN“áhÄþCû˜™ë€µŒFcšÍ&Ž Æ8¡‡øDhtš³¹ºÊþ}ûX½¼Bèû\uüh™ØìÂÈ'K'T|—ÁÚ*• JÖH“M„oˆsËÂþý¼è¹/áÌÙGö6¨É ƒÕǨ½‰ÂLˆcM£ÞE™_D„A}örïÚ)þÌÇHrË3_ðîøÞ).1;\¤Òž§6Ó%ˆšQPoÏS©6FQLvXlt§Òë zp¯R§áº|ó±ˆÖü~FÒãÁGÎñ?î¼›Ï~v•Z×gÿáƒTjU¼Ð% Ëôö(ŠÈóד„aLe¨$Cã Ëx2ÁfãbBG:¥eÐÊ’Å¥·øLÉ̺.R”ÒëR.ѺôöÖ«•²þÊJõ®RMT§~c‹#$ž%R” Ö*ɰº KU²†8ãû¹Ñ(“¡­B*W¹X]ÆRk I?Ó.£áB©²2*ð‰³×wH³cs¤(ûÂ}Q¥âû„®‡”eè%0õFÛ)Ûÿ…ûžÖšt<Áqra‰ãßq1XŠ/ò['Y†Qåf€¶=c€ñx|EŠaùº©ŒÁ ‡1†j‘§c2¥IÓ cK%€çÊ+õUžc|é„°^Á =úã3Õ€áN lRõòÞµµ5&™¥R­á È“a5~ 醮‡Í5ÖÉqH[Ê>Ð#Ž'xŽ‹Â„Ž‰"ò\Ö.]Àñ@:’É$¦ÙjqpÿþôO?Ì<À±åãÌÏÎrþì9^ùšïààá=~ˆµõuüÐ#ò%ûæqþ±MÈ5ñ Ç†Ñ$¦ÝîÐnÕɲ z=ú½œ=ûX¹x‰fÔeïBÄÌl çÖI㌣Wàž{ï'ª¶émö™­ãàÓi×±Z!…‹ëŒÇ1…ŠñaŒ,¥¾ív? FÔëuŠ¢ ^­”éÉBR üÒBø¾‹”%»?Øé1·0ƒQ´Á¨‚Ù…Y¢(@kÍüâH*¾6„ž‡Ðš¢Ð8QÄÜb›áp:¥Þé µÆ•)AèÑ›»ÿò®»áV¤Eô{\uíUÜrË-Ì/ìac{‹o¿Ù¥FñˆtØg8Ðï9¼|(8ppžöröÌ%úSvLˆ Æ(\×Çq\†Ã!ËG÷Sd“,<Î>v¤Ïd4¡V¯ðÀ}±8¿‡8ÓlDÔjõƒ~I<" ™››#É,Aá;.§N>ÆÜÂ,Q­ÎåË—1ÚV"Æã!A”RZ¥i4›øÍ*ãQYV«Õ#Ÿ4É©LB°_B颃áN8ŽÉ‹‚V«EµYÇq`ÜïáX­ û–ÇctQ™ ©ùeÈT®ãíËŒ/_¤RõN…ëO<“ÿ~æ,…“°¶~šù½Ë´ë]â"&¬TˆÂ&¹I«‚å[žÎ­Ïy1÷~âk8sæ ¾ ©a`»· X$ 8že YÅ÷ˆ³”áxT¾îÖ"åÏQ:%k] £2å_H Òn~éxÛkoaÆ`SÎÝñ>Þõ›Ÿä¡­ Ìñ´7ý;~ìÅ{ð§páýoæ[~£\¤\ÿ#äçŸÙ@þÏk–îµÌ|îWø‰ìçÝßs‚Úßø†¿ÃµèM>ù+¿Àûï:Ãz/&'bñ†ñª§Iî½ããÜ}¦íCÜþêïçmßzŒúã”xÑã³ÿí½¼÷ÃÍé¾döø3ùη¼—©"G÷ð®ùó<|Ëò®7þm×õOëÒÃ\Ãõ´¤€§<ÛÛñ²Ÿ¾—¿^/¸îP€P;ÜýÛïá=¿w'§zsW?›ï~Û[xùÑŽ(¸ðû?ÆÛþóݬN4ns?OyÅ[øWÿü6f]z‡¿ü¿~‘÷}ü~έI©ó”~/¿ðÒ]µÁ.v±‹'»ô“傹(«Éãk£Á×÷ð]¢(ˆ¢¨$ÐW$’å±ÛŠ‹m€Õ,]âÀ¾«ñ$\^ß$ôÕj›ÌŒ°iÊêdÈ¡ëoįÔ$ñ:aÝ­U<Ïcii‰íímªA‹ns“*&ýuÒA,^C¦ g¶zÌí?Ê‘c70ØX' ;œ;w–^ á¸d[=âɈå£G)”Ħ £ñ„αcl]8ÏÖú QµÊì¡eÎ9Egv†Öü"ñxÂꥋ`,>üÕZ=YÂÐGÇŠv·Åù³gÈTJ-ª „ 7ìQèœJ%äàž}l¬­3Ø\#¬Ö‡ Ó ã’9B–¾ñjQ #Ò4§Ð Çu ïÚäù/üºÝ.ë«›T*!yžóÐC±|ôû@iÍvo‡F³Y²gSé«ãxìßÃy²\O<ý™Ïà÷?ô'¬¯ípëÓn£ZØÙ^'MsjµÚ• ¸4Íɲœ¨Öàä#§X>x˜ñxˆëzø^€”“ògR­âyE¡éíl„×\s>ô(É4„*-4YžpüøQ”±dYF«Þ ÐSßç4¸*Ï3×#i,ÌO+ZÄi‚Õer»•e·±°)‰*ä´Zaü€¥¥%¾ï>Â0DXE»Õ&ŸŒˆ¢ˆ$©5ÛÌÎvñÉ™HƒÕ)®ã µæèñk9îa š­ÍM*ÕŒÎ\g:€iľö>úNŽ2†a2¡æXò\!¤KQä(cI’ãûøR¢Ð]²ªAàÑlÌ¢”Âw\¼ aŽ‹t,¡ Ê‘øŽ‹ƒµ¥RÚ©ÙÃÚr@,eÐågÞjƒë–UZ °ÚEX ÓZ-m¿Pñ$téiB ½Ò"b<]žÚ m,6Ûiʪ+ÝÐyžRèœÉIó ‰ p=*õ:Òñp]«’,C©GH¬5Hé㸥—¼RmâM{¶­°(k1ºÀ±eGµëH0 «!IÇ»!b_€CëÄ‹yý}­ªfãÞñžßúY~yù}ü›Û[˜Kæïþ8•W~/ï¼mw°Áx©ý%ÐìËþ5?þÂy£…£ûÜÿ‰Os¶û]¼ýn eÆ8G»¸»ëÙ]ìbOvè''¬1 Ý)¬&ÌÊ2 ƒ#$ÂZTšáz–Â3a 37Cù>žç±ïø^ÚÍãñ˜{>ÿ E¡8¶4ËL»ŽHäNJ¢ ÇŸö Ž_u ãËëäjB{•l0Äk-ÐéÌ£Š”Á&q‘³|äyL6ÞÂ’Ë'qlBÅÑÛ_@’X²¬@‰‚Éx@à¹ô¶¶!Ë),Y.ÆÇ£>³Ð]ØËÇ>òÇ ÇΞ_嘩Õ#®¾éVIÂhsJäó‰ÿ÷c=zŒ¥‡X»pI‘c I­QE9Íf“À*ÃÆÆv‹«N\ÃÿG¯:Î(O1Âf—á¤Gªr×Åñ¼2èÉqˆ³„Äó}p$­F—¯½™=‹‹SÙi9´Ôë5\Bg)BJŠBQ¯·xäÑ“´ÛM–äÒ… µ*<ø0™.ív›ÇN¢Zo²€O'øÓ§ïûôû}¢jH³Õ¤ß–áGQ +à“ög\}íu4›u>zÇŸ#„Ã-·ÜÂùs—9xà0ÃÁ€­Íó‹-ÖÖÖh5š¨iˆT³Ù$ô=ÖWÖɲ‚°•5AyÆÁƒYYYa4Óít‰ÂAÎp8 I:Ãᥡ1ÅTjQ™hìúÅmìÔœÇ1ݹ6ÂÂ`0 Þl ò‚x4aåü–æºOP¾¡ÐŠþÎ6^FU¶6Da™Þ¼wÿA´.n_¤PCW“¦M‚°J’Žñü*+Uƒæú[oåìÙ³ÓÞ»À¡£‡ÙX_#Äl­lÒ]hÒª{ÄEÌ`°ÎÂÌA£E¦3|áš×óqœ€Ä8Hbê&¯ø¦ëiIɯò>|4^T¡U¯Ñ¬UXŠ©¼¹Pùt"Çñ<¬PT‚€¨Ý@8’0°J#„%N4Ê ã Z„z]¼2tlœÆäŪ­´VÔj5Š¢ OPyA³ÙÄ“ºÐdYzåwB–ee ”ïMKK%ÉT™^]ÄŽ#ñ]—°ÕBk]nàH‰ï‡Qz‚Ó4%Í3£>;ƒ>Žã†N=üvüñ4¤E™‚4+¥ÞZ‰¢*yã¹.bšÄ-¨Mæ¤g°ºLŒ-®xžKv\áhŒ6Äq”(¥ƒòB”18®SÞEùþ1¹¡Vk”J žS¦‡‡®`œ&!ÈóD8V•÷ØlüÄÝèùº %µÃOåÙ‡§ÿ<ÞåÒŸ?wÜ·NñÔ&b´ÁÀT9qóíÜzm½ÜâK¤½ag‰#G–ðÅWØíÝÛß¿}õñ¶_z7.ÿ/mýý®Å°–Ê›¸ýæ«Åu,n|š7üî/øÖò”šD\rß§~’»?»Nqüþèsü×?Xáø›ÞÇ›^4‡'àÄüw½ñwø“Ó¯ç†náíÿåw°Hœ'!û _%…û¾ËKžûI½5K|ÇÏ}7ÕÞůýÎE®þþðý/]Àpíâ6ñºßäN½™›o®Q_~Ï[ž~Í ?ö>rï ÙÓ›T¬¥º|;ϾýÉßxïìb»ØÅ×»5VO>äyÙÝ[d¥ òñj›™nß ÑEAžç4Iž“+¬”ç9xOÕóÝ.i¢yêSo&ŒP0ÙÞ&l‘¦.qð†E‹Õïc0Z£˜ÄDõyÜx*ÉA¦ìô6è¶÷røø<ÃÉ"3عDÒß`Òë1MˆjÏxùÛ 1ÐbL–9ñ=á¥&í6‡gØX¹L- ðgX:xŒ“ýë+KGŽÐéT©µæ0ʰuê$wßõ)‚(äðÑeöî_"I'tçÚŒ/^æªkoàÜÉG¸ñ©·¡'9Ü÷yÂÙ9×çÈÑÃ<öÐ)žyÛm\¸pãGò§úQ•³=Ù& #×mF… Âj…£±ry…z£ÊóŸû\×#ò`mu“Îl‡µ nºù:F½„çRóšl\¼DàWY\\dyù0[ÛÛÌ/.2xÎ žG«Õàî»ï&O£QÁÌl‹$òh6#’,aqnž‡=ʼn'hw›H ++k\¼°ÆÃUn¹å¦Ò#êäì?´‡öL‹.S˜ O¹íz}ø,õf€4+Šë•Êh– tØÚXguu½û°FãHÉL§Ë™SÇ)Q£Æúö6ZiºõjÉš¶jWBëT®q\–ÍÕ ¢zùù½^¯LfîÎP¯Õh6|þÞûØ»wj5Âw]|×en¾KtÍq»ÿ~”Îð2Iµæ0öñ£,Ë +-G ²¤dßÃl¹FK£-†½{‰j5–\͸7¤ÑqØÞÚ c5ŽçáG!:•\¸p™Z@½Þ ÝiЛÓ½Á©p]vV΃ë3¿g ·RAXK‘¦(¡ˆšuTÞ"Û’¹O¹õ 7<ý>ÿÐ%>q×=H ®Çs°EÎ8› ­À)õFׄAÙÉn…!ËÊA{41ÅÄq‚±—Ð-CÅ´5ä¶ü¼G¥…CëIªÕ*I<.§“ Yœ e™¾EI2õ^«eô•z&ÏóiÔê´Û-Ь,Æ–Õ[ÒʲÊmš^­V¯t7+¥È“œ<3l÷lô¶I’ D~Dè†øÓЮx2ÁÆ*¬Õ£XÝ\#ËB'Àw\‚jÏñKY»#pAUzÔ!q£ty¿ËÇ#LžLYìiRùtmm¬¡Ð£r\ÇÇ~~ÝÀ'*¸Ò+{¢=Sä¸A€6ßóð¤ƒÊ ’|\¾ÖZFUjÓ¤ýÇï½O$¾Îè‚¿þ]ÞûÁr÷™MYÁI Þ0EÕå—óšÿ‚_ýÑ7ñØs^Ϋ^ñRž}´õ%,âã»ü_u£_V¸æu?Âëï+¿üsĉÛÿ÷º–/:ãô¼>mDÞ§ŸO¯#ì²Ô‚‡wbŒµ['¹*VÞýz¾å=ÓçRœp3ÁPÁ•Oîüp)åßdbÿúèÿÎ{Þq+5r&[ç¹û#¿Î¯¿ãûпø>~ õ0ç2ÅåŸÿNžý h1Ú­§X²qçoòî÷ÿwþê± bYÅM4Þ0Ã~Éù$R ä“tƒb»ØÅ×'¤»-OBÄqŒµ\é}.›À‘X!qÃ2a6ɬÕiÉÆ1F*re°JCèðà©Óx®$Ë2jõˆÕÕU³´†«Ã*E²}™ÔÄØT1i¬¬²ØÝÇåK4*gÏ=J§Ýdfn–Iœ¡û}†;*%Þî“¶é.Av÷‘)ÚBžÅTüy±ŠÐŠ,M,ì;ÄÖêéx@³±—jµÍÆ™‹Œ/_¢(4V f0¶@Á}wC¤6´ÚMŽ]uŒ0¨°º²Â™sg˜LVV.Ñiwé÷‡œ{ð.œçö#GÙé9}ö,Ö ’ Ng)O¹éfÖ67p<ØôˆÂ*‘ãQ *Ôgf‘žG»Ö¦s¼ƒ1e/sœ‘Cè4$¦àÀÁ%<Ï£È%™Ö×7ñ½ý°½½AâùK§Ûe2±±v‰,Kð…Ïx4Á:–n§EÁ Ò4¥ÓépáÂÖ6\––öâ8.arñÒE„ãpðð!:Ý*§Ï\`g»Ç±«x![›CÙÇÖNù…Y¬(¯ûìÙ³tfº8ž¤ÖŠX\\$ò¤Éˆ°1™LX__%Š*T*5Rk ]¯´‡Ì/tɧuJžç]a³óIÎh0Âq\Zf9܃1†•K—¹é†xäчqD‡n£Æh2fǾÏU7ÝDo{‹¸7b0Ñnµ˜$Cêµ*f2±;ƒ³‹mú; ǃñ$!ò ò4cffˆôÒ±!¬7ØÜÞ"jÍRo´¡m jÎÜ÷ׄž¡È'dÉ¿î3;{„ÙÙY–¸?¤†q¿Oú¸õ Ò°:Ã$¤ç³“äŒwÖè.ÎQÇ/±²ÕC)Ëx0&‰Ç¨©DÚw|”48žGœN¨†ã‰Âõ Ís@2™Œ‰Ó”á .=Éù¤ìJn´¯¬eÍ4ô+S‹F· þš†ƒJc¥ÀJP¦`4Ñ$“ÒË,¦¾ß,K§òkW:dq‚NS¦…ƒç;W:ï@Ç#‚ ÂsJv7Ë2’$Áój•:žë 4ø~8•”Û+•\Zå(•—_Ûò=(Œ/\|ÏC 0h”ÒX#ÐZâ …}œ›²Ù+ÆS ·çûÓÚÃA£­)Ö½ÔŽ,åÜŽ¸®O^<§¬§³‚òÞiæJš· •‰åÖ ‚(*™j­ÿ¶Ûò×_×tqéù‰Ÿú ãg¿·¿ñºæ"ü³¿È§ÿÿ ¯zçá¶{îà÷>ô!þý[?ļî?ò³¯Y¦ÂtûÊ)b_áà•ÿòõüÕ÷ýg~î^GôEÊé¯z-_®ï"ÈË]*ëâ;`ô44Í( !·ý‹ŸæW…_4Ô ¢™æ7„œø+. «{X>º\z Ÿàæ›—è¿æ_ð‘=Ìë¿»À؈§ýðÏóý'*_Ä *smìÅñŽýuFÏû>~ü-×1cÏóß~ògøÄðœv±‹]ìâï‚] ÷“Yš‚i *·à”ݵYÆÔ 1ZHë„`]‚®G–e¤“˜ÌspLF`=¬œ¾x‘ZÑi5Y\ÜÏÂBeSŠlH³ÑBï(†yÂLw–$a…Á±Šz}†g<ë›I²˜$Ï(ÒãÑy’Þ ã8¥³tY»™Éfêü^ôÚ9z—Σ)æá+Sö;áÔY»x™Ð‘4ç—˜X?É8ýØIzÙ˜~Â6‡‘éö6ÑIÂÖ`‹Û^ðÚs‹DŽË÷ÜÍÙSrèÄÍ;1Ëx<$MÇ ¾Ÿ™™ÆÃ²3XjI…Lô„™Å.Ýs‘åÃǑ޵™.só ÄyF¯×£Ùî0œŒÙ¿g?ÕJ…F³I6Ýœ¸ûî»yÎsŸÍ>øAn¼ñ&ææñ7p9¼´ ÖÒívyìÔ9vvv(´á¡‡NÒj5©Uc.ÍsáÜyŽ9ÂÆúÛãmnºåfΞ¹À¥ k,.ÎS䂵µ-êÍ6/ùÖç1I†ô·œ:ý©6¬on1§Üß¿æj®»þN\s5÷Þ{/ssóœõñOró-71Óm²±Ó£Ý훜ëo¼ŽQoÀh’ñ`O Ìh€Q9¢â:>gÏœcíòyj¡Oà—}Õ,Óï ©ÕšÌÏí¥¿µ‚ÃeŽhpñÂY\)éÎí¡k ÒñÙ¾p¿V£9»ˆ_©qý3ŸÇ¨¿ÉÆ¥ÇÈâMŠÉ˜tœ– íŽKTëú’f·Io{“|eTúkkMÜ™ ž¨ÑšX<°Ä©G/g†¹y‡k—÷ðÙÏ=†v¹¤G¥6•'Œ4‰J‰ãß ÙÙÙ!N†\¼x‘$OÐZãy>ÝÙYáâMFLJU6Kžå%Ûj fZ;å ‰”ÇW7§Ô2oýß¾g.zÝàóMÁ'¿–Of»ØÅ.þ®% ½‹' "ËRŒ08XІB ²4Æq]¤§q]Ÿ !} R%Ë„(WàÆÏ ÀsÐX’ILÇL&#Œ1\:c‡Ú´«¡‘¶dxÆã^è”Ìtñ«-&‰Bi‹ƒ&žŒI&¯2ÇB§A°°@¾3¤:/éÎÌpîÞOb€ùƒÇPÙ„íÑÖ´¾FS¯Tq-$£JX„cQä…¢(,íÙyêí=`5£AB«Ùamm…‹ç/pâ–g±µºÍ`k…Qo@Tmqí·²réZeäyŠãV9súÉ$(Ù*kiÔjìlöyÊíOe{c›ù=óœ½x‰­É€íâ8¦Ñ™¥ÕÊ„c)i϶ÙÜ̩ך¸AtÓ5×ppi ë•óë:DQÖ²½ÕahÔj¤YÁÊÊ f4UÜu×]<ãög±±±Ñ{¹÷Þ{©7Î*OÜ IDAT;ìÝ¿D¿¿ÃâÜ^\²"ãäÃ'éïôØ3·Dä´š-Š¢`ss‡ë¯»‘°êqêä£\¼xž$6XÍ ·VÐfI‘f×#µ‚zk0¬žNðÜ#d¶e */Ÿ×°×§ZkR­–U^±Vè,Ç% &ñÃË{¸çγäyÆÑC‹Ì´æøÝ?ù8ab]—šãSº"§ 1ÄSIõêÚe2UpöìiÀæa ]AR¤„¾Oª]²,#ËÊ4ï¢(=ÀAN«Ÿ ”µPâ8ƈ¢hÊZÛ+ I:Á›zú•ÒÔ*!i‘cŒB®”` IšSñš¨<£°P(E4Dºe(YèùDQ#+ÝÊ·R ß÷ñ¥C`4ÚZŒ€,K(r´¸ÒÃ:×ñ°R ” ŽïLïËœ‡À ÑŽF‹c%%B•þo'ð©Tj„®‡uÊÚ0cJû’뺸²TFXkžÀE¡³R+Ëþë”õ\NáNbìãYÖbHQ²ÙöïA˜þCàëc€œå¾{k_”2íÐ8| ç¯b‘ßâ~ó©ó öE›\ž|á°býNþønÃþC3DÅŸ=7ÆTºT¥w–køüþÇ?Èï]ý2ÛmFóOãùW7¿|'ô¸,>ÿxó'ßÌ»>÷9€ÿU®å²ußý²~ðÞÉËïäe7.f[\à…/¹ŠúäÞ'} ÷Wd gøüçZTuLïò#|êÿÅ'Æ{øg/9LµsŒ7}û"oúÝåíò»ùö[÷¥›\ä[^~‚hñ{ÅûùÝÿúû4^xKÑÇ_›º´]ìb»ø_Á.ýäƒq]ND–L(ò í{+°Æe)Aa1Ø<# ÊDn•åÒÅ "”‘_+c¨xBZ cÙX¹Œï‡üÉ'6™›kò¼ÛcµÀu=*AœŒðÜ€v»Â°·ƒ1à8–I:Áu\¢¥eB Áðϱ¶±Æõßüb.=ði’¸ 1·„°.*)¨Ö[ô7wÊà£\Ѱö=J±zúQ´°¬omaž[ î:UN>òÊ,¿ x´Gî[íÖ9xýqV7Îc„&O2&“˜8ísþüEffçQIFR(CŸõK+¹ê0—×ÉŠ”Í• Z­&3ëð£Œã„Z­Æ¥}XkÙém±°g)%Ï}Ö3èõwX¾æE‘S©U=r£ οH£Ñ!òF£!…6,>ÄÁC{8{ú4¯~õk8sæQŒ)˜é´é †´:3$YF³Õ¦V¯1èMØî÷X\\ÄjØ7¿—_ûå_Ãn¾õf<×¥Ýl2ÓiÐëÒhÕyÖ³nƱ†BYÖ7w8{ö4µz…Я3Û]¤Û™e÷Á6V·pÜ ƒAf«ÎNo„ç‡ô†ŒÉ$F+ƒtÒ4ÅÚœ¹¹9”ÊȬ¢Òh2÷h7AÄÎÆ:ˡYYÛÀÁ‹_öRÖÎc<Žùó}!GŽcSº³³¸¾G¯¿ƒ4†Ušõ“É£QÖÖnpÕ‘çsÿ}Ÿ¦? Œ¥Öš!/ ê:Ž\K£9ø‰ÑhÀ(’ëœÜZÍ‚œ0P ··Å*Õ û–ÉÆ)¾S#:ùd8À(ƒt¡[¡˜$„NY§V ©uêxa¥=r“áØ ÆHò<çÆÛöã9>i¦ˆ*ßñmÏåüùMÖV7XäXã#\‹)¹Gh%nˆÉ4íÎ ÖZZ>BHâ$¡°ŠÍÉfù9V ŒÅ´!O⩎2ÜI ÊjâÔàLeÊŽ‘l ưr%¡_Mr„×Êã´*ýê®KœNŽSÖSe)Žè¡ÖÞ@—ƒÑ ϸòÂK¬žÚbWUJ ÈòOÜݾÆÑþGãñtÊ…/ $€Àe_c ú‡IÌ­×öðkuyÛSÜÝÝæÜê9îܺ‰Ö–ÐxåêË,/UÉ­MXpDE6Œ.O†t–:Ìf9Y–Ñjµ¸7èãx.«µˆF£Aœ&8ޤV¯Eý£#ÚaˆÎ3VÖ7°TÕF£AšÅH­V ¥ª>Þz³ÆîþE!Ž™N£#ÊÂ0NX]ê ¤[öfƒ7¯súÔY’4ckk‹0 ñ}…±9ï}ß»ùå_ÿ(¯˜L B/à¹g_dëä<×Y‘’»»¼vg@¢G¼ãObIé,EzŠ”‚ë7^em}‹;wfëô)¦ã!£ùY{B-JT—óEQ0›Í8yrm’££¡çÓhÔÙ½3M~æŸÿsþ‹ù66×)’a%Y2$ò=Lž!=ŸÙhL#ð°yò=Âv›+/¾D»ÖÀššï²´¼L…Ž\|ðQ®¾r¹JGž÷çyN4)›%£þÕ³Y‚ã8”…aïཕ.~“)ËĦ0ìáúaEŽ¢ÓQŸv­…çI„œ§ÛÛ‚ºí9äà LêKÔ#!ÑÆàû>y1E—†Rjü($/¾Êyà\—ÝU>ÿüKõ'LF‚$ËQa‰”>Q1K´¶¬&¡eQà¸.ŽòHÓ”ÜäH¡ïÍ lF8¯‡òüp>EÖ€!Ïr¬S‘jcªÏ†$K±R ¥ƒïz[Mh}Ç?>¿V ‚y§s5V”º / $‚Éd\I¤…a)Ëm% n@QdUæBnÁ÷q´wì‹WJ±´Z-²,ÇÃVvP‘^c0eŽ+=¤SÉÈ…ø^HY–˜²$Óå±ÄÜ1 <ÚùÊÿ9©Pó󿉔j~{õZ”:§( ‹D¦1÷G^YZ ©ö•ç]õ^+Ç#ÉñôùõÎùZÿ½ÝŸÿùŸÏßóž÷¼.ÿܭј¯Á…THQ‹[ó{'‡!«¤¼û[Ç÷ ò÷¨µç÷ÛûÛ”Õã~ÿþ¿fÊuHÅü8à9–ûûú½Û²†jòø…þZû»ß w|œBÎC­ªmÞºúfÄ—žýïzçw|Õ{ík¾/¾êü~s"¾òÚ~õùú½ïêüZñÍ›p¾À üÇ‹áhÀ›×¸pîÒ‚Há¯ÿÄO£„D µzžŠ+к’jæy^¥Î:s©fs0¼‡¶Ð]^G^%á6“”EBn ´5´ê šaÀ¹ó'Ùèµ8¿`‹”Ãá>Öx8žÂUuŒÍðÝ*pHÈ’¼,(KC§V£m³íUÄRYkâʂ᭫°tŽöÒ­å:¿þ³?‡`õÂÃxžOwu™ëׯã×ê´¢6w_½Ê•¿€ÛhL|䑪¶+I™L¦XU=·ííÛ|û·ýIvövXÝ:Í,/Yé­’&t:m^»õ*W.¿„Pppp€´x×·7^³ÁÚÆ·®ß`óä¯ÝÙÆÉþá„Ù4©ü³½.e©Æ4›M<ß¡Ñh†Ê…åàÎ6näµ›„aH»Ýa8²Úëâº{Û ²´dÏxþå˼÷½ïåöµ„µˆÓgW1¥Æ”%õ Î`8åú»œ9{ k-i’ãø¡Rܸ~›Þf› çÎ1$<÷ü ø~ÈÞáûûû<ýôÓ¼øü øµ:ozä§Nœà§þáOó–§žàâg¢"Ï_à…ç¾Ì`”0‹SÔ›ËÄiŠz„žK§ÝÄZËáá=êõ:B‚rª)]’X]pñÂ9¬-‘R²wx„ïû¬÷–¹úÒ5ê5_ÿ7¿NiK>øá2Mì1lãHA£Õ¦VoWéκ@c‰šhÍ­—.³¿½CÓ·,¯4YÛØ¤ÖY¥?8"P’Ý×Hã1k›§‰j J¡„‹ÄòüsŸÅ =|×E¢È‹¢’Þ A§Ó!Žcº½%j"jáGu‚zƒÎrÃ[7¹þâ—è®¶±²¤ÙYE…”͵MòI‚#J4íµ‰­Pcsò´Àu+BY‹h“U¡^Z¡<Ëd’ñ±O¿ÊÁ0'5‰&+4YQ%;[SMS³<Ç”œ¤1¶ÔÕ4½H±€À ŒÅ™‡iÅEAQ–•¼ÙX„°dE~LŒ]×Gk縄aH ª¿Û0 eÊiQÁ™¢¬&ÒŽGfæ_y†Öšdãú‹¶%Ês«^k«ñƒ¨ï¸øžS…Š…¾¢\é¨ãþçéxÆ „E)—$˰¶ªÔµZã8UÊ·p®3Ïn2-¨¼úiJQ–¨9™½Ÿ®\¬F0·Oð•š1†Y2=2Kff³)“é¨Z°˜Üi­©>X[q­¹$]:Õë$üÖ/ýLµ ðÇÀoþæoòáøC@Äó¯Ùïù>Ò7|-¤ú'ÂBHÄ×û!à %HŠõ×ßÿWoû<–¯µ/!ùý‡÷µö'~)ü·ùM†¯wáø‡½/¾òø¯NþÐóõÇü#[`ø£B ¾ööÿIãð`/ üêÕ ‰ +SJ[u¥šÂ›œ@JJ¡)08Ò©¡4eõ³Ò”IIA®dÔ?bh-~Pãöõm^t§·"ΞZ£ÕjQXˆã>Ê‚.cFƒ”çÓÛzßNyí¹’’ܘ¾z ÓnÑ[[ÂmtÁ̸úüÈŽ°YŠÝ8ÁÊúÊÑŒ‡ønuÁÿìïüýþVzÔ‚ÍfaŠØ0‘Ì D¨*bmë<Û÷¶q—{{»eF·Ñ¿{‡—¿ô;”¥Â÷"âlLä×nBhVê!ÉdDocd’ÐétØÝÝç]O¿ƒgž}GzZS¯9\¿vÄœáúå›ÔÝÞ»;Ûܾy‹îR ! »¶Š5!À÷=B?àú[lØààpˆð¡òÿÂrûú 67º¤e†°ËË+äeÆå篰ur­K‚ àå_äÜ™‹dQÁ™Ó'YZ®áªŸÿìÇé®oòÊËLcËw~÷»¹qõ&gÎ¥Þª3'|ä#ãO}ðý4Ú5t#”Oœä<ûü ©xËñì—ŸÇ"èF\ºt‰[·_ãh0A….sÆ¥·>Åáí]¦»/³½½ÍzÔ¢ÞîpóÕ«lž8ÁÁî.ã£}’Ñæêi1Ãó|Uî¼v3§NR«5Q@œ¥è¼`<á.FìܽE½¹Dgi•ÐZ>ù¹ÏÓ "¢šÏ­,­th«M%QÍ&e–0 i¶DõVx³f¶ "¼Zƒúz‹r:Ÿ’Æ ™Ö´j.ÃшZ£Î4µHÇ¥ÑhbLI–Ï8ìÐh´h4›ìÜà jxžG†h£X?q¶òò.û FuB0œŒ©EM<· Õè9:˹~íUÖOÂo6pKIä¹¼|å%F‡l½€Õ†îr“I\ A…)øò3ÏðÉœï}ß÷EJI”TøaHg¸®Ë;w ¦Ó˜z½Ž¯-³íæÖƒiØA«ÎŇ$OsŠÒà×#>õÉÏðУQÌR®]½Ê§wwxÿö!öw÷8<ÚÇ \®^¹ÂÛÞñv.\¼H2pûömÜÈcyy¹ _ŠcZ­&ؽ{×õÉŠœ³çÏ£#©Åò”°Ñ¤Ôg¥µDZT°Ö¨3ôѺ$ªGk#ÉáîßþïBz?ú8ÿæ—‰‡~Óñ¯rogÀùÎñÂ3—yþ¹Ë¼íO¼)Ç<õ¶GQžÂØ’“¦A‘k„pÙß»ÇJ»M¤i ŽÄÉ õõÏ=ó Í•A⺠ßsiÕk &”Æ$3|×Ç÷ýy’v ­5ZC™XcXé®aDÁR·WÉt§Ь Õ^be©ƒÕšéh„k-µN‡"Ë™LFøJR“%-(Íï~á Hixò I5©Õš-i¶–¸yí%ºÝ.Y’ }å;xaHoý4®)Éâ¿Qb¬!Ë3º›k˜2e6›Î¦8~Š„('¢tˆS«'†Lû,­nѨwhµˆZ›ÂH´[£Ùhà¹y‘¡2‹£\êÝV) "×qpsˉÍÂu)JͧŸÙáæöbS²¼Ôâü™UúÓŒt0åè(Eçáy¨ÀE•U¶ãy ….aÞÝìÛJÎ\MZf»Ê/H3Š¢ Uo µ¦Èr|ßÃu|ϯ’·]·²}QUaé¿V'UõTUåWRnc0¦ «áügƒpîÛ+v®óézÇ^gÇÎû—Áp8DZSUf¥Ö‚ëø ΜH×ýJH¬#‘B§ ¤ÉÜv:Ÿ&[C³Ù¤aPh2“VŠc+¿r‘1ŒgKe'±†Ðóq•Gà„`,~P©)jaU½•g3² ÂZƒÖæxÁÁuÝÊãWÁd:­üáPIÁ_OUׂ@/ð†c¦³À ,°À7Jc+/¢P$EF³¡pÈ\V kJŠxVM ý¼JéU_¸¤¥¦°–Òæcè÷G´kŠ>ÇÖz3›m\D#Œ%rCTàPêq|H«°sã:ãјo~'E® CA¿€.JâdJ–—4m‚å^ ò)õ¨Ã[7˜–Í¥UG‡,­ng ®§J0Ú0OÐBb¥¤Õ©&‡û{;è¢ õq\)½Þ:ñ,ÇóJZ+Uzq^ÌØÜÜ$ð\–—z¼ðÜË3>ûùgxô‘w0›‰]"?$Ë2zkkõIg1Ã{}vwöyï÷½ŸýíöÇ#é²¾q‚ÁQŸx–súìYvïî°uê/=@¿ßçÊ—Ÿ%ÍR–7W«Éà<•8Žc<Ïgµ»ÌÞÞ!Žrp‡n·ËG~õ×xôÑ·páÁ‹LF3úÀ8KxÓ#!¥ä¨ßgccz½NÇÔ:mÇ}Nln±´Rcg{Ÿ_xŽ~èûøÔÇ¿Ìûß÷}¬¯¯g)¾åA¶w¶Yé6xåòË´ju^xþeVÖÚt×zU`–N)uAYêã .á*ò¼äöí;¸®Çd<Ãó}Ö×{äÉ!5Ö–tZM‚Þ {;{¤iJV”45ÒLãH5ÊA¦³„v³ÅÎÛX­‘Z³´²ÌîÎ]–š ¢(boo8/hÖ#¦iJ–§¾ƒr¾t8{ö,iÓ?:bEù8RÒï÷ñºKLgci 寏²F«Õ@ ‡µ-ïÞÆ}„P4M”ŠéÇ„¡‡Ð)@YE–ĸŽÏÊj!j›=úGy2ãÖ­»û¥U¿F½Óà k•²#ªƒ”ENše„~@k©C2šIƒã;(Ž5xž~j“7MWxöÕ³Tóâ!íÀ¡Q¾À  £)ŠW€T ©@•‹ƒÅh;÷Ïßg¾‹Öß÷Qª¢Z÷{”³,;î ÂÏó(…­’ªËÊçì+¤Ki4aU¡YÊ™/†h²,­:™eµÝ*L¢±Ç?ûaˆŒTApÊ0NF4¢iš"­Äz÷ÔJS§Ï ÐE‰0\ßõðýʧmŒÁ |Uw³–à ÈK@ÌÉ·‡ãx”y¯"ÏÅSUVè…xžG^j”ªú¸ãdŒ|%yÛäU]ÕÜÿm4(éÏ÷HÊÊSþz;^z7oDzÞ ,°À |£‘f)“xŠRŠ ˆhD!FjÍÆVS#æžÉƒA…uGáI)%®ëBY°µ¾Ê[½Ho)¤SK‘Å  iã*ò3=ÄuJ¦“)É$fic£Á„z¤Ï&Yip¼&íUÒ<ÁkÔˆê!Óaɽý]rc©µWi¶»Ü¾ñi–77˜'ij1i’ái—(×!ÍK\["9ŽÂj…¡Jíu\M™k×Ðë­ÕCP°¶ÒÅjËt4æúµWø–où>ùÉsöÜIf³)ß@Y”K–dŒ’>ÓñŒÝí]ºÝ5žxë“ôûý*¼HêÍNÅñËí5ž{þËX£q]‡›7o²ÜnÑ?8¤»±ÆúúúqýOQ,/-qttD»³Lo¨Îç>ýYΜ?ËúæÓé”Á`Äèp@£Ñàæ›|Û·<ŵk×X]YÁu]†Ã!³Ù6f— IDATŒÞJÑåÎkÛ\~áYv÷†¼ÿÏ|/¿p•ÕÕ~ëÿþ«½.A]qñÜú û +«üâ/þçÎ^@—.E¡Yé´06 iœ3›Í@*B ¥¤Ýiqåòsl>ÅîöI<åÒ[£ñ—ÉtÄx2D9[Xý!EQÐlÖX[ë2Lp•@ë’"ËçÓÑ´šgK+]¦Ó1µF“²,鬮0<²3PwÊUDµ€8ŽIòŒÕ•’4&‹f³ ëÝiñïá_3’¿ðäSüÿþoóßü—“;w^ÅÁaX][eg2àM>Äát‚øtêuÊ4# —¸rå gNž¢°ßw9::¢^¯3MYí®a•ewgéúćG¼ý©ÇÐZ3NYïõÀv··yì±Ç8Ø=@;%ozÓ{ëY­&×®Þf¹³ÌsÏÞäûþÔ{ùñÿúñïËÍFø|ùÙxø¡ \8‰þÑ„ÃÁ‹×dyÎé3lœX¥Óªqêì)ý1ww¶©ÕBV–[üé|?¿ý›ÿíF›tšsس¼Ò"Ž ”¬’‰ëµcJpe5íty‘WÓ÷,GÊ*\j:±´Ôa:¢ ìÜ#l4)¤Ä C–[J®,—yöÓ¿‹'-'¶Ö ƒ€áp†ï¦”YIg¥Çáá>×®¾@£¹DY¬,w9:Ø£®bòÌ’1ËËËììÜáÎÍ—év×è´—™Å#N>ð½­uB·Æ³Ï|‘¶1rëÚ5Òé'XÛ:ÃC>ÍQžRó’,Á ]žržã×…¡ÓY"OSò8Á• |æêU…¢Ölrb­AƒµhS`æÏR몚NÇ~á ¦ªE%UÕ5åyŽë:(¥(ŒF‰3ÿçâ8Î1¾?‘.ŠbžÒ¯ÐÖa6f ÒUx‹k²¬"Ñq£uU¥Ud9Žã¦i%ß‚$›áyÆÐ"ìü8¤ç"¥@X[ÉÉ£6ÍZ‡,OhÔ[•×hR{×q‘B¢ÆÎƒÄ¬¥J—á <é¢Cá9Xk¨{2Ž)”ƒÐ9žtP\å!•ƒt«Þê4‹q]×qQ¢RF¤ENÕÀ¥)ò”i2a80›MIf㪠Bµ¹$ÀJJAb|ïuý¬_èÞP\8w‘k7®ò‰Oýö}( ,°À¯–:ËœØ8ùFÆß`”<"­Å çž=冕gp4Q«|ä<üF)-qžqp°OMü𽟓­£íCnïì2Œ: üšÏ™ÓqzÄt°‹Í5f6%s- ·Ewíõö“á®+Q2¤(-‡ó.`ãL“i6¢‘†‰láZE<èyn£ÆÌ P® )Ójr…Gžç”¥Aø5¬¤Y Ò§Þj9÷†œ>ÿe9¥éú 4FdÓGZnîoóÈÃoç•_%¬µØØXçÖ+/Ð"¤ë#-4êK”Ú`€d<Åo´h÷6)'C~÷·þ=µ äÉÇßÊΕ—ø¡ÿYfû©žQ«¸‘5Ð\¯Žëú4rC¿ßgYt®™Î&¬¬,a…Å÷<žzÛw¢4š5 «IÓ˜»¯ÝB:’øá––;·n³Wo1;ÚãÎÍ9¸{•V§Çù7¿™Òja“Râ,a6"…e6è3Þ?`ió Òm⨓IÊ/ªaL†’̽ù9«'ùõ•ƒrªúÚjqÊR˜ª3ÞU•ÔÛƒ••ÜÛñ+RnJ]d)1TÇEeY©3´5ÔëªkÞqŒÑ(³Y•€}ß¿¬„¨¦å¼y²vV[¢kU¡ÖZ¤¨ú¤”Ô;ÑqïrÕÓ\§i­±G–Â÷q¥B•¬=M&¤iLœWÖ•*ÍEK£Y#Îr [I°……,I‘R…hST×Z#Eµ° µ&›Ž‰Bc´‘”:}]?ëz7 ã ,°Àß ÐÚà8 ¥¬¤E†Nà Ê’"‰Ñe–átHžgh­yàìy¾û;¿‹Û7®óÑ_þwÈå5¾ã±)¦c¦GG¬o,!³ &Ÿù–‚óyjõ&ÏŸcgÿ°"(Úí6ÃÁˆÃ£¾é,y¦ÙÞÞ¡×ëb­% }fqÌîîëëi8wî :׌¦„5,µ;\{õ:®ë3ÍfQ0¬±½½O£Ñ ÌòŠÖ#Q@„Ôj5|×%ËRÂ0äêµk\ºt W9 ÆGز@·"|ßÇXK’—¤£ΞãÕW_¨ª–FƒÊƒ;1Kêµ&³$Å“ ”*âYêÊÛÏ&¬®ô¸ž¦Ü}íµ0âh×ÒZ^!ª×H‹×ñØßß' ël9MÔª19\gÚß&‹ Gì¼v•ÕªÞá°yò$èMýCFG‡£¡Ì±*Ã8 KÀeçiÔÇ~[kÉF‡~ƒ7?´É3¯î0."Ï«‰«#±ó:'gîcÖZçö!ð£'¯|ȦÔÇÄÓ&¥æ_Õ}Öšù T€X@X1W¢h„¢"çJáHU……‰êwÕ\–o… 4m-zNî¥Ç^kÏóÐEEVã4¦(ªð°ûéìõ(:þÌò}Ÿ¼,AÊê1Ö"Mõü¬•t{þ\1ZãÌ=Ü®ëâÉŠ|'YVIÕ±èBãE^dÄ錢ȘÅÓùg¤&N4Žp8êïa„À*GH¤±xŽÂXƒ5ÕóqŠô{ŽÀX…D`¤Á—Ïsðœp^å/R¸X`X`þSCQ#Â"„¤(4ZWŽRXdQàÑé98©Øíù?íÿ"òLm™Ù«Ü©•üù?ÿ!Òñ]$è<ÆŠ”$;¢Œ‚8#s4.‚ÖcïÂX“MíÝ h5©7kijЏ`ëüøQ‡ƒ½»\²ø£á”F÷qž1pp8»u#5I<#Ï4“I†Ôq•BÏ÷±ÒRj‹uC:½QÔ@x0›Ð6æp:D­5X?ûeQðüo”L8<öÖ·"¤âúƒìí2‰S2¡ (ðkЦ³Åêj—Oýî¯Ólö„~Á4auu™,7|ì¿ÃÅsâ?Å£oyœÃ»;Ä“)ÿèGyò‰ÇyñÅ˘"çÉw>˜O C? Ïs²Jû„AF¯·Î[×¹pñžWí§½Ôfp°G…¤yIâBÓŒR¾õáu>úìWa­À–%2 p¥"ÏsÜã ±R•ìZJâ».Ú©Âô¬µøŽBy•|À"0Vã‰T*$%‘s_2€1 t¨:5 ]¸EQë’²ÔH×£Hs´µ”sBkŠ;'èK'U]Õ<¨,ð|°J¼.Šüxr^íÓ|%Ì×U(ªÔnk«ûʲ¬¦ÉJUri×Ảû8žUÇ.« ±ëûHc®¬<ÛÒÂ2šÆÌ&cļ«º( |×Å‘ ‹$rÝãÅ)%²ó 6¿Ö¨déóçâ*—ÂZì|ÑS¢¤KèG_õyüÿ'ÑÇ ,°À ,°Àß8¾GT«Eu¢(ª¤ŠB—UøP¡-³4¡° „‡¤’:Zk)Ê’8‹!)ùsùƒüåýsÌú;èxH>›NÆä“ Ž*qý-5•^ 48eN|¸‰i­tXß<ƒ’>n™Qæ)Æîݽcrl™“ç«§/±~ú"³ÁŒÈÐÖàz‚Ù¸†Ó8>A½^]è¶š(ߣ̬0 <p¥ÉHㇻ‡„^ «açî-vî¾Êpsñ‡(ó¤òç—Ÿ{‹Caç/œã…Ÿ£×[cgç:·œ:u+ ÝÞ:ý1®ã(—þaŸÑÁ!o{ë[ÉÒ)›]înóñO|‚gŸ{†ÞæQb¦·±VÕãØªgyu…»;; ív‹Z-d2™0Ži5›8žK’¤ÇøI’QÉÍ-j¡‡Î5KíEVÒl6¹ùêeº«òdHom¥öo~ü &ÃÓ‰f2soxÀRoƒïùÞwóþ3|é‹ÏQ«·ùþ}?ëë=Nœ‡ï‡”…!Í3Ò¬àh8ª©­œË„%žP”UH˜ûýKcLλÞõ4oyìq¸x‰­Í“,/-Ñ?<àÕW®2ê8ܹ˽íÛܸzl®¯ÑYj3œN¥’Þ©7¡µaowϨGR&‡‡(åPkw±6 Ï ™UJ 5—S[k1ŒX¯ŽpC'À÷Î,5I˜܄õõ0À’@:SÎǪ/k+Â|_b|ŸpÞ'¤ÇIÝâ+Óa« º()ó3Ÿ—e‰.«‰ržç€À–aìñötiHҤꕾ¯Þ¼? ¯È¥ƒïWÝÒ÷ s£Ñ ª×ð¼ÊÛìÍ%è•ï¹ÚFYVSõ0ŒÈZ­^Iþ=ÏóŽ·u?A`<2Iã˜Ëí§678wöË!Ý•’ákÛ$©ÁñžSà Š8Ø©˜ Ÿ4KñÏlሂ89D©’4ËØ8õñd eÁlœ¢]ŸÑ¬ RBd8jQ‡æúãÿ—½7±$KÏóžsâÄz×¼¹oµW/Õ{÷ gºg†³‘"‡&M“4(‰¶ Û²þ6$‹°`H° –-a`Ò"-ѤgLKÜg!‡œ¥›=½/Õ]U]{få~÷Øãœãq»†´)ˆ°©ÝH²2póÞˆÌÄýâ}¿÷=Þ¥5®b8:"l/ì0 ‚ˆ0j‘TE©kk©1äiŠ• •‹#†ÁtLä)ÊhåSŒ“œ/Dº!É)‡Õå5n\›ås°ûÞ-Ö–Wˆš¢¾úµ¯2ž¤œï3èßá¹|ã8¡ÛjÕÊq«E’¥yŠ':ˆÉ Ï¸ßgwïÅÔâEµš¹´²ÈÒB‡‰¬®¯ ©Ó}q\'ÇiB§ÙãÞ½=ò¼dqq‘¢2,Iž ÄqÌ`0à‘Çer8a’ Y”]†£®ãsrtÀöê&{»»D¡Âmº\}ggž{š÷nî€rëæÎ"A'àÒãOqëúm.^z”¯¿ð"O}ô)=%U(éâº.ÝN‡½ÃC^yý-”÷8Fté-¬°·wÀÊrq|Âp4baq™4N°Æ!Ë |¿V¥”œÚÜÄ ]zÝÁÚ ûGû´Ú]ªB“ŠÜ@Ç¡³Ð%Ï&,t›\}íUžv?Ž£-øš¼Ìx÷Æ{ôšM&Ó1~.-‘Tn£Éæ©m÷ÁJ&“ I’€•T•æä䄪ª(KçÖÉÒiš¢¤$ùÌλµ~šƒƒ–»‹8Fá.NVÃî;Ü“šµµU„’LúõhµÛ¬¯ob×–Ù½{—0 °Ör÷ö : ]­.¾ôÈ’¯Ó¦ÝY¥Èb„­0ÔC¢rÖ¡\ÿna«Î%(Ö³\Ü^fBÝ®…A8.˜ºsXë²N|ž©¶õ`Ìý×…6h,ž÷-Îïïý¾oãö…ÄÌÔã"MëÁAUå÷mQ–u‡²ÐDQó~}•µÇ©ÍáïœÖÚYtÝ% öþîõû¯SÈóœ<Ÿ}õ$ð÷Ÿ_m#¯þD­¬ïzxªÞß®CÎE‘× ¼rð|…) {û ‹+ËJ(Ïq)Ë’À QÒEë.ÆVˆ©¬ÏÙ¬ë¼N"WTE­d«ÀÇä× ð‚Zñ×E‰à{ \Ç!)RÄLÙw\ùÇÂÜ>8þ´Þ çÇ~ìÇþË .ÌwSçÌ™3gΜ9sþŒüü¯üäYI’Æ”eBYå|×#ô]º ‹ø~ˆ4a¤zcÒŠþáqþLƒ£k×øúW^gšhN:Mñ6')d ëʪÄo¯ÒÜzxtEjn°pú"ÉxF÷¼õy7dûÑÏЪbFcŠªäí—Þdéü£ÄGwå)aqïÎ;¬¯oâ4ì\~‹Ng‰7ßy—sg‰‡#ÂÀ%UVà…EšaÒŒµ3Ÿàûãq Žd8â)‡x’pw÷.=ý:‘Lú´Vp$\¿v•éxÌõWØßÛåÒ#Ïçc:Ý^ýU¸ô;÷îaJM£Ñ"h´i4#tUpxxˆšþhÂùsçy÷7X\îñð¥‹HêþÚ'žùo¼øO|èIîíìaDýf{uc•¥5’8­ÕQQ÷î†Qƒ"/\ jÒ?°}ê4¼ýÎ66׸òö»,t;¬¬.st8`ÿ8c8ìãHŸñpD³ÑæüÌÏñÙú, H²’ng…“ÁÃIN…ïð‰O|„õ ––°ř3ÛŒF#Ò´`ccå†Üºy—f£ÃÚöKË † ~(¸pþÉæÖ %e: ‹pTˆ/“|‚Z½Mª$'ÞOQšæb°ˆá.ŒË‚sçÂ19·®¾C?Îh9?ÌêÙ³Üýö-z«=†wï‘dek»o¾ÅѽCnL¯Ði·ÙtÏóxï½wÑÚp÷îA[ñ‡ßx‘Ç.=ÂÊÊ2/<ÿ>ò [[Û„ABU–„‘KšNØÛß!×¶V KËí;‡,tlo®pï`]£Ió’¨P$ RyG µ¡ÙlD!aR–%gΜáêÕ«ìííáom"¤Ä0ìð=ŸÝÛ»œôa¾ò[¿Å³ÿ$¹®|—(r)ª‚ÉpDV¤HáñæK¯²±¹Bš×6ð², }Ï÷¨Š EU…ͺkÙXÒ,f0<Æó<šÆ€;KQ>8<æÂ…xöcŸàk¿÷%aÄéSç1FsåêÛ­ðôOòíW¿E3w&Ã׃ØÊJA+j0™T(¥h¶št—X®*ŒôIã)ÖTˆ ÒþÓþ ­VD£·†6uâ3V’eQ³Þµõ\ç)†“övoA³…ïGäI Æ©¯û¬sy8ßÿ/fê¨ÖšÒhª²ÄTu˜ À U=LE¯œ™š £É˜Ñ$!+rƒQ2Nè´Û`-¾£ê´~ ÂÚY=˜%³9ÕèPãøBI0õN°ú`™)ßu÷·°ö~t¥5‹´ò~¸Ï“uå–¨|«ë 3mëï4ϳäízº$ÉR0µ y>¾ïÓivfµZ¥$¾ÔÕXžƒ_8¢¶±ge17ðk»»­×,¬µ¾‘]ÖªúûŠxømq”DI×WHé`…Å’j¦HPÌè9sæÌ™3gΜ?&ý!Eh ‚V»‹©Fj†Ù1T%Êó1H\ߣ´°ØëЊÚüæ¯}™g?qýÉϱÜh¡ò 'óÕ¯=OÔZä"j°9èl^Ñã÷ÉKèÚ¦*rDØ# ¦'cRþ ݧV`4ewxOÑÃ]FÎoarõ`u¤“”g>ù£˜2ç僗i-/3FðáO~†Ã;×¢D©z˜Ð¢VÛ(5q<"ô=k ‡D¾ÏÎÞk«Òn.±¾á9šQ1¦4y6ÅW’;·n0‰szë<úÄ“h;fÿð‡.=ÁåwÞÁs““>a³‰ò}&T…gYY뢭d25œ è-t !˜Šýƒ!ñdÊ`Ügk}‹Á`H§ÓÅ ŽODQƒ"Kñ=ÅÅ‹ðîÛ—i‹U:aÈÕ7_åÌŇ˜f9EZðÔ‡?Âå—_a¡½À‹/<ÏÖê"/¾p…³.Ò ||ßc<S•R(W‘Æ1‚’0PJqt¼K«Õ¦ÝißÔ*«Œ²˜²sï€'Ÿù8_ûƒ¯“›Š,2Mè4h6#®Ý¸Æ3O [Y^~å«”Õ?ðXêtð¤C#j5š4W‰šM A3¨k”„ß$-rª"Ç÷JªÂ¥ÈJÏÅU#*,†<­­ÖãqŒ”’ÕÎo®âF£ÂrçÎïÝí“Zƒ#ñ$ÁZË4Ž©´f2a¨÷ ½ Àw]|×ãýr=2}OÝ·` eév{ø~ƒÑdL™uϺ5”Ögi½w¬:ÏafO¶³À±QžâäéÌþ,ñ”‹ðTýù¬_þ}[³J]áH‰ã£ñœ:…\XRÜD³B ¥Cèùh­Ét‰¥oK 4šlœÍú£ÖÑ4ZmÚí6KǨz Ðu8Z©5AàQ–ß÷ïïuWEÝ)]ïÉ×ÿ:Žƒ’ªªmò®t`Öf]UðûºR k •ÖL§ÓæüŒ¹…{Μ9sæÌ™3çÏ/üóß%ð#°IÔhá{upSO©Ò”*Ëñ”ÂMG†dyÂ8óÄÓóÃßÿ ZÊ’æ)£¡àëÏ_%êmðèSÒ]iR%c„„¼—ää:žh®l ¢6Ê8DÝS¤Õc&ì¾ñ&ÑÚyºë[äÓ1a§Ãäàˆ ÛaùÜ%ôhÀñþ>Ë›g1“N»ƒ.,o|ëk(áŒú\|ò»ð|Åäh—,˰ÒA9 G¹4}Ÿá°Oe*z«[ŒNŽ(òÚÒ:Y[[ÇX‹ç7p}W°uê,‹½Eª2çê»Wé,,"¼€S§N“Œ8~¥<ò,A ÁÑñ «K+(éqö‰Gíð¥ßým>ýéO¡ \yë5šÍµíÓ(8†>¦(¹µ³Ã³ßý)ÂÀ§à¹.Ýn—+—¯pñáG9><Ä•5 aûô&R ¨4Z—”EI^flm­#KKØpÃ&ÇǺ½.Ú‚NƒF«‰ã”$)^{å=.<ð ¿û;ß M `ÙÜ:Ç¥G7¹sçÎmò~á <÷ÜÇX^íÔA^:Å÷ ½‡GÇ,,,¡\‡ÎB‡'Ÿ¼„µ–ƒ½!/û]Z££ÃQBQM99L(Ê¢Þ³U.I’"„¤2 IR<å“%Ç'Ç(GÕÉߎ j„4¢¡Ã!:9Úß§Óé0™Lp¤À|–{Ë` ž§È’íVƒ,Í‘H‚fTw1[]ø®R”UJ³Ùf4R™G9,.® ¥B8) Òuñƒñ4ãÑ'çöí[äIÌÚêz½O­s²,ÅóÚ­6+KÛøA‹,ÏÐe…çµPÂ`´Æuª¢bÇœŒ& C’é« Ýnîâ:p¡(¢K]§QcÑFc%}k,VVTIÉB£¢À[׎ÁwPR « ­ Y^WÐÅI\[×­Å‘õ~µ@ÒQXc‘Bà{îý°1k UY"°øn½Sí{®ëÝ GPêúk ž«PRa¬ÅXƒóÇv ®•q« yQÔª†òýZ*ÇÁòÇ‚ÌÞß–õÍ¥ÊsqÝ:(ÌŸ=3³€›Ù·#äý2G:hSQé ßq‹TÂ^€6u°B ¤@›úüúÊÅ÷]! |ßóQn€æÌ‚™Ý4ßI¼–²î©¶ö;5du5X}cásŸþÐÜÂ=gΜ9sæÌ™ó‰FØÆñ|\?ÄŠF’ç9®£(-xGi4¾ð°NI£ÑàÓÏ>ËCžå×~ýhº –Vø£^¤×[á¿ç)t>¦œÆX›RÅSŠá.Òäò#\" èlÄdt@óô6§Ÿ|šñÍ{Ðî’ÝÛ0@6;ø~@Zä4Ö7h ‡½·9ô,*WI<ãðîk|è3ßíWˆ”¢4–f³Åàø-\ºžKxhÛ¤rLUÖ¶uϯUIá@’LëÔæíSܸú ½…N~ˆ<ñò·_¡³°@œe<üðÃ8ŽE ‡ÞÚ&gÏãÊÛoЈ"z½“xÊâú&Ç7îòõßýO?ó$F—\¿v…f3ªÓν€0òHŠ ©K.¿õ&ÿ¾ªŸW3 <’,f©·HY¤i]gÔêv(tE§Ýb’Åô:]îÞ$N3«kµÍ7òŒ¸Q—¤Èèyš°Ñò›ìïà8 nß9!M*¾ð+¿Í`”ÒiE\¿~È#O>ÎtÜçü¹‡pÌ„‡z„ݽ»t—bee™8œ’ç9{û'Y͆njÅÅE.¿}ªªüˆåµÆ“ î"¯¾~™Vû ‹KÄÓ&“ /œÅSpxЧÛYdÐ`ª>í^§¶Ú¶Ô_‡¢*)Ë’õí-¦ñ”Å.’e)£aŸ¬È™ûh“±º²FQV,,,²{ç:+Ý.a+Äó"ò -0Û•µÖÇŒ­( ÍÂBg"ê´j+¡*+¤ã%)Rƨ âáKb,<ÿ{_aggŸ‡x¢ÈP®]}…ãÃ6ŸþĿ˹‹’cîí]!Ž)óƒ M2¢¦CÐA€ïz,/®`­@W†épJꢎOYMQ®D‹6å5qC‡ª¨ÐºBè ”1Œ ù|èÒ:/¿sDÔ‰ÕZ0–étZ«Æe‰Õ9Rûöi ¨?fCö<,ËŸ,ɰ³Ê&c ¾«h̬­¤=+J¬)ÉqÌtZïZ—ºªÃÊU§Œ»ê¾«œ:1;Š¢?–Øí`„¨ód]·'¥D¹nm‚ÒÔ{ÛV׎˜U^Íú³WQUÙý„ñ÷ãR$©(gí¤œ©Ði’cíwÔc¬ ˜)ÛR×µ`•¨-ùº(ѺMSJÂÌÞ-…À‘ï?¦@cÑyN^•äUùþ¥Ÿ+ÐsæÌ™3gΜ9.ü‹ßù:Ê÷qÝÏQÊ# |ܨMÔY¤Õíµ"?$/ WîÜàú•÷ð›!~àùõ¯~†KW¨Æ÷ÈG»”é>²âˆ§óáÊE´N(G;îqúñï–E¥évVhô6(¦c0U:¦ÊR:뫬œ:g5‡ƒ­î"û»·Ðh&û‡`*\Çðú»Wùøýùø:e™“d‚¼ˆn‹Ã×é,õXˆšôÇ#¼n„#\*!QnH©Áõ}¶Ï\䯛ô%Ú‚¥ªßP¢Á1”UÉbw‰VÔfueÍõ%Ö;]ô4Ad%¢(P„±äDHÕ@z¶œ`Ǥ™eëƒLO†¤yBXWª€ªLÈò¹}ë*Oú4ãþ€¦(OÕaTyÊð褮A vîÜåÒO`)ëÞY#ð}× ÀXŠ*¯€´F:ÇñHÓÇqȲ!j;h<žà{ׯ]A[A£ÕCjg‰ñà×kÖÁMžGà´»mÞ}ç=>óÙïåõ×_' C²lÊ›¯½ÎG?öÇýcvwvØØØ Íbº­vmYÒõh6›t›.îã>O~ô9Ò8¹¯tu;öïÐk.ãyýa庬.-sëî•6YŠ.3,ŠÑh„±š}èCܺùÊ h…>†Ç`0`÷ÎaàqáüÃ0 Ù>U¢”ÃîÎG'c|¯IUn¼w“­‹—XhÍ6o¿vßÿò‹t<~pÏÿÍŸdww‡ûG¾›“~Ì;oßà•—ßâ̹³,­¬°{o—“ã>áö&eY°´´Â­›7ÙXßb:€L'Ò ÑZ°»sH«5|t%q‡µµ NúuÝ”¢®•R’Ó§£S¸®‹Öåx¸¾ÇæÖ:tÆñ”µÎ ÓI‚.K¼Ù®-²~ì8޲¶Ðz~};íy^Òh…¸2 +J9TUãµM>ϱVfQ;bOX\\mÉ]Ip‚Ö%Óé˜õ­‹uÊ´.Ñ:aØ?¡,Kòéˆ\Wt—VY_Ûf}{›õíU†Ã!e•3ègøª¶ WÄ(ϯƒýè-¬bŒd0 TÄJwWº d3ë²{ke38Á$¶#ùăgù¯½‚ñB? j·î‡æy^Ý—eeUà©€ªªêóíÕû½pf{žuï‡rY[…ÖZ„#ïï‹'E­,k­I‹¬Þ¡vJ|? Ý”¥ÆŸÕS cAœÄ­ÕjGá —iCS()$žëܳ3µYIg¶j]ØáÈY'5÷+»’$!ðë²¢Ð÷Ufßõ¿Ó­¡Â`«:\8µVë•Ü¯Ö )¢()ŠªV§mmÉ7²VË‹ªœU 9³¿¯õÐì>®£îWŠ)¥þDýÖÁ_ˆÚLnñÚ«ïrs¼Æ§¾ÿ ÕÿûîŸå˜9sæÌ™3gΜmhH“)fVg“euÚ¬ïH\?¤Ùlb•ƒp,¡ ˆI#ò BOZέôè´\мÏt:À3Új²ª¢ÛÛ«ß!M'x‚¨Åñ¸`}±"è6Ir4HÆ1:O¦\zôúý#+ìÞ¼‹ÓUdÉ“fD¾bÆÜ»~xøÂCdù€ OH*[¢­¤™V†U§…p á{PÊ”,Í)Ê)ê7ÃE+g±ÝE(xàüܾü‡„~ß Ù?8ä™ç>Ëdÿo¼ñíå &ï½…Ð’ãƒ]ÊlÌåoá»Ï|èI^|á›X)Ø\[Åê %C„cÉÓ)ƒñˆ­Ï#åK¿öÑjë2YêÖiÔŽì`5£”dçhO<÷Qƃ!Óþ¼(YÛXÇk6¸}ûçÏŸ¥ÝñIÓ”“~̳Ÿx„ÑxÄÎÝC†ƒ ÂUŒÓŒ_ÿõßDÉ6ÒaH¹4¢Ξ_äpGxŒÇ†£ã÷XÛx˜7ÿè-|ì,ÿÑÅa±í±¶¹Î ßx“S››üÁW_àòå=â4æÂç0ÆpëÖ-VW×MÆÜ¹½KØlptrL§³Äx³´´€¶÷îíãº.››k•%+JN^ç¸?âÎí]Ò4§·Øã`ÿ˜( ±‚ –·nÞd{ckÊÊÒ]Záøð„C%ênÞý{(!q… ÒFdH/ÄTš2Oñ¤Àq<Š`P®ƒÕeœ­ëÁ¶* ~RUJH´)‘Ô×=ª²¨÷­ÑH¤P`%e¡q|A6j5yfM…1†<¯-ßÝn·¶· ÁÉh  $”yA¥ LYáxi–Ì|AaʺN«(‘ÊÁMV–ÊÅQ.…Ñ”åkáþ`ÇõÿÄoþc~ú¿ûYþç/¼J¿‚?­*ûÏrÌœ9sæÌ™3gο.¢°C·ÝÅw}\ÇA [ïð9Dý&Õ Rà¹n½ßˆ¥ÔýðC4½‚ltÀøðn•Œdã_ø%Hâl2¥J*chw»lo¬“Š‚R—uŸª ÐU†Îá°¸½‰Ûéø.ƒ“}âX\èqóÚu¶7·p<‡~¿ƒäòåË4›ÇûûH+jõSHtYñÐ¥‡úMw•xÊ¥ÕjqçÎ].^¼@ORÒsoŸÝ»€DI¯×#Ë2nݺÃ<·ˆ޲ìíïP kë]ÊÂro÷¥Vzë¼þíø~Àóßx‰xšòOé7è.4 ûü“_úU––züûýs|ï_únîÜ©+µ6×בR’§J:ìíìÖ r’R–õàã8FÀÖö2ºÊh5|ºÝ&Q+¢Ñôïwú&iÌx<&Žc\×e2žç±{o—Ét„1†ÑpBe,VH’tZÛ†gÁMEQ`L}-ª2§, °%Ež#÷ƒ­ê´åœF#d0êן%¦ÒHc±F …bii…ñxÊí›·è28òoýÀóÚk¯òòKßâöí›èbНÆã1Ãá…åe¼ âúµ«¼óæØ,'òë*¥–¯”À]¤yŒ ¢È§()ñÝ^gƒíõºI<͘N\×Å\ÒlJV²*&ŽcÎ]èòWþÊ3´\øê·^æïþܯð³ÿû—ùÌsŸäáófUmŠ<­s”BÈ:Q:Š"ü(ļÙùËê¾è¼ KR†Ã!£Ñˆù÷ø'ëCtœÅ«¶õI73kü)ÇÿYŽ™3gΜ9sæÌù×ÄÒæ6Vç` ÖÖäRƒãÄÌ"k­A/—ÝæcO=H<¼N$­2„SQÚ ÕP(/¤*%G·®à(…·rŠž`IšMQ"@è 7lRYÕE~H:$´ð¢ˆéd@g8ÒåÔ¥KÄû×ñ­%õ]¦ã˜Õ¥Œã±yþâé˜@5(Ë …NFSNGŒNúœÙº@Ohœ9MZiJ[ÐôÛ%}¬¸^D–O8žàšƒ›»<þì&¦`4òÞ•+üÈ¿÷SœÝ!ËrÚ½¤0”V ¤f}e‘v»Kœå˜Ê¡Ùi0M&xžâÔé-†ý­V/(ËŠõ-†ÇÊ&Ë ¤ØJ³±¶Ier––¹··G<žb1AÀÒâVDQƒ²´èR#¥¤Ói±¸¸ˆòUiÈ’”ÃÃCZÍn³¯J†Ç"ßCºÊ‰‚ã²âäpŸ$že +½'‡# ƒ£,e1ÁÌ”¿f£E’¥xŽœŠeLÆG¦œÚ^çðà˜N§ƒÔ>E–"•ªíÜ®ÏÓßõ.¿þ&Ó£{\>9dp|Â÷ß_"3î3:ƒÛnðö]ã«ß¾ÊçÿîÍr7¤´NHÓº=š­x÷ÕxÇZÊ¢`bÓûiÜeYÖW~€R0¢2š¢((*Õ°Qß©ûžÇAçYý˜¾±šÊÂd’â:V”tQÊ!ŠB”TàJ´­hš[i.“Œ IDAT<·N®I'hk)µÅZ=û(Ë dYÝùݘ­MÔ7’,ŽP¥•­PJÖ½å'%®’4šÍ: Lk’¬V•µÖ!Èó9«Í ÃGJ{]V•Â`²þYÃJJ*SŸ?c4q³IU”$IBUU Ç#ôLµ—Öù@ÅÓX.¹ù›¿ÂkYI¥5£¯ý3~ï š«ÅsæÌ™3gΜ¿ð8®DyV‡Nw‰n·G«½@èuB¯Si„¤Ož—|ø©s Óœ4øÒÃ1§2¸HlQ6àx-„RX%ÆÒ^èR9‚ŽW[.åW1PA´¸ŽS¹8Úz+ëàTÓ):ϰºB¸ ×Q,.¯Íl ‚­Í3 VŠ¢`48a8àû>Ú丮K–åµ"©U@lkûçû鿺(‰¢ˆ,›Pd)E–!$I¤?Æ ÙØ:ƒ5µ‹‹Ëôz=F£I’ÔÖ2ãøø!,UU`l…ë{Hå`¥ BÂfx˜ª¶yNF#¦É”îB)`¡ÓB£‘ŽÃp0dïÞ= À÷}ÙØØ¨SŒ‡(j²³³ÃÁþËËË$ɘéxBže\¹r…n·ËóÏ?O«Ùdss™V»Váwîîsr˜òÎå÷°"fss‹$-8>>âðhw¯Ý ò=Ú Ü;ºMwÊ‹/¿…D²²ºÈÖ©m6·VY[[ãÚµk“¦)‹½¾ï“Äƃ!Ž’œ:½ç¨ÚöZj$ƒþWù$“‚,-кN|îv»„¡Ö®«îwî¦iŠ”žçáº.®ë2I“„4žPäÂjª²¾ÎI:eOQ~H²,¹¯‚c0³$î÷M!ÂZÏe4èÓêtÉË #üF7ðÑÖRèŠF³ÍÃ=Jž$ž Óm2ŽÈ6Ótˆçzã`J‹Ð–ŒûGLã„3=ÎÒö9« ÒxÎLTF)rGÒ\h‚§°RÑ[Z¥ÕY ª4¥©h·Û]۞ǥ%^dqt‰g=ŒÉ8#=ˆyúÙGøÿƒïå‰õL,ɲŒª*PõZ8yYpÔ?¡ßïsttD’$³*'ƒï:(ß”¯p<—BWô‡CFÓ ƒÑÑhÀh:¡?ê3žÔöêUéòÌg)öv¸~g‡ —À–RäØI­ô E\’yŠÞÊ Vº~“i<$ì¬"”BV†áðEd¡Bæ9YY’ç‚îr‡a’a«Gá„ù€I’⇠äȇtŒ #ÝÒV,m¬2l^bR‹ãz «¶±Å"Cž§e±•"IÆLâ^ÔÖX‡¢04[mdjY|Þ*Žâ)¢(™Æ'lž=‹rEZáGy–Òj5ˆã {ûû<õäw±w´Ãîþ.ö×ÁØ#šA§®ð‰ –O·ÈmI;ê",´º ŽïØd±»€N-ƒ$¦½°5öGDK 6N¯áø.ýá•ÕE\U[ÎÏ=¸Éõ«wY^^æÖÍ÷ˆ|‡¬PÜ;8&j´Èò<ñàS û!˜ ¦¬¯opxt€«$ãqŸ¥åý“!ÃÑ]¬Ö<óÔÓìÝ»ÇÚòIšó•/}™Í­u>þ™§iE!Æsøžïý$YVÔ=¿¦"R>£É„ÎJ›$‰)Š‚V§E–dŒŽÜ»{f»ÃÁñFƒÊâ$#l4º:Ï1øœÝ#Ë2?D9 Ív‡|?Ã*‡¼LëÄç ⨂1šÑÉ„0ô°hëP•9VÌú…­Fk5žRdYаµšŠ³Š"I©+<Ï#Ï ¼†­­â¾ƒë ƃÚÎø!…®peNÕhµ)0ŒÇSʼ Ù °‘$Ê–è¦Ù€(qm7hD>eY’ôY^^euã4«›[LúÇXG"•ƒë¨Y(—Âu[YŽò ®»€ãzXáPdÃ∕•SŒ§Ò4&ð¼z¯W C¶*ÉmÆñž¦Ùéò7?ÿ#¼òúu~éw¾Œï+0@‘QYÃÑtŠ­JZ­6‘x>nØÄ:rÖýìP–9¡¯¼ˆñpBžÄdYB©ë*'Œ%gÝÍÎý›^èãâ"¾ÂTe^+Ùy©‰ãOI:i»¶][ËIšÔ–mÇ©çY÷³ÕqéªDkƒcAÏ,øyžã»N]]UYÒÀÚÐñ‹|cb±çœÿô¯Ýà¿ø¯¾ÆÁïþoüå¿Å‡ÛNý²Í¯ÿÿÍÿðÍ)•±8¾åà¨ú<ÔŸá˜r—ßÿõoñVª1¸øªdZuiªœkÿÛßá?û•»TZ6ý×øâÿw„?ÇO´‡~ƒð3ÿŒ—ri.³æ§ô÷§žÄôÿð_úµ9sæÌ™3gο¹$IB®Ë™ú&ˆYRlNžOÇT¶×WøüO|7ÉpDÔ]à‘ÅŠþúã=d’¢Ã&ÑÒ6úäÇ1˜Éío`•ääd(l¡³>öäˆÑdHïÜ“xÞ""‘)—ÖB‹¬›*Íñ 8®‹˜îsý­7X~èAv¯ì B—v§MÔZ%j59ºu›¨×£L*вàÆÎ{L¦ ®jpj{Èo’P^+ÇHY2Iû êÏ¬È ü÷“ˆ Ê * ¨`08acy…4‰ñSVŒF<ÇCPwé^½v™8Kø®œííSüáóßdmyƒåÅ.aà³²¶À4±Ô\aïäˆÕs[(åD l‘pëÎ.Ž3§û¿Ù{ó ËÒ³¼ó÷}ç;ëÝo®µvUWwõªVKj-$ˆU€ ›‹™Áà<3†°#f"ìñØž á‡=D0ÄÀ`,ŒF B ¡ZBêV·º«ªkíªÌ¬Üó®gÿ–ùãÜ.P ŠÜá°ò‰ÈÈŒ8çž{óžsoœ÷{Ÿ÷÷Íæ 'œ¾ÿ"F[Œ³deÊO>ÉÍïpÄHéÓ HÓ”õÕ5¶6vŸÉhÌÙ³ç˜L3*]#<ØÛÛáܹ³Ü¸qƒV§ËÝ»wév»ìíí1Î, ./Q–%IÜa6-ñ=Ëí[·¹ùò-~àN®D×5e™sñüƒÜ¸q•ì÷Ù¸y‹••UÞüÆ7òüóφ×>ù87nÝ$ô#"å“Ng mÁÍë×™ÌR–WW¸sëeN:E(æã =þ »£çÏåðhB§ÝGÛ {‡cN¬-ãœcii‰ƒƒ´¶€&ÏSæQ;Ƙ c4³é)a–¦è*¥Î­¨…µUU hŠ-c Öh|ßGW5QÇ1Ó²BG…hÀó|Œ•ä…¦Õ 0ºjÜÖ²sw›'Ÿ|{»Û³CFãCv÷·yôáGxôÔI&“w^¾Á­[Ÿ§ø2 j…¾àènD¨Bœ/P„* nõýÖ†-œ±ø¾"ÏrvïnEQ“tÖ"âæÍK`+’@‘:oñ?øuE¤ÚEõ,·î\£Õéòš×>É׿ãu<~q}ô%>öìeJ¦øBÒ C )¨Š¡-ž³Ì´Aú ]5Ýdß÷ñ#‰ÑG‰ô òA R ¥`4áy>ež¨&v¬ÕéÇëÄZ‹Óbá’Èi'³¢®k´Öѵimðùïþï?ø$¿òéÿ’׿k%@ï~„÷ýaб]ÞõßýK~ü­fýü?u™WŒæKØ캣Ç7ÿäÏòw0µÃŸŒûµM´9Í÷ýÏ?Å÷^Tìü_ÿ=?ðÓ—ùý_ùc~è_Oot›­ÊbÝ~ø'‚ï<á´F†só‹o;î>ëXÇ:Ö±Žõå«ÙdLZ–Apï& ’’@YZ‘ä±Çåâ…³diN+n£õasÊÙR¤òñ:ëxÖrçå—ð{’Þ ÂT K¬óqž¢mbÊ ž b€© él]×$5¬®©ë¥šl×@ZînÜ¢Ô†ñÞ>i6gu¥ÇáîmÖN\¤*2 1¤vš+—/S”*Jè&Úí^“‹C%-Š|‚ðä¶PÖ dÊ’²¨‰¢„Éd‚ô”ò'x¾\ÄöTxžG‡eMà‡Ô:#IZô{ˤóŒ~oÈÞðF^üü3S“g3î»ÿaæ£ ín›"¯èV(Ë’•v—n·޵“÷>y™Sð¥Ex>R9Nœ>ÅdsŠ© íA‡²®ˆ’Siª¢9_º® ƒ°9§³9Ýn—²,ÙÞ=b¸4$ËkºQrëæËô†K Ëlïl±··GYlSæçÏÞÏK×®qá„|îóϳ¼¼L’Dì±»{ÀC<Äòò»lm}”¢( †llÜ&P>E𡔢2š,ËèõÄqLUjò4£ßrppÄòrŸSgïg––h+¸rå*í~ß—t:¬ô8<<ÄSK„aH¿ß§*5Z8Zí˜ÃÝŠôágyüÉGùŽo~ßû]_ÁãOœáúé_¤2JzøÒCy>BZŠ"£Û‰^ce6ΑUUF &ËšÂÙ“(ÙüÎ „”X “lŽ’²®‰[­&ÆM6sÑZ7ö|!b|¯ÉPÒ[ÀÞjʺBàQKïI|¶¶¦j,ÖJPêš²¬@™Mð” Ã…}ÜoγhXSA „Bk§<꺡ðû¾wÏÖÿ PÎhç5QfB4£¸’\§´; yV"¥º—! X¶Ó<ŸçI”xž@-:ò®ÖH!ˆŸ×WK¯Z]Ýù]>ð²ÅúoàÛß´„Šû|ã×®ñ›¿²Í³ïÿ$;ïx§}Aµw•»ÎáâÇy÷ë— ”$Œý/<Ö—°ÏŸ–O*üŠëÏó²q86ø7ÿí{y_“ÞØ¿÷np K'ÞÈW¬ÿ*¿~÷&?ó7€¼í[ø®÷~'o?þŸ³íXÇ:Ö±Žu¬c}ùÊiÝЩ}剦»äÒIV§8{ß*“éôûŸäÑ'Îñ–'‡lYº‹ç””òI(ŽŽ8ù¦¯ÅÓWÌÉLC0lÇé6¨ˆîà42YÁ—ºœ$§H¤Àf¤£DÒE‹V²õùOQÔ%~•ýKÏ3÷b–’µ“T¢˜¦t<ŸZZìø£ƒ1Ý¥UÂv›S'NÐi÷ùô3Ÿâ¹û1,S  áY¬m€MÎ ºK}Æ£:GGcP~Ôe9TÌÓYCäMXZ°»·O+‰ ¢AÒ¡Ö<Ç7´ܾuv»ÍíÍ›¤Ùˆ`s‹Á ”>ÝvÂîökKC~òŸÿ_õö¯FøŠÜVì¿|™ÍÃÞúu߯áÝÛ,¯Ÿc²q‡íÍmÚƒ6í^mJFÛ#’……|:™qæô òlFé!`-¦¶H©¸xñA®ß¼IžööyðÁ‹œ8q‚;wî0°ÖÒíôÅ™3gøÀ>È»Þõ.®_¿Ž¬ÕììlrñâE¶¶ï’e\|·6XYYÂF!ÃჃCž°³¿×ÐÚÅ„ôØØØ@JÉÚúIÒù-¥6\¿q“élÂSoz#ýa›v/æúå«, —ñA¯O BŽÊ'/5íX¡Â†x|ÿ¹s\yþsØÈkfR¥lf\…c>Ÿã’º.iwZLÆR‚" P’2Ÿ4ôä(¡ ÉóœN§ÓÌÖ–9q§‡¢VBQ„J l…r’H:¤WçìlmÐI|†Ã.ÎÝÇí—o2írwçREœX?Ë›ßþ ¤Ù„»w1¶$ üÆòŒ$QWa‘¸Ú0Ù?¢µ2äüýçØ¢¬ñL€Ž( ÈçGÔÎR; èDef³UÝjíżt€diYpñч¹tm«Bþ×_ù0ûs’–âGà½üÆoüŸ¾öilQ#„Bù!qPÚšZ< <îuM­6ø²™A—¾\šÀSxAˆ4P±z‘»œzTZÓjµXZ6óÂÒb°÷(èÓù½(Šsø¾OǤiI+ˆÈgSœkαçy8]-òk<Ù€àjS‘f%žž"ˆü8Zd.{#0¦Fëæ9fóUYÝ#¿ Ñ_/bu]£ÀšÛÔ(é!•O;éày”µ½×]×Zÿ©¿+‚ #Ê<ÌZ‹kÌÿbþ W©€.x郿ǎu`>Ëÿø½ßÆ?œ5Íõ~ý·ø½Ío௞ˆ¦“«5µý³ö¥ìóÅduAcöò–o|§"q¯sìu^ÃÀHÿ~è_üsÎüÒ/ñ«¿ý W?öËü“?Í÷ü/?É÷?øçm‹‘ÇmècëXÇ:Ö±¾,µÐ5j1cxïf8(ª”~ü ”G¯ó5oyU1ÆVL‘SI)d!Uˆ¬“”ÅŠŒÞÚ9¤ï1ßßÄZÃ5„âû’¢¨0Z6°Ï–†Îò:FX+ÈF{ÓRÝ Ç瞎'ßù­X%hõôâ«`÷hĹ³ð™?"jwè/ ^chµZ´’n³( %Æà |вÂ÷}F“‚(?h Fé pHOá¬âü}÷QÕ3ê² Cü0Bkƒ³Žé´¢ÝÛçÎÆu.^xœýÃMVVNòòˬ®®2,¡…fØë1N(kËò%Â@±vrYV²¾¾Ìg>ðû¸NŸÈÁÖí[ –NÓc@á·}&ÓNcíM¢„²HX×|ÎÞÞE•cœ C>ýGŒ |Â$&ˆcò|ÊO¾–«W®R”§NŸdsó.÷Ÿ«W¯òØk^Ë3Ï|ޝûºwóüóÏS×%“ÃN¬­Òé´‹®5Â:œ³ÔyÆ™¯áòõ+$­ÓIJm Ú¬uìFEQpéÒe.^¼Hžçܹ}›þ`Àt6Ã<žzêõ<ûܳ\¿z^+áÂ#÷1ÆX,‰ßDÍf3⤋'šâ©*+X8­8$Ëæ dL¨\­)j£‰D‚’^cµ­k¤/ÑxÒ1›Mè)E]W(ÑI¾§0U3óê…>Æi¢8f+MYê6à'xŒ]€çÊŠÃÉœ^'FëšVÒgei@YæL÷÷xv>æâÅ‹œ9s»»[Ìg3’$!Šã&-/é´» ¬K)ÚIÂd2bu­Mû„QÄd:ÂX‰g5a ð…¡®rÊÒ‘’î OQO±®F× I2 5—ž¿ÆöG>Ïù‡ãw>ú®ß¾ƒ†£É.ÿîb}}êz¥MEYå”yÊx:Æ8ðý°éÌb´®‰@;‹ÄóšbÚ1ç(ñ¬t ÎP–ž'›è¨ª)^5 àV#cûtžgÍØð¢ÀL¢+h²¹4pçº÷+ÝâétNTUqÏ–ïM÷Ø–Ž8ŽAY–ØZ#„¸gõ–Rþ L)Ü–íû>Ö¹…ûÄa´C©k+¼Å¬ºsŽ_Lá꣜ä\cN¶öU|÷_z˜žç¨GÛŒâ¬ùêSyoùáÌ7ýÕù™¿óø·Û7ùè§wùžsK̿ضÏñêŽu¬cëXÇ:Ö*2ÎÞë¾XÛPpëº&ŽC²:Eú’Úi.gî;‹ó=„ð°ÚQ•­V‹0hcpÔÆ`lAUø"B}ovRùÐtÙ<ÊóQ´ânCzNSÚíE‘c`i¸Ìþþ….8yâA^xáYü@‚µø> Klï‡ KiIÐ ‰T@á9V{C>þÁÑíu‘ž‡Rë'VƒÓ†ùxL:1Q´6„ÝøL'#²¬Æ9îÍjåSΞ=ô%ÔjÁ›ÞôfæEF…,/­rx8˜N&¼éÍO1èy饴â6ŸùÔ§iu{<ý©O7yÛUÉÃ<ÈæÖ’Øgkk‹Óë§öÜÝÚ`2³yë6éxJUjƒ·îÜ&ˆBŽF£¦ˆÑšÑdÂÊò2»»»,--1±´4 ÓmSf9›››¬­¬±½½Ít<%hy,wûdóœ¼.hŸ8µ˜‹Ìçs –$I¸9›¢`5TðJGHˆ…UW)¬¼(èu›B°YEפ(å!±H)ùÑ–`Ñ57Æà-® !4ý~ŸÙäî©Sì<$Œªª"‰Ûdùœ0lÈàû{ÌÆ«tÚ‡G{diÁáî]¾ò_Ç©“§™fdÙœ2Ÿ3Ê2Ò:Tc=A>ã<Åt:¥ÝéÒîu ÃÃÃC¨³à\N8œ˜Í·˜—>«+g0êªÉöÛ1ßú-ïâ`ÿˆƒé”ïûž÷ðëÿþcìm3X^fs¶ÅíÙ†A‡y1FzOùxB‚òP€- ŒÑáÂxPÖÒÌ U„R¾Š-Gi¡×îàKn»Õä«{ÚA¥+vö1º±J+ßk溽 ‰ºrc4w/79 Bʲ$Ž#„h …Ö9„°X$F×XÛd×W‹Yíª®é ü0BøÍÂ`UxBà°äiŽ1¦ÉÑΛ":ð#Ô‚šmŒ¡^t‘•ßÔÖ€À#Ͳ†¯|Ì•ë×X]ZåÎÛ¬¬À“]WüÊûƒoù¦o Š"îÜz™s§ÎðÙç?Ç“?Îùûïccg“³çÎs43‘§ööSæó´éèzÒ³ÌSŸ"¯XÍÝ­Mœ”,­¬qõòUZ­V3#†˜Z’æAÒ‹†Ü=ØCM}.¤å4¦nrœ«ˆ…Ñ%®öɳŠv¯Ëê™sÃe‘¦“#VWÖ¸qãI éµC¬®xë[߯öæE–’³§F ÖšžyëJ÷é´¬¯Ÿ¢ã¸ºbR‚¨$Œc†ëkxÝ.ùtŽ-kt]a¥ ³§ˆ£%}‚@¡MõÆjÊJ#=0µfžÕÈ™¤×]Âó<º­6 A¥ë¦ØtŽ4Ï‘|é‘Ú´Éy"²ºl¢à¬Á8‡Õ \[‹Óš47 ;å5ùÚ8¬Ó Éd2Á9G’$hS!ÖáKÊh¢0ÄS kš…ÆÉ|‚Ö)ÚiÊ¢d2™PUÝV›N»Ýt®¡(KÒÙ€8Ž)Ë’ù|NÄøÊ£×íñjR¸ÿ㣣í„gë³äÎ!{7oZP ”ºçÅ<øõogE}‚\ÉptxíßøüÔõ.=ÑE–)™ăӼö èz!¾„}¾ØëÞð·þ%?õƒïâñS=ºð™Ï §ÛŒwCX¶(÷9šäDƒúýU‚(H€³D¡GZ”8#¬£GÌÓ AžN8ÚÝ`óÆMKæ¸)Kvo\&Ïfø.­Œò©`u¸Ì O?MœÄô–‡dé”8ðã„VÒjâª0ÌæSTà“ÎçÌÓ A•Æy8Ñ@·ÒtÞØu‘€l,Áyž#•"Š"¬”jlºiF˜´H:mœ®™Ï§äyе–0ò‰“¦“V%ÓéŒá` m½þIÒCú7®_g÷î6§OŸ%Ë2<%°®¤Êf¨VÌpi !‡¾OYVM'UZ­žò˜ÏgÜÞØ`ii‰t>Ç‹NžÓÉéháRIŒ8« VhéÓ^Y£Õ[Á¹¤@1ÝþÖ”/)ÓŒ2ÍRµtPåø¶Æs†O|ü~îç“~èyï÷~÷¿þ;$ý€NØÇWÊ@È{öhçšÅ9Gà5yÇ ñÚC*…ò”/ÁiÒüˆíà vŽvØís8: Íf8]£„D`1µ^Æ[WÔºl2–M…15M5Ö} 9—Îaœ¥¶Mn7R1/J¤R i:g‡Ã=F‡Œ§Sòs“×¼ùqÞpaNħ߂ð,¢¨™o"­‡k­vzÈ:§ÊÇ|/ ›îãŽ(鲿ya!›qpíµI ÞiÚk†§bíäïÿ×?Éëßùv’NŸý+×xþÅÏqáñ'ñ‚£ƒMæ³ ÖIŠr†ðBΜ9ÇþÁ]NŸ}„¼s¸7Âèœb2ÍÑ@R׆'N0Ÿm#\sc$mÆ“9=vŽl2çÚK7¬Ÿáü}çØÝ¼IšÏÉ£ß"…£•tÉò”,¯ØÚÚàÜùGÈŠœ7¾õ8{úþ­÷óÀ÷óò-‚ à±×?Fø z}„¯8uî~ú'þ O=õ$÷?õ.±?Óéô8::¢Ûí7yÅUE¤|¶66é\£×î0Xppw‡~{€Hêªà·ßÿ1ööxü‰GÙÙÚçúÍëÜß9666ÙÛß'ˆš"å`t„ÖšÙ¼é˜UU…P 58Žc„pTeA«Ýæ5áÒ¥K!Íæxß’\GÒuÑtù°8ëSë©8I÷1Úa1œ?ÿ EYÓ]Y&Š"–––èõz,- 9{ßI®]y‰2s¤Å”åµ%|ßg>‘´B–}n|êiv®ÄV%y™3 Bpãêó8[ÑJBúñ? ßïSf9J)ŠÅvk›®¯3mêÉ4°'Ó4ŒB_¢=KQ ÷‰“6ó"ÅbY‘kdYÆÁÞ6·o±¾¾ŽçÚ2iFÊò}¼6P Ô® b´µD˜lŒBÊæ¸Èr„O5qMq-f`S’¤Û=ÊCú Ïk(ÙQ¢kGUU̧3Z6Ýn—ÑÑV‚q­^ŸõµÓ¤³ ueÀX¼ `|0fè øª·¿“ßý¿ÿ™.ÉŠ9íNDÿY檢µ¼ÌêÒ2G:çúÕKìyôѧØÜºßnÓnµñ¼6íÖóùœºª|­í]â8Áa¨Š‚8uci×UIDÌg9Q” spN BI>›Q•9•.)Š’ZÆã#ª²@HÇ•«/±¶z’v»EQætûvwwÙ۸ͥ+Ÿåõ¯{ {‡{N¬-‘NÇTÅŒëW¯rú¡‡Ñ“ 'OžÄ ª"¥ßëàÙ‚[œüA²ñ”bžòÂçžã̉3̧sŠÑ„ùdư×ç`´G÷ô£ƒCv¶›ŒZixèâ£lÜþ›››Ü¾}/ ØŸŽ¨ohZaDšgTU…’€”EôÂ4©‰ÜæÓQ0‘$Ió>”)R8Ìb  ¬›¸ž¼*ëª)ñ}Ú òÊ…BYr0>ŸMyËÉ·—U“×m ì!._ºA¨b´›qjõ,Ï]¾Ì}gNcÒ>ŠÙÑœyš#•Çl<¥ÓnQ”Ú*ðBü@Qdc,a ˆÂÀ0U'¾RH!8ßy6nߤÓé0O3*]Q–N@Ä¡"jEå@×ÌFG´Z-†Ãe´Ö([Å ˆ€V{™N¯EЊ¨+G¯×G…Šƒ£ïùËím^|öø¾Å™ÆÆÜJ‚áív›N«Ý¼ÏÂÆ*l!ö麒)pR2ž9‰/"À Ú$R5p´¨)ãÎIl:ÇúÐò[ììòÙ– ä¡ÇÛ„6¹6|Ç7}í»¿ƒú‘ÆÍb“*ËP^³À ]úJâ`A8ò§¬+’$!‰â{E²Rj±¸´èN;w/×YkºÆG‚׀ªª½ˆÃáIŠ¢@JIQ–MþpD†ügGá>Ö±Žu¬cëXÇúÏ]'VO`ŒÅ R eÓa©ë'y­‰”O' xê‰GOFDý%^÷ÄëøÐÇÿ€á°Ï#>„®Æ`R¬TÔe†³Š~ÿ<‡ò2”Š)ç)BK|ü$BE.bªÀRÛ ?–$Ò#bò"g|{á Ô ÅúÙ‡±X‚î[—.³¹{›ö`•^wHUÍéÛˆ’Ї{KýaiЇøh9æÙ?~šélÆÉsg8ÚºÍÖÁ>çOŸF)AVhýVhÚaL:‘9H/%Q3ÏIÂ6s;á@”Õ~¼BYœ=y†t:eÐêøŠÙ¼Ä°°tVs6¶®2ì®p°w—V&ÚȦ;ê ãÙˆ³µÇx:&ì ±e†®2¤òˆ”ÏÚê óiJQf˜ºæüùûØÛ=Bc1¶&Š|&ã)"xµ%­ ç.œâðpŸÍmªftpÄl>¦¯ú¬–iuböwóÅÖ³‹n³Ešçy ›âØ÷°”©5xP™Šy–6¶XOဪ®Qa€® MÑé„GU:„’ÍŒ©-iÅ]B?¢,sö&7™M+–VNÒ_I¸»?ÁŠŠÉl‡ç_¼ÁwÏEŠIΞÀrÇGëŠÜÄÝéx‰$-+„T8i¨µC6­ ¼6ªª cjJªª¤ã5vâ³÷=Ì,*'E…’"Ÿ A&Tv†R]•„q«ùéæ½ét:L&#F£1ÝÎ:"ò‰£ˆ|–!„ÏähÄÚú*//­3Ý?$‘5ºžSV’¨jQg´Z]Ê¢¢ÖŠÒhzƒíN›°• Eúa`ëšÌç,-¨”jèáN ­Ã(Iá,×/Ýå«ßö½á4ÿþSÏñsÿúßpúäƒño뛉Á?üoþ&¿öÛ¿Åg^¼BáNHM7]I‰N íAS„ªEçX6±L^à’0ôqN`k½˜=6ø­˜^«ïhgÉË‚¼Ê¡vã0ºF)EPù„‘Ã`l_H+EU#„# #FÚP×5=Ï#Ž;͵ÄȺÆùKµ©‹?ð°VS G©‹†Ðï œÏdî?jìêN×å¥Ò¥ˆ¢ð^¤Vå%¤ï&KZJÙŒ/(k ÖŠt‚c„N€g-R[Ô>e­ý‚Nõ«¡ãúXÇ:Ö±Žu¬cë/@­N‡ùtFQU8qœ4`á‘Ä!íVDà)º„—ooq°¿ÇùóçøÙÿý—yýkÎóÈ…3D¾E›i¬K)ðè,Åy§+’0"e€‡Š-e±ßfœŽi·ÛLަ„aåj¶î¼Lšg¸:GëŒvwAÏÓhcÉÓ9“»¬¯¡=Ò?qšrvÈt:eeù4½Þ<«)ê’yV0ì´É3Ãd¾.¢“,ñÙ;¿ÃÎÎ!\xˆºjâlªªÄ„–&Zg–—MÇÒYòªÄZ‡x¸¹¦(s|O`­¹G¶ ÃgŸù4RzdY†EÇ1E–2ñu]1XY£ûÌçS†ÎǤTà$iš¢µ&ç Ú (ÙdÙ MYf,>4s•ë'O°³}€'dc/žÍØ™ïFª±­zG“9»Ûûtº.]ºBúììì’ç9išráþÙØ¼Öi‘øΔ q^Jâ0X½ O&ÄqŒ[ÌŽÛĽ[ºgIµ¥ºaüÈÆK³0SÕ’v+Ɖ˜Ù ž~úƒ6_ñú¯!R‚i–sze£ýVC^xá ÓtŠl,µ—)u‰œ£È3„ -}:¦«#Zƒ§5qÜÂàˆÃã,þâ·±O ´­Æ£¿²Lé,fÞð‚Â0 Ž[äEJ BlžÓju˜M Q¢T€sM¶pšjp‚8Ið}£kª²D´[øRe“Ƀ᫾â+yñ…Ïs÷ÎUò|Š5ådŠ«5ÆÐîô+¨$!ÚLç3fÓ +ëëå²F©€ R2è¶©Ë&wØ— Ã·Žµþù€á³Ÿù gï;Ï·}ûwÒ^9Í'ÿøS|ø™-þÏü_ñÁOñš‡îçmßø6~èG”ò§†Ë×®1žÎ}…ïI,‚`ôRˆf„Á[ð \ÙòeË TSHך,`¨« k„S„q„çKDÑthòŵ­ÉŠaž'“žú!¹®C¹È€®iÅmlh‰ãßq4ã…ç!\15Zk¼0ÀI (qQ‹/yž£|:+¨ŠcÊÆöï9<åÐQBžçø~p/zžæÍÜt°µ ØŽP!¤Ó ãÑ!žu´â5XÁC”­ñ¬Az´"Ä«ëà>. u¬cëXÇ:Ö±þ"d\Sü !˜Îç¥A@„T…&µÆuMQ,³~rÖÒ7nÜäâÃgyë[¡zíHuIeS°ËZÿEaÊBUq´wO8ª¢¥ðÀíÛ WNR¦9*H0Ù{›7©9¬4uáˆÖOqî+ŸâÄÒ ‡Ë«|â~h}È`å³ÙŒ¾•ŒîÜæÒ•kœ¾ÿ ºeöÓm†K«Üÿƒloß¡.¤×_F×5Y™Ñn÷››mçPžG†ÌÒ9aÜÁè’8 ”E{>8ËdzÄúúIžyæÓ¨@P•´Z”Æ ¤¥6†ñø€^wH]×”J‘ yx4q¢^g6¯‘Öçöí[( ûÛ»œ< S–”¾Fù“"G‘3^ûš'¸zõ*½v·ª™Œgt;->÷ìó|Ç_ú._¹B?éð‰|’§^÷ž~úi‚ BŠ€ rvå,½N—[·n1Ä¡òqVSU¶°àIJSãû>uÝP‹= U]PUžçáû>Ò£†UŽºªp²)¤…`-ÆIŒµ8a‘4]‰`>Ÿ²´´†,ë«'¹téùÃßæÚõùö÷|/u§M…xž¡Î-ëk=¦ã#^:œqæôIÆã±ò©ó)^RÍæ˜j´8$Wƒ'Âf@¼1ÙZKÇäé„"ŸÓê´¨LÅ…Gc>qû¥+”YFÇT•Æ9K˜4p»8ŽJûlF¿+©mM·×äYKZŒЦ‹/= $á0 ½a¥vöFœ}àaÎ^xˆí—ɧGÔU†vWŒ÷wíî&¼n— \Ä8K§ßEAQ”lo!=ŸV¯×Xœ3D(¥“¨‘Íg8çö—¶[TeÊZ»Ïw½íQBaxæÅ$IÆA~ÄÇŸ+ø½Ïÿ1…¯$JH–{=$ (L†‹Ll¯ùvCÌl BP”y3oîû¾ò<üÀ'‚†’nj¬µL³—Î)ö*Übÿ,Íȱàý•kgžgŒñHdࣼ ü˜(ˆé´|¯™mžgR*j]¢Â¡Kœi"­ªª GÄžG¿•`¥GUjBßoâ¯Â˜²®°V#…#T¾ ±Îa̳fqËhCm4ùÑœª.(Š«kZaDg0¤6…Τ$×]—XçþöÞ4Ʋô>ïû½ï{ö»×ÞKõ2KÏôlŠäE‘¢–€Ù’c’£X$#V(Q˲ N/HäQ; eA‘,p¢Í–¬àX"Å]³ö,===½UU×vë®g—|8wzCŠ¿PļPèF×NUßsÎ=Ïÿÿ,L³]×Dí„@„hm˜Íf¼úO¿Æj‰%–Xb‰%–Xâžï†!QÑN’Æû—$Ä$‘Â9C§ß!é$”‹-õ×·yÿ»/á{PZA)4n6DÎGtÚ=ŠZá·BòÙ„lv‚¢Æé%kœÎ™ŒGœ:»®N ¢^Äl|D„TiN(%AœðÄ?Ä Ûåàö-|?äð¥WqݘsÙ½sëí(â寰ºuލP–%wnrîÂ%擌½»opîü6ÆÀÞÝ:ƒ5¬.QžÃØŠ¢(Í& ?ð Î`LC­µ÷‚¤¬dERamSÃcŒ%iu{TµÁP^@·ÛEWe³ ó=NÆCºÎ †£cŠ¢@HÎCJ²(èt»DQD]×dYF6Xív›µµ56×·FTUÅh4bëÔ)œs”•fûüE¦³FŠ|wg—ùtÂt:åsŸÿ,kkkŒ&c^¿v•ÀóÙÙÙáàà.gOŸÁTuSå´ ABˆ&‹FŠ«uóU–e´E#ã®ËŠª(ÑEÑô|»æ{¹{ëoÊT…sML”ÕÔº ÌóF†Ûà{ çÎ]ÀÔ5óÙ„“ã#ò8@—sþòŸý ÿÉý»|ðáGg)¹,ˆüU¢¸…'} ð}„sD~@섞çygy³&H)uo3›W%Ó,e:›‘)“ùŒR× šŠ¼²,›ëgqž8çH¢ˆ$ŒýO*LUSd)eU ­E ‡ç+âÀGùBIÂ8"LZxq¢©© ¥<|åûqó塚´ó0Â"ÉŠ”»ûûܽ»KšgUÉ4S”š¢®0>aÜ&Šc’$i†a“æ¾ïú>ž/ÉÚq#”e¹8ç5e]QUZ×(áš×Æ1žçùM×toßžåz‰%–Xb‰%–Xâ«‚étB/j!Äqˆ |¤”tãžçSe)”´±|ëS²ºÒ£ÛRx8\9"›’w¨”díôy2<$–j<¢.‡8#œ¡69'ÇÝ­-î¿øeí„`&#t•3½{@Uäìðè“OÑ =®q^À•§ÿ5áj‡w¾ÿ¼þìWè·ûœøqf£|âÝìïÓmGÜÞ»IEœ>³Íç?ûivn^åîÉ>|šÉð6¯\{ñ¬äÜféx¦&ÏSº=´ÕH4/ÉDCxò,CH‡û¯E©koÝâ¾ ²²²Åwn’¦¤'¸{8d2ËñÃyV1ŸM1VS;Çl–2NÈËŠZ;^ý5οÄ;»TeE·HÓ)Gén!Œ IDATCÁÊú ¶ªñ:>ÓÑ Âpµæðø•UœqììóÄ;ŸäÅ+W8ù5w÷ö8sz‹O~å%ºü0Ÿ|ú÷Hâ6qòÒÕç8µ¾Æ•+W8sæ,¾ ЕaÐY¥X9çЕÁºšÜš†4ƒò}²,EäÏ—éaœÁÔÙ8rqΡTCø=Ï[Ô©¦SX8„QS熩uH_’$+œ>s‘vg@>±½uš$h™Z­§NŸe˜—¼ôÚ ÖÖ×8~ö@½¶Ã£Ï2>¹M"+Æùí4¡—`C(®k$>¾jAE™c4H¡0N'ótJ? (ç'x~Ì™‹ç¹ôÈ#ììÞbÿö-ú½>E>'Ϧ Ú]ƒUöîìщ[äóŒ(ŠHÓ”n·Ëý<ÀhxÄÉð„¤àû>ãñ ½^ß÷QÒ' “&8«®è¶èvÖpÎpx´K‡xžGÒjMU»Co0hR¦Ó)ózŽðIÜF)EšåøB¢]Fþ´”¸LcªmÆ”ùgk a2KYÛ8ÃÊö“ä¥Aøy‘ã |’áÕÖ”\¼ôk÷?„ÑU>¢ª-ùdÂÚöiDw…ÃÛ7¹óú+„ëçÙ–ºª(r™O‰©3¶Ï<À³Ï>³èÁµQ„6Ããfóœ¤-¹ÿþÀj‚ `–Xëµ9ÍFM*5'›®Wc £ñ”²¬1Ì¢îÉYGš¦8ó4_„ 5EžÓj% üˆªÈîÉ·ó<§iƒrTºÄRÓ$/[¤³÷¤·Î9œ÷6÷à°„jþM*s–¼J‘ÓBD$­v»KUæøa@á*éÐnîÞa­šÁÊ:púÜ6fZ2;r2žPk‹¤ÆP/<¸! j]QëšN¿GQÎîuþuIG@ÆÔ®º'ñ5‚ô\b­ãÜù‹¼òâ ìïÞåþû·q¶¢,K„ŠY_ß`x°Ûlš=Ȫ¿*‘Œ©‰¢€<Ïéõ»h]Óív9>>¤Óé°¹Ñ#+ B_µ**ª@ƒ5 ÖVìã IG(‚0B!0eÍøxHùÄqL˜ÄÈ D’ë›}Ô"éÙ ¤ïá¬h¤ö6'Ÿ×âÏŸáùW6øÕßø,Ó_ý$ïïÿ—|ìÏ7ÃYÊ瞉ãáè^—qV4CéI]W¾§(œ¥®+)‰£­›s¼ÐÆÊ2`¥Ó'ô}”RdEæó%QÔHÎ+@Dm A#=E^H+Ã-퉓ä^¿rè5ÕXN ¬u÷ÎÕ2ø~s¥Y€°‚$Œ±~SIмkÀ÷ˆ|SkøzøB6CÄ›­}Ÿjáí3+"c„1€À ‡DS×Mx^ExÊÇ,ú¥µÖ,J@Qdo«„{I —øš¢®+þðóÿšñx„{[Oý%–Xb‰¯Îm_à›ž|g«%¾> \Á¼˜£”G6Ÿá©­5ë+ZQ—~ètz‚Я¡ÔhçQ–3BÏpxû†ö™©­¢.¢ž€™QWS¤žSÒÑ]Òé„GÞóÝ”³å4Ú4[®|¼ËÉÛ”I›èì\|àAÒ´" cÒƒ[£1"B{«­ˆ?û<ž«¸ïñw²¹¹É—žù óÉ!*ê‘ÍS’öúýFùŒ|>ÇxV/p°w“ƒÑŒª2lÖéúÓjÊñ$Ã÷ò"¥•ôÑhü@ r‰_9ŠÜÑ_ñ9xõˆ^'Äh'=üÈljšÚÔºCU+ a1h›#½65«eYâ{1Y6úŠV«ÃhtÂùímJmÃù4¥Ý顨=A,£Ùˆ 8Ej*ò¼àîÉ?‰HÂ/†û.\âîÁÖ¶¶¸³óO=õum¸}°Çî­ÛœZ;ż̩Ê9¡òJâyà{ÐŽÚdUFUgx¾OžUDIDQ(%0µç°Ê q¸º‘¨*! XgRàþbã¬C>E]à ‰ïHNQƒ1ª©I"@×s†'·X[_A ωz´âUTíáœAãØ²vn…¸ÓâÒ…û1…f'ºA}t QUBÑTW5‰Ë£-R(°5T84N<ßQ×5Ê÷Ð¥Á9Až—´ü€< ŸÂ®*þ½¿ø£|æÓ@9;¡ÅÔºÀ¤ZQ œLr.t{„*Ã^¤šp²Zø>ébCÝJæó)ãÉ~ Œ‘xHáµ}DšáG6ˆè´ûœ°·óFTtã¾ò988¢ÝéÑîölnÒ¬Ñï¯Q»ŠÒ–xžO¤B„“íp†1Ƽ0ÀZCžQÊñ|ü£|ô»?̧?û ÿÙ_ÿ9>ô-ïáÂꀞŠêCj»‚ÉS¤0ha±Æ!='ÚxRá#ˆâAárä¤c„ÅSt•Q•%õâ\Ñ”E†£NkT,ü! ‡G$*AµÖD~ˆN9r[7p¢©H«ëšÒj°Ž|ž’Ä1€`2š2IS´µøRa*M <„ô‘X‚H’´=м$ˆB"¯éý®ë_ùM:ø" O[C %ÆÔ /½Ñk-a°ë{Ðïtç)]Õ$•%ÐYE¦¶u3d²î-+Dà¿­÷ú%^âkŠÏ}ñ3t:=¾å›¿íký£,±Ä_÷h†tîOœÕýñßxëõ_½!ß~á3\yùy{äKýu„›·n`ëæA1nµIº å{œ[[åÒ§xé¹—xõêuÞûoâñËgÐéœôä(N=üA’¸Óx)p&etç:µ.ðC¤³I½»GröAÞý®‡˜LRâÄCØæ3f{7Éçc¢õÓ\ºÿ1ÒjÎx2buÐcçÆD0`cp†úÆ5Z=ÉÍ/ý!‡³ç.¿5òܯÿ*Ry+}î;ÿ0ã»ûlÝ&M§˜ì„éèˆ$ˆ¨Š’ý£¬±â‰Ç.HÁí7n1ž¤l®ob­eÐëSUü "-ºª˜Ïçô[ÜÝÙe{{ikpŽÝ½ÛtZ>~Т¬Î55;¡!„¢Û]!—DaÂd:¤Õj’ápH„d“ çàµ×_çüùsÜÞ½Éê`ƒƒî»x´È‘ÖðÐÆ1Éft; ww÷Ø> ’ìÜqáBŸ~µÉïþ«§yê=O¢KÃgÿàs¼ðì‹ìÎyÇ;ÞÃ/™“CN­là*³2Xe6›3Xpt|Ìxr²Ø•ÍöØijÛT[)«08ô›‰ÛÆ4KÆÜëÇm¶öM2qž7IÅ J¡kƒ©+  «„À’"kê‘^x6ems‹­S÷cGŽ/<óy>þç~¹ÉH‚—^~Í­UV,–Q:fZO¹´}–£—PÒÐJ^àaMÍ|>åÍ[TUM˜” ©ÁÒü¬Új|ÏC×xLÇ3‚0!H,£y†/àúkר¸p–Ë|ŸüÝßÁŒYY â ‘éöI’„V+¡È§´Û-öÇ'ÔuI­eéE ½n—8Š(‹ z>¤3(©\›ªv¬ V¨Ã”· ü­sçÉÇc¦£!RY.om%J*ÂVŸºÊ¹»ÿ:ÚB·¿F…Áe›­l÷ˆ¢^èa¬Æ8G’´ð”àÎñˆ*+ùÐ;ãàö¾ò¥Ïñs¯¼ˆª-g·7)Ëœ"ÏI„ Ò" ›”ë¬'‰¢„(Œ‘¾×(7]7$;ðCLéaË’£ÃÛ8 RIô›AtJQC%<†“#|/¤×_%"ú½UZ­.Î6 å{'PÒÃÔYYPÚFÕ!¬£°©@ ŽÀSL§S”ô)ª[œ œ$ C|ß' „…õÁ RJ:ÒSÔesž õÂÿïû>µÖ¤éŒÙtN­5Î ‚0ÆJž@†;w÷i©‡Úàiq¦4TuFQÔU…¶%Ež“féÿÛ‡ûWK½Ä׳ٔ¼ïCH¹Ì³[b‰%¾qðäïâÊKÏ}­Œ%¾Êh¥oQ¿¨ª±Dʧ–ŽÞØa¾sÄGÿìGxô‘3Ln\ÇIEgã,A§ÓBk±—eètBØAKâ8b|ý6EžqúüC̳ŠX† |BO°{çUêbÎÊéûñâ…m*œÂ0aç—±UMµÇáþGû»”ù³áO¼÷›9½½Íî+¯àÅÖó9› Xl *CQ756u6Å÷ÚF ñ€².h'ý&MØÖÔuÍÚj“ŽÝŠªª"éÇÔE#íuyF€e4qêÔž/©§o°„°Øø[.¿Râ0"ð¡QÔ%yž±¶Ú!Ë œç‚Åk5išrxxH‡8çÈó‚<+èzéœ0ñÛ—$q‡µµ ZILQÞ÷ÍsçÖ gÏnóÌ=O«Õáè`~öG”^+âcßó½$~eÉd<£“ôHç5Ÿà¨é÷·89ÙCëŠñxL«Õbcc ß÷Ñe‰u›§ žsTÙ ¬!n ¬«Ù?ñ®§ÞÍÜXvŽŽˆ•âhzBíj´1T^ˆò[TÕ‹£(*|?"°UUÑ(å#¥j䨄8]¡d£Ì¨êœÚÖ§ÁŠ&Ý_D ©»s–ª.Çôû+hm¨Šæ:²NckG‡ Ò:BÏ6þlëp²ñëJ#”Á-Î+ZX¥D·™YCžç”¦Ñø–•mBÀœ6DIø–g_Iâ0c¢jªÊò‚º®ÐMo;,” tã4ZWŒÒ)qãN)„Pxž`ž6²îÙlJYæÍ}Óé·õ^¿$ÐK|M!D ±ÜÀ,±ÄßHPJ-‡_‡ðÚ ¾£ITÎr*O3žMè´Û|ì;?ÀÚ‡yZs÷Æ‚V“ÏÍ [y1ÁU«§u‰ÖÕd†ò=Fé˜þ}÷qöÔ9æÇGx2F Bôðˆ;»wX?vpFBUQä)ƒ^‡ã£=ÌÇ·ü¹æ¥g¾Èæö9L6#Ž||áÑëõxãÙW0ÒRך^gÀc—Ÿ" $YÙ<¨—EãQÏçt;«hm°ÒC(MTÚ!eEQ¦(¯é’]é­pp´4C=O1UÓKì)òIaµÆY©´q°ðAcpBÐëõ¨JÍîÝ}â0ÄÖÐn·¹}ç.´Û„aŒ¤EÎèè„:Ïé VñÈ­3}>ñ ¿Æüø’ÏK¶ÏŸåÜùóìݺE‘6)Ôm?à¿ü >øÞ÷sfc†l6H‚Ùô„Ûwo“¦MÝQ^ÍïIXh<ÞÊ5ÄÓ[„zYm^Óçìhî µ5Ow!QC…†”Î@S„sXTy>5|…ÖRXžþùöoýn¾òÊ—@@YkŽw𢘃ÃCzø^~åUŒå5þR!,žò°Â$'GMˆ™ßlÆPàq/ ±è¸ö%y­ñˆ€·»Œ¦)w‡¸x/=w!^amuùí~êoý·H[òéßøu®^y†ÍS›¬Böê!ëë¹sûÞ Ïúúóy†çiú½ ”RŒF#ÚÓñ ¦Ê0ù5òñˆ•sØ¢b<+IÚZI›¸×gšftVÖiµZÜ~ã:ºÐøÆ£N,ÓéÐÔµAùœ`IÌññ1§’.¥†lTwš.ì8ðp¦$Ë$Iè³ra´ÐTO<È­[·Ù™`ŠW„aH;ôÖ¡£A£64a✡®ÁAj]#Ã$‰(JíE&)ò¾TxÒ{k°b,ž'ÑÊ"j‹:í`©uIzh«îY°á¥CÛó°6fuu)ºÒ[S5EÕ ½Y…µÚ[ÅS‚ÊhB¯9‹j±ÙFÐŽ[à Ýî „D ‰ó±7Z£°¤ó¼IâŽEQ¶B’{Ç’R29žcÊ‚Íp¸×Ôâ¹Aì­ÓXm°¶Æš&©?/‹·÷^ÿ¶m‰%þ !–z‰%–ø†ƒ”¥–Á_oHGcr«ªލ"'ö>üîws2žòéßy/‰¸üØ6O]:Ït:dcs%²S”3´0”LJ貄ÀGxŠHÆ$+§©æ9ï#£€jV‘gsºƒu¢d¬Lñ Y† |†Gwå„ñ´ ·£ŒCy>~èaÃ.\zìð«+Ò٘ݽ 1ãá1ãñ!­Õ>½Ð§,s‚ ædv‚(„ˆhy†³[”ONÆLÕ÷[Xk‰[­VL^ ý¦V ‰scjŠ¢@JÈÓ¼©²M­µŽ,Ë‚£IÜ¡ÓêblÉ|6Å …Žº6Hé-dÏMw­ïûíðýÙ4Å­;æó9UU±»»ËýÏQæJoƒµ5<Ïce¥ÏüÀ†!'GcÂ(ÄjÇÑÑ,+X[Ýd<™Ñ #677™ÎgXãØÚÚ"I"®]¿Æt>ZTt•­ÑÖPiÝÈ´ih¯òEÕÈZÃ0Ó†IĽó›zé7·ÐoÖÝ#Ôp¯îè-[н÷z!®®Øß»Íj·KešŠ«IZr~û,¯ßºÃ`0àÚµkœ?‘ýý=„Ô¬µ„.Òf¸ç  ‘™[kïßó¬ÕÖ9ÜâñÍó<œé{x*À:Áúú:Z*ü0æÌÖ)nÞ¸ÊQuSd¨þ*ç¸ÈŸùø_dø·¯SÎ'ÜISÖ× 6·îcksƒyšRd9í^›"›¢µE)Ÿþ`•ª*XYYáîNÊέ<¯Ù[ëÓ¬Ðiõ¹yë&išó®w½“¤ßÇMæh]qúÜ6GGGœLN8ÕŽH³1óñ!ÙtÊÖ™ÓÔU¢v‡²Ì Ãý;7Yߨ$L誤–§E`-&ÏI«”n•oº|@¯ïð{Ÿû“É©<ªª¢,»´[}¢("Ž":ÝBêÊRT%BH²,o>„¤®›š´N«”Š$Išê"k¬ÖP‡\$š{Bâ)®éž®Á8C žôð¤ 6†²nÔº¶ÔuM†ÄqŒR÷9‰š”u[k¼‰úì¨Ë¦â.«f %(к"ËÓFùRë{©äýþàOåžþ'aùé½Ä×RÊ{Ò˜%–Xb‰oH)—è¯CÎbušf3d$Úø¹Oüëg7až’Žw°6î»ÄÙóOò[¿òßsþÑw²¾¾Š´†²LÍöÙ?:!Hºx¡‡*<Μ>±%''st]Òk ∪Ö8ÓôÎΦ‡˜¸Cè ðéxF¯qùáG©* [„žA(Çl6¡oà)°N&‚@µ­¶hg |œe>Ñïš +©ˆ[ £Ñã u™ÓjµÈë’vÒâîÎM¦ù:ƒ^ÒAÉ éݸM]×\Ø>Ëë¯Þà¾øe¾çcß…ûl¬oqw—².HZÒé„þJ©Z\yæ9â­uúNRç)Ÿ~ö‹ì°Æà€‹G³m’{¤VãÐF#Õ[×¾ô=„uÈ…4Ú¨æOMSëãI‰`l ÄBÚç ¹·]t6kÛtF{ÊGº‚ßùÔÿAGJr]óøcqí;èZÐíµ8{n›7ncME+jÑmw‰ãÓô„X&ˆÒÐj÷I³ ¸ ç$¾4üÞ©…Ä×à ‹¶ ¬Å |” À1Æ‘NGøžåîä˜ó^&Œ^»òFãC®ýŸ¿Ä}<Äú©³¼ãƒáèöu&óÛ8«xãêUº«V××99>!N|–=Ã÷}üÛ©jÍèpÄÓð<¯^ßa’k4(‰6I3¤¨ŠŒ²Ì™¥3ªª ÔMJ¶/RÅxaCÛ”s]`uÑÔEáÑJºÔFã”hüÔÎ0œ0³º±EU'oX[ÒºBIA]—äyŠ”PÖ¾èõÍ`ɺí6­~#$ºÆ"i´±ÅcRŽñŠˆH%H¥h I¬‚ÝjÄÖC‰fýæ FzŠNÔ§¶–y–bµ)PQÀš¿B»Ý¥( ÒtFYeM6„ue‰s_ tU ¥ß ZɽáÓÛ%^âkŠåäK,ñ@,ï_whÅml€°MR´ïQ+ƒU>ôÔ»æüìßüo0µå¯?ñWÉÒ9E6ÅÔ)Æäž£4S5é´ÑÚ&+pÒ°³—Sç/á´ÅZ¨b‹3PƱ_a\‰Î9j]a¥ÂX‡ð<”T(åã Ê4×Îa0(? ( |`\IGHÙTƒ) ž…,K™ÍfœÜ:´Ö„aL+ˆ9*OÈÓ KS=ÕMZTZSÕ†43œ£µE” Â€µ•uºÝƒnÈ_Á!í¶Z(OäB=žRäEN™7×·'$I+i†JF>ž'q´qÚ mS¯…°(ÎÔ§Åñ²z‰o±|€\b‰%¾1!—Ê›¯;´;òÙ´Ù<ˆ“Y–ñÿØHˆã?ñKœ½°É_ý‰3:Úiä¾Õ GM’$ÔeÚ„\UÏho\À Èß Õëá%}¤T„AÂ܇\cÔ…¦Û_!òŸc˜ñ±ù1¼<%4œìÒö}Žöo ª9Çã1§xY‚(æÖ­Wxìñw¡¢dS|%ÁXâ Æó³ìªªXí7aa‡vE‘Q×M PFUµ‚Ãá1k+›ÌæCB¿©š)Š‚<Ïñ½ˆ²,‘RRW¡3xAH13JºÆ/ª”¢ª-Júx^°P­YÊ*'ŽCʺ „ßAò IDATÒ±LH’¦:¬`øÔÆ"uEV”Ôµa¥Ýe4žwº<÷ü‹¼ï=ïd:™ãœa2ã{RJ^½z Ïxâ›ÞÅ­k×xð⃼zã6ru@?èÐ wï’é ç,Z8¬5ÍöY6äZªÆ¯*•jBÅ)=„÷”wJú÷6g®‰VB‡¯‚Fn a`u#w Ù´s¡š]gÚ„P ©¼# <¤ï¡jŸ²,™Œç°Þ]%¾ÿ ¯¿þ¯¾z•÷¿÷½Œ¶Û¥Õë“å{×xËk]áI…ê^p˜R ¹u[ÀYð$N7Ö6žîñÉ„ v¬¯lP•9i>£ÛïãÊŠ“Ùˆ‹¶ ÇìݹÃÅË1:Üãðd?LÈ3ƒŠ-“É>6gue‹"NqNst¼Çúú&Qpp<¤•t‰ƒu”aèSPéš"/9ÞÝe4pfë4½î •.IÓ”¤&aÓÛh¯H<’eu1ÁVw)ÒW¿òYî»økÛ÷1 ØÊ¢b@yô«Ü¼qçšB ˜Žkîîqs÷õs§éö7¸|ùQööï¢kËd>CkK^æÍy" ñ¼ ñ9{M¸”‹eÙÈ»Mnq@wð<é Ûà!^S×5Gû8éÐÆR‚öjHQÎ9Oš@.! ¢«•©@WÄÊaqÎ0Ï…C­)uÝ_ghÅÍ6»(3Ò|Î*hlo–ÍëÍp=§ ¥®š^ê$FÑ •Bx ]Õ‹~ùf¨–‡M0€ð6Rèÿoh›³÷òvÚ—y×…6êëíxK,7ÐlÆÎ•ç¹Ó~Œ§.vPÚ÷ƒ·ûxK,±,–øúB+Lˆ¥‡ÖšØ× 6ÖžÇoò÷¹xaŸý›?Aè2f;¯r0+t» khSOðTåduבóÃ+¤ãN=õ½(o§jò¢¦í†ÇÈ$„²Ä_[å÷ÿ·Ÿcÿ°âûò?¢,'”Ó1&Z¥Ì3&×Þ ½µFouÀîKÏ1ŸÎ9÷ГŒövØïSO4ýÕÞùß7Éœ&I'Cj]2Ï+œtâ.Ÿt>¡Óޏví±ï“Ž'tâ„4oj‹òÙ¡<Ò,ãp8¥ßërñâEÂ@a­¤,a4:!‰C”›Š@(âv—Wgw8 yârk›@¤0 ©+Ã`0 (Š{žÑ,˨t½xAÐÆù|F]WxAÈl8e:O‰£¶*I:}êñ a`<³±¶Æ«×8wþ4ׯï2™¤¬¬¬ñàC’ù»ÿy¬DœÔŒócD}Ôd\yù9JW#C,lÒ9,ÍÆYñ–]c±µ(§ä½ ³œHÝüÈ/ð¤À9J*|ÏP ‡]_H4›i壼 ‘{³K˜N§ôgèö:¼~õ žxälé¸yýk§6yßûÞC@Y\¿u›ÎÊ£Ã×ðc±ðÈ:|? (³…Û¡þëÚhó<£Õj¡Ôb«nž'‘~ÀÆæWžy†IÊ“ßô$·oÝb}ã4eUQÔ_úÂg0º`:;äõ×ÿˆ÷¾ÿ»8}ö"'Ã[”¶¤rsb±¹}šk¯>ËîîƒA0‰ñ¤ ÏrÚ n\}ãá3l¬®óø£ï¥ˆã.‘sôWUU"­a<’´ºDíišr2ÜçôéÓÄ6ådŽT«‹M5ƒõóÌÒÙÊéµÚïss÷ƒsÐïo‚óñ½¢ÎÖ77Pt­)N&”JÉ>/nðÈ“g ¢7ß8 Ål­®S–%ÝNk‘_þ>wBâ0ÆʲĺFmb”Í{mëÆŸ>X]#‰[”Z7Äte…4›‘ÕÎr2<¦2]6×S´Ø&aL¼ð¦Ê JZÔ=_ý´šß Ä˲ ? ðtïûø¾"<©°LàSê”ýãÑ1“ù„(nÑi5d¿Õjz>ЦFz^“t.$Öò¢`žæhSQ—%eYâ EÇ´Ûí¢Ès”ïQÖ/ ÐÎ2Lšÿ··‰D ´%½þ)þÉ'þ9O¿´Ç¤ènœåáýÿé?ÅZu_þ¯ÿ¯}ß?äoÿé?Ø—oóñ–ø·<@Z&/ü ?ó×~™â/ÿ ¿ð½[M¦…«¸ûùÆÿô‹¿Áï¿>Â&<ú¡ä§þÊǸÜQ3æ™þù…ßü Ï令îžüÎæ§ü;¸ÿ? {öüßáûêÿblÿ˜î¸Ëÿ9¿ùóeÃûjŸ–ùkÿŠü~O½¸Ã¸ èmžãÑoÿ~æÇÞÏzu_üƒWþÂ?á—.vþô9ÅÛ|¼%–Xø·Ýÿ–øÿ#ZQLfJùÄm)ûE¾÷'†l>F3¬…rr@9™´[t{]êy†“1Ñj›ô¸ Ÿ™MRκÈú© BéøÜ¿È¥'Ÿ Ϧ8S.B«I+¦6š,ÓïÅèzFyäyI¯Ý£Ð†~·‡ M‰±5³ùŒ“ñˆÍ>YÚlï|ßǘ¥"ŒÓX¾×l¾â F[ BÞ#o†fùÂÕ,“À9çÉ{ʱ–(ŠÕV5ÆjZQÂÕ«Wïu©ñ>B:&£ ëë›8,u^qxpBYe<ñøe~ó·~‡½Ý}ò4ÃW%n°†. ªJ¢uE¡'Lò)QÜ¢v5R(¤£éo–òÞ¦LJ¯‘g/$ÛojƒÃ8‹·Pâ½U Õ‹ºjd´aâ´AzJš·6×B"­Ã #$B4Þè{ ÿ¦![Îúœ9sŠùÔ0™ÕÌæs8uŠi:ÃaðŸnoƒNÒâÚlÌmk‘¾”l[J‰’þ½dpçÄ=¢WM´ YJy‹÷¥ ‚‹c5%ΟçÎîm²yÆÅsx饗ؾpŽ3gÏñÔû>À /ü/¿ô|+‘¦dóÌYz«k˜YI'ŒæÞÉ>gÏ]XÔ}5Ä1¯JVûªjÆ·~ó‡9:9áë¯píµ—Y_ßd°²I»×F)I'i*–êRSgI»ÃÊÚ*­^Ÿ×®¼Â¹3g ÖP:.^,˜Oæ z§ÑuIeR’õ+j•y>gv¬ñ7CÒ\wºrÀ“Ôù%ÂÕxÖà„ÏÎ͆“‚ΩS¬®¯†ëB†¬hª«âÈC8‡RÍy^Ô‹MlØFJIY–‹$öEÅUÜ(0Š¢Àúgí¢rJÒI:¤2e:x~ˆç4hKUk’(F—%GQW”Ó‡ò=â¸E b‚ $¯{’$Í5§ µ5dY†íôÐÆPëœÀ BZkª(m¼þºÂÙÆº0žŽ`:bì·ètºÔu½¸>Cò<Çâ`¡XpÚ4ýò~H(}l1ŸÏ ¼f8#dsm”UAHD§ßCkM–eLfSÞ¾è¯1¶ã¯ð÷öäéä}üМûÛ5Ãk¼.{¼Ésœµog/öÛ~¼otüIh3½Æ§þÙÿÊÏÿÓ/r¨-—¬»wa¸Ù |âüKFïý üµ:…{ã÷øŸùà§Ý9þ÷ÿâIºBbæŠËßóWøóÛŠ«¿Ë?üå¿ÍÏ´ïã—þÒýDò­‡ÖèþäïþÜwQÝ{Ï '_ø_ø¯~í&}Ûeº S;þ÷§ÿ;>™|€¿ô“?̃íšãÛWyMöï÷ÖZÜÛx+x»·ÄßèË ô×%’(!iw©Å÷ž'I’„ý£C^¿:§(4^+ýˆ÷^ºg5T†nÒ¢¬#LÝȰµ«Éw¾ÂlOÕSk±æXs®QkŽo|ï÷¾IÔee¹EÙ¯“¥M”ôð=A®S¢¬´4FÅ(•søè!T19>^Ð8Éèõz¬­Í±eË&â8FN»µŒÂsúý>¾WÇqVWW)•’4#ŽC¤”¸ŽƒÊ3ŒÎpl›R) Óé§}<7À’(ïQuÇxðûh·›\òÄËiÔŒŽ±¼ÚcvažM§‰SÅ›^ÿ_ùŸú§|ꓟAe9—_v3GŽÑiÎ13¿ÌŽÉ-ž?Bã ÃÜsÿCä¢Pöýr´-£°kÇ)êƒm!É…A Yü­ Ë!Ë*,ª¤´Š@bdÛV¡t,Ò˜\ËB¡ÜÛ¤SPäO×PëBáY© aI”Ñ(•ãJCÜØûÄsè‡MWzh­©Žslæ8“““Ü{σ Œ0½q½v# A)ÛER̶mŸ¶Bœö!VQLöFáÔG‰ëHr•²Çâü*s 3'ÜvÓMhÛåü žÀòì,›wíbS©Æ®½ûùÄ?½›^¯Ewùýµã¤†Æ7R®³iÓ8^PA)ÅÞ}ˆ¢ˆ¥ÅEJå!|à~–——Ù·/$¨qÎY`iˆ“ˆn…^o¥rL&¨²qër¥è÷šXý.’ .½ˆ4É™92îýûYZYfrd˜áê­N“´—P-U±,‹$Žðì¿g+X™¡ SªT±—Rµ‚É2ânD®m´§™˜ ؽg„CÇ[Ü|ýA<¶†ÖEæµÕm¡…ÂVv¡L]ò0lÛ&Í2\cç9TKåBS@K¤ïàº.~¥JžYÚ (#„$ŽSzݘ8ÕÛ£*=r•âX’,‰ÈBJë[µù²Xû Ë!· ÏââØ®KÉõp]›Ô6¨(¢R®›Q„ï—‘\iQ+ %–…cJ¥¹ÊIS……4’ÖÚÂ’dhÖ–W0RàÚ.®ã¬Ç¢ìú…ž„¥B£±I¦4Få A²…ùE”ÎO3=~”ø±ÐÙÜ7¸£ãsùë~›—S¦ˆkžŠA|[m؉÷½’g¾¿x|Öë?À[.Îùæ?¾ƒ÷}å^Ž-vI)sîo½?¹j'orû?¿“wþË79Ü’Œíù)^üª_å;ÊEF9{œöÇïÏÏ~·ýî[9xÞå/_q&¹¾èùAáÑ'?õ¼íúžû†×rïŸÿkMí\^÷¾k®SÌ™ËÎ&¸ûjþÛ]w°œCÕ«qþË_ËyBDŽ‹vÒÿúüå3„ìÀرde3ÎÙtúqrü:^ó±CŒÿÜ›ù“çmÅ€nsçGþ†·äî[4Œï½˜þÆ«ùùo±¾—>¤³7rk'à©oü=~õ¼eÚ<½˜÷›[ÇÞýr.ÿ»âïsþèŸùÛK7½÷/y÷ïæØ|‡˜*üÞ;yëÏLáäkÜò¡·óöënäPÓb|ßeüÒ*gï0)²Çi¬ñ.o°>Õ×±ŽÖèŸ<ˆ €$¥Z.¡)¨¼¶í³¼ÒDJI7 Ù<4Ìžm#Q?¤RñHóËó(Õ‡1Ò%[¸öâ1œ‰½Ô§¶ãÙ5B³†›)æ—À/•XZ8Nëä,iÓ WþÊkY:y â>©68|éÒR!Ñqò¸Çüý‡0ÒÁkf±q*>™ÊñÒ"«µæQœR¯ÖPY†1 é #ðË…n@¦ÀØH‹·Àõ-R­¨˜‚½aiW«‚ÒˆLá”\„% ‚^ï•(yel ðKTkU<×CØ’,O0b`»¨ xßuÓ"­Ô*%²,#‹’icŒ…kÛTËBÒ,§ÛëàºI’Ðí¶±„ıÏ;=Ÿ³8¥;Pë†ÓŠåVnÑiá*Ñ9FZ m,Ë.6y~„ø±ÐöðVÆÅ§¹ãóß`îŒËÙäK mÒoÇØ³ÞÀ¯œÀ’ÒT©g¸÷«7qlä…¼æ•ûi¨>rÇ0¶H8ô×óº)ñ³¯x¯œèñ;ƒ¿z£dú¯âœjÎC×n?Æxª0O3ýÈSXǾcä°ù…oçã/ÈøVÞð–ïxŽï~ë¡ YéhÜÉ- ÙƒêYÔ¡zœ¸éc|âD‰ {ÕGY°žZÄšÞ=¼ûÞÁ}Û¿ûõ qpèý¿Ã«þ¾Ã%/ýMþt—àÐgþŽ·¿úµD÷^¾ÓGŠï¥ÏÃÎnd;“ü+·~ú&Nî*[YÔC>â}?÷øãgLá AeºŠÔǹûK_çèÈ/òû¯>›†îaíÁ1÷¿ïµüöG®þ7òÛ=nzÿ_ñæß—l|ÿïp^-ãÇk·c¼õµý:ÖñCÃzú'B,Ï>A³Ù¤Z.!”Ícœ±k%©é´ZDý.•Ê0RÚx¾”™¶è.GzUF7í \©“%9qg…NØbbhßò¸å¶Ï²°p‚“ÇŽ±ï’gó”§¿€•Ù£dÝabK ²œ’çS®qòÐAb•Q.ûÌ>´LÖ‹Ø´í|œs6«sÇÈ,Î/0}ÑIÚKä*¦õq€n·Ãñc3ŒŽ³yóf’° ‡Ka#„…빈t{=”ŒMŒ¢Ò-(”›V»Ãìü<§öâxiÖBJI»Ý¥^¯“ç’ XYY¡\èt:8¶MFxŽï¸ä¹"É’Bµ[k×Beq–‚,ËN×nÚ–Ežiò\“å1¾W%ÓŠû¼“KžþLÒ^È^ÈÔÈýðGyÞÕÏeóôVî¸óV.¸ø"ÚËM†Ç‡¸éÆ8~ô8£#cd™bllœ#ÇŽQª£{«øn0~ Z¹ê¶í ´ç8§•·¥(èÜ‚SB‚¥²"è`à­l ¼¡•Ê0H ¡‹¶SÙgåú´Ugp¾F‚e·†´Š liy…Û6S)Õ˜Å|Êå2µZ…JµDwm•¹ÇñTjeü’‡Öš8 A T~à4mcèG+”+CdH"C…÷°m;ô¢˜Z½AÉóÙ´e+_üÒç¨Vtš²}ϦÆ617sÏ‘ŒŒŒ²yã\Ç!«ÖètÛ謇ãBZ­¨O÷¡%’,gó¦ŒÖÐZaÙ†Jy ߯Ðn®âW}Â^‡O~ìZ¦7ífÿ9?…É$%¿† —­ŒŒ ch'1a§DµR'Ò fM³aãfý”0Œ¨UÊœ\˜gl|’0KÉrMs¥IžÁÈÈFâ¨6†ÖZ›e=Ìôø4–ÖTìŒ8QดÊ5´“buÝN•÷¾ÿ ø*OØe|ß§øÿç¨p[“Wòú×<ÈþÍ_ðò›?Ì…O{&?÷³Oã¼éàÛê0ýáMìØ± W ‚0†ò¶ ø© ö ÃîÍüýÇæØóŸß;jGÀ™kÜôŠóéÿÂY;î~Üö³w?ÆxœÇï¿÷Ã$ÖzTñÅcªpK»˜œßu™pìãoåÝÇwñK¯¿˜ÆéÏÇÐüÂkyΟÜI¦C?ýFÞ|åÎcN·¹ùo⃫ñ†7_ÍÎR€›Î­¼ëG™ø…wð‡¿´‡²\zÁV’—ý:×¼çVž÷?.¡Ñýî}†vÖÔ3yãëîçõoýS~á†k¹ø?Ë ž÷ .ÜTú¶yŒlaÏî-ß9ïw^ÄeII®Oçë¼ëÃ3ìûÍä7fGÀþ©U®ɵüë¡Wò„]w>nû¹{c¼u¬c?T¬ÛXýä!OrzIT¨å†Ø.¶mÓëwØ»k#V–³p|™í›ø®ÅðÐ8Ú¤aãÈŒvó$V¼†5r•± DnhÍ ŠV)û6Vàóàm_!;»ÿÒöزï§8÷’§pðæëñêJ¨°E` ×éâ×Üò¥ëÑ^©‰i²0&ìÎpäø,Ï{ñ³Y›}€v3"Ë%¥Ña¢å9š­ÒL‘(ÍüêQ¨Ù¹{åò'6pç=×Ó¨Mây>`ç=Ò4!Œ3Æ&Ç ã”’-ˆó ,וhË03?Ϲٙä:¡Ó_Áñ=zýˆÕÖ*#Ãã„QŸRÙ'Ï%¶UÇw=¤tÈÒ”j¥BE„½KºH»X;Rbú}¤Ð§=—mÛEå¦P.ÎIáøõR•›oº °27K&,®»æÃdB@šñžxO~ÒOqï=24Öà䉣¬­¬P*U‘–Ã¥ç_@;êsó}ßılêÃCäiZˆz¹.ižëDSÔçH„4XÚ )TÊ¡ o£¶ÐR (£L‘y†âþn :W!€BÑ[%ߺG QØZi¥Ð§jž&Í5FhÊÖvîÚÆí·ÜÂÈø'gNây+œsîp‡V«I)pX\hÒÀ£×^&3m’,ÅHEÅ«]Vd¥´‹L# L‰°Ÿ11Ö`q¹‰½f122BÇ”+UÚÝx…‰á-<÷ê_æ®[>çû|íkcÆŒŒldu¹I«ÓeÇÖM”*÷ß“²aó4¥’_P‚µ¡)%¨Åɹ£Ì/̰iz'žpèÈA*µ[w=Ç’œ8~iŽ"³>Çîû*aš“Ó“Ûš¨“Ä™ÒeIœ4ÉT Ûò‰œ™êâ¹eêµQÒ\ÑneŠjµN°k/ݵ­µc¸®S*FM|_°­^¥½ÚáøZ—žÔ*5öîØ€°`i¡Ïâj·ìqÅO_ÀâÜ _þú7èwûdYÊÄØøiK'! ý¨ëÊÒÏug Ç*hÕžãâº.®ã!Ê‚| "fŒ!Í5®ë¡”¢T°m $aŽ.Ò+6^\¯L©T"¨®G¹\ŵ]•¡” „ê _uMöI“d $'Hâ! Â(r­8øÐ" Sè¤ I¡àH‹jP¢\.£Œ!ÏUQ·Áu|Ç%ÉRºÝîéëà»®(JÉñ{¾ÈûßóÇüªtxÿžÌèwˆ‚iš7¼7}2åÊ?~-Oßà¦]§Ë÷r8©rÎE›)[V‘•-må’s*\sç},g—Pþú ùÏ0ûl{æÿÅ5—ýw~åÓüËÇÞÇk?ú>žðò?åÍ/;“Ú©£,|bOï œ>yYd) ÉÊAŽ%9'ßòb.{ë鋃Vš`1&i<~»ÙÇ£·Žu¬ã‡)äº ÁO lÛ"Y–à9Že#¥dtl Ç.÷V9¨pr£„RÅ¢Ô6‚^«‰NBo”Ju”ri˜öÊPd)³ ³ôÚk„Íeægfñc4&pÞ“/å®Ûoaמ=ÄY:Äó<ÂÖ–ÑÜ~ãÍD±âIÏ¼Š¥‡‰»]8ÂÅW\ÁÚÉÃ$aL–JV[-víßÏêòƒô:]Â>ô{1®S‚r±H¯×jØ–Äó\ÆÇÇY]mü!©N¿G#m`|(S¨Tá{%’,¤ŸF¸¶Ãòj‹‘á®k³Úì"Ùä<7Ha$“s IDATãØ’^¿C¥\%ŠúŒŒ Óïu°lÛq±•*¬%–ëºøJa¢ˆ4Mq]—4+|e•RXÒEHïÜð0¿û_ÞÀ¡ûdïÞ} ÕG¸åÆoröùçsßwóŸ¼æŸØ¶}/O8w?ùеìÙ{ÞK«Ófqm…JµZØce)¾U¶ F\® º¾0à ›"³èÈÌ@#X ÐEÀc$˜\a‚iHAžçØòa–UÌ:mrla#„¯×†<+²˜B c4²Ȝ{ÞÅÜïݬ®®’ÃÄð(­~—,˨Õjœ8vŒ ScT‚2ª—P*ûÄk+§³ãy^ø@c$ Ð Ò$§Õ^¢R¢Zn”jŒÛ„aˆ‚±ñqúQD”Jé‡<ÀÆ©mlÛº‡æÚšˆ#GîcÓÖ=ôÃŽ*Çj½J§»J»³ŠãØø¾KMÑÄó<ª•1òý…<ÿ=¿Á¯ýýŸñ¡'ÿ¿2õïœ÷*G›€‹ï-ü晥‡› 4>„=÷]ÚÅÜú¼_Ç:~ Xgzüä!ÎRjµUJ˜\UP&ëå[¤\ô¤óð…­¤ K†a× °]‹Ü²qs—¤»Œ§4——IÃªÝÆêtX\\%˜ØÁ¾óžSv–ÅO¸„0êá›y.8xÛ7Éã á–8÷Ò§2{ò$|óK¾ï¼ôå/¥¹p”æ|J? I„ǹî§5·ÈÚÚ2ÝvF³Õ£¦ØŽOµ>B’挎U¹ãÎÙ¼e/aԙЛôë Ëlš˜"ìu©”=y*Àõ©`Y®8qr×ßJ¹\#×y®IœV«ÅðйJñ]‡8‰p¤hJ¥€l(ú^ ¡b„”l<Ï%Š",K’fi¡Þ«5Rj”Öxn°·ÌEO¼”°óï{/yÅo3<5ŠJ O{æ•ÌáÏyïx×;yòåWprnžÏæ³Ä™àË×½»·3·¼È<@©T£î±š®©W:E-©ã ´)ÈܦW2YVDH,yÊ`GcD¡Ž6X­*ÃòôsEFÎ/aF*Œ>ewT#˜A.4Yž“£yòåÏgÏž]|틟¡ÕìqÆ9g#”¢¹Òı,zcc¬Ì¯R©”(Ë KÊâ¸ã"-ˆâËrÂ9éÔîºÿf²Hsõó_ÆÁqffç ‚S¦™fy¥IÒYá«_þ8W^q½~JI¸T«Šû6Òït9öØÀSŸq5‹ s,ÏÀuŠÌ£í8ضCž÷Èòbs¨ä•ªP™þéËŽÅ¥ºCÊôÔ.®xÆ‹8üà-;q5“²mÛv¶n<“$KèE-×C©"h3 W»`A'tÍ ~¹ŒZëâ–GÈ„A ¿REç6.)&‹QZR©5èwB$£#®<'AµÁ½ãÄBÆ?öv¢L!tÊÖM£xžÏüí·x^@n@ b)¨Aðh Q“¨œr¹L¥TДíA}tØë‘ç9FÂ0$ÉR†CH)+ê¨Õ@\ °DiN?ìãzIVˆ˜Ù¶ Ò¢Û‘ÂBØiÛÈ4%Ïs<Ç#µSFǧÈU†çºT*5l)é¶ÛÔ*‚Ñᢨ°J3U‹ù^Ð#p¥(¼«ÓüÛ¾+%P©TÐZãy^¡oÀ¶‹¹&1Y–E®eS * ×(¥è |³i^Ö^@cxˆÿ#} …«Âî‹ÎfèCŸåÐrŽÙàQu!lE(ó(Ê#`ì`ÚI8v &¯ÚJI~{]©}üvÒßxëøãû[@úw½‹×þÕC<ñ ïàuWLâ=FÚ´8¾Äq-„‰Q´«Ò-¾þ·Á啼õ×Îcøѳ;¾­ÞµÜqóñÙ»( é,7ÝÙÅݲ OàN|÷>u–BH„Ueï“ÎeøšOòÀRÓuúkßÛ>‰gyœ8~”$‹˜Ú0Ú¦Tr‰Rë–èσ´ÝÄXZ‡¬41:½›íg=™‰»°-‹´ÒZ¡R.³ö O£×^ñ«L Mr÷­÷E=ÖfîÁ&à‚K®¤¹6CººÌJk‘#÷ÍòÔç_M{u…8î0óÐ úFâ)alt„v;¢T«sÇ·±Ö\dÓ¦3ÃÛ)¹8͘›À¶VÂ*­ã»XE&¬ßï -eKšÍ6Z…$Îè%=|¿D® FšV…}N/ŒŠ,Û Æ7OS0f Z-‹zaUø*Û¶*Ú³¼P1Ns,Ë"ËCvíÜÇÍ7ß@··ÊÆé ZÍ%VWW™šœæ®/ÝÉÉCÇø·›oF§9*ŠØ<5Áý÷܇ŽSêå >ø –tX^]ãi—]A»µÂm÷Dh‘` Ö¦ í2§âZ˲@ŒÒØÒB 6ÕmŠs(˜Ú…•Vª°§’§螪¨–ƒì3XV±¶IâSûß ­s¼r‰‘Æ#C :gžy€¥•%¼‰)6n˜æÈÑÃlÛ¶•••µ:å L´6K¯ÓÇ’Ç 0H´>u|sšJkYžg ¥²á–o|‘½g]H¥\£R©Ñë÷Y\XclÌbth”’#Iú]Ž=ëCµZ&ìw©zuÂVH©^&W!+K³4&&™˜ä¡ƒw!…¢TöQÒ&SŠÀ Àø„„“sG!û÷ŸKޤÖæìás‰û}:íyâ¸ÄÙ<… ÓÛ™yèÍÕEÚ­ˆsÏ¿#%q"]A’Ddy‚íÙ  Ej­5ý^›²[B{5rQ®–Q&GÚh4а…6±QÒ¤P‚û+ÄiÂî½›ŸÚÀWn¸ “B'N¸å–XFGG±¤RæºðwFáZ.Ö€m©DqŠ8iFÙ·Ñ™"§H<ÙÒÂ8&Iâ4¥ÓéP«ÕŠM£IÓǵp—rPÂuý%¼‰ ½£ws_4ƶ¡ˆ;?ñ)ÚpϽ`çåÕŸ`ºûU>úñã`ßÇUŽÜÅÍwglÜ1Š_züvϲu¼­Þ=üÕ«ÿ ïÛËSÎÃ]0~`˜_8ÉÖ-Û{®es|á}ŽîùÏç9ûŠÕj™Oýñó™êÏó›W7›¬®®²ÒìB¥N)}€ýÃg9´Ö¡½:Ë=ׄ·½ã«¬î{1¯~Þ†NS¸ ý»ÞÍù›ÛyÖÏsIµÃÂü?½èàûxÓ»nâäÚÍæ2Çïù*xç¹£{&/þåŸa_Ý%¼ýcüë ø“5º‡ïàîpœ#!·ýó¿ðÀÆŸá…}kÞ“lì|‘]÷YîéùxºÃüCwpÃ])›w”¿Ý·ìGoÜ_§s¯c?$ÄqD«Õddxl=ý„[î:Š+\t®IÒ”$éaÛ†_ü…g°a|Œ»î9ŽSªPšäλNp|vé £ 4°íË6DaŒ/Òž½eáÕF‘Ʀ¶í¶Ÿ{%#[ îpã§?ÈÒJ‹±±q¤Ê™}èV"ǦÙé±Ö‰ˆ;«è¸ÍèŽ=\ùüŸÅ$'nÿG¯Ñ .yis…ÞâÝw^mË*1=µ™‘‘ͤy¶ÏøØfVÖV8ë¬óQyŒ¢× YYY&O!ð|šíZQ‘ÑIªÕÂÉ!Wš\iÇ%K3F“¤YÌpc p²Ó,%p’8Æõ}<ß#W®ãâZE0Ÿk…Öm yžµ–6ØV$q‚°E–åTË Fê æ±DŒt|)ØL­Ñ@iIÜŠi5[LŽO0TæÞûïçk×ßÈ3΢ÙlÒ鬒%Ŷ-Û˜›[àÊ+žJÉu˜9q’DÅh:.‚i!&ÏQ*C« £r´0]Ô?çYZXo ì¦ò<QdéŒ6[I…69M?õ»8¦F+EF8ËŠ`)Íü J½>Æž½û¸ñ†ë™šœ¢ÓîP+×ÐF³´²€mùh!عk+F…•…ª¶¦ßZ ×kâØ6¾[|^Y–c ¨ÕÖ…¯µ0£R²4£TòXš›!ê´X]œÅhÅž3š˜•v)ª• 'ßG«Õ*Þ«-ˆ¢J­Bžç$QFÙ¯'G欳Ÿ@’)¢($n¯ÒZ\ ¹¶H–õQyÎô†­øAÀwÝÊÉÙû‹M ý8Æöêõ!Ëñ™œfçç0:¼™“ 'YY]Àót•Rß+‘+ëøX¶ÊRCšç¨<-ü´…¦×\Ce-Ü AP®GlÛ*°l k &í¸6IšáxgíÞÌ;ÆkØ>±‚¢J˜tYmvÉSMšöÈTŽÑEB#ÉR’4%Šc–––‰¢­4I–R*ù8¶]Ô;v±©”e$i†%‹M¤:ÊPcˆzµ†ïû[k|¿ Ù{®K£Ñ(»®ëã:.pmeL¡D.$Zç<ùÂ}ÿáûéáǹîºë> ä@ö(?9ÿX3ÐJÖ©´®çºw„µpªLíy ¯úã—ñôI!\ôk¿Å³þç{ùÀ›ÿˆ$ç‚ïå²§7÷€3~ù-üyã]¼ç³×ògë üÛ/þežtÕ^jÖwiw}¼'OT®PjâúƒÆ÷5Ñ“¾y8GõÞËïüÚ{–Ýãçßy ¯žj³xðs|êÇiå odßÓ^ÃßþʳÙê=|¼ŒÙ¾Î¢Öèú¼æ#gôy¼çÚWsæËÿ’¿)¿¿¹î¯øÝ%ÃØî yÕÛ~‹í ¦Ïî_þn}NA£dƒjóË|ðo?Èj ¸5¦÷]Åï¼õWyÖ”ƒCüÔoý.Ïýïÿï{Ó눃 .ú¥3xêîǺ %¼ò¼}øíü¿ÿú÷üßi“ûCì¼ô×¹ìgΤn}—vç1ÆÛßxÔ¶u¬cÿq¬«pÿd­t¡ÆmYlܸ‘‰‰1¾ô…¯3sô0.ùifÖ"n¿ç0uÏet´FµQ*„¨p ûm‚’Cs®ƒí6ðËd:AÚ>Ƴé$]â¹´gŽ0:µ=ç_DÔOY:týæqš“†)mÝc¸¾± Óœ|à~–¢>O<ÿB”ŠHVç9vxžÕ^È…O~:ŽÐ¬­¬²meu*Ë—ç9Ò.Þ+§“ò<)0vÜÀ?„\íÚœ[UK‚–˜A½*€Ê5ZYÉ4M±¥ÅØè“›vrüÄQg©U÷ລJË’œ±?ín—0‰ð‹¡r¶µÌñãG±-pÝ‚’ž©œtqƱˆz!Õj4Jq<Úø^PPl]—$\£Z!û|ó_cÿ9ç³k×&|“jêC :ž%ð¤MFÂìì F'F©×«Äq„/|6L²°¸ÀääF:­Ç%ºŒŽ` CP–ôûã[h//±Ú^dmùž-pü2í$#‰B¤ exl˜ž©Ž ³¹d“ç1͵elG²ÖnQ.—ql¯øŒtA;Ʊ ÷ÿÅÙ~Æ>¶mÛ‡£û¼ë6’¸G½QG9&&7ÒïöhvV‰Ãðè·Ýy+ÏýÙ—°¸¼H5™=9S,h3À²Y\[A)…ï—p¼¦7‘ô»$yF§Û+ì¤2Åôø4ÒRÔ‡Æèt:HÒ¢ÍäTJUÚí6®g#…M–'xn@½ZEe)ý($J22Ðív Ü2CCC8¶ÆÅÉù%¥r•0ꑦ!Óã“d&¥ßî°Öé166ÊØøV.{ös¨Orrf†F¥A§Õ³ªÈ²Ï'?õ)Ž9JÜÑZS¯×)U+,,¯´yâŸH¥Rby~Ž~â#(S¯yšâ8FTþSrA«PÑâHyž•:õ` ‰y„†% ‹Wi[dJa‰"Ð6Æy–´ÑyN½Ú`ÓÖ=ŒMmbqi‰~¿ÏÎ]ûÈÒÂC{llŒÆè;6m! ûÄiŸ‘áaúý>Gï¼Õgt¬ŠÎ q§1N‡‰© ,--Q¯ÑïGø¾ËÂü Z§”‚‚"Üï÷ŸØHµÒ ‡HÊ4FG¸â©Ïæ›7}“ÇîD˜2‹’WÁ.YÔ~Ôcdh×u1ÊŲ Ý~‡(Šª—¸ãŸÆ÷¤ø‹ç¹•Ê•!&&&8xð^ÖšóTë &&·bû„Ö¬,ÏS®4ÛÈÄæÝÄñ U? Ï2¤PÄq„°$icKcÔ@¬ªD’gÄqL©TBH›zc„ R&×2#-C¹…)eÏ'U9i¦p‰kÙXž‡6Êq8h ¶ïqøèa®¹î«ôó˜L+Jn K #ÃX–•9½^ p-Ûv©T*”K„m Êúý>‹‹‹„aA‹n4‚€±±4’åÕÒ4cmmÇ.Þ—ˆ‰Åi¿ Pƒïº¤iJ»ßÃwÇ¡Ñh`ЉHœ¥XZRò}<Ï+J2¢ˆ“sÇéô Aºéñ ”Ëe†‡G uc‘iE·Ûeme­sr-)—+øŽ‘Ç)‚c姃c¥z?N[XYÌwk°Y4·°@”ÄDiB#(ªä®Ëßþ÷ßø‹s~îsŸãE/zÑÕ@„ƒŸþÃþŽ€øÇ[=ðÃû.UûñT±Åc.ßSû¿¼u|ÿøî G´yíí¹G´Ÿ—Ö÷”eBò¸C~}¿ÿyÿ8õÔÿþ»}]i~ëøQB ~”z'ëøáàýwS)¨†®K–ˆR&6OP êL× O=w¶Ðx¶$%M¢$GZ=ò¤ yŽS.·Bh—á¡iz¹ Y<|í8gë9?/mÂÖC¬.#Ñš”J¯Ñ‰B6h£·~‰•~Æ“®ºšmvó‘·þ ­^‡V'ã%¯üuÖÖZèåæ› ÔêBÏ£:6M©>‚Qšvë!z½”4QÜ~çmìØs++sÄý6ö"–ɉ•¢e^/äË_ùÂRK6ñð$]ˆ{Åq|Ú³9Ôr?|t* >U£*„ Øs™¼x.£šR0¤ ì»¸å!,' ÕŠ»ï¾j­A¦RxèFF'Ù³såÀ§GÜvðnêC ²,GI›3ví¢;s'kÑ‹+Ke3>6F˜…„q‚eôð8BGŠÑ± ²$$‰{$IÊôÄfò<§Ýj21± i n½óznøòu`lvíÚÏÊò2žŸEƆ¦‘– |zƒtljÁ(ƶ™˜˜Âõ–—ÝM{ùZÛq@X$*!î.’ņ-Ó8ûRÖV[¬¶çˆ–geïþsP*Eå]nøü;q¼1λàbâ8!ŒR‚ „#l|¯ŠeY$qQ§¿Ò\Ã’RÚäJ`2ÅÒJ ·b¼U&F7ã82#‘ž&v=lGhEÚ[#Ê2lËEç]dd¡„M_[XqƒJ0ÅëÿU|íÆÛ91³Œ1†r¹Œ´lr¥@6OA0¿°€Ô†z½N’XË"íçdUnƒÁñ\†KQ?D 3yžÇ)Ývc [¨²ç#e¡Ød)¹r‹Úk­YXZ"Œúh£Iò ÇqXm.¡ò2…m;”Ê5’ZÇñ(•B¬lx„¡Zn·‹ëX`Ižt"¢(¢× IÓ˜^·ƒÑõ¡1’4<½©$¥$Žc”Rl˜˜Äó<ÇaaqžåÖjUQ ¢8&I´6ÄQ­³Bi_ò´2°~3ÁNþáàÿ3"bëXÇ:Ö±Žu¬cÿÆìÌ!JêQ*åŽm£ÒŒºãpö® ÎÚÛ NVqœ Ž µ" C†F†è¬¶1¹$ÍìT"AVÇé+¨UN<8K/JØáå4¦6râî¯Ñ]™GëBlJQœa»ÇÞI7ÍØº{?[vîfñàƒä –:]6ï<‹´1>\åÁc=‚ ÌRg…Úð$[wŸA¿×¡³¶BžÅ¨4Ãw‹ÚË3ö Û^D«”$ŠIÓ”Zcˆëo»'(²S®ëc”¡^©"1§)™¶íâûEÆQH « QØÝôú}:Ý>år‰$q½"3å:>Z Œ ”.,v ObE®3Z6Û6o¡ÓêâŽ]¡ÓéÐX–CwÚEHƒ9 '@'Ì;ŠÝ¨³qÓ¾ùÕ›yþ‹_Àß¿÷†£ä¹b׎ ŽplvŽj£F³½Æ‡ÿéC<íª§Óh4øÄg?Í%_ÊÚÊ*·Ý}#–]Ôgæ*G !‹%}žç5XHŒ)²ÎÖ`C¼P /¨Ã™Vùíåf`·z RJÔ€Ii;–eQ©4 ïi :ýÆ(ÆÇÇYXZ$ÕDZ‘Ž$LbœÀ§ÛêÓjµØ±m;"‹é´–X^\Àµ¡ä•°ŒËZ³IP0¦ ÅÛ¶d~aŽé ›È3h6×þ+qÊUšÍ6¦¦R#í Û®0=½™UR,Ç£ÓYEå1I’b;‚@2g… IDAT…ùC®Gßu™˜Ú@-âÆ£_axhœíÛ÷3½q Ûvl§Ûé Ò.QÞÃÇ d ‰Ä¤0ä™$Îú¸%ìJŒŒhuæ‘sšJ¥†%$O8ër’¼É½÷Þ˦M;±¤Ç‰'ð<‡J¥Tdš)*¤*FA’f”«5„t0ÒÃuâ^›Žj2<6Î5Òþßì½YŒeù}ß÷ù/g½kÝ[U]ÕûtÏtÏtÏÆ!9wÊ´E‰²Ø²eÀ2 'pòä!’§<$H /A’A^ˆcÀ6dGVbK¡(‰C‰ëpöé™Þ—Ú«îzösþÿNqˆ(1 Ì @ÜÏCw׆ºÕuîÁýýßÅ¢Z£‚g+ž¯IfK¤ç1‹²äÉÞ îðìgY¸{{·ý}k‰ÀRV YU²L Sã#)êŠziðÊ6»®kƒ:ð1Æ´Õm¡GH­qNÐétØÚÜ$+Nkò¤ ªªÀÔŽ"¯°ÖQ™v`öG]”8ÓÐXC–¦8gÑ”4¦"MS‚ÀR•­‚Â6GžçTe‰T´ä½½²,؆0ð‘R2Àâûº k,ZkFƒ!J©Vµe±œ³³³ƒ–º*˜NÛ.÷v3í>ê€}Eàµj¤ÂÙ6xì㜠WôŠ+V¬X±bÅÏŽ5dóæócŒ5x— O=O6Íøµ¿ú«ü³ßùç|ík_bw÷?úã×øÊ—¿ÆÁÑ1ëëë¼ûî;8gøKñëÌ÷¹¸¶Á÷Þzƒíõ3üæßü[LçŽ&,³e›¤lÛð-k- k*¬µèÓô}{jJbÀ÷©K‹³¶­³”ÖTU…”¥48‹§}ʲ¦Ûí …Ï`0h+Ñ´À45¤†gž¾É݇JrùÒÓlll“'9ÓÙ1ã I7øà­wùâ+7™>¼E‘Ñ ™N'h]Ç1ûÇûH­ÛthcéwbÒ4¡÷H³9Ö5“å)ë1»Ç)òœ«Woņ‹çžæ™+/°œŸðÖ›¯1èû”EF3î‡Ú£©3òÅ1¾×á+Ÿÿ2“é1o¿Éÿä_R–ÃÍ‹tzëÈF>ÂI<Ï¢äË9EšP%^±¹¹Å³Ï¿@]öÈ+K/ È’œ ·ÁÆZSå4Öró¹tº}>ºK–e,Ž'øaÀ¹K ‚ßSÜx©%£õÖeÔeÀÛoþ0äÚõ§‘Z1ŒÈfë$2%3;£©z[ç‘QŒi#ßîù¼³³äǯß&) .l­QU5ˤÀ E’çÌ’¤Ýà.RºžG/Œ‰Ã/ŒH²”4Í889¡n*’l‰p% íã5ü(ÆÓíàê!J´‡8ÓÅ”²,ñ<'$½0¦uét­ºC:в$ëøJ#OCꊪÄ“dvzø¥t€¯¡ ð}í+Ž'²"¡ª*z.ú´›à`÷1ËtAmÃÞ£µMF£!QÔÁX…3í÷ÚØ“•ËiIÓÔh$~èãD›¼]›Ömëšµþ€³ãM‚0¦Á}¬%2«zÅ'Î*LgÅŠ+Vü" ‡¨,#¨¶·ÖùÏþ£¿',ÿÓoÿCü Ë7ý”Ùœüÿ1_úê—ùú_ü*óGï†y€¥|ÝA}´ì=~ŸEvÂSÏ}ŠšãƒÇ¸rIc¦O&¬ 79ÜßçÜÅg˜Íœ¿þÊÂìÉc¬ ØÝ»Ëßú·ÿC¤ªQUJ’LÐÍ=:à×ÿî7iÒŠf1e~rÈ2KIÓ­}ʦ¡3qp|ÂF/"Ny<]òpç€n·Ç(îøºõáZK·×ÅvŽ÷ÛžWÓnX»awšÆ ?[YÛ&xÿtÓ$„À÷Û·±xžÀa©ªš²,Û°,-1F‘m€ÕÉÉ Ãá 1¦ÝP[kñ}Ÿ¢ÈðýˆNØ¡*:Ý€¦Jñ„åÿõïñwþÞu¢ äék×øÁ÷Œm–Ë%½^““~òã×étz|þÕWùýoýO?泟ú GÓ ÚÓ¼þúȩ̈3®^½ÊÑÉ!ÝNŸùôÏóȪ´¦›¡$Â9êÓ€°vßJ¸­7Uœv<ÿtãlš§ýÌ|ÔÃÜï÷ñ}!T+…-3ctºvvsõêu²,£ÛéµþQ-éöb¨K*a±µåÜÅóܹ"±1 ¨+‹5m T- ÎZ”¤e…­.Š÷î¾MUµ’ôN°L– ‡C|Ï'Ï‚ DÊ.uÓÐ  6Y,Ž Fy‰–†ÚT Gc¦‹%  BÛܸ@ºHØÜÚD IRgh—°(ܺ·Gúl Gô¢ÑÖ:Q‘çSòbNYÍ M§ßçÒS—ɲœd±ähr‚=zÒJµó‚ª.ØÛ½ÇÖÖYº½1EQ°yn›årIV”äyIU\¼ôµµ$YN'Š!Ïøâç_e6=bçÑ¢°C‘Ïét‡ÄÝ!u]‡–ÇS‚¸ÁóêÆÇ÷# †­ ÛÜŸWÌçøZr4K[sGQW ÃÁ%%K©ðDÛ%>Xk½ÍUcQBÒëu MQhÝ^7¦ihÊŒ¦iH³%Ë,e<ÞÀó<Ê<Ã×Ïóôúä:Ç9àÛÖS ‡Cʦnó”@º ©ë’ªÈ¨šå 1†Ð÷QÒûÈÇïk?ÛCœ²@"ý˜µÞ¨Mk·çZ•MÓ4Xk©Š”¹u(ÕnÊ¥lÿ¿¥”hÝ>o­ˆ6×[¿vQÐ4–ª®ðï+°1™M(늃ɔ~ßÐíö?Î[ýj€^ñÉãœûÿlú_±bÅŠ+>i:ã-ÖGc^}åS|ï·yíO¾M§7Ä—‚Êü·ÿÍ?àÑ“GüÆoýådŸ$ÏZ©däákmJuÊgzð>EY0>wc*ŠÅ1˜LŸ|ùˆ'{36··™œ´•hFHÆÛ›!¨)'Oñþ‡ï1OSÎ\rðè Jô9žÝg´~§|’Ã=l–PÕ9Ù&+× ¾•5kkcòå.Ò:ž̈£NIƽA¿OE1Á8Çb™°Þ0™Î> Ñò<„&Ig†”iE'Š‘Raë ¥}‚ ¢ª*†Ã!EQÐívÛÚ' E™áœÃØcÍé¦×²{°ËúÆè#Y¸Öš4ÍÛ!U©S¯±D Ù§Â"…áÅçžÁä)ßûîŸòÁƒÛŒN{“‹4cûÌ~ðÃïñʧ^¥JK~ðgßgs}'vw¨‹Š›Ï=Ç÷_ûS:q„çùôzz½¾–L&ÇxRµòg)(›¦}½sº0°§ƒ²V OéŸuóZ‡w*ï–R¢…l¥¹„'‘° M AÜádrŒò$E‘Ñ_†!³Ùc\›š]¤IÚJ¿mÉÉ­÷øÚו‡·îpss ÝØ}¼³9ÎÂ`0 Kk²¢F:gÜiÓÛƒ˜­õóù’ã£Ìá!½~ŸµÓkeÿ cï˜ —.sæÜÓtûCúÃ1ag“ÃÛi†ïC' Bs²H··ÁÙ³ç999b4ÞÀhŠ’(Šð‚[7„Bbk‡çEÌæKt2Þ<Ûú‘‹’"Ûc1›³}é9œ“Œ7/ dü@c°TN“$£A‡¬jHÓœ¢†ù|N B½>Z*ÏÇßܤ±–^·C„Lçs¤”U€m|ê8ÂË=мj“çCä‡mÚ¶¯±¶¡®-ñµG·ÓeømâvUáû>8¢(«Ó.u§첪Bâ‡1®®ˆ”×ʶCIIRÖFC””t:„”xJ³½¹öÃzªªb¹\"}CU×TEŽ15¦)XÌ'TUsjñPJPU%R ´–xú§sÄ4–Æ:êB?B"ÚÐ9 (ƒ5¥->Ö{ýj€^ñ‰…Þÿà]n>÷ÂG~ +V¬øùò³@Ÿ?ÿ~àÏ}ìÿú‰íÇþï_üozÿÿ¬µÜ¾ûNw¥¾ù#t°B1©2~÷;„¶­m±¹~ŒäþÕó•¿òoñò+Ïb f‡sÂÎq()ꈺ‹bf‡»X$›Û7¨0Lv¨“ÊdÉ£‡"˧nÞÄ•5ž×CvºÈ0ÆW·ø|øcjëñßøÛ|æ _fçÞOµ /“©e1}ÈÙ§nòܧ^fzë vž°\¤8«±¶$Ïszƒ!iíØÞÞb19àΣï3®‘W%žT Fg²j®ê†8™L&TÖ19™¡¤" 4yž£4Î2›OY_ß ô|â°­2¶Á†}„0t»]ŽðµÇp­G]öwéö†8Ú䯴iÑÝ~‡¿ù:ŸyùSc|¿­ÇѪÝÒ]{áEîÞy„Ã"h½ÙÓ£C^ûηùÍ¿óïñðà€ápÌ›ïÿ„Ћžâ…›7ÙyòˆµÑ:_ùÚ—ùçÿë¿`ssaƒ~·Þx“3[ܹ÷¾7ˆÂ'LJlmãää­*LS}ô\ÿéÐ/„À JžnÛÚ“ c žTH×¶b`8Gcýn{ß°Æ‘—^äQ–5~ÄQ‡;âÌÖ9ÖºëäyÉ|Qpí¹WèÆŠÅrƽÞB+…“’¸1ÞÜ¢i,e™³µù,ýáf“Ý¿‹4%¾¯éöúlž=ÏK/J!Ã¥GJØÙÛc<Ryž3›Í¨›†ùrŽïûTUç…5MƒsívY `N+&…8)Zɶãt;×:Æí†]8 BP5 XC'îÓ4 qã¬ëÐÊ1Lñ¼€ùtB·ÝÚ¿òõoò­ï|‡³£B4 &kPžN!eÙJj¥V4YCY4dYAôð´D*è†}.½ÄÝ{ï!{]ŽØX_§®+:½>RxìUÐÅÓ]*„òÃNëÓÖ 4DQDcLÛAÜ8´§) ˆ¢˜õõ1Ú÷pŒSœL0BðèÑc®\ºÌáñ1X,S†k]&ÇÇŸ<ÄwP¹ëjúýXAž·ä~PW†d‘²ÖÝÄS!µ1ØjIUʤáÜ™M¾û£÷ˆ}Ÿõa$Œ°ˆÓÞc…²îÍir]“ÓÊýã0"MŒ1äyÆuÛçCÛ Ý^S½ÎkÆ£5$ENU”!ÈÊ¥4B ª¦B88žœ`Œ!öÂ6Ý[´Òí¶;ˆ‰ÉÓ%G'ÇÔuM7îàiM‡(O#T›¦m­ÅÓéùÔÖ }~¿Oej¤R¸:C¡è÷{HÑÊõèí7&ÁZƒ± JyX[*& â4+ ®KÔi[LmÛ0©Ë|²äGõŸ? ÿÿ•Õ½âEkëÏÜø¤ÆŠ+V|¼ˆÓ*«¿PXj|¡Pzƒ5òáFHŒ­Æžðx÷µ[üp6å«¿üÑ ¢œ<Àt:Hˆ:Éf¼ßÛB)ÃÉî¢.H'3’ù Ö6¹páÉ"…Z2¾p £}Ì<çµßÿ§ìÜç¥Oýƒ³[|îK_fo÷-<R¦YQ.¦œ¹ò_"Ëx0d¾Ì¨ËálÎh<¤)sòeÉæúÞUÇÝGw〣Ù>»{÷øÔ³_b¼¾Í4Ùãð`‡Þ ÏÎÎm666È–É2§n2n¾üÖ××ùÝßùG8wÌÑÉ!/¹qãÕ64M ®?÷i®ßx‘×øU] *ƒr)V ²ÊCy>JùTÎAe±–é­|´ÉІ¼¨èõÇ4FòðÑ#vž<$Š"Ãg/³µ±ÉÆx¥}2©ðyŠ-+æËŒË—/Å}>xûû4eB‡ªýUY†ð<Š0ô‰<Ébr„Ý \ ¾T\Ø”øÇí¾àýÛùÉ­¡+úaÌöö6Z*<ÏG §)õVJæó%É2£?èžö[ò<ÁÔ5‹2Ekï‡ ºÚk¯•Æ–GûdË%GÉ’£ƒCš¦!Œ£Ö‹,4†ÐèF1N ´× §±µ!#¤NqRP%Ê Ð~Hj¤T¦!9>f‘&”YΠßçìÆðCó9³ %ÝNn§G¯Û‡Æ Ûh=´ŸS¹Q×hßG6 ž§Kà…4¶í…þiõ›”’0 Q2@{ÚkûÕµk;¢C4g7äj€^ñ‰³’0®X±bÅŠ_Ó Zû8+к&ìtQ­Ã?R4F²3ÙãÒ¹½uYŸºÃÞ%êº$Ÿ? |r‹Êè û¤¨ºÆ Ë2[¢:1Ï\¸Âr™D1r}“n/äàö-vï¼ÇîÉËÌpõÓ¯påéó”ù¦n°HLå(rÁ‹Ÿ{–š’Ç÷™,2*ehŠ Q”s$¥ãó_ø&gÆëì?¾Ã‡»¨„L“çÏeýÜ:¦,puCo¸Žvá$qøF˜‚0ôqÎ øZâkE6_zi²Ä QΣ¬*´çãkE•gt»Ý6ØÈ¦Tu‰m*ThMš%x2 ª„òiš --ˆ†‡öùÌó/áûY½Dúªj0¶#(«!¶ñ}Íd:%ðcÆÖí¦Õ哤)Ucpαµ½IomÄñþg¶·Éó’kW®‚§éöº|÷{ߥÅ„ZÑét8œ0m¢øzAY–t;}æ£M#Â+Û—üB‚¯Ûn^Oû ô|<¥ÑB`¤ ðª¢AGšÊ4xžGu)ŠŠØ ¨dÉd6)iLÍdr€P’n·‹–Š´(™Wž½¸Á×?ý2Éb/ŒˆãÉrJm>JúÔåß×ADYC:=&,=lf°ÒRÛš'»;<óôE¤³ÌÒ#œ±l®Ÿá΃wÐñ úgÈ‹‚¾qñüîÞ»Åáá—žºÆ0qr²ÏÉñ_ÿú_ãG?úIrHSÃÞîcœÜgmmÌp8DІkמåèè€,O@Ô”¦¦‡4Î’¾·ÕS¹F)ÁbºDÒ¨ò%ûiÆ /ÏØ}ò!UYqp8'™!TÄh}ß÷èõ60ž4ƒÞ€QÔa–etûž¾ñ o½þ-dÙ`*ˆ|Ý¿ (š%’5š¦áÌ¥mê"¥.S¤öQBQežÌùæ¯ý2¯|vÊ¿öC~ðú-r¡ÉŠ’Ð÷ÑBa]Ûï¬ý6E»4ÖÀ©7ÞZ‹ PJµá}J¡•"«šÆ`jC]µ¾hãq3èv°¦&/*<­èꀰ"•Ä8Amަ“6°«.éE1!p´[í8îÑñC<)‘N’g)~bŒ¡H3úý>N‡¬ª©– ONŽiš†~§G'Šñ„4ª¡®+šÆb¬‡ðB‚Ž"M“¶ÇÙ¬i»Ð±‰";©B •Gà…„~ø³›®ðRõåÇ9?¯è+V¬X±bÅŠŸ›kcœ–Xue@ê¦!],ÀÕü»ý—YëDÌv«œ´„ñö+$ù„lï'T‹)È€í‹ÏRe9³d:-¨Ó’‹×n'³ù YY0^¿Ìá£x¼HØø!y6çú«¿ýwÿï¼ñ#f{‘Êáˆ|ž³{pŒâ¹O½ÄÑÑCêÉ·÷Ÿ sCS{[PÔKìpùÊu–É>øðñ½.}lWñöÝÛHñ•gžczü˜ùôˆÑð,xv#œäyNx¤iÊÚpˆ”)N‡¦©ˆzkèÀP9Uî#"+XWÓ{,Ò„þ Çã½GxZóxg«W.Ç´“”UÎúæ˜ãã¶66©ê%Aðdo—ÅbÉ—¿ôyܱCx d[%µÇ"I˜'K†QÀýûð{x~Èý»¬oÎX$† øÂqæì6ï¿÷ZûLŽ&¥P•áê…Küäí³óè!£Ñˆs›# Y¦deŽ’''ǤyE¶ÁYQÄ2Y2[Ìé…ÅÖÆ†Ã!÷ÜÆóý¸‡“lÊïrñÜEºC’,Èò/Ð,sƒM66y‚çin<ýŸÓÔ5žï· cPÊÓŠ8 ppzmøXa؇ÃYGyþÆ6­_Oytúã¶[vsÏ|æ:ÖV¼ùæ6Ö×I­Aêü„|¾‹µ1Á ‹ð"²*£.Ô2gžfŒŸºÂr¹ÄkÓŒ·ÎóøÖ{L&ûYJ9?âöÃ}þ«ÿä¿çû½ßá•—>E™O‘–‹%óÙ’a§Gw}“µíM&wyøð>Ò*œ¨iL‰±%IšqãÆ+\¸r…ñOþ^záÒ"AÅÉl†1‚7Ÿ£® êª&ð#:ý»@\¿ IDAT'ÓC¤·Û0OµþÆ0DIX×P×5eYáéK©j<¥©›¶Ãغvã‹hCµ²¬ Ûq®FÀim›À›å9H塵p Q³w2ááÎ.cß'Šz匦8×úT‹¼¢’‚¸ÓÃj”œÇÉÑ>W®¾ÌrrDwH“ŠªªxéÅ—ùÃo ‡aýÌ&ËtAµAOJ)p†ÃÃCÆ£uÜ66ΰœ/(Ê ­}ê²Àó4¶©ñ•Ɔ†)!iŒA!ÚŸÙØÓí´hýÇR⬣±…D«6¸iªÓ ,‡©J<¥˜Ï§ôû}œq¾×ÊýkkÝ^½]Ö‡}Bi± ¬)éõºÔuMÓ4mI˲ƺ ¥UÝP«š^ÜCKR Æ8–iBìGĽ.ÇÓC:a—ýý]®?sÝ'8W£”àðø€ñúQ8 Û²»{‡"χ$‡KÖCäÚ˜eºä­·_çw¿ó[ÿ)WÏÏøƒoÿÏ8¡ˆ¢¦Úg¾LY_a­¥, ¿ò_g:rïöʲd>_Æ1ý~mêÚ2o`1Ü»{‡*{@' ¹úÜuö÷O8wþËÞ|ëGx^C§Sš.ýþ¼,qEMYX¼‚À„]ºÝåY6žºÌ΃†žð¨²”ÉÉ ‹#Ž;XÓª*ó²DûŽÅü„á`Dž8üp@²HùüK×ð´äþÞÜ}@Fh)ÁZ’d‰R’étеkÛ˜óWþæßç_ýÞ?ãìÅó8 :ôYÎ&”ó9‘ÖØþ€Ñhg,woßav4ÅE”ŒñÂG(²šÐøƒý»Ü¸~k4u­0XpþÜS\¾pÅÉI^t iÊ¡N+›ÄO;‹J´PœlÓƒë%5a¨XäÖ5­ì¶Èȳ¢¶ Ú9‡@¢”¢(   ¬k$Ï Ú­ªRáÚp«("/3¬µ(O³³»Çúå§‘´öQÊ¡Ñdy…T ”FHý‘$V éõúïqîâS(i9>:à¹s|ûÛß&Ís6Æ,«”wÞ{‡^ EYWi†ŠÐö†¤EŠò4ž ñ´$MsÂN@eRkdØ‚ömpmjr]S6u»>í‡nƒ•,Aèù,Øc$P•m¶3%i6ÇÓÓé ¡’ù>ž\Xßæ¥ç^àÊÓO‘N'˜º ªæXUSR[ƒ±y Oûhßc±˜£”b:Ÿâ°œß¼È ¿ÆÖ™óTUAm*Â0b¸vS%Da@šµ[‡ ‚'O¢½ˆ‘·Îx}‹ÇwA4<}ý~x›ÉÉ„¢Ì¯wÉ3ËÿøÛÿŸyù‹|êù_åGo¾ÆîîíQ6†Ýóùœ×ôC®]»ÆÕ+7Pž&/Kf‹9'ÇÖÖÖ CÈÒ’ñÚ9Ü%Íáá#ò²â·ßàÆÍ—¹wï.Ï>w“²Lyøð‹ù’q¯ORÔôº½j„´,–'ìî=¤Ó‰¸ú̳œáÓ”B0ýðufIBShíQWŽ*ÄžGƒ NJ:½ˆ½Ý}zƒ!^˜…zÃ!ׯ_£vO„XÛàG@û»t®}®Ð ”dksó£9uz½ÓÖ…µÉa‚ÜԨ̀±õˆ7¦ â*„q„”/ð ŒCûíÏg\›7 ”b{{›A–e,KLU£”D …ò4UU1ÏóöÀEÊö0èôqYk1¶¡jj´ôõÖNy½^¯õëëV†Ý¸Ö×\U›šíJ(P’0ŒOƒô¾ì`œm7ß@§ÓCÔ>QÔ&÷»Ö¹vŠ~ÔùXïõ«zÅŠ+V¬X±âç€4£pÌæp“õM†ƒ{{{üö?ü'¼øâó|ã/}™@VØ2#7©ò EU‡”éOz¤¶!7‚ÀïQEp°óªH9sùCñöŸ~‹(”Ù”£Å”bYó›ÿÁÉ{o½Á¿ú„NÙ½wkk¤sÓP¤ …9{%âÉí÷Ég UØa+b%¼þ“?cØ£EÉëo|—¨×A*(«ÁÞ}ŸnÜ㳯Üd1?ÁT%E•u#<å+±¶B{‚l>C ÆøDHÃbÚÊb…ÔÄ‘OckŠ*§È3ª*§Êr„“ìe)ƒÁi6£©KÖÖÖ0¦fw‡­3gð‚vØðÌ—m Ž%$J(¢Ðg:"ovÈÒÊ‹0u‰«3´4` ËLä]ÙåÚõ§¨ó†8sp¸‡|Ò`ŒaÔÙ¢;"1ô‹v[ûäá}š*ç(Y`qœÛÚâ÷PJpÿñ=²² ª*ÎmŸåñÎüÁÁp„i*ü°‹Öë žR­,Uhœ3híaP×xRƒ¡ )Áº[¤’XkPBR65ËeŽÃÒÔi³ Žc¢¤Zs4ŸsáÜS¼òÊgˆµ¬‘-™ÌÉ’¡®sŠ¢am°†ò|²,Á9‡¯#ºÃ˜årʃú>J‡<{í³“ 'óc” é…=là3_LY.—€ecã y–àû>{{÷yòè}úà ^~ñ‹œßºÂ½ïòúë?áÚ3ÏqõÓ¯0Nyøä ’)eðþ‡?äÇo~‹á`ÄÖöš¼fM9Š¢Á“ë£éÉ>ï¼ýcÞ}ëÇhϧ;¶‡aŸK—ÎQu+§vŽÍÍ3œ½x™“É‚G÷nqÿî#¼0ÄZÃÆú9"HQåH)0V1ŸÏÉóŒnoH'îsùòXËdï ï¼ù:^aGcš‚á`€„ôúëXác@úd€“2 ɬDÌfÔ¿?`{»ÇöÅWyûûœLS0|´©m¬mÓÆµ¦©ªª­¬ú©òBJÙ^€p…D*å+¬³˜Ú~¤,B %§4’ößMÕ¦X—eAY wwØÝÝ=µ^¬³1sîÌ&JJÊÓÁ¹ª*ò¤ .k€²© üjåÓ^w»ÄÚ)©êÏóPR¢ôÏînS™†<ÏhC£%eYè€Ð ÑZ“ç)u]SØéijçPRà„£¬*šÚbË‚Æ6§gþÇz¯_ Ð+>Qêºâ»öGÌfSÜÇÚà¶bÅŠŸ/\æ•—?· QüÃ7ë+Ö6·ÐAÌáá1ÃÁ7n\ç™§ÏašŒESZÒì1Ô±'¨Ë -$Òe”UM(4ódN9[ ”G¼q!5wî¼…T–“éŒb¹Àšš`¸Áû?üçž~í×$‹”ºÈÖQÔ5“å’"Oyîó_E%÷Þ|‹FA¤B* ‹éq’-sIŠu’Ë—o²˜ì¨ˆéäÏïðK¯~éìS ”ò0¶fÜ[ÃZ)šºBiGú,³íµaVRµ~J­5Ê÷¨Šëœ³TUEQÔu…ïûm‡oYb]…±ªMõNSºÝ˜,Ëp€øØÚâ„!ôõG· ˆ0fÆ>wîÞçüÙ ”òÎД%ÛNè“Ùílmnñèþ=Œ±ô7™'3ò4áìÖ6Z€ïiÊ*gøðÁ]FýQrçþ}¶FëÌg|%YfKÖF›LÓ9:ôH ¶Ïl“æÆAUúý.eYàlƒ4ck°†ÆÑʱM»m†Ö/úS ­°­¤»,K”ôÖ"N¥±H…P€­ÑÊÚVöšç9¡ ‘R“6–Y’!Uƒö¾ïᜥɉ!Œ|„’”U…ÅÑétI Ãш,ËH’!+ò4¥GDÝË4UÆ óúÛ?jC¢¤¤Ûí“§Iûwžrf}ƒÉÑ>M‘²ûä.çÎ^æÚ•çéÄ}w¨kËÅs—xøè>ZÅ ú†º61 ® ''Gô:CS1)Š’õñˆ'·ð”¤ˆÃg Â(ÄÚ„pþ쪢¢°9qg@ Ù:?D49Üe²8áä䘗^x¡ZhaÐJv"Fƒv ÿÎûw‘*äêÕ§I’¾ÃÈW¤ûñôUb? YÎ ¥nŽ9³}íÇ踇×íRKèÇ£±Š"7"çö[8ž¥llo‚h«°*Ó…|hŸ‹µièDñé ,Qª­¹RPmdzgjlš·÷ Ùn©ƒÓú3'¦ª8”h=ÈF‚ @˜/Læ3î?|€©«¶oX.—È­3ô:]b“ç9Uãúƒvˆ?}þ&IÂl1§®k|à ÷‚6Õ»¬ °#~* o*B´•làH’¤•š;øí½B©†èŸV¼Yk©jƒÉ¦xZôûDžÂ!}ïcíµX Ð+>Qþôûß¡×ð¥/üò'ýPV¬Xñ O{H÷o®ŠüþÀÏ>ÿçwÈ÷Ýï}‡wÞ{“ço¼´¢8{é)³6¯H‹Š0 qXž½ñ,ƒN€k©ª%-Î-qÍ’åâ1žß'l0ÝŸR'KÒºDéˆp´….æÜºõ6²1ä‹#ò,e¶H0fÀOßàsßø&šwßøÆÔ@M±\°XñÔÓ×qîßýßÿn½û&Ï?{“^/&=Ž>ähqDžV,²œ¤¬ùË¿þטLˆá˜ïüð‡•åoüÚ_er²OSgŒ×·˜M§Œ‡[œ»pWÙ6%× ?&­gxž×]¬-H’„Áà y‘Ñé,f Ëé1r´ÍÉ☎7 }¦'‡„ݲ.žC˜vè{²³Çhsx°‹ï‡Q!4t‚J;§'œÝ\Gi´‚Ešdw¹ûðC¾öÅWq¬HRV9ÎJ°†ÝƒxZá{Ö6h)hL›î';äù —Ï\d™U\»rïÿø-TІ"©N½Ûoø>>)=Îô×ÈkCQ•H­)›Š¢L±®ar²O¤iŠíЯµ¦i ä©dÛS +Æ9š¦Á—²Ý¬;pR"…ÑÊáÛiО¦6Ð45Gm, Ï— †gØXÛ`ccçRö)±–QoHž—ìgÇô:=LãxæégY$wo¿ƒ­+žºpÉô˜~¿‹§”6¼þÖk\{æ&R, ¶·ÏóÅÏýðþÝw)î§øZríꆽ!“ãÎlm3nrûömv÷ïrýÚ‹rùÒ3ðþÝwÙØ¼ÌpmÄîÞcòå í9n?|He,Ý0_±w¼‡VAf¸ùü«”ÅŒd¶h%Ç2K)«š·o½K¿·Æ3W>Ë•+7èuÇìOo}ÖΜaóÜeîß¾EÓd¼ûî뤹åÒÿÉÞ›Y–Þå¿w9ûÝsÏÊÚ«º»z-u«%!©Ñ:f°‡%` ƒÍ¦`›Á38À1„ƒ 0F†‹ÁxAa#‹Œ¶FÝ꽺»ªkÏÊÊíîgßÞùpRö`"pËnåóídœˆ<÷ÞsÏ}Ÿ÷ÿ,ÇN“kÉh¸Ë… OæcÊÂðÈC_‘#G°€µÅúm‹[×/ãyùlN­5¶«µ¡Î*¢Ù i%øÆ&¯süÎZj[cÛu0¥àчîa< ùøãÏ’–5×n\'|–—(Ë’$M £ˆ²®Y^\<ϲ™Îç!‚…b>Ÿ7rí¢‘ý[¶ê4a}vЦ25Ž’ ‡c„”ØN£Ô0¦™&çyFÎð,Í}gîÆT¬ÉƒIwV•líï2ŸLM'”uE«Õ"ð|ý&¬Ì¶ñýVÓOÎ@žgÄqD]×LâSW(©Z5÷³TyÉ4œQÝV—ÚjHržæT¢À Ή#wÓ]\ÅÕ¢RUCÞªœV‡¥c+diŒ1 /]¥(jÞñ¥o'œÙٹͩ“Gð<( éözX¶×ÔHi@¡¤M«Õ#Í2ªªñö‡C<ߥ(sZ­EbLÕL¤$ CZ‹}\˦Ì2B½ÅeYbY’¬¬‰â9««ƒƒ¤€n·Ç,š„!dE Ò¢ÌS„ThÝTÛ!˜Îbý6v•PU†ªþ³.fcš&%mŠ¢ Ýn‘%9Z۔Ř²ÈÈã¶jÓïõX[Y@;ó,EA?h3Kc\/ÀW.¹®)Êa)¢(¢( ²8i&¼ºñ‘VU#kÕ– Z6ÚÕŸ»¦ ëúE†–¼¬¡¥¶²š„ƒP)Ê Ïq› ©HŠ’¤NÈCÁ½÷ÜE¿Û£ÝYerãE²,b<â:mº­6I’Ðn÷xú©Ï±º¾FUäDó)ŽÒ¸–&/RÚ€¢(ˆ’˜—.½À}gîe6ßgg÷o{ì˱ÖO0 §ÌÃóÙ·nݦ^Õ¬negç&—®Þàèɳ\¹þ"[;7XY>ÁxœÒëõÈóœ,Ï',.,“x>yrï=÷±··Ãp¸GwÐgyåûûÛܼõ§ß…ú‹6E™g1ºªPZsª·LY–ÜÚ~…›[—9sö^Nž~€2ÙÏÆˆ”³÷f¼;&ððz.“a„­mºÝG£6«”EÎõ›¸±ù"?ôV«««8ŽÓ|_@TÜñDSQV9EaõŠ!Ë úƒyž'!á|Þg0ø^«Ù¸© E™ƒX®R •¦,KƳ Q"¥"Y–1ŸÏ›×¯m<ßÇs]ð<¢4¡(S²´ 2†iQÔ%TÍkL³˜/QRbj…mYœ8v’›†¼Ð”yÆÒÂ*I’°½»”,ô{X¶¢c÷(ëšÙ4$Œæ~¯ã m‹áh‹Ê(ޝ/M',®®c)e…ìN.ÂÔfia[kÆ£„²0¤Y‰¥4kkhe2oâ$%µÉÑŽF pÝnÐCkÛ²Éê ©%VààØ>JZ(m7Ÿk«e7öwÉkETVdÊ"g0èßéë¶,«y˜ ,›‰@H®<Ï#N3êƒs…Q`)ÕLœH¶cYÔ´TÄi‚T,ûó¾c˲p, -Eƒ©Á¶”máyJ}~Â]Ñétð<,IãåI´£QÊj¼ÚeÉl6AJk[PHäAGs^5 ôBò"f2ÍCpl,Ë¢(K0)–eáZ¥%U^l,ò4käßZeyãºn¢VAU”L³Ñ_§Hì?‰C}ˆ/(„‡ú‡8Ĥ(uøüZÃŒœ4ÏØÛÛ£¦B9§OÜÍöî6Ÿx|Η¿óõײ(Ý´EOŠxŸL’Ò£PÑx‹:KÑYu§ë@É©óqOàMw… ×0¥¡R†{î}€ë—®ók|?Y‘3'ätжæmo|kGÖÚ›7.%“$åžÓ÷³xüI’póÊm.]ºÈëο…çŸ}ž•ÅE\W²°¸„ßZÀv]ê² ,+’ñ-J´¶ØÙÝåÄñSèV©-,Ëb4EÊ–eÌx²CàµH’¤y A·ÓÇ…mÛhËű»™¾ú¾O7óÙc,O13ÁòÒi$²ɳŠÝý1Úr™Í"|Ë£ík,«Iø•²I~éå˼éÑ×a°º å”„²2ˆ²Y‹¤iJ·Ûc–(ÇGºmâdL]¤éc Kk, z¼éáóìg<û‹¤/Rš’Ýí=´k°,(K‰Ôº©BÑt™ÍfAIMÒxšÅØŽMVÕNSä8eY•[á-”t¨ë’4Mï„09ŽÃÚú £ñ”4M¹|m‹‡z„étÈæöuò²âËßòÞñîwóÊŧ‘¤„ÓŽgHCƒ­4Ržyî–évûØ–C·ÓÁT9³ù„Ýá.œˆÛ·o³Ø´zDs_¹líÝâÆÍkÔuAoÐåÙ ³¶r’åÅ <»Ïââ··¯3î1Ÿ‡xŽÃ‰£'Ȳœ“GÏRä1Q4'63fº©à²´‹)Û¥§)EfX?z†²È1(Ê2§å» ºKtÛ‹”õŒ(ž’åMðY»pâø9Ê2cžŒ™L& ‡Cvn_ãÊ+>w¾—l>§¿¼åù¼á-ïàúK—xñ…gX]YÀ¶mV×ŽÓ :eÌÕkO2Šbâ$§ß[`aà3,cjCš‰Ê ÅN‚å¸XA¯»„T®r©kIÛñЮG]KŒ©RÐî.3›GŒo^'NôPVÓá\UU3=®kʺF¦ª)Ë%äl_âº6Jʲ_¥hË"Ë2´T´Ú>®ë`4,©%²¢D¨ Æ“uQÇ1Ó8i$JQÅsŠ¢ ßÜ ,«ŒAYÏqPío‚²6ضM«Õ&ÍSövwÎ÷™N&¨ZŠV»ÕœÓn5d8·Ñ¡ß*èv(Ûj)€15êÀë쪦Ó{<!ê’À÷Yé ˜ÍÆ¤qãŸN“m[ $Ò= ;Ääté@â‡øbÂç{^ñÚB]¤ÇÂÒ"{£!7ooquó&oyý›¸çîS´;, óÑ>ˆªé]o‘„3*ÑBiIšD( –ãPfuSåb ‰ô¼À#‰gl]½D.kd-ÙÝKðüq|2ϨjÅd’ç5^W2ŸN8º~ iƒ‘†(ŒHó„IatÀÑc')t5/\¼È‰ãwqé•‹ôz<ß"<Úí6ÊrZ¡µ&Íšngϳ¨ªiŠ2A˜¥šÍñ,ËÐÚ¦ªBƒê&4LJIš¤Læ·Ð6øž}'±·25T5¶Ò”…ÀszÝ>•”ÌØ…AÈÐ4$½Ûë0Ý‘¦1 %LÚHLk ¶ã4éÆUEšU ZC]V!Ó\Û¶ÙÞÛ¥Ý9AFØJ²·?aq©CN©‹c`g÷&ZUBà¶Ù¾}· L&:â@VtÚM§1 A´t³9‡3úƒE†ã=Œ”ÔúƒÂ0Æ÷: 5RÕÌ’=Ò(BªšòaºÝ6Ý^‡*›àº.ë+çÈó”Ýñ Fó-âxŒëH,ÛÇóY Ž3 §äE†) ¼*A*CWHËe:!"›N{€ã·ÈŠŠ+×®0Ú.jJ©†œ¦)Y–QÂ@AŽ–"lžÐ IDATÚ©é´Z¶’š$‰IóŒýá>Q8¦í:´[]Û¥ª¡(2f“1¶­i\maY6žçá8ãùìŽ]b6Á¶-´° nT+Žã0ŸÏ› %¥©Â) –~uyÄ!>ć ÈCâ_ŒÄáóï5‡çžø$ÃiDm`yy•ãÍBØqȲœ+—®RTëƒ6Ý  Hj¬$Ljòùœª ‘Æb4ÞÅ–>–ï2ExíÇ¥Îcn\}‰,IQRR†Fi—zdqŒ%-†ó1·ÆS¤Rôû=Z^—7?òf”[¡l‡ xîÅ'ÙŽ¬¬±tä JiâñϽðYŽ?,+Ýv×!Ð5í~Ÿv»‹×k5\½ÒÝ-*“#izÛÂc´»Mk¡ƒ§}<»ÍÞö&^ )踂"Šè.´‰¤¤(+lehù>¶m°rÁm^wÿƒ¥p\­-:‹,†û;ŒÇs;ÀR‚+7_A¨ ½%†Ã9Qž"•BA¿Ó%J¤aÚuxæ¹gyà¾û¡¬±] Si„U¹”EE™‡DIJ͉ãÛ·oá8ǰu‹ª¨¨ÊiÙ\ºò2¥0|Ó·|+ïûÇïãGÿÁò ?÷ÆÝ˜"O¨MJ¡ÔP% žeSÕ†N×# CŠ4CJC^š¦6©H1u ¦åûdYJ^ꢙ4;– uMRW¸Ež§ˆºéÔî´ÛlÞ¸ÅâÒ:I:%Î2œÎ2ËÝ+GÙÙ¼F )òŠŒ¢*I³ª’ëW¯qï0›Œ¨‹”½Ýk(eãÄ]VW8ÿÐÃ\¹ð4Û7®ñ¦/};›7¸¹y‰®Û¡µ4`6~k‰y±»w“Ò)¹zãe.\zŠvkÀ]gï%ð–¸výIò<§l·(g9m¯ÏÑŽóâ+0RÐë ¢¦(#ªRaY6qÑï ð|‡½ÑY–ÒnõÈòŒíí«äUJU´ü6’’¢0Mu•Ìô:ø¾‹1†N{ÀÂ`%¦Ñ„,™aj‹xsõ•—¸réy–×N°¶q’/ûªoà™'>CÏÖ¸~‹Ag…•Ó§¡×áâõ)ÓáˆòÚÜØ~Gy¬®ž¢¬¬ÎQúë§( E”ÝfÁó¨UF£„ÆT³ùýíÊJòÆGF Íçž{‘A«ÃîÞ£d~0¥õIÓ”íímâ8AÚžç5j©ÑÚjz—"Ë€¥4m×çÞ{ÎQU»£!?¹Ë‡>ü/1ư3³qdÀõ¨‹‚p>£ãTÕyN›ÄüžçPÔ%a²¹y!‹+«­6¢ª˜†c†£=Æ{;¸¶ÆvÚ(íbG–×èú-6VÖ)QB Tã×ßÜÝaΨ³˶qœ ¾4*ŠÀfžÎ‰ãˆ¬(Bàû>’0ŽHÒÆNUbiÍüöœ0œ’')Ž œ6nË&KcÂùøU}ÖèC|A!Ä% Èr—þ“Ÿç“ßÎßÿºã8Õ¿w|8@?Ä!ñW„JÊ;S)×u1U‰¶¬&-Ûq€šù|J¯ÓtV#¡þsûZ7ÿ[)M’¥¤iÖÈ‘€Æ÷i+ ×uIÓß·‡(¥Èóß÷¹yó&'OœB)ÕH¬}‹²,Ù8²Îû~öÿâÄ]wqýÚV–c±³7f;žâÆ J5AbA»…’-$žç’f!5 ”À˜h^gž¤Ë¢Ê¿kž7~SÕÏUIª4%Žÿ§e)ªÒ0è÷quã‡5ó˜G^÷ >ú(×®½Äòâ“YÑøg+SCQåÔEBšE¤iJ^•ØZ±ºrŒñxÆîÎu:ý÷½ž­½-ÒqÈñcwñÔ“ŸBº5{—v8uú$yV±¼ºB¯ßfsóŽcáû¶¶wîíó¶ÇÞÍý÷祗/P–9µ¥0Ò¼äèÆIöFCò¬¦¬Úƒ° ªªÄU6iÜT-öÖI’E–Ñï X[[#ŠæeF‘¦„ÑìÎ0&¯r¢Ùœ0Œé÷þ¬¬×] ôX[=Âl6c:ÉÒ‚v»K†ìílsß}Ò}ÇÃÓO|’éhÂ4,8úÀýt–¹½§îÆLîæHúÂäDó˜ TÅel×`ô2›;fEsôˆ‹¦ERN±´DÔ‚ÅVŸ?ýÜsüÞ?ΑãÇtlݼÅþxZÑmµñœ­–ƒmÛÜsï½lmïråʆÃ!‹ýâÀ •E‘Q—%ýn7ðñ<)%^à§)­Àg:Ÿ±°°Lž&PÖx¶ÓÜ'*S!¥¤Óë„é…ÌfsêÚA£ IsÒdŸñlHšÆ`*Ú (Àh‹JŠ´`>aòÛk:œ•ÕThù-g6¡+»D£IãͶmŠ2£¬r._œ5•x|ßÇ´l*ñæáŒ´HÉË OÛ¤iJZTFâ-´v±lÊThË¡Ó[äÕì±:$Їø‚â¿Ø tv‰¼÷‡ù·ý#~ñ»î%¨Æ<÷±óäÛ¿‘Êø÷‡8Ä!þ*âкòÄ µ@Y–Í"R æñ€zìÚðØ»€<£Œ¶™…×Â(D ‡0µ°­¶“çÚ,aa¹eÛ›7(ÓK{äE…p\<ËPU%ãý-¦Ó)I&©+I·P5GžàØé“;y! ›—_`¸õ ašá/ãïüJ¦ÓþäSegcÛ]Ü8eÐQt»>Ú†ËW÷xûúÒñ6žk!RÉ4…¼ªYXè“D5ýA‡åõeÊ´¦*SnÜ¸ÒøA½6RÖ(©‘ÊÁ²Ãý]<ÇÅs[tü6Jƒ †8FR!+ƒa7uI ý³½m¬éO6ÆFŠÆWº¹yƒcGŽGÀõ=ªªÄ–¢é—µ¹h’åìíѶDPÕ5i’£”B)Eš6¾lËvØ0Â8âêµ+l¬%-ròÉÇr¹ôòe6Vްsë:“ù”7ÅÛ©¦—/ßæ“Ÿ~š—ÃKœ9{†[·o§ QÜ\G^æ¶áq®-jCQW˜ª†ÚPT9–Ò~@’¥TeIYÔ´révh·;¬¯opáºK>7nïpâøYüV‡+7^a½ï3ܾŽ2%–£Q²M”DxŽÅîÞ6»{{ØWžceiÑˆå¥ Nœ\ã¡! †ãÛüá¿ú]Ò8áõ_ú^ðÆ·¼“Ë.ÐëäÜÚ¼FUΜ<‡¯}Î?pž,˸¹u“#«+cxâé‘§‚A¿Çâ`™(Š˜F3¢,eÐ]æèÆ „Œ'c`jv$–•“Š|N9€±ð½i’eYš „!I”hú«¥a*‚Àö]”´©M‰RŠým0¶mSýÁ"®Ó$‹ïïÝâöÖu¶n^%h÷¬g­¿Èx¶Ãµ‹n]giq ±îsqËç‰ñÝœ]p8× IÒ–çÝÞdiMpjÙç…_¡Õ:íÁË—SZ¾Ç™SKôxÇ;fùù.mm³uó*.?Ël6Cjå¥U”Ð8ŽK'Ô, 9uâeYØ!ÒÒIHêª ÄËËœšº Ú ßöpû >CY”wäÐЄ‰eYFe q ¤Mi-$eÙ$Â~€‚µIyš$$–×lhaEQá8JKÆó9³É”ª®ÐŽƒÜmBÌ|å°zò –e5Òly]5ÎR°»?$+r⽈ÅÁ©5ý…Š¢`ÍIÂ)æó´l,mã9>íN—ú Wz4½ªÏú/(þÝ÷~¿p¹‘"üÿq†ïÿg?ÅW-éWµû¯.þ¢düÌÿÁ×ÿ1ù‹béÏýÏüÞÏ}Ëÿ¹½ÒcyýG–|Ôç¯Ñ˜7àïß?>Ä!qˆ¿ ôkiijÀÔ5iš²ÔïòÖ7œGZ„aEm/RT¯åR1Ú4ÒÞ²¬Ð^S”Ô¦$¯r”¶‘¦FKIžF$qÈt:¥¨ yÙøª+ ^ÐbÐ]`aeÇÓLG»Ì¦û¤iÎ`°ÁÉsEs¦ãF³/èPän‡²N°m‹ÉdHA)A4›²xü8QYe5Ží7áeµ Ýî- ×¶ˆÂ„k×®räÄ9„VP¥@™fj<Ÿét¸ŽƒçºäeŠmÛY]¡×õ(м™Bçe–Sx¤­ƒ ±m[®M–'ÔEM/h‚º<ßAK‰¬k’$Áq\²,ÃAVÔHÒ8ÁólÆã1–e5þne1NY_ïÇ1JÉ&%[ˆ;é(JHÓ”ù|Š1†ÝÉ6­8çOÿèãœì-Üóè©Ø›íB]Ñiµ›km7uQžçá9.Rê&Yj”4˜²¢Ùx±1ÍúBˆæúmI ê YÜÇoµÐ¶ÅÖí-´Öt½>§9̓ç_ÏÕë¯ðïú*~ï·~…¶ßxæµdÔ 9Ë ò¢`íØ·nÜ¢eû„³„ix¥p™‡8Jgi™B}ÃÛÙÙºÌg>ý1Ž­â¡û_Ç©S'ØÜÖl]¼IÜÚÙ¤×êb{}Z­6gOßÅÕkWq}‡y´4i³ºrûûûÌÓˆ¼HHÒBÖx~ !$u RAeJž¹ðZK‚ÀBkM’$”e…ëYÊÅu%³ñ6“á>£Á«ëK|òLáÔŠþb—Ó¾GΘY™q;Q´´ÀÔûضÇh¸Ã¹‡Þˆïô)Tt¶Ö\¹¾Í¥ë·yÏ×¼ QÅÜuö8ãÉœñxB•\ãPiEšÆázvãyVŠñxL™t»]»I©.ªŠµ•eêJ …@)ÖŠqØ„ÔiŽk{õP¤ù³@=)±T“ _Æ4dY–xŠ%hµ,LU¤Ù[×#O3lÛEÔ…@ù–lq’ÅŒ&c†“1q5ýÐŽC·Ó£íû8vãw6uSMUÕ5¢,RY‘M;EœÅÔIÎx¾VäáMxˆCâ¯âpýš„ßk3NPBx–€A«Ç×õiéšxÓiŠRráâœ$Wt—û„á>÷ë“‹9&1X2hˆ—ïâÛ6álYØ$ »^ ßépŸ(œ0›Ž¨*Cž×¸®”`9.ƒ…ƒ®ïe 7¯½Äl>é°¸tœN»Çl´Å§>õ lÇ'ŠRl)”M÷°¥©ª’N·Oer’8¤25y‘âº=â0G¤É+i°·©µpóæMêÚàûþÁ½ /Áqövw(ÊÛ¶±m»Qp)MU×x¾CV‚КªÈh»6QžaÛv“POq, ŒÀµl²ƒ Ò†P»„IŒ×òîÈ·…Ôu…mÛ ‘Ò6aâ)‹(‰é „aHžç¸ŽãXS'é‰VH©MƬ®®“ç9½^c [[›H«fH²œZ úK]Nn,ó–/ya2Ž¡.Ùð]¯ }Ѝbîº.i¢,ÈsÇÁ€&|LJ‰ &KsZ­æ½lwÌfsм"Ž"”R9²ÎÚ£½-:ƒ€ßùÐo`QR Â8€Âw=Œ1äÉ”¼H‰’„»ÎÜC§ÝÅ÷{\Ù|‰Ë¯\g<ÿ#î9÷ §OcëÆÇï~¥$7··¸øò 9qœÓwÝÏÇ?û1v'#½ *â,¦ßï3èö8uâÓpF]ï¤ ýE^zé%Ξ½›x;¥V5³ù˜²ÊJ²´´ÂlF“ÆïÜnã-/¢„¤È i2%Lb:E]PU®ÛHµ¶(ª’,-PÊÂr\¤i$üžà¨–‚º–dyA^Îv)«& Ë²I"…¡ªSFû¶-Y_k£meI¤Õô¼w»1¹ñÉMŸRvÑYur5;Û·¬®óòõ7WtÚ6GÔ ×·'<þôË<òÐid•rÏÝǹ5ÙCÚµ0h¥(Š‚y4C(‰¶-z^!Â[–%¶¶¨êK)LU#…¤ªjÂ0bÛ£=Â0äì‰ÓP Z­ãÉ„(núšm»!æqÝTc¹VS!åh ×j¬“,mT•µ@kM4²ð ÕEIA]”šª¬Z ”²0e…N-´gƒ’¬,,RÖ5¾ïãº.-ÏG A^U(µ1LfSÂ8"ÍÒÆ^P7Uryžríú.q:ÆVe9ˆ} Ïõðßi¡„”UU0šŒð—,Ið½àU}ÖA ôòÙY Åû®­rîusÎmÂÌxîw?À/þÞŸòò®aéìøo¿ãïñžûº(‘ðôOýüðóïæý¿øíÜåHDü ÿèïü(›ßú‹¼ÿkÖ°DÍè£ÿ ßüs6ÿŸ¾~ãgøàãWÙEä"`ù®7ðßý|Õ™9’ŸþŸ~Š—ùüÌwÜGë5½*ø‹²uŒÎ½sœ]ÿßÿ//±ü7’ŸxÏ \ÔSžùíŸãý¿ý).ì–ïùþ»ïy/ßð@;üú?zNÈŸþø7ó¾š_þÕÿ‘»ÝæGjç÷¿‡¯ÿ…?ñÁoãÅïûNþàïã_¼÷^ü¿Ì‹)F<ñÿ¾Ÿ÷èÓ\+–Ͻoûïækζx58ÿ!qˆÿºpH _{øÌ¿ýC¬ ÏÚú1Nßuœ×Ý}šùlÊt”ëeJ>ûÇW¹py Õéaê•Ü{ú,2~™E(§ƒ!ö*…,Ù¼ý U3XXEJÍîþe1ݽÈdž4^â jaÓkwßm±´²ÎÙ‡@Ô“í[¨Ò „¦vÎ=x7¯]â#þM°û¤u§ë‹Ë”&DÔ55U)Ø8~œY¸GžÅ”µD cYxžC8ÞÆí-ÓmYxއŠÏ|æ£Ìf3·!²µ1(QcÛ.ƒþ/½ü,‹ K~‡VÐ%-ŽëXšùlBÏv™„ƒ~*Oñ]´È)ª¦+9™ÍP–Æ–% –ÕxL†½],G³²°xgêU–%çck…´³pJoeb2™à8¶í`L…R’étŠg{ô»=Ò˜0 ±m›ÝÝ]ªÒF†Š4+° ¡zøõ\zòYÚ8¼²s³'6¸uë6GVV¹ðâË´Ûm¶v6Y]\b)-L\cY ÕjQT%ÞâyZà8Mؘ”0èu˜Ì't:-¨KÝUQ²¾´L]Âñ×=Â]gÏòÌ“Ÿàv¶ÖšSÇO´lŠª!B‚Òÿ:Nãã«€«“MâYÓ±]É»Þòeìîn³³›KžâñO~„ûzŒ‡x„ÁÊ ¡äÉÏ}šhž¡Ë)wŸ8Õ뗩ˊ۷6Y\h±³{ ­5½ö€Õ• {ë;ˆ£1W¯]ƈ‚‹W^àÔÑsìlïSˆ”²2ŒÇcF£)+«kP;äID]Vìíîàh‰£$¶mã¹-T­ñ´øOmšu׫0µÀóòÒP%[·¶ŠÁ`Àï0žŽÙÞ¹Åp´ÖÍ”º,*bm#e3µ‹2ÙßÝauã(Æ·‘ÁE]±µ½KfD%Ðp[¤Ë§³k¨l‡|6b_–œX>Ê~“+—$Óò Îà>òo|ý]¬o¬ñ7{ïäâËW…ÂÕ ¿ÝA;6Y™±?Rd9¶ë0èõQˆ;gR+§!¼Óé í:ô—–°<[k<ǧßéRÔŽë’¤A“О•`$®ãRa0 jêª"IZ­݃4ö,+R²°Ð)˜GeU2ÔYM^§”Tc0ÌÓÆª2hw)…!ð|Dm@I†Ó1µìíïÆQÔœ«e£$Vú=D]aQÑï¶hÁA¯µAZ.u ¦VÄUUÉB»‹ã¸„iÆç§\JY¯ê³þ ëâ`Â,îXHÅ¿ç\þçÿ+?ôë!oø¦ïàž’\ù7äøGHßÿÓ|Ë)—“o¾ ýÑç¸8­¹kY’ß~ŠÃ’á׈¾z•žH¹úÙ«TÇ¿sAÌ>õ<»ëßľ÷,Þüò[ä}?¦Ùø¥÷rC‘çäÅ_,(?Äü‡<П_Xšðyþéþ<Ný=~é»e` ãÒ€ïþ•oþï¿—ÿý¬àÒ¿ú%ÞÿÞ$ù¥ŸçÛϸHñŸ:'àžw=€ýÑÇyzøíÜ}D‚™ñÂÇ.£ÎýmîkK.ÔÕ_úvHyéŸý ß÷Û_ÿ=?Æ÷­„|æƒ?ËOþ°dãƒ?À#‡jŠCâ‡è×&Ú~—¨4¤iÊh4â³OÅTyÆW¼ûÍô:ðá³7L±ú+t[K [Q,Øs¶G1–í‘S#½¤e“îoSç+ diDŽÉ“˜8-©J‰!Gk_ûtº:­.gÎÑ \¦û{ÄQÄ$Ê©+‹‡Î¿‰ÑÍyòO>…å-‘d1º²Q–E§å²5ܧßY% ' ×êcM!5”Ú ˆ³×ÎSìnF^ü …Ì+泺n›(¸ÊFÈœ8 Z6ec+c¹ø~€¶5EV j )*”ZTXÌ'|ß§Óò¨òˆ²Lq¨(Jƒc×JLmcÙM§hËa4 ôp¬×ÌæJ)Œ1ÔyŽo;$yŠeÃ4œ°ÑÞ@+IQTHå`ªˆ¤lj‘´¶©,&Ó)«++äY#·.Š˜µ…užâiÞöŽwðÑ?úJc8þ†·Sds–W”Å”ŽãRvºx¶¦è”uÅ,šQ¤4m u‘¢-…ãjFó¤éÑU–€–ç'`+aWœúÑðØ[ßÍæÞm’dΑµu._xž$ŒÉŒáôñ3<öÖ·qõò&µJxýëÞÄd4&)SÇFU‚®ßÔR”LfÛ•¦Ýnsîîó<õôÔuÍíý]üv ™ âd†mÛXªÃîÖ‹ýˆFά©Qe”JÊ<¥,klËÃñ\Pm,„ÃA0–BEOI³£%eQBU3›í5žß2§å8jSWS!m„D¬G«²FKj0µËÂò1tÛÃÄ ÅÎþµ•%Žl¬‘Ñ,BºG°¬¯ØÃ6BG,´LX⸚¤(™Ìù­„GÏŸão{_ùïä©ç.RšÆ¶àh§±í4µnB"ºàë²b{º‡©*<ÇEU5¶ ‚6®ëâ·›ª0ŠŠ×uBérÂyL–e 4u]Så–ÖÍ=n@Ê&äOHIm {{C,KaÛ.EQ¥už¸`ˆâ˜Y8'Jb …Â’‘š lE–¤ˆª¢DJð¤…ÓîßùýUÓc]ƒÒZûtZMO:µÁRŠ"˱ë@¾^RÓ|—ëfÃKëâ¬^ÝL¥ÿbCÄÌüi~õ·®³üžŸáG¾ù ž¼å‘dßùýüƯ=Å×þØißýgÕÏñéW"¾r©Åè…§Ø’ââg¹‘½‘®ºÅã/¤ýšéË¢I„;þ0oyô\ñ(¯ïòä}‚]û»œ¿÷~øÿþM u8}~ÕðMá®§<þó?Îo ßÄüä×sÆ—MÈÄüI>ðϯ²ò?Ï?ü¶» ¤à±GOýïâ×~ùIÞóo¦þ%ιÿopÞþqþÍScþÖú2jþ"ÿúÜûýÒÓ¿á5ó'ùÀoÞäÜ÷þ?|ïW­b ¸mÈ'¾å×ùð¥ïäá‡[‡9c‡8Ä!þÖX½öpöìë˜Esʺbok›ãçâÌ™3|è÷ÿe,,×ÁêúPÜwÏiÖŠtøYæ£í.!„£ ʲ™ÏgH-X^Z¤ª*nß¼F]„óT5®ãSW)Eá²¼Þ'L3N8ÍíÛ×y÷×~5n+`8Úb¸ó û·wÞ>ú&L2ä_üÎïø] j„èûkk+ÔÑÛ èu)ºף½Ô#I2ÖOžJŠºÀ 4¦*xùÊUÞpì$++G¨ó„«—/Ðm¯"ŒD™×uÉ‹Š^¯çk677Ù8râ G·‹ãùì]»L§ÛA*‰²¦Ö¥¡4†¼¨PRS+MU´ÖdyŠëtQxX ! µy‘‘äaÑêºx®Ãd6G*GZS*Á­Û;8Ú¢  –Ô• ´1°½½‹ïµð}ÇñÈóœÀ÷‰Â0 ©JCM“îxþA‚qÊŸ|üãûûû|ºü8³YHšÅl¬/óÊ+¯à:>Ýn@Y^ì1› q=c*ŠÚ–%F””ÒÐw-<7 ®r–»QÑíµHÒ ®cؾù"GÖÖðì_WDºFZ.Âv¡JñZ ¥J!êT# ׺‘·ûM/qZX¶Å,Œ(­Œ?~â÷Y[¼‡Gþxå¥Ï°?½Ä›¿äoC]ò‰ýk´rq<{¼Ÿoû»çøÐ¯€03™'t»6ZKŠªl*˺†š‚Û;c|¯ËÝwÝÇg>û©È Ú IDATIŠâ:KK+x~% ЇXÚa:©X[Z$÷UN‡(QQÝ–Õ¨ý­ŠªNI³L(Af6Y–è÷y@7[c I’¡d†Öšvà‘i(Ë‚ªªºéo·;ÄIvÐ[®9~ê$ÇNžD¸>µ,-uY=±ŠãùŒ'Sòº¢ÕjQT)aèƒéàA\X žçÀþ˜­Í›l‡!ŽÐ¸~À³/_áé.óØ£röÔY&ó&d.8ð*K¥îüF”eÙt6ç9I’DM×yá7Ü¦Ì Úí6•„i„¥ÍD]5ä×¶a°`£¤u'O Ïs µ$Mÿ?öÞ<Ȳü®îüü–»¿=×ʬµ—ê]-©»ÕZ‹«„ Ç€ 3¶Çf{"O†˜1cÁxÀ3lcìÁB‚a«µµzÔ-©×êªêªÊ̪Ü^¾í¾»þ~¿ùã¾.˜V3bÐ"ODEå½u_ÖÍûî˸çwÎ÷œœtÒ¨ÃqÒ GXk©Ë WÕh I¿K =†Ãžô´»Õ~ñÿi­1ÆP5­ nìÞÖMµXn*´RxR‘Í Ê²$ÍÓ†c›P?!1¶@ûA.>ÊkÚƒ à…­+LŽöš™hßEs‰¾` tµÿ4—‹6÷>´I(eC>“¼îÞ„_yòöʇéôîæ-gj~ñ‘Ëä¯;ÓÞåÜßøV¼_ÿCÝ)¹ÓœO­òú×,á‰7ÕnhVÿƒµ[Y¿Íî¤RªÏßüWRÊ?E‰±}ø=üwï/yÛ?û~¾z#¸iƒ.÷žäbÑæþן&QªqoÄgyã«[üÂO±_½‘äÏpL¿ój¾î^Åýö'9úš¯"~öwùdyž¿÷Úžœ,ÎC¼äü^~»ÚšŠšíý6Þúc/þ k,ÑnŽíc}Œcã&¤_¸-ÇøOF$ 5KX©ùУuW ‚mJ¢PÓkÇœZ !ÛA G%Úô—Öñ´£¬+¦Ó1a JC:ΦXSB]àkIå yYáù­vBæ,gΜáp¸OeJ’VÈþþÙÑ>»[;<ñÔó¼ëïü—´"ÁG>ö(­¤ƒÐš*Í©m͹u¤°T¦"C´VXßà ‚f2 ÑaD]5µuUÍ VÖÖñt„n[®^~Š££Cœkj¼<ß§ª Jk¢8Ƹ9;7¶Ù\?…s¡|@Òê´qÂbD*ëšha Óiʉõe|Bjkƒá[¸¯”®"˜Ía[šº¨˜L&œèÅ„žÀR×%qØ¡°ÖÝ´Ãq„ukkB8æYöüºÆZG%”eN¯×[ŽæYÑÃ|>g:›áùšt>#Š"n½å=þ8ozÓ—0Z’(ô8sö4J)Ì|HVL¹åÌY^1±®¢Ûò™gZh< aßL’n·bÒTá«QϘ^ãh/eo!­ö€4σ&mÚ ÉÁ𰙃bf³ÝN›N·‹±PÔ–,Ÿ£kÍ|>ã`4¢ÆòÂåm.<÷NŸ9ÏÛ¾ôkXOøà‡~‡;n{½A_‡Ìó!W.m±²ºÄ7¼ã]<ýÔ§¹ºõ Y–ai*’Œ±,­áyÝ®æñ'>Î]wÞÃÎÎ.R–^§Ûî=”–h©šÐ½åuÆ£CÏ'Ï&Í,{Ý`á$JK¬©Ê¡”¢® Zq„ë³ë-ûÅT|é@KRS–àû~SOVfUÉd2&"Â0^,6ÄLÒû»¬llR•Aà!g9”•E¡¸|ý »»»ÔÆÐ íî):8„3 J–Û aàag†l:e4›G]„P<ñ©Oszs“v«Q‹ª!ÄZJZ­(I]ÿq™Dx>Ã|Èd:awŸ(H¢fÐpšÎÈËøa3[ûÁbÎÛ,B4 ÷y–a­Å÷5EQPÅ"X­f2™5×|пIì¥6hãpŠÚ†!ÖZ¬­©¬a6›Ý<×@7³ÕR4ÏøJ)j×Ô×y:@8×ô³k‰µ’Ðó14¹HrލÛmBÄÂðfGtš¦8‘QU“ÙŒy:CÚ cJÒiÆ+É ¿` ôM¼„t4ÄÅ5Ô ½qƒŸ~ÿ#\üÁåoúî/¡óØ¿ã}ŸÜå+½±Õ}€7Ÿ /£' àa¨Üq–òç Ú¤þGþ§ù}øšá¼aï¥oßË4G½xo¸Åíñ9‘^ûõ÷!øý|lø0Ë¿ù(ÙÝßÃëáþ²]Sc]ÄþëåïÝÿ‰»M¯öù‹ ?Æ1Žñ—Çî/>h­±E†X<¨_¾¶ƒi(mÊÆÚI Xê¸â ùôˆ¬l¡‚6"Ѝ‹1±èø5ŒgL™#AK(]Ö’ºtº=ʲ ÆÐï¯3 xþÒ^õê70™ŒÈÇG˜YƇ?ò fµb©?àcô^ž~êqdíãD‡OZ¤$¡b6Ÿ€0AD«Õ&µ9¥±$~ˆh\Q ;JyTeÉl:FjÀ÷é º|ô‘ßlÈ¥”-²¬ñ”Ç<Ÿ±¾šðüÅË´“Bú8$Q3Nèw{8gH’6Gæ‡ÙYÐBÆ€çiEWI•ŽÈ ˜Œ Ûýæâ ¯=ŠÚ°xÈùS«H)±Îâ)s†ÐO§ R+¦Ó)V B"F¸E8S¾HÞvÎ!R6Ÿ/æª2PT%×®]ãU÷Ý·HüÈóœ3§7©Ë SeEÁ™S'¨«œ²°xZPÕ¨®¤Ûò™N+ÂPNÀ\H¤3`+Úoú˲¤(J¬5cpz½.AY  ¾ï“$ 7övɲuQÒï÷o¦l7‹r(¦‘ò¶C~ÿíÄB@¹ÅGŸ˜âŸ¾‹µ@à¯}îc‚ÁCƒ7G?È¿ÿÍߣ÷QËëþÉXѪ—;WšžÆ—ÙöVÎsÊ˹tIpâëo!¹yÊâXy>Æ1ŽñÙ }Œ/.ìîPVHÇÑdŸÃÃ=ª¢d0Xf}í$‰5¬Þ¾ÉrÛ‘O:XcyuéRL="ð&y+3L‘SåÊ9´jœ5‡FûšááAÒãÌÙÛ0Æpñòó¼ííÿÚk³wõÙxÄoýæû¸åÞ7ò­ïzïýùÁÎþiQ ¼ˆ"Ë(MÍ™“'¨ò#ªºÄ:A;îà>©³”eNÌÒ#–jœ‘N ªrÎlH×(cuEøÔ¦dcmc QØBEèûÌò1³<Ã1}d·KË%Œ'c&“&Éy¡ŽÇ#–—ìnm±²²Bš¦xZ£”b0ècMÍó—.pêäiŒµÓë«W.6„ÂÓ z=´4”ucõ­UN7RÔFá«€ª(PZ6IÒ²±ÄFF8K•)¦gszNSßäǘVNœd{—µ•U¼0ÀA“¤.j>ò¡ó–/{;»ûGll$8¥Écip‚[ÏÜÉðhŸÑdŠIn9sŠýÔ„VÒC òS._~„Ë—%…›qc»à×¼[VX—òå_öUxÒaª9gNßÎå.RUм·eU3š\e>_fóÄ­˜ÂröÌ)²ù”Ý[¬¯Ÿ$èv©êgaye€) ù¬bmí e=gwëy¤/ð¼Æ‰(„ ZÌ—…A)-cŒµ8)‰¢aÖó)ŠŒÚ”ø¾jª—”¤®›÷5ŠšTrk •)±Œ¡~˜`¥ÂÒØ¿¯íì#´O–;>úÉße–e”e…Ò>~ ´¤,J¢n—§¯ïrçíçéÅšº¢|°%[Ï_&Ò’~@ÆxÊOׇ£!Q².x>AÒé÷©œ!ªk¤³¤iJmš:·Ñd4ûsÔ²l8:­6V­õbaÁEÑÍÏ‹òà(Šˆ¢hQU¥(Šâ&iÍ󜺮Qž&Ÿ5ŽŽ2/pÎ’f3²² Óé1¾ïÓNºA@Í9I…ʲäÔéS”eÉááa³àl£xg9ÖTT¦æ`8šE)yÞ~ ´’ÊolçÚ÷Ã4›¡TL,J,žÌÓég‰®‘ø‚%ТýZ¾ó›NñwõŸñ?„‹¯>—~ïßðË;'ù¶ÿæ: V¢O¼™¯?÷óüä/=ÊÊ_g|ïM_ÎÆÏý¿f×xל&ø307ý?ö?vœÂý ã³hGúéÃþîˆÓýä¥'øÄå?~/d¸Îw>Ä÷¾ó ßþ ?ÈEßÅÛo\ø­Ÿáç·Oñ?ô]!Ï} €èÞÏ·|E—wÿ«ŸÀv¾Š÷<8xùÄlÝa£#ØÿÄïóÑNñÖÓ/Ù>÷Þý޼ûßþ ÿX~ïxpƒ(ßçÚä,_ûö{èÇpãÇx Žè/>”UÁhrDQäTeÎèà:A^¤lïípëÆ›ØXö(æczKwbëŠÃô+Iˆ‚ršb 8S“¥3ºíÎ46_%=”§QÊr8Ö6u`ólN¼˜a®ªgÎ ŒuU…¯ûèd"Ȳ‚ºjj¥|ß'ð}LUcMÍx2Á9‡”ê&yV ›·ö$Ö4jZ“¬- ¢08î7Äe\ H%ð½/ˆé_ °¥ÝåRø`#¤ò‰[]âŽ@K¥µUöÇGYŠs¶™³÷Yž>ž»Äù»îb6ŸÓJ<Â8¡žÖœÈwÞÁÎõ«7UÏ( 0¦ÃáÁ!·ž¾…<« ýŠFÝ¿~㠽¥ŽÆûäÅ”vܦßYi’Ó.O=q, z ¬°®I‰‚­C´ŠÐʧ,Kê2'ñ¼föVJ ¢U¤Õô#KœmȧR !CJWâhÏGh N°Â!¥d”fT¢¢(jJSST³|FžÔ×jd( |M>Ë8šñ;ðøê/y=qâ!¤AÁ`ÐEÂ: ¥}²Z5!^išr´¿K^ì‘ç9“ɈºªÈó¦3=ôVKX'(jÃÚ`™ÊÔAˆRŠ^§KY–x^ºÕ|í†>K™‹ú· ™•ö}’$nfþ“„4›³¿¿Ož•dó)BŒ­È³&…~4<`ä$IÔÂ[k(tbLSTzg›ÙûA·‡5ëR Š,gšeÍX¤’‹^jK]DIŒ©ê›÷‘Í2´Ö„혪(gÉâ½ÕZ¡¤"‰Ì+ú»þ –@CÀmó‡ùÑø_ò¿¾÷§ø§Žå[äïüÈ»ùæÛÃ?îæUk¼ñkïä§þÅ/ë)!koä«Îýk~º~_±üÙz|]“lg̱û•Äg?@Vl}øv­ÅþÛæþÚKþyù›øÙ_üûÜóÿœŸHÞÃOü»çö+ç_Ç÷ý/ÿ€o½#Z¼ß!çÿöç: âÎo|;§~ýç(¿æÜ—¼œÙPk|å÷} øá_ç=ÿç—òð?ºû%Û÷rß÷þ'ŸþÍýÚ˜:ìsÛ[þ.oýº{è×ãÇø8NáþâDxz',ó¢äÌÆm83ÇÖŽ¯ø²/§¿äñøW¨kÃû~ãçÔÙ.ß÷í_K:Ú£6%žQTÃdÑ^]áhçÙtÖ<ì+E^¢xÀý·¿†bñÜríÊ3 yóW|{{ÛÓ9¿õ tÂü£ÿžÏ<ö!fG{\=šã¤&ü…B>æ-Ó£¬çC]3¹;^ÂI‹ö<î¸ÿÚƒU¯~©ûØÊb\NÜéÓR!i:'ñ½©xAˆ--aèSÇ!­^B]I¦7¶Q:ByÚ)Ú­.e='ôµë/´û•‡1sJS“Äm>óä%«]ö‡h :ˆH'S2[3e)©ÍŒ0¼ [„¬ ¤FkŸ¬rxAŒp%¥­~@UxZ2žMÈòœ¥n„c’Íèä]B?Æãñ˜^3›Mi·Û GGxqÄ,Ëˬ“ôKŒÆGHÆX&³ÖZ:…úç{X«Pv÷÷Ð(éÑŽz ‡G, Ö°Ö²Ü_c:;"ð5ãñ¸!òÆÓ!Î ƒ¦wZé~¿O»×e–ι~}—swÞ½˜^ckûº6QÜf^L¥ÀJ.<ÿÏ<û –—Ïñ×¾úmH!È\FÜéÒö^}×yfÙŒKW®²À?÷üÊü­EÁ‹÷Ë9ÞýKà»oîô|7?õkß[ìK^²ðà·ýSþ·oqœc ŽSÝqŒc㯠ZíJÆÔÎàÏsl™cÊŠ7¼áa–W–øï{?ËÝ%Z­ïü¶wòÀƒç°ã‹xJRV5‡XOÐ c¦GCL™c…£F ý„å~›îÊI`³ãý}vv.r×]qöÜm<ù©GIg„aÌ7|ãßFp´a „ôˆBçÓ4¥(«9J ¤Ž˜Ž®ƒøA cç´»¤ôÈçc„ð‰¢€¼,ɲœ›ËìŽP*š Ö0ŒxÔ²Bûš"¯›Ôkgð<íEX+ÑAÜÌ@zL‡CfÙ $ôû]öö˜fsT¨iµZ˜Ú0šNè„ÙBE›¤‚ÀÃ9A^Ï©ê9JhÂÀ£6Ž(ð0Æ!xZãûP”%uiJ’9 ‘B %55M غ,è/-#hf8ã8¦ªK QÍã DjÅ,6–WÑ̾çy†1pôºm´öÉó9eYÒjw18Šºbÿ¥Ýn—½½=:é|L†l¶Zø^šTWc,Y6§Óm' y^’å9q³qò$N8Z6é|†q‚ÒZŒ¨E@Ó©S§¸ñØuâ¶â±Oü>ô0½Õ.Ëk«ìÚ‚«[Û,-whµ:DÏh2æ¶“kT‡#ÏG)AVäDAˆ©k/$‰ʢƒa$ùØÇ>È7Üz'wÞ÷l Ïo=MµèŠ% šdgWb]M»;àh
ŸÕ{ž¥dYŽs‚¤ÝÅ÷C,Ž4MÉG9e‘±¾v’Õõu„–(ãðES3Q“–íùȪ EÕÇíîÞ Ë2\mñ£- µÙ¢zqæÛX‚À6©õUŽÒ!HåK겺¹0òJâ „@ƒ/^^²_HÄçRï„D©—îzé÷{¹”m¼ùÂãîÏ^NùÓî…Ï~íg¿ïÿ)ǰH|ÉÎ?qoÜ<1þ_·ÈK·ù3Þ¯Ç8Æ1þÊC ^Ñy­c¼2ȳ’ÑÑ:´[]üV O%|äã¡Ón‘tºäÊÑK>t7r8œ2›¦ º}VOn0K·9غ‚sÝê §sÝýÕS„¾ÇÖ]LUñÌ£e>Þ!Cî~àõl]¾Àîö˜¥Þ€~«Ï¯üÊóÀCo%;¸Î³Ï}šþ`“²N‘ÄQûï#ûÃçqΑæ½åu„hOЬóèÎ3ܾ´Š¢FÊë2ƇFû#곆2"˼y ö=¢ (꺤0%I²„qp0š"ýåym\%P×xfrtÈÁî6ó4£·c-ÌfSj™ð»ø=Þøº·â)Ÿb–Su ö=&iÊ,Ë,5Ae˃e•G +ý>Ó,ÃÓ”>‡„›¡”$cŠÒè˜æÙ¯éÁ=Žèv›@²½ƒCNØ@ GšÎ)+CEÌçsp‚ë{»œ=s†8LÈò)ó4%‰Û¤iŠŽÌóñçycèv»ÔuEFEƵ«—ñ< ¶yøw΄Í5hõWÈçMxÔݯºŸë×·q”HO³´ºJ^´‚v§’8é°º¶ÉððÛH$uí³w¸Å‰õÓÜrö^ýª7ó¾÷þ*o}Û7²¾¹AÒ[âÄÙÛ8¸qcwž»•ç®\¡¨k6ÖÖȳœ¸†!óyNœtñt@à2±”ÅœªN©rIày|üÀí¯y5·¼æAöo\g–MÑI› ŽPÊc6'1‡ÃRÌ8qbƒra±oE-ön\gm}€l÷(ò”(NÈ«’Ù|›ªvhe©Ï¦±0‡ÑÍ*&­|/F«ˆª¬ Ã'ʦçYŠÅ¬o“¼-„ Ïsàe ~â Aœ4auy™¡ê‰’Št:£ÝNˆCMìÌ‚¿ö‘H<-Rál„V(«Jðñ§žç»þówrßëæñKÛÍ9(Å|^PÖ¤ä`:f6›qéòsTÔ!ÐBú‘Ÿp²Õ&Š"ŠÊÚI‚ïIªÚÐMbjS3ÍyîÂ…&ÉZ5d5ÐÑÂâÜ(ÂeYbŒ!ô½&‹@I”çÑ #ÚqBšf¸E´t’vÜ&9£´f4Q×=´ï¡•O]×Ìçsêº"Ïp®¦, |ßCIÍÎÎ6ó"GIM¿Û¥»è¦6ÖRÕ³Ù”ò #iµ¨Ê’íímz½ýÞK½žT\?Üg6›QTQ‡½¸‹0Mm\V•Œ'3„iœóùì¸ÆêÇ8Æ1ŽqŒcã/‚¸Å‰ EeæÔÆa ¶Ž¥•Sk¨«Œ¸%¸ÿ¾³¨4cžÍȆ)ÂHL7çèà€"/ ’.¡/xáò:ƒu:ƒ ¼ÀçhzH™•DÊCÕ¼0àÖû^Ç|6æ‰Ç>Ê-·¿šíímöö¯qÿý¯¢ßîpá‰Ëè ‡ïy8§qÖqö³ #Ê IDATÜ­(iHœkr3ã(A8C§•0›ŒY^]%Š"Št©|„(ÐRQT%GU¤LQÒÇ[X§( ë$v3ƒÙ¨ƒ­}´ò¨ªšv+â™ OãiAa,Æ)¤Ð‹¤_ÇÁtHÅ|üÑGyÍ«î&Iêº@8˜¥)y ¥±øž`ÐíßL ü,/x1]¥( ’$¢(ËÆþÄeM%h©pÆâyYž“—ÕÁ¾‚ÌÒ å,^è1ŸÏi·Zh­™Ì&ôKäyI«×c^L ¢°!'a HF“1Ýn¥}<ÏPUÓÉ„ HÓ&UXàȳ‚ÙBM/«EM“Ô¤ó ß×'¹¶}•(©% =ò<Çó}¬mí1©I’óÙ­õÍ`)D‚c.¿ðNŸ¾7<ü:ö®_gãä ò¬à¡‡ßÈoD‘ÍBqbe•íë/pË©sA€ç„¡¤(K’Vg,y1AIŸÚ ¤8¢*rêzÆ•gžaim{^óO>ñ% 1½^—l^‹y-ñZ!ùÜ1è ð#Â@1î7iä®I‡ÞÙ¹†u%QI”€ÐyS)¦d€¶¶Y ATÆ4vm-pV¢õâZ V~sϸ&‹§¬j’V/ ¨*ƒ° uZ6BO>ŸãKA¿×âärÃ-ªJ¢EˆÑ!Úoú–«¼ ßjáë€,+ùÙŸùyÝé4¾Lóx$‘B9H¬ÏÑäˆÊÔŒ&#<¥ð”f0X&ŠÛ@óù9::¢® Ù4essç,aÒ鶘LSæ¦ÂbȲ ¬ G€@KE’$!8::Â.*§²"Ç L»ƒ) q“æÎ9¼…:ä©Y]^¢¬ÍBÙo®/¤(3 $Ëfhé1™Lp® ŒCBÏ MSª¢Ä šíét²ø{ÌÕ«/ µ¦ªšó>8Üu7í¤ÝTo>“ÅçÆCQÔh!±/¶'YG’´ñ}¿©¢{qL qŒcãÇ8Æ1þývŸÄK¨ëšñhÚ"”& BN¬õ¹ýŽSÜrjƒÉÎEF“Qki¡åÌÊ’ÑÔrþ¶ìn½@§»Be¼ˆ­­-JëXê8¸vík:É2›§nãÓ>‚ÍK>öñ?â… xÝÃo¤×^¥ÌFŒ§9KK8Sã)Í$sbý‡[,“É„NwÏÓLFSêÂ`ëŒN§‡£¢ªR´'™L2Ò4%hÅÔuI–Î@:Ýé!¬Æâ°¸¦;6n3iµʺÂ!PÊC9ª±W/u\¾|V«‡Rš,+hu\Üzß‹)mÆ,›ÑŽªÊâœd8M™Y^²¶¼L¨Ê<# "  ’¢ ‹¢ˆÉd‚ö=5hc+´–רCëÊ ”ÆÔ9(‹©ÂWL&3V–M?pœgM(Öl>%Š"´ô° Í+ʲ^T\ÕcÈóœ^¯ƒ³­sLeÁI‚0¸iõVJ2Òé&¤óyc#FºY0–édŒî©F--˦"¨v(O#¤Ã“AQÆY¤ÖÔÖàë“Ù O¥<öÉGXZ9Á©3ç‰<…­=úƒUNŸ9ÏèpS–»¶÷¯0ž±¾ºÎ$›aÊf$ ¯Jö‡‡$aD»ÕA«¬àp”ã)A™¤f÷ÚŒµ×¼»ï¼—'_ømß§ª ö€À¯ƒ%{»7X__§×ï4iïI k-­néæM[próû‡WÑ¢™«MÓ9aÔ&Ž[€$Š»#Á ª¼ ×ë5álYJ¡” ˆ"„EEU´öµÖZÓéti·;”YÎt>C"Bâ>E^¡CÕôC{óyŠç,-­4NT×ô];c™¦sZ­‹ÑõEu—kRî¡2MÀXä‡Äa„RŠ4}™úœ¿@èc|Þq¦sŒcãÇøb€R>élLejj U]@f(Ò‚¸‡w¼ãmÌ'#>óÄ“ôWz,oÞÉ…«WèF]žy䃜»åIPpñÙÇX^?C¢70Å>ûÏ_âF¾Éò‰×/}ˆ|²kõ¹çÕoÀ7‚ñõ(ò­çn=ÃæÙsŒn\aëÒNœ>I+ŽH§Gd™ãöÛ_ÃÞáU„(¸¼½M'Y§ÛI¨jGœ,!TN1³qÛ”ó}ŠlÂh4!Ð>¥•Üqþ..^z«*é‚ð±µAê[Ut:=>õÉ'9ù–³<óÜóÜrËyœk敳,C’Ç>ú)n¿å.¼p°Õe8L jFã-¶nl¡}M]Wh)˜Mçt’U]àG»©Ã7%Y^³ºÔƘ I€©,Q«ËÁxŒŽÉtÆÊò‡ÃD­ý¤IAžÌÆZâj‡Œ§NœØ$ÄqÌ$¡”Ç4›c «KË”“1%5kqŒ+º<{éKýN‡_úÜØ²¶¼J–Λ”íÐg—V«…öB‚ FF²QÙAÃó4•rëНC!ižD>ù$C¹’t6$Œ7±õ„ªöQÂᬠ¬-Z+¬…¤½ÌêJN!}Íð`—•åu´µ”UÎÊrDV:v.ðžßüU:K'øöïú~Þø–¿Æ§ûW_¸Èd8ÃóÆùœb{›•Þ*B <°ÜkSÕs.]}k÷Üy/¾Š8¹q³É>RÜ Ó[âÿþØoE-6—Î2M÷‡hߣÝiy­0ápÄöÕ-¤lÔßÎ`‰N¼FQD¤ã+„¾‡1­N‚R·1™gh­ˆ¥%ô›4òÒhâ$¦¨*泌Ê:*W2™¦L¦C°%àˆ¢!•ux:"ð[XÛʺ®Žr„ò¨Mß©¬!b¬­i·»¤ã9‡[Ó6÷ÝqŽWßýN~áßÿ>×G%³:Ëï…l®m‚¡5à°µÅÓ!:ññ}¥§7O#DÓõžNgdY"ZÚGV–n»M y5çy¤Ù¼IŠ_Œ[ôû¬1LgsŽ&cÆÓ Q‘øI¿ù¿f󌣼Yι†/ÜM VSѶÔë³â\Cž¥¢05óbÞ„! KÜJèôº!ȦSœƒk¤¤ÛïCm˜LÆxJAmQRyþb»\„Áy„w3Õÿ•Ä1>ÆçMýÃqê1ŽqŒcã/7:I@Q)lÕ¤ '‘â¡×ÜÂæ‰%ž{úø‡Hèû<Ü~-øäD.Ký»ï¹•¢šáªIo•¤½Ìdt…W¯3,[´–:xjNí2‚@rféÕ„É2—ŸûLÓëjjá±¾q–ùÑ>ÃÛì ¸ãäYfã#¤ hwCΜ9Åöö%ʲB MÜŽ™ÎÒE¥MH–¦˜ºÄÕNª¢ |Š,£?X¦×ëqùò‹‹ß k©ª*<_ó©O=Ž–W—é÷ š$fç aóáÿGâ°ÅÞþ“tL–W”•áÄúÏ_z kë¦ÊK $$ ¾2ËæŒ&cZ­nÞÔÛhÕHTB´ÖdYFQ(åÐZcõ=-¥¸5¦ñ6£”¾YïcŒÁaèt[TÖ„Í|­sO ´ŸPWŽN¯‹>š0™LH»¾lúks!pT˜Ú'!EQ†!QØ8uÞÎ6³›‘åS¤˜’xaÁ®-ÖÐXÊ…¢®-3i¬]üŒÖâû>8…”yA/êp£("gie™-ŽF–WW©ë3gog6›ðØÇá¡×¿ž[ª¶<õéO²¹ºÁÅKP±¢ÛK˜Ìjœ­Å7sÜ}þ~nns8Ùg¹¿ºÏ‰3÷1>ÜbóTÍÎX[ÝÄK»5aü6G£¶ÇxšÓëˆ:1Ót¢$ÏF7&¬Ü»R1ua©ñapž×(£ÆØ¦"L4á`qÔA ÁÒ’CJoÎt:d8<¤?è \Ð\#Ž a ¦¬°Ú"esq 1œÍ3„P(åaHU^0×Y“m;xB0>Òîy¼êÞ{™?ñ 6“ yMÚ$a‚³4j*á5}áAÐm·ŽFäY†±†ª(0ÎጡÓn“D1a2 šÔê±Ìó¼©RÓ)¡¬Ç1Hq³çY A½YxÑ]TXK§Ó!šk2 rHQÍg!ψ‚–(éa8¥)oªÀyž#”D8(‹Š Èæ³&E[…Lç)I«ƒ­4a×1u«MY–”e½øŒ*d[Ý x‹¢­›þ÷¢Î888d>ŸÓï÷iE-’$!I"š }Ie®ªX¦ã :=w÷ØÜ<ƒçù,/ŸãÚÖS´Û O=ó z½aÒŽ5e‘râä-8§°*À¥9a¤ ªð|Å¥ Ÿ¡ª*Ö×VHÓY‘Òívñ£no…4«(«fþÖC)вÂ)Ag©Çx˜SdŽkk8+HZY–QšOFÑ"$¬¨ð}‰c-q’°¼Ü¨Ò¶¬ÀÓ˜²"ø>^àé_f BšÓí%Üwç]\=8Bk?l×Bß§.+jkÈ˪é™MB =6Olg9ûÜkìÿAm˜Ogh­‰¢ˆ^¯KÒŽoÚ¦P°è>ö¼&GÀ ²,£xÄqÄ…‹ÉóœÀóñ©uã„™Ìè÷:ÏÃѨÐͼ~H^LÇãæëù_{ä.G ‰” ›ôò$F-ìðY–aÊŠ4Ï  aPÓ4]ôï!KƒÚ P¾G1Ÿß¼Ÿ£(¢6†NÜ,*ùk-ZH¢VÂÌœ>} ÏóPR¢DS;–•EmH’­}z½Á"EßÑéôøSŠhÿBpL ñyÅí·žçùKÏñÁýþçûTŽqŒcãà¿ÄÉÓŸïÓ8ÆŸ3 –Ùðˆ£Ý=Њ Šh'†QÜa^eˆÊpû¹UÖO(ކ\ÜÞC%-nÛXÇÕŽa:&4OîY2]r["‘nBmKœöIZK\|æì]ÂÉ‚I¦é­àp¸G 6Ï2è¯rµ|’ ÝfÐ_"/R„€ù|Žç…dYF¨¶ª)Ë’åÕKVæ ,ÎÖS£tc•®ªšY:ÇÓ>eY#…ß§Ìr^xáƒAÓ§nEIŸk×®2Ïs’ŽB ‰Â!œàÉç.2OÇ,t`–z1ŽxöúA]B?FJ‰q,úz“É„¬øØ{³ËÓû¼ïó.¿ý¬µvW¯Ó³r8œG IE)™°åh!F. —ù’¿ ÈE€ä #€á$p´D,ÛÚ(SeîCÎ>½ïÕUuöó[ß%ïa+0˜„:ÏÝô4§ªÎ9užï³5$YŽV!j›vߩĆ\„¶fš®5H)éê&8Þ\G¥HĦÁ·¤_¬‹Ðàì-‘V€GIA'(Ù±Žã'vÆcN»'XŠÊ„´ÆP®ÖtX.ž;`>ŸƒpììîðÑ[\»r kýFÑVÁâº)Z2m°ÁzONOØÙÙÃ8‡–ŠÖ¤?F©Ó ÈVë%IVà¼a<)Í[ßûýÞ)5«eI- öi;Ëx´Çlú=Ç(»@¿ßãö­÷Èþ²OZô¸tþ³Ó¬·ìpëîG¼ûá|õË_åÖG¢Çj:¡¶-]U¡…dºšÐË LfSî>|@Väì F$:¢ljN'gäiÆîî.ÆF£mÛn&ÜRŒ1!_Œ#C4cµ^1[.ˆã0eÇaê*Îrš¦áôtB”„¦o/‰Ò¬Ö%i³^¯ì¤TuŽbº® .ç‘f½^†#™-ô8ÏrºÚXÂ[f³9ý¼@JTxÓ!„!ˆb…pÓÖx^WlÞU>l ôŸ(´Žxñù—?釱Å[lññBð±^Ë·øxéˆùÉ–ë5¶×ÇÝ}¼ôXkéw¸zñÏ^¼Â³Ï\Ä(Ï_½sŸª|ùW¯ÒÓ“ÉáLÊŠÉBP$'dyŸºY’§M³Â[Áüþœ mÍEqÄËŸú,§§÷XNg4D\¾pÕlÆèà€½sçéL&¦š.´§n“«c-EÖ£ß"¤¡5x¶c#Š£ñår>ÐË}ØJîÝ»Gžçœ¿p€1Ž$Š8;9åÁ½;dEuÙlUËr½ät2eÐp”ÔìîîÒTËõbc…¶OçŸôÆ–éœc:Ÿ%1Jh"µ™æ±–ÙlÆùÃ]ŠÌbql-Œ[l±Å[ü, ˆS&Ò,%n;b™í Š‚j¹ ±ž®2ܸ}Ÿ?ÿ“ͼYÒ™šƒÑ˜ßùûŸ£œÎøî7ßå{ïpîES>ÿÅ7é÷$«S¨«Žj6aµÌ&dÉ€GgPÚáDD”fÜ{ð˜ çèºÇL§Sªj³ƒ~AÛUxgH㜶îPIL$÷nÞdgŸ?¸Î¥ —ñÒ¤àæí;ŒÆC%^hPÐï÷æníA º¸c6Ÿéœçžžo}뛼þú̧RšzÂë%oþü—‰Õˆ_îõùηþ€ŸÿÅÈ/}þïqûÖwØÇ,W÷˜>êóüµY”çiàÁÛÜ{üï¾ûÿáWƒ|ÿ{\:ÿ,ïßü}¥™–hÈØÿÙÿÂÕg^äüÅg¹wëmî?¼·QX‡hVkDÅe¹¸‹±5Q²ËÎp‡<-Ò²\M‰Ó]"Ýwéèð\}þîݾÅbv‚ðp0< Îsʺ¢±’áÎ!÷ïÞ@륤JÊÓYÇôñ1G/ ¤FÆ ]Ý`º†$Jˆ²‚¸ß“s"zRÑv–VyF‰@¡•Âڳ化 gÌ&ëïé¼'c²¬Ø<ÂHOÕ´Ø&íìŒñ]‡º®CÇ Æ‡©­ùr‰íBÓuÕ4Ìç‹°ž$ÔuÈúÿdãY)Åo|H×¶ Ó;ÃÏ^¸Ä“'Ç<>{ÄÚIÆ;{\8<ç‘RoŽZ)4ƒþˆñpŒr‚Άƒ1ΩÁ:|2üu]SW-Q‘êˆ,ŠÈÒ$¸K„ ‰bD“†¬V ‚åzMÔuôŠÛv¤‘F&1Nd( u]³^,‰u˜“Æa½«PÄäy̺,骖õê=Ú¶ÁÚ†¶kPR“Ä#F£¤Å¿oªêß [½Å[l±Å[lñӀ׌wÏA¡YžžáZ‡Í"ÎéKA¬$ÆÔd½d¯Ç(JøùŸû4ªƒo}÷#®?^Ó+q*勯ŸçÜxÀl9¡«*êfŽ_-ˆMŒˆFcöÏ#­furÓ9ŒH­ãöwè”aT i«'4]ÄÅsçië'§÷Q*¢Ÿ°6Bú˜X[oI«3Êù‚ºšã]G’ôiœÇ ‡òë5^ Ú®æÑô”?þþ7yöüºSìîì0™=¡—e¬WŽâ¨Ï|ÕÀê.ÇO¤Åa$B:ëÈ“Œo1_MIz9å,´ K‘…BJÊ ÂYˆ÷^Œ”‚ÙjIšÅôã‰ÃG ß¶DJá„@k°ÎchÑ"¢nJò<' ŒëðN>U ;kY/Wô‹K±D©/=Èà¾Íd°òö҄ɼaQ­E1ì“-I¤°þ'ÿ^ BR–5£áÕºdµ^ÒÔ–A?£mjºÎå¡÷%Ö"8|…áøtAÒËùðú{¿L¿? `Þnl¼-'O¦Ì— °„ci$N8|fùÌk?Ï÷¿û†½}NN)Ń»±p•e}FÒ˨Ú>óæW¹y÷{\{ö^|é¹}ç#&³9Þú€b°OšÃ4ÒrŠòpxØç{?ø>¯¼ò·nÞÜlS7TuG¦µdq½bg˜pçÎ;\¹üÏ]{áh÷ß{‡åò„¶5ÄI††ý~p8‰è JV´­GÊ]´è¡”#Ž t`•¥šžÒ³ŽVDœ¿ð,år†iB9[S•DZcº†Õªcg´Ëº\Ò4JuÄ> ÏhgÄÇÇ zCZïI³'$BxÚÕŠ^ŒòIœTDZ ¼À¹ƒG+"aÿ`—ûSvç`´³œUPÜ×UÈ #ÂÔú® 9çX† kïCCwg ÎvXoiª*LmሔDiMÕm[¸·Øb‹-¶Øb‹-þ‡Ã£#Ž–aâÿÌUúRÃæƒ`³*ƒu7’fvzÓL¶FtšÞµç@0‚bpŽD|ë/ÿ…a¾Xðâ§ßäGoý1Ž”_ûÍÌéÃ÷h«–^ñáûoã­!ŽS"SÕ†(°®eµžsáòyÚiÇÙb1-m$Hã„f¶ÆKA“¤žÿá¿ÿ]žÌ+v÷ÇœŒ‰„âÊ•KœÒë÷(’”"ɸ}üˆŸ{õ üóÿùðQŽÃ£6„Q©ˆe¹fGдÖ­ÉóÿìŒ%ŽbÓ²Z—x½AÓ9¬µœÎXçØÛÑu5Y’àŒÁÅmgð„·Ôë5¹ŽžnÛ.Ws„ôh>òHÖ{ò4A OÛ­é1uÝ¢µ¤³-ÖyòlH]Udi?QUkJoé‰*Ö¬ é,ÊC—¦ÜJÉáÞ>¨ƒn#t1œrp°°Ù•V<~rJë Úk?ú!çÎ0ìEgÓ)çΑ$ÁZÿÁF»ûœ¿ˆNr¼´x'˜,+þÁ?úOø§ÿä¿æÅçßàù—^ãüâï½÷}n}ð!—/¿Èõï2æ\ºð¾­8>­yñ…Wyñ…×ùƒßû¹wï.]~‘ GœÝÇØ’¦®ÙõùðÆw¤|ö•/pçî <~D¬S”š£uŒ·¢íjþÍÿ¯ìí\àçßü2òÓŠå|Žé*NÏNˆ"ÍÝû÷9tHÉÐú,$Mס Þá­Ä®$½~A^DmikÊ“Û8/‚òˆc69©)â!J{Vó9Þ{´ìïïóèø1+cH²˜D$ìííÒ¶-ONIÒB(¼1 5ÂYªzM¤T’ ¥d½Z¡´ãIz^%,ë97oߪÌzæ›i¥¡Z*Œ1(%ÙÙßå3Bе-Ižmžë º®#ÉFôz½¬ î íº¦|r檊"4uo¼¥ûÊW¯\ÁãH’$(ã‚® {k ëõ¬ ¼?dg<ÀiÉjYbLK$½"c>Ÿob 1±Q”ë’¶ G¦££#º.LkcÐQBÞ„ט%%«õc[<`|xýç½Îf³eWR.ô‹ÞÇú^¿%Ð[l±Å[l±Å?tRQ¨#¡öa3S’è$4/]ÓnÚ¥y‘Ä?üÁ ŠÑ>2N8>~ÂËW ò’fRá½EŠ˜.Qƒ*v¬ç3dÔ#‹÷hºû˜Æ#cÃp¸Ï¥‹ÏðÃïþ¯¼ñYòÞ<4uEÅÊ+ƒ!óEÃp8âôøð¤qÄé|AmJiz½ÎXzÃM#ðzÍããÇT­awoÎuôRï<Çb9cÿ`á<«ªdw´ƒÂb¼ u–$JpÎà±ÔUMç¼ÿчt]ÃþþÞ;@>„2Îâ¼¥ë,]cÀK¬1ÔÎ0Ê „·X,ÆY”óØ®/°Ö`M‡5†D)Œu8ghºš$‰h*vŠHBH”r›mØèMbY·èM^xªâBa‘Pc;Š¢`±\â½ ûÂ"”}IáñXò4”°6"RPU –KÍîÞ9¬µ$IŒwœ£®kâXqóÖ‡|úå×X­JæË9ã}Š"Ç;Íîn¼óc¾0Ø'2¤ˆPJÒúcààà€î³»×gwÿˆKë9]³f6™ñw~õ«üî¿øçäŸ`¡¿»ÏÙlʹà ÄyŸûñìs¯°¿s'ûY¬î³ô–¦iè ¬ñì#Ï2ª¦åälJÞ‹ñN‚€¦éÂr°wHYNøÎ÷¾Á/þâ—X¯L/Þ¥Èî>8!M†,ç-éîˆ^€1ˆ:ÓbÑäù€Û·î¡bÇ /¼ˆ·Ž¦î@F$iJc Yœáûxo©ë çÂfq]×aÊÁîÎ>e9c½^² ¡L,K‘xêjMœdÁbœ¦´Ö"e‡ðñ&»Þ Ú‰¤®”SH²¿HÓ„"¯¦.i79okÀˆM \U㣈ñxÀ ƒSôCNgg|xó6ËÕŠ._F!¹7™Ð4 Y–qppHiʲÄ{ϵkרë†é|FÝ6Ä:l.¯ªuxþ§ Ù Og;”’D6e´·K[·x/h­ Ùèá©CiNP×5ÎÅÜ{OcºÐd¯«rMUULÏÎèå9½¢Ï|µd½^?µŽ×]ËÉég;œ ðX„LrhîS\Þ9„Ð †}š¦ ç!’ ‘…úP˜6έ÷8Ê ÝÆ"î…Di…°R*F;»7Dî‹Ðžþ1&B·z‹-¶Øb‹-¶Øâ§éë©Ðô’«%‘8ðQØ™ÕBR×%Iñ­ï—H)¼ƒ½q/¼°Oì!OZŒ±É‚¶Ö¦)¢î¸ùà6–ˆkמåæûßæÉÃ;¤ºåúí;|î~ƒÓÓ3þîoÿ§ô÷öí ÷î=Æ ‡s¡´*ŽS²¼`±Xsñò³)Q’råÒUb¥i ìž»LåØr‰R’ªëäÿí?ùïX–‚V 2Ý‘"ÉÒ‚Ã~ŸÙlB¯×C£X¬§Tõ’Ë×>ÃÉä÷qÎI…ó J м‡T ²iæ9R‰tÖRU%ëºbUUQJº®a0¢eP•«ªBÅ1`Áua;ú'ªš‚ÎY¢MºÃ#µÀ[΢TDg-O¬%ŽˆPàíÉuLãÌÓ9!)ehö-Bkv×u´UMš$tÆ„–mQ55£aؾ•YPæFClÞZ‘góÙCDšd´%N#lÓ±.g´¢W¤üè­ï1Ž98ÄÛ7¹öÌóÓ°›f<ûìó\¿yýÃ#Òl€ÖŠª^1ìð™W~‰ÛwÞáÏÿâ_ñËÿÁ¯óò§¿È×ÿô÷I³!ï¼íù­ßüGüÓÿé¿ásŸýâj…ñ†å*á·~ûs:yİœOyéÅ—ùÁ÷לg2{D¹ZÓÔŽüèÏè¼ôâ5rr¶ Ž5ËÕ„8OH”Æ6­â¤áëñ/ùµ¯üï½ÿ×(sõêUt$©Ö+&“ ÓÛg\¹x‰ñxDÓVd©Db8¸ƒc$m×’=ÚÆÐº°µ~ûÖ ¼wH)0­e8ÑïõØÝÝ¥mÃ÷{>Ÿ“fflúëe‰Ù|eI‚Rš¶ ›Æ©H‹1B+„ótMv¥Ä¸`öM˜V³Ö3/yüäcÛ§m×'§ÆÃ]>ûÚËdYÆz¹âµ×>…Жþàm~ïk_£ñ–åªD"X>9æÕϽÆõG7P*áJÿ ÆtLf¦Ó)J)Ò4E©@ÛêºÆÈÐ^·-ërÍõ;"œc>›6JÀŵ«ÏÓïÙí“næ…›‚36*zKU×TmÃÙÙJ6ê½§È2jcXON™Ífáõ•Ä %³ÕšýÁ¥½,£±ŽããG4eÅh8¤èõHÓ×tàiš‘'ÖZŠ,'Ë‚»iÚ¶%Ë ê®Û”ÎÁ8QçUÛlfÁr¬µtÆ€ô‹Ûtk-ç–@oñ‰¢ëZ¾ù­¯3›MñkÞ[l±Å'‡Ë—®òÆë¿°-Qüƒ”’4JP¦ËY/C;Zg›†¸1]˜xIzøÄàŒáÜþ7?s™IKAŒ5ËEM–Çüõ·ÿ”kÏ¿ÀÉñº²£×Ïé÷Çt]˜Žúèæ †ÃãÁédÉÞÁyŽŽ.RÖè(|¥sžŽWŸy–Õz†·ŽõºbrvŠwŽ4Ïèõ‡›gE×z†ý!Ʋ,¤­k1ÆbŒg0ѹð¨.5{ÇñÓ×F'tÎ0›Lñ2"‰"Ò8&ÖóéŒ<ʸ|t~oD¿œišòµ¯ýK^~åEÞzëÇtÆPÕÕjŽë ߸{›¾ÿqš EÌüdÊùóç)âŒ(Òh¥iª†¢Ð Š¢ ë:êrzEŸW_~Å|ÎCóù •‡Rç‚Õ»«ÃkI8C€°hBþÞ{¢HE}äZR&´j­qÆR–!_Ýï÷Iãç@Z‡µ†HH–óq¢ƒÍÝ ŽŽ.R×%ZH’$CFš¨%©š/}8ä9ά³ ƒu=ÒN„ÃTY– ‰­üår…‚,Ëp"ýõzá ô2>N zK ·øDñWÿîôûC~é _þ¤Ê[lñ3ðaÝÿ?ÞêþïÿÇßüýŸÞ‘ï›ý Þ~÷-^yùµ-‰þBí Qì 0Rrúð-ŽXª]²EO,J€–eÝ‘“òúë/È ³é‚~ïm7®%Ž\'¨«–ÊÖHçqeIµžÈ”ùü.¶ Öb¥cœ-¹«åŠûwàë¦&Is”Š(Ë)Ãᘺ®9~|>óY£!¶m˜/dƒC’<Ÿ&äW¿÷¿ÿ>*aLIOæx)©Û–aúâèɲ k‚êg­¥ªVU‰Öa×5’ÁÒ,D˜½YU yža+V1Æ9ªª¢—[g§›¹! €s†HE€@¨ˆ^”Ð6RUMj…Þ(ŠA­ Ä[ ˆ”Mc xÀ9KE4Á+ØLXµ]‡1¼'Š¢@È”~:MdZKS…™!W·(­ˆ”ÆHœ’Õª ÓU®eµZE‘NÄx!(Š ÈYŠ–¬5ØÎÉ(Ì”e)ƒþ˜ƒóûôŠ>§úŒã'¸zõ*ò§įå·±õšÊwdqŸ —v™O¹xñ*Î4¼wý}þôÏþ%¿òË¿ÆÛï}ŸÑ¸àøäE>Æiûï¼Å¯|ñËXÛ2=¡³)©ÊÙÝÝáæÍ»ŒŸrõ™‹´mKžX.f,VœÓ4MÇx8à™«Gܺ}ã=]mˆók+B´X“FCÊvÁîÞRDLNîã:ðRrtþ G.2 ‚ÅZ’$§¬Zœ'äzñXç˜N8:¸ÂºêXÖS²´`ÐßcµšÑšÞtDi‚÷ŽÅ|ŠŽ#bŒ , ¼·›)§àP:Æ{h¤òøâiŒÁG’¥dEP>¥Šû¬[Oo4Dëáaçàc ‹Õ‚A>`¹œ’édIÓ:Þyû#œñdIΪ*éçÖt$y†ðŽýá|"Lª Ú¼µÖDyØ_ÎÒl£FK¢H31¥uŠ8êã,ô¡ßZK*Q” ¥ÞÌÂ9¼H/6Ä8{MB’¥)—/^¢iš²¢,Kf‹9mÝÐä9£Ñ‰Žå9"R8È®Tà¼Ç9ÐiB0 2¼6’xóš)Û9ÆtD±¤q-¶û›÷ é%yÞ#ÚÄ&´Ö´]ýtk=ŽõÓ-u‰@ÅÞ[ Ø»?Nl ôŸ(–Ë_üÅ/=ýŸÅ[lñ·¯¿ú9Þ~營ôÃØâ§Œ¸µTÚ3øçC;­’#,*“dJ>Ý{•:bÝ5œ¿xŽ×^ºÊ8qTUEHÙIÅ¢­è–sªå ÓÓ³ Ç=ƃ’Ù¦Ë3ó3¼*ùô‹/’dŽç.þÝäá­›˜¦¥±)RòA"Ψ«’ýý]ŠÞˆÞÿ!Z+ú£ŒA¿`õdÉþÞûGW0Ö0RŠÿÅõ_"ãaPˆ£)=:‰ñVÇŽÆTäQ¥ËÕ„E¹¢q0/sûîmêf…”šH{¤Œ0Î0+kfóWŽÎ#}‹ß´X·]‡TšÎ˹·ŽÒ:ŠCY®¸óø6_ú—8=™Pµ-_ùÊßá/¾þGÌì‚÷¯ßä¥ç_&ÑáØÓ ÃÅ+/ÑÔðío„âÂÑ3ßdgwÄ9ÿ I ÝãÅŸg6}È‹Ï_EjÅûÇ<~rŒJ5{¹"ëxZEÁ{o}‡^o‡,Ó´%ÅrÝG9{{¤YŒàÔÆ²<}ÌãÇɳEQ0›3ïbÀ™šYµDÅh¸G…*O8FTU…ŠHJ«4ÕŠÙ<2£]”Šˆ¢ˆ¦é {°iƒö¾#MlSc­%²¢"½åÊ^ŸyåXŒ·,&s”ÒYõ-czEÆáá>ãQŸK—.ñx²âýw?`>™¡µ¦Ã²8›aºŽ‹GG¥°òå ¶³¡°«®ÐIŒˆ5MY±ªJæó9yžÇ1q“åù`@V\½˜b7ñƒHEa?Ü9šºb^®™Î¦XÎ] ‡'Äu]“d1Y’Òë 8’«Ï^#Ë ¼÷¨ã^†¯ÓJ­5Î{ÚMqY¤Â¦4Ö‘ÄA±”REš4Mhë:ä»»–élÁþè¾³8'‘*BÆ:Žžf?ã(¢m[Ò(&IŒi麖õzM$Yªyôð.Eѧ\UXc ûaU®‰ûÆ8âXÑ´pxþwBKò¹s7o}ÀùóçY,\¿ó#Æã1mSCÛ’e=®]zŽT÷ùàÆ»¬\hmî÷R´†~LÙÌxó_åÑ“cÚ¶E AÕ.¨êu³æèüÕP–FÇë?¶†óç.ÓYNOŽ999¡ßËRn”Ôq’¡“˜årI¬«ÕjC-àöa*) ?«ºZ£D8Ü¡(z=¼×kqôæ9Q1Æ;¤Ô›I1O ÒÖS‰˜ª sSQгB¢ßï±»7 Èœüþ|² ¥sišG ´ ç/)M¿×c¾^aš”Ä ÃÓv-QÓt^i”1Oû ¼]­éhÛ–ª Vm­5‡çüÁ¹l·ÉçGš³Åœ8Êhš†ù|ÉÎÎAg*â8fµX¢†çÂfwÓ4,×+¢(b8`:‡ÖMÓlã=BJzEAY²¿®J¦ó)K©õ‡tîo"Q$1]Ø`¯kBY˜­åŠÑhÀ`£Q´]‰žÛwã=ŒwÏÓ+Ha Yx!£ÿÏßÞÿÏØè->Q„¶Ë-Þb‹-þvAJñ´f‹ŸX ÖuÁRÙ¶´2´ß®Ï欖KNOOA‚Œ#âHñÜ…«|ñ³ÿ¿ÿ{¿Ë§®=Çù+{øêŒ¶ªðMÃr~ŸÖX’þ˜þÎzÃf>áæ‡×2|H—*áõW?Om EïˆùüÉÓB¤Å|Jši–ó%ÃñiqLSVœž=fÐRv y6FÇ1µ14B2êïpï½ëüå7þˆ³jÉ|YÒ Ë8’¤]kQR±;Ç’4ÕÄZ!¬Û´ÂZÇÙÙ)]gé¥i˜•*×,Ú–¶s4ìŒú8ß"4mG–FTå'5Öš™vž4MðÞÒËrr!ƒº H¥pXf‹5uÓP·¶kyþêUŒo‰´Â8±)™RÁ6/=^ˆ0SÕV©±mB"6!N ¼ñ´Ö œäÖlŽ cƒzܶ¡Y=Ž"Ö<™.©šç÷÷(Ë5YVÐt+fË%‹rÅü6/>÷&IoDs2£ªëÐÅ`,ƹÍc ¶[!ãÁˆ²nÙﳚ¯¸w÷.ã=Š,çþ½Ç¼ñÙÏñö;?À;Í•ËÏqë·˜ñ©7ßäÎ8wî"ÓÕcþðkÿÿð·þ3¦³'4mÅ /¼D×Lh|ÿ­oóå¯ü:uÛa¬#ÍæÄq†Á ´åÝwß¡nkž¹ú<³ÙœÕzÁk¯~ŽÉÙ1>)¸yó:ãYŸ‡Â»Hã[‡ñ†².yüðEšsté2I’¦)½^Žsg ÇUÅ|:#J"²,ãìô1¦iy{1e¹š³;3îÓï…r8€6 ‡-¬Ãv2N±«y>BKÉz½ ý&4îß¹ùNp¤pHÒ(fÔü4SVÿ¯ØþöÞâÅO-·z‹-¶øÛ„ŸìÃnñ³…££sœ;¦“SÊrÍxŸ® 6Ê$I¸|ùrP·œÛ=ÏWåMþÙ?û}Þ?æË_|“ºZ‘zÏ|rÌrvLíÀù‡ç>E˜!<¸ùëù)€,Ë!½œrq†RàË–4RÌ3ÖË9:NY•kÎ+…7–~¿`zrŒð!3Ò$#ORÊr…E‘öw88ºÂ÷¾þ¯X7žçÖ¤Y"ÍJÒQm0M¤C’$<>¾ËÑÑev†ç˜=™aÊ’¸×§ë ×oßaw¸‡Ô Sw^Ú4JgL¦‘*f8:äþÃSºzÉŸýÕ¿Á˜–8Ä‘b²œSÄ9C¿wJžôÇœ;™õzÍt2 ;Û‡=œsXÛ¡Ú(Ì¥¥aš©®jp-"© iK” ™}k ƶ8oh»”<î#¤$cÒ4 åsRãÇKë Æz¼T´›É«B'iI‹„em0­¤ÈR´ô<99áú["‡š;wïóðø1ßס#ɽGzÈx8â—?ÿKDQDQŒH”&MRN—¼„«—®àã὇”e‰R©]gp¦eݲ,ãðð€õjŽxmËÇíw™Îg”ëéS{ÔۡȤù-Z²,#/2–Ë%i‘³^¯É’”AÒcww‡Kç.GéfŸºª*>øà}vÇcš¦ææÃ›”U{].9~tÓvá€bKNŽa8Øgÿ"מ}…H)¬ SrRI–Ãv† .lrÐyžÒÔ%ãÑ>óÅI4Ý¡‹õà˜œ>âãdÐ[½Å'ŠíÈ-¶Øâo#bóá}‹Ÿ%¼ýã°žO¹yó:IS?%Ùî1ÞÙ%Ërò<4U¿ñêöéñùgŸÃÚ aj¼²4ë9‘”¬ª”‹W?Åá•ç(çée u³¦éJz½ÇŸÐßßaºš"c“g:ÊÙ”jq†«×È4cgw—8Ý›Ü IDATÑ4@I5áÃvãb.œ¿L×µ¤iŒé,Ã}¼SÜ?yDm]Û…&]kºëpÞ Qh%I“p JtDÓv´&lá /16Xã8fU•´ÖPOÝvv†Ä:AI‡ó©uU ¥^1X©ÉãI äÓåœsûû ’@à ’ÕjE³)á’^oödÁ#¨êšº©Ö‘¥ÂiÒ$AF:t)1ÆÑy÷d°Ø[ à6dsäﺉläI’à7àáQ5 ZKʪag˜³X.Ùï±ÀK„Ìæ'è’n|°ä"%*ŠÐ@š%1äS5q¦©»ð˜šf ±\͉'1ûû´mK]×´mÍîî.sgh»Šõ²&íðHŠ|‡Õü>ÇOÇ(‡ô‡9>;ÆZËôô„ýóY¯—´uÃjµäÕ×>Ï»?þ.àÀI"rãæ{ìí]àúÍ·™Ï×|ñ#^}éuÖÕ‚ébŠP8ªzs–ûïñÁGï£â­%£ñ¿Ù¿y|‡ÝÝmÛ¡d‚w†H¢CovÔ»®¡\/¸w÷yÖ£?ØÁØ–ÖX²$Â{AÓt¤©BGIx. 0mGÝ–()CÖ¹­6ùzEY®G´m ¢ ¯OëBÑGy¼ï¨«¤GÉ ¼ ¿å]Ï{¶»ßÞ§{öE3’І@"BÈH¨ KA È1$±Iâ2I …ãJHc»‚)Û1¶¤ û¾#hC#¡fF£îž™^ワõ]KþxaãTâ*F®™û­êêêºç=çÞ÷žóöû<ßM±2X&é/aëŒåpÁ—â%NÍ;Á Np‚ÿP O”7/;DQ@om()M ÎÓíd,-¯áêëEËÎËåç?ÇŸ©¸xv3w ‰íˆi]0)öiêŒÛ3&ŒÖ61ó=L=åÅg)ó’0H¸±{“Sçîfõüyêʰyî"Åôˆñömêé.Å|ŸÆÖévéHÓ˜b:BkH;+4.$Œ3Œ7w˜­ g—yâÏþ<Ïñh¦ù Ÿh¤ð4VÐØ†î*ý$CÈ¢M –†ýÛx§îX³„k%¦£jNmj´n™Í¤“¶Õ:J·•VZ ­Å:º ~ ‚-#B-Éx4ÂO'H{P®Þ¼NU×È8!] º{{„j‰¬Ó”YQÉÁdL'ŒIâ˜8ŽÉëf1PÍѪM*F´)áΓ-Œu„J#ˆJ*”Ö(¥¨ª†@{G9I¿GT ‘xâ0bVͺŒ¬“ÐïöHöªŠá Çöî5”Ð úËd«›LÇG4ÖhÝÊXñHÙöG:ÁKEšd„bgçGG{$I‡[×G|ÅW#ÞÀíë/0žÍ™|þó,­ Y]=Í´a)ég«Üÿðhž)ùÜçŸãÁ‡b÷Å`wßs?iÒÃÖ7¯?Cžç,¯Ÿbj¦4#XÙXáµoz;O?þ;DI„מ½­̦#^óèWblÅÓÏ?ÞVN*ФQD¦Lf¤ ðg;“ 2„´Ü¾ù>f:› Ç[ËÒò2§Ï1«Ëmúýx6ÅØÖêÑ4 Ölín3¿–ÓíXÊ2¼uܺö<Â×Ì‹ ã0*âÞÓg ãªK¼‡sg΢¥¤.kªºFk…]øµ½’dƒ>Ù Ïoyøî™Î&LÇ#Êj†q EÕ°¿“Àï}ãh|„±žKçîj¥åγ·½ÅdzL·7¤ÛéF­5¢˜çäÇ#ªÒÐ뮡T»¼°¶Áö=KÜÚÖ¤i†o Þ9ʲäæç)ò'èvût³>y^‘çÇ<ÿ“h­ †ûû†0ˆ±Þ0/ °ŽÕ•5$Ë(¥X[?Ó+½Dø{€v[Ï>Í­ì^{!CýUw‚—' ô Np‚W$„8±®¼ ¦=ú>† Oc ²,q±$:ÐÌ+CUUô»Ô†r|Ä=ïþ2z"-Kªêãá‰ËW˜åš»/Ñô𳚦¶hƒTHKË› Ö7Pâl€Š#·Ÿgr¼C‘ψT„·q“õ²…¿×aŒk£¦ÂcÑÊP冢˜ꈫWžæÆ ×B!¥F!‘ÔÄaBÝÔ”¥!Súý-,µu œç”yAEhÕö¶êH·=p•%TeÓ,5i¿­¯r¦& ¾º%ñÖ’Äqäå5AÐvB+©è/õ!cëÂÉ6¸Ë{p-,¥Díä}›Ë«”B¸¶·®ktà°Hãñ¾õ{Þ´ÒÁ"0ª ³µ½#§‚DXkì³E)EE@ƒ±¥Z¦.Ÿ—D§#ªº! Ú$qçÚÀ*ï^züâü%qŒ-CZ—mê3´Äišá…À4RJæóy›„¬’( ©  ƒSÊbL]6$AÊíò+k›T.¡ V6†œ>ºÈ“Ï<Éøx„­F£=’NÊé³xáÊs¬®®ssë&ý¥e®¼ð,¯{àu(¡D—´“b Ÿ¤Ì’%ÊfÂgž{œ §.Ñï­`M«0®Æ9K]œk‡ÏsgOc½gwŸÉtŒ« nJÅ|òñÓ”c¢¨e§¥ðD {ŸlcQZQÆ8aLÝþ®U»°CYåh¡‘Ú"¤¾#‡×qŠõ lkJc-ÄQ¤ Bê¢Ä×.hd†íBÌc™MG Þ·ÙÖZ­ñÖv:TeE'ÄZsjcsç/RÕ%×®ßj_? P" œMÑa[‡Öíôp‰cï`Ÿãã1XO’¤ß~Fk[“$vvÆT â8¦©-·¶öèt2VVV(ò‚ºnƒåºÝ.çOŸa:RÌr„Vè À4Mkwp$I­CNŸ:CYÔuEQUkq^¢T„ŽÍÕ3mºw’PÕ9¡ö,--“é”ÙlF'I8µ¶A¿Ûgyi@Q·×*¥Ûûû½Ã=ªÙŒY^"³-Î6¤ýÁɸ]^TMIGDÑAq<:¤È¢H3®&Šª@GTÄQL.>7ú¥i¿Ä´cþüò/þÙ/ò¡g¶7!½µ3ÜÿÖoã¿ùŽ×³R?ÏÏýýåò7ýþÏóêÿë½FõïyÜ ^rœÜ@žà'x¥âäú÷òC‚dB…4:PäÊÑä%#3kZ1ËçÞäÔæ9^ýæW±¦, b>óÔ34Ûs>ôÉÏry¼ÍóW>Ï¿þ®ÉÑþ-êYÁ0íÏfÈ(ÅI˽÷¼Š$NÉ›šn/e|ó2ã›Ïb‘éGH/I˜7q£‘”ó1ß&ávÅýÁ/òú7¼í=løÜÓŸAÖ uí™J 6ÖÖÀ[v§D:ä»ÏÓY$‹{iÅ­í}°Å!Ö:””è@P—†¦6QŒsÐÑ1: pÖ1Ïg\8½Žm*ŠzŽ!qá,XgÚp²  ,j–—Öˆ“ˆn·‹†zÞvÔ„h{aC „Â9ð¢õ{í±ÎÊP êÆÒxñšÆTt³¬CG!•1D:F*Èó9Â;Â(ÂxÙVÉÖzh‰15B¨vheËŽª€½Ã#ºYB’vØ;¸!EvÙ;¼ÍxvL¯Ûoëª\ƒž8éê˜k2"/ â¸](XkÐaŒõž(ŽQqH^TT•Yø -dzO’{ï”».ÞÃÇ?ü[dý.˜)a˜QÌ ½%ŽŽo“$—xä±7òÌåg¨Ë†+W.SÔs ×ð®·3uãÙß½Áéõ5·o4šk/Þàƒü»lœ½‹W?ô\y꓌ó{äuvøì³Ÿåꋟçì© ¤iJ–eLçöö÷Ä• ^8†ùˆÙ,Ç:AE †KÆyC(Ð !ýeÎ¥!iÜÚÄìÆT€§ñ¶e2[B¦õã+,Ϋ–5Ö!ãñ1ƒac,Öʲa©? CãðN uëu>:8$ˆ@jzÝ!Íòê¼e™“$MY†!uÙ •BØš8TDIÌ´žc‹)ûÇÇLæS:KCÒ4cïxƒƒʲfy¸JÅtã”á`@§4MÓZ<­ò¡¿ÄzÜa>9æÆíkܸu ôû¼x€$JY]]cueÉtÊþá>½alÐ#/Ûån–¡OŽ)ë ­!¾N“t2ë@”¤Y—4II;1NÂúæ&ãÉ”|^bÃÑáˆÃã1Y–"Ù2üN1BŒõ *j;Ô7ô{Kd>nm£ý}ˆE‡º3/˜Ïç8?Á™)4qšà\‡¥pÀpp %5I’Ç1E^“ –ˆ«’¦©‰”ßZ>â(y‰ ¬Z|Ih7ú?ùC?͇Ò7òmïý.e ‡·®pUöIĤ_øXþÿâß÷¸¼´8a Op‚¼!Nè—%j¯¨mÙvнNúKTã#œiØÙ½ÍÑñÆT<òà½l¬ P²äæõ[L÷Füñg>Åõ›7)´å¡ûïÅ˜Š¦lèÅ}fó}¢°ÌÊÆ¥ M݆PG[·ÁH)ˆK¸ÆS7%UÕVʘ¦ÆùckÎ_¸Ÿýý}n\{ý£}‚@ᣈ¦<¤(K„ïRA7îJ¨•J ²8 Pç$iìˆtx‡1ýB @S5TÆ$)Þ „—DÆy¨ëŠ8ŽQc •FJ’oP^…!eY‚ómèV]c­A ªe»Ý.û³†PK¢ À8P,XeïÑa€)ê6•X·Ï?›Í㨶-H©pž6Õ\JœmƒÅªí¯­s¼ô„ZSמã8Ä4m¥U R´ahU]cL+5Æç9Qamtf½Ã»öëUUÑXü(é†1e]añ„Ò/däípø…ÇÆˆét x$‹6W%óÙ1á áÍ_þvþä£äôú9*Ópíù'qÔú'Ÿàþ{/á5(²» ¤ô²„(QÌí”Èzöö·12 Ó[¥±5;Ì&#šÆqú®ét–8:Þc2›PÕ9Ï=û iÒao‡sg/¡\N1ÞfoçAa˜ùŒ,Žèõ2ªé¼í­V’Á`ÆxáH“®.¹¹½…Ò‘1BÝIÔžÌ ¬aˆR’ hªª¸û®s˜ºBx‹Rk%IÔ2¯´‡’étJ¤ƒ–1CÂP“E=œ¯p:$"‚ bçhºgSÄ¡B O1Ÿb @kp´8-(òÝ,¥Ñ‡GêºñXëÒˆª©ñ-Ic[6æ `¡’mò±sXë ƒ€Á ‡ðvÑ 4# 4ÁBÆ*THYO8::Ä4…´UE$‚áp™H†¤i!q Èó9aâPL§Sº½!ãé„,袅ƩOÁÎÞƒl•[/¾ÈV´ÅCw¿ŠÿäÖùÄŸ}„@'<úª×rãÆ5~ëw~¯{÷73›úÃ%â8e2ÚB’²hxüæmoy;ûØÄõÌsöÌY~p‰z^óð=òÔgçËÞòͲµó"¿÷'¿ÍxrÌ›ßøVªªà©§>ÃÊÊÎÝ·g7îb–OQºe(à ÆÙVÊ[•s‚($ ®n§Çt2iÑ¥€EE“Ö!NjæyIÓ´æKKKH))ŠïãÉ)5BxºYŠ1mŘ”²•Ø/¾6Í ¤ èö–Â#½C‡)aa¼g^ÕdAÈpùçYœ¦“ ‰G†ÓyÅÊj‚­–CƒAÛ=ŸbŒ¡›vBç9R‚—ŠédÎxrÌ8´4J âBÒ^;pkÙ¦ÞWUJP›vQÒ8‹¤íÛÖ±l«Æ¾h‰ñRáK:@ë¥ ¬‰ßáÉ?xœ­¿Š³qûÃÿ›?þê{~ˆþšu!I7;H!<ô.¾û¿ýë :–½Oÿ"?ýãßý³ü÷oÜñ<ÿÛÇU\yÿò¿–òõïýþÖúŒO~àŸðS?,9ý3ßÇ£´Þ˜ºq/ñ™xåâ„>Á NðJÄ ýòDÒ5|äãb}yÐyÆG×(ª1Bw‘¦uXíwyÍ«#q¿öë¿J¶r‰áàݳ¸& ŸÍxÛ·~-+Ló=¼®¤Ì „¬,¯Ä1óü¨íŠž°QŒÃA1eÒ”ä‡{4X +é/o eæ„g6Ÿ²¾Üg6â½çü™³Ø:'ŸSÎ ´Ž‘"BÊœ0މu€U5A!è÷úи9B8¦“)Ð2ÏJk­/y>Ÿ"‚ˆTG°H5v²e`ûý>¦nÐÖ…!Rj´hY2c ƒxƒwŠN'!Ž"â(¥¶cÂ(ë@´7ÛAÐ&‚Káišª•W#Ð2 q­¬Ô{sE[;•¦u]·¬Îü¶÷'_¸)—m¶”!ÛŽjR.˜jß¾®u–ª©‰ƒvèözXçX]]g|¼M^æ¸Åó{ïqÖ£¤æðð4H˜ŒÆ¬­ ±M…DPVqÔ¥,KCÅÁî«wm`êc$q³´–¨Pñ'ù_öØkYžâàp‹ÙxÎÆúy¢ø?þ!ÞøÚw±º*yþó×QHYÂTH^|þ2åë¾’ápÈd6ey¸Éöîç9܃°º|Š[·¨³œ¾pŽ­›WtBŠ2ä·ÿà÷øO¿ñ;xÏ×ßÍŸ}òc8×&šÊê`Q &ðÎaM±®õÿ:ª lÃK¼jå¸â‹ª¼¦³¡ŽÉ²VÆ«µn¥ ™ªªX^^¥2 xi BJü"¤VÕ&¤ãˆ•¢nºýU‘£uLÄ­bÕ·ï»b^DQt;³­ÿß4XÛP–ž8ÕhïÛw†8c±¼ºNÝ”„R´Þõ(¦²–¼*‘”îê&1Þ9šªæâÅ»ˆ£„Ñ,çh<æ…®RN'ìînsîì)Ο:O}…ù¬âhÿ çÏðð«f¸ð©'?Îöö˜µµu:i—ªn½ÐKý%zY—Ññ>«ƒ>A1«kGcvvöèv2¸÷þöý¢Ãá Mãî>½JšeŒÙ;ÚA ’‚k*byi‡x˜Õõuê¦Áuå™ÍGÄA›æ]×5³É”ƵT ñÖh‰óž(J‰V–——q¾f2™P5ΙV~¯ÁÂg®”"N£E=Ü¢[w$ûÎB½x¯4Uõ’^뿤´Úø~ðû/ó#ÿè'øŸøy^ÿޝå¾þ¼ötò‚¿â¥³\ºt–PüùÆ>»øÞzqñ€û–¹õ'ÿ%¿ÿ™]š7ôïûoç§Ÿâ_üê÷ýÍŸåo¾s@ÀCëGüé{žßyþ»yôÑ×ò÷þùÏ㑨öù%ÁI ÷ Np‚W*Nj¬^~øÜ§?Á•ËŸáóx6ÖV‘Ò£uŠŽ"”R,§1¯íëq^ò¯>ð>>úéð ßô½ìîCv¦»HåNs8ÞãpÖpJôû]æ‡s†KçhäŒHƒ7%M9Á¡okt¦uAæ-·«9qw‰È¬­¯Q%1uåˆUŒ³EuÌÊæyVWNs|ð9ªÊ ƒ„ª±Ñ]%I‚µ–0Jˆ£©BÃÖÍéÄùlNÝÔøª¡'-[¤Žòœ¢±(éñX”g-Ö4 ;]²4!P0žÍII(ð¢õ ñÔy…‚áR—8P¤QŒŠª(Ð2À[MwÑ´²­´[8„Xòz‡‡A¹øJµ^XI;Ì Ú·ºžã\B¬"J/±Þ`]Ëz !´‹¯H·ƒÎbM€óT„u†$ЭäT¥ ’š,‹ˆ5ÕS×tâåÛj¥ Ô CÆWx ³Zá DA¼ß‹Ä“ ûí˜ß.ét¢XÐÐ«æ ÆÍøÅßþ¾ý?þÜ•šg^¼Â=ïfseƒ½\»ù÷ß÷*Ö7–ÙÚ‚ÊH¢(Á¸7woÒO–™Ì&Lê]9àÆÍ¸tñ~¢(&/ ö¶¯±±z†y1ciØg©¿ÂÊò&úÄã¼é _Î[ßþ|úSŒúKCÜa…ò¸ËæÆiÖáàhŸ$ÍHâ €Ét„i6W6ÙÝÝ&L¶Z¬±XSã )À[XZ^£·ÖÖvíìÞ&ILSŠë%a¯×z¤MmXãKle‰“”8Nó)°¾AIc[Yp]׈ñ>Q’2·5fJÄIŒ©+ÂPS%¡ Q* ÂãŒ!U;HÆ1•q(kQA½X–*ŠyŽ$JцHÆsÓP–:ݘSÔE‰’¦nð³ÿø§˜åÃÁ;£f¾áÚóÏRã¬öiê§4Ý,c{¶Í‹“Êë9Kq“è˜Ð ۣ›t)g9N@„xï‘(6Ö6‡ŠiUc›WÓž?)¸ïÂkH³aS[Ëõ›×Qa»$ŠBojk©”­‘fc¸L’$Ìç3¦Ó)Ï]¹LElnž&ÐÆyºÝ„ÍSš¦cÑZS5ž²,ªÍð®ôkk‹-èv:ÔÆàðàÚnvã,môK3¿}‰CÄBξãûù§oþ>ûÑ?ä·óýüÐo¼ŸG¾íGøÑo¹ŸîâQ_ØÔÿù²¾aï“¿ÀϼÿøÔ û2E•Ž`Rb¿èÙÿÍ㚃Ïs£4lýÃïækzñ Å&2Þ/p¤hy’ÙýR¢Ýæž01'8Á ^YBž(p^†øøs£ b!Èêc*¡:]úYï<_õÖwóó¿ð˨f•!èžæú훌GHÓ bП~âqbݰy×#DÙ&—¯_£¯=¥=äüÚY¦“]|U"¼GxG1Ñ9ÅìƒýÃu‚t@Ô_æøxŒ5u3oÇ0£Ù1GG¼áMâ« GÇGT î.#ʆ¼lX^[Å:°xº½kj66‡„‘c>+9cL³HŨ­£Š­=¼£ŒX+’8Ä{Ëd2ÁY‡R1Î&“œNš¢• Ô’8M8:’ÚŒq¬­nEQÛ#ϱ®á…kÏ2ͧœ=uá½^F’ÄcPßà­ßÖàAë‰nš!³ùœ étööÉç%i’Ò‹wkm;lÕÖ¢0¸CÐäU @¨C„pتFé¢n%¥Ž@(мbg{›$ŒÐJaŒEé¶ ©Y°l£ÑˆÕÕUºÝ.¶n³!*œ°aˆ Zÿ¨© ÿèyó›¾’ô®K|øcde¸ÂÎî.gOŸ#ë¤dㄯzÝ›ùôåOÓ‰l&)/~îSIª" IDATHEm¨_d,&eSPÖ‡G# Ð!‡‡‡ÔÎà½Ä™æs¤”¬­­ªV=`tË6_¿ö<Îy:NëÏ2¼ÐġĸV¥è„ ilËt;ï™î*MÆxÝJýy)£¯¾ô5VB¢;›<öŽoçÑ·#ý_ý]¾ÿ}?É/ù?ä;6¾°Aü‹§¤¹õëüȾŸÙ[¿‡¿÷ÞYv7ùÍû >üÅOû—‡38b^ÿ·ÿï½?þ¢¡M¬ôÑ'3ÜKŽ“Èœà¯Tœ,_~HUJQÏ™;Ǩšf]º½%t1¬ò'ú!æ¾$ ‡`æÜ{á!V› ú}®|îišª Ïg<õÜ3$±$Z»ÈŸý,KÝ„TÍQTÔEI‘°¶Á4­4Uy Ò²3:d>Ÿ³qvÜ œme¾óY…5¦nˆã˜ƒ£Ê¢" $;·÷©+‡“m@–ŽB 5ÐÔ†~¿O¤$sS“¤OQ–ÄqHÓÔ8µ³<*ˆP:¦iÌb0±Ìæ­\|Ø€°Ôu›`†!i¡¼£¶íMµ÷m’rGô{]š¦¡jÚ×S ”,-­`­ettˆ–8©*ä¢zJÊvè´¾­±ÒJcM›˜ì}+ßâøŽœº“e(¥8<:$ ºÝ.u]·2ÑÚ uˆ)Û€+c÷ŠšÓ§Î“Æ‚•¥%ü  ñúÄ'ÿˆsîáÁûߌÒðàÃqýÚ³ÜÚÞâü™³øE ¼’8]f:3ô–ȲŒ»/Þ‹ZõCYæì^áx¼O$Iï<£ã)§O¯q<™Å)E9Ç[ƒšªrDI„i, }8¡(ë‚N (òqÒ,*î ¶ !<¡RÔUM–tJ2ŸNÚ”u!ˆ’ÛԔŜ4M)•cƤ °¶­&óªÍsŠÂ€ªlPa„‹j.)ÇŒg3:Y·õnw»ÄI‡®]»FÖë’†1³ª!Œ˜†ÆyŠon±Òpþâi¬,ùÅ_ÿy._yšý½]L† ×EBšf¬ô—X_^Á˜š8Ž™LF\¾üi§ÛVÕé€0 ÙǘV‘"œçxï¨õýëšÃ-¶¶nP:CÓ4t:t1BpjýX‡p`l» öûm÷yàLÃ|>Ǹ¶*N)…ŒÉ)ªë=¶©F$q ¾Ad)R(´,†¯œî/†¡2î}㣠ÿïßãʾÁŸŠè† ¬÷w ²«ÛOò‚½‹ïýö¯ãMa»<ÓãÏhõ—§—/q:¨¸v 6ÞyTþÛ~ë¼´8¹<Á NðŠ„hYè¼¼f}|Ý%P N0;™PT’³"â>)Š´×c4:ÆÙ  &8R^óØ=ܾ~ñ$G…]4!BI I=¯Y^^Fë€[×ØØØ@ëÉdD¯Ûg4QV¡R¼±Ì¦sjãH£Œ,dÕA¨P^Ñjda2Ÿé •ê:iþ¼7¸n¾ ó¼ðÂU¬‡å¥u´”Äi–¡õ¢ÏZ‡4%ÖXÂ(e2£d؆@aËd ”`M€T!yÞöçÖµÁY=Ö „#ëd-ƒÝ”ô–lÝz‘ápk-r¡FU‹¿©K6×6˜7cŽÇ‡ììÇÞ7Z2žs<É(ƒ‘t¢*à¹Ï?Éc¯ûrúI—?üÝ_bïx‹ûz”=faÎc¼†í›lðÇŸúoûÞÉúÚinݸJõÐeÉ­ÛÏÓ¸š,]f>=Ä"Q*de°„”q˜R1¡T,Ö)fs>ð ÿˆG_õ<öÈcŒ§ôº}öööèõúÔu‰‚¢®¨ëÖÓzt\P›£É6JjœóQ2B‰±žÚT€#ËzÌ&‡ôÒ.Û»ûç@AÙ nƒ5ž@L«>ßÙ,'NÆNð^Ð_Y#N:íòÂ$ !Pš|2¡v–$Ii‹Ñ’º, Ãb>g$Kë§P>Ei…Y¤·EP•uÚ÷¸‚ÆÖD:d{{‡ù|N’$,õTuŸ̙å9y^bkÃæê «««X<ƒåeò¢àöÎMÆGÇaDÿlg¿÷Á_a>=¦¬-㢄º@9‹·Ž$ëÐbâ äcŸüe]qf}%%ëk+m·¸ã1Ö’sœm(Y"‰¦•´ß¾½‹s–$ pÎ0?ñâÍ8½¥eί£¿²Ìðô¡ñìížÚ:QF†TyA–ewúÛÏnkè¤FDQ[e… Ž#æEŽ©kÒ0 Þð¦·`p<ñìÓ8ë©æ9ÚCi*ª²|É®óð% ËËàÿ’K÷_àÌj†˜\㣿ô;êxãÙ¬òð¥_þàûù¥ÞÃEÈtýM¼uí~6ù¿ú¾_§û¶‡8“ìs{þEO¬ÿòã¾ú×óŸ½gƒ¿ó«Ÿ–ßÊ{Û ®¸=9Ï×¼û~ºóOŸ¤p¿Ä8a Op‚¼Rq²@|ùAè˜L+”Ô(Ðét”f°´ŽŽBŸÒ$ô ù̲?:àôò R´á0’õ$Óü˜n'ASQåǤxÙÁÒ€óØÆ p®Æ¸š¼Ì1Î&]ú«§*&î¤mRoÀ¬žS7k y•sêô%ŒµÅœo°Î#œC*Ða@ì[&Õ4%IF𯵒cïZV6Ð!µkÃ}"jÈ«†(Ôh¢I=®é–1µCHwm8˜µ–~¿Ïèp‡¦.Ñ:áÔ©3„JS•³6Ñxaó2Æp{g—@Gœ;wWë[­¼¼) œ£•MË€(ŠRS•9Âyœó€»cñ«ª '%0n}Ì€’£Ã}Ò$#LB„TÔ•¡“¦Ìç9Öµìsf1xÒ¤{§"Ië­5ÎÜÂ3]Õ%uíPi€`[Ô5è0$ :„ÅÚ e£§SVVV¨ñX× ¤G;Ál6c )ì­ÁØ­#š¦AA‡yNÖéQä3rV{1ÕôˆgŸü(ž”Ç{#û[×é¨_×ôÎ ÙžŽè=Ãêå5žª.£µFyßÊgUE„4"% -GLJîp¦¿D¯Ÿ1žŒö—Èóœ$ ©°H!°NPTËÃ%®^yŽåV†Ëìï´ÉضM0¢e<[†_’¤]æyEÖ‰¢=ÝNÉ´h=Ȧ¦( zkóü˜~·iJ²N‡ñxŒó©4ÏK`„'NR<³É¸­NSªõ! 0MÕ†‘•m—÷|>EA„HÀ ‰ÔÛ8XcÕÆÐIÛp·ñÑ!Ušg]ÒNŸªªPºí9®š†PkB©È§%2„,I‘R2™L8>>¦¶†Y‘“f]ÀÑ_ œçéç>‡ŽRJ)(ó9J‚8¢¬lãiš6áºÛOPÅœY}„ž l»¯OŸ¹@·Ó%ífŒ^¸Œi öö·pN­ž¥Ì Â0e¸´‚ÔŠƒ£#¤ )‹‚¦i+æVWW‚S늽½æE…m fÓ ³Ù„Y^0žLHtÄl6ãÆö-Öû›ÔMCSÏ8¬&äó’S§ÎáqDa|'¤/5eÝ0šŒ±ÖàåÌé³8ß0›™M§,uôz=Brû`›ƒ}þðC¤ßí³ÜíÓ‰;„aHE/éµþK:@[Ù'}„_úÙ_䨂.›÷½ïûŸ¾“wm1àÿùßæ=ÿë?çý?ö?R%k¼î[ïç­ßøüÿÕÿÇûÿ5ÿóÕx ÈÖxðL†À¿ë¸Îóàwý8ÿÛàŸòÏ~ï}ü/¿:ÁÆ.¾é»xó;ï§‹Ç‹µ'Ò/Nn Op‚¼q’ýðòD$: 2 PADÜ]";¤I„Ó*d1[®Ý¾JÕL™O¹ëô ƒAŸÝý=ö”e6¹M'Ó„qB6ŒI"èvW™ûXW“D]¦ö¤%Ïg8×JHã´‡ BŠÉdBQ$´•2;˜LÇÌË9R$¤Bj…3ý…žXgñÎS×%¡Nð®! Y?»³ô.Šbá1¶JÑf-˜%[i–´a@BPU†(ˆÐ YÖ%K’…ŸT U‚“ í~­ëï-ø©ÇÇ£¶Â¦¶lmmaŒAë¶7XJEš¦L&#:Y„±×Tˆ6gáÄÚ£“á5wŸ½‡Û7¨*YFíúÝ”'ÿô#¼æu_I5…×<úžüìS”Þ°¼ºÌsÏ?K–-ãRÁñx V dÈd2§“tiê†NšQ%I’2/Ç­ì¶q(eévb¼ObÂÁÞ.½´C„eýE?Ÿ ŠŠ¢ÂZKUÏÑZQUMm‚„$îµRîºX$¥’eÓù”N**@°X/ðÒµÎ2 ¬¦ÕŒ@„QÜÖ´Y‹ôâ½YâŒ%‰"p–()šŠÆZ†Ý•·¥I£¢.Zi½Ö,¯­3NÉó BxlÝ@§•¦{çïä/ÕÆPÔ9…1í²#Ë2:qÂd2AEšYQ—%Û»»lmmÑíQÀÕ[W9:8¢ªsâPÒ "bQk‡”u%©«ç²0fui‰Éô¨]Þ…1¶4\ŸÜÂÔ5I ÙÛÛ!J;”eÉúÚgO_hC•¤?h—U]â§mjþÑѸMÃvµ5슻Î\DÅl6gØé²Üë3™0èmpúÔÝ„q„1íÒÈZË•«Ï¶ééR†!B¦³õ8%Àæ³»»;$I@Õ¼udgRlm˜™9GGÏ0›ÍxÝ}cgžÏ©LÓZ>—²Æê/{¥à}ï{_ýÎw¾ó¯þ?wïq‹ ÅŸG¹HI\ ª +çÄé”23+f˜Â³²~ c ŸùÓ³=9`sõ<,≧>ÉÛÞò.\•ãDMY×h =L'czƒ%ª²lî»ï>Â0dog GGGxádÈ“Ÿyœ»Nߣ ªZ?´ 4¤Ã­Û·I;}¤ðè…Ÿw}eµí7¶[uËÇqFžÏÚσmýÓGÓV®+¥D*^P׆Æ8œs$iDUä\ºx‘ãã#vv÷Ð:$Xx˜½uÔu+Ý–Ø;÷~qšµƒzSP55UiXZZÁ{K]¼t»=ʲ`<!I?ép<›‘†)7¶ÑÀÒ Ïêòumˆ£ŒÉttÇ¿é½e:2,‘&]ŽŽÛ^Þ8MñÖrzs%¡¨Jæy‰µkÚ!|0XÂÚ¦eý›†8JÏæÌò1Yg@ÖI‘"äôé³<ýÌÌ'ãv02–7¼êÕ\½z™£#.^¼ÈöÖ-z½à˜LFô³>ó²bmí g7øðG?Êæ©K\zäNuWùì³OñÐÃ÷ñG¿ù[ š;]¼KY‚ àüÝ“o_CbQïdYZ]'ŸÏ°MC¿Ûc2›RGYæ4ÞòÖ¯åégž VMYçíÀm-£é¤½Ÿ÷ A¨H‚àN•T!N˜çÇXk(ê‚@‰…E G'邌J£L‹¢­C¶ueª]&I©IÓ”@¶aQ” ¢å¡“tÚ ²4Eégþöî;ÎŽªlàøïœ)·ß-ÙÍfÓI/„„„’ÐQ¤ ¨A‘¢(%€(JQÐÀ ˆ ¯@èDzQ@ÑWDDé½BÒûÖ»·Oÿ˜›MaSÀ„M9ßÏga³wîÌÜ9sïgÎsžxñX’H"M„™UUi4MR(Âq¾ºìÌdˆÆ$RaOt€nêáM/¬¯™©ÊØî2-­Í˜“–Ìr7ÌÐ"ŠkA4¤\¶xíƒ×Éæ³¸å¦4ñm=¡Q›LãØe|Ç¥ìÉçrÜÉHŒA}Ò’i§££X¼S‹1nÄ8"ñ=hii¢µ½™À°Ê¶eáù! úôÅ4MêR=ðÝ€Œ•Á.[X–EÔ4Ñ¥F¶X$¢ÔÔÔJ&Ð4l6K,Å üÎBkŽecÛ6è‚t2Á¨±cˆ'”›gÿþ,ç“éh£T¹ÙVS_CLD)XáÔ}ý{£i¥R¶¶6:²V,[B4g؈1Ä’Ql;¼évÛ•?þ¯3[ŸyæŽ;P¬üÖø½”»w ´X3à]ïBÈ.*c !,˜Ýõó:ŸÛåf×ÿeËPŽŠ¢ìˆ⋼Y®|A¯h¢Wu } ň¤œ<_B/–p[3”ŽléÚ:ê{ö¡˜/aÆ  BvùRæ~ô‹³í²ßdÜ€ÝÆ¦¦¶«è ¤DËñ°-‡@¡áxát3F$èäè¤Sq 4áК+ õµ5 Ì_8ƒD¼† ¡…såêzØ3äÙáh Žƒfao±„’g¡kôh‚ŽBžÚšzjkëhj[¦ÐêqDà³¢i š {[“IÒ©d¥·:œ*Ô·ýÎL ]7þ)šÄr\¤ÔŸ¨áw' çö}—Àôñ<—r¹Œ®ë•`1 j<Çí¼÷e8·Õªy … :§2Ò5;W4MÃüJ%n)º ×gèMV¦Fõ=òÅ2é”iF)Û6ñD Ïsˆ˜1l§L*U…çy”J%תL”aÑ.Û²=4MÇ÷<*øXVØS½æOÌŒ°¬9]p0ûPÓ#aƨNÖP(°l©xåØøÂ§#ßn´eZq #jÒží ®¶'žëb•,þʡ̜=—^éZæÎYHÏú>èžAccæÏ›…fHÊŽfDâá1ñÊ®E2‘$Z¹nvÝ€ššz–/]L*•B×M–,_F*‘ _,‰D‰ÇS”s9’qÍÓ:SyE%°íl³2VÝó<<ß‚Ê<Û¥’¶n"„F±X$±˜N@€K8=˜f„YBhø~˜Ò,5ƒ xÌH¤³xUT7‰D"” EŒˆIàè =ž»–ëKÄãq´ˆA>_¨ÌI³"Fgæ@©P «vGLÇ §‹F0"Q‚ zï„®±ûØ/áûMxŽN"aE[ ¹ö<‰š<R‰8 õuè2À4 „ð(—K¸«©Q,–AóÃ"fBÇsI%ch4!±‹D2IÙ²(XY¤ §Ó"¬¨­ I<x‘ˆöP'tl;œ'¶lÙhšÖY,ÊÔÀ4Ãùœ= ¾mᳺ÷*ð]?ìq5tƒt,Ak®ƒH$†aD‰ê:RÓXÙÒJ©XfЀA,Y²”T*‰Y ç–Öô°ºtµI±TBèa`AÄÊæòxBÇu=Z[Ûèß§/Žc…½hš¤#WÀåR†ˆ¥ªºŽ:—¬hZ‰nTѧß`-_J2ZÃ41¢QD®b.ßÙ ëy’b>‹c{˜ÑצÁèÃo¿/|æ/]Æð]GrûwñãÓ~Àˆ£˜ùñû¤Õ¸Ùº¦’÷¬ë‰›Ï± uz3ì:rJ%‹¶ÖrY†ž ,\¸t:M*'בnjèŠôïן¹³›) H]ë¼¢I½R}=¾!q½pÔz8Gs™ÀsRCß7ˆ˜aæÒhøžÀÔ#”‹VxSÈ@@ÌŒáøaz¾ëºˆÊ|àeÛÆ –ï#ƒ0ÃuÕЃd*¬ í»N8åS¦•çs SÇq,ŠEˆF£Äb1|Ï¡X,ÒÞ²MR]U‹Q)jç9¶ë‰kH©Ó‘ËÓÐÐð™¿`6+ša&ª ¯Õç½¹³HÄâL·;C‡dÖ²ED„IR°hÞ|„®aÆâäJá<˵u©kF>›ÁqJd2M˜˜Z”¡ƒGà{e'G¡£ 2J2™Ä J,[¹׳ <¯ØN<§&UG{K3o´ÿ‡’ec[UU=è×{ cFíB<#_,P.ñ*ïA˲Â÷>åb¦•K( d*Y%=R)RÑ$s>ü€b¹DÙ*kkųßBt!0>‚h2I4Î]SSC!Ÿ'‰ã¹ZÔ ä(–ФÓÕ4·¬Ä4uÚ›ÚÈfVòöo3iωXžÞè¨t뺎fèDb1JÙ<ºiP*ñœ€ŽŽ¶°º&ˆÅba/¸ï£aö@kk3={ô$ðÞD×÷:{5Eà«Ê¼ù€V^ÞP±]Ð¥Aà‹pú"C‚`;.š%ðÂ!䨶K¹N“V*•ˆ'±õ¦aTæö‹XuÎåìXNÚÚZ¤Xý:mÇAˆ§Ž25×wÂs5Ž£–RÇ4uÊåp¬»O&èhoÃô4ÊZ#ö†£aeïbžH$Öp<ð±ª*¢V5>ÇòH'“Ä¢’¶BŽ×_ûE§Ä'-­¸EŸÆºFvÝe,¦n‚ô –\.OKk+ý{“/äpq°KE|[B õ½:j š¥µãý¯óZÅY IDATáŒ7Èeš‰šQ¤kb:¦ˆ¢G¤E8/´çyĪªÐ„N*YE!—§½5lëX<|Oy‡Ô5J…¹Ž,mM+‘Z8¼O}f$†ë;” e|YÆŒhFІ^½ÂV9Ì,¤ÐI D |_Xá¹Q :p­,e×¢T.’iZA˜FžL§Xk:¹-LÐJ·SÅtEQ”íA4™¤=ÓD±ÐŽ4%ƒLd¨]fÄð]˜¹pžW¦V3hËvÐVhÈ'‰Fâ8¥6L±»5C>™fyk+{ Kªº§˜££¹ŒnJJeŸH$†éKâ©4-™<½ªë±­2–›ÇußБiF&™6Uqab¹±Dá°„††Ûs0bQt#†iÒé4¥Bǵð}Ÿ’Å/$RÕhfš]vžÈ‚…o£É8‘¸Æ’‹I§ê°q‘XônìKU*…iø8V¹’r ÕÕÕ”Ê~࢛RƒRÙ¢¶¾ž|>‡ŽG܈‚öÛø8@$‘¤J7ð…Žç;•´m ßqÂq©å2‰x׳±œ°ª²&%¶c‡Å¿LÀ×)ÃÞf]„sàšO˜A®ø6f$ÃŒ á#¤‡¦8•”\_‚&5Ì˜Ž£»H)I$âAW&“¡P(FÃ×½*õ»hçÊyMÒÖÖJcC¢Ñ(e7¬àíÚP•NãÚE\»„ë9¬2~ɉGp…ç,^:‹ú†ÞFÍT§«YÙšÁv|¤n‚ôikë Oco\7 þ4Ë›šèÕ§ æ-eÄðQäڲ̘9—‘‡qöO/¥iI .ÂHÄtI±XDa»}8k&¥r@mzÏfþò¥ì4p(UnžãÑÒÖÆÈa£Éf³ØñÉæšimZŠo[†Žm—; öÚ¶Cøø•:D>E+œ*Êž ‹0øŒFãäKE,'œ²(‰¢ë:¥¢‹¬ŒSö0Œ®ëL&q‡X4+4"‘Hx£Ä˜f,¼¡"ô@€åSv Ä’ „”D¢ÍMËÂqÖ©š0ýß Çeç Yjªª‰Å¸ŽG<­¤Œ‡m‰&ÑñÉgZÑÌðL¼ª Ç ‡dÛÛp\ŸD2FkG+Ñbý’Õ¼=o‘h’²f"d€+ W§ˆêUŒ®SrmCcÑüyÄõÑt½ú÷ÅÊ—I×Ö€ëàI:©>µñ4zòd‹Y²…<ëá”úÖÁ ̨Ž¡™Ö¥ø" •®Ç4cä³%zö¨#OЫ±žD"I6ÓÐÂyæs¥"ŽãOVaš&CGŒÀ²Ë8ŽC>WÀ²ª{@: è4àúvÙ"i©TK$‘RP¶-ò¥R3ˆèÉdœ–öVšÚ[Y6ÿCô@Ãñ=b±u‰|]Ç’\Ùù"?êU­t¿ ÔtVŠ¢(Ê6¯±±7…b†bÙÀ OZ70£1첤Éi'VÈ1züÞ >Ã4É­l§\è@ Ÿ’e…‰|G¤0±ËµU=1#1JV)%>¶c Ë7hz7ð¨MÄMMº†´.ÉÛ6]J¤¤D“¤ÐH¦Sx~×É‹EX°¸‰D¼žÀ·©­Ž2xðÎ$’ao^T$YÚ²„B¾Lº:ŽîD¢qªÒq4áà¹V©€ïø‘$¾RxhRR,[x ¶ª†\®€†D7tÜ ¬NL&) Dõ°8—/<,»„aH)pH&ÓhZ˜j,+½Æ®çt¦Ø®ªlÆjqŽ¿ª­†ï;躉b9Åpº-VÖ Â”Y rv˜’,u3 ¾ƒQ™§9 §ÑnG–#ñ •ñÕº8®E*š$Ÿ/b˜’ÖöR©*¢ºöÈëБm§:•¤äÚ ¢f„v=œo:ðm4£gºù¶å¸N™’ã èaè³m¸vÛ¶‰˜1V6¯¤¡¡¦ÅvK$RU”Ëe»¡ {ïÄì…s)»U‰8Ë<‹·M&¨J×Ѻ|®k“/Ñôùr3}eé¢ETÅ$3f¼Ëžc÷dÞÂùH V™X*MmÇÐ <3Ikk+©t5Rja5²ríöB{>á¸þ@bh~Ø ï;˜f|ŸÀ”Xž‡@’Œ$°=!tl7@‹DA8Æ=–H¢K «\Æ Í@‹&ÑkO I#lW)ˆ'ÒøHMbú>Ù\M+'©ïÙË*ø>A aè&^%%¾¹¹ Ó4H&Ó˜žnF(V â iˆ8èaÝwÊ…š£wcÿ°è•å`˜ižéyb±fÜ [Ê’/æ±­2ZàaDÊúÔ÷Å)GÉç³ô0x,N{[ V¶Mƒl6ÎÉlØVX°È'@È04X5‹ˆç¸DLbÉáá¸áØáˆ«>Äã‰ÊóÁ÷VW§–BTÆüFÐ|Ûuð}Ÿ3>âíæròwN¦#ÓBUª½X¾rÉDA®ÇˆVæ%‚pŠ©"‘9lÏÅó’Q]×p\Ç Ç'›R§µ’‚ªiáØUßõI§Óa±°ÀÅТaU_×Ãs}<×Â÷<@töb•â_«Ö³êýªÀY×Ãc`•ŠhºXk˜U½Ã®ëâ8 ©Q7¦ 4C¯Ìù5“R†Å×ëA$öX¦R)²+:ðq ²EÝ$‹‹Ghkk£Ýuˆ$ãaê2ajq1ŸÃ4¾Ç÷(‹¤ÒI²ù,žÐÑÑU.CöjR'—+P(äioo%žŒ¡¡á:º®3oþ'Œ>†ÂGïOD±¬2ôçý¯S,+ÇP'™ {Ò…DL“b±ˆiš˜±(U) Å<ƒæ£Yï²lù„ëúD£¡ d¥(X8Î|uzvx,|×Å |DR˜hš A˜V-$¾Žëá:ZÔD“:~¥ÝÂuT~—•‚x©TØön€[i)Y¹Þ”Â9Ì}ßëlËêêZ\×îloÓ oÆØ–žgñ(®t޳÷]»r#&•H¢™¥|Û²ð]7œ£Ü0Ð*éÿñxœ|>O¹TÄu] Ã%êAÉñèÛ8ˆ¶lªd =z“ŒJÄÊVŒX”’]ÛÖ²Ètä©IU‘Édˆ&SH ¶åPÈ)ÙKI$Œ5’B)O®dÑÖÞ̲¦•K6žç‘HÖÒ?’&®Â³K¸¾åú¸ŽãÌD5UÉ4£G¥ª¶†d"MsËJJV™tU+[šNcŸ^d:Z(æ³ôèQO[{;Ñx¬RD,I&“aÀ€´eÚ(”JX¥ŽUƱmêjꈥ’š P*’Ëå(•J˜ºÄÓ=Ê¥0ß±<|? w}"1“T¼šÖ¦fªÆ©ëÑ›²Ë.ÝòðkP´Ò­†Æ'ófóïÿÙÝ»¢(Šò…©­éAßÞý»{7”ÍLê ÇbdZZY¸hf,B<"ˆ'4··’ul¤¦1¢H?Š¡Kš²íŒ3š~=ú£{¶ácqòíí” m$5‰oL]Gú:Åb׳х$ZUƒe»ÄcitÝ ¨j…\;­+—¢›iÊå=èÈg1…@Ó"ôjˆåX¸¾¾@«L1E ¯TÖͶ,!ÓÞÊœù h+:$jR|8k£GŽ¢*‘`É’OXѲ€d¬+Z—"¤†íúD#:½êêéQUM<š l(-âÉéT5…|†R¡ƒR9O $‰x ¾ã‹EÑuÈæ2ø€ë;aO–%»ŒC3pEšNucñ+Á檢²Œ¦ièº H4¡#5öUº=:§V•RG"\FЙžë8NXÀM8a:0‚B!O2ž@Èà Sˆ]ÏÆ+yhšA¶Ç÷º¡UªiGÉçó ebÉñDÛòð\×+cÙú¥ú‡½ƒ¾O.—#‘ª ‹Yù.šfàãa9a@W,åéQדLG;‰x’•+–# _—®­÷¿å² tÐÖÞN<–fEëJRé°—ø“ysØoÍ+W’L¦Xºd9®çã–ÊáÍ‚HŒÕ5˜šNY„ÕÉÛ3ÚšWЯÏ`ú÷JkÛr.šÍÐ;cyEô²$1°ËRx^8G°¦iD#q4ÃëûA !…†h•y¸bѾéWŠ»UÆkÈàØ.ç‹FÞí Ì@ÀRâ{–]&Ñq]0M=¬í9DŒ«²eahÒé$º!+ãôsF„êêr…BRà»>…b8ÿµ^–ˤn  Çs1tx¸®p S'—é@×uªÓU´µ·`•Â6ö¥Ku¬š†}X²l ÿía{õ¡¾º]7©­©£ª¦¯ã„/µ°'7b2tähp}œBXÁ}öüOÈçs,XºW¤’µ 4”t$FU^¬2í¹,­-K±JEÊ™ µÉjÉ =ûaÛyÛeÉÜÙ”rJ¥RxS(j"HÚ[—!tMÓY´`6mY_bè:š¦‘ˆÆÂZBÐÖÞŽ®› èÛS oJH3ŠíÚÌ]0—öŽ64!éQ]ÃÊe‹é×'öëgÏ¡\(’¨©â“ù³yëÃwÙyÔXŽÿþ1,h[IKG6œcû ü¬W´Ò­tÝ`øÐQݽŠ¢(_,Q™ÊJÙ®Ü~ÓT ’›°Þ’°k¶{¸Ìº™]g&]þÚõRÁ†$:×ßÕBá™t‘¡!*Ïkn§‹Í‰µþSypݯ¹p°æ׳[_ uwgÝ¿¯kÕKØÔå7fÝ3dc‡Elà±MÚÞc³Ãõ N8ñ¨ÏµÖµšS‚-Þ¼ŸÚæútÕH_ ÏÒNA°)ÉŸþ,éj=«[½ôê–è|Ve¹õžÃk6â:Çq}íºæ¢]¿§Öø¤YgýB¬¹ôêV>”TnDù¥/t8¨  •n§REQ”íÁ–½€ëâŠuÃKm®­mÑí(['Mµð±åŽêçYóÖÐÆ›²b=¿¯q#ú Ž%Tå&EQEQEQEÙ*€VEQEQEQ”M hEQEQEQEÙ*€VEQEQEQ”M Šˆ)ÝÊql^zåy2™ö5k*Š¢l×ú÷Èøq{ª"ŠŠ¢(вQ´Ò­^~íR©*öÙëÀîÞEQ¶{Ÿž–§«Ç?õ×OÍãñß{éÕ˜ñÑ{ìý>nÿZ/t6Ë_yˆßßõÿþ¤?Þ“ÑûÏÙgÁÈ”†ð2¼ýØ4nòÞ[Z@K÷aÜWNä¼)10¶þ€Þoýço <“‡ošL?s}÷3<Å™\öÜrJ€$RÕ›Q»™cO=Ž}#«Ïe»™×½ƒ{þñ6³´P”I‡ïÆ¡'œÉÉ{ׇ¯AQ”íž  EQeÛÓÍEÄ\²M-8½'3õHEZç¿ÍÓßÊOßXÌ5×Ma\•þ_Ñ﨨v«ÔUttðñ\}ÝÁØmæÑöêmüσ ØùÀ‘¤5—óÝÁÿ>ðM®Ï0õ‹ ÷>wþîiÚ÷<† Nh$˜÷wn™~çýyøüq¤…ÄËkŒ<òL¾Ù/EyÖ߸yú¯ùyr÷|0QÙÕg3ÿÏàu;JðÑý<4ëPÎÛ9ÁêE2K—Sìÿ®>{ 7ÇÊyoó—ûîå‚wÚ¸õg³KBBq&wœýcîþ8ÆèÃŽâ”o¤Nf˜÷þû´Ú›ûè*вµªZQEQ¶IÝ_…;Òƒ³Ëj4ã÷dÒP‹/|–'ç|—±’ˆ ƒž¼iO¾Î¬¦€ú¡{ð)§3ytUØ£”YðÌí\ÿó|ÔbDz2é´+øå¡½1+›Ytï>=¼XÙå¸vŸ42ÈñÑŸogÚS¯3sy­j_ÿåLGnl›v3¯G|ò¸|^èMäûÕ`¬qmRÄEL=¸CHâ ¤p˜ÿðEœ=½ñßú¿]¤{™a3÷ oSPâƒ;ÏgêŸ}&{ßlÒúÑ?¹Ä;·j1ç ¹àÉ8GM¹€3ò¼ñàÍÜ0UÒgÚ™Œ%À¶mlÇÿÂ÷Öb}c W]XùÜþË›ùhÐéÜñƒÝéaÀ ÿ17ñÔ·$²ü]û©µbDÍÕÿôŠ´d}Ì^¨Ñ ƒf)Ãÿ{y½úYgŸ 'Õå­Oû«ò¼¿—4–Ñ {sÏ%óûòí¾ë3Ïc8t,}§žžKPw cëtDá|j æ¤Kùþ®5˜kŒ'PÒŠ²cQ=Њ¢(вmÚ:hßÁ±-ŠN–ùoñÔ¥EÉwÇ!ÿ÷<ºž“¯ç¢ã‡“‚½' Ä:ãlüÃ;5uO¢¹&:ü£ÇOd·Shäkl"ZÛÁƒûaŠðÂ%ȽÍÝϧþ¿eê‰C‰­êúr¯ot›©ì›üáÿšh<ö&.:a`˜ö;¡Ͻ˻•m¹w¹û‰e ?ívN;¤'†€Ñ m¼:åþ6÷ÆŽÀùw=B€DÛA»7X…Ûï൛/ãÁÖ‰\tõÑ ‰ËÕm*õðäÝè¨Å‚§~Ëí ‡òý '…=ô?{._ûÕ{8žGÍ—§rõÁkÝtéä.çï½CâË×1¾J'¾Û·øJÕOxäéy5eñ5Ûî½K9ìÀÕÛü~|ëš“Ø5¥á-›ËÜB@ãØHméÁøŠ¢lõÔ4VŠ¢(вíÙ:è™7pÂÑ¿ böäûÿó#m0pçÏd¾•bÌî}ˆJÆKѾì±s‚‡>ü˜&{O† >’cǽȭŸÆ'ÉÑ_ÿ*û­^«Óª»ý«â-§ù#æ•“ŒÙ½ïêõVØÍßf¬uKì*vݵ‘Uˈµ×ã´ÌbQÙeÙ§pøMt¾>ß÷‰6—ð‰£KmË×m€”r==1>í/ßÄeOÛ|ŹÚ;Òu¸Îç­Ý¾%æ=y?¼i1ûýòùî8Zçõª zâϸýÆ¥,œñÓ"S¥Áô‹ö£n*^Ö¿ñØÜF¾vápbR"#8úÈÞ<ñÔŸ™uÂyìšZcÿ‡žÎMìF›BËBÞ|úî¹à‡x×ÝÎÙ a¦ÔµOï«¢(;)¤š…@QEQ¶A[G=àX.=s<=’iªkzPWE¯¥u•Ö 6€%"9úò»Øã­gxü±ÇøõÙñÄw~ÃÕÇ!N%ÆZ·ŠXà Øà4ÄÚ&‡ÛU¥èU|Ÿ({üøWL]#HÄêªTµeÖŸÂí·½À5Wý»ŠOªëºgxƒl>5•Ó·ˆ}ù;Î?°'æ:›’©> Ó›ácÆ36¹ˆ¯_{ÏOÙ›£×,\Wâã'þÊ2·•;N>”;Wý9ððüvùà4ÆNª¢ó6H¢7C† {º‡füø~dŽý1O?6“ü|½MxçÃ%ý>k¥p+вãQ)ÜŠ¢(вíÙ:n'û1jôHF êGcmC[Ý“kÔ£¿™cÆ[˱WÁÎRÞø0‡Ñoõf˜ª-ôý÷ø:?¹ê~sh‚™Oþ™Ùå€@‹2¡˜)á­D=†ÐÇÈ2ãÍe«×˦oÓè9‚fž÷_[Dy=%¾õƒécX,X½ d§4p ƒ 1¹uÜ»èn]^@ú^úýu<'æ§O ö3GÏ…÷oãÜ>aÏ‹nà‚×SY{Uf‚Ä05Dàá­sC$ÈÍàѵÑÿø+¹ý–›¹ãÖ[Ÿ[~͉ý‹¼ôø›´{Aë¬ü¸E2v@4E¦Æð­ƒj(üë6Ÿ]dC÷^EÙΉ°ZQEQ”mËÖÅ­'¥U¤ÆsÒä~üàá+øuôDÝ æ=;—õåøŸO -ÎÊWøË›>ýwª#æ¬àyüxR€^Ï΃MþøÜ<>ò­ä&qÐÈÝ9éÈFÎzìR.áxÝ@¤ÔJ©ÿ¾°ÓÆ·)R»rò·pÆ—r±ÿ]¾6¡‰òÇ,ʯžNIVïÁ÷èÅOž¸œ©òxŽ׋¨ÕÂÒì>l©ÂÛ;|îO÷@>˜ÎµÿÈÐÿè ÈyïñæüÕÇEF{1bDÊ|÷šùÇ´?±lЉœ×§ƒysr•Âa&uýPçÍâáûßÂ8€Æ*Ifþ«d)<×ÃóvÜ®ÈO_@:,yù%Vú>þ£Wröcë<\7™;ï?‹Ñk[—µ˜7æºxù»8çô»ÖX®žoOûg5v°ræ3üõ…d\ˆÕöeäWÎæ÷§ÉÀÈkõÛyíñ7):…} äZûjÐg¿C4íû÷ ?:Auc=æ¿îåg?¹ЈWÕÑwôüô‡Çóµqép wíÞ\<ý6Æßy'|ñ!®y8ƒ‹IMÿÑìwŒƒ÷y¤¢(ÛU…[QEQ¶M]}{÷ß¿}È!‡|!_îïáoBê ð üJï®È5 vU su†¡ë>NåñÊBÊÎ`(|‚ ¨<&*mÂ6×ܯÎçSéI_{>ßu—B"¥èÜ/XõïÏ[ï¾Æ~{i­s-ð½ ¤7 ¤&×ê%ö=Ÿ@jk«ü­«gK )Ö> l!ŧÞá¾H´.Ç+xž•mw¹ß]ž7Ax^Áû(R¬¤+в½Êt´3oþ' |¶}hklgÓ÷[t¬+в㈮oa+Š¢(вUSLEQEQEQe¨ZQEQEQEQ6A·§p+Š*¦£(Š¢(Š¢(ʶ@ÐJ· ‚ ‹é¬EQEQEQ¶.*€VºU,š`æ¬=rÌZ¹EQ6Ÿ`­ªûkþXç±µ ûô“×÷÷Máû>sæÎ"‘HªìEQEÙÆ¨ZéVCã“y³ù÷‹ÿìî]QEùÂÔÖô oïþݽŠ¢(Š¢|F*€Vº•® :ª»wCQå‹%*SY)Š¢(вè% IDATMQ´ÒíT £¢(Š¢(Š¢(ÛU¹IQEQEQEQ6  EQEQEQe¨ZQEQEQEQ6  EQEQEQe¨"bJ·r›—^yžL¦àsΩª(в­éßo ãÇí©Š(*Š¢(Ê6FÐJ·zùµH¥ªØg¯»{WEÙî…7é‚õÞ«ëúÕËo¾›|/½ú3>zGUA´¢(Š¢lCT­t«\.ËÞ÷GJ5š@Q”Ǹ]&0ãÃw»{7”ͤ¥¥…™3gR*•º{WEQvXÑh”‘#GR__¿E·£h¥[ †a¨EQv(š¦©‡Û‘™3grÄG¨6UEéfO=õuuu[4¶P´Ò­„*€Ve‡#¥@ÓÔWðö¢T*!¥TßeŠ¢(ݬ\.oñm¨oo¥[I)Ñu]]t(вC‘RªÞÊ®ø%–}4ƒ%É‘L˜DëîýÙœü o?z/W)÷%²¹¿ö¼&þqÝUü½÷¹âøADÕ÷êúí(ÇÊk啇bF¿c8iŸzôíôe*ë±¥?s¶RÁú l6êÛ[éVêRQ”‘@ >ËçŸÝÂ[þ–óÎ8‘#?‚ƒŽü6ß9÷*î~µw{šÀÀšËôË/ãÖ×Úñ¶§×à¶òê#òÔ¼-qçå˜ý꫼¿¬„ÿ߬Þ/²øÝ—xinnÛik67ÿpŽùÝû6åÅo®cµµs–ñÜ}ðôǹíësbMë¶ýg=¾ Aaºr ‡io&L܇C.ü7m›ë ¶¾÷ì–þÌÙ©èEéVBtÓ)ègx÷±[¹õK±7çgŠÛÄ?ÿ÷R.{b!Ö–ú¬òÚxíáiÜõÒvvá¬(;¹‰½^Ai6÷üôT~~×›8þÌ÷~òS.:ëxìçÑnoáìïo RúÖë÷e·I{1~bW?'óx“ƒç[öµ›¡V|y·׽Њû_®*÷âyLÜëp~ñr¦‹`Üæ“»¿Ëî{}—û;ÿÝ~Ë }ûÑ·gmS{Ù6DZð›ùÓ)û²Ûéÿ µ‹€¨ðÆÅì»×·™6×ê–`=üÊ4¡[ᛪËcg³àOçrÀ^_åü¿.ÛøµÔºmÿyÎ…-ÎfÖ=ñ«g =÷jn¾éZ¦~g i¹™vpïÙ ØÂŸ9;(• à—XþÑ o)c[¹-ÞíY2ã='wfR«?LÝ6^{üþ²ç¾œøåÞ˜›+}ËkçƒçÿÍ[ÞíÛiaÎržðaÞ:ê`ŽŸT§R²e[$Ħ ] ÊÌzð·Ü?§GýêZNW…QyÞ B"àwðÁ“·1íÉ×™ÕP?t¾1åt&® ?÷¼fž¿ù·Üûêæ©68æWÖùÚ|V¶°E‚žÃöàØ3Ïà«Cß¿‹î=ƒÃ§‡ëÛå¸vo“Eÿ¸ëïžZ,‚HO&v¿<´7Fî-®ÿéµÌœp1×OMrs]”~F_ºà:vÊû€ÍÜ.庻rÞ%G³SD"´4CªtÙF>¯}ßÛ iÙ¥ÍØ^ùíÜpßFÄ$«ßüO®»ç§'My— 0>ÿW¦ÑÉ—ÝÂ7„ØäS›O€ïyxr=Ç+ðñ<_E1]X÷ØÙ,yú2¦üæv>÷.9´qãiÇë¶}·ž ëáµòΫËHx!'6Ž„€Ø¬—ˆ›ç=«lª­£º»SÓ¬¹Ü»½¦Œm庼€ô[xê±Ï)·ónÖ[ûžiáu~vÈ—ùÞcËp6¥­Ês¸ë⋹ñ¥¶OßI¶P/Glñû¼«ï(+в­Ú¤ºøþu Æî'sü.Õ˜•BUBˆpµ°™ûà…œwûTy —\|‡ÖÎ`ÚùñÀ<+üœó Ì{gM}¾ÎÏ.û.;û«ÔÏz‚›n}sÒ üìâó9e¼Ín¿’{çTzÊ>Ïs°˜óÀ…\ðP;箹ü¨½À Sïâý¼G°j½âÜK¦ò?ç|‹]ŠÿæÆ©wð^ÑïüT«?â"nüÝ Ürãœ7>·ôI.¿ñ9üýOçò«¯äªóŽçË£j0@€mÛØŽ¿EÚiS5ŒÚI{îɤ=wcL¯("ÖÈ.»íþm·‘ôŒÐò׋8bÿ½™0é`?å2ýxUÚ¥ÃÂGÏãȃöeÂĽØóÐãøñm¯Ð´êBÈ[É3WŸÉä#fÒĽÿ©ç¯ÍÏ¾Ë ÇîÇÞg>Ì'å€ (1÷©«9é¨/1aâ^Œ?`2çüiÉz³°æßz“*=ê§þ3¶¯ŸáÝ/åįÄ„I_æð“¦ò‡w×wíäÒ±4FOÒ‹ææ[×X®ÄŒûnãUÑ‹8š ^åï;­¼xóœ0ù0öš´ã'ž\†cÍå–cöçðë>¤¸ª›×iåõ{Áq_= “âðS¯äñY›x¬>ãó7ÝFÚ`CÛÜ”ö·Wòï[~Ê1_=€ “â«?ø_^i_§rSÚpcˬ¯ÜŸé]›Í’¿^ÆÉW¼ÎПÜÌÕ“‡fñ]~yÈ>|óÞ½Ñî’‡øöÞ‡rñ›yüuÛÞ^çß^Ï^{ß:êÐpŸöû*ß8ójþ¸î>mðدçõú›øžòŠ´2ù!ûí½&íÍ7îœGÙÿ/ŽuÇóÓïÙp¡õæläu+ëÕí=ÐAi6÷^p>÷ω1ò+‡ò½o  ‡è`þ‡3¾ÐÔ´m5el[×utxGÒ}ç]ÞÀÝWIÿÎ[•»•þ¦‡¾¯‚MEQ¶.b{ Ýì¡×˜þ«{x×äÞåžGÒsòõ\tübR°÷„XgœÍƒx‡£¦îI@°+Ç *ÆÐØô§>Ú¯u0»'%b—(ï½ð?¼ùÎJœáˆ|Žç˜¹w¹û‰e ?ívN;¤'†€Ñ m¼:åþ6÷ÆŽ *ëÏÞ» *vg|ï&Þ:ïEž_pã…¯)ZÛÁƒûaŠðXY ›èðŒ?‘ÝvN…=Õ" HIOàü»!@¢uSïs¸;«Ú´²_ˆÎLƒ5÷ÊÜé ~øñôpó¯{~ϯÏÕððÏÙ=¥Q;ökœ5õÛÔ&<–¿~¿¹k*׌x„«ö­AóòÌyý]Vô=™_ž?’xn>ÿœ~+¿>GgÀ#?g÷ÈêmÖ¹øgÜ烛.ŸÌà¨À]ð0?¿êÿˆ{.7ìÛ½}9¹µëy= GÿŠ« 3´’}SHa1ûÎqêYö9ùl®&˜óô4®?ã,JÓïàÔ¡QÖ>üÙ¦<Á “9èC\2í|²Ï†Ç$Aó¿øýöøÑyÄoù mùU·¸7v 2¼÷Ï™Ww"Ÿ3Žj?V‡.ø^ç=”23ï<‹3ŽsÌO.çÜ^y^¹û~uޤßC?c÷è†•ØØóÓŸçLÛpllŸ7ÒþÉ2ïÝtç=ê³ÏIç0eX„æ÷ÿÊB¢s,fßµ±6Ü„eÖ×þâ ïcJv}Ü‚2 Ÿº”óó6ÃÏþ=¿ùæÚÚ×}þšùïïùø•Ç×n{Öþ·—cÖ+o±´ÏI\|ÎbÅ…¼üØÝ\qÒÇdï¿…ï Šn¼½£]¿Þ`ÑŸé=Uõ¥‹¹þÄ¡D… VßSZ̾ãsë.ä§ß³­À†>sl>ÞçùŽ {èÍ•šVšÁÕß¿ˆÙ“Ï-Ç„_¸îò'8sÊÃìô«;¹`tÿÜò9RÆ&¹¼qßÍÜûïY°2‡M‚ñ?þ5“ß½©³ã÷7!QÀfÞôqÆÿæ7×íųS¯cV7§’m+6xY· õoßÀw ä¶ÓƬ÷â§7¾‰›…9í=GîÏ÷Ï9“#‡®NÇ_pûIpGøû¸KÿÄï÷ ?ˆ[ÿ~ “Ÿn¥ÃMÒ0b'žs_VIõÞÐzý6^¾ó:nî,ÏR&Åî?›ÆoZ7PwXôÇ_rÎo²¼à¡Wõg÷¯ŸÉÏO܃z]„wFoøw¼<å-ylÑÅ~ØM¼pïõLûëÛÌk×i¾d´U› JÌûëÍ\u÷³Ìh.DØ÷‡¿åŠ#û`ªÓOQ¶Z›Ôí{Hm=ž€Ó<“ùVŠ1»÷!*e˜íË;'xèÃi²÷$Ýy¯²Ú “Ú5;CÆ®Ñô«†™mÅuÒM7ý9NË,•]–Ýx ‡ßTyzàû>ÑæþÈu×)ˆ4 ¦^ü•Y·s˜æª`tÕ!Š 9’cǽȭŸÆ'ÉÑ_ÿ*û­®\D ¤Üv_¥GÈ¡û&.{4.åå)Ïñ÷y%vÛ%Ajè¾|eheÁëYôùó›Ë°ö©&@bОì¿×hâr/ö軂WO«<Īž×åüß7òÛûpåmg²g­¼ì Ú¼c&îˤ±UhbW6”F«Ȉá;obÙW¸ùóèuÂ\qÊRpÀžƒ(w wO{ƒo]³5k®,°È´—‘©¾Lüþ÷Øùø;¸û­osåÞqæ>~o¦ä®/ àÿîõy¯­„G5¹ Ç 9d/Ükgâ’ð&…½ö‹²opóƒ‹}öÜ}T#†€±½[øÏ1ÓybÖØm— «>·äçJ¿ÝPlÒ>o ýÇ÷{•iO¬ ÏI÷rå©á4&62÷ooð¦Xã¸l¤ «s_¦f½í°ást×ae§Ò¥!tâñÊùàF¦|gÀÉwqÕZÁóf@bÐDÜo4q¹ì7 íØqÇmï0ùʉ¤ò›rì?ýz­÷?Û{ʨÀðáÈu¾§^üüǺ‹õ¯ûž¥Ò¹¾Ïœ ;½½EÎóA÷ЩiURÓV·Òê ‹JjÚýyö8n — ’Ì{v:ÓοˆòM×ñAaîÿZÅÏó‹€Î”±ã8÷¬¡Är‹xáÑéÜ8U§ïg±kå¢þˆ‹˜zp†ÄH1þçUô8†³ÏØ™j¯€܇aÕ;cþû->h;!½ ðs|üörŒa'30 îVJ¶­ØÐhÙo2WLnàìK¦ò›á·sÉõ]œ°e>¾÷\~òXŒ£8•Ÿ4äyuú \}¾¤ïôs˜PyBÏo\úÿìwtTEÀó¶d7=Hh  ½…Þ+½ RéÁˆ)*½WAQÅ‚í³ ("]zï=$²ÉîûþØM²I¶PˆÎïœ='™7sßÜ;óvgîÜ7ÃÄÇ‹X½rá~(âúMèÛ©2ÒÎñ¿Õ ˜6JKñ5#¨ækâ°+¹†xöý°•“:3j`%-·Ñ”)€V$䨟†  Oòâ˜6û˜¹ôÇûÌX1™Q«™P7ù6ÇwìårxW^wâ)~X»8«>)ì;—6Z¨Ûe ÝËè¹¶ÿk–ÿ•åQN;³qÓ¶`l7˜iuÃÐÞ¼Db‰ §P‰DòàñtZë_Œ0=ì9tdK:WË—¬òo¤Õk˜²&˪½,fç1;nËXÒ±` æ IôŽ6Øé(0 pð Bã…3i6™Öj稾$­',¥æÎ-|´a“‡là“ç¦2¥Ci¼ó›£:Ó9 0Ž"”O¹xË ¤qiëJf.ýœmG/“¤ø M6£»•Bö…]ù"öå­\ûl<Í¡tZ<œ¦…½2W… Qmé^ã{f êÀ‘æmèÜ¡5ÍÊ9ŠÌºZÿ7]ÞDZT?ªÔ)Ž·ÍQ#Œ%©WÅ»÷s9µ.F»½%™wÀXÒ¯°*ôi²”!K¿á\t–||™ }ÚQÎ/ÞpûzfUE'Ò=³­^Ξ!Ó•œLMçÜ[mˆ›’‘ªb1[0^JÂRѵ­Ü–Ç÷®Þô*ë¼ <­³³öOó:Èé´@jÖ´s¤ %ÛÈ“6ôö¤3üUNÛÁQùýÕÎ þ9cçóÊLÿr¼õ{#¤uôÛøeÕTU˜ÆÀÚ!¶×3î'YuÒø•£i%o6>ÀS-¼<µ}}óúLÙ;ÁÃgÊ­­sH&ðN¾sL—ÿž~þ_àN ïkhšKî.d  ªøDÔ ^hŒë/»±)õ“ù~ÏMž.RmÒ ~;­õD|‚ŠP²ü‚Ë]¸…–zƒ™Üi}§N¡ZÙ7y&0{5a' ?8K¹«ðDatb‹\ç—çÖðÙѾT¶æ3(AÙ¨¹¼r~eЬ^y¼Aµ"ØÞï|s2™*%v»–kíS>¥ãh“åLÍ©„‚_éº4-mû·|AÎ~׋Í^ µN€Õ›ŽŠwD êÇÅà­ÄQ½èe~ïo­G墿³äóË„uYÄkÝKY=Ê5‹pâëüië^æÄËܰøP¿f]jUôGC%î÷æ‰äþãÑ1V¾±<Û(m[Vði›:—ñ&çO‹.$ŠâúØ¿ó"¦ØRÖ3mÓγã@"ºbQ„èâ^·SömR„ëR9u ?Zo%ÇJ‰ÉÍ“Æ ?=$Å'çÚˆQh}(^óYWoJÃ9ýõégyv•¼¯Æä„Ö`uXTÒNÀðÑKHl6˜7U$D=ņqoð‡å3ð®ÐŒè“ß°nòêÏíO­ ­Õ>†H:ÏúˆºÛ?gÍªÕŒí±šu½ç1·{´mS#;¹¶wËQqà˜Éý¿êèE)s7’Àh@#ü©þ|Š>·’Yïùñ‹h̬¦EÐi¯ä I×nc†»²CÌVGN—g3$ÖÛNwh0Z‘èÚVnËç¡.–t,aý^ÎÛ@ëaíÉÖþŠ‚‚™t¶úvÙ†ªyò@V½(×{*ï¶²í¸® ¤œÂ÷Eš3îí~üòÖP&ëCâ›óÓ8Ô:‰ z ˜’Ӭ޻û4¸Ñê4¨ªÙº×Ò]ØÈÓ3åŠûakWÏl¶|ö}æ~öóÿv:¡i±®BÓ<¾aÞBÆìË ì¼>¾14/¯aòw»¹Ñ¬çþà/S1:”÷G#BäŸP²b·!N&v+BãG…î¯ÑowfLÜHÅI%3ó!H»vS©éœŸÞ‰†og°yÏ.§ ÚÂ…b=s5óû,ãB±nÄ£Œ…ËÊç\J°vÕÜ ‚¬e• Áöu!Ò¹¼m ï¬ø‚ߎ]Éò¦'¤¢fÓ;KޱHV=Ò¯æLZ 5j„cÔh¬õW”Œ »CTkž¯ö#³‡wåØ#-éÐöYšFÉ/>‰ä!F±}÷¸EøR¥ÛšíœÈŠ!ƒ8Üò1jG#X“ÈÅc9_´}šV¥{«b¼¸~"“ ]y,N|»’÷/¥ÓKÕðÿ½iJ`Mº=Y˜ÁŸL`¼Ò‰'+Æzó %hþx´ûßkm±¥ô|üýZ>*÷$‘êuCkÓ0ø/¾Üi¡xDAŒi—Øuê6ïø(5ááØ…û^I9³ƒ£éeÞ»% Ât³?¥„u‚‘¼K·fÚ˜ê¼ñÂ[ [„53Úi€@hýˆ¨Û1µ[ðÈÔÎô[¿ƒíÇRÍ×Î ¡1h€;7’1ÛÆõ¡å‰Ð¯d×¶ó¤TŽÂ[0å×݉èK–§°WG†%™ødƒ¯5RP_òizV]ɸ/¯R¼çëTóW _½Êíkw0ßGèBÊR\›Â‰ã‚°§Ká“mˆ‘åDwf+·å=&'.bÂ"þZë¸ÀITñ°ÎNu%B¿Š?Ÿ$©J,¾êéIê {ÐÎwåS(U•¸ÒY)B½šñïž}}1>}9fú™ ŒV@x€àË£çHRË`¼›[çÄtžíû­ÆBzÚÛ©í=|¦œàÑ3剭<³î¸ýü¿Ç@ß·Ð4!Ð*–ï”G!cÎPü¨üx%´S¿â·ëõˆÞºƒøÂM¨R@›o½à OÂ+’öcû±µÇ&~Ü£}—9‹j¤öÈé ˆÉá=+„V\ð¸m…&‡WÎ¥ÜÜaˆŽH;ó£Ç.'±iÆ÷«@Aõ4_“<­‡¢ ¨®<ʼ"è0}µÿ‚ukßçÕ>ïóaw˜Ýµlž< ‰äŸÅÓŠ&(ŽógSyÕj6mÿ˜w>¾E::‹–£NËt,è)ýÜ›L÷^È‚MswM¥`©êô|ëÚäÚØéïÆHùÓ™¸%_¯á­O0‰¬Ýƒºz0V‰ë3ˆ'§.eí”×H5¢F§hjÆå§uŸ°ïz*ªj `T=únM¤—@˜TÌéfÌù|ÛX¯°XÂÅRÖ-þÿÇ*QÜç2gnßŘBÁPü &L;K·>³¹¬<+^ˆÁëÊO|´ÍBÉÒ…ð6]à㉨¾!øæôùë S)ÊÀÚ/—°¦Bʨ×H(Ò€'*Ô¢§’tZ>šqÆ>ÃZQZ½FBáz<uE]{°©Ö\6 ±¾­Þü–>ÏLD3ñSæÔ×±ÿ=rÍ'™ß¥{¶ò˜/òA¯Ž¼ÖšÉot£6x¾Û x´/=›W ˜ñ ›_{¯+Í䓱UðMÏ-'{=¼8¶¬/]—_£rëž´©U ßä,Ÿ¸”«—±¦[$š+?óÉv %J…`L»È/‹Þbùv¬\Þ“(£§_â‰äŸäfü NœwìþNRø9Ð÷'4MG‰Vã—ð.K>—ñkÍh¼ü)Y™è@ ÊŽCÆ–r¶w)€žâ¶¡Âú™ì‰lO½P½õGÅò/%û§ÈSçÖáÉ}ØÜå]’3½©Ðw.ï¿ËüÏ–ñú†[¤‚(]ÿE>C€¯F0æ IDAT.ˆzƒFÐrŠ'Mc$°P,#ýÐ 0]?Äw«6°ûj ªj$¤\#†¾ÚÒ{@%É?§»pKò'BÑ8X1(šœ©ÙÓ„PÈ•Åãò¹¯g¯‡‚ç§}9?ÌuÝÕ×A®¶Ê» œ§;—åÎVžÔÅqY!œn…#Ü·A^êìPW÷w{Oóä¥\÷OŸ¡(N¢ly-w8û×Nì\ǯwhX±úlûë((ˉaÞlGíé²¼Ûûº/›-ŸƒÊxÚg<{¦%<ðh+ªÍ[æ$45'ž\Þ©L¯ŸÍ+ƒ+ŒÏM®rv÷Kü“©/LâJ÷ù¼Õ,cË}«œüJöO±s÷o4¨Û$W_sì‘gíÜßm}^9Çr]x3<’‰7:³÷É£ì±T"‘<,Äߺɉ“Ç(S*ZN¤ÿä\–H$ÿ0É{˜Ð¾? R½í(&ô©M¨V€é¸uºöB>“ÿ޽“ä™ÿÄ ´aÝ%ÙUO-˜Q¯€ÝŽÇν¶’Ü8ëÜŽ=’àÊËì¼Ü›Wα\ÁI·u»W²ÇP‰Dò° Ž]؉D"É;ÆŠŒÝø#c°ùô‘¼øáÏôÍçaÉ’‡‹‡dH¿À3Fòþ-ceÔ뉖ï™J$‰D"‘H$ˆ¼…÷K$÷‚œ@ç]Ýænäy•ìCH$‰D"‘ÜoÒ/óÍ{ïðs±ÞŒmU’|}à‡ù:ÛÖ¯c±vt¯b½'‘H$ùOÏÐdb Öh4hääù¾±™ŽüÈüÈÏå#‘xŒù&{¿ÿgmÇ1¦an·´›½—;–|¶aiÚ¾_½–͇I¿›ªçEwKgwoeëñDľ®ê£l|³7-šÔ¥Z\=}ùGnÈ f%’rZòÀQUE‘¾‰D"‘ü 0]aûºù,ùj'O^%Iñ%¬\MZtDïú…¬Žz’ÇUµn´ €b$´h1Šòõð4‡‡ UµØtQÉóFyÑ=å0 Gæ¯N«Y™×s¤ï‡—aÒ·!t6…Z¡ZÒ½£ð—ïàJ$ÿ äZò@1|8xø1å* ‘ï¨H$’¿»r¤9®eÏh½–»°³tO°X,=~_¹ý/CMú‹ùýú²ø 7ž|†>í# Qâ9¶g7×MÖé¢'y\¢+F«7æÑRˆÌ³™ÿ3äQw‹ÅŒêøáÿ{1_g×ö ø5~™WÆ'ãìáÿXsI$ÿVäZò@)S*Šc'Žðã/ß=èªH$É?FpPІÐÕÜOÔd,}ƒÅCh÷Î"†VDg[qlþD[ë‰ $³ß]w“,ÓqæuêÆ¦Úóøx¨íXK{7Ìfæú_Øw!MPy:¼5›Á|PÒ¯óûÚ™Ìü`+GnhiBÏ‘y6Êå2[¦¿Îü_ŽqñêmR…/…Ë×£ûÈ¡´*뇆dŽöÍÞ+)¨†Â4üSž-Š^i.d Àt™—LcÎçpü†–ÂѥঊÆÑœÖ|…ogN`ÁOG9w%T}%bÐeP?ž)›!/º—²Š=9¿3µXÿ®:é ÆäÕV9Øi5kºZß)O?·ŽÎí—Szö&TNá×…Ó˜÷í^N^¼EŠêG­——ñÎÓaè\ÙÒ¾ÝÌIܸ£ÿyl¶^(Þk5ëºùó‡3Ùj<»×ÏbÆú_8pY%4º.¥S¥ «l³­­~>ÆÅk·IÅ›ðêOó\…íŸŶ£7JS¿óh^iWÿüž ‘ääZò@Ñju”-SþAWC"‘HþY„í(+É¿‡;{Y½ñ úº“èY-½Ý&3Òàö>÷y<@µ˜1[2þ3qlÅ@z,¸N­./2¹râf<a^‘ÂÁ%é·Þ›vƒ'0¬ðm¶-›Æ¤¡ ÅÖ¤†á6GßÍ¥¢=7ªÞ‰'ùnå|&ÕR⃗¨|}=/½õÞ†1«~8Ú›I,Œ7²ýRÙón_†h¡^÷¡ôŽòâêÞ/Xr|)eNäð¶œïÎØ¡Ñ“Nóë†eLì~ˆ„5óx>Ò`]Á÷XwkŽÐÖ“˜òTz!ð-ê‡"Àb6c±‡Zµ`1[°˜o±ç»_8Q°+c‡V&Ðr%ª Zw¶ô×äz¢šŒef×2„ÀŽÞrΉìTŽ,@¯Å Ôë1„iQ‚£›0³ï@’W.¦WŠÙÖVÅzòÚ˜ ×w±zÆ*¦üNóž½x½‡/×~ZÌÛ³ÇP°ÂûŒˆñvH$w…œ@K82„Q"‘H$ùô›Ç9vG%¬r¤ÓÕ¿ôøcnó˜“o“”f{ãYhñÖ¹AVv0gÅQB;-bJßr¶pa@HØÆÜ÷Ï3d=Cž.‚N@¥°küÔn%Ÿ@õŠ*¨àY‹†ubðVêP³è%¶¿ð=_ŸH&–KÜ0ûP!®>µ+ UÈEVv¸”]µÔo,øäáÝWðf¯ÒqE8þåþpö³¯‚OdÄà­Ô£Qƒòh: `ñÂ]´z3ÿ<è.’¬CJ]¶$zao$¹4§µªŠoé:4®‹·’aËŸ]Û²ºo®m]p ʖ˜qoNdÿÂÜU'(Üy1{Fã£ÕŠ$¥cO–-ØAÛiõÊ´OMêÕŠÅ[©Jø¥h·ª$O´Šº~ ¢Š‘ßdÛï—0•Ä ‡WÉß‚œ@K$‰D"‘Ü+ªEëbSL‹»ã˾õ8˜¤¢u#[_8†}";>IÒÝî„m:Ïöý‰èŠEQHŸ{×Wº£1h€;7’1ÛO'µ„®=GRªuï¶tŽ>´<úvm;Ÿ¥‡é,¿îND_²<…½<Ý1A®8K$ÿrZ"‘H$‰ä^Qü¨õâhžØþó{<Ï_Ÿ¥AùÐ$pþð~ÎïİE=ÈS̺ÃuZÂüW~ÿ†_O§q±ì³>T‡~mÃy~ÕpF¨=y¶r†¤«$E4¡y麼Ø&ŒîëF1LéIëáS®r&!‚§ž‰%ÀJidãv %KÂÛt?Ž'¢ú†à«%Ølÿš èIÇ%#béM»¸âø&àäíœGÇeçÚKYñ8UBLþr1KΆÐ~\ æìy]êY˜JQÖ~¹„5ÚPF½FB‘¯¾¿Œê òáOkxëýxÒT=Á%*аcf@ï6OŽwW5…yl`g¾ð1³>jBíAÞ9îëMl¿ÌšÅ»çóòêD,†pQ¦¥‹P±ÿBæÏâ½O3ný-Ò Á”i8€ÆOy0¾~o–¯gוTP „”oÂÈ )cPx»–­1ÕcËç0{ý^ùàiA¡hRÚ­“I¡bHä·U“YyÙLPÉ*t:о}œì(íZ÷C_¢õ«ï±tüRŒ¡ÔéCó DvžÊ”[oñÞ†) _’Žb  PTubƒ´."ºÝéëÆ˜.1P¶×{,ð™É¬§3äŠJ¡¨8ÎÆsÑF¹›¶Dòáè‘Ô­Y³Æôè£ÊÝ‘%‰D"‘HܰeËÚ·oo7©¨Õú~m&¡”Ìq•'yìP-X,*ªPÐ(`1[lgåUmy2¥)šÌ‰WÎkd–UȲ¦¡hP°Ý7³œ@ɱ˜sÙY×U{„âà¼kÓqætèÂ'qóÙ8´¼u×î\yÕוî*‹%sÅÛ*KØLjÉeEQÂñ=<Õ×U=§;’QeU Ö¦Rlz×ò%’ÿëÖ­£Y³fw5ݲe ;vl $cݳ? ¸c÷w2"W %‰D"‘HîÖ‰°ëIOòØgWPì2+šÜ%…Ppìæšp Ë>-û}ó&;ëºÈËê¬PP4'@Gõu£Ÿ„¢8±¿ã{¸¿—'2îE¶ƒ²¹ò»–/‘Hîr1‰D"‘H$‰D"‘H<@®@K$‰D"‘H,úH^üðgúÊðc‰Dò#'ЉD"‘H$’Œ ?–H$ùƒüÂmŽçÀÿ6±zÙj¾;oº¿Ä[îpvßv¶|¾™ß¯¦ÉÃç%‰D"‘ä ËMþ\ÿï}}ŽÔ‡b a!~ÏÇ,\ý ÒTÒÿŘ¯ðÍ´aŒXs<÷yÑù†<¶›%þ!ëÎø¯ôÇÿŠž÷›‡ÓnùgzŒu³±lýföÄ›]ž!˜gR²pü$¦ÎYÍ/WÒï¯l‰D"‘H$ÿ~Ò¯³ýƒ÷Ù´/³£„%‰³»·²õx"fÕƒô{ÅrçÌbù®t¼Ò"Ô;GÙøfoZ4©Kµ¸&t]u‚;ç71¸U'&﹃ER0·[ ÚÍÞË‹Ù9²};{/$ã.ëCK^ÛÍ]ôèžSßÌv‡¿?Þþ+zÞoR»ýý!Üê-¾Ù…)-ο´¢±nz3 j]¿óbQ-¨ªŠú7¬[,G5ä×oV‰D"‘H$UU;áS³pÔhþê´šµ‘~Y;@;K¿G,Weã~-5Þ¬H Ý;ÅÎÒL^>†I߆ÐuØâ Ї‡£Mù‘Ón1“SŒ„-FÑB¾hÜÆ‘ÛD×ëÈK£Úã¯!ýÌj:uœÏ û²6ªNú‚…MQTçå€ ùž\·$ìãýé³XóË!®jŠÛð9Fyš²¾Ö#×ÜêçÈnQÿøGÞ³9ÍéZ«ˆ|ý¥&‘H$‰Dâ‹ÅŒê`Fã,ýî1seëgðªÆ”Švç(;Kˆ0_g×ö ø5~™WÆG é§ ÛXWŒVoÌ£¥prvö¿Š×n÷¿oÚ“úã}!‡žÊm̉Ê?3ö%H>ô9ï.ÀpßÒ¬éU£"0'ß"I-DÛ‰ãiQX‡c¥ ‚4N¯AŸyç©Ùu0¯‡žfãÜÙôzÙÈG³ž"¬ð£¼17–dKÆ“Îů'3îSêD@¤qzóòáºt—òÝ^ùhÔ@f\¨Ëàñ/eÚêéSéqÝ›O¦5£Ö~Nìöõ¿-h<ù#ªIüþZ^Ù‘ DzaRþаžc§Þbÿ§ËXøé6^JÃ?¬M:½@÷F%ñvµdoŽgÿç.Ê¥æãsø|ßIÎßHÆ,|(C“¶Ýé\¯Æl²oñÅËø2ü‹”¥nÛéÛ<Âúå `Ià¯ÍËX¼é7þ:Ÿ‚o±²4hÝ‹žM#ñÑë½fÍeóÞS\¼q“ª' ,І_¤WãYz¸«³D"‘H$’|ɵ/Æðä¦kÜJ÷%´|=ºJ«²Y«w'çw¦öëßU'}ÁÂ8'é M|?k ~:ʹ+ ¤êƒ(Û€.ƒúñLY?4Ô[Û™ØûuöÕ~‹%ƒ+â—1^1_áÇÏâUý-*Ø H³¥§°ãµ6ôßÓ‚kûSΨ îüÁKÏátïõ¬hŽ^X¸öEZLIç銧øäìÓ¬|ÿ~æÕ3á£4/¨±«c7î¨ÄÞŸ›­©Å{­fU““8ÓqæuêÆ¦Úóøxh ÞŠK{7Ìfæú_Øw!MPy:¼5›Áe³—µ$ìæñapVÌhG)Ý ¶.˜Ê¼o÷ròâ-RT?j½¼ŒwžC'²t,¿‚ŠÏîõ³˜±þ\V ®KÇÁCéT)ȺBn¾Ì–é¯3ÿçc\¼v›T¼ ¯þ4Ï5PØþùWl;zQ 4õ;æ•våñ·_VÏÙžæ+|;ÓußpÛ`qSgg}¶I {}ÕdŽöÍÞ+)¨†Â4üSž-Š^8Óënl”Æé_bÀ‚ß¹pÛŒ6°µZ â•qÒ ðÔVi×ù}íLf~°•#74„Æ4¡çÈ<åç:ÂánôT¨Ù{5„°öû:e¸óÓV¦í:C2¥1–¤ÜQ [)–ØÌçC |ˆ÷×Àçñ™Lì]ƒ­…¸ s<5f%ŸhFÿ¨¢+̬búÅM,úú•O§SI/”äý®Ë?vO×_Ðú݂S†Ó±~ZQ…2Ê>žxe%_œoÄó%ô®õsÖï]4Ã?Í?³­hl?;ï‚F£±U‘£¶þ,éfÑWËs»ùhÚhnçñR\°“Цpdµ›riWùsÛ_œJ6£*zôæ.ÝÎÚÉr ß¦<ŽÞN¢%UE/Ò¹yî›g¿‚Zd!Ã*ú¢Â¡å£²á,é¶pƒÔS{ødæ`ÞšÃÌ6%0¤]åÏ­8™q/’¹qv/ŸL‹9dõ VxP燩‡H$‰D"ñ}Ä#ô®*ÒÏòÃò9L¦¥Äú—¨a›A‡¶žÄ”§ÂÐ oQ¿ÌqQ®tË)oÛÉùðîŒ1é4¿nXÆÄî‡HX3ç# €Š)-Sš9[$ŸùÒÏ|zÈ@ÜÔ Ù³§{Õ¨<š¯vñW¼…rF…Ôó;Ø—˜ÎµíǹÓ& ½HæØ¯G1—êG˧æ³WîwÞþÄ:4ËÌ®e01$¯„ÜyT‹³%ã?ÇV ¤Ç‚ëÔêò"“+‡ nÆæ…°•«©§ø`ìHV[Zòî„V”2„)ž=ßý‰‚];´2–Û(QsŒÇ\ÉOåÈ’ôZœ@½C˜%8ºy3û$yåbz•1 ˜osô÷Ý\*֓ׯÄ`¸¾‹Õ3V1åpš÷ìÅë=|¹öÓbÞž=†‚ÞgDŒwfßÈÕži‰nûFFÕöG¿4Ž.uSgœõY÷úšO¯ç¥·¾Â»Ã0fÕ/ŠöæK£sÕOÓîÆF‚+=ÃÀñí ö1sñ÷ÕL]:žiÑðVý 4fOl•ÂÁ%é·Þ›vƒ'0¬ðm¶-›Æ¤¡ ÅÖ¤†¿Æéä-ínô„bë÷æÛœþõ#>=ãMܰhül}5ýöîi·oc*ˆÁn-ýú~v^ÓÛ¨,þZ!‚+7%š×ùíp}£Œè2ú¼šÈÎEóù= 5+ž*—"Ü–ïí}o×{”¾Ám¼)à…F„Ðà_º a¬â¯K&Ôâz—ú¹²ÛÃÂCqŒ•åÆVæ}xŽtsQºÌz›ç¢´\Úü =æäûõ;èS£9!÷PÎzÀS3¸¬‰] GðòçÙ³b-š §rf›ðÄ´Å .s‡ôgÉ©›lýö$ý*Äb¸ñó?>KºYO¥¯3æéRÄö ý–æðêìzôâ´9îUæ*ë `Ùéëüüý úÄÆb¸éAå Z"‘H$’|‰tckh]­Yä<¿öþž¯O$S½´õº1¤$ÑeK¢X'vINÒM€ >‘q4nƒ·RF Ê£é0€Å wÑêÍ8üâx}Ã7¨ÙÎNNçŸsÈÇ‹ýíVtr¦ ücšPN™Ê‡iYØŸë»ã2ÒþÚÊÉäzjÏðËžJ¶­FdE/ÊkîwÞªN÷¿Ñ— lÙ(Œ6{¤%º© ;˜³â(¡1¥o¹¬èA!&[¦´‹|5ñÞ>U7ö£V°.kb¤ªø–®Cã:±ÖhÀŒÕAä“°¹«NP¸ób&öŒÆG4ªIJÇž,[°ƒ¶ÓêDF{Ö¤^­X¼•ª„_úv«JòDû§¨ë§ ªÙùýH¶ý~ SùH ÂE{ºënúcµˆ]žÕÙAßT¶¹-kL¸Ä ³âêS»RQ™ì+Œ®ôÊ‹üÊÔ§Y[ùØÎ|Ó•Ïþ¸@j½@¼=°•ßíÌ}ÿ,1CÖ3äé"èT »ÆOíVòÉáT¯î‹³·Ìw«'*7¶ äñ×v‘f6Ü|o?žñ ’–$ð÷ú‹7:¶`^D4êÂÐa]¨[HGzü9âU?ªf- C¡>°÷ì-ÒÕB™èô _1wK*µ_iO´íÝbwåSJÞÛuQ¿:}>`Ëê¯hUâi¢Ò¹~ñ&©j2 )f·ú —v{8x(†Mörʬ¢r–UÃ:òøSmé>ï éõÊq®¥;ÞÚ+¯å„¢ ÑS¥å” jâ1þº‘žM¦Ð(h …©n]¾… H½¸“fÕ«2í¡ Ñ‡R@„íc(E(‰\¼eκl—'[1'éÖÁ¸õ£ñ+GÓJÞ$=À“Šj;;Yc¿:“~‘6Ã;îI*øÙM¤+Á•h™Î¾“dŽgÏ)ý|w*¥üɯçS1]ÜÁöë¡4¨Y¯O^ΰ­Ôy8r6]ÞËÑ?ªÔ)·¢dÚ̾ôµÏÆ3ñ í& §ia¯ÜïT ëÄ'g9wòM—÷q,Õ*uŠg^SŒ%©WÅÔû¹œj?¶Ë¸‡ž‚‘ÁzƒøTÛ=!”„Û×ï¹µ’³öÌ”å¬oØë”»?š.y^çœ}Ó}½¢ÚÒ½†‰Ou ÛkKøê`eÍä.þs1CF½Ïq»3ɲ?vˆLLœØ´žýÆzt®’+ÂÕYùŒ–¿Ûë" 6#_Ž2{ßæ¹ÇR½NSZŒ\Ç9‹¡~Z·ú©.íöpðp¬@§§`Æ÷xC Y†ÒøU H#zïÝ–Óè è̘î˯Ád@MO·n~¦ÚwX;¯£5¨ŽšVƒ1ØÄgÊñ¨Î$I$‰D"É_­fÒ,öNÛvÐv?öÎÒ¡ÕiPU3éN¼íiçÿÇgÇ}¨7 »®ÃtM(ueÆGßsìZm¾>LãÁ¸} ~¿Èºï9T›qŽÚ¿)ïýôXÌV‡‚‹¥!ï ͈>ù ë&/¡þÜþÔ Òz>æò@~N]„°ŸnäF«×!0Ù3¥Å ‹Ýbгöt(ÏMßÈÞM‚r×ÙUßtYÖIçYQwûç¬Yµš±=V³®÷<æv·®X{ª—;¥þ€á£—Øl0o ªHˆzŠ ãÞà;—–Êa+s: Ôyy6Cb½³Mr½CݼZyz*~E‰®NtÅêTö;Ío­à‡¾õi¦E0†ݨÔÝ<6æk~½ÜŽáˆÛ\º•–)KM¹Æ•;X4mÆ}LgØòÍüë&ÖnªuSÞXôž®k…–Bu_dÑ—/pçÆUn©zn¬ëM·õE©]Â`ë7Îõ+U\Ÿ§~ÿ x(V ½ •' à6I¡õèÔ½'}{õ gëÇy晄ê-^Z€$.^JÆâi¹LTL&«§êüö8¡ª¨ú"D:ö}æl+¯"±”P"u~}›¦N}·™#ªŠª/A¹Ç_¹ää©Î‰D"‘Hþh àÎd²½±ì,ݦólߟˆ®X…ôŽîiœûþ ŽûÖæéXû°Sgé:Š?ò$‘ñ?³aÓFöøÔ¡^±0j5 ãÜ—Ÿññ¦jÞ‚2øÛòæ'&ÒЦ¸ö»¶#ÅÉ®ÑÞ¥[3mÑËÔ¿¾ž¡c?ædŠç1®äëCË¡O`×¶óY×Lgùuw"ú’å)ì婞9s9k7¸íÙхƸ¯³“¾é™¾¡õ#¢nÆÌ]ËÜgT"Q, IDAT|Ù·~“TÔ¼èåÆF)gvp4½ {·¤A¥hÊW¨Hé7úç°•.¤,ŵ)œ8.‹,EéRŸHÂýÜ­5Þ›žÖUq^ƒPͤ;8²H‚‚P-˜-*š±T 6±ÿ§£ÜV­Î[û¿çZ„šeý37,4û‘ï.xSó±h|ín®-躼×=^×E£Ã/¤¾cÎÇ—|ô9âsïyS¿<õûÄC±­)Ò„Þm`ô—ר»|$mWhÑ)fÒ,zê¼¾’תû"t¡”ƒ¦ñçô~LðYÄøš”˼KߌéÀ/HM1c¶¨„<ÖŽ*þ‘⾎JÁô~ê†|r‘?—Œ¢ÝRªZÏŽŽh×…êþŠGr<Òõ!ì(‰D"‘Hî]a*EXûåÖThCõ EðDŒ“tÛÎÑ×~Xʈǩbâð—‹Yr6„öãj¨ˆÜ»p§Ÿã›/Oã_w(1>v“““t@[´ ­ËÌcÚ’«„vêE„—}£Ç):w.«-aôz5ƒm`òwäÍ¥ƒói| àK‡þ8ÌÕØ*„æ\ý ªC¿¶á<¿j8#Ôž<[9 CÒU’"šÐ¼„mR" ÅŸ`´³të3‹‘Ëʳâ…|Ü/W½\É/]‹þJÒiùhÆûðLÁ‘Í Xz®8='Õ"ànv.Ú \÷ìqĹQü=¨³³>[Á}Ù´‹?òÑ6 %KÂÛt?Ž'¢ú†à«q¯W^ð ‹%\,eÝâñ¬Å}.sævîUW¶R‚ëòb›0º¯Å0¥'­k„cL¹Ê™„žz&–Ûpß•žIY»r^%) âWÖ-܃Rqq!ZDÚy¾Zñ5ña Ö‘pj;ýFZÙ¾Ô+¬C¢éØ)šß{ƒ7Â^äñBçøøŸH«:ŠV‘Û« *wNîâ¬F»b†ìs £›òú{¼.,Ü>{ƒ§/pä¯Ù°áWΗêÊÜAÕ­¶t£¦Ó÷­ü]<h„Õú½ÃÛE—°ôË?9|ö&)f þEJQXcÆ(Ú´6ˆÓ³Wòõa-tat_Îî6ÞÁ>¤]»þáTyäy†wÉÚÂm½‰í9·ƒ±`óŽ\JÁ·H4qÏö¤ï¥0z,Ç]óf=‰D"‘H$;J †¾DëWßcéø¤C©Ó3†æ"§—µ3$ð۪ɬ¼l&¨dºNEߊ>(¶pY³9³ítÓÙoÙ|ÆŸú#Ëgîæ‹‹t4EhÔ2–铯ñXó B „5äéÒs™‘ö—Ðg½+ü7äÍ©ƒSóhÀÀ._1níxfV^Ç›•sæö&¶ßæÍâÝóyyu"C8Œ¨FÓây àW±'“zm£ÓâI¬l²”¾Žîœ³^.ä—£l¯÷Xà3“YNgÈ•BQq œ;Œç¢w}~­ËvÃußpÁ}…ó>ë®lÊõƒ|³|=»®¤‚j ¤|FNèLƒBÚ ×zå}D'¦Œ¾Â›K3öËTPUt~…©X<ëè8÷¶ò¦bÿ…ÌžÅ{Ÿ.fÜú[¤‚)ÓpŸŠ%@ãäæ@Ú]èiI‰çò__ñÙªSħƒ±@1bÁž&ÂK@j ×NüÌêU‹¹’¢¢ #ºá@æõmCiƒ‚@ODÇ·™kšÌÛNaäm?ÊÖéÏ¢—ž hæÙY&.î;‡Å¿*er)à®ü½^ObÏì! Þ.(\¦õΤËS5³mb†Åµ~iÇï_ÿø»pT+Ýš5kL>ú¨Ç7äÕb¶¾SœmÇHÛ5Õ‚ªªY¯Û²²©X,TÕz4VFºËrI0¶ã«lKñ£ÅôÅ .gD±m" d V±Ø¾ 3äf¬.笧ªZP-6ÏV†q—r\ê*‘H$‰$?°eËÚ·ogdû½·Ž ȳdcÀºá¨u á =ís:tᓸùlZÞæ¨¶2d“o½gGæw¢ÃÆJÌß0–~¡’&'évØB'³­Ìf,((9÷f¹ïyíuþ·gÁ¢fÈsœ/sÜE†-çÍ:—•ùŽ® Eɶër.yªk÷PØÂY{¦ãyìÎú£»:ÛÊ8ì³nÊÚ®Ùof¦!\õǼÚÈQ=2n§XÇùÙÊ‘-p8WÉÅÝêigÓŒú %ë™°öug×3nm}2êªäºnÆ¢ ;Û嬺»òw=k¾—s®äN?¾¯Ü°nÝ:š5kvWóØ-[¶Ð±cÇÖ@2Ö3’€;v')ÿø t֙Ю‰œm®(JîÒîËeÜÛzötîgÁº‹eN™BA8õDåQŽœ,K$‰Dò/Á:PͦÉþ¿ƒqŒótlïjœ äíä›NñÕ׬?†òÙ·¤ç¸GαŠÐ8¯Ý÷¼lähà„mç&Ÿãq—ƒñY¶ñ¨#Yy‘ïþšCy¹ò{О9Ê{Ô7\¤¹®³­Œ“¾é²¬PpXÌ¥^y´‘Ç:àÆV.ä¤'pæäEî8 ‰ŠEæíàæîôtö¼Û®»š/eæÊö<8ºîZ†ûòwÝõ½]èçI¿x8B¸%‰D"‘H$wMꉯùêb Z”ÅÛÎCï,]òpóom·ü¦—%þGÆ=ÿûlî^4š¹‰éq~¹çò›ž ùÅnÿx÷?Oî°j‰D"‘H$’û…5„»ý}79evœ=w¸´ËtÉÃËvËcßx˜øÇûã½ÚJÅlv~´S=äswwÜ»ý+C¸ÿyœ‡I$‰D"‘<œäqüâ,ŒÕ“ðVÉÃG^ÃÁó ÿx¼W[ 4wS^>wwG>±›ÜðY"‘H$‰D"‘H$h‰D"‘H$‰D"‘H<@N %‰D"‘H$‰D"ñ9–H$‰D"‘H$‰Äþ›ˆIfÒÒLlÝö?âãobw ½D"‘ü«)^¬$U+×ú—œv!‘H$É9–P %‹Ö ƨØê¨’r~+k—oâ×C'8g|–9ïv¦ø•ut{~1'íËÚ¨üÚFæ4 „¤ã|¹è=–}» w¼)ÓîƒûТ´/9&—Hòr-‘H$IþãN CËGŸv˜ý—Ó¨ A õ8Ë_}›½Ñƒ™ô|F!€4®8KŠw,eƒþ¡*+¨;pEÓ§>žÎüC±ôþżBãG¤¿ëI¿Ä=®W -Ü>¾•Ÿ.EиNQŒ™ÆNã̆—°èÕ;÷ç•BgØ´pýÆyZ ÂtsÂQ¾]·˜÷ÖþÆ•t Q–,g†š¸—%³7s³V;Fw.‚zâkæ­œÅpµ8ëGUÆ_(˜ok(÷T?Úó#åð—Ì]9™—|#YÞ­EdÖ/~û{ œúwÒÒñ±»‡99$5„V¯ŽåÑP-B€b(H¤WÆä9•SŸ¾Éð‡ kÒ‚§{µ¦h‘Âumh3ÆÏ.Or¦çÆÌ…o¦ñÆçþÄ•4"Ô¶ÏÁ¤mQô:•þWùiÙLÞn"dÕ(jÈ~)‘<ì¹-‘H$I¾äN  Å+QTüÊÁÓ·±DP€Ô“ßðåÞÓ\=õ5GÛ•¡‚·@Xnsúà5”b•(fÖÉåû>]È‚Oçð•25iÙ»­b¬+pæ›ü¶j+~<À©Ë‰˜ð¡ê ÙLjœ}MÏ’¸ŸE#^á³Àî¼ûÆÓDxÙ4BG¡2  ãÏ^pª0åªT¥œÁšG¤Ç³ëƒ,øtÇãBÊÖ£S¿^<^Ê#…Ón²k£“ü–kü´`&+·çÂõÛ˜ôþ-[‡¶½ºñXŽUÅß½Iç-7HH÷¡PTM:ôëË¥}¬yÜÚå*ÿ›û6+~;Éåw0 2\ÔSIÜÉŒÓ9Tm,3{Çà«ÜÛÐõÒÂÍß–2í§¶T¯ŽQkË›|„ÖÄ»ùT^íQ…Zçiýê>=Ù”>e4œÿb³)@Ë1Ã80m7ìïé_•Ñ+V¡èu(hX ã¾Ö¼²w7WÓ*ãçåOõîè&l}-®4w¶ncæî³$Q CFsžßÌkoþFå‘£ÑÏÏN;U,I7¹£S¾R9b‚3&´‚ uSO~ÄK¯óìÛ éPÖ­Y×õ‰Š-)+ýÒf–|{ ýߢ} ="õ(?l§hë><×8/e}°¥ï/üq)šþä¸\"yø‘h‰D"‘HòôT%° 1Ápv×yRTHåä¿r3(‚À[ÛøæxŠ5\Ùtžg-„VˆÀG˜8þþË _´À¦½yul_ ÞÏ‚QcX{"ÕZÆ|‹?mçTÇòê¼ùÊÚU Fk7^QÓÎòéä×ùÈÒ‚×^jAI¯ƒÛ õcKÊL7qtíËŒ^w…ØçF3m‹4Öü̬ñKÙ{Ûì t;Õu~ómŽý±‡‹EždÈØWxµ+*¦üÀÌ!cùðLJ6yºâ é9joŒì@å”ygübö$YP=²ËNìÚÏ•°§öêx^Ú–ŠIö2ÜÔ•4“ SšãÀö<÷7ï@«jîõôØu]KLƒ2øk„ÐT©Q\`ÇÑ,è(Öî]6-{ƒžu‹`È5FUÐôh[ÛZ’¸–`A_¸AZk EAa¹ÃÙíŸðùoj6+‹_FG0dí닸öÔxÕ A—Cô;WI:ÒocR³÷!,7ùiÎ ¦ÞbóØ4}´íMaáDÌ6]3û·Ùµl1ø·dp‹bx)t”(ç·ýÆ™D—÷$Þ'šŠ…trò,‘ää ´D"‘H$ù“{´.Œ*%u|rô/®¥UÄWœæ»_ˆî8‚F[Ʊæû㼋þÆ!'(Š—¨‰»Yþái µšÉ˜N¥1*‚ºÕJ’Úwï¯ÚÅÓãk ªøDÔ ^hkø¯“mÀ’~™ïg,fÞÙZŒy»Uuy {Uw³ì“ ”}a/ÃÝíÂ~ë<ñª•õYr¼Bõ}çn‘¦† U´ÖÎív€šÊ©Mo³ètº½\›ÀLTn~;Œg&í!Íl&¨éx¦4/‚ÎæÀ9¹a kÒžev§h|5GsÈTIOøyâÍç[2/J6èÈÀA¨¢C¤œà‡ý©øW~„n­ª®¿ÎŸëf1cÐU|ÖLáñBYïÕ§_ü†…ߦRktkÊzÛ¿µá´Ó?†Íåùç~¥QL*;¶§Ór j»ÙK@"‘<<Èc¬$‰D"É<Ø ´ð&¢j8bÉ.ŽÜiK¡ ßðãÿÙ»ïø(ŠþãŸÙ»K.=!R B- U bÁ P¤•G}„džE)J±ðÄGD© REé)’»Üîï !åJBKB¾o_÷záîììÌìänggv&3‘‡Z%ÒT‹gâ'KØÚ'…ø]ø[ÅÑ=ÖŠR`?²•=¹A4jƒUÓœm$k-Ò0{Ë6ÛZ\p_â†[üIÿñ%o1Z ûèG¸2‡²¶íG·³/'cûÐe\þFÃ@×u¬GN£§œkxgO¥R S`"ZùrçvŽÚ[¤J†ñ­O„Z¡Ì<ì‡ËV.ä—‹oÍBqñ’Nü1k.¨ŸMÓJôÄäl̓qT7ÀÐqoqË5#ˆì9‘©íòs êÙ-Ô/_A¼ÅzŒÓì^ø2ƒÆýE‡ßãþúþ˜ •Ohëg˜4v?nþŽi“_åaÍ´ç;P-ý{ÆÌ<Áu¯ÞEr€ Ívö\gÎzåp>og`ØN°sÍ×|0r ϼ`aú{=©›{”#§¡öÕ7q]ËpL ÖÊeÕo0÷çct>3Ù6ö~=-~my·M-H9:§þù“ý¹ÕiwSkjþ‘_r¶³bÙzîi~=1ÅGR!*Mi² BQ •o5Z´%zÒVï9FØ·+8Ù -Ã| mÙ™¤&²à·ûè¾vŽ:w’Z¼w­ÄˆkùÏüt$aß÷,3“6o®|q ÏvªO±¤hA1$5Ž&©qsR÷që¨Où¾o:¬_ÈšÌp<Þ/€îÐabo®ß4‚Eoµ!DÓ0™¿ê$u¸ŸáÆ&n¶ŒU‡ï¤^HV Ž8®f¦À(b ~ù' »QÓ™Û_|»ü ÁmŸ¦a*¸¬FÆÞyóÿì7•׺Çà£îá¾.ã¸ÿ©wsmk^o"3q Q Èn!„¢ò)ç4X¢[Ó6b&Ë—-&}ƒ+†4'Ô¤0…§qK“ Œš÷5‡3‰¾¡Õãg±D$ë3‡-ëbkU)°ïgí–,,µ‰ðQ¨<Ïçõ«{ÞHå§Çñï5ùàånÔ)ù²¬[æðxb,¹ìÝ ‘ãð×TÑv«ÍÙùi8ôR†wqnûAÖnËÆO¸”Ãsš,IÄúÌ=¯r1‡×÷œÎ ÌÕ ¤²Ö >)È#hƒK@4IÉÉD˜•³—÷tš…åòÝ;9Ù¦9Á 2¶|Ïv#’Ûƒ\OàV„Aö¯yêÝ´z~ ‹ eäàÐaþÍŒ…Ö÷¶íeÚÐ—ÙØéÞº'µÄÄjJ)44”¡ãÐkM’"`öOÛɸ£f…#c;3MÔŒÃ'¿LlûWð߃þ´’H@¡rÊKßÁÎ,?Ö ÃGÓДFhrk|pð`6:!¥(!D¹RÎ^h!„BT.åÞ€ÆR‹öW„0oñ\Ž_èÔ`çpjJËÛÒ° û‚¥ŽpîjÉ™7^UPsì^›G>{•×­pC]Øýí4f¨Eϵ ¸TOõ5¬1×2tØf"/ÍNdÜI”r,·šFï›"ybÁ+ ÓzrSÓH¬¹GÙŸY‡ëoL&ØHd0ÝðkÿŠ¡]¬—ðùñ_9‹é±WÓ¨º]Ë?eÖþpny²)!š/ è Q.Þò”ýË…ÛÝF•?+uþÿ À/‰»îIfÁ#ÕÎûY0~ö¦C¸µ®Õûp|Ç–M˜Ïz0$&ƒÝ;²œgÒ|¨[‡êŽí|6c=>quˆ ÑH߳й“Ek<ˆ´êf̾ÑÔ 6ÎNnf³fVø…צnMLö,ýtQqDW³õ羘¼{b_ÚÖ´€O=n»§!³Æ¼ËËÓ5z¥Âú)Ù|-ï¶ ËO¿AöÞMümDq{-k‘¡ç–ˆæ´Žø˜yc? ñ€I Ìâ÷/ßã§œÚôj&g!* éB!*Ÿòo@ãK½Í XüÖkº’â¦ÇSÔ°BW°ÈqíjùjDøRÿ¾ŒòŸÈ„Eãyñ¨Aõø+èóF?îH(Eª€F`ƒž<ï:Ìx—9íߥW|i÷£ÁC£:‘ÉKfðÆ‚LÖPêµyˆv“ ¶Ô SŸ;øß;_1ñËö´˜â9ü™ùždýܱÌ9¢Ûˆ;_D¯¥LÓ…(Ïù Â@Ïsàpx&_žo ÍÄöœÂw=ŠOXæCÜ]o0Æ6’1Ÿ¿ÍsÙ$¶~„ñOw!Ƨ™Ìý‹µ»òpœü˜'û\¨‡=‚»'L籨 m]Ê73ÿ$=üªÕ"åºÁ¼ß§q¾gëçÙ¤š¢])Ðs8¶{%3gNáHŽOhI2¶ïmÄ[ 3µn}÷rFóîçoñè'&b^Ë¿ßHZÁÎ6þÙü7zp3êkû7à‘w†a;‡ͱÓ>„Æ5ã¾—£wý²Ô!Dy‘Y¸…BˆÊÉÕ¯·eÆŒ¶Î;_ºwCÇ¡ Š7”œï–(4“V"±†¡cè†óÍ^¥Ð”V¨QãœøªälÑ%·†Ž®ŸYºÈ]èFÉt8—Y:Û©”†v&’üÉ· Uô\.ÃÛöòqÿA,n1’©’œK/)åÜï1Oùïßj&Ξ¶¬åâ&—ùr…òyÖo\M‡vWŸS]s^·3 t¦§d,ùuH3z/øL½*Ii&4•_F…(¥9'-s’bç00tãìo7ÇM¿rN¨Vx¿›:WpÎ"iT믢bIÏ8Áî=;IˆO–†ôe`éÒ¥Ü}÷Ýr-…¢œÍž=›ë®»îœ¾—.]J=nN§ò?Ù…þ}È©=Ð8Î.Ç*4×;œ{•†r»[¡¹œ-ºävåöü…“hr94Viœ–ØY"ýÃ;O„¦¹["ÊUžÜœ£LåR–tº+×ss>7¥¹n®ëçzUö<O¡4åu(µ·ô»«sç–F!DE¢P®a !„¢B“L„B!„BˆR¨=Ð|êÐ{ò"z•r.„B!„¢"t…Qu‡äÊd:B!„BˆÊ@Т܆áv9+!„B!„¨(¤-Ê•Ÿ5€­Û·Ð0¥1&ï3‚ !Ä90ŠÌª_x;Pl_Ñ€Î}%v·½4t]gÇ®íÊè!„¢’‘´(W ñ‰ìÜý?ü¸¼¼“"„—Lµ°pjEÇ–w2„BQFÒ€åÊl¶”Р¼“!„—–Ê_ÊJ!„•Š4 E¹“!ŒB!„BˆÊ@fnB!„B!JAÐB!„B!D)HZ!„B!„(i@ !„B!„¥ “ˆ‰re·ÛXùó÷¤§ŸÀ8Ç5U…¢²‰­Gó¦­dE!„¢’‘´(W?­^APPíÛv*ï¤!.{·t†Ûgu®wœ áò­\µ‚Í¿o¢QƒTiD !„•ˆ4 E¹ÊÊʤ]ëŽhš¼M „¨:š6iÁæ-Ë;B!„(#i@‹r¥X,éBT)&“I !„•4 E¹RJIZQåhšÂd’Ÿ`!„¢²‘_oQ®4MÃl6KZQ¥hš&=ÐB!D%$¿Þ¢\É ¤¢*R(”|ÿ !„•Îåùë­§óë¢O˜úÃAl¥45ï?L|7¿ú‹ÜK¹šÒÅ8¯žÎ¯ ?fò”>ÿåD©Ë³ !„7šŒ¼B!*˳õ’—κ…óøfKwë•Øv3å‰{yxÒVNéèlY±’rÐݯqrá]Œó楳nÑ|–lÍtŸÿ Bz …U’RòêŠBQ •û;Ð'× ç®—wpåðxöŠLEî'ìì™ý$ý§ô›ø.·ÇX(õ톮{XëPV""£‰®î¶À0ʾʧãæîÇ»tt—ê3ø“Qt0»Oû¹œ×où¯ äRQUÉ÷ßåÃjµ–w„Bpi¾Ë¹í ëàqlŽt–}°Û?¸Ÿ_UÐÐÔ­àÃÏö—W£ÙÎá»ß°DÓuè›tQÚùÄ©…Óî±W¨••ØØûÅ(>ÜÖˆCºQÛW¡LAÔ 6•¾á_ÅH´¢*RÒ}YIIIaÑ¢Eäää`T†§×Bq²Z­¤¤¤\ôß× Ð€ÎÀ0W'hÿ¦®êÊËÂ1+€¶Í›ÎzjàÇIŽÊ|‡éü¶p"®aûaƒˆ„4nëÛŸî ‹ö`g¬ŸÌSíaça¡uR¹¡× îol{™:ðq–´x‹©ý“pù¬Â~‚ ó'0aáZv¥kD$µ§çÀ‡¹1>àìy”… MˆÀ™f¿¾°7’”fÍI±:©¼t6ÌqOYÏ«åF3íç]8v›O0µ. ø IDAT’Úrçý¹¡~`‘ü_>‚{—'3/€‰iÜ3p]ëç§Ý[:Žðýø·ùdõÏÆ¦\Äá!ZÖzÞyzÛZ¼Àè¾ tó”Bn …U•|ÿ]>"""¨^½zy'C!ª¼KñÛZþ è#ÙP§ƒê-`ä´¯ÙÓú~êû*Œc+ùxqÍz¿©ïsâT^þ16vÍzŽ!3N’Ö£/Ãëiìþvž}žœqïp_=ß‚ÞÞ¼Ó¾4¹{ =ÃsùcùLf½ü,¹£Þg@Š?`88tÜ ŸÎeÇÌçºÐŸ›ûe@Í“¬5žw‡iÄLHÓ B½ÊêL¯¹*è!WÛ½Äã[ÆóúždçºMŒº‡ÁêãwêoÖ~5‹Ñƒw5þMî®c-H—%¶#}îlD˜ý?~6…±ÃÌÔúè1šä±Û[:²Ù½a3‡£{ðÔc øeícÅÜi…â°³ÓC:S1°ÛlØì®¶Ÿ!=ÐBˆªHz /?r=…¢j(ß´‘KFF.Z` -¤3™½ñžOógïWŸ±)èzÞ½²6ßÍÑÙr"PY™:÷OjtÍó=ëã§)Úµˆ#wÀ`fMßÀÍÃZ’}x»žôê–ì “–€>`0ógo¢çðÖ„zKZÖF¦,8@R¿Iôë\‹‚†5³ªïïêCjª©†“{'Å({xÃÀ¿N Ú·NÆOkEÛ6‰hýŸgÆôÍt}¾Aùq%´¥Sëdü4hVó kŸú‘ï÷ö#5ö·Ò•¡aà_§9íZ&cU-i}˜õCÎÄñ«—òiÁ³ÏÁ@ÃäaŒ¼ÌÂ-„¨ªd+!„¢ò)ß´žCú)k¬?¾‘WÑ«ý,^œõ?$Ô`æ7GH¹ÿflô3È>q  ÙÊžÜ µŒÁªiÎF¬µi˜½e‡m­>sO¢´‚§üÊ·i)ÌÞ¶ƒ£öÖ„x¹o±Ýξœ<ŒíC—qù ]×±9Ž©¦0÷Oʹ†wöv+¥0&Ò¡¡•/wn稽AªdßñD¨%ÊÌÃ~¸ ex¦o])|kŠãˆ÷ò1k.¨¡išôÄ!ªMi2G!„¨„Ê·í8͉°ûbRA¤ÞÕ¨As˜895ª-¯t¨‰Å|œ?8}<‡aœMp±ö–³fàn@6€îК*q¸‹ÀyèXI{ü5ú&[ 5ð~ÕCòßÓ.¯ñœ(cøL—§1[L€‡†‹´)“/ØBeTÆ2,‡n¿ å#7BˆªJ !„•O9áÎ!3¬>(>µ;Ó³Ñ\Þüî1=Ÿ¡I †R>ø@öqg´_D"±>sزþ ¶FñX•û~ÖnÉÂR+‘…ÊsqªÓ»Yùû)|ãëSݸ£ç;»æðxb,¹ìÝ ‘ãð×Ô9ͤí5[Ïks‘ ûAÖnËÆO¸”Ãsš,IÄúÌ-sÍWý R>r)„¨’”³Z!„•‹Ë´Ãá¥v¡è¹dæ€ÙÏ Z8íû<À¯ 2hÛ%_Mfüý4l™Ø PAÍy°{mùìU^·>À ua÷·Ó˜u =ÿÕ‚àB ²ì}Y½þ4~§÷³îËé,8G¯—š¸žÚHd0ÝðkÿŠ¡]l½oŠä‰¯0LëÉMM#±æef®¿1™`Sé~Z¨·xÊxÞüx¯œÅôØ«iTÝήåŸ2k8·<Ù”M—ËW–2<×|eÿRªY¸¥ZQUÉġÝncåÏß“ž~ÃÃH8!„Olí8š7mu™/c¥Û8ißKÁûÄ~õoåÉ!  z4Møø[àð N;“/õïÁ(ÿ‰LX4žT¿‚>oô㎫sMgSu›¦þó\F ËÁa !:± îM—º~®ß]6Õ SŸ;øß;_1ñËö´˜Bƒ‡F12t"“—Ìà™8¬¡Ôkóí:'ìýõÞ39ò¥ŒçÍUó=Éú¹c™sD'$¶w¾8ˆ^ J¹¦u)Êð<ó„žçÀáð|#!7BˆªHæ~¸¼ü´zAA!´oÛ©¼“"„™óÞÞó’÷®w=æÂ?l\¹j›ßD£©õ7ÖUÌ–iÓ¦Ùºtér ~Ü ç{ÉšÉc£ÍÐèÅfs6 CÏΫšÒŠÌŠmè:zá«T"Œs«"³DçO‚e¨³Û CÇ0Œ‚ ®”†æ!±†î@7šI+R¸ã)Ëym{ù¸ÿ ·ÉÔIX•3oJi…ÊÐEÞ\”µç2,C.óå<<—×ú«éÐîj¹‘BT)é'ؽg' ñÉòýwøjñ|n¸®›ŒªBˆr”‘™Îæ-iß¶Ó9ý¶.]º”=zÜœNå² ýû4SÎë@+4“÷®\¥™(J) åáP¥i%Ž)qîâ³D«’éQÅæç’V¯ñœËyógpu½D”‹¼¹(kÏeX†8\¦ÓÕñ.BÉ£¢ R”f6KQY(‹E~Ó„¢™L¦Kò ³œÐB!„•›RJÐBQÎ4Ma2]üæ­4 +Ÿ:ôž¼ˆ^¸ë}B!Ä¥¤if³YÐBQŽ4M“háJé†FW&2™ŽBˆÊLÞ}Bˆò§P¨Kð},ßø¢Ü†QЈ–|ä#Ÿªð)wz:¿.ú„©?Ä&«.7åjMo=ó>äÃeû+HëdüºgýÄA»QŠí—1Ç–Ês³w“ãy*á ¬Œ×­ÂÕGwªJ}¬*ù¼Ð¼—›v ~c¥-Ê•Ÿ5€­Û·`FÁ° ùÈG>ò¹°w YçäOEE>ÎUô]×ÑuÇ9}òòììØµ?«ù5¦óÒY·pßlÉÀq!¶ÝLyâ^ž´•Sºúil^Ëš½'qœìž¦¹¸Ê;ÎêÏçðÕ–tò\•±~Š¿ý™ŸwgQdÅGwÛÏ—~œÞcúÆ<|µRl¯@Œì,|k·Üx5m:ÞHŸ™{È>ð5OßÓ›·~ËF7€ÜLìw÷½¿…lÝKÁ9²Ø¹z ¿<· VY¯›·úXªs^¤ºYä¿>^U%Ÿš·r»D©e·(W ñ‰ìÜý?ü¸¼¼“"„—Lµ°pjEÇz ·gzúÏ­Î Ó^¦C¨ÉãÄÝ™«†ÑãÕ£Üÿá»Ü]ËÇû$ߺîeÏ"ÉÞõ-S&Ïã¿[a÷!¸F-’;ÞËS¤Q]Y‰ˆŒ&ºº¿óéÎ.¦½ò2tχu1U€N÷‹Éí ›á¡Œsvðñ /°õ®)L­tvwÛÏ“~t 7Óâ¥&„šCÅÝöŠÃÆŸçÍÿVç¾Ç^%-ÒŠOt4æœì;xœ 3-9ÍÑ1ÄDøc*Õ ´qV¡½tÎéºyª¥q‘êfa¿>^Eòi¤óËg™´p›ögc Ž¡éu0¤ïµÄù9[‰ú‘/é{÷»luègëmømLšñ( ý4”žÉ¦™o3ú‹ÕìÈ"©íÝ yò6›Èûk½{}ÄžÂÇækúŸù¼U(šáþxà!þÒì׳63çÝ÷™ýÓvŽ˜"iؾCíJb sÙ_¯ùsUnnê‡4 ÅeÏl¶”Р¼“!„—–Ê_ÊÊ‹š)±øØ·³ù+CLÎóÜ]Lþ6¿&?Ák½ñS °sxË_äø7")ìÂÿ´ëéëýü8þëßš{ûö >Ðα¿w°S ÁOLÑtú&]”Æ™{£L ôÊÍet)èºî²çnû¹späçoøÝ·#qö¾ÓÝö ÄqœMkÔáèÜ„Í9t$o"ù,µ¸eØXnVªbæã‚*¿ëváëfa• >^Åò©eã8i"¥Û@î¨DÎöÅŒŸö:ÿ ¬ÇÔÞñX5…ãt&§ŒºÎ5Í(šµ:õ|5vöÍûN:À÷âß5ö±hâû æÇ¬‘]ˆªyÃÆ4à´~öü–ä寂iç‡RvöÍu|´%Ïcü^÷«XðÜÆþÓ†AÏõ%Áö+3ǼÀã~Ìq foùsSn.êÇ¥zMJТÜUˆ÷…¢²Æ¦RKýÄÖ?O¢'ZÑ€Ü=ËXüëŸÙ»„w%ÐØ_¡ô“ü¹õ(ZíTj[ó›æöl˜? ײ+]#"©==>Ìñ=Gë'óÔC{ØyØAhTnè5ˆû[EàSìkÙ~` 3­\5ô z5 È¿q¹åìq¶íeêÀÇYÒâ-¦öOšܾOÐeš3²&ÏÍdTû`´<÷éÒ²Ö3úéQlmñ£û6$°’ÜA{ú;¶d8Ý¿>FF^ 5“ÛðÀ“qKâÙÞ»½“䪜ÿnúŸù¼Ÿæfû•6¾ï &ÿ¸“¿daó %¶A{zìÇM‰A˜™kx}à~oõ2 jLЙòsaÅ7Û°6…&Á…nH‹lÏaýk=ybÓ |4­?ÉV •ý /Þý ûœÎGÝ£±(cKsëÛytm´Eweò ëðÙormµB£-§8‘m±x0×ýŸskíÞ3ùªbmÛͤÞ}ùªÕXf?ÖMžÅæùï3vÞOl9…),™;_Å „¢ @=sï?ú4óÃú3éÍÛ©g9ÁÏ“ßaÒw¿±÷`&9Ñò™ ¼Ý5 KáKí.þ†hF›æ½Ç¸y?ñû!ƒÉm¸kÐcÜÝ8Ô9"Ãq˜oß}Vîâà±lløݼ+=Úk¬Y¼”Õ;O Ââi×ã)†ÞžBpáaů§ãß{ÝcÝðZ {I³»:{U¨÷ü§ÙýÍxÞ˜ò-›ä`Xkrå ·yµ[ÌÙï›ù:—2²³ï‹yò£uÌv`‰¥å­ù×iD˜”¶¬ìÇY÷Ù8Æ}þ3;N˜¨‘Ò‘ÞO¤[‚—5ç’O-˜+|Š*ÿ»»u}²WþÌèqšx¬€~êÙZ5¤¦Ð°àïÃù*§ÿ`Îì­ø_ÿÃjAˆI§Uè~n>ƒ…{®¡Bu…$1™üí1zƒ»ëø NÿîùøÚ»ÎkŸo™û›¢ý«Opw»PLª)õµ-ÜöÒLþï@î‹õñœ?wõÞÍ%´BQ…i¡ 4¬ßnØOεá*{þû'Âêzüg–íz˜FüQ¶ý¬ÿK§æu P¹ì˜ùCússß¡ ¨y’µ³Æóî0˜ iêël@äö¥ÉÝéžËËg2ëågÉõ>Rü‹<Ý7W‹£†ZÌÆek8Ðà*j[5Š÷¡½HŸ 7=ϰëkbQþQhÊsºR1°ÙlØì:•‰§hŸ:W3 gSÂíóý§ù¬™ØOÓ"ÿ·ý‡WoŒÂG)cÎöª”Ø®ÿÉŽU8}?COÂïÔ>VÍŸÎýÿ sÊî«k ìö\lö¢C5‡VòÕv+i#öXt»? W&c^²‰mé:É‘¹Ö±9+c«wsò¶(ÂÔiv­Ú…£n?no^ºÐaûÓ(ÈÕ±AðUÏòVÏúX•Â/"ßÌ’emèÎ:èdc×§OÑò1ZöìË+M" =(ß"7åFîŸ|þŸ˜­ßÌ;Ão¡žU¡léüöß•ì ¿—gK%T?‰)!s‘„yŠ?—Ÿ<ÉÀ)™´}àQ^OPìø¿÷ØSœþh<Ö·¢9N²kí¯ªÕ‹?ÛëñMÌ;“·‰æÚ^òï8öãTƼ?œð†ÓÜÀ¯ n”¸žö,¯uãLÒÝÖÇ@;;§yI3îê¬÷ü:öÍãÅ‘Kñ»ë F¶‹Æ|â²ê„añTOíçRF&ÂßÄ#ÏßAµÿ¬›Å;Ÿ¼ÂèÄOy¥](&GiÊ*‡mŸ<Åóü¸}Ð0ž¨y’UÓÞåÍg5jM{’Áî_§±ŸK>¥å×{ÇIö­ZÀWûüI{"‰ÀüÊš—}„SÊB^V6¶°¬…¾ròŽoaÃ13 ;$lÒPJ#,õ*ÁÚ™ôM°b>Sé,6LùˆuÁ·1©Km|5åõøýÏoÿõÒ9iøQ-Ä-¿‡8(>•(f±í £¶Çüy*·â¤Z!„¨ê,Ñ4‹³°`Çïµ7!PýÉòŸ2Iîñ4W-}‘ßí⑆ð9¾íYVê7ª‰¯RY™²àIý&ѯs , Ö<Ϊ¾sX¼«©)ÎèÃÛõ¤W·dü4E»´ôƒ™?{=‡·&´P7‹)òzžüÃß{‡WÏ!íº.Üzóu´ˆñ󸤵Zmâãk㣜76FÖ:ÏéJmÁ³ÏÁ@ÃTIzŸÁÍ,Üù‚’:p]{gh‹¨¬ø=Ëöœ¦y=ç~¿ð:$%Ö)(#N¹Ùn0ð¯›FÇv ð×ÚÒ¡] ¦ždêÇ›¸å¥4‚ƒÓxqæWªpùåqpÅb¶û¥Ñ·ap¡Æcñ튠H2½ÃŠ?NrsÍ ŽÿºŽÃhØ·ýÌŸ§Ûjþ‹Ÿ~=MîÍ¨ÛØ—ä ¶)ÕÌ®¯»%,–ÄÄüòËÃî¢]˜‘µž 3vRãî÷yõádçÐoçÅBÙòÿmÿ‡eoŽgÌŸmxéýþ´ ³œmõ[Ó±uCüµüãJ?Yk˜8s5ïÏðÞIhŠ+[Æ‘Ûë¦O^O÷m ãÌõ¼‚¶-â¯5%úŸ¸oVn¼£ ­ƒ4TS?6üð«×ýƒ½A]|=^O/uÃK}l·©”i.Y7¬Õ^õË:Äq=€+ÓÚѪI0&R)ÚÃè)_e)# úí¸¦~þá ªó×ò‡ùú—ä¶ Á¿e”½ž‰sþ"åÑOy´k$¢Žñã}3ørÇš7t1¥“ã<òyâÛ§¸åµMØ®ƛןñ`wJ份nåu|‰ëЃÇïI› yûI7‚H õ)H‡ò füöwv#¢ wp¿Í¥ÕÐÛIòw6Ú½ŸSçüö«vÍið9Ëg-ã–Ø®$çqüŸtrÓdæ8¼æOy,·’d+!„¢*SþÔmƒ:¸?²œúc?d&Ò¥U"moˆ'û§%l=åàä® ü­âhkE)°Ýξœ<¶ŒíC—›ºq]×nÜøðö8²Øä4tJ+xb¯ùÖ"-%€Ü¿wpÔN±·}¨}Ý`&ΚÄÈíØ:“çû>ÈÓ3¶’åaãâKwyO—BÓL•ªñ Îh·Ë•©³3ÂûE&P““ü“©ìWšBåï/|œ»íp6>sp2W7ñ'{çVŽæ9Ïe2›1› ¥Çqˆþoþi]h¬ô¹ÚnªÖ„«ëæ±eÅnNë™üöã?Äß׋&9YuÐNÞ¡_X}¼&í[ÖÀ~qÂú¸]öÍ™§¢å¡œÿ çü·ýðfvæÑ´uL¦³³ò {ì›Wxc¹‰Û_ÌÕ‘¾˜´’çÔ4Uä¸3OñÛoaWn©­c ö™üãhÛ4œ=¿sÄN¡%Μ×êõªAî Òíùçô‹ 6N?…¯§÷ºá¹>Ú•>ÍÅëfiòkM¸^-ì|9äú½ú ˶g .S¯ù*måqxÕ4^|䮿îjÚw{‚™ûœÊÌÅ(eYÙleon¿êIÇNWÓöª«éxßv92ùûPNA<®>~‰ç–O¥4B[?ä±oòÒ#]¨¶âU~kÇÎt¡Wçó/³rÉ<¦¾Ò“š§òÌ sÙc;;HYqâlïì6;{¿žÇ¿¶ôhåLx/ÇÄsŽûµÖ<5¬õ7á¡[®§]§.Üúü\öëAÔ ²xÍË­èG˯ß›ô@ !„–‰-Ú=i«÷#ìÛœlЖa¾„¶ìLÒYðÛ}t_»G;I=3S·ž‡Ž•´Ç_£o²µHã¯zfåºûNwè€ MQrˆ¢Ò0DÑôºûH½æ6n™þ4ƒgŒæ‹¶cy ¦d#Z)(1‹˜×tk9•¯ÒÞ°)“ ìù\–‘‡í®˜-&0ä¹õn?ðßì íÀ‚ uÛ¸ÜnªAëŽ1Œ™ÿ»Žå°lg]MÈšÙÌ_w-ß³/´kû¢Ì)ì…ªºÃPxº4þ®!iï·Ì9•öcÐ2Ì\Š©ýJ¿Qr™nõ)ß÷mÇíQf”Ò0™¿ê$u¸ŸáÆ&n¶ŒU‡ïä®hBT6‡2ìg/GîQŽdChLèÙáÛ¶¿øvùA‚Û>Mà³#*Ì^Ž·†Æœ×~³2Ѧãö!ûÄQ2 ŽÏy„‡çÅÐ*ÿ¡/¸Ï_½Ú>eª÷2„[\öìv+þžôô•|A !„(½ØÚq4oÚªT?ô–èÖ´˜Éòe‹I_ãàŠ!Í 5)LáiÜÒd£æ}MÀáL¢ohFõüŽÌáñÄXrÙ»";ÇᯛóÛVò¼Æéݬüý¾ñõ©n)±»€R e $±u*aŸ-aÇ‘<ŒèbL¾ùÀ©ôÓÎ]UÊtURçtÃfò%IJ-#·Û]±`õ–,,µˆðqU–vö¿„Ý­x<¥ð°SwÛ-Ô¾º u§ÎcþWÿð›kªE@§(Þ[ò5 ØCĵOoU¨‹¶ŒÜÜ:øD$QÛ2›«÷““šˆ¿‹rô‹¿•Ï6gÄ Q<3<Š©ou§®µt)ð¿Oâ|g°iõrRœûl³jS>±)ÔôU¨¼Òœ¥Ø$Jn¯› Å놗Ù}j4 Îw¦ç4Û]×ÍRåæ@âÚÜɳ­:sõ;½y|Þ|¶Ý1”æy¥Ï——2Êùk;òê3ø¡[heA9‚ù5Dñ½§(Š••%"‘Ú–vïVDÝT/^‰’çr›žóȧó»DÃâcB98\ŒðQJ¡¡¡ ‡¦ˆ4 Ëå»wr²Ms‚dlùžíF$·š°Ð¶ßôçŠ!‰:¹9Üóñ¾ç¹ßΑ& ê‘˜wÍãõ…‡½îÒBKÎyP<eª÷ 4¯Ô\(Ò€åê§Õ+ ¡}ÛNå!ÄeÏy#â¾cÏõ޳á/ÜC¾•«V°ù÷M4jê½ñe©Eû+B˜·x.Ç‚¯aTj°s2!JËÛÒ° û‚¥ŽpîjÉ™7дÐ4zßÉ ^a˜Ö“›šFbÍ=ÊþÌ:\crÁûÙû6²zýiüNïgÝ—ÓYp4Ž^/5)1ûuγxûËâ“㨈ÊÜËÊÏsÌœBkW½†æÅûðÅw3ù<å&êÇȪنkS<§+(û—J9 ÷9 ´Ô¤I‚•ÙK§2»QwêGÉŒlÏ ÜlOtÖ¿c?|Âä¸Î4°ñÇ’)Lý»:w<ׂPMad¬áõ¯±¥ÕË|øh‚òö³|É>‚Û§|žÚÆg3ÖãW‡¨ô=«˜;ùW´ÆƒH«nFÙ°ôÓedDÅ]ÍBÖŸkøbòZì‰}i[Ó‚²&q×=É,ø`#¢úÑ9b? ƯÀÞt·ÖµæO>g½wû(î¨e-úíçåxŸóܯtNþ½mû°sý·|>ëÝËØÍeé%Øþ,SýhqÙËÊʤ]뎗ä}!„¨(š6iÁæ-KÚ—zš°ø;¬×t%Å¿à5‚v£Sè 9® ]-ŸB7E~4xh#C'2yÉ ÞX‰ÃJ½6Ñ®s2Á¦ê6m@øÏs1,‡%„èÄ6<6º7]êú› EÇ¡…˜þ#ŸOšÇñ\ÀDTÒÕ |µ7DZPöb7,Z(­û?ÎMo}ÌÌ7ÿC®_ ZöL¦cJé ÂÀ‘çÀá¨\#’Îé†M £ýãOsÛ+ðÉËCÉñ«IëÞ ¸¶Q]×Ûó³žd팑Ì8ì 4.•{G ¡ocçÒbz^^AùÙþþŽÅÓö©³³ùzÚ€)’77dôÈ£\MV¥Ð¢®ä¦ø Œ±w¥s¬ïÙÚ/BØâyp[|ÕÚ3°ç2þóÙËŒMý”—›ïOÃþï3.l,üˆge¡[£¹zps:Õ.A{óòƒ«y`ʛ̸j}ã\»xº<ÄEâC£y/`ï}þ.O6ˆHLcà˜Çé‘äwÎë{¼nx®ÞY½§Y¹¯³ÞŽÍ9¶åÓç±ñH†áGDÊU<9üê[5ì{<ç«,|êÞÍkCŽðÖÔ) _’X‚jÒ¨vµZ¿× IDATÑå¼<—•?Œg\µq|øå^š—Až5ŒúW>BÇ® ñ0s¢ýò©çfphëR¾™ù'éyàW­)× æý>݈óU›Ã±Ý+™9s Gr |B£Hê0±}o˵áCÜ]o0Æ6’1Ÿ¿ÍsÙ$¶~„ñOw!¦`í,ÿlþ=¸õƒ‹gÀÛñç»ÿ¿½÷ CÖ(jÖoLÛGFro×DåOb†î9öÝ¥¯—jnWg°L›6ÍÖ¥K—K’Qµ}ýó¹éÆîRׄUJzÆ ~Û¼¶­;–îûÏÐCùTñÙ© t‡î\ÙTr(œaèFá÷“ñ8£ÔÑ wÇçOÀâ29†nnÃèº^löìümgÎ?Á’çt993iPe±~ãj:´»ºØµÌ¿6ªX™8tÐL½B®ËÈÅvû>¼ÿA¥½Çœ'RðS ÈŸÌI¹:§“zqÿ¢&Œ›9”+ –‡²¹Ù^8éÎú¦ Òé\"J74LÅ{ß.xØâåæªÏë¬ÃÎø\‡3 C?Ûé.¬aè躧¸Ê?Eâtî(þ÷å"¾ü!«gÿ–Ks=Ûî2Ö wõÑ[šóñðwíöØü}ß û=ÕDz–Q¡ï½h¯sA:KUV®¯mÉï_Î5Ÿ…ÊÔy˜æœ”+¿¡E¾¯‹î?›Þ³åïü-²_w ®+JuüyìwžÛYÎɾŠ~WºÏ_)¾¯ IÏ8Áî=;IˆO>§¶ÅÒ¥KéÑ£ÇíÀiœk"œ² ýû4#=Т\)¥°X,Ò€BT)š¦0™Êð|f™’;Ð\ïpîu× ÆyCéi ªb»áq‘­xl®¶yK—ûc*2׿a®®Mñmîòë¡”æa¦òBñÛþd鲃„´{–”"÷Ýl/vŽâIWšÉu}¹àa]”‘›:^´»§”†*±¹dXU$m¥¹vžâw§÷4”,ŸR\ÏbÇ—ªnxØæ9ÍùÇxø»v{¬Òpy˜Ç|•±Œ ¥ÃÝ5)’/3þ»Œ'/“¿öþC¶«!ñÊDH­ºDù»8¹·|züÞS(Myý¾övíÜþ]–öøóØïùÜòWšz_4&×ÝØ4 E¹Ò4 ³Ù, h!D•rfù!.–Ü=ËXúOo(:Á•»í¢b»\¯[eË—ž±‚ÿ<<Š-WÓÞ[é0jo¤•èÍ®lù¬(*j¹ÉnQ®–.ÿŠ[»Ý%uMQ¥=z˜Í[ãŠf¥›‰[Tl¿lZÕm;]äké~(³ëà%‡K{Ü.*6×­Œu£"¹äõñ|ËêÌk3®¹Í‡üÝ›2–[FF:»öî ¡ž á®üòŽðÃDZ*ú>w­ï…øÃÑÓùõË/X|÷_O%ýctµ»BTž‡D‹ÊæâO^£0™Ëð›©L¸ în»¨Ø<^·2ÖŠä’×Çó-«s<^þîÎM-7i@_ z[V¬dã•w8_¿?°yé¬[4Ÿ%-ÚÒ³cÔ…‰³ÈF!D•t‰f —Žaò›&„U@ù6 õc|=äAƘ‡ðÙ+4[cÖOÏsLjl~ô67Gš/Åûàî9þaþà~|°KÇÕPŸÁŸŒ¢k„‡t%× ;oÅf쫌äRQUÉ÷ßåÃÏÀÖí[h˜Ò“瘄¢’2Ü´;œKî+ºáì~×ã<5º®³c×v/úïk9÷@‡æ¢qiè8:zEh já´{ìjeå6ö~1Š·5bànÔöU(Sõ‚MåÛȯ¤äi½¢*ºTkUŠK#!>‘»ÿà‡——wR„¢ÊªN­èØ‹~žÊ3„[Ïà·…™°p ÛD$¤q[ßþtoâ\Ýq„ïÇ¿Í'«vsèÄ)lø•Ú™ÛÛhü²ô;ÖíN‡°º´¾ãQž¼9‘ 3½Ýöl˜? ײ+]#"©==>Ìñg\Wj$4!€üVøÂÞHRš5'Åê ¤òÒÙ0ÇM<®òãé¼úQþ7a4Ó~ÞÅc'±ùS+©-w>Ü›êYþøòÜ»ô8™yÔHLãžèZ??í¥-³Õ{8t<›r‡‡tjYëyçéQlkñ£û6$ðfEH!DU%ß—³ÙBRBƒòN†BTm*)«‹¬b4 u;v»›~6Ãö¼Âƒ¥mìšõCfœ$­G_†×ÓØýí4&<û<9ãÞá¾z¾(G6»7læpLOžy2 ßã¿1ïÃyŒÛI§{ïå™_5ƒ& ZÊ&YÑT.;f>ÇÐ…þÜÜw(jždí¬ñ¼;L#fÂ@šêUVg.‡*xÝXl÷oñ { ’ë6q0ê¨ß©¿YûÕ,FÞAÖø7¹»Žµ ]–ØŽô¹³aöüøÙÆ3Së£ÇhÇîÒ–Ytžz,¿¬}¬˜;­PvvzHg*v› ›ÝõÀöÒh!DU$=З¹žBQ5TŒôÖw¹·û˜¢Û ‡^ÏùϬLû'5ºæùžõñÓíZÄ‘;`0³¦oàæa­0 üë4£uód¬ª1Q‡WòðÜÚ\wóõ´ ÔPM¬lZñë6žTŸ¬LYp€¤~“è×¹ kgUß9,ÞÕ‡ÔTÿRÍÍex‹'Å({xÃÀ¿N Ú·NÆOkEÛ6‰hýŸgÆôÍt}¾Aùq%´¥Sëdü4hVó kŸú‘ï÷ö#5ö·2”YsÚµLƪZÒ<ú0뇜‰ãW/åÓ‚g?žƒÁ¹/› ³p !ª*%…BˆJ§b4 ëÜÃI%¸ÐØäì_?àßÓÿo?²•=¹A4jƒUÓœZk-Ò0{Ë6ÛZ\p’ßO¬|¨V' eK'Ý–ÿ´ßNíPØzüºa`?º}9yÛ‡.ãò7 t]Çzä4:þ”æöÆk<)çÞÙÛ­”˜H‡†V¾Ü¹£ö©’a|kÄ¡–p(3ûás)3…oÍBqñ^>fíü&KÑ4Mzb„Uަ4#„BTB£X›™…ûdF0Je;ÿç̬lÅÚXÎF—»ÙÜÌ>f6çÒQ†èŽüIËôìv+þžôô¸X˜S!Ä%[;ŽæM[]îë@—’ò¥þ}#å?‘ ‹ÆóâQƒêñWÐç~Ü‘`åç¯ühðÐ(F†Ndò’¼± ‡5”zm¢]çd‚Kýz¯—x,5èÔçþ÷ÎWLü²=-¦xŸ«æ{’õsÇ2çˆNHl#î|q½”2¿¢Ì<ç+=ÏÃqî7 r)„¨Šdî‡ËËO«WBû¶Ê;)Bq‘9ïû ·ÿ®w=æÂ?l\¹j›ßD£©õ7ÖUÌ–iÓ¦ÙºtérI~Ü ÝîjgCÇ¡ƒfÒ i:†žÿlW)4¥š%Û9¹U‘¡]Åáâ|†¡cÆÙW­•†æ¡…iètC‰×k<ù“oêì¹Ý†·íåãþƒXÜb$S$aUäq× 5|]äÝ™aΞ¶Œeæ.—ùržËË“õWÓ¡ÝÕr#)„¨RÒ3N°{ÏNâ“åûï2ðÕâùÜp]7U%„å(#3Í[6Ò¾m§súm]ºt)=zô¸8 œÊÿdú÷i §Ü{ •fÂeG¯Ò0Û¡”†rÛ+¬ÐŠÏí*çSE•Þ¹K³Çx”B+–¯çÍŸ¥ÕõQ.ò‹›s”¥ÌÜÅá2®Ž/¹qBTE åú¶¨””‹Å"¿iBQŽL&Ó%yYî h!„BˆÊL)% h!„(gš¦0™.~óVБOzO^D/WCÛ…BQ¡hš†Ùl–´B”#MÓ¤ºê:ÿ¡Ñ•‰L¦#„¢2“wŸ…¢ü)JТ*0 Cn>„¢¢Ê;ÂĪèûܵ6¾êy§ãë.`[ôÍÜÓ*³«xK¦P²¦·BTÚ%蔓´(W~Ö¶nßBÔƘŠÏø&„„áf¹ WKq èÜWò`wÛKC×uvìÚN@@`Å}cÛÍ”g^de£3¶O2þz[V¬dã•w ešuÓ“¼øñóÏÙpãÕÜÙ*Üõ IiÂTòX!*€K4ªµ¢þ‰*"!>‘»ÿà‡——wR„â’©N­èXïõc|=äAÆl×ы특÷}&ö¬sáz„ÏPV""£‰®îöI¾ax}\ ÿ/ÿê3š ±3ed7jùxO˜QŠxK¦¼UÈ!BQIZ\öÌf I Ê;Bqi©ü¥¬¼20:Ž˜;þH*KjøGEb¹÷ –hº}“.J£ôóXÚøsñl~±ùblŸÃç;®å±þe8¾r“h!„(—j^%i@‹r'Oî…‹à85I%ÌTèûR)”ãß›OVíæÐ‰SØð#*µ3··Ñøeéw¬Ûaui}Ç£KÖzF?=Š­-^`t߆…`%¿cBQ1HZ!„N®ž¬;²Ù½a3‡czòÌ“IøÿyÎcܦH:Ý{/Ïôàøª|0iÕR&00ÉŠ¦L„6¼>Cn!4ÀÁá_æ1nÖ›¼_ÿnŠ 0zißòÖI_3zkþÝ©1I5Z1cÄçü÷PºÇXœýìÆi~›ü,þÔi}O?î‹÷áØïË™±üÏDSš0Ž ¶üo{Ãïbð€F„:²Ñâ«aV¹ì˜ùCússß¡ ¨y’µ³Æóî0˜ i˜¾WÆ~‡÷Gx%-sÆaNÖâÀþ—û}``³Ù°Ù‹ /Jz …¢üI´B!œ¶Œä®n£Îþ¿_;Þœ6”æÀ0ð¯ÓŒÖÍ“±ªÆD^ÉÃsksÝÍ×Ó2PC5±²iÅK¬Ûp{R|Ѭ׊ŽõòãJ çïÿ=ÊÒM‡°· ¡ÌÓ9æâÛ/~# Ã뤙ðkv+Wÿ‹ùK÷ÒµW}¬šBÏXÇôÿ;LÔ=ãxþÞ8¬š‚5ÙûÝF6æGSš0àÌo@Ý–´o™ŒŸÂ9©YÖj¦,8@R¿Iôë\‹‚†5³ªïïêC²å0z ›·æŠFAÎ<*ç z=Ëý>‚[ðìÇs0Ð0y.³p !DÅ ËX !„êÞLjǛ¤9vÊDm«†rœ àlÜ)åCµ:a([:é¶ü§ñÖpj‡ÂÖã§ògÑÎãðÚ¹L˜¹Œu»pZóÇ”£cÉÌÁáîüØö-cÑžšty²¾š¿DºÝÉW‹³ý®Gi È;¶ƒ¿m!4k‰¯¦9'òVZ‘ ½Kæ¬ürÈßi;º}9yÛ‡.ãòƒº®c=r˕ݸ§é|øB?v^ÕÛoíJÇ„PÌ |ë»ß MóþHAÓ´KÖó!„Â5Mi—dD4 …BˆŠÎ?Šú …ÞVΆ¥‹¯ÙÇŒÂæl,f|L ;œ³YÛÿ^Äð—gr²ãÃ<Û·áú_|õæ;¬8§„åðÇ×K9˜wœiƒî`ú™I»uº‘Îüͽi”ìlã O÷0(¼4aÜÑóб’öøkôM¶jÈ*üª‡`¶VãöW>&mýR>Ÿ7×ÏcÁ}oñæ=õñ÷‰s¿¯”³ Én!„¨d·¸ìÙí6Vþü=éé'¨ø •!Ä…[;ŽæM[•í‡þõpæîßÈnG]¹¯+m"Í(G[‚ñØ€V GÉ÷€“[Xð¿ÔºãEži_ Ó™ôéÇøß¨W™ÿå2Zt ,"™:>sùuõ>r'ãï"–R„qÇOŒ%—½{!²sþZÉ9Ε9€Ø´[yâŠkèøþ@ž]ø%Ü:˜Tåy_)Î/=ÏBQ(g/ôÅ& hQ®~Z½‚  Ú·íTÞIB\öœé ·Ïê\ï8þÂ=ä[¹j›ßD£©¥k|eîeó¦"³@›¬‘$Õ-û£GŸšÉD1‹3tuCjùa¶‡LDÃÑ ?°ö¯ÚÕ ÌOÚ só׬:Çý×· ¥¶¥Pc³.ë0瓯Xu¼7F4ã¡;ë0`æxA¿Ÿ[Zij}'Ϧ_y㎚Fï›"ybÁ+ ÓzrSÓH¬¹GÙŸY‡ëoLÆïè*¾Z§[·:~öذ÷$º8š"ïÐÏn÷™¥›…[z …¢bhqÙËÊʤ]ëŽró!„¨Rš6iÁæ-½<ã¯9¼ôÂÜ¢Û"ïäñÊ|nŸ:ÝöØQÞù)¯/·a–À4¨ˆÉÕ}‡©úÜÁÿÞùЉ_¶§åÀü4z:ëþÂé¸ûiiA+rÓb!ªÝ5ÄMù˜…+qÝ­1Ä÷x1ÁS˜´p&o,ÌÀn¶R½WÆä7È}KÆ?<4Š‘¡™¼do,ÈÄa ¥^›‡h×9ˉüoö~;–‹aX©žØžACo§ž¯ÂæaŸ²8ò8ž›ðÒ-Äÿ·wßñQTëÇ?3›Þ(!@B ¡$ôހТ^+¨¨ØPïµ!–k¹¶‹å',ذ{¯ŠWE Å ö®ˆŠ¤wRwÎïÝM6a7»Êî&!ß7¯}…ìÌž3óÌdç%Vƒ×ˆˆHíR-µJ=Ð"Ò )ÙÚçctLij7v6ñÖÕçòÐb§Ú¤ÂËŸåᣚ§öÅ>M Hi¨ôý·ïHNJå§Å éÚ¹;® ’‰ˆÔg~OG¨ö>`ZÕ7*§~,  \xØÇaɲŤ¦¦EýøZË=Ðãvp·:™›/îIZÅ#"\¤åe~¥ìSt¶^D"]î»o)h_ÈÒå¿ðÉçÔö¢ˆˆ4XM›d’›Ó&êõÔK¸3òéÖ£'Mü3f«œÕÓoáú‰sY»ÛM|F.}†ŽäÊ}igØòù=œ?n1‡Üñ0ÿ쑎«|/_{“_Ê“7Fó¢ïÍ}üÜ÷F¸ «_r.u‰"ÒPéûoßOÇ‚.µ½"" ›å}”U”ÕÚ88ŽƒãkLX.ËEã®GsþÕÃhœêfý÷¯òÈä»y¬ÃSüßÀÆ4Ùÿ.ë w<ð"ƒ=Æï=Ès¿õà²ë¢y¼E†²ÒRJ˪_.u‰z E¤!Rô¾GÛSD¤a¨ ô¢û9ý„ñ•¿7=–G&Œ¢S» nç}¯c&¿z)3ç­£l@#\®L¾äb>¼ø>ÆßIÚw«èyÙ£ü­E‚ç¼CF_þý¿W0ظÔû\gini¨ô+‘ú§n$Ðùgpû?{“æòtºÛ Mi›àfÃì)<1iß-ß@‘‚«Ø!~{1nïÇ\ÍâòQïsö±¡à"nÜ‚„Š\Ù¶5G]gÛ¶zbD¤Á±-[WàˆˆˆÔCu#NmEaçN~÷@[”¯~›o›ÄÎÁ#ù÷]Èt~ãÍ»Çó™ÿçœ,›ÿ+%ŽÁYþ1_¯?’“rcpå»DŠ"ÒPéÄ¡ˆˆHýSw²o/¤ç%«`¹»-ÃÏÊþ] èØ¹ m3ü?à°uöîû8ƒ3⦅óó—2aüÛüV²wC Kl©)" ’åé…‘ú¥nô@ТÙLfê‹ÓI?¬+¹ÉX½«rºÙµgù””a÷pZ׎Ä]sŸýóyùèî<ªq;æhîz@=Ð"ÒP…s±¬¼Œù?ÎgóÖÍ1X¢†­°C!y­ój{1DD¤Ž«» tÞIŒ¹l#Nz»>(ÅñiÍé’›†Ë*gùÔÿðNù`Æž\@ŠmaåÏåǾËÏLä»W2ÀepÊݸÝê‘®ËÔ-" Q¸c?Ì7—¼6y4è }_F‘1†ÙßÏfÍÚ5ädçÔö∈Hèh?qâÄÒ!C†Ää`m7N‘²q0Ž¡2¶°l Û²0ÆÁqÀvÙ+aÇøÞ38ŽØØê}®³æüð x˜†"Ò lݶ…å¿.¥ }§¿ÿf}4‹ã†‡ÛqcŒNG‹mÛ¸Ýn¾ùöúöê«c’ˆH4sæLFŒ1(v{_»üþ_×z´e»6V¶eÙXA&Z–«Ú4˶ýÊÒ(Üõ)"ÒYXOa`Œï„°D‹ã8`tL‘Ðj=‘š©÷9b ƒh‘:Ì£:c ‡h©uá¦#"Ò)Ž £.h ƒh©uÆ=ÎJD$c ŽÑ=ÐÑdaaÈ‘Д@K­JNJå§Å éÚ¹;®ê£Â‰ˆD„!p®çͪӪÎ虶燃½ÇqX²l1©©ia]}S+=ÐNk-`uZúä§ì3jõĪ~ꀑ0(–ZUо¥Ëá“Ï?¨íE‰™¦M2ÉÍiÖ¼Ah÷:¦]y1O,sÜ?ÝËŸÇ1Yqáø]©xϽƒ%'=ÌcmRø4Hg_Ü÷oîýtÅÀ&!£%z̉ÿ8‰-B׬žpê K—É‹ˆHX”@K­Š‹‹§cA—Ú^ ‘ز¼² CÐÚjÂþÿ¼™œå@+ßx€§w嫆›`a¹Òi›aƒù w÷ƒqŒã©;p~[׬£(÷dÆ\ÔƒÔò]lX9Ÿ÷¦¼Ä­?náÞÿŽ¢kŠ]óZ«'œú#È`Ô-""aQ-µNˆ‰ˆüî8šuèF&Å$ž+[бg/:%y¾W­ò-Ì}eOϘò­.² à´‹Ïá¨v©¸(få¬gxdò§ü´±“˜ÅÀ‘·pÝQÙ$xë[5ñ2†=ï)«Ûèçw`zeo°1žWz>]»v!ݶ w?z7ZÎYãçñú2º´XÂýçßÌ’äá“sI° |ít®¸è5òÆþ‡k:©§O õ›í,œñ4¦ÏfñzÈ*èǰóG2¬K. poäÓÿ>È ß®dÝæ]”Y)dìÇ©äèö©žyªqpt´ˆˆ„E ´ˆˆHöçî6xúS-,JXòÒnœžÌ±ç]ÍÈ»™óòFœ`U¼ç˜Ž¿ù4º¥ÚPŒ715• ·ñ[æ`õ~ßÙñ=_[E³îæšÓÚ‘l[ ìÕ†’KG3å…y ½±ÆÁCr›ž ìÛ‘$«=[®gîè¯ùdE1Ý:'ïqOµåèh h‘:ÌqœðhïeÕÆÊ6üÂo%å¬}ìbNzÜ/Áu77èNîù%Oß|)Ë:†aÇÍ ˆ³¨Hv-ÿò«/‚ï¶grû¥=†-tƒ IDATIµÊؽéwæ½ÿ ¯Œ½ò[îá¢ÂÊåªèöÿ¬ž ï—nø™•%itíÛ’Dßí?‰9ôëšÂ«‹³¾´/i¶ïd‚çd–EBóv4³ÞgÝöò€÷Tô¬m h‘:,ìhSu~ã.ÇM}/¹‰s «öº&f¦ãJhÂñ7=FŸ¹2ýiÜí4Þ<ýVn=¥=)Æx®jööæDÌû~J òÛæ“ní èÖ=›máƒ7—pö•IÄÙPZT†Ûâðï€ö,gÀz‚¼oŒÁñ–Qù¾ñfÚ¦j¬|q0€@åNàõQ-""á²k{DDD$8cŒg4ê/ïÜ¿»·%ÇUª†¬Ü\Z·nMï«EŠËó;…Ü>C¹èÖñÜvx ‹ß|—¥»+´D(ÚRD¹Û©¹N_Òê½Û”±½ÓÀN§elùu-»Ë=?¬ž ïÇ5í@›øüôýZJ|ó–¬å»E»ˆoÕL—ǯ×ÛyÁ3-ÀËqÝ-""aQ´ˆˆHöW{ ­F½9ã˜æŒ~ó^î´Oæ¨îÍI*ÝÌÚ­9ôð’7Ç»srÛ4%¹l=óWíÂIiBŠ ¸2éÜ6ŸLajÇ£É7›Ù™µ‡t̨ÅÚ×»»c‹dâ±mÝ2f¿;/wµàØC[“—ÄÀƒsyaòÿxø•Ýѱ)®õËÙî[Î`õ«¿gߊ«^¿ñ‰§sx¬øø%^[›ÃÉWv'Í[®ïfk_´ï^ëª=ו¬ŠaËDDDj¦ZDD¤ûóƒˆùûJ¢ð¬ÛÛè9žÿ` ¼¹'©yûIÿC;àÚ¼”/_}‡E›J0$’Ùa#¯<Ž6ñ`¬ ú;Š#z‘WGiR3zŸÒ Ó+/]3.Ò³2‰ÿê5î¼å5ÀErzZþQç ãðΩØ@îq×píö§xñݧ¸kŠWb:Mó»Saƒ¬žÖAßÏ?õ&Æ&?dzïLàŽMдmOκåŽo—X1JxÅèà tµËºDO ´ˆˆ„#ÐCã'NœX:dÈ=ŸWDD¤ÍúhƒöDYyYÈyãà¶]õ1Mžûˆ}I¤…eYضå1Û©è¹¶, ˲©<ô›ŠGM…eÛ{Œ^mÇ?¹·,,oþMˆŠ{™ Þe«b9ƒÕ¼~ÿòö\n0ŽƒíYO_nl×ë`[žÓ‹—,¦OÏ>jÿˆˆ4@3gÎdĈÃ"`·÷µËïÿE@±z ÷1ee¥|ñÕÇlݺEgÓED‚hÓ:Ÿ>½M”ÊÊ˘ÿã|6oÝÕå(ìPH^ë¼ç û9ЖåéÞ£‡Õ›°ú­«¯¼ê‰gõѶ=É©pZEcX}Þ=“jÿå VOðú«—W­>ËöBfüÞ²¯àà`ìS©J ô>æËo>#=½ƒ8´¶EDÄ÷¢Ú y`à UçÜIÁ/¾þŒ‹æÑ­KÏ€IôÜysÉk“ÇAƒŠZo¤1†ÙßÏfÍÚ5ädçÔ8ŸFˆŽ>˲<ƒ‰‰ˆˆÔ@ ô>fÇŽí8p0¶­ÖED‚éÕ£/ þtú¶íÛÈk“GYyYÔ’WÛ¶éÑ­ß|û Ù-³ƒ&êÆ{©µD±LX—Ê‹ˆHæzcY¯û·DDjàr¹Bžh4ÆDµGÒ÷è¤p¾¯Õ]Æ;DwåãÀDDDS½±,K ´ˆH¶már…>F=q £x_¯$:Š,OœãâÔ,‘šéH±±m›¸¸8%Ð""5°m;¬èh'­¡ÊÏHÏ`ãæd6ÉŒêr,_±œÜœ\?ED¤FJ ÷1º÷YD$4ËûX¤šÄ$ÑÝ»goæ/˜Ï²åË”ØE‘1†‚ö5æ&""J ëg+óg¼Î쌣ùû!9$üÅv’eE;vØ6¯-Ì☓÷';>R ºh•+"XàÇ/UŠöà]–©yâèÛ«oÔ–A*é…ˆˆ„£îvW:E¬Y0›oWìÄåªÌîå¼õàÕŒ~,‡9žSïøŠ-î?ÙëPºœg®8“‘OýÄîš! ¶^å[ùnú¼÷ÓvÜ{Ñãõhg3Ÿ=ñ(ÏÿPNb$«ŠV¹""Ty¾p`¾èh¿B/ª¥W ^"""áˆ|´³•Oïúw~¹‘r¸RÉÊiEû^‡sÚi‡Ó­ia¦J–1qìmürÒãü7/ WÔŽme,{ùNü¬§^4†>Y.ÜÉíH·ý*t¶ñù½W3îÓ?(66 -éÜç†ÿc8û·LIJ’Èj™CN³”š{5jZ/Ç©á©á Úp¶3oÒý<ðú7,Ù•NÇNãê+O¤K† ˽•ï_}‚§¦}Ƽջpe´¢×ÿàê '?¹j6ëlüši‹âè{kÙVÍåήe¼óÔ£<óþ¬Ù•BË®ƒ9÷Š Ò¡êºïQ®ç]¶ÍëFO¤øÂxjXK⼓œ xåÁÇxéËÅlpµ¤ë \}éP Óìõ:¿O朳'ð«ÛÙãâÉ^·¼Ác‡4ÆV[JdŸnµú±40˜ˆˆH=…K¸ËÙ¾~#e9'qÓE½I)ÚÄšß–òÕÛsåŒiû=\Ò»QE"T„2$÷f~œ³Žô/çŒÃº“bXTmW•±uÍåžÆ­÷$Õ½“ +æñÎ+“3 #—>CGr刾4óË®W=wC&z~ïqý$î”]¾…¹o<ÁÓf³l«MVÇAœqÉHŽiŸºgOµ³§=ÉÓ¾eñzCVAN¼àBNêÚÈ3¯»ˆ-»¶Í¼žaï{>ÜêÌÇxòŒ<ýË2@F[ºwïF†mAŸôk¼œSïû¹ëËè–³–g/¹œ÷úÞóv$Élå›çã¹O²bÝJI¥ÏåqÇÁ&ðzõ÷¼¿ùƒ;9sæf¶—§Ò¼°?§_rC;¤bï˜Ã×ÜÇO}oä º’$KØ ,ú…W^ú‰”#ïáæóúÒÈå0 ñj†ßü"Ó~ýdÐïÜ«èkYž„v`v}ñüðE´'ÉWŽ{Ÿ½ý3I}ÆÒ#ÃÆ*ú¹ær[¯âï·’;üBÎ:´-‰tLû…™}Îw”Ñ?ÃåIV«—K«ßÏCŸgrâ W±ðÞñlö[²Õ0åG‹A·_Ái6Æeõ¢ƒ½oÄ»k欬õ6£°[制å¼ÅÓïo¢û?ÇqZ^˜WHˆH½WÛ ´ƒòh©[¢;ˆXÅ~ WR>Ç]t¯_ñ:/¹‘AÇ5§q×£9ÿêa4Nu³þûWydòÝ<Öá)þo`c\Þ"²Ž½1G¶ Þ²IÉNŶJX2ézFOKáø FsQ‹Ìžü8ޱiõÄ%ôJwù%@¥,›|=W¿¸“þ#.àæv6ËߟÈÿ¾âGÆsV»Dϼ2º‚±§´#Á¶IÎlIÐ1¬, Ë”³mí¼=s9&s0]3ãƒq»q;Þ÷6~ú5+2Oå_u£±{vû¦ÄYƒ¬×&âÛ æüSºÑ¤l Ÿ¿ü ‰#wÂeôÂPZZJiYÍÚê.ß¼¹›âèzp.˲iÒó ¹“ÙK¶sAAq¶çÒgÜ;YõõTÞ\•Bÿ+:’æ×Àt¯û‚7'Ñÿή4²­Ðå¶mL~&¼ýÕ7¬:5Ÿ‚”rÖýø[S;Ñ£E|EOoõr!ž6§>ÂôSlìâ9Üp_Õõqж°Ó$Ó´Q¶wKoß“l&óóºRLvèz-ß^bv0÷™ |—q"O iM¢®ÝiêB4ê©gb: wbv7òâ^çç¥(1-Hk7€Áí¼;fòû§—2sÞ:Ê4ªH “š¶¦}ûÖ$XžÙñÏL]CÇQO1ê¨æÄ[еÅf¾¾àÞYv>={¦T$ffÇ<;e%ÍOz€Îè@²mq`ß|J.ú“ŸŸËñcÐȈƭiß¡=IV ½?ÞÅðc}…ŒiÅ cÏ gš «,ÀgŒ!µí~ گɞä»(ðzQêù|zÁ:°É6ôn±–ÙW}ÎÇ+FÑ«K_þý¿W0ظjHòÂ]¾m5[M:='TΗ˜E‹Tøñ÷m”™,â,ØòþU »cen7Mþ6†»Ìö;‘PÎÚÏÞaqr.èše…Q®«='Þp ß]õ8gŸõ%‡t-aö×åœ8örö¯¸|{Ïr°ã<;g€m‘ӇñÁäY k3”Žålþc+%¦ˆíÅnˆË £^ïZ­Å“ï—0`ôp:¦Øê}i@jû1V–£{ EDDê›Ø>ÆÊ€ãý e¬Ÿý*OLšÅwË7Pd§à*vˆß^\etêÊ2=¿—m\̪ârÖ<|>Cñ•kp‡¤ E8¤T -^¶á'~-I§û~­H²mOI¹ôï–ÊK f}é2*ÚOVE}Aµ;‡{þÕ›TÊØ½é7æÎœÄ¤›¯Å}ÇC\Ö%X#ÈÓ×Y½ÜêëUe~oRؼ=YÖ{¬Û^Xض«úÌ{°m{ž_o«eûÕé—hûæo<ðZžzx5+|Èħog¤ÏÄö\R_¾ŽOÞ]FJÿQtϰ==¿!Ë…]¬duI3ÄyÃòLŽsp;é›îéaÞª^JYñÖ«,L>€÷Ï"Þ¶”@‹4¶e‡|jã8Q¿Z ´ˆˆHýÓºtÝ~+3duh†µz:7ß6‰ƒGòï ºéüÆ›wç3¿ù- ömË)Ç!‰þ—ßÁ’üE‹äfA'Û#'ó]7÷'.©Ù´oßÞ“tt¢g¯Vl;o4ïMû…ó;g†]ZÀõ 4Ÿ+‘xÜ”ý‰V a\£Y»X·­¬â=S²‘ » q«ÆÄych§·¢c÷:vïCÏ´Uœpß ||Á ÏŽ£|Í'¼½<•.éLºwþånÿ†ñw¿KÚ¨g¹ã¤V$X§sÖGøûUòÐá¹kÿF8Ê -ެýGñø´óÙµe#ÛM›_¹˜‘¯¶b@›$ØþmÈz]Púï°–Œ®¡kº’g‘†¦¶/áV-""RÿÄ쉻¦d%3þ;ƒu)9í€,Ükæ±ÜÝ–ág eÿ.tìÜ…¶~p%’ž»·Uy.r\f{ZÅ—°b´Ì˧m~>íòói—ŸGvZÕóñY…´IØÁ‚9k)õ•Q¶šÙ wߺ¬„¿4Y~½Çå»ÙVjHJO ?AÖ+R5ã2»Ð»I ?_ÊNã9q°máÇ,6-éW˜Ž«Úç-Ë&>Á…eܸ”±úã÷Xž6€c;§Ut ‡*×Ùº”¥;’ÉkׄÛÆ¶ãhÜi  »Y»vNrÃ[QÛOz³–4Ýþ!OL[Gã#Πc÷Ö%!êõ(]ý®M¡ß‘…¤jèm‘†ÅòôB×ăq¢÷rG÷@‹ˆˆÔ3ÑëÞ¶œhDRñfþøm _¾ýß­oÎqc/åàfq˜]Èf2S_œNúa]ÉMÞÀê]þK–E·ö ¼þá$^ë|,íÌ&v´ØŸÃ;÷çœc[rÅÔ±Œ±ÏàØ^-I*ÙÈêíyyL'2ü†á¶ÒûpîI­¹øåÛ¹+éÝ–¿?‘Ékr9㺾düÙ¤iû ü؈T÷n¶®]ÂWo½Êg»ZrÒ‘ù$YÃKƃ­Wûš[QfÇwŒ¿æþ£p¼$1¹#§žÞ‰©ÿ¹“;³GqTÖj¦>þe½®æ„¶IØE?óò‹sHÈÏ#»‘ÍÖ_¿fÊÓó±»ÿ“þÍâ°JWòÁ{«ÈØÿ º¤útQnbyfýWþÝ/:†Îi;X4ãQ¾,nÍÙÝ›à*[¸Üvþþ3?¯ZÃÒ9ïóÚ_³¶Ý™<|I¹,¬¬õz"Ê®óXm²997I®i€ö¦Úì˜Çã7<Â/}®æÎs:‘²s~¿:Igaa”A‹ˆˆÔ+QH ãHÏj‚ýÅkÜö¯B³œV´Ýïî;íHzf%yž“œwc.Ûȃ“^à®J1@|Zsºä¦y.¯µ3ðÂË9öžÿ1éî[(InÎ~gtbpç<ºœw÷6~’§ß{‘qS·ãNjL»ýÏãÀ£:‘Qå6áD:œu'÷¥<ÉÓ禆fíûqþ¸Qœ\òyÍþëÔ¨e3>̘ë&.’32Éét4—:™!ÝÒq•m ¯(;ÈzµÑaÀ]îÆí®¹±¸A˜@þ©ãx¨ô^zí~®ß•FáÀ‹yüš!´J°pvmcÝO3y{ÒJ¶–CrÓ\:ñ/;ÿ8ò-J—È;¿epÀUUGåU. ]¸xüâžÈÿn~‹ME 4ÎïÍY·]Æ9’(_¬ÜPŠøñÑk¹ú[‹ºsÀÅ÷ræÐ¾dûK©¹^Ïv/å¿ãdô¦CFè{ËEdß²·£pãàv»q—;žåP¿8·i¼ÿDDD¤þÔzˆŸ8qbé!CB6.‚1ŽÇ¿Màpʪ6H“1Þ†…ßâX¶å7”ñââjW2eŒãmÜøª°±ƒdÄUê±,lËöëqôÖbtkã88ÕR¾Ë-+P95•h½0¿Áq;`»°-ïå~_O€9?|ÃÁpÛãà8•bWlªËãY7Û»½JYòÔÙü}z™4š~é{ŽT¼Ü@e[Þõ ]® ŒíªòŒïŠ}ÌÛÞcð± õV/ÃÂviôm‘†fë¶-,ÿu)í;ü¾œõÑ,í?ˆ²ò²ŸÏwŒÁ3À£Æï{ò]B¾xÉbúôìó—¹"""²÷fΜɈ#†EÀnïk—ßÿ‹€â¨\ÂmÙ.ÂéÓ³,«Æƒ@á¡÷±Ðñ w?‘}…ø²ŸPƒˆY'tMX¿Wçà á EDDê—Ø>ÆJê’_g1óF >º”öŽD«\‘H‰ö(ÜàI²=W‰ˆˆH} Zj”Xx¯t!–íú÷Œ×^¹""‘bŒÁ1ÑKnmlŒej¸L\DDDê%Ðû pÇ ¿0qÑxØY´Ê‰ h?ÆÑ@b"""õ…è}1&ðã¬DD$l¾K«£–D{Œ‹Ó¡XDD¤¾ÐQ{“œ”ÊO‹Òµsw\ÁGö‰ÞùgåU§U±rÚž ¬gÚ_KlÇaɲŤ¦¦½Z'#=ƒ›7’Ù$ó/Õ®å+–“›“«¸EDDê %Ðû˜‚ö…,]þ Ÿ|þAm/ŠˆHÕ´I&¹9m‚Nïݳ7óÌgÙòeQKn1´/ ';'*勈ˆHä)ÞÇÄÅÅÓ± Km/†ˆHÝfQã#¤âèÛ«oôC=Ï"""õŠè}d""{Oߥ"""RFš ƒh‘0( ƒh‘0( ƒh‘0( ƒh‘0( ƒh‘0( ƒh‘0( ƒh‘0( ƒh‘0( ƒh‘0( C\¤ *+/cþóÙ¼us¤Šl° ;’×:/ètÅ:rBÅZDD$:6GŽÚA±£XÇŽb;ÑnßG,ž;o.ymò8hÐAX–©bc ³¿ŸÍšµkÈÉÎ 8báÄZDD$:6G†ÚA±£XÇŽb;±hßG,Þ¶}ymò(+/ébÛ¶éÑ­ß|û Ù-³þ)Ö‘N¬EDD¡csd¨;Šuì(Ö±‹ö}ÄhðdüŽãD²ÈÇq0„ÜØŠõÞ 7Ö"""áбyï©;Šuì(Ö±‹ö}Dh@gL"!Ì*Ö ŠˆHéØjÅŽb;ŠuìD9„ïÖFß{áÄP±Ž ÅPDD"EÇæÈP;(vëØQ¬c'Ú1T]™0N›(Ö‘N¬EDD¡csd¨;Šuì(Ö±íö}äï6õàº}÷æL›ÆÏ9ÇqÚ€Lâ]"ÎÎ>›Ñ'åǼÝÔ b {‘(Ö±‹ö}Ãì.ûƒÏ_}Ž9„áý›âú«óDK!¬“±voeá§_ðÃA'â8Ʊó:E¬Y´€Õi]蓟ÛûÔ±ŠˆHýUgŽÍ¥ËyîÚ[ø¢Û ˜ÿq[&„×> ª²½V»)¢ëPûèQÍbvugÄìEnP§ökß6Šû“î:ˆÆ®nZlãÇ¢}¿$Ðe¬|g sK0‹_ãõ_ã’.!6TÅ2z¿¸þêÌX‹ˆˆ„#fí cpÜnÜ­†sã…=H¯høÚ¤¶ÉÀŽçèkïà(ËÆæ/&fµtŒ®•vPÐJÊØºfE¹'3梤–ïbÃÊù¼7å%nýq ÷þw]S쿞DﺆÛñaQu¨}ô¯î—µi/rƒ:µ_WVæÙF–¯ó+²e×V?íûzŸ@›] ™òæ::|4–_žÃˆ›¤©¶W¶‘¯'?ÁÄ÷ç±bk<Í;´mÛømÔpæ‰'ì{$"—@Ï+=Ÿî=º{Ï@ fȰ#˜~ӵ͋>âåÅ\±Ã„1O¬VÉ¢z MÅxe‰vb޹`S¯šÆ«_mdÿ¡YñÒnœžÌ±ç]ÍÈ»™óò—îÚËK¦*VQ=Ð""1±L =Ç[‡r··ï¨hY¸lÛs;•ÛM¹¯÷ǽEŸ}˪̓¸tT9»±Û5Á¬žÆ]~Lò 0f¿–Äm[ÇÎÖˆókûìyŒŽrÏam´ƒ‚WRµ}ä”±}íÞµ§é :7µ1Æ¢Q—#8û_Ci’ê°~îTþóÒýü·ýcŒîß—UÆŠ)c¸ö…-ô~£»d¶m¤7¯¬ƒSú3©î£¸õš£h“ƒGmF3Ö¡öQJùõ¥›=y'ýN;ÛYüúÁ$&\7†¢Ç1¢]"VÀý6›öé°?ZÈ/[Ëiß<ŽÒµ?ðóÎr6ÏYÉî!Íɰ‹XñÝ œ¼Ð1ÍEZMÛ'È߆ËìfA$sƒº´_WVV¹L kÞ·ÍêuïûóØê®Qù:Š·Z+GIDAT>zc!©ÝJ·4›äžÇ28c Óg®ä¨´'Égë÷L𹑖§Üǵ§ç“h½²XùÑ|æ{—×½-ô<1»Ú©…{$üþhªÿ%´ìL›¸i,^ºâ+˜8u-…#åÜ#²ˆ· sÖ&¾½ä5Þ[öºuòÝåâ½zÇ<ž¯iþÀ@R“V´k›K¼eaY„þ\ÈÜKn¬EDDÂÓÚ?=ÄÙ'?\ù~Óc¸ï?çÒÑUý„¶ƒ1†”ü>ìß·#I`Y”þ´mN zíGŸ.iØt®ì4cΚR æ3wK3öëÙ—)c} Û'ØßF¤sƒ:µ_ûÔÔþ œ ³ƒÇ.¥~xkª_ tl{ ‹Yúö‡üQ¾…IWœÅK¾<Ëq㘭ÌXx&û¥c°¿Ë˜< êÙw&$ôßJΉ×rù€¦•K™-|ùð½ÌxkÛz@ãÌÚÄOeÁ·«(êRHŠeQ1ž¾wyãØ'VcM9–ƒÆ×fDcíWŽÿºš’ßx{Â;¬OÞ«ûg’׎W «V²Ë%Å®º¤¦ÔóÅgÊ=£î¹· 1i‰P´¥ˆr·Cœ7Sù¹­w¸± GÌÚAþÇmc¨l¤xÁŽß%ÜŽ÷åÿ»Yv ¹}†rQ¯ÁøäÕŒyó]–½˜nqÑQ_µÚh]˜ª “/Φ¬ˆí¥˜–@Éêù¬pçqþ©GЯE–;¼tøÒp qMÚ‘ãšÎ¢ï×PÒ¹Iþ½ÐÞm‘œw£/éÆ#×?Éí÷dqÿÿC›( QŽuˆ}4®iÚÄOå§ï×zã”­å»E»ˆoÕL—©¼’býÖEö‡ÐzÊ;¼;k#?%÷á´–ÍI> Ï|ü!ﱊ¦¤M<ÿþcÛ'ØßF\¹:7¨SûµOö¿OÈØAûþ€Ø´ïëi´aûÂ÷˜½«5§Ö“Âÿç»Iþ[k^Ÿô.³7÷çð¬îœybk®š2ޱÎi é•MJñ~Ûm*ÏP¤†ž'VgN,Ï…;!ç‹Ê=ÐÛW°p~:IÅ[X·z9ß¾÷s76çèGr@S¶Õ›3ŽiÎè7ïåNûdŽêÞœ¤ÒͬÝÑšC/ ÝN¥y:lš÷s~Ïf@nˆù]™tn›ÀŒO¦0µãÑä›ÍìÌÚC:†ú\dþ(µˆˆH8b~t°K/Á›T.S•ß=³•o˜Í»srÛ4%¹l=óWíÂIiBŠ =FgDìiÔJ;(x%žXíXÅ¢¤8El[·ŒÙïNãË]-8öÐÖ¤¥Ò‚×xóåwH܉œ¤¬Þ ¾X“Ñ‹3†´`ôã¸Ë9™Ã;g‘X¼…¢ÜýÔÊ·],Zæ_×­eôMÏq÷”öÜ=¢€Ô('Qu¨}4µgߊ«^¿ñ‰§sx¬øø%^[›ÃÉWv' ‚î·v‹•?™ ¯|O³ãO¡U¼‹„Óò…ILs7çÔËsI´ ¼yAÛ'hÎ êÔ~]YYEûÿÇRüö7éùÈ »²õuïûbÓ¾¯Ÿ ´³•¹oÏ£¸Íéì—W탋–&ï…yëëõ šMþð›¸+}ß~•ñomÇíJ$£YG¶NÆ2CmCÎÞ?ËÐóE4v‘Ú¬ ö×Ó¹gìt°“Él™M›¾g3öÄCéÚ,Ñû¼¾$ Ϻ±žãù¦ðÀ›;p’‘·ß™ô?´iñ™ úûñ|ñØLž}g½Î/ 1ýÎÅ‘½È«Œ£4©½OéÀ…­kþœ¡Õ3Ö"""áˆù%ÜA.½Ä—øM4鿥|ùê;,ÚT‚!‘Ìyåq´‰c;F§¡ÃpàU«vPÐJ\¤geÿÕkÜyËk€‹äô&´,ü£ÎÆáSI`(׎ÚÈ^}…ñŸ”ŸÚŒŽÙ©ÞKX“(8óVnËxމ³^⾩»0I-8àü® Ìöß.)‡sÕ)?pÕ”ÿ2uàŒh—Õ~´¨Æ:Ô>JmO½‰±ÉÏñì;¸c4mÛ“³n9‡ãÛ%VÜ´ »ýïÀ„e[9èÀ;k?Ë{‘gÊå ìx0†¸ÜPÛ'X‘Í êÔ~]Y™g‰VOã¾;¦W™Txé¸óàšcW¿? 6íû@—ñ'N,2d–þŸí¬f1hÿA”•—Enéj`76®€gç ŽÛÛUqÿ¬ç|*wJ˲ì*÷׆3O´Ù–g·Z¼d1}zö ¸ ¢kã88°ž‘òÀ²÷¼¢jœ,,Ë® 4Žq»â½çÇà8¦ršmÙfÕ?·÷‰µˆˆH8êV;È3Ýø‹«ýîyÓsÌ®löxÚ=•‡ÃàÇèh©­vP0UÛGxÚ†Þ6IÅ¢Ç{?mÅL{Äj6wúÛÅ8¸°mÿíÑŽu¨}üî‘5ö¿ ûmåÄ=b°ÎÛ§¦:"•ÔµýÚÇ3vÔžï[¾ª¦ØÕÁïØ»öýÌ™31bÄp Øí}íòûP\?{ ,‚ÖgÙ6÷yÞÁ²¨ÄêgÄ™'ºþÄ=‘\0Ë´ƒ<ögœü—Åòßò›Vó6‹ä:‡k‘pÔ¥v–íía3÷ÍfUOÔª¶{‚£££ÖÚAÁkíÑ^±jŒãžmïô=¶‹…mú|äE=Ö¡öQÏLÕbWm½ƒì·¾Ïî«€u†Ø>!êˆDnPçökŸ '|ëXsìêÚ÷Ħ}_è}˜eY8ŽSã<Šud„k‘pèØjÅŽb;ŠuìD»}ñÚsù®üU66Æ2!/ßP¬÷^¸± ‡ŽÍ{Oí ØQ¬cG±ŽX´ï#š@Cd/±mˆŒwäp†°W¬÷Ο‰µˆˆH8tlÞ;jÅŽb;ŠuìÄ¢}ÑÚ×U® ¿,OãâjÞ4Šu„k‘pèØjÅŽb;ŠuìÄ }±’3Ò3ظy#™M2#Udƒµ|ÅrrsrƒŽ§XGN¨X‹ˆˆ„CÇæÈQ;(vëØQ¬c'Úíûˆ%н{öfþ‚ù,[¾LÉÈ^0ÆPо€œìœ ó(Ö‘N¬EDD¡csd¨;Šuì(Ö±‹ö}Äè„øúöê©â´P4Šuäè JDD"AÇæÈQ;(vëØQ¬c'œöýï¬`æ?hÖ´­³óáO<ú*¢‡+‰ÅZDD¤nѱ9vëØQ¬cG±Ž ›Öáv»Ù°i¹-óù3¡·£·X"""""""uK³¦Í±m›fM›ÿ©ä¢ð+‘ºªuv¾_ÏóŸË •@‹ˆˆˆˆˆÈ>«ú=Ï¿ÿ±ò/ß­K¸EDDDDDdŸåϳ1{þþg(‘}Võ{žu´ˆˆˆˆˆˆHÕïyÖ=Ð"""""""„¾çY÷@‹ˆˆˆˆˆˆúžgÝ-""""""Bè{žu´ˆˆˆˆˆˆ¡ïyŽø=ÐÖŸMÃEDDDDDDê«ZÏr¨ßôzÖ¬Y­D‘zÄxn†.ʽ/7àx_Æû Ø_$I@²ßOßÿ“¼Ó㣹"""""""1R”ÅÞW‘÷Uì÷³$X´Á“i»ñdße€‹Ê„Ûxß©ïÊñ$Ð%@)•½Ñ¾žh/áöuO;Þ¸¼öOžÝA>+""""""Rßø:ŽKñ$Ñþ—sW\Æ, öõ>» œ<ûk‘úΗûú^¾^h_^ì@x=Ð’ç2ô iÙ7øò_ßë/õ@û'Ïþ÷DÛ(‘}ƒoÄm_ÎëÿóOõ@ûþï¢jò¬‡E‹ˆˆˆˆˆÈ¾À—÷ú'Òþ?kì6T}Þ•Ee´ÿKDDDDDD¤¾3Õ^{æÅA“`+ÌŸ"""""""ûêçÿ_Êõˆ^¦Z¶IEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_design_layout_list.png0000644000175000017500000032470712235000130026237 0ustar00murraycmurrayc00000000000000‰PNG  IHDR {7sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ  !i4Gë IDATxÚìw|TÅÇÏÌ-Û²›NHHHBB‡ÐQ@ì ˆ]±+ (Äʳ,XžúìØÅˆúáÙ°!]z BÚ&»{÷¶™÷ÇM–Í–$„ œ¯~ÂîÝݹ3gæÞ{~3gfçAAA hAAAP' ‚ ‚ ‚:AAAÔ ‚ ‚ ‚ N@AAu‚ ‚ ‚ ¨AAA€ ‚ ‚ È?ŒØ„ßàÖl‚ ‚ R„V_„ýrú#¾Œ‚AAAâɃV­5žÒœsëuøl‚ ‚ *„ð‡`h``‰]×5M+))aŒeff¢H@AAÙµkdddDH…Ö¢âN2:Ò4mCñö´´4 ‚ ‚ ÒÒÒÒ6nÙ¡iša¦i†¯Ú* 1B¸H°Æœ6Q’$¬oAAi ’$9m¢ªªº®‡tB+Êìñ„T°B4M(Ž$ ‚ ‚ È~ TÓ´pкÇÂ¥BhŠV3‚žp®«AE ¨&ñiIã#ÀtÍ`­Ö œéšÑÌ>¶iåèºwÔZÔ–P7ôÈ4MÔ røb€¢œÄz{ðÜ)=PUQ^é Ñ®OKY» Þ®q€¾zSàf ªÚç­ è¼–ˆ³ Ï[嫪nfþm'‚4în“ Áý˜C;¬a#È?í¸éÁ€¢¦É8PA%»ÃaZÐoàfÐç 5±•„*H6‡Ã! M*Ž©œƒ¦.»Ð’v4UUJ¤'&${l­ØcZPQTÝdŒsB© ÙN»ÔÄpQ®VUúuN‰‰Ž¦5°&§ÀMÕ4›]jÆêh±*Ëb@×uEÑåy¿w#55%ÔtÃdI²96Ü®AZ;–H°h]RAŒ) l «TXÇòªC©®VB‚™†ÆM»³¥½QfÖjÎ97 -Pm˜nO‚´ßäט`“[Þ=ºA·ê^Z¦û«ªƒ,L‚1CU ‡½É+O~„55SU "9lÍ«[®DTvØ=È´€fJöý%QõÈMCc‚ÝaÃû‚Bw\ÆÀZØ4Þ‘ztÂa2ž-°e È?Ú¡ª&P»Ûã”pfèL¨q¥Ì ÏÔM“sBEÙ.SC ê&*Jv§Ë.R®ª}ªÉ8 ‚ds8›8!8í” VyýÓT“K”pÍ[é3j:\A÷y«5²;9A"À™ô+ªn2„ ¶SS ('\’]¢ôùƒÖP B›Óå”k3Ç™®* f0 T.gM¾c%KbŒåÏ9Bø}ÝP¼UŠÉ©Í“è’€©>¯Oç‚Ý“èŒØ¦k¤åMÅçW “1ÎÁ„q:ä8}ýq [Sy¢Ã“á{2MñPÙérÈ¢Ì4 ƒ„˜¡*E7A°ÙN›HBÍ&žÍXÀ[Á™ä± ¤žöÃM-àW¬^p*:<öØ)4X5¦¦1"Új…gTÊ‘ê%6!¨˜¦ªóýÐ ûêÑær9$0ÓЙ ‘¶jm¸M"ÒD‘PYYÉœN§Ãn% œ”TT°|éÖ¥jž•õ)$°e È? '5ž±¡VD‚$×:‚œéºQÓÏœj  h&çœZ Ú ôfŒPJpSúªƒFS/nVÿ"Ôî«ÂëÞBÂ\ Ÿ_ÑLÆ (ĸ¥XE¨ ýæœA_U &sÜVUTƒqB€1#è¯òë,n² ž«N)êöš8"S}Aƒé~¿Î:"‰gºFZž3C7,oÔŠ·R|ÞêØÓ2â–éšÎ9ÓU-¢DLWT‚Ã`—DJDÙVsÄ@µ×¯êŒqàÜ4‚þ*¯tUŸÍkíC)¥T­v§ýJU¥Ïò•€qØ·ÏNn¦®3¤_6:åÖP"Be‰ÓÆ÷°ÕÖ£èð¸l’@)¡Td{ìq•†ŒÐ˜»‚ M{@ P‚ÁHhøWµw¼VçT‹ûU<Aþˆ »lj•jA_e²Ía·ËbxŸ4±{’\T÷z}Ñ•ä‘!XU0¹®\’É•˜ À8ãLóU)Ó nyÁû‡¨, Ý©Ímoè6Âã ºÝvJ€[þ^ŒRÚ=I.‘)^oÀäšjºD˜P€àôx"0µºÂo¨Šî”l4f²f¬ƒ13¥xË•P!“]€àp9UoÀTª½„sn»H0]ƒ–ûšz ªJ5u%hÚ\‘†«§°v—ƒ©L°Ù#6»d† @%9V×5ÓüA€HN·Û&˜Á*¯bšJ@·»åzl^k‡;<?ޏšDtxÜrÎ nÆH¡Áª!Üd@¨eY#eÂÔVP"*PÆ™ ¼±1mûê1tQsÓ0'D"/ÒFVkÃmAýƒRêt:-m®œNgýqG­×—ÆùQÒ:îN’Ë“,kA5ÔLS ú4Uv%&ØêH ‚LÀàÀ9!¢HÁd¼¦çšëÁjŸÞÅÉY|7º~Õ" À3¦VùÄÄ„zÃÉIÓ4ü••ªl·;ìñ¿M¨•íš©¦nXÚ¤ª"æT1°Ñ˜Éîǹ vƒyBhíí[°¹j¥b2‚Ýå¬BiÈtõ[>ük :l‚0¹¡sáÿñø…©äLâ•!ž7Êk¼OÑa ÑîŸÌ0¹,ĵyœÛœÉah˜M›Ò 8·:ð)+óÑ)·’QJ¬áøðŸr­Ú[­×žMv§$Ôñ×#µ37ÕÕ)!Ù#5©ZÕ&Ù?¬p£‘`lÖ(ÄÃOú Èa ¡’Í)ÙœÜ V{ýׂªisˆ^cgk¹¿aAº¿Z186‡]"f04ššÁáN´[¾ÊjëŠÆdš9ök©Á@Nl“Ómðˆ‹/8©k¢pÐW½UÌÚ)‘àJÏjWÐûäQ£Nî‘"7g‰ø¡êP[—€xÛÇSŽK®5kõ¯wŸÿ˜ÿú7þ}f[‘´º!‚ rXéàÜdf»óß+Zž‰ëdyĤ'N'”,'4ú¼Ô™ÙVªçtRVx–8;€Uš:è¦ÉÙÕ€VüùÓ¯®éqým#sl„îáPÝl¨*)ճν|?7”núköôço^²ç…§.ëì<èdµ*Ñ}×õq*e;·møíë—oùrÖ™|z°g?$ ‘Út,J:~¶AqÛ®}úvµcÇ—]þÞ’]Sòd÷1æ–‹û¥Õz¬ÞEoÞzõæ %fRn¯áWÞpùÑé1ú½c‚Åß½þì?¬*U¹­Í1ã¹oxVSúÌ9€§CÏ¢žÉ¾d—_2ùÛo‹ÏïÔÕAŒXçe¥?M}ö½ß6î,ói²'»ó±Œ¹jxaí˜ó®˜õÚÔY®-áéœ3öÚs»' À¬øcÚKïþ¸²xOµ®¾þóèq<ÒÚƒä­s›­DE½¬6pâÈs†qÏÄW§¼TôòCÓDذôÉ«ïZ;üÅ—¯êh'XÉW·]þfÊýoß}¬³ji Ë×%n‘ë5TÌ:eQVV¯Êm±ÛRõgAAÔ ÍgŒ1fõJ"Ü4MQ=›êúïš4ËyæØI×eøNù¹ûi»©×÷v7Õ9!„„÷†seÅ›wÞÿ%xÑ¸Ë ä²Uó>X ÎЇu³”~ÆÝ÷Ÿš!êÌtí÷¸©-­õOÍK!©ûðkn;+Ée–,þô…éO¼Tøú½“,çÌPlE£®¿$U]7ïÃéß©>ýÒu]´Æé^9kòóó玟< ­è-ñå$CYc1ÁîN²sß^Ÿ·Rl¾ -Û•yÑÄë í çLvâúê—Ÿ•k' mœ~×mø\<ötÓ÷ïM½óîà Ï\ÖÁFLïÊŸ~/N½pâu=’L?-HIi„µÍŸ„Áž7òº‘ŸßüùÇ¿–™¼9F¡ÆwÚ]úaÑŠòË:fIÀ«Ö,(¦]Îéš ox?¦ÂOSO‘ë1T<ÛF[©Iegº®ë«ù±n°.´ðÕ—mAAP'4 «þ}ÑÙÏÔ¼N9ã…7Æu‰3GšW/}{æÎÎã^7¬D {Fùïcg|³ñš^½šû²ò© G>]óÚ1è‰÷&õÖÿšöß’Ì‹^¸ûÒ<;%Ð/£xþÒ¥q~mOÉ)(È‘ f‹»¡ ŽÚ:§nÿéÆï–íÑN´tBê K®ÙÅAÉ Ùu¿øhÙ% Lj„qºH%^æêÞwàQ=ÜÂ>mÒd˜®øönYòåë?xå¢:ØÁ·(v¥tåÀ¹3·ßà]ôècéD¯½ûƒi¸»_‚é;Ÿlisî³w_Rè dP¿<õº‰Ó§-9óþ£€sW~ÿÁý»8!D‰´¶º¥yK´[f\ñó5ö«‹cjR—“Ф)?,¯<+3]ð­·º^ßÝã_út< „ÕNýEŽg¨zl[ÇJM+ðêç.=÷?áŠÝdê»ÐºÖUîq²í¦¨AuB³wÉ#7ôI rJ¾L‰û‹zéÚ­AcçóלþB›Â³ïU8›²úRþeMè름Ñc§æîõÛµÄ>}ÚÚ¨u”Ö㑚ѤzÉÂO¦~8÷¯M{ê‚Lª î[ä‡ÐšÚ²tu}´f}©>0‘6liÈÈ‹zÿòê=ã6?ò¼³G í˜Ôôàû²â\Ì|íc×Mâ8•Ò5d' „ ŽënÿrÃÚR½Ÿmïêͪ»gÿvvËÎöì=\­\S¢í¡µ¿ªëý†[ÛVØ|%ŠT¢À€ƒ¾7v¡xÏî§v¦Ì[^yò‰Žu?,Õ ®-J4ËÖÕk}ïêͪ»GýEŽ6TiC¶=@•”{уã{…&Åø—¿rï4Rß…Ö5æu™m· o‚ ‚:¡YpµëÔµKí>ñÓ™—=ùÄE…Φõøæ_öØ„~ ꚺ8µè˜H@‹[)U‘-FL“CMð©ëlB胆¬-ç5[‰ê¢íù{›ÎÓ Óäx…hïáÝ…ûWE¿”¹‹ÕΣû¥¤:ž*¢JÒ¨"ï3”ÙXÛ6‘„œn=z„¦èø¼Büõœ·¢¾;Bm¶9( ‚ ê„f¢ÞžyB€› ÄÔ‚v’Z\ m‡å9istå×=¯”Þ%Wþdù[ƒ=»ÔÉ$ØÜ2*“sh¾uÇÒMfþøËFÓV$¦{¥bê®lZ°*`+(L“ŒF‡ˆ®öξù¨“†¾tý³¾\wöĦj3³°ca²PpÇ=ÛÇß=õñYÝž¹0_Žw^­îô] ×ø¥¬‚T ¤6ÚË3þ^´KëQ`'ô WVK9Òec()–µ›­Dá†U·|ùê—{œ¯96Ý.Æ3fRßsÚ'ÏžûCÒB³ßÄi!q-°¯v¤ôNíå+#Šœ«Èa†ÓgÛæºjÿÞ}%Š’¹û²"AAP'´BB[”.ùqá¶vƒÚ¸êŒ¶7Ïœ|?½äŒÞmíj鎪ÜSOëÒÄÕD«Šÿ^–X».*ö¶:õ¹ú‚Üë>|ðvùYýÚ¹‚k¶úbˆé= äÏçøY×3:ð²êŒcNnŽ}äŒ.™0}æ³Ý'vÏvìÝá¯ó©ëÒ?)eÇ__N›YšwåCE ”4Æ8ŽÒßçüÅÚç§9ôÝKŠ}Ì™ê:®wB¡‰E£ï=wñ„÷žûüè'.ÎS)P¾`ú´ö'öHÓ7Î{úŽÔ³néH q÷}nÎøyÜ~Åð|Øôý{Ówf_ò¯~ž˜®~”µ‡¦¬úfQ3•È»iÅÒD{°|÷¶õ¿~ýÕ_%mFN¾ñ¸4Q q[ñô8ïxÏÍï¿ÎÜ'>Ù'‰ Iñ¾^; 9¦¡hR}¶=xÐÄF”(“ÇË6ÞAuBËè„6'\sþOÏÌyíËÁý¯ïÚíê§ŸJzíÍo?˜2³Ê´'u8æêAúx„&¥¼mÆC÷|²ïmÛ ^}åŠÂ‹ÿçí×g}8e–Wí‰i݆äE-pI“^;áŒ'ßúð‰UG›þ—tÚ5Q8à‚ʹçÞSés¾ÿø<H mºe'@på÷îšúÛ'Ý4¥Ä¬NÇÜôìU§ç;hãŒ#U¬ÿ飙+ÊTÎíiß0é¼¶¡Ž.OùÃÝï¿úÓ‰œÒmt¬J±¾hó-úäù{YbûÜwÕÝ,—ÞVxÙcO;_›:ûåûJyZÁQ×Lw~G{l3ÊÚº7K‰Dwz2]ðÙÃ÷~Ô™–Õ.¿ÿاGÚ+Ýʆ#~K³w1¼ÝœôSÏè^3ˆçËRÚ©¿Èq 'åƒ}Ñ‘F”hŒƒÇÍ6‚ ‚ G4$bcVÎ9çÜ4M]׃Á` ¨®®öz½Š¢Å +âÌd@…Hç‚3Æxè8çŒ1NjÞrÎxí>ɄЦmÆÆ™5 ¡æáé[ÝçÖiëdÉzkåÒ&Ç@qfî+˜uê}[ŠBkfRï;YÃÐ(ãX_ˆùÛýÍjšª“÷çՊߺö†oú=õÎuí$Ü’û2^SØ:¹Š°3İ6@³•(Ô¬é¸uSŠßÒ¸i2 u2ûËѵ]äÆ*2å˜V:À <Ô@‰Œ-õgAAaùòå6›-11Ñív»\.»Ý.I’ ;ÎÁ yÆ„˜‡iØaRç[„4ÃÔ„8ç­'ýºYŠ|Û<Ù „’†Í•ÝúCê)ëX¬q•B(¥±ÝÙ8…YÖȃ§Dl @„¨ŸÆþrtíÄmvõŠìG‹hzñëjL‰êÉ6‚ ‚ G,M€ ‚ ‚ HÍw„¾4Cl  ³ ‚ G&w„ÎJ²YB³ÐP˜mAAZw„ ‚ ‚ êAAAP' ‚ ‚ ‚:AAAÔ ‚ ‚ ‚ N@AAu‚ ‚ ‚ ¨AAA€ ‚ ‚ êAAAP' ‚ ‚ ‚:AAAÔ ‚ ‚ ‚ N@AAu‚ ‚ ‚ ¨AAA€ ‚ ‚ ‚:AAAÔ ‚ ‚ ‚ì"šàGÓ´y?ÎÛ½g7ð–;連tëÒq\7ôå+–—W–·.v*ì”›“‹m AAÔ Èáÿÿ¯ÝnÏÍÍU5µeÎ(‰ÒšukdY.ìP!–,[’Û>wÈà!Ñâ…s¾pñ»vfefasBAur˜PV^–—Ÿ§i¥-„f2Ó•àZ¿q}a‡Âˆ¼UÞÜö¹º¡sÎ[‹)¥E=Šþøó̶™­HÞ ‚ ‚ N@ê…ƒ®ë-ìàj†&!vv8gŒµ"û1Æ€*AAP' ‡?c=Ê¥õ &„´r8Ô#‚ ‚„§aLZÂÝ:àNLÔ P¶pw8(°ú.'tˆm€ÆAAðáØÂ:ÁòëÂÏÒ4OuH ( ³z)/>6¢]<¡s0mã[s´Ùl®$Sv®ú{GB·¾y.¡þoj›Þ½ãÁ=î~îšÎN³råO –9‡1ÆiãÌrDº¾Ñ’ \Ä<ˆ:AäPDÝùËç_,;uÈY}`Ñbú +ùué±giº.a¯á'˜µ†a†(Š!þ`è„®ÂÕBƒ8(:ë{ÿšõþÇ?¬Ø¸¥¤Ú”<™û=gÌEÛ6©GžUþï¶ËžYaf\ñÊK—çÙHK¦`–Ì}uÆfÓl{Êˆî ´ÙDB‹•HHíwBgaÙòÅo½»pð¤c“bëJ÷s~‚±gÞÓWçŸ?æÔl{Ìßq­|ÛÖ2[NA†6‹N`ÞŸ§Üöį¥\iYYzŸtá…'uO‘êËwpã´É®?÷ù—Ú;ª<[ZÛ̬T­Íktô rú¾õˆk\5<þ2¦„@A¸÷×gîzæÏrƒ€äIËîrÌ©ç5´“‡¶œÇn&cÌ4 ]oÚY¹o휷Þýצ2¡Mçg޽ê¤|G¬'=¯øîž^ÝPgYÃÂk_~âÄ*Eã•??xã+Ës.éááY!/ÃJ‡†¡ëá¯á>†!‚%t]B¡GÍ(â)ËÍ‹Öâ¡…t«Zöòí÷ÍÜf°ßÀ¬Øþ÷üŸz]:j`S/!¦3Æ$¥©)¨gO_m0Úó’‘Žf¼`[®D´Í+FL»ã‹½¿¼7ÿŠþçdÇTjqu¯úëµg gNÝ=!ü lI©)©‡Dil«¨%?|øÉÎÁãÆ·m¶zöjˆížs½ª¤TÏ:û®q½œJù®íÿøæÕÛ¿œ}ÆÃ_ÛÇw$‘sÎXË߀^Î~ǣåaNl#u?ò¦'D‹ëµ%ÂÿÆ›¶…RA¤ÖmR*ö”jmFÜvUQWʶ,ûö‹W&-ÝùØýç8Zj¬_Ó Æ˜¡kšÖ”Nw£äÛ)“ߨÛûòqäkg¿óÚ¤2ñ…[‰ðÌT]7ŒŒ‘·_ÕÍUS8Á™c3tÍ´KÔñœ³rg½µyýü%eg¶ËŒåSÇ× 8cœZWд]5hÜvEsÆ€Ò8Bb¿Ç8ÎÁ׳¨g’@†ž~Ö)³ï»ãõ'_éñ­CÒD¢W,ùÆ›_.ÚX)¤w:ö¢ñWÚÁ%p[ß»é¬izLzwÊ Ç®9Sî{éîÝíúŒ=aTŸT‘€¾eÚ ·Íí÷èkc;ÙkÎn +·Ì}û…é?­.U¹-}à˜ÿ5,3Bk1`GÔü„˜"!|n–¥¬(ÌÐqÀQAØŽSP38wfæçç' ¤°c×n©¥7¿0î†S² íÔô®üöÃç.ßRER;ô?ó²QÇç:ÀüëçMÿðûeJ‚;ÿÔ›n»¨ÐAyõÚ¹Ó?œ»tc¤æõvÑ%Ã:¹`z—~1í³?Öm/õëàè~Õw—.å‹gO›ñóêíU4-7*ÑÕ`0È@ÝþóGoÎü}}…rjŸ‹o›04Cô¯xóÑ×7ô¼á¾‹:¹¢žëÆ®Ÿ¾ZÍúÜxщ=ÜÉc¬¾å•™ó·õ‘5æÏ‚šÉ¹3#/¿ 1ÔÿHL5h‹“ùàÚWojóðɌȔ%ßÝwלœÛŸ¸®£ò篶t[i¥¢Gj~¯‘—_z‚e=vÑÌzKQóŒ ¬úüÛ’£&ô_ðÌçŸ.ysÿ$ËqÒUqfhÁ`̰×Ð š¦€,Ë¢(RJ9çÖC³Œ'D$„ PJA µpÎC‚¡‘R¡™u«X8ýŒCû˘t~‡@¤¤f¶ïn×¼sçÄO·&ãjñ²™ÏÞ¼ÚûÒ³ççÚõ½‹¬Ü¬˜œÊ2(åÛ–Ï|ú3}êÍ=]¡Ä%·Ç-[šS"Bõ®=Š˜à–•åÅ‹?ìa[û/+´ë›>ž4þ½cœSPJËD‡T+!ÃS`¿<ùȇ©&KHokSÊwûìrÝNn³lù¢½ ÿkôOÛ•²ê!_"Ú¦wßt(Þ½ù·õ¾ÓÛÆ =hQË­¸;*P¡NžQòÝs¯üÕùšÛÎȶ¶gÑ?ÿ~ůƥ¤ng\yiÿ‘ ÈÞï^y`.@þÅ“Æõ¬ù#Pau¯‘ 5×µµ?mìé3oõéo¥ÇŒH*þèþ{f;θú¶1EO}á’ùò¸"‘s€ôwÜur†Lˆ£­ƒIìvÊ•G$»XÉ’™¯|ôïW ^š4 Qàœ™¦Á"ceô_>þâ޳ÇÞß¿­èÝãËI£ý[rÍOˆ˜¸¡B3´Búƒ¨Aj]gƈ m&:$³º¤Â¯(ê¶Ù?>ß~Âù£ÏO üýõô7Ÿ6“¼¨‹‹ïøú‰‡fWu6r\a2TW'¸Í`°jûœ)“çzž~îøºí·Ùï?öxõ=“FfËÄØ»ò·E[‡]~~G©Ðö6M©Xùñ#ÿþõ:í¼ÓÛK•Ÿ³9ô ¢(êžož{ëûÉ£nì™.úÊüme=¨èŠªƒA%T”èþ?Ý[æ3%—lªÁ % ¤wH6¿]·³ú„Ĩ˜«° "­ñsJômñ2¯ªšaèjPQƒ€©u]ׂŠâ/߸|ÍÞÔÓ¯¸(×îßµèÛYo=Å“'_ÚÕ®­S4£ÞRXù«ZøåFÏk{çæ'ôøüõ9?mïzr†H,`2¦EáfØëFèUUc’$YÚ€1f †æÕ á"!„ V€“P‹% 6²#|}¤˜™if —¬ÝÁ8‡Ô£úgÙk»›C'fe?½úù6Ô{]ýÐÝgT~yïõo¯]ûþ»K†Ý;°ÆÿJñä7wÜûñ„ßÞRöóüM×öèa¯I;ó¢Ç_¼<ÏF(°÷˜ðö77j>o•oïÏÜþîúmþ]qqùçW?Üh˜B·«ž~ä¼NnúÁnóG§ UlÙ¡1Æ ®{ú‰órìÜ0¨­nmÞmœs{»·ÀÊc¥\>ïÐ/‘”Þ!=FùŸ IÂþŒ'Ô´¾Èqk¸€¥”—þþÁçËmCθª[²à«PÚ¸%J@Ò1]Þ?Y Äžêz€ã µBa߇rÛ®íÅYk7ì V¿7sW§1/Ž>%]"Ð5½ìÏë?ûvã=:p°'·ëŸ-Bpμ£çtýç[ç-Û­å¶×íÒ¨ÚëeÎ.½û÷í–@¡+C&°#n~Bô0Bø$-+fÓzZÞ!" u‚ H¨[5LA¿¿šëJå|þ»—¥èþ½+f|·;ûì»Nï"h{Þ‰‹Ÿ7ݰví6Íøj«gÈÍWœ”c¯y:+þ’UŸ|½-ñ¸‰—Ÿc§¤Sn²o˳s>[|ô5=\f@5 9½ s~{;Õ·géç?îM>éöKNÈ´Q¹Îâ+ש¿ß{wWrQ~a^–K€,Ãïó䎺k2Ê~_tìíÛËßÿöÕG::ÇÅ*·•*L©ôVùý&‰YØMoÞzÃ[5G<ƒo»ûì\cuÜÌkŠfš¦ðû}"€P fêŠßï÷«†!¥æuÊϳ‘üö »–?¿dÁ†ÓÛ¥¯ŽW4©þR€YöÃ7«åž×gƒBÛÛÇþÒ·ÿ[ßoDŽLŒ@m6ü†öº~~ eÙòËMÓ´¦(4WÜQ¸Naˆ¢(Šbè),Šb¸û× WÖÌ:ˆ² ˆ±ÐÕ]+6›œÛz:­{šCH=yDçwÖ­ n^Q¢ê(¦‚-³Wl­¬ÜéÕì!SXf­ÑÞ¥ÓŸzê㥥Àò?À_0ÔÒ¥ëtÎ¥>ŸÞ)Q¸<Ì#)³ÿ1mg|¶sÓkã¯þß3F]|ÞqùªR©PÀ‘ä@Ý#e¥5”ˆÈžÀ T8çÝê‰;²š_”N°ÞPJ)(^?·åuéÖµƒcŸ2¥”ÈIÙ9é‰é·c…±ØqGûüÓ}à\+Y·]5v½4þÜ—IÍqÆl{³q…#Z?4ö.üâÍó–l. R‡db•jFˆœ×¼²u8íü^¿¾ùÀ›†œvÖ™Ã&FÇmqàGˆË3Ö(¤ŒZt]·îƒ–l— ¡ÊE©€ RûØó)ºÉŠß»ë–÷¬‡ŠÞã´+Gv¤JåÎu;­lúÃ7Tó¼aœÑåå|ÍVEÎËsja~ª¾kÍÖ -?7tЙ—-»eÝöŠÜ,âW fjŠ¿ºÚ ôv©Ž‚lYõûu +c¦ê÷Uû¤¤>Çå-žóÒ#›{ rìÑEí1Ã8ç´ó•úÉ÷| pÓpåR]ÕÛn6ý„ÑgZc Tr{‚þÊ=ñ3켃 Õ_]퓘þ ašZÀWí X…òUWë”0[jóïÙëõêñ‹ÖPAô]?ýo›§ï™‰ªß§Crß>‰?ÿúãêgv°S¢TƒjÀW]­›a¯1žt]·žz†ahšfÅøxBt¸‘…5^a)I’¬¿Ö˜†• k.u„Tˆ9¤ÐÌ:AL+lCH ”,\´ûꎹ¶˜Þ^H¸Ôä†Cdx·àHqTrÃ`!€Æ>77°üµÉ-ñòœaWœYäÜòùÔ/7™À¸¡1 T¤uÖ‘N8º^ûìS9~8ã›Åë~šþÈÏ¿_úŸ§¯ê6FFm‰v€€Z¥2àfŒ”[E‰ˆæ÷`óØb7Èzt É„h@¥Ô–3褎+g½öÌξÇ2°wûk4«ös¡¹æ'ð¨µÝ«¶ë<­CŠh&Øû]ßUöUŸ-Õ-À.P³v;æ<úø ÿ+o¹ªs2ßñß¿ø+„ÍsŽOàRΙ÷½ÔwÉüÙ_Ìú÷³æ\ôÐCD¬täè„è: yÿº®[ !„ßï÷ù|Œ1ôAê½™Úz_}wX#ñÀ9ã@)!†¦ò¤Á7ß;b„È ¹ùÞ!@AÓÔÐG<9â owÆ­P¦j4ô†»‡å¡ÏR†N¼wè¾/ó6§O¼€ššÊ yÀ¥·õ¯}$jÁ`c¼Y[þñ£oº¯¥ kjœÂRJÂ"^t•Õ—ù¶gÝ~75U•ண®¿·PÐ̺…’{Œ½§PÊ ž¢5ôXK|Ó݃Œ`À€¤A×=0hªJO9åæ»O±Na¯áçgeeíë1WUUU[ YB$IJJJJNN–eÙ4MY–9ç–Tˆ¹XjlǾy³E=ÝOí!¯\,~÷‘§ícÏ?ºS¦Ë¬ÚµaeIÛã†äÚ2{äÒÿý­.ûäÛÕÏ,¨œ÷Õ:ιœÛ5=²—6<ÏDNJ’Ì=oö±;ˆÄ»e‹sÈ=õÒs‡·3—/zwÎ&?€”Ñ% ~Y¯.ýôÅ=Îèà"šÏN91*‘ê¾*ZpÆuŸ~ÅÊ×nü×§»6ýðçžK;æíÓ6‚»­Hy`O‰ÂÀ%·‰‘²½5”ˆTn«äœ“¤¶ ±gPo]TëÞD(¡uæ,B,@(•³N;©ÛÚ…?Îÿñýÿüøóðñןœm'¤fÄÄŽ¤¤ÞõŽXôº¨µëä0nI0®nûúoJýoj;d êÖbž~b¶3,£\“l T(†É,•ܾ¢ØÌ½æÂSŽÊ‰™ë†_9Æ9 ­èÉ9ã@€¬æ uf÷q]^»íþ9ÿÝ0b|ºBFàH™Çsâ²5Œ iš®ëš¦©ªZQQ‘››{ì±ÇÚíöÞšAA¶mÛ¶páÂ!C†4íçš¦íØ±cÓ¦MÙÙÙ‡#Ô>Ñ9|Ÿæ–˜ŸBÆ©FÏ¿iêÒÀöy¯=4ÿ5kú2çŽc=½þ50í¸±#gLœ¹kñ›w^ø±‚kò/¼ü(%ÁøiÚó†t“, .æª3§Ê¦óäg¦^ס°s"l*/~süµ?ä'7jI1ãÄÑ'~zϼòE¯ÜtÖ«¢&ë<ò´1²ÆàšŸuǬ¥Â''0ÆN_FAæð§‰®ë¾,’ÕµZ&Õ0 k±ÔÐxB¼ßŠXõB“úy`LÊæ®gõu ­ÏÒO½ëáÀW¥.êTO(”(ˆq›`<%%4æìq?±ÖçÚ?ph_ÆGˆglUMhæÐЍ¡Q…ðQ‚ ‚ ƒÑäù ƒAK'X+¥ZOpëin©…™Ç|*w÷s¯è­5¢DNïsÁ• ä>îü„ƒ—+Y¶¶1é‰2Þš|n ”3Vêp• áó¬¤Ðk¯G” ‚ Ò\:¡Y’Ò4M’$Y–÷6âœãxB3TÒáý–× ÖFâõx¢­Éo¶þcGÊ’GáAG¡¹ !€AG‚X0µªdW…ж}ºGF&B)©¬øíðnô‘TU•eÙÚï(|ÿÓP_K쳆´F¬­7ZX»X;}Äx´0ÖʤˆÐBû'„–<²¤‚¥pÏùç1¶Ï¸ë¾™{xÆ9>yv;©e/J^õÛä SW›mΛòØùíÐÓ@&>jc6SJ;wîL)-..®®®·Û——Ç[³fiš1S³V0 &„ºüêÏ^½G:)))¯ü»¨gQ‹¹æ¦i®ø{E×Î]£?ò¸=¥å¥©É©­Ë†›Š7egeö‹…^CÝQ«[ÂZ$ pÃ9t®[“1“q" ´¥Ç<935Æ9"äˆpEƒBÌYº®›¦)B^^ÞæÍ› //ÏRõLz¶zôBs ÃŽ"ñá) N8Ò~òðy?Λ5gV‹-ÚÃ8Ðo@Ç‚ŽÑM¹O¯>Ëÿ^¾qÓÆVässÎ;tÌÊÌ:B‘¾ÛšÕ‡a͈Â+ Aþaã@€ Ì«>zîµ_6—úM°¹³ Ž9ûÒ³f}òŽ×V›ö£oöÚ®.ªoýôþ{¿*a®|î®ãÒ¨ÃüO>ú~ñºÝš+«àèá£.œë¤À«~}hâ›X›s&?tn_ûÆ-ðI}o}þ†îNÎ ]ŸÜ1ú3sÑÓ÷ŸÒV‘FÙ?‘s<Á0ŒùóçŸrÊ)‚ tèСöŠgóæÍKMMà`­Ohÿ³0B"!^ê„#›ÍvÚ)§µðNaHL% Kr¿ÞýZã•|ä4˜ð[IÄD…Ö3† ‡õÅ Àꪳ‡<%¾={Ñ• )UÞí+¿}é{öÃgt=&¯ÞP½vEëæâU«V”˜Œå ê•nÓ7Nô¡ov›&ç•ÛW÷ÖCý“ïÞN®í1 ²M pf2&Q)Ôœ™ˆnw‚@åT·CŽ+ Èþ{ÑOUAà»ï¾6l˜:nÆwß}g}ï)=’ИG6êÄòÙÉ!uU ­B*„+ëh%ùÇeà!E_ûÜéʧ޻†j~Ÿ¿ô·çš±içÒ ³Žï6¸6®+_²¨ôülû†EÛóœ!½’IÙï»Ç4åîßyóð¼ªo¿ó£?Ÿ¹ö¸ñÝ9N^g“P`¼æ£Œ³ïyì‚l ÀP5Ô ²OÛx ¯§¥¥…úæ,Ç)55µþUÚ£Ã"žé¨i¶›Wø&ü5Æ!È¡CŒ~V½röo|½ª‚pΔ+œ¦wÜ6lÜýÛâÒ3ÿÜdrhwLŸT!¸fív“ƒ­ÇY'uN çÑC >Ú´AݲÖË{º¬N&yºší+J™¡›t¬ Ùßë—x»%&&„¯šÚ¯_¿ 6x½Þx©…+„˜+¢âzG‚4H€°ÉÍ15Z A‰ µîvô\ýÑ‹_­ôAÖñ ëêØþÍ{ßma@8!BRѲyÃö f®S²Ží—!0…ñZ÷Ÿé†É,e@8çˆ( TÌšëžÔªN  &39F#"H“u¥4æzGùùùÖGsçÎåœ[sòóó—-[o½#¨Û©×ÈÐ#Ô ‚ìŸãQ¡GáÚÀZ„m… ÿ0Œ!5N; ]¡fÕÎ pÒîøsOšü{éŒï·¬k™$÷ÖwƦ¿vÌ™¶ƒsž7ìØ Á4„´ŽYäõÚª9?¬ow\[ï¯?lærv§T‘0Oª“€¯jÍÚ2³½Ë Ä:µäòHÔ²Õ[},ÃÁtDƒJ¤ R!Ú·ÖáœÏŸ?ßRsçÎ=ñÄ­‰ Š„ð­Œ>B€ HS¤B<ñ€=‡r9»>»ëÊ/j]t¹çø±í`[ÕöéwMZínQXÍ4ÄÝeø±I‹ç•„îôLÕ ÉýGøßǾ/ù{úc7D¬x…œ‘ç÷L ,Ø~HŸ„ß~©Úþñ]£gÚHPÙw3³úŠKVik¦Þ2ö=Ñp;é¡‹ í¥‚ì¯Nˆîz3 ã³Ï>㜧¦¦¦§§BöîÝ;cÆ (((ˆ·?U=ë–Û¹´´tõêÕŠ¢`Õ"Èa¦ Â÷V³öjQUUUU¥–@ ““ƒó˜äP¹nyM÷¾º"užÐãâÛ.!~³p]É–õ%l‰™¹Ý²]„sƘ̭  IDATœ7ôøvó¿Ø¶¾Ãz%s]eŒƒ\pÞíw¦|ñéüe›JUg›Â~Ã/¾ìä\Ù*LîtáÄÑâ'_/Þ°«J!’3)5«k×d‘€ ‰ý¯·ûƒÏXµ³*@ç¢(þ³KŠ£TXµr˜Ýª8çÀ#gAÕ…}ÿãzGÒ1|å*QUƒ92û=np*Uƒ*îv€ ÿ(N§Óív†Ñ«ƒÄ B€ H£tB´L¨QÀÃ÷ó¶VeF£!HkBH?aÂã§86™®(:ªùçIIIÙ±c‡$IÒPÔHP' Ò8=ª6˜±R* AZŒ`c„ä"))) îÝ»×áp4—Z@€ ÈÁÒ ¢xÍx‚uíÛl6¼ ‚ È£iZÛ¶m=Oqqquuuó:çÑ ¨Ù%¬Q…©8˜€ ‚ ͆ªªv»½OŸ>’Èœ9söKDÀ8#€ë¢ª{zë­?².™0"džµ„ì§N`œ1kgWÎC/êŒ* F@AfE×u]×›1ÁÆK…#r<);Wý½#¡[ß<—Ðò??Øh›Þ½ãÁ=î~îšÎNFfÕ¬\ùÓ‚¥CÎaŒqÜóŸ­FÚÿhoq NÄQ«¹ ‚ ÈFÄ<æFJ…V¥ô²Å3ßûhþŠu[˃‚3£cŸ/}é€4qÝÝàÆi“]îó/µw6ÅU®çç¬ì›ÛǾ Nüðñ!I¤êç)·=ñk©ÁWZVV‡Þ']xáIÝS¤fpÏÍ=³n?ucô¶·…^¿)µmfVªƒðè¬Öõõƒ¦E˾¹}ì këTPÇ›ÞxöD[Z¨vY µ·µ³§<~Ywí‡Å^öÈÞ+_~î̶i¶‹:Z$ÔÌ]Í`®]A`Á‚¸-7‚üã 2€­F'peýûÿº{ú{瓇]~vûð¯ZU¡6ÉÝå|_ôDÓJïçœ3Ó4 gœsЫJJõ¬³ï×Ë©”ïÚ¾ño^½ýËÙg<üøµ}<â:p$ù˜Ȫ6ô-_<ûúÚî×Þzz¶LˆàÎOÍI¹ãÑá„R¨ÙD·NVCꄃŠÕÚwϵEnÁªlêjï¡’4üŽG‡ÕÔNó´7cã§÷?™þü=òm5ûœ™Ì4YsÖ0çñf(@ôØà˜˜xôÑGøÒ‚4™ßÿïÆH¤ÿxx®wăk§?7}CʈÉSÆôòH„Àq'Î-ˬZùå›oÌ^¸¶Ò;uÖ5cÎêæ€YúӫϽÿç–=å~8Ó;ö¿pü˜á.sØúÞMgM#ÐcÒ»S9vÍ™rßûKw˜èn×gÄè £ú¤Z¾<ó­žóæ›_þµf·Ÿ&v<óž®Î‹þ¹;Ô[¿Ï­œƒ;¯gQÏ$ =ý¬SfßwÇëO¾Òã…[‡¤ RÓ {¤¿È°%£s¯Þ]숱eÚµ·Íí÷èkc;Ù£KÚŸ…9~zÅÒ™o¼ù墕Bz§cG¿jX—€Oöæ¸ Üí»÷ì‘2(! O»!T;• ߟ:í§U[K|8ûÜøïOIÜùýÛ/Lÿiu©ÊméÇ<ø¯a™2o¨½¥vO]6õá÷sþ}U×JjÖÔ°±ãËX Ûº4þ(ÞSÐÁѶèäsÒ%s\´¹’$ç 8÷º›Fv¬‘7a-$­ãÀ Æ^~B{[ýs8çèÙmŸsΓ’’DQÄ–€ ÿ¬\gŒ5mÕ|iU:Á¿úóÿsT‘P«‰8çÚæî›4ÝwÔ¨«ïé@6Ïûðݯ<7åâ6bú7/Yµ7ó‚ ×:|Û~ý䃗Ú½:¾ˆr>⎻NÎ q´u ‰ÝN¹râˆd+Y2ó•þýjÁK“$ D/þäþ;Þ¯è}Þe“º¥‚×ën#Y%¬ûs¾O „é&µµ?mìé3oõéo¥ÇŒÈ›ó²åœ!Vï³il_lQݬֆ“sιºá£ûï™í8ãêÛÆd}<õÅHÖËãBàÈ^œ¦iZÓú (­S;fÕªŸÿÜšzîãº%²íÌwÌzüÅg½¿[ѻǗ“(BÌJ¬ÓÞhÖiwK»÷‰'_(|êöÁibøñ¶uid]xË„N¶Š•3_ûâååÇ]<ê–‹¿ôú›O&wya\';%µ-dô­×dþúxêË“¡Í³Wu±×]é(ì‚ ß"11‘RŠÞ ‚üƒ$%%1Æ(¥°ÿ½ÈÈáGÓÚ@ëÐ ¦wË–Ïèž®Á}ËÞûlkÚÙOÜ>ªƒƒ’½Û«7Núäýe#î9ÊÃçÜѾ×À~í¤o¯¶%K&ýþCq°G>{r»ùÙ±Ô8óŽœнSÊöŸo·l·v”ÛXöî'›ÓΚò¯K ´ÆÛ%úç<ì!ú·Žh°Ûvm/ÎZ»a¯ÊÒ…æ™F>„ÁÃ<ÔÚYÕö}U/›6sW§1/Ž>%]"ÿgïºã£(Þþ3»{{ýré½:B Ò‹€(VšŠ€Ø»?ËkoØQ.¢( HG”*B‡B¤~Éõ»Ý™÷»$—äB )Ì÷“.·;3»SŸï3Ïó $ù—îr妬‡ÚwTPç!.œúêá{¿vþâsûgß?Ò†umLQDuí•ÜF†²*®ÀŠÄÎÝ»¶U1޾E®Ôßë“2õõ»g¼òÍ·cg ÷ríwÈmÇ–9‡FÇîÛÈP»À½O­ 8r`²ŠAmeÇv}p(½Ð!18{ȤÁ~6¾%ûŸ^µõܸ„DI-zPÃV)Q ßa툀eY*šPP4­\è”´S¸R…:áò}£eð‚EB1¨¾Éµ­øôy«ª}rÔñÒní+NfÙ’UŒãaäPµó1¾hkQ¥@0!PºÕ‘£PœöÇüß¶¥g—Z9kÁ\¥U$ÄV|ê¼EÕ.9XŠP­e°nòÚB»«rµŽ(EFõ~¼~žPmâòFÄí«:¶9!„ØŠÏ\´ ß=q÷l§];ÆXZl‰œN'7†¾EÞ7ó±NŽí†÷Ž” ë¶NuÿBø˜Ûïí´gþ[OŸë{û£‡§ÆyqÈÙn—ëo@’'Œ}á¡ã¯Î™µ>ñµðjâ¡c×.šó×"›®ÂÁ!¥Þ¡^pºÜ$bLªzÈ=U=DE¾ÄŒ çìà®[< P´ ’ PÑ„‚¢É!ÇqŽIÇ#Å5 eðF$AÇ2òÍb WÛ(†‚«s ÚbXõ%ÃK B€C›ëxW!oÝûþfìûðó“Úx“¼Ÿ»&„ˆ"¨öÙQõ’×ûøÚvG.ÏÙ.̵¿î†U©[L­¯®÷ª®bª(ˆ K~ræ¤yõ‚ÔWÍR1ïF5‹"8®M‚–uÕìÔjºLR>zæw]Ó·ÿùÇšÏ_^³nì;ïÜ«¸bs¤—„~îá´ç}õ×XyÕÏvO»vÑ,Ï!° Âa%¬sœ ªòp¼ŒA€1ÆsZD„Úî̮Ԙ®F·rÇwô û ÍŽñH](šOÀ䯳&Oy›×þmËÖÝÙæþ¸ZV1œO\„dõÉCÖ¤°8i”„Æù²Ä©»uØwÔüñ*)˜ËÍ‚ˆ9€%÷XŽ9åþ!Ý9$ª"Õ°‡À„óŽ aÿÑžkX`ƒNŸüß3?ülI!«‡Ž]§hg‹B0—ëš2 Lî +"DA„ê3Ö` Î ®TbµZé~EÓÂb±ðþñ°rÝò Ê~‰!²’<“3h:øê}ˆïœä/µ”›Ãz¥†×MÞ¿†­9À¥@P™sâ¨Zf)/Ì;·Ó¦ô’€á¯OíísUöîöª¿ºÞ—öS¨¡ôÈÁ=ºŒ¿=àÕuŸ~ÀÜ;¬C€ÌVV 08žº1ß YÉY­>Y«€Pœ¶1‡EøÈíEG/±Â[Á°Wêo59°þý§=²ë…ÙG¶E’÷»îÐpï\íÖ—³‡|ÈÜ3´}€ÔZš_šÚ/Jîâœà ‡JoìS´¼¾1¶X,Ô΂¢Éy‚D"¡33EªpUh1ç'0Úä§¾ø°ý¯¿mH[ûÃÚJ$^! )£H¢îŸù®|ñ¢ óÞ/ŸèNßž4:FŠ Ž‹€‹@4Ý™6ô«ŸW|ñ‘Mæ×徸>£F¾<­äû¿ÍúÇ¥_›`% D?áÿÓ,^²å×ÏV‰,°÷”v=#üë&OP3õ…v`•~Þ̾??y÷O`ä¾AÁÉ¿;f@;?)s#+©Zª«9îªæ˜z_ššúàèÝßm^´¡Gç) ÿï]¯Å?mûý‹uz,óŠì>!e@œŠ¡CéÆÓ·ªßÁƒ €­ììžN–Z H}ãzL}þŽ ¸é®uú›+aý>:nÛôÅOóÔ±ë Ç›Õ3—#²ª²âËuz,ÕDtÛ¥o” Õ:?¡ÚK¡±'Šf\Q-‹(Š”'PP4-OP(,ËV{3Ó:¡¸jjQß‘"Š¢Ýn·X,&“I¯×WTT˜ÍæŽ;^qÒß¼ys^x¶Á˜TK!!Ä0U.¸Îð.!TcCC°H€aª¢Ícãˆ3D°ÓÞ!ÇýêYW'rfµ®Ÿ¼æ k•QeQRµÏÃÜøªqÄq}‹º_]÷K &5)j}]u…RÜ€v©é u~¯nÚ-ålššÞ]Ó]ÔßÜÿæ¡c×*ºnŠZy‚1vöe‡›ª 6›ÍjµZ-V“Éd4 zƒ^¯×ëõQ‘Q}úô¡Òá-Ëk‡ÕjÕét={ö¤=‚¢ ±wï^­VËó<Ïó,ËRžp+cÏž=:N£Ñxyyi4µZ­R©d2™L&“J¥ÇqÇ0ŒÃ^Ôuên1û U¼¡Zû&.PÍw¹¼bëC S‹e Ãq¨S3®ß‚Ú×O^S¢kuyAcÔBLÝ÷­ýÕõ^µv ׯ£šàØ..=¡öï5­S»¥êu™š; êoîóбk]'E<BÀ8ÀCí³\c¦‡ªìŽ€î'PP4öNgf  ºîÅgé–Æ(((šBò«ƒZQž?tÜSÔ>?ú'PP4žv»-ýÈaƒ^O#N´2…&%vhÔ™öÆóL0º6PP´*á`‚kþ㚘G5TYp‹K$Ó#êŸ@AÑ`±Xär¹(ŠÇŽU«Õ];§Ð:iö«mÍ¥ëÏžžO?zèlVF\l›æ ré~Eƒxq‹Z”œSéðï-„Ê((šOpØÍÆ®]R†¥uÒÊÐ&>élVF£.»”'PPP4hP»5=‚ª¨¨ÕÑQ)(IÀ[­VZMΪõ9DZ,å ­ ,Óèîé”'PPP\ O¨EªB«Òº¢ê:IAÑÌ#BˆeYÊZ ß&rÝshÊsÖÌ&3uO  h}<ÁÕúÜn·;B£Z¬«Õj³Ùl6›Ýn§Ê‚[¼Ÿ8zˆÃu’‚‚¢ÉáµyÂk\Â-m–þhL0 ÛîNôg˜z1/o,np: ¡Æ4EÈÏ_ž¤½V.rÉ)MhðÚ{EFáö®ß"5‹h7    †ý_Í\œMpýe+rì‡Ó{hYäiµs»[é<É¡™è›ì¹ëçÍ;?àµÁ Ýôä̓*Pž@AÑLàôOp;;²l›í(i˜+Ť¬ÜrðTùæ¥ÊntŸâ–ç ’^ÉÞVþ‘s5·Zâ¼Æ8âó±UÒ:b†e‡L%¥VV¡”Xô§·/üQôÊˆðª„¦Ò v}Á©m ?·=ûæ½1òºy[ÏoøzÖæB#©œ­,ÊØ¾ä½ôµI”¥ÇdêLX—v²b@„¼¾ÞLÈÛòÝçëõ‰ƒGM‰Õ‚Á ô• dÏÝøíL톙†òþ[¿ò«ï¬¯ÑΗ5”™5\³' 40.E³â ŽxG5¿Jdýc9¡ tKQ-+#€BÛ>Ýž9yB·PGB¢µ£J7]ÚTNbB‚¤Þ†ÊålV ש­öžÛHá_eg1€îlÉ¢s‚@ˆÅˆ1}±aýz½ ¼ƒ4÷´óSžÿS nðL6óTÅ’bdŒÑàÜ=uMÎh4“º«,§Ḛ̈”•ëEÎ(IB‹å ¢(˜LFG¿,.ªÈÊ*¬Ò0ÕôU†a’’¢üý5¹ʔɞ‚¥¨C|fŒö•ïÎ~é¸@ûŠ2:tÉHéîuç¿Ê]<Qd÷ˆ¯zÀÂ¥þÔÑ%ºI+Û}hÔë±ÖoÊݦwN|¼ŸïWc½ ;Ï¿~ÔnkX«\fÈ7þlÐ ûÖ7÷ÛM£¹<}Þ—ë.žÈÒW9îªRžzýáIá¿ß½¿*§lïÖ3#íX{ÃGVl-qàˆ§ˆàJwÍ~gEvÚ–“w·ë”:f„.­,°gO?7’61f¬Ý’ï=àùGG†Kô!0ž^»µÀgà “‡‡KÔ)1Äöáç›Ögô{´½ €È‚;·âQÛDÿ²S_>˜wB€Ô+0,,PRÕfŠÐö]C Ò«ðÐ'û2Ë„ö*Æä¦Dd­›ÜVPnÀòØÄmcÌMÐݶ@÷((šO@µƒÖ°R.H‚ÊŠì¦ú RÙíI\ùéÂ¥'lVÇ lüíAÛËví2ST…åx¾Õ ià+»z•g•ØÌöür»½ÊQÌ\n>¬ eb@DP÷ŽË³a©ld’¤âtá¢c6+@W79¯á”€³/™2Š1z„ç©B å ‚XZVb0 +«pÁ¼E<Ï×U߉Âä)“dòl3»ŒËʤ©]ý&%+ýȦÆkHåÅJnàmÞkrKÎ ÎÁèԓ»K9ÖîÇ;ÆÅÍŽÄô}%ñ’e{ÿ± âúôñ«¬xé”ÝN›¤¡kšá̦%K6ŸÑ‡v0WZ¢ª¢<Ç0ÒàŽÝÃþ8Á^”[)tô©•½$³@$.ý5ëõ €`L”åê¢õí0êÁö!ÆÝd"è²ó¬ò¸¶—Sfo¯dªèBHâæö–ckˆj¡ìäÖUÿ;™[nedŒ s+öP¢ 't&çÃûksxÅwï]L¾m`ÿÔäusöo¦vGÍpHS[šD¸Õ)rriKÎ6‡Ÿ” œ,&ý¤ZÖl¬>"€°™ì:@ÞRg¶¤êÏQ€6T}W;U-+Å J(EÈ‘9GÎ]ªÊ¼öVFur›N¿í’òÎþ!!çõÿfè”a¡ñ½u[(Ä ¦qC5O°Û…ÂK…6›0yžß±skÍèAý‡aŒËËÊív·û(¨mÀ”qÃæ¢ÄAÞ´;€Æ‹E¢`ðÖNŒÑ½—)ˆ˜ø®¾]°ÝŒ0\·žãdj–ñÈö ÿwR ¢jcC¨¨œsÐûËä€A‡/®Õy°÷ƒdÇÚò³v ˆmÛÉrge‚JŠLkwý™WµÄJRRü'¶UD)HQ‘ ) f›Èã-Ú)øížÊ@‹ýð±âoÓŒebk¨CKæªy›2 $°×¨~ñ²‚í+ÿÍsçÓK°] @€Aõ¼ ˆ`¼:ôéêÏ;WF§aŒçµ†ˆ<¯µ¼B­Õ°úw†ç;&²ªgª:Fá?s~Ühêz×ÃwE{‘‹N¿l‰u’ƒ$dào¶;µoÛ¶m ?ß¶cijÏ —5ïƒI)O  h>ƒ‘ÂÔžhD«½D„8_N v¡Þt‡êJðî­=Æ" ·B$§VMMõ’×ýœnÕ#I¯^¾y0ˆ¸òô Øÿù7÷t°ª_’fâPMßã—~8a§Mé -y?¡¤¤†{té”\gmu|›¾Ò ne’—~qr:ˆÅÿ¨Œ[UgJ ¥esJ´Ó{j£Î•œ©T¶çŽî.2÷ ÐJ Ä&Æ+# åßýc®d.¦¶}7Iq“}¨ð¯Ä°‰·©÷n² Uæ.¹(ˆE§„}؃=Vòa ‰Nò{äî0Ù¯~-&˜¶©a¯wDiŠ+Æ>Á^÷‚©JMàùÑåW.Ù¢ÓYÁ?ÂçñîAÓŠr>ÍÅßÊ¢áR‰îyû€^þ8óÔºyæúëž>óßÝ€A­a±< –’R+‰‘I|büàðE0Y|:¥bˆ /ÑKý|8$VœØºá`©Ï‘ýã½êéä9¯pnûÙ“ÅöØpiÕ´Ëi#‚$[Ξ*±Ç†I¡ød–‰ Œô– 䉘1…,z+&Ä!òÛŠÏä‰!÷ŽHíàË"¬ÌRBºçë'ÄʃÚõ—”’üûG_ý³ó|ÿq ²æ¨\£þ Í'¸áí6Û® ¸}´6ÕDz¥”¸ÞLÖBQÌJб•°\’#è­:ˆGµ56Š •Öp‰F„ìkŽN A8ÊJ:Ue^„Õ1Õ™{H“Kyúßó ‡»‡<ž  Ë(¥Û ¤B` eòA¸Úü5ýÈAQ¬E\Ü6!,<Ù P÷:=B#GØj;| ,s¼Ï=áåŸgã¨QA IDATˆö>,ºÿeZûvƒ$b0BÈTjÜ—c¶µí»‰r’ÕüóöÊ>£ý_"ÆiÌ?¬3”ˆ€dÊ‰Ýøâô‹Ÿï·˜ ì;o•Nˆ¸§‡býz£^®×^r)íügû­Vp^ˆHTtp´´Âã-0v•€B14!b`˜D’-¶üV¥‚¼Ê‚5~p0Dm»h©:Õ°ëÛ™iØnÃ"&\ÌÈa±raß8tQ8ýÓGóäoLm×mLï­ßìÑe®ýêÕu,Ç`K:=öδ¶|þŽ•kv—`¸èÓî•aAu#!u»Ñ·ù}²mîÞ'ÖGb­°uII¼c`à‡›ç/’Žìyû×o, >)Qy)õŽ “ü¶q[tj(©0ùtìêå›vløGÑ=6PZ^l¾l‰Aõ’{ÛsŠ…h¥BIF¾‰È¼äÍxžÚQP47žàîœ5|æhiZßíC‚Ã3ô'Ê=f|¼ùƒ~M¶å¯ û‹m&ˆºýåí5H%lÝc1]FŒÀBv9éíÕ¯Ô¬Âh:l´•‚Wßö*S޵Xàü«Ó‹yC¦ð\Rà#H÷_±hçX¾Âx¸¢nòt‹´W*Ô V–‹Ó0È&X¨s¹°‘Wöí·ßv;×cŒA°Ûí6›Íjµ ‚xÅ·ÉÊÊ:j @Ò¼-¼„uW;b9ÛÞ½Û³³3rrÎääœq\ìøw£J-‘Ê¥2©´Ô«ÇxG¬¤oWê¢nSÑ-¿ø0\§NÚ¶úÊ?N ¼µãcñÎvì­yÿ¥— ª­¶Meå†Ï zº¿ÿƒ]5 J†­¨ü3Khü}Y@€ ,,ÑND;mD°Ñ–çÞàiK(:°=­XŸ®C{òqÚØ•>?¿¨¤¼¼\g µTR·nBbEþ…ƒÑh± „×'ô3yb¯`9ƒ€‘‡Di ¹òt’6ýúµó–û'u‹—ŠË*+ f;f¾‘ »$ùñ¶2ód®Ñ{XŸoIýWä´ ]âù¢ãi{ÿÞ¹/íT„wîªÖÆuŒ—^:´óŸm»OrñÃzxXŒ’EXŸ±s÷Eÿ^Új9„ÀV°wûQÔuPÏ •¤álÚ?;öìÏ(°ûµOnß6Q«Ïøïß¿wîÞµ÷pò‰lߣGœ†CîJ ó ˆôuMÞ^‘±~ÅŸþÙµç¿S%^î?²£/ß<ÍŽ0Æv»Ýb±FBHllìMsº6™Í‡Òëtþþ~.æîÞ³×jµøûÓkzÝš®+**0!‰¤ã"++ !¤P(LfCxh˲Ž!¹õ”Û…“Ùæ2ŽOQ¦ÄªºEÈÃe¤¤Ì’Q.êŠMg¾s¼º¬"@´nÛWº­Ô5!^f0ì,EÄIz$*È…Ê´J\R&¨üU}T݃%ƒ9=Ïœia¢5ýâÕ½b! \,0,Æ"@E±1K´‹Vß§L–€ÎtL‡‹k'?i“ëªÚFÝ+Zîk1mØ_qÒHµUS…ú°Ûl•†J/öŠ“mnn®Íf“J¥2™L*•ò<Ïó¼D"á8ŽeY¦ ¨ 5<¤Î±C$Š¢cº7™Lz½¾¢¢Âl6wìØñŠï±y󿥅] ÐŒw¤¼s?ã¸N:G„GóR)qª›ªÿ»}íú?rbÞ žNkæ3¦„íÎ~á˜ýV—zYéƒ#‡œ¿ðØ?ÁÇ÷ëqš¼L’iyï§K‡,ܰ¢']œö·ÅÌH|0rÈù ÓvX( ¿ùPE‡þt‡äç¥V–aÀûûÍçubeÎWy"`Ú ‰ú(´rúÒ’‹Þ~³ÇyZ•ýE.ÆÀÉŸšÞñXÎ3ûmàçñöòþl¢ŸâLÉüãærÄÔ;÷â”-ÕNfÂ`‚E‚"Ú‰`ÂÛLØf­ÑbÀVÃÓã{÷êÕpé`Ñ®»:B*!˜`—Y !†aÉ5?#„ã"+;oVgS5ÅÔ~ØñbÏ^ . « v}%„˜/h‚1&Pý拸ê_5/ë(­öGÕÎÅM‰µ“;4‚n’6»»Ýn2™ÊÊÊŠ‹‹`È!7'ÆÒÒ²ÐЖe¡*¬ž£tzM¯[ÍuvÎù¢¢Ý»5pdmÞ¼™P\ZØ«Gžç _]UàXr‰¤GqœŸPm9g¨“„D¬‰Z‰S%[:P8ÜÁ«ö¹f¬)”xHÎÔš"|rO0CyB= úÜü‹aQWìûöíÓëõjµÚËËK£Ñ¨T*¥R)—Ëe2ÏóÇ9C}žÐhvGvÛ÷M”ò¼ã˜5³Õ\¦+&à8BœÁ˜!>¾f•f¸½Äh$`µ `/«ø-Ïûù6LÁþ‚ã „P(Y–ÖRÓ LÕS.€]o¹(ø´äø|ÑBXI·Ö^n)·ÚG󲼺»º—¹%õVD2ÖùÿéÒ* Ab¢…ônÁ=ºnEˆA¬Û'ö2ÙÔ¾é>¦Ñe³¸LB¯T';×Oq÷>lÃK¬›œi!ÚTcÌ4rŽ:P*•J¥Ò¥V½¦×­ï:2"ülVÖÕîò]Æ_ˆ‡8æîww©!b­Ì]œ Hí|`åº-´NrŒ©TØÐU´±Ïk,ž`2Z$Þh2"pZÆ)•*D@t(ϰC_FD‹‚Ýl¶Ò¦n¤æÀn%ˆ°oOéÖNìÞãVb¶^Îð´–š›ðd1.M·}Ñ-ô¡dk1D%ùÞãeÿ}ƒIO€XŒ?´}™ú&*]wÁfâäáRç¿Ì-[¥åøŽJÑê3ÌùvIˆ”êX(šn>OØŸv {·dDí(Z·À0ƒ¸ª~Nã P4Sž`· §úxûTí`8lžŒ1Æ¢(Š¢ˆ1DQ,..¶Z)Oh od”ØlÎèæÂòo·@5 ·Û¨9e´¢šS8÷ßÅ×m“;ù¿¡B¥EÆŸV¯v$;íâ«f¿‡;û¾Ø™å0®¬4ï-½Â-¡´üãíÜS)¾/%1`·ÚOë°H«™¢i{¹C}ÑD~ÌK' ŠVAîŸP=$N !Žñá˜à–Ç‘¨ •ñ[Ôë7®­&—0¼¨ö‚RõR…uçåŽÐ°™>š“ .Æm·.¬†·fת ×M¿£ÏÝå4´.]œ¹ÌňâfÂx>ïÞo»þ'X<~¨àÅt7æž‹§Î8VTßBÔó-œs¢ðÕ“EnM?)(š–-4‰þ2¥ÁÛ-›·n1|XÃ{»#.jµ‡ƒ#!KÇ E“ó>‡õoÈ“vp,„.ÛÑ©tåªp5¬cDHqse%lî ž-D/w˳é'E’„jªp“‹ö÷÷¿ÒÔ©;ºvUšføƒýCøæ $ Åÿ,˜·/dâô‘á7ÞrP,?°fõéÑc{ør¨¹¾äÕ­|ͬùšPhã®Nl«& ŽÍJ§)š O@ô”m Š[*\ó–BNnÖ‘“ìv;¸#Í'œ:R¥T»M{eÿAwàÏ?6%÷ß/¸Y¬M¸âÄÎ݇ûÞëz ^½gÌù'窒’£TWçÉ.\ÚµreúíïëáËÝü—´[øòÌÝíßøzJ¢âF‹xj¾Æ(«ycèàAWëŸý‚JË‹<¥­öOÀº_ÌøæoEÏ Ž‹UÙKs3Ï2^r q 1…Ê¢{ÈÝo>‘¬&¦’sþüåëçÒ ¿ùtbÅu-‡äFr››õ’’‘¯~<݉ôf–Õ

{΢'«Ê"¥ÿÎùbÉÞ¬üRƒ×„µé}ßÔIÃãT, îòl™óÕµù'T;'PñŒ¢éyÅ­L®™'pçIŽá8 Çy4·¨öOà|¢ІÃ[öç·í.c ¶Y½$¢ß”ûÚ{Ûów-_øõ›\ؼgº(…s¿üïÅŸ )ã}+†9·uÉœWfX¾™51FÝ;ÛvìLN`lé§ BéÁ㨠-²d§e‹‘$iêQc§ÆÊÔZ1Dkæ²ÿ½ºF1úÑW4¤ý2ûË7™Ð9Ov–º&cµí†OyñN­R,:´â›_>þ.îÇ7zjbºÿ¨o ” F¬d‡ÜT¶ãó_ys-î9vÚÄX¾ôä¶Ÿ3À#©jô—,%¢(:¾Ù²ÜW¯‰ÆséÇ‹BƽðL¼\açïK-Ò¾lÍ»_oWÜýÄ»)A\E‘!Ü[‚<7ŸjÊ g);ýñ8¹)7mÝ/_LÏÔÏþøH™ë1χkðO ç'P4Sžà8*¡úŸ ÃÒ / ŠÖ GÆkHÈs—ã Ž“xæ Õþ lÐÐÿM?óÖ·³ùï·”!#î=$9T^­WÇ÷Ð3QÎ@—À‚´víÈ™Ö)âØ¢ßÏÜýÅŒñqrõI޲>>ý—ŸÒG¿ÙCݦo<ûíÞ³Æþª²éň±g¤]°öðbóþ;a ¿££·Ã~l7ŠÏ§¯ýqGßq@Œ ®Îo3íÇiÃ$Ú–í{ô· YS:%¹ŠnŒ*¦G¿hã›ûïÓ›Ú{x9^[æÎ#@ý·¹uˆ:øÓÆ¢à±ß̘%c$æl?|Øs5êK‚­¦Zˆþ°§êõB‘]ûtO”¡î]Cо¸kGδ$(ªÀÊv]{vk¯f¡Ö¹Äõ›¯s©CR‘É©=åLÞ½˜ÇfüüÓñ‘3’y½Ç<[®Ö?Á5.*E3â ÿîÚ¼e뺚àœ$Pг‹oÝ·9ñéýw|æ¨.<õ±žìçË 9,Bþ×SF|㬠Œ±¬ØŒ“\SÚ‹Ò~Ÿ³lËsÅfFÁZ°¤ÒR­csµ±—¸ÏͦÊ̵yué$u|òìÖÛø/Y+M±çêuª ‘#¹4ÐÙ"Ò®wŒí¼ë‡×§íÇ=wì¯u íZ·ùÜ}¡óV•p[;ÙÚ³%ö䍨ËäÙÂp þ PsÚE³á Û¶¯ï‘Ò !„1&c,Úl¶uýEë‚âê m™õѦ§Þ#£L›¢yãZy‚ä²vGœDÂyrØ«u~b8epç!; sçO/Mÿù‹U½¿~(´–„X©D{Õ9µ®Ù"„Ö¿{ïÖï>Wfý;[ÛçÑÛ4W®K/"ٕ땜&­û¦Ñ?x6Ye=½ìý9‡|;öŠÕplXÀ KyöýGeUŸ†ä~^*¯¦sÿ|ëÿ–úM}åѶ¾øâºgí¬y™Ú=åVÈ …†4t^Òèî®zë°×à$¹©»L¾/òñeo¿Ž¼39Ti9}ÁàY0lì—Œ% ¬^÷â}áÞ¿âˆh?¹ýRzŽ+|•W£ø/ÛýËOÛûÙ³¶-ý%Ï÷Îç;{1È^¸wÝkϳYú'P´ž biY‰Á`€¬¬Âóñ|Ý5@…ÉS&Éä&“±þ.$ÑžûùÚò^ãÞx8ŸÝðíÂÏž%‘Ì誡Á)š)Äʼb›X¶îóå–>š(wöT\¼mÖ¢³v{@‘A DB·Í¡âõY‡Ó3ò ~=‡t¨Ëİ1ÿLFNžÑ·[ï/ªghd’×w~‚ÙbRÈ•nïZ¬Žñ¸`Uù'`‘ñRév­üqE™@¢n3ðÉ÷$AvOM/›øÁgйsþœ=³„øÅv›òÑ´{ãeÎÑËö‘8ûë²ýÂ¥1½‡E/üA:(Tz¹…ˆ‘'Ž{öŽ3–þðïÀ÷†´}ä³Oµsçoúù£Õ•¢LÓkrŸa‰IÀ€)÷þ;kÝܵ©ÝŸ3ó™’¯–-ýp›HTmÃT,@Úž=;ê“Ë>~Û*è>>±_RdÛÉîrc¥±ã>üJ³ðÇ5Ë>ZSaçd^~mûF)/wŠsã½d¬ër~Ùêu+<”gþûëêc¥VBd~ ©O½zOŒ!{C{#5üýëߊ±WDûûf>õp[%ƒÀê6Ï–9Ê®íühÀ‰yî uºNõiJv»Ýb±˜L&½^_QQa6›;vìxÅ®¹yóæx!ôô³ùøhm6 dg—-[º|ÇέuÊÔØø‰c##½túÙß,e˜:s¶›F*aÖmyöŽW 'ý¾tr¬ŒŠæ ëÉY÷M\*›¡ÓûË¿ìÏ!0ýbü¤5 3êû}¿úýd•£?^þå¬å»N’ÀÄ>ãž{~|§ªÐ)žnÙ²¾ûàê^s×¼ØNf8òõ´g÷yjñ¬ûcoг‚ë9k‚ U笙Íf£±êœµŠŠŠŠ µZÝ«W¯eCHÌYÎ]´£v³^jWµ§êõÐ"Îߨ|.¿Ûr<öÔ†äO=ÞF†j×q›g‹Ä¦-[nz´yóæœœœ˜˜˜­V+—ËiØÉ[ûöíÓëõjµÚËËK£Ñ¨T*¥R)—Ëe2ÏóÇqDzlýs6Ñ¤¤jŽèÒ)¹Îžã=ô•Qp{T&#‘WmASq惣¼©6–¢ùB¬,2˜É¯ÄÿúÖœUgSm#gHñßß­Ö¥<ý¢âûOÊ ƒ\ë™OOW™:yú§ (sýœ/ƼdÞÔxƒ<ߪ^Ø­9¿½þòR<æ›wïŽm5Íöü??útcqmE?mzÜá¬J3>q(×Ò?Xz™ÍìqÜ[faŒ vÚ;Òù£Ñ)å59(dJ…LymåÖø' O2 ª­ŠB ˺,F ò¤{¯õ`]æ÷zù#7Ô§úÏ/€êiÐ<~"º’ø{Ó^²Î?=$ôÔ"nëØóÃLÝob˜zDyj·–z~ÅMFãñ¡ÎiéGŠb-Ç¥· AD»x6»…5û¿ÏI˜úfoº—@Ñ|E$«®Ü¨ÃzNz¸ýøy >ðAEÖÊE4w,¹q1>RfA‹*Ófÿt.h¼÷¦$*Ô¿GŒeÜ”…sÒîû4U«÷xËÛ)Ol|ïëÏsR?˜ûdIk «v×Õ Éxί÷ƒãÅôŠàžÕtè· \›ÝÑõ Ú?‚¢uãjý¨3E3å ‚(òU,Ÿe™5k—Jÿ¯úØ5G¯Ý±c]X¸DAô¨ç#æ¬UoNûòBÿ·¿8NNeŠf,™ËŒ RJCº<6pÁô[rƒç¯*ìðØýIj!M†R“H.|¼ÐÚGáù–ãÔÓ’µo¾'ŽŸ÷â  i« ·¿öúð ª51öÓ?ü¾ù¨Ma‰k;.Fа>kן«vË.”þÑ݇"cÜR¶‚}«Wl:|®ÐÈk½l5¶ VœØò럻Oèí ïšyþO)/ZªãÙs7|ôån£B«•ÙJJ1Î?DIg™V5]–zM¯[ë5ÅÍ[|o²f Úû)((®4§(“î{yú])±*ÛmÈ}Â|YL€õí3alŸ(/x­ŠCH™p÷‹ÓïJ‰öS2v³#©:0!)LÉ"LdAÞRA_ZX¤gÕa]GM{°ƒ†FE¥     p `‹‚‚¢©! ¾cæ¬Q ŽÕ–,é‰Og‘jƒCN“0p‹ª BNÿ$ í9þù”qÕ¶X¯„^®~²úѨ‘Ï̼½æGæJØRPPPPPPž@AAAÑtðø¼®ò(Ø×ÍÁý“1ˆÚQPPPPP4Ô£…‚‚‚‚‚‚‚‚‚‚¢.è~Eó…N§ËÎζº LÑœ€1¶Ùlƒ¡¸¸8???::šÖ E“Ã1«Õjžç/ÞÏóÑÑÑÞÞuνA2ÏfVê+i[ÜXD„G·lžà8*¡úŸ ÃÒ€\W»ÈuK醀z´ž`6›ËËËssså 9NAAÑ,À0lÕ_ãHa™õðáÃZ­¶ÎØÏ8“Ô¥s:ß@ 'NŸ(.)ö÷óo©<áß]›·l]GˆXýMž5â®]zÐõƒ‚‚¢ ; ׌„¸„øøøððpooo…BÑêZ‡ÌZRZâvº6 ÁAÁ‚  ´9nûCL|lüñÇý|ý[¨n,ž°mûú)½BcB0Æ¢Íf[÷ׯAáaQ´)(œÀºô•¿ü§=yp(=íËý"DÕCµ€fRýGkƒ‚¢™@Ä¢]´Û»]´Û[cð„j™µÎ¹½®s8&˜¶Å›³EÓX<Ájµb,æœ?SÕK@£ÑF„Gþ0÷AªžB@ˆ„— |çm©Cè>Å­¡tï¯KW÷êûРžO<¢%4qpB›Œ‚¢9ÍŸÄ1(h™•ª¡ioR9ÅDA4™ŒŽY\T‘•Uˆ1®¢ ÎÏc&))Êß_ó׆U}û ®ËÄòËgÿ°jGzž‘U‡uþÈ«‹VÜêú]/yåÔàÏ–½ÓKëiÞvvá”q?ÂsËL—Pa³‰¾nû[Sgn-0ÀHµ¡íS†Nx|b¿)º²€E«ïò+ ­ –ÁíÍÍlú¬ƒ&Y Ð)¼QÆÍA,-+1Œ•U¸`Þ"žçë># “§L’É#L&£›N„Q϶½ó™"½Ì§×}³àÝUq?O“3·²,VæÛIJuŸ/Ÿ°ôÑĪºÀÅÛf-:k·B$T+ÝD°éróM‘“>©›JÐfX³xþ ‡JçÿúRgCÛäzPê×"V­šY¼ÉvÁ~ôØÑ2]maŠ&GB\BdxäµHðÄå¯1Vr]PÜð:o<Án /ÚlÀXäy~Çέuˆì þÃ0Æåeåv»à& Æ+åÑWº;vzÇÿÝýiú3ÄÉoé¾!Täé@ ¹¸|ö®»¿ìÏ!0_:w R€¾Ø(ˆ¥»æ|òýÖ£Ù¢îñ¿…_¡» 7E¢ðŠíÒ¥³–AÐ#µ—OæÐ·ì/´uRÊÑ^þå¬å»N’ÀÄ>ãž{~|'ïê¡ò}ßÓ»Û v¦á·ê޷Gâyqt”ÌÓÓ¢!+ýhFç“:šô«+ëš;C³â 2…”e¤â*+ÊöÊK¥N>‹«ÿ»}íú?<}1£KìšØ±[gõù‘-þûñ¾÷…ÜÂ’€h*3\+c‘¦ÛÃ÷†M\òå·ê]hÀ—ƒ‚%\‰·L%‘ΤM eH|›x-ƒÚ'w‹(¿ç‰µ¿˜6•€«Ôc;ØE‚Xjtäi"‹¹Û~XìýÒ”^N !cŒ†ÚiÚfj}Î 7DÊ¡ hB¾ê´tÙVhs}ü„ˆØj f›(r€1¤A $®<0û½_3‚FÏ|¦o€gsg¥†Ý"ºÝ_¾·ü|­ó "˜ùB7^ëëçï%c.SÄå™zŸp™×hZåE£ù1Ûì÷Œ åyÇ1kf«¹LW" 6Lœ{gÆññ 0›,—É !ÀHx‹€oíÉ›uf"SI5zJ×%37GLy'Yà $UñÄPb¤<¡©áÜŒ:+‘id² vÑüOé{ó,íâžÃz>ªm¡Ú6wÄ”ù÷Q“¬Mb=LÁes ¤C¼b½2WÍû+púÑ „œ?:¦`"í\ôÃ_%Â)ýÛ¤Ž;¤‹ë­\¶áxAi¥E©_|JÿLƇNåé‘&¸Ý€{ÇÞîÜŸ*ÏìX½zçé\=ãÑqؽwô “3´ÎZ£Ýå Íe2¼¢Ðèc]Ip¿õ&Øf f;ÁcÑ“Š­„‚=[OÛ%p~ûö‹Ýï‹–yо‘ª¥¥~¶îoŒqÀÀÉwÇ+œBŒ“ÂtaˋbŸ˜•¬¦4ÁUk‚j©PïGÆhg/^²<ü¹;kYpÑ—!¤Šî1j|ªZŽËOïX±iéʰWn§b°9?#»ÜÈ„±’Ês;þø{E¦O—aC& “UÛüǚڍWîŽä²_ÜüÃwÿÊúŽžx—åô–•¿ÎA~¯ÝG½Ê¯F‚iÜ-¬;ºnÍ!¯¡ão ®{„¹PüÏ‚yûB&N~#†ÑÓd)š… "èÚfÓ—N®r¯wóü­òì‚HJ™ÄbŒ&`"åØg>ûÛ1ã3†õŒ•íÖ‹šX²¶î,‹ºsr§ó6l>5|j'Mµá¿ ;¶iÕúýgòõœOxUÖL—¹åª«RÅÄŪk< Øóÿúø‹}IO½1&‚Gȃ¾‰ÔÔ4 ¬ëãfÍ'v!ãôQo§rÕi~Í`Œ1EQEŒ± Šbqq±Íju'ë On\ûSŽN¹ox»á/Í6:ú‰­+ÈT¼C»©HûÆ›Ä X^)…K¥ü©DÓD¬[Ào[ðÂS X…—x‡;_{nâ˜ÎA›©ßÎQ~ñåïŸM/" =Ÿ™ýÂDÇù¬*¾[¿zý³ÀiÃÛö{mþ“cnñcBÜ,t¤Fd#ÀhÚß5yà·_/ÿ->ì‘Þªê Bd!m;;ÂFxž•v¦Ôž¤ä !„HƒâÚ&DIQŒoÙÑ·tO힤`P´ôìá§3J…ˆ Îtæ¯%‘w½:º‡7‡ Ú[wü£í{sGÆÆËèW¦oÒf‚ ;°fÅÆäô ‚:tWœØ¹ûpß{1!pã˜öMÚOÀæü“ÇóTm»F)Ù›Ÿœ¢…L†×*¤7r\Ô+ú'ÀUñ„ÜÞíÃxžEN–9•³Õfztˆ”ðŽX-`²Ø6ì>3¢w”;·f¢?±ãi7)9&»í¦Å;–µëçP4ë¹5ßÎÛEÚ ¹kh˜¤òÜÍçAæ\><ߪ­«BDŒ±cU@ˆa62XtÕ{Ò7ñ¤fFiHYÍD²i¤|'Nœ²lÙBƒÁõµ:Õì„R©œ0a S¯ŸžÏ}™òlÕ“1ˆ¹åU¬ª>ßíÜEÖIb‘k•È»¿»éaÄ<ñûÎÇCÜo*Ÿï­Üó®ëôYÓkçÛmâÿ-ïèЈaªšŽ òÚ÷ƒ^¥ýrkLº¨jî :qdÖ׫~Þ5)Èy‹€P~rÇš-ûOçUØ)cÜцkt4Ž NN¨»Á ^ ‚½EÄ„”_(´‰%¿}øÒï¨j>Ç|¹U$2޶Ä%˜kó•/ý1}Ú÷Yõ# ÅM_üÙH·{È“ËY7 òxÛ^zhõ’_·;s¡ÌÂ*ã» ¼ÿ‘ )WïRoÉúéÝ÷3ïþú»ŵÌÜ×™œ¢ÙãŠâø›WÅDnÓ¶Û› î?}Éáu† vl$›°?ãƒC  QJmžÜšÅÒgÉ»<+g¤ }»*øw_A¯‘a<¢?½qŸÎwðô‡††ð @‚wÁÌLB€lðx‹Ô&=óË[¯üêüÅ«÷ô×FG±Pcÿjô oŠ"ÕëXƒÊjŒÎÐ|x¨QwqWCå+†q–1 U‹Ô«–mÀ½Ë=FÑ4Í€<ܦýŠRZ=…!@€ ì7vÔÉYkÙ5LêTñ¡x×ü…[,]FM¸#RMŠö.ýí@‡³S¯¬„E`wè~€°Dp,‚Ò¤û¦ŽŠ”V«.x­’¥o"LWÛ6\Ue1¾}žy7L/ØrV}öÃéöO¾xG¸!V£i±/#åsæÒ×fürVÖfð°ïŠðùöÎ;>Š¢ãÏìîíõ»´Ko¤‡j(Az*‘ê‹ (¢‚l¨ (¢ )"M©RéMé „PBéÉåêîÌûÇ]’K%@‚ Ì÷Ã'!;[gvgžßÌ<ó@ÍÔmKÁؾÈǃÝåÃN©JüÜJ&ü'~Ì÷»ºBäßäl•Bjïed¶Š&«(ç9)ÏÚ:ÒBVQdlyRæäÂS]ZöáïçrøèѤýCäHÌM¾kU†‡¹:6ZŸ*I*ý¤žÇõµOG•h¼9Tš‚€PA(VkUºÖý´ŒuO' „XjªR(”êÕ E+`B`Üš éu~ÎÏ;L˜x „XÒ®¦Š^½;ÅEº²HTÜPÀBéû;ÌT"…cÁ˜0jk¹“Jœ›¹ËÆu¨éUEcúA $qm¨0ÉHá†gd£Æ‘2 ¤lù๕§R ¢DãÛ¸ÇØÉCšõÒçþ½ôµÑׯÞbº=ÿòsq:¾¬¤°fŸúuñâÍ's]xüЗÆ>¬dòÿžûúçÿ6ygÞ¸(UÕ:Þ+|(bºüÓüŸ®ºôøhÖØ!xªcw‚ó.lYºä·—ï‚.´iï1c{××°@ÌØ¿hþêã7Ó² ¬H¡ m6ðű݂•,!´rbïU¢§®˜ÕZžºuÖôÕ§ï0§öiÔcÔ¤A\m9€õ—¶.]ºåä¿w mh¯wÞXæðV’ä=Ëü´ÿR†™Hu-ƾ?­«O‡j ©©·:بQ“zAAŽ]¥×¯]û矓-[¶òöñuÜ~0ÿ„÷c&PyœµûÇèØØ{÷ñdA´uޞ㞊‹8w=C¥Þ¼–d0™mÏÄ2èéVÁPÎÚAæ¤C'2ļŸ¿»ÓÍHÄD¿ÿÚÓõ"•,`(t|#EPYRI¡ só P3EoÑ|$ @Ëô7!ÞIÉB~Q?©ÒµîQ¬u['P(Jõë„Â¥ã Û;ƹi¿gNÏÝxU´mã\ü\à»Ëê¤9wMÅ,8Hí?R$R…wkå²àÀÊå¨c‹©5/ÃàÑ´¹Ÿ‚Ƽ«²N€XÝÜn%þ²ÿ—uŠê6fJo'¥x÷Ÿ ~úlaÈ÷ï¶°GŒÒ†ƒ^êj¾²wÍO¾iþ|áøHEÉÙ«æ„5oMݬè5nêxý‰Ÿ¾™?ƒñYüR «Åb±âû}´r .ý²3EÒôÍAÑv‘Pø„ËõµÓ§þ¤o:hô;AèúÞ5K¦Í0Ο5$HŠÄ‚ë§.¦{ ˜ôRˆ\Ÿ|xà ßg}½Ø!@×ã·:yðÉ=å¶~çç_íá¬ÄwOmúví‹‚Nm®e‘õƆo¬ÎŽí?|j}WÈÍU»Kl™îx¸˜òë§_ï“÷7£™'—›¦÷ÓrTðÖ&BƒáС„"©pýڵÇbŒÔ.-ôàñjT' „*/¸_£¶[sß.M}Šþœ4oŸB&‘Jyžç Œ¦¯_ïX4§Ú6K·ô˜³éúÓùºöÏ‰ÖØw$yg~ZyàЕü°“¿·ïê…;æ  bß7 \ÅI~ÌcÚ€ŠÛ¨âf„0wÖr'\š{È$ ! "&„°U¹Ví€ê …RË-Ð~ÌEjÁ^›2NÍúv=ñÅVÛ\Î=~D¿œ{wÿø·8¹S€›9/@Ñ|‰öÓáœ|@÷ñãU[·ŸØ³æ€KU^õŸŽjê'g¨yUUP}!UP\Û w½µ®3iÖ8­M'¸¶úü3rµnŠÇ¿úëÚ3Cßkáäx?ù§—oºþÂ÷/tu— ˆòÈ::nýŽÄ111MÞ\¶žÀ}¸oUd]‰¹7oˆG”¯Š)c©èϬü9É­Ïg¯ ’3¨E¬¿yÂÔ «Ïôx§©†`BˆÜ?¦E“pjãy÷ÔÔ£ûn˜¢ë9ûÕó• ›ÚE`Óø@€¨0—[^Û{接©Zj8³bÃu·Þ³¦ ¶¯x€Kn¾™ž‹±Í×W1 6ýBßÔZƒ»»GËV­>tøðA¤^½ 7®9|cÜ¢e+wwRÅ…0z°él5=žpÏe”î«NÀLD,\Ø»#bŽc%¼„ç9ÀX°Z°ÍGA,aE†”tp%‰G.=»4 õ/önò’5÷øsçá‹yÑqÎ!ÝÛ{|±gù÷¸s|„NfNJ36ò “ý˜KôY•d¶V… Ux×Ö. ö¯X†:¶ u•ZrÓ ÍâüH欀܄ӗÒÜxTáZ•f:‚:¾Þ…B¡T—Z\!"mÜ„šÃ:t­±n­^þ¸ [dG©Wó¾/7ïSX…#„XÏno~ÔEŒšõ)0 €õèüúG‹Îɨ‚ÛœÐÖ¾+BˆAa€ášsų ª'»¬wOlX¼f÷ÉkéFFÁš°$ÏT¦(„¹Ô·y¤rí¿ ÖZkÁšq9É$ÜþjL÷ö×c,K7bPp÷é„1.׺"X$ƒÊ_–ôošUÑM<í3¬¥ÞM£/^¾ki¢b]êïäŠöÜÍ&ö é'~]º~ï©ë™&FΚ0—g ±¤_ºiRE5ñ’"TJÊ8Î=ýlÌá¥ïM¸ÖæéÞ½ºÅ‡hi´òÚF``=BÈÑ#‡>t7--11‘×¢ePP0”ãšõV~ û1WË>Eï®U°Z,Q !"1ÁÇIyŽ—ð ×çsg›ÜÎó¼D")qrœùà‹g×(gÖa2ãÚ°‰çöíÏe5iãæÕiÜÕŽmö®>X€Y^éÐÀKŠ€xW˜%…BñB `ŸSdïoÚq|϶þ¦¨îÑÍýäœSl§Î¬?ºåpƒð>þ^÷¾V… @l‰[ª(J-·?KÕ‡ S¦EÈqBà8Ý·h;ã0B˜ÃեΉŸ‚vÂV±u¯Þáë­ßÞûp¾íØ7ÇÕwÅÉ[?›{ ";^Ä,Sª{ dÍ'}<.¢häÉÝÄV®¨–Q{{Jй˷¢Wrf!ÛM‰B«g8þ—á%€Œm݈„9Ó€²õãO×´y~òÈpg’²ó‹¯Á„QÄ€•4Ë¿^Ó6>õÇo¿nþâÍ[ðÁ€`ºR-” @àèÑÃW¯&@\\ù"áÁu¢Ù€ÿUÄÀûºn‘ã5ÆXÄ¢ÅlAAtRËÍf+Ã2&“Y&–a†!Pæ¡*vì m½@Û‘kü”Y­€a`-û½Ô¢h0¤„ι„øK6]ü'Õ$CÖÔ“ $>!®,±ÐÅPüñ*)³‚ˆ9€éÖ¹bÀ˜›zpHT¨á0!€ çäÍþvñŸÛæÈ Y±_DéÃ…oããcÛ¶þnÊŒ­;¯öx1š …Ú(BÉÉI¾¾~MQÇ?ÀT“R&©™„P%±ï«ïÀ>P å%œDQ›‡k~ÙrP1Ã2ÍCÕœ„•IeË!±,‹*}rÛr™+Ú6CñPs‰þ$‡ý+Iªìü¶Þ§ ÏC{µªr÷ê>«ë:aÿÁ]»÷l%D,z& Ï÷ì>¨q£8D‡§P(÷e¥Ñy?µ\¼*gõ”ïá?múñ7u‡(_yzJA‰Ô‚¤ÓÇþ6Ê)'·¬Ú”øü U V婌SHöiíß|dOÏW6}4ƒÚ3ÖSfÎHÉ èòt„ºàŸj[ï †Œkêó5S§^}¦S³Po'FŸvýJª÷3£Ú6ÖËçµ_>Ÿ+Ü)nì[ûsª÷³“¨Šm&R¼Ú–m€u¬Çoùkæðn$K¯kÖZê?o]·CÙ6Â[–‘b(ü4±C»{LýuÖ§øÙN‘:©)ÛèÛ2Þ¯ôáñ.—wŸÆ¾þ.rëݳIXá¬`èèX-Åß?ÀÏÏßfŒ|˜ IDATUTD6ÕÄÞ7ØV¼ŠŸA $ˆBå7q'äa ‹YŒq§¦¾­£Ä ™L¦+¤R©}â!T–c”Z­öþ±-®yK„ÆØ6|d±X¶n_ëîîéçHóB)˜ydÝÚó~GÅ—‰,UIÒ“¡P¨åTÍs ù€~3&fÌ_³úÓ½ Q¹×÷U±€UÖ‹t=²á“&Q¢õk9qÞÈîõä °îíÇ<»îÖï¶Ä7{)²þèÏç8}·ô÷gmÊeNA-G·î¡‚QÉ}½"ŒS“—ç}½výŽ[mÉA¢õkÞSˆ$pàôä+~رäãLp©3üý‘½‚¤¨¸kµäj[„¤i:ê…._þ¸qÞ,‹Ì­Ñ€Ö={¼ñBÆ·×ÏýË¥[¸—" öÁ‡š+w¯ý|S‘y´ÕÂ_Wêð&WoÜq1ÓL@ê7vò3þjQÕöºîÿƒPxqÖð=´Ê}BaËd2–cÕ‚ŠA€XŽ•pÄ 1UÉ´Ç•GÙ&–vŸ·U]¢(Z­V“Éd0òóósssFcÆ ï9°k×®Aƒ!„¦½3¾UËø7¯ž4' èjb‚ ÅOJˆ„—tîÔû©øÎtœòDc:÷q¿ñ'ú®Z;&HÆT9éQµ^E5ƒ ‚ X,“Éd4 ôz}^^^nnnnn®Z­nÙ²e5~ËG §•Cícl2™rsro§Þ¾~ýztýè.]ºÜoÁ,bRIÞ‰µ°½(ŠUN0.osá1¸øÄ!ðBŒÍcl ïY•[Úýçîø–ñVÁZémcŽ“Œíç.ººmzrñ,’â XÄ…Ë/l÷/p¸Yâàxãp×¶yK%v.u8g_© ÔEl–ñå„ËcWñËÚµk×ÙsgëÕóöövÒ:É䲚˜þÍ0 t3éf~n~‹-JÝÛ±“ÇbÄX˃k'âè|† ÔD'óe!t3ùfdXdsãèÑ£ùùùjµZ«Õj4•J¥T*år¹L&ãyžã8Žãló¸ìŽ…ÔÔx‚(ˆC­hÓïæ&&¦aŒ %ƒ]Ñ2 ¨Ói¶ïø¥MëN?ª5õ÷F~°Wõ¿׌”>Ù¯GþÁ)ß¼Ôéó5´trpœ³\]>fÈ÷ðʺeÃü$´-ø/¬¤œýï}í¯Ðë¿xÆÃÞéo¾²xð¨5ÚWV7À¯*áÁ…±%QÕ“ÿ>6 ÓŽêB1÷?xy• YŽƒî7„yɰçåÇ÷ýÞ^˜¨„ã{ —zTž?|I/zäàEïp±~Bå:åCÉ™Íå^úñéXBodàAüX†e–c8–e9–«!7Ñ”Û)î:w}žþ¿ {Ô ¥…}• "ñ#¸VMéA3³2ôúHLL[¶äžçKï# £ÇŒ”Éý †‚ŠÃpöáùã?9’o˜Vrb^JºEÌÚúźa«ÇEؗΜ¾wîW­V÷»z í4ú/Ô½S«ñãbþ˜óͪ í_k¨fàŒ= ×Þô°¢‡•nƒÙd¦™PŒŒM&“Ùl¶X,V«õqjÈÿ«Ub(”²‚´°ËµªÜN»8T`,P«Õ¼”¯@ÀÏ×O离–x­¢/ˆöõÔˆEè°VPÝÓ V«v'Íb1Æ"Ïóûì)UÕvl×cœ•mµVèþb½µåÝ4~û]þ«·NPc „Ü”¸k’×}s°ß¼N¶ÙêÆó«¿;Š<Ÿ^ ˆ™ÏþvÏÙ멹&¢Ž{kùW½¼©©Zãß’w÷7ž[?tå×[.â/1œ]ùõ1Y÷/†E*Ĥ oLX|ü¶^äœâúMzwt wÛƒ%í¯¥sn=™˜ÅyFA6a‹>‘ “¬77L+ÿl)a!aôíª:Áh4feeq g2˜§‰vP å?…† Rù¸²D„F„……ùùù¹¸¸Èår–ekèöè\ GZ)…u«»:AÄÌŒŒÂJ QL“Rd{«òóô¢P$²\[5ý›ôÞsgµaM_ óîêIÐè7C×¾·ø—«ñãÂå Iÿsᦜæ¦(¾¥Äœ3{^sñÎäX'¬gÂÜhxG‚4lØ›·½¼pÞÞošý‹>~ú„æN".1½'Îä¢S¯ž½lÆœˆõ³Ú8³`8½`ü” 8~ÔäqaÒô³Û—^¥ý›©8 ØòÏöX1mêD•Øú8IZÄ”ÿÞ4$@îsb*Ãpç˜Ð¨Úë[LpÍ©¾G£RrtëÔ™¿Å’Ëfµª3B ØÁ³¹¤JX7s…åÙoFDªØ+ôµ æœl£öm1òùè¡K–ÿ=è“ÖŠÄŸ8©yfY‡€+ð™,£N ¢ iÕ¾U´‚¡FÖ£ƒQżøv½¯Î}ë}·ó)¦Íiï.AHÚ¦s(Dë’vØrò¶9ÞI–{dñ¦;>£V|26DÎ hᕸãÄI€s*L`Ê=›‚2…R3ØfzP+‡ò_Û†€1æ¸:W©Pæäåh5ZZ€Õ‹Í'äØw5æŸ Š|¡¯Ë2›·¬ùçÔ±¢°k¶ wß¾­¾~±¬w&NßûÅÊìnŸ ŽT0ÈB_ [¦³ @¨”z7ú_‡e¯.Û}+Âké/i þ70R-œP€>Ó ")îF áQ+m³ßît`Êîä“gõðâëC+ç-Ûz$!ÍÀ(9£(É5aëÝK7­NÍ›ûÈ[hÆbÃJ’*:…B© 4jMFV†«³+Í Êε×|½}ëV³ž˜p+å]ݺ:)ô y—ª) SHYÖ> à©âòr³:´íÂK¥ö51pÑo,X­[¶ýZfšÎ<òËѼTñÅ®l=¬¢ßkwzöι­µOl@IÑe¹“ŒEš¦Ï?ë;|åü¯ÕQûù½$\†³ z‘~?ÿ-¬KÓn‘ìî;mã<í*áæú)S—æw~åÃI u䯯éîµk –Q(w¹â¤ ÏF¡üç-×ãØãÞ(¦ÑÙóg¯%Ò>Êþ}…‡z{y×­Û–p’ȰHZ|ÕÎ#«‘jÌÙbí?x˜”çmaÖŒfcVN†(X0Œ±}–&@ˆ‹«»Ñ`*k(¹´{}”ɾø³åÚò×Þ;Õñӹéžä¨óؘc$2•ð½Æ4^9}Gºÿ˜šh„¤*žè3 ¨N¨_¯ý§íM5%HB§Œëû”·‰š-úx¨züÊ¿\74ŠV•üà+Iªèl ¥&à%|“Ø&4(O”iHo›Rã:ÁP`’HøCB!J¥ mC Ø&‡ˆ"«Ñh.ÛÅj|‚Ô…[-V ’»ùy*Ø'¹¸°)×…”A®ýËãû¬Ëi×·ž”AœRÁ˜srÍtm-Cê탖­]²AÓ-Æ_™–¤·¿ìHÓ|ÂsAC–¾þ*7°…¿ÊxáºÞîô_IREg{ÈË˽™tÓb5—kÌùûÖôXbLØ0ÿ›]ý'¿Ô͇§m5Î( …ê„A° —ÿ=ëâìRèaÏØ~bŒ1EQEŒ± ŠbzzºÅl¾WíŒì?žðú›õf©lóY@1øÝ¤0ô'Ë+¥p'S/€Ž6jµ ¾ÞÐϦÞýdé’wv˜‰Ú³¡¿š…^¸Üiá—ë–¾»>×ÊÊœ=tQsU’ÄUx¶ÇŸ›I7ë©”ª²Iúë7®GG5¨Q“N̹|òrŽgK*èêÃÓïŒB¡P(T'<ÇY³f¹^ï@­l¬J¥R9lؘ{Äþ†¿¶éÀdİOxˬj½ðÀA°ö|(lSÞì£ßO†a@ЋŒG ËPKæ¿(¥V_=LPa)£í3mi¯©˜±‰;Ä:5|ö­%ýŠ>ˆ¢”Š“P…g{ì±XÍ*¥ª\% R©Ëg¨æêÒ³Ý c¬Çs|Ú4r¢]Ì …B¡:áéÙ³_÷î}ª¸3Ã0÷êD ËÒÒª<ÒhvÕ®RBB ºÏ$D‹÷±¦ì\¶òÏKÉ©9&dnAžjæ”|ôÐé¤<ÖÉ?¦ËÐQ]CÕ b¸´öËůeˆDªñ iÑgXŸ–Þ2dº¾yÕÖÌ*CDƒ1Y;—­úórrz¶ÑL$Z f½†nå-§‚B¡P(T'ÜÃRBˆ¥¶ …B©UYçO&$›E‚$,)¸›xè—D @€9óÆÑµ_‚׬ 1j± ¿“nb•J‰1?ûÖù ¿”zÔ'cLlAƒ„¬ó'¯$›E‚xLÙ©—v7»~::œ* …B)¬tE!ájB^~ÍŠêÅßÏßËëë …B© .\<ÿÏ©¿Áaò¢F£íõLUG/ !êöo}6Jwú³7—\´âzÏÏy/ÞúûÓצèϽeЉP€4|Ôç+F yzCÖñ¯gn¼žzúJn¯Uù§˜µåƒ÷6¦d?œ44œöšQ(J¶ º4ª <š!ª( ÅqÉeœŸ’R€ ñmÓ§[[Oáßó?ïM6Týp …B¡”” t0¡òôÑPƒ:Á*¡èO†aï±ø)…B¡T /á ô*•ºl’^ŸÏK¤ÕtF¤…¤ì[ëÞvÄ×É’dÄ´‰£P(”·hiZg¥WMé„ýwíÞ³•±è$<ß³û ÆâhlK …òøû^¿qÍbµ”'!¤þ~þÕU·HCN.®ÜvBÈõ»OÞþýÄ-«(r Ó¥™o—¦ÞOtñeWMéQ †Û÷~7711 c\(ìOÈ0Ldd N§Ù¾ã—6­;•-r|wóó}ç\ 'ëž]±îÕhCJ-§àÄ;Ý^¹:|ÕÊqARú¾R(•CG(OoÚšL¦ºgÓòðã ;OÜÐ!‚ç˜ätýÎc×:5öªNW1ÿÒ_ûnèžê­eQ•“þË7©îû1 ‚˜™•¡×@bbÚ²%?ð<_zQ=f¤Lîo0”ûÄ¢1×@ÜÌœÑÝS‚¹.XF.J¨±(bLGZ)”*[4(ÿ{Äö¶§g¦çæç:L¯¨ØJc9­F«sÕÕÝîójÑ ‚(2,\NΖò¬Ù*R­•†qzïŸWZ5í¥aªžô`sÆÄ»² oó@/SÝÖ V«v'Íb1Æ"Ïóûì)U¨ÛuÅgge[­å*ØUÀ¸FÇDG»ÙT—¦Ô9¬77L›°øøm½È9Äõ›ôîèî1m×ç,:x55]oF*Ïúñ£Þ˜Ü/\Í"kæñ5óæ­?t%‹õˆê0æ‰}ÂÔ,}ó)T'P(Y‚(tl×Q£ÖÜÓ¬ÉËÏ;zühzfº»›{Ý•Goԛ͢ÞhE0&@€T©]Äy'¿™¹ö²g¯éÛ¸KPeb¦ã»tÎÜ÷ŧ¿¤” á7ø½ ­¹ª6×–[Û–,Kn÷úTOÏèduf Î;ÊÌÈ(|€F1MJ€íóÈÏÓ‹‚X¾ÀÓß-@«^oqu’Ñ%U)uÖ%¦÷ă\”bêñÕ³—͘±~VgVÔ'?}Çwôô7#ù×÷®\ôéd.`ý´fjË¿K'¾´N1ð•^óÔY>çãÉŒßÚ7ši¨R P@¡Ôõ '/§cÛŽNZ§ª¡Õh[4k±gßžº=¤ðÐBl± z£•`‚±H ŠU†zhÏ¿V ÜüãäfêU4)…š«eO[& izAW ©û~Üt#¸ßðÖîB¬ÂGÅT½.#c@ VW5§RÒ²?uæoQ,1nÐþ©Î(à †ÞˆÕ€4Ò‹éþHëµ{nòkϵ®D R(µFÚ¦s(Dë’vØrò¶9ÞI”Aqm[E)˜VÍ}ï}á߯›Ôû盟’£^]÷j// ‚ïŒýWnº<¡iSL£P@¡<‚ Ñhª¾¿V«­Ê ¥Ú,àßuòöž“)VA$€ ¥Lb2  `"娉Ÿÿi[”AеE`Ïøzå'&¦Ä=³{Ž9¹dÇ®KÝÆÆ÷¹ 9ç~ÿeÛñ+·ó9?OÐ g3U’À:ùk,ÒÓº„†J !ïòîM›ü{+ŸqöoØåÙgZúJõg~œµ2©Ñ‹“û‡(!mÏWówkž:²± ¸³uökÛ„<ÿÁ„XEÕ»ÄyD6Aù'ˆ"ÏØ—gYfó–5ÿœ:VvÍ–ÙûömõõÓ€(ˆPN#§§>úíwB,Y G·|ýé’WßäÖ.~.XJí%JÂzçÐÊy˶IH30JÎ(JrMƒ•¶euÌ+Ì6§æŠ–´ ×Í­Y϶øÌþ­`Ëï0¨èˆ…ê åñà‰šEý`ëí:y«U´/ϳ€‚ ÜHÍÓÍ«× @Â3@L–‡®toXž[3É¿°ï ‰Ù$Èß¹þï+öýÕVÇ! æk›¿^rDuîÓÅW’wíä®› ³yR@ÅIEÖ¤]‹î—µé5¼‹éßÝ?¯[ŒtÓú…D?Ó¿þ+ÖüûzÕ±uÛïÑÀ‰"pŽ12ÎE‚ÔUŠjåÀBMé™BʲöBóTqy¹YÚvá¥R›; ÁE¿±`µnÙökù“Âòr]D»‘‘ÓÝÞþýpÚà`žV1”Ú0  Ü\?eêÒüί|8©¡ŽÜØ8ýýå¶œL¢ ²Vo}ùj´¢hýM…‡ GÅ1åñþb.·;RWÒ÷/[vÌ{è¤~RZ°O|/ÀtX-‚Eÿ{c›NÀ„d@ÂñËw„!Ð(¥–ŠÜšÅÌ“&Êý/XÎHÃÚ4V.Ú4µe_ÉÿwçÑ×N¯ŽèâÍ3aΩ'B°¾Â¤ ¦$MÕíû2úLíçÌ!¨çœs~ÖGnõÕÄôë=û§U?å—ÒBLnìÂA¡Ï¯Ñùz{pÈ) ª¹„Õyÿ«ÅÚð0)ÏÛ¬ÍÆ¬œ Q°`c[(9Œ ââên4˜î©¼`ÁEK¤R(µ¹…̺–jµ—†3]>‘ „N×÷)o 5!ZôG¥GJtáþœéZ"òî¬DObÏ創$h&Ô1,×V¼ñþ¡è·ç W€éöÅó)ªú ã–‹9ö:ݦ/ƘÐu «FNNqrr~ ¿îûÿ¾"ÿ&g«ö9$Ù*š¬¢œç¤³>­.´1 ÿ¼?|fúóßÌïåIÝÔbÚæÉ/.NÄe–v ™ôýDWO/oW9@L‰«>ú8¡ßW ý #Gh>Þ›ôŒôœœlBˆÅju×¹?^Ÿ÷ƒ¬wÔ±±÷îãÉ‚(غòyŽ{*.âÜõ •BzóZ’Ád¶½c,ƒžn å,dN:t"CÌÛñù»;í龜‰~ÿµ§ëE* XÀ6 ŠB{b%•©·Šê/‚EFÛ3@Z8 ñNJ°!åjª•œrê|v³¶: *:šàÈœsù¨]:A° —ÿ=ëâìbŸÛOŒ1Æ¢(Š¢ˆ1DQLOO·˜Í圛2®X½jÉ]á¼#ÚNüvü³!4~¥v‚EÆÕ9{ç3×Â=8nì‚)ÏøòÕúÙÔ»Ÿ,]òÎ3"Q{6ôW³•HÑðåï¹Ìÿzó’éër™KhÛ íŸ‰Ö²4‹ëº½•ulýÚS}Ç´÷*mæâÜs»v]õèÔ+Öù‰Õƒ%ÚZsË—ßóά7÷ýå¨ÿ½ÖÝ—GˆU×sõsyããnˆalöÆÄ±tH¡}H ¬j"!;;ÛÉI €rrràq’ fÔvkîÛ¥©OÑŸ“æíSÈ$R)Ïó\ÑôõëÙB{1•é_'¦ëNçëÚ??$ZS¨]óÎü´òÀ¡+ùa1'nßÕ wÌAþ2@ň€p'•yG@;k¹“ .Í=dÓõ·ütZÞé¥ç$¿-ÞºöpÄø6F¢àÁ”ofkñ¬ËšÒ ÇY³f¹^ï@ •Û"(•ÊaÃÆ0e=P¤AÃf.R¸'BŒíU Pj#Œ*²ÿ[KúN#Eï+à `¡}¦-í5µ¸Ùµ¥ðA/n801¶š9w^z¨#Øþ’¸6{îƒåÊ^}†¥ê¸–cMÚðñ‡Oxopˆ¼¢Z ç%œ8y±ÙÓ"I©&AH?±cç…v­zÄ:׬$¦´„Ëw¡ |(¬}ÒþÙºÞsÌÄ‡Ñ ®Q®g¸Úï‹‘‘*¦ÐÁÏÞ=-¤l™5}õé;Ì©}õ5iP#W˜±ÑüÕÇn¤e¬ ÷lØ©o æÔî¿þ¾žƒœ›÷?ñ™P{,köéMK–nù;1‡Õ…µüâÈ.AJ:hW®‘àí `’äá¦GxLl„̶´ËÍUÿ›²»ÉÇß “I+'ö^… zêŠYÍ08X© ôâÈ®4à ÉÈLÏÉÉvrÒêÜÜmæeNNB s{L¤Âø1cŒ &" ¶KDÌq¬„—ð< V ¶ù(0ˆ%¬È’f$)H ¦æG¥F÷Ù«SJ'Æûé·^p{÷³Ù Bæ¼ïƑ¦šH[¿óó¯öpVâ»§6}»ö‹EÁ §6ײbÁõSÓ½Nž&;°é»_¿9ëñÔA“‡(²®ý~élçˆ/„Éd¾ºvÆ;¿É{Žž2ÖÃð÷ºÅ ÞC^ß¼ÐÆ3¬Šy„€½û‹¢€‹çéz¼ñV'!¹§AaäaB)á_¿‡¼i†b0œœÝ\Ýl†»Î!d0¯÷†Üo…`¬‹EEBˆˆEL0ÇqRžã%<èõùÇ!„X–åy^"‘”¸ο|ðŠÅ³k”3ëP1® šxnÛ~ð\V“6n^ÆMPíØv`ïꃘå•N ¼l+I¼+L*s›E_> ûøñê­;Žíùñ€KU^QÝ£›{åØ|TŒÝÎGÊòlÙ¯å±Û¿5 R­ŒìÝ·Åš{~üA9…wò‹ PTqn=D ŽÏ;²ýþ)ÊcÕÚ‰{tex}…½õaÞ*FµÿVûºàqN~˜Ö¥J‡³.amº2 sŸg&¥b]š}§ßÛo.øºaðÛÝ´ €Mã¢Â\nxmï™;–¦jÁ„¹Ãf±á2å‘väå_|;ôèÐDÅ ú²s?ùçTš5Ô_¢?³jSjØØ¯GuÖIDê2´B¼J IDAT¿ôóï‰#¢*èÐ]eETT8EEQ¬Èœ}‚êùJBˆ¥xwœO3¼2üýüKmѹé¯Wç¾çÙzèmÞ¬"-f °¢“Zn6[–1™Ì29° Ë0LqB± ªŠûAC`l³âŠ7»ÆO™Õ FزßK- w°Í‘·÷RTœTI@ß·g÷†)üXUHÛAž²ýe›nÐqÒ¬¶k|À3oÌî ‹€Î5¶ÿË1ýl;3¨ê+ôè&óqô¥P(”û@å©e:E¬·6¼ûþþoÍ$C„Ü ;׬Ù}úfëÔ¬÷ˆAíüËtÀ[³þÙ¼rýK·òX×@È#¶n¢?·tæ÷WNœ1$Dá¨:HAžŸÖì>}5ÝÀhêuðú9‚ü+»~úq×éÄ,âÓuȰn¡jଣ«¾ûùtrF¶Ñ‚änA±Ï<7¬C€ýno|wäÏ/ùnSù½ fÿr!Ý€YµWt‡Ác{EÛ$Ê^Ñ·ìáêr”‘~jÓj¯ñ¯?ŒN°ÿBò°Á¯8?uñÜmÓüŠf»ÒOüºtýÞS×3MŒœ5a.Ï,[ ¶å38g?'dÉɵ¬Rg-ü›m1&éW’ÍBêÂû}c÷|ÀKÓ"‘S«õ:Án¼Ç2+²ÑcaÚü> !„Xh†?é¯Î}÷NØ ¤¼„“¢ ŠbópÍ/[ "fX¦y¨š“°2©Œc9Ä"–eB¥/ÊñŸ¶m†¢)¨dÿq¼…Š’JÜh™«”<bãüÚ5H%—(7Kê …B©¥Œ‰}­>d¸h2’åúæÙ³vÉ:yq˜«ñì–•Kç"OFÔwŒûBLWÖ}2o‰í5´¯?Ÿppó5)ÁbÄ’€5yëìÎîñì„0g”—¯Òñ€¬I›f´© ¶÷WüQòÁ_~üd¶ùÃé}üx$’/\Étï5vD=™áöñm—Ïå¼f¬Ï¸t|iR‡ÂC‰Ò†µ4®‹V†3.l_±yÑÊÀYcÕ *÷Še¯(ƒî» +;ïÈnJüz½òü‰É?|¹}°¼p³5eëÇŸ®/hóüä‘áÎ$eç_ÚB»•å9cB ¬„,`LdM^š>2L^ÔŸ-uU³tuÖ*‘ãx‚Cndn*öcv4Ãiyÿ%Í qˆ°„Å,ƸSSßÖÑF‚ bL&SÈR©Ô¾D  k+S@¡P(µ‚«ßM÷½ýÿN?˜54ØaŠ%)¸°ñ÷´ !ŸiëÆ„êrNMÛºïæ ú!ÅmÑŸûy_¦{¯^îã'E Ün¾x *züìo*±j)¸¸ak²K·w'õ¯'³mF ÎmØžâúôô—zÊ4ö1¿ýÑo?_èôj¬È}£ÇËPÃ(÷ŒóŸ<’bªï uö ôâ gI)übãü Äéα÷ö_L·Äª¤å]™Ê9¼Ú LŠ]3 %Á„°ž^}l⢠" $„`b¾uî†0f`ç¦Uj8L`bÛß“‰ØÎYø'8üŸuªçÍš“n]_…CFŸ§r[Ï–ƒ˜Ø3Ê1·¯’‚1Û(ˆ˜³IL0ÍpÊ/â‰!„0ƒe2˱jAE€ @,ÇJ8 bSØQ󤉄G•’ê …B¹|{¿>"ʶ,âü¤ ʼnBÖµ‹x÷‡©#W¶_K3M8ÄqŸëwuT”NjpFŽ&7*»°›•dVDÄxÉö´f]M¶(ÂzÚ7J½c#[/'fZbULá© „¤n.ðW†60à`ä ™g¶­ùíÀÙ¤,#gÍ"§7“ ®XÞáÕgI”õO(î¹fuí^uðµoÎÚçIÜC=àç­ëv(ÛFxË2R P<ˆàp`‰ùô“d¶ÑЧݧnó ól×î2KVj¾_ûN¡Ô«¶*ETb<¡(·Y×Èzü–¿6l ïH²ôºfíB”îjȰÿà®Ý{¶"iI Ï÷ì>¨q£8D£ P(”:Lÿ6Ç*Õ9À“µ¤ÜBº¶¾2Ǭ€‘çì#ÙvétŠ)"X^…ácÎ%ГÝqù\š9<@V¸?çä#ÙvùÜ]s¸¿ XÓÎ^1pÞAn<8Žo”€åU<sÍE1,w.& ~Ãû¶kìÆVùªÐ‰Š¯XöðšÒ È¥ó'«;ÚW±og½º}²¦ 0,„€, Ó¸O:Ž%ŽñJ€Îoè‚ÕC W‘7~kýZû„ó8õ³EçdµQ½'|Ú«xY’Rë¢PÊ ÷íÆqK»”Ìm‰G«ÿÍlù‚}å†à þèÛ6YL3Ü«.=3}Ͼ=‚ Üûóç8­ZëæâV—%æÛï_³ˆ}ñuO'ìýc[\ó–!Œ±ma+‹Å²uûZwwO?ß@Zº åñÔš˜g;éÞÿý«¹LïõÝe–ì;ÞmÚ«X¥N‰²/;›âÙÔ'j`wŸ·7Ïÿ÷íÜÀSa¾vÛP8I¦¼õŽºá€Nîïm›7Ÿôiæ&5å˜|š¶ðÐÍû-_}+íßÎÝ<øó滞}^ŠVUbÁsnaþüÎÛw„tô'9nZ¸ëÐo¿oÚ£læ)Ϻc´nå_ѧôáñ!êêZײ´ÉˆŠÍÑ ¶•X&¤x»m)‘¢?JQêœ%ô UÈL©œ*‘ÛŽER´ž¤ã4Ëß„ W>$¢( ‚ ‚Åb1™LF£±  @¯×çåååæææææªÕê–-[Vc{vôèÑÎkQ'!˜@YOcÛ’/ÅÛKÌÇ-Ún_?Òþ§£s­CWléS•*…rOYò eOâx×QB•š:\ò,e¯Xúð¢1ƃ!;;;99éòå+>>>]ºt©bÁíÚµ«Ió&´«ˆòØcÈ7@zfºU°¶hÞB£ÖÜóµÏËÏ;zü(˰înîpñâŪW‰»víºuëVXX˜ŸŸŸ‹‹‹\.¯QËr×®]qq¥ç–Ÿ¿xÞÙÙY«ÑÒÒ¯^Rn§8;9»ëܫޘæçç«Õj­V«ÑhT*•R©”Ëå2™ŒçyŽã8޳E¢(U·×Ôx‚ ˆ™Yz}$&¦-[òÏó¥÷…ÑcFÊäþCAÃ'æë¿|0iá¿>Ÿéó¿~>A¾Ú’PêFÿ‰(bL»OÃ^U°•ìì)× Øqk^åI„ŠÏYþ…JŸÄñ®KQÁ*JrØ&ܹa‹u‚ÉdÊÍËϱ<È4 Ú×HyrÈÉË騶£“Ö©*;k5ÚÍZìÙ·ç‡þÛ+<,Ÿfní$§BB±Ó †v:R{Ο?O‡Î(T'ÈR–µ(xª¸¼Ü¬m»ðR©}Ù\ô Vë–m¿–õcf$J9Y¹!¬ÚÛWEþN͈'uf¦Ôv°€ÁÑcµ8! @ ¥•¸SS( åqÓ V‹µÿàaRž·…Y3šY9¢`Á0Æ@€Á˜!.®îFƒ©<©ááŽ~°¾']Þ—B¡P(Ê“© &‰„/0 ¢TªÑ6”€1Æ„E, V£Ñ\Nÿ*ÜhÔ깟¿÷3*N.]tIÛåëæÎÔû“R+1ž_<}¹!¦u´Ÿ,ëäÚE‰=¥±Ëðq/ úÃÔéòÿõEW¶-^vËÌÇqZ*( …ò¸#ˆBÂÕ„¼ü<šÕ‹¿Ÿ¿—‡WÖ ‚U¸üïYg—ˆ Œí'ÆcQEQÄ ¢(¦§§[ÌærïͯÿìŦ9Ÿoødü2Ö7ºóû‹&¶p¢ËQj%Xd\³wþ0s­)܃ãÆ.˜òŒ/dác¿^¬œ7Ãç¯Þ%îa-&~óÚð9•» …Byì¹|å²§§g£ØFˆ®TP} þ½ž‘þB(Ô”N>|Ìš5ËõzÇjE¯H 7¥R9lؘòƒ1³ÎŸ›¹z˜=ø'ÃPãŠR[aT‘ýßZÒwZqôÚÂ×q®M‡¸r¨=hî/C¡PJ fY·ö¼ßÀQñºÒ«àU’D¡P!ú½—§— ¨_^õYˆ =á¼›«[M{vÕ”NèÙ³_÷î}ªúÀ Sq@P†¥ËˆQê1ˆúS*0j³Ž­_{Ê£ï˜öeVlùçvíºêÑ©W, Àw?Xoÿ±z͉¾O?׺Œ¨$©î‚ ÉgO%©¶R?†ïÉãýtO6¶Ekh>Tçç<š!¦Æl&ÄVºÌ…B©ËkÒ†÷_™öS‚±’…¬p^‰“ÓLbÙN5!ýÄŽoÄZÝÔ›Ò®œ9sË€IyOMLiWΜ¿mĶÇL€@yý”•$ÕUL—¿{sêÜ™ÿM`^ËÝ£+?7´w|ËV[wé9öÝoößµ’Çåé(5ý©¡ÿª÷ß#«Û8úúR(JÕÚºì?g¾±ìv´†ƒF}ñ~+©«‡‡‡‹‚½‡Q[¡Œ ƒÝ¨­­&替|ùÕõn3?öQØ»—ÃS›oþúÕ‚„öïLŠãékRs`,þ'«ïÃÅE/_rIÑ gïÿ Ò19WϜδTóËú_=å¨:ç¨&¤Õ  …R˪fcî¯ ¯¯`màŒÂ[ÅH¸öãßjðxöеŽO]:õ¡°ÞÜ0mÂâã·õ"ç×oÒ»£[¸ÛæYÒþZ:gáÖ“‰YœgDd¶èš%‰™ÏþvÏÙ멹&¢Ž{kùW½¼%Bæñ5óæ­?t%‹õˆê0æ‰}ÂÔ,·|5sÉïg̳í+_}ÖÇ—/wcEåŒóÎnürÞºƒçnç³ÎõÏúò•J†äœ^7ÒˆGDë!¯LãÌ"Ãéé}'\ºúÇR­µÃýòåÆb ö|ñÁ¢ƒWSÓõf¤ò¬?êÉýÂÕ6z}Ѱ–‹¼ý»¶Âáïæ8<Ú×CO¼üÚž«~ü_¸œA`IX<|è¦ØE¦5V=„w1^Xöá’Kº_}?¹©“„AÐ¥Ç{ÿë¥ÈùgÓêŸ:…|ü\ ¡ nUY¡RpéøÒ¤6:!…‡A®ÃS¸´7$J’žšš’•óp¼Œ:´MçPˆÖ%í±åäms¼“,÷ÈâMw|F­ødlˆœAÐÂ+qlj“çT˜d3RT!­Ú·ŠV0AÞo~JŽzuÝ«½¼$b¼3ö\¹éò„hþN–¨lТMË-‹bmư˜WÎÆòß‹¼ W$x ýþ³ñ‘ö,DòŽ~³êšç°%3ÇD(Ô..È4dÌòÅ'̉w®´¯P×¶U”‚iÕÜ÷ÎÑþøýš±i€\È#@¥Ì£)žn,}wçÉÌ>ž\AÂkLdÿåÃÒBÎÕ«Ä;6HSÆ¿˜ä¨ëOGy4"á~ÚÝ'oÿ~â–U9†éÒÌ·KSoêÈZê3zdÔ N°…J(®ø¶üÅO) ¥qõ» ã¾·ÿߩ㳆;ø%‚ O òé¶n@¨.çÔ´­ûnªR\¯ý¹Ÿ÷eº÷úàå>~RÐÀíÖá‹—l½Dªèñ³¿!•^=—€Ü7ºqL° 5ŒrÏ8ÿñÉ#)¦ú!r…_lœ„8Ý9öÞþ‹é–X•̾Tlt° Eè2NNÛîßå©X‚pé¿'¿<{!Óä#©èV#åM<—:{zq6cÙZ:•wòòóåY"æçç>\[ïZ9oÙÖ# iFÉEI® Xï^ºiujÞÜGf[\Ø!“*I*ìCÙm|óÝ ×Í­Y϶øÌž¹XÄò;I§£šý1wÒà+]ž6¸çHg@VÎÆr±¤M0©µ P8¬}lN;wÕ¬nÔÊß¶Éã©Wœ>Ÿfnít¯C2¯0Øœš+ö#ÚŸ¥ÜGuÌ3 Ùw¶ŸHïÙÓùæáó–À µ»â€á˜ò¹î?åÑè„ûOØyâÖ€<Ç$§ëw»Ö©±WuÚbþ¥¿öÝÐ=Õ%Z[ZüV’T«@Pççí?¸k÷ž­„ˆEœ„ç{vÔ¸Q… ¥ãÛûõQ¶cÄ;ùIrX¢EȺ–bïþ0uäŠÂ&ci¦ ‡8îsýŽ ŽŠÒIm&Q è¬Dp´˜!$u p¿2ô@È<³mÍoÎ&e™9k9½™”Þ_âä«K®Þ DHêì©‚«¹F ¤Â[9[qÛTI‡:‚²VÞ©„›ë§L]šßù•'5Ô‘§¸×ÞÛÄ2 宩TIR9V‚€AÖê­/_VÞ+Rx¸Häºaón}të«V¿3zõÚqß~3*B) *gc¹Ã%X$€Êµf³!ÛÚ/ˆáY°­˜¨8Ó'“€hŤð<¤2wwFÛ¤wɌ͇Ò;Dýy$Ó»[sÝöòœS ŸO6`_¾<Ó©N?¥vêA.'gKyÖl ©Ö™KBÆé½^iÕ´c”†©zR­ËÖ:®öþ±-®yK„ƘŒ±h±X¶n_ëîîéçH? ¥Ê=Õ1J¼»{î¬ß½_ž94HFåú#÷¨RèŸPÆ*Æ"¾á¨×‡ËŠlP™«†E]ì ƒ@x=qŽç ˜wvÏ[°Ù7düàg’º÷Ûï—»;Ç!°®ÇÊJ9À!•ÝjE2¥²¦©òÔû”t"A2®ïSÞ$jB´èà=¢êñ+ÿ>pÝÐ(ZU2ß+I*‹DîÏ™®%"ï^ÁJމ8u½ÖƒßnÙ½Óìa/­ÛxiÐ;MTLy˹ïáÏýxêÈ-SlxÑœyÞ£~=~å©#)¦Ø0B`I>|:Ÿ¬ï)EHÔúhÑŽ„[*¯J¾°2'dÅJMiזßÖNZ¿ýXü_iÝ;øóý©«ÿÏÞy‡GUt ü̽wïÖô^ ! $$Ô„^iÒ‚(MQi ŠåSQ|Q”’Фˆ‚ô*:Q¤:é=›­÷Î|ì&l’Ý$ ÎïÉóú23;wfîîÌ93gΉ眴ý‡M#"Ç4QZ~=ž…ÞQjG¢}̹ˆX¯ÕZƒ(r€1¤J¯&?{ÃUϾNìè.A•©.6f,+Y$ÿØÂÙÙáŸOhnWgîÌ×Ú•šÒôz=Æâí;×JúööŽþ~ –,›+ÂÃí'B$¼$¶G¿Nbé9…b…jŒ%];yò|Ìh\‡ÝoÖ, !*N©N ²NíÞ|Éç•§N#cúGyË4Yš†Ýâ‚¢ß0|ÕŒå¯÷ F×v.]qßÌçÑħësß/›ÿI¢æÅw6õJ^å ¿Ä32D¶~w⺈AÁ$»Ð«Ó ­•W†è÷Òʹ7þºúòO.Ö ûè7f¼præ’ѯ\Ö¿SÓ.lძÿÜõþN¯úß;J-i 'Ôb‚ FA­5L0 TQ(ÒŽ¸b”ÀC‡îµ~©¡ÌÆ„”H¦«µžE0ƈ`ø/^Ç®)=AD¦Ø¤îde¤¤d`ŒKFßü"†iÒ$ÀÍÍ~×î_:¶ïQn}2Þ];|Ø’›b™ƒäŸïZÖ͑Π”º ÎÞ3aÐìS 'ýºô%¾¾¬£ž¸6êž®¦uûÈA=Üþoï¢ùL¿nMÝe†¼ôbX¥›å]ΗGBáµÃ[·&]¹_Ä8ù7ë9¨OŒ¯¼’o8"µ$ ×”ž bNn¶Z] ))+Vñ|ùø;‚(ŒóªLî¯ÑW<þá<{~ú}¸›2„´½_~¸Í¾]CÝ¥Ôm 7·®:eá‹kÖ]î5£õìý_CôÒ¬÷í×oúcë’}jAjïßbH«ŽTœk»!ÏŸN8´þP«ˆ—ƒüûÍø?»Í?íßöÃ~µÀòvÎA­}•, ÀXÄb•$~Î÷¹I¯ä­Ø¶uñ1#Â)]‚=•Ì“7ÕjÈ®Eü«Ý—númÉBƒÔ¹YÿÀ˜€²¹Ã_éòýOÖ-0rŽZv|}”Q÷Ÿ™ØwÆÃêØ.„°ŽÍ½—0 t|JslgñolNÖ⧈$.­_þde|iY†e„½¶ü×q¤ôÓˆAÖm®Ü—Ö/²ª¤Zó39—V#>]3Ü|(ÂXÜrFRß“u›T:X¦ÜF– FN±‰ÇºÃ2¤¾qï-ï1“”…Š]$sõ²“·ÜÙKR]³âìBú¾=¯÷bñNƒÐ3Ñ;J ë Uðw´/ù~»p_žg!¸V¨Öê F!:¢„gLâºFgØ}ìZ¯vÖ.‘¢‹‡ÿ&a¯¶ ôwjºwõá?sÃ:›Žá‰þæ¶ïŽ’°Øþq¾’›Éûî€Ì$÷ƒí, ‡iäaO´©Woå¹ÅÆõ—Þ<üëï?_wnÞ36¾§¬ð¾_·­¶xw@!¤jÝ{x;9λrøç½k·øÎx%LÅ !íÀówåvéùr'”÷÷/[ÎÞÈ3ÆúÀ½}K‘uì;¢¿³îÊþ-–"×™‚”O_‚¨)=Áh2Ò3 iÙãyþpÒr e÷.=1Æy¹yF£•Híˆw mæjÖ(Ò~[¾7;rò×ätÿ€R§'Dõù5?§‡OšÛmÏ;KWžûu÷k!¡£¬2ZU|òÃ/ö[³n|¨œA€Ó×ç[—y[> 80kbUj~îáž[ôÚ¤ÍÎo­ž?¸½¬PUaÉ©ëÇ ]*:Ó‘ø ú*a`É dÄ94í5þãç-äU„À.lÐóš}!» î£>ìf!Ôš.«ÂÇÍù¶¼¿£rõÛE´¢©~]^ý¨ó+ò4B•+/š¶feI£%^/~™ÐÿQMµŠÄ=fÔѯ’ÒåS8·èÓ#zåæÝ»wïúõëO¸¸!ݬÍ,ôxYÖë²òÄ0¬•O—O ïÞJ+Ëcü½ŒÕ–WÖ+Ï,WÚòŸå‹—)I´©—oà‚¿Ö}¹G5 ¡«{µú²9ðÏDï(5¬'l…õ•+_¦ÑjªXœžš­-/3*_7Yù²å[…†al4éú‘çÿñá+s.”÷­$í²à·¯cžê-Gã½_f_y“sêûéü±áÊgk½|¶{÷¬ë 4xEˆ\¹—§RHÍ‘ié¢Î(ÊyNʳæ} „Œ¢È±z1ZH?s4͹íPð~¢Ÿ[¶þzyäŒvÙUº—Rº¹l°1 ÙGõnÆ~¸ë¯œžW^Þó§¡ñ”æŽ2¦­RÍ&²·4[ôž0µ»'=Ÿ£Tv;|œÐÞJz¥vùÿµAbmÙÙ<í†1u´a´wÿq5áÑBísm|ãZù”þsÒ‚Ã ™D*åyž+Öê¾›Ö½T 7MEå*$º[IçŠÜº¾2,ÜÞ\þýÓš¤c׊B"íý=¸Ã7.¦ëýe€J%o„³eqH‰ž@,ï4—ØË˜Õ‡’b@ˆ!óFšèÕ/6¦‰ ‹D¹—þ&@aí½‘æÎÍ|!ÐCbñ ÖÞ×5¤§s™Å‚Mꀃ¥šÒd )Ëš•"OWXÛ­s/•š‡—þ Fãö¿ÚT6 w÷íOµï0#ÜŽ.R”:Žöò–„ìe/w3Gë%¢ˆsúû¨öŽø®ÐQ©,˜”C˾Q̧¿Ìiëºý´6ìÍhWN¸³¾ª5€""6ôÖþ _&vüþ­h'ª}S*HcT}¤P(Õ¨'<ÊðcL0±H°¹$1DZ^Âó`, ØtGA,aE†0e.2“┵žq­ƒýn){ÉÚxü¾çø¥Âðh§ ^]=þw`årÛ!ÔM¦¿›¡3_5¹Í,Ë{Ìå;B!J/.XØBBçìï“öS4p•ægéÌú(ƒ{´R.Û·v“4¶•ʺr&  !! jܳ½ó·GV¯@ÝÛ»H YÖÑþ [ál ¨çþŽŒãÀ¡ñRž7…YÓêµ¹ùÙ¢`À0ƦŒ âìâ®ÕèlÕc¸ÿÇÁTE›wCUTM Ôñ©°èüƃ¹ ^žûqóO›äütÆO›ÏäÆôÙU‘J#F1.ÑC:ÉglÞ±×é¸3«½;‡´U®Ù¬' œ÷~«O_›óö,¯uó_ ”Ñ_…B¡Pjr}¬TO „£Á`E‘"bÌqœ”çx juÇq!–eyž—H$e*ÄEW^3xö sb-ÖLÆ¥YKÏ]»Ž^ÈmÙÑիǸ ªÝ;“®=ZŒY^éØ ÂKŠ€xÛÌ‚²Š‚éü L€…’; f=¡ôŸ¬G‡‘ƒò6ïß¿6ٜܱ› ! HÒoÌPÉo{÷®K6È\¼ì€e€oÐküxՎݧ¬KÒ`©Ê+¬Wx?[1  Zsr^Sz‚¦X'‘ðÅšb³!J¥ MG cLQÄ¢`Ôjõ6ŽVHñ­³÷ˆ÷`?z×’R×§Á‚³[޾Ö'¦YƒR£Á®Oàš~>šÝµ—ÐQV~ÿ•FŒBÍããG-ÿ;<¿¤µ3‹l¥² bdþ/|6ïÞ«¯/œ¾²éê×ÂTlþuMÛtPwÈuÿ€±`Ôé‹ó‹s² ÒóÞêíMÇ„ByêüügžÃý,•‹DªÔp¼15è32ÎѦP¹ýL‰á?Á‹X4è À ˆŽvr½ÞȰŒN§—ÉeX†aHûÓ¢¦ŠûI3`¦Œ¡ré0uN;Óu`m¼SRÀìo•e•¬Ê1f·1՞Ͻ;»'0¦Ò&£¿š ‹€ºÇMŸÝÃü<޳̀ ­_$>•ÍuJ=[õײ/!€„ô}óþí©b`UA]†Lèl*„Bˆ±iwDPíÙ#ÕØý£põÊyg'gdÆäƒÁc,Š¢(ŠcAŬ¬,ƒ^o£CÚ…ûؾE°µJ¤Ômpî‰Í§4^ëä-±°ã–øvéÕèûï6þžöÂàa6BGU¤òˆQò&úùoI4¼0¨™ ¡Ê‚RÙT»fc>{bxÂçkº­"¯Ë–&"&46\}ÐÆc ¡oŒB©+K&˜„ z‘6éïÈ|P å%œDQÛ4¶ÿeûQAÄ Ë´ ¶ã$¬L*ãX±ˆeY„*ôäUxŠY/*ÖË9™#–M°•U¡~“9b‘A¬6£‚ï7BÆ_'o 7¨ÓÎ:šëÚ>Â…#ˆTh†íA«Íˆ©5¥'Œ1fýú•jµe5ë3”Je|üƺŽ+m2iË™‰Oß…ò—ç¾9G¶ìÞ<ç?|ñ¡À°,ë¡£¬²L øÀÑ[Žzè]ÅVPªŠ5—I‘5½úÌ( ¿. …B¡Ô¤¢ðèû¸ b‡KXÌbŒ{´òm®%˜ Éd2…\!•JÍ΀ n\ðýWC¡Ë¹ûÏïÝÏ×a$µ÷ì8²w'_iîOMé ½{èÕ«UE,†±åo›:8 Ôl|WºF±Èf([Á¤*~¢Ê5—I¡?. …B¡ÔŠšðh1BaËd2–c킱+á$ˆA 2o(“z|b©hÜgìÌÞo„jÑ·¦,ÕL§HUÑË …By,Äœë/OÊÈãdѱ¢ý¢<U¡j!†e¤¼T.—+ä ¹\.å¥ Ë „ª^I]þ“%¾éÏt4ò/þJ£8Ô_=B¡P(s-ÕÜux°ÄJd;† uŒóa©“ÚÇØzhíúWŠ¬Èˆ•dÕ °æÞ¹cÇRŠDRócEûE©i%á1@P*Lú7•<ã,âZx}ýS(ʓͣ’绹Gdf-úÛ ³%¯0L€Ÿ<ø^cM…ˆµ ¾Qü{ªX—{‰$’èæÎ=ýyGr.¥Ï¿#ÓU™u2}s:yZí&—¸-GUϪè®.{wÆ¥ák×Ú±5?VîóÌõþáL€ÔÁÝ/¢K¿‘#û¶t}ühîuª_”ZÔ€*r5€ˆkcê¥z…B¡TQRfczx¿äRæöî™ÔEw @-äèÈ#övMKußøù4uì/ú+ûZ1Ö«9EBž0ýbÔ‹uÆÛX˜žiô‹Ÿ;-ÆgÝ8õËêÿ½vìö‰“Û8>öX]ê…RoU¯ÒpoTO P(”:$,3À­úS§)‘u4… â‰'ð3,ÿ0l §¹—wð¶N‡M+”fÃ!åFaõõÞxgóÌ KO§ªEαAô€IŒŽq7I¤†Œ?ç-Þ‘œ’Ëy†6‚<–>ÕV–˜stéÜœ¿•V #vÑï­\Ô×["äœ^¿`Á¦c×rY°nc¦OìbÇ‚6eû¢Ù {ÏgêˆÌ³óäE_õ÷å­&Z•ŽÅÌ >[zäúýÌB=ïÔ ¼ÓË“ÞìרÎì çŸÛ¸pþÆ£3ˆGhûa“ßéÄ"bõ¡·–Ä·] Ðâó]˺92¤ðüÏß,ØxôBjëÔtèœo&G(b£ÚÊÇÊh­û¶E~B‚š·hîÂ"ˆîÐ9T×oÂÎÍ—ÇµŽ±G¤÷‹RKB-&P¿/×½•!L0[+¾HjPO0…Jx¸Ê0,ÃÐë ¥ž£7¤dêԻ脕<ÿ¼gtzÆ—ô€eC;õ ‘ûÈH~ŽfÿŸy's+5°\x˜Óó2oÉÍ5"™yWIåCz¸ø§e}{V¯%eô¨.Ïùð.rÄÉËÑú3÷x.Á€ÜC\_‹¹H@Ô Woäoº¤-KÊûò.2ÄÉI/>œ ¡Ž Ñ —®äl¾f(6=¯*M-Y—TR5tÿ¢!€¬Òçß‘Mèåõǃ3™Ðç8_Öé‹òdÇ÷§¯ËxBÑŒuŽì7ñ£!ÎJ1íôÚ¹+>šºiNG'4ç¾?u3î0êíq!Ò¬ó»/‚Òülg‰ù›ñÛ0=*wãÌ9{CßYØÑ‡ËK+ p–ïXI´ŽXtõÄŸ|FÍz;T®¹sü畳G])\÷Ã+2úk+&ŒM(ì0zʼt}çÒã'j×$Œ –‰¶ë÷øùW}¼y„T¾v 2ÜX5qôÒœè—ßø2Ê åå;xKÒ_K´^-SÉXõî·¶¯\¢F%Þ௴“€Q£Ãð,ô‹R³(ÊüÂ|{:Õ˃Ôînîµà¨¦ô„#G÷í?°ƒ”š­ð|ï^CZ4¦Þ(J½†E%QM 1ÝÈdP‰Ç>@¾MÝÇ7&ÇÎeoS£ÆaÎ/u‚¬Ý¹7ÊØ‘¢À(÷ÑÁèÒ¥¼ýyØÁUë ºÒÊYÄ•ÛQAŒ·§ÔI]¸1Ù —p‘Mv"»roHQ–zç©¢"8yÚ sy1/õÇX4•/*üé´Á “via7ÈS8ûOáOÿˆö¾ý¢Ü ³S·fl«©zë'æ~nÂ%ƒ£V$Àš|™#&ÀOæ©)Xw.?[Ÿ—G@&}2[qÆ.¸cl0„»ÝÝ?r{rª¾ƒ£¬àÄÒ­é>£V16HÎ ˆñJÙ}&à|›Y¦×¤ j×µ]¸‚@ “¾ÿé^Ø”SúzIDzg¼fëÕ á|z®¨ŒˆéØ6ÒEÍM1ÄB+‰6!  ŒéÚ)LÁtèÒ©);tB²³¾ˆ±SŸùþÇ›žñ ³Ç„*Ô%:P7lÌÊ¥g^š×An»~¹[@hãBˆž\¼úºÇðå_o¢4EÈÝý=[»s܃XRþRš^º\…üÝ&Bòuõe!Y¤‘Ÿ[¨Çæ o£©é6í15Ï '@8I™æéòµ—ÒuEÅzµ– ö wpéÇÖ,X±ãÄõ £ä´¢¤@‡Œ™—ïÛ´ñ‘1 BèaèóJ²6±$Щ>óâ-½pΠ˜¯ÌK.±<]#éñÒ¨Ö‡æOz-nPüбMœ8Yˆ•ÄJ1ﻳvMºG*~¾z1Ó-͸pCo×¼¿‚a$èÐÜnõ¹2ôíÛ®ÁÃ;-†Œó×uvÍÛ50Õ`Bo»Z…í1Øè>Ue'þf¿Ðís“Ò¥ìøÆ‚}½$Æõ¿_”FÂIš„4¡ãPíÔÚž{Mé z½cñök%»9`oïèï×`ɲ¹‚ <œ.‘ð’Øý:uˆ¥ç ”ÿ"bÞùC¿Ÿé6B$èO ^PP˜¬+6¹¯Å4ˆ…('—º±Èµ•×ÜV'sƒ¢LÌkN.ucðµ ÁˆÍ;÷–‚9¶yËBÀ 1ær’"@àèm×?LÕØ‘•b%H”Z~‡LåIA!&,«d !@!S 䈩¤©H´}Õ€›÷ÌÍ#¢F÷$–ÈÆ;›¦ÎH,Šüé¤fnäöÏ~zДÁ° ˆ‚Õñ©$ËÊNÀ k÷Þ7SÂ%Åι[üÂ-íOîX÷ãÚY£×n÷Ã÷£B•²@+‰U‹aÎIXBD¡dÈ,ß B&òVë7&½ø`‘²jºk½Zd{@ltÿW’G}==ÚÍÎÁÙÅÍÝQÎ2 ƒ@õ¿_”gH¢¥ù—‹OòÖÝ=s]ž:îÅNÞ$Ú9 CÀ{„5ä×ü™tKÓ<¼œ)I%Y‘¸5öçt7SwßFJTF”Aœ]ÃöCßoÛ«ÇÜø77þ|yȬ–*ÆZbÓÿIüBÜyÄ{6mȯ9{â.*Dî?WÄ4õ”"*Ö/‘9Ê 8W+–Ô¼{¨?·îì‰ûº¨ÆŠ’‡ó6«å=mH%ݯ »Í"#\Ø25•4 Þô‹B¡T‹ž€˜Çû± ‚˜“›­V@JJÆŠ„U<Ï—/# £Ç¼*“ûk4ÅV¶¨pÁ‰¯'r¼ñkï.hc—y8qÞ§“ nßoçð_ÖÄÂY1wÇÿ6Ư*7¿œupþªF£{¦Z DB'Ƨ%?V£÷@Jƶb'hô™ØÎÓžä¤u–Å8³Øb*“!ÚyKøLÓl¼óö2OdÜöúR1!èI¤Ö>^SŸ6Rïp´bCÂfûç"ý•wÕæãdßfÂËçMÁãÇø«´o©ÍG1•dU„qnÿÆ ïQÞ}‡3°µ\—u·°aŸ~áŠÌ#[Nà€ w…!59¥ˆ¨ÜT,iTL¬„ìßW,kø|s7ÃÕÝ ‰÷܆|ØÚ‘AÈ>ú­áÃWÍøPþz¿`tmçÒ÷ýÇ|í€ÑjýÏÈÙú݉ë"“ìB¯N/D´{ó%ŸW~œ:Œéå-Ódiv‹ ²Ym%b«ûZZK®1[&= ý¢P(Õ¢' Ç3ð3…Œô ƒA‹<ÏN:PÎ+V÷.=1Æy¹yF£`¥ ýƒ'òü¿õJ·@)¡öW÷Œ>r&ÍÐÖ^þ–ƒ…‚ù q·¿·ñû£ôpãhÿY»ì$òT@QV±`à *kAzüÞËþn¬»ƒ¤/´}tÚ=×…IÝGCÁ‰ ÁÀ²®¼áÌMC1ƹzâè¡lâ`<Ÿ¯ÛuÙ85Ü}*HJ7êX©o>°îïÈÖ4«6ä€CÇp•æ¶>KàÜxTMM}ÒA`¤’'ù8ßpøW32¿HL˜µ[„Hì<›ù›ÂrÉBF/^鏸›‰l*0²2'ˆnAvB•fUDÑì­eKœ~·-áÂÌ9¸ó„®}Â%9—÷¯Úx6SDæÖ´ÛôÏâƒeŒÞZb%ÍÈŠNýøåš Ñ) ùȹïŽof²Q’5ûÝRå‚…›¿ž’IÜCb&~ÿΈP9ƒ@gµ~äÔéí™?þnÅGÓtrvcÂâ"Ãß\ºÄiá·¿.yom–ùô˜Ö²{·­j+ëÝwø7.ŸÕ~Q(”ÇÔQs²³ OÍ#[B…›yPT¨kFM§øí؉;Æ(„Œ¿/æ)›DyðÿíÍr±0SMG¿¼á㥿Üè0®±œ!Y¿/ÞšßfÂTÅssÕ€U?€ô«^k<ž÷À²ú· wô…Ö+MáöùôïuÎ/4r°‚˜ö ÿÂ-C±(üu®(2Æ®OPñ•? .e,Ò;önìP0xÑ IDAT0"„áQë/˜m®ªêñ­PP¸:™æørÁ(ÜVcüäM}â!`%’'òmÂ(‚ûÏLì;Ãr£Ša Ö±Ù ÷”î9•æØÎâߨœ41¬Å°"‰Kë—?Y_Z–aa¯-ÿu)ý4b…µÄJpŽ™¸üí¦rY¶ çÒjħk†›_2Srm×VýR߸÷–÷˜I,JK\Z¿üɪ’6›;d£ÚGŒ•ÕîÛ|îV$õëeêq¿(ÊSÕRV:û÷Ÿ¢XæÜ k§X„@°ÅÍf˦ùúxÒé ‹†Iêf8uÜ8hÎ;íÿÛ'ˆDŸŸ§cì|c^}%|xÂÊ?‡|Ñ^‘²eU²}ŸÝìYÿÎÕŠàÈ@y?€t¦¬=Ó{ SÙÙª;H}¡uå(žÜwÿ4òü¢q׎{{JÒ‰ˆo\É^tÅüžH‰ó"uzþâß Ì¾Œ¾}#wñ<ó»$„˜Â´éµwÞ/ Ld£~æÛM÷Lõ¤¦ä.º™gáÿ“`R¾¼65sú&À¦;Ó¢qïÎûûÕTksz™:@(*š·I ˜`À»vÜÛE}I–Q­yB3&„[„bÐãeY¯ËÊ#ðV>]>Q(¼{+­¸Üîb<01—g­‹ÔVbõ¡62¬Öð¯Çªê1š*/[ûE©Q¸~ãzaQ!ŠêÅßÏßËëNé ä1¿"_2°,³mûú¿Îž* »f2@:|x‡¯Ÿ=ˆ‚Önß§Þº¯wk߯_Æ‘dÝ?öœÞò9ßÿ²óH¬Í-y€RêÝüõn+¦¬Ø?Ô+ñ—Œˆ×7±Î(@£ ‘”Ì—¥~)µÇczt,£N[w ô…ÖMáaP˜ÊÒ b탥/#›e¬™Õ—«ÿa=¤ å X*6h*øÙsÒòv¦D[dÌ1–ï{i3*S0ž½i8ÿ_™s¡|‡¥]æ}@#ÎR(e¹zíª§§gó¨æˆP¨Æ•ÈÅ+³²³j!„BUõ„Ç]d )Ëš—OWXÛ­s/•¸ô¿X0·ïüµ¢B NÎý|—êÍusùò(~ä †Mþz~\Ûyÿå3Q“«¹£ŒEö­^ä;bÍÂï쎢® »{I¸l'h²Õ"ý=]×{ ¥–`Ë$…R[02E|O§åõQrá+Ó0¦À¸ö^‘Ô«b:bhwô-jëB¡X .V{yz ‚@ÝúUç,„˜àFÁÿ\üÇÕŵ¦w«ìõ1·IŒãÀ¡ñRž7…YÓêµ¹ùÙ¢`À0Ʀý+Œ âìâ®Õè*Ö ä]»^$oäÌ3 ƒ§°v!ü/©iÅÿ»‡ŠX›¯%2•ð}Ç´Xóáî,ÿ1Ÿ´´g’ªx¢Î.¦zÂSæq½!³1‡-wJíÍ1õ¢ÍÅ—‚ UJ5Ö–i 5y¡P*΄ÎÕ=QµsDSU=áq-þ4Å:‰„/Ö# ¢TªÑt”€1Æ„E, F­V_Q ‘¸·jç¾|Óüo#ßêÝԮ🭋ŽêüG7sþOOÃXW ‰BÊ È­ë[ãûoÌïòbC)ƒ8¥‚Ñçè©Æþ´eˆÇòœ½·=Ê<½ÿø-ÿö6ÜAR(µ:Í`ú½£P(Õª*ÐÄÓÚ¡Ê~Q³^Á(\½rÞÙÉÙìü1¦ÿÅc,Š¢(ŠcAŬ¬,ƒ^o¥ EØ„EŸr V.Ÿµ=[Ç;´|å‹)c*÷H÷ì/àzµd*ÞdÑ¥úÁG™==°¼R é9jÜè¡wæ÷@`=Ÿ›à³_néÖvê0î ) …B©·-Uê­êUSþŽFŒ³~ýJµÚ2€š¥Oއ%•Je|üÆJÜvFÐ}Ê‚®“zVcþëfŸªö‹“ކ5ßÐ@–.úä­?Û›L†EVüRjœå=€qjóÆòmã bXYwÉÿ§_èÿ†øÓËÛuQµZm^žâÞ=áúµ|–¡CB¡<}µr q÷óórvv–ËålMšÆØŦDKõ„jWêÚyÂãÒ»÷€^½úWU¾b÷0lzVû¯R™Ë7‹<ê®î½žJöY|Ím”ùO¿P†zyªëBŒéà˜zî¥PêÐü‰SòódžÒo“P+Úê6Õûó„KEU …B¡P(”ÿ0„ª µû“S÷ž¹oEŽaâZûƵò¦ûÖÆ´öÅÑѦP( …B¡Ô”žPåó„=gî¿Ô-”ç˜{Yê=§nöháÅT££Xtù÷Ý:Å…;”÷°_IVÕžª@mH) …RsN¬_¼<)K “E¡Pž†žPEQdX¸z/OÄXo y¼?ªöìs?}W#>VÖc!ê²R.^| +I©&¨ž@¡P(ÏŒP›{ê§ï—J3VœÛqÁ…=›=›'’úÙþ§…1õÐÚõ;¯YQ*ɪe°æÞ¹cÇRŠýr«^²Žð wRÍŠÂcüëõ¢ZkÐh€±ùÂnþpAòwÓ§Müß‘Lƒí˜ ªœ…ÕçV>uÊÔ “§N˜<íí÷ç|³fïùl#©¤%†û;VüòO¾ˆm§TÇÕ( ¥ž`¼»ùÿ&Ïü麶’‰^?“|)C'V<-²ÎìÞsô¶¦NI¬¤ýOQü ˜Øð¹XIV­¢»ºìÝó“r„j,Yëï^}uû܉Cºujß"¦K×þ¯LZ|4S ÏD×(µ¦)*þa‚ FA­5jtFŒÅ*ИvüÀ£„Ü9tèžN$6Kš§‡ªf êì\½{÷±oŸøúÈ!=‚É•}ËmKщ¸’Æ`LÊu¹bÊÿÕÚ»«Áû ¦P 5†eª–P(”ú»Öåý>{úŠ›e‘Žúßÿµ“ºxxx8+ØGµ6ÕBJ7šê®a,¡.KþåR(Vqäª^²VÛŸ|öÄ9{•ÇNbgȺså*ã¨`ž…®QjOI°ýö÷%§H~`D˜PÊ$:½P¬1&RŽøõï¦#AϘ€ÞZ BLt)’rúŽLNؽïòsc#íK/ùöþ²óôµÔ"ÎÙÏÔ„1‰Ú¤Ò,°Ð”Þ*¡MCU>X{íj®ÐÐùÞÚÏ–Üí2mzw €˜}äë/x½ñþ_€ôsßÙ‰ è•O&„VH‰R0¤øæ‘m[\¼ NþM;÷ëß%PÉÎÿkËúÝÓs ´’9ù7Ô¿¯¼¢ôŒH--5¥'9ºoÿ„ˆ¥_ Ï÷î5¤EóhzuB¡Ô×OÄØ£×äM¬i"cÞ*FÂuÿ^Wê´Ú0ÞÙ!Mš8”®U!ãýÍüß‘ˆ÷æÅÊ¡àâžõë÷Ÿ»SȺ¶î7rHEù¥Í˜û×¶5›’.ß/d]|¡˜Î"ˆúBâìå7šMøhX°¢t]À¹'\¶åܽì<­É]£ú¼ß­‚ABÚoçþr1KƒY;¯ðnCÇö wb‘¹üÙ{ÙùZÈÜ›vêÕœ¹pôøù»…ÈÁ¯ù󯌉m¨4ÉyV›úèåÈÊsí€ÒNmYýkÒÕÔ¼Ó§=Á³Î‘ý&~4ÄY)¦^;wÅGóB7ÍéèÄ‚æÜ·ã§nÆF½=.Dšu~WâEPš—sÛYbþßÞt9ëí(G¬fB\9¤»œ8ñÍŠÁ“?{ÇS}bå¼Ïßfü6LÊÝ8sÎÅÐwvôåòR‹œ%Æ;Vm(76Kz üü«>ÞO0ƒ ž¾’ޱIOÀ„¤AÂé«é B€Ø+¥†’kÍå«s’O‘7½‘œ‘†tl¡\rädZÛ|y¤èÊž“ù.=¦ŒŒó性´äë×M¦@j›Y¤¬Š)?¾?•¨ nÆÅ5’#0˜4‚’òÄB± ÀÛ»ùz{pÑWH)¾¾óPºc—I#b}d Šñ4ÎýöÀîkF7UB‘zG4 ¢Ð`—¼«‹.$§ê5”Zž£ @µv@WSz‚^¯ÇX¼}çZÉȽ½£¿_ƒ%Ëæ ‚ð°§„HxIl~:ÄÒ­8 …R= Ó|…YÀ¥ÆH†[ÛæÎÙ'‹öF¼‹öüö5‰ó‘Ç#›ò–5è®mübÁÕwø‹þ|Þõ£Ûn‚¼tÕ F—YDͽ‹×rÜûŽÙP¦I=½óç•ó9¯9¯6U°!]†Œ‹sáì‹»Vo[²&`ÎÄ(;ÆTÞ£ßk£¥Ww­Ýµê’[L¿þ¯÷UäÿµuíO‹ƒ>9P†¦*©)Xyî› 1óàêŸÿÄa±=šå?YüÆ.¸cl0„»ÝÝ?r{rª¾ƒ£¬àÄÒ­é>£V16HÎ ˆñJÙ}&à|›Y¦HÔ®k»p€&}ÿÓ½°)§ôõ’ ˆôÎ>2xÍÖ«Âùô\QÓ±m¤‹¢LçCb¡•D«TRRîÚ8€/‰hµwŠ %Iáq«ílÕJU›«%ëÝç³Y—§}õ連«Û÷~qèK½cüšØÕë®QjMO¨Äœ!rå^žJ!5Ï©€ôFQgå<'åYS`8„Q°~çHH?s4͹íPð~¢Ÿ>r)Ë¥’™Ë‡E…7’¡P·ìä™»¼;ÄuŠR h,½’üÍù‹9Æ@‰­¦6‘?ê–ªø\c„?Vça™O`áÞ“ÍçÆôck¬Øqâz††QrZQR ÃÆÌËwŒŽmÚøÈ!‹Aª$«TA%²¬>óâ-½pΠ˜¯Ìƒ‹E,O×Hz¼4ªõ¡ù“†^‹?t`l'@b%Ñ*•”D% ¨¤wKl´ƒªv¯úIöžµ¡ëès¿ïüeKâÄ͉-ÇÎûߨûg¡k”ZÚ[©DOèÞÂ{ÿé{‚(˜¶òyŽëzáV¶J!½só®F§7G° z¾]#åíòõwÉ wýÁS1Q¹ù|Ã&J0ÈB%ĤØÊ*«(Èœ½|¼•ÀÇ?(ÈUýå§“îöÎs õæM“&ôð4‚XHöRàÒKÓ¦G#d¦RŸKÄÔSij@ŒKJ>Ü­ª÷z‚ ˆ9¹Ùju1¤¤d¬HXÅó|ù2¢0zÌ«2¹¿FS @o8Q(”ú€o¿i#ÃL{îˆwô“"dáÆEȽùÀ f®šñêê’%ciŽY–¹•.Ø……¹IMb²ª+ª–¢. „¤® œál5rþÞ¹þ·¤ówsuŒœÕ‹œZOÊ——8ú:€¡@mP"$uòTÁ-b³© ÔY€õçJü»ÆŸX¿aùU7¯qƒ½ÿ½–pgÓÔ‰E±“?ÔÌÜþùÃOš2–±ÜY <2ËÚ>Y»÷¾™®@¥š‡³Dî¿pKû“;Öý¸vÖèµÆýðý¨P¥,ÐJ¢Õ«%Í»”¤ôŽºÍÞU(i«\ío©!F¢òiÕ{lË^C‡,{}tÂç뻬~Íû™è¥6Ô„Ê„Úç򿮵ò)ý礇2‰TÊóÞ¹´Í¦Z5ª±h¤›õç 99•O@›•žêíÝà_!ßpøW32¿HL˜µ[„Hì<›ùÛ±²Ñ‹W:.þfcâ› Œ¬ÌÉ#¢[‡P¥YQ4{kÙç…ßmKøpc sî<¡kŸpIÎåý«6žÍÔ‘¹5í6ý³ø`£·–hµR£Õ’È©ÓÛ3~üÝŠ¦éäíÆ„Å f½wL…’VÛéÀÖæ7‹Œ“]Þ¡u߬ËÑÂÛû†=?uÑø¾Þ’úß5Jm) ¶ý™ŽL>FE,ô`DG;¹^odXF§ÓËäÀ2,Ã0%»ý–Æ•ª¨±Ÿ4†aÊØå —Sç´†A@€Q´ðfLI„BÈô¯J²Ì)Ãã§1œXl¤˜öR!œs³>c"^(ý0 !œKÔÀ·"òÐŽ´b £jÔyÈäN„ÒJ !¬çsïÎî Œ¹Êfo} SÎÞŠ úgMEž1ÿâY–Ù¶}ý_gO•†]3u÷ðá¾~ö b]Ž.D¡P(UFôÒ¬÷í×oúcë’}jAjïßbH«ŽTœk»!ÏŸN8´þP«ˆ—ƒüûÍø?»Í?íßöÃ~µÀòvÎA­}•&ÓUŒE,VIâç|Ÿ›ôJÞŠm[3!œÒ%ØSÉðÍIãÃZˆ÷HâÒúåOVÆ—–eXAØkËGJ?„@a-Ñ*¶JJ}ãÞ[Þc¦I”`![½«X¬¶³VaTûÏœßw†…¤ô¬tR{z‚­½oóA”—pADQlÓØþ—íG3,Ó&ØŽ“°2©Œc9Ä"–eBå«B V®¸š’¡ôYî˜X6ÁVVé¾Â7“ØÈ&åõ‰ÒÄŠ)åÒÖ‰dYU™Ž”–­==¡¼V“®&Š¢ÑhÔét¦¨¨¨  @«Õ6kÖì‘æƒûöí2dBè͉ñ¥çÎÇEFDùû5ä¥R³2ˆKÿ‹£qûÎ_-\Í0t'B©»»A¦™AA ƒN§ÓjµÅÅÅjµº°°°     ÀÎήmÛ¶Õhg|òäÉØØ:ä4™L¬8Ó!K'Ee6½JÓÍ–¯æ’27Ó,¶©ÊVe­þ‡­(·»öp_ʲ|™FW­©•|bªø\Œ±V£ÉÍͽ{ïÞõë×}||âââªøâJŽúñ{ ïÞJ+.g-‹X¿@oõÖC©Œ .B._¿pws¯cª'P( …B¡PªŸÆ!¯§\¿ÿà>¦[ðóõssu«…GQ=B¡P( …RýH8I“&tªZ»ÖKõ …B¡ÔCÄœ7üã7xT7U9‹B¡<£-¥& ÞH) ¥„ÚÜS?}¿äPš±â]>\paÏæ_Ïæ‰Oxͯ’zªëu c꡵ëw^)ÈãdÕ2Xsïܱc)EÕ9ò5Q'í…B¡z…B¡Ô€ÀzwóÿMžùÓum%=páõ3É—2tbEWvBÖ™Ý{ŽÞÖ<©+ìJê©®GÔ1ÁˆUdÕ*º«ËÞ1?)G¨ãuV*¼«¯nŸ;qH·Ní[ÄtéÚÿ•I‹f ä™è…ByÔîˆB¡Pª(–æý>{úŠ›[Ÿ£þ÷í¤.Î öB­M5‚ f¡ö‰è+©§ºAþ¥ðË IDATyl)‹Õî²&ê´ù¬üã³'ÎÙ«ì8vòè;CÖ+WGó,tB¡P=B¡PªOS1öè5yDSk2¹eÞ*FÂuÿ^Wj†[mïlž9aééTµÈ96ˆ0éƒÑ1î¦{†Œ?ç-Þ‘œ’Ëy†BaKEJ[YbÎÑ¥s8pþVZŽØE¿·rQ_o‰szý‚›Ž]Ëe=º™>±ˆ Ú”í‹f'ì=Ÿ©#2ÏΓ}Õß—·šhõ=«¸µ$¾íR€ŸïZÖY8¾l^•ÚƒŒVÛY¡ÎnŽ5DÛp÷Xr¡<î³÷_omÇ"ò±Ú]¯»F¡P¨ž@¡P(ÕŠÊ'¤I‡R›M„ñþæþïHÄ{óâePpqÏúõûÏÝ)d][÷9¤‹¿¢¼‰§1÷¯mk6%]¾_Ⱥø@!1IHD}!qöòÍ&~4,HñPëÒ|;÷—‹YÌÚy…w:¶o¸‹*©§²,\pnËšŸO_OÍVë‰"|ÔÇÓ;¹q¢Õ6ëï'mHÜzâz®H]Z>±‹»Äjb5Kr¬sd¿‰ qVŠi§×Î]ñѼÐMs::± 9÷íø©›q‡Qo ‘fß•x”fÝv–˜ÿ÷Á£7]GÎz;Ê«™Wé.'N|s£bðäÏÞñTŸX9ïó·¿ Ó£r7Μ³G1ô…}¹¼Ô¢g €ñŽ•DÊÍ’?ÿª7Ê׎Á·«ØžÖöÆ+VÓ¹ uÖ¤$-qmä [“w¿ß,.@Δӆëu×( Õ( ¥Z!@0&&a !³€K‘ ·¶Í³O;ìxíùíkç#/F6å-kÐ]ÛøÅ‚$ªïðýù¼ëG·Ýy©¸)ŒB¹kœ¬CH—!ãâd8ûâ®ÕÛ–¬ ˜31ÊŽÛõTò±èú™s_=<ÄŽhGYosHá¾oW—ŘÚÜ+Ì*ö¶ç„t+‰Õ cÜ16ÂÝîî¹=9UßÁQVpbéÖtŸQ«¿$gÄx¥ì>“Œp¾Í,BTAíº¶ W0AaÒ÷?Ý ›²qJ_/ ‚Hïì#ƒ×l½:!œOÏ•1ÛF:°(Êt>$ZI´J%%ån¡x!0Tµ=-ŸµšÞªi…:kÖ»Ïg³.OûêÓGW·ïýâЗzÇø?4±«×]£P(TO P(”j寲 ã–›ÿ¿c÷Oæ odq/_üyoFà°/‡uvå‚ÝòÏÎÜqøÎ¦A%¢¾°åpŽ{ßOÞêï'E®÷_º H>~î÷!¦Œ„„~QÑ~ä˜~êã#—² Q*©íz*y„InVø5kÙH†‚â³VÛÜH’S(ʃ"¢š…¨1 ¾Xm%±º1¦[³`ÅŽ×34Œ’ÓŠ’0f^¾ctlÓÆGÆ0X R%Y%CˆP‰Ü©Ï¼xK/ÜŸ3(æ+óp`ËÓ5’/j}hþ¤¡×âÅÛĉ…XI´J%%QI«=zGëé¸)±^gM!mØ{Ö†®£Ïý¾ó—-‰7'¶;ï£"쟠kººÒ5 …Bõ …B©F|ûM¦d ÞÑOŠ…s!÷惘¹jÆ««KDrŒ¥9:dYæVº`æ&5 CeD"TQÄrþÞ¹þ·¤ówsuŒœÕ‹œZO*­§ÒG”æŒ6Ú̵éÑ7ìÌÚyïßéþ|ÏîÑv,ßÀJb5k w6M‘X;ùÓIÍÜÈíŸ?üô )ƒalí’k%Y ²vï}3%\J51g‰Ü-~á–ö'w¬ûqí¬Ñk7ŒûáûQ¡JY •D«Ö0VK ¤² ä6ÚÃ>°žÎ¡®³zAŒDåÓª÷Ø–½†Yöúè„Ï×wYýš÷¿ïWwºF¡P¨ž@¡P(ՆܣaPPÉý„ ò7 ðÍFMÞHV*É\ìYT`!Ô2DWõBÚþßnÓD?4ȉ¤üaùéGÖóX°ÑfNêøÜÔy‘’vïÚµø“Ý{_œ9³oÀÿ³wçqQUýÀϹwf˜•MYQwYÜÒ„§4—L%µ,E{Ê%÷4ÍËÒìçRij ¹‹KYÙFi©Iji’’¢¢àÂ"Ë00û½ç÷‹,ƒb¢~Þ¯^½˜s÷sÆ;ßï½çž«yÙ)¬Ók¿¦ôã©¶À™žì¥•RÁ1À‰ „"óhë'Ûôû¡4CÇuå-ÞfRuR·V>Ó¥‹T;¨¥Š’Š I%¿îOÏ‹èßïýÑv§ÄÌï¬æìÚݵ3§Tî,'ÅyF¡æÈ·¦ýÝkØOó×y_’ÊQÞ±uÏÎM?Û÷w–•x7žCä u/ÕÜsZâÒ“·\»JÝz{Ë+.`%”&0BˆÄµ¥—ô›”S×LÁ-µ†,™g3lÍŸyò‘NM%DT{«éñ’mÕ¼ž»ÚDûLå•ÚöÑãB»wÛøÚâÄý—£cƒÔ^a]Ö¯ƒ6Ä‹®ß·Ëñ±ö>ª¬ô¢Òa2©c·ÉÏúŒŸ5Mœ0"ÜGm<“VDJ¦Ýf’ʵûKôcw¼2ƒ‹}ª«—”“^è7ppˆ2û—=GEßw¥åú‰‹z¦vSóÄvã`õB»¬vç”z¶’oû.~k»aìfa³^Z±ZîSMåÕ×ÙΙ¿oAµñìú…»Œ­Úµôñp¤ÿ·uoŽ$´§¯œÊü¡ò€˜C8¶ÖÏíÍ>\Æ îÛÆ]nÉÏ,ÖöìÝRÍ«ÜT4ÿÌo§¯yvñj;¢¿×¼/W| >ÕÎSi¾tÝPú>0»ãIÝZºÑ¯~Øû“*"ÈS‘—Yö:7ªªq=·™Tû}–ç<,6óv•ÛrR®ˆÒEÁáæÕ ë–ÌoÔ’9ÙïÆÇÍÿÎL“jõÆÇë_ŸeRxDƶnUÛýqâk(—V[g;'þ~]}ÎE“`ëÊ­¹&ÆdŽÞmŸùዃ´Ò†hP‹µ*/4aŒ1ÆA°Z­&“É`0èõzNg4CCCïø`QbbbLL ž?hLXAl6›Íf³X,&“Éh4êt:N§Ñh"""êð ””U_N),ÿÀ[3ã%/¬žæT1V´^Ý5ïõÿ…Îÿ¿güå”2›îìÛv<{9»ÈæàèÓ)fFl„›„èÿÚ½"î@n§ï= gEìÚþã©‹YE6^¦qmÞuÄÄ绸pÅÉŸ.\s¡ÝËo<¤*?jfJÿßöõ_&¥X cU“Àÿ¼<{PsJ™¨·»ž’'Ù*íméìí³æÊçKW%þg%Læâßù‰gGGû)-—öT/ä(Áh4æçç§§§§¦¦jµÚèèèZ6\õÆÄŠo³£”+°Ÿ1‘‰å¿[§Ô4‰‰‚È(ÇWï+m¢d*ÅòÅ)åJž±[hÿëQÓœ·&”ìRm÷çvåUÖIïë¿ÿŠÕÚ¨íKNNfŒ¥¤¦Œ:â®Nk {‚‚)¥gÏž­ý)1111###((ÈÇÇÇÕÕU¡Pð<ÿŽ.111,, `ý”””¤×ë5“““£££Z­V©T …B.—Ëd2‰D"‘Hxž§e'ò„2ÙL‡1‘U¤¨¤º*ÄUôViÙGÆ©8S陹êªì¬°ÂÜ5¯‡ÜÓ&J¦V,*ïle·ÔqžP¯Ù ÓÓn U®¹ñNÍýµJ§ @ž€†nLyúÔ¥­¡¸êÈÕ,+—Öð”ƒÝñŽjXáíÖS›°»Õê…Bqæõ›ÅVÑd2étºÌ̬›¹¹Íšiëw@,8¸à¹ÅÉUÇVrxdùW„ã½`Ш O€ŽéÿøäÏRQ«Õb4‹‹ômZ·n¬ÇË5}bý¡þv²²ªÝm'ÀCŒ:÷x#®{y¿£ŒŒŒóçÏK$øÇ…Þ×ÎÈ ‘ÄÍGcÇqG)å8tÓh p6ä €<'ò@ž@„Ü£ÛV}z(ÇÆîf O¨OAmÞoÛW¯9pÃZ=ruÉßïúâd¾€ ö®X¯ز훿õv’ÛLºDCÆ©#G.êÑŽ€<J¢Òô]oN»=ÕÈjŽÅÂÔã'Îf™Rm[Îñï¾?|Ù 4’ê°f]%ìAËŒ‰Œ0BØ]Mº_LçÖ½2gÙ¡\[£Êo¯oÓ³KDd§ð*ÿÛ“…»5Þ³P˰4ÿçwf¯¿$Šâ#ÿ±ÿ÷f¤CW%‡ ¶ÆØ™1‘”µ´á§ Y'üÚù!ü‚ˆ¢ÀXã ž¹¦}æ.kQ(b¹¸íÍeuœùÆS~åœyŠsò( èQôè?õ™6JžRBá”Z5'•ôyñÕ>„PŠÀ©´žîmqë•]s'¯=v½H8·úòkãÂÝ%´$ 9¿tÕ¾ó$žÁ-I>ãÙ­üÄþ$!÷ðÚ÷?ùétÚ ‰iÂ^Ýðá ­Ô–{lÛòå;œÏã=Úö=eH†'Æ‹_øNܧ³MLîÙ{ê‡K†xËìÖÜÎikFG¬%„N‹¾]××™c§V,K8|&‹yw9uú¨ö.<5ó©‰ö߸mRkG‹OÌ2íÊ„„ýdT¼ùí¤þKdoïšCÖ¿³öÈ…9EfªölÓcììéC[itlNež­»xBˆQy@N/6 í¢ä(!”éNmoȇÈê˜Ú+¨uk§ò>›”RëÕ]¯½ùK»W—Žö—SJlº3ßoÛöã©+…|ÿ®ƒÇÄ<⣬ÚÅÓš÷Ç—›vJ¹ZÈ7ñõ&…¬ä^+JŽçÓ ¡“_¨¬˜u°âÔŸ¶oûñÔ…çè÷ŸÉ³F((ÑŸOܾ5ñÔÅ<ÖÄ·ýFŽ~,PÃQBļ¤ÍëöœÌ¸Y`´¹{›^ý;rɇ=^Hšw|ü¹Ø(?Gk;!öˆå%m^·çTÆÍ|£…*šø…FÚN]¾Ã÷’*ð®íOy=ÆU%Ü8¶åýõ¯/ Þ¹¸§ O §>zqæ.±ÇØé‚rN†¨J7Wó$¡àÏý‡/53zg±ˆ j*¡¦”ø)”#¦¾=óè膥‹¦sÍwÌî—0wñ÷ʧg¬èé%É¿¡÷u•b½b§ð6<žZ´d VF©Ú[ÃQóùøÉãã {Œ›¶4ˆ¦~³vù‹SŒ›âÆ*iÃòlØZÁ™¯OÖÛn&],¦•Qã…_S…–“BTÅ{Êô·à•ÖJ}ÚþMkÞ›.i±snW ÷ ÃéÒô·ôÿ„RJ)%÷rh†úrh€< .1ÂD‘•ÅN¥ €XÞÉ’öåû‹åQ#_ÝÄxúëMñ˨ǻcÚÈ*®Át>áÝå?±ƒF=é#ËO=üå%¢(Ï l«M¬e[3ö½¿p.dÀ°ÉA.´P¯v“jMßûþÛ{‹; 9Õ‡fþ|ë»ï›.Ò\FCÆ™ó¹ƒ_çï ;÷í–o?;ë>xÈ) þØ»eû*ç€EÏúËk;­éˆ gÎçº?ÆOn¸ž´o×æØ ÓûËË‚Ë{¨bNØ3*BHˆ[úc¾>qÝÜÃY®;ºvo¦×ØïŽPp”„7»øÝñ”BÄ‚'•$-ê€È>‘!JŽJIá¡ÕÛ3ÚNK˜6¨™”’öÚ›¿ŒØ´÷ÜäYfž jÞ3¢½O;–ÈB¡ÂÛP¸ù·ò•QB)e…GWo¾ä9:îØ`G ó7ŒÝ°öøð¥=œÚömͽðoý“žŽ¹§~Ë"¼õì‘4cgIúá?M¾Ã;5•X !*ÿ°Þ‘m•\d7ï̤üpÉØ%TUîZ±ÂãõÐyÀ?uaÝä Ÿ–þíüè[‹Gµ¬ð\+>³û‡,ÿ‘ïìÝTBH [Áɹûþw%¦MÀ­ÈŸ%ïù_®û ·& iî@ i×ôê¯gSJ¢kuÈ‹ï¯f”r"&V|v×¾ ×Ç^{ù)?9-‹Â‹“w}{­Éã &ö•SÒ%ÄË<ïí¯öœé7­ƒ†ˆ»m‡–rìvóÄÜoµ=¢{uPRÒÊáï+OŸÉµú{Éj7›´¦# d„…wH§ö-å44¸iöé·û#óÑÈ:¨bkæ‘MË×ï;ššeàT£ Õ™DB¬Ù)W¬ÎݺyÉ9ŽRB*TÒm&‘²¼…ÒÒßœ}&Íl»ºxXø’Ò Q‘iö>¶ëe/?}>zØè§ŸŠjí"!Dd§ð6hÙ¶!–¬ä fMÇH%ÇQJ¨Â·GGÍÆSe™»;»¶Ôßw𢡧ߟo<7V–ðï×ÌmeÇ“r=zus—ÒkåûM)•7 ò _ÞÐÕ—gÝñ¡ò€Ê{ð¬1mK:äP™ssJ+ pcË»tÍ"d6çù¥1(E‡\“Pqž´L›¦m[7‡’€’V¼DM«‡¸¶¼Ôt³2¸}3y…9­y2,ÊV¡ž¥…ÚÁÊ}ç.æZ:¨¹òИP*uöv"]‘…¥.žjrAgo=Bp‡Ùj<¢ÀŠ‹S‡&-\ÈÏù‘8Üs–peçÌ9ñú¨© _uc—w/X¸¿dÇsD¨z¯åŽ“ªl"‘G¾ºrZˆ²¬:©ÒÃUªp½bO÷¤}[7o™?nËŽ Ÿ¬¬’ûÛ)¬¡ƒ ¥„VåqtZùoVÒ%‹÷ˆìã½lÏ 7#~Huí3µŸsÒÖÝÇn ¸ì±ÀÇV~¢JäR"XÅúõt#>4@žp÷~NbñJDYèØY£ZÊËcPyGžê*µ%‚ Öz‹¢ÈjèîR)P+ ⫟å%J¬eã±ò"Úîf¶šŽˆW^^&!¢¥.¢=SúñT[àÌ OöÒJ©ààDB‘y´õ“múýPš¡cˆºruÜfRuR·V>Ó¥‹T;¨¥Š’Š I%¿îOÏ‹èßïýÑv§ÄÌï¬æìÚÛ/w–“â<£P–(È<ÚøÉ64@žðÝêÁbç”êÒ“·\»JÝz{Ë+.`%”&0BˆÄµ¥—ô›”S×LÁ-µUâêëÉw.9Ëܪ…¼l~‰«¿—ô›sÉÙæV>rB‰5ëôyƒDëßTFn‡Õ²8­ÍÙÇIå’{ÞÕAâE×ïˆÛåøX{UVzQiVC»M~Ödü¬iâ„á>jã™´¢ÒÄè6“ìì k÷—†iÇîxeûTW/…)'½Ðoààeö/{ŽŠ¾îJËõõLí¦æ‰íÆÁê…5äžíƒäÛ¾‹ßÚnX »Yج׀va“FùŽúlÎÅÒó߬]Õ'vQ˜¥„‰wß§?YŸã1j¼ŸƒTöÈãÞ«Woµãßð—×û~úﱄ O¸OñSûaýÜÞüáÃeÜà¾mÜå–üÌbmÏÞ-Õ¼ÊMEóÏüvúšg¯¶#ú{ÍûrÅâ“Qí<•æK× ¥—ñíŽwD5¡Ãû¹¿ñÍòlÈ#AML&¯.áÞ!ÃÓÎÿúÃOžz¤9½rxÏ—ÙžC&†¨ëú 5QM ðNî®ü½lQæ7jÉœìwããæg&ŒI5ž¡>žBäAãVmp^µ2!þµ:+/wñh×7@#¡ô¶“ªS†NZ·ÆuÅÇ_Æ-HÐÙ䮽'÷"ÍMùñ³„“ÙfÂänmúÎ~{t œ3Û+´_ÅœK¯ésŸzããõ¯Ï2)<"cÛF·óo5þ㵪å+v}0-›¹…OY=ã™`Eéò|³Gž ùཛEûÉ)å´½¬^føx YC÷GÞx 'ÜŸø)`øüyŽÛvÜ»&±ÈæàèÓ)¦KÏ–jIÓȘÇÅØv K»g|ÏyS³kû_~òc‘—i\ºz«xB !¢(ˆB•Káò–ÃçÍsÜ–ðóî¿50÷nÏwõvk1ä•ùŠmÛ~ÚüAsmÑîé¹£÷u¸—kk8¢ …O·î^âAN8dnü 9·VI¹’RÞ9tØ«qCËë§|JÍ“dþ/í:ô"åø »D¥Mº>ûÖ†Ñåórýb+_šr”¥½Âš8xG¿úi¿¹%·88Ž£”Hštyfá¦Q¥wDJÊʳÙà5DzÒ]“4fã¡Q„ãJÞ#Py·©KTü‘GI¥ƒxÀ¡s¿>ÎnÕ#m<‡5_*ªòòHÆcL«Õj2™ ƒ^¯×étF£144ôŽoJLLŒ‰‰ÁˆVF›Íf³Ù,‹Éd2ÅÅÅEEE………:N§Ói4šˆˆˆ:<$%%EEEÕŸS c"³3˜c"«8HQIuÝŠW)½UZö‘1F*ÎTúŒrÕUUi»«¬¼†j+©´Ó'Õr¶šŽ¨Ò<‚`3ò té©©çµZ¯èèèZ6\ûá°¦§Ý(®2<åšûk«½' ¢äädÆXJjʈ¡#îê Ÿ°'!8 ˜RzöìÙÚŸ322‚‚‚|||\]] Ïó÷ïèÃÂÂÖOIIIz½^£Ñ8999::ªÕj•J¥P(är¹L&“H$‰„çyZ¦|AÜO¨õ•ÊÑŠi¥ÏÔÎeåÒžr 5]°¶»Nûª²’J;]qR-g«iCUæ¡ôÖåÆ(ˆ<·8¹êÛ,ÿêƒp¼* ä µÅ5}bý¡þv9ôœä 1z_;oÔèL Èy Oä €<'ò€†B4dœ:rä¢^`¨ 4 ò(a:·î•9ËåÚ÷aZ²“6-œ0jpˆÈNÝ£ŸÿÚê_²­ ÐÈá}Ìÿœ( Œ5æ ×ÌpvÍÄãR”ížüß7®àŸ§r-„¢Q'<Ø(¯ðôî•Ë'_×ó.mž^¼rj;Ç N%¬X–pøLóî>rêôQí]xJˆ•øÁ[k]¸q³ÈL”^]=Ó‹KÚ÷ýÑÔ<Ú$ çè9¯hãÈÓÚÎF±æÛ¶|ùÎ#çóx¶}cgO¤áŬÄÞZsøÂœ"3U{¶é1vöô¡­4~òø¸Âã¦- ¢©ß¬]þâ㦸ñrN(J=v*³yì›óÚÊsOnY¶yÉ ¯èØñoSßü%îÿVÎkÚnû¬¶ÊÚÎFM)ñS&&(GL}{†gÑÑ KMçšï˜ÝU^”zìT¦÷¸¯´VêÓöoZóÞtI‹s»ò„âñÔ¢%µ2JÕÞ!}óÜÅß+Ÿž±¢§—$ÿ†Þ×UÚ [£8yËé²î‹b;»ÈøÒÈšÒ’?Ìç×£Q'<¬ðøª©£>]òbkGKÂRR˜´zó%ÏÑqïÄ«8úH˜¿id솵LJ/íáBaDåß­GXˆ’ëä•ùóˆÍ¾bv×p´£â÷³Ë´´ñ—×n6ýñÕÛ3ÚNK˜6¨™”’öÚ›¿ŒØ´÷Üä.¡Œ0¢òëÙVÉEvóÎLzáÀ—Œ]!DáæÜÊWF ¥Ôt)3OPµ ïÑÞ‰§oÕ “­àÂ…b¦íàïÈÓê-…FhÜð3Ô#–¬Ó©&MÇÈJŽ£%±d%_0k:Fú”r ß5æKe™Ë;¡SJ ¥²¦þ®ÄœW`&”RªpkáLŠr‹ERÞUý³Y²Ï¤™m.Ù½sD÷ð«.ºŒLƒxkqJ)•7 ò ú:¡´´l !D4|lWËÞ—Ÿ~þÍøïS „†Þ¢@á$œ½–B£4r¸Ÿõ+0e„rö®bU¼L)aÄΓª™”‹P:E"—Ñv7³ 6‘È#_]9-DY¶5ªôp•P}¥=‘È¥D°Š¬l¯a¤ôÁ^¹ÿè{º'íÛºyËüq[vLødõØàÒ# 1Jpöõ’‘ßÿÊ0ˆÞ2ž¢Q*¸ŸõˆÌ=ØG¢;yôª©B$)óhã'+&ÚÕ°ÿ“ç U^G€Fhôp?êê9q¸×s›gÎb±C:h冃_ß耰I£|G}6g⿃éùoÖ®¿ê»(Ì©®»™s®Ý_¦»ã•\ìS]½¦œôB¿ƒCœjZ@êÙ>H¾í»ø­í†²›…ÍzE7ýso’èúÅ„K IDATà®´\?qQÏÔnj¾A·‡cØKs$Í]3î¹³#‡ôjÓ¢ _xíÜ_é>£fôG£ Oxp”!×®qYñÑk^Ý¢å^ýfu~4@ÛjüÇkUËWìú`Z6s Ÿ²zÆ3ÁŠûÐsD:iÝ×· Ag“»öžÜg`Í!)çÒkúÜ§Þøxýë³L ÈØ¶=Ú§üøYÂÉl3ar·6}g¿=:PÞ°;¸ðMz¾±}C—uëvý²uñö+“¹¶h×{¤U h€F~á¦Ê‹HcŒ1A¬V«Éd2 z½^§ÓÆÐÐÐ;˜˜ƒqVF›Íf³Ù,‹Éd2ÅÅÅEEE………:N§Ói4šˆˆˆ:<$%%EEEá”Rÿ ‚`4óóóÓÓÓSSSµZmttt-Îîc¢(–þ=”cc¨ @žPOˆ†ŒSGŽ\Ô ì~.n>¿úùþ#Vž.«Íg½~`˶oþÖ#OxÐÈjd:·î•9ËåÚîëâœÂû¹·»š§v&2&2ÂiøQ­%;iÓ £÷ˆˆìÔ=ú‰ñ¯­þ%ÛÊêS£ˆ9_ÄöìòßsFÄüŸ^Ò-"²Sxd§îÿéÿôø©ÿ÷ÅÉ›$wK‚*€FIÆØý]\Ú|èÂOž¤”£´±V#3œ]3ñŸe»'ÿ7Æß+¸ðç©\ ¡õ«Q˜(W2ÉZ˜™mm>zÉŒ®JÃÍkWþ>øùÒØ] #V®™ÕÍYBñ/y4Ô¿ðôî•Ë'_×ó.mž^¼rj;Ç N%¬X–pøLóî>rêôQí]xJˆ•øÁ[k_¸‘Sd¦jÏ6=ÆÎž>´•†'„’¶ftÄZBé´èÛu}U»çN^{ìz‘ qn6ôåׯ…»—„շزúâÎ\õÓrñ“QÏñÉçÓÛ*9J,Yã—®ÚwâbžÄ3ØŸä3¾¡_ÄfÆ3ëÆ¥¸øðÓé]œ¥%„DN(ÇQBÄzÙ(„0FˆS@§.]šð”džŠÞ>mì²ïwÚ²0Ê™òh,6N·67ìÙ—ÞëàFó œ´”šÏÇOWØcÜ´¥A4õ›µË_œbÜ7>PÎ E©ÇNez[ðJk¥>mÿ¦5ïM—´Ø9·+O!O-Z2P+£Tí­á(um?xÊë1®*áÆ±-ï¯}iðÎÅ=]xjw‹Õ¯!A,ùËpê£gî{Œ>!È!çô·ñgˆª¡·Fqò–/ÒeÝÅvv‘•u®¢¥7OÌç××ÓF)ÛMJ)%„òJÿaÓ‡o»mãÁì>ôR$ È Áa…ÇWmLõõé’[«JÂ@JIaÒêÍ—@ÁQÞìâwÇO4ðÔVpáB1Óvðw¬ö+<^ÿ¥%…TáÛ££fã©¿²ÌÝùÒ@°„¼Yùò†N(--RòÉšydÓòõûަf8•Ä(Hu&±†-Ú[ü¬Ù)W¬ÎݺyÉKÖÓ8žYB'áìµTh” i ñ¯ à.a¼#¨_)#”³÷ëT14¤”0bçV*‘K‰`YÙü¬|´!ë•3çħø<½ð£ø+f<î^Öi¥†-VY¼¿¨e Ža/Í4w͸çÎŽÒ«M‹&|áµs¥ûŒšÑ¿%êþ5JAêÇÆ›×.§üâó¤ÌfÃV̉òÀ`GÈ ¡R†L\»ÆeÅG_¬yu‹^”{õ›ÕùÑm«ñ¯U-_±ëƒiÙÌ=(|ÊêÏ+n7Ü çÒkúÜ§Þøxýë³L ÈØ¶Ñ#G.™“ýn|ÜüïÌ„1©Æ3Ô§d¤N»[lVuñvNüÞ ·jƒóª• ñ¯íÔYy¹‹G»¾IïèÂ7éùÆö ]Ö­ÛõËÖÅÛ ¬LæÚ¢]ï‘V8Ô×F‘8z4á~ÞòÊÔ-„S»7oÐ}ÚÚçžèä¡à‘%ÜÕ…‚*ï+aŒ1ÆA°Z­&“É`0èõzNg4CCCïøÜPbbbLL Eç?€F„•Áf³Ùl6‹Åb2™ŒFcqqqQQQaa¡N§Óét&""¢ÏIIIQQQ8¥Ô‚ ÆüüüôôôóçÏ{yyEGGײáìþp0&Šeâ)Ç—„ž )wëñV& "+Ÿ‰0QIé'&Šbɯ\ÉWK¡”ãÊ¢Z{[¬º¸Ý•·N™XþËZq ü4Pñ°¥\écÚõ§Q*oC¨´JZ/Þ„—œœÌKIM1tÄ]Öö$SJÏž=[ûSbbbbFFFPP«««B¡àyþþ]bbbXXN×õSRR’^¯×h4NNNŽŽŽjµZ¥R) ¹\.“É$‰D"áyžÒòÑ„ËrnÔÔ7”rÕC»…„T)­ø‘r_‹5Ô4©Ââ¶Âô´ÅB•é¼Ss­²ê&(ß(Äþaý›Ró&k^%Üä w \ðÜâäªcþ8<²ü«Â5.¡ò€‡×ô‰õ‡úW/¯ÐáyÀC‡òèɼ?'ò@žÈy O€‡˜{tÛªOåØX=ÞI±àä®OÖüxÍÂê`U$|üñWÍ mÿ 5€<ëõ[¶}ó·þvy‚hÈ8uäÈE½p"¿úùþ#Vž.Y­öÜ–›´sûWÉkÈáj]·H­Z5P×ðž5¨×a„0Bjxõ±éܺW朵e›¿¦®ß…f9÷Ù¼E?¹™±$ÌCbS9ÖðúeƘýð’Sxx7÷vWó´¶{^ãªþˆ?ÿ§ùcçý/ÛÆá5žÍ›vðüs:4•Ýî=ÔuÜ"5·‚Xpàñ ~ºadŒÎÁÙ+¤[ôèŸé­u  ½æ'ÔA4+ ÷%ÄrO&]×ôyuÜãT%„Rz—k6ºð“')åjXò~íy±ff[›^2£«ÒpóÚ•¿~¾4vWˆ•kfus–ÐÒ"·kKÁÕë†Ïÿ߬.j›>ëâ‰/7ÆÏø#7~Ǭê†^óÿ>ô;€zÆ’uð“Y#<Ò9¢ß€—>:š_ÎY¯ìš9°_ÏÎá‘a|yÝÑì ½‘ÒÖŒŽˆˆì9~ȱæÛøÚÈ}:Gôë?þÝ=çnÛF,8µýÍ1CúuŽx´ÿØ×7ŸÊ/Y0䳂}“zuïÑ9¢û“ñ—LbëÈOúhÂШÎDšùñ¡ÌÒnî–‹ŸŒèÝكȈ{xõœÑCŒˆìþŸ—¾¼ne¬Úž3BÈÍoç=Ñ»{çˆèþ± wý}_úSÕc„8têÒ¥{ŸÇG¿~òø¸Âã¦- ¢©ß¬]þâ㦸ñò’kiN}ç/(§Táæ%«ùòš`wznÖ87SÊ·ñëg¿dZ·eF;G¡$® þÜøRÓ1ó§wp‹¸ ¦šUmÏs !2¿~“žéÔÄ–ñóg«Þ›!i‘0·«†£ÿf«Ð„P^é?lúðmc·m<˜Ýg˜gݵȽ´¥”Rf-¸zrïW©Ì­_7)m$5€<€BˆXptíÞL¯±ß à( ovñ»ã'J#5NØ3*BHˆ[úc¾>qÝÜÃYI!DáæÜÊWF ¥”þºz{FÛi Ó5“RÒ^{ó—›öž›Ü¥‹ºz'Vx|õæKž£ãÞ‰ Vqô‘0ÓÈØ k_ÚÃ…BˆÔµE«VA z‡^GMûľ8݃őã¶m81îƒ^®U7ÆÔ‘}"C”!”RCÕ='Bq îóXï¶JŽvkví× ~¸d쪢õ%\¥rïþ’m¥d™Y³ºj‘{j…“óûFÒÒú}ž^1¾“†§ÖÆWóÈà!fÍN¹buîÖÍKÎq”R©{¹5óȦåë÷MÍ2p*‰Qênõ@¡¤ä²2!„X²Ï¤™mW _R$Š‚¨È4ˆD]ý~€%+ù‚YÓ1ÒGÉq”ªðíÑQ³ñÔ_YæîÎ|¥uß)~æJ¯ºË[D¶Ó|ö×ß9–²Kë•f£´r°[qÏ+ÌC)¥rÏ òå P¿‰ñV‹l®“¹§Vš¸f^75±ß¼|ìëøø/Ø>üln{Öky<¼8ž#‚ÍÞX–Ö+;gΉ×GM]ør¨»¼{ÁÂý·¢;B»5$’`‰<òÕ•ÓB”eA Uz¸Þæ¹ÛŠÁ"¥„‘{zÄUFùÚtX©ºçU¦JäR"XÅúÕMÞ|ýÔeó v§éuÜ"ÿ°TÚÀVÎ%$¤sŸü§^úzç™)¡îõ³æ%¼¤°°ÐÉÉ©–óJ$ˆÖy<ôdmýd›~?”fèR¥“)ýxª-pæ„'{i¥Tp p¢J&ðrg9)Î3 eAŸÔ­•Äté"Õj©*Kk¸! óhã'Ûtòè5S‡ %¥Ä’ñë)½Ì·§¥¶rÌúóiƒ¼U°»ìNk¨¶çõ3]Ú½l× e¯É½<„ÔuÕ"÷Ö åOb+.03¹£üã´ü{5ïäè”t<)¼kxmR…£ǎ:iœ(:?òxÈQÇn“Ÿõ?kš8aD¸Úx&­¨ôª²ƒ6Ä‹®ß·Ëñ±ö>ª¬ô¢²‹ÍRÏöAòmßÅom7,Ý,lÖk@»î/ ÓŽÝñÊ .ö©®^ SNz¡ßÀÁ!Nöc¦Ža“FùŽúlÎÅÒó߬]Õ'vQ˜Ó]FfÅiÇ'”†ô£»×%d·|iYgÍ×P}Ï[ÕËv Rÿ8î¬0Þ¼v9åàŸ'e6¶bN”‡„×Y‹ÜS+è.žüÃY-ò¯¥ü|Ëþ"¯‘O(hvý¬y·&n9¹9?ýï'›íÎ D"qÒ85umŠ3 O[µÁyÕÊ„ø×vꬼÜÅ£]ß„R‰ß¨%s²ß›ÿ™0&Õx†úhxBçÒkúÜ§Þøxýë³L ÈØ¶ÑíüC'­[ãºâã/ã$èlr×ÀÞ“û q²ÿÒ/y«ñ¯U-_±ëƒiÙÌ=(|ÊêÏ+îb˜^Ø%¤é/›çÏ0Ú$ÎÍÛôž?ñÉ€Z¬¡úž·ªwq‚£Gîç-¯LÝB8µ{óæݧ­}î‰N žR—-òÏZAâ¬u—í_?cÒzBx¥“[óvƒçN}æÉ޼-§~Ö<¥Ô½©»[·ÚÏ“üknª¼d„1ÆÁjµšL&ƒÁ ×ëu:Ñh ½ã—5111&&ßi€Æ„•Áf³Ùl6‹Åb2™ŒFcqqqQQQaa¡N§Óét&""¢ÏIIIQQQ8¥Ô‚ ÆüüüôôôóçÏ{yyEGGײáìþp0&2±ü÷‰RŽ+‰Å ]ÆoM LK \ÉЕg¦Üí¨0sù HÉã¶ìNËVÚ|ÉnQ»k°»¶*{N*ÏÃDA$ÿ/ŽÍÉD¡R•ÓJ¯.«Ûù­Py÷*V~½«ùäää{|³ÛÙ³gkJLLLÌÈÈ òññquuU(<Ïß¿ïIbbbXXN×õSRR’^¯×h4NNNŽŽŽjµZ¥R) ¹\.“É$‰D"áy¾ì1þ[ˆû PïPÊQÞ~y ¡å8þ3Û ÓÓnWÀ†òNÍýµJ®†5W.½íjÁ*®Áî6ªîyåyj<à׷݃{j‘Ú®ív‹Õ<­Á×<À¿y<Ä‚ƒ ž[œ\u‡G–õAx­^¦uïk@žP¿pMŸX¨õrZë¾%÷¾ä õ ½çþÙ”G_xhp¨@žÈy Oä €< .Ù²~\1ÿõ=—Í uÑ(šCÈ=ºmÕ§‡rlìn&òb>¿úùþ#Vž.òOøùx†Q`EsX¯ز훿õv’ÛL€;Á{Ö .QZ/_MÌ)<¼›{»«yJ!Œ1F9Ö‚˜óÅ„¡‹Î b…Úò¿eÇ89÷ šC¼ùýäaïüæ÷òk‡ûÈjüj1&2Âa„ÐÚOä ðГ6ºð“')å(‚Å»ÂDAš?»tf _RwœÒK+ãLsX.íýì7‹\<³ikJÿ9¡j­€<^ÖÜcÛ–/ßyä|ïѶoìì)C‚4¼˜•øÁ[k]¸q³ÈL”^]=Ó‹KÚ÷ýÑÔ<Ú$ çè9¯hãÈSB¬WvͼöØõ"AâÜ"lè˯ w—Pb¹øÉ¨ç¿Šøäóém•¨á»åäß¡sç&|YN)Ds°¢Ó›vg†¼ü~ßïg¬Ý4þƒGÝ$eû`É:¿tÕ¾ó$žÁ-I>ãËoHÔ4IÈ=¼öýO~:vCgbš°W7|8H+µÙû²ãů?|'î‡ÓÙ&&÷ì=õÃ%C¼ev ‘·ò€Å”?eb‚rÄÔ·gxݰtÑt®ùŽÙ]åE©ÇNe6}s^[yîÉ-Ë6/9á;þ­q꛿ÄýßÊyMÛmŸÕVÉQÞµýà)¯Ç¸ª„Ƕ¼¿þõ¥Á;÷táK.Œ‹¨Þ†–¸U <€æóŽlÙ/ö|ï?C<{ÄÍÛšx£÷¨æRJa†S½8s—Øcìô A9§¿?CT¥¹EÍ“„‚?÷¾ÔtÌüéœÅ".¨©„Úÿ²uÈK˜»ø{åÓ3Vôô’äßÐûºJ ±^±S€<àa…ÇWoÏh;-aÚ fRJÚkoþ2bÓÞs“»„2ˆʿ[°%×É+óç›}Ä ì®áhGÅïf=–iiã/§œ&°gT !„·ôÇ|}⺹‡3î!Ü“?߈êþféßÊ>«¾|;ÜÜ÷æ°]ÿnëïê¨;;ITÝž~Ìyâö¯.>ùR+%GÅ‚£k÷fzÝøîøGIx³‹ß?A !ä6“!„1u@dŸÈ%G¥¤ðÝ/[ˆ,3OPµ ïÑÞ‰§Kº í Ox@,ÙgÒ̶«‹‡…/)ìDATdÄÐ’”RB©¬©¿+1ç˜ u¤TáÖ™$ç‹„bË<²iùú}GS³ œJb¤:î"Ü«–>œæD !„Jý”î{s˜Óö%\ÐYÐJA)Q¶>ØkÏÞ/RÆÌ餡Öì”+VçnݼäG)!s¸Í$R¾Ë´4Æ7×ðe“ö>¶ëe/?}>zØè§ŸŠjí"!Dd§yÀƒ"ØD"|uå´eywx¥‡«„ê+ýzɤ”XÊFҔȥD´1FˆõÊΙsâõQS¾êÆ.ï^°p?ªôÞ©½ƒ[·.{>RJˆ@îssSöì»f»¹îÙ¾Ÿ–Æð‚ æmÿó¥Ý ÇsD°‰ö†HºÍ¤ZÙ¤ ·Ñ+ötOÚ·uó–ùã¶ì˜ðÉê±Á*¹¿B¾Nß?tT@•Ö¯K³I¶Ï¹~ªP4ê,f"Ë̷昘XÛ_WùÈÍN^™–g±4豜¨$z¸ßDJ—S¤½rŽå꬙ŢpGÍuR²Iþ¼Ïo¦˜HéD™êµX­Û¯—g¶Z1ò€'iÛBZt!{÷߃H!Œè?ü\Ï©}¼J)¥b°|ʾ ñAC‘XzôEù‚h³ýðCF"!âÝDð·©Ê¾©ë›ÑÖéßê®ÙÊÚRžâÈ!œ¤GoÏQ~*NJÄœ¬â=ÿËþ>[ õjßìÍp•‡ŒØLÖSÉ9/ÎÊæ÷wðPrR"feîM#Úh:5å™Árâ¬Ušô%wxIûŽncÛ«ü•ìfVÑÎÿå$f‹b A«“Œ:¶ñÞÞšB®ÿveÆyÕ{ϸ^û*탫\§p÷QAr /#ŸÒž›µi:©›ck5%6Û±CWß?cµBiá»;œBÎ~iÞAl¸ÅMæ3W º •Åx‡Ñ£}ú¥g¼tÐd¢’.uR'ņܿîóÃ-¯S ½ IDAT1U­«Øú€<ê#Êûú(Ütyýl69H#»4}q»º9+ÙÌ ®nú± ÀLÜ|\_ìêùBöå¥i‚P2AÞÊý&³R1¸—Ë‹>ÖC¿å­<&¸ø7‰í¡Í»‘—ÉDB[võZØ}{8s}!íØÕ}â@r}kV²Éþ-JIÑ…¬·O˜ÍŒ™‹­á9J %”Tùå¯:h,䨘#—9} 's¦YE…D•/”w’É9}cÉY«•1CaCNJÂlJK,`L`„Âq”§¥MV'uÂòuKNÛ>Þlbvú²T›­òÄÙú€<êe¦@©1ÏðÛe£‰?uÒÃ4½šäüu],Î):|“FH–àäÓ×[*M„²ù_1šˆ!K£þ¨³åç?u¿›»&†zuj.•dY¬ªg;ÉÎÿryë•‘½¤ë3M¢Ýrþʨ1€·-i9&#Œ‰¬Òîr‹“.M„FdͤŽTLI/:y] !ú&™‹-i9f køÁh³f&–DqÁìÍ9çŪMVu"æ]Ê~÷wŸ%}=Og]ûÁXiÚn}@žõc„0FÌzóMâä.§„Ò¦¾.±Ýœ:6•(Df“Q›‚rUçg¹y“H%Œ™³Ú®I+Ç"Uɽ$´Y_ßÝ}J[޳†£T¬9ŠgŒÔ4±t÷!æœüÝéšØÁ¾~ç ¾:Yp$[(¿În·†%7÷Ÿ zÆ!Ìf»b%Œ¿?uÂÄsÇ®oôöyá?Î)ßX*f"Mýpëò¨Ïé‚ Ú•P"qv~m@åù›Ëó©ì±ÿxF2RýWQ`Œ”GÌ"0Ž#”ÂSžˆ¿¸¶1SYilh*„{m–¯¾ºôG §Á]fƸ<ñ[ÆÇÍÒ¸âO‹å|¦±üùv?ë„Ù,_'Þì:²éÔÐ\cY×ßÖhÔ0Š14.Êœù«ß Žß0¥Þ0^6Õt¡ß~±µÈtMà|\YV®ùJ®år®år®%ÓT7q"ÅŒ´üÕ{.¿~VlÕÁ¥¥”P&êmD¡hDï `¤ä>»ÿub-ЭøÅäÝÅ­½¤4¨Ï­Јá~4)“4y¢›³þœñºUªu¸»á2™¡xÛië’^óHîV“D¢•›÷Ÿ) ç^~GÕ· 7­F^ÚΕçÌÖb‘Áš’#jÝdpfÁe"Që‹~¾!<<£ëÜs°¬¿³ÖùNò)meKa=m}ä ÿ2k^þ’’IÝšÌjÍB¬fëßwó’/"þýkúk÷1!M¦wày«íÊ¥›GÏšô÷¼cR¥<²‹s[5G©˜›¥_÷}ÁaD8v(ëûh·yɬÖ?~3ÎÌÍõë:¨Áºÿ7}ÆMQÒú¹õ´õ7ÊX¥£Œ1Ƙ V«Õd2 ½^¯ÓéŒFchhèß“˜˜CñV€F„•Áf³Ùl6‹Åb2™ŒFcqqqQQQaa¡N§Óét&""¢ÏIIIQQQ8¥Ô‚ ÆüüüôôôÔÔT­V]ˆKLLÜ’Õ±bosJ)GXyßqŽ£„1‘B Wa¥¬¤°Êü”ð”ˆe§VYUÉȦ%«(_Üþ¯cåKwCdb “hÙ>‰Fòáh­¶Uß…jÇ[½üÞëÄîVn5=y ­Ÿ,zÄÄÝÛÉììÙ³µ?%&&&fddùøø¸ºº* žçïßÑ%&&†……át]?%%%éõzFãäääèè¨V«U*•B¡Ëå2™L"‘H$žçi™òq?ê]jZñR±XÐ1"2v‡ù©kVYc„U¤“ãµ®REÕþò¬¨ÀœeaU.W—ïF•uVÚÃ*å¬ ‰jçx«—ß{ØÝJ¥•ÔyëÀ O€‡§TÏxÚ=ˆ«r ”%}yé½+ú®ò€‡‘X¤{euaõ~LdH'ÀCœ*à…¼5Àû *ÜO€ÙÞÉ&½³gþb ÷¯y@­ñEžPß ß Oä €<àA±eý¸bþë{.›Yå¿Q!¨ä +NýâÝ ýûvïÞã?¯Ìju…üÓ~>ža«ô÷C Ј`¼#€*,ç>›·è'·13–„yHlÊ G®Æá˜cŒ°ê7bΆ.:+T|]›W÷~6È]BÿQ…ˆ9_Lú®eÔÚU/ttäK×Qœ4}À¬Ì—6Žð’aà+ä õ”{2麦ϫãï â(!ó¨­L¡ù³KgvÑð%ÕÀküœyzO+´Ûøòëž[— iáP²"&‚€wc O¨9FÏJüà­5‡/ÜÈ)2Sµg›cgOÚJÃSë•]s'¯=v½H8·úòkãÂÝ%´tþCnÜ,2¥W—AÏôâ’ö}456 è9zÎk#Ú”^¶¶æÛ¶|ùÎ#çóx¶}cgO¤±ï †¼bV°oR¯o(!Ägü–#u‹†NIµeë_JlWwŒŽù,`åî·CŽÐÖÉ¿CçÎMÊ+‹Rj8µàÉÉÿ¼BÜ:¸Ÿø`Æ:¿Ï&¶¯Ö°¡y4œ<¡(õØ©Lïq ^i­Ô§íß´æ½é’;çvÕð®íOy=ÆU%Ü8¶åýõ¯/ Þ¹¸§ _2óØ7絕çžÜ²ló’^ѱãß§¾ùKÜÿ­œ×´ÝöYm•5¥ÄO™˜ 1õížEG7,]4k¾cvWÇH§¾ó— ”Sªpó’Q(bùo&Š‚(><˜(ŠbÉíJyJKn üã á|†/î9iþ¼E­?{çQ÷ʱȃnh@ž %*%*ÿ°Þ‘m•\d7ï̤üpÉØ%T¥ ìH!$Ä-ýÇ1_Ÿ¸nîá¬,¿[°%×É+óç›}Ä ì®áhGÅïf=–iiãï ?¾z{FÛi Ó5“RÒ^{ó—›öž›Ü¥‹º¦>ER×­Z)(¡”ÃÃÝ"§ßz¬×ÂÒ¿›Û¸sZÈ=®JÜ{Í\úÌ ã-ê¼t¨K¥$â74 O€„–7 ò _ÞÐ „X3lZ¾~ßÑÔ,§’©Î$VšŸP*kêïJÌyfB)U¸µp&ɹÅ"a–ì3ifÛÕÅ×”æ"¢ *2 "Q×<ð%÷£ ·´Œ]ñJ7GŽJ8‡¦rŽšîyœ:tü;“ÿ·ô]í—øU˜ðà'@ƒK$r)¬"³^Ù9sN¼>jê—CÝØåÝ î·û«&“Rb)ˆS"—ÑÆ!D°‰DùêÊi!Êò^öJWI-³ÊÉxb1ZEÆÈC˜9¨›·iRö|¥´n*„:øzãåÃÏ®|s÷ ʲTà_nh@ž ‹)ýxª-pæ„'{i¥Tp p¢jˆ–ÿ%ukå#1]ºHµƒZª*<Ž[ë_K'/'ú]êU TTÙ%¬ìí ÿndùZ‰º®*õü挃#Þ[],ˆõ¡¡ Ü…€ÀAâESwÄíúáØ™³ÿ^twïîâ\»¿4L›½ë•+÷$I:´ÿë­_ü¥«}L/õêó˜¯åè²·â¿ùùè±_ý_²}‰“Ö‘fûñ×´"w¼õw£©Î*Dâ5`îôβòHþ_nh@ž ,.õµdÎNÇãæO}áÙØ×ö{¶òÑðw±eè¤uk&v1Ž[0kÆ´wÖ~ýçÕ"ñn¶?úý%1¾Wv/™9mꌎɂº„¸H(ïùؔъ¿^±'ÍÄyÜú»ñ¿¸î*D¢<ç¥PIé«ìd~ÿnCÀ-”Uþ§ËcŒ ‚`µZM&“Á`Ðëõ:Îh4†††ÞñÎ]bbbLL nð4&¬Œ 6›Íf³Y,“Éd4‹‹‹‹ŠŠ u:N§Óh4uxHJJŠŠŠÂ)¥þÁh4æçç§§§§¦¦jµÚèèèZ6\µ& "£_72Q Çs´dpÎ[¿Y”rG«Îköꫪ¼†ÿoï¾ã£(ÿ?Ï3³½¥÷’@(¤÷ޱ¢g9°žòµã§Þéy§âYÏv?ñ,x6DN4 " ¨H é»I¶ÍÌóûc’eI'ÙM–ìçýâ¥ÉîfvæÙÙ™ç3O¿Ç›îõþ°áQE9uÒ¤Œ1u‚PEáõ/öÿ¹ÇüK´ñS)æÈeY!LPG@táÝ¥vìØÁ; wíÚÕþCb^^Þ‘#G²³³ÓÒÒ¢¢¢ ƒ ÁÛº¼¼¼Q£Fápšòóó‡Åb±ÙlV«Õl6›L&ƒÁ ×ëµZ­(Š¢( ‚@i㆟!…²Ój3§~¥žiöõ§ýÖø/A²¯•-O°¥f$›}'ÖÆ£Í¿¢G}/æHý«°ÿ  C L)U¹á©J£K¼ºÉϯ|v´…áÂ( '„!sÑ[ß^ÐôñžÕo9àÌPÝSZ€ùŽ999º–tbÍ ?úñ!7GYr¨äÊ_×}³åˆSæg”º#?ÿý‡Œ€b@Nèy8眜y­Öµ÷ß.|îÛr©çTñK?7aø­kÊ;SÇo¥X”ÒOçMqýkÛì~oP›Ïäñ¿[VìA®@Nè!õjEæ¼'Uo¹"˲ƒV,\‘eiï; ]Ytª›—ñ¦ÐI"ŠBˆ|"ïÙ¿¾þÝþã¥5njNè?þ¦¯E ÞÃ>tç›ÕÈbD¯Q—-øóÜÑq"­ý·û—Õ¸‰1yøÅ×Mdù«¾ÜTPA£3'\»ðÏsú[J!ÞòÍÿ}þùåßï«âL÷À]—d[ÔgZÕÂûrçÏ_úÛ›_ýzÒÅõ “þ不/IÑB)|ýÚ1oBÈ9O~ñ社öÈÏ) Å;$në³÷þ;ýí;7ùHºësä­œPS°ùç’”¹<˜ct~ýîëÿ¸Gìµü¡!jð컽*Ê$߼䙷]ÔoùS"õõ©óþò§úòíKž{ïé­É3çÍÿë\sÙÆ7ÿùâŸb}pÿ#£®Ý‹ïºc™qÎÿ=qoBͦÿ,zò–ºôÖ6kŒÍ¿¯rxÙCO}i¼úÞ&$‹•ǽ£4 ù“OÏJÒRjN±°[ d±°´+Ÿ¾2áÿéÉœ·ÿ6-NlÇÿsä5œ˜2FM;ÀÈÆŽL)É¿eÝWÃsM–¬ 3²!„ Œ-ZóûÏ·s0Ö¿~äøQìœä’oæ¼×û«f³0:ÔðÓº6m.ñôÏÐ9¶¼úÁ‘w/»ûâD %ƒ“Ê6ÎywÅÞ;‡7Ó6*Œ¬Ù÷eö’ Ù4hô„1ƒmJõ-ÇÛ»_ßÞZê÷PÐb¡bÜÄû]wËü'ŸÑoÑe‘m¿Qð?w@N€PDUúÄìxòÙñj™oÉ÷ï>ÿÖªM'ê˜ItÊšj—rÚë ¥Ú˜Œ(⮨rj¥ÔÛ+‚ì(¯U÷œÜYè–Ž>uÅè§ë³ˆ"+†’:…˜Û¨×üû³¯¼iĺç\½oæ×^}ùŒœHß •Ö¯~Ïþ€],Ìœ;ÿown›»è±?Þæÿsäå¸ ê5Dö*Ü{xù} ;füßã rcù¡yüëfÏjZ %ž†ùLE½†(ç„YRˆ~ì_¼{ ±¡¦JñQb[µùßWŸqí Ë_õþ{Kž»déͯ½zS?!”B8áj½¸ç¦„  Õe\óØ‚ï®ñ/ÝbTÚz£ gWÑ–)ë¾›/˜¤¡²5ÓF×µ#eø~ÒÄöM]Ф‹û˜|Æ–¯ùSJ¸Ì[}_JEKú¸«ÿ4æ‚éÏ\{Dzv_õð0>BOj+œrO Á)ªI›ý—{7ÌùÇ«µ²’ÕŸ; 'ÀYF—40™¾µôÍ­ç N3(ª9³ÉGYÔ¸Û¯Hºiéƒ÷²y—H6¸J‹ìé³f´5;œU´&YéÉÍk~(L×Âûzoøx“Ò;3Îè9¶õ€ƒ›cÍ!š„ÁÙúÿ®^üþ +²x™=qâ…ƒ"z€٪‚­?ZF ¶¬Á™Á*1ù‡îÉ»æÉ-ÎnøÜ9Î:šŒkž^xòï‹ß|xµ›p®±$ä¦Y„3X€1÷ÿ~=ê…}öæ#˪%}TÖ¤;§ÌhkvBÂyw]»ö‰O^øxê˜û~×ìûzËw¯y{Ùö“nÂõ±ý§>ðĵYzFiäÄ{ºü±½õèý.CüØyf² = aáð{ݳÄ÷Û GW.>/hÅ"&Í^xûçW¿ mz~îp:Úè¾'œsι,Ë^¯×årÕÕÕ9Žêêj§Ó™››ÛfS]^^ÞUW]…=€ž„7eY’$I’<Ëår:µµµ555v»½ºººººÚb±Œ3&€G€üüü3fàúdYv:•••EEEIII3gÎlç×äÄÁYá” õW¯¹"+„ ŒÎÅïÞ[”2ÆhãןzyÓE¾¿Ç›ÛïEáêß6ÿ¾ê |QÖ°§ž Œ±³ïåJ“;ž1Ahéã8ób9íkxL–õ]jÁþ܃iÇŽ¼ß®]»ÚHÌËË;räHvvvZZZTT”Á`„ Æ£¼¼¼Q£Fápšòóó‡Åb±ÙlV«Õl6›L&ƒÁ ×ëµZ­(Š¢( ‚@œŠí(;%”V›9õ+môL³¯?í·ÆÐx ’½¨ðx­Ühy‚-5#ÉȘ@Z{_zêí|¢g|-fG‹¥¹ÅPÿmà?whäSJÕ†GnxjGã«åºÉϯ|vt¾Er@ËXÌEo}{AÓÇ»¯g r@÷£ú£´·#ä@N€3…ñ ]„s^Z^Zí¨–$©íZš Ú¬¶ØèXÜ—z²²Š2I–¦MžfµXÛ¬ýÛöüÍù¥å¥q1q(:èzèw¡K«Õ¢ '©²W1:ÂÁ£m±Ym£GŒ®vTwòFÎ8\CÇ =BWzzúÆ=OèŸ#Ü¢(Çáp”••'&&†{‰Èå›–-ý-uÎMãcEÚòSò‰5ÿzéÛÔ›¾¬·Ž¢(zzQB‘$Éjµ¶ÿõ6›­==”šµ{÷n»Ý~øða³Ù¬Óé ÖÕa­V›žžŽÎQÈ ]'222""åpTeÙårUUU=zT«Õ†KuÁ½ïÕ[ï^?ô©ÿÜ5ÈÔèÆlÞcë–üwË¥ç_?®IåØÿ)¹ò×ußl™zÌ99« Eq&ºì ’žžÞ§OŸ”””ˆˆƒÁÔ»… $ôHèw¡~B…³EØÕ˜!>%5%Î,4·Ñœ+œpBxëOqÎ9 éæ2Çw÷{ÁŸ¨’O[MÏþÿ\?bìõKŽxy×…Rúé¼ #®m›Ýo¥jóï™<þwËŠ=h}ìŽC(Š9¡mz½e aA“zÙã¯={uº¾'W’d{q©G®XõÏeû\ ?UQÿú¹·÷{½ö“5ç]_\‘eiï; ]Yäö­—eYV&ÀýŽrrrV®\ér¹Ð™ ÇP¿Îœs¥$I^¯×ëõºÝn·Ûíl0~üxtº^z"ïÙ¿¾þÝþã¥5njNè?þ¦¯E ÞÃ>tç›ÕÈbD¯Q—-øóÜÑq"­ý·û—Õ¸‰1yøÅ×Mdù«¾ÜTPA£3'\»ðÏsú[Õ«ÜÞòÍÿ}þùåßï«âL÷À]—d[š½þÝÞez¼vÍ+ǼöÉ=ŒŒω ‹½²jë 1¡_RÉß™°•§üµ »ŽT]\E4qÖ#Ë^ýî²ç§«}‡œ¿-ùw>M0Gi­L鞢ˆ·õÙ{ÿþöƒ›<×…{Kç¼÷þ;©)©“&Nñ]’ß°ñ›ÃE‡¯¿ö÷”¢Óô¬œƒbèa9A%˲,ËjHp¹\.—«®®®¶¶Öáp8»Ý޲‚@䄚‚Í?—¤Ì}äÁ££ðëw_ÿÇ=b¯å°QƒgßõèUQ&ùøæ%ϼõè¢~ËŸš)¨¯O÷—? Зo_òÜ{OoMž9oþ_çšË6¾ùÏÿ3èƒûuí^|×ËŒsþï‰{j6ýgÑ“÷°Ô¥Œ°6W÷kç2ÕËÚŠú=©ûùåÛîûPÓ=7gëJýbñNb"m=uš3YÃ.ü<ì'kxÆÜ³–>öÆ'ûÇßÜ×Àxé7¯¬¨yç}Æ×ž©¨©bÛõEÁÒ®|úÊ„?<ü§'sÞþÛ´¸Ó+4]¸·tNJrê–­›%Iš6u¥tÝ7kÚ¶õœ¡Ã AOèq9` @Ï…ž©ÐUÙ”˜2FM;ÀÈÆŽL)É¿eÝWÃsM–¬ 3²!„ Œ-ZóûÏ·s0Ö¿~äøQìœä’oæ¼×û«f³0:ÔðÓº6m.ñôÏÐ9¶¼úÁ‘w/»ûâD %ƒ“Ê6ÎywÅÞ;‡77¿ÿ¶c™þm•ªMo¬(I¾é¿ÏÏ40JF'X½e+mã©ÓÞÐ~†kØEŸ…»ªÒÅ,)£o¼aà5oþç§«þ>Îxàã··Zg½5µ×—ï(¿T8eÁº¥(¨7ñ¾E×Ý2ÿÉ'Gô[tY¤ÿ2X—î-0yÒY–¶ÿ¼M=ÆnÛþÓàÜ!S&OÅqzfNT,Õ'fǓώWË„xK¾÷ù·Vm*8QÇL¢SÖT»”Ó^O(ÕÆdDwE•›P+¥†Ø^dGy­B¸çäÎB·tô©+F?]_UdÅPR§3kmZ[¦ÿK½'wöFŒ™¬gŒRB(óUóZyÊ_‡Ö0øgE-1ô6é’†Þ:õ­»ßZs´_ââON ºuNŽEÚb$5åu2çšî* fÎÿ·;·Í]ô؇ƒŸN÷_‹.ß[:¾£O›:ƒ²ýçmœó!ƒ‡NŸ63P˜*:䕽eefKpçEMKMKŒOÄa 9 ëH²T°¿Àî»M-tC¶@Eñ¸=ŽGYiYqqqFFFÀjQ¢^Cd¯Â½‡—ß·p±cÆÿ=¾ 7–úè‘Ç¿nö¬¦ÕPâ‘ëÇȉz Q$Î !²¤ýØ?¾x÷@cCÕ”ã£Äv\´mq™§UXFd©ÙA´­<å¯kDr]E1Dèj~Ã)×½û¿,ßÑ)/LKÔˆe‘FRWV#wkQP]Æ5-øîúÿòÑ-Ɔ(Ð{K‡£Bddçüœ¡ÃX›ÏÎÌÎÊÊJMMŒŒ Þ¼¨œð{v––•ÆÆÄâ´…œÐEöîÛ›0tÈPN]u[9é†lȲìt:+++=j2˜‚ÑeÂU´¥@ʺïæK'&i¨lÍ´Ñuí¨€ù~ÒÄöM]Ф‹û˜è©úY*uÍ>ª®}÷§o ë†lÔ7¥•§!”.ó€®a`# ³ÊÉõf%DÛûâyç¼ûÈêÒ´yfe”êÌZ^SV+wsQPMÚì¿Ü»aÎ?^­••¬ÐÚ[Î *œ3tXÀßE’%¯ìõHä$AàAÉ Œ²¬>Y¿íü-&:Ý¥ºHMmMbB¢$I!>Á|—tC¶@dYöÊ^õŸ$KÁx ]ÒÀdúÖÒ7?´ž78Ít¢¨æÌ¦ÕcQãn¿"馥ÞËæ]>"Ùà*-²§Ïš=Р©Ô:òÎë3~·øþ»•›çŒN3;wÖu[yŠˆÖ$+=¹yÍ…iS2‚»†Í ®jÑuŒRBc§üá¶K–UM¾4]Ç(!¢ÉÈÜUÕnÞíE!&_øÐ=y×<¹ÅyVì--E…`\th$(ûQ'¯‘ºç\áJXmrë'ÝÐ,`WD!šŒkž^xòï‹ß|xµ›p®±$ä¦YÎäê¨1÷ÿ~=ê…}öæ#˪%}TÖ¤;§Ìh ØV}öÜWþñÊ‹ËÿyyµWÐGÆšši)mí)–pÞ]×®}â“>ž:æþAA^ÃŽíŽî7Ñ›µjWc¿«ÿü(§L½å² 5éHIyDbiw…˜4{áíŸ_ý‚´é!¾·tÙ7³þ_°¿ž“á÷P´ÑNã›ýP÷°®®ÎápTWW;ÎÜÜ\4'„gM½ÍyQív»Ýn3fL?nýqüØñAº>ºÇeJ‰BvîÞÙ/»_£Â Ù‘eÙårUVV-Þ¿FzÆÌ™3Û¹'äåå]uÕU~/抬pʵ.J¸"+„ ŒÎůk;¥Œ1Úøõ§^ÞtQ§/Áïñ¦{}û–ÙÌò¹â;­6¬`ëOqEQ¸o!í^î;(²Â™Ðü–Yጠ”vyQœö™4<&Ë iXÕ.Ü[ÚkÇŽœó‚ƒÓ§L·Ùlíü+»Ý¾æ›5™½3)¥»víš1cFû¿Yû÷ïÏÌÌLII‰ˆ'6]ß IDATŒÞøB ád×î]MY"òóó‡Åb±ÙlV«Õl6›L&ƒÁ ×ëµZ­(Š¢( ‚ÐtC´'@ˆÇ”°»RÅI«½ŠB³@¸ß¿NW:Øiµ™S¿ÒFÏ4ûúÓ~kü— Ù‹ 7î_O[jF’±=ËlfùTh)þµðeLhy C ·¶²B~ÏuuQ4÷$õ¯~o ›Õ–¿%ôˆÑí‰ v»}ÓæM6‹­cõoNxý¿`¶'PBÑžÐS!'@¨WšÃíþî”ÐV‚Bhˆ_5älú¼”ª ÜðÔŽÆÓïè&?¿òÙц £±Ñ±¥å¥kׯ•¤¶EQ´Yl1Q¿ƒí©¨@8Gu GåÎ^ã(§­Œ ÍQˆ¢…®þ÷l)jsÑ[ß^ÐÌG ý} §~Á)‹‰‹Žmÿë;üÿ¬ï&Çøä€nÊ áÖž vö=» į9áìª1PAð-ƒnI ]ð.«.¿%£—ÝewÛ#ûõO1åFk”PŽ`œÐÐàÖ;¥’ÕÏ<ûuÂüÇoìk¬¿†,Yùô¢üŒ»½*Sß=—•[I(¥fûÛÏ¿ók•Ä  11)}GNŸ1²UìÌuËúµêÐºíØ±Ã¡ÇKJJêä~¾k×®3z½Å RBˆ·ä«w–—L°o’)HG4ôhBNè–*3 îåsÎY‘e®œzN¸¬(2WºïÊ=jHµ•URìä/ÍÒ»íe'þöýÇ/lÜ8á¶;/ïkêØñœ£=욌 ,u}›eë¿JpጜÐM1!¸97®}sî{k¹êçO–®þ­¸´Ú)‰¦¸Þ§Î¾`tŠ‘y«[iÄ@¨‰™Y™rÎøI£6¼öâ§ï~Ôçk‡F”×ÜøÙŠ;UÈ´þ“f_29ÃĈ{ßûõàð{º(UC©«àíÇÿßÉóÞ;!Z$Š}ëk,åÝ2¥lý§y¿θkAÇ>ŠÒòÒjGu»Æw ¢Íj‹Ž¥”žÑ´¾;i/í–íZµ½üê£ä‹î]Í!™7üõÎ!<ˆa¾#ä€nÊ AïxÄO½õ‹ê ?¥îèžýå1Ó®¾,Uë:±û»µKŸ;ZûÀÓ5ôì-Æ9ƒRm¸KÇ­nÃ×;.Ìo9ñÕk/}U׿ìyɤxó—+^~Ý}ß]ç¦h’¥²-‹rJ”à-Ûw¨N¶ï>îibîc») Ó“µî=E%uæ B:R )«(“diÚäiV‹µÍz•ÝaÏßœ_Z^wFÐú´[¶Ká§F4EŽ»þ¦11JuÑ:JyõE! nÆÜS1„zN2_ݹI¿™ú‡t ÙƒääŸ|å­7µç}¹ß)s}xãµÑþ›,F§'ˆ¤üH¥§vߪu%“o¼nưA‡ŸwÝÓ"KÖ®ÞW+CZn*;¾ãˆSQdûÁ}U”yŠv÷pî)ÝyÐ׿·™N¸h#ª¬WÙ«Fa‹`ŒÑ¶Ø¬¶Ñ#FW;ª9çgô‡­ïNAÚK»íÚð?­5.%))9))VÏN»áI þ¡ë r@wœäðSZã ÕïFúը믾1CÊàt­»¸¨R âZqή³@¸/ù?È !œ{+•xŒ}r¢µj]_›“¡÷–®ôrbî=8Q>¼ã¸[®-ÜQ™8mZºçÀîR¯TQ°ÏÑ/ÓÊêK³ƒW%I²Z­í½ÍfSû~œé´²;i/í¶˜Ðp@£A»ö‚œÐƒ¡ß„vNöøª1hˆ·¦N:õ>R]¥‹è æ¼À΃\!JÐG8óàˆ_ªÄ[^xBâÉ6¥!8ÔÜ ¤¾íFô³bÓ/ÅÕý¶3š•kÚ³áû½ÃÅ_OšúÎŽHMC;E‡?ŽöBw#è2gÛÎÆ. (A»}GNè©Ðž¡}Š 6jJˆ×“ã; ²¢N â<¾ã‹F§DPßù•õ9oùžÃN!:ÉBƒ¹J­Þ©,0ËW¥4<à.ù~Å÷•úSÚ´© b]áž2¯úœ·lw¡SŒMµ1N8‹<,¡v÷¦ó uýúEGeåF•ÿ´yÓ%Ö!CãÅ ÎyRV^Vt¤_Mï½ÿÎú ëB²®Ì9眉 q9Ü’ï;”ޛС=΂œÌwÐôš61i{Þ»o,Ÿ>®_œÆqàÇu›ª¬ã¯îk¦õ|;Ö~N†M:öÓÚµeÖñs2L4ˆíì”ÒV‚B D]@í±ƒF­ÇQq²xgþ¦½U‘cæ^’ke”f?)î¹uï-ÑΕ@Žý”÷uYìôk2„pÎiԠщ_­XS1izœÈ4ƒÎ‰^ýå%rêœx‘JAs^ZVZUU¯„¦”äÔ-[7K’4mêŒÐjmP»22K¯DMþ¶¯×§M"öºÈÃ{ôF œ`3r@Ì DŒ›xÛ†/VoÚôù/nŒNÌ>ÿæ &¥ë}÷4£ZWÁ7Ÿ¬¯RÌñé“o˜}n/}PgüWgZ fN`†+ýmã»on$Lg‹ŽIèwÑmS†÷‰ÐPÂ9“fÌ¿]·êóV,®"¶äì n™51YS¿É,bà¨ÔGCÇj¡‘ýG$®þ\>4F$’·a½Y4¥e¥•••¶˜èX| 4Mž4E–¥í?o#„„ZTà„sjì{áE£>]¿öý·%}Dßé©CÒŒš®º´È A<ËÿÄŒ)#/»yÄeœsB)%”0ê÷Öæ¬ón¿8UC ¡”ùž æy=¸B͹×=øT}ØP«4”ªÿ¯Ìœ1q΂‰õÅAOÛd1â–§‡F%„Ðè‰ žOåÜé%Dˆù»¹1 ºVYUUUUUa‹‰ÃY”ÒiSgB¶ÿ¼-22꜡ÃBdw½ 7R$„s.Fæ^vÛˆ+Öðeä•„ä€îŠ ]Ôù•ê7>ѺTB(%”²ú'»¹/n€ Ä·9¤ÑŸªùœ*ŽFÏ©Á÷ c Ã7Ô‡Àn.ç\­Ùà»!Ô[þ…Tg}êwqRÊ(;u¹¡Ë.mr@°ªÅA¿ÏZ[g@Òp£ÚuïI)mijÔî.–ÓKÿ.6""ÒãõVUUBâbãðu€µî›µÛ¶ÿ4dðÐÐiLhôÅ ø×º?'´r3 âfÞ÷—„QÊ•®ºLÈ(£„J²ŠÒ…+êŠüzªªªª(%±1ˆ ŠÖoøæ§m[ç™>m&c¡5“dLL„AÌÈ Ýx¢ëÖw§AÐds9!„(¡Z -­Ö`’¸Ø8Ji]]¾ šŠŽvÎðÉ“¦†\H œ­¹Ï?ŠPJeEÆž€œÐµç9E½Mp5—«ŽA8‹ „×ߊ.X×,cc0Ù„®ë¯ý}hŽ¢ñ¿_rðÚ8å” ' 't-“ÑTe¯²Ymá¶áÅÇŠÕ‹ègK(T˜ ¢ ¡vI øÙ>„÷yÜæ>Òž&P@N¸¾Ù} ->^Ý_9IMImö zȈ¢(·ÇQã(+-;^r<§_NGNH‚h·Ûm¶ö¦ »Ý.Šbþ •Ý)H{iwL8 þø„V›@9 (4¢&';' 7¼¥ ![ ²,»\®ªªª£Gj˜¦c0lV[þ–üÑ#F·§f·Û7mÞd³Ø(¥gô‡­ïNAÚK»e»cAQmî ÒµÔ È ÝPcF„ÚZùnØÖá…ÄFÇ––—®]¿V’¤¶Ï^¢h³Øb¢bÎôZß‚´—v‹ã%Ç™Èjµf‹Y§Ó«O`ËM €œ˜°Ûþ×wì:œÀ;¼—v‹Þi½ûôé“’’a0‚מ€ :È §×ëRá@MB-TVUUU£/K;WÕ>;@N€³FNNÎîÝ»].Šz¶]»vu2Qçää ®È .bcccbbPmBHä@íºî†È €œg ãàl%ÉRÁþ»Ãnž–š–ŸˆœÐŒ½ûö&$$ 2”’0š¾sÏÎÒ²Ò Þ »µœ€ ( ”ÕÔÖ$&$J’Ä Ÿ­f”eõÉúmço1Ñ1Á«±£=Îbœs…+aµÉ Q'ÁnBi#'¨wùf à t£BømsÐßAl%øBr„n™‡ÛónË Ä¯%1&!dÇŽØÂñð˹ú_EQdY–eY’$Çãñx\.—Ó鬫«««««­­Gq@×WšÃ­=ÚAAl6!ø~PC‚F£1 µµµµµµ.—ËãñH’$Ër86ñ„kTPùG¯×ëñxÜn·« ºå$¥`ŽO*·¯\ù[ìyWׄÆ,?”Ó.˜ß©µ~G¾ Õjõz½¢(„Q½^¯$IŠ¢¨õì=þøKÚ|9Áëõz½^QcêÅ  »ÎSÁ=)5¶ý²wèEáAíjìË êÏ‚ H’¤Ñh|! ›@ØäÿAÌêfF#Š¢z¸ð=ˆ²¯äýuǯUá¹ùÙ™Ù½R{5û”ÃápÔ8ÜwXµaŠ¢¨Õh#"" z¾ÍŸ§:uÝY¸î‡“bÿßÏìSªÅ¾Â9çœz}õÚK_ÕõŸ9{^2)Þü劗_wßw×¹)åÄÆÿ,ÿI?ùÒ›ûG 5åγ@8'Þ#y¯¿²Q?áâë.‰ríYóñÒ7hÌC—eš ý¯ÅŒB)!DíQ਀–€pÎ þ3©Ã—Õð vCRÛ ¶ÿ²½WZ¯ ã'ø&! «cΖm[Ž?–”˜Ôè©òŠòªêª0¬„¨£Âœ.grb²N§Ã¤ÙóT'¢Ô?îâÑñÖäRxïœ^[ð¿u%“\7#YÏè ìï3/¯]½oüÜþÚÚÊEß;»¿ ##é„Â9¯Û÷Åú²^—,¼xT¤HIzdÕoO­ÛtôÂ>YúÎÌWD í†ñ þ!A¥ÖcÜöH€pÎ ¾‚z#M”@ TÛ«{¥õòJÞ0<ç2Æræþ¸ùÇÄ„ÄF1©¢²‚sž‘ža4Ãì@LN–žA~Í œpE½tý[rBžÒÄOœ¿°ßÞ-¾Ù°äÅ ß{ë­ÓSE’‰.çÊùõÒùN“Ú“Ðù:u÷ŽcVR¾á HažÔŸ}©@ý¯?”@À¿}a[ïk–oºÅ0,…+²,s•±ÏS]Š.}ü9替ünR¯é©úÓ’ç„.+Dá‚55A\_¸§Ì›ž¬%„He» blªq aú¸~ã/Ï6øÓç_ÿö‡#ã¯È°$Ç ž’ãkMÓ!$ »H@£‚?ÿGpˆ€F'•ªOÏ -™Ï¾ÛûæÊ_¼²Ü0–B&ŸÓû¡ëƲݱ/ýË¢Ï<÷Òá{ßûò¥—ŽLÕ?-ÖBë*Ž•ÅN¸xˆ!ÒHª÷ý²ûdÌÀ¸¬ó'Å=·î½%Ú™£ȱŸò¾.‹~M¦‘©bç{•ø›NªØ_âäz«žbî{ÞØ¨—¿}÷?tÚèÌ(×^V?|dªQèÔžF)å¤[ûᠭ䄦±p¨iy€f@†JJ²òúŠíß8ÉbÐËœJ Q8±;¥gßÉ{ðš1”aß/ µä\yï}òÖ|¿kãÇk"šcÓL%9䂉¿|˜ÿù÷³g÷Jš1ÿvݪÏX±¸ŠØ’³/¸eÖÄd !Ük?òë×?¬ò¢µ¥¼äš‰ "!\Ûë‚Ûn3¯úbËÚÿ~[§è̉ýÏ0<ÕÀ:µÂj¨È Ð UŸ°¼†¬¥¥íöÝ·%SXRÝ+ÎÊU¸Â90~ØqÔ­·DÜ2’›¢Ô/9T÷‚¹dZ+@}W}ÒðY×›ÕÐ/ˆRJ#D›yîíœAc”bΘ8gÁDÎ9¡”RÂ(!„]ʌۚæû;ßã„™ûLšsç$u™”RÊhgW¸kÈ ¡šκJ¡Tºñ­Å?&]»àÂT]gZy«ÕÁ3¿)î;ŠýwÓGO^NO̓O< w{‰G&‰¸<£´ƒE¨­îªªpOŒ ý²PzZoš†È@Ø©_¥§^rêÍ)ñï¹æ¿R§-ólùj#'„nT8ËÖX®Ú¹ñ‡Ÿ'\¦( ïÄ]¤ZºÑ¬ÚpF Šs²ä«ßÖo/ªuzÕ¿S'µW8‘"+DR¨¬*»£áŠ}nµâ<¶ë·bsÿsz›„vì J@¦ÿì©¡:ÜJ†Ji°ç¿BNÕªO's‚·|ÛŠw—®Û±¯¨Â%㳆NsÓµ#cDÜ•V:×A†’hžéø§[zúý~çÕSþø¯•¼aÔ2'DáTVˆG&ŽZ—–zû§õ"Ô—”ÚëÞyë“õ;Ù½K\J¿‰¿»û÷#¢[xÚá­vxï‰' .{é•4c›ù÷°j3D…Õ&3Ê(¡’,!' 'œáŸ; –<ô§öëûN?÷úKÒ¢Hõ¡]»*ÝA®irÿ•ïð2xÛãÚ±ô’ŠšGßü>3=iÖˆ~F½H™õà‡êS²ÂxyçDè´a}¸vrUMmXm¥zë‹¿²Á0òêùs2ÌÞŠ£û0«®•ùá;¼Õœs¥¡¤Å¶·Ô8£}/l6—BHw䀗¸kï/|°?êÂ'žš?ت¡”2qÚœ2F¼GW>õÈ’ŸKêÑ’<ô›\54Z¤D.Ûøú K6>QQë¥ÆØ¬snŸ^“@ Qjv¯Z¼øó­{Jj™-ë⇛ÛÏȤʟW¼¹øóŸT ±Ùc¯¾ýÆ™&ó¬{[9¡=ã~Ùò™ÿn™::7§OÂÁ“µƒÒl/Þ…Ȉ P­@tA'2ƒN4tŒÑJ‡S–ÆêÇ'xŠ·üb×O¼ÿ× Qo·5…ÊÔn`Þvlu³¯i¶{sBHÑ»wÍ~B.|ç©qÖZ£rB …£„ݽ€ÕNG‚ õ]z\N¨ÝýÉ—Åšá^5°>$Ô×,çœÚúϸáî #MÊÉí+^[úÏ×û¼²p¤Mk ·ï*M¼rÁ™†š#?|øþ+’_¿=×$þðÑ–T¹üº…ý£Iuµ%NCˆ«`飯4\4÷¾ùñu?-{ãåÇhâ«·äêîÈØ‰uW¨ÒÒø„vö;ZñmÁ§Ìž1Új2–Ôj²çHµV¤FD‘èDª¨V Z‘¤ÆG‰Ý´,)ÆFÆ1 ‘½âHÞ¯k·Ë™¢gêTÎ9!îýmou ¯±(Í#çœØ øãôx-¥†m¹®«.]–eNxÜ`ë,b2šªìU6«-Ü6¼øXq\l\Pç%GNÑœÐá®RõáÃu<~@Š™Ñ& a¦Þ#&ô&„’Uüí½k9án8çœÒ†ŒÖWO‡ I(ݾpÓ†Cîi;ßý°0föÓ¼¶A½ÖM)qloÅñìù¯Ì«¡$'¶|óŸ|uà†Aý|]p:ÑD!­ß?¡õ…?»tëÁÎË/˜àô’¢2§AK)c„QNˆBˆÂ¹¬‰rF “Õ– *0êöJz­ .Yˆ›vÿ‚ý{í¥[·|<|Ú¹³.œ:4Ù Âk~ms«¹£ù× ì³«i1R'!œè#S2ÒS´ê}hZÞ.Ê)ç\’% b‚¿¾Ù} ->^ÅÂIjJjlLlPß9 DsB'®ÉËœÊXs5n©tË'‹—½­°ÜÅ ‚Kí.Éÿ½8'”jãÒcèš“vÉsrÏ!—yÀ°Dï²%çžÒ}GÜÒñWn»ôUª>¢(Š®´Nî«Vâ;=޹õû¬µ:>Áå•…J½²â–AfÜ#W×J”p‘qƒ†ê5T¯aêŠÂ #zæD¹#%ÖÚ°`MòÔ;^sÅ®¾ùrõ²Çþ·tÀÕ?2'[ÛŽ­n©d\–fбa¶MB‚akeBêÛðÕhD#jr²sÂpÃ[iI8Q~¬ªª<“ԙX‰œÐÓr³$'h莽ǜr¼xú,=Rñª¿ýcyí„î½±_$/^ýÏ—ð¯Øûæe:‘(^EᲤ4ôXò­ —%™è‡ÝñèÙú†þôTmH%ïtÆi%´§ßÑC׌Xþ;þ·ñ‚)£R£E'kkÝ^­@ôª×P‰‰‰q‰™YQ4¢Æf2¼±bËØAI~•u*âN½jÀä‹.üàÏ —þkŨEWÈÞ¶·º¥’9ÑL1ÖßÕMÈÜV™¨o€œp¦5æðTUU!+JeuE\tRgÊ9 §åb̹h¢mó×ﯺ¤ïœÌÓæÜtÿzHî5滋ÃãE*›{YȧռO]±W£2’…•;·s÷ï£oXˆ™ž,¸‹ó¸i©F¿ûJq¡”pYéT[HËs¸´g3%dÎä¬ôDëËÿ0qôìä˜_UMÉÓTdT#‘QQ "#‚@œ.épIÕò¯Óäü‘é¤ÉU}ÊL}F ˆøhÝR/ë“ÑæV·X2ÑÍ#aZ‹ŽÔU9%E[•S~ªÏ@["l‘•ÕåÖ¨N(äèˆFo(¥¸œB9]sË”í‹ÞðÁ‚‹§ÈLŽjNÜw,iÖõY äãU˾0Oì—d(?VG|þCÕ_9çÄ:ôš ãüôW®œÑ?Vç¬p¦Žßkèï.ˆ[øù3OÒ+ÎË×»+Ž9R¦Îȶ0Sœ…”ÿòÝÖ#‰£ÓLžŠ¥¥qºí¿Âðìø'çýÛ»›+«ÓÆ É$„þé¥OM±Ï(‰°è¢ÌJ5 Qhè¥åÚÿñ¿¾p¥÷MKŠ1S{ÑŸ­©úOÖ0[;¶:µ…×4[Œ©Ñ9éÚ•ë?\‘}noRY;br_k³7i8ÓG@˜‹IjhI ­œ¸‘ èi  ôraÃî|á©K—­Þüùë+í2ÑØ’²GÎ’hÊEÜZöê‡Ëÿ¹ÞCјbú&é©aÓ¾œP?¦–s}Öµ?n}ç½¼­¨åúø±óŽN‹ë{ÝOØÞY²öÃçV9½­×ÈëFMÍ2k¢Ç_ñ÷¯ä½½zôÐùنݒ¹íû¬µïþ )±æghéO_¬·Ïž2TáÊòÇ.b§¯=u¥Ã×’ ÈÔbªÞ´òíÏ*Ý„hÌ Yç=ú»iq"!b{¶ºù×°f‹1vøÜ[Î}áýŸÊcˆzeæ¸l kià r´ÆL‰òãÍŽO8Ó³6Åí©¬¨ýb%I’$Éãñ¸Ýn§ÓY[[[SSc·Ûív{uuµÉd3f bC’eÙårUVV8p ##cæÌ™Ø:cÍ7k&Œà•¼ýþ* ÷õ¥¡”Rƨú詎ø”Qµƒ WdNXCMš+²B˜À†ã6tF¢´á%§=X¿hõQ…œZΙ'Ê!{öí9gð9ö¢ïüžs>bØÇÓÎ¥Iв$oÏ–‚òâ•Ë=ŸÑSU%ÆXó{)÷¿õ¥”PÊü†·½ÕÍ¿¦ùbô}§ ¶™2aÌíqïÞ³Ûj±ÌØž/W^^^AAAfffJJJDD„Á`ö\ûнöøMVdÆXߌûîôýL)ÍÏϯ©©±60›Í&“É`0èt:­V+Š¢(Š‚ оe¢=Î@£K¾_Ñï H)= _Z¿¯§ºÈÆ_Ù† Á¨ÿH^Æü£Ô·œfô”ufå[éƒßþû¬)Š¢^×eù⑉qöö{EE¹ZßgŒ1ʘÀAA­'1Æü‹íôcšÿ¶g«›M³Åè÷^mÜ<×v¡þc~•³«IDATcšŽOð?S7=‰·´LäèHH ÍA6$„ç¨Õ6s'm”Œ,ɯG’$É+y%¯$I9Éú;Îïe¯®V…1&ˆ‚(ˆ¢FEQ#jD(Ê¢V« Ù+îœ`|´ÁLBÓñ jëYÓ³vëQ9:Ôæ{´h>'ð0Í ÇL.Ò«?Êíg’™qF)˜@mx’PJA`Œ…lc34«¥1 MÇ'0Æ|Q¡ýËGN€Žg_BP¡d’%’,µX]nk3¥T«Õj4N§Ž­ò!œ¨Ýê]L Œª=ŽB¹´ Yþ÷Ihég5øÎÔ¾sw{2rœqBða~•(¥­ÜP¬ý%£€6N¡_ξ5DT-Ih:>AãÓÎnÃÈ pÆQø5)¨ AEFãõzQ>Á¨†[N œp¥™m—e¹ã˜{Z™(\Y–Û?Ñ„ƒ–Æ$4Ÿà›Ô¨Q¤Ö›àÌB£ wNQ”0 ”(Š"ŠÍTQc^¯×ápX,–nH/„øŸnf,u0?«âcŲ,[-V|5 ¹3s+?Ÿ–| þ- Ç :ùO¦èß’ ‚¦!äÇDq…gÖãñ8޲²²âââôôt”I'Y-ֲвèÈèðÜüƒ‡¦$¥4­»d÷ÉÞ¹gçŽ;°L8ç¢(f¤g´jaa¡Çã)--5›Í:ÎâW·G±£Ñh|£ü{µ” ]!Á¿Ò¿»‘Ú’ Õj%I2.—«®®Îétº\.·Ûíñx¼^¯o!†âõà“$IN§ÓápTVVª¡3†úëo¿8x gæœgõÉJJLjú”úàCœNgWý;i4™ZÒob¥†_ƒ1U´FÔ¤¥¦i5ÚöÿIaaauuµÅbÑëõ³W÷Ôs´Ê7RY=)ët:ƒÁ`0ŒF£ÑhÔjµjThÔ‰´pkäèÔ!É?-hµZ5 ø‚„ïqß­ŽEQÔûŽ"'ôÄŠ×ëeŒI’TWW‡é<­F;lȰp>δôTRbRbB"Š¥=Ôš¢zç]䄞}RnzýN§Óéèt:ß­—[jLhrtêx¤Ñh?êk|OùB‚Ú˜€œÐS)ŠâõzEQDNèÆJ!J&Ì-9TZ^ŸšØ[½ª†‹Åb45 úõìó²¯IA :?jTðoRh: 9s<" ]Ôq̲,kµZ5øŽSêÅŒf;!'ôÈœàñxAPǘ¢ÐõJËOȲ\Z~"%¡·úôå“ɤÕj‘zðy¹i×#•üÛü'Hõ?­#'@À®[pÎÕàßJàkIEÑëõú÷8R§BGNèÙ91æv»   ëÅDÅ•–—ÄDÅùj}z½^Í Ç9â» ÿèA_3‚ªQT@N€À‰ÔоÔHà_éWQPê©j3‚ürBÌ n·›ât:‘ºEjb„újŸ¯=Ájµ"'ôì³³“‚ÿl„¾´àÿƒú¬ïÂi¹U9Îø¤FõÒ…¯Òï`òIPCB£a È =2'¸\.Îymm­Á` èwÐ%üÇ$-9Üìø³Ù¬Ny„œÐƒsñkð÷ bþó¢ªí ­,9ÚuòMªþà¾iÔ3R±à›àÈИгs‚:ˆÙ`0èt:¤€®á?&¡éøß|G&“I¯× ‚€ëÁQ¡Ñl„¾¨à»·š/$øb&~ ¸æÔ4'0ÆEÁ׆àŸz6Y–cG¯×kµZ@×ð“Ðt|‚V«ÕëõjT@NŸœÐhfBßýhOcrtä`Ôl“‚ Ô.IþÓ¤6»ŒœÐSs¥Ôår©Sj @º†ÿ˜„¦ãü'Ñ7 È =ûÔLNÓìZú™`¾#ÔaH­â7Š ê!Æ7²YmCð€&9sî›w<-Ih:>Áw_^5* '„OT §ßWA½®çû¹Ñk-9|9Aíw¤þìߌ>9A–eߌ{Ç <-Ih:>Á79¦Â0*4 ‚Aë!9:üÓ‚úC£x€>;†ÿdH ÁÓÒ˜„¦ãÔ¡«þßM”^øDÒ¤m¡é³­‡äèTTh4 ’ïçFÙ!!Lr‚ï²%  xZ“Ðt|‚N§ó¿»rBF…F1 õg‘ `‡!_Hhóhá@Í :Îh4¢4º¤*ØÊÏ„¢ÎSì È Ø]ZÛ] ‡žFÁ×àáC=CEƒÁ`±XœNçš5kP,݈snµZ ƒF£iç$˜Ð³CBûãr%0tà0=cA«ÕÆÈÈH§ÓyìØ±ŠŠŠšš¯×Û“r#2p¸UªÎºõ×h4f³9***111**Êd2©#˜[Ÿþ°o#'N±jc‚N§3›ÍÑÑÑ”R£Ñçt:%IBù `àpÔeDQÔëõ‹%222**Êl6ët:õv¼8DrtOTÐh4&“‰RªÕj­V«Ëåòx<êíöaUü®ü&êõz£Ñh±XŒF£Úï%ù2â tžznI’¼^¯Çãñz½’$ùnË =8x Zj)Ku^­V«bVÇ' p9º§Æ©’eY¾GP8]™|÷ÕbŒùF& ÎrtsZhô_è–´@šÜN 9: Õ99 Ðþ?«SG£IEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_design_reports.png0000644000175000017500000004313612235000130025357 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¬¼‚‘7sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwœõýÇñ×wv÷n¯q´£½E”*v#XÀ j¬ÄDcüÅ[4=–M,Q£Ä‚X°"*b¬±`£)¤÷ÎpuË|ì5޽½öÞÏÇã·³³3Ÿýμw¾óYÙ·˜þÞÐo‘T° ýöÇy’ùpÆç®¯ðcî¼e"Í>ŒÓN9×u±ÖÆ™¼ö«YÌ.fÙî<'öDׂq ×µã`ꙕu]¬qpLìUOŸøñçUÿó1c ÆZ¬µXcp*gÉ-W¢ù6¼œñ_ÃZk ÎN+oúÿ–èuvµõ/‡ÚLj7˜úvĀ뺸®K‹-ÈÎÎ&6lX6±p²€[ç·ˆXWT¨°\rÛ­tïÞÞ½{“‘‘‘p!DDdÿ³|ùrf̘Á1Ç“² ¨¨¨`ÕªU,]º”¶mÛ’žž$P.­óÛ¥¾#¬òòrJÃ]=z4ÙÙÙÕèÓˆÈÇC4MY`ùý~ºvíJÛ¶m™1cyyyÄ*Rë·©üm÷+\ZJ¯îÝw+90c‡Ã)ïeóûýtìØ‘Í›7Cì+ø€05c%ª» ãaQQNAAލDDc ‘H¤QN µiÓ†eË–Aì+ÌÎaåVþ?þ–µ–ÌÌL\×Mù‰ˆˆ·4ÖVÕ¼ÄËÇÎaå#ÖEwÐElŽ®DD„Æ=Âpb]‚µÃ*ÊŽç²âaA,°Z""RX,Xù»*¬"•?•AVï–ºEö·b+ëVoÁŸß•6A]N"{—ã8 «òi§Ü¨ïïõHgǰ  «ªÀJ|„¥ë®d¿YÏ´¿þ‘‰3WSXaCzvKÚ÷ÌqcNcÌàö½½1¶è#n¹ìï|mËù÷ÿ :öö"ÉÎSoè8ŽÃA„ã8,^¼˜mÛ¶ЬY3zôèëº|ûí·D£Ñ†^&@,¨üÄÎ[íVPÏ…Ãê”ýŽ[Ɔ%«ØR¥j³+ݺ%3§±tÖ™{Õ_¸uT;ÒöÏhÖF ¹.® ÆïÝÉE›£ìEƘz3!Fñù|ôèуE‹УGê KÕ€z°\×­>œñß­-%=Ã¥hÕ\^½ïúz+Q D63{ÆÿX¾©˜õálgÝâ/™ü—ëùíôu„,`Ëø~â­ÜøØ˜»r+¡h9…Ë¿aê¿äWSVRaÐ>zó ¾[¹™í¿‰RmIËLõ}ý9ÍÈmÞœ6yÍÈL÷CÑ î»û>]VHyFKòš¶®/#';=Á½-Ev_U`Uõ¼Õýñù|L:k-@ :œ¦N €Ïç«÷ù»’5%(†ZMyÕä[¹øM—â¢í”»Q\ ÿØ#ÉO3D×~Êc¯®"íÈ…÷ý• ¬zãžÏû/Íbü£Éµàbæœ|Ï¿ø¿Þ!fýën}}-ßL|…Ç\MïâOylÊ¢Ñt^ö[n9­[§üŠ+ÿ½€ïŸ}Žy£®gàÚÊùüå_ü_¿ nÈâ/{¿rqó9ïÎøQ—¶.cMÈŵÝùé_þ̙Ұ‘(¾t‡pym±ÒaAìâߪÇkÈËËk𹻢Þ#,”ýVù6l.¢4ŵÍ8êÚ¿sçiD£T¬›Çò¨Å²’‰×ãäS~ÈåÏ'âZì†%º;~·€q¬Í ï‰'ÐÅìöÅ,Øj¯û66ŸôAœsÒA´ôùépÄ( 0P¾„y…ìpDd ã¡¢¢êä´ÁøÜH˜p¨‚òPÛÁ kk0,åÑ«.åê;Ÿæ½eÅ”•‡Ð+¡¡#,k-¹¹¹Œ1¢zø{8`Ĉäææ&|®Ž°Dêª<Ðá‚xð˜o¸ýgÿâÛÐ6æÌ^KéÑí0ÖâF*b—ÔÓ’á'MÇ´š€rrûÓ"àƒò:Û…k1þt| Q"ÖàÔ%aŒK8Å­uM¤µS÷xȵX Ö: %µ•ÓWN,àÒ»þH——_dò›3YøÉdþüé—¬üó×=¨sX’rÆÇI8J°W¯^ÕÓTu Ž;¶úœÖW_}•Ì(Á%t¡À’ý†­}ËOZ›ã¸jÜû\ýÔB¶~ðOž}/—dÈëM;>c1Å”¶9œsOéI¶B…kٚў–D‰TÏË%rÁ†YóÅG,ÇbíéÖÂOš¯Ì™_1‡ßþGåSøÁÛ,´›Þ…~m˜HÝí«2˜ÒrÈMÊ7ðÍ’í¸í3qÃðû1‘b¶Ò…ã.º…Qç-æ‰koá¥uKùïì"Æuo‹6Yi ‰F F""‘ÖZÞzë­ê`š:u*'tÖÚ”]tœðKd¿et}1c§ÝΔõ›x}Âûœú§“iÛæ(.:þ5~óÎf¾yâ—œ÷¤¿‰±i ¿õn>$³ÖQÌ6Þ¹u¡¼<ŠëZòÆžÃ!9`ü#¹ääW¸yê:f>~3M0X×ŵ–ngÿˆÁ9·°Î2Umré8¬w€ÏçVðÍß.凈dÃî+_à†Û§³=«­2B¬[ïbI£}—¤ùBu JjUu V ®¨+‰0qâD¬µäååѶm[Œ1¬_¿ž'Ÿ|€Þ½{WÝ/p¨KP ÖÖ9ú°Ø`ON?Óÿ>‹²E/òü‚c¹ºO/»‹?uzŽg¦ÏdÁÊB*ð‘Ó®'ù™i „­­—Ì–Ù„6ašuà\Ìu—Df´‚2¤÷…¿ã­žá©·¾âûõådµïÃa§_ÎOÆö =RF©kw b«Ž°L ¿êZVÿëÞž³’¢bCn»téiX›A~^ß®ÝÀª"¶ìÉác/ág‡5lj”j›•”k(°|>}ûöØ!”òóó«¾ç*%aÄíòLš4)tüñÇ ã<,âMÖµ2³Hóû0¡JB.X×$;èÇ8ÑòÊ#±kN 4¿ŸSu¡½%ZQFEñlþpù|jÆIù×ô â3‹†(¯ˆT€°ÖâøÓI øð9àâ†CT„£X,®ëÌÎ à8DËJ(VŽÅZô4~'¶Ó°ÊËʉ ˜¨Y.ãbÃ!ÊCQ””+..fÞ¼yúýˆË–-cܸqge@iåOI­—åꔆq ‘òR";þÇ QZÚqZc°‘0‘pót°¡rJ£ñ·c 6¢"îùfƒãXB¥¥„âÇþàØ½~›yñŽ÷þó­[·Þ£ìØå.AY‰ˆÈ®JEvìÖ­™t ij ,ñ–ˆˆx‚KDD׌éDºš®ˆ'éK¼+´„'oü Ÿô¿•û.ïM&å¬ùî[Vg÷ãЮYøª¦‹1ï£O˜}丮‹u”X"^Ô8ånæ­~̡ӹëÎ éŸãÔ•Îä7þ?Ä}§¶# }‡Ä]Ïk×^É#‹]ܸôäšýœVíÚ“ß*°å‹yú÷dá™ÿàÁΙTç’µØ~šl-D$…'°¬ÅF‰,~‘;îÉã·@Ǫ~k‰ºQ¢nåÎcw@ö¦‡ýì×äoa–¿r/ÿZp?¹îd:¦Œ/‡n­:ÑòÆ?r¢qp¨lO®‹­Û¶lÍ/–ˆw5Z`Ðê ZÍy„ßMìÄ_/éK¶cj«ú´K„Õ¯ßÅíg³®ÔÅŸÓCÆ\Ê5çB+¿è&>zø>&~¾Œõ…¥„ɠ݀ã9c„ìw>äë¥E˜]væOùù)½ÈñUc¸Ù¯>Æã¯Íâ"y#9ïÊKÝ= ŸŽê<ÀOëžýi@9§Áò¶ô8ˆ>ÁØh"Ëyú'×óÎà?òè V¶­OýœÓžŽMÓÿ¦'¹khÕ1Z­#¬8íãÜ+/ᵑ}V£–œü“¸åŠÖüêî{¸¿çŸ¹áˆÖø­KM÷ †Ü~£¸øch‘å²aÖ«üó¹¿òp¹iX.¾h Kg}ÇÆüs¸öšÒ çñ꣯ðÐܶ5î\®—IáŒçø×ã÷ТÏý\QÄ1,zîn›’ÁØË®g|ÛR¾~þîÿµ¡ýCW0 ǧ!#ždX›1ÄÚqku÷ycnä–ãÛ’f í2bÓB­®Áøíã_òÕ>DöYX0>ZÏmgÞÊ/ï€=nåÄܪ®ššÀÊì:„#ºÆžzPAKVý÷:Þ³ŽÐ‚ÖÅZKFç Ô› 9ˆ¶ë?ãg/wä¸1Ç18ÛÁô òÍÇbæ¬õ„{u&P<‡§_]KÁø¸tT}ó6óÅU/ñöâ‹è? Öù ñ€šî½ª`ªüO ,[t {·ŽŒÁ°![3kq·«}ˆxQãv b±&ƒ‚ó®ã¢ooâ‘¿½AŸ›;UL¨îÜøå+<þ»ÌZº™r'_¹‹[Q[û\Dew¢ñÓ¢SsL¨ˆ­U;¢ôtÈ…ÿ–u]ìÆïYYaíƒWræC5çÎ\×%}cQ›¡OОRLÄ ,ØáËÔ~^eˆÙZm.¤ö!âIÚ%X½s tâÔÿ»˜/¯}‚¿¿y•Ï·Ö^=•?Þù%G^̵—ô¦…]Í´¿>À§Xܺ;§ÊOѾ4?†×ÅZ¬€܈‹k-&!JÁWÝÎ%;|ZNo•ƒ¯jG&Qó~Õ=ªú]õ÷XW¡[gÐÅŽGXVíCÄ“v/°\K ®ÝaZ øÚÇ/.ûœŸ?ü ¥QKWk±®¥bÕ7,‹váòsF1¤­ͦK|j-¸¶úùØš[·ÖŽÊµ5¯Wù_ónäû*X±Ì’w\G2/s¶®öFÞR+p*ÛkPÓ6LÙéPVXF$êâ¯J¢Êöj#®Ú‡ˆ‡5î9¬Ú£²ð‘wÌ\úñu<47Zý‰8Цmy‰©Ï¿EÖÑ}ÈnbuiíçÚª3æÕóÚé|F®!“{çŸÔ†›¦þ™?9?䄃Û maíöN{|­‘„â ްj· _+úvKãõ'ójïéj·Pœ7”czfÑ&6Ïù„¯WµgxGµ/j’.ÁêÉ}y÷ãq¼û‹')¯ ¬Žc¸ñŠMüóÅøÛ‡!Y­éÝ>«²{§* jVåNŠZů¤àÂßñûÜ'yúÝÉÜ;u;n0—.C/`ر=ÉÞ寭”½«ö’Zí¯nÛpš1äÒ+ý÷gxñÞ»[sÈÙ=9¼ GüèT>yp:O¼5œA—¨}ˆxP¼’I“&…F÷«Œ§OŸÎðÆ7ø5ÇÖââàÛi¸•źàøj݉À­<_U³XÆqª·n‹ƒSób³¨¹ƒF¼×‹Ë¨ÚÁŒ15óO±n쎎ãÔ龫Ó6°¸®­yϫڑµ¸Ö…ZÓª}ˆ4ŸÎ`Ô¨QõæÊ¸qãÎÊ€ÒÊŸ’Zÿ.Êï^‚ƉÝ.'δÆq€:U9¹Ö«Ôˆe ìøžCœ¶Ae[ª °ª‡Œ‰:ÕnGj"Þ¡›ßŠˆˆ'èëEDDÄt„%""ž ÀOˆX }é‡KDDšZÜÀjèüTYiYâ;]ˆˆˆ¤Ønu Ý„FDDcææñôî耻•o?_Mà ŸÓ#3ÑÍ B,zòç\öÈf†ÿèJ),"7?c*øþñ«ÿØ6ޏìü¹À°ðG¸÷§?§ì©Çß+ˆƒÅFqÝZÍݺ¸ÑØ7Ø-fá³Y×ñ2nÿe_2·/åݧæÎkýtyáf†Vöc´=ëÜ}J>iÆÝ1Ç]Æœw?fI닸íÚA4w‹q :sPËCHûÏPò _YAÚáäòÁ-HóÕT«æCTßOhà=ßÝ÷ÔZ<Ÿßq.-³¢¬ýb"÷L¸ƒ?÷y»ŽlÏ$j‹ñç]ñ47ß5Ìó®ã¾#;â/\Ãö®- Ô[„Ê/3µaŠVÍâÕ) ±yÇ3(/—>ÉnC©ª£¶ÙǤì@ëc/ç§g÷'Ó1{xÜq—1éß_qÙ_Ž¢ÅÁ'qhú¯˜öÕfÎéÐÉBþ»Ä¡ïY}ÈJpDg·}ɃO.¤íùÿâîŸö%«ê+Ìm3xèé%´»à1þpy²Ã1ûS>îrþýÈ—œýç#hÑàR[°Õ}8G<ˆLg$Ã:®cÆïñö’2†ôŒM•‘ו>½»’Võ µ!ÀZ²{ŽäØ‘ýÉt*—)s÷ÖS R´ˆE%–üAÝiæ‹_+»íËäÞóÝyOœ^G2ªWå‹õÏcÅ;ñúWk¨8¢9Ûëo‹¦4þ<Ë—¬cK4‹ƒGÉasñ™AT}Óq\³n㸑µ¾-ÙíÌy÷çÐ?þ$·¡”Ö1!m;Ò´R{–qªoÛä»0òàBËÿÇÆ…œœ2ÀÇü7¿dcÔR¾üS¾ u娹±î‰z„ÖÏeay‡ŒìB¦S3„ÖâŠÙ¹ú1'£+G’CÅ’oY_ÑÐ}çwXøêyÛЖí¬Ý­õ(±SÝ ÇÔ|ͺÌn®§n¬ÞŽ¿þf¹kïù®¾§aÖ}2›/?“£:œ¡£¯äéUQJ¶–ã’¸-Ö7Ï`ÁÙ\:4īלÇ%¿yœi󋈒@ÁU<<áßLœðÜs+ã®àùë®àž/·âfH®m¥¼Ž Ѷ#M£Q/v£Q¬ñáÀÉeðiƒ |ûŸl,eéûŸ±9ÿ(†å5Ð+éF±œKg;ÀV}IŠqHóA¨,Œ›ä‘£ñ %\Ù›ìÓdƒvw=ó®tHƒµß®¤ÔM\ì„ïy¼é“xOÃË_àú›g~çóøÝýóä}×qR›Zh‹qÛI°;Ü÷/ýåbú¬…Û.;ƒË'̧¤¾õËʧWï^ôíÛŸ!GŽåÊßþ–3[¬çõæQb’k[)«£¶ÙÇÄßôRpømKòþÜR‚ÝúÐ&Í`phuØ…œ”û?^xósÞùp=]N>ŽÎi‰û¦ÓÚô¡³+³>[Ey&­m?º¥mcÖg«k ­äÓÙÛIëÚvéãÏ¥C®aÓÂU”îNO§/Hó ”l)#šÜV·[ë)@Î@ÎÝ’ÒwÿÉ Jã^»“Ô{ÞÐëÔóž–¯ø’…‘^\ðã38j`ú<€ž¹5óKÔëo'ãÏ¡ÛáçqëC“xè´l¾yþEæ—Ö®5G+ÆL¤„¢ K°Y'Ù¶•ª:jÛ‘}L=߇µ{J–~ÉÇ3JÉ,]Ág/>Êózpåß“S€Yý9ÿ¬Nœýï{XîÌÕÇv$ÍIüj¦ÅH®:»?}=7ØË9}P>ÁÒ”v;ŽÑ=‡ó³ó»rþ7q{ÆO8­—áû7aªÎ\þÇáä{bWzôoüöñRÎ8¸ ¾5ÿ£0Ùótv ,2é­ÇyæàÒËnb[û£Ó;Áówc=0Í~åMŒ™q3_v1ß;£úu¡•o«|ËŠÎçsÝÉI¼ç ©ç=ݾ?Ìž{l2ÍNHç¬õ¬(® –„m±{=ól=‡Wg¸tíÙ†ÌоZ¼›Gv}%m]̬™ÍÉŽ–R¸z>¾<‘w‹;0nlO2ŒI®m¥ªŽÚvd“šcm_6½†ô§õGOsÛueDüÍéÔïhn~ü*Îè™AM{K£Û©2ø‰?ðeÁ¥×!-‰>ÉLú_õ·¸û_y˜[&nÇ vàøóƒžùôÿdÝË}“ÿÂ/6XÚŒàç]Ç…}ª^7@÷ îáî­wñÀ‹wsý㜌\Ú ¡ ÓN ŽºöfÎúõL¸ãÊ3Ú2òòƒÝ;Ñ“vg=À×êH~ýì¿òè£Lþèîz¶ˆ°M£e—ƒ9z\˜(éI¼ç ¨ï=7Ž»oÚÀŸŒÛÞªk ä´c@窋^µÅöqçyÄÀù¼óÄóÌÚP6H^¿ã¸ñ÷Ð+X÷š*?ÍóÛöî®ûÙÀGfn>›ÿïBÎÔŒØø‰äÚVjê¨mGö-ñš\`Ò¤I¡Ñ£Gǽkúôéœ{î¹;=f]wÇ~ncpŒ³S£¶Û>ç×çÞÂÚ«&ñÐØvI_mo­»ÃðZãøªwN;>fpœ8¯[wùª§³¸Qk|Õ{»Øß¨~ ‹ëºÕwò0Žƒcˆó¼=_OØè8»ÓûeƒSùÆ&~Ïw÷=5;µ3cœZïqým1Î<±¸n­î¿z¶ ëFÙé”Sœé“o[{ZǪåÒ¶#{î¹çžcÔ¨QõæÊ¸qãÎÊ€ÒÊŸ’Zÿ.ÊSv6Ó8Ný·^±e¬™¿„­îVf>s'Ó²Ïä±c+/^ŒlcÅÒµ”Ä:e|ävêN~¦ƒ1¾z^ Ñc /ŸÁÙéÉuÿfpœŸ½Óó­§ì‚ØN5Ñ[šø=ßý÷4©¶Tï4ñæiˆó2ñçëøvoªŽ{XǪåÒ¶#û†¦~^ÉËø)ÿ^â§Í SùÝ߯Ó?+Ö%â}ÈíßÅ7qG3¥s̽SøËˆœäºzö¶ë)²Gö÷¶µ¿¯Ÿ¤DÓVZ/®zú®„X‡SÓÖc™ðß“ë}jí®¿}^‚õÙ#û{ÛÚß×OR¢‰.pˆ×uP󘯡> ÏH´ž"{bo[ûûúI*hŽˆˆxÂnaþÀB¬ØED$IçµÞóyìV`EÝ]¹Ï˜ˆˆÈžS— ˆˆx‚KDDØŠ ºÊîR EDJM`9~Ô’Ñù n-ãUÆ¡}~6ƒ[9{8Ú˜5lªu©ö")“º{ š_ûíeþ ãÆ´§ç¬åübKˆP#l´6á:ìãã°:sm/?ÁÊ?…ÊÃ|¿|;¯ÍØÂÛvctªÏÏ A­9§O=[ú º.6–òÁWyni„Hc×¢©jŸªÚ9N9§+ãóêûš¡ zbooOî;ERI_噄ý!Œ½±†f¹~2 ùÓ¥”ø ­[e1jHKnëèã¹dp IDAT托J~GiÒ‚œF'Îmë²à»"&ÍQh}tÎϤyv4MíST;7ÂŒV³:=6Ï·¶çò¶¥<6}+«¢ëº,/SXÉÞ‘ÒÀjÖ9;/N£GŽ¡hKÿùt=Ï.‹¶ƒNìÆoÚnåúg6±$C×]¸¯¿zj=ómLÆGï­¹lP6}š9DË*˜úæ*žXãâýæqÙ , r`Ó†R^ÿxSVG‰2¹ö’ôœµœk¿Ž}Âõç6ç¯?jÅŠW—rG·ãüné´Írà²q} /}°i\ÜÊEètXW^[Âï¦-áÖņCG´áü‚ s|¤eÎ{«™Ò©#·íîz6f ã­Ã¢(.‰êç0pt7~›¿'ndQlZ&7^Ú3–qãÜ0a -úvbÂ1–¿=½†¶e\µLÈåÌ[SÊvXQÂì’tž8!“A9>‚C»rGR5pè5´ç´ðÆ«+™°2B¤ê5æÅn¼lcmk¿i?)©eãºR6UÖ°¼§ -Ã,XU‚0±o»7>ú Ú‡ÚŒ0RXþ€Ë¼¯72¹ØÐ£O+ÎÛ‰ô—óøZ—E ÊdqPÖf–lµ`|tY¿‰áD;ZC—!¸{„Ÿ9_oæž5aÈô±}«Åbè6´#w÷ñÕ—›¸s“¥[ßÖ\zfG‚ϭ๱nǘo k >Çà`ÀøèÚ9ƒ¼­[¸ÿý ÊӌҚŸžjYõôz¾©Üb6Î]ËÝß… [Ké¶(®I§O¯,:òà‡els îÆ‹Jww=³†õ¬ƒ5t–¨~.K—ãöÉ g,ÚiÍ2énhÙ%Œ¹aÂ8té’†³e3ßW8ŒJTËŠd?™ÛÊ£!'7“Q¥áó]I”ÅÉÖ =ƒÓû/[Ç «"„íN¯ûaûIIí¨ùwõo[5ë†j¶·ÚŒâ–Mö+°ëزx “æ”Qfá³¥å8væ´¡™¼ðz1ÛÖnãÛH{ŽêäãÍm"ié m‹>(§$Á¥ý²ý¤¢v ì³mF;R»òĶ Xå›yeDÚ5gH¶CÇžYän-fnI£—*¿15ª=ïÔÝck5tKØB `’nû6êÁTÛé.}ÂÛÝõ¬GJjXß:$S?7¬Ea²;çÐ%+ÈQ­£ÌXXÌû…>†u ЮK6ù¥%|^ÿ“pÝZ&%bé¦r–l(盥ۘøöZÞ.ósÜÀ 6Ê·IÔ RZÁÚäµ TšÛ­õ÷ZûIAíÚWÛŒ-°LZ:#Úû¨ØRÁ–hìoEË·ðAy:'÷Éäˆî~ÖÌ/fM$ñ|ÂÛËYõqP?ifçÇVF|ô«ý˜/À|áÂr6EÁºQÖ•[Z´±;+b]¶G ##ùëhvg=ãIU ë[‡¤ê‡eÍÂm¬fsÒA¹ô óuQˆÙ #´ë“Ëè~él^¸eI_ÙUGpšù å±\a25¨(gê÷Q2{µfL›øïÝ~Û~ö´v ìÓmFö{)t‘Ù"“¡ÊÒÒ8t@+ÆfW0qJiÍ9„P9¯Ï 3zh[:ùBL\nðº[VÂĹaþ<¸#·šÍ¼³&LEÀOpËv>ÞTÂÄY!îÒë"›øÏFèÚ·g写üV)Û- óÙ‚0?цk†;L_Ám$7Ù•rÃÌßèrjßVœ¶®ˆeøÉÞ^Ìûÿ¶‚çã£ïc;w[1ïnnÍeÎ6>,LÕðcËö­Q½ZqÛ±ÿ—•EX·~+ü·ék*‡š'Y·¤„<³‚oF´fL÷–üô~,[ Ëøb¶ÁÁz«ýCNÀ°­0J¸‘k—hÙö­6#’x½ÄI“&…FwðÅôéÓ™¸þê~£1•HVþßZ[}"y‡é‚YüâÂö´þt9¿žNúNÆ€¡æLkmõ‰â^»òï;½n‚å3&¶óŠÖz’ã˜êyAlhsÝ׎÷¼=YÏÆ®a¼uØéuë©|ÆàÖú.´xëŸL-1u‡¿»Rƒºm[¯µ';—»/Écóԥܳ,ºÓ¿qjgpŒÅuëÌcj3â ´™É £GÕ›+ãÆ; (J+Jjý» (OY— µ$ïЦm9ÆGÿCÚrT¨ˆ[…c Ôñ‘ß2@FÜ~KqQëCU£¨âm ½vÃÓXk+?}Öpël)nœäØùy©XÏÆ«a¼uˆ­GÃõÃB´Î4ñê–L-¾Œ¿IPƒ„ó¬¿íT?¾¯· £eyÅ[™°&°B£Ô.þ<÷¥6#ަ¹5“/À Çwâ‡-aËš"î}m ßW^±ïdfsÝym(pâ²Ìxm w.ßùÓä>©1×ó@©a" j°_h`ýJV¬cüDˆFvc÷÷ÚÉ!e]‚ ¾PUwEœî'îŽ6ƺÖS;ÚÆ\Ï¥†‰$ªÁþ 1×o¯ìÛö©.Á†$ê®ØŸÿs=”&’¸ÛËûsýö÷ÚÉþO_Ñ#""ž°[GX¯^Ýknß$""šÉ/ÌÜãyìV`ù£À‘&¥.Añ–ˆˆx‚KDDYëÈF>š0ÏóÏçš1HßÇÕyºÖ“l­“¡À’”ðÌ'Ñð:>~ñefŸt g k‰ow§i,I”pŸ¬u´ˆy}Âì#ÏÀu]¬ÓÀÊ-cÍwß²:»‡vÍjÚWñj­½Hç°d_²·6lwËÜ6þÌî|)Ý3–i ì(­Åu-ÖÆþw‰“™¦LÓŸWq·òß»®çîO7±€/‹ÖùùtôÎ9çÔ2@RŸ+—É­üÝàâ•/æéßÿ‘…gþƒ;gÒP¾¥Ú^©u}›øúµ‰L~ï,ßL¤Y>ÝûàÌ‹ÎæÈ.ž¿Q²µN†KRbïV˜åoMfV( »à%^þþ8®ê×Àίz+w¬»;M#°Ø¦ÿÔoÃlÛ°‰pþéÜrÅ@2˶°vÕb>ëanx} cw'?9¤YÃÝ¢µ'©À²ëºX·ik\ýò{£Öñæ_º€'oºç—ä0ð䏸ô6ø —1óW¸óªøêö{¸fX‹&ë–n ÉÖ: ,I‰½X¶d“§®§Ïå·2òýßóÌó_3îöÃiY{ëobƳðÔæ°¬(@›ža«Å±µv”ÉLÓ\ܤϫ¤.°lì'§+8˜æ>ÍɧbÊí7ò¯{þIÿû¯ãÈÖ~L¸Ù¯>Æã¯Íâ"y#9ïÊKÝ= _Ý·@Ó¯xêçœötlûßô$wžƒIð¼í¸÷J­wšyó'ÝË KÚpæ]ââ~9ø,'Ž=š—n»‘'î{‚‘]Ͱœ­|òè?xæó%¬Ù\B8ÐŒ}†sæe?bt욺$ª¹»‰¾‰_,gý–Â&“¼^C9çÊñœØ#uµ­+ÙZ'C%)ÑôåRøå+|âãæ£¢ o(ÏÞý*®Æiù•ÝX¶ŒyßÂïß° ;g<çõHcËwïóüȨޱ&1MS­Rl_Õ TVlNµ×Óà¤w椟̫׽ƋŸmâ°1ÍYöÜÜ6%ƒ±—]Ïø¶¥|ýü#ÜÿkCû‡®`@zåó«»+X”hzlú¼17rËñmI3†ŒvÊY˜èy9¾äº(²7j]WÉ|^ž¾Žô7sVŸª°Š-œìƘK~À+·¾ËK3/äÐËYüõ7¬k÷C~~EO‚¥«øúÉÜÝb¶ÿãü°K:†j,aé¬ïØØþl®¹ª'Å+ùtò3<ø¾’YNjj[W’µN†KR¢É+²ž÷_™GÖ‘¿¥¶CÆÀ±Ýì¦L_Î õ hÀ-šÉ¤é›hwö_¸ñ¼®¤;À <–¿?—¹•ËÝÚð4MvËÝ çUjußÕíÊKk×—Îþ×X°h#åÛ—ñÔ«k)ÿ—ŽÊ#` oÞf¾¸ê%Þ^|ýûT¤«<—µ}O'š¾`!آݻu$` ÆÐðó¤æ|×^©uÑ­+XYjiÛ¿#™fçk•‚û‘oÞaÍÂÍ„G¦a­%£ó Ö› Ìða=1Wÿ†ç&}ˉ¿<„¬Òj××­œÇ@F îMÐÊÀv˜uÓ >XVNÿ¾r.1ÙZ'C%)áºn“Vh廼±,Ñ×t%Ý€ öääQm™6ým¾?ë'ôÏro^ÄêP3lC zC¬úGlG”Ì4My+™¦´Ö5iµó¹'kqMìwhÃ÷¬ªˆ°öÁ+9ó!Só¸ë’¾±Œhoj©XKhã÷¬L4}O µ>ÑÇ^»ÁçÙŒ”ì•Z×]7е`,qÛ™­ìF« ÍØã&Vhcp²zpxß o-ùžáAª]Ÿç‘Ö¦;­Ìذ-Òhm=ÙZ'C%)Ñ´GXå,zó=ÖE ™ôò\Õ¶éFqm¯Ï»€¾Cr° J¤ö‰ýêtÕ'Ú†§Ù׫ѺëVhÝw¬ [Zwo‰?!JÁWÝÎ%;~Oo•ƒÂšµ°Ûàôkc=EÖÝ¡Æ ?/‰ɬöÞ¨uN³NtH7Ìš¿ŠÒ“ÛЬÎI¤²5óXk m»5ÇgKª¨Öûdñù°Q¢n25ß¶ó<œ4¸D\W%k-Ömš]»-™Ïë‘Æ\3¼eÍÉb[ȧÿø3¯¿1‡­GÒ¼U/:^åÛ/VPÖ¯€Lc ºç*¶¼$¦IÑùâ¹ÆÅ$qüÒZךOíuµ+yó±·Ø1”뇵"Ýß|_+–YòŽëH¦³ã’Ú}pÄFþùšwk`ú4²Ó¡¬°ŒHÔÅ_¹wmðy)Zï½R뺂½{\k>{ëi^;¥7çdU‡Œ ­bú“ïQ˜9Œ+äâØâšs„nÕ`¡uÌ\P‚¿]7Z8IÔ‘®v ÅyC9¦wCÏKÍŽo¯Ôz'ôw5§~ó&ßz#‹ÇŒfD¯6øŠ–1ë?¯óñŠl޼ᆶðA$64¼pÆ‹<Ûé(úµ ³ôÃɼ¸¶%c®>ˆ&·ÚÙªáå5GX±nÜZëÚk™l­“7°te·ìª& ,·ˆYoΡ¼óy Íó×ùÜæ£Ýð£è2ñÞ˜±£Ç´§ëY·sgÎ$žzóEþöÆ6¢¾tšµî͈Nk±¤Ñ­ÁišFeD6<]JËGVë83¦pÏï§€“A«víé<øb~ƱÔ:‹µA .ü¿Ï}’§ß̽S·ãsé2ô†Û“ì@+ŽøÑ©|òàtžxk8ƒ./h`úf ¹ô Fÿý^¼÷.BÁÖrvO/è”øy)ºŠv¯Ô:“Ù›KîºþSžçåOÞ䱩ED²òèÒkW_ýCŽêž¿²ÔNz)s^y”W6EÉíØ—ÓoºœózgÆ"¡¡÷ˆªlªXuÎa6Â:&[ëdÄû¸˜4iRhôèÑú–MIÊ;ï¿Ã‡A8n’׳n_Ü!M7ê‚ã«é^±îާ1ãìÐÇŸÌ4Í1±½ñ‚… 8tà¡q·¿Æ¨µu]Üêrl´Œ³sGÎŽu2cpj ]yß=§úo §§êŽ"•9N=ïYÝçí¹½UëúÄ[ßê^Á3¿¸‰wý†.í»W£18Æ¡î¢'ªu£ØZïO¼í%Õ’©õôéÓ7nÜY@PZùSRëße@¹º%%štÐ…qp¨¿'À8U£Î*ÿ‚1u¿@®îÉûd¦i\.»p^%• f N¼§q?qï\§ÚËb*wN¶NÖ?½©õXâ÷,•ë¼×j]¯8í¯vý«þmvý/AíŒS9Ø¥Ö{°Óö’ZÉÖ: ,I‰½sk¦ý1¦Áo¸U­SÃSµ®Ûu·,Ò®H¦ÖÉP`IJX«¯aØSÖØ» Të=ç¹Zû;rî}Opޱµºp÷}ÉÖ: ,I™}ⓨ‡ÙÊ›„&3ŒZµÞ3ž¬uœîóŽ—ª*°DDê¡ÀJ ›¢C,–ˆH=öú7G6òÑ„ |ž>׌éDº+ Æêæ·""j¯aE‹˜÷Ñ'Ì>ò \×Å:L,Ð9,‘ÆÖ$ÞÌÌWŸâ¹÷¾áû[(÷eÒ¶×!wÎ¥\0È­<ʳ•ËÒ¸‹Ò Fç°DD[c–-[ÈÄ›oåÙEAz?:½3-Ùʲᆪ°bÇ€òj`Y¬Ž°DD[£–-gÁ³÷ñ좖Œùý]ŒØŒ@åµJGýàd¬qpÂEU×–»y¯?ÎcS¾dÁÈë5„Ó.Ïiýšá3±ù.çßÜÿìGÌßTMÏcÄøßpó íI3@¸Ù¯>Æã¯Íâ"y#9ïÊKÝ=+öüsquKD¤±5j`•Ìçåi« ù%çö¯ +ŒÁT…TlA*—%ÄÒçnç¦g‹rîeÜÖݰôÝIð§ÿ˜;†¶Ã¿u=Årñc±¶‚EÏÝÁmS2{ÙõŒo[Ê×Ï?Âý¿6´è äøHyft„%"ÒØ3°¢[—³¼ÔÒö Žd;õ\«Tý·Ør¸ÛçðÔK+h}úÁK¿ÝØIDATÝÜpnw2ÈA©¸ú&&OœÃ˜Û†¾m#[ÝLú Ê¡ý²qè Æ€µ¸ÅsxúÕµŒ€KGå0Ð7o3_\õo/¾ˆþ2Iõ¸ãê–ˆH£s]·Ñ˺Q¬㘚#©&ªÌ¬Êà müË+²é?¸éUGdéù 9(“¿[À†Ð`ºw;‰ü”Ç}5KŽ<‰ÓN=‘#zæâ7Úø=++"¬}ðJÎ|¨òù•·ŸJßXFÔf¤üË’ºÐW`‰ˆÔ£1°œœ|Ú ß,XCY´-þx'êaYkq‰õ°Õ„œu»UM“Þ‰SoCg½Ç”W^ã¯7¾ÆÔó~ËoÏî?!JÁWÝÎ%;M¥·ÊÁGêv¤2°ôŽ""õ°ÖbÝFúÉè˘£r)ûtS•ÆŸ6âb]‹¿eO:ŠùnæZ*ª¦©XËWß•èГV> ®'“އŽá§¿ý¿;>“S§±¨ÔÅiÞ|_+–Yò:v¤S§Nt®üi›ék”õ¬ºùm*èKD¤;¬=“ƒÇý˜cgý…I7ÝÄ¢SŽgh¯|š;Ŭ_ú=kóOá²#²h“›ç|Â׫Ú3¼ãþ¿½» £Œã8þ}&n³)Mb7qµµi£Ôœ,iÚHi‰š‹EL[AЛ§zñ$ˆE=(ö$xðÐ"„âÛ¥…HÑ‹ô ƒ¶D 4mºZb’Ý쌇g2»I²ÙYÓ—ß'<̾ÌÌî^òãÿüçåäð£¼þÕ|Øü"ÇöÀÔwøòêNŽŸÞÇ6 xýG¾þÙe×î -ÅëLü5»u;[0í}œx&Ë—Þç]ç8OïË’.ÌqõVGŽ=AkôId_‘¥kg‰ˆ4þ<,çÁ~^;ûO^øŒ±Ÿ.òñÅ›”HѾ³‡CÏ.Stbð¥a¾ÿhœsc‡ÙÿJÝ/¼É™–óœû„wòy¬—So½ÌðãÍ< sðÃcüš_£™Ž½‡yõôsìN^šžSos¦ý<Ÿ~ó9g/ÝÂM·³çàIÙ˶̹yþ_¢â45::ZÒ]6E侕û6ÇàÀ ÅåbÃ?ËsÝ /”k7N¹Ç\ÏÐÁñ›NžççeÝàßµ¿þÊ®ªÞ¶·Ÿg0ÆûNšcÊ)8ùû$zDæÊøø8###Ï À¿þ˜=^5%("ã»– 1ªorè…BÇ ¾ÿŠD·¯kׯ̅êƒ)ÊÛ†?¯Q¿ÓÅÅ$tì¡KD$Ʀ_üöaŒ îÜ<=3Ål~†ÎÌÃtíè&z¢/šKD$Ʀß^äààà/˜ZÍ_£T*1›¿Æ®Gº©¥ó¤ÀY…*¬úØ‹ßÀCg&ëWXٚ X""±ì4–B«ÚZÛ‚§];ºC•Um‰¥À‰ÐÖÚÆ¹tlïØì¯rW»9ÿSÓ“AÏjzæOõ°DD’Ô×ÛÇÄ/\¾rY§ølÐѧŽråïß*zVêa‰ˆ$lKj ýûû7ûkÜÕ¢zVêa‰ˆ4€*«úU÷¬ÔÑ;BõyVÕ=«zzXºZ»ˆˆ$&Ü£ò¼µŸ×B%""‰éÌdq§¢gµÚóZhJPDD³VÏJ=,¹C˜ªÊi­çëX¹\nc{©%‘"°ìàúÃóGd=öÐ ¤–ÐÒ>Nûï§ùDDä¾Q–€E,øc1´\Š«°<ÊÉV¢œvE ‰•€óü×EDDêµL9°–€+Õ–­´<ˆž´å—ëoÐäo«R̶"""µ²…Qrh…§ƒiÁ¸Ð±ÕU‰è°²A&""R/›5vØ*Ëæ ë«°¢ÂªˆÎá‘dؼ±cCV8¬Â=-–ˆˆ$Ãh3&¼¬©Â²›¨ +]RDD’`s&\á媖GåñŠ+ IDATxœìw|ÅûÇß³Wr¹äÒ =!…¡÷®4» TAP)Ž`Elˆ6šô&Õò³ûUìR•""½H „ôr·ûûã.É%¹J€à¼_¯ãŽ-3Ï<³ÙÏ>3³3 ‘H$‰D"‘H$‰D"‘H$‰D"‘H$ÉÍ(c{Y߉D"‘H®>ZYßz'‰?üPÕ4ÍÅ.‰D"‘H$Mß¾}=±‹µ¨E¾5WŽ··7-Z´@hK$‰Dr-Ù´i€ »`«€­È·JI¸z½^ ¸D"‘H$×ooowì‚muúŽo %FàŠ¢H—H$‰äãããöÜ è€\ Æžå7«»ŒÀ…èt:)à‰D"‘\cÚëŽ]¸‹Š·êø¿ë¸D"‘H$×wìÑwQñÖaoRw9ˆM€&#p‰D"‘H®& ‹·Â}á®#ð¬¬lK$‰DrÈÊÊ»€Cx[‡°»ŒÀ³²²PUU ¸D"‘H$ׇ€»QX¼s±‹wž€»ŽÀ332°ÙlRÀ%‰D"¹Æ8Ü€]¸õØû½ ‰7”0‘‹2—H$‰äÆ¥€ EÈ\"‘H$’׸ªÉ\"‘H$’—ž››+#p‰D"‘H®Ž>ð2)á5²,)à‰D"‘\Ê+àŠ«™™WÕ‰D"‘H$åãŠ\ÆÝ‰D"‘ÜØ¸p©à‰D"‘ÜиpƒK$‰DrcãRÀUU½ÖvH$‰D"¹\ ¸¢È\"‘H$’—®i×Ú ‰D"‘H$—B }à‰D"‘Hnd¤€K$‰DR ‘.‘H$I%¤„>p9 ]"‘H$’ù¸D"‘H$•fb“.‘H$ÉŒì—H$‰¤"\"‘H$’Jˆp‰D"‘H*!RÀ%‰D"©„H—H$‰¤"\"‘H$’Jˆþz ‘TöœÉæýŸ’IÉR©,kýXUk圔)#»rÚcÕ°ªs…è¨àƨ[ý¨â&gëH—HÊ")ÍÊ„ÿ;K(jz¹s3Nt¤Sznœ²ÝI:‚î–W®H«5Uãxb/|v–y†âï©«ÀÜ$• ðääd:„Íf«è¬* ›Í†ªVΈÀMÓÈÍͽÞf\®E(Š‚··7Ç 'ÌÏLd —œäHR*zuè‘^$%§±õHwÖñF^Žÿm*TÀ³²²Øµk ÔÇ××·"³º¡Ðét(Š^P^t::ÝM¨ªÊéÓ§ùê«£ÜY7†îMÝå SrÝùÈàÁ‘„T4nœöÉõ¡B<))‰   BCÃdä"©t(ŠŽÐÐ0¬Ê9ªUqCH—\wªUqcÛ¡¤ëm†ä B<554íÆèÏ’H.‡”l•P_“oÉ A˜Ÿ‰s)Ù cðÿ<*àiiiDDTsÜø¤ˆK*V›Ffv.Þn×Û‰€@o722s°Ú4Œz)àÿe*\À-/d.©¬œIÎ$ÈÛˆþF"K$‰N{ë9—’C¨Ÿéz›#¹ŽT˜€çääàæfDFß’Êʹ‹™Tó3Ê–JÉ E˜Ÿ‰¤´lBüLòÒüãRÀmWAoÓÒÒðôôüïögdÞðqü\ÿ5æ©GiœšÁ‰Ý;9îY‡fQtâ2Ò”Ÿ’üí‚„ä BýÜQ„¸1bªÿkÇ-ui^FY$7(—Q‡aUÜHJÉÍ[>\þ‡q)àWã¨ôôt¼¼¼Ê'à9 l^¿åÿÛÎÞ#‰äz‡߆?H‡(óõ™ïUMäÿžìË›{mX)ü‘ù,}8 ·Òþp„þÁa„TuGÒý¹ŸÏ¿ÀÞ^ XéYPÞKIãRQ“ùá¥'˜øË9¬ ó$ ,ŒØÆwÐïÁÛ©WÅxóÞJò· ΧdZÕB¹î’9 l^=…ßþÉÞ#çÈP< ‰kÊý‡1¨M†ŠphÖ~æ?ó ÿ<°”eQ.ëe<õŸ<Þ“7rú0ûÝÁ4ðÒ”6}3c»ŒçÌã+YÜ3´bÊ ^àû ƒyá§Çõh!0<ŒØ&wñpÿ»¨_õ&¾/£ƒ}Ü9rú|…›&¹±©°&ôôôt||¼ËLÑ‹N8n æà²od†0º¾8“.BPžÀYUU4´Â —˜Æ¥‘ËųçÈ ëÍkÃaÎLâä¿ûùõÓ™ ùh=ݧ¾ÍÈ&Þ×Áï×—þvÁ…‹é4Žñ/S¿µŒ˜7l( öš©swW퉿’Ì¡];I橯 )¯,—ýZ·î_ʨ—Y:¹+ùO§6› ›ze9”M.)gÈ ïËäQMðÈHäı}üüÉ[<ºn-=g¼Ï˜¦>7ýõX^}ÜÙ~ qó>ÚHÊÀ¥€_–´´4ÂÂBR"G-“¿¿Î²ý<0ó¯ç…^ ]îëÌÊ1C™3e·,G+¯ üøÞ›,üí'Î¥‘cô¡ZíÖôò(wÇz4;åžgÛš÷yï£M¼ Pë5„{b<Щ |ÿö,ØxˆÓ‰éäãZÒÔ0º8§a7ÚþíI½ ðsÞ)4.üø ý^ù‡ŽÓæ2ª]î1–x‚e~cXòr'‚´£|0ðq¾h6“•ÃjaYùj6So`÷¹,4S mž|“WïŨý`íçÛ³h0q=ï¶<Ï‚ANihçʶ_MãŸÏæòÞúßùëøE4wÃjqϸçx8Æi"M³MðЦ~ÆŽòuâ¾îw³vÜÞ}yõ>O=B½ÈÎõ³xoýFþ9«P³=‡£W]©ìþÄ~Ìß§ÒÐùÆÑã•) >Ĥ>O±¯×,ìQ€õäz>¼œêS—3¡n:?¼ó ~?Èé¤ rp'¤Ñ]<ÐZaËWß±åЄo4­ÍÓÝâ°äex%õ\’¿oñ.ö ”’ž¿·¹ô[¤–ɞů²`¯?=gÎadc Ž„´»z€PPÔ$~û`s¾ÿ‹£§/’¥Yhöô|fÞ‚ÁšÄÖßfæºß9p^G`íö xêIºÆZЉ\Ž­{Ž‘låTš ½OÍîÆs4'ÀIÍŽÌ}ˆ6ó쿾úsÚû ”š®‹rø×Çÿ錛Å‚'êøº(¹%¥«cû«½¶óN-Bœ»‚HÿƒçºáØ •,îŠA¨$~5œ{§yyí4:W)ˆö5 ðªNÃÆ©¢Àítïu/«Æ fæÄi4\òô5™kÞaÆÚߨsF#0®½GŒ¤O=_§ë1…¿Ö¿Ë̵¿±ûT*:ßZô~}ëàå#ÙûÀ–öÄM€õÄjú÷]J̌ռ\?ïg¼Ê¼_r:1lÌ„6¾—¾m6ñ ›žGT©N›>ãy®g-¼ò¯ÇR|­žåÓ_eÞo‡8}.láIP­Ö<üÔHî¯Qq»¬Ãª ÀÇLzzfiW¥ä?@…EàåêOßͪ/OãÖæ%úÆç‰7€@qæþÇï`Õè¯X¹u0ÍÚ¥°óvN?ȸa5pÏ8ÎæO–3å‰ý¤,˜NßH‚,ö-yŠÑ™é6䆦±yù;¼ù´Bèâ4rKãà¶]œ éÇÓ£jbN;Æ+2íi=aËFÓØC)¸Qk¥<kßÖO0ºå`^š²˜ö<Šï—SYðoƾ؎=h9ªêˆ\4œãë™0í;Ì=‡1¥eúä3¤Fø Ç¾_î›À+wcTˆræ'Þ~gÛÏæÐ¿º© ¹ØeùŠ)’®Ãîc͵¬øåQÚÝçÇÑ¥c¶$•–ý‡0)Fpð›E¼7r,™óÞå‘ê&„ÈáðЧ²ðO]IuXò%çãi"77‡\›Š›þÆ›ÅPrm¨/^ú»³Öä#Mש‰G±§}9¢áâ NìK$§­}4»9ª)íZÕÆ¬´¤më8t<Å’E»è2±)žéòÁºÔzr1Cï   NP¿=¼’ÏÉò…rÿk-ñNû“y+Ðó]^T£`°ˆŒ²rË«“Æ´lR³RŸ³?óЪîì~'Í=D;~~Íœ%·V$ÆÔ+¬çèü]„äÔL¼Mˆ2ú/¬É9”®Ü ª "+¡¨ž1­¸µeÿã4Ù­}0;6»W fÈü²h)ËL·X‘…ž€¶£™òà›<™&5§p‘µ”m¥¦ûR­Äé¦ñó¾Tî ò"iÇ΢ûÏïÍlþ8¿íÊ"¢{Cª–«=\` ­O”þCþÞ›@fÊaf/?LPßy¼2°&Š ]³h²û=Ê’yÛè1¥5>©Û˜µì }æ2ù±¸Ë¸Á#º­›ÅcVzæGXÁ]½î¡•EA4pçÏžfÓ–3äÔŽÆ­ Ÿ4®›—fsÚµ´ß»š†eó?ðí‘LWw]‡¥zE¼M¤¤fáïëQ?JnF*DÀÓÒÒððð(sЕ¦©Îÿ)æµòjZA”Zð@ñ¨Á-uÜùøÀ?$ä4ÁðDz­œ|ë!:LÏOÕ¦â~&[m-oS~n1ð%g.Z òp¶'úaÞÓ/Å!¶o"M4 ¥j;Fý†¾S¿çlÍaLj€!/ŠË+»Ãv·˜®ôkôï{„ƒºÒ«{Ú×ÌëÓ³+œzÁ4M+–F¾?K°?çìßÌ4Ó°mN­…Ò(Z¾ü´¯bF4œ3{8œíI½æ¡¸;Ò¦pZÖó`Å_{8›ÝÓÙÝÊò¤^ó°üc ò(Rp.¥‹2ð‹ô…ìó\ÈÒÀ0V!ÜþNJǪªhWZÏ%ù»É©ø”=]8®c^çˆ]”÷-Pû ûÜŽf[9ñfoZO-\óÙL4aâìï˘¹è 68K†â>Ó†ábš“]B„¢äGm9e¦k)°3ßfÐY¨7èžÜ>˜·^YOýÉ‘é An銆õèmeÁχÉlÅ_?Ÿ!æ¡×|ËÆS¹Ä·±9)vÍ1:û*ï·pŽÀ œ—w§È=û7‡²-4hY Î^^s$­XXºóorZã‘ð³,4hQp ù䥙WW"ÿAÚ¹îòêɪÕý ûsŠ¢ ÌþDøÀîóhP¦O´zÎi*(ŠÀ=¸ü§SÔë°,}̤ddRÕ×Cö‚ÿG©·@·PÖûßz滋`Ë_ÇH¿/Ÿ"ÑKÖÉ]œÒÁ1¾EšÓEZ zƒ4VM›U3ÑbÌ ©íî4¸Cààƒ^¤8¥î¸‰ëÝÐc#WU‹Øëøm¦fÍøêœÿðûÔí8L–ª¡ÜÀïgo§gxÞ:½EÒr‹¤×Ëh±õkÖ¬ZÃ+O®aýÃoñV¿X<Ðì7MsmCþïâûœí×l¹Ø4zÅùX­Ôó‹o‡ìÓ»ø7W#°FUŒØŸ¢ìe.8Ç~Óq°jCÓŠR<-u›™‹ª©EX¸¶Io0 ÈÁ¦©Øß‰Ðá¦ÕæèsêÙµ¿ “š–N€OÙÑÞ'’#ü¹ûjX¡&ô2±YQ1ÑꙌˆwîk˜ýÐþ]øg’Úi/«KUíë'¾Šs›ŠË™ËH·´àW¸EÓgÂp~}ø^Yÿ(î΋¾••®^£å­aÌøè&fñÍA?nÑŸÍ+Y¿õw~à¨o ž¯æVî±6Ù§vp̪`¿¡Ø¹BP0(Qµ¡!p¹ž°_9™V{3z9ŒÐõŽë1ÏÇzLP­ŽüÊôujq3ô& ØÈUËsiÃ|ͤ¥gÈUÿÃTÈZöþo yAd‰s<Ýo óçù¬Ù›U-اfã³¹ßäцÞý¯QÙÓÏ??û›÷¤a«NU=è«ÄfÈæÈAPDQQQDGEI°‡MÅÓpî ÓJØŽ½?.ï¯Ä¾_妹¼¾Á‹‡f¼ÍãÑû™3åsŽeiÅÒÈÿ­ó ZónŒyë¦ßåÁß}ʾL U˜ðrƒŒ ™XUÍ¥eýÀP%–@%…¿wž#çRÊç´MÍ<Ê'ï}Ês+ú´òÇ=0Ž·Tvn9EVžmÙ'Ø´+ cxMŒCÕX )ìÜ|²à˜¼Î‹`/H:x’ §úÍ Ž]–É…]8Åõ\†¿ó>iiéøz™)K=zwö#cÃÖî˸¤y þ5 ×gqø $º:1Õó>Ñ„ZôdßÊk,}ßGÛúqÔ®[—o§® ¤ŸÏt˜²Ó-¡Z&Ž®Ï‘%³Ùš£æ×IÙé¨Öñn¢“eýg³Ë£%­ÃChÖ!„_ÎÇŸ& óÄšÊ7vZË:Ìú™ë8mnKÿ¶xÇiLaǦ“då•7ç8w¦bŒ¨M›ÀG¸þ";6(8&½7¡Þ‚Ä'ȸ4½,äg®Ì×€ÎÍe–…Ÿ—™ÌŒL.Uø%7‡„®›& 0SoÀxzíDz³ÿþ{hŒ>ù [¾\φ#:¾ø­üt+@ƒ¤_–³¸Z'êUÍáÀwËX~² ÷kˆ—áÓœ]‚xò£‰<'úqo£`ܳ9‘Áw×Â+/àrj6Öœîô…›˜7ý”#ìüÓO§v-{0qá ÌŸù#ÝÞ¢O8ôãûóããK˜ù]k¦Üˆ¡H^9g~ç³-*áÑU1çœáÏ#i¨U0 ÐôþÔ‰qcíÿ–±¦Vª“Dj`+n‹ÑŠÙ[šýx7¦gÆ-{iæ‡è\MáĦ¯9¬jÔ)©|±ãOoÜ3“8ýï~~ûâs¶ž ¤Ëë#¸¥ª!1¨G5]ù¯¹ à®êpðÛÅ,?F¿aðnÆ ®Á Y=çµ~Ü]7Sf"™Õn¡}tm;F0ñ,ÞX–Á=µýÑÞÏE‡íe•IsVt‡ÑW\Ï%ù»¶w¡ÑÙiøyE”=‹ð¢Ùã¹kó³Ì<€=t¥]íªèR8¹o7ÿVëÃ莮ÿ¿V<Ñ=„A«Ÿa¬2îMCqÏ:Ç¿)‘ÜÓ¥îÁu‹X½`^wÔ#ÜœÀ¿iNõh¤~¬‰¿^Èʺ=ˆÕI jË]uKO×»ÌV=¡w=ͨoûñú¶‚ÑÎeÙë­èÃÚÓ-vÓž#°ï ¢Ü o¹ƒ°Ù³Y¡†0hB4¦’|š|€íÛ|pÏLääÑøé“Ù|&˜î3ÆÓ)P"š1´O$ý–<Ë‹îÑ5V°ÿ‹y,:Q¯6Ã[„oK†ôeÀòqŒÓr_ƒ`L‰dD¶§sL(·ÞÉìfðʠîÔ^.\–铲0•P‡>¥NêâçåÁþƒé—o¸¤ÒSa}àžž”çÉPñŒgÈ{ h¸v1+ø„w>:Õ3èZwóÌø~tе`pj¾UÜÒØ¶j«Î©øDÔå—‡3 ÞŒ"4ÀDüàéL÷Ë_.ãõR°š|©ÞzmïŒÃËe³±«mNÛÿ]ŋϬ.ltPO&¶ßÂçÖ[™Ü+³"² £»|Á“ó±µåXZz¨…ÒµžßÇ+?fWb6šf¿fF<׃ên „7­†Ž¤ËëóY1yY¦šõ¯Iû˜<+4ŠÛìÂ~a¡ÉÐÉ<ëö Oâ›,‚£üÐP0èœP°ø¡ü²–‰Ï¬ÅŒhQÍgFŸÛi`røÔ؇Þ`†y³?y—gÏiøÇ4á±iCèUÔï÷ZƒÞbºÏ\æ}¾ˆWV§¡š‚¹uxÚEÑs"/¥¼ÍŸ¾Í Ël(n^T­Þ€Ú>JAw„‹¦ü’Ë}…õ¬”àïÚ^…&ÑÈLOÅÛâIyÐUiË+ÐäƒX÷ËJÞø0+Fü"êÐî\l%ži¦ÞÐ9Ìò{›Yÿ·€×\Äjò#¶Ý“ÜzO¼£ú0y|o,\À _gƒ¦a°Q·šãõ#Å—¶£ž¦ÛËï³hâ8²Üi9°6ëF—žny.ëCè2þ >ïû6^†½:@Ì-÷Õá­7¹½S&!PBÚqoÌlfäÞÃFý¼z¼ª ü¸‚§G­Å“€ðpª·Éì‡î¦Q »CÌLÔô³=fòκ· P£9ÃÞ̓qîŽtÍÔ2›Y¾oóþ'synE*ª)”ŽcÑ!&„è¾oðÆÅ)¼¿þMžZhEq÷& Fcêøê/óÚ2|RÖé%Ö¡7Åß(ÀÛâIVFÚå,¹IpuuV®\™sÛm·]ÖÔ‘999üþûïtìØþ’Î×4µÐ`*û¥à*ç(ó á˦ÓX:4÷ü/Å}hšŠæ4ñ„Jþ !ÕfC ºü“ìƒMPtÅÓQ‹ÏÂæHE€ª¢+xÆ~¼ÈßV(/MsLÖoŠsùpìÏ+¿c0‹jS Ù[û5UÍM&çÈRò#·¼?—'bM…ÊX¬|B ¥xóf!Ÿ³Ý•ß Èq¶©hù‹•IS±©ˆoq.÷•Ö³+¤mµZùö»ŸèÑý¾BÛKGCSµÂåtøÓU]õê\NÇ-gѲ–V–ÒÒ-”¿ ÿæ§mSÑ]¡h°Ìt5›ª!œ¯K›=Eçºù¼øß›c Y ×cAþŽÁe.®GgE #…ÓЊ×S±ëÑÅ1¥úÄÕñ—v=–ÄšuÓþ–6 †2•T¾ýö[úôéÓÈ2Ÿt§ß™@ÖUÀ F _ꙊcDhá­Z‘J J¡›.òRJá§“‚? û3mÁ9¡è\§#Š‹z¡\ì›N¢¬+´­p^"ÿÿ.ˇ@]¡òkZq{K·?—c߯Ÿ"„ðª|˜W~̙ЮÜj,^Æ’Êç\¦‚Ò–èÓrãâA«¤2‚b€TÔ·Åò¼’zvíï<ÒÒÒñ¶˜/qtЕ<°D§/yȉ:׃®ûJ­"Ðé\PZº…ŽÓéKÈB¸´»Ìt…Ž¢§ }Iy”eƒ‹cËQ®R}ªÓ•¿¼ÅÊr©>qu|Ñm%×aiøxy™™)ü?ÊUðôôt<==)Oóù¥á¢y[R5Sÿüªï’nE¸ûY¿;/?Ö‹î!ýVn222°X,×Û ‰¤T,Kþº’ÿÛû¿] <²ðÿxX(èÄUNûfAxÓ|ÈTV<áÔl(G¤v­"ÿ]ÒÓÓ¥€Knx, hšv -E’›… ðÀÀ€ ‹âÍ¢’b¸jªvÙ$.)ôô ®·I©X,’““¯·’ëÄUðŒŒŒr@—HnTì×±§Œj$74žžždd”9?¬ä&åª xvv6?þøóÕNV"¹¦(Š"›Ð%7<‹…ÔÔTþ÷¿ÿ]oS$.èܹs…òxÏž=QÊ3ôU"¹AQUN®ò$¹±1™LtëÖMÞoo@V¯^]öAWH…¸¢(œ9s†­[·’™™)œI$‰ä¦ÇÝݦM›rMò«°õÀ·mÛÆ=÷Ü#û%‰DòŸáóÏ?'88øšäUaž‘‘ábYÀ«KVvûìåôé“äZ­·:ö×Ì žž¼->øøúîhj*˜ÁI"‘H$’«ÅµTXa~-šÍ÷ïÿ:¶¿Ýe¥Íf%×j%77‡3gOóû¯K‰«nÄËý$Ù©Û0z¶Àè}BUá¶J$‰äæçZvW˜€_ ŽŸü—;:ßCNnÙ9Y¨ªjÿh*ªj³¯[¡(¸MD'Uå<¹ÛH=³÷ªÏ’rê-|¸€ÞóN„[ d2ùNb IDATD.‘H$’ÊB¥ðììEÁjÍEÓ4Ô¼QTû·ªªäZs±eïÄ`Ý€§ajö^Ü« Ãìÿ$#éççà¥÷aAã‘".‘H$’Ê@¥~÷Àf³‘·Šª:Vl*²ª™B.†Ü¯°¥,!ùÜ÷Xmn¸WB{•‡ÉÍ…3'“°¯79i›‘ÐH$‰¤2Pé\‡`«âí´´à9É«ñ [@•Ú‰øÄlCè|ìû3þµþ$¤á¼BÆ“´ hjÉþ×P38¾ã7~;”ŠM>×\Òw‰¤‚©ÜnUAÃÞç­i!wDßhh(¤¢7V#3i¹ý$Qd°›Ôl2Îѳ~ñLÔs|<¨-MûÏæÏ[áø<}£omCŸÕ'ɩț´Ã†&-[ѨEáÏ}ó“UQÏYû˜7þi¦ÿ’„õrÎW/ðݳ÷Ñ,ÏîÖ·s׃ùÖÇlO̹¹Û:®Ôw‰DR•º\u4¡ãˆÀ Ðòão„“O+²ÎNÊñ§ðª6ƒüç- ÔT.‹š}˜*5–ƒ(úL£¡ÚlX÷-aÄ‹A¬˜rn"ŸÍfæV´Ùm°…÷gêØ&XtÂÑS¯` ÁXaªj»‚Q•¹¤œI 7üA¦ŒiŠ9#‘“ÇöòÓGS´v5½ÞžÃSÍ|ÐߤîÌw‰DR:•;×Mèαœã§öàZÕôš– ¶DPÁvÍvM=‡Íz³O3}0%bóo@À¶iŒ™·“ÔÒÚDs“زäúÜÝžÆ-;q×à×Y¿/›–ÁÖ—î¤éýï²'Sµ›™¾g:·¡Ïš¼^%ñË!4»e$ß$ÚŠG¨ÞÑ4hܘfÓ´qcš6nH|° Åv–o§ ¥Û=·Ñ²E+µèĽÃÞaõš÷ýÐ=´hÙŠ–÷<Äøÿ&%Ïv[ßMNÏ.wØÏiw7÷ÂG{‹7ù™ó -QôàïOòÛ ·Ó´Ûlö敃ÌíEÓ;_ç4µÝšxÇШIZ·¿“^ŒâÝÕËSïk&¼É†sVûñj2;>|‰‡îëDã–¹kÀ‹,Ûq¡°-j »Ö¼Ê€î·Ó¤e+šß5˜»ÒQ3¶3áö6ôXr”lÇñÖ«èÝúžß–†j½ ÿ”Z—@žÏïu¤Ùò6îô k‹ø¯°ï’©ðg=‰DòŸ¡RGà6›­`Ì™†]{'ÖðÂF$¹¹îŒ&4ëq2.þLfÒטý:áîÝ!ܱÚô J^¼B©Ö“)=ƒxòùç˜Tk1¯u pá¼,þY0œ¡«Íôù*c‚ÒØ¸h*“F+„¯zŠØ[k¡ûz;{’Uj¹+dŸÜÊ_©V7"½GF‘ÉÁß`«þ$u¼Âõä8¶4lÙÁ™ðA¼ô\<¦¤í,Ÿ¾Œ)ÛB¹mÐ`^èIâÏóyëíç¨Z÷CžŠ7£ØRÙ·ñN†àùÑq¸gã÷u‹xmÀ^RVÌæáhS~þÝ'1åÞŒBàˆ—[ŒßmäϤÁÔ S@½ÈîÍ'1ħºY”a·@gަÇ螬°’%?%оGŽ,Æàù)´8Š©5¾˜ËŒ'†“¹t>ƒcM("‡ƒK†3pnÍûarÄ…d¼CÜì½ 6ª³:j*ªME½\ÿˆÒêrMMŽ4Ã2a|-Ì©Gø~é&Ö±æšê\ùÎR|©W‰D"¹L*·€[í½‹& Úç yÞVу÷½¤ŸÆÅ“‹ps÷ÇÝÓ”S³8w 3¡sÑ|î„ÐÐn,Sû=ÆàI“h7•n¾…ÑR¶2ëÃãÄZͨ.ÁÔIäç^Kùdß0^©Ý‘ZÊ›ü´7•ûƒ¼HÚ±™³èÈÝóG2Ûà£ÿ—_wfÙ³U]µ+ïœHçÖ/üßÜž÷?}•n€ÑÍhÓ¼f¥¡g~ ×²Hîî}/­- ¢¡;lÇÆ-gÈ©‰¼sZо]Ò.Ù?n©¥×e“zyi6ç–Vñ˜•V4 ;æÇ6ðÍáLšÄ¸öD"‘\-*·€Ûl€C³…°GÞŠ#N‘ ðE3?€oL :õ(‚d<üƒøá×#´ëø4z7ÿ²3T<©7ø5†ý9©×RJáÜrþæH¶•oô Å”¼­ªMÅýLZÃztŒ¶2ÿ§Cd´bçO§‰yxÆÕßðûÉlâ[Ù”H»f\å_ýQÞy®9ÞyÚeð!ʬ lùµw#U£ý û<ÉÙ ¼ÂÝŸø+)ÂÜѱÎR‹ŽõͬÛ÷7 9ͱäáðg^¾–úÜ[OÇó_nåÜ=÷à{ìwvçDòP=ïò÷gk7j!çìnf[hتfE±—Á=’6 -,Ù±›³Ù­1ŸÝÅ, [Eäsé”ß?eÕ¥Z¯¸ÿLÁ5äSN_´9åXØw‰Drµ¨Ônu¸Î±”ž°ßíBîÜ”.@à‡ªïŒ¦&#´ó¸yF°kÿ|Úvò¡¼¸·húNÁ¯ýßæ¥uav;g³¢b¢Õ³o3ªŽÙ)E9Ѓ^£Uû0¦¯ßÀÁÄ–|sÀö#;á³ië¶œænÃŽú¶dB57×7|Ï0âjÕ¢ŠNä§+`+~¨Þh@ƒ-•“T«Vêèo½A‡¦Ù°:%È‹`ó ¤xÓ¸kc /~Êoç:ÿÃF’Bî ™ù/§ìS;8jÕŠ À˜7ä°H™í *{U—«& £r2sQ5­xB®ÊY–ʨK½H-n†Þ„¹ªsyŠøN"‘H®•ZÀm6›]œ½û[î#Îës-t?WüѨâøíI®íRßÁªuå¥1?Ñkò,Òm*±Ž=ÿšTÓgqø ¤Ku<œòͳ©Z§{ˆ^°†uÿw†­x4<Ž!Ìüê3>â0·'Ö䪹 ËkŠ-Ç99'Ù´;Cx Œa5ác‚ôó™Ø +8UZöãNï¬ùr3m~:KÄ]¨f,Ùng´¬Ã¬›¾–Óæv kˆ‡9ž(ã2¶oV_Äjò#ö–a´¿·Þ:@Ì­÷×aÚäDî¸- “(!·Ð%fÓsïåÎcÉ#•.a܈¥…·…<ćK;]ö¤(Š)…ÍË&³ô¬ ßȆ<ôæxž¨ça·AøÒnô3tŸø _|Š,÷@Z Šç¶ºÞè0Õ¥¿ÆÖèjtñN¢¯À*(?,güÈå xNLëQÌ}øº;ÄÌDÍÁï1×c3×NcT‚F@ Ÿ5†~q3t.s|gòîÇsxvy*ª)”NO5¦cLѾɔ‹oðÞº)Œ]`Eq÷& Fêøê/³ÿ¹Œº,Ó±¥ùN*¸D"¹r\ÝI +V¬È¹ýöÛ/«©öÛo¿¥wïÞ¬^½šÞ½{WèÈÛ×§¼Æ3ãž##3Eql¡8EåJ¡fgÍiÖ6ƒÞÀ+¯Mä™ñÏc4KÌGSm¨(èŠ)«†Í¦‚¢+UišZø•&Qä\MŦjE—/֚͞‡¢sÝ ­©¶Þ!(:fSÑœóÑTì¦å½Žf€•LÎ!Þ ?Ÿ´˜ÃÇ£kã®8º¥È„}®ù¼`־ߑbÊf&ö~–ÓCW2ëž . /n·£^”âå,ì7á¨ÓÒŽ¡°U{Ýò¢ D‘²—Ç?%äWP—®Ž·o#ߦ’}'‘HnNV­Z•¯;w¾líÓ§Ow Èp|Ò~gY.#ðÊòºKþLl]ƒUEÅ~cš­Ðˆô¼¹Ó šÐ]Œ+‚Pt_m@¸\‡\›,¶_èJÊ£, Î/=âÊ(¡ èt.NœÎSœÎÓ29µç0Õ‹ü¹b2_{vc~û€GŸ—ew¡cËò[ÇE)±žŠ•½œþ)9?WÇÝVÄw‰Dr©Ô}àBˆüèHUÕ"ýßöC¹ÿÈì ×j­4,7¹Çùèµ'XtXO@ƒ.¼2}0u<\M:#‘H$’Š¤Ò xnn.ÕªEð÷žÝÔ­SÅåûE¥sèЂƒ±Z­ .ß¼¾y1F3dí/û·‚À `jT¯ABBááá—õPy)¡I½ÂΓH$ÉÕ¤Ò x•*Uˆ¯CllË^ñI^¯' à?&Þ‰D"©ìTZ7DFF^•´d¸D"‘H*•VÀA ¯D"‘Hþ»TjÈÈÈàï=»Ù`ÙÙÙ¥«iþ4oÖ’€€€kd¡D"‘H$WŸJ/à‰‰ç¸˜œÌíïÀbñÊŸøCs¼.–ß;®idgg³ÿÀ~výµƒõ`¸xž´ƒ±ÄÄb‰ªŽÐUzwH$‰ä?B¥W¬ììlôFž ¹ÖÇÌWö5¬´¼ßŽOvNÁÁ!X­V¶}û–o¿!wï~ܪÇRë…‰øÔŠ/×JV‰D"‘\onŠ¡×ÓS:ÞK.4º‚plËÉÉÁäæFdh ç¿['ÏU½¶í»ØóækhÚe΋.‘H$É5¦ÒGày‡xïþk76ÕæÜvîxrr² ñçä–ÅÔkW¶ž#õÈyôiœüê Pµ›ä‘æ?Žõ,ÿ{ï~ ”ç»Eâ&U$ÉMÈ5ðóç“Ø`YÙY%ãææFØ8ªøU¹äô…"PÔª—ߌž?©‹¦¡ªÇïaçWÓ¨áO´§•›Æ®­‘œ›EíI¯|üæÀv]~`k‡~Ø4­ìn5ƒã»¶ó¯¥-¢-r¹O‰DR)p)àꬣ\ûì#.®6Þ^%/Ę’r‘={÷ТYËK~E,¯É<55 Õf+è×ì+Je§ž&ýÐWćya>‹ÈL$d’zQmè8bz D¸põ?Ú×sú2÷ýÇhèå´dú&Fßýg†¬fI¯PŒuãwØ0iOñÉj?û ‹»”¼˜H…b;ŇzóÖ’VJ‹ãùOçÑ-Pͧ[Í«ÿr‘µyãŸfOß嬌¶”{ñ‰D"¹ž” àW?£¬ì,¼½¼Kfoo²K‰ÐKC`_<#=›“€£AfÚ9Nýñ!Ñ~6ªY²ÑçžçTb2‡’ ä4¼Sã[Л=KHYCµÙ°î[ˆƒX1å>"Ü Ö6³Ùl×`ýt» ¶ðþLÛKþ’£:,Q>×/bTªÒþ™éD¤Ø€­|‰é»2vbw¢Ü„΋ŸÊ±úµªÚ.{F?‰D"¹Ü<}àŽƒˆˆT­`ô¹5;_.¢º¿ Ò’ƒ!7‰Ó Iì>žIÌ/â–íƒÐ—¼x>þ Ø61ó¢X<´>–’T37‰-+g0cÍoì?¯#0¾ƒÆ ç¾:þ|¹;CwÞÅ’•ORË]A¤oã™ûFqìÑÕ,éŠQ¨$~ù$wM1òêúéÜVµˆøyGÓ qcª8ç-–įsßdöw»8rú"Yš…æÏ.â.!´dv¬žÉôÕ¿ò÷YÀ¸Öô9š¾õ}íÂo;Ë·Ó^fÎ/9˜F6fB›t¡_;…MŸÍÆçUbhûàӼЫ6^…ò6T« dbÞ`B ¦^“æÔ1;–sµžgËWþ° S/#o[ßÍx•¹?àDB ÙF_"ê´£ÿˆ¡t­YRów.ÇÖ>ð¹[8•fCïAón#xa` œš.ŽÌy–sí¿Mú’y|P¬%Õ§lj—H$×—›JÀ…lß¾«Õ €-7“ ­""ÀD”%}N'Μc×±djv™BpÜ­$ý½§\é+Õz2¥gO>ÿ“j-济.œ—Å? †3tµ™^#_eLPMeÒh…ðUO{k-t_ogO²J-w…ì“[ù+ÕJâ¦C¤÷Á(29øûlÕŸ¤Ž·‹U¾4 UUQóZ1„@'Ø’Ùùý¯®úÏn€š†R£*z‘ÍþÈ—ž‹Ç”´åÓ—1e[(· ÌË=Iüy>o½ýUë~ÈSñf -^–¿ÖzÁ7yKº–êq45]FÞ¶Tömüƒ“¡x~tîÇø}Ý"^°—”³y8Úä"â×áW¿+Ã_쟇Ó[–óæÂ™·†7Úúæ7™vŸÄ”{C0 g˜E”a¿Wåh]H$7'×\À·lÝÌÏ¿üX¬¹ÒÏ× ¾¢´…Ô­[MÓ°Ù¬ìøráþnÄz]@d&ðï™$ö% â»ÍÄ¿zsô剼ó×Ðn,Sû=ÆàI“h7•n¾…ÑR¶2ëÃãÄZͨ.ÁÔIäç^Kùdß0^©Ý‘ZÊ›ü´7•ûƒ¼HÚ±™³èÈÝóG2Ûà£ÿ—_wfÙ³U]ujïz™;Ú½Rðÿª=X²fuô€¦áÓŠö­ê`V°ÜJù•YËôà|^‡‡"¸µy4Y}±hîVzNmƒ/€ÑÍhÓ¼f¥¡g~ ×²Hîî}/­- ¢¡;lÇÆ-gÈ©©œªU–?šÔÓ.=ï|{[о]ÛvŠì6>˜›Ýý#‰«‰Qد%-å÷Òíoâ)§ H$×k.àM›4£Iã¦.÷]ÉŠ`yøÅ‹±Ùl¤'BÍ8KxÕ,Df‡NœcÿB[¡Jt3tzã¥Ï¥®xRoðk ûs S'®¥þ”¨B»sþæH¶•oô Å”¼­ªMÅýLZÃztŒ¶2ÿ§Cd´bçO§‰yxÆÕßðûÉlâ[Ù”H»f¸\¼ú fŽo†—"@€âV•“‚°æ;! º²ÏþÅÁl [Uì(ö}î‘´ihaÉŽÝœÍnOþˆ­¼sTöƒìó$gƒðw"|௤tT4(gÜY–?Ôz—“·ó9öÎR‹ŽõͬÛ÷7 9ͱ3/—3¿-eÆÂÏÙxà,ŠúL†‹Y¨…R,ða¹ìÇS¾u(‘H®×\ÀónºEjj*Vk.ý¹ïóÇHÓY9’p†ó¢ÕÚ<„{@<=аOîr©·húNÁ¯ýßæ¥uavV›­ž}›QuÌN2'0úaÐk´jÆôõ8˜Ø’oøÑ~d'|6­`Ý–ÓÜmØÀQß–L¨ææ:²ó §vÝ:N}à¢\`Ñc„°¿_Ò-½Ñ€ Çþ –} &¨Örë¶S†?ô"õªå­7èÐ4VϹÇÖ0öé¤vÉ+#êá¯eÝ„WøÞé»sïæ_¦ýåö„D"‘\unš>ð<¢¢¢H<{’=OsþPÙõ} ©Ý‡:µ:â^hØ_3ârâ'¡ZW^ó½&Ï"ݦ’×2kð¯I5}‡ BºTÇ£ÐX3ûªuº‡èkX÷gØéÑŠGÃCðèÂ̯>ã#pÛxbM¢„W\Ò1°6QÆ¥lßx’¬50 9Çù}G*ÆÈÚ¹‰‚轌2_eú#ç*ås’M»S1„× Àh/“ Ùì’ŸõïVXcûèý´ 1 l^Äx 6ä¯3ác‚ôó™Øœ¼<õ)‘H$× —®¿ŒÈ´,ÜÜÜHI¹ˆ··O‰Ç\¼˜Œ››éŠòÙ¾};ÇýÃù„ã„Õé„V=ŽØv÷böðÎnû+f*%ÉdÙè ½ûFÛ—I[3ó·*~­Ò#„«Æ3FD÷¦¡¸gãß”(îíZo@Öî±³™ºà}åfÀxë„ÍšÅr5„Á£1]%q^Íy²o$}?Í÷Çé+ØÿÅ\ž¨Æ IÍñ®`*ÓWvâ ™u' ýsØ÷Õ|÷§÷„¦ø(ô^„x ¶üßT£MHBÅBVÍ_‹×õ©æq–Óœ"zCõk˜XùÕVÔíA¬–HJp;î®[v}J$ÉõâšEà5bãØ³÷ïR—üts3Q#¦Æ%E7j‘ùËëÖ­Køxn¿»+:E¢Ó¡×Û‹)ò'vUSò\U/ct}]ŸÂg̤@ÂÍÔ{rsüfòÞ§ó™°ú"V“±· £ý½uðÖº`n½¿Ó&'rÇmQ˜„@ ¹….1³˜ž{/wF¹zÏO&j~¹3˜¹v£4j´`ø¬1ô‹s¿Šù”Dþ¸‚”S ›—MféY¾‘ yèÍññ=¾øYî´Ïmu£Ë®O‰D"¹N¸º…V®\™sÛm·]V3á·ß~KïÞ½Y½z5½{÷.”Fy&ʸ”<5Mcï¾½$$œ¥m›våç¼:¶lÙŒ‡‡uâë–x¾¦ÚPQÐS< ›MEWè`MSQ'wEÎÕTlª†Ptù"ªÙìy(:×í%Û`·Cµ©hEóqicÁQʹšŠ½Xy¯²•ž~!5át^Yþ¸Œ¼sñþýù¤Å>]wE¡(…HyæWÌ@%ÿ$Í1ož‰Jþ"9eÖ§D"‘8XµjU¾vîÜù²u´OŸ>ÝL ÃñIwú d]Ó>ðŠè7ÔëôØlV2331›Íö×4-?¯¼ßyßù6ÈÊÌ";;oŸR.„¢+azMNW| .6;'Xl¿Ð•”GY6ØíPJɰt{\œ[ìøÒÓ/ËÆ’ó¿‚¼…‚¢Ó•,¤BAq:­Ì:A (%Ôr™çJ$ɵ§ÒbóõóåÌ™SüøÓ†²v‡‡UªT¹¢WØ$‰D"¹ÖTjBàíåM||]ÒÒRís —÷\@§Óáéé‰Åâ%GWŒÑ Yû OÈfl‰Dò§R 8€Á`ÀÏÏ??¿K^ŒBŠve¤|Íù‰Dr³SéÜ)ȉD"ù¯ ;~%‰D"©„H—H$‰¤rS5¡_ æ¬ûÖo#3'÷ÒæývÂdÐ3øþÆ éÕ&ÿ]b‰D"‘H®&%øåJWåçy°û-øx™Ë>¸RÒ2y÷Ãx¢GkÓmJ$‰¤xrm*áUÙ~$ù²ŸcW¯J®í2¦g•H$‰¤œÈ>ð"h€Q¯Ëÿ}9ƒ^¾ætC`=Ëÿf>Ï‹ë’ýßmT’H$7)2/£íTº4 CÜå7¡{Y,¾E+×ZÝ7Ùû™õø(~lø‹†×Å£²NR´¶ ìÚð[;ô³¯/^i*D"‘HÊF xJÑ…1.5 §EJJ%ç,WÏcñ×°çp¹>áÔ¨{ >ñ£Ì×`µ0Š;aá„xÞØ]öê9>~´“öØ(². µŸý„Åw/‡}騫~§þ:–Îãÿ¡Ó´•¼ÜÒ§ˆ¿r8¸h}>€‘«ò`¸á²¬•H$’²~,\¼¤¤¤bÛ-ž{ô±r¥¡¥ïæý!CX´Ï‡&ݺ2ôôç°ñ³•<Û÷lœ:ŸÚTA-ÀN·Wfs¿7ø¨y ÕfÃÞŸ©c›`É_¹M‡%ÊÑPÁå°‘rò9¶ó|þÖj\þ(qî+¯©ç¾gúâƒäæfEÓ 2è—H$†p—hØT/L˜@JÊÅBS´¾úÊ«\¼x‘G˜¿ÎxóÎæÚ(sô›–Á®ù/³h_0ýfÏeX}oôŠî [Ï;Yúä@Þ}í=:|ø{‡×æî„,4S·Œ|‡)÷…aÌKë—ƒœNL#3¡MºÐ¯Â¦Ï¿fãóˆ*1´}ði^èU/€ŒL¸ÿ‰€Êç IDATô]Ί‡"q`=±Š{/&æíu¼ÚHÇ‘ÏKÈÏ•zGÓ qcª8‡¿B r1˹Eϳ]†í…°rñd2ð:¾šY¿vcF'ÇCV&»—Ïc“ÂL*çÒmyñµÏ0lîN¥ÙÐûDмÛ^Ø‚½(°©¤ºeœ ¦ò÷'ï1cÕ/ì<žŒfò%¨Z<÷=÷2k¸£XK»6’øuî›ÌþnGN_$K³ÐüÙE¼Ó%ƒ|øHnhJðÿö_®¨ª—&¾XlŸ¢(xzz2oþ÷ØjžyãkÌŒafÛPôN“é‡áÿÙ;ïø¨ŠµñçlÍfKJ:„& H^ïõŠ ¥ÙhV@°¡"¨ ÷ 6ô*íD. Øý© ø^ñ^ì( Ò˦n;çüþØR6›PAæûùì'{Μ™yæ9'ûœy晵¼¬æãyìáŽXsw±ú¹W™»3¡ã'ðø8;9Ÿ/åÙ&¶Ó¿¸¯£ ¥¼ç\eOm]CS5´ºê yƒ‚{wk[à '¶­ÔŽ4Dö*ÿ *…YÅè©ãx õZ]ü&ûúM¤m„‚žý/¿]À…“îŶpyÅò<bº\ÉäY#ˆ‰TIß¾šyËgñt»õ<Õ?ƒZǽqÔ‘_øØ·r7/Îà‚Ñ·òÄM0¤oæég6òu¦qmDÏFß~º…ý±71cZW¢´b”6±¿çG"‘œ² ]GUÕIªª’Ú²5›·l§eJ2:tÀåÂå´ƒº‹p» 9r<›o»{&ObÈ AUÖiüÊþøn©Økôò¶ÝhÎ;ÙƒotˆLíÍ ±)ý¸x@ #'±tÉ.®ù{oÅ;Xð¯#tœºŽ©ÃšaÐ%>‡Ï¯_ÅÛ¿L¢Gg½¼Œ^ ìÓ›Ò‡ 3øêÖÍ|¼¿Œíªz Ô òÔH:õîÏE]\D7@œtë™z!ýz¥aS. !ã3®µ—¸‚¾Ñ-‚¯7ß϶íø:¤b­CÝuÖWïç²³OÇgåú©¤Õçi>UÙ+Ë {)È÷ 8é}Ëͤ^Ê+_àï}müºa;W°|p2­Ôø6¯ •(­û3¤uyiqÞtïí<Ž·_TÐKîÞtŽ ›?¢h Wí%æši؂ތz¨R"‘ü±H‚`¼öyÜ+׬gè 4k‡»°¿·ŒôãAW»ÅlÁå´“”Ø–-’yáå…\2p †Ê;héÁ²k-ïMVqÅ „~ Žö\ÒÅÆ¿üH–¯–¬9à pô©áôž{²šª‘QŠÖ¹fÖfmhÂ;¤»k¾¨XÛ\ÇØž›ynÊHö Θ‘×2¤}tµ‡%h`…0›Þ< ¼ œGr|Ÿ[‚V2kÛúÔW‰–ã™ÿÀ…8K,­¬ "P[†êœŠì•n’VF^ D´ˆÄßÛ/gêòMm׌eofÒé¶ëiï°ÃŹ¥¨ºŽIÈØºŠç—¿Ï¶½™”*‘ËTLnZ ™BÝØüþ¬ïÙSIÁ­°+Jy»N`_}Ÿ !*òJ$’siÀC¡ÇÀgΜ…Ïç«’4gÎl|>‹…ÒÒ|>ªªVü€@÷é”–°X,x«å0F¥’l…¯¾=HÉu ˜«õÂËŽ|ÃQ]Ð:“( )¢Ñd@×U: аÒ硘šf«dr¶&1C”!ŒVL¨ø«‡sXS3}¿zŸ×^]ÍŒq«Y;q! ƶ#2”,f_pªVð VhòW¡`6€¯Ìj:—%L}¡BñíÍéÐ)­Òx˜ÞzÔ){eÔRòJ!"ÊŠA8éqópoXÅü—lƒ˜I3LÆ¢mPšSŒ ø­çÞéË(r7³§t&N?È3gói™*ß›ºòëjÆÚVthÀ³!‘HÎ ¤¨šÆ¬GgÖHSUUù懟Ð5•&q±¸œ\Î(Ü…Eäæç“ž¹Å` 튷wbÔåMøì¬ù©+·§Ušöä=ÀÛ/½GŽýbèÕ£(®™ßwŒ¯~(ÂÔ¼ ÍS\[’Œöÿ*ˆÖ’È*±]j¾CÔ@¤ôÉÃý•KçáÎuo°{Ä º›ë—¿ F .Á‡{Rª·&âT곇rçžì­Ö)‰]=•idaÊÔÊ((Ó±Ú-ÀÜbã/XÅ̳Iÿ8Ý BX°›uŠsJPÏáì ´æÞ‰W3 Þ„P´r 6×Sšºò›ãÚÐL¸ù~W¾®öª.ø ž ‰Dr¶ x(t­–hrMSÑæñq[Î’”¿Ð-ÎÇ/.eÙ‘8FÌìI”"PbúrÇðxÆ®}€{”ñ\Û3O6‡ S¸âÊ4\§Ø|ú¿Ù°M£E«ÆØ|ÇÙùkº={C˜3%0è²,Xò/+åêN1ÿ™üò^¯?ýß¼õÕ¬ïF'ñNAÖöM|y ‰AÍOs>¸æÁí“Íœ¦&ât×í\µ®€‹¯NÁ¢ÀH¤MÁ[àÆ«ƒ+>±œµK_ÇyY’"39\\ÿ™é–:ò‹èÞŒÿk4“–Íàï‘·òׂÃ[Þc¯¦ÓÎø³!‘HΤhªvâ’2¢œ‘Øl6"##ñx<äåæ‘““SáN÷jGW]˜úÊzz¼¶ˆ×ñôº\üöf´N»†ÇÏ_Ú8«LãQ¬EüçÕ°*S%ºE7nš÷·wŽ,’¶Ñù®%,Š™ÏKï,eæ:7k ­NbÐ 0๻ٴb»²¼ [‰ë0˜û猡µU©x¡85L¤Ž™Ç\÷S¼ôÆ\î]@‰pѸMÒ¢ÂÕ×êN`hÊe“ÇðÉœ7™¿a0Miøêzh^н`µ›+Ö ¶µÉ#³t„rBVæH däR€Ø”ÑÌžÅß—-eƇ^ÐuLަtNrPŸ÷Sjù…“ÞÓ^äq˳,Z2ƒ÷Ëì$´Š”òÙ göÙH$g¡~MkÖ¬ñ :´A-7ndĈ¬[·Ž#FœsA1‹—.äÊ+®ÂåtÕ:®zùð‘¤$'‘E|Ó8âbc@×ÉÍÉ%3+@¥Ì 1!‘‡óÉûïV b«„®iå«…•#ŠPNÖíû•—GÞÈÛ½ñÖ´D(ˆ«ÅéºVuª–P0(‚AKzÅ1çP (¢Zzy9¡e Q–®,J©¿«Y_°­š^50OQáê«®/ªåVJ )›¦éåçh°ìUÊW aW¬Ó5MWPÊš©q_!”zÝ›ºò¯×5½B·Þ}‹¹îæM\úÊînºŒ°Ï†D"i(k×®­°C† i°5jÔµ@PZþ)©ô½ ðÈx5úôîÇÛï¼EQQa­×hšFR|~o)Ù¹:š‰×çE×u`P¬f#›¡„ß/ædÏ­„‚b0„ý‘B!ô{‚@©‘Pù\µt¡ ÔÚ= QVzCÕlkèbÃÕW½ C˜žkhÙ*—ÝPÙëN«]ÆÚïKmeV=>¿n`»’Hrœò÷²iÅZŽ'^Ï¥I–Š— S{6$ɹ€4àÕèоIÍ“ðù¼¡—Ù{ð8¹ùnR’1‚Ñæ%Å%äååáv»ƒç¬•”‘”˜(7Ñüvh%ýq3+?ü™Œ’""––ÝGóô”›é`;Í!‰DrV# x5 .Wø‘Á;&L`ÎÜyäæ»‰mMã83Ñ11aÀÐ(óúÈs—PêõqÛ-7ŸÞºÜæTîxý n—.NI(”húݳ˜÷¦UvŸšH$f¤oڵ屇ä‹­_²û—=ìøú{ÜEÁù´ qq±¤ulCÏîÝhÛºu¥Õ…tqJÂSûЄD"ù3# x°X,têØ‘V©©¸Ýäç—Ÿ‡¦jØív\.Q.‡³Ù|ÎòI$‰äìGð"„Àf³a³ÙhÖ´iÈt‰D"‘H~+¤?Hc-‘H$’ß›ðsœ$‰D"‘œ•Èx5½±•ÿݰ“2Ÿ¿ÞË]VÇj22áêîÜq}¿Ó‹@—H$‰¤¤¯Æ‹¯mc̵‰r6|ÙÍÂâ2þù¯Ï¸}x_Â.Ù%‘H$I‘¼~U#¹y,»„Úˤ^to‹_­}t‰D"‘HN—ZÆÀOsצs0 ßò1å¬Ü ™lš?ƒYâ=+‰D"9ã„ìëçñíÄú7fp»†»ÐûêrU5Ÿï6ÆŽÁ7 êº\VV"‘HÎ! øù<-J „Øéë”Ê(ßEªV´lÞšx Ogññ‚Kit®Ž“kù|2c,ÿ_À‚«qs:]|%7Ý4Œî±¦òݸô°[³J$‰äÔ‘cà `ùŠåäææÖ8ï°;¸uâ­õ(AGSUTå\7j~ 3²ð7üûzãÔJÈÞ÷Þ\ù,·n=ÈÂewsaÄ-£D"‘ü9‘<$:ª¦òÈÌ™ºÑ+)Ì™=·ÛÍ-7Ãh¬ª¾¥Ë— j*g$†ÀŸËö5Ïóüú­ìÉ3Фã`Æß?™«Ú80PƯï½ÈK?æ»,ºµ)ï~‘¹W%b—&­€oÖÍç¹u[ø1S§I»¾Œº{£»DæÕL6>ó8‹¶ì#=»¯°Ó´C?ÆÞ?kÚ:jÕë:àjE· º= ½ú1°‡+'}Àë»'Ò³[u]ø9ôúƒLZ¼ãÅ*ƨdz]3…GÆõ¦±QÔ]¿VùÂéNËeËây,üä;¤»ñèz=ô /‹ÇtŽ:B$Éù‰4à!ÐMSyìÑY5ÒEÁn·³déÒ³s(.-Ãï¨hºÎø;§ß ¿×CvNM7n€v/›Ìël\÷îiZ̶WžæÉi Í×ÞO×¼u<øÔGØFÞÃüþ óÓ)jƒ ðª= ¼ìY>‰ K é7n*O·ìý`1Ïß>™²UK™ÐÚŠ¢³wû7d$Žcæí±àÓU‹øÇ4#É뤧#Ô.W!DùЋÀéÀ„ŸRO¨H|1]®dò¬ÄDª¤o_ͼå³xºÝzžê¡®ú-uÉçãç0ºëi-àÛO·°?ö&fLëJ”VŒÒ&£4Þ‰äCðPè:ªª†LRU•Ô–­Ù¼e;-S’éÔ¡®(.§„ Ð]„Û]È‘ãéÜ|ÛíÜ3yC :¥¸½p þu„ŽS×1uX3LºÄçðùõ«xû—I¤™3ÈS#éÔ»?uqaÝQP kOÓ w°àÕý4³”'Æ·#R\Ü+Ϩñ¼²x×=Ýh"S{1°OGlJ.LÌà«[7óñþ2ztެ‡¦ùñy=”øKÈÚ»õÿÜ@–¡3·¶ ÑnGëþ 9±I[Z‡7ÝÄ{;ãí…­®úÛéaÓ»§ü7¬îztÖA×±·êà>iØ@¹õ¦D"9ç<Áxíó¸W®YÏÐAhÖ$wa!~oéǃ®v‹Ù‚Ëi')±;-[$óÂË ¹dà@ §°%¨/ëGx}j8½çž”JS5"2J1]zc{næ¹)#Ù3t8cF^ËöÑk›ÚÓ|™ß³Ïë [Ÿ$lŠ‚ "ZЯ›ƒ•ßü@¦·/QbžìU[›µ¡ ïîýRÃ÷Opùà'ËÅÔ±¥öçŽç§3¬™ á«~±ŸŒ­«x~ùûlÛ›I©‰±LÅäöPUãuÕ:Ý—^wZçÙƒ/5çsÀ¦D"9·‘<zp |æÌYø|U-М9³ñù|X,JKKðù<¨ªZaðjݧSZjÀb±àõÕ°`u£аÒ硘šf«Ô;ØšÄ`ŠˆcÌü ôýê}^{u53Æ­fíÄ…,ÛŽHkj­i'nvu›%„‹F+&TüZ-W¤Žå™û{çpÓ(ŽÆQj‰ä÷ZϽӗQ4änfOéLœ~7fÎæÓ0ꨫþ*éuèÎ(ŠÂÔ$‘H$çÒ€‡@TMcÖ£3k¤)Š‚ªª|óÃOèšJ“¸X\N.gîÂ"róóIÏ܃b0Öꊇ)®-IFûÄkId%Cx¢Ç(ŒRúŽäá‹þÊ¥óÆpçº7Ø=bÝíJ­i4é@Šy»¶ÃÓµ 6!Àw„/¿)ÂÜ¢M-h€ÂÉtîÒ‰F%ä4o!@WƒÆ×sx{­¹wâÕ ˆ7!T'­\‚Í ¨6uê®ïS‰Dr6" x(t­–hrMSÑæñqgÃ6­cógç¯Eèö8ì¤ÿ»Ö4aïÅ]£[0zÅtfFÜÆ•­{>XÌò£IŒ²®»“O¸³C$Ä;YÛ7ñå$úƧ‘ –³véë8/ëBRd&‡‹ÏÜ,q¥ݹÎP=‰DòG# xt@Sµ°‹—”åŒÄf³‰Çã!/7œœœ wº7PÇzè‡^åÁi««œê4ë]–ÿ5ŽÎw-aQÌ|^zg)3×¹ Xch=pƒ®HÔ»›M+Ö±+Ë º•¸ƒ¹ÎZ[¼aÒVÚNx‰Å‘Ï3ÿõg˜š¥Ó¸Mo&/¸‡ÚEœÖâ5µbhÊe“ÇðÉœ7™¿a0Ý;йӳøû²¥ÌøÐ ºŽÉÑ”ÎIÎÌ´¶°º“\"‘üYõ“mZ³foèС ðÙ¸q##FŒ`ݺuŒ1✠Z¼t!W^q.§«ÖU?/>’”ä$²³³ˆoG\l è:¹9¹dfe㨔ù$&$ràÐa>yÿÝAlº¦rHW1T̵Öu ­òEBÁ (?_‘"Š(w_‡K#T¹E©œ øÒOÔUé!V˜Ó5Ê׆à„LåeÖh „‚¢ˆzÔ_?ùjÕ]Èò%‰ä̰víÚ 8dÈÛÑQ£F] ”¥åŸ’JßËìW£Oï~¼ýÎ[Öz¦i$ÅÇá÷–’‘Ë¡£™x}^t]GEÁj6â°™Jèýb„b¨³Ç)„BÈàu¡ Ô–9\Z]åSQj$†:w¢ººÛQ]¦Ó«¿~òÕ^Gím‘H$’s iÀ«Ñ¡}’š'áóy1M!¯Ù{ð8¹ùnR’1‚Ñæ%Å%äååáv»ƒç¬•”‘”˜(7ðH$ÉGðj \®ð#¥wL˜Àœ¹óÈÍwÛ(šÆqf¢cb€? Qæõ‘ç.¡Ôëã¶[nF‘\"‘H$giÀ@‡vmyìáùbë—ìþe;¾þwQp~q„ÅB\\,iÛг{7Ú¶n]Gi‰D"‘œ:Ò€7‹ÅB§Ži•šJÛM~~yùyhª†ÝnÇårårápØ1›Íç\ ŸD"‘HÎ~¤o Bl66›fM›†L—H$‰ä·â75àW½´]n!‘H$’ó„‘±¿_]¿©Wµ3·Â–D"‘H$’“Hz5ÜGv“{`?ªÚEÁƒ(±-Rq%µ'ôZ9‰D"‘œÒ€W#sïn¹îb¢œ¶—QX\Æ+ë>ÃÙ¼½œ.‘H$’ßiÀ«¡ªÉÍcÙu  Ô^&õ¢{ËXÔ0û‰K$‰Drº„^çó<Çl .µ©7ðc2Ê¥:« ˜è׿S;›1‹Ç‰D"9ed¼h ëÞ˜ÁíîBw:ì¨ó…hp'þÌb´0æÚz;Îô­Jo¡íZÙé¼//øÆXýøt ÍšÙˆ÷–²+W£ÂïñG·Y"‘H~c¤¯†"@Q”ÓÚZS ±kWu"SXu¹…­ïâ…ƒ*j•TArÏ$^诬>Ì»§ͯëäºýd”hÕê©'#]»Ær}»ZűjYÙ¥üßÎlÖ¨pÕ÷ ¯mÿðSÅheÔåÍhµëSó|øNÈrºm–H$’³iÀÀòËÉÍÍ­qÞawpëÄ[ëQ‚Àî2`RŒ Í;GsØ8Ù[WìÆõ´`4ø‰5ãØOË€«>>þø!ô¦á$5[}usF4Ñøå§Ö|ã#_7o#ê,)¡^N£Í‰Dr.P‹?ßñtTMå‘™3),t£ë'õ1göÜn7·Ü4£±ªú–._‚ª©ÔGN—¡(ŽŽâ†ÔžØ@ÕZ_Јnš 1æróm²1í–Zí:Ä´¯ƒ=M£+ŠgolÄá·ðüQHìË]:io°ý‹£ÌûÑO±0zL—>ÂÿöàÑa mçXÆuµÓΩ –yyÿÿeÅñJnhZ÷lÊõM|ðö– P1¹nw‚rã( tèǸ®‘´q@NV)ïmÉâÝcÕ= a0éÒ-ޱ]"Iµéäd³þÿ²Ù˜U.Omòf³7¿¨oôêý§öóð~#£B´9¬œŠ‘~›2:ÅB“HÙ™%lø¿,>ʪ¬‰D"ùã‘=ð耦©<öè¬iŠ¢`·ÛY²t éÙ9—–á÷T4]güSˆo†ßëAK-@X£CÔ ˆ´ 7Å9QLíE‹ýÁ^¸°Û¹1ÍÈw[³(»¨1QQ1•\¢ªk^ Š@A`Œq1}°“Ò]ÙÌ>àG‹0™¯â×OÈ-0ˆ“õ'÷H`no#ß~˼ã~°(rWsÕ["¸*Í„ÿ`ë*ʪ¬'¤ôLä½ ìÜ‘Ã?rtRÚÇ2öšD¬k³6»>îAËž Ìîªóÿ¶d°¼PЭgc¿–É÷ARòf—ÎÜŸüøuÒB c6×)§0Ð")‚8wÿüÌ‹Çb¢OXn¦sôÕL¾÷ÊW[‰Drö x(tU ÝwTU•Ô–­Ù¼e;-S’éÔ¡®(.§„ Ð]„Û]È‘ãéø·>…Òá:ŒÍºSuA3B y}|³3½£c¸¶y>ÏÐHJ‹¡“§€‡özéßÚÛ ÔÙû3XM8…ÆîÃÅì:®¯×CaäÆrwaîWÊ4*üô•¯7F˜I2 ²Žy)®År k$7ô0“½ëÏn÷P¦ÃW‡¼XÆ$qm/|PBa² k$7^`fÏçyåG?~véyC#†Æeóc¶­vyË·l÷–ø8íÅw¢ †šuÔGN!ey¥üç`à[·‰®Ã h”ÍÇ5iÀ%ÉYƒ4à!öÀk7™+׬gè 4k‡»°¿·ŒôãAW»ÅlÁå´“”Ø–-’ùpóhzUi…(3xò4üîBþµ/†=4Íòs]g¿|UÀ>Ÿ Í6›R¯Hmov>ov0þʤì)àÝ]lÍR µžœÉn%Ù¤ñã!?­Üà…´ôÁ¸)í&»•$£Æ+•å÷³ã˜Æ5ñÄJ(ªCvS¤•£ Ùà¼1¨jÝ^‡‚ÙS·¼:zÅ4¾Ë©W. t¼E^rpÑØ*Î@0‚D"‘œ9¤…Ÿ9s>Ÿ¯JÒœ9³ñù|X,JKKðù<¨ªZaðjݧSZjÀb± k!L¨Pp™^†ŠÆw_»ÉÍØ~:Ý)≽~üª‘B?DD*œ˜•î×Ád¡gõûx÷Ýýü7Ùŕݣ¹wD4ûÏÝᥴúµŠÀ@xà (õ’€´¦&¬øð‡ºè„‡?„A­÷*²¯7ce††V)æÀS¢¢:ÃË[/›Ú@9uU#€À(ç«K$’³ iÀC ª¦1ëÑ™5ÒEAUU¾ùá'tM¥I\,.§—3 wa¹ùù¤gîA1C»â…‚Ó^ŸŽøóܬ?Í´¶ éÛÓùÁº®S[¤!hÀ5• ÎÀXxñ†’[Ó8r ŸÝlÜ‚Ù]£iùM?TÁ_äá˜MÇd#æãj0À+^ïïQ¹°C,—ÿ·Œõ™5¹üEŽbèP¹,ƒ‰ñüùrTÐËÝÙÕ·X=qì/Ê“£“ù£—Òj®|!ÂÈ«k ""¼§¢^rÊe$É9„4à¡Ðu´Z¢É5MEšÇÇqðÐŽ;Êžý~ŠŠŠÑt“Ñ€‚Ž" %©yèòÃ~oy–à«/sù¤‹m?xËç2ë”ùuÌ fÕ϶_üÜØ»1Sz)lL 9­¸Ê‹4:íüO²àHŽŸ2ƒ‰N1¯Ÿ’½V½¬„Õßùyº{"‹6à5±æ±%§²‘Vùv[›“âs}2­¿)`{¦Ÿ|M¡Iœ•w>Ëw—°z—ç{$pO ‡O²¡EûF\ëòóú‡¥A·´¦’éÑeõaB IDATiÔÜA÷Ûò«ç–°æ;?s»&ð0¹||ÄÇh$ÞêåÓ=…“7×ÏîlaíqeF1b/*泬jmöÔCN‰D"9‡¨Å€Ÿßþ ÍÑ?]\RF”3›ÍFdd$‡¼Ü_¡i_y ,3Ÿ—6Ç]OÔê÷éà0bS OÕ9òßc̵6áÆÎM˜q¡@õ«äå”°§LÃi¥O(:Ú„ÐÈÍ,bÉG œìŸDcÏ—‡y¤´17wŠãþî ÂïçË—°-W«2oZ+)áÅ×ó}ïX.OáönŒè¸óËØþ@AgÿŽ0Ãטq]âxÄ.ÈÍ*áÕ7³y;»üe@óóù–|ú‰bl§"þûoOãŸËå¹)­Óº0øڟöŸ<…•7Àö/2ùhh×_–€Ùïç¿ÿ)cKvÍ»Z§œ‰DrÊR›Ö¬Yã:th —g}ظq##FŒ`ݺu¬Îì†~޽ ôÑ?fü¨á¸œ®ZW »|øHR’“ÈÎÎ"¾iq±1Á•¿rrÉÌÊÆP)óHLHäÀ¡ÃØþçYUý³Š"‚=ý0=?!‚RÕ+Ÿ+_¸¤üX×õ £¯(•ÆÇËËÖë*‹“‹ èaä©~-zðõæÄõUäªVwmm®~\—<áÒQó|ú !g¨<õ¹W‰D0¦ñ52h‡ Ò`;:jÔ¨k2 ´üSRé{à‘.ôjüèk˲×^Ǭ×ýª@Ó4’âãð{KÉÈÎåÐÑL¼>/º|]1( V³‡Í JèU­Ö@×õ ¡è:U–©o™µ–UÛ\³S¼6œ\µÉWý¸^uÔ’®é5ÏŸªþjËSŸ{%‘H$¿7Ò€W£ÀœÄÞFhªÅZ=Šs?9ùnR’1‚Ñæ%Å%äååáv»ƒç¬–”!lçH$‰ä|@ðj¡`°:ª¯R½Í•üôýj¹"hÚ8†&qf¢cb€? Qêõ‘WL~©%õ¯Ôê‹—H$‰¤HÞ Q-Ð;ÝHvÆ÷d>ÌO{¿!à ºÜ…0¡Y\è‘É[¶A‰Jâ| ”H$É™Gð &LZbt&¢ùŠQ=E(žBÐ5SF‹ƒÅ0E Œæ?Z\‰D"‘ü ‘¼Á„ÉŠÁdÅKµXæ?J(‰D"‘œ'ü¦üíI­B/‘H$ɹÈëëÿû»Õõ›pƒ"¤—H$‰ä7 ¤×õów]ªEolå7ì¤ÌçoðÆSV“‘ WwçŽëû¡È‰D"‘ü„î×± ÇŸ™_ÛÆ˜kå´5¸ŒÂâ2þù¯Ï¸}x_0H.‘H$’3 b«†_ÕHnË® Þû¹{ËXüêùëÅH$ÉoÜ@±:`6*¾7äc2†[F"ùƒ d²iþ fm8ˆ÷üu¶I$ç<²^‰4†uoÌàv w¡;öÔÿ¸ؼ{XpÛTþ¯ÛS¼2¹‘Êi¢•rä»]vt¦wªCŽüPóùnógì|ª®Ë•%’sÙ¯†"@Q”à߆~am¦–Ï']Å…õá‚Þ}¸ ÷  »‰)Ïm`gNÃçN6"‚&‰ÍIll?}ƒëù…%Lç¹/r „¹¬h˽ôîóWù² ÊN^A|ì{åFzö¹‘ÕGÎ@ûδlÞߟ÷ñä窥ûñœÅ£(º®‡Ý.W"‘œýÈxX¾b9¹¹¹5Î;ìnxk=JðS˜‘…¿ùæÝ×§VBö¾ÿðæÊg¹uëA.»› £Œ _ÆÔœkf/äj!ÎH¼¦©uì4¦Rx,ŸšÇûÏ®cÌꉴ‹P*äײ?å¹ûðû“U@×M’NŸŽ¦ª¨Íoäé{{à0œØÎUÁ–Y¾K$’ßiÀC¢£j*ÌœIa¡»Šñš3{n·›[n‡ÑXU}K—/AÕTêý¦ë€«Ý.èF#ƒ€^ýØÎÕ“>àõÝéÙÓÇÖ%O³ð“ï8îÆ£;èõÐ+¼8,“^À7ëæóܺ-ü˜©Ó¤]_FÝ=Ñ]¢ƒ=n߯,} ï^´7§uĦðç²}Íó<¿~+{ò 4é8˜ñ÷Oæª6ånq­ïÞxç×máûãE¢;0ò©¸»ePÞ‹ÆpÑâà÷ žü,UÉËÀ}¬LqYÇ‚-×ðü¥q@?¬^ÂW¢)6ŠÈ.9±Y§ŸC¯?ȤÅÛ9^¬bŒJ¦×5Sxd\o¨™l|æqmÙGzv1^a§i‡~Œ½×´u`uäЊøñí—x~í|{¤ÝMÓ¤Ž\õðãŒk£-—-‹ç…Öõ—W*]»wÞǼÍpÝ#?2ôÅ•Üß݉Á€·å•FÓYûËhf ÔO_ì#=§/6z ㆠ_½ÿÛöæ!µ¢ÿ˜é™²UK™ÐÚŠèšÊÉ@x»—MæÎu6®¿{÷4-fÛ+Oóä4…ækï§§Såו“·8—^7ÞÁ?ºÆ!ò pÅ[*zÊM®}’¹WÄc{¢£ÚJaV1zê8h½–G¿É¾~i¡ gÆËopá¤{±-œG^ñ G¼˜.W2yÖb"UÒ·¯fÞòY<Ýn=OõÆ ³wû7d$Žcæí±àÓU‹øÇ4#É뤧£ŽüÂǾ•“¸yqŒ¾•'.h‚!}3O?³‘¯3}Œk#ÂëÄZP‹þëº'Ï5x7Óûá¡'—2dÕD¿÷$‹]ÀCO^B“¨¿šç±‡;bÍÝÅêç^eîÎ†ŽŸÀããìä|¾”g_x˜ØNÿ⾎6µˆ_¶}ͱ„±Ì˜ÖŽˆÒC|ùÆ+<1ög _[Èͩ֞ºžƒ\X"9 ‘<ºŽªª!“TU%µek6oÙNË”d:uè€+Ê…Ëi!(távräx:7ßv;÷LžÄAƒB¯H§ùñy=”øKÈÚ»õÿÜ@–¡3·¶Dˆ\Ðuì­ú0¨O6…`°QἺŸ¦c–òÄøvD*‚‹{¥â5žWïວû]½9…;Xð¯#tœºŽ©ÃšaÐ%>‡Ï¯_ÅÛ¿L¢{Ûoyyå^šŒþ_æÞÞþdЛˆà&kDĵ ]Û˜5Û¢{)È÷ 8é}Ëͤ^Ê+_àï}müºa;W°|p2­Ôø6¯ •(­û3¤uyiqÞtïí<Ž·_6"S{1°OGlJ.LÌà«[7óñþ2ztŽ ›?¢h Wí%æšÜ ׉÷S)¶` €¡ñ%LŸúW?ñ1íïᙡM1W¾ UuB˜‰Mo^Nˆˆ#9 ¾Ï-A«¶¡Î ½í¹¤‹7~ù‘,_/ÕšR§.°ËhW‰ä,$¤Êy>YŽÏœ9 ŸÏW%iÎœÙø|>, ¥¥%ø|TU­0ø5€îÓ)-5`±XðVË_…Ô±B€^>߯N]H$’³iÀC¡ëhµD“kZÐŒ5ãà¡#9v”=ûý£é:&£E@JRó:*:áæ¬¿hÂÙ‹»F·`ôŠéÌŒ¸+[ ö|°˜åG“ÿd/\! SbúrÇðxÆ®}€{”ñ\Û3O6‡ S¸âÊ4\Ñ}¸óºn~õ^îÓÇsU×x¬¥Ù”¦ fhjSº´±²æÃe¼Öi8­õ › àòNQ'£“5n˜l–à´5Ç »nçªu\|u EF"m Þ7^\ñi$ˆå¬]ú:Î˺™ÉáâúÏL¶Ô‘_D÷fü_£™´l¼•¿¶Þò{5®õÑIýo ¸e×Î(•\'[í“2X0o‘#qs׎˜À'7,aîGóÏaÍêlÃéóÙr–¤ü…nq>~ùp)ËŽÄ1bfO¢F'ñNAÖöM|y ‰A©uèB†¡K$g%Ò€‡@4U »ÐEqIQÎHl6‘‘‘x<òróÈÉÉ©p§{¿ÅJVÚNx‰Å‘Ï3ÿõg˜š¥Ó¸Mo&/¸‡ÚETu¿W|·Ñù®%,Š™ÏKï,eæ:7k ­NbÐi¸ 6Òî\Ì¢èùüó­E<´ºÍšÀ¥÷uç’VÍ0íA®}ô%–ϺODúŒïÈÐN.*b“5/Å^°ÚÍc¥¶v#yd–ŽPNÌ7`Ž´@F.ňMÍÜéYü}ÙRf|è]ÇähJç$õÀ1¥Ö‘_8é=íE·<Ë¢%3x¿ÌNB«X@ÁduëäTnÉÁ•Ü?eUÕsñcxjÈ—¼åÊ 7ƒ EÊu<4ümƾ¼ˆmýgÒÿ4uÅZÄ^ý«2U¢[tã¦yp{çÈàóahÊe“ÇðÉœ7™¿a0ÝשŽçã4…‘H$¿ ¡^­M¯®~Í÷—Ëþ§Aî³72bÄÖ­[Lj#Î9Ü⥠¹òŠ«p9]µöŒ/>’”ä$²³³ˆoG\l è:¹9¹dfe㨔ù$&$ràÐa>yÿÝAlº¦¢¡`¨uÀ;D¤‹Ð×躆¦Uô7Q*Ÿ•îàÁ¿Máç1«Y;6kyþªy€jeWO+ÊéhšV±IP”j Ĕ˪ÂÎÖ5MWPÊ<©! „‚¢ˆZÚ/F£)ä5{'7ßMJr"C0Ú¼¤¸„¼¼<Ünwðœ5‚¢’2’¿Í"¼ûXñàdÞ*Œ¥ÇM³˜ÔÍ^¯ˆö?%Z GÜÌÊ&£$€ˆˆ¥e÷Ñ<=åf:Ø”ú„~I$ÉY4àÕ0 ¸\áG@ï˜09sç‘›ï&¶Q4ãÌDÇÄ „@£Ìë#Ï]B©×Çm·Ü|FÖ#¯™ñÖ¿y˜ê®äó%š~÷,æ½i•]ÂåC œT¿=æTîxý n—îo‰äO4à  C»¶<öðƒ|±õKvÿ²‡_»(8o8Âb!..–´ŽmèÙ½m[·®£´3Iýܾç BQN;ìÜC>Éù‚4à Àb±Ð©cGZ¥¦Ràv“Ÿ_@^~šªa·Ûq¹\D¹\8vÌfó9È'‘H$’³iÀˆ›Í†Íf£YÓ¦!Ó%‰D"ù­ü µD"‘H~oä‰D"‘œƒÈx5½±•ÿݰ“2Ÿ¿ÁKZZMF&\Ý;®ï÷ûE K$‰ä¼Bðj¼øÚ6Æ\;(§­Áe—ñÏ}ÆíÃûvi2‰D"‘Hˆ4àÕð«ÉÍcÙu  Ô^&õ¢{ËXüêo±ºD"‘H$Aäx5tÀl4T|oÈÇd< çá2Ù4³6Ä«‡8–œ›Èû(‘œ·Èx5&ÐÖ½1ƒÛ5Ü…ît8Ø?PÿÝVP­j>ßmþŒƒo@ÕõšÇ¿§°Þ=,¸m*ÿ×í)^™Ü‰H¹bXÃù#ï£D"ùC‘¼Š¥úÎM§ZFÅ.^µ¡QüË,xi5}{”Ÿ WÓd: ™È#·õ¥±ñ·ùÖu½Ê©ÕOŠWÀæG'0ó“tÊtP°D%váPÆÜ~ã-§·©A“Äæ$6¶Ÿ=!Z6oM¼†'ª¹»XÒ„Õ¬—Šõ,õWÕz%ÉŸiÀÀòËÉÍÍ­qÞawpëÄ[ë̯|É“ŸâãÈþL¸{m>²ýÌ/J¶³ÂHø(8zœÒä[xö¾ØEdþº“wV.ãžÿæ²lí}tµŸÆšâ¦æ\3{!W qEéëhªŠÚüFž¾·Žò-OAÁ–ù¬¸/‰DriÀC¢£j*ÌœIa¡]?Ù»™3{n·›[n‡ÑXU}K—/AÕTêŠ~óÞÊΆÎy˜Ûz:‚½PýrtDp5“Ï<΢/ö‘žSŒ =†qÃ…¯Þÿˆm{óZÑÌt¹¾NƒüzýA&-ÞÎñbcT2½®™Â#ãz7¨G¯ë€«%ݺu%JЫÅìeèc;ٞ飋²›YWOf÷èÕ¼vS ,G×2fÄ Z½ðs.0pàýybéÇ|—åA·6eàÝ/2÷ªDÌþ_Y8úÞ½h!oNëˆMÏ ¶wË>Ò³‹ñ ;M;ôcìýÓ¸¦m¹~ü¹l_ó<ϯßÊž<M:füý“¹ªeüú^-u…K ¥W*]»w§Qe×€ÐÉÛü×=ò#C_\ÉýÝüXqÛX^i4µÿ¸Œf¦@xý7䞪Y|òü¾—£Y…xÍÑ$§ àÆ)wrå ½„"œ®Î–÷%‰DrÚHÐ4•ÇU#MQìv;K–.!=;‡âÒ2üþ€Š¦ëŒ¿s ññÍð{=dçäФqãe˜b[Ò”·Ùùþ—í<” q²G«³wû7d4ÏcwÄš»‹ÕϽÊÜ ?ÇÇÙÉù|)Ͼð0±þÅ}m(Â@L—+™õ¶‘÷0¿ÆütŠZÄ`ª¸T¥"PÿD{Ç1óöØŠðéªEücš‘äõÒÓáãçe“¹sëïžÃ=M‹ÙöÊÓ<9M¡ùÚûéšW{]uÉQk›«xÞÍô~cxèÉ¥ Yu'Ñï=É¢CðГ—ÐÄ$€:ôß{ªñ˶¯9–0–ÓÚQzˆ/ßx…'ÆþLák ¹9Õ âaw]õtþÜ»±I$çÒ€‡B×QU5d’ªª¤¶lÍæ-Ûi™’L§pE¹p9í …î"ÜîBŽOçæÛnçžÉ“2hPƒ`ˆ¿‚93vsßÜÙ\³e%}ÿv5#¯û½“l' ­‘©Ò¯W6å2>ãúW[pùˆ+èëPÝ"øzóýlÛž¯C*V¡àhÝŸ!'6?K‹ãð¦›xoçq¼ý¢hPHÞ® îsBn]Kbäü \à0 ÊÂgU 3ÈS#éÔ»?uqaÝÇZ2è™Ú‹}:bSúpab_ݺ™÷—Ñ=å¿,ø×:N]ÇÔaÍ0 èŸÃçׯâí_&‘f®½®S–ãÛGÒ÷±“ǶA¼üÎz;â¸ô¾ûøhôcÌœSˆ}ÛzL•¿43—O娇þOõžVäéÍ ±)ý¸x@ #'±tÉ.®ù{oœÕÕX¸#¬®zô°Ë87‰äO‚4à!öÀkŸÇ½rÍz†@³&q¸ ñ{ËH?tµ[Ì\N;I‰ÝiÙ"™^^È%b¨²Å£…”¿Í`í q|óÙ¼¹a“__F÷ OóìØN•~”ƒ†F3±©1àÍ£À Â)q$GÁ÷¹%hè@€Œ­«x~ùûlÛ›I©‰±LÅäöÐàémîdÑÃbÇGIÎA¶¿·Œe÷ÜJàÅ<Ø1|VkÛëÛs3ÏMÉž¡Ã3òZ†´®ã;Ùûµ6kCÞ!Ý­âËü‘ÞGŸNï¹'®ÕÑTˆŒRL—Ö^—µÍ)ÊÑr"/>Ü W¹‘¦(RlÁñ~CãK˜>õ®~âc2ÚßÃ3C›VrÃûë©ÿS¹§5õbp´ç’.6ÞøåG²|½pT3ƾ¬ðºÒ°Ë¹£ÉŸiÀC¡ÇÀgΜ…Ïç«’4gÎl|>‹…ÒÒ|>ªªVü€@÷é”–°X,x«å¯@(˜ì ôøÛºÿu$#–ÜÆ¸¥O²æâ•ÜšTs Ýh6!ð§ Ï`5Æû­çÞéË(r7³§t&N?È3góééè!2žÖm[ÇÀI£{$ò¯½ƒ÷ÖÿÈäÇm˜ à+ó£…š¾dIeÌü ôýê}^{u53Æ­fíÄ…,ÛŽÈzT-ŒVL¨ø5ÔVú<ôSÓl•\À[“Lqµ×e #G¨©öDÚµo_i ¼Ro]+dß×ûðh:ÚÞM|‘>ŒÑÉÁˆü†è¿®{Zk>“]W èPÃ^‡®~£ ‰ä@ð耪iÌztf4EQPU•o~ø ]Si‹ËéÀåŒÀ]XDn~>é™{P ÆZ]ñ'BAœ´ïߨïós¦š×Gʪ¿ÄžÃ;Øhͽ¯f@¼ ¡:iål®Rèª^ëq¨:ªŒJ(ðêXVc .Á‡{Rª·&"T^£ƒ”¾#yø¢¿ré¼1ܹî v˜Aws}ÚwS\[’Œöÿ*ˆÖ’ÈÊñeå²ÕZ—] “&BŽ×ÐÈßú"mt1aÑSX^¸“ç¼IŸ—G’bõÒÝÔúúŽñÕE˜š·¡±Y Uïc}t%‘Hþ„6àúy¾ ¨®£ÕM®i*:Ð<>Žƒ‡ŽpäØQöì÷STTŒ¦ë˜Œt)I¡-qÙOË™ýzm;µ$©‰Qð+ÿ÷ÚÛd;Ó¿…µA?´–ø4ÄrÖ.}çe]HŠÌäpq¥žœÑI¼Sµ}_HbPrµãÔÊî_Ùõß(ìj)ùÇvóï7Wóiq£þÖŠ³•A—µ`Á’çx|Y)WwjŒáøÏä—÷&ýéÿæ­¯4Z´jŒÍwœ¿¡Ûã°7 šN‰éËÃã»öîQÆsmÏ"<Ù.LáŠ+Ó°e}Άm¡ë ¤ÿ»Ö´¸e×Î(•zç[í“2X0o‘#qs׎˜À'7,aîGóÏaÍêÖÿióÙr–¤ü…nq>~ùp)ËŽÄ1bfÏ g¤ú}M ¯+— C—Hþ4„4à•§M耦jaÇ(.)#ʉÍf#22ÇC^n999îto Ô‹†ªDãÈßÌk/¼F®GG7;Iìøî}ñv†Å›þS—Ùœ2š¹Ó³øû²¥ÌøÐ ºŽÉÑ”ÎIŽ``œ¡)—MÃ'sÞdþ†Á\t_ÇjLj¬xq0ßó§Ë¹ç®å€›+Žæ®äÁ»oàê®N R«Ø‹f IDATÇÌc®û)^zc.÷.  D¸hܦiÑF¹»Ù´b»²¼ [‰ë0˜û猡µUi@ûlt¾k ‹bæóÒ;K™¹ÎMÀCë“tE¦0uyÃɪªƒ+¹ʪªçâÇðÔÿoïÎ㣨ï?Ž¿¾³¹!‰!!9È!(^xô!`=êEE¬ˆxÏ^[[ª­?‹G«U‹?«T­Ê%(ÔêÏlûÓÖ}€UÚŸ"‚ (*&! 9v¾¿?v7Ù$›ƒdv“‘÷“Dz›ÙÙ™ïì~>ó=fvÊ+¬ªÊ=³BMïfÐ7ùñôÕÌYø¯NžÏä¶Ê¿œ´½¬{|}¤×Àñ\tÇ<æŽéºXP³ýzX«e•Ý ¯ò+"+†%/Y²¸fêÔiª ®Y³†3f°|ùrf̘á»f»ß-úoÎ<ã,²³²[­{ÚôóT\Ä®]ŸS—CNßÞ`-¥_”òÙ绨­ RUSGaÿB>Øþ!/<ûLãAlÖâZ—FÇIÆà'üž¡AGÖ8"5AëtÁ DOóy¬uŸÖE¨‰Þ‰Z†ëÚ†×4ý;Šu›_‘¬ñ:FæsC}à 3á8†ð²Ûµ}1¶7üQWµk¶}M·#Ö{µ6­‰˜ÛÙ&cq­‰*ÿÈü ϵ^þا5[Xxþ,Võ«¾7’tÇÓôJ1öc‹e%"qµlÙ²ú8eÊ”çÑ™3gž T•áÛ¾¨ÇUÀþúÀÞ/ú1GÇê?®bïÞ=-Îãº.E9ÔVWòé®R¶ïøŒêšj¬µ¡ÑÊŽCZJ™)'Ƙ_cpLkU!ƒh2Ý84~ªù<¦Ù6oû„Òò „F›ïûreeeTTT„žKKgï¾*Š õ""â¹úÀÞAl@€ìììVç¹ò²Ë¸åö;(-¯ oŸ^ôËI¡WïÞ ¶Î¥ªº†²Š}TV×ðí‹gw£ë}‹¯¤Ê•+þÁ\5‹H ªwÀÈùùÆñ—_áMïñÆúTìÝ @zj*99}=jGLÏð¡CÛXšHKZhR¡…nŒ®ÕÔšÔÔT5Š!‡ÊîŠ ÊËwSV^†téÙ³'ÙÙÙ’MffORRR|7ODDº?ÕÀ;ÈCFFäçåÅœ.""/JàP²‘DS[¹ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆø¸ˆˆˆ)‹ˆˆøPÜxFFF¼-""Ò-%2÷%ÅkÁ'NäÙgŸ¥²²km¼ÞFDD¤[ÈÈÈ`„ cò~qKàäççÇkñ"""ÝN¢’7Ä)/_¾<‹ñ…D´<{žÀ§L™âõ"EDD|'ÞµqÏx"›DDDV:LDDć”ÀEDD|H \DDć”ÀEDD|H \DDć”ÀEDD|H \DDć”ÀEDD|H \DDć”ÀEDD|H \DDć”ÀEDD|(vOÀÏ ‰ˆˆHÇÅLàÁD¯…ˆˆˆÕÀEDD|¨…ßïØoz×ÖÕòöÆ·)Û]Ö‰U€aC†Q< ¸«WC¤Ë)®x§­¸¢²öN"bx ¼c5ð7ßz“â¢b&7c:v `­å oðÉÎO(È/èêÕéRŠ+ÞhO\yó­7X°œ6î ¢&…¬ÜŒúÚÅÌ»ô(r’Ú(këcu§ãtÕfþÉOy÷¼E<2°G|~ÑËUx[o„ 4‘ä=-H0ètÛ±.Q“»K·XB‰’èn«6óÄndéû=sê4fŸÕ@ù66¬}šW¾Ä›7ÝÁÕ¡­¼CR>§üðV¦‡pòqCÍ«¡šnâ´7®Ä£¬ÝŠ×¸ýûwñ×GsÑU2¤g ¥¾Çf'‹tÓŽ¸[_V$pkqƒnCÅ­‹jù-óyõu?h¶CCmý4jËù×êEüþOëÙ²;@ΰc8ÿÊ‹™zhM—SWÊ?¼—Åë¶òIé>j“³è?bç\2‹©ƒ{HÀ³‹«>p‘( Mà¶Šw–ÝÍÒ÷ûröm ˜=2“$cË)§ŸÀS7ÎãÑ»aÒÂk82uw]z›Ïþ ÷N/$Å@ÝÎgøÎÜ•ßòרÅâk~ÀÚ ·òàåÃH oÇ]Ë™‡¾ã£oø·›÷Úx{ãJ<ʺúÃר°'¯Í¿ž9‡÷ÇÑ©X Ž ×VkËX¿â~îzï—;ô+9žYß™ËiC¢âtt ¼µù àîå?«`áÓ¯òŸ|I ×pÎùùí\yhhYÛ]ÊÉ¿•ÇØŸ­àž²=Û.®xo:rrk©­©¡:*³V×¹Q벟÷—ýŒŸ<“Îé—ü€Ër+Y¿üwÜw“!ÿþ+“^Näƒü’-ë7òiÞt®½bi•;XÿÜ îûþöÞû_L/Níà•â@(VˆHXBø¾wYõü'¤NºsFD’7€ÁIÄ©sNbÕã© rø$— ĪQ[×%lxÎ ©‹LÏ“sÚùñɹ¤Cz^:†´þµ3®Ä£¬“z"×<ǛϿÆÇ#O¢(Ý!Ô¨ij®æ½Çæñƒ§Ó9kîO¸:÷K^â^~õ#‡‚G®åð”†U­_ógù`ñ<®~¤Œ ç_ÂM‡åÀîÝdå%‹Ÿsæ|~~JÉŽCÏ‚žîkÓŠêïnwËÅç-l2Í%è,îÞ·x|õN†]ö[æLÉ!Ù@IN)¯_õÙr£GDF¶F¾`¡#§ô¢q}äpÒÌ&9sÍÍ,[òoN™7žžq>T6®úÀE¢%2+¶óQ¥%wôzDj‡QÒ GR`^`çû¥ÔI8PÛ†JEýìQÍäÑ5G i½úsè B’ÁÄxxho\‰ bó’“?•Ÿ\¿‰ù¿¹ƒY¯-eÒ´Ó8çìiL,L'ؽëY´r#®z˜¹§æ’l`Tþ¼2{Ïm¾œq#Õ²ð?·ùÇÝÈ¢¥[Èùæ=ÜtÉPzDb¶1Pz˜ÞgC†‘bBWLót›- 9kÂóÉw‘÷(:—¯8ŒÌ¨xåÆEübIèÃZ³ë=>ª®cçÂ+9ç~SÿZ×uIÝUEpxxQ¶ñ2˜Ðcpz æØ’4žßú»jÇÑ#%ΛFk">°¸X7ˆkÿ £ÔZ8)I`«'hh|õúè¿¢UâÆÝ´7®Ä§¬S0í{,š|ÿ±–gŸy‚V?ÁØ‹~Î-–òù»l¯®ã“».fêÝ kì]Ò>ÝG°¤qxuóïÏü[ö÷dÌ‘ýI¾œiÔ`ã§½ÝÞPÿºx›Ð{ôgxII£QèûvgbLehžº:‚¤1áªù\<,½QGjŸL”GØxÝv´’œÐà87þ_8%p‘ÆYw2û“Ÿbxû©:5§Y‹ÛþÏÞe§5äÌ&@%ÉÔTÕ´–$¢+à±â‰ 7»]2ˆ­ëF¡yŒz!cN>›³þð}®{ì.V{3ƒu¸6#¿÷K¾]’u qCzN6Ê"+ºµ5ÿÎ ÖŒ‰1XÐÚPýÌß>ðwzN`'ê="ÍRõ‡ÿ·®%Ðkj>ÜfÉùZ!ŽiÔ‡mkÂ;³.<2ÔjòŠ<®ý” ›ö‘”7ˆ^Ž%ÞV®q1ñïiñ„Å€ôÎ8±ëÖ<ÁŸÎÆyƒ3N5ªÝÉ ½@YÚ.ÑÈ$7 Ê?ØIe])Ó°ž6F<1)ôL…ªò*ê‚.I <¬½q%KÆéÁУÆÒkÉ_Øüy-ÎÐÁ&W³íÈ=¥¸yœ®øƒXk ôncþ¾C蟼’¯Lõè!¤E—³I!+*Ë+©s]’ã°\«Alm½Q“¦ïF“ê×Åd炯÷ã†gïä—Ît¦Ö´š2vîÀI'%ÓéA¿L(}ëeÖïÈgR^èÈ©üµ•,p<#{×òÁ‹+X¹³7§]3ŠÌôW<îñ¹ÄžF–ÎÈ™s™öÖ–Þðc>8sG Ë!P¾ kWó÷­=9öÚYqHL?Ž:¾'–>̽OV2exoŸoeOô:‡[ñ¬µØ@J¥ð§W°zø) ´e|™s'ÏŠû.í+ñ(ëý›–òëgö3¸d …9=1{¶ñòŠç)M*aÒ€œCŽ`öy|gÕ/˜o.àôñy¤UÁÇ{Š™zê²=ÉÍ„/6¼ÈëÛûslqógOdÎ7ò¹öÉ›ø™½€¯Î%µª”ªâÉœXœÃ¨Á)<õÂV–œÎ¡¶”½¹GsòÈlïöM̸'ðЃ <ê˜4†]ø nÉþÿuw?»7-›â#¾Å‘' ¡grŽ›õ ^^¸†GŸŸÄ¸ÙéXÀI­ä­U²ê‹ Ù…%œuÃ¥œ?<#!£E#5D$$Ñç;™c¸üŽ Y¼„ç^ZÆÝ«ö©Ž;Ko9—i#²IÆbm€Â3®ç‡{bñŸbÁŠ ÔLz<Œ¡Y¡z{£8åd1qÎL½g1+レ´¾Œÿ掖Ÿ ŠDio\ñ¾¬]êL6=vÿ“§~·’²j 9“ü'qå/g3-7 H¢äÒ;¹óùýŸsÛª=ÓaÐ1—pÌ´ád&çpâeçò⯟ãÁgŽeâÕ%­Ïï¤1ü’;¸3û!ýÏcÜúä—¸iyõŽ˜ËQs¯ã´ÛfÉm7SÖ#¾5œJ²<Û‰ú¼Æ:ÞH^²dIÍÔ©Sø·L×þ}-Ç}µuµÞ¬]¬ÄÅ!д ĺ]pNý†úœ"ÉÝ`ŒÁq¢µYpp‚±ø»7ð×q7óÛ9CB×Ü5Ç8$êç¹úmÚ¼‰ÃǮߗƒZ¢ãJ4ëºXêøxõO¹nY€éóç1ct¯fp©ïÓ¶Š/`œPü±n‹Óo°õ§˜Á8NB®ÈÖž¸)ëÔŒToßÜ6\í²^Œ¸Ú¸Á§qœv]¬iˆù­Î™éÆhTÖáeÙ¦Ï{´¹®¥z5ï¼ûN‡bøš5k˜9s湄ÆÌW†oû¢Wûý[0Nèò„ÍÞÏà„&Do†¿T&zçFM ¸ë5˜&I>£E]Ô.-Ñ5ðzÆ`H¦ÿ´«¸|Û],ºåjžËʸc¦sÅôQd×·¹†âE£8]Kœ¨ó#‹5Q±(1±¥½q%^eÝx›ë߭ɶ7/ÇFåæ4-ËÖç%çè­nœì^çí>HÔYþNàñszâcp]ýú’tƒ¸’^Ä´ë~Åñ3ÞcÃ[›Ø™Ñ›´¿í¥öÄ•./ë¯ KÜc¸~N´©¤BfüæQÎÃÁ _g=Ѭ±]Òd(Òu‹¸bÒò†stîpBCÂ\50Þ í+Jà¹N¼c¸ç üwTÚLŒ&¯D²áHØi3">нâJ×µÎuÔÄ•îUÖþï—+±>bB嘔—ã+ßQ\ñ@;ãŠëº¸®‹Iäo~Å„®…ÿîéÒ³2³ø¢ì úôêãåbJ[·m¥° P#Ðå §¸â¶âJVf¥å¥ô¶½¼f_-Ƙ„ÄpOøø±ãyûßo³eë%žN°Ö2tðP ò ºzUDºœâŠ7ÚW"eýþ–÷UÖ¨îiOINa¸ ^.ò ¥/HˆâŠwÚŠ+*kï$"†{Þ@¯Ä#"^S\I•ubíøt»J?¥oï\ä$öõÕb‹÷ÕûDDD¤»J?# ²«ô³>³A \DD¤‹ôíÝÇqèÛ»ß_®[ç)‰ˆˆt‘ù)ÌNÞ–Á•ÀEDD¤iŸ÷ŽO·{Ü®‹%ˆˆˆx®iŸ·ç}àA/ÖRDDDiÚçí}¸jà"""žkÚç‡>p(""ÒYmõy{ߎjà"""ÕVŸ·ç}àŽ®Ä#""Òimõy{Þ®K鉈ˆt^[}Þ:\DD¤[2MjÖmýÝ~-ÖÀ×®]Û±%ŠˆˆH‡ÙPgx-P¾7|³á[Ìúz ¤éQ÷‘ÇiáéÉñÜ‘ƒT-P ìߪ·ýQ÷Õ-5¡[B™>H(û×¾ ?/"""Þª#”À«j㑚¸…ØMè‘ê¹~A üâèäláµ"""Ò9‘Šs ¡$Ýœ^ߌÞRŽÔ¾ƒÄNÞ‘Ä."""ÞŠäÞÈ-R äeÚW•¼kÑo‰‹ˆˆÄC$ÿFnªG'ïè>q%p‘xˆŒ8äÜèûªGhœ¼uµïEònt"¾oµni|¾™¡¡F}oÙ&7—æy¹Å$lÚy/"""Þ³mÝÿ?ûÙ:ÉŠ×æIEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_design_fields.png0000644000175000017500000022020112235000130025115 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¦wãsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ  !'^/ IDATxÚìw|ÅûÇŸ™Ý½š»K%…4BPDQ¥¨ˆ ˆTÄŠå T@QTDÅЍ4¨ˆ;½#=té¹\Ýùýq—äîr—bÏûËËïeowvžç™ùìì³s„s‚ ‚ réBÑ‚ ‚ J^AAAÉ‹ ‚ ‚ (yAA%/‚ ‚ ‚ äEAA”¼‚ ‚ â‰X·Ãp5_AA !àås¯>û£öEAi˜J…o%ÁÎòVJ[ιë³çô#‚ ‚ HC»®¨}}ýS«`õ»œsƘðEÕ‹ ‚ òßêÝÊÿVU¯ŒÞ­Tºž¸¶ êEAi z—RJ¡¸þôÜ%o@½ëÒ¸Š¢(Š"ËrAAÁžý‡Õ"p½A©@a¬áT†RJ€pO#+ †éRo„Ü!óŒ´fQQQ¢( ‚ TK{¸o j˜õœÜ•eY–e›Í¶aËŽ¤¦Ñ.?bÃBAiP8΂‚‚#'Îd·ÍÔjµ•·rº÷òT½%oeæ®kfW–e»Ý¾aóövmZ©Õ*L‚FAi°Øíö-;vwjŸ¥R©$IE±2ÏáòT½µH^—Þu:‡#//1‹zAA¤sêÔ)ˆŽŽöQ½—§ä­)×3«ÁápÈ=‰zAA¤áyðÈ ‡Ã!˲¢(ž+n]†Ð@b×Sïºfyµ*A’$l@‚ ‚ I’tjÑn·;ÎJÉ{Ùz#à,o¥êuå68âü.‚ ‚ H£A¨Ãá𔼗­ê­e‘2Ït^l7Ò àÜé°ËŒQ•V-ß?‘út>‚nDÓéôIlp©ÞË-U•úUºàÛ ( J^i0È6‹ÅbµËœøûóâɧ¥´¨°ØlS8:ÿ¢{ûÜÃÃd™ñÿ¶„KÀr)v[˜È ÁüúZåP`£AsTN›Åj—…q ‚(JmýÎiqÅf6[dVyCOI­Õj%¡Næ(™sp8d½F¨O?*–ÒR«¯ÎCÂŒêF¬—˜ÃfµÚ cœJI­Õi¤:¦q{iq¹“Sɤ­[;ÿü£8¬6›Ã)+Œ!‚ Ij­V‹º#H}âÒ»•?‹‰ ¾J<–æu¹  ‚œ‹†­eeÖÊ[E¦È®htõ-¬˜R!w9ç\‘–2Y1C¤sþíD"¨BôÜÁµªþ•fµºQO2gyi™yÜM0Ùn—µš:¿LÎ{#~¬f&Wd4Z5vR×.@å¯ûÝRƒäÅY^RõbSCs¹­¶Û ƒQ'àLv2Á=9ªØÌå6§¢p@¨¨Ò¨¨l·9T”4:½F¤Üi)3ÛÆ9$µVWÇIbAg2i(f+-)—™Ã®p‰î()6Ëî‰=pšKÊ T†°‰g[¹ÕîTBuˆQ'bµXœpI¥›¹ÜæšÀB¨ ÖéuªŠÊqæ´[-6‡Ì€RA¥ÕëÜõöW,ñ»ÑTk2i½~æ\¶–”ZNÕF“^f7—˜\ÐM:Aöïº =¯XÍåvYaŒspMë´ª3°ŒuOÔC4ÞAck¹UéôZ•(SdY&•S¼L¶[-V§Ì8‚Z£Ó©ERÙlù€YJŠ, èBÔÐ~¸â°”[]“¯TÔ†5þK24~‡æJ3Õz½V(Sd'$â禫k‚\z·¸¸˜èt:­FV›Íb±@Xhh ª×¥â.g±ëDjšWñP½ØÔäœàÄ-òd§ìz¦+©*4 gN§ìž}Îd»Åbu(œp&;,eåNîyÿN)!À§Í\f“ëz-pݹr BÅ; ÜûŠ÷+ær«CaœP‚ŸÀe‚;ñ“s&ÛÌ¥wå¸l+-µØeÆ Æd[yi¹“,¶ÖsyYá}Ë® ÑŠÌn¶ÉÌY^îä@µ!Z‘r]žçLvÊ.©èJè°šKÊü§04–9NΙÓîð±ˆ9­v‚Ö¢‘DJD•º"©Ë–²’r»“1œ+²­¼´Ä•ÕQ“Ï+üC)¥T¨\^'@û‘­¥Åf—Æ¡ê¯Î%4Õg·™¢Ö¨WK¥„RARiÔ~sbj³:˜‹A.‡‘,‹Õf«Ô»µUqñ^ær.Ø”*T½rnSPéÕöR»"ÛÌÅ6"¨ÔZF%zÎ1TO%%f™ƒ¨5ªÀVZlQ¸Ó!sI"@$½)€qÆ™Ã\j•™Sæ.Awn(–â‚ÊŽ‘ª šÚ.|ÆQo2h(ÎÁÿÌÑCõ"³–”Xî°+zQæ°X€ 3µ"0{YQ¹l·:u’šú-Vñ·Ño¥¬%…ÖJ#Laz@Ðêuö‹b-+!œƒ 5hDP‹ëjõ¼Çn8-¥¥vÅiµ)j½¯ãj0V£×2;ÔŸw¢™¬PIåoÆž9Êm ‘tƒZPl¥%VE±ZœƒªŸWxEkðÌÄ àn·Ø"j­@9ç„Wü”thüE«ÒÌÊ6ÏYfœAðmÃAZ]{Èä’ž¤¤T§Ó¹d®§ØÕét5'6 Š;7É‹ ȹöN’Þ¦rØì6›CQ6³Ã®Ò›BÔ^ªˆ " sà€Q¤ 0îžOäN[™Ù*{$qvN²ÃC€‹pÆÆÙKÍ¢)D]Óh‚$ VE‘Ë‹‹í*F« ¼7 ®j»Ó†§ì’Ù¥EÄ@Mý{çª\R‡ZÑ} jƒÖ^lUA£×U<¸¯Íu5{Þs7µjÁnQ¸ìäÜG«ñÀÆŠTÒ…Hl಑¹[)ŠZµHˆ­h5ËÀd…«„€>Ð"ü;sYæ i5B-¿:ZKh¸£¬¤ÌYQ¼Êâ%=}ï’¸b)+spBÂŒR¬*dr)ãÊgðÑ»®µ‚ªWD!ÈEƒPI­“Ô:®ØÊJÊeî°ÙµVô@n‘æRrÎò2«ÌAPk5Ql›\×zZƒIC€9ÍÅeî´:˜JKÀ_Ë«MáQo0 V«Íá”V³Ã¡MºÀª·¢Úžò‹ªÔ*Ï GÊ+úÝèï¢Z.¯[IUˆEV. x0® ìyRMÔ»P¨ú76ЭH0‡CÑžÃâ¤FŸ»<@¸—à àw¯î³<˜ŸÄ«úQþÆê29Œkëü;F¤n!CµœŸÞ]€ §a‡Ã½>!Ô%ÕÎá5PÎ\RNPk5jµÚÏËSŠ÷ü–Rûtgî}(B)îtV[Œ•3‚Fo 5j((vgГiT§*N§ÓétÆ•©ê·Øs9©n‘Ýbv0 ’Dd‹Ù®㺠õŠÃ!<ÓRÜÞl,gk¹¹Ü&Wk×{YŠÕýZcL‘v‡âz?K­v™q.Û¬2€ Ö²*œë¡¦"»jåÊt äwaN«£boæ·„Z›QÂ"ÂÃÝÿ|¦x©J«" [ËÊí®d\?QuÕ±®V#ÈeGõü]W^/z&0±A.ÌVn¶ù(\ªR=ˆ*Š®XJJaï) ’™;Ë‹ËH¨AòþÓß bŠ¥¤ÐZu§O$µD A£¢v;S¬Å…6âµH•b+)µ1J)á.•.ŠÁþJÔ:µ­ÔΜÖÒ"+!À9€Êfˆßbƒ?—g./‘BB ¢Ólqp }ˆŽXŠKí²ÅlU5]wn!´—Ù+c§ÖŠ€ûx; ±Ìf±Ø€BUF­§ADP‡èì%å2Wì–2»§€”BTT¥×ØJlŠÓ#UBÔjU¤†U"¨$âpr§¹¸€!jc¨^àBUZ•­ÌÁœå%…å„çbH¸A¬^‚xÍ€ªt:•\î`н¼Ô^î«û½ÝX'«ärU«Ô»:*2,‹Z¥ª5A!ÈÅj•Xùê<DµÖ`ԟûgDÔ™ôj‘WdYf@ˆ ‰ T­×kDB€Pøþ飛©{Î9'ÄU Sˆk­*"ê !j‰Rœs ”Š*‰(!Œ1…*¨uç´Ž/‘t&£Îµ>…k‘/Q ¼†bët.ÎËV‹“‘t:‰Q¢"Š¥ÜÉ…®;×RB¥’Æ`r½üæëí€ÆR•Z¤@E•TM%ª6šŒzän„P*ªT®Å¶ˆ¨5š´® ¥¢Zg4jk½Q¢*½^+QJ8!„p¸ýUéFJtžPA毄ók@¨Ú`2†x¾´I¨ ©U~mݬFËWþ®V£q _$ØN©z†‡kU2× Ûl6‹ÅRVVVRRb±XÚ¶m{¹ý"3‚ —ÜYV\æà®µ°ÇC¤¡P‡Ÿ¢Ø¾}»Z­6™LƒA¯×k4I’A „\nŠAN   i8T—¶˜ÏpÞC ‚ ‚ —68Ë‹ â ‘ aáèAK œåEAAPò"‚ ‚ J^AAAÉ‹ ‚ ‚ (yAAä¿–¼¸D%‚ ‚ r‰K^AAAÉ‹ ‚ ‚ (yAA%/‚ ‚ ‚4FÉ+Ÿýuî”i«ŽÙy½[©müúã…Èü?u6+Þ¾âÓO~=åà É9HCnºh‚ ‚4Éë8ôñ#wŽø`…q`%»~ûcëIãõ>Ìʧÿê«5ÌŠo•¬'wnXŸkVê©Å—/ý¿]%Juü‡Î©?Å_¿Þ¾5¿ä¢s9´7Añ@¼@#hÁ·{/cÛÒÇ}òNOMTL\\¤ŽÀ/ôëï¼Mïœ5wh’Ú{E5^yjâQ%ÛÁù“_Ú7ð½ÙI!BV`SN3~Ôû½Î©ã?Þ7JôS$ ¬1x½¨V¼nÊøWÿÌ—9¨LMZuë;ä¶k3LÂE_‚Î~~ÞÆ"A×´y»ëî¸ãºÖ᪠io¨ÚÐu ˆ1õª° ·–ýùì WËÇ~øÆ€‘4:‹Aä?–¼¤FE 0¥é çÇ´ ¡®ý„$£ Rõ0íFBéÅÒSÕÏKu±1R §“â<«ÄÙyÌsш®OŽ/“¹_OŸýoë±÷OP"RŒBC]ÄX.ÍËwÆ œ4&ÛÀ-ù‡6®XüÎ#[ÎÌ|}X ¹Øu>/o×fÑÄÑíuÖ‚“Çüõï=ºrù€—_ÛÞ$^úkIs®0…zû•3Ea %-‚ ‚ÔEòÖŠ1¹uVÛÊ©& „8r?;îûì×>y …ÆgggÑ–oæÌY¾á`1jÑmèØ74××Q'V?/8Îþµø½~Øv¸XˆNM†bîÎápä~â]¥£ŸŽ¾q>€¬gMïf<uN¤&iYQ6íojÈÉhß!CCä+_¼kþ–SE2Æwè;âÑ!Ù‘â«dÓ¼Çî;| O MjÛçžïº"ÊÏl¤_ç€-÷‡f|öËî|;W7é2êå‰}âê2“ÉŒ)m²Ú„ :ääÄüý÷¹ƒÒ3´Döw^–¿nÎŒùï¾woš†`yß>~×¼ðI?{¥®t«Ï{Ðäå7¦¬š—z×xÃVü·%j®6‚ ‚\v’·Ö :ÎcÌ5WHˆ@pEQT;Ò¾Ñ3–댜0:Ú¼añ{oM¢MçŒmg¨ë8Kñœ£äÖóžš´’u~tëP¥œ6I¾·•K/‚EDÐ$÷ÝÿëG¾þâÏünýÃû1jLZLé—M; ‡¥ÅIÀKÿý#—¶¼%#Äy`¡_xž¦“kpT ßV÷RlgN§Óé`îƒ2«åB󴨦j#‚ Èå'yI­Ï½w¿1øæ7ÝŸÃûÍüpTËoÇñ²­/;ÙbÔ£z7‘dFþ=rÉêƒ÷·m[§‡ë»^¿½ÿt÷gm×ió'´sn\ð]^ìà™ÏÞ™¬¡²£sÚº5ÀÑšð„æÍT$ƒ…†¤\Ñ#ZD_÷ÐÛÎ8¯0¹$oDס÷ôo©¥¤kN=þ›Ï· }¾shÎi)å•0}f‡Î[„ âQ›J²šÏÙ²òƒ_JTYפhÀ¼ÉP28p®KÊîÖ¹¥–^qe—túÀ³Ÿ-ØÙ÷Ùìò­Ÿ|y¤ÉÀÏMÕRÒ5;Ù>züâ[LºÂœë›uêÖ©¥–B¬¾Þ¶¹°U¡Žm$~ýï³¶²\¿FMhym–4õ—íÅ7ÅF æ½kÿ…Œ±™Æò­ÓyÀ#:5›ÈQ5øÖËKu3xÏ[w|ÛóæSa)5]hÜçnÖoµ E/‚ rùIÞÚIúòƒíCB¨*¼™ŠÙÿŽÎü½GmòÉwî¿q¦{ÄeŒiÎZè겄D³a¯Žë` „Ñ ¡ÊéýǦöícÔÔµ•Ö %ˆ› ègÞ†/ç,Z³ñÐY+Õ 6&•Úª–) Ô}Bu|N†þó÷ç;;›híΑº÷Üî÷ÙÏ:puÿ[oîÛ#-´î‰ª•7 œ‹ ÝxulQÎ ”Œª[Bˆ’~U¦få½ùÎlõÙ=‡í†6šj\~ÖÄç´Ö¾ëß<ÇFZq”·óô¶:õÂYä{S 88Ïú7зɼ¾•0uíöâëzj÷ý²ÕÙü,“R°¯F8Ïî9l7´®ÙäêŽÊ¯Í·ç)ø“¿0¦meyùö÷ÿ·€Ôt¡eø¿¥õ©¶A=$‚ ‚’·:ú¦é-+rjkÁ™Ì@“3î•‘-5ûmd]_6ÒŦ¦¥yž×A(EâýB‚HØ8WÁ{|Åó/-2÷ñÔÈVìØªioþÈ (ñ~30s4á·Nþ(gÓ_-]:eüÒeÃ^›68UW·y¸fÃ^—bÿwÑ+s6Gduin 8¥Ô·ÑH€¢ppg‡oÝ•_ÔæmUò³ÈǙǜ<*5RÈ(¶ë“)¼ñýÆ¢ìð5›í-†g‡ ¤,ŠªY”ÉUŽR‚õm IhÕºue:»¹ÄHH9@ ç-ª©S¨¨6¯ùUA¹L%/TË©­¦x¸Â@ŒhÞT²çæBLïd½¬Þç•¢Z&©¾ÜþÏQ[›–5¥Jjƒ ,ÅV…s¸pÓ¼ö[)ÍÆ ëÛ%F$Ša—üJ^n=ôÇn‹ºyj¤ å"êsn~¤ãµ=f}jùÊ}7¯[&èbSÓRÄæO>w|̳s¦,oõæíÍTÎëð>ƒóԆ˥¸æHMÒUKvn:åhÝ\C8OlØU&%¤G©ˆŸ ~Þ¾`y:Ö~dåì•gtï¿2J#¥rfh‡[:k&¯XóKè%{|N¤@H@TEGŠJOT-Ùåcr¼?“=%FçÛ u TüàóVYT펭ªÚ¨wA”¼çŽc„ü-¿n8Ö´kbνýbY6yÚ¯]ŒÆž¢4éúZÖqi¯ÒÜÛL‹” ‰IOoßmI£½ð»ë¦ì¦zÛ¿GÍþærŨÖÍU_ÿ´è«Œ~)¼ ,ºËub}ZUtËXX¼ì³†ž™ñÚ³'ʽ¾-?ºõŸMV­õÄÆ• –å'ßóbV%Á8G›ÿ÷ª,±Y¤ÖyzK®™é"ôç3!J!Ô”5ü7›ÿÖ×WL’ (PøÇâ‰=[G:®]¸øDÄM¶3QB †LóÅËS4w÷i‡~œ¿ødüЧ³~Uk5o÷ß½zÓ²¨äÐŽ­&­ðô±ýþß·óšôŸüÐU‘¢@¶4bl}ëÕÆG~À =_kJ Ð@;{F§“ý:ІÖäÛ‹5aQ,TmìA”¼u¼M®¹к7WÍ]Ù­ÓØŒV÷M=tî¼ï?›º¬TÑ„¦t¹¯kï–F¡N%[òâs_VýsÛì÷ïN2åmãÇ,_4uy‰SÔ˜"[uO®¶Ú íüÀ¸~¯}´hÚ vm“NC[öÈ0 çm¨*iइóßZ´pÊZBš´Š€ oÖ.#â¯/_dS$S\z—‡gÜ{c3- Î9RÑþuŸ/ÛQ`ç\™ÞíÁ ·¦¨Ï{jšj[×ÿ—gÎ^×óå^­†û ŠkGµyÓ—ï,9ËL‰­o›øà=­\êT:ìÕ麹sV¼71ŸG6ïxÿÔQƒÒ4þÅR5oçd^‹DCTýã«—þ÷P]d\ÓfFN¿ãú¶Q®jh·4Mzß>MW}æ¼¾_¦{j9ÀÎ’Wtj69€£”|±/:„E#´<`µAäTÿ &Î9ç\Q§Ói³Ù,KYYYII‰ÕjÍÊÊ ”·À™Â€ ¾ã$gŒñÊíœ3Æ8qÿÉ9㿊F­ÛïUp¦TKÙuŸÀ³|פ¦ë´^Urý骥uN²àL©2Ìuêª_] „º_ «:™×fÊ9®ü{®UõŠ”WÝýœ×‘ûÑ®Î~ý“Ñ-4ÄÓ“UwëU+?ƒo\0‹*Û€ë-,ï’·4®( ˆW%ýï\=:ÕMÆQ¾%ûõÒyÔwS-ÉGj®6‚ ÒxÙ¾}»Z­6™LƒA¯×k4I’A¸àoî7|.Ø,/¡‚àw3õØL¼ö"ä¤ñ8o å{WÉ÷Ï S B(©ÝÕª[³sH ¶žÇ‚ ¡”úWfŒõk«ïÆ‹cQ-ˆPíPÿ;WNÀfW££È9´ˆº›ï½)‹j¨6‚ ‚\Pt‚ ‚ risÁK— ðð…ÕFAêLl¨DÄÖ€Ôz_tAr?ÐQXmAù¯ÀÄAA%/‚ ‚ ‚ äEAA”¼‚ ‚ ‚’AAAPò"‚ ‚ J^AAAÉ‹ ‚ ‚ äEAA”¼‚ ‚ ‚’AAAPò"‚ ‚ J^AA©/ÉËÑ[‚ ‚ È¥-yQó"‚ ‚ —ºäEÍ‹ ‚ ‚\ê’AAAPò"‚ ‚ J^AA©OÄàwÅLÞK‡Ã±ö×µ§Ïœ®ÏçtÌiÕ²!Äg»Svnß±½°¸°qù0=5=)! Û‚ ‚4zÉ‹\ª|÷ãw&))Éî°×Ï%Qúwß¿*•*5%ÕGõnÙ¶%)1©{·îÕÕpƒ…s¾a󆓧NÆÅÆasBA”¼HC¤ ° ¹Y²Ãá ´ž]¦èCôûîOMIõùª¤´$)1É);9o4Ï(¥Y­³þYÿOlLl#Rê‚ ‚’¹œààt:ëY«9d‡@ÿÕáœ1ÖˆüÇ(vA%/Ò !@€Ôûká¼±¥Žcª;‚ ‚ äE8T õvæÆR…7:‹”³ß½ðÐÄ7žõ»“5hvò_Pƒä½`(–;Ö¯?l–kÝÓ~ð“qwœ»§\a\)Þµî­'¬Œ±àO…½ ‚ HôÜéß¿újͳ‚¦ïKvýöÇÖ“6ƹ×gä\¸X‰ Üyvãò…_ü²ãà‘¼2E2ƦuèqˈÁcTuyzΊ~|Ø›;”è»ßŸuW²šÔg JÞšÙK+JL¯¾™!ôB=û¯?‹„ˆìkZÛ¶oþèÓ Ý&\*øÝ“ÒsÌå•ϬýpñžfƒF\¯ñ{w;Z Nh­¦DvÍ’·úÿÛÔǧý™/sA—ÒîÚÛo¿63\ª©Þ¶ƒ &¿²à;³uµO¡¥`AKY%/‚ V¼nÊøW]]+¨LMZuë;ä¶k3LB}æºç´³^óéŸý¼ó¤E“ÑíÎÑïOÑû1€|ûøð·÷z- ”>î“wzGФ¡˜Æ ~úþ[G|üzÿxOÉäY9 Gò²Òmï=1qÙ1™¹C­ßùÓº¶wÞѹ®M†9cŒ×}F´®%Ø®X¼Gf´ÍÐþ͵ôÂ]õgmÒýî¾ žüæìïó ‰g½ IDATº»Ó-ñ~o:J^^ºqî»Ë…†g†xö‚:4"<¨•(õï{Þ/‹¾<ÙmÔ˜ÿn«9±ÁÏåÌ¥yùθ›ŸÕVg-¬…®‘¬¼ÈJ7¾?qú†æw=4¹}ÈÙ?¾÷Æÿ‘séh¬.z9W˜ÒtÐócÚVLa !IF¡Ùé8²úóÍ5ß»ä«ý×=ÜJGqõË-yYñú¹¯/;êTxÔU÷Ú½E”ÎݵŸvlêR[¬t÷·¸âŸÝ'l! -®ºuÄýצèÎ#_¿õÞ·ÛsO–;¸Ê—ÞcȘ×$骤ÑÉùcn]H’G|òöMñbù¶^|íÇ}gÌ ¨M‰×Ü9úÎkµ¸5÷çs¿ùcÇÁ«*,³ß„ɹŸ$¥`Ã’™ýßú#Ū O¹ú‘F_î)ŸœÇ~ÿó,ãbÛ¾]7ÕJ~å¾Ì(kØ¥ÝrSÒòïÿiKÁ€¦±þäa`ÉK3Æ)¡ÞÚ–Fæ ¾7hÀ‘猥4ñ9Ïòrœƒ!¹MV›Pô¸ñ¦^+&>ùÁkï·žùX÷H‘8‹¶.ûpÞÊM‹…¨ô+¹÷ú½À9ÿðM ´žðéÔ®ÚS«¦N\¸õ´…‰†¦íûwGû‘€óÈ‚_“ýÊÜ‘é÷Ù]“½¶#k>ž¹xÝž|;WGuñÂÓ½c}n0±[B¤qÂŒ)m²Ú„ :ääÄüý÷¹ƒÒ3´D.ÚòÍœ9Ë7,¦Q-º ;â†æz°²Ý+?˜³býžSfÁ”~óÄ—Gfè(/Ù±|îœåë÷æñ¨´œ[F>00Ó$¥èŸ³>ýuWî™2è;Œ{û•Þ1’óì_‹ßûè‡m‡‹…èÔd(æî‘Ûrø`Æg¿ìηsu“.£^žØ'N*Û4ã‰é{²Ÿ›1ÒßÓVÇñuŠâ ¿½[’š@zÈŸÆÿ³åŒœmü3ÆäÖYmÃ*u®k4b*oÝ9íÞg÷ œõþí *ò©ecG~Ñì•y2Ë×½ÿƧÿ>SXî ú&é9ƒÇŽî›ª€Ã¿i¼´F+\û”ï^²*/cä¤nk'Íÿ|ã]ÏwqpiÀ’—mXüsã8ìù ƒR´!›˜éjVÜöï'O_zLV°çn[6ã‘=%³f JÒ8Ïnþc×a«Â©JÖÂcÛ—MN‰šóH}eá’Áh‰:R'¡ìÔ«bPYŠ s7ýêKêÄw‡¥jœ‡¾˜0fþA™1Î)Xó D­T±g ¬è÷×^^´Ñ®°¨µµð´Y£òžzT ¶o:ËšuI7Rà8X­dì Þ"Ú¤]‡(È=}ø¯ýæcüå6T yJ€ Tzú´[4\–©ÚûÎK.9VÄ9×4M0¬Ð_É…k¾ERTJ!gäÂfB…s™å%ñ­uMâr ”òü¿?ûz»º{¿{[… æ"kƒ$PB í2ø®Na!š(Ð gy]/ù•‚ؽM“‘(.ß{ଭ,wþ²Sé#ÞÞ+J"U°~ìWß¼»uMXÓ”fñ!„ç KîØ- 3=üøo­ÝvÚÑÑ ñ¹Üc–W.=[Ât-ÛuêÐ*„BâGñ2ÌåE¤±ÃœVóÙ#[V~ðK‰*ëš ˜7}¼ìd‹QŒêÝD"]ø÷È%«ÞŸÕ|çÇ_ŽºåIw§¹×²õŸ|y¤ÉÀÏMÕRÒ5;Ù>züâ[LºÂœë›uêÖ©¥–‹[ð]^ìà™ÏÞ™¬¡²£sÚºÕU‰²¼¦ÏìйckƒP9T³Ÿúh *øcû?>r˳ŽùO·–öÍë•þ¸¢†\äÝo ¾ùM÷çð~3?Õ¹µ¦Êšç\—Ô¡k§–Ò©C\Þ¦Çÿ%wTVÓL#5[ò™¿Þ¡¿jJ[ƒ msOãÓßüÛ÷žT &74XÉKD• ˆþ’5í§vV8W·»ã†ÌH­q]ߟìÛm;¼#ÏqE\åôÔ±m[áhqñÉ€¦R& ‚ T´cV²uñ믱5ŸpÎãP^h‘íù[÷99—Ú¹1ݤè¬ÜO Rl§.1K¾:yhî˜û~îÞïŽ!·^Õ̧°Y@ªÀ~ÂOÉÖÆ`QCDÅRdáœCuµYCbƒKóV“¼®?(¥¬%å\ܲUFŠ–VöP”Uht|B”Dü§Rœë,oÕwU7ÜœÎyûŽÛåS³Æ |¸·3¦>kUR‡Ê‡]Êg7|3oÉÚ-‡ lT+ؘXjW|t.ÎÝŸÔ)7 jûç¼ç:Ôý†›ôé–jªþ”‰®Ø€ Hcf×ë·÷ŸîêÅ„n¼:¶G„(çî=j“O¾sÿ3¡²_ÕœµÚ {ÙBÚtŠ×ЪÜ6ÇÙ=‡í†6šº7jâsZë?ßõožã #­­*ÆgÁþãSûö1j×ΤªujÿÁí~ŸýܨW÷¿õæ¾=ÒBE÷$Ô ÖËÏ=i¿¢OǸ³osøóç­·dõŒ ô^wòЗl"@UáÍTT>¸òµI× §ŽnE¾?S*ËꀦÕf8Ž®Yq8úÆGSÔ”€6½Ÿ˜U«Wï½ý¡,=þœ}C•¼bdjBò oæÓ÷¥%©ý —ÊI>w9ø¦B Úp-@1—eÆB¸,W)6Ëö¹“?ßRÂzß= Kwäë9+)À¸ì`@©è!Ñü–@´Ìx=aÑ¢%«7ï[·øåßþ¾óíé÷¦y¼nEÕ& €Å^jgÀ?%7 ‹ˆ£¼\µQí_ÙÖ yi¥â­.y ¡”ªº^›¶kùÜ7Ov¸²G÷ÎíC(¸Ž#”¸¡­C./¯ö¥ãôîãN™.*²šì±ïM¯ Ÿ: À)à^}Áu}bÕ+S–”w¿çÑ{[„ñß½ñîŸàñz[µY^.% ˜8«Ã–ŸV|³ü'—¯üâ‹·5÷y¡%/‚ ›fÃ^—bÿwÑ+s6Gduin 8˜Ì@“3î•‘-5=6ÑFšÄÓ ÷äOzvòÜÖ¡™ùûJ•|ëär6ýðÕÒ¥SÆ/]6ìµiƒSk~‡‹—nž5c­þÞY“úÇIäÖ;zÍ}à¹÷g÷èô|N€÷ÒôMÓ3ZVäòBÀQCå ‘(8­Næwº¨rA-âä¼&ÓjÁ¶ïÛNÉ…ó´À5uÃÆ‹¿Ùyo룀MôBpá×奯Ìë[«ÜO_ž¾lýÞ“Å¥%ÇÿýçûuG¬Ô±­“(!öm_~¿§ÈaË]ûí>ι*)#Êwî̳iUh¨gv63&Ë ”’#GÌœCÒõwìÓ§W—¤Šµ²¤è–q@ˆ}ëÒŸs- €;Ìe®2U+Ài.¥Íû~é“ÅÓÅÎý²þŒÓK¦bŒ@Àr&ÏÊTMü”,5‹œÅÇŠ9ç$4&Äÿ…C ô¸û'Ÿí®ûuJ ¥ª¸kFNxæþž Eÿ,|{ÚÌ5'œRâ>²†’k’¼ÌÏ?÷·2ëÑÿûpuž¶ÓÀœuxJœ`?šË£âã¢u'ª5X‹¬²Â\GÙŽïÈU’ÜÞ«c‹”Ô´IÎÁU&¸ƒ3¸ì>¨.¾CßÑ/¾ùÒuº½«¾;`aÌ»bŒáOQ Ò˜ÑŦ¦¥f´íûäs}C·Í™²<ׯAŒhÞT²çæBLRr³ää”ää”䤨QŠLm*•îÜxÒáq«/E¥'ªÊvn:åÞè<±aW™”¥ò£¥¨–I*óöŽÚüMQŸ˜só#Sß­~Ïò•ûlµÌ(È%•k’Ã$J)M雫¬gÎXj:Ê{øš*/cPpø¤%¸N¾fÓjîæ]ËÖÅšøÎŒ7Þñæ»3Þœ5cÒxë?+·”(Ü%!¸Â*åDåg俜å!úúqÃzxÎVËñµs_üi®ëf‰sí•Æ¶Ow޼jdÿ%ã—Ú<ï©Û?"®§÷Ín¿«£‘[à25ÉÝ[©þØbÛþæ½æ¨ÝuoÎ’Ú‡ sçyà—fa¶·&£{ï¹ô¹µ…›Þø¦Ù¢ k1~ñ´öÕKH=²pìÿWjˆŒÔÙOf¤¸d£—GĨ¬Ö&8RtèïC–^Æ%¿Þ½Á[Ä ÿÝt:¥xMT„€³¼.më‘PñZ¡‚@B@iÚæê!™9¾œþîo¼úŽTI¢‡Y&®üÍ+Ÿó,/(Íݵݠ±9qhý÷ßoÉoÒç¹W† ”´zC“ «^•êݦ‰ÆQxª,ášëÒ BDF3ÕÊ_¿\Ö¢O2/4Guê• _­úbµ¾GË8Mþ KÕÔ.T&óR}lûcÓñØlõî5[Y|b¸Ö™·ýh9Ó…é¨ïšˆ5üx2‚ Hã€B¨)køÿn7ÿ­¯¯˜6$)çÞ~1,›<‰í×.FcÏ?Qštý -¡†÷}xé ÏÃÐ2£ÕÖkb÷«›u>0aÌ/OÑÜݧúqþâ“ñCŸÎ6úëÿ‰¡ý}·%^ôÂsì®›²›êmÿ5»;U癿Vmd‰Í"µÎÓ[rÍL¡§¤æµ¤È¶",Ÿ=/ó¾^-BÊþ]ýá?¶ø¡­LÁOéCàÊK1Ýz&~<ö‹¬7fDÐÓJj)* i5ZÁKw~û·9ù®ë³3*ßWk¦ï´äÓUv½!"$Æù[~Ýp¬i×xÏI!8üŸJ^U|ÿióRV-üüû-sOÛE}X“¦-:¶ %D×úþéo„0çÛ ûNÛBb[v¾ùþÑ}k[ò–†÷xìé#oÏûvÛ±â2§)š8ÐdÜ÷ÊùÝ%ëvŸ>°ë4'êÐøÔ¬f!LWŒ{{j‡Ÿü°mÿ‰b‡dLjÂÞãѧ¼ãU‚Ìu M´[Ož9Všðæ]û¨s˜÷su³îŒÿ÷Sñ–ÕÛJ²»…ù+™5x‹œÇ×,ßÏëš%¨N ¹¼P~êÀ>}Å£%ªoÚ,Q[•âËŠvþ¾›GÇ™ÔráþÓV® Õ‰T"Rã¥_6þøsJ·¦Pb oÓÌka_BÏ5±AÐG†Ñ¿W¼6yPmDLlbö=“o¹&3RMs®IöÒdÓ§ Ö~9cUÓ˜’:Ý™sMjˆdì8|Ôõo¶tÆT‡&²ým©]ûõ}rTþûK—¼ù«$}d‹X=q­VyrÑí®Ìúá“ÕW´ì¾ÿÏ¥ßí.°sPG¤^1âÑþ‰’ï l¼òhAF Õ¶2®ÿ/Ï.œ½®ç˽Z ŸþzèÜyß6uY©¢ Mér_×Þ-‚¶åð×_7ÍýpõüW¾43MÌUcÛvo“:ìÕ麹sV¼71ŸG6ïxÿÔQƒÒ½y¥n>dÊÛÆ?X¾hêò§¨1E¶êž¬œEû×}¾lGsMdz·'Üš¢&ÄÁYQýþ©¶ÅˆW&ˆs>_8å‡B›dJl{ûs#‡œÛJúêÀ•—’NœX:sÞª™“)‚Ú™Ò®e¨8Ç! i­`Å—o¶&ßÕ%FòHþ•b»^›üñGËÿ8Óëæ˜kî´îÍUsWvë4¶…Çç -¾Üü½Mumáþ¡VEq:6›Íb±”•••”””[,íÚ¶ ú7º\OŠ+Š'„©Lãæœ¹Ÿ#B<6»Vq­^à~}‹T¦‚rV™Iˆ+±´ªœŠ›ÔÊ„SY¹»o ^ÇB‰Ÿefí¹Ÿ>ôà§ÇxúÈ¹ï ŒW¿%7d‹xÉúiw?ÿ[©Ðæ©y/÷‰ö³ÜÉÇ >îÞµ{É[¼îµI r¹ç·Íîžüd‡òU“§þ‘ùèËw$óÜog~øóþ"'€*4)ëú;n뙤¥g7|ññŠ¿sKœê°Ì}×»Å%ÅgòÎÜÐëŸó®ùyM·.Ýœ²ÓO]cí ~*ï3úTšëc”WÁþM«ÑŠóØìòŒ§ž ð`ûöíjµÚd2 ½^¯Ñh$Ir=Ú½Ü,ñ¢•ìWx|çg.žPAðÜG¼¿­Úå:}µj8¾ê†-ñ¦Q×­š´fßâ϶öz¢“QðkXõHÉÿíó?Ìœ'Þ#*à’ÖTôƒÃá=ž~ç*?§ »ååwnvÕ©yÿ'_íWUƒŠ‹H“s÷„Nw¨é9'6øuï~®[+âó¥Ç…Í«îKHµRˆ«W©êl€ûžÖßo!#€JAÆ9õå34U¹ vŒ8ú[©ÀÉÕFÊJ¨y< ÎØàÆ_?§÷ÙŒÓj²"@Å<6“Ÿ‘ y/hhöˆçG„詃Ah|ºFˆºþ™—,ßæç N¯áñ‡(ˆïö]VÁ\n÷‘$‰1vn’·!„2AA”¼Bô2Þ õ €*ªým÷ÔRû€¹¼¯V*•Ãá$yoLò‘å„ûMÆ@A%o£¡‘ç»Ô^ýú—¼‚ Ô0-Ú¸fy¹ë ß`CA”¼HF¥RÕ³Ê$„H’ÿõ#\R¸1©^Œ1QÄ« AAPò" •ððð»vfµÉª7•©(ÊŽ;2ZdTÿÊh0ææG„E4.Ê=Ë5 ‚ J^¤Òçº>k]»|Õòz[v€q–““Ö<­ºFlß¶ýöÛ:؈ä#ç<­yZ\l¶%AAÉ‹4PÔjõ ½n¨çS àE@•¤Ên—Ýè|ˆó»‚ ‚’iŠ­á¬,‹òAA E ‚ ‚ (yAA%/‚ ‚ ‚ äEAAÿ„ ÿúZ~~þž={¬V+:AAä‚£Ñh222¢¢¢Ðÿ¥äݳgÏ5×^S·—î¿ûá»Þ½zã û茂ÑÁè ¤~úñ§ÈÈH Sð\øÄ†ó™ßÅÈ¡O0:F£ƒ`t‹*·.O.ʺ¼uþÝZJi½ýæm£¹)AŸ`tŒFÁè È¥$y !x™¡O0:F£ƒ`täR–¼”à%ú£ƒ`t0:FA.iÉK(ÞY¢O0:F£ƒ`täÒ–¼ø0}‚ÑA0:£ƒ Bò2ÎÔå}OJh½T¹ð>‘Ï®ûè£↎뛠FO7´è Œ‚ÑAÆ"yAb³žÜ½óDH«Éz¡þ¿Ø>qúôÉþhýì[÷·ÐÍ·ªJñ®ulí~ cŒSìÑþÓèéÿzlo—{tj?€ÑÁð]^ÑÁX#—¼ä­=eÞY°yÙüÏÚ±ïh¡MÐE§µïyûð;s"ÅsUn¶ƒ &¿²à;³uuQ}5Î V?1r¦8~єô·©Oû3_æ‚>2..¥Ýµ·ß~mf¸DÎß'ʙ厙s1ß/RÇ}ðpDLl\„–ðêUåžà%p¾s!èj {½”öð‡3zª#+£djkoï:nž:eXkCÅ—–Í/ {ùì=ï½5 F"ÀÑq]§B]}„q¹Hѹ°½ýE0:5:Œ5Ò%oÍw–ܺáÓÏ.> iq]ï»nN ‡’ÜÝ»‹ìuRnœsÆ8««ê«ápΙ¢(„3Î98Kóòq7?3ª­ÎZxêøÁVÏ~båŠ~/My ½1È®! OHX—Ÿ+“œG¾™ñÁÞÌ»1^Eˆ`h‘þä+}¥.yëSUîþJÞ‹;âj Mo}î,ƒ[TQ}¢‘JRŸ'_éíŽÎ…ioòÁ¥“^‹zç¹Þñ®TΦ(ìrpíÑq]§ü\±aoD¥u¼éþ7µ2 @É_7û­…ëœ),w]TZ§ÛÇŒèÓ\/pGç?|Ó­'|:µ«öÔª©n=ma¢¡iû¾ÃÇÝÑ>Â%K™yϪyóVnü÷t95¥ xîùû’«n¨œC­ðçÀs0$·Éj*€7ÞÔkÅÄ'?xíýÖ3ëÜýp`Ÿˆ‘©­#lÚßUp$ºEÛv-5ˆ|dÁ¯É~eîÈtMuK;±ªrgÑÖeÎ[¹é`±•~åcîí¢ð>ø´X`HÌlÓºj‘pä.x°2:ÅÎY°n÷Ñ<³tízã…^¦“?~|z’õ­©CRÔD)?¼e÷ÙØÛÆMÕšýùåg³^šÎ“E9ˆêûä3×E«ÑÆh S«^÷Œï¦gy[–½ÿù³›Ïšcˆ3÷ËIO.,jwë° ­" ¤ÄÐDrYè}8¯C=$/÷]U'Þ0òÆe-_úW~—¾ÑÁhÞ ßœåœ!®ZE‘YUò‚wUWŽ»Ü~àóIÏ­Ðö»ïñÑ–M_Ìy÷y÷Þ¨ÊiI¤îÑq}Á™¬(Šë-BJ½¢£”îþmýшjebšÆO,Ÿòî/Ú›GNê#–œ1'˜DðD¯öFãnxfTäÿ¦½63õõ'ºEŠî»-×¶ëÒˆ»ýÑqéê¢]Ëæ~óÞö諆Üñè]Ñߟ0ïµ°–3G¥k(ñm!3Ÿ'±¤…Ô?’׿»ø‰•—ú‹NÝz{Φ°Š™<Θ¢(Œqü(À ½¯ÇØ4S+iݦ·§ÄJÀJ÷n>-¦ß >Aî²N û<Û¿&ØX+'¾ñwE㘆’·aH^¥äÈ ÎŒ©ö<˜›·ÍÿêhäÍÓž¸#EKIçv‰ö‡&|¹p[ßç:9ãœkÛvÎn¡!ÚÆäm™ð÷/¹¶ÖÍ8hš¦4‹—ˆëb]rÇnÉ™éáÇ{lí¶ÓŽŽµeÛ§_޼iêÓw6×R·pkõÃy•ñ•c©·þu¡ŠÉH—ï=pÖ΢„ f ‚¼Õ&¬Üb«bƒOUU»³²m –Jñîð^QŒ¨‚õc¿úþàÝ­³0áéBˆ*°çí{½ãÞ~Ãô÷‡·<£Ã8çºä]²[h!Ž=gK˜®e»NZ…PÈWÛâµµ7"„çŒxnà³OÍ|7«ù³}LžíŽømØ÷¥‘Õ©] ÉŒ>ó׃_Ç÷ìÛ3;„’Vš¿¿ºyËgZ¢dnÄ-¤öèøIïñï.RŠq©¿èÔµ·wßÍWt€•‘zpú^ éÑZõÆ/ÛŠnŒŽË¯?JÒnHÑ^úŠ÷âŵ4lÕy¶ÿŒ`cm?âïŠÆ! %o½JÞÀùCœ)œ»wðÙ6û/ IDATÃqöß#öÖÙ1j×§:®c¦néî½yŽìêÚ™¸&@UMR"Èy¥2gœCåú+®å³¾™·dí–Ã6ªlL,µ+œ;Îî9b ÉÌŽUÝyõýõ'¯Hlð”ž;0Rmc|âuJÎÁGòzœÄ«ª®ÉgÎ9玳ûŽÙåS³Æ |ÏkÈSŸµ*\‹Š÷<[¬»%$Ý6ñ¶®©7ª K’(¾Ñ©lŸÀ¹*å†Amÿœ÷üC‡ºßpÓ€>ÝRM"qÇ­¦öœmúàÇîÞ9aΛ߶|:¡2Y›hØÞ§ÃB‰£¸Äu;¤kj‚‹, c¼1·Ú£ãç2ôï.Æ¥£SÇÞÞóV¿â¦£úUVÓ(Píz]Ëk3èôŸ¶öìi<¾q¯#þÖ–zˆ£‹<nØçÙþ[kÿ=-‚’·>%o ùCÔ#‘{OZ•hÑûÙçœU¾Àxf•©J&3Æ9'ÜãÝùĪW¦,)ï~Ï£÷¶ã'¾{ãÝ?3ι¢0 @Àëò®vx5ã½<ösœÞ}ÜÉ#SÂÅàÄ?V{Fëeuµªz*.EV@“=vâ½éÚÊÉ!u„AÀÞón±nêbS[¤‡ žS'^Ññ^R€‰³:lùiÅ7ËßxrùªÁ/¾x[s]­íÍu¼”0à‘{6<úÉÛÿ7X[±Ù¨a{ŸZP‰2cœSà‚$¸¯Ò˜[HíÑ©–ذÀ¸ÔctêØÛ‘(8¬N…sÑs’7èQÀÏ iÝ«øæ :§ýµ¥8úª¬ðË¢w¼Øcq †}Þí¿4ØXû½¢ñá&JÞºH^Æë¶‚µûaŠß M›Ñ÷*Óúµ‹VÝÔâöT¯–)†§&JËvo>eÏHÑ穻˥¦©wϨ¹mTý—¨BÔ`-²Ê )Ûñ¹JÒý·÷ê-%$ÉrŒ‹a)qŠݛOÚ3R4UyK¾‡WÁx¥8ñü ÀíÇþïÃÕyÚNçDAÎòÖà“ WÌsî:;ó°ºzU\fœq!´Yœ`?šË£zÆëh¥yÀ Þón±¬jÌNªtgt˜Wû¬RtñúŽn×£ëÜÇ'­úî@ß1­ÅàÚ€Ósü}ÿ<<û3‹Â“9çŒÛ4lŸS»#Î9g<>7êTt*®MúŽq©ÏèÔ­·g!ÑF(:|Ê"'ªâéº Gðs=S»W_þ¿Ÿ¶fÿ]{uçñ²èëa,öÛ°Ï·ý;ƒŽµß+5/JÞúœå%„‡×™®Í‘×l™¾h„ý¯ë”JÍgï;×x¬;4}ìëéoª_—¹¿|þÕ©¸A¶ q«ª¹Î+–è"2š©Vþúå²}’y¡9ªSר´højÕ«õ=ZÆiòOXÜG±ÝУ'|3u t]F”ÚVdïÒ-Á÷ð«[…ªUo=NÈJswm7hlEgNZÿý÷[ò›ôynÄ•AOÔè“À³¼•VW³ôêT}lûcÓñØ+âÛ½¡É„U¯¿JõnÓDã(}Y9×D_yfçÄ(ßÃÓ ´ºþAFÿ^ñÚä@µ1±‰Ù÷L¾åšÌHuðÙ`ÁæòVdóº¦}«ê@«YšÞ´Û]þ˜õÃ'«¯hwzú°—&›>]°ö˫ʘƔÔéΜkRC(^ç@kø´Iï}…þ\ºzwƒ:"õŠöO”ÀOsõiožÂZˆê9rÈÚñŸÚ\Ò*>PÃö¹4*Vð~¼«i¼-¤öèœX>ý••ÛÒzÿÕ«ü» ãR¯Ñ©co/Ä÷âÉÒ>ûîƒ)_*‚ÚžÜ&ÍH‚š¿kVlÚs@«¥ïïL¾¥K“Ëåµþ‹?jØç×þƒŽuvKW4*ÞK¾aûMBãœ+Šât:m6›Åb)+++)))·XÚµmKH-³?üðÃ]®¨u7¿?y<>.¾=͘Çk„J+ò×Ýù\„Rõ¨ƒ3…¥«e2…u­”À+rå q}Ï™G¦OÅF¨,¼v®~xU ½ÎQñˆÌåϪ]HŸ0ÏZøZík)g¼ê/ë*Šœwt<[‚ÏöÊèxGÊšªÖ]Õ\‚joþ·hØ^§ö=«ÌFÚBj÷æ…€ýÆ¥~£S·ÞÞó+W—KÜ]{°£€ïõè:À¼ýño >éšÈËä%§‹>nØçÙþƒ5º¢ÿùw¯^½j•[Û·oW«Õ&“É`0èõzF#I’ „B.¯á¾±ýàp…tôˆ“ǘQ>b%ž;Qêu‘$Kðižu!„€÷ÎÕ¯:£ç9|¯¤sôN>¡¾õõ¶ºZU½ð´ït/\t<[‚ÏJU$¼"U­ÉT}T{ó¿-@Ãö:µÏ>e6ÊR{tˆß®Ë¿»0.õºõöÕ½êiУ€çžÜ–w踙™w¯œû›îº—¯£—MïxñÇâÀ û<Û±|E#(yëIòý³ —茂ÑÁèü8O¯yïů‹W›pkšö2Zº¯%o°0ÎH–l ”2Î0*茂ÑÁèü×ÃcÂÓæÝÆÝϽùå´ ^;JÞ`ÁY^¼ÛÆè ¤ÑG§2ûå2kIxí (y/ºä¥”âe†>Áè Œ‚ÑAKYòâ%ú£ƒ`t0:FA‡äµZ¬uûõ5J©ÅbÁ¨ O0:F£ƒ`t¤¡KÞçÕÕñ‡AAÚ…>h’—Õøó¸‚ ‚ RŸàË"‚ ‚ —8âE-'\©ü“‚"AA¹T$oxù†˜ò¿(©Èqà ƒx2äšR]`¦/‚ ‚ r HÞ&åõèÚ•Âãœ1¦8ŽÍ;~Þ/…Û¤t=‚øŠíÛ†¦•+Ë<è¯ä2½^¤n]#;–¼·ÃáÀ‹AÿJòrÙɘ’{dŸûOFchZ³d¶1S*³pÎñlH×}GœýEpï’–µ½ô›Üsù iL®úÎ[›v>qrÂ6 ª4¿«‹³[¶°Z~ô– -SC²b‚ µ°¯hE‘-ÿÏÞyÇGQ´qü™Ý»½~¹$¤’FIH zïMDé¨T¥Ø)*ØQÁ†€tiò‚  ¢ ½#Jzî’˵ݙyÿØä¸$w•„óýð ÉÎîìîÌÎÌoŸ}æ[>¥”RšžfÞ·÷ìÖ-{·ý¼'ùRÆÕ+Ùò¿kWs zSµ¨póïÈw˜CxÀû£cg×V(˜$ÐU©üýóU'Æð|ÑQ"ºQô†ç£{˜+¤{4Nó©¶á¹ˆŽ†[¯nB¥À¯Ÿ¯>3I)Üq­ @¾ª°”$FùÔÎÝ0Ð,‹˜šO0«”"¤èÜ7vÓ? Px,lx•;ëðk ãÎ e(y%œ•iµæÀÅ‹i‹,¡Ø>–† ¢ÖD—¨#/¯Vµ¬_iH]—YÇ€ô~¼’S´oí¿ñZæ%©àEÓ†5R)x±’X¸{ÅGöež Ô@½÷wG>@Š-ü#r-/EV%¬v zF×Ï?§l ì‘(ÖµqÀFtGLÈ2ŒûHòŠ¢”–šær9€,ÂÎ]¿[ðCÛG!9Ù9¢èÕ;…Ö ^oÙ–ß!ØŸUýx„%«¿ipUó;ç%L€‹­Xˆà@S4l<0NeàÀÇv\~Zbª«¬‘,¹óùÏnÜáhÊ&3Õ„ù?Ewnʹ E|ͤ auuqÈL·mÚþÃõBÿ^Ù¸qÐàšÚ-MOw!-ܲÿùLB•“ÂÞjª @rˆGOd|y ?›™ ï~ípQµ*mlLÐ#¤ý»®}tJtQ¯}ÔHÉ–x–ï;0ªãÕ”1¿;¾jÙ&t`UˆŽSÉHËÿ~gúÖôÛ}å°ˆl³®)€Ó[/½q„Õ)ýçêu©òfˆeÒ·²!Å4žhŸ²,픋™ FK^,á¬ÌÌ ¨—Ô Xß#¿ÈçåZ±äu¸¦×¤ ;X©}uZ…e¦Óó•=/Ó4¾©)æRæ% ^ÿT¢âøŸéöfÁ&€øøX]”5ç«ßí¹"˜Mx*èåÃi?ÅG nmØû³³S;“îJÚ² ST¥qÄûMøƒ2ßϤU* í¡^uuU¥ÀÕl1¹:p0cM óë… }–’DÍ7r—ýb6;!(*`t£Ðgӯ̼Œ1«å»Z;¼¿éÕöFÛ‘Œé—E¢Qèr°HAám£ÏñÒyŽC<*µ¥ ²dñ›Ó¡R6oXitwzmyÚ çC¤Þ2Žßüð´(RjËÅ„‚÷‚ºµ;9Ö.Æéjé².Y( >.J)¥e^™Þe0e/y%IRÂ{äØ!Œ%Ï-íZwB°D$Iò1HÄj©¨ä5jqºŽÌ>?0 wdÎ'—ITb@m‡ùõóÎV !A‹8€²eåï»bw[¯ÜT•ÓþíŽÜ݃^é„«ís7[31 µnpC!ãHÊ'ûv û’ªAQ½›hü1?O£¨L=üñ~§“$KQñÚÚrMk}&@~†uw&HÕã¢ÚG(•Eã.ÔŽS­4"ræªõÈ L Ûïmc)5R¼%õÁ/å({¶í¯+vÀ1‹²î“†Ö'ou”g÷™/¸P¢ ´ZÎã=ƒÒB;£ÜÈ»šùÕyýqʳÜØ™K(€ WG)È©+¢ƒQÜ¡Û8ð¥D§ø·™-mp÷kG¥U7ohª¥ç"Yiyó·š“%¼mÄÿªFDVÞ+ïß•¶µsPß.•Q<ü—}÷EÄ?vç´èdZ;ïðï;¥)§³O5 ­‘½'—ùñ2Œ¢Š–pv’]l1Æ¢(:›Í–——g±Xòm¶ºII·¾mÛ¶iõ( .eevÚ<ü²ÇI¦ÓP*;·ÿ“$ „MÎ)ûÚñÚܼ·A5R²%ÙrgG= `ñ[¦E{ßX<®¶ì)Ç\5ÔiZÕÀ³Úg0ŒNzÖb ÛlùòòÅéiæ}{ÏnݲwëÖ=Χ_¾œ}ùRöåKÙÉWr´ZSxXØO[Ö{Yúˆºnì^ôêÓÝ7kÞ°ÃCß]*—-©Ã¨ÐäížÔ´y×){ÌEŸT×…ÅO5jþÔŠñ?=À,à轫{P³œ&$"2"XÏ#ÇÙù¯¼úé®,éÁ®!Wú¾åÓGìÙ²YóúÍ:<2x»ßÿÇ–Þd0wƒ2´òJÎÊδZóàâÅ´E –‚P|, >D­‰²Ùò¡DŸOóŽÎÿdSN³Sž #¶|¹øãhôÿÞ¨o䘕ƒQ1Á¹×3\8{ó'«­¯)xRIÆöO—\Åàt«D©’}̸kç^Ô¬2²×ô¯Ÿ@ˆCÁô^bšÚNÏ;fÁiMín=G÷‹1sÊ߇ÎYØ‚I £ÂK^Q”ÒRÓ\.‡ÜY ‚°sׯźìm!„äd爢ã26œ¼r5§Rr m=íñÇ_=z$ÝUÏÀüÝÉrÝ Ê`cÊê9»{Íê¤@`?¹bþ>ª…¼ŒüÂÙœÄ|tõìOWï>•FCâ[ xqÂÀ$ÿ‚Ö¥$Br~þì kÆ.ý´o5Öî~íä_÷Ù¬Õ»OÜÈãýköÿà³k+îAÍr—¾8ä‡f_¯ŸPK —çj6 þ»ë†þ6tüéžË¿UCÃ!pŸ7xà†ºs×¾V_š¨ýÔ¢é Nû?9{ѤÆ&%‡€Ò¾ˆ“oHÌÚ¿rÖ¬5žËæCjµþò¸žqždíž÷Ñ׿¿|Óâ †&¯/þü1î·O¦ÏÝuáf¦Õ ÚÊ »nÍíÛ¼uïùlX½Õ W§ô­i䀘¼öµççí¿aÅ St“^/LÖ4X§mûøí¹»/Ṵ̈:‘>´fË¡/OèU˜Ö{Ü©¨´ &yï²EEÂY™™½¨—Ô ˜%WvÞÍ˵b {˃Sj· ÃB„°f#cT\pnº•VöJìª7ç­¿Ðrd G3~ûjƒ¹ñó“´_”m•_íœç=?bAnËaãgÆ¡ó?Λ5zœ}Ù‚±jùNrkç•5“_^AžøbF/¦wË v\–Ž6/«ÉScÞ¯„rÌ~á*„\÷ f]@ ÆäÖ „ô~÷ÃÇÄôÁFU]á×½‡³FÔˆà€XNþu]Yk\5í}û<äŸXñ¿«Šfolä/¾xÌîpœY8î¹ÕÚ¾/ΘjÝ»x滸ÈU/7R›mß}©ÒÓ“'Ô5+WIARÎï?š9ü­7j©³Ž¬øtù‡+w>âíaúÌ?|òÙ•j÷R--‡ø€¤ã¦õ Ðá›ûW|´hÚÌø5´òç±õüþ£©æ¾’ Í»¼}ÙÜ÷'(¢×¼šðH]á—¨´ &yï¶ä•hQWá#Ça\ÄšÛ®u'„KÄcB›Wœ—ÿ÷á×WâFLkáÏ^ª×Rå4ç88CDÓ!Ï$\°øP¿÷Zh/~¿ä ññEí£·.%DzíL(÷Àœå—B-xgx¼ŽCm›Tu ¾xÞ>3[šò|&ù˧on}çóO®´|oþsM”¬1”Eí|µô|ÈÀo> “{„Í«5« Љ¯# @ÑÚÖWMÙz0«oåPEþù]—¸„ÞñºûVƒIæ òiåzq^gçÑÜs¾K©5~õøîaJIá™ô]¶áìó ëP T_½y»æ‰Z!ä  «Ú¸e“D-W¿rêo}—Ç<ÖïñÕÓÚñòÞý©®šUÕˆ3Ķê ‰AWyzÓÁΖ&-ȇ7iÓ¼––kÞ8"uß³;~¾ôbƒÄª´ &yïv†±Àñòï<ÏmÜ´òð‘¿Ü+SÈ;wnŽˆ4–°ÏYèÔ~qý´gg_mûÖ×ÏT×0Å˨¸{v>hbtªðz£Ú/¿è—kña ×§ÕÕ7Á Ђ5ˆ)%i'.8 õšGi9!@š˜–õ KžLs¶ÐúN2ñ™›¦½ƒC.˜Ô!TÅÚBÙÔÎñóC½æÑrT¨šE²þ–u¸!éñ:üäŸdtëæŸ¼ç¤+æé:~Šû÷‘ JÏ[w›?ê¹ßëÏZ06.ýÔe§tíƒ'›~X0*L4©6R °LŠü‘·•ª€3ÛìdDHm‚Yù(€”úç²Y‹6ï=Ÿfãt ;VZ¤Èá!¤‹ 7-ê“ ­Þ{æ §?ûÁ„Éaß~Ú§ªº5ŠŠOÛrìT­€ReôãÃê/›¶%#jØ[õ @Ð Ôši•(ÕÕˆR|{dOŠ=©†ÖÝçÜá±Á U„eGö\³'Åi9®«ÍbBP†øL‰Rmµ^½Þ`ƨ'L]ñIŸªjTP ²m€Sù©!?Ë&Q"PùªP@ÓA]ü^\ó㾿§E?Ú.RYñëÀ7úÚý:øïþéë5ƒë ‹×ñÈý@QB©¢R\”Âqé„=^UçÖ¼Q—GQ§°p‹¼±ðp'Ù“œ—b'ŽèÙ*\‰°¡šÚQxLÑÃÝÇ?X¥Íx ðxîo¿[Iîßÿ×k8”¡äµå;”J!ß–€R@@©N§G°là%„JbL°$ÚíN/åÓþjÝõjC_ް\<—‡€*EÇ©˜öeTLÉë°8@©Uq j7vtÏÕæ¶OTQq êݼ IDAT@¡ÓrN³ÅIÁhl2v`ÌÀ%¯NÕŒê‹Îý8oѵ¨áï6ñCùN*lëœ:ê±3S†ŒšýòâšKŸ­¥¿§+”ì7+nOŠí(´ ¨RÛ1£zšÛôŒPàµΙcqj05ýdøÐ“^¢Ã{&…©ì™ö˜v*ßÙ±†ÆcD^úêTͨîÕÑùŸæ-¾9lFc#øN*Pc©"»¾ýaÊÐ1Ÿ½¼8aÉÈZú•F)¥T’«þnËÂok÷Ž¥Y¹¡­ºÖ6ñÚZzEô[òÑ%1rlÛÊJt_k0cãç^éºÿ¹Ã‡œéÿDëĨ@Þzò\ž¬;‘óQ½Ã†¯~e"7¼wÃpµ33%7¦[÷D?Ï"*”¼ž[(¥Pø—g’V+-^µ`­ñ‘:‘ºô«y: Èápëøª´Žê½sqüH^Yìz^ü?’¿eéË+Jgÿ>àPà…8ù'!„Œ1Ƙ"aŒ322\N§—,œWÿº aë7/ _PxOA~7±¦–|Rò:­NPë p´ñý§L£…1–xA§‚Ô,«A¼ºÆˆ/çéfÍ^ûñøt×tÜœ‰ƒ b½–’TÐÀ8CáïŽØ;pÁ»ËÚ/WÞîÅúJ÷Ÿ¾¶W$Gžƒªµ „ PÇõy}2EG ¡€”Z¦fä¹H J]sÔœ¯ü>ÿjãÜ×Wäuåë¶ ¾Ãc…Ø¡ŸÍÑ|öù÷OH§ÁqMÆ~1~`œ (!Ôw)ÐY„€.qÈŒa{/|oYÛož!²ú"„ίŠ/?ñöœEÓ^vhBš MèPË FŠèÇÖ[òÞÁØgÚ„)€r?·äßbÊŠõ|óýïËß[i)¯«‘Ô"1£”¨Gý•éó9›L]m‘Ô±­Ÿkݵ¦¡@¢RB‘>H‘-²!„‚<’ÑýÞ)íƒÅ &oq¥JChíH="îº(8œ…ÇÃUÚŒaÀ‘ìÛi>B I‰…ÂìþÐRî딇÷Ÿ¡$‘W# ¥c,Š¢Ãá°Ùlyyy‹%ßf«›”tÛ·mÛÖ¯_?„ЦM߯\¹Øjõ\cy u:]ÿþO÷ìÙ·Dæ”àâ ï Žgz—Qa_¹ &”ã½^å4Ž/xÊ)%¤àéFœçL)ŸI”`B €Ü6ʹ9x¶[÷à’–Üí~®¹ïIÍÙ…êØó`š{`Æà)7G-û¼kÈ¿ƒRBI‘1Œã8T¢ôÜ#A±"*^˜@ &àùÇ­röÌíÖ‰J”¹çñZi3îoÖ¬YÓ±cÇÛª²'N¨T*£Ñh0t:J¥R*•<Ïß’×ó åß=–ü³tá[†VÞnÝzuíÚówæ8ÎÛU"ŽçÙc͸ U¥<±ÅÒï}}$ÙZþm£¤º-â÷XbcÅ“¼€K ˆX,ˆbác‰üËci‘°º¥'Ý:MÑ¿Šn/Ø&Y¯Ÿ½’Kr®þøgm÷¯Zú—zm÷µÆÞ­©žÅR²ˆŠnñQ²¾OTl)ï!)mÆý!D’¤ÛÊV\ˆ$I’$Éb—RzI^·´õüÅ}#žûxn)?É‹â™`e0åAK»îg^…/sy¼û¸®üïýqß&+‚j?úú;ƒb•X1+VÚŒ‡ ùküme«,se½+Š¢,Ìܾ _ïú»²©´¤Ì-¦ƒËIò2ŒUïz*Ý’?KÎ`ª÷n1øóïü=D—“•+mÆÃ†(Š.—ë¶²U–Å.—Ëår) „!ÄS/Vd½ë©q=•.Çqî»ðtpë]¯ª—I^ƒñÏô®[Ýz"OGuo/fôeª—Á`0î..—ËápÜv7§ÓI)u8n½+IR—¼%í»²´uk\žç¹B(¥îí¥«^&y Æmô®û÷bJ×í"æ„ÅM1[/“¼ ƒqw%¯Íf»­l•%¯ƒÛ¥A–¹.—ËétÚíö§ÏÖOJÔ¿F£a/´ ƒÁðErrò¾}ûÚ¶mûï §Ó™’ríÐѵkÖÐh4%õ®[õÈäòñåu:„à+ÉçÜÖ£Ñ=wþGÒ­0Þ(U ÊN{´nÙ‰ –Œ‡)k漢µzºC¸Paš@±‰kÅô®,y‡Ãá8qúlßÞ=õz}É ƒÁ(Bcüï$ŸB¡¨R%&44ä·?þLLˆóªw‹-§ì6ú–¡äŶÙòå«ÉH·\¼˜V¸&¹ìÖÀq\BBLPñ§-ë[µ(±nÎ9¸zÎÜõ;\Ïç õ» }uô#U´»7pÞîI^9Óñã•o73y,꺰xø€oàÅÕ‹E²µ0ïļãÍS½i§€S™*'6îúú×ã—oZÔÐäõÅŸwg¶ßr‘‰~ÕêÕ«kâ4iÙ,à|ç·îOs%éÔˆš®žýéêݧÒhH|‹/N˜äï¶Óçìûbd¯‹§IUtóòÈ–¡*TAêu[yeC¯N£Òjµ…p ƒÁ¸½äýV^9½Fåt:…H’$Ç,+¶ü§›²ulÈÊ̼¥ê%5(fÉ•o8/׊%ïK–#ŽC€­É{¾ßxUÛtb¼áa7`âÜt+­:ì•ØUoÎ[¡åÈŽfüöÕsãç'i¿þ(Û*`ó±í»/Uzzò„º&båâ*)˜Þ-׿ŒÍ׎løá< êX7H‰óÜÂçG,Èm9lüÌ8tþÇy³F³/[0"V-{ê`›ºþ3/ rœùiᢗÇ8毘X[wÏ-Ãr—Qlí Ù‘W¶ò*xŽ™x ƒñÆÈÿnå…‚—W•“–)•JÏ‘dCo9M_Ã’D‹ºÝ9vã"ÖÜv­;!X"ÚŠ¹ÙÛÆ=úÖã€Î3>yô¡7UR§9ÇÁ"šy&qà‚Ňú½×B{ñû%/j½u)9–mÇ`â€R}õæíš'j¹ oúäÈäöÍ #f‘¨þ³GÔ7ð»wÎòK¡ƒ¼3<^Ç¡¶Mª: _<ï@Ÿ™-ý R»á£û$j9Ô®E<0låâƒÃ>nÀßûzóêËëV½îXµ3 ÂùôŸ»^É ïôd›°âcÉK>vìlr^H«Nu™-Áø·’÷®dåt:AÁþÞXy%Œ® ,0Ïs7­<|ä/÷Êò¥ìܹ9"ÒXÂ^ûdjöÚ’¯¯]9þëâùoAŠ•ÓÚ=̽ ±gçƒ&F§ ¯7ªý¢ñ‹~¹¶p}ZíQ} Ò-X³l˜R¥û±BLî–;qÏÍ}£±\ù™WöoZ¸pâ³ÒçK&˜N\pê5ÒrB€41-ë–=™æla’[ *Xþ©£›×6,9ùw†«•¿æ^V^I_ÞbAÊœN§ì5ÅêœqX òO/{÷ãÍUMy¹G´o×!Ç¥ÕŸ/Úï4<Ú¸W›Ðâæõä‚©ŸÀ•z'uH ¼{o{ÔysϪË;™bÕL{§GÆâ÷ÓwžøÚÚF_|ŠÝuZR¯g+Âc‚ÕèŸÝ2ƒQŽpçUòÊKHxŽ)%·””¼*•J^ ÉÓÄë9~•‡/¯Z«âù3o¨^‘kÉnߦ³ R¡îÿ‰$Š›~üŸ—ékò "âëTޝӰ®!ù±–þ6ºUŸð‡Xób[¶ 4&5Œ Ÿy2bð²Ù_v£v³;„)™þZ°eZ1kO÷]xlX‡4ŒÊé=fÓšSÏŽè=_s‚÷ñ’`L_¡æ»‹SæV½rXDöZŨXˆÉË_˜´ú&)Ò¾¸:¯¿[ëÏÓ9V|ðÏdGÏhU©<¡”‡8€âƒ-%„PÇ£"Ötó‡éSÏÆ/($"®ù£½z4‹Ñó·m`ö³+§¿¿ñ¦„)R ˜ü¹”5»R,"ýýPÖSµ¾aó™=…wÔÃï¯×‡}v‡ üâ³AQÊ’;”~Ë F¹!¯ØPRïÖªU‹ã¸‹/æææ€Ñh¬V­!ääÉ“{—6òrHž&^Yïzݹ,§¯¹ÄÞý©A^‰Âî´g›3±ä"!@%„¥Áv›£ôÒà”¨C"÷'Tb7Û©Z¯BBL÷áõ—MÝ’5üíF!•^ ÖÌ|&y+@s.Œ(å›TmT«CkU–Ù{ÝQ7N‹¸RöÍbj†ª*ú®Kmç;nS׈¾wAz=? ùŠÛ «^Yò²*gT,(%c\d´@Zµ6æÑ‰Ïã½¹1›*$úMn=Òˆ–ˆ4],dõ­?ˆÓœ–íÄ„ köÍüœÔK'w­ëóî”~ ÆRßa×þ؆±²áKóf´ ââQÞSÃ:ªÎÚ?^E£Qò~©|h§ñcÅ}y1›*¬ØE!€ T¾¹";”rË FùŽ‘%Qåx ÕªU»páT«VMÇ¥ÌusÛw=õn1Çw܆2”¼¶|‡R)äÛòP (Õéôˆ– ¼ò…Ř`I´Û^ÆMÛ™•˨ªÄ„ùqæK{VÍ?ÆÕy¡iÐÃí°{ŸMk»ºwÝüÕéÕÆ|Ú "ÌÔ”{Šb¾ î¸ ò—)y–«vF…’¼r/XyÐWóF.jˆ8Ç¡)óÖüå2æÕ¬;6V@$÷ôÖ¥‹7íÿ;]4„Ç·ë3tP«h-E¾¾PJ)PûÕíˬÝsæFž*ÐßU¨¥‹z Ò•YyÐWóFõú‘Í f®8d9»f溆s†TS#ØÇ¥Ü¹ÀuèÓÝfèÛ¼ÿE·#›¶ï»Iòšöl®ÏÞ4ç›­'¯¦æä»¨ÒÛòÉÏ´ŽÒröó«ç¯Ùï2æÕ¬û\°|-×—éý-ˆ2ï£ÇÂÅ[;ŒÍ;»uù’ŸöŸ¹áÔEĵìñÌÓíªê8×Õæ|ó³×S€”}xýÜe[^͑ڿj«1¯oÀ¼˜ÿÉ&TÒÊ+IÒÖ­[{ì1žçccc $![¶l R(^º{0ò¡Üz·˜°.K_^Q:û÷ñÿ€ÂU0dWEÎÃND‘0Æ.o‹>‡9íôÖM˯˜%ÐFÖêòÒüg»WyÈ‘ˆÓêµ^%†6¾ÿ”i´ ®ð‚N©YV ‚XotoP˜Âƒ…í‹&Ž]Àký‚"k÷xíÅÁOÔ5òjŒøržnÖìµO§ÁqMÇÍ™8XŽ«ÌëcÖ®ôÇòÉí’ÂY³Ík Ÿ{¢Â„ŸöT½Åœzå/MÌÊ˨€š·Päò•n™H¡”Šx^Á9Î~;õµõ)#ž7_;¾aö4‹öó ýŠ»!PóÞ/¦|¾×*Ê« =Sºƒ“bª©×û…Iׯ½µÓ’ºs{òàêqJÇÅï|ž± i ~*^Q)P§VÊ­Ž ž'ÙGöœ¹âÄ *p䤜ÜüÙtüùèYŸ»ï¨°2 NdÔªHôØÙÏ,ãå ×1¦À•|b󗯜˛õAH•”uÔÇ)eßì×vb¢ UÛ³Ò콊C˜µ{Æ‘¼%žç`óæÍÝ»wA–³›7o–“| 4žöÝb×ÊuúÚàÁÃW®\lµz®1Š¿ƒ€N§4hxICÐôÅÙ_ îbâ÷Ðû ê[|µk7åø‚©üȳH4fü|ÊfUǬÝ5q<ÇÄo9´çû=3Š4n÷S‹ O_6 ‹\aÕñ!^ûºÃ«÷A/æäà©z}MŒe0*€â…k+žë¶² -…>9ó‹îî'á¬= 6\Ã8bðìOÇ)onž­Äñ 9=vÀY{üpcUÒ°·_ïQÍòÔ1‹ÏžûnÕ©N“êø:ɹrÃE­:ú㙽"*a^ʼn‰µyÆQ½^g¤ËÛÝSD‚‚‚|íì–¼%»¾l1e(y»uëÕµkÏ;• çÍQqÏŽâeÂówVÚnŒ{S=ÈGrÅ|Ћû,ê]OÕ+wF<{ØTû’ÂI/‚Z¥Ñ(ÍîWÚ©dL)¤¬˜8`%  é—rH[SÑ<\éçS)¥šÚÔä‰HyîŸ4¢ŽãÄôÛŸqÁ"&¢D¼u™âc pÕb¾a‘xNáµ›á9"‰˜‚XìFÒN&cJUuû>Z+€—ô-;Å->÷·ãÒ©¨àóªCþ·ñæåùÏ ÝѼË}º·ŒÖ2O&ÆÑ»^­¼`2™jÔ¨á¬iÓ¦ÿý·Ùlö•›§Þõž¬œ"6 „Ø@È`<²Á÷ŠNh——QaÙ¢¾¼ˆã ÷æ­‘ÒåÄMº¶‰(œ*Êù%ú+ypñå-ˆ´‚E‰ “âo‚^ß忈ùäÞ«”R0U Ó *ÞÙåéæ”ø°#ŸÀB 4ç¥Êõ0ÆÔóÛÌ­t\èzˆ(aè–$(’O‘S uÜÐÞ^¿níO‡Ïÿ¹væž)3ßPUÍ> 2þµ8ä8ÎkÄ†ØØX9ióæÍ”ÒnݺÉ~½ô±Á×xTÞV^ƒñ (ðÀÁ½6“¼ŒŠöà ®°Ëá6˜Š·FYUpPØ{¬¶àý¯®çÁ•sÓ¢ ,§R8­©©6ZE£¬T# þ¼à:ºæ×äÃ(øˆØàù+qå¥_Ü¿iéÜ¿ò …Ê»TSQäûŒ%Ôr‘ÜŠj^¯-Òà§Àé'.å‘0-%P(Ǫ„H´ëŒóغŸÿŽêž³óçó”RUtÍ`%’|ŸB´Z ºýÓ¯wêqɄ׿O½¼ë¨y@ÕÖèÿEõ–5äYh”Ò-[¶ÈwóæÍ>ú¨ìÔ[Ê å+D”çô5ƒñ ©^ð0÷ÞöešÁ¨àðÁ­Ÿî¸ñ­_²N,y¥ÿR…a‰ MÞ˜÷Z=-RŇÁŸ¥Ã}oòç“’Z é´aê¶Ìãß¼Øo‰Fl¸ÔP_×V<÷øJ…èõGLí_U .G)g_‚³dƒô¤ŠlVCù×qç‰O‡>9W)iÛ¾3kX¼G:ØbH× ¯mN=¼ðµ§!ù3p•>O50 ’ãóÎKk^šº-O¨q¥¦ BX´¿Às.‰­AÃø—z׫€$I+V¬ ”…„„ „ÒÒÒ–.] 5jÔP*•¥HÞbÓW½Ë$/ƒÁø7 ¸¤›/+FÅzL½šbé-ƒ)Eº¤á¼¹êÛm‡Ï¦ä87„V× J"Üñ¹Ñ)߬Ú~VQ)РVÐÄ¡ï½ñÝ·[Ÿ»a±ÒøGÄÖ¯j@Å}¥)Ä_‘š%R‚±BЦgßî Â5Ht80]Ò0gô¼°B+/õ˜Cç!GKÜšû@οÅs®óíÏÇRÌVäªRªÎáyËêøÁÓß üvÙ–ƒçÒº°øf=‡êVM%Ùm¤Äþ…©&ÎHŠ]˜ûT ž:ò¬.t+UÂî«MÄE$”òJ• Tp!D%‡Ý!â·¬P Jžç8BD—SÄ´XÉ=AJµJYpÁˆPÑåpa&xÿ«ÕzêÔ)½^ÿß³ºråJrr²¿¿¿¿¿¿Éd2ƒA«Õj4•J¥T* Ïór€„²]Š fÒÝò8æ8ž…¬g0<}Ì QÑ@’6©äfŽºl6—ûo„¨$:%±dˆè´‹ÎÛîé™;`§ÝVú…yϧø…»…"©Eî­Ø!"¹’«Ô[Æs÷|^@ÑS *9{¨w …Bá#NWŸ·ì²þc÷¶_~ÝLiaâ „n]ûկׄـŒDï2ǃÁ`Ü1:ÎÏÏO’¤òêU†’wûŽ›4n&‡í”¿‘º\®Í?­ ŒˆaµÎ`gí]½êddß¡-K,«]JÒ½†El`0 Æ”œœ¬ÓéÊÙZ†’×ét‚¯$Ÿ“ÿ¤ŒFSTdôÜùyÄ›@@©RPvêØ£uËNÌúËx¨oìX±òÀ>Õ¢„®-%éÞê]Œ™Þe0 Æ`·ÛSSSµZ­ å¦ýÊPòb Ûlùòp˜‘n¹x1­0ò°<³€ã¸„„˜  ãO[Ö·jÑÑ÷m‹7ž1äííúQß®|:Fõp ã¼Ý“:½r¦ãÇ+ßnfâo…ëÂâá¾W/©d¯÷Bý™ÿxkàÄßc§­ùäñ]ê<7¯ÿЕ~/®˜ß'R¸ƒZ¡Tž8M=Vç¾}Ò=i4¦z ƒq‡¸\®ˆˆ“ÉtþüùÜÜÜÏ?zÊPòJÎÊδZóàâÅ´E –‚P|, >D­‰²Ùò}Ç$9{f~oož(i Yqîõ ÎÞüÉêA+FÆkäåv€dlÿtÉQ N·J”*™¹üÀ™š™´cæœå§ÚM¬càÌ_¿Z•Úgéc•à·¦w ƒñp8¦Y³fÿ%“Õ«WWÉ+ŠRZjšËåB° ;wýZltìÐöBHNvŽ(úœ *^Û4eúÞúoL>ýSr Y®›AlLY=gw¯YåÏÜö“+æïC¡ZÈËÈÇ8k÷¼¾þõøå›54y}ñçÝÃ™í·¬Q„w}ù©5—}¹©ïW¢”¶ã˾üKÝõ“A Z|uíËÏÏÛʦè&½^˜2¬i°lv¥ý¾pæW›^ÌV„ÆW…Ê»›ˆÏ$1yíkÞsc0 ã~@E³Ù\®ctÙe%œ•™)ÿ. ÝzI ŠYreO†¼\+–¼¯ž ®K˧ÎÉèñé­¸y_²'pnº•VöJìª7ç­¿Ðrd G3~ûjƒ¹ñó“´_”m•°ùØöÝ—*==yB]±rq•˜"*Tqƒ^éûãØ¯fmo?£Ú†Ö[[N}¾±Ih@RqÓúèðÍý+>Z4mfüšZùó`;úÅèIkIË¡FÆ©2Žÿ´ðè ÚŒï$à½çvª˜Yy ƒQñ)SÉ+Ñ¢Ax;„qkn»Ö, (».­~g©ëÉ9O'èùs¬¶¨Óœãà M‡<“8pÁâCýÞk¡½øý’ƒÆÇµÞº”˶c0q@©¾zóv͵\ợìáôIcÞxlûøO_«ÒÉëõ^›Ù.X‰!¶U§XH ºúËÓ›Þp¶4¸x( IDAT©-{çmH­ìŸ å‹U–\(öì|ÐÄèTáõFµ_4~Ñ/×âîO«=ªo‚A: k– SZ°6B1¹[ޢׯј7:îšôKJí <&pbêŸËf-Ú¼÷|šÓ)ìXiq1ýL²hjܸ²šã@œ»®JIò•ƒÁ`0Œ{ yÕZϘyCõŠ\Kvû6•Š,fêþŸH¢¸éÇÿ•˜¾F²ö®ß—{yd­l÷¾ÔöèG[?máÇ=¬2Û²m 1©ydløÌ“ƒ—ÍþÒ°µ›Ý!L©Èôׂ-ÓŠÙs}oávIàImÓ$´@ð&¯™ôê¼N/N¡N½²nêôíò˜çK^'eúNò™ƒÁ`0Œò—¼¢KìÝJä•(ìN{¶9K.B(PB(Pl·9JŽùmßZSËAdOA×¥Åß<ÒáýOÕÓs±Ù’ØÍvªÖ«€Ó}xýeS·dD »‘CH¥¨53ŸIÞ{Žl‘E¨àË…ãêóR중O´W"l¬î‡v€R«Š°ìЮ˶z‰ú¢ÆøR’|åÆ`0 ãH^[¾C©òmù(”êtzDË^B¡(ÆK¢Ýî,9†7V®j(Üê”HS)ªj¨–˜kŒ8,PjUB€‚ÚÝsµ¹íUTPè´œÓlq²ÙD Uxbe´hÕ‚µÆ.IQº´«Ö‚‡?ÿTÕ _OFöm¥·Ÿºl-˜ëYJ’¯Ü ƒÁ`ÜÉ+‰ÒÙ¿ø 8ù'!„Œ1Ƙ"aŒ322\N§×L<üPQÁ‡Ü3•8­NPëåæ ï?eEœl÷æ R³¬1÷ÝŠ„Peà‡¯¦¿·pÁä-N Ti­eàÔqþZlúê³Õ §¬±ˆ¼Ú?¤vûêB¥$)|ævà8ŽÕ/ƒÁ`0*>¨d€!ÙÅc,Š¢Ãá°Ùlyyy‹%ßf«›”tÛ¹PÛ¶mëׯBhÓ¦ïW®\lµz®1\¼˜¶hÁAŠïƒ¥aǨ5Q6[¾×˜öØn±Ñà>ïLëªDœ&¨ššu‘ŒûJ0þoòáÁ¼~íÞÿ¾ Ûþ·žšrÀ u&¯{·©‘C¶ _ÿë¹4+•_TB»A£µ‹ÒÎrµìühäö 1FÔî8xâS-¼Z±ùäæÅó7î=“*ÃÚ|vhÛ-G­'—OûpÓͨ'ßz£Oœ®D¿Ag¿ûäÛóÝßýxT]?Ùy¢mÇÇq –çÏÛ¸ÿl: ŠmüÄÈQ½jùñgìœóÉÒ¿.§eç».8®qÿçF?V]'Ç¿ºtt×eê¼¾òã–š›Þ}}Ù‘›6¬4FÔlÄ„ ¬Ç$ïô¦oæý°ÿÌM+ï×sê;#«”8¼…põ—of}»ót¦“ª‚›=ûÎÔ.ážË8ãÐî«Úzcãt†‚’y&h9Z1ïBÕºeÈš¦ˆµbUìÛƒÁ¸ï%¯(Ji©i.—Á‚ ìÜõ+-ª:´}„’“#Š’×Lˆ-;Ÿ LLJL¬$(c¾Œû1yíkÏÏÛʦè&½^˜2¬i°NÛöñÛsw_¸™au"}hÍ–C_žÐ«†GbÖþ•³f­ùó\6R«ýð—ÇõŒ3Ü×s}'/>Î OŽçyžCJ”w3ͮЛ9ûÊáõïMWE}9¸záÖÔlA ®œäCëÞŸàüpá˜Zºây;έxuâê #^‘}íè÷3_ÍÑ|ýZSCê_;gZqÆŽƒYOÄ銿oƒíôÚŸ®)½1°ŽI(¼¬ÂþÅuñ»×'}km<`ä›U¹K¿.›÷ÊŽ/>\U…pþ¥#'ÓÃL«É»ºkí²Ï§)"Œ«Çu{cZç%â´a:!S­.Ã'õ0épúáu_|÷áWÕ¿™ÒÔÄ#ñòš7Æ/Ë©ßç™)µ*Åb -²ž‡ãëëf|¾CÛǩơ Kº5Ò¿È$>šqÿUˆî­‘¯Ø[žÈuqe½ !,)^³æðélÆ‚ø0Œû^òb gefôÏ ^Rƒb–\y€É˵b {ÍD²¦ç#¥hµºMjÖ52îKø€¤ã¦õ Ðá›ûW|´hÚÌø5´òç±õüþ£©æ¾’ Í»¼}ÙÜ÷'(¢×¼ÖÈàú{á¸çVkû¾8cb¨uïâ™ïNà"W½ÜÈø@NpW'¾°xËó.«%ך±ë—–žOÙ2g@u?9ÕØñ½ù¯$ ×6M~vþßi?¯=:¸fseÑ·âì?¿^{MÂOÍþdpœ"õÇ)þ>³cõQ:Gu98k{ZÄ#Ô%‹NʽrÅ¡µ£J¾Lм£KÖ&÷šõÆÀêµhã=þ»åGºOkâ”j£ë·h¯Fꇧš´{ç•gëVPDV«) ‚žM_µI›ªP#ðÚÏo;–&6ñã¬G¯¾ôÄ'ÓžŽ-øª²?Ü™œn!ºZõ›6L4ð%_ö±-5‡h¢ƒÕ¨à‚Kæ yû+î]ð~á~p25W¢¡JfÆ`0÷¿ä•hQ‘zäØ!Œ‹XsÛµî„`‰xLh+2ôˆ6dTž> ë PUiûÔ„‰OµV²’q_Áb[uЀĠ«¿<½éà gK“(èª6iÓ¼––kÞ8"uß³;~¾doPåðœïRj_=¾{˜ARxæ}—m8û|Æú © þÛ5ËÑïfÎ\}4“PJ¡Ÿm“häEjµ’ç5ÑÍÛWûæì9çõ‹9bóà"¸n¿‚)…”å|‹(Á„BúÅL‰V iúÌKM(Bœ×‚#˜Ràx/ŽRbÆ™ËNCíF•Õ‡€:¢q¢nÕ©¿Ó]MŒÜ­»F©Bª¡ŸÓr%ùePMúµóVþrðR†Óò¢Ìu`1ãô%‡¾v£ˆ‚Ì‹šÜ‡«ª?Þ¿îŸ½ÐöñÞ=kk*â²KmU¾à‚½äéªÈwÁ«üÔ`·80ë Æ y%Œ® R Ïs7­<|ä/÷ʲ‡ÃΛ#"€%ìmìD¦Ö3~ø™RWöù}›¾|ÁøW«æ=Uy1î'ÄÔ?—ÍZ´yïù4§SرÒâ %‚:,.6Þ´`WÚ©ËNéÚO6ý° ­L4©6ú øã?6EÛñù3V±ÐÈGžî^G›¼~Þ¦KØ‹S?Á.‘Ž+!P‰äš>Ú¦²ºàrxCm!@Àù¼@…12\€cß°“p¥W:*RI´ä|Ä«”€EJ ŠÂÃqK¼öÛÓWZÛŒxedÍ@’²ùÃOwÔ'¦€ç­$=ý¾„˜Þ35>´íûuëÞ¿nÃà>ì_ýÖÄ]¤6ªÀeuáRó¬¸wÅ<'¨ jžu ã¼j­Šç zÄP½"גݾMgA¥¢2Äý?‘DqÓÿó:}­ÀPßvÈ z´Ë?ïIë_-J`5Ǩè‰BRòšI¯.ÌëôâôêÑ+ë¦NßîU™(ÔJÀ"¡€%êæ¯6>Që8Ú€ŠÂô¿I^lIN¶R ÑõêR?´tó¥ü’%i>¾é§dJ@_-!@H¡R€ífªÔÔª‚k†Ãîó`µ…´Ø+Þ§bÎÍMXˆIYÖ~»3­rç§{ÔñR|úÄžmM{·-Ýød­A±E¢À(ƒâ¢„5'Ýt%VS#âõ§ò”‘qAB’[áUlf;¦T.çõ£—p•1ƒkª@ØpʲXTV¯¬üþäÁ®Äêjwñ•8BÕ¸ç‹ ;´ùê¹W6n:×s|’Öí  ñãmYN zyVè»À–ð Õ+˜ù‚Á`<’Wt‰½ûR ‚¼…ÝiÏ6gbÉE(B€JJƒí6ÇíFVć䯖 FEGʾtÓ†0£ÂqöÀy)vÒÈ'Z‡+6V÷C;J=RT#Já¸t…w¯¦C·žÿŠyŸÿí²xÿê5üàRö•…cFí¬âï¸`+Ö¼-?¾öÔât`L¨¢ÖSuÂ!5Ãá÷óâ៛¡ûfZãö#»¬{uKæñ%/÷YªPrX$Bó·—½ÕPueãÜE[nb¸Üè‹Q%ÖiCúzCžïtè¥ã_8ûD—fq‘|ÞÍ g®GôÕ¡þÐ^‘cV¿ó¾úé.Uàү˾»1ðµÆRjA”XMX¿cå÷ ݪҬ¼fm‚ãÃà» ßþ`h_+B“q½PÊ#S£¡‡[÷Ö›0ðÑZ!*{–=ªUÛ臜ÞrˆDU©¤S\±m`‘˜HW½q$]}(ÙÑ6@‡¼çY¥âÞ…+õèY[¥&µ™•—Á`<’×–ïP*…|[>J¥:QÀ²·0Î<ÆK¢ÝîôÍI¼¾uéÏæð*ÊÜ+ûÖ}ó—XctËP%«6F…Ä~rÞÔŶ¤‰‘ê샫æ^„ÄIõM¼:<±2Z´jÁZc—¤(]ÚUëmâ–q-Æ<>tÕ+¹á½UÖ82®æVy¼GbÅ\žõ?aS' {wŒôåš?N§^8•J‘ÊQ½N=”•’UO>~ùºÅfu`LݶO{¦}¤ (B»N|!ù³e?ŸUTòS"¤iðÜçŸD,\´åðÙ”æaÕByL€iØ2þ—nF¶ª¨ð¡¸›¾4÷³ºËWü°oýçë-(M ÍŸÕ¿÷±vþ¼æLͤ•ª5þÁ³OÆ–‘35õB·­üð-§&¸ÑÀø6O<1u\æg+W¼¿ÝE”úàšò šø¡3gúÍ_°eÙ»k­DÚú¹¤VUBŠÞ¸Öù?Vm8‘å¤T])®åØW{W-âÐ¥jÐ<|á;.ØëÖÑ!ä5ÏЊz®{vß0Ök!0#/ƒÁ(? -1dÉþcQ‡ÍfËË˳X,ù6[ݤ¤ÛZ›¶mÛÖ¯_?„P¿~];vjàP8›“þŸ½óŽ‹âxÿøÌîíUî&"¢¢Ø{ƒØ{ט š¨±—cÔ|-‰-j¬hÄ®Kb¢‰Æ5Kì]$ØépÀqmw~ÜW$?ïày¿òÂÜÌÞÜÌ3³3Ÿ™‡ã8ŽcY–eYŽãt,˦¦¦þõ×¥¸¸c4]ü™_°û‹v_x¢"|GÏ VýÇÐÂ$`‹p¹wøvÅž3×_*±Ø­v³^“§hé!ÀœòáO«¿Š=y3Ma¤ ‡.] Ò=Y?äýÃᛚ^_La’ybT×/yKŽmj'ǺôË߯^÷Óåû/²uBç€vV~Ñ¥FîÛ4,:â8–eu:V«U«ÕùùùúÞ@¡Pdeeefffffzyywéò^é'¡ ïipѶ1B8b||1Æú»„3:ÕcŒ×ñ" “)X)UübýU˜¢(+ù#„#™|×8cSE[àô{ì óO8–+øT”eýo/ZñTŠ2\Pà_Gˆ+tWWì«…í-õØg¯ãOÜñe{ýA¹æÒ´ÅRÜëß|<÷N÷5‡Ô‚sxøsâĉ¤¤$''''''GGG™L&•JÅb±H$ Ãðx<š¦)Š2èÐò“¼GŽÚ»w[n®± lô#E_‘H$C†ŒìÓgIâ†-ÜVº}°¥)O#qP¤:Š·ccQÇr›•%š¾ÙslBòÖðòîú_$/P†(ïm;ãlÝykg¶pâÙM ¨nŸôÉñÚó×OoUí€ “¼å¸°¡G~ݺõ)åÅú ™ã‚ìÀÀ˜Â´ùpsí¸Dh±Ðô7"®3ü‹1ä†È®8¡«‡˜Ù'Ìô.J9J^Œ1 ƒ6@9A‰zG »zù…E~‘ú!xa@%’¼@ù HLAžJt=H^É 6Kù®åÕÁ[¤¯)š¢@d@å¡‚OO›“¼ž?qòÔQB $/A Ÿß£Ûà&CáO¨Ä¤¥¥Ý»w/??L¼%B¡°nݺ®®®¶+yOŸù%´E8Ƙã8ý©öæè¯ûÜÜ<¼½|¡  ²rïÞ½:À“­püÄñ÷"À]2¼3ÉÛ¹§¿wïž‹‹Ë[Vh9J^µZÍqì¿Iõ A2™£w͘ÍËt:]ÁUÂð™ˆÎ½Û¶Ž€Ö •˜ßµ) _ãCæ{¯•JõöÙ(GÉËêX¥2O¯ëSS²’9Ž+P¿'ÄEÕ­ëëê*ûõØmZu¶`¢z~nçÖÃî<~&ê¿yÓÈÚhË€­“wyN—ÉGìÚ9ÆOP×»¾å=P†PÕƇÌïrD@D?.¤¦§fçdÍ{Z–§4O.“»Vs-ç—r”¼:›ž‘–››‡JHHÞºe;ŸÏ/y «ý¡Pä£TæTpIÔ‰?üoÒúû5"zöùx w ?/ô.`·8DzWUû\llŒ1T2¼sÒ2Òt¬®SûN2©ìBV‘£¸xébjzª›‹›H^­V—ü:Y£Q!„8ŽåóùgÏ*Ñ;µã¸ÌŒL­Ö¼äW?Ù?ï»´~k·ràa /+»„˺·zeÜù;ÉÄ=¨ÕÐÉS‡…8Ñ•º%Ã`c;P¦»ÀøyàÝ !”¥ÈêÔ®“£Ü±4ßËäaÍÃN=U†½å»°!=-­`üC¡Æ!MKÌäê‹‘£Èeu¬9¡qöÛØ;*÷¼OûÆ(Õëµ2iÒÀº2T/`O¨n0z‹¢õ¨)Ëñ£_6­;1ç–ÑÂJ¼àÛS0ÝƇÌïN'“ÉJ½\./Í‘¼:RüÞk7®²l±Üwh1buœùR©NÝRË›¼7z`S/~ú•=+–M‘XÙâ°ñ—syî'÷,Š’P¸}¨Ÿjhô¶M—.oíTyßYÀ`cCc?¼áãC曩—wøëå¹–—eù­ÿš¦~:²÷Ÿkz¦Ð·Å³gzyËB¬ŽE¨¤!¸üÔ%òîÜ+¢E5Fõ½Tú,Úw!µKßê h^ÀNо¾õX-mÜÒGLQ#,òmÝXºãúídu+GQ¥Õ¼á0‚»Ô& 0UÆÕ¡KýsëÖ¿=‡Mêî-€J®`ãCæ«@æû“¼B±€¦ Ó¼n<Ìf=z¤ =üù w[G—ñä•I«Ëx|a½Zü×â_¨Š1Fšg]ÏáûÖó¨ÔgíYl¸ôc3ƬÓôYòõˆ`iÁ¢üçË‹R?ذº—¼À)s,îãa“š:nS‚áðH#ü'}7±šGuÏj" !¢Jصpñ£~kÖûŒøÄ0pYû’®®6±xÏÚ0í³=&ô™»kv#C³Ð>Þúɤ“õ—ÄNl`Q \ ÛU97k™ç²Ï-™¾ô¯4Añ¥.žA-# Œhèl¶û©¸<›í-×ò¦ìýº#Ò>ûõë©OY6³£;¿²t•g~?uõŸ+„ŒŒôNË×?C9J^ežŠaøyÊ<ŒA"‘8`‚Xý/Çq!ˆ°,Çê´ùùj3m‰_»ÿ°ú»W®˜¿Šj„®ÄÆÜ“G®káZ€M’{ÓÜmÊVÁÞÂŒ+ûbPðô&Ž4Åýd˜ï°í³æŠ>î€þ²iësŸèÅ¡òJýäfql „cY]ÂÁyË\×ÌyÏKÿ^œ–cYT¹`qº ;…2ß3G‡6éÇUß=¨ÿñ´n^|Œii­jÞÎ3wÁ¥—·GŒk‡þ@…•‹ñe”¼%±6QJ8Žeõç05 ²¬a„· 8ªw™¹ø=C»z‡™×*RÒ´ž}>ÛDÆ)Óÿ½vlÿæY—ž}ýMtˆÜd{|æÙloÉb½Eµ¯N;sý½:c¿žÒÞ•©,/Òôz7¤a#Œñµëÿ „ÊUõ–çZ^­îÁý›ÎNÎØ¥ÿËqœþ^aYŽãt,˦¦¦jÔj³Ùóî¿l“jùŠ_ÝJ{G|31ÌllŽ¥ª9eß¾hŸ‹Ýj‡Ž^;½§#$¬3zÝ&ɪÕVLI!na7L$¢ªæ!eúðjõ«ÝØ´`·÷7Öu °!Ð0i¨{qdÉÜÝ×_+9ž´FãîQ“7®ÆÃˆMû3fõî¿ÿMÎTj‘È£aç¾aÔµ“\MÌÂN¾-úØ3@ªï´™×o‰=r5!‹v l9d܇‘~’ªÜkXžîâ¹øWC!•è<%¹× i$Ä!¬KÚõñô“Mo($!ôtçÄÞ»0B(xÖŽ%Í œ éµMqƒ÷á{UÛàog|åµï|ðÞêõÃk 0FÚÄÝS&¯·dã ÌÝëöþø2=WËÈj…öõ~dmƒË§ ¬M”’b7­Ñ½!D—úgÌêÝ—’’3ò´XìÐ|иÑ]jKh]Ò®O Ú…—ûð·±?_¾÷<[Lj=üZ˜<&¼Ouç›èùú®^3À‹‘îÕϓǬ¹0fF1¥+íÝm=óˆ$õ ®çHcÔ¸Y‹Úêè9g~~4´AˆæêžÍ»þ¼û4%WƒÄ'|óeÕ¾ …÷Bzéz!KXæåÝ›Œ_ØûƼMêzó¸úúiò"‹j^ž^3cõõZcÏîê-ˆb®ÒÑÍcç>°œ qößõz·s§H½L¼výŠ¢;´ïXNª·%ïˆÑ{÷nËÍ5ö1͈‰døðhŠ¢Ì¤B;5yÑîá!„0¦(˜álvps¨Ûö–¾Ÿš¶QsżjÍF,Ø9Œf(ªÒ¯Í±>RRž]gäòÅÒeký—ÏhíÂ#‘‚·åËëE|0¥»“„K¹vxã¾obj¯ŸÕBN³y‰×î¦zš:)Pyçðæ7Üto;tðÔ¡âÌ‹û¾‹]æ´ö£@!…Õ÷Í›ó³¨Ç¨é£Ý•Wã6­«oø¨¡´êj°Ro]'‚0Fˆè'㹢Š®ÝgÎîìÎÇXä!¨À“!„”4øºùسjüíŒ/ h[ùãêíôA~ÕÄ)üóš8қɻzõÖk?ò*Ÿ_ýåÀÚi 9k ¨)À¨¼ªÀZæ‹t@¨qí IDAT®‘ä%Èp#ëïÖê'÷å>ûëÀžõ_Ò5bÆ5ä·+í¿æMÛýÚÿ½GÔ¨ZwðJbî¨0gš–3L “‚ eŽ#„¨•úî¶žyb\„‘˜‡´*GØœ»ç.=­ÖoÂGõ䜒òs¢ÑË¢<—¶²Ô‰)Š'î ¯ÇüiRׂ‚þªžŸXõÕ†[µÇ,œÝÝÇ wÍWú˜ÚfÀFwW<}–Ô´I³öí:êå_§Ž4M?}ö!‚½IÞ=úuëÖ§´j¢,‰zŒ)š†ž°‹áÂ4‚füÉK´s‹Ñsú}þéÚu kÞEn4c„°Ø·Yk_„ªèüüÜ´Ó7^kšI…„#„ˆ|6oTGˆë»'ÇòƒWÇî›:P¸žðÖù¯þ¹–¬ ðaroì:ü*pôº¨W£º®é—Æú-adpê»ó¤ªËh~®°*ŠD-B jøÕòb0ÆMÑå\¼Œ/jÌÿæìÌn¼ÄKOq@W?Ê%„ˆ|…·¨#ÄMC[øã _îÛ{»Ë§%Êòª‚R©Æ’³¼„ Ãþt‘OHXÓ:BÜ$Ä#åÚ¬‹gÿUûµ+.çÆŽý‰ŽÝ.$¡0R;\Þz0˨Éä3*œ4#\îõÒ—ô ™'qZ­Z•§S¦'^ûeÛoétÐ0?B!DìÛ$¼i!Fc¤5¾JÕ ñ­vbÅš­kcë"tûg÷•5-›ÕµPï"b¡£›VÇj‚6ÆûÃG"„ µƸ}»ŽŒ©rúE^¹Þê4hU¨’¼irˆ, 2mäíY›Vþô™wáÊP‚t©—ŒÝúZbºŠÑ*ާP³E«~kÏÉÛk²²õÚKàTCŽîg*YŽ#©Ÿ©u¯Öë·Á°J˜ã8Aj>KDUw–—*ê"•¼F¢£3y†8 ¼Ì/êT—ZqæFFÇŽ²çWh¼úI)”cÔþ1%©Ýª®ðØ“‡©ÚFL¹UÕå°™J^R¬Íæ–ïæW ŸJQèˆQ»Ò¤ÞKRK„ù?ªÑhWd¡ú-ø«IyTú’ZÍhâ¬ßØhé¾ãê×±– íM™êF„ìsû yÍGè;Æ»×ä.OÝþí¯CDÁÚG½?¯ÍS?¬ãD^ÿfÝ_ÈhëTÁ°CóyitG…ÍЈÓq!˜Õ±HØtüÜ‹VK ªIé*|lZ)<¯šLÙ³6ÁãMIÆ ^æÆÇÁ x+O]N ˆ¿–åÞ¶¡3JÊIBó(DX–+Ç*°–yÌwà#MvŽ–#Äð£ºÜT%:(ñKñà jβ,¢ \½’Ö¿êa(¤Éײ„ðŒÕ5«-}Iß¼Ù§ÿìBœ¤rGçj2!¢0"¦²½Ä½Pš^Hû¼T˜•º.öáÖjÂîl\¼~áœÜ™ Æ…»0Y¬tв–`•$/å y9bþY+|IIB´GÇ)£þž³GÉ_BGÔÏoýËÖŒÑ̇Y‡šRô!ˆ#úë ¯Lõé|DFÿO;Öò¤ÕOÿ%®½ÄFK¦ Wuû|Ã^k(Û9b0”±µ1ßA€ò3óu,ÇÓ®A/ã#,oÔ«½lѯg®7½˜^½}˜]±ö´¯ÿyÇó¨åD•cXË<–úx‹É•‹w³ÂÂx!’ÿïÅ{JÊ£v5Š “»Õð×(œv¬Uþùîõm>F¨pK$Gåà.C™‰¯”:> ovÚѯô%µ–yýõ’uêÔqä¤cXíPÜÎ%î…’åBf{!Ué:1‹u]Xœ‚ö€Þ“¾rÍ[ºüÌœ£;Z®td-A¼`Ê^òZ_EW4¥E»¶ÿ(êü´ 7 ïý·wtèhÜ1I» OaÚ ¥Ñ¬ˆÑ‹-4zóˆå‡uu›utùWÔ€÷¸ 5¯r¼;t¨Ê›©°Þ÷‰5Ùen–·ÐÚtµºµøGþ8p¸N_’‘ëÚ¼½¿ÄMŠÒo\¸ú¼z¨¼¬ôxÏãÄÁ-OuÕG„¹3ÈÐè3/üÞ»m=gmâ¾rî>¡¾£òkóV3/¨Ó¿W­sû–Ï_?°[/~ÖíS‡Ž§9wŸÜX®_oj|·’‚ƒíŒÂ±¬ñàÎÎ_ì_ºŠض&“qïl|šœ[X[¯Ýßo]³_QÇ™Ny¢øïw·µÌ.•0½¢xÎMBJôBÄl/TÊNÌr]›ä“Äs‹žóIÖçë—­ôXòy/˦°’à;Wœ4O¡PÈåòR^¯P(x¼²”© y¨XÉ‹Š¿Ú£];ŽzzÊ•^òzuŸùQÚÆƒûWþ¡A1—:Õ%¸pÜ1D Ny(þæQ8bÁBùŽ]§¬:šÃ å5›oÑÁߪºuQÚå¤ Jõ3E6¥dÍ¢>ŠüvÏÁUK4B—Æý[Öhý~¯ ëOl?Ú(: ^ÆÆG!^޽êÜxÛ·o¸¯@ñ"J ¼ñãæÓX¹WÝ>³¢‡ÔcTŽmÞz毞 ¾–ìÚ}ü·í29©‡oȈùï÷ª+.R¼%Ô )Ž…õ>øòSá–½¿nú:›qñóáã¢%^=gÌT|·çøw_`iÔÙ·A€ŒBHPú’Z_Ëkú”Q…JF•(K)z!^é:1‹um)ŸŒG‡ñ“Í\²mÍÏÁ‹ú[6…åß5r™üâå‹aÍÃJ£z Eü¥x¹T^†–™i…Ël´Z­J¥R*•999ÙÙÙyJe£7þö‰'¬¿LoaEÑæO"ÀÆ«Þ] ˲:N«ÕªÕêüü|}o P(²²²233333}||"##Kt 'Nœ µÔWŽåEÛb]<ŒŸo_tØáX‚Œ>ûF±4õ/õÛ®0ÆUülÃç/Ÿ{yz½¡Æ9ŽCÈøÈbÖ.ª’‚ê „#E߃—­ñB$÷æš)+Ó‡­˜×Á…‡Ò>Ý3eÖéF_®‹ò`ýé0ÅÎ:,*xsæ‹~cŒ°Q–J¶Ÿ‚´xxÁq‚°æQÌÄÿÝŽ\¶z 7‹ÒÏØ©”%µžys½Ùœ— )m/TšNÌR][Ë'á8NŸ¶l + ¾+Y ýÈ’šžš“­ÓéÞø'—Ê]œ]ôºñîÝ»¦cMRR’““““““£££L&“J¥b±X$ †ax<MÓú3Á0Æå8Ëûçù'O%„-|xbøüÝ7iŠÁc0TvÑleîÈÔugñ0}ïd’Ök-bî%ÒÔÀøÍ™©”bUÁÞiãëŠYÛ¸J 6Yû¼ŒŒOT)Ožçr¹wl>'î¼(Ôɰ¬Pûa#íWü*ó*(Mæ‹ýj±[°xû)¼A‹‡µ,LaRb´x?P,üÍ%}CæÍõBfs^2¤´½P):1Kum5Ÿž2‰©)¸ü7'øNÁ»¹¸¹Vs-ýõe›r”¼§ÏüÚ"cÌqœ~ÂH£ÑýuŸ››‡·—/t…PZØôø¸}·½Eµv}ÛGv6åäÊ%¿y~²h˜Ÿ°<Ÿ¹á?<çU«Û~Ò¬þE±šlö¯d-Çø*Òì-Õµí$Xníê]ýt9J^µZÍqì¿I Û³Læèã]3fó2£9mŒaøLDçÞm[GÀì/˜ëÈ^žÙ½÷rß®ï·z{É›óðâÅ›a£8R®§"ŽpÁílPÅö–6o|ž÷ॱ‰~:â€x^ƒWo„( m÷¯L-‡ï³ašB\™0`ÍÞR]ÛN‚•Žr”¼¬ŽU*óôÏ©)Ù ÉÇ=ÍC£¬[××ÕUöë±Ú´ê\BòjŸî64æ [¬Úš,þusGGX*Ø2\Úñ ý]kÒ›úðË ±ÂDÊÆ £õ“ʘV´`–×ÎŒoqå‚É ÷ÊÕr0¦Ê°|öÑì-Õµí$’·”ètlzFZnnB(!!yë–í|>¿ä5¬nTô‡B‘R™‡LbžÇ{ 6çsúݫ߾žû“¬e-!L¶æÉáík„Ü{îu›ÕС >¡Ak;PÕƇÌ@9J^­V—ü:Y£Q!„8ŽåóùgÏ*Ñ;µã¸ÌŒL­ÖÌö=Ìw jèbǯ~þî·´É+†ù àÐÀ¦Õ^îÍ_OZÖñø´MÛ.Ž^Ñ©`9‚6éÀg6]z™Ëòk†ö›ôŨ07FlúùMË6žº™ø*[E¤¡³·­éåÉh“ÿˆ]¾þè•„ žGÊ$4Aå]œÛâÞ;÷Œ Qq¯Ósmµå‡øžš3±4)w)º9Åõ5M:àüÉŽ•ƒj—õÂ^ll˜åãCæ•÷†ô´´‚ñ!„‡4-1“«_É£Èeu¬¥V‹B$çêw1—äýwô¬)€5 €MÃe\Ø}škóõ{ƒ=Zoù|ωWí†y3!„hçÞç v–°¯.í^¶uÞò ýKÚ8ÑlÖÓ矸Œœ3µ‘#—KºðòúÚ±Óp­£¦Ž ¤Þü5ö’ „¸nds2þŸô1A^"Ù·Ï<¦ë –1‚R¦ŒŸnIõ¿ûçÌÜÍõ]»°_írØÈ–¯Ì‡·16EQJ¥ìƇÌï Ñ•^òêHñùØk7®²l±ÙÜm#0F¬Ž³~H›îåñ 'Ôá_ ƒàlÝËc{®:D¬k*çIZ íâ8îûŸúŽ«#¦0B”4 MDB¡`×§'G¹òRÝÚQŒ"ÄÁ¿e‡–Áb !ŒIæ¹M‡_׈ÚñÕh…QXõ„c—¯`„–5èÚ”?÷ÄÕôÁ5<蜻¿ÞFÁ3CäÍ”.e¬Á!¤}u|ÑšoþmýÕæñ¡ÎÌÛÝSæçQB„ÀnT!tûöm[˜t/ϵ¼,˧ ºž¦©ŸŽìýçÚß…ž)ô…?{ö¨—· !ÄêXËûr4O~Ž»-j½®¥+ÆPÀ¶Q'{ìÙgnÆH4°wC‡¼7rV)ÆHûúÂÎU[Æ?JVR^>Ëd«Švã¢5)÷’´Ž-ZÔê7:àËõhHÏýõŸôî]%÷Ž_ÕÔ™ÒØ‘‡µ¯Ï—*e=iGæ-b݇m™ÞÉãmßšÎüžè‡R@¥•¼B±€¦ Ó¼­C7Ïàxë¾-d]B|$ÉOs-®l²Þ÷;c 7fP˜CþÄ\TämSÞxx¤cÔwßrò®1ÍiŒ¥N¹ JèÓ}áòg~¼zæ¶z;>ªï@ÿï.ªìP±âq£ q¼%œòÙÍkO¥ Ãü¤o°Y鯴*qÑ*öfÿø+皇„ˤr³OÈO_$^ºv¡S›®U|)Xɾ%¯N«{pÿ¦³“36@éÿrÇq,˲,ËqœŽeÙÔÔTZm!Í«[Ï9Y“9 µØö8”àoeíÚz2EkoãÕ¾[í ëâ~Õ}ÐÐ¥³R¾ŠÝ2ç˜ÂH=úH-4kaà¨õÛ×ûÅþl--troÐÑ_Ê3$+ªÛ¯·Ï¡XM÷ 0Fˆ_kX©S6h^„(iÃèÅ£ã‡mY¼³ãÖ±¢ÿߢ޲ÝOjÅãFY:ãxT6:ëî°Ý{ý¤tY]Yá-5÷Á/Öí>~ãy–†‘{Ôl1æ‹[¹i*AÑlöå÷Qƒ¿yÄš, šóÓæ~î¥~š³7û3<ÚÙÉÅ’Vswñ¸ŸpZXɾ%ïˆÑ{÷nËÍ5ö1‹Æ/£{^"‘ M™Ÿ.ÔtèòDLÑpV`ÛPÕº|{&’Ptñ‰žÏ°}† Ц1 èóYl¯YEÂS…ßoÜsc‹·qL;60{K¿¢¹]ýµzø~£]ˆB…_¡Ä¥M¹Xˆ°Î¨—’ùPïJŽcK¹õ¸ôWVhþ³þZ4qÉo’6£' ”jR“î? ÅTe(šÍw.>[YSÁ"¤IØûåÊÛ§Ïï_K@aZæïøß¦kíËþ ÃgxŒÅéIŒDB1´°’}KÞ=úuëÖ§´]EYªiLÑ0‘ØÚ*¦ ‚±ù+,„b Ó¥ý¥R§\,¤¢n. >8B³7µ(³ž;té—ö®ZµÿÂà ڽ~Çè™ûJi”ŸpdÍ¢-¿ÝLQ¡G»Ék–öñâ› 4Û÷³_G¡Ä˜áá›2ø?—<;h¡t%¯t¤Ìæ³bŸ4O/\Qˆ"~þqs)"ÝI‘—Rû.šÍw|ºÍÜB(_|Fˆª7l,¦0BX—qiG ëI²~Ÿ7ð‹;‘kvÌl*£µ‰Û?ŽÚVmÖ¾¯»T7k65Ãðy<ž¥!žÇcx<´°’}K^Œ‹Fzª0|pXô¸±eÆ¿†ê^ìÄñqâA“NóÈß¶|ñTÊ{ßÌFqŸ-9.2mu/^æË_g!m’™@ :Ýâ•îý/íéÉÇØÁKJal¡t¦WšÏgsY…*CÆ¥¶:|åè_ÏFúŠ(T|Œµë¢ÙƒêÕ[Ûð·à0? Ök7yVëá³o‰Ø9ÞéÈ☤&³wrg0ÒšÚߦ ÍçYs ÇðøÐ4ÀJö-yB–|p³ã-xÜ@\–Å(„Jú×@Šs¾VJÜ”^ÕŒB<Óþ´óðƒ Áü׬¤AX›ð9éå«0h+WŠ\}ƒêøò N;¶èa¤ø•Dñ—Ù|6kV¡§ÑО=ι7cé‚~çw´êÑwÈÀa>âÂÉ ».šB—-XϵóŒLJ}9w¡Â!>±Ù¬]]«ó) 5eË0 Ÿgù•=áóh"`%¼TÌûàÐZö¸a%Ê€‘ uÊDµîù’aK ‚c9Ñk%Óy`Tó3+' y9`øþux ÍšÅÊ•¸ VJgz¥ÆB>9ä@Uhujõ˜³¯Ã¨ë¿ÿòá؉b›Ž^þMTYe(š]bÅz<·N³¦üÒwÑo¯ëN[éa¼§xMÙ¸˜c¬¾²ç1 ͬ’û¼I|pXó¸a9ÊVÇ!aËÙßN z©»;3"×᫵ºxtÏ®ÝsFíÞ7fㆨ ‰ÐÏL ÙÃf¯4¼“&…GGX,É•–òùŽ]ÃãP£YÑM» ¼ùãQ[ïm¿ã#ÏJQ4{ÄŠõ8Åã«Uá8÷ª×°šlÖþ¶.æø4E[sMó@Ì•*x |Q=½üH0|Lß¶!Aõ4ô—:u¾{ýZüœ«ç•&{Ï­D™*\ëøðTO°§_mÿÚúÿüjHyaÌ“Öj5äó {7ôv¸wðž’óæ…¡™+i¡£åeä³ÑX*2¹Òr>ß S-«Û¦© I¾Ÿ¬ETå)ši‹Öã2/¬ùò„|tÌwkß_³ð‡ÕĬým>÷ÞؘVªÊׂú#x‹ô5ESˆl¨ZXò”aÅã†ug%Ü[àµïÓiTtÿæ5DªÔ§ŠZ={‹Sþ<Ïùú»‰5/¯$äWé^ýah­Ù+@áÞc±{  iŠêm#«[ðbre÷æó)¯Ø-^ùw·.8_§AmwÎJ8»çp*¯a_!æ—Ìp„½Í^gž,4`YþËNJÇ|Ш>3ô©›—o¿¶WuÆŒýmÙÒ ÉW)Å"‰ùGbµJÀ €•ì[òþyþÄÉSG )¼1|~nƒ›4÷!P…f/,zʰâqú3Žˆ~²9ÆyõºŸ¶ÌËÖ ÚMèÐ3˜I¿wr{ܵ5"B×zg. ¤ÔæÍ&ª5{%vj;õ³þó×m7C%ro]?r¨#”É• üÌæ³bÝìp,å$Í<³çÛ=é*Bø2¯ú]§¯ÛË“±ÿ¢Ù/fp`ò¾?j#W¿$¡0®5pö€ÃQëcâÛÌmãlj9mÃK|}ü“ž?aYּ⧨ھu@€•*lzœ5!„²¬V«U©TJ¥2''';;;O©lòF‹Ÿ8qbðàÁãù &7o†1æ8ŽŽãXFsïþQNñöòÓ€]òÉukÎy™ÓÏW`š¾лIÔétZ­V­Vçççë{…B‘•••™™™™™éããY¢[(ìŒä8£…¹Æ~5ágÞㆅ(±1ñŸQì'ô±DïÕ¼àÛú=pfÍ[ÁÒ•E˜¢(Œ-—®ä•æóYáµklÖJU4ûÁ´›Z¯Ä5Å?š±¿M—×ê %Pr•ÞJ·nÝzKç)wïÞˆˆ0k’’’œœœœœœe2™T*‹Å"‘H èwÒ4­÷ü€1.ÇY^µZÍqì¿I êÉdŽ>Þ5c6/Óét…•ˆaøLDçÞm[G@»ª"læÍ3¿_î8‚%UÒ[[vzaÅㆅ(‹ž;LÝnP´™o— Ô)ž&¾Ê+1·‚i¹·Ÿ§ØlÎJ&a¹tfr€ß¹së>NìºhvtG˜¶VSÿ2ÅŠ4Û¸m¹€Á¬ôî)GÉËêX¥2O¯ëSS²’9Ž+P¿'ÄEÕ­ëëê*ûõØmZu6­o.ïñјÕ[Žßx‘'®Þ ãèéã{Tu>9ç§G|z¯óнÿ 7^¿¥y¼-zèwhrÜÖáÞ Ü7ï.óÔœ¨ÏϦèBH wónо÷È‘½šº¼¡F!ûÖwTiYÌý`É­’§CÚ¯úyE˜f*@ò¾ŽMÏHËÍÍC%$$oݲÏ/¹!QÇêFE(ù(•yÈtÈç²ãWLþß_u>útU iÊÙØå &i\ã>oY¥÷D°Š©6ãè7qÃw Fd.õôÊíµZ·”\! <+¾#´Š×)ZïáËf„ɸ¼ÔÇÿ°ã›.ü»1vr G8¯ÉF¡\zl=×Í4ÞÌ€ä-Ýà¯Õ%¿NÖhT!Žcù|þÙs§J,æèÔþ=Žã232µZ™$ÔI§ã3½}òAG?…‚dŽúóò+M¸LT…%.ûEbÜdÏâ6œï·ª³+#„òoïÞ|{ˆQNªþ-›~~Ó²§n&¾ÊVièìmkzyÂÜo@BrÿÆMW£1 mÝ.HÕ{Â/îi&Ã$ëzÜê•qçï$÷ VC'Oâdòô¦M:ðÙ„M—^æ²<Çš¡ý&}1*̇¡BËp’÷-`ulzZZ‘@¨qHÓ3¹ú• 9Š\Vgn—"ãä[ ý|!>ih­@±.ùÆLIÝFîüª=…É*Rr‰ß¨OöÍßôÃãÖcêˆ(’úûúÃY-&Lo\–‘«C!6ëÆéóO\FΙÚȑ˥]`ޱ"%”„0_"eV©âR?Ü:aôEëQS–âG¿lZ5vbþÎ-£„ÅÏí£CzOœ7ØY¾º´{ÙÖy˃ö/iãDC…€­J^)>˜_»q•e‹Íævh1buœÑ†6ãÜy ˜?éÒ„5ßëP_ó÷_ÚK¦µr¬ÚKy‰:+SEI½Â>ü xØ–mWÕJœphûYÏ­kßÁÝÈÈg‘#…"ÄÁ¿e‡–Áb VÅW,œV£VåióRÅï_{(…nøQ Êù{î'÷,Š’P¸}¨Ÿjhô¶M—.oíTìË”4 MDB¡`×§'G¹òRÝÚQl» K€ª-yu,Ë/ØRJÓÔOGöþsíïBÏúgÏõò–!„XkÎs"—÷2ñ¹ÚµUï–ÞÉ^Q=þãøåaM»x ª°~ãò3òÈW"ðlüqÇ­S¶ž|T=ö‡äª+Õ]£Üt%KˆÁ/!ƃܭpn-êÞq±¾•‹ýÚŒ[5«WuFûøÖcµ´qK1EaŒ°È·ucéŽë·“Õ­‹=j__عjëÑøGÉJJÂËg™lWi{J8*¨Ò’W(дa0÷pà)²3:¶kx IDAT‹ä Äpæg῜N«=ò˦ÓE$ûâ²Å¿:Œß³l€Ù}ÕÐÉ+VF†/¯Ê3½¬2C‰DŽBËš}0ÀkÄÎÕë¤çq‡Õª3¼4'1R¦å²Ð®ß-~Q+f†ºJåÎÕ\ÝE4EQ© ’ÉWDLŠi“öOŸ›1yÁ¤†®ä߃sœ¶ñG0˜äª¸äÕj´ý‡ ðùzOùêüŒ¬4V§áâ8Dá8‚q®æ–¯T™¦ Ë|ø(G\Û™OQ¦œê· äÿðòU‡«îf.?+Ÿ!¾o¯è&;çKõ‰þ_S…±ÀOrÓò@ò¾c¤5†4¨F;žï^¯çµøªFbŒ‘æÙ_×sø¾õ<kƈ°!¤zzù‘.`ú˜¾m=ÌÊüåøŒ­—Þ!U[ò*óT ÃÏSæaDˆ‰ÄÄê'x9½ï²«Óæç«Ms0nÍZº}·åÚOzÔ“*n^s^å3ª¡s•Þ\Í©²Uˆ (ŒvíðÉØ>qYíûÖP!žDL©³²Õ0ñö®U a÷šq,ô“a¾Ã¶Ïš+ú¸w~øË¦­Ï}¢‡Ê1F<™§ §\:ùW¢O+Ïàxë¾-d]B|$ÉOs‰­W&EA}UZòê´º÷o:;9¶¯c½Ã7Šãô~LY–å8NDzljjªF­6“„¸þ„5 x«¶}7çHšŠïäÛôƒ¯¦D«ôa™œ:W„|½Ð ùbÁ 4_"@¯ÓsuȦÞlaÑë6IV­>°bJ q ›¸aÚý¹Ê´G—‰ÃO-üaõ¡ŽáÓ‡.•òUì–9ÇÔˆFêÑÐGjËÏxey3²éñqûn{ŠjíZò< +QØ6îÆ_9§ÕªÍnvå1üþ݇ʤr°X©¼Á¦^õKlY–Õjµ*•J©Tæäädggç)•BBÞ¸uæÄ‰ƒÆ9rhïÞm¹¹Æ>&ŒÜ‰ý¬D"2ddŸ>ƒÌ%^ÂÏ=Uå‡'ËŠ6»šYGÑ›qáTTõ ‹f'„ã «_1E­|Ð7sLÑ6ºÆ¸ÑWh…ÖÙs˲:N«ÕªÕêüü|}o P(²²²233333}||"##Mýžë;ÿö«ª[‹û½Üw×¾h¿'·Y‹²ãÇW峛מJ†ùUF’•»t`ÛÿÂö¸MÍCÂeR¹ÙuPO_$æ«ò:µéZÅwZWn+ݺu‹¼Ý;Ë»wïFDD˜Ž5IIINNNNNNŽŽŽ2™L*•ŠÅb‘H$†áñx4MS”~Ê—ã,oýºuëSÚ¹"вP‘væI¼žR¬¸±7Šo÷¶W=aKÑFÍÜÂ5U¢B á"ÓNßJ”½¢z°ùÓYw‡íÞë÷.&ò5)÷ÅÄ¿z/1UI9xÖmÑmä¤1mÜÊ̿ɻ-m¾ü>jð7X“MŸAs~ÚÜϽÔ/0ìͶ vvr±¤ÕÜ]<î'܆ÖVªÊQòb >,Âq,y«µ‰ònÌø±[î‰ôèýñ`?W*ëñëéš2~˜xW¥³](—Ÿ­¬©`Ò$ìýråíÆÓç÷¯% 0-óÿ§Ù—m†Ïð‹Ó“‰„bh`¥Š¸Á”3Ú¤Ó{vnÓ4¬eh—¡“6ǧè FkMòg êÞ¾ixçîãÖÆgã–¢Øôóf ï×µexË&aïû饖 ¤M¿´ã‹¡Ý;4 ïÜmôW‡ä°!’ŸðóÒ¨^›†µlÒ¾ßÔŸk,ZTŠ›ûFõ¯YxËÐn£WÝÌãB\Öõï¿Ù§sÓðNÝ¢æíºžÉêSP^Ÿû^ë;þÕïÕ=ß7¸U—9Wr9]ò‰¥ãûõŒ kÙ$<²[ô‚÷sØ‚MŒÞ²IXËѧ³8]Zñ¢=:÷Edó~ïçë§56 jÞõ««¹ow4É¿³uÁ–{®ƒÖìÝüùÇ#zE¾×cÐøÏÏéäÆÃZºóåQ:[ó=ê6  mÖÀCˆEÕ6  oV×Ê0iÀ\ú™/:¶ì»äŠ‚%i·Gµo7ãØ+-1c[Û6ÃðyÖ`x<ô’`¥ ,@ycÁ‹2R^_;vú®uÔÔ1‚Ô›¿ÆÞAƒ,³eÆ÷²ê^ìÄñqâA“NóÈß¶|ñTÊ{ßÌFqŸ-9.2mu/^æË_g!m’™@ hï˜8jSzèûã¾näŠ3³äžŒÕc-9Ž&Ë­Ã&ÇrBˆÍ}téúk¯Qs?­+ÎI<½3æë©¼šû?kN#„{ÿÅK{zò1vð’RܿŋæSß¹1ÿTü?é£ëxQˆË¾ý÷ ¦þÄÚâ·[Í—wk÷Où­G7uâÌ-Ì-Yq‹m'¥³uÕ«/áoÁá.æpóv“gµ>{ñ–ˆãŽ,ŽIj2{q'w#­‰mmÛd|ŸÇãYš¿dx<†Ç‡^¬’€J€y/ÊÂìøM‡_׈ÚñÕh…QXõ„c—¯`„â²,F!TÒ÷2RœÛðý³úSâ¦ôªÎ`â™öç ‡Læ¿Î`% ÂÚ„‡ÈiÜH/7X…™@³Ååõ;¹ûnéØºª@¨(.–Îqt±”A¿Ðv-ë‹©–-¼^_üèÌoOò›ù#„ÈÕ7¨Ž/_ïTOcR4q×&‚/Ž_IT×÷èܪnÿ ÉÛiB]ÖãÇyij‘ŸÌä]:Q\¶÷ÒÙ#DqÙlnÖ̵óŒLJ}9w¡Â!>±Ù¬]]«ó ß̳­mÃ0|žåWö<†Ï£AŠ€•*d(PÎh__ØúYt¿vm[5·ë9›—­âÒ¦ÜKÒ:6nQChØN[t„…•(¾—1Bš”;‰jÝ%ÂZ¶jÞ*lÐúÇlö³×J&p`TsÍáIC>ü2öø½,½‹¡¹@³h’o>RI·¬).Øí‹Ò$;ŽÆ”È·uc©úÉídõWVÒVtG9¯² ¿Œ bÌ KCz6¤ïýz9•%ª¤¿nk|;4”¿í1m‹¢x”¹"ÛéìK ˜Cˆvë4kJóÌ?{ì?öÓH¾±!Mmk»bŽáYgÏ0ÐK‚•*€ò}hÐÁ[¤¯)š‚ƒë ª ^K^”)šB¬Îì:D+Q¦°: [ÎþvJ°¸`üÇbwgFä:|õ¡VîÙµ{ΨÝûÆlÜ$ú™ 4ûb˜c Âf{,óŽ£1ŧ‘&_Ë‚, Ì2ˆÕr¤ bí JÞ´wSfÞOR;Öÿ=>ݳK ×·í´y޾5øèêígJ΋onÓ”]—Î.±Ð€y!NñøêcG¸G'νê5¬¦Õ±—óK†OS´ÅùKЦy æÀJA9 Ð?ÏŸ˜¿`Ê— þ[0eáWÓ¯þsöð@•BïEyø˜¾mC‚ê5hè/7tê|÷úµø9WÏ%*Mú+Qf† ×:><Õ“ìéWÛ¿¶þ?¿RBó¤µZ ù|ÃÞ ½nż§$Ä| ønA>¼ìkñÏUFñ|÷zµøŠkñ/ ÆŽ£yòrœöè¹²”=-t¢¼Œ|YùU-|DWùýý¿þ}òäšÝ:úðßzZO28ÒYyzãþJ–”0»ý—εŽÅÌe^Xóå ùè˜ï&Ö¾¿fá†Íƒ¥²­ Ág¬-BŘb`cX©B(G ž>óKh‹pŒ1ÇqúSí5ÍÑ_÷¹¹yx{ù‚é Š °àEËZLxßohìŒ)ܘAa>ùwsõ3ŠÖ¢Ìè&çVãxFíûtÝ¿y ‘*õ©¢VÏÞÁâ”?Ås¾þnbÍË+ 9ÄÁÕFºW˜šcœZŽXãƒ]Ógè><…ÊTe­Ž‘þ–G35:tñݰyåÿb•}¸Ñ/ïgZ×ëŒGH pï±Ø= 4Eõ¶Ý똻^<¬¿÷ÀmËžh}&tðâ¿ýN%, 7«ûÅÏbF}pwhŸ¶õjV£/Ü~ê3lZ7û/=Î&¾ÍÜ6Î&¶m §mx‰ƒ¯Òó',k~奼Xïêª.lz|ܾÛÞƒ¢Z»–tÄe% l…¡\€Mó ánü•sZ­ÚìuÃïß}¨L*+•ìXòbl³§]`{h_žÙ½÷rß®ï·2‘;V¢ìNùìæµ§Ò†a~R—³­ \•ž27{9å\óp™Tnö(Ò§//]»Ð©M×*>íV²oÉ ðŸ „#ˆ DL;}+Qv€êÁæOgݶ{¯Ÿ”.[½I0ežšõùÙA änÞ Ú÷9²WSÛu¹löå÷Qƒ¿yÄ–tn‚æü´¹Ÿ{©E~9˜½\ax´³“‹%­æîâq?á6ô~`%¼•Žc‰­œJ£U¼NÑz_6#LÆå¥>þû‡ß|táß±“[8þç©U[*—ÍC¹tøleM‹&aï—+o7ž>¿-…i™¿ã›®µ/³3 Ÿá1§'1 ÅÐ:ÀJ y¨h“|6aÓ¥—¹,ϱfh¿I_Œ sÓ‹+Mò±Ë×½’Áóª2 ]8Ž[ŠbÓÏoZ¶ñÔÍÄWÙ*" ½mM/OF—~iïªUû/<Ì ÝëwŒž9±O ”Fù GÖ,ÚòÛÍz´›¼fi/¾Ù@³£ ›rjÕÂM>zž¢Pój·}ÒøÞu ^%sY×ãV¯Œ;'™¸µ:yê°'#DÌþ(B%Æ ß„BMÿº¹£#E7~»*îü­—9´S½!K¾Ü@B ÉZ·•Ö\ñ-k(B’û7nÒ¸QhëvAªÞ~9poLó0&v\.[ó=ê6sG¡|ñ!N¨Þ°Yh°˜Âa]Æ¥%J*Éú}ÞÀ/îD®Ù1³©ŒÖ&nÿ8j[µYû¾îRݬÙmØ, Ãçñx–ÄÇðx EÀJ y¨ ÐÎ!½'Îì,a_]Ú½lë¼åAû—´q¢‘òúÚ±Óp­£¦Ž ¤Þü5ö’D™å(6ëÆéóO\FΙÚȑ˥]xXu/vâø8ñ É §yäÆo[¾x*å½of£Œ¸Ï–™¶ºM ^æ«_g!m’™@ó°9⯾¨5gjH™ô×Ám‹¢î+ölüÀOˆ‘úáÖ £·(Zš²<?úeÓª±ówn d-§ïÞñÒžž|Œ¼¤Ö<Þ>qÔ¦ôÐ÷Ç}ÝÈgfÉ=«ÆšO–²b+d¾øÍeÖÅ¡áðH„0_"eV©âPe(—«^½¢1ü5T‚¥’¶›<«õðÙ‹·DìïtdqLR“Ù‹;¹3iMÍnÓ…æó¬‰9†Çcx|è%ÁJ y¨PÒ€6!„‚]ŸžyäÊKukGavü¦Ã¯kDíøj´¿ˆÂ(¬z±ËW0BqY£Bˆÿ–Z‹)„0FŠs¾VJÜ”^ÕŒB<Óþ´óðƒ Áü׬¤AX›ð9ëå«0h‚$~aÚÖS­Û·­G™°eóµ~_…Is/oØõÄcø–EÑA ·õS Þ¶éòÀå­E–Ó¹úÕñåc„1&Š‹ëw¤D]'BÂ@3V1̆ÒÒºBÄÜIÑ„ ’o=VK·ôSÆ‹|[7–î¸~;YݪŽåôqA¶Bšä›TÒÆ-kêSУ¶œ¬Ø²A4ŠÏ!kGßZÔ½ãbýóƒØ¯Í¸U³zUg´í¿\vˆ•’òÜ:ÍšòKßE¿½®;mE¤‡ñ c³Û¼˜c¬¾²ç1 ½$X $/ö/x“öOŸ›1yÁ¤†®ä߃sœÖGP4…XgnŽ•(SX‡„-g;%X\0\`±»3#r¾úP«‹G÷ìÚ=gÔî}c6nˆ ’ýÌ–îÅ0¡ auÄà]ÇxlÂDBÈlú†‹IÑ9K6ë~Ç|²Ø²A,ÿ ;Ñü¢VÌ u•Ê«¹º9ŠhŠ¢0R#û/—=b¥¤œâñÕÇ*ŽpNœ{ÕkXM.2&±—c-†OS´E1GÑ4ÄX©"‡g”/ª§—é†éÛ6$¨^ƒ†þrC§Îw¯_‹Ÿsõ\¢Òd﹕(3C…kžêIöô«í_[ÿŸ_ )!ŒyÒZ­†|¾aï†Þ·âÞSb>°h^\¼Ãxºñ1ߣ^-¾âZü •þ«šg]ÏáûÖó`l6}Zè(DyùlÁ)ó|· ^öµøç*£ç»[L–ïaÑ –‹oi͆! ‚|kT“04¥×üV2`7å²G­c±¤\æ…5_žŽùnbíûkþ𯚠„‰Ùm>cm*ƳÀJX€òEà\oݷ倬Kˆ$ùi®AÝ`Y‹ ïû 1…3(ÌÇ!ÿNb®~êÏZ”™wçVãxFíûtÝ¿y ‘*õ©¢VÏÞÁâ”?Ås¾þnbÍË+ 9ÄÁÕFºW˜Z!í÷­›kumìªyplKì3×Ás›;RËB?æ;lû¬¹¢{à‡¿lÚúÜ'zq¨c­Ùô@áÞc±{  iŠêm»7h9~`vMŸA¢û4ò*S•µ:Fú[LÖŠA,_þ†]^»×Œƒ*C¹ìpæÉBIeù76.;)óA£úÌüѧFl^z¼ýÚ^Õ3fw´e«0<&_¥‹$æ‰Õ*#€~¬’ûŸ½¨5l鬔¯b·Ì9¦F„0R†>ú#ô…£Öos\ÿm\ìû³µ´ÐɽAG)c«Q¦ˆ~²9ÆyõºŸ¶ÌËÖ ÚMèÐ3˜I¿wr{ܵ5"B×zg. ¤Ôæ­¨J˜ó÷®¯w&³N¾G.ûtlCý"aÑë6IV­>°bJ q ›¸aÚˆ …‘ÊlúØ©íÔÏúÏ_·uÞ •ȽetýÈ~Áã7Å8­^ûcÌìÝ9œ°FçM;ù{ZJÖªAÌ_þÿñRPYËeã˜-i`ò¾?j#W¿$¡0®5pö€ÃQëcâÛÌmãljv9mÃK|}ü“ž?aYÖü-FQµ}ë€S1°R€M³&„BX–Õjµ*•J©Tæäädggç)•BBÞhñ'N <*ì}'Àq˲:N«ÕªÕêüü|}o P(²²²233333}||"##KÜï¦!g´^cŠ*Й„p„+소c,EŽå¦èâJµØOèc Ç~cJ¿5Êl Y4 뇼8,æÇ©õD.‘·â¿ˆ©ÂÝZÓ/Š(¼Ú8Ï…2Ÿl)lU²øVê—c9dñû-—=Ýb&Ø´¤%®)þÑŒÙm¼K±&D@0Tv+ݺu‹rïѽAýý§‚ÄŠ òÂß½{7""Ât¬IJJrrrrrrrtt”ÉdR©T,‹D"@ ßHÓ4EQú·Z0Ë @ù?[cЦ-Fáÿe>-3?)Š6óí’:ÅÓÄWy%æV0-wçˆázÚ¬Ò2_(³?j!Âl ÿo[Ñ¥žþ´~­ý–ËžîÓÖjT" øG‹õa«=ˆZ°Ò»$/U.ë¹,¹UòÐAûåßú‚+]¼•Ê¥ÇÖsÝLÃ1E¡–ç?©D/Ó@òTY0méÝy¥|§P%sy¼’@òH^É ÿ8¤ €Š…MÛwÛ{PTkWžÍžxËe];ôýߎ½Fu®ÁÇo›Ô?vÿåØgL¤—Nø­ØJËÛîÆ_9§Õª‘9×.<†ß¿ûP™TV+ä r¡}yf÷ÞË}»¾ßʲäå”Ïn^{*mæ'¥ËZ¬¼G‡¿]öÝ©»ÉJìÒañ÷‹Ú:›þ†.=~ßîÃámFvòä—ðª~¸áã)g/Ù6±ÄÔK…iÎué÷ÿsxûQ5ý:-ë)U-” jZ¾œo‡ þʹæ!á2©!3¹ú"ñÒµ Út­âîvÁJ y¨„ÂD"f;w„R=Øü鬻Ãvïõ“–µ7̓íŸ/>å:rÚÒPwžN(³à\bÞß0%r÷òörs0/>ÌåÜbRïF?ežšõùÙAˆ–zx{4ïþáݹXÎ.ã±\ \Ö™ù£çžz•OB”À±Fp‹ÈácG´ó`{·¼­¿¢ax´³“‹%­æîâq?á6ôŠ`%¼TQ8Ž-µÂ¦_»øRÚaö¨®$Fè¿Oš0Þýlì‹1eá›å•ó2C«x¢õ¾tZs±2íEÒý?~X} nз13Z8ZYjR–å²V š¬ç/•5?üfF3]Nr•ŸvÄNû'=vߌFönyÛ0~Å‹9†Ïð‹wF"¡z<°RÛ×(4Élœ1¨{û¦á»[ŸY8|k“LïÙ¹MÓ°–¡]†NÚŸ¢+×c†‡‡·lÖrôé,Ž ¤M¿´ã‹¡Ý;4 ïÜmôW‡äü_{÷Eµ·üœ)Û’ÝÒCBˆ)”@BP°  ˆ  (EïU±**; êµëE_@DšŠ ¢X°ƒi"5tRHÙdûœóþ1ɲIvC ›°Iž¯~ø$;“ÝßÙyöì™3J-€oûø©±×ìÖûŠkÆ=±p[QÅÊŠåL9/þâÞ~—öéÖûÒæ´1Ÿ÷Q´áÍ;‡êÖûòÁ£§¾õË)»zŽÿyÙ5¯ì²0N”Â_ß™6føÕ9½shŽŒ IDATºf_y÷ç'œœ×xæœRðÕã×^vi·Þƒ¯™ðÌò¿k}æ sBBRºvï~iÿ«GÞñà›KNé|bÙŒÈwqÿ¶Èµç„„\Ò¥KV^ý®ýà¬ÉIþæ§¼éW¾Q‹HaNª,Iè}C•* }·l{óßS—³>ã&ß™¦ÍßñÕ¼]$¨b™ž9ì¾'F…)'7.zqþ/µ[6«o˜úímô3g_§¡4¸µQ ¶=óî»g©aäÏN‰)[ÿþK3' Kîaòú-·ýŸù“&Î-í3þÁ—Òè¾/ß}õß÷Y?œ;1U§~Ê0ýÕ±©:Jõ‘ñßü‹®ëí´íùjÞü‡ï¶½·hJ§ ÎEhJñöï=1vúä¬PV&¤EHôtg^HÑ´xï­][¹Ž®ûàí¦Hm–>ÚÃ(\ÔAyTE É#&ß´xÜâ?åõã¿©O+PJ)åÎâc[W®ÚÇ#fEÊ´™T¾qŠ@4’F’$_ý—²$É’»IT ‘š©Oã‚m¶_*V¹ïs¥¡¢;N×&§“ñƒ¿þÎwTö¹UYÒª¹Íó™{¬C)¥º˜´hòùÉ%°‰v¶Eú¥EêÕ i÷Ìy¼g0q”Þ¸zÞ¼)w¹ÞøàÑLÞ +ß0Ű0'×Ò)I’,ËØO¢Jˆ¼Ðô ¢@ó2ÒЙ»lê´yæAm\F<¿dîrÓU™‰A§”UvÊ1™iºÅkæ}ÔiD*/(í7¤Ó¥wˆ·ä‘)„{ÄëmùGJÛ^7,#ÄÛé:ÔÔëÞÑI£?˜6Cÿ¯a©ôŸ/ß,qÂÌ^!ç™ ÊmúuƒÅ`9²~Å{Kó.¹û•nÆsÞCÍgž'ÒïûsS¨ÞZpüðžŸ>ût騝M-ñr¿µH½Z¡äÀÖ?CƒKÑñ=?}ºèû²ø[®MÑÓ¼æPùF)~@‘%Ùj³ôA^—Úì6­¬Å~²%TI¥ÒÒÒº^C®´´Ô¿óT ò@CÓ¥ûýз__:ï?ËJœ¢.,ºÓ€£D©ÔvôìiyÏÏ›;}p.c:'EBˆÖoò£7>ùÖü'²é£s&tÜ)¹ó½ïÍ í­ÏçÎXZâÒ…§^6©ÿu!Þ§æ×¥O|ëÝ W_[þòƒy<*-û¾w¦ÜÚN'ê‹Á©Ý3"~^8}ŠÕ%…&t¸ìÑy÷ÜR‡{¨ùÌÓî¸cŠn%¬[ôÈ‹ˆ•réƒïÞ~m×h½H ñg‹\X+H¡qQšïçO¹w>!¢!$2¡Ó°G¸õ†,“èÊoâ•oÌâ¤Ä”ÜcÅû(jA.IJÇEÅZB•BL!6mÈî‘]—Ô[ZZº~ãúcˆ·šÖœÝšsÎ9WÅétÚl6‹Åb6›KJJÊ-–¬ÌÌs>öÚµkG…—/@Ó¥îcŠ¢¸\.§Ói·Û­V«º7(---...*****JLL-êõ¼Þ[µgNª®Ã™Âˆ ^ĉ²8Sª”œV¹ºƒ[äZ¡êÓó,~“¯|#? v)µ†æ^¥;wª‡•üÂüs‰Ëuî±M’$…C"Â#A „ìÞ½{РA55¹¹¹aaaaaa¡¡¡&“Éh4 ½^¯ÕjÕ3EQ„Š‘ÑË RŠÞo½wMQAϱ²«ôÈ¡“åÕºE¨’g|ÜsÕ[k½]fž÷àõ1ª?óªëøÜàÆk‹ZŸA½Z¤®÷VÛŸù^Öä+ßÈŤ·?B-ªD(¥QQ‘­"/VAy ©bÅ?͸}ÖÎêçàk/uÕËÙuºÞ@ýïšD²G䀦Jˆ¸vþ/×xÙ¥Öù;Þúß4 ˆ¼ÐtQ±¾ßìÖÿ  PhÞÐË þwý[û8ÁÈ Ïôã0T ‘üOaœ£ 00°yyÆò@CI6œh¯Û#p‡×¥ŒÊ?ç”3ª„*!ò4"*ÄÆâì–­…Œ¡hT£Þ2ƒþîÝõR“1„x›ÅåÈñCÖ}û×tjás¼ Jˆ¼¼SÔÝ2$6ekîƒgŽf<ë„(eeEŒl§O —tŒåå[~Üœ¿äËÅÑ( F¯™41²ff±¿óÁ‘oÌ„7Ójhe)<,Â×ef£#b¢Nž"-}ǃ*!ò46J/âEàe5ºÑ7$ŒŠf{w/Þæ(âbbœ!TD£40æÚðãñãZBMì;!Ú2wmÉ1…sÆr­„7ßjH²F–dŸÏ˜IÖJHËž×UB䀿²ÄôÎ㳂ۙÅjÿâ«cœ`ŒŠ2#Çg¥IAžeõ¯y«Ž+ !Dú\3:YmdÂN-]yˆdu0v¹Å±ùÏÓoo·™YW#„ˆRf—Èq™AÉ^pºlÙùkóSÿ¼­6:H Ë?]þÉy_çU|SœÐ;iE6'„ìþúàãûyë÷ö4µ¦ÄåÚøË±w9›r°Ú#fd´ëË•Gçu¹ÔÛöSB'Ò€xþ)K!„¶FÂ{•ïu ¥ÌîÕ«aJ‰}û*Ý/+sÿïSDÍ#GXòøª4ÏK5ÀÛ.ËI’|…9I’%IÆ>UB䀿xÛtŸ-mßRøâ '1ˆæÎ mÛ£õ ½ÄÍ› ^(àmÛGŒÞZ·äÈ’|Ω˜”¨,>óú÷6»A?¬_Ø¿¿üqæõJXr« }âΜ<4÷gu\ÐKzÄ?“Å¿úõÔüRÚ¥GÔ=בÞé“õ‘%gÞ\g·iåœîÿÊ-<½“BHþŽ“³w;œ[J!,|Ú“ekþ3‡œL/)Î&ÝÑ¢Õ_Ÿ!;ŸZvÌå¹!œ‚Fi„Øëù/'„î«óß=Ôæ¡A¿.Î/é=:Ìú¿5eùJÅLKžÕ`½í©¶0'K’,É”ÐÞ}‰*!ò@Ó¼º Ûºk ·½Áfe¤â»9]ð­Ý5ù[þw£ÍÊɆ\»vLâ½ _~Y^J¥ÔzƲ)×j#–ÓÆà7»9Öm/Ùbçü8ËHïš K§Žº­æÔÝÖUóÏχßßåtr²Ç,õ¸µÕàÈü¿NTüù‡­6B¶—ÈY#ŒýZåÿ•O!örÇ¡|»ƒNˆ6\6Q¶çHÙÖ #jFiÊ;}½&QCóŽÛ˸—–B£\œ7ˆ×juýöS^¿Ñ1S åIÚër6Ÿ ·žÕp²¬‘|e/ÉIDÿ%ª„È Í`W¬k#³]¹N#œTtpi‚u‰Ûu¸òF§sÓq6IjßêÆçò5³¿û¯¸¥|ñçì¬øÇIá7G6IŠÓÙ¿ße3ûúæÜ“φ¶o5ìTña"›Ë~)×_Ù†-pZE¹S¸(ØåMûrÊöõ§~HŒ3²Mê¶â§ELˆŽÔÅ—Í߃F¹o!Õ(“ £û-ÛŽ}zÂêüîÌ¥·´úWºùéÝ.§R½ëN*¼õ²$[mƒ>ÈëR›ÝVlEïª„È ~´®ÓåŸØ?¿ù%êöN‘w¨ÓùûOåë ]ÿ8:Ý5>3ò?Á´0¯|á§ù+óâjRìïßüÇ56£Õä,Qtºr¬ßí;]qeã/§¿9òªxÓùçÖÍ'u9ÝC; ”²ÂÓæ÷¾.Îu5í3ØXyùÙ™1$9üß]D‰ð’"ëÆmT rQÄ[5ì­2#¯JŸýÓjá„ÏÙ:;'²Ë¡“›,Õ«ñë)ÅÀÿÍ¡Q> Þ_GNF?Ý£g-~&T©PÎk|aÅ9ç\Q§Ói³Ù,‹Ùl.)))·X²23Ï9ÿõÚµkGÕÌgrhÞA–sÎ9cLQ—Ëåt:ív»ÕjU÷¥¥¥ÅÅÅEEEEEEñññW_}uµ÷ûÚµkîRm(¥„’Š9çê¾›RR1§>çÌãÜsJ©@¸¢þN‰H cK=Õq5ß^eA ¤r‘@«¬,xœXÅx3™ Þ³&„s®ÎË‹Fi¤âSrwe¼VƒR"T«žÇŸT«F@o,!µ'$¹f_¥™—Û„ú¥ÂÝ»w4¨æ±&777,,,,,,44Ôd2FƒÁ ×ëµZ­,Ë’$‰¢(¥”RŠ^^¨çŽºŽ1šðSIqNj~êVâÊÙ_ˆÂ½/ªãj¾½Ê:ÌãÂx••Ys<&{­ ¥Ñ>U*üÍÁkVÏsóy“‰ùêü€*]tõÙ…`ˆ¼Ð¼÷ Áˆ¼Ð¼!ñ"/ÀŇÓ×ÀÿVNJÅ´-@Ù½ë/gç!ò€ÿ‰î)”6"/"/@ÀÂX^®Óß¾õÆ/ wNž¤U<~¦( bïÝë7ÿâtÚ½^.N’57¹Åd A•P%D^?àåûV¾þâÿ}·û´…FôŸùñsýÂEo©M)ÚñúMnU8¯òs‹= 4ÌrtÇÖ#ÆÎÙÉF±)4ÂúÍ¿ôÈìm2†xÈûÈñC·þvEß«[ø ¯¨"/€_8ö~ðøÌï"ÇN™Ý+ZrÒL¾/Ç9ç•=-ž?7—À”ÿÙÃgîV˜ÇfuxlåC£$zAaùŸÝ9üyÇèwß¾«‹©2ƒ•o˜<ä¡Sw/]02^ƒct҇õß}U*O!¤ÝôÏß-ÕµN¶½ï=2m÷èE‹“bSØnYÃÃ"|eµèˆ˜¿ü…Wª„È à—´Q¸uà cÿÇÆ_$PBZr_ gŠ¢$ÜöÒÔîFQ-ƒhlZþBÎŵwÁýOÄ|4ûú6#¸¢(5Ã]‹&Dôô•6¥ !Ž‹Ÿzå¯.SŸ¼±­V ¢)å<ËϘ³œÖ5ÌÉY’}¾å(Ñë xu Jy™¢ ^pþqóôÚ—Ÿžóëþ“ùevӡϸ‡'O7ŠÔ™»üÑIïn¾êU,gÊyñ÷öû’B'.ZrKÉÌá÷í½è£±IZJ\Ç–ŒõAÊë+žÍh)-$9«[·VîbQJ-ÛfÜ0é ™µùå)ïµýàžÌmЈ Ȩ&¦}÷hB±~Ðѱ»÷Ê0”ê:³qAµ *^÷ÄMÿÙ5øw3‰ÎCükÜû­¦-yáªXB!‡æŒéý.!„tùÕ{B…®†,k$Iòæ$I–$ô¾¡Jy1‚.(ò–íÛ¸íTëñ3io0úþÃ9/L–Ú,{´‡Q Ïvߣƒ”“½8ÿ‰—Ú-›Õ7LT×O˜ðÔãu…[½²pöæøÁ&>=>¸àç¹ÿ}ýñˆN?ÔÑ PÛžy÷ݳÔ0òg§Ä”­ÿ¥™“…„%÷0ùÌB!¦¿:6UG©>2^CK˜¢0w7$gLa¬å4 çŒ1¦îÕ))U;k/¸ BâM³oйwúã3ÛðÜQU-ÝМz++N!”PJ)¥ÄÇ^öÀ´>c›9wЇ÷„­ž9'·ëc3¯ˆ–)qBHô3g_§¡4¸µQìBh¤Úœ,I²¤ÁnU ¬ÈÛ„¾F€ X$(¹×e9 BNÏÖ§6ÜõÃ7­Ý;SûJ%„’yäÛ±«7Ÿ°÷ 5T¬ß³O¯ ƒÐ5þÔº‘ “†ŒºîR£@»è·üððú§’µæMï||´ãƒK+S’WðóÈWîÔ½{°¯çrx›ôô4=%”RbiÙ-²ãé«ú=SñsĈĘ̈o˜“¢úM}éÖ»&Μ٣ÝKÃêäáFnè&öæ(õµ‘zèëÑOÍx¶4xý¡îÓ^«qO,ªLj—ž¤¡M 7J–5’ï¯ì%Y#‰è¿D•,òÔ'©t±iÑäó“% !ÎS¿}øêü/Öï;m‚$«"—ØX•õ ¥šˆäpb?Sl'ÔD©>²M(ÙYXÎwäí:dw›5"{vEr` ÓŸ²0ì{¾qJð…•ê’ ¯=ÒÓ$PB‰ HÑ ÔVïû‚;O|nÒŸã_zryæì¶ ¿¡›’Z6PŠºbÚƒ_ÞðÜ7§ÚOyypŒç‰€/å¦ðZ–e¹Ö¯ì%Y–ñŽD•y Ù%_I'Åɸ3wÙÔió̃xæþΑüðŠÏ|ïu'¥‘)q(ß2I:™0ç„Åň.ç±×Ì0¸G¤¢ÃëzÞ;4"qX¬eηœÐ¡SFåX^J© BµÉ£Ÿ¼ÿ×Û^jÅ]†ÊT{‘:ðÕ²¬tÿ–ý6ÆÙ¾µ¿œ:ºòÜ@J !œp¯óY`˜Óˆ‚è3Ì ¢(!Ì¡Jˆ¼Ð|ÙŽlÚçJzç ýâdª˜RBèuÈTg‘鉒íà7ô’ ³°ê¼ó ‰¡kö³ðT}µÇ „+¼æÏÍì£GÅ8R?„ʉÞšòÓÈÞ)WXj 4tàgŸÈŠ~{㩵!çÌÒ¾~ÏÏ~šóöÍmµ”ˆºP)?cUšHæÕÈšZ_ˆ‚Œ³P¥F Àšˈ§û–Ì]þÍÆ]»ÿþûHÙù. „_z÷ˆ¸¼åLyý“µ¿møåûÕ}öWIÝã©ßÿª$ÇúWžž÷åºõßøw‘úøRHœ‰æmüö÷CeŠh:ûs³?—Áo‘â‡<:¹›ÆJ/rCþaØÇò²íÿ{ñÛ Qßž•qÛ“Ûî~oö×§œœ9&3M—¿fÞGß­ÿñ›U«vx1dI¶Ú|Ž·ÙmZY‹ý!ªÔð¡.Ò.>yôìiyÏÏ›;}p.c:'ž×Ôú†Î÷¾7'üµ·>Ÿ;ci‰KžzÙ¤þ×e„ˆu~ü1/Î.™õÖŠÙSç¹}HTZ÷Œ0‰Š1WÝ7æ»g?}퓽êèñs§ f>þÁ‘â†M»{õͯY !„hÚ^܆|^70íô’—?s~í¶vA¥mozlÄÊqoÏYßwFßð°~“½ñÉ·æ?ñM3¡ãàN!bw÷&%¦ä;¨ø˜çT„K’Ò1ÂUj´æ< œsι¢(N§Óf³Y,³Ù\RRb6›»vízΊ¯]»vÔ¨Qh€¦KÝ 0ÆEq¹\N§Ón·[­VuoPZZZ\\\TTTTT”˜˜8xðàjï÷;ÎÆ© V̥ęˆ T)ëì.ˆRAhõõÏ®^ó®ªÞƒÇí5·©ÚVÞÊØÙ} A­‹1^±²çÏͦ}=+Z}Ñ…ÄÛrEaDÕÑÂØÐM§ ª±æzyÛx«²¡*)Ðw)µ†æ^¥;wÖs֯ݻw4¨æ±&777,,,,,,44Ôd2FƒÁ ×ëµZ­zF (Š‚ ¨ã¸ÐË þÑZE¯¿ÒjK¼®_å·êPý\¥G,¯ÖQBÅ„ä8ƒ×GÎq«÷5šU{Ô¿ ÞîŠžÍæ÷†nvMPs}¾mšàë¡U ˆ¼Ð|°âŸfÜ>kgõëÜj/uÕËÙFD^€¦Nˆ¸vþ/×Ô¼½y LD^hѪ|Ÿ‚sž_˜_b.q¹\玧¢b ‰léÇñˆ¼Ð° θח_a2šÎdKÍ¥6nÈ/ÌŠˆò×À¼¼Ð°ŠK‹³{d‡†„º§P¨Eˆ)$»Gv‰¹¤žS= ò@ãq¹\&“©î뇄„Ôe"/‹;›ÿ#¯N§C£@àðÿékíÛ·_µj•Ífóãð hLê›—UR¯Åèp8‡ÕjµZ­å•Q.h‰‘7222""•hÒ‘W½à0cL½à°ÃáP/?^VVæ¾æpqq1jµÛ{`÷úÍ¿8vâ­L’57¹Åd A•ZZ•~´ ¡uÂeýú»G;üôóºÜ#¹·Kiƒ »mIÊpÑ<€f Úù³ž·øínÿç=øc—Yïß×)Èëµ"˜å莭GŒ³“"ö+ Í `ýæ_zdö6Cñò¢9rüÐÆ­¿]Ñ÷êžZ`•ZÇ'lÚ¼Ñår]1`¥ô‡ußmùss×.ݽV p#/@úèÖ ­£‚}æ'ÛÞ÷™¶{ô¢ÅÉF\aÂ?XÑwÓÇ=þcž‹B´!Q .6vìÐn2Es4¼Ï&ô)=ñÍ;[µ˜ ²$†‡EøÊjÑ1ø /ŒX¥Ë/ë¯(®­Ûþ$„PJÿܺ%³sVÿË4\¬G䀋¸›OþÌÿn Tð½cLÁ‰~å,=•çLóâCÙ&Vž¿ÿOü÷®ßÿoÞ=CÑ ÿ‰ƒ) kY”e,É>s %z/ŒX%JéB¶nû“sž•Ùeàƒ¡gÃ$eÐà¾{ùþ›†^Õ;;§k¿!7Ü3ûÓ¿ÍŠzÐwøßÈË®ye—E ¬tDzgÇÝxe÷Þ9½®™øêŽrõæCsÆôîÓ5;gâ÷Ŭ|ëŒ+ûŒXpØÎ !ÄulɨK¯š¾¹Œ¹ ~}gÚ˜áWçôÎéš}åÝŸŸprBœ…üç–!ý»õxÍÄç?Ù[ù¸-ç„„¤téÚ¥g¯¾CÆL}ý…«C¹|…ÛÑH9½vö=ïÜ;;§köÀë&½±tÙ[“Ç^›Ý;§÷µcùxWiEuœ¹Ë§^7°o·ìœ^WÝrÿ{ëÕþyBaæ]Ÿ¾0qä5=zçtï?äÚÛ™»×ʯ⬑j#KzßZh•ÔÔ; ÿÀý6tÞ%èå€F°wý–ãñwLŸÜNoÉý}ÅûÏû»ô£ÿÝž¬£„p¦(L]˱Á}ãß-ìuÛÝ/dEÒ¢â8­Úå}ãÌÙ×Åi( nm(aŠÂÜýdœ1…1BˆR²ýû_FŒ>9+”• iµí™wß=K #xvJŠ8Ûk¡IDATLÙú÷_š9YHXòp†¡÷ÀlB¨&È(§ÅÆáhŽFŒ¼eû6n;•0á©Ç;ê ·.zeáìÍñƒ'L|z|pÁÏsÿûúã>~¨£A bxæ°ûž¤œÜ¸èÅùO¼ÔnÙ¬¾a"uì_0éöwOu}×s]£Å“?¼ôòÚ-§ãÓh ÕY#i$IòÕ)K’,ið†l±U¢”víÒ4Êi`ˆ¼Ðð8JÎî߯£Aèsy¿â͓澷uøóÙž×áᥛÞ^°/zôÿÍþwûŠs§(¥BÑG&µKOÒPB)%ŸA8NÉ韓a¡””þòÎÇG;>¸ôÁ¡±2%™q?üpåÞIÝ»ã [œ»­ÜYž·oý²7?É;ß•Di!š£qß$(¹gŸ^¡kü©u#& uÝ¥FvÑoùááõO9:$ë¨`Lí;(•BHFä‘oÇ®Þ|ÂÞ'ToÞô¿÷…çå{;Êò ?øïZµá­Î²¬‘|e/ÉIDiÑUj´sòð:€FÛ­QJ©hlE¦aÅÞ]yŽ^Fo±§wì³»ä´1Õ‡’VÎQÇ©ØÚóv²»ŽÍ‘=»"_0…éOY8 FcÏ 0Sý4bHî{÷«Ó†ÆÊÔyšƒ‘`¡¥¿/¥šˆäpb?Sl'ÔD©>²M(ÙYXÎ'Äuê·_ÿÅú}§-BdUä#Ä™·ókP÷)Á‚ YmGà½ìeY®¥ÿR’$Y–ñŽD•y 9îwd‘sÅUm|!S8¡5‡rQJá„WN\CHV'ãœÔ»#ºœÇ^0ÃP¹5D‡cX!„${ùá^‘ÆðV‘Q¡zQªOJÖXÍ!¡9Ô7…F¦Ä¡Tœ(édÂ\œâÌ]6uÚ<ó ž¹¿s$?¼bÆ3ß«IVq)D”„&ð²—e(ˆ>Ü ŠÂ\‹¨’$J¥¥¥!!u]¸´´Ô¿#˜y q9ŽoøË,'¤Ei(UÎÞ¬‰j—(}´uý1[VºÁ½ßu¡:R~ƪ¸C–B×ì;fá©úÚ!‘鉒íà7ô’ ÷ÁcTÆ63;µ}Î̀渨ΖÅvdÓ>WêÔ;oè'SÅ”BP(2-––ìÜšçÈ ÖÑ€®³F®m*¥‚ŒÓ×ZF•BL!6mÈî‘]—Ô[ZZº~ãúcˆ_½x@c(X7ÿ½¶Ww‰tì]3wÞÑÈQ3z„ ”xD^–sÏMñ·/œúŸp}VœÎ’oi;`prLfšnñšyu‘Ê Jcû é×ÿª¤wÞ{åéy–:E‰'þ.ò1g–~éÝ#âÆ-ydŠ0áÆñz[þ‘Ò¶× ËA7oE ªíP‚æÚ¸Œx:ÉÜ妫2ƒN)«¨/ ËžpMؤyÓŸºëš$zä×ÕûÏ È:Ë’lµY ú ¯Kmv›VÖ¢¡[B•"[Eææ÷ãw.—ëÜñT’BŒ!áþ¼š/"/4Agþcá žVÂ’ºŒ}ñ‘w®yy/CÆ=ïÎ {íÍÏæ<¶ÈÌtñêvEJl¿ÉÞøä[óŸxȦΙÐqp§ä1/Î.™õÖŠÙSç¹}HTZ÷Œ0É[z3t¾÷½9᯽õùÜKK\ºðÔË&õ¿.#Q¨4G@д={ZÞóóæN_c'œËƘΉF‘BMÙ“ßxZûß9ïMÿŸAˆ ‹4뜔˜’{ì ¢(Þ÷ ‚pIR:úû[B•(¥QQ‘­"ë¾¾ŸŸ@ÍIÅ9çœsEQœN§Íf³X,f³¹¤¤Äl6wíÚ¯K€fOÝ 0Æc.—Ëét:«ÕjµZËÊÊÔBqqqIIIzzúàÁƒ«í~þùçaÆyÞøöðœ•Ùs>›ÜA/PB(=;r”3…q*ˆîß9sÏxUy3gŒ©;**TœKuö¦³7W¿«šwHj,m¡íËF¼–ÍјůZ¢*­ReQ•¢UyÿpθZyûþwoºýÛï/~ ^ WçÚ/_‚\Ñì«´sçÎz^ÂæÀýúõ«V„µk×æææ†………………††šL&£Ñh0ôz½V«UÏEQõ[-ôò€Ÿµoß~ÕªU6›Í½ qït÷ŸìFqFؘûn¢Û?_¶¥€æF«ÕvèСþ¡‘ü,222""u¿ðK'7"/èî À_”yyy. œ¾pñ9]Î;wœ)>ÓÒ6<-%­MB9ß‚ ò4=[·om“ئoŸ¾-jÂÎù¦?78y".6AAΫ ˆ¼MOIiI›Ä6N—³ž×©jZAèœÑùÄÆÄVKr( R{Ayš$õBß-j“c„ûœÉAAj/"/@SM½-o›Qä ‚È Ðôòn 4µl2 ‚‚ø1å#ò ò^¼­&Hx(È‘ IF^Æ/ÞHM¥hËçŸÿwݨ^­$ZçEõC ¥œJA\ù?ÏŸÿGÜèû‡$h/Ò¤UP{Ayšd佘}xÎS¿®øtÛ՗ߨ3\¬û"?lvÀD)ÞõóoÛúÞÀ゘Ŭ'vÿu<¸Cפ ±¡^ú ¹ho ÿÜ "/@3¼ìÌÓ'¾±-qÜܯ×P_ÏçÜÛØÉZÕ%´A†®²’_fMý{‹"EÄÅ%g]1räÃez®`¼Ö‡µXøìÌ}Ãßx;Ñ 4@OpCÄË'œ‚-Ÿ/ZþÃν¹….S\r‡ìácoêÛFhWå­½ ˆ¼ˆ¼gÓMîšå[¾÷“OÿpOY­â¡½=‰ZÕs“k¨yááÎÒ¼gÜõÝ•i°ž9yìÀkæ<´zյϼð¯.&Ÿc3¸çãú~NŒUäâ†x 4PAªÝeï‚iÓ—4f^såí×G‰E‡ÿüö³îùyóŒïï&Ò•.¸ß†ò"ò4ëÈËËw-ÿât» ç¬{ö£¥[n™qi¸;Ô8 6|üî‡ßm?\,G¥$’.¸ŸD-‹ü‡VûÐÕ ¼œpNŒI:w )!—]3lЪÿß‹ÿËxsJ߉:‹¶­œ;oõ–ÅbdZÎÍwß189HôLöœßëùð¾a )!$cÚ‚Y——·5i ¤Ê½X÷,~uÙÁ¨á³ž¿½ƒQ¢”~Õµ—}2ýá^û çI=%¿½÷ÆG{üûOþ¼µë¥e¶ì<3â¾»Rt–c[¾\þæ”æ7žÑFK‰²èÊmÝ{Óý÷¤èËŽþ¾ü£·ŸãçÜÝ9¨Þ£?(Æò òž“ëôºÏvõ}:#XÐg^{™é‰Uks¯{‰ŽVüçâµ17½üðÍIZ¬ÈÜu;vpÎ9WJ|.òóX^Ö0CW¹;óž½MLûDéó½ûómæÃ®<™6ñ­qƒ"eJÚGn¼ç“oŒÍhÇÜÌÌÛz]'•NtañÉm[Ë”RJ|®ÙùBûÖ^V1¤º^”’#G-<:£µV›­kÝ!Ž~{b_¡3GÃ9×'fõî™®£ÝzõL¡“žZ²ø¯«édñ±±íç\Ÿ˜™Ý-]G»fÆäm¶áÇöŒöúzfÞÚ ‚È Ðôø%ÐTã8úý—‡#ߟ¤¥„ëR®ýõÚoþ¹ñ_A‚³pÿq‡)33ªò”.ê|µ,òûXÞIx÷ìpÎ(!œ;òþ9fw|ûîáïЊÛÓæ[•tRqŠçŽüŽz]'…ñÊr¨É>×äzêï‚øåCg ç„Öx$ÎiÕšQÂ9¡TºäÒöº5ÿÉwfɾ6¶]•?ÑD%·¢ß啺êÿtk/"/@ÓÓ½¨¶ý_ýpÊU´ø[—Њ¸Ãxñê]cÚw7rB Q\î3±*b¢ÚóçsQcF^? lð¸Ç©ÝÇœ<"9\R\ Ñu»gÆigû µ­Œ"):û°>×9I ©˜×A]ÛçšòÜ!ò ¦„x-ݺç˜åš(“Çà ë‰]'9n*òòª¸( „+ «¥,¥UþDÐÈ„¹Cäo†ù3Ròò=«-Ž»ááû{…Wd^ôû/­þr{IfNh«ÔDyå_X;¤(%îoõ—}/â~=ŸQF õA*ÿÊý„¹ýèWs×äé{LíÙJ+%ljö#‡yä€Öºž;8¡„»g\ mëcM°–X‹¬.…I%„ø\ó‚žyCÄ“.ýÚë×,üüºôÑiƒm¹ãØÚ?zÞÕ9DàeÜÝÜ„ç©?÷–K1mÃßeqrÏ?9ûo½_0µ‘ iF^ö¢òÒ]ßl*O5 3-Î=­¢¿"áÓÅ_o:Ós`d§17$LY>ëY6ꚬXƒmßQ ¯èT ò¹Èÿóò’Ë[zx×£ÎVtúøÁß|³µ êªésÂEv}uÔ´/^z^qe§(ãÌIsBÿ©F!(ÊH ·ÿ¶åXl¯Ö>Ö[µo«YýÓò•éW%ñ3e‘=.O÷µ&  ‚T¡ïpˤ¡;ŸZþøÃ† ÎN‹oýnõ¯G‚û>tG0‘¸8á¤hÊúuwúiùŠ“áC&u4RBC|l,WŸuÅä¼âœ³ú?ÝÚ ‚È Ðâ#/+ÞúÕv[âÍ="='Zczõk³è£/7ä]6$6éÆ/øÕŠW¾,UD­)"=;AO9çDÓÖç"¿n2á yÅ ˆ0aêŸ]E}«˜ØÄn·?{CÿŽZpÎui·>ólÈ‚…ß/õ 3Ó…´é1¦gÿ”`¹UŸÛ†þööÚÖôÊšæcS÷qw ~ý£¯Îrè"ºÜ”riZ‚÷5…@*HµiH¿cÖk«–~úÛWs¿(vE¶I4iÒˆ~ÉÁáê3´–퟽÷YÒºýõÓ&Üœ®žíæ£t—s¯ãJär~[ímÂiÎ9WÅétÚl6‹Åb6›KJJÌfs×®])¥Ø+´„ã.cŒ1ær¹œN§Ãá°Z­V«µ¬¬LÝ!—””¤§§<»€úûvÝ·}z÷qºœþ|/3…A¬~Î|•›Õ¯¢+OX¢” ÂÙ“³|.ò „½ûövͬ0êYΫH8êS*Ty­óØ6Îg„ê¯Þ×!¼r*¥‚P£ŒõªTÃÄÛ®¾Ês>[瑜ö}ÖSoKÑRµrUjçuc9SxeÝ|¾ôüZµk×æææ†………………††šL&£Ñh0ôz½V«•eY’$QA ”RJÑË @Ÿ6ýyT¼]$¸êÍ”Râ&"/@€FÞìåUŠwýüÛ¶¾70Ƹ@h« zyyÏ—³ðÏ•.ùaç?GÎØDCtj—#ÇÉb•ãeôDƒ¦|D^€ÀÂ*Æ´ú!ÿqë¾E>þñ~]úÀ+o»>1œ”Þ½»È~öŽ(òÎ8k «Í!ò÷7üõM£Ü¶÷ã×>Þ>äÙY3M2¥„~W\é 8‹=аÒ]«çÍ]µio‰Lí>lÂÄaL"%„Ûr¿}ÿÍÞS`çÚÈì‰O=ze¬†â,Ú¶rî¼Õ[‹‘i97ß}Çàä ‘úa«h*bD^€@Œ¼~ø–¿|ϧ_—»?2*£"ïB¥ÔÝ·[ñ ŽCKfLû¸¬û¨ñÓ“é¡ïÏ}ô ëk³nIÖ*ÇV¿ðÖúëï|¢GŒTrº,!D"œsûþ%OL_¥¿vüԉі-Kß}óIûÎ]õ ½îÈË §ÄÏËyšgäUJrs-<ºcë`¡F‡qůœsÎÌÛ?üäHÄõ³•¬hvV¢}Ò´å‹¶™Þ][š_ í²ztí,ö„RÂ9+Û¾påÉ´‰o)SÒ>²pã=Ÿ|s`lFgß§f\ιËå"œø;ñ"òÆü3–—3…sBêåŽ8á¼"\;òÿεgt‹Ñª=ÁÚ¸î +vïÍstKn{õˆÌßç=9é`ß«‡ ½ªOJˆD‰#ÿŸ£v×É·ïþUc3cL›oU¸þ‚“*'œpÂs)®†()"/@`ñ×X^Á#Ó{OX•h©Ú ^^Î9#¤"«ù“V.Ò& ñv×­?¬úìóÿ>üù7?ýôM—HŠK!ºn÷̸#MïîÖÕ¶2Šõx¾œTDüºà°€W@F^Îêý¿¾ý~!Ö߱ߢ(Õ—J¸‹qÆ¥ð”D¹l÷Ÿ'íê"ûÉÍ»Ëåø”V"'ŒÁкë?ýÊ3 {¿øz¿… ¡mãDû‘Ã<²uë„„„Ä„„Ä„„hƒX¯§ÚÀS¦¡— °øo’2C§[îì¿õåÅÓ¦í¿n`Ô¸P¡ìô¡NÆ]7¾OP”‘nÿm˱Ø^­;?åÓ—_ÑÞ<° 9üã’ONƘÜ)˜gÞÆ¯·²Ö‰ázgÞŽ#åÌf é2úê¨i_¼ô¼0âÊNQ:Ç™“æ„þSësöšº½ê†#ò4~¼…ÚíÞW_ÈX²lͦÕsV—*D‰Këy­Ë)Dö¹mèoo¯ý`M¯¬ iI#g<«_ðÁš¹3 IxÛÌ[Ÿºch²–î8³ÿ÷kvÚ9ѶJé5qòu‰2!\—vë3φ,XøýòW¿03]H›czöO ü±É sõ5(³@€íjcŠ¢¸\.§Ói·Û­V«Åb1›Í¥¥¥ÅÅÅEEEEEE‰‰‰ƒ¦”¢h~ôë†_9ç=»õ´;ìþÙ±3¦Õ%„J)JçŒ3BAP‡îª ¥”R¡b×ÎÕž×Ê¿sß^±¾zŸî{¬G4»Ã¾çï=&£©S‡Nç<²¬]»6777,,,,,,44Ôd2FƒÁ ×ëµZ­,Ë’$‰¢(¥”RŠ^^€@ìzðçÀVJiÅ?îGPoÎþ¢fZZeuüéùŒ(¥ÄË\ð&³¼"/@`ñ×$eM.å«ŽÈ Ðb‚/gŒ³–²µêļõî-FähEñ˼¼M)ñ2.Š¢¢(‡‘ ùÁétšÍf£Ñب¹Ó=[¯qKÕÛÂñÇE1Mˆ¼Í_Ú%i»þÞµs×ε՜sI’’Û&7ÄD@ˆ¼%.6Žràð«ÕÚ8螬úBÔˆç¯þͦ²$'&$jdMCl "/\8†‰½,õÆÆÄ¶´­®%C;u8¿ðTDxtBl!çµy AöM€}¬åžV%¿ðt똤 (Œ€ À…ïŽQháQ‚ D„G]Øôò@ÝÒmÕ}Œß‡pÔ"!6©²—ú:Õr`Bä€ó¾»Ð<Çï;•ëu,oLØ’wÑË Í=~—ó*?»JÕLˆ¼à‡˜KjL^ƒú@Ãñ¿[s,¯×C’¯ø‹ P§¼ë¹[*¡DÐp<ÇïÖËë>U ¾^S/"/œ_v§^QQð/_ãwkŽåEÑ3ïÖ~·è¤Ÿé¶ZÒU÷,jØU¡Jà_¾ÆïÖËë>¹OÕ²¯çψ¼pŽà[sHƒº‹‘$|M~ækünͱ¼’$¹#oµá Ë ˜zÝC¦ÜyW–eüË×øÝšcyeY®–zkvô"ò@ÂnµÔ«†]5ïj4”ìàSËÏ„¢ÑhÔÔ«ßjy§¯@ö7œsRõ|5wäUó®F£aŒ}ûí·(42ιz$r÷õVÞP-ø"ò€÷¼ëu¯úaZÝËètº²²²òòò²²2‹Åb±Xl6›Ýnw8.—Ëår)ŠÂãœs÷¹u8 UûjQ£ÑhµZNg0 CpppPPÁ`PGž½¾æ,Cä€óØõ¸{yµZ­¢(Š¢¨qV½]£Ñ8§Ó©æ]D^ð×qGíjÑëõz½Þ`0èõzN§Õj«èÅX^¨×~ÇsTƒ;Î2ÆÔuÜ‘×ét:NÏy >‡QeYV{[t:;øª‘×רD^8¿Nµ]yÝYÖ3ïúêâEä€ 8úÔìèUûzÝÙWíå•eÙרD^¸Ú’$1Æ4Mµ¼+˲;ïº\.Ƙ:æ‘.8òªGA<' RÇõªý»µŒå­vŸˆ¼àsCᜠ‚ þ+Š¢g~U÷DžCÜý»jÞU{yÕ;A=à¼@î ª¹¯²¦¦^wðõüÁsž2Aܹ‘Îc¿£¦^ιšzÕEž£{ÝS4xÒ€È y« oðœ¾Ú¿ç¼"/xßݨãÔÀêþÐì^êÞ¹\.I’<îšwÑÅ õO½îŽÛšÁ×óψG/æå€óÛï¸#¯çÇnƘ;ï²JÕ†ð"òÀGÞjgQ{ßj?ã‚ÃPߎªZG¯yEQdjž²†È |ôñšz}ñ5]"/Ô¶»q_sØ3õzvñº0T »È»Ð©×s¨Cµkæ]ÏãÅ já^Ýܼc@Þ€†H½¤F§oÍk {Í»½¼pÎÝM;^âq~[µ¤‹¼ ”z½f_âídµšÐË çV3Èz\_Küžz=ão-Ky ¾Á·Ž?ø=øÖñgD^ðgöEÒ€‹•}Ï™ty A²/ÀÅʾˆ¼Ðrý?þ¸iÃ1Ó@IEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_design_reports_vertical_group.png0000644000175000017500000021377312235000130030472 0ustar00murraycmurrayc00000000000000‰PNG  IHDRžLS€¦·sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwxUÛÀáß™-ÙôP’:ÒA@‘"ØðµP,¨ˆby±¡b}­н*EŠ Š"*‚"Jd BHHßÝ™ùþØRv“)žûº¸€Ý™3çœ}æÙ3sf@!„B!„B!„B!„B!„BœoT1¯÷·B!„fq[½¬¤V¬Xa¸\.\.ééé=z›Í†¦i†JC+zš†a‚R ¥©RÍLMCÇ@ÃRp£˜zN}40tãTËò5H³ ©œ:¢<嘆ʢ¡rÊ)z]SYrÚmbè&húÁ0Ðs˧à:¹mÉS‡3ÞnéÉíSMy>³S¯çô‹vVýR’6 !„¢8º®Wt|2MÃ0¨V­ÁÁÁØl6l6íÚµ “dš€QàoÀ[âIVVN§“мysºu놿¿¾E!„BœÿöîÝ˲eËèÞ½{©årÙÙÙìß¿Ÿ={ö‰ŸŸ€O¢iz¿ |xfggsðàA®¿þz‚‚‚N½ašÞƾ„B!ÄùL)…®ë¥–xZ­VêÔ©Cdd$Ë–-#<<ÀO¢éÎó·ÊùÛ”×Ïôôtš7ož/éB!„&¥.—«ÔÏ^[­Vbbb8~ü8xF<Ý€pqzNЩÓï^G<?ΕW^)#œB!„•€R ·Û]&—MFDDžO…“N#çÿÞG<ýüüðL$B!„´²ñÌ-Ûf³'ñ´P8é´à9õîur‘Ò4MF;…B!*‰²ñÐ4 <§Úó&:ù¯õô>â ž‰D’| !„B\ørÏ2æÈù;7étçüÑÈIH½Žxrš]qÑ3²S8| kt"•ãvr•±MBˆâišVdâ™3bY(ÿóõº~äO:]x’ÎÜijèO¹o§¢T¹ðó[¯2uÍNd›€Â/¨*QõÛpE¿ëè×& ‡VÑ•ô0“ÿäé»Þc“É Þcpm›ï…]{ùòáÇøúAÔ­ïòÑ-µ±Ÿ‡áóŒÚ$„¨T”R>“GMÓhÖ¬š¦±{÷nNž< @HHqqq†Á¦M›JrS{ž„ÓŠçºÎ|I'ø¸<È=;…eÀÈähü~’2trÃ_FÊQâ×üÌžµKØ0b,£¯ªq^$m¦©ã4ržpfµzžäå+,š&†®£ë¦²aÕÀô¹pÅ9£6 !*¥”ÏÜÎår¡ë:‹…¸¸8víÚ@\\Ü©„µ´&&ùL< Ã85¼*„¥Â41L¨9ø#ƪ…ž¸™o_{Ž);ÒXñó:R®ìMu ÐO²åçÉLœ»‚mG]G7¦ÇMCÜ5– pþËœÇóóæ½<‘‰®¯Ó„ËÜÆ-cðÏ _F*Ûþ’I?­`ëÁlcÒåº;¸½G=5À}„ÅÓ&óãÊü{4™ 7ø×êÃó£êå<àí_Þ#Ó{'ãÞèG´­à3ƒÍÓ–U (p¼™Î†I¯ñÞ¢]MÓÁ/„Z.ç–»o¡kL¼pïnÒñïò<Ÿ¼„ ÍÅž©2òûà †óù+=‰ÐÒŠl‡™ò£îþmF ¾óc ¶|p?£§bo÷,ŸhIà©:• MBˆJC)U䈧ÛíæçŸ¦_¿~X,4hpê=Ã0˜?>áááX­>ÓÆXúÌ,eÄSQúNÇ¥YÐLkPªÛP€™™†KÓPd±kÆs<õù"¶ÊÀÏß yÿ~x÷y>^‚nîã¬[¶½‰i8M Vw*‡w¯dæØÇøß/‡qš€™ÉŽ©£yâ³ßذ/§žÅ‰½™÷á(ž³lpäÏŸV°eßqR³V¥“¦W¥j€•Ü÷ÖàBÈ!ÀÏJá­˜x©,h©‡8’a%0ÈÊ8ÁÞusxsÌþusI·8LÓàäæµ$ ôd6®=Œ®ëÔë~5.v׎œg'º‰f÷êSG×uteÃÏ–?Üß&!De‘›xæN/øÇb±0oÞ=wEµv×Ñ~ò›üóïLÆýkb˜õ¹¶{4VÝ5¢I±íÐô0€Ôd6m>†^7¨pϤMBˆJ¥¨O·ÛÛíÆ4MæÏŸ*Áœ7o}ûöÅ4ÍR»ù¼ÜNIQq”˜^wÐÿçç˜s$‘¹_,âÚ×®&2ârnï9›=ÎÆI£¸u²«Òq›vÚÇS—äI”Nòëèü倬,Ã0 ï3—ƒ²vâΫ¿ç©y‡YóùSÜþ…Â4 Ó¤îM·Ñ&Xaœ(P§ÜÐçW‹Žl,ßÍÆ·‡òŸOm¸ºóÊ;wÑØ_ó™¨íŸ:‚k¦çyׯ5OŒ¬G0 $ïýœÃ'64‹ø #ß(© iÎõÝ«²ì§D\&X[^G—( z¶ ­Zgî¼ú‡¢Û‘Y—žíCX¼0™„‰#¸~†•™‘ÿvIgÙ&!Ä…-÷T»¯K(Ýn7S§NÅ4MÂÃÉŒŒD)Å‘#G˜ËƒÖÉ|·lû“3Pö@ª†×¢Å%Õ°)ÐϤMBˆJ£¸ÄÓb±Ð¤I€|Éett4ááá…^?§ºxyÍ6}útgÏž=q8^ÞBˆ³g&¶€@ìV Ê™NºÓÓÀ°8rXQš†ž•N–ÛóãW³Ù±[­X´Ü_˜èÙ™d§­ã•»_g•3„¾c'ðp¥yî¡©;ÉÊvŸJ¤LÓD³úa·Y°h``¸œd»tLL CÃäMÓÐ3ÓÉÒOe‘˜¦›Ÿ›UóoÓMVf6ºé£]…nR§Ð,Y©™èv»K¾›0d§g¢+7Gÿz—GÞ_EZX_ÞùlMµL²ò\ Pt;r—«Ý›ÕBž.Ãpg‘å4ΨMBˆÊ!--Í›7TüÂg)!!Þd9Òóü;È’SíBˆr¥4…;+wþÑ 'ÎüË*…év‘í.zÞµÒ4Lg>2'¥¦î$Ûëuñ M3qfdàôòžRngîÂoß®‚tÙ™Úb¦±lÌ#¼·9ìlݰsÙЛhâoàÊÈßž¢Û‘» è®ltŸ]Vò6 !*«ÕЦiþ8t9Õ.„¸09¡çâ>Ibde¹1bètÓC;ŽkqX5”2Ñd8u¹¡»¢Ô„‡‡³wï^+tÔSNµ !.PžSäYiid¿ðyMiàÎJ'­¢+"„¨´ªV­Jff&‡& »Ý^! ¨ÏÄÓßß_’O!„BˆJÀétCXX;wîääÉ“¥Z~IsFñB!„¸deeáïïOÇŽK½ì¯¿þºDËùL<…B!Dåâr¹Jí¹ëgCF<…B!D¹(t«c¤S!„B”>¯‰gEß\T!„BT>^O!„B!J›$žB!„¢\Hâ)„B!Ê…$žB!„¢\Hâ)„B!Ê…$žB!„¢\Hâ)„B!Ê…ÄSn /„B!J—Œx !„Bˆr!‰§B!„(’x !„Bˆrá=ñ”K<…B!D)“O!„BQ.$ñB!„åBO!„BQ.¼'žªœk!„B!*=#žyiü»~)ógÏeÙQ—÷ùMz2›ÏaêÄ©,<à”9PB!Dea$³aö|¾è Î åo$³aÎd&ýqÈwÝÇøcü댙·ìònWEnÛ«·ÍŠHé²¶1áÅÿ㟬 ®®ß“vá6TÁü7{_½;¿³‚è×îFzDSx™ó™‘ÉÁ-›ØÔ„6u‚°œ¯e !„¸(%ìßÍú-«p¹\u‹«ÕFÏ.ý .½»“Y5ç{´éÄ nQå{€?Ûc©;™U³gñs›öÜÒµ†÷:)l^²”u]ÿƒašgÖ._õrÆ3ñ‰çXÚüYÞ¿»1dy_î\¶]F¼&žgÌLaá·1f«ák?mø0_½ŠêVß6 Ã0‹L| ÓÀ4‹^漕½›)/¿ÄŽóil–ÒøüË¢L!„¥ [WÓ®UgB‚C)êìç¿ö°yÇ:Úµê‚*q2c¾û7&~>‹E›’â²CãnƒyôövT0 ÌŠ8¼ŸË±´$u6Ï2kñU/å ¼F4ÑÕД‚¬"ê¶Û.#Þϳ¨¡²hèºËgâiÕÔyÕðŠb–Á—ª,ÊBqñ±Y­T­R½Ød2²z ŽŸ8zFeÉ«xgô, èÀàa‰ rq|ÿNvi¡øk€~/çë±Ôk½lÑô{r W+ M±Üy¨tF®žâ©A‹§§3¶‹?ç¾ÊÓSÖr(CÇCë~÷ðÈÀ6§Gˆ}Õ«®2;Ûù÷× ¼3m1[³1ý"èxï+<×'»ŒŠ !„ðÂf³c³ÚŠÅTàï8£²]W°î¤ƒîOþ—;Zæ$L=1QžQ»I _cð/Iœt8†*À(ê8œÉº±w1jSO>7”†~*c=¯ÜñûoÇ×DaSI ŸbЇvžüüt¯jÉ—œÕñHYý9Þµ‡]GuÂb[Ò玸­}¸ïã­ëk¿ǸÙ+Ù¬Þ¨ ƒFÜC߸@¯£­…êÕ.‰É<Ì‚6o0ix#>—󒉞á¶K[é$ž€Ò,9‰•åTö ‹‹¦*õG2­ÛÉHN"aÍw¼ö’µ?BýæÝç5jŽA«`K êuS×Ñü'©½Õÿ\·]ÚJ-ñ,žƒæOdþƒNÒRN’vl ¯<>™ûV°éÄ@ê‡æ.BÏׯ3ª¥ýsŸáÞñÛ8²`&ë†4¥“—}ÜHZÊ'3÷ãÖc¸íÝ·ÒÐÊáŸå®O¶òû×+Þ¶µûcÈñ…‰éM¯(›ÏN5S×1ñë=„ßðÏßÞÿÜ Z)H]Á¤™{‰ð£ÕÇ_StnS‡ìûF2ã˵\û|{BL“€ØÖtnÛ‡jKë裬~ì/'ÜK«z9=Qµqqµ°+N}¹ƒêµ§[Îû4ªÆþ?ä—õGpµEKó]/•é½Ìì½GI1iÖº—5ö|9Tá/¸B‘Ën-Yâi³Z±aâi©Ñ‹§Gîà…ßfèòohwÕÕ\íU´©éŸo2OpƒNôèÐ .<ÄÊG=ÇЖµ7{nÔ•–ùgW:W‡‘´y-Ç”†kûJþÍnO¨åË7gQëšTñ2¼w¦ÇçÜzWë<ˆ;®iì©S»÷äû¯Ö3è…„؆™ºŽ‰?¤Ñ½¸·w6Í"“X6ìæï¾›–- Í*T/§÷ϧðrç¾íÒV~‰§‘ºoòæ×ëH4ÓÄ0 LÒIÊpcžJ<‡ ‹ÅŸØNW7a;;²°û„‹N…‹uÜ@‚nb²/È4˜ºaÂÑÝ$ºMªGvàŽÇÛc*å%û?Íul ñYA\Ò6‡¦åë|ç±­ìÉæ’¶5O¿çˆ¡]ó@¾Ú¼£Îö„œúYãYQ)…_dájGNºOý,QJåü9µeŽ®œÉ¸é¿²*þ™Z–,ÛÉ,ôbêuj‹Êô« ·¶ú‹OŸ¹—]ݯáÆëûÑ­AEÌíBq‘óŒxªÝj³cµœYâ vj]5’ñ²qéoü4o:£çNç’Á/ðÒÀÆœžï9–)¥ð‹8} u-Áq8¬)]cÝL[º‡¬v±lþûuoˆí‡Å¬<褱}«NDÐáÒjx«ý™ŸO¯¨^×/†vMùjÛN]-0äéJÜοYn¾7WóbNNä8–‰AáQÒÂõò®¸åÎfÛ¥­ÜÏŒ ãyù«µ¤˜µè}ûµ´ØËwãæ¯ûžËdèN\&˜hhš÷^4ÜY¸¨J‡¾Ý¨é8=ªg ¾„*åÈ×J0Úgê˜(TQ½^ Ï—ÓÄW+”Å:®œ+~=‹ç_Öµ/¼4´n÷0jXSªû˜7æm–”°^ÞÊÄ^‡_þ‚v«áÛY³x}ä,~òcn­O€¾Bqq³Ùl%<ÕnÅf³žùm¿•†50ŠVW ¡å•7pÝ—3rÚ;|×é}n¯Yø8šÿš;zS`™¼ÇaK8m;EóéK‰OÊfÑž0:»œÕß2oí®²ýÅþÐ6t‰ñ+”œÕñÙC7Ƚô°Pn ´{øU†5väék…õÐBD^ñ^”h¹3ÜvYðšx–üÖ%¥“²w/i¦ ±½< 5õ ¬ž<øt«Él˜û{M‚âhRÕ ÊŠŸ ƒC‡31šàÑ”hþb'idDvaЀƄZL\'qÂ?ŠH›Â}|%3§-æHÍ^Ü~] ªúèY[µúÔ´}˦Uq6¯#O?ØÂRÛþ ›VÂÙ<Îóžë+7§b«Õp»B¹‹é‹ÁvÈHÎDÏs?­ìëˆ×ërÿ~t¬aEéÁláÔŽ]T½|•  ¬Ônw=ÿ½ìJº}4‚Q³ç²ãú‘´ SîB! ³YíX4Kñ‰§fÁbõ}éZq”R(K ;´¤Ê× ØyÌ]LÝÂQÛ>³èã06jv»ŠØs˜·à([Ú2¤f$]k0þ÷_ø‘½Tïþuý Ïòøì™ÏÒ-øÅÕ§º p{Š3uÃÓwÕâ¨iË&!jô®C@QcEãKºÜYo»Œ”Óˆ§…*õJu¿Ùdé:†i¥Ùmi¨¡ôHšFÃ;]¬;‚—'ð|»+ÖgOÎOdä'¸i²›¦ã2ìtúß^¼Ì„ÙŸòÅüCèì"¢í ¬m÷ÚÑ*¬-C¯‰â¡Y/òƒèÛ,¿ÌãdÖîJ÷º­: ÷ý ¯;n§O]ˆÿm 3Æ0è©6„”$Y·†Ó<ÎÎw¿OçÛ&ý©g'5²#Ý"Å ~˜6‡à+šãŒyò"ëë£Ìª[˜¿Ú vÝêø»³6! # 2Ú)„›Í×äÛü”Ò°Y­œÉgÖŽ¼57‹¸Æuˆ BL`é·ó9nmB‡Z…G m3¸dÇakTú×ÌGÓW~ã`bí6l¯ zÒ$f‘ ~¼6~7v–Çç\éÿ®cùêLü3°jî—üX‡;þׂ M%ˆ!¸öVî«IçÚí¸³ þûÃË<¯ ¢«8²9p2–^}’÷ÚSõêW {òµ\ÃsØvñvs~Ë7Þø\\\ÜYŽ|º8°è[Ð!²·ö¬…ŸRX«7§eh2 {ösðè1Ž%¦`ø…Q³qzôhO½ ã{vp0å$'3²q~T­Ó’«ïÍc}b=§‡µ ê4©NÊîì9nçÒ뮣]x ÑmzÐ2(™GN”œN¶¡\£!­:v¥u”?ë Ö¯ÚÞ û¶ÌùUäê-»ÒÂo?ËþÌó~aá꽨ú]èR/Œê—t¢¥c/Λͬù+ØooÁÀQ£Ø4Ä3<­'³vÞOìŠîÍ m«cS ²øùÛ¿Ñ.¿‘^µC‰nIÊÆß™={>¿®IÀY£=Ý;\Æ¥Õ’Y÷뾟7ŸüE¼Š Qûž\uI¬ªˆzÅU£¦—2Û¯eÊ'™6û'~úm5‡ªvfèÈÛéé‡äžB!¼IMK&,´J± hJj Îì,Júä"ƒìûÙ´üÌÿ‰ù¿-fѪÝdDwå¶‘Ò?.‹‘Rô1´V ÕŠ;hTUkù~¹…þ÷¤m5–€0²—ÍaUȹ¥%U ÏvuVÇg7Éÿî`û¦¥üüó/ü¶|')Õ:0tôcÜP?ØS'-€¨(ÛþœÏ’Œ6ôkET«Ëiáw€•þÊœ¹ X¸jIŽútîP—à¼ÉŸz]Þ6äí+ÍßûrÍ¢¨u¶Û>C»wïæÛo¿ýp./Ü€ÛÛlÓ§OwöêÕë¬O¹›†î¹‘¼Òrn¥”óºi`î ¯šæ¹¥ižG:åyOå¹9jN)žII¦çN§nœšûD#Ó˺fΑ”çZÑâZ•¿,…Ò´üÛÉmƒRh*ïdŸÜ SyÛmz®õ8U×ÓõrÊV^úF¡´ü“¡|×ËK™S—<ý¬¼OLB!2²Ò9™vÃ0Š\N)Eõ*5Îlf»ib˜&fãüécSIޡŇsW3Ð ò¿ ƒüyI•Îêøì-w)T§Ü Õyò¢‚y‹R¾æ³x«ÞûÊKýÏmÛ%÷Ë/¿0pàÀL #çOzžgYerªýô== ¼®4T@UšV‚ç£*4­ðRª¨¤JixYÅ÷Š(«è6x«›B³XŠY¦ø¾)º®ô½{ IDAT^ÞËÌ¿]!„¢hŽ@Þïš}Ί¹³LÉŽ¡%;^¢4 }å&Eo¿”rå£%Êõ|ã½õ•·d眶]úÊzÖ¼B!„€$žB!„¢œHâ)„B!Ê…$žB!„¢\Hâ)„B!Ê…$žB!„¢\Hâ)„B!Ê…$žB!„¢\Hâ)„B!Ê…$žB!„¢\Hâ)„B!Ê…$žB!„¢\Hâ)„B!Ê…$žB!„¢\Hâ)„B!Ê…$žB!„¢\Hâ)„B!Ê…$žB!„¢\X+º¢ì¹\N–þ³˜ä䘘]!P»VZ·jRª¢«R¡$> q~)ëØ$‰çEàïåK¥K§]!.&¦×(ÿ‹§—9ó„ié²%lÚ²žæM[^ÔɧÄ'!ÎÄ…›$ñ¼¤¦ž¤s‡nhš\Y!Äù¢U‹6lÚ¼®¢«Qá$> q~)ëØ$‰çE@)°Ùlõ¨Šç‹Å"ÉŸ„8ß”ul’Äó" ”’À.ÄyFÓ‹„`‰OBœ_Ê:6IÔ»hš†Õj•À.ÄyDÓ4ñDâ“盲ŽM^K6L£Ì6(ÊŸÜ„8ÿ(J¾›Ÿ„8Ï”ulòZ²¦$T&ÊÛçi$³þ» LXx§ÜÁäìHŠs¤£|îcü1þuÆÌÛGv9ì×^ã“¢B•elº¸¾ñF&7­dEBzE×¥yQp'±læ fo<Ûû½.\Fû7üÃ?ñ©èeÙ´²ìÃòjƒ¨8J•ïéeg<ÿ;˜{&l%Ã0ÁÈä·xh¤°yÉRÖÌÂ(‡ØpÑŒxÊwZ\(Ê86•Þ5žF2¾>’×þNÄmØ ¨EÓ.ýxÓ•4 µPá¿í³w3åå—Ø1àc> ÂRá*>w Óðq?° \ÖN¾xæ¶Þ<‘Iuƒ±”å¶Êª˳ ¢Â”Zp×óýÈ{ùd·÷ ¥ê3ò³G¨^#šèêžÑŒ¬ÝLöÍò»•»×>0’YüÊ^úý™&€†_h4MÛ^É­÷ ¤k”ß™OœÇX1ó3&ýº†í ‰dhAD5ºŒ>ƒGpWçp¬e}<(¯ïtiõ~ˆo†ßÆ{»t ¯;C#žœù!×EX+þØ.JÝ…‘xâæäÑD\Ñxþþ6›$ƯbÎŒ÷ùïÚ#|ðæ¨ ßAM£’&[E¸hFò0 ã‚ JehƒðM•樂VνLLªp’ðÝX>ÝÖœ]C-?…²S¯Zmª>9†~JCËÙìù½Ç'É‘Q{cF¶!ÐÊ‘ø5Ì›:™'×&ñé—#i¨•øxbfl峑3q›?Íú^ËÝÿ©Cu-™ø 8î,ÍÖ­|¾Ó¥ÔwZ5º=6†Ú©:à$þëWyKKþ;úêäìSqçÀ’(u¥›¼(ÝYí&RKZ\B‹‚Öíh“Ä —° á?4lârŸ`í÷ã7{%»“5ÂuaЈ{èˆÅHäÏqï0åŸÝ<ž†ÓBL£NÜtÏô©Ÿç¹‘ÂÆÙã7{Ûš„7hÇ Ã†3 Y¨gýË¿üˆÉl&áH*Niýð{¼z¹ç ÿïäû¸zЧ°OOgl—Sý‹?~‹ÉË÷p$)§ $¢a;nqýêbQ.öÏy•§§¬åP†Ž-$†Öýîá‘m¨nU§×_Ï‘8ñ'ªeon쨱æ—ßYŸ UêÒá?òȵ Îm”Ëw¿h©«yçñ±lmó ï kFvf;DQ;PòŠOxàÖx¶Ñ©Z÷Rú{”»:E`Wi¬xil¹†/&ÝMC‡†ÂÉ®ÏïâÎ9-ø`Úã´ *"x©lúþ#ÞŸõ7›¦b©Ò˜›^ËÍÑÌÖÏúfýÍ–#&;róqË%ažÏ/c=/Ýú(Ûnþ‚Iƒc±+p˜ÉÐÛ¦Roì4^h‘Áïï½ÊgÇs(1 § "²qGnä!®kxz$!aÂPºæùw«¿ç£®:˾x‡ ¿o$áÐI²¦íosËêGµõÚ³kgYö¡·6t+¦ÿ2Xýê@^߇Ϧ §±CC¥¯á¹[žàß¡_òÙ€hlÊàø‚‘\ÿ–ç§=“_çó|ô¥UÊT©we#¢A Âȉ$Ԡɥ­iâðlC¹ö2ñÞ‡YÐæ & o„#gÕBñ°—Ĩ˜øôöãcÙVÚñ)çxÒ¢e Â4m;Ñ¡Ê.ú¿º†•G’Éœzm)Á÷ÖÌdë”ט¸­:7¾õµÖSG³ÏÈMÄJ—J£ï”ÈÆ­‰ “€Å~Eó6—ÑÜßócA™'YÿÄ¢ÊèÂIæÝç5jŽA+¿4v­ZÏ¡¨[y_}ü3ö³rÞ Þ¹“ÔÇpK¬…“Ý3žæ±ii´8ŒêiÄÿ6…q£F“õÁÛ ©ç‡ÒSØüç2ªÝÌÈû𦧣ÅUŪï?šç{EbSQä‹“z:ñk7q4z >ÔÿÔY2s ï?o%泇¸4ÐBX³>ÜýØu„ê]3‹fŒá£úx¶C–Üõkâ‰Gá—´‘YŸÎâƒõ5è1x0O $iÙ4>™ðU›ŒcD#š*º_Zbât:qºÎînExêZ ÉíÕ³Ù¾`“G?DÖG_ðp³@÷lßÂå¬;~' kj`œdËʃؚÞOÝ"G¯ìžú(Ã??NÛAÃx¹E8$'å‡RÙìœü#&ž¤ÓíòzÅΟ?デ%ó³ZßºŽ‘÷tŸix^ÐÓØ½rGjÞÎÓ6& 5EÓ?ãÍQVjO{œ69͸áE^é…])‚j£{Ù¸h){ª fÔC- 3Ò°4¨Eã*-ñûýlÚY–}è£ ÅöŸ?õ»6ƺ`=Û’ ×ÐÈ>¸ŠM©nŽ/'í†(ª¨Lv/Û^w8ÍÓ™³ªˆ¾,&1g¯ÔGTîþ¤È-Vå{L]G7ò?D¯p<,X§âã“«Œâ“§- eºH9°ž9?îÆ¬Þƒ–ÕChسeɾ[é›™1g?öŽ/rç¥U°çÉ`N÷6;§T®¸T*}—wŸÊS®çu‰E•Õ…5âyŠ+3c{×2wÂbRì-èQÏi«™øÃAÝ;{{G`SÐ,2‰eþaþî»iÙÄÓ$ ¶ ]:4Æ_kO§Ž цfÚ—›è7º Aéë˜4s/Þaô úøkŠÎmê}ßHf|¹–kŸoO(€iX·-]Ú6Æ_áù¢dzjç¨Z‹¸¸ZØ•¬Þ4 ˆmMç¶q¨¶´Ž>ÊêÇþbq½´jêOP½öt«—³l£jìÿóA~YWûPϯZÓ$ öR:´nŒC]BÔÑ¥Ü3³W]Û‹¶Aª…ƒõKþǪµGp5ŠÅžº®è~iÙ†Q_|ƒ‰†å G èY£ÕºÝÁ=š )ºulˆqÇ}|=e w¼Þ…°æ½hå÷?~Y“ÄÑ‘XÓw±tF£ëXÄNi¦®fÜ´]DÜò¯ÜÓ˜ÀÜ:+©+?}‘·~Ì w6"PStm[‡ì;îçËÏW3àµNT)¶E&`P·-];4#@ëÀe1GXñÀb~Ý“IëœÏÆ¿Z,Æžþœxö‹úèÖ¡ZNήeÙ‡¹ ¶ÁL]^lÿ…6íA#ËÛ,ّƵ‘Á$mXÅQ4\Ûþaof'¬ûø{C&±ZQÕâ*º/›R†ñç¢w>ÜN©P<,pêÙ¬ÀøÄúéÛãTÚŒiÔâ¦7‡ri°K ¿[î”ÝìN7‰jY÷ô¦ÌÔÕ•..•FßÙÚô™Ä¢ WYƦÒO<7¿ÉÍ׌õüÛ4±ÖêÂð×FЭšwÂvþÍrsðý»¹úN-cŽc™Mr ñübWJa jÈåÍÌݵDWüŽmeOv0—´­‰CÓ<;¢#†vÍùjó6Ž:Û¢å)‡ÂÉen6_ôN¬N-ëG¸ZÀ‘“nÀÅÑ•37ýWVÅ#S À’e`;™U`¦|îúvªÆVA9“IvælÛQZa°5)Ã4q%Ó/`ÕÎþRtMÓ ÿ‚95$bɹY¬ÿX:6bÊæ$º»P%¸%ýš[xaÁjŽ_}5aû–³);–ÛZ„bÓ|ÿâvÝÄ®¬`Zuˆ%ÐbÉ7¢œ}t3»³ƒiÙ¡öé÷êЩU_®ßÂ1W'ªœªÛéÏ)·îмíðÔ[ÓþQ ˆd‡O§—Õ<÷";µ}/ëp–í,Ë>ÄGœ%鿪-¸¢®›‰KâÉì\—&nÈØgþʲC.šÙ×°<)’.m#°k‹íK öeCSçÇ ä‹‹‡Ÿ çƒ'/#'é‰{Yõã$&=ùúÛxüÒ%ún©œûRkV‹Ïv–è{u¡Å¥Rè»<…žŽI9í—XTy•ul*ýijî^{¸ AÙÛ˜þê8ÖTkAǸ¬ œ†í~•ay¾¨ ÿê¡XÕIï•´YÝs óÔ*ùxÊÊ»€wžÅÎìâneñÆŽË4qíŸÍ /M'­Û=ŒÖ”jÆ>æy›%E¬oµ[Q8OߚĴb·€¡çœ²)¶_Ψº…œÉdè†'‘ÐBh}Í¥Ø^šÇ߉ÝiúÇ?œˆîMÛêÅì6†Ži*|nÖ¤PÉýüLP ›œnOŸ• Ú(‹ÃóåL¿<£ÏùlÛéC©ôaQm(®ÿ,tèV“÷¾ÿƒÝdzøuWº=p¡+¾âûU‡èk[Ì¿aíéV˯‡˜})ÊNE?­§Dß“ŠŒOÑÔoPßsb£f´n]‹ä[æÇY[¹¿uÛ}·¬¡±DÛaíæýd5ójϧ²Å¥Rè»bI,ª´Ê26•~JEýõiÒ²O<Ó°õãx}vY&X«ÅQÓ–MBÔˆ­CÝ:u¨W§õêÄd¥P6 à:ÄÊm騢ã¨f[DCjÛSÙ´úÎÜ/°ë+7§b«Õp{¿-~Û!#9ý,§rfXO¼^—‡ô£cÓ4jÒ”º!gUÔ)Å÷˹)édfìâé8ê4ÊéGªíÒ;d;ßþ¼’…KŽQ»OwbìE_kcoD-[ ë– «@?Û#šPÇï$ë—<ýžs?ËÖ§b¯Ý„H?…²†R3Dq|×~2Îæc²øêéI%ýœÏ®Þ”VújC‰úµ®¸šº)ñý¼Ùl è@§˜(ÚõˆâÀ‚ùaÞÂ{ö!ÎQñw™¸¨© ~XGñP)0uÏHaEǧÓ#² åÎ Ùiâq •ô»| 7õ¬Bú¢ñ|»#Ãë­*k\:ç¾+‚Ä¢J¬ŒcSN.Òm1”g¬áá)ïò]û1 ŒmÇýkðß^æymý[ÕÀ‘È“±ôêÛ˜Üü-ié ¾¬}Í«»Ø½p*3TãºGZª)Tpk†¨Åý_¿ÂëŽÛéSâ›ÂŒƒ1 zª !E1k8Íãì|÷ût¾mÒŸzæqR#;Ò³Ih‰gÌÙ#Å ~˜6‡à+šãŒéçÖ]ZXÑýœ¾æœfµ5¢‘°š¿Wd±eß}ÎÌcqÜûÆ¥çöc`3n¹!†ÙSÞf«÷w«‰½˜ýQUéÀðÑÜ3ýIž2ïäÚ–Q82ɨӞqm¹ï–Xîøòþç×ÔWìœÿ“ÔâÎÿµ%T)°EÓ½W,ã>{W'ep]ó,·s¢¤ÁÞI‹¾úe_5@}3‘“5ºÐ·aœE;s•EúlCóô`­ÙêçíIˈ¸u(uülØ/ïMÍqã˜aD1ô™º8ä¼U…«ÐO_ñ°a5B qí¬ÜW“ε‹Oç2«½ÈÏ”x6¬ #PÏàÄm,™=ƒEiÑÜÜ·þJ•컥Bh{ïã\½üY& ¿‡­7_K—&µ©f9ÉÁ[ØWëîsÅ¥ìí¼?ä~æ4yƒï_lC°·>/¾+‚ ‘XT™]€“‹rhþ4ø0×,ÍÔOÿäŠW®¢éб¼6žÏLãÿ~8‰î£^Ç»èÜûtâ©ù¥±zæû|sÌ ´vsnzîîhš;ûÜúC^clÀxÆÍù˜çMªÇ]ÆÝÿw/ÿià È˜§…ÑaøÃôã ¦y‘lÿÚjL·&¡%¾™¯=vÏ?”ȻӧòúB'&` Š i̹ÜÞŸ¦wùî—`Lt·Ž~–»ðºY‚¨ßæª-™ÎóOd¢ÛˆiÒ•Ç?½—ëâüóô£:ýÒúËÿcUƒÛèm/Á0y͆ÄU>à“ÙŸñÜŒT G4WŒlM¸(Þõ~À‡ß¾ËãGM¶cÄ{3°QîvmÔ¹õ5^My“O¾‹''¹ÑüC oКfU¬ÅŸáÒªÐåáǹáåO˜üÒ“dùGÒáΦôlXÔJgÑβìC_mh^·ýXjpùµÍxçÍDz]Y‡RhQ]é7Ž÷\ýè]Û¯èïŠ(se=s´X>ãa-zÜýþ|{ãçv¡íˆ&ÅÆ'£´ãV¢±/šÌÿ X­NL³þ<þÀ ®k’oKöݲTíÌ3SÆÓúóÏùxóëdÜØ©R»—ßìBÇïŠKF6)™:¡±U°•qßùæXTI•ulòV²múôéÎ^½zñ†MCÇ(4³ÑÄÐ LuúuÓ40MóÔ¥.JåLÌp&ðÅð˜ßæM&ÝׇâÔèiÁÓ4 L#çI¥Ð”–ç‹oæÜ¨×Û,Ëœ÷r·­inâm]OÐ<PçÛ¶§”¦rÊñ²¾iàYýôi o}å³_rÊ̽èúL­^·œË;_Qèó4 #ÿ#ñ õcÎr'Wòòç8<|2ï]‰­„U(ØOJ;=ÑÈ4 ãTC½o×gý ïS?#ïŸ3^Ö;·v–múÞWKÒžýÎÌßajX,ùû­è¾e!9åñ{vÑ ®q©yÏç¬òÅŸ±ÍÛ>–3y¨Dq»Ìâ“—'æxÙ×KþÝ2=ñÈô»/œ¸d$þĽÿùˆˆ13x¥]Háãc©÷¯}JbQet¶±é—_~aàÀ7™@FΟô<ÿβJuÄSi/#‡ Í’ÿUåmÇÌ_šVô­9”ÒP>‡)šÏY–E½çëýüm8ãm+ K¡— ÷•ï~)®ÎEóµã(Mó=ÒkfrhÛRŒ“¬ûê ~ ºŽOºç+´^)´³,ûÐ×ç^’þ+Ù~W’¾eA¡¼ÿô/²}Åbo±ÍÛ>¦Î$n—U|òÖ†E}·|oÉ3£¼Èº\q H_Í¡ð«x¨y×ϤôûÎw™‹*Ÿ²ŒMPÖ§ÚŅ˵Ÿ^ˆ) VÂ[ôãù7†Ò,ÀóK×HY‹÷Œe³îí†Ñ.;‹ÿk|aüB-Ëv^,}(Dy+â»U)Ó¾à¶Ïð×VÇY´¹²÷8ï•ê©ösWÔ)rq¶Ö¬_A×N=ÎðóÌ9ížÑ­À)»Ü÷¼PÔi‘²lçÅÒ‡âl¤¤$³;a' ê•þ©ö Iéǧʠ,ÛWÙûNœ«³MrªýÜÛ)áÛ™_,¬°X}]j^Ô{š²lçÅÒ‡Bœ›ÒO•AY¶¯²÷8ßg‰§(+¦ižOIBˆ‚$> qñÄó"àïdëöÍ4kr ¹P[ˆ"™ùnîmæ¼–ÿÿ§_˱„YÂS†ÁÎÝÛ º¨O³ƒÄ'!Jªp|1/ÈØ$‰çE A\CvÅïà¿VtU„9ªV©FLt튮F…“ø$Äù¥¬c“$ž«ÕF£M+ºBˆ¼^ŸO}±‘ø$Äy¦Œc“$ž‰‹ýtžâü%ñIˆ‹‡\Í-„B!Ê…$žB!„¢\Hâ)„B!Ê…×ij¤Óî…B!„()¯‰§\è-„B!J›œjB!„åBO!„BQ.$ñB!„åBO!„BQ.$ñB!„åBO!„BQ.$ñB!„åÂZÑ(3z2›—üÉÚ='‰êu3WÔ´SìÝI4þݸžÍ IT騇ö¶ÂëœM¹B!„¢òŒxšé›ùâ‰Û¸öΙ•…™½‹¯ÞÀįd}²N‰Æ”µ /þo}:¿¹½¯s6åV#;…ƒ»ws$˨誈‹ˆìwB!ŠRn#žÆñ…Œºû=Ö; »½ÀäÇ/#ÔRzc…î›Y²9‰4ý8îÎà†p0LÓ41)yvh†Qô:gSn!®ƒüðâSŒ_—„ÓPøW§föô¹~ý.­ßYþ,0’ñط٨Grû'q[?•²ß !„¨@å4âébÏ_³.Ë…[×IY<߸Ï%m+Ä݇Q#rËOóHÇ0´óýˆg:I:”D–[G×uLÝMFòav­œÇGÏ>ʘ?á:Û2 \9 ´Œ;‰|d¿BQÊeÄÓLÝÀŒy0Ì`êG¦³ûÈv¾ùq}ïn€CS`œ`á3C³Á×—™6ªAš›½3bØÔýuïaÒÛW’8é%ÞümGÒtð ¥v“ ¾o0=jû£eí`úÇ_ñwv0é-.cd]oIcý„ÿñ†¯2N-˜Ââ7†±ðX FH —ô£·u&ʯˆlVOfÓ¼‰ŒŸý[»‰nƒîeh÷:øJïsÎÓ×üãÕF%m`ê‹Ï3#þ‹gþÃ=zp´¨6»±pÊDæü³•=GOáÿÚWóʳ ðdõ™rÿLU@{˜ôÞuÄØtޝü†¾ø‰{“qjªÖëÎ_¼NU­2Bu1ýN!D)‡Oƒ¤ßòWª‰w3Üß Ž,øž i†ç8¥…ÒêÊF`œÜðÿ:MLýëÿÙ®ëÔéÞ†› •zˆ#™V‚‚ýÑ2’HXó¯½4‹ÝYž“Þ†ibuš\Y¡˜2r¥NB×t²Oìeõ¬×yä³Í¤¾†‚²Ø1õI÷+›¤c÷7HÚ¿Žoß|’·—'á.fIi,+þ͹ªs 0÷¨[Š®¯ë‹æþͦ}‰¤fkX•Nš;Œ`«"÷Hn !,,”ÈêXãÄ_¼ñÊt–ì9Nf@UÂC)‡ÓpØ+Íå¾¢„d¿BQÞÊ~ÄÓuˆ_¿Ý€ËÔhyíå4hÕŒ+ªþÁ‰KùzÅÝ´¾²:V¥QåÒ«hfÙÄúã+Yºÿ.VÙÄ¢Ý&¦Y‡ží#°)?š?<‘ù:IK9IÚ±%¼òødvî[Á¦©Z’Ê8JXF=_Ϩ–vöÏ}†{ÇoãÈ‚™¬Ò”N¶Â¥IKùdæ~Üz ·½ûCZ9üã³ÜõÉV~ÿz%ÃÛö"ÜZÔ˜Ž‰éÊàø¿Ëùþ÷ƒž©êq„Ûü‰(¦¾žkMCé7ö3þÛÔî2±eþ™Sn·¾þ¡çZ;¥aÑÎ{9à40Ì8î;†k90Ýn4?MF.:²ß !„(_ežx:ÿý•y †­ ×·«†Õ?Œ¾=#™ýõ!Öþ°”ÃÝ®%ƦЪ´¦w 6fÉòC\½-†‰Y§#ì(#…u3Þäͯבh¦‰a˜¤“”áÆ,IâYâ2‡ ‹ÅŸØNW7a;;²°û„‹N^Úxp º‰É>¾|t Ó`è† Gw“è6©nU>°û§>@ÿé*O}ªÒkPGÂÕIÖM/Y›•¦aѬØ`džn‡²X°X,§¶m‹jKÇßðíÁxÆß‹ºöç–7r¹·KD¥&ûBˆòVƉgÛZÈaÃ}5/¹ŽWÓÐ1L`×\îïÃíuýPZ—õn‚uÓFöý¾€Ÿ«nÆmšÄõìD„]‘±~f,î,ÜT¥CßnÔtœN2-Á—PÅâ;ér’T;¡UÉnØžÞ×_GïUqn{VmVJå\Caâv›˜&¨œ (ÿ& çMjMŸÎ7ó×°ãϼ²dƒßË üÏÿIY¢ôÈ~'„¢œ•iâi¦maöŸI&hÁ¡„ÙsN«™:iI)d›˜ÿË^nÖ‡¦Q­Ý踉Eæ0倉ikÉÍÝk`W:‡÷î%Í4!¶ƒô¡¦¾Õ“çŸî»i~V€ ÎÄhêGÊ™–a$³aîOì5 Š£IU+¨‚åàÑ”hþb'idDvaЀƄZL\'qÂ?ŠH[ÑGUÏ$Xü”B)PJC)CgÜfe#ÌèGØ´' #În7X­h®4Njqô¿ï%®¾}3ã|ŠY‡âY¼âƒÔÁ¯è¢E%"ûBˆòV†‰§ÉÉM?±,ÍÄÔšñ؇¯Ò;çþá‹©[%‹]†ï[$M£á.ÖŒÁËWÒ2Røñ©ÛøÝÈ&K×1L+ÍnHó@ ¥.÷ùvW0¬Ï,žœŸÈ†IOpÓd+6MÇeØéô¿)¼xYЩ‘o<“<,ä¿­©åÌÛœËQ‡®Mí,]›Å†·ïäÚqvô€ž¼=î>êïʈÇâdpuªdsè°‰è:!•ø1VÂÙïS7pù IDAT„B”·²›Rj¤°vîj2M­YoÚU·c͹îËbñ§A¯Ë W Nüżm9wxñ£~¿ëi 45èwCþŸ½ûŽo¢þ8þºKÒ¤MÒ´…Ú¥”R ì=DAáç@d(•¡2eª(âB\ _™R¶|Y*Š_*Š(   eˆÌ…δi“»ßIwÒ(´•Ïóa–Ü'Ÿ»äî“{ç3®ˆÍPo(3Fv¡AU/¬çràÐ)²ô~„Ç6¢–IS´)[½ŸäÞ˜´¨jÑá]¿„ê=Þ~ìNbÃ,hYdfƒ1¨6!Ç5ÏixÕï9‡Àí§Ð¿Eu,Z©Ùx›%²`W}¨äMö•NNBë_›Ûy‘Émü)Ãùü…JL\w‚ Ââî+_·zõꬮ]»"WMW ¹}9]#[ mt¾ÁYó’·YEq(¨HH²\ ï—ª*®é’ò¿ Y–‘r_—??× 5ï¹âóUQPò¯ƒ)IH’\¨ZÑ|sOUó–ÑtûÚ¢y ®uºž÷œ?5ç`r^£ª®•—r3C’%äë<×Be!®;A¡ìmÞ¼™þýû÷2«ë‘žïï ó†¶rI²çhÜn”ÝopöA󜡛×IÈrÁçŠÏÃ5J×ófùææ]êû¨û<ÜæyUï9þnF’‹û„9qÝ ‚ åGÌÞ,‚ ‚ ÜåÞ¯ÿÒ¥K:tˆŒŒŒ’ Âu0 Ô«WÀÀÀò>AA¸%•{àyèÐ!ºuë†,‹ÊWáÆûì³Ï¨Zµêu÷_Aáê•{à™‘‘á| á&ÈÌÌ,ïCA„[–¨fn)ªZâl”‚ ‚ Ü å^ã)‚PQK ¶V u}½q?íqñ´É5WjI¯-9PÕi5¹ÓµyJ­**§.¥ñü¦ #Ð$¦°¡b§ ÅJJJâØ±c8ŽkÎCQ”ëz=8»Idgg_W@‰yȲŒÅbáÕ ð!"Ø·ÂõA÷x4‰ˆ`_“ÒØzð"š3(×ø¹«ªŠÝn¿æcçg}=Ý[Šâ¹68ç\EGGc±X®y?‚ Ü<.ð¼|9‘#ñ‡É´y¢×뉮C•€*7ñÈáÖ“™™ÉþýûiÒ¤1þþþeš·N§+ÓüÜ‘e­öê¾æEáܹs|ùåßÜÓ0ŠÞ-½¯baˆŠác‘¿ÇÓåî(Êî¼Ýès¦Õj¯j†“œsµwï>Zµj…Á`¸G'BY¨pç‘øÃÄÄÔÇâëù×kJJ2ÿ:H›Vm¯¾&"ë;×. îËß8tâV¼ ¬ÝˆŽ=ŸàÉžu1»_ß²|(Ilyq8Ó¾=G†sCô~aĶêÊÀƒ¸]ôán°ÄÄDBBB ¯pµ~7Š,k Ç._¤F=²D¥ œÏ#‘A¢„$IHj6I§÷²ñ³xÔÀ»hh!æÿšàõÍ~KNÝp”dþüå ºc©í#‰ S¸.iii˜Í¾·D­Y~ç“2±x¡­¤ÍÔY¢šÅ‹„¤LªWõ)ïùáÌf_ÒÒÒÊû0A(·§¢^Ýœr7®ݿðã¶Š4ñø0äÑáWŸ=é(GÓUšFcvWµ˜ŸªbŠjG§v±øÈ8;x¥üļ•Ç ¸˜W‡Å`”%îhIfÿa,]¸›‡Þì@É]øUPÁÙ†Nà#wàŽŽõÑôÃâE{éõZ|ÝÝèöN¥s;)7U©A¿9ÃifÖ¢mxÍôÏóÕžDú„… MgÛq™z½c0Š&'á:dee ×{Q!k;—ùeÃz„÷æávUÑ–áå~19ƒ^×2ƒR…Q½Šž‹)„W©|ƒ£®–óu^³z}嬥„[…ÛÀS–Ê¿i¦e‹V´hÞÒí¶kZ×]qN)¢ÕnzÎâÈ¢'µµ³&6gÚ;IB’òjCm pÔf¦i»øÈ²s›wššY¾ïOlíñ+õÁ¸j0% ¹w6öaÃá\ÈjÙখ2z žk…‰,Ò/ýÍ®MqÄM|û{˘Ҽ÷7Ò0õ‹Ý\ìÖ ÿ“Ûù3+‚‡YÊôF,ÜzÒÒÒ0™L·gÖY¾_½–_»w¡Û*”匕’¬„x#»ÊéMc‹gÁȉüÐô5âFÇb¼Ž×ð“ÒQÕ²àª(VNÿù;§L±´ªå¾;QY1›Í¤§§‹ÀS*¸ò0=$ Y–Ý>®…Ö/‚P/8ûç)¬VQ±§%rùR*¥Y<¤ð=H’@EuÖI2^ÈÊÈv»ªˆÇcÓiPUvO/1†R§nêÕ‹¥ÅmÝùòËôòO`Óº¤Kš?ÐÝŸŸòóE+'¾ßAbhGZÞ:½(„#==___TUõüp\äÓ]h?æ;íJm)?N¢C§'XÖYŠÍçš *J™ç{9%ƒ`?%Uy¦þ<™ö·uã…I8Š”ß,Ž-{”6·=‡§²KWg, '<ÐxÝAZˆŸË©ÎÏÈÓy»£3mo/ø²éÙJ}–Gˆ›ú<ïýœˆý†]·¯¯hn„ÊàÖ‰NÌèw—??ýo>ë7fhLÑ/öân ^Áõ©åµ‚½;ÎÙ$I‚¬Slß—ŠWD}Bô’ÃB˜EâËøÓXÕ:x—渲ΰóÏTtÕ£ òòÔ'3¯†{:I6ƒ¯™*mqåIÖ}ñ ¶&PóÞÎÔ𘗠”Nzz:~~%MÊíì×ìÝ”ÕÃá¸9ýCUÊ´YüJr:Í£KÈÓAÊ™Kd9®ð¿Ùë°bu y-*ÊÅ-Ì^q”ìì .¦ÛQU]ÉMÞºêô|i.=$ ù:kZƒý¼ùýèyë¼…÷gÆ“M1kr¾/4˜",eZ3©(JÞóÈl6qåJ’Ù.\… <õz=))ÉX,ž®“““Ðë¯r¢`ÉBëÑS¸o׿}”Cý{Ò1¶&Uµ©üq$µÄ/EÉ·5£D0`Ù3Ló~‚êHùßB–œ®Á°­±HèÂètwó½ÃËqVz6 Bsö/®ºó^ú~ ‹jÝCÓÀ,¹˜¸SôÖÒ9jÝí>ÆÞßü09¬\9sˆ­¯â»´0úw‹Â[’ÀË€ÞÕyhéÏ®Á˜NáxUÒABÅ‘––Fxx€çæöÜçsjžÜmrn#û2{ÖÍåýwrôŠLP½ÛydüHºEÑHÙüóÉ‹LŠû•sé´–ê´x`$Ï nI`NŸ‘¬ ü´â]~¹—W4GGB’ŠFuµ:¨¿å2;–Ìáƒïÿàä¹T21ÑrÒ|Þ¼¯ºBÅ%%ÝJ Å§„XÖNÊÙdÐá{jóêÁÛwºº¸dp`õb~‘Bð!•‹é9«esrÃsŒû`7gÓhýjÒªçž{´5AZ ²Ž³pðP6µ™ËúqõñQ/ðÍ;ÓYôó1Î]LÃ&™©×žG&£gtñM×A~>¤¦YçÅÓyó Q“&äÏH’œçLIæ÷æñþG;8” T· CŸ†ùÓ’Ò¨ÎÇß £ÓbçKš¼øÿ¹Ý‚l/›s•Ãl6súô™bϘ å¯ÂžÑub8ø×l6›Ç4z½è¨è«þU«©r/þw)--býÖ•¼¶:‰lUƒ±j8M;4"P[\-¡ºÃßg¡q6sÖ¿Åø *AÑm;o"ƒb¼qÆy:"¾Á¬ä™¼¿a“âìÈÞ‚¢[ë¯Í­í ©ü²òuV$8ðhÊÃo<͈FFŠÆŠZüBƒðún G/4øX©Þð¦ŒDÏ&¾®€µº¢ù²WÙ=„Îa^·…Pi”ªgNP£dc³ÙÈÌÀز®$*ªšÁáå“™ð±½F>ÏØà4~Yõo<#¶ìIš™eücïå‰)½ð7:Hس–Ù+^eNå¼ÜÎ ìŸ?ž)ÚÅ£Qz.ý¹™‡À¨ºöAfñûÐ'±ÿ‡íü]¥?“G7Â_IGŽ @CÁ€9ÛîÀžeÃÏTÒ[) i¨µeru¼üÁFŽuF´AF½øó>M¢å¨ ø,x‹Ëi9KOjhÜÑÏ÷!ÀèàÜîykéK¼]÷¿¼ÖÁ  *9Ý~éÝõ;çÃeêäzø¤ž`˪EÌš¤¥æŸ¦…Ùóti~&v»¬l;z]¡¯úœó¦:—2uää"IhdGWLbÌòTÚÉŒ(‰£_/åýq“ÈXô­m@’J‘ƵŸ ÓxåîjxÉ2ÆP#üUç*?“É$šÚ¡¨pg•€*´iÕ®Ät×Ö”"¡5GÓ}›t_ðÛK’dç<žD2rý6FHr‘?$mZ z…ÔÜüd×@£Ü4úpî÷ŸÌŸ¿+]¶3a@›±|0¡>Þ²HH²ì&èä:¿úÛ§yóÈR¡ýªRÍìMË>·SÍS•€ ”RÞˆöRÔ8ð&Þ÷VÁçT‡RÛùgêo|°á4õF/cÔ½!è$ˆ IäçGV³)þqš65bªÝŽÎµ]¯­W•Sß?Á—{ÏakkÁ²‹%ÿK tÐ^x$ÒYvZ†pâ›ßØ+©¥ÛGç„êÆÚ­éغ~KKRjARI­ª¤¤Lds8­LƒÁKXöëC¼Ú·㟬àWßn,îT“¯W*ü~9~ÈȘ£:pW”+œúöQ>ÿõ¶ö~xšøÈÙšŽmëã#·¥ex¿ŒøžÍ'2hÞÐè±ù^’$‚| $¥f`vŸèÏ™ô¼{VÞ¿«<À£¨gÿÖüMpŸ÷™öpŒ²D‡µÈ:šUK~£ç«m±¤•œ&§ÝÊP¥&Ñujàå°©¦þR&ç*¿œkUŒl„Š­Âžp­Ae©sG’¥bFÀJÈšb¶J2Ålv¦‘åâGØJ2²FSª¥ì$Yã9/5ƒ³‡Ž“¬$óÛ‡¯ó•©‹;‰ÑìÂuKKKÃh4–<¢=§æ,b 3žlН&/8HÛûžYîl¶µ]8ÄI›3o?Lçwr_ŒâPð>ŸŽCÕqaçæ®úš]G/¡ñA›á@›œ‰CUɺp˜SYš7AŸûý å´ £–fõÕœ§Èíê¦:)ÕJ_)F´+™\±‚wM†°¦<Ñi–}Ë™˜P–|’@ÃÇ¢ž¯=>~9$;ç·¯dÎÒÿ±3>«lD›á@—œ‰êšI#‡Tàß9ƒ-%¼«EÌgœKQ ¥)*Øß‡äT+þ¦‚A[Îû®5˜Yãšcr7Y@-/‰¬38n3Ѩu˜³; ªÓ¶‘‘ÿ8H‚­5†„’Óøº>])_ϲ´RJÑãv#%-@?c‰Ÿ+—­àí§G#ùÒüáÞ„?¼ŠwçšùYºƒÙ«¡Ó^Â߬—ÒpÙ'×óÔ”%¤Þõ$/iHUõ$½8-%ï-—¤5 ÃA¶RÒ¹@?RÒÒÑyÁÈÓù?c1 bð×äæUl®$’Tðóvâ®>»j)Ò :c5Êì\æëëln(õkA¸¹Dày3yynÆ¿¶üê0jåŒgó»,‚N¡l¤¥¥¹¦R*!aíù£›|c‹ÐV"\gãÄ ‰{já#l6MÛÿG푌}¸íªé¾Ôò•ØêÊHCMýöm?IFÃzøÈRÎz ¹ûÐU)~j–”û~œµ¤îßRzZ:¡!%¼q@É )CÅ`Ò#^÷3´éJ^øê"5†¾H3_IÒcòRI»dÅdžÚM¼½‡÷à¶PçûüÝ"ñ}É{»&¾>œ9wÑæû4ò+|ÞTÐÖ¥¦~ ¿ï:Kfl”³kCÖivîOëz]‚¼$tA%§!Û€¯¬W2°+jî Gm«ÂŒF3ÉÉÉbd» T`"𼩊oÆ/ÿüÁ)==ÐÐj@1#ÚÁüåîFµ;'Ò‘,­Ú=„Ñ¿ÈsÒ îoV ïÌKœN©ÉÝ÷ÕÃ\P>ä£1ßK¸÷EN§åÍш©)ÃûD0|Õó<íx„ž-Ã1eâdz^ɯø}øæTº©EGàçgµ¦à[³äÀE±‘œ :½sê#);F=Áë’¸£G-ô²h1zËØ’“±©`©K˜´”µqð½»Õ}.ðOÚ›j(À×Hü±EÏa1ç S3†=XƒÇV¿Ä«ú!Ü[Žn^ƪ³á z¾æR¦QµÄFéYÿÍJÖÕëNmI nG×úes® 3›Mœ;wîz>2An0x ‚P„sD»‘R7µç´»zÚ&h0üÞñ_È_¬äµS°ü©Ý~·ÝƒoÍÞ¼4þ"ï¬ZÁôo²P/S ÂMÈ’ è‰4‹¹–8|²Š“ÉÖð ¬OÇZF´¨@ û(öXód¤§b1›Jþi60˜òf‘ð‰éËÔi*Rnëƒ/£Is@ÕZýyýé Ì\Çó_Ù@UÑ™ChXÃ\¦+/å°˜Md¤§Rì¹qûYè©óðLfû,`þÆÿðìE•À¨<þÖHúDrÏI‰i$ íF£ûk‹ùðõid‚h5¸.êG”ɹ*Ìd2Š‘í‚PÁ¹ûI¯[½zuV×®]oJSÅæÍ›éÛ·¯hnŠ5kÖÐ¥Kq½#++‹íÛ·sçJõ9©Š7ÝGT‡²&¯ ˆª*¨J^ _ÞlE·®ò7NStVˆâö¡8¨Åtu±Ûílþv+öîQŠ ÜƒaTYSì|šªâ@Qed×·ï3÷]yæcáçíYã~6ŒBÖmø„.wvD§Ó=.wç-šüÇêf6Ò¥Q“È»Þpþsz=çÊ“o¿ÝBÛ¶mÅ#A¸É6oÞLÿþý{€ÕõHÏ÷w)j<A( oD{)_ iq×OF–)Ðd$¹à/Þ¼×ÝVpûµ§É z4HEÒçIKKÇbö)åímÉ3æJmyu%ISÌbÅ…ót·Òí7‡Ÿ¯‘ôt+K¡U¨<ž·üŠ;_¥M#!IšÁhqç¼´çÊ1²]*6x ‚P@zz:&“‰«iâü·°Z­˜Í漬¤Ìf3éééX,¾å}(7ENs»Ù.“<A( ¯g ‹þ…ÒÓÓÿµ§¢(·D£ÑHjjšÙ.”<A( --àà «nâü7HO·^Þ‡Q¦Ìf3§N%Ý2çÓd2qþ|By† ˆ%½+{ßÌ™Ê ýÍÓM‘ȎÕsù`ÛEì·ÈD¸¹¬Vk¾í·ÖÃùÞMÿªš2“É„Õj¥¼?Û›õ0™Œ®÷+BE$jâJ£â~F,A¸>=ô²|ë5ˆ(Š‚æ_¶(ƒÁ` W¯^·äùáê¬]»ö†ïCž×EEq8pTÌ›“Z`ÖH¹“F›kù¡ñÒÑë•ùô”¤RÌ (‡,Ëœ?žÝ»w“‘‘qË 2A¸Ux{{Ó²eKBCCoÊþDàY,‘4iÞœ*ù«5% )ëó<Êgmçóñ„Îõ¥³Ùµz6³×ý̑˂tfØScéíaå’¬¶Æ½ÉÜÏ÷pì²–˜ÚpEE#âáÛ³gwt¾ã_ÕßQA(ê‡-?P­Zµ›²/ÑöRTçʹUÍ[©EqàPrfr(n,£–§écÓY0{2wk¾cÆ„¹üšê(ÚÀ®ZÙ÷ŸLZOh÷ Ì|m2›èÉT '„²'h‚ ÜÒÓÓoÚ¾DgYØÿ2ww|%ïßUdùºñÄútÕ”ÝÌûï)Œ_ËøîÕÐIÐ8ô?öYÁÆÃchѰ`è©$í`áÆó„ YÎkãð–%hSc_îf¨„n0UUE» ‚P¦DàYjcÎÓ­ð•%@ÖW%Ê #Ù &˺p€6;§g>H›Y9Ï:×]ö>oEiX0}ö…CœÌö£U«0 ²kýc7k% Â"OA¡,‰À³,˜ªS¿al¾>ž’ûàÐaGÁ@»gße|¬O¾ñè>Áh¥ËÓËdØ ™„›Dž‚ BYrxŠ›ÍÕ’$©ÄAºÀºÔÐfrü˜Dh÷Ú ŒE’À机Su8?¯àÔòZÁ¯ÛN`m‹ITu 7™ø.AÊ’ÛÀSŒb½1ä€öŒ|0”!kžf¢<ŒÞ-ÃðμÈ?)µ¸ÿX,Z_B}%.ìú†í'jÐ)²cGÒ?n2ã•ÇèÓ¦¦ŒœHã–YþN(_"ðAÊ’hj¿©|h4z æðþ§‹™¶6»!€:·¡Óý±Xt!Ü=v ßNÿ˜9u¦íä†DËR¿¹¼»6Žç×%“­1àÜÎQf´â‚pƒ)ª‚$)„ŠÃ~‘—,á—ÐçG£Ÿeq¯üëIH²LI+p Âõº©5žJgþÉS}šEÝÏk+•Õµ^ßYÇYþÔKüûs†ÕÅÇ‘Äfßm=QUÜ„JFž×I’5Å|HÈn–ß“$«òI2r¡m’$#‰»°PŠžJ2ÛfNbÖöKØU/ÌUC‰iוêB£Ýµ×fcåôÄ÷z¹5|Ä+¡b(|ÍkŒT %²Éôés' J{Í_óõ­§jH5B«x#“7Í™âú¿è #T6"ðÁ£"§šMÊ…Kd‡öà¹ÍðU¬$þ½—/Ö-â™]§xýía4¶h®-øTUTEAU\7Ô²x‚p½ò]óÏ>ÞŸŒËœ;}Œ_¾\ÀäMŸÑí•×y¢©/Ú’.úk½¾µÕ¸û©üŸ$#S0ЧP‰ÀSŠžªóaŽ 6¶>~ š¶ Umæná³øþ4lfàÜç3™¶jç­ ZsMï“}›RE+ã »W-dåùçBYøÐtÌÛ¼t›sI®VŒå•λxì3Ë™ÙÞ,j?…ò“ïšoب¡óšçvî}  ŸM{ŠÞ˜Oì&r[U-Rööm\Lܦ_9–¤!0ºýF>J×H#WY*z}{_^²O²rô$¾i>ƒEEcÈ-“®VÉää7KùÏäÐ%ª>6Ã_bÊÿUÃK”¡rx*ªX“Q÷§ó™‚}ŽuÞ>hÉ&3SAU%,õ»ðÈøûð7*\Ø»‘ùkÞfAí¹<ÓʂƑÂÁm»ø§J/Æ<^‹bEŽôGÃET ð¾§xö®`¼$ ïo$D­ŽPŽ<\ó²¾÷z‘ÌÔ¿Y±ñÑÃßgH—@tÔ LdרøúØÃÄÖÁÃõM å¥` ©ªñ´§\$Yñ!¦IKšÕ7!SœŒEÉ*"ÑÔ.‚Gn›ÚþšË~óÀU«â]£ƒ^Á]ZP³¹°ûâÖ}ÇÞ‰dÊÞh2´)6ùklpÝusn’®çóZEPäEEûTª*ŠäüÖ…#œ¶Ù97w$½æIyÛýÅ QЇëÛÎÅR•—¼ÀWUóŽGy6ÞNÜ‹c8~Û=<Ðýn:DYJîs*åDž‚ x䱩½Fož}¼1&3¿ªøÐÊ2*Ù§?gÆëëH¿í&Ûɉ››Wþ¹ªâ¼‡+bp‘Pqäoj/xf?Èél•ª‘hvh>jF{è—¬¯bFÃ9·×·ýÌÕ–—B}m.Íöná³O>åí§>åó~/óòCµñ£… Hž‚ x¤**†¨+®›ž1Œºuëâ§Í7½¼ë¦œyúþvÔdXŸ.´Ö"9LÔ4ÃvUEuŽêÍI¯ä 0%/Lzȸ’Ý¡ 7M¡"Pò"MUQQs*3m§øbñ—\ðnɤVUÐk# ÕØøço•ÀÎáøÈ—^P³Ü_ßW]^\eRµ+yÛd›ÝLj&·Ó~Ñ$^øü+ŽÞ7’XY,ÿ T8"ðÁ#}Eûh3b¸£PnT ƪþÈ;?ãéŸìM•jÔhþÓ{v¢AU½k~Mу^aºe9+¿[ÏìÏSQ j¶H«NQ˜t®ïnWY^ä*tÜŸçnfÙ—­‰¹-ží¾â`¢ =U¢Z3|ÂýÔЉyBÅä®A·zõꬮ]»"Ý„µÀ7oÞLß¾}oʾaÍš5téÒE\oÅÈ)“k×®¥uÛÖE>+Uq xZ&6/‘«ZΗyU*2r‘Ï$× °@nùj7eWmNÑ<œ¯“оFÊ‹$!»»»mÊv^÷ùoÜù¯s÷×÷Õ—É5í¡êúÛãk¡‚çµrœå¿Cúòv¼#ßó|b˜úé"zk¯­swæa=ý ¬bu¤¹˜õàáÆMu‚ BYçµ’«ÒiÊ;ÔLqY[ýïüÙ”I/ö¦–^FÒøåwkV»(ŠCÜø…r¥¨ EAáÚ¸ <ÇÍ>ŽÊGò"¤^ ‚ÈÀg‹éX5µh;……d¿Ì®å³™½îgŽ\ÖÜ 3ÞKh#Iß¿ÀCÏ ë{Ëyª¹/šì,{bK«<Ú×連k7' ¤íBçßÍf|Á¢Î~¢Ï›pÓˆ>‚ BYr¿d¦,Æ–Š”S”÷\ýw$297–Qk}è3n:CÒØ±ôMfL©¾æ)ZÞ>Žg: äÙ‹é²bþ›f°àd3žq'Á: ²»î=ƒY÷‡â%I˜ÂÍ"èn*x ‚ eÉmà)Fü^?5e7óþ{Šã×2¾{5t4½Ä}V°ñðZ´ä®É“ùjÀKL›ž‚iÇ Z<³’{ªy˜:Æ;0‚˜ºxIâ¼7Ÿ<A„²$úxÞ YpÂfçôÌi3+çYÅ¡à}ÞŠ‚ mÐ<3þô|õkÎ×›È[]Cð*[:gí(<ÚQnŽ k†ûI×AáˆÀóFqØQ0ÐîÙwë“ïÞ-á€V”Žþz”LEE‰ß̶sÝPSŸ›Ölºf7¡4nØXÔ´ ‚ üË>xø¦íKž7ˆ.°.5´™?&Ú½6Æ|÷nç\áÊÏïñÒf ÃÌDÿî(Þ›þ1íæö£–^?¤_ÎÀ!"O¡œœsPA®EtƒÈíù`(Ö?ÍÄw?bóÏ;ÙöÝ&>üäO’*jÚïÌãŒ}Ÿã‘&± ~q8µ.bÖWçÉV]£ \ü2Ž¿ÝÁ_Ægû“pˆ.w‚ ‚ TR"ð¼a|h4z Fµ ó§ÅL›<‘ñ¯.dÓï§IS²ˆ_óŸdwåéÁ1e }­‡xöA?vÍ]ÀŽ+vTÙŸŽ¦Ð»fë;×. îËß8tâV¼ ¬ÝˆŽ=ŸàÉžu1W¤e»”$¶¼8œißž#CU½_±­º2pÄ nÕ‹y(nqªª ¢RÜ|x¥IsKÊ<Ì¢§Ÿáà€U¬Ž4£)ïãÊ”<A(•L[&_K±¥Å⇭˜QOTëAŒÉâƒÞ4ìÖƒ}#ðS’8õׯI®ˆ_TY$>‹µæ£¼=¹&{* Çöðéò8&þ–HÜšÉ41íz#Bé(ŠC¬œö/Uñ¾ÏA¸µ¨Xò ‹úóàœ%Ljå‡ÎU»©ª}pöu–À‘ÈO ß`þ·û9q.™LÕLëg—ò^÷PtjûÖÎáµ?q A%8¦=ýÇM`@cg3uÓzŽáЀU|øpz ì§×0°ï2¢ÞÝÀô&V¶Ì™ÎÂã9}!›—?5c;2øÉQ£÷°{4öe­’§ å+ýV}òÚ¶/óXK¼òEyjWIüþÝO¯ú0S'4ÁOICŽ®ŠV²q$n çÐaèxÞŒ–ˆÿßBfKÆŠÅ ¯c@FEq8P”|‘€ª 8G*‡wüÊ™°!Lƒ·õ$Û7,åÕ!‘òá|‰4x¸q9'Ø—Ôl’Nïeãgñ¨wÑ$ÐBÌÿ5Áë›ü–8œºá2(ÉüùËt ÆRÛG7ÂJCC@ãûB_ŒÎíZÅK^à͘u̼Í Vöýg“Ö+t2Ç¢õ\ÜÿqÀ˜“…ZŠ4¯ïLÅeÔZúŒ›ÎÄ4v,}“dª¯yŠ&—×2eæWøô›ÈœÛÂÑ^9KjD: û¤çmÅËâèò± ]˜HëÁ#y½I Ò•$,¡z¤2)oiÄïÚÇùð¡L{º>©'ønÅ^Ÿ ¥æº)´tEžÁ½g0ëþP¼$ S¸YùÛÍgTƒMñúV”µÊÂmà)ª·Aðd×î_øqÛE¾'üòèð«ÎÏžt”£é*aM£1—4Š@U1Eµ£S»X|dœëʦüļ•Ç ¸˜W‡9玣u$™ý‡±tánz³þ%…siZcd:ul€Ü;:ÖGÓo ‹í¥×kmðu×ÇtïT:·“róP•ô›3œff-Ú†÷ÐLÿ<_íI¤OXÚôx¶—©×;£˜¡¢‘1×¹.u\ÿŒ äŸofÓž³Ø:øaHÞÁÂç ²œ×†Gá-KЦǾÜÍ×iV’JNx¸¾·1ï¿§h0~-ã»WC'AãÐKüØg!Öë<—F¶¹¶-h¤&8#Åó¶â¨)»™»<žà0kD=Œ9×¾$AÊÎ2,o­¹½]|äv´ ?ÏÎÇ·ðõñ ZD9SyFS7/Éõ#4ËÃgä#ÊZeâ6ðKä ‚àIË­hѼ¥Ûm²| 3´)´ºÂÍaYYô£¶6cöâÑÄæ´¿IÎgÎ÷”-áŽÚÌ4mWYvnóŽ CS3Ë÷ýI‚­=~¥>)w™P¹w6öaÃá\ÈjÙà¦æ$z žk…‰,Ò/ýÍ®MqÄM|û{˘Ҽ÷7Ò0õ‹Ý\ìÖ ÿ“Ûù3+‚‡YÄæJ%›ó?¯`ö’ÏÙŸ€U6¢Íp KÎD²/âd¶­Z…ap]Hrà®4ir¾¾/à„ÍÎé™ÒfVN"Å¡à}ފÒr ï<Ù#]d`¿Þt©ç0D{ÞVœ¬„ýÄgšiÚ®fn™Êq£Ê›¡Z4Á|ʹdG¾­yŸGqŸæÆ¢¬U"¢©]„«RÖë·ký"õ‚ßþ<…U Ï×Ô®bOKäò¥T²(ihkáC’$P]c†‘d¼4•‘¢ªE{:6UuxžgÑJºuœ}<‰¥y‹\é=’Më0¶Ekš?ÐÝ ŸòóÅÎ4ø~‰¡wÓ*P|íV&Ù'×1é™8R»Œã•'¨þ͆i¯ð]NYƒŒ»RLKaiÒxâ°£` Ý³ï2>Ö§À<Ï>Áè¼8ç#ÚïüœW®bêÐU¬yl>ó†Ä`4DzÞVÜ,Љâ~G–uy“´t8Èv}FΗ¨¥ð/[DY«DÄò‚ ”/s#úÝåõ»ù¬?bÅáæÞ\ÜíÚ+¸>µ¼Rػ㠙9ÍÿY§Ø¾/¯ˆú„è%$­…0‹Ä¥øÓXK{ïÏ:ÃÎ?SÑU&ÈËS?±¼I’ìé$ÙT ¾ddª´Ä=–¿X÷Å/|³5š÷v¦†Ç¼„Š(óŸÝÄÛë0ð±žtlCý†ˆ²äC¯àÔòJå×m'°zè¦Vš4žèëRC›Éñc¡‘µ‰ªóˆ$̬$$­™ZíûñܼÕÌ{ÀÄk7pȪ¢»Í3¯ jh“Ù»ãt^™Ê}/7¨¼å§1àg€ôË8JµL´(k•‰ø9 B©èõzRR’±X<7¤%''¡×®.cÉBëÑS¸o׿}”Cý{Ò1¶&Uµ©üq$µÄÛŽäÛšÑ"°ì¦y?Áu$Žüo!KN×`ØŒÖX$ tatº;‚y‹Þáå8+=¡9ûW ÝT/}¿„Eµî¡i`‡¿\LÜ©@úNkéªÑt÷†±÷7?L+WÎbëÇ«ø.-ŒþÝ¢ð–$0Æ2 wuZúdzk0¦S8^i>R¡DúÐX¤%¬Y¼ß»SØÀ?iy›äÛŠ1ƒ#é7™ñÊcôiSSÆN¤¹f>(eOä€öŒ|0”!kžf¢<ŒÞ-ÃðμÈ?)µ¸ÿX|.üÈG;"¢‚ðÉ:Ëžc©¨¦@L°ŸÛêq[q$ÿvŒz(ŒGVNb²:ŒMB1X/b­Õ™®QeWÞ<Ò…Ð8ÚÀê/ãø°áƒÔQ/‘R­#÷Õ-æõ¢¬U"ð¡T¢ëÄpð¯Øl6iôzÑQÑWݯ©r/þw)--býÖ•¼¶:‰lUƒ±j8M;4"P[\Í…ºÃßg¡q6sÖ¿Åø *AÑm;o"ƒb¼qÞ{tD|ƒYÉ3yÃ,&ÅÙ‘½-E· Ö_›Û(Rùeåë¬HpàÑ”‡ßxšŒ½iñ Âë»%L½Ðàc ¤zØ2n=›øº¦`ò¢V÷A4_ö*»£‡Ð9ÌK43U2^µ0ë™ ¼·˜©_Ú@UÑ™ChT#gÚÑCç²Ôo.ï®ãùuÉdk ø7¤s”­$•2'>4½ˆsxÿÓÅL[›ŒÝ@ÛÇÐéþXt‰‡øfÙZö^°j °~gžš>:[1ÛŠ/¡>ÄŽZÈÿ9üç“<»*ÅÆ]“›sgTh™•7d:N˜BïßgÉ “Éô¦Ý°t­[ì™e­’pwúu«W¯ÎêÚµëMd´yófúöí[94)ùä±^ÌоÀ×óX׫Â[³f ]ºt©œ×ÛM’S&×®][¤l–fÆ‹kÿlUTEuö +ŸìœÇÓ5 B•d4nj2TUÉ7}‹„,¼¡*J¡ü]é²1·ß`6¶YÀ'ê;G#!ɲ› 3'/EºìIr¡A#jÊ/¼Ø÷YÎZͼn!èÄ¥Wé¼¶œò®Ë¼4ª’¿ »èõS|𫹾œt®çs·ä¿‹Ûv ï[’5¹ïçºÊ›äî½:Ÿ#w*Š¢äÕ»>§b?#QÖ®Ùš5kr¿÷¯õ¹yófú÷ïßȬ®Gz¾¿3€L·5žŠª\óÁßZœs•9d1ý”pk¸±»„$KÅŒ!’5Ål•dŠÙìL#ËÅQ’ddÆíM­hRç¼Ô Î:N²’Ìo¾ÎW¦^,î$FØVR¥º¶$éºÒ\ãõ-ÉÈž^æi›=…Nœ#Ýáf›¤ÁR=’P¹Ø÷}}åÍÝ{-üœ„ìæà‹¼N”µJÇmà)K¢‚úš8ØüÖË,Øv”s—Ò°áCX‹î ê(³ó󝨩J· |†çûÔÇW#QªU1”Tl|ŸÙk¶ñû©$Tƒ?!5Ðã¹—í\ܪ¢ð ÂÍ—}Š_ÁÒãZ‚štç•w†k«§ƒ’´•iÌä·£ìõÜ1û3ÞjcöXÛ_¡ˆ²Véˆ>že)g5†êÃxé¹÷²ê•ÌÚF×aÃyy¨‰K?.æíwŸ£jÃÿ2¹²TªRG—á‘…çi6àq^mŒæÜÞ|k3¿&d14Z*vU‹–¾Q¡$^‘Œ\¿šð®>¿:ŒZù#ÁÙ¼)‹¡PqÈU»±dÛ½·çoR¯ðDY«tDàYÖT0F¶¢CëX|äf„ÿž>+#¸¯ïý´7ËHM½ùuËSìØuž¬ú‘¤âWÅðNÝÍüñôšÇ[£a–%”‹‰,{{³sw)»‹]Õ¢E S©ûó­«øfÎòÏOÊ’„æ_s}вVÙˆÀó†ÈYUÁ‹ª‘`»L’ $_ É;š~ðGb: *`/aUŒ?8’a¤Eç(L9«DHy#|³JXÕBÁ$Fö ‚ ‚P!ˆÀóÓzéÈ‘;²O‹AŠÝ9Ò°¤U1T‡´ž¢ÇVµ¬AA¨(DàyÓŒsVŘôXO:†ê¾DY$¶¸¶{FSMJæ½ÈjbÂP(,°ªE÷ÚómS ‚ ‚P‘ˆÀ³œ•¸*††ÝëϘ¸©¼f|œ{#$þùiñŠJJ^ÕÂ"†µ ‚ ‚PAˆÀ³œ•¸*†äK› ïñ²þm,šÊç&¢ª2:DI«ZXDŸkAA*x^9ˆ^K¶Ñ×,š¢S²˜:¼Ë®í k\SÜUCŸ;URiV‘AnG";Ö®áÏê}Ò!Ðý ÏÒ¤„!xVtJ:§laù—q>ÝŽä]•ÚÍðæ“PßGL”+Tn—/'r$þ0™¶Liôz=Ñub¨På&™ \‡ì³lYµšÝ=ïap{AeiÒ”ÅÊ©ý{ùÇ܈6‘b<¡l‰À³¢“ýé0q!›&äoF«3ÿGâS‹¯Åcš””dþu6­Ú^ýL Yعvq_þÆ¡°âM`íFtìùOö¬‹¹"uGQ’Øòâp¦}{Ž Udô~aĶêÊÀƒ¸=T/Ê|%¢ª Îa¢*…g3¹š4å"ó0‹ž~†ƒV±:Òìa½uA¸6"ð¬$Y_øWÊ´ebñµPZ,~ØŠ©õDµdÁè‘,>èMÃn=Ñ7?%‰SýÊ‘äŠøå—EÒé³Xk>ÊÛ“[`²§’plŸ.câo‰Ä­™L“øÁ)ÜŠâ@UÝ­å.×§â}÷ ‚ \/5ƒK^añAœ³„I­üйj7Uµ 9ï9ùiáÌÿv?'Î%“©šiýìRÞëŠNMbßÚ9¼³ö'$¨Ç´§ÿ¸ hìïlz´îcZÏ1°ŠŽ@/ýôö]FÔ»˜ÞÄÊ–9ÓYøc<§/¤`óò§flG?9Šêºo¾TUÀR›¦M›à'KкmâéúÒv%\!cÖÆèÁÊŸ ®·ŒDñ 1`c¬ŸB3˜ÞÙœ\?…1 wq6ÍÖ¯&­{=ÉóCÛ”Ó>ž•ÀÖ¸7™ûùŽ]ÖS®¨hòÇm%¥)îZ´'²kõlf¯û™#—57ḛ̀§ÆÒ#ÚŒ† ŽmzWÍþ ™¨†n÷³z„ãUܶR\(' ¤íBçßÍf|Á¢Î~ÈÅ– +»_êͨßïeùêÑÔó–‘Ò÷0¥ÇxN>¶–å…á%)\úb4÷Îòbúúg`É«,üù(ç.¦a“L„ÔïÀ§&ÐËC*¿ xöx?U|] 7A¿ªå}ÂM‘þ«>ùmÛ—y¬¥?^ùî`jWIüþÝO¯ú0S'4ÁOICŽ®ŠV²q$n çÐaèxÞŒ–ˆÿßBfKÆŠÅ ¯c@FEq8P”|Ñ…ª 8G*‡wüÊ™°!Lƒ·õ$Û7,åÕ!‘òá|‰4xøÖ“œËâªÙ$ÞËÆÏâQï¢I …˜ÿk‚×7;ø-q8uÃeP’ùó—3茥¶$¾Eo `ì } 0:8·ko,y7cÖ1ó64XÙ÷ŸLZ¯ÐaÈ‹ÖsqÿÄcNj)Òx¼397–Qk}è3n:CÒØ±ôMfL©¾æ)š\^Ë”™_áÓo"sn C{å©è€ì“ž·•Fpï̺?/IÂnF.±\xSçŽúh¾ÚËÁ$…zÞ2¶3»ù#ÕÎ¥ÇH0/)ƒ£ÛãqÔM¬1»öq>|(Óž®‡Oê ¾[±€×'h©¹n -Íâ‡Ô¿Q…<JÞ„é‚ Üzvíþ…·ýP¤i/À?€!¿êüìIG9š®Ö4sIÕ&ªŠ)ªÚÅâ#’)?1oåqB.æÕa1e‰;ZG’ÙKîæ¡7;à_âQ¨ ‚1² :6ÀGîÀë£é7†Å‹öÒëµ6øºëcºw*ÛI¹y¨J úÍN3³mÃ{h¦ž¯ö$Ò',mz<ÛŽËÔëƒQ¬TvƒÈ˜ëÜF—:®ÆòÏ7³iÏYlü0$ï`áÆó„ YÎkãð–%hSc_îfë”(I%§<\‹Û˜÷ßS4¿–ñÝ«¡“ qè%~쳂‡ÇëužË# ÛÜFÛÆ4RSœ?^À‘ây[ixFS7/ÉùƒMMÙQb¹°4èL=ù ¶þ•JÏ_÷ýB²þ̉Œøiÿá§ß3‰x¨UµÙ#[s{»øÈíh~žoáëã´hd,õ± •G…<A¸µµlÑŠÍ[ºÝ&ËòÕg¨8Ðê טdqdÑŒÚڌًG›ÓyZrÞŒsjCm pÔf¦i»øÈ²s›wššY¾ïOlíñ+õÁ¸j0% ¹w6öaÃá\ÈjÙখ2z žk…‰,Ò/ýÍ®MqÄM|û{˘Ҽ÷7Ò0õ‹Ý\ìÖ ÿ“Ûù3+‚‡Y*Ö¨è•lÎÿ¼‚ÙK>gG|VÙˆ6Ã.9Ⱦpˆ“Ù~´j†Áu­ ɦҤÉUøZ¼p€6;§g>H›Y9‰T‡‚÷y+º»bHË-¼ód?Žt}ýzÓ¥ž?ZÀíy[iHùŽ «4å" 1wFÚY¼õÖÛjñûÖsD=2¯µ_³ýŒ^»Ù™LÇVAè¤3¹{Ê)#†jÑó)ç’Ws’„JDž‚ ”»œ›NYÑúEê¿ýy «ž¯©]Åž–ÈåK©d+PÒ¨½Â‡$I ºÆ!#Éxi +#EU‹&ötl: ªêÀî©™ÇJºuœ}<‰¥yÈS—ù IDAT‹\é=’Më0¶Ekš?ÐÝ ŸòóÅÎ4ø~‰¡wÓ*P|•ß(Ù'×1é™8R»Œã•'¨þ͆i¯ð]NYƒŒ»RL»]iÒxâ°£` Ý³ï2>Ö'ß ŸàtÞ œóíw~·+W1uè*Ö<6ŸyCb0"=o+aFç嬺p_l¹ÐÓ®S8ï|´…£—Úòu|ÆÝ…ßÎÙ°ë÷é¶ð·[¦ÕÐã®sˆ¤5 ÃAöµ|VB¥p U ‚ œ¹ýîòÇúÝ|Ö±âps+î¶æ\ŸZ^)ìÝq†Ìœæÿ¬Slß—ŠWD}Bô’ÖB˜EâRüi¬¥½Gfa矩èªGäå©Of^í$IHöt’l*_22UÚâË_¬ûâ¾Ùš@Í{;SÃc^ÂõÊüg7ñö: |¬'ÇP¿a#¢,yŸ·Wpjy¥òë¶X=Œ/MOtu©¡Íäø1‰ÐÈÚDÕÎyDfÖ’ÖL­öýxnÞjæ=`âµ8dUQ‹ÝV ?¤_ÎÀ‘/e©Ê:jÜÕȤmløì~7¶£CõPZßÊé/7ññgÇ êz/uÜÕö ·ñ3ùV&ëèо*-’™÷GYâ¦p“éõzRR’±X<7\'''¡×®.cÉBëÑS¸o׿}”Cý{Ò1¶&Uµ©üqäÿÙ»óð(Šôãßê™I&÷!!!  ‡œ¢° ‹*‡  ®\+*(—¢"îOqv% rl¨¸ë‰Š«\ (,Ê- ‡@rg’L÷ïI 3“I¸¼Ÿç™çIÒÕÕ5Ó53oª«ëͪpN¹ lÇë3ð Lòy”{ã{?™ÇÂ£Ñ ÒŽ ¥ÀE—õ™3ÿM^JÊ¥Wb-LÇvs¦\`qê›…Ìop-à ØóÙ’Ž„ÑR›âMgOx?[ ÆßžË™ßwñíKø:;ŠwÇâ£ø%0°O]î_ô: £Ù¥^Õi=ÒëŒwdQj!É VØ£9Ñ~©Î>¸©À¶Œ|(†Iã­§_ûhüóvp0»x•˸¢…vä±¾‘ N~†±ÚPú´‰Â'?Ù èyo¾'¿ãý:õcká[pŒ-û³0üÃð7AÑño]nsËAóx+Ë>Kbib_âŒSdÖîÌ]‰¼/s®ô‰{›éIi„Fo ^·ßA9sX¢G2ì¯1Xeòæ KÏêJiÔ®íK¤-—­éÅwɘ½Ô'Šö¿cÂú|ÏGZœÑL4Žõ§Ù¯§eè[\ñqÙ¹{6›Íeoo+ñ±ñ•¾oªq+ý×"ZÏŸÏŠoóê²³&üjÖ¡e§f„™Ý¸Xi4l6óüf0sÅŒ>iP+¾=£æŒåÁÆ>8â< 1ƒ^gZÆTf¯œÆ¸¤"4Ÿ jÅ·&!Ä|îr¤fÍâ‡Å¯ñ^ªú-yøõgÑÌ cE3Á‘µðúz!cŸX˜ð £nâ½<ûÔƒôjX¼¼Œ îyVï¼ÂæøÁtò’÷ïeäÕ` Ó&œäÕ¤Lü̆% ‚fÑ% «[‰ò‹‚ßbVJ/,Ï Ðd%$<‘®±˜•ò°Œ+¾4{b>sCg2û£LJÉ ÈJÜm#éÒ3Kú.¾|'…­'m`X kÒ•§_DœUÃæf›Ûw“Bç1ÏÒ篳Yøâxò}Âé0´)Ýc4ð¹çP\ —7°U(M¹¹‡H¡™ÜlUn6;ÊT”YLih&“Ó`â¢&×uyÛu€ =ƒŸ–¾Æçþ½YÐ¥–ÜÍ~xÔ”†º¨2Uì‹JCsµ›«mE™>xœgâÊDPÝ"}54{òzऌ2•ïßΞ³û×A\û$ð¼™Gβ¥ жM­øÍ%«$ô²Ò­¡™¬ýìÎÃd¦yË07÷#Æ×àTj6Ëÿ›Æê“:ºf¦uûZ Œ·` ;ÿ[s˜ÉûUÕ½¥>+Û;*Þùùž?`fÀ hþxø}›ï¥T&5«Éþ4Ô°çÙøøÓ£¼sÌ vóÚü_{?½ (¿m?§1{s§+Œ5âÚDÐ/ÜΧ!épE%›vœAQøºjÿÎ" 1ѤyCZø§NæòŸu'ù÷ïvGÐjñeLñ¨î˜âQ]sP0{¨‡WdÆ1[:G0 Æ›Ú~»ßOä°j]_ž,5ý@ˆAá>xe‹˜©Õâ&¿9Œ?Y`[Tž~ö[&ýy*?;½ðæöÿæö2â(. Ã[ßæ‘©)ô´óK­¤m?δ…¹™vtÌhš*•JLQ¯uÓÚ›ùßé¼~¬|Mde8·8{,“÷¾<ËY„E‡2¢M9ùÓÚÝXzûp_‚û¡,?RDa¹Ï§ó—n\µ_Ñ m^kgbËæS¼vÊ ÁM5Ü»ÖäÃ$§9.ÿhJ•ýpS “¦ÐP L4¨çCxÆifkÃæeáæÄ<Ñßÿ¥Gøà´$Õ˜W ­XË—N+__/þ/ã’©&A§¨­æÝ,\{§ËíJ.s‹ËÈiàéÉœ+ ³w{&iM‚éQ×Ŀڱ&š$úáŸq–Õ§t «?ÝìÅÞï~cÑŽB Ø•e¦Íƒ5è–Æ/Ç—sÓsøþ·<òÁ±tZqN3[NÓl/§Vþ:œ²úñPkoÒ·aÚ÷ùäé8fî—ÏIËfÝ)Çï¤Ú‰Š¦k – O³Ñ^ŠGmdWМµ«?¶ö"mëþ¶)Ÿ<¾?dÃ{P4}ÚùòÉ'9dzð +¥È;Ë÷óÈ7à‡ùèÖ¡{_¾ø,§Â¶ qõ\êK†r R\* “ô%q•8 <åÆ ÏÙÒ3øüt0ƒšûSc§|ý¸·‰ƒ³8Z–@+QfEí®õYÙ¥x§âQ>[@é ÙŽÑ»ò1É¢¼®â+‹¿•z‡ É׋Ëޤfƒ†¶ ¢eM3>ºA‘—¢ÈGU|lqu½ü± ÚÕ奆yLY‘ÆÞs׻˶ßËßJ´YgÇo¥ÚUXÈæßuzGúfÊ!«¢6”~ GÝv› Çtî³RÓ”CvQÅ{ !„¢zKíË^À7[óø‡`:g²¡n0ÍÈeæ^Çè¦Å¤0¡óãšßy÷DÙ»_ós#¤®x4˜W|ã„îd£98˜îªïÞSÌX›ÇåE?EÐÁp¾œAiE¹œ(‚¦¬PXº^«‰?ÍýM ªøNiJÛ…X,•[H¸Èh’ý@!„¸ÖÈw÷%pjÿi~(ðâŽÄîha%gÿ¶ä8F ³óùÝ®jšnãPz¿?N8]¿¨˜¡“U>>šÛ“T˜•ÏïvMë™ñ*½y‡øRO³ñïβùx>ûŽçñ›“c:á¶åññ>;¾q5¹3Ì}\µëH‘‰&¥Ûe²Ð:ÒDá™|NÙKÇœÈ7©iÁÇÓŠMZFh-ðà)!„BT'2ây ù¹|°ÃÎôôÒ YùYÞ¹¹‡Fn˶2­EÏ“ÎG É7›‰´ÚøzG¾ëËÍöBv¥éÜsS î=q–ß0㟕Í7'Ë;/‡%Û ™ÞªÏ«t¾^„h%¨\]!15žÉÎEƒF5¸?¸ˆO¾Ê%Sæw !„× ’‡ÝÕS…ÇX³dŸìÎ’/ú땞ˑmëY¿?Ëå?ðW¤NOú¯ôGq È¥vQ}Ù]_ÆâŠÓÓøpxo¦ì´_p… És«xçÂëÔ¥N-ÿR™ÅÜ3Œ’•zÝ•ÑK­æ+k,_wò÷0ÿ™ 츄e1ås„\¹:5Ïú¯ôGq±$ðÕšaîS{ qÅèv;öº1}\kL%ó’M4Æäe¡÷ä·é¥š$á• ëöKž1°ÒuZêJÿW„žBQA1´hÕŠ¥‡…”BìgÎÀGø÷-oóÁ˜¦øj ÓÙ´l3–¯gïiáM»2ôéQÜïbª •o“¦óÖÇ[ØÚLDã†pÆÀ$#þW—žÉö•³˜‘²ŽŸea iÂSgñT¢šq–m)3y3e;R ÂwdÀScØ<Ä1rhOeõ/1wݯOËÆ¦ü‰hÒ‰ÁO¡w£óýààÜAÜ2ÏñóÍS>e~W?ެ|–‘ó6q,ÛŽ9¸íz?É CÚS«${‡«v5tUg°ëìûy»|ÿ½ ?ÆH­Zž«FÆIšNqE¬XþÓÕn‚¸Öº®£—|f)…©øgC·c?wof>»’FñxŠ/ýžz™±Ùl\4)c4ê&?Mïòõæ²í#·B§Óà1 ÷&mû§$í¿+õÜ„üúî(†ÌK§ÝCñZ‹0Ô™³Ez£”½I#¶ “NCF3=^±ï“yÌ1м÷0,ΊfÏfߦmœ¨3„IÏÜ„oÖA¾~o.¯1Soù³´)Ž<ÃûLaZÏH¼”¿NšR„6¿—Q/ö'ÔÏÎñMKx}á‹Lo¼œ©·†`RîÚåªN÷Ï´Lÿ•þ(.“jxš4%§âÚ°ý%ztž|þ÷š}ywùhÊ}š™›™ó¯#4Âè{jcQÐ<òßõ{U{FÒ:±ì°‘~v#óV jð»¼:,MAûÚìÿl3[äãñª127óÖ»ûøO¦¸ ?íü?d~Ϝň´€W†6ÆOSÜÞ.†üCY4o3÷OïD€~1í¸­CS|µ´­s‚ïÿ²†/äÑ:ÖQOX}7ª—:ŸM. îVºÅ7$!ŒÃ_>̶ÃÖ)Ÿ,×íR¹®ëô”ôGq¹T‹ÀS!® ‡2ó™¶j hÞ5‰µj¨¢²Å Nîà ­ˆ£SûÒ~ZÉ_ t»ŽÏ‰\ôIJå OîâPa0mÛFaÕ4Ǩ•Ò*Ì&.¯‚ÔíìË e‡zøjeχ-õg~µвCô¹mʧ>Zðî¶_Hµu$øÜœ Ç‹R kíxÂùˆãçg°+pçê/äÄú÷˜±ðc6îK%WóÜgÇ’‘^A»\×é9éâr‘ÀS!*ÿ.MJÍñtñÅn/BÇJ‡çf1:Á·Ôý¿ ßðPÌêtÙòš ;Ež,Å$®ÝŽBs³Ê`ùó¯¸[¯@™­X°SX|®ûen/<´œq’Èêö“ŸlF˜ñ+'MækÛå¬ÎJ‘þ(.Y°S!*åüÈ•r3šd kD´9Ÿû‘1 ‰mXòˆ!*Àñ?¿R`¯æÞ”^Yü¸ö ¹’%¡ÚðªÕ˜hs[7%¿Üyñ oB¯L¶nüýü¶‚#lØ–…Wý&Dx«Šc>“•`+äœÎÃ^*TÍ?¼™}Eq Þ‹ÎÍÓ$±±Açës×.WuVêyK—‰Œx !Äe …vä±¾‘ N~†±ÚPú´‰Â'?Ù èyoAæ@"'7}ɆƒÑt‰iËȇb4žÑúpúµÆ?o³%[×Õ¤B:ðøýQüyñ8ÆC¹¯E$ÖÜ4rt¥{l;žXŸïL`’ϣܧØûÉ<fè”vyr]ÚAóx+Ë>Kbib_âŒSdÖîL÷Ú D©…$/XA`æDû¥r8ûü(ªÛvÅ8¯ó®Ä`טUÒÅåá4ð´Û¯Þʉ§O§³wßòmù.Ëx{{ט¡5®`Ë„¢2|iöÄ|æ†ÎdöG ˜”’A‘5”¸ÛFÒ¥gA–zŒÄW/ÀÌ÷»rËøD⇼Ţෘ•’Ä Ë3(4Y O¤klf™\w•ø’ðø<æ†ÌäÎå¹%YèÖ(þ8¾ˆ¤Ñ°ÙÌó›ÁÌo0ú¤A­øöŒš3–ûTx9ZÇÎú…ãoœ«Ã±DWÉH¢ã|« û ”†æ¦© êtó ]ö_é׿äääsŸûUýŽ\½z5 èä¹ÅœR?çùNG<¯æM¾-Ÿ À ·m ÆæfDÔýì^5•/üneØSCˆ( íÐnöhÁøÊLW!„”fr“~P¡™.ܪ”†“?—TˆVn›Rê’äM—’»óèö;íåÿ¦ÐÊw„ ë­¨L¹:‹29|ð89Î.h*AucˆôuÞéâRºaæx^Ï–Lº¿ü<¶ pÌs1î*¾+PAî6&õÉ®KXúp}¼MfPÿwˆµ’—[äðÕß^bîÚ_9~*¾Dµ¾‡;k|ÿñçlÜwU#–[Mà…~M4©ó+*³…Zá&[…=uó^çí¯¶sðxùF힛͠ÍO0fg//}”F>ŠöÍ{«Z0wųÜì¯IV]!„¸Aég¿eÒŸ§ò³Ó»Ô½¹}Æ¿y£}Å‹Ì q±n˜ÀÓR³!¬bËÇ8Ú¬;õ}4ÇúfçJ8ò0—¹¬aèèv $ûDÝ¡üßóM±¦oeÉ›‹™¶%ŠîC‡ñÒN}·€¿Ízžš‰ÿb|Sßó+*³2¹ÏVa?Ëÿ¾^Çš3qL ‚õl´øhš†¶Äë«ü”>ŒFu4Ð3øå‡ß±4EC_î¬BqÝÒjÞ͵wºÜ^zꀗSµ <7mþïÖþ£Üís¡!¡ ~dX¥ë3Eöä剻?m2½×½KÇ»{ñÀýwÓ>Ú×Í¥³ÒŒâìméÔ._íf¢N|C¿Åõ¹«O:h¨–>ü¸æi6n:AA“¬Å»Uj¥¹ÍVá `øÇv K‡Ç4¥À÷nö~Ï·¤Ó/*sÎ>Öи©OcüdŽžBÜঊ®Û qTÛÀ³Më¶´nÕÆé6ÍÝJ¾.yÓàî‰$w¶o>áƒ÷“µ"‰Væó·Á‰z\cÝ>¥¼¨ ¶Óœµ T(Ÿ0êÃÏé9èeÖN«Ì>En³Uœ¯²¤Îâ 2 9=›™˜øéfÒî¾›Cø¥ >7 Bî›B!DuPmo«QÊqg ³GÕ+Õ°øGÑúîaLIZÁÂ?‡òã‚),;hCW^&(È+D÷p‘2³—…Žý\y3V èE®3VT´OI¶Š]Ñ0ùI¼;s,wÔò`~¦D«{[aùå#Ö§årð›¤Gv¦mXµýßB!„7˜jx^NJih¦@nºµ5Tv§‚)ˆ¨ Å©}GÉ­òâ¸UZ,»OEÙ*\Ó¨q˃Ü´›åŸþÀ—ߦRïήD{ÉüN!„BTÕn8ÌÛÛ›ÌÌ ‚‚‚]–ÉÈ8‹··µRõæí\Èäy4JlHtx êì~þ»tiæfÜZߊòŠ¢KúÌ™ÿ&/%åÒ+±¦c»9s…S4xGºÏVá–_ûÔåþE¯s 0š‘]êà%³Å…BQMT»À3>®1;wïÀf³¹,ãím%>6¾R‹ÇÛµάa鬥¤ç^Ôizãþ>‚{"-( fÐëL˘Êì•Ó—T„æD­øÖ$„˜]æc¾Ô¼ ¬ […Û½ipσ´zç6Ǧk”×9¤-„Bˆj©Úž5Bkоm‡ ËUn‘{ ÿF÷ñì›÷0¡Ì=? MÏ0¡¼ëðǧþN×'ËÞäÈBÑÇV¬eD©¬þf±ih¦â9˜^õž¼–a%e¼b*¿¾ÄÝ÷,I÷L(÷|‹³U8©³L9kMjøÐ¦ßmÔ¶Èh§B!ªj9 ¦”ªðQ…JÑ4&S©G™´fÅÅ4­lSIG¦‰2ÁžÒÛÏÿ¡\™ªìS’‰¢l[5wuyÛ¹ƒ]¿l`Ùk¯ð¹oFu©%w³ Q¥òå̉¼øþoØ\Í¥±§³qÙ[üsmEWvָєïžôO!ª Zž¢’ ðÁ+#xpØD–œéÊä7‡‘à'™Š„¸¢l{™óÈô›µ§ÙaʱŸaûšoØ|$¯Ô*åcÍ’e|²;KOá1#g¾:œ;»v¤UûNüé¹o9m¯ •ïžôO!ª Ú]jUàÇã‹ÿËcP<²+A§—œžÆ‡Ã{3e§òqe“çVñÎ>„שKZþŽ”¼0 ƒŠn4 ½¸ŒAÕVÎ7–ö¼ó®5¦’¥ÊL4Æäe¡÷ä·é¥šd W‹=­ß# Ës ¹£~š¢$‰‰ÕÓÀ³Js(…âFC‹V­¨QzXS)TÁ~æ |„ßò6ŒiН¦ 0MËf0cùzöž6Þ´+CŸÅ}ñ.V©(HåÛ¤é¼õñöŸ6Ѹ!œ10ÉXÀÕcOeõ/1wݯOËÆ¦ü‰hÒ‰ÁO¡w£LªC+žeä¼M˶c®G»ÞOòÂöÔ2«óû¯ý•ã§²±áKTë{x°³Æ÷ÎÆ}§Q5b¹uÐ^èׄÀ’~å®ï¸ûжçr:ÇàìÇOÐùGÁèaKHÁ”Þ£Ø5p K®·‚¢£É êÿ±³Vòr‚t2qeÈ¥v!„¨ Ã@×uôsËa(LÅ?ºû¹Ü¶ùìJÅã)¾ô{êeÆFd³qÑt¦ŒÑ¨›ü4m¼Ëכ˶Œ`Ü NƒÇ0<Þ›´íŸ’´ü®Ôs²g³oÓ6NÔ¤gnÂ7ë _¿7—ׯ˜©·üYÚ˜m~/£^ìO¨Ÿã›–ðú™Þx9So ÁT²Ý¡üßóM±¦oeÉ›‹™¶%ŠîC‡ñÒN}·€¿Ízžš‰ÿb|S_4UAß 4U8é"¨ëDf<‡U)|¢ðRèv;zéy"†ŽÇü#^ IDATn×˦câ2“ÀS!*cûKôè<ùüï5ûòîòÑ$”û45273ç_Gh::…Ñ÷ÔÆ¢ yä)¾ë÷«öŒ¤ubÙ&ýìFæ­:AÔàwyuX,>š‚öµÙÿÙf¶ÈE¨«Ë¿˜vÜÖ¡)¾ZÚÖ9Á÷YÃòhÝÌ€¸[éW\6!ŒÃ_>̶ÃÖ)ßsû·¥S»|µ›‰:ñ ý×ç®þ=é ¡Zúðãš§Ù¸éMbðΪ ï´ö¯ðÒ¹%´Å㣊¯bæ^æ×HIà)„•Ñp(3Ÿië¸YCæ]“X«†**[¬àäÚŠ8:µ/í§•üÕ@·ëøœÈEO,[¾ðä.Ó¶mÖ’¥ÞÔ…K¾‰«åür~ÖÚñ„óÇ3ì@!'Ö¿ÇŒ…³q_*¹šæ<;–Œür#‰Žy–JyQ3&l§9k¨P>aÔ †ŸÓsÐ1*î;ø{°$£ãÈÔ9QÝHà)„•á_—&‰ ¥æxº¸qÃ^„Ž•ÏÍbt‚o™µ{}ÃC1«ÓeËk&4ìy²“¸ª”ÙŠ;…ºAá¡åŒ›DV·§˜üd3ÂŒßX9i2_»ÙßìeAQPj™"3V èEÅ÷WØwªÒh /ä¢ò¸Z$ðBˆJñ,‘…%¬Ñæ|ìWDÞÓ¿2÷")°9¾ûâõ½Â›ÒÀë=~\{Ü– øK`pMÈ?¼™}EqŒދΑ”=Ø ÅšJÕRö\WØwªÂDTâ³}GÉ5âðqÖŠRýÑÙïB\ ²€|u"™L„¸nh¡y¬o$'W<ÃØYï³zý÷¬ýú?,ýð2옉 TœÜô%f£´eäC1¤&gôÌ÷Y½aÖoá`6È wÕ—wdQjÉ VðŦìܽ›ÃÙ·úe…}§*,QtéQŸ‚oòRÒ'|³q6íæLIç2•évSÙþ)ñ§¸T$ð¼œ$“‰70_š=1Ÿ¹·&Ý&ËèWæñŸÿ%[Lô5ˆ›sþÃÌ÷’ox?ä-댾!‰ÆŽæ‰s0,‘¶±˜e´Z²Ä dÚ„» Ú¼€‰Oý…‡†¾ÀªœE»X2Ë#ôªµ”˜A¯3­}­œÆ¸ÑO1ö›ðŠoMBˆU¾?jáåú§|áˆKÃÙ'™eÙ²eÝ»w¿"“’W¯^Mÿþý¯Í Ðf2±ñÑäWXßt¯>ÐkEÏѶ›7úæ«?$ñÁ“79Ö,/ÿg^éõ6÷^BÊЬeÊèdïù„9³—ðùÿŽr¶ÀBPD=» ç…G;:Ö”»Á%''Ó­[·k³¿]!%ïÉ”””k÷½y™º “Ó,0Ž›? Uv»aèe—°)½½x[é} CÇÐK˜)”¦áAâqY8;¯Ž¿¡™Ð”“s (¥¡iÊùþ†Žc÷’,sUè;•jo©­ºî˜ãy¾RG¶;Å…ýÑIÿ×§äääsŸûUýŽ\½z5 èäáXG!È)õs/sxœ»³C™ªC¤¯›^ªi®ûpùþè¤ q±$ð¼ªI&“‚ÃëÙ’éC÷—ŸçÑ6ÅÙ-Œ»0PŽÿ¼s·1©×H×™+ZäðÕß*™a£JY9*Êô‘κy¯óöWÛ9x<ƒ|#€vÏÍfÐæ'³³‹—>J# Eûæ=ÈÀU-˜»âYnö—õBˆë›~ö[&ýy*?;¾åÍí3þÍíd„\T[x^ Õ$“‰¥fC"XÅ–7p´YwêûhŽø|…î3WT%ÃF•²rT”éã,ÿûzj>ÌÄ1-Ö³Ñâ£iÚ¯¯6òSú0ÕÑ@Ïà—~ÇÒt }•BˆëžVón®½ÓåvU|ù_ˆêJÏK¡šd21Eöä剻?m2½×½KÇ»{ñÀýwÓ>Ú×ÃIîF¥3lX‹w«Ô>Jó Ó‡lºtHpLP |ïàfïø|K:ý¢"0çìcí›ú4ÆOæ! !n “ëëúBT{x^ Õ&“‰7 îžHr—!lûæ>x?‰Q+’h5l:œH ÇOÈó UۧȳLª¤Îâ'МžÍLLüt3iwßMÈ¡ üRPŸ‡›UmAe!„B\Qx^ Õ)“‰Ò°øGÑúîa´ºóúÏ”! ¦°ìöwùKTå3WT˜a£ ûT%ÓZ­îm…åÅXŸÖ•¦ßl$=²mä !„×¹×ù’8ŸÉD)A'å²QÄ4$¶aÉ#†¨Gðta&“,G&“J®¡¦”†f ä¦[[QÓHewj!˜™+Ní;Jn•—d«R®¶2¿•dú4¼›7¦Ib3bƒ<™£©Qã–¹#h7Ë?ý/¿M¥Þ]‰ö’ùB!ĵ@†Š® ’lƒ“Ÿa¬6”>m¢ðÉOãpfzÞ›@P™L&Ñt‰qd24žÑúpúµÆ?o‡ËL&y;2yEˆ:»Ÿÿ.]Eš¹·Ö·¢¼™+æÌ“—’ré•X Ó±R™+®G¦…$/XA`æDû¥zžéÃ/}êrÿ¢×9PÍÈ.uð’™ôB!Ä5AÏ+ª8EèLf´€I)YC‰»m$]z&dqdŽøêå˜ù~WnŸèÈdü³R’xay…&+!á‰t½ “‰Ž] !àÌ–ÎZJz¾áH¦w0îï#¸'Ò‚G抌©Ì^9qIEh>AÔ*É\q…â7¯™6á$¯&-`âg60 ,4ó(Ó‡ îyVï¼ÂæøÁtò’a{!„â!™‹.RµÊdbè†^v4T)´r7$¹Î\Q• UËÊQéL¥Ÿfæüµÿs|sîŽÀR‰®#™‹*&™‹„âÆr%3É`ÑERšÉM*1G6ŠòÛÙ(L祷+í‚}TÉßÎ=\¤ÏS M3•«û»à•Vîø¦’2NÚ«4Çv—Ï©*û8y L¦â ÓEFÇvî`×/XöÚ+|îß›Q]jÉÝìâÚU”Ê—3'òâû¿as5ÏÄžÎÆeoñϵiIªìk‡'çMÎí•#¯uµ"§¸6áƒWFðà°‰,9Ó•Éo#ÁO2‰jĶ—9ÜI¿YÛÉñd% û¶¯ù†ÍGòJ­QNá1Ö,YÆ'»³ä óZâÉy»ÑÏ­žË‘mëY¿? ûå~þ7úk]ÍÈOqmðŠãñÅÿå1(Ù• S\azïÍ”vÊÇ•Mž[Å;wø^§.ujùcò°s†AE·Õ†^\Æ j«Jˆ«Á“óvCŸÛü=Ìf;.aYŒ'óû/Î ýZW3xŠk„ãò»W#嬽îCLךSÉ2^&cò²Ð{òÛôR MæÅ Q!]·c\áUUÄÕ'§BTFP -Zµ*•0G–­‚ýÌøÿ¾åm>Ó_MAa:›–Í`Æòõì=m"¼iW†>=Šûâ]Œð¤òmÒtÞúx ûO›‰hÜΘä»ù**äЊg9oDz혃ëÑ®÷“¼0¤=µJ&™{rÞ**cOgݼ×yû«í<žA¾@»çñ÷{"±¹ëGyìÿÏßyeÁl?™aà¶§þδûêàån›»ÿì'ùjÆËÌûnGOfbó ¡^Bgzòqîmp~D_?˶”™¼™²Ž©á;2à©1 lâ(c¸k›ÃÁ¹ƒ¸ežãç›§|Êü®ÁhF&ÛWÎbFÊ:~>–…)¤ LÅS‰~hFÇôô|¸{oÊÿ—•žBQ†®ëè%£šJa*þÙÐíØÏå}ÍgWÒ(Oñ¥ßS/36"›‹¦3eŒFÝä§iã]¾Þ\¶ýcãVèt<†áñÞ¤mÿ”¤àw¥ž›pÂDhó{õbBýìß´„×¾ÈôÆË™zk&<8ožœ[ûYþ÷õ:Ô|˜‰cZ¬g£Å×ĬÜ÷£§Sxvêçø>0–™·Fa>sœ¬ú¡X€ÂC®·¹eÏbÏÆù=j0Ç4Æ'÷V.â•Á»É\ú6ޱ¢°±wáH†-ȤÓÑLWìûd3FŒ"ï½ ‹³b÷àøá}¦0­g$^Já_'Mðë;£2/v=Æk-ÂPgÎéR6ö&¹?¦æÉù¨è½h’‹ñ—‘žBQÛ_¢GçÉç¯Ù—w—&¡Ü§©‘¹™9ÿ:BÓÑ)Œ¾§6Í#Oñ]¿÷Xµg$­Ëcêg72oÕ ¢¿Ë«ÃbñÑ´¯ÍþÏ6³E¾¯"€¸[éWükB‡¿|˜ÿl9†­S0ÖŒŠÏ›ÇçÖ0ðí@— øj8RÙe®uÛ¼NpÚîGbû[¹¥y&Õ’’´ÍöL×Û*d€_L{ºtnН։Û;7ÁôÀHÌßJïWÛ½™9‹1h¯ mŒŸ¦¸½] ù†²hÞfîŸÞ ŽïVŸÆêã¥@)…‘ù=o½»ðÿdÚˆ›ðÓÎÿƒGæ÷3ȃóQá{³µÿ[×úF$§BTFáÌ|¦-ššwMb­ª¨l±‚“;8h+âèÔ¾´ŸVòWǵ>'rÑË–/<¹‹C…Á´m…µd4uárhâJ+äÄú÷˜±ðc6îK%WóÜgÇ’‘Žgç­Rç¶8írÉ:ж ú‘å÷3¸ÍÞ|òövïË úÐí¦Ì€5Þõ6ÏœOm ¸‰?4÷eåžœ,h‡wêÏüj  e‡h|‹Ÿ“ò©O§–¼»íRmiäÁñU©ç Pº}ù´ìPï\½%lÓ׃׺Â÷&þ²äÏe$§BT†]š$&”šãébÉ^„Ž•ÏÍbt‚o™um}ÃC1«ÓeËk&4ìy²“¸b -gÜ„$²º=Åä'›füÆÊI“ùº¤€'çíbÎmýÈâÆ ™ïÓñûYºx ‡,!yøÛÌÜ?kŒëmUH5l¶˜0 »cI¢â§rÁ:Ñ Î­Õàîøçö5ÊÞh®Û1Phn"?·ÇT¼Ö¾7+|)ÄE ^!*åü(R®/[ZÂmÎçÀ~EdLCb–m¢ðÉOãpfzÞ›@9È@ÅÉM_²á`4]bÚ2ò¡$g´>œ~í£ñÏÛÁÁl8ôêñŽL J-$yÁ {4'Ú/•ÃÙç7Xñyó¤Œ+õ#ß“ßñþFú±µð-8Æ–ýYþaø› èø·.·yâÔ7 ™ßàZ†°ç³$ £ÿ¤6k ØŽ'Ögà;˜äó(÷Æ)ö~2…G£:¥AJQèîø–šÇ[YöYKûgœ"³vgîJìÀã÷GñçÅão 徑XsÓÈmЕî±ӓ׺Â÷¦ÜÖ~YIà)„—…/Íž˜ÏÜЙÌþh“R2(²†wÛHºôL ÈAQƒøêå˜ù~WnŸHü·Xü³R’xay…&+!á‰t À,“=¯ ¯™6á$¯&-`âg60 ,4‹.YËêÁyó¤Œ+îû‘%}_¾“ÂÖ“60¬„5éÊÓ/"Ϊas³Í“Þ¤Y³øañk¼—j'¤~K~ýF4ó+NÙl¥Ñ°ÙÌó›ÁÌo0ú¤A­øöŒš3–û )Èww|Bç1ÏÒ篳Yøâxò}Âé0´)ÝcHx|sCfòçòÜ’,tkߊ?ÄFVxLÏ^ë Þ›²dôeå¬ïY–-[Vн{÷*%‰¯¬Õ«WÓ¿ÿ+r,!’““éÖ­›ô77JÞ“)))òÞ,ÇÐíèh˜œÎsÜœ`¨²Û CG/=߬ôöâm¥÷1 C/})T¡4*LÉ—ÈçPJC+wž+:oîË8ï?.ÛPR®¤oZÉÍ4î¶¹S°Ÿ·xˆUíçòá˜&Ž;Ã]ôòí*Î*WR¦Âã;–&;72¬iç’/”¾J3;¶Ûc–j—'çÃå{󓜜|îs¿ªß‘«W¯fÀ€}€< ·ø‘Sêç< _F<…ÂCJ3¹Iíç<»–R.“n) ­Ü6¥4”Œ¸T+nÏa©27÷eÜggsÙ'}¨ÂmE™>xœ»³}L…ëÅ7êhh&“Û`¬²ý»\4ÜÕ{)χ$Ä»òœžº¡;û³B!®qúÙo™ôç©üìôÎoonŸ>‹ú2±X\&NOMÉÍîB!ÄõH«y7 ×Þér»Ò4è°Ž'nàKÏâò‘KíB!Ä Eaªè³\ƒ—‰ m !„Bˆ+BO!„BqEHà)„B!® <…B!Ä!§B!„¸"$ðB!„W„žBq#(JåË™yñýß°ÉÚàBˆ«DÖñB\WNŸNgï¾=äÛò]–ñöö&>®15Bk\Á–¹¡çrdûV4£}L¦’5»m{™óèhþÛr*‹F%âw1‹yÛϰ}Í7lîú vàâ„ÝBqéIà)„¸®ìÝ·‡Æ›ä²Lff;wï¤}Û[Pž`ú¾Ó›‰ûþļåÏp³¿Fé½ò~~ƒ^#>§É«+˜Þ9ä|àè©ü=Ìf;.aYLÀù|ðšáuêR§–åëtÂ0 Ü wœäû”¹$}ö»ž$Â6£s¯Gy²W#$‹â"Ià)„¸®äÛò rPcs3"z-˜¶÷µÄòì7|¸ó Z¶ (5`˜ÇÎÃIk;&6¢ª±™®Û1ÊçǶԥ÷ä·é¥Úe¡4rw2÷‰ÇX°Ó‡Ä»ïcDÿúëg9²ûGöfÈ—…âÒÏ!„¨"øæ¾tôÛÈ·ÿÞAVëv•‚9;YõÝ;ßGó@…*LgÓ²ÌX¾ž½§M„7íÊЧGq_|&=uó^çí¯¶sðxùFíž[Äßÿè8ÎÄ-óÕÞ<åSæwJgî Gø÷-oóÁ˜¦øj ôL¶¯œÅŒ”uü|, SH˜:‹§½8²òYFÎÛıl;æàz´ëý$/ iO-sA«‘ÇŽ…“Y°3„¾32®m0–âÚ0ú MS`wÑþ{"±gÙ–2“7SÖ±#Õ ¼qG<5†Í‹G€s·1©×Hv \ÂÒ‡ëã­ èh2ƒú¿C쬕¼Ü"—53_fÞwû8z2›Wõ:óГso£€K2â+„¸ú$ðB¨ æô¿=˜5߬b[F:‡˜P@öŽó]F îèÕecWÒ(Oñ¥ßS/36"›‹¦3eŒFÝä§ic=Ëÿ¾^Çš3qL ‚õl´øš˜U*á}¦0­g$^Já_'M¥cèvìzI+ øõÝQ ™—N»‡ãµa¨3g ŠôF)Ðæ÷2êÅþ„úÙ9¾i ¯/|‘é—3õÖÜfÞÎù™%Æ|ËK o‚W©(¯ÌȱÝUûmìMɰ™t2šéñŠ}ŸÌcƈQä½·€aqV4 t»]/5ªkèèvÀžÅž?ò{Ô`&ŽiŒOî!6¬\Ä+ƒw“¹ômþcEbO!®}x !®K›6ÿÀwkÿ{ÁåëÐP?2¬ 5ú‘Ø÷Â?ý€÷·ž¥S—˜ÈdëëÉŒ¼Ÿ^ñVÈZÏœ¡éèFßS‹‚æ‘§ø®ß{¬Ú3’ÖÍ 0 üc;Ð¥C¾ *×qŸ°ú4nT/Uð”m‘¹™·ÞÝGøÀ2mÄMço6R ÄÝJ·¸â aþòaþ³å¶NÁøºyfEgå׃¨–ñT4´è¤ýd®cÎâD ZÀ+Cã§)noCþ€¡,š·™û§w"¤Â××übÚÓ¥sS|µNÜÞ¹ ¦F²`þVz¿Úž@™c*Ä5Ïià)+m!®umZ·¥u«6N·iZÕV’³Æõ¤oýdÞN^OjçžDœÝÈÒõ94уÞ…GwpÐVÄÑ©}i?­d/Ý®ãs"½YñŸ”B).˜‡ªJms¦ u;ûòhÙ¡¾šV®\!'Ö¿ÇŒ…³q_*¹šæ<;–Œ|tçÕ§Û0[´r£Šìÿ({33nI '‡(Ó¥)7÷¹k¿ÇÇP»o‚†f2¹Œ…׺ª­)"„B!D%Ɉ§Bˆ«Ï+†ÇV¬e„ËiBˆëžB!ª÷—ñ…×§—Ú=™˜/„B!De8_@þ¼‹U!„BTors‘B!„¸"$ðB!„W„žB!„âŠÀS!„B\x !Äõ¢(•/gNäÅ÷Ãæjq{:—½Å?צQ$ ˜ˆò<éCB\§§nèWºB!ʳíeÎ#wÒoÖvrt¢û¶¯ù†ÍGò°»Z¯ðk–,ã“ÝYx^ô\Žl[ÏúýYØKŸßò}ÉU9OúÁéòš’P!„¸ìô4>Þ›);í”+›<·Šwîð!¼N]êÔòÇäá*w†a`à>`0 ½¸ŒÈòyוü=Ìf;.aYLç–ä×Êõ¥<åð¬ QU’¹H!®ÝnÇ^÷!¦kM€I‡&cò²Ð{òÛôR MÖWÒuû…‰`,u/èKNË q™Ià)„W[P -Zµ¢FéaM¥Pû™3ðþ}ËÛ|0¦)¾š‚Ât6-›ÁŒåëÙ{ÚDxÓ® }z÷Å—µ:§ •o“¦óÖÇ[ØÚLDã†pÆÀ$ñ†g쩬~ã%æ®û•ãiÙØ”?M:1øé1ôn€IrhųŒœ·‰cÙvÌÁõh×ûI^ÒžZfu~ÿµ¿rüT66|‰j}vÖøþãÏÙÛ,‰ IDAT¸ï4ªF,·šÀ ýšXÒÜgþ98w·Ìsü|ó”O™ß)¹ƒJõ%Wå::éÙ!J“ÀS!®6Ã@×uô’QM¥0ÿlèvìç¦Ýç³+i§øÒï©—‘ÍÆEÓ™2F£nòÓ´ñ._o.Ûþ1‚q+t: ÃðxoÒ¶JÒð»RÏíZgÏfߦmœ¨3„IÏÜ„oÖA¾~o.¯1Soù³´ 0Úü^F½ØŸP?;Ç7-áõ…/2½ñr¦Þ‚©dÿºCù¿ç›bMßÊ’73mK݇ã¥!þœún›õ<5ÿÅø¦¾hª‚óhªp‚DxŸ)L뉗Rø× @Séåú’«r'ÊÕtñm¢4 <…âjÛþ=:O>ÿ{;¼»|4 å>¡ÌÍÌùךŽNaô=µ±(hyŠïú½Çª=#iXv´J?»‘y«N5ø]^‹¦ }mö¶™--xο˜vÜÖ¡)¾ZÚÖ9Á÷YÃòhÝÌ€¸[éW\6!ŒÃ_>̶ÃÖ)Ø1²h€_L[:µKÀW»™¨ßÐoq}îêß“Žª¥?®yš›NPÐ$ï¬ Îsk*šyáVŸÆê㥊Ó`xXÎVî©WÔç³óÞÏ|æ3I\2g:ï>òK^Lj»²É˜ù4ÏÆ>͹«x`])n‹¸ÄlÆ¥;±J‹ÕI³¥Mcá½…<ºj%óß®ÓÄæL¢ªá­‚ œý­X‹cì¼û˜øë§XýÐ]¸"9«z™.»ûqu¨Õy oß:¶_|±öÒK/ I3úúõë™ß4 Œ¦ý6›Î¯Ÿ×tÓ40¦­p ¥ixݤhÁ[ÔMC³ )/å(¥¡iÊûò¦AÝâZýE¸å(Ï†ÑØªÝPÖ^÷ã¸tÊgj]^Ä™ ''§ñ{¿µ×Èõë×3uêÔ‰@5PUÿ©lòw5àòþÊL©LBJ³øiSh–ãç*¥áerà ÑZÌSJCIËT+y+ƒæÓü–‡·åKåì)c_þA*uo›²Ó5d‡†Ö²€÷ýð’ÎWò½BÏkà©ä]íB!ÄiÇ(ù€þ_y© œ ¿Éï‡;¥5[œ¶¤§Bq†Ð:þ”ÕýØç|Uû_ˆÓ•žB!ÄCa‘{Þâ &÷Ô…B!DHHà)„B!BBO!„Bx !„BˆÀS!„B„„žB!„"$$ðBˆ³…§€w–Ìç¡W¿£ÆÛøâz×>ÍŸ>:ŒÇW!„h#x !ÄéªfKoø1×>±•J¯oªiA?ÊÖ÷ÞgóþjtÓGz÷Þ[³–¿}S.çYʬÌãõGgóãq£8øH.[–Gùž—¸ñÒÉ<¼©½5ånT±ÿ‹ lØ]޺全'È !D{1óúì«Y°]§e\™yÿš6k*…ªÝÍÒi7ðæˆe¼6¯M»ˆMk³xÝv[Hì7ŽYwÏáÊ ­Pµ|°jO¿õ»‹­$õé GM,ò5½€õ¿ÿ Ï|ü-WP£¢HÊÍŒ»çquo'åfïË÷qëòM¨Ð±ÆvcØÕ·ñÀÌát²ªcËô-TPƒƒ”Á—󳱟¾õ6æ£:¤3fú½e"ãûÆ5 T“å„h <…¢½Eu%3;«IOv݃‘÷?ÁÜ,G“Û­ GbOÃ4¼MBÑ®ô¿eÏÄ/á©¿¬äÁÜR<öxz]p+]–EŒ-‰KæLçÝG^cÉ«ãqW63ŸæÙاy"w¬+Åm±—˜Í¸t'Vi=i¶´i,¼·GW­dþÛ5`šØœIôO=™AÖ”sÞî.ÚÁ;Ïå²¥°L; ™ã¸û‘éô²k(ÇØy÷1ñ×O±ú¡»pE$2rV?&dÇø{!ŽñV[lk×®­0aBHžX[¿~=“'O–§ãDHäää0~üx©o~4œ“¹¹¹rn†€ièhX¼ŽKS÷@‰©šÏ7M£i¿Í¦óëç5]Æ4 L£i+œBi­HüÜ⭠ꦡYД—ò”ÒÐ4å}yÓ nq­þ"ÜŠr>¡üÖM×u¥YД4 uçØN 5{­nد†Öòº:$•èl““Óø½ßÚkäúõë™:uêD ¨ªÿT6ù»pÉ­v!„hGJ³øiSh–ãç*¥áerà ÑZÌSJCÉ;[É[4Ÿæ·<¼-\ú(gOûòR©{Û”…˜®i$;¼eFai\™÷íy«;-סùO D@x !„g£äüùc|åu¤‚p.\ü&¿.»‹Ó—žB!ÄBëøSVôcŸóUýí!NWx !„gŒ¦·Ì…8ó~ùB!„§€žB!„"$$ðB!„!!§B!„ <…B!DHx »ˆó4ºæÜÍð–ë­â‹?ÞÄ/Œž1ÙáÞúwVmƒÈPíÛ™N¯ oÓê2“ïé‹£<Ÿ½ð ¿›g¥Ûºûâ´?à æ<4™øHƒ›Öðøê‡XÔg‰ÃÒ°|×Yüï¯úa/Úš?¼ÈÂÏR˜0ëF~33Š#®äÿžø³ÿÌ]ýh*@9G[N ƒ„ÿü{s¹ï±à˜rKƤ`=zòîñØš¬!qâ^–L˜RDuqJÐ)NŠ×ÀS“Z%„¡³õ7\2öácÿî8‰ç×Í%«Å7´Y¶™¥ÞO¿¹¹Ì½¼36’ðáµ/ðÆÎ[œÝ¼Ó(ÙÈò7‘2ãy½1MÁðÎì~{3ŸÉ×|ðLˆLÆ#ûáÐF2´Ë!>ýïñÏ=Õ î‰³×Æ÷ªO›•À¾w®ç¯Ÿ ft,ŽÆå‡2zXí†b°¨A€j¶þˆ„îôéÝ0Jº|ˆ“ä5ðTJÆ•Bˆé9‹%÷ %ZS @ ïHº]Cyš'«-ÜF~‡ï›Äð… SM Ý âPFvóôîÂìuÇ2th vM« &”&—´ŠB©º½s‰ü…ƒ¥:àæÐ†X¼ú-6æP¥Eb­Ö±•º0Ž[” £cZ<ÔSR*Z¡"è _Ub`.g¢Nàí/þóçȸ†CÞã·MaׄILŸ2‘ñ}ãš êº~H½§€ÜjBˆöÕ•Ìì¬&}<}\äuvFÞÿs³Mn·*‰ñXUqóôš <0zJ)«:nÃĽwwÞ»Šòñ·óðmýI0¿ã•æ_~–·†ÙPÔ6îȊ݆§þYô€å|^æÏžÆô%¯2êÓ·xéÅ5ÌŸ¹†œÙËX:£‘4Œ®hÊ┑ÀS!ÚݱÖ4l ½IµºØ³[‘|yO"›=‹¤ ¦.P0ë] KìG°øü£|ªe%MV§œkßfò<½¸söUŒM¶¡ôhÒcïÐZš—KÀr´¶&u pþÊê¤Ç¨)üjĹøñéÜœû ;&Ïç|›X;TW£Kä)N <…â ¡Åâ—“’™‘swh³˜8$…×aö•õà²+²ˆ±F“­(ÜôŸä§rQÚPn½.©«îb®1›k‡§U½ü rNðä,RÔjrV¾Lô%H,`_ÅÉ¢°œý=ÖÞ¢Œ ?÷Áxu£A÷ôN8jðÙîr̨¢,€-‰vÖ¾½Š—²'ÑËòK^Lj»²É˜ù4ÏÆ>͹«x`])n‹¸ÄlÆ¥;±J èI³¥Mcá½…<ºj%óß®ÓÄæL¢êÉ ¸ œý­ØÒ¢Ü9ÕoþÜE;xç¹\¶Ö€i'!sw?2^v ¥â;ï>&þú)V?t®ˆDFÎêÇ„ìNä¹z!šòVslk×®­0aBHž^[¿~=“'O–'åDHäää0~üx©o~4œ“¹¹¹rn†€ièhX¼Ž&R÷@‰©šÏ7M£i¿Í¦óëç5]Æ4 L£i+œBiš ‹oeP7 Í‚¦¼”uéÖãeyÓ nq­þ"ÜŠrö›åæuÀoþÒ›Öì´º¡¾ZÈëêTœ³MNNNã÷~k¯‘ëׯgêÔ©j ªþSÙäïjÀ%-žBÑŽ”fñÓ2¦Ð,ÇÏUJÃË䆢µ˜§”†’÷¶’·2h>Íoyx[þ¸ô'PΞ2öå¤R÷¶) 1]ÓHv4¯'Z_ŽË¿ÿBœ¯§¼K!„8ý%ðàÏã+¯#„sáâ7ùýpä]œ¾|Œã)5V!„8ÝhÊê~ìs¾ª¿ý/ÄéJnµ !„g …Å÷}}!N{òŠ"!„Bx !„BˆÀS!„B„„žB!„"$¼ž†i„:B!„â,ç5ðÔ”4„ !„BˆSK"L!„8x xgÉ|zõ;jä!Bˆv"ãx !Î*ÅÅEìÊÛ‰«Æå3Mxx8½úÐ!¾Csæ‡QÅþ­[ØçìÏð4'–†Àkv±ôsù÷ ÇxvN6‘'32¸~”­ï½Ïæq?C7M…!ÚžBˆ³Ê®¼ôé“ILtŒÏ4ee¥lÿf;ÇŽîMmÆQþ9ïjæçýË×ÝÃyQM—ªþê÷\uÓ?È|ôe;8˵“÷ÜËöikX›æ<öîv-‚Ä.]éÒ)êÄ×é…iš˜øiî¬-äÓÜgXõöÙ‘_H$ôìÏØ«~ÁmWõÆ)¯ÄBœ$ <…gW‹˜è¿eLL,5~ZD£Å2ôÊAØî{Ÿ×·ß !Î& †Õló} íØ? ¦Õ¯+4 ÓlÚºrõÃ˸J)´6n¡4«¶óÌ-¿dåö²z%7MîN¬QÂþo>gW©\,„§†|—!D@ŠØó&1*r#¼¹òÁÈi+·óƇG‰{%¢Ê]Ħµ‹Y¼n»Š-$öǬ»çpe†‹QÄÇËgÙ»[É?XŠËt2ìþgyò⺀3ÿ™éŒX^·Úóü£‹xfú ¼9b¯Íë‡CS`”±õ•'Xœû1_(Ç—ɔǞàöì0ö¿r·.ßÄ kl7†]}ÌN'k€ Õ¬fÛê‡Y¹=ŽIKVsçÐXlõ´i^ (4Mî#ÿ—'c3Kø"w Èý˜m&‰}F1õöyLPß\õ^u+;¦­á¥ë»®Àó}Ó'?Gú¯ðÈÀ*Þ[òË?ÌãûÂ2jÂâè–5–ën»™+z;OI‹¯¢ýIà)„AP1˜|a,ï½ÿ_”alœTl{“K;péUýˆR5ìX5‡›s\{û#Ü‘TÁÆg±`žFל»b/áË}ÌžŽ×3Þ@b ´ŒŽXU‰°ð²d”"ª‹Ma:zãwµ|ûüf./bØu¿äwPGKˆIG)øW0ç¡ÉÄGêÜ´†ÇW?Ä¢>ëxlL~ßî]ùk^߇uÄo˜=$ް&Q^³–cÝWþkصêVn\YÆè™sY”¡ÈûÛrß4‡êVrc/;&†®cMZuMC70ôrvnüœRf0^"ªöòÉ+ÏòÛßPöÒ2~žfGbO!Î|x !ÎJ›6ÿ‡?ú÷q·¯ããâ™qíXc$Ù“.%ñï¯ñê–F_Ô elymeÉ×pU†Ê7°ôÏûé77—¹—wƦ`@ò>¼öÞØy+ƒû›`šD¥ä¢‘Y84@)TUÝ"ºÓ§wwÂT}ÀWÛ<fÙfž~>ÄibáM}=l¤ pöÃø^õ‰³Ø÷Îõüõ³ÔŒŽÅágÏ<%ßòm¥IÊ  œš½äŸ²Yúâ’¦¯ä·³ú©).–†kê,ž]¾™k&.àñ5Á„È´á\4¶m4ŽÍÄ2åVV®ØÂÕ'Zú˜ qÆóxêºê|!Ä)5dðPŸ?Äëÿ{q26µº;#YŽ&A’‘U•ûÉ/4´úùŒ® …·¸Ù½wwÞ»Šòñ·óðmýI0¿ã•æ_Aì–5¶;Éað߯÷Setir«ÝÄSQDñ‘rÜø¿_üMJAãsôJ#̵ÕnŒÎÉj³`š:{Tˆ³‚÷7Éí !„ðB#ñ‚é\àØÃ˯¾Ç˹ßuÁ4Æt´¢[BoR­.öìV$§õ$½gÃ'§ŸžM;±v¨,®F÷3ÜQX§>¤ZKÙ²ñ{\-º¸öm&ÏӋ鳯bì€>df÷'=¦y ¡R`ê^ÖïìÏ”‹ã¨ú×2^ÞU…·$þâ¾°ÄLz„•±eãÇòU»ŸO¾('¬{&Iá e!%Fq$ï{ª‚ "kàӯ˱uÍ S˜´v q6>žBˆ³Jxx8ee¥ÄÄø¾¹[ZZBx¸½UëW1çsÃå¸>g/ê™ñÛA}µøQürR23rîám‡¤á:̾²\vE>Gµ%1 ÃÎÚ·WñRö$z™G(ë<–Ÿôn¡©¸‘Ü|M ?ñNî2gqåÀdìU‡©ê1Ž “³HQ«ÉYù2Ñ— 5²€}MFí´F“­(ÜôŸä§rQÓêU Ãn¹Ÿlºe3o`ÇÔ«›ÕŽÖr¾ÚUî7èPÑøeZw¦=w/Fü‚+z)vým9«¿OeÖ‚úl)\tIw–®ø¿YUÅUÙ°ø†£-è#ï¯fEK”PËηW²j“B¬4ˆqVÀSqVÉèÕ‡íßl£¦¦Ægšðp;é­¼AŸk~F¿Üÿcû€ë™˜no2F2ö— IDATv§ƒþ·¬à™ø%<õ—•<˜[ŠÇO¯ nå¢ËüžZcçÝÇÄ_?Åê‡î‘ÈÈYý˜Ð»eBY7/癸%üñõg¸M9†=…‹ï:Ÿ]:•…÷ò誕Ì»L›3‰þ©õÒ[’¸dÎtÞ}ä5–¼:ŽweÙdÿ-Æðë??Ëà+xùƒytm nÓBdÇ. ÝŸ«¿G;½o|Šå‘‹Yòòï™[hÒ)c8s–ÞÁÏúDÔiÓgaéc<õÊBî\åA‹ˆ¡SÆ`²â¬wÞ5{ÿyñw¼P ×}×?~7õlõø¨BˆÓ‹·SÙ¶víÚÚ &œúþQ^¬_¿žÉ“'‡d[Bäää0~üx©o~4œ“¹¹¹gì¹yÜ@ì^œÜ~™èºJÃâ%"2M£ù°Aéê42½.gb YWš†¦ðš¾åú•fAS^¶K]ŸýÆîSõó½o¿.¦aÖõÁôºùo¹}…vÜP`F‹õ×§sïæé)×ñÆðgx}^&šTãqB´œœœÆïýÖ^#ׯ_ÏÔ©S'Õ@Uý§²ÉßÕ€KZ<…g¶–‹ï'm”Òð>[¡ù\N¡iÇÏó–Þ×ú}o·!†—M4˃ҔŸgˆüå?ˆíSPûÏ‚†f±øŒ…g:y|]!„B„„×Ï–·j„Bˆ6–Æ/_þˆ›|vBœ ¼ž¦p¸a!„âò_qvðz«Ý_ß%!„B!ZCúx !„BˆÀS!„B„„žB!„"$$ðB!„!!§B!„ <…âlá)à%óyèÕï¨ñ5³^ÄÆµOó§ã‘!›ÛF0ÇXÊAœ£¼žÁ¼çX!D«ÙÅÒ~̵Ol¥2˜{èGÙúÞûlÞ_îë{Ü}€÷Ö¬åoß”KÀÓV‚9Ægj9Uìÿbv—£‡"ߡޞhs^oû÷ !„À8Ì볯fÁv–qeæýoðÜ¥$véJ—NQX‚üZ6MÿWhÓ4êÓ˜€|ß·…`ŽñY®¬¸ç^¶O[ÃÚ4'm>êw¨·'Úœ×ÀS!D(˜ºŽÞõ:Ý9§EÕ‡œ=b±„Ù¸úáe\¥š4ˆÓ„aè!½3ê퉶%§B´·˜4ž>š6k*…ªÝÍÒi7ðæˆe¼6¯M»ˆMk³xÝv[Hì7ŽYwÏáÊ ­Aµ|°jO¿õ»‹­$õé GM,r’›½/ßÇ­Ë7q BÇÛaW߯3‡ÓÉZ_^Çã´ãq 4z/œeïn%ÿ`).ÓɰûŸåÉË“±yü•y5»ÿú$¿]ùO¶º0íI\pû“,¼² aþæùûcú[güg¦3byÝßç-ø;+.ððÉŠE'žEPuú¸í‹E“ßbg$ <…¢½™&†a`4´j*…¥þoÓÐц„.v¬¼…›r¢˜zÇîN®`ÃªÇøímÐuݽ ±·\o[žøÌ}.¼ñ~ÑÛNá—o±rD†jßÎxâ^Éíÿ;•Q:>}ß­z€…½_æñ±ñXâSz _¾û»nà¡;gT Ò;bUþË|`q÷<úw¢¦ßÓc»b=ú=eÝâ±î½¾çùÌrI×üŽE—§¦‘ÉN4ã»VåHŒ›oüÍ·ùØžg, <…¢½mý —Œ}øØ¿;NâùusÉjñ m–mfiÎdÏÍåöË:cS•XÈ×¾À»ncpvófL£d#+Þ,$uÖó,˜•N„¦`h"ßþ}3ŸÉ…;HÎôÑü(½î_ûvà»õ×ó×ÏR3&{iàc|"åàì9‚ †gáÐ¥ ì#¿ežV@‰édÀ°Q ËŽÁ¢²…R —ùžçO0ËÙ;¤Ò+½;aªþ¹ÚÖåÿüÞ[ü×éLÛg, <…¢½õœÅ’{†­)P …w$Ý®¡<Í“Õn#¿ÆÃ÷MbøÂ†©&†nq¨ #»yzwáöºc:4»¦ÕJ xˆ¦ÜÚð‹W¿ÅƼª´H¬Õ:¶RÁã*Uà5W5ÊÜvñ5Ìò¸m »&Lbú”‰Œï‡°gøžçO0Ë©&y=™ü×Ĩә¦ÿí‰3Ž×úg˜†·ÉB!ÚBTW2³³šôñôqÕ=ØyÿÌÍr4yZáHŒÇªŠ›§×,hèx‚ŠIxåÞ»Ž;ï]EùøÛyø¶þ$˜ßñʃó¯†Áã“)‡en‹H`ú’Wõé[¼ôâæÏ\CÎìe,чH{šïyþîUû[êë¦ÜÃøòoù!PþáĶ'N{^ÇñÔ”Œ+/„¡£PªéÇ{*[BoR­.öìV$§õ$½gÃ'g];‚R`Öx–Øaå|þQ>UòTp«¸öm&ÏӋ鳯bì€>df÷'=F5Æ?Áã“)‡Àe®PV'=FMáWKײôŠ(¾Ê}…U&¦ßyþøYÎb'Ö•ÅÕèÖLþmìß nOœþäV»Bœ!´øQürR23rîám‡¤á:̾²\vE1Öh’£…›Þá“üT.JÊ­×¥1uÕ]Ì5fsíðT¢ª·‘_‡'<9‹µšœ•/}ÉR# ØWq,pSÑq0i| TæŽÂyu£A÷ôN8jðÙîr̨¢,à9øÏyþ¸ý-gKb@†µo¯â¥ìIô2PÖy,?éí}GÖÙ@ó}m/;6è±mÅéEO!„8c8èË ž‰_ÂSYɃ¹¥xìñôºàV.º¬î"}Éœé¼ûÈk,yu#îÊ&cæÓ<û4Oä®âu¥¸-vâ³—îÄ*æ ë1…÷ò誕Ì»L›3‰þ© Cý؃8ÆÁ¤ñřۊvðÎs¹l)¬ÓNBæ8î~d:½ì5~æùÛ¢Ûßr*ޱóîc⯟bõCwáŠHdä¬~LèݺüÇXÕiÛËŽÁ"÷ÝÏHÞJͶvíÚÚ &„äɱõë×3yòdyJM„DNNãÇ—úæGÃ9™››+çf˜†Ž†ÅkŸ»º‡,LÕ|¾iMû 6_?¯é2¦i`Mo¯*”¦É4A:îxJih-Ê$Ð1öŸÆ{YûÌCCº†ò>–1´†—üÍó»Ã–«þ«±E·~Z•ÿ æ{ÛžTÞS)''§ñ{¿µ×Èõë×3uêÔ‰@5PUÿ©lòw5à’O!„hGJ³øy  B³?W) /“VˆÖbžRJÞ5Øj~w“4ޱÿ4ÞË:`¼”wÀyž2öå¤R÷¶Œ…˜®i$;üíŒBó²âVå?¨ùÞ·'ÎLx !„ç£äüùc|åõ)ûp.\ü&¿.ƒ´‹¶!§BqÑ:þ”ÕýØç|¥Y$èmFO!„✢°ê; D‘;…B!DHHà)„B!BÂkàiòÊL!„Bqjy<å•B!„â“[íB!„"$$ðB!„!!§Bœ-<¼³d>½ú5¾zLéEl\û4úè0éUÕ6‚9ÆR¡#Çú´"§Bœ®jv±ô†sí[©ôú–™ô£l}ï}6ï¯F÷ÕWß}€÷Ö¬åoß”ËE¸­sŒÏõr0ªØÿÅ6ì.Goëý?×õiFBˆöbæõÙW³`»N˸2óþ7xîÒ»t¥K§(,A¾IÆ4MLü_]MÓ¨OcòŠš¶Ì1>§ËÁµ“÷ÜËöikX›æ¤­‡³?§õiFO!„h7&†®£w½ŽEwÆiQõ—D αXÂl\ýð2®R MÉÅRœ] C—QtÎA^OM^¥%„¡“ÆÀóϧCÓfM¥Pµ»Y:íÞ±Œ×æõá)p±iíb¯ÛÀ®b ‰ýÆ1ëî9\™á£Õ¨¶€V-âé·>cw±•¤>=ᨉE®÷Ar³÷åû¸uù&TèXc»1ìêÛx`æp:YëË+˜c(^ÄÇËgÙ»[É?XŠËt2ìþgyòòdle^Íî¿>ÉoWþ“­….L{Üþ$ ¯ìB˜¿yþ~Çè…¼»ø–˜Ç÷…eÔ„ÅÑ-k,×Ýv3Wôvk}7Jø"w Èý˜m&‰}F1õöyLW—Æô—·:ùÏLgÄòº¿Ï[ðwVŒ‹E3ËØúÊ,Îý˜¯”c‰ËdÊcOp{v$š`›Á–‡¿óH~ãµ)iñBˆöfš†ÑЪ©–ú¿MCGo|§‡‹«æps®ƒko„;’*Øøì"ÌÓèšs7CÂ[®·Š/þxw¾l0zÆ“+k4œ½Æ0¾Wý?³Ø÷Îõüõ³ÔŒŽÅ^ø]¦ITúH.™…C”‚²ü–yVØ!ŠõH²‡aÄ€,j P ô2ßó2!2m8í‡CÍ…c3±L¹••+¶põ£ÃqVlfé‹{Hš¾’ßÎêC¤¦¸pX®©³xvùf®Y4šˆ ¶‘Ð>½»¦@)…Yö)O?ŸGâ´?±ð¦¾DjÇ~ŒQöiÀmÆQÏ£ÁQÁ#Ñ*x !D{ë9‹%÷ %ZS @ ïHº]Cyš'«-ÜF~‡ï›Äð… SM Ý âPFvóôîÂìuÇ2th vM«»˜*M.ª'ÄÍ¡ /°xõ[lÌ+ J‹ÄZ­c+uaÜ1>¡rPu™ªŸY Ìm_ÃŒ!ïñ‡Û¦°kÂ$¦O™Èø¾qX{†ïyÁQ(U÷±8ûò£^Ù¹ÂÚa„|Å·5NLÅQ¿O*¢;£9yþ‹¯)¨Eï ¶¯šì3@mÁVò\NìÖ¸Þ5AlÓıx%Cþ´! <…¢½Eu%3;«IO­Rº;#YŽ&·ŽÄx¬ª¸yzÍ‚†Ž'˜¡˜„Wî½ë¸óÞU”¿‡oëO‚ù¯<ø0ÿjHÌ1>™rP消¦/y•QŸ¾ÅK/®aþÌ5äÌ^ÆÒ}ˆ´§ùž§ø¯«Í‚iêuCÕïJËzª4Ž«àoûËšÍ47tLšŸÈÏï6UÇ:àyðPˆ“ A½B´»c-KJù¾jKèMªÕŞ݊䴞¤÷lø¤‘â¬kGP ÌúÃûÑ#¬œÏ?ʧJžn×¾Íäyz1}öUŒЇÌìþ¤Ç¨Æ`%˜c|2å¸ÌÊê¤Ç¨)üjéZ–^ÅW¹¯°£ÊÄô;ïÕþÀ§_—cëšA§0EXR&=ÂÊØ²ñ\ ûT»ŸO¾('¬{&Iá åoû;±v¨,®Fo’›°N}Hµ–²eã÷ÇÖÛxo3,)ð±æ<mGްBœ!´øQürR23rîám‡¤á:̾²\vE1Öh’£…›Þá“üT.JÊ­×¥1uÕ]Ì5fsíðT¢ª·‘_‡'<9‹µšœ•/}ÉR# ØWq,pSÑq0i| TæŽÂyu£A÷ôN8jðÙîr̨¢,à9øÏyÁ8òþjVô¸”A µì|{%«ö'0ùÁ!Äj =Œ[¦ugÚs÷ò`Ä/¸¢—b×ß–³úûTf-FŒR¸ýmß–Ä€ ;kß^ÅKÙ“èe¡¬óX~’=’›¯Iáç/ÞÉ]æ,®˜Œ½ê0U=Æ1!=ð6ƒ9ÖÏ#y¬½My ͳ±OóDî*XWŠÛb'.1›qéN¬ÒÙ3 °ÓXxo!®ZÉü·kÀ4±9“èŸÚ0|•=ˆcL_ü—¹­hï<—Ë–Â0í$dŽãîG¦ÓË®Qãg^0%¯ÙËùÏ‹¿ã…¸îƒ¸þñ{¸©$uwéíô¾ñ)–G.fÉË¿gn¡I§ŒáÌYz?ë¦Àåoû*ޱóîc⯟bõCwáŠHdä¬~LÈN#ëæå<·„?¾þ ÷¯)ǰ§pñ]çó£ôä€Û îX8dDÉ6å­îÙÖ®][;a„ÆÎÍmiýúõLž<9$Û"''‡ñãÇK}ó£áœÌÍÍ•s3LCÇ@ÃâµÏ]ݦj>ß4 Œ¦}ؚίŸ×tÓ40¦·WJÓhE7¿sÒqÇPJCkQ&ޱÿ4ÞËÚgÒ5”÷±Œ¡5ßó¡4´ó”ÒPÒŠÓj~w“4ޱÿ4ÞË:`¼”wÀyž2öå¤R÷¶Œ…˜D£þA ÍbñŒh]l‘ÍGë=•å!ïË = <…BˆsˆQòþü1¾òúäw8.z‚îÒåN´ <…BˆsˆÖñ§¬þèÇ>ç+Mƒ‘sË9|ëY´ <…BˆsŠÂè³ÜƒmDÆñB!„!!§B!„ <…B!DHHà)„B!BBO!„Bx !„BˆðxʻڅB!Ä©æ5ð”w3 !„BˆSMnµ !„BˆÀS!„B„„žB¯G{gA!D„òû^ÞÕ.„ðjðàÁ¼õÖ[TUUɇBq–r8œþù!{¾GO!„WÉÉÉtîܹ½³!„¢…ò¡r <…ÇÉÍÍmï,!„±PÜÝ’ÀSÑÌøñãÛ; B!ÚI[·~Jà)„hFÆñBÑVä©v!„Bx !„BˆÀS!„B„„žB!„"$äá"!D3¦iràà-Âív‡|û6›ø¸$wNñù S{çñT fÏfgSYžkεsÕ—`ŽƒÛãfëW[).)qî‚—‘žA·®ÝÚ|;x !š9xè.W5Y™Y„‡‡‡|û555ìù.Ÿ %¹‹×4íÇS)˜ý=›Mey®9×ÎU_‚9[¾ÜB·ÔnŒ=æ´üiš&›ÿ»™Ü9¹M·%§¢™¢â#defa·ÛÛeûv»ž=ÒøjÛW>[Ú;§R0û{6;›Êò\s®«¾sJËJé–Ú ·Ç}Z¾‚XÓ4úgõç?›þCç¤Îmú=$§¢·ÛÝî-ááá~oËy<•íïÙìl+Ës͹v®úÌ9lš&†a„(G'Æ0 0C3޳žB!„!p:¶v6 QÖ¼žf¨¶.ÄièLè¡ë.D{s»=áèÑ£èºî·UÆ4M"ì$''Â\ áŸiš§wà"Òâ)D §{'pmGp!Ú[uuµ5µôJïEXXËÛ¶MšJLÐuGŠŠ8|ø0 Ѫ«p—”‡-&¥É(‚¢}œÎ§B…,oÞÏÓó¸§{'pmGp!Ú›®ëX¬Vlaa†^w þBnÖ‡Ÿ&xthg4†aPðÝ¿ÝQT„Oüˆ‘„'tjç½窺z{z^S ŒÅ~òÓO/:7üB=Ý>¡ì.Äé@Sª¾¾×ý¿®ê+ 橺 Õjµ…++ª¢Š¸ p¨âÿl„ÓôǤ8IF5wü—/öU¢·w^|8å×O1Ÿ½ú,k6Ámœšu†‚žBøÐÞÁeÀ/¹~ŠsŒª:>BaÁaæðá#9Üðÿ"JŽ–àª®¤xïg$vKÀÞ1‚šªj,µn*v{ÚÞÅÈÔ©*)äp…§ù©ïkº^ÆÎïòÁ7GqŸ¡»|BÌZŠ QTå î·…¯ãÖÆNéuÀ}ˆ_ywóÊñ˜&fÍnž»í:f¯ØA¥n`êUüðÕ&6åWÔÍ?M®)ÒÇS/Bù믵Ú-F9y>fOÔ`~40kc£«NéÎøøû8†íO[;¶Æš5Úú ÿ=TaÊFDd$Ññ)¤÷ìJ\¸üæ>#Õ5n’бîêï³cbbšPZ\HAÞ'tŒufPkBÁ…Ténâ/{ì.Y;ÿü›¯JÌã®·±Y1²KÄéÕ2c”²óóÏ)í1†1‘QXT€éÊB¸# G„ít¾1rŠÏÕ ¿}·6ä÷ºbñö]³ùãNƒ–.¥L{’eÓR k™GÓÄ0êê=¦‰I8“:“Ü¡®îš®Ý¼øÈò®~’§S~ëB…¬€žBxqFžíÙäiš>Z|M5ƒÚªj GƒúvÄæqQ]YÊ¡ýÛØ°ï;ºAfǰÓ+°)¦R¸jjšÔÁú3Á4ñÔTà>ú- 1aÄÚ*Pî*jpáJ #æüaÄöMº§˜¦‰Ù“óúvhrQWØ"ÃOúaú8ï|L×"éÞÝ”âtŽ;Ûï\õu<ÛŽßëŠibè:zÊDæÿ¢?ÎÆHX#¢s',Þ¾['Ô·ZZ;sÉÝ ø¥¡5L3 ̆Ûðþò†´x Ñ®LÓÄ0Û` _ý(Ÿÿå/|“|“‡uhÒZxbi ežÞ—ÌjîøŠ]…¥TºÜZ8‘±‰¤õéMj´­Í/†&€ÍIÇW ÌR»¥’ÿÙ¶ù5F ¤³]³–£{·³}oG«!"¦=úfÒ#6…NÑ—ïñiIFêC¬U§ˆÿþ{•½.`T7&®þÿ¶kœ7&s÷Vv–RUãÁÀŠ#¶i™ýè‚}>(îÚcþ5\0=µ•”üš¸“˜0š^MY•‹’j zç¾X’R±ØÂŽ_¡-Š u¤%¿u0]æmc×ÁbÊ«ÝèØHÈÍEÁö/ÙÙX,DvH¥G'Å‘ïàpy „G“Ð#›Ýb¨»9`P¹÷¿ü'ï0U-,Š„Ô¾d§%`ouUæ}ÈÛyuǺ˜}LOp±kþï0‚ úÆbÅÅÁfyòR7M7%ßï`G~!ÅUµ` #ÂG׬¤G[Û¬þ}®.Šò·³}_!¥5ŠˆØÎ¤göõý}DúãŽ[bêD·ì~<p¦Ò/;‹Ø¦M°J¡LÓ}„Oÿ¼œÞý’ïJltJO…R­ñÖû^^¼åNÞ9+fg`¯_ç¾æpÅ‹uë˺÷yå<®õ³ÝOy`Aœëڬų¾OΗ^ÈÄ¡ñXZ›Nÿ>ž¦›²#G¨v¤3 o š§’#ûòøê“R<£‡“e Q V¿¥PV'Ý2»ñÝ'ù|[è"15œò=ÿá“<7zöcp4”ý°‹íŸnÂ3r½¢­8“bQ‹(u›ÄZzÕJ<&®#åxR„)ŠÃ¥Õ—«›ýEE¸"{1 _ w‡òwòõgQc³éèõ—†VÃE±q±Mžd7Ñ=µÊû‚x‡"&܃E¯¢¼²šÃ¥âz¢‡ƒæãL2Á4ÀÔÌ&ÛQ€Ni€º¡ÌZŽ* ÜÞ“þ™ñØ ÊŽfVPV_fÇ¢¹ŠÙ³c7_9HîÙ‹éV\…ylÿæ¿ØcÇÐ/ÖŠBו¾ÙݳAUÑn¾þv _G_ÀùÂÏ•ˆ®ƒÔÕ…Õaó3ÝU׊ָŸµyò^7 ÊölbC^ñÝ38/>ÓuíÛP\mBt[”hKþÎU;e»7ñé^+ÝzŸGf„›Ã»¿æ«Ï‘£³èx\“¨AIé?n–;‰.DÏ&?¥ŽŸgV³mÕý<ò7“¡×ÞÈ”žaoŸÜÑкYßjêiú ð“»¹ÿâD”"")¢î¦z‹ÊYc†´x áE°§Qüoæßø$_¤Î`åã?%å¸N8Ç­¸EŸœÖ¥ å˜k'ËÙ‰ÄN1X$uŠÁüø?ìÚUDê N´G7P‹#ž(-Ÿ£¥ÕèµåìÊ/ÇÞc$Óc°)Eb'ú'ØWD÷ó±Åt&Fm£ ÔCj„š’#TFi!z'âU%%‘©Wzý>'˜ƒU%Ð1²šÃŸâ`™A‡øPÛg«º§Ù<ÔøêAC÷PSø51‘VbÂk±èU”–WQXê¢CïñDwìNUa¡ïU–|É»ï|yìßönŒIœY°n4´ŸZ£I샵¡Ñ¦>Ú³D&ЩC VOdõ!>È¢K÷®$ØÄ[)>ôGŠª1bœX”ÂHçú¯CL8U?æû¢jô„ðÆ‹µfwãlÒ'Q÷1ÝÇ ŸuÓYÄ®üRÂS‡s~ï8”Ât¹Ø³ý@esê5?WËØõ]%±¼o7-IDAT}. o±5|ô-ûÊúÒ!¶ÅÂîÃA¥? ý/סõ-¿~à1ë?ۗ𳫞86=b¿]uýÝ[øóú#$]óÜ3¥áš‚ØûþV¶šÇ–¯ï}Rý¨ûØãºÖ£ a £Ax˃ºç¼¿¹è ¹  ÑV‚ <Ýì}ûe¶Ô†aî|•×vãæLÿ¸ë“ÓÊ4¡¼-rÒTãP¶X’c-ì++Åe$` Eþ–š:ÝUB¹ÇF|BTcР¬Q$ÆÚØ}´„j£aáñtŽÒÉ+,Cïä¤äPδ^hû~ °Ê Ær„Ã5v;ÚÑTeÝŠ›ì³Åî$‚ýT¹ ðÝ~-N@bb"P÷~éƒyˆŽ´^òTRR^Eq•"¡ï%DÆuAi‚}g/†dvlü¤,áD[zÙÑÀu£ñAžÆÿ4×8ÝB¸3ŒjúÉZ8‘ap´¦á©jƒêÂÝlßý=‡Ë«Ñ•Íc¢bõS{ªû¨›†«„2•ø¤hl§Ë]ϦçjM)ºIå¶óö¶&ILKµ³Eà©»JN(}ÐËqrgÀÏî“ùß›âÔ꜓.á Ï¡<¾¯fà€NMʧ¡ÿnËáš÷_UÐ$÷Í·ÿòBœã‚ <ÍÊm¼üV}fýŠ‘ï?ÂK¹Ÿ3õÁQÄ7½¨ON°iZ0Ým‘ã(+V xjkÑiþ%âv¹Áêÿ)ZeÑÓWƒL›Ó«Š©0À¥þè—ݦ”N‰‘l߈ÒÊÃIêÛ™°¢=ì-ª¢‹vˆÊ°’š× ’Ò¬(Œº'vÅISJár¹0M“ÚÊ£P[It¤å©ähi%E®0œ]ãˆKAY,(à7šÕAl\ìq}<Æ‚ô[7N€¦4@Ç0ͺ•(­®ÿv}æŒÊïølKîÎ}Ô'Žp*Ù÷å—×Þè¯Åì5­›¦i`¢N«ŸFÍÎUÓÄD£S¿aômüiáhÔ4_8`úú‰^Øñ¿\ëÕÇ3"‰´žéÄ6„ª{Þ¼…B?6^gc^ëÿßôza¶Ø–iõp‘žB´£À§ÁÑͯ³ÁÊ}ô##a^ø åŠä†ŽúÁôÉ "·Íûº] *Œh§ (ªíLrÃp'z‡ŽzÀK„ÅÇÕ^¯äH‰-2šˆöãE/cïŽï¨¶$Ò7ÑŽÍK”¶‡¢#•èquÝÐ+(<êF‹Š©Ï£Âѹ ÎÝ{ÙûCG­ ôŠˆÀ–è`Çýì3˱wîW÷ª—mª!6¬©©Á4 í'¼º„ZÍ ¤²‚*KLj¬Q €vlpùÀk>nŠ%"†(Íí¿nœ‚ònlÑ«÷¹ÏÝ=i:•¶—pES«SLíÉ@eAfNõób×F¶”vÐ4Ñrêíýœ°–Úì}ÌÔÒ¬«†fµ”óüž—y‰v¦ÕMÀ‰ôp:<‘æ¦|Nå>è9t€ƒ''0¥2]ùómRšçÇv+£Ïûغy3B¢h`fû\n¾¶™/ _Y áð"`ìÀŸ£—Ბ%ÎÄ6^x†?u½ÎÆ7¢úÒrj*bïeÊh¸`.Ó6¿ÆÎM/) lŸDcueòé£> ÝG°s1ómìxýö»>Ê'úÇãè3_Wk:–±´ìU¶ïßÉ÷öá––Q9¹“)Skð9¦^ÐF÷–½¼º¯‘àìš4åSÏϳ>ÏÃài-°ÿ—|ãîLJ>¼†ûÿõÚ®»‹{«bÍ“ñí')ñSU?‹e-åÑá–N^Š·xV±è–ÛXñÀC<úûè+¯gÁ‡ÛyWGåˆ.@^$ÏÎÞâÙÃÎ_ÿŽ7ÃïððßÝÌÚø7‚k²~ëMt.ªÄ’%<¬ON´pü$¾ôe 1x‚CÙ¤æ.nfnâä$‡5Ëê;YÚ9ip<Ò\ hmü4λœUóF<Àˆó&?u­óyWkb±áu4”7/euSÂcN­—®¤•„!èœ*:.[IGâû”…¸tEcn>÷e‡©ÛÐÐ@0dÆÌ 0ÆÁƒãDJÍÀi»&öÿè|±¾˜r¦-]IK²e".ݲ‘ìûN1½´a1«W$.+•´_¶’ö2%T5ÏeYÓ5ŠÄeÖ©1gI#s†?–bú:˜ –ÍÒ*šf/aêìèÑÛyî…Lð{¸äŽj] Pß:ŸºÖdå eu³XöžYƒÓÌÙÊŸe~¦yÞ¹:ëåª{â½Iq9DïJf­¸~_Âòl &>`|i ýÞCÜÛY°ÖâkxŸþú¥Üû½1N|pùauËááO‘$¢W|H¾"ÚS¯²þºöK|~Iíà! û/üÛ7Yÿä&ŽÍ»”Iu3iIì“cÌà'±×÷eP&Ù9D®qsvXäl2ó×D¯¯óeGô2ì8ü3$ûü™N“ÌØXKPlt1ŒÇq‚fòç08lŒ‰?7ú£?ä»Èä{OS&Õw;rz&ËOúõ$ó÷9íìe"œ<°ÃT0!PŠí;Aw×NWL'4ÁãaÀ²¶®&™çøýyµ£xÖs–ÖåFˆègZï„ iœ;Z&¶ Qvè+dø Ο‚§H©÷L-Ç·þ† §š¹þŠyt„¯d¡ü½Íüâá§Ùpä® Îå¦k›ùâ£÷q{=«æ7RÑóz´ON¼ÅrBú2Iw€sxXD$ßÇ! ‡)--Å3$DÆÿŽß'þÝßßO$¦¬<çOQàl˜ÓG»ÙyàgÂSâgb} ;Ú¨Ö…²"º=/Ìí¶‚§Hž¥ žîQ6þz=-7°88¼ŸW S–¼›i?{ˆ'ÿïmÞ³º‘麓{+fͯãþ„>9K›c}r(£5m™$õ£p7`R†¥@ À©S§Ø½{Wt$¢„5ÏbG´þǧÅO0*õ•”çºÚÅÅø™Ü¹Œ+:‡MÖÊ›5ž]/ ’­G^Ñ%3E’H¹0Õ,¿ãÇ\ŠC‰3ò°‰3e5÷¯] N œJ:V|Š{RõɱdVfxý =tÆh["ç˃ßï' ƆQÊ|ù7±ž²²2|>Ÿ–ÇtÔÙS…<1Ž„=/µxŠ$qöNà©ûê':@úàÃiúäd\fKaôñÉÇqðûýøýþ|WEäœzð4ƉDÒ>Oºd¦H…¼ˆ3Æ \¯ZDD _¡þ®Ä»¥¤:©6›’Oý˜Éxg­Åµ…»88Xcé÷gýµ}>½½½ù;£··ŸÏ—òñB¨c6¥û¼cÙXû.Ç›ñ¶®¦’É:ÏV>M´~¥¥ÞÏû¡ö±¾0JaÍòV‡/÷NkkêØµg73ZÛòrh³··—®]]ÔÖԥ쓗ï:fS&Ÿw,Kßåx3ÞÖÕT2™U•U:rˆºšº×.s»öì¢)Ôäùv(ïÁ³³³“uëÖÑÓÓSÐ?ôRü­T½g žî†§r û ¶lÝBö[TÓñù|ÔÖÔÑ8%”²L¾ë˜M™|Þ±l,}—ãÍx[WSÉd>,˜·€ÍÚL×®®‚ÜÁ´Ö2sÆLBÞo‡ò<ƒÁ õõõù®†Œ™¬ðŰg Þíc˜j"Ô85«¯;Ú:¤{<ßu̦Bü!Ê•±ö]Ž7ãm]M%Ý|(ó•±pþÂÕæÜäj;”÷à ã{£+…§Ð÷L!7{§…úÙC%3ú.Ç6}¿šq'ß‘ñAÁSDDDDrBÁSDDDDrBÁSDDDDrBÁSDDDDrBÁSDDDDrBÁSDDDDrBÁSDDDDrBÁSDDDDrBÁSDDDDrB—Ì‘¢Öîgó–Í9z$ßU)zíLkžæÙë+xŠˆˆHQÛ¸i#ÓZ¦qÙòË0Æä»:EËZˆW6p û¡Æ'ï¡à)"""EíØñcLk™F¸km¾«S´Çá¢9ñâ^¤qJ£'!^ÁSDDDŠžµ×uó]¢æº.XÁÃüá³?ç7]Íœ‹*ÈöùKÆUO‘´\×õ,4Y7‚µ`3ز9¢P,{ÆpßÁרÛ;‘9 §à·úC,º°‚Ƕmçí¾…´µ®äºy/ðï|Ž]—­äƒWÿ%ËÛ«)5Ðwpî ÓýýÏðW?ˆ=?vYPÿÁ3DlyÖ[<-ÞŸ ¥à)"""EÏËO§2ÄŸaËöœ‰4Pš¬ƒå°Ok-.Ñ#׃aÕFgÇËø›¹úÎïsñÆß±î—¿âÛ_úOÜð5¾öá”FÂD°ð³wòñŽò!­›þºJJÈþ L¹žŽ§¯."""’ÖZ¬ëÑ­¼“Õï®æÌ óÄÎÓD"ÉËaÀ†]¬k)­m§Åw’m¯tÓ/ÓÛÍKÛNá›ÚN]‰ׂSAÓÅ«ù›¯ÝÏÝWV°ý‰§ÙyÚÅ™ÔJ¨¤—}{,Á¦&š››i‰Ý*J<ùœ®ëª§ˆˆˆH:Þ§TÁÜ?Åå¿Å÷ßÎÎ\Éâ™!&9'yk÷ºCà–å˜\ ‡7=ÏËûYÒt7]=•/þâ[Üï¿+§Ážß¯åçÝ!®ûÂ\&ýoÿ§7º4µÔRÞÿ6›÷­¨¡ÂS½€®œÌíO|“q®cÅÜÉúŽÐ}¢™Ë¯œI¥§µÇN“Êúë&Rð‘¢çõ8žÎ¤…üíwîeÎÚÿæ© ëù÷õljà£:ÔÁ%ïÓïYþ±«yþûÏðã§–0ÿ“LÿÈÜSþ~üÔƒ|ý0Ô¶Îãæ¯~œ«Ûü,}GvòÂcO±íp/?uíK¸õ  ÅØ7ßÍ=Õ?á§¿}”ï±)±@9²l¼üÐ|7ü¤¡èsßÏ«Ïéâb²?:è ž"""Rôr<Ç8cLô$#(xŠˆˆHѳ‡¹å\98Xc=í² à)"""c‚Z<ÏÅFÂw½› ž"""Rô⇇>σ‰ÎÇÒRïâ¡‚§ˆˆˆµªÊ*9D]M]¾«RôvíÙES¨É³‘ž:Ô."""")%öé´vä¿GCÁSDDDDRÞ§S}êã)""""Y‘®O§úxŠˆˆˆHV¤ëÓ©>ž""""’éútª§ˆˆˆˆd‰Ö’™îß™K<Ÿ}öÙs{EWl´³g?ŽÝ"€»ÙØ-iûh)à@yÂ}üï@ìqŸ—@DDDDŠF?Ð ôÄngb·ž„ûÞT-ž–hBM­ý@ ƒAÕÆ¦‹ˆˆˆˆ„‰Ï^ ÁÖÏx˧…ä‡ÚãÍ¡nì %±''†ÎHŠçŠˆˆˆÈøo¨ì#>»nOã­’‡Îx ‰gÆø-ÞêÏ“.dÖâ™,tö£1@EDDD$*žã·sjñL ‰}>™ö_nMàpjvªÇ´¦k‡`¾ÿžßR1GÑâ¦!ŒêÑ€“™ÅÖy/óæ·{IÊÔÁHúWÑwH_:Õq W¤’âd Â%%FÞñ˜û§3õÆš˜ÍÁÍŸ0iâ'rÿñ²ðË5„î"=å)™^$„ͤùÎ00t‰fµa€ÔÑu]X°Y4dêÏL™¸œõ §q9‚ ©"H;‘C€¿ -ï=„Ò“ ³‘¦õ»H8™NŽnÂl¸8¸5o¾À¼?²}eÆÅÞ%ÏðäìoÙy,›Ã õðVVMy–i¿¥¡Kʼ¦8G~J³ƒÐLhÒ‹ÇãÉûs“ë‚:7¤¤TQ… …¢’ WxW†Þ¸–ÿ~zˆ}Obøj‘­»rsï[è˜7àƒoBª 7NzÑ5æ©Á“Ùì1ˆ}`ovõðу#˜•Áo?ÆsE}¬ÒFÃáÓùx”†;3ƒÌ¤µŒ|>{7òGV_¢¬E_^+󼍒ޕ¦[û¦ ¡û»"Ï 3Õ»óØíõ° /®Â‰å‹P±„ܧ8ê60d4Ã_›Dï:V¤WÇdÓðœ*" Èb6x0æ$Ëżƒ)¬[{„a ë!SÖ3kÕat½6wLy;â,[3Ž¡ÓwñíÊM mÕG×Ì:RF~\ÞR_ö{xÑHnZ\ lU¯Ïô!±8lQô= tKE*Š ‰äŠÁ¯2÷åè×)–*F6 ¿|ÂÔ'GóÊ·IwŽ„¦3’&¡¾Ïî©2Of`˜ilù`CnëÇí÷ cðã ØcH$Y¤dË<ˆ¿à{†Q›ðêŸÀüŒßø’CÙz¹~o©Ù’65‚Ì9ˆQ¯,䛄Lr\nÊÑ…¦!EÄúÊœz4 ¯IÃ}|u‰$‘EôçÆ}2}^C"“ösÚe^Óôóƒ4c³Zóþü¨è‡ÃêÛeÀy“ò¸ Ee/ Áõ;3°AŽ8Àg“Æ1}S:¿,ÿ†ãúR§øò¿°dÏÛÖC÷mÛbpiH] ÙÛç2qå2dm®»«'MœùhÆjöëy.%¬gQ¾5®üC1ÿËÔC0!Iýå †¾´–ô «X{ò*nõ3û¼E²8•¥—è½ {ƒ&Œ'òÃ|ðÙïìY÷“Öo$qÒKô;;/E? Ayeöú¢ o.>É ¦í©mgÖ¥´ xªZLh¢ŒkÖ-ã\´½Œ5®É̉%ïˆÐ4„îöyFfÙÁJ¸ E…ÛÌoëöãW¿>‘Õ± AV éJÇc2q–ÛU\bò7I;ƒNú¡D²¥×1 w7Bs6±qþögåGÃfr39~<Y×,éX ÂUÈõAx=äz³I:šLnž÷áï°`¶V!Ä d¤²}ÇIôºþg  '“4"ér×S\Ûoó~Š•ÇðÃæTú‡e W AèÖú„òûÈ$»FúöˆÁßîÓÇHs„ŒŽ·¬kFø•~.ºfÑ,È¢k\Bw“ë-î—é¤üøž ‡W(•‹ÜƒŸ1ýOI2òŸE•HÃFܶ#ul"ç|S5C œ>8›‘÷}Cd‹ýÙ…B·-!4ƒuû¼üþÚý¼<î-/áXsÿRCÛ÷MÅí ÀåÂ- Câlym«›žºtmÈw_§’0w$½–Ø9ùAyeß¿œÇžù~Õ¨æpsü„ÄJXdU¬¦e±„!ßTã*îêú1Ï•¶yOÐo¾³ÐñJ+mÇÎàÉNÜe\S&,â±±¥åGÃí-yÂðð¢‘ôX\ØHvšŽžÂ3ñ»yï½_ÕT¡B¡¨LH¤½.ÚÄòÓö½M÷VjDѲkî¹­9ÒMN±¨‰³ßgQ|Nb‹»ƒg†Ìþh;ïg×q ¶*Ԯ׌(4Õ ëÈá$¾·”¯w›©^-»Íïìc&‰[/œ¸•jµBp?A¶7‹ôtÀâGph=Ú\ÓƒÛo¾’0“—ÛN£{žf”y>þü‡S³V?‚CêдI5,r¥ƒðÛ%q8ìÁ1t¸é ZºQ–YÂ3f‰ÍOàå:Kyÿ¿³;ñ4¹˜!ÜiÅ" §ŒkÊNj…8ØVR~¼ÙE5¦ðÔ§4Ћ,ëeáÒtv/ÃÏYz‰oü°,^¼ØÝµkWìv»ê …¢â‰f,V3f“)/hBÒë!×íÅ@bvMCÏÉ"Ç£crøc·˜î,²r½H‹?›“t‘™íÅÍlÅj5c*òf!wŽ ¯”HLXm6¬ oN¹zIÇŠåØ“ÝŽÍ¬QèÑ%_t¡×ƒÛã=ãYI f« ‹9¯lùQ’^.·Žì6 ¦ü“Â@zܸÜ^ô"eÎ$Û#ŠØÀåÕÏ*³Ìsd4‹«Ù\.=7‡\¯ÔJ¿¦Qj~ô³o ‰Å釵„°A¡™0r2piŽÒ…ëšk®Ááp¨> P(ŠË 5U¨P(ŠÊ!\*ªP¡P(—#ê•O …B¡¨—ÃáPâ¥P(ŠŠ#\J´ …Bq9¢ö-Q( EÅ÷¸TD¡B¡P(*”p !”e.V«›Í†Ùl®6–RâõzÉÍÍÅív« V(ÿœp).ªì¢¸¨ÂåÞÏÜ2ô½]dŒ4vü°ŽÍG]—k¨½÷8?®\ÉW{3}ÛUŸU†ŽnßȆ„¼ó—EžSøié">ÜroivÕO³õ›oÙ˜˜ƒ®s(ÇÍÀeXÏ—¤Ü *»(ø;Q…F Ÿ>:ˆ7wßÃ2nô<Þêb'$4œðêN´ü;q)¹dÕ^Fþj |‡™"±•à ÈÂyÅÊàÚÇ‚_àÏÞÓ˜Yú.¦ççåeÉ ¾¼¾G/²“i ÷ñLz×4SÚ夔œ«?ùÊut:#•µ¯<ÄËë“ó¼Z+A5êШcwúßv ƒLüã~[îE¨çóµ‹ÉðZÔkÞ•¾}»l½4v‘—E+¹°c€ùQ–M¸Šª…*2cýXú¼œÅÈY¯ss¨ùܶ­LvùW ©èµúð܈føkùUoÂ?2“ÕJ÷1¹QhhÿÈHTZþ4œa¡XÊ“'KøYe†Á½éÒªsõ“o™®nö-~ž7¶·àÑçn¥®MC˜‰©r æÎE$=)OxožÑ’™Mòþ_ùdÉ[<¸éS'ÝA}§øÇË{Áëù<ìòÌð8sR8š¸—Ÿ>›ÆÃ«?ææ—^ed‹ Ìj6öüÇ­Ñ‘ºn”r³¨¨Ä•G`ñM›¹›A„;¹#GóeËW™w_}JŒ7óœfÓG3˜ññFö¥j„ÔïÈ€‘C¹¡žß…»Ë--î“ü´dsþ·…©&jÆDAª,˜?u'0¯„2š?œøÒkúÔb^ëø×ÅYX mØŠšäàüÆŽØFÓVm‰wj¼Zñ=flàh¦Ž¹J$m{æéÁí¨Qh;ýóT†õÞÇ'¼T«Û’›G<Î°Ž¡%z•>Û§°añd&/_ÇŸ§LÔlÜ…!?@¯¸Lä°oõ[¼4ëK¶&¹öP:?ø{ÕÆ*.ÈxÑ4iÚÄW/W´¡MíS xñK¾LèC\CÂ[FÛ0’Y;c2 ~ÚÇÑ”LÜÖ@j×oÏmCïáú˜B’‘ƶg2ãã ìN’„Ķá–a÷Ñ»qï;úi~Yøó¿ßA‰ ÜøqÅè7•,¹ž;X9ôÕ{L~ÿ;v&ç"m5¸òÞ—xæúð j—¦ÍòÛkzÜr={ˆéÞ¡é´'è\ÝŒ(µßÀæWóÔîëy{Ú=ÄÚƒ¤OåÎÙÁ<;w,íél.Í®¥L“•mÃrÖEY}Ý(¥®+ç æ… ¬ü5KRÎ2+.cá’†a`äO qfKk©ë襸عìYüc>vró°1 ¯™ÉÆ%Ó˜ò¬F­#ip½ !Î9l›ýÏ®6h×ï^î¨g%eç×¼¿œ…¿VBBn˳ÝjbÎ0¿¿ïQæ )ÿæçY`"¸YOx¶/Á~:Ç6,âÕ9Ï2©Ár&tªz¦SéÙv®¸û1‡¸ØõÙlæ<>×ÌE<Òį„…L»f?ÀÈeNnðE Íä§¹“ÿ°F¥ÓüÔ2žœðÎ~0¥Sm̧’ÌJëL½˜°TÁ.39™©Ÿ»mØ2Ùû뎅õã¡á18²³qÍ&?´‡ŒiéiGàfß’§xôýLÚôÆsÑûÿo3ž‹kêÜmCèiìXû3 Õnç¡áñTѳÐêcÉ%Ö³~d/¾õ ÎÞ#x±M(æ´$2ëT½ðƒë»Lö(z ïÁ‡~ȲõÉtìQ•¥Úf±cùî7¶ºƒØp ÈtþX—€Öàú{Ø»¨,»ÏHylXžº8W}–VjÊЃÇãÁm$èñ勊ۥ\eV\Þµóuúõz£àsðMLu/ Îö!363wÕQêßû÷^W‹€Æ5Oñó°å|¾oÍš9¹ Aj;&q{× >;:0qÁš{~eáI„õ›ÊØQØ5-k’ðÍf6Ÿ#I{pêÕ«ƒU\ŠH:€ØN\›÷1>„C_ÝÅê_’۱ʑ­~õ†ßS\Ý¡FÿÁ,žû+ƒ_»Šàâ¶OßÈ´%‰4~h݆E@³ðdÖÞ¾€U»Go=Î)Ý&í:qe³ L¢¹OT/xQ <9™œ<¸‰Õï}Gšµ)WGÛ!ó·²ÛFC RâŒlIÇv phmieÚ}cyávºm‰Öfæ}p½'3v@ MСe¹ÃbÉÂMÜül[‚òÖ.ü궦cë8Džhä”\Ϲ“H3üh|E;ZÅønÄÅŸÖ´…Åiþ?öžÄ•‘P¦mÆ4¸†¦– |·5•ža!˜2wóõÐpdc³6óÚ¹ìZ¬–׆窋òÔçYõp¡ ¸k {¿yöT¡]¾±¨a ·Þç(s€¦¤ëò®¨¼t üM¾†¦Yƒ©kÕÞsxæÉ»9äòrô­!Ü8µ 1†ýdÎ òX÷^}š/Â@»†~|‡ÝA´hŠMÓ|ƒ²ÐÊ58‹|oè’´MÇ×-`òœ5ü´çÙšæKš«hЉРòe¤}“æmÿƒ“îNT-fHwÒäz9<¡í&ÌSºãx6–®·1¨õ7¼1ºvëÃÀ~·rmêöý`…o(¤Ä\§#÷½<’ÎÕÌxÎÑ6ž)4"OTLþq\ÕØÎê½»Iö´ÄvrrhÒºöüúµ×¦M¼KwüA’»-Z¡t8û&¤x=ÛbzЯùLw/{ÿÓƒ[{u§sl•‹¿î$ñÕµÏɲm#›4¦[#¾ÞJj×.8þüŽÍžzÜ×4=åÏrÚ5¯ååÙ0¾¼6,­.’Ï£>¹7ƒ‘ýx~D3 Íáem}—§ŠòE K J-s€M‰Ëå-\~µˆkØ ÐR9tË6£Ç3¬½Pc8ª_ÀEhg1±±gåÏ-4:Þó\Âר/žƒËytÌl2®}F7%D&°â™øú\æÕu¤0•<©ûlßþ©7y(ÞYèÎVଌÅÂÀ)+éðóÞ_¸ˆqƒ±tØ»LÔ¿ u'Y÷^ÝÿÜ?X<~¿WkÊ•õ1 pŸ³m¤—ܘ-&@G—Ì튳o:|'åù׳5Š[_œC›ßþÇÊ+x塬ºãU&ö‹Áyï°Ý'¶“è‘„ÄTÇz.Û˜4š_ßÓë_òëé–õ;¹õÑ2Ø„È8—]O—6>Ÿ· ‹Ô…þ×êó‚á_‡FññEÖ¹3Ó"«H8o»”Qfy¶Ù—•p•¶†TÊ` uŸŸ`®VZ–\ ôº(œÚEœr)!–DZ?`ë/‡p5i€³î0#ÆÎà•ñÆíu±ž«m¸KÈçÿÈÂ^j°Ôˆ#ºœí¿Ã_»à9ÂÆXêÄb¥Ï ”QÏÂìGD›^<Øê:¿3’'>^ÍŸ½¢ÙEŠ„”¹Y=}5'œíÒ>»%æœý¦Ê·ÐÎþ"Ÿ|õU6ê´|¨ ÕMqN»í£–Ÿ w”dÃÚeذX]˜«ÿ…ú¼Øc@¡ÿ=wþŠÚ¥ä;Ì¢eV¢U„«<˜ü „äMß³1±"ÚpÏM¡<¸êEžÕpSóPì¹ÉI¤Û Џõ‹ô¶o *&{(qq-|[$Ã?Ï8ãNz¶¬…Ÿëe–ñ¼†9„øzV>üf1+ÞD´L!£æ•tmtÑ"‰láñÔsX:ë¯oF„߉ó˜u`#?þœ3û?­˜É²¤zŒx£%B€9ð@AÒ†¯X ‚«£;0¢O8ƒ–>Á#Únm] ‡ë$‡ÒëÒ£g<Τµ¬üÉ *¦N÷Q~Ý—ôÁßt1 ¦ƒxº÷ïŒ^0…ÛN¤ä9ÚFÞÏO­[ˆ.ÄW÷°ïëE,9Rž7'Hˆ€+Ô»#–½Ä+ö»¸¾.ìÿ¿,9Z›O¶$°¬›ŽRê¹sðN>ÿÍ ¢nužãlJÈÄpV»p^(@Ú~¶mÂî:ÅñÄ=¬ÿìS~MªAGqUu3&qî~#ã¹õ?<¸è=Œ€.¼Ú¢ šQå\¿-ÞGËoòêB«R¾úü§Ð‚ÎÓ.aòœeVTáªÁÕCú°ö5Ì\Ý‘Ö#ÒhðkLª2“Ù_¾Ï„Uéèö*D_9˜×5 ðB ’‰Ëù︊ ½éïÞELÿWx3p.ï}¼˜ §á1Û ªÞˆNQ¥„kUhwßhnzu‹'>O®£­4 sà LÉlÖº˜8&‰—gÏbÜç¹ %–€PšFä˜ü‰mOõµ ÷H^sê4êÌ“³GrKŒÃ7Uh åúò/~È”•]¸ò±&4½&Óƒ§ðödzxfY^{0±Gqux,)»øjÞ26%å‚´Ò¨ ¿8X»vqî$5 ú¦ÇwcY4}-]^º–FƒÊhù?³eòÛo±ü¤APD<·=s?w7Êò´sÇ˼æœÉŒO¦ñL²¤z½V ™p/}bíeG‚–RÏmïaíÒUlKÉEJ;Õã:rÿ˜[‰¶]oËL@HU´u+yáé• 9©^‹º­‡ñZßn4 Éϳ£ýÆN\÷멵æ}<Ýn¢ño𿵜ÝGËkòëâ×ý§GAqžvê@ž³ÌŠ‹Ze%³,^¼ØÝ­[·sNÿICÇ@ÃTbMù7eáóy žR“Ò(òæ!4´ TóÒ(ímÍä„‹_?ß ðe¡„2äËϯ¦¼¤‚ƒƒÏ3ÏùË·‘Q¬ …í$ £è«h„@+h’—FqÛI7ÿ\þwËJ¯N:U¾2žÕn|Á!åjîæÜw?Ÿ·œÄ¼áõ±‹âõV(Ui óËrV9Jª_J¯gÈûþùÛå/µW!D Óçî7]7 ê´¼¿-­–fÃ󭋯[V=\›–”®4Ð Îêg岋÷`¹Ë¬¸ =.¡™Êð4šf:kjH3™Î€/ÖRQÙù+ÏõK(C‰Ç.nž…Ð0™ÊúvnOhœ]¥¤[Âw/~½ü…¶!44­ìÁN a:Ÿú-ûœf2]b»ü•vëË¿©”¼–ùÛÒú¨©í«S…òLþ}.ÞÔ’BÕ…*óåÚùOQ!ï·.æt­BÕ…*óåš*T( …ò¸ÿ^þMÓ¢‡K3¥ªP(KñjÇT…j …®Š48y½^eÅYx½^%^ …®ËS¸<2„â,<.…B ×å)\º®+C(”Ç¥P(áª8Â¥¦ J¸ %\J¸J¸ %\ %\åÀÈ&qó:ÖíË@——qšJ¸ %\Š "\î$~^ðÃô¤ã•í¹¢C7nú4ÓÖ&á¹c¤k73ŸÃ?¤pÁJu1ÒTÂ¥PTjÔÈ•D¸döN¦ά]NšÜÔ“ûúF¢¥²wËfRÜnGVÃÐ/ø€{1ÒTÂ¥P(áR\ÎÂ%sØ1çfí áö·ÞãáVU°ä½ü³[÷Û|Û/ÀHeó²)¼±ìGvœÔlÐþ>Ì€fU};8ë'øßkÿeú{9v2“\áOh£Ž züaz×8³=Äé¹r†ïÿ¯ÿ3»ø‘¸âIFÍØÀÑLs•HÚöÍÓƒÛQÜ'™F:[W¼Éäe?²íh¦ªè7áM¬WJšWÛ8°æ-^šõ%[“\H{(|‹‰½jc­ï5UÂ¥P(ẬÅ뢓µEÂÚaò̵…(º}ñ4íq·1¨µ›U£ûqÏó³ùbW*êQn…B¡„«²¸ÍU¢¨e…cÛÉ6Êž~*î±’¢Uì¼ÙŽO^º¾ßK ÿÀsp9Ž™Í®ˆ~¼0u6ó§< 5´a2t$M++OEÓÄÍÀ)+YùÚÝ48ñãßÂ9»È2ÔôšB¡„KQñ hFßnÁdý.Ëwg—ø<”µf#êZÓÙôÓ\ùk+îDÖoÎÀÕˆP›8wä¡ÉN;dÊA/¤2®CÙãeà°[¸ªY5iJLPAzÖ ˆ0§±é§Ã×>Gš æêvèÇØi‹™ÖÓŸmËV°+»t‘U(ÿ’›ue‚J€¤íˆ1tÿùI¦¾›ý{qU£Hª™Ò9²{;‡"ðÈm¹@æáÇ}ôŒüùé æŽ`Èø¶•gñÈJ³8;‹?ŸÍûMú+“I»ŠkÃâ©%æ°tÖ^ߌ¿Ê,Qµ=#o«ÅÝ å19„^ÍñgŸ$»nºE—œf·ê[Xõ³ATL œî£üº/é‚¿ÚxV¡PÂ¥LP90UëÄsKæÒjæL>Xû>–¤â‘V‚#›Ð¹¿õ‡¾Í ¿ÉLùà5J’ÔˆkÇÓᎴò=hU¹êá'¹õ¹·™óìc¸5i?¤1Ýú÷gâ˜$^ž=‹qŸç‚”XBi‘Bï$~ä ¦WÂÔ¦óÔ¢ {-º>Ö’kbÂJL³c³]|5o›’rAÚ iÔ…Ç_H¬]CÅg(ÿò{õ’î«/^ìîÖ­[¡ÅwÅ_!''‡ÄÄDÚµkw‰®(‘†ÄŦÜ4–W—RgÖ‰š¦Z÷’º¦3Jæ;†fÊ7‰aä_BhšÅÒÍ;'4´BŠXü;¢¬4‘F¡iA!ЄVi¢ _óuBBB°Ùl¶ q1qDÖ‰T]¡<.Åß»š ¬Ù4!4L¦Ò¯u²ø1¦™Î3Ýs}§¤4Z%ž¼æ?׉Óé¬ù—R²ñ÷=v”ð°pÕõJ¸ŠÊŽÛã&׋É\1ÕYÓ4šÆ7å— ¿¦fgJ¸ŠÊNþ›3*êÛ3 É,….…B WE*„ªG….…â_¤\ÿ}…ê]‹ %\ …ò¸*˜ö*áR(᪤x¹yêeEÆ´20¤ïïŸi–'Y;g¿„`t÷:ØÎs©J R­o)”p7FnÇ'cªU—šví2LWâ:ø9ºq·jiг¼•¿äq9ݹ#þ¸"ÊrÇ$º÷3ÿñçY?–)CêãÔSÙ±v›;Ýâ{†N¥ Eå.é9ɯ/bÙwÛØw0‰ ÝB`X,Wt¾…¡ýÚzv4R¿åÑ;Þ`›^“»Þ}‡;£lä 4]=‰õK?‡ÿ(áRåÞ‘OU—ØV×qûí×Ð8ØR¾væÚÇÂdz§÷[¼á¤üzc£zháÕhLUg¦,ÏßãRk\ŠJ!\Fú¦=ö «½y@çôáí|³¶û^À7HHá{Ãl¹€éæîÿŒÏöëýG54EQF ¾éÉdÓ×Óylõ'ÜôÂ+Ü×"ó¹„HJ¤a <Á)wOãúÇÇs𽕤°æüá’Åßæ¯PTHá2RÙ0s«yÐeW Á€Nõ©FÇv°GkE-kÁ6î;?ˬO~açþuêsÕ­CrM4~&žƒ|8eŸnMàØ©,ÜÒJPxû`èÕ‘8‹ÌÞeÁˆ[Y$€¨¡Ì{³'µÍYlyúr"S[ ¯fàð\á»ãDæðíBf~´ŽmûRȱV¥ñMcx±·,=]‹NÊÆåLó¦âÖìGÿ‡ŸNû`s±;f‡×ÿÌ)C¤Ú™¢›·¡vZôºíF>yæqÞ{õ]â§>B§êf„ç4›WÍböêߨ—j"$®=ýFÜC·h?Ly shÁô\èkqñcæ3¡ƒƒck&ðÌ¢ÍÏ60Ô¢E÷AŒîÛ‚jf_ŸZxÿ£|Õr<3‡Åa?£Tyh¸8øÕ\¦.YË®ä\¤-„vCŸçÉëÂ(i’ÄÀPk\ŠŠ/\Æé,ùö4†„ˆ;žcLŸh& ˜ja4Îß½VºøcÞ<´"¯n Ü„-¬šü »ÒÞarŸHìž“ü¾nrt¤fÅJ§·²êµqè!3x°‰_‘k[ 0 lÕ¾ 3dãDŽÿ+Ù©§HøýC^~ÁFÄÛwc÷°ÙF,؇×0RƒœdRÌ OØO×8ý#¯¾´˜_su ÿBm9œ:ž‰ÝZÂ:˜žÂöMÉê¦TQÍÁ ÃndÕ#³â§d®ì^…„¥Ï2î7 ~”¡5³ùmÙ ¦>'›v/MÍ>/+¤ûã<Õµ&V!p„:‚]ËÝu§ªŸAÒ¦U¼»ôu¦×{‡1m‚0I‰¡ëx‚µ5™ïÁI‰çÈj^yû;½†ñlëPÌi'Ȭ„™R¼1ò¸_¸È·!ë1üµ‰ÜZÇŽôzÑl%¼±Ü›ÆáT‰Ä¦Z™¢„¿±†6$Âü1»÷žÄ•‘À‚ULjú6ƒ® Á" aH F®äË}wë {ÕZD×­Eøn¥gT+:FåytqÁþá¾Þrw«ìÅ„Jó¸¼é'I3œ4hÞš+ù£Ñü„KÔ-C­q)*p ³5/1f­ôH¼ÜcÛ8 K¤­9}ohLu‡‰j]»SÞŸìt`[’›¶…ÞÙ)4 “-Œf áP*©GÓpC!á“ “ÉThÇÝ46/™Ä¤e›I–¾Îj’,Ne{ÉMÞÌŸ‰´´ ÿqYMüŒ¬ÒÓµ„µæÊÐå¬<ºŸ™#óm§›èÛÿV®ª[’ šCª ¨ŒÂe¶1ðÖZ´;r”1ë\d«ñëü…«pT¡”Â×NÝIr8×˱wFÐ{šÈW9 ÃÀv2=Æ7K! §$¼œÜø³—ͦ)¸4&—9=]]Ë_Ó’²@ÈlÑ7ЧÙzf?7Šýn çÍ×Ó1&¨Ô5·üü+Z¸ÌÕc¨!I$±ñ·ã Ž,yÈ.ÔØÏxb¢` Jœ77áv©H¯#ïiZÞo¼^_GÌO&{ëL^\º‰4Y‡ë¦Îƒ|8c5ûußì†ôº}š†¹XXVYé GCî›<‰:‹³üóßùsí^úág¾ù÷ÄÛÓJ³hð\‚'3Ýn«ËHã8w¯Ì íb'R’’æáx–®úÐßö¸ÜÇwrØ#©ŒY÷¢c§åÈg¸'®h›²U ÀÄ1ß,4Šˆ‘÷ÈÆ¿²œ¬Nwóð=õ©*ðÅëo³ž‚ÈAÊ𸤥7?óWlú†O>ú˜×ÿ˜5ýþËo«‡³„ÐE%\Š’ öð“ؘnñV„€„ù/ñÚª ì>šJzZ ‡ÿø…/×$G‚-,žHM r·ðÁ—»8ív‘ðõ§ü)%ÒIÃs‰aÁÅßå)¬U¨b8Áö™€áõb “vð ™RBd7ö¾žë¯½’H{¡µ«š G r7³âÛ² @ºÉÌp#­A¥¤ x2I×êqÓð˜·d"}BÒØÏwNœ-O¦j‚ ç’T¤ÐÀ$¸4›,ên¾ü2‘W6»ÉUc×_.C‚FÎ!>›õ9IŽÖônS [p4á¦\%HBjצN:DäýÕtšÂŠ¿ rNçøÖˆ ßl®ÃÛHÐ#¹ùökiU?š˜ØúDäÝ(æ}çÌTaÞgHoAhNj_Ñáÿ}ƒº:Ù½æ öfû"le±¿ü—ì*ÚãÂT“n£ñÍ3Øœ}˜¯gþ—ofædH¤£=Íž¤]õ«Öc9­:Æï³Ÿàö9›Ö½ýNZjW9®g¢S#+ë6¹ØúÆ=Ü<ÊîìÊ3†SŸ ös*a6#îûŽºU]ìÍ6Îô3sÍ. 겂q_Ÿâ·w çt3&tŒú±db‹RÓ9¸ˆ‘}Fz@uª;s9vÜ@b!<*ðlCšCˆo{r.}­jf:ve@]5ý4,œ<‘ÅÊï’ø" š^_—çk¦ñèûÉì÷úÆŸ&¼×ÁË„ùGùÅe¢a³7÷#.’“²YýcŸÑ}–ÉÆ€t=”Ȉï]¸$ LÔoZÁÍýi¨¡ç䲿³ÃÌ;j`˜Ì4k f~D;%É'2YþÝIþ—d` Ѹ:÷· ¤¡¿¯— ?æÕÜ•x`ܱy#;~ý–Íß~æä\?n(íƒMh¢n¨Á˜5“xYëÃuMj`wŸâXF®îK€© ëZYýý¬ª=Qò™!­éKMV²fÙçøun@¸=™#Ù…<*™¾ž÷Yó£F¤lYÇo‡ÃhiÛÉW› jGãð$±õP†³ª/‚·„u.P¯|RTᬵ{0qv4k-åËMûH8šJ®Ùª5jQ¿U3ª@8‰ò¯¿ÇŒO7òçqþa h×kû×ÃQÞ'*µ`:?ò$ߜͧ[IÍðTSàÑÁÞp0ãGxy{ùZvßËŽãa«B혦Ôõ7!LA´ý&êÌbÞÿ¶°çH*nK ‘5 ÜÓùá'9øÖÙéz¥“:5l>z‚ÄS`®G‡ƒÕ®*¦³²m#ª}sü?ùߥ¯Ua"*ÂAHÚ)¦~›‹Ëf¡}«ê ¿Yrxá öíÎÁçG¼_ ûÓ$`"®žýøiv»Q­kóJ[¿nLæ•dI݆ÕÔ»6ö¥‡XzÒ7\iš(TfAd«ZLlgfËo)¼zÔNi‰ ^ëZ¼Ð\òÙÇ™“.hѺ#{ÀÑ÷O°ËY…1]ÉÞt’x0füNëx*ù˜øîüˆ¢nË»yñ–«i\Ý–÷|•¸;^àÅ ù,üú&¯ÉÀ°Ùz m®ŽÁßH«A÷ÒíÍ÷Y1yn{uZÜC‡›ºóø½É¼»b9o|ïöÍ,øU§~˜_ÞÔb¾ƒ”/\Õèxçͬ{çÌû¼- :íaýŠ/Ø™’‹ÄFµ˜¶ }¸–’_¦+óþS(þ JR ËâÅ‹Ýݺuû‹{íäOK £Â÷n³B‘†RÓBøÖ–DÑíâ%Û»ŸÙö½ø¶òF¡¹v‘·}ñô Í7æŸ?“‡B_l5_JºRbH£Ð2¯LZ)vÊNýƒ·‡d[÷å¹Í\×·.£ôãܹ"ƒTÍÆwFríÁDîû.`­ÁŒ>lXy€wS<3( ÿïðä/ºÕ±ƒÂñûþϰóÔà0"·&2z½‹ ˜mÜ30‚îÉGüiégÒ?Ľ߹ȵù3nPu·%òÀz9áÒvž†ßÚÆíðà‘`®Z•ÉwT#aÕ~ÞÑC˜ÙÇ_VäÝDÝ7%û/x¶õ†¨S§6‡³H¿ HÛ̼þQb»Mó­…I£Ðƒÿ=HCG¢¤“מÁ÷Âm[¥ šð­2ìÞ³›+š]¡öåRT\«ð`~®f,„†8-äKÞö½pg>Ÿô }G”rý’ÒMœÇ޵Ö:t¹íJ¶eÿSÕën)!7#—d‚¨aHWß•<\ßI•éäÔ Þìbîa/¦;fƒ \ùËôwbÊ"£˜ªXüíDZ v,ô›¼ïXýìÔ2 ºD±âêÂv„Ü ÷žÓ¬8ÀžQÔý3•O6¥².IÇ[É;ž¦‰ÙÏï‘AôlY•GûVå¦_yncn¥³¯ Ûš!|A …®Ê¦]ÎË2[iOó‹'Œ%Øüu)Œ ‰Þ`Eš±Õ}& ­ÂMxN»HÖA‹Eõd¸8¢W¥qáßäŸËô‹–œØá£âCµ4 œfZB?v‰â…æU©·ù8ÛÝ•wÊ0K“l[“¿ë1¢!…Äãõ¨>®PÂ¥¸Dwü¹Ù|²Û`bÛh®4žNô=']Y,Úäfr«Z<âMæÿNBTÃjÜäáƒÏ³Ïš&9Y,ÚêaRËÚŒ)|uÔC®ÅŒýT?&g±x«‡‰Ík1–¾Lôà2› ·çòõ9þþÜ)HLöc²Ð$Ø„–ë!«²ßÈWðó_²+  ¡PÂ¥¸„CÏžmimZ ë®4vçDíÿ%‘qî nÂÓþ‚”¤,~x’U'RÞ˜oðçúC<]ƒ»›Tçñ–Âãaý÷Yü”âå¼swÅWãáæ&L/÷'óÓN^§ö­ªÐØ_Cƒ”Ìü"•ƒÞÊ Qá§ †Ù¬†Å?ÒüÎâoF*òÉÎÎ&11‘—6T»ø)]–ü|¾H²²ù~Ÿàe}ÞX×;ó ‚d¡tË:§æ)áZ•‘%P»vmG…-Ãþ„ýÔ¨^ƒZáµTgW(Kñ×îàõ2>¾Ç Êq,O?ÊôJJß÷¬PɪSÖ9ã_8Ý´}çvN$ŸÀf³UØö[/–ð°pÕùJ¸Šm[µ%""§ÓYaË fdJ¸ŠùÏa©Á_¡84e…B¡P(áR( …B —B¡P(jë’ðɱʊ"üòs²2‚BñO Wrr2»ví"''GY5ÜÜ\’““¹òÊ+•1EX¿~={öì©°áð E¥®]»vqõ5W«(©BdggsèÐ!eÅY\õŸ«ˆŒŒ¬Ðáð Å?Å[ãRž–B¡P(*”ÇTè-.Û¥+g·Š¾­‰B¡„«N ÅÙCµ…B ×å*\•ÕåÒSøiÙR¶×¹AC|T*”Ç¥P(áR×e‹ç(ß,ZÌÆ[nàÎS¸Œl·nâP@SÚE`úˆ D —B¡„ëß,\ÆiþoÜ Æ~—„WتQ‡&ÿéÉ]wÝLËêÄE)Ÿ‘çQJø;WpífæcØ9`‹£0)K¡P\*á2¤@ͶǥٚÝCúñ$œÿ:÷®KàÝÙÒ¦Šù²®ÃÐÿUƒx~Û¸4íC¡PÂõï󸌎îÜÎÿF\åWnàRFJ ÅÐâŠT3 hÛ‘Î \ôõ)ìFëÖnÖ͜Ļÿ·•ÇÒpÉÚ>5—·nÇ"SÙ¼l o,û‘'$5t ÿƒ3 YÕ‚i;÷ ¾Ÿ=‰wÖüʾSfBÔƒÓS~ù²7óÌ-£Ø5`ïß…M€÷ðRöGÌ›+x±¥?šLgëŠ7™¼ìG¶ÍÀTµý&¼Éƒõ|I˜>+gøþÿŠñŸ1ójÖ¼ÅK³¾dk’ i¥óƒo1±Wm¬ýþèßœáÞÏüÇŸg]üX¦ ©S—¬O*”p]>ÂåIá÷U XúÍ6þ/Á¡ hƾÏ7òkyEˆÑ}[PÍ,|ÂȺtöØöÝ»Œ?Ó(œÑ1y 7‡Y „Bì^›{b{shÑ>§¦ùÎ9¢èØ"€ù›·s"·Τ]ôT¡M›ZØó¾ƒÐÎK@ÜÇ·²Ç@‹ö‘g®s¶¿X?{Üm jý oŒîÇŸÝú0°ß­\Û°j¥x3te."hÜ$¾è´àN`áýòUËñ̇]¦²qÑ ®ÝÉ¡¤LÜ8i1êuž¿6ˆ£ÿ7—©KÖ²+9i ¡ÝÐçyòº0¬¥öÉ€ï+?ÕSmË ^XT‡×ïiˆ¿& Îå×^ެ.½/Ÿ#~IàÄél<8mÚ•[Úilúê{~;ЍE›ÞÃy GlX{N³yÕ,f¯þ}©&BâÚÓoÄ=t‹öûWDÏ–«œ‰°-þ…Òë¤b WÖ.>üâ–VOÐ7¾@´Î ÐH¤ts`é3ŒY’I«¾ƒ-8ðõbf=ù,9S&Ð?چг8°i''ÃncôÈ™‰¬ÿà}ÞyÞD­é#hªùîÈBº?ÎS]kbG¨ ¨ÑµÜýPwªú$mZÅ»K_gz½wÓ&)Ýþr*tºþÒØ#z¯=Þ–€ ‚«…P£Š“¦•kj³¸‘² Lhèx2êWhXMàÎñ`Hyv‚†ŽD ie]_ P´G3pÊJ:ü¼†÷.bÜàE,ö.Ó5(ðØ*jŸ¥r —^]G§À»6i2ßÊ÷vôtvþ°CÕz3êÞFÙhÑU‘G>æ•·¿ÃÑk϶Åœv‚Ì:A˜)ð’Îî“…À¼ïhá7ðÔ½Õyzâ«L™Äc«cÎ[>sq޾lÊ#ÂoçáÑqØNï`Õ̘¶µ&WõïËÃýœþy)ïÍ~•ª ¦roœMä²w鳌ûÄÁMƒehÍl~[6ƒ©Ï ¦ÝKÓÓ¿;”팧[šp•^'Z¸ô´ƒÌ–Ôl\­äëËÌ-,Xyˆê½&òXßhš ]órGáƒE[è>®Ò@J‰#¢íZÖÇ.® Yh›ÆüÌw .âëúÆT{ÕZD×­%Ï+œQ­èå»Vã¸`ÿð_o9Ž»UFæ6>þò^ºD ˆ¤i³&T3•ß²ÖlD]ë6ýtWó8œB€;‘õ›3°F5"Ô&°†6¦®u¿ýp€ìñø—”¸9ˆZA‚Ï÷&[Æâ(~ ˆ0¿Ï¦Ÿãj^ßw|LvªØ!ëTzåsu;ôcì•7ÒõÕŒ\¶‚]}ÇÑÒ¿bǯVvKJ`×›ÜÝç­‚ãÁ7ðÚ»ƒ¨oʶ|øúŸ3ê ®lY»ð‰œ{×IÒ ' š·æŠFþh4$¿ãIYZŸ”gçC˜n3”q½ÇòÄÔ·iZo,×4eöeû™1¢)­›×Ç.SóÄOÜÿamºtïBK ÑÈζ_æ÷M'ðÄF`ÉÜÂÂULjú6ƒ® Á" aH F®äË}wß´üëå•V¸dáþp¶p•V'Z¸¤¡#%M”:Oí>ùsý‰oŠ-°´…Óª±“;w“än‰¿–ÿÛ<5khª‰ÿ#)Ýë›G§ð“JùFörrãGÌ^þ5›¤àÒ˜\æô\t)ñ$ÿÁÑÜKùöïüàŒóøE`[îÅ€ycxÆq=c~:ƒ9‡#2¾-AB Û0êÎhúÏ~Œ‡ŒaÜÞ.ÿœÈ,äí[jqõõQL›ùÿÍ-Mj`:ú§ó¾ ª¶gämµ¸{á£<&‡Ð«y8öì“d×íB·èPšÅÙYüùlÞoÒ‡X™LzØUt«¾…U?DÅÔÀé>ʯû2þ!ø›*CŸýLFÞÆ3÷5;3m¦Y«i ôÕ§hÿCJ¬Ñ7ЧÙzf?7Šýn çÍ×Ó1&Èl%Kë“¥LE qýá®íc˜ñƧ4x²ŽÏ»/4UXV_>;fªÖ©‚p§’æÎ»Ž­*µ‚àiCA IDATÓÙè†<ù'‰¹^޽3‚ÞÓ ÖÖ ÃÀv2]:þõW‘éÚ¦ K«“ -\Z@8¡Á¶ÝGÉÑkb.aÒXJ‰A~-¸ËBvQK0 fÅ‚×ðÝiùúŠQD ½GÖ0þ•åduº›‡ï©OUy„/^›õä-6ê:Æeß4íÔú63ü&3åƒ×x(IR#®L{„;8òîíÄ ~‡¹UÞáÍe³yzy“ª5›Ð%&³€…è¯21mo¯˜È£³½hŽ ÿoï¼Ã£¨ºþ»³%›ÝtH!„$ % ½w ¨ˆÒ­•&(о*¾* èk¤ ì¾€ø‚"*Š ¢¢‘Ž„„ôlŸ™ïÝTÒà#äþžgŸ$»wg&3çžsϹ÷žCTãö47"°ÐüÞÌŸÇ>œÏ#+sÑ,ué3¥W5¬Cωӹù‰WY2s ÎÀhºŽ¾œî­~gÓ²5ì<éÝBd³ÞL}z$,ÊÅßá/ååð}ÄZ‡†Mf(>°*«¿•£ÀLõ¸áñ×h»s3ÿýðc^šú1ë†ý‹ ¾ k9}²ì¥ÿ¦zÜðàlŸ¸Œ—?F ÿDº®ã©¬/—q³Û¯#Ð ˜  y54]G¨^T,´»÷qîlX» ¨Œál¦ÔPaEúõÜ.Mç¼j”À¦ôïÊŸ'³îÆ& ixºëmŒhH¼é#öüô7®¦ |aÏßìØ“©nCjô¢ ®zW%~ 3AàÈtàU5Œþ“8þÂA5ÑCúÒ>ÚˆPƒH†ou4cX}¢ çaq†Å %_3Cy±sÆ¿û5ãÄém„±ío}Š#ôB£”Z@! a´¼å *®$¢Øšˆ£Ïƒ¯Ðû½„Xx,S-:Üö/–,vÅàû~\?y³Óõ‚÷îæÍÇO”3\rÁöYM/|]rûŸ|{EI¯H+Õß´Óû_‘l[‰kÛŸq­¯ ÛÂÉÌ\÷)ûû§¹±ì>YîuøkˆéÍC£¾gÂüUØUDÿ9]•ôå²®±ðÙùߣÔ߆°úÄ\>¨Ù;«R2¼}I>û³•M/?é׋|9¼•ÃÇÒkç‹$O›ÆþëûСQ,aJ©öòwìõÜuEKFÞP—I¼Èœ€aôI€ƒ[Vóþß±Ü2±Aß(\dù b躡Më›Yûå»|Ôäõ ò";Ð-²ѼϺ5°]‘D¬%cö¢ãˆ–ôïQëü C%›0Š¡üB(* Á ¡ *k£(^Gùç(Š¡Œk¾D›Ô€9®òB@§õ·Óû€7m;ŸîÔˆ‹ Ðs’݇óѬᾭåôÉ+›„­Ö+>|v,×õîF»Îݹú‘/ÉP5?åùq7Ó³k7ÚvéÏ„u'ðJïA"‘œŒÕqЈüíÄäoC)ÑÁ‹‘ãA½È±6E®â8§–‰¼?×óú«+ùôç£d¹M„Æ$ТïX»§Qî?Yøð4öŒXIrƒ`ªžpÝÍŸËeÖg‘Ü>éy:EñZ¢fÅc³øÈ8ˆ)Ïu§žÙƒé²Zä#•H$«áŠÊ߯ݺ!„@Ó4t]CÓTÜn7?ýòûL8M1òîŸ+³•õ-ÏLxŽÿÙz0æÁQ4v“vèþTÂ|% MSÏ|›zŠß'¸×#Œº¶µ¿ì€@Ïø¯S t|a»…ør ™3E"‘\ĆK÷zÐ4•ƒ‡ö½§CHHê'¢í{MU‹}ÃW[7I êÆ)[{é‘îÃß°#'~O?Ê=‚}žÞ’Y¨ÌI—¾ßÛÎú„…½myo:÷/øãy*ư: z€ÇFu&Ê(@µ“‘¯“µî>z®÷'~ÌJVõË Ow±kʵt‘ŒXü6“šY‘I¯%ÉEi¸TÕ‹Ýž_8ÂO;™MJJ*šV0ÇU2‹³¢(4mšHddÞ¿¾$ÃÖ®üeõÂÀåí¢ÛÊF}³FÊLæoÉdŸ³æ®h4Õ¾Œ>bǺo9Ú²‰J™PôͳxþúXÌBŒ"­ndÂÌ¡DØTþþa%/,™Éì¤wx®GxaH1´÷ æÞÞ‹FÖÅl0Óqê\lnC3µ-ÒhÕ`lõë²¢߬;ÄËUÔ’–„ñ¼Ü –®<̳d>™ÁHëÖµ’HÃ#Mãdš-;ÒX}À[¥¹òê1\^•SéäåùÊÖ§¤¤²dÑ2Ìfs™í½ª—Q£ïÄævø,P™JPP·U,³º˜Ùõc:órMôëV›_«qï³IUk¨Ä^ÏÓ3~gÊóO1hërº ¸‰aƒÐ9ÞZb>+02‘¤&‰˜‹•XnÔƒ¾ü šGrxÓí¬ÝqW÷0 *E™"hÒ¤1þïyí>Ñ ‰kL“&6J—Ô,A¡LŠ‘Þ=Ãùøh:y‹’JP0£:`4x¨möumi¸j¨¤˜-Œ¸©C£5þÜ“Eò.7™ºøX+agPí¼Z —Çã%õD*n·/k„¦©˜Íf¶|ýY™ó,W]y5𦑙‘‰Çã-_¨M´³ÿÇqæ|—O®»œfÞ¼&‚«#rx+­¦Žä¨?`«{b×ëùàýÅLxw1íÆÌ楻ZR¨^ðØ,|Rœøfs—¬cÛ¾TìŠ £CÅ”íD+¥˜|_¥õB­³Tõ—!¡„ê%/<Œ[dñÌ>¯«B£¶µh£yp¢aö›-“•‰wÖ¥áÎCLüÑ[ch/ÝV‹Ã`îq…¶£ÑØB|°3*?o>ÌS@«Ne¼¿G%ªežìl#Ú ^§‡]¿¤ñêö|2T…Ö×ÔçÉèl&¯*0ª‚ÄÎ Ìkî౩üæ–Æ´úQhÔ!†!Ñ^Öt„%G¼x >ú= hÆÊå¢ë1Õèq¥§þ]`«Ú´jW¦t(ÄÜœo#&½‰ž±&„BÃPÁfÙÅ$gh¸BšËÍ®ìÁÍõ2yé€F|óZ8³xdŸ‹í¡©U Z•dY`?•Ïw8 Æ]†rÞòÓòØšî×€©*uÇÓ;΄é€Jþß9üê­CÏz>Éñâ5Сìßâ$_>Àó‚1ÐL¼Ypò˜‹<ýÿ£ãDu.LE†Ë`Pøxm2?íüMS‹yb¾«ß²eqõB ½µ4QÎH”שы{–ðÔ»š´¸ŒøèDV [V}Dš±%=-s ­[HÞ°˜U-n¡‘žNNžô­Óœºb «½KÈ5­ˆ·¥r8ONœKÎ4¤fg††';‡·÷G0£C01'= niâÏï²Øï4wƒÕªœaÖŸ<êzeï j×gtÇPÚÔ6¨éxÍo ÏPê.›ëLN²¾'‡œpMŒnÞÿ[E“¾FÕ(´s‡¢Z —ÕˆÉ\$ž1AFr²3è}E?ÌEEô4½D%X¯ÇÃÚõ–kˆT§›lBˆ´}(Lj™!'KÃ[#¥ACU ÎÜ̪—WqÊ©£›Cˆ»üZ&¿2ŽbMNωӹù‰WY2s ÎÀhºŽ¾œ~Çóü´“<»x36¸@×1ÇÐ2þL6)KÎÖK¹tþ…P“ÀåÔPÑØýc6©Ãù«»N;ryfŸj$Ç6Å/[:L¦s³ÿÏÆcýkaÝ›Îܯd 3×\CWݧu•_~sà½:ŒöAyìmh#4;‡Ýùr v¾ðÚ]üí…æ1&,¸ñ”3P©Š\TÇåq3tð­˜ÍhšŽ®i8\2²ÒQ½n4ßÒxÝ7nÒüÙh#jEá°;Ë$o¾“ßì‚® Ìt¯CpL „‡OÒjêÈI!¨É@¦Ï¹izéÑR¸p" ®¼Ù‡éz®QP„ ÑÀé,¾aZ©‘âÛÿenÀøw¿fœP0 :ë gõ7CŠA.—€P1Ë­£žŒlÞ9ÎÄ& ÿð7¿:}Ñ•|/XmŸáÒTN8u®¨m"®ÿç%„[IP\,þ>‹í9:ºPIrêt-Ö&ëP[œq\—d%ª‘ã¿çqÜ+ßyÃådÝ^•ŽÍjÓÿ'ï¤j§‡Œ«(Õb¸ìùNL&3ùö|ºoO–®c³!tPuÍïqi>Ã†Žªj¨^G"ìq²î''×t«Ã9é|™o¦_÷`LÇNò¿ í9Í.Š0TzŠb(ã« Cß)óCÁ }2IÁØIlËï½è^¾ûöŸµ2°íWnß›8<:æ@3€êaÛŸnëÅ6þíE ±z–—àÎqr‚Z èF{LÄ”ê{n'kw{è×!šz7+S<þk“œT~Þv‚Íñ±Œ’@£]Yüê!SSˆŽ´P7;“%¿{ø® rQ=ËáÝ^þüc7á!ü/¥ð§¦ùR@©ªŠªjhšUUIKKÃåªhì¥sd×17F3¦U˜5þ:˜Î£_dqBŽœ$’Ìã²Áí÷¸©™¼ºÉ7¥ê‚XÈPuŽütŒç-ÑÜÖ2šªG%#=Ÿ½Ž3„zNeòüf#÷u¬Å”¦¾i ËÃYZ±[:Gödð[‡Z¤eðmŽ&Äç-?ŸWVæ—εéß ‚qm ÑÉÎtðÃ.BÕä¢,wÀ”œœìîׯßéûv*`ãÆ¬LmãK3td3†ƒkQ]vJ.¥%ŒPé Wc€obôø>z*¿Và/~ÖSÝÇùòß×J‰•”àŠG>!0¢î%SHRQ|Q•ŠÂõBøSñ-+Åû2¥úsYí©à}„o)u -Sêš„ÅÆC·Ö¡ö·‡xâw¬hðOuJïÕ}ÞzÁ³ªL.ªÅãÒêõB‹»òÌ=µ‚+®$¼¦ëÈ’çÉ…4’®Â³®ë§mW©¨/—Õ¾¢÷ÑA+óX QÑf‚…æm¢ééÎâ‘ýžš»çó@÷¯o(Ïã¨L.ŒÕsY™N¡ŸV"‘œ? &®îS[" ãxs?Î`¯Ì”qQc”·@"‘\Ò¨.V&ï'Ù7·€¦K£% W1>º¿ÑÍ‹]êØív2É!9WGÆ“ˆÍf“7C"ù' —AÒp•ºrŸ“¤,þ5ƒ‰äÌû¼Õ‹4ä‰Dr{\Å)Ø«UÂJ*EÚJ‰D"‘\`†ë«­ÙôÙ:t½˜áÒÁd63ມ´mÓIz"‰D"¹p ×ç›×Ó©c„hš†®û¼/·ÛͺOVC½¸Dy÷%Iù¨§Ø¶f5¿ÖÂ]Ý#1гl#‘†«*¸\.4MåࡽE—!!aÄ×K`þÂJÕÝòíº7™Môís#=»÷­1Ù©S§äfêK”Úµk—û™Œ8TÏq6¯LfûM×r[·rŒRUÚH¤áªÒ@É«b·ç*ä´“Ù¤¤¤ú2Âû̘?§ï/EQhÚ4‘ÈÈ>Ùð=ºõ©¤ckdý¼Œ)—á¸o ËÕÁt‘ l­Zµ¤J.^´,¾zr“¾lÄÌw^âúhcáž{×Þ »+™ÐW²pp=ÌgÑGu]+¨¼Ey»ù«ÒFriÉIµ’<•‘N^ž¯¶hJJ*K-Ãl6—Ý^õ2jôXã±Ûó©h{ š½—«æ3ï­m¤z5šÈ*pÉ?‡F×qciµy6¯¿õ½&µ$X ¥óÙk«93˜åýë^´KÉ…)'Õ“Þã%õD*n·Ógl5³ÙÌ–¯?+3,vÕ•W£i™™x<¥y÷ptÝó¼ôUmnyâa~yöNI‘HþQŒ±×1õ¶w±âUÖyáñ&ì»Wðê÷®{i$M­ BËbךyÌY³•ßRu¢“º1üÁ‰ŒhŽ¡@Y¹Sùrñl^[·ƒ” #1I SÇP\eTÚÆÃ¡w§sÿ‚8ž§b K Ó xlTg¢dñâ—ÝAÊÚWª/Tx*=½˜+ïûÙ¦U»2©‚°`nNªW­àÈ&†/àÓa Šs;S¥J$4ù0CÖßÇks?§÷Ó—ñÑ ×ýqîï†Q¸Ø»ø~Æ,Ê¡û¨‡˜ÝX°oý掛€cÅ"Æ4² `gׯ1ù]îwMdlãÒvÂâß 0·ˆ^…6ˆhu#f%¦ò÷+yaÉLf'½Ãs=ŠIÉE)'ê¡5LîÓê2\^ô2¶kíüùGTõtªWϾªW+µh£,—Óè»h9¹-‘\8‘  VŒ´?Ÿ?4‡Gž¬Í¯ÇÚ0}v/¢L=g;¯¿õ1#ñÌè$lŠàÊN pÍÒÛ<»;¡ÙÛXðÑ êÞµœgÇ4$Pй)¶³ÃßÕµ¬ÊÛ€Bp£ômäÿ³y$‡7ÝÎÚÇquÃ*õÆE-'9'ÈPmÕ4Ç¥ª˜‹UÛ5>^›ÌO;¿/±)¹ l¸eË:âê…zkr‚U"¹èT¡ÆóhŸ¯™¼é-&>Gÿ:fÀ•ú û]Á´éUQ|µ–éÞ&˜å»~%ÕÕ ëÉß9ä £cǺXümJ‰ñ©§ mÀÉoV0wÉ:¶íKÅ®Ø0:TLÙÎÓËÄK.:9iÒx0wuØ\=†Ëb À`(r¹b‚ŒädgÐûŠ~˜üEÁttM/ü]Ó5¼k׈ÌÝ,‘\„"hMS ›NpE§Ì¥¢.¥!|ë‹ua@AÅ[Ñb+¥ò6žCï0yÚbrû>ÈS´$R?È{?Åçòé\rbiÀÈyïWÓâ ·‡›‡$ÀlFÓttMÃár‘•Žêu£é¾”Pø‹‰išºND­(v§|°ÉEJÒñU¸õaŽnF}ó vn;†³uc_¸Î}„owåbNlFL€Às9õÍ+øñëØÛ4'¨Œž9ºò6ÎÃÛÙçmÄä±7Ñ3Ö„PCh*Ø,Í%!'Æàê1\ö|'&“™|{>Ý¿ÁØf Bè êšßãÒ|† UÕP½r?®Dr )©NÜ7"‘˦ñxà=ÜØH°wý–gô¬N„ éÈý·5`øâ)<¤eHçx‚¿q ¯hqWUÚÄ6§®XÂêEïrM+âm©ÎÓe ç‘Ïß_òþ6­šæ¸<^þüc7á!ü/¥ðgA^UUQU Mó¢ª*iii¸].ù%’K MƼÊÛ\æ½û"Ô‰jÜ™ ¯OâÖ¤@é G½ÆÒ°×xyÍb{'ÁBxt z7 Æ(D•Úëàùi'yvñ"flpù2òÇÐ2>ƒ|½œ8OýΦekÊ\aJNNv÷ë×ïŒÒÒlܸ‘¡C‡"„`íÚ÷IN^ê߀\|¬Süxúiž•ÍfcذÛ8pHέ£©ºb¸`—¸ú I¢iÓ¦R&%%سg —^!I]CÕt„ÁpZÍ$_ÎR½P(ŠrÚ|†®k¾¹ïb:C(J‰ºv•µ)yž‚”‚"kŸ]ürâÿ¬Z<®qÝuÏ껾‹¬Š€ ƒCI$V¼G¡¼n)*ø¬xñÿlS•óH.R9 Š¡š2g!0HÉ‘H$I5 «:J$‰D.‰D"‘H¤á’œ[ÔSlK~7¿NÃûO¬Ö²ØùîÌßt wyç÷¦²iÞ f¾—\Ï,‘H¤áªáø ð­ÿ#×g¸\{yýÎëòònò54;Gv}Ã7)¹¨Õa4¼§Ø¶z%üœ‰·¼{j&»7Áö#T¹¹O"‘ø1V× öj•°’ŠE‘¶òÜßì4>;ˆY{TJgɳ’Õ£`)ã¶—(À§W¸¨ ßöÇŸ,|x{F¬$¹A{`Ôã¼}×P^Úwú9}$1ãã… *V0îôóë•n6×õÂd/‰DR}†ë«­ÙôÙ:t½˜áÒÁd63ມ´mÓI–.?§èhªŠZï6fOnO°Aø…‚µnìi¹ÀÊÄTAO½ÁMB øŸ¦©eÖOóº6½¦Ï!!Gܤ$?Éœ_Û0ù‰›©  !4 3Ètɉäâ0\Ÿo^O§Ž]B išC™ŠÛífÝ'«‰ŠŠ¡^\¢¼ûçšÐ´n׎ZÅwd ¿«¬Ÿ;…7FÜÉ»¼Á/ÇêûÀü‘tYàû½í¬OXØ;Ì·ÑS˜‰iÚžhX7[)uhپͭ /‡ß›Âõ•ôËüî?Œ”©^jÕoÇ ã§2¶{ åY<Ï)~HžËÜw¾ao†èË{3zê6Æ€¯ÈÜ3‹þÇî“NtK W<ø ÏŒ;«²ñ’‹õ$›æ<Çÿbïã™ °È±4\g‹ËåBÓTÚ[äèF|½æ/|¡TÝ-_.C“ÙDß>7Ò³{_é‘¢0ÅVI‡¬*ø@×TÔRµ¢ožÅó×Çb‚ ¸à "E?)HñUYA¿½c·ÐöŽ)ŒŠtòû'‹Y2u<Î…+™ÔÂVƬ“ßOàÞ5V†<ø4“bòضt6³&*Ô[=•Ö¾"sÖa“˜×#cæqr#0IÁ¸„ W.{¿ûŽÝGùBÖRmHÃuÖ²äU±Ûó ÃLi'³IIIõe„÷©H߬…´¯( M›&Â'> G·>e.ÝÍñoVòòÂøb_š5š½ocÊ„i"ÃRüü}»=Yô·µ¯}ü4=U)ÀW6‘‰$5IÄ,8ÃÁD%ýüo×î5šqƒ›cU½º%¡ EòÒŒz±'¥Îv^û—?´†‡n¨ƒI@«Øt¾²‚þ¼Ÿæf_‘¹{Ð¥U(ÑÚoÌeG¯nr·N¦ïÿÓçÅdþÕ%¬T67û—Žfø›ðàš%Œ¬g:·}U—…jšœTO’]¯Ê©Œt®BHIIeÉ¢e˜Íæ²Û«^F¾K`ò25·»$5:S`$#ç½O·ïֱꭕ̵’Õcßàõ»|eÀ%Õ…—ìcY`Š"äÈ^ß:ˆ¹}"ñMe:øuåB¾1XÉ%-¿Ø‚--‹]kæ1gÍV~KÕ‰NêÆð'2¢UxÑH¼*mŠËOÎ.^¹ûÞ¸ås†pYM× —„œä°û½—™»f+¿ÏÅÞ¬zöq©^•Sééäæä‘›“W¸ä¹M«v´mÕþ´WA*7'Õ«V~2š1(þºn'-[Ã\'‘p“PŸ±Å^¾÷|ør}øªºÊ`!ÌùÔ³Äô9ö&z¶J¢Y‹–4 ­øéö}|±ÛŽ¥~Qf_[!@÷o$3E6!Þèä¯AlƒËhxYÁ«uƒ>Cm ¦~·a<úz2¯ßÄ/kÞãw»\P_í#é“yè †ððõV¾]ðû: ¥}ÁkeÑñ¾Ñtv“‘W00u±wÉýŒyù'"®{ˆÙÿžÄµw1wÜïsú·XT¥M1ùqäSY©ÝÄ‹O’Fë’7û—O`Ôœï±öÏ¿_œÍ¬{oª®9./z&qçÏ?¢ª§{T½zöEP½Z©EáâÀ‡ÏóÆÁÆŒ™Ùp9¢†ìvî#¸Ø½0XëÒ¬iåøNÃC«Æ’7,fU‹[h¤§“S§'ý[„U©ŒLU úåØÎÖïìXí‡ÙöÞBÖœ¼ŒñsÚ,Cˆ œüa߈§WƒnŒ¿%–»V?Ì$e47w¨K 3Ã9õ¹þÆæXO~ÅûÛ4FaugGJ.zP$A2ßsõ¢»ÈÊt¢ÇÑùÎ;h>bKʳݬ¤¼¿Œ!׳¤wŸ.×ø9ÃJ"g;¯¿õ1#ñÌhŸG|e§8‡fé‚í žÝ°ÜÊÛ„ºøóé3¯ðÒÁî<»ð^:E˜¤ÑºDääµåûˆñ&ÏkZ9©ž9.UŬi ƒAáãµÉü´óû›’ †[¶¬#®^H¡·Vi\JwòÁLîžw˜+Ÿ|ƒ;"ípp9SXQò½ØÛy;ùšÜUY‘¾ÒÎm8='Nçæ'^eÉÌ)8£é:úrúµ¥*Ë`Ì•ô3Ѩ}sjõ3&9ðè×ì ¦/¾—› ž§!†k&Œä³§?`Þû½é2¥-ï[Èüˆy¼úñ"_“×A£+î§×õÍ1ù‹Ìí<éÝBd³ÞL}z$,ŠTbÕ‰æ #mĶážÞKxhÉ&Ž&Õañ©´¸gMƒ½l·BÞ);ª®£¥þÂ~W0mºÆcõÏ»ŠÀDº· fù®_IuuÃZ…6a~5“¾v&ϨьX4™«b¤>¸däd7ûœÁ´éšP(Õf¸,Ö †"—+&ÈHNv½¯è‡9 ÀŸ1A÷ƒóÿ®é^‡µë?¤â5Bn~ø(£æâŠ'_ãÑ«bª¶ÁöRF‰bÐ’¯Xæm(A-oy„EƒÊ)ÀgnÀøw¿fœP0ø{}@\?y³Ó J§+Jáæä’ÒrúZ¶ëç+Ngñ ÓJ…2 úEÓwú|®š¦ÿ¥Ä¢…ðŽãyóãqè×¥Ô¢ÃmÿbéÈâßóvùݼùáØ¢ÿï´ãIª'd'Ãa "„öwÜBÜ­+˜÷j0[E/æ]U“1p+ØÓóP‹)žÒÏFßšã⫎+lãÇÚ¢/I6±úß‹éñú}t 7ÊÁÊ¥ 'šŠŽ tÂ¥êYœáöp󰑘ÍhšŽ®i8\2²ÒQ½n4Ý—Ê7ï¯ûª]ê:µ¢pعZäÿü¼´.32ãª:È¡•_w*-M^q¾² s ÅpÖ篬 ŸP”ÊË©û ÇUé¸e´•œŸ‘t–Cǀ̉70ºí ßFüèÑ.DAˆ‚Ì:yéù¨€5ºõÍ+عíÎÖ± î#|»+sb3bæ˜ÊÛÿÌ‚µáÍÌ~´=OÝýgÔaÕœÁ4°HÝpÑËITñÆUìÜvgë&>¨.ÃeÏwb2™É·ç#ÐÑýŒm¶ „ª®ù=._fUÕP½Wùó.êIþ÷Ú{»ì.¦Æe“²7×?º7S;!‘È)¨ÉùWHN²`²ø[‡®3\:˜Ìf\7”¶m:ÉÕv‰D"¹p ×ç›×Ó©c„hšæß<¦âv»Y÷Éj¢¢b¨—(ï¾D")BËbçûoó}Ø ŒêS³ÛJΧár¹\hšÊÁC{‹.BBˆ¯—Àü…/”ZîËeh2›èÛçFzvï+=2‰¤¦á=ŶÕ+ù¨Kn¿*³Ô’r¨¶ Èv{~aÉ’“©Y|·íO>ݰO?ý–ýûNrà@þò½ÌÄj #¶N>ÙðAù«ïÔLv$ÏbÌ-}i×¥+û aÜœ °kòIV¹['Ó¹ëu<ömêiÅÍþ¥·Ñ¡ëm¬<â‘U†k°§´ùñ[èÖ¥m;w¥mçît¹f(cg.fËq×É…OgÈ[*õIÅú¤z’ìzUNe¤ûsBJJ*K-Ãl6—Ý^õ2jôXã±ÛKç7,î˜)¨¹šÝ8¡ ¡8þXÇ–<Íä †¬Ó@™˜ì\AÈ9–†[Í`ÝKk¹r,IEEµ´Ï™³l?O'ó¼èºIÖ¾ª‘¸É:z{¼4¥=AÞ\RSvðñòÅLúé‹WO¡u,æ)9wú¤zêqy¼¤žHÅíöÕÖÒ4³ÙÌ–¯?+Ó›ºêÊ«Ñ4ÌŒL<oþa(Ç>LáO¾Øµù_}Ãì‡qÐ@)çzBö±,0Erd ¯oÄÜ>‘€ƒ_W.ä;ƒ•\Òòý qÔSl]ðo|¶›gãÔƒéôÈR^¹!“Ô\—,º„^F›6­ StêN—ˆ}ô{r?¤ºie³ ô,v­™Çœ5[ù-U':©ÃœÈˆVá%’®f~÷ÆJáT/µê·ã†ñSÛ=Yµ¨ê-‡Ýï½ÌÜ5[ùåx.†ðfÕc¸T¯Ê©ôô’B ´iÕ®Lgª`>+7'Õ«VxìÂô÷j‡¾}Ÿ[é<)‰`9Ô¯žÒÉ<ô£x¸ÑjžXðû»¥I ‚žö¯}”EÇû'c}ã2òü5‹Ÿ?ßÊ_µogÆÄÖ„iy(kû…Sriã/a¤{È:º“þ»=²­#Mábïâû³(‡î£bvcÁ¾õ ˜;nŽ‹ÓÈR8o¡Ú-´½c £"üþÉb–LsáJ&µ°Élï5MŸàfÿò ŒZpŠN·çß­#™YÕe¸¼èeÌžíüùGTõtªWϾªW;-Ÿ_c;26NàÚ'wâQU"ú=ÍK×ÊÑ|õ £]de:Q‚ãè|ç4±ˆ¥?åÙnVRÞ_ÆŽëYÒ;O—küœá@%̧|t †]éÕµ9VB†‰j;gлka! t-žaóÆÐ6Ø9Ûxý­¿ˆ¹ˆgF'aSWvj€søh–.ØÎàÙÝ ÷³v¯ÑŒÜ«"èÕ- mø(’—î`Ô‹=‰…!k”>9Ûymù>¢G¼ÉóãšbSª±²WU1«¡n0(|¼6™Ÿv~_bSrAØpË–uÄÕ )ôÖ¨PÍ ÂºLgÙG9¸û3–.|‚;…‘ä™W)‡õçÍAF>&ÚˆmÃ=½—ðÐ’MMªÃâRiqÏš{Ùn…¼SvT]ÇTäF#„ÌŽ_£h|/óíHnòÓòÃÚÅ,žt7ÞW–11ìö»‚iÓ5«¿ž–L¤{›`–ïú•TW7 …a•¢´–º¶fÙ¯æîAx Õ$}¢¥îfŸ3˜6] å¦Ú —Å€ÁPärÅÉÉΠ÷ý0®6Ô5½ðwM×ðz<¬]ÿ!T²I Ž#©e]’Z¶§uð!ú?·œ/Æõ`p¬Q õ9uídØ!0Ì‚A„ÐþŽ[ˆ»uó^ f«èż«ê`2¦n{zª¼c5[,š4òÍqÑœvíãɼy¡Õ4tˆZQ8ìÎ*Ã7’W0™ ݉W“kh«c„”åб sâ Œn»‚Ç7¤?ú_´ Q"€ ³N^z¾4\5Qè)ùB/ùd¹t,!,1—Sßü;·ÃÙº1V!À}„owåbNlFL€@”1K Û÷ñÅn;–&ID™¥·UÓô‰5*‰xã*vn;гuŸÜT—á²ç;1™ÌäÛóèèþ Æ6[BU×ü—¯³ŽŽªj¨^‡«ü}ößI^±€ú‰Ô UÈúë[V/ü¥åtŽ”ÞÖ¹4'ÙN0YP„I¯ûÆ1pMWÞTŸEFlVWV6.9v¨Ùd§°ó§0‚T;™Ç~çËVòy^]†hˆ5ÔÌ}#±lÞÃ{×/`ÉÑxFÏêDh1W,ÿÀv¶~gÇj?̶÷²æäeŒŸÓN.Àªú$$¼+÷®ËoMfŠ>š­c±ØÓø?W>°³zó|IEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_import.png0000644000175000017500000021041312235000130023634 0ustar00murraycmurrayc00000000000000‰PNG  IHDRíñÌ]ÚsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝw`TUÞÆñï¹3“Lz(¡„’Ð;(‚XÖÆÚV_˺bY»"–µ÷Ž e­k+ àŠ«Ø{ï‚ÒADBï-½Ì̽çýc’0 i JÄ糋!3÷žó;w&Cž9÷ž‘߆©çöú¾ŠˆˆˆˆˆˆÈޱõ}õ×°“™Žõ©éyíßɾ6ø9Ý×s]< §Ú};VŸu]¼Zù¯o{g>Ç~ûãSûãµíkl]}5äµ.†çâZêùw¿–çÿv¿>×ösVµf§²f‹uüŽ©üÆñqê)''ýÇÏ^µ¯ ¦ÐÀ_ÿúW…N‘ßÀ»ï¾ $Ò=À­öÕ£¶™v¿ß¯Ð.""""""òÛI Ò#1_MùW ˜gÚ­µ8Ž£Ð.""""""òÛ  è> ÌÖóð+O™¯u¦Ýçó)´‹ˆˆü¹%äÒÒƒ¿Íʳ۴oqÃN`'¯= ""Òø% ëÕ»Wþ}Í3í€fÚEDDþÜŸrϵO³zÈuŒ>³Áµ¯såEãù¹ûUL¾c0i;yA¥Èêת´Ÿ´á}n»f,³Ú\Åó£“úÛ¬`%""ÒX%e¯Ø}DO—¯q!:Í´‹ˆÈŽ)ø†«N͜䃹ïé éðkWãÝ1‘Uoq×]/‘Óár½¼/IÕƒ`EžWe­rÿ›xñÖ½HùÝ‚c„3§ò䤙ñójò"A2ºôçˆ3.à}ÙðÝ‹<>ñ~X–K$¡ûãÜ bý#x`®G÷Kžâ¾C3ð€0K^¸„‘/®"ýˆÑ^ì<®%¼á+»w<_-ZMnÈܶ?î•ÀÂϾcQ~v{Ç¥ÿ:–ž©Þ¦¯yôžçøbÑZò#)­{ràÉ#8ë€ö$8–²µß2á?ãywöjÂMº²ÿ?F0â°N$Ìbâ#ãùhî2ÖFdÆm# ÖBé×7sÜQÚœÂØGN$;ÎT­3mo.¼åbz'”ßn äÎàÙjíÝýàùtÍÿ¾Æþ¶|Ë£ c•OqÍ›ÎãOL£0’̾—ŽæªCÚ‘àXJ7­¥¬I2Å_ÿÈbÏÃßÿ:ÆÝ¾iŽ%T&.Ùý‡ÑË™Ïìù03÷/ÔÄÁ]ý5Ÿ¬òðšíǰìx°ÞÖ‡£Žñz+_⪠_`yÏk˜r׫=†žçQ¶úkž{tïÎ^ƒmÞ“¿žy gíÛ‚-áÚq¿}Î(®?´5‡—Ð&ß2ŠIs7²q4í²§ýë<ËNÀ«Þ¾-ÿ~Þ8ã˜{(ŒkI¿ÃÏáÊÓ‘¶äIξò- ö¾•®ëÅÆÿÅ“WÑëšç¹»û<¿¯ÇÝÝÌ÷àÑ7g³¶ÔÔî/\u×Å nRõúð†éL~b"ïü¸„Í^}OÅÿ—¬ç¬ºïÃÉ}>-hÆq÷?ÊÙãØøîUœñø"ÚŸñÛv뱩[çBŽ25´^XGÿ c æŸÕ²Uß3§ÈÃfŸÈ9·'Ññp=K\“–ÄPË.´d6«g<Êm¯å¸ÃbPv*^8iý8¼·Ÿ9³æóî¬\Ø7‰Õ_ÂrÏÒâÀƒÈŽk½ãq]\Œ±¸6f?ë)œÏ37ÞËÔµA:ö`¯Ž¾›&íï ç¼¹¬)Ì¥pÁf"·Øzj»õ“ŸN—=;’¿€ï~Àƒv ïè#Èðª¶ïV|ïùhÙ53/‡/ßýmç–ö.®ëâZ0x¸n$ú=Š~Ü#óÆsßË3ÉMïÍ_†¤SZÚ’æ Öuñ*j)ù™g®Å+k\Û÷¤O¢K³6Mˆ,xvÛ}“š’µ_¼y‹˜6g3gtˆgþW9D"­Ùo¯–ÄáằoNˆˆˆÔ*@4¬û‰^Ç^%°CÍ3í€fÚEDdT |ëzXk±]Oå¶;;ðáeç36'ƒ£®Íð’'9ýš÷X5ke'¶%ΫØön¾s0vúýœuÛg|ôê|Nñ>åÝu.Á}näÙëö&¸ðiλê5>mçŽ(߯çÜvÇR0„ @°ç?¸âª~$:N4ôEÊ뫬3ŸÅsg•œJF²m{¥3ï©¿ÿŒÑW™-¥ëW ĵlGºÏ%©v½yöñÜta><ósß~ŽyåÐs¸ñ¿Ò11•~‡õ%~öÌyw6¹³ùâã•x6“CjO.‘Øí:Ç[u;¯Ú~E?¿Åûë\R¾‚ÛÎë;óAοç;>ú¡€£OÅ]óh±g/—p¤|€N+ޏîŽò;¸EóylÄ ¼½b>ë#GÐÌ«¥¿>çs÷=ûà›u?§Ýø)³>ø‰Â3©ò&PÕ]~܉„ˆX‹¿yg†þß ÍNÁï‹®X_ÑdñüWx{­K`¯+wËd8‡’e5ì ¡=ö£¿°øË¹lþKŸýÁ¶Ú}ZðÜpÕ“NDDD~Í´‹ˆÈÎãz1ߨ˜hp|Id¶ˆƒœÅƒ“Þ–¦rK (ÃâÝf7Zò9¿l\ÁÚUë(²zf‘b\¼ia ë6­"ß51ûE‡‚½“~ä³¹ïðÝ‚^|¸ÒÃv<œCÛÆá…K«> /@µÐN„‚U«)ÜFqÚ'¦|vܲee>$u¤gÿÖø}aÊÊÜÊúmÁ|^zt,¯ü°†R[>ëï/!‚ÁzµõçàÁ—Ñ•V|Æ/ùë)*Ÿ­¶®}ã¡Ê® n¥u=3÷û…G¿˜Ê]—¼NË!gqÃ…‡’àTÖ‘¿z¥@»~]I7‘Êñø:ײo“=Ø¿ä,ú„ïg5af‰¥ÅCÈ ¸DÊbfðEDD~%Í´‹ˆÈÎãÙ*3£ÖÚ*3ïÆ8Ä,9=ç«|Ï«ºmɪŸX‡Å&·¤E» âÉaÝü呎]¾€µÖbÓ3Ió¯ÙÚ¿^ƒ/žPºe3ÅžGrµUÓ·ÖiðpIYô3U€H¤jž ÍšÇâõ_÷·ÖáoÙ›Žþ/˜ó_žûª/çlNœ¯4|“Jº¯ˆM%Aš¥i;àoœ}ü·|ûTkrò1N lBWšÎçïÍcÜË(v ½ÿ¶­ýaÂ%^Õиãµáž!Ø4 àïs לص|%~‡`F‚¡õü8sM{v£U|EްòÝqLž¶Š–‡_Ĉ½}|õÈü·¥²”˜ö-*»GᲬÇbšµ¡Ij˜`ÓºäEºVyCa»ž[¾Ö|Ñ =qÿ{ä^þúYžÝo(7÷)dþüM4ëÙ”òq®ÿi9…¡&ÄWôå¯eß >´3Ï=3‡§žôQ䵿ÿnOœ¦ÄSd‘G3í""²ó¸±³¡76¼Ø˜EÇ{ͯõð*fƒç=ÅÍ7¿ÌÚY‹È÷|ôÖ‹ÖÝS9¨Ù÷¼ýõüsDKüÖQè%0äØ=iâ_]õi׍u ]¼a킱Üx˧¤Æ÷àŸ#";hj©3zÝ4€;E]Þ^ ËaØlïÔÛ}cŒ™MÄiG¿ÁÕÿ[Á‡÷]ÈÇ MÉH ³ysÎ~€Zü—Ëîùš¶¤Yb˜uË×áy>:ömEÐ%!?=„6ïOaå†2lÂNÒBÅ„Ýj¡q;ÆK°9MŒaÕÂqÜ=%“«Æþ©3øhÎóŒYבNqå§ò÷[.¤ìɸñÃ\Rº'Îé\¾øš‹[~6.œÅô@<Ë +çà1 UÛ¿²_yÿ?ObÔM/±böbò½:¶M›'Ð#ݰrés\Ó¤­]W9;í^Ïq/øñQn™’GFËŠ6‡°Ö‹'ÜÄMåõ?~Ò¡ M™É§_ÝÉ9+»“•Âëz—õø{þW}ßxâ¡ùÀÃÙcâ/ÌØÁt;†amü„˪å ""ò+)´‹ˆÈÎSÃéñ[ãSÌjæX<[-WlkKX:k= úýßù\spKL$ž“¯‰óÜË|Œ1¡8¿€/‰Ôä8¼’| Ë*«ÂZñ‰‰ã*>VÍ`½2Š Kˆx±íç“WâLJ .fœ‘Ò"ŠËÜèið¾x’ƒ|&ú›‹ç*. (×°ãžWŠçO 91ŸSÞC¤„ÂÂR¼@rLý.ÖÄ‘Oœß‡c 6TH~ÈORBµ}‹BxåÇß—”FjЇ[”GAH‘]DDæý÷ßgøðáÇ%@qùŸ¢˜¿—¥µÎ´‹ˆˆl?ƒã¸ååRTñ=! sCÑ»ƒ-É'·¤âÛ…yÑ‹·Î”:8¶”‚¼j‹ÇaÀF(+* ¬zŸ±}TÞlÀ-¥¨ ´u6 ½†ö_ÇkdÀ†K)×Tg%Ee”Ô¾7Æ1DŠòÈ«c›í¯1xá óJ*·ÁF(+.ÜfìDŠÉÏ-Þ¦McÆ[3³bK) dtÌaû6eɧñ}N.¾fx̹\rl/Ò}&ºÏýòæœ%¬Ú\‚k’hѱýýLNÙ· 'û{ùÌëYžzý;æ¯*%¹]7ö?þÎ>¸#I>á5|4áY^ÿfKÖo¡8 íàŽ»MÞ«™pÁñ™ôÏ|³‰œ—ÇðÌÀG¸¨o ¾Hk§–þÃ?3é±ùº,…¢¾{qiÏŒ­oœåÇxöRÖl."dãHËìÊÃ/àœ³Ht"lšö<ó6ß/Ë%äiÚñ/üëÖìÓÔ_ï™""""""òÛÙu×´‡7ðãWóX²±ˆ°u0n!kúˆñOOáó_6Qæ¹®_ħOßÎÃÓ pmù>ßÌgé†BBÖ‡/’ÏšEß2éþ­U„,`Kù鹫¹ôñ÷™¹| en ›–ÎbêÿâÊW–Sjð*>yãkæ®ØHA™ƒß¸FÒIñ*Rj %•ôô4Z6O¬ñ oË4&¼ÏBÖi7rÅ1{Ñ©eS2;âä«n䏨u¼óòò=Û°ÚcÔÔ¿g-Ö³XlÇY~Œ×çSâùðÙ6¯˜ÍÔ170vnžoË—Ü{Ç$¾X²‰’Ħd¤òÖŒÓr""""""»Ú.MfÖZ #ïÄ›¯d¿ÏÒå¢gxûÕ±œ—m0^Ó?Ë¡ÄÚjû¼À›o¼Àè£Zal³ÆOb^±‡»ñsžxe7Ž~g楩/3îìnøðXøüxfxØòv,i9fo¼þïüçïdU^€Þš“î~Š'N`­‡Òªú,;^¿UžÅ’ÁàA™ÍûÆ`³Ù·o2Æ@ÙÊ_ئ²ÏºjßšÛëïßÛÔðqVöùêcœe0Þ&¾ø8‡Rk‰lYƪ‡g;1bÌãLœð"oN¼Œ=’Ͳ‹ˆˆˆˆˆìbb:Õ8ô® hè•x˜`}z¤Â DjØÇhÊžÇI¶q°¿0s„²µ³YâZlüüãð^4OH¢Ó!GÒÍ(]œõ¡*+¯ÇÁçø 1!Õ`|>|>¾z/7³í65ÝV_íUÚ¬§ÿ²5;0ÎøÖôëž rWç­2¤•Áø Îâ¢Ñ“ørµ[ϘEDDDDDä÷Ð(B;¾Ò¢§§[×üÓƒ@t»Ú°ó‚ \\×»‚[ep® ÐlaÚ˜òb‰D,¶ŽEóÍ;Ó ëù~úZ±w–.ç›9X Öh ÆYëêµoOÿ±‰¼áãô‘Ð4!ºE$‚gÁ$ôàüîãÒcúÓÚ_ÀÏŸO掑W1þç’Æ½h ˆˆˆˆˆÈŸ@ã í±*Âb­ùÚ Y ̪o?!ÇZl\k:¤ˆÏìM–c0e³˜òÞ¶„JYúÑ[ül-6.‹µ/®fâÒI¬cî’B<À‹Dj\IÞi6ˆì“„1°dü<ðæl–oÊcòxiÌLYëaIçàcû’Ve¶¼öÚ·§ÿøÖ;6ÎmN’ït⨷óÜäÑœÐÊ`½>ý~]Õ7"DDDDDDäw·ëVÿUòùàú“ø2e¥.®gÉ8ìDöL5øÌþœû·—¸tê~|újN|Æ`môcÔ:œx{¥:˜ÒZš f³_Ï8¾šQÊìûÏàè±q¸‰‡pÿØôL¨v·Ó”}/¼œa GñÞú•¼ÿØu|ø¸k£ýYÈ<ò ÎÛ3µÚç©×^»¡Žþ«•ê4ÿãŒQ¶øyF^ù6ù)ÍižXÆšµ–™Ù©Ô'‡ˆˆˆˆˆÈn£qδ7@bÓ$"ÅHÎdÏã®ç³z‘ä0‰ô>{ ÿ>ë/tk‘€u!¹ew†]0†ŸÔ‰„º®QwšrÀå×2|¯v¤ù]J Â$¤µ\âík²7WŽ}œ[NÞ^mÒ ¸.^|:m{îÇé7ãÉ‘hâß¶¿ZkßžþÍ8c¸6‘v-oYÇŠ•¹ø›tâ€ÓoáÊÁMhèÇË‹ˆˆˆˆˆÈo£¦X˜4iRhذau.¦¶},žçE¯Ñv|åaÐâ¹ÑÎãÃ1`½òk×Ë·©˜9Æ8ÑÙŠ§sÃð[ø¦4…#Æ<Å¿z$à˜èBpNµj­WþñhDWt7'æšïê}W­Õ–¯ºÝ×qê^IÝZ/º}åiýÇ8UOEopíµõ_sÍÛ;ÎmŽ©µxÖ‹¹~Þ`œØ6DDDDDDdg{ÿý÷>|øñ@ P\þ§(æï%@éït´Áq|ÛÞæ«z›q|ÄÞbŒƒ¯ún•Û:ø|ÕwÕ}M-ûÖÔwÕZ·/°šê½¾í묽¶þk®y{ǹÍ15§öDDDDDDdªñôx×ÕG~‰ˆˆˆˆˆˆìj5δ;N#½Ô=q£^y½–ÓÚ¹?rí""""""²KÔÚwÞµì;[]§µ7väÚEDDDDDdWh¤Sê"""""""¢Ð.""""""ÒH)´‹ˆˆˆˆˆˆ4R í"""""""”B»ˆˆˆˆˆˆH#¥Ð.""""""ÒH)´‹ÈV^.³_ÏsŸ­!dkÙ&²ÏÆÝÍè7WPVÛ6¿'7—yŸ¾ÁóÏ>ÏG«BX¯å³¾â×ÞàÛõaC™""""";B¡]dGx%¬™;ï—â6æ6·W$—鯽ÌÛóòpm-Q×ËcÞ_1su)^mÛüžÊ~áÅÇñìßbV®‹µ@éOö&|³˜Õ› Å¥Ò¶Û>üýœ38¬sÌ,¶—Çœ×Æ1öµïY¸Þ’ÑeÇž{>ÇõJ‹nãnỉ2þ³y,]W@ˆ$ú_òwîMÖËÇàˆ ÑÆú^7‰1û¦âÔ–ˆ+ÆñÝÖm."d’hÑu'Á‘“ð•oVc›¶ž:+˜-ºô%€R¾ˆ‡¥­è±gz aÕ·qÚ„¬)v ¤¶¥ÿ‘çpÙð4÷om(¹ü¬%ü²Þ%=«‡~!§íA\mc oaÆ«cûÚ4ç:dtÛ—“GžÃá’p ~àþ+ÇðÓ€xàÜ^$×z€ja ™õämÜûáϬ+t!>ö=ä”§p`û„z®ñÉãÓ{Ïå£ yx©mésÈ©\~ÚPZǼܹìÔ™ïµä´ÇþÃiÙ–9œÅ•æ7äv&_¿')îr^yð1Þš¹˜[JñH £ë`Û·)K>ýˆïsrñ5ëÄÀcÎå’c{‘î‹ãMÓ^âágÞfÚ²\BN¦ÿ¿nÁ>Më8ÃADDDD¤ íÒø¹Eä̘Ëú6'sÕe݈ß<‡—Ÿx™GfµâÀSNáªáIlþöò.šöËÈnA·_¦ÏbM듸tDgŠW2íÍÉa¿^ÆkXWâ'9%ŽâÜÍ,ýñîº=žöÿ9•Îõì^¸v3qmYÆ/ßÍee£yú‚^$X‹ë¹¸nÌ¥ž‡ëº¸^ùéá üøÕ<–”¸X'€ß+díO1~!`-ðÖ/âÓ§o‡vOqàTLî—Ü{Ç$¦—¹xÉ´Š/aóÚB‚qZBDDDDD¶ŸB»ü1XKbÖž îß éCëõ_qΔvzô0&;˜¾Af}qÓg¬#Ü-‹øÊ}°ïàî$8{³Ï®8ç_Ï çräõH.šÉsS–Ñ⸸þäÎ$8†¡²)q)“'Îàè›÷&­¼¤Ùw`w Ñð[-+Ø´:µ#΀1 ˜Cµ–Ĭþ Ø HÿÌõüpÅ—|ºô<öèXs›¶à‡úëlHß8$wÜ›Êû¢[3V~~ïÏZGxï´ÊÐÞlèÉœþ·îѾuÁq)¯¾8‹“oLzõ!ÌäÙ©«évÞ“œ÷× ôj¹™oÏ}‰wŸM¿~¸ú™—°8ø¶w–=zDè}ɳ¼sQˆÂ¼| 7|ÁWŽgÑŠï™»e8ÓêÚ7•CîÇÕýâXùÆ œ7î'Ö½7…™§ödp{·ÖiyïS\Üò;®=ë~f…=º\ü æ•K/à©¥Lÿ,‡’ýˆÛ²ŒU!ÏvbĘÑß.ˆDpâͲ‹ˆˆˆÈvSh—?òùcGÓ¬&˜P.¹¡h°5Áf´K‡›‹«­hm6ÆàKîÊþ½‚¼ñËB6†¿aKÊRè=° AljÎJÛ2¨w/Îû‰õ¡½IubÚaÛ`nŒ)ÿ³#ã0Ä·ìD†yuù*.|¯Þf¸!ui` ³~ÚÆNú€é9(qñ•zòK«®Xoœ­uÄ·eP$^üiÃI«6aÞ¸å¥V?|6G=Ò`Ù 7’ZdH«—øßêÆ]pŸìwÿ~<ûwØñC """"^ íò‡äócm èÖOœ<·îEßüàâZ*Crõ´ æ±Ô,ºÙ¯[*Ïøâ à.o§Î6묳‘}åëÜrû$ 8‡«ÏíI3oo޾Ÿ/êÙÏs=À‡cjèÉ‹àdÐ%wrn÷`̆„æiøåôrñìqŒzqy¶ýçÑôM\Æ+cß Ç­ïª>†a Ç1'PþXÌæ"kP¨/ô„èA°®ø ¦°®‹gÁ$ôàüî£Ý¤I¼ôÎüüùdîøâ[Nyh gtI¨û ‘jt‘¥üy„×0í§"™h€@‹®´+`ÞkUåð*¦Í+ ж+q¦ö(ì‹'%ŠsKjÿ<óíUK›Œ_Qg5e«f’ãvàøSdHÏ.tëÑ“©uïcKrøj~1ñí;Ó<½ÍT†Vð7ëD›@K—B«¬l:dgÓ1;›ŽÙY´Nþµï ºä-[F¡µ5ŒSŽ;ŒÃBV0fÄÆO¼ ˜5kKjþ¨;/—Ùo¼Í2ëAr'z4õcâšÐ* —9ó6ÞÞÒjyÓ‡p!ùN'Žq;ÏMÍ ­ ÖËáÓï×m""""ò§§™vÙ­mþj2ÛDïæaô<“W5ã˜Ëö Í1˜”þœy\;.øïÜü'‡u€œ'0yu[N¾v©uóîÏ w§8^ùxÿëqí& Zái;öùêu¶ù+ê¬&®ewZ3™©/¼NÊA½h›°UEÛnW´|&ßýPBBÉ*¦¿1‘©³9ý¶¾Ñ•ß}É´J…3>cÚŠ6 m?ˆ3ŽjÅ¿¦ŽâfçdŽÚ£Á²¬ÊÏbØáÝI)úñW¬ï£Içn¤‘Ãæ¥OsÁùŸÒ¡I)¿{[gÙý-é™ Ÿ- ó㘑ŒJz’›ûTÜ™Ç[מÆÇ^¥®‹gýô:m8½“ 8lŸt>xo3KŸ½€¿½„âb¼_ùLÙâçyåÛä§4§ybkÖzXdf§êWDDDD¶›~‡”Ýš_ÈSæ¥ ií{ó÷›.äôž«¼ÇÓùÔ»“8ޱ¯?ÆM-Í;íÅÙ÷œÇ ]‚uŸÆì¤3øüK8êÞg˜4úVÊZ0ðäîÐcëbnÛ_lmmfíxÕÄeÇÍoäÁIÏs÷G!,HnA϶åƒçK¢Ã=höÍ7Ff×!\üÀÑ¡üãÕ|-8ðìøüþ7÷ƾ Ùƒžgá¾ôq<ýÞ Ü357˜NÇ!g1ô¯ÝIÁâE\\wÇÒp°ÇYÜyA„ÿ¼ô9ó×þ¼µŸNÛÎ}éìÃZqÄå—°ì¡ ¼·ÐOó´&М~;³löVåSLfÙ{ð—ÎâôƒÚoé{þí\áŒeò× Y™[Œ $ѤE;öèÓŒÀö-TPɵ‰´k‘ÀÌÕëX±‚M;1ôogrÑà&;þ†ŽˆˆˆˆüiÕô+d`Ò¤I¡aÆ5l5l‘߀õ\¼ÊÕÆ+‹Y}Üz¸8¾­+rWÙ'´”gοwÜÇs#º¬XõÝ8Û„\k=¬W~-¼18ƉYX®†¾©v_ÅrŽƒSíg¦Þq`£×‹;¾òºjo³î:ë8ŽÖT=N±íD{Á8fk?žWu1¿šúªX Îl‹µÖÚ­µ›èµãc‚Šï·ß¶5—×åTŒkëq3åDz¦qlûø[¬gëØ.úøXbÛ^»ŽãÃg¢µyž…Šca-žõb–&¨z|EDDDDÞÿ}†~Þ&ÞºâLZèQ}nµÍ)2îä,âwAF¶6æ$L$£U&™Íq´jñon{B»·ùSn8çaf¶?“§î=Š6qÛñø”.fâ¨;YtÜÃ<Ú>‘~/ÆËã‹{®`ô׉XÀ—DóÌL:îq0'žx0½šhPÓ;«žßºM‘]Ä`t錈ˆìöÚ¥²X×Ãms·\ÐäÊTáØºÆ2™yÍhŽ0ŽBÏï á¡=̲w¦0#‡]ø?^ùù FöÜŽ`j-Öó°ž­ú&Ív&ýF™ÿÇuçõ#±d3kV.æ»wžàÊ7^ç¨Ûïæü=Së¿ÌbgÕó[·)²‹X¬fÚEDd·§Ð.Wj6½ûö£‰/&Ùƒq7ðécÿfüwKX·¹ˆI¢E×Aœ4rGvNÂg¯€ùo<ÉØ×¿gÁšB|i]ù¿›îà܉869¯cìkß³p½%£Ë Ž=÷|Žë•FeW¡ |3ù1žyKr}´ìœ ¹§¢ŽÐRžy ï ¸—çÎïFÐnl@M…,|çiÆNýŽy«ò±Á4Z´éÆáÿºšá-æñà•cX0à8·WÌ í¶hSÞ\G÷³¯gŸOFñÂ`øMCiZ‘ŽKæñï³oaѱòð m‰3Yó:ÿñ2Y£žàÊÎÑ>–O¸˜c&F÷é}Íxîš‚có™÷ÆÓ<õú4®‡Œ.{qÌÙçpLÏT|Õ.k£R²éÓ·é>ÀÇÊë7]Å“÷>NïG.g¿æ~Lx 3§>ÅÓoüÀâ\]÷ᤠÎ`XÇ$|¶Žz"uìWþ|[ðæÓ<ýÆt~Z[„“Ö…£o¸…³²ëhSO;ù­Y³š¯¿ú’=÷@‡Ž·ù¼õ%99üøãt† Ù‡Ì6m·ÙßÃÓ5í""²ÛSh—ÆÍ˜m~‰Ã-"gÆ\Ögçò‹»P°œ/¦Làá›ý´}êböLrYúÒõ\:a ýÿ~:7öjyy¤¶ŠÃ˜‹']Ç/2hø¹ÜÒÑ!çà Œ½úzJ¹ŸS;Æc(aÎÓWsóƒO:S;űiþG¼°cʰ®‹ë•Oò4¨¦ë¸xÂúw*×õi³î }ü3fmqR†%  k±µš4,´{l™ö*_yƒ¸ö€^tÍÈäÑSùlÝ ŽÉ,?ÝZ\ÏÅ‹™e¶ž‡ëV½-ãÈ«¸î–ÄCB« eä¼x×L.d¯œÅ  K>šÄS×ÞLɃ÷0¼c|ÕÓÝ+g°cg² N|{?÷¦^þ/³‘!G¦³ôÅ›¹áõŽ:ë ÎiYÌÿË#·Z?v}ýµÕSÊ¢ºöKñX6åf®z~ {*×ôlyy¤´TÖ¶m›e,¿7c ÅÅÅ|õÕXk«÷%99|ýõ—xž‡qœš_ ši‘ÝžB»4^óîãÄ¿Ùú}ÂPFO¸†þÀZ³ú3t`w‚f ý3×óÃ_òéÒóè×~.Ïþw Çþ››ÿÙ…„ŠéCc à{ž›²ŒÇ=Àõ'w&Á1 MÙˆK™g÷bpûŒZÚLAWoHcÑÐSÞmùÿDDDvg5Í«&Mš6lØvŸ–,²³D¯E®éƒã3XÏ«¶ÒºÅs=p|•×÷V^³k£ûÇ©zŸWþ«ž185,4WuÊOÕ¯h#ºè×Öª_KMž‡WÞ`xÉDξø3öèqÎíÖͲWñÁ'°ï} Gµnc=¯Ö•÷ðÜ0`§üÑV~ü[Ï›òýLùó¡¶—ÉØÇºr= ÆÙödÞh»líÓ˜˜çA}õÔ¶_ ÷;±ÏßšÛù#qÊ/Y¸h!ýûõ×ï-""ò‡òþûï3|øðã‰~¾OqùŸ¢˜¿—¥ši—FÉ8¾:g´Í6+­_ÕÛê TÆ8˜z¦ÌëÚÛÕÞkZý=¶¦0Ë?~“&“¶Í!o Ÿ½8•µ™Gs@Û¸ò¨ÕãkSïBtÆÁ¡öÙ9ã8T]%Ý”ó*°õý™ØµêÚ¯Ž•×Á©é Tãâof›OˆKÝõԾ߶÷oÝ·ö6Eþ8#""òG§Ð.ò;1޳c‹Ø Ðð…©DäÏÃb£ WÇGBŠˆˆüÑ)´‹H£Wqê«‚»ˆTa¢¯~¿~‘Ý—þ•‘F-5%•›7Ò¬I³]]Šˆ4B9Ksh›ÙV+Ç‹ˆÈnK¡]Dµ=ûíÉì¹³Yœ³X¿”‹HÖZºtêBfëÌ]]ŠˆˆÈoF¡]Dµ¸@ö°«Ë‘FJo扈ÈîN¡]D=ýR.""""Vή.@DDDDDDDj¦Ð.""""""ÒH)´‹ˆˆˆˆˆˆ4R í"""""""”B»ˆˆˆˆˆˆH#¥Ð.""""""ÒH)´‹ˆˆˆˆˆˆ4R í"""""""”B»ˆˆˆˆˆˆH#¥Ð.""""""ÒH)´‹ˆ4‘ |6înF¿¹‚2»«‹ùüÇ,"""²ü»º‘†Xºr1³æO'µ§;¿?À!ûIrRÊÎë<”óWÝÄW½oäá³»“è˜íoÃ+aõü¹¬LîÁ€ìd|5n“Ǽ/¾bæ~'àY á%¿¾ßßZmãª~Ì(­y»êc6pŒ""""»B»ˆü!Ì^ðƒöJjJP{°[¾j ó~žÉ =öÅ44z›xëŠ3yh¡‡Wí®®—<ÇÃÉh•IfóDœ •e‹™0êv~>î1žÈJÆW[3Ön}KÂì„~kµ«zí¥uŒ?vÌ""""R…B»ˆü!ü~š6i^ooÙ¼›¶¬ßÎÖ-ÖõpÛœÀ-ô#¹rFÛGrV*¾¸8޼f4G‡_3Ùm=»=é4¹Súý­Õ8®jßîñ‹ˆˆˆˆB»ˆü1qüúgÏ $w¬“Ôlz÷íG“Øi`c0¡¥<;òÞp/Ïß Í廉2þ³y,]W@ˆ$ú_òwKgÕOòÀ Ÿ2c6¾C냛Ë$®¼¹åãGpÄ„hû}¯›Ä˜}Skä¡¥ÄÂø«Û¡d»²<…v:3ú|ÅÓ7žÏŸ‡À˜Ljα¸+̶7¥{–ŲtËŽÚ²#ñfé9~|™ðw‘ŸMâØÇK7ulÛ&,³›ˆrÏùô‘±ð f¤~Ä«3)´"pÙxrŠ‘u(K…Õ±\µmçËÚ2ˆˆˆˆ4~ ÚEä€àñxê8=ÞÇã®iùêE&Ò¥[J¹{Úw3¸IfÌÏ3è§4Þœ;—{/›Ë¼ ÷1íŒNDPú4³}¼›q…â!€ÏqÀöaÆ Kîæ¼”°rue‹©pûֿíw¤’7b2×œ×æö:æO{ˆ/ëR–]æô×µ\uÚÎö×¹ """"Á@A»ˆ<î\–«ö Ýrár{öü¾çÒ‘à=ÞÝIÒ sé€1âÉ©\óö»¬ø÷eôv‡Ù…jx¹1àv}ð\ÝÍûM_ IDAT¸›w"ÑSÌÚµpT2VõÓÙ‹7,fu =L8Ž! nL š¥MØ´×T–ˆrÇuÕ­\5mW¾Ìîæë\‘`  ]DOHíÆXxÜnöl¨}ïøÒ¿eþ6Iíã÷mfÑÚ<ìˆæDZÜñôìÂ[Ÿ¤òf·ãéàl!·åŽè³sEtW M kÑç,\—ȰV»7*oÅâœã¸tÞÜbãø> „g±!§£ŽI¡I¹¥×CZ¦ÐŠW™7û¢Gö Mx&òëX–òª+WG§nÛuÙ¥ÌIu/ƒˆˆˆH0PÐ."ÛMaQá‘5nWT\„ÛªŸ®Í¿m%_̙ǯ[Šqœ0⺠çÂkÇÐ!Ô`L,ƒÿs Çß÷<©Ón£8¼Ç¥0¢[LÉ"o®>é¾xh>ϼ;œ“ÃÙ½°=œîç>Àý±Ï0sÁlþ;/‡@X,†œË°£RhâÚ¹eH»ÑÜrq¤¾Â½{qOT º·‰Âej)Kù$­jÊÕ±âªñÕn×­mÅ2OíVç2ˆˆˆˆƒª†,<©©©ÞQ£FíÕQ‘}© (Ÿœ¼mØvÍSÇ1Ä5MØíä;€…«Êg°•,„æìx×ÿ/Û¬ìõ™Á2V¹™à¥ï—n`,«ò#ÏÊŽa,\uH×ÁØ`¹v<>ÎqlÇÙ™Ž±°ª(—ãØ8¶S.¸6Ë”ä©Ö²TQ?ʵkÞk(…2›Ý*ƒˆˆˆÈ*--±cÇŽ ‚Ò¿ürÿ.Š4Ò."„ˆ°H"Âje߯rQý ®Á²\5üÙËËUÓPp5ûÕpŒÚÓ­œ¦©6¸Þ5) S]vj-Ë.y¨¢\U济õV×2ˆˆˆˆ4vzrŽˆˆˆˆˆˆH¥ ]DDDDDD¤RÐ.""""""Ò@)hi ´‹ˆˆˆˆˆˆ4P ÚEDDDDDD(í""""""" ”‚v‘JA»ˆˆˆˆˆˆH¥ ]DDDDDD¤RÐ.""""""Ò@)hi ´‹ˆˆˆˆˆˆ4P ÚEDDDDDD(í""""""" ”‚v‘JA»ˆˆˆˆˆˆH¥ ]DDDDDD¤r×w¤œ@6K¿ü‚Ekrh5ê4F&†`ªØÌÎ]ËâEËY““ÀaG÷¦¹»ª­DDDDDDä@§‘ö]ØÅÛÙ¸jéEö^ÇÉ_ÊóWŸÉ‰çܯܵE8uÙ©øOæ<ò,/¼öK²8Õì”ÿë3\7íq¦Ï]ÄV?u;¶ˆˆˆˆˆˆpöÏH»w-/L½„Ô6­Ç?É3ãÚÚ‡íìO¹rÂCühÉYO=əɡUŽtÊT)h¶zsË}ñåÒ­ä¶ðŪNn†«e¶Çqpj ÅÛv°( Ù`eŠˆˆˆˆˆÈ^ÛoÓã@€@À. 4(ÇÆg—ÄuÙ¼´L»ÉD„Òúh®¾ÌÏ—[Ú1jH,–âjÙMõwO»ï/Þzd:ï-^źmEØ„ße0GoÆšÏ>æ‡ÕÙ¸šwdàIçqÉÉ=ˆu™’}z’ù¿®aÃÖB&’z0òÔ‰ŒÞ–ð²Éþv¿¿÷Ͻó=¿o("ªmW3™Iÿê@¤Ë€o¿üï|»Œ5Û(ðCxÒ±ÜuSçÒ¹æyù‚1¼b€äɼøèI´ñTu'Vš=`°Šæ–ésø¦8šü^¸¬{8ÆÎæ·ù/ðÌÛß²l³&­»1rÜùL<,™ˆnTp ÿ"mæS¼úåï¬Ï %®Y1 W?ülYø:?ÿ>?ü•× £Y‡Ã¸ô¶) mæÖ8¼ˆˆˆˆˆÈªƒöL~þz)k 8–·ÇæåóÒ€ã`;c%ŸÍ¼Ú>ǃšàòeòó·¿³¶0€c…ÈaÓÊïH½÷g–N}’iÇ'BË_¼†Ëæ®Ã_: ^¼v ó¾”eÛŸäáSÚæÛÀ§ï~Ão…l<„º}äùc‰v›3Í=ÑMˆvBã"j­$c¹p¹\•¦¿ÛŽƒc—Mu/bÅ+×rÅkëð áQn¶®_Ì›÷_˶ð§¸np³ªÓ±³ùòÁ«yàë<ü¶ƒ+Ô!=Ó_agëWÜwW*?°£âI-dëæ<ÂB´dˆˆˆˆˆÈ¬^£:Çq€Ž»/•ù³®¢Û€íÐù¢çyÿ38?Ù`ì\~ü|5…¥«²íÜg6óßÍ´ã0N1K^JeiM ë ž~kþ@½ÏÆëóæò̤®¸°ùã•—X”[È—Ü7Ãq¤òî;ïòÁ§ÒnÇPy+θ÷9æÌz™—o;’„FÙÖ¿2•ãŽ;ž#Ž-ù;ëåÕí²Šœ½õkžzc=þ@Î|dó^ŸÃËS»á"—O^[ȶ@Õ÷ øÓ?eö7ùì&üëÆ—xï­·xãêî¸ÊÍ·÷gÿůítdÊO1ëå9ÌŸu9}¢,²‹ˆˆˆˆˆÀÄP¬±,<±]èߪd Û[hcÂâ9¨[ ÈËÌÅ_Å>.O3úž|ÉÆÂÉý“ß·ú)Þü kNhN?¦qá‘t<â8ºEkø5Ã[átcY¸,7aažr®Á¸JGÏër3ºcJÿ\„¸+ËÞKXppXǬ+ÆrÌ §2ñ©eøm'cYþª—žóf¬`£ãà„÷ä¨~q„¸=„†{*lãn5! Ãjž¹à\.š–ÊWµç[DDDDDD´†óœvW8±á%ÓÓ€ ¸ ‹ J|«n;—' C€@À¡ü rƘ²”¾â€S}nŒ)½Šáà÷;8N¹]k°ë=íÆ²° ³*lcû‹K/<4cð1#H 3;{WôA4uL«ßJ·óûñU³:ž ïÆ¾Ÿ¶©©¼þÁϬøâUîúò;Æ?úçt×"x""""""¨1Ò^IY€^m°éàõ:€ ß}ÊjÇÁ iEûX¡­{ÒÎ2˜â%¼±`Û¼E¬ýø=V8NH;ºÅW¿0› ‰%ÖÎokò°Ûï¯u%ù÷´—þYUDú¡-ºÑƒ!‚–Ã7qS&ŸË¤1ÇpÒIié1`Ü„º Ø´¹iÙÖÆ`|‹yããµV•_9VGŽŸr/¾:S ޽šÏ~HÇWKÞEDDDDD¤áj8#í»%‡n8ƒ¯Â ¸(@Àvˆ?ú4ú61¸Ì¡œwÂë\6o?ϼ†Óž78¥Ï5oÚ™ hbaŠª9lX2‡táëEEüòÐ9œ8#„@Ä<4c ÝÃ÷îþpW«qÞÑoríYüòâÕœú’Àg‡0ôö—¹m@ÆÓ’î­áó•>~~`*wF>Ë-ƒF0åØ×¹r~&Kž¹˜_'Ô_PaõxïªW˜zÕûäDÇQ̦Í6Z'79P?`¡¡Ž´×AD³Hü~ˆjMßÑ7ðð¹=ˆ´ ˜zNz€Ï=Œ®-ÂqÕ2…Q<Àƒgt$¼¦¹âV3F\qc´%Æ 0×Gx´Á·/n7ÑôŸúž÷/z&Æà x)òAd‹Ž$¸%£ùî޽âŽMi†›0âb<MïóæÁÉÿ¢{«&XÅù áMÛлGš¸ '‚¶-ÂñmKgÝúlÜM;2âì[¹jpÓJ+Ú‹ˆˆˆˆˆÈ£ªÎ“ššê5jÔÎ{Â÷šƒmÛ8`•=ÍÁ.}$›±\X»ôÞõÒmÊFÈ1VÉ‚p?rãØ[ù¶(šcxŽK»…cSr/ú.Á¸ãØ¥[ʶ)woû®iWÌ«SºJ}ɾ–UÕ({UeÚåý*Òp»dåú·Œ±ÊåaçqkÜråvlÇ®øžeªœ¦/""""""õ/--±cÇŽ ‚Ò¿ürÿ.ŠöÓìiƒe¹*¿æªøš±\”Å ×®»íØÖ*½¼š÷…©fߪҮ˜×º»U•©ö4Œ±jYÜ®êãÖ¸Ÿ1XÕVDDDDDDPìôx‘ÆîÀZ§,¢?w¾õN5ÓÚEDDDDDD—+h¯qZ»ˆˆˆˆˆˆHã¢éñ""""""" ”‚v‘JA»ˆˆˆˆˆˆH¥ ]DDDDDD¤:À¢©>Ÿ—¯¿ýŒììm88õDRÛdúõ9côˆ‘ú¤ ]d7}óý—DGÇ0|èáõ•½æ8àà8@¹ _÷%¿ý¾„žÝ{+p©G ÚEvSnnÃÀ²ïÝ%}zõç·¥‹ë;"""""AOA»Èn2<O£v¹\ú¢„ˆˆˆˆÈBA»Èn2Æ4ú Ý² .—º‘ú¦³r‘ÝdYn·»‘í–FÚEDDDD•‹ì¦ÆÌ®\¹‚9¯§²bÅ¥‹ÑUd0˜FPN‘ÎÊËØÙüòÎK¼øù&¼ó)^ÿ<&Ÿ?s/Óæ¯£¸ס1ö×fåÊ|˜ö>YY™|˜ö~µ»Õˆgˆˆˆˆˆ(ìèc_ògóãÛsyévU0û›S°š÷¹’±cŽçˆcOä´»¿e[ þóU#{;K¿üšÅ‹°@þSä‘ö²€=>¾gŽ?›„„V,øèÃÊ»1zú¿ˆˆˆˆÈ¢áÜÓnoá½+'ò˜w4÷ÿ÷,жØ2üÄÍão'óœ<~b+<ÿT,aÛ4ŒXÓǪ×îá‘/ã8mÊ-ô‹wï@´uQŽCƒ¨ÂPMÁ¬ù.çþËöÎzh~2ÏξˆáåÚt=ذq¦}@|| N:ñdÂÃÂ9é„“yûÝÿ±à£‰ˆŒ¤m›¶;¶WÐ.""""RÿNÐŽƒ°ñ¯zïkÁô›Ž¡m¨ÙñžmØ=,ØÊ¯?¥=ìÆ<ˆ À ªa¨i¤=P˜CÏè[o䨖nŒ+,Ž¡õ°¸,‹””n2ìP å¤N拯>ÇíríØÖh¤]DDDD¤Ah@A{©æ=‰[<[_Iⱉ=ˆªjt¹ð7¦s+F?ÉS§µ%Ä€Ó<¦ž÷íïžÉµ=òùâ©yé»Õ¤o+ÀK8­zŘ!?§}«³¡i{Ÿr—ŸØ…h×Î4¶ÿ4“+Î]ßbÛõæè³/ä̃ã )ÛÄ·Eÿ›ÁŒ·²*Û"¾ëpÆMÌ1#qÙÛø~Ö“¼ôùRÖ¦çâ%’~—<ÊÝG%Tœ`oç×·ŸaÆÛ?ðG†C|çAœ|ÞÝ#—…l+°Ùžv='ý_ÉŽ‰ãŸä™qíØy£ˆµiÏòðìÏø=«'´Cο‹›nMˆñ±þ»¹þåEl*àiÒ†~ÇMæò±ý‰sdòÙôݬŸ@_Ìx˜—¿]ÅÆ-yxCšÐ¦ëPN|GwŠÂU]|WS}•ß'PCÝ95ÕW!‹8—k~;‚ÇgL¤K¨…)XÂ]gßÌú3gðø ­ð›­_Ǹ'B¸væ $/œÉ#UÔ›'÷'ºê–÷¿‘‡Ï«¦íQËH{Á6ò­ftïÝÍ\¥zøà’Њ–-*å?44”#FYéuí"""""õ¯ÁíVâ ÜrA<×Üs/t~”뉫2“¶ ÂÀ»cJî¥ä³zÑod$ŽãêË»ºõWæ>=—Ç—$pøøñ\=6’­ßÍæ©gï¡Y·Lí¶ãæ~a(½NŸÊ¸æÅ¬ø8•W︆âždJ·,SÌÊÔë¹öíN<ïZ¦´Ìcá«Óyä‹ÄS麥_|ÇÚæ§qÙ”žÄò±:6Ã]!öñ²êÕë¹rvƒÆžÇ­,VÿßË̸抈 BK=šr)wžÚË"¼yÅÀß·þmî|ì"F_ÀƒpoÏ ¯mÓÒm\Äö8šIWžDld€ŒŸçòø«Óx²Ó³Ü48מÔO ?\¦VgpÙ”N„¬gáüWyø²•äNŸÆéíªI®¥¾¢];÷ TWw^V¥ÖT_a´Ú÷Ç¿²b»M—ÞM‹X–çgËkÉ?>XSÄš…k´›H§ìw¸­Úzsðy½x}vÍm´†‘v~&ƃ?7oÓÂØíïÕâUì ÚEDDDDê_ƒ Ú1.šžÊm§\Éå^º½ã`Û6a™…ØÝv¦[sVÓ|™ËXSMω„YVIÐÖ†A=#™³t9Þƒibí<Õ'´Ó œÑç+ž¾ñ|þ<ìÆüû8FtŽ-Õ÷‘±ð f¤~Ä«3)´"pÙxrŠìmý”Nõ6ÆàŠê¡=Âx÷Ï?Èòõ'z—lúj«/"ªx|AźóÖ¥¾b»sH;?³¿^CÑ v,ý&ö§Å3ï3nô’²˜·µ`pßæD%ÕToËrUÊÑ®,˪f$Ú{È­¼9ÌÁñnãÏÞã©û_àê=ÌzbB͸[Æ: WÉi,fИvŒ¾jß_ø÷¿;ðò3–Ám¯ÐWPÖa¯;ÄÁ»3uÜ„¸ÀÔ¼Ú¹°–l?6a ºänÎK +´Âãbp›œÝ(à.ÿk à”þÕAH2cî|žA?¥ñæÜ¹Ü{Ù\æM¸igt³ñn½#•¼“¹æ¼î4·×1ÚC|YÃáö´~Ü à€³ëÇPk}Õ­¨¥»TüßòõåŠgàÐÖ<ýÞ׬ÞZ̧kbvÞ¡4ùéMæ/JçHÏW¬éÏð6¡˜Ðêë-¢Ž«ó×Ì — £ë¡gr«³„oùˆï2N¥CÛÝ(pýÓôx‘ú× ‡Ò<‰Gsõ”üýÚ‹,ò–{„–« ­›À–5)ø”w Wóõï„&u"ÎîæIô³v-$´K¦}r2’“éÜŽVQn*E–U•)¾ I!¹,ýiÞ²Ù·…Ksñ´éB|HÝGc;’¤AÿæÒÿ>Å}GG²ìíwYQäP¼a1«í3á8†tïL×nÝißdOk¡¾M,\ž§uGš{ lF»(¹ÂR{}Õ®nõå!qÄ‘´ËùŽù Þç÷ˆ JlIÿCØøIï-ø‹¸ÃŽ }éHwuõVצT×`Öƒ……ql5ß&¿_¤§oæãO>¢¸¸¸Âë^¯—?ùˆÍ›7í|Ñ”Œ¶‹ˆˆˆˆHýj°#í%Ü´:âb¦|6…‡—›ØíI`øÈ$^xùiL-äØnͱ6ÿÉö}bþß‹ùþ§B 7ð㻳˜—•ÌÙ·÷"Ê2X±ƒ8çø.w'·Xã8¾OaÅYlÈiǨcR¨K\l¢û1qt[.xí.î ;‹£ÛÃêÿ{™W7¶aÜuýiRǀЗþ-ó´IjG¸o3‹ÖæaG4'Ò2xZ¦ÐŠW™7û¢Gö Mx&ò÷®^ÊlýúUf%¤gœU¿Â«šsÒå}ˆ± EBÈZô9 ×%2,©–úªvÉùêZ_îVÃ9¾ýK<™ºø1ãiâÁ3l$­_|‘¹vKÆ_•D¨15Ö›“S·Õã«i÷m$í•ØÞ*™ÖÍ<äþõoÍ\ˆ¯Ëy méÙÓ*ßg|~?Kÿ-[²8éÄÑ„††âõzyçÿ±aÓºtéZa{´‹ˆˆˆˆÔ¿´îŽºøœÿ,E;^ôÐnôÍÜœó83ç?Î-©\¡MˆëЇ”Xמ=^ËIû>ÝhþíÜsKO ­» áâ‡ÏáØöá¥SÂé~îÜû 3Ìæ¿ór„ÅÒaȹ ;ªnA;„ÒiÂ=<ñ 3Þ™ÎÍYq0é¿çsJç0ê8Cÿ¶•|1g¿n)Æqˆë2œ ¯C‡Pƒ«Ýhn¹8‹GR_áÞ½8€'ªÝÛÔðh¶:²BóøéÇx=Ó&&©'§Þ|!gw,É·«‡O:…/šÏ3ïgàÔn5×Wí·Sçúrµdè±)Ll+#G´%Ô¬–C9ªý <íÅ¿C± ×PoÆë`û5¹WÌÚElYý5©©/YäÛŠ®‡Nå±óN¦cXýßÏÞ&± £Ž<š´´yû·8æèãøpÁûlÜ´‘QGM›Ä¶;¶Õêñ""""" CUgåžÔÔTï¨Q£öûI»c°«\¹Û)¹·ÜrUjÛÞe9S²H%‹UX¼tвå²vz×ôª<ž±*]pÇq(ÛÔ Ë*¹ÇºRºÕ•Õ±qìÒ)Ù•Ò©Ãqœ²mªÎk…ã—l€± –©&ŸµÕw-ÏÿçB>è?/NéJXÙÊøÆªx¡¡,_¦\½V[_ Tc™k®¯&`—¬z¾³X»´©ë­ä=¨*;ý´ø{6²Šï‡ƒc;Ú1ƪÿ€½Œã8ü±b9iib¹,ü~?G:†”®Ý*”'{û6V¯ù“ÎS¼‹ˆˆˆˆüÒÒÒ;vì ((ýË/÷ïB ¨A´ËEÕƒ¯ËUùcYÕo¿ë*àe „Õ^õÇÛe¿ªÆêÒ­éÕnZ‡ã˜ªëd_‡ú)Ûβj¸˜PE¾ª¯¯Zò´ë1j«Úº”¡Æz«ÛçW}[ra¤n- ~cèÚ%€Ÿþ‰¾}ûU Ø¡t Åê"""""õ®Aí"òÏ+ ÜË‚w¤‹ˆˆˆˆ4\ Ú¥nBÚqÎÌw8»Sÿ¥áS .""""r`PÐ.uT÷©ÿÁ@ µ‰ˆˆˆˆÈþ  ]d8ŽSý£ßDDDDDDöí"»)<,’e,¥G·ƒpÕ°à dUÿ²ÕýKV½·m›•«þ 22J³ DDDDDꙂv‘ÝÔ¹cþ\½‚Ï¿ú¸¾³òiÖ´9mZ'Õw6DDDDD‚ž‚v‘Ýäv{èÚ¹{}gãŸeJû&"""""õJA»ÈдqÙ´’–ˆˆˆˆˆˆH¥ ]DDDDDD¤RÐ.""""""Ò@)hi ÌBtYYY,[¶ŒÂÂÂúΊˆˆˆˆˆˆH•ÂÂÂèÖ­ñññû%½´/[¶Œ™¥`;õ‘ª`¢³Œ‡Æí—§J5˜ ½°°ÛGφ‘ÊŠŠŠö[zº§]DDDDDD¤RÐ.""""""Ò@)hi ´,ÃiÅe½B©î–ËMß¾qœÞÞ[ˈˆˆˆˆˆ4 Úw—±hÕ:ŠþÍ­=¯‰#þ^ÇŸQäuH³—‡Aƒâ™Ð=‚䇌 /&‚ºÜW!²i$GöŽ"tY¯g”¾˜_À–¶-¸q°—k¾.$¯º‹ ÆE÷ÞñœÛ'’.Ñ•QÀ»_eðΆ@Iž,7ÃG$0®}(-#-<Ød¦çóæg|XVÆêÀ çÌQl]žÍÇë|îîÅŽZÓ7$önÅm5´§á#×!”–%û§¯ËaÞèÓ=š~q.œ/?þœÎ“KŠÈ-ûÐv÷s RºÿQy¥ ÁÖ‚­¼õ-Øê;ØÊ+Á§Áßþì”ûpJÿÇÁ!{c/´ßÚÀ¿ùé90óÛ¹pÀ¸HéIR^OÎßÈíïgðÖº~ÇЮ"÷ˆ‚54od IDAT[ypþFîÿ¶w‹HzFYcè80‘;xXöýfnz;ƒÏQL=!žža;§êgþ²‰k^[ÇåsþæÑ¿«ØK¹ŒÁ²JÿÌÎrX–)É'uKs'‹îÃÛpã€02~Ïä¾2xg£CèžT°±HlËÔÑíIÈ©- EÆìHÓÙ¶i r‰êÛŠ©«[äÎÐ~`î=$‚í˳¸÷ƒLþ¯ œ‰£ÛpZ|鱌‹ä¤pâ·góøüMÜóÑV–†D3åÄxz†–Lí¯©,y&‚ñ'%3û¬DþÓ+‚Ï¶ôkoOÉIáÄggó軹ûãíd&Ä2eD$¾Õ[yôýÍÌúÛ0txkƶ([{`w?W‘ ,ýO°–W* ¶6lå­oÁVßÁV^ j x¤½vù™y|•EI$œ ±K#Ûxð¬)¹2fŒ¡`K>ß­-¤ˆÒíB#™00”í¿®çžo É·ÁŠr3æÐhLh$gö aÅkyaiɽ.ËrÝ œÐœQñ™ü¶¹$íâ|/k2‹ñ:5LÑoÕŠ¦–{7?›«ge²b—!VVKš›vÙ>"’±==l^øüPL±üå')%‚ƒêXwÆí¡W÷XÆô‹¥O“,Ïæþ×rø!ËÏÇ”]ϱٺ:ƒ{~JbÚÈ~IßÀ‚ÂÊùŸ0 „ÌEëxð‡" øî¯bBÇ'1æàÞ{/ŸœÒÏ£pkß—~K¶{èsJ4‡6ÏdéÖˆšë`}!ÿKû‹÷¾ cðAM9éàDžîç§ß¶òÖ¢–æ:µŽ\×”þoí:µ§Â­,ü«" HŽâñþ^>]²ŸŠœ 6=;'Ò¯­wº_mmi]/·wˆÔ·`ë‚­¼RY°µ`+o} ¶ú¶òŠÀ´âÚ7eÒ úƹ ·ü!ø®+¬;%#õ¥Ñ‘'*œdÍ/«¼ØGñKÞ#Ñmh52™¹‡—%U2J^maÒwu×}+Ù²…»>- ·4qÇïç/8®Š›y"kIssåí[»,YçÃ[Zœe¬‹¸¦\1"–¦[³™öRß娨Õ]€plþøa#/µIâü£bYöž·b~¢ÂHrÛ,]루,?> 7ØŒnN¼+ŸÜÞùyç“E -ÂLíõNIþŠ Šøâ‡M|ù³‡CkÃ}Z’(âÂoŠKn3¨UÕéc qɻӞ¶l à¸Ý4q;8Eàøül(„®‘%+ø×ú¹»–$Ò8[ÿlå•Ê‚­ [yë[°Õw°•Wà ÝËMÇ5'bEYÈ6ÂÑG%0Ô©yÚ±q\@ ºKZ–Á…ÍOŸlà¥Í6v¹H¸(?@ ¦‘õ]y½¬Ø\Xážö*÷uÕ–æ®SI§áÙ‹ùÕÞ¬m<ñµaLßX®É/¿góöâíü´­ê{­¿—wÓ²86ŽK{m¡°|Ú¦´Îw)œC͆°ñcJ¦+Õ¡Þ\¡¡ èÿûÄÐ#Òϯ¿fòÖoÕ¬â_‹òéïI{²åƒzoÀÁ²J÷©õsÝý<‹4ÁÖÿ[y¥²`kÁVÞúlõlå8hmA;«˜™ßg³0ÇÁ1RІֲŸ/¯ˆ §))‰.Ü•¾(¾ü"6š’ÔÌ!}i1»én›\?„‡×ñyèuò}yµ¥YòSºÒ¥/·ˆuþfôlB؆" ö$`õûøqQ:?-É¢]r 'ökÊÍâØº1‡×¿ÊäÃŒÊûø²·óÈQ<>2ž þ*{½4?ÝÛ¹ Ù(]XÏÀÖ.|ÛŠÈ €SKeÕVï&,œã‡Çqj·0bó I[¼‰§–æ³ÞëàìÎ…”jìQ{ª%ÑZ?W‘ lýO°•W* ¶6lå­oÁVßÁV^8€ƒvoN›iÎñƒbÉý£>­Ckzv x}y€ÛnÍ…Þ,>Ý ­Û7¡e€SOê/>¦õIä¶°`"·›ÖaÅ|¼´ˆÜ€e™6'vkÎI›³Y‹›¨Ü<>ÝØãûQjMÓ^äмm4ý›yùvK>³~òòÈ Dn1[˜ÿ·—w8mCwoq3Ç'`Íê­<¾:›â"8¦w4±¦ºÄ!}y:ÏwIæÂ¤)9Eù¼²ÈËùŸÅÿeBr·æŒ‰ññÆå¦íyä9†8—·ßÏࣵ^òlgŸ>.Ï»}ÏÚSMjÿ\÷QæE@ÁÖÿ[y¥²`kÁVÞúlõlå9`ƒvß–mLûÄÍ…ƒšsU·’K`¾b˳íZ{`ñçëxÄ×’±·bdˆÃæ,ðÙ€c³ü›¿¹© gõlÎå}\¸|~þZÅ·¿—Ð?|™Î‡£â9íèDB|>~þ¾¯6J„Û#µ¤ðñÅWÛvd,ÊåçÏ‹X³pׯqvŸæ\ÙÇ…Û¶ÉÉ)äÛ-{ð(1llr2óxýã¼’Ù¦šËŠ–Å¿&Ä^î«¿_ÇÞœÛ;ž›¢ [2ò™õV&ó2뚟Zê ¸€—>,¨°>Á¾äÛº§í©&µ”i_e^ä@lýO°•W* ¶6lå­oÁVßÁV^ ZU %zRSS½£FÚ1{HKKã•ô¾8ÕŒc°Œƒ]~í.V¹G;8ÎΫWÆ,œ*ï6¦ä}xâšóÄÑ|óÚ_¼˜^ò5¦äeUPþ¸Pšn5ïÕ–vuïך¦e Bù*nSr¯û¾ºzWSvÍËŽü”}¥ïU˜TÅñj+SUu»/ËS!ýÝmO\† mrO>W©¬±õ?µ ¶òJeÁÖ‚­¼õ-Øê;ØÊ+õc|‹Ÿ9jÔ‘{3§¥¥1vìØ1@!PPú—_îß…@Ñ3Òî8U|ñ*,öPå>•^5´I‰¡·ãgC^ư±$dgóÕ¶à*¹Çd—ol9v-7¡TvÍïךæ.ßüÚ¶ß[5•a×¼ìÈÏn~û³Lµ¦¿»íÉ¡R›Ü“ÏUD*klýOm‚­¼RY°µ`+o} ¶ú¶òJãwÀíûŒ±h•Í计´µp¼~þÞÍ=_nåO¯¾g""""""Òp_Ðîøñóuœ÷ÅÎiÐŽ£ÕEDDDDD¤á ¾ Ú§Àˆˆˆˆˆˆˆ4uzÔ¸ˆˆˆˆˆˆˆì j¤}ÞE÷ëŠõ"""""""»ë×Þoi5¨ Ýeí"""""""¥4=^DDDDDD¤RÐ.""""""Ò@)hi ´‹ˆˆˆˆˆˆ4P ÚEDDäŸS¼‚éçËiþB¾íü³iÙ¬[ü5_¯Ê%ð'%""²¿4¨Õã«g“½äE®ºüE /|G·Â£Eæ÷ž½E³¦qÿß²"/†”ác¹îšSèÑÄE£«^;›OnÌÍÿ·‰BÇ,Bcé9hã§L`DëÐýSæÀF^x:® Põ¹k 7¾ý £[ºë–{ÿwãDnø,¿JlB;zÃijŽå ØFøYJã þgÿ÷?5g’¼?Þcú¯ðá’õd{=Ä$´ã #Ïã¦ÿ £…{/rh…Ó²M[Ú´ˆÂõO´èž¹æZ~÷ ©¢qýÃÉí–`jóÿd{’T¾lçü«<Ê쯖“éjEϸö²éeáÿûÆ}šÕ›]OMúÝý>ÏŒŒ…Ì·9ûäûù½ü6ñ§ðÒk—Ñ3Âj„mX¤aiðA{`û Òf?Í#³¾%ÝoÓõŸ¾J4|üõÚUüç© :ëRnoùÿ›þ(“¯çÍGN ±Ñ]ñ’½~#íÎáÁ«åÏ%}Õ¼ýÒL®øy 3ç\EŸ¨ýð£cÅqøuÑ.'xY•zýÖ—+oCûP ãjB§Ý ´}älÎÀ×v<÷]5˜&v>™+¿áõçïeâ›xiÆdzDêÇTõ?õÒÿÔÀÎþ†».þ/ "aò¥çÒ%ÚKæ_ËùÊ%boçäyÚ2úާ8Ù¬ýðXWÛà8 í\!¸Úü?Úž¤J5ž/û7òæ5—ðÐÆa\zËtñ.aÖ÷qî–æÝ$ñ GqÇôÚ”ä6-¸—›ßnÂÐöa` P¸§§Þu Ç&x0€OÇ0cˆì Ê¥Ebù·ðCêÃ<üú׬Øê¢e‘LºúbþÝ¥âwÛû÷×ü˜Ψ;oà?KßsŽÃÁ`YüßÃw2ã‹•¬ÏÈ¡8¤)ízÊ™—L夲~¢ºþñèBžï yŠ·.ïA„“AÚµô9v.Kç=ÁÃs¾dɺlœ°¦$$õàß7ÜιaÍüǸë¹ü’Q„–ÀˆKcÚ¿ÛRZž5OgÈŒ’—ÖZ¾Þ·ÓkÏsM‚¬Í×ÚžìÚ~okªsÃÂ[ÆpñÒ3köènað²rÆÆÍëÃÓo\G¿z¾¶Õ|¾ì[ÿsv%ciŠÛô¥³õ+ÇÝô2ïo8Œ³“âIé·c{ÿ¦wxvA½/}€qÉ¡X€¯`+ùVszöîIϸ²ÁÃ~¸'"4ø ÝC»±3øð «h!W«cØgü[~ã§,=ëJ·…1Íúü‹nçû?r˜Ò%¼‘.x`0Æ`Ùë1ï•8ñGÐ'Þƒ1Ŭ˜y“ŸËaø¹—qÃÊ÷fðð”‹)|ù9&wà d³äã¯Xw7^Þ‡X;«Kn{+XÌæ6çró5݈È]ÃÇ/?ͽ—»i÷úu Œ.wò`ÌλÒÿbJóEòPå÷ tca±ÍwrÉÈ-¹lnØå¯º;6vÀÆäÕ=ï"û€úŸ*úŸêú“^ó÷/¾t1çÎØÂÁg^À½}â1Û²‰iŠ1E,›y1S_‹à´Kï䊄<¾}á~î¾Ü¢íœ«XnZ¶'®# ÌãÇùß°¾×(’ír}ÈåobCâDn¼<…ð‚¿øfî Ü5q99³Ÿâìa5”áo;@À.;Vm}ŽŸU/]ÄÙ36ÓoÜùÜÕ¯%®MŸpÿiü”îåÌÿqÝ?$âŒ+xäDÜÛ6‘›Ü O¹šn9æn¦ÐšcˆjUk]øX^Óûa{×O[›¯µ=QÌŠçkû½­©Î¯¥ÛQ}ùè[~Þ2™®m,°·óÛ÷ðô¸˜Ž&È~·j>_¶ ·’GÍcBqƒ1.štêKkfñûf/NRÈÎY0N.?=û4?ÄŒá¥ÚZzÒáÏË ßxðååámKXcj°"€´–»$“º”·Où³×“íDÓ76dÇk&,ž–‘ð˺íøxc/º‘‘CËÊåàØIœñÈdúE» ç[¦ÏZMÂøç¸kR ‘–á°ƒ;P4v/ÌXÈ©÷§)€ãÕi(‡íY2ÍÏŒp ²ÃÁŒÚƒk(ƒÚlæ»ó?aÁêBôЬSvrÖž‡jdã+È%}õ¼ñè¶…öã¨ÎáuH×Ù'y©+õ?°kÿc|TÝ·Ô|H'w!O¾´’–ãžeÚ”nD–]Õ3¦¤O{u=.{ËN,¹·µwë,¾8íeæýqDíøn»ZŸÀ7.ãªiw0ú«—vüÉœqêñ NŠØy_¸‘sø¡=ˆ°†sØ¡ÝqqÏ=³ˆÑ÷ ¦ Õ”Á[Õ¡êûœþíóÔË+i6z:\Ø‹hË`gnáÅÓälfk ’ƒÂÞ1¸L_vñ O&¥k2!Œ189ßÔXý».ª¹®zí]?lm¾¶öT§ß:¨¡Î/¥Ïcèzþ¸…Ópç¯äËÕÝÆ¤Ùˆê²Îj8_i=€^‘¯“öʇŒnw")1~¶lÚF±SHNQ Â¶þ2=­˜!7NÊŽ{Õ|†&¡¿sÇØc¹“PÚv&—_q&ÃZx‚ì‰HýhøA»ü£*öí;O&­.Syú†ADá%?k-?¼;“™Wœÿ±¹"öWþ,ަïÐ$", cÀ„'3¼o4/-þôâaÄ–½š’DSéÇqçˆwX«.´äm6mìš‹jyÓë‡ð*F–ÜÊ‘Ãn+ù·ãàNÉe_Å‘ñnLa]Sß»¼‹ì.õ?;ûŸëz—–»Ú¾¥jÞÍ¿°²(š¾CÛíè3Êg,eM±Ÿõÿ=…ÁÓÊ^u°6á› °‰*7ºJûãodÎáç²øÓ÷xëÍ™\üÆLúO¾Ÿ'T—dpG?áŠîÆ¿zG0÷¥dx&ºì`u.CÕ}Ž/ýWVF2`d'¢ÊúÁr£´a]OeâÀOxè’3X1êÆŸ1†#»5­pBcÊåÀ[K]ÅÖRW½jÎs]O›¯¹=…Öå·nÇÕ¢ªëÜD÷â„^.n|!™ÇOÓ¿¾á7o2gõŠAëÜUdb†põí¸þŽ™p̃%/ºmv,¢Ës¼¬~ç5~ ÎCãËÕ£!öÐ;ygƒãÝÊÊïÞå‰{Ÿã²kÜÌ™q&CƒmfƒÈþ§ =H¹c‰1ylÞîÛñšS”EF>͉ÅÝX¯RG¶¦s×Î%÷”Ò“þ’Ø6æÞ}})çO.9qÚµèÆ€ƒ³Û§UƆ‡¾=Xý–-­fP¼Nm+sÓbØ<ûÁùäoÍd»ÂÖ9çqÎkmÒ.lççàý›´6ÒdøµôŒÞ%7.OÊaçp§³˜£oXÀ7égÐ1)¤r’"²O鎔 åŽëI¿f^~ûb%yŽ8lÿí–;­ÔµIÃzLÎ>µóн1ãÏ'»Ø!¬Ia =h’âo7PT¶ò°wß,Î%$¹; ûáJrHËî{–‡¨6¤tKá £¹ýÞ14ýñanzmUÉã¥Ü1$ƲV®§@1¸4ê*÷?Õþ×òý i‘B’{;‹¾]¿³Ï(å‰ïJ’»ˆÕ« ­;t¤SDz¿$FWØca¹šÐíþÄ9é,O÷U=ìÝÀw¿åâiÛ…!û®ôÄw¡•Ùί‹2ðVÙgŒ;šöÃÎà†é©L?)Š__›Ë²ÇFläo-$P.ÓµÕ…§ÅžÕU]o›¯º=yöô·®‹æC&pLÌr^ÿ{>úë>ÎKdìñˆˆ áÂqÉŒ{ñZnÿ'u6¬xoϯObÒݳFBL“ƒ÷8%€Elÿ øï¸ï9çé»xuøÓœÓ!‘ÃNfú3qûÌN>¨®ËÙÖà‰$ACýO¥þ'ÜdT½§æï¯i:”©§&rö¬+¹Ê™Ä¿û´&¬ “‚ö#ÕiœÒš‰s®á kc&^”Éß9í9ᤞĔ[ò¼ð÷ç¹ãBºÔ‘¤–M0Ù«ølö<2ݽ8$9lÇT÷¬OŸç™öÇÐ7ÞË<ÇÌuñœ~óÀ’Ùûèn«é`&Û”‹fÞÈ=‘çsl²áï¯Þe¥íÐðmúœÿ}g“Ü©Þü¸*'*ž(àI w—0R?˜ÉìƒN¡³“EN«C9î Zê¢Y-ïïm¡‚¬Í×Öž¬½ø­« ²'ãÆ´åÔîcµ/‰‹oCHc«Ì}Â&oÝ2–ýµ‘?.`îÜoØÐñ,¦_2 \?à¿fëœÖœÖ6¬â,ß>|iÙ­ÛÓ¦™‡œµß1÷ÙïñuÂðOU ŠÈ>¦ =h…Ð~ìƒL÷Þ˃oLãê¼hº½g¯;Ž6!ñÏMlë„|üMpè:ù fD>Ì#o<Àe-º æâéW0!e=Ž'lïó`EÒóÜë9%í"žyè#Ž~ôx:Œ¿iÛÿËs§qåL?Vx -º  gS·™“z þ§RÿãϬf_OÍß_Âè9uO7}„Çÿ÷4׿’‹–ÈWõç_ZÑëÂgxºÙ#<ñösÜüÚvüaÍè<â"?¡'1;†wmVS¢·}ÂìGg³¥ÈÁ iB›ÇpåcS8±µ§d¡<À ËåûY÷òrz€¦É}9ë¾k˜Ò+rßö¦ ƒ/ŒÛCäégnd~a‰â ËàÛ²Œ^|EÅà„ß}$Wß9žÎaÆ4åÐ˯cÌ­Oðü-WQÞ’¡“z0ê µÔEDÍïïu¡‚©Íס=Ï>ú½ ¡ý‰èÿâ],ì2‘‘‰!šBZ¥B–_ÞѕޞcUqRQÝ9IÉ÷ѮЇcakû©£9sæpä‘GîUÌœ––ÆØ±cÇ…@Aé_~¹EÐH»Ár5滾ꇱ¬F}/]yÆrÕ©¬¦l±•ªß­¦Võzím¶º<Õœ‡º£rÚÕÖ{–w‘½¥þ§Â5~çj««šúŒ:õ'Æ`™:|ÆÂr¹ª¼°P÷þ±¶>ÇËšÞä« íâ£`ÛJ>zqÛœÆI¡%ÁBY5XV5½]-uQýûû¦Ÿ š6_Çö´û¿·¥¯9…lü}5Ûííü<û^>ŒÍs‡·Ðªñ@uí².ç@Õocê|%"ÿŒ(h‘FÏÎgýÒOxéƒålÎ÷cÂãèØ÷_r6Ý#4Wß:Þºk /¬vӢωÜñÐdzFªmˆH㥠]DDDjÒ Þø’)ÕLßß§¬¦ ¿bï^^a.nÉÔé6e9P„tfê¬Ï¸Ô6D$((h‘Zìß[f‚f¹ì!ÝÂ%"ÁE‹lŠˆˆˆˆˆˆ4P ÚEDDDDDD(í""""""" T•A»ãìú0YÙß4Ò.""""""Ò@)hi ´‹4þt>zäFnys-źCEDvW` ߦ>ɳ_fâW"""Òh(hi(Ûøå“OY¸®€Ö•‘ÝåÛÈ'¯¤òÞò\í"""HÃÚ/¿zžkÏ:žAC†2à_'3ñî·Xš@ç#ûŠMö’ç™<òPÆ¿¹ _c¬ØÀF^=ë J¿ÁUýË›éþ¶MÙÙ|ró) 2¬4Íá ùöÎ;®ªú}àïsîàrá²TPDEDÁh©eÙPËÊ™•3-÷Ê´´´å™+qkbf¦Vj_í—™–ZÎÒD4'‚‹=.Üs~€Šz¹`‚|Þ¯—/õÜs>ã9Ïó|žÏÄŠ©“éyÕȆ)­ñ“Ù3u0ïï®EßQ3hlJàÿ¢¦0a÷è1„W~’ së’¡Ü´·õcÞýƉ_­ÒA9¢TÏ´KNaŒ]ͼ]iÛª%í{aT¨ÌµƒH0‹ùÈû#›ó›'1m§ŽçÇ"Òþá54%ޤ§rí0›4!¼Iõ*ì«Ö$÷ZND¦[‡§ˆ aÓ'éÿÍE²Óðî“ÍxqÙ­=æ9ç×Ð)² c÷§æŽ,g_eï²wèòLKBÃçéÞñÕß)VfÒ@Uçš4hB£&ðl×!|24.ïgo¼•†ôƒÅš¿@Pz(Gþ€’.$‚ΧsÑÌÝu5ŸfptåB~•*c$Ëi–¼ëÙœùr8moNhÓš´é …{HÈ¿îÝÏOóFÐñ™„†?Î3ýç°çºÊm»k”D~ñ¯<÷8¡áñtq¬8xýVþ–x¶MzƒmŸ ¼i ßàé^øòxž)ì÷¢”S@yÓy{ßP¼¥Ë9•‚’w-óäf6üËþo6r<=/†SR8u$É' oƒ„T˜>Y®²kî[w·×9— ÑSl·—¥{‡ÚŽÛJ§0[T3ˆÝ8‰íZåÎh·èÀЯÏc.’)ÙÖ¯ìó?°æ Ä#ÇÓå‘Pš´~ ££ìYÎw²Q³Î°}Ïuªu|“W[…Òä)ú m‡{âì‹3ƒÎÀà„„Ð0$„àJؼõ õ£«]éîLe„R>¬)£³×ßú¯šÎå$}\uR™nðJÞ]°¥³Œœ¹‘e]˜Ò }¹õ7’„$IHJ‡¶ïâTÅW;4%9 "Z)ÅbAÉ?Z­*(%/ÉäXÔ@Þˆ6ÒqðD†UNeÏ’)|8T¦Úš‘4r²6{Ÿ—§šMâùl؃êþ8!î:+÷ª%¿@P(gþ É ©¨5z2Ê ã¬çd³>Ô²—Q/ÿÈgi<`8Æy“¹–š“÷Œ·úí8®nâö®dòâqL \Ë'Í]ÑÎÁOû1üK…f=†Ò'ÀŽË‡¿#êOp¸™o' ÷¢dšõ”‰˜o0£ß@2–/¢·¿Ù’JÌÞƒ\ªÚ“wGÕÆ˜ršíËçóñP-ÞkGÓÈ®ßM…”³Ì¿Û¢R¾t^v ¤~Eøvï92žñÀ$eqrËN®VðÇíÊN6Ç $$Ä)ë¿ý£àù¼& Õ{K¢õöZ9Wˆžš9n«½4®Õ÷d£/¨|R'¢lÛ¢åL4£?Ù‚±ó0f6÷B{=Ž7ж϶~)×HÅHg;4’„$ipòk€'+øë’ÕÓŸ °ñ—=œéâK€1‡øCrÝ¡6!•ôHÒ­è 5…ß?ŸÏ^çXÖÖ;±êU x ”òN{~²8ýõ$æý@ïq‘¸ 'qÿÈÚ\ë0AUqô‹ eDF™Ü}z!¤ìcîç¨;$š!íª “ ¾çvv\Ά¿æx·hŒ¥UÄ‹*ªRÎ3{ÓФA2ßc‘ÿMþAi¡<ù5‹Äë™È¦ª4}íU‚º.bÉïø(ÒHìWKÙïÔ–Å­¼Ù²Láе ,¸ #còoNkÿ¼4‚Ü9ûÃ+lÚ‘¬f.’ö°`Ã%¼z,ã£Þ~ØË4­Bì÷ûØ#¶NÞÇܧ¨Ümô ÄA–hѤ™]z±dÁ>^šÒ Wj4áшºåW½Ä¯}w°õTaªí߃l–ÓXÞoQ)O:¯¯F£š:Ö?L‚¹!ŽÒ)¾ß™DPÏñ´Þ4„%ßÇ^?Õ£ü™lO­*ØI ÙÖ'°Þ^›±©§¡¾Øn/ƒUëéZ«›­v<ÛzùHÞU¨-Ú'_âšÅzM›^ßԀ܂"Ê܆~é=ÃvX˶•[èàÝŽ@ç®Æ]'KÍ 9ÓZ/^?ˆ½fÓµÓ.ZÖÍâ·ÝÙ¼øÉ0"ïØ>˜sq s·eþN'e{ň@PšøotÚÕ b×£ï̳´xo¯úÙ#úì‚bGÊm¥"¶æø?9•ÃùO^¤é¤WU‹‚ý¥tï^2ðóÇ4Æ3iWþaï¦(¢†õ%göRFßÛrÒ•¿@ xð(\K{ì<ðz«Å Yü竵>žz¯w¤¶)‡}FH½šŽEUÑI9\úe93ofOL<é²Ú º¤L ;ág²]hÜØ ƒ,çÆé’|[¼nŽ?ÂÉ, "ªcÌ»G²÷¡YË%>+Í»óf% C•*ñ qI–|•(è÷l›å”S$ü›VGš½—c)¯PùÂf~HªÍ€È:„ÉÌš¿‘£êQëÄ^ÎH5éêkÈÓÝ"êSíµu=-´½ .,Ý|ØjÇë«VÓÉ*‚-Ö x‰v0}PgN<ñ"Ý:¿@ëڮŨKÎáŒ|ÿeÞž0—Ÿš–{Q«`Q\3i•´‹§9ŸåNdûpªÅïdæI~Ú²®¡m¨jwCfNmŒæ¨}3æD¸°A ”ÿN»™¾CÏégxô½ÏóXeô¢'"xH2z ˜3²QTõîÑkK "ޞŠc¾Ñf c%7뙃'þµüq‘% ˆÐ°ê\¡?›ÖþÉÀz®%Ÿ¿@ xðXÒ¹–ö.4’a¯¾HÕ——3sމ]RKf>Vö ®FH¿’ŠÈ>³–áoE‘Òz0ã®þúw'°ýFš² 9E8ÌìN×!I`ë;’Ö€ Ù¤ÿ÷BË)(§h¨Ü¤%ÕÔ/ø9ö2nßí ¥ÞšV°£BD;êNEô>t݃¥FwBÝ´HAïïÛô¸Ðö2¥è Ûjǃ=l—É–-jÐmæWDþº™U+V2¶çJÖô™Çܹ3ó÷‡Èþ|þ}_Ò®]&IÕsmM^‹®J¸·’eò‡ßáøÆ*&¿X½ÔWž™A—ÁS™þD8S"]r·º˜Ï²í‡‹85{‹ “ئ*æ‰AL± Zg¼œ%®Äœ'ÝJìªs¯Eum&§b%u¨lwÿAwaå”_tU›ñ¨G:lþš¥?çþbc*h%4î‘t UøuÕWlÜ›Lµ–M¨”×d•”>o{i»·FÑlQBÒšðì̘¹«™ÛÞ‘#Ñë8–^L/K2²F‡É½ ’·óÙúK¸<ù2M]d,×O“bOM7ô²Œ,kq­A€>‹qi7W9˜ÏÿÄö‹F· ıKS2G7ÌfWfuz»‘[•´Ó8§zÒ±šá®U d)Ýö¬³üv2Kêç êµ(ßH«;]£¾`X£ØÛ.(AtÔè6™IIŸ0gÝ$†Gå Û;ãF« Áo.d¾ÛLæ|³ˆw£“È1¸áÿèZ¶ Âù¶†V‹‹§úí‹öæb@ƒÑÙjõÚ3zðË<â„Fv¤ÍÀnüoâzf~ÕŠðõŠ1@ðÐP²H̓£þæLœ1°3ïŒS‘ä9iÐ;ØÁ¥«¤æ@Eß®Lz+¢1öû,PUt¦ÊW7åÐz~Æ—ϘÅ;k“ÈÖp­TV~&´’¨Õ{ f0óË© IPñhÊÀ¹Ãx9°xΆÑÕ(¬œ‚ò‹ÿÇcÚ°C›9Þúz‹SÈK<é¶/-á´ô¶»ÙÔª÷ÿ£íö²Hi¡Ϲ\ , ³ÅÌ«Çøai4²@5à^§#'vÃßP‡½ephÖÿ*QÙ¿>ÍΠ{ÛFxÞ8HÎX—³' ±„ÏÇnâJ¦WŸP^ýh½ü y¾ÂLÜ‘ó(N ñ†@ðÀ±æt«V­2?ùä“E>«8ضm:uº#ÏÜCB¬°J²FtØ‹<9ËšrñyU± ¨²æFC˜WIFcE©TEÉÝS~ Y¾uà“ª*·–­Àt,ܵET’ó•—Vþ²WþAé¤<øŸ¢Õ1×GÈÈšÜÎÍ]¶ H’ŒœÏ¾UUAUòÏDJH²|[ûx{:·ûëþ/÷²Y*ì÷¢•SŸò óy¨ EµÒ.݈ïò·Åy¿ØÔ§‚ÚëÂõÔjÚ7ï·ܪNaíx!ñ„-[¼Ñþ[M÷^°®_7Ëž·¬_¾+aEQ¸nXñ%wÅOAùfÍš5´nÝú¾úÌÛ¶m£K—./@zÞŸ´|ÿÎ2K÷L;²FŒæ•<åKÎ’¬¹cÄÞvý%Y¶9Â/I2EßÝùZ½ Ysç¥âÉ_ (”ÿS´:Þé#ŠbÛ’$#គӱV¶ü× û]ø {§<è|êFÁ2¸w}-èúÝ× NûßÙ车c³nVÚÿ‡õ2©ì… HqŒ@ (JùAt@ @ ”_D§] @ ‚RŠè´ @ @PJv@ @ J)¢Ó.@ A)Åj§]U­}dM @ ÁƒÄj§ýA~Ÿ] @ uÄòx@ @ J)¢Ó.@ A)EtÚ%‘?¢ç0gëy²JË‘9ñü0s,ã¾ú§à2Y®²gõg|þóerþm¹Kcݹˆw#@Pîv ç*¿®ý‚G±<¬ƒ³N0÷µ§é8ë0iŠ –ëÞñ#ûÎe\¦ì‹ìX¹šo§ÞiWÒ9wð~‰MÁ’ÿÞÒP÷ÒJA2{Pùˆw#( ÜéÛJ’e³@ <@´»6±\gô\æ¯ÿ?\HCcªJÃ6=x«ß“øÅxÃ}¡š¹øËJf-\Ï1×PŒ•¨×ª;#¶§Ž“†2u¡å"_ôèÄ´ ÖãÅ@Æ®…EQ¹ÿ~‘™“ »ÓeE%>úf»Ù–eÒÎa´Ïë_,áUO{*U­FUG4y©ªŠŠíB©ª’w ¶rËü›…£Þ⯮+Y]Äæ¶4Š£î€r™¯ûtàCí8¶Î}œ šÿ¸&Ù™mrˆß9Ÿq3¿f\ê<ÅÀqCxÖÛ`ý =Èwó×ÝvP½÷JÖô¬áAºU%‰+&1åË=œHu&°YFz‘ºeÍÿ(‰ìß›wÿG†ª2v.^5~‚ný^æQO»RPg…Ô¿¿el9tžD³çÊÞÔk݇w^ÄC{%”ïöm%Æ¿¶Ù@yÒù’Ô' -eÄÐ¥d¼ÍÒUÐå‰ZI>ÌSg±j×q.kªôè˼5¤µerή¤k—ùœ²(wE ?üŽ…*ü±vžˆÇ‚‡ˆÕN{©ùä›$cIÑP§ý@:y;“q|3Ÿ.žÈpG?VõöÃ^Nÿߢ¦dá´M\ïÂ;¯VA9ù=s–LeêÍ×câT–d+W¤åèéx'[3±«ßcúÑ ÿ¾v2’Æ ?g-k‹¥ÊzªÔ«‰Þ|”ƒqY<æjD’€Ì¿™7|"¿½Íì×ë`”%ÀLÜ¡Ód94 n-èªÑaÂ<ž—$äú‚ƒ¢XJؾU‹‹\J|H1ðod¦\û‘‰ï­#µý[,haà·OßçÃIÁ4žý• VØ»©Ö)ÃÃ0i¤¼Ž‚ŒÑËý»²9=‚×ç] ñ+ƒy¿Ò¾ž;‹ÞoÛóÕ̶xéÊÿÀLâù‹¤{¿Æ´a8椻Ÿo–E1ì«D­Aˆ£üP;nJân>ø [šÓ{pOLf.Ÿ9Îß² ÷“?ß–Ÿ’·¥CùÒùÕ'U,I'ضj>3Wì!>G¡VþÑÙœ‹|5jÓ/F2x\̇X1u2=¯Ù0¥5dÂܺd(äuÚ-Ämý˜w¿q"Â×r–ˆÇ‚‡ŒÕN{©ùä›ìLã>£h$å—þ¤íü…)Î’ö»|ÿa$§0Æ®ŽF¶Ó!K@‹·å­ƒH07ÀdÊÎÈ¿¤§rí0*q‡)¶ ÁaM2æÊRö)$àÊwcxvã’r©T§=F¥C-SîìPöUö®žÁŒµ¿p⚆Ju[Ñkä@ž 0Ý6{dô#GN¥ Ô1"™'7³á÷Xâc7r¼{m8JHJ §Ž$ ù„ám̱ÌíúÃç±~h]ŒÖêbŽç§¨)|¶y?±×´T¬ ×U4÷Ÿžžßð¹ÿnøáw,l–ûpqÔý.,ñl›ú>ów$îr*Y’#•ó§­ò»(‰ŒžÉôè]ü¯R)0’.ƒ‡Òµ¾ë­¼•d¯›ÅŒè]¹˜‚Ƶ?™ÅàzÈ96Ê^Xþɬ• ¶b”ì+s:Ó“ŽÏµ¢au™ Í«°|k"J)x7Î5 ½}„ô€í=ã8_¬ú‡§fðAŸF8kšºž§í˜å¬?Õš7ìmÊ÷¿ˆªÎ5iÐ Y‚&Íw‹á‰÷ö³7ÞL}û4~Y0™yÿ;Ìé¸$2UMÞ^ÂìÇã™Ða Ǻ®dÕ+>ØIs~ Ý:-ÅoÖ:&†:"«ÿRÿóÉØ|öö'ÛóÄÄ1¼Þ(ï7õT$dYKÿ›1‘;c8ŸL–Þï Gè>è ÚßÐEËUvY«C› >ï–Ï·© E°ûþÜ0‡k~æÐ¹DTƒ+•«×å¹1ïÓÓNožÍ‹¶r8!ÕP™GÏfÒsUÑçÕǪÍ& [¶T_e‹r¦ó…êîÛm¶ûƽÀÀ?ŸcŪשe/#a&fÁËtÝÂü/GÓð!„=X²9¿yÓvVäÅñ£8òÑd®æÿõü¬9(ñȤátiîŠVj€¿|„gÞYÎwZðjuwƒ+Þ¼?'n#Ÿo½BýÁSéêc‡,D<.*SmÍHå[Þ(»R¿"|»÷Ïx`’²8¹e'W+øãve'›c∔uŽßþQð|Þ“ ( *,uìÔt~Úá_*4ë1”>v\>üQ‚Ã=ˆ¢Ò 2©­'zI±ª YºZlu¿ K*1{r©jOÞUcÊi¶/ŸÏÇCµx¯M#»B~7e³x½%Ó¬ç¦HÄ|»€ý’±|½ý È’™“ËÒsÁUštïÏÇ!îH×qö´C’29f«ì†Bò×$3Û2¶ójJC§5lÜ|Œ6­ÏðYôUBz?‚g!³iæÝäéýCô¡9WòûA-jᤕ‘$·Çä}~û;™~öeôÀ•<Ù«Ù$ž?À†1¨îâ®C²$rhû.NU|…±CCpQR‘*¢•âQ,”ü³fª‚bQÈu÷¡ÿùôCW±&•ÙÀþÍ»9ü>öòíƒ9–þÞó;¼z0vh öégؽn ô8Nòªy¼ZÃ`£go÷m…ùS±Ëðê‚K4ìÚ—VB·ƒ)S·ñ{¼™îú¯ýÉŒ‡1³¹Úëq¤ø¸¡Ë'é»m©0YdÛ¶¥Â|…Év±¼é|¡úD' óí6õä-j?‚þ‡=üqµ7µªÊ $qô· èꤦ± Æ16ÑáÝe[:ËÈ™ûyG啌k¤b¤‚³IB’48ù5À“üuÉŒZ]kŒšÂïŸÏg¯ó ,kë]^ƒ'âqàáRºgÚP¹¶m O½w€l‹·'&2í)OÊØJ²‡L§¿žÄ¼è=.ײ4Ü8¶¤Í£u1Ê«\`wŸl=•A¨ïÌýâu‡D3¤]î±úžWØÙq9þ@X˜#7ÍF_F5u¬9~˜sC¥S|¿3‰ žãi½iK¾!½~†+Gù3ÙžZ!U°+‚Í)‰{X°á^=–ñÑåhM«ûý>ößÃ+³w÷!°–z)ÏÖÍÅXwk¨àP£ FÔÅ(Gиê%~í››vX jó÷PßÌ]qŠÊÝñA¯@d‰MjÙ¥Kìã¥)ÍpIÙÇgËb¨Ôõs&õ«Ã ý•$HÞc»ìÁ¶óó+@f…áP׺ùñÒgoðÔ*OÚŒø”©í½Ðòèy7‡ÆÓ:ò½[ÿ7¶ä³o&ÒH›NFvÞ ’££=%µí4'ñ<‰ª‰.·%ƒ;•àð¹$rTt¥ª*&Œ¥UÄz©¨Ju:ÏìMC“)PUý"h”»„X’Òm'©ÞþçÓg[&Ž=ƈIè°k‘Ï>Oç—ž¥iuã­}á*8ÔhJËGêb”›Ñâ‘:h:`ÑÂtø¨)NP³•wiÓî2oy næ2õÍ`L²„rù*K§mÀ’|‰kê5mNx}g4RrDn%§-©É»mÊ"´ÖûóÁ6ý`yÓùÂôIMÞW¨ow2LhÐS4´{‡-û¯ÒÑ«2Ú´~>%Sû…@Ê,‹Œ¬Í ê­Ô]ïF°ÃZ¶­ÜBïv:çp5î:YjÉ™–Ûî͹¸…¹Û²§ÆüƒQ"&¥~¦$\ÂG³tÞyþ9ü?–,Ïk’–ÕãZà.2¹Ô b×£ï̳´xo¯ú•­%z÷ŒtkÒP9€J|C\’süŸœÎÊáü'/ÒtÒ›U‹‚ý¥toÍ’Hø7­Ž4{/ÇR^¡ò…ÍüT›‘u“˜5#GÔ£Ö‰½œ‘jÒÕ×`»Ó›GvÂ1Îd»Ð¸±YÎ}F’‹ôìmU¼YϨ»\o¦]åVÚ…ýn¾t„“Y&DTǘWgÉÞ‡f L,;x”ø¬HŒñ‡‰É4Ñ Âûæ=7ÈJ(¤ìÁE+_2³†’¡¨ ßêèãçÉ‹ù'.÷tÿŒ#Ÿ1*º #Þ}o;ksàäSœï¦ffi‚ó¾Î_cûÇ´gÀÎŒ¼CêB˜ºu-Kvyéíõ¼Õ™-³¼Áü1qÄLÚ•Ø»)Ѝa}É™½”Ñõóê÷þ‹:xn¾tú›~ØáûìXÖ´ìÉÁ¿eýWQ ü2ŠÐÞS˜Ö£^n‡<·€7uQcªÍcõ¬ûûOÌMrW ÝS¬Û]vüNd8ÖÊÇvŸo–ÖPë%z4ÚÁôA9ñÄ‹tëü­k»ÞÐÜiKæBd‘éR<¾¢0ÊÎÛÖ'»øÂ}»ËÍÑ"ë2—LÁ´ Ö0ö»}\~öY\Ïìæ¨Ù‡W‚KlÀñ¿ŠäÎÈ÷_æí Óxù©i¹µ Å…0S~Ë1sjc4Gí›1'Âý9Šx\ x˜ü:í ›ªìE`p!¦3<óÉ2~ìל—<µålùSqc柯ÇÐsú}ï3ÆÐ‡®»c°ÔèN¨[õXÖ c!ç>>™”0ª…4ÿïë^„2äO»ÐßÕ|å¾½7ÏÕW,yû$­$VhÙS -_Qevƒì3_1qÉEZÌ™ÂK!´óÖ3¬ÿHú™ß¥gÊŽæŒÆYw÷sìÝ8V%°ví|{Ú%$I¡vŸÉ|ú|v®L5.Ôv(¹å¥Zg/œ¥T.%eß¼¦f^!! \ªº -«³džø×òÏÝÓN¡aÕ¹þB6­ý“ÁÖŸ‘dô0gd£¨êÝÆp_úw^:G/žíMèÓé´ðuz.úÕ-–Ñ·ºu{Õê4¨ª¥ðONB~½V-9XР-¨=²«A·™_ùëfV­XÉØž+YÓgs{â@¶T˜,.Ü¿¯°E¹ÔyúôÚ­1ªÛÉïÛ­%™_áF¡Š IDATæ² ¡íCÑû†_.·¢î{¸êÙ†Æîÿ‰Ðö£Å#²?Ÿß—´k—IRõ\[Ӈע«îoâÀ|–m?\Ä©Ù[™înD<.<<þ3ž-wÄ^F§× ©™÷Õq¨¤šÇ i1„[ÈØÇªÜÜ·$¸{-ªk39+áÙ®&ùDem6IWµzDñý毹þKáãSA+¡q¤Sè Þ_õŽqÉTkß„J6¬P’@Íûذ¾R]|õËùýçÓ¤7Âñ^ƒ<¤]ËÀRÔ(÷^÷âDW©.¾úØsÌŒ’æsì>˜‚Þ§•í$ôT×®âÀžód†Ôʽ§¨e7R€!3óåâ,&ÚU4 ËŒ~/1õS3ƒû¿ËÛé•xuYCœî”Û~7wïi—q®Ù¦5‹öüý¢­DC73ÛwÆŠ“IGwp\­BÇZN¥ë3]ÅÊç 䤑˜¥bp2¼ZE댗³Ä÷1çIWýï:ðé¾ô¿ RJ¹_Õ¨Ý<”ŠK7s<>ªY¹Ñ|_¦ «€‡^B*ú„³MtîT‘’8r sˆ#†»Š*!iMøFvfLøÓ<>¹oD¯ãX§±„ê¬ÛRa²P<îÓWBùÕyëú¤ ªƒ¯~¹Mß.å–²L…ð—yÊyk¿ûf?Åãýt+ªëËÛ~ö""ÉÈ“{´'×2qý%\žMS—[+ªÌçbûE#Gcˆx\ x8”îN{ú1V/߇¯UœeOífÍÂCÈÁƒhê.Fõî K[?[Ç…š=Y5‰Ø)¹ò”õTôöÁÝÊÒÝòŒìIÿ=é±fÃä^¼ÐÈ ûÌËœMö¥mû œï<:XïM«pVnXÁe—§YØ0ï´qɈΑ膭f“Åî¹%YEë„§“DÂÞØ}º:-k4f@÷t‰Á¥›VÇ1ãON§rë;ÞYǙѹ_מƷ4” FW™úVŪz/â¯^!¹Ê#_^6ÁY’\#xã%/^]1œj/ž ñÄ~™tßV<áWHÙ +@2»Äìäl_³MßeÅÂo ~³¾òŽýy–d‹ÔKìÚñ7=êã¤yHï&)–û]n+³ÆèEÚžw|ŠIáêŽ÷ymò9žœ6‡7ê‘¥lþY3œ¾«´ôû /TÓ#©i˜Ùa{jóÁ·ˆp)Â7§íéÒ5õs&0Á³?Oyœgýìd7E‡†²»E')–¸àhIçú…cü´~%ÛS½èò¬öR‚õgt^´lãÃÜ…Óy?*çëy ¹xœëyF_úŸO?2þZÌ„/3¨U¯&Õ+9!%Æò«6pYLsÃÍNþ•³Ð÷)¸›ùûûEDs§Ó»rWS§]vmJ¯§]5–úò´ÄÙ]›ˆQTB€ì¸ŸøúW?Œæ‹ìMAutÇQCÁ¶T¯YfK÷[©r¦ó…éSQ|{‘p¢ë ÕxiÉdNeWg@˪èËš0‹…ÔsÇ8væ"'öoeݺÝ\¨ù s…åó*i§pNõ¤cµ;¶í‰x\ xè”êN»’™Hü_[Ø´âsÀ¾B5ê¶Á¾íðÊû#ë,¿ÌÁ’ú9ƒz-ÊçpÝéõÃêË\q ~s!óÝf2ç›E¼DŽÁ ÿGвmÎwM“ð¼1¦ [0´é@ã­SëB^âI·í|i §¥·]Áû¤5•i3°ÿ›¸ž™_µ"|D=z~Æ—ϘÅ;k“ÈÖp­TV~¦Üå•J‰i9¸Üq’2²+ Í ãç°xÜ2í+Ñ«.OÔ*îº'jõžÃ‡Ìür*CT<š2pî0^¼qþ‚‘ 70ßu&Ÿ~=Ÿ·W¦ ¼x|D(ùU±]ö²/Hf~™ÊY®Ð‚ñ³G2{ö }i Iš øÔjÈ3“¿¦­.š>ƒßaJðrÆ7Ë·<ùA¾›–1rÐòÛ¯y¾Â«o|6骪`±äpëƒ*X,ääÈäÿȪäc±Pô =¾]¦1×ü1Ó¾œÄÈTµ"ÞäóÑÏPµ°Óúþ“hqñô@¿}1ÃÞ\ h0:»S­^{F~™çCœÐä\.àY5ºMfRÒ'ÌY7‰áQ9ÈöÎx„äªEÂðïõÿ¦~(XdWL×w°jÖ*®fª¨z'ªÖ}Šá³ûÑÎS—{P RømÅÇ,·àêÓ€W&¢_°Cñ¶’M‡Îæ}»iÌ_8–ÍŽxùUdt‰ì«Çøai4²@5à^§#'vÃß #IØR½…È¢[ºïJ•'/‚>Iº"øö¢ Ç·ÝË„.ý€}=hå¥/S§ðš5„Á¿JTö¯O³3èÞ¶ž·4g&îÈy§†øßÑxˆx\ xøX³4ÝêÕ«ÍO<ñÄ=E~Û¶mtêÔ鎀ïÎòIE*{Qò¿[f\ùÖ¶œUEÍç»$ I’‘ÉÕ ë6ö€ÞÕŽõºxó»Ê››·Ýoݦ GU”Ü}Úye–˰o·*{IB¾y˜¤5]Ìÿ|>Yå>|›ü;ýÏŸÁ:{gù̱|Ö¹;šÎçë¡ur¿^‘Ï÷ä%R@î¼^4»Sõf³N.à¥Wàñ%«hù}àmrÌKë.[ºå?mÉâþ|Eá”/LŸnÞfË·±}HþñÞ&îÕÌ}¶²8Íü†Üd ù[ÝôAy[td+1~Á¾\Äã5Ö¬YCëÖ­ï«Ï¼mÛ6ºtéò¤çýIË÷ï ³TÏ´ç:ð²¼Óëa"!kʧl%Yceÿ 5yÜ}M’dŠ,¶ï-HöV®K2wš@îþ@ëY¦Åî#®Ò“ .è3lÖmª8ë~»| “kñÉÝÖ=ÿV”üï–YJar–$d«/ÉV=ô»)VÒµ–×=§{ó9¹LïåÍOá2²í“ “Õ¿ÓÿÛn*@gï*²FSÀ`eQ}[avgæô÷_±W®Š·»#\ᇥk¸Xµ#W·³éo¦U@ìP˜,îÏWN¹Ñù"ê“í÷aCæjÿ:E’’Ä«>f‹cµô§ÆéeQütÁ÷ˆx\ xØXí´[,Å´1M V{çby¼@ @ «vUµú!_@ @ «vEQt9@ @ ÜØÓ.@ A)EìiÊ*J"DÏaÎÖód‰/@ Á1¥.d`îkOÓqÖaÒ”bîá¦ÿÎÛ­›ñÜ‚2î5íûy6ç*¿®ý‚G±”ô9%)? <#lK ‚rÖÚE•Òd·u"¯½¿Ç×W±úìÄ‚€å:û£ç2ýÿqàBSU¶éÁ[ýžÄ×XÇrRÿþ–¹sV²åÐyÍ:œ+{S¯uÞy=ÙžJU«QÕÃMq땤à± 5ê‘ó¯b1dz'z!K·üÎ_§Èv©F@½GéÖï5Zû‘%ÏZ.òENL‹±`=Ždì—#±(*÷Ý_/J^ëÞÁë„ä'({¨f.þ²’Y ×ócÌ5c%êµêΈí©ã¤¡Ì©rÿíÁ˜ÿK G°ÃÙ£õZ´ç•WÚZQWpKÒ7  ‰‡–2bèR2ÞŒfi‡*èÊÜ{5srawº¬¨ÄGßÌàq7Û6´smFÇóúKxÕ[_zí_IdÇøÞ¼û¿82T±sñ"¨ñtë÷2zÚ•‚²¬_Jòa¾˜:‹U»ŽsYS… G_æ­!í¨å(#JÚI6ÏŸÉ¢-‡¸f¤J½VôþmýM(çVÒµË|NY”»z ?üŽ…­\rc@PbXí´—>®ïžI¿ö’ƒQÌ6Ü?’Œ%ECöéäíLÆñÍ|ºx"ÃýXÕÛû2æ}•ÄÝ|0ð¶:4§÷àž˜Ì\>sœ¿eŒ2 W£Ã„yþ|íd$~®:ÖGUŠ’—»/'ΣCIÈOPæPS²pÚ&®‡wáW« œüž9K¦2Hõæë1 q*cþ²I¾”@vµnLÑ'%Ë'cý²iôýåæE ¦±‹ÖzÀ¯+Aß$x X’N°mÕ|f®ØC|ŽB­2Ëè©R¯&zóQÆeñ˜«I2ÿfÞð‰üô6³_¯ƒQ–3q‡N“åЀºJ{Hj&ñüEÒ½_cÚˆ0sRˆÝÏ7Ë¢öÇU¢ÖŒ $¯ü0°©_9ùjÔ ¦_Œdð¸þ˜±bêdz^5²aJk<ädöLÌû»kÑwÔ ›ø¿¨)LdÆ=z ᕟdÂܺd(äuÚ-Ämý˜w¿q"Â×@)­Ê<¥ÝC}~ïLØCÃ1ï Ÿý6û„s¸dg÷E#IÊõµþ¤íü…)Î’ö»|ÅŒùì/ìO¶ç‰‰cx½‘)wÆJ} Y–À˼®¯±1|ë‡ÖÍ &”þÜ0‡k~æÐ¹DTƒ+•«×å¹1ïÓÓ/™ÿM}Ÿù»Nw9•,É‘ÊušÑcäP:Ô2Ý>#¦«@íZdVsÈÝ¢¦sxÑû,ù» /Ï[À€úÎhe hC‡—žbù›=ùôƒ9´úb,Í]ïxö’žÊµÃ¨@ƤØ*‡5!Ș4HÙ§€+ßáÙWHÊq¤Òe̾ÊÞÕ3˜±öN\ÓP©n+zÈsùêPļævÌ'?5mSßgþÏ'‰»’JF¼ÂÚñò#2¿nÞž˜kHühÞí-ÞéX§™Ù*ÄnšÍ‹¶r8!ÕP™GÏfÒsUÑ ŸðŸBr cìêhd;]îìL‹·å­ƒH07ÀdÊ\ ¨ª€³ 6 ‚F‚&Íx40“ö¾åËc}hÔÈÌ/ §0ï‡9—D¦j¢ÉÛK˜Ý&ƒÏ»Y±-[¾GIæðºŸÞÅ‘‹)h\ëÐù“Y ®ç€œS›”Ùœß<‰i;+òâøQùh2Wv‘J{ßP¼¥9r*¥ŽÈ<¹™ ¿Ç»‘ãÝkÓÀQBRR8u$É' oƒ„D6g¾Í€{¹˜jAëâM“ƒx§gS<´X®²kÁä»íä™§M°m¶Ú¥€tÛyÞ¶"׎kÒ A.r®‡»ÅðÄ{ûÙo¦¾}¿”ŽšÈÁè™LÞÅŸñ*•#é2x(]ë»æÅ$÷ÓÆÙÖ¯ìó?°æ Ä#“†Ó¥¹+Z©þòžyg9ß]hÁ«gؾç:Õ:¾É«­j`'C Óßl鹓}qfÂk¹\ñfz9qù|ëêžJW;±×V xXí´—ªpÉ|ŠïÎårûé|Ò\fÁœ‡] ²ƒ$ç[R9³û+¾9k¤é°@Lep6GW±&•ÙÀþÍ»9ü>ö2H·kºªX°ÜüÚ¡™“Ëðê‚K4ìÚ—VB·ƒ)S·ñ{¼™ž>©Äì=È¥ª=ywTmŒ)§Ù¾|>Õâ½v4LùFÛ%Z~8’œÛAI=ª0<ú ¯» »Õ;Fcô§ãÀgYõÆ&–ÿÖŸˆ6î·?›Ÿ›å¿õ7’„tG½ô¾óæË ©sŽ—~ÆÇôxG¦‘ÉÌñ¨¼m¤ãà‰ «œÊž%Søp¨Lµ5#i”™ròºM~–<ùTëÅ{cêb¸z€•ÓW0i¿OôêÍû=¹²sÓf¡b½/Q׈,erÌFyB®E3ú“-;cfóªh¯_$ÅÇ Ý¿ÒÁÃEFg¯¿õ_5ËI ú*>¸êJU TÌäÙŒ$z:²IÏTÀ’Ä¡í»8UñÆ ÁEIE¨ˆV:kݶ ô=9Ä.HÏWiÒ½?‡¸#]OÄÙÓ©kT·&”txwYÀ–Î2ræ>F–qAˮԯßî=GÆ3˜¤,NnÙÉÕ þ¸]ÙÉæ˜„„8"eã·<Ÿ÷Ã$hp«ßžã:áæ`!nïJ&/Ç”Àµ|ÒÜ%Ѻ(ç ±‹BÚ;CéZ}Oyv¬f“xþ6Æ º?Nˆ»© òIYœˆ@ïEÉ4ë9„)1ß.`F¿d,_Do–3ùÛ8/´×ã­_JÆ5R1RÁÙ$!IœüàÉ þºdFõtŧlüegºø`Ì!þП\w¨MH%=’”¯o ¦ðûçóÙëüËÚzcWæVF ¥ë{ÚKúЪ"cæTô,3¿ÈÜWjã¨9ñ° TÆP¹¶m O½w€l‹·'&2í)Ï2¸¿4žm™8ö#&M Ã®eD>û<_z–¦Õ·/;ÏCMÞǼå1¸u˜ËÔ7ƒ1ÉÊå«,¶íÆ ‚C&<Q£A㪗øµï¶žÊ ,Øüc7H€œÄXN¥©x6¨ã]S[FŸTãλ‚ùIwŒòý-·s lI›GsW4®rÝ}rËêûs¿8GÝ!Ñ i—»ï­¾çvv\Ά¿æÈ}ߨàP£1Íša”âuéG:®ðá™Nm‰4ÉH ìù}ÇHö콄¹N ìRöÙ,Oþ×,ÔkÚœðúÎh¤rƒ§û(£ Åé¯'1ïŸz‹Äµ,€J6æ¬LÒ²ÓHˆÙÃÚO¿"ALßZHÒUPUý"h”»mG’ÌVäaÃ÷„úä³e1Têú9“úÕÆá†<% ’÷”¬Í l#ksƒ®ò d}5ÕÔ±æøaÌ q”NñýÎ$‚zާõ¦!,ù>†ôú!®åÏd{j…TÁ.o0ËäßœÖþyé¹sö‡WØ´ÿ"YÍ\0BvB!vQH{¬ZO×ZÝŒ¥UÄÍájT¥:gö¦¡Iƒ”m½|$ïbîŠSTzâ K´hRƒÌ.½X²`/Mi†}òm\¡_zÏ0‚Ö²må:x·#Ð9‡«q×ÉR3Hδ€Ö‹Çbï€Ùtí´‹–u³ømw6/~2ŒH—Ûór.naî¶,ÂßéD ñámÊÖgÚKIƒ¢\Þδå×i3©3µr®S#.á£Y:ï<ÿþKŽç5IËêq-p·>¼üÆßgDz¦eOþø-뿊bà—Q„öžÂ´õpºãîì„#œÈp ¬•޲œ;Êlµ¿5sf¨@%¾!.Éb»(jî”YÁf–ûC±)å+cå[e4ÇÿÉé¬Îò"M'Ý,ŠEÁþR: ŽÅ°äMÊ“žŠ5Ü ë‰Y 9IHöîx»À‘«i(¨˜l—G÷øKôh´ƒéƒ:sâ‰éÖùZ×výoìñXGÍ vý8úÎÌèÈ<ÓêÃÜ«*ÆÍé?ã-ÚUÑåûg¯Ei‡­ûó¥ÃÄdšhá;à—/™¬Bl¬xl^ $ü›VGš½—c)¯PùÂf~HªÍ€È:„ÉÌš¿‘£êQëÄ^ÎH5éêkÈÓÕl.ý²œ‹7³'&žtÙm†]R&Êméd'ØEaí]paéæ#à æiŒ#fÒ®üÃÞMQD ëKÎ쥌®¯ZM'+þ'³L4ˆ¨~Ó.%{š50±ìàQâ³"©PrmœäÎÈ÷_æí Óxù©i¹µ Å…0“PI»xšóYîD¶§ZüNögžä§-ûèÚ†ª7O~6sjc4Gí›1'½€• $(Åñ®ÂÕ=ëù59Kÿ'ùòÆé— ÌëF‹ƒ“Ù2=ç2á•<²©*Á^‡b:Ã3Ÿ,ãÇ~Íyɳ€C‘þËH2:G/žíMèÓé´ðuz.úÕ-–Ñ·úídÕ’ƒ Ú{ˆ`%­² 9\HëRoüzèÒ^òBÇl{ƹƒœW%¼ü+¢+æ´ÛÊhÉAÁ@ÄÛ³dÌ÷¾%Œ•ÜŠ½1ÖêuH˜ó}~N‹AJNÞðD!åÑÙ»ÓmæWDþº™U+V2¶çJÖô™ÇÜ·fÿ!ÌüóõzN?ãï}ƘÇ*£/ë=Æ=˜:² î&gÜ*¸ãábF¶²õå¹Í®KÞYVn|À6/(Ïh¨Ü¤%ÕÔ/ø9ö2nßí ¥ÞšV°£BD;êNEô>t݃¥FwBÝrcŽì3kþV)­3aP0îê?¬{wÛÿE î­½K)zžø×òÏÝÓN¡aÕ¹þB6­ý“Á¶Ë$Ýýõƽ¡F ¶qZ<"ûóù÷}I»v™$Uϵ5}x-º*áÞHþ•É~‡ã«˜übUôR7^yf]OeúáL‰tÉÝwo>˶.âÔì-‚Ley+“@Pú(Åv·ï±¶n&Ê ß|Š%ÃÆsà±™Þ­Ž"P/rG‚etz ’šIN™=Ñ6IÊ=ñ¼vóP*.ÝÌñøl¨vû=z÷ªHI9€9ÄCqªšc=º¾1´÷H:…ÎàýU_á—LµöM¨”fžÝGLŽ?Ãû<Ï#ž:$‹~Î;î·,…éþ=­äÌ6“Fb–ŠÁÉPàJ}¥:øê—s`Ï2CríÒ|ŽÝSÐûÔ¡²”»g¼$Û8IFÖȘܫ =¹–‰ë/áòähšºÈXÎ &Åž šnèeY’q­A€~=ãÒPpA˜ÏÿÄö‹F ÄQø àRŠ;í qò¢†)_Òœ›N¾bujT¶¾YPDÒ±zù>ì|}¨â,“xj7kBDS÷²7Ëžñ×b&|™A­z5©^É )1–ÿ[µËÚ`šûî X%צôzÚ•QcùÈ¡/OûHœÝµ‰E%ä~ #™hØï=ºýþQ}ºs¼SZÖõD{í»¿YͶXm>J‹~²[$ý_ô¤ÇšQ “{ñB#/ì3/s6Ù—¶íƒp~ÀGIVcÂN¾Ú£àãçÑ|‘ý±)¨Žî8 GðßÃ’ÀÖÏÖq¡fFVM"öDJ®®Ëz*zûànWÖ<Ð nû%—ƒìÁ/yñêŠáŒP{ñ\ˆ'†ôˤû¶â ¿Òeó‚2ŽÞ›Vá.¬Ü°‚Ë.O³°aÞ·¼%7":G¢¶šMwºGx¢Ï3 ;Ï ¼¤Å¬Yô%NmêSÝ!ž³©÷¿Y¬Ðöî^KŠåÀ.8ZÒ¹~á?­_ÉöT/º<뇽”`õÉ© ovõ¡ëÒ·x×þuÚûKœøv‹ÏW§×‡Mp–$²ã~*Á6N!õÜ1Ž¹È‰ý[Y·n7j¾ÂÜAa8k$$0"<>gíôO©ÿæ³Ô1%stÃlveV§g°[^¼­’vúçTO:V3”¨wSª;ípçè¿të/á-î %3‘ø¿¶°iÅ?$æ€}…jÔm3‚…}Ûá[æf‹ìŠéúVÍZÅÕLUïDÕºO1|v?ÚyæÛOzɉ¦Cgó¾Ý4æ/Ëæ G¼ü*r¾ÓÞÿ=²©>C–¬%lÕ|–n‹fJôU²«àÔ÷Æ÷â©§p  ‘à72ßm&s¾YÄ»ÑIäÜðt-ÛáüÀ;öˣ»zŒ–Fs ! TîuZ1rb7ü â œÿYgùíd–ÔÏÔkQ¾÷çNר/VÇX¶÷¶—(F‚ÞXÀ|×™|úõ|Þ^™‚bðâñ¡<æW¥”Ù¼ lcÀÿñƘ6lÁЦA7g‹%œB^âI·í|i §¥·ÝÍNïÛ•Io%ðQÔ"Æ~ŸªŠÎT™àê¦ûœ¨)¤½+RZ\þŸ½û¢Úÿ8þžÙôN „:¡wD W,ØAEÀ‚bAÁ®(zÅ^±Ñ‹Ò±bÖkAŠ€R¤“Òwæ÷dž²›ÝMc Ÿ×óø\nföÌisÎùÎÌÎÖ®AÈ×Ó¹ûö逃ˆØxêµ¹Œﺖ+ÚÇàÈÙç±.š}ƒI‘¯0nÁ‹ŒÜkS£Y7FŒ¬Žéw IDAT¿›k“\ïòÈ(×9.Õ¯Žä®% MÛÑcÄ+\wIj{‘\D+îxí ‚^™Á”ÑŸ°?#„* :qÃÓ#¹©iXîxœÅî?v`Åt¤© ‘ çnž;wnÖyçW¡Ë-^¼˜þýû{9¦ë¥!¶aâЊ®”l,Ë"ÿ†‰aVÒÇŒmË.X^ Ó8ö˜ª»¾ec[vÞ×327N⪾âÜs¹+) ¬¢û[N L‡Ï‡mYØv¾»òäGñ,'–m`:òOîîËT8¶maåÿJ„—óË·c¹9¶má:ô±Ï¹?Ÿ=æ'÷省+ ¹mïf‹áÇùs2±-'Å[žæ7Î-Îk£ç¼”µÜ64Tú‡l §e»écÇÆ€Âs‰›þ‰k}bzìÿxø»?óoëK×üWè^מÊf`æYd™ÍqîûW^Þsí7‹$\x]h`zç†ûù_äÔ5oÞKͺ$ÆGÁ¡ |õÖaöê$Ö¥V´oéÛ¶Mñc¥m[¹ûØPÑ«;‹]?ÍæÕÉð톃X5iÓë:îq-c•o-câÿFæáïöæ^$ %.!‘v½ú1øú>´‰s•Ù¶m<¾û¸}øÔeqxõ[Ü;ê-ÒoŸÏ[}kå+VÊï¼óâ«Ìùqûµh}Öµ<0òRšG™älŸÍÀÙœ­«ãSŸ3ùœþýùê¿"(àƒvgz2iv ®zr }\“·Oã0ìeÃâÐÏãþô/ÉÎ!¢’^ͶÿÌ“#žeQdO†Þ5„fÑYìÛ¶Ž¿Í8NxŒà<ÀÊ%»ˆ>ç!†\ØžHÓà g+àe*rR2LœG´¼lýcI_÷)¯OË=QM˜3´ áfåÝí´5L¼m8S×FÐæâ˸¥#âÍÃl\½ŠY¥ !-ËYôW_‚ëÑ÷‰ \a˜†?©;IÙ¹,çA>}i>ƒf#)üø|kíûš—ßÚHvv ö¦æ`ÛÁø•|‘ùÿ zóØøsÁ0© ÝÁ>²ŠÉ/}¡ÓðÈ µ°6~Á3^äN;‘îHLe(dÙ¤ü»—ìzƒxþÞnÄXGÙ·ágÞþ ƒ—îæíICiì%‰÷áS“3y=‹çLdܬ_Ø“cÑ<ÿz.gïß'/ïêÎ]cn¥YÖjf½ø~ ûKç¾Â+ïþÄúƒj¶êÅM÷àòfÑ8¬ü8éy&üßïlÙL†ÍiÍൠÒ8xÔæð§·sæg®„êͬ^ùá©,y´#þºœYsn¡y¸‰A&]ËÀÚ3qÁƒtŒÒ…,9I˜±tv?] ÃÕgÏhÊÑ~â…•ÛI§ á':eÍNç¯éO0umlïeñ‹ÿeâÙ½/•L#Š„üû€u˜UóÇñòüùkMÍ¤î ¸kÛU©äwë³Ùñés¼ôCu®|ì~þxúyäߺã+æ­28ó¹{г AFššpÑ#3ù|çÙÜP?ž¤¶ÕóöÏÙ½)‹öÓî®Ø Ó<õú¯H  ø ='u/G`²SSɪG؉¾+Z™dmfÖ£ãÙwÙË<ÛÓdÒ':Cå'¸zcøˆåŸþÌŽ¶çÑ Ü̽›sŒåtbå¿2m[XN Ày„¿YÁÎ:ƒ=*‰ð´müüÞ ž¼Ž”9¸¡Q¬6‚ÛæGpõ]c¹;!•_f¼ÀS£LêÍ».a‡Yýõl®~=£Gµ'ÎJÅlV c;±½FóÊõM 3 Âãëš’¿‘´<¿=!_ýÂo†Ò¼® V2þº“àV#h¡ SN.†™{‘əʶŸßçãít»;‰èÊxEöèÌþp;!ÝŸâ¦NUÉ=yåõ6%{?öP³ßS>û%×Ü͸žu:´›# ªRôf§“”½©Ø†pÓy<6é6öFóp{ß·¼ùÑaºÞqžç`jNîgTmw#Æô§j¤“ÝKgóüô1¼ô.ÏöŒ+~ì 7ø…¢ã_Hš«>\ßò2¶†*‚ƪׇsÏ‹ƒG1¬Y(û~ÿœiAd©³¤L‚ÃC äq_²EH­T ®Ìã·a¹ýÜAX\UÂí#ì=båíÒð\n¿¶#ÕrþáÛ·Þä™»ƒHœÿ ]B)Їq¦²aé*þ­;„GïoAÄ‘-|=s"ÏŒ "ñÝé͆éw0tj =†Œä…f>›Ä+ÃG>s*C›†UЧ6Ü &qÀ$¾¼ÆÄÌXÆ}…Êi¥$•ªÅ†â0 ÃAL“ÔfkþÍ®rüiû+¦Ldil?Þ¾$‘PÓŒS´ÿŠŽÚm²Ó bB×ðÄ€>Œ%”†g_Ǩ»¯£{Ò~îT—ÅæùOòvÖ•Œ¿¾QŽõ':CåÊQûÆŽ^˽Ï=AßߦûÅWpÍUÓ­~„û»4EØ`Cd£nœsf+"Ìœ}fK×ÜÁÔÉ+éût7¢S—1þh5r>#/u}¬]íýüpõL>úû:·µÁ¶‰jrçœÑÚõX¾a`d¹zrpÕDš7oF¸áZÈgÉßà ¢Û\HÇÐGørù®®“@ÐÑ üo³I‹~IDVÆ@G*9›ƒ‹Gpáã+Év:©zÞX^º°vɾ×àrodãQ›ÚíSâÛ}Æ4×Öðø$5o@HîøAVÁO;Sþå 3’6Ýzrz»XFÜ>µfgrøPft]ºÝx­NeÆŠþ<Ý=‚Mï¿Åò˜K˜Þ+‘/ß¶X}0'q˜˜D7íI惡i´ŽgûW×óÉò]döˆó2v%cPtüËIË—¥#^ÆÖ6oŸ[‡aÒGÿRgðÛ<}ìëÝj±é‹e,ˆþ•É–ŸcÂÖf Ó*•7’Ìe‘v„=›—²àÕE íÈùMÃó.XÅ$Ãgµ"Â4èZk'?û†E›Óéœäæ±"ÆYg´"Â<ƒ®uÿeÉÍ®ý;5\ÉøY›I4•'oJ"Ò48û´Fd ¸‰“–qÕ =¨R™çJ3ȵ¨wSÆÚiù.‹gIßÄKIŠÍáÀîCdÚé¤d8 웳ëKÆ/ÎäôGú“äöÝQ§Zÿ ´Ä9–…‹l쬃lXò o<3•‘÷1oÒu4ÕÕ½’²ö}ÍK3qÁs×Ð"ÂÄÈòþ™“[( /ͼs†°êÛÏøàýiŒX0NC_à¥Ámˆñ9ãw Ñ-øO»Þûû/öfFèÞ¿Ø’™ÃŽg¯¤ÛsÇö·±œáÿ¦aµ=–„k¡l™Xs¿üáaQaD·ã’¶F¾Œ}_L•m?ógV®oË }žH‰Äþ oMØÁÖßÿ“ãF#ˆ¹cÎ&¾²uh˵(6ƒÊàQ1㇑o›;aÍ®bp—oxùÎkXÞ• º¦½[T)º°Ò9xÂDZ»·ôšÎÈé_±#©Ó>ØC›[®¦EtË" õ@NÛ&ØÈáߟfòÊôOùeÃÒÌH‚Ò'g`ámì:öH‘çñ/k—±µMÁý³÷®e[v]»Ö!Ì4]ub˜ñµ:;MŒáæqÛ9ûñ ÜÐ$¼ßýV?Fïî»þmÛ5èÅÈ×ï¥w|Fvî>Æñy5,¡5ù˜ÝÉNO)’«u|ÿ¬ÿ`cf4ΨODn»á èÑ!š·WýÉžÌîÄ…ŸšëF#ötîûïµ<ôÄK\{áK®?Y8­8:Gç²Ø¼p>†÷à3â‹®-Nµþ+@¶§4ä’ËZëgž‘Õˆ"…uËÿf_ëÔ 5!²5ûÕãªϳ9»>wœS—Mœr²I[ËÜ™ËmØ€Z±&‡7ÿ̼ɫ1ÛÞI·øÊu—#†Ón}€‹–<ÈÄ!7°fÀåœÙ2‘jŽvþý'Ûëäî>µ}ƒŠN ]³0æ~19m®¤©½Ÿ”ZgrQó‚ŸËÞý=ïÿbÑ I "²v±|Óì¨x¢ öVÉêz1•Ï9·çòù‡9ûІ¹/¥ "2Â$óp2™6ÄÖnMc:ó¦. æ‚vÔÜÃöÔBJ1vy[ƒb¨c°wéWü¼¥>ç4êÊ×5bÀ´{i ãênõ‰Jÿ‹-©xþMðòæÜË¢7ßcgãÁÜW7™Më¸ú¹BõÄćVº^ŸçØ…¹¸N·òìÀ_¹q⓼Óc"7Ö+ÛÆ0cNãö øÖ<~ —55XÿÙ$¦ï¨ÏMOFl@|?âD±Hýg-k·íbýòE¼÷ÞÏìl|=ãïìLlÞ“?6G·¬ä»6W× +øÄÂ)ÜEE`íVû7ÿÙ³¦²7Ã&$®6Ig`Âð+i¢ßi/µ‚ß4ŽÿO¥›Ø,œf¢}ÜWçp ÃÆ‰¡n« ¹çµá\ZÛõRÃFƒžç¹ägyã½ç¸gZfx,5šu¦u• ¼*1ÃŽðë¬g˜¹ÇI•¸þùûÞ62÷;]´½}2«Žã§òèüdrªÒô¬;8çÿƒv³Ú™Œ¸îK;†WÚÏãé®Ñ˜F /½–No=ɲfƒéU'ääz\F°2³gÍ—|2k+‡s ¼Z=Z]p/“o¾”†•tñç¨Ö“ÇÞ™AçÉ“YðÞ}ç0ÙvUÛpÖ€lœû4aVáÌQÒï±7˜>æ^2ÂkrÆM­8¯yÁݲ¬å«·æ³ro&ØaÄ·ìÅ}cÑ´ð\je’š aQÇÇ–ˆ¤kxdŒ}üÿ8‰ …šÕä¹öòô´©Œþ"l›àèÚÖÏÿsl¥»¼Œ­Á \0bÿ7öƽߋÓïmC³!o2#îM^?GÞM&ÛF•šmèÕ$š 1Çenç×98S§pçMSóÕy<§½ÃÝ-#*ÿwƒÍHZyˆ+ßÁä—¿â‚’Êø‘õ0š}ƒI‘¯0nÁ‹ŒÜkS£Y7FŒ¿›k“Nõï^§³úÕ‘ÜµÄ ¡i;zŒx…ë.éBí/šËb÷;°b:Ò4¶ÐÕ<õ_‘ÎÝ)}úx|!VyX¼x1ýû÷/tLÛ²Èÿ´¤a˜æ)þˆS¹p½ÔÇ6L•qäµm,Û*x—Å00 ½œÈÕß ì„išÙ›xóšëø¨ÛD>ÕÒõ6b Ó,2QÙ¶Uðg›òêÔS{®ûcù1LGÞqì”_y¬ÿCì¾m.ã/N¨”oÛ–ÊÎÆ² ž§ÆØnc[v‘1Æ0¼Ÿ[ò8ÅÑëóظT`ÿÜq)/e7ã_^ZN Ûtû»Ö¶åIJML‡«ÍŠŒ{ä~)_^Ý]žÇE§Ó*8öy[9^¾|³m ;™=ŒÙ#·œn¶ä/ceb[N,Š›ïpÓö®í˜Ì"}Þ]_É¿î_ ô“cçO…9@¸?‡]ç,y/þ3ÝTŠkÓQøÆØ©×E|1oÞ/?v:»Öl&ÙJæ·9ÏðeT_¦žSCo—“”iVâñÆ#W€^\É=AÅÑîë³Àþ†‰oUîÛ\Pxnö8îÙéìZ[ÜØåy\tú»ç±·å3 †ý RÉçX7Ü¯ß ÖCÑ:É¿½p¹«Ã¢+¶ŸœÜ÷5_ÖÓž÷9õú¯H  ð ]DÈþ‡žÎŒÍAÔh)O¼<”Ö‘úŠˆˆ8]"""¥¦ ]Ä!¸uÁÿ~¢¾>Ò”Ûf}Ç­àzjÀÔ¢WDN»DDDJMA»ˆONô£a'úø""%¡±KDD¤´ôâi‘¥ ]DDDDDD$@)h P ÚEDDDDDD”‚v‘0A{XX؉΂ˆˆˆˆˆˆˆW¿ÌO¾µhÑ‚… ’‘‘mÛ':;"""""""E„……Ñ¢E èãLÐOõêÕOt6DDDDDDDŠUQ;PÐ[p‘@0ßi‘‚´‹ˆˆˆˆˆˆ(í"""""""JA»ˆˆˆˆˆˆH€RÐ."""""" ´‹ˆˆˆˆˆˆ(í"""""""JA»ˆˆˆˆˆˆH€RÐ."""""" ´‹ˆˆˆˆˆˆ(í"""""""JA»ˆˆˆˆˆˆH€RÐ."""""" ´‹ˆˆˆˆˆˆ(í"""""""JA»ˆˆˆˆˆˆH€RÐ."""""" ´‹ˆˆˆˆˆˆ(í"""""""JA»ˆˆˆˆˆˆH€RÐ."""""" ´‹ˆˆˆˆˆˆ(í"""""""JA»ˆˆˆˆˆˆH€RÐ."""""" ´‹ˆˆˆˆˆˆ(í"""""""JA»ˆˆˆˆˆˆH€RÐ."""""" ´‹ˆˆˆˆˆˆ(í"""""""JA»ˆˆˆˆˆˆH€:µƒvë0¿…Ž}2ÊÙÇ÷“Ÿá¹Oÿ!³,ë«"ÚÁ—¼;±üƒÌ^r€õ‡òaæ÷…oóÖ÷»+×9çoßQ_wÊkŒ©Ì*óxZYçÌ’:Ö‹j³J-ðƒv+Ý.céÖTœeFÎa–/üEkSpÚ%èݾ䭼Ž]ÉØi›ùlÜ= èw1çö¹˜ëÞÚLê¶÷5ð^Z™‚Ó™Ì_ÿû‰U»2°Ê²¾*¢,òžó/?¾ÿ>_m,E?/©’žcY›™q× †NYKšuôáœÃ,ÿø=>ÿ+¹rsþö÷/‹1¸8¥éGþ~¶¼Ëâ/Où9ç–/ãT(8\ÊÕOýÂ!g€¯Öò+˾Èå 'rî.o•uÎ,©“a½¨6«Ô‚ÊoJzŽaÄ'Ô¦võL£$'æ PIÏ9ûŽ_û—Å\œÒô#?[Þeñ—§üœ¨sËS¿È×_ º‡ùÏžI‡ÍÑMÿÇŒiïñí_»HÎ!¦F]’ÎÄÝ×w¥ú±‚dícùÂYÌÿz5ë¶À[›F-Î ß ý9+1ÜÍ]ƒüsÁ:Æ;p†7"Ú<Ñ UHIúѱ:üÛÂ*´©ÙoñÚùÕ *‹b–eß ´óÅ;›—½Ç”YŸóÓ¦CXñ´èq%· ½€fQ oÛKzX/çM™­‡O„ YùÐ.V ¿¿÷.gÓÑhšœvwÞ~ Í£}Ûn¥má«·§0çÛ?Ù•AB‹ >˜óEúׯO†õbYæ1`ÛÆ"ùÏù<þØ<2Oæõ‹j?½m÷±|å4f”TÙíØØN‹œMï2úùŒäBê…yÛ,ˉÓÏ«¿vtÀ²H£¤é–×±+ çAþX±‡èîw2°W"LÀ008‹{Ÿ;Ã01²uF«JÔGƒksÑÏÑÇ0 ´5µ”­rÃJÓJðÙ@Ýæ'àÎ-×¼î4] Eëðr^yøu¾èÆ ah•ÍØhÆž‰Ûië˜qÿ¼³)šv}ú0¸o ‚naùâxêÖïY>æ%FVµàB5á IDATÊÝ\€A ^ô¿åÖa+yìÖvDå5¬ƒ¨Ä˜² ˆË¸ïÚùR;õfNXÌáN—3òêì-_3mÞ¶ëñö]mˆŸ1•»Ÿ gÚØó¨ìe»ãË'<Ê‹ËsÝc鵟gç¥G²¨>é.:ÇT|ðu²Ķq¦læ»Þfò‚åì˱h\èò¶ÝŸòUü˜Q¼rÚsUkMõUãylv}^ÜÊsÁ¬dþøx2“>^Êß{mâ›våŠa·Ð·UlIlûÛÃé3Óõ‡¶ÍåÅ1˜9‡Xùá$&}¼ŒM‡Mâ›÷`àmC¹°±û«3EÒèêjȃ_?Í ÅIɉ¤F³®\sÛp.j‰ÃÈfǧxhæJv§9 Ž©KÇ‹†2j@'ªç[i¸Í›QÚcÙ>–ÏÎ`ëâ)¼2ç;ÖìÏÄ­Áé7?É£Ô&Äð¡ŽÓÿä¹f}ß7™pu=B ÈÙý· ›Oç¦ñ@« –ÍÏÛßÿÅÖ=GÈ"’Žw¾ÊSç'laÍ'S˜´p)kw§âˆmÆå>ɰ¾·3CiÉ‹â²ÿsm¨3èM&œý#oy‡zcßbtK7']YÔOî.ŶCië/ÉMÞ³öñË;㙾x5[;¨Ù$Ûž¿¯bS϶—ü9÷ñÝø—xû×-ì9x”,£P=öãpv}RLÿÏÚÊ[·ÝÉ¢NÏóÖ-Í ³÷œmî%OÞúäQ~˜ðo/ÙÌžCidN­vçÓït“ßÃò͇¡JCº]y£.mFt¾ƒ'¯˜ÆÝC¶°q¯“¸Äv\pÃí\wZ¼ë\ñÖ¯¬Cü:ëÍ¢çÂyqìüª˜sðx§-~LñV/F úŽ×ýK1ÎwŽãe\ÊË_)ú‘¿Ÿ-iY<µû¹&?Mx¹˜¼–°n»äíÛó•Ë4¼C^ûŽoyñEö®¥¬J ãìîâ†ö‘¹óݹØ®»»v:kæ¼È;›jÒïù繩U A†Ø\ti/Þ}pÓÆÍ Ç„»èV%èø¢ÌÃ\0y`"¡^Ç9/mä×XQvs1 hݶUòwdÃȽ#UÂ2žŸpüN­ßç„÷ùÑï¹Á—q¬¸9Íϵ]^5F·gԄɘ!A®vèÞŠð5×3öÏ?݆ؗ(oÛƒÊaü…2ZeÅsCxèï xcü4 30°ØûÙ=\7­*cf<Ì)¬ò8†å–-PæÌ|}Ök»ÙùðýõDôz‚‡®kO´Ã¦SÜn®{zŸm;‹!u·xÙ¾ƒ–¢ö¥ƒ¹ºG"¡4‹ÚÈ7#eåž:E;Ž_¬ ëÅÒ¶Yþ¡)ÚÆ•qv/~‰¿Tãâ{ogí¸79ˆ?Û *õ˜ZLâå Ü‚v³Î%Œ¹5žûŸ~†qM_åÁžÕÝ,‹Mï<Ä=sRé:`52Ùü3™tÿÃd¼þ2×6 Í›Ìã/~˜1çÕ$Ø0‰¨‰id²aîC<ðq—{€á5SYöÎxÆ1©3é6ÚG½:S4×?‹›®jM•ì]ü8¯ ¢îÔtˆt×ênºç2â"ìýí=^ç9Þl2…GºÅå-‹¦[´>ü?v6},_öŽûÚ7Dô½•±]JÞKj½*¹¢oulYN \Œ²-œN§ë;5Îþúa [«]ÍÈá­‰sÅl\• #›-ófäÌCt¼êiU’“‰IÁð·}lˆéyc¯jDˆi^-àtûxŠð=ýâë/íÃæÒÖ_av:L»Ÿ1ŸXt»æf®mÂ5_3çoˆpSRÈfË»žê9‹Ms½äÏy”Í+ÿdoíÜ=¢)áG¶ó¿3—ÑôÔG ¯ýßv:qZ¸ÓòvœÈ|ú§âûdîçë ä¾QÍ =øïM|×W'pΠAÜ7 ’ƒKæ0aÊÓTm1‰Ûš‡åMp9é¡´í«e²þë¹¼óÄýd¾ø&Ã[DxWB“Ýž öνö1/cŠ·z‰ÈäOúŽO}­¤ã\ñuÕê°÷ó./›%íGþ~Öc_/Y»Y»¼äµ¤u{ `¹|ǽ֛oyñEPÕÔ0¾`ÕWKÙÝòlꆙ€‘ïÑß5¼·h7¡§?Bÿ±çMŠŽðF\vSoÞ{`1 ~»‘.½ª¼Ûîn.ðiœóÒFþŒFÙÍýE;»…eYXÇV¢†Ã0|lce,t\ΉÖ½Ÿ§~Ï ^û¢“­ç4ÿ×vÇ™‡å eœ8b\³>±A>l/ëñ÷X®Êd=A³³ZüÝ þ8x-MkƒÂºŸ¶b&]A‹¨l6Î.n ¬9³`Ÿ-¾]rö®cõAIg4&ÊabP¥ušò¿mJåÚˆâ·ß˜Gýª°xérv\QŸÆáNöþµžäˆ¦´Š*žüëÅ2h³çXà´MníS·ï ¼Ó×Ä‘±ŠÇýÞ^X)ÇŒ V~‡4Tëv_y£Æ½Bû&qQ\Á]ì#«xkÁ6jô}…‡6!Ü4èÞ©™ÃGòά•\:æ4bs÷ «ZÆ]W¥ ÃÀ>²œí¢ùÍS¸ùüЪæA– {—/6ÝD»vE»pd¹vˆnzçtK"Ü„5w³ìîùnëÍ´oNT£Ó8«QnÍ«±ã‡;X¼zÙ§ÅæMÜEÒuÃßc·«ÿ»Ï峎ì%ÙŠ¤UÇntníÊWî•{êØ3×÷É#v¡G—$ WúYÆŒù[ˆ¿â%Æ\ß”ðc+À#+ünŸ ¸z4nÒ˜°Ü:ÊI/&GGV•Iýã¹þ(ƒú+ÈJ^ά/÷Rëš×yxP×]´N5ÙúÍ*Vy*«Çz^ê[þl›ˆÄŽtï’D˜Ñ…޵÷²âžÜ~žÛ¿Ýõc_úÁÌsœ–áÛ܇ä ÿÇà¤`_ëÄ]óúÑüù¬‡¾îu>ñÐîF–÷¼–hÉ*X@ŸÇñ2È‹/ çñÐÈõ<öÆËÜøë»tí݇Ë/íM§:á8€œ”mlOƒZm‰,rkÔ ¼~kê_²sÃrΩš{þ¸ÂsíÇ8ç¹ü+JvNødÍK\sùËÇÿÕ‹y}êÍ4Ïö½‹”ÑÛ1‹é-ð~ž–hn(æ˜íêÿY¦k÷²Øþùë¼õO#ÝÝ…¸"WTÜlwŸoÇߌa2gzn¢풼›d;šÖq!y{¡Õ‰‡5;“ɬWüöGC.¹g+žÊða¿Ò#)“ß–:¹äÑ[8-¶àE “}½xL©ÚÌã9Vñmce%=;÷ûûFá‘a™A®àÕÓ@PÌv§»ôòv+Á˜QÁÊ÷:AËkâ¦?Fòæ ŸÐêÑú6gï[Ë–ÌhZw©C˜éºCX]º¶ŽdÞ_ëØ›u1¹û†‘û_îg÷ÿÍöŒv½v}^ÏÝɶ±,‹°}éXDyt¤pù¶`äNF¡5o,bOJÍÞe ˜4÷+–oÞGº#Ã"8%£À=§[òcgïó½|¡M.ášö?2qôÍl<ûú]~g5#È𯎽s \Ç&í¬}kØœE›.u§+«íCî°èËâÇŸö/®~ ”Í];ì-ËúsÉ9°Y±tè@è±4 ÓcÿÉ.®ž}iß¼Š>^¿¡5óõóÜ‹»Eû¨oý¿(Çñg_Ÿ¿æwìó!TM¬‚‘u˜ÃY¹e «F½8X{0­àlÃ<^ÖкtmɼuØŸÝoýªÅñãæ?|ëcà{º¯—œPÿúŽo}­d㜷s0¸§¯uâ‰?ýÈÇÏzèë^Çíî=¯e3‡ø4Ž{;ÏK|>»B½Þ#™Ü}üô|þé\þd.m=Æ’·Ú}‘\µñtªœ ü-ñmäÃXaä”ÙÜ_Dƒ·áë¿cUvcni‹óÀzŸÇ0WÙNìœY’v+øY#ßàb»ÝÆæèžíìʬÊit¦ö¾%¬ÎÚÈÏ߮⊶½¨züs'ûzñxKÑfîαÒ6ÝØõâõ<üKfî“ ­x|Þ3t1=Ì+Þ¤±êÅëyÈ]z¥3*F¹ßÜ7Bé{ïMüzûT^øäZ ¿6ŠÌê®Æ=>»þo¡©ÝÊÁ"Œ®w>ۤ°| ¼zl‘…¡Û4ÜeÅJ0N²m›ìóØsI=k(÷kI5ë>}îeþçgº%96V¶ïå i@¿±Óéºb1ï¿÷ÏŒ|®}žç®ir¼‹«cà ȄìôìÜ‹=Ñvbc`¸›Aýl¿ù“~1õãîñ¢í€û•g©êÏ01p’ãë hŠ«ç¼4‹ÉŸ»Ý ”Ñ}ÍÞ±Ðkÿ÷¦ðq|Þ×Àï>„AÖñņDˆ,gñobµœàp À^ûUŠûDŠëcùFö’ÔiÁzñ³ïø°¿/y*ÑVÕ§:ñ©~ô#oŸ-Ù|â¡Ý½¯¬æã;ú¿~œç¾äÅ/†IPd-Ú÷¾–vÿ¹‚ËfÝËÈ9¯ðÁ¯q]õDê…Š¿þ!í’Zĺ۞±óOvÙµW!ØŸÀÓÏò{âm¬(ñ9á‹È:4k‘”ï;í® +/á‚»—´ŒÅ)pN„$;?–ÕÜPà˜vN9®²ùçó§9q§ß÷,wõŒ/ò^‘â·“oÇßÂi•v=lFÓþ‚V8^ZÄòC¨úÕod6L§ªŒ#þa'tÎ,Âs»8bˆá(û’³€0WV3°? bjÇ[«ØíÁGVðæ+_y㛌¹¤6ÁF?ú÷žÌ-£'0ñ¬.<Ö5ß‹ Oöõ¢þµYáOŸ¨¶éȨcxúÂWÍ:bháãÓzn…ÑtÐc<}av¡ôÊvÌ(Oò;íÁu.à¾á­Ø>ÿ-VfYyƒAp|3ê‡á¯»É:6hdïdÙ_G®ÛŒøÃJt¤N/ð›ƒAÕS'8“­[!!± 4 Qƒ4jH­¨B×"<¤áMæÎÕlv6¤ßµqz˦4oÑ’†ù/“ù’n T­‰ï匠Hêw½œ»žÀóD²öãOXŸaäSÇP;lÙEšãBpµ&Ô NáÏ廎§—?ÚÇG†¶Ó*QúžêÇ[qƒã›—IýåÏ{p|‰!©üþëv2|èÅÕ³Oç·x裙;WßÿË“#¶D}Ò_vúf~Z“Fhý&Tö¥_y®M_úXiëÔï¾ãÃþ^óTâ1Ø(ñyWnJQ–’(“9„²9Ͻ慂㔯 ÃÀtDѬ[;ªØ{Ù°/"[pEïxÒœÁûëÓ |ÓÎÚÎçÓs0ò ®ìXŧ·¦—É8燒ž>Ë»s}üîuE—1_f<Ÿ§å47WkZNk›´¿ÞbôÄMt¾çFö¬ézœØçí^òíçøë6Ò¬‡1‰ëxÝÂþfáWßñÑ2'.sýÄbya…•圙/ÕbÛ%¨jm«d±vÉfÒrƒã”u?²Á®I‡ÆQ„xÙn%ofóÑ0ê5¨B°ibšAÄ6ëLãtöìI+2ÌëEwüo³Ÿ>m“ITƒ¶têØ‘Î;Ò¹]âJuÇÏ$¦a›BéQ®cFY« ¯ÑQëÜ ÿn8¯¬:þð”Ý‘Á}ëqëü'y&ìz.h›ÿo&ïìªËÀ;cOëÆ!|ðÍ\Þoq1ì©y:ç¶èÊ'p×Gccäâö „eîggJ"ç]˜DLþ•€§4„ÔL¢ïðÑœ…D÷jEÝð}ì<š¿Xžò–ïÍ÷%<¶ç{ù²÷ü§Ë-ê7¬Nxö¿¬ÜšŠQHÓÀˆð¡ŽƒèÑ«>3fN䥹éôiQ óß${iU#® ƒ/©Åˆ÷ç1ra«š„¦ ½~OÎnèGûøÂMB ì_ù=Ëþ©C÷úeS?ÞøÔG½Õ_‘¼w`ÈU‰ Ÿû8£­ë¸¬S"3Ö±=Õý¤P|=û?o<ôѳkxéÿå©„}ÒG·¯â×é„§ïdù'³øhnøo[¢LÃûyç!M_û˜×1Å #ÚϾãÃþ%犯«ðýKJ|Þ•›’Î'%<\‰ë¶ÐüàÓ8TÚ¼8¢ ŽS‰Q¿çž±þ^ú$ƒÆI ¨…‘²•ŸÞÿ‚A-èV/à ¦í ÷råï2÷ž;ØxYº7O èðf–}ñßm‹æœÑ·pzÕ Ÿ–ôeQ~”¸Ýên`ܽ/±®Óh^VÌ[ ŒÇdïù…ÏWx8OËin(ÕÚÁ¹‰‰7ßÍÍþ˜۬cç~¾ñ)»\ÃíµSض9ÕÕ¿Œ`ªÖ«G5‡—í^Â2Ç_÷J±Œ˜Öô;;†»fOÁŠîÅóâ0 0J8wù¢<æÌ¼µ[X®è۔Ϧ¿Ì‹ 7òŸê»ølÊ/ä´¹ƒ‹Ã0Cš»=ÄÙŽ.ÕgññÄi´Ò›æQGX÷ÅT~ͨËÀ–±î^žìëÅ2i3‡çT9·Ã߯yo¥‚é9÷•j̨šñ/ßûb‰Æü’¨¸wß%pþˆYtó2òþJ“kŸæÅˆÉLZ8žG÷ÛToÜ™›ž½™+›æ~_Àˆ£Û-wrñóÓ™ûÜãd†× ËÀ$Îj‘HË!/òBÜd¦-šÃ³¥à ‹£ÑéCè~~1ùW¦‡4ÿÀYHb_ÆŒØÏ¸¹³yæë,l 8ª-ëF¹‚ryË÷RŸÂ}._Ρ ü0ï#þ8‰m‡Q½Yn B _ê˜`û>Ê£)¯3íÓ×3׉#4†êÚ“Wøç æ1ið ¼;™©_Ìä©©Xa œy[;z6Lð½}|á¨Á97]É/ÊäOzÐå¶eS?ÙÞ\õç&ï<ë13˜òñ\žý8™ì 0b«·¤gƒH7 åâëÙ{þ¼ðÔG¯¸‚GGìçUOý¿\•´OÃIÃö-¨öËž“38–ÚÍNgÄ+7Ò§axîÄíå¼ótñçàq^ǯBýì;Þ÷*ñ8WüìcT(O}ÝÛ|RÂÕx)2?ø2•2/fÑq*ÜmÂN3–¨Ã?òþ”÷8˜ GS«y/n{ò.Hv}w5ª7¿:™vïÏdþwóæG‡È‰ªIä>Ü{ï@þÓ$Úí/ ¸Wúòû£ÄíVÇÆÊqât–äŽXÅ–ñ˜bÇ.Oå,õÜPеƒ•IJº“˜zqE^`HÖN~Û’ƒóè,9;߆êô7‰áõ½loè-ßþŽ¿”t= @Í.º€:ŸÎ!û¼‹i•÷¸pÉæ®b•ãœY€·vkFý+ç¹ìטðñëü7-ŠÆ]†ðÒˆÞÔ1€`/Û›3ô©š4ÙÏ,æ`F0±õÛqõèa h^àÜ:é׋eÑfù  ¶)¥3n©Uš1ßîª#xæÌ™Y}úôñó%'ÇÙ– G‘Ú¶]ß«0¶-lëØÛü Ì"/Yp½ !ïÅ6¦éú-ØcŸµíãÛ Óm+»K×ß äµ` äÍõI ÓÈ;~qy+í±}._î $òò覽×1Ø–Uèå#¦ibË¿Û6-œG#¯|>çßcú…êãX9ãû•¾~ÜÛC;”¸þ|Ë»ë‘IÓã 嵞=æÏ—2ºïÇÅ÷ÿÂéúV—¾çÉÏ>i[¸>~ü%%…Ç"·é¹kKýÊC_õá,¶Ïuê¡^JÕwŠî_šqÎc]ù\'eÙJÞ׋-KqcT¹Ì!îæ‡ÒŸç^óâfœÊK=ÿ¹dÛX¶í÷¹tìNž^¤äÃ\ãWù=üÝ—±¢íî×!ž×F¥-cquè¥_àí<-‹¹¡Ð1ÝŽc¾­¬ý_q×Sˆ|tŠ.:8ó•%Ãt`>l/ãñ·ì×îÏ:¸;OýÃNäœé¦.<·KѺ1 Ã,x¸øí6–•oÌòÔf•`½Xú6+°Wà´MÑ’zXøºÝ—òù6fxó}µxñb ÐHÒrÿ;šïßé@F¹Üi7L‡‡+ަ£èÃ01нDi`šRôõÍÒ(ú·‚y,MÞJ{ì¼ã{+Ÿá¾^‹¤ã%›†izn·bÊX\}kOé*—›r–¾~ÜÛÃqJ\îóà{ßõ¾ñùó¥ŒîÛÀ¿t}«Köõ«O&…Ux,*¶òïç±®=ôUÎÁi—ª­Ê¶ïxÏ“§|yIÛç:)Ë~Tò¾îʲŸíîÃñJZ·¥?K—bÚ¬À¹dä^‹ç__õa®ñ«üþîËXQ†íæén÷)Q‹ÛÇ[¿ðvž–ÅÜàþ8%Y;¤m[Åžêç0¼e¤›í>”Åï²–nü-ûõ°ë³Oç©?c؉œ3 ïãÃ\á­n¼÷I­¬Kßfö œ¶ñ;o¾ä½<ÆŒòs~^DDDDÄ?QïaÎ$‹ Ð’þ쓈ÈÉIA»ˆˆˆˆ>Ã$8´B~øHD$ hä P ÚEDDDDDD”‚v‘¥ ]DDDDDD$@)h P ÚEDDDDDD”‚v‘¥ ]DDDDDD$@)h P ÚEDDDDDD”‚v‘¥ ]DDDDDD$@)h P ÚEDDDDDD”‚v‘¥ ]DDDDDD$@)h P ÚEDDDDDD”‚v‘¥ ]DDDDDD$@)h P ÚEDDDDDD”‚v‘¥ ]DDDDDD$@)h P ÚEDDDDDD”‚v‘¥ ]DDDDDD$@)h P ÚEDDDDDD”‚v‘¥ ]DDDDDD$@)h P ÚEDDDDDD”‚v‘¥ ]DDDDDD$@)h PAe™XvN6¿ÿñ;,Ëd%ŸfMš‘X/ñDgCDDDD¤XŠ ÊŸ·Ø@mPþ*">+Ó }åê•$ÖO¤gž†Q–I `Û6Ë~[Ʈݻ¨]«ö‰ÎŽˆˆˆˆˆGŠ Ê—/±Ú |UT|V¦A{rJ2‰õÉÎÉÆ¶í²LZÓ4iÛº-¿.ý•Z µt≈ˆˆHÀRlP¾|‰ Ôå«¢â³2 ÚÁuµÁ²¬²NVÀU¯6 ÖEDDD䤠ؠüø¨ ÊOEÅge´ºŠSžTµ""""rQlPŽ|¬ZµA9ª€ª-—;íê"""""¢ØàÄ+iXÎLÒSwrpÇb’÷ü@ú‘ÈÉJ#8,šju/¦NÒ „„Ç—CŽ¥0í'Cu+""""' ÅåÇר $m`93Ø¿ý+l›K•jÑ´hß…°ðs18Jfúnvl]Ͷ?ÆÓ¨Ãý˜Aa%-ÂI¯¢â³ò Úõ w¹°°ôx¼ˆˆˆˆœ4”_cÚ #3›°Ð`R¬a÷úqT«Dhx"{vl!4,Œ*U ‚[hдkWþNò¾ÄÕ:85ß¹UQñ™î´ç—³¦Oã×Úƒ¸ó¢z„bß;I«VDDDDN='ulPWø´ûÐYÙ9ÌXð ÝÚ7¥vä¿9°°Î8Ãjâ®ÆáÔd¤ï¡vj±‘„ú Ø»ûÄÔ< Ã0Ë 0'©“1h‡“øEÎÃüõÃϬêÙ˲°ÍÀ‹Ú ;ðò$""""âÉI”Fžƾ´Á’ßÖsøH6Sæ}Ã×¥fó»¨^÷ÂcAfú>önœÅÑ´#Ä„¯#"ª3™ÛÿÉMû$nc+]kþdgTK:6ˆÄáçÇ+">+óK"Ç®äTèÎý|>ê .¼ï{åX¶¥üô}.ÅÂÝÙX>¦çë~ý6z¼HDDDDNå¾FÎÚÏŠw_æ¾áƒ¹¬ÏeœÉ®¿ûyÞZ²lëįßË3®ð56ð%­½óÃÒõtìÜž ¨f/ÚCjèńǵ$($šõ¿Žeé‡çñϺydç„aÛ‡D°Çb~œÓŽU‹n =y[Ñ´‹‰Ó濌MÌû“~=@ŽŸ}¦¢â³Êñx¼mc98c'FþmNœN §åC¾òm¶ §lW¯9)”gl`§o`öƒóÎÆ0šŸ{>×]^Ÿª$³uÍeæVård_2—ïŸåWøxkƒìì~Xú7áÕˆ©R•m{Òˆ gö'«¸ºI›æõhÐîLŽR­z(5ê4#'y¡át>óZþÙ²‰j ‡U§èqЋӅmc[¶åŸ©¨ø¬Òí¹ÿ(rR¸þmçm#û«>šÊ´OV°é°ƒøfgpÍ­7r^£H…ÓÉ9À“_cί›Ùuà(ÙÁ1ÔI:¾C®ã¼ÆQ8*øIuí""""r2)·ØÀÎàïwÆñÎÆª\4öY†¶‹!Øp-ÎÏüOlÃÄ$› ŸåÑÙ«ø7Í"(º.Ìý;P-Èç~~˜8ŽÙK·±çàQ²â›váê[h±#ú=IDAT‡rAãH×ZßJeí§Ó˜öÉrÖý{3¶)—Ž~Œ!I˜9~Ä´oþg/w&U³™9‡SÓIÏ Âétðþ¢•;´lZ‹šÍ³ãt‚ƒ£zµN9´…[6[碫·ÇÆ HA‹ÄW¹uþëVöJ#›pÚžËÝLV~õ=+¶ƨҀ®}‡3â’¦D; pú“Y)üõÉ4¦.\Æß{!¾ig.»i(—µŒqíã<IJٓ˜õöïM%‹:Üñ÷´Ø>s—Ír%Öú·y¶{4Þ¾Õ  Ý¿ƒºêÊÊ&;+‹Ì|ÑtfŽ•/_lœ7†Ñ ùxÈ= ­™ÆŠù“xý1ƒZão¦mhn:ys¤²iÅü›p%#nnBXÚV|¶€×ïÞđמäÊÄÐ }O¢eXúN»ˆˆˆˆœ4Ê-68º–¾ÜIpçûéßúxÀ€a``cÛ±-{sÃÈ‹¨i±wåGL˜÷¿É]cq8²eåöÕºŠ;okBxê?ü¼`o>î ÎÄ[iédÛ‚1Ü7ûíû]Ë-«Ar2Ñ5‚ 6øW”Cø×i陬^·3¢*Fh9N×¾‡SÒ00`æÇK¸õšžÔ¯Ó”¸ÄkøwÓ l+šÿYItëˆIèFûcäݹέ+·Îk_ͨ;›zè/>šü!ã¯É™ú3j@‡–ÌcÊ´ç©’ô:77 Ãô)&Ëb˼GyàT:÷ÂèF[¾žËÔÇ>îY4 Åp¦°æKÙ^­/wÜÜ’X+ ³QìÃâ/º‡Î­IˆažžÛ‡Ê¦ J«\‚ö ¿|ìÝëÞàÆ«ß,´ÍÂi5pýóÈïÌúh7͆¾ÉÞñÐ"þKoû€E›n M’](MWç ¯ß3º6'ÌèL·®M1ïxŒysÿâÂû;U‘/«³NÑyˆˆˆˆÈI©¼bƒœämlK³©Ùª®k=îö&‘ ºÐ³AîÿmV•ÿ»›ÿ[½‡ìÎ18òÖúí9½SsÂŒN´OØÇÊ~áû­™´®ÿ3l¡úeÏñРƄ[÷Yég\QöuàklP\ì?ÊO¿m¡C÷3IÉ:Ü[¶MZFUc#HÍvòúÛ‹xêÞkˆ®Úœ7°é÷§©^¿/Õꞇi†z._þ²ˆ¯Úѵ}sÂŒÖ$ìù…Û>¨Ë.ú¢LŒ–aüñãÓü¶r/9MëâCL™ö;3ßßNüåÏs_ÿF„›§·O$óŽûY0{5îBLn: :qF§æ„¸.ð¤»òV¥.Ö%Ä00 |k³ ŠÏ*×öúW2úæ6®Ç(rýc OÌu=ª‘µo=ÿdæ°ûÍá\1ÞÈû¬eY„îKÃÙÜ.Й ”öÁ00#Ó½EŸo^ϾìöD†T\1 í""""rÒ(·ØÀrº–禙ïnna9ì[öÓÞýšß¶ à Ǒa”’Aއµ~H†T7¾boJY{×±5#ŠVjšÿN~‰âв¯_cƒâÚ zÕ(º´®ÍúµÐ0©5¡Á&AóÿÛ»ó)ËŽã¿÷soö`—½ØeeYADÖµTˆ"Ömê…J±Õؤ%mbRü«M=ZMÖ(mÚ¤I…j<Ðh”…𒦵–Xµ ,""¬Ð]Ž,ì9;ïÛ?ffçÝÙ™™Ý™Ùeù~’—Yæ÷˜ç™Iæ÷>Ç«òiyª./×î•_º÷¶åò¸] öõË£zÍlzPžü2{2ò=¡ ñ®ÈhåøùÊ­Òúi2Nëô@x¯Lµ%Ò¾S= ZVJ™ÌÓ±O_ôꢶѺòÕhÑEùzå“ýúßÀ"™#÷#GÝŠÜm>õúÊU>›2¡]’TP«–¹s5ÍÚOÉ0zÂc(”_m?ø™îžãwŒQ0ä//–K§†wßñ! ýÇå6CÜY¹LÁÖ”-0FÙÊfQ­fx íÝß®Þ`•Üq&›<ºU<ú²º—®Óýw_¨Rû¨¶=ñŒÞqœ×ˆßú¦OnY X–ìà ,ál7ü€L7Wd¼RΣÕßçÑM+Ú´ëÝO´÷³ÕPz‰«KdZ}š–×§KçÕéÚ%« ϧ3èØöíêÚ½[=GŽÊå÷«hñ"ÕÞ¸Z¥óçËôùâQðŽ´²?°GÂ<H_$oG–Hk{$‹[Rj-íñ{@ îñ’ŠdîÈ2¦–vg`wŽq7Eh`¬"3ÅGr¶ó1­–öÈß. ìc¼Ëç½HÖv†wçã¨-í¶†ßÎP´åݹ€ôÙ1‹¥‘Y IDATxœìwxÕÞÇ?gv7[²›M!=!…Þ{o¢bï¨vÀ‚ ì]¯÷ ^AÅözííÚ@á"E顆NBHÛ>óþ±›¾%Îçy– 3g~çwÊÎwNH$‰D"‘H$‰D"‘H$‰D"‘H$‰äÄ@D8é["‘H$É‘G‹ô­r‘x÷ÝwUMÓ‚œ’H$‰DÒØŒ5ÊŠ_¬5@­õ­pìv;}ûöEÙЖH$‰äh²xñb~ÁV_­o•P-ðØØXôz½p‰D"‘HŽ2v»ÀŒ_°½Õ¾Eà[Dȸ¢(RÀ%‰D"9ÊÄÆÆ‚¿ît€‡ª¹g•ÝêA[àBt:p‰D"‘HŽ2í5ãîÚâ­þ¼È¸D"‘H$Ç3þÖwmñÖáïR:‰M€&[à‰D"‘;LÔo5ǃ·ÀN—lK$‰Dr p:àp¨ooà£ö -p§Ó‰ªªRÀ%‰D"9ÊÜHMñöàï Þw”—ãóù¤€K$‰Dr” ¸¿pëñ{×o±‘‹².‘H$ÉqLPŠ-p‰D"‘HŽc‚·ÀUM¶À%‰D"9Ž *àG¶À%‰D"9ÆÀ#b™S ¸D"‘H$Ç€ú ¸ì`¹ÃqD‘H$‰DR?KÀe»["‘H$’ã›à.\"‘H$’ãš .Ûà‰D"‘ßpUU¶‰D"‘H@PWÙ—H$‰äx&¨€kÚÑvC"‘H$IC1.‘H$‰äxF ¸D"‘H$M)à‰D"‘4ABŒËYè‰D"‘ÏÈuà‰D"‘4ABìÄ&\"‘H$’ã9.‘H$ID ¸D"‘H$M)à‰D"‘4A¤€K$‰DÒ‘.‘H$ID ¸D"‘H$M}cG°z·‹©ÿ-¢Ø©ÒTß‘âñix|MsM‡»é§ÀåÕð©[£ô ´H22á”xÚ§åî‰ä¸¢Q¼ ÔË£Ÿî¡cN"mbÌœ,Äèu€ã3½Çßc”N§ kà+lF*4UcûþRù¿=L¿2D«î(Ä*‘H$õ£Q|É–22â-d'ÇÈÍa$G”£R›t‚ìä ŠJùïê}dëv ú|G#æ#‚ªªøš¿Õq»ÝÇÚ…CÂçó¡ªÓË¥( v»Ö­[c·Û%IÓ¢Q|[¡‹³;ØÞËŒÔoISåCC4‹Vl`ØY-‰;Öî4 Š¢ ÓɆÚètºã&_TUe×®]üùçrz÷îÉd:Ö.IŽ1*àûK< l…".i²4O0ò³ÞBZzFƒ»ú%’#…¢èHOÏ`çÎ]ìß¿ŸŒŒŒcí’äÓ¸^ì$=Î$Å[ҤɈ7QìÔ@ÓÐŽ¿)’“ŒØØX Ñ4MMžä4š€{U2‡›d»±±¢HŽ Év#N—OŨȕ—’c‹ÝÃöíÛµ’ã€Fð}]¤Øuèe—£¤‰£S©ö(ö9Élf9ÖîHNrl¶JKKµ’ã€Fð‚Rq¦ãs%•DÒ@2Œì+v‘ 'dJŽ-FcàŸ©o4ÊΓ™ î;ã|û‹d$˜P„89Çi\xmÜ]üØífÜÚ‘èp=j9ÛW-g»­}rl5ä ´!©?¡ò; ñ&ö•¡iÇÙ,tµœü¿V°ÝÚ‘ÞõL‹ä8ãÊÐf³QVV&ü$'¨€‰Q¾ƒ¥.š§ÄQ¯&¸{‹¼É쯖±fó^<±™´ê8˜Q7^Ãé9މn©ûøø¦ËxvÚ~5=›¹×çb —QЉ¤Œ 2£#ÿ ëyóXsÅÛ¼“c£rÑJCl4õß=:–Gþ»¯èl$gfЪç9\{õ9tiuâvž„Êï0¤Ä𨶝MS Y§ÝûøãƒÌþfë¶P®D“Ú¦'g^9ŽÑýÑ7F†:Ö3ãáGX{ù fe[í·«îçÓ[G1És9/¿8š.1JU Ë–pßð‡Ø;v6o OÃÐX•B-â‡ÜÌã?ï ÔG+I´êqW]y&NàúxeãïFot÷$Ç/Ö…^Tê WljDýÖÊþæÕ[oeÖz;=.¾€›G¤¡/ÜÈâÿ¼ËÃWËâç_ç¡ só ïªÏ‡/ó*ž¿³6$EÁ’–FT¤_™!“‹ÿ1•‹„@©G„ªªhµ÷k †á¡x÷^<™£xvBO¢Ë÷“¿u?}ü/nøà}.›<•»zŃ|?:Íï0$ÇšY±q7Á«´V¾–7'ŒgÖ:3Î>ŸÑóITŠÈ[µ’ÂFÞ“¤"-‡Þqæ¯ëÞõs¹çédf>uÍ¢Æ9Ÿz8ö냇ƒ{öáÉÁÓ·wÇâ(`ǶõüòÉÆ}¸á“^b|Oû _ë›Ç6›•ŠäLô“œ ~$êCi™ƒ$»%¼~k嬚ù³Ö§råÔiÜÒÙ˜ô¦qñ¥gñÎíc™úÌ4†ÎyöB¾i"oü¼ü½%¸¢âÈê0ˆ+o¿™ ZWëvò°äÝ—˜òÁol(Ô‘Ü~(×ßs+¶²¡S÷ðÍ‹O1ý×™g/Ì *`vóë×0pºÿïnOý¯ (dú5Õlh{#û¯–°ú“iLYð +·¡™âHÉlÏ>Îõ­Ì5z34 ˆiA·=é;“á—ŸÏ{weÊãÿ¤Ûìpz’¡±bÁ¿™üþ¯¬Þ­‘ܶ?#îÏÈÎqUy¦³jáËLyÿWþÚY‚.®#ž™Ìí-6ðÄ¥ãY{ÅlÞ¾:£oþ|®õ6-'Ïç‰.e|7ù)¦ÿ²‘]ûËpa!½ÇùŒ¤ðû¾bñÆBDB ޼‡.kGLE„‡SΡò{hlÈÞž¤X %¥åhZ›¬æ`õÛÏ2k]3.™ô2·u·c:õÌ‹@((¾~›9…7~XÅÖ]%8±ÒëîW™tn*o!KL啳ñ€BR»!\;a経F'¾—‡ØQÂÚ­î EÍ:ÓlÙ˜Ùœ×nè„M'üKçÀ/-i÷„²«°üÙQLXy&o̺‘6&Qö'¼Ÿm×Íâ‹Ó0•‚¯îæ’É÷,§Åëü÷Mó§%&—.ݺ¯Àé\4ü\Þ¿w/?1™.3æÔD=B=ÈŠ…Óxeá"ÖìÑHjÓ—Ën¹Ë;Ù«ÕÇþúØæï¥èâÚré“ÏsKnGÞúËß`æ¨,¢xw,dôµsh1iv*ã‡?ÇŒß6²« 7fÒºŸÃþøâ[þÈ;€ˆË¥ÿwrÿ%mýy6O¢Ñ©{ùî¥ç˜±(]ûËp‹h’Ûöãê ·qA++ºpe¢>Úl6òów?)9ih”¸Ç§âq»‰µFØ)¨ì/æýßLƒŸáêN±*}¥%—Ýv.ónûŒwþ¸™~CKX¿h;Ò®åÁñm1—oeÑÂÙ<3f-ÅoOåš\'kßšÀm Ì\vûÜ•RÊ¢YÿâÙ»2çÞMOSÿXÁîôëxøžvXJ6óýœé<·ž¬wM òÀáïù”+H|;÷¸†‡ŸÉéoÝLìgÏ0}[7îêT’ Ü ©>*ÞâÙº€‡žÿ óxq`:ú»(ÉŠÇPÍjò%OñìyiD Atº EÖ°/’ÿ^6½}׿±‡n#ÇòT·d”]?ð¯¿aÙ7×·2)„êéè,¹ Ÿp)ïy—·ÚËÐá lž5žg3àº;x¡µ`ýçoðÒ-ãq̚Θ–&á&ïíñŒ}£ÞWÝÄ3]á@öTÿ @TŸµújMõ«ž¦Œëyì˜ –3wÊ&ý/a׿ñë­ìÿy&“_~„fæpW{ Š8ÌrÖ…ÊïÐU5ÖjÂëuáöx1jýlÊþæÝOó‰êû(×t­o ¯š·ˆ•?þÆ–„‘ÜskgâÔ2”–ñèp°vö=Üù¡…KÆ=ÂíÉ¥ü>çß¼p¿Bú¬;ènSˆëx7=p qÑ>ö,Ïä·ŸfJ«Ù<Ñ?]@T“.z”'ÏJ%JQˆN‹FD´««ªëJÆ…Z' \;—òw‰—‚?6Qza ±Šƒ¼ß7â˹öÖª‚=!PLÙ\xÛE,÷>s¾Áųåí»¹mv ý®ÇÄ–‚_½Å+ãïÆ1ýe®kaB7›æÞø™…ô¼b OtN„¢"ì)Q iø|>|š†Zñp¢úªz¼¥l\º’=éWóÐ=í0®ä½—ßãÅe©œzÍ5ÅßNÎíË)ƒÚcQ0dP{tWÞÁÌ7—sñÓ}°•.åÕ÷¶ÓþŽyÜq~*R÷óÓÈwødý-ôè¤lôap¿öX”~ôÊØÃï7ÿÀ×›ôè]·÷aåœ5øÉªÿ[Nᕟ ·-‘Ó¯®~’Ç'½x =îÅY©QAǰ|%{(T£Üg }»ØÑÑ¿xV…17Ë¢Mël¢DàÆ¢ë5”ÿݳWðÚœÄ_ü /Œë„M¨û ˜=ù›°åP;ßMé]ÈÑ¿Ëßk÷â(ÞÄ«s6‘2j:OŽnC´"Ü;×U70{úR.}~±%K™öÎF’G¾Î³7¶­šl'¢Ìrn"¿ÃåŠ$Ř(*qo«qÎ[´‰Må)sªZdA“ªÝ¢ƒû´Ç¢øó‡’ßxãƒ|ÚÝ:‹[ÎIÁ  cJ¿^;ÿÛp#ݺEcmÑŸS>Ó®Û¸‰/þÜ…«ŸŠEm¦„,Z·j^™­ä÷ˆvë$YèIpO_q;·þóŸtoýÔš³§•, k÷‘¶Ch£{‰_Ö—q~’••ÿc/ žµ¿³ÅÙ.ºí,Zå¤ùÅ]‰¯g¸)½Ùú÷Y½~Ž’Í¼ñÞ’/…G¯iE´"Ø3çè[™3s?Ý{é2¦ÏË#é²—yrLëC¨–œôëÙ‹Ò…´=?qÍ{Yœ=ülúXDWËz„ßÿ·O»l¢"äI·6{2°O{,Jz¤íaÉ?ñݦqtÏ ^†á¨˜¼&g¢ŸÜ4Š€,÷wŸGš.7o¡T´kð·ˆ5ªwë EAQJL;NëlaáúÕìóôÁ´o5[\^ò_Á€Iá5TŸŠe­s]æÔÖ$ó)»ŠÕš>TüÝb,/=Л˜À a°“­C $ŸÆ}ã?gøÄ¯ÙÝîN&‘бòfQ-B`n})×õüÉ®dðáŒq §·‹óéUØ¡(U-ÁZ6‚åAuÿ½{ÿbƒ#šC[bÓù}DQüBOŸÞÃPÑè÷ìù›<—®ýš]aÓ’Í€®6Þ^ñ7{݈޻ŠN]ûeU…©r¼ÒfEüBTÌ'¨&¢iÖ"\8èö§SXÉŠ…¿ ËÑÏ(ç ùä8 KÊIŒ³Öè©ÑTÿ C”j]Îu¨hJiÿøÃºö®a«ËËŽ]é/ÖL‹yw>ÍÀÞÅï1uÎWü±q/½Ã‡þ ŸV5j*ªŸjõ²k©ÓЄ™×<ÊM+neÊ3Ññ‰¬jIˆlWëÔ!Ù^fÿœGyß,Vý²›ÜQWaXø¿ïpÑ.j¿&1 {úêyU½%^{Ç;}Ô4Ü»W³Ée¥sŸtÌåhʤ_çhæ®ZÍWL{þ"Ïi¥sŸŒÊ0UqÔîQ zΡÕ)'ñÙqà*ä€S+•@¦þ.(ëªh‘òº}ݲ7&·$‰ÏÙ}в #aµZåLô“œFðÒ2Iq‘7¼ÐÇæÒÜ¿¯ØJÙ¥éDÕj½8¶/'_¤·JÀ J‚Û0èÐ4ŸæªÏ‹Š‰þLæŽÕÇß–äxôAl½ ><¡Þ-mÍ M»vÕÆÀ«‰ŽZLÞÿòpªê†oùe×ùŒÌ ñÞhS.£&¿Oÿßÿü9sydì\æÊ+×µ%š kø4¡êþk>/>tèskçr¶z5RÚ&Uqs©•(!¨št£úÐݤL¢tàvxýÝèõ˜`¡Ò#p㫼‰é1@õâ;å|(ùí/ó‹qµdè홤EÁŸ«ó)WS±m…kÁÿöyQ5}ïzŽqíͪê™9)-ÿ#~üJ†ÞÄÃ7w ™¶Ož~+¿ÑüiÑ´ÙÕ‹`þ쳸ìYtãë<ûɵ˜Õªsíê5ú Jã•O"¯ ßåÅ1hÜb—¼ÏÇÿÛÅ™†ŸØÛ‹AQˆ0>Tǵk%Û<É­›ùë£FàÚªk*‡*4Í_5¢ÔµþúèqxP5µV}¬Þÿ·Þ`ÔGÿF¨¾ÀDȈy]\ǦÐÑã㪡Ë011V9ý$§Qö…,/+'>¦;VY;rÅ9É8~x•wW—ÕX®¹6óÉ´ÏØo¨> èƒÝøÝ;Xüw †ŒÖ$E ‰mÈÔ;Ù”'HËmAËŸ\Òm‡þ¬"ªµR«ÜP9ðÛË<ñ1Ó^ç¶kxyâGlq…ú „ÞFNÿ<øÊ¦^`eÕ‚…¬)×Ðt&bMPVè¨&Z '*±5©â -ß‹ûÍhÎM,œò»,ƒ¸zP2ѩȎ*fùâ8+|sogÑŠ¢²Ú“bD%µ%Så‹ó«ÂT ·“nìßOù!'­fÙv9댇”ßq1ÊÊÊ+[ˆ•ŸèŽ\24ŽòÿÎäÃõ|*5ÏWû@ÍÿëZ’ap±y³ %+‡œœrsrÈÍÉ&5Zsû26zs¹üšóèß¡5mÚu '& hÂDŒÊ8ðªZ½íó«ºoúôsxàÖŽl™;ƒÿ¹ÕØ5~Ê™d\Ä'ŸÆ*Koú¦¥ÐcH ;¿ù’O?ßB³¡gcôOÀ 烦êØÂǯ|ÂnKFöOĜܖ,c +þ؉³"½®|¯,%*³ÿ>Ь†bVü¾£*LÅGCj lÜAyõrªÈÏ`åÄ/ª…œ'"hÙW¦7DFúDGÛ(--­Wk]rbÒ(-p‡£Œø˜èÈË„î7=ƨe·1ó¦kY{ùŠ톾p=¿}ú.ßäÙ8ó™ i¦Gxü—ìÿñ-ÞÈ9›n‰nÖ}1ƒ™Û¹üážÄ*%¾?7OcÌü¸[Íð^é˜ûØVœÍytäÞ {0åÿ‹ÅV­ŸUgN£]ó=¼ú·D_>kºvÀðè¾»æ ^øjÿ>?µÆä4Ï®Ÿøp±Jv‹DÌž],ÝT‚fMĪ ÉtieâÝ/g2¯Ó¥´ÒöSœ2ˆsÚ4ì‡)âú0úì8nŸù(ÏFßÀ9Ù‚m¿|ÆU£K¨‹Š6ðçÒXÌŽýìØ²†ÿ~ü¿ïNeøäû8=Y"zsËÈl®šý ™oäÂV‚õÿ™Î[ùÍýToìB âú1îÒt®Ÿs/÷j£¹¨k*¦òý”geXËtN93›Wߘ̓3˹¸Sºk9p÷œÃ.gCJðüîv½}|L4ò6¹aZé>úÎ\ú$3oÇÚáçпM&ñºvm\C~Æ¥Ü2$ µºˆElF_­>ÎCâ*ÎٹŸüâ,Î:·¦äv¤1—…oŒíôŽd˜÷‘_ZaCCÓ'Ò±¥‘÷¿y‡í. ”$÷çŒöáíÆTOh¥ T÷MGê° Üúý üs™¯ò\$ct]ê .ÈÉ¿ßÙOâe×Ðþí&p/QÄe¶cÀp7¾ÊñÍÚݤ&:Œ}‘ã^çÏßᙋñšâh1` ƒÎnKLÖpþ1a/Îy›§¾q£QÖ$:dXQ„ÂNÿ[ÆsÁ3o2÷ÙGqš’è}u†¶Ïo·Æî5Áº²}2gÍ£_ÃYéwu€.‰çµãåÉœ>4“%¥?gçÎ`ª÷L†eFù}¯Y(Ø’âQ~~ŸÇx ‰éäô¾‰É#Ϥk’)p‘V×<ÇdËk¼úñË<¸O#±eOnüç8.o]ÆD»1ÿâŨיþÙ[<9¿Õ”Ê)·wepn Y—=Î?Š_âO^â‘w|(ÆšµèJûX¥Z·~°îl­ÖñzæIÐájßJ¨2Œ »ÉÕ-g¢Ÿä»[æÍ›ç>ãŒ3iƒ¯×Ë÷?þÌ¥Ã/jÐæ#šªÖ\c+ŠPªnðî<¦º–OúLcá„ö˜ÿ²§`“4ME­>¦-”À{œýK´ÊÿSy EW׎Zw¶€A¡¡jEWµô̾âX­¸>…Lš3‡Š–Y ]5ý­ÿšªU.ÛrmœÎˆë¿å´s¸£m­uàuÒ&PDŠQ3O“Ë"仨–§šªÖ\JVi#Hš4’*ò6Xº·œƒåwäúºàƒvÚ` †Ú},~›šªÕ©ÇB(þú$ ÕÓ¢U«Bø'ß;W×ßÐi g·Füª•`¾ÿ}D´(Ãê¿ÏÐqT;_#‘AèúXßR0E-_jÕÇj6TŸ/B} ž–pyRÇæªß~û=ýúõ“ÙN0¾þúkFŽ9påOYµ¿€óˆ·ÀËË˱Û"Ï@¯ÐEØÐ²bæ²¢C§×‡}Ë™ºàªèêÌð v¬Â'}ØIu,Õ_ˮС ;ã@   ¦o‘üw³ù‹…ü¡d•h…øvö|vf\ÎéY&”Z7ÂHé«KÈ<­_¡Ó…ˆ+HšDí‰xÁËèðÊ9x~G"6&š²²rìö`í|Q9»¿®à„âoß²TJÍëªÂÕ=Wó¼@]  wmÐø…¿|êžóû]÷ºHv•ʲ©<2ŽjçCÌÿ«{I}Ò&Œ¾ú@ÓRN´T÷#hZBÇW×fí| W†¡‘3ÑOnEÀm6[䀒#ZFþß?ðö—kÙ]æE˜›Ñ¢Ç(^¸ýÚ[‚mR#i(/‘°Ûc޵+Ie7ºœ‰~rÒt<*—›üÄM!º %€ÇÀ»^ãÓ;ku *R¼®ªê! 1I$G’èèhJJü3Ñe}<ùhÏÈÈ8Òf©›]‚P”z½]KrhØl6¶o/ªW÷¦DÒØX­VvïÞs¬Ý#EÀ­V«|”œX­VÊËË 6*+‘m¬Öè@}”œŒq/))‘cà’›ÍFII _ýí±vE"ükÊ¿ù¦!ï;-† Ö¨Ù#.à>Ÿ£Ñ([à’“ÉÄ%—\‚iJ¾D"9©™?~£ÇÑ(¹!صkK–,ÁápÈ­þ$‰DrÂc6›éÕ«iiiG%¾Fp€¥K—rÞyçÉ–¸D"‘HN>ûì3RSSJ\&àåååA^S)‘H$ɉËÑœTØhy²Û\"‘H$'GSû­~´øuÑ÷|õÕǸ=®:çÌf ]p%;õ=‰D"9¡hòþå—Ñ«Wt:ªª>>TUÅåròÑ'ïØ,™´´ÌcíªD"‘H$GŒ&/àååò6­ñ¨ö›ÍNzz&S_{6d·†Áŧ_@ÿ~§6N+Ý»‡o^ù7?gÞÀ×dc<Þ:Žwÿ$‰D”&¿˜Õëóqð`.§—Ó…ËåÂøìß‹Ïë!;;‡ì¬l²š7'3#“Œ´tÒR¦s3y IDATSHIN"ÆÍç_~Ôx㾬üþ–lwà;Ü8Ôr¶/ÿ•_óJðª)×z¦]w—¿´’2U;²þI$‰ä¨Ñä[à>¯ +gþ”³o_ ªª†½NQš5³Ñ¬Y4.—#LH•ÒuÿaÚ+sørE>Enö”,: »Gn@’>r“Õÿ~è# ŽÎuL¿ï~VšÃ¼\[ð=ÏÕ}|tÃ%L\]÷]æíü˜Yg›IÎÈ$#ÉŠ®âuÇGÊ?‰D"‘5š¼€{½^öíÝ‹ÛíŸÄ¶o_1o͘Áö:ŸÏËõc®ÃbaÅ^-ú§oޝ¢1vühZÛÜìÛº–uJ,–cСª¾½ªÏ‡/ój&ÝÝ›®âà:l9±è¢ \òä«\,ŠœØ'‘H$M–&/à>¯¢¢¢ªÿûT †(JJ†º¸¸TU¥¼Ü¢Sõr ÷¶_YZl挧â¦^6«U; RñZSOÌ›Ì俲¾PGr‡Ssïí\Ô:D+9\x¨Å¬üà%&Ïÿ…U;KÐŵçŠç^b| ÿå›_»’~¯ûÿî>ñs¦ŸK7¬ÚséÚ£ ºj'„@¸ó˜6ê:>í÷*ÞÙË¡ø'‘H$’cN“pUõáq×=þ¿åK øi§œ €ÇíA: ÍZÂÇ,ýì7ò;ŸA¶Yñ ae'kfÜÎ-ó-\>þ)îJ)eÑ[“˜x§Bæ{÷ÒËXÛb„ð1>òfßÎè× èsõ8žíšˆ8P„=ÍHEƒ9yøDž??(!°fØêŠ7€¦ùgäW\$ºÀßšêòÓ!’:ùnq‰D"9hòîõªôu۹ݺôûÆÇê3Î}ÞÐ]躴óyêá5Üóü“\òËlœw1W\v}›[ÐZñ¦½»æ3á‚T º¤íç§Ëßæãu·Ñ³SM'"…ïÑfSgo yÔ<s;¢•* ~̉ٴm“M” ôÌù•OpÖà'«þßìRf/˜@Ç%1==­Èžw‰D"9ö4y÷ù|hš¡Ž¨ü¹âõjWØ‘œó潡£YþÃøpá n=ÆNâ_×w¸÷o6»¼ä?w)}Ÿ¯¸FCõ©˜w—£vªiÍ!¼Ó¾’ NÝúgaQ” b)À/èᄴŦÜ×›E€ÅØŒ–&á sM=üS±6ý¥ ‰DrÐôÜëÃßÔtkeeed¦e…œ¶{÷nœv›1`# BÁ`M§çycéqÎŒ˜~£ßœÈ¼Sfs׋Љþ¾Ä„Ž–jÝËKrvNs2ýÇtàŒNvyn¸®¡þZ4‰D"9²»ëæÎë>óÌ3©Ëô믿fĈÌŸ?Ÿ#F4Z·ëÔ©“Èlž‰ÙlÀá(«ïÖ4 U ´Éý*]ó; ÚU‚îÿÞ·o?”ðè#Ï¢T€Ö4TM­ÑjGQs‚™¦©x+Â(è*fÎiÕŽ… ä¼PtåbþåaþE©³!‹¦úP©i¯ÚYTŸZ×CñO"‘H$uyï½÷*5pذa‡¬£#GŽ8€òÀ§¬ÚßÀ´ÞÆ:;uêÁÏ¿|ÃÀAÑ4µ®(kvy0Á®<çÿVU5kÖrÃØñuÓ.ŠˆÜìBA*˜P¨=¬6|Øó"ä}UtºàÈT\_Ûð!ø'‘H$’cK“ïÔ©+³f½†É(ÈÎΔÊI[þOE Ù¿Ëš¿Õª–i•¯UU•åËWa³ÆÑ²e›&ñð"‘H$I“pNÏ™g^ÄÌáÇQw×–ÚB\u¾öòp›ÍÎÕWߨxo$“H$‰äÓdÜh42pà’’R)((8,ñ‹‹£]»v˜L¦#è¡D"‘H$G“pƒÁ@bb"v»=â«C#¡( QQQèõM6;$‰Dr’Ñd«Bt£¢Â¿6T"‘H$’¹­µD"‘H$M&Û‡ÏçÃãñT;||¼úÑ(C:¹nJ"‘H$M„NÀ[ü+ßÿmÕZo*Ö€‹ëÂý´5䨧Ÿ>ŒÁƒN‘KÉ$‰DrÜs øW_É…\ˆÅbÇET”‘(Cƒ·ÛÇãÆíqãv»q»]¸Ýn\n.G Ÿù9ƒ‘.‘H$’ãžNÀ1¶z^ö4†¨¨J1V„@Óü­qM€Qïï.×T(.+å»7oÅétK×%‰D"©7MZÀƒu«ª§Ë^§Ñ,» šv›‰äøh6ä ¸ÌKûìDR¢ñù4Ü^_ü߇!P}Þ ~,МìËË£ÀœC«tK˜-R›8š‹}Ö±×Ü‚¶™Ñ'n:%‰äqÔ¼°°€õÖát…nåFZ·jKB|BD{¡ÆºF3ïðc†¥‚Øáë4•ÖY ùTöj*» ’ñ©à ˆ¶¢(uÞ-~\ y8¸o3‰ø ðÊLJã`å;ñÑúF‹&tüJ )NÈjÜtJ$É BPWaKÑõÖѶm{ì1öaŠ‹²zíjúöîq:ÒX·ÛãÆíqáq{êŒuöÅW乓pº}8Ýþ¼"¸€k.vý¹˜õ¢ýº&uŒ„%h‰Tø¦fÒ¥K±†jÎy Yµh®œÞtÏ0G^/¨–°åïU”dö"îXx¹™­D"‘Ô~ä#rºœØcìa…ÙnŦ…^ÃÞaŒu«^7N¯ÀéÑpz³Ðø|*Á$DÓ´ÊVþñ†¦ih%[YµÆDiX*ûž3îâ¶&T"‘Hš Mv ÜçóáS}øT•„ÌîhhÄṲ̀&XY»­€2‡›9‰¤†ëÞºâ[OƒfcBøm’€iŠò7—_@‰ L¶Ò[¶"Ãn¨jÉjîØH^~ÅN/JT é:“kWpìø‹U›àði( ±i-i“±¾Í`c,Æëùk‹…n¹±B]§º(ÊßÈÆüJÝSL"Í[·$ÕZÕâvlZÂO›üÇvèCÖþe¬<˜B÷^¹Øt¼ø{ñJÙ-{ מ,^¯Ð®O'’ Þðy¡¹)ܼŽM{‹)wzPÑצ’ke©·ˆM®`§¡Ý;e-Å%‰¤MZÀ+&y¼*ª:ÂÎý¥””¹‰1#„Â΂2Ô cݿνͧáñzðxÝìܹ“¨¨(Dƒ;UJ·.gÅ Y­È²j”îÞBÞŸËñõìN¶U¨”m[ÁòÍnâšçÒÁnDóxˆ2ë@”=ÜvôÎÂílغš 1½éU?o,é´O7±òï¿YÓ“v‰Æ ]æ>J¶®dE¾Ž´hiòP¸uëW ̽Z¸À˜Ö©&½Ù„^Ø{PâѰéªó%^Wa¾t3ŠðQVP–ÄèµÈy¡¹9¸·‡1‹6­ìèU/ŠÍˆBy¥§šZÆÎ¿ÿ"_K§s‡4)Þ‰D„£.à,ùŸ~þ±ÎÛÃâãâ¹þº±õ¶ãoû_bb2›Ðéô˜L”¹HNŒ'ÞfÂéUñúÀåöÖë~ñŸÿB4Ío#ÚÍ•#¯jøpÏ6o+ØÙvÙ6tBÐ,>ß’elÛ\DzÇ ÞlÚZŠ1³;íslèkÅ¡·6#ÑøOŒ Ǿ%ì>àDªçll±Y+:4_ÆŸk×gíHš¡¶ŸElÞ^Ž­eoZ¤šQĘÝü¾]¥-ˆñSŒ¬Öh”€‹š- ›XÏþR/©&¸¨%”ùˆUÊ)<èÜ‹ÁWȆHypGO³x;ºŠ¬¨xêdïº<6–%Ю{.±¹Û¯D"‘㨠x¯ž½éÙ£WÐsŠRÿ›µÏ竜tf³˜1DéQQ°GG£×+¨> æÅåUqë8h­Z¶ L˜óB4XÀU×AÊT=ö Jŵºhìz¶<ˆSGW&Þ‚®Ž}gÁ6ò¶ìâ@© ¯Ð£ø4DLC»óõسۓ[´Œkv`ï`©åg1媆cýïü´¾ê¸¦i(NZ@ÀÔ˜.¢ì4‹VÙ¶¯ _|4ÅûœXšg£ËßC¡S%F)¢Ðm"!ήÝó¢²{?D6»w­a½f$£{+MŠœŒ.‘H$!8ê~(" ¿€{±l^ñmÈ®oÀ2³ZcÝg ;‡‡{ˆrG z½“ÑDNv R’ÓÉŸ:±W?Pâ`ÉVËwð×_[ð&µ¤mK;F­œkÖ°ïPœP¬d¶mAáҬݙ‹®ú€¦¢¡Ð¦ ¹¶êízÎ…‚£†¯U§Ä7³·s¥n{Ê¢Hl™„¡p;8I{qâifQŽºI~ 4:{"¶²½ä¯ßBB—\â¢d \"‘H‚ÑdÇÀFÛ·oçÓWÆ`0DaÐÐ èuzÅÿ ªªæÃçõÕëBðÖÛoÑ·__þZõ7]4ƒ^Ǻ kHNJmІbŒ!ZÙFQ¡Õnów « ‹¼‹ “"PLVÌÂ[3Lµüeš•–9i$˜„¦'ZO oÈ㎰¤Ñ¦Õ~–®ËëiTôÌ £ ‹P)-SŠ}Žzø<>´ë°,I)DoÉgç.'u d›Mè’ÌäíÞÅ.ʉJjƒUõÊ‹HÝ ºè Ú·‰gݲu¬úÛDÎr›D"‘#¨€ë•#ßqi4).>ˆÝ2ÌÁƒE¦zÙ1b$~´²ÒR b¹”X &¨X?¥ªj ®‚&“‰Ð<»9EE‰ã˯>§cÇdfd…VKOE «e˜@oµON¦…¥[ÿb.—T+”îÚÄ6‡…¬ñ~¡4$“afÙ¶Uü¥e‘kFñºðE'‘h¶af+ù›óÑ'ÇbÑ9qV_Ž.  à.ØKaŠ…fÖHk´æ”6´ØóëTQ 䤛X–ÿ‘MZœÅçÂé±’fG/LÄZvìÞB~L:Ñš¯©ÉvœDªm·`ÌÈÁ¢((‰É˜7m"_3“ÕÎâ37Ô#/" ЙShÛ©œ?ÿÜÈê­6ºåØë>pH$ÉIÎQk·nÕ–ÕkÿÆår… c4šhݲu½ZÀýúô£oユÿ_üÇ"6æ­ÇårѼy&Bò·ï@§×‘‘ÑœÎ;WÚ­n¿è`Ï<3‘Ñ׎ ? ½|+«Wn«qÈÖ¶ÝRŒX³»ÒE·M;Ö³ÊQÖ8r»µ&æ XÓ“Ó•.†lÞ¹™ÕÛ½ 3‘Ø*–ÄäLÚ·v±aëÖìñÏäzv³>Ðån$¹E&ûÖî$og"q­ê!fÂDj›\vÿ±‘* דÛ.QÙ¼k kò=h:ÑÍZ’jG¯HhÙ†´Õ›ØºzªÎH|¶D»0’˜jgc‰‹¤d¿X S")ÖMä©)$[*ƪ•zäE}ì9´Ï.dé–ulOìAvƒ®—H$’Ÿ£&à ñ ôíÝ?b¸úv_ !ðxŒË劢£yFñqÍxð‘p w ”•–±bÅJ6nÌ«œ zl^Ië>„ÔàNøEED×¼=Ý3äC1×¼=±™u¯·¦µ¡kj›à¶âréÚ7ÿD»`¾‰:ãëœA·ÁéÕì„ð¡ÚµŠ9™VÝ“hÄcZW†¤VO³™ÌCȨãS„¼P¬d÷BvíëêW°f÷dH5Ó ‘H$à(É×tîÝ»‡¹ï¾ƒËã¥YB<™YÙ|ÿãwìÞ³”äDöîÝWõaÐééÛ¯/ëÖ®«ëNhÖŒÇy¢rÖ»"ü øz H]­˜H׆9Æ·àù>®ÐeäºqZu×'O%‰ää¤ÉNbûå·_ÈÊÎBÑ)x=^ìö„$$ÄãóùhݺŠ¢ÃétÔëÎjž^¯—ïý–H$I“¥É ø_|Îý÷=@\\\½Â×ë–â-‘H$’&L“pƒÁÀ#>Ü kÂŽuK$‰DÒ„h²þÊ¿§ÕÙŽ5Ǻ%‰D"i"4Y—B,‘H$’“©‚‰D"‘4A¤€K$‰DÒ !à [–H$‰Drt‘-p‰D"‘Hš RÀ%‰D"i‚H—HŽ$¾Í›Ê?ïÃ{¬F¢Ô"–Í…W¾ÊÇu¸>x÷ðÍ”‡ylá–÷u<Æw4ñíå›IwqÏÜ<œ \+‘C ¸äðq­gÚuçpùK+)SþI+ÛÀGÏÜÀ9§ Gßœùà)ô£¤g'ßÏ™ÇÖ–4¾€«ål_þ+¿æ•P#¹Þ/x—OWá;\¡ð`å÷?°d»ãðmëøBå×ÑÂWÂúÅ‹Y¹ÓÁ1ø™HN@¤€ Ô}|4f½®~•ežšSËsç)9î¦ò#WÌ$gd’‘dEwÔ7¹s³nÖCLüÖÀYw=Ï´—ÿÉcWu"¦Þi__4ME ¼…¾Qq®cú}÷óâÏxëø q¤ôOÓ´@zŽ_˜ü:jhrаäÈÑd7riÚh¨>Þu³¹ã±æ>YFQyÎçóákJè†L.yòU.åhoSë+àÏÅ;± }Ñgw%ZœLo1SU_ƒw$<™‘ù%9‘Ñ?Iî~ǚĮ$-ý'wM_AI¸>=µˆåïþƒk.:ýNãœëãå‚wjò>}žë/8•}ûÓý”K¸ó£üªÖ¼§€?f?ÂÈs‡Ò£ßéœ3ö® t)†»6Ü9w¯^>„s^ü›òŠH>ûöðõó·pÉùgЯoº÷;ƒsÆ<ÉûkëáKu|å–i}v+ƒ ¤G¿\”/çÑ3réìªñVoþ{Œp/-EõFðÀ½‡ÿ¾z—Ÿ{ =úιã^fÑ0­ßÃÍ— l~íJúõëO÷¾ýû]j òýŸ?ÄyCÐ#˜põ õ©j1+<ÅõÃϤg¿þô9g,“W–¡j¶¾7çŸ>ˆ}ûÓ笑Ü1}{ë3ÞPŸ¼©Gºjæ×N?~½.~™ÕÕß:.[ÊÃ2rAE/˜ÊþÏÇÑ{Èx¾ÚïC‹X†ü2í~®¼älú÷ëO÷¾g2î“xjU µx9S®Ì€[æ³Ñy4û8$' ²~ Qš_Æó—¥pëÃ1±Ý,ž>-)H¸X?ó6ƾYÌÀјÔZ°á?¯3ùæÛq¼ý&c[™¨Þ[ìÙ:ŸžûËw1ePú;)ÉŽÇ€“53nç–ù.ÿw¥”²è­IL¼S!ó½{éZúÚðvAS}øÔøì+eÃËÙ1šGïk‡¥d3ß½ýÏÞ©'kÁt-_mì§>ÌäkZasb:QŠ‹õoFð!ТVïíÐTTŸŠ ÁÇ^V'+^¾™»ßWxýÜÐÚȾ•Ÿ3ãoˆêåáçK/›Rçñ:yøDž??(!°fØPDQ9§sëUÝIðnç‡YSyö.=Yó —ÍÍÚ0õ WŒ.Ì#|}꣛³ogôëô¹zÏvMD(žfD…ø.rûc#ˆö±ë9¼0ó1&µ]ÀsƒâÐ…Œ·å)]ú`ù•„U×ÝW²ºH¥YÁµc «J¼ì_œGÙ¥iD Û€¯Å­t´{ر ‹XñÝ/ljv ßÙ•Xµ¥u3ôb[U5smaÁÃ÷2G½˜—Ÿº„&!›M’#üX"ô$ ¾›IWÝÈØ‰éÕv—Ôz;ªV¼„iïl"åÊ7yzL[¢Á)}rqŽÃ[¯/á²I‰«Ö_ì+ÞM¡/šN}ѯ‹èJE—²V¼„iïn§Ã„ùL¸ ƒ€.iûùéò·ùxÝmtŒ }m8»µ©—ÏDçöaHÿX”þôÎØÍâ¿ç«M:Rÿø ñY´iÓ³ð¿´F+þ¥~>„E ëc÷ÌżþñnÒ¯ŸÍ3c[bVôM%ï‹%,m¤|éÙ9ºN˜³iÛ&›¨@ÚqûÇ´ÊYC:`Q½SwðÛ ~=r–…­={ZCæs}Ò[²„©³7<ê ž¿¹]`X~‘²µİVƒÙöÍ5üßÒ¸Æb©G‘„Ê›ˆéj<¿Ô§ÑNyÿ®-áâ” –ÿÎtxVÿÊfÇ@bõÛøe…“ì˺“P¾„Iõ*C kËþ íß‹H»;ž]|ùô¿ù×–<3ýúĤxK 9‰íX£Xé<öinË]ΤÇß'ÏQ³#ͽg]6ºõoŽEQüoT3g3°› צ¿ØãªÙõfj}×÷róñWpÝ?fðåš"|¶öþÍf——Ï]JßþèÑo}/ŸÊFßA¶ï.ÇæÚpvkÓ0ŸEå+^M©­I¦„]}˜ÚÔ?¾ ;@å«bšoá î£gï¶zbéÖ;S !”âw$ò%dʃ½&WT³‘Reý'|=PƒEÒ€4¸÷¬dƒÓF·þY•a„¨hazØýëLs C ×ãx'ßGÙAgØxëS‘Ó¥Í/%¾ §åzYõß<Ê}E¬øï.Z^{=]œËøm‡ ÷®%,.Hfpï$´=Õ¿ …ÿ³*í~öÿßc<ýŽË'ÞÍi)FŽá|KIG¶À„1—QßÁ/W¿Ä?>¸K;Y{3Açêšr¹rÊB,þŒ¹ïÌááÑsxï†W™v}[ô>/*&ú?ø:ZªÝT–äx æÄ×F‡±¼»¸>Wœ×›0àãj` _îxa} Q:p;<þqãzÌ|«á£¢ àÃÛÀ ‡‡•/Am¦6‡q¿†õ@_ì ›Õ‡† Ø =[p÷ý3(6ž'ïèL¢¶…}’ï"GyÒµ#x~é’é?4ƒ~ÏÆýýøjCiˆJjKsýAþ\”_gÃç¶%lð¶âÊ.fp—¶´ïÔ™–öšé®_Cˆ˜®ùe ùéç‘[ô3|ú+¢û303>§¥‘ÿÅÿñá§›H:ãZ™Æ”Ã/CKËáLzãAÌç·?d³SN_“²~Ü 'ýܸóëQL\â¨<*búpë¨lFͺŸGÍ7qa+Áúÿ¼ÎÌü挙Ø{­¦€g×Y¸H%»e÷N–æ• Y±ê@‰À¸KÓ¸þ½û¸KÃð^é˜ûØVœÃùvIJ÷§×zÃØ­MC}†g×ùhqýâ F½|0¤3ô¬l¦M‘'f”sq§$t;×r žËŒ”˜ÞÜvu.#gÜÃõ.ïÛ«ão6—tú‘È—RèÒÚļ/f0·Ó¥´ÒöSœ:˜sÛ„÷?R=°W_̯!-F°÷oømss†æFNƒˆëÏ-—¥sí;ws6†‹º¦a*ßGyΩœ’Ö‘t1“÷Þ|Ÿ˜³ºÐdÊÂSéwO§z¤ÁBÇ[^絸)¼üÑk<8§Õ”Îé÷ôà´³Gòüý{yfÆ›<ü… 4 ƒ-…ÎÍmþèAâ‹®÷ƒM„tBäW';:]*§\Ü‘>»Ÿ³ÎÈÁ$JÚ.h9=çsvVT mG¢  `ë<†‰c1ê͉¼}êLnJÑðù¼ø|júS$'3Áª›aÞ¼yî3Î8£î¤˜zðõ×_3bÄæÏŸÏˆ#ÉÆÉ€¦úPQÐÕùÅkø|*(º-MS«-w(JˆÉRpÕ'Ò(µ&VÕ´ˆ€á® kWCõ©h¢fzÂûìÿ1 ‘ÓÚNÃòMSÕʵÓ5ÃEðQTÅ¡©µ& )JÈ›ùaåK°ô«je‹¿"Þúú´Ô‰"PÕÎ×+_kÙ¸ëÄ ¡ T:V7¾†äMøt˯ªx}ªVé'€æóÿN]Í®ñ†—aðãšêCÕ*ò&|]–4 Þ{ï½J 6lØ!ëèÈ‘#‡ <ð)«ö·pÊø1B(ºk^:]Ý3B(9Ì0J„p!m…»6¬]Ò`Ÿƒ]SýXät„‹»~>Â(JȲïcU¢ž]û‘}ª_œ5Îɨúú}¨uª^ù"LÄkCÖµú—GØü U±‚\'tÁ§ /þָ„¯ËImä$6‰D"‘Hš RÀ%‰D"i‚H—H$‰¤ "\"‘H$’&ˆp‰D"‘Hš 'È,t §Ó…Ãáøÿöî<>Šúàãøgf7׿NÂî/ZðÖVPÄQµÚG[z[m‹µÏSëÕG­·‚Z­¶Õ‚Õz (ž ˆ€€!$ûØÌÌóÇ&! ›dv— |ß}mwwfg~ßýó,»í³˜†‰Ïç#>>]>UDDÜæ€ðÒ²2¾ÿ~[·n¡ºº:¤mbccÉÉéE¿~ýIMIðŠˆˆ„×à›7oÂ4 ?|JàŽ–12LƒÍ›7±qã÷Œ1J Έˆˆ«^^^N¢/‘’Ò]TWWÊB„±1q˜†IiiIŽPDD$¼Z pw­Äë8 ù¥§wke4»ùr† ÿ¿yÓ¦½–t<`Ô°ôûx·÷ÅÜtZ_⦫ˆ>ÏW½Ï`Δ¬.)"â6A<Ä‹1uHqqß®]CuMëcÔqqqäBfFf§^£²¢œZí^÷§úbÙúŸßaU•ÐóÐ+¨õõŠÈ{Ü/ìJ6ñ)›’G1¹é•›¬]|ñæ[¬˜zVˆ×º>`ø·òæ³ XñÓã9÷p¸ˆ˜‚x$ƃ¿]»†!C†µ9a¬´´„Õ߬fò!‡vêêl ˪Ûë~Óv¨Ù¹†ø´jw­ÃIÈ\0$ö.Þ¸i7þgu@i=û0zê æœw#Ó<ûw{õ¹îzVŸõ, ú'7[·¹¡g¢Sj øpá#<ùú'¬^¿ZoòGÅÙ—^À´~¾Ž_9+ÊÇ®ï:Ë@DDQ¯®©&5%µÍ`NMM£¦z{’“q|I{ÝoÖ•‚abxâÀ±é–ÙÓðPQ¶6„½ú)ݾï³¹ûšÉ¤Ø®ý€EÏcÎòm<õðE O õ—‘aÛN»œŠ¯xð²ËxbMN;•ËÏÌÁ[¼–_]À g-åÃ?<ÊÍS2Õ²ÙˆIl ŠwQS]ÝØê4M“ä¤TR¼ÿ6€‚ÏRºý+L 4~8x{µ»_ÇR2vÜX2=L:œÃóvrÂõ¯ðʺ³62£®ˆå îážEïóm±‡ç2÷Ú+ùI~}·¶]Ê/ÜË= ßãË­exÒ‡qæ]÷òß#1ÛÚÖ.`Éÿüš‡ÞûŽm…åÔIô6…9×^Íiƒ÷´¸7ø}ÜoÿÉ#‡7 ô >ºeW®ú ÏÌÿ/'˜Ô²öás8ëå1<´øWŒKªÿâTòÅ£¿æ‰5ÙœósÅèT¼¦Çi§ÏÓ?»ûóSŸ»‰#R‹ù÷=wòð;kùaG)5±éôq$çþürNܤ;ß¿ïÏhg{¨-àíÇþÀƒÿ˜uÅ^zé»<Ê0‰ˆHT€gfd5i ”¬{“o—ÿîñ-Ò²Ù½v)=GœBÕÇ ±×$ªŠsñeö§í®VÃ0ê{<ħeà”±£Ìªùú±+¹|¡3þûN~ѳœŸø¿½Ú¤÷ó×21ÅbÝSWráÃEL:÷2æÉÂØµ›Ôœ8 £mãËY»ü3¶ç^È-× ÅW¶?ýó®öÒgѯ˜XŸà=fü–ߟœC¬a”›Œilorì>†;†Ø¥²²è"çš`—ðÕ²-Ä ¿’¾&×:®ø’ù¯l!þ¨»8T1)làñ âŒ+Obþå¯òô²Ë8lj)k>ü„-½æpÓÕCH¨ÜÈ/<Áoæ|Céüÿãüþñí•M{ï/¹–oÚÚ>¹†Ïï¿”_.¶™2çj.Σð‹òØ*H Óß•ˆHWõ_¾bï¼ûŸ½º|3Ò3˜sÁEû´ï–“ØÒÓ2رü/dôAñ†_ÆÊ ¾&!½7ÉÉÉ$˜¥Tlý _Fÿ†Jmü•e¬_Îâ{ÿÅ®¸q;(Ê>äÏÏmføU ¹ê”lb ³“wÎxš—×\ÁøÁŸóàSkéqÖ_øý¥CIl@6 (m{Û £p ±ÿ$Ž:l8>ó0ÉÝÎG—¼É¿ÖW1a``W Y}2¸/±Fý†š¦Çm2òxÆÅÝÌëqF¯žx+Öòîz“¡3†ØdX£n÷:ÖW8äŒíO’§eøúŽ¥7có×;©=&¶þØ&sÌ‘Ãñ™S8úÈaxμ‚Gù”Ó~7™äòûôþÆ÷[Ùæöã,ãá—·ÓkÎSüî¢$˜LÎfÝk+øX]ü"r‹z€OœpÆO ú˜iîÛÒì-'±9ŽƒUW…¯Çʶ­&¹çPb“zÐ=ÿh<†CJöp0ãqœ&´}~Ó¿½aÇxûNåªû¯aZ–ÿºUl¨©ã‡»f2ù÷¯ŽmÙ$l¯¤&õ ÖV'3ö°>øL³Ù„ðšmokj¸oO@|v>=øÛJö,kF«“ÍäÑœ<ÊÃMÿ\AáI'‘¾ñ¾ªíËy£R›e×—EëSŒú#tšÝ×plžä¡üh´Ö¬bGí$âöñýÕ´½}mò×lô§qÈ!½ˆo([Ã<¨&Ý‹ÈÁ)ê¾§:üZNb‹‰ÃÀÄôÄ’Þk IÝ1bâIÌìƒaƔٗ²â­¡ö>àbî»q2)Õ«xì†?²ÿžŠÓ{Û¢^µù3~p z êFLcðÆxp+0k_ß_{e»Íƒ‰EÝz>¿ˆH+ˆ1pÓ$ciÙn*++[‡Ý2»ãõeâÔ–Ÿ„¿|+†é tß[~¼qI€MH ž”Ë¡CÈô æ×ó6rÖ•÷póÂÑüå¼Äe &Ï[Íúu9§ ±Iæ†ÓcyÞù|úáTŒ¯É˜˜v¶eïÓÚ›óÄ“ÅUX-Ü0À±Þ›Iæ¡çp|êÏYôÏeLy»€>'L%/ÖhžùI#™}bÞzáÏ,X=†KG$5NFsj6ðò¯²3éh®›”‰×(ßûxj·ðÑWeÄôΧ{¬±Ïﯽíg8ýbŸæ“w7P9vIjz‹ÈA"jGii ©©i­>§¤d7qqñÚ¯mÛ$ø|””î&''›Ô”ôÆ~Œ7†ŒÇ°kÓ ºõ›L]ùV¬šR°- Ó ¤â8^¼¾¬^+Ð{`’6þ2î:k<ôž›òô?œËfæ0çùëø…9—{‘P]ȦÒ~œ|êRÓãòÓ{qþ3¿äg.?“C|e!•ý¦2}`;Û¶wP1=Ï‚×cþÈ™ rvRš}$'K!'Å`Çò¥|°!cú'ãIÁY3zsúw³ÞŸÇÇäÛò„n#™q—ÞÎÙŸ\ÎcŸË7³Nã˜á9x‹¿åƒ¿-`ɺdŽ›w5Ggy1üMv¾õ8ô;ž±Yµ¬yíQۜŬ[&’f˜ûöþÚÝ>å®8·?³»†«ì‹9crIU«ØP™‰DDºŠ¨xþ !¬þf555­>'..žüùêb·m›¬nYì*.æµ×þIUuuã9Ûª¡oÍ”—¿INÿqxÓsê·«cçúT{2è‘5¬c+•™‰Œ¸ðf.¹‚Gþ¸”ãî=‰Q?{„‡2þÄ{”[–PŸÁ £®à˜“Gêñ1âò‡y(ýOÜÿÒCÜðlv|/~|Íx~40»ímÛ=–t޼úW̸í¿õªzpØÜáLÙ—ã®<›7îü+zq*‡^3’D#–~§œÃø'Êü9Líô‚ðfòh®zbæ?Ä“Kò‡…Eø“²4â4n¿m.Çç§Ó¤¸ÌøR–=3§ ,ÒûŽå¼»¯ãÒQ‰õ‹½øöíýµ·½'žü 䉴¹wácܼ¨¿'žô#™:0¯Zä"r€ V»Å,X° vúôé«^²d ³fÍbáÂ…Ìš5«Ù>BYl¤£¯iÛ6UUU”——cÛvÐí+++ùàÝWŸ¼Ç_˜´fšl3‡àÏ>–MJlll«¯áØ6&žf­ÕÀD*ÇØs¿ãØÍ×V7šoÓòqÃô4®hÖú¶{¿NÃ}4nï`Ûvc‹Ó0MLÀú}6;ÆÒeÜ6ë¶]¾€?ŸÔ³Yïý¾íúÕÜŽÉÀl:A¬vžy./O~ˆ—®˜ŽQÿú-öµOï/´²uì¦S낇ˆH$=ÿüó8mÚ´NçèìÙ³gU@eý­¢ÉïU@uTÇÀ#1yÍ4M|>111­¾†7!…¢ŒilÌù)žú1pÛ¶(,óÓ=1‘˜˜ÖÃAëÙû^LOó{ Ãij÷Cz¼õÇö~½ï30Í &¦pªØºz=%v +çÏãõ¤Óxô˜îí®¤f˜!®0g˜˜O‹/8-ž²Oï/´²5Úx\Dä@s@Lb3 £Ítj’‡£GæPg5ïèžÙé þ)GþÍüõ7—òÄz/Ýǜ¼ˆûyùWÙ7D€·'Æc2ªoZÐÉæ|xÄâògþÃeèµeÝî~ûsÙâw¹Ôh9¼ ""‘vP84,t²¿b ÖMÝ•÷+""íÙ·¥ÏDDDd¿ˆh ü'¬Å9x›½""r9³[ô^+¢nÙNH«”ŠˆˆHÇ4cà¡*Ùü5EÖ7»(JG™Ýúö'5o(ñÀ»ˆˆD¼…‚µßrÁéG“–âëô>JË«xbá[¤ôzpÌr‘¨S€·`Y6}zwãÓ »C»JYãtòC¸D©ˆˆH'iz±ÞÀ©QN'o1ÞøÔ*ÃÃðÑ™œÓæ2¬bÆ0åˆl®K¬z,DDB¢x isÊøîLÒù.ô”ädÖåð®ÑJ#Þ0ÉÎö‘SSɧE6ai«GbŸÁ˜^ÆŽÉ`ÚÆ ^\ëÇ–}z20‰Qß륈HˆT_¶`õÕMƒÎßš\„#(o<³OÌfn?o»ë‘‡,ûlEಪaß©æ ˆˆt€Zàðø“STT´×ýÉIÉ\rñ%!í#!‘`‘.I”ƒe[Ü|Ë-”––4» êwÜIII œw!^oóâ{ôñG°l‹Pg¿õ>´//L^YÀƒŸWSÖ¤_>%/‹yçÇ2 Ù`wqo|PÀsß×áoí­ìƜщ Kó€ßbçîj–¾¹EÅÁŸ?ltŽI$?vî¨äÕ÷vðÊ Àìü±‹ˆZ ðƒ{ù°m‹Ûo»u¯ÇLÓ$))‰G}„m…;)¯¬Âﯣ®ÎÂvæ^þsrr²ñ×Tc÷ߟÞêë~±ß¯öãw*K-lÇ`ÀÄ^Ü1ÆáŸïmçñRƒ±»sùɰu~_ûÒ¸~j •ŸrÇ?v‚—Ä]V³Ðl¹O3=£õmL}óÈÚ]̽ÿ®¦Æ—À©G¦sižŸw—sïr‹ôþ™Ì’Cñ¶ <ºÝi[÷ÆØ¬ú¤Åå†drúI½‰{a#m 6þnÐg|/þph «?-â·ø±S’¹ø¨dF$™,Þ+À úMÌeÞ$¯ØÉ¼ý†vcÎi¹Ä?¿‰ç £óÇ."r P <ÇÁ²¬ Y–Eÿƒxó½å èׇ‘Æ‘š–JjJ¥%e”””²yë6üïß…9ìt¼Ùã ¶ KME- k¨u_ŒøDÎË·ï|Ï«üøøºÌËÄs2™žUÈZ+†ÃæëMå|ºÕ ’ÓüëVË}Æe´½aTW²bcÕTRœÄýãkyëó>©qp¶ØŒÔ‹q½cðÔ6¶ô‹×³àó*ªøpC5æ9yœ:ÑÇ¢WË)iñýψóqÎÄ8J¾üß}PE… f’—G&-c#>‘s&ÄRøéfþwy5U|´±†¸³ó˜1ÉÇ?þQAigŽýàþ^*"xxëíµ§,bú1G’Ý#‹’ÒRü5UlÛèj‹#5%‰¼Üñ èÛ‡×Þ|zŽ zÝR§ñÔ3€˜Äxzy ²§öå…cêï4 Lj’Mj×îâ…MÉÌ=µ/ý¾ÝÍ+Ÿîæýum쳦°ýmhØÆq(*¶p¼^R¼N58þ:¶TÁàD³ÅŒGÛÇêü¬Üj33;ŽLO9%-±ó&%Ð7Ææ‹uµTÚ4;¾`b’âÉóÚ¬úÞOuýóñûY±Åæ´œ²<”5î 3Ç."â~ ð`œÀø-·ÜJmmm³‡î¼ójkk‰‹‹£²²‚ÚÚj,Ëj ü:«§Ö¡²ÒC\\Ž|IÖ æ1ð`óÉ›[xj»Ýd콺ÂÂò×ñÊ+ëYÙ'•SǧóËY霴l3·­¨¡²µ}ÖÕ¶¹MK¶åà`4 <‡ZËÁ4Û^Ö¬?õ=Ø×Ãcà¬Pû°ú×jñ†œ6¢³Ç."âF ð À²mn½í–½3M˲øì«Õ8¶E¬n¤¦$“š’@IiE»v±­à[L7xW¼cSV Í[†þòj¶Xéäe8¬ª¡ÒÙ;”Ûfó†]üùûÞ›Ú—;Ƥ3à³í|eßg›Û%èD7³Çäl5…5Ù§¿¼šN:CzyðnµZíÊ6ê{)üeÕl®Ë`X/±[-ªÀÄþ]Õì´À Ö¤V¹ˆDàÁ8v+³ÉmÛÂzçdñýÆÍlÞòß®÷SVVŽí8Äx=˜8˜ôËë|ÿ–Ÿ¯ mNšÉ©Ûwó=^’ÊÊyk{ ¾ðóû1½¸‘"þµÙOµ×KN| ÿ^UMURÇ÷1ؼÓO•'†‘Ì?vëû|·"c[ÛføÒ}LÌ3©ŠeܨLNJªáÙW*)wcØWœÞ“ü[ùÕ»UTTV²è‹_OÊágµ;y«rú¥ÐÇ€¯‹‚j‡ÌÞɌϨåâ žý´–{&ôâu;y£úÍdFªŸÅ¯U6é>9x)ÀƒpÛ²iëb¨åU¤¥$âóùHLL¤ººšâ¢bvîÜÙØ^S×JJ:Ëß-àõéYœq\/bý~V.«â½íµ|óÁ&n®ìÎy#2¹zŒ¿Žëwòáêjê|ñ6!áI&†aSTPÆ#¯ïfc8ßçÇÛÚØ¦3+¾:7UQÜ?ƒ_žjâ±,¶”óТ¼^¿œ˜¦Ñd1‹ÏÞÞÌŸü=˜=)›©±ÛwúÁ¿ Ø~Þyo‡OKcÎÈ2V¾]Íúe›¹©¶;ŽÎâæ$ƒ¢<ó×B^.Œà*s"".lh0fÁ‚µÓ§OoìÒìˆ%K–0kÖ,.\ȳcq\6úx˜ó/æÎžIjJj«‹¢œ8óLúõÉ£°p9=³Èê–ŽCÑÎ" v⯳¨ª­#·W.6nÂwìÿ‚±wŸ¯ÙdáÇ L ƒÀ|7ƒà™¦±§DëïwÚÙg[Û†‰ƒÕxx °íÖŸcõ‹Æ°çuœ ÇÑ0Ñ öÞ.¦[&œ™Ì 7òdA ”MÓh<¾½^'È{í̱‹ˆDÒÙÝW2ûÌ@N›6­Ó9:{öì@PY«hò{P­x «jóØüÅÄ:Á¦xضM^NþšJ¶±ñ‡jjkpœÀ×ië%Ù fëóŸí–©W/pwðÇl»í$ ¶Ï¶¶q‡fÃÖ{…]Ëç8Í·iõ8äIe´SÇ–r #!žÃ'¦Ñs÷nÞÛe7nËãlïu:sì"" x »cóx·&Ûòcz‚™²ž»Jè×''0Û¼¢¼‚ââbJJJ÷Å'PZQ…áëåwÐ&Ù=“9mpÝãLœÚ:6mÙÍïÞ-æ»ZÍ=é x †aâ‰O¦­áa'ÿTVù,™© ôìžA¬XÒ320 þ:›ÊšZ ‹ËÙUYƒÙÿ„ ç€T‹ßÞÌÅï´Ýí.""¡S€w‚'­/ÎÈs)Üþ%…›6±zígÔÕºÜ #;.'±Þù˜iyè,äкÝED$t ðN0<1ÄdÀ›’‹][ŽU]†Y] Ž“€7. O\2FL†7v®ˆˆ€àf`ÄÄ㉉ǓØó£÷×A‰ˆÈA"¢þòƒ:5…^DDÄ/Zµ×Šh€{LC.""ºH“ˆˆˆ  pÇÑb•"""]Yð¸N÷éÒÔ….""âB pR€‹ˆˆ¸\DDÄ…à""".¤q!¸ˆˆˆ )ÀEDD\H.""âBAÜ0=Ñ>éµÀEDD\H.""âB p à–­«‘‰ˆˆteAÜcÑ>éu¡‹ˆˆ¸\DDÄ…à""".¤q!¸ˆˆˆ )ÀEDD\H.""âB pR€‹ˆˆ¸\DDÄ…à""".¤q!¸ˆˆˆ )ÀEDD\H.""âB pR€‹ˆˆ¸\DDÄ…à""".¤q¡àîØQ> 鈠î8N´CDDD: h€¦zÖEDDº²V’ÚˆîQˆˆˆH‡¨©-""âB­Œk›ˆˆHW¦¸ˆˆˆ ŸÄf(×EDDº2%µˆˆˆ )ÀEDD\H.""âB pR€‹ˆˆ¸\DDÄ…à""".¤q!¸ˆˆˆ )ÀEDD\H.""âB pR€‹ˆˆ¸\DDÄ…à""".¤q!¸ˆˆˆ )ÀEDD\H.""âB pR€‹ˆˆ¸\DDÄ…à""".¤q!¸ˆˆˆ )ÀEDD\H.""âB pR€‹ˆˆ¸\DDÄ…à""".¤q!¸ˆˆˆ )ÀEDD\H.""âB pR€‹ˆˆ¸\DDÄ…à""".¤q!¸ˆˆˆ )ÀEDD\H.""âB pR€‹ˆˆ¸\DDÄ…"à>Ÿ/R»é’¢™}ÞHíx„ üýï§²²Çq"õ2"""]‚Ïçcüøñ†•׋X€çää©Ý‹ˆˆt9Ñ oˆP€/\¸0»q…hô<‡=À§M›î]Šˆˆ¸N¤[ãaðhvˆˆˆ¬t™ˆˆˆ )ÀEDD\H.""âB pR€‹ˆˆ¸\DDÄ…à""".¤q!¸ˆˆˆ )ÀEDD\H.""âB p àQ¸ šˆˆˆt^з¢}"""Ò!j‹ˆˆ¸P+×ïÜ5½ýu~¾øò ŠwïÃ! @þÀ|úôCd¿S½>íÕ+*ëð‰FÞJ€w®þéçŸÒ'¯GL9ÃèÜ—ÇqX±r[·m%';gŽÈ~¥z%ªÙºú+¶$ c\ßD<Ñ>žаK–u8ëi»*:ŸÆÀÛ`ñÚ5s¿÷*Ì;‚4Ïž´ìƒ[8s^—þånNêém{Yšúãµë­>Ó ·IDATv…¿[£ëýÙöK¨ø‹Xù·gXôæ—¬ÙXD]J†ÊOÏŸÉy !^ *Žn=³ÉÉ <ß©^Ç3wþ–µ§Ýǃy>¢Ù^µ^‰LYÛT¬{“§ÿ+ÿYµ•R ÉÝsräl®:o"™žv "œõt>ƒhÕáî pÇÁ¶,,£áCmú˜…eÙXvÇÒäá®àŽZà"MD;Àªµ<û«yî»$Fp,çÿ¤;ž]ß³ré_™wÙ;|zÛÝülBÞö*o6Ç]û[Ž5LLêÃǶqêë¦hþ3µ^‰DYÛ%sïMòvÂ!œyÑôOòSüÃw¬3Sˆ3B¨wÃYOGá3ˆVîê¯ÿe¯4ð»Óøþ]|öò£<öê'¬Ûí!+ÿ0μì¦÷OÄÓr?uE¼÷È}Ì_¶ž­EøcRè5d§]x.Ó$ÑÞÅp°±5.ÒDTÜ©âëçïá¹ïºñÓ»æqþ°d¼†8wÒQ¼xãuŸ7!w9Ælû®ÿ!ÔWÔΞFEãÓ›tÑ6»u >½ýûåcA^#B­W"QÖf÷©üòçkùíÿÝÇ­x‘ñ?šÎÉ'Nel¯<€SÞ±zº½z}ø€Õ<µxÝN½‹_=€„†:Û0 ŠˆѪÃÃà¶mG· =o7^2’ä&-ðÊ/厬-ü–Í5ul{ð2Nû³Ñ¸­mÛÄVa ®ß•Óü2 3q‡çµõßRèCbl„ßQlmˆ¸@ÔêÀ±-l§þšAÆHÇÄÌX/85Íšÿl²}ÓÿÞS[EoÞM¨õJdÊ:†^S/ç¾Cg²úƒÿð¯×qû?2ü̹ùŒ|b;XO·W¯W'ÃÆê$†Ï&®ér¦Qú ¢U‡»»Ø‹ÁC‡6›…^±;è <§®‹xÆ_~ ä'4ãˆËLÆÃ®†6?öf³<^309ÎŽü?8¸HsÑl›É½ÈŽ5øâë-TµW[uÁ7ls ²û¦â¡’j«üXŽƒ—¦ ð`õ‰Sßmlï—Ilûw%6OBFL=ƒáGŸÄ ÏÝ̯ž¿Mº›–¿cõ´ÕN½^P‡QßkQÎQø Üàv4N#Ûó ÝRÿ]ÿÿŽíàIïGާ†Mß;dMÍÅgÍÆ°Z'ð!×ÕÏJ´›ty5üîßÎÊ5x{ö#Ýtˆô¶acD~¤]Ä5¢V¯$ åä£ÓY¶äY^ýI>g ðí9eÌ¿7ž~ƒâøñ\4$ÓLصa•uyÄzŒ=Çé©OŒX’â jWu–7Šç‘…Z¯D£¬ ÃÇ€ ÃI{áMÖú1û÷ïP=íIk§^Ï@ŽçUV¯ÜJÍÐþÄ7m…Gá3ˆVîîx³®ïf5‹‘2–³ŽïÎõÿ¿3grìÈîÄ׳­¬7ÇüxÉf"Ý“¡èó÷ùä‡l&õ LÿßõÑ <×ûH†eøÙðöb^Ø–Á‰W '9 ãUF`:ED_CÄM¢{YÃf_ʱŸÏã¹ëo`éÇ29? Ï®¬\ú2o­Oâð+ÏebšŒîL>2—gŸ{œûU2mpžë)mzÌõ½xŽãàx2Ú/–Wß^Ì˃£¯SLyÖDŽœñ3\B­W"QÖÕ߽ȃ¯UÓ/?œnI¥›XöÊRŠ=ƒ™ƒ™ÚÁz:·ç§Œá¬zpýKw1ϞɇfW½‹ªÜC™Ò;òŸA´êpwxà— Þä0ñäŸsw¦>Å3ÿ^Ì=/ÃŽO¥Ïij9ä˜$Åd2åÜSxÿÁ%<ùÚ$ÆœŸ€˜q•|þÒ#¼´Ó"5w(?¹~.göEe¶¨Sÿ? ˆöyàfò(.¾{ç/àï<Ï=/UqäŽ9йwÎàØ!©Äàà8rO¾†kKÿÂü×ÿ¼Åž¸d2úŽdPJ ÝÞ¬ž2S˜0ç¦ß;Ÿî¹‹ÚønŒ=} ‡ç'‡¸0Lç…Z¯„¿¬m,#_ÉG¼òÔ+ìªb’è9èH.¼õL¦v÷ÞŽÕÓsóÛ~¾Ï ³Í)OñôÒçùŸ—+pâ{pØÜáLÎËŠøg­:<Ø÷˜ ÔNŸ>½Ã×2]úÖR¦:?Jço‡S(õÊ~/ëD4êp]N´%o.³þô$g`bÖ¯³m&&Žáì—.C‘®¨KÔ+†I|ÏÁÚc0iJ6Ñš¡Ö+]¢¬].ZuxØÜ÷­t/Aº¼¢É©_?j§Íˆ¸@תWö_ï\gu¤^éZeí>ѪÃ#²è`Ÿrôz#òýJÄuT¯„AˆõŠÊ: ¢T‡‡uï)É)ì,ÞIfzf8w{PZÿýzrsr5]zªW§½zEe>ѨÃÃàcG勯¾`Ýúu ž}à8ƒ "';gŠÈ~§z% IDATxœìÝwxUÛÀáß™-ÙôPH$@h‚tP¤6|- *¢X^l¨X_ë‡b¯€J‘¢‚…¢ˆŠ ˆÒ{/¤·¾»3óý±IHÙM<÷uq»3gÎ9;ûœgÏ4B!„B!„B!„B!„B!N*áõ’þB!„ec–ô·ÕËJjÒ¤I†ÛíF×u¬V+N§¬V †a€² JÑLCÇ0A) ¥ªS8ÓÐ1аÞ(&†n`* ‹Ã0òZV Aš§¾Ê1 t4‹†Ê-ÇçºfNÙ¹uð,V°rË×4…òQï‚Ë”´ÝâÚ~fòêQ¤Xã´û¥4mç+Óô¶'¥ÊóË_ •µ^âÂ$û›( ·ÛMff&6› ]×±X,Üu×]Ax’10 ýmxKЈ%;;›]»vѬY3ð÷÷—N!„¬={ö°dɺvíZn9Ovv6{÷îeÓ¦MDGGãççàÀ“€^èo_3hÙÙÙ$&&rë­·”÷Fi9!„Bœ”Rèº^n šÕj¥nݺԬY“ùóç à'!sçû[åümÊë Zzz:—]vYäL!„âB§”Âår•ûQC«ÕJBBÇÏ š°.NÛŸwØÓë Úž={¸òÊ+eÆL!„¥n·»BN늈ˆ`íÚµà™AsQ493rþï}-,,Œ€€ÏB!„‰ŠšAË-;,, < š…¢É™Ï!O¯ («Õ*³gB!„¸èTä €ÝnÏ!ÎüÉ™NÁsѼϠç‚IÒ„Bq1ÉMÐ*˜#çïÜäÌóG#'qó:ƒÈáM!D¥dd§phÖ¨X"Æ­.Ä6 q¾Ò4­ØMÓ4 hžäëuü(˜œ¹ð$g¹ Zñ3hrß3!.îÃüüÖ«L^µŸÙ& ð ªJd|+®ès}ZEâÐÎu%=Ìä?yú®÷Ø ×`Àï1°ŽÍ÷®=|ùðc|}Ð òÖwùè–:Ø+aH+S›„N)å3ÉÒ4&Mš i;wîääÉ“„„„‡alذ]×KÚŒ ObfÅsÞYä |ܨäžgB\4ŒLŽ$î#)C'7$e¤!qÕÏìZ½ˆuÃF3òªš•"¹1M§a` ¬VÏÓ.|…*ÓÄÐutÝÀT6¬˜>>wÊÔ&!D…SJùÌ\.WÞâââØ±cqqqy‰]y]`à3A3 #oºNq3M ÓÄj üˆ±j£ÛÈ·¯=Ǥmi,ûy )Wö¤ºè'ÙôóDÆÏ^Æ–#.‚£Òí¦Á ìC€8ÿeÖ‡cùyãœÈDW„Ç6âò~·qKûhüsCŠ‘ÊÖŸ¿dÂOËØ| ›ÀètºînïV@ pfᔉü¸|ÿI&à þµ{ñüˆz9AÙÏ—÷ßÈÄÜɘ7úe+üü9óÔcÊ( Wk¦³nÂk¼·`GÒtð ¡vÂåÜr÷-tŽÎâîãÝ :þžç³á—¤¹Ø5ùQ†£þP>¥;ZZ±í0Sþ`ÄݲŨIÿwÞ¢ŒÁ¦îgäÂTìmžeüÍ Ì«S)Ú$„¨PžGUúžAs»ÝüüóÏôéÓ‹ÅBýúõóÞ3 ƒ¹sçŽÕê3½*õ˜Ï LfЄ¸Xœú®+Í‚fXƒªP-Øæy¦lf.MC‘ÅŽiÏñÔç Øt0?ƒä}ëøáÝçùxe º ¸³fÉöKÃiZ°ºS9´s9ÓG?Æÿ~9„ÓÌL¶MÉŸýƺ½)8õ,NìYÏœGð쬽d›€óþ´ŒM{“š­°*4½*U¬yÏùµ‡FDx~V/Ïy-!†) ZêAgX r 2N°gÍ,Þ5‹]Á\Ò%Ó48¹q5Ç z2ëWB×uêu½ŒšÛKj‡éy^­¡›hv?¬ 0ut]GW6ülCpÉmBT¤Ü-÷BÉÂrŸ¥9gÎLÓÄf³å%csæÌÀb±ø\¿,¹•\Å)ÄÅ.ß×|ßô‘Üñ“AZr*Y†ŽaÚhÚ·3Qv…~ðo>ûaºÍ wßbPç<Ã=ŸnfÁ·«¹ç².„š``a\ýÆ8þ›àdõ¸Ç9û ë'Ãö®’ö7ŸÍ:€®ûÑü®ÿñôuq¤Ìz–ûÇoeÛ´¯ØxÕc´ 3§œÑãøoc†ÓÄš¹ §ºQÜúú‡Üc¥aÁM¶nLÉ ‡¯"1ÍF÷}ÊÌ5œi©¤ù“WŸ˜Èö½ËÙ’~ =šu£[Ù|lKŽ "Æ+Kö˜˜f,W^V uôWƕЎæ¦yª*'®ê|3o™R´IQኛAÏÍfsßϾ~xxx‰ë–E±‡8s3E!ÄE"+‰#Y¹ÿ áòGþ'®ªMÏ&ãÐFöè&&{™üh¦*À4Ð Ž$rÂèJX¾¢”¦ašþ4êÕ“˜9Ù•º“­)ŠzG7xÊñkÁͽ›PÕâ&¨ÓU4¿-Y‰l<-«*Çí²³sO¼U(‹†áv¡›žËŸÊÌHaíô÷yÿ»uÏ›í21Içx†‰¥fs®¨[¶à¥G齘mº‰YûrÚ„[Èܰ±ävAé§ÁÊ¡MBˆ3’Í—°°0ŠÜŽ£]»vlÙ²…ääär©‹Ì  q±Ë7«Skà‡|Ôu=Ï=0Ž Î“¬]sŒ.5Q¦‰áÎöÜÞšª´½º Ñv•—{h¡M©b³@V¡˜a˜(« ·©Ðò¯”Ë­cä»_£i*Táy#ÃÄ4Á45”  £ëfÎò%·ëÔK§^É\?žQß®%ÕŒ¦çí×qIÀ¾3›D<ÉRUZ]Ùµ}+{,`qô&²L“Ú]Ûi5ÈÈ÷+ÙW;Ь9A6¤t='®®”–³V)Ú$„¨PJ)4M+ö*Îúõëç-“{¨³oß¾y礭X±¢4Wq–¨Ø4IЄ¸äûž+ÍŠ=â †õ_Àƒ“¶“²ð¦ôx‡»øc O &ÿ°“42":rË5ñYÀyâ )þ‘TEÇW–Ëi€éâÀ²?Ùƒ‰i‹¤n+vKcj«ElÎ^ËŒy[¨sU'Îc»ibúÅÐ8†rÉb<Õ´j²Ž°>1#2Ãå«—óµ ů‚?:uRöî%Ã4 NOôëAÍÌÕ,Ÿ8‡ÄôÜÕÚ\GÛ‰oòÏ¿Óó¯‰aÆsm×(¬ºkD£Û¡éa„©ÉlØx½nPÑ:–¥MBˆ WÜ šÛíÆívcš&sçÎÍKÄæÌ™CïÞ½1M³Ünr+·ÙB¤lD÷¸ƒ¾??ǬÃǘýÅ®}íjjD\ÎíÝgòâ¯ÇY?a·N´bU:nÓNÛ‘cxêÒ€| ÅI~ÙŸ¿•¥c&á}oæÒ`PÖÜyõ÷<5ç«>ŠÛ¿P˜†ašÔ½é6Z+Œ…ꔎüjÓ>ÁÆÒuÙ¬{0ÿùÔ†; +¯¼s ý5Ÿ ;Éøfj¾wýZòÄðz³›ä=Ÿ3lèïÄ„f‘˜a˜uS!M¹¾kU–üt — Öæ×Ñ)Ò‚žíB«Ö‘;¯þ¡øvdÖ¥{ÛÎOf÷øa\?ÍÊÌ(xÓl“¢üåâôuŠ—Ûífòäɘ¦Ixx85jÔ@)ÅáÇ™8q" Ølg~?C9Ä)ÄÅ®Èa7ÓÏõZðË{«ÉÜ1ƒ¯·vãÁ†4¿ëÿx­öWLùe[÷ž  Á5㉠°cSàÊwR|@Õ œÇ’Q!µ¸ôÊ;xôÎ&èÙdš½Ä+Õ¦0iî ¶Î"0²!í¯¿›¡}ãðsg’a˜Nò7sgÐT:{„ýã¦0oí^’Ó¡5ý°ùÙÑLJäo—iPàˆƒÓ$äÒ»yñŸïÿbÓ¡D62Á/Œè¸æÄå^Åå ¾gOêÌÊnÓAÛë/£ºé"Ë01)E;Lï|–­ùnÉö%g ìT ¯M³KªaS —¥MBˆ UR‚f±XhÔ¨@$,**Šððð"¯ŸQ]¼¼f›2eŠóª«®Âápxy[q¡1 [@ v«åL'Ýi€i`X9¬(MCÏJ'Ëíùá¦ÙìØ­V,ZîM¯MôìL²ÓÖðÊݯ³ÂBïÑãx¸‘‹Ò<÷ Óde»óÓ4Ѭ~Øm,š.'Ù.ÃÐpùcÓ4ôÌt²ô¼l Ó´`ó³c³jž€jºÉÊÌF7}´«È …šÅ +5ÝbÃn·b)pcIƒìôLtåæÈ_ïòÈû+H ëÍ;Ÿ £±–IV¾C°Å·#w°Úý°Y-äë2 wYN£LmBTœ´´46nÜHPPPÉ Ÿ¦Ý»wÓ¿ÿL #çOz¾gYrˆSÒî¬ Ü_D3œdd8 .«¦ÛE¶»øë •¦a:³Èð‘a(¥0u'Ù^Ï¥Uhš‰3#§—÷”2p;³p}³äv¦»ÈÎ,Ô3%£á½édgëè†ËßD#WFÁöߎÜe@we£ûì²Ò·IQ±¬V+š¦óÇ]Ê!N!Dù)öÄüóˆû$Dz +ËM‡›â±+#в3pËs˜„¸`ŠÛí>ç·“«8…åÇq OMšF@H 6MÞz~ÆKMz?;†kqX5”2Ñd8u¹q¬¸ððpöìÙC``à9E“CœBˆrä94™•–FVÉ WjJwV:içº"Bˆ³ªjÕªdffrèÐ!°Ûíç$Qó™ ùûûK’&„Bˆ‹ŠÓé$::š°°0¶oßÎÉ“'˵üÒæV2ƒ&„B‘OVVþþþ´oß¾ÜËþúë¯KµœÏM!„âbår¹Êí¹š§CfЄB!*™"·oI΄B!Î%¯ Ú¹¾9›B!ÄÅÌk‚&„B!ÎIЄB!*IЄB!*IЄB!*IЄB!*IЄB!*IЄB!* šÜ¨V!„â\‘4!„BˆJF4!„BˆJF4!„BˆJF4!„BˆJF4!„BˆJF4!„BˆJF4!„BˆJÆG‚¦În-„B!DžÊ3ƒf¤ñïÚÅÌ9›%G\Þo•«'³qá,&ŸÌüýN¹®Bˆ‹‘̺™_ðù‚8Ï—ÐHfݬ‰Løã ï:»òÇØ×5g/Ùg»]çrÛ>XÏuòdmaÜ‹ÿÇ?YA\ß6á6Tቼì|õî8þÎ ¢O›éEÑe*3#“›6°/¨­bƒ°TÖ2…Bk÷¾¬Ý´—ËEqOß±ZmtïÔ‡ ÀàòÛ¸;™³¾g^« èyvÂÓsÜɬ˜9ƒŸ[µå–Î5½×ÙHaã¢Å¬éü Ó,[»|ÕË™Èø'žcqÓgyÿî†å}¹3Ùv)ŸÍLaþ·1j³ák?mð0_¾ŠêVß6 Ã01‹ÙÙ ÓÀ4‹_¦ÒÊÞɤ—_b[¿ù4&Ky|þQ¦Bˆb­Û¼’6-:Jq§ý»·­¡M‹N¨Rúé;cüç3X°ñ).;!Ñ4ì2GooCuÃÀ<Ãà™Œ9¥©³y𣻝z)á5£ˆª€¦dSÿÓÝv)·4eÑÐu—Ïͪ©JÕðsŬ€/UE”)„Â7›ÕJÕ*ÕKLºjT¯ÉñGÊT¶‘¼‚wF~À‚€v ÒŸ¸ Ç÷mg‡Š¿ègPñrPYǯõ²EÑçÉQ\­44UÌr•Pù$h*”n¯K ƒe/ÞÆ³Ë³¡Ù3Ìxµ!š2Xÿù†ÿ¶Ãi:ø…R§Q7Þ7nuüó —ÂÂ7†0ÿh FH4—tÄ£·u$Ò¯˜/žÌ†9ã;ó6rÕˆ+ÜËà®±h&i¾äùQ³9Xç?¼8ò&j¾ï©lš=Ž1³–±ù`–Ð\ÿÜ+ i€f¦°~æXÆÌ\ÆÖ#&áõÛpáôkêÉÂõ£,üø-&.ÝÅá¤tœ*ˆm¸uØ}ô‰Ì›Jýwâ}\=ÉSƒfOOet'Ì~•§'­æ`†Ž-$š–}îá‘þ­NÍ8úªW]ev´óï¯ãxgÊB6ËÆô‹ ý½¯ð\¯(ì2Ë&„gÄf³c³ÚJžSàï(SÙ®ËXsÒA×'ÿË-s‹î˜(Ï,Pޤù¯1ð—$Nº 5 0Н2Y3ú.FlèÎcÓÀOCe¬å•;žcßmcøàšHlÊ iþS øÐΓŸÿ®U-ÆÍÓÇ€”•Ÿóè]»ØqD',¦9½îx€ÛÚ†û—\'XýýÆÌ\ÎÎdð„N v½ã½ÎÞ©W›$&>ð0óZ½Á„¡ 8|.ç%c+ã¶Ë[ùÍ i–œÄ’—¥‚†ÅbÁ¢)À†J=ÈáL+AÁv2’“ؽê;^{É:">_Yi‡’°ÛÀyb+g¼Î#Ù£øüþ&zÝrÛ&?É£_ïÅ­+üƒ¬$í[÷o>É ÿOxª]0‡–.dݱ4ô£¿³âø 4´ûh…‹]ߌdø¤´¼éžmRRR©iG)';§>ÍcSÒhÓ/ÔÓHümcFŒ$냷TÏ¥§“¸zG¢úóèCõñOý—EÓ'ñþóV¢?{ˆKs²Ðð¾#y¾G lJ# 2M)šôâîÇ®#,PçȪ|0mÅãÙvaXT1õÂ{™úþ¼üþïô»Ÿ—ÛÔÄšr„´ÚU°Ir&„gÌf³cµZKLЬVV«­Le[«Æ¡æ²æ×ehÜ•Ú PE&luºp÷MM©â:À__?5ÖºIœVÜxå n‡Xç¯g[ŠAƒ çÁÕlNss|ånÒûÖ$Le±kù.ô˜Á4 ):©Qæq,g=w¦ÍnÆ€jÙl›?•i/ {ôGÜ×(ÀËU‹ÙlŸú4OÎ àÚ!Or_4–Oû˜wŸ×¨5f-‚-¥¨×qL]G7 ž)è­þgºíòv/pÐôáñÌ}ÐIZÊIÒŽ.â•Ç'²}ï26œèO|hîr!tm,#šÛÙ7ûî»…Ãó¦³fPc:xÙǤÅ|2}n=šÛÞ}‹A ¬úñYîúd3¿½œ¡­{P§ïŸÏáèžôˆ´ùìT3u ã¿ÞEø oñüíõñÏÍ4•‚ÔeL˜¾‡ˆ~ï0r@<þš¢c«X²ïδ/Wsíóm 0MbZÒ±uCª5-£Ž°ò±¿X¸û^ZÔË鉪µ‰‹«]‘÷åª×–.9ï“P}>È/kãjŠ–æ»^*Ó{™Ù{ŽbÒ¤e;.kìùr¨¢_p!„eg·–.A³Y­ØÊ˜ YjöàéáÛxá÷¼ôÚ\u5×_{­jù8)?¸~ºµkˆ¿—Ö8ÈòG=cMó:ëK¯‚:Sßò!ÿìHçêð ’6®æ¨Òpm]οÙm µìgéÆ,j_ÓŒ*^¦‹Ê:ŽåÖ»ZÇÜqMCOÚÔǸo8ßµ–/´#¬Ð6ÌÔ5Œÿá ÷ŽãÞžØ4©‘Ä’!ß0wçÝ4oPä\þ"õrzÿ|Š.wæÛ.og/A3RX3íMÞüz ÇLÀ41 “t’2ܘy šÂá°a±øÓá âÆme[ö~vžpÑ!¢h±ÎëØ­›˜ìåËGû3E¦n˜pd'ÇÜ&Õk´ãŽÇÛb*å%K>Åut‰YA\Ò:‡¦è|çÑÍìÊæ’ÖµN½çˆ¦MÓ@¾Ú¸…#ζ„ä¥ÿž•RøÕˆ#\ÍãðIw^ú®”Êù“·eŽ,ŸÎ˜©¿²"ñ(™Z–,ÛÉ,ôê•·ÅBeúÅ_í-þâÓgîeG×k¸ñú>t©F1×h!„(%Ï Zɇ8­6;VKÙ4°SûªáŒíØŸõ‹ã§9S9{*— |—ú7äÔõ ž˜¯”Â/âÔXã:RŠñ*¬1cÜLY¼‹¬61lüû0uoî퇅,?ड} +NDÐîÒjx«}YDZS+j§Öõ‹¦M£@¾Ú²c®v„šBsÛÊ¿Yn¼7WóbNîà8š‰AÑY·¢õò®¤åNgÛåÍk‚fVÀÙsëÆòòW«I1kÓóöki°‡ïÆÌ&Q÷}²¡;q™`¢¡iÞ{Ñpgá *ízw¡–ãÔ,‘%øªX”gbX+Åì‘©c¢PÅõz¡B<_N_­P?lè¸rúÔ³xÁe]ûfñÂKSIër#†4¦š±—9£ÞfQ)ëå­Lì±Üøò´Yù ßΘÁëÃgðà7uk<>úR!DéØl¶Râ´b³YË~ÿw¥a Œ¤ÅUƒh~å \÷åã ŸòßuxŸÛko Ž5¹³…–É?^YÂiÝ!ŠO\LbR6 v…ÑqÈ儬ü–9«s•í/ö…¶¢S´_‘$æ´Æ1 Ý ÷Ô¨"]d¸1pÐæáWÒБ¯¯þÕC‹L8x ½(ÕreÜvEðš •þRàÒÒIÙ³‡4Ó„˜ ì׋Zú:VNœCbºUŒdÖÍþ‰=¦Aq4ªjeÅÏ ÁÁC™ð‹hL±42jtb@¿†„ZL\'rÂ?’6…ûør¦OYÈáZ=¸ýºfTõѳ¶jñÔ²}ˆp6Ç‘¯lá ¨cÿ† +âlçyϵŸåS±Õn@¸]¡Ü%tƒÅ`;d$g¢ç»ÏJöþ5$êu¹PÚ×´¢ô`6†·cW/_e(k uÚ\Ï/»’. cÄÌÙl»~8ÍäP§Bœ ›ÕŽE³”œ i,Vß§Ö”D)…²Ñ ]sª|=íGݘQ%Ô-<:öéÅWبÕå*b¦Íbμ#l hÍ Z5ì\“±¿ÿÂì¡zרëWh¼8ÍqÌ33‘Å›2ð‹‹§º p{Š3uÃÓwÕâ¨eËf÷n¨Ù3–€â&ZŠ K»Üio»‚œ¥CœªÄ'J"I»?çþ¡ ©[%‹†—y§~|ê6~7²ÉÒu ÓJ“ÛúÓ4PCé5hlw±jô0^Çóm®`H¯<9÷ë&<ÁM­Ø4—a§Ãÿ&ñâe~ìžù)_Ì=ˆÎ"Z@ÿ:v¯­ÂZ3øšHšñ"/0€ÞMjà—yœÌ:éZ·%ƒûÕæþ¯_áuÇíôª ‰¿MbÚh<ÕŠÒ$µÖpšÆÙùî÷©|Û¨/õÌã¤ÖhO—ˆ†D2¦Ì"øŠ&Dûe¾ÄµØzÅø(³ê&æ®4¨S·:þ®C¬Þ†P@™=Bˆ3f³ùºØ¬ ¥4lV+e™BËÚ6·fg×0–èð ÔÉÝ,þv.Ç­hW»èŒV‘m—n¼²Fv¢o݉|4u9á7$ÆnÃÖñ ¢&L`†Qƒ×Á¯ðÆNsË•þï–®ÌÄ?s?+fÉÇb¹ãÍÒX‚¨ÇVÿÁò½µèX§ wö­Éx™çµômQGö1öŸŒ¡Gä?7ÎG½ºÇÊ2|-×à ¶]A¼ÝØrã7>š3i.ö/ø–ùûu¨Ñ…[»×ÆO)¬Õ›Ò<4™Ý»öqàÈQŽKÁð £VÃVtëÖ–zA:Çwmã@ÊINfdã2ü¨Ûœ«ïÉc½b<‡å´ bU'eç6v·séu×Ñ&<¨VÝh”ÌþÃ'HJN'ÛЮـí;Ó2ÒŸõkWìD¯ß‹þ½›çüzðÆFõæiæ·%óæ‡9¿0åT|':Õ £ú%hîØÃŸsf2cî2öÙ›ÑÄú7ñLwêɬžó;¢zrCëêØ”‚¬Ýüüíßh—ßH:¡D%Ô eýïÌœ9—_WíÆY³-]Û]Æ¥Õ’Yóë,¾Ÿ3—çýE¢Š ¡mw®º¤ VUL½âªQËK™mƒW3é“ñL™ù?ý¶’ƒU;2xøí´¯á‡ähBqfRÓ’ ­Rb¢–’š‚3;‹À€Ò>IÀ ûÄ>6,ýƒysbîo Y°b'Q¹møƒô Äb¤?ÖÔ¤ZIã€HUµšï—Zè{ZW³a #{É,V„ôã‘[šS¥ÈqD‘§5޹Iþw[7,æçŸá·¥ÛI©ÖŽÁ#ã†ø`O´"#]lùs.‹2Zѧu$‘-.§™ß~–ÿù+³fÏcþŠm$9â騮.Áù“$õº<Öåï+ÍßûrM"©}ºÛ.£;wòí·ß~¸——?nÀím ¶)S¦8{öìyÚ‡:MC÷ܰVi9·ØÈyÝ40BwêU Mó\Âk†ç ùÞSùn.—SŠçâÓsk¼Ïå>aÀô²®™ó„å9—­¤V,K¡4­àvrÛ šÊÒ~î…ùÛmzޱçÕõTýœ²•—¾Q(­àE ¾ëå¥LÈ©K¾~VÞ/0BQ6YéœL;aÅ.§”¢z•še»’Ó41L³àùàbxiÆš’Æ«ÜÕ tƒ‚㜡cPpü.´ÒicÞÆø"uʽ€0_þPx|WÊ×yéÞê…÷¾òRÿ3ÛvéýòË/ôïßÿF ÈÈù“žïß™@V…â ûš×˜!„(¢"ãÅÅõ-429°a9Ëv§¡ŸëºœE^ »“X2}3ןÀ}¡Í˜ì[÷ÿ$¦¢WdÓ*²ÏVDAJݨÎDÆÿw ÷ŒÛL†a‚‘ÉAo1ÊHaã¢Å¬9…q¾¯Í š|ÏÄ™¨àxQ~ç Éüùúp^ûûnÀNhDmwêCÿ›®¤Q¨…sþ»4{'“^~‰mý>æÓ˜ ,ç¼Bg‡ÏÈ4¼Üæµ/žy†Í7gBÝ`,¹­ŠêóÙQ@¹\ýß¿—Ov^ˆgøgP½fQÕ<¿Ä³v2ÑWŒ2ÏÞ-c½ö‘ÌÂW†ñÒïÉ44üB£hÜúJn½§?#ýÊãGY6ý3&üºŠ­»‘¡™p½㮎áX+:FŸ­ïYyõ~o†ÞÆ{;t ¯;CONÿë"¬ç~¼½Hœ nN9†+ªÏßߊ`3ƒc‰+˜5í}þ»ú0¼9ˆ„uÎwÓ¸@“’b\4¿†ó1 㼿ú…Іó*Ï_ÄZ5:>ô2Ñ©nÀÉîïFóé–¦ {ìjû)”%˜zÕêPõÉQôQZÎf+CŒò3\$ï?HFAŒÞŠ@w*‡W1gòDž\ħ_§Y Vêoflæ³á3~‹?Mz_ËÝÿ‰¥º–Lâºuw–gkŠwv¾gåÔwZ5º<6Š:©:à$ñëWySsþ;òbsö©¸Ê0r‘(×xáEù^Åi!õ¸¤Ù%T±(hÙ†6ÑI xyóvÿ‡üQî¬þ~ cf.gg²FxB' »‡ÞqXŒcü9æ&ý³“ÇÓpÚCˆNèÀM÷ÜI¯ø|¿&ÖÏ˘™ËØzÄ$¼~n2”~MB=Ëè'XúåGLüc#»§â$–¿Ç«—{¾„ÿN¼«'y köôTFw É ŽèGYøñ[L\º‹ÃIé8U  Úpë°ûèˆE¹Ø7ëUžž´šƒ:¶hZö¹‡Gú·¢ºUZI"‡OdàÄŸÈæ=¹±½Æª_~gEb2T©K»ÿ<È#×6 8·Q.ßý¢¥®äÇG³¹Õ3¼3¤ AZÙvˆâv äeŸðÀ­‰l=¬Sµî¥ôò(wuˆÀ®ÒXöÒÙt _L¸› …“ŸßųšñÁ”ÇiTL@1RÙðýG¼?ão6HÅR¥!7½2šš¢™)¬ñ!Ìø›M‡M"¶çæâ–KÂ<Ÿ_ÆZ^ºõQ¶ÜüÆ`WàÞ?Á·M¦Þè)¼Ð,ƒßß{•ÏþNäà±4œ*ˆ Ûsû#q]ƒS¿‚wL×Ï<ÿnñâ÷|ÔYgÉï0î÷õì>x’,‚iýÄÛܲòFl¾öôÚY‘}è­ ]ÃJè¿ V¾ÚŸ‡×öâ³ICièÐPé«xî–'øwð—|Ö/ ›28>o8׿eçù)ÃÄ×ùü}yFúr ¸ÊFDýf„…ÿ"?Ø]“F—¶¤‘ó åÚÃø{f^«7˜04GΪEbT/ D 1ãíÇG³¥¼cFNŒoÖ¼aš‚ÖhWe}_]ÅòÃÉdN¾ƒÇ6•â»df²yÒkŒßRßúˆ‡Z†aË©£Ù«ä&¬Æ+Ê£ï” [@& ý 1’¦­.£©¿'©VæIÖ~#ñál9´\yY¥Gp3£i:Íö©OóäÌ®ò$÷ÕHcù´y÷yZc†ÑÂ/+Ör0òV†ßÆ>–Ï™Æ;÷“úñ(n‰q p²sÚÓ<6%6ý‡ðB=Äß&1fÄH²>x›AõüPz ÿ\Âîj73ü¾¦„ééhqU±ªc„÷Éó=j`S‘ˆ]z:‰«7p$ª?>TÿÔY4}ï?o%ú³‡¸4ÐBX“^ÜýØu„êY5ƒ¦â£øq<Û. KîúµðÄ# ø%­gƧ3ø`mMº ÈýIZ2…OƽFÕFc–à@SÅ÷KsLœN'N—÷%%)nMÏpÐbÐpn¯žÍÖy˜8ò!²>ú‚‡›Ò°{3üæ/eÍñ;iPKã$›–ÀÖø~ê;êdçäGúùqZÂËÍÂ!9™ÐH?”ÊfûÄG6þ$n×ë+¶ÿü<ô(™Ÿ}Ìàx`è:FþC:¦áy @Ocçòu®u;O?Ú€ÔÝ,˜úoްRgÊã´ÊinÄ /òJïHìJT+ÍØÃú‹ÙUm #jN˜‘†¥~mViŽßï§ÓΊìCm(±ÿü‰ïÜë¼µlI6hXS#ûÀ 6¤º9¾4‘´"©¢2Ù¹d'zÝ¡4 LgÖŠbú²„òBSUîg¬È-VxL]G7 >d¦hŒ*\§’c†«‚b†§- eºHÙ¿–Y?îÄ¬ÞæÕChнyéö÷ôL›µ{û¹óÒ*Øóô§ú?›í“.¬XQ.}—ŸÊW®çu‰gÓù5ƒ–ÇÀ•™ÆÑ=«™=n!)öft«ç€´•Œÿá ÷ŽãÞžØ4©‘Ä’!ß0wçÝ4od‚iÓŠNí⯵¥CûhCG2åË ôÙŠ ô5L˜¾‡ˆ~ï0r@<þš¢c«X²ïδ/Wsíóm 0M붦Së†ø+<;o¦§vŽªµ‰‹«]ùÈ~M“€˜–tl݇jM˨#¬|ì/î¾—ý ª×–.õr–M¨Æ¾?ä—µ‡qµ õü"3Mb.¥]ˆ8Ô%DYÌ=ÓksÕµ=h¤¡š9X»è¬X}WB öÔ5Å÷KóVŒøâL4,eü% Å_‘U­ËÜÓ¯ š¢KûwÜÇדVqÇëkÚƒ~ÿã—UIÜUkúïÒH¸.ÀbvJ3u%c¦ì â–x垆æÖY)H]ÆØ©»¨qëǼpgš¢sëX²ï¸Ÿ/?_I¿×:P¥Ä™€I@ÝÖtnׄ­—EfÙ ùuW&-s>ÿj1$4ˆ9õ9;ñìñíèÒ® ZNN¯Ù‡¹ ·ÁL]Zbÿ…6îF‚åmmKãÚÁ$­[Á4\[þaOf¬{ù{]&1ýZPÕâ*¾/›Rñ§Rª ·Ù(£ ò3ÏaÌ`í‹ôî–—^bµ¹éÍÁ\lÅRÊýݲ“é&‘Íëž:ŠPˆ™ºò‚‹åÑwŶ¶}&ñ¡|Ud¼(ÿmã›Ü|ÍhÏ¿MkíN }m]ªYqïÞÊ¿Yn¼7W@Þ2†aà8š‰Ñ(·ϯM¥– \ÞÄÁì[9æj…ßÑÍìÊæ’ÖµphšgçpDÓ¦i _mÜÂg[B´|åP4 ËÍz‹ß±TÞ²~5âWó8|Ò ¸8²|:c¦þÊŠÄ£djX² l'³ ]š»¾ª1UPÎd’9ÛvT£vlNÊÀ0M\ÇJè°j§úª¦iE3ý¼Ÿó–œ›í)ð¡}Ó &mÜÆ1w'ª7§OS /Ì[Éñ«¯&lïR6dÇp[³Plšï_‹Î#Ø‘L‹v1Z,f(³ldgv0ÍÛÕ9õ^@,ZñåÚMuu J^ÝN}N¹uWäo‡§Þš¦ð¬O æpè¤qjYÍsš¼í{Y€ÓlgEö!>Úà,MÿUmÆuÝŒ_”HfǺ¬ÿëqƒîÀ>ýW–tÑľХI5èÔ:»v Ä¾¼˜°¦*ÇjKŠQç4fÔÊO^FNÒíaŘðäèoãñK›•jW¦gfO³Z|¶³Tûúù+Ê¡ïòz*Nä´_âÃÙUÑñ¢ü´ºƒxíáVeoaê«cXU­íãB°*pn ´yøU†4täûò(ü«‡bU'½WÒftÏeÐfÞ*xÊÊ¿€wžÅÊvB¨²øaCÇeš¸öÍä…—¦’ÖåF iL5c/sF½Í¢bÖ·Ú­(œ§.7­Ø-`è9Óò%öK™ª[DYv C7< €BËk.ÅöÒþ>Ö•Æüɨž´®^Ânc蘦ÂçfMŠ|©s??Ó”Âfg†ÛÓg¥ˆÊâð|F9—6•és>ÝvúP.}X\Jê?KíºÔâ½ïÿ`çñ,~ÝQ….\A貯ø~ÅAzÛòoX[ºÔöÃkØ/Ô—›s}ÈRí»ç2fF_?ÞsUBZ¶¬Mò­óãŒÍÜß²u©öwkh QvX½qF­‡8 ¸ÐbE9ô]‰$>œU/Ê?õ ˆ$¾~<š÷á‰gú¶v ¯ÏÜM– ÖjqÔ²e³{7ÔŒ‰¥nl,õbc©Cd•"Y€ë Ë·¤c‹Š£š l ¨cOeÃʃ8s¿T®ý,ß˜Š­vÂíÅüбøl‡ŒäLôÓ¼L*{ÿZõºÜ8¨í×'¡QcꆜVQyJî—3SÚÈÌØÁëÓqÄ&äô£FÕ¶ý鲕o^ÎüEG©Ó«+ÑöâÏ;°‡'Pۖš¥ûÉ*ÔÏöˆFÄúdíÒ§ÞsîcÉÚTìuQÃO¡¬¡Ô Qß±ŒÓù˜,~„úAzRi?çÓk§7åÕ‡¾ÚPªþÃFí+®¦nÊ_|?g&ëÚÑ!:’6Ý"Ù?ïG~˜³‹ðsœû«ª+åùU|Σ”S÷Ì<ë˜qj†O¡Ü$;M!´ÒîïÁ—pS÷*¤/Ë·Û2¼Þ2âBgÜwÅøp–Up¼¨À‹4B› æÙ~«xxÒ»|×výcÚpgßšü÷‡—y^@ß5qdcÿÉzônHnž“´x_Ö¹‚¦Õ]ìœ?™iû«qÝ#-Õ*¸%ƒûÕæþ¯_áuÇíôª ‰¿MbÚh<ÕŠâ‹5œ¦qv¾û}*ß6êK=ó8©5ÚÓ½Qh©¯F±×hH$ÓøaÊ,‚¯hB´ÿQö§ŸYwiaÅ÷Kpúª3ºŠ³¸_ûWò÷²L2ö²ä»Ï™~4Ž{߸”àÜ~ lÂ-7D3sÒÛìrÕæþ.µ°—°?ª*íÚ/Š{¦>ÉSæ\Û<GÆ12b»Ò=®5÷ÝÃ_>ÃÿüïášxÅö¹Ÿ1qmîü_kB•[]{Ä0æ³÷xuB×5Àr`+'J€m5hVßÁW¿L૦ýˆ7q²f'z7(¦€Óhg®ŠèCŸmhZŠþ¬µºrCüXÞž°„ˆ[ëgÃ~yOjÃ4#’ÁÏÔÅq1›(Æ9Aó£Q3Ž­þƒå{kѱNÉ1ãL®â,v-%‘ukÂÔ38± ‹fNcAZ7÷®‡¿R¥ÛßU­ï}œ«—>˸¡÷°ùækéÔ¨Õ,'9°m{kßÂýγX‘½•÷ÝϬFoðý‹­öÖçåÑwÅP!ζóð"š? û?Ì5 G2ùÓ?¹â•«hß5­Ó”›ž{€;ç^méGü ×0–1³>æ¹c&Õã.ãîÿ»—ÿÔwPlÒÂh7ôaú¾ñSG½H¶­4¤K£ÐRß ÐÓç:Æ»S'óú|'&` Š qô™ÜøÖŸÆwùî—`Lt·Ž~š·ºöºY‚ˆou ÕMåù'2ÑmaD7êÌãŸÞËuqþùúÑNlßþ´üòÿXQÿ6ºFÙK1í@“¡ñA•ødæg<7-ÃÅÃ[Ò-.’w½Ã‡ðá·ïòø“ðmöÞÃôOÈÝ®Ø[_ãÕ”7ùäû·xr‚Í?”ðú-iRÅZòQ ­ ~œ^þ„‰/=I– ÚÝÙ˜î Š[é4ÚY‘}è« Më–¢ÿKM.¿¶ ï¼yŒWÆâP -²3}ãÆðž«=ëøÿ]¹HUôUY%ò£jÓíîÿðçÛs;»­‡5*1få3°Ž}ÁDžøïDÀB@hu¢›ôåñp]‹œXºýÝRµ#ÏLKËÏ?绿¾âͯ“qc§J&\~³ ¿ó+VÙ¤dê„ÆTÁVÁ}ç›CâÃYTÑñÂ[ɶ)S¦8{öìYæ ›†ŽQäª!C70Õ©×MÓÀ4ͼÃþJåœ`íÜÍC`n«7™p_EÞl\áÅ4 L#ç.¥Ð”–ïËhæÜ|ÐÛL9ïån[Ó ]Âîm]OÐ<']ض§”¦rÊñ²¾iàYýÔTµ·¾òÙ/9e枨YV+×,åòŽWù?~]Ud;/–>ŠÝß/%´/¸õ3üð¥Õqm¾ÐûNœ–r=ÄyæŠ;4)NתµËèÜ¡[?Ïœ©mðür× –É}Ï u^M}Wd;/–>¼p¤¤$³s÷vê×+ÿCœç“ò‚Šlß…Þw¦Óçäç™;³iyá[ÙOfTX¬¾NO-î½óME¶óbéCq!*ߘq!¨Èö]è}'NG%KÐDE1M³RÜ!]q~˜!Ĺ% ÚEÀßÈæ­iÒè,rr§8Ï™n(jº ¼™³Ì©{û¿7†a°}çVƒ.êÛ 1C\8 Ç ÏkÞþ_ùâ…$húq Ø‘¸?þš®«"D¥VµJ5¢£êœëjœs3„(YEÇ IÐ.V«„úÏu5„¨ü^Ÿ?x±‘˜!D)Tp¼í"q±²B”Ä !Î-9T!„¢’‘M!„¢’‘M!„¢’ñš ¼,U!„BœM^499T!„âÜ‘CœB!„•Œ$hB!„•Œ$hB!„•Œ$hB!„•Œ$hB!„•Œ$hB!„•Œ$hB!„•Ì…û°t=™‹þdõ®“Dö¸™+jÙK~漑ƿëײqwUÚ÷¢m„­è:§S®B!D\03hfúF¾xâ6®½óEfìÎÂÌÞÁWïŽcü×?²6Y§TGÈÚ¸ÿ·>ÊßGÝÞ×9rÏ#;…;wr8Ë8×Uç˜ì Bqþ9k3hÆñùŒ¸û=Ö: »¼ÀÄÇ/#ÔR~sOîY´1‰4ý8îÌà†p0LÓ41)}e†Qü:§Sn®üðâSŒ]“„ÓPøW§VƒÖôº¾}.­‰ßi¦ÏFòô6ëõÜþÉGÜë'³|•™ì B! 9K3h.výø5k²\¸u”…Sùý°ûLÒ›"lQ½1¼?·Üù4´C«ì£é$é`Yn]×1u7ɇر|=û(£þ<Šët;È4på$š2gr}A!D!geÍL]Ç´9û1Ì`âk¤³óðV¾ùq½ï®CS`œ`þ3ƒµÎç—™2¢Aš›=ÓbÈä}uïaÂÛWrlÂK¼ùÛ6§éàJFÝxß@ºÕñGËÚÆÔ¿âïì`Ò›]ÆðºÞ*’ÆÚqÿã _eä-˜ÂÂ7†0ÿh FH4—tÄ£·u$Ò¯˜¬OOfÜñŒù›¹‰jÄîep×X|¥Á9ÇGk üˆ±ê ’Ö1ùÅç™–x‚…ÓÿážÝ8R\›]™?i<³þÙÌ®#'Èpƒ«yåÙúx²ßLºÿF&+ ö&¼wÑ6ãË¿áƒ/~bÙždœšƒªõºòßï£CU«Ì®œ+²/!„Èç,Ì $-û–¿RM̸›yäþ.„hpxÞ÷¬K3ÅŒƒ‰,\v˜õcñ+¾hQÁd_Bš ™œÜðKÒLL­ }ø*=Ãs¯ s²å“{yxÎ1/˜Ç¶Ûâ¹$@¡BšqSp~wÄÐÎ7Ó¾š…¢J|¡$’´ûsU²Ø‘aøž=°Õ qü±ÝŪÑÃx9p#âJ[F ?>u¿Ùdé:†i¥Émýi¨¡ô¢å>ßæ †ôšÁ“s±nÂÜ4ÑŠMÓqv:üo/^”7káçÄp o g){›s9béÜØÎâÕY¬{ûN®cGèÎÛcî#~Ïd†=þ'ƒ«S= ›ƒ‡ LlDņ\À•8Ⱦ „*ò*N#…Õ³W’išhMzÒ¦ºkÎ90‹?õ{\N¸Rpâ/ælÉȹˀñ}®§¾ÒPÔ¤Ï ÌÉlîâÕû¯¢Iu;‡v°qó^œ~a:‘0Õ IDATD7mFÝ KÑCˆÖš\ýèÃ\ݰ*VTµá߸„2lÕiÞ:ž¨P¦3ƒ ·*1­¸ññ÷xýšÚø)ïå*L«aïóÖ+iZ+‹î$ËqÔ´è§}ÿ©2·9—V•.>EÿËjjÕÉLýöî;¾‰òàøç.I“6IÓ:hK)¥”eï! ŠÙ‚,•¡2eª(âFÁ¦” ?–Š¢¢ (¢€€‚( ”!›…î™ÜýþHº“¶@¶<ïyÑæžÜ]îyšûæ™Y¸›%²l`U=¨êçNÖ•XNŽGë]ƒ;… -½)Åyƒ…R&Ê‚ ÂíÅÙǰnùòå™÷ÝwRQÕ>%Ó×Ì1j¬ÀF{'zìµ¹›U›‚Š„$ËùúÁ¨ªâ˜F#ï;e)çuy÷çèH­æ>Wô>@U”¼ë7I’$èSx¿9秪¹Ë?9}má} ¬1¹ž÷œwÿ*jöÉd¿FU+!äì I–¯3¯…ë!Ê‚ ÂíbãÆôéÓ§¤:)y~NÒohK†$kиވÆéF Ùù{×;tò: YÎÿ\ÑûpŒ€s½Ùå~sö]â{›ó}8ÝçU½ç¼ûwr2’„\ÔnQA„üÄŒ”‚ ‚ eÌ-ï |éÒ%%¡(žuu3¦g©ù§èqÐÊPÃOϘ»|¨¨ Ñ ‚P""@¡ÜˆK¶2ù«X¢ªûRËÓçS9M«‘sÍ÷Úâ:V“3µŽ«Ôª¢rêR2/­e^¿ |MbjAŠ'4A(‡âãã9zô(6›íš÷¡(Êu½ìÍÓYYY×µ Ø}ȲŒÅbáU öñ Ôß³Ìõ[uy6‰POââ“Ùrà"¡š3(×xÝUUÅjµ^ó9‚ýZ_O·›Í†¢¸®]ÌΫˆˆ,Ë5Gnwe.@»|9ŽÃ1‡HÏpÝq\¯×Q3’J>•nâ™ BÙžžÎ¾}ûhذÞÞÞ¥ºoNWªûsF–e´Ú«ûèQ…sçαaÃ

Glom-Benutzerhandbuch V0.2 für glom v1.6 2004 Murray Cumming 2008, 2010Mario Blättermann (mariobl@gnome.org)2010.Christian Kirbach (Christian.Kirbach@googlemail.com) Glom Entwickler-Team Das vorliegende Dokument kann gemäß den Bedingungen der GNU Free Documentation License (GFDL), Version 1.1 oder jeder späteren, von der Free Software Foundation veröffentlichten Version ohne unveränderbare Abschnitte sowie ohne Texte auf dem vorderen und hinteren Buchdeckel kopiert, verteilt und/oder modifiziert werden. Eine Kopie der GFDL finden Sie unter diesem Link oder in der mit diesem Handbuch gelieferten Datei COPYING-DOCS. Dieses Handbuch ist Teil einer Sammlung von GNOME-Handbüchern, die unter der GFDL veröffentlicht werden. Wenn Sie dieses Handbuch getrennt von der Sammlung weiterverbreiten möchten, können Sie das tun, indem Sie eine Kopie der Lizenz zum Handbuch hinzufügen, wie es in Abschnitt 6 der Lizenz beschrieben ist. Viele der Namen, die von Unternehmen verwendet werden, um ihre Produkte und Dienstleistungen von anderen zu unterscheiden, sind eingetragene Warenzeichen. An den Stellen, an denen diese Namen in einer GNOME-Dokumentation erscheinen, werden die Namen in Großbuchstaben oder mit einem großen Anfangsbuchstaben geschrieben, wenn das GNOME-Dokumentationsprojekt auf diese Warenzeichen hingewiesen wird. DAS DOKUMENT UND VERÄNDERTE FASSUNGEN DES DOKUMENTS WERDEN UNTER DEN BEDINGUNGEN DER GNU FREE DOCUMENTATION LICENSE ZUR VERFÜGUNG GESTELLT MIT DEM WEITERGEHENDEN VERSTÄNDNIS, DASS: DIESES DOKUMENT WIRD »WIE VORLIEGEND« GELIEFERT, OHNE GARANTIEN IRGENDEINER ART, SOWOHL AUSDRÜCKLICH GENANNTE ALS AUCH ANGEDEUTETE. DIES BEZIEHT SICH AUCH OHNE EINSCHRÄNKUNG AUF GARANTIEN, DASS DIESES DOKUMENT ODER VERÄNDERTE FASSUNGEN DIESES DOKUMENTS FREI VON HANDELSDEFEKTEN, FÜR EINEN BESTIMMTEN ZWECK GEEIGNET IST ODER DASS ES KEINE RECHTE DRITTER VERLETZT. DAS VOLLE RISIKO WAS QUALITÄT, GENAUIGKEIT UND LEISTUNG DES DOKUMENTS ODER VERÄNDERTE FASSUNGEN DES DOKUMENTS LIEGT BEI IHNEN. SOLLTE EIN DOKUMENT ODER EINE VERÄNDERTE FASSUNG DAVON FEHLER IRGENDEINER ART BEINHALTEN, TRAGEN SIE (NICHT DER URSPRUNGSAUTOR, DER AUTOR ODER EIN MITWIRKENDER) DIE KOSTEN FÜR NOTWENDIGE DIENSTLEISTUNGEN, REPARATUREN ODER FEHLERKORREKTUREN. DIESER HAFTUNGSAUSSCHLUSS IST EIN ESSENZIELLER TEIL DIESER LIZENZ. DIE VERWENDUNG EINES DOKUMENTS ODER EINER VERÄNDERTEN VERSION DES DOKUMENTS IST NICHT GESTATTET AUßER UNTER BEACHTUNG DIESES HAFTUNGSAUSSCHLUSSES UND UNTER KEINEN UMSTÄNDEN UND AUF BASIS KEINER RECHTSGRUNDLAGE, EGAL OB DURCH UNERLAUBTEN HANDLUNGEN (EINSCHLIEßLICH FAHRLÄSSIGKEIT), VERTRAG ODER ANDERWEITIG KANN DER AUTOR, URSPRUNGSAUTOR, EIN MITWIRKENDER ODER EIN VERTRIEBSPARTNER DIESES DOKUMENTS ODER EINER VERÄNDERTEN FASSUNG DES DOKUMENTS ODER EIN ZULIEFERER EINER DIESER PARTEIEN, HAFTBAR GEMACHT WERDEN FÜR DIREKTE, INDIREKTE, SPEZIELLE, VERSEHENTLICHE ODER FOLGESCHÄDEN JEGLICHER ART, EINSCHLIEßLICH UND OHNE EINSCHRÄNKUNGEN SCHÄDEN DURCH VERLUST VON KULANZ, ARBEITSAUSFALL, COMPUTERVERSAGEN ODER COMPUTERFEHLFUNKTIONEN ODER ALLE ANDEREN SCHÄDEN ODER VERLUSTE, DIE SICH AUS ODER IN VERBINDUNG MIT DER VERWENDUNG DES DOKUMENTS UND VERÄNDERTER FASSUNGEN DES DOKUMENTS ERGEBEN, AUCH WENN DIE OBEN GENANNTEN PARTEIEN ÜBER DIE MÖGLICHKEIT SOLCHER SCHÄDEN INFORMIERT WAREN. Murray Cumming Glom Entwickler-Team
murrayc@murrayc.com
Glom 1.6 20. juni 2004 Murray Cumming Murray Cumming Dieses Handbuch beschreibt Version 1.6 von Glom Rückmeldungen Um einen Fehler zu melden oder einen Vorschlag zu Glom oder zu diesem Handbuch zu machen, können Sie das Fehlererfassungssystem von GNOME verwenden, in welchem Sie als Produkt Glom auswählen. Bitte durchsuchen Sie zunächst die Fehlerdatenbank, um sicher zu gehen, dass über Ihr Anliegen nicht bereits berichtet wurde. User manual for Glom.
MY-GNOME-APP mygnomeapp Einführung Glom erlaubt Ihnen das Erstellen und Benutzen von Datenbanksystemen. Erste Schritte Glom starten Sie können Glom auf folgende Arten starten: Menü Anwendungen Wählen Sie BüroprogrammeGlom. Beim Start von <application>Glom</application> Wenn Sie Glom starten, so wird das folgende Fenster erscheinen. Sie können nun eine bestehende Glom-Datei öffnen oder eine neue Datei erstellen, die gegebenenfalls auf einem der Beispiele basiert.
Glom-Startfenster, Öffnen einer bestehenden Datei Zeigt das Haupfenster von Glom während eine bestehende Glom-Datei geöffnet wird.
Glom-Startfenster, Erstellen einer neuen Datei Zeigt das Glom-Hauptfenster während der Erstellung einer neuen Glom-Datei.
Glom als Operator verwenden Um ein vorhandenes Glom-Dokument zu öffnen, können Sie es entweder im Dateimanager öffnen oder Sie wählen Glom im Menü Anwendungen und öffnen dann das gewünschte Dokument. Glom fragt Sie nach dem Benutzernamen und dem Passwort zum Zugriff auf die Datenbank. Ihren Benutzernamen und Ihr Passwort stellt Ihnen Ihr Systemverwalter zur Verfügung. Wenn Sie ein vorhandenes Dokument öffnen, befindet sich Glom in der Operator-Ebene. Diese Ebene ermöglicht Ihnen die Suche und Bearbeitung von Datensätzen, verbietet aber Änderungen an der grundlegenden Struktur der Datenbank. Navigation Jede Datenbank besteht aus einer Reihe von Tabellen. Um eine andere Tabelle zu betrachten, wählen Sie Tabellen aus dem Menü Navigation. Dann führen Sie einen Doppelklick auf die Tabelle aus oder wählen Sie diese aus und klicken auf den Knopf Öffnen.
Navigieren zu einer Tabelle Navigieren zu einer Tabelle.
Betrachten und Eingeben von Daten Im Datenmodus können Sie Informationen entweder in der Listenansicht oder Detailansicht eingeben. Die Listenansicht Die Listenansicht zeigt sehr viele Datensätze gleichzeitig und zeigt üblicherweise nur die wichtigsten Felder an. Wenn Sie in ein Feld Daten eingeben, werden diese unmittelbar in der Datenbank gespeichert, sobald Sie die Eingabe in diesem Feld beendet haben. Falls es sich um ein Feld mit Datums-oder Zeitangaben handelt, werden diese Daten für Sie überprüft. Um einen neuen Datensatz zu erstellen, klicken Sie auf den Knopf Neu, oder beginnen Sie mit der Eingabe in einem Feld in der letzten leeren Zeile. Eine Zeile mit leeren Feldern für einen neuen Datensatz wird erstellt, die Sie nun ausfüllen können.
Die Listenansicht Die Listenansicht.
Um die Datensätze zu sortieren, klicken Sie einfach auf den Spaltenkopf. Beispielsweise könnten Sie auf eine Datumsspalte klicken, um die Liste der Eingänge nach Datum zu sortieren. Wenn Sie anschließend erneut darauf klicken, wird die Reihenfolge der Liste umgekehrt.
Die Detailansicht Die Detailansicht zeigt nur einen Datensatz und stellt alle Felder in sinnvoller Anordnung dar. Wenn Sie in ein Feld Daten eingeben, werden diese unmittelbar in der Datenbank gespeichert, sobald Sie die Eingabe in diesem Feld beendet haben. Falls es sich um ein Feld mit Datums-oder Zeitangaben handelt, werden diese Daten für Sie überprüft. Um einen neuen Datensatz zu erstellen, klicken Sie auf den Knopf Neu. Ein neuer Datensatz mit leeren Feldern wird angelegt, welche Sie ausfüllen können.
Die Detailansicht Die Detailansicht.
Daten suchen Wählen Sie den Suchmodus aus dem Menü Modus. Die Felder in der Listen- und Detailansicht werden nun leer sein. Außerdem erscheint ein Suchen-Knopf am unteren Rand des Fensters. Geben Sie Informationen oder Teile von Informationen in ein Feld ein, um Datensätze zu finden, welche die angegebene Information in diesem Feld enthalten. Geben Sie beispielsweise »Jim« in einem Namensfeld ein, um Datensätze zu finden, die in diesem Feld »Jim« oder »Jimmy« im Namen enthalten. Wenn Sie auf den Knopf Suchen klicken, sucht Glom nach Datensätzen und zeigt diese an. Wenn nur ein Datensatz gefunden wurde, wird dieser in der Detailansicht angezeigt. Falls mehrere Datensätze gefunden wurden, werden diese in der Listenansicht angezeigt. Drucken von Berichten Falls der Entwickler Ihrer Datenbank Berichte für eine Tabelle festgelegt hat, dann erscheinen diese möglicherweise im Menü Berichte. Wählen Sie zur Erstellung eines Berichts den gewünschten Eintrag im Menü aus. Falls Sie vorher bereits eine Suche ausgeführt haben, dann wird der Bericht nur die aktuell gefundenen Daten anzeigen. Anderenfalls werden alle Daten im aktuellen Bericht erscheinen. Beachten Sie, dass es für jede Tabelle eigene Berichte gibt. Sie werden daher zu der entsprechenden Tabelle wechseln müssen, um einen bestimmten Bericht erstellen zu können.
Ein Bericht Ein Bericht.
Glom als Entwickler benutzen Wenn Sie ein neues Dokument anlegen, befindet sich Glom in der Entwickler-Ebene. Sie können nach dem Öffnen eines vorhandenen Dokuments mit Hilfe des Menüs Benutzerebene in die Entwicklerebene wechseln. Das ist Ihnen nur dann gestattet, wenn Ihr Systemverwalter dies erlaubt hat. Tabellen hinzufügen Wenn Sie Tabellen im Menü Navigation wählen, wird eine Liste der vorhandenen Tabellen angezeigt. Dieses Fenster erscheint auch dann, wenn nach dem Anlegen eines neuen Dokuments eine Verbindung zu einem Datenbankserver hergestellt wurde. Um eine neue Tabelle anzulegen, klicken Sie auf den Knopf Hinzufügen und geben Sie den Namen der neuen Tabelle ein. Glom wird Ihnen einen menschenlesbaren Namen für diese Tabelle vorschlagen. Als Operator sehen Sie diesen Namen anstelle des Namens der aktuellen Tabelle. Sie können auch Tabellen als verborgen für Operatoren markieren. Beispielsweise sollen Operatoren zwar die »Rechnungszeilen« als Bezugsdatensätze aus der Tabelle »Rechnungen« sehen können, allerdings niemals die Möglichkeit erhalten, direkt zur Tabelle »Rechnungszeilen« zu navigieren. Sie können auch eine Tabelle als Vorgabetabelle markieren. Diese Tabelle wird immer dann angezeigt, wenn ein Operator ein vorhandenes Dokument öffnet, ohne dass er darum gebeten wird, eine Tabelle aus einer Liste zu wählen. Sie können dieses Fenster auch dazu verwenden, eine vorhandene Tabelle umzubenennen. Klicken Sie auf den Knopf Öffnen, um die ausgewählte Tabelle zu betrachten. Bearbeiten von Feldern Wählen Sie Felder im Menü Entwickler. Daraufhin wird Ihnen eine Liste der Felder in dieser Tabelle angezeigt. Neue Tabellen erhalten automatisch ein Feld für den Primärschlüssel. Bei Bedarf können Sie dieses Feld ändern. Klicken Sie auf den Knopf Hinzufügen, um ein neues Feld hinzuzufügen. Glom wird Ihnen einen menschenlesbaren Namen für dieses Feld vorschlagen, aber Sie können diesen Namen auch ändern. Als Operator sehen Sie diesen Namen anstelle des Namens des aktuellen Feldes. Um für ein Feld weitere Details festzulegen, wählen Sie das Feld aus und klicken Sie auf den Knopf Details.
Bearbeiten von Feldern Bearbeiten der Tabellenfelder.
Primärschlüssel Jede Tabelle muss genau einen Primärschlüssel haben. Der Wert in diesem Feld ist eindeutig, was bedeutet, dass der Wert dieses Feldes nur in einem Datensatz in der Tabelle erscheinen darf. Beispielsweise hat jeder Datensatz in einer »Kunden«-Tabelle eine »Kundennummer«. Dieser Wert wird dazu verwendet, um einen Bezug dieses Kunden zu anderen Tabellen herzustellen, zum Beispiel zu den Datensätzen »Aufträge« und »Rechnungen«. Im Abschnitt Erstellen von Beziehungen finden Sie weitere Informationen darüber, wie Sie Bezüge von Tabellen zueinander erstellen können. Feldtypen Glom bietet einige einfache Feldtypen: Zahl Text Datum Zeit Boolesche Werte - entweder wahr oder falsch Bild Berechnete Felder Die Werte von Feldern können mit Hilfe der Programmiersprache Python durch Ausdrücke in anderen Feldern definiert werden. Die Berechnung sollte die Implementation einer Python-Funktion sein, die einen Wert zurückgibt. Der Rückgabewert wird dann als Wert für dieses Feld verwendet. Der Wert wird neu berechnet, sobald sich eines der Quellfelder ändert. Achtung: Derzeit funktioniert dies nur für Vorgabewerte. Sie können in der Berechnung noch keine Feldwerte verwenden. Sie können auch Berechnungen verwenden, um einen Vorgabewert für ein Feld anzugeben. Wählen Sie hierzu den Reiter Vorgabewert im Fenster Felddetails. Aktivieren Sie das Ankreuzfeld Wert berechnen und geben Sie anschließend eine Python-Berechnung ein. Sie können diese Berechnung im Fenster Bearbeiten überprüfen.
Erzeugung von Layouts Jede Tabelle hat eine Listenansicht und eine Detailansicht. Als Vorgabe zeigen diese alle Felder in einer Tabelle an, in der Reihenfolge, wie sie angelegt wurden. Sie können dieses Layout ändern, indem Sie Layout aus dem Menü Entwickler wählen. Anordnen der Listenansicht Für die Listenansicht können Sie die Reihenfolge der angezeigten Spalten angeben, sowie ob einige Felder verborgen werden sollen.
Bearbeiten der Listenansicht Bearbeiten der Listenansicht.
Festlegen der Anordnung der Detailansicht Für die Detailansicht können Sie Gruppen von Feldern anlegen und diese mit einem Titel versehen. Sie können Felder in diesen Gruppen platzieren und die Abfolge der Felder in diesen Gruppen angeben. Sie können auch die Reihenfolge dieser Gruppen festlegen. Sie könnten beispielsweise in einer Tabelle namens »Kontakte« eine Gruppe »Name« anlegen und die Felder »Titel«, »Vorname« und »Nachname« in diese Gruppe einfügen. Für die »Adresse«-Felder könnten Sie dann wiederum andere Gruppen verwenden.
Bearbeiten der Detailansicht Bearbeiten der Detailansicht.
Erstellen von Beziehungen Zwischen den Tabellen in einer Datenbank bestehen oft Beziehungen. Beispielsweise gibt es in einer »Rechnungen«-Tabelle ein Feld namens »Kundennummer«. Der Wert in einem solchen Feld gibt einen Datensatz in der Tabelle »Kunden« mit dem gleichen Wert an. Glom kann aus dem Bezugsdatensatz weitere Informationen anzeigen, wie den Namen des Kunden. Anzeigbar ist auch eine Liste verschiedener Bezugsdatensätze, zum Beispiel »Rechnungszeilen«, die einen Bezug zum Datensatz in der Tabelle »Rechnungen« haben. Um Beziehungen zu erstellen, wählen Sie Beziehungen im Menü Entwickler. Daraufhin wird eine Liste der vorhandenen Beziehungen angezeigt. Klicken Sie auf den Knopf Hinzufügen, um eine neue Beziehung zu erstellen und geben Sie einen Namen für die Beziehung ein. Sie sollten dann ein Feld in der aktuellen Tabelle wählen und ein Feld in einer weiteren Tabelle, für welches die Beziehung erstellt werden soll. Diese Beziehung findet beliebige Datensätze in der anderen Tabelle, für die die Werte in beiden Feldern gleich sind. Sie können die Beziehung an den folgenden Stellen verwenden. Anzeige eines Bezugsfeldes in der Listen- oder Detailansicht. Anzeige einer Liste von Bezugsdatensätzen in der Detailsansicht. Nachschlagen eines Wertes für ein Feld in einem Bezugsdatensatz. Beispielsweise um den aktuellen Preis eines »Produkts« in einem »Preis«-Feld eines »Rechnungszeilen«-Datensatzes zu kopieren. Berechnung eines Feldwertes. Benutzer-Administration Um die Operatoren festzulegen, welche die Datenbank nutzen dürfen, und um anzugeben, welche Zugriffsrechte sie zu den verschiedenen Tabellen erhalten sollen, wählen Sie Benutzer im Menü Entwickler. Übersetzungen Die Benutzeroberfläche von Glom (wie auch dieses Dokument) wurde in verschiedene Sprachen übersetzt, wie Sie möglicherweise sehen können, wenn Sie Ihren Rechner mit einer nicht-englischen Benutzeroberfläche verwenden. Zusätzlich zeigt Glom Daten und Zahlen entsprechend den lokalen Konventionen des Benutzers an. Ein Benutzer in den USA würde beispielsweise einen Preis als 1.99 und ein Datum als 1/13/2008 angezeigt bekommen, während ein deutscher Benutzer der gleichen Datenbank den Preis als 1,99 und das Datum als 13.1.2008 sehen würde. Das von Ihnen erstellte Glom-System wird sicherlich Text enthalten, der übersetzt werden muss, sofern es von Benutzern verwendet werden soll, die nicht die gleiche Sprache sprechen. Beispielsweise werden Sie übersetzte Versionen für die Namen Ihrer Tabellen, die Felder und die Berichte benötigen. Alle diese Textobjekte sehen Sie zusammengefasst in einer Liste, wenn Sie Übersetzungen im Menü Entwickler wählen. In diesem Fenster können Sie angeben, in welcher Sprache der Originaltext verfasst wurde. Außerdem können Sie hier Übersetzungen für jedes Textobjekt in weiteren Sprachen einfügen. Wenn das Glom-System von einem Benutzer der jeweiligen Sprache geöffnet wird, dann werden diese Textobjekte in der Benutzeroberfläche angezeigt.
Übersetzungen Übersetzungen.
Erfahrene Übersetzer dürften mit dem .po-Dateiformat keine Schwierigkeiten haben. Es gibt verschiedene Werkzeuge, die mit diesem Dateiformat umgehen können. Durch Anklicken des Knopfes Exportieren erstellen Sie eine .po-Datei, die Sie einem separaten Werkzeug weiterbearbeiten oder an einen Übersetzer schicken können. Die resultierende Übersetzung können Sie dann mit dem Knopf Importieren wieder in das System einfügen.
Anfertigen von Berichten Hinzufügen oder Bearbeiten von Berichten Glom kann Berichte erstellen, um spezifische Felder aus einer Reihe von Datensätzen sortiert und gruppiert anzuzeigen. Beispielsweise möchte ein Händler einen Bericht über alle innerhalb eines Monats verkauften Produkte anzeigen, gruppiert nach Produktart und innerhalb jeder Gruppe nach Preisen sortiert. Jede Tabelle verfügt über ihre eigenen Berichte, die für den Operator im Menü Berichte einsehbar sind. Um einen Bericht anzulegen oder die Eigenschaften eines vorhandenen Berichts zu ändern, wählen Sie Berichte im Menü Entwickler.
Erzeugen oder Bearbeiten von Berichten Erstellen oder Bearbeiten von Berichten.
Beachten Sie, dass jeder Bericht sowohl eine Kennung als auch einen menschenlesbaren Namen hat. Dies ermöglicht die Anzeige eines übersetzten Namens, falls der Bericht auf einem Rechner in einer anderen Sprache genutzt wird.
Bearbeiten eines Berichts Ein Glom-Bericht gliedert sich in drei Bereiche: Die Kopfzeile, welche am Beginn des Berichts erscheint. Der Hauptteil, in welchem die Datensätze und die Zeilen der Zusammenfassung erscheinen, mit den aktuellen Daten aus der Datenbank. Die Fußzeile, welche am Ende des Berichts erscheint. Innerhalb eines Bereiches, wie dem Hauptteil, können Sie Teile einfügen, wie Felder, Text, oder Bilder. Diese erscheinen üblicherweise in einer Zeile in dem ausgedruckten Bericht, mit einer Zeile für jeden Datensatz. Im einfachsten Fall wird dies der Listenansicht von Glom stark ähneln. Sie können Teile zu Ihrem Bericht hinzufügen, indem Sie sie aus der Liste Verfügbare Teile auswählen und dann auf den Knopf Hinzufügen klicken. Der Teil wird dann zur Teileliste im ausgewählten Bereich hinzugefügt. Um Details zu den Teilen anzugeben, wie den Text oder das anzuzeigende Bild, oder umdas anzuzeigende Feld auszuwählen, wählen Sie den Teil in der Teileliste aus und klicken Sie auf den Knopf Hinzufügen. Sie können auch mit dem Knopf Formatierung die Feldformatierung anpassen, wenn Sie ein Detail- oder Listenlayout angeben wollen.
Bearbeiten eines Berichts Bearbeiten eines Berichts.
Einige Teile können weitere Teile enthalten sowie Eigenschaften zur Steuerung, wie diese Unterteile angezeigt werden. Beispielsweise gruppiert der Teil Gruppieren nach die Datensätze anhand der Felder. Oder ein Produktbericht gruppiert eine Produktliste nach Produkttyp. Sie können sogar eine zweite Untergruppierung innerhalb des Hauptteils Gruppieren nach einfügen. Wählen Sie hierzu den Gruppieren nach-Hauptteil der obersten Ebene in der Teileliste aus und fügen Sie einen neuen Gruppieren nach-Teil aus der Liste Verfügbare Teil hinzu. Sie könnten so beispielsweise Ihre Produkte innerhalb jeder Produkttypgruppe nach Hersteller gruppieren. Um das Feld festzulegen, nach dem die Datensätze gruppiert werden sollen, wählen Sie Ihren Gruppieren nach-Teil aus der Teileliste aus und klicken Sie auf den Knopf Bearbeiten. Anschließend können Sie dann das Feld auswählen, nach dem die Datensätze gruppiert werden sollen, sowie die Felder, nach denen diese Datensätze innerhalb der Gruppe sortiert werden sollen. Außerdem können Sie zusätzliche Felder angeben, die in der Titelzeile der Gruppe angezeigt werden sollen. Auf diese Weise könnten Sie zum Beispiel Produkte anhand der Herstellerkennung gruppieren, aber trotzdem den Herstellernamen anzeigen.
Bearbeiten eines <guilabel>Gruppieren nach</guilabel>-Teils Bearbeiten eines Berichts.
Der Teil Vertikale Gruppe kann weitere Objekte enthalten. Er erlaubt Ihnen beispielsweise die Anordnung von Feldern untereinander anstelle von waagerecht hintereinander in einer Zeile. Dies könnte zur Gruppierung von aufeinander bezogenen Feldern nützlich sein, oder einfach nur, um mehr Informationen in der Zeile des Datensatzes im Bericht anzuzeigen.
Ein Bericht mit vertikalen Gruppen Ein Bericht mit vertikalen Gruppen.
Wenn Sie dies beendet haben, klicken Sie auf den Gruppieren nach-Knopf, um die Berichtsdefinition zu speichern. Ihr Bericht steht dann im Menü Berichte zur Verfügung. Weitere Informationen hierzu finden Sie im Abschnitt Drucken von Berichten.
Dialoge Dialog: Startdialog Dieser Dialog ermöglicht dem Benutzer die Auswahl eines vorhandenen oder das Anlegen eines neuen Dokuments. Vorhandene Dokumente können Sie aus der Liste der kürzlich geöffneten Dokumente auswählen. Alternativ können Sie eine Datei im Dateiauswahldialog auswählen. Dokumente können auch über das Netzwerk geöffnet werden, falls andere Benutzer Glom im lokalen Netzwerk ausführen. Letztendlich kann ein neues Dokument auch entweder durch Öffnen einer vorhandenen Vorlagendatei erstellt werden, die bereits einige Tabellen und Datensätze enthält, oder durch Erstellen eines leeren Dokuments. Dialog: Neue Datenbank Dialog: Datenbank anlegen Dialog: Verbindung Dieser Dialog erfragt den Benutzernamen und das Passwort für eine Verbindung zu einem Datenbankserver. Dies sind üblicherweise nicht der Benutzername und das Passwort, mit dem Sie sich am System anmelden. Alle Glom-Systeme benötigen einen Datenbankserver, auf dem die aktuellen Daten gespeichert werden. Falls dieser Datenbankserver nicht auf Ihrem lokalen Rechner läuft (»localhost«), dann müssen Sie außerdem den Namen des entsprechenden Rechners im Netzwerk angeben, wie »glomserver.openismus.com«, als Beispiel. Ihr Systemverwalter kann die folgenden Anmeldedetails bereitstellen. Falls Sie selbst der Systemverwalter sind, finden Sie auf der Glom-Webseite zur PostgreSQL-Konfiguration Hilfe zur Installation und Konfiguration eines Datenbankservers. Dialog: Verbindungsfehler Dieser Dialog wird angezeigt, wenn Glom keine Verbindung zu dem angegebenen Datenbankserver aufbauen konnte. Entweder läuft der Datenbankserver auf dem Rechner dieses Namens nicht oder der Benutzername und das Passwort wurden vom Datenbankserver nicht anerkannt. Weitere Informationen hierzu finden Sie im Abschnitt Verbindungsdialog Dialog: Datenbankeinstellungen Dialog: Ändern der Spracheinstellungen Fenster: Textobjekt Fenster: Bildobjekt Dialog: Reitermappen Dialog: Ungültige Formatierung Dialog: Überblick über Beziehungen Fenster: Gruppen Dialog: Gruppieren nach sortierten Feldern Dialog: Gruppieren nach sekundären Feldern Fenster: Knopfskript Fenster: Feldberechnung Dialog: Benutzer wählen Dialog: Benutzer wählen Dialog: Benutzer Dialog: Identifizierung der Übersetzung am Original Dialog: Übersetzungskopie Dialog: Datum wählen Dialog: In Tabelle importieren Dieser Dialog ermöglicht dem Benutzer das Importieren einer CSV-Datei (durch Kommata getrennte Werte) in eine Tabelle der aktuellen Datenbank. Es werden die ersten fünf Zeilen der zu importierenden Datei angezeigt, woraufhin der Benutzer das Zielfeld in der Datenbank für jede Spalte der CSV-Datei angeben kann. Für automatisch hochzählende Primärschlüssel kann das Primärschlüsselfeld nicht als Zielfeld verwendet werden, aber anderenfalls muss eine Spalte in das Primärschlüsselfeld importiert werden. Über Glom Glom wird von Freiwilligen der Glom- und GNOME-Gemeinschaft betreut. Weitere Informationen über Glom finden Sie auf dessen Webseite. Um einen Fehler zu melden oder einen Vorschlag zu dieser Anwendung oder zu diesem Handbuch zu machen, benutzen Sie bitte das Fehlererfassungssystem von GNOME. Eine weitere exzellente Informationsquelle sind die Mailinglisten von Glom. Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder (nach Ihrer Option) jeder späteren Version. Eine Kopie der GNU General Public License finden Sie unter diesem Link, oder in der Datei COPYING, die im Quellcode dieses Programms enthalten ist. Konzepte Glom ist recht einfach benutzbar, aber Sie sollten zunächst die folgenden grundlegenden Konzepte verinnerlichen. Datenbank: Jedes Glom-Dokument ermöglicht den Zugriff auf eine Datenbank. Tabelle: Jede Datenbank enthält verschiedene Tabellen, wie z.B. »Kunden« oder »Rechnungen«. Feld: Jede Tabelle besteht aus verschiedenen Feldern, wie z.B. »Kundennummer«, »Vorname« oder »Geburtsdatum«. In anderen Dokumenten oder Anwendungen werden diese Felder manchmal »Spalten« genannt. Datensätze: Jede Tabelle enthält verschiedene Datensätze, wovon jeder wiederum Werte für jedes der Felder enthält. Beispielsweise enthält die »Kunden«-Tabelle einen Datensatz für jeden Kunden. In anderen Dokumenten oder Anwendungen werden diese Datensätze manchmal »Zeilen« genannt. Beziehungen: Jede Tabelle kann über in beiden Tabellen gleiche Felder Beziehungen zu anderen Tabellen haben. Beispielsweise kann eine »Kunden«-Tabelle einen Bezug zu einer »Rechnungen«-Tabelle haben, so dass alle Rechnungen an diesen Kunden angezeigt werden können. Allerdings brauchen nur Entwickler dieses Konzept zu verstehen. In anderen Dokumenten und Anwendungen werden solche Beziehungen auch »Verknüpfungen« genannt. Berechnete Felder und Knopfskripte Berechnete Felder und Knopfskripte verwenden die Programmiersprache Python. Die Berechnung oder das Skript ist die Implementierung einer Funktion, deren Signatur Ihnen zur Verfügung gestellt wird.
Bearbeiten der Definition eines berechneten Feldes Bearbeiten der Definition eines berechneten Feldes.
Feldwerte Beispielsweise ist record["name_first"] der Wert des Feldes name_first im aktuellen Datensatz. Bezugsdatensätze Beispielsweise stellt record.related["location"] die Bezugsdatensätze für den aktuellen Datensatz bereit. Einzelbeziehungen Für Beziehungen, die einen einzelnen Datensatz angeben, können Sie den Wert des Feldes in diesem Datensatz erhalten. Beispielsweise ist record.related[»Ort«][»Name«] der Wert des »name«-Feldes in der Tabelle, die durch die Beziehung angegeben wird (oft als location::name bezeichnet). Datensätze mit mehrfachen Bezügen Für Beziehungen, die mehrere Datensätze umfassen, können Sie die Aggregatfunktionen (sum, count, average) benutzen, um allgemeine Werte zu erhalten. Beispielsweise record.related["invoice_lines"].sum("total_price"). Prüfen auf leere Werte So überprüfen Sie auf leere Werte, abhängig vom Feldtyp: Nicht-Text-Felder Nicht-Textfelder dürfen leer sein, was anzeigt, dass der Benutzer noch keinerlei Wert in dieses Feld eingegeben hat. Beispielsweise nimmt Glom nicht an, dass ein leerer Wert in einem numerischen Feld den Wert 0 hat. Sie können testen, ob ein Feld leer ist, indem Sie »None« aus Python verwenden. Zum Beispiel: if(record["contact_id"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] Sie können auch überprüfen, ob Bezugsdatensätze vorhanden sind. Zum Beispiel: if(record.related["contacts"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] Textfelder In Textfeldern sollten Sie prüfen, ob Zeichenketten der Länge Null vorhanden sind. Glom kann nicht zwischen Zeichenketten der Länge Null und fehlenden Zeichenketten unterscheiden, weil dies keinerlei Vorteile hätte. Zum Beispiel: if(record["name_full"] == ""): return "No Name" else: return record["name_full"] Benutzung der vollen Pygda-API pygda ist eine Python-API zur libgda-API. Das connection-Attribut stellt eine gda.connection bereit, die zum direkten Zugriff auf die aktuelle Datenbank genutzt werden kann. Dies ermöglicht Ihnen die Ausführung einer SQL-Abfrage, beispielsweise zum Lesen von Daten aus der Datenbank mit einer SELECT-Anweisung, oder zum Ändern von Werten in der Datenbank mit einer UPDATE-Anweisung. Bedenken Sie, dass die Verbindung bereits offen ist, so dass die Eingabe der Verbindungsdetails nicht mehr erforderlich ist. Das Attribut table_name des Datensatzes stellt auch den Namen der aktuellen Tabelle zur Verfügung. Dieses Beispiel liest alle Daten aus der aktuellen Tabelle und gibt deren Werte im Terminal aus: # Die aktuelle Verbindung zur Datenbank zum # Lesen aller Daten der aktuellen Tabelle verwenden. # # record.connection ist eine bereits geöffnetes gda.connection Objekt, # das uns ein Öffnen einer Verbindung erspart, # und selbst das Wissen über den Namen der Datenbank. query = "SELECT * FROM %s" % record.table_name command = gda.Command(query) data_model = record.connection.execute_single_command(command) rows = data_model.get_n_rows() columns = data_model.get_n_columns() print " Number of columns: ", columns for i in range(columns): print " column ", i; print " name=", data_model.get_column_title(i) # Herausfinden, ob es der Primärschlüssel ist: field = data_model.describe_column(i) if field.get_primary_key(): print " (primary key)" print "\n"; print " Number of rows: ", rows for row_index in range(rows): print " row ", row_index; for col_index in range(columns): print " value=", data_model.get_value_at(col_index, row_index).get() print "\n";
glom-1.22.4/docs/user-guide/de/figures/0000755000175000017500000000000012235000130021003 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/de/figures/glom_data_list.png0000644000175000017500000025221012235000130024475 0ustar00murraycmurrayc00000000000000‰PNG  IHDRŽ@2ý¹sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ7Çp­ IDATxÚìw˜źÿ?ÕiòæÀ’—œsF1€ˆsÂ,"*˜³Šé˜ãÑ#ŠˆŠ`E‘œa—%m³“:Ôï™]Àƒºœsïï^½ýyž~–egzª««ßùÖªÀÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅåÑp3rU·;\\\\\\\\þºøÓ²u@ÛëP%u4èÂF‘økÑ(FŒ»%D·ó¬ô¢·#n—º¸¸¸¸¸¸¸ü«h:PäÓyþƒsÔ¯ê6-£ÕâÛÅW¯Ýa¦þÀN½¬á§Ôöw"o×±¡íÛ•t?òò«¥mÛÂ........)¡&qÓqÁYiãÑ5¤”û(¾„é€Pš,÷Tªª@êÇ`F®¢õ¼Ð ø‹ºy½>Y]BjkjøàãoÙ]^û» q‡cG  G÷.ضíŽ,—?ñƒ‚¢€tlùï…\\\þšÄeµq–|ó£ÆOÛ¼¶#óõŠ"ØUç“fÁ#ÉK—ø½UµQ¶—VR]ZÌØcÆà3~_8*B°lÖ/þŽ}‡›îEJ(«‰±|ñ·ôìÝžòq~§-õq›yó j^¤“t¤¥gI#«ýQ)û”ÒQRâö„«Å>Â1\]fû7¾n :ï2YQ['ž›ŠvÓµSK.>»ëïªo˲¹kú»ôîÝ„iº#ËÅ寣¢–…i; êx4±o¨å±L®²'SG „ÄL˜ØUCWöŸô_BHlÛÆ¶’6V (UUQ…Å®M›Ø\VK MOz5÷!¤üoi‰‹‹ËŸÍ l)XõÓŒuÙ骣d$i/=Éò…s蘓‘R·6¯øŽãN: I8.ÿà,’6-š%=”%[È uA%Eëi[ØŽ6-ó©IµEüÊzн ªhô0‚¯>y—¬Q'`K¿G}{u—Õ§O‰ùöƒ=ï^oqH†­Íýæ8ÚŽ#{>0àv­ÓI˜& kÿžDÛ‘ ìÔŒ¶¹ –Ývwqqù àÄ£ÔÔU I‰Ÿh0‡ ¿Àq$BQRi,)%ÒI ,!P„@¤þ†”8R­,%bG1ЩÒrižãÁ±„âPµ» “^¶ãÁIÏ%Ë«"„‚ÇvþKÄ›‚Mey%Q3ŽOsЀÀrJ2¦Å°¾ÜÕ?-³gsçÎî h¦5ŠË¤)•8N²=BˆdÈH:HB€t$ ( ‚d¿8®atqùÓ“œ4KPrÓ½$LÑ„DB:d§ûJ2¬íH‰ iAŸN,–`Çîrbñý;ÞTEв „ =àÅA4j-!AŽ´¿‘hŒí»ËéXØ)%ª¢°«¼ŠÚp„ÎíZaZ!¿MK¦!J')JG õ@Ð÷Œ© kí7$mÒÍ)’Æ1?ÍáЮZµÎŶÆiš†¡(©MÃãgLA®tqùËÌ®¡zÇÊ:vá‰ÑÍ©Zò1'¾¼ƒ~ƒ;Ñ.Û tëV¶”‡I ‘‘ÓŒÎm³Ð‰®dõÖÝTEm„¢àOÏ£G‡ Voãø[NæXk%§Þµ’­Y9ôêÓmçFŠ”æýa=õnËk·ŸŠãH,Çaü=ïq˜Cˆ%LdÊ9¨°¥D4ÍqÊozmÛIeRŠFuk¦„£¢)¬Xµ†Áýû ¨­©¢¦º!r²³hß*ŸêŠÝd4k”Ž;À\\þÌöQó#j·ñò»é1º%ÕË`â›õxZ´gfGD¤–¯¾ZÃJ;—‚qÝÉëÔ“ƒÒ¿M4å|½¤˜¢úõ¼\íÙ¶?¾ý%Ù“Oàxk7?³=`Ъw{ƶ¶yêÉ%¬÷õD%¹tEMM‚6YYl[¹šlJ 2ƒ¨¶ÜÏâ·i…©¬ “Ó0Wvá>’é7V<†?`ê0Þ‚tt_Oß6<9ÅŽsé K°ú¦ ¢C­Ô.“÷þ>›¿—§sáiƒ8³WkÎï¹”'#"9ß¾œñm ç1GrÃ!!vÏ_À„ùaξj,§·È$+º™ˆ•†W8º¸ü™Q”d.sr F;õûoWDK)“z¨a›ÒY{‡ª »ñïmZ6cp¿î8¶C4lj”%u˜éL;E(úLB°l¤”´nÙŒ·?_LŸNÍBàÑ5þöòç ÔºúhRĦ֟B¤¼¦M»öý GÇ‘$,»Ñõj¥ò-ÛĶmTK ¨‚»w³~ãÆ¤¸L)nË2A:d¤ƒ™º—?ÿì:àQR . r½ˆ‡¿YwX;Î?ÿNÀgà8gŒîÃS³–лgWñ†áI Ðäš”¢ÁsøïGH†ª•½”²L3eY!±,‹ß‡G‚ªªªÙµcB¼>?ŽlˆÃ»æÑÅåÏŽRéÍaSZZ‰"BT IF,Â{oÎç»: A».-ð!bE[x`ÕF E¡çà>Üpl!£2áÁjj= Y³ž•1ƒöCtð{Þ'³ÁèàÏÍbDw…G¾.çðÃûqnFï~]A¼ }¿´!TH^Õ"μ5‚"$RË¢°{ºc§,‘Dõ¦Q±k;; ;˜ ·Í‹KÊÓ±d*‰g³%p’ÚhÈà 6qîÚTÁèC»b;ŠêZ*ܱWž#ö>ùOR¦’é]\\þ8ŽCUM˜“Gt¤[»ü‘=UuQžœµ”ìì,P‚¹G:eO-‰íì‰Ð–ì,¥¶¶.y~é0¢OÛÆÏrœdhº¡8&¶Þ㹌Å•(§HÀgpáïppßBÎ;º?·_t×?1}{6Š\¡§iyš¿)¥L-%!’9ŽŠæ¡¢¦Ž^­Û x<ü¾Å%Û±ZªŽccÙ [â(>örͺ¸¸üyÕP©)7%¹}Gò~ÛÝ<óÆbž]Üž›gpõ¤±œX#»eFM1“\Ãi—ŰôEÕ&Ù¹YÔ³¢J#äU©Øž€®]xîæB¶n\É­/ÿƒ7¥@H›ôÖ½yùê”ÎûŠË¿Óéžo’Û¶5 wñÞÇ»1ÉDs~[zù2 鑽gÅ2ÇvöY WÕüDˢýÓnÎê›ËØsÆ0öœÔ€íP³JCúzr!𠟯ÞEŸmuñ©š°Ð k÷Z^Üè#£‹lÌ9Ú·aûn+FÊ&ÊT2¼‹‹ËŸÚ4É¢–TIÈoO¾S«Õ4<öJÊA§îY­ ÇNþUS^¼ù”}쇦*<ùÎB<ÆÞÅ1{Š—CÞvòïjJX^|Ï,èdží»ùtÑzuo•*ÄqдäGì}ž¦lu ýÞE6üCxóøjõüøOEUY»¹„ö-²¨ªlßUJ¸>‚e9ü><†–ìéG—?=R¢ÓñîÞÁs_: Ì5PEÓŸÉöÏàö-Þ&DP‡ME;ØPT‰Ú,È÷‹ÖR×:l`gi%›×•ðƒ·%-1–/\Ƈu¹¤ ñ(h݉ni(f »«¢|³ª˜pµJaaJ4Æ®M[YTÆö{ÑÙX ¸ÿæ:8¿3_•(dgeòó7+(ÞœÃÀÂ4²< ¶eQZZÍ/k1:P¿«Œ¯—Å(¯÷“—ŸE|Ë6x¯–3É4$µU,XR…¯c"å‡åÛ B'3 ©)ãÛUõ”à#à•”oÝÂuõØ^jêKÂ5..rᘪ¬¶¥C0àãí/Öá,X»)ÈÏÉIJm¼4ÔUKG&ó"S¡kÓ¶ÉÉÎdÊS ö+ßtM¡])Ïdò³÷^ÇQ%T]¥&æáò?¢w®Dã šåç°`ÙNÞýrýúô ‘H`x IÑé8$£4ÿ®p”2é'Ö‘Ö1%•UZ*ÍY»p&íÚ4§C»¶˜f‚-›·‹[Ô™:ymöq»º¸¸ü™Å£BV^&Û7–²v•D##+f…iDÊêx¿¸[ UÃç‘“£RSæ“í5X)ãè dÐ,¤~t%ÂÇ ·aI‰jÉËõa'XøÉExç“ÍhiäÒÈcûº"žKäå§£9ÿÙB_‚͈†ë™·¨$ÙFEA7¼³òÉÕ¡vg-ooªÀHÏ'ߎ/—x}˜cIPu- ð ‰i[|8#„²i“­­«å•O*åæ’«Kvm(æÙ•yyéhò?m¿‹‹ËÿÛ"³q‰Ïï§S‡v¿;·‡p̲IÁéHTE'ˆ™–eÑ¢E Zü¦PMŠFÛ‘Db ü^cO¸Y:ÔÇLtUbÙ~¿Ÿ^=:c¥¶¶m‡‚f¹4o–G4GˆÆmñD²È&µyAÓó¯8vüÝò¸Ó/¤xWy£ëó·ˆÔUPY²’ªmˉTîÄŸÓšœ¶}ÉjÑ/ÍU.......­y4CÓø<|þé´é~0¡€÷w‹…Db&ë—~Ψ£Æ7m¢ñ!¿X}-?/[FûîДß×]B@YYfÍ6zNM8‚ðóó_ãËnOvvæ&[¶dÊ8h†7H8MUfk|óÁóÕ_þãá“S/ µ©Ÿa þ7—ã‘ÉÇßÁ̦e×ÃhÕ}d²¢ÑqRåæÎn°íâââââââòg$ž°RrÄѧðéì7Q5ýßc™ F}2±¸E4a"€ºú(AˆÎ;°òÇy(ªú‡çñz}4òX*ªjµVm8ÊÀá£øjÞìÚ”øÃsضEŸÃÑ ?µõÑT ¶DQÿX»ý‹pt¨J2æÞ¤•Ð¥ƒ´ýªk—¿" Ó&‹qô‰ãš´ô ‚H4J,aîÑDãä7oEË6íšô¹RJjêÂûTBÛŽC]8Ì¡£Ç6q=FAÂLP][¿O[EÁ‘âÀ„c®VÅ‚…ˉÇ"àŠ?—ßqÊþkz‘ÚïúW'9ࢻ}Ú"AÑ ZëL86 Jn¾î0ÊJw»e........u¨ŠJYY)Ÿ;0á(½q¿áv¤‹‹‹‹‹‹‹Ë_)%BTU%Z§þ¡ÏPû£“¹¸¸¸¸¸¸¸¸¸ü¡ptÅ£‹‹‹‹‹‹‹‹K“…ãÿLu´DJæócXQ"¦ó¿ªJ[(]›MJ•TÃGXDã6ü¯­9’€‚áóâÄ£˜v룯®’ˆ'p>/2%aÿIê«„ŠÇ£aÆãìo))AÕ <ŠC4aýér)A3 tlb¦»ôôÙ!ßñq[þßY-BŠ‚Bj±ÿq¥¨*BÚØÎ¯Ÿu¢ð?¶,Û¯m®P5<ºB<ž@6Øp¯UØDë£Ø{mwáââòÇä–r¿bÒŠÔR‰“ÚZU3ðCøtåw¼”¤E¸6ŒJÇ£²ÿ- …‚7`òú¨fó?]ÕŠHÔnZ­Ži&¨«­%á4Ø?@Z¯þ[xCHŠæ?ÃøçJøû3wPÐ.f8üx÷™\Q}&ßß?Qµ ý(ÿ¬Uei)¶¢¤¶GJm×&Á“–IºWÝÓ%BEÆVqá qô}á'&ôR±ì?¥ÿäâ»pdzOÐ3­˜«‡GËÇ3i Ñ¤÷ÿ›w! ^SNm¢akKî ò¡4µºLjÖ|ÄåÓÞeÒSÏ0 _ù——¨ªÃ_ÉÄõÃøâáÓñІº1À¦¾ºÌį‹ÿ½;¡¶. þ,2ýZòË›ºÊ*âh¤ed`(MÛÒSUâ̹OÅÇðÎõÇa(ÿM÷CDu5 gÏýðHKó¡þÕ~¿s˰ãQê‚´ ÷¿ï _¨Úv®ëØøŒbfn3ÿwì†e›‰}'9BAÕ´ß¶'ÒÁr$ZÖˆKŽšõKXë´aHçìý@ªÙlû~Û›°ÖfêYâ•%¬,ª§[ÏÎxÕÿ†[#v´Žê„FVº‘Ú(ت¯¢Úô‘—ëañýçpyé‰|÷ÀÑ”/œÉøñÀ³Ñ5S°éËǸ`ü½¬©̬­rˆÏÆtƒk.ÿ‡Q”¦1ü[9ŽªGeÕ}qØcëèÝ·9Ò4q¤Jn¿ã™2år†4S°P1 M¤tH$âX¶ÀެgòØ+8úµ…Œë ‘úRÑ0<ªHÇ$7IĆLyœìæ™ÄÎ}éT.~—“N™ŒÙ©!Í¡¶&Aד¦ðð¤cÈ4BQ1<žÔçY$âI,4®¡* ›x,-er¶ª©84tMÃëñ {¼øüjꉤˆ ºáA×plÌxË´;~÷˜­Áò¥ÿä¼GVò÷W¥sºM4š@¨:†¡'7·Mâ G tŸÕ6AÕQ…ÄLÄHXMï Ƕ™xüñìJÏ ºñ6×çнOsìz•£x»Žh#Ìx‚¤3J`ø|x ¯Ïƒc'¯ÁtdJ{04p°q–ŠŠÇëI} Ÿ]I‰«†þP6f"ŽiKÝÀGhhªØëš›~Ÿõ àÝÃ{pù¦ôë$QWM­Ò…ÉO=Í9½|˜ûm¯P’cSÊäÆñ´ìÍU“³iŸžº¡¢{ 4%ÙfÛŠ h|Íðâ7Ë$–pÐôRî=bé/sÏAuuQlTŒÆ÷'Ç—uzC(°ã£Ç8rÂcTŸð*;_9 â þÈŒéz&Ký]xqé"NÈŠ`¢`x<ÉëHC+u¯TÝÀ£«(<†¯TÏ“ô(;*^Ÿ‹b+Ã@ÉõY“ínú Ñ*Ó –µ£_¯tájªíB&>ñw.˜†iJTÝÀÐUÛL0í¤@óèHG¢j*B:$â1,'9E"Bܦ±í˜QÖ}òç}ègî‹×‘kؘ–‚a({„´cDZå¾c֌ǒãOÓ1TG(h $bQEÇcèÀ±L)‘høCÇëó£ê6‰Ô9úø××#…‚ÇãÇAi¼žxã}ÙgLÆã$ì£ÒްaáTz›ò&4áK§]ÇN5™Ü½A(É}GJâU%¬Øî0 oGTi'ûIJ)BEQ$ŽÜrLQ“¶Ë—×–.¡Vdx£TÔÛ(Š‚PRž¹†mÎ=”MÈS¨ 8)¥âM##`‹%@ˆäûiøÜääB(* ²q‰¦7EWØ0ãJ†ÿs [¿™ˆßÕïeõ‡rèÂëÙõó´;öRHŠJuR Á¢·ßbÐmß³dbê«ÃXBÅã1’k;ñDÛÝ1×åÿâôø7r“^EWñ¹‘Ùœ†®§rç:^Ÿ:Žs&¾™sÁ•Ÿòð‹oðÃæ‚Íúpñ¤ ïâëi“ø¼¸„u—Í‹¡!Ló&Z—-çéGã« •äô<žk®OŒ;þšEöPFwô7y}"‘”ÎèOfÆëÐ5Keׯsæuo²jÜaÜ2@¢b5Ï>:Ï×UÕýX®™r1ÝÓmJ¾Îï~Ìš]qòºfÊ”³iP(_¹€×¿ÝDnÝFæüTDÛ¾C ú#|õÌ LY¸‰Üþ'0åŠ3håwP¨aÎ#÷ðÚWPšåÒ›®gd ‡ê-+ø>àЮ^æ=3Õ¿8L8ãhÒrÇ0ãÕ«ðü2—Gg¼Âª ‹Ž‡œËÕGsÿ¼î ÖKâÓ—YZۜӧÝÅÙ=¼D›8=ŠÂK_~âó²ö¶C8báE|0ÿ<äêoyùµ{8öñJ<Ù]8÷ª‰Þ5/â¿x ïù„ªôþ\>ízmÒüüúÝLguBN¹úFÎ蕹—×k‡:ù½$ÐÔ0óŸÊK Ö"› dü´ÓÊaåœçy7ÜŒN›?áíÅ¥´}7œ{!­‰ƒW$7ˆ×ƒ‚ög?ŧô$©äŸçöãÞ‡¿âÔ7ŽÇ¯ÇYöÖ}L{!5¾6œ0ñÆõË¥ºø'^›õ-!Q˼¯WÐîÄ«) o"¯{_2¼ N´˜·xˆ9K·#³»röu7ÒJU0Œz>|/~±ÂQç2õ²£Ø|÷Df•Y¯?žoB=¸çåÛé¥nãÕ{àß·ão?Š+§]Å€ôñ&z_¥¡äõîMpþ æVωÙ6랟ɎƒGÓ~})*)Ut¥œ÷¸—×¾."Ðe$×Þ4^~ ºÉÊŸæ¡×¾ÆiÞ—®>š©¢8E<9éIÚLzˆ1ùkyàÊ×rÛ ®^À]?ÇÛãøózqéµ—2´0³i^z‘´šß ïäÇøô阑æŒÈ5÷Îçœ9§Ð¬~ïQ~ý+*ôf}ñuœ7¬5±ŠU<÷ò‡ø2½|ýù·$ò‡sõ´I +¨bæµWR~þc\ÝEEŠÝ<5ñAã'~ëuŠV8ûÄ/Èj~Ç´7ÞZÐT#@f§~L˜pý[š|÷ü]<õá2â™Ý8çúiœÐÑ hѼ±¢†æ¥K™ýK%ÇÜøÇ©sùÛão±¡NÐsÌx®7Š\»WÎæê—ÞdÓ‰ó§ÝʉTl]°nö ž¹€2%—ÑLæ‚CÚcÕlàÅgÞFÏÏbá‚/ˆd æÊ›&3$_ ?¼xOÌ^J,½ ã¦LãÄNþ&¤ýáÍ¡k¿á4OIo PÐH°}Õ *ƒè•[)(äv¦UºBù¶""u:+—c‹,šåF>yYA•ëØX¦Ñ¦]!A-ÂÖ[ðwèJ ZGE¼ŒŒ\_Ò›.¥¸hJï÷ IDATu1#-‚Æ+…À®ÛÁš-ÕäuìH(i£Ò S²euqôP3Ú´oCH·¨Ü¸†Š@ZùV|9-ÉËÏoÒ˜”á žæM~¾”Hé øÒPBàP³e%?ÔÖ+¿a‹ê•|9å$X° }åŒZ}5oÝ{$ZÍF^zäaæ­ÞMZ磸ú† ô ÅIØ®Òåÿ’†£4ådû{‹ ]7ðøÓ(èt0×OŸ†áÓ¼·É!\RJ¨ÏX®¿q2GæodòÔ§)®tè{ÉÒ¾ÞöÏϸŒæÑm<~Í%üè;”ÉS'Ó§ö5&\ñ»4âÏgñéú(š&à_Ú±ÿ@H@ñ–žAFFVÝnbÁ²|v¼Œg®¹ˆo´ƒ¹vêu Œ¼Áe—>ÌE§lÝnZŽ<Ÿ›§N SÉLN¿e–&ˆUná·ÜÆçÁ#y䱇8µ§ï¿È[å¹öúKÉX:ÉÍ¢^Wørênû.‹‹¦ÞÊém~æÂ1—³ÄñQ»j!sÞÐC ?ózö9ŒÛ|’Çî=ïÚϸfòßpžÅ “.DYø ·<ý QÅbõ'ÿäÙ§æqðõOrïñn>}Kl?ºÒ´þBàñúðù|x5ŸßC¢2L°ë‘\{ãNêZÃ7>ÀêÒ8±â">ü|ÇNœÂ±ió™pöµ,—!6Î8‡“߯˜+§qÕè ÷Ÿ})³ËùÍЧîUøî¦1LþÌÏy7ÞÊÙÖqÉ‘—òƒå%Rü Ï_}«{_Æ÷_NÝœ‡xå‡-M¾¦½‡¸æM#3+‹L£– Eqr:¶%èQØðôEœøÈfF]>•«Éfú…—1k· õ;˜}Ï}|ëýOç̶•ÌŸ¿òêyãŠc™±,‹ó®»‘ñ#[QSZðz(™yoDrù¥G³õ;ùûgkézÉÍÓ*ƒc¯›ÁKÏ\K—@ŒL>™×vwgâ´iŒöÍåÂSobô¡ÀÆ1±›Åõ#6óä«›ñ)E<7»†s/†ß´‘t¿ÍükÆpå{6gßp-}Kg2愇Ùíõ°kÁ \tÓlzž} S™ûÒ” EÖðÓ'³1¬  á”óíÜ”†·rϤÛXÞúDn¹õÆÖ ÝIåƒàýP–Ý}<çάçÔëná’!uL>þbæ×˜eyãÆ›ø®à{ì^ÄE×>KúÈ ¹ñÊ3¨œ}÷½µ;áó·fÓýœ)œÓq%Ww b!výc*'Þõ#ƒÎ¿ŽëNïÁ»S¯âµuÕ³’ùOÎà½-™Üðð Îiñ5·Üø ¾+î?‘³^ªá¤koæ²áqn8áb>­Ó0šü<ïqK몊c™X¦‰KĉV—²mÃ6Ò: fXŸv®ÞHD÷]Ð’´œ–ô>’‡ô'ÛcQ—°ÐtAí¶­ì,¯ÁÁ‹ÛÉö²ÙÍr \NYÔ äS±Âå¬ùe fF;úDûÙø¼žÆö8Ñ2V-߀§u7:¶È@{Í7œ%k~¦ZkN¯Aƒií+cíÊ­˜ªB¬¶”mk‹vDAËVË‚4éA"ƒ@ @0 âוF¯}åêï™»t;’=¯·ã‚×>ĸ¾qá<{Ã!èV5/OÇÇñ\3õvÞåâóîa«ô¢ˆ¦ÛY÷p?óq ü9Ž"™?æ4x˜ÇAJ£y:{kÙ´±ŠæGœÄÙ•Õ„c6Î<ƒ¾Èò²0£Ò2ðé¡Ìrs½T®x•¹;ºq÷CÇÒV‰ÓbÂMü0áo|¿ùB„PH¤#“aŒ&æ?IE'°õ †vøŠË(àâûž¡]–Ÿðºçù`k'î|àx µ8­.¿•ïÇßÁ—«®à´³'мºšˆ¥1þš“˜yîlVÇŽ&Û±PzÊ”S‡‘—¡b† Öz,_y*½r Ú^w%gßö-;×[Ü2ÓaâwWÑ/P¸änÎyûžýª†KµÔµH'ÂðøÈÌÎ%'MòãgRÓñX¦@HØœ>îT¦¾õ »jz"TAÿÓ§0ªS.Jû«9xÚñÌÝ`Ò¯“<€Ù°Àqœ”ñtL‡Ü!£9«G-á¨I‡±gòÕ÷ó˶rºv‘X¡\N;ï*Æ nŽì÷¿ŒËgŸ|ÄÏÏmᜧeL[°û\Ê•oæ¡9;9lØkÖŸr1 £UÎeê 1&~s-ƒÒ#Ðõ.|}O,¨f #¯aÊ‘ð‰VŒîß’™«wpÅð6M÷8¦¶EZ÷Äp|HËBí~ó®íŽR¹”{žÝÀYÓßá¨*Nß ¹ò÷xäÃqˆDtÅÄÓFÑ"ßCuµ‘œl»äežü6—[ÞËQ¹Q¬AÑ”‹WÕ#ú\ÉãמL¦£þç¯y~U1“é€OSðgä—Ä,y'¾ÌfêgçÐÙˆÒeâ½,šw6³—ÝÂä>¢I9ŸŠHzõ1#n>éW>ɇöáGßPžïèg¶-‘BE+ŸÇí¯×1aáœÚE ô¿Ÿ¹­ÏãñÅÓ÷˯h}ÁuL·˜“O‘h…ƒ8÷¤£h•ë#팋xqÒ§l©:6iÔRÞ$)%BQŠ‚×@÷zÉÎÉ!Û B„2 b«ŸàŒéÛ¹âƒY V¾`ÄÓe\úÑ4Fä%=®çŠW‡òÐÜ2þ4QúŸÏÔ“ëIðÉ’Ïñ|gÚCHÎ>ù0¦}÷5§ 5á§Lã¬Ã;£Œz‰Í÷dækóiùÙ/yÓÜÐ;ÃåƒçðàÇ[wžDkÕ“³N>ž¶¹rÇ]F袷ÙZô w>µ‹‹ßC›™Èž×2qæA<ôQÇË$wšô,K)QâeüøÅl´Ô¤ÍHoF¾]‘¶¯í :æëT–‡Èd5»4 5#t4+Lem‚˜©SI ØaÊë¼ä· ’ˆÖ©-ÃJëB¦–`›-A(8ÔTìÀÊïÁˆž…Äj«!ŽGµŽÀŽU°jé*¼†3 ]ˆÚŠÊd!QªÅVt'¥±Lún‡­Æ“ÛPÙÂf{„cc´D×–*J«RÊ&lÝ&h¼K¦P6uÏw–e¡ l8‡hÜ·Á.IGâIÏ&h¨ÄÓ²ÉÍ Ý8“×—·áÖÙ§Ð^‹QxÅ]üpÖ5,Xs-çwØŽëutqs(TÝ%*„@ °Â„-?¨°aÎ ®}b1ÕK@‹°tE”c-gßDvE%¶íGÖnXÅýW_‚î$óBý§¹n±qïø³hjÕ›'A}Ëøðå{è’¥°kñÛ\zó|Ôÿ-Flû‘u›~áo“.Á°“Ÿìmýõüðì­Üüî:¼ v²cg&u¶ ÇÌVY)+íØÓ©9!Š#%ÁŒ\ÒˆQ±q[ÌjÞ¼á">t,©àï}<#ýq~3-Q:Ô•®bå狸~û7(R"•ü~§àS:™­Ò¶ƒ- Ò}&uq™ê’˜%ˆ½ˆCÑ—/1uú,j¤—€‘`å²*ºÙÉŠ[oZˆ¼VYàXØdÒ±ÐOñªŸ)‘aŠïÈ U&ó/ý=–ᤒÊÕEÅÞñ [­:Þ6žO G |=Žå @ÓdµÉ@8©(øt’¿M¾Ï¢ñvžÿ>ßÜÛ“XÕN>ºý$Î8¿5ß>ÝŽÝN-›¸ŠUÉö–%I8‚´fø|ú¯ÂúñmK ‡:Ó-_`™ KJ[×¥ºmc :¦µo…²P5Å?²¡¢ˆ§&çEÇŽe”'Äs`÷ÌŽct½„ÓŽäºûë(y*ùž¢TÔMÅ.[ǵà 5â‰(z°3ƒšÅX½¾œ6uzôÉÆA"Uƒ¼f] š’Æí v«ÄJëÉ5—Æõ7ŒçË‚VvÊyF÷üÀŸ8&9§üƒe3ú¯.å³{NáÔÓg°è­ƒ(·ªØ2ýzÆ{’{¡jzƒr4L)ð¥ðŒd¾žÐ1T“„-=žÿ2ˆÅ¾¢UhvÑG\púÓô~`Wñ]»†m2ÂÇ·]Ê÷Ø8Rài}ÃÒL⦠»0]€tLª+ÖóËÇë¸fùûˆ”@m;ô4!Q -º6G±˜JÝ{fðÍŠ(‰JV>1‹ýŽMKcÀ¦Là ùñ‡ŒTxt‡è®õ”aÞ—ñcª=Fóƒ–fbɦÏú%àèYôt(­³ Š¢¡QO-OÈÀ ×aIUqˆÛmOÇ ¡àóû‘;#8‘0Õ¢=óÓ©ª«"±;J°M ´x”Fk-%f¬úd1£r χ!Ö}‹ß:¯-Q}ÖÜ9ŠV4Ý U#^¼ˆuÛÖ0}ÒÅŽ ¨Œ¡Ð0‘ÿw*é]\þ«<Ž¿é‰LlEQQ7¤ôWXjwcRa9ÏÞ5‡nW>ÁG÷$T÷§Ž½¡1ß%¹Tƒ‚zV;Z´O硼Ao_4éIQ–]Á)óæ$q³!G,”–Fz†‡üCŽd@Îs,ØPÎèüB ÚüííÒßÁ*º¦!w¾Ç°¿}Ï Îçš~Íñm|œÂÃf7êTÊN*”"©Ù^ÝhèÑ0õŽF¨Y{² qÁsŸ1¡E=õ–@7tœh9_ÎwöÊLÆR%‚÷ø (y0o>5‘ta¡¨:ª´ˆ›E)m™J$— U´2•Cx3áÆ¾—(‰Ý¼ýêûœy;¯œ1”tsWu1¶ìçD$JmE¡d¢cçÎ(£Û’UèqÏ,ž¢ŽK4ê+Ù¸hñžûÔØ_6Jf+²ðræÓó˜Ü&B¸¡?"¥,Xä4z‘dC.Tª‘²é—„toˆ´ô>g]:’[NÍënB •^w¼Ë3ûöjo—üœJ¼Úã€t,ôœvõ_SR§Ò1 °ÐÐU;ùÚ†äý†¼­†{)S³5é e·#?­ˆ_ûŒ£3Â˜ŽŠ¦+Dkªˆîå…ùý  òKæ1ê¤ü=~ŽKÈÔpÇL^“C8!Ñ ¢µ”lØžêK‰²§o…ŠW•˜¦DÅ©£*j“—ŠB ”¤Ð¥z5·]yââ'™~fbá8¾ôÒb*G?2—{º›„ {<8á2¿“\r¡¡€ËëÉ¡ãØs™u÷©ÒFÑtT;A$¶ Û2©(©Fh-ѵ(%[j ŒlMh³Nßë^ä±-'$ªa ÄêØQô’=])%Žã ¤å“SýÐèåŽKt;\AMÌ> ¥«¤PÑ5ˆÇ¢$ç/¡˜{ìƒó«Š{¹÷ä[¢x|xe)Û·Õ"r“ç S²­„Ú6-ý˜ÑÚ=žfª¦‹G±loju†ä 86¡öÃiU½œ+6СEfªfÏ Í/ä£ÇàƒØŠ8V]£7ϱîGSó€“Ï­Ðýddeá·%ªßK†Oo4v ÖHîuÖ½¿K¤”HÇFÏnOAA”;ßü”ƒ‚õبhª R[}¹§..nŽã¿< {޽BSÑ ¶³eýRÞ¾{ƒÆÀ°;gLž‚W·(ªø “ofÍä‹å¥Iƒ¥‡ð›ålÙ´úh„P—39Øùˆëo~š•[KXûÃGÌxüiÖԩ앚²O(ô÷Ž‹%Í:v”l£hË&>}óEæ.ÕÚʯã8Fêó¸þÆü²¥„u?ÎåñGŸ`e"›LµŽ-*A¹ƒç{‡5±½-`£!BÕpV¼Ém¯|IiåVÞ|j:‰.=)èq7Œ*ã¦Ó.gΊbŠ×|Çs·ÝÀ;4tu¨õùƒØ;6S´»’¸)é>ôX”ù0í™ÙZRÌ⹯ò蛟R•ØW&É_©cÙäãW"S5z%•>`ùg¯0ë딆6Vìä—ŸeÅÎ2¾æ*^ÛÕ‘ƒŽ9™NËâ©N婯6°£h%oßwO¯ŠãQ÷Z’¨Á(Û ¬f'róQuÜzÒxÞ[V̶u?ð­Sxw›º¯‘û†áštìõ¾XõŠ‹JزüCn¿þ-ÔÖÃ(lÕŸkOkÆßO9Ÿ¯cgñ*Þy`*O®ˆàQ÷ß§ÒN žÅm掟`Íî*6/zŸU¡èb/±Úð> Zˆlo=›Wn¤6FžÍy–qý¥·³p} ›~YÀS÷ÞÃÂJ-U­Ü´1¼wup—ÓžaáÂWÛ+—¥*; “FTr÷%÷°dç6Þœvóƒ§2ah.ƒúuçÛ7f±ÅòàT®dÎÛŸVŽÞ†íâü4ïôPœ︛_4žÚ•¼ðÂ+,-ShÞ¦%^+ü;6`÷#Õ+B¯ÝIQÑ6¶®ü˜;¦ÌÄlq]ZwáÒ“Û1óœ³xpÞjvn[ËÓocÆ’ªÆgcŸ± %&ù64Ä¢ç,yé¾­¡ ¦‰lZGqef´šŸ¹‹…­Îã±K†ã±%Šp°rŽà¶ÓTî=þL^]´…í›æÕ;&óò&™)¡øvÈ”¾v+·¼ú%ÅÛ‹øþŸÏòèûß±x‚Ï_½JYöÒ5ܵ¤%ÇŸ}4׉wƟýsW²£dsž¸“Ç•¢+üëI 3ëpn9ÍÃߎ;ƒ—¿ßÌŽ-˘yçu¼¸ÁI-Mvϲ´ˆÖ×®«£>\K}}4Ué-÷é6¤©v] ‘˜™kš—t¯É†-r s1„À©ÞMµ’O« MtŸ°¹ ˜‘KtËZ¶ì®&aƨ©,£.šœH©¾l:v눽k=›+"(ì=tPüÍÉ;Y¾t¥•Tì,bݪU”Ö[{¿25yhZìÝ¿Žã`Û¶c7®Ê ÷3ÃüµŽF‚´ãxÚclö·\?éA–l*aÃâOyâÁ‡YZ­íêv÷ø+Ö>p]š|õô ¶=ÂaCGpèÑãx`¾Å”wfÖe‰9-™r÷Õˆ§O¢eÇA<ô ÑŸ š¿§\t¯_>”Ân—±!Ø;f¾J‡U0rP?wË£¹dxÁ“–E†W9àõßTo-cŸsÑ G0â°#ÿð"NŸñ §uËF 2íÕ7è¶áqFîLj3naY}þÌÁ<óâ%¬œÐƒì®'°4³+]Û·@ÝKZÈÚ¨™ ºžy>}×Mg`¿Q¼\}Þx.éø8í¥ï¸±ËR.<´}G^À;Å™´IÅ"# fvʸƒ-.Ó‡ßF´ÿé¼ðÜ ìzéRö̉S^¢Z¤c¨ þŒ,‚†Hé•`f~õÀÖÄS”ä _d‘›éÃVó¸xÊÕä¼…z1埵tÌAøUB%¯wwF´­äÂCúsÖK6·Ì|‘ƒ&CîœÃ?&„xð”Att4÷QGëtªAZ(˜Ì·*ôL|š$÷p ßsÏ u\6²½=›×6…h“.P¼A2F£‰×ýAÒ}Ú C‰@àÍÌ¡ì£Káxû]NÖ‡!Ç]Í•¹4 Ø¢š/HVFUQ0|Ù´o׿!P4™9™xUI<dÜëó¹*ãŽê9€hÏëócÒᤫ¹t5'÷îÌÐqâ~:‚ Žåcì} _?‰üüÌïqc›Ð<>âkfsñè!ôtŸOâöq‡4}ÍG™Ì(ód6#ñÕ• 0”ƒFžÃ‡ÞsxsÎÝ´‰Åè5ée>œÚžçÏ?˜nýG1mVù!)tBé¡”à’Å ”„˜ÃûÞb\í´LëÄ};»rtÛx„ ÙУ8»Û&NÞ“GÜÁòŠ6͹Ÿ iÙªŽÏg£ŸøšO3õ˜~ôvOý¬Ò6CAè>Òƒ¾äº‡Rй¼öäŬxhýú åÌ;Þ#¡Q…BZ‹æ:²ûNèÇè»·pÕ»rz¾IçËžbέ=xíâCéÞo$SÞZONPC Pz:FjI*¡è¤¥‡q…‘Ó¿à•3Ü|l?º=‹%m3Ä-C%„‚!êYÿóB–,^̲¥KX¶rµñäò@ZãDN hšz(›iu,üú /ÞŒ©ûHyѼÍh—¯wt|Þi­ ÿ{goEñþñ÷lœ¾E ÒR¢ˆ ˆ€¶¢baw & b‚˜¨(ˆ…Š|UTlEº ‘%ïåÖé³1¿?ι…ŸŠóöµrÏÆìÌ3³³Ÿ}¦Èv£$%hºi¤k=Ov]hÛ€¢åß³`î\–mˆàõûÒËë <9´jÛ˜ðÒ_XŸÔÐ5 ÓЄî§ÉНfáœÙ|÷Órâf.yA†áÁÔ;WɧO6ÙÔÌ   ‘®ã˜¡üØp¶ä“J¥¶Q¢BÖ¬YËŒ¹ ÈËò—à:6ÉDŒxÊa¿† évì ø¼&†Ø¶Ð4Ñ()Wbzý^4R”Ept`.@º¤’qbñfV.>«”ÒÄŽO¨eÛ6ãÞž@Íš50DY“„K*£$£ÿþH4üÁ`•ûÅã)0ýd}h¸¤R6¦G#RÆ5|½‚X4#Ó•PÐkà ã5u¤"a¹é9ѼÁ ~Ó@dæŒÆâ_ˆ HR³@hxýA^d’’â(ÂôøÓâK:$b1)_NZ¬˜¨%`n2\œö„ì`“Ϋ¯½†×ô ²É6’ÞlNês ¯‰)À±-¤ÐHÅ£$A0+„pl !â‘0 ;ÝÙÜãðyÐ8vŠX4†­™„|&ñX[ê²B¸±Òô5BÇâ÷dìa%‰Eãà Ð,±Tz„°?€O¦'¬J—Çãá£&¶\²ŒŠêݵSDÂZµ=€öí;`x}ñuRÄ"1la ˜Ä£1lW¢é&€‡Dæ·ÐL¡ ==c<ÆÒýu›p<…”ÓÀ'RDâš'@(èCá¢ôœpþ`o:3±’qâñŠÉòÿŒp8ÌÄIŸR#ËC8’¨2Ýš—ìl/¥[èvÜñÔ«×_(˜žÜÞID3ƒ¦4<þŸtW"ì‘d ¡y f0„K*žDózH†#h¾ >oÚËâZ ¢±ÄÏãhš&_}õ5ù¥QBfEµâÚé8í×´;‰fxø=è€ëXÄ¢Q,i úHF#égH÷ xHD"سBxuH%“'\LÔÕ Óé–nŠ”màóVšÇѱˆD"X®†7Äï53e6I4Cš~‚¦$KâfRèÁ€/-.\›D,FÜ’øsr0¬ÂãÃ.ñH˜¸•ž«ÐôªIN0ä'rÒå)ò‘Œ„«O,cGç×4õë~G÷…ÈÉΪRÇeù Rxñ‡‚8‘"b–D3|deùI•‘~rr³ñˆ”ŽZxskqŠ‹#¸†Ÿ¼¼ N´ˆ’˜ƒÐ üÙÙ‰bJ.šÐñeå xѤC"RJ$) dqÂEÄ,'M–_))_>7NI,BÃã’ bhàÚI"¥a’®F0;”¹~§‚M7ñÅ”éÔ j‡™®=C–‘ÀãË¡÷égà±c”ÆRÃKЧ‹Åq$ø‚YˆT„xÊÍôu4 ™~ì.V"A,‘D‹QüWÐu¯×˦>lXñ豯ž‘9J3ÿF€èÿkpŒà$¢ÛÉíëQ'E¤4V­Rµ“1J’±ŠÀ\‹X¸„ØV7±"%Xìü²‡ÒI..ª6^B\Ç®ö~Ø JKûâ™ÛI"vÅiÒN±S§T±•K2&¹uªQJËÏ‘¤âRñJÍþv’Hirc%J‹«„+)¡lÕ”Že÷pâaŠ€Ú¾´Í£Õæ$.MÿˆÅ¶)V"JI"Zõ"Ç"µÒñÂ%ž¹¾Ü±0ÉØV KÆSÑïÊNĈìd^ !°ÂÅnµßuËòZV_i‰XåaH×&šÉ`‘ÎàmˇOÇ7c{;™Ž/BàZqJ‹ã• ñHi•²±3yঔ†ÝmŸ7Eiq «|0EúžØ¦–¥½švSDJ*õƒHfÊ]ó;™/ …ò8ä“L&wJPV+XöD¢þ n{2^ÿ${¸®û¯-(¥üÃéþíù¼#yóOKã?¹NØÛÐô­—OM‹³ôª-ÿÝzmoªãŠÝZ§h>Ÿo×xÿhdõ?YT(þÝy¸#ìÍ/ÉcÞ¨çn÷áØ¶ª×vp……B±k1þÊB¡P( …âßÍÎè½í GMÓØ¸q=®ã(‹* …B¡Pì…H Ê¢^½}ÿšpt]—úõ*‹* …B¡Pìň²ecÿŠp0 CYS¡P( …b/gG{kÊT …B¡P( % …B¡P(J8* …B¡P(”pT( …B¡P(á¨P( …B¡PÂQ¡P( …B¡„£B¡P( …B¡„£B¡P( …B G…B¡P( …Ž …B¡P(ŠÝŒZSð?„”¡™‚^„pIDcØR „²B¡P( %·ƒK´¸˜˜í‚”O¼,?º)šÄKЧ\ ]ðdåã7wƒÂ8©IÛ Â0ñzL´¿ ð„æ%¹z$¹‹0Í¿f']¬íÄC"±qRn¦Àøüxu¥2 …B¡ø/²{›ª¥4<>oZ I¹C—ÍÀë1IËÇçÛáë·—ì€ ÛŽV­ZÓªuZžûk#.®k„WLæÖZÓªUkZ¶jM«¶'ñÌÔß`wh&ºOgéè;9·ßœwÞy\ÿâǦvÁÍ5“@ù?:°°¹d)ïÞ~6g÷»€óÎ>‡a?$ñéêÁQ( Å^„”H)ðøý˜Bþ}±÷ó×=ŽB“—‡¶µ‘$KKˆZ¢¬ThXáe¼øàÿèpù:Ö;¼dËO_0zz)—^| 9îï¼úÐkìñ@:ï«óÿËÚ´€õgç›ð…ÒÞF„Nxå—ÜÖÿr&,K»ÙÌœö yíU®èÒé8 Äß®5]PøãTfLÿ €¼}Ž"áîîâ!ÀM²|Ú\æ¬ÏXn³…¡ùÁQ•B¡P(ö ÐðchésuÃ×çÃTðû¼š(¸þ4íR`úüaø}xü‚¡ ¾Šhà ñdÎ xõÌWš¬ð ûüñôeš×åÅC¡P(ŠsZyB:Ÿžµ9Í;òÌBÓ¡‘¿h=N5 ËÝQ¡ 0õs?úˆKÆ.lš`ÓW£èÖ(H(+›Pvûµ?‘ûÇ/ÄÑ2šb;bÖ0òyäè–Ü73…ÇÐø'tû˦ fgóþÜYÌš;‹çºk„ÝÎäy3™5ãS®oe°~Ófò·“°\ʤ¢¦SPO~a I§BÀ$#ÅäoÞÌæ‚B¢™þ…™2R©¼Ê5·tˆ•’¿y3ù[JH8UÏK‹¢ÉXwËT®;ªV—íÜŸû¦Ìäö#²q·"c…ÀMmaö¸9ùˆæü|þ¾@m:œt¯|³‚„›‰³xD>Ã/:*}Ž?@Ûî÷°xédnîÓ>smv§Þͬ5¥!)üv5“cÇ­(ߦ7Ó¼†?F½ƒµ …ÏSÊC¯¦çQ¨Ÿ,ßçÏ¡å‘g1lâBJ-‰Æ7ë ¡¡'—2¸[ýŠ0Úôᚎuð‡óðêŠs'Ÿ¾ÂHÇ#Øo<)!B ­N|‚³»¶!+ #Ô€.çÝÅ'‹¶àdrL‰G…B¡PìE©’"Â…¥ÌŸ4…ˆ0@¬øü9¾·MbñT¹¶p¬8EùlÞœOq8A¹3QÚD‹·°isÅÑT¹GÏŠG)Ž&3ïNI*¡$–DV¼”‚üÍlޜϖ’XyXe­«Õ½nÝx1¿çœÅßÌ`Ö7“xâÒ˜xKwº™Žkê'E¤x ›7o&¿ hÂ!°J·_P@~~>›ò‹H:¤C´dKZ÷d4”@’ SK).H§3ÿ]Ýìþ—›ª5]§ñþ­1ƒ^"y^´`=ZµmCÁ{Ï2à¾wY]œ"u9è¼gè%Ÿóîù£øøÙ¾äÙnõŠ7¼˜×]Ĉù%é–½yîg¨ùTO^_¼d»6ó™éï»t/Üz!÷½¿´Â3é3I&ŠùnÒsô›ô—=ó:÷÷=ŸpQC¸ …B±+RR«óy«?eYAOÚg/åƒ ›9ä„.ø´'ÉMlaâãxú“Ux}6IO nögR›_>ÁE7½Nq­†4oÝUq‡FšÍ¼Ñ¸î·£øjÈ9Í_?w+Ï&zñþ­myÕåüï7ƒ!1êŸÂè×naßâå|1mmºC5Ýè¤Oû6h@ý€I‹;Ñý€ÍŽ¿žW/ÿ™ JfóðC#˜¿É‰%¨sD?†=t5á—`âï1Œ'®å×—[3dì`ê,xžÃ>b‹”Ø)A›³à©Û:ñÕÕ§qíÆ9·a˜%ËV±)§;/HÛÏ.uÚìg¬ëØ8ŽƒãJ.V2…¯Í‰<úÚ$æÍÍŒ·oeýçø1?†&$á-)w½Šw>úŒwŸéÏ/£†0kù¯ »ö!Ä•c™9ÿ;¾›ñ:m&eèì8~£¡! <©ïzÓ‹txøæ.XÈìOA}c–hèk?çž»_dµ4Ø‘±±Ÿg1scZZe7èÂïŽáÊCkK¹} ¤@ºI¦½<°’hÌâ”ÛG0vì(Û.³Ïbê3wðä¬ß«1°$¿`ÑšÝ0ôQîê¾²C+Çòðä"j¶8œAoŒáöNuʯÊ>â4†??†—ÇŒæ•g {ËòÓ©_îñ"oN˜Àÿ&LàÝÿM८¦uNúºÅo àÙ¹ <ÕÙ“u¼pÃ<2iYZ·<ѯ>ÃémòhyÉÃŒyi½kV\ÑúúgyóÕ1ŒyñEF_}.óß¼“Áe¢1«ƒ^|‹wÆgôýg@£ïÌWK·(ͨP(Š]©É« ûçlá‡å”Î|‚/çqz;/¶›î¸ù—‰Œü´„ÛÆ~ÈgŸMâÎ¥<ùØ+ÄsÿÕ“sËÛÌœü!÷Ìæ·”ƒ&ÀðÈò{ÊßY¦/HV0„\ó£¦Ö乩ß1{êç¼6ôLògóBžú4?‡­í +Äu]Û"‰}ÄÉtÍþOçhÜ[žžÀ¬Y³˜ùÅXÚ}ÌGSVràÝÏÓ¿IˆÓĬÉÏÒÙÿCïx“cžøœ¹ó2ãƒû‰º‰7—A(Û‡Þ—+FŒcò—ãè^:™1ßaîâaÐÏt< $Öðè%gñò”•8X$’M9'n!L4lÎQG„_Ó0èI§úo²|ú$¾ZŸÏ¯—ÆÄË$h%h1ò°jÚõuöÊùhÍï$z7g„$O¢ý¼ óÔë™9Ë"¨YØ;©¥k6îÀч4As8•;¢ ]ͤWæ–Ÿ]ÿÂW}ï16ˆ“Ä^xý °…Q£æ0èØF­¢¾o;îyæ%.ꘃ;{A{û)}ìûikÐÏ8„.'Ÿ‰óîP†ÍÎx÷ökÍ }N£¾ß-ÿÊJ:ûråˆaøL‹U?-`ÑÊ߉Äm\_65ëz $"Ìœ/–áÕœ­ÓZÀs}áËÙioä—óõû÷sp /©XŠvåÔZ³ø[˜´%}Eν9«Wa+í}uS«ùðùoʽ™}^Çà³êc9`žÜ•ä¤w¹vP:‡g® O«C·ßX¡P(ŠDÏÚ‡#ÔgÌÏÓ±ÆI«ë§Rÿç/›FáòéxZM§–5ѤMÇ“Î"øÍÖþ`Ja[FžÓ¯›¢U¯¾tô¿³Ý±ŸÒM¡7:…îÁ§8ãðô»è"®ºôdöÁÂj|"ã?ï/äÝöU»FJ¿]ÍGÈÆ¼Z˜‰CoâÑñ ˆ:‰D·ô*ÂJxII‰ˆMxI.ûV­dâqMx L÷$õ—Qß4<þZ,bäв®É»É¿4ßßæqÜë~ÃmLo~?þ¶‰èoS8»S\÷œ¥Ò"kÊË+K‰•R´¥d"η5!wªu³ iãõvæ‹ü‘’BŠ ‹HÄc¼|Z6 ÇCnnCìXÇ Ëº¬šñ×Þ9šõq™°RÖÔ­ãÄ–2osÅeǜ׉,×Áq\³}ú6/?æ|÷-ì­G@ ökБ£;ÖEtOõ÷•Fq…@ºn•xK@J77-½4bÌ~árš×¨Gû®}è×ÿ ®¼æ®¾ýQf,I•_/( úo ßù<#µ–§óù„ûiŸg¦=ÇåýC·jæ—.nù€ û••Zì?:·)Âðâñz¢fZ4føiá:RJ4* …bââ£Ó1‡°áÁÜ·¤z×ÁÚzHtu —R‚0ñjé9‹¥fâɼ*ÅVjËu]¤kãxbÔÏ+7à¶|t;4éËô„á!;'„©‰?ÕÐ4wó/üTì£eKŸz€—7Ƨ?­¦xóJž¸²%vÒ®åØdåô`Ê–áâŒî‰òxÏ©”‹fêå,÷o˜Vèï™Ç1QÌÚ"“N>ŠFÙ«ÎáÇEÒƒcÄ~[ÎÌY?w%›}Îìu~šu9•Sš­áÁÿÇò‚0ÑÒ–,˜ÉÏE.Õ¶²:)ô¦}8&w?û5늣„ 7ðËüÙ¬ŠéˆðfÎú™R©íÚöÐ…žf~YÌ{— y›u¶‰G¯4:ÙI‘(¿Ê$Û¯W©áËòUjÅIÉm‡Îû½5ÉñT|y¦QU!þé× è^__¸„Sï{Ÿ|_-Úw9žSN;3úô Y=O±÷gÁºËùfÞ0tDåE²º"_é«É­lÈ­¿íG£ýªn ëÕ¦~ÀT5œB¡P(v)RJ‚mŽæ´Î‡rì­èèIbË YY£ER˦3wi!®UÌ‚O'­ÙІíºÑµÆ¯¼5y=þœ ó>caÔB:5󲉬XKL÷aZE,þ~a<È’eü´Æâðsò椗9<>•I«\Ìd>ßÎýž-)w»]²¤ë`YÉD”üµßñÜ]²²åE\} à÷M%´ïr$-ë†(ým!Ó¾ZŒ­i yðëá’(àâi~*GxgñôKÓØX¥tËz-˜ËoÑŒÖÙ #Pw]Sµ'VB"œÂ 4¡ÿù¸iÀ,lX—Þù–Žíºà:hf‚_¿ÉYï®§ ?Jç+Gpd‹Öt~áI6ß2„“{>ŒßãÁð7âÊ矧³“$‰ãJÒ£¨Ãa’¶EÊÛ!£îç¶û®¦×ø ¦f’S¿·?×™z¿¼Æ™gÌçýµŸr¤ñçÍÕ¢îQ<òè}t¼çB†~¼p˜ýÒ-\_ÄËc°¿!éºhþ4°V¦æüùx¯G4ìàñÛ,žº¼"Ðú-¨cH\w[[UÎ[Y.U?4-½, ”é‘[^Öñú[¿”ëÿö§^͘Go¤U-?zÑO\{fWVlø³LkÊe—íØѳ‘[~ä‘kûQʇ<~vb«\èW‰‡®• K‹ð6 •+3¾ùƒo…§;{(Iºå‰ÑM/~RÞšjK…B¡PìÑ!X‘¥1›”¨Ç¥¾ÈeBb%‹IÆ#„RJê´>•k{ÎbØÅ'ó”Ï"i¶àÆaS+X›ûž½Š+ŸÅq¯4¤nmK§y·>ô˜p7çœ2‡úuk]+±[‚³ñKÝø¥BGÚQô3ïåòý±•S¸þ‘Ü9å3N©ë«Ú\-ÒËÔ¢—éwê\¼ÂÁvÙ-z0fìí´0LŒNâÝsêô1äù V‘Í>V Çͥ˙‡ñò'ÒiäQ ó!†>{;·=p'½ÂÐ j6éÌ=#ÛaÇ”&ì´m$#¥å«ßý#…£IÐîÑïXâqK%íúÞÃû=ä$˜/>êâËʇðâÜE ë$ ¤æ%;7o*-Ofø;ÇŽ%q¥ÀðøÉʽæ¥|p˜KV4Ù†Ÿ~†2pm‡zG^ÎKïŸM4a!…†Ç ä‹À!·ðã69úŽõqtí2¯×üCëÍý­l~˜ø ý—×ÇÜJC-‰lÉ ½Lžà‡!ýyéè¹¢c¿¼u3×~Tá;ôÂ#ÉÝo_õ_P:P…×0éF"ŽN(èÁu]tétµò/ª¨ðô´˜9áIÞ›“Ü»„8áŽ×9ÌíÍ/ÿ ‘UŒºª;šwö®I"î …‰?XqÅÊËàì£ÉJX¤ ’¾–ô:#›OÞ)`æðçY3ýzÖƒ”š°Y9ãm†<:‰®w=@³ºYH„j®V( Å_ñ3’ŠHN|w1]\âÑJ çŠg z“…S€ðÕäÔÛGÒýÊ– ¦?DN–'‘bŸ®71îý‹‰¥Àð#îy#Ç&fÈ]£ÆQM¥—ü5u¤î%à=š1oŸIÊv‘ÂÀŸ•C–n!›ôaÒ¬ãäTÓÇÑ…ºÇ]ôE`¹i%©é&þ`ˆ ÏÀv¡A§óxùíÞÄ-‰nx0 ÐL?š#épõ+L=7Š%Mr³L¼Ý®alÇ~DvF÷ÉÒ%ûø˜izˆ”åAÎý9gx³ˆ;»Öò»Ôd„jP+­zÀð’SÓ[ÍYY¹ydeeoóá æà nµÛã'·¼i× +7·Ò%ì<[e©Uk§ÕFVC®r<›"çñÂ7¿!IñãGqÕ53ø\êúr8ñê!ŒŸzß…Á*ËU‡íÃU[§¤e?:µ5®ýÿñ@8–F³cÚ˜ôt8îwcèÔh u;žÏû_½ÀYÇÔf̯i·â²·îåÀ)c©/Ö³l}ÝÔÈ”Ð?’ËOç z…E¿ŸÅS_ü†Ïç…kzÑ0ë#.=¢&8~š¹/,N/³æ™cñ<àã‚W¾àÉÞ­éqí0ŽüòJfAê÷ ôn2ÚMZRC‹°zź̬BûÑáV7ó%¤P( Å_ÖŽxsj±Ò¾`vÅŒ%tŸ¼Zþj—¡ÜZ”43A§õHíà¶—äÔðUŒ¼jö—+ŸíÝ¿<Ê&¡Üšñ¨|Ì R£JDtÙ5¶Ñ=zV.žJiöeçâûÌ®ý—Kœ•ˆ—ÿJ$SéN¤Dyäù¸ì˜ý2G-f¹‘~w¾Â²°¤é‘çóÌ ÷Ñ눖ÔV•…þ 8¤çE¼1z‡Ô d¼+•Èx>%ñ¤Uá…”;+¿>–t2]SÔ8q wtoCöV]¥ÅDc&]ï{’›mOÍLɈmXÉêD}ú^rÇ,‡‰T¥Ï צân  "·%ƒ†?É9‡¤½]¸”ý/äµ9뚇Ãλ—ã›æm%øD3wëxÏŽÎ]Û±on:2ù«–°dÅ:’šZõ›qàQ]iR+¨*:…B¡P(þÅüG»œI’©,Îú,mŠàºõÚPÛ¯×NBÝ£xøù±tšº [‰®Ë18 ÏÍŒ>´?ý²Œuù%X.ÓO­zis@[êe ¬Ì:Ý6ÙœtŽìw|®äÔiEŽJ‹GÍÇÑWŽâùã’èÂÁÓ¨5VÂé’ÒöçöWߤëœYWÃÍxëü¹ûÑD3;pßëãè5k!k "Øš—ÚZsxû,Ÿw§ŸB‚¼&m!eƒµ»óÜÈ爛Ž“G;¯‹e»hz0ì¹WéþÃ`'-jÒ“—×=ðtžy§ ^E83Rͱ5šžÖ¶#hÒí2^8èxý²”ß6·$v.uê6 i³ÆÔ 8®Ts9* …Bñ/e›Wø·ß*~l8[ òË—ÏÙût£L÷³Ó*7›fÖ–†òu#Ef9½ª—–-ߓ­*Ö¨¦|‘½jîåVÜ£ê¢å2=mQæÒê⎇[>P¦êñ̈èÊaÊŠ!ù[Ÿ_Nú˜VUÔ•M»“YâqÛ¤¦ÃMGU”/±(ªµ7å¶P( …Bñ„šÆæ>lXñ豯ž‘ÙJ3ÿF€èÓãX¾̶K ªŠŸêÖx¬*¼ävn!ªjó­ïµ•°“Õ]+þèB®ÚãÛ s›ó+ Âjæ¼,gõóa–…»½´üÉwŠB¡P(Šš2B¡P( …B G…B¡P( …Ž …B¡P( % …B¡P(J8* …B¡P(”pT( …B¡P(á¨P( …B¡P(á¨P( …B¡PÂQ¡P( …B¡„£B¡P( …B G…B¡P( Å?‘]²Vµ”’DÊ&e9{N Ïk`:RÊ*k3+ …B¡P(þÂQJÉÊu…¼7}9›Š“ ¹ûâ14š× rv÷Vdü{" …B¡P(J8þIËaâ̕ԩ׃Û×ÚCž>mÛü´d%ï|µˆÎíB2eÿk2Áu]ÇQžR…B¡P({·p´m‡µ›£4jQ“¨³GÓ¨I3¾úüc¾ùâS¶‡ÿ"LÓûÔ«G«ÖàñxT‰T( …B±÷ G+^BÁšŸp\w&F׆®Ñù讘þ,ÿük×uY±l)K]Lë¶ ëº*• …B¡P(öNá([Ôã®Ëzþ#t΀‘®¤° ÿ_“ µj×fó¦M$âq‚¡*• …B¡P(öNá(dÚÓhÛ{¶_¡axtpÜtÁ B¤tq¥«J¤B¡P(нW8èå³AîˆXÓ0  Kf„ç.D×Àuå¿J8J)‘j¸B¡P(н]8 †pq·Ò~Aª¤€R‘C­l3-ä„FjË·\ÝûŽ{y*çµ6q«QLn*N8)É ÐvFYSÏxïvsK!p3#£E™ Üqù¨J£B¡P(Š4»då]¤Ì¥´X2=_UŸ}ûÏÂô€DJ=´W Bç}5\é" ¯7³!Y7å%N¸ø ¤×)ºQõ<*ß/sWébVò8–mÏߟÞ|>/¦®UÄy»^¦öÇç!$[~™Ãç?l$ñ‚5̘û3á”û'áoj*…B¡P({»p ËÄš›Þ\\ŒP6¹A‰[¾ßI–òÓœ¹¬8 ¬ûú).ìÓƒîÇöä‚;ÞbCl ¿ð4KæNàœ“Ž¡w¿§)ôù(\ø>7Û›ã{öâæ'?&ßʈQ·bCJ -íõ«,ÈÂ+æ2ìÚséÛ÷Îê{.—ÜpoN[ ºö‡¢Q7¢|<èZÆüÂÐØî¹B¸l˜û ãf¬F")Z2aÏŽgcÔÝ Ñ¨P( …BñÏf— ŽÑ+‰ª4žÇ²¿Ëš¤íÄf}ò þÓï¤Kþ;ô=û º<û*×6ŠðíÜz.Çœ{1m(aØc7R?;„Xø.ý¯N»KîàÞ6o<6ˆ»ƒWuÃ'*D—ëJL½BÄ–Å%Y°Š/¾MÐoàU4ô%XóÃ7<}ÍI¼wí¼yE{\G"t¯ÇDà:ɤî×X=åc–vNVÈGqI ©{ñš:B€t,I Ë‚–çßËhH7×k:>O…WT7}xÍ´Fw‰„•nã/‹· …B¡P(þ죡e¢tÓÞÅ´T$ÝoÏ-ßÒRR"4 !4œâ•ä‹ýèrt{öo{$—Üp.tO(„פfí:Ô®áaþ7àÞ—KNì@£¹ø‚SX~º???4÷7J¼n„oßJ›Ó`¿&sу|_â2ïæSyhYŠ÷.mINøpu!ß?ÙŸmšR·^c:œr/ó¶Øx ‡ï†_ÎÑ÷}M¹T‚t]œøFÞ¸hà§ IDATíDZ4jÀ¾õ›ÑãòW(2L¨GÇQÂQ¡P( Å?ž¿>ªZdF2˲~†éÝ[{Ëû#fNq8²å¥S¯ä=”Haýu,#§×åµo?æ`c=‹~Ü„ž²2ö*‹ž …B¡P(þÂQ@¦ÿ_ùt޹˜þŸ@Oÿ§¹H´Ì¼é:Xnmú=õÇ._ÌÊ_?ãʾW ]ÄUZz”²†@¿Zœ|&Ÿ<{ þò;8Ä#1œÊ÷t%†.±m«bNIvÆ£çØ6¶-Â%i©å×Yµ±Å›§°dùz^ºÿÆ Iä¯äG=6n, êH%[Øœ ášÔnàðìÐkø9߯ŒG±V|ÃÚdo\×EºNúÞŽƒ+%¶•‚ìæÔK¼ÏsŽ g÷œØý <±V%­¨iÚn®P( …B±Û…#”Íã˜$’–’™&j¡‘*^ͯËj“ŒÚH©á¸h„îÅ]6†ASêpîiTËK,–ÄãBA«ç±*¿ˆÚû†8ô˜>DκÛhÈ€^ÍÙôÝ×ÌL4¤ß VIAzTµíTžŽGf–B”8®ƒãê€@FÖ³ºÔ¥Nýñ_ã|âùÜyñ1x3~@ͤ¶?EzÌ‹#Fr>7ö½ qÙ ¡µOqâõ%¤l7ãùLOIäºií:I̺'ðÄkõùúÓy{ÐY<ðÄEL Ü$å1,d£Ê£B¡P(Š0¹cÅàë \\W ]‘WmöMÒþ:Õ…N‡¶ç¦YujçáÑ@ d±üÍѤ!M{äè‘Ð\:èX.9¼€soFó#îÃîz^½•¥OœC«–íè}ÛDõ\tQv¿Ì&†H7ÝßR–õ³@Ú#è:6ŽåÇ÷ßf¾s0t ‘S· kVý†e†¨Q3—¼œ ~ŸŽS'eБç²0¼?ý/ìNóúy$W­¢Ô!dæ>²¼g™h•ŽE`ß8ç†x÷Ó‘4ùe®r3SüTŽ£j®V( …BñÏf—xËÇdÚ¦I2’¢Ûk‹)ÝÚ–Œâôÿ ;ZJJžÆ¸9ç•{Úd*J$aãzöåòg¾áš‘°ˆ–†¡ÛÕ|¹ä¦rAf'¢Ä-g«À%¦&ªŒR–¤©Ø›¾cܘ©åµ)\¿‚ï–qöÐGé„D§Ó8ú“¡Ü?¤”ÃZîC|óDÛã¸êŒÎ´=¼!ãßx‚§Öw¤W¯C9¾Å»¼øÄX~kœdÖ¤5`…p\‰c¥H$m¤”¸¶M2™ÂÅ$üó(î«„ûn¥mOâ¨}$–S)Žjå…B¡P(ÿ á(ÀÐD…¿L–ïÆ —`UwM²4óGŠHijÛãÒ%)%Qù&©áTâ£"%™éx Òl<øÊíwÁú¨D"hÒª#g^ÛŽ¶ûåaÙ.F­6\ÿà#,Xð=ÂfƒýiyPkLKrЕ1`úB6ÄM³7 ˆ©óW7rþ ÇèºLR#‘$ë„þÜm×Çu$YMçºËÚRÓcãm|§u_̦Ò8ìÓ—G¯ìLO«R—F×UªQ¡P( Å@8 Ò€ )÷xk« lp·ÊHe3§.‡wòV"Sâ:i¥tŒœút:¶A•ãHjÄÑ'5®ØhÇñ'·+ª-öiÙø›µ§Kf*O^}«‘îI¨m\%\ˑՈ^% …B¡PìåÂÀÐA¦§»®2±õîÆ•”/9øo¥¬išêâ¨P( …â¿!õJClöôÈ`Cç_·Œ_Ù— …B¡P({µp€&þ9É蚨4Rùß"ÕŽ …B¡P(þ±L<þ“B Ä¿gVIJ¸êºŽ®ëªT* …B¡øK¸®û·´¾îᘞXÛùGÊãñ°xÑ/ü«fÓ– i‚Ó§¢æåQ( …BñWÐ ƒ† ÷£ió»Ü!µK„£izð˜lËÚ£†²,‹³Ï»@•…B¡P(ÿYÂ¥%ü°ð;Ö®^EÓæ-v©çÑØUýw!(-)V%F¡P( Åš–­Û0åë¯h¾Kg×µ {›¡þM} …B¡P(þt]òRìê¾{š2­B¡P( …B G…B¡P( Å.ãomª–RâñzÕª( …B¡P(Ú"•Jí¶®z«p4 ƒ‰ÿ{×uUßC…B¡P(Š]L(⸞'aí¦™mþVáX&Ï»°¿ÊY…B¡P(Š]Ì[¯¿º[ï÷·ª.k¥N&*w …B¡P(v•ˆ3 vwƒî?zpŒnËr9{ ºþﵦ©qYÕ~ªûÇÞSñ«zîïEñŸ®sþëéß{5€¾G†ì¶yw¶Ÿ£®ë,\0ŸC=œd2¡^’ÕØç‡…ßÒ¾CGR©ä¿nmîµkVS«v¼^¯ÊÌÿë×ýN(+›`0¨Œñ/ÿøvÁ<:vÉ„ªçþ.JKJˆÇãìS·Rºÿ¹ôG#JJЩߠ!®ëª±—Ô¿.^D«Öì½Â)wî«ZÓ°m«Úk…‘µ-eÙo‘ù½³ú[ 4ÒýÃe¢…€xq! o.y~½úø¸;·~މ+eyªšìÒóöÙþ—¥KtKV &9> „@Èôýÿ0ëì$á˜E0+„¾ ÞkBÓp)AnU‰ MÛ6NB ý¿ówïô¸Ž“¶E56Zº\•—Dz²õ'e|×ÇSË<§÷­\æw.,H†‹‰ê!j̽§mYD5õœ†×Ý•ià&))MÈÉÁ#äbÒ ×up¥›¶ñÖÂ)S¿ló®;YVÈ%ÅQü¹yxõ«cÿöׯë¦c5éO×UÎþ“wÙŽ½3ÝáØö¹õß.E%´s:SVû7›W1ýû;º9^ßÌäϧái׃#›æîø½„ÀµŠønêjÖÆÙZõ× Ÿ?ÆÈÚðÂE‹YvKbq·<>±M+™·<Â!‡¶#dì˜U4S°iÆ̇sf׺”,žÏ”ï~¥(î …N°F}ÚÚ‰öõ‘²¶ýBt·c)%ï¾4š°×ƒnúðj6‰¤cé´êÕ•Ï:”·-åçf±ôóIü²Ï1œÔ*ˆílßf›¿ýçÞó5¿ùíkýõæWJé²Q9îºéaé'ãX±Ï œØ!ÇN§[&Š˜3}µ>’¦5ý^âÒïÕuF™ÝÜŒx¬¨Ðmü‹ƒ­éÞ©Ù¦ÄñíÌ…Ô=øHÖðìÛ4CPøÃ¾^´‰¦ÇÍa5%Ž®‘?ë}fºGrÚQµq,w‡ŸSӓ⽫{p{óY;´#ɔܫò¶ºFñ¢i|½©§voŒpvQz…A|ÜØã˜=ƒcó’{ÿǘiCÚÊ[½O 4k#s¾žÎ’ ¥HOˆºÛÒ¹s¬Ås˜—hÀqíë#vøb K¾ä¤îaÀÏ?sØâ‰üX«ëŸÖ±»pÎÈÀtu!+½‡`íWï0m}"SߺHïþœ~n²]›m¾Y„@È ?›‚çi[KÛÅ6Šyî©GWÛ­‰„ÞÜ?¸¶tñ× 0’5¥.ºá­{.ä¶QSÛ …A ÊlA \ F D àÃW~Ì R iÅŒ½÷æ•fáјP¥0¼ %®oV.Ù¾t€Âô†ðh‚ðªÙ<øÔbž`!%ÂôU Ã&ª¦O÷è,zò Îüg<†É†ŸåÂÛß`éÚ5¬XüŸ¾<„SzŸÎãs¢øL±­*•˜Êöq]—UK³lÕ*¦?}-ßô&¿¬^Á’%KX“¯qÎø9 ëL¿ŽSRx|A>¹UÚýžtÿ axeÑÄÎåáv7Yñ5[e¿á¡pÚ½\|ó6ëÞòã[–}Å­w<ɲbð+âç5´t8º§JžûM3ÿJ疕ͬtnM¤Ëšî øð– xšYq®Ï(šQ%lSO‡!wó&*ÙR–Ç-·7\A¿Soâ‹Å[p%¤ŠWó̃˜¹<Š”Ý_¹|û2^0ƒ!~OÅ3â5@÷VØÛÔ*îmx«ØQ×*ÇM"LUo=Ä…—ôçâAŸ“ô{Ñ=&Kž¹„KŸøÝ£oõŒ„ð•ï”§ †&0‚Yä<èf <ÈäGåpÊóDJ„7P¥lèZúYÒ<~Á@¥úÀ‡¨œ¯~³¢| ½Òy!<ºØeùíV8¹ª„) Áoÿ{„ OÆ6´Š¸HÐ}¡ªu PÇeêr[¼ø½>²²³Ð…›R{ ìîÖM–¥rëçEÃð”2þ†3¹xÐ,\±–¥ßOåõgFñ£åcÃg/2àí_ ‚éò¡›Uʘ×Ô·}^ü^Y99„rL¾ünŸœÀã âó™{¤ž•¾£·ÎoÝ#˜=èb®>«—³dɯ,Y¹™$W ŒÊu…ÏDJLñÎÀkùtS>0Ý U¥  ö\Zÿ+ÛüàÛ}½eË<#;ºUv§o½_3ðùüüIÞ»æHîšÝ‚çÆŽàøyØEó¹±{3º—¦Ý®gF±NÐcñÍÝçÐíÞçÔ«%]o|ƒRÍeâiíyåÇE\ÞNGû0/eâ-ÇR¿F¯N¸y<ŦMf¾Ù¤C§à«¡´h|<¯/]Çë7^ÉÌIOÓ*Ï ·é5¬ øý˧éÞ¬&P6/zœ¥át]¦}‰D÷xt$.B€¯ÙÉÜq÷] <”ÆĘž…Ü}Öu,°|Tc£jì£i7>üC‡á†nÐZœÁ ¡0ôÁû8¯C6ï^z÷ÏŒóû¸»¸sv>Ë4ÇôÕãòá_!| >º³ ‚zqÇÄeh”}ÕÈÏÃ?Û¶Š»OrðµÐtù|¼(Ž&ÒžÉeÓÇáiß“NÍ⌽òhj˜^j¶èÁ ó6 ¤$ÿ‡÷8÷ôÓ¸þœÔòè~Çh.=ÿ^Ò‹z9~_­qñøu–¼xí—‹afӺ׽ü—x4›oŸ»…>ň³$¨Í‰w¿KñúÉ\rø¾xóqÝK³‰“VG‰M ¸õ¸ýÉöêì{h?&®Ÿ&Ë›ŽÿîMfšœ¶÷\ykéäÕÕxaü7¤l¤Àãó¡ šÍ´N£i¦§úb£îÁïMñáåÝéúØ» éÙ3Ô„+ßø‰Ô²7èÕ"_ýÃyvÚê´Ã%á;œÙ~_Bmz `nŽ!*?§NÍ£ûRóãÛxé»&Í àÕÐÐ)šò}iˆ×¤nÛ“ykáÆŒ'Ý¥àljœwh²~öíp:ï,Na膳‚ÇNo‰ÇS›žw@ĆèïÓ¹äÄÜpõ¹4®á§vÛSyw‰ƒ/àaÍ·px³š˜ž,šu»‘…It–¾÷}®½‡at"+ËQWbãÆùÜÔ£)¾ì:ô{ä "B nx CNmG®W£v»Óxc‰_ßEùíºí2eùšÙ„éM‹÷Jû5¾}ü\ZÖËÆ4sépÎ㬑>ÓbògsÌ tÒþøýyt»iE ¤ËºÙ/Ò­I6f̓¹ëÓ|¼^nºIùÙ¶~^„Ž‘ÿ%Ã_[Îyc&ðä໸oè0ž5„–+>áÁ‘ãY6ò,ü úŒà·_?åâ®Í ‚ÔlÜ…'¿X†“ébPð㛜´.zÎÜüþzüA•/ÝË]37²bàþ¾º ñ]ûç¤?#¨ ¯ y·kx`è`î¿ÿßÖ›<ÛÂ4¢Lq1M²CdÕnÉu£g`=|vê<¹´€ÁGo7¦”¸ÄWƇ6 `8à”Aüðàa÷Õ‰ÿÙmu4ÑvŸn”¸™~;²mÝüZy¿”¯^Äëväâiÿå(:×10ô|žíÓ…I5®cÞòo¹µÖôèr7« 8af=ò5î›Eì÷OØwÚFN[Ç)ïÌçÒCæ¥ïâÈÈ{,Rdµ<“wfýÊòù/Óè‹Ë¸høÏˆ²~ƒÒfýŒ±œ}óG\õÆ‹ôkV—~O¼@·Ónâ§ qŠ–=‰oÆk\z÷;œ8âs–þ4…^©w¸ýá7)¶É¤#ýòwËdúoQÖ_RChÙôx­7OdÜÂ8†&·±OE]PõXúútÿ2dº?Ц „p‰æS¶hÐoÝû+±ž—웺sÑ´6Œ[¸Š^?Ÿ‰—öåù•žŒ€“îÎåáå­Ì´UW9æ$uN¤ß!a¾ùp t¤½žÏÆýÀá'ÀÜ›{rÅä¼õã/¼su]n=ùf;èn’%ïÀúÃîâ·pcOñ±ð­÷YwÈ@Væóü±«xäÁÑäÛ’­¸÷¹ü¾b*—i¯rÌÕ_àút¤gþòó1O0ÿ«§Ñ?¸žC»?ÍC>fúèKù橇˜±,‚t6ñìE§²¨Ã,\¹Š×ú–pãñ2;îC“»Æ>;f¿êò>-=‹>gŸŽýñh>YG•¼-®Y«+/|ùk½ÏQ?ÝJÏsÑMÇ 3ýAÄ/y‡¹¯^Èä»Îàè~ŸÒ÷µ™üïêýxðÞWØwˆ­ÿ–;®LƒkƱxÉ Ü7^õ «SF¦/•Ä•.ÒMâÖ9›.Ïâ­acÙDf t‘Ø„£5èûл,_ö/_˜ÅÀ[žæ·ˆMbÓBnëw%ñ‡óíâEL|øLjØ „ÏdѰ{XÚË|ÿÅòGßɘÅEè2Åê¯'³¢n_~Ê/åÃKcØ*öK¤ká:òø¤…¬]ú}Ö ¥ÛÓ^Ç3ë‘ç©5xñß&Qû›Çyñ»M8Å?qOÿ»¨ý»¬œó(±§na–@G"¥»[ÊìžÞÒvUŸÇ`çÄXðÕ|6–„‰ÄmÌ@Zm»rÛ5çÑ GKùvâõx uŽ»u4¿,]̃;1úÞû™»6†_Îó®Fï÷«Ž„‘·29á¥EÿAú3vb¯?–dÊÚƒéßö]!eú=d'Š)È/  ?Ÿ¢¸ƒ¦Ùüôê αš{>™Ïœq×2kðU<7i ÇŽÿŽ[Ú5äþ©Qdò+ŽöÿÆÓÎ`u§‡øaéTÎ=KÏÞÃØ`xÿ‘òµ§òt¯oªþÿôq¬,Œª„£éè«'1ìó-\òôÃtÍK‘’&¬~‹g¿ÛŸÁÏÜLë}[ríËÏsäÚ—ûƒ…f'¨sþ\×ÞK2Ø„Õbæò"Üd ËqID#D#ÿÇÞyÇÉQ\‰ÿ[ffsVXiµZe åœ@ ‘sƒÏöùì;gpöÏ9ÎØpçødˆ$@Êei¥Íy'tw…ß=»;+„ml$ ̃ù¬jfzºú¥zõê…Æ)dêâÉZý0ËV71~ñ8êŸz”f„íÐøâïùÔÿÈù?¼•N+ÇSš •BIŸx¼›îî8Ö,£µx$‘#kyhù‹8ƒG²kÓZ:eß"‘þ+2Fý✴BŒdT®OáÎc&ÎqüröÒÞ=ÿîÙœd¼‡‡¯ :GITÓó|i §Ÿ?š½+âÙÚ|Tìäç÷×â¸Væaè›Ã Çü)&—…ï9›Ï/£6î’Úq+K&pþÜNn^ç³wþ„³F fÉǿ½žkǵ‘iñ‰ ¦!)Œ ¹3/à#gMÂ+Æžy%vëNêÛ,&]q.ùûžã/¬§löIxÝÃÎÀ… Iþ™_å¦Ìeô¤…œ94#?ò >zòhNš‹GyhìFîý#¿~©„)ÕIž|ðö-dL°’G×ub['P–̱hozc¸r&_È—–tsý7%qiºkcÊ…§Ð½áqX¹Ñ§O¢}ùRᢽ$WÝÂWNeú2¿B3æ[?⺙£XrÉT'÷p ihÜr7/ve Úò‡ž¢cà,Ô¡Ul­Mõòuú´ÒLû÷oS¶ý6ÛØÜ»IV†/YÄÈ`?øu‘Ö®gk§¢yól*½œo]9CË*˜tÊ%œ6! §üŠ_ð“kg2~áżwvOîèĆè¸ù¼ÿÂS ág€Ý[ÙÓ(˜pÙ¹”×­áþe/0ýô_ØîÛé[øq~üï§2bôlÎ;o#¯¸šÿX2‘‘Ó/â’ùQhB¼“<‘˼ÉÏ>ø;bs™å¬äžçÛpì7O/ö=ë¥äQ4Ö(aòeg ·=Éýo§úÔÉt=r7ûˆ€—dàû¾ËǦFðòGrúäRžÛ'¾ó.ÖçÇõZLyÕ¾û¿Ÿ¦"‘@½®¾ƒcƒû ÎlnùÓwˆ=ðY.8ïÞsÍøæoWP€’ÚOÒÝÝMw<`àÌYŒÏiâñ‡–±½3Ÿú0ÛºðvýOx‹ù§.`@åÉ|÷Ÿep2IàûxJ£½8ÊëÆ÷å[øàiÃùX‚}÷†óÏ»˜‹Ï?‡ýé QÓÊò•¯°èË_çšiCµðj>sU KŸÛ†—HàkŸè"™Ò¤vý‘¥sùÊׯ£ºrŸ¿ýFlÿ-ïRoJ2eÞ›êÍ„–U-¥|C¥&2 #)„°z9]ú>©¡ð³ÿtøÞ{Ï¡òŽ¥\Æp¼¦½tdž2<ß'‘Hà¸CUâQWß…R’I[Hl4ž d ¥”D*‹Tó*n¸ö ¤f\̼1ñ” A')­0–EëÆ¥¬6³ùôÌ‘¨ Ò©Fk””È@ÒÕR‹íŒÃ÷< šXõ|¾¸p e®DÊð9D PŒVH#‘á)%RŒ°Ðñ#IYL*‰RökìÃm&~zß Âß´¤DÈ07ÌÈ•Hm@K¤TèÖÃ4)—+I<©‘ ˜ö™›8cJ>Ý)‰Ñé¹ÉžY…½%!ä1²Â†L>ŸŠŸþˆ-‡³óÇ¿„S~üÜzšU1Kº ;–Ïð2‡gk;ՆܒŒQHi&šAi…”ékKí`½œåÅgq鼑icíÄ…  xH©xK(QÊðBA<éaØ_)G¶ÑéÕIR2…ör¸ê{73m˜$åÉŠ×Z‡¹ýð'°PhmH¥bœÿÅÏ1büõ|ç’»ˆ¹ èľrÕ‡Ø5öΜR…#]¬ „RH)(žO²;4ØQ$I$RHc°ðHIE¼aÒÉÁI|-!g8ûÒÆöñ7”2 ¢åó¹ò”n½kŸ–`PÓÆ}ßú7n.æ¢S'2ÐR ÄE¢a?¹Å³È)<ß|”ÂùÈ'Õ•Àˆ€¨ž ¥ÆÍ‰`,M _cYKâ¦\Á]b!W,CI`aËNº}EDŠå¤<<ã!)¡ªÐÁó<,éƒ+d@²n;­N!y&AÒK¡=‹ ÿûwŒ­Hx꟬lbYVo…ˆLilƒÒ&ÍÓ!5×lãW^ÃËÃ.â¼™ÃÉ•vÐò°T¸$>–%±…Æ$ÉÆý¸…c)´=R Y2‘Áö:¤”R¾+lG%B€’¥TßA@áÜÿâŽG¯¡öÀ!jw­ä›ï¿–/å¯ácŽèÕ{–ðxúwßäk·²ä´™ ÉñÐÒ')%ɶ½PPI™ë‘Jzè’‰ ±!JЊ@J¤|ëÊàHÕóü*Cg„(mqÙ-<ù£Éxq‰åFéîLj¨ËÞ›Ío6”R(ßcä5wð‰ƒŸã??s÷ýôC”º:U–>~6PPVM_ÍÅW_GyD#, Mô)-KYh.¢R…‹½ÉÈ”róvÞü3^óùÊä)/2G{dÍ1ð“V J…ß7¥$JI,¥Â€å´AÕž¯•‚¢a ´Œ¼„ž›O—g°¤8²N…ÇéJ‘©sÿ)ÃÑ¢¿OCÞ ÑÌ~øfö>`¸ô©ÓɾB¥ÛÄÊW“\=?“8ĺÒ1#òQ \”B)ƒÒ:M[‰RV8æÐrþðL?Ûÿ-Î,pI=ñŸÐ-h¥ÒG«:¤³P(­Ã—R˜té-=œ¡3(gÕ§^ËÕC=-°å§ð¥âDm°µÖˆ´\eŽR5H’p>?ÿâ,úÌÌ­Ž2_Øø»–òðînàÿ15×¥åÿÇW$½å}Œ’á"£ú6R)TzÓad@lÐDÜH'_t“ $FXؾ‹€P"ñ­Ä8ëÊKøŸÿ' ’8åÓ¾“{;È5¿úJ™È IDATWµË¹ý—Ï d@¬r"Ý »9Ò¡(ÍÕ`Ù U*‘žB…†•eÚôò9¡¬ êWò»†¯nû6•ºÈvó9šBzë z«4½UÏo¤åQù؃§S©¦dÞµ|x´GJ†ôÖ~ ÏWÿtdžÌ#Ä~:RÒ›­Ú#ëÆvÑ{îçîõøÝÒ¯3?×¥ëÏ÷ó ZÉ4÷à#ÄV>Îà XݨïR”D^ã&ê “~öw…á¨5–eõÊtŸ_×!&ÒÄP5†a'䪱_ææ—¢FXB>1^=+Vnæ´ü€ÅîÜÆ‹ú3¾ïcžH4þ2µŠQ ¿aµEß®¢×Þ*ÐZõþ훇ÀRaƹ常®‹ŽˆpM°b”åðÄž0‚ûŽ¡t`!= ‘1%}ìÁSÈéZÊŽÉÈ2Ý´–­ÝEœ[á"¥‡Ê&]š¾…åéNˆáØWñF ÇÌïö\¾Ÿ®—¨5J &\òc~ßðAÞÿÁ1ô/ßçóç}“oôËT}i!«¾÷9ê|žkÇÀËJcì0¦Ã`ÒñB ÜRÄ:yùég8‰ 8…ÜλX»¥Ž<ç)n¸q+93. 3«µFDʹök·°ñª÷ðÁŸã×/&¿¤ §n«^^_=„ñ‹®¢æ—Ÿà3?(ã¿ÎCëö5lµÇð¡K–PèôÄÚè´¢O/ X˜ö<ÿìs¸ñV¶®¼“o_ÏU¿YÅâÜ Oÿ]øéQ=¿Ýï阣5ÊÄ1¶œCËäùÓΡªr_ÿÔ,NýÀÅ|õ¦¯±¸ÒgíC#Þû®´z®5oJñذ¦ éóœ Ñ Î]4•ß|òÇ4 ¿ž;¦Xt™IÜð¾Qœó¡2ãæÿÂYùSµÏäÑÙy$_íyÖ4]ÓuÓLzÆ3˜²‰L(8Ȳ'v1sz#?øáÓh=±7,ÂôÆöá)¬A˜ŽÛ“bèU|fñM|&ò…Ë)‰ïã…^eÁÇ¿ÊÜâ´‡á8ƒ¢_ŒcŸò°V𿯠S£ÿã\ð“S¸wó)\g¬SÂ<½æ Uƒ^á3ß]O,2¾g!þBï·6*-k¦Wf´– 8éjÎt/å _ù Ÿ{ß<Ôáͬ;bsùu×2,GaLÈ}4ÐäO<›N½¿-ÅàK :gcI–¯ØÆÅeÃxþŽ;Y  £ÊÆ]Éb÷¾úõ›¹á=ÓèÚ³gÒE`§çbtoXGßÜtß\µF+‰)äÒzxl'Ÿœâ77=J"U‘~Vzc¼z~ÓdðŒIÓ[¼Œ¯_}#Ÿû·Qò­0Tbõ“/3é“ÿÍ™åÁ?Mï 9Ö“–kËXá©Cófžxlv ÑÚ¦¢fcbàñçö1nä«|ù{/b;g…I<üß+óÒ'oÄ園w wÜ»ŠO™Çÿ߯iŠ-J×áÓ¼+ª©ã ¬Ñ®å\yÁ]L¾òæŒ(¢nÕøÊŽ2>ð©T6ö{–­ma‚ñq‡]ÉÅÃnçÖ?ç“¿ŸvC+$«V<Á+y1òr>8ågÜøù’ÿÁQ<øåÿ‡YòΩ2©l­Çãæqä­‹4yM”ÎÂó¿qúg’L$þ.CO)ESS#ÕÃkÂB¶×X–ÅÎíÛ˜8y ÝÝ]oxqlnn¦jX5ñîîþn÷d‰sæO¦ b3bÆi ë|?ï¨àãßþ$e»—óÇ{VâOû0¿¼éߢ“t6Ö“<™EcËÀhº`ø4Ô bhM”gî½¥O4pÊ¿}„Åå¹ý7¿ç±­y\ûùs(°ª˜74‰ýû±'.æ”qÃ8uÑx6Þ»”–Ñ‹X0a(œƒÜ{×=<µVqÖ‡ÞËE'eïÊ{YºüY¶7G˜{ÚNRDº€ Â$ï£sÈÎUNªµ•¶úõ¬|æ^Ú°®Âi\ÿÃ_ñùÓÊH¤Ô1ñÓÚÒ̡Èǻù¹×¸Ÿ†‚éœ{Ê0„Ô¡i=pœég3}€ËÀi“ïã÷÷=—?’3?ô1έneùŸîæ‘ç¶àžÃ…K¦R¢ã4%#L1‰÷Ía¼îxÅÅ%ApL¶,£¹³›é¼KFEI¥`Ø©ç1ÛÝÊ·ÝÏNkßúÙ—˜Yâ⥺iI8L9…¢(¿›Öxz™ê¤-aÊÜ ¹tQOþæçÜõ\#‹®=‹w‹ÎžM´­žÎ‚N¬ÄFÓÑÒBî°‰LZ‚Ð-Íí ™0“êÒ"&žu1e ÏqïÒ‡Yµ¥!³Îå´iÃÈAŸ°E!™ˆ“Ÿ_Ð?ÁB(ÚÕR8m “‡¸(1€Iã’ì’5œ½dƒ*'²`\Šû~ùKX§¹ò†sÉ7ƒ9ùôÉÈÚƒ5s8uTF4Ô¶1tö|ƹ蠋ÚÁôùÓ¨(ª`Þé'Ó½þ!î{èIÖïO1é䳘9º—ž¢üj¬¥µt*g͈”1NŸÏ‘VÍØ§³xÖHæÌÎÞ¿ü†?<ü"îÈ9L?i,ÓçÍ¢ª¤‚Ù‹çÒòâýÜ·ì)^í.eÁ’”t×ãUÍàÔÑE­i¯«Ã;—¹Í>ãçÌa@¨ ›¦6Íø…—rõ’rVýîܱrS/:ùC8ù¬Ùäw7Óf`Þ”‘D,C¼½ÊF3mä ,-ÕÌ`ô "Æžu5ñ—¹ï¾xú•ÔM;‡³æŒ WüóôBÐÚÚLeåP’ÉDߢ€T{ í›xnÕˬ[¿žµ/<ËÑæW—pÿÿÜÌ}/&¸èãçRÀ 5Q_KrÐdN[ŠAÓÙÐ5ÓY8jSçŒdÍÝ¿â®G6S}Í ÌÉw˜8o6å¨~øX–E$éïqŒ”2Ði⥧W°âéUìNUñ¡oÞ§O-#¯ª†’¦ç¹õ®elmÌG¯¿ŒøS·ñÛ¿¼Æ2üâçn0ßÿÁhinú» Gßóضu 'ŸzÚkŒMÇqxàÏ÷qÕ5×ÑP_÷†[îܱ¹ N¡±¾®_7a9D#¾ç§wË‘XÛ¤|âX£%¾ç# 8‘(® H¥‹Û‘(®HIåDˆF,É„‡ˆÄÂF!%Ø–&• prrpdŠd`¶CNÌE¦’øZàF¢D Œ$™ðÁqˆF"X"”ÂÀ÷ 2¢ X±bx$RáFˆEœ¾‚éZ!ƒ ÿ5ýâlvïÚÁì¹ hl¨m·V$FÌ–$’²×±áÄr±ƒ)BØDcQa?PØn”ˆk‡I;iüiaqmßS¼Bêë¨>"c±<úK±X!S$ƒ¾²¦KZhß#PaõŸßkÇ7äœ4ž&Ç/á!biR¾ ï‰`é ,gƒÀF1Æ… ‹H$Šc‡©MJøþ‰Œ´´41hÐàÞ!ÜXB¦ðÓñ¨–#Ç5¤R>J,7JÔµFฆTÂÇŠÆpŸ–A$Åø^èU6±¨ƒïy}8ŽD°­Ð{,Ÿ@ö?ö´ÜQ+ 驞7ȉ¹ S$= ¶C,Á ”FXxáÑ–°"Q[Ð ÏóÀÍœ8ÑŽòH)A4ê"Ó×"l¢Q‡ •ÂØQbÑÞRì4½íµÃICX|ÞAá*Mÿ(BûRƒ°p#QÜ4½µ”ø~À›±ü[–Åî];™1k.­-Íý7Þ=tê´—ÄÇ%±ûxØé¡ßëë8a»D#nˆk)¶ÕKËwÄãqÇ!//¿¯ãVN‰Dpm;]… /”{aI¯%Zùx¾!„5 µÂò}¤6ášÔÃËR"l›ÀK¢pzu¬ï‡2òV@*•D)MII ¾ï÷['ìœ\":-“¢¿ž±ÝHz=s zdܲ#D£šT2…6Ñh[„ë®çùdë‚g£eq`ÿ>¦NŸÉ}wßÁÅ—]ñGLø<úð2λ𒾠Ã_[Y,‹Æú:~ôöÿö·]Öãç:Ó»ø‰‰qL»ÇßH“õ^˹'¾'3ãP$“ýüžxˆ—Là½ãòRÈ׫À#d\á%‘Þ1v­ÉAÆñÞ—$ó'Iüuom*A¼çŽžÃßD©îw q,¯ò“½¿ß³¢Éxß3I*ÑŸ™¤ŸBú¯Ù¯’RòÍd‡t+¼¿’f’‰£ñgRI^ó®ê?¿×Žz¶Gá¹W‡ÉÌûx©~÷õSÉÌâ¥^Ëc'ðà©7K²'¾¶ßfî(c\ùIºýÌqŠDÆØO#T{É 1x™Bf$ÉäQ8NþužP~’Dÿ7HÄ3'r,gÐìèÏúÍ~¼Jª~sí›ôHd ³ßËèdN_ú^¿g¼þôöS üã@É×ëu,:eê»LÔôð°þ+:ÎHŸ¤ôy·Bf,éÑ•/Epl&|ÍZòz-½¥U–ÂYÈB²…,d! o¶íœÐ{÷»Icó¢7˼~à¬aë=KôÓ(ceë?e! YÈB²…,¼a1ÃZóÎ2€–ˆŒ|?¡ QäG- c†\:Èubv@K2Âê†J”ÉŠg! YÈB²…,Óp4Ö1*r¿Í ǰ^ÿòPùN‚sjZP’KN~9Úk'ÙÞDii9ŽìdkƒV³ÏŽYÈB²…,d! Ç„·"Gþ„µ4õ†Šs\Ê+*qóʱóJؽs] 0¯ÜûPKÓÛB.k:f! oÃ]°6aá}[deøCOƒcYGõç6(©1–c½)w" –caÿ 1Ž1© ¶ R‚ãZü#«¤FY‚ˆ••Š,¼I¼ùÔrõOßäñŸÉþ?oâÑN{œí+Ûuȱ!$= Ž‚œ˜ƒŠ¤ {-V”rÍŒ\þòŠâ#gçsÇ_e§oè„PJ‹¹çÄ)µ»øïM>‘lQ„,¼öÕ[°5?†cçÐô iîôèìŠqm0Ç²Ãæ‡:@I?lçd4ÚXÇ0,bœ{z•h”1¸yyTøüzÙ^öùYκ`vvh0 µ[B c ,@+¡ F, :c|¼½G*€)žÄÕ¥’'VìàñCáüT æ3§•³ïÅ]üj{c JƒžOæXK¶hƒ°Â¹÷Œ± u¸G϶¼³èqhmP\ëíD}ƒ¶¢Ìœ2˜Ãbm° tu%xaÃa65+Œmõ.ÆJiŒeá*ì,¡tØhÚµEÈæµxÒ"4HµÛ¶°½1ã„|ÓQ߯#†¤ ùLª°axú湌y(VÝì-oÓ[ù%üÇ™CíI<¶€Tgœç7Ô³¹Ma‰>/ØÑ¼,¥î‡C)5‹Ñ³ªy®ç«»°lcR¦÷¨Ë覇&=ï+n@¥H&¼Ÿ%ÐÆ ¥&С>ºoN™º¥GFæ5<!hm–Æ—š ­ÿõqÕ7†šEcø—]/mç×›RظÅùü¥•¤öá–çé4ÐÖÔÆ½/tÓ–0üöáVŽøc[È™–˲zç£écÒrH/Zÿõï÷Ê\Z§ ÒʲC™ÍBBÃñZ\•áïèLJºEy<Ï#å{`””>ZFÀhÌ1bƒT7÷-Û(%˜²ä$&š90`¿U xþ•¸Èø*<îO§¥k­Iy¡·Ñ˜°Wñ©ƒ_ê’jëà©õ LÙŒ›^ÅØŽº‡T02èb³‰2 )Ñüy}3mDZ~®1 }ƒnS:°œCÍ$Åê"üTЏ çŸ[XÀ¼a./oo¡S ò‹ ™3Ôfõ–FÌΦvìê Êš›Ø”[Ì ¦v¬ê ´Ô³¬5Æ©£ ) Zë[X¾¡n7ʼ)e4ïmdO§ÂÁК &Š8+ö%x»ôYPFÍÎEÓܵb{º$8Js°ŒÅØ©ƒÞPÏ£ a,¦NBÁz^LFY4¦î”abuAkË7´3xüPæÑt¨Ç¶v’4“æ §ª¾‰ä°AŒù¬ZSË.»˜Kf–S”êäá—iÀɉP]¢9Д‚h Æãyš1Có±ã]<¹®C)ÐD˜9³’Ù,öîlÁRL╬éïêÅQƒjoåO×ÒèC,aüäa\yÚ`šþrà +ŠY<©ŒQ¨?ÔÌÊítê( OLrãÖwƒ!Êé‹м³QƒrÉ á¿J%uM<º3`Þ´Œ.²‘©k¶4²£ÅG‡‰“‡0kH Ç÷ظé0¯jƒTP=f0Uå’ljcŦ=Az÷†VšœÊR–Œ-fpžEwk+Ö7Ó$!¿¸€Ù•QÚí(“ÇHµ´³bS3->+Ê‚¹•L)-›Û–¤=­fç6Ë”RMqDU9·¤^Âð åØí]´Jƒ6¬'O/ãÀÆZRž`Ãéó³õåzr§V1®½¶ÁL.6ìÜr„•µ>ÂbEœ1¹‚ay‰¶Nžx¥%|&á0gÎ`æ” ^ÝšñýâΚRÁЋ–ºžÚÒJ‹t˜6o8ƒÛ ªœšhÀºõ‡y±Y¿Í6µY8~î‚oõœÖ3¦ÿ+™òéèê"¤”h©BCQy‡”AZqpÌ—”?P¤œN®‚ÍÛ:HÁë~ÿÝóJãŒÐ ò)_á•&„ÁbΑL°ã<±¶Ž]¢„k–TR¬ E 9õ”JôžCܽ¾«$›=‡øÓ†6:ƒãAÊ›p•1QÊ-ŸWRøÒÂdÈT¡¢”Äó”(¼@¡»ºxd]›Û‡É礙«76Rë_^Æ™cèíÝ(#hÚ½Ÿ6w£÷NþàH:W¬ãÉ#š|¿‹òÈõÛðdxôèå(‚Ž.žßÙJ}§¦sks‘›“ÏY£Þ±—;A7ÙÌUƒ– Ï?QÛÚMpeØ»Ú$¾® ^2Ρ +´’_ˆ®kæù=øVm‹qyM®N¡´A¦qhDH‡À èö –ÎÚ‰‘ãÂþÚ.µ¤ ]J£r*8¬à±;vó|‡…+:ØŒ ¢Ê`Ú›¹çåêR†V;ÊeâÕ‰2 •"Њƒ›ëhˆÚDÔ®maî9E”麤&hlæÑ4{°uWc‡G Vęà Ëo;À†nØÐeÆû¡¤Ä ,´8žúÆh0ÊãÕÚó*r)Í­`HãjÏãâ2®C¶BõĘú` nÔ‰BÐñêVL‚Plš[ÁÔBÑX1åíMüú¥ÚµÀ6Hi1_X$îáÎuh»‹šñã™Zh8)¦¨»Çvv0‚®Í\19Ÿ|ÑÔ†C;±¶Áƒ†:¶ÏÏ„<ÍöC$ëuÌUcïÀ–ƒFŒÐÄ;[èj®¥¦J“Ÿ[E   ŸCÚ:ã8J"™>ª¶^×9ëÛ¹œ91ÊöU ´ AÔ˜ì1uÚ€°ü€§žÚÁcû„·¨ëN+GS˜ÏÀ‚ÎX4Já5´Ñ$¡L@{“‡¶ –Ö`õŒ9!=t{=-Çæ6+‡—3tŒÍºû; ¦ È8¾ ·Y=Vö²†ÍÞ ->F„˜Œ±T6“çÖp~µKÒSVŒH$I ÍáƒmÔÏ­fFÁvV”âvtR×%.ñ¯Jw-%RXÄ,ƒÖ†LñÑ=ò‘W =6éÿR IÊWá;A@KÊ"„U ü¤A „Ñahkò0–@H…¯|j»Ž€ÀKg×’q4½|Oáû*M/4àæÅ(!Åž.ƒ-:§!íFy«vÒÿBäìýG({ f…¥X~UÃs¹º¸“>*n©k"Ð# ÀÆÅÂØfD˜LHäÙMm\>«š'}Z:â¼°±ž½‘\Št’Ýí;„j¥y$Þà+@ôÆ´ þ¬1)aÌŒa\:&‡ Ðø&Bq¾$j4’q…Ôa²‰4á†ÌÎË¡@%Ø×¥±m‹ £“:5q‚ŽªCÔjŽ4¶ãV•sÉ„(ëV´‘ÊÏï›Cš¦× žÆ© qÝÕ`„Á2Џ µ!–¥­«›¤ kÑ ÂøN! í ÚËhºA¥ ‘Ü\†T:\~Z.Z„z¹»©•”6 ñŽ€ÓŠ¸²È±MïiH²GÕï8#i¥‚Û&ÞÑ‚? 'ܽyq„eaÛ.Žãøéäi cì×5D †—3Åjçç{|ìtàqzVƒçùt&,nD"Óç¼A"IG\°ô¡-ì llÒAëV„ÓÄ1b‹Lhª'á[ͽ8óÆ2;yÏ4i抴ˆ˜Ð(Ò„ˆÑaåü¨•vÛ§I“WkÐZcò‹¹lFËoÛÄs­jðH~}y,LÞJtñäA¸nrNa>‡·¤C,ëm¤>º:ØØ=‚éãóyðéNdÄ Ÿ]¶E ÃçQ:\ü£¶è]{âÔŒîoôé~†zš>ôð„飉;ï÷i£T÷]g2Œ}•ôIX.#ŠíI e»ÛíïvÃÑЋ[¥4J…ÝAEŒÍ XqÄGŽ hÜÛÂÏW6à§“Ž´¸v.K„±ÍʶÉsÒFOšJk, ïªå–Ú&•æ0y|%çMòøÕÆ$,Õ‡ IDATI«˜QÍž¤ÀÕ#IýôCÿÑš RÈE3 X÷ç-<ÖèãWòã«Ëz ­^Ë ­Jz¤¬B lzÀ—|+½‰Üʯ©¥K§é‰À±¢½ÕCzÊÓ ‘iÄf—¼ì’ÿN-ÇcÂ…Ûqsü-mM-l¿/ÑßÞF*5[je é¾.B¤±™1¦€ö­Ù„• Þ'1œv„{ß§øm ¬OåêÅC¸í…¼h.' Ëc÷憰P{¯ñ Ó85Ç]÷>zìSoç·K7õ=¶ÕÏû§ðò+¨Ìô\fÍLIâº×rìQäcc0žO—Òˆ")r¸bA)®Ç`°,ÅöõˆkG²¨«ƒßîO`°ß¡üÇ…9ɲG3ãòñ|\íeÙŽnTN.s&DîÞÍ‹‡®šTJá¦CXÃ1±"‡C½^—>CQ›¾ _f¼]/O¤¿×ãµì½¶gåÔº¿Ç1M—£?ô D¼…ÇkGpÙCxõñf†ÎBµ#Ø›¾y—6èñjaÙåGð#‚•e\´p(© ;y¦M«m%r^—7§xtoŠ¢EŒt|^ØÝÅÎFX2&}¨“‰‹‡RƒaµÖt& …5y”8]t:f*¤«¥ƒí)RÂ=ŒgÝ‘fâsGrå´îŒ+-`l¾aÍή ¦1ôèå´G9Û$ã]Úœø‚<'è¨Z£…ÂåR9f&*±Õ]Ö‚SM-EtéöëÙëb]ûHÒvÌß³ró•¯xbmw¸óÕÙcê–ÆKJ¥û¼sJ‘HI¤•àÃ˶`-Å箎¤Ø°ñëÆAIq¼Ø7Ö' þ£1$%‰ ŒŒïhOô¸ ñý€D 0Z“êèä‘õ|à’\$X»¹–]E¡aã¥$ÉtöµÀJIé®×Ê/nä“—Îá4¯›•Û©/²P&,7¤ZYÙ>œ…uu쎃p5úmÅX‚äáý|óÎï9­ŠOO‹`û)^Ùtˆû÷z4é]üeÀx¾ÿÉJíifo}Òh­Hx*<æ4­$ Ïñb@IIÂWh&ÛÄ•î]ÈI‰Ÿ¾ÎhEWJ„eY¤J_£ÑZ“ðd:á%̾Mz aIž{`3eŒãªdÃËõìôs*\µ~÷Jµ $mn ½¼ $»ºYóüÞÞ…:4ð«Çל:–ï,²HuwóÄsûЖbÓS;˜|ñXþçS’—WáåÎA¡©ÝRˋգù懇°g_뚢\xj5E4ªçO7’°zÙ+äž1–O]7ÇKðÔãÛØ®q?L¬2”R$üÐ{í%Rœ “ß?|„Oœ3“_ë$/mSÛj‡zG†<Ö{½T$< !|žz`ŒåŸÔl[_ÇúÎáQ¸á¸ò€1åtkÆèN‘Hë%% /äy­|V={€œ;‰›x¼¸ú¯”¼FG‚ÁOIÒonå¶Ç®Y<†oŸbÑQ×Ämµãy’¸ì ?ð½ðû‰ÖVn}ÄâªÓFòy6A"γ/ìÇW=:L§uZˆoN~²ðvqY':Äñµ·ûâçn0ßÿÁhin w„|ÏcÛÖ-œ|êi$‰~×8ŽÃwÞÍêî‰8B¥m -}¢ŽÁ'F À Ÿª‚‡ãEáÂó7,ŒT ±]û¸ˆ};‚ï‡eXz§Óørݰ °1aVºÔ=t²‰8åKÛ ayÔøDp£ô$åsÔ–&Ú²ˆ¦ Í©tQk„À¶ÃP…¨k!=‰vÃ"âa¸¤D¹9é±Qšd 1Bà†uÒ‰Eí°FZN)Ÿýà¶ßµ–[ÅÛ6ðÜè7*}¾è8'ô<¾Â×˶Ú \›¨8Š?´Æ“XÂÄßXÄ\âÓ‹&ƒ!™Ò8Q;,£5‰r¢(MJC̵Æà'ƒÿ¼ôýÜX„˜Ÿ¤!n(©Î÷/)ä·¿Ýʶ@¼«k9m¤ÂÞðŽnFíÃ0y¦¯Ö¦ëZ¸é¸å”^ë8aF´±‰ˆð}©{j6™®˜.o§CB|_ôÔôtm\4ž eLôÜ;=–¾D;1;¬› txÌjƒRÚXúõ¯¦¯ƒí„¼cGœã¯Û(_áa‘{ÔÍ´Òøºo¾Fg<—#0ÊàFlÌQ:2ð%Ê õʤO¿&P¶}ÌïëLš ëXDìPæzt€çIˆ8aU‰ìr—õ8‹ó*wsö—ÁQë¦Ï£/ã¼ /A)ùw8ž,ëëøÑØþÛ?ÜvYúín 3ý·ˆŸ€¬jCW2 bõÏNðúˆÛRyüÝÆ³ò$~–o^Çz”ÇÀ×±@J…ìùHKº3/”éÝáѺR©t‰®ŒÍFÊÓÇܤº$“žUæ0½<—JÉcòñÆêuæ{œý»Ä_§‚ÇÑóƒLwÎQ=Ïu´Ž<†¾é‡ß¿ãûMãÉwˆ~ÊÂ?ͽæØ9&'jóóO"þ–{O²…b[á¸69N’`Ø@¾ùoY«å„àÛ&/JÚÓ©È›1Œ‰Ó!k5f! YÈÂßÛ²yî‰}ï,ÃQ ÈÙ¶Óow £F+„ 2Žâh™Ârr° k0ÂÊ®Y8qvŒ68®C›ÅʼnE|OBŽ s²øÈB²…¿×p´O|Óó·DKK?ØOÄÖ8±BL ÕqÜœ\ºðT¾žõúd! YÈB²…,ü Á ÿïÉÚ´l yÕlsÙ]‘X>–0h­²”ÉB²…0„!/7–®ÏÙ÷1Í/$ÇáŸ/Øm ÆXäµÌÛ£–1€E,¿€Hº%a$¿ˆ\—ã^À< Yx׎v$ ÆØ%tÆ}i£©-ŽÑZHùúa¿a C4'‡ÜÜ\b']8+¢=÷ÜX.¹¹}¯XÔéWÀù_uîÆìhÿ¹çææ¦rV ÿ}øË!7'†cõkF8Ärs‰:ý–ý7`5XD¢Q,AVÎN˜-bÍ铜X ×±zuàç °Ü(1×zò$„áÈê;ùÀ 7Q›È¨',ÜhœÛ.ŸÍ—W&{3ÿa9ö>9o¿¯ôVP8žòbEbº&‡XÔ ã¿—Ï……ñkùÁUð[9¹)î¸t*ŸX''’ µÊBÖp|eÖòR()Ãy=±ŒÊGI)ýt‘à×hŸ­Ë³&2zÄXNÿàlèéöXïòEMXè ‘ïÏÎcÀ°QŒ=šÑ£ÇrþGn§;–ƒmïÍCˆô+Óð ¿ÐgŒ‹£ÆÇkî‘|‹/DqåHÆŒ“žÿh>õH7¹1'­„3;˜ô¼ï9ú¾ó.ã!ˆäÛo"ú¸o(œXÓÞ+÷~n ~J‚ˆ#yñ™ç©?Á…Q,KQ¿s#»ÍPæ-§iûÖîª#8 3“ùÓª°z§ßeÔ·£y¬bÿÓOÐ6ïR mÉ®å÷ÐV5™Éi•ßUÇ†í Œ™6b×àubÃŽv&ÌšF¬y Ï­ÙF«9e#9ùä‰Ô­y†ºŽVV-¿‡#¥Õœuéò;³vÍZj;< O`ÎìI”FSìzú)Ž ƒ½{õÅãï¢uØd¢{_b_²ˆi‹1\ífås›èÎÎɧL£Ìµñ¶m\Ïî†.„[ĸs7¤KÇÙþôst¬¦{ÏVZt)SOYĸ2Cí+/±;g(%u›ØÖ(©œ8—¹c 0¼ý¤ zÔ5üéæ/R+iØõ·þ仼g[+÷ßòo p ‰†=¬yy3Í)Cùˆ©Ìž<’<«“WžXEtöÙŒ/4`Úxéñõ”LË®#MøþóÜ{o%C¦²pr>_x‰mv¬ŒÉ3gR3 KxìY»Š-Zn1cçœL©%°mMý–U¬­m"6h,ófM¢<š¹÷³HÕmaͦ]4u+ò*F0oÞ$Š]A²ù[jÛ)íì<ØLtÀæÍžDQD t›ž{Ž-6ãg•œPÒY– ôÌ›YsË|dGKoxýâ|¶Üs1Ñ@Ò¾o/¼²‹.¥jâl¦€¥:ÙúÂZüÂbvïÂÔœ„“öŽje3`âL"%6Åá—že_Ù ®ãÕ‹á32kxQú$ ëÌBÖãø7‚PP-´1$q‚ ð}”R€Æ( ð‘R¾®WÊkÜ@sÙ –,OnÞNÿÕÛW°©.È ôRÕ¥dÐ0†W§¦¦†Ê2—}+nç†ßÀ=[;°mAûö <¿v+ ÍÍl]y'_¿ñÿ8ÔÆÛÇÿ~çû¼Üæ`Y6&¹_|ó§lM¸X'Á±â*† FMM 55Õ”EºYqûMÜöÒA´òÐoÌÃ[ëŸí?¦ƒM´Ônäw_ú?ºHÄB¼·õÆ0xê…µ¼À®•z…ûŸ„%çMÆU¡!¯_ÇÍ¿¸•ý t~_Ür-ñÝüôú/r׺Ãt´Õ³qõ:1‘)üLqY)ë~™ÏŠ ÅPXòÂU\vë ,Ù\ÄÆ%³ørQš®7gÞÿŽõWðÆý×óôg‹©­u•€Â–™Ÿòõ¢u”mdÆÔ;¸æ™¹HJW~Ãmç]È3ß®ÃóâÌ|ñnžþx!ž®ðó£—rÕƒ²±h5¯Oü %P¾NÄì¡Dr©Ÿ•G£æ-ÈÏÖÑCTU!¶ø®½q2ß,ßB᚟˜|ëí|²¢ì-<{Ù™ÜòÔ§”˜®SmAt“7Ãä RR\~|â.¸øNfmóð¶~ÃÍWObAL¢ù¤Ñ‡oqü v0!p‡X,FiáF¤t!#¸a`NUÓcY&–ëÙÓ /]B {’µõ¾þi=]ÌdÆSSùÅʦb{ †ýð€Vµ‚Ig÷á ] •QwÌñ!Ì?Œ‹ÏG= Û¥÷è1„ƒ([Â×<ÀüÛiœ¯ †PkX—B0¬u¼¯mÑ’ùOŒ¢õ "¹Æ•Æï|ÉýZñÏ/–`o»m=‹·¤qT—@ÜÂA)ô@ˆ“ºžÄ±OÀÙÃO%U˜ûas¤æ¶¤µö#‹Öl¡ùϰ é©œ“ÿÓ« ÆŠF0¨×L„¢ …ÑJç1}Qˆž¹ŽQ‘Q©0úHó÷70hÔXú7ÒØ¶àY>ßÒ‚¹6)’ÒUÓ¹ö¦7Y2®+ZP#»ãÉ\pVB¢Œ'òÛÄUW BߨœQ#nfóß3ixEíK9hÊÑ‘ÌV=9óŸý‰„uˆ2õŽ+ù~á:º5Hɤ˰“?¶êÈ_ÎÈS³QÓ1xÔ)œ4ª12¾–ÅÉ?ÐBatM€¨š ­Ó8Î=y()noV~z:o,3èÝ3LÜ÷õáÇ_'žç±yóf¶lÞŒ°JÈkÔ˶AJÂá0Ë×l/¯Bu,×ÙãG¤K(w7^W\:Œ)QA‹ƒÆ2$g>ž_—;x8ŸñWOáÔAYxžBVÃV-•4ìV@–¹qwßz/ÌÝ Š¤¢²>·œ¶'«m]ÎŒC]ë#îãé‹Z%–ªE€œ† é»ÃKÓY?‚zk¾£8»--g"d”_šÀ„Ç¿ Øð8Ô+hIÌSHÝOë_„²éSЂ) fPþÞRúÞô³g!¿fx±ñʹCþÅ%ýñÚ¨C9jÌwn’È/¹À%‚èºYÌüt&Gõ~³fi¤ã¡œfZHO¥i¯ž‹§J¤§’ß«]¢.2óHäѵc.ŠTÈl”-¢J ÒJ1ùÎÛxeæ$±X:çv! ¡ÂÔoÙÕs!”K½`”Ò¸$ÇU¨ß©©ÂÃ!êEà»*çï»(“âvJ·Ícú“/2ó¥Ûj,giC.ÁñÜš:Ùu-Ùá0军rÔˆ–\tÚQ|9`r8‡<}ÃlVº¸º[‹"4 Ò…ìÖÍhAQ =#é5iKó•²9OsÅ­O3wSU±(v¥Ô¤KAZ~2SH ‘Hžç`nø‘5´gBÇ <× ó€ƒè ¿Eq*Ç Ø÷v>¾¯7Nù6>¹÷Bλô5¾ž:ŒÂŠU¼Ý8>œ0Õ Ï!çØQ8dLK§Qóz(RþJY%ÒUÈ; éá©©4H±ù¾ÒõW©}ü¥¡Ô•ÆÓ4`0ȶmÛˆFã¸Äã¶í‰DÐ,˪Ùó¸Gâ(Ö’®ÇßÍ×s—°`ùzÞ½0—mF òR}kcµ´ì†ÍiÙ²­Z6#'¢$6É'µ•êóÊ”ÇØÚû ¾]°”Õ §sÎÁyx‰¤·Ië¢HØ+¤áÖ-} å4£ MÂ1¦ U324½`#Ò—òô7E¬™õ9 ;¤ašŽ»éMn}d%—¿ñË׬fÁS#°Œý;—'5:÷ïFìýÉÿäÎÖŒŸž›ÀO~†ÌBw+(545ùle‡£Ó^e,TBÆ®½ôiš^ù¿¬ZÃê¯ï¥M^hSЄg·D„Ò Hƒ¸—tq L¯.õDI©Gã&MhR0€Kn:õ›'™^¬£Ziÿ¯OX½:!ãUk×óÃ]# T; ýìOîòéÇOKÇ‘’`0HYy›‹¶SRVBɦ_(Zû=•›~À‹nÆ2ã†C(£1ªÜ£åRº&˾ù”ùk Ù4箾ô1r9nyÂԔ繸®‹ëzɬµã¯¹˜d5Χ~ªÊêÙòù×ëA‘ 7 I¤ŒU+JHË€Ÿ^|ŠåR¯S÷{;º¢Â"ŠŠŠ(*.¦ÒtqÔ|Ž?ºß>r//Îöè9¬Aé!Ý8žžI£ÆÙ¢‹yðž/põý<õ‹”({qþÅWsç½çÐTš¸;*Ÿ`J)U›Ø´Ý&#Åàû×^bƒAÛ>‡7?ü šöå„SÆÑ-»Š5e6=„ÝÎöŠ8B‘ä¶;”Œ•o1ù¹™l**fý’Ù¼?mÛLåW†Ì_/¯m»¤å5¦Af˜â_>â­w–‚¦ü–¦þwµƒgF©,/bùìw¸æò;)x.§¶ Ó²sÖ¾ûO²€¢’"–ÿ0wgΣJæÑ±©Í/³WJ ²øõç˜o«¨B%-EaûêDQМbf}ù9•|>æ$ŽÔŒ’m›°›Œæ˜VËxø¾×Ùs©Ú¼ï—V ¨ÿÉËY€ga¸: š7%¢•óé˲¡8¾÷ªrmDþHÍ[ÈKï­"-#ÌâWŸe¡+PëPÎÒŠRYQAEÑrÞ}ñ3JíÈÏ­ÏÐÞÍyÿî{xã‡Õl/ÙÊüïòîü-µX­?âøð‰ã>'Ž™™™ôêÕ› ¦±6Ð(¥Œ¶-Ò½Ïè9Ϥ4ìFý‚¡eϪCz ß¿‡±Ã0ü÷qS.L8ÚLJÄ6âØ®¬­ñlÃJ,ª¸úŒ?ã8J=…Ýúrñ?“Þ¦1Òuj=Æœ<__3„¶ãmm ­ˆb×A"u!Žeîs§Ò¿ï † Â!C¸ô¥ÍhŠ Ùãi¾è~ц0¤}Ï1QóÇqéaçöjC—CnÅØ@<¶ßn]pŒqÛÕ)t~G÷©çJÛÄ´]$®×–ñcÚòÀ¸Þtî{3ÓÓXQÁÌ'®fD÷N´íw:›û]È¥ÝÒÍ9¨_˜[ŽëN‡^ÿ¤°ÙÜ|Ë™¬šzz÷dèq—óɲJU`Çc˜n"4‹l#Žá$¥‹ãT[l<›xÜÆS#8fC~Ý·£}N…€´´T,ËúuÃg­¬ BéûIûðáÇ>|ì ªªÖ9yÜ÷Ǥ9^×õÝ'Æ21óôœ8®U‰mÅ „²›'Ó9ùðáÇ>|øø3àI9h›1ŒÒÕ¨nE ¢H £|Š&„r «)øÄч>|øðáãOƒ:gfR‚eD‘F1Ž!Cyl.uY»Í%”–¦J<×Aú~g>öa#¬mÙ—rç€þÖ£ÿ,#Ÿz®uð›–¼v½ämòwý5>|üíˆ#H¤ÄMm¥7&êYµÅ`S±tM<ׯuí½(=ŸKì‰Ü³#Ä~µy—w•{ÉŸVò×­ß•¸ Ÿº…[>Þš<¼Ó×sß{šG>[‚÷Wi?¿·ü„@ƒ·_ÌC?Æv“‘}§w«×}IÜ„À*›ÇƒwLfYLü&O_!$e˾áÁÇߦ(îýÏíBHó¦ñÐ ŸPîø­Ì‡Ÿ8îIQ(*¦#ªm Ïu‘ž ž…çZضEMÔêïD:1f>q)#ûv¥m«ƒx½°:3E‚ |ÿÈYôhÕ”öÇóêÒò¤³Í~R›BàÙÅÜÌALù¼$1Ø I|í,Î9ö<¾[WõÂÓìJ6ëÈ3Y$êñ“S e›6´nÕŠ‚N½9ö‚»™¹ÑM h¿³ÕkÛÓ™¾¼r߸lþåG¾]Yø×±$å÷ÅÙ½hÝ6!¿Ö{rÔÙ·1c­ýÿ”ŸÃÊÏßcÖFuV‘xVÏ\~$÷¼³G„çã§Ç9S÷BRòÓ{Ü ¬,µþgâæ›ùæóo)þM —-È(^Ã7ß/"fÿ>=¤|ËR¾™³ÓÏßìÇO÷øPEÁs]<×Å0 ,ÓÄum¤ká8ŽmáíÅ«ZJÂÍ8ùü£Hu⼚q“¢7Næ¨û‹¹þƒxþÔT®ssŒÄwûÝÑ#VVJ̪õÆ®EEYEMeéÙT–•PTTHIi%‰Ìn£¢”²˜IUiÛJÊ©*Ý^s¼µ¸|§ âû VÅv9•Ù?~Ç/Ld¨ö9ÿ8xÏÍ­Jaé-Od–©]v;^Ey4–ø®¨ˆÒÊx2[ŠÄŠ–SR\DaQ1e•ÆŽààBÔê+VAqQ¥å•ØžøKÆY³Ê Iñßÿ4‹O^yCÓgsÆð¾L™]Û^B¥½ƒ WnßN4É ]3FiI"cÏöŠxõ,¯†˜xfÅ%å˜~Àƒ}‰¢…h˜ŸÎÜÅË0\p­JV}¿€Us–²¹Òé²vÕe7i‡0:£ˆÊ–h=ã!žÊ>”Ñ…58ˆ;¯<…¦û>X(½¹Ù ÉÍnHA·!´™p Ÿ|‘Ñÿ:ëëG¸hÂë”S°bÐÿâ¸kl<}-gM«`Tûk×md ­˜0ñV†´Ðùbâ…L™[Žaê­¹è¡)Ùjç÷p¶þÄí—ßÈÅyõë£m@9æ/èœ%AOË#'«9Y huß4¨wWN~‚ûžÊÝ} Øú\)ÏõXÍDÓéë¹=%OÝ| oÍ/$ÒI)8„»oûGõL¼Í¼|ãÅ<¾®O½žni¾òÜWG”-ÚtaÛ++©0A‹®bÛ™‘­-æn«¢kN k~Y@«v’Z˹ú‘÷A!·v˜Ç)N`Ôü•tœr:g-jÀ1ÍmV®^ÏÖp/îø:ºf»|ñØ•ÜñÚ‚¹ iÚ2— ]GÕÀZþ×ÜøË+m<Ç&£÷Ù<|ëX¬YÏsÊu/ѪK;â•qZuH Üs*™vçù<½¸ á¤v⊇`D¾É«'ôâÎÜqŒÍÞ²e+)mq2/N9ƒ¼ØZ¦N¸ŠWT’™]̃Ñhˆ_ý>|øÄ±–:Ïó0M“’m›¨*/!œ’…ašX–‰Œ›Ø–e[Ø"‘ÊjJµ¦³óî:æ•DèÖ#'y"¾-u¦ÿ°FgìW•ªÆÖóÒ]§3çi)%^´ˆï‹r®¢á”ÎâáG¿cÜSqx>8›?⬓'ðå¨7ˆ¤G°‹[qåз—=Uë˜:Û )«­ÍR"… Í!GŸ¸†ÊÒEL¼pé×Íàµq­)u'ƒÇ_΀C?¦u$ˆ]•ñ7L¢kVœ¯:‹W¿YÊàæ=èsÖDF4n€,Ÿz§Þ9#ž:²Vk2ùüÅ'˜•{ ¯M=œŠy\ú‰,û«.›í"¿V£Æ¢LŸÍ¦J—pF&)5½^!%#“Õeþ[òâ¶¶<òüctª`{I%™‘¤„¬­¼|íµ|¨æ¥çO¥i½dvòñ;õ`ò[´!uËÛ¬¯r o˜Î¦ÌÑœ^°€gçqZ[—åóKiwV;)™„Õ*=53ƒ €@$ˆ]™Ç?‚P1÷ÿã4žŸ[D‡s˜üòJÎzò}Æu|9é8Ιۈ°(æKïÁ»ø-¦lläöac¸köhnŒè˜±,F]2‘£ÚgP4ëÎ_’ÌݤFvÑCݰó¦Œäºg0bÒ„Ò#(N—=t;9r!§w;“gWžÌ k^ãí-xè•ÛéÙÆ“ÿÃóÖPßàèÇOwÀó<6mÚĶ­[1Ê7’’žiÙ¸®‹°¦(ÆöŠªccñÿÈ;íZØh„T™$˜*¡€À1¬ý®R½@=Ǹ>xžÄÚ2mÎA*âËÿ͇ßÇgC[s)p‰ó9hS”°#iyøá ’ˆkKZÔB ©ÃÕ¤$1QÔ0š{í ¾.ëÈ#ǵFrœÄ¨ŒÇøtA”Ô0˜™‰fݤA6…å1¤P)Yø,'ñ,ËKm„4©×~ åÔ&Že,^]ÈA‡ aDEDÚÑ¿_?6þÕƒÐ'å'ÔÏÅqö²ýîbÉ/«é7ò:ä¥ äÔ˪šà‹[G|Ýv* uŸ4Ö"M[Ð<´‘ï·VúåWh<Å}ЏnÊ/TŒ®Ç¼âtNjßX½w=`K;ˆ‚@ -ó"|Wê_õõ0´SÂlÜç„ShùáGxÛæðåæB?ˆi"‘k9V¸–?n…~Ó­Ý›¤’kB‰”{gMæ˜Û_c]¥ƒtZZNŒáHš~09¢ s m3Ù²f!-zO›ú:*é7ê>úÜö}ª}øð‰ã(Š‚¦ilÚ¼‰€%%£^2›Œ$=- E `Škck‡Õé?ŽÉO½> õ(k -è*XSìP@î~W©RK¡u×Á š°§­Qyþ™Ÿ“KÕ’¦ÝOæ­/îÛA“V·×]ÐBµš„BÚÅ]gÜ(Û¸'+ŸÔHàWK ÔÊ9+H¡# ßæœ ßâØW¾ãÜ^Y0çRz_^kŸãŽ»Ñµäz¾HärVþØ*6Ì'–šKfºŽBí9™‡ãíøj·7öù}úR±tK7¥a‹HÍu>uÜGý©ÍèÑ4È›?.$2½ˆö“š¡µèKÞŠw™5/‹’´´Ë¯n¹µêTº8ÞŽÊQ»ô‰}¬íØß« Ò&kÆ£Kf0:´s™Öù9ª®î^éŠJlÝ‹\|ó,Î~õ'ÆuJ#:ó|üP§™c²²²hÛ¶‹çÍÆ«\G¦æ’‘Ö 1=ˆc¯'=· ;ŽF ÷2*š|ýÔÙÜöüm]ÏC§ÎŒ®ƒ¸ñ®ëzÃŒ;çjŽþˤÍÅ·qF‹Ú¢ÐyÄ+Êqmo'"VUQ…íÚhÙƒ¹áúc¹uÒi5%EÈïz(7ÜvvU9æÂiVUPaÔír­U¹Ÿ^¼€Ñs"˜¦G ¡ã¸¹b|Wn˜rM8•‘O§`VI޼÷AF§ÁO±•1»¦ì¶£Ò‹¢µk}Ý¥¼vùÉóu Z¦"ã•T¹*]Ž9ñó'péø1„St"‡p÷í'aV–Qnªt9ånn-»€ó?Û^xŒÃ›i¾öܧ&Gh9¨3î5±xÀ+tSœÃ†z\:a5¾>€D×LŽøç©L»í8Ž«€V-ƒ­J œxrG(%+VI•ah4‚sýœÉgÇ+y9„t•T»’J™Ë%“ïcÛU÷0öðI„ôpSN{èaz»&UÑxM”4Ï1©ªŠã¹’”6'pHÃó9û¸“iœ›CŠ›…Hö1³²œÊZ:%^QN•£ÐtÐXF艋Oúõ²Sˆê¨Ì=GaóáÃÇŸpr[ ×\ùOy×½÷QR\ô›ö1Y¦É’Å‹4tñXl§{4MãÝ·ßdÜI§Ôì‹r‡íÅ…U›HZj „P4Ê˶/^J½¦]Ñ‚©5ÖÅ]Ë ¥ÄŒn§¢:„”-HzF:ìX9åQ©è¤e¤ÒR ö—-YRzÄÊËáL"AHצ²Ò ”–Š®*HÏ!ZYAÜrA(餦èX¥ 2Ã*Õáyv× Ìòb*ªC M‘’’‚®&ÇSé­('f:(0iièŠÄŽG‰z2":B€«"NôˆŽ+§"j!”ÃPÈÈLÁ©,%ª¦‘ÑH„í© "f#4€ª@ DZ(ð—ÚÏg•—PníˆQ¥B¤¤¦Ö’ŸCUY1‚‘Â0P3²IÑÀ1£TVÆp$¨Á2ÒBXå¥Xá,2‚ 8q¶—Å ed ø¶¡}Î=“ÒÒJ¤žAvZ AØŒr¶GÂéÙ¤{Žñ,*Ë*0]A(5‚ŒÇÑ3³QãDE˜ÌH f"hh)d„4<;NEEG*è‘0X6áôtJ¢TÆL\ý/--Å1¨2=RS#¨<Û¤2î’šA‰ KEÌU'Q°L•ŒŒfùvŒ`&™!…D¨°2œHé:ØF”Š*)Tô (¤¦„Qü¦åÃÇ…W_|Ž£Ž9ÛÞÙØaÛOû€ÃŽƒëþçx¼BQ(ܺ…û&N,›úÌsÇ$OWÉÏ* Z§^ÕÕd²~ƒF»}Ÿ™•KfÖÀ=Þ³ë¹Pj¡Ô=?'É 7²ë=ûÑL@(¤dfï47ªNz¦^«qh¤fd³«CéÙ„jÝ·óqÝ ˜‘K½_›å•”ŒlRvù&N%³Ö=’†^«MäÔjáäKéiYÔ’ zJ¹)íú×3rþƒü4R³rwÔ}ÊÁhÁ²‚; œ™C¸æ‚0Ù¹a_K×Õ|^ ’•³óÊ‹Ê 7´Ë•ŠNzv­½Üád¥¤×ê‚`jÕ¿¦ÂdæÔªËHx§~³k?ÐÃdèµÊ‘¨õõ.}'’,c(£¶QˆÔÒMP*9{Sä>|øøÓbßÇäÆ˜„#ÌoP–;ͺ}øðáÇ>|ì ªZ÷{ñ÷9q”*+«iw≠ž”H×é"¤tâxž¢PÃÙø~›>|øðáÇ{'Žu½ªN–ª…ØyÙÙu,d¼Z@G.vÕF|øðáÃÇùUݳ¤:Ï©&%8fº½U‘(¡L¶Wl.ŠIËB×ðÌ„@ü6ác5B™Œ×(H8\ù#|ù`G@Èä`$ÿ×lQÉûƒ›üßχ8þ€d¼¡…qSÛc†Zb©9¬Ü&XSè"]ϵÅû'¡tM' ‡P“ÊHJ І ‡Ñ5•ýnŸdR)‚!4%9ØK@(èA¤úŸ˜¨HÔ`˜p¸ú/DP$òlÿžÄETÕcóO_òõš(ªúÿÖ””­ '<–ÿhb•”Ÿ¢ÿNòUsXóõÇ|¿ÙFS…?‘«“j” TBáÚõ¸ã/ ˆ}K¾„À³+Y8ë6Vzÿ»5C(xæ6f5›bKõ3ùðñ7ÀŒMQ82žÄ‰E‰E«p,< ϱq\k/Y;Ò5Y2ýÞ˜¾ˆ’h&Çß>A™WQ‰-û”Çßùš¥k*é|ô)œxÐ÷'=%Ò­àÝ;oC=ä2휊”kÛ/<ñâL†þã$ÚÔûO~Òr—ðE²n ¦Ãœ.äÉ_¢Ø–‹fÐºË ÆŒC‡lÃòâ÷!0šîðÓã·ðXßgÑ6Ãúoc‰ ÝäË»®eé8¿gË‘hÝkAÁ‚É—ñØÂ2,ËEèi´è4€£N8–.¹ñÿJ~‚€n0ãÎËøê¼Ù i®·|kѾ¯F•øÖϹúÊg)‹ÑB)„‹ª˜…c( ¸ü6Îì’‹+wÍߌI$ ž±…W&ÞC÷{Þæ¸tåœl*8• yøŽg9ïµA Ö-<¿š}øøKCù#*¥Ä±-<×Ų,\×Áóð,\ÇÄ±í½¦”žÅ–µÉh ñãç3Yg&²$E¡jõ"ÖÛÙ¤ÈÕü¸x#ŽÜßf·é™ü2s˶™5ËMn´ˆfþ@qÔ©±è¡0‘H„pHOZ¤@ †“[­Öq0 îãl!Eƒ-ß~Èm8ç&'Œì‰1ûaÆŽ=i«]TE h:¡p¢ì¡` ™n-Q.5$‰Ñõ A-Ç¡ ír é!B =! '¯OÈB(Ú.÷$,ŒZ(L(HX„"6Ïú˜ŸKtRRÃhŠà´r+š`Ûìiüìã¼ Îbüaý`Þãœ0æ^_梩 z8Œ®T[éz8L@$ÞMQ„ Y„‚!„U¡ê„ÃÁ+¿}¢ÑÓÚq̧pòé§2ÀüŽOW6gü§rêÙg2¢UZ0Q?BÊD›Gˆì²ÊRÝ"‘0!]Ýa!¯>%b•"=B׃D"aT!Ѓ!´dsÞÑç’ÏMö%  h‚¡äs™_‹Ád[Ò5`HGþv>|âø_’ÅÄŒ:¡ZLÓÀ¶m Óͤç"] Û±p]w¯JU ¤1üü»¸þ¬áÔ‹ì$æZõ½œ‰7^ÈðnõÁÛçµB((BA("ù¿@©¶JH¢…ïsá¨Þ´kÝ‚‡œÉë «§Ù¼~Bo\7™‹íFß³næÎC{2àºÉ\rh7ºŽ¿“•eÞ>]®L 8 i Oÿþ8z<·<÷17tXÁ3O½CE Ȳ©—0´w'Z¶lK¿1×1«ÐBSTs#Ï_sÚ´¡÷èÓ9÷'p⓳ð$l™ó*' îBA‹V 8æ¾Úê&Hž¢ao™Î¥#»Ò´åç”9“åŸ=ÆñƒºÐ¶MCÇ_Ï×Â)•LÔŒa×Nâä¡]hÓ²w.·™õÏž4j>œç¾_üƒ'+B@¤agúöëÇÐQÇs㳟roÿ-<3ù%ªÛ¹©[3ÎûQ!U\Źí;rû Tµ’YÏ\Ïðîm)hÛ‘áç>ÀÒí^’Ò a±à™ èÔç¾(UÑýÄÂû¨x¨‘<ú ;a£G~*Zv{Úé ~h>›×}Åiýš!ÄŸ íIOJ<ׯŒC—ãÇal˜Ç†R=!¨$%%JòØeÙ‡3áí".œú?ÿð%_8’œ@õzh”ož¾[¾Èäñ÷§0"ÇÃr}ÛÑ>cþ€ô<\ÏKN¸%ž'QÃ[f,aà¤/YñÍS¤}röá¹o±dæó´œ÷,Sf[ö,ÏÏmÎó߯`ÑOsÇøÎè^_<|3ÿZßg¿þO_À²§ïáÍ%%(BÁ*©@o?žÏ—­ãÍ“­N5ê9dw9§?™ÃÊ¥ßrSûo9ÿúX!=¤ð«%ôºýcV-þˆ%óÒ¼m¸eóxàÎ×tëû,˜ùí¼È|[ÇŸkøðñ÷@íqLÆââb¶o/Á¬ØBzF6¦I—l,ŠQV©ƒmcº.©þ¢ÆÿžEéÖu¬Ž„A‚S¶…¨¨:æêw™¶¸”‚—ï`á˃-%›X´&JªãÒô¸ó”c‹[x–CþØó”cRw{(©Co÷¤u:ÎA7·`Z-[i<:é2îÞb0‹±–|ÅÆØPæü²…'M‡¬ JvFïÇ4¡b­yŸŸe_¦ׇTÍæK®â¥naöºË‰Ø ú'ÇwÎÄaiÆ1oÌcíI3˜³|-ñû¯â]<ܪm,ŽFÙRj!=AûcO¥](F̨$î‚+LjÊäÇ?Ñ蘔ŸªGÈ™aíÅ’ïTñóœEt;þFv¬’Öí2уåE0ÿ…ëy¼Q{n˜x1ÝÓ= WúNu?À³lêy&£ò%UÛV2}Ñ¢å1î¼t&ž€â‹XûÕZ®=£¹÷óØý“9øÀáŒÚƒÈöù|¾ Œc/>‘.¹!DýŒíõ:oÌÙÂÉ-ÁÆ Ü«ÂBÔL€<"/ßå‘;/bI±ƒ‹b¯ýš-îh°mòFÌðÆ.U2ƒÎ-³ys›‰žÆºô¡\3¼Åãø+Ïâs¾ðóPûðáÇÿNé)Šqÿ&F IDAT‚뺬_¿žˆ“žUǶB™‘ÉO!3P<Óµž¿…úÿÍõúq6ÈÁs%ÆÚY,_ø-!­ù`®¹{½8žLì]Ë®¯ñž+ˆdêxއT$R*¤dñ\¯Ö .ÇÊA‰—mÀJÍ"+ð ×} ã'qã…±åIFž¹Çu±Iš®àz¡z ªÈx92FŠæ%¼õ• Ò.†é‘‚”œ8.®PHÉáE£Ä«ª(t,®KªLì UêåºÌF%”@z©þÉýö¥D«l±P*©mçJ¬.¼çaÙY‘®ë¡®‹” B.·UÖƒxRî_9<ÿLÕé "A\W¢8UAÆ\r ãÚd×8Ë¨á ‚xàÙ|f|2W¯?†»óÎä­©#q¤JvXà¸E¨¤†tŒ¸h¨ MWÈd» 4‚öÏ\2þJÔ³fÂȤ¬}Ã..Ç‘€è)*ž+ŠD¯D 5"¬yx¶Œ4$]ñ÷7úðñwA:Ç(ŠBQQåÄãQŠ‹ )-)Ĉ–"=˶0 ×ÝûØ”ØÔï%ÉŒ¬µ¤Rz¸®WžÇóKvû#„¢ (*ªª (JBžžC¨Ù2¢ËXQ¬‘•CvV)!=éØñgá;‰ºs]‡xå&>{á}ZvéO^ìg~,iÅ™gޤ Iö†µ”; ôTçF˜·l3–çáÆJX·~1×%д/Ù±¥Ì[E(‚ªU_ò‹Õ˜ ƒ(¬ûê' ]ên燷P¿[kåw¢lÓÊݲsrÈÊL'  ìÖ[Tt ÓF&ÙØŸbx¬‘Ÿ‹ÛÊgS_%¯ã@ò3S¨Ÿ!(ÝZª†]²Šµ•J LãÆõ™»p%•¦Òömõ_Ì-%5+›œœl2RSUpÒò»2þ’»yë£Gh²èE>,Ì¥ ž`æÜÍ8RâUmfÞºr ZeQ³»b× U4ä–Ù̯jÏi§ §uãl̵«¨ð~%Ê‚çlÚƒHt5ëK]TM¥bål69*Š?ßðá÷8þ·d 33“ììl¶nZCýÒ „¼JTÒ…BvЇeCÙÔo15aöé°læ3|øål*ß§OÇ“¦RØÆãç–ãšÍpÔ FŒÉ¿o~„[*“ÏV¾š_N¸—‡ZÿÎù&OM¸– =³Yøñ§t8ù~溼kJ”’w¹ëî"ÙËù`M ®¼¾R³8²ÑUÜwË-ôë’]Z„Õ¨'ç6Lj“Xñ•¸2•Î xüÕx¨¢;ƒ>ˆöyéèjµk™lþùU¦<ôU¥%lXò#k"‡sÓùGñ|âÞ˜zSíx+¦³!Ã&Ì QÇòÞU÷sÝk蚡ܫϸ“Æ1â¤rÜU÷²îÒ 9ï¸÷úi“®øKû¼?€gÄMx¶‰‘TdŽZŸqgŒçÛëîæÒ¢Áti¤hõžx cݸùÕJ êcn˜M¬óhú4©O£q‡ñá­wqÃÖ!ä”Îg¶ìÁ]½âxeX¦Iu4)‰‡e¸Ž -†2¢ÕÛ<ñÀÓlhfðÝëv‰½æf­•!×21l‹pãQÙùcžðQ6vËdÉßa*yxRðÇÆðáÃÇïÝ\ÝèóðÅ~Ó>&×u)**¤Yó5Kϵ-ŒK—,¡mû¸®K  Q£Fdf¦Ó8/‹†ùmÉkÞ…¼æÝÈnÐ]ƒ¬ e4¡:ËÀne£²ˆJµ9>‚¶9i¤×Ë£y³¦Dœ6WhtÌ€®­ÉLK§qA;†Åþ£¬„F½æ´ëØšœ”Dõ*ò[Pк ]§yïatlÁC#-·)=ú¤ /ÌF-éÔ±€ü פ5jI§ŽmÈÏÐê$p¸ô µImZ×#I#;¯½FÏ™'E«4‹\z ìB$VJL­Ï1‡3°W7Ú¶È#«q;õh°r[v$Ó-ÆÍïÁAíóiÕg­³T\5ƒn‡ŸÎ)Gt!hÛDê7£ÿ1'Ð3µŠxJkŽ>ý4†äGzô@³ O ’ݸ€>}zÐ8#…ìfmèÔ± S® ¹ô¥u¦‡%#4iÑŒìý[É•ž$¥QíÛÔ#N%«~Sºxgžzí³<,Ë#³ýº4ô(­”40šÃõ¦S»4ÈkJß¾]HWzÿ]ŽLò¬Ú°m‹§}ÀaGŒù•Œ|µ˜•¢P¸u ÷MœX6õ™çŽIž®*’ŸU@tß/U'ƒs×V>{R‰sÊ.Ç¿ý!b/ƒXíçþý­b§ÿw}ï_“QÍbò-v'ãûªìâW& {o3‰öPã|óÄ\1w+Z$Ÿ±W߯¨ àî¹­ˆZÇ»”aO¯û«2Ú©<â«ûÿV~ÔôGe÷w;Ë¥öûîW}êëÌ;µQ¥fƒà¯õG±×¶+~K{Ýõº½èDŸÛ[yÄn{ůµ3>|üª¿îWT÷9qT„ %Hd/ójž‹.Ò³ñ\¡¨¨zŠß"|üvd câëß0Ñ—„>|øØŸPÇNÀûœ8îéu\ÇÆŽmG¸U tpb[q,Eš(¡,B û ?Û€>|øðáÃÇŸuž«ZV¼»d>vÕ<Ï¥¢¬ˆÂ-[„DáVúï}øðáÇ>öw∔¸RÅ 5Ç à„š°ª8ÄÊm¤“X®völ«Üó¹Äæï½=n?¢ ¿ö®¿"£?KÙ­®þظǨ¢¬ÊHĘt,*Ê+°ÿLi÷v‘_myyn¢¼‰4±²íDí„c„QVB¹áÛÿ3wãÝ÷e_p¨(ÙNÜýû ù7ë)q¬å•1öY—ßE?ûqR}ü™¡ýªŽ«çây.VE9%%Ÿñ(H ϵ±=‹Ð;µ@z…+~fîÒÍDí0ÝG¤EÀ£lýæ.\ÎÖ ›Hn ú îEýà/Ù¿=„@z¿L…e2áùˆ ³Q7Üeñ§ò6O:clšù.ßnµpke«Éï4šêä(Ãòoâô¹]ùròIXkgqåÍoqö¤‡è‘§þ©ä·eÖ{,LÌÁ]2k¾Šmú‰k¯~šñ“žd@£"î;¸ö}+¹m°àÕ#ÚðòËøô”\_þiº±Ä,^Ç·‹JéÙ¿ iºF13g|G°Óz7K߇O_À©ŽfÈk¹¤Ùß[W  dî ¾^S‚i%ôtm²zŒad»Ô._ù忸ìå8ÿÇÞy†IUd ø½¡ãä!ç,IrP¢¢ @Ä€¬ ¢bBQLkuÍ‚ Ã" PQr’s“§§»o¬ïGÏÀ Iv?Y§Þçégznß¾]¹N:uλo?Fÿ™JËÞ…³X_æ<.¨#mü%g/ê_Óg,#ŠkÛ8ŽsÄ5ˆkâØ–ežÐçpÂ,ýv<_OyŸ»>Àì¬ÂOòá3cxÚï¬]·‚Ic†sýˆ/È-wµTh+œ¾xøvÞ¶’­[·°eËvíÏ=\ÑÅM*'Qm½"%¢½]4j ÃßšÇöÛØ²e [¶låPX=*Åþ=® wRåëI>9Ñgš7@b0&¼ÆWodz/=Aã²'öexR-ø,¿åÏßÌ}v»¬Ô‚'_MËò±S´þÄdKF_B2ñ^å¤i—Ú’'oý/üóñØr0_==”Ç'Î%윚Æêèú<ñwŽþÌG|r>õÄ¿ówbã¸û¹yÔlßo6oÚÌîû¡.. >.pÊ>NÜÿÅI§ã5o>Èã¿:¾ôwe÷‘üÝGEQPUÛ¶°m›h4ŠaY¸®…°M,Ûıíö E§Û]¯òÎ蛩[>ýpONcð oòοÆðÄ“£™øZNÇÏÙ@©ò6§ 'U¥ÛµwóÐÃ1räƒ ¾º«ÞÉu£ßbTÿó©ßî Þÿü[F\Ó‘:uêи}?Æÿ¾GQpóWpOï¾L;sÅáæþÎàËn`NNɸ`ÑýqÔî4„‘<ÄÈ‘#9òA.KÛÄ£ƒnà›Õ‡ ü F™õʽ xó7\Åä×Ѷi]jÔlB¿GÿM ŠbòÝ]½èûÖ×ÁŒ¡]y9»7ß,[Ïw5à…˯æû|o‘ÆVh3h9›Ö²f_E>Yº™E£*ñÊ-ÃÙ ¬yñ:nþ© ¯ÿ¼’ocþc·ñî¦p‰›Ç$/'÷„a7…P¹-Õ•¼½ #vq×\¾ÙGÿ¶e9K"p—6ÑŸ–ÍC:2l~{>üz4ÍÊhú¡/{N_>úi)Ëf¿F…îàÎ÷wV$“ã¾å’V°ã—{™÷ð|“Šë¡i¯‘ü´`9?M¸õã†3q~øëz3¿öÃ,]ú)5f¾Ìa ‘h—Üÿ.‹—-æÃ»êñú/².Ýü›-"„•Gv¸`¼Éˆ—™«§óÀ³3¹öõYðÉ v¼7†MŠ œ¹_>ÿ‰>oÏâ£ë¢ÜÛãRûÚÇ«ßÏâ6ÿd®{l!>~œ!ïeòÈ”ßùþÌ~ò&-=8üc%kóê3eùf~ûg2/Þò¡î÷óxçZœóävl]Á wtâ—½¸wn}>˜¿˜oNãák†³(O a²iêtö·Áò [Ûq+/ÿë²Hg™’¿à(„ 77—;w²eÝ "¹†I4Ŷ-ög†…ÂX–‰iØÿÕD%„ˆÅBÍ]Çè13hvÇÎóñ·Û^ùS­Sd_¼x;ýû_Ï€nâí…a<®AbŸG¸»eÌv'­ukêÓ™=ó{6äÅQÎÙˆYgEú7OÉ5ý®cÀ€ë0àV¾NO¢gdž¬þnYB!{×:6æU¦míJ(øizq²–ÿÄŒ¹{©Ûµ1™³§BE˜QªÜ4šË*©méQ#›"ì_;·U®¿ 6)Õ:1ü©›H1´ƒÓyvšBçÎi¬üñ;VÙ 8?~ü”‹ÇsâÁXO©L«¯%H¹h-•5¬Ù¹‘·¦ïãüîõØ;ï{ælWh™¶‹w¦í> (ÏÀ~u˜õútò5sb5éFËd©q,ù‘Ùƒ¶c Ï}žÍ cŸàÜBeš7‰¦Ïaׂïùaq&õ;ÖåÀï³1Ñ–IíÏÒ) ¨z1=+ìãûžJµi\ÓÇ⟾cÞf‡šÕ}lß´ ü›÷W×ç‘çúQ!¹&C_½—š®í@b«¶ÔÕ÷2kæl3“IÍßÊúŒ¼¿—بûˆ.͵}¯ãú×sÍU×3nƒÁ®Õ?è|#×wªI™:=¸ïŸ×5 ÕÁ´8šKTæüÛsNd­NÓ*uzggBó'—lfÎYËE<Ê +Pãü븭g_ÍÛ €§\M.ïÛ‡8 ÜEChì®fuXŽÀ5#±ß‰,ä­£ÜýÞ(ÚV*K«›¤¹¼6/¯êlq/l@½®}P27“‘]Græ)±Ã1Š¢——ÇÆQŒ Ò*TÅ*ˆm””Ä® £¹6ÂýÏNz†@CàÍîcS½yé–¡ÓJ×Äçª2àž Üß# á‚ϯ±h¤V‰/0f°pÂ(žþ>‡ ;· bÀE¸¦ë  Š JI[3(Ô»òU¾{ºfÔ<~Ð:t¡úÏòÍÞ»i·j:nÍÖÔ¨àA„Wñø »9иVBÁ‹jçaÂUI,ç;¢Áц FÎAâÚRxÜFK®MŠ~;cJ©º‰éØ8¹ >ýÕZxˆÎ9ñâCÕu|q]É.øœCdX*Õ}Q[ű É­ÏÒ±aÚYÛn*ôH³'‡óÑ–«ð-ûƒóºö#¨))8–4®…Q¥/¯ßª0f`*OøœÁm’Q€è¡y<|듸­® Mír˜xÁÎÇAA„"m>àq‰Ú.‹?åÞ1?Ò°Sj•õâáØØ;ÈT£VáW’RÝ#PTÁ¢wç‰_ºw>— ^Óù{À¶¿ý¦Ø+j#PÐ=:ó~É ljjl‚_™ú$kfAN䊇W>O9*'üë÷ Ú,%7êR'Í{xªMKN&/3Œ hž`Ax]GÁ«¹X.;Î K$Óèð‘DÍ2:‹ö‡¡†Š?Á‹¢ì͹±CU®ÜüGˆÅT<°?AA¢e`D²QǶ‰í.›Ø¶‰‰ñç¹U•X<å#‚)ä0þ¦|pŸ>~i*€(X©—¢©OQñxýø¼…³}X±$Å<ÈÏ¿þA×!ÏqO—º(9ëXøå×8. ù j¦YðÕü]Š”léiÞ*:~‘æ™ØŽMsyöãŨë—Sï²GHUÀÜ:…ßœÃø)wQHŸô!ÏÙEâ5‹"o 46qåj=g/!â4ï]Æ»2žŠ©âÂmz%×4,6‹³þOüpq„ƒ@ %U¦²&½Úe\Ó=ù¸‹œ3V¦Ç„‰;ÅïùÎçÁ^ƒûö"Ž«›Õ‹™}Hþ ‘‡xZÝð ŸWIß×SæËI\Ù0ÐÆ©l ï=vU€-ï¾ÃÇ•¢ ¬X»T\‹õKæPöük~×åÄEYò‹l½bcÊZ¿³9u@ö:v˜ zdßÿ¼‰Kï};ZWŒ¥üøñw8ÃrVt?:ÚáñÆ%®\5rveu! *„Ó7‘íÔ<Üg* PÌuO¬Ï%P.ÑËüí¹Ð ̶ý)wNÚ ê ˆ™_vØäªTñ¤óÛV“K[x½¬ØëP·v"8'wC'‘œIJT”””„ª©ì9EFÆ>¢WÙóJæBâ¦Å>*Öïˆ×Í¢ÃÁ­Køýçäš¹¬ûíW-_A˜I7wâE¸ùÚº¬ÿu?ÍšÇîhé‹«+„{ì€Rô¥7‘•‚Ì›·Žƒé‡˜?íCfÎÍDU]_MZÕ¶™;ué™Û˜øÏ—Ùîó—XC®KÖÖùü6ïW~ž=›Ù³få®à¡Çà ØÿÖ­¼¶¹t«[ùThNš½‘ù+2ÉÙ6ƒž[EÀ¯ÜÝ£} Aµ¦—Snó×¼öñlVÌýœçŸ†á×0Sº2æŽ*L¸á|üóR–/ø7}o¨øTŽñ“Xì}ÑSÈ®ƒ¨Á·Çoîaì”y¬Zö;G=Ì{kÃgø°‰ wÇB~Ÿ7'V~³~a]6¨Eì…ëy/Übf!­îŠ2õ)v”í@Óš>9BþuẸB¥þ•/òΰ4¹uswEðUlŠ7g=+Ög“¾þ+~q}‘6_¼ï W ´JUÙ±~»ög±å·wyó³Ýxu 7¥÷\˜É›£¾ãPþ~&?ý6;5Õ—BíŠ~ýméøeÊGüº$»dâÖ—ðhî_Êoó ûËOÌߢAëžxÖÎ`æâíÚµˆO_ÿ’<Ÿ§@®,^ÆnÑݱ‚1Æ%ŽÞ—žÇšý“·¾_į“^çƒßnìX/¶€/vúY „‹ ÔªW–½ßOeÅÖmd˜u¹w@m>r_Î[Ê¿Ÿy’Ÿô‹¹¯Mmjdóù;ï2}•Îu#z/*Ñ¡cCÌý;qëv SÍ8À%gï>M;Ó¶N-Ú·(ÇÜÉ3c• ã5ÉÝaÑíâŽ4èÚŸ6ñùæËÉÌZ¼ÿ9ݸ¬S}üyéd«Ñ¡I°ÃdæA£–ÍIõY¤ïN§r» ©“¬€08°;‡Zí»Ò°uO.kå§/'ñÝï«—iÎåÝšSÎæ|?†÷mgwú-ˆ•ß²¥‹0›\Â9~‡º-ZQ6à’µ{e[w£A•ÜÝÛÑš^Lûª•›X™Ý_F™cèÓ0¡9A=»p"yŠh{^¼:ÕZv¡ZÎ<¦mI¢{÷œ›¸Þ›À¬õ‰ у½mÛÔ&¼gZ“ 9¿špÈܵ—¤¶ÝéÞºÁí³xÿÓ)¬Ê¬AßA¨\¡>õk–§qîDæ¼Ï;ŸÌ!îÒ!t ªÔêÖ“^ë±æÆOC¤l ÎïØ˜F-ZP5ñï³ ˆfì#=s-óç-Žõ—% ØèiOŸ ZÒºŽË¿ß{Ÿ™ öШß`š”K£å¹µÈßµ‹¤Ö=hQ^f÷N“æÝ;SÉD²-TnœC™ºíé\#—o?ú‚»4þñè“\qn9LÒ÷fQ½]j&*àÜ¢N»N4=ï\ô5_óáW¿Ôá²›†ÐÖ¿†I}Ã&­ ÿk$ÍRs'¯ÝÖŸ¥µŸà­‡»á?nþOV*ß¾:œFQà:èøy9íåø'åw¼&r¼÷y‹ž¡ûർ¸àSÚ¤ÜxtãS7m(Ònó'lÁ'¬à“´ù¿C›øÓñæÏ‹åØþ^äy…¶õÊÉ˵øXp{üãVÃQ‹%¶Íw’ÃLúx½ûöò¬b×-Ëdæôi\zEÇþsÁQU9¸/Œ›ýÞø } õ9@nÁ߯w •£¤Ù˜&R+&4hš~Xh„ÓÙðKÑVõ1¶mJl`+^ '-å¯*Ç?K×ÑgÁý'üJ‘޾OuCÌyï.šÔªAÍºÝø!®?ÜÝÀ ó¯œrûVЕ׉óRÒåw¼&Rü}6ïÜrMzN‡§^¤}à¸MJRòÝøÔMŽrî_¬~OõÇN¥Í+B>ùxsŠe|¢ññ„c“r’±à8õ| ÏàègÈN+9Üq¥¶ë òòBX–ybM *(\L)Š&kGr†ðÒkä—ô{LCAàX&†‘A¦Qz\!ú¿ò%7½V4BFF¦%‰ä,GÓ´_,”ˆ5DLñUD=ïº'Š"LT*Âȵ"à Ç£$ÕG(ªt"9#8–A¤¨V¿”·5EÛŒb›±eœªÊ6"‘H$gÿØ]ò3W‰›Ñ À6òðD6ãѽhÁ2Xá,"Y»II-ƒfgu-L!¤ÆC"‘H$‰ä,¢äõ Bà¢"|å°‚µq5Øš`Óþ˜#Â9%#N‰D"‘ügc¯àñðªG»„9õg€‚×ïGSŠ»¥*z‹¢êø¼ž‚Ãyß²Ô|~üºòß•¥D"ÇSG÷!®6~rrrÙ»ÿ 9¹!„kà:Žm¤¿ ÌHÙ™™ddd-rÂ܉†ÈÎÌ ==Œ¬"ÁyE)òo%„K8;ôŒ 2 ^ٹܢã~‘²<Û0s3céN/L:y†+{ê)Õ}¬>…cÊÉ"##ôŒLròÂXŘKÇÁgyMâZ¹™é‡ûpzz&ùÑÂP¬ÿeý)>o:£Û×ä¾_Müžã›gœtŒPTìÐ&F^~ _l°QÕcŸ (‚Ýs> Ï §ÙrÏj+”SP¾é¤gd‘±be|ÒEÁt˜yóy\øö‚~MšUIJ ‰Ç'×u1Í0ªª‚èªs äZ8¶‰e{Ð…‹r¬›I„â×qòî«X°ÈäÙÕK¸¥’‹íÑØ<ñ9›¶–ˆåbæT»x£ï»”T…R²Tv:¯^Ú˜Ï=í©“æE P½å@ž}ê*’-GÕÑp±,ÍãAS.–ib;.(^ŸÇŒb»±CJ^ŸÛˆâœQ7 ž8˜zeSnßÞ”öuãc¶°Báüû&òX·"‘(Žss£{¼èØ–‹êõâÕ4\ÛÄ´lÜÒæ’BPtTk7Sßy™goÄR5:‰jЭïô»°1¯͵šÅ60læõâÑTáb™F© ê¼µX¹ªxý>×FÑ<¨ùŽ"cZŸ.²–Maà'±kžCœ®`ŠTúÝùz4ÁçXMGq,LWÅëÑPáÚ˜¦…オéxtЦ©àÚ˜¦ƒ¼ ^­à¢î…ÈŒš(ºâ⌦a‚LJ×sä™i»¨þò\3ü~’*ªò•‚^ІÛŒ h:>ŸÇG  I›8kú¥'¨³èÞ˸rV'‘Ÿ•ŽUõbž;‚viTU…ñ³- ³ ¡Ï.l„êAÃäÜ[þÉC)e0,¯×{dLµLìØ *´D ާÛ²Ð4 Ã0ˆšŠc!œXÈAÇö¡Ÿ@ÔS4?Íz çÕîK¹ùú x t¦ŽåPá›yþ’Ê&ú±¶~ÅÕ׼ķý/eH(=J+O¹†üãÖ·va\G {5v~ó.ïF+PeÓ÷ÌÜOßÞ=Ø·ðkæmÌÀ—R~ƒÑ¡nYDd ïŽL“Á#h•"°Ãkyý¹Yt¼óní3*€ !ðƧЬßX&=\3‹U­‡x÷…¨ù 4¯œ€¦Z¬š6‘ŸhÅ=ê±vòŒÿi5Yaç\t#ôÅo˜¸”ž@“BQðø]½x7OÿP‹Ñ¯¿Eë*)èn”ƒ»¶‘åøÑ=fÉŠÆ=ÐgO`mÕ¼r÷y,ø<g¯ÃJiÈ5wÞÍEÕ<8šÊÁ¥ßðö„iìˆè4¹ø]Ñžõ “Ÿ~‰ô†íØ÷ó·ìpkqíðûé^Cð¥ÓÇÓÖ‹UOÞ<÷æCÔJò P Ä æŽ}…õ»“8gKÓ.çþÖ&_Lÿ…MLÒι€awô¥ª_!ýŸ™¼â•Â[˜±h+I.áö[®¢Vò‘úñøî%žœîá®§ÃôqLUjQuíTf(ÃРâ†ycÒ/$™ó¯º•ë‚aÓŠåT­ÙŽ* ª’Ǭq¯òïù[0Ué>ä~:è*ŸÅÊ/_`ÌoëIht1Co¾’jqgÏ"^ºÏK¹ÎòÙ;0÷¯à±kñìä+SáÞ™±šì¨ŸÆÝoâöþmˆsó™ÿÆhæÔèJÙy±0îxï}~ÛœžP+þ1ˆ‹šUB•ê}ÉߌÛª>ìvGQp›p8„eYضkÇ‚ ÇÀ2 lÛ>aWWTiµÎ¡fÅdô"Û$ÂÄW®Aµ åIKMÄÎÜGV° SUœÒÖo`B ©©©¤¦¦’PÉÙ±šzšMnfÌcwPWdã«Õ™¡Ã†Ñ³N./<õ:Ó-°³Yúëo쉪(Š Ö!þ2ŸC–Zb2H"59µ ýÉ$$ø ï\ÂWËvƆûÈ!f}ÿÂçEÁ&çt¹övî¾åBö}pÃ?Úׯ¡”¢zWOh)o|¼Žó{œž +Œ#%­" ZžO» jÛæ~LJc?¡ÆÏðäMíYÿb†kÓûöá\×äôÎ<ÃGxùWÜýÔ—”»ð†ÝÔ“Ý“Ÿç­ïWãaå·“ø|Æz=ðgÜäyDE¬Ž4ÆþÆrÕ£ó9oàÕÔ‹³HߺŒ|ší-‡òÜc·QvÑKÜ4vúåö¾Í˜ýÒ£Lú㊓ˊ_~fG.x|‚ßž¼ŠÇ¦æÓó–»¹ù’zDÒóQtŒYŸòåžò\7¨þeãxó‹ßˆœ…K9EÕÑ=«6 YåxnO''ÇC·þ·s÷ÀÎì7”‘ŸíÅTØ·âÆ?üÊe0ꎞث~ä§ÍùxÉâË×_âg« ·Ýs/7ôlNœ)}sDjOïĦF …òÈ:¸ ]ÓP” D¢Q¢†A$'L8âôLLÇ&xÜUZQ¯üÇ>ÍÏþ×Óñö¹o¿5ž6~[œ,Âß°RC›xqH;ÞÒcƒâe/ÌâzÍÄÓa÷]RݤvêFåü¡¨E­žW2Ù›¬Ý—EÝÇnñ–ÜÖRÌ”~å¸K©>¾P'È]ÓpI›Z üq‘Ë"öoeCz*7Ö©øiwÓ`òrCØj}î¿ÿ{n|*o¸ƒdÅ(=늊›¾žmvyn®›„|>ã‚ËF±#”O™óoâ“wïEU/ÉUmj dýÌs¹éß÷Ð6%Šh8œ¿ìθÙ{è¿m.e/¾–>íê¡©‚k.YÎèEkˆ^|Z\ û ¤Y•T”k‡Ñèíá,ØãP»¸Òõ4U§—¸éÞêߨ hÕÚòò¸—P\‹´Ëá†óªÉ·){íÍTÏÍ%âhÜpûe|qûL6Z’(l¼Ízsks)¯Ðñ‚ŽŒ]´‰°U„ËÞ…ŸpǬ… {ÿM®®ëÚ+Š·ó½ ïQOt?ŸÌXE»¡#¹¬Y\­:7¶›Í+¿ì ÿ ¤˜ókÕƒž11_FòÃKô©ju›s»æ™ˆš—óÈÐ~ÔMÖ(›¿gg¯'dvÄï=«Jaæ’‘qˆÌ%_1am„ƒ›Ð¡C+fäakõ~ï ýü;ÒÝŽAbÏGÜ©:®càÕ ìD(™¹& .hBíjÕð×o€OWqGjá%Rpü¯;§:tˆÛ·£;ÙT¬R˲P€„„xví°ÈÊÍGwl Çæ¿²þv¢¤u}¥ËÂXöC‡ßIå¯'3¨†Ji:_ak2xÔ‡ÜÚ5áB0)Ž5oA¹ºeÑ¢8ìš;‰Qã¾#ÇõçµØ°&‡ú¶}X¸Ž ‹%½õïϹî¾Q3êÁ$AÐÓ–¤7?cnvjoü•PÅFT¯˜Ö.&=3’¯Ö;$%Qó7£Ø51EésD¨øâðºQr âZDÓ®àËŸ/a÷Òwxh|(¦Å:åë•EqœƒÙ+òùa̽Ìw Þš]héË#={Ìû€‡ÄâÎ×jתû– ‚+pñï1 [r0=­=ÁµWêËG/ßO$Šæ%µ¬Â§ŽFÅi(–‹®›,xÿIž›¾@\ ûI?T†|G!I($¤%>¼¢«®³ývˆï?|—KoEïzI˜¶ƒ®ë¨”¯Ÿ†j D$›ÌèA–O|ŽûþíEs4ÜôÂváЬêXûVsÈS—–U5LÛÁ- å ©J*^MÁ.ºæCÅÄ9ÛÆa͇±üß”€ªÅqÞoð`›<Þ{ø¦l$% o3Ч!–« •Šç¤¡XE‡á+O¯~=óÊhîü¶•«6¢×u×Ъf2Ò%ªD Žÿ¥@ i‡p°‡p^>Šª¢itMÇ2-lÛÄp"' È­¨º[驚†¦ŽÀë÷‚ǃ/˜Bµ>èüÔ»Ì\fHí ·4í[j“IMMÁuªV`›X yÕ¬C|óÅ Ê÷y€×¯lM¢µ‡†ÜÔ *pІæäk–¬¶Ö—JZ¹4̈\ÛA­Úž>UÇòþŒmܰfÕ›½D¹ Ž½ößLüÅ˳ßçüJñä}{5¼X Õ^® åÚraÅCÌœ¼Œ{Ÿhž!192©ñh"¯Hwá¢&U ÁÔé1êsî©maZ {=ˆÜ]|0?‘Z½‡òÑ] ª{Pmƒü𖂆$Ž< 䡘3±ˆÒc[Õ©Izì`†FPàFGÕñd-`ìë˸üó) iRßæ7iÞgv±øÔÅeÃÇ%· C™ó¯5ªÇV ÀÅa·2Š7ˆßõÓhð ¼Ý§&¦%Ð<^#DÆ¡õ7;è©5ˆ7g³%K¥eª†p5tÅ:^ ugޝõãLz«ÂÖ øýä®Åg ýÍ8ÚVŒ#kr_.}Ç-Hû‘“–E³âº5»ÜÈÍ/fó–-ÌŸ>žWß¿žDšGªá%/JÔÆ1..ŽH4Âî™Ì8HÎÞdn™Md÷Ï¿#Á4‰¢y'xŽK(s›·îÃp íØÆö½ äÓ7>`úüUlܰœOŸy„¯öT窖 G¹")“Žp]\WÄ&qÔ8®y‰ó)ìÍ| kùœ?ïEUøªR/5›ÕK·á ä3ã¹Ù¨û)ÉÑŒlÚ¸‰M›6±iÓöåZؤqÅõÍXÿÖƒ¼³*ö]¢;j|Yþ1+·ìdëÚyLùì;©zq“ׯ.s÷_îðâ€Û™ºbû¶¯dÒóóåžxºuíÀŽ÷Ÿä¹¯³wßNLù€w~\uXÀ”P­º.®ÅÝâĤG2Ijˆ9±—‰ï|Ëlã”–åš]É wgƈ¼°Ä$èU‹ý®ã«ÂÕ—4âLJîâ•ïײïVfMx™q‹ösØ´Ü5q+^Áçbì=£Yº7›=«äëyéhºú? 5Æòª¨¼^*†aB\Y4+—|7€~h6>9Ýï9y‘ùaÊDæl S®Z5’”¶ëÊ]j‰ÿ_ ×%))‰Î»P¾L*iž,jWðѬEkÚ_<€¶ôEÕƒ$ÖìH™íQåø~ƒß>Ä…ÿx¼`”†öaÀƒcYg$‘]Á«÷ýƒ¾ýnâ…Ÿàá/'зœÀ(5‚£E%˜”LÀ«[òëx’‚±ÁÏÖÊò;o¥Ìw÷Ó²M'ž˜žKÛ^íj ¨I\9â¶½~Mš_ÍÒ–wÒ­œ?6Yˆ3œvÞ„dýø ½.¿’~ýúѯßU<>ùº*(Ûu”}xk^ÎyÕu\ÇD«Ø'n­ÄÓÝмïû4ºó*ªÄyPJÙIFpmƒà¹w3uú3”Yù.ƒ¯¾‚+ÿñó´ž¼:æAêüI)$x„p1 ncgðÜEüóê.tê9ˆ7ø¨š¤R¾Ó ÆîËÒÒõ‚KöÊà ¢¶/‚èò:ñIÉø5y à´̺ŸÄÄ84¥è¢ü )$úT„°‰ø[óâëÿ`Í=çÓ༛XWîÔ.†@õøIŒ ò4o€„8? *¤‚š ©ííL~å¾v_lu &$’ð€×º×?ÍGµàÛûÐñÂ^<:é’ã=±Ãw‰Ix5eéýú· ,ó 7wïÈ·½Æf[Ããõ‘_ä÷=~âüg×¶­èqɤÄëG| ºÞª×ðÈõI#î¾Aj%Ûù¦#GÜ'F?ÿé‡NéP„i¬ýc »t%ûŽ®ë|ýÕ—\qåUX–…UÕ°L݇@AÓŒàD2ð'VŠiÌĉý}yü ÄùÕ#š4Ç"?Fõñ{=ÄÜhÙ‘0QË-=þåb!ðÇÇC4DÄr Ž›(èþ Å$TààVѼãxpl¡(XÑ0†#P5/qq˜/·¨êõ`䇈¥rÆÒ.o|2qzqÕŽæŠ: xˆOŠCµ£„Bѧæ A¿®a¼^—P^¥”­øcÚeU÷øñh±Úw,“h4Šå€?! ÝÈ!dî·©øqø½¾úl“H~[(h^?Á€/!ĵ‰F"– ˜á\"¶(8Á‡“Ÿ‹á”2ß™g°«º—¸€F8?v2W‚/!¯™wØ)¾ê ô¡â`š.¯B~nW÷ô*„îÍë#  ò#þ„”H.aK z‚$5"y!\_¢äEìÃÓƒî ô{ccªc G°\…@|;ÂtŠ¢á‹Ã§« \ŒpCxúT"á˜ÿWÍã#àp$Š8Fã‚ñF&§DÈÉ· 托á…î#èÓÁµ0 ðx]B¹< ‰ø¬PAù+xâð;ùäE^¿ßƒ ¸Ž++GÈ>!9£hšÆŒ©SèU gŲLfNŸÆ¥Wô9¥ˆ|Šªrpÿ>^;6û½ñú\¹C@~ ìéÅ„@·à¸¥ãØhºèÅ"Äèº=¡"®ëéÛÇ×báŒðq>‡Ž½4…ƒáÜœ¢z<@`EBmRÂ6å[Ëq£äfG\ˆFÿ´NNF^'Ül&yYæ1íËŒäaFŽ\‰D‹ R¥ ÇŠ²¢Çý,’›uL{‰æçÍ?¶ßÚF˜Üãt¨pNvцD~NN‰µÒT‡¹Çôãhn6EkÖ1Ãä˜Eê¨ð­%¯HW±yƱõç˜ùdÞÎÃ:ª XÑ|rŽmäçæ©s›p^Å[ŠC^‘‡Ùf¤HzΞ6båç}Ì ÌP…Ù2"!ŒÈñ¦Ù'$gPû§”¼ÿŒ ŽŠª’pXpW]]*ÛªãØü6çWþXµŠ–­[£–`[•6މD"‘( kV¯¤ÛE£iBˆÿ¹WÙ´r´lÕšmÛ·w§ÝqöíÙC›¶íÏÚ<Ô¨Y‹råËs(=ý¸ÕÊÏÇãÑ©W¿ÁÿdŽ—¦étîÒ•­[·b˜f‰v©q”H$‰„ئ¨iš(ª‹Æñ?ˆŸÏiš‡m6ÆvìÃ÷ýÞÑVá:ˆ¿h[Óô˜©Àñò躇·áKëA!ªªbX&®ë¶û, ¤ÆQ"‘H$’ãLÌ'ù4v’U)Œ‰Vð÷?š¸‹?ã´Oúâ?Ë£¦i,Úß%ÓX3m(mú<ÆC+ö(EQŽ¢ïÏHÚO{]Nòi°8ª\ ë´°¼þãfqêùt#5މD"‘œP°RÐ4pqœÃ"šf²æ»)l¬t1íÔ¹¬‰4 së:èâT5• šf°zê7d{%ªê8®ø‹ò®€£f±…rTIîÌÔv.©^·@k)ÈÙµšY¿.%Ë®JŸº’¹psWï&¾Ýuôk–\¤lþÿü'ά Ó¯h*±*…)Q5 p]›œ-+˜{ Žníêá9m¤‚*òX6s w¸´é~ -jxY4y*jÓäþ±œ zÐ(Ùƒû7RŒJ£D"‘H$ÇH œl>q+ŸÎÏFQ ¯ ÀbËœÌÚKú¦_™·z'Vá÷Nå…äñù×ñÜÂhLKumàN9B PQE‹gNäÑ›/§G¯ynâl2¬Øö½ÚŸ'ïã“ß6’“åà†Œ¸ÿy–ïÎ&ßtqZÓ.„8¹šN9"0 ;ž>÷3†=üÙ¶;­iìÿúI®{p&–ª‘¹j6ã§-ÅtNWZAÑT²zk‡MdGÈÀ´] ̪§³zç>Κ͖<ë°Vöt¿ j±Äû†Ô8J$‰Dr\ùDÁQVΘ‚Òæq®S’ow:NËžO/M^ ±ã „ ŠrŒ­ cÛ4];Ú#!Þ€—€×(hº¸Ø¶[ðñû]ÇF h@‹J€¶#þã°s…÷«n“»†¡_é<üÄíôO8Ä'cî¡ùOÛXõÍÝ”±òÙ°+žÁ¯=EÏ~vüò4ùU/æÑg¡\¡V¶˜4á`Û±ëº^´,Žã‚ª¡T×ÁvÿóíäØ61„w®æ›?Ö—$=&ð†ÖÍfÒ÷exï¹Ôì=œÏ{<_ÑÑV›¹66Ç¹Ž‹ãªh*ÇÆUG-Hgú¯?jó1Ï8/&ì* C^y—(Dûf‚~öqÊ¢°Ù hhªrT}r‚ûc¥èFj%‰D"9Š˜ƒéÍŽ¢Á%±j IDAT³I¸®‹ FwðÞ]‘ª{ñ%Tæúç¿%Ý×<ÈøÛÚ‘âWÑô {¿Lº®£;é|ýÄuÔHô ùâizÿØqAvÍ}“+$¢(e¸êµ(÷óTj&yñ“è4ô56g Dôn¬äâAChZ)Ê9Œüfš®"\7–¾SÔB¹®‹+Ö|ÏØ‰‡xkò'/)õ»Ð·Ïåtùù¶BÖ†ïÔ¾*M!±FgžŸ}]·ùªsª~†a]kâ÷ÄÑ|ÐÛìØá9¼UòG)8J$‰Dr|Ùä¸.M2ë¥ûyli¦nOgϼ—9ðÁüñûŒõ/óØ¿“˜zÐÅ oç“û:à&óß¼Û¦(¼:où[™pow’=±-ïMóv2âÇÝì™=”9w]ÏWY°lÜ£<±²ßl ce®àâ“xü«%EÅ G Âe,Ù›OúÔž|uçÌ«¨E¯œrö¬ýŽœÆÒ²f ¶ãâØ6”éÈmÊ3õ­µÜµx7_Ô‹ë„Ãa6ÿøOº]ó 9b5Š#¶)ݘ¿'DöÌÞL6”E–Ã×w^ÃkêͬÌX['¡½/O.Ê%èÓ mÜI™+_dOv„Ù#ÓxwÌ«ì6µÿ8ýG¤ =kŸMøÆçƒ òåâ]‡w¼UÝKÐç‰åYÓÈß²›”KG±+;ÂÜÇ«ðÞϰµò=ìÈDØ?÷MÎkÞG¯¨ŠãjüþÃZRUÕÑ…Fû}Ã’{ªSéúŸۿ¡GÃ$¼A?~툈å‹Ã¯Y¬ùt,cWeÚæL¶O‰þÇ÷äèAtw Ï]?eÈtòÁ¦.æÓkûðmŽ—¸¤{§­àŠ/·5ÒpÑë¼±2 ]Uþûr’‚£D"‘H$g@hTŠ—.¢Ç%z€ŸïâênçüÊñ”mr C.­Æ´y›ÐR›QÛYĘŸbâÏûhرIÑ=LŸ³‘>äŠÆeñËÒ¼yCâu Ðh{óct¬šH¥®¹´ì.lÜÇoË—phãOŒ¼þRzô¹o/åëÙ›°oZ5º]~1^ Øü*šø·²ñ¨*ǤõO󨀑}¸¤dü¥ˆÀì¡z9ÖdçåbX¡œllÛ!'/ŠmFÈ2ÀuÀ›Z‘®½.Åš_Eóàv6n\ʧ‹÷b¬ý”ÁWt§çÀgY½s#§í@ÑUÎíBïöu±m—ò-ºoì!3R¼ìOHA°åpPTˆ¦³eÓF6nÜȆ Øv0ïè *‰oÒ^à8.i-{’lí"=G=¸€;†½A»ûžãƆ‰Xna¡|¿@@·mȺ#÷äéµòYºb-o¼‘ö•ƒ$ÕîÄu7ô" gÓG¼»<ÄÊIpy÷ |n6é9K™½$ aÛT»q—Ôªt¨ëgñŽ0¨m¨iã(‘H$ÉQFPŽ#ÂŽb˜®íbGCä›.)>›p8Œ¦›ø<^¢9Y8e{2ñçÉLûêsÆßq>w%ÜÊ‚Ÿo#j:” 8„óñÍEEÃïb œ@Ø`áÑF~.Ù ½ï}œûºÔ9,Ì©ÁT„± ¡ªLŒ¨‚1ð0 Û˜¦qR[ÁÂ-÷Âò?¯úšÆkÞf–DUKàÇß72m\Ç&5°˜š(ö[|IÔ­”ȯKöHJ%-­,ɉñ¼®±CÌ®‹{ØÖM „{ÄÆñNUÉ£K¥szR}ÛÏÌ\°žˆiã8™K¿æEn¸£ZÄ>lóéºáÆN&~ÿHbi¸()uhV&›ÏÍ&¹lieË$àUbß±4»/(°)=Õ<½·ÀV¡ö©xX).n;œØwbÏ.x_ÔFÒã²lÔ¥<´®;/¿4Tlþ¯½û¢êÿ>þž²;[SHH¨ÒD:¢bAD°€Q@šX)b¡ *Š"6DEol · `CA@ª ½†@êÖÙ™óü±Šb¹ùYð¼®kÙØ™3»ìùì™9ß#lU÷â¶‚‚Q6EÛW±/ª ìŠÉßñ6[¸ÈLQ8¸ë ¨*æ¾ l.5Q4'Õ3«°zíÊ"1bÁ"~Üø Åf Gn'jÛ«ùb3TªR™Jé)ø\zb?vÅ1¯ØØ‘çMüEEê刣$I’$›Ia"Þ9ÇJ øèʼnˆ•>„?U|f÷>¼uÏ8ZFv`5ïï¯ÏÔÎ)_5•›g A£êX;—p é¥tÉM%¯__^í?×.£yuCŽÜ6°ÑP”ˆ%@ØÅ& aŠz\ןÿ\ó }‡,§uí$lÞJzÏ‘Œlo‡0Nˆ‘PÓJ„Gq¤þä¯9<ñAr­¶Ü=ê,ß9€UíZ“å)å›O—‘ÚûaƵôØ#³l„°±bB=h+±};.-"Áåjîן®7_Ë•›Î#/CcçÚ­4ñWh‰àœhƒmÇ¿·P=\òè·ž§Ä„%v,J(œY"±/Ñ0"lƯ!ŽÆ¿¶Žl?†M"10WL ëèe4v%+ž{˜Å¡©mûpiÝF´Ê,áùéÓØÙÄÏw¯L©Ú!ÀŠ †-„°Ç*sÑMç2{Êp&ÅΆuï°%VN{áæÌ .afÿ© ‰m¥«?>€ÞÇ"–Ö‡ÏeÈà^º =)V{(\1é~„&d&fë#0#aB¦}¤ÝQqÈŸÍõnß®í˜Îgw! þ®‹/-ËâÀrrkƇŒE¾ëH’$IÿH+¿[A‹V­KöÙ¤¤V¦f£†œR¿&Õ2«Q=«:U2«S·]W.=³Z4FRΩ\3ð:NÍò£z*“b¨€Jrn;ú½‘©µjCÎ>314O: òšqJv™u’ŸßL¯BÌÒɨۄüÆõÈÊ©O§N-HÓ-pú©Ñ¤-ZÔ'Õã¡ZF4jX‡TC YuÓ¸~M’ôx}Á` À‚rkÖüYŸlY7n //ÿð’~6róÏ s‹Z¸5OZ6gô¼Û®l‹AjFuê6Ê#?ïÒünRªä’—ßœ&uªbFlªÖiDãFuI3@`P½nÕË¥Zöœf<"†êNç”6éÔ4¿7‰šõpJ­j¸uÐŒdjÕk@½œL\j|û¾½{Ð5J•+ÿ¬ @9‡$'7˲P•Ê9§pjëæ4kX·á¡é¤d×ç´mȯYÛH¢~ÃúÔ®žŠÃð‘[·>§ÔΣ Tg25ëÕ§vV.ZžN#ŸITh¨ ¸³Ð(» šçc„Kˆ¨ét¸â&.8µ>µ³«”Q›¦Í›R;Ó…5IiÚ‘Ù‚Â"›Ú/åò³:pj“ºÔÈ=…³Ú5BFIÎÉ#'¥”R_#.hQ—Ü6çÓ¶~ÂVð¦Õ E§s9µF*)™µÈoRŸšé–¥œU›üFõÈöëØ"¾ÚÏŠåËiبN§óçl‹Í›~ Þ) áó×)ŠB ¼œ/¾ø"¼båªW?Ž‘Ä}0刣$I’$Óá lË"%%Ãð éú1ãw§ÖœO.\D©ÑšžõZ¦±(ª·&g]Pë˜á˨¯½çÏÎçÂù¿@8¥ËE(B‹ÅÍÎï"F$ žÌFœ×£Ñ±#l89µó9ñ'Ë%…Ö]ÎFˆv¢Äßï9…Yqº³¢]Q[#«q{²½ë ¢8Sp{܉ÓËG&¯„B!ì§ÙÙç%ö'$Óêœ.a AjV\T§Õ1mÀ¨J»ö™ñöØ#)‹ÓÛf#„E|pí·‹˜ ÁáÓµ?lÞLóÓZàñ¸…STrrrX·v-I%Åñå©BÛ‡·ïôU£}›ê—dåÿlC¦iãÍh@·ËùyvšžKWV4¾þw /ù{røQ×aÜû#+ö :\؃Ⱥ×éÿæ÷œ7ñnt,lÛIƒ¶çÑ -G^–MÕæg’)V,þ<ä¶êHM!޹ÄA.9(I’$IµDp)**¢¬´äg¿¶,‹ââ’¿ñîÿÖõ‰jÛ¿™;lÛ& w!EQ(//?NQê?FUÕßµÀsÅ$ŸZµjýâ>V´áСCÙó¡(*š`ÉÌÁ\½h+Õèu÷Ãô똋bÇ‹Šÿÿ}ÀI¬Ú#ƒ£$I’$ý…Á+1QCÊÊÊþqûoÿfèúß–&,--ûÓ÷ÿ·wíH,ËúÓ÷ñ òvRã_]Éd‡ ¢¡Á°‰ý‡÷¯¹ÆQGI’$I:JüúFø‡î¿â7Ëñ˜fìwÌ¿†R±úÍ/¶AÁ²,,ËúÛ¶áçÝ$PVLà>¤%ËLþÉÇ@GI’$I"~Ò/99…¢Cq¹ÜوΠ]ŠB ÀëõýâïÝnåe¥èúß3؉SÐN§qüà’X < £*ÿΪ‚Š¢PVZBrrÊÿ¾À· Ž’$I’t"’£ e«V|öé§´lÕÃ0þôÑœ?˜&8xð Ö­§C‡3Ž;`§iuêÖeÙ×_Ó¤iÓÃ!ìïÞwïÚE <@à ûwüII8ëÖ®¥fÍZ¨ÿ¶j. D£&+–Kã&Mq8ô?õCŽ Ž’$I’ÌŒñ*0dVˤ©Ù”5«W‰Dþ9§«³“SRhÛ¶-þ$?Šª&N[+‡Û¨i*µëÔFÁŠåß.ÉówiƒªªTªR™f§6Ãëóý¬àt:ÈËÏcúõ|óõWÄbü‹²£8œNêÖ­KµjÕp.„mÿiåep”$I’þõE „‚¦éÔ¬U›œÜšÿ¬ÑFŽÌ¯Uõ'¡ñè6: 6¤~ƒ»6VìªÆW9^@ÁãñÒ¬yóøH›ÿº×kE‹5MûSC£ Ž’$I’$Ç\*¦ªÿìkçŽ?AæH/Ë÷lCE˜ü'´áÏùÐóçnO®U-I’$I']˜Pø§Ÿ¿ý¥6Ȱøó0ýÓÀýŽ ò‰”$I’$Iúë7ÿgNHpŒ/(n¾A’$I’$IúsUd°£—†üÛÇŠY[‡Н{)‡%I’$I’þtxQ3B0ÄŸ”̉^–ðOŽÑuôôJü°q=Õ³³;(ã$I’$IÒŸK (ñµ¾7nØ@ÃFNøZâ88*ŠBvN.»wíäÇM›°mK>o’$I’$I]wP«vmRÓÒVÒè/ŽBTU¥FNMrkÖ’Ï–$I’$IÒ_H¶Oxhöãò¸°ÃAbš¡ ,Eá©Ø±D$h:†a ©VÄËãFWŽŒ”ÅßóEü=ß²@Ñ1œz|”P×àð{·H´çWº!b…¸ãâ3™« eýÇ£ÈÐãR3ܸ*Pu·Ó,Švlû£Küt{ ŠVÎcí1!Ö€Sk8ˆÄ\¾ÊœÕw·\Ô¿ªÃÀÐ5…ÃÇÁéSùðº. mð2»ïÏ'P"µÐœGµßŒYñ\âtÕþx?³ªîÄp:âýº#Ž"¯¿ŸæŽ ²­—x§wFØÄ•³[×gΠ¬X‰ÒR‡C?¦¯³£!B¦@Õ4œN'šª•~ûxéûUZ9Ÿ>u/c_\F¹¥ xpÿÜit¬âæDFWýD<ˆ¦»HÒ`OjOf͸˜Ò/_gâ´ùL¾ëúŸ™N›‚5òÌ óY½'DRNK®»éjšez‰Ï„kdz«E.ôneþ'›p×iÇÍ7÷¥QÚì3– Yy 4Œ–é?ò`Ÿ±lÎmDûj^Þþ>¨l~g$¬Ï¡Wÿú¼óôRBšŠ¢ª¨Š@7j2`ò8Ú¤ÅØøÁ ÌúÏÇl-jyç2øæKÈrÚìYõÓ&=‹Ým,àå®t;]š:øæ¥)<÷ÞröG½4èЋÛúw"Õy¾Ì=¼4îaæ­Óì²! ï^3jcx4¶,z‘§_ûˆ‹!³I ìA C°oÍ{L›ð4æy9§ôC^ZºŸÌv=qM'RœVÙV^xj&‹ÖìÅNÊåüÞýéyz.D¢¿þÚQˆdöÈÛXYu OÍ¿œ\?ìýî- ¿“)uç1®ƒƒ§Ç>BiVM6.ù”Cž|n¾÷.:V·NÁŠ9÷ñð«_Qê«ÅeCî¤w~*…›–2ç½ïH‰î忟o$ïšñäï|–>ûS­Lç~C¹±G6>:”)”Lº„vÏäpë„1œ_7ƼûÆóÊ»Inr>#ï¹ÆîëÎâÕ’tr6¾ËªR>þÁ`Pv2’$\¹Ap×·Ü=d*IWŒæ™žíÈLv)ÞÚï¶ãTM¡hÓ'<:íi¾Û¡æéW0rÈe”<|=7¾P@‰2•s{ýÀ”q=øúÁñX·Ì¤mØÁÔþSȽwy+g3§¨2õ¶þ—yË ¨ÕåzFõëD²S%Z°œÉã§°d:=vÆÐ †Gaùܘúòç»s¸dÐ\Ù¼ Å;–1ãÍ/Iw–óßO–£×:›á·ßD£ œI$&%%Al”Ÿ|à(¨ìÛü…•[ÑdÛbæmÊðSŒ_ .ЦØþ9§Îä›]²Z÷bè­½È1ބգ¨³²—Ëû½Èc}3 :Àº¥¯q×}·’šù*7¶¯Îšy÷3ý­o)(wÐð¼¹ç–N”}þsWï¥xõ­œõu:-ºäö[;°áå‰Lž»˜CÎêtp;}ÛdØ¿š™/¾? -ú ;ë †Þ1ˆæU/ŸËˆ‡_eS‰BZ½s¸÷ž¾ÔPËXþÖÓÌùdev*ú ¢a~[žÇs*;gô¢Ãë¹\Û¯>o½ôÅ EÕq;™—Oâá9”íø–‡§>ÆÛJ©Ú¼Ãn»šZ®¶ÃO²Û¢¤8pœã}䘨Âw'Òfˆ > K­$Ê÷í%ê38Ñãú {$HjB÷ž—°=´‚é8Ð5ÁoçsÃ5øx»“Z «S°àm^ùt+Ÿ½1žZÑý,~û#¾ZðóÒsÉ lcׂ÷(ôWçù[+±øÍ…,=¥”Kú@SŠXòæB¾l|ˆ*íê²vwmþ–Å¥œÕÓÏš¯¿`¿æ€² ƒaT­1—M{挤û¨Yl/ò[+‰E Þàå¥E¬yã:ûàƒw±ý£¥< VkN—þ&Kî}ƒPÓ©â óþÛóxsÅK¬x¶Š?Ï¿î‹è‰aa±pá;ì}{ 3:yYóÒh.½ýq¶òP³vrb{ùþÍ ØÌï,bë{Ÿ0'­©%Û(xw¢ö"8ÃÁÔÞíyèK‹¬z¹„~x‡·>XÊþ/0 Su”_vV‘= yy•—a®£aX6Ôi߃ç,àÖç¾æÎöMYúô3¬ï6†§'>Aà¿C¹ñÊÁÌùøiÜÓ»Òý…ÊLœp7»Þâ–Þ×ã]<Ÿ6¥;™?z Yw¿À¤7;TÄ·{jsým—ãÜ·„ ÷\‹Hz[®JÏÇ_fyÿi5†¡£cÌz°ÉJì¬8œ¾ôj´îÖ«¾ø€ç?ýžëÛUáÐîû§ž±'o»Š>ÖÞ¿íl.ÊËe]îÝ×…7dÑד¨ 7 œJoÍûŠŒ‹/àÛqíf'Žx˜I×´9áEÀOÜäØ2š*š›ý¦°ƒl†?Ü›J‘r–¾?‹·[ôzæ–¾û>{Íl&µ‡š†õŸÏÂ/W°âëÇÈ&ħ«6Q±QUUŽÿ]Û28ëîY¼Ð3psÖ¨O).\ ßDzí;Ù¾âmú´Ì:O|– µU<ñÚ;l/ò0ôÕ|÷ñ« èZŸÀ§w2åûn]ýLìþq ×Wû„QsVSk3å˵¬]6›Ó3|l}e$/nÓ0GÎh2šÝ¢œÆô …2ž½wÅÑ]¼ðúÛl9äbÈûß±|Ñk º¨ÁÅ÷0y•‰[WâÛ«z#+·¬aáó·‘L o-;@Ùò‰<ôe˜f׌aá{‹YúþÜ«xùÝw(ŒüƯêDv.§Ì_“Z™.„?`«æV%¼i3¥((•ªÑ½ç4ÈLçÔ«&p¡²˜Þ[Ƚ3·Ñï‘ÑœÛ0‡¼ ofHÝ LX°‡.P^Ȱ^©ž‘InÆt¿º7yµ²8¥mnè‘ÎÊÅ_cúÓðé Fr%ªV­Š¿è]ÆþÇdÈspñég3vÎê~3™'¾·0ˆà8c8cz4!9)Û¶e#IÒI©xÏ$U¯AŠGCÁPÕª+IDAT²gzàs¹1 7×, °{ÕÛìÌèÂ5µ£Fnc.»öJ¿ÿ˜=±$R\*º+ŒJI85EýÉ©ÛÄ÷ÂŒàí<”Q]ë“Y»ç¶ÊáË0·½Â‹?ÔaÔýƒhÛ®?ÖO Šúžñ3àŠ‡ï¥kã\Ÿ×Ÿ! w0yÁ^œšÀÑ  zt¤Z•lθ¬¡­ËÙWfad6¡y^ ?{Ï è(oyõC‹Ý;ÐñÆ^¸ßžÊÇÅ¿”6•ß¿ÁZW®¿üLrrqÉ ·ÀÆØT`þZ$?*EºÈ®^ƒ¢ˆÄœ´8”óòsÉn|cÇu`ãÜ—Øg¤à3hÞ4ªT©B%}“f­áÒ wÓ½i. :_Í üCL{gºzÓ¹¾ç¹dW©Î齯AÙñ ;vïdO¨ §w<:õšqÙõ—Sϧ£û39ÿúëhY/‹Ú-{1ì¦Ú¬zwA_¼Otú+‘Q% 7•jYYdWõ²xÞó”tÍ䳳صf>_„[pCßsÈ­QŸîF¼õ]Vî ãÌhD‹SkâÖ/ÎP5VÊŽ²«§?Ñÿ=7µ÷_ɰE{0´¿ÙÊ1Ç<‡îfôíÛ±o=ï¿¿„ÉçÒmÑhŠvnà!ç³Ð8 Õ3Ò)9FT\gÑ"ŸlÃ&jV&Ø4‰Ù‰‰5Š‚¢Ä‡híÄÆ,3B$Ÿ|c›a‚Á0¦%°ÊvñÌÈëyäÓí´1Ÿy7Õ%°m1û‹ €³/Íçɘ‚Ûë#+³{ƒ Ç×wɵœî Qv vmaŸebE¶swÇÚŒŠiø“SÈ­íã`Aˆ EÁjuëJz4Fƒ¼:xýܽ‚]Å­9P´0yöòfÌŠÛë'«jb{> H9û 2cA~t¦‘ ‚ ×-`ý+÷súÕEjõjè*˜¦ Ž_TW˜{›€»â:aA0l‚˃0|^Ò2ü`Û|dVs²kí v‰rvŽÀ*ÕF‡'Ÿv©6QRª§á2â3ÅJw|ÉwŽçÛƒü‡vm£ÞÅ?ù$¤jXûײO«KëH4€Ãߘ–~ØZŽ*Uëg Y”Š’$I'ÝðD°l@ƒf}žaw÷ï¹öôkp¨ å{W±fi!#.GEQIÍï†O³);Îæ‘Ñ£#ï›ÂVIÏIE±BSqëŠAtÏj"þúÔMƒX4„^ëLê8–+ÚÉ^«” ÞÂZM „‚nÔ§mš b+øÒ“0ŒøÅ‰ªâDÅ$S傇yùb‹@ |Ì©S!T—ÁþW'ðaqeZ.}Žg4“:â3¦¿¶ƒ®«übì ì^ÎÚe»¹kà4a£(þ¼³Iӭߎ)B€"ˆDC¨nš]À‹w à©RS|è ­JXÕË( ¢tûcŬœ<„¾%Þ~g6mÒU¢BÁ›êÇåvEq¢‹Á*ÝyhÈ{ŒíÕy¹94jÛלGjùZ¦Ü>ŠE»4’ü.B?âÉ/#&~ž“T§ÆÚù™ñE%¦¼t^]cÏ®oX¿úGÆ ¼]X(ŠŽ¿YÒírRºLäõ ,ÊËÿrª„¢¢ÅB¸/x„)W†j7eôåséýü ž¹ ›häÄ-íwâ‚£ä^ÆãOŒÂ³çc.îzo®|‰»Æ‘W%(¦Ã½s™xv1ààk)«‰eïŒç 5r3ƒâ:0T°Â6ŠêEß½Œ@<<+Ge~¯Ÿr€7‡÷ãö¹ëépë,^Û¿föú𻓀2z>±ˆ˜Xìüv9Jž‡Èêx@uy5,;>;ɨ”Ϊ {å]zT3±‰²õ›Udäªüh T`ß×+0MØ»}á˜UkQÉçÆçIЏdÆGÜÞÔ‰‰Å®åËÍv3sÔçôn—rW¯tév1³>ý=Û¾çåñÃylm—þ“ “=É”•Qn‚ëžgÌ„ïp¸4lÕKõJ6›¿ZÅÁ@³ÚEÜÖzcošÀê½[˜=x0ŸUîǧ:‰X²ö¥$IÿŽä˜Ý¼Wåí£×Eý™ýÁ·lÙº‘æÍãómûQT…º-.!eÙcŒ˜ö:?îÜÉŠ÷_dòso°ÿèË“„©fqVk_Îù€¨_cñÔI|¿<dEqÖéÃ9É_0çÍ x’ƒ¼~çýlr:±“š3¢w5ž¸èbžX´=Û×2ïÁ‘<º:„¡+ÇmˆêtS°ð6z~ž"§ë˜ ¨èÑoŸföîÖ<ðÐÝÜ>jwÜ1’ÛïÃiEóycy9Úñ’£°Énv9›f3⡹ü°c'«?žÇä§^fWX=þµy¢´p7;·oeåâù ïs3 ó¹áÜSqø3pÅŠ8uã:ô ·Ü¶Í­#ƒŒ*Nv~ñ-»®† îËìK{2ýýuìÙ±žù“ï`úw¥8ÕãU'Úî…Œ6ŸmV*5ª¥‹„p8žt"Árbš‡Ø–¹ ¿ç[œn [õUEaËçË9uÏ|.í5“ü‡ßæ–6•QQЋ*{Ñ´ð†Íúí;Y³d>S–­1/Eïä’þORh¸ø¥êI ‹ù9ÿ† ÑÞÁÝo¬gËÒ—¹ï?›¹¤ï©˜¦uB_Ò'$8ªN©•¼¤¥ÁÞ»8pÛòbžXü<ÜÕκ—_šH׆¾ÿì#¾Ú¤ÅUýéPÝ­8HN†JIT%þ䤸!=É…õÑçÙç¹ ]»Âœ=~2TJ"9% -¥Þ­ÓØ>Í ²qÕ,ãMN#=É l÷&Ö¯_φÕë858}øLN¿…üô2¾üpëK“é:øNóÚ‡›T¤y‡_È‘ˆ—^Ï/eîí=¨bn㓳Ïۀˆ  žj¢¹ý¤ú]´;—›òu‚dÒõ®7˜Û+ƒò€FëÁñö£ƒi^¹œ¯>ZÄÚb?çÝz -}ápÅ·ç‹oOs¸HuAšWCó5æ¡÷ÞaÐyµØ·j ‹>ßHÚéqaÇÓpóëõ®âu¿:œÍK£š0wÈÅ´ép>36ÔbΛOsvíd¼5³i“}+Û6¥÷s*ã^~ö>‹¶¾ÏëýÎ~Òpkàð¥‘âÓB *tœúg­¿•tï)<¡ŸÃÅ9é8TÐÜ>R¼ÆQðý$»5Ðs1{2;'v&#£4N·ªì(´·€·‡VfJÏÓ¨›ß‰±ï$;EE¨N’“|艄 êI~/º¦Ùû=ËWíÀTºCãóW¾ÁþÚ%ŰU M(ž¦\|v*ß/úšXR:©n @syIñ(€·F[™3õÝ‘´ÊÏ£ÓuSØaWÂ{¼K³„‚ÏmóþäK8í´6t½ö¶×À{o=ÃéÕDffŒnĘ–)Tn;‘†CûP3ÉÀ Có!÷pñ¡¨ŸÝ~£ÿK£{^ç¿wÔ`FŸ–ÔÍ;“;ßÜMµd ¡:HJöãHŒò¨šAR²ÃççТÉtͯO½³†á¿v*÷6÷“Þ¬?·´ØÎ…õ+Ñð²·8ëž>T5TbŽ&ÓpI_²ªµç¡Gçð£KcÁù¤§W!=%•¶Óבœu*çÎ"méÚ5kÊ™W=À¦he’Ý*fÁZ¾Y±•¨òkõ¢v,ŠÑr‹ŸëÉÇ·¶çÔ‘;ìY&uÊ$bØašŸíǨÃă's°ðÀïš…#D¼”Ïçáèë/…e Çâ§0u§ Ç…®©M †°Ðñ§$¡™AJÊCÅqì÷ªßïš؄Ca4Ý2)/+#*x“|š‚"LÊà ^·þ“ý‹(.%*”x½E·3^KRØÄ¢ñk#Ñ]ø“¼*¥8hÆÇýu‘ ··QQ³ÉÂŒ„„L/^—*Ãtxpé ±p€²`ôpG‡ËƒÇ•¨Ëô“íù’¼¨¡RŠƒ1T‡?É‹.¥8CÑtÜ^/N]EA`ÅL¡QÓâ·ŠŠÄ~; 7îD[íX”`0ˆi)ØÁµ >÷zZ>·œÁ§¹VŒ`yáX|…§Ç‹Çp *ñb <ˆ¥:ñºu‚ – Šªâòøp9T„m5AQ‚¡(èn’üntÅ"PZFÄVqû|¸taE ”ˆZ »=x“Ò`¡È+%I:i£c<<*†ÛÛp®  EcˆDaÇ“¨ykÅ1Ѽ)x)§$KŒ|9ðú}85A4AqÄJ‹1^¼ªIiÈDp¸½¸‰P6Q4¯Ïƒ®ÌpÅé RVJÔVpº½x\ÎÃïùÁò 1Õ×í &jx]:Á@Œäã–ãBàð&áS×E((JüÚI׌à U=¸írJBšáÁ§[ñ>@€ª;ñz´?Ž·ß>úšÎÄ)XWr^-qÖJؘÑápøp=b‡Û‡Ïåa œ† ¬¤[5ðù½850Ãʃ&ºÛ‹÷pûM‚&:>¯A¸<€i T͉×ã Œbx<‡ë>š‘™(mäÃíÔâ}b45Fy š ’‡b Û¸ Ç‘n\Q°‚%”„,TÝÇëÅ©) ,"¡¡pŒäßQŽ§âØ€fxñy 4lÌpò°‰8^Ø;^ TU öíeò¤IÅO?û|ÄËÒÄ}9øÃÁQú'Q±ƒ«éß¶-æ¬f`ž¿X[’$I’¤µßuy¨þMlw}¦}²ݯÈÐ(I’$IÒÿDÇÛ' EÇŸš*„$I’$Iÿ3UI’$I’$IGI’$I’$IGI’$I’$IGI’$I’$IGI’$I’$IGI’$I’$IGI’$I’$I’ÁQ’$I’$I’ÁQ’$I’$I:q~qåUUA®U-I’$I’tÒÓ~gîûYpTÿhÿ¾½ñð(I’$I’$ý;ÂãÿËÊÊ‚ý¯íTUU!Dü þµ$I’$I’t2†GM+L@b€¸ ?<,#£Š¾A,(½‰›ð$n.yH%I’$I’NZ¦ªªºmÛ TÜÐOGÕD8¬¸U„E7`Ny<%I’$I’NZ1 œ¸…Žº…ðñ&ÇX‰d&þć(c@TOI’$I’¤“:8FHâMdC~~£HܬDp¬øYEÔäñ”$I’$I:iÙ‰Ìg&B£É‘kÅ/8*G…ÆŠÑÆˆ Ž’$I’$I'}p¬8û\q_ñõqgI«?¹i‰{Y0\’$I’$édV1hxô­âTõqƒ£rÔýñ¾–$I’$I’Nîð(Ž÷õÿAAOBÎ ‰gIEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_data_details.png0000644000175000017500000026337712235000130025167 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÿEÓHþ0sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ8 hê½ü IDATxÚìuœUUÛ÷¿k×É9ÓÁ Ý] b!(v+*‚­((a‹ÝÝØb ‚Ò 3À ÓqjŸ½÷zÿ8g†±‡û¹ïçÕû9¿Ïg1Àì½öê«×I$‘DI$‘DI$‘DI$‘DI$‘DI$‘Ä1Dcñ¥f«ÉáH"‰$’H"‰¿?¼LКP¥‘¶7ú_~ pà×û”žç8¢·B¿},‰$’H"‰$þ‹DÞ½…ü7Ô#ÿMí‘€ ²jеþöó¦+s_½9–øp;ñTãO©ý^=¾^'ºtî<Û›²cÀ—M”¶m'©I$‘Dÿ…t_`ZvB8n!­•6.]Cþ‚z ̘-­G"„DWÕ¦zËv°eüï-k‹ƒ¡«˜1Ëýͼϭš¼Ü—±©9…Jíîí> X Â/?CÔŰ3oðwêØñ»ý8¨‡Ûã•5 ¡( †®¡ñ—ÜS,fcYVrE%‘DI$ñ÷&ü"N°+꣬]1)ÿšàJiÓ©ç>äe¦àó8ŽDQuÁ(Å;vQ²u}‹ÝÐéÙo?2Rt%þ¼ã8T5ÄXûÃw˜Ñh‹~»®¶Î'Íï&Åë’Þ.–-šýÙ'OM9èD @óbýBò÷¥e+j1–?PÚÃåöÈšú°BP[SËÌϰ»²Ž?¤ÿlGrÌáƒèÑ£+¶m'WVIüÍ¡¨*B:ØŽLFÿç`Æ,ÊëL–/øŒƒI§üÀŸî! ¢.ÆgŸÌD :” ~AM}„]5”oâè#Àçúsw9EVo)å‡eóè3p²RÝ ¢6Âê‹èÑ£7};·â¯¶e(jóå7³Q572'éHá¤K#³Ó¨x{¿”Ž’`”:®øñÖ”Û¾­ï„Ÿs‘¬ª«Þ›·•Ò«{!û êú”Å|@ïÞÝ1c±äÊJâŸ&à˜&1 ]ý—=]„8–EÌvªŽ¡ ¤LìbÒ¶‰Y P MHä„ö ÀÁ²l)vA¢ªhª‚­eýÊuÔøréݹ-WÒº—Äÿ© -ëXÈ%7#@Mø¯7¢Ïã¢÷,Ÿ÷:‰iK6,ŸÍ1'BÒýóz$’Âü\¶—ä°cÛ&2zõ`gñZ´¦}›|j#²iË_íêF*®*½ÈÜ/Þ%óÐc±¥ƒ×¥‰~}zÊšS§˜³ßº·'ànöŠCÜû]›¿í8¹çƒ>º¤1M,ÛùÝÎX¶dp—\Úf ,›ÿÐa–Dÿ)º/ˆVWPg6àB£FË$7Ë ¶ƒE„ %Ž”MÄ\EÙ³¥”Xá5õ•èÒÁ~´@—À‘'¡ª²]qPKMÓ–ŠGñzþ]R¸P±v”Õ ë6.!‡ˆ êxð¥{غ²”Kn9•>%™ôI5þÖˆæ}E"x›´Ä•=cá€Pâ&Aéà8’äÖOâŸÄV²R=˜¶Ó"†ß”B‰ Ò‰kTM#àÕ G¢”î®$5c·—HT!(h•"Òün‘h½B!Õçj:cÂQ“»*èÔ.?¾…²ÊêêƒtéІ˜eá÷¨šFb "‘8Ž#$2ø½Ñ·Hxþk¿',H Ž#,‡¤UšÃðî>ò rp§©š¦a芪€”./#z L[4I$ñOtÝbÓ÷ëé{ý™\(aʽ˘¿%•¾ûtÆÓPÅæ¢RªÃŠËKaÛÖä¥è µ»ŠØ¸«ž˜ªî&'?_M1µýòȰLŠ}Ê9oídàÐ.¦Tî(¦ãC9§€ÿ9¾AÖleÑÖ:Üiôí’Ž°œÿ¨N-k·ÔrȈnÜ9‹LW3 ßÖõÜöu5Ц• Í8#âH dëÖ”Õ›8ŠAv«<Ú·JÅ­šl\¾†Rá"/3…Úò ¢z*]:µÂÞ½•-»ƒi­èÕ9 Ãvp’‹*‰ùo"s2NóZEÄŸ zi;NÂN&ìÿ KXÇØÑ°~eþÖT•/¿Û@fz*.—+þ}e½T„hj‹³(Ûµƒz´âƒù?qÐþ””Vâ"ÈàΩ|µ|ƒútÅqlñwméÄŽ=Jo‚Ø[ÄmýÑÄÿ í:èHÙĵÈ7ï8Nñw¹\ü°úG>œõ)EÛ·‰DIKKőгU ´œx£’HâoEXü¼²ˆý'žÈé­˜~ÅQØÔðÐÝ‹ÙØ*—SNÊ€<fuo±‘bY@JÍÏDZwç¶sI7µ5,ún-Ëüm˜ºo&È|³™|ôÚ V…MÂi8¹£JmÔ$Õ¥b ³¢„Ÿs y|R.¥?¯ãÙùÕ´n›º¾Ç¿úŠ×”ÐëÄÃ8©“NÝŽíÜõî*ÖÔÚxRSÔ> —Kÿs!v[6–sðQ9¨Ð‡ ²xÑz¾,j Zaäy‡2Ìn`ÎOet?±/i »xúí5¤ÈCc2¨Þ´–Ç¿ÙIA·VIæ?‰ÖÀ¶¦¿ÿ)ÃÐÌL§ˆ8ánt†—ĵàÁþ}ÛýF“ © «6îÄqd-m$øMmqÿ¹˜e#m“ýû¶§{û\.½÷cv+àì÷!àsóì‡ß3°wצHE(qÉ_Èf¢|“Êß$óß÷öûÜPBÕ×ïÅ+—˲p]×y÷Ù|8ë3Þ_úôìŠÏ㡦¾žÝe»Y2ëaúr.é¹íöØ:“Hâo*õKE¢y4jv×Q_è& ›ªÚ ¡Pvz*ç5„®V¬« ½S—Ž1¸ÿ…ïYiÇG·%TQŪ¢ 9ôîègþ²0Õ1‹—† ³£"DЉQ\æâºi…,øüÜ}»1¬µš`®ml¡â÷x m;ØÍL ¿n¯ÀÁŒÅp@TMCSÅ›~¤š­S:i¬åÏ7P•Þ†Ôº"ªkªùvY=mº°G<(ŠIÑ•Œ¼äHFg8”íªÇIOeÔèÁø¿üžg¾ãö¹Ió¹9&; %HÉlÏSò ™ R¨d÷ïÏØÒ¯xfg”ÎÙzrï'ñØþJ“{Ík³°ç9Û‘MuHIÜ4„¢œ{뻤ú½0— ìÖ —¡aË=æ4AsÉ?á©#%º®!4>ž¿Žá;ðÊM'á8Û‘œûû?ê "f  B€-%M´ÿ/º¢ý‘*Ķõê˱°mUWYõÓ†€Ï葉¶šÚš*„PÈÉɦ]~&µU» d’´&ñw‡ír;æ³öoy£Íi\œRÊ£3VS2Éï{ }°~á>ÝTKÖn…‹mÅ1:KJ T`Gñæ}_NÅ×?PG*~åùåÕ".¼øä<æ6¿ë+¼›òܾŒÎ€íßÿÈ-Ÿn¦ÒhÇ3WdHÇ ÞXPÔ òáÛßðLig>º²;¢6ÈÓO~Áºþ‡ñÌY¤·NGÝ"–‘‚Hîý$þöZ?ѤáŽÇ苦°»?Œ¥th.ZÛ¶Ó$ù;RbšvÑ:/›öé‹mÇöºŠ’ø¾·T5Nce 7û˜eã8yÙ|¸ðúwÍG¤x0t•ûgÌaŸAý¨Fšµ©/qí-¢»¿Kü)1-»IÒèägY1lÇ&f)(ŠÂÎÒRÖoÜÔä'×İ­Y9`ZÎ_³I$ñ7€%>¿Ž‘ ˆFJÝSw øIFçvœÞ6¾!וS.=B[yl¾‹cûvçÚþ½±BA~X»…3·â6âˆÐ=dKÌì6œÖN¥z[:çžžMï  0äðÞ”üPCym=﬩œنÞ bÖ˜ÌìE5pÛyÐÚÿ¯9Ÿ/⣒™©®ƒ B0BP€Ç¥â’¬6>}i>[‡ áÔîv£F/!2H3ŠÑ:pØ^%£m;ØTÎ CRt4-q †bT†$j,F¡5Qµšê±0-û_6[$‘Äÿ4UдŠÆ‡ÃlݾówíÿB@vf­r³Ñ4=!\Çï pz"ÜÝ!5›ö–å8#fœnƬø·„͆uEˆDôlr›1Çagy CºçâóøÜ:Ž”œ|hžøp}zvÃ4M #±ï•xÄ]KcvþÀæWI(MÿŠw$3±l !$¶m‘âó`¨àóû¨ªª¦t×.EÁ0\¿á’Hâo G"q§7EEiØÉª B»´jÀKÙ²L_\‚Ä› ÏCz¦Á²Oðí6éÜtÓ!ôíXÀ}5%‰K4…4ÙYR7»=*Õ¶ÃÛîѰµéUH‡õ[XmÍ•gv¥¶d'³‹HÏðüþ&V\tH 3ýÁ‰˜R¨2 ÈË6ö¨Ù ?éu%|VÙ‹“3S9úÀvl~ï'WÄлïqØmâË¥Dn¢»*tºåyyiÞjª2ûÒG@°*JÄü¥´Ó<ÜÈAü‚Ðǵ§I_ÈfÒ¶ã8Ô5„1° ûô*üÙ*qÏkß‘›“ ‰qÆÁ‘BÙ£÷·m§ioí*«dî¢eñí&%ƒºçÇÕúŽƒ°ù‹#.¥D‘ø½$aØuœ1b)>ãn}‡!½ wÌ`¦ƔǾdPÿÞMíTD¼-ñ[øCâ/eÜÉÏ2좪¶ž^­ Bàv»ðx¼”ì*#f†h£iHé`ÛÓÁ–*Æ i÷Kâo¸êÏå×)/ þÜty.•;×3ýµ|SÚŠC:˜gTR¥z锣óþ‹_óf]{^¿sU;+©ÑRè¢IÊ‚õTã¦nW1'ƒvCçƒ.»xüå9y1 Ë×]y0‡¸yëÞ™¼J's@&Ãzå³Ë¨à³Ÿ"Øén”?Ú;F*í:¥'ìŒáxΞ A„FëŽ)Ì|~)Ý' ¢gn<У۞ãΩÃ"—D$Ž‘INåzflmÇY½{ñd§nè i`Ö† êÍ„mT4;49âŒSÓ…¤ÒÙã7”Dkê/›ÖµíÈDØ^<Üõ׫·Ñ1϶t½™¢KJšÑþ¦P])%/ÝxR³0>P…çf.Á6£ ŠHÐÉÆz8vܶ/¨ªàü;>`@ÿþ•–óéÂõìß·]S[Tµ±}ì¡·-¸©Pû“1Ù38ž#Q×X‡¤)\/~ùƒ¢(4àãÂ{fÑ·W7"¦INvs*åýy›ЯwBíoÄû¡!iIf ?ñöwš]P ÐHÜð§(´¡ë¾{•ŽíZÓ¥c{¢f”¢­ED¢AÇMAFë&µFIü3€i‚9ßmô%¨^ZµÏ3ÌŠÕ;Y”¸•Ow¹I ¤‘)LV¯-ciÌÆ‘ j)©y¤rÓÙ¶~?E¤ÐÈÌLÅc[DÔ4/«,eqÌ!•O†.±Bu¼6§Í•Bv†é8ÿ3µ¹´ÀÈ °•Ɇ»YiÆ™EÓñxSIñ¨>Kælf®á#'͇ã@v^›×—±*fƒPðøü¤g¸Ñ„ÍÚÅÛXŠFzF>=!>˜½ 4YmÉ U3cNº;@N†ëÞþ$’ø_‚ãX4Dã·`º\.ºvîð»ŒwâÚ+lÛ¦!b‹™(ŠÀNÜíoš&¡˜C̲ÈÏÏ'ÿ˜ ŽWûÃ1R‡¢»}ÔÃM·¶ ¿UûK)PU-»íH:ñûÏ­NÉ$!I$‘DIü½³lB¡£Ž;£EêB‘ õ¡&í¸B“Ìì<Ž<þÌ;º×Ö7`7óз‡ú††vL‹H¨qsCu]ðšzEQø«L¿!þ™Z ß.^M$&I¾“H"‰$’øo‡lú£…¿ïR·×î¿SÏ^·åW²¶Í ÐW¿wÄ??ÅášIé(/KÞÏ“DI$‘DÿP•ŠŠržy,²wÄ_AÀ«ó¹’™DI$‘Dÿ4^¤ª*fPûKÙ]û«Ê’H"‰$’H"‰ÿ.ü¥Kb’H"‰$’H"‰ÿcÄ_üñÚ—H)н>ôXˆPÌùÿÔŽßc†@Õ \ª$µøÍíÁ%££öߦ/¿?á*n—ŽÐ’hM)AÑ ÜªC8j5½‹F°ÿ|ãžùL´ÿžÑ=^t;LÈtþÞó÷»{IÁåõ Ì+ˆ³WÛAÑp шùÊJJPT!mlç׌¢(¿¹Ð©¥ïþ§é‡áõ¡˜A"Ö/÷/(n7.]Á¶LÂaóÿä¦PþJêwç7EJI,TOUeTTTRUSGØ´ÿðx‘8vŒúÚ:¢–ƒ”ðœ¸|&¯ Ëà€gKñºâ ÌiA‘ÒÁ6ÃÔV5¶­‚ÊêZ"1»EïÿUÂbõËW3èÜG©Ž:Ý.)Ñ]6__´?=n^ŽËX‘ µ aìC{þªØ–EUyy|,*+©¬¬¤¢¢‚òòJ~=_RR½qG ?¹;þj.ã¡Ø¬{a Î}Šú˜Cí¦/9áã™]kÑûÿz‰'Ž Õì™çŠÊ*êBQ)[¼^„bóÓ3“tÑË„ìß™O)1êCæ^ÍGKç=ZWMMØú®1é8ÏŽáG_Áºjûߨ‡ÿÙÚp¬f4J´Y1ÿä|“ÒÁŽ™Ä,§eã%%B‰Q´à3~,³P„üÝgìX «ÌcgƒlV¯D¨»–|Á¢­aTEþÆ-¾"µ•Ô…¬¦{eÇ&X[C(*Ñ]µÜ; ñ³‚Òl^;$‹~ãóèöî>±?‡ŒyŒjÝõÇ´èVöFSÿ/ÙüU—Ê·ŽáÐǷлONÌÅ Õ¾'0õªó”-°Ð0tUHi‹šXŽÀ¬^Íe'_ϯ}Íq Š" ÃH<ëX˜Ñ±ˆÂ~W?F^ÛÑØ^\* ì›g9jÜ]xºvÇ-lêê$ƒÇMçÞ †áU¢ù÷l Ó4±%ÍÀ¥kñ ŽE4jâÈø•¨†"p„‚®9ºŽËe »ÜxÜ ÒŽ5c8„PÐ š*ŽMÌ4±b‚g_Ëíî¶XŽdëÌû8çÛ|¾}î2RU‹H$†Ðt ]GàX&јç^Ýn„c!T‡˜%¶"uUi)ã=Žš´Tê×ýD‰•K÷ޙĂnÎzå#®éç#b7ÎO\òw¹Ýè† GC:ñ«#ãYšáÂÐñ¶ØR"4·KoÒnWS’ !t— Mi(–ªËîX8ªŽ¦€31cö^HW¡ÔòÈþ=¹ßîBŸÖÑú:´ÂÜþÐÍì_ "Ð].tuO{c¶DÑ ¡¢©…ÃO㦾iè"‘°FM¬o³ÀD5ܸuÝpƒ?L£1‡úŸg3îÊ·¹áÕWšë ›Èfï;v 3±6ZÚ/Í«±dÂŽ~»ˆA×ÎçëiÝ0£Ö¶ç¼ÏõèGMâ³'¯¥µa!Ã0kyÏ:¥©ï.ÍÀåñ`( „†Ë%ˆ™‰µ­jèšÀŒÆâëßÐâ…8шÉ^]ÐíTq÷Ð^<­v¥g+h}=®N£¹ëþkœ«"膱g>¢QbŽDÑ !±…Š®*8VŒh,†DÁå2°£,™X›.ÍåÃãsˈùl¿¶#µõ&Цþ"ÎYZQ¦PTtÃhZkYsyМRÕQ¤E$j¡º¦"¤ƒ31-¡h¸Ý†áÂãÕçSü¼@(¿ÛUw¡ [hèªh¶ŸùU{šÕµç[¨x K·Ô–îG¤ccô¦o/1[Ä/wñŸŽ#Q4(]:‡¢6‡sH;•éÄÏÛA’È_/D_Ä8IG!³s_òò30œZÂEicé8Ø€bxHñ{Qá5þmÿ¾æÏ$à QŠß}ߘ®6NhImˆ;ªÙ¶ÝrÂå±ya¿¼~ôæÞÜ3lc‡K¹môáx'}Æ '·bÔôÇÙ¿§‹˜%ÑÜ^ܺ@è¡ÏóàÏG±®þ^ÚÙõÔ…"(º C·ïÏ¢ÿRµÿo€øM~Š®áÚï>ýðDd]•;×ðÊÔ1œu©`îWàùñ3îù¾ßZ‡¿`L<Ÿ}ÚzXxÏÕ,ÜVLÉÅÇòt`(ΘF«Òå<þÈ“,ÞZKN¿ã¸üò1tM Qºj1«ŒáŒè䆖¦•¡ôçðê»7ÐÚ#Ùöå£óü|úPú¤»íZÁc?Éâíõäõ?ŽË'œIG¿Å®¹/ñàß°¹Ü"¿ÿÑL»ò$ò5‡’Eðö¦(;¿ããuõt,ÈÅç®ã‹¯à¥»i?ìt&Ÿ;’tC"Í2Þºÿ>ü¾W»ƒ¸äêËÙ/Û¤jÓ|ŸÚ‰ÃÚ6ðÉ;ïQ²!•1'}Mf»ã¸ïѱDæ¿ÉÏ|@QH§ÿèó¹èÄý (¥¼qí]”÷ÚŸ_½Çϲ3c¯½žÑí"VË–fF^oΛ‹ês±ô⌯¾…Ïß=–à’yúÙ Œ,i µp_.™4Ž>9^ kV¼}7O/Z«ã!LœtÝS=ʼgoá¹/ÂÊìË9Ó¦qT;%~#dãZ‘²Iõ'ÈÈN^»ç^f­Ü§Ã!\2í2†d‡XðøM|ÑúPÚ/}™×[ =k2WŒìÔò8Y‘0 eû9cü«Üf>‘š"8e/¼ û^Ñ—dÎSÓy᫵ØÙý;m*£ aý7¯òn™‡6[¿åã-’aC‡ÒèÀ} Ñ4…†mßñÜãÏñ}q@ç™pÕ9(BA¥Œ7¦ßÏ+Ëcpîd&ŒÈgÎ÷³rC-׎;†”´ƒyø•I¤nžË}>ÏÊ] ‡œÂåž@¾a6ÝâÕ’=§¸|xû†úÙ“¬šð$}|ß?õ¡nûÓ×­!™ôbUkxê¾G˜·¹6œÆUWœHžEwÕóÅ£×òÌœty8UѸ:´rÓlžúr§žu ¹.‡Òu_òæ‚Æœ{2ê÷3¸ã‰™5¨d÷ÍõWŸB+M¶ŒqI=7ƒó&¼ÎMÇå®ÚħžÄ럞Dÿq=1”z¾zì.^™½™;ˆñWOáðÖ?}üïG è²å3ÞYQI§ã˜|æAø¬Ím(^ b5›xéá‡øz}9iÝF1aòùôôEã¹$Z¦Ñjzo:¤ ‘°•à¹uW°cS¸½ÔVîÆRSiÓ¹þÊbvE$±âÕ,+“2ü„"m;àrBoÙŠ•ÑÂ47‘º]”Õ+äg©­¤Þ“ƒË'Фn×fŠwUcbÞº#mÒö¬W¡ JÖRÜB‡Î­šôÿNœG"T¾m;ʉJŒ‚ödúN’-%Hàj÷nú Ú§%ù`I㌅·ÒìÜxR¸u°(^±ˆ²¼Q ë¬4ÑŽÚŸ¾æ¦»ßìjÅe'žÀ “îàº3òÙ0óIœñ-»E‡œ5‘>?û IDATs‡wDü³SíIRiIe¿,{V¡P4t]Çí PÐý`®yä´ùOðQ‘Cý¶R|½G3ñÊK9Ðû—_ó<¥õÐoì$†vêÌøëäÑ{Î%»v ÷NšÀêÀp&Lº˜;žãò©ÏQ©iüüÅ›|¶)‚¦Š8'Û‚ÒŒ5$5-ô´¢u8y¤*fíVî›t9k2áò‰ÑnÛ3L¼ú*•ÝëvRxØ9L»òl2¿¿nþŭаs-/]u5 óOæÞ»n`D7ůÞÏ[á}™4á$j?º‰kßXŒ­Ä˜5õXžÜXÈyWMf„÷ Î=þjÖ+Ê—|ÎÌUU¸Só8hÔ‘tØ÷xn»ç~n™|Ö‚—9wê+d>–Iãdó«7ðà'«qDˆ¥o¼Ê‹37rÂõqÕ õL=çF6âAmáxEÁíñâñxp© B5ðz]„vT‘1è8®¼òbËù\píÔZñ¼Ôµß}ÃÛk5Æ]q1Ýv½Äe×>A™îfùÍGqÁ;&']13{lã’Q2/âÂP~_DQ”L9·wâüÉWq°>‹q'_ÏfÅMÙÊoxø²éÔq NÚŸYӯ擲ºÒÂ~í1Êâö¥‘‘™EªZEI¥$« ·[aéô#¹ä‡“'Nãô®›¹hÔE,Œ¹ ¯æù˧±¼ã9T<þø|”*vÖ2ó²py]$W}apú¤iœÜîGÎu Km7 EËyzµ¬é}÷OKÙ{wóêò°*Yôùl «¡@¬”Ù³¾Áx ÇvÎ$ÿØkyò‘[8áè¸|ò ÜyÇíÜ}ý…¤ìü! a×òÊUgòqC?.¾j"ûšosÁ¹wQ¬”,ùŒG&ÜŠŒ=é@¼íNäîîä¼Ãs(~ëFN˜¾€Þ§]Æå'õäýë¯`ÆÚJ´–ž±£òo“ü÷dúÕ¡Þ(ê‘Pß82ÃÝz0]Œ¶l®¡`ä)œSSGÈtè1ö f]ü*««"–Ç0HËÊ%/×EÙò™Wן;ÇE¡£õ%SY6ù9VŸWAoCK³„ E U¾ Ó#ÿ©¸ÇÝÉ?K®Gg÷²÷YÄc¤bRpÉd–]ý2+¶œÁÁã&Ñ®®ŽˆtqåuÇñê˜7Yç(¶‰:x<×á͵í¹ùŽSé¦Gè|Å­,3…9.çÌδH3$JÅBÞ}Kgˆ³2{ïGï, î4ÚwéNЍ£&%—½SíŒ"%R1áJvG$izâJH5Cxòr VU`­Õ›¤æpìh\‹ŠŠbU±yk­‡Lïì•ÕYn+&AÚTn^Iñ#¥­^OU]8žÒYv˜;ªÉè¹ÝòUªk%­R$Ûê5ÚdI¤;ݺ“¢ÔS÷»ôæ÷ך”bso€çöD¾= ŽÑ™´=&G!%ÒiRM"t7i/Š '7´„é3–qðÕ÷pÊ>¹8Zg.Ûï îúügÎï•NÌúg)ÿãf”ÿ-o‘Pù ˆ5´¼~…M?ĤǾ",\xµVüdsš%Fó9T/c͸ñ¢±hŽB%¥÷di;~¥êi1_cE ¶?›9o\CÛaû¼g;}:ýú¾J§ËX³j74~OQIéuyî óÊM3·âöyñ8;¨©*¤ÁøAVÇlt)iC^ï¶ø°AV^.FÃ*.bs] OL8‹l ‰‚¯ï‘ 5¢MªSAóëÒŠRS³…å3悹/Ư(´;èPÕpãÏõʼnt‘â2 ™ò‰¡i6kÞ»‹iÏ- ¦¹ð©µ¬Þ¨QgK„¤¶Î&#Í‹”†;‹V©’ÊõKÙf7ðþÔ³ùJÚ8Ràn(ƒ½QbÁ=}“ͼ¤ÍíKØXUÄ£—áÛF¢àï7’C(1[%»S&2æ …JÀmSqK©åýrÜ>N¹ësî9=ŸPÙzžš2ž)÷wç¥ײÍnàÝ)gñEc{;ÎPoÓRÈ霃æHPšµYêwn$+$iŽDÚ¶Ž¥P0¤ J4†%t²¼°2ÑÞÆÎ Á+ùqá.¦\¸UJ„¢’ÒgÕAuï&JBû~Ç }ü"7~²Ñ÷=H áG4PTÌ«‰¤t¦S–‚‹@æºúž¢xÓvX9œÖÉ ³0ÒÛÓ)FMÂ\ÒØh‘ÈŽcb·>…[Ïûš»O:†:Ñoø‰œÆ025ÑbÛ§,o:ãþ„ëÉ!Xº†G&_ÌOõäñÃV³Õªå«ÎâcÇ‘O·‘䉳2Û¥£Ø©*xõxšRñ‹CæÏs”+†Aé쇸þ‰&¿z?íR ª–-aÃö5ÜséÙ¶ BÅßï0 u“í¶J~ïºg«ÔUÖb:aÙÄl‰ •³vc˜îä­^GEušg´sbD“ЖïY¸]Kh8ܤ¹Ýx] Šn ‹¡ˆµ÷ç™*÷¼Î?×Ó'£-mzwäé™OÐوƿ§ª8Å3èw× ÆÎŸÇ%}òpýxY‡.Ý»ÒØ?@«¶Ua)Uëê1 þì4²Ý­™úúNÈl ê(蚊mVò±-1vB(("J¤¥ÓýÌ+™yõ)Q45¡.¸11fñ\ÎÒ»L8ÕìÍ {$Z˃}Á»ßà†áðW|ʰ÷ǹd$ÁÊ !Ü8v˜ê‰?¿=©–ÁÉO}Ëu"c ¹ œ† –½è4þMűÑ2Ú“›ÒžkßœËè´LÙ8eÌpdB¢ûŃ܋»%¤D ·7@  %å@N9¹g¸€ª1]Hu\œöÌl®îÞÓÞànæ>f7~¨Ù=Úñ5æNÏ£¦ªœˆ­ªUCUÌ&'§„“Ƚ§IEÄ9n#Кvû cÆÓi¥ÆІFŒÚºì½èW#Ò[w¥¹Š{vÂÂ^Âß&Ö‘c£f´E ®dwH¡£Ç€úm”„\däåaJZD¬Žšh4N$…†"DßN¬–PÌÁ´R9ᎷØÿ¼ulY?—k.šF¤ïlîìï&lïE³…ŠÇ šJ 0ŒŽéÀÄï–PlÒñqÎó³™XŠÏ‡aà„ÊøjQ ½ÙœH$Rèè¢1C¨Šb×P¥IšŠßC†Ö=Ǹ ^eøcŸpB/?¶e¡g¶'/?Ìï~Á¾  º¦`ÇJyÚ‘ ­¢ƒðeâ( ¾÷¬4ãm“ÁJÖÍs¨ÛUCÔŠ;¥Å¢Al^2HaÜ‹s¸¬ HÐ膎.ãó¯í8ã˜HÈß»ZFZµ±¹çÝY ñ…°QÑUÖÕµ[z¾‰F¯k\ªEe(Š€pÛJôÉqgÄ/÷”H¬QiKÜ9Ù(Ë6QꤶËß²-[w iR<;ØÌÇJ30ˆPŠH0 Ä}½™ôèÔŠòU‹Yß«'Ù.ñËý+TG!£ï J“„„têXÔÕ;±§½{{ž!†/ÌÌL̈ƒ‰áÕD½h:µý÷fç¹pyñXnMy‘×OlK(wØ‘ªBÖ?.¿Í¿Õæ/›©ses‚#N¸’Å%m\Á[·É¾çÌþ7?Äá9 n-FqµŠß0ùöí×X°®„D5Rp…Ë(Ú¶‹p4LFSéWýÓny‘õÛ‹Y»ð#yò%~ª¿)~ÓŽ?(µYÇŽ’bŠ‹6òÑK/0gK:ûµ6Hï~*½ÊßbÚí¯Ä¿·`&<õ2[LJ-%u~{ Üñ !ûWT)áë Ä–>Æ5¯.§²lÏ>=ƒÜúÕål.軞©ã¯eÞ†¶þ8‡§n¿…9åq³“D¢ðR¿q=%5AL<|èp6?>›ÞZLÉŽ"¼õ~ö±FuÁ¯3=4s°kYá—õè^üZ”í5*~=È'3^gEQõžyݼ€û_úˆ]5¥|ñä ¬ñw§ó¾grã±&Ó=›·Wl£dó÷¼4} ¯ \êžÕÔD'‚ÒîLÆv]Í´ obѦ~^5›'ï¼…•{ƃ¦#²±_{3Ï€´¨«ÜAIñ6,}›ûî›G~»®ø æ†Ñ!n:n,ï®ÜFÉæe¼tÓÞÚ¦àJØe#Ñx4H‡6}#{Ý«Üóò·ì®©`õ‚ÏX¶%DüÜ”¿ÉÜ¡»ý(•%lÛYAԌѶÿ ä¬~–k|Ÿ-ÅŬúö-zé}Ê¢¢ek¸ÇÇø»>dÞ7×ÓN'¡A’`›Nedêbî{à=vîþ‘‡/œLI×3Þo0ã÷r÷ øØòù{,(*CJIjV!ÞkX»;‚—|ðГìrP·¿Ç­Ïb·–M»‚t¬hUSö0-š‰tbԔ¸„u‹ßäáG–Ò¶mG<…'pí5\âùÌ\µâKxaúTÞ/Q>#²ù‹çwµ¥Gf5+¾Û‚Û×ÀGÓocæF7­r5¶/ZNYÔA­œË…cï%ëÆw¹ùÈB4L\ÇplÆ<¦Nºå?—°yÅ—<~߃¬¬‰Gô$(!±Ô¡L;%GŽ=•gæoaç¶yëΫyz­‰ÛPqÖ¼Ï-¯Ì¦¼º„wŸ¼ºö½(èsWVÁu'_ÄÇ?n§xÃbž›>™;TtuºIp°M<ÎäÈ”ÙLü ?l-aÓòÏyì‡YU«6¥býëqNŒµ¢¾®Ž`C=Áúz‚‘Øor¿71Ö¨¸ …`Y9Q+ÁðxrH¥”â ¿ÏM ÇGí†MÈ@>nb{U)‘Z:íZ)¬›½„òˆ¬¦´"]èÕAgã’”ÇÔ_h¥â¡U^ Å‹æ³~çnjªvS¼~5ëK*)¡Ë½8ÏöDóƒt°mǶql)ùmNù‚ƒ”XîöœslÞ¿x,w~ú;K6ñé“·óÈwehboÎØ¿Gù·Åùÿ©Ê KÎÏwrÀ ¡8ò4îú:Æ”wWòî9m¹î® „ïEn‡}xô•ûôÂ%ÀHmË)göå‰sѮǥlËÄ]¯bX¿}¹vq;î¸ÿ:Úª £Ÿ^ÈÇ”0áÐÞôÜï$žùQ§mš@è{ÆG(>¿MH‘ÅE3>çhëmŽÙ·7ƒŽ¼„/wg’ëèÞ).5±Y.ÿÞÌuB’ñ¹LfÝ}ûî3„CŸFåð›¹÷ºp‡Žyn1÷¸•KîMÏýNá¹µ. SíõM‡”êò’âÿ;¥ÝÜÿĵ”>!ƒûâì;gQ£ºpù\j“$çòðë_A/N;*ƒëëK§S¨ìr½p;‘÷&²oÿŒ¼èaJ¬t SŠËGŠGoê¿îñ‘âVJ:§O¿šwBnë,Þç*FæXÁ«oáàÍSéÔf WÜð 뇅×L«œVädçÐú7à.àªï3xçÓ1¸CŽ›ÌšL2=gKÜvlFÞù)oœ§sÛqè6pwÌ®£Mª‚#u:Ÿxý7?Æ ¾òXÉî¾á<2„›“_\ÄuÝW0vXozt&¯mñÓ& P›÷ïKAq·aꌷé·íqÔ‡ýŽŸÊ’ºL2=¹7A®ª wh ß|³•+¾gå²ïøaKº®¢jÍ!P5 !iº‘QóŸ~±meõ8ªŸœt>_6)ºƒHÉ&EÕäå¡Úfü¢-†ë8‚ŒnûÒ§U„5ßÍc銵ÔH¿KCQ5„#³º¹)úqA©ÄßUã^ù¾‚ ì dõb¾[¼”¥!üiøTå—íÝ›½ÀÈ Å“p¤UBQñRñ¸T¤¸RRñêñýjøSIIh%„á%5Å…ìôºð>º±73ÎF÷¾Ã¸â•Õ¤ù4þ‰—Ûî ð›a¿fêdyÇÝ÷RYQŽiš¿©LÁ¶mÛY²r5é~2”c[DÃ!¦MÛ¶…ì?ì`Ün +f!4…HC¦ºË‡Ïc `R[Ý€Ô ¼^oœc–f$D(baRqE먋¶<ä"Žðá¬OÉLOC{$ºh(HC8ʘ1c°¥øïņ÷ÿ±wßq;ÕÿÇ_Ÿ3®}/·½2ŠBËJ…´‘жJK}[´´7•ŠÖï+JJ¢©¡¡aD"Êæ6ïqíëŒÏï뺇Uú&QŸçãq}¿¹Æ9Ÿó9ç>ïÏ>d½hÒ!™tñx!RAzý I8–@Jîõ0Žfâ35œT‚H,ã¦g@øƒA¼†ŽÀÅJ%ˆFèÁlnŒâ¸i á3u¤§¤$Žðø |éÒ¦kÅHXÈÉBF‹‰Û„N0;„)&±—M±Ñh”÷Þ{ib„r ¥JõºÛº=¿Ë²Ñ x8‚% ‚ÒÇ×"‰¦á o DÀc p±­$±hé 4±$h&Á€—d4е»üHƉƒ¡|v„’„|YÙ˜É0áÔÞk¯×ÃøñðdåÐÒýž ±S Š‹ÃtìÜ™ÊUªâ „ðï”^¼šC8žÌœOYú¥覗@À¡¥klÑH ÈÞCzÁãô™™¤¸(Š4¼ƒ~ M€tHÆãÄSÖ^ÝL4Mcñâ%,ùe59z‚ˆµCSžnú x%……Ŝ׷šî! àÑŽ•$‰•͉O_cDz†-!jé  xÒ!•´Ð4ˆÆmü¡žÌ<÷T"J4níuHòx<¼öúøsòv:qŠŠÃœzÚéäæåã w8Ñhá Ð,±Tz-ŸLNXh†PÈ.\Rñ$šÇ$.Á^²²‚˜š$™²12kd”Þ£ÜD˜â˜ºI L¯Mƒ•H‹§0³rð¦*Þ[4< ¯‰†Ä±SÄ¢1ÍCÐgâ á5õôõa9éÂŽ7Äoît<¾‘¤$f长¼n‚p"½^G Ä£—¦'N,‘Úëu ¬TŠmÛ ñçU&7S%³.C^–Ÿ¨ë%`¸„#1\4<þ ~Í&M¢û²ÈÍ ¢¹ жa “P^n¸hÂÆðg“”“´%ºé#ô‘ “tÒ‰ åäâ÷èH+A¤¤K÷—íO “`v†!œpñgg!#Û‰¦Ò÷@v.AŸ ‡T‡ 'Ý"þPÉð6N;£•ª×@I7;ŸUBIÜEóÉöÚ‡“e-Ŧ/@ÀïE'½]<#é|Sýt]Çëõ²ySÆ +5úåž™"@Iæÿ#@ôðç86ám›‰»-y¤R)pRDŠc»-mØÉ(ÅÉhùü`Ç".Þå‹©p1©?<°M)ÚŽî:ÐN*‘öîö'Vœ’¢xyA"‘I_*A8•éqà¦DRqâ;ç•tˆGJvx!°caJÊŽÅ%-!±Ã¾„‹»LŽ—W8.±’’²tìmI0‹b{¼S$]rók€“$¼›óƒ´‰F"éia±¯I*&ÛùDÅËò×&±7?¬h V…s›Œ”üçZ ˆÅbD"¶ïôYÊJ¥§ !IÆÂ$wNo2N˜Šç3¾ãùµ“DJ’;•¢ö”^°ŠNš“"R’Ú5Å{qhBlÛ¢dëF¢ÚîÆÉL¾t-¢%ÅDwÙÏN×X…äÙ©Å©]Ï},\Bìd+„ ‹Ew=™J„ÀÝÃùHSéþìD”Hf›ÒI.®p.’I@CH‹HIÑï% \›X¤˜].ÙÈÎ÷‰Pßùf—"MŸË]þÖqIFÃ$w¾q%¢„+lÛŠG˯×&Þ)=àïÙ•Ÿ×ƒOZéeiËÞw©T¹©m[±J`—þ½–uÓ³%V”ž&*@ˆ$%[6eö/°ãÅlŽ•Oïví%E‰²ôI;IɶŠeÅ4G(.=wÒ"R´µ,"Û·¦ÏUúÇD‹¶‘rÇÁ¦± ¿{­Åãq¢Ñ­»^ÃÑhæoÃ%.ʨÁЧÏ&VŒbkÇëÛNÆ(IÆþçþóƒÑoÖüKo0tJÁÿÒÿ°¿¦;8Žó?©¿f +Z IDAT—÷ùÙWÍ[º¾çÑó{µXȵß<Îëõ¦i>ŸoßÔü÷$þÈRŒûÛï¥íßö¤Âù\©ãúç\ŸÿÔó¡îoU˜üóЧú)Š¢(Š²ßƒ¿¦ilÞT€ãªÒ¼¢(Š¢Ð$C!jÔ¨ùç‚¿ëºÔ¨YKe¨¢(Š¢4Mìu·Ïo6û›¦©rSQEQž€½+(¨¬REQ”üEQEEQEQTðWEQEEQEQTðWEQEEQEQTðWEQEEQEQTðWEQå/b¨,ø÷R¢^/BJÑp zx£¢(Šªùÿ ¸ÄKŠ)**¢¨¨ˆâhWJ2³6²$)ÿ¼°°ˆhj?=á0³8³“J’H$H$$m‡?û˜n!tVO»‡,¯¯ÏÇw2sõ ¦Øs:¤t±’‰²tXê1ÚŠ¢(*øÿÁª' ׃&Ø«§I B7ðzŒ²$ÿ‘ßïé°ƒþM iu( =Œ†‡Fƒþ£(JIÃÐ(Yö1×´/ÿüÐ&]y~öôý‘c ¿Æïáœó/âüsû2hÒ÷X6úB7ñ—ýËûÛ€€TáJ^¸î\ú^pœ)c~ÕðéêGQ””H)0}>Ì?#þùþt³¿‚ì¼<4×Ý1jI2\LÔr¥mÊB#¹ýgFþ„Ö—\Ëùb/¶/Ù2÷^^hpU¿Nx¢¿ðò˜9ú«i^ùBA 7E1‚!B€¦il[ôÿé-¬K×_½=½ò\tlUlÇ!ø«[É5]P0û#fN·¨Ñjîßp;ñB|þ ÓJÒÿ®R(14ÀQ<Š¢ìƒ` ˜¡\²LA"RDÌ’™pá!;7„LD‰Ä“Ƚ¹ë Ÿ±Ñƒž@»ü.®¯‘r÷YRÑ ¡¬ †é–Q×!•ŒOÚ¸éÈ·‡cÔðçä ÅŠˆZr¿Ä¿¼æ_¸y 4ìJùTª^‡š5«‘[)¿Q…ë¾Ú„Wßñíø&¦}úë£{É„$¼æG¦Ì\JÒ;¾…™ŸMe}x_GB Â$±á n8¿?,§3ÈÛœ‡Æ¿ÊÇTÅq3'Mʲ Á …2¯ ~Ÿ=SâL÷"¤K¢^ ì{~¯‰z…÷‚é÷H_èÞ,‚>OyÝ$ÊJ?àKï0<^üþÁ`h‡t|^ -³ÿ½8v‰†7"+Jï'àÃÈ"+¤B2ð³ðde‘••EУeޝB~T8ÎP0€Ïc¢±·éPå_EŠKðIVèã—RE¼;ò6^œ½=zÎ4”çŸÎ]ëe¶VÌ[wÝÀ‹‹ÃxvÉa›_WÿŠ·é™Üzï}\Û³¥!VÎÊ“3cÔ8æLó,W6)oo¯Ôåržù,Ï=û,ÿwßÕ4­¬!Éáä>pçãÏ1öµ×xcüx&Œ•a»S=3ªoÆ‹w0é'{ œâÅÃïx’5±ÕaxïZ$’!ÐM?ÙoY 7<~²BYèë'ðØ$Áӳ໯˜0´Up°·/å™ûfö¦Øžƒ£”¸®ƒcÛ$¢1²Ž9“ªlbòìmøj6áš'Þä»9ß3wÚÿ€‰ýDó»þËU ütö9óg¦Sþr¸áZ<üó.æÛî%:òZ^Y¡É­y\2|3§M¤K|£çoIµÚ‡þšyþÂ$ÛXÇÐËû1vúj\R„£ X·9B—ë7åä¶Gâ:µ[våèü)üòÍ{|´f+k®jËäk$ˆ”D8â»MÐp×>¡{±W¼Ç»¿¬äÝîM†á‰8Ô\² o§;˜ûMŽL`ÿ±¶ j7oÇÉGÖÄuS;Ì‚ضe|2iaÙ·¿òež½«-¦#±ÏjC¢ukž_ °†á#æróØ.h‰2½Qg1‚Ó‡HnlCñ‚.Œ[™nò™?c-¾Ž‡sfƒÃq^¾…—¦jÖ–sÎ=+=Ò^J\)qdnù4~#βæ±líbI—œÕÈÊÑ)ˆ;ØÉm,˜½yxvi×b5ÃÎ;ÏfmMºis;ŸL¸‘F! +îPë„ô=´³‡?ÎÜHú »ôåÂ6’ˆ•îë/^=OÞY”Ùž‡KFçŽÎÙ8¶€n­ÙöaC[¬Ïðïîc\çÕëyË>mà p]wÇÑý™Ò¦ëº¸®¸a>v.uòksLÇîô»ø2.pîü/Ë œÒfbEE8» ·+ù4ø½ÇßÈ÷ïÜL£8Nz`#ÒÅqÜò^º®“N‡”)Z΢²üHñÂ)ùab˜†?ø3æÌZkh*ð+Š²ÛŠWãÇÁ¬ç¹mfCnïU «â .é"„†™;’ÈÜK\)<ø p¥Dê&^]¤ï[ÚΕv‰ëÚ$µ&<ýÃ*Þ¼£3…á¨ú½™1ð²ssñêÚÞÓ4ÜíËY\¨Ó¨qˆ™¯?ÊS êòú¬ŸØ´þWþ{S3RIk×8#Søødc Û7°iã&¢Ñ0ÏuË"‘rÑ=zÙþ…e±óþâÛYYè£{ï9$K°jþ–.ßœé1DVý̬9?‘’’‚%_0kzmzpFå<öø¬)Š‹lç׿°¼„Ý6YK'…Ù°;Çz¾áùW¾aK$N¤hËÎgCB‡âU|7÷g¢BÛ«SðèNtnV9ó¯8Ÿý Û¤3½¨2³ßdÙ¯dûË/‰Ž/ÛW¾ÑT””ÜyJ‡N¶?€IYAH7ô §Ø«,6|ó‡öä‚Ç?§ XVí;rúégеÓ1ägée…é:¿;Ð.Yð#ÓnA÷ä^wÍ»NŠT…Ë©R­:Ô©]›Úµ*¾jQ³J•uµF¢({ªýûë6ãÔö'pâ57Ð>dc•Þ‡\›à¡§½e_/ØŒëÆX<åUVšÒè¨6´¯¼šñS×ãÍPòãtFЄ ;+» €ˆ4ñcÙ¼YJ"ºŠ%«“}öͼöáktÒ¿ãí廘¥ ±%nïyÕSéb[6V2NᆥŒ}ð1~¬y6×¶2Y¿q3ÍÚ@ó:y$¶,fú§?bk>Ý"Ráb6ìF»àlFŒšÎ¦Hœhñf–ý0u±Ìàöý04jß5ûgF4F#Iœà¡\Ú·ƒn¾˜T'›ml‰ƒíJ¤k£™Qæ½ÿ$çMØÆÖMEÅ´jx$Íÿ;”o¹³¾Ê&è1Ð=µ¹âùçha'Ç$®)m¢á0–ma[óÀS×3è‘þœõj%L¡‘SûhnyúXrçàô¾kù¢à}ŽÞ‹¦­Þ™<çu ¿¾?ÏMß$ùôÑ\¾¥¿œšD±¤Ä Ô P@˜?âižC4ââñZ,ÿfeùFk5N×J¢UoËÿ›„Лç§oâL}W Á¨G.¢’HªÔ„víMæÌHGôY÷_ÃÛm_çì&æÀà©åE¶—ŸH–íüO…8)u‚!^o`õ¤|*{5ÛA“qG'½ÚŽCÜ›Gµ,$¶2aôæÿbíÅNªrñ£OSsû™<1u#|ǃz|u2—¶ôaYMóà­Ð˜±úû5˜›’²HF£dWmÊqm<Ì›•\fŒz‹Aï=L»,G p",œ2Š;ŸXÀÀqO¡I‰PMÿŠ¢dHmÚÿß|æk•ˆG­ µ^ƒv=ÁDÛ$Ç¢óµOÒê¼Bâ–ÄÌ%¿RvÎ/ (Yû1}šåíº±æ×ðd·Ú¤l‰÷ÈLÇ2iÔ¹Lþ&ýòùÝÔ˹Ðh~öL}}OÎâƒ÷·0çÑs9dBª$V²bc¡Áï·±KÌü&ÜõäÓ,î;€)KŠˆ­›Ï×^Ií±Ïqb½ž`6µŽÈ†õé%þ¦ßvÚmùÜúÕînÑ€~—^Í' žfeÖóÇTŽúàInç×_7’.†´ä2Gî¹BQ”' ÞJÕ©žùïŠ-¢Þ`î÷OÍ P¹z`ǃ¬Ê5*Äœ²O½¡Ž*(ÆE§Æ¡GãwÒ—O·ëFP§‡….\²¯ƒ•tÒ#í}­xpÒ$N±€Å d¦Ï?ï#È1ìÜ“þÎ$z=—µ…1\=Hæ]³Ó;ž …6RóÐà¨:฀$ÿÐî<óx’¦†¤‡¸IR ßÑýyõå<Þ[T„©ƒµp,‰‡–g]˨úÇ1éZ¢6$¶erÔ!>,W⤼´îÿ0ožróýÌÚÍE$‰&¡J•©U§¯OŽ.)H (Š¢ü}v¹ ß>øùðcÃØ¶uË>_QèÀ©ôK$M¯0í,3w^BÙÍBhh;LeSÜ@ Dé«â¦eÙ‹²mEzÀ^Ù’Ä.Ò-݇ÈL_)«šgž!þ©BÛ±©<½}73èN ´òã(Çý¹né´ÊŠÇ$q+,»,´gFH×MO1É,¯¼óõPúy:©»Ï²Yje?EQ”¿>¨k[60lذ’Q£_î™y;”dþ?Dÿ5ÿÒuæ]w—fhQáót°ßõåÁ­ü¡6»îBìP¾* Ê;§awŸ•?1³wwŒ(OÇîŽcÛÜù˜*.b$Ý]žXú»òÍî?¿“Š¢(ÊCSY (Š¢(*ø+Š¢(Š¢‚¿¢(Š¢(*ø+Š¢(Š¢‚¿¢(Š¢(*ø+Š¢(Š¢‚¿¢(Š¢(*ø+Š¢(Š¢‚¿¢(Š¢(*ø+Š¢(Š¢‚¿¢(Š¢(Ô?fm)%BlÇŲƒf}y躆ihÿÜ))Š¢(*øÿ%ATR¶Ã„ÏdáÊ"R¶ƒàÀ¦º&¨• ç ¨W3_EQ”?ø—Ö¸u]GÓþ¾^©óÆ{sÙP¢Ñ¹Ãñx ƒƒ¡òﺒÕë ˜ôÕ2n8÷xLCWW¥¢(Šr`!¶m±äÇE¬_¿îoyn»@R)7‹¯¾ßF§.gP’Hi4'!'¿ /Çq%¦º&EQ”=ø»®ËŠåËñœÙ½†ñ÷ô$¤âÆLŸ-«bÛÎAu4MŒ««QQE98‚¿eY„KЩߢ%%ÅEÛ„ü^¤trÅé剸ç¹÷©®HEQåÀþRJÇAëºÛ8®ƒ™r`ÛöÁu ¤«®FEQåàþ¥\Wþ-ýý÷_:VN"÷ë8)Á0M.–å ›&`Û{?î@×$jœ¿¢(ŠrÐ)%Rº{Yó¤g³É}:_J‰©¥Ã§tÜÐ¥c'p2o MÇôúðš:{N„@—d$Šô…ð{úªÀãuùøÒÖ ¬1’_>šÅcsÞÇùLýòLñûù†‹¡¦ø)Š¢([Í?]Ø1Ìé¦L‘°Ü²@é¦ Yüà ªÑŠ*þÝ<¡x4HYö^÷‚»®[Öì/¥¤´-„`ÃGOqâ¹wav8^\¤î§öÑ]tçMtnÄv$ša–O³smR–ÄôrûQµI¾’`DG;™DL=³qi“JÙX64½døÁq\Ð |¦žÎºéE/éZ¤RNú¸DyÓ®ÖZTEQö“}r¤”¸™à_úÒ<K^¼•;__…îÑÊÞO…×ñÎ˯òÓ6g‡ï—½pÙ²àSž|íK"–»ûïìæåÊÒfÿÌoÜÌKºMà=òj>øj&³¿™Î” ÏÐ%ñ&g÷{ˆeŽ‰Ç£±eî[Üré9ô:§÷AÌc²`èõ¼U¨3åžžœÑcßÇYöÎP\x6gõèË­ÏEÌ4Ñp)^ý3K6D3-Yš/V„é¯ÜÅ}zЫυÜ7z6 ÃHÏ-šì§(Š¢DÁ@º;jaÀú¯Þä­Y[Ñôò®OîáÜñÔ0ÚÖH4ÓK " ð™ ^°ŒÏ¿ûÝ$è÷€ë"t0H0ÄïI·ÁïPp%†¸·BZÊÆ"Ã0ñúBT?¬ƒ‡?@½^à™yIóÆsþÀ‘xŽ;‡+ûudñ¨›yðµo©Û÷?œR=À —?ÀS^M£,Ɇ¥[hÞµ?/9‰UÃûpöðåè†ÆÚ/&2îÛMh¢´{@"¥Æ†9Ï1è©9´;ÿ:®¾ ùñÍD2“Ò4ºèªÕ_QE9ØjþÒuq'ór‘Žƒšeÿv]IlÓ<®ïÝOWZâ|9´‡×®N•ªµiÙûIV®ãØÿÖƒ4;¤&MN|€-^ÉܱwÑî°:T«y§\;‚Ÿ·[¸®S¾Ï £ýÓCþ\$næ¿% A¦ßsÔ8’Vy –.ZͧŸ|L^× ìu­ÚÉõçwàë/¿EæU'Ï£“S½ TÇ+=´¿énÎïx4-:\È3OžÌ¢—^¡]ÓH9Hï±-+ðÔiɉí帓{sÅ€3ȵ¸™´”¦ÑÐPþEQ”ýâ/ëó—R’iû®PCw‘LÓDèÄÚ1Ü2bÍú…®•¶ñÃÜÕ„²êÒÈ`~æãõ'¯"ÏL°ð­§¸ÿã÷¿?—6U#Œ½çžx­>ïìŒ7Ó\ží/ʃ}iR*ÖÄK›äàĈX×eû֥̘´€H—ˆ4AµNmÊ6!3ƒ…»‰C.ç±O ð‰_‘‰\bˆLñ¢b÷…Äu-j¶¾ŠÖ/]Åù]gÓ°QsN¿`gwh€é”?|È•MÔ ?EQå` þÒu±m{‡Ñþ¶-Ó£@L IDAT륃mÛØŽÛÆEâØ)ììº4ÊÙÀÄgG?©=§œ|4¡T„eÑ(VÂeÛÖ­H#μ…³Ø´ÙaÜc·1ˆ¬^Íœ‚å”$:PÉ«eö'0õtÞqʼÌD Mhhšá÷›1™¯Šk3äøªè?T¢å7óÉÝ]+üÎ%_‰”¤§û`Å«ÜóÛxü§oé]×õIòûËòA‰¥»’"]øp]üÕŽç‰É_óó¢Yòíhn89ó§Ñ-/Né8H)3]Š¢(ŠrÐÿÌB?ƒ¿æ¤À‘.Žãà”7 ]+A*Ôž¡¯?ÏS>æ¡Wpïc§3þ­Û1Ýt³½ãº8vŠHI’V]ÎãÚ®G¥,@÷çÒ]œÌü=[™&~wǧ㠩 6®Gè1–͜ķ=J•ëÞæ²>6ŸÜ‘{ûß̇U⺓j±zÖ'Ì1›sñ)õ©ˆ2cá2"íÂÈÃã–‘~ˆÇÀƒï"™ã¥Mþ™—¦S0{o9ŽžšÒdµ‡X$ŠÔÓ%…ò$ªŠ¢(Êþó§ë›¢B [J7óªØüŸî/}¥?“ $Ò± ÖhJ難0þý9zÃÛŒýÉÂojà8Hé‚î¡zõ,_[DN•êÔ®]“šÕ«R%LJVaŸH7=Ú_ ¤¸.¸.H)À“MÕÍcétôQ4iÙŽK†Í ãÃ_ðÍCÑ’’Ú§\ÏÛÏöã‹A©]·gOLøq­lκÿ–Ýw<¹Á™¢õaÌC͹½‰—¼fwRçšÞÔòé¸4o€ i຀á%àõ€8©BÆÞx‡TʧÕrýÄ÷èž—Är(O£+Ð5¡úüEQ”ƒ¨æÏ®+ü¥§¹Ù.|—矛ƒ“r‘ޤVÛcÁ¶pðàüò2wŽÙL“#ê`lÇʪm8·–AHÔ"°æƽá§~Íft8­M=Êíl¥]ã|ŠW¯„VÝÐéHÌÒ>)ÓþDf…¿Ò©ø®¤Z—«ùfó ;¤ØIʼn'-¤€”zÜÎìsï)ûÜŠGIXµ:=ÀÒð£€$ #¯ŸÄ†›5ÀŶ$Cn”D‹ÃÔù dŒ’˜MÃs‡0ýI$š ·ýÌ^{oÙvíD„XÊÞ¡{_âªfEQåà þåƒú¨<½è.îXÁ²\L?HÇÆªMŸ+.¥ZŽ y'pf›ïY½%Œ“ßš{žéLël7pƒ®|·¬€p$‰Y· w=þ_ÏœËÆˆK¥ÆÇÓ²y=tQ¾Oé‚©eVÓÛ©]¦„S‰ßl½p’qÂÉø.Ÿ¹©áT…7âa¿„À–ÎlËMÆ '3û¶â„­ø®­%;¥QEQå «ùï<Úß±ªµíNßv;—\hxBz]êr™‡Ð¡Âg–í~;îTŸ©'På0NíÕ¨|;¥sùKƒt¦Ù_HÒcïåAÔˆ.QóüEQ”ƒ­æŸ^^w×µý]~wµwï?ø­G¸®–ð'ÄŽKç±?=Ï_EQ”ƒ§æ/w»¶ÿ~  Rbêå1ÿ`‹£jmEQåàªù—Õ_ÿÎàŸ^"÷`0§©à¯(Š¢LÁ_~zžøÛ­…–n7?˜[Î ÃÀ0 uU*Š¢(é*õn»Ô„à/ ¸¸˜%?þø·g’¦i$“‰ƒïKðûLùðµÀ¿¢(Š‚ÈTëÖ«Gƒ†‡¡ëúü¥„ ¥ÃɈ ³, ˲ª“lÛ'uꌦéêŠWEQˆ„K˜7wkW¯¢~ÃC÷鸺}ÒÆìº.©T’D<~`”˜²aóB"á°ºÒEQ”4iv_9•†‡5Ê,“€ÒÞv¡æ«ý+ ,Š¢(Ê_O7t¬TjŸoW1WEQ”Õ_4…MEQEù—QóÊEQe_WØ¥Da¿9R_J‰mÛ8޳_»UðWEQ”}L•²˜9cK—.IÏÕßÍZ4¡¬,Ú´nKƒ† ök@EQEÙÇ\×eîÜ9˜¦É5¯Ç4ͲÒY–…+]ËbÛ¶­|üñǘ“:uêü% úìŽêóWEQ”},•J²bù2ŽoÝ!ÉD‚x–ü„Àç2º_k„ÐhÿßÍääÄÝïx„Ð8á¿›ùuµ¤¾¢(Šò—B0cæLºuçõíW6 ¬™`?û[‚¿éuø|pWjÔ¬UþªQ‡6½2úó¥Ä…‰–y<¯nzðú|ø|^‡ÿ“ÏÒO'1bÂw´k:ˆNUl‹A$~æÁA70òÃÉ:¬9ùáe,{õWNêÞŽ*^W]»Š¢(Êÿ(•JqË-·àóùˆFc$“ .¹äbñ8–eý-ÏvùûüIו£ /éÀú¢ l]<žÿüw2«c–l`ãòWié±™7æ6–?˜7n;Pã܉…Wð`·\öþJ¶.ù‚ñ¯N`òÃÝñº1¾=Ž¼èš†h»ä±€ðF–¯_A*÷|Þ›1ïÚÀ†Ÿ^äÈ\W TEQþlE×ïße,›Çëݧé=¸‚¿ ºiØZ˜ÎÃCjÕÖK—dá\Ñ<Ãþ¬ T¢zu‚qìÌhIéZ¤¤°×óúàS¨\­ÍO< ÿŒ¸ ²x#Q´=è“ò›qÖ‰gÐÐ|›öÕrɪҔ~÷M`mÔA¨¡€Š¢(Ê­×B¤C¬a»}éº^ößûÛßÞì/t/AMgÓ‚·¸ë/Á!µŽåðÃb°²qÿÄ×éTÉBŠ$«-£^mAÙc…‰GøHý8Ž{&."TãTÆÏx•º]KÛ›&–Uõåoœ"ÇÉ¡÷=#iþOü¼j5Ó'½Èã¯ÜÎÃÝzñÆiÕH8êBVEQþH½V°~ý:>˜ü¶í¤§”K Râ8Rºeï !Ò¯Mð°í«4¬7ˆTxÛcב[îèKµÃÂÜÖînüò'F ¾™GUaíÜ™¬NÍøó.¥zÝl ¶||!­»õ`Ð9^‚Àöð"ÞyéiÖ¼õ%1 ¼{Ñò Ç3¸ßµÌMÖã¨zY¬X´€ª!]öWEQþ0MjT­BåJ•Ðvz°ÏÎ}üš¦‘LÄ÷ÛÒ¾ð75ûK ºÇG àçEÙ²i)oμæIæþ<™u‘x.W¾7Ÿÿ»¦îª¼ñÚ{,sërÆR×NQûÜ[|jcDrß~þ+rÏgòSRÓÙ¯|ÆñÝÛR)ÏßçA†×‡ßø  ¯—€)ðê¼U8®ec’?Måõ×Þd^A6=îžÈÝÇå“tTôWEQþxåÖãñ ……Bdee•½Jß«øÒ5m¿Ž0Ûÿ5)±’†NfÛðKCÒN%H¹Õ¹øé)\ñliEâ¤Òk#Ǵøçßx S€²ba,}4kŽ$¶åòàP°ˆEé7j*—ŽÑ QBq‘ä‚—¾à²—3ÿNÂ…÷ãò‡Ë³CZ1¢q 7}EQåcÿÿL¿†Žï¾¸TÞ"â’Œ…Iîv.ñpñŽïÛQ¿/k! “*kbaÇ HÅ£¤â»-¼)Š¢(Ê?Šz°¢(Š¢¨à¯(Š¢(Š þŠ¢(Š¢¨à¯(Š¢(Š þŠ¢(Š¢¨à¯(Š¢(Š þŠ¢(Š¢¨à¯(Š¢(Š þŠ¢(Š¢¨à¯(Š¢(Š þŠ¢(Š¢üa†Ê‚áI7 Ã@=¹@QåÏ‘RbÛ¶mïò¨^ü•æ"•R2cÚ4¾›ó-ÉDP,VEù_…²²èÔùš4izPTðÿB°`þ|Ö¬YÍE_ŠÇãU™¢(Šò?W¨Àu^÷ >ŸŸzõêẮ þÊE×u¾ùf&W\qùU*« QEÙ®ºú:FŽÎ-ƒn%‘HiVþþeÂ%ųB*#EQöIí_’•EáöíUŸ¿ þÿΫµì¢UEQþ}þúàŸd¶sI©â{RÊý3ìl7Án—´ýÑMº©dç ¤BˆßÍûýwT;'i«‰¢(×}TÿÝç š®Y¹¯¦~ÁOÅ`hÍÐ)^:ƒé?¡Úþ™t&n*Â’iS˜ýËf\™>qVáZ¾³œ„#ÿ`:áUŸÓ»cO¦®“í…+pؾv)ß|õ9Ÿ}6•iß.¢ œdÿ–gRLèy¿S¤î&Š¢(±ý2àOóhüúê]tâk½â]æ¿p*&‚¥C{Ó#ò‘)'“Š ‚~?éB”C2%e» ™ƒ>\Gb˜H‹x4î â14pD¢ \  o „×Ð+!n¹ DYPOýʰçñV½þÌŸ9ŒÃ:áùïpÉàU|òõP š˜eÛiňÆR¸ì¼}‰“ˆR¢™„²²ðûƒde{›D$JÊ_v+ŽkúÑ8‰0ѤƒÐMü†&Ò5ÞD”xÒF¢ÈÉBK%Ñ<Þt>D¢¸f¿×™"Ž‘® <þ >Q––XÊAòfïK ÂaÙgÏqëãSÖm@J>"›ÖRxH?þ{×YdéZ¹”TÈǽÝË^~OJ&g<û!'TÊú·˜NãÁZ WEùgÕüKk˜š‡ÊmÎ"û­›xéSÝ"ä×B§xÖXÎëp8ù•«ÒðØ¾¼½x+RhÄ6ÎâºóÎáÁ!WѸFUšy' ·oaì-§Q³jN8Žm¦MèxÍ0“ŸAýülª7=•‘sŠñb§æ~PÓ*ÔÜ8…!ï¯Çg „ž.`À‰ofÜM§Q¿V*WkÌ…C§÷¥·ï1ÃLº½;‡VÍ!¿ÎQ\?i¦©ašIf½xMjV¥aûËùd Š1êŒ#èöôx.o[—ÜjGrËûëðy5+grûÙÇR½Zjz¾ÿ¶éÅëx SK®y|8U¥V«‹øpcŠ9£¯¢qõšõxŒ_…Chø3žêO³yT©×Š['.Î4Ñ |ÁòÊoR!ˆ,à±{ÆsÜ•ñì3OòÈCðäˆÜÛ¯ A¹Œ{z÷äÍõ"ÝBšÇ g]ÈW1Áô{/á’q_òÂ'Ѥeùl îºÉ\yJKšŸtoÿ¸‰ dõ î¸éf^xäFÚ¶8ŠÓ®z†•Å›wç¹´lÑ‚‹þ!›é]Ë“ßć/†\ÄÅc>ä‰KN¢ém¹~Ì$‡_¿þ?z¶oAóú1ìñÜrÇpV'„ üŠ¢(ZðÇMâÖìËÃWxûØ+lÅ,/àRRäå”›_dÖì¯ÖMpË#XsN‚¥ï¿Í»›óòÇïr®ý"íºˆ…µ.ããÉÏóÞuÜõÚ:üÙ‚©×¶aàœV¼2cÜÙ˜»ôäÍí¼ºØ¡†hùsûÍøâŽû™ôfjà™d:’J‡÷`ì”YLû.âc.dðØÕø²áÓ«Žåâ·²yìÃï˜öÚšŽ€Âo¿âƒ- õчÜÐp6÷Ü9’ J6®àÓg'Óçͬy«ã.¼„J¼¸qæ½îäó³˜ø`Þ¾ÿ&>^T Âfü=ån7…û›~Mï£Ïä……xå㉴_t7ç=´¶ÉGÏq&MžÅ×£.áó[úóÂÏÌȯÜxbCnŸ´Gþv0À–Ÿ?äǼcéÖ¹%9~†aà UåðÆUÑ„Åæuk)±K³.Á¦µë‰¹ oæ³{‡°½ç³Lz #ïÝÞn—}ÈiOâñ®î¹ÿMŠl‰tâ,}ûU>ŠÇËKñstj7µÍ®åíׂ·ñä”tSÉú•lŒ¤çÈ&J øü¡ç©{ß—,ùâ^VŽ›ë,’k¦3ä¶1´¹í5¦¾|9«žº™Ï7ÆpÔPEQ”0ø®-iuÕ£T^<šn§´ו‚ú]Nãøü8‹æ/Á¬ßŒª›æ³¨(‰ŽD¯w<·¼”á‚[.¢nƒÚô»¸'[žÍͲ껱·Îí¯§8çòv„—.  ¿½ª|ÏS“7á1µÒaQ¥Çî¬ÿW>³¬)Ù U¥M—ã‰ü²€%›sèØíPVMŸA|ë§ÜþªÍ÷ÇÒûÈZÔ;º+Wœ~ÒrÐê·ãÎë.£åaÍèuã ²·þÀºbé84»âQN¯åݶgå-åý¥)ªÙжMóXñÃ| D]ެ•déŠÕ¸´`½¯¾‡3ŽiÉ…÷\O]g+â¸]¸ûöãØ0u%‰ŸyêÍÕœvigÌ5‹Xž¨Åé ¶0ò½5ÁJtèÓŸv*ïUÃ|¼`¾J5Éñ— ö¦í&cä÷zŠ;ÎhF³3{q\V”:Cž çQ 9µOWªþÌÚ¤‹&]ôC»pÛ•çШ~sÎЋÚͧ_ŸÔoz&Wõ­ÍêùKv¹Ýdœ>JŸCTmÃiõ|òsŒÍK?$Üü\úwmFÕ†¹õáKÈI$Ô:…Š¢(Àþ]äGºªµæüN•7á3npÓ·lCDùpø îý:AÛ–‡QÅØHqq˜¸+A@ 7ˆ×g`ÛŽžKõl ¿á`[`„|¸vkëz6ã!±bsE G ê^óŽ4Iì<‚\ºÄSµ8òVÆžz=¹tù@#²n·\}?±†miR+¢µ)¤/Ajë¯lÖëq\mH¤l)p•Bx|:Žcÿ?{÷'EyøqüóÌìîíUÚÑ{ï½)M‰bAÅ5öDb7*b‰½“Ø¢þl±›Ø5*b‰X±‹é½_Ù63ÏïÝ»Û;À €rÞ÷ýzñºÛ½ÙÙg†ý>mfðƒ0ÑX°aê5Ï#HXÇ!?â³"•âÛiw2ñ¦7èØ·/- ¯ŒÑ4HàF"6ÎÃK$ñÝêå6¥i¾G2éâæbRe$KV³ÚK‘¿às>\"°Ý÷ÎÒˆd¨L<¼)?à¹‡Š‘,/!éAº3ÆbmEÀVd7NV:4îØ óÈÅ 5¥kÅuƒB. ’>` y ó …Ó+ñÝú4/4TÔÇܼ0Ášxí´XëP¯y^e…$7l‰§ ¾n)E}ˆV¼Uƒ®4rf£³EDvÖðO۳χqÇéñz~9nƒ›Ã£ÏÌâà[ç¬Í -{™WŸú4; ¨:!ÍVû¢·Ö‚µ¸MºÒÂ[Oá¾çqé.OXB‘6^JÌ«>éÀz儜Ƈ<À7>AIáŒã²ê‹§˜“³Üx%mó#̼ö_œñe@¨iwZÙ9¼>×gl/ßs™L8Z¨_·ÙS ²OiLã•òÎkÓépài\wÂoÈ÷Wqí/Pµ|æÓf~V®"SYrŠšÒÔ$)6‘ËiJŽ[ÿ5™Ÿ¼ÇS7ŸÁîÿÎzÚ2¼·Ã{ϾMÌ_Ë¿/¾žo#QÜ­ØÎìàþ¡WÚšËd-f7s µì¹?Mæü›ÿ{ü=æ|ö×ýùIÊr£º?¡ˆÈÎÖò·¾¥ C?FD‹±%Ôç°³OäÙ%¦G ÛŠ n¹œÉç]ÈÞÏæ3tÔ®{\;šæ88¦>½ô¥Q4²‘¢¶ôï[Ÿ\`-´@¯¿Ìc×ëßäùÖsý%¿çΠÝGʤ¦ž­ºÑ‚) ûÀ4)p€¢V£8ûò¸þÓöä8ûžÀ¥‡~ÇÕ¿Û›P‹Ý8áÞ‹ùv^1A™ÇÈ߿ɿ“˜ò§ã)‰¶büäáDrЫoä¤ã'”ׄ>ýzPà8´<Š~MBøÅÚvEqý<ö>ñ<¾øó%yð“´ì¾¸ü´h˜‹%J§¡ÃÉ­g°6ÀFš3hx¸>6°¸Å}1¨5&ž¤Ëïçíú7pÙ­gòt,Jë>{ñ§f|kÈÉÉ%änE½ÎXp 7ù>šu¹‹ÿ{ô¯LuÎåM žÉaß+nç³ó¯â ñ {ú5œL£¾N· lYÑ-ŸG×hœŸyÏœ&ôÐBܼFôìÓ¢Hº|rë·£OwÈõZõ£g½ôðA³þ#èÝ4}«áâØ2·ò0mÑ{½… ù.\sóŸ¸âº+9ÍvaÜçQòú\]«RDv"Ö–o´D——à85¾  d7IÇa}"ô³NÂÛ¤ÁtÁ¤sí5×OaÍêU[uêT<gö7_3|änÄbå›.“éºvsòÈsR”ÄÒcÛÆÍ¡ /ë•Só0n„¼Ücñ=ã’å1<\¢¹R±^`qÜrs ±XúÜ~7’OŽ“$OaC$'—œˆ‹Áx)â±8^ÅùßÖ‚ãÍâÅËIùc"Ñ|rÜ¥e ,†p47}ªœõH¦ ®ã‹%Óëæ’v16 /'î;äæFHf¶Ï8ar£!±8n^¡d)å) 8D ò1±b6Dnn”c|À/A"e‰äcc¥$|›¹ÆA„DiYú3„ó(ˆø•Ûʉ„qŒ%ð=±8)kˆææaS1’ž_m»®ËÕW^Ο/½‚hnnUo„1[ªŸ—ŸYl3¿WBR1V¬\M“–­qYÍgÆ+õÿÄ=—#Oß7"ò ™tÎY\sÝ Äb1ÊbI&Ýõ&=»´Ã÷l` ߬%læj·é(^µb1wMGYÏØýÇãûþÿuÇaÕŠåL™2eã½÷=pPæéR`cæg)P¶ã[þ™ ’1JɺK¤´4™y‰ EyYj3+ð‰—Ç*_gƒ$é‡é@RåÄ*ßÇ’J”WQCµàÀ°ñòòª÷Å’Œ—’Ì ¶T¼œÔf?GæoñêÛËÚ>¬G,–>7.(/%•õ>‰²Òôöà//Û\Qe^Sµ®òR¯ê3x1ÒÓeê'ã”%ã5js–D¬lKu»Í¼§ù1uÃMž¯¹ü­¯úߪŸU°åß«¯ÏñKyýžÓ¸æñÙx¾¡ínÇrý¥ûe‚ÿG]âHDd‡jP”GçŽí)‹%ñƒß·$S>)ÏÇ,¾àù sY³báÏzÖ’né+µ©# mÌo/{–ß^Vãùj½ ""?Ó·Ò}÷X[ô~`ñ‚ÌO?ÀÒáÿKÜdMá_'#´¶ÚÒð„Ñl…¿lIAA¡ZÈ""Û¡Åé¡Éx,FaQQ­ºMºæH×!A0hÈž{öi‚ PˆˆüDƤï'RVVÆÝwÝÁ¾cÇ‘J¥Ôò—4ü æí7ßä’‹&ÇU(""Û ¨¨cöÚ›îÝ»ãy^­éYUø×±šj(bϽöfŸ±ûiœ\DdYkI¥Rµ*øþu”ç¥ð¼” BDd;6®jù‹ˆˆÔ1 ‘mdkÙ­EÕí_ÇNc ëÖ®eíºµ¾fü‹ˆlSˆ†B4iÚ”‚‚‚ Є?ÙùcX¶lo¼>úõëc­ÊDDd[„ÃaÞ}w4¼¼Ús‡…â8¯Oá#FÒ¹sÜv¿ˆÈ¶~¯~ùÅçL}áyŽ<êh’ɤÂ_v¾–ÿ¢… èÐáx"99*‘í wŸ¾ü㑇p]·öTZ´Ûê–ì1)«~‘mRñ=º5·ÛUøË/}¸VöˆˆÈOW[¿Gwxø[k1¡0…¹8™d–¾«-¤° ÖjòÙ/SeÝìþªþ´UˆÈ¯Ìã8,žöwÚu?†´æˆ IDAT¯Ö'q X áü\>;§‘·PšŸ‹cjÎÖW.¶l[·»™À«ÙFþÕVY‰-ÉÉ mÿ0¥žÍܬb·9ŠÆ ºpëS­fklEÍþJ‡Ý´ü­µ¨º!"²ãìø Ú íÅ ð-<òå:nÕ”” ‘Sö>×=¼šï;ކëòÞ_±¦< ~›îôíц\,øè}V6j‹»p+óÛÓÉ_Áº¦‰,™Å’²0íú¡{“¼òõÌùf ×”A¨=ûоIŽ-goÜŠÒ³) 5¥ï>ä¬úŠOf-Æ4ểฆõßÁ§³—wòhÛ£]›à†#?…çüú.ˆoÈiÖœØk/òîºÃÓ8‚7ûmÞ)sh‰d*e>˾úŒÕM{Ñ»8¤XøÅ—Ä[÷¢S´„Ùs—r|–,[E´eOk1x,Y¶’üöChåÍeö’õxäмc/º·®‡¿úÞ›eÈ v„ˆóÝûŸ@·]é\OÃ""µ:ü-ŠûrÌnÅü¸bÉ.Ëž¹Ÿ—£óúˆws<.hLŸv†/>øž=/yˆËŽhÌ¿&Žåªèü~Ïî4ïoøè’C¸¹Ño9slW’³_aò-#xúùKh<ÿsž|ä1V»…$–Ïa¾íÍu7]ÆÀ&+¹õ±¼<èHöibî¯~{D¾fYr3^øŠ1w½ÎMû³æ{8ñÂg(ìØž¢Ô>YÞš] Ëxþž»ñÅØþ­~…“$h:”cŠWpÇóKs|k>|ësZŒÎú™Ï“¾ PŒçþü{þý»™vP`={ &Oå¶ö2yÂDrö=Ž¡-óÈ_µŽW¯˜Œ3憶̥±mÁœwîç£D}B%‹ùzËn¹—ý‚ÿrÒø¸ù»©ì¬þÇxg¾Kçzú)"Rë[þ)/=ߟè°[yfåQ×x·ÿã}:O¼›VóþÉ>Êãò'ïa†¯ž9‹ão½#ö¿Šœ¼õ;Åå׌§Ah-Sþ¡¸ÇL¾h_êÅ÷dNÛƒ¹ÿ›‹¸¾ë®Lš²; ê`7.ຳOä¿ïÏ£ßþ"ù.½GþžëÎÙ…Ô“è¶×ìóâ»Ü:¢_\5ˆýþö2׸'»êQZû ÷ØcÖñÀa{qÕÔ%¼rDß}ò^«Ø÷Wz¤¼|Æ4€I×?ÀâcÎäƒo–0rßß0Ûy¾²w ’›O^ÈTõäå Œq ° Ž9Ã4bãÜ—™šÛ™£Ž=Ãú7ß#9òŽˆ¤«MÜu(÷<öûMþ= ü+w<²”½ÿЂoø«÷¾#›UT jÿ‹ˆì;~Ì߀õSDúÍ:}Í_î›·ôCþóm>:¤+¾}·Åú´)À8Ú Ü—&±¹,^“Âú.F¢>^`ƒmwíCaÄ6¦CQ‹Ö˜’o¹ñ¤Qä».¡úí¹è¾Ï)I”b7Z@—!½(p õÚu§U~súôjFÈäÑ®w üU‹)[·ˆo7Îç¾ =p]Ç)æø'?æûÙ«ñó›sÖ]/pîØî¸¿Ò‰oÖOíG†žáÚg>fцzôé¹u½ÖBQÛÖ´kÑ Ý`¡^»Ö´mžyœ\Ç 9†^í[ÓªU+Æ_6“Tl%åD˜0i,‹½“Õ,áÞië9üôѸ à©íá`l@Êé7¼ÄÐ}‡S?l©ß}…ó§òô›ßãÅ–ðü·²±åºT„OvkÛ°ééi6 <– E×î´meÝWSyâ‰/°!—ªCÖË7—}õºsذ\¦œz)¯}»Œ’u˘ùÒSLý¶×/ãýçÿÉŒ9«~Åçʼn$¸„ëÎ>†£Ý¬—õ×|ºvÈcö+Ÿ¤Ëëû÷yÞ"‚,Õ´TùFòšµ§SC 1‹{n›A §ÞéÈÁ‡4çÞ?ßKó1{Ð*dÀ*úED~áÁ⑊æ¤c²aeäÐ~„OQÛ1\~þ=aí: ä/ßåú¿œBËPŠDI9¥©ŠÓÏlÖãôã%e”Ù|ö9ìBÿ9›Nº°÷©ÿÄvmM¦KlãFbžM·úm’Ò¥é^Ö+cCIœ„_ÈWÿË»Îä˜];Ñ¢Co<÷~–û\Ën½”§?Ê»_S£ß§¼¬Œ”Ÿ‚hN:ç4vë?EÙ†™=ä¬K;ïÏôè·+‡Où/%îY<ÊÊÊñ‚Šõy”—•ãgêm†ËþÃèÁ»°Ç¡7“èß‹U–e§=Ž¥Ma>û íŽëe¿ˆÈÏàg»¶¿Á¤|F]·Ø Ïó ¬7¡G_ËûÇ^ŸîŽ<ß§tc>ç|Yʹ¾GI,ÖxÜŒ¿.*ÅøžÝŸGß>0}^æqø¾å–ï7‚ï‘H”Cñq|]r¾WJ"ùã_£|‚Å+-ÁËíÀI·>ÇÉ·9“>÷Ü÷|| ¸ú¥Ùxýuêg-y­óЛS+cLúÚ ‘Ѽ¾n•×\h¸+S^ø€)›¬d_žšºofqKƒ.cyjêØÊÇ9zpáÃoqáfÞÛC*§Ñ !ôïÜ\Ýý""¿¶ðO·G*Óì«‹·¾à×xmàyÕ^·ÅÇX|ßÛô7YGºÒQ¹-ÖÇóÒ/4™V°ø5¶‚ŠuÿÚºýk~žÌãê—«4[ý±k^æò/{iÊùxê4žünš ¿’. 3Cÿ+ED~=á/’-ÁòïQ<ú<Ž?t$9U""¢ð—ÐäÿeßÞZ, wêYYO)ùE¤ö±ÖÖÊ›û(üë×u ì/ø¾¯–¿ì|‚ `Ôn»ñæ¯óÉǪ›]Dd[*@à$’ ö·?ÉdRá/;gË¿¸¸˜}öKYYÖ*‘mà:.…EEäääÔªñ…]ª¥fÊüü|òóóU "";à;¶6И¿ˆˆH£ð©cÔí_wz(„ë†4ßODdYkñ<ÏójU·¿Â¿ŽI&“¼òòK|üч$ ˆˆÈ6(,,d÷Ñ{0pРÊsÿþ²S1Æðþ{ïáyçœw>áHŽ EDdAÀãÿ|”p8L¿þýk͹þ ÿ:Äq>ùø#N?óOÔ«_O""²ÂI\sÕ 2¤Ö„¿&üÕ1±X999jñ‹ˆlÖZ‘ee¥:Õïg,õìµj¼å.¸Z°?«®µÕþd­Ý¶OPm}:nDä§«­÷%ÙñáoÓ_®Æ  ;™;ºm·R'U¾’/>ÿ–RßÑÍa¶1lôß·bû#÷§[Ë7³fS’̺R–1°â‹÷™µ*=£ÖlãqcL9³?ü…1£ãFDêœþÆà†]–M»“ ïþv¶ã e6.z‰ÓO½‚oÊ5}á'Už6.ᙿLâüó'qÞy“¸øê[xúïð2·?z•–•Ÿ¼Ì=ÏÏ$ؽ¯KÎàâIWóÕºšïœä…SÇ1ù•ÛéÃ/äŠæ¾…: DDá¿c2&dXõÎSÜú¯o äT¶ ­7'ŸÂ¢zéy98™çC¹F#Dó‹(,ªGA4\Ù’tB9™e ÉDÈËËÅE]·?…WºœçŸšNNÛ!Œ>„v9+¸ëœ üö¦é¤¬ÝBÓ}ÓnóªÇ†Ò¹òïw¾'â˜ì"°›?XÈÍË#'ZóÐ4Dò È ÿPuÂþÀÛÕü[y…ähÖ‹ˆ(üw`Àu ¹Nµ/s'ðÖeûÑ´ÐÁ˜0÷¿Š¯“!òrS<{Â0ºþéfÎÞ­%Æä0øô‡Y› pl’/ž¾Œ®ESÐÉÏ-%”ãTÊW5àÇî›ü Ý}8ðN:÷žºsËÿïÏ<¹01 ßyˆÃwéLËÍzèEÌXf0f9÷kÍ)™Ì­-¿ã¤.=¸äí¯¹ïÆøøÓiÙ²9ƒÇMaáâw9k\_ZµlA›®Ã¹êñOñŒØ÷üßÄ1tjQLÓö8ëéED".a³¯9î­ZÐyıíHz¶kIבÇóÂì8Æ‚µ38gL74íÎñ}ÒÔá/" ÿŸ› hØçhžûb¥«¿ä¬è]pÆk‘á\—¹¼Âðæa׿N›×oáî¯6_ò]ðùû§¬šu7õŸ¹ž™^”Hn+îÛF]Ïbq4_§1l}ôW4ı™¶sA¿ÑŒîXÊ£ï®Á_:ƒ+¯}œ½o|EK¾ç†ß¬âú‹od-é«V5î nÈ¥ UwθàB†œx;K–,ãÃçOgú­aíè똳d)³Þxƒû¢ŒGŽÛ“;JÆóÂWK˜óæ}ìß6Xóá;|×ü0^ÿêsnÜwwüõïlÀ­Þc‘ß›óz‡Ëçóô™-¹ú’ûY‘²8ŽÃÚÏfáîq)_Í_Â'8Ü}Óýld#·~ïö¹žy‹ß爲×xc£GHé/"uÐ/6Pn­›Kû~¸û– ¸c„‚"â3^` c°‰$­Ž½’ÃÚz$ƒ¶ìÞ5ʳólXó4«;Nà˜}º“ëZμá ^<>^2A½=¯æ¡Võ)NÆÑÍj·E!Í £lXQÆòožáýEq¢ÏÜÆ×Oûx¥¥ÌŸ÷ó×$6Ûl¶Äãqüd9å¾%Ïø4mVÌš÷ŸãÁÇ,ÆïFï®ù°æ1n{« }]ë ú±GkXÿON·ßðÇ#ö¢i=‡aŽâák>dMP½?§ÙÀŽ|üà=Lú¿5„¼EÄfÍavyÀß{7& ë @óÁû÷æ—¬›ÿÎêÌåϧAö¾ð úü}"¾v¶ˆ(üÆö¦&ö;{ìN=¤;9ß­á?–‘€5äÕày „K*°x%kˆt&× ¼¦^;¸ó|Üö£9¸ƒÅ÷=,F×®ÿÉ6°dCŒF­ê“\»’¦=FrÔñGR¤À&æ7¢k£€g,YeœUØÙ9íä±ç® ^‡˜öÆœù×Ë|Ú=\÷›u”ºiS”^À’žÁohA&Óuø®©>§Öqïé'óXÞ\rô~´ð?æ£ÿ!eÓGCU}Zü’ÕÄÂi­8ò[Ð4lÐY~"Rý̽ã™sª­Åš0©Óxo}_Î9ïH† îC“’Ŭ·Ygd}3ÛL³2¿mìúù¬, 0Æ¡dþ‡,K¹8Æ`ý‰¤‡5 þŸÐ“)ï½Ìë qÌ. ÈmٗĆ5D›t¦GôèÖέ›¹JVÇÒËÇæ³°ÄÇ1à8™} N^c†Ž?Ëoz€‡o?†Ï_|’%Eéþ†©Ÿxé@·Af þ‡òؼ9LÿÒ0qòñŒØ‹vE!b±Ø–?Zàã6ïK;³€–ež\ósbŽŽQËÇfKbÞ4î¼}-&àû–VÃ1¬ñSÜwïs”µ^ÌÝwKØv—"éÛL[Ϥ’¤¼ÅÝeTáï¹ûîÇ8°_˜çþú¥‘1˜H«ž”qG 査ž—ëíÍú×bv<Îîš¶oKèþWyôßùt,nNlÅt¾XÕ‚®­£|;}:M»Ja½!\;y(Gžò[ŠþxÍã XÞâþм”GPy}Ÿ”ça?•$åêÀ¨†Þû ­÷hÌgÏý‡ï—Æ*^_sùdŒDýQ\zRcÎ;ÿ¯´?cW?óK“ µüE¤rk>1rø°Ëö³±òò­ºø‰çy¬Y½š6mÛáy©Í/cÁÉ)¢ycËúõåÄãqb¥ëqzι‡tfþÇðÝúFzÆaôn߃ý:Î¥U÷Þôi‘GB¹E´ëч^-›ÑohOVÍú˜ÙK’ üÝ™ìÕµ-=zt$Ï&põ`è€äXEÿ&Ý<ŽÃ[o¾Án»&NŸ:iœEù†òdœ²ò8á†8ð÷çqÆþ½ prê1hôî4ˆ/åûÅ«Hæ4eèÈQtn\DñÀ=èbæòáçKi6ú0öïÓ•îúÓ¦Cº6J2û»”8  kæÍcéªõÔë¹??€&h4ðFv°ÌŸ3Ÿõ¶ýwL§Æù4hF·î) Œ¦^£–tëÒŽ¢ü"ÚöH×â"è‹™7“/m¤ý.{²û¨!ôëÓ…‘0 ›Ó­[G ÂÇ SÔ¨%]Û·£óè±tN~ÇŸ/¡ÉèÃ9 owzêO«\"²m^yy{ì9ÏóHy>o±”¶­[’ôüÊS¢ýÀ– s¼ °äEÃ,_ºˆý†w%åUÏ® ˜ûÝl:wí¶UW#5ÆP^VÊŒ3ŸÌüôñÌÓI ‘ù™R›$õ“ε×\?…5«WmUøÇãqfó5ÃGîF,¶™ Cæ|nã†Õècµ¾‡KÈ5éh`Ó㳞qC8øx¾ ŽëâX/ã8¸®“î,ƾ™‚ r,žçkÌs5=×åê+/çÏ—^A477Ýcþ×¹ø[(GkÓÃ+›©éUŒßÿp‡Cú½ÍÿxÍæŽÁ-=ÿïKG›«™¦7E‹ˆüt“Î9‹k®»¡r²,–äÚ|ÄÈaC(%ñ}?°$R>žàù~àyÅõò˜ùÑ î˜tåñTµõ¦R)^šúÿ3T¤jßlÕ¾ûQÛº²ßš°ÝÒk¶6¨«¿nK˨’("uN‡¯›©¯"ÙjëÁþuñ`Õ5EDê4Ý §Žiذ:¹]Ddû´ø1¬_»ŽâÆMjÑw«Â¿ñ}Ÿ]‡à±>Ê!‡N^~¾ EDä'2ưrÅ î¿ïšp(©dRá/;gMµW¯^¤’Iî½ûÿH$Ù………Œw­[·Âó¼ZsæÂ¿ŽÕRÂ.ÆiÚŸˆÈvhTyžW«‚_á_Gù¾¿U狊ˆÈk\Õší/""RǨå_Gk¨Ž£zŸˆÈöA¨Û_vN—»óÝwÌ™3›T*¥BÙÑh.}úô¥Yóæø¾¯ ²s¶øçÌ™ÃûïÍ ÿ€A„\í~‘mûb…§Ÿþ‡þ[5lXk®ø§oÿ:ÄqÞ|ãu&|(-Z¶Äu]ŠˆÈ6jÞ¬9O=õÿx ‰D¢väv[Ýjù¯\¹‚ÆMš(øED¶k--ZµbÉâEµj.•¿î©T\ÙÇê2¿""Û­P›8µ´”±Ö!¯¨ˆ\×*Ä~|Völ}yoy=?ªâQ‹ÿ³ˆˆÔdjé=Áw|øÛÊf&ïW^ Éó}›n?óûÖ—vˆÂèŽhЀSg:ä‡À÷…ÉO¬­úž‡W­üªöU`c0¦„ÿÝŠq·~Ê}“öçü'>·æÇþ/aýwÓ8úàßóþŠ Öþ§©ívxø[c0Ž¡dö üqÜpztëE¯¾ý4êw<9¯o͇ün·}˜¶$LNN8¡0‘H„H$BÈu2-O‹Åà†#Dr"˜ƒãº8®eÞ¿®fØ £„‘°û-U©)¶ôcNl¦ÁÁ·³Î«(´…\1~…¹m¹iAÅ+ 9è¯qåÙû÷W2qž¸æ‡+›ßék ¸!g«^ÿƒûQ;YDä'Ùá³ý ±Ë¹kòe|Òg2ÓKq(μ/fa»||Û_ødébâ—œÌó rÑuG²âß·ñä»óˆùôÛïŽÛ'á ­cÚ·ñôçå ™0œT^éJÞxá–^À¤ÓçаÕ&_ú[Zæâ%¥$Pó‡ã.õºu¡é—ÿå¥åà·­s(ûäm¾*lE—bˆä£ÇîgöÀã9²MèÁ;>ÌÃŽdlý%ügÚäú¼ûÁ—˜æƒ9ú¸CèPh/ž¿Ÿ¿ó-åá&ìzØÉì‘g…¾ãq^üèSL«Áõ» ´Ï¼þ³gïáß3æà5èÆ'œÈà&°ìãWyum­—ÀK_®¦Åà8vü.…µcEDvÊ–ºàSK`굡këæ7iE¿Q»Ó«~”6£÷§kóìyè üþ˜ßP”(aÁ¼ut¾£ûçóôy‡sÝ´µä¹¼sÑA{û\ÊâGnãåueD¢õè1hÍ: á·ÇžÀ‘ &gîs¼ûÁ¼´<öƒ­S°øõûrÒ°8wÿó; ÉŒ_ÑuÔš…Lk<ÉçÏ<Èã³6d–ÙÈÛ?Ì´Eq‚ßóÐEçóè·9Œÿíá´\t?Wßòq`Ö­‡sÔ•ÓiÃÚ–qêï±fc#&ß¼„‰o?ÅÍ,ŒÊÚ—úsÓkWq‘ë|<ç2œ"7ɸ]¦ñÀ—ó9ydu눈ì|áoŒ%H¥(Üõ,>_wŸ¾ù:Ó_yš¿ŒÅ 7¾ÁCûLÖÍeS¿çž‹Oçž7–`Âa¼ÒÕ´} ñkùÞvâò¹$“ ¢m‡Ð;?²iëϸ-wçÞ'÷"Y^NJÝþÿ»‚¤0~ËÄÖ»sÙ½Ci™hÁo»7ÍÚ+v“¾œìÊ]~£zäåGpÝ\BÆ#¶x&sƒ®\Ø+½¼ÍÚËE-Š©_/7}†‹ˆº>±EŸ27¹†;ÍýÖÇZC´ ;#ü2RCÃöÅD2Uù‘±¤§'"²3·ü1‘¤‚|zŒØŸ~{L`Hj#îz‹Øø~“¾úœã†Yùé½<üikšñ2Úç2ûîQ9ÍÃ)(¦À–°2îàæ;\Ïz/ eE¢8®ã`L:j¶<áL6·“©Fvönœ7þ*¹êQZ×Oe•ŸCت»§(Ofß Æ)|Xœ¢fyË™³vi˜U½³5—°`-NacòSõ9{êtÏË^[Àç÷Õö§ö¬ˆÈ¶ÙácþÆ"þRî¼æ n}â f/ZÂ73ç¦ÿ¼OÓ]Éwó—­`ÑÒ5x8‘\ y…¹°ìÎüNŽÁo¾§ ˜ÇUW¿Š›ŸÇçÞÍûeå8 ¢”ÎòÒC°ò#.;÷r>Z›Ô˜ÿÖæ*Nþ¨Ëxõ¥‡¹à˜Aàg·¬óз_üã%< |æ4^ûz.Á–V¤ð›íÇŸ~³–«Nú _­‰±~þ‡¼øþJœI'¿ÍîyHâ7ÛŸs÷ZÇŇ\ÁÇËʈ­[À+÷ÿÿ®2Dt1B‘ÚþA¨=š{<{åÑôîÜ‘î£'²`—kxí²]çµáûp徨_|8«œÉ™¾fTã(Mv¿›ž§@‘Ÿ$žhÀħ§²Çlj4âôÏš°ka!5´1ŽÃZ½ÇðöMi7ô–§Vóê3ÓXTî¡ìߊƒÀu0X·˜~»¡m} 0¸Ž[Y~ÝϾ‰3#·Ñ¦e'¹ëk:¶éLșۛªÚŽd"¡¼Î9Í_„­éö›?òê²$®ã¤ß¯jcH&Ârÿ[\ÒóCŽÜŽv}öbÊ›e4.4`œjcûÆ88Žö¬ˆÈOn˜×|â‚IçÚk®ŸÂšÕ«¶ê",ñxœÙß|Íð‘»‹•o²LúÂ1†pN”ÜhNÕ¼8eå | œ“OnNð(ßXŽ›W@NÈ""" QøË¯F$'G—ÄÙFÖVÝQÖZKN4Z«¾[þuHôìÙ›O>þP…!"² Œ1cð}Ÿ§ÿõÆÀóRµfûCÚ…u«¦:|Ä^Ÿþo_s©Zt ŠˆìŒ¢Ñ(ݺõ`×aÃñ¼ÚsåQ…SPPÀ¸ýتÓ8EDdëV¶–§*üëðÁ*""ÛGmkPiÌ_DD¤ŽQø‹ˆˆÔ1êö¯C²»úÕí/"²}TÌü¯~Ér…¿ìDhII Óÿû*‹-"•Òl‘m‘—ŸG§ŽÙmôh\·öÜ‚Tá_ÇÂÿ­7ߤYóŒŸpápX…""²M,/O{‘·ßz‹=ÆŒÁ«%*…â8_ýçžw*‘í`ÿññç Ïgï}÷­5ᯠuL*™$JwMiÜ_DdÛý™ïÑD"Am:ÙÏù…K 0„B!ÌÖ†‘Mß_Þ¸!Ânz‚…"ì§Ñ…~DDêæ÷èk-¡p˜Â¢z›þ«W§l!ÿø¿{˜µÖLJœ‚"¢.[ucpC–yÏÝËÍÿ]L(ä Û–ÊWÍŠ•ýÁ—ˆˆHí·ÃÃßqÞzúiº7kJ»víèÜ£7=ºv¤]»6´jÞ‡[çÄXþÝ·¬O8„Bk¸ý áÜðA’È„º²,xéîzs)µhråÎXe%¾êk®øÃY¼9·›9]¥äãÇùÝI·²,áó¿+µ¶FÁªÂ "²“Ûáþ¬µô1œûžx›cx錽y¡óMÜ}zolÊ¥e×.4¹áZ\°)–ÏžEI‰µAeˆd·FI×WŒ"äšÍ6fÕ›ý#öO*Æ¢¹ß³1T>痮滹ËHUa^µLæœV‹ ,Ö°>©”%rÒ…o}R)‡ -ˆˆÔÅ–¿µ–‚ é;pö§Cƒ0Eͺ1`à@öïMÁÚ÷8bØL]M>‚¿Í.á‡Ò¡÷1¼µ&ÉšÿÁ c†Ð«Gz ÃÅO~ƒeõ l|-_}ú%k·ª¥*›´Üq…ÕeÉ._¯œž¸ŽC³+C‡ dôA'óÔ̵@· -¦ÿÉ—râ~£8xÊ?¹vP#œ| 'ŽÁ~—?O,P銈ÔÉ–¿1¬Å÷=¬gñ°ÖÇ÷<ð¬qÉ/,€˜Ç.›Ê¤éÝÙø·ÙÜ8:‡Ôºw™¸ßµt¼á žØ¿%_þ cŽãñ=>¦µK: Œ!Xò§s g¾ø<Zæák¿þ¨ú_¸ôºùRÞiÆCbÑÇ,-ïưnΫÜñ¯¹œþè voé2ïå¿pÁ-·²Ëƒ“ˆÖ+À_ß‚ë^|‡¦Ä¸óµ ñÖ·äºiïÒ4S­‘:þ[_I?VJÜ·$Ê6H6$9û)ûf1¹§îÁã§×cùòtÿrmSѵ€Óf~~õšFü?¡å¸´îЕ-£` åf1Ño0«¿}Žÿ¾ùŸONKØÈ²‚¡¬X›À†n§iº‹8t¯| Cú|QøoMeƒM–-Ú“g¾z‰A¦/Ó åø¼úlE»Òb´lSPQP×ÿä¶`侇2®gº ׿¹–{Þ\”ŽôDŠþžËýwžBÃjK•ð¡uÈÉ UëEˆä…jìGÙÙìTù±„Èq|âeq¬õˆtG_÷}yþkb~€Ÿ,cåâElH™¬€OWÌ[@I*PðoSùWüR9Ó’†GPöÝÛ|ðíü U¾•«×©°DDÔòßêæ<©²Êâ~Uó<ð)/-#å4`—±=8õÊc9âÙaLúËÙÜpýQœ~õÑùDòHa£í9ó¶k°ñRJ2ë ý—ãÆßÌY/MÕ˜ÿ üÀË”Öÿ¼$%%1дûNùÍ{Ü~ÞI<ݺ 6ž¤xà8.8eO¥(KÙʪCõÇ""¢ð‚$ì{ÇÛìíI€hã>\÷à=Ôkí¤`—?=Ìcû/bc*ŸV—‡]ÉÃCæ°tm¾‰P¿q Ú„=’>Àsn RI§ÕîÜõDš4Ö˜ÿmÚ‹k¹›z­ò*Ÿ+z4ÿþgŠ98îM œ¿uå)L8—âæ­( —£ÿñ6ÉÏ,•ÏQÕ‹ˆˆÂÀ´ïEƒtC'œG›Nª6(¿)Ýû5­Z‡¦í»Ó´}õUEZv¢™1þœútéQ_{ó'pÂy´éÜ¡ÚsnAcºvÎzœSDÛ®½h[cÙâÎ=)®z;÷¤±ŠTDdçÿîWˆˆˆ(üåWO³"ED¶‡ÚzwT… ~ÝÊWDd;}£f&¯×¶K™+üëX µy‹$q†ˆÈv²xáBZµnCÔžkš‡´ÛêŽ 9jO=ù8ÃGŒ"ÍQ¡ˆˆüôv?6¬çµÿ¾Â¡‡A2™TøËÎÙòïС#Žq˜ýÍ,R^J…""² r£yL˜p 6Ä÷ýZÓý¯ð¯KuÔÌAÙ¾C:tì¨ÙN «Úü ÿ:| jÒŸˆÈöo\Õšð'""RǨå_ÇZüáH¤êÆ=""²=šý¤’IuûËÎÉq^}éElè¾Ç""Û§U…ãºì¾Ç˜ôw«Â¿ª`,[±v39d-–ªÛöÚÌ‹WÛZ95øžÏøƒ%U‹NIÙYE"þõäcD£¹”—•j¶Vâ` ”/Ë·K×HYÀâSHÝhq7»Œã¬šõ9kŠ{ѽqˆ@=ÕÛïyÄã1„ˆÈ¶~Ÿú~º[Ë2êgéöå¸Ì¹ó4v»§„ñûtÂx1ºrñ-“hq1¡¹¹Q6• <–$ZâÅvçžÓW0óäF$ËKHx“—O$ä€M/+'éÛZ7Ërgê ‘mjßÖJ?Ël 8!—èÀÓøûƒ÷ñ÷{ïãÑ¿_@ïú0–•Ÿÿ‹£Fô¢}Û®L¸èŸ¬Î+仿ÁµßÃ× yë!ÜøâlB¡ÜwúÞtnÑš¾{ŸÁôU>Gó×DDDvºð¯z7—p8D8&r1Æ!¾ês.øÝ™û\Æ3OÝ@ƒNåwgý‹–§ßÈù= èÅ›,™ûgïÀsÇçŒ7:ð·žáŒ¶ï1v· ™cr™Z×ã"""RÂ?œóÞÙtj݉íÚÐç÷³6é°fÖc̬¿?çŸ:žÎ=Çr޲ö­Gø|­ÍLð³`B„W½Äÿ†ÉOÞÆ>={qâ­73f̓Lù A4¤›ÔŠˆˆl­ŸïT¿T9þ kùôÙCpb>„sÈ‹º|¿r.ù Ó0à{Iœ¢®›×ØPêeZóŒC°ö{VºmÚâ‰$á¼6ôkêñîüRÌð"ðÔöÙ¹ZþXL(ÂÂB ‹ )ˆ†1Ö’Ó´3åk—°.î↢¿aµ-¢^AúïŽëàpu¤‰¿—B4'‚›XÈÌå!:¶+Àú ~‘0üÓk-AæÜk=Š{N¿ ÏqýÏ2÷«©\òûki8êhz5, ]Û(ß½ò:ß-[ÅÆz¿áÒƒáÚÃÏàåY_ñ÷3ÏâÕÆÇqîâjõ‹ˆˆì\áoKnóÎôëÔ€ìö ˆ÷溇nÆyñ2)/ÀóR^êWÜò©ã¬µ¬^µ /°ø~@`¡°¨¾Â_DDä×*-œŸ¾nM`1ŽKQý†€¯ðù5r]—ƒ‡’Ètûû~@Êó~±íq´KDDD~žÖØÌÏ_’Â_DD¤ŽQø‹ˆˆ(üEDDDá/""" Qø‹ˆˆˆÂ_DDDþ"""¢ð…¿ˆˆˆ(üEDDDá/""" Qø‹ˆˆˆÂ_DDDá/""" Qø‹ˆˆˆÂ_DDDþ"""¢ð…¿ˆˆˆ(üEDDDá/""" Qø‹ˆˆˆÂ_DDDþ"""¢ðQø‹ˆˆˆÂ_DDDþ"""¢ð…¿ˆˆˆ(üEDDDá/""" Qø‹ˆˆˆÂ_DDDþ"""¢ð…¿ˆˆˆÂ_DDDþ"""¢ð…¿ˆˆˆ(üEDDDá/""" Qø‹ˆˆˆÂ_DDDþ"""¢ð…¿ˆˆˆ(üEDDDá/""¢ð…¿ˆˆˆ(üEDDDá/""" Qø‹ˆˆˆÂ_DDDþ"""¢ð…¿ˆˆˆ(üEDDDá/""" …¿ˆˆˆ(üEDDDá/""" Qø‹ˆˆˆÂ_DDDþ"""¢ð…¿ˆˆˆ(üEDDDá/""" Qø‹ˆˆˆÂ_DDDá/"""uBHE òëâ:¦òwû?_mžÊ~óó¾õÎ °:.Eá/";ÈÚ ^yo¹Ñp&c NEeÀ0&ý¼1“ÄÁ`Ó¯ÍüÈfŒÁb“Y¥µ¶r½6³FØÌÂNæý*þ†Í$¡c°•ïa0é•UmkÖï¦úF`0`ÀX°ŒMo•1&³=`Œƒµ¶òófÞ%³&ó9«j'Æ8›ÔXÒÏUlyÅÆÚLÅÅlR>ËY[ùiIyƒ»—ãê…¿ˆl«×Ǹó©/iÜ ,8®ƒë¸ëàfÂÏ1Æ€ƒK@€qÒéå¬ǤC9°Af™tø›\‹µ&S0TålVe ó~™x® c'þÖZÇ© ïŠ:IEäW4š]7æéueªÆVëJpŒCøNeeÀTV^Œc0™Ïb¿*Ó3Ÿ5½ªLå‚L8&S‘0Ö¯¬ôT|.S­¤Ë´4ž¢G›\…¿(üEdÇpCnn99éÿÚ¡[Ùª6¦¢ÀT†¬q¬5Õ–Ç58Ž“ÕC`‚ªuØL‹ÜuœL ;{ùLk;;l³–ÉîA¨ZÆÍ¼G~ßÍiÇI·ÈƒÀ¯ íì &Óû@¦CE ;›´è18&³ÝNz™ŠÇÛ]ñÓd*HïcmBÆ©¬pTn‡µ™JL… °Ö G6ùL" ÙŽ !×ÅuLÈ;™p­ ÁšATpéçMe% ,Næµ®ëV ЊuT )T„~vXg¿WÅsÁZó5­ÿÍUª–q7yÿôg´¸!*‡lº;c‚Ì:‚¬÷ÀÉÞF ®Å5A`3•…ŠŽ‚Šålæ}+*T–Uåö:d*/5Ë!2 ð…¿ˆì°è7é ¹!lŘ´“n ;Y+Z¶Ö•­étÈVvE7{vË9; +B.;Œ7­X˜-üæþ¾¥¿m®âQ½¢aqœŠ!„ìÖû¦¿Wõ„TVðƒ Ý“‘¬0&Ý#aƒ r޵ã88Ö­ÖS°¹Ï˜]6ujf£(üEäJÿ‹uªÇ`Œ5Y­X“ã7`ÓþOVWyºeëdÆÇ·ÈŽS5/Ý2·[ ÿšÁý\E—ÿ¦ÇTë=Èת@¯˜ŸXÕí^3”«~w0&¨¬8ŽŸþœ•ïh«>—±é±þÌ„Ât½ =?¢rN@V¥";ô+¶×q Ž£ð…¿ˆì`5B6ýÌf[ÕX“Õ…m«Ï¼7X·24+f½g·¬ts»jR`V@g¿×–ZâÙÁY#ö3ëò«õTckT**¶ ¾­šäg­©H÷r8¸®ÍTŒ±é¡ 'ÈLp À:•½•­wLVÅ"SÊLH¬9ï úçÎ 5è …¿ˆìÀ†?ã:ÕƒµòÜ»ô¾¥jÅ2ƒãšÌÀŠpaMÕø¹µ-bS9¯3Û^1\ìôϧ ráñÏ;AÌ?ÍWÏž:ʹCâöÔcý½Ö¿¶ =zòïÑ£Çå5þëó»NÀ¶M„²¥ô߈ùD:/ü®ïrt›|¹HÊIé|ÿ·M€²1Žžçà\ˆï“‹bÁÍI mTõç¬Ï>\,,>4¦¾Ÿþ_Ö#†ŠË€I·—gÒsî&¸ÛgÕ÷šZ<§_»òe=„áÔm?ºÜM´ü‰d?ÿn¼ÿì áóÙëïÑ£'ÿ=z\ÿŸßù¯íx·]÷ž%® ]?[kƒµ°”Gæ"[â¼õ~[þÒОíŽÿy‰wk¿üüuu3IH)]ˆÞ.VÖŸÿ¬ëÞ³ ÿüµ)…Á³¤¼~¬÷îb¡Ð÷†¸óŸ €ÛùëóŸÏŵJÿžìÑ“=.k¢Ü΢ßVý_$ÞŽàä< g3Aˆ€ë>ämÿ¬_¾+à³Dû¼bá|Ÿ;|ïÏŸ{~\Ú:䂆ÅÄ>´wѼçïºø”ì‚M±u‰†9ßà™¤éfqþ|- #E0‹˜¹ {v°^›ô½žü{ôèqy]—†·=_“®sz~g¿érµ#²ôLw ¦y$ŸOûÓfç½yLwÿýýy±º…zÛڀͳe;Vw›Ló˜¾+ÖÊv8ÑÆ0È6É{ëט…‹ •|¶·Þäç³Ç­Kˆî9–_¿ž'ømDëg*'ºÑ,l‚ kݲKîÑ£'ÿ=z\ûwòç¶íàšõ`S$È'rç$œ?ßmÅ¡"D‰tlˆ3ÑïÛõ_°Þ¸d7¿ón>O÷×£ú¢ûûó¨Þ<¹Ðgœùžµ-vX2ÐÔ‘9D[wüŠZD0PÃL °„“DR%Y"‰Q˜ ©ö¥|ëﺄ# (&[%ÂZiù¢€dy’¢Šëü TúS¿=ù÷èÑãr¹ÿƒ›gÉR7ŸR&©Q •õ? ÏóÉÝòæþ_H(^õ¹‰wÛßÿ¢Æàü4PÕoºùí¯OÙ¼ûÐ¥ÂùÇ»Î=¶ ‚ëÜ ÅQ ÄQH.û($_ ´©Ó" x5C5`’‹ ÍÕTçŽè³ñÏZ÷çDÀué‚èùkWïrñðÌåE=ù÷èÑ㯘ýs×¾‰ñÝì䂸o½X— ™S‹ Äú|®øì4aýg벬(I ‡Cpq)"¶buø˜rrƒa1ÁĨtÁêä!MsÀNµB¹Bm;4ºƒ¿þ ‚£Ú¹üÙÝ/Igp$([iHÚF*ØÚ·ÀCSÊ…E=ù÷èÑã²èÝE?ëÜ—Gçùpÿ\|Ç…¼mEÿvê^wùÖu×ÝXÛÀ©fòîŠçÖ…ƒ=Ç@>4Úqø­Qùó#t·_×3_˹܅K~.HÀYdX q~Ê»ßþ ÞýŸþ[?Ë•ë7©ë†Åê„'ÞÕcüµ ?ºÍbáh‡·¸ºw• %EÕò×7ëN»âgQ#mž«‰u‘Å­2ñ| п1{ôäߣGËlýŸ½±_‹ýÌ–.ÏMÎ{–`/‚WÉtב?¤ŽìR¶ÅÕÜÍŸwñ‰}ÛypMìÏ~‹“Šõãmk­ ¨ ¦ LQŽD" m—šúÉ!oíyôÞ·¸~­dñÁ—˜½oœÎ0k˜­NIÍŒã£éu†»×ìÕ¸åM†2Ɔ{˜‰±FÌmHÞ­ Ͷ¦ y2RNÊO+!¢–SŒ{úïÑ“=.•ÿEºó2ºó>ÛLνó7¿uVg²ÈŸݬGýhêšßnª°µß>\Ûúµ×@Æ–áX§%èÎè6É|²~zÝ= ä3=œ9ŠX—4GOyx÷kÔó¾þ•?áÁ÷¾Â/üíOóÒÕÛ ‹9³Ó9MœqxzÊ|ÙprzL¡JqpÌÞµ#GOyðî·ÙÙ½ÍðÖÇaz‹«×o€8ÔU¸b„:ŸÏ%ïö³nBÐa,ÄyÂ]ªOÏý=zòïÑ£Çå?8QŸc}Å"¦†Cºµnì¿é®ó˜:«Ú/&òåA¾e›_"˜ëxÖk…Lz¬Mr¸xóÿì*a]@ê>‡ÍM|'£ëN Ïcv×ÑÃ* ËŽCy÷nÙ‡Œ`†¢8ä“7n±·3¢Ü­8v‰d‘(9(‰uM}žllíºçÜ“žü{ôèqÉÐØN:Ÿþ.*Wåüìls·¿¶ìÍû{Ó|·ª]´ßaËy Ð:yOs8Ðú{®»ýgã„7_g­Iàù±¼ëõÄæ:Áƒšaæòs”Èã§Oy÷î{Ô‹3$4´Y–Há'‘ÂÄpmL˜Jú©Q‡–ÓÙ)î¡ê12N(Ë’º^à5Ÿ.â ¢8,Ö ì 9{Ÿ+Ó7˜£˜wÔ–PõH—˜W%çäo œ)Ýd=ù÷èÑã2:Pçñ¾;£3PI$É®ÚeÓoý¨ä³>ºøÙüȵ.€ÿÚ*8¥„ºõè¾ ÑÙ&~H슀ur_–Àe!çÇ®'ëÇl­$Ö5ƒ%Ä9¨C@œp|rBü`€k–Œ^mÛà­ *ƒaAJ‰¥:éø‹ùŒAñ"Ñ—\ŽY®Ÿ²’ÈtºÃîdʽëH„T7ì\°jö‰•²° ê|+89ÿç´S0  N»sÈþ½Ù£'ÿ=z\"û;Ÿ÷ûç†:†’fλo×%ùåÏÉ™÷ë‘|ÜL hÊ-ìÖ¨?®ð$‹Yì¦ë¢!u‰€yI ºf½:âï2$täo˜É…"F$m$…¨Ï¾û1¡­¹ï.ƒaE5âB;#ZÄ,àŠ!Ö¬­‰ÁqewBŠBX®8E(Цe4Ø!65Ó)%ÃVg-Ü»Ëñâ”O—%¡nMnóðé£+<~ïËŒïü8þÚLj-J¤U×]<¥´ÞÙ·GOþ=zô¸TîïºnçÖA:i³Ÿ?ú•M—-º½·gó±ušßúÌŽ.íSϤîÄ_pá¿uçÏ&œGÅaªÙeódÀÍj æï½y%[¾©3I0(à×_æÏ?oHhpγ3®GŒ'†úŠaQ ™TóÓEY2 Qç1g |ðˆ—n߯MÆL¯ìðôè˜Éd²­ypÿ7÷® ¼òÁÜ®„4=f纰²¯çúχE‹E„@¿÷ïÑ“=.‰ü¥³ eÓáËÚíOdsqfÛ¶»ðœ»úíQ~¶‰Ø3¡;ç9À…=½I¸Ñ.@4a]|¯`›áµF “¾å˜á—ÿùó1òÞÂÄÐd쌼yï."1ж-;»»¸¡Ò¬V`ŨŠ"‡ܸz•"•ÏŠw IñZCžf˜ q¾b4œ0Wƒžpz|ÊtgBŠbqÆUÞ•$¢Êæ'ilì–{ôèÉ¿G—†óõ²mÎë\·ÿ·D—Hg¨å¬{¥#u ™aš‰RUHêJ¹N­GÄž‰æ½(ÌÛœ’º!nFÿº)*ÜV¤/[ŠÉjüµ`®+²µ¯¥SÆWÿìKüËþ¡–Pï(pŒC$EI) =‰A5ìŠx– ¡ÂUnÀj¨'«Z’A¼€WOYV¬šÀñ錃ÃC|UQ KægÇ”…cÙ‚Xö!0'âF\it†K>õ;ÿ=ù÷èÑã;Éô:†Öº¹ß?ßù瀜R “ˆŠ’,Q¸‹ªþLëŠò >m&hñ€‘$á6©}¶ùþ¬W ½ø5B’l9lç+‚|Êw^ØVÁ².2D|W¢%#oþÅWùó/‰~ä ÞûÖ1ó£È­›7¹së©©YÍO ¡%YÈÓ†˜(Êñ¡,Kœóxï)#v§#TJ®îî1ÝÝã`ÿ˜ép—“Ã'Çs¦;SÞ¹ûËù’UÛ²3QÖ%¯Pݘ’Ú&_?h—nh‚¥ˆ[_8ˆ"Ôý›óoæ(Ué̱ÄðÑ:kêÎ/Ãýÿ3êÉ¿G2¨úÜe»¼0ëüûMSÐN\'Õb8Ü…øÝM’žfó‘´9ÉQµ~³°QoóµëzQÙëNß» t#,ÌÁAÝ?~"|;}d5€uþý1F®L¯ðKŸù{¼ó¯òÞ·ÿq»;WðÞS¨âS¢i´ h±v44ÄçÎUxñ€’ªá,1NxñömÞúÎw©ŠÕpÀ*,išˆŠq¶˜QްX"iÌÓç¼úÂGhc~ Žü3Ý\GZ^g˜œÿ<{üÍÂÑé‚ï¾ý.!%H‰Äh$Ë+.³\äž ‰lôsOþ=züuâutº¢ù^_’$œlBjs¯ë\ýº šµ`s¢×‘ð¦ËE×÷ÿ›Ý¼ëºõ¼J(œ'¤îê åATH]1!¢ùÏÝ7sê6"C6›óuœ¯‘L¨o|ô#Ôóë8 üÁïý£AÁp4@œBÄ…&>ýn̯((øîÖßpŽzU3”ܹ}›ûä'ùÚW¾ÊÓÇOØ›îr27ŽŽ¹yó:UQ±š¯¸ýÆ« %ßÿ¯üøO[OA"z(cì~¹BëOüÿFÂ+üí›s^Û›?×ÂúbÁ.¼c+BúÁÑOþ=züpq?Ú¥âYç±/’@º0\gÝÿö ¿±±”Åw²%âS'É fakg¿ÖìkW¬»½~âS8—OüÜ:‘OQ³õYB!n9æbåÜjØ6¯Kk|ï™^¿ÁüÛ‘yÛ0R¡ªŠ_ÎQƒ\\Ä„J¶vr>q°”bŒÌæ b»dÿ 16üÜÏý,!>¸ÿ€ñ¸â½{w™ ‡Lª'''<9Øç¯ÜÁÏïQΞ"ň-U—r˜ý rG§¢ýqÿÞü÷ÿ¢/ìyaŠ>c{ýaòW??P+¨žü{ôø!£ï pYmŠhÌZ€Í‰_×ó;H"ÙN³s^þØö8+íbÓ•‹ ‰˜~‘ë&ÐG³ÐÏŒµñO.BºàÞ´r`ÙÓ?DQ¿ÖlEk¶³.1//½þªrHX‰§r¶”)¶xÍÆd ç@hI!Ä"4£’hc¾øå/1ÝÙáÓŸø1þÏþ»üŸÿüŸQœ„¶æÑÝ»¼øò•cy:g±:ãú£3^›ðàæ-IT±¤Ñxîò×½*‰=ó÷øëí=züpuNq 'à$àºÞ]9ý­ïõs?žõÚ©îUÈ#~²…ïšÈr Ã¹ü ×i ”s÷À¼äÎÛKq‚ó†¸<¶Gª†+ç- ç;E¿ZvDsBàVâ  ˆS|áPU¼!^zé%~ò§~†U“¨Ûêq"XÌ¿ˆ¤°‚ÐÚš#m»¢i–,ë%ÁP!ZKPøú›ßä¿øÇÜyõþ‹ÿê¿äÿ§ÿ ?ö£ŸäÊhÂþ£§´¡¡Äj‹9ßz“rÀEDªÚM3Ø<ÿ.c©G¿Vè;ÿ=~¨úþGÓ5Ýw;{9ÏšÏãþ,XƒÈ¹mb‚ó7È#~çò‰Òi:g¿”¬ëä©+*òAê&ÖçIwÇï7?¹@–—?×=D1þÂ/þôÿþ ‹%WÆBhÚB‹µí¦PiC‹ D ÔñÜr¸-ó'Oc¾h)(x筷ع¹Ë?øì/óâK/qó•—á7~{wßÇKbTxÂÙŒ_ø{ŸáÉò„alÑÂC„¢û‘š)%Ä)Az±_¾óïÑ£Ç%²?êç2¹{ï)œ£(tÓ…æÓ#Îÿìºt=M¨Äü÷q>â½ >"P—p>!.åU‚ˆÎç á«ú%hmSóÒ~Œ_ü•_æúÞŸzý5†Ë%þñøGÈr< ²ŠAT’×½~ß\:ÉîÑ£ïü{ôèq™Üw×Úmãc¹3_ÛòžGë®ÿ;žõéæk1[Gî®ùóoŠ"Ö9B4Á£D¥óË&ÚâÆÑOlýýÓ–®`mQ”Çüë3EíææFçPHÊ‹Ê_â}Œƒ‡o³¨ç %ÓéM–‹3–‹˶%&˜Ž'´"˜ó,Û–:‚¯*®Ž¯áFÅ`À¤,Ðá’k“1·oÞb~rÂøfEX.ùôÿ8eÓ0hþéW¾ÆÎJøàÁC>ùêkT–u®ÐNð—0uTdq!ª½à¯Gßù÷èÑã²;ÿ»sg8͵:Ź„÷¶é°³>ÀPg8—;xï,ŸÅå«8´ëÒ½ç íB|tý× 9Hb¨óÝcœÛxäH_8EÕQzŸ»xuÝ÷È¿çÎ_7k§€^#ÞEœBé"e) F#þÃòŸ!Zpu:%ÅÇG‡<Þ?áðlÅlÞr¶h©“#4ŠHIUMvö0QFš¯X2©ü­Oÿ[üÈ~œ[æ‡O8yÿâá1Ÿþôsý•pe4%I`a¸s`à|É ¥î4R³up¾»¤€®héÑ£ïü{ôèqI¿ˆ¸–Mu´óá×ãÜù)àÚF×";;ÒMÚß­ík×gy]ãa-$_¸ÎÀgÓí»œÄ—Ïö²Â_1Lº¼MäoDÖÝ}wµ䩃D¼äKë.Ä qžOþäÏòòëguv@é=2âêUê^RJRÌi‚U9dh «U:¤hìô)¡¦LÆS^zå5îpé°dìG@‰Žjê³c‚üûÿù?áw¾ôeŠÂ‹@HY:éDPIù2ÁCT%ú÷f¾óïÑ£Ç%²¿hîœsy·Þuá^¯àUp’(º?{é.ùSÄ xÃcÎesžì!ûÖz*…(^ 8wáÇu>'PhöÊÏ¿w“É*uÚÝůOsHN6J¹ˆ°ØÙ¯ õ 5b‚ÁxÄßÿ•ϲ4e²s•Ý]ƃŠB#“Ò3( œsˆ7ðÑd@5)ð…"ÄMàÐx8"F˜µLG»Lª1ͲÆI‚hW50¹y¿{ƒ_ûGÿˆJ†–“ÊN¯ †Ó„sïj‚?RêÑ£'ÿ=z\Jç¯Ú¹êIèŠC\B5!ëhÜŽ¼ó˜Ú:`7nW‡SŹ<†÷k2Ó„Šá5u$—p$¼ä¿/J—lj^#^…†'QXþ}S\ˆà uÎ($+¥Jï(U³ÐÏA¡9”È9‡h¶éÅyÔuøÉŸù9^{ãG¨C"ƒhŒ«ãÁ€á`’'± °Î<ƒjJ9PªC-&1DVóšï|û-Ü»ÏÍ7 %š¦¥*Kڦƙðäðÿû·þ%7ww)Ï>`ÏN˜MDU‚\‚"ßäôèÑ“=.™¨U#*à\Ê#u‹Y §Ý‹¸MQrÑ ‘Sü,);à‹m”ø¹»Ï*v§ÙQ°Ô¬ÄW1¼sx× ’¿¾ï.¼ZÖ(>k ””/4“¼ëB…辞vÞÊZ§å¥ËF@1£½|æ—•61$ˆymPC 7ÂZEÌATHF}¶Â+ÚÕR›Å‰u³àý÷ßå×ÿ‡ÿ‰/ü›/Є@ÛÖ˜E†ƒ’º]rpò”–ÿíó_ó»¿ñßÑüÅç8þƒÿƒW–÷Øe†#ŠŠg &IÑ~çߣ'ÿ=z\Zç/ÀO,“-™ÔTrÇ­ÒòÀf7-–‰R,mvéÙ ¨³ &k”Øu>aI˜äs¿Ôeäé|ì|íSþFÒàx͆?ÊÆP(‹5ºÝçÆÍ¤" þRGÐyA H) –»í¤Â wî€eñ “×ÙñİÂ$1(ŸüøÇ¸¹³Ë ;Sn\½B啳³–gÇ„°€Àxü˜/õÏy÷þ»œ.N™5KÊᘟùì¯òþÙ ß}|@ôOÝc¤-ó{o³zçë\©g1ÑÁ·ô‰~=þº¡Wû÷èñC'0ºÎÂ?-Ö~½Ywû~Sˆ‘äsOÉD ¯‚¤%"xbR¢æ¤ÀÂÁhP¢±¡ij9Á¯m”m(+c2Å€Õ¢g3( ’åÓÂ.ÿfãàH9t0?#ˆÚ)ÿ‡`Òâ#¥l£‹du¾’ÐvÅÞÎu®Nv©OHaÎérIP¡Ybݰ?{Êoÿ?÷m"†H¤ ŒޝCÍr9cÙÎqìx¥L#î=<ãOþô›|üÅW‘°`çÊ \9ägÿÎÏó›ÿãÿ̫ׄ+å€Ó'Çüù_|Ÿˆ+^wÑë¿ÀÓñM4µ bêÇþ=zòïÑ£ÇåAET%í*¢‘,ïŸ:”HáKu$fQ ‡XÂá:}@Ì«—xA|žÓ‹µL|Áh8¤uJyϾ-ÃbÀ¨¨h›9ûNyå…˜I`U@kÔa! sÚt“—' bùÑ$ A'Ž˜rÑ`]Tq´lÔ¦†kW&ܸuƒ·Þý.­h›šè –³³IPÂQT# qP$Kà<ƒj„¹#`ÀÐbd6;ãôì¯0š\!1VãʨàÎŒ‡#\UrðµSž¼}ÛW_cp³aXäóJMÙO=ù÷èÑã2ІÈññ çÈKõ”À” ‰ÊIsÄ,A»»aN1H ._Ø[LÁiDC6ð‰ÌggWЄ) H†%¡ÀV+–‹šï¾ý=ŽOOy¸÷ˆkWw)‹‚—Þx™ÅbE"Y¹SÈçv’“}¡41¢–6¹®ó$HÄ9ò„ åD@ÓH+Z)AÅ2 í õ®¨3’%bŒT® "\ÈjÄ|¾"4‘ÉdŒº<¡À «ºa6_Rù‚+11?<àO>÷9nMwq¢œ-–\ì’ã·ßçö‹oðR³bP)Ë(DM?ШÖ=zòïÑãoùî=zÂd\tc‡Sˆc®àÌp…‚z’ïê5vNzŠÑb@Q–XQŸÍkÌBçWßYñJÊ6Âu. ²yP‹ðù?üS¾ügß@œ#…–›×®0—üƒû—¸që:fKJjbŽí%m2ïP˜Ï:‚”µÁÎ+¢-Žçƒª¢i[ ѶédL ñ‹Ÿý,_ûâ¿âì茲ªpeAÒDYzœ9²+Q"Ö+PGJ‘(ž'‡rçæ Ð"…bÑ03õ?÷ܾøùÏó•?úc^¼z•“£î¦£›·xxxÂlgÉ÷}—Éñ]VÓ¤Ê>Ú««zôäߣGËÂÑáÿì·~›Ïüüßá‹ú'ìLv²ÏŒd‚wÚYꢉ—_z•§Ožr}o‡ºiÈv9‘qxïA…Sœ_›óx’Ò+ÞZœ/p )%|Ypÿà˜áΪɖ/—XQð[¿ó9n¿ø"ׯßdïʵœ¸çïs‰ÊUx -€DárÂ`¨Û!xøˆ²ÛšEÉ+˶a6_P„“ýC~ìïþ$ôŒvQóþ»w©ëšqOþ=zòïÑ£Çå w«ÍªÎçoY—Åsm~T1STÓãK9‚7¬¸IqÅâì„Ô|áªDS ¦šÅ¼Á^xñeÆÃ!-Þ9H`‘Ò9’%,ee~¨Í¡(Λ0 å|Ær>§ðŽkHÂí;·‰©æl~„¥ŸøÔ¬VKRh–;,Vs^}áebL¾DQ–uM²€,Îö¹ÿö×98}Ê´¨(v|ÁîÎ.ÍjÅñÑ QO²ãjÌt2ÁƒŠ"¢Ú€jEkQc8r<›AQð¿ýï¿ÉþÁ Wž³ÙŒ½É.å b2’ j7áé²åÓ ÷W~š³Á˜÷ïgmD=ù÷èÑãR¨?EX!È÷˜TUIU#I&a'‚ï:öÒËb}ÂÉÓ{ÄfÉîî£á„ULøÂÑ¥ÚÑ4fìoòøè„&¶¤J )y÷ÝwUCáêÍ€)*š¤˜7‘Ï`ç»Wn¡Z ’@•{ï|“МqýÚUßç_ÀñþÚ¦¥,4Ë9»;B]3¨F¼pç5^ûè§(vnˆrý(mÉ“o¶=ÁûÀ(–ì 'ÌF%uH¸0ÀÚ€U‰ÐÎ0Z -H’Ò“:A©ì^Ÿ0›ÏùÜýo¾õ>‚#­4±áxeÌŽçÈjFÕB‰Ë–ÓƒÇ,Ư³\ã½{',æK®îNú7hžü{ôèñWá°â§âܹ}÷Þ}‡ýýÇ”åRKZж-&ÊlÙ@2ÄœËûÿ‡÷Þ£YÍh§¤v…Ê <¸?ãätÁd<ƒ¦®)ªÇFœ>~—Ãý'´¡Å‹SÎp¢|0k1?ewwŠŠ›w^âÅ—_çÊÞUêUÃÉáQ¾&(˜æà b0`¹lXžÔ4Ë}ŽP+ר|`V?%X6g\™N‰1òÞoñhÿ€OýÄ/ñò+¯Gðµیñ=ñæW>kf`9È#Ô´ÄØ"¤ZqÞ#I¡…(½ãÚtÊj9çö‹·™Ÿ®¸ûþ?ÜÇÄvÉ–HˆÌ¢1[ÔÌOÏ(ThcÍ騗+¾ð¯~—ÿê?äc}ƒñ¤'þ=ù÷èÑã’pvrÈïüÓßàæµR2V³#Š¢¤*†¤v–‰Þy†ƒ‡ûOˆm¤*•Ö–"WÆCdP¢"iA»<äúxÀh”!PNÙ90œrô脚, Œˆ­QT;Cc8Š˜Qù1õþÛ|ïà]ªÑzQóôéc†£1Óɾ*‰ ʪ`·på:8Køºa:Ù©q¬Â-Rlb¶ 6ÀÃÑ„åÁ7you—ˆâ¼VK†ê(›'ʲiH…á0Z¢•1%¶@ ¼²;ñéŒýã}î?<äÑÓ#VM(5¸ÔSÀ\Á““ïè!¯¿Z³3®xgÿÿ$’Üœ^å÷ç·¹vçUþág> û7hžü{ôèñWÐ,yz÷M†é&»Ó1¬N)B8¢P%¥D3Lü5® …TA»œ£Z¿>]áT©†êùœ½é„#N[šTÚÃ[•M4¡$äÌ ÔyªaÅ|¹bX*©=cY·ÌNŸÒF(Š‚ÑhB +Xœr6KÌ=Þ{B“¨Ê_AŒ5mUéXpâhÛ–ƒ“ç„åjÎ`à(Ä!Þ¡E!˜(~8e¾Zq||‚CŠ1 PîÞɶý1áBIAv-D„ÐæÜoFЉÉtªYò­ï|‡‡OpåñXËrµd˜ZbJ1Ú&òôtÎãƒÓ)ËLJ̢±ºàãŸøiV‡|ëî=Úú7gžü{ôèq9(¼c\RsŠ&˜Ž=»ã!mJ,—Kœ:^zå%VMÍЖ¡mˆ)á‹’zUÓÔ EU0qª¬Úu_ 9>=eor…6&âbÎɘ¶ FÓFRRƒ¦)sцoÂb>'„“aÅkœ+(ÊtgˆóùœÊ)RV öì?9Di;Ká)a eYPîí"*Ä&b‹„€…HJß°Z6LLÙÛ»F 5£‰Ñ¶R’Ö¸zì IDAT–5€ä§5IÁgmd6.òŽï½û.ܽÏ`÷zÞå›B@Ú@L£æ“H`¹Z°tŠ Fœ…je8~xÀþì€ÕbYïïÛ£'ÿ=z\,J¼pómh) O B‹:(Ë’'QŒ‡R¨ ±&&eÿàQ¥ðš„Qé‘\3;]0Ž(§mZ4·nfOüɈùri¢mgܸq3é r"ÕdÄîÎ.§§§¨Àh<äèä˜ÐUIh"‡G‡ŒªUU‘b$¶‰ÑxDá š6àKxé•õ*PÇmñ…§ˆ+ °õìŒ/ÜØËD*Ô+cÙÂþÄÏ2)Æ|ùþ±%H )‘bK²D‹c[ˆ-ß~ï»,W-2žR[@K¥ 3b3ÏZˆäIÖ` ¦cåÚt%‰¯ð˜†1Kçy°ž~ï]N­æþ½‡4MÓ¿9{ôäߣGË:Çt2QRŽÏ–e¢¬*nܸX¢©k–g§X[³·» fÌWs®Ü¸ÂélÎþÑú$LGÐdµÄbŽö-ËŠªð1› -q¹`<Ùe5¯9].8 o‰iY1°Ðrrô”ÅrAlgóImÓ0ò”ñ` ¢´ñšÐbˆL&#Þ»ûN•ÁÎ-Îfºnq…g÷ê)D¥©W Je ²Úøô‡¨”£—¹yëu¼ó.Gûû\)Ñ"m „&Òb¤d$¼/8œÍPq˜:D¡ Ò,°f…OÕ‚„§˜N†\¿:¡Mp÷à+wyá£ç»OŽ9¨çÌê¼û.mÓöoÎ=ù÷èÑãràœ0žV¨/±Ú˜¯f¤¦fõtÎÎÎ'±8[Í 9B`.ÌÏ–ÏNy±¨¸sçî?¸ÏÉÉŸ>ew<¡ò%fÂé½GXŒˆS¦Ó)×JO½\ŽQžrHU*'Ç'x‰„y¤,KR ,W-mh¸1²ª—8§''ï3ñÕ”û÷B`4‚±ŽD ,—-;ƒ)ãaªJXÑ0)t*L§§‚”€W‡EHE…@m|ïÁSÞ¼{ÈK?òœÌ‹ú1óU$Ĉ÷õ K}´Ožü{ôèqI(Š‚7^}áp‡Û×®qûö‹,SMÛ6¤Uä3?õ³”¥£, †ã!…WªjÀîx‘DÙ PQ"Š…–bPæ½xÛRx!¤ºÉI€‰£M‚…HQ)Nؤ …Ç€ÕjÁr±¢,Jb´mMJà½#„Äx<¢(Kœ)œs@âSo¼’ ’)Ò… 9 ïIM»"Ñ›’®•¤ÊñÎýG|ó;yáêKèÙ1OïÝER‹J¤IR…{>`÷ÚU9DR¤ ‘ˆ@²šß!ùù¤€j‰¤DJJ-‘T·O[5„¯q¶„yZ²l,Q `9ëÉ¿GOþ=zô¸<ìLvøÌÏý<ƒÁ$w«ƒTóN»MJY:æËyW,@5³³SbHxçðEA#MUþËåœ#ÉÞ{D„&F¬nX¤HRǪ©qΣ*T.™FŠ¢  ¥÷XjqÅ`€%Ë)É'ˆËN o°ªóý`L ^=Î;´(QÕ¬´7O“V$‚Q…a¨ÛÈWß>à×ó·©K^ûȇï~‹ö쉑[Ë»üÆxððÿ‘Ò.k’5¨Y~í±EÄ0\4\"O3R"4‰¶0Ú¦f0إػœX0_’,„%¨ëszôèÉ¿G—‚dÆrÞã˜Í#ɶµNó>;ªÁHœž>Ë»|Í¿œ â!Gï®– Éb雑BCL …#Ô+¼óà"Á *J ªÚ‘vë_s'Ü´§.§¦H!(¨0Au€‰€óˆzÌ€¨¹ø0,m)«!¿óÇ_å_|áÜ}|ÊG‘ƒwþŒ££}¼E"‰˜²¸/Ƽã_Ô ÚÔ %„EdÑ冨àMPR&JÐ&#µ5Óá”b8¡®nð¸õ5 h¨g¨ m ‡c®^ÝãXJÔõÿÔöèÉ¿G—„§§ †‘®ã'yl.)ßÓ·mCŒç fg bŒ$3ÚPc3(‹ïÊœÒgFÛœË{oïó?ªÙW«2“¥å1·ÄìœBÄ$Q%…&Eœ‚Z. ¼!¤^Ifˆiw±qâ A°6 "˜E’X.&€ÊŒAm̪]>ÿÖ}žœ,Ø©k†º`b³DT )ÄHIp" ñÊǸ~u—¶]BƒsŽC$8ÁmJ´Áp$˜ÍÙÙ½Ê×ÛÈÓ•'„H”#$AÛªñ”ë7®#ì?|J²~ìߣ'ÿ=z\V矌å²É6QFƒ!9Â'C‹)*1¶]Wî)¼§(EQFŒÐ ¢ ŽÜekî´Õ9rѲ;މ‘¼€ e‰¨àTA‡uŠˆ1ÐDP"^”Q9 I‘6$T4çHî¶“$袂óÁažX2DI‘épÀ7<å«oÝãj®è –Mžt¬– AqIùù›1(=ËzÉ÷g\ݹN¢Æ‰"ùÅb‘HH á¿úQž¶ÆÁiMm [¢5XÕpÄGÞøÿ—~•W_ï¼õÓÝþÍÙ£'ÿ=z\ŒZ @UÀ"m[#ˆ–ƒwÁˆ8'¨Î)ê+L–)&œ*ê ¡ˆä‚wªy‚ Þã½Û$óm|L8q ' EðΡ.‘’SD-‘œ1, ’¥8ÄEaX'f)qprN˜îîbÖ¨% ‚ÅZ2/†|î _`´¬Ù±‹ š)Åe»à[PÃH¤¨L'#‚%¾ýÝ{h1a<ÑÔ5.åÕƒ‘°e‹7cÇìMos¿QÞ<8¢±!´sšvZ³³÷ Õ`„áY.WñÊë¯0Tý[³GOþ=zô¸Pºœ¬g–pÎ#Jçgà‰‚ó.wíT ïsñîÿcïÍ~$KÓó¾ß·œsâÄ’‘kíU]K¯Ó=ûFÎ I‘!“„ †a‹²îì ÿ/¶ymƒWH †„ Ò¤¤‘¸ ÉáÌô,]½L/ÓµgåëÙ¾åõÅ]CÛ€A,ÚàœPÝ]U‘™È|¾ï]ž‡ ¥F;@§r»(ŒÎžõÀ!ͰéÛc ƒ!`Lª |º½¥ðJ77k­>BŠ,ó­?ûCvöùÌç?C[;ººA[E¶½ƒm>¦E Ò’[Løý?~›oýÕˆ ªŠŠ -Þ*\pD%DQÆ TÄu¼šfÅ_ÄùÀ£ûÙÛ0.·ä%yPu‹_¬1¶$–9ÇÑñaµ¦qŽ9‘èר±õ\~á&.fh4Ÿzí †ƒ’‡ßç|±æ¿øåר™ôÁ>=½ø÷ôô<—{Z•S°Y—Û°ÖXcå“XÛä#Z¬(­Ð ³¥MªhCa #>Þ Þס$Í(­S/Þ´Jˆ"AňlÊöZ)´ÖtÞcŒ€÷`"9ÄHi,f¹æàÊeBÓ‘eW¯_ƘŒ ‚(P:™MÆûäƒ!ß»{ŸÿãÏß&š_=!÷5^u8ÈÕ"Q„(‚—€(ðÊ‘ÅX¶‘×^½ÁK·.Ò¬Š,'®ZΜ૚"ÏYéÀÙjÍÓÐR^¹ÄªmÓæ:ÇöÞ1f\ºt™¯}ýkœžžòý7ßDiͪmŸyôôôâßÓÓó7ŽÖšáhˆÒ&‰9ŠHÚ§—°y¶1´Ñä6£sÎ3¼k(Ê ‹Åšóó#òA‰-r¼w ÊãÁcÓÊ]¦5ʇ´‡o4εXk¾ÂÚ‚¶ûd¦Œ€Ò ­ 0ƒ`MNT=ÈÈ£âwûfýöG|ù…‰¥FcuÆÝwïÒϵëWˆ!¦ !mypxÎråøwþ'•ÅuŠ,th_ãU fBç:¼Ä4Ÿ Òì‚ ›D?Gže„ÐáCG™iªõ’ÕÓ]Ý Ùïxºj¨c†lÑ´B¨*”²É˜ÑÁv¯òÒ+·øþ÷Àã'‘1™å|±Â»^ü{zñïééyN,—K~ÿßü7o¿ÆööР„Ét‹íÑ¢%F1ð¯þåðàÑC.]¼Ì•k{ܹ}‡‹—†üë?û þäÿŒ2péÊeFCK–elmM)ò‚¦îØÝÝe8 $ráÂöö(Ëœ¡É±Æ¢ôf×ßy”¤šDrÇ‹X­qÔ€˜—¼ùï2j–œ¾óoŒ/òäÃ{|à+d2áôÉ ¢"OfÇ|ûGoq|rÄb±f0>  Cf+ÅÉ"À`âÈC *â ©¼ßy‡¯"QHk*Ù÷kÐZÐÊ0QNsötƪ%9‹¦bîk°x‹ï€kQmGi L9âúk¯0mññûóÖ{wÑÆek ¥™lm£7U˜žž^ü{zzþÆ©šš»ï¿ÏÑ¢a:ž"J£3Ežr›ã|¤n[ªªæðämrÎï?àƒGy磇Œ†a÷à MÓgÑÚ¨X¶/žÅªâÉñ9fsïÉ cðMÍWØßÞáÎí[¼rûãáÑp€ˆ¢©–ˆsDçÑ¥%0âÉaÅ·Þý>Zy¾qã7ö.ÒÍWŒ/íâö§׎ñtÊÞö6*ð¯¾ùloMqŠŒl´Åüø”.Œ«QºCT²ÕuiU m7`5: ]dã·Xm a3ôh çOϨÎ+f!ã\4Á Š€‚AE†¯—H· j-·_Fiæg§|öÓŸ"/GLwöOFdV3©kÇh4ìßœ=½ø÷ôô<'Dš žãù)Úf´]$ÆÈîÎ6''ç MÓ0ÚÚFiMÛt4õЇOŽØÚš°;P ¶°y†ó‘ƒñ.Æhêº]2ÝÙ¡vOyrvÌîÎ.m×ñàÉ!'‹ k o}ø½É€ÂF [°52*KêÕŠ½Ý}´Q˜|ÄÉ™c]7üÊ/ƒ›»CÚ‡/qüð)öÆ ¼ùÖ›üÞ~“o|þ+¸¦¢jkÊÉ÷ŸS w0j‡£ãM€O³`,C é FœÒ¸¨1!úx‰„‰Q0*Ýü£§A3êUŤ°X­ùàÞ1«udF ñ5*8ŒÊAe(S`LNÓµì¿p“›·_á…—^g²¿Ï¨¢š–Eµb¾\ðôñêº&DÇÑñ9ÿíöóìLú÷gO/þ===ÏÅzÝqa0¤Z-XžÍhëÈÖx—>ø¥4Ú(öö÷0ÊÐ6-¥5ˆÉhšŽG9||ÈÎÎû£}|Ó1iچЎۣ´«?ÈÈæ{#ÅRÁ¥ œž-(†CÖuÍz]a3Ë[¬£e¾è˜.8\yæó“IÁîö6±Yó?þ—üxkBã‡!ð‡¿ý¿±5Ýak¸ÍyÓq|rÎt²Åö…=Šñ?zçïþ˜ÝK:ºzFaG 9Ð%s@¥¡ <ã HÔÐŒ¶dƒŒÌd´ëÀ?~“YGNé\®AL†G@g ÊmL,øOÿñ?ãçþkøÐñã·~ÌG?x‡§G'4uK×-ñ>ດb~rF×µý[³§ÿžžžçCˆÁᛆӣ3”6ìlO ®¦kkFã ƒ²dww—ã£cŒUL¶ÆLw¦TUÍÉɃ¢@D˜Íçd™á|>g²µÅp+"•$0°–[×o‚x–«†Ñ §¸xÀxÀa2)Ù¿´Çrµ`^5,×5oßÄÍë×YœŸÒÔBQ í¸uãïÿä#šî?˜±wYW gç 0‘<º Qª iV¬Œg[H»ù1 QCŒè(›a? Ú’ *çÁÑGUGV–hiÛh P¢bgïo|æK\»r•ï~û;³\¬¨ëšºj‰Ñ%$¯$õù•‚BOO/þ===Ïç:3 †%"Š«®2ÝÝ!Ë„Óó#ÚΑåyžsvzÆùéƒrÀz]1Þš°»»ÃxòÎVë5Åöö:+˜-–´mÅ¥ƒ ¬– –«ëù‚í-Ö«uçØÛ¿€w-“aÉù|Fí8=>¡©kîÜ~•øó[Ómë%OÎ9_,9<{‡¶m±Ú0. .º)e9áôtŽÎw0ãæÌç-MÝ2ÞÛÅæ†zÑÊ\… .™÷ÄðlµO!Ä“ð«äÖ'€±–EOŸœrÿð”Np^pí2ÙzµmÃg¿ú ^|õ³Ì5ñ­ï| ó5mç ­'J¤ë¢ ÈÆ¿ Íl& Eú7gO/þ===χÁkƒ`ÙÙÝeTœœ>F¶¦SÆã)e9àÁý{Üxá*W.^b6;£œŒX­j.przÊÜw¼ûÞL··yí¥¹zé {{ûÌæs¦;{œžÍYU-Ù pñâ5~üÑG<¼ÿ˜º^ñ¯ýù à£)Êœ_ü{¿Âw¾ó&^>øÉ=gsn\¿ÉƒG™-æÉß_E´Éè\Å*sÌÇÁžâWÿÑop¶ ¼ýîÇŸR·Žl4!/ ‹¾ ­’_€wˆx G‡òÉø(QhȲ‚@ÆÙÌqÿé9­Ô^!®’ÿ€ÊäEÉ—~þ—‘|Ì÷ïÞ¥©¼D)\×`ŒA¼CiE1(¨]‹Õ “YŠÁ€é6íÕ뛥žž^ü{zzžÊ ºÄ…Èj}ÎlÖñðñ\ ìí]åÉÓ'ìnoó©O½‚b¨ÙÛ™"Z¡Æ‘år†V0mñâ‹w¸}ë;[S?~ÌÉù9]×ñê+¯òÁÃCfggäOÏY¬ÖL§cÆÃ1Ÿ±®ZF£Ó­)Ož!ÀÝ»ïáœGkËÙ[oo2å0ZÓµ•gt.ra÷2/½ñ¾ýýw霥é"±kÑyžã\À;·qôh­°VˆÎi¸OÙ„iBL7qODg£  p6oi¢¦ ñtTP š|²ÅÏÿÂßgëà2‡ON–cœØ×†ã’¶kÉ‹’<Ï™ŒÇL¦cº®£( ʲd2sñÊ5ÆãqÿÞìéÅ¿§§çù J³n#cWsv:#Ë —¯^#ÁGêZ1 YÌ–,g'ììî0P€o[ª¶¦È†ÔÕšà÷µ_äæ+¯qýæËüÂÎß4TË9Çó3fg3œ÷¬« ¡È EIVh2›c¤sDXÌ–Ï{zzñïééù›¿øGÁ¯ZÂ0cuUq~>§ªšÈt:aw{›û÷ñÞ;rçö-^ÿôeN0Úrý…—8;;ãÞý·ØÞÞæ'ÝçíwÞ¥ Y×kÀR£•¥C²ò„ˆóÅŠý½]„9£­mæo¿Gçb²FPZˆ¡…ïl᪆à!ˆ‚ \yá%²á¿óÏ—ŸüøCÊ]º°¦s5J§$?ïÖ`2‚ï’Å®82× $€(Z &’Å´ÛuD"X£qѳê<óÖÑ  Ä“ApE†ÊG¼ð*OÏ×´?|›Ãã/]äÆ 7Ø»xË7oaŒ"A©”à½'e@ð>­6mÍl¹ÆØþGmO/þ===ω¶mY¯|úeÞy÷‡tmCž±yN‘YF“-Þûñ‡äYέ_â•×^c<Þâþw~ÄÖöˆ½ L¶¦¼þé7xë­»œœ|Œ X7ÕfZ^@â&Ÿ^6‰éV«´bw{„ªiøáDˆ­MºyLjR0(k¹¸wÀÊ,8==CÛŒMˆ<¸÷„Úµ !xœë±ÅkK #zâ úÔ;/>z"©ëo7sv!‚²%³Î1œîðµ¯ý£á£ÉÇgGüÕ·þëã'Ør„ˆaûÂuòbDµª©V5³Å‚›·o’ç9‹UEÞ¥ŠÈh4"+R.Vm4Î Æ´Š()uIÛúYÿž^ü{zzžZk¢(æ‹mY­„K—J¶&; š¬(ÙÎ<|øˆ+W.óÖÛwÙß;àÉá!§g–7ÞxƒÙ윿úÎ÷X-*”–”  ­‰4I'J¡$õÓC먚:ùØGavvŽ2:6@´"ÏJf§gtÎT@$‚ ©Ÿ¿©—;;¸º¡jªÔäHt-iŸ_bL%{À‹¢#Q<‚U Œe,¯}ùüçÿÕ?ãÂåk¬ækV«†ñdįÿú?ä÷~ï_ð½oþz8¥ÜÛ¥ñŽñxÊ•+—yõÕWÙßÛçèèˆ,Ë(6«!„ME´1h íZDZ§-<óª"ľìßÓ‹OOÏsBDˆÁq÷÷‰1`³óyKŒk®L¸ÿ!ׯ^a0Èùd¸mP–\»v™û>æÝwßåþƒ‡¬–k´Ö„TUiEžg”eÉb¾$x 7€$¶Q¥Á¶mH¿æOž[ÂÓ5KNÛ(S`U†.2lQ²XÕ›<FQ/ "ÚØMéß\@„-!%öIÀKÚЕ¦ü%xö/]çú‹ŸçéR1kùÑ÷¾Ç»wßÇK¾øù7ø¹_ú|åÿ>ƒrÀélÉb±F|dPäœóôèˆáhÈh4b<³µµ…÷ž¦i@$%$†Hç!º¦%ú<ËuÝûôôâßÓÓó\å?ýKY´Éð>âÛ5Û»»1”ƒ’íé”ÙÉ118œw<=yÊ 7oàƒãÞÇ÷9<<­ "`@§Ú>mÝÐ6§:EºÉÇÍ•{ÃùùYz Ÿè¼Þü¥|²p§R5 DŠñ.û—o%£iš& ðÕu…5EfiT$Ôk¢µ`,ŠˆBÐZ|Š Î‚ê¤’¿ x¢aZ䜜ž1~z•Ëàiª5®jùÓ?ý~x‘Ï~ás¼þÆ ”-ùÉGßæüôÒ·§ÿžžžç.ýeqmƒµ– 4VÕ =) ¡áå—o1–¬ßù€'ó¹7^çÇ?~ÃÃclQQÄÐVD!Âp\¢µfµZ£6ëpJ|ºå‹Jà „M)@ž%(Q`tšô÷Šáþu.^£j¡nZÖË µ^RKEN -™6iZ>th›§¯%‘(‚(Ao^¹È'Ç‹Tˆé)"ê¶ÆÕkNŽsùÒ”,Ïè\‹V‚¯áðñcêªÁ5w^z™/ñ«Ü½{—ÅbFaoŸ«×®RäQ Þ{bLQÁ#µó¬ªŠÐt( ÖZrk8;=eµXcìßœ=½ø÷ôô<_2mñJ¡€­ÉãÓÇ‘˜Î$º QçD„(-Öä\¿tƒïþùŸ1ïÒºŽëW®“ç†õj…ÑB‡Ñ! eYrõò?|LÛ:œs?-/ φý†Í ”G© ‘Óù ؽ|“Éø Å鿆«ûœÎfŸžb4´®­‘¦‚fÎ ‚Äôº´ (=Úh| ¨LSùŽN`w÷2»ɲ!N\Ô´>Ã;¨¡ë„fݲ5€ŽÉ PJmçñ¾Ã»šú» <ú˜íí)[“­ÔâIs€6iàPkM'ÂùÙ)ÆhL–Ñu-Mt %& ììíõ«~=½ø÷ôô<ù×ZP™B+ALj8Ç`¼EY–”ƒ‰­„¿üö·ùɃ§üÜ׿ÆÛwßçìl‘Vó¢‘r0äáƒG<~|ˆ5 ZËWJmüó5)õ~ãªGØLÝi"k|ñ+¿ˆ— £ ¬!}¾®¡˜NÙ™¯*ŽÎËÕSä„ÎÛ5ƒh¶–ØD:ŒVˆ8lfÑ”;üÚ¯ü¾úK¿Äh²Ãw޼˷¾û&Òˆž¦[2Îu]³Z,0™`ù{r} IDAT"jŠ‚@êºÂy žãçŒÆCFã …bPåÖò¬`XhÚ«5!€6)Ð'Ë2”Rc”eóïéÅ¿§§çy²gâhƒïZŒNeüNÞ8.ݺÀdgHfsªUÃwÞ|  {û—8;=C$ vÝt|ÿ?¤m»ÿÇ—‰èͪRˆŠ›CdD< h²|Ÿ×Þø<6›Ö5Ñx¢2xß’ƒÒc-Ó½¶††ÇO9==£Áj‚o!P‚F!*à•B+KpÂö•ø§ÿõÃç?û>øÉþí_þo½õFe4]‡o*Bð@$zGçZ¶ÇÆã '‹“4ƒ ”ÃÆ‡@"õzIY XKËr>ÃŰb ”£!Vg¬²Œr8¡(Ê’n¹`0¡”Â9GY– UrìééÅ¿§§ç¹â#`2|ø¦a4­b=o0º ëËUÍg?óyÞ~÷ï½ó6˹uç6gg§(ù `80ïÒuŽårNÝ´h£˜Œ' 4 !DÁ˜$v£qÉz]±8Ÿ“)Ë`z‰W>óUò|‹û'~« †YN§â“@ WpÕ‚ùù ¬F[MôÌàCš+Ès˜^x™¯þ⯲³GÇsþùÿú¿3Ÿ/CÚ—2>™;ˆ1Ð4 u­Óž¾1©'Áæc"AaµA›HôP7iõQ‚‰ß¢b:Ý¥Œ6ÿ4Ãá”®ë0Æ ”Jò×:%==½ø÷ôô<§{?±­A}2þ®h¼C)CÝÔT놭­=$ö¶K.ín³l*ÖõŠã§É C×t8ßòôxÉz=b8(Ž·ÈŠŽÙ|NU5h£´{E3QÊpçÎ œŸÒ*عpƒ£“SŽ?`kT2Ê-UÛ±ìæL#¦£™Q•aŒa:e–ƒÝNÏOyôä1uÛPÕ]íï(FS¾þ+¿Ì§¿ø¶§¼ÿãHpüÅŸ~›“ÃÇ Ë1ÒU¨¨Ÿ*¹Ñh¥éºŽ¦iØÓSŠ¢H¥þgkˆl† # E–[R÷#b¬MáA™Fë ¥-ÃA‰÷žÕzÍtºÑ–¶ë°Öâ¼ÇƒˆÐ4m?íßÓ‹OOÏóc2ð•Ïß¡n…LJO©ÚH½®7"×cþäÿ„Ëv䚪ªxáú”Å:c½.ÐŒœD-2|ãX7 Ëu…IÓ€ÐÕ J[tžQä–a>äälÆötŸóó ÉÆ ³’GÜc½\qûÖ-nܸA–eÔ§é…«Àl\ % PÑãc4óò+¯Ó:Ϻ^s:_ç_øòWùâWŽÞýßûÞû¸Î³¬î¾õâ¤m[Œ5h­ð1­"j¥‘è ÞãÚ†Ùl†Öµ10B4JCŒ‚Ö)|HÙœ2/MFTÍŠÛÛ´Û’ØLn'(­R__i²,yd£"‚Ñæ™`OO/þ===ã”…å ¯\&/w™¯nÑ8áðéUÛàC@kMSͨëŒñ`ÌîNÎÖø:E±YÆ~ð6óõ M¤n–ÒŽ¾¶ ¥LšÜ) ¥06rýڬ͸W?æäè˜í—.³˜¯˜/Ñ-f\½xÀK—ö‘Ðâ}… †hðÁ€öˆ !BÄÅ2_.)c®\{‘ñÅ5Ãr›rz™ÿñ·~‡÷ïasáÊ¥KÜ|BWµa3ÁQѦ[}ˆ¨Ì¤-£ñÎ0*Xkèºô{…ÁA+Í ,ɲ‚lP2ÝÙ¡lGøÐ’å9ådŠ59ÓÉ’o¿5 Áo2 Œ1,—K†Ã!gçg›ÀŸžž^ü{zzž>ÂéºfOȵ"/Û·.£M†cˆZ³µ=¥YvœŸgE^Ïþî>1ÂÅ [äENðž³UäñÃÇxßbTA>ÔÄ 8"e©ðë'`Fìîí£»<žÍiÇ´ëVk.]Þ'¨*Ûõúk\¼t@–[œ!=áãŸÜãÚÕh¥˜-–Zºõ[ìsVî?QŸÐÕgHèÈGS&“Ñf?Þ#„è±Z¡”ÆjK!%ñ…@Óu¬"¬Ä±{á*ŸúÌ—¸|í*µ«ùàýyôð1ËÅ¥’ÑÕE²øAB‡A…Í bL¿”AD?ë»w]Çb¹$Ë2vww™ÏçÏô†Ã!ZkLn°VcM†µ›eøÎJvÇJk–‹%e^%Ò4DZð±#†´.¸ž/Ó0aOO/þ===σà#]­(Gû -«9Ÿ³Z­Ø¿p™  n*î?>bœØÛßGg†ªnØÙÝ}f›Û´‘óÅœ¦n°Z1°9W/_&úm,VÚEŒŽx=`Ö*ÞÿðcžÖLj$/{m4iœ. Å`ˆiòÞ´²)s—ˆ ø¨ºÀ² èÉ”ƒƒË|÷{ßå­»o›šè„èAD“gZÛ$ôQˆ>y H”ýpÜÌDBp@2éiÛ4ô—ç9;;; ‡#6ý ²<§ë:²Ü‚Êr€A¡óç:–Ëʤ9‚Î9\“Yež±X¥<jÁGsŽÅél³BØÓÓ‹OOÏs`0ȹxeÊ¢žS¹°½}aÀñé‚6zÊAIV”Duµf{{›ÑAXÌ—è<£9<$ˆÐ6¦°´k‡Ò­ 18ÊáÕâŒÜ(:ŽN9]­èšuŠûýä0Ò9‚ï0!'ª0&Å¥q1åòŠHÒÎɸzõ:góßüæ¿çäüÑÂx›«µÁ‹Ö†HÄ(R‚QcDÅø,Ú8JD6“üZ§R¿ÚøðC|4ŒíÏ::¬-Ȍ›d%ìƒG‰FLj‹-†ˆ"Dؿ欗€Ry_£ÆÃz½¦,K&“ 1F¼÷äYŽÕšl²^/‰âY®P ‹ÁI¤žÏÐ ŒÒ ÷øàéZ‡ˆÂ{O×uýžO/þ===Ï­5ûÛûøÆS·¨uKÝÔ¸¦¥skçŽafÐÚ’™…Ÿy^й@Ó¶` ŸýÒçŽFý›³§ÿžžžçƒ6†«W®rá`‹Ùꈻï|—­­=nÞ¹Ia(àütΠ,xýõ×xøø˜ÅzÅë7¯ãcÇéáŽO>àÛßþ˜Éd‹ ¼óÎùìç>2žp4{ÂûOñvÀ0/ɳ!^W€c—Ì€¤C=øˆ²€ý‹—ð¡ÅÚBƒòš a“«dãÄGܤêä³/©:€h…÷‘,Ótm$H2îEŒÉÄ(x„°y.*Mþ#(ÞCU¯•nã 2kðÁS·ÆBˆäyŽóm yž§–€1cȬ%èt0˜1ë¸B‹¡ª[|ܸ}›/}åKtŽÞᯧÿžžžçxóBÛ4lO/pýÚg©ëÀr¹ 3žíí uÕq6;åö[\½q“ÙlŽAqøä#‚ë–‘ñØrñà€ÁpÂëo¼ÊlvÎÎî®Þ~•³óŠûGG€f`-Áyòl@e ˆ)ÎW$€ÞÄ <8zà ƒr‹GNyxx‚Ö]×Q–ƒ¢ ¥#Q".(²<#Jš-Ñ)H'KÝàjîÝ¿‡UÂí«W7n{‡ÆÅ$+äÆ QˆJ£´"†:¢•A¢B´€(!lŒt”RÄM‹% ¥?ù{I)1I 8­S« *DƒXM4ú™™"t]—ì,†Z²Ác ŸþÜg¹|ù¸àÑ£hkq]Gð¾cöôâßÓÓóüP™r”eÎöôÑ;Fã’<ÏQÚ‚‚J9.]Úgº}ã“sŽ .ìã[6–j6# àÁãSfó5]NÎû·>Ú‹OÏß!†ƒ’WnÞf0b°ró¹£ )l†Í2F7Ft1Ðùš‡O¢¦¸ ‹œè<[ã)ÁdÌæž‡'kP Oº9ûÍ)ßy$vˆR€Aň´º'S ’ã_×bU†*Òú†»ï¿‡«+.ìàÛŽ\[ttl縊y{†2CÖÑct$‹4ʤО(> ø!FxÖŸÁ£T: R@° ÑÆðÉGˆ×DíQÚH ™6¨àÐÚÐùŽ(¥&z¡î`gw·ï0,G(3HFBQ£ŒÆU5 ¤ªDŒ‘®­7=?Kˆ~ôž£þo>êÿúôøÿš#e/þ===ÿ´g±~xÌáé,M¬w- QJ¡•¢Çû€kŠg~öŸJþÞmŠÏMeA¥2¼6(4>ü¯±5£ó!ˆ±Š­QAȲ]“‘BÄe!Kù*-ö˦Ü/"žLe`âækD *åûlzîÉ%éuH2Ò tLrH-…ÒǪ”>è¢àcdw{‹[w^akg­É6Ëõ:U”¦ZUYºý]Ýѹ_÷=ÿŸIñ•«×ø/ãŸ&‹g$ðÞ?›O¬±üÖoýOÏfQzñïééù"„Ȫq”E¾•a²Œª«) Ã;·P¹& yz4c4²äƒ’ºªq¡&ÆÈÙ¼áéò Ng©oOrÕóÞ“öé5!:× Õ¦/JƒÈ3;}IËû/?c3‚ OòÃÿèцYÁ… 5—ÐDò\ØæÊ +ˆŒV›u¿Ñ£"`¼aó5btr”ØÒ6@"¢ýæy¥M£ ŸL‚H !¢¬áÂ…‹Üºs›­ÝЛ6…ÍpâÆË?Іqž¦ªpMËòô¬öùEM–ei%4„Í·C Æ¢¬CH‡fý·?Ò‹OÏß!”Ñx%˜<ãøäŒÅªb÷` “F[³ùŒ®Šœ­ÎðN¸uû2ËåŠÑ°d~¾¢² ŽÎ*õ)uLc|Ö»Œ1¢D1€tÐév/!iªÕXmpѧ ¼ ¨,±éVÜÐJ³rë‡÷8[ÎØL¸´€ÅvY¤%H¤‰JGr4!F—6P¨˜†üÄÿ´G¯Uܬÿù´ê—fõ6•‡tˆPJ=û︉Ö*Y  ´f0²½·Ë…Ë—ÙÝ»LQZ”²dYr ¬ª …Æ5ZjçQ"ø¶Á·õzÅ»?x“¦ªú7çÏ8ÖZbìÍéX)•/ÿ?šéÅ¿§çïB °\¯YU5ÅpHVŒÈ En5þÔs|vN°Æ’kC9È1fÅò”ÙYEÝœHkmx‹ÝfàN¥R¸$¢øtÓP¹Iöºé4J’ѤlA"ZTÚEìÒí nXóùœù|Æ|¹äæÅ«hc(lŠì5m i´µHZ D:õó! ;ŠÄMuSq:õý£OƒU"‰ µ1âs!e°EцáÖˆý‹ìíì3œLØÞÚ¡ %жZi–Õ‚óHˆø.‰½H Z­xúä!§GÇ,ŽŸ>{½=?£­ùÎ_ý_üâÓ¬R„øðùsûv/þ===ÿqDjß2_6XIþö‹ù‚åjMž%‘-² ù`L]-Y-kÊRqz>çð¤aU)‚ˆ(T舱#òI8ÎOc{BÜô°U$FõÓ6I2œ|6¾¼¢Ó…Þù*R?7bIv=†ÓùŠºù+{û c Q©/o3ÚèÈ•Å)…ñ"•Ä[£-„J4ˆ¤%MôË'«*õûó"cÿà€l0`<Þbw£2[AÅ´çïœ#´n3ÜY×+\U£µ¦®ŒÕÔ««åœ®mxòà!«å«€ìoµ•ÛóÿC²,ã7ó7¹|å ÿÃÿßѶ¿ök¿Îoü“«¯¼‚s®ÿžžžÿñ÷Ý´ìmï²®çsGP«eGµ\°³[’=±3ŸwœÏ—iµN[bði6.zˆ1í꣨ÑJ xL DÒm_G| |rçV*­Øu®&ùòÆ4@@‰bcüQ’ï¾I™!YþAÕ9>zò˜QYBr[0Ý߇ºb¶®È²’åPD F4~Si0ñÉþOöÎ:Ϊjíãßµ÷>9ÉÀ Ý!]‚"H *¡ ¨Øˆ\±P®qõŠØ˜(^Å;QPéIéžaòœ³k­÷}fEÅWbÔýû|Ã>;ž½ÖÓ¡{½ÿ¤òzÏ+!¥‹p]¤ŽmRR\DN8Œ®(G# ¢c`[^C €ÀLXÄãqt¡!¥$‘(EJ3VJQq¶e‘ˆÅÉߺ•lùk¼ðÂÝáã‰D"Áĉ9íôÓéÝçxV¯^Í9gŸÅ°aWRPPpX¦>úÂ߇¿ -@õ¬ªDRÓø©x;7í$3æ`;EئCšÙäd§‘žžFa,…5ë7±=ßFiA6Ê5½®zšÂ E&GæišÐ‘ÒöâåÒ颒åu(‰"9G÷Œ}WQ^ʤ\¤Thº@#šµ; _*¤¦ƒÔ¯ÜI!RQOx¡3F¡Y dž„è¡™95ñ¦ûJ R(„ãx!©@W¸®w¥$ºð¢¤r(¶%Ť¥æË®F0&š%-=GhÄ“IÒu(MXØ “D¢Ƕ(,Ì'+%‹Q¿7a’’šŠnhÀvmê¶jáOõû‡£¬CäS&pùWpÅ—sÍ¿FPXPxøx…ÿZ|øøû@ p¤@*Ë’„ ´h„XÜ&³’ F­ªØ–ÃÎ|ɲëÙ¹K"EdÌÔ*™Qïªd9]Ù‰žãÜØ»CØ.8%t/›^$cïeñöò:fBÇsîK”LÖà‰dö½[ H6ö=j£½é~NÙwÊbüpm4áy„V6PzÞ¼@(MxI†J±RœXÌýŒ¦â:H‹X¼Ã0ˆDSIIOÃÐ4Œ@Có)uJK )))ÂLÄËÝüŽc ]G¢PŽÄÐ%•22hÒ †î³Ú¼WNJ²³³yö™§‰D"—”ǃÇÔGEúðñ·²0J¸8–‰TqR"`%J ‡#8Òfá² õtJJ\vK¤cK Íu(4\Òs+Ý݆W߯”ÂQ!]¤r)ë™:ÊU膆tÁUš«¡áàéž7@7<‹ÞU¬ÏKjÉ\!h^\^x †JÊd¼š–t28€‹’ G9”–Œ¤{ ˆI€«\\[rq…ëZH'ÙÞWz¥yp, ×I ëâEô@²#›†FH$D8õ< ÊkSlÙq\ÇFi^?åÚhBñ #èuu ¨Y«Ñh+aûuþÿÈÍRª½Þ½ëº¤§§“H$~¦¸É‰’¾ð÷áÃÇÿŽëPÛ…i™de¦`g(òòLÌRIi B)Yl+°1ãà¢ãP B¢cxÉxÊö¬p×뢧izyΞ@á8.†×À\Û³\´dùŸ h†—(è8åaM(4]bhÓ,ñø¢ò¬ðÝï’y(Ð4¯¯¿”I†˜<Æq  •Où#@Ù^S!ÓN`;$›§¸®$9ë×;·«†žTXahH)¼aAŽw?!MÃŽ›˜JC#Óq\Çk†$4l)QÊAH[bIk_:¸JÔ4\)©^µÕ«WggÞ.b¥ ¿½ï?R×(.*`ýºµT¯QM$›R)Q®Ü–•ûÍýá{232’“'|áïã ÀuÃâbòqˆÞ¯t)() f• Œæå“WbS\,F«²c[)n‰ ºÂ %¶ò,pe¶'$Ñ‘h`逆” °½Ä<,À³´qmOY@ éÕÿ—Y5 Ô©JýúõÙ°q#ËW­+—É{¡¼bÀ-×vMI‚íîþš•¦íbÇ‹AJ°œd…A2©¯1(”[¦Hxg°-7éu°“傦kA àïØ8fX¦…¥éÞhAéx;ö®“L’4E€””4\W’—_HqQ !K!]ßòÿ[+ÝŽó‹ŠŽ`0H—c»1Þ\6mÚˆH†´”’8¶ƒLv÷s‡Â¢b ‚eš¾ð÷qà!¥¤Ý‘I˜ ŸSÔ®Ù€‡î{P (â Ëñr à «Á+»“xãlÊ+KJ\•´RËjû•V6þvi,%^j>x.|Í 9´¸…@àµ× dW©Œ¦ Ç¡ °ˆXÂd¯Ò÷òÁd’`ÙuÊ,ÿ²>è{þš$™*»ÿ_•Ý/ÉsþìZ¢üG²7Áîs꺞tÕ*d²«&4À+wôjöR¹he^$m‚Á F àõ 0刲 IDAT“+geø‹óo,ø;Õ óg|UAýúõIKM¥°°0Yù‘üÏÈîg Z·iK$IŽ¡>4Æ™/üÿAPJ‘“ƒëøÖÿß))étît¼O>¡Q•SµjÒú{ñ[!Ù99dçäì×y%_ÖüW÷Ï8Œ™¥>|øðñOâ«”Ïj¾ì >|øðáㆃîö/s}ø(£Ç¾[}þ}èT–Íê¿ka¿UÜ}µ/^ ’™šæµ4†ò†Šcéîq?R‘Lûx–CAû¿¿ù5Ùð—þeõÁRJþÉù®Z² ‰{t=ûÙ&q“¥Iê—‡Ttyɱ_yF>—à—Jz¥ƒHxjBó:ï±OTòO]l+²Ù^ä⸻+ÐvGhP-]'+-À¾îò ñþ²‰ŒûÃS“ —Yöhà¨>Ä|óXþùùù,œ?­[·þ#C7¨]§.mÛ¶Ùg›Ï²Eºjå –-]JiiÌ5úB(¢Q“&´hÑ‚@ àKFؾm çÏgç·}ÂŽ¡ëT«^“víÛ‘ž–¶¯÷Š›vÙ,_¿“Yß/aWiÅLÎJQ%=ÈÑí[вA*§û¤}AA Ìgó¦Í¬†]áp„#š5§iÓ&èûèž(’ã–—,ZÈšŸ~ÂuÜ iºNÍZµiÛ®©©©‡öÚûf"Aî²eѬ9Ÿúd@®ëðõŒ,Y¼˜;¢%g¢ï‰uk×±qãF†œ6””C¼â±_|þ)ËssiÙª•?ÆÌG…@qQ?æþÈQŽ¡NÝzBùnÎl–,ZÄQGñ3E9aKVmØÉœùË8藍iÞ¨vÅTª€yKVóÞŒ%„-ÈhRCß{ÏÛ–Eî²eԫ߀“žr€ßk!S¿øœ ¡Ó¸I“_ð%%?.Ëņ¸ä²+*lèGJÉ·³¾fÉ¢Et<ê(tãÐàô„¿D"cÛ4mÖÜë þüèºA·=X½zÖ>F7 !ø1w)={GJjê_ò#Ñ(½?ÜeËpýnf>* ȪT‰:uëUˆ}‚£;ubÛÖ­$LóBÉ•‚ï—m`P¯ö4¬[‹˜éVÈOÜtiѤ>]Ú6dÉšíÈ}õ–mS\TD«Öm8ÓÒ3èÞ£'+V,/Ÿñsådù¹tïÞ£<üP?š¦ÑùØ®¬_¿Ó²©’rðÝþ{8{þ©ý­Ë^²eY嵜?§…eÛ„#Ñ¿lP¥‘HÓ2ý>æ>*”eUæi«ëR!„†í:H×Ý·ÁdI2ÓÓ±·bÓEjJ*¦ûë“éd²“Ó¦½RŠp$ŠiZ¿rnáZBThžZ&lÛþÕõð—þÿ/’ÉÆ^ê@R%¼]"é’ 4]óº•iÞOy°3.ç™~/CV)š@C!•ðnÛ•(!ö;¤åCCCâÊœ‘[ÖU͇¿Íç~ÏlRò€Ç©Ë»6ª2–÷[Éx¯¬ö}Œ(o¥¸BîàXµê×n½üÿüг üË„¹ÐuoŽ—tËÝEšîM“®CÑš…L[«q|·Ö„õ·ìuUÄwSÞfæj‡c ¤Sã0_¿ü¢}/Š}OõãN¦MVpŸ.¬CN'ºá=¼»‡F(„dÛ’o˜¶%›“›¬eò4!œ@¦t÷[æêºdÍ´wYP¹;ƒ[gz³Î}øøËÙÝn÷ݼæçp÷ÓòÒuýÿÿ¾çrcÈ ÑØ+´æ0lK6/aê‚bz´‡÷>ÚNï ‡PCØÈ}ðKiå1ëóo¨vìfìcêU&)@OŽFÞ“ç”Ë×å`ÙèʳxÐ5ñ‹ëÿºÈÐѽÕ‡w= Ò&?e›/ÿûw¸êº§ÙóêX4]gÛ{w3ø_SHè:E«¿ãÏæw¼ \>¶B×(øbg\÷&E¡(º® V};ƒ•[v²ø»ïØPêx3AJ¬oÿèSv¿º¡1ûö!\üø oq•ŸGQ´i9ßånÆÊ_ÌŒ¯—e–Â~|<–ÁœGF1êý”õK?`ÏékØ>*ª Blþä).>¥7={ö¤gÏžtï|ƒÆÍD öØ ?ߓɭ.É}íF<7µ×ñ¿Ïƒö›$½ž^y¢N o*— >‘Ý{xŸn=8îø 4'–(É)ˆ¿õñÎßµ‰¹ VSZ°ŠYÓçSàŠä䟯Nì'žºíVfmNºîqÌï:2÷¢½“ˆ1îò‹yknaù3 ]'>çN?<ÑÑØ:þ1¾ nl3OŒ¸’)ó‹vÓøWù¤À.^ÉøF1}ƒ»Ïµ ”gH-zn Ã_Zì ·<ëáï`ù ¯sû*¾øj×:„§…ÇWÏæÝiµz_ÆK½“º¢Ð1~^ö&]tŒ_¨.Wjè(79K\žölŸ1•Ò/rÇðcË]ýŽ{ uL‘H”À0ô}X £ï™Õ*]ɯïþÿé„`ë¬÷ø´Áe¿ôœlJ§QŸK¢ôfÒ3.Òõ<(šaì¥Íɤ&­i:{“P ‡Â„º÷÷d†©[6ÄägÇ+×ÁÝ'M$Ž#}—š¿ÊjÃKVÍáå xñÑÓKÏâ ×m‚P¢ÜÛ ñ‹ìk—’Õó™¶«†¦ƒ®ã¢{{<^¡% Θ©¡’{%qRšsÁ°ë)HxüĈ„øiâÅ\ýFmÎ{2„f@H8$lOH¡ ºkc¹Òâh–:ToÛŸÛ›Ä<üŒF4Ü„5A†gÈ»¶ÄF#{üЃ!šÄ4md™Ó_ì?íuRœÙ¼úñלÐv!Ñ(áÃ^bvø:jè 0Ê…’r]ܤtÏË”ÑQüÁw/ §~N|À{ðYOÑÙû ×!,šù5µ†Ñõ_×Ô rçðe´/ÝØ×zPIY°·ìpóŒ•CjùK)w[âB  ­¬/²¦%ŽbÕ«ch{êØ‡âµŸÑ¿i†ž=˜†9idÖéÌÃ_clœÀÕ*‘š–FZJ!uî\HlÍët=òx¦î0PJcÇ’§éÒõ ž5”.ãÖ°ãí> ä£Ü\®ª"è?à  ެfP8ÊU u wO]u™‘Ušõà”“ûrìM/syËÞåüNuH iTªß{¿Ø‚a8¼~z+j]t'WõjHj8vM`kÜA)ù‡NÊšb@rÞyYÜJJ¤T(§„o_E«ìT"Á(­ÞœÃpøöÁ3¨W)H ¡JÛ˘W`¡¹q¾3–n *„©Úv o­´0Œ ÎÖ/Ù».šˆÐö’gØnº7΢wÆÒ­AÑHú]Îç܆QÄ]õ ®¸‹!m«WaÀØop ­üýD?Ùê÷âÛ%]DV Ž;®}úôáøO¤Û9¸% 8³V”ž§Nôî™Î¤áG“•$J£õGX³r&÷?9™%ã“–žÁ1§>J±VÀë· ¡nF˜pZez^õ$k‹Nñ<ΨJ¯ÓN#; 0 c^ð{{E!¥‹”N 2m;w§g¯^ôêÓ›vÁ¹Œ{_1j꜖SÀË—KÇq³0„$ ðäÙÇròóó‘EßsN½tú~ ÒCtû÷S iÛ†)ÛChZ7ÿº7<†/ Cˆâ¥Œ;ûHªGu¢i9 ?%vÇóUb#OŸU–DzÎÒA¹^N‚’û%„¥” 8úÄ“Y2}› ½D=wÛbÞú¾€+/èHÑâÉ nQ…0¨Üìd^X\„a8|<¼7õ†ŽàÂ.õ9mÐr:ÊýŒ9(¥’SUù”Èòõ ºµ‘I×  VZpZ'ŒœÄ6i1åÔLœ3‡s[„0²ÏãƒwÎ$"‚¤¦¥“apÁ/óß×>%wl/ÒÒ+Óç’‰”²ƒI×ö§fò|'Þð[bŠøÖ lX•¾ƒO"+ ïµç<<½ý5@Á<&=ó$?þ8Ox’I3VP–ܪ‚D#A^ç£Äæ<²ŽÍêíÅÌ}°9/Þ>†åU¯`ùÖ]”³qætípcÕÕ:‘”(FYkL-@P pÔý¯1çšúT: kÍ»ôk‘I85BDßMŠHZ*aÝfÉ+òßõùpåNÖ|p+‘•Ó(6R0Ü•Œ=ïJ¢WJ±)YñÊÞ:w0ïIÉŒ²íó\N}s5%¥³húí£<¾¤Cÿûþ¥‚ü0ꎸ`òbòv,â’´)Œ¸áEJvNá쑳ùƒ‰m0{â0jF v­ú„ën|žž÷OgÛ®|æNMë XñÚÇ´¾6«_'룱<¾¬”ØšÏóàg\úæJbñ¯\aüÍw³Nê„Òt —Iþ»`‰µãXyë…¼´Eû=£‡Ãòz}ûW<ùøc<öè£<<îaÞ^º!4Üâ‘fç‘[l3«ï‡ÜúNo·0KÖð¿‘]Én܃[¯>—6#? ¸¨oß¼Š÷gìú£ù|CœÄŽïè¶öEƼ¿Mè¸E1¢-.d³­°m{ÿ÷IÒ¥®”@IÏšt]ElÝW\5âY:Üý·wRl)ŒP”¨¡—G‰Þ˜e»°”hëKYXlòÕÕPZ˜¤w…A4%•¨QȤ Od|ñi|¸²€M¹_1¢{m¤TCÇÙö=w5WÓGóñ;·P?`#%ÈíヲGö¢î–oøz}’µ fñc°3Cå1zÀYäŸö*Ûù¼}^ —öºœ¹2D4=Ì–O–1`òÞ˜òV9ÿåÿ+ëÁ0|z×pÆí:‘™Û,[§Ó껇¹õÝõ }1—vîÌ«+Mœ“pÊdâÊ¢¤¸oëM.×2ò†s}N?ZÞö5ÅEy|þì¹Ìºå"ÆögÖ6‹ÄÖi4ÿö!Æ|±ž€¡cm+ RבäÛî[·¿ɶv)yÛ·ã†4„¡SPO¾"ñ‹7–rDúum‰ë**µëGŽüÛŠ Q–Â)˜Ëˆaã9òêIœ×"“¢U»¿[¶Ùà:P”H«ø7W…pJ™·hÝÏMÇê¢ §Ÿ}2™:ÎÊÿñÜ‚ê>3‚^ÏØÝfî̘¿‹ŽCÝó®§g@º4 ðÞº8tÊb3Å÷\vßìñ§Òt¶/}«Å© íYŸ°€3G]Ç+þ`…u½êç1aÄ•$NÈÐÓûR=‹¾EñgpÙ)­IÁ%¥iG4gAܤî¹wr^ûêÀ± hæÓu;ÅëLŸËöëNãY%qcÛ™_TŸõ;L”ÔhuÞUÔ¨ÖƒÞU‡ñí:Å%ÕH?£ÖG…ý{ñ!e³cÛ6 \K’žpBªÑˆ.ý#ij;Ð ñ,cþuCáÌ~ícK˜8‰léH¬åóù‹Ø–»š+Nþ© òÎaEÖjž=¥!¡šMèÞ¿'†rqÿÀþPÛã7:š¶‹goÁŽöÿâÅs[aÙ ÃðB©J”1ä÷…wŽPÍ#8ö„®h1Sh{0DzŸ:ÚŽ<7+›çŽâÈl‡˜Û˜ÎU‰]q¶ÌçŽa7ÐïŠ{x}X²¬–{Sì7ï×kËI­\Ÿ²‚‹ZÉܯާVk©™÷.olêÀK7õ&3Ýoº~c»óÆB“~®M³¯gHŸ¹ÊÅ»vùábwÅ%kùpÞämËã’~o 5Áöùóùé³5Lè]Óq()4q«é(%0 XôÜ y¹:/MKKl¾Lظ¢P’ËûóV—÷2÷{Í;ß‚¬ýd wiØ–}ŽFºî^üòppNãPl:)%¶maYBx]ÿìÊGsŵ×S'Õ@Y™Ãÿ³±dËvP®†e&ÐL ¡ ×Ä4Ì„R.¦iáRÌ‹—œLn³;yçÔfX‰8¦e¡”Ä6MLSbÙ6RºX&žv- ™ÀU ml4W*\3N,nÑ%ñDW˜ § I›xÁôŒc÷Êë´%¸I/Fz|ôŒ$–¸v „‰RËL Ì¦£@„—5Ù¶ƒã8€@:¶ H“„iƒ ^\ˆ"-‹¸t°d„ [JžÙˆq³¾gú;¯0ù¹ŒY×x‹š%‚¡äñ †-,¢ééÄQ˜–eRÛEÓã.ä© #ÈR^C"aDÈ®b3CiB6¸&`‚¦°Ì8X ÓVhšîËNæK×Ų¸®‹&=¾âÖè͵7^EJYÏÍ Û†Ž¦Ù$âY¥ÿ›ñ>¾1™‡Ã5iW2gÞ}^i­kaš d¬ˆüƒ³Æ<ĵ딻oµP:V<t!lÌ„WVë!ô›!2ÀqL3±[ôGB|W_ƯìÀËŸCŠ'á€!Ø® ŽMÂŒ#4Û•¸Ž…i:ˆ€Â&‘˜V¥¶• az±{W)Ì’|bD©ˆS\jcyÁ1mDÈÀ*ÜȪâ )²„Rkï¦m[¿­ÄHµ×³Øt >’¯žùWUâó7Ñå¾Îè¥Ó°ŒTR3žÀÐÃT ¹”`9ŠhºFÂŒá:»éV&O~[‰RÉk ÓB*…c'0ÍJ‚Œ²³ Ì…÷<ưÖÙ”eiiátb%Kp•ı˜¦ŽvÎ{›KîYÈ/¿N×̦ãb»®·¬Zi!y….¾÷q®hYyóePZò=Z@Ga“0=¼&áÃ2=dn)U2N#Ë;]•k†ÒõsY¶¡WºX‰ +YXöNÊîW9d68†ÒõKØP¨“–žNj4Œ.T’n{Ç‹íñŒÊïìç£bBî±eÒ_-¥‹ë–}<Þ„Ú#v­FNKÎ»å ¾Zü-–>Í˹’pPà&8RB¸2ÍjFùäëuèÑT2ÒÓˆ 4] äî:óò}]¾ßöƒ¸ )½Ðçæ·¯`ðƒ1FM|ŒvQ Ët°-Ç1ÈL‹P¼9[iÈÒ|6lÝŒí$]ò ” Ê• 2HÓMŠ …?ýÀ¦8èUÚÐ.k“?ù [*\Ë"w¼8yfkÆNOtâYœõäbt ]¯‚@þ^ß’d¿‚²çv,—'œIwën{ò1~ÐÚÓõ¨µåñÉ÷y( (÷C¾*¨CûÆ)H·ì}íæ5û›c´퓲G:¶mcÛ6N8‡–ÕïMß@ 5Í{M(¥¡)Ûòµ]øß~õ¯¼“¡­²=úHÐtãH‰J©N«ê0eú‚{òj+%½AS{Þ×ßÚí_^Ö Àu,bq³< C)…k%pãžf&‹XÂÛ€RÚÄãqlY–¤a“°%ö‚‡tûlš]5˜oŸ¼—Ïã *u=s[5ãØ&“ˆ6Yä~:"­-R‚4cÄ^¢ŠåTaàUxfܵÜ?cÍ—üäÓEEè>àTž¾ì~®¾e%M"Ìœ™q¦ƒSé$î½q2×\{Ûût"C²£0Ìÿ½ iʼnYnrAJìDŒ˜-ËŸOî‡ë¿¬¹lÓ8¦Íæépã 5q,å*ZŸ}gÔ¿„1×\Ë1õf}6Ÿc^£Iñû\6z*™5kj¯c†Û’5 S)çtÎ>âcÆ ¿ŠcÛׯŒ9t¿è:ï~mï~•HÞ¯åP­Õ\Üê3î¼úJºthˆS°§vgnº¾?VÌÜ]~)$f,NÂQ{%ÐøðQѰg¿R é*Ì•o1ææ”B9z‹ó3T'a¹D˜’…2ìÑ­4nZgã7t8›jéÔlÓ’ÀäsïJŽhv§ŒÎÝË9ÃgpdÝTv¬Þ@í Æp];‡D<†íz‰eå{{¿„VòÎ…¶áMιh‰¦g²ñ•›¹%žlþ# Z ¾‰A'õ!}ÄÜ›³ŽšÎfÎ_CÊÉ¥ÌxÌJ8h‘úô8:ƒ·º³s-6ÌœJ‘¨D©Ñ’ÑwŸÃ·œÅ•óŽ£¶^@¬ñ…Ü:ÈÅ,.$^µ?“?Ïù§žÆåEpÿ°ãÈ ”ñsµÿ¼@9$RŽâÆ¡™tóÝF~FÛ´8 y}ŸzÃáŒZ6ŸÇãÄ„S®”íÖ亶’; o½&¦å¢sâè‡iS'+æ¢û'ÒvöÖæ'ÐBhܺ=inˆA¿L—&ab¦ ¢=û vc—˜MyݪOúïüægæý?RHî+é Õl€P\ýÐÃdÖÇ6 7>K‡.fKašµgèíÝheÄP].äéû›°tS1éaRZœÂ„Éõøæ‡eä›­ŽìMÛVUP¡T®7ž¬Zົ÷¿Ü/Yæ]³Ð2äÞwÞ#7±œ=…ÐÈ©‘J°ÚPy°߯Ì#šs8a õŽîCZŠ‹]޾îyžï8“ÜÍ%tê1”®ÝÛ!Š-Z]pãõF¸ŽÜKר:î~÷’¬M¹é•·ø±p÷}Ëheªu<’ç_kÊ7s—³ËÒhuÔ ´kš‰ œ}÷cÔûþGŠT:ÕZ^ÇóÏ!Ë뫈(‡Ê}®fbøk~Ü'+-Hjûs˜øz3¾™·œ‚äùÚ‘ŽÁõ÷ÿ‡9žGg/úü]…¿'Ï<—Íæ-[iÚ¬Á`°ÜÂEQž½™““Ãú ë‰VÛHeqdç,ï%J#œCÇ£rè×·ù/.ä8’hå†r£ÝZv½: -hÚ‹ãQ¸–€C„ÝO¢eÙqÍr‰o]ÍwëãtìÝ+÷m.{g ¼©‚4îØ›&Gí~q¸’œÖÇRoc€F#»R…ãÊÝÚÝ~´öU®KZZýúögê—_–—B˜¦‰ëØÕ¦{ÿ:»·ÀѳhÝ¥möWe•~ÀG…Q8Žƒ[ø”¿ÝO0-6¹iõ: IDAT*Í[´$R%Å8Ø $0hÙ²%+–/gþ¼¹8¶óŠ  rÄM©^½P%wOÂófM(223èÞ£¹K—QRRò»±´ŠöŒ‘h”Î;“••…®ëå¥=>|>« B¡ Gvè@î²eüðý÷ÞtµÃ¸,F€ÚuëP§NmBáð^ûD)‚ìŒ0gŸÜ…is~dÁ—+*,mkg§1¸Osªe†Ñ¦ð+åM:mÚ¬)+W¬`þüyŒ÷ %5cíJFf†*ý…€šµjá8K/Æ²Ì §B РAjÖ¬A0:¤|Ó8¸ ÄÓÑ­Ú´¡eëÖÿÈxpÙ뺾—à/£‘RÞ̃ììªtËN–?ª¿Ü3 @ó¿ czû*%%•#;tÜï¦4‡†hûØ'/Ȉè„aÎ:±m²l¯¢*ýŠ¡€–Œ¿‹_ðþP(L‹–­hޢ好JZ÷?ü{òTÃ0hب!õ4¨°üô·×Ã_Xøƒ( ²oü’F^gã$4ø »FÊ´n>*Â^«ÈüÇ{þÛ6#•"hh+|¾ŸGÏ}'óÞ¿o~#öø@ÓÄ_d½ZÅ8øäK‚}m˜¿+„øõgôáãЯGñ—âÅýók4>´ÿ{ññ3Åæàz´ƒ´†}øðáÇV©:Hòõ€%w÷nöû»ûðáÇB¦–â …ÿ´ð×4”’üü<¯y…ïæ÷áÇ>þ”Õ¯”²-b±RÒÒ3¸aý§cþ@J•*±jÅrª×¬Y¦ªøðáÇ>þ_¦?M¥XµbÍš7?à Ÿþ´ðBP§^}6mÜÀÚ5«q]éË~>|øðáãOB7 êÕo@¥¬Ê<ðO ¥š¦Q§n=êÖoà ~>|øðáã@8öŠt CêÄò/¿I×õß–>|øðQÁá7a÷áÇ>|áïÇ>|øð…¿>|øðáÃþÿX(…R CD£QBz2ßÁ§Œ>öÉ2 A !4´?7hF)”ÒE"BºÆjIÞ§B„ÉA4šA(@À_ž*@3‚„:Z L4l”?³/ü…dŽYÊÎm[Ù¶m[ò³¼‚¥€ƒ$˜ÛÙºm…1ç@®ï½6í/¯+‡K˜xö1D¢)ôz~©½‚U9H%lߺ•-[·²³ Gª_<ßÿo{ümp)ÎÛA‰¥þÔ¹}ø¨È"ÂN“·}[¶lõøOiÂnó+KXh%ß1¼S-"ÑúŒxl*¦ö'fÛ‹)Æ\ú¦Taìš0CŒÇD)E¢xÛòKp¥7AÇJfÈ×}Šf6}9îG²ºÐýƒT ºhg… ŽM´Ðóo»€Ë´›øiüqØ “DÂA &ÝÇó#]ôŸ=¿f ‡x,Ö!‘°èxÚ­<åfR[ïÄÔÁiDáL—{6ç‘sW³|d Š‹,Œ€QþˆªÂbÕô7yø‰× ¹®ë&óêúZ\?ò_tjäòõÄxñó…äÉtÚ>×^ذ,)v»dnÃû?*:Ÿw3×ö«E"¡§–Ny’g¦Ìð®wÔ F?™a²rÚk<<á-ÂCFÒmÃLž³‹F}/å–sŽ"¤iÄ6Ïç©§ŸgÖÊ<Œœæ ½ø2NhÎo{8”˜y¹Ü{ý½ÈwðÒE=É ;üôÕ3œ3ê_d¶ú˜+s~bÜľ™³jõä†[GÐ:K¢ ¦=~ O|°;»-—Üv;ƒèüøÅÿxe½FíµÓxçG›A\ŽóÝ |0 FZÎ1’S»Õå‡Ñ—ñÆvItä ÌHkÅ}/ßCµŒñ£îç³e»¨yì9ÜzÓÙÔ1cü¿ù FjL£Y/®v¶mûBÆGÅ”ýB€³“çFþ‹¹5®äá—O¥a•(2–ÏÊ¥kH‹è€À)XÎ3÷ßÇ'K·“Ùb7Ü~5Ù_ÜÇU,B+ˆ3°ÿB.»a$êíûùqð}ŒnAi;yæš{‘—ÞÃiîtÆ}±’šö:¦L_JjËÜ<òB¦ „õOÞ|;oåœUڜ 7^FÓh7FfÄ¥° tôÞíUÖ Ÿ=ÄåOÅyôÝO8¡A%Û·`FÃhÛÿÀôU@zKúŸr+wÎ" ‚tÅÖ¯_æÂK®aÖÆ [TgÛÇòÚŒ Ì~÷ßT‹meæÇÓ™ûÉtÞ¨RŸê%?±ñã/(ÎiÀs|ýÑg|ß6È…—khäóõGŸ±0O£Nó~Ü*IÞªù|»Ý¤a?ÎýžÁª ‹HFç°è±KèÇ[ì,I§~Ó>šÂk³KÈ}óLŠ6,å³O¿bÛ´oxβÐÏEÒâ“á}8uâ*RÒ«Q‰]|ñÑÛ|ºä f=~ÂsÎ0{Ì)|gÙ8H>ùøsò?]Ê}Çønüe ¼{ ù¥éÔ«dÚGSx}ö£ä¾yë–òÙ§ÓØ>uÿ«T“hÁz>þl‘Öß1ªöZFŸqù2†¿ü:ÿ™°€‹n±ùäqG>Ïã_ÁÂç¯âºQ./MŦۺrÉ7Ýxä?ÿÁøáq.ísK^%kk.“®{‰~O¾Å3#jS¸l3ëõäÆÙµàMî½ñfª<÷4¯º‹Aï!|ó³\Û1…ÔÔ"žr¯VÎØ7çý/fÀ É÷oŸÎöÅ3xò®/¸õµW¸²c–/ø}ThÀÜô!¯,NcÔ—Ѧ–ÂA¢YYäÔj„cƉ'vò숳˜Vëjnº³Ë_½•‹Î*àÍwnæ–o^bæÜLzöx2#qþ;ü#¾ér†&PZœE_|†sêÝœ¢ÖóÖ˜;hsß«<2áÞ¾ë2î®&ÝÔ‹÷Ï?ž‡ Ïg¿åË»®ç‹¸F×€ÆæwïbИ\†ÿû&Úè¹Üuû5²ÿÇåG0ãÙgØ<ô&<ò<[^¾€‡ÿ—w>º›ÐäÔÿwe¦-}’V ÷gf¿ÒY5ùa ½‹ÇÛ½ÇЗ¾ã–ãêþ î#Ím<1â¾o4‚›ïlÌ’—oå²KŠymò(ª s߆£a‰fæÐ²ëi\~Þ§Œž6“kOmÁε¥t9ïÚdìà…ë¯âd³>ßÝq»v`¶º˜Fu§‘÷Êœtï:®»óZÉ…ÜvûÕ«Næ‚ÚL›ð$ççñÇŸcí pËuñþK=væ¿ xˆûNcù¼ŸR¡\‹âÒ N¿ú6ª™‹xèúÓ¹Þø–§Î¼¡?ÊKÆñÚùÕ×õ\ ZñRn8ï_”tdl#㯾„Ü–×pËõY0éV®VÊ«“oAû_?Ý_‡i ¡ŽÛ§ W@PòÑ[ß‘3 '^Þ™ –ô¿þA¼´ëoô£P5bÕh²µ:_þ(›¨ËM㇒ÛÅÔO&2k£âì—¾`æûSxð†ž¨E¸ÿ»<‚zr@æ`¦Î[ÀœR8_Ì_CÜVžÕD¹Ö(ÇqâØÉ¼Ø?D&§Ü5‹]Û¾ä‚w2wÓFÖÎy…þÍ+!ú}šãÝoøïkÓØY’É­Ó0oÚKœÙ©…ŸŽâá\'Ýú¤ `jž…¹ä=N ¾Ãõ/¯&R¥Î\À¢ÙÑ2¹¯ßÆ»› Œ$åªõxª˜·®8–€Ìã¥{¦PZºˆ‡^ŸN^i%FÏXȼi/qzÇZ|r#äB¤ìz obÅ–%¼pçÙDØÉ[³v°yö8^XâÒóÖ§øôÝOyoÒùh¦òÔ—s±OõÅ—È©GvF Ü•äèYÕ8“¼E+(Ñ 3—žÒ›jYÙt?ûFj­ÿšÜ¹oqÓE\õðtªSçŒfXÖçŒû4Ÿ fctΘ!mÈʨLƒ.=zJoêU¯JûÞgp\ƒB®X‘–IÄЈdT&;;}Ãk<5·7þ÷fºw:™^¿—ЗòþZÐÝ8iÇrSß„B©þ4Hš¹a.%©õ¨_-„ÒÃÍA¥H”p$Ê /,ÃYÿ¯,mÀWB½jõè3ìNZï|éë 2£¤Q¥r&‘€ö 7°@¹.Áö§rÍ NdgצÇIýÙöÓJJֽͽ„õÌèst_Æ>r•ÍÞ ¯Î¡Ë5×0¨m=ê¶;Ë»gòÒg+AÕ2ôô¡4ÊÉæèó¯¡ú¶,ÞæÈiI—cšVîϬy h-à‰ò9ñòt:¥9s&ñÉ‘ 3ì;¯¡ô§7xgM.¿ü$êT«Ç WÞNã­ï1kUMüFn»CÙµ›àlÝII 5l$'µ«KNÃîÜzgÖ½<‰uz©¡ z$Ê•+S9¸ƒg^þž^£®cPëºÔë8€a]B<ÿé4ŒZÍ8ë´!ÔÏΡÓyÃÉÚú ?®ßÂÖx&»µ£~½fœ|îé´¨F U¢Ï¥—Ñ©Q5jµ:…¯kÍ’)RÉ$Å)•¨R¹‘hU«U§FÕt~˜ò<ëÛŒàG¿â >ÙÚ’Ë.êKíªõ9ñŠ[¨µéCf¯‰¬ÖŠÎG7Þ½÷TŸ@8%l,)eácO¸dÓ'dí¸ ¹ö“õ„ô Öá¯HéÀEvDnZÂGŸÌä¾ë¤ÿg·P°q5\}ï¹§P«Z w&@èÔžšš…¥W!È/µp“YôBxn!„§1 p­¦ë%:VœÒÒ8¶ N^. ¿„çíâø¿ÇÄ êRœ;Ÿm%…€äñSZó°-HIK¥níÊìÜCïö«œ~BÅ™AܵËÙ&$Vþ®ëш®AFv êd¥R˜gz¹ @ƒûâ:Ó㹯aËB6o¯ÌöÒBÔŠ‡Ê¯—EÞÖBó®W³ßqd'bÃéD»$ÎÎ øîááùˆ@ D©Q£®éxIE¿©Ã§b› $3X…Ka©ƒHMÁP–“AZš¿3BidF]ò–ÇzãÃ1W0K:H%7?‰.f‘Fvãt Âlšó·Þû"Ûd”´dÅâÍœ=ØFíihö–E”¦6¦iŽÀ±ˆÌv´H+dÃÖ8 ¤NÍ6ÕÁrAü_{w%Eu/pü[KWuWu÷ì€ ÈƒOp A‚lJTÔQT@‘(¨‘AÅ(2¢$.QqAQ@ O¢qC $,: £0‚(3Ó{-÷ýÑ=0,.çܹ™ßß2ÃÏÿ™ƒhaºøöþnÀÍ$ðÍ|LýK'föÚÅQŒôvüd7’B=T* _òEj/ë/gô³Föüõ0gžfãŠfØÆŠšÙÿ_˜J‚XÁ¹Ü3á/Ü5ªŒåÍšÓîŒÜxýšŠüaÂ8V~¬Qgã~YkÉå¨ ‹j¨|q3VhL}îZŠ‚Ÿ~²Ž*¶2ã–1¾Ÿ=ÿîý8‘>SY:À'Kâ]Ú?×€ÓÜÁ³™5¼+š*“®|–²§ßGÒŠLÆÿÿf—óðƒVý•ó­å¯[ò—=“iݨ PË9Sq_Ÿ&¸ömÛL¬C Ž·5{ïhý€(‚€÷дª·ùÐ>A€„‰×UóÜ-#øíŠ=œçÜÑ —t4Ÿ¨ißx›Û+8ŠË®w×ìdþ4»ç`XÃó³Cg‚›ñêòÛR¾d1ýJ ÅG¶Òª¼ág`ÏúM ·¥r{5ž ~~+Šò£D \=ïÜØ\Åe×Úu„:¤wf+5ª&Ⱦ„/žtäÄ–@§Œº—‡®é‰¡*Ä÷ì¤Ú:ékk݇nJŸ‚6}ïx”íŸÅèÔÑÂÁø6¯ý„3†wÅvwR··†DÂAU-„狟h³vä;ÎYÅÓd20Müø^ÞxôÐ §x5¼²d1f¿[XzÓ Š”ýL9„”—+ĨšŠŠ^Ô #ñwvÇ4Jmµv'»bAú˜¹g]¶ö¥ã„çl=ˆŽ‰Å¬ýçúöoŒ“ѱ­b¢¶ ÂÇ(iG“¦¦.\EÏp €¦vSl©Ïl h˜:8Ž@UTIjR.vƒ@(¶Œ…VЂˆó&{ 5±›}.¨¦MH„8ùƇyáêŽd0QÓ1öU¯Ï½C¿´* ˆoêß ¨Uóðœ·h3tjU%•~€S‡öæÏfÓÄ'8fÔ÷0JÚrB ûž_Fw»þü!^{€´w씵¢ªhš†hèjœ­~•¦'‘¿)¿û9¿Ûöe­ó«/#¨w0Ö( MQPƒ,?È)cçù¡­ž¿’®ãóOßÉUzÄa‘;ã„øÙøGy¹¬‚>zŸ™·Ngz§žÜ[ô4K·ŸÄã›KׯQ>~¼.ò|]CSÔ`wýtFŽ[EÙ3¯Ð·U×ó1ŠÛдu³?Ï©Á¾ªP±šœïðk·ðõ/ƒÒa“z[¤¾Üʽ£¯æ7wOdØÀþŒ¾ûE’vèàw*Ÿ½Š¦M[rÉ«I 8wl……]¸®ïÉ@-O\WÆØI“}É`.ùÅ#‡ïï¨ØíÑüì_Ó¯Öι›1Ë™4áz.8o«¶}Ž@ùÆp)µí˨*¿~ ßÜÆ®moQ>j$Ïx1çò–¤]ðw¼Íô'–òéþݬ˜3‘-ùépÖ0¦–ùL>o(‹ßÛIUÅ{̽s, vª˜Zƒk£êØ!ƒÝû3Í;ÞœÏüe;Ðt´ÅVœ6}Èx µõ\Öl÷LYÀ®êÍÌy3•G1¸†çƒÌôKÇO»ßCËëθqÝ™3òR¦<ùßlßQɺÕËYõÖfál;Œ ^gü¯f²¡²Š×­ä÷³±FoðÌ \¥˜Þ?-bÝ£/°?bÛ O²f÷¾¯/ ½ ~ó2n첕Y³_CϬúÝL¶ ¢OdØ3xåWW3åÅ|VUÁ_þ8•ûߨ:˜jG$—Õ@ˆØëå ¾r6ÕFè°`®¨:îöeÌû %wO¹ ·ÞÆí·MàÖò{¹ˆ—x|ÍWŽÕ ñìöÃè\Íø °±²Šíï®`ö¬9ü«NG=Vð‚ÄW»ùäãükíË”ïÅíoqíçÍkLÔßÏî:ƒ`ì=ÆßöW|]tJJB|¾î}>®K‘Ô›3òÒ.,}÷,ßÄgU²â¡r~ÿÖôcíSÕÑ÷®áž9ϱ=aÓ¬I!~*N Z¸"YCÒ·à“%Œ½}-KG¨ÍkìxcÕ)Z½‚¡C¤Ã¬ÜÚ«ÐpÈëx½ü—?ña6ï¬bÛÛËøýìGø0¦nÍ\0âAöš!¾.{¯®gÓäÏ1Wý†;–laÇ;K˜öüV.~:Žûý¾ò§~OšaQÔ(JI±Ê¾ÝÕÔ¤C´íQÆÜ·ÿÄY¦K‹¿äù§ïeP©Á–7_cã§½®½^M,„jR§P’— ¨ªjRQ(É â»y Ÿ?—Ã|ú™Ç÷ÿóŠ"DQÓÆ=Âõ=Z y *þ]IMÜ#’WD£<ƒšÝ;¨¨¨ r[_¦MÎú+g\ÇÉy5¬]ó:»ü¹äö_qªé¢˜aŠÃ E¶ž HÂ'•ŽpÍ’÷™÷ëÁäÇ+ymÍ{ÔÐ+Çâ$ÅÁˆPR˜GÿiæŠN^°—O•Ç~žG]N¿i‹xù¾Q”F¿bíš×ù˜æ\Z¿¿`˜â°J‘M¼‚aŠm•"[#Ü¢7,†kÎiÂÇëßà­MÕ´¿h8ƒNkú-IÀ(bÔô…“ý_ìûN©†úÙî¶ՠF#ð=—Tß–;õÇ 2 TEä®u×W¨©ü7Œ{–qO-¢_K¼ ñX<7GÅ´ÂX¦ŽBö{ñXaXغG]"“}ãT `Ù6†¾ëâ /“$•qQ ‹ˆDS\jÔá*ì°¡)ønŠx,ã+á(!7FMÊûnc`%éÿºõ_?Û bM4UA'•$‘rðUÕ Ùvvná“I%I$Ó(¡(Q=ÉWu¹Q-ŠŽ Ôœt~¬†¤b`›‰D2;'ˆnb ñD¡°#aªÀM§Á4qjòA +d¢)Ù²7“ñT¬ˆ…¯Ë¦ÝÕv8D&VƒˆR`ùÔ|?¢Ï_ m"†ÇÚT6é¬dg¹ XùXJ‚„o`)ijjÀÌo<{¼ª–=SWAxÙóOeÈuWtk(˜ÑÂõõáã:’Édv@† ‡ á’Jù˜A¨;P‡§Øa;[‰É$¨‹eÐ;‡d,AF¨Øa‹L¼ŽÌÁó’Ž' „lLCC7“ –È P0Ba,SCøé tX]¡‰DlªO2íazƒø¨àçÊrU `ÙV®ìöH§’$“i0£ä‡üoê× ËG3-ÂV '• ž»¿¾K9©¨*û>¯fæÌ™µOÌÿóÜÇ1 6·Žñÿu𗎯öËW2bô|Æ?½ˆÞÍäìÎ’$Iÿ¯Jùïüuy©~Tm¢mÎå™eg ËŠ$IÒ• þ?2ªf‰òBH’$ý˜c¼’$I’$ƒ¿$I’$I2øK’$I’$ƒ¿$I’$I2øK’$I’$ƒ¿$I’$I2øK’$I’$ƒ¿$I’$I2øK’$I’ôŸñµ3ü©ª rnI’$I:nhêwkÓüs¿ºzO¶ I’$IÒqA4­þwœ~ôíÁ¿¶¦&qݵ×ÄUUU„Jî‹ ·%I’$Iú!g4­prqÛüÜ"Žª4nÔHÿ|ï^7W)°sK°rÛ¦¼¤’$I’ôƒç¨ªªû¾@ý:$lÉ«@°ÁbåÖ¡\à—?'I’$I?|.Ê-ÉK Hë…?/÷%'÷È¥ \ #¯§$I’$Á?¤sK&ß}8ºÏ_ä/üë?«¯ hòzJ’$IÒžŸ‹ÛN.ð;êû_×òWþúVZI’$I:n‚}&¿~]¿-Žõö¾zÄ¢åÖ rR I’$I:Ô7Þ.õiÿc¥ÁúXÛ’$I’$q¬íÿPøA!o+þ<IEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_design_layout_list.png0000644000175000017500000013065112235000130026436 0ustar00murraycmurrayc00000000000000‰PNG  IHDR²…Ê%sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ7£±m IDATxÚìuœUÕúÿßkï}úLÏ0ÄCÃR¢ØŠ-W,ôªWŸv]Ñ‹Š¨Ø`ЍJI14 ÃtžÜµ~œ3 轿û5ð|^¯Í°ÏÎUŸõÄÚÏ $@ $@ $@-B4lþ´l5Q $ðç„79ÃhÍ6Pâ[Ã8oô{’€}öm~™?ÉH-|6’¨ÒøÓÍçu?½9½ëww*ß½v—ÿÑØ€ç ¥ÖÒ-œÝOðçvé²Àç,è{ÌåWK˶D¢bHà·Í†e!¥ò«¯‘ÒÆåP‰Däv?|nVg·z¸89+G©+/ò`ÆI@Äÿî5ÀÅè³oóævéòÓÈQ‡ôñz}²&I@ üæ, °,›ª€Ášeó1Lë—IÀ¶ÈéÒ“öm[“âw“äuËu·ˆ%?~ûñgÓo8èDâdÐ|3w“üi­uð?MŸ²¼Çë“Õõa!D\•PþCsÝ u$°Ï¶V!¶…-ÿóã¿7UAZ6BUÀ¶ßQQU„”ض½{ TE€lv~- ›ŠÚËOþÀ!ô霅µŸ ›Ù_}¢¹±í¤-Erj†tft=!vŽâ—ÒqÍÔ±×l?ö¢{äYçýCV×ÕÇ (Á*þõWÊ–%{jJzk ÀÆ4Lì=L.ª¦í£Îƒâõ…l® ’Ò¥}[»‘u%èl_¿íUARsûÓ;Ûõ‡ªK3XÅšu;Éì–CõºÍˆœÞôjç+HáÒÊ´$ºåå‘íSã 2ʶUkÙ²hÕµ/Ý3ÍÊœÀnD aùò大§Ó«{W¤”½KîÑû~SÁÎÊ0ßù£Ž<™ŒdAymDÎõ\äÛ·ì¸âRA8þ7DZ´X¶-ñJˆ„œ|ìXüÉiHi7=YìÁöl[‚4yõË|É¡À¢¾¢ÃŽ î1Ôu’HÊLã)Ä$+‰”)mvmÙE—cFroÏÖÌü˜GÊzÓ?K!P„dçæ2ú;‚÷Heõ;òxy?úeŠÝfQ!D|kT±mk!P”ØLmIÙ¸›‰e\Úˆw%{/P¤e7#m"6–©SZfÒÕ‡óí³ 9ù¶S±gÏåýÊlê×ogü=§3:PÁ´wÖv·Çç M6qÐùc™š­ñí[ŸóQuº¤*ñ27«ŸÆ2((±@+§Œ—ñ@‡”±6L÷»°,ÃJÊ*éÚ©¶”hŠBIE5`˜ns0L“d¯UÕbueƒÛ¶R†àˆ Íø&¡µüñ-šøGÁ¬ÞããOg£94TEA(@J‰eÛèºÎ‘‡æŒSÏ€R8À™@ØQª«BœwÍúìqìíç¾aµ•D}Q[*ƒh¤f¶¦{§E`ë6‘J̧#t¶mØÆ¶ZCWèbX±ã((ØØRi¿A¨¢„ÂâjB† BÁ›’A^ç,å7Ô¹¦i””Uàv»phB(±oY˜–I(FÓ´8³ÿ´‚ÁH зrÓS«)7%ÒVÉìКÀªõä2€)ý2HQVý\ÀK ëHJÓvóâ*2Ìš5åäÉç¦n6®ØL±[ìÖ1ìÆ:•«* %%sÕ¹½é˜¢!-“¢Â<ýM1­»x‘š—)·Oíg_qÿ¶Lz¤Æök>ùŠû×) ÈïÅ¿ÏÊÀ§A ²Š¹ ø²ª-S.=Qµž[_(dðØ\y^sž›ÍgîlÎ$ÃÄ:.{ycNÉ1}85A´¦ŠÏ¾ÝÀº*­Q=’¶BN—f.Yv=~±Š¹5 ý›I‘Šb²qÙ&2÷æ®ÓZ‘é0Ù°j-ÏÌÝBf§$Òr²™zÖP*XBAÎPnïì`í¼%<³Q!¿£ç€î_R—’À²%ÝÀ©ÚŒÌïL÷N­˜ôÐ'Œêß‘SŽD²ÏÅ ÿÌ€Þyu³-Å$‚fZ„;þÿ(±5 ë PöGV\¬lÐãEÁëóà÷yñù¼$ù½xÝ®818М·'.þJ,iÇîqÀn[Êf2IJlLËÆR5j7ÓóÌ£ùçèÖ(Á6‡53œ»Žq°ss2ÞЛò•tÝ— fâÑ4:öÍãøné±’M"±í#a”¬d2ì «6–±= è98ŸiG,+ ¢h*©N…daµ,PâûЉâÏåÚÃÚá Ô²bS%_:y9>;j ºdå´&Û¥}f*/ƒr5$N:wpÞZAHrZû¨,.cÅÖ:\­ÛpþI½iO-a=¦:Ь,Î<²'9>'é­²9yLWZé5Xq¢BRºq;íŽÅ­G¶'Ù °¡Ú¦÷ˆ!GÄái!|tôHÆê…l äÜ¿l)U>[J|^7•as—lÂãrðê§ó÷“† ÁĽϸc!¢}Q°d¬îðµZ–d¬CÇ­…:™"<.— EU0M Ã0Ð ˲ð{=$%%Å^Þ–Ø–Œ«#°¡PÚ±JÀ×™©“;ÇUòà[œŸ§©¯aΜÖÈl®9·7Yy½äù‚¨Œ·‡´¨w8ÑÖ|øÜ‡]hûÖJ ‘3cʘ±§‰®$ŠÓ ˜¬ÝPÄÜÂ*«CèîtÚ¸#,­1é‘™B~^2­’”„¡mŸ6t®M!øzmF ³^ŸGFV.…rg*§vóÑÖ¯aÛñö6ëyóÍy¼´ÊÃãSÇÐÝí%3Y4ÍâV˜2WGÎÈób[a¾½’…z:ŸÑ—ÜnùéŸÉ6³ ÖüÈ9ÓË9â”Á\yH;+|P¦Ó±•²¯Ž~@ô-EÄdrôR’Û©/±ˆ~]Û „ÀíÔ¸cÆlFB} Œ)ÔF‰ q ÿŠ*j™l‰nZq˜–ÝØï5EÁ´ ,ÝŠ=phšª’‘‘‰ÏïGU5LÛF˜¢´±kFJxáã-Tê6ЦPéŠ×ËíeÔ˜|F*’Ê­åƒ7îx'–ÒFhæjXSá¡s+%Á061"°, ÝŒ©\H‹ŠÊZÀøÁ™vìdY¯¨\Òl2*J°dÌUãu…PåF^Y¬qôÐŒ:T!ZWËK6òñü2~Záì¶> i‹ßYÎ “¸fd'Fä:P)ga äçºËGÒÁ¬gцJ„'&\:DŒp@mˆÝM¶fP…jÌuØÌ"êuâ„ÆÀƒóÉWA/¯båNƒˆÏƒ·”Wl©Æ™…bYX€âP±MÝÔX¤¡Ä:V8›éw”T2f`œŸÛ‰-mÆ•Ïô–Ó¿oô¨ŽÓéj¼>j˜üÚE@ûµ49e#ADu‡¦¢( N‡ï¤6GyÙ­³‰F£,\8UñÇg¯š©F-ó×è´îšj ª+j©QÀ¨çí×¾aQP[Ð¥G[tËMšhhtµ¨Óu ‰¼äz¾-usš×ÝÔͬéÒ2Ñ…Þ9¨”2å©yµïÌ­[‘îiðeØ@J¦“úwá뛇¨ ðÕ¬oùø# [Ëæ¾;æ NÌ[¹U¥è‡åѽ{.憕¬^YKèÐÞ>ر–b+‚§Cg:8 >ûôg^ý±˜^gŸÎÙ¨Û6,TÍ䨋7ë ªŠQ¦Æ¶I· ¾|ç+>«v X’N=Û¡^²D“¾ ÙÌWÖ ~Èv‚eK"‘(iNÓ„ßãä½ǘÁ¹Œ?*ŸÛÎÅÍÏÌaP~ïÆ:ŠÀ¶í˜”ðßÄ:-â>ÁøÍMÓÄ¡©8TUE3¼×ãEÕT:tÊa颥èJ dôŒ‹‰2D£W%6„¢àphhŽ4Ú—naúÏ]¹iPÿ¼úx¶•GÉjŸ†Zµ›§#ã¢BÅoéÌÝRMÿ6m8óê“\jÑ®­¿©=\|ñ‘& ›²º vël®˜0„þ6ôHn2ÕÕAŸƒàõnA’Zûâo,ñx;ñÒ”C(ÞQAØ“F7,6BDi¸vQ@ìØ&¼«–»7Cض¹á÷ÞYF”®ŒÑÑ©‡öÓ}w'·höáŠØC+­¬^[^Ã-#Ò¹èêqY$¹M:”2ù–ùXñú‰›owcuq ºÕF÷.Øq»"@S.¼÷}ÈêíÅÌ]º‰A=ÚÅl –DÓúÿѽ– æ <ìÎî}RÇV`GkÈ¢9vÐP†ÌAƒ4p ƒ bôÁã÷'±~Ýt%…húlÅý—XL$‘˜Ñ(.—ƒhi5«J>¿ iƒ/=™K XR©ƒma™:Û73gI ¥Â‹×„ÂlÙYOµ7ÚMEl ¨Qâ-Åü¸½–P Ì–¢zJ„¯£¡JU¼ŠÅò-eÒÂV6®ßÉÆò(u5u¬Ûi!‚­Åµ`D)++ã«E;©CR´£†M€ûEÖS°fŸ,©ÂHÉ&Ùªe—í¨dAa€z#B¥táV±`}õ®,’B;XTjârk8jwñÖÂz¼"Èú¢UQð'k„Ëj(,7‰Ú’J¨¬–Â’¶[î­gcqpj6µXPAš¶m²sÛ.æ,(b»âÇ㔨–Éö¢Z¶ê’Še²£¨†m¦Ÿ$§8`»˜‚P †$ŸŠªR0yõÓ%ôïÛ Ã4IINbñš">ú~-ƒòû .§“m›ÖÒ­{Â#¾ÜM°mý²È¶‚߉ß^{ôøf´¸²ð¤³.bGIE£@ —Ðͽ¬Ì,ö¥tT”•°½ÖA$µ?¶pñ—Z^lT–URüädûQš© BH‚µµÔ…ŒØŠKÍÏç#%ÉI¨ªšê;-‹,@bQWUCmÄBs{pÙ!ÝÀÞŠ,wlÅfóŽbGCTTÐ¥‚×ëÂÔ#DM­Û¦á”¡º:ª‚:Bsâu©„ꃨi­ÈvéTVˆ˜6R‚êt“šš„G‹Ý·¾¬”*]!)-…tŸ³i?5…T¯#V¦êjŠÓG²K§²Î"%=•TŸJUq9AÅEfz*^‡Eå® ‚Š‹¬ÌŒêJjt‰?=“4—! ÕÖQŠbÚ ¨¯Ôdz]•õa´Ô,ÚøÁÚzªêÃh)Y´ö ¬Ø­© å;7“œ’®ä¸áOÄÖŸXMK·%¶¨¬Á0èpz˜?û]N:måÕu(B`£ðý‡3ª¿{ç¡Óâ—€ºøßl‘N<óB¶—T4ú1‘6XÑ_ܪsŸk”H ÿL"HöyXúÓ·ø³»“žžò ¢¾À4m WýÄ!CqyüB1OBýE"Ðöc Ù>Åý+ gü5V%Àÿ½šº`˜ƒ>й_̤¸ÐøÅ+,ÓbÀЃq¸¼ÔÃ1”¿ê{AmïÇÇר UƒHà·‡eÙ?ö”ÆU¾¿`²B×uªë‚MÒ<±õ?¿dSÝ‹2ÕZ¾]¸šp8D‚Hà÷– þ3ë¿`÷ \Šæ¤ƒ/ðŸAë$‹›&Lyyé¯c¡Hà EQ(//ãù§Âÿ!Hõ;±"î„j@rEÁ9~Ñt§$ª*HA $ ‚H A $@‚H ß—¤DJoJiÉI8•=ü¥ñã¾Ô4R[:þ»"ö% púHMõãP$§øÑ”Ø{ ÕARZ:©^güìfeB•)É‹&HDñMà!‚ø7áªÓ?)‰¤Ý6/*ûøf\h¸Û¸¾o[ÚŽ8™÷ ÍXÄÚfÇ=Ú.íÞŽö#ÇñþFUù£¸3ªËMå»Ò®í8>^þ.ÃúŸÍ·›ÂH!¨XûG·òÐãê÷Y²YhB Õ,àï]Òi?öj•X mÃeñím§âw¹qî¶ à먧²¯ádR½«Œ’’rB†Ü}ù’(¤ª¸”â’rBfË´?rÚã§ÿ†ãv“v?fãÈÌcàA½ÉHÊdÀÀ®¤ybµ0e•:ÅÕ¡x9›—Ù jgÅeUD­_&Ø}–‰Ï:øŸáó© ÅáÄ-ÀNé͘aí¦A4šK–*±¢µ¬]±œmAp¥’Û«?yíÒZä%aU²âÇ¥ìºè9À·o¦EX”,euQÓFqxiÝ¥/º·B³ƒ¬™¿ˆ-urÉÀV:«ç/dsm˜öC¦¯·ŠU+V±½2„*þŒôëßgñ¾^¥KÏôëêfåìïØ¥¥3`ÔHRK1gU)ÞÖÜÉ`ƒ:€‹'TF9íâÓé˜áØmÐ+šMÙúEn«Á™Õ™Áý{’"ö¦CdˆMË—²©¤Óá§c^zwɈ•áÛyl1TÚuìDpÇj 7ò‡Ñ»µÓÚ3¹D üžDÐŒ<ý&3ûó ñî©SSºwî:¦ÿH½Û1È9ø\šú/Nè½Û°As|vû¹üýÉŸ¨’óòI6ØG¶ §«š×/˽›ü¤'TÕDIï:‚>þ67VËK×^̳…•œñ^ oŸPÃË×]Ê3ëÊ?s#Ûp7—Üò:ÅŽ’e-uf>Ïû!‡n}š Îù’#®x‘·nMãê3&°,¥+¿”þ/ÜÀß]Fß«¿fz¯˜pùü¨$h¦søMÓyõšC¥€èÂçÿéj ëWWn~õM®;xPu¾¹o"W<ò5¥V,…XVþXn½ïQþqX„—.ϳeÖ¥;rózj€¼#®åµ79 CÃ&ðg5*üéJÚ·oON› Ò†?ÊÖ5Ïpýôé|áTVî¤à£Ë(›÷ O¼?›ZS4.Ôm¯qý“?hÛ©Ÿ®fÎ Ý)5÷5çÙè/{}% —ðÍÜy̺~(Uðæô©Q]¸½>·#–ÞéñàÒ+øiáÛcxoÉj6nÜIJyÓ•ã"uø9ôÖ—maÇ¢¯X вmé"f¯nןnG^ɼ5…,þæ3>Ÿõ§t¯bδ—X²QãaºôÍ‚‹Þ^ȧÇÝÈKß`4û L¨nä¦g¹bê׸¹Œ6V°cÞ-˜Ë?å™ç_bkØËë|ô;üz®}›Q>'…‹ßä‹uQ45Ñø#J€4CÔÖ`††tÊ–|I°|Æ ôžqC#ûnßI0Ú¯Ù P ¬›Ïv ·ýA1¢+½Å¥ü÷·ù¦%ÑU²pú\ôüÒØÌg ½t A»‰ã„"vSñ…'ƒž"E~Æi½Û£etãøs¯æŽIÉC8!î[¿…ïß\‰‘| û.¡ðÛש,-õ Nìë¦bþœsÞd–T7Ÿ“·Q¦K: â®s>g ìBÈ7ŠN¼ÉΊfó÷Ð4ª—|I ÀWO1²óS±Xå[)«‹|~} ]»TÓ+Cå‡*“@u!<$Í&ðÇ#|£Ÿ£ú»sÐlÉÊ'> ÏØ ¹ô¤á¸‰`´êG²s÷¡­zb6M[Ç.v€ð>ÌŒÂáÁXpŸ_JZî¦<}?9s¯â„û~ŠßO Ä¹Àˆfe‘hìþ"…3n~”VŽbÎO+X±ð;>xørôN]yåì|ßž˜Ç [·ãv-'ZÎÓ> ªArýì-<0ý~–T;?í5.íâÉÏåU»Jwc*4&4inðs$Å"Žvr"“.Gšj!Íag[Úûâ!©Ã¥6Þ'þت€¤:RGuu%UUõdŒº˜Á ¬Yµ–M¥5«w²ô›ï(ª¨Giç^š:žgq´¶­™Ë£SþÍí—ÝÎO4±/“D<¦¢ê@VðÞ—[Xj:ýs’…ONæúI·ñÅæÒØŒk”óþ‹ðÞÒjÚöÌÀ¾mê&H…œƒŽ%ÉÚÊŠZ›' KŸCÐ+j† Ï)#H±Ìø<¬áÒL¶.›Ë¢uìm¸û…ÉZ:ÉÃ/á(lß´‘õÛÊÕ–±zÞw¬-,Åáv4Þ§1¤|¢Ï&ð‡%V4L= ±½¥mâÎ9Ž§Þ›Êu9ßvW]'שּׁ"¥UkÂ"RB¦ŽîÁ#ïßà m;¯M½¯CÈÌú †½û“FçÐÉ<7q•…³¹ìÊgHêóD‚¢Q/'Þs7Çwlúv—¤Ó˳D¤ŠÜÉGOÝÅU—_ΔæÓå¨k¸ã¸¾ 3g(Ýc29' Ë 93Ÿžx8ål,W[ιè:$xéÊñLý:@‡õ˜¤mÄÁ…c!¾öCa‰EØ‚a,ÛÀNÅ#?Çi9¥ÉÉÉ{mn•ÿ]# AeÁ§\pÁdVWÙ»1(4}5ÂSŸ¼Ï1ƒàà ǵ¨¨6Þ¼›c¯k÷˜…ÿegD(x’RšÊœäÇíPi¢úë˦ 9ªyü¨>Üú}§CiñÝ„°Ù:ûN¿æÊ#ò¯ûMƒPpy#¼zlç~P‹Ç¥°u¡ýV’RR°zsçΉ¥]ßÇ9#F渱ÇS]UÕ´LYqà.›Éˆ#¯äç¢à^×]ðiOR #öCã8j±õb³cKǬh’Ò ¢Öîi`%6h­9íÊ«ÈèÕœ«.¦‡_`í5þœî ³³÷ùådã;´jVÆ_Zĉ)¼ëg.y$ïÕÆŽ«ÞöœuÓƒÜsɤ(ö>îÜòGIR:è2b ™™ r?¹²` »*Ø£lÍë¬!fbÓþ¾>ƒÚß‘Û`?ؤ”˲cÕ$ZæNñëë{ר–Jûá‡3°­†µŸújùú}÷±ÝÚø¯Dª¦ñý÷ßrßÔiû=ïÆë®æøNÚ£ÖL"ÇðÞ7KÐ­Ø é¢’·¯ÏC¥§rÉÅë—±ÉÑžAíSXìÚ°†r_ú¶MÁ •±bÉ J"nrûåal+¢õ€!´ñÚ”.cÙ†]èZ2¹ý‘—éiœÕ«¶,çë¥e¨©íÉЛt'ÕGÇ®­YWPˆ¯}WÒ4!ljwldcHÅ_WĦj‹¶íúp̤x˜5I¸r?¯XOL¦KD+té݃d§EñêŬÚZ‰íɤ×àÁtJR0íÝ{–Ùº/¿ü*ãúù(^ò6^~' èǹòvˆM+–°±¤5¹ý†  RÉâ%ËØU!PW»žŒè•M¯£NFÏÖ°lPTIÉš%¬ÜRŽéJ§ÇÀÁ䦯":©ªEéúE¬(©Å“Ë€¾ÝHv(øa)®üÑtõ²–eóV“yÐH|ÛW°QÍ$µrÊu2sû1 [Œ õúb–/]M…î%·_W¢E¥äô@–ǦlÝR–o,Åp¦’7`0]Ó„ªv±¾¸Ÿ]Ï–U82:30¿ÉŽ&²Š Z¶‰åk·P4ñ¤å0``OR‚hm)ëwTâ%Ä–•h©8°/iúZ¾ø~V|Æw¨Ôý`Ftö©.fåòÊCImòз+~S%÷ÈÓÈhíIJ@U ¶-_Ìê¢)í;“¬Bä ¤o†“h] +—­¦,hàoÇ€~ÝHvDÙòãʳ»¢n_MqÈMî aôÊrî~$㦠IDATÕÆ "%&Vß›é[’b_:IÍl…ªÁü§oaÚöƒyþÝ[àðÖ³w1µõÕüpõ(5Ì×Oßͬž×1ó¢Þ|xÏE<±:ƒƒòÛðÑË÷óÝòÓ~\Ä¡K§pþߓӿÞúÜ÷T{ù.:¨ ‘õß2ý’LÖ/ZH‰sï%ÃÙðô¥\ðôvÒ“ŠÅ?}73§ÃæÏ§söà sÚ8z´K£xÞ‡ý:nù(Hï¾mnZÌc­/╎ hóZÖ…Âbéû±rÐý,~b,/Ÿw,»þ½çÆ¥±cæ-œÿÐ*º ìŠZ¾š)ÓæÅ×oDÓ4KßåáJÉÒ‚,_ZÈØ[ŸåÚc ¦?…Ö_Öò@_‰°ÖsÛ©çpüªmôyå.ÎúBrÞ™‡‘ÜÈ´'Þ冧âȶoÝþw^ÝÞŽÁ½2˜9ãglõñÌܯȟçMYLçÝpU¯cÊ3ƒ˜þê­¤|Îe¦÷YçÓ'Ýdù¼ÇYð·û¹þ´~8âêêT(úò-^]VG²K²mÙ2ÔãîâÅ+‡Q½~“ξ‡Ü3/d@¦dåòÝépÛQu¬Z…¡¨8Cëxô±Y |n Ÿd•óÜ]71¿6“NÙÛÖ=E÷3îæö {ðÁÄcùøš |wq+6¼}gÝ1Ÿž‡#C‡Ï_ù~ïlàÝeL¿çFæ”§Ó¥“랤ãÉwñ¯K»óòX›ñL:®úÚϸcúfκ‰NBÇú«I{Ú ~Ío{“–… ;¿ÊÕOoçÎ/sp¦$l 4—¯SÙ ¤Àáòàqy0v}ÌÓŸ†¹êÓœÒQcÇg—2zÅvüöF¦ÜöýîÿœÇkªTðØQ£¹{ö$^ë- Ñó.¾žû¥³qö\ÿöWTžbqóíŸ3ü•åá_¬å’ïqn' 3ð3W Ç‹…ã¦ó&¡K'õÏ0nÖ@îþÇÉ$; œ>?.MÅm¬àæ>âw–pÿÐd;¹{à`îþæ<à°¨§¿îV†µÕøîù[xüû…\zÄ`Ü~?®¾–*¿‡ªCAkw×üóÚ9*qw>o/¯d´5—W~tqã¬éÕV°qæEs¿µ†;&Ïbèsó˜6*E”0uÄ0îúúr¦·RQ2rîE—qH'/Ë:™Ü9÷[ªNèG¶³A…3épÊ5ú×d»—'Ë`͂ǙìÏ´çï&/I²mÞ Lzø-6Ÿr¯CÁ¡òÐÔÉ»}3NêˆUôk¾œƒ[SرòC¾*ï΃3þM¯dعè5.¿çUÖŸ~7N¯ Mþ®»îPüát>›×7ÞÈ]yÄbSüUŒ…ÿ CL*f}÷Nº——ßÍ)²ÙÚ†P4¢›çQ•<€!]üH©ÐvøIä©fÅzÖÔïä™ã:ãt{Pí¹ú›MoªÀ‚ÔÜ\rÛg¢©©­Úã‚[be¤'§Œn‡bI’ºÉ‘Y;™_P RÐfH_Úx,ËBŠ&ãcÍÖeøÛ÷¥s¦ ¡¸è8ôÚ«`íø‰%µ;¹ç t4§ÅÕoª§j[vóÐÍRIéÁͿ˟ÂþƒÊ§ñÁâ2¢›¾âû]«˜ØÝ‡ÃåÄ>œ—«¥uXB…ú¹îŒ;È»üqΘŽMuc/eyý.8¸šË…âÌåîÕ•Tl­ÄDÕ¯7¹™~ÍEV«V˜zs?a“mSÐfH²4‰‰›ÖÉ*e›ð–„Óóé×Á‹D#gø tU-ÌÒU¬ óØáíb1¸iQ1¥›*0…BZn'Ú¤¸±,r¶B·šÛnDÖ¿ËøÁíq8øý“‚ՔlHíÜ6élÓÆ›œ‰°‚DM‰mYlüîEîýTá¡;&ÐÚ¥Pµu.³ß{€¾­|¸=~òޏ‚ï+l"Q£q2’U›XUÉ)#sP$ø:õ§oV+‚šÍßðõG1 Û‡Ûã£Ëè¿3·R Hé¤ÃžxmÛM§¤E56ÊÈòø§ ‚˜á\ÃancÆÅ'³¸ßíÜ}É!¸…D1cŒ¢¤M£áÊ´¬XЗŒQ[AQ4£Ž°Œ5ê[1umË2±­Xõwô!¶ZÐÝl„Ë‹ÃQ§+¨ª‚*ÃÔFËí )-ºÛT§Èb#B£Ž¨ ÂåB]yµÌŠ¿ƒ‰iZ̾¸ ¡°µû}4m;äÒµk»˜ |²`¦ÓGFÒh¾ 5Ý#Z¹ƒûI…à<ã,V9G/éÅn£HJ„Ó‰îÀ³;-,˶ L[²àÊŽ„ÂBQš­ÁŠ'b± exêŠÚËÄüÍÜø÷iü¼µœŠ]øæ­˜S e‹²4Ô×׳cÍ|¾™¿‹ÌdŽ®g26k>·Ýô…Å”n[Å—o¿ÆªòrÞºýjÞïpŸNŸ@¦Pp»ͼ)&vëÙ8¸˜›'ÞǢͥT–læ»w^àË";^r/2´Ô6ôÉÑY»p3ÞkÞyŸuu¹'ÛÄ×íxÚ”ÅÌï¶`éE|0íI6)h5Šó‡UsëÄ;Y°q•¥[™÷ÞK|¶ÍÄùKÓ¥ ¨Ñ}ôÊïA²VËÜ×?bîÀ~®ÑÐêsÏE×™ð"wMD’ÛƒÇ!èØïHó^àÉwbWy9[V|χ_/ ZoŠ%ÓûrB^-?ø!ņEá×ðݦ"l$mû‹µøe{c>Ååål]ù}9 ]ðÇZLò"‚–|ßûõ‡+FÁ,î~k9U¯pæÐîtïݾ}ûÓ·ÿ.³‚çMb‚ú6ýs:2₇)ÓrÀŒ ¦ ãÖûÎfö¤á´ë>–OÓ§¿Û$b¦2þ±7™ÜîÎÚ•öyƒ8ûî™”6X¡`¨Ñuf[Á`Ý™Éo?Oî×Wг]gÆþ{'·½ó8‡û£„#a‘øìØz„@X$Y½Žçú ¸÷¤~t:‘åíO$Ïa±ÚpÅqfèyŽì׉Ž=G1é©y•=üûÒÆÞ¶’+OJÏ^½rÔe”ä_ÎÕ'@qvçæW^ Ý“9¨Ggº<Ž{Þ_K¸d¯|6Ÿu³î`hÛ 222èyù‹TEm¢õõ„ ‹¨•Å%/ȅꛌÍïL‡ùøá9Ô!ÀŒE—sXF”`8‚a$sò”;¨yð2Úöç¾ÍíèdÕ¶ÀŒ©Xq·§Ä FuÜÙsËÍÇòæÄ¡´ï} ßdŸH_—IÄÌà‚ggrUÊÇŒ˜K‡îC¹àߟQmƒ´t‚ÁH£êg›:Áp¤iy‰´ˆ& ã»ÇðÆØ®ät?”§–W¡© ¦ÛÒ †ÂMmhê„ ›ÚïçÉÅÅ|ùÀxr[e’•–Ì‘3Šè4ô4˜|,ŸÞx=ºå1è¸ËøheRèn£ÛY\ôä#¼êzwêÁ¹/o ]z[4™=gê­§ðÍí'г[¹˜÷—•"A´^§ô€M¸>LLèüãèÿÿ1 íà·mžzò1®¿ñT­e¥"wßywýë¾Ýž/bî#£‡´ +æ¢TcAcb¸maX1¥Vu8ÑT'uKnáÐ 73ãÇ×髆‘ª†Ö0ûHÓ´B © V³†š"0-PP5-*ÝŽoKPTUHLËŽ©2ªŠÖ¸ 5-ã°`æ$®Ù–çfÜDkÅ@Qµ½âÚ >òø‚"Õá@i6­HÛ´¬¸ÿZAÕT”Ƙ¦%Ñ4­™D*À61,Es âjˆ¦zk|~Ì(«)4–GQ•X¬DËb1(±XBU± ©:PeC MÛm_s8PTå?\ω“k™ñÕ3ä)h± ”x[Mq/•†ç7[G ¨hšŠ@bÛE˜†*š*°L »Ùõ–ŒµmsÉBš:†‹ï§©j£zi[–%Q;ÖÇ6BsàÐ4œuó9qôõòÖ\™ëBg?×[F<¹@s:ÀÔ1íÿ{2øíbþJX¶Í‰'ŸÊsÏ>…mÛ-pP¬“;åTôf1ý½ÒÆ0ìýJжebïe…µYóéC|º£<%|<ýuzž÷6}¼vT‚eÆx£„iZM7–6±ÝX´Lc7·ˆ0m[fûD«øzæ êH‰¬ç½W~bøMoÑÚi)[xïf‹Pâ‹g,£%WSÓbË4÷:nšÆ>¤uc7oL‹õÖXæ†òÙñò4ÄXlvï†ö´Ì˜Ë³ÑËÛÇÖYúÑ£|WžC[u>?‹~¿KžÛ@êûjƒfÏßm_ì^vic6ëVÃ9ÒÆ4[º Ûj±ÿÄ®±÷š*mÓˆ‘‰æÄXý ÿú¸†î“Øôõ›lîz2¶wbH üÂõñz± c÷6þ«¸¥”¨šF·®ÝèÕ³û Ämš11ü©ýdtìÃZv4޽ãuƈˆF±åoÓÂá%§}GÖ.ÞA)œ7õeŽ;$aê¿Ù;ü¾r§J«ŽÝqoÝ@‘åá¤{Þणû€®ïsåݶ…£Mú¤ÏeëŽRR‡_ÈËãŽ#Û!ø­ úãAÃ’Ðp8L8þ¯×ü7nG!­ûÀ¤ügËŠbýf '‘ª‡^‡œEŸC›ÄoÛÒÿôçW·¢ÑqÐÉ\9D4kƒ?[ù%Ò6©}9ó’þ ½lËŽ«.îVú ýÌß¼ãý^ï»nÛ{ˆîI YÈßµ þ—ý7¦ûhHÄ#H D@ $ˆ HA $ ‚ýàw —–@¢ßüÆÐM×rc6¸/…ñM‰zI`Ÿ=&öIT¼ß´o#AB!@MU5K—,¦²²"‘y8}‹ÕŠBvvkúç瓜’ò§ì+ "hY$ 0þŒ5’.]óu’À>aš&«VüÌÒ%‹6|n'! "›6ndðÁtéš—°üE¤@Û¶ÿ«¬ª*ù‡PW ¬´”:%$‚‘H˜””´øR è(Ú±ö:ý×í­( .—‹h4ú§,‚~•¦t”ì*¦}‡Nÿu{7†I á5øŸèæÍ ÿë«Üχ+ÿ+ëíï«ïí'ÈÿSÕà—Úû×ô§?kKý&Dàt¹öÊ &Dì»lÃj¦— ´‚l\½‘änýÈöŠ_Ñ€£¾‚ EõtìÚ¯eë굸ºô§­_ùÿ‚{gRÕX†!+ðDQÕøGEÖ~©¶(Nª±€ ÷ÚWײ"U¬/,¦m÷Þ¤ºhá}l,+!µü_Iªªbš¦íSur©ñÿ|A‘r˹ìŠI\yÝdnºñŸ\qÅ\rÑ•¼¸¼u7†U°‚¹ï¢ ùl›üÕQ^«×~Íõ“§±¹¤QÌãŸÀ{ëMÔÿßÒÉx*µxÈõ³V°þ†\„ð3î†÷Ø2ûaÉKC¿ãá<ûöX\AÙ¬L²’éguaÈ…Óù殓¹by”Îö D{îxo%vt+ž=¯(i}¸qÖ†xNY;VŽÄÖâÖ Ý7ì+ŠÂªU«7nŸ}öÅÅŤ¤¤pÓM7ÅB¯ïu¹wZì´(cÇû³DJ ÝÙ™KŸMiy)?>3Ž™=ÌòâlÙÎ{0s6ìà›Û:ñÔß/à»Ê(ŸL:‰ûëÎ`ÞÎrŠ¿½5·^Ä£ë Ü-ÅÒ Ng5/N8ޝºÞͺŠJÖ¾t,oœq o”{PW=M¯ÎÇò]à— %b·d•‚’O3áÚY\>k6“‡¦`Y‹gÜÊ?Þ ÊØµè *f\Ëß­ÁF`Ô¨0ó™Wnüô^špÛŽ¾ŽGOD e€¦ž†ÓÙ“Ûg !~¸»ÿºþ1¶…LDÜž`×ðà©#yœëøpÆ%vÇ<=ØÏ¡oF‘rwÖ•7ÎÁÓÞ²1bS9çr>?ûxß"ÐÔĬÿk$‚†ö–R²bÅ ^|ñE† ‚‚GyUU‰F£{_ŸˆPô_Ђ­Ð¶wV¼õ7¿X„´jîÜÊÆêz%Öº ›0žÉ~rÆßͯˢÏÞgî÷µ´UÀ·^‡t}3/|ZĥǴÀgŠ¥èuùÁ¦kçï˜rÝl„Ë"ÙZÇÛsJ9ïøãx왾ôö°ïüsbï„Ôýü›:å`[6¬bî‚ÕuíCß=!Æ2éì7¹óÇî8®?ZZGŸyÉ#Îc˜ç –í‚ö¦‰®lL[!ç î,zîi&=V†jZ[ú€EkEÁÜù·œ)]Nºoî:•V¶J„%1‚Õ@6T|ÂÔ92Ç/bÊUóÀ >sÏRÌÕWµ¼È:ÿWÞ)%&Lb+Œ†Ó¦M‹e²ÚÓøÝøoÂ}ø«áPêxwÊuLÝÔ›.:‹N®]”­›ó ·ßÏüã 5ÍIMy•FãÏ9‡Ãý†ñ·óðf·%¼cY‹ jÕí¤^éÌϧ?!L)˜pößImë!âíÂØs±,{±ó¶iaèÑ&Ц%éxƃL”p„YðÞUd†ƒÔ‡ ²} ‡ÑËG´¸ž¨®ƒ¢¢h¦®b‡ TÅ&Æ’¢X:ÒÒQ¬r›x6Ï+ÇrÏg“#W²è»7 G#†õ¬*¤ËÕ}iE„pÄÆíbÊXȪTÚmùûùç1ÒÁ°aÂYç“ÔÖO$N¬‡ø¿Ÿe5ooPØRbèzcŸR=^ôht¯¯( –eî*=A¿Pã¡R~\YÁ™7ÞËñCÚa/À Tc±B•ÕìØT‚Õ»vt'k6 ºt$½ÝOóCi6×Î"¤7å ¨ÜÞBÂÛÄ‘3Œ<ñ4«‚¹`”ƒ°!‘Ò¡"m Ý”(ŠºOCe7!mlâ1 m Û¶°±‘¶D(Û00mª ùr¹Î?f^Â1½DÖ1mË2¡Ý‘¼ûðaÜxÆp.òÿÌS'daJ‰¢€mØ–Žh•O/Ç~¬hˤ±Iñ:²A(˜–I‚öÛ+‘ÒŽçMˆÍþ>4ÔÔTÎ:ëLU¡º²š /¼ˆW_}ŸÏ·±*RbK›?ë—ýÚoYÓÒ40 ¡¿Ñ‡ó_á‡u‹Édˆ@)ï½ú(­Cƒ)ý8Ë:ÊcŽä¸ÛNà¨OcÒŽ ’i²fÁRr®|˜Ó…a4tt‰©ëX–A4å(¦Ýz»ìt’.?‹ÎŽ ¯cÈíÏprås6q6÷~ý*£¼- ÍRÒä7–6R ,C¢ëFòHfÌ~› ‡žÊˆ ‚¼0þx¢×OáFç.zËx~¾ƒÉ3òQ¨ÂÔu̸AIbcè:QËIÞ \ª_œÁó=ަo·ÖŒìëäõgf’;¶-+?z›5»Bqc¥… BŸIü4'À˜Se²þ>·ŸÑ›¾Ã;±ùõÇy!}4ƒGŽdÚ¿Žfìe'pÍÕÐ79ĪùËéyÓÓ\Ø"v‚ ö×A¥lZG`Û6§œr2&œC PÏàÁCxè¡9âˆÃñx<{­'rÿá^©ƒFqçGE8úßf:B"T7™=1¸O{úä÷Á[²š¥…;ñçŽâ„¡_¯´ò»ðçtáðÑ}(ZS€Õi,7N¾„îî()ùÇrÜ TР׳½*Jöÿcï¼Ã£¨Ú6þ;3³%$R€$ôÒ{¯Ò,ØQ;/(¯X°Ë+V¬Ø+ˆ± ((Š(¢ô*=„„ô¶ÙÝ™9ß»©D¿ÐtîëÚ+ÙÝÙ™Sïóœç<¥u_†tj@ » Z14oš@ MÁNÃÖmˆr@t‹èo’´{/Gò‰]†Ñ¿mÒ‹G«E»- SïÃC©©Ôª]›€€€r OPlâÚu£u=nG#F^Ô=y/á=®f zܶƒ ÍÕÿ½‹Á­¢¦ÄNãví‰ ö%µÕ¢iëv4oߎq€Í;R!¬׌„ºçw6ìË ®ÃöîJ»6M‰°Û‹¢Y“xÂ{1¢k(ÉÉEÄ7l@î]©]°“Í»³¨߈öïap 'ví"5Ë nÇ! n_Ÿ@EZÁI•™IdT¼þÄ-RJÂÂÂ:tO?ý4Ó§ÿk®¹†[o½õ„º…ÇÓÐT•ˆZµÎïC!…üºjUñÆM›?öìÜþ¿À{†RžùÓS©šðgƒñ§é”caz+EÕÒD( >+>Ãw<ƒð¥Sʇ)7‘TUT°öÃ00ü&¡ŠZ.˜4}ÊTlš?%V:‚ß[M“¦Í©Q³Âá‡ð§ñÒÍÒüâhª‚ièHQV6iþkM£ä¨R j*R÷bR’ªÌWwC TU)m!ð¥Ã÷yIû¥,½šÏ~@Añ_kJ鯯‚@úëkZqUþûöì¦U›vT÷Š¢››Ëš5kèÓ§š¦U©kŠÂÆõëp:ì4jÜôÜ!‚s+器˜¬$—®W½77üŸ—¿Dù¼~æñDSÞĶ$î|YJ/_þ» å¡\J,q2«df|\ê1³\¶q³Ê-†éW6•½/¹Ê(÷IÙO ¯(ÿE… &¦§òµ–ÇäßZ®ª°44M“   úõ뇔¾E©*(p^o ,ïÓÊ1Ö¤ú7i «ò-© 8±ˆàŸ86J”GÖæúÓ4K3RýÝEÃ"‚ä!p¹‹ 1C¬Æø &&Ž‚üü¿=™M³D#,"ø'!(8˜ÜœljEDp>[ŒY8ʼn i¥„ LCÇápZDðÑ HIƒÄ¬Zõ3¦af…“ŒÁ±ô#x½j׎´ˆàŸg`»teÒ>ìßÄÄŠd¡*í€"BÃÂhÔ¨V8óŒ~Àß‘Á!Á´lÝÆ²Ñ·pÊãÆJpòÏìZ„ÀJnbáo-$ç¬Ü‡,X°ˆÀ‚ ghk`³Ù±´î,T/LÓn¯:¶"§t]gÑÇúBš[°`¡Z ¥¤^ýxÚuèXê[snKRR·~<ƒ‡ ·zÏ‚…jBqq1+–/;¿¶%Ž;nw±Õƒ,TŠŠ ªõtÂRþ‹ ¨ªÕÿ˜½AõÞN;“%·\zÏTUåm[hÒ´…/Ž¡…ó^Gp~ÏOhv;Š©ãÕýw„‚¦)§pÄÂß9åRöúþQ5 UQªì¬¢cÙ›aÒ !»*P5 S÷ž´U’¹s+GšÑ2Ê^¡ÉÂé"qþô‡+3õ–=;› /↡ Ô$î#ðÑ‘Ážv IDATW;0f8Ñ5lV/Ÿ˜•òûÙ¾}ç]–oÞŒTìH ¯n¢Ô¡Ûa¼»,—çfO¦i|þÑw49–Ê ¤RÍ¡³ä†Þ̼h ûî­OQ±E–Dp‚Éôæ²ì™çyÙý­7Ì£Olî£;xçµE4<˜:!6lAØK*顨È)Žà`l†©Ú}ŽÁž"\¦@§<¼Å…xü!Ë›ƒ{ ©¹ø7' öå{”¥¤`µbêÐÈU„·8“…Ï>OØðÛÔº&š£6Mú^È;ulvÜ,y÷=F ½P\˜©Ú t– ›x\.L$ZP ‚ìe Y-œ¾…µ:¡œÑ¢›&R‚£^M„ä¡÷7 „»`S}¼¹|<±aNt÷*i8 tñFŸ8Z>ü>·¶¯Pb¹å“]dÿö#¢fG^]{¤DÁËž¯ž¢[¬Ï¬é…÷²6]"ü©×þµ¯r¬lx½´îÕ›qãÇ3þš1´‰­MçA—qýøñ\wå…¨?½È…7>C†éå“ðþÚß¹¬@hCÙ`jdmü˜‹š×D‚¨ײx¿Q¶ªHi½ÎdžODPÒ4ñ(Q\?éR²^™Á§‡%¶Òxq&&‚z='±ro&ÙdpÒ}Œ¾©¨¨ØþÚ;´zv[?¼œÏ'gÔô4f¬ÚË—7‡1í¾…äJɱM_0eæ®~gÙû¹»ÑFîh.GÝâ_œè³LGPšØÕÿ¹iú2MSú¿?ÚŽ4ñÁ¥_®g\×î|²W"õ%4ÏZÇ“%áž%dd僫‹yèº)lqù%0éKk%W=}/iž¯ÊÂò¤`xqv¼ž'†Ìã–»?£÷CA(Ò'N 5˜„&Ì{q:‡‹mµ£Èùm9´Âôxˆ7‡‰½ w$íæSúc jè¤ø’Ô\¸T¤pÓ—ìÊ•l]ü ~iR|Ôd×þMÍöR«¶ò¯&K˜ ¢›¬,Ñà”é+íA=ùy¸uÂÜ, ÉÚ1Ÿ¯÷( ]ÿ ¬ó"uÅG×°a_a‰ºÀŠóxzó¼#?¯œ×‹áÕ1M“¢B;C§?Nã·3»ÏSØ5‰nHŠ/å–kî'úš{Ñ«.îÍëùá‹<\†ÝP¨eÇ]X¡Ô$ÆYŒ«¼¦éÆíñPy”è¦8d0Ò1„ËBc¨¤ãõþ;]ŠEÁ4}¹¼^ocÝŸ%Ê4¼¾ï0Ñuiúú̫똦D×½èºNѱbZ1hØ" 7Áˆ+"hk°Ô”HÝw¯×:¦<]Ðu/Õéí|f$Ò”¥yå}JCžZÃyòž'ýès„×oŠD¥p÷7ì·wã±[ǯJv­I#×hï×/H¤áË!(Lé·M0 Ó0‰)%¡1MÉÍ÷R¯Y{‚+ò¨ù/=Òª ,4Í DPÒ'Ò41M!}íèk_ÓE˜¾$,º—€º°ÿˆ#®¢Ê‚v:ì:&Ò—xÆ/ÂZ8M§@ÕܶÚˆþD‘†îÅ0%†ÛCÃkŸ¢Û³ùrO"ÒôbëN”ûE¾øz5=71óµdœñ¾iè^t÷?’ÒD÷úî#¥‰) ¼ß mÖå z¼~ w=Ä•}Sx`©Á-¸éÊáÔ´ý;§¢(¥òdE"ðéMt¯ݯ#Pð‚®û¤7ÅALP.?,úg‡tív9×·ú€ÿ½‡´1Ýв“ÙacìÔ›‘ºŽnH¤iîùT8í¹MÓäðá4ê'4À]ìó5ªƒ„6SC­ÍZÕ@«ßž¾ hBÇF kZÉÎÌ(®šr µЦU=4¢Zv¤m´ÏXÅÁ4ïЖX§ð­`1t¸ ¡¡Ñôè×mcó®dr•ÚtëÕ‹FuBPþ¥îÐBrs³‰ŒŠ¦¸¸¨’À&Q´[·#¶¦ÿHP ±´nR§=„&uHÙ²–mI& èNïþ¨Y´ÍÛ÷p´(€¶=Ò.!UB­–icÇ4¤å|~šàõêdfd[·îIIáœÉ}¨{½lX¿–Þý›“ãË1¯ÙF™•š¢ÚЯ·,÷¡/‡ Ä4@(Ýk Øl(¦×ŸòL ÙÊY» ›&нeÖŠ%y¥”>±ö_lé&„BJÊ~ZµnGvVf¥¾õY–ï_NG®ûÓÇ)šêK ïõêH¡ ª*Н1MÃ0Q´ò}dátÁUTÄî];éÔµÛIÝϱ܇SBéÞŠÉú ½b>AC÷VÌ!ècTÈ;(ñ–Ï)( *¼•Ççü—ï*+l ” ¦Åò¸>A”×õIÃK…æ”z‰ãrCZ8-½y^[ZÖfgO"Pl6º®—ÚX°tg˜|b¾Egqà‘QuÈÎÊDQ«/Î&8ÿˆ@ñ¯FšfEO?ÛP+Å?ª¦žgD ©Sø|áÇÖ*dÁB5n ¢êÔ9ˆ@JbãâÝ”.¯ðe­-÷µ^œGJJ.ýo„äîùžqcnbÍ£¢ÅžˆâŸÞ =çhrL“¬¤?HÉ,3(*8¼‡{Óp½os’w‘”åý“&3Iùa.ƒ®zýyf%× cßå›é¹FqÉûRä1‘R'}϶lÙ–-›Ùº}gã•ñœSAÞ¶oõCìÊÐUoÝǸ‰ÓùaoÎ)­ •’ÉœqWðUÚŸO2{P!öã«\˜ò+wÝ9‹ƒºŸ NðÀIAqí™öèTšÖTŽf6;Á5B°³ÞÏ:Ÿ^×)óÒÈÝ8ŸÛÆ\ÁŸo"_¯zÒ¤7X>q×/qÿùÀÓ:QÄñÄôñU=™¾^ù©¢b_ì^Á-WßŦ#0²˜{ig®¹ó ž~³{ˆI7O`úü_)бb%œ+D T;AÁA…ª¬yöjË]s_ãºNÑ §ðÆÔ+èÓµ'—L~nÂ`ÛO2õÝ/x÷Þ+éÝsŸ[J!ðË/áÃý<}EW:ôšÂÖbkÞ¸›ÑCúÒ£×0îxñ'ª’3Ü»¾äº1“ù:5›¥Ó§°jÝ2ÆöëJÏ g&»¾ãž«‡Ñ§O®dŠý鮫DîÌ$>ÿx1i&;} _;„®ý®âÅ3°kçv {P(¡¡N 6¼ÂÈk^ îÔù¼:u‘7¿½s?#z÷fÀèY°> ‰À“·‹9wMæùg1fP/]1•éõÕL^Øgòä ºõÅKßîàÈÏosëCéÞ£/—üg;ó¼•èDŠùô‘ñ<üÑZ6=}/q²âÎntì~-ßìÍrøì± êÙ•AWÝÍÒTy\_ÕFPp š"{­Æ\6é)^{ýuÞxíefß1œ/ÞÇÂ͇­4÷猎@ì/˧ æ’7Ìþìm†5 Ü|2n/ìÈœù¯08ÿ-†ŒxŽmùÞZJ·ïre³zÜþæ Öþô -ì^<"‘ÛŸ|›ù/ß Æ1áTÊ-[ÍmŸ¡ñ„É £ßݳèÓm¯~¾’_N#Ã^ù”£›bv½q;WÍIáÚgßdÆåÑàîWqû‡oÐ/ÂÿyÖg<³<”»çÞIÛÄÜôæ³´Üño%ƒf:ò~nï\Þ„~mëðëîc(ŠŠ¢Üß º^}9õí…ØšpÝ­8ðÕ—¸ÐPâ´_xäÖ{ˆ÷,÷iˆ"BQBAQTTU!ió—ëJ¿Vµ((Rh7ôb\{V‘œù'ÃGQ0“?ä£ý-¸ûá14HìÊÿ^½‘—›sڲߛNJ/tñ4¦ôŒõ³Û~Þûj'#ž~Š14¤ó•·s]Ë ^Y•†¦€­^;®¸øBÂ4•fÝBTö:öx@•’£­F—¥¼ƒ¼"½/íX½„? ÐÅsˆy/ä‘ÔËYøÁdêÙ|CR ?qç}Á£ m\;yEÔêw3c‚¾ã­ŸÜ%´~ @ &®v$ٳЩ΃·ΎͯiàŽÆCuÞ¹þ¾?—ÑM!}™ŽDZÖ,™XMhSËEÊ¡b*a±Á>cN ÜUøºš®½Ì™t¿xê‘X' 2Ž è¹xÅf#íëÇùTëÏÂ+Ûq"#Í¢ô¤%|:ïlÒD…ƒSÛa"QO<ˆðÝ;¸ Nÿg1]Hо8·=ò´`º\4}Ù <Ú —µW6ÇŠô¨k÷_LbTŸÊG =Ð#Pó+l5ª÷¸xñ…,›=™§×˜4®I sy9’"„ªR¼mí‹çÙÍ“ˆõoÝ…ðÏÜ’F>¼4ÃËÆ…¯qÀðbJsôd†Ôù«-ªSä.Âì´ÎÌÏ"&ºÉÈ{¦Ç¢ÿróU×ãütCê4&Üý ;s¡U(À>¶e8éãôÅ™²’Q”® %yýÜ{?â‹í±Ì]ù2-lÿÅÅôzÉwéqSïʹܔö8wß;Ÿwg]M˜ê»ƒ¢4ëO@x<5ÇðÀ¬;©Yim‘¥£µê¥G‹l„³x Ç$Ä /‰£º8§Ÿ*ñ='ðL‡F]v·z?cîÕQÔrxØrØ }“úÀ±¢:#d^%%®, Wæ @ë§Ø‚Õ<ûv×~ÿWÇiü&K–~ë»ÌÐq¶›À7dðà%Wõå†Ç”õi©ODdcj›’SãÚÚÇ+ ©tTQ‘¬”I …‡Y½:‰®wÔE©Ä5Φià%˜®7¾Âœk$SÆý—Ú0îè™ÎÌÿ¼ÄÎC{y÷¦ÛYßàfÆ'€»Êì$laDØòصé² tDx<Žâ4R³¼Ÿ¹ã¾ßÊV.i¢×ãÊGžç‚s™8÷W ÀŠš‘ÌΤròŠˆï0†øÝosï³_“œ–Æö•ŸñÚ‡_“îþ“#@C¢Æ_ÁEqy{þn ˜E÷?Á~»“s:ý¨Ã„·»…¥ ¯gãÝ™¶Xgì¨Æ,üï½,ޞʦE/ñö¦PnêƒnVݦ€úqN’ü…Œb7ØkãÈbÝžB ›^XÄáLw)“›ÂIëñsùhŠ“/»‰Õ5¨{V­!»È… ¿˜‡.ö0ãò©ü¸+C{Ö2oö£|{”ãŽ+Ž/‡’Ø¿¿7ŸI—âÛðÜгÑ)o),"8ÍPjŸƒC5€þ“_â¾Î)Lñ#ç-gBÈ·Œ2†Æe|³d*á8"bIˆ *UGÆR/Ü J8M½–m/\A×Þ“ØyOMiÈ“£:ÑçÚÏ8ó6ZÆ„"€Ðº ˆ·³¿0“à%O0ç÷l‚ÛrÝ¥ñ¼4q8ýGÍ&7® Ͻ÷a¿?͘Q£¸éñOñÔˆ#Ø~‚ú؃‰«C€f"E$_Ÿ‹öÙtëq ëz>ÈÕÍc •ÊxJßj›[°ˆàdB’½ñ3F»mén„€¢?1¶[{îøø“OÒ*&¸YœÄöç½?ô?119¶c[Ž='kû׌¿î.¶fšÈªî!|>›IbýºÄÅÅEXÜåü–oTmÐ"B¸xwXÆ~‘÷×êuæ:!<ÌI­˜’zÕ¡yï¤ qÂzy²·rçè‹YœdX:ÿœ%7d_æc¡*äø…o¸ûUÏñÄeÍAz8–zÌ|ZPMbëE $®Ì#dÈ\™+Ð ¬Y‡ºQ¡¤îãX~!ÁI;Ù¡Ö ~£8dæ!Ò² ÑM… ˆhâ"CŽcíõèÑÈÆ‚w–r¤ØÄ•¼ŠÏ71à‚(¤°£éäÒhÇVòíïÇ0~ÿèU†u¤Y´5Á,"8Ù¸3<äç¢{Š!ªO¼üÎïïå¢éIÜþꃽvÝ;vfÌ̽ÜòêzÚ%®¢ò\ÞÒ‘ëuPPì­6½†$òîÍ=èÐg*»â®áºvû×w(_yÛÃcQ 0OA¹….»Lä¹Émyí–kyyC.aõ›Ñ%6•É£»Ñ{øã¤ž v€Q”GN¡·’”uZŽbò¨(ž¹n½{å•í™:õ*B^·^Aæ #hßãJ>Þèàž7§ÆÂ[éÙ¡#¦­æêžaDX%Éá ßMA±Y¡NPƒKî}éï0²Gú^þ?‚†Of|ÛZg4=»…ñìuÝéÔo)u1mRÞ>œžÝúðÀ7aÜ=s êY¥7 E_\•²ðtF(‰4M¼º‰fÓ|ᯥD×½¨Ø5áõb˜›Í†"$¦®££bÓC×1„Š]˜†ŽW7(Øí60¼¾ˆºBAUÁ46»†éõ`(6ìª@J¯GG±ÙцŽnøö¼v‡­ÊIiê¼RÃaS*2Ó4н†/¾Ž¢aÓT„ð­´^¯Ž)A³ÛÑ„D×u ÃEE³i¨1ÊNu‹†Çƒ©Ø±ieaŸ¤þvöú¥1¿¶âkÓ,is»Ý†¾zJé‹P¬iŠà,ÖëŸó>B„¢b·«6çšÍ^z–©Ù•Î5Šf+w¶/P5[ilEµáPme—kvåoà¿PµÙËÒœ»£¬ ªfCÕlHOI;ÒÑËç⡵cˆ ÀAŠ¿žÀîЪ舊Ï]mUÞæ¬¬ªÝQ1ÎB©²T jvTíøß׿¢r=Ïv½,üXI*¯ú9xóÙOÉw–I¦B÷Ñ7ryŸxëDÜ‚EÿtH)Q#ðøkNtA…`Ÿ,XDðOT˜üÙ ?ý,X8/ˆ@€n˜z|ŠC ,üÿQèÒ«U2=#Aj¦›×¿OE˜†Õƒ,TÇújÑ:P9¿ˆ@`S„bZ=hÁBµÚJµšhœ"ø<÷°‚XX°P=sJVï¢zf”…ÒÇ•³WL}æÓ'ˆ¿Õ(§v^mwj8 ƒ|¯¬’¬N-ÑVõ;Õ*ŠB ]àrgƒ+%HQÝõ8*šaP¨[ @µKÕ<•33Î$¦é ÷%¥D±k4ŠqâTü!¼„JBÝB”ÒkNù… 6&ˆ'½Î«CÃvÑ\§â1*~§Ú4"Ë•§Š—iJjÑ*R­P—êx9ƒƒ¸ð‚š„+Õ{ßSy™&ÔŒ !¡†¨Öz馠YËÚ ¬cÃ0Ï|½þù¯ê£gìøÐ”Òïµö’QL¾GТem:ºù1Ã7ἺÄð/óvMA`&^ª”è¦D( vM HlFfvÉÅàt(`˜xüKkéutÝ÷¹)Á0$C¢i š¦Ñ²^™G ÉtƒÃ®G¶¦. ‰ £¯3‹©^”rƒfÏ€¡›èB ˜¾ú(ª‚]õ'b5%ÝD"°¾ÿ SbÊ3{@i’؆$¤±'Ó@QËÌŒ½†ô™z#PUÍÿî50LS TM¡ÄêÚÐM¼¦ÄÜÞ²ö¶PÍA57ê™ÑHK?“IS¢›&^CÒ¸m½B‹X´:“£‰bsп[ÚÖÒpeçñÍo$¹¡~“HzjRjÔ S¤JzJ&ŸoÊ#ºk<íB²_Pć_ÅÑ"†Á N5É¡,Þ˜Gž©øËab&ÎÈ0Ƶdͪtìíë*‰¿0ú)ÆR¥K¯X 3xãë"bšGsiŸ^ÿæ†„Ú ‚Ù±â 3W« ëQ‡ "]ü´*…õ}¢ÉX—ÂÚpÚbróXøý²¥.cÕÔÍ»[¼¥JÖ ð.lĦµGØR`°öu[²r]:GÜøVtYq%óóXiù³,fAq~Ÿýp”LC£cçX.nîæn$‚¨†A¬YžÌ·z cû×¢ej*[e}[…°gC*æ¨ôîCTa.¦Ÿ$ÏäZ¢Ã-y™þJ i’’”ÁºuÅ(ÁA n[‹y‡Y T›JD(,øvEµ"¹¥{I‹a6®M¿/Ÿ.=Š+¬£:‡wÀGþ¦¥(®^½R5/gŒ* o)‘´“l]IŠ[àÐLŒÀPÚ…{YñK6™AúÆc´MëÐ v AÑÁl6ä˜Ø€ƒ9^ÚùŽ$Uá îáÐ|Œs,ÃKãèâ‰'׋³vdaJI`D(bìßv”õ:B( ( ØT]+S V$ಔè&JfRú17£C¨§I¼¹^‘AQ Š o&Û @n’ò%ñÁ‚½aËÍgÓáb\~ÝœCl¥Ô„ùLj ËÕªB½Š‹Æþ"\yì<LT ‰ZÁé›Oç ˜RâÑ „ô©¦‰R”Ï; úvŒ£™Â)^D‚ÝôrÌe`( ¦î&Ó­àÔLtSâv膉ÄcJ„iâ1 )Ñ .Qí é‰LËbw¶Ž‚Ž †n › çô².ÃE±¡ ˜ &¦”x ~‚:è¯ôM|¯nøE] jûF¡ÎfG– ³–ð=OúËl Ám‚" LMÁíÑ)òšxpShøëp†‰Àè€4M<ºâŸ±µ£k2¸±ƒ½)¤KBQd‰.ÜÅ^Ãaà1‰†Éa—aš˜¦N¾G§–aøîkAµB5Œj=68C:‰a˜(˜¥â§&éŽðN~$ºÆ‘ç:Ào¹.òE b%ÉùÒL¬Ó`KžŽŒHL ÓÀŠ_Œ61 Ó·7LtÝD "JññÖ,2Mk\ ‡ð]'… ï@*ßiQ éT‹¿fcà×jƒašFÕG‘†4Ñ ÓÖLJ” âlÅ|´%“tj4Š(}žé'Ã0ñiÀ4M\…nT›Š]˜ 8â»Î0ÅÕø9 iúHV¤P¨æ #-‡ß÷  •ukQÛ_Ÿ]ˆáW$ú¤ Ãã%Ï µ=Û@* Av!}}fyjUûêz¾I¢” L¿Dy…XΡ#,ØË•]cÈ[‘ÆÉ&CºÔ!o[!1Í£:’ÎÚIŒßd,9>B"Mƒ\· nL0GE1éEE($Ö¶£{ÒÌ^TàSV Ò`ÇöCDu«ÇE­=|²9—Ç‹[³Ñ *5ÏÑ,zU{i@ ¤Y]PTŸbA¾‹,L£H;n·“ÁÍèz‘ÏàC”(Ë —K†MËX'Û²š‡âôäøêv†u¦ôdXx0ÍëzQß ‹Íã¥fDµƒÝÈ¡t¬§±ï¨,׎¾„D P ëS\Œo^“„ü,<5BhPÛAQ²ÿ˜ÒÒTשׁæö<.’DîÝ0p®¢¢j‰Pdš&Ûwî§Ð]Vx!°arèX1ÅädrÌ´Ó0Ä`Í–L²í4‹ @fdóåºlò„ÀfSEnäù–0MSÐ ‹9X “«]ƒFµU&g³+O¡i|( !·åShxHI÷ *Þœ"äë¤uL`A)ù^rÝ ‰1!Ô‡äTî*ÖeUSPuÂDÔpP;̉##‹ÒLš&„‘XC²y[>º—GÝ‡Šžç"¹ÀDv»BqNò½ÊÒ©_7Œ†µlMÊä`±ÁáL7î3=_¤@sjÛmD†úêdãÈþ RÔ@ZÇ®¸Ùº§ìB7Ç l…üŒBÒÝ 8œ Ùéì?ZDštrABáB'éh!Dz\*2­3ƒj'úÁÔ‰©{Ò´sB øuÕªâ›6ìÿظý=€÷ô‡*Óu>üb9ÁíQ0J•…º‰/"n9Â0ñE¾5 ß9´@ *ÂòKbš³iúϪ5Eø¶¦OÑ¥©üÇaø# ›4UøŸ¡ )%eðÙ#¨Â¿ã£*|£4MÁ&@¯ÔèBQPåñÏSU4%&fŸÁލ‚Ò2S.¾¢œC6Ó0©\eÕ߮ұXŸp§ á³æk7Ã0þãÖ’v¤äÀP¥×Y¨ÆÜ,¦W£´éÐõü U&eyM¼?Ôu¹Ï„P(‰u©(¢‚É£o\ ßþU–1]Ù{a”ªû…@-Gbjiì<¥Êßø¾(HÔÐH¦¬CP9]‘:ë6¦ðÕš¢TE»Ç=Y¹Œ”æK8®Ìe[ö³êS(J•{D!Ž·;–ÒgM¹z•/*µEùë,Tï|:CšÕî(qZVÇÜt}ëhŸ hª_’°Ìä,üugN"0%ò< mm¯2ሴV6 çDpašë¨XI,X¨Øäy¡HÒ$¶wŒlƒ×k Õ‚Ö®^yA9åŸÃ¦Z=hÁB5À«)ÕºUµÒTZ°`á_B•9Hy¨-+”IV»òçlÖ«¼8(- «E:Nª|ÿ&i¥ŸpÐ n>¿¡#ß?TzžJü‹å:å/B$qGÇŽÌÞ-*oQ7ä•WÊ¿×'BP|t)cGNà÷ܲzäkáÜ!!$Yk?¤o÷ l:âF“Ãk0â‚öܽhW•“ô„sK¤gwöìÀÛåŸZBê®B\Þãm2·~Á˜KncK–ïžÇIø e<)˹ëâ4ªObãætrßÑ)س”+G]ÏÚô“$I) ­VQR\XˆWÀÁ¦ÏÞ¢ÐôÛ/ÈÓ\YR¯”•/qqç4ˆ§a‹Ž\tÛÁ¯ÓFÒiÆš?%ÎÊŻܨ‚á“á ôzóhÙ=, áœÄYÉt$8mZù:w<0ŸŽÍãÁÑM€|Ö/]ÂÆý¹ÖmÃàa‰&G·üÊ&³6‘G7²ö@Ñ­{3¤K}ó1; ¼ä}:ϯõ¹xüôMß±bÛA =vê¶íÃàNõsª0³vñÙÒÝ´6€¼•KIK?Àgï¾Ìêðf\1®/¡6Àž»e ?·xïßFm‘˶ÕëÑì:{~\BjF*_¾ÿ2ëk6åò±Ý8ºz)¿íNÇK;÷§WË(ÿ} Øøíb~O1hÙ+ÞB­0›m›6“·ÿ0o½ê!<ò.¾¤§»Ü¿q÷µ3ˆœþ5ë.i ¹Él^¿Ï¡}l8ŽÛü’7ÞØJTÃîôkegõÏ«IJ/ÂZž{“XÓ‰ÜYûX¾ô'‡Óª†Í¦½éÖæ©ý67‰¢Y×þtn¥2¶$‚2rªìýè^.ÿχt~ø=îÝ ü6{“ž\F¾t±ê…ÿpõ½ß`¢üÝ»L¾n2‹ÓÄ„0æÃ,Þ•…³f-‚l*5jÕ!¦N6ŠÙñä WïÜy-3È/«ªPÀHá©©w²8ÉE ªZ§#€ˆÈh¢£ÂNÀŽ…ÊòÕ¦+õà ‹¡ÓÐ\PÓ†­FÅßË‚ 6¯ZGŽ®¢gnâ¹ÿÞÆ[Ülyþnxl ù¢¥sžcUžMÕ ÁXƒ¨:ÑDÖ 9s“Å“Á¡Â@švhGxPá1Íè3b kh:hÁDGסVÍ ²·¬aÍîtP yå»Lùß|Ò]&¦ûoß{3¯ý˜‚ðìåížd¯âÄJˆ]ÁILt$5í–ó‘%”ƒjñ÷]®¿'‘~ù…ÉÍýk_á2¦¿¼“K¿ÙÊ”æ \\›îbþÔ¡´Ö$Ž–W2eÜE„ˆ 6­ã«õ©\|i…Ï£qŸQŒn®‚”ôŸ:‹~;þË›_Çð×?ãž~×"PòïÞö6ÔŸÊKw&ÂYíºóm½‡Œ¦U„8A²ÓÜ÷èU ß•†O4 û  {ó hN\ûnÄE¥ÇàQtˆôEb¾ìžÿ•þ¾[ä•<ÿåo\Ý2€GŸÛÊE‹6qWôWXòÕ&Tg‰M›R3«ÃFŒ$Xg.ájÈfNmÁÝë1¿}gú¹„ëo½‚¦!uiZ·5‚{pá…}R”q÷õõj~{n½i.›3®¢Kág|º;šG>}„î0´î^†Ívܰ-¬j=ˆ¡Ã¢ÊöyVlK"ð =²}»xíïq°$%â¡5$‰æôkî/VT/zDeóÞb µ›×#XØÔÈqée{TÿÞSšüðÂMtnÙ”ÆMšÒiâJ¤ë.@ p²ýÉQ<—6œ§ö‘@y…Yé^Tž€¾ý}Ôà‡Ø¶EÏM¢•\Ãm];s÷8TQAËgä½ûÇжYš6mÊÅÓ7`èyè‡7²[oÊÐ6þ'ö¢¥SóÙ[ÊJzq&².K¤ÔèqÏ$ï_Á¬[¢ÿ6›!-†ðEº@S+j.ów|Á-#ºÑ¨QcšvÃ'ßï$G‡â”µÈš-iá»®V»a$(zYކòz‹,"(Û ¸Ú0kÑÆšopÅø9ì-‚kâÐsÉô”\˜Cz¡JHˆã]óŽwð$¿Ï#¯áßïd÷®ì|§?î"_àRÓã%aÌ4úÚ—óÒüx*)KÝ€+)ÀJ¼}¥ußK˜úô'¼smÞzægÍî^Èô!a4¾b<]ö>DBÝŒ¹óWn|x{§õ¦qëNLýh/£1M{íÎÜsß…¼}esZ´éÉ'!#h* q¹ ç½w»øR"bÚñȼ5x-&8'qú#y½¬_·–¡ÃGV©+’þÄŸˆ°¥¿©¤D;eÝS¹ ¥”ÇðüjzÊ¿?aaýuªtíéVž´í¥/šÒÿ/dÕõ²ôÿäçóËÊtéÞãüŠPt"]Ñ©M…K* ÎSSå.¬üÌòïÌÜ-,ø`5.»VFM8iÚi Ý[FV)B‰¿[ùrwU\+N{_ˆ“–õ”›ö$߈Sn gšÕ• : ¯A Vv’/ÁN«©,XD𯀔%¸1ÃÆ4>¡h/ÏÔÞÝ‚‹Î’ÂäÏf¸°RyZøgŠG`Á‚‹,X°` ,"8=8.ØŠÕ$g¼d%q«Î1"¨2"QÅ8bg¼Ód‘ŽäßЃ/øJöÞ |·>½Ô—à<˜0U„;#¡Æ¤¬Þ>!L2þøe›²a”EgBH ÷¯eöM—1sEªÏÞ]²y‡I/Çs:MAÆê…Ü5þj^Ú\\Z¦Ã‹þÇÍOm:y„ž*a’²b3>øϹœÜI„ÐYñðXnñ:û }õ6Š3øpæ£,ÿ#¿Z¬KO­‚£?¼Ëíã¯åµ?ôÒ>Hýð>n™³íoõÁ¾%o0ý“Í˜Ö @êEüñëÏ$gxNX¦SäIë\þ»Âä­ü¸t³¦Ì%ÇÿYÞö|³æØÉë]u Øì8mZ¥ /ò”%Ã3×ÿVabkw)£Ôϸã­¥W²øxocö¸>4n”HbÃvL˜ù9é¦@ˆLfµ‹`àƒs¸²kC¢ôäñ°nþTº6©CÝöcù:Õã[=Œ ¾yúVº6M ¾Qs.™öÉyú ú¤îÅÙ÷? Ë}ûg—J %+bá¶o˜4º3‰‰‰4lÞ‹Þû•é+ó±?¾fâ h_—†í1ç·Bœjñ.ž¿q ‰qñtó›Žz2™»ÛÅrÉÔ¸°SS›tã¡/S|RÉw/qIŸ6ÔO¤iÇ‹xõ§$t)ÈK^ÎØ}ùïäq´nPŸæ}oà« ›yaÒ0ÆGÓåòÙìrûÊ*s·3ç†4‹%¡U/¦}¼£$ùê‰dg(­Û·àëÏ¿â˜Ë,]¥KŒ‡×<}-Z5¤n\º\ò0k²@¦]B—»žcƉk̘Ç?'é÷÷Û³)щí¸ûýßp™!uþ¾€q}[Ó ¾.m^ÏÇ[òŽ[å¥î%pÀ 86‡Ç–å•öA‰gvÞº…ÜxaiÔj3nÀ%H“´ ŸrÀ64L¨GãŽÃym“ »Ý†R¸§®ïK|L<]®Í®,éÞÅí¹ê¿w1°}6ïÍÌ¥i!8òÕ“ŒèÑŠzõiÖårÞ[sS 2¶}ÆeÃG2í¶+hžPŸ6C'óýƵ̾¡?‰ñ±ôÿ¸wñÄÍ“q]8‡u»“ÙðÅ“ô‰C¤|³ûU¯°uÛrÆþÎëK7"¥@˜&fpW>_³“}Ÿ^IJiwò›lÑ]™¾`5’“øaVwÞ{úm’‹ TUÃuà ÅÍÇñÓ–M<Ñc·\3çè9lÞ²’Q…oñä¼ý@>ïÜp5+š=ÊÆäC$-ÆÞ‡¯ç¥½%T{¢õÎFûA—Ðôà·¼¿1³4õ|I_ÕérŸý¾—ƒ©Û™Ùb9ãïüÐp„päÛ•Äßó%;W¾ˆ}郌}:…ÿ|¸†5oÝÀïóæ³;Ó‹'{3O?úûŽ}Éù➆¼w×Ýl(8¾ÜöN<øØ`V?5‹$*¹&„·àö——±?)‰uóofý¼¹¬=èÂ,ØÊã“ ðÊר°;‰5 £[„‰© ’G ïðǶ¯é_°Œ×Þ BAº<¨±ÃX¶~ÛßÈWÜÇ&ìq}˜õéZR$ñíýM˜óØ{Ö%ªf£`×¼]î`õÖuÜ×b-Æ=KÌø7Ùºa½Ž¼ÎÜE‡€Þ¸þÖw~’­ÒØóå$6MËëNÞggͲÐôºpv›ÎôþyòÉ•¼Ú¦,ž=4˜Âçsˬ5äy%™ h›š´F(v:\y-k:àÂQ4ùïºOI¤†Žé€y×FrèÀª-[Iß±‡û'üŒ½c»íI<{e;l'šÿ×Þy‡GQ­qø²}³É¦ ÔÐ¥IoÒPQ"öŠrí^¯ÅÞ®{{åª*VTD¤ ¡¥g³}fî»!!T¯¢ßû<ó„]ffçœïœßùNû&Â?tãž9œ§¦ÿÌÙZ­Nzs}ü2íAn›·œ˜áçå¥l,ýùUæUöfêEýISƇР“%ŸDH|çÖ'qúöêÀ=Åe˜VzJ½Ž–x޶#èäžÁ²mгe ³î¾†mF5K)úÞÉšjƒ†–‰«EwN<²?~J·#GÒî§ ÷o…ÇGՔɫ×B`)Ï|Wa>Ì îüRò3çmfb‹{tß•ì.\6¶)Cnzš±3OKºÓ ’ݰš;®ÇÛ ô`€XÑ<63+¥Á¨‰Œíœt C£<2OO<8»Ñ"å+¶†LMç¿‹7±rʥ̻ß+ÀêM•ü¸6F—ö;ZÃŒ†É9ü:Ž|ê8^ž³žQJ­ ||¬zô.nýl¦dÅOAÖWFèZü* ÈÓgöÀ§M:‘†Á×áYÃÏçœ>MPˆ2àÐæ<¾¥…tl™ùôÜp´Iûå¬*N­<̼ór&/݆fl¥x‘ŸÕaèhšxÚ dìðî¤zUº>Œ¥n÷(À£Ã‡ç3mý([Ç´oC8m÷qÚ'1°Á¦Šï˜õI1çËüÓv þÀ%Ʊ¨›aÿº™§ÇÞÍ»öI7ÜbùûðÏi+™8ùVz4Iáó§/áÃH$éV©8½5…GCÓ½¤Ú“j«©(fƒ(•U£/¿‘‹zÔº?ï^lb)™uÞx.zâ–ç×lïŒ1çÁë¹cI·ßøZùªxhÒ¿‰ÇMŒ`¦Ý‡W­íM*X`)¸|N,ÃÍBEÙÞ¯VUÍ®Ôü$šja³*yâ‚ y%ç,¸w0Œo9}üÄ“a„lš:a* õ|½ÖÎYFÓ&? =PJIiånú”»øÖ4 «]¼«˜ùe%)þtüi>ܺ¾f¶  )7Þ6„×ý“¯BNtÍ?gI¨#çœÖ†é.Ë~¢ÜP÷9y–ÇÓ¬?î²¥,ߦ’æ÷“æóâ°ihêî·e·í{4í*?áÅ“¿UÊ«;þº4oˆÛ Q\´ÃŒãj>€´ªE,X#´&LìWO{ªP±’/×û8oâhZ5Ì@)ÛJIEpŸzË4 ¯\+˜µ0Pk›ŽMÿs/ÙùC<ËŒE0-P4;ýŽ;ƒ‡§f½-h4iß‹Š)³˜úl”Ôê¥L_¢Y»Dë ‰lŠi†­`‚Á(qìŒ>ãLÞ¿ä^λz!]§P²ö²ÿû5Ýõ3Å£„‰؆¤pò¨Œ­\u»‹B‘øöñ€³Žjͽ| ¿ IDATMdˆdÑ·{÷>=Œu­ ¬üˆ¯W†écF±åÍÄQ¯qÿåç³¼_[¨,¥É‘WÐÆŠŠÆkÓ‹Ž™‰g …jm`DBÕD}mÕÛÉS·NÁè™Áº/çR´-ŒaYX¦A8¥&y¦%Ñ·{yf,L$&N_n»í8θi—~=ˆ|G˜¢5¥ ¸á^Žnð炚پ}zß0dè0BÁà™C6M“MEE´lUXû£î4Z´kC˦¹8t—?N½û1t`Úøñ7lMÇ¡HoÃC9é¬Ñt.lIN†ìV8¤C!¹^-Úw¦cëR4À“O»NiÓ, GF+êF¦CE÷¤QС»´"m7qìþ\ÚulC‹|?ª¢àoÜ‚N=0|P7 ùÈo}­ü Õq•­û1fì‘tjY€ßã¢I÷at)HEÕd6éH®…äååѦM+šæøPOfí [Ò8ÓOnË´kÛœL—8É/ì@›ÂBzõ9”FZ â¦MïÃ5j0Zä“êN¡ °-­šåá±)ØÜÙ´jÝŽfùÙØpf4£u»4ÊIÁW8˜a½›áTT\i¹tìw8} ³q©»÷FüÍÛÑ¡s¦Ù'íûõ¢s¯ôéT@š·½tƪ$î.àÈÓN`@÷n6ÏÅŸÛ”Ží )Èt6rš´¤}«fdyl ¹iÔ¢5­›5ÁëtѪ÷P:6JAÓ¤7lA¯þh•“‚^§ˆ92òéЩ -òRQPÈl^H§1¨+-ó}4íÐ…æ^ƒ ¡“ßa ÇŸ4œŽ- Hs¹hÞk(ò¼¨º“ì¦9´sKòòÓ¾m!Ù^R²›Ð¡u e¤Ñ°e{Ú¶n†ß©€ê¢Q«ö´nÙŠ>ý{ÐP©&¤¤ÐqàŽ9-òñyRiVØš–¹8uGJ…mÚÒ´aºîÌf´nÛŽ†Yüm‡0¤{ª†;½!‡ô?œÞ-³p@§ ²~ÝZò7Þã¢/EQ¨˜ÿùçáï-~µær ’übŠPeÊŽ_ì>ŠM!ÿÃlYÉËêFÞÿ¸;…2³¬=¾Êlo?´»Sê§a_\ПeéÞå›zçí0_7웵½ðì5íõB¿ÕÝ¢½óçÝeQò¹¨}ýZݵûjƒ½š ~:ëätýüü¿Û`?ùë‡*Ûcø¬Ý]§ì1œÙv*Þæˆ.—°\Qvp…ZŒ¼·î?ûnžio!½~mšw—†}Ë¿ýH÷îDq§°oÊ^~o׉Ú[~í>‹jŸKaÏ験 öj‚úéü3Ù@f þÏã–©#™½jä>µ‚ðwâo#}HvlCA„@ADA!Ø;½yßö”ô¡ÊêÅsØç½ôû{ðw 3¡¢d¡ÚåŸf8@iyè)8ñh5Å[·²mÛ6¶S\¼mÛ¶±u[ÁÈnÔ™û&â„ËK¨Œì9梘,{æZúOx† ñ'UFœŠ’âDº·S\\¼=ªÂ•|6i ½oúEQ0£!*ª‚{Zï((J÷÷Îå‚w«÷#ªðGñ‡L–/ú/' :žU§¼ÊÒGÇà6¿z]¦vdíÇâÜmë¼oóüVrÇÞ.ıó²‘MK^ãÿ˜JÀë¢|ég¬  ÝÛ¥ Ø9ñÉg9eò˜Íl@œçhÁ{×ncÆÑênï êv\Ž?ûììzî¹à2æW„0+7óýŠ2Zv,ÄkSÉí:‚‹Ç\Å-®Äތ͟<Í™/xyê•økÜž]¯RÂærãÐDDö‚¢êdtëʦ·î⾠嚎:ªÝCZŠ£bÿ}îaf.XG\Ïfèø‰œ: •ïÜp-«z!6ûI¾µá‚É×Ðnã+L¾÷ ª›ÅõÿK^²núüEîyêŠâ^z¹ˆsFtÀÎÎ8¿ó)¼8÷T§ÏÏkÕÖM¼ùøPØlÕ¼=ë ¼-†â›1™J=”L9™1/æsæ¿ÿÉðv©|>íV¦½ÿñ¬Nœ~ÕÕ–÷çïqY€b5åºç^ư ê»éœ|õ'Üöü]tÌp¢Ú5ÖÏz’¹Z:‡5·x﹩¬úÎÎÙ'~MjîHî½<Ês¸ï‘—X^nÑzÈx&œz~M*•t ö¹IJ†pÇ~ýÇÊ€º;R#UbîBθä*Î;º)3¯¿€¾ 1~œý ÷Ý9•Œáç0L{—q£Î`ÒÃ?0äÌÓñ|3§Þ³ €²àäIïÒ긋¸l|¾œr5OÌ_—çµ ar8ØÐph*Šflj†ÓiG#È¢ÙoñCQœÇ_À± uÚŽ¿ƒ©Nbp»l¾»eÏR9é²k×fFžÏ7¦‚íO®JÒò9œ8Nœªªáp¸y¡ê÷ï,Þötú{"…]‡3ù®)Ü1i4êÏs˜pÕC8zŸÊåN&4çvn}ö Lé ˆüªÞiؤÍEÿá˜Ò¸éƒzšãÎoÍ1c§C³|Úö;…ÓF¤°øËïÓeÌ͌֗Ó&_HƒÕŸÑøŠ›Ùï&_Õ“Õ³Þ§šjf¼1ŸCΞÀ = iÞuç mÄó–c²çåÖ.»¾5W¤áÕì¾,|i~ì‘y\ûD€ ﹚>-šÐûÌë9Ç÷SÞb·ýÉ+„¢ìv#Ðö¿ÛÏÑpyS°;=dde“•îà›Ofcu;žS‡u¡ e7N9iË~I©!1ƒ¥kð+ª"Z{®½e$ÇýçV–œ¤oW¥Ê5Ÿpûä»YT¢ãu딬_GDZ¡äŽ49­²'ÚÓð:ò)ÌI|tø=¨árÂV€Òê ,|úΙØð®j*í§aHõÛ´„uF€7®=‹÷Í8–¥àhu8Ý=bá–ÑŒSY¼ŒïßYÌ¥?½‚…¢ª4ì>»b‰O Bð+{±YCþÉÈ—OæåY)Ä”V€Éó^bMÆQ<;õ25øðŽL¯ó‚ˬmµ¬º¡µk¶€*Nœxép1;'<üãý;¶ªË_ø‹µŒVbK«¦ª j8\Y´8r4¯NUïÄJ™2”®Á¯/]нÇœr4‹?þ€m¡dCïöRQÁ¦A|ítî¼ ú¯7IeôÈn|rÝ…<üÑJ*+¶²ðͧxvÁúß°¹È\4Ì´Xýåb"©Gqݨ07{Ÿ­-£|órÞ|ðvÞÝ¢àø‹ šyR¼„×þ̺’Jb†F·¾Ã©zín˜þ ¥¥,ûä ž³˜ø"ûÜ®êv|)4EE£u¯ ;¢ ©; *]‡_ÀåMú´ïÀa¿`À¥Ç’nKÄÙw¦úÙ»T±áó§R݃?5ÑhtÌd^¿í0þ{ÙátèÜ—óþ—Û¹×g³yÓHóØvÈ"wj.-ÑÎ ¾åV¼{2yùyêËÍŒ|l>w XÇÅC:rH¿˜ö£“&~Pìn|ÇAS-Í/Õ›°IMvºSHu%8½Ë Né¼…ñÚÓeð-˜]Nâ™G.bÅ”qtíÒ1×¾H@KAGÁéóã±Iå:˜Eu» ÔÞc{ø§z‘wêçÉ®×ìøí¾Å½ùý²]Dd¢~ä¢úžÔnÃ.íÎFÂD"íòº}ŒSý%ל÷ ëë¹By=/âæ ½vxßÁ¾FëQöA_ÿìa½r¯6þÌè«Ôºኻï&^?œ©³Œ„¿³¨.2¸Äê‚P¿jH‚ B ‚ "‚ ˆ‚ð‡ÁNa¼,kÇw·ýáá­, ”ê=Ó_mý®ÂŠY5é߃Á‚¢XT,ÃYÝ ÷âO‰pVŠÂÖ7'Óÿ´—ˆü+Ñ*WÎã¬Ñ0] ¬Ä3¿z>†O¡XÙó*Åúê @QP“9öaп&í`¥`„‹yøÜQLyw%Æž_*¸=í–†Á¯ÅŒ…©ª.á­ëîæ›äF#3TÉÖÒ`¢=2 ÂÕ•”——S^^I0Rózq“pUÕáÊrÊ+D 3¢²¼Œòª ñ:åш©,/§¼¼‚êp ËÚuõåPà^λKÖ²ý­œlåég¾"÷øQdbP]UAyY9•ÕÉW•c­®¢*!(§´¢Š`e%HŒPUee±dKk V%Ó“|–dEŠTUˆD©®,§¬¢*‘žx8‘žÊjâfíóÑ0Uå”——Õ¾¢{¿Tžv(¿L¿‡…qmú„w~ÒhÛ¾)V¸šŠòrÊ+ªÇŒ„¿dÆ ªƒTV”PZ&  çVˆ&ßánFCTU–SVVNEU0™žDÜÊê`ˆp2_*«Ã˜¦A(P™L_íkß±L"Õ•”—•Q^™°¹ˆÏåYPd¨N༲ϙx÷B>ûw·¼€È¦yè–IÌY EI?ä&ßx ­SËøOï&ÌìsŠ¿ä»etp'#‚3yfö–¥qÁS¯0¡««t)Ür'ï,)"n8›áúÉÿ k®{çµÿž|†ö*dÂ̯¹fd[<€¹|.onjΤѹ,~#WMùˆM!jåpÊÍq~Ÿtf7ˆÆú1Ò³‘m ºÒfÑË<›>œüX²|-UcÚÈ‹ü³7\ÆŒåÕ˜¡îfƒ™t×utÍðÈ ¦Lí2‘þå_°à§bÚ{'is˜:ë ~Úà`܃/ruÿ¨ZÃówßÎŒ/WµLôݹbÒÕ l‘ìÇ2f%±ÃÞs"ǦÆóïÓíèLV¿õ(¡Ö§ÐQÿš6‰ù[,lVŒüÁçs÷Õ'’Zý-çCUÏ#qn[OÆQç}ôRªzƒ³x5E›+8ôÜ)Ü|r;Ö½zWÎXHy J4îãèÝÃC›°áÓ§9ó¦7h×"‹e+×t·ä¬±ƒXþá|µb-jþ1Ü÷ðu´O…’ožçÚ›^`m0FÜÔ)<æßÜ}q?ÜÉhS²ù ,´ˆ9œuÛåhÓ.ç¥ÍPw—±îoÊøŸå½wg3÷£×8Â>——ÞYh8SR°ÛÚqÓKsxÿáá|xý%|œ}/Îþ”çÆÆ¹û¶¹˜¼ÿäC|™{3æÌeÎÜÙœ³‚Þþ~7ÇFÃàþú5敘@”/æ|†ÙçDúò97ßü&nšÎœßçÑóÒxø²ëù·ÏE¸8‡‹Ÿx…ço½ŠN)Ä+²9wÊ3Ìœó‡¬zi?U£§äpì5O$Ó3›sš|ÊãÏ}è¸R½ÌçšgfóÑÓ§ðÍí—0CÃÓoÌô ³xä®Ù„°X8ó)æš½xêݹ¼7çþÙ#´×>"·~Cl€¦Œ;£‹gL§€•<óÌJz0ˆîº‰/šÇësfóÎ ×c}øO~· ]ÕPðÒላyéÍYL9>XÌE›ÁçóÔK¯3ý¾cøfÚ|¬þgóÄkïðþûïóÞm‡òÂÝ/±›ÃN´ºžy o½3“‹;­ã®gq俦òî[¯0ИÃ[oVpûÄû)¸ö5Þ›û!¼}+ÊÔ‰<¾‚ý@áÏ$`Å#(­ÎäŽñ¿ù5JµÚ-»šæËg¯ G‡6ö䆗W(ß”0¼j§ýð‘4°AZçž4±ûè5¼#NtéÛ6¬ œ2–®ÿO¸„Î……và’GgðáÂÄvW-Z cL“õÜóÊZˆo惫9ª'¬~‡Ÿ=9f`Tì´=æ<:ßòÍúVܤ`ÔhšiQŒ˜E£ÃGÐHÈ¢m6ü¼5 šÁOÿ½™~ÚRXxŸ^C¸d –©Òú¨Ñ4r‚§}WÛ|ô>º;E£M–è[VQF˜ÕkðÑ´èÓ¦ÂÂBN»ù)>\\DØØ÷XQ×6y©kæðíFˆ~v?o…3®wŒùËcœxÊ@²ÎFÝ9ê}·TW^]:µ f«Ac:´OD®………´î| onXË’%eR{ú®AÒ+0¢Ðõ’»É}o¤&w«Y|ÿîîúÈÃCsÑ-×Á'Œez(šì3*èöäc+*ŠjÛDU°LÀ$Xåá¢ççqu¿Æ;–ï´¥PÒVWnÿ÷c|;t(K·åsi»F°ÑE«s¾‚’$³,›Kßá>š½6"‰ªX˜(”.|’ëžÝÊõ¯/dH37?Ï8ƒÏÔ¦ÇQ7=öZïHQÀ2°°U;ûŸ×¸ã¤®»ìîÿ¯À݃Úÿ‡o¾]ÀÖ§æuÒL =â–BmTòÄjÍŠªi¨Zm;¢¨ JMZ PU\Æj&s)Û.x™¥ovÆ^þý¼šcQÐìúömä¨:v]E¡Î0 ˜ç¡ÌXñ&]w¤•mνG,ÀæïÉÇä2{Æ)+€IŶÍ4íÖ›N¹®æ“wÓ~feÒµu&o<ó+KBXVœŠMkYSR½ë‚“l}G_ÈÐt®¹÷9Ôö}hÑͧ ¼€Ù_•«æ>Ã"¥#šØ#æÖÞ+[õ¶u¤·îIfn0·ðá ˆê¿&=nÚ¶nΧ3g±¸(€e¶ýš­˜Öot Õ™FÏÁ=ùêÅIÜþuC.<¿ K×& 3ÞøŠŠ˜Ilów¼÷C€>‡dÕ ·§T+XUëYhÈñ'tƬ›7Ÿe¡Ú¶ê^Ö«èF Ž``úwL™ö!ÃÂŒ(úù'6‡‘¨ì¨ b˜€¢Ñã¨q¤<þ"›¶…6½ŽÄ>éÎâÑ í^ŸE4\E0Æ “üWÝx1Ç¿•†CÓp¥µâ‚{n¥S*ðâÿ¡,ÌhˆÒÊ(©þTlšfŒòÒb¦¼lЧª¬„ÊpÕæÂíKq“šb'°u q_üNÌ0Û¶TâÍÉÆ¥‚)cs¹FvŽ ˆ‡*()KPÍæ$ÕïÇc×v?¦€*aS¹AjF^{òF˜²âR‚QÝå##Ó‡ ‹Pé6öt²¼:$?WÙÓÉöê€IuI1awN¨./¡<CÑ]¤xbqþ4Õ[7IÉ!#‘¶m®ÀG¢l*ƒ¬œD¼„x¸ŠÒ²J¢†…ª;ðùýxì:$þ‡¡´´„¨#“>{2;LB•¥”U†±T¾ô ¼NÌ(å%•8ý¸t«þg#BYiîŒL±*¶–TCÇãq ™¤åd G«)«6HKKAW ª¤:¦“æó `®*!¢úHõÚQ0©.+¦¢:‚†ÓBš?Ûߨ8è#‚jw“™é®ÓA±‘–™KÚöÏ:)9¤ìâê”ìÜ:×9ÉÊ­m‡ŸÜœ:îŽ+•WjÊ#P ~¶i67·-Ñ÷ue窧”š“ôœ†¤×K‡+=×n?«x2²©ñ?<þl<þÓãÍÎÅ[›²r³kÿÓžºczœ)dç¦ü>fѤg5¬×B¨¸|™¸|õ;”vüY™u [½Ïšƒô¬Ä[«p¤Ó°Î3טÃá!ÓQûµÃŠ£n^ú2wÌËÝäŸpÐþTÅ?O»‹µõG÷½‚{®ì‡ÄÛDþâX–Þ¾<ðfßÝðëž ‚ÁA6²·.#ÐÂßÙ†,‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ "‚ ˆ‚ B ‚ ¿EQèýôÿÇC——•ñÓÒ0Œ¸XPápEå`MÓ8¤sLÓDUÅ„Ûí"«m; Ã88„@QUäæŠåáwÀ²¬ÒM&Zd¬@„@ADA!A„@ADA¨Aÿ«%è@-°ö)·ÙÕ"ט˜¦…%õ» šz`Öüå„ &SbÑ(6l ²¢"Y`…–ǪJZZ¹ b³Ùw_EQ0LØRã§u%l)­>p‹â…DÅÕTò²R(Ì÷“™¢ýæð/é†Á’%KPÈoÜUÕD `;‹ÅX»z%´mÛM×w²AiÀàÓE«ÉËðзCÃä>±Á²A4ãûŸ7 G9´0‡T·&A}JKJ‹^}àt:¥Üü4jÔˆ>ü€ÊÊ üéõ„–ýRN^º›a½Ûá°ë’a¿Íò2yíýoù¥4¿GÃü :û—,Œ„øÜ\.—”–ß oJ Šª‡w9rPˆêóâtˆü^¤§y‰Ä-Â1SÆö4R㦠¿Cþ*  ì6ë~ýkm *IZ‰ûˆwo ‹QÄÿòr-BðGçÿ¾Ù@Qá**"ˆ…CWÈt+(XX&˜bËß¿¼ÈTâŸÛ5£Ý–Ÿ®ŠòÒWå,ú¹˜êê 6›fù~ŽêšÎèCÜxì*† bR‚}o‰¤G (¨ŠŠ‚‰‘‘QT¨Þº‰JG }¶Z+3¢¤,ˆ/3Ç…QPT“Ê¢ „|y4ðhú²fÁžl * å!ƒ{ç–ðôÜUDªÊÑ4 EÑ“Šøøk¯Ò„ÉÇåÓ.×¾{WXQÑT¬Z;ý^ÏX¨”â*…tW”Í•våûÑ‹ÀnÊ„SR %#‡öç³Õ_we¡ea ƒh% Þ}’©®Â´Å[UÂÌÛ•^­BQ•ÚßJ—Íâø£Ïà«Íf¢:ìî¾ÉJ²O ªRŃ}šrÔ«å;þæpì(·{îšíîP¨\3½ˆGÞü3Ñ’…ÝíÇévc9Ó°¥dcw¸øbÑZ.yzK‹Â‰áƒžGE­\Æ+O=Ä«‹«Ð4~¿ôcñË×S™0yKÞ˜Äg>O…ª¢(^w(½üy§2Q±òÆu*Ÿmˆï±Lüj ½ûëv ’þãè‹óŸ‹Ïazì,ŸBs{¢U°{SIu9eû\ºa(š””Ü^Zú[qCA×wÔ^ðдºÏh›€‚®k;µDÎT'¾z¿Çwy¾eÆ1L ]¯Ÿ‰ßøu›v÷;ŠÏ+åíùkp¹Ü(š pê1Îî—ÎÛ‹,ßjaÓ]8<–­)ã¶·62õì¦8ê壪Áºw¦qéåwSÜFaäçâRâ˜VMúãÄã‰"¯ë€Ç@g‡¬ÇÂ@A¬xCÓIdI,naKæ¯a4x¯ö×°kßÃm𠲇2aÛâ%q EÓêý¶A<Î.l¦aüî¦é½¦€5‹ß"Üó ŽMÏ}ßPÔ)¶Aåç\Þ7 Ŗñw|HÔ²ÀRp¨¥¼rÙHRvtÏ;«-t½‚{»çÐ÷º{ÙXÃ?æq‚±"?»iº‚+¿w~² ]WÐõ8‹_žD·†nt‡‡ö'ÜÄÏ,ÀúÙœß=Åј³Ÿ]¶ýü%¯L¢k®›ËÇ  ±¶ZG×~á_r9æÚÉômäD÷wâ†÷ËÐuå7·FûÔ3ÙÍõ ˶Dyýó  ;±t¦¢b¢c¡1¢[¦]КA…*†e è6œn/óoáýŸªÐÔí«D‹xeöœ<åüp'O®UÕÐõ5Ll™ÅÄott]G×sR^3îX£Ãªw8£OëAìxíIDAT>v»ONgn~ýgâ__Fnë+øE×ÑW½HÏ?§½_ŽM¯fú¤Ó8áÁyV„9“FÑ4Ó‰¢¦3ìÒçØ¬ÔT% %¼„›G6AQ3yó{„Íú „7ÍåC[àÖ²:žÀË+Lt=Êg ×Ó¸rP#4=Ã'Í¢:nîÁ+!ø?3Tóå+oÑxøõÜ}V&Ïß2›ˆ¢%ߥñí7á›ô5Û¾¹‡Í·aâ¼R\v•­ÎeAæÉüX´–ûú¯äç_ÃZC#.eá‹_qõbƒ²éã™=® 7•ÂW[*YúÄ@î|8ÏmÑØôöŒºlcžXÀ– ?ñÐyýpGÕM¾yä1²Ÿ^:†WÆŸÄô2-ïMaÜßrÙ̟ضúSz®œk}ˆiؼ™~´óò/aÊgôäÁѧðYDCWþ_y¸koà›5Õ”W…éÐPg` •~Í4´PèÛŽۮѴ—'/ìÈÄÁ©¤Ø ÐhŠÆÛß–Ô[²lX»”¯6¹9ràyüëÄ8ÏÝ÷–¢&áª*ÂF­7ª óÐM·²eÈ}l,.aÙ3¤© Gûá4]?“¹Å°é»åBå¼ÿÊ0Êù~ÅF:7ËFÁ$µù±¼öm>à°%3üªoºSgÉÿƸàÖ|zk'W…q¨Êö*§X[˜rÒ,íq«ÊÊøï…ËÇÃ…¦ùòΩtšö FÉL¬ç®åñÝØÊ!Ø×AßæÒê°u¯,nÁ '6¡ÙÄkèºà6^Úœ4C4Hú)sý°2;Žå³šòܽŸ±«èm†1é¼ãÈõç2êÒ»éPö-?¬,Ã2,:\x7ýý@éL&½aз§“y/<Å{³èé]ÌÃo¬`ÞGÓaâí\9²=þŒF <<¯ˈÓἩœÕ³€Ö£¯ääÜÕ¼»´œùó?@ÉËcÛWoòÌôPSSùtþ"QÕãaèȼƒ/dk1ó×ý¬¿; ÄMX³%H(¦pÁÐÆ©ÑZåýeêõ#Hùþ{̘&ñxì7Å}×\:?>r.+!0l0%Ä%ßóÈ#‹8}rKâ1È)Ì+BTqÙ(èÜ"±<<™^lšI4&nÚð¹ ª*–Ž¿#ñŒ[V²UñÓ4;…ÅFÜR8î‘—hؾù*@A'ÁP-9"îrÆ0L ž¬8(q¼v‹ÁjÊK‹ñ§wÆ—šŠø‡žÎýMÅ¥ÄAÕ±{À4â‹c× B+#ßß–Þ²ö¼¢Í¬±Á.Fð-,ÂÑ8–¢'ûÞ ª¦í²k§( ÝZ¤ÑbQ‹7èDãáhÕÒ“ËjÃ,xñ!æ|šÍÈf š•,ZUœy›èydÓÅŒƒ‘ð,,bø8þ²É„žzÝÈ­««9úêû¹ì¤® >¾€)Ï¿Ìg­BzòÙlºÿ"žþ¢¥¶æ¤¯øœKŽ9‹ÒÞ§3²sŠ/%RA8ñ¸Bzc7˜QPb8u‹P$J<Ç´L ‚E?RåÈ&?ÓGšaôÒ8ÿñ—èÔÂàû¨‚/K3‚E ]5 E¢‹Yõf\LLË!ØÛø€a˜¦±ßYãŠ,䶇70æñ·˜Ð,NIJcŒ{† ·ÞÁ÷“žFµÁê~ ôÏ6Ø©fÉ·EøÚà4ƒ”®ÝĶ’*Ì¡ª-Uéø|NLÀ2 0b(9hfQZp4cû*„¢ jj¬”µéi¼þÓF ÓDUjV‘˜–’¼>Ž¥˜VÂsÉHo@i´Ç.ÕBQµDƒo­Å´’‡††™|†Ägs?Ë‘a({í§ÖlÛÕ4§¢@ºl6•åªÈôÙ‰ÅM@UÚ6ò‘â¶°²¨’ûfofa‘4“ w‡¦7 @Ç(Ç+ ³¹êáÇè—Ű,–Îyßû/eG %Íi±©"–ªÖñKÀ¤‹iáÉïÄø«Zsb$ÊïÝÆÄ_dôá]Èz,æ ó™$G5êÅq½œùÀ ôn>i6BßMç£-í™~ëU´sª=v—VÒ>€a`šq¬ät³efB€ŒX[£ž40¿$­ëqœÒ,JÔPÐ4 ]ð­i&Î7 , ËËÀ2â;ÙÊ0öu æïï+Rž€Gbo:‚Âèm,52ÉòyizB'¶ŽùÿðkHUb(¹‡’gÎaΧ+HËøš‰7/Æ™Þ#ák˜ ûZ¦…¥$òÚ²ÌíeÑŒ‡±ŸÌ¿Fý‡É§ŸýÚ“É ­eþüe ¾n2šebV­}“BšÈG«^Þªl”`§¹Š¾}zß0dè0BÁàA»*¯²²‚p$JnÃÜý]cýKÐ]À=²P4 ]×ÐYä§”S®6¡‰'FÞøËi»äižú¼šÑ“îå½²‡‚¹­Ø(Ä+¯¼C Ùn™tͽQJ7n%õÐaôÈÕˆF  9•~™y÷™|ôí:Üí†1ªr›väð9|ûÎëÌþl1ÑŒ6ôë^ˆU¼•”nÃè™gô┕Ý{};´gXÿæüüÁëüwÞ×üËbÐà´ÌrP¾¥Œ†½†Ð&]Å´¢”lª¢Yÿ¡´ðûY’TUeõª•¤§§“âóÕŸ(`ÅÆ*R]*yÙ¾]z–e‘îUùòçJJ". úÉJu‘•æÁcWhàŽ°`uˆOÖ¨ØÜ~l6•m”hוƒÏ©cZš®±èíÏÉ:úboå KTD§ÛKtë&ü-¡Ç‘GáXò2½øiGžÃÐ4'-¥QÕ2fϜş-$Úb4×]6žÆnSK%ÝÜLÓ^£èÛ¾!®ôLªJ<vü±´ÎÓÝš>…afNÆììœzí(Òõ&ô;¬-ñ-›Q {Ó¿©Ã2¨ÜZ‚§c?ºgš”ÚwëŒß®ÓvÄò*¿æ­YïñÕ²Rõ<Š¡]›`oEiÙƒþÍR0-“ªm¥¸Úö¢g®s§.–¦ª,üñ²23ÈO·íRE¡:`þ矇¿[´øÕä×Q ’üb;Õô«¯¼Üºýλ))ÞvP eYløe=•téÖm¿Ç<7ç_4‘5Ë—ŠuÆePuÆžxg_0¢! Õ†M#%3P ›]Dz$° ¢‘(ql.Z,Dxû-t»›–ˆ™`™q¢‘& j6ìv=±€Æˆ‰ÆÐœµ×c)Ø]N”hˆˆ šfÃfÓ›v,“X,JÜ›Ó Ñ‰Mj v§3"þš]×™ûÞ{´hÑœ†yù;º¬¦ÅÑ(ÃFvy»õ:tMáëU•\òÂVrrÑ­¹t¯Nùu¨Lþ Õé%Æ¿e¾µº:Èõ×ýs—BbN‡ƒP 2ùMŒèb'Žo—ÞºÄBAb;LþXÄ"áíßíP¡âQBñï`Ö¹,¢¡àçñèN÷©{XDvø¼$<-k³5ŽvgƒXÜ¢s—›GG™4óÒˆ2hœŠ×áô¶TÂwëªXøãzNèdrl·Œ„%®“'Û ²}ÎÐØ1ͱäÙf„xl×Ï_×NX1‚ÁO4¢a‚Ñ]Ý2D¼Î£Ä¡í÷©}žÄóEáÊGÝëb‘P½ò²c£'+ ÷E , k?»àõxö:3ñ·EU÷¡îÝ0 ÐÏCc5îo¯}´œŒ4Ò<6BQƒ¢â*œVWæá˜C‘ŽþÖù¾ƒj¸¨Oú_YÌßa–Pgjo_ö˜{¶eYDãqšúnábÑêR¯û…²J“l]aHk;ÝšûÉÏv…°Ùíhš&€6uø—÷¬äèºð{Â}pK-k¯blš&¦i‰ÆQQèÔ$…Žùn 3±BÓtPT‚á.—Ž.â¾£K×`o¹¤ü.k²…Ún‘õ+vîv,AQÐu¯×‹×ëÝëý± Ħ5Þ–t öXXT"ÑqÃþäï—É(ÉcWhºJ8I,Œ9€WD –¸‘X|¥*"»Äíö ‡©(+#ÍŸ.m~—tÛ–-躎ÃáÜ•FÐÀïfÃÆ J+Cd¥¹ÅºkfZ¬ÞX†Ûé$Õ¥ýf¿à/)©©©4hЀŋÅ¥9À¨ªŠÍn£qãÆø|©; Ð<×KY¥¿YK$Kº±ÂµÍNA£\ò3l¿y¬à/)š®QЬ)YÙYD"ѽnŽ~e¯°Ù츽^4]ÛÅ›Ž Õ¥qhaJÓ F D‹´@ŠS§Q† ‡®Ê›ŽvvKƒIš¦ãKM“ó‡t«åRÝiMÞvö{å35áÞ-”ߘËÑÁB)zlþ×ø ò^‚ÿ‡öÛË»D(A„@ADA€= ªª*ï–„ƒMU÷OjªþæME 1áàƒ}Ø­¹“TUUÎ9óô ªªŠ•˜ÞþdJX6, 4M«€í1N’<,êWì99úæ-[âIð$/àNNÉVA8(‰©ªª™¦‚@uòoÕoáÕde¯9\u`—ü„ƒSH, ¡:Gïj°ÐHº±¤0(I"ž¼‘táà#NmôâšÆFòØiŒ &ÒQ§?aÕ‰%'f²Ç’"KÖk °vçÔy«ÜÞ€ ¼BPãí×ü­ù·µ+7_­whIa¨ù,ÂÁGM£^#5ž¿¹;!PêüÝÕ¿A8xÅÀÚÕ¿ÿY”GV5I“yIEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_design_reports.png0000644000175000017500000006504012235000130025563 0ustar00murraycmurrayc00000000000000‰PNG  IHDR±oÄäõîsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ6 öir IDATxÚìwœUÅÙÇ¿sι}ïöÆÒ{i ‚J@=Q5Í’b÷ÕX“¼‰&1EcL4o41&£"v±÷‚ ¡H•¶lo·Ÿ2óþqï.»tÅù~>÷³{ï=wΙsž™ß<Ï4Ðh4F£Ñh4F£Ñh4šÿÑþŠ–™úvh4fÎ/ñV§— ¹W»FuÖö¦Ž<ëú(CÎô 7ÍMè[ªÑh4šýDrÅ€k º-¹Q¼ö÷Ÿ8¹Ïò x9jÿ«¬¥vbþÀþýßÔ;öø‹•çyBßWF£ùì"„ 㸠Ìv_dO¿åðY(¥º|l;„±—é€!–iB{:Bຒ½•Jâ÷dl7üòóæÊÊ¿ß((ïe´ÖmŒàæLäþî Nâȳ®Ïпÿ»GLž:4 «ÖxZ ˜F£Ñ|¬¡-ÃòE¯¡„±çIA£&Q^”G$äCJ…aZã6lÞÌÖ «Aì¹ú ;dÅy> #{^)%1‡å‹ßÂvì=_‹’tï3„ž=ª(Ì  ÔGk7Š÷Þ~ùÙ§ï¼òK@? ²Î/·‹')(5¬ág»‘¼-CƒÁj‰¥„¹ð£ñ »Ç¤·×*®ÑˆBo%%R›©æsNÆv©o˰èõ§˜qì ô©ÌCJ¹[û¯m±yæÉ¹Œ8ìXÊQD‚~šÛRT×5Ñ\»‘/Ï™E8°{¯NÁ‡«ªùð½79veA”‚úÖ4K½ÁÈQc5 ©Ôn½°DÆcþó/`ø‚(Y„’JD ŠT xÀ¬ìyŒ<¥¤dÚe¯Ý#ë"b‰Ö/¼îÁä¡ç\¨[ÛD»{ñ-¨ê71 ѵMuõÛ?ó¤Dt;3Úc›{©Ñ|fðhÜ´µ[ðõÎ!=ò0]C*Íç¨Aæ!X¶ðŽœ~%…Z’ÝGòÑp€‘å÷žfÚ¬SJ‘q%k—¼Áñ§| ‰$–Þ}™P(zu¯dæ-lݼŽâèP6oXEï>}éÝ£‚–”ÊI„@u Ñ) Ó09þH^}öaJfœˆ§$á€%5L5åÊÌ+Þ2¶»H¹— 8;íód6̨TV”2É8§Ì9ž@(’ý@uºŠí…LëdxðÕµ„#ÚÀ4°p† ²EGÒ£­©‰p¿~üíü£ixö .Ú8”É=}( #W´”B*‰Rí^›J¢!PíßF¶hJµ‡Ö¦F³oPJRà´ ˆíÈlpæh+II~!L •ÂË²È Y¤Ó6Õµ ¤ÒÎŽ‚¨À4=»•ƒäqå6ŸÅ0 ŠòH/[ö’©4›kÔ· …eÔ44ÓK0¸/×%`Y†(™7)••"€¯“x¹äF*Z;¿)Ù˜fûh¯æ=ö?õ~¿Ãaä ´Âóº÷éE¯â Ž(¥¶µÏøLƒw–n@J…Ìu*9‡D6BÖ²—ÃFôfHŸ .øÅcLÑ“SOœ@4àOó2nÔN^\Îë¸>Ð^°l²sÆÚçaíÊ=•9•Ž Ëºˆápˆp(„ÏgaÏõp<ƒÏg AeÞkOC£Ù¤Z›)ìÛ“oO­"N“.íÆIC#Xb†‡ë©.f™jkÆÐ+OD8“ascšÒ>}¹ö’ 7ܼ˜ÖÒ2Â~AÏ)ã8'™ÆµLž5‰‰³$©¸Ä)âÌ£»qå#8‘öv€³Fóéi˜ÑÉÙ»z·«Ð)<©èˆ¦£ðTÖûjjKò›¥0ÊFé”dò¨^ø}VVÄrÇ ±-ú&rÃ'¤T~RDxæ­8rL_þþãÓ‘R⸒oÿl.'~i*iÛÉ9\Ùt<¥{çP²Ëp¢ëå⪈NJk ú ý†ëº8ŽƒãØxžG^$B4…l,Ï“º8kö;‰L’1=*ˆ xö¯OñÛê§?oM(ÉÙw×N珞fxßîD…ä©{žäöšsfŽå»Sºñ­Ñ‹¸áãÜáõ+øþo–P4ùn™SDÓ›ïpþ¼­ÌúÞ©œß'J±[MÒ•„ mõšýK¶{'çª8Þ¶~Ü]yaJeûus^˜ÈypÛ<(…m{펽»W0qܤç‘ÊØxñºì¹\/;œ_d½/Of¥¨=ÛõP*;øã¡W1vpw„|&·Ü÷ ‡:–X<•í–&*÷[ÏÛÓÀ”=ˆ˜T Çõ:”Úmª)À4LÇAz^v"`Y¦iRVZF$/Ó´ð¤Äq=m]šý‹R8žK(|¸Õ¢ïbZ›ÛÈPÒQ@;Gø $Áà¶ãö¯$Þ#I%…AX›-O‰u Ä‹‹(M&"–­OS\î#Ùæ–!‰»Ÿ1Í~Æg9)$3ñxœ ›·²³QöB@eY1åå¥X¦Õ°³¿/ûÞó$‰ŒÝ…s¥$‘Î ¥$“qˆl:iÛÁËu=Fv‚s»  ²ßK›k›˜:ª;¡ HÈ”’3Ãí,äQC±36~ #,™qܬ†íEAÚEŸX6œhtòÌ”TØvŸ•íëœáÙ³¡´´”T2É» ÞÆ0JtŸ˜æ€ˆÂ"–HL(¹fYG:´#¨¾}¨EIƒX,{üу$×,ÛÌ!Ã&–¯O€Y˜û™èÔ8TxP]çƒfCñú1h9;”RÒÒ–àä#2²·êáÖxšÛ^Dii ˜bȎѹŠöHZVG¶l­#ÖË99’)£ûYÏË̼0²ýj"÷?<©HglòŒ$§Ï8”HÈÏ7~üSéÃ9Çç¿3Ë÷,ÆŽê¸Na¤Ü»~½]Š˜RYÁ’b[Ÿ˜@à¸~Ÿ@À‡iš†ÂáBzöêΠ±­(®Ê…!u‰Öì_‚Vˆ¯¯¦zx>¿v/ÙžÕìï°Éö•D†ŸVodÒ aLüúI<—q±²a Z¤°LuZq´}¦KNÐrÙÙesJJ”Ð]ÁšýÞzCˆö° Ê† ¥Â“r[ô¤j¾ÞᙉvÇ%'Ùêíc!w_wJ—ªÜ4 þøð[ø}ªcRuç¹–í” é)Œ\ƒï;7=Ê¡Ʋ¦ºŽùï|Ä¡ÃzfG#z+·žF×9›{2kw ÚöB¯rÃ0‡ ÁÁC³Å¸}‰,CP- ¡©‘¥~ˆ(Ã)‹4 ¤¶-Í~ljи¥šß=’fÚÀ|â ÍȲîœ2¡±˜‹/$ÝÒÊ«‹7l QV”jjæw,æˆAÅ”!ÙÚÆk‹›0ûVbƼ»x#¡ÈGP©F^]ša­ã#ŽÛ´ž·í Ó¹9.ÍþuÃr#åñ”$ ñÈkkxèÕÕ;) ¼¤×ó@ø;>TRuñ~Ï£¬´˜«ï|ygÓÄð[}ó³¢(¹éVtxv+¦eÒ– òýß<èáCHel*ËKxyÉVym5cFÀ¶müNÄRf×cTÿ©ˆµ@i§où¼ùækí4Ét¢Æúbª”LÁ($¾Ü²SÍþGfÒÅÅL¡º¦-fúðn˜N5s7FèÙ7B&ã±W>ÆÌ/§*O )ÆI%yiá\ †å§ ¬‚¨2/Ä ¯¬CF ©*öã¤ÛøÇó-DŠ‹(.5Il¬æžU%%ùQxZÁ4Âî=—XÚCJE(fà€¾»öÛTÖK‹§\\Çé”aÛ¶IÙ×u©ªª¢jwç”O*)‡ßßɃRÄ3.~Káz’p(ÄÈaƒps!JÏ“TV”QYQN*AHe<쌛o&÷JÀvã‰uís嬒Åд›Òiô†üܶ/ÚÓÐÀŠ"•rÈïÙ›™‡f{š6®ã¦GWÓVÕ|åA0LY0œµï\ØÄ „( „¶+€á£¤¼4Š‘þ<*+¶b´ˆnÑÜ{GÔ{Ogl&y /ΟGïáSˆF‚¨ÝuÎ H¥=V½ÿ3fŸL"•F¡HfŸ:“W^œOÿáã±Ì=سÔÕ6à$›)6ŒÖx! {ï,^ðÁ(-)BJðh½·‹n»O'p]ÉÒ÷_fÚÌÙ$; (ÙÛ¹'– ‰HÑ).)|{s7ug€æÀV¬¥^ŒÛï|Š'lÀ -¦w¯*¢¾m±~æ`Á–.±DŠ™sNå¹Çÿ‰iZ»®ë0ãK'“θ¤l´%Rä…ò2dK>i˜{L' 1yúq46·t”­¶x’ GLçµ§nmfixÒcô¸Ã1}!Ú©ŽÕGöfÝùDL"0 #«[Bï¢ùœ Y0ŸþC °-~‚”¹y1Ú¬5!Žë‘J¥˜õå3ö¶”J§HÛNÇ€¤ÒÊ*{0넾{ç *Ek,Nv¥BѱˆÅãLqü^ëˆí8´´%:®²ƒJ¤ŸLÄʬf^xóC2éÔ^O6Óh4ÍGu}»× ¾ˆÌ'%;]$Xý—×b˜~zçÅ>™ˆUF7^5ºÚZí‰i4æ€`õuµüñwéO&bAÈo’òiÓh4ÍA‰€µG_ÎзJ£Ñh4Ÿ[MßF£ÑhÓh4F‹˜F£Ñh4ZÄ4F£EL£Ñh4-bF£ÑhÓh4æó!bJ¡˜þ áH„ •ݤSíâX„I0’G$àËm$£Ñh4-b{¯9V€ü¢bŠŠŠr¯BòóBX⓯ɅXV†·ïþg|ù8~8¿‰ ßØù²ŽÂÀnùëNœÉé7=BCZvÙN^)ðG‹).Œȉ¡F£Ñh´ˆuÒÉÇ/ÞÉá! ‹‹),*¢°¬N½‘Evvëé½—ÄìE›¿Î¼ç^âÅ5),sWËa d¦ž·æ¿ÁS V“v»fÕ +þ9=„¨šÎŸ^n@zY-F£ùòò ³kGn·‰›F£ÑhrO¬èï¼÷>ÏÿùZ,]Jƒ4ñZÖrßO¾Á„a#9j4ÇOáûwl&s×µb´ËÎÖ·¸öôI 5Šác¿Ì_ßYÌ_žÄµËAd–sóùÓ9r:O4exï¯?ä˜1#1j4#†âÔ«îbY½­L£Ñh¾°"fÕwsüìY|íš;YE1§_ÿUª¼$ žø Wßõ2ã®ý Þy™ŸŸ[Å£?½”»—6â3}älü˜îgÿ’‡þõ —MËGøÂ€hÀÀr¶ð×_ýˆÛžøÒ~ăóáî__ÊàB‡ïäü{%¥§ÿŒ;o<r9¿ÿ×޹õŸ|¿7(_?¾}ýÝ<òØL¨¾‡ó®újæ<ûæÿí ,¼ÿ'Üò¯×IJ-bFóYÆÚg) ¹žïÔ“nmàµ7V’üZÖ,~xõWçsÔ­7“àá…u\Ò+Äcô™\õÍÓè_èò’¬ê´¥¼Û°ž…k>zqý//bN…$s„‡v]®'mìé\zöéT%óùÃgem’’áVÔD0êŽ>º'«ÿø6ÆÓ·sò / (ÞZ¶’¸=pP‰F£Ñ|ñDÌú]Ïڵב¿æN9ù$ž|äjî¹j6VöÔSÏ:ŸÉÝ#(ÀŽ')[Š'·¢_E!ËØÅB‘ÝI…ã*„Ⱦk1¢_I”€)Àð¤";t²=9!„È:£C§Ïq‡Á‡B:6Á!‡1uŸ˜F£Ñ|1EÌZóà}÷áÛ´€uuG$dИ鹟j§”q‡Ç—ªgñKïÓ½2ÔI´v-Vi?&£‹>à¦+~NøÌá´­ÛÂÓ¾Î!¹Ÿí(~ ¥LÂÅ@¦–E¯?ÆãâÆM:“¾,¡:`ИIt÷§X·øCdØÄ² ôL3F£ù‚‰˜t2´y@ã<¾ö¼ì‡œrݯ9­»EhÎeüjM ?¾í:¾|_öëHéÜùM’1À‰¥ÈIÆÉ±´ÄõUòõ«o¢Ù¾ž[¾…o? Ð;fÁ˜¨K pãi¤¥Ú7žÂ± Æ]p!•/ÿ‘‡nûúÝñ¼QswÞºžËo¼‹oòìM)Ê•·MCol­Ñh4Ÿmv¨¦¯¾ò uó/o¡±¡ñÕâÙp\2•ÆëäÄÓ" ã7EÇ1©tW*Óò 0ðHÆâ¸VˆhØ!raÃT’”íb„¢äù³’k§I§m<°EÂX]~@(—D,Ž×ñÞ!™HâJPÂG4?Œ!]Ò©¶+aùX¦¡ƒ‰Fs ÄÉ0¨«©áW·ü²åϹ÷”ÜÇq -÷7$ö'&0|ò|=Ùé1‘‚ÂŽ÷…"øB]?³ü!òü¡Ýÿ^Xäuyï#-èúÃ"‰Òv£Ñh4Ÿ+¬ýy2¥–Ï—`¡Ñh4š/ˆ[%ž‡”ò?Œð}FDÌ4MÞ|íUÇþÔ3¢Ñh4šÏ.ÃFŒ¤¸¸äóí‰ Ã ©±¯û-lÛÖOU£Ñhv' X½ú#±øç_IJ^eÖSJê§«Ñh4½ŠåV}ßGÁ7½)¦æsP„?k4ŸS Ãd_ηµTÆöEŸæà$‘HI§).)Ñ{Ài4Ÿ«¨ÁêU+°|>Û9¸DLPÔì-®c“ɤ³ í…Ý(†Ï‡_H2Ž÷‰LÒ 1Ý4=Ù]£ù¯ELÑÚÒBiYÅÁç‰)¥²’™IÒP×€(ª¢<Ï—­¸âÔ$t/ÏÓ‚÷§]¸”RH)s! ƒ†êjâvvËÃ()³ëf†ƒl¼÷Z.Ü4›÷n;a'ijËPPTˆoWta ÇùeÿÏ]³…—Î-"™öôÍ×hþ+Û÷-Á'bþoxûŸ;çb6Ÿr7›8“°l¾ûÛ ûÛ±´üû»ømðXƶ•:lÇC!ðG"˜Ž >?;•Bš‚~ ”C:•É­"0ý‚> PxN†Œíê•?"–û+;ýï…¹ç†xzÝ:d¢‘EK×ÒgÄXÊó|õ?œK/ºŒÛDh^þ4g^ó"¿ä¯R"I%Ò`ù€’6™´‹Tà‹ùr,}ë5šÿ ¹6°CI™[U^°(Ñ‚G®ç¦w3,áü(…]»‚»þç,¦N>œ)Ó¿ÂóWãù|XfýÖ‰Üxÿ\~pÂd¦œx9/ÖÃÆ~Í GNàKÜÉFib(ðaõ£?çäi™tÔ Üôè\•kåë×gÿ… ·&(E*ãâßßÎSO<ÁÜ?ßÌ´¡Gð³?=È“O>Îýw\K·õ¯ñÄ‚H¯'o¾†…ïÏçìc&0éØÿek0DÛ²§¹ä”é~Ädνñ~6e|Û (mú¥_ŸZÙ=X=1թ™²ÙÜqù+œqþ/¸hÙM9u•()IµÄñ÷šÊ 'Á]ý$7\}‘âÇ9g|šåÏ>ÆÝ‹ ~ý“|ßw8aòrN<‚oÞp%]p'ß4‰¥7`íß.ãØ›·pÝ/Áhù>W^qʇøÁ˜2tÐèóNìÜ'fZ>L ¤ß‡a˜X>?ÃR´®^ÄKËŒãèï]ÍÄÔ»\÷ÛŸ1¬$ˆ¹òy¾ÿÝÓíŒëùÍøó~õC.û™É½¿˜••1%w8—F£ùOËî¾ )x#[Y¸ɰKþÈiÃæ~—Zä„<¿ÿ(N*ïICs9ö$N™ü .ü7ö¸žà39êÜŸóÍ9aØÅüjÀOuÍSœ8ÂbâµwÐ÷WÏÑôãbîüûBf^y3Ç (Á³fpÞÿâæ§×pɸ2\OWVŸ Cít‹™œm/Ùá¼)¾`Ÿå'’—O4"Xüì£l­:†K§'ŠËqgžÅ~• Ós G…’ZÄ4šO¯ž?EÌó¼ÜüŸìp{¤MJŒæêŸÇ鿾‰%³  OºÔ|ø×Þø{6Ë Ã&WlaÒà®'f€Ò>…8©4X„ºÓ·È#•RX…Dº…D[# ézÿõç\:7€R`úʘzXŽçáiûlÇÕ¥ê°Ïóvò½ìQ{ž"+lH‰”2'HRzxRÐV³„•ïÆùß®ÀT ! úL8ž<ÃË eîwž§'äk4ÿµˆíã±LÄ\×í¹âz¥$N*FÕÑWrôýçðÀ³WŽ›IðöÓö5þvýרºÜwétÞL;8®‹Dá96Žë€ãâ)…ë88Žãx($Ò öü ºàV>£)[bú™6š“ŽJýÇó\@à¹.®ëîÄ–<”Rx®ƒ›³ ד(éá¸nÎTNä¾Hº:œ»þv e¦ƒ0-,åa{õY¯Îsq×Õ"¦Ñü7!öùvVHÄÔáĬjKŒ`':“s.ø™‘ … É£v] L‹ºEwñë{V2å3ÛŸ–ý!J*@!r1ÈlX PàzóÓÆpä…_ãGÁßsƈ KžžËÚgpÞØ2´#öÙoÍ !vÙOÕ>’°=ܸ½m"QTízÖlª¡g ˆ‡LÑ-qÅoqí©£h[ùoÔåqÆéGd-H)Ý'¦Ñ|N8 "–ôÈŽp¢ðG(/+À 15u³fÎc®B)‹É§þ€™ ¾Ï£î |ÐL¾tÉ©R”wGÚCJ!Ê»—)Jè^Ef$ƒ¿y+Ïø~Êe—ÍæW1?UÃfpÍá>¤Tûe¨æ¿1£ë<±.˜JËK ˜¹¹b¬¼"* C ù}Çröì®;m"‰ü¯òÒ‡·ò§{c\õ?W1í7q‚åÃ8÷ª ©èNIH ¥ì˜w¦Ñhþ3 c߀ß;;ïÓ²xrÞ\Î<ûÔÖlíHß°DB&‰x©Ã"ÉÃOŠæX&»ie8BÀHÏÁõÊK“ÊHBùùˆd+IWð“_ ÕÚ†£_”ÂKkk % ¬@ˆH(€!ÒsH%’ØÚ ûÌ“L&0L“h^ÇÙqéaúˆDd œÜó4ƒa"†C[ÒaàF-„ÌÐÚš+@8Âg ”ôȤ’¤l@~¾t+1[é]½5šOAÄÖ­]MIi9‰XŒž½{ï½8¸÷¾uÝŽç¤ië\7yñ¶æ.’;«àZ;§2´6g¶½·c4·ïø¢$N:AK:¡-ëóè‰Á®Ã‰®M¬µëÖ>n*AkÇ™d™Î䤉µ¦wH+ÝÚLû§ºy£ÑüwHyŽNl íWSsˆ˜Üù<1Fó™—±ŽFèA%b…L£Ù¡p€L&£o†Fó9£Oßþ|¼~áPø`1a˜¦©·bÑh4šƒ!¦iî³ðü~1DZyáÙ§IgÒúéj4Í€d"Á°#óù|̘5{§£Ì4Fsðyb«W­ÄNï›î€Ö'æóùôÓÕh4š/¦a²¯67ÒÃ5Fó¹åà±ö%¦:Þ¸ ÕnÞi>ÿvÖõ­úÂä{ûò¥Ñhû4!RÜÚ8N{¨qÏ‹Nn7ßèÓ=¡<þýôo9ûú¿ÐdëÑ—û®RÝîùíD`Ô^§µÝûÝØ™²×píœÜ»ÂÛ6ºö³ÒˆÚW×!B4ð«SŽá²·Úô¨b±]µl÷¦•«¶¯t:ᦓ¤]ö\™ ‚WÎìE÷o¼ÕIôÔÞUt»ûN(Ï!c;ÚÛ§ÁÛç £ìŒ—rÏ/ÎK?;‘^ÃNã±j' ™]j_ÿ?νðv¶º Äž½£¶u+xe5V0HëŠg¸æºß²¢Qªçþÿ9ýù%üUý𭸋‹¯¼›`óÃ×sæå÷Sgúøè©˜¿lƒŽ.h´'¶w «l0'žúuŽ›P@|˜Ík<βØIL8û*~œ[_ñÜé>&œù0k.™@Ó‹ÿdYÏ“¹÷GçQH ¦™a‘—&4ìB~rÙ`ëÇÊ?VzÜ<ÊÜ{U÷2çÊ›8.§@sú~oÞ÷—L>Ó‚²Éßç‚“ÆCxóo'qÿò4g®|Œ-ƒOáÏWœO™•¢2ö.¿lð´uíkËñ…I=w!7=ž»æÞÈØh6 ¶fÁ#|P0»®½”ÞaQ¥—sÃ#ó8súÙXƒf~¯Íés*yöÞ3y²î:ŽЛüàX¾4{6& d.›0+{¢ÌTRÿ˜Eëëé? 6=ó[fÿõ.~àNï\—DˆÆÌczë¸üœW9æÏrÕPp6e+§qóüzæVÞ©#0 ª8ê„orÒ±ÝQG fÝœ“yøÝsèëSÇ}«Ïž‰P«¹äŠ—8ä§Ïò£cË 5޵ÓÎçÖÅð‹ »Û@WQ4f—Œ;&ûÖž‰{Å5¼·º†¡VA7¦}ùÛœ4« ŽðÜôŸ³°ážÿã«LüÅÜ0½ ú°à¹WµÑi´'¶3‚E…—E³!"a#EZ–×8„Aƒ‡2|ÖÏøxíjšmÚÍ3xÈ@ Ã&3»“žA¯ICs©Ó;Ï¡.öÉÖgTvÿül&ŒÆÐaÃ9êŠwP™z2”gR9²WîÈ(a›Ú6‡¦­èׯ?ùA°tr¥xºÕº¯½0ÏÁt}’ xà‘÷H)(š·|Deïþ”æ „0éÖw,fk m¶ÂOåàª\ …T„’4Äw€ÄÚ¸üôi 2”ácfñÇy+‰å&èÛ[?ä'ÿû'Þr§÷ì¼ÿªi-ëíþrê! >ŒaÃFó£ÅM˜M­;êÏ‹RÕ¯"+iþrôñQ³®Ç3èuØ ìµ5¯cU¼„9ãK²? âðžŠÅË[:7wÝPL®…«Î8ŠaC†2ìéÜöÐ âNvò©/¡¬GqîbŠ)ò§h©YÏšx ³ÇæÎW:”¡Åe:º Ñ"¶«–bçÿ•°&ß㢠ïcì-/²ê£,{ë&zûA¡M±b‡ÂÛµS^¡Øc©]oA|Õ½üzžÇm¯-gÅòe,ºãpRIw'‚¤PdCC¾`„LÇ $ÏM ×#ÙH›`ÿ3¹ç¯³â®+ùéƒf÷ EI$SÙg&žÝŒkúñ™ÛßÉ öí¦ ²B6ð÷Ûþ@ÃäëX¼rË–¿ÍÅs*ð¼lƒÈWÒ¯ž>‘ù¿¿Wª½NýQ Ѿ3C ŒˆpÉ‹ËX¶l9Ë—/céÒåù! OAå”søí¥‡q﷦зïPÎüÉÃÔ:&Ò±;vö…ggº…Þ¾¨*Aíç2tàpF͈A=¹²æ«\yäFŽëןQSIÑ©S ¦Ó(Às2]v‚vmG”N9‹Ë§§9côÆL:—e•³¨$£ ü¾næ¸6vî—O:Ÿ'þv .ŸÆ åg—Oä_=”£Žã½çñ“‹ÁÄÛÁ&\;ƒíBå _azüÏŒèÕ“£Îú'\ñ]Òw}…Ãáœ[ß§Û„ˆœ¨¸™4)füywóÀ7b\<ç[¼Õ /¿œá¯ŸKi·a\ò»·˜ñëÇøí”õ\xD_ªúã‚?¼ØÉjk¡Šnô¬à¤Q½™|Å»œñû¿1³lÛÆîèZ sÊí碼‡9ªO/¦^ñß¼ã7Ì*3³`çÛÖñWNgÄð‘Œ=š±s¾‰öy˜ÿ8—ÃGó•Ÿ¿C·ICžJáÚ6Ûœ2…“Ér,NºýOœ¸þ‡ôé7œ“ïxŸÒ¼r\½{’æ3הݎ«¯¼BÝüË[hl¨ÿÔ'5š–Å“óærÖ9ßlW¬.Cß•Rι«®j…R‚Ý]šÊň>ÕËït9Û§¿‹ü»Éƒæ¿{Ùp\»­´ÏƒÚ½½vµ›®ÏP¡ŸøImo¯;¤±‹ÇßåwÎþ瘯3øÎ·ùÖà.YÜîZ³¡Ñ=Nâÿ„vßùÛ§¢vOºæ[£Ù3«V® ™LЫwŸ½'஦†_ÝòË–?ÿåÞSrǶÜß88àóĺ¾{ Üs!íœN¦öþöwɬŽ]£€I3g3a@ñÞW\bW×Én®Gô}e7‚]?½±›ímMüG—±‡4ÄÞüN’I&He<ÀÜ©Míµ`ˆOžÁ'¿'ZÀ4Ÿ%¬ƒ=ƒF°˜¾àøÌަ'"çùõÓ×xÌ|÷ö?î«gÇk4ZÄvöð bÆñƒvuèV¥æÀ(Ê3øÐ‰öúŸxS±ƒ±ç¸£¶Í4Ðÿ ,ªÑ„uñçIÄ<©X¹ÕÆs2úÉj4Í ±Vט¦$´o„l¿‹˜ã)žÿ°!õÄIF£9øE ŒXœ©ƒÃ‡ˆb‡…24Fs پ ˜T !÷Á¬IJ|6¶ïbû{ZûM_ôž›Ïòx :3q–¿ý•/mãûBÀÆ>Ü Ü:0•€âÓ^ÎB*AYUE±8«b c/¬Py¿ùé^K( [P±±ÉÆUû¢@ JJCä§3¬{»,pR*<¹mb°i ž§²ëŠOr zöc4$ø8-QLóÀޤSžÂAt/ ¯ÓdwÓÌ®ézêÛ§T}zEpjclN+$à3´œ}*›}¸|ѱNKÂ}ZwÉóÝû1lC‚å-²c±×]/=¨RÁ¡ª…'>²1>Å—æ2IuSG}ú…ÀSPÕ=Ÿ¾M¬ms1vp ®2é×§€1=‚Q$ãiÞ_ÕÊ–ŒÁ˜Q´¬mâãäÞ®¼ p=ÁÀAEø’ 6›!&v·X²6Nüí8#=Eé 2Ž0ÛxlE¥‘ÊbNdñþâzÖ&ÙÉ}ÙT0ÆŸá• »[.L02°†XœÚ´ÊC!=A¡e ikâ¹jk¿V~Yû¯è]È„ú4ÿnövQù*PCGWØÚȇõÞ§4jLáJ“~ý É_™dMBâûÔ\U…?`L?Íõ)RRt±ñ!ƒŠUéǧ±¶$ï­l£Éð3©_ˆµk[i´÷þ<Ž41¼ˆ¶æMyQ+ðxs}jŸ4D¿h*vЉ˜§Ô6÷R©më&vxŸÙ–´Ê}×¾1D×eƒ:'¥Âó®T8žÌ.1d€)Ä. =øóƒôW*Lc[«ZÊìMÏz0`Ùl÷j©è’¾R )³áO*¤§r[Þ¶÷D¥Ú–ŸŽ÷FVàU§ÊÕ0ØVQÊìg®ìœ¾Ú΃žƒ‹™ÝÛàÍ¥lµ•a }‚)(,’ÛËÌfFî$¿íç”J᪬Wgæ.´,ê)q¼ÎÇïG’ ^V ×UäWrÆøËT³:‘]KÐÉ=Ç=ÃÎ÷fÐGeÐÁq%J³¿ÜsÎ-&oˆ¬yJ!•BÉl‹]y 4@eFq%XCˆì÷¹0›!ØiƒCÊ®Op×ößu©­®öŸ½'®R¸žDI±Ý³l¯LùE!BÙãÛÝWJí˜ßÎv·“ëëj2k÷í/£kþhÿRx9ÛGeï]Gyêt½ó·ÍÖ·Ù»ç [Á±Å/,m¤Iô¨ QlAƒ”äûÙ $¶›]çXåÒÚÁÆsiväÁËÚ¹ð›T„Áõ$Ž:06~9bˆƒ*œ¨²‹üÊ\Ÿ˜rü” TSšÂ’á°èƒZÞ©v(ê_Îñà ìTŠ7ÕóïVa˜ôî[‘"ä[hŠóô¢&”‚@4œi… /2غ¦–¹Ë“;ݥݠU®"Ríe˜ Ý)Ý|øLh®keþâf¶¦‡Îèá--¬Ï‹2°À ~}=.O`&C‡–3µO#c³±ÉA¹^¶Ðí b‚’ªB¾T%˜·¸‰¸'¨ìQÄ´2É£‹c6«}jZˆæQ†WÖðôš 2àçðñåŒ+³H´¤i6 TƒB*¹ƒW+…EB[WÖ³`sÓ€-õ ” :¼£‹ ì)}8J&ù×óõŒªâ¨ªl~[ZynQ35˜¡ÇVÎÐIFø8öØžÔÅ0ŠÃû%+–ÖðÒF qô„rF4Ö%I)Õ5]e8éKÝØøÚzÆ qæ¬2Î߈1®Óì8«C†š´V7òè’8I}ú•2}P!ÏamuåmHÏ0é_l²véVmuñ‚͵q£§T2°zÕåÄyðå&zÒÃÊ-,CQ[ÝÂóKZivÁ0çÐ2ú‡6Æñ‚„ßdôÀ"*ó$ßéVD¢­…‡Þh&©…ì?$·“¹8XDl»p¢R á3H4´0÷j¢ÝË9eh«këH·Æxò•zjSŠò¾|md”5¯µ¬ÈgZ/‹wÞÝ̪V¼°Œ Êü¼øöF^2ó8ë¨2F®ÛÀ»I°ÄöñïmqÚl+Tt¸1[>®çžÅ˜ŒÛƒ£¥øÇâ4Ž£ð¼²žyFßøR£Ö'XÍçÐ2Å3/o`³çcêÄ**Z2­¿C™ Ûmof=HÛ˶4]„aóäóëHF‹8f9ý>Þ„;°„$øû³-¤óò8aRyÖÈy]ï¯ÇÆú #úq¤/IcÜ¡¶)MSF²æÍ¼?µ’­ïmdq+ý&é üåÃ4qe2bLf Isïû&L© gsw¾’ ܽ˜¯ô4h•’¥‹ëè7$Àü÷êitŸ@|úÝœ{ *©0£ùÌmññ’Þªq0… Z”Çä^>Þ|sk’ãÇT2e Ã£&q\0|.ó_\Gk¸ f•ÓgýÞ^ÓFI8Á=‹ã(C—ïç÷6óxÜ%På„ÑtoȰ.‘óîRFÏT3,h¥Ù5ðWå3¹~ Xiã3-ÆÞAñ&îy2NÊâ¸iLjHñ|ƒÜfJ¡8‰8½[ƒYVÊÙ‡•òÑ–jšã æ¿ÞLmRRÔ£„3‡æ³úFœüÓ†Y±x K\‚a†*E•A^{{3¯yANVÊèuq^oUÎשñÖ驌͂E[x2æàæqܘz7¤ù¨ ¤7•`î35ˆÒRÎTJåæÊF—Ó?ÑÌÿ½Ç*/äôÊ(éö²Õé99ŽÄ•ÛúÂmG"•ÂsÁbƒ¿¼'¼ _™YÁè¼8‹T„I½ý¼ýæF–' ÐÞĺ–'ÏeM­Íô¡%L‰¤iŽÛÔ4¥iq+VÓkLï½·•)A(hâ­®åÃlÓÏ¡ãº1©wŠÇWyL9¬‚ü-5ܾ\¶$ OX4Âx­qÖ¶¸H`ùêV 2i_YÀ­¨#^¡oi€aUpxóíZV“}>+kãÒ“X‘NYNÄ+`Ò’ña… Û¼øQœ”|¼®•­ÃÃAv”)²ÏR?¨úÄöaêÖÈNÚq0”›m®”ضKÆQ(ËÅ“’¤c2sF%¥ªy`aŠ„¿€ïÍÌÃs²•UÚu±]7'®kà*Ȥ2®‹P`+®CÚµÝp)ÏQØiÛÅT¡¾H³ÇDY¶p Ô;„*«8uØŽ‡«À±ÛÓW8*Û"t•"e»dWÒ¶ƒíI2ŽCFîèCg<OÒñ½íyH)É´Ÿ#ã’v%`àÒóE,ͳ”)×Ãó²çÜi¾·ØlÚ ƒ£ª8ixE¯¦ð¸ŽKÚQøBùÌ—Ϫ…[x¼Î&PÑ3†dû %iI»Ø.xRô$†ë’‘Ùëµ—Ìš³î9 [ œ†ZªÎç+‡–S÷r5R Wí¸¤m[2¶‡§ l×ÅQ 'ãq²½1 \‡Œ'‘9[ð01¬„ áóÞ¬¥Á59zBÒóÈ8ÛU¸Â ÄçÑf{(®›íƒ“žKÚq–Äoº¼òê–¤éhDµ÷‘ed®Z4L\©°m‡Œ£0¤‡§iG0eRýëø×+ ÚÌß8ºÏqqØn6™\™ë \¥°Ó¶›-[¶T຤™ë£R(eâ*ð\´ãb©CG”pXA†Çߪ£Þ1˜<¶åy¤l?›m;¤…¡Ü\ÿ¨‡P’Ö´‹ídû½’žGÔuÉØ¹ó)…2\\ÀuÒŽ@( 8Ž‹ 7“µaÊ•Wǯ°/[¦ HgråÄqÉxŒÝõX·1ÃúM ¥Á!GôæØ~–/rñ”Âq]2¶"ZRÌ1C,XXÍÊf‡²ÞÝ9²øÿÛ»ï8;êBÿÿ¯ÏÌœ²½¤n*)¤„„ÞC‘^DÅ‚(¨è׋WÑûSÁ†‚Þk»zE.‚ WPADP~EHh @€¾Ù¾{Ê”Ïç÷Ç9»ÙÍn x³%ïçã1Ížœ™ÏÌ9óžO™™Òöñ]R*†Ø†ôXGÅ“—$£˜Péõ'ÃÖû†\r\jÛ¶Ú¸]o[z¹‰Í¥SLÌDüýÙNZò ÙÚ4U>Xkiï.2¦>KuPz¯g ¦/íûu÷õyÙòòúMΖ;yWnµu•Y¼\ËÖæé‰õc²¤Ë}x®·#¸| *5çYºº‹ÔV§H™R§ummØ~å8…Q‚Iyø8 UU*Li=ûjƒÖ–úé¸(bsÞ1¹ÞÇ%ø4V¦ð\©Olð2é”G6è=pY qiX½ÁöÕX\bñ*²¤ =<µ&GOè¨]AÚY’|‘ QÀî qlñ*2ŒI{僰+W‡.ßΘœë½ÎвjÅ:þ´Öã¬CÇ0! jj3Ô¦KgÏ Y(†ä£-LµÎö5)»ò Ï3à,ÖFUz<»ª“µÝÎ÷©«0®ô¹!¹çïëØ<~gÏÍâ—×)¶å‡%[‹-y¥à±×Ä.Iˆb |7p?Ù¾}¾åsë¸ `BEÂ#Ïv²)ŸªJS68géîÊSYSAcÖ”Ÿí¾±å¦¶-N\߉-ËÛòì5×7xÇx•+_êbMWDâyÔÕ–ÊÛ>¥¾ìÒ6µ…¡ÇÌ$±˜LšÑàòœÃÚ„ž²C[ÒÕYü-—~8l_Ù{—“ï*dÓTŽ8qTÕUR].×–ï¯#›öÈ”&9gÉE¥Ë>èýn—ÿ&]‘¦ÐÞÃsób¨!åIOž Išõ†8¶5YÆ¥cLR~Â7îûŒ¿u¦·àèÄÞÀê­¢¾‡Ç–/p*ðð 9–¬w¼Ï8jÛ곤|0Ö²fm/LÏIû7±±;!p.oÇó=ÒÆõÍ?ð=RfË|õËy†Lã(NÚ¯Ïã6¿ÜÉ:;†#ŽfSì3e´ÁF¥Qf^Pš_ÿùXÖmè`ó¤11ßЦLHã·”¾Cí¼ŽöëÌ8ÏÍÆL˜!èÈáøG`èÕ˜ Æ8Z[ „Óê8~a†M=¬^Ÿçð™£X\[ÄTf™XmXãJŸ› å“.öpÓÝë8íˆ œ•ÚÄ-·³vmŽôc9ÙÏóÒúî{¬…3ökâ¬ú<-!TUy¼üøzþÞiôQùA鄯õûüûaÇ×%¸×X*Zbªê*©-÷=¶mîàÉî&ŽÞ¿‰ 1¾±,{®z?ÿ¶ÔÔê{åÏò¥ IDAT«u[Z"\iäݬc1£JgÇq˜ÐÞQ`´FW ›eJµ¡¥ü] úÖ¯ô÷)ß#e Ü÷tï7žcjs„™ £+6ö~ûvTÈ3/8jþxì†"éšJ2”Z=Œï‘.,6½ëëA{k/›8lÏ1¬ë±ŒŸÁ³Ñ€ïSLÀž{ŒejÖ H§™Z—pߣ=ä"Ÿ–(à€ùã˜ÑcÉË]äfŽâðŽ0£Á`[ ~Ôߟìá´½šHÖðª+ÉÀ8:Ú äg5pÌž­Ý=<ò\7¡î2ô¦lPÜéOvþÍ¿auõáøÄ¥ð<Æ4¤éi/Г”FŽ­OÑÙ–§¤™<*CK{wBE¥aÓ¦9©LЦ† >D…um!Ù†JªóyÖäJça£FWîʱ¾È &7ç ¢¾’‰^ß0cŒ!×ÒMKabMILK—£2kYßQ=º’š!æ¿®••&Ô¥0ÎÒ“/576wE$Û”­*½ß³ = žq4wÅÔ® è̱©XÚ=cÆV`Ûzh µõ4UùÄQLÞù y‹¢Ï1“I1ª¦töŽsäsEÖwÄ$@:›fBCšŒIxy]ª³L¨ 0IÌæ.Gu…eCKH„GCcc+ ù\Dœ HÚslŒ µ5ÆÕx6âÅõ¢ü‘Þý7Þy±-)uû)¦ŒÍ’tæhŽ}š3d=GwW11c*Iwõ°¡PÚ¾cÇVàÚzØûŒiÈ2ªÂ#,y¥5aô¨ j(†1¡5ä{ŠtF0zT–°#OGèð+³L­5lÜœ§Û4ÎRŸ‚Ž®ë;b*j*_6#6¶ÉÙþ_<ÃèÑY¢ö<í1ã1vT†\kŽ.¯ôù¯0–Î\B:mØÜR gÁOŒoÈPâ0bCk¯¶‚ú°À+=¥g2×7f©ÈåYWèÿù7Ô®btªß“£˦¶™Ú êJMû ò!!Œ]AÜ‘£-,¯ßè ù¶í‘¡¡±’q•†b>&ô=lg Å70¾OÓ¨ ª|GG{S•¢«%©« !,°º|ID]cU¹k Žt6Å„† ),ÝÝ&0´t„Dýú§²iFW§¨L•>ã=ÝÖw&X•UYšjb^Z_ ][Á¸*Ç´õ8ÒABsGDŒÇèÑ•ŒÊ@Ow„Í„­9šcèú,£+}’(dõ¦"‰ž2ðOË×sÊÞ ŒŸ8eûÃi;Ÿìü†„ØËU‹ûB¬sÿǤ³eðÃÀA ýï¾>x>¥÷%C s÷¼mŒø,_¿²õû{¯çÚz=û~ïöI©y3±Cœ”ïœaÜÖÿóÚË8§wnˆ¦Ü4æÍëm×·Ýz;»Á;`к¼aq¥Žþþ‹ß²½ú>^_øÚÛ·ß¾ØVÙÍ–kéJ¿n½½^}ƒFnm×>¸­·Þ®|Ϥm•õUGŠ õ¹²¼¯¾~ÛzZÿíRºhÜôÝãièõ}µï>CÍ‹WûŒýÞ7Ýgü-Q ƒŠâzÞ¾Oã°„ØÔœXº¸pðé5¾hÛóº8î0Û8–7šL´åõÀ†ÜûÈZ®ä9ÿ~_–­ÃÇ UQv„~%gŸ8‘éþ–ÿ7†¸u?¼³•â [â¼Îe8Kœ­ç‚w4ÑhKýsPº¨píKk¹á‘.’C2‡nÚ|½Ûy¨uÎá³ÛÕPá^k·zÏknßm´á÷ßk~^·c¼žuÚÞýõe}µ/åë(ïv—cÈCZÿåmÿú¾öçìõ|Æ_¥ŸæM÷éÌ[¬OÌAbwø}§¶©gó¾qÍúAýF©À'Æ6n?îæ7?3¸9ÑxT”›?þ¯[ÀÚø_´ šçyd3¼7,ÙîÍ·Ðubå¾áxÍ…G&½ý'Ÿ;òì#•òI ër ™”ÿ”MDäuó‡qþoHsb'Xí]‘·ß9w¾ö«ˆÈ.âÅç³ttv ˼u僈ˆ «(¾š˜BLDDF,…˜ˆˆ(ÄDDDb""" 1Qˆ‰ˆˆ(ÄDDDb""" 1Qˆ‰ˆˆ(ÄDDDb""¢Qˆ‰ˆˆ(ÄDDDb""¢Qˆ‰ˆˆ(ÄDDD!&""¢Qˆ‰ˆˆ(ÄDDD!&""¢Qˆ‰ˆˆBLDDD!&""¢Qˆ‰ˆˆBLDDD!&""¢…˜ˆˆˆBLDDD!&""¢…˜ˆˆˆBLDDD!&"" 1…˜ˆˆˆBLDDD!&"" 1…˜ˆˆˆBLDDb""" 1…˜ˆˆˆBLDDb""" 1…˜ˆˆˆBLDDb""" 1…˜ˆˆ(ÄDDDb""" 1…˜ˆˆ(ÄDDDb""" 1Qˆ‰ˆˆ(ÄDDDb""" 1Qˆ‰ˆˆ(ÄDDDb""¢Qˆ‰ˆˆ(ÄDDDb""¢Qˆ‰ˆˆ(ÄDDD!&""¢Qˆ‰ˆˆ(ÄDDD!&""¢Qˆ‰ˆˆBLDDD!&""¢Qˆ‰ˆˆBLDDD!&""¢…˜ˆˆˆBLDDD!&""¢…˜ˆˆˆBLDDD!&"" 1…˜ˆˆˆBLDDD!&"" 1…˜ˆˆˆBLDDD!&"" 1…˜ˆˆˆBLDDb""" 1…˜ˆˆˆBLDDb""" 1…˜ˆˆ(ÄDDDb""" 1…˜ˆˆ(ÄDDDb""" 1Qˆ‰ˆˆ(ÄDDDb""" 1Qˆ‰ˆˆ(ÄDDDb""¢Qˆ‰ˆˆ(ÄDDDb""¢Qˆ‰ˆˆ(ÄDDD!&""¢Qˆ‰ˆˆ(ÄDDD!&""¢Qˆ‰ˆˆBLDDD!&""¢Qˆ‰ˆˆBLDDD!&""¢…˜ˆˆˆBLDDD!&""¢…˜ˆˆˆBLDDD!&""¢…˜ˆˆˆBLDDD!&"" 1…˜ˆˆˆBLDDD!&"" 1…˜ˆˆˆBLDDb""" 1…˜ˆˆˆBLDDb""" 1…˜ˆˆ(ÄDDDb""" 1…˜ˆˆìlføfììrDQÄúuk‰¢H;VDä­ž_ư¹¹™ªªª‘bI’°`Ï…¬~ù%íY‘]Dàû4Ž=òCÌZËô™»ã´OEDvÚàœÃ9‡1;¶mqç6'ƒsŠ0‘]‰ë—;švˆˆÈˆ¥igµjÍØ¥¶Ó«•c¤”q8×3ÐG]dd1Æ€s8ǰ]~sã0ƲŸ¥ï5ç°Œyë–ñMdœöˠÙEk­­­<±t 6lØ%·A*•bÆôì±`ÙlvÈ O’„—_z‰'Ÿxœžžža9€§l&Ëœ¹s™5gA YÆ(ŠX¹bË—=M±X|Ó•±ºªšù °ÛôéxÞð4ü)ÄDF˜|.Ç3Ë—±ç¢Eœ1{î.¹ ¢0äî¿ÜÅsÏ,gÏ…‹0C ×­YË «žçŒwEm]ýˆ+cOwwüév<ßcΜ¹ƒ«“ÎñâªU4onæÜ~˜ÌaþFkÝÜÌ]wÝI*0yêÔai:PŸ˜ÈÓÙÙIuu ³fÏí¶¼«M©tš·{+W®òÆ Æ–-{šc;ÚºúYƪêŽ?ñd–/[Fbíà2zO>¾”O>…L6û¦,Cãè1,>âHV®\‰µÃÓ쩚˜Èc­Å÷ýòÉø®9ÈÃ9G‹!Ö&ƒú† †Eª«k°CÀH)cUUÅBg-”÷yÿ2ŠE2éÌ 2Ï+]›Õ[÷q ‰3;½ µT†jŠÅ" ÓgU51‘·üÿñ³¯ôCþ·s¯ë¦ ýç±£O,Üë-£uø3ö¹„WžºœiÕ ùm‹o¶wn;Öp§jb"#¼F`|°IÒw˜ò|X›ÐùâS,ílàÐ='íÀ3Wƒ±]<}ÿ½<½Þ°×‘‹™5ÆðÄÝ÷“³'›—?ÇÄCgz•‡}Ã‚Ì ØN¥¬#I¶Ô\Œq´®z’%­:yYâsĉPm“í>ä{¾cÝ’YY³ˆ#fÖ¼Þd†±o»¿íc˜<Ñ羧Ρ¡¬u8 ¶¸™%<À -•úö£©ß´”{ÿ±’xò~¿ïtÒÞpìᣚ˜ÈH ¯òÙ¿sãÁænàâoÞFsàJ¶á÷ßàü¯ÝKây¬à·\qã#DÖ•‡çÿ_'0¾Gë_/á¬óþƒ–½Àæž\÷]®|[¯¿‘eñ€[íÈi{kH½ëëû†%W~ŒÏÿâ%|ßëÛ°á©{ùŸ»Ÿ%¿ú~ví]´—k-Ûµ.€!⾯Çox±÷K;­Œlµ}=ãѲò^®þæ§9ë]æòŸÿgÖæð|~ÿÿr qAàýþj[Àã¥[ʯf˜Ëß7 Œ)çMÀÜS.âêÓ| Çó»ëc\’`øA0 9Ì% I¹–»ui‚l%U™ððËeMÊ5ãAï·1±5C”ÑÇÉ?5TÞÀlxøëñöŸ²ß—ðž£ëyê¶sÊÛîàê?ü’“æÖ²îþ™~æ=|ïsÓ!¾•»–æk÷^ÉqÁЧKqœ?ð·Ú1‰j¿ZâØî´áþª‰‰Œà¦Dkm¹6`ð=3°YÉóÀ+¨Ÿüá…ìù‘k)$–Knà˜ƒá#ï>†1•õ³Oâ†eŽ`å×Iáo0Æ0ûÊ´-½ŠC9—%í¥ V_¼ïß9òôOqÝù‹Yxå+¼xíþ˜)grߪe|t”á=UQ™ÍP]ó<§dkø×å{…«>~•¾Gãüc9ãäxÛ×ÿ@”8ZŸý#Ø¿‰”1ÔÍ<Žÿ½ƒ ùÕ;æ0ý¢ïpá¡ðL%~êzÚ£çìë¬áœÃ:WªYy>½£ñ-ÍÇ%y–üæË,•Å3iö~Ï7x²Ó#K|.Ój ÆøÔïùëñmÈsw|Ÿ£¦×â{†Æùoç·+#?k{˜KŽžˆ1ö½ðZZ‹ Ɔ¬üóúÞ?åsÛ AÐÅ7gûÌþôœ>¿ã5rê¿?‚ ¼¾2nÓa‡ÏË|û½ÿÆÌOÝÀÏ¿ú1N9åLþí?oáË‹_ä²þȯOhäøÿ^Íï¾0‹T*E=•GÛ—p|ªŠ÷ÿ÷oùêœ4³>}%ïZP1 ¼ýÊÿÅ>ÝÜÿ㋘ۘÆKeÙ÷½ßä©Gà¿ÌE“<»ð³0)‹©˜Æ'½šàŸ(ƒBLdWæøOsëÍ7sóÍ7sÓïoáÏËšûýwŠL* žïÓþijԼóû4çbîød–}í ÖLû"›‹IÓòðØoþÑüëIˆt:E9#1ž‰à°ŸÞÇãMdæùOãVÿ†Å3jHeÒýúT él–´³ôªËøêc³¸ku'+®?Ÿž¥wÐég1ñó\þþóH_ð'zœãñï/äGgœÉ=¹,µi^þÍÜö‡uØÂÝŒúýWùñ³yϼî³|³ª‹1­+nãÿ]r#ïþÅStl~œ3‹WsÁÅ¿$ßz g\x7Ÿø{ç:yè§a|& }Õ]\ô‰ï²÷¥¡µ»‹%×–¹U1¤ Ï\ý &]ú-ÏÞ@å-—ñ£åÝVÿ/|ùW¼óšåD6Ç/Þñõ‹¾ÄË. ]°þþ |í©ÜšïòôÅçò‹ Þ?WFÏþô[~³f*§¾ÿ`c­Å5q쩼rÓCú§VîxÿdÎüÎ+DQD\¸‰½à^×Ãu:‘šjŸu{…/=ÞŽ[ÿ}ž»ä\»Þã¥[¿ÇÅ7uó£G[°]«ø@Å_øÒOþH!ñ qtöìÎk ÄœÍ->‡»º=cvJmL͉"#±)±_3™1å`é|žþö72¼À§uU+}ÉÓ¯ÉÉYKÍ>Çò®CfÇ ÷?‘ìÒÖã_ã7>ÈG/ú‡ÿÛu|pv%ké]â–ÉCl¡³hIŠC´kmYK¶ñÀcÏsò'¯ä ¦J¼¦ã8û츆€xŵ\ýXž½n¿‚snð‚ÝíÿàoO´³0ŠØí¼/qL#ÀlŽšw­Êâj^ÏH‘þÒAÇTã³á©?PXðnÎ=nwª<8ïËŸå–‹þÌsùOrÀännþÖeÔ¼ýÞqÊŒKÃÓßHËîïåÓgïO±Ôîy†Ïä L~ÿøø!S:Þ¹¨’?½Ò²þî~¶™â.æÞXâü:V¼°žç7p ,8ÿsÌ5À„£9¡é"î[•ð¡ñìöߦɃñ ny‘\vMõýËnh¨­%›[E{WŽ®Ðæ;€&hë!q @]„aÞy—0߯ÅñMŸà¾mŒZzk×…üøóâÇ:Ÿ_Ék–Ó-$¨ªañ»ßKÀÞgqhÍÕ,]Çìn þ{~)ÄDF ÄZ°H'x‰!,æ‰&žÈW¾ù/Ô{¯"ËŠ/=Ä wF„„„I‚³Åb‘0ŒðÓ†0.P =Š…gcŠÅ¸²“Ÿ}ü}lÚçR¾{Ò ò…aa]B)† Qc“„¨¡u„$Äø¶Hب‘b#)äè)DÔ¥rù<)¯ˆÔ๘\Ë+øcä_¾úUf$9ÞW2Œ›ì¸½Uçq¦XÂbÂÅhûŽqãœ<\à[Êë[$,Æà%ä:ZIg+pQDÁF„Ô’M:i‰æñ½¿ÝÉ¿½‘[þã£üë¿Ìáîÿ%c:7“©˜[zâ€LEH˜@u£ó8Ša±Hw÷&&ïs ŸÿÊ4Ø xÙZ¦Ž‰yÄz¤+HŠ`ŠÏR( 2CG’įdÎ9ŠÅ&®ÀoœEMáfV®‰§)&ày–µ7¯CƆDÖáâÐZ#–(([Lå–õñIw‘ÞíH&ŸáÙ¶z¦î6…)S&2~t#•©òè¶ò:Z[ZG‡-¿–lG¿˜éë—±6Áb±œMˆ“¸4E!ÕSѽf9/7H’˜+ï§½b •¿~&ïøøeÜt÷m|`Ì“üàáVÆÌØŸ®5Oðüú‰-Í#ŒliÈèÖëëbjw;€°ùEzRc™‡³YQ51‘‘ؔ諶qD¡–y”_‹ŠPŒ±8’(¤F¥×“˜b’X‡³kcBë?vG~éõ•³âæÿfi>¤~¿S9~Ò|fÿ‹ë~v kg§¸çª;è¨< kIX ÚRM.Ç©^Ì/¯ø"W™cèyè:^pbj9á´SøÉ—óÙðyf¹—¸åžu¤çǸ±§qéG®ã‹?‡Í§NMØÌê Žs¾ñ%\T¤÷\±ÄÅÅÈn)óv4)ö†wïÁ>Žb^yø¾ùõ¿‡ Μ“ÏääúòåÏ}™cf‡Ü~ý½{Éo™Ýq |õa¦Î™Amq%÷å§ó‘YiÇŸÅ™Ïዟº˜“›A®­½Î¼›)ÄIiýLi} QÄØùïáý³nåK}š“܃¤e -U{ð™‹O%*(&¶ïoÂBžbìú]ð:Êè"7– ~ö8÷Îm¹ƒv¯â¥ÇþÊßÛŽàG_;†ŒçˆÃaTZOlL>_$.¥;Q1O!Þ²>Q¡@Áf8üÔ°èæÏqþÅë9zÏq´¾°:‡KN[ª'½—$„…aòÏ]*ðÏ4†õÐCþÊÑÇK>—qw}ÙtwuÑÝÓͤI“ûnA5jânÌÝk/ö›?…ŠL–”P3~s:ˆývGâg™6k6³'7à§+˜0esvŸLe^ªŠ‰Sg0£©‰©ó`7×BKgŽžîNÌÄ…ì5½‰ù‹f“[¿š–b ‹ßw!ÇΟÎÌ©ã©nÏŒ=1gRI1aÔÞG³ ¶…çWw³Û±gsæþ{³`Ñ»N“$†ªÑ“ØcþL«õKÃß}Ÿ%>Ê{ìA*•ôÆðìsϲǼy}µÍêŠFí6›yóÆSYQC]]uu5ÔÍ9”³ß~•ù6:“:ŽüÀÅœ{â\Ò~%5^HWGQf"ïøè'9un¤êØçÈ#ïuÓÞQ7yû.šESÓfϛǬÑ •£'²Çs™9v‹Ž<š)Ù<íÝ!é†Ý8ôðÙ9¶†ºqS™·×B¦ÕyĉG]Ót,šÏäJWîN2<±t)óæÍÇÛú¶SÆðijßþûS Ãr¢%dÇîÅÉÇíCU’£`SLÝïTþåâó˜?6EuU£&Ídþþû3s|©êQLŸ½ˆƒ˜E&vdGMfþ^ ™Vï'†Ú¦i,X¸€éS¦qøQP¶ÓžwÔOÝ“£Ù›q5Ô7Mg…óiª‚Ä4NœÉü=÷`LºT󢈗V­bÆÌ™CÞ¨y›'kÆÐÓÝÍC=XXòø7–_bùgH©áz Ïöb÷Ío_AËæf…˜È›ÐúµkÙ°q#x q³lùr=l1õuµk'ÆÃ7ŽY³çððCÑÕÙQjnð<ú½·ü»¯ÿwÞ°¥ë¥0¦ïÿJÏ…*ÿ½ñðÊÍt[ë•k‹¥N}çÉæç¸÷…ˆ}÷žK÷Òë9÷£WñîÞÀžP*ây˜Þ»ý•‡ÄÏø-óÞú÷L&ÃU?ý/Î8ã **«œñ{ÆðûßÝÂigœIÇÔÔÔðŽSOåÁ‡PÆ0 éêh§£«kËë}Cò Æ+ œé½ºÜºþÛlË|¬µƒ¶ÅÀõøþÞÊPeÄÚ¾»\ø¾Ïu?¿†3ßuA*5àsàÃ/®ý9ûÄ'éîêx¼î·¿JÍ}–ºúz&OžBWOÏÀõò Ý]üò—¿ä„OزÏû­-‡Ê€yºR3õÖë¼õï¹\Ž¿ÝýWŽ=îøAAüª!æylÚ°+¯øvûÏ®¹öôÞs8 ³ü³èQs¢ÈeË׉ÍÛcò=ÝÛl¶qÖÒÖÖ:ðo·êjéýýÕz`ì6^ôúÖ7£5>>íüéÛòîû_Á¯œÌû.ûï:p"®÷ÖNCõýlk%ûÇkµT•›Ú:;;¹ñ׿ò™VmííÛ.ß«lÁ«¼Õ¶´¾¼î2¾æ3¸L©?k¨f»­×ÚÚÊŠÏm³‰º†Ä[? ßú¸mn£W/ƒÓ;Ddð±yË+IzzzÞ¼ëêblã|ïöçøIÊg ó=ä Ñÿé¾z®|ókm'ë\éŽï…ˆ²ÏC1 ûîáø¦ÜõÖ ë¥b 1‘Æ’$& Ã]¶ßÚCgg;uµuåÚÈÖ50¨©©¡eófÆŒ="Ÿ)æym­ÔÕÕP¨­­¥¥y355ÕoÊ2zžGWg;Õյò 1‘¦®®—Xž}f9»M›1`ÀÀ®¢X(òÈßfþÂ= ‚Ô ;¥;ëX´h/î¹çn<èàrŒœú˜ÁÐÝÝÍCÞÏŒg¼!*i–ý÷?€¿Ýý>ô0*+«xsÕ9 m­-,yìQ9lñ°p)ÄDF˜t&ͽöâ™åËxàÞ{†|tý[]&“a÷Y»3~Ü8Ò™ô  jŽú†F9ôP–/[FOw÷ˆkR¬¬¬dßý÷£±±?à†hZ;n<{ï³O.]BþMÖçg ÔÔÔràAQWW‡çyå‘­;6Ìb"#HïA ²ªŠ½÷ÝwË3Åv¥mÐïß¾ï°~ʱãÆ1fÌØ~Ïý™etÛ*£ÉS¦0qÒä7þÚÛ(ƒ1àyþ°˜BLd„1åë®Lù캔sèmÔÿ@oÊ£y+—ñÍߤ<|«¡0yõíñVÚN#¿ŒfØN¸t`±b""¢ÙÙÔ'&"2Üœ¹w ÙAJ}b("2‚²«4z0Nš››éêì„])ÎÊw¹¯©©aô˜1A°Ã‡Ú+ÄDD†­öaH’„çŸ_IG[ãš&࿎Ǒ¼ÄqÌ Ï¯¤££ƒÝwßýu=ŽE!&"òëîµC/¨«_ |IDAT¦¶¶n—»DÂ9Çôé3¸ÿÞ{hjOm]½BLDdÄÔD¢Ï÷©««/?ez×ëkhlÄ:G¡P¤¶nÇÎ[!&"2¬U‘µ’]y;8·ãïó©ÙIvDS¢sàû¥«£œµý2ÒᜇïÀ’ÄààH’W.Ù 'HÛ„„|».ݱCDd¤VB\_Ml¨ÉºR œÌï5&fù¯¿Æ Ÿ¹šöÐöû?ßoæÊ·Íã+÷ðƒˆ_0“®Ýˆï{Û\6X6,½‘3M¢®º#.¸šµÆÇÛÆûÿ™©7|b""oÅZÏ*~rÑñŒMø©4 ÓçÊ;Ÿ%v[ª1¥›>—~‹ò4·õ`˵»-•œ„ÎMè(”îÙ?ý˜Ó9zf–R[Þ–Ú`ÿZYÔ¾ŠË?y1Uþ/¾ôG®ø|ý1l¿Q„ý—½u \þίŒ©9QDdgÕȆ¨Žx&äî«.åÒFóóG_äàI)žä6ŒJ•‚Çõ°ü¡{yzu+¶b ;Ï‚ fõ£wòçÛ©¶Ãö›G¿¥î:Žƒ&¤qÖá†ægâ¾¥«Èy5ÌÙÿpöžZO¾c5/Çs¸ð´Cè\ökòÓd|üÝìCoyùÑ{xø™u$ãÙçˆ#™ÓèÓ¶úYžÜœÐ{…§^n§fÊB°5Áο¨[51‘bƒšÚlDsó&ª,æ˜='Sß8ž}?ƒ“÷žN²Íéû.[Á?~÷-N?ëR–Å>뼞÷x:ßÿËs´7¿À_zWýõ9âm•±/XUѶ`aM%ǽûC\sêGihü6{ïþàù¼÷ØTn¾…Ï}ëQÞsç3|vï,qX 2«~[ ;{0—\z -·~ëãü×K¹àm‡ ˜wª²ŠÊ”¬áНþšy_»‰=ˆØïý‹¹ì¶—¹ë$ƒÁà%]¼²~5ŠTWd z”O}æÞyï |a@;ß^8ÿï®å»Y`ò±|ú“2”c&kùãü·Í¢*ع×Á©&&"2ìU°-õA5 5 ÞÅ/¾ÂÃ7]Îq“ZøÖ©{sÊ×ÿJÛsw°*؇ö«Á^*K6ía#¿ï¦Ôeñü cG5’/°vÐbKr/ó|׋üôÄÝH§Ó¤ÓU¼÷úÿeÓKmÄÆ@R¤Ðt·þô8~zô8Þÿí{”Ç»Öòå™òߌãË+säV·;Ñóf0¦Â'±†Úêzò’WØ1\TÖªXg ‹¢(º6á§°^ŠÙ‡¾ƒGžÎéìÆ~Ÿ¿…õ‹+ñÃ6š;!N‰œGàE„QŒ³1ÅB‚K£‡ŠbçHÂ<à[°QbG±³ž/<²Š¯,ªì·ä"ë—ßIâ,…®fœ÷+ž_ø_œü¾sý¸Óq…É\µy%è“ ÛÅ?~^Ä&Åb‚I£›„ Ò©ÁåK’˜$±Ã²yUÙ5±mÕRl¥wÿško¾×7³nÕãüñŽ¿7ÕS9ëÞ1þ¹ü[7³>ÓþÒ£<¸¼ãJ÷]y¸ ë«î¹¾:˜ÃÀY¨Ë{¨áŠ~†Û—­£³}=ÿ¸õ—Üòt;ÆÄ4¯^͆–LãL&U‡ô4ÅÇ^ÏÅïú:ÿXÝBGó*î¹á*îx9!å•–±uŸ—cÃìÖ b""#.Ƕu†TÔÌÍßø‹fMgÚóí§¦ó£ËÏ¥¾r6ŸÿåÏý§ ™;~»qw¬Mðl‘ž|ˆµç,qX WŒJ5¾žn q)Äžr‘ÅFYN¼ì:þýàUœwÀdÇïÎ;.ùš‹ .‰ £ÏÞøöÖÄäEgS8â³÷<>ò«»øDõo8vÖFMÙ› ~ü¿D¾ÁFErù[.CÈ"œÝF­¶í:¨îóŸ½Ø}óÛWв¹y—»Q¥ˆÈŽÖ²¹™+VpäÛŽ& ák~@*•Â÷J×\YE1›[ZqÒé oÀY’(¢¦q iÏR£Ò<‚4)ÏR ‚Š L˜'LA¶’ ΗCÍà§Ò¤Sžq8›Cç‘ΤpÖ>ˆ£"a”à0é éÀLJMbÂbˆóÓ¤}GqëåGñ5§R)n¿íVÌŸÏØñMÛNžÇ¦ ¸òŠo·ÿìškO/¿Ü t–v=êöZXùQÛ¨‘$6$‰\MM ùÈùäó¹¯3†ßÜx#]]]}¯Åa¸üï°§»ïõ(×Mÿ^¸¸˜'.Z:…\é]Å!Ö-*äÔ“—È÷Ÿo¿åÅ&vØ£¦Ù)AöúFêuttpÛ~[µˆ9çèèèQ-eÎYœ®±†u¥éõèêéyÕP)ì0®«BLDdXâ8& #ì0px3K’¤Ts†Ú£BLDd¥Ó1Wž’rˆõ¾Öj¾¶§ˆˆìD¶œ?Q9À"¶ô¹mÕÄL¿ë­…b""ò„Xo aïÏÞ»¡Fz[M~ù§AG‹ˆÈÎÕ[™ê?õ6'b¦ßÏ¡þ-""²³ƒÌ õïÿLÜÎr÷@ IEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_design_fields.png0000644000175000017500000020602412235000130025332 0ustar00murraycmurrayc00000000000000‰PNG  IHDRã{áBãsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ63r×Ѭ IDATxÚìwœUÅÝÿßsÚíÛ—²KߥH *vQbѨ‰Æ’ÄMÑhLŒ&[ì-öìŠ`QÁÒ{[XvÙÞn?e~Ü»Nžàt SG z‰¶ÆmÒ×sdQ8·דÒq=‘q¿¡ýkw_zê TüÇhï9ÊÝŒ­ü»lvÖ{ß¾ã*²eȽŠ/µŸµßE-ûÊ‘5‚¤ø?#ÄRÒÐ’`ãÆ ÈT”žóCrÞÚ˜® *êâ¼óÖË 4HI^ÄOÊv©oM±bÑô03¦€¡ïYŒ5!XQÑÀÜg±ÿÄÉ„ÑxІ¶‹æ½ËÄ#Žgä {Õþ]OòõÒu,ýæSFŒHà· áóù¤¯hH¯¬YLÿ!Ý¥%·‡«wôw9åò?{â)ו*mÛÙ·Ø ’gƒØ‡P€Dê~eS@÷ïC8Bñÿ¯’fÆÛÉÓ"@Ó4ØMã°ã ,_°Š†`†-§_DÛ®¡KRÑz–,XC4’±éÞMNO†)Û‰ÍN„[¦©Ù´‘u[›Iz ™ù”†šÙØlQÒ¿Œá"èrâ.šp¨Ý°U›jñJ÷ãàAXàI<™9‡¦ „°Ùºr k·5£÷Å!#èªu)þ %l¨¨¤jÓ*Ž<ö${âv ]cÙÆ:–Ì›ÍÄcO¡87@ÒöXôí7„‚AÆî¿?ºØ·V°`e•k0ñ¨)ä Úóæ¼Ãèq‡0 ´Ç¾x$Ó_|ý-¸Iö>#Ó±®iŒËÏß~F|øü­#Hf=äöŸi eìx³¤›éÅKÑq$¸ŽMIQgŸs©T±/YJŸÏÏ3O?B£ë¢iêU¡Ø %ölZ¶U²e[#IÙý3¬< ëOŽ©íà`J žÓBŦ¿¸õFÖWòÈÌõlýèÑ:„ÊK7S±Ùæ·Ã€m›ypÖF¶ÐŸ’Pg‰nº™Š-67Ývý·mæY©ÜÎf{GUxI6­ÝÆ ƒöç·?ëAð’[™USÊÉý|þá"þ¹Êæìt$JàR½¡š‚áÃxògÇa}5‡Ÿ,°ÝÛ vÝ ¶$-rŠ2¬ŸŸÊå•”w0]@|Î;\¸b‡ ½ô“;ôöão;?~7d”w®Ø1ü>“HÀ"‘LîƒWíQœ¡!D§ˆ !È û1t ×uI$SxÞnÂJBôû(Î Q™mÒËú@q^¯KÇ9Ob:>ŸÕ1I+–HáIp0€Ì†¸ó"š›“Ù‰f´O8YÁ @G¿¹Ý#v².ˆ0võRÌ r§‡+%š¦³vÝ|ø\×CdoJ×F*¥Äóîp ]ï:Y±B ²úçfÔ˜º†&*·T Eè߯‘P€Æ–66WlÂqlúD~n$Óe»Êì,mÑåÊ d…×£sÜXÏþcÂŒ§ÑѺDGC3 “ ›¶°jõü~†®e{*Ïóp=D<Áˆý£ëÙ›.e¶.ªµ*v틎ç‘pÙÆ¢ÕÍ´Ú™9Éx+Z¾Ÿ¶š‚†KÐÈNàˆE©ŠF(*Üñ Ø4Ô5c{iBF¶c²ðèì lj›±e§ Y›Ž§Vóh©o"j§™’ˆ.ð\I¬)F[‹‰~ƕ簀d3«·¶Ðà Œè^\'Ica)‰ááED5IØH¢°|xõ¼÷q#nÜ 'ІRÆÈl¨:R\Ì}b8˜4TT3«²ŠtÔGÏb×MÑPS4 lH4N êÛüDzäâ57‚ž&ä RmÒðˆh’t[”št!=ò Z·Õ‘.aL \ëü„ r±6<™ $Àn7<ºÄIFiLç‘›ÄÒ…jãŠ=ŠqÇ\ 2‚··£ž¢ËO!®ì*~YA– 4›/ŒiêÝG>.¹å ™Èž0v›wÛéÌ€)/[i®ëX>Ó4p›t:ëºH×E ñù|äçåcd…Úv\„PÙ4{j¤Ç•ïJFãFæt|ooi`™WBO Ù£'§œ!.ô¶zsL¯$‹³ÝL2ÃÎíGyØâ¼ûQ«Œ<6~¼†IÃÇP€€tŒt^?‡ºØ˜ylš³†#†!_É(©¼~ŒÊ·Áàñ#¸h¤ÄŒ‚½ é-W²x[Œ¸[L~º……kh¾z­0%;)Óë‹Cbé*ÞÚä`¹›©øÞF:9z¯³ó+|’•ëX…“sšjY^  ·KA&š¡|?[«k˜»¬‰•vš~ÃzÐT!‡÷ñdEöÅL°jÉ&>Z¥a•·pXy„¢<_ßÏõ3aÒþ ttŠ €ÁA½u^[&;\›­‹V2kƒÎ½†Ú‰=(Ž˜hn‚TÚE7Õs¬Ø}—»=»•ãxÄ“i CÏFQå.q=7ëj‚ž¶]4¬€BÊv°·Ãq øLJzc;.†¡S]Ûˆ–õG)ÝñºèÚ¶ƒa˜ÎqðH:)-@ÄÄm°™¹"€#I$\¬€/3I%ûò0|&àÈ4Uu1bšFSsk45J¼.«'â-i´P>v‡' q=lZ…b—m\Ë6 OJ<`åš Ô64íT‹%  6t‘pÓaê´ëa -#î×%ÝÕl×Ãñ\¤K·1aÛu;愈lãs\àcîŠíf„ÝI¹ÔVWrýŽÄv\>“dÊæ¶ËOâšûßåà ûã8nO[àeÇÃ÷eÅnÇŒ¥ô:ÂÚíño‰ÄvlÛÆ4ÍìºÇN›²²AL™rMMM|úù\ê¡XͦVì]Cí˜ëনçÐ{@–‰h ͵M@ vu/½µŠ I Ï VJ$aáë2·A&nS‚; DWâðѪ JŽ¡/Ù9º‰Û§ÅénSÚÅËÂnŒÒhÛôÇ æëܹÖïIŒ@} q11·Kp+w©{^”]âf®Ñe’ºÊb–¡]•Ûô“¬®Ç%‡Þ¹9”ò-_ÆJùAA˜°nc OX»®›ñêšéIÈvX>çKž¯1ð#É/) 4`"¥Ö½¿}Ùª™+vïo7áÊ“4µÆ¸æ‡‡Ó»(²Ãóã÷<5ójc6¡`—¨&:†Q;¸ng‚©D"ÅÜÏ¿êˆFE©ŽsgÂã²£Rí3²³Ëƒ²6ž'Y·v »â$tMãíÏWñôÛ ¹ñâc)ïSÈ߯šÂwÌdÂø1]ÆŒé8~_RWîFŒeç’¤L€¾ÃC–ÒC×u CG×µL"ÀoùɉD0 Ó4XµrvÎp¤f!=•…K±ûf*Äv¶ŽÉM¿/—Öêu¼[SÂä±£øC¿~liq)êSHO«‘¿þa.Ûr‹;…݈P¬ãÃÍ1pÄ…'P¼:J~y, …Dš9$26å…Y›5Q ºÚè9ôJ×ñÆŠÊ)æè ¦1¬¢ž&#DYi WðèË›º$—͸µrÇ®Æv×¶å’3hP¿%ý‚Œ>ò8žUÍ?g®Æv»,;´ò 7®æ…-ùaßR.½â,.à³ hÛÈÓk v\"Ýum±kxby9WˆðƒËOáÐÍ-x¹¹” f>?MNç˜XçF3Û]oVŒUÇ[±+4!:¢ER‚ëÊö¥¿K‚º½²!h/+ܲ£œöçLî îíbûø gìp~¿eàz²›‹¬€zR¢eŸr‘-£]Ü ]ã£oÖóá¢*Ž?êPî|ñK®;ïPzåtû#ÎûÜöàoßö$º¡sÀøqø tÞ8™é©äææá³|TVVÑÖÖŠ›»v¨)U~ Åž½âl—é847ÛÄãB×2;«x Yüþ¯?ÿ G gRÿ0%Å’¶ê*f¯ØÌÖ‚üRÒÚlSßf“rMz ÈaÅ‹xÚΩÃr(Ž8Ì›õ-='``4MÊ3é=0—åï/â;cSq˜?ë[zMÁ€˜MÚÓ)XBíg ¸µa §XÊ ü=]‡uKÖ1we+vn–cÓÔœ$œÊÔ[hN,N¢)I4-°,;‘¢¡-M*­a ]´5§©oM“Â@¦m¢FR !ð÷ìɶù ™Õ{ ‡–I `’H¦¨oK“Lk˜Â$¯´ˆOŸû€ÄÑ£˜\žKDs¨X½…ÞÙLs¯ø+›ˆ¶$i°“Ä=ËÐqRib6") ôêÍŠ—ßçÖꑜ:º˜žÅÒ‰_ίäÛ¸Žá7I¶Å©34ZK×@z4G|qÙeí¨B±ËV.º{Æ®ôȉ¸õ©¹»TMÀà²Ý6sˆÌìg):ÅSf†J‚?—Ý1s—u0uA©Ì¼TÚ‡€"›µ¹³×êe=ï~Ë8ç÷3èÙ£ˆ!eý‰'“0v·=7d"ÉAÆb;Nfì»Ýó—bŸ£D;ô—þÞe7wÒ©¿ õ#‘Lu~áÄà.ä{ß;½{(q»¸UcS#~ô²;gR%êSìKÏYÄëjØPYK«Ñ“ý‡ã׺÷”dÕ[k¨‹¦q%V€œüBúõÎE·ÛX·|#-|öïC€™¤ºb+•MI¤ ¨8Bbk5ñPû—Rèˆ.6˜ ‹"$ªÚmúPè— ÿx6‡M:’ú¨ƒçe†j Cφ­;#¼ºž9ëfÆ© àaÛÜTŒCÇtds¥`þ¬gìŸÿËԬƀhöâ@b§b|üI§þ.PØ—x1ÒÁj]E<Ú´Çg†Šp#åHÍPiyû°Ö2CBf’Èìð ¦iÝÂ]ÈÌøŽ™ÙþBfNÆQËÚg'lzR"v(ol²u¢Ër ‰ô²K÷4 ]dæOºnfe~frXçø“ÐôÌ És³<º¡#¤Äó2¦¦i]¾ßñz=×Ë$ÚéVN§è2æu½>]C<ÏíHŽÐý\¡‰Îë“íËO<¤Ì/@º.®ÌÌÕôì=r=ÕåVìU˜Ú§KÖ¬ZFNQü¡ÜŽ ]{ÂqË̬ӽ=^ºxžZ²¨Ø{\ ÒòQ6dË—-ÆñÄŽ™²váäÅI sCŒw­m™•<©´M~<)Y·~5†ifgWï9&œH¤(íUHÙ°14·´‚„h<Á ¡£Ù°f)×,%Ía½g1–ضMÙ õêGk4öo3f{§V‚´÷þ…ªž;…B¡Pl§ ñD’`Àǘ1ûÓT_›‰ðìÍ‘žGI¿2[Úp\7“éJJZZ£õ,Åï3IÆãìm¦ !½ú ¢¾©¥c–ãx467S6t$‘ðÆnaé=áóÈ)ìESKÛö¼MŒO éFfݰ&öz£f…B¡P(ö†TÚÆ4Lr{ôݧãZcÉÌÚc]ï&ðÑx3˜*اòZ²vû> í^nK[ŒpAɾu3¤¤-ÏŒEwQ`M×q¥¶ïb|@Ï6V-_L«QKvz™B¡P(ÿfù_CüÊûw–%4¡9ÌÙW1nimãççcÄÈ‘$÷a¯I…B¡P(hšÆ¶ê*~à}÷Œ¥S×ð™:ž£íS…B¡P(Y¯XL}ï4TS·K¡P(Šÿa/ZÝ…B¡P(”+ …B¡ÄX¡P( …c…B¡P(”+ …B¡Pb¬P( …c…B¡P(JŒ …B¡Pbü¿)»ï1›Í&¥ì̺ƒ »¶»±Ùéé3ß‹öã4 M™ý[»l¢»Ë²²ß‰ìÞ´šØÅ9ÛíÚ÷ïÝ‹º) …⻇ñß*¨tÃD×·ßûIâ¹.Žã";n1%XýV6¬ßBº°Œýú÷ hŠn6.­µ[Ù°¡·G9ûõ+&`ìĦf76;VÄ“j·,…B¡PbüoAÃò'øâÞßpñì-;|;ô¸ëxéÕÈõl Ÿ…¡ N:I"åd„Ô h ûèȵ- üÁ–.Ðq ƒä"´3 ‡@ c£emdVtMŸidÂÈ®M*™$íH|y¹Ô¼u¯¯jÃßï4nÿûOj¸4møœƒ˘44<ð…#ø4›Jàè>|††tÒ$’iRv.ÇÿòO„67’7©ÒÓ±JfüìJŒN⦗Ÿáà‘aÒm=8õ¦?Ò§É¡äð\Òv&t­&~¿S׉k§I&S8hºI0DwÓ¤]‰nZèBâ¤âÄ“N&Ú éøü~,SG ñœ4‰D ד ‘&N:4}˜¸é$‰¤—‰±«Ö¡P(ÿ÷Å3! D{ŸÊÍ×L"ây¸žIÉàqô4lj¼ËK¯ÍfÑæ¼P ?ó¿7ÓNî¤8ÓÝÀŒ[föš8%£¤OBÃÜÞÆÙÀŒ??ÌìµqJÇHILïf¦•àÛ—dÆœ%TÇ ËâÌé§rð°Kîù·¼X€›ØÊgoÎà+Ç!°yDS`õ¼|í/y·&I¿“/dÔúWxsQ …£åܳ§²‰G[Ý6¶VÖjsH·¬äñëoà]0×òÊßηO÷æôë~„³­šÊºfÌEaBkÅW¯cÕWÒä›®!ï£LÏÛÊ ¿™Îµ3Ö‘>,™$õÊ+¼½øv^¿ý4ŠìZ>yö5Þòàõ×^&ØZMcƒ™ 0ú¼ÀåöÆPz¬P(ÿ1þ3³©°êFÆõ@ÿ)v,WÝ6ƒ×f¿ÄK ê9îϯðÕ×+Xóá¯É¯ZÁûý…™5&¾®µÓ-Øð,·ÌXA³ rüm³âãG¸à »ý4º¹áYþ‰ÑÅ=ºAtå笵Áçù?˜@Ùˆ zè1 tتÏYëdm¦O |Ä:ñò»Ø´,úeIðk¸ù˜2zžÄ¯þpøzMI_Å‘LÐ@øòé]ZJï„L`'S¿ÊO;‡‰JéÛ¿œ^@´%A2é »NìÖ-òŠ‹É1ÍONaoúôéIħw»Mn¼™ÊÕ߯ÏчÂ#0ä˜s8¹Än#_ÍÙ„gf'² ÍbpùH†Ѐ¦mÍl[ü @Í7ÿäÜq%ôy/-­¶ñþ²f:BÅŒ>a c•QÞ»ˆÐ\e×k¶ …BñßÁ&Lí#þÆÆ/.¡Èu‘º‰Üô&¿¼ü!ÀbÂI§3¾_:€”hÁžL*vI¯Ø¾ v‘0 ˜ Ã0Ðtö+);¦gemºa`@&Ìœ-G†UÊ´‹Î °ñ¸)‡‚C‡‘kJšåöçÜ5þ¼š”hBÃÈ–¾³£¶_C,宊—€@AûR+±³êøM,Ÿ‘¹Z-£±™eQ£ýÇ2yÚáä{í×çÑX˜CÃö!¤.Ú×9«F¡P(ßM1.¶ã`»Ò•ø ú2°o°wÈ \|ñZ©–­,™·š²Þ>»,¸•®KxØ!”³Yã¬âí¹:º’+P䊮6ï°Î^ÅÛŸV0qÔV¬ZØÅÆ#wÔQìç{Ÿ•zûS®?(@:cãW_ÓZZ@Àúï0Õ4Ã4µÑT_Ŷú=ó¼n¬s)2“wùxþW|{ÒDdý‹ÌªN‚žÇø# Ù wÙEB§xô‘䳚TN ‡œõ N(°“Í,yçSüåTV…B¡øßÅo˜Z€çؤl·ã—Rº8‘áœzÊYœ2º€…·ŸÏA‡Î‡À~cç’¿Ï¡E7ž‹ ¤馠ì\®=¥œˆ[ËߟÀÄÓ.㾫!kã9)DÙy\û½2ÂN Ÿu O»œû_j·q‘n9è|n½h=}uÜêPö;xF`Ò÷Á›Kkq5 é¦;ÊÍ(¥‡“© ™åÅ™åFŽ—Y $e¦¾®í"¥ÄµmÈŒÁJ•SÀ ƒK!õ%w_q,üœ÷74a;6 q\Ï*füQ?ââC{ýð~¦O̰iw³YÏcèI7ðÛÃ$Ó™óà8x2Þ¶m\Àö pì%üþÔØKßâg“†3~âDF–áäŸßÏòh¿»ãZ<×ÎÜk×SZ­P(ßÏXâ::}™Ìéú`â}ã“aRâ¤$}'_Ê_‹Ë8ॷYPÑ„í™qÆ(9ò†`S5` SN:ІC†ç“Øé<θ÷Yì0sU+ùeã7 ÄÊwߦíàrr}ÛÎãÌûžë°)<žqý‚¬xïm¢•“c“ösô-¯ðܘðϱµÅÅŠÁ 1“˜vøPüŽMÞØ)œvj-þ²rLÇEÏ-å€)“ÙÚ8ò~<×`ôI§qju’ò2?¶#È)Î 'Ŷ±#)ôvÔÉœÑ³ŠžûEð<‰‘ןÉ?ÿ ¿¶^cUS’¤>œ_cN:S·%\ÀNK FÇoîŠòçf0om=I-‡ò S¸ðâ“)qãÔ äØiGÓ¿ü@úå@Ú 0⸩œ> †ÞCÃè¡Þœ{Ïkô:ðIÞþf IøÈï1üÀã8¦§d1Ï8-0ˆ±½4Ò¶I¿q“8µÆ@Û C­1V(Šÿ(;¼u§ŸyúÍ¿¸ê—¿5z‰D";nù¯hq&¦ ´t„› µ-…—M™Ûè–¿ÏêHná¹.v:E2å [~A?š'šHãz¡™øƒ|†ÀsObX>D:N4¹6BÇôð[Ù¤ÒÃsìLb ×C Dˆøt¤“ 5šÝÄ ãiâ±)ü‘~]à$Z‰¦$ºé#  ; ¢ñ4z0ŒßÐð’m´%ÝLV2ÃG0èG ¤M4šÂ†ðu”ãeî‹aá d’~$®"‘È&ý0L‚ᆓ"žHrpæ\n¢¶”—Iúà3ôÌýö\\'M"‘ÆC'Æ’.©D”¸ ¾@€Ï‚T”Ö¤£Z†B¡PüWVª«¶rß½÷Ú>òØT2ƒ„1 šýÄ€8øoM‡)'¥5Ñýwí•ðìq;µÓn‚k'‰¶$»]Ò!k£[JDbßmð°“1v’[„ÀKFé8µà9$Ûšéú«T´µcpÆ$E´¥óZÜX[&DßõzÑÖî×ëD[»”›µsÓ$¢i;V éÚÄZš;~§ I*ÖÖ­.H—Tùyyäm÷ÉÏÏ#ô!vòb£më—ÜvÞéœ÷û˜»ÅÅÐû”+LÒ-˹炳8÷×·òæZ—H0ÁgÜÂ¥çœÉU/­Ã‘ñ_¿P@`EòÈ hQaúÉÉÍ!hý ¢ßElÂ!?ÆžÄFhX¾ŸüåJ~7k+²Û.P™²Œ@˜HÐB£s竽­‹:–[Åì§eÆGkH 3œK^ØìfÍ É%'äCCî³8v–‘CÀØÓõ Óeí̇¹ù‘ÙT´IDû5gë#t‹P8ŒOß‹²|«_¸ƒ¿½µœ˜C6«ŠB¡P|ÄØ ˜óÄ£L›x‡q$“º}Ž`â!“¹òÏ/QkdRGn÷j&Ù´Ù/¾Å ¯ÏaM£‡®íû ÒMlåƒg_çųX\#ñYiÖÍ}›g^zƒ.¨Ãûw\¨H¯™7.>†sîÝ€0±‚⋞æÜã¦pÝk+IºrŸ;†é±þÍ{¸ò÷òm‡¦í®3"Ð ›5³^äµ%MÝöYFL¿Ëâ‡~ÃE›ÅÖ˜·O)P%¡CýâOxmö|­ÂaÁÂßc~ýi]CÓuh]̓?Â×<ÃÚ˜†®í[çII¼z!w^t>÷}kã3µÝ^¯¦{Ô.þ„·>YJ}²ËýMóhX:‹¯ø ¯¬u1 m·u‘ÒOIï&^þû3,mL Q_)Š/ÆÿÔ‰uÝ zÍ*Þýrî®Ä²ÿñXyòŽ”¸é$‰¤I¡cX&–ÏO(&àzØ©8ñ”Û‘ûZÓ ,¿ËÈäxöì‰dWfú"¦øLôl·D3-|€ÕÞ€¦ãóû±L=S†“&™Há´ç×öG[ओÄéŒ@u{»ÛT-œË×V3hRÿÙ³\vñŸ©=â.;¸?–®cøL!=œtŠD*'f0„OÚ8ÂÌœßsH&HÓÀnØÌ²5al+‡¼\¶–8ž™ §jB =‡t2IÊÉ\‡nZX†èè‡Y 6žå¬\Å¢æáè¡rs\¢­q\¡cùƒá“v*I2íàÉö=–%Bhhv_ΟGsx8‡Žë!Ò4¯˜Ç§±ïãiD7ñÄÕçr׆ ÜüÀ‰  4ËOÐ2ѲiDñ$Žè¦¿¥#=‰nšhÂÃNÄIØšf³yÑ|éá\‹XK”4ŸCϤ8uRI©Lnm¡gîY{S÷…š©d™neí²•ô ‡œ{ã&—ÐüÓx·!ÁŠ/d "L+DѹåÍ$ s‡ÈªÛȃ?ÃçÝÏ»OÞÍmϼÏâ'~ƈâFÁ¹|™Òñš—qÏy(öùð÷Áù÷|DMR  ™m!`7lfù’µDÂÀ°‡+Ah:º¦#ì­<ýó)ܼ|{æ.Nß/Ÿ ÞÀw^À¨âüþ|ÆN¿¯cAËaõ«å¬3ÀÏ®ø1ãJC˜ùcøùKxN3~x,YË}'Db|}[Þ¿›3@0$”?Œ3nz›zÃÞÍ{×0ý_Üt8EC~Ì+ËVòÜ—ðʼøåAA„8”‡¾ØŠf63û§1$Ï/ÒƒC~t;óë5,Ý%m æ”#Ì}þš%å+Šï‚K)±Aò (,*$be«¢)(ÌÃçEÙº¥•âá9úðÑ8Û˜ûØÝ|œlˆR¼%ïñðßcQ­–ÞÌÛ7MåÂת0tI[ŧÜüýÓøÛÌõúŽbT‘˲7pä™°)½w¡átó2î:ó8~?c ²p?öïëgãÌ¿rò™w°¤1³ „g'ÀIJ»»)É£eí»\wÑÕ¬÷[¼ù<†Dt +ÊŸÈ/?Âs¾æãÇ~BËó×pÍíÐfYh"Åâ{#uÎÓ¬­ÞÌ«?NqÏ%×±þ€s¸úWsØ´+ysYm /q\±AJ åg½Ëò¥óxì'¥¼þ·[xa^#šÑù§ö›yúòS¸«îTî»ïrN<ï2®>ûXö?ÿï,¨h ¥òŒU¼pÙi<=ƒ.XÆ—Oþˆmÿøw¾½ˆ¨'2㦙AXÚêjØ´Á¦÷A„dö ÍÝÌŵKä±™2­Ž0m¾¹ç*.½¿‚Óx‡Ÿ?É1•·sÚY÷²Å `h³f±1 /¯jbÃ?&ðúÏ~ÎÌhO¦?ñŽÂÏÞ¨!ÿŠÎ‰Ó–ËI¿yœ/.bÎs—#^¾‚Kï_‹ÌN¶BÃ4â|ü»8å¹þÜÿ9rß¿ý^Nx ·}RG"ú—Nê͗לȳK¹qæ×,žó“Ó¯qý¯ïa•íC¸&e‡Å]ú1kã¡ÔX¡P|Äxwa>éiôwºˆ·¾…ëþx'÷ýt<9>¨c«Ó:ºÈŽÛùFqù½²­u#œ6Œ ðÞ__e«ç°å‹Gx|=”ÿ#î~i6̺£å÷áï‹™õîkIã7÷qÇ2è5n*·½þ>ï¿u§ØVßÃ} ‘zL8“¦Ná¨Cb8îNÇ…íQûÁ-¼çMáO·\Ì~W˜è5osÇÛpÁcwqöþuì¹\}ÙáTÌŸÉ×5 Ù r¦]Ï•G”"\“!S̈ÔB>Ýd£ã!¥ÄumÇÅu-ö¿àR&ÉEŠcŽ›Â¤1Ö.[I ¡éxÑÕüãâ©ü­é|^yãFð%I9ž”HÏÃqR[ÞàþOzrÙÏg°_’3z?>,‡y_­¦!îu¹C.±h-5ŽŸ¼áÌ„;Ç;÷z®«˜_~€i=lRžŽÑ¶„ÞYÇè˯ã’ãÇÐØd®ô”.y„§—»ø°±ÆLåìiÇRbºô>ñN/gÖª:žÏup;é1è{Ó™zÐ@üB’3è~rá¶¾;‹­ÒB×4 YÇìÎà‚YÃxòã‡9¥§$åI¤çfïƒãéïñ§’œËåÚÓBËÄñ§žFaí<æ®I  ð÷ìG¨u=U ‰@…© Å¿ãc¥uË^åš‹¯æÍV8ˆÓ–ÜZZ]A Y18ˆ²!}qí\&>ß[«ˆW/bKÒÅY¿ €M<ÌYc‘&‘HˆüˆIåÖ8 ÜÓ Õ£iõ"j¿} Ç¿Šã„Â!òBUÛbHz1ò™ùsŒ§;ölîÖÁÐÁ7òtÇ>ãÞ»_aào¦Ð'lâÖ® JÀ/ÊLR¶‹Ô}"Ç^GmS KõÏë ‹J‹™&––ÛC ÑÆ—_Ëoÿ‚ºøŒU[-Î>,•µ *žº”ëâÇðüªßq€¥5-ðíØS"¹åkÖÇ7pß9Çò¨—A]‡¢)at<è–RâIÑ}k#GœÃ™ú{ÜsõíLxô èåGÖo¥&ácÔ€\LMâ¹6"4£r[Y·9†á¢0žÄÅ"Ïo³!¹}$CC7lÖÏü;×ßý*Ë·%ÑMA:ÚJÎÐCHzºå£éÃû¹µi?þðÁŸ˜ÒCr$š¾ÝåjNÕ2ªE ë¯ÊAOòóO—ó»QþöÅì íÌÞÏ®D4×ó÷¦§_ËÖOI²B¡ø?¦Þ-R"] è„ÃaüÉ Ì™¿…¤½½TU xñž›ùÓ-¿çÖKiµ¡×”) ôô>àT†›·VSYG7±mëY4-¾|ß^LÂOø>êPW·ŠÊ„©“¬ßÌ’yk0"&›•O^ÁYç^Æ­O|E²vqS%®gQ~Ü•Ü{ã‰lq¿½ï=šzÇÔ[xôÞ·Ùµ‰V.bÖ̹ˆ>cÞËÀÝåú*€ÏÀnj 5žF3 H6ÑFÃG•ÑÛX5÷}>øhÒÈ®ev|ƒÎà¯ßȈe·ñ³žeU‡Ï0 ùñš:¢¶‡¦A°üdŽ.øš?_ÿ,K6×ÒXWÉÒOÞæ½%•Äì0CvFzNa/ú÷ô¨Ù°•´¦uþuÜ$¢d*·=v“Zžæò_ÜÅÉ¡3*ÄÜ—gòME+N¢šOžz¯}9qDÛÙõEÓ-|nŒÆÚ<ÃD·Ûh±ƒ”L¯°IÛ¦Oxò‘/±-Hׯ+8˜_Þu?0ßàŠ+ÿÆG5KÃ0-´d M1¤ðÐúLæ¬ÑuÜ}Í|¸l3 µl\ò9~ü9c¦)©þf5Nù¡”ÀSB¬P(¾‹ž±kÆ­Id ˆ±'^‘¯ÝÀœgoæÂ¯&rp¯)ð¢8€tÓ´„#ˆ–ÅÜuýBš^ÂWLÀÓè1úln¹µ‚›îz¯ýìw|E×Ç¿³·§“B¡Z^)ÄRÅ®("¨X@l(ö†ýQÄ‚¯]QìXPQ)ŠH‘^H#õ–Ýyÿ¸7! ¡è£B|ö÷ù¬’{wçÎÌ9sÚœ9{O‡”DlëÑ  ¤N¹JÊðAï+PQF9 }& EDó³¹û‘MÜþà+¼rû•¼êoDúéôVP”çlÄ_ [wcjZ½án©II¥ŽN8†Mã #À¸™¹8ð3gMeã¬{8س„«RüÑ]¹jêHZºu~*/¥Ô«ï÷¥Nyi º´n=iÿæÜså0žˆëÏ=ObêÈxêü¡|Û<žpU@¾#œŒ€Bá//¡¤¼[Æ0î|Ä`æõwsÕõ•å:Rê„·<“; 0}ê,.™àgö¥—1ä…¸õ’Ÿˆr{)* ç’Ù3£³Ö祬¼]V©t‰·ÄK¹î˜&t?¡13ïÉ€ù]¹ü† ¸ü’Ž<0ë*F½’L„ÊÂeH!0ý•”ì+¢"ªS ÛµW1~ì>xá^†6ϤKkç§ ã«Çz0õþi\þà}ìšþ S.|ŸèH¦n§Å€‘L8®+n-Ï>Ë£ý°>$:B†ˆ¥-X°ðW…ë~pî¨wMžrÝŒYðz½ÿÈyJaS®^ÆÚÂZDsºwIÃî/#wËz¶æ•"Ói™l²cW1ºŒ£cŸ¶„Wæ³îçÕ”F¥Fy^6E~;ñíh—Ap“d ŒìÍ›È.('`‚#,’ØÄT2ÒqŬ_ö+®8š׿LrÖ­eK^¶ô.tk‰&ÈJvoÚÈŽüRü†ÂQB*Íš&n‡}›–²2b“[Ò.3 »”u}¼_—’Õ‰n­#PRÃf±þ×Õä92èÑ!žâkX¿«ÃFróLZ7MÀ-ìY·Š® ²šÆ``ø‹Ø´f;aíºÑÂSAöæõlÜY@¥Œ§kÿã‰.ÙÌ/kvR.<ÄÆÇâÖ$ΨÆ4OdÏÊä4jOç´p4$ÅÛW±.ßÍqYíHt–²í÷ulÍ-! %Ó£1šŸÜkØ”]ˆOÙñD%’Ѻ)Qn4Q2Øl’]_<Ë­/màŒ[`t'ù«~dÙŠÞíƒGÖ…Û×°6ÏÎqY­qïÛʺ»)7QÉ­hß®)‘ lïN¶ì Ò¢%  A%›–­Ä׺'beÛX»vEþpZß‘ŒðRÖý¶1¸Gž@ZcÂm;7#°}=[*Ãi‘‘J”DZw ?®.¡I—î´ˆ4(ÌÙ̺MÙ”èÑ´ï–Ez¼›’í¿³nËnÊtÃEãf-ÈHO%|Ëã ¼hW¿x?gdD°t± £Û„ wwOÌ™£?ýÜógÝ*€òÐUTÞ£¯Œ• Uq fH£$¦)ƒû‰šT†*¸o¨iAWÌ4M@C³i¥J!´à^²’&RQ]ôCí…V…‹• > }Ú‚m„’”4[è7¥‰©ö;@Õ}©jC)dÕÞ°ÊîViÊÚE?ª dh6„21«ž6MC 1¥ªÕ¾’©$J‰Ðƒ} MÁq†ö<ƒÏ©Ð¼i¡j\ûˈ*%Q„-Ø)Õþ½f»: -3øk5Ç­ªî •”"´µªa«ÜÄüÿ¼ƒï¸Ó9÷ÔxhiÜžhB ùUÝÏмÉàx«hœƒPá» aš¡óËûÇWõŒ¦iˆª’ *X­Kš4šÒI):û Ò”H@-”t¼¿j,¢º:˜BIМ«ž½“Wµ“¹áœž4ri–"¶`ÁÂ_ªŒíÇ@oƒ‚Mšû+qÕPJ5OîšfM‡^!÷€2Í&¡¦ò=Ø àšmqàoV·Rçó:Ô껨3>BF‚ªÓ/)kôÿ€öEuT­¾T!EV÷9%‘fý1ª>T÷IÉ®¯-qˆqï76„P(%1ÝÍ9~ JhØ•‰RŸ«1JÉPå³úújSí7”ªæJ™fuþØÏÕžÇ*û'4yTÛ>¡¿«È- ÖßÕs¤$ªÎ€¥_yþ-Ü!ì8l–"¶`ÁÂ_»5þKñ±´ IDATk*¨œ„ÀîpükÇhs8±YĶ`ÁÂßë}Æ,X°`Á‚¥Œ-X°`Á‚K[°`Á‚ ,elÁ‚ ,XÊØ‚ ,X°`)c ,X°`ÁRÆ,X°`Á‚K[°`Á‚ –2¶`Á‚ ,XÊØ‚ ,X8zP‡}×ý_û±8 ÅÅEÁÂþOX°`Á‚…B÷,îuTJûsÊØ0 ¾^ô-Z¶Â”¦Å!,X°`áo‡&4r²wѽg/’’Sþqïø˜|QDL£F <é‹;,X°`ÁÂ?†o¿þ’£¡>v•q•Eâ÷û,î°`Á‚ ;œN'†a=ÏüXžu´L Ž™4­Æûš-4Øl¶ÿ©±þdŠÍn,ÙøWBGWÓï3¶”qÃRÄÙ»vâ #66)¥5) @9mX¿Ž¦M›cwü»_mع}mÛgá÷û¬Ñh³ÙømåÏtèØÃ4¬$׿H ¥Än?zëàØ^–2n8P C×1MúS"ŽXTì.'B÷0Õ”JÍåÂ!øt…å˜ÿ1šüþ Ñû/_kJJ@?þâ±þ£<¨>_Ș’ÿæÇ”»ËÍôá7øŸ^;¦ie×Qœ„cÞ3zÇ!@šRÐlØ4Q½È¤T›†&„åMEë2¨Vƒ«\I…ªJ3 %TÏ òmæÎ®ƒY{óZœCe¥ŽTMÁFRaÃVÁK'4æî?gÍŒö(CZ¼?ͨ"Úþµ¤¥’Ó4륀f³£ Õ t¸¨!‚v‡ª!'«fî ” Êdeš˜ˆjYs(|¹_*wŸø«§ÿ½‘BTt g¾–‹Ý©!v =ÌIÝGóÂwE»¡!´—Õí iM„þ¼UÏØªÿ®ù»5ï!å °®ƒ]Ôý[òsr8>¦1 ‰ÄFÇCTLù„V1ˆMH¤Qˆf1q Ä%$‘~Ü`^ÈuⶉýkDˆ V­QkÝñI¥j)™Zß M®cRz ½ŸØÛc!p„ –ßz2MÜϺB}?ÿ Q[ Ð ;™£ÆsIÏ8¤TÈß×¼o¿,ªúwSÍχ—9õް‡9XuÛé4Ž!&>‘øø8·ÈÔWVQi³s:ª/ÒMDZ“Û)œ€¡‚†—¦Õ¡¨óyuwÀý5¿ÓhK„ ‰êq‹úÇç/^Ïí8éÞ-¸Âœh”³tÎy4MéÎôÏw×u~WÈoU}< 8&=cQ#´Š+¡›+{¤›wÜÁ7g¿ÈÀl§’aR’»‹\¯‹&i)„ÛkFYNOánèy|vßD&Í-dâ;ŸpSÿd” P´cSH.»ˆmÜŒf©ñØ‹7³*[£efá¶ Þð•°#»„Øæ­Hp©zå¶’ê˜ðŒù0uP1KPÁÐEÄÀë9ëÝÌxò¾»­+B…l6‡`û[qË‚ÕäW˜˜^ƒ„ÎùéÎ8©¹Ÿon¿ˆëóZ38®ŒõÛ²É/q0pâ­ôʇù_þÂ†Š¾“äþ+¦Q´ô%n¾óÖùQHì©}¸ê†ëÙ£1viZB¿­j„æêìA ÍFR“tì.'®ø(\®0âShÒ$!zÉZfŸÚ“5weó~§U|ÿã2¶nÛÈ ýŽÓÓ›‡ÿoW½Àͳþ¥:RI\ƒ™ró†÷ß/T¥²ò þѨ¡kSN—›ä&é8Ëų>¢QÇθ w>b:;‹yW¬cëÍ©lýäÿ¸zÊd·Dæ®aÝæb2¯˜Í¸˜yyálÈ)ÀÝr³Ÿ¼ƒS2ìì^ð÷Ïû˜u…:ÒëEKìÉ”Gdl{øù¹ú‰Å$duÄUZ€Onã›%mX°{§†ë`äðÞ½x±üdžzt íÃjcM)šÀ(ÝɇÌã–7й䩹\×/¥L ~šÇÍw¾Êïû($Ž´~Lœq+§û^`øÐ¥Üþã{\”†R^6|<‹KîËçöÏÞfdb_=ÚX…ô‹¦>Œ2®}™(ÏñL˜1œÜ§oçí]—m¿20:QÝ.àùŸñóŠ¥|ûî=t*}Ÿ§_ù?vÜÑá”o( ó’ûùàóyr¬oœÎâ¨1¼ðÉ·¼;-‹eo/ä·œJ„¾žÇ¯½“œSîãÓ¥¿²òûw×t'¯½ü6J@ êéßÿöE=ûrJ)””ºŽ®ëè¦DI…iÁ¿u;:†pMÑñ4Æž;’®§\ÁsüÀÒ¯¤«}M½Ò³gÑòU¬ün>£=+yñÏÙY±_)¥‚!Ië:¢«fÆ{}ߺŽni†’èþ‰§ÝÈ(ϧ<÷yFÁНYQÑŒáý;ë¸cœx·‡1öÉøüë˜}z?ý$ßm `Ó8ºü UJY“7RªNòO‡ä~-Ji¸£@”'3î¹ùö»ùœ»‘w>]B®_àŒlD´[CI“ÂÍŸóèßÒqÆ;üøÝûÜÖÏC¥]â²k(4Âc ·IP )ÁADXnµç¦ÜʯÇ_ÏÛ‹—óËŸq×0>yjßïØÅah¦…ÒœxÂÂñ¸¹¿.f½ßF\r§ƒ@"sèTÞøv)ïLèHD´‹(WpN4§³$@d«3x佯ùü‘þ¬¸ÿZf¯jÉ/~įÞMVá¼ôÞH\­Nâº9ïðã²å,ûöM&4ýŠÛïYD™ÍÓ㟯h{Ö ¼ùå7|ýÑÿ1.y1O,ÌÅá”nYÅŠÍú <‰VÑ SÖ‹(â—×ïäÞ…¥œÿÐ3LÔ aJ„oOžÅÞ¡òù²_YùÝ›\œ´‰—ç½ÅžŽã™Ðf snÇ ½¢€•Ÿ}Kì Ë89 ü†<8 8Ú©é ï<ƒ”$šÊå™§òøcŸÓãTZhÑHå&µ¹yOMcÖïHågׯ¢ãgQøÁWr~ßD¹4:6„VÏ|Jï1gÒ¢‘¢ñ H¿‚‚ cû‡¼¶ÚKì÷Ï0qù MP¼ög–E¦²;ßO‡H»å…Ú9ò;jy!ü~?FÀGYé>*"Âз¾Ïkë*IýúqÆÿ ¦M°wÅÏüÜ´{JÖtÿC4UJ"Â;qþ¨DÆÏ]@áÈ‘,ûn%Þ´N\ µiBúèq ŒóRáuӾ׉¤¿ÿ:ÛÖíE´Há¨ÅªÓ êdñ‹já¬BeÂæ õð±t¯D7iÓ"™E%Å”ùjz«&…¿bkD¦ŸÓ…H[€®cÆÒçO)F´Bs"vÁ«Ë„¿Â´K_ÆPàÍ[Ϻ½‰¬ßVÁD'¦¬ã ×Éþv®­s?ö"m~r~ûŠ~¹r`þ·DtÈ ™8}åø´ÚýQ¦‰§e7Nz2­âa| ­Ÿsü¸ éÕØ…דEï.Ѽ¿c;e²ÉM=üôòC<ôã6*¥†?W'P¹”<Îà ²ë`wk…Ý[J…=‹Ë/Ë`ÐÓo}ñxvÿ¶‚ÍF3Æ÷ÎÄcšCÙ®õlJËfIx4“€r`n_Àü5^¿{š KÃÐE¿ýÌòøãØR<Ž‹®èÀý¿Éæ«ï yÏR.µsâKˆÑýTã+ì˜Vƺ®W'† (éhÂÐqçòî3?ùDœv0¥Â¦¯aöÅWðnäP.Ò‡dwËæ³Ò_O„7rðûñ£á7œ¸DÙ¼x½ +…BG7 üE;)Õšpþ¨‘tqè ÄÙ#™Ð’¬X_@Zº¸fˆEÓ0¥Dašèº~ ¥ C¢Èg,d0ÓZ*Ì–7«¼gSÑ¢p•Z3†ž3Š,áÒbøH\Émiaò»T(3Øž2-¢¹]:‰€@×õì› ”®aÈ "6 ÝpÐêÌóH¼d>oýКìÕÙdtC³tL)oäÀï `˜JÓ°£¨¨ÀÐ týèÔ›7 @JYC®B"¥ (L¿S×1t‰ÐÁ¯K”21 C7Øp…›2‚{˦N@׃޴i øJ‹ÀÕŠ(ÍO¥Ï‹ÇE¤ÃE±ägS)”4ÐuŽôÔ‘Šs(6ã9sØpúDkÁ“#BpY£TÚ4“”ûôZ…)ôZÕ¢BW†‰áN¥mVGâÂÂ8iÄduêJ–ÇËÊ€Âáaèhš±¿ßºŽaHš]â÷VbêM‹&Áå§ÂÌ%HSG“;yiÆõ<±5•á§¡E|û~ÝÍš…eTt CáŽt&€ÂT6š¸Š6=ÅK? ¥Éò±µ¼.i>¿¯–¦ë†3ŠÎcoæÄ’W¹iÂÝć*dCN"©N›ò%*xÜÉ41•YΖf(¡SI¤R8šAÉ6Ö*2cP°‘e¥˜R"•ƒp§¤¤<€RN0Ê)©ØG…[G$dÒØÌgw|?F ¡2 ÑlvlBðyÑu›mâVÝ5fšÒ`&œÀ9^JF´»Ã†ÄèÁ¹WišHS 0ƒ{ø*¸^ƒáúà÷¦”ˆÐ˜¥)1«ŽºIP6üÌGKòpó .=©N›wÜG©!Pfh-ª ¡cš ©LDÒ)\Òëî¹s>*¼´»j ÉÊGÀ”‰J#ªùn:'‹¯çÒI¼ùÜdÚ&w$E-¤0õ$F÷”TÉe©ã øñE `âi&—<ö:Qy«h:úaŽÓ*ñ›ç;!Rý"E kϸÆçŽF ~lXÎÊ`":$±›ÖUàrJvü4ŸGæmÆí¶UçdP«=YÀ±ß”éÇLÎôásÇœÏ#_o$/w ß½þ½ñ;*ÂÚs8m÷ÿÛžH¡mYýå\ö$t¡gûF(à *+›ƒòOoàÆ×Ö»åæ=óv§v¡cÇx Ã<úù P‡O$¦Œã¤ñ)|gSžýŽ­;7òÙ“wððÇù :¹±­:TM^^r¿lÁFB«!ôµÏCw½Êï»×2ïî§Y²«‰t¤Ñ§“ƒ¥/.d¯ËIö’ùø³Ø'Fì©Ü|~,ï^z>³®fwÞN~þäîV–•²Rò95U‡û‚g‹mš@…ŠYȪSÿªöú¬µ^kæ{„êÔsˆ]¤„°$]åüºaØ]ø7¿Æ³Vãôتfªz~ߢéuáIä}vKdg†œŒÔÍx²ª_ÒT¸3NãÞ'ï û¶Gyí<²ã†qË™’ÿœw~³™¼ÜÍ,~íq}çvU‚pÓóªsq|x ÏlnÃE#[€Ï8Bù%,e|(e´’B“¥Ù°i¡dÜ´ê2g5‚€éÇq2sž:—-“;ŸÞ±m¦×¥ƒ7ƒ¸Bذiû-X…<ÇZ%hh6 ”ÄÐÃ2çKž>»œÎîNfÛžŒ™õ!ù2’pG¾YWµWU$S# hÿUµÀ¶ªó†Õ‰'€Í† ûMOÅÙ­73íôNdd\Âââp†=µˆ‡åpûÐ.d¶ëÃ%|C…ÇmSûϫбë:bšUiãúù9$ü5¶Pa¥$Êæ!­ÃY ŒkL‹ŽiaCÙR!uAæÄIØŸ96]Fòš÷dn¿}£èæÑçͪµ^ëS’:üiÞ¿½;ßßz]:õdô½?Ó{æÓÜ4¤=lCU…NªÚ!y*F¡ ¤‚ðÆ]¹öÑéÄ}q ]ڜ«¶ôIOÃ…‰i†qâOrò¶©¤¹SùÌZâ:$ÝÀçµqÂìym|4/_vmÛtæ´IϲÞÛˆXªN<;@>VÉH)QBÃf F<¤’µå'¡B:5 «ªuW¥Œ5MÔHN¡Úå¡¶•B JçñÜ|÷儽~1Ç5K£ËÅ_Ðýú¡Ä(SJZíß õ£QÖyŒHðßy8ÝõðÄþ~iB! [ó<ûêÝ´ýé&†Þð-½ÿ’'O/bö°®d¶íÅØÙŸR¬"s(¤áÇÑv,gèÐír†¤˜øŽ€ïŽ…=ÇLsG¸kò”ëftÈê€×ëýÇk¸êºÎ·_ɨ1cÉËÝ]ë÷ížpÜÊGEU¥aÃérã²›ø¼~tS¡Ù]¸]Á³RšH)ÂÀçÓ±¹ÃpªÞ€Ì}°9ñ¸m*½ Мx܆?rSBÃátátØ®9Ý `šÖ~q={Æ{òr‰KHÀãöà÷ûëg8» S ûƒô †‰4¶@%^C…èêÂi·!0ðVø08\nœv[¶Ê ¶a(ìž0¦—Ê€UûÀf³±mëfڴ뀷²ò !dÍé!Ì.©ôJ!ÐÙöý Üp×÷ŒøÏë\ÜÜÄgj¸]ù<Ö» o]ôK'µ3¸åã÷0Žòö¡ëìÍßC»öY(ׄÀæpár؃YßRbü 3t6UÆ-PW*6»Ë…¿ßÀV‹šÍŽËí®Ùñh¿3©Ç¶Lx•çÏlŽÝfÇåÖF¦D ¤?¬*ôú_½(½µžW†ŸŠòšû©¬™r§L¾JÖ›lK¡jRü½Ò}TèuŸ5ñ×$„2ð{ êªó€·‚úr§•åX9ÕŽfuCžõî·ú+)ó‡lw£€åŸ/âã·ÞÄÈšÈ)­ìüz°¬i(ÉË0t|åèú±Sš´n9ÌznÀð{1üÝuÆ_^VótŸ·Zž˜µxPa*Ë ìH—?˜ e½Kiêx+ôƒõÝ_‰î?šÕS›ÚðUR~v€#Pû³@EYu¿MÝOe-©SY¦×‘‡5Ö  ²vƒTÛà•5 }üúÕ¾}÷1v¶ºG::ñù+©Ÿu䀚ÏêæëÈe¡a•¬_¶’ïÎ䛸óù°o8¾€ÿˆ§cÁ¹:¦•±” M³\УŒ¥¬.%mÕo4“¡ øC)ãšÞ•òïäƒçß`Góa\7u8‰º¿T€Ä0œ´p2ÜÁ}ÊcˆªBµU!Ùð—Ñ0Úxñ©á¡}å¿` ŠR4 ÍÌã“ççñkä`n™u iFe½8þ+ef+æÛù/òi^7?6•6"øâ™#wüŽî|6EX8Ö!¥Ä† ½½É¢Û±Ó4‰ŠŠÆçó4›º®wHXøbv©ã­¬À§ïÿ.à`èý¯0,PFù1¶e  ADx$••ÿ,o*ƒJçßû(š¿‚Jý¿;iš&1b©(/?ÀS>v¹A@drû‡Ÿ`W&þÊ *ò¯U|Ê "ИñÏþ×jÁ(j¥~d<¨”Âéta·;ö¿ÙËRƲ2Žˆˆ¬NˆÖ» ÍbÅâózƒÌ‘ÐLT”ì;ˆ¤ð——à?ǪÙlDFEQQQþó¦_­÷G³¸øJKKj½Á©˜~T””Ôˆ±ü óŒÄ[VŠ÷O8}.·»ÝŽßïãheU›/Š-›ÍÖÀ΂E/‹fÖX­q4DØìv4-˜=n)c‚ùeee,xç- C·8Ä‚ ,ü#N`ii)Í[´°”q0dáááœ5bzÀÊ‘µ`Á‚ ?N'_/ú|µ¶ÿue\í‡&Ç‚ ,Xø'p4ÃÿÖÆƒ ,X°p´ k ŽÕ5•k~¤þÚmþ#øÚ_[ǾþìÜþå´³ð?ÈRê}ΚÇ?ì €Z¼kôÀ×x†„­Gž”^§‘ªZ³õ>/IéÎõ¬Ë´l›I¼çàý9d[ƒÖ„ ”îaݪMxÚöæ¸8[í[”B¯ÜÍ/K·‘Ô«/Í< B87ÐSýaÚ)ÄíôÈŠ|lùökòš ¤OºëÐmq„‡êåMuÈ£3Š7Žòz«^_5æé˜Çß !^¯—íÛ¶RQQqÐy¨*€“’ҘƩ©ÿê,h)%¹»w“““]]þ`sNF³ Á×ó<6=ÜTH¶/šÇíŸÛ˜öàÝ l"j4¥ðm燯&²Ïpº%Ûþôp½ykyç©ÿ|C”1@eÞ÷Ü9áqNÿ| ãÓ‚ÐR•¬øð#Š3ÏfHÇ(|[¾äå…Ûhuæ¹ Èˆøí‰u×À®O_às†rÙ©‚ß…R¢ºêÖ_}¾ø·U+YýÛoDEEq°J¡ŠñÓK¸äòqDDDðoE àç·ß ))%øâ–z ·Ëß´”¢‚úöëoiᣌCØùöÌÜy##‡‡ÛæcÙó7r˼môœtNÛ‘yeuÍ3!Jùjνä7¹Mß›ÓMx¸ »và’3Êv²ð™gIk3’nɇv±åUD4íÁ5÷µÂž`?° !ð¸\„GFàl@¶Q¶›O»› çdHÇ(›2cÊ=ü–6š[‡‰Ã Òú¡‘óé‹<%¯`H¿ÖG¢epEFᬯA›ÿï!ïБs»§'î%# IDATžyê|Wºî+žyì7Æfô&3Ùɦ—nç–uý¸æìæ(_%;Ö-çã·^å½aS˜~ñ`{D5«¨Ø¾’ÿ»ýÞHÞÄÛ¯ÝÏé™Ñ€dã«·q‡h[Gè9ÿ…ùG<÷ú«n[2âq„ÈÎÎ&«cGº÷èuØ{ï™uºþï>ªi&ÅÅÅLš|ÝAïY°`#GŸËo«~eÍêß, Ü•±æ #ÜãÄe3Xöøå\óR £ï{š‰ƒ›âÂ`Ë×óxü¹ÙX¤HïwÓnE ›Iþê/™¿à')ñlZ´µMvÃ,&œÁâ›.äå]8nÌÀˆTFLšÆ9-wóò ¯òõº½˜¶zŒžÄ´±]ñÔ’Á%½ûƒLzÃÅ„û® lÖdÞßTFô•ƒXànÉ•wMgLÏt6¾ÿ ¾ò»üN2úŒaÒ¤sÈ ?¸0öîÝÀ‡/~Hܘé o­!(gùËððÛË)hËYc»ár4°à Ðpz"ˆŒtafÌõ×ÜÍ®ã¯äáicig3‡÷˜Å¼/·¢Û0ìªIŒ9¡9nQÁ¢™SXÔi,Y+çòÚ²|eÉäéW’¹v.s¿^Éö’»¶ü´ˆÁÌyc*ê½ûyè½¥ì(R$´ÌÕS.¥O³¨„°*ÝÈK÷?Êö¶2Òùÿù-ŸÜUã9ù‹0܉gðÔ+×иx=ÿ÷؃¼õã6ŒøŽŒž|c»%¢Õ¡›°9ñ„¹qh¡b5NÑY0ý¶ÁØü~¼eùüöáÜñìý¼Þ¢)Nn…ë¯P&„Fd›¤ïXË›ŸÿL¯æ‰s‚ÍN¸Z¿;x“—¿ßÇ©ãÆÑ5`sÆÝ‹ëú9\ž¸…g?IQ÷SŸ=Ï—ù©ŒœvãÚeóÔ±pC­OžÄÌIƒˆ[>žÇ;´Ð²ùø“%ì‹ï˵÷ÜBŸ’w˜yÛ ¬2›3züÎ?±.“ßßy€‡æ/&'à¦Õ‰0qÂÙ´òè¬zéAÞ53h𳄅ߝ'ñ’yæÜ&½L)÷¿‚²>Ï»êsí$¤_µ6ªÆ]s^¦L™ÂÂ… q8d4kj.9À½h8›ÃÇ7³Ïæ¢g˹øÙ¹LÜ÷ÅãLñ:ªÛy\7y$á_ÝÊyW¾E96Œ²Ý|÷Âs,\«1ræÌ©1÷º[ùºØI§ËodH“z\ù0sŸ¹ƒs¶ rÛÂÛœÂÕ×ÝÄÄ1Ylzj<“_ß „Üo¥áŽä¾;•³o_KŸqÒ#9–ãÇN ótNòsŸ¹…Óº¦±kþ•\ôøï´=‘i׌!eË‹ÜtÓ<²C!U— —ç³véR¶¿ÝòÒLx|5íϽ–©ç¶`Ùì;X!Ý8–6F³Aáªw¹éš»Éî2{n )b*ùbÚ9ܼPqÆäë97ËËK·Ü«ßíy«—0ÿÖÈîq-Ü?îÞyàž7©ìy6gtkKz¿ ¹ã9̹ÿ"҅⽊.#'2ãÆ+èì[ÄÌ»_eõ^Yí ¡¹‹—n™Àüìæœ:¨ íN?ŸÓK"å”É<ôèc¾c.ä¤Ö~>ÿi ¾ýžÚ±á5Ñ£:rÁ¨Žìúð-–í*­ãW*Ê÷nã×Uë)¨.PÎÚï¾ç÷¥ïã·æóâ¼ ;icÛñÒm“¸à§ؗuWíÅιӸõ½b@£bï>}øN^ÞΙãÆÑ§â &\p 7Þ½˜f£®âìV¥¼òðÓ,Ú;æ]ÎEOn¡ã˜ÉÜ0a1kþÃô™¯Sˆƒò]kxï¶{X;„Û~„kûÄþm|]3[¿Q󿹫^wÜ7ß|3¯½ö_|1't«†DÃõŒ…ÃXr#ã·`ڢϸ:Ó’ ;YøábÌ/åÚ+FÓ"RÐ'£˜A§<¼]£8O“ØštáÔ3GÑ·M´™@Ÿ‡/`Áz'¶Ë ÞmGKkM³æÁöäÉc¸ÒV÷îO÷JF¼ôûν›8Ã`ýÜÉLžŸÍ%Ï=Ã¥“ph’¨”ty<ħgÒ¼…ÔJf>³“ï‡É½âèÜ,œ[o|‘Ö_Ì•™ ™ 4› MskyñU´¾ú&ìB¸Í ©±Œ3îØ‹ je¢•näóbà%Ó¸wúXÚ„‡¾ËÿˆGÞÙǰ7å²în”NáÎëùøëŸ8ë„SDõ»– C;ŽóôA|ûÜÖé£IЉÀH¡EëLRÂ(EÏ«gÐÛœœþítÖ^ó«wì%+1HSØÅÛS&òlÁpžyþ::F¤îÄ—NëÌL\ {Ù;,ØÐ”ëޛƠp``ôeƒyé›lÎj…ã°B6N­Š€¸SižšÈû9ù”y%¸µcÜSR˜AÓ3.cØÖIÌyo5ý¯ï~€÷¬ÙjC³Û°UÍMxcº ÂÄQ­a°ƒïÏšBöÏ3áÜîDÚ½écnüøGÌá§¡)ÙdW]v1CÛÅ`6ßÄ›ƒžGݲ‚ñý# tÐX?s>ë6ìahë|î{z3§?õ»s²RÌœõ!_䌠¹Ð¡ÃùŒ9¬$÷þ¤4KÞÿ#k`ÅŠ4nܘƳxñb^ýuÎ;ï<¦OŸ\‡Òz÷xÃõŒ¥‰LïGû°ÍÌó EUŸ—å°³0@ÛÖMIŒ 2‚'£?Ýbòøuc%Bh„%Ä—z Éa>òËͯû«±ï±ãsnÛŸiMHMM¥û„ïQÞ\ʛ˞/`ü¿3æÑG¸´Km8*ÔZðƒÜߨÈåùHMM%55•6.gA†¿¸òHâ=°o[J£èÓ!CCÓ$t<™šÙ N(”;–Äô ²XÄâ_²1Bßè»–±ã8åøqåN£m³d*öî¥Øg ¤¤M ±«Û‰/e¾ýµú]µÒdž·2äøæ$'§ÚùjÞùr=åz ä­J~¹w$wü>ˆg^ *bUËG 3MÊw.aÉOïsAëÔýZ2ñ“µìÚ^\Ý÷?åG5$º)ƒ€+‹ñל@ޫϲx¯÷)4Wd$MÚ…’1¢âw¦Ò93ÆÐÜÄ5‰À()Àtĉk•NR|àˆK£‘#™N™‘8£"ˆ 7ñù÷+[¹<{f›êµ•uê5|”þ}•˜RÔ!ƒ¸pgµ‚°ñ?›¦±rå¯ 6ŒÙ³gSPPÀÝwßMLL ÷Üs5Aÿe¬L?2u ¯~v-¾šÌ°ë?$ÀfCCÖx‘¹40¤†Ý&ªµºaUo°i#^?‹%)ãøtÍ.rrrXûÊ)Ho (CÙ¶7=ÓJødáOä”é [!$¾òTî\²ƒœœrrr؛ǎ%o1©WØ‘u64íÀD­¡I¥0‰œtÕ,î9»þVÞ\‘‹›M™ìãž –£ í³ÕòRÔ?wÞ]osíÔÈšý¹y¹älžÏ˜¾ Õåí”ÒHp&M‹¿âÏrõxK"ô©\´ìuß„h—““CnÁ>~Õ&ŽH§Šž f^*ü•éÜ»|?mvçíaÇâ—¹¨@¡Ù¬ýÈ£SJ:u:ž™3gòþûïsâ‰'òóÏ?sÛm·áñx¬sÅÿ ÏÀð!2ÆòÊ{·“´hÏø˜"WSÚ¤E°ö—ÕlÏ×QÊ oÅ~¨hNï¶ä¡\HaÇ) |¡M¼òlv”DqÒé}h-À(ä§OWP!ìA/Ú “NâÞÿÜM‡_îåª>fG… ;6Àï í…¤ô¤Wã½¼:1ye¤’è•¥PaÌ!uª”Ý–vñ>–þ¶€0Èýå+¶švl M!K¿£§Üð3OØÍSg±à·blÍN¤ƒówÞû*/(o‹~gùﻉmÒ„X— ±?ë´ ŒÊJŒP¾wû";1bH*(Z±’m; Õ‡c!¹ßtæÞ7€ew^ƽŸí$hNÙq9À_^‰¡hvb[ô ºðGÞøj¦R(3@i~.ù•F0)å°zLb 0u?•eù¬Zð&‹Ö vkK¼çÓí˜öŽ!«fŒDå^ÞË–!Þ„‡Eàô•²oŸ\ž›—³©ôpÃêO~œ0eÔ‡ÞI»™÷ò·äWè(% T”PPŒZX^ðÑ5¼ÆÇõ×_Oii)‘‘‘ <øo9^öoBƒÙ3–ºoÀD™ Wæ%<û¼+'Î`œs&7<…ôÇÞæ¡{KéžîcÙ»“~Áœ“ùëtüþÀ~‹‰îóâ7w<™mcøhþC<½¯+½z6¥_ÏxÞzc>ó‹:VúoÿP‰Ý¦Ð¦Ž¯¼oÊ îù.®=ïVÆÏòóðM#h›B‹“…/=ÌÓ[:Òï´ÁL¸q +gÞÃe+èÑ< ïÞ\J\éœ5þ ºD4@ÀçG7  _Ü—+_˜ËsŽlZF”òÓ[«ÐE£ãi T÷ûø}@SÆÜû$þ)ã¸åšéø¹IWvdÊ=“¹uC_ÜÛ¿çë¢æŒ?¹±Ht¿¿¡jLNÀï' !£s[<ÂÜJIOhÇ©ƒÓ'åVž}ðMŠ2%k¿üÍyzµGeø¼xuIâ ™<:ù&®¿*9›‰CZ‘Ù»¼<Ÿ§žßBJ\;N:Œ«NûŒGîŠeoR]^v­ÛAÚå·se§ØÚ©L¦Žß¨6 L]§lóû<ýÄ:”¯‚ÂøeÍF^Çyý3qÃ1/˜”i¨±nD—©LëÙ‹ ß.&=5øaJæñdÅ,ⳞÂ~B…?-b··‚,©IÀïC™û×]ÀïC¯aKÓÏo„ÖwÀ@Ö0|^Õ¤WÝïGê~ :2åæs¸èŽÛ¹¡äº7‹¤"/‡ò¨LÆL‹0üøtãˆ<ÔàËÃdSÿ/âÚk¯¥¤¤„&Mšàr¹þççãp8à„nûvmöìÕ»_RR†aüã'¥dÇöm´ëUG8èxšw¥oV!ð4îLïö‘ìÙYB³A£Þ»1û¶mbG¾NóÓ®á–IˆÁÝÛ#’h“ÕŽ”ðà.±©ÛHëÚ‡¬ÄRŽkŠÌ]ǺíeÄ4ïÉð3»ãܽ†ß6í¤XÇè«N%-®9]º¶Ämš¸2èк9âZsê ÙõëVÂÚu§UJ#g$P±ów6ìÒIË̤CÏ! <>†¢m›Øž·€+™N}еUnqpÅ%\Ñ´èx<Í¢5"ëE§F¬üy9û4:Œº‚~MiÓ­3©î£QÂMZçž´oâ-–ãOìF£ÂMdÛÛ1âÒsÈòä³á÷â²3ar…V³òO=m sü”ÃüoK˜xo…qÈÒ´õ”º­§„éÁ›þû<±åË–²ò—Ÿ«`•R”••qñ¥—þï­Àåóùxá¹gˆŒŠª>c\u–¸î^±ßç£]‡,zõîsLañW‹HLJ&9%å/ÙßB»;‡'æÌÑŸ~îù3BZ”‡®  ð6˜r˜õY›‡yð€ÅZ÷¹?´Fx¶Îßõwá@˜{X4ïQ{e·£æIE";L`î§yDã4„hÏáhp¤ã;ð¹?¦Ðþp[GÒÏ?Á›Ç|ˆîÇôGÆQß|ùÚª‡Ïeˆn¾³²:OeeÅ!¬î @OHHÄãùw×av:Œ<ç\ò÷î=”TO©Mš`a?ìÖüÃÐbévÆÕ<ØëBT´h[XVÙt Ž}(¥p¹Ý4oÑâ?÷oÝ3Õ4¤¤d’’’­ù°”ñ±¿€¢ÓˆN<èMÁY°`á ˆô9k-eláŸf<«@ ,üÏÁ:oÁ‚ ,XÊØ‚ ,X°”± ,X°`ÁRÆ,X°`Á‚¥Œ-ü¨{tüˆ^±ÿæZo•úCÏóó_Œ­Î³õͳ ëªô9kÿý°7jýåþe{èò@ù^¾ý~ÊÎ}Œ ]Ý0äA3­…@àcñmãYØu6œ‘Ü Ú!3È…@°§ŽgéiÏ0kpô õ`4É/OãµøK¹ûܶ¸4+ý¿ŒG´†þ@õ·zŽêýΖ !((Èç³O?fO^^u¥©ú„ƒ)MºuëA¯>}q8ÿZþ1 ƒ~XÂO?.ÁawT(*¥HLLâäS†˜h-¼£ŒCÂaíC—2õÝ tºçcîíÚ•[¾åñÞ vôŒôº¨t²žÇåc&7ÒƒÃáÆã¿Ï)Ä¥óž"Ñ®Q®ëc¯~~Ov㖫Ϥiäá»—ÃO Þ'°{>`Lÿ›ÙîÆ®9p»í˜~ºi¨Œ`ìëóÉÒ4ªdYö7/ñøÇy tý›n^$…«äÇ´áHËÀþKè… °sù‹\qþ£äÕäe¯S)„HáÊw?âŠô?²~MV={ O–žÀÌñ§Ñ$âß[±|ñq |ò!=<›fãåys騩3ÑÑÑÿZþñûý,ùþ[.½l¦4áœÖ­]Ã?,áÌaí…×`”q¾½»Ø¾u ¿Mš«¾¿‰f€ô—³gW6ªÌøC–ù‘xâóê÷lÄ·¬Zãw»)úb·½kré—бqBóÑ*ƒÔ{ŸÞ¯^KöSX‰æÔŽÀ¿h6;¶èùÙcz1ã?OSa·S¹î3æ<÷­Ç\Çðž‰HÃNZóÆd<8Ÿ!UêÕWÆž¼B5ÞG{ð™› »åÿ¥"!±õPî~!3ÈËŸ=Ê­ï ÆÝ| ’=[8-›Ôã)S»vtígÃ(ÞCö>/¶ü^·v|Cƒ·²’”Æ©$'§ö^ÃÐQRþ«9G*…˜”tØ{ssw³wïk¹Õ@ƒ1Q•a>p<ýòŸeÆ{…!QLhчÞòÉCœ?¨©©i’Ñ‹fÄ!B积dص·3{ÒHÚ§§Þõ|æ®ÙÇŽÏïâ”¶I$´>‘[ßø…ÒЛE„™Ë‚ÛFÓ¹Y)é-9iücü˜'«ßC\ÓVBÃÝ„®ýúÓ§{zט°ˆdÚwíEß¾}éÛ» ñ嫸kpW®[ ò»§yhÞ;,}ùzzf$Ÿqùÿ³wÖÑUoÿì^‹»!†'Á]‹»k)¥”/V¨¡-‡B)Uhqww)ÅŠ{€Oˆç&Wvß? ÄöÇKè~ÏÉápïîܙ癙Gfæ;œÐ ˜þfþ{¯QÚÓÏ j¼3cwÓŠqï’eD+•ë7 ^í:Ô®X;GüÊW§^íº4¨_Û¾oìGÇe ÈáYüÕ§lؾ”>U\°óè̆[)u—•£:êã†gɲ´¾˜3ñÊàý_èKD,òöeO‚«Õ¢^½zÔ µe×°Ö”÷rÅÓ?˜®Ÿ/ãr²€`8ÆàÚåi¿ð"fAÀœÅša hüÁOœÜ¾™lä¯_SÍÏ×À÷9™õ*°Ì)N ‚ÿ 1F2b´{/GstÂל“@§ö™”¤çÄUü}é ÇVÀzç†.¼ ¨Q[h¸·îw.”|‡õÇ0·áFvèÁØ•j>Ýük—cÏ¿°ÿ’0²DFž­Ì¬½—¸|tí…Lþr7Lù‡aá·!ÊE ‚ ÌXÕÿˆït¥ÖÛÓ9q'Žø°ÅÔPG³|P–ˆo³þÜmέ°i*³6œ$³¸î³Ë3Ûf‹C†<ÎŒ ˆ2> xÿË)tlÝ›_ÏÆ“½–vmËç7°èèU.íÿÚq«øzúÄ¢FTèôþU} ùíóéB …MƒÛ35¶ KOÞàâŽé\ø‘ißo"V[›™³»=u /$qïÀ ¦ðàýq}©ÖòC†õê@¾s8}7ޏ›‹¨¦Ë¿OÅ{l0ãÛk2=ukøò×Û S?¼f À·U;jy©ˆºF¢&ˆæ­‰=´—c&šê0¦O+‚JÐap_‚ ‘”=††¾4hÛ‚Jމ܋N‚Œ|»Q¢sÿ¶¸gDž¤¦|­Úh¢OqâÖ¿‘j’1˜L˜MôéÙåî­gÁgº÷m€:æ6ñ–åhjÍÉÓW‰3˜þ3N¸ÑhÀd2’•‘³æ”¸™i›5tÐ §äp"ôöT®Bú³œ7"*ç^ÐL¡Ø LßnM÷šc›p‡(É“:Uý¸wõ7¢A¬ñ ÞU3³ßÇŒøj/•G̤‡€ £Ñ„d4‘!=ta?J‚G(fÜÔf$]ýG5£ý¤Éì(× DÀÄ…å“™ðÇI’Í*,µ"iq÷}ÓÈd³€SI‡‡Ñ´¤¶ÇVçI©û¾4*Ôj3&I†˜+Ä zþ\ðWÅìµ-Q± mŠÖhÿõ–eEüM„>íÓFqX2!É*•Ž2 K`%ÊÿÝs;Q‰AÏÑ9㸠H9ºp­Ü‰%ºzAA³ säy¢¤4ÌÃÌH²€¨ð®^'µ PSuPÊÍîÅ‘€!ìëá¥N‚WÓ’ŒG³aô\Ò¹ß{SN£ÁAÔ‚t”o§nÅ}ÌOüÒ5KàÆÒ®¼³Öœ; ÍeÓ²7j=Ü…+ç|)K`ã‚E– ¿[ËÇ% ˆkÿcTrvzVÌÙ|¤¶÷ÄÑÊŸ+VÑV•÷áôÿN|(—¯ÉÎK“==~\C?§¼›ˆT¶Q¿ ½H¨ìܱ‘]éóÛjÞ´)è!=‡ç,âVH'ê²d{ Zº?Ê]‰ÂÃþž½>­\Š¢@ÁË$ŸÊ*€ÎïuD¿å{vD¨ÑªÉH–YC o,b°háId¦ˆ_ÀDn6‚kKÞª~Ÿ¹ƒ¦s4< I2pó,Gþ'£2¥,b®þÅáÓ—IADÙHý¢l±Jv gð-¾¸˜sqYÈf=‘Žrè朗û¦ðÉR¾Áç”gÏ„ÏØ™íóÛZ©H»Er¦ùÁPXZ((ŽÆØ”‘Brš!{Ó‡ Á§F7^o`àÚ•D² Y ®ÏðÕøó³n´½oZNJ rZfÀ”™FJz&æ{ª¤,R’R1‡aéï¬gÀÐ5ŽO¿Ê.”ë8œw+^dʘù\—¡|ëÖ„¦¬ãÃNhØf< ¯Âš±üÐ)/ìœñƒÏåÿ˜ïñ$y(÷¢åA®]& :|\Hhz½þ… Íh4r`ߺõìõx,æ6‘fgüöj¤&ÄŸB–lO€7v:‘Œ„H¢âS0H*­Ž®®8ÛY ºC¼Æ gKegõÿÂÊéËnž.XjUH¤ÅG†APë¬qvsÇAÆÝ{)Øùøâ¬A*Ó™ý IDAT–Ð'E¢ÁÝÇ+!“ûQQÄ¥è1 öø•òª˜o¾[»z%%¼¼©U»ÎŸ2q<ˆ££ã+ÛWÒÒÒ˜>õk¾?ñ‰Ïž9sš+—.ÒóÍ·^ª6Ø»7w<<=ÿªNAˆŠŒ`ÞܹÆ‹·ËñÉÒ´œ¿t Ð:LKw?syW‚¨ÆÆÅŸr.¹>³pÄ;ðñÎîì”]†ÚÙŸÜïkì)dÏj?4¶xxÙ>úMAÀÒ©N%ž¹®j;wüìx¬,Qm‹¯ÿ#ïP´ÀÉÓ'ÏG^6¨±s÷ÅÎ=ŸŽOvüÿÒ~þ“B–AeiO _ûÇdjKáø°ml]¼±uy¬ùX9{èì•O.Öž~XçzN1Çÿ®Îòöe‚òÞ9áäôh| "–ŽÞø;æ”…N%üy4œŠ?éGhÅʬ[³Šµ«W´È2ȲDhh%,--_é£Õj bİÁÙÇ‹ Ãtvq¡Sçוa– ņ3¯·ÁS|–»ŒÂŸ-`B(ÌØ¯2ØP¦þq£Å£µhY°  å4v,îüÐ0éÔ} ¿fåÌÔp‰ýoûÒ[ZAøÒzO𠯧cÈ ¨n‘´sO|ÏJEø`2-ø'QtfÅ]`Z£Pf9¾Å¼Ÿ¦géì;"Ï}J“˹·µ#Eéã©uÑõ„ü”™·—Œ¦÷ ©¤¼™mc[áf) eEó[÷zü²‰}Ë?çoîd¼=ŒÆŸUgFnO·Ö“ˆt°F4džV–¨EAôføþc òËS·Ü½3_%ŽÕ“OÛòÓÄ·ð·}ž>øòáÌéS4hôµëÔ}â³S&ŽGŸ‘ñJã¬,×®^eÎü…O|öô©“üuâ¸bŒ‹£1Vi-±÷.Áßß|Íþ.‹hdˆ*t––hT9W¤Är/:Žd½ AÔáàჷ«5"2é±Ä™µX›Óˆ½ŸŠ¤sÄ7ÀC ·nG“5>Þ¸ÚY ÊÙ“EZÌÂc“1È*¬<ñ.ጅ(<œÈòM¿¢kwâöíf×±6w Æ P鬰’² lÔ“}˜¤ ŒfKGü|\Ñ ÙVB6gq—˜Ä L‚;w?rUg‘tï*wã h\ñöòÀF#‘r/ŒxÖúxb“3A瀗_Iœ,¤ÌTb£#‰KÉÄ,«°vöÂÏÛ cÒ§€`eEfB,i²~þ¸kS¹{ë‰Yvn>øzØ‘#b²’£¹GšQBcí‚wI/ì4…Ë$G0X8Ø‘uç&ûÖî ÙèÖ¸¢Ö +Ëœ.(I‰ '"!,èl]ðññÀZ+"ÈboÜ ÝÑ ‹¤pb2D<|ñqQsÿÞ]¢õ¨íJà—#GÀœ•B̽{ħfÎOß’¸Z«ò Q¥ÃÞÛó?/f×ux³œ#  ±°ÂR›íHúd¢££HHÍB’ÕX»xáçå=x„¿ABZ’h£w>94ç’)¤»áÜN4cãê…»#:•™û·®“hçuJ$1©&´¶®xûxb«0§%KRºYÐ`çæCI[DA&31†˜t ÑDbB"µ=Þ~8JñܺIš¤Ã¥„žNVÙýX€Œø»„G'’)‰XÚ»ãí톕*¿Î²×à[í}¶^鎤Ó³êSÞýUdì¬aÔð±AT‰ÈY·¸t.£ ÅÞÍ /7{4rw¯…#¹áç¨ÙLjtÑ|ÝMÄ¥fbNâÊù3$Û8Q*ØëW`‘,w–® 'êÁçÿ¢©GY¯¢åQX&A1ÆÅ!{f4¢«7×oÍä‹ùg80¦r¾ïè]?1qåaî$²ÌØ–jÂñŸÒ¨„‰³?ŽeÔá,*zë¸FdÔ4V›øuë ®E™~}$w¤¤5è¯mbꤟ8‘‚µk(Ýúà­úÞ¨¡àK $3‚o]ÚúˆìÙ¸ƒ6uÊPÉíñZfF^b݌ɬ¾š†IŸ‰AãG¯¦òQ]w³žk;òõ¬u„T‚ß¶c˜98AI<½‚oüÅÑËQ¤YÐ{Ì×|ÜÔ}Ÿ÷æ³äJ´ñ6p;<šø$åߘ·ýªyõ0¿|÷={ïè1ëõ˜­ËÓ÷ëoéjEÂåíŒî÷9‰5Ûáu†ó7“)ÝûsÞó8ÏòM‡¹‡ªDk¾˜;ž×<@Ž;ÍÒYß±ñ¯Ûèe3’Ú‘ª=ÆñùÛU°.L&"%?ªûV#ñôöœo@÷›Çž5¥Çq`þX¾;uCfY²+-ÁÐvÁب"XØ©«êޤyúqŽ]Ǧrú6öâêÁm½|ÈÔÒ üéGÞµFÎŒåÏU ønÙ!b &Lf5ÞM1å“¶x[ˆÕS6C{Ð;~?s~8Hëo;à§ú)çw³èûß8‘‰YŸ‰lÊûßL¥G9Kd} Gþ˜ÃÜe‡HÕÈXP¡ÏLföPƒ9‹»~bÒºc¿‰Ñ§)ŸMú”6ådVöy™~ýèîÎ¥[Q$J®´8ž¡­H8²’éK¶r)΀”™…¶D>ž26~p}Ãl†ÿv ¯Ò~¤Ü¹FXDÕ>žBwa?oþ“k‘éø4ü€ñŸõ¥‚=ïìföäEº•€ Ñ6Vï¡«@´yt&äd!T:k\=³YÖUζh´®Þ”ð´$õü ¾šø+çâ31#cé׈‡ ¡m¹hVéÊ%¾`󜮸Ý?Íœþý8<™Y:s‘ðøfÇBmÕ€o—ޤ¬¶Ø›ž'¦Þÿ«tO’‡²VœÅÇ=‘MUåùðó¤ý4ž1`‘ç.C˲­=o5»vîdÏÆy´Ñncú÷t6VdÜŠÇ£åp–lÜÊÏý]X=v«Ò^cÚʬþ²±·pôr2ů£¾älÈ~ßµ—]»×3²®ÌÖÅ‹9™œw殣„Ar¦é›Ý)¾ƒeGÃ0åðí|húÑ4ÖnßÁž»™×>Yßl"Ú ™Ñǘ;a!i;bù¶=ìZÿ£ÚUÀN‚h&êL4Õ†-bë¶% ª™Å¶k¸…+{kô·³¨9pËÖnâ·O«sæû™ìË+ tõ[·ï`Ï­L¬}‘ ¶’‚ˆZ£½ km¾Xºƒm3[pcѧL>â̳W±å÷ÔÏÜÊâU×€,ö~?‹©¡|¾t';wícÙWM¸:s4Ëî!“~ŠlI…­iäͶ-‡¸Ïã´ µ£b×±,Ù¼ƒ=ûö³´¿›ZÇåø,@ÄÂÆ†ÌHŽß¬f×òÏ©µ’ñ‹ÿ¦|ßlغ‰qÁ§™:ó(& òÌ6~^s‘:Ÿ¯`×îýì[6Ýê‰Ì?R@=ÍdJÞ¼9¢7¶Ûæðë… Dññ'Ô•yë³ر}{¬g\Å“|5q@ÄÉuÌùù0ïÎeÝöÝl[>‡~µÜQ ™ Äß–i?y9{6Ϧ±|’µ{O‘† K{2ïB«ñ¿°zóz>keÉž?–sÁ V8õwvíØÁžKy×s/“¦@B…ÖÊCd2Ž5û°pÝVŽ bÇ—CøþN¾üm ëg¾‹îÂf¶î³â‹¯8âõ?lÞî]Û™ÚÓó¾eoB:+ mm6Ë K˜%Ì×Y0|÷Odýž½ìÙµ„žÎ×X¾l7Íe¾`"Ndì’£ìøqëM]ùjL‚ªväÍV ©Ðî–nÞÌæ•#)«}|Y%2.FMìëehÍFÌž¶›fuˆ¹®ív´æÄ’|w> £,“n$3å,‰Ô£ûZy½Q­Û4骽Õk JEJ9^!!)â÷²êB¢Ó:&^ƒ Ȉ¸Àåx/®Þ5R+DSD³Ûðq§Í¼ñÓú´öØ÷Z¸¼—Ù£ç™!¢MI"óÂîdõC}cêkðÍÀ×ðÐÞ”·¸d–ñé0Žå]{ªÔªÉÆÕ1Dë%0špmÞƒ¦þZelË5¤”v Wb¡¹ŸéÛW3á»óÜ7¨ /&œn”%t^å¨Ö¦þ6jhЄ ݼú¼IUO0Ó ®+goßA"“ƒ—n“lâÇ 7øY–„4âS.³÷d ý|íŠÖd׊téP³6rìøæšüU:+l´á,ùê'®'Êh3opÿRái™TwA¥¥LǨïe„P>0€{n ©_Ù ´êXŽQß^ úÜ»~€#Wî¡ÿ}W7"êdîÝ?Ïñ‘L©ãP@Ö%M¥AŒk»œ÷§¬â¥ms¼Ôì~eãeÇ•-«ùlî%’j„3¦‹Gˆ 1“âÛ’>Ý+b/®ATrL÷Ô–”ëôõ½­ÊÔ õæçÄDÒd Ù,ãݾµ²‡a‰2±=zð$ö·åÞ²XtòzIÄ)aL9A ÁdÄ:¤ í›ÖÂÕBĵe‚Fœ£Jß®Ùå*ê¿ƒÄØû~ƒ ’I7ocêˆH2’ïp':3ײhYûé×/Qw·°â|î¿3nÐϘD¸î<'Jc&л#_O;MçAŸ0ÅÞ‡~AU+Y#fƒžÔ ;” U((¾Æ$$ѶÃû³äí©üXwxöºž âX:j8¿¥„òz³×ð²S~<œ5×ôÙÑ©$`å`Áƒ•1IТUÛãb™+*e$€”(’$:¶lAukAhMO'Ê—|R2AÆeA…¾¨ûëfìèAoQÈ.‰[–ðåôí¸4êDÓr%°ŠMeÛátŒ’Œ15ÉÂ%Û?¶)FYÄÖÕòáo ¨D³ ²,`i«Á,eç:d3¨U ÈF.­šÃøe7 nÚ’¦~®¨ïưý„cN1 -Z+Õ“ˆ¨vÀÃZ~é j$f}É"åkÖ§y5?´9rlßå]<ËX<•öL& Í»Óôç,Ýr†þYB£”°|9l*I5ߤC‹’اéøóÏ«%)G?*lœ-6•-.VêG©­Q2`ÂDfr"ö¾iÑ® ®¦,$Z6oM€wÁ©tYÂ`°ãµ£®ó_ïkH}­“8ÊäðOSùvg5š5¦†·3ÜŠ`÷¹ &3Y©XØØc'æÕYö‚‡uFF-<Ô&²,biÿÈ©dQЩlŸ2ŽÙW\iݬ~.V¤^¸Ë™í9:°´³@| 24¨Õ¸[=ꢘ“L!Ñ`Gí¦M©çjñ°Ÿwµw'¨¬êóŽ"æäRU^ôlÛŠP•“ B‹Öôu/M°svÛÜÊz!EýM˜®:•‚uÊ «@Á«iŒYÆ®|w>l¾ŒI3'ØEG•2²þP:íDß*ž¨1ròú\~5µ7÷ùO9{–”Ìà^Ó$x7£emMþwž°{X6À¢cúÒäÛyTð–QY @27ÎýI†g# íM ]QNAÀÒ£,ÚÔ#œ‹‡ò.¹ËȨ0QæýRFFDÐGpòÄE\jöà£;á.BÖ¶ÅdHùš”§}y>—eD˸jeÂíChÞºVùÔ"?ùÖ*É”æÝ·k°iæRÛ'!ÉÙ©âû×öðwz0ÓÇö£š¸r‘IªKȲP`5åœzÊy¾ÐaëìƒJ¥Æ¯NêÛä¯gA»³esxuæ«fÓî‹98—Ô¢U@G_Ç¿I>è× gÒ6, Í$ ªuعx’NxxYP®\t_~|ÑH˜tŽí‡c¨?d$ýZ”ÇR€;qs˜˜«ç;µ,<^”ü áR 9™x÷†´néüÌýøñªšQyãnÚJZ@Sš¸ÉüóÌ"ëÍY ¼;›/'Ÿ`ç5º'‚( îðy†]ò ¼ú(–[ÚD­3uz}„×µÕ¬» Q+OÜ4÷9}#5qy“f^DgõŒþ†dëÖŒînËò¾½ùáH‰‰1\Ú¿†_WläJÚÓœ‹Íž}Þúœ®ÆÍÌ:¬G-è°¶µ#9.š¸ @ºÀ”)ûIÍ4`Ô®~™6p†ß'îÆq6í»Jºd~¯Ak‹ƒµš{ñdÈ@úÆ~u I|Æ)P6a"ˆ7Ú‡rçû±LXzŒˆ„"®aÙ¼™ìˆá™Î ;µüîÎWùíp,F)Ç„:x"¦†s# ‚¥ ¶rýN:‚ø¬­ÖP¦j+ª¤oaâ§?ræÞ}".²iîd–^ÕQÏì˜9ôƒI4]ʼftj°ÇÑ ÂÂïc¤}ŒùêODˆŒ†òU›Q6~S'­àJl"‘çw±zÿ=LÏCó!ËÖ®¸èÒ¹–ŠJùÞ:ÆM>‹ÆRý´xØeu†öð`Ûàw™½û*ñ‰qÜøsK~YÊ©¤g<ß-Á½3#Û™XôÖ‡¬<IÒýNnü…Ÿ·'¸1ïc¦Gµcá¤wxï‹þ˜VŽdÚ # ÂÕÅŠ”˹}}–I”5c Š¡1Î}<@PáVª}ú–CŸaÙTcòô·H™Ö’À²!4ýä8Õ¶ÂÆd|xn¸À2s…ÙH©?u¿¾£ãÇ·kS¶B5Úû‘«z{-‹ª#9Ĥ[cë"›D¯VÔlÓ—®^'è\’2µ&¢jQ7Ûìm¥*‡2¼·àWº«èY½4Áû±äT$†äBÞŸrý+äùFƨq¦}¿~Ôˆý‘楩Ðü|ú¶ÀI•;¢òˆ$ïZž€ Èÿ^Óøy|3®Ì~“š¡!Ôl7„ wmñ¶*õåú%ÞØ;;]·"ÝUŤÚÞVþ€ nø¹"ÊOËæka>yäì¶.Óœqó§Q9|]j–¥\­ÎL;”›Xhݾ.#?­Ž>ÃLöÚB zìGÙKS©TŠöK)õQk °®Ðšq3ÇQâä$Z„–¦jÇqìÔ?  Éoì„ÂäœíôdêJ3r|_,Wô¥|™rT볃ʃÛbo6æ:ÿ.ÝPuìj~äź ©P™fý¦ñW²nOËCò°CKÈØÒvÞ.f·Œcr‡Š”®Ã[_o%Qå‚öÊ"úOß¹£¨n¯Æ%¤'£ú¸°aÒNeA@whï|€¾ ËàS~§³@ ‹(È75Ô%é2t:]†îñÉÊùI ^y<¯Q "Å¿ˆN£ÕP @Ï…­[ (PŒ± (P c (P @bŒ(P @Å+( rþëÞdYF~ ë™ë?¯þ¡yô¢Ü‘ªàÅu=ù…¾§ÈñÕ‡ºh«¦¤¼gì `zÃUÕc²é%3cˆIpöpÃFSx}Š*«hrþ<üYÏ@äÿ ž²9ðQXú•ÂUÇó—õo¶¢.ÕÈ%»çi¯@‘×ï {âe£úoo±ŸŸJfObïÊ;~ŸÕ¬˜@ŒF#÷ï'`0Š”™,ƒ­övv¢øJ÷Ÿ”ädRR’‹Ô¯ h5ZœÐjµÊÀ+6Æ8grHºx˜SúTõD# grûô1n=©\¥,ŽÚg/W2¦pãäY Au v}Ò•rf®­›Îˆ*FNŸLï\¬Ö‚Œ1-Žkð(S@±HË#`")â:.Ý&)Óœ=ü¨€UF W.ÝÁªL5ž}àJ)Gø¸ñ j¸Ê8ç;œ¹•‚GÙ`<­…ÿWýÓ"¸xæ‰z$•g/ʇ”ÅÝÚDØÑ#$ø5 Z ÍsüÀM&´nMÆÂÓüúš–ëÇO¢ªO¨›JÝÏa`%Ò®sìàeô¢JƒVF“)'б¤ôkM)mý,ú—I¼~–«FWBKya¥y5\¤‹ÎsðÀ>xÀ_¨‘’Ðh´¼Ý§ï+ÍÂeÈÊâß—`ÈÊBT©ŠtæjÕ®Cµ5•WlŒq®ÎûˆwFsuÓ›8©Œ\^?qÓ·áØy¥B 6ÆO¢Ò•MÑü1´qß\c~Ã'×A¥µÄÆF…&ŸÈŒ½À÷c&à3k# Ž ð]']ÞÍÌoæs,J…³³²Ù„¬ äÃyS¨Ž…Ÿ~CÀìÝ sxrÆ /­ J«ÅÆÞk$ßδ™§è6w­ŸR(ÿöŒ1õ.ë§aÁ=œÑ‰&22é2a o lÒ­£¢ØÒåÉÑX~EÖööÙ÷.Ëñ¬ú·'‡±¸Iá‘™‚¢Î´è ¬ûe ¶VdÝ>Í‘ëZ3Wk‚ʃ7ë5¥t^Ýð8'vŽRn,›Â¨ÄN¬ø¶gÎõ›ÅŸ›úæëÔª]—5k=ñÙɾ"ËõJc£ÉDlL4_ŒŸôÄgÿ>{†‹Î+Ƹ8c•¥-ö6èT—–cØÌ„|<›ÏÞªŠ‘§6³líî$ËxVmËÛ}SBH¼ù;^@ílÏ㹕éÁk}úóz¨§æ~ÁŽûf˜ûýWyШ{ošûijuÃ6þºuIåHpó7x»e´ÙÁì$áðB¦nWÓuPGR~šÁá¨X§|ÈM'_:}øMB<pÎ[Ù°Œ½I¥9s,Í‚l1¥Æpûz$–æxÿ8‹#‘Ñ\™ü!WKÒuP?ªšÎ²jó~.D¤¢²ô¤f»7èZ¯$*Œ„XÉ’Í'ˆ}iÚ¥µ€>ê6ûWýÁ¹›™¤ý€­6eè7ö=ª•°}±d‰Ä›ÛX´òuç¬fL#OĬ$î^ C,iÅÕ†±.ÙŠ¸_?fàGÊÖ}7š8ptý*ö_ŒFo¶"¨A7ú½^A&åö1V,YËé8ô¨C¦Y@œ›óÛÁôÝ XçFí=y½Yy,”qþtªÔ¸•ëÀŒå­,´Dý>Œ‹FOK’¶h4.m™ÇØý—HQ»P©Y7^oŒ½ùK¾Y†¡åPÞ­jRW·.ds|%ºT7²í¯ËÄ$d0¦ÿ,¬«3â›w Ðoy‰¢ˆ”sADa©÷Ÿ‹ânÛzE æ¤áŸ$Y–>« GvÅ(‰†Jcâôâè7ù5Ç.à«·ªb$û…±ŸÎã¼É“ Î\ûe8ïÛE"QY9iÏ´á_s"E¤D•ºÙYàUµíÛ6"8ЉäË—‰Ì²¥LÅ*”óгcÊÇ|µ=鑨d [Ä}_óö¨ ÈeCð±±Ä#¤:%ªÕ’ömêèfSÈÐ3¡ÏÔ“¥s¡¤¿3Z-6Î>תI î!Õ(éè@©Z-éЦAžÖÄÿ}ŽX•;!•*ágÉŠ‰£˜,ˆß¿Q_.ážu•Lì˜<3f 6Žø– ¦„k Bë·¦]ëZ”°Ñþ¿L’)ƒ£W_¬´,l])]µA¶¸V©O[§&´kÓ”¡^dÞ¾ED‚ŒO…*T Ðp|Ö@†/‹2#O±èóÏX{MKpEW.ü¼ƒ1ÉH²ˆ{•z”²ÕâY’ƒý­ IDAT¥9íÛ¾Fˆ¿‹B1÷,#,ç¶2Q¥ÆÂÊ ¨ÆÚBƒ¨Ò`aeµ•%w–cØÂ³X—®Bˆ§] '³pà jJiþâ›!ùS†[køjÂïDÚ—ÄÓÇŸ@/w|‚iд­›UÂñ•˜‡s/U<²þ«tO’‡²o«GÆ‚Æá¯/øè¸ ½–¬aD÷œ’"Ù²v ‘e»0mD_BœE:V2ÑòoøcP3:¨T.eiв][yAsö,ÿˆ5×>ã›Z)ãð3÷k·§e£lQº1¸•œö¦^¯ÓëçÍŒnÙ QÐZ«¹³f<_üð ÆÍdP˲؈2Uëè|¯h]¹¨ëüÜy­}'v˜B·ªÛ(W³µ´¤Ë-ÔYã[¥Îgðkֳؑß0´ÿÑ6Ö9ÊJ¡âì¾ÌZ}µ«°aåNôuz3ehwlÍ4r¾Ìî‘WQÛØãR ï#"U›t ÿÿOšAÄ)¨ ï5YÍÄ•ÙXµ2Õë5¡cÏÎÔ,a‰SÕ&Ûªˆ­Úšæ-l³Ý•L'úTj6§wv-F­ékˆîù1I§·±;Ú‡w|I×@-i!)ìÝudî5SÖ~>á5ÛÑ¢©VIS?û šÏY“¤2TAƦ̺D«åGQNdªÚŒbÆáý\~-˜ZŸÌcØ‘VôìËëÉ‹‰¬;…ï:ù¡C¦tI/œì+Ñ´M|¬^4µÿÍÈX’\Êà”yM›.bzðyj8×£2®T? ‚ ÂµrjÛ„qürö}ÌÖžžxùyä¸%ð³Õ‘dÉŒ$ƒd~Xš”ÓÌý¨5Á¥ð÷÷§é˜“HÉwHÔZI{gðÑÄã4?ƒ!-Êb#fO,’ÙŒ$Ë•…wiö¿Î•º1gÝVþ˜;˜æeÔœZü!ͪö`y¤€)»“ñ‘Ç¿Ÿ/{4 ´¿?þþ¡ôšz)#–´¬;\‹‘¨Zµžö*Q‹_ÃŽ”Q™1ËäÔIB2›«Ó‹Ž4ö¥x{Öfönø–wšú“xp&oÔnÆÄƒQH² sÉMy“Uã{R½\þþþTúh™1×I0g‘~µGEjf[›-¶µÎ6"fs¾²òê@ÁóúTj¤Ûûù3ö³[e ÿ€:Œ]À¾‰¤¦Aôãý…ñßó-K¢Z1mR+²·=˜‘$ Y’0™¤‡ýBÑ‹ÅÐËæL$ß>¬Øö96ô¡ãÄÃdȲ,äYP£@’d@³×lNÈH¦I˜5l›ÔY²ÿonÜ ãè¢æÈ™˜Ù,aP?‹HöCo’Š>kœï,rÎÿƒ7Uš¼ÎG£§±âð.Þµ9È×SÿÄl¡Î\àÓÞ£9Q涺ĭëçY3±&¦ôLÌ’ŒŒˆN->zGm……(Y§ª·‰«­œ¨Ü„7|ÆÂ »™ÒÄÄ3ö’dÊ{){kgOaÑå&¬û“kaa\]ÓKɈ$g¯9©Ô-7Z`¡žA ž f!kª²øRaaa„Ý ã^|*‘ë?£žO¶F²ÂÿæZ†cJ$ ½(PðÊEÆf–¡Xµv†_Þåí'0Ù•ÄßMÇå«aÄ¥dOìé·öñgŠ'•K[a65äU¨E ³!' M¹É¥XkÚwoFˆ—-*9ƒ;'Ï“Š Íd¯vÌýù3Ü6Âû þ$Řcn*$LFÓ#3$rî M@% Yz2221š²#I²Ã˲22‘ÄœrL9ÑlüyÎ%zóvߦ:Y"g%þ÷ÒPYúàë¤æÆÝ8Òršvã(7 "¢½™B̘”…üÂ#cA–‘ÌY¤§fe4#IÙÇcÜlÕÈYzŒ¨Ð¨dLt &,*“êÍšR·¬3àî_“lÔ8z•BNºÍ䜈<Íõ´Ì'G…Z”‹Ô‚ç4Ä’UÉú”×\dÅîØlÇR–02É4‘Ò2êƒ?ðýt “kŸç‹!ˈ˙fT*ÙdÌÑÎÉE/ ä !‹Íd`Âd–‘Í2vU‡±ô=oúˆ6óÒ¢!›§üƬïEZ—ÉdÇìEˆ-'ñ¶7$Ý2c2™sEÂÙ)`“ X8áï­aï¦åìv¨Ayw*—Ò°sëjÙea½‹Y+£Ð¹d{ñ²$aÔ§b ìÂOË2èÞùC>R/`ö{µ±·w¥„]Ç7¯fBé²¥ðr²FÌkûä8ö.ûžUÇ2©R¿ Þ¶fîYÆ‚HºŒ«ŠƒÅux;¢RÒ¡ÿ$Æd%صä³!ô÷._$ô£ž—Ƚ¿Os?  oµ-ÏŸ£†²+hûÖÆñÞDvvÿŒÏ–Vga¯ |J{#<ÂŽÝî”/Q’*µÊaWì7qɹý¢wÿçº"gF¾“ÙÁÊ7®U»NwwwL&Ó œ$IܹF…ÐÇ>ψ¸F´cuZ×óE+ØúצŽ_*÷^ƧÝ{¼QÓ‚ÓÛ6²óè5l fÚ¤.¸‹f i‰Ä§©)S½&~v`$úÚ¬k·¢®—ž„í[ÅêíQù6 OϪ$\ÍŠ-{9S‚ƒ¡3zÒ I(êÄ(DW*…VÀ­D%:×Õ°sé.¤ÊM©TÒ ww ;W±v×m¿€v–*ÒÂÏqäðNœ€Î}ëb«õ¥FíÒ¸•©AˆåMÖý±š]GÃðêþ1ÕE#¯µ ¼¿®÷9ºu›öÇP¶Q-J:X¼`c, ÖÙb‘~““GsøØI®%ÚаïWŒ£V¢Ïà’Ü?¾†•[Oq_U^}›¢»º‹•k6sø¦=]5F“éFÃ65pqð&¸œW·ýβ'Ñ4ìNM |¶ º‡ž¥œ¹{`«¶]Dt+M¥òžh”qþÜ0%Fp×àFíúqµÑàQ»#µÃÙ¿i»]$Z.A&M)o>ÊÏ{úNF5{j_Êy¥pæt,%ëUÁ¯lv‰gÙ²y+ûþÌ¢N§º¸s^–Ë—.bgo··Ïw:x€j5jbiiùÊöƒÁÀ±#‡iøZã'Ê#&:š¸¸XBB+¾Tm¸v kllmÿÙOHKMåĉÒÉS§—å|l 9Æœ?S>‰õèÚe¡ÃÇ…„† ×ë_¸16Ø·‡n={=p¥  Ã|ï*ÿnÍl¡\$Ï’µ-€>ó±:Á?7r9GKž…Ò³ðÂyˆ iÇ‹ˆ„gëó··¢”ÝÔÏ­¹|”—O©«üã³ ¾XüwS>t€;·oãîîAá+àÙm¼tá}û½ÿ¯Mò/#ôz=ß7àÐМ­)…Ë$!>wO^kÜä¥jý»qs÷ÀÃÓó_áÍ¨ÈæÍk\°hq»¡¤i9é@ /6t˜yWOŠÈò>–÷½gšò½›çÿy·X9 G®Ç!åÊSK¢-eê½ÉG]+­=+—r‘Ïγýbãâg“ëó··¢~êçÖœ <Ÿ®òÏ‚tPü¤Ê•«¢ÓY””X$¡‡$I´nÛK+«WºÇèt:ÚuèÈÍ›7±ÐÑ/#Hùà`e˜å‚‰ð¿€è@¹õ± HGÎX:\ý\”«²((îyYÆÚƆêÏHçø*¯™Š¢H`P)ƒJ)òPŒñË1HQ9R§1!…?¤¤N((Îyƒç¼ŠáQä¡ã—©s)©S (P JÆT (PŒ± (P c (P @bŒ(P @Å+( ²œï~ùe%ºÏWWù_9¼þÒëç¿Ô^/A—“_è{Š_}¨‹¶ `àÊË?c€ž‘½*/£V¡ï f¢Nî`Ûu‘­[d_x} -«6±uwuN]ÂŽ³aÇjôzƒ`›ÿWõ=lþi›·X:u.ýFÑÒ]ØÏ=1>•n `ç*rüægÂ+îGZA 99‰cG Š…¶_’$*‡ZµúÕ=Àb6›¹pþçþ>‹ª¨vÊ2NNÎÔª]GGeàcœ39\ÿqSã:0sd]lDŒqlù9›2ê1dø›”±}öri·Y3e©Ý¦ò^Eí' ø‹‡X·[ƒæcAI‹8ÃòÅq~cJ©‹lKÂñUÌÛO‹wûPËïÁU+‘|ï,ëWűËÿ¯1Cò]ÖONdƒÏÒÂõ4D°yÑ”ê¤ãb`Dž_øá¿ocFc‰•2321I2‚àJy‹èVâٜë+góGZú÷h€»Õ«‘;uò/2Ò3~À£_P”'‚Àî]; *…Ý+Û²²²Øµc;Í[¶Êvì ‘ÀÛ·ùóøQZ´j£ ¼bcŒstþ»îVÈ$³åËÞ|vЃ¡sZàoótQYÛŠJ+qûØ~âÚjŸª¢JƒV«*à Ìé\;qïnê"£€Ì¨k;NhWÓSÖõIœÌy# –Z Z­ö¥¸±HÊJæÚ‘½\óýä颫§ioÞïµj´h”…—vî¡t~ç-2,-H>ô33v ôüèuʸêTTó( RÎM™¯3«Èû›I%øÐnꤤ$¼¼½¨X©òŸÝ²y#f³ù•î9’$‘‘‘AhÅJO•…¹|é’2ÜrÛ—b㵋jÔj51…­#Û2d‡cYÈ[•]Ð éœ^þm«”%À¯4ûÍäd‚™ÈãËöNoFNG§Aø–nĈ57‘„4¶ôªÏ´Kq¬ìá‹§o}>ÿý$Q'W0¼k]JX¦}¾ÞNB¾©'[l—¿ƒš±ñV8úwæ‡“çø¶¥n>-˜¿û¡àÉFEÔ*Õc×+ ‚Œ9ë>¦¿CýÊ¥ññ-EŽcØvõ>fA@¢Xئ¯Ï_Ÿ׫âïWŽ–ƒàïx)ûždÂY>¢=å©ðZo¾?­G§}YÔ+ ªÔ¨ÄÇ?Û+?£sÃPJúR¡f¾YLA@ôlÔž®3–2ëƒæP±Y–_2d·WHáį£iR1Ÿ -ùb]8ùï«Tð,sôbíV–ÖݻӭSgÚÖÂÁ9ˆ-;Ðåõntm¹/»R-Èÿò5é;m·3Ãq>i\‹·—ÝA@ÎJdÇøv´ø+§výÀ¬e[8ýÛ0ªùyã]n§³Š?+.líóÁçü'ˆ~]ÂS´<²—*”1W,1‚ˆZH`íÇù`Gflþ™.:n­œÈàoŽQ}ôoìÙõ#-bçѵë|bP!ÊFîìÙÍ¥ŒòÌ8tƒ‹?Öc÷˜OØcIëEÛ\Áƒ.?]%êî!Æ¿Y ó}5µú|Íæ½‡Øþë`¬6¤ï¼Û€:g0‰hu&..èIÇZ¾X9›ö^´ž¾”wª…2hõ-bÃwпI©g¾ºO–d´Ž5ýãvþ<´šýÎ0îËß¹o$ôÉ1œøi3å¦'ìäOÔŽ_Ë¢eûHŽŒz“‘|™¸n/ë'6ææüÉœ–-_òëÍddzÐmüï:¼‹ï?.ÏÁ9Ÿ³ð@ b6¥qrÖ÷è{þÂßWÏ2¿M s>ùšÀ½µÓ5÷o^ûbGÖ@^ô9{ô*…RîŸ ±·† "¢*û~CQU*ÔbûG¶eôÙJLÝ|”½¿Çêàl¾^´‹Dm-ƭéÏò{¸‘„“s™¸ÆL»ß¦j³wéßµUޘ̾sw¹wy•µ¯„Är¡¢¯ üÏõ%E¯pd¬¶„ccùd…Ÿ®[L»©2ó 6ï9‡[×|Щþ¥ê3jñ—ø_XÄO7@'˜Ð”ªGûŽñ×mýwhn{í×2P=Œ¤uïæéظ2îvV¸–kÃà!Չܲ‘x²‰ÐÕb*G§÷åíß­ùzÃ÷¼^R[ g(<ã&%µ¥3µú¼K£ '¬œÊÒíÃÎøÄŸåJLrv$‰ˆ_/é —êV+C|d8ññûY°5n3ÆÓ9´$¥êtgÄØVX¦g!½¬Q˜,#£¢|ïéXµ$v6ÎTlÚ™ö5´\ÿë fÔ`Ðc×n,x¢RÙP¾õ›ø§Ÿádx${ǵã{¼Û® ¾¥š0~v/\M¦—¶½Å%¬)´Ï ¸¿™)ku ˜>Œº^v¸7¥W›ŠD_9˵X°j2yícÛ{#G-ÇëÃÙ¼_x¨!WVD·¹Q| ³sént’öñݨÙÔýácBTClŠD)_gl„•©ìœÂµ°t°±t°ÁÚÁ"çK&îf¿È2¢ aß`:Éhh4á ª–z“=~ƒÙõQ)Ep ¼jÆX– È®­˜1·ãßBŸe7„*¶ÖèÔ¨7>šˆÍI$fª°±Vç,„Éù¢2¡ Ô‰ùofOøè†cÙ¶¬5HÝý ¾2!²ÉˆMhkzÊilÿi)5K¤¾Åci«¼—±ËE—ÄÇþŸ|m9„ÑsÝQú‡XBÚzz´_‚,ɹCè<Ñ¥Œ ³E'É0æúÎ¤Çø’á{¬½)ÛødÈ*¿ßÅú¶¾@«¾ü홦GÍw†µ­ZÑd~¤sSúÿ±wÞáUm¾w÷ô“žJhÐ[èMzôUTŠ "" ¢HÁ‚"Š –׊¢‚"¥÷ÞkèH;uË÷Ç „Ðü|ÂÜ×uH8Ù6ÏÎÌožggžÅ+–,þ/[ ²=›œÄð•óùOÏ?4¶}ý;ãk‘¬¯fΚL’kç©ãòŇŠWnÁmÈ­5÷TuãjÁŸŽ¥•ë ží3Ž-YŨ[1Š- °fºšÁ¦ï>f™^‹¶•­¨ZA¾RN [±KΟ:ø¿?“s^e«–#Ö xöðÕ”åxMçņ®¢‡ÕàÙ7Fs¿å7^~ù}þ÷-«$`.@tMÇ·ï :˦œ„%2•ïEçʯ1òá>TM FJ?DºWGÕuÀÀ“qž,Ÿ‘멨^Y®,\JIz z„-o½ÁÓ»JíÔ9¹Û„]uá»:<ÃÀz ¦õçá•NtÕ@óz)ýdžîÌg=Ÿb[r&ïINâ}> ÀŸI¦GÍí³ Ý+3,ÝA“ûdÙŸðÆó½)„–åÇîËÄ­ŠFý·Þ:¿‹ŒL Uóƒ¥*}F¿ÈñQcéùØ—D[ð¹d*vîÅ3ö½¼ñÜ$ÌNâåf‰Xj âþUÝ:´*Ÿ¾÷e›6¢ÄÂïôì*B#2èݧH2ßòÖÉ4^)‘É…ïo·qǵì!&rÝÂb\öÙI|ã.EpŽ/ïLjË+ïŲf¯Ÿ2Õ«Q¯\iîØ¼Ÿó^Ž/GJ$$ ¢ª¶ã•‘õˆ*v!P„n“¾äž²NPê=ý6ïÕÜÁI·ƒÒÅ’¨XkQ7“š©aqÆRºÔ#t;b&ÐZ>ÁÈêP2Ô[ez¼ñ¥W"!X†àb´ëûñ›örÆB™èà+†¢<ÈSªrÜ•ãäÔ˘*µ)?òm*oIÅc §xÉû¹«‹ŸÄRá€Aç‰ßÓÎÄ4îÅ›qõؼ÷Yš [pJW¬@¨õ8wþˆžuëc©È£>¤ÖQ+v ¬Õ;3dT2;SÏá•/ëÁu]ϱy­ÙÃ7múÜÿ…M®Ã’$ån+¸,ÊÃ:Žx¾o¿A•«TÆívÿã#¿ßÏ’E èü`×\¯ª ’×¾®Ë“ äOqÕDxw\å þ·ë/=ýåI/ò%]¸ÌÿÞ’‚²qÞËÎcмǹZˆ·¼…È·¹ÜŽ×y3/oŸÕÏ[?éÇöm[™;çW²³²®Úú C'!¡(]º=‚Ýn/´5Æëõòå矒šzäòù!ùî½Ãé¤Uë¶T®Rõ¦*Ã’…󉎉%6.îoÉ›-IÇeÂøñþI“§Ü•Ó³eY9ŸlÀ¸o™t˜®®5ÎÈ¿Yþýn¨#¸l_éÊ£ïZ†<ÜŸ¯V@5)¿ª)І½É´¡M±Þ¸®Rþ«M„ùw;¼¿|néjǹZ™Ä²™¿kœ~y5“®»ºvý¼õïSÙrå)Q²º®]s`i¶X°X,…ºÆX,zøQü>ß5=YV°Z­¢™]‚È‘ð?©•5úÍ"† K…3n`(Š‚Ãá¸áý kÔF’$¬Vë ‰la¶‡ã›Ô›…KxþÉý„ ?"­¾@ BŒ@ b,@ˆ±@ BŒ@ 1¾‰1 ò¯ÿ¾]2ê×j ù)WÝÞø[’)üûf0þÑý ouö¸€é–hüäÏÀ•?ÿ@Nƒ¿‘%EdÔâjoXBeç÷o3f™Bý¨+_ñz®x¬Êrù߯ áF®÷æº}WOîp¥ òÙâV)o¡Û«ÕQIBÂàü®¼5d /~AÏ…åƒîçÍàgù¼o#B,r¾íÏòõKX’Ô‘6%ªä¾$‰£©©LÿökŽ;Š,_Ù¯Ñ4ú Ñî®» uâ¿ßÏì_g±tñ"ÌfóU86.Žû:ÝOb1‘¿öÖãœxm¿|¶+_ª]˜òyRœ z]¸=>T³ ‡Ó†I2Ðý>Ü^?’"£ù¼¨†‚ÕáÄn‘ñegâVu¼Yçñ¸œèŠ›¢áv{ðk:2f«‡Ý\ `hž,2½Ž`+>W^¿Š;ó<®,;²ÕŽÕ¬ìÉ©²cÚ3âí´¬„®éHæp @2Ð5?îl7>MGR,8œ,Š„?+p½¾ìóx]ªdÃa7¡yݸÜ>4‹ ‡#Pö›&÷¯aà·£Ås1öÑDün?ºD\ÑàœT¡W6Ÿ² «ÝŽÍbB"—_Gugr>ã<V‚Cì zq»Üø4ÙdÅî°cQ¤¿ž[P€~úpEÞAßׯðd“H\©ðæã½éÔ¯»§6Ç[‘ŽÏ$#Yàòt†îÇ“í£ÉyÑ á;tMÃd2噂¼ÀÜP!ÈFÎ+N¯Ãf³MÓD;»„[ê™±$I¸Ž¯füÓ]øLëÊ´¯^&Å dîá‡1=¹³QCÖ­KóŽ}øjÓyÀà蟟ѽmKžxyÝ;´¢aÝÆt{{ç4 îÎg{ÎðÛÀV¤Ô}€÷ÙWM‹ IDATJêŸÿe@·v4jÔˆõ›Ñù¹ ¬MËsHŠ îCÌxånêÝ=˜EGN²xt~غ“ÏŸmFõúòåòø¯\m1,$–.O©’I”.]†¤âQX$ÀŸÁæ™ïðpë†Ô«U‡†-»0æ—í¸ñ³rÐ#|¼?›åCï¤F½ Ÿ¶‚lϾñ$m5¤a½z´êÜŸï¶f®SºYZ¿Š•°ødŠ%” ©tÊ”Š#È¢ a¶m/Þ׌zµêÑàŽ¶ôzçgª°ÿƒ™´=ƒ?FÓ&-¸¯ÇNàfãéÒ²õkסa«®Œ·nÜDå-$=«ÉAT| b¢ã(™Ò‰§ÚÆá;rLàü¶Ùôi{'o¯ò“?±a¨_5­ê’R· ÷ô|‡E{Ó1äÂ6R’®*–·–8¸óáæD†bÂäÄfº¼Kѳ¶ñAßk1Ž5[ÿ`lÛpNìÝÄ9]Ïü‚[]Œ%ÅŒqpßü©Óðá)¯äüÁ³—ÅëS)ßéî®ÍYŒ{¿FÝŒ_øf³Š{rmš·h„ XšFŸfÕ!7¸2qkÞ,Oîy¢ª%c;±’Ï?œÈäïVâ.R÷†%œL&3ê±|4x0¿p§¼HŠ@Ç—…WUñdú/6•M˜2w²à§/˜2u*S?þ˜›2/Çw-æ@Dsžì^›Ps0Õ»¿H‡Èm|·î,†/·fàËÊ ǽ‰yëOS³Ûc´«-¸$¿BJÚ/|·%ÿØý_&#ûÒÙ·â[>ž<…)“?ä¿Kö’¥~h&Ó÷•¡Ïˆ(á´W¿][&°mëVkn<šæÎGKgÿŽåœ.چǻV'ØJ­žùOÐZ¾Z{þæ)o¡cÅu˜5¿˧ŸLãÓ¯æ°G.N•b–k:‹Þƒ³˜{ªϿҊ(“²÷ÞO놱iš, Wà–yfl¨^ôrO3ºÛ*Þêû‰>¤wÃ(ð¤“铈·_,Œ%‘’¡~Nžò@˜„ÅnÁd“s{ «ÙÀ«›2Y:iï.Í ©l1¡6\ª YÍÆH²‚~js÷Eòèä6T ºrØêªh^¼EšÒ{øp®Éb5 OÆLAÕˆÎ-L4%"dVŸv¡cÎ{Ï92|&#l¹£*ÝšH‰`§Îx›äe†Žf£Þ½o3­W |.ÉlÃfÿ¹#dYâ(“;ÏNDh(Æi_¾šŠ'ó¶àJD^ŒK©ØzÊ-Zó߉®â K¡Ë€ ôn…ê:ÏæiÒéù7¨ñçxªHWcõ\*{I¹¯î "(›$^&/Üòž1††a/Í=ýßaôðQ¯LX‘ a1„ÙàÈ™lÔ Ûzö³ûœ•„8GàÙy'OF^Ù””3¸62ý§­”ïü,C‡½Â€~/ðt#.¿èªk…ûyýÕ–l}·?oýqö²ŽHV”<'º¢' ›±9‚°Û8¬f d{xjÆ Žù.lx”=gtbâœÈ9W-Ë9çpFfÕ8pÚÍ…nNvïgOº„XëMWÕÌ6'&ÉŠÃéÄn „,MQI„xSÙvúÂvÙœ:—†ì ÂaUÀ0.ØÔdÁVwú)Nå ްë´D\¼S´æ¿Ý;6aµ9P$VgµÚÕ–ú'kOéJÏ 0G–Àé;Ejî=Ê ÝÏq àÖcÝf-FÛÞï2æ˜Ôë >ÛI»¦eØýÍÇ|»ì0Yé{øòÅÁ¬)rݪÈxÕ«ÆLA„™²8¼u_àÿÖ ²‡Y2Apæw†½¾ùƒ1CGW¨þÀP&öŒçëgaÜFo@h,Nì¾4ï>’×Q¾Òé #ÏÌÃÀݰ‘P®e3æ3ñƒ%œq§±ü½‘ü˜žBך‘ ewshÓî€øZ*Ю^<¦MâûÕGÉ:·“O_Ææ¸ûx°Rnßx󌧌Ë=#¹ØèVñï ˜Ê®ôl-ü‚Oçž ZõªÄÉ6¢ÃáèºmœÓÙA©JH86‡§® Í}†%c†2Ó×€Gk†Ýtå½µ…˜À´s§ÉÈÊàÌ‘õLñg‚S¨ ªn\QŒ­%ïæîøMLüpG@ŠWüÆÒ•ÈVLâ1‚@p«‹±îsãòª—Q;ióìX†·ÏäõÇ{³®ô“ } ’/žhBÅŠÍ{¸ ¿y•òèøU?·÷’µÁ:>w6Í{,Í»·áðÛ‰LhÄo¼<3ä!<?D…*Õ©÷ÐwÄunˆ9Û…žã»Ýn¼ºƒäßãëþ‘L¼·ã6º J,G«{ʲh@MÂZñÁüÝø®ÀCW}¸=^T=OÈD”m΀ןFûö)ª—¬Ä£_iô™4‚–ñ6ÃiÚûA¼·"¦hmž}g)•úŽaX{…I5¢b•6L<Õš‰_¾LÙœ£ÞŸ¡ãs»ðúüý6(Åé>ewŸŸHë²eiÒk:‰Ý^¡×=Õ0uú>OÕ }©R*‰ÚíÆâO¹ŸW‡t!mê#T-Y…?9yeêHšD™nžò éÈ\F=Õ”Ê+S½Î½Œ;X›7¾M}+ø4 ¯Çƒ?guŠæõàñièHö²<=aÑ3:Qºl NÙŠQ‡æC/T£%ã’¦q…èí9<¼–=D;-xü›‡:uñ|ß~ƒ*W©ŒÛíþǧ¢ûý~–,Z@ç»^æUH’”¾tmin$¤œ¥=—Ö‰@Y ÝÈ\Xg\òw. /_ÜF’s~¹äX†Hí'å$J0Èw¬+dŒ2.¬9”òž“ ×g\~ —ºÙyÏøúò²s“¬»½Xž€Íó¤* $3Éy”p±Ò%¶7òÚBνiØG¬3þ[;ÓüY¤ í|íêBzØœ¿_¨©ö—$$ãÂ-’ Í=úùLjŒ*BÃFw\sÛ1£FòTÏ^„……Ú:“•Å»ï¼É !ï¹íšÕ«8x`?îð¦*Ã’…󉎉%6.îoHI’ÄñcG™0~¼Òä)wå4l +ç“ ¸÷-3K’ä¼ÂvIÇWlóŽ5.oø9ú%ÉeûåÑÜ?çÛNÊ'. *®l>UÏ'Kf‹§Ã|ùu]}ûßð~…5ñ…Ùlæ?÷và?÷vöb|s4R¬Õ8u¯¼Ñ•_!nÈÁ?¸Ÿ°£cÁÿ¢r‰«@ .A¼ÏX !Æ@ 1@ ÄX !Æ@ þ%nþÙÔ9Y|.¥|YƬ ßýK³”ógº \ß… `—,aºÝ–4å3L^»\zÿòÙIð/Ý®ëmCùïßµÚ¯tYû( KZt]Ççó¡ë×~•ÉdÂl6ê¥<†aà÷ûQU?×Êò"Ë2‹Yþà­#Æ9ƒûÔ!Žž÷âˆO">(ÝE÷fqúÔ9”°8¢‚Mÿâ%h>§B /JL¨9'ec òž>ÀáìPJ–ˆ¸†ÁóŠÒ-ßiI†î#íð!²ƒŠQ,ÊšÇ.ê¹Ãì?g§xÉ"X¥ë×u‘(àu»¤@qW‡žÂ¯ÈH’Œ,‘#8`&ªTi¢,7Ò~ ÜgŽqZ "6*‹R8îÝ®;øeæÏdeg!_¥>êºNb±â<Ôíìv{¡­?>Ÿÿ~þ)ìÇd2]µ-9iݶ•«T ï–ã6èLûWSzèj–¾Z 3àÚ½€ÁϾOLïÿ2ü¾¸ë™_'~Õ¼ÒüÍs|=c}†ÔöÓø¬-ÌÒ…ôÓ.~{¾>Oge×O|U–®‘ÞóZBdpýy/䂾‚m ãoˆ4þÓÌx®)c>bùÇí°K¯rÕ°;¹kC¶,yŽ„k L®e—õήé!^mû›#é÷ÿ“;fÒ¯ûN…8ÑN`÷I(–”H°UBRxzútºÆä»W\RW.³Ä¦ñ}pî¾~«+E• پm+›6£vº×ÜvÔˆax<îB-Æ~¿ŸÔ#‡1jÌ5·Ý¸q[6ob|+бb&¦z]Ò¦Œdú#?Ó¥( ˜qc7BîÃX²jN»,á$×nJ“*±ÈhœÜø½aÄúްaûÔ°r4¿») éëøeö*N*qÔiÒ”ªÅÃPYî9¾þ7¬ÝG†a#¾|=7¨@¸"å ò¥3¾-ï­Êè•sÙ’]‹gNçtf6/ ¥ëw÷¬dåìyl<˜)*‰-S®ˆIÊfó38Tª!»–²ÝA©ø8,v‡šÎž]ûÈã¨}ç]ÔŒ3£{3Ø¿v1î8J†G&¢TMZ5¯N«Œ¡žcý¬9œ)SçÎÅl”Fù~*ë‹tbLu‹Ç`ÄœlÊU/Ž{þü¸ìoŽx‚Š‘ç˜;üY&éÌCM’‰‰³³é|?ëOZÝKJœ™3'ÒÙ>›ÖƒøÌSlú}.k\aëé,ýéGþ8>Š·MÁî?ÎŒWŸbFÅG¹;ÉÎù[˜¹t+J“­zñ¹±jòì~wCš„ ÚÂWï¿Ëo-$&†àZ9‡ 2îƒg(k•nÈ×¾[L·±­°XMøõDZtéMç:ñœÛ›&ON ñí/yóò¸þü€gÞ\Áúݨ\ï ã†ÿ@Tÿß> ;~Í?~Ê)´ˆÎ×€¤P®:5Š~ÇúUkHkÔšòù;H~dÅOÌeÈ·Qsô,FµÇ»ëK~x2_¬nͨ¶6,N'¶¨Æô|¥+ñÀöÿîàs ßýÝëÇÀ©ÜUg ?ìÁ ÅŠÒ¢×(: Ã=|G·$€Ã¼w&/ëLíû’0F/§€Çšxݧ®Kà]ËÛ#fSæ­ù¼qGàaÉØLžû j?Å=#DZ¥ýC<7¼(ÎŽgcR?¾}2…H T+ÏoçÛÑë¥NÄ™ G˜Z ¸=Å04?¶ òr‡O0òK:H@ ¼E8Ðé+û™ðâs|·ò^ÝÀ›•ItÊ~ÒCÕˆH©OíòE±+2 Õj“hÛNÍæqÊà,Yœ¸à•dd{áø2–?ˉ!¨7Â@—ÀŸ~‚SwÐâ„¢­ùú°ÿ1ª,uj”fÞÊ5ì9Ûš:Ç?gúñ ¼Ô±Ù;ßç€9…þ­ãQGÙ–´*ý!ßï8‰§u1L”hÙ’ø@M5-_™r%ŠN]‘ò!çØ{Æ€’:ÇWOáÙñ?³+Í¢á౪œðêTµlu’ܼ%E­@|)â#©Z¯:ÉqA˜¨Z·(ÚäƒdɱëYÎVy–§ÓTHLaÀ¤¬n?œc[òÖŒ®$Jú¬ªºêÇãÖÁ,ƒxQŠ@pëŠq`¢Hõz$¹Ã;Œ[ø 6« ’8È[=ú1·xwFÒ‚¤p™]³2ü7w $fHXìæ‹G’L(²‡å¢'‘3yË{žLI~õ%wEH¨9Ùl'(ØR ã`jÖ«A‘™sÙ¶ÿ îo~ÃU÷yZÇ+¸7¹ÑMN¹±u+³Œß§æŒ%d¬NsgÛdV.¾Y2Ðuië¾àå‘¿Qå…÷x½q2aÇ?â·נåN<’±ØM—ÌŠÓr1¨/É2è:*î,ƒ”{ú0rÄ#Äé´œ%+&gøßtÇ@ÂBBrjGÿÈú?×RÙ»Œ ­hQ*i6ªlç¢YMXÍf MC׃.µ €¬ÈȦ‹ï–eÍÐNþJß'Ça}f<ßþ§Q™¿ÑëÙéhê… h>Kìf… o¹”d ÃÕå!¶jGÞ›>’rz6þ»ÈöÐÀ áö _ü©Ó¢Qb)`¢‡q…û†%® qúNæþ™†š±›o¿œÃ†Y(Jîå| npùá ¶ü=<|‰/ dÆŠ­l߸”/F½Â‡ëÏ¢Æmô Ìé~¿‹×)¬žóþœuìܾŽÙSÇ2þÇ?8¥«¬Ò‹/ƒzñéÀÖÜ?tE—eØì3€B\b$ÞëX·u;ûÂ[(æyëMA[ܦ•„=nœ[&Lm)A’3(gô žX—'ÜÍÆc w@†¾ûý_@ûÿšˆNºƒ#»³vC`[d‰þp,´ÙJ±ÒÅ‚` &6>ˆ 3P©ÿOü=”‘ïöä»lAq•éðd/b×ð%¨Ð²5ç¯$¨ú”¶€!a)Åã§â~eýø [é&¼2iÍ“‚%J“˜{1` ‹¦hœ“ܱ¢K•Æn·[¾ý:ìdäãw01<…‡ºÜICwA&@²U" ¯óBìÕJd|QôPrNï§'’T,°—kϰI6>ý6¯>1·)’Š:Ó¯Èß7N ØE"¾Ruµ»ƒ£ÆÝT+ƒ„ðŸ~$ýÕyýá‡0â*ñÀÐ1toYÈ$$±ÅÂ/>K0ÙC‰OL ,7Kˆ‰¨âI$8%̉óÚF^x¡9õeiÛ¾:­î+E”M‹_jcA±Äëa\\KŽxJ—,‚Ù%¢OLø Û˜a¼û샜'”R)íx®ˆõ¶zµ)$†%Àa‘00Sä>Ä›Ãåc¯¨’µy¸_'û¿áý• ú '% D{ö_ÎÈÓØÔlUï{’G¶ãÝÞpÞÜ–¯–¼EUká±Ó5gÃm 0®Ó·cté:ü–¼<ЩãˆçûöT¹JeÜn÷?>5ßï÷³dÑ:?Ø5O8+êËü×uÕdºA®]¶mÎÈ_Ê›´à/%¼¸B«§¼<뤼tÿë]ntùyó¥1¼F2Œ¿/ÓU6¦à´¦7l—K¾»š]ògðúÿØåvòˆ¥¼¿®uç—׃ü‹nýÙÔ æÏ#3#“2ÉÉWõødYæ·9³éÞãiBB ïƒt—ËÅÄñ㸳ý]WO*I¹YºÚ´mwS•aÉÂùDÇÄ÷·xñ’$qüØQ&ŒïŸ4yÊ]9ÝT6•óÉ\€û–I‡y­QèUEC–®²m•„S;ËúE Y½ý$šébçbH a%šÒ©m2–5tþë)›tájçºVâ¿o Vp§ûOÚåêǺ1»Ü.ãô‚ÚÅ_«wÍÛ¸õ;5jÖfåò?X·vÍUë²®ë4nÚ ‡ÃQ¨kŒÕj¥EËÖ¬Y½êš ="##©S·¾p‡/B ܘ·à÷zÈÎÎB3)—ˆ± «Wæn—žÀ0 £Ííox¿ÂšDQª¥¤P-%EØCˆñÿ¶ñ¡DQ§]7ê´»âF"¼)Üqƒ¿ØÈ…ð{1þ'*o à/ 2u @ ÄX !Æ@ „ @ ÄX ×É_M!ÒA {\ 1›Z nI’ÈÎÎfÇömddd\eµ…¡/Q’%K¢(J¡µ‰®ë¿_fý„Ûå*Ôöðz½Ìüq>¿ï*öØdi9êŠ IDAT×ά]½JT"á Áÿ“'NP¶\yêÔ­wÍm7¬[‹_-ÜYú4M###¶×‘•lã†õìØ¾MT"á ÁÿI’rŸy^ë•Òm’(÷-U×°‡Hƒ)ÄX þ.é¹L„®$N·ã@EØCˆ±@ BŒ@ 1@ˆ±@ !Æ@ð?äâŒák;í,s­Ùå¢ò1‚¿]×sg_kö°n·‰M®Ç’,çn+ ’~Á_ TRi–ÿùëÖ®¹–›HDxV‹¥PÛÃl2ËÄ ã®Ã÷5¨U»®¨DBŒàÿGÅJ•‰‹ÃëõråÌÔBCC±Ùí…Ú«•ºt%ýüy¸ªM¬+‘QQ¢ 1‚¿ŽaX,âââox¿ÂšøB’$ÂÃà öø ˆgÆ@ð„çŸÜOØQˆ±@ !Æ@ 1@ ÄX !Æ@ „ @ ÄX c@ „ @ b,c@ BŒ@ b, 0‹±x“‡@ þqA”rÞBýsS¾Ïøü¹s,˜7]×EíÁ? Ä2GSP$ºˆc“ÉD³­0 ²@ þ Š—(IHH†ñÏ{Ç7K’DxD„¨@ øwdÙ0þñÇ¥b—@ ùœÂ!Æ@ üË1ÿÊ3²Âh+ã¶(ÿ•Lp«×£óúM¢i B\. ËIH€çË…6ð¯$I>S4rm^¿ŽfH…ÊŠ2`VÀ¬HèF ´W«GpëLÁ½pŸ®to… ‚Dˆ à ;+‹£Gâñ¸sEEp±“¶;ÄÅÅá *¸Ó6 $Îf©¤žÎfÛþ“¸|…aUˆ"C|„“Š¥ŠP$ÄŠÍä<ƒ¸œßUUåì™3œ>}MSoúº$+2¡¡aÄÄÄ`±Zÿ5Ab,Üæ"ƒaàr¹X³z5¡a¡8N‰wòZtsig9~ì5jÕÄáp^îJ™n½Ç2Xµa±‘N£Â …)ý>?©GS9}.ƒ¦5ËjFQ¤ü#;4]çèѣܿŸˆÈH¬6ûM_6UõsèàΟ?G¹rå1[,Â3ÿ‚ÐÛ¶l!&.–Zµê`µÙ„Q 3#5«W³{ÇNª¦TG’.Ÿr“zÖËÖû(_2’6 Sp: ‡-UUcï¡cÌ]¶™M»\­8¡JÞ0¼defrôÈ*T®Drr¹[&›bê‘ÃlÚ°Ç“X¬Ø¿2b,ÜîÞ1pðÀ~éþ$V›MLæºAÁ!T¨X‘ysfS¹jUÓåbœáÑ8r2ƒ§ïo†ÙlÆç× Mù“ŠÅS¥\Ë6¡^ÕäŸZ ¯×KÙ²å1Œ[gBWÑÄb<°Ÿ³igIHLDb,þ üªŠÍf)h¯ÕjÃç÷çˆL^5’ÝU—rXÉv«…ªì²,á°;ð©úç÷†ž;£ ø,Õ2)”öæP-¤ ÉÁqL¬g#Ùv¡ÎHHhøÜn¼ª¤Xp8̨^7^ŸfN›¹PÏñI?ä,ç¸ððeœæð¡ãdxô\çÙ042ŽîãÀq²l°cêÚ<8ˆ%GÔ@Ðö’cü-ÝÍÞßÇЪL4áÑõöõZ4ÙÅw'QyàZN/íAé’Yì—‘ÿç/às=Êcè`èŸîÙŸšŽ¦9ßf“‹Å£¡ù“Ù¶èeª•lÉÌÓ*’qÉv×ó1$,67¿ö¨Gþ38™­ßØþ×}žë‰\ôŒóØLõa-šDé§²mÄÆD`ÑÕÀšeIF?9—^ K“X†&ưýÈ*Ft¨BBd8Uû}Çþtý²ãþ÷ôßÇ ÏX \æ+ŠÂÁ#¸sÄ^ýf]ë„f`è™üüP2}Âf‘6³= ï§’B¹Ý¼uí²ÎYWÑ “R€_chè(ÈšŠf|“ICGsg°æ»ÏðwømRË\ïáîw¾§œ½,a‘/3}†N5¶H(¦¼B]EÕ%$YF¹ô¹¥q!D*¡(òe¢ªkzÞNú:]³ ž1’„Å¡°üÅ´Ý;„½‹»e’sˆøT+) åC_åâ=|=3a H²É„IÉ v:~¿Š®’Œb2cRrž\ë9÷ÍLÝ‚ÉbÁj „*TÕªÊ(+ &SÀުߪƒ$˘Ì&$]YF–@WUü—”߸\ã ²v’¥Ÿ¾ÁðI¿q Ía’±ÅTã¾§úólç:Ä8àè7/ñ‰ëyŽd¾BQTVNëÇ3™æáW8®¡æÜ?Ù¤äõ.u UYÉ)oÞÑTã¦Z.ÄX \æÙÈ;!¡AX”ÀZdà KpaN3 ›í8í Š$¡(n6}?½I ˆÝ·˜Õ‡Ý„%Õ¦E‹z$ê[˜ñÓ2œr#I’ÉFP°“’ï#E߯ò½*6hHqÈœfþgó0µhOÈ/ïòÝš,²Š-àýÏUZ4¯±i>“ZsWršAý”}üþÍO¿ó*†ø8¾u)ó—mâ¤A–uñ­ZIÐÑ ˆ„çÜ!þX°€M‡Ò ´õÚ´¡Fœ Íw†U3gs¦Tu,;–²õŒ‰Ru[Ñ¢F œ¦KÂ߯ÓÀ@q†â¶½—x—’$c¶èœ\1“¿ù‰H®E1IAFCÓ<¤nXÈÂÕ{H÷+8b*Ò¼e]ІÚ1)>­ø…%ë÷‘¡Yˆ,]‹–-* K&“—½‹¿åç=ÇÑC“hЦ •£$tIÂul+,ù“}§²1E•¥aÛÖT 3ÈJ;ĺ?×á‹)JöŽ5Ì¢B“v4.yQàŒO÷iŠIbß}¸÷™õÜ=î>¼¿6QêQ~<˜†ôÅ(òZ×1uæqLòa¾ÿ`’7‹í¬æ|F0¿NúýžDí]Å„â,gõt¬qUhÖ¦)eBYæÜÞÌ_²Ž£>qUiÖ®9¥ƒý¤íÛÌšÝ'°8ŽnßÊIµ5Æ%íh7Ñ|E!Æà’ÎÓÈó»![p‡"K2² ‡ $àðÜ8ÛΈIc‰Éä×34ôz·.%ósþ™Í§ßdTg‰³'Žräh6²ÙŽ÷WL˜™ÎsÞKܾo>í /}~%ƒc?ãžx’ yè{þ4éOú RO¤£ç™÷úó|ÑáGšôª]Q9³>ÃûLä¡F÷Pæð ëû6›•’”M fÃÒÏ™÷ýŸÜ·¶+ ,ûøñíW™¼ÜMbÉH|ǦóÙ¬mLœúÕäƒ|Òã1~®Ýƒ'ëGã=¸š/\…ûÝ×éX-ÅЙ™®SŒáO1.Î/ÆÐ t9 ’¢½w1ïÆüS”I4shê¾¹g,Ÿno×OŒìÿ6GªS"HãüúS¯V‰„H‡f â© ±”­DB°zÔO±JI(6+ç—Lå£Ó%°é.R7ã‡Õ#ùïÄn„ï_Ää7Dz(ÕL|œ“¬Ã_óõ¼|ôÑ3D[Ãø'b_“^ü§r™;¾åó™ÛyoÚ`êFÛrÊ$ßÐ?Ã0d’ºw^ýŽ ç3µwcCÇÂèøÚ[¤nÿã¿^@ƒ&.ÒÜ:†ç4G†¡¨nÎeºñ¹ N;A¶vž-o<Ë«ÙxâÎÊ«gÙ1ë[ïʤÁm°mÎСŸ°W '6B&mÖ×L_öŸ~Ð•ì ³xí©÷°¶{Œ&%¬œÙø9“=Ìôï_¦’MωÆ\ˆ¯ÿ{®²c@P@h$“ û±ŸxùáCŒ3åx…*Ç78Zþ+[ì86LR ¼l 2c ®KA}(k?Ïì1½ýëlìüO¨‘!\Ï ÆŸQõéɼTÇÊÉ}œN{Î1aMGHKµûŒà¡Õ«˜™2˜·_,œ`‘͉Ӣ\¼NÙ‚3$'éüöõW¬±7aô{Ci–¨²ijW~þ>§âãÈÚ™|õ‡ŸÇ§üD·2 ¨›è_¹o.yœoš+XƒdâJ·£ß°»‰Ô·0°Åcü´r7­+ÅfºñN:';fàgž?BЊ~žÕ³ÿË/© ô~ï}î«ìäèœhÚåU¾ìÚˆ–;ç°ü| Ÿ,ü”¦VGÀ‰À’½’7_šHvןù¤o#Š˜½¤sáˆRøC÷rî|qÚôD»J‘œþã èþ¿¿z/I¿~Ç™å0y4mŠË¸O,à©”»âaÞŠ3crD’\ë~ú¿Òˆ"éó¹¯Z¾Ýò,ušÅÿõÉ[2px ‹NFжs ]ů€ŽÙ\‚;ª'3æÓ턌›Hß=òù†'ykTÀÅ¢ú“6?šW' ¡|dFÖRxdÀ jFjlúæ%z¼ó_Ö>_—3“>eoÉûxwhw’à=8ƒ‡ïÀOÞOO»Ùš@ݶO0øÁò˜Ï¦Ð¤X_>ßÕ—·«[¸YVó 1¤$å˵¬á·— vÓöÔ.aLF2\¬=¾†ezà9f`k颂k ÅÚ¶§¬ÝÃBLB1¬êYÎfÁ€t†Oᅦ ôbјNÄ+nŽyy²yÜø4ÍïÎ;`È=oÎæ’ ™‡Ù¶ÿ,åë7¢z '’)÷?B•>+Ñü.NîÏÜ¥‹ÙpgF #™ Nî< CmiÂä#¹Yc"äxÊÄÙXžî¯]ì)¯w©’‘sažç:_Ràš IÂpŸbïÞýDWëBƒ*±˜eävOÐ:t³7ºè’܈b'úðT;÷ÞË}÷µ¡l¨}ó¯Ì;šÌ §ZS,؇G3‚ÕžæÓˆiÜž;*$`·ÈÄTjH²sûS¡YËâŸö²cýO˜ YÑ8qü4ÑkN ß+a+R”⵫ªëøCËP±ˆŸ¥g}—\ÿõ•ýâm”÷ÆŽGré”s¿l%ì°`ò¹p»²qû нx«êÂëSÑ4?nàÐÐUHh}'U#@Ó BËeÚñƒ;Ø™º‹ÅK_£íOc<‘÷qüÈêo<1Áe*R¹rf€ÈÊT8ÏÎS*ÈÖœ¹êXÚ$þ]ÕïÇï÷&|^/jpš¶ïL‡ê!èzŽYÃX zñâçjºŠßçÁ0<ø “EEõ»Ñ4~¿†n¨ø¼~ Ö ¿—žÔá‹e=)ovãõxð«*†®á÷ùð{ÁŒÝ0Ðý^|>/~]ÇP}¨¨˜ /ªa k~|>’là˙Ԥº³qû5̲êóáÑuÌ8°Ë:ªÏMfº‡ÒõãýÏRJs¡å(‡98Ÿ{²¬‚æÅÀ‹®kh~/^ŸoÎúZŸÏ{]±ßïÃëõ†Å„O3@÷ãózð*†$£y\¸}~LvCõàÖTTÅŒÓbé!8ù>ÆýZœÅsaÞgÏñÁèr ÿê:KçñJvBÙ./~#01$>L¡^2Š,iøÜ™¤Ÿ‡º]^fPÿDé>tϬ-!Qd¤zÑe ‚${0ÐP}Þœr€"ËøýþkfŠÔ ÝÐñz=Hª {h)¢9Ɇ½éèåBðª #)^v§¦á ¯Š]ÖñëzÀFºÉëÍ©*>Ÿ/~MÂlÖð¸=˜Ô)ÃÐðfŸãìy_Å ÿ©Žƒ LEØ93χ¤€®yñ{ ɇ!ø½ ¯‚W5Ðu3ªúï¾ÔB,m9"¢£ëzà§¡ç¼&OF’YdP’=.::zΤC×/fïÊù]×ÇÁ0¬fÎýÚŸÎïœã…¯Þ¢u¬ UÓÐ °˜­˜4·]’ÐÒp8S͹#0q(çš4ÃL¨]Á“žªéºŽ'm?Çݲ3Š˜P+ç¬KÙ„gÿvz$dÅBX|Դäú¢(^,øøŠdÂȹvã’òž9ß9ßו¶ØÐ t-°´I×.N ,y |°„ɉÔÃKÓ$ÆÉU¬<LÅÒ!†˜ätzv _Ì™ÁãIGùá]x£ëPBÚÉìõ™˜d)p,=ðÓ€À¬wíâr$Ý0ÀAtTÇŸÁkŽ%>þÿÚ»ó8)Ê;㟧ªúšû€¹¹DN@@¢h¼1AEMvu=¢˜õÎb‚1*FÔ’h‚®F³&9LÔè1 jP1‚/ä>çè³Îgÿèî¡fpÌË‘¿·¯²™žéîªê~õ·~O=õª¼?*4Ë>JQTYOcC 4Ô×Q?÷Þù÷µcc·?Oìî‹Ô¥2BtTtù‰ãÜ5¥ší×bfƒQç.Û :~GÁõšA>ÀtÁãÍ0æêG¹ðЇ©¿ô^þ½ÀæÍ›A)b}i<„Ú¶gxé/K™ZÓÀ ßýK=—áÏ‘}NG÷aÒÔý¹ö§¿dñŒ¡Œ ½ÏÏo¼“#ãБ;u ®½‡;‡6qnsš‡f=ÀzËUćLçø’³¸åòkˆÎ>ýÌ üõñßãžq# ÊoQîú\•ûi‡kQUÁ0˜Ÿ´/óC~ä.rRºu%¯¾´ˆR3;¢G¨¬Šc ÏwsÇÝpÉqå<{ý·ygø×Y0>X8û— æ„£GR¼þ–®qXAÕNã;gßÀç•aw\Ãá}¬ü0Áþ'’½:Kwü—?ð­:¦sþúnº¹šoœ}8éxé÷ÏQtî­|Ùì´¾Û»œu¼ŸŸ¦vË_“¬µGÆ®áœ{æñÈÄ+˜4m+ß»üx•üêöyü*~ NŸB]T³‘?oùÏSág‰ÂÏLdgu*¿¸x³+|.6cË =·”ÏeœQpmr  ŒŸ; ?gÆBˆÝÇÛ@КHy ýhÊb†a ÐèÀ¢¼a•– P„J«¨¯55oPÑ4ˆ†R3[ÝhWÒPC¯ûÝXɪûf2éîlebWsò틸露ôÒpõœÓ=·ž/}k&_u/Õa°(­éG]yˆÀ÷qÓ>ûϼ[>º„ËŽœ€ªÅ—/¸…3~û<–§ÙÆ,~ÔîòíœÇC™ý9ÿ†o3yÙ<"Ä~Ù÷ÿ/e7\Çì3ï§]Uqà¤Ó¹ºÚB¢ºßˆe+©@)Šû6ÐPà w ¢èñ ù*,±†¡°øq®¾äÑŽÁS"ûÂ%?~€yó<®s_½;IÍaçóð‚Y Äem$ÊG¿™Ëy·mÂ)îÇ”soæGHÈ59ìÖg¹¯êJn¾ìn×% 9æ"æ~8±êb1AڈЧ©¥Ê¥bâÙ|ÿžbn»ù\vÆ­ØáZFuWUC°%JŸú*"žïc («ïGm‰‘Ý@äþ­vyºc§Ï’—B ¼§^kä–kneιW2âè xìîó9t` *ÐDûbHc)¦RFˆ’Ê:ú5V3A (­@cE8 €.¡¶¡Ž"×¥iÆ<n`ÎÍ7ræ½ tQ“N™Éñ• båÔÕ÷¥ØÊ¾/*°¨ê?ˆú(øB÷ž(êä̧ÞxÅ•ÿõQ£G‘N§÷˜)°„ÿ|IüЃ?çk3/¶m ¥Ø°q#¯¿µ‚ÊÒ0éd ÇË7Ï*Â%Dƒv"EUL˜4™.™TÇWÄÊ+ˆØm´ÙÙ/p3£(¬°í€HQŒÇýиÉVŽ"Q‹ ð26*%H´’ô ¢Å¥„üñ”ŸûÆ2‰ ™€›q0"!œxœt&Eš(}úVQ6üúkŒ?o÷¾óÇÛx*L¬¨ˆPnE´og·O›••b¤Úˆ;…"RRJÄO“ȸä;ÜÆãí<óÇ?2í䓱B:OñÒ?âüî¹%|ïÒi´ÇSX!‹7ßxƒ­ñ$¥ÑpGŸd T–•2røpÒÚ¢(Å2 ðRÉn 1¬ÅÅLÃ@éÏN‘Ì8¹þFá¢bb‘l³¯ïdH¥2¨X 1!žv³g¹Uˆ¢²"‚D+)Oa†#Äb1B¦‘Ý×®M:™Æ7BÇðSí¤ÝìóÇÊJ±ì8 '»õ†¡xë½õ,|c-|i,UÅjÇ–]­Ù°ao½µŒé§Í •Lî6f˜¢¢ìkgC:C:A ¾@F[”[)ZÚ]´R„"1b!M[Kc™HÓ~ûqÚiËdgÂ2¬ÅEaœD;?û÷EEÑ\ý®ñÝ ©dŠR5±SI?»mEå嘩Vânv,ËâÕ%Kð\‡æ±ã0ŒÏæ ®RŠõëÖrÇüùî]÷Þ7-÷Ö'DnI) -•±¢£ÖA€2M>^µŠ»çßNqqq—ëy'NäÐC'Ò^ð¥›nÝJa¿g/“¤=ÛÿÛNuûÚn:Ak:±ýŽTþoÒí-ÛŸSçî‹·îð:¤@™!Ô–¥üâ¡?ðaºœRw-Kž~‘ƒ/¾‡É¥.Ž ÉhËt±É–m¾L&ÞJ¦‹æ×Ƙ,ËâÅE YüòK;ŒN>Æ`ØÈïâ&“´e’;¯‘“¤ÍIvó"™D™D§»mìØÅÌ&Þbw¬˜g§‰ÛéŸÎ·‰·Ú;<ª­e§ÚM÷tB‡ è8¿}ßu½ïKJbüæ7O°vÍÚ.‹¿D2Áw©é[MÚß>%¥ï¤iwÒÛì2]ïGìívç÷zk§u v{e,a,„è­5®ç1aüxþüçg»ý‚R \×#ÿË´žißÇ(mbè þlz{UË1³îàÔS'¶]>‹™…{ü…köL$\zù•|cÖ7»< ùWÚ=ú|г!$?Í\ÆíííÜ1~·Õ¨RŠd2Ù«ÓæÏñK !þ¾ks½J•Âv]ìÖÖÏ6 z}<‚¢þL9ãRŽ6ìŒO¾‹ã¸¸ŸÑ*öt[­ñƒ$“É=cÿ}¢žWÆ…Ÿ¥r<¾[·,лÆ/ c!J©ìù»|Y³ÇQø8™4No}izו¬ÊvrÊØN®‡î^Ôç&?øä-òýÛvö¨ÏR¾Gõîl¥0bŸ¯ˆ¡¬¬Œm[·PUUµýza±SÐÆã픕•ç2Fï´Æ¢,f²jÍzjûàyþ^³ù®ç³yëVªò^tŠe ˜–IȲHÄÛ ‡Ã{LÕïx´ˆFcì®æjôCIcš›Ç°há_زy3 WPìT9iX¿v¯/}á#F T×_µå!5˜Gžy“Öl"7úå¿ØŽÇÂ×Þeåê6¾pÐ B¦î2³JKʨ¬¬äÕW–NgöˆÏ’ëz,ûï$ wÛ:Ke,„T|Ô×70ú ƒX²øeâíí¹Á;DžišTUWÑÜÜLee%V8”íyÞ©Y³®Â"ÞPÃ$=ÿ6­I½áêPÓPпšCuY”Ò¨™m²î´q‘H„¡C‡²|ÅÛüé¿Ã¶mþÕ?Iáp˜†ÆF†FYi)†aì–&k c!öå¢8÷¥£,“ýöÛ~ýûøAnú?© › ò‡ÃÙ!>;}Yk­±L“¡uQÊ‹êد­{ÃaR`)Ÿê˜¢¢$„¯ÙiûU® ¸´„1cÆ2zôÁ¹Oö„íSX¡fîò³ÝqîXÂXˆ}¹(Î}édçž5 ‡Mè§Û8¦£CRW•S~¾cÃP4U†Ùûv£E ³:º›ƒ;Ó aZ{Î>(yNÂX±ÛC¹ð Iôlíp®5!Øý—­~îÛ¾óïô×1wˆJ.!„b7“0B!$Œ…B c!„BH !„ÆB!„0B!$Œ…B!a,„BH !„¢“Þ™N†ÃBˆ}8`òC@*¥dj.:;CWoÎæ$a,„ûp{žÇº5kx{ùÛ¤’I™(¤€išTW÷aøˆTUW÷j K !Ä>H)Eàûlܸ‘eËÞdò”)T÷©a¯áâŸà:.ï¿÷.K¿Ìa_˜DyE…TÆB!>[žïó÷e˘zÌ145ö“»ºh=h3Ã0ygùrÆ:¥z§«•„±Bì»iCKË¶Ž –0î"$C!jêêxwå ‚@cš½ô:²«…bß®þ‚ Ñ¥0 ßèÍ š%Œ…Bärç³:ªÑZašF—A¯5¦‘í½øšÜßj|?èÁz( CíðzA ùì{„+>Ÿ³èÆB!v¨’» %ÓÜy` àºË3M>űfŽmn"Rð`Ä–w–°d Œ?ަ2w~óËLgÆÁåÁ'Ä_ÐÎ[ƒyw 4IDATÏý‘¿.ßHPÖŸ Sdtÿ Ì èàüÒXÂX!Ä®ƒXØ›ÞàÉgÉû[pÃ¥Ô læ¤ÓŽgTm ªsZ)°Yü㫸ºþV–Œh Qù'C°úÏ?ãú'áú»ÆÐTf³tÁ\î:n2§7—ƒÖÝäŸ<Þÿõw˜yã«ÔŽAdó<¹x5s¯½± atÐÉÙûi,a,„b—MÃn|%wÎ<‹{V äè£FQAËŸ}’²1VSBØ01MµSp†ŠJ(Eˆ‡ Â&ÛdmF¢”),#Š8áîg™T܈ïk4 ÃÚ¹÷ýínäOó ~ŸX8o2©—naêW~ÎÓ'èÆ )v^—Àà –ÕUï«Ïë¾i<{ï_{-Ãa !„èèMÝÕÿ·üì¹§ýäøÉM×sÝœ›¸íŽ›˜1ª…i´ð̼ó™2j0C†aÚ¬¼Õ`‘О¼æ Æ Θã/ááå> Ð:[ojæÅ¹qõ6bšÙfì䪗˜wÞQŒ2‘“ÿù‹ÖhÐ^«7š >l©7fö÷žã€ç1udT¦™ä…_È”ÑC:jgÝð+ÞMYXV†g¯9›sî|„;/ÆØáC{üeüêËR»Ü~­u¯ç±„±Bˆîƒ0ÂQ¼TœÖvƒP8B¬¸‚úƒ¨+‰b…^¸j §üpSgßÉ‚]ÍI#*q“f4ÌwÍæ—Þ‘\÷Ù^ôßúÚõ¬Ä"¤¶WÐà³á¿òÚš4 H¯ù?¹ìžp¾ÈÜÿÃwOr™÷•óøÅ @ƒ202ëyñéÇX[3¹s/â~•„MÍÒëæÔ)fÜpwÍ=‡Ð¢[™uÃ/ÙJˆößâÑY×±âÙ<òÛG¹jäk\{á ,×&–¢Ûíÿ¯ îNríó̽üÂ¥¡"JfÝ›üßë1N½j2U5£¸vÎtΚw1__y$”¹´G‡rƹ_"pÒ¤l— ÐÙÞÓG&•Âñ5¾k“έˆu€›N‘v|,GOçë'ü…Ͻ˜m‹ÆRc¥X÷þfFÌúàã¤l]ûÿ)VQ6,þ5fÒØ4•ko:‡»î›\´þjŒÑ¾n=æ°/òŸ—œˆo§I9ί۱>»ÚŸÇÝ;]t5rÄð©=ìðÚÚZ<Ï“¹-…b/åû>+–/gÜøñ8ŽÓ}PÕ0 &Š—I‘²}"}‡qâ9Wrñ Ãh¨¨ ~ü4ŽYJr[;^¸‚!Í_`ìˆþ”„ÃÔCóÀJ,(ƒhY=#Æ6ӿؤ´q£†  "¢PV1ýÆLäàÆ(F¤’¡'3¤<ÃÖÍ-¤‚brÇŽ?€ªˆI(VÅàƒGRÑú.ïm°é;f_p"ƒ+ÂT>š#F–“ܼ‘–´¦¤a“ŸÄˆÆ2Bf”†ciP©e+¯gĘƒéÍËÙåÁH"ÁÚ5«f$FX;d?ÛðlXD"!;tÝsZ)ÅÆ xeÉbŽ=îxL«ç ÊJ)Ö¯[Ëóç»wÝ{ß4² ñI ‘[’@ HK3µBìë‚‚.Îh'ãѹvv½€™3/ÄsÝ*î!C†I´ï8I„öȤ¼ÜÙ¤;¦qSI ŸEûvÚÃîbuìT2w4ávñ{g§ñºx —Iáí°¢.™”[ðÈn6ÿsôCÂX!öqùVŸ–ë8:qb·æûþÞ±²e½„±Bˆ^K´ÖZÿSqì%»«ý {}ð c!„؇†A"‘möí<ï°Èž÷õ½Ó4{õ' c!„Øw“†êê>¬]³šºº:²M±ZöKǶiiÙJUuz³©ZÂX!öQ¦a2räH^})醋ÅÐÆ´†–mÛØ²eã¡zoœ, c!„ØG¦Amm£GæÃ?$JK¬˜&••47¡¤¸Ã4ÐZ÷Ê%¿ÆB±OV}ÙPQ–IS¿þ445e{ KwqÔ¢0 ³×‚XÂX!öQ;„ŠRÊ”²ë×^}v c!„â“_èÍ)eÖ&!„b7“0B!$Œ…B c!„BH !„ÆB!„0B!$Œ…B!a,„Bì{ºK“*Í0$«…BˆªÚýjuÅ¡ÅÖ­[hkmíµA±…B än¸ªºwÿ} ÐZg îVÝü[!„»  ÃÜÜàÙ†h½S°v Z¾â»¿¨`)b¹% ˜ÈD[B!Ä'f1à(¥L­u HùÛü’Q]<(Dr¡-àhîþÒñK!„è)Èvî6»Í/vçfê|ÉäÊhpr!¿ß“0B!>U;¹Å&Ûdo®ÖÐuoê®BW„s9o,„Bô”Ÿ àüâän;ÎwÆ~.ˆÝN•²Kö|±„±BÑ3…­Í^§Ê8èIeܹÉÚDš¨…BˆO£0K;/»¬ŒƒNUr¾.\„Bѳ0Îgkþ6(ø¹ÛPU·ª‹û„Bñé™®nÿÅ%ï_‚dIEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_design_reports_vertical_group.png0000644000175000017500000024172012235000130030671 0ustar00murraycmurrayc00000000000000‰PNG  IHDRC°ª×a±sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ5: &:Ë IDATxÚìwœEÚÇ¿ÕÝ“g6ïÂâ’£€‚ê™fÅtæt*˜ÎtÆC=ï0Ÿ§æ,fÁ€‚ "(9çÌæ0y:ÔûÇÌ. ùß×PßÏg>Ë0ÝÕÕÕ]Oýê©§ª@¡P( …B¡P( …B¡P( …B¡P¢éÈ.ÐUq( …B¡ø­áÏÊwÆÐ2Ÿ&­Ó,|~*„$À!çÞ]†XYkß©"U( …âø_œ#¡t~F‰y=o µžv§6ñå»S™Ÿ‚€ؙÚþJc{ ùº ÎêP^þ] »¢ëÑ'^+mÛêõP( …âw.„„ eÚH¡íú°ñ¸ ¤”[&DÊ´a·Ó‘hBâÒõÍémÛØRì¾,’n—NÊ´¼¾oÖµ,~øsNQk­¾rM0+#„Dæï6"GrîíÁŽååÓxhW¯Ï/ë# ¡”B¡P( !TN²à‡op»” Ò±éУ?-óC|nG¢i‚Æh’5ë7²~å"Än"—ÛE÷}$/äBÓÒÇ;ŽCmÄdÁ¬©¤’©]ë éPÒ¶3­ËJÈ z ù=rÉŠ5bú·_ûøé‘ÇíDFmù±¶ò ² 5½Û¹v «¢«Çë“õá¸"£È´= rš¼O …â·‚¦k)±_qÝ• t M€tvžU‘¾'ÇÆVæH¡Ø))Ó¢ª1É“ÇqèÇÒ¡8´S[  AUcŠO>~±ï‘IúÜÔ‡l¬®§jíRN<îhžëMÌY¶‰YÓ'ѳßAf{@uC‚9?|K·î½èݱGî¼Ç’Ÿ}9Ýð"‹r‘ŽÁ¬\éÎïpLZìiA)-#ˆ2Ö$í!ÚFô0ü^yÖ…—ɺÆpúG!°Ã'£k»ç#²‰V2=XRY Åï¾?…+ebInºø}÷…Øf Ó™üÈæG X‰:æÏ\B4TD·mÈöˆ½‘¤mcZöV]#MÓ1 ±Ç& ź…‹Yݘ$¯}Oºy¶SÖpˆÕW²háJÌÂŽômŸ{Ër`§L,4Ü.åWüÑí˜iK¾ýf½úô§U‹<ìݰa.]cñºz~˜ôƒŽ=ƒ,¿AUC‚©_¾ÇI§×;±=›‰”0yÚLÜôìÑ€¹óàó¸èÝ£;2c+ÄOÜ,b‹4t!ØX—`âø·9ðˆ“)Èö"T7&åWïþÇúꇺžŒŠgþ&€Ävc†lÇÈÌ%$caÎ8ñdÜÿ9‘l=†'3ÚJˆ…ygÊ:|~õz)þ&DHbõõÄRaÜ@Šœl<†Øâ´ç7S¤Äq$²És!Ìwš†&Ò±qdZØ4}@"™é!‰fOŽã8›ÓB’j¨§.Ñ€‹²ó²p‰íøj…@Ót\"Â?Ôpë½gR¾f #ÆÕ*ÍG дí]»éž6›"™¹§-qÌ$õÕhXhˆæÛ·l¨–KI‹Â‘[§Õ|?éüéš2sÂaõÂõô:ëO•¯eᒄѰ¥+=˜žJAG‚°ã¬Z±–áRwÓ²´”¶-hR¯YÇÂ5uÄ,Ð ƒì‚Rº¶í4‹®d$Œ“›Ïu'u&¸E™Yñ0ß~:×7µ¡{±‹påF–®«!j'˜C§òb²t™¨gÖÜU˜Ee”ص¬ JJò™3~Ë5H$‹i]¬p¨]¿ž $,pùòèÑ%„¦A ˆØfÍ*¾©41rŠèÕ)‡%?.aÀíC¸È¿Š«þ>“e+rèÙ§5Ñ•ËY]›À\¾mZ—PÔ• RüþåP¦óåH‰ØÍ¡rM€”’æ‘$Çiã‡4¾Ÿµ¡'öŲ¶Ö†¡1~êb òrð¸ÝH šÐš;\é§ÓI™›ÖsH÷Þ™4Ãè˺Õx‰2 cŸý°}{uÆqì̹[nõ$2bHdD $3ß·#†2ç9R6'"3^"Ã0¨¬¬Åçó`Fs“mÛX¶E<–Àp¹ÒÇK5B¦øcàH@ÓpL2±)›ßI¸²Šd~>7×›Ò Ž´MV-\“Ö’mrÂE'2(>›ËÞ¬£}k“`I) =€¹/ŽãÅH1¹–ÉÙgDïf´žÆ/b~mˆÆU.»õxÊ/áŸ?l`麗Ýz<-æ¯`òa9¡éå¤Óåijb<óïØØ¹ EzÚ#…YŲõ6D7O„>Xе…!N”å‹60ðØ~Ù>ˆ+æË‰óøjµIK£–ÁRnº´/eT,Ƃ٠xk‰¤uY-S÷¥H&%7Íâ‚ÇVÑþàÞ\wl;XÄKÏÖ°Þ4±³óøË°ž´ ª×®áéWav,$Qçú›O$4c6ŸûúrK;xõÍï`H» Ó?žÄ¸X,^AVÏÎÜqê¾ù aã»+À”^:´3C÷˦fÑþ` ‡Þp:gg´bÔˆ,§–Žþ6GìÇõݳñhP_±‰¾ÝHm¼€G-»¦ø#xºE¦]w6{Hw& „ÜìÉiíÐ$†$`ÙéQ£{µÝÆÓ¤ë³oÀqÇirV7« ‘V!¶#1-l“zµ¥k»\ñàôëZʧö'+àå™÷§Ó¯gçæs5¡¥=CBnéøò49´H¯9Ô´î;ð e\ái™ˆ“3š†?àÅïóãriåeÛ˜¶…H L—…ÏíÍx“dz¼Q)"ÅïÛt  ¹Íð“”ÛqB’ˆ¥ÈïšM(ÑÀÌõ&¹Åôèß—è_qö§6—×ã:° ò9ÓêÙ³ùZŸ®qÊqÁ°ƒéí±X·!Œ¿E þ|A€ÿ>÷=L G'Û­á8¦% xtr¼‚pE#õ] ‡H4F]¸‘¸Û‹Nºn ‘`Ù¼Ny ûùlªª|œ8ä@‚@\ 4ÍdõÜyÉñœ\˜dþÂ*Dq N9e¼ïÓssyáöNdÅ£ü¸x®Âôî’ÅËÓ"˜¥A\™a®ŸÆhº èwãb5Â)“–…-¸éä.øâuÌ^¤]—Î<.G^™Dÿ}÷!§…™Ð›ÏM{·@î†Ù®r¤$eÙ?q—¥çqºŽiš8¶îù.CÇÐu ‹躎e;`ÙêíRü:S–üiJ÷+Ãvľ î‘Kíʵ̎xq Àpã7 ²2ÌòªûïÛÃVÇè)¼:×¢À•RÌßhÓ®[{¬uÕlÊó½É„õ ¤tH9é -—×À›ÕѽÙtîX„ß¶ÒóI8ñD&m‡5µIrÚ”_^ÁZzP.N*…«4åã+*ä„AYH$KVT®sÈ¡‚ÑŸ.çŒ}Ë1¼¬«V¯àßc7ÑкÞLwÌ´š¡AÔ.ãw6`””2ôˆrŸÑ“ǟö&—íÓ… ØV’ù+«¨÷ùÐÓ‚2¾x=óÚ±oWlh6®Òqн>M꘻ÑM÷~Ý&¢Äe²yšGlé&j JikÇh² ß…;cçÝ¡"z”ú©Ý´ˆ×gváOGà8Äjùt¾kˆ“p«—]ñ»ÆÐ3“%„ –4‰Çã¬\³~›‰MÒ§¨ ›âE†+Ó1L¯Säq»2^"‡X2Õ,F,Ç!šHa;6¦i!2Á8ñ”‰ÌÌjÕ„À´ÒŽMËüž4q¤Ã†ªzöïÖ‚€ÏMÀëÆ‘gÙ›'Þý^=ºJ¥p»=»,H™ÖnÏ5v ÷Òã~[¨¿´wH¥’¸2ñBn—Ñ,–N8árss‰F#̘1 Mk±Ëét ÅïGnÕóÐì0K¬GèÃpãoÓŠž%9höFîj2UºÐ¡¼,Ð rœŸ-od@Q þ|°qs“r‚~+ê€R,wñÖ„´ê1€v@Õúް‰ÞAªb©Ò´'=_TÐ4 B ™õÌ_”¢WÏR¼™éš×GªªÈ£U¶›ÚÕKiÌêN«Lg‡ÄÆZ èªUŒ»ˆzK ÜÚ—æãÉ ²jÊ nš2 Ã.?”ËËéçYÌWÉ"Š=›AS`%­aòÌÕÐàáŒí(È)¤ž¤¶1 d³xüDþµ<8´hÛ‚BÛ‡?#ªltMbÙöVë MÃŽ$i°LÊÈç)F3Ov=Ú†hšã8éàg³‰Ëˆ)@×Ñ"ëøqa>m[X¼÷ÖW¼£ièVüã–ý9¸ÌËÄÊÒïRïºâwMÓd©&ïvc$ÆÑû¶¡÷VÛŒ˜Å“&£^™J‹¢¢ÍÓÞEZ'ˆ-f†Ú¶Ó\ß6UÔ0qÊôf]±_×Òtç̑͞W¡‰t ”a–þ=‘2qÛ 9j‚>Ýóû÷lͰ“öã®a‡2òññìÛ§ç1CÇÉÄ=í†Ùá0™t$ŽHÓ¦Ùý–eáv¸Ýnt]C×Ó{ù}кM3¾ŸAÊ(€¼–5©‘âwíBÓdó4p4Ç>†c§M6näÖÎe}8Ny^1×\8€ÚœbZûiÞ'˜ëcÁôõÔ È§À%™·²ž¤fàóÁ¦EL¨hÉá:Œ·4q\­äå…’ÞS—9ôêPÎß®(FÏñld^•+ c.§œqG¶ŒÛžßå-ðà€¯‚Õ‹xgS9§õíÆß KE9€$\…´¬]Ș¥mùsï<ÒªŒ ¶%!æMšÆ“\·AÕšôkÍ7SµnÏÍÈçï÷ʺµõ8¡ŸL[ɇSWlÛ ‚‚ü,góôu@:m‹í7,Û¦° —›Ÿž°ÝKº ömó2;ÄæÙdMk¬‘ž"¯éàò‡>¦WÎ$R)Š s™8¯‚w¿YJß}zf†ÉÜÍ&ÇMÈÿ½’™…ÆDf…4ÃåaÊ”‰äçåms¬ Ô$£TWl$, Hf÷ÂÁ•ÙŽC¡øcø–³ZR9w-/˜[V;‰fxÈ/mMQ"ÌgSÖb¡á÷¹H­]‹å¸)l™M2a߃:s@H#©cîw G:h.?9!s60Ù’Í ˜•OŽGÃÆOnŽàëïVcJƒ`–—E_­Àô(ÊÉÂïO1gÖ:¦Y)<´(ÉÅpšÖ’@€‚<É߯áK©áùp&® åöS˜Àq °¤5Ë«X¸ÐFJáò åP”ï°re-óU¥˜fÈ*¦Ø+Ùr)ÝãEÆc|øÍêÌf‹iä»r²|;Áç_.ÅäR’­cÙ’`~6›–Vóê<n!¹%Å$"a>™R%šá¡ 0ÍÜ|~iŽÛL0îËe8\J³ÝXfœ¯¦­Åt$è~ sÝ|7s“¬´ÊðxÉÉÊÆ%¤CŠ?„1“¶M8aãH‰Çã¡S‡ö;ñˆJlÛ&’°0Íš&°3{“¥R)b¦ƒiY”””P²CßzZxÙŽC$ž"ÛgláU–D“&>ozÖ˜Ïë¥WÎéEY3½Z¶( ¸E!ñD! ž²I¥’è"mCån®s¿ívß+O<ó"ÖlªÞ¼š«tÀ1Ùå—æjŽäV(»ÆND‰}Ütf/Z:¼:f2­RZU=R(ÿ·èºFÈïeâQÚi²BþÆþ ñ¤Íâ'pÄÑ'`ZK$ |˜É(Ó¿ŸF‡0ôoÔ*„ º¦–xõ ú8„Æh,ÝÉ ú™ýÃÜÙ­)(ÈÛåLË–,7}÷Ý/D$Ö4ÃÌà›÷Ÿkøú͇OÍ3#@t'1C¤c†š4“Ø™MŒ(ŠÝBóðTWqů’дîPNË ¿îR ÅïDZ GqÌ©Œÿðu´ÝØ Ý2S :j0IÓ!ž4@c4NÐç£GžÌœþºnì2·ÛÍ!:™Úº†fû׉ÓoÿA|óŇT¬Hìºsi[ôîw.O€Æh<=¶%åní3ol+„D:0Z°[«O*ŠŸ‡+§ˆ^}[’Ž?rš÷#S(ŠÿkLË&‹qÌIç°; „Äã ñXóh’b‰y…-9öä!»•Ž”Ð‰d«Í,ëã8„#9ò„Ý´‰‚”™¢¾1ºÕ>…𦱫ֶCF_~;‡d"¶½Mí …B¡PüŽùß,‹³=±²§é4íoöS•$f^4ÝM›@xÏÄPqHò׃¨ª¬Ørƒ3…B¡P(Šßš¦Q]UÉÓ'öL !z ’~·rÕ+ …B¡øÍ"4DÄØe8³¦ŠJ¡P( Å%† …B¡P(1¤P( …B¡ÄB¡P( …C …B¡P(J ) …B¡P(1¤P( …B¡ÄB¡P( …C …B¡P(J ) …B¡P(1´W)Áp{ x ܃ؤÍpáñ»´í|ßóMÝ~udÊÈåóãÕù}Ü“B¡Püzî϶٠áñy1ÄîmP*%ÝÀëqÑ´×»Û»ûçïN~ö(½L»£¹½øÜ?³-m*¯}oÜÏoA 9ŽC]U%UÕÕToõ©¢ªªŽÔOË@<ž(/=¯ÏÏÀg6ô黽%¬&,~xéVŠ|>Šo™†×ëlþ~ë4<m¯o/ë¤bÔÖG±3TZIêjj'í=Gl“ƆRöN^¡á „y¸{€A¯6ônY>+¥>Ç‘J") ÅöÛcI,¡²¢‚M7îðSUY‰”b›[JIME•••TUUS]UEee%•U4&­ŸØlTÝtÎÙg_^Zì i»n…„¬ûü >åfV†%fÃ<†í×1óÍÝ:›ûu,Âõõ$, B#U?‡K:WYhš$VWC8µ³vGàò8Lq4G~…áúm©ÐHÖÎbØÀƒyc±…öØçÔø¹ 4VU²o÷žÔo÷×2Þ«_ˉž))q,“dʆNjøÜn¯©ÙØf’dÊΨQîrãq‘ɤ‰4ÃÐÝ:4y†2ߥL‹|a¸ð¸ 4!ŽM*•Âv@ÃåñáÖmâ±$¶„>'›>{ŒÃî®â˯FÑ6âëçnáºç–sÉÏsÅþ-Ñ\n M m‹d2‰-Ó÷ç’¶æÂ¥ƒm¦Hš‰ê¹|Èý\òÚxŽkë‹¥ÐÝ^\††@6—ßÛì9º¯[`¦’,{ÿaΟPÊÄç¯&[·ˆÇSh†·Û…&$¶e’JY8RªÍv Å–ŠÊ f̘ŽÛ½ýÇ¥”$ †œw>–¹µÀI%\~üñTæä]2›±"zöi‰u1ø±WùÛ!eØŽC*™ÄrÒ‚Èãóãñxðû]év'™Ä´e¦Íóà6t„t0Séÿº ¯×ñJ<>.msããòxpéȦ´@w{pcgÚc%I¤œÄrn8þ"Žzuî&ˆ˜­¸èŽ;(,1ð†b<س +F×ðÆ)^bØrÛô¥ÝíÅ/ômÊI3¼ø<úVÞ3'e“n«Ý‰•J’²Œ`k†ßqEÅ2Ý(ãñ¸Ñ5°R&ÂåÂNÄ0îδõÍçÛ€ŽÛëÇA× 6ÉDËI7Ú{»eûÙbÈŸÃã>BÄïaÖ?Gòô|‹îG^•C:3ÿå×øÏ¥§ó\$Þ\z~.×^png³:µc+yþ¶ûxoÀsGpݱ­I$%Þ€`ÑGÏòì{“X6hÝï®»ò$Z첆GPñã'<÷ò{̯H’Óþ.¹üö®SŸ¾‹[BÇcxkn’çßȧuaÒßodÊòMlz4dÊ£/\ƪÿÜÁs_-"fgsÐë¸æÌ>ˆ-reø|D¾þ7CŸXÏÅwžËŒ7ß`íÂÎ8ñ ÚŸÎ觇“˜ø2>ù+bnú|WŸ9 f+k¨P(þ°4Ô×Óµ[w9tÐyí•—HÄÆÖÍ¡Ûëå¥Éß û}ÌÙcf]ÇÇÎÚ=g^¼…£ÿ^¿¨'Ão¸ŠƒËóÐõ >yœ!·~I¢è®½u´”·Å´ÿÞÁ£ïÌ šÝ™sGþ•3ºwÖê QÇ{ÞÃ+“–¡·È·ßÄÅ)¦¿ü0c½½è4÷ Þ˜ÙHïÓ®å–óûóݽWóÅÚ,¸ìÆdÀ#ÏeÉôÐû’þ…—k5ì»OâÀÇ:rËãÐâcGÝëß,Gou0WÞ~#G”m¿5º‡êoïbèÝßãòéW€Ü¼‡_9šáýÝÌûù‚ ­€£.ÁðAqRa|?Ùy e!2¶ˆÑ7ÝϧË=õ˜cß§ËíÄ/L IDATpb+‡ï=ƃc¾ R+à¨a#~XG¬Æ%<7êuŒ¹Lùükbûó—ÛF² '-0÷rGÿg“¹½^Ž=÷Î;ÿ)q%]qÞ…§ÑªaŸ~=«™üñüýª8óÑexý"sñéÌe™>x…ÛÏ9‚¿~—$+(˜ûÔÕ?ìFž~õkæÏžÌsw eÀy/õ;Í´Ð$›¦¼ÌÐóÎgÔ³±`Ù<ÆŽ¾™Ag?Àòˆ…°¢Ì›ð>_ŽHUÂÞMu)pû,¾¸ùÎyVrÏ+Ïqr·\ÐyiØqüge9×Üz)9FrÌycˆ=TÍ›Äã—ÿ•Ú£ïàéÛgâ7óÎÊ$û_<’»tçêûþÍF§(ÑHØ*âÜ«oeäEý™zÏîû° ÝÈô4ú^攋ÇÐãÏç1 ¬%‡œp2åÅ#?Ń·ŒõÍsœ?â%JN¸œ[®<…•/߯ÃÌÂR£h …⌙ø¶ëÚÂÄoçTÇëÃëóâ14ÐÝøü^•äô>‰›nÉ mÖsãÈѬ¬7@lñ|Þý¶‚!×ÝÈ‘Æ\:ì¯,æ:•ÓŸªað wpÕ¡· Æ'õ:îí\W"Ð=_Œ<Š{¦µà’ÛîäÌÒi\ø§+˜)}4,ùŽ'/¿…µGòô½ç²à™»xuN ý.»Aåm¹è®§yþ‰+(3«ùvüx–Wšt¼èfN+õpÐUñò³¥™‡ñ#Žæ¾Å\zÛœQ2• ޾Й¶c{¢c’Ós8?õ(£Ÿx†‡Ï 1îh…AÖ¿q+'Ýõû ÁCzóÎÍWñâ‚Z„YÇwŸ}ÎêFpy¢¼zÑñüwcn¾õ*F_ÃÝoÎzË͆7næÄ»¾£ÿБÜ8¤oßt/-¬C¤jùìÑѼ³"Ÿ[ÿùÅ­7=É&ܿȈÇÞ  –rë`+鈺9çÍù¬š:–§{Š—o?¿a3û¥WY‡§YÔå0Š Ὣáujyáž±Db yìÍ/©gsëĹ̞øçlCýø›½@âÝ™?Ë 3áÓÿ2eÃù¯~ÍÔO?à#ÞõM¯Åã ÐãðÁyÚayõÝ Ó=¸ç<Õÿ©åŽO_gpR¸`Ý›<:)½‹#:‰‡ÞEè«y{9èv‚ÜSîå†ÃÛÒºÿÑß&ÆûóÂsóðº<ääRT˜…/Ԓㆣ§2ÊûŸÍ —•3gÜÂÂË>çª+ÿÉa÷ý‡.C×t|.o‚Â" ³à‹O>§è¤¡ 9¸m»ÄEƒ÷câ731•R(päu’ØãKR<èd.8q íZ·å¨³†ÐÝ^ÈœÊF`ç´aøÅWqÄ€ý9ÿžg9¨~S¾ú€[ž\ÏÅOÜÉ‘[Ó÷Œë¹¶Õ F}T‰Û½m\ŽÐܸªÞãŽW4®u }Û´á°+F1DËs“1d’¬ãoçÆ£Ê)íyÇwu3n^ þÜ<|.YyE´(ÌÆD&öÈ•KÀ_N!-Š[¬ý€;_Ó¹öïWÓ§M]9ŠsÄ»“ë¯ÏqcÆqYÙ F™ÁŸþz#§õ-§ÓÀÓ¸ê@g>]‰®kM 4Ú†·ù×Än}ü6í<÷?>œBÓF7Wóä‹?pÔm7qZßötx:W ø÷§+Ñu0Z÷âü3Ó®E1^p¡uSXZ'ù%‚?Œ_äí:.k-O8—;Ç.ÀSÔ–Vžâ„"•Dez¼ÏÚ4YôPŽû™¯`Ã,ÖW•Q®ž8¹;£-A ¢Ui.•cÍx»ï­™ jÝ Þ¿üÆÚ—7Hi‹|j«âhö ¹,)µ¤œÝð¶9&©vGsYé :’^¯ÞË­ƒ$7̦!Й-5L3†žÓ‡^Ù ¬Ú#_êuÈCšƒÛ¡1áüäZ‚DÍ\¹ñ&¾\§“ò¯\N OK „3ÿs#æÁ#¸ÿØnà$¶éÁH+A}ýrf}ô—My)íqÓ9 ]… ) Å^C×m–’‘£?"ªù¸bÌü1Ê ËAþül г‘ŽZíÊÜT/˜Á:¥î®K˜#ž¢˜c±ÝxfÍÀ\û+R5¼4âBÞµ-¤Ôð÷=…cýIR¶NayX©iÝ’HÊÙýæY3H­ÁŠd5/Üp!oo‘þqþäöG2m‰ /å¾ËïÆºè¿<{F‘ʨJV2ó±[ú¼”Ýd¿~^L™ ÓÐtÌ s©ñv¢G¡ÄL&p—ô§£ûI¬H5UÉ*¾ìf†>×t~ˆýöóbJ_(€/èÉ(R=Eêêäÿ"bHèÉyoððG ´8†7§½Hé‡×0ð†×ÍOØ4}6ÒèĪ¥›°LгےŸ$è &ç=;‘«; LlÖ|?wwÉ r'×vÊ+9üÞ·¹ÿÐB,)©\8—X×BR±z¦¾>šI›ZsîEÇQæ3ví’6)wgþòô}t¹ûb†Ÿ /¿9š>íñÆ>b]X§gȃ]ÅŠ°—þy[ºa%‰2Ü-º®¡é3_äËêÞ<óáÃô,Ìbî¿öãÊËÒç’‡ÙoúcÜñü~<6¬_ZAJº†® 4áÂëÊ£ó9#øø¶cŽƒf¸Ñ­(u‘¤²^ …B±·ÄPrcþó>/ûœÚ—¬Øl†œtu³­O„cDëhz6è *ªRt,kOVBpøÃãx°Ÿ$•”¸<œH5 Æ;Û¶?ÒÁ(hG>Ù\:æ .*N’².· '^Á{o8È-ânÓÿÜܶhº¶íì-)Ò“t̤ŸËåc¾àÏ[¥_Íø·äO:Ýé)÷BØ|þøm|•=˜1× Ä‰[èÞ~ËKŸcxõŒÖ¤RÝíF‹7²iý›ï'¯ þø¬t÷y1j–²Þ$s¾‡¾#_à•ÓZ‘JI ·odÃêÉ™²Ù²ýåøeÖ’oa Ùš Þ8ƒþùWþŒhj[±¹úÍó)++甇>!æÀ‘9‹‚œî =¼‚ÿ½ìþr×=\uÎ`Nö8Õ>ïÎ3íÎâAgÐÖïßx—ß~?7_qƒÏþ+‹â6$øú…»uÏ+¬ŠZ»ïn“)RFçþm Wu˜ÆÙC ªìl.(ŸÍ½·=ÇÊM =ì*æuÆ©]ŒtÄûöÔ§'ˆ;²‘å«6‹§Ðù¤¢al͵âFÜ6—ß•y$Yíñ÷‡®cõ£sçø<:YÙ‹²º.BÒñsÄQ‡³ì±øë+“Y»n“^ÍÃýˆé(ã¥P({O y¹%«k$·ÃwŒaÜôéÑ rã2þýü–VV2ññkø0Ú•þGŸÍçxè¸Sxaò2Ö¯œÅ‹w]Ç¿Ûx·ç¾·“Øegsó›¸éôkølÞVÏÿ†§nÉG \;ÑÜ!f5Ë—®%’°bs{ìèAŠsL–͘O]4‚Uv7¾žϼ–Ïç­aÕüIÿ¸òA–.¤¿ŸÑ·.:‡?šÃ†µ‹ùàÑ;ydZÕïóW/†¤wVü|B^°Úå½ §“ß䋦qØGÒª4Ÿü¼ šO0›¼ì ‡ß3†!]4’®VœvïxžœK8bpÄ]¯ðуÓ-TÔÏ&°4Ù‚“G\M¯n?y~È ¤½:†'þî7R§Ã áÍïåO³¾þ‚é«Lz‹|ؼÁÈ4?¬]’ÛG^vM€(åʇþÃiöËœpó,.ï#úο—}»ÄRðÉÇ7S’ŠcsÈñéI#ð†rÈr Tpûñ½éÔïxþñE»\ /Ù!ÚVkÁì<ºÄ2ƒœûò4F”OåÜ»Ñó° yg]>­³†?‹fD#Ó–f{5 o g^6ˆ×/ïGY§áÌ—>rr2é%}wÿí$ž;†Òâcx™Ã…¯L㺶S8çÀnô:l(ï®Ï§U¶@÷g‘Øz–µÐÕ3'°lÍ4þ< 5E-Š)nÛ‰;&Zì{í3Œ»g^6N½rÝË‹(Ht‚ÙÙxtÓ.æšwߥÛ÷#éÚít–y%»GÐóÊgwwo^6N½æºWS2 ”Õ,΄æ"+;k‹¥~á÷ä–GÈûG=DMuÕ˜¥ÝWîP.!¤Â1à è÷ 9‰”ÄãqLÒPÅ ð¸°âQl—fBA†° 74b:ÚÖé§D£ „?D€ 13³žO¦ |ÙdûõÍ“ó¤$©'f‚Ëë'àó  ‰c›Ä#QR2}?f4Œé@ª~vAgJ³%‹_¹®7ùpá‹ô1„gûç‚~RÑ0)["4Á —D$œi·ws.¸¦QU±‰‡|¨áÙÿŽ95óß 1ó7D÷ŽR( …âW&†,˦¦¦šp¸q‡ÇåææRVÖšx<¦Ú¼_ ÝÅÚ®á¢ÌC7LêÃNþÛsÜv|¶ùËvÚwW ê)) …â÷†—Ë ¸¤„Jv*š‰¸*°_Û¤äÈ»x­G‚îö“Ä6m¤ü4¨C …B¡øÝ"g·f!)¯Ð/‹î QPúi©ók)vM="…B¡P(d”R( …B¡ÄB¡P( …C …B¡P(J ) …B¡Pü±P³É~…H)Ñ4 —˦ijÝD…bÇ•˶±Ló7^×]hš®êºB±«únYX–¥ÄÐAéºNMu5ãÆ}ÊúukqµÉ˜B±=<}úöåÀƒF×õßÔôè&!nläóÏ?cÅòeض­ªB±=„Àëõ2`ÿýé¿ß€ôêØ{±¾+1ô«{Þ‚ÆÆF>ùäcößÿÚŸsnfùs© G¡ø Žã0ù›‰üðà  Øÿ7W׉_|ù9åå8i𩄪ë ÅNêû¸O?fμ¹ìÓ{¤Ü{uE‰¡_¡\¶t)»t¥Wï}ðx½ªPŠ0øÔ3ýÈÿ91PUUIÀ¤ÿ€ðüêa*»àÜó.dÔßï¥_ß}±¬½7<®¨…$“ t]ÇíñìUõ«PüžH5 â‰Øo2ÿ–iá8¯ªë ÅîÔwÝЉ„Ã{}åjåúõ>u‰Z&^¡øWöfC¯êºB±;ìýzò³=CM‘ fÚüágôt$‰pÕUU4$v<ìØIê«*©nŒãlu-™ÎÛAV¿Å^×Þ6ŽŽ¢±¡Ó–»ÿpwôýga®©%jý‚…'MjëH:;îeìê¾eFîö]™q#lY¼{š†â—©MÏ{[[µùã˜qêª*©‰$›ŸY³=ÛÕs”{;çï‰yßê”r›wtOÞ¥mªïÎ-±º©Ÿ^ëÿïßc‰m¤>šÚéÊ_¬¾9$ 4&ö¾¡’N’†úFLgÏó¾gm™M¤¶–ˆ%÷à}øc´‡{U !‰l\ÂgcßäíwÞá­·ßæíwßçóoqØÃpÀô‘O”ׯ8–Î]»q̘J‚^m‡Ù¯ÏÑ]»ÓyسÔ&åV¦EÓV|þ¯¼?‘55)Õë«¿bØÃù¶BîÎÃÅŽ×ñý„I¬o0‘{µü–syžÜ·ä¼Ùä· Ù÷Þ«ÚAK!vt=ߎ˯½Æ›ï~Ì·sV“‚M3&0ai8ÝîÁ%7üøg ½‹U)XñÕ‡L]gîqŠ_ÎFêjùäÍ×yûwxg«ÏÛ¼óÎDfO{‰~]»Óéš±«±‚oß…×>[йÏqÝ´8 kw:‡#ö8ƒ!ˆ®ø‘O¾YŽÕ$Ðê–óÉ;1·*µGï’’Dí¾6‡pJîâ¼Zþyh9×NHü$?’ÚEÓ™0¯ùÿòÛL5Œ?š¼‹r“¬™ø>ß,Šìåúá¥ëÎaø»‹÷ú%*ÆqÖÑç3µqk›$H²fö$ƾñ:¯½ñ~1 ÇlàljYÞSâ:FèË-³m¨]Á7Ó·¤²I?áç“ IÅ3røý¬Ýòÿ}Eyók¼õ—Þ8)‰îöâ÷{14´SÄ¢1R–º›Pv=' ¯K’[uó£¼~^59Ýs‰§¤—ÏßëA ‘Æ8Bs‘x^¼¹Yn+I$’À›ëç»Û®äêåýùïÄèÝ1‹hC OVVæz^·´’D£1L[à †ð»ôLOÐ&•ˆ›H4üÙÙx5I*™Dsû00‰F¢Hw€€×…4„#±ŒW@àöð{ÝhBb›I¢Ñ8–#†‡P0€A’†ú(öÎv§;û6õ.¶c„æ" âóiÛö4¶s|ªv9OÜv/§<ý'÷r5{ܶ_åÝ—Û¦ï%˜“_ßÕ=7õú6ßÙ5¶Ê—ÛC0; ÷v´´!«yþÚ x½¦#‡ h‘ ¾ºˆ’‡n`Íswp{Ÿ·9¼ch§â]²u™ù½^‚?|~×Å|zË&(Ûuù(þoØ´t1¾ü*¶ßÏïÈ;+ÆñúËÅDZ÷GGlj¬â±K®e|é}œwV‚f’ÆÆ(Âë'àõ kàX©tݶ%šá!0ý®L…Óñ‡²ðj)ê#Xr×u¹bÂs\õvw掻#ºŠ\{)²3êí×9¹Ã4ñõ3ùד?ðè˜^„vÑ/öfåàwmc1X?îYîŒ\Èá=Zìô5nþïØ¬J¹C±¥û„pïÂÚH¦Ü3”Žüžq7wØõµv’¿­wR…¸õŸoŸ~ò‹Ïã! `ˆ-lKßû—=ò ]>€Ö!›µã¿¢®EG.èÖÈ+÷ßÏ/JYhOl¿`N6š¡Y:™‡Ÿ¯á•wýß·/¿SöJµÐ]xÐf³V/ãóÇÿB›x%_ü{,¥Û-Y:îQNèÛ–œütºó4Zå¶ Ûq71¯¡’GîÌõ+ù#WPNVð`^[ð5'æt~]y,%¹-è~üÌØh¢ëõ¼réa´--$77Âò\õäR^_wôoOAyw.}`4GwoIË}ÎáݾxèlÚäÒóôY)ÝBÃëK1é±+Ù·¼ˆP~+ö?o‹cCÓHÌy‹zçÝí&Öº=Í÷°ã^É—ÂéO¼Í¨!Ю]/þ<úk’ŽÄŽVðÚ-§Ñ»kÊ;öçŠG¿&Öäö§žwî8‹>ZÑ®û@nþp†¡á2â|óÄõôïÜ‘>Ç^Í„5Núøí¹^…†ÛçE×6G!uSÆpÁ1ûÒ¶}Gúu9ã—Ö!4®žÄõÇrß­—²o—rú{ _­Í¤o.æÁs UÛ¾\ùô$äÎî¹’QGöã–ÙMC+1ðP_-XõîC\pÏ£Œ£ût¤¼ß©<1=N Ûì{‡pç o.kGq›Aüwêj¤Tçÿ›¶ûôcö¬Y,\ò÷õ(àœ[_eæ¼9Ì™ý>í–ãÎK/âæ7æc%çñ—£N`¼¬»¶EìsÄõ¬ñz˜óêÚ­”ìüzx#ßmŠo·A17ÌàªCòpµ¾˜ù¦ÖÜðíÔ(n|^u]“É/¯?LÕòiÝ4»’´¢ïV’¤D&´mÌû'óõÓa†4kÇüT‰„ž£÷_óÁ£­(_^¯-!Ë%\Ý÷=½›V¡Lõ.¼¾6s¡™š ]eÉ¢ÕÄ<õ&Ÿ¼>†#Ç1eêúÖ eY¿–ÌÞ˜ÁKQ¢â 8í¬x½/õªW ¾|]¼¹’œÝžé·¡LÙš<úΤ;Aµ]aÎËϳuéÔ*Wšš­'rE҉ПJ† s_Õã$3# ”.K¢rzå'ôîÿkÏиE]Äžoé{ï‹ìJq"i.r²ç¾y‹ OŒIÒpäd’’™K–C`2¹Y?ñaºŒøŒ=W5"KE“w|/çrÝH¾Jd/~ƒç¿ÜŽ]ÊãÄÚ©L˜·‘àJU×ÌDÇ”¥bí* YY‚³ß¼É¤-NÊEæq|Í4&~·—šÇñÝÇ ªÚ’Žmëá—v™c{3ö›óLyi¤Ÿ?ÉWoN"!)äÃKP¿.¼¹–L§“£¿¼F¿·ã¬±ö•ÞÜ3v6çÜeiV»$§¾Nã.ïsE1"knr³sÉɶ£q{&]Õö÷çPþ­mœ=ðöï&ñÍ 2q°pc;V¼‰áÇÁŒ_~Ò’7—cÚºìX4™†! š$‘±s-õùvýÆÔ>Â;o|Fª¯“ß.lŽ0z½6Ÿýû¶ñAw=fÉ.$Üœ]µ†‹g÷±Ó|~o2ï¿ñ9¨Ì¸ s¤GÙ´o­O-bU†ëƒƒF^FºWÉúÌå9ééØT@³³wÆWh}ÏñÓ[黄ÏVDhWøpÀ ÒÛÀþíÓ±ÎÏ·ãÍ8WP)"¤4ì>Fzv.7ÍbÚ?ÃKjPù•Íœ;s€‡·EË ¦Ï?°ÿVÞíìàùÑsIW9g62îåoéðæ2v-~–+3^ežBÝ—¿åµª&ÚÎ8Å•óëØ´ ’¤{ý7!„À`2G\éR„šB¢ˆ%66Åe#=Rsœ Y‰-@ !¾bE*T‰åèÌtú=ö¦FÓ´qeÒ×L£S牜rI3tj*¶œl]¿ƒ•`û†µØŠMdTrÓÓ¼ú9é84j;>ü’бk9}|1Ñ[§1{2ZÎ1Þ2‘OÍcߺ×pLËNÕZTÊ~”Œô è2 IDATçĦݜOÏ&׿“]æl`P£ºLßr+'gRKvRå~æ­ÙÃÞõS)±zCg%KuãÝän¬JXGoÏvÖ\NÃäÀIÒæÙ{&‘ƒ'Râz¿0 ýI nçߣ~ùêô|åkRˆà‘'[äÈä·ußsÆmž}–A½ûн{-H]Ê;[’1)’׬Ò™Eûq,a»†âvi,œ”=|¾&‰Ç¾JàÔ¡Ã\:¿Šn±~¨>ó#‘÷±ìèEŽ®š@ °u6L_Ìøš€=&ÌZîß>§™Õ…  Ìãü¶y K¾G`ÏÑ‹ØÔhžøü;^éß…¦­ºñp«(P=œß¾™l/iQ‚èùæF®nz…«‚èÇèµØ5ù¬2$oÝAFJŸ¯9q÷È Ô‹ú•ÂàÐ[|°ÏC`©Z xv¯Œ¼›`ÕÃíÄ—ÖœvJöŸDÒ@`M:VX2ü#©Õ  '6¯`mB•–âòž]`_ÅK ŒûîMš•%ªJ+lYÍ­b(ß–Oô¡BÉ2t~âY3Žr%çöĶmC¼ó+—¯#= ¿s»9šëA–wÑ¿S}Ê·ëC@îYR..ã“-ÑŒÿô)ʆ” ×èfQøÿÄÖÖÜNBîÊ3B€`7¬ÁÉK¸NÇÏÉ 9ªáaÕ=c8%ÎBBm˜òÁcœžñ}ÀO?ÇôŸöâܪ†æ²ü>®ý]”µgåòõd‡”ÄrrGmpåÐ/Øjõa`çJ„•iËè7!ØáÀƒ—ªÓVl֭㿃ƒµ¸n³‚ëœ5$s9FLŸJû  ò0ÖnÙÄ·ïcÇêed#G<ÏSýzÓ¶EYHœÅ›;ó°\Çî•à8º?ù2c_êA´,nOÞ3ò‘Ïy{¹…§^F)Ÿ–vœžÏW+^x®Q‘UöÙÛ„þ†MÙ¸œ”8™á@tkºÆ¥³ê¸ Éã£z°åys¶D—¦F¥ ö®[Φc.ÊW äÜ¡C^Ù,z›qßgñÞâO¹+ØÛnÍíð6ç2 ×¢b“Êdï_Ïš„«ÄǨ,\sêœÎD£Gž§ 4@¿Cl< !õQÉ|•µ+å´=ˆpÇyާ;pœü–Õ¶V¼òòƒ” ¥\£.´ª„Çf#¨ëëLîQ—تwÑ£Uvθ©¹„_ɲÔ(ïÏžµËÙrÂC¹rVÎ9êµpÌ4é7Œ²€±Ñ@ÚùbËñ+ü¼é½'¥Mé0ªvíǃjaÐnŸ1hN‘½^áÑÊF0•¥MpvœÍÃvrû¬xv@CB£òÊ´!DØä'íÉ`ý2½”Õ<ѳ7ý{’“¾`_ŠÍaÇ£j8í>f ¦VËê\Øþ+«v¦Q¹UE®nوǽ•iëý7óE*‡FÒeÔêG  ÛåDõ¸ äÝ2T„Âü9P¨^Ìœz?†s[x罩Ì~~4]›ÍÄ‘ž8¿ìs&¯PŒfš4l@)ƒ„æÓAJãfTµºHÏò`2IEÆ ON¹Î, ][G‘›–ŠËH dúô˜±aCâ6CI¢€ —{n6v·pöÜl²² x|¿7Õ¬@;<Õ`àªj@=÷-Ü7ŠÝY´èÔ‰È  ¡ºí¨ù3‹…RUÊaðÛM°6kÕ+c9fE’AÖì8²³ÈqÙ _OáGÃR‘æÍ„;È1µx|T3a'3=÷Ö>Cù[SŒ² ª&Eàô€ûÒF ýˆ &wS«t(nŒÕ+ã*J5£Šû¶Xƒ­LÞ+UU0)Uû#J.¿¼1œO• {«ªDI²ÇîÛµ%aö3!û¡, ÜÉ2ÆQ5Ø—¹‡ÞëÙ•G¦ÍF°IÃéV@Ù{žaR¥jÅ|b$É€¨© L£†GÓH˜ó/­vбuJX4PÝ8¸RÏ"Æúê—Ÿš@ha¥ƒ (ŽY‘nk7¬$4.ìœÏèw–S¹e[*DšñUu”ϯPù¬F‡-l—j‘ùC£áQoâ“u­Âr!±‘м,×( \š„'=cPEB¥kú)FÙW Ÿ¼: ¤è†Œœö-Ϥ^äòÅãÌ}ƒß*Çú×b‹äîLÝÆ¸§&¢6¸—Få£p ’jÃ}• %†šù£|)JYLº>úÛ,CªE÷ž=é}ObÃŒµ“½éFJ”®x¨úÜ,~[·šÕ+âÓ‰£y¤qŸP R!s(’®)4ŠÈÀ(à0_|w¿°`”ì$Rjb‘eŠ[!yÿH  jHF#V‹±@v%©èFÙ` }Çv§ Z<8ŽoÏeH-¿ë*˜ÿc/¹ðæ  £:?LÂM”Þú…-ëW±jÅBÞüwW³’{j#c½›{Ÿü’ƒñÖ>CܸÞr(¤YNjx[FŽyšþ}{Ó*&\·†!º:¥8Åú¾v¸.™b¦QéÖŒD–•k?qœdñš$™8–!õ£gûºøÝÅ»>}!4 Q•‰Ñ.s$ÓwÓ~šó ù¦ùš2 ì¹¾Y¸Ê•Ükï»ðÛ„¦b,Y‹@Ç.äïÂM9ÄE—|C!…5·!€’e+Óôž'hžÂÉ“© K×Ìð¶£,X“ÂÀ×_bðÀ‡éÙ®VƒøÇTÀž•LþDË‘zŒ4Uö-9\çh®Û£ÿyÖ$$$ðx0Xýð #*¼$à¢áK ز~5«Wþȇ#†Ò»n®ë¶/«iÇùè¹nt~øΫÒíõu¡¢)´{v:ïôtñüÀÑÌKl- Y§9Ÿëû]Fg¡Ä„›¯“/Q´üȲhœMX‡µÎý¼8ü ~¸õÃs±«ùJÔÌ=#>¤~â ÏÜW ÿ’Ä5‡\k0Q~&Ò£[òPß¾ôíÛ—>}úpO½’Ŷދë,pI¬ÞpŒNC†1üÉôîv%¬4UÅRªRæ ÎåVH7‹"n¾B&Ira6Ä©½nÔ“‡ âá¾½©–‹C½QŸôÙLd€ÂñŸ'•–KJV îb]×L I£ Ö§óWlâ!e|m"TÌ%«#ç^&Õ§Ò<)‡HòÈ:0?L>"â¨T§}îªDb²\D§äžø™c¢£_Â#}{Ò>ÎFŽ[ „ÅSRNá`þ.Z÷m.ßB¨O®T'I*!§ÆB@µ¬>êF‰¾—n•‚hÚáQšÇXúD#ªµéB‹Ú•©{÷SìJw" ‰¢c}þrŒ&4Ô°º ïÕŽè@+†ÖÂàJHÙ»øå’Å×É b ùžB i&Ê6- Ží[‘èµØhEc‰h·¤% É‘ÂþíëY·~ëÖ­g×ñ,bÃ\¬\{Œ¬ô‹,ùfGNç)[ÙP]¸ÃÛ1ö~7Ïå¼TÖ|8‹“n77t£at¾», ŸÎæBnÞŸÎ>—êØÅ?Q(¥{Ò¯æYfÍØDZÎæŽÿ”+fÓ …\’$¤«‹éÿà>[¼š­Û60w¾ȭ@Óæ)W.‚¤ÕËH8}–LGU¢,_sŒìôD~µ“çm q5º“´ž¥¿$õÊ>æMù†,³ +qrùRŸI$Óîú“CèøÔÖµþ-Ýx·‡UÉg_§\© t{i'÷öêC•…y=*Sã®Î4¬Oãžã8áöú åë35/«~á×ù›ÉÔnsË·¡!É´îFÕ>HÏïr!â~,sŒ)¯Ïa×®Œ{ô üÛ¦¹TM»a¬¿pÌÉÇÙ¶{/'Î$Wž¤SG9w9“sÛ¾àï1›å‚|1 xõÓ Ø¦=Êà§™’¥£ÈÙ¹ž-GŽs1ÅÂCýºpñ½!¼òõ:öïßÁ‚'1}ÛÅâ[Ú…vN׿`Ê•°°yóQRÒ’ÙôÓW¬Ý‘„kÙÞô)w‚I£?dsÂ>Öÿø%Ëög¡(RѺqc?¡yH9¹•M[6²nÝ:ÖoØLV`Y®œ<Êù+œÙòS¿¹ˆÉç´,4­Ø˜ã1GÒçî*¬xo WÒ8µi9k·À#]' ”¤C»(vÎ^@RÎU~yýCŽÊŠo<ºŽ`PÝXË÷ UPß-ÜGZúIfOü‚T«¹@J’„¤^eÖä1ŒyçK~ým+ëœÎ请R÷†Bˆ4e±{ÓfŽžJF*QKöqöË$íØ"ƽw ‹Yà’ê1úA3SG~IbN:[f~ÅáŒ$$‚Â#²5a?§Î&{Ã7èªÀ»:}ý–Í›Mlס#v›í6cܶ,ÒrÄU®F¹²ñTªZƒ&íû0yúK4XËÔ¦CóÚ˜Œ(Š™¨ru¹ï±géѬ*~ØH:‘’M:Ð¥A9ÌŠ7fDVÒUœ–`êÝu/ÍJYˆiÒ•NÕ#1ýˆ)YŽzmîãÁN “í\9‰ØÆèR¿-¤s—ˆkÚÎuËSº^C,¹6BJ”"ºdM:w¬Dîù ”lÒÎõã1¨y\=w™¸ÆwѵkºUQÈÌt£Å´fâsµÉvÅиY+šÖ‹%íô% ñUiyWGª‡ärú¢“²ÕêqW‡–„å]"Ña¥ZÝV´mZøf]èP%ƒÉ„Á@|ƒvôú,k”@qæ”™CxåÜÓ¹þ…”†$I\¼xE1_®œïò’/ã.Û˜Öåƒì¤$ŒU›ÒªV]âÅAæ|ù ›ÎFððóñ+KÝÚe(Õ² -‡Y41¿Í¢b‹vÔ‘HÉP©Þ¨ ÕGz®Bíu 1Þh’ê"ë\;&ao {÷p0'œ¡C{òó æ®ÜM@µ¦Ô¬Z-%9HÍÔhXŸp‹„êÊ%-Ï@ÍÚu¨Ûí^BÌã“Ù«Q›ô¤M¨åîêHÕÀbömÑ-:xä;>™½c«‡hd"¾mâµT2­¥h^£I`ÏLÃZŽÆËR»m—}Μ…;‰ì=œæV‰*­[k¾èš#ržeËúµlܼ“˦:<ÿÚ»t¯d!´vM,Ç~bî ¤[ë3ìé–œü~:sWî%´VsªU,OÃV )Kƒjþ,›3“¥¿¡rŸ!Ô ¢V­êTiZ‹´ß¾á«%ˆ®Ý€ ‘úúü_„M¿m¤AÃF·oñ‘!ûüIÒ¢kÒºukj” A·#›”+)Ä7ïJçÚ%0†Q¶T nü([‚ÒåÓã©t­]³É„b°W­=ŸJ÷zeQœY¤$¥ߢ+kÅ€ÇAjêUä²M¸çîúËE'}™™™¤¥¥R½FMdÙ;H»³SH6–¥}³x ²uڵ°ïGÖæÔcäÈÈØ´Ë÷Òi ïŽë„r._DªÖ†–e¬€JæÅ+ø×oG£Š1”4_aÑüX·[¥ÇÐÇ(•´žY_/bOR)z=ÕšèˆJÔªIÆ…‹7èHݲéÙ1’_¿\Š©Q{j5¨LhÒFæ}¿‚WCèÜ·?÷5 `Û’ïXºn7Ɇx:µoB© s¿‰ôÄK„4îL(p“r>™mºñ`›Ê¤¬þŠ/ÞHnHmZ´©Eõ:u)FÝöíðZÁŸWq8-€FíÛ£¦QVU"AnJ2ZéÚ4-\äæ\8Á™¤ãìÚ¹‡„„ö8D¹žciå\Ïó~$!µ4=µ¢dtej” #=ñ"¡;S;òZùJ¶èDÃÆ-©'v0õÓï9œFÓ&Í)W«> ò÷³ûôS\³6Ø·ÎfÆ·[»ÿZšÚ¶#&/‰¼¨š´ªî+ïU([‡¦åJQ·qv}ÿß/?Hé‡_ ‘¿‘Mž¯{e Qp.a#«ÖüÆÞ“Ôîùï>Þ“b¥TYÎcɺZ|ŠV!gøjæÖ ¢ßÈÎJÑ Qʵ»—Òç~à£/–“[¹=­K„S¶ujW,I ÎðÃw ÙtZu©Ã?ñD¼µkVÓ²U«B+2·ví°åå²uËVçÞ}û¾Ï_ðœ¾ÿ.À]L55BL~û]ÒRSn‹ á]b2_7šŠÛåô­íJÈ#f“ÁkžMõàr¹Ñ$‹Õ‚¬:±9=q f3fƒ‚ê²áp{ï)F&£Y!TœvçuÏ»A2x¯=Nl.7HF,“×)<8LVk¡ï ÿÞƒb4c6* yp©2&£Œêqátz0Z­%p;í¸4«ÕŒ„ŠÓî@SÌXÍP]Øn“ £!¿¼šÇ[g!0[Ì(x°ÛœÞeÒµ·}ÛVL&3mÛµG’¤"q ®ƒqÓ¨·ˆÛQx&ôW¢,š~ñ˜<ÿÿõX©ˆü]«ÂŸÇç6ÚîÆùß¼œjùtÃäI¯òô3Cnÿý"a°úyㆹœ¸Ý*B’}}Sò8°;=IB1˜0› Hx#¸;d£“ÑèÓ+Uuãr¹A6yYÁd¶`”=ØlN´ë|†Î=ËñãÇèÕ§/Š,=~çñŠØIÄÿC?ÜB\·ßÞDè ž».vMÑ2Ý\që bÅêv“üøƒý¶XùÄïÇHº¹î×-í.ïÍuÅ5K×Íëqûïòæú«XÿÐ8CãFdìK/ãvÿþA­’,“r5‰wßy7kæì9ønçÙ¾ÿ¹@Þì@-I T›ç¦¬Ìkapã°»o¸>î°åû½êrbs½§y\8<®[w«wƒû$¯<üßí¾@ÁRÕŽ+~$ûÖ?Oøÿ[6¤ë¼/Š#qëtíõ9¶@‹/`›†Í\‹¾þŒžõcnðŒT¬9oÙj‹ß}–±Ó~ÃcÊ÷þ¡(¿7ýæ6ïéøÛ‘ß?6ò®»'´BºÌwOó¸°Ö;h7Žb'fKpÝó —ÃæÝÁú{ƒÎõrw[rX4ÍÛÖ·Íßí·7©„tmFw uó:ýÞ€\¬n7ÉïöÛbå“~?ÿ›O"¥[”÷öÞáÑ(T÷Kÿ®»Ó¡Ôú/‡Œyý‡ ¼~‹Yô_1sBPºÍ%Oø£f—ÛÏC æ1óx`Ì_–…Žÿ²üêÇìèС÷w ÝÉ/þo°%H¿?ûËÊp;yÿÇyð—g¡C‡:þöÑñÏ…¬7êÿLf3£±À¡Rè[²uè¸)¡šÀjñûG–ß`0`6[ô¾®CÇm I’PU•€ÀÀ?=R‰N†þ×^·T¬X‰û8~ìhÂסCGq¨ªÊ¢…ßS¥ZÕdù#£¢ÈÌÌ`Ï®z_סãÖS\.óæÎ¦ió¨ªçϘè ü¿G†‚‚‚èÚõ~]¹‚Ù³¾Ðg‹:tÜf³™z R¿~ƒœÿ‹ÅBûöX³z‹-@UUý¥êÐqX­Vš4mF­šµÐ4íOíï:ú_ã¾>3`Xx8<:YVôMH:tÜœQàñ¨x<îd_×4À  zõyHïë:tÜV÷àñxþô¤u2ô?ª$…¸\.½1tèÐûº:þbè>C:tèСC‡ éСC‡:tèdH‡:tèСC'Cÿ{¾Ê f?‚CB !ÀÏBC¡!A˜Mf‚ƒýQ$~7ö€ ˜¬‡…lQ Nwþn„“ ¡¡¡˜$4­èõÿ|tü/‰³!¡aYä\벤C‡ ý 0ûàgF. 3d~~þøù™‘·¿]\’0lýüyjÄÅËýÃ¾ÅæŽk}_BË´fê×Ó©]mû2\ÞƒoUaÉÃþoP#@¡î›û0™ä¿o‡ °úûãÃÅ×6Eëo6çñÝÓwJÏùé„;øîé®Ä„‡Òk~~Eß„ò¯$6‹Àe)ÀŠBñÉ¢¸Øüé‹T 2Òì£SøyØ<ý*ø®­f]–tèС“¡ÿöô$z‡Z1û=ÀÖd²$!›Ìä¬N€Ÿ~Q°S À¤ÈH’Tô„fA¡{Þÿ²$á8¾†×?þœcI2îéN«Æå0h ‘ui߬1ebKÑ´eM‚M^Eî¤"éK…Ž•ð8òH·AºÍƒ$ËÈRÑ“… ~/IÅÊxí;/Qñ~'ŠåYôDä|b£vt.å­~Xnø©Ë-‹")¯cJWàÈÉ"-3‡,§ðpzù븳:¯¢ÐÈj½±,YÊ0?U\“%©ø$#_ÀÜö\Òó42ì*>q.ÖtèСãNÆŸ¾µÞh¥ËÀj,›±†™»Rhuoi)üôÓAd ÂÀq41\bǺ­œMÍCò‹¤Fý†T.„¬f°}ÉJ.ÄR)ÒÌ™SgPJ5"`Ûj®$1méu_G*–-Câæ_8x±CßFÓh5‚w°kùb.µx€6qŽìaûá H±” àÜ(µºÒµš¡ÁÄÉ©m+Ùy:ðJ i];Y82.±oO3IÁ/¢,Õ"ÒÏ€+÷2›Wl$/¾.U¹ÌþÄ\âëw¢Ie+Wïfçá³dºdBãªÑ²IUüPÑ ˜ƒâ¹·KG’¬.oZÆ®‰•Ñ Z²V÷Áõ,9sŽla¡d…z4¯_Õm¦É€ø¨C:a5py\Ŭq³Dò‘Ýì:rŽL—BX©j´hR?Q8w˜iˆÎ]ÛSÎìOFÂ6ŸËÂ?¦w5-ÎHÎïâ—­‰¤» „—©IËÆ•°j*µ}ˆ·K4ÁT%—»8YVŒ2Yç³sÿ1RóþQåhÖ´6a&I—%:tèdè¶`ô§A“îÄÏ8ÂSW“õàSøŸ=ÀªÃ‡qËcýKðÕ°õõAÔ ?\Ù6b[=Îô÷_¥mü%¦>>„e?"ü©Ùv"z}BÇÍßrÖØçóDïe<4áK*ížÄ«K÷Ózö]lxÈÃÂÉ£yuÕaÚ}ÓÙkýøP~>šJ¤^M"fduº×ªQ`K[<Š.%ÉWeÜwK×4„“›æóÌÓo“’w• [Ÿýˆï_¾-y7žyŽ#áqÄd]$ÉcàÑ/R6q&ù˜MÇÓQÍFëg¿`áøÖHN×´#4b[0eA;,þ° ]4}×É4ºï%¾y»Ç>yœ¾}àDŠKtz›ÍgƒãXûÞ(žÿå0M?8ÊÖªþE/“ÌÅÅïóä„él9áÍ_ÃióÜL~x¹åµüuÜQÐ4 ?üˆÅOfã“-è83 žáëÅ“òýKôÜ—í§³) í‡ÉãêrpÉ4úNú¨Ñ›93¡|QZ-K¤ïZÌÈ1ãY´ó2F?3n›BÝÇ>`ÉÛð·¬C‡/þŸ!ë×§rM+ìú„…‰8zØ GÐ6õCF|}z#frâx" ‘ôÛ,¦®Ø†C•1[™ö#fqäØQ6OîÎË¿I½  ìHö;ÈÇÏÔÀ ‘«Ñ[ƒÙ‚˜E.¿-ŸÅÏGs¨üÂ"Î^ÍÓÍL^«•Q& @lYµ™{ð˦ ¢DÖQ&]LºÁDé¶O±ñØYv¯]βŸðhÝ\v|ú5‡²ÜȲ‚ ÍÂ3?îäÌÉ#Lny‘·?˜Å¦ãã7'‘waÔ6³aÊsÌ>/cQ¤üU,.‡‡Ó[ó jÄÅxòåïH5ùúX¶Ss¨”u’ïŽcmš ³Å‚˜ Òu~ ÆÜƒLùd6[NÈLÜz•¼ ëè[ÃȺw†27QÁ¢èƒ× ·ÃÃáÄ­z…Ih"}ã&ÁöÓþ¼µ+ûÅ_éçâ×ÉCùö’?³ ¿B}§ˆBp§°øÛé,Ú™ÂÓ?'ãÌ^ÞP…„/G0õ˜S—%:tè–¡ÛƒÀTª.«ÖfÍÁí|ñÙ‚Í+8t¡3ž]Ÿà¶LDÙ)ƒƒÇ“q©1^®R¦ÝÚ·": dûùcÅÐü5×5¿ßiÏù×ÂíäòùC@õªKd”…&­ºøãŒ¢³j ª×šÇFݨ1åâfråÈoœs&êØRöζT,{wÜ .“âR) S­ûópý2^?¥ ;8‘œ 8y­E ¯.µ Ü IDAT²Á„Iv±íxCK›‘´›Ï¨%Y!ïØNŽ:UÙ»èW%Ðkd3›1«ç8zÑEÀMÖ&$IÂuõ,'RS'›E3PŒ&LŠ‹í'òx¶”É˸tÜQ¸‘/$I8/çxfàfLÃÆøäÁlÌf×I;nAhÔ¼LΞ;¸™qoef’lÄ€›ÍG²1ÔŠÒeI‡:ú]*$À-EðÀ}µy}ÉvNΞÀÌðÝàß…!ÂáRõû¼À³w×Å(;'Wl=,ŠÇK4,ŒfåVÊ9ó;©y9>닌Éâ$“˜ªb­eÀ–ug± ÷ÂeÜ+G6` ÁêNcÉœIlK5Ñ÷ýox¶®Â¬‘÷3k·(D÷Àb. 6²Ù‚I1Vÿx:"T1ˆ—§-ÅåKT"Cy¿Œ¡{ï'2þö¥C\ßž”“=Ùœ¶LŽmYšŠXuòw¬ _I•˜:Ü_'Èd˲uK¼ÀßVðý7[PÂýÄ­ë#T7¦ê=y´2Ø3Ù²agO³}ùb–.Û1Ä‚t“]aBäõx N ƒ-ËÖs,1‘ý—óý·[P­ècþ=BC.ÝœÞ5£¶¬ÜÀÉÄDÖ-å‡ùÛ0øäñ¦ý7 †ÖšcÂŶ_ÖpðÜEŽí\ÏóÖ¢›nù¬:tè–¡BTANÿ†<ß#’Ÿ¦%‘Ü×¢þ ¥Ü½|¶0›±#^eÚ¤mÄÔ¼›¶%¢‘ÉÄél|.^¯ypäVïÉÔ·‘6/ŒåÑm}™°˜Ÿ‚ï£V©²¬>~»j¤Iïy=á8Ãfmà›Œ†ôêÜ‹äyó‘-d@ó¸ÈBû>Gͳï3m{qǰ`TdIáþÇÆóëú!,zyZ÷£Vcç·æá޲؇Ã]@2\"”‡Þ™A#?c&ã,4é6”Ò&Í»§x3¡:ò‡Ó…]ŠgìkðñS¾~Ÿ €)¼<Ýt'JVq9í¨€Ã#$§àZÃ-ÂxxÊ7HÁ#ÿÙŒ_ X#iÚm(¥Œúdþ·ê²#»Ã…SDòø§ P"_àÕÙ3xy)Hþ1´¼o8qF•.'y€¿ËÛÉT·Ë{íÖаÒê©·˜«ZóÎw¼¾õ;P¨ÞöqÊZd]–tèÐqG¢Ø=vÔ1ùíwIKMùâ‹xãîÈ&?üL2àuv{4²¢`2›1ÈÞ &šêÁåráQ%,þ~„‡Ã‰Çç› )F,3Šp‘gsù–ÃL3&EFó¸Ñ$ƒ"ãqä‘“–J²C†ìHfÖK2î›3<ºä Ÿ´ŠÄ#±˜Í·dÄdÑF&²ä 뮪Þgõ­õ:tèøG‘Y&åjï¾ónÖÌÙsðÝβ}ÿs<Ã_”½w0wÛÉs¾-ù6T©8í¶â~<’ÀiË+¸_@Æ4›§H ávØ)œ¼Ó÷½¸²™'{>É>{8g*YŽ@jôšÄȆa¸Tš›'ÿIng‘"‚¸¾|.\*޼ܢlÒWNÕíÄîvÞ°-®«( :lä¹'ð¸Ü Œ§óZ‹^ß"ÿëƒ7ê¸Ãzº÷ýj.y®ëäë&ò ¹]ØÜ®Y*zíë]öb‚¨!:tÜ™0ü™ !0™Í¿€Ø88*·çƒ¹?pâR62Qåhа&VEÈüß¹q¹œzDcŒŠŒÉ¨Ü¡,N ª§Ûƒ¦ ½_éÐñO!CƒŸ-øë ‰ïƒ  áL=Éæå'u"ô_†¢(ÜÓý~<Þ:þò‰—,K¬Û{–Eë`³;ï8Bd%êT*ÉCkägÖ÷IèÐñO!CùâCýÕ[þ_ˆy³g¢G/þ{ Á¿ÕZ`0(ì"d³ÙÈHOC+¼=óN‡AVæ,K uëÖ8T#¶,×YÕØ¸RìÙŸÍéó—¶Èÿø÷&ËAAÁÿ«É¼ŽÒ¡CÇß0®Hv»ÃP26“ÅüoâB8òlv.œ?{G/ËJ’DFFyy&"‚#þñäASUNŸ:E™ør„††êY‡N†þ‡§ÜˆB;Ä„ÿ¬[ÿôòë¸-(÷%_¾¾œ:ƒmç² (Û”Á£žD–e9•_?˜Êìv÷a]+{ÏžÒï R ý+ɃRh¶Q¨ d“ ð¸\×Î4™‘·óÏÝ‚/L(²7ˆ¥ª¿¾™–4šìü4ü1Ž<0“±­¬l{k0 «Žã½î1¸]ײ@‘ò'>⎑Y:þnüW¶ úõëÇŠ+7nóçÏ端¾*øÄÆÆR¡BêÔ©sSB…šÀ{3÷ÑâÍwéZ-– ?3ÿJW­Oƒº•qqvÓÏÌxeq¿Ç”A8½v);ÓòSÉc÷òåÊGò ¾õ úóþÛc‰>ô)¾Ù†ÀN¢¹|ýÓqzŒŸÎøŽéŒyð1öé{Ö°üP:¹ûðƝˆêô#Ÿ¾Ÿ‹ß¿Êû?ßós¥Ç„i¼Ô5Š_^èÎç§Ëóô˜qt \˼ÌÒobúsÉì0Žic;±ñ—ùù’ý:‹= çðÕϧè5q:cšfÌ£¯pÈ<{•ÐF=5zÍM;2îk2Ü¼ñä ¶Ê:âE¨JNºÅjæäÇ#Xrƒˆç‡q#XzIˆx§Z†þʤ±X­X­&Ð4´?ò¼$c2‘|GøÍIü±4nðÑ4 £ïàg¡.+œ™õüðCüýýožPêQN;£hT-À{¼¶Õ+W2†÷à´0" ±¾NÏÚ1aTä"fIö-!©.äyO Âb*Ó·GެØLšSEò ¥ùOS·D•î“§#·ðí’«`Rð¦æ`Ýšµ„uêOï–Õ(]¥)ýïkÌÖ­û°«É/Œ6}†Ò¨\ JŠ•¼¿<€Á/?NõÒei;ôM:»–°à° YsÖ}"O6Ž#¢V'º”Êåç#ÙÅh NÛÞOS«Dµy‘šëøí ÄvíKÿ (]ª<÷?Ú›ÈÄíʤù-J[^}i ëÖ§ãýhïêÌÃÒzo ì@«žÏЧ’Ÿäè=âN³ ùˆAþG =—´LªÏj¤¹í¤§¦‘ëôØ…ÿ{Ô\6|6Œjebˆ-ÿ8Ç~( ´KéÕãYö%khîóŒjVƒw9½„HÓþÿ!0ú,Cšð}x9¤eæyÛFO^)™vÍc'3=…¤«I\MI#ÏåAC i.2ÓÓ°«Þg4ÍAFzN¡aÏJ%-/Ì´«$%'“iw!ÐÈM¿ÊÕ”d®&'‘”’IVúU’““IJN")% Õe#=õ*IW“HËÊÅ-4ÜNí_ý‚! ̀굆KÂG†ŠÖG‘¼¤îú÷ìÈL%9%…ää’““IIËÁã#P×·—@Âqu;£î®Cld4ñÍådzN ð=È•=ï>Fã±+’àÊÖytí5Š“ž?ôîtèøÛ4ÿÍkåÊ•ùùçŸ>|8&L`ýúõìÚµ‹Å‹c4oíllòÇ$dåo‰ìÎÒ]IJ˜Æ“o]BH i %«EÊ“B&p)߯„Ð$"ÊGbö}Šœyž\†Áh&²t˜ï+¥Ê°51 µ 'Y§9ðÛ †íšȲL…æw!I^ó{x\0jâ.Ng^æËQƒøNõ ñ«ßæ'U&¢bþVR…@“ ס£’²ÁŒ_T>I4hrãÔàÔOo3ræV4“•%‹C'¹*ä]:JPt Â-ùT4ÿì)‰ØÚ±¾tŒ„Z$rœºyú޳ ]·L&)2M¢Ãœv¬|0²Y;ý%^^’ͰO>¡_­$ň"KÕÓå=œÕ`¶`ÐT4Å€Aöžtïtkh9—øqõEÆÿx˜‡ë’gwc´X1^+.§&¡˜LÞCˆ…ÀãvâòhøÅÖfȳ1Äxû§Éâ‡AòY0šL„†ÛéÄ­ d£ “$P%£ï f§Û]䔡 _zÐD‘ûB„lÂj¶pÀb üòÒw,aô{³8šêÂç¦Ò½ÃyoTÂÛy¨îcôØxŽAe5\«¸»ö«L8¾‹ËÖâ:Ñ£D—/_$#ú^>Ÿñ û¿ü˜={\¼2äQÃ[ÒÚº˜}{³yeÈ#ïæó9°õÝQÌXy—¤¢ZãybüoÄG£ØðêÖ òÖMм֗‚ú¨Â{o‘e2 ƒŸ`IûFŒ¾T–ýJdwfÍ‘Rš»ËÛ^²bĨHhŠ›ã²±Ì;Xv/G'uäþǾ¤õ–a„« (R¡<Ý8\nr¡÷£ârºP=PºócŒ÷Äyc[É f³±À¢%É F“ ƒ,!4÷q™Õ»®Ž ’$ !uêÔaÒ¤I 8¶mÛ²páÂß'B¡MèR*Ÿ¾ÞÍè @2âïo$2"…‹×O‚P°(·;Ÿä’éP‰$Yv&·ì5”åeeá4`UdT·‹ÌK™@$à"ñl6þMCPRDAZLaTì1„oŸku]!/¹R"â‰ô/Á°9óhS¤åݬP‹š‡7rú,°‡°;„Ñv’©Ÿ¬¦É¤¯ݤälæÁ®ïKx¹™W± -ÒžR¡A§¨ôþpg’¡B>š&Àh!(ÀŠÉäbÕ›Cy{G“gN¥m|¹É‡˜ûѧl9Kl“ ö>âŒ9lþd2kãZµã{6^2Ñ¼ß Npdù–Ø¢©pv5‹Ò(×î†÷iA Aª§æ³ ]'ÛB€bÆ|òSºwZ…â#ˆ¹GŽ@w„]6 ­ªFxuŒÏ%„„;ýs§McÉ4‚+w`ððTõsâÖŠÊ,ºuHǾLv=!hÒ¤ k×®åý÷ßÇl6ÿ.òv“hžÿü%<ÓzÒçÕïØwêçïáûY‹¹* *v­K…Ѧi ;gÿÀ©¯g°%ÛáU†3êÎ錙·“¬ÔãÌœ1¨V·(hö4~ýj ».gqè»çxÿH<ݺ•Aòä÷^Z·mËùÏÇñÖÒƒdd¥r`Õ|æn>œ§ÚòÑSÃXzUEË¼ÈæM»H·«¾]DÞ2+fØñÚŒ]cæ¡á#èUþ$CïÆ§‰¼ ™;ê5ŽUŒw' $kÙG|»ë\1Ÿ!ƒÏ™æÿØ;ïð*жß³{ú9©„¡KGDª" ¢‚‚Hï QA¥©`ADD|ìX°Ñ¤Jï½§¾;ß'"~¯øÙ›+WÈ9[fg§üæ™gž‘èH!C?èH=€¿P}ë×›~}{ÓP¨Q$óX‡rŒ7û7&Òá ¼\ >øf 'Üé5Mš4C¢g\t¿$ñ¾ö$š<ø•8ÚÝU‚ Ÿ­%E¢¸Ýé¸=|~šÀãNÇívsd÷2¾ùèeêŹp8\ÔyhËwœà‚ÛŸ)}t@'ëÎä~ŠÂ%|rt`¶GETT•ô“{X½þO2¡cRŽïâ—?vã jH÷AÞû`•;`TŸæ„‰pZ<0ŒçžÈ¤‰OѬèa¶î:j¬yºׄÓeèpÚÇm¦ß½CÙ´’ºã7¾ùãXŽÿO¦?“î;Ç;£ûð£V‹¾CûSË÷1ƒú¿È!=¯Ÿ–1MfPàÄPÎ`M‹ÕjÍ#’.+¢2ϱUÈÊß^#nÛl:·jÄ÷ôb™¿%sßx4lÑDXs®U{òx(e¥ËÖà…“•¸«l ¬ªDó‰ïÒ‹J?¥Z¶|ù Sû´À˜# S§nžjSƒ{¦dØŸÒÜØ#ˆt„Ì;EôbѬ.¬›|?5kÞJ×ç—"­N*ÎÈh2CA÷w~à!çWtjPzw÷çÛÓ…‰µ Ì®H"íjöÚÂ"·(½®Ü×C˜pEE¢XcyzÆ RŸkJr͆,8N­Û+bUÀ\´&ÏÍ™ŒïãáÜV«6<ó9çMVlaùîI¸ÕPH7£e(oˆ®#U+êÆWxü=?c¼L£"Mª}Âû;K1è‰~Ô¯s7çŒB_ù:ßÑQ4/ÎcèU¿(…oéÀ˜Ûý¼öú&Ì… a³˜ ‹,D´Ë„ÉM‰¸xŠV2rÂîéMZ¹þ`ò¼½Üÿìã4-_’ŠÍ¡wÒ!f-;É$2 ¸2Ów%dm5û–§ÞõÒóÙþÔ(U’ºáaÇrÞüé<ªôáhÔ—ÁM(\º*wV/ÆÏ;O\ô¬f ƒÔA×$º&‘:HMƒˆdš6oI‹æ-iÙ²·'†S*œãÍ'Fñ‰½ ëŸÁ}v;Ãî)EÀ¯çÄ ÓBSë2¨Ì2ÖA_LCL#W¦* ý_êd.uøÌ´ð&'3ܸ32ðé¹öu*G›²ÏËmÔ ¥_æT/Y’úÝžàË2Þ^“‚j ù7eùÿ„þ™pú”Oö”¦{ÏÖ”‰M iÏÑ”?ó «÷xòøªIc5™AAš&»”…èïj@íeîbê‡w1õ"e¢Ëâßé9ÓO–dÆ-YǸ¬ƒï hìüCã—¤ï›ß1ô"+”™ò­çí±çouŸ|ÏɉY߸K~î“/ 0â‹UÙç¨Î¾¾Œù,úìÜ‘}œƒŽ³–Б\1„¤DËÈ/~ʹžRŽç—-µ®Åîgášû/!4!¦Ræ|Û&ïÏ-Îu?'^ý˜N`ìt“á÷ûÑ4-§Þè‚ ßK ¡ÝÆËCŸ¥ìKƒ¨\ØLú‘Íx¥)Àëñ!)k¿À‘ãéDÅ“ £exñ +E¢HùliÁ H] EAž^ÏØž3‰ö6ãn·páð~Nhi˜6‚m*™«–’¨åòã3Ï÷Ð$hºŽçÈÓøì©|§kH)°•oJ]‹·¢J¸zý5ˆY‘x¼>üy‚KæÄ™kµ¼ÌþÑõ š¡3­i;àŽ‡R6Ú© ¿òÛoûi3P‚©Åmé?–‚­B»?ú„]ªÐQ- {>˜Çïý&Sݼ·?=Dõ®5“›ÑÜ©x‚ªjÆdRÑÝixƒªÉL|Å[9ôŸøê·;iU©¾sÇ8’®R®\x¾ôæú¿È=¥-QI0È\S@@GÊ=ü 'à÷j˜í.ή ëzè}©: ŽÔ5‚oX@‰¡Ë áÿ$í»®cÒôq4*m#mÛBúöÿ”fS–Ð,^¾y),?€¯ô R ì›ÓÀœ7¨#5@ @0rÊh:é×±ûà6fŽ„Y×W•†nüsöÌXA a`ˆ¡ÿ¯„ºb8ÜßýUç®<¤e¸ñøuly¬1:ž” ÜÈq Ís½+]ûªÓp…뉜hyWÂåóÿ¹š4\5„ÐMg"à:)ƒíåé;­…'Ž`èpÁ¯Œ dT)T÷&N{JÛ͈´ƒó؈ 7!ÉÉ?ƒ5³ rìÀy¬Åb°H-;VD¢øÎ²pêTŽÞ:€×;'áÏðcqFáð)T=éu¬¤ù%&‹é¾ÀÁMÛ²ÓŠ(A×P"c‰ÄF»)Ò¿”‡Œ€Àd1#=gX¹>´’J’?Ø Ì3 ÈZM–5(È:Bó¹9ŸêEJ‘íwt§ S}èæ¢tèØ„SzÓò½DÙ4Žê6‚ÁXJÑ¡kCF jɪ2 Ä•[0Ÿ&Ð53±åÒ™öp v>I0±ït+ƒÃç£FØTú¶oL¡í™;÷^j…Í Oæßóõbl«LëÙ†éH;µ;噤zxS}¤ûC ÷§] Õ£åy–¬çQr­4ËcE,öp¢¢" x4¤Ô8/„Ô³ƒÊ`Þ`D® Ò±ÅßÊ„9‹¨2¬Ó浦áQƒf;ü5oÏãÇU‚(œ<0ýC‹uã Lº÷?¯–9é‘™©Ô5ÌQñÕ7ç]j9ã^šGÎã•W>çù‡ãùlìÓKêGÃ8…ŸL6R¿zŠémæò@įLøô fWÇäÛ›íôŒÔÙúÍK|x¢SGµÂ•Y4Wúß[˜‡íIù9OqG1ë¿ü‚s·=F‹ÜQ¢³|ctÁÂ-Öt2O<:”R/õ£œé$k¾X†«Ã@b‘×G&³÷ϳAꘔУêR’5”Ð:ñ]g°ç‡”èô ‰ãW±w´™UÑ IDAT®‘t÷7èŽW³Ù‚"$‡ )Ujw›Îg÷¦*v—“ c|DFzx/à'¦Ù0ævçL†ÄI¸t{9F½¹”~nRØ)ä cä›Ké“õ·N›3iÔ; ¿&Š»Ë…Ùg¢÷ª½tw¸HO‡»ßßBcsé-VÐeÈ2tñógúê蚦¡é ‰*\õÀJvŸPÚ|œ¥sr:iH¶É8w”íÛÏP¸ƒ‡2°Kå­És8s×xæµ/†Vôn5šÊs=FRbZÄqV}ù=ÑRHÉó(SäJ͇­L;šº:0áé7x¶_Slçw±jí^ªßóIN-׺C bèba2YD^rSogT´‘E7°"oˆ"XD†Ù@—ˆ°2 ž<™ ¦ëŒÒ¼õÆLžü$Íç§RêŽÇxkÊ£DûÓð{5’úô#íµ‡¸ýO ­†ÌdT 'ž“*.—“"ХΙ=°Ó)lòqhI~ᆿ´‡GÎç­°§˜Ð£ãNâ«ßŘ»Täy3.§Ð¥‚=,›"ñy­´œ¾÷äQŒìЄ%šjd|˜‚Ïê ÂaÉt¶³ÍI˜Í”80$ÈÜŸPf®ÂʃªÍ 5‘Ë\drDR8ëDÅLxT!Â/aeST+Q… ç|d·a„®#1ƒÉ¡g 4؜؜¹îpÖߺ&+‘ÑÖ‹ zöÈBØ …°†G…Âä ‰šiRɳä^Kxáv%ä?¤‡D£3¡.:ýÊèûñdDšµîI•t© lQ˜SvðÒ gøá Th5œi]‹óÞ“'ÙõípêÎבZgÞ,z¦m^ü÷³#Ò® iJ!j4ë’ù~œDØ2§½T aN;‰°– ÿ¬9ÌzêI:Ýõº³$Í;÷£±-ËÑ?³Œ®‹ÿ%1#‡Ëç^˜ÊÙ3§ÿñ)UUùò‹ÏxèánFÎ@Þ}{.mÛw M9\SÌf3ŸòÕkÔÌã3 Xì¸,:ié¾P§-L8]N”`>ÝiÅž øÈpûP­~>íÝ·ë¿Éý+ k~¯·7ˆTL8Vü7AMb¶‡ã´Šlë…”:žŒ4üšÀlËÙX àq» 3›¯Û&ìaNtw>  V»›Ù„@'ôãÉð‚ÕC æ ³ÍŽUúI÷ålëc2™X¹z-}zv#-=ýÚ…³%À“G³¼úX&·ˆÁø÷€Uå×ßÖá°™p:yÄ”%,K0t¯–oðgÇa3#¤F  !Ðq{üXÃÂQý°Ú1+ ¼¸=A,VS¦ñHdÀKšÛ‹Ž‚ÕîÄfVCï'àÇãö‚ÍC„Þb²à°ª¸Ýt B1awdm¤­ðyñz¹ýÄQU•Íl¤åÝ÷„VÅü7UTQ8}òS§LM™ûöüö™§©™¿Ó Ã2d`pS[†.ÞÞ@ó¹s‚•È驲ÿLOõçé<©ãÏH#ÍëÃzw®½±Ðd¤åˆ[¿;¿û’)ÁïIÇïÉÿ¹Ÿôô¬ûi¸SsE]—ÞŒ4¼ùOñfšçºøóßM×1©YaF¯áF­Rð™h4öUšh^<í_ÞÚO¢*ùƒ.†ð¥]Àw‰ãÞ R¼_É“U¼yÏ ¦]à’¯ oFêÅïÇ“ó~´€\Å©ÈHKùÛeÖÀàZcˆ!ƒ&†þngëó˜h1ýc™]dø´â¹u™¹šLä„,¼6ÃÎЯ€ÏC ÓRôowãj®8C7K™500ÄÁ?رèÿÈTƒÅ†%óz7Äs£„v­—\K)t] 27º½9¦”ŒXø†º.;“¼ËÓeî†5Ï—™Kƒ¥é×BˆY&Eæ³Sž=ô°7Í{ÎZùg2©èºÑždu·2;Õµ(릂˜¡—ÍÈüÊBrjÝWÌßj£—;qšò"ýø/ÌýÏN:ôíFœÍ(°×;wì(û< !ðù|þ›¿MÓ%îÇd2Ý4ïÎëõ²æ§•™[ƒ:…Ȩ(Ê$”Ål¶ ¥þ "SÁËTÁ™5‹è?ô 6œÙѽzIÆÌžCïfåP/njÈ8ºƒ×¹èõPcòÜ}©‡Xµj=Mzv#Î(³×™ðow_§\‘‰ X]TÓÍÝÄišFZu¨U·þÍX‚Jl€@à÷ùسg'[7o¢Zõ[PTõ¿Oœ&Ó=)sµaÁü³©èÂL¡¢ÅP‘xÓSH÷ø‘Šgxs–ˆÊ© šßKjZ:AiÁEÆ,·Áu‰ªª¤\8‡Ô fà&¯>Ÿ×Ð 7½£d\<Á@S§OQ¬XqC ý3ã i/BrÅ$"s}ž¾õCF?µ€ý^ - æöÁÌß%W[ªû/°tÆp^üúÎBE‰ #Ãì2ÄÁuË®;8{ö ‡ÓÈ ƒ EQØ»{:?ŒP¾k3õ] ÅP,ØŽ,¡ÇƒÛ±) –ªË#ÚðÞ€)¸žþ–/ïˆö2¶n¦µ¾‹AÙ~B ç÷|É›ËRùÖÜïcé¤öŒ=ZÃoÚàºÿRRïÖЉ12ÃÀÀàFë±9qüX(lÅ5\1Y0W“I xU:=ò01V%"Ž’i¿òÝÑ3ê^‡%"¤Í}úÕ7œDÄ)!Ë){V"J7 N¢ƒú;÷ÇfŒ8©×3š¦á÷ûŒ000¸¡°X,¹¶·¹vÌi2©£»Êp[ã;‰µen„sâ|þ$æï_N“|{ãìÿLË™’—UUs­U+&!9{ƒë]7$»Á?/²M&“(ÑàÚµ[ÿRÙ*Àq†dfç©|Š5¢UüSL™²ŠZ7 \x8¶gZ©*¨YS`:D$6D9þ#»ÏC(ØóýÇ’ yüŠ ®ÓQÀßÖìBQ±ZL|>4)°Ømàóà7t•Qœ¤ÎŸÛ¶rKÍÚøý¾í¾ªÙŠEñø5ՄŬà÷ùÑ =v³ª¡ÅØP0-C/©©žìÊ /ÏÈÙS3ú)Ú¯°`3›±†•¥Ï+/‘ô’æ6#¥NTb+¹c5Ïu€B…#Qu3vÍMШˆ×}ç%QT«õ2±ünÜÁ¼ñÓöÿÊ”…ki߯eÃα`ødº>O›$†¡©€—']¢šÔPš9zª›Õ’¯3óãõ®ØŸI)°;ˆ@nÿåce*ªdç¢ç™í¹ƒi]«snÛ÷¼±ìÝzÜOQ‡±ÝýÍ*ºÿ 5T ÅP‘&}YY_'Üšì …²¸*v`ÚûÍHwûÐP0[ì¸ÂA¹{(Ÿ7„[Šˆ¢Íà4êÚeÛâ°APÃX¨cpÝ7*ÀžM›hQ·çLV|x}A¼nƒVïdz--÷9:A]C—©g°ñÛ/‰iý÷$3ÃFyÊú¹/š€ ›–ÒÿXvÒ‚‚°’Õ¸àxÆw½‡¸Ü†¹ ûyfÜVž£6òÆ]¼yÙ{J©ÔCVN÷©}ü°zºv¤ˆñJnêrfˆ¡k€b±•{ð"²â ¬Î¬ù…ÕA¤5çOÕâ ªÃ(¥7©ë”HLdÙÆõà´ñËÀÚ<¡=ÏšWïŽ+ÚÇác©… gx.«Š#¶:‡TÆj©gm7#Ñ¥D7æ% øˆ]"Hòë€æK瘵1ó¿™JåH?û×.eÂwQgã;ü>³) ú=¤¦¦ã×Áls©ç8uú4§Oäø‰plá˜üé¤dx ê`²¹ˆŒp %¥Ûôe¢4#5Iho6)%R×ñ¹SHÍð¡KÙFd¸Eq¬odþ­vÆØ›ÌÀ u^f‹…„òɘíŽE˜°h%©P®m1¬ç 6œò õŽêÝxcZOÂw~ÁƒÃ–0aá»ÔÉšWÖóLØ•ó[†öfDê`v[¼$eJØH¬T“;«GS¡öHf¼‡1%N°hÚæ·“€¢£9ÊÒÿ¹iÜòëd><À3³ÞKdÜÜg°¿=1?%àõ’(F¯×æ3ä6+žx.©=ØóJ«\æ)…Àù<óX?¾;cÃ.t"*vcÞÜ> x¢zC—³g>ÞCH …6;ôƒE„¦t…CÌø4g;ÏççÇjb ìa|ƒ»xrEf—1ãr9P3­A¡Of_Ë  ØCTö4™+¤$¨T W¥ÆÜ7†/֜ྒ²x ^ûz>U K~{û žx}Íæ¾Dï·>fË3_²°­¯;ƒÓLâó'’)lWØóV j>þ]ÖÂdw0!õœr(…‰´?ðÙáš|ñÇ;$ëg8°ÿ,vŸͰ ÝØåÌXMf``pMÅ€Pàì6V=Šþ·9àq{(úë1ô$Ã)Õào–+‘·ó’ЧYÁ›îåèžïøößøé‹WCÓjþÚý¸’N@BЛAÀ+bEžüœŽ÷6ä×£n¼hŽNKS¶Û‘Ìc<àL¼‡¤m¹ë¶ tîÚ>¶À©{ ûbÈÀÀB«s|¾¬åÏÍA=Ô‰ø|’´Ôb¼´é7ú—6áÓC'H_Gþ؃®køý>ü>?šÔ úýø|ÔŒw=¡e¸ƒZvÙòûƒèºÄï÷ã÷ PL(þdóHL óY¡Õй¼3© .¡…”·D“' j=èLjÔ/¸¯ù*¿ó Ÿv¼ç–nz·×GPÓÁ~Ÿ¿?€Ô4ü>72â6nÙŠOñޜΔžÔš·¼I5Åc¬ö½Ñÿ%+´!† Rç•ý=3ª«ŽŒ®BËò©L}îî˜x7Ål'öî&½H2…3ÇßÙÓ¡æÉ˜&3Èt &{ÚBSfH@ €Ï§‘~ö0ß¿>…1mø¢¶ »»6{¦~·ëo¥Iù(¼gqÌc!)1 »%HÚÙ4¤ZÎíâåÓ²:áòKß[AŠLBdMÕ’SC–(ÿìö»‹Òäѧ¸§mjÄ÷ç‡Ã’¥!`8û߸åÌp 600¸fb¤§‘¢ùðÊbôš:…COá¾»gâ°YQÍÅyøÅWi­ûIKÏÚu wj ž€á3d@¤ë:BtM'°g)ý»"ҢЮR5™ñÆ*Yt´Û:3díÓLéÛév'RÚ¨Óy0£KÝIƒ‡›2óÙ{¨÷^=žy}#:~Ȩw0·T1 «¤§”’€'w]J´€—´t7A©âÞ÷)ÃG}GÀ¢ô»‰éú ÷• â ê†×Ð ]Î jƒkÓ¼L÷QÿÕ­¬% =5S|žy§6©^4&³ W¸³Þ‚ ïÀ&@ÄòÔ·¿!œfcŠÌà’b8¢Ê],Þ¸9;B¹PLØ.œv3ºa/J»á/Ò´w:~M"vWvÍORç×Yqw~ÝDDt$õ¦.¡eª]1ãt¨Œž”6‡•Ò­÷ ‹«i¸\A”ªý˜ÿAWA3Žðœø}# 1t©Ê+þb{ù«9&´­ÈŽ’š5wn¸é\ïå?w¦:£ˆ¤9«6Q6WÑ$®0 £K=<‚ÐV6†2ÊSÖj®²¥˜ ‹*tñ±z.ëŒj!,2ú¢ïQ¬DDç è¦8‰*”ôÍf4asAæj6ÕB˜‹Ðt¯b%7`Í*ÙipÝaRMlÙôN§ÓÈ ƒ EQÐ4ÍC×^ ÐÎqΧSÈÄTÐPá‘ñÔM. €­L9Êš÷³äT&´+š}ª1Æ6¸ƒÔªS˜Â…Ì000¸á8rä°!†®9R‚Z”XK€Ã%[Щmñü] [>z›Ÿ"äÅf‹Üÿk~yõ.TDÈá*·5Ș&3¸Nù7FV׬Ÿ¾Æ(=ƒC1 bسëGtá¹%«Ø¼ñg¾0ž9›S žÜÀksWÓ¥w_ú¾ó.UÊÓËNV’*D±ï«ÏÙºÿ ç2|HCü+á ·zéFOÿuž·¹³3gÛ˜ëå}¡n ´мå.Zß‹ŠÝû_¿Ù…s_¿Æ³SßàwOuJ:8±}5…ïÆ}õcÀR‹É³ÃæœÒ ÎøW辜ñ#§²òϓƴ™Aèw®ÜÑ\³6_¤žÁ¦ï¿a×9ý¯£^oÔRÙøÃ÷ìO•7^ú¯Z”ÈËÿý7…Jþ²$¯·Bøøó»/ØpRCdÀý"é²b%Ï~~Cd æ=Æê?sÚ/²ß÷u!Ô .I& U’Ò]^`FV¥APªÑ£LkôhÞCcbãœs ×íË3u3«fT]†¿\—á¹+Ža2¸™—-ß,â½OWr8MV$‘¦ã–ßÊ—Fò}±Œni´!†e躪µyF!®BÃä;çR›oBÈà:ü] Ð¥: ¡§ñåó=è0~)…ê·§W¯Giu‹ƒOÆcejîj‘S§Bõ&¿Õàê¬y‡nÅè?÷}:U0]v$ŸûãìêxI!$¯øìò–…¿c¹ôy‹Í†Å¬þ¿­%7é{×±tÕ>tÀìút‹ûÖû¹+ÁvÙéåÚÜ`Úq~]¿ÝüW]•Àlw`U.îâÒv¯gÅ®Ô|ï(ןB 8Ãôv­™³«ôÄ£mkؾ†ýAÈØ½Ž»Òþú½çûÈb2cµÚ°ØáÄÏ_ñÓQå* º!† ® f³™Õ«W‡¦„Àápäù±Ùl!¨P¡gΜ¹´EÎþù3?<ÍŒ÷0²k[îhÔ˜¶ gÑ· h.8½é#:¶º‹]ï¥RBYÚŽžÁýaWzè¾ûV½JÛG'qJ¤2­V · y†N·W"¡|.ØŠ’u³Òð±ÇÖ¾““iÜc:;Î!p˜qnáÕ „Îlä¹Î·“WŒ„êÍ™¼ìBè¬}¹? {fd‡ú”«u‹6žàû™¨W>žRe“¹oÜ¥ôí`p$~|8wVO$¡bc¦}2gšE„òÛŒ>ÜÞºÜARé²ÜÞ}:{κ›/Ç·£rù2”,‘DÓž³Øí =§ðàí¡÷P©t,%ÊT¦ËkëÐ…@‘üúÎXV,M\…;˜þéœûÝDƒMEQðœßÌøG{áo÷/=Z»ª±ï§9´­YŽø¥¨ßX~>-ÂË»m*P{Ül†µ¾…ø¸òt|á<³,Õ‡ï–Φ~R)’o}‚ýçö2¥kCË–¦tÙôšú%gõüR/?MnKbý!ü¸îG^Yø ;^éDBÙr´íû©ù¿ å'>Ùê ÇÔ±´jXŸ;Ûtå‰iHÞõ SßýŒ¯ÜOBÙr´´#?¦[‹”Š/MRµ–L_ºŸ ØñÍtšT*El¹F<þþ.LaöÎ~’ ëϲytuâJ×aÒÖ0Ά200ø÷ 4hЀU«Vñàƒ²ÿ~ÜnwöÏ;ï¼C›6mX·n111—µ¼Û¹‚ŒÊ¨V2´¡ëÙ½+yÿ½÷Y¼øS6ž b6›HÝ~˜"f°mß^ævˆA¦ì†FQÍØ¬f‹ÃBê;/­ÚƾߟåÄ„ŽLÞÀnãÄ÷Û¸íåÕlÿózº~bÜ;?£#°Øì˜U8ËœG;³­Á‹l?|‚ívã§þ±ð”‚ÓeåÄw[¨=m5»Ö}M¥ Sy~[YÞ]{C;–ÓàøGLýj+  gx ön~øc[çßÁ'ãÆ±9Ïâà°rjÅj>ÿ#»¬£­ös×ìA•òwbÅÖý9ò ½,oÑÿÙß?éÄóGóÁúýØø%ƒ• îÇ8"«°ð·?ùö™J|0þI¶n²Â¦š±\XÅ÷wáh“Ì~¼)6Á ëyfØLª=ñ»ö­cDâõžÁ9lXÃlœZuÇ>ÛÈÁ]oâ}ûIÞ;Yˆž/¾E‹¶X·ÿþ<‰8¸{ø<þÜ{€½¿½MÌú¼½ìXŽIÒwН&÷aÂ¶ÛørõKÜQë?r•†|̾½»øìõ®„_ÊrQ&•4?;‹Ï¾ý‘õÛá[2¼k{* ù„}{wññÌ΄9’öÆw:x€_Þ|€ïæÌfË)?³¿óÜ“‹hþâ*o~—äõo±.]¥BŸ‰|í#j}Ô”©Q×-¹·Néʬ*U:u§8@D3†µ‚±læî$˜6=¸7ÀJË–u™öê¤,Ñ+*œþ’·Ö{‰r½B÷Õ„Eç|úF¾Zs–2Há¶=éPF…ÀqVnÞ¹½{™Øwº€óÛ7ñ§}/3ÚUÄG£¦·à¨Òšòæ1ì?U³Ã‰It€"m¥uIUË•àÍã© ¬D82c`W¦çÁ{â7<~É;kÌ<þõP*ˆ§N$èÞs˜ —ណ÷f†Ö]Ižõ$ûÏCå"7QI&8»‘Žºé4¦&®ÌÏÝ»>agXƵ+¸wäXÞmýëÎD4@%°W¡al:¿ðò€-ƒ€ßKJªNt¸‚%2ïO2púZÒ’S‡Ò©qäŒÔ<|5}(©5šðÆìÞ$ª^¿-žÇz”»L†Ê{£Þz›?]ÎÊÏÞãàî?ÑÊtdêì!ý~4-gš,¢LûgOcÚ¯z:‡vx8 ì©Ï8ÝœIÍãQ®Oàýn+ Á”hîÀ–Ë‚e`ˆ!ƒÿA'j€[´hADD·Þz+=zô`ûöí¼ñÆDFFþ¥£±3&žô³§pûB­G±*x¼reö}½ ‹*,sÈq:SLdj1òýP°:rš «ÓB0= ›Óœíƒa²˜™µ¥qZžÉ/¿JÅMPSgሠgÇl‰=Š(šŸÔT…{ޣ߭erîl‹D•ûªŠb¥I×AUt´ü«˜¤Àê0¡jHV¢aB?·œ~M§Æø×˜z[Yük‡óÈ+‚¾ <8(î";²·w6™0e:¶èšÀ¬Jô›ÌH 5Ä|öâA:õnGé÷?¦[­Bèž K Y.Ôº‰K âói l®_*“" ê2¯–;–¿Îè·ö2ø©§©ç`å¼aüæóe–,2Cç5"­"ÿ>ÛW¨!Aä(U‡.kr¿?ˆôí`l£{xîí{lUÁut*>=œÙ©˜6±e,‡;x:A]¢»S0ÙKãÈJ®3–UÏñ%2ôÏu1Mf`PÀRR¯^=–.]ÊÂ… ™7oÑÑÑ)„$P¢b3b÷¯â» ûðøƒ¡8]ÁAM¿ä9f‹³Ï×/óG¶s.Õìؽr=¡m>óýês”ª•ˆ]Ñ9¼z‡ÝAÀÇö-û±–'\dúê@©Û¨bÝÉò­¢b S(Š0‡«)_“f‹$16œUO∈&&¦‘a.6ÓÕ7 Å„ÿÐ*N¹êÓ¥muJÄ„‘þçvÒ¤@ «@µ¨“,þñ( ‘Z óùÅÅzS0º ÔX0±Sû fùÞ lenÃqa+[…ü®ïÙGñE­\Ò…\„PA¢ë¤Îñ}’Ôð.šÕJ¤H” {öáj親6Ï¢m`1Ý^ø†t=ÔÅ©Š@óûóÜ!ï,•@H?©)éxÕlÁGbd€”ón“ŠæÏÜŒÖwšM{=Üߣ=5KâÄËùSgÐt {éºØÓöp Óˆ”²s‡ƒ¡)b³ ‚>cC[Ã2d``p]Yˆ¤”ÜrË-ìÙ³'[ ýÕÒs!%á ·1æñFŒ|rEï 4 IDATëjT'¾° ïÉ]ì‹J¦kaÁŒ >ŸŸ,iW…*ÖEÌŸ3—ºñ&~]ò3éQ÷eÅÎï˜Ï¤©[0íûšÏ\1ï¡盈üÈÄ ªJcù·GxdRClñ{½‚~Pêñü3wóØø‡ùÛÄš38ºÿÍ'M£°æÇëfÞ#‚{»ucùÀé=f#uâÃ8½ï 1†1¨ŽŽßë!˜•X©ãóz/² éAÞ@No-àÃë÷a)Ý’Êö'yíµ©y‚/¿:‹ÙìÇK,cžìÄýãeÐæ”±¤’R²ãî3ã÷zCV,@¢ãóäü}Óh¡ ·7ˆª<ø<3OôaÀ#™0kÝ-æ•ÃÙv‹“µŸK½ÇÞ¢ªÐØäñàÉ•¯ŸÎâñIYÄœ×gR.®uª7àüËK™¿(Hxê&–üî&¹FèìÅkÑé±vT/—H±BÄ”­H•JI(Æ-êæõ]:‘âå*R³ŒŸ_]’2ñ….îøÌE©R)žH‡ ›3Œ¸*Mx¬_?ÅY°”ªHÍ2.|AX¡²4»§ f7)~…øjwÒ®csª&•&ÂFźu‰¦àº¨Õ±÷Ô®Db©8b«ßJµ¢ ^ÍJñR¥)í4fÍþÛ¶l¢\…dNŸ>…ªšˆˆ¼úxMBÜéü¼æg߆?þø óc?àËüí½1#‡Ëç^˜ÊÙ3§ÿñ^UU¾üâ3z¸ÛÿPï\¹á÷œØÀ“#^£Íä94,y×;ÜCúˆïQÏšïÈCŒjØ™BsW1²œQX¯†wßžKÛö Ff\cÌf3Ÿ}¼„.Ýã—Õ?‘XŽ¢ÅŠý#õ‡Ë.Ï7$ef —Kq™ «±yìæ¶ÌˆOcý«Ã}ª9ßL¸û²£çË×ã\iÈŽýò×qÄò^/s€¹=ùAWpIÉwÜUßïFPeæ·ùòÿŠ¡r‚sf—¯«Éã+Œc/Ê[þ‹ÐW,ÃW,ýyŸ1Œ½‹. uÛvlß¶‹ÙJ\|üÕ‹!EáôÉL25eîÛóÛg~œ¤fþN2 œÏ‚“ßÍæö’áÄ•Š'>>žÄê­xqÙ:¨Žê7¹ƒâ.x.œÃ¸”[#ýÜ92‚FA5(XõçòM¸¸È’t¥cí‘…³\üÉî"Âi¹¢KÍå…Cþ`ª‚«3zå ¨*„¸8ë¥âÓ\Æ‚öW÷¼äýnüÂq‰`¶%$òåéÕæñÅ·¾|Þf kßBrñ8Ê–¥lÙ²”Mˆ§Hå®üt8íòÏtµi¸Ò3^)Á×ÔgHGVÀ Gkõ³ùÃçxäÉ7h}ëÊZÂIªT‘(ë¥ÎsóçOß³áH€òuŠcLöü-ôü|C^k“”HTªu–%sTn`ð—ÅN˜¨ýàKüùàK—+–†F)ÀÐÕd,áÄÇCB\QÂ&¡à;·ƒ—ŸšÄ†“úEšç[ƒè:ê]vŸ:Ä'/Îâ—ó>à ÎÀàÿeAÈg ¸ÄçBÈàŸ,v], 0Ò2$TÎ]©š8‰Çǰ™oRÚ¥âKS±Z­¨¹e¢¢ë™0åš½»–§ë8{æòí翱# np ¦eHó“Qª3‹—­`åŠïxwh Lz‰-ç—ΡÂÉ?ØîK¢MíPH-‘؈*ËEËp 1tÝ#ÑÁAl\±qehÜ£uÄ/,Þ™Æe7G¶†aŇ;ÛaÚ‹/„TC ÝúHKI%#í;—͆CV£-—¯ òN:•ÝÍÌ·vpú«E¬M÷¢jÈÀÀÀÀÀà†¦€®&SÛ_áΚ Q(¶XÚ=1…û\Nj¡(´:€Äïqãê@ Îá`׎$½d¦F›f$ áÑŒBd`pÝ’?6Ðã$é700ÄPi%E›öaÕ‘>—úJÔcîןdÃèŸdŸg*v'//ÛÄËY‡OŒÚÀàêê=è%=-_PÌ6;N§³’;¡ÈÞ<ó¿®WB Ðùº[ž­ù!«&\MjÿÙ4ü×é÷²°muÞhó=?õ(a&C ýmË•6‘¿ºŠó„±$Óà¦1ÿÕñY\¼ùpÆdÞýa7Õ„&"J”£Ý£ý¸¯aæ|õ)t™¹©fÎö7—^Ây¥XÅ‚[ú=Ï3ÑEò$çòççOÃ¥çR_È\[ö\®a¸\žæ¾œ;ý&›»Y½üý 1d``pí))) >œÔÔTRSSÑ4-Ï÷N§“ÔÔT¦M›Fõêï;˜Õa¯~¶;Ï®ªÁËo.¤NÉ(T-ƒcûöf¶bÆÃ×F²µzk_ÏãPõ.48°¥ïLŠ8ÊÃ^&~Ü*o|÷ÏE»k9Ëv¥S¶iwFtn€]ç?Ï¿Ìù¸$ö®ù³¶ªô7Š[‹Âé-¿ð[éj4Nt!_³ˆoÉÑ ‹[; g«*X‚ÇyÊ,ÒK%²å›¥XÚÏbz÷¦LeÙ¶“„•oÁÀÝIvøuÖD~(ך’kæ²t·Jã^céÛ¸TŽ8ÆûS_×PŽ-˿挽*½Çá¶â‚”?>cæ»KÙzÔCL¹Æ þ‰a&¶o ³_}›?Nx‰NnÂÐᢴc|öüDmÜÙk4½Å‘ þ!# ®DDDÝ»wçóÏ?ç™gžáý÷ßgÁ‚,X°€yóæ¡( ·ÝvÉÉÉ—±Ëþ5L{g'ÍŸ}–;“Šá²[±»¢)[µÕ“K>v-_œéQcðL&?XŽ-_ÆÆ YWIå×¥_±Ëé‡71oðXöÔÄÌçúãýòY&-ÛÐÓøå7Xü›‡^“^ehÝ}Œxøqv!8¾f)_ïHàüO¯ðГ_Q¾Ã@ïv¿ÎÅ›¿=_æÏfÑÏéôžü C˜Y0øA–fÔ`à¨Ü®BŸnÓ8ƒ™ãë—óÚ°ç1u˜Ä¬!·ðþˆ|w!¯%Ij©¬™?›ÿüî£ïäWé_qcLåpn÷ Š5ì̘Qý©|î~b)~!ðþ•Ç{ c_l †L‹d©>›™í/`s|Gz7wòJ¿¡übLÏܰbȨº7RJêׯϚ5kèÒ¥ çÏŸ§X±bÄÄİ`Á¢££?~#÷ RA³X3}" n4„H)©Q£¯¿þ:ƒfâĉ,Y²„C‡±`ÁTU½²‘5 ‹î&-«Ú—x˜[;òçòÿe0sSVÅÊÎ’`ùO9¾4º&(V¡X¦Š-Dðø12t°ºD ϼ‚“â±Vö;‹ž½+séGÙðÎóôû"@UQ*7‰B,N‘E]xþÎî£;™5¬']Tœ5[RÚâç¨f¢pÙ¨ìf4ª±Í{qù6Ûm8£l™é±â0›ÞÇØ÷·av8pŠS:â"-('P¢D}즼^Lº¦P¢Z–ó´•»d¯×¨O7¬òu>_{ ¡ŒÜ/HÖÅB˜±³í /ˆ7nL0¤C‡têÔéê„@‘F´(6„/—l§ÏàŠ ,¸Â,Ä CÉÞŸ^äÌ&lªNJvÓ4Î{t¡ÝqNí:IHžÀùÓÐÃKbSÀŸááÂét !¼=êÁ†È¾… »pQ±çtæÜ—˜·Œúve™ÂBB&&bESyjá{TÍÛŠ±X—yĽD^Æ©:çzR¨XÒÖóüôÕܵð+T ƒÓÑ é"„8" sz÷94.ZΑë:Òp20ø‡ùŸL“©Š0~ ÜQÙnAдiSV­ZŤI“®J…ºðR c8‡žkO¯Ÿ°uÿaöoû™% ¿äœbºÄôy1Õ±ñû¢ØôÊt~ L„Ù†ÿÇÉŒ\¼Ôãëyqî7Üro=Âýü>>xç þE6˜6õ'tÄÑêÑÜ­ ,áQDØ•ì'´GDnΗBÍs=„‰°È0¤=‘—æôãž5I%¹§}MªT½€Y€£|KfÍ:ÈÝ©3ÎK±Ú˜õz}lÑDØ”ì1¬=2êâûüW†š<Œ9\>÷ÂTΞ9ý¯TPU•ÅK>Æ]¢åÿtšLÓ$B("ïˆ- ƒù*÷׺DC`RBƒ=W”"ºŸ})6§…¢ÉÑ”ÀUmä*%8£ìÑ|ìOÕÿÞ(P‚¦KôìŽ)dy»ÞšI©˜ ;ú:ÞO0hL‘^kÌf3Ÿ}¼„.Ýã—Õ?‘XŽ¢ÅŠýoå°¼|L®ÜÓ>YÓO—n‚¬{e(£Ï´æ»§[但7#[v£òœ5tMÌ]WA(¹¯ý×±Á®é9—3Oþëe[ÉòÍc嵞]>VÒ•òèŠ÷30¸‰ù`áZ·mÇöm[°˜­ÄÅÇ_½ÈQNŸ<ÁÔ)SSæ¾=¿}æÇé@jæït ãgHJøß $ªÙÌ-É.NLáX†Ì6æBá´()Y¹9 ÷_2Óu(R:Š þ4~:)pvQÙ]ç5\ÑNÒX²9@PþuštMP(>ŠFž3ì¾àä\eã&u°Ø¨žF©0*gÎxØ~8ƒsþë«‘4|§qוŠãÕ8ÍÌøÜ¤¹=ÉgÚ–îÔ2ÜYÞDYáÕ_ûªŽ»BZEN´Æ+\ïÿÀU\ñºÿ_þ}1”iÉPþG½£ÔQì’¢ÜK÷¡A]P¡tŽgIÓ$::ºÌôoRº¦£ MXÂmÄ»Óñøu̪àØÎS|šÙÌiº$ ëèºDËüALŠ@×u4=sl(&U K‰¦éu‰.%º ´ š\RDÈïFä³dI›‹N c:•ºø„B±ÂNª•¬ÙžŠ[ÓÑ…@è¡ Ð$RU0eFò %BUP¤Ì´`eFûÍL«-Šr+e(-ªªdoN›ûYE\QÄ麡† þ Tjô{‰eº5ÿW–D^ønªËpP300¸ÞÅ ¥Žþ¿òÒ%‡O{i^ÄŠùˆ&v;"$kwú0ÿ{ç^E±ÆáwwOO9étBoÒQPDA¥ ¨4D¥[À‚Š V ‚HQiºé=@(ôäääÔ=»÷R ôÊÕ«ó>Æí³3sfóÍ7ß„Z¹¥Q µ"hn7[Ka[r€ÚÍÊÓVsq&,Œšv%8«…²<]SçDB‡ÍvÚyÓyï€'hÊÖAÓ5ŒV+·7Å2…õ‰^*Ö)Õ-Ø •šÍªíœóKyÖ2=8ü&ÉÄW‰¦}ÍPì ¤$e±ú@éÞA¡dš5Þr9[œh† 5ëøYGp≦Ðò¶ÊÔKË"3ÎNTZ6çÊFbÜšÀâT÷u+GÖO'ÙM—²’UÂ<™9|¿;ƒ$ŽwT .͉e#BQٻ翜SÑ êÕ+Eëx+f=@±4Öwá-Aôè²ðü9&£5Œˆb­&B#"E ‚ÿ1¤Á_çO«“”êÆ[%œ²FGý:ÑQVÂÜ.ŽäÊ4o çyëG/ÖØHz4+EúÚ³øü:aåLY{НP³yyÚç¦ðî~Y¦FS{Ð’£‡„4MÇJ«ú‘øN%³þ¤‡€$‘šÅGÜd¨2u–§k}³·äæ{h:Ä–µÓ*Fã»u'9çShtc-*XYuÜ´àè:šÙJ½HC»rñÊFÅHrL€;×ÇÉTª Ö‰%«8ã7rç]vB´‹CV:~5h tl±&’~<Ë’ –¡MÕð K¨n¾Xy5"’‡Ú–¡NÖY\Õâh,åðéŠ$r :·Žã¦tëRçv¥ -$!† Ë‘¿ŸÃÍqwMÊ(JÐ)c%õB:k(õ#d²+Dѽ¼º„Íd¦b„Â) §39ê‹QB‘‚ÁÚ,&I—¸è¥š®c޶Ó-6À±ýØ–ä# KHºF®[¦eƒÒĘ@7J(&+6œyáHttI¦´ÝBx˜L«Fe0…š)e1aHpåû If]#Û¯E”$j3j£ŠÕÇWÒ@ÒI;•ÅyU ® ®_Ìÿ å*8Ë'¨ÂÜrêX :§/¸¸¹Ž‹ì! 8äÄ«ÈÈ9ödDR®\†=”Ûn EÒ!,ÄDX)k’UäbÔ$C|ˆ=~?²®þe/­k~vœpÓ²ná'²)©s4!·nC÷¹Y³å)’Œœ'P<^jåu¼n¯@ÒÁ¯éè¿Ð¶ÀëWñt¼>{Œ “×K¶/€IM áî›cpìOby’-"ŽM@õ«Áëu _ERàøñT~:íɺ¦áöçMP×u|N79De àòƒ9Ë–}¹„ÇDS¦®Ÿ_EÎ8<$û!ûH2«ü¾ )M‚ìÓ©,ò‡g‘PuԣɬÔ|Èd]Èbu–Ž ÷ùT–ªn"TT«7%Q-Ö„!àá—ÍgØ®ã2@òÑdV‚×ûNVnT©g!Ô ‘éps>Õ‹ZdøIBòæ²ê§D*ÄÙˆ´ÈÈhœ:“ÉÙ ¹ºÄág9ëЂâD’ÈLHâkW(¥­Y§Rù2=O.¢%<ç2øù¬J)›Ä–™$¤yÑtš_åȱtÎȬ9Él½à$U—‘.¤ñåÏ.*E›±È:éNÎ8ô?¤K­B þÐǨäX:—­Ï%IHèœY÷óRë0®Wã"Óï%]'ùÈZ¾Üä¦oß®DE_×ò*¦ü~P¹´|K”’„DË'Œ'³çkô­cüsDR^}JøææúÚ1åþŠÖ5NïZÁÒ#! ¸¿aQ„ú}†¡àrƒ£îÊeÏ©ªÃÉ>GÁ½SÁý¾´Ž\üáJàs¹9rÊ]Tü×Gâ9‰—üˆeI'å\)…ÓL€sç²8wñ¼ 7:etY r!‹3ZQk:¸sÝìOuåY|ò"wK›ËìÜKâÃÄŠõ‚ßM^}:·ì5Nz„ ÐÈ Ôà¥ÓóÆ2Ŷ0ÙÇw±þ”±½_vÔ™rŒÛôxHˆ¡ëU^‰ŸåÁµ7²nîX€¬­³é2x÷Ï]ÆðF¡¿ãv:É;¾füg‰¼0å *†]É«ÃË¡5ß’tË úÖ)œßf=Á/–<Ñâ½—¦(v:¬NÖÙClÜAïDù 1ô‡:h«ã•-Uú%«E_ë}.% ‚k»ÿﰦ酇¤®~]  áòëhºtÉJÜàõ©øòB!èW»Ÿ^òP˜.,È‚?H 7¤˜¾,]Ü›@“ÌÄ•4Ü9Ùäzü貉P»«¤"Õë‘ã" ð‚AL×±¼ÜN2²=€NʮŠ6—Û^_ÌðF¡hª—G>UÇ` !<܆‚Ž';цâuâV%,¡vÂ-®ÌTÒÒÒHKKÅê³iÃëtëUAR°†„b5"\vAÊOC6™.‰È(ŽôTÒ|i¤¥§¡Bˆ°[ ¸späz c #ÌbŠÚ_©ó#ŒÇ˜_Ÿüž\N7º¤àÑD}bè¿ù±èšXŸáo$“ŽŸgŽ&a6H—õ¶V}{Œ Æ<צ?\æˆ@C‚?ZE5)GÝ*UŠìÎØ1—±S¿"ɯ£úUÊß6†7GßZÄ‚ªå&ñÙ”§ùä×4£∠—ñ„Þ(¼;®3²A&iÇ|Æ?9‡†Ï~Äs·–G×|s IDATñ3ýøzõ¦c7ŒbñS‰´ÛÚ°EÄ—Ï4<|óüPÖÊ7ï´FÁâ'ûñúêãÌ}¨n±¢Æ` %\7ú’¥É5˜µp"uÌçyï‰î,ð )$ÄÐú(êx|* ªÈýà·I øýh*¾¨æôØ«®£D×$2e9ß'^ »×|$éH’Ž+3“Ûö¥s¯¡À·äBÂJ×ëÌ eÍÈ”¡e—î|½Ð'ªâõì\é:šÕŽ÷ìp"·îw%ü@JdK:6‰BêvîOÕ9S9”êE@ü‰ÊQ7ÆÃ¾?šÕG@õãvi.£H.~ž3–)s7í×ðx,ô®‘Ä «N>?”†LäÕÇoÇž×òøÕšßL„û,{Ïaݼ¾Ôœ!£KàMO¤„‡ê^åÍTÎ& z³>T‹1¡Pž·wfíV¿¨OB ý~ÂmFfö©'rþ_ÈüO¶‰LüTÝ^ƒ¶íÚrq_¢]iÀW'VrSÑ“Ù?'PhS .¶ì‰!)&É+òôº—ù¾¬øÔI·»bJìÆv«yå¡$]B1ˆX ‚!+)¯ü¶òMfn‹áã ‡hkàÇYò­Ûõ6ÁOœÅ(ãJÏ ŽEXËѲvóß[DB†t•ŒÓG9žîFºê´{å«Þ@âÁ}d¨€äâЦ5¤‹úôàÿ:2‚$Id%,cêÇgèÓ^áåÅ6f½×hQ3‚ š×EvN¡¥it¤šŒŸó"cžÍ=+¬˜ FB¢ë0òúDù\8\~@¢R“{è¶îžîó1Ñaø³MC<Âÿº–W.Y9^4 l›|2ÑC¯‘÷súù9<9â&¦=Ùƒ%Vp©1 :ÊøùÙ‘Ã[0«Ö““E®¬Un žñ}†=xÑåº2ilO,ÏÌàÁ¾+‰ ±‘!Gçó¯ÉÎ$;ÉϽƒúüÃ}§Ó‰ªfo³ÙÈÍÍeâĉ´jÕªÄ;YÂ# 3µÌXÂ#Éß'ãËÜÍc?dÍùhî~âlœp™¾{93ç,"ÁiàÆÎƒxìþ–„É,™8…suZpvåœfðBåŸxqÎ.xM”oòžºÊ)¶°Ð¸^Lð$ïå“·ßcÓÉlB*6çÑg†¢È %Õ3Gññ6ÍÅwÕ`ӫϲ%!™ ƒ{~3oÌEyQà/ëpÞ–™‹Ú–t‚è° 1tj0лwoZ·nÍwß}G:uðù|ùǧL™‚¦i4hÐà¿^F‰ßÞžJûiS‘ñƒ{ÜqÛÜ}a ƒÇ~N›Á#é^ÚÁÜ×&óši»GóÛ’y¬:λ¯¼O¼w z|BûWßfp\6»weã¼§÷³vkîo‹1û/?ò0Gê>ÆÈÑ È9yœ 7ŠÕÌÑ·Ÿfíè‰<Öc7Ï>ÿ4•,¦ý€'¹éð§Ü;éMn*k#JÔA@ øË¸ªo¬ðùb躨𼿠4`ÇŽtìØ‘U«VQ·n]t]çý÷ßçÌ™3,Z´³Ùü{«uÑÍ€Ÿ¸ŽÓÕ¹1ЄißVåÕ·#²ÌDÜÚ›^mnÀ ëô¹g'ÏoÞ…«Û­HÖHÚôNóÊ1pâYJEš7¯KUÜÐÈhœD þ€$‰ÔC_ñ“Ö–9/ ¤¦hØPYíÉÅÒz2ÓÜ 4§××kX~ÀA×#±˜LØ£b‰‹QD àß&†òE‘®S³fM¾ýö[FÅ„ øñÇÙ¾};K–,Áh4^Á_¨@Z5\l4K“‰oZ°žQýFqdì8B²í${—ÏaäίY–©Ò² ²¤£˜ÌÄTÈs¿¬2€§ºngÚ÷[!žÆúðH&À$È={€Ð¸æÄZ.J½àºíZ@¢ìåò³9Ò"‘ãÑDC !†. ‰à é 4`êÔ©<üðôoߞŋ_£ ¥¼]'åX2pQt¤q$M#<.èé/É)ÇR!o.Àéã™X+–%ÜIµ{òå¨[.¹ç¹K¶ítŸò/œäÔ‘ïÞïq”¦Ûè¡äk/,ÑÈÍJ&Wƒ(¹H¼Ô"+›¼OЪ¤(òÅè +Á_†üW>ü¢Ø¹é¦›X·n¯¿þ:f³ù„€‘Û‡ßEÊ—óÆÚ#$_8΢q³\mM÷6!€†¤8ñåS|¹?ó›^ç©•Fú>Ö†[Z¶å̇ãyéÛ½df§±oÍæýtð²ÀYã_òæçÈ )C…¹n/¦B“Ót]'ö†û©º„—Þ[KrV‡·ýÀ®ÓNdùòYh #›Ã0å\àDâ<>5(„DÄl@ þb¨°¨([¶l¾ÐÕ…Ž®CxÇwYýZV<Ó…æ7ÝÎGšðášù4³Ň)$š6÷eó¨V4°”Îï¯`Tuk>Ïgõc×Ë=iܸ%}_\ŽfAF&$" [ž½L¶…pä‹1´«W“F}¿äöÙ‹\|+ö0 2:–¸™òþ ôoÇpsã&ôžô ŠKXVC¾²„Ù 7ËY…û{Õæí~M©ÑpÇ/ê$@pɯüÒvââo_/²óŠËï\rüâ=¼Ž 2].ÕËÊõþŽ¥‚t¼ŽL2Ýÿâm.oÁ_Çß"|Âït-!åŪÓs*ëzN-¦a±Ñû«­ôxô>Þ.rL"þ–Á,Ú<ø²ÆvôòùçIe»òîÊ®—Ý»âíñÅí×D×¾“÷~¸³h'I›BiéñÖ"zäóÃo²ýá7 k1mS ¸üW®ëøçÙº=‘:-šcS /˜ïÔ&V²sÇu±\©Ó$IHhœÛº–#±­h_5Ðùùén¼Úh>«‡Ä³sÖF¤wgË+]¸¶) ? jÁ¤+ÙùDÕkìð} 9gؾõ7Ngä¢Ë6JW©MƒºÕ±›¥B½â¾ ‚¸eè*¨„ô‡]] ]ºÿê³2¥Kî{íï!ü?ó§X;\ç˜ûò8¾9 ’Dp~„Ÿï§ãéoÏ+„ [©úà;c˜¸Á—ß쵞ºy”´à²6ãï²å˜Bì„›•KžWÂõyJHÏø…Ñõfò'ßsàØIŽíÿ•E³_ãÓÛðîè ø´„–?Ö™îoÉØ»P¥Reù)•_¹ãçýÈÏ/汯Ï_Öªi{uwg¦¯;‰¤{X?½MëU§Råúôšð Yž§ÆþèP¿Uë4æ±wÖáP TRÐ:åaÁÐl‰y„¹Ÿ¾Ã ãÆ0îù‰ÌxcßÑ YÌîÒˆÞ¯¾G¯Æ•hõÜGLìД—Kyª#Œhq s/Hø`L›Å¤^­©]»>÷MXL†WBscâ½·2|ÜhÚ7®AÝÖýøú¨šw½›µ¯ô£qµŠTkÔ‰W×!Ïü$*ª@ Ä@ ¸ž–¡2dÈ&OžŒËåÊÿçv»Y¼x1uêÔaæÌ™X­Ö,ò.ã¾9€$©$ïþ“rsVî<ÊÏ“ÊòjÿAìòÃŽ‰]¶­.oÚÏÆÙ=Xöh?æŸÓÄ0œ@ Ä@ ¸Þ–!ƒÁÀ›o¾ÉŽ;;v,šœ³9kÖ,^zé%Ö¬YCXXX±CjRÞ4ˈַÓJÿ‰w6;€T¾Û°¦ÞNø©/ù|µJçðÓwk8Ù’ò® ü|Ì~¥ûOçžòA!á×u4ßE듆^xèZ1à?³Ž‰áLë¼õøÍ˜Ñ‘$õomBêÎ5|¿ù5ÚÕ!í§ïÈ¥ðœ‡4–­ßM|Óšäìý‰µ;Ï_ZbéúcEg§¦%])CRyÛ©«Ö»]o½‰ÛžšC2ÈõG]kPBI% bé>aw?Ëã7Òô»·[ýŠS’0”®A×n±ÑíÆr_©cl^µ’WWdÓööªœúå;6'Û¹)ú0ï­H•T bH ü/¬C²,3wî\xà&L˜ÀÎ;Y¶l!!!WpΓ†ºQ±=¼K.â–þ¢è÷ÖEI×A2Ñeü“ôþ,›;:66\r(½ßYuÖk|öæ+¨–R´èü 9-:Ñ®Š-ÿµG¾ÂÈɯ3eÜoÜþðã4hq;âCˆ®Ñ„ö¹ehùè;Œô¼ÂêíG¨ÝénfL<Åk3†±6º1½ß›Ì¯›"1enêÄ­UƒËþD¶ÆÒyexóù¼ô½LT|#êQøÅÑus•~¬ø¹:Îþ‚…oF3DQ¿óDF÷è@¹ÔêØ {i%¿húÜgô›<'o¤ußQŒÏþžÊVð¹}Ä™Ä]Îo™öŽ‹úCß`ô­•xa¯K—6ñ,}{Žˆ[™õÉhª œÏª2³xgáëlTmT¬ßAeD_X (Ôï*ʸgFë/¾2ƒô´Ô?ýé( +—/ãÁ>ýÿBqs…FøRå’×,¥ìXÅÜýïÝžCÑãÎó[øpÁî}´?,é|þÌxä®CHùþkj=ö,ÊZHÚú-óE0ü¶Ø fž:øf ¨Ì G-c±g¸S0oþÚ BÍéÚ…Ôu`þ'Ò­û}¨ª_üò®3F£‘eKÓ»ÿ@¶lü…*ÕjPªtéÿ×.IÞO³¨˜*±Îêqä;f—pnÑþŒÎ5ý*tÞÅ ®Å]V´­¹r7¨ð£/¦¹øvJeÛkó¬»'ëžk_äHÀ}ˆÑ]£éœy°jÑt\[‚¿' ?ÿ”»ºÝÃÁû0ÍTˆ¿v‘#ˤ&_`ÆôÙ~2·ûÅO7àÈûërÿu]I’HÛô=›U¡zõêT¯^ UoáÝ5G Û(èäž;ÌO;ŽçM-Š×qš v’¥˜(_§å¢ìT­]›8‹è8Îìç§]'ðÿE—Ð/ÿHh´+„Nóç&³uÃVRÝz‘žª$yXس)ƒ–;„©\ð·ï³]ìô uö’à©W:·Èm¯U:ïj^¯Ðï,1Ó\¿·×ÙZŠè>· ¯/py^]S‚/ÿÊa2ÍMRh>;ŒÒM2]ª4 :g6N·]6nçb`Ú‚6C'àóàÈq¢ê&¼*Èr°±ÉÍôѤßPB$ Nr33piHÈȲŽÇ‘OÓ0˜C³¡H ë*.‡—OER,„ÙÃ1+:ÞœlÜŠƒ7—Ü€{¨¯+_@G’M„†‡a1†qçØ—À|Ñ*¤áq:‚é—,a‘Á†PÕCzªÝ`&ÜŽIÊ&==´´Tr²(–0¬fƒEÁß]GÇ@˱óØ|q»_’b»w6m@ˆ¡klSÐЭqÔ®SB#û8÷ÅØ ŸrÒ à÷Óz$o?ß…Â Ðk¾,V¼>š7¾;EHt)Ê– #×d'ĒδÆÕ9ýQŸµ8Îãõ;PnM"šV3eôN&g’#—cÄ´—¹÷Æ8×½Ë o~G¦®ã÷ËÔ½oÓ5aíÓwódò tŽs’^öL–m:€b2PÊ2tºÞ(3½]c¼3Ž1µ­ÇÞ¯xfÜf ’‘Úýßbjk=ó_¼ñ,é'8Ÿî£ûÄxÀ¿€%çüœŸ?†?”¥÷˜gèÒ°¼CÁß•K-\…·‹±œ !†®Ü¦È&,g3èƒXdP*6ç¹§»ðÙ°é„N\ÍÊ[¢€žm~/¯Þu#òý|d2¯äƒ<óÑrîˆ÷²bjwžMj†„ŒÕAH~ŽÊØ"ìX@ÖH:æg袸»–™µo<ÅËüÀ/×bÆÄÅ´ÿèGú×T {C:fqן‰ ·â9ZžÇ£ªr€mGÐùƒU<^ÓŒ?'— da ³# À)^~ôY’üŠ¥Ccñ¦“ä !à;ENªæ·=ÎÌÛ«qò»)<3o½¿˜ÈÀw?dÙ£_° ‹)¿ç)JCÿ ÓP_x}zöíCŒYF¶W |ÎVÖžKãô€f,–tÀ•šDƒ]ÉHòžÉ}üg¤J7Ó¬š -î{ˆ {ö_>~O¡¸lj€¸›o£]µHeš·nAàÇÓ$<ªGXqgM¦ #I.¿‰*'²ˆèÄwîBU@<]››Õ¥¿Ý=ø ·Ô)ä0- õg~8S—4!Ôb¨ŽS:¡UjÓ¢QMlF…2µš`×דðã×@óºS±½K@ „ú§j!]C ­L«ví)kÉó!¿°¯¯:sO®¡Ã%nå'— ­@-¡(JÁêDŠC0|,2…׎ÖPµ«%DÅ^îv¾Ú?Eøùîsƒåâ4ÛPîž±Š}VóÕ¢¯x²Û­t{õK&v‹½¦÷• rþX_0̾/¶T$c„ Á¿Žq  =$J·åÎøãLŸ¾l¿Ž®º8wx/§]:J~|°Wkƒ|~7Ç2ƒ»Ž¯[ÂiÝ€.Ù©VN&q÷© œ9²½Ù>@2(¤lXÍ ™ 9Ù¶a r¥ ”ª}›™½ð0î€NÀ“M⑃d!ñS’|ÙœÙLÉHˆ)€#ÕQèAâ!‚ÿNË߃ÃáFË@ ’Ï3³g0nìºÿhÂb4b«ÊÐY3©­zÈqÑuÈjwÒ÷–¼8 ѱ(š«š‹Ë+ÓùÙQ|9²?÷n¬Nµ*ah.®<^ÂÊ©üðòc|–…C/È;a /Åó¯Ž`üô!Üói(Šd ¶j+ƾñ ª+‡'oЬ?‰å³_fÍÞLdc·¡ƒŸk‚AÒñädãõ«@%ƾ7•§Æv“DæÑ­lÚŸH¶G"ºJcÚßT“¤‘²ÿW™ÊS&y;ÎiTmÖ–æå=lZ³‘ÓÞPµjMR¡H@ÀÆ®IHsa+]››[7$Ê å[·ÿE[!²@ üs[8Qe*a 22’ð3žCß2ê©WXè,¶1cì³|{0ý²K{s0C&MbJŸO}^Iô¯Õ‹Ôp8ã[ìà¥W7“§]òÉÜÿ+ë·íçBj2»¿û€Ñ“ç‘” š'‘w‡ôâ‰7p81¯Ýxœc¿|Ì S9ä—È>´Ž±}æý ‰èZ.kÞ÷WC¯[ù5›$‘žt€yc0æ›d/y›ÁýóΚƒ$ì\ÎóO?ħ^fÕ¾Sü¶ò}ž˜ú%©n Ýï`Ùô‘¼±hR’Ø0oÅ‚»ì% Ãi(¶ÊÜ{gžX¼„þ·*r¸rÏѼlÊûÞG‹Þ‹9öxS\?/`sH{>xiÂdj£QeŸæE‰ˆ‰ÏÞ†QïBJ“˜h £JùÖ ì߇úqjX’™þë¯du®Kãa/ÑÌ|ƈ¶£¨3ú3²ï~ £AG+}7'"Òsœçû>ÄŽZ³XöhS§n¤ß‹9žÕ—ÏJìˆ`Â’—¸Áº£=#ú¼ÈæswЩœ¨uB A ¬åéýü|F܈ŒÐøø»C|ýaW–É‹¦ù‰íÕ™‹®B’œû•£Ú L®t¤6ÖíD=ó'„sÆ5ê!?Ö =x¸í‡,ýjµ‚Aï©õŒ3‰ovžG’5²ei8ÚX£¢¨P¥ `+]•Š‘YÄ— ~¦JU‰Ä4-ÇËÏVÜQ÷ŽŒ)²F½ó™€ýJÒ˜ÚíºSyÖ–| …TSÆöxlÌ»üzƉAñ‘élJ†OÑx”ªµô©4e@ES%*µn€@Š¥ŠÝχ†$AD¥²Då-jb Cõ{Ñ%£ßLà±)‹8éPQ$/„v'ÐU(S="e¬a„†T¤Y½²dƒ=œ“§*á:±ž_6¬ K­ï󟄵zkîtùÈœ+bH .C6]¶2•⣃Ûþs<áôùd3S;”-j<ð>±„cÒ=¸ów¸ñ !ô»0Òæ|úò"ö…ææ}À3xÿÅ™¤¶›Æá¯oÁDÏ>øšV\ØKî§ë ëÈ& 8c™¼{½Ã.Ñ`y!J¼‹­ƒ»V`àÌåŒEF–`7#½Kå·W³èÖ2³”–­ KF‹•œ,Ï%) N¤)¯VG/´£HUQL3¾aè°•<¸~Cê˜áøóÔèšžwÞ¥é½äFzPñ)–Hj´|˜%«^äÒ9lbaÞ?¡©Y þÑF -P°aŒ£c«j|3i+¥¸9µ}-kø éše:Ó½üæ,8@âç°Ëñ½¹ft ¶nî*u~ID–xTˆ‰¯„ HÙ´”u¿œ¡ ʬN ’"oW€€ùfµÎebŸéìIõ¢y3Ùýý"~¾ !_Ãù†ý‡Ò|ßû¼¾KÅb³¹U3e«”`óGK9êF’$j7lÃùæñõ¶³øU‰G’æñ!ËöŠÏU=x¥PÊW2ÙÌ›º·¬ä]s *[óVë>jd~ô¶íSq&å§uëIòŸ!!†à øÜ.|y¡Úƒÿ5Ò°ÿdÞêiãÅî ©Tµ.]F½Ïi§Ðð¹Ýø*Pž§>Ÿ…<»5ê4cüárÔÂ; òôêßm/.OÞ £!–¾ýÛ‘ãqãô€X|3/v¦NÃæ<úþnìÕË¢4@ÃëöäˆESq»½lzp{üx1pß;ßð\ÕM<Ô¬2j6ç±w7£^A©j^.o^áY2uLöŸpàõûfÌ|¥# ï¨F¦·òÕ «IFJµ|—kÄǃÚR­zmîÿg½ ªÇ…G-1~· O@G¨x¼¾|y£|¸Ý¹øJÝÏ̱ñŒ­Wz-r¦vMÌ7 àóâöò ÏëÆ¸øÖ¼ªÀÕˆI³&áøb0 kT¡^»~,Ü•‰buîÏà_tQð× ‚.þïAKˆ(]BÀÅË//iØAD ¾Rž pXBÀÃkÉ»¢ç]’ç×X†%Ý—kN“Ž®_ù9ÁûNÑ*¨o;*tÒ¥Á/ß.iöü?¿Nþ/‚. Ÿ!@ðìæ]â…Q8Àê5].•Ø:¨ä<—®´Íµ°‹žwIž—P†þÌ},ûv7^£’\“C©wSêWŠzúóüÿ¦¬¯ô>EIW=I*©Î_¥Eü“Ãd@ þÕË@ þ¯Ñucd=zô«WÒ "B³àŠË@ þ¯‘®>ž%2I Ä@ C@ B @ 1$EÑõK6õ"Ç 6õ¢Ç‹²+Z\:úß4]!†à/7WúH IèZ.û~ZKB¦VÔ!W’¤l¶­Xŧ$.^1_õ’·§P¹´ŒJ¼N’$/‡Ö.gWr `m²kI×KLI’äçäÎMl;ãõFˆ!@ ø#Ièš“•Ï÷¥Oß¾ôîݛ޽ûðÌ+ß‘+•¤NMå‹ Ï°ú”ZÌÁ³¼ùè0–%‹¬½òÇ_"eý'<õÚOøò¶} ?ðä §øú¨ûÊ‹¨^v;¬£™9çkRÝÚU®s°tÌ#|¸_½$= ßÎfÊÒC%?;ï¼-ÓçµUÉ¿+WÇÍú9¯ðÖæs¢~1$^öÿ² CÍ{ôÈ@ @;êaºBsh²X1ÈÅ} ˜­VŒ¢Å¼*΄¬Øp ð%mah¿gqµ¼Ÿ;ªXŠ9[¿‚OBÍ9ÏÖGЮšñF« ³|y™æÛÉG…Yü3Oÿ´” ‡…N+!azÉiÖ/;fÆd1c6ˆŠ#Ä@ üUC©Ö°-·´mGûöíhV¿<Æ@«ßxœ›jÆS±jmzŒŸÏéœË¿n®S+tsuâ*ÜÈ€«ÈÄ@ǵ !Ë2î̽<ÿð`|÷¼Â̇›cUœøå}º5®A|¹Š´èñ,›S%$ÉÃü.µh:~6OÞÕø 5¹ï•õ¸ýé|>f(kW̦EõŠÔnù'3˜Þ¯ ÕªV¢RÕF ž±’t­ð£%ÀÃ//u£Z‹Qü´ã'f}¾”ózR¥j º=:G –AI–)l’$ oÒ¦õmCµ*•¨\µ1C_[E†.!I)LmC§q¯p«ZT¬Ü˜'Z•¼ ¼;¤#+Tæ¦îÃùñ„KÄ9bH þÂϲßÁ¾_¾æ«¯²`áB¶žu±÷Óyõp5æoOäôá5Üœ´ˆWWí/t‘$ñúCƒ¹p×Ç$žÞLou›œ`ß´«£1emà¹û{s®ÃëÌ~êV,¨Y;™òä[ÜøÜrŽžØÁÓÕ61bÈëd`Áf!eC"—ýFâÑð|òŸ%GóÈÑ©Û0vœ<Í¡ÍS)‡Î£?æPÂ)¶}BÌÎ×ù䇤™êMaÕKC™t +7Îä–&·0²onµ„ GYö^?ÂukóeÖÑÍqÜýÌ'>qŠc[?$â××™·æ< `0)äf–æƒM‡9½þ6Žyœõ^øåµñÌÉêÄÚƒGY6öf’ŽîÀ­‹ŠówG,Ç!þ¹bHó‘qþÇÛÐu™Zɜٻ—ô„ãL~tš™÷pÈ–ÀkÝå[¸°‚ʼnõ˜9º5V Ú?=œúï=N@LºzžKHÿõç\ôטмý®£K9Öñ÷ÔÄ Üý̳̿k&;2‡£ûTy`7(€µmÊ:ÙzÊC/K.~Ÿ‡l‡FT¸Œ)"Ï/_1üµíäøuRN;itöP=àfÕkOàhÔ9³‡PMàñùøE¬G׸\,–ÈpÜ?/äñ;pª:N;iv.¨Žl°Òèîû±TîD+û›ì=~šì½Ùôyª5ÂŒÐìNîhý9;uMT !†à¯A3Ess÷áŒë‡ÐQ|g™š)Ñuø³<Ö²rþy²%E?ñ®,|ÆHb/¶†8¢ >i×`O ¸ñWƲ7é9ä*}¹„þM¢ÑÜYH¦¬ËF‰ TQñz ËXB•‚“¬£jzQÑ¢8¼æ=Æ~”ÀÈ iZÁÆÏ?É6¯7¯Ø$МΠa–‚ÓϤÿêE8øý,ÆÍ;ͨ&Ò¤œ•õ>É.Ÿ/¯žÈ­ƒ+Š¢£ú}x5#UB/î7jCÕâo&ÿ`3ÅE_EQÀAÕ²alø-›=Š˜˜h"ÂB±Y ùßM]Ê7£ºœÀÖ3y;Ïlãˆ1Úq "tM¢bûI|:ùFf<6’5 ¹X*·Â–µŸýIAóZÖÑuœ ñ¥Ì;™]’$4MÓA×8âÕÛÜAÇ&Õˆ‹´uüI >T±Ðå©·éæ_DÿW¾Ç©?qŠ,ðùŠ<¡dè@€€êç܉#Ôl{'·6®F\¤™¬„“xKúlê Ùb¨m`ûÑŒà>O §’ÏàÞf{„eH ücñ»Ýøóƶ‚ —Û¹§_ÖŽ˜ÉÐq»hFê‰Dbî}’Íu|7ªêÓ-¼0¬ ãÆ¼€õþú¤mZE¦ßƒ*LCW×Bª—GEê=ð2o]ʰ¾Ã™ôöx´]Ĭ§Gs aÛ¿]ÍM?¢¾`Û[-P(~ oBÊÄ—ýï¿÷5*4¢Yƒ›É|ss¿P wìañ¯.j7ÒòÊÚ…ÛR…a³g‘|ß z>ŸÃœI÷Q­ñ HÓæ3cöIªWmAçŽu1I—+ÕåàÀšÙ¼¬ÆP5$ÅH©J7‘¹|9ó¾ð𽛝uQ¯¹–_·|‹×køÜ.ž:9mhݺéñõzEûÔÛK Z=œaýzÒ©] jdýú=ôz´ïÜŽVÓ0ñ“sh?ºÕõ¡SZqÂ)'Ð4”?ÃN½ŒóŽoMjã–tîÔš&©~À¢vÓÖtn×’Ùuhß¶¸þ„lz D—úq””Gˆ¯ÛÓÎBç–ÍÉÎH¡v³¶thׂº)Ù <ºÉáéMšS·e[º6M$bÔJo@ÓÆ»h¶2HiÜšV­ê‘R+•ôôtÒ32è8`(G¶ˆ§¸ƒiLåØ>ZU.7,uèG£;~¦U¯Á´úõOÓfÐ ;–]zNÖ!úý¤Ð¡ï tøýC&ú¥Ñ®^ÊL‹?ø=HâcŽ«šŸrJç?£e½ÙIŸ!!Ä?ÏNªƒÐo>½‹³Éß:hÊí·Ëü×·1ù£+·j.c§åcü‰Å]sùTû}í2çí«hS·!9͚ѬY3šå4&«ý9LÙPú§W¯šÓüÛë—¬7û7©Bñ§ ݇?ÎÒáïúu-c#̤fH!Ä?Þå B†„B!$ !„BHB!„0$„B!aH!þyvºc¹Þé z?¿ŸBHBˆ?\”¡¸°ÛÓDoz}I…ŠÙº½ünœZT4‘’BŠB^lì/ÎéFŸ§×`šYc/ ÷-ŸâíÎÝÌcŸÿôŒôxbÍnŒ£³#4(7LIá6 (غâÒ \¥kN³®ù!„„!!Ä›eþúÁ<´þÎ<„–l‹~g,y̾ë(ZŸùá]g¨Êä *ß^Ø›£ÇÄþnqÈerÏ1Y€ÂòÇðí"Jý6_0¿ù»oÔÕ'È0 ´–·¸’᧜ʙ#F0âŒs¸èÊÛø`æ\ªMsÕøF,U¯ÒüÁ¯ír9ìrQH­–;¶i)!ľ`Ÿ|ò Ï<ó ~¿Ÿp¸ftñûýƒAzöìÉ•W^I0Üù HlÜ‘c{$2qú NíØ+nBsxö[—KŸ=„ÈÞ|ô¾\¼…¤–GsùõçÓ6ÑaÖ¿ïåÛ¦GRgê+|·¶”‚ŸÃnº”Óÿ[›#ÎE×-³˜Õ¨š'씾6òüƒÏrâåœÞ%ƒùï=Îó_,¤0GÇ.aÌÝøÕ­É Ø4ýM{ùs6yÉô>u4nŸhÒ†æû{Fòðì<ùÜ[t­ŸŠå–“»f%åñA|”óù7òsçÁ„>MÝϡϚ¯ðz‚ÓläÙkž¢ÅmÑbÖ+L(«Cý¥_ðåÊ Z}c†FÀÍåíGž¡´^c–ÿð_Š;sÉÍ×Ñ#+š®–L|„§ÞŸCiR3N¹âNn—*# !5CBˆ}­W¯^˜¦Éá‡Λo¾Éøñã?~<&Là²Ë.cöìÙ :ô×A¨²®ÃÊ`ðÀCXúî×l‰µ‰|ÿ5óåÂΊ7¯:Káò®§rÉÙS€ŸÍs¿åÙ+îAtÏ<÷ç¶K§îÐ;xñÙ‡9û˜6äMý˜/–•E“ 0±(å•«Ïà[·ýÛf£q(Þêã˜ó®å†QG²î©3ýv>;ßߺð¿O2üö/i}Êå\{N_~xü^œ¹Ã0б_ 2•±¯¯bð½÷Яy’âƒÄ'§Ó¼S:µlDXúÕ;¼øä§ô¼æIî;¥)ó?ÿˆÅ•¿RÌÌO?geJ™ÇK—ßÌÚîá©{/¢hâ]Ü?éL¯„i¯<ÃÄùšQ÷ÿ›Ë»¬`Ìy7²øåÅ39õ™Í }£¸oÄÅ|]DÕ4 !aH!ö‘ŒŒ þóŸÿ0a¦L™Bvv6ÙÙÙ,[¶Œ .¸€Y³fѼyó]6©U¦ëqm ?ãÕ%a ˜/'Ï£Åi'R/ï=^ù±>—\u:-6ã¨Ëï¡kÑÇ|½.‚éEH9é>.êÙ€´ÔlRã,|Ié$§¤45ï'eXXj3¯]8WÕHž½ï4²ãÁ0é{Ñeôo׈FOâÖ›eé{¢úhÆ…Lxÿ:_8ša‡6'§Ë‘\pD]ÞŸ´bGØ<Ÿ_TCiá>_ÿ<]6";3“ž—?C!†å£ý©7sdë:¤§&aîÔÉ0ÌhtsÃXý®å†AMImÔƒËNl˧ãg2 ÌŒæœ8ô4Zd¦rÈ™÷qŒžÊ÷“¦r׋ë8ë±Û8²u#:t£›þÌØÏò++¶„8èI3™bŸÑZ“œœÌÿû_Ž;î8rssiÒ¤ >ú(3gΤ~ýú¿s7ïXÍJR/.îà’§§pÝ#ÙLÿ9Âiç¶%¼îVnZÁS×^HPy€Eb×ch°Ùâ™ÔoŸ½{g„ Û>¹•kóåýUçRÐèÈF^¹ùJ&,õH­•¥Ë1|í°«']ÊöŠ\~zõ.ý(>ú}–I‡#RPÕëâ’ ¨ JíØóç1åçÓYøÙýÜ;ÅÍ­Ÿ:Ík飼тµ#)Ï n›lb±ŠÚ 3°7n¢Lu!.9‘´¬äØ+‰d× Pðó\ru9›¸Œ…†FiÔêB¯TOVP!$ !ö5Ã0ÐZ“˜˜ÈG}Ä%—\ÂÛo¿Í«¯¾J£F~'Å>¯Ã`१ô/ž;þ$6×êH—Ɖø­êdmçö7ß sOExOíÔ¥XƒaY»ü eGH;æ.®÷}Àí#âÅ—n EÌÊ®@±`Q7ËÏúé?Rªì|A¾Vè`}†Þ6žQ'sÙu/±Õ3) ŸSD™Ø?rõõSð%øv Y =®;So¹„¿Šââ¿ö:uéËèf‘”¬>h­Éèu“¾ºýíý ;ª?GŸzËêŸÏË÷Œ"M|ZIÑdàÃoÒmÞ¥4mÑ“ñI'qr£4|&xa—–—]KƒFÒ¶ÏH6÷¾‘‡‡¶CiHlÚ†õò9§_WÎ}ÓäöׯÑ%Ýnÿœ ÅóаîtèykÛC–eñÙ'qÆYçJÉ„^e' =×u¤0ö1¿ßÏGï¿ÇˆsÏgÆ´)ä4oIììtntì ðû£ßmÞ©Ös¹*týÆ{k\Y¾»—™+M´ê©òû]~¬f æ÷º*WÿéÊiÞõþ×eæØQÜÎw·¨ñŠZʘFÑcÜdNoRs:vo…Ø?Mxs<ÇŸ4„Ÿ—,"àÒ°qãÝ9¦IAÞyø‘âq¯¼:4öç2 $öoP.}†„ûý9ÛÎÇëß=€»ù>vÊ>» Lc·¾¿æk»?4Í^¸‚ÒŠ0ŠªöµGEI1啽‰öt…8xIBˆ†Å¡W?Ë×:ø«xeÆ·fì×ßáK’æ/!$ !Ä?–?!™Ô]½bøHJM“"âOS!~KšC„è)ÀßМ+5CBüÓƒÏäëùyø¤ãºâcú Ùû~€P CBüÃY¦ÁªMeØ–T !,>r<%aH±wh¹#§â@ó7µðKâ Bz:<ˆÏB=…a™;`Ý!»nô5kç×Ä~qÀô\¦‰eÊòù'QÓ”0$ÄA†ÆãƒÆ±=œj3nš&A¿¹‹“M †®ÝêR¾r3ËKk˜èªýÏ¢pÞFV€%ãóüöÁËóˆ(ƒx´YV+EØÑøü&~sÏÊM+…íßoþÎÕ>ϳèÔ³ «r™±]ÕX>Êõ°1‰óýþo»¶‹]#›ÄÌß*ÛV˜~Ÿ¬ûôDNÂb¯íP®š! ø0¤GÖR( 4š­›·0îÛÂÖÎ9 ˜Ô­—LѺÍ,ÕzÇÁWk\mÒ¤q þ…ëq•‰iJÕÃ.ƒÒd´nÈÈ!ÿv˜É5ýÓ™;ißä{{ˆ’³Ò8±eÏgçQèüvÒW ²ë§P+w#ž§1­Ê`:5æXs;Ï/(û‘È5žkÐùØŽœ’It]1 ܲ­<91—âÊšÂ>cúâ8yp=ÖÏZËÂä¡}µ%ÿ=gr†„8Hv(J©ƒjž âLÅü¹k˜¼ÁÅ0Àu]Âf´æÂDã:а«ÁÒ±c«B+2!°˜@$¶7ˆ IDATZ†ÑP©8ÈŠr÷×3½ýAB Z™œ•ƈ¾ü<}5ßä¹ø,“` Z“âya;Tý ¿R(ËÄo‚ãx„]ð}$ÆY$-"†¢"¢ðù-±¶JÇñ°]R¥‰.7­Á4IðAED Z$Z‰AJy„ì_7¼h~¿EþÊÕ¼¾8‚e(åQjFÖé3‰ó™ 5¶ãa{À"1.:}‰¶"òP¦IܯæOü¥€ù·ÔjKâ ¨:øšÉ*ƒKqIˆ †¦eLLd@÷lZ¥Fï¯ËËø|Ö~ GËHkð[Á4-š¶ªÏ±­P. ‡Y3×óýžÇ·epx?†ýd§Å_²W§n§I³ êÕ68¦WpE1Í.£Ë¡õidbøLÂ…E|:s ÜÊP£ÑþxúÞˆÎFïüTJëìDR‚>NMvÙš¿•/æcïTÕ£t´oJ¨<Ìú‚0> Ë"h‚•œÄñ}êÒ4 *ò¶ñîÌmd´©KË”Ù]ÓÞ)ãýoóIiÓ€Á-ã«æoÆŒõÌØâbÈ…œáDîï!aHˆƒ%|qeù9´kSê·ŽÎûê…ëØ’]›%[y~òvŠ•E>Mé×8޵KèwJá {x3–òö*›ÚÍqM+PJ¡•‰–ƒÛ®Ïâ•F+…—šÉˆ°dÚ*¾YAàKæÈö‰Ì¼’éù Z5aDÏl–ånÀ¶=´æÛï×Q`&qÉð¦ôLÎgÒÂ-tÒq¼ûýF lƒ`œÅ3Öðy©öÐ;‡C±q™‹¬`Çõk@Ö¶-ƒŠB3¤Q-ƒy?•Räj´SÁ¢—µý˜yÓˆ®?>KL­EB¸”¥NtþÖmc{»lê$l)IC~ß%aHñ—€ëyØž{͸‰çylÙRÈÂ5†a |A:û=¾ýl׆v¼×4âPh<ÏÅöZ+¶‹‰‹‹«Ás]×”Ûo¸¸ ÌÒ<ûÂâÊ!9[¶‚OW–ã¸ÑfKÇq± Ÿë¡u´ßOçzØ®‹¡ <@{.ާPZḶ›Ôc`›qoÏcu©¢c÷VbhÇÅUšÂ‚™™ $Y……Z8žBãá¸Þo.7Ï1ð´¦x[óW‡ñù 0@ù|(­«¦M+WGk¿"®‡§5®ëEû.y5çO;*öºíÊ*óg¹SR‘Ê^!г+}>¢eêõ®Íšm6]ÛgÐ8Ù"à3IMK a¢­ŠõòŠ‹Xi'Ð¥žHØ£VýtúÀC¤e¹û`šD 6ñìWù´ëÑ”AMâmÝNI0™¶uü Mê5Í"Ó-'·Ì«ª¨ºê1ÖyËõ¦ÏÂBã)M\¼Ÿ‚¼R6”8˜qñ´ÉIÀT*öÍÏ ÖòÕ¶xÎéW‡ú~…ã)‚A C)<õ{Ó^¹²ÄꉴFÛÖ+º¶H&ÙR3ý¬ÈDçÕ0 Xà)o/¤<>™ÖYÑùk“I†SΦ2OÖ‹¿òPêoiâ—š!!Š0t°5íDg8ða™Ñ¾,¦i`hÅ rÉîݳoƒã* <Ìü…-y€ŸaàsÊøpr>gõnÍ5#”„ÀÆ"@¬_Œ)çù»¢”Ž]Mfë7ñü4“Ñ[“þÃ*>ÿ©”“´¦›AËaÒÔl´ Z|Ä› T4ø‚>‚†¦´°‚ *›³oKYÙ6&Î*Àî×€KOH§ÜñHÒŦVÐ$—ÓWcõmÉ¥'yíãÕ¬\SÈö£ësÍÐ,6lÊãýÛ°M³Æº¢5Xƒ8kG'pC»Ìù1—ÆrùÐ,\ä|sl¶Ñ®ÉÊM.Ç jKÏŠbƼ‘ϦpòÀÖôp hÚ|7%—MŽiJÓê_ÙwÉ¥õBˆ¿Î8X;P;|2a.¸nôª±ØNU”óíäLóGG“ÖZ‰xh ß]€²†[×näÙMÑKë]GÁŒ_ð">Ѽg]Ë[°šklÀD“·f#÷oÚŒéy„ÜržZeá3@yŠ ÛÃï7øáùÌñÜè08|9a.¦£ð«r>úêgâ|&†V”…=Þü¬Œ€½rÌõÚÒ|öæOŽ"Ÿ¦/eyÐ$6ðB[yvb!3:Âx¤ê[m²-Í̉?ñ“çFƒKµ×âbÞý¬Œx¿‰¡5Ç%zßP¹3–±ô' E™§Ø²`-O.‹ÎŸç©è F CÖ—¿°eÐE!ÄÞ;»Ò(}ðxÙ5*‹*¹Ž¢lƒø…ª¿…<ªzÙ;­Š]òE©S³Ì+*vÜu¼¼bç;kì°]½xk,7;¢°#Õ¾?lþƒe­]—wçåhàóY$%øk¬ Šò°‡Ú1 ;/_ÇV8ö®jÂ¥N;x»š?Y]þʾëïéÍ#aHˆƒb‡"pq3 ³~Nϫ (A¯Œw'岮ܓ2ÚOOä$ !öÎ-ç§â ?#ذf=­Ô¿JI~ß®n¹!ör£V!ÄÞ<HÍ8è†IÀ÷ÛÛˆØ÷]JÂb/¡ø€†%…!„8 xÚ÷·ÜWÂÿp!Ûã†Ó:P+-S CqÀyç­Ÿ÷ùoÈ ‹BüÃ@("C…¦¿£µ„!!„BÔ$ !„BÂB!„„!!„B CB!„†„B!$ !„BHB!„0$„B!aH!„BÂB!„„!!„B CB!„†„B!$ !„BHB!„0$„B!aH!„BÂB!„„!!„B CB!„†„B!$ !„BHB!„0$„B!aH!„BÂB!„„!!„B CB!„†„B!$ !„BHB!„0$„B!aH!„BÂB!„„!!„B CB!„†„B!$ !„BHB!„0$„B!aH!„BÂB!„„!!„B CB!„†„B!$ !„BHB!„0$„B!aH!„BÂB!„„!!„B CB!„0$„B!aH!„b?e†„žFø¥ „h2@kÀ@£÷Éoø¤˜…øg2M´Æïóóù'aùdsB`A(/+ÃSÓ4£ÁHÂbw(¥©™ÉŠåËhÞ²m;t”BBpAHkRŠ¢âB”§ˆON0$„Ø=žçÒ¡SgΛGqQ!À>«^Bˆ}ˆ LÓÄq]´RdÔ®-aH±{´Öƒq´ïÔ‰Âí…xž'…"„8÷f†Ar­ÒÓÓ1 ­õ^o.“0$Ä?ñl*¶ÃˆO ¾~‚ˆâs¢·/ú ÉÕdBüƒ‘BÈ~MÂB!„„!!Äÿ–Özþ~ LÿÞþŒ2=з•uùKŸ!!þÁ;PZÇ,ûLƒ¦aþf§ÇÊÁÔþ—Ó¸»Ó¿§ö÷y; Öe¢›¦µËõ¨òoZ©64D×5Ã0ÈmeŸ/ÓÀü²‘0$„ø]¥ee,^´ ë7 µú[w^¦až–N‡NȪSç7ÛÖ‚.X@AAûK7§ÊéÏHÏ C§NdfeíñXkMii)‹.`ãÆrfÿg‚@|\<­Z·¦yË–X–µËà…øyÉÖ¬YëyÔ<¤ÔªE»öí©ß°atÀÔ]¬OÅÅÅ,Z°€M›7¨rù'Ä'кMrš7ßåò—0$„øMžç±bÙ2j×Îä¸NúŸLÃê•+X´pñññ$תõ«×ËËÊX¾|]»u#§y‹ý® W­XÆâE‹‰#¹VÊ}Öu]–/[Fv½zÒY!ÿ‚’â"¾ùú+|>‹f-Zđ՚J±rÅ 0 .¸èÌ}tÀÜ—6oÚÈÓ¦Gí]„oǶY¾l)MršrÒÐÿ;¨–Qáv¾ûæk|~Msr~µü÷é3$Ä?”ò<¶lÙBÃz¡µþ[*Ö\‘Ó¢%©iénßå4–––P«V 9Í[ÔøÜÿúQ9ÍZ¶¦VJ-Š ‹þTݾmݺ÷دæí@zT–Y­”Tq$+V,G©]Ԉ˖-eàGbZÖUÖ•ÓZ·^ZµiæM¹»\ŸlÇ¡¢¢‚N»4ëSå<¦¦¥sxÿ¬^¹r×Ë_j†„t@þ_¨<«5ŸÏ‡ëº»lJרöÞ_†¨>ý–åÃõÜ=ÿ­ñ”·ËyÛù”fµ夵&1)‰HÄÞe¹€mÛ˜æ¾ëSòwÌc0‡ã8Ñ&°ç!ö·måï*›¤Ä$"¶½Ïš% ‰ýBÕ,vgbÆ!rtô–Ñíª”úŸÌ’eY»}ÿÕ4î­éßy3 Û¶Y²t!k×®Ý"EWþG $-5•Úµ³hÒ¨)Á`°ê/; }À®G»{àßÝ[æ¨óø×vûv0$ö› ¤µ¦¤¸˜¼¼-¸®‹q%"r>))™:Ùu‚{ýÌo?“ü§Ÿé±+…V¯YIzZ]é 9Z£Ñh žë WPTTÄÜùs¨‘E½zõINJ>àjÙuëíÃQl'+OÃÂ2åáéèÞËðùˆþÉÛãŠèüùïqùS¸å©±tÈØõåÀÔ¼¡cï‹>ÀôY¿º²C+ïO…-ô0?ÿy­Ù+}*Ë¿zçP×q÷â‹¿ 9Ží0èèA”•V0 ï@lÇá‡SÐÐNÛ…Qu੪]—¿kŒ­ÁòY€çFןêÏ-ŸbÎC#¹¼ð4¦?p¨¿ö[{RÖ;ÊGá¹:v,5°¬BÆöíÈ»'}Ím¡Køy-ÏÞp"ñ»=q&–•Ç}=%ÿ¾ev5Ù |½•e)¦ß:Œ«­«˜}WæŸÞ·üÙ²ùÓÁOŽÂb9sÞ’·9„Þ«nILN¢¼¬|/´¢;’’¥ŸÓ¯Ùá|º´,:†‡Ï"ÿÝ1$7ÅWW{E›tŒØ1µZÇͪ¿G1•¡¨¨Wïøûž¸~µ3õ¬~a4™†?À’}èY|²t{là=£ÆôT>'6=Õ§ ­É›ý:ýžÅÜ­Õû¤íjþ¨ñ;‡É½y« Fh.¼ð"Î:ë,FŒÁgžÁð3†sÖÙ#Ȫ‰V®ëÒ¨a#“SÙ¼z ^y!:V‹¡œM\›e`>ü~?~.'?E±Ï÷«eU}NŒþnFµ÷Ró³T_þÆNå>ŸbÚÍ'sùG>ŸO3íæãɹüc Ÿ dvîÏž ª& æï5îÕ~wDz޳eQ9­nè.ÎÉäŽò1ªj‚4Ï17=ÎÇÖ£Ó‰·pÑññW¡æQWþ¾±S¹)Ê·m¥Ô‰F«ÏǯÞ_mÚ«ÇÎó¾çë“&ÊKtõ>?€øÚ¹áY„¼šûÖß-ë¶ÙÊ¿™¦²+(*©@Åæ±jýØÅþ :—u=Š¡Ý²Ñ(Ö|ø]O¾…Ü ªÊsw¶¿¿R6R3$x•—Lªƒ¼½ÅÀØ'$j­1L‹ø„8¬ê;&_€Ä¯rßFÙ–e|?y6ù!“†§o·ž‡i¹¬œþ53–nÂö§Ñ®ï`š™–O±yá$ÞX·_Ö xuâö¼ÙLkÆÀÀƒnw°ö›«H,_Ï3£‡qÞ½_°ñÕ£™óõêõ;–œDPö&&½„6Ç "òç,ËlOêêi,Ê7hÙçúµLdå´ïÈËû…Þx‘¹µÛpÊÙý æ¯àûÉ3È-u©Ý¬;ýût$Õ_ÁÂ?fsÃvTÌŸJïcÿôŒŒ}H«ú )Å¢E‹¢µ±y×ZQY [·ò¯'ÆÒ0§5í|å”|&¡H]jxäöGF—WfW=<™[NÈDy_0‘dOaY+§Í´Å[0ÒsøQýÉI¶(Ë_Ë+·`ogÉÚ|2Z÷$ÍWAª»•Ÿ–ç‘ÒüPŽîÕåßÅÜ 4>d }iˆEáÏS™4w5…P»Å¡3 þíëX¸j=á¢ï7®€ÔZuÈ]»‰ð¶o7.ŸÚºsXÓŽtg µ¦"o5?®ÞFŠ»E«·¬×‘Aý»“40¼mÌøòKå´9¼,ZHÆQCi—­ÅÜ“ãbe $$°ŒXŸ¬Ê!üüd4ÉfÉ̉|W‡nýÒ°­›Mæû¹¿Rê´<Œ£ú¶$Þ€m+f2iÆb ?uÛõaðañ€&R¸–ÉïÍaUE Ý:ŽÎu,0L¶.Îw3—RB"­z ä°VYèÈ6~œ2 Rk±né2 éwô‘4­¥ñ”ÞãÚ<­2EµÎŒ§ušæç÷àÄ›æ¤þ¯Ñ£n^y3'OfE~9Iõ:2àˆžÔ‰S”®ù‰I³—°¥Ä£V½v9¨i>(Í]ÎOJH.ßÌ¢ Û¡Ô&pX5ý#¾ÚPHJÓ. êÓ‰Z>0±xò—ü¸z+VZs?ær’=j5íHw#/RƲ9³Ø¾Qñök/U»#ÃNï 1iÊä… ^›^ôëÞŠD«ŒyŸ~FQÃÖ”ÿ<‡Ín=Ž9žNY&ne­›Ô ‰ƒ§vˆ]ž=íú&–eUµÿïÞçvã{©üÞèÃÔÔxnYѪé½ó{»8SÜ'Íѳ/­5Ê œ’‚ÏçÃÄ 5)¾*…óq÷ùgóôg ظj*wŸw O|ºÃg±ôùó8鼇˜¹z3ëæÇG3ó0ýó?ãÉ×?eÅ/Ëxó®‘Üùò*0wÔxífˆ®êH¬0âÒišJZýfÔOOÁ2 txŽÍwftXþŠyÜqÉ Ì³aÚC£8ñÿ®àë.jÃW\zÖÌ*ÕX5š§œ­ËxèªËxéë…lÎ]Á›÷âž×fàQÁ„QÃ9õÂ{™»Õ­Ù¤µ×ÊÇ£jA±ëÉbµ Ñš„è4×É̤GïÃI]ÿ ›Î¤Ù1¨íÛJ鲩èX%—¶d6hFíŒL²²²HO‰Ç²LV¿v%ƒÏ|€™¿ldÚË7sâÈgÈÓ…Ë¿ãŠcãÞájüÅßpÕc¹nÜ7¬Z=—§®>³Î¾…—¿žÇšŸ0æÜKùl¹eh–O|ƒI‹×“¿qÏ>…‹_[G hîfkγii–½q7ç?; ͶŸ¿aô 'óè×+ð¼r¾zêj™0ÏÒ|ç0ιc"ëòVóÖ-#9ñÔóø8ÏÀ0wÔ„ì~¨Þñv®º,ݰ ò'?ÍÉC®â£…ëXüÕ3 ~=ó Â>dôù7òýª| 6,fò—3(5 JfãÔ¡£xkæj¶¬_Ê·ÓPÖh'Ìäïå³ùk˜óúµœ|æ#l0,Êf½ÈÜÍ·?o wÉ×\wáå|¼ªU¾’û‡À˜ç¿¡DÁÊnâ²Û'Phú¢«õž5ÆÊDûkQ¯Q©éuhÞ´>iI–a ìBÞ¾}$÷¾>•Ü-ëùæÙËu×DJ0Y÷Ù;|þã*ò7¯bâ}—rÎã³1|š¼yŸpÉàyè«(­QX”|ÿ ¼=M›–óÒ-#¹ã?³p|&?=qÜý«óò˜ûÎÍ ;{,›ð±ô…9oÜL«Ú"‹]-Þ0“›.»š Ó–³eý"ž½eO~¶mòêÈÓ9ûÆX¶Ø>õAN?g, “½·JÍ8`êDjžAƒÏg ×U±êuË4¢—Êå®>Gà{p.·ôÙ{íö–UÄÇ·ŸÏyÿú’Œv—3}æCL=ûn©û":=Șoç¯$ƒ½?†Ot'Ç>é+h€é#1÷s4O$ ‘:RNEöµ¬™ýߨ=x퉇i[Ëãˆæqåko3²o?.¿æú´žg&cÛ"ÊGÙϳ¨¶çÊknåø¶),?4Ñã¿dËy}igìáôÅb€?‘„Ÿ®$1éfPŠ”Ž'óÚøñ³˜`B<¾Êã¯a— r–ß µë¥Ü|ÙqÀÏïÉ‹ \x4M¾ó1ä¬ é”a°ø“»™À¸n¦®›g¼Â½Ëº3o"Í^Í×õD»î>(ÿXy«Ê ê5íÚµ.óèMäjlZ³Ów ZvÃþj>ë¶%Ѥàª÷úK6rËàtî¦S^þ…—‡mà¶;>¤ÓØŸx~h=ØÖ›mÎçÁys«ß@×íË•WŒf@Ó$6NÇÉ=¹öæÛè×8ŽIiC¸hR"_?}9ñ¥d_|ßÿw)Ç·ê@·1OÑ+!.:©ƒKÉ8÷òνŸ®m[’^z4\8 éK^#½|Çó™S}ĬªuÐ×°?—]|‡5 Ò)%Ÿ›&Í ì„|nú×J.üq7´óš§xÿƒåøÍše·g{’_—¿åná•gÞ"îüGyéÊÞ"«PCOç‘)¹<›õ «¬Þ<ùÀ­4Æ%TnïnaìØq„Ïx„O®í‹ßPØ®AbÜ60 ÅáWsß]‡,îMÿçóÉ/—á>ù.MÆ<Å CZ‡]s"w²œGZøkç0døe\pd6eý8ù”7Y°m8}SŒ?w°·$­~ž–)¯ã3 ìËæŠ§þCÇì$J—¿Åk³ÒxtÒst‰»àÎ;é6&ýr2Ç^pÏÄÇa ¯M£ƳìºÃˆ3A×?’®M·ºAV6–{îu9ÿ¹§ê·“û]‰c;`øiÒ£ NõiÖ{·ßPeàÕÀË/½D øõÛ´PÅ[f¥á‰­‰|ºÅëý´¸ê ’ÚôE9.h›ÁEc?äêcj£=ƒÔúµ`ó"–Ôå¶~õ@)¨Ý•AC|0´3ÈhÕ”ì”øèè¾ 2Ú4£AF2¦©IÎlAÇœ¤'02ëdz°¬m¬xÿzÎó Ë·;Xf/nEU§ý å)L+v£T=Ø4+×ûè¿J¤6k@íä JABb žçP±j*ËŽÕÎö ¾ã1t >ƒ[¹¼÷ ÖdGíЎ敪šÇò|Vä¹ îÕ„€ frz6ÏàÎÅHºæbz”ô¡Gëœ0l8\x=R·°d“ÉW¶ Î2ð´EÀ­ò0¬8šõlG V#r’ËØ¼y3¡’¼zZg^¯¬±V6õF]…M-âÓÓÉnJaÅg‘l•RR*çOïFÛXµ­Æs(¯?„^V)š_=ÍE÷ÝͱÞ£õÊ/˜<óCze|ˆ¡£5Þ m1,ìP0õ1†_:–ëËðY6áH¶: d¶oNVb¥¢ϳ»u izÚ0iÔ¼% ¥“É[ü3¶.aF£Î5?Æ¥gsIA ªªožŽî—µF)åFÈÏÁ<Ëÿº$6©Ç?ˆíy˜¾xê·mÝ/³¨_J…«>Ö IDAT~éÎ5a†ÄAˆ¢»?!‰ ¿Z§YÃ$.>Ÿ ZiÚõ0ŒZ†é°ôÓÙØè|˦³º4‘ÎGž@zó§}ά¥Å˜–é P¯%GõmÇš/>Çî} ½3  ˆ)'“Ыùï}ÎvÏÏ’Oߢ¤ÃIôJ[ËÊŒî i›¦/"³™µ,—Þ­ê¡B™úå$V•ÄÓ±wìÅKitÄqä$)6ϟĤŸVò¥Ó±ß‘to˜LEÑF~\¸†+ÂÒ•03Z1pP²ã£¡lGs€±×ÀJyØvÛ±Qþ$ê5lBÓ¦ ˜>‹äì f9ŽAû¨(/%±I0<Â[±µL%Nm'·tŠ£L,CaÛ.J)l;Œm›±ç.¶Á¶¦iþá(ØÊSØvÏó0•í¸qi4hЀŒ&—p÷¼ï¹øá÷:®Çv°mP‘Êm…kGp•F»‘èÃã*r#ØŽƒÖ ×±qlpu}Ïÿ7_ŒEB©Ø€« P6Ú‰N;°[ÓÿGåïynUù›¦[ã÷ù=úòXM†QÕTâ)›ûö·×Ñðø¦”M\ÇV{–v>Š.‡G¨¬Ã0QŽgȨۈœœ:(W¡µÒA‚ºœME6ÔŒ"òËÉ Ñ+Õ@á:lÛˆ–òbËOãxZ98v˜ˆÁs=”20òÞâÔ³Þbø´5ÜÞ;]IRïõDPØ®‡ÖŽAyާÐÚű#(Sáx å9Øv§Æïí¸xžëOÂï’_žßÃÚB‘§QŽ‹g‡±=~sóšYAcÛaÀijm<4Úsq]­4†6𛊼âÊuPº‚Âòñ $væåÅ›˜óÝg|9ñi´{‡‰KŸ#Ñç±i{í98˜–ÂtmsÑ>‡ˆÝþ”öpÛtpÜTN¸ë}>¾½æ½=gà9a\Û7‚§Áum<ÛÆöÀv"ûô˜#}†Ä~Y3¤«…Ÿ`b*`âóùHL­EЪìbº•—.:W»@\9œaÜ˼b“ÐÂqœvÚ],W Ï& qaåÇ·qÑm¯²]2îüá<±ÜÓs#Ÿy6oäZÑæ#íâxà°pâ“\7~ !Û¯œ)¯åžæ£(ã½1ÃóÌwlÞ´ˆçFŸÂÐ n`vŠ¿¾‡“/x”VofÝœÿpþc˜²Ý#´a&ןt÷|0[ÙÌxåZn~å†Uí*£}PžÕû«h뺸®‹ã8¸žWuöÝ ý‘„fMàÙë o_Ê¿DR‹C©Ûþÿ¸¸Ë*î¸ú–»”mœÏ¤y[1¬š5\T»ògGŸ½gÓ ®ë² 8m)SŸçµÜº´K+dÙâÍã4Óžù‹bÕøÍŽÉÐøüqxÛ·°­,‚iY4ïr,eß>Ńf³µ¨_æOfâWS)Œìº¬öÆ©ª•¨zDÇl11x÷ÝwøðÃùðÃøðÃ÷™øá‡ü8î.Üeƒiпå7³Q7£é˜/(‰¯‡Š…ªêËRy.®ãàº.žç¢2{0â"îó<ËKC,~÷i^ÛØš z§q•'ÙÕûaTÿ[õ3ñÊë •"L s2M<}Û”GÛ]©•`±}åZJ”‰iùIN´Ø{^ÕŸ¯z¿Êš±Êyð"MNæÿ²góÐcßRboå£ûÇ2ß³°vÕ×ê [×øn—Ò¢mPP°•­v Gt©ÍøûŸgv~›ü”—¾/fH¯¦”.û€w¦äÒrà\uù)d”/fµ×ˆ¡}ë3þö‡ørUNy?Î]NIÄ«ª¢Ü1mؘÿPŸG]Ã{s7PR”ÇÜÏßâ½ùy˜Õ:ÐÔ¨éÚ“ù£æ0ZƒvÃQ¸-yß~Æ´ŸÍÒ,’ÚœN«mïrë£_’»½ˆ-+çðÑ“[äP¡‚ÔoÖƒ2>yò]6†v”;†”0,¥ÓÞä©/~&Þʧo½Ó‚ºÎåì–?qõ/²,¯ˆí¹?óÅë/2k«º#¶¬ƒqA›r) {Xþxºô8œ¥¯<Àã_,¢°x;+g~Á{ßϥ­‹½ZÙT–ïž× JÿFìlÙ •ðüÙõHJJŠ>²:òêŠ8¢] ñ Ìèÿûã šô»‚1žËUÿzˆC–½Âø•A: <ƒË®¸‚Ñ''2íŘûï§E‚A !HÐÚñ‹Á„SjÓg`oÒêtaÄÈ Ò3 ?q_ÕAß ‰ Æ£7¿Ç£Ø\ÿÊkÜy뽌½®;† èmäÎÛ>äð§'ðïûïäž§ßâúÌÜöéfâ&¾ºÝ9òbÎy W]y*k¦|Nnù¾HMkªnx¨<—pE×Û1|rmÊC”RÔé8„®êÁC:ݤŸÆà¡[†t3ýîWœ¸ùQºÖM¥^—Sùϲr,\B¡0^ìû=e‡ñTõðµdÕž¦C²BáËK¹6¡p$ö\áº6¡°í<«5N8ý¬Syñ®ÖÜÐ,Ú9§°¢ys‚¡¶ mNAŸ Ð -ƒ^Þ£ÞYÐ7ö¼Ïéϰ̀PÄ­ö{öŽß÷lBá Bº9·½ÿ¾q'‘Ú‘—Í~ôLØqXåã6‘êëºV •¿‰GÎëFNÓf4kÖŒ–Gžqî“ÜÚ|Ç4©Kó£ï¢åèû8¯K]Â…‹yøìéï£vÿgðØDFdCÏ«Ÿà_}71²[#Òt䪗§Sî*"¡0‘ÊíHE9åv€¾×þ›çNqM¿&¤f5嘫_es…‹RáPÇÓ(¥QÚ%ªÀQÑæ¤ªíÅøƒº¯jËZi0—¿KÿŽÍhØ(‡žgþ›ŽcÆrn‡t¬ôî<øâý¾2‚fÙ™49ôT^Ÿ•>?š—{Õ"½a/ÞÙî#Þ$V›]>Ñ@5n8Bíþ‡.™Y-¸ev}î¾aÉF\ûîg¾öº5L'«E?îú謀‰ G—·‚ì.}9&c‡ç¤S¿óMÄp /^ß“WÎ;”¬Ìztý¿[™“­ˆT”c»Õʳ¼ÛÓ5†ZÙ—ã.J3™Øk‡´Fâ8éöOyøŒzxŽÂ.XÂM£ÅñjÔÄvtmÝ^Ì &–“[¬ +4ŸKz‡yÅ î””î8KÝé॔®j^Š^毫5ÝEî†é#¼ú¿ä'væÐ&&Ê…Œ®'ÒÆ?gÛJVTlà»Ùü»ò¬C;´ìº§§Irúd¥'¢•&˜Ž¥Vv4:Nï“q5*w&å)y{êœpyyeÑYëu ˧Ch[>ªNzËÏ—>…i€çDˆØ®«ðÕîÎý_,ãQŸ­¢‡°ÕéLžt&vì€Ú°×%ü·ŸI$A©Ý½ßÒŽ;TÛ.‰'ÝÃÊS "/P¬Üšý.Ùñ\ô:ç¾viuå6ùGGÃÊðdš‚â7/ÚÄÆŽ%ðYÄÇÇ£ŸûžÑ/Y±åo;aèr=?¬»ˈ­‘0‘HÛÈâ”>dÄXϱ G\XgcØT„#ÿßÞÇIQÞyÿTUwÏLÏÅp —܈ ‚ˆ@âµÆ˜¨!j£¢›¬lâj<’—ÉêzÄD£$Q¯˜yi‚ëðD¢¢/n¹a˜™î®ûyö®z†`¦™ßûõjº{諞~ªêÛO=õ<ÀÁ<¼ÕAÛiê®L¹ñÏœõóx4àg€ç¸úHþúþbÇ&}Šz|…ç—œL`Û ëŠn]+jCà †žÄ3«Öbå´:ù®ƒ»u=ºg/:êÛ<õîÅÄ¢ºø®çÐíü|6íL~ xh†“¶ÑS®eÁàºJÁ)×0ÿ e˜Üo™èÐÇq=Â0 Ùw2wÎZÊ=Ñö |\ÇŸk.Ëðȸ” çÆ¿¾ÇÏc&Zùd2.=/¸…—Þ‰e=¼êºx>ür¥ nÛuüiK e§ÉDGµRí:µ„!Ñ¡(¥pÃ01-—ÀˆÑ¥ºƒDài¼âmTijÇÝ]Ç#Ð<p´FùÚw²ýFt¶ßé5üòÛg3gò Þº~ v*MQ‰id7x1 Ž”§=×÷Ñ:Às\†å{xž ¡ƒíÚøžK+ÇpWScÃAF€Q·ŽÚPh¿¶ŠŸ¾·‰ë†å¬¾ÚfÅ[dûð¸6®kây>¡ ²÷*êSâ+J´MÊ=¤bœwÞ¹”••å¬ÒÌ™3›T*Eïø¼qí4Mÿ'$“ÙÞÏ! <2AÓïs—øœÖŽåËW0}úe$KK›<$UŸböìȤ¼íÿáE·3iüœt3©íq2Ù*Ò ðÈÞÃM×çÝñìMÊmÙh ùjûkΙ;›D<ѼøbþzÖ‰L»ú&ÔÐ/¤Ó(4†ªÆÏ¥s'jáó}W;~?ÍïžCóé}'ÓX®¡g“[ônËë'“"·ˆ›ß÷[zß%ãƒ+bÓkÿÍ-³-wwyó©'|ùýSáàÙª±ï²¼£úV\\ÌÅ_D,oRÏÆŽ=œ[o½ÛÎà;Íž¸dRnÞoÑwmš¯n“²qR©ÆÇžCà5…Î)]4»ßŠÀ§³ý†´Öd2Î;çlÊÊËwx˜±yùå—p];§’ïÞ¡€èûhþý8;¬ùëNf{Ê÷ß%“gûâ4+O;Õ´n+ÝN§ÙJ´MˆæýM²}"‚@á ݤCã)FÑ¢I?•°Ž¹÷ÝÈcæ¹<÷ÀÅtC£Šã(³š#1øÅ3 á„cùôñ‡˜o‡Œol,ŠZ+ˆÑ¯_76üq[ŠÎ¡Í¼ôâê¦N#~ðYL2Nåw/ä®3»ñÔM·³Ô,ƒ.ã¸ä„ß=çŒ{ü&õ xÿ¥Ø0ò›e憔ÜV-Z}XiO[Ùt2Þ¼îTêëêÚöpÝn&Ck†<”y¯¿¾Ãg4 ƒt:½ïk£Rì}Ÿ¡¨µ" œZ«ìè¾ÚàôÓÎÀ0L²ƒ2›X¦ ±éØžµ59;ìÜuä¼ÖµÖ>åÃN䨵Qëœõ³G8þ„q†YÃt+ίnXRõõÌ;w‡–ß0 ɤÓw’ÓVL]ÓP’%%Ìã¼ë³a¤R©k2W9›Ltª(¤³M↑Ýiø™4Ž6þÒ*ÄÍØÑ+ 7“ÉÎ;„ÂËxØQÿ …“±±·­çåÙOñޜû݆J&}‡™ÿ†“ý Oœz ‰»pÒ¥SŽƒhtà‘ÉDý&tê4.›=1U•T2Cª§8°QÅ“ùéý×ráE“éryoξîB&=ë'™ú˧¸ëºé\0®7›Â$}FžÄ-š‚ }lÛ‰úìõ™p sú“è¶h(ê?ѰlÍwЖßç®ÂÄö  ðUŸq_Öǽ.íÈ ƒ0 I&KùbíFÓòsñ&w7mÚHÏž½phÿèöC¢¨×œvîMZNÂæy7êzz'õ¨£Î}¸«ÏÕ°®4tPÞÕºr Íñ¨% ‰Î†Žù¯[ksÉ+k0ý _¬^—íû…{ 2M“m5[©¨¨Ì›…4P^^NÍÖ­ÙSç ´Œ]Ǧ¸$™7€fvàY;“Á²¬Nõý†Ií¶ÊË+Û­¿Ü>C†¬×¢–eQ_ŸjüÔ†ÍS¶÷kŠeZ 2„·ßz“ч!‹íÓ])XµržçÒ­[÷¼ëRY… ?ãã?¤ÿÀA˜&tˆÞÁFv¼©•+–†U]»íöKÄc1ú÷ëÏÂ·ßæÐQ££I‡Åž„ÊÚÚZ-x›/} †aæMCãÆÁ¼×^eü‘GQTTÔA*RëêšÖ7¬gõêU5qrÞõ¿(QDu÷,~gÃGŒ$3á@ÏÕFöŸm55,~g_>ú˜v;CnŸ‡!×uY±|Á.æ`–X<žw§…z¬µfàÀ,ýð† Þé~ùdËj·Õà:6e½{ïý¯iËdÐà!(­xgá‚]Î{Ôæ¿æ-“Ý«=z4ÉÒdÞX¢(Á˜ÃDztéG¼5a Á–eѽG=tÉÒdÔ±ßØå·:ô`@³hÁ[øA ‚=ËB”––1qò$ºTVbZæŽß…}úöÅ<–¼û®çÖ2šU]º2~ü‘”••å­gVÌbøˆCøäÓYøö›­š«íÀøþ ÊʲßEe%¦iîöºØáÂRбGIÍÖ-²†wBã'L$laÖZ3fÌX.ZÀúuëPº“µ é†fp‹^½zÒµ{·½{¹hcOÄ1↠Ñîãt´¼¡7G×ÍÝ€5ÜO––2vܸÆù:ÞŽÊÜí ocù%1òP†2²C.[¡µ˜¦Õb=2,‹Aƒ†0`ààÂ-kÃÈ»³o¸Ÿ(.âÐQ£yè¨ÎWŸZ(›‚ Cýú÷—•ºSÑ ù””&™0a©Tš0윿¢ã±8¥åeÄãñ½Zá›þj6:@œüÃ5îÈ¢;tZ݃üM—Í8°¿ë€-«®ïeMÓZêÓ~Ûo•VȆ+ÏÊ^\’¤¸$)Õ8ÇÒ²ÎyÃNá,ŸÑfu]È~dO·‘‚§Ï²óØóð „¢í™RB!„0$„B!aH!„Y§´³qôõöY~é3$„Btðda°iÓFjjjüs—0 ƒŠÊ ª«{‹ÇÛü CB!Df* Y±bÖ¯£ß€M¦xé ‚ `åŠÔÖÖ2løˆ6˜WÂBÑÁ9®ËÚ/¾à˜ã§K—ªNY âµ—_&U_Ge—„!!„¢ƒSaˆTUuí´s7VVvÇ¡²_[ÂBQ²…t'žÚEkÐí0]“„!!„¢€´UÇaÓŒN(W •¸´6±,PÄbÙÇ…a¸Ó÷6L³éXí*$Ôí1€lÛH+§Ö !„DG§™7¿(­1M³ÙÅháñ!ŸÏú '_z;kÒaÎßM,«†»ÈU/dˆÅBž8u0Çý~5–e¶øÞZ+6½?“sÆö¡´¨” ÜË ,,ôNž³{—ö$aH!„(°0”Wf _{}“EÄEt0‰Ÿ=¹WG-)9½@èfØV—FÑ|XEfëfê] ùú¹L™tt¤®éë„™uÜ}Åepîc|±q gn¸‘‹®ÿ'aÃY_Í&™mXÃ0rþoÿ•©&B! <„¼ó÷»¸éÅ=¯ C’¬yï-V&J@ƒa8|øê‹,ül#AqwÆwU¦A,²jÁ,æ~¾Ò‡sÂÑGЭ$zè•«Ç|‰q½Š@k¬˜É¦ç1÷­¥Ô¥Œ˜x“®ÆK¯æ³ÚœsÖ±Ô.þ_jÍ s%õL¢‹¥YñÖ ¼¶d~IoŽ<ñ$ë£fõR}aÓÕþ‚w—m¦lÀX¾rôX*ãjŸ£$-CB!D¡|‡½jk6b ÏqG  K—Œ:öTN™xÅqXøëó9ûŠ{Y¼r=˽Às ·+JP7ï1îøóK|¾l 3®¹˜»ŸYBµ÷h `îžÁ<½ ‹Ú7fpδ_ðÒGkXóþ,~8íJž[^‡©:ž ¶e—|÷ª/º{®? `Í_®äôËf°xõF>}ù>¦žùÞu-6/šÉ÷Ný÷¼ºÔð·;®æÞç–à·°Œ¹­­IËBQ`vìÈ稓/â¨Î¥OéŒ?ñ$¦^ðï\tÚ*êžåê›^ãŒÙ+¸ù¨b<ÏÃ×ëæº¤’¹æ†›8²wŒ×û]Ã-óæ“:ó̦A¡$IIÜÖsïO2ìúùí©C€ Ó¿Æ-Ï~Æ×ÏË23´Í† ËYV[FY²‚w¸êG/pÆœO¹q„ÔÓëÈÁ\?ëî/6‰ ü*W]v)‡õ0b¬æÖùo“>e•ñ}{ÌLÂBQrEòõ*|"ù×>ùçþñüÿñÇi_âϯ=Îóç½Á‡z¿šXÊÇŒ%(B¡BMõèáÔ%‰i*ªªºxÒ 'ñç¼µg+ê?ãÑoÊÃf6¬Êã Ôá P>N3™ùà‹LüFoÖÞü"Ÿ»ŒeÖñì¸$·DS‹Y1ƒ‰k¶â6é:|Ý’1”R”•–㸡ÒäëÕž‡Î$ !„@iï{¸®›÷ÿM+޶LŽÿWLúSÿmG]8“eS"áoaý6K\|mb® UˆëÙ81ç¨ÐÃu\ Ês¯@û. ¯®‚+ç,æö£»ç¼³Çæå¯*…›JÓïüøô°c9mêtþpÐ…èL/î^ý9ßë‘»0õ,~ÂA…×µqMçûÙ÷wÜ<É' Â0l—²•>CB!DAØÉ©ç*`éü¿ò»GgñÉš ¬[±„gg>M]÷JJGœÏw†½ÇÍ7<ÊŠtÀ¶• xeÉ6Lˈ^“èô®ííAÚˆZƒÈi%*ÌÔã{1ãûWó·Å«©Ý¶Ž…Ïþ‰'ßÝŒih #dÓªU¬Ý´°b}Ë|Ò•Çrù±5üø[70ùfj7/ç¥ÇdzË&ïŸ;#ýþ8½^ÂBQ(qh'A!A†—fü€ #3pØxn|­‚;n¿‚ÞåƒøágÌâŸ0ºg'Oã™U>–òÈ8J)”Ö„‹ízh¥ðÓiÜ@šÀNc{!*Hpܵ¿ç·'×råѨªÂ)?zŒ N¶…Éó3|þÌmLÜ‹>‡œÎ¦ÉWñÍI#¹ð‘Ùü¤ï,Nуª>cøÞŒ7 bÊ÷°£÷×Zø¶ë¡v:ÞPû”ë=”®»æGú–Ûî`ËæMm6Ê¥B!ö\ª¾ž7ßü'SN;Çqò·nX1‰1+ÛΡCÏX¿a#JA¢¸˜¸eŠÀu¨ªîCÂÒ¸®‡ÒdûYÇ ˆ'“^××Ä’¥$›ŒŸwÈŠ'(JÄ1 Ð*Àu\BmRTœ@)E<Ç04çâzƒxQ1‰¸…F…Ùçh+AQ ×Ck°b –Æñü¼¡'‹ñâ¬0bÄLöû²ØIDATzõîÓºcšlÚ°ž;n¿£öÁ‡>£¡8ºè:¤¥ÏBQ­B •B·0Qk¨;†¡(mX¿.ˆ„B! 5Y ZwŒV…¡úººÌ¥_˜1MÓ ­uö@ki*B!D¡¢:ÀÂP¨è¢wHH=««c6n ¢T]Ê€dt»HŠT!„Æ7M3¦”J á:ØÍ[zL 8ç’Œ®K¢ ”òB!D 'ºØ9pòu £'ù€ýMEó¤<…BQ€aÈ‹rÝ£|³CŸ!]Â( å!°¤<…BQ`T”cü(ùlï;¤[j2rÂQCr% !„¢@ÃPѯ†ë†ÛyÏ3›]¬èÚ@iB!DáihÜɽ4&ˆrÏÅÏw[!„¢‘ÎwûÿðfƒÍGyIEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_tables.png0000644000175000017500000005702612235000130024013 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÎç—2¶úsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ* ju IDATxÚìw|E‡Ÿ½»$ÒÒÐCïŠT©‚€ ©ÒDTDA°ÐDE$J{¥JïUš@€@è-•ô\Û÷\’KH… ÌÃg>ävwf§í|÷73;@ @ üHE,@ žr¡ Þ’Ÿ7µÜx äoµ³?:7Y+‚"OÇZNÊgˉ¨*ëBþ1d ÷£EiàeAÊA,¥‚h&ál3dž,KC±4d±6弬Í„óÉëû6”èTË•†¾ê|%·¤½—JÙ†%A^¢~ö,–=ßdcYCðV0Ô©jŸ›xªsͬb™ÕarÞT<³Ñ'â`ÈFì¬Ìô˜›©°¶Pæ+Éæf*¬ÌôÙ†%A®¸eMÅ\fï~+*Ô©ˆ›™†ˆ›7¹þð1 ZT–<ÙE›`êMœЙX£¦ÖgŽâ™ï®ZƒÁðıÃÇŽ³kßnÞºE\|<È`kkƒJ©ÀGõž¾5D%A>E3‘ëçîÓêý.tOõCòmÌos¢X4û §ô*òÙ;n”¶V@r<Òl¬³Î4 RŸÅéLÆc˜hÁºjs²eYF¯×e:¶dé þ9{žµ«S¡|YìmmS_ bc‰‰ŽáÈÑ`ݾHµ Þ¢2 H˜Y*‰~KŒ£-ör2÷#´´±ÄK ªu{1Ì@N"ôz%¼KØæbišŠ¥Öø¿†œ¿ë”s³:ó5Æ™ŽÎ ÏtäÀ‘côêÒ%,‰‰‰æîÝÛ¨ÕjJy{RÒÉ‘ÕþªMßuA ùÀ_WþY½“È]˜Räk'·,ƒ……cßT0X·h?ÝÑ¡r®`—EôrM‰hfý\Egô£ÈÍò|B85Zý)r°8‘eNÿ‚£ ¶6ÖØÚØ—ÀƒG¡DÆÄr¶a @=*l²ÎEµö$À)œ›N%qÀŠ.£ºÒ%ÍN}㟆,©3±05@²QÖ¤l„Va"š&p^cœÙuÕ*Œ¾tY„So0`ocIèõë¤h´Ä%$"Ë2fJ Ê”.…Á`“„@Pä'M=9«>%sòè-îgÈ’C.Öfšh¦ºÂÂD4M¯5µ6 òg"—Å ˜©Tx{¸`ccƒ,ËÜ¿ŸÈˆH”’”{˜@ d#œHz}êð¢¤Ra–p‡+² m8Q‰Ø‹X~MF%É@êp(™gЦuÏj–¦ÊÄÒ4½Foò¿”Å=± B¾„SiaMÌã¼=}ž8wë^8)ÉñxJJÔf tzØDN@ 3K%‘÷ÁÏ |ê³pB,QÂX°ö «CÊñ^€Í¼Nù°HÂe þ˜…}Ö¦ÖhiªL,ͬ֨ÒÄ5Mò²8%£aù)¶Õøù÷uè“cž8çå^’«¹tõ:IÉ = IÂL¥À¦„9’$‰„@P¨]œytô4•©MûRØ9Ùb§²D…§×þͼ&Ué^Ë2eÜðJ’´%cl2í³“4kÓŒŒEàM-Q3£Ó˜ˆ¦‚<ö˜Î—Å©³pFgôÄq[§0bÇR­’?*• ­Vǃ÷yók+kââ°²w§@  †ÒoX6®ü‹¥ ºÔ>R󒔢4)Ü;uŽ©"Q—¾–»5O~·©5EL¬ÌR—è33±6MÇ>%“ÿóþ¥ y|ëvãß?›¨ÁÝÙ'G;líìILÒ %2æ1UZ“ƒ@ðâiƒ‡o™Í;ḏs/…{ÆÑM+™Ž]¦uÏÊ&Bš&š*£X¦ýŸgm,Μ°vô¤FÇ Dݻ̵û!üsî²,cëî‹£o|<ü1W[ ‹S ÿ5jáÔóä˜¦ŽŒ®Y•‰`f×”²Xù΂ÅÔÌÂ×25q-S3ÛóB3@ð03É´.Y9‹õ™U0³º|YÏdq @P„„3í;Î4”M¬O•‰šXfgeJB8@ð²¢4JE.e^ÖeÁÆ87l? ²^ Å‘´I@¦¿dLüQÀÚÌU<3](˲!*2BXž@ (V”tv9NæÉAißp¦ @<Ä]´Ñ=bç“H]aHcô›dtç¶™¶@3§¯ÜçÏ}—¹ý ú•K»R¡ÀÃÅŽ®Mý©^Þ]T hÕbÌjMJyøÉ7B8æòÍ–o9GÍÀj4hàŒB!½Ré7d…‡³|ËYFZ˜á_º¤¨AÑÏìÆ.³ë’Íó³“ §èªäį_ Vê8—tJ’W­®HàââL­Õùõï ÌØDT àBXœ‚sça4µë:¼ò/WŽì{-*„@ „S ȽA‹÷’$¡7ˆžàUC‘Ó Y–‹®ÓÞfYso~Ц(Ç3'§¹Êü^ýx m1LÿR?$%Uê¸ÑÁSô4þQà_Ë7¼•©þ³þ.NyQØuàYë[qsq{x»¬?ÃÅ¿üi}™Û¹§x_¸pæ‰ÍÆŽn¸¸f8w¿š´ì3…¥‡î£Éo8º›|TŠ&ßÝ@›ïX—À¯U7ÚV°y†dŸÏÊ4²˜cÑú"üº“%ýO“‡ÏˆAÎÞµkæAÿ+µ­¥ýÊ`Üåýé\úÖï9üþ/Ü «c…õ <ïúc’]Ët?ùñnùºáâZ)§“‹¯9RÚ•Ð&ˆ®Zò19H–‘‘PÕŸË_sëb©I êÖ¿ìYû-t fÇÜíüܯ,æyV29#mÒ”2ÍÖßÏ?/þ»:f@«³Ëÿ3 ˹׷çYŒ½Ø”àúêu„ž@€yjÜ¢®`¯¶dê‚£ÏbEÈdªKÏ_8_D»ò¼ËÔ€V ffЧ¯w/cWm~QÚzã[¾<•«Ó ]_>X±ƒõƒìØûÑlydR¸¼l$íë–ÇÕÍWÏ*´µ’óñ2Çηóá% !ÓëãåæŽkÀhŽ&Éalü¸uʺãêæŽÐ`‹NýUw‡å-KÓhÑõBy›JKCù€ÊÔíð.;:{ñ‘:ã¹Å%×ôÚP4,EãO~àƒ7jâãæEÐ7WÑúÈÌ{³&^nî¸WîÀ”M·3Ò“ïô?eãÕdÎ/Ì~«!å½Ýq÷oÅøõ·ò•§²œ½{«%Üèb´€NOd¬–ðX:;ZÔó`` O6w§SE+&þÉÌ‚êÕÝx§…';SßE‰”v^RQƯ$=‚<ØÂ“>u©b§HÕL9£½”sú›IEµút)kE­@Wú6÷d@ºšÜ?÷\êXvuhþ¾Ïò ÈÉalœÑ“ú¾©axUkÇû= í†Ø3ü0¸ åÜÜqM/맬?ÏØìØÕëGã˜?X{9Źö­<Žë›oPV™¥‰~|šG´$ÀÝW·2Ô~s&[ïfÔRCôQô©G)7w\+´aŸ7HI;™ô“«–¦ëöØŒã÷Ñ߯2cŽ%‚œÈåÕãhSÕ;õùõª@£Ë Õ¼àv%¯ç3×t=̶Lwí–ZöY\óe·SëHAëà×WÑæ£ŽÁ§igG+?3Té×K8”¶ÅöQxÈöÛ2~Uœ´ Oÿ’4qÐòÏ釬9ø}VwÀ×Âä6Ó¸§éwÞþ‘%¼K  ççw ¾¢§l{|Ì s\åiêX6uhXÙÌÝE†hvOìÄß ÛÂí=y˜­ úS¥DÚ›¾–KKær®Î'lØ¿eoø}ìD6‡[½gP²¯CÿæIlXý/I€þá.Vœ-Mߎ¥3÷Ré°qd¦ógê†ݹ„ÎñËéÿæ|þMN=¿þÝ>̹ֈ/·åÄÚ¡¨V~Âîøü•îÖjÞ´‹2“×sôôiNî\ÎÄV^XH/º]y–ç3û6¡EË…\ºyƒ[7opëf('·ÇAéKóŽ(Ÿ¦uä`>ü<[;—Kdñ_l&e2ÃMœÒ)_+ wâÐÊj*÷I¯ *”ñôÄ·n/¦ÒœÄ›¸’djÂgø×=ÜÆÔ [47ëøâUª"­Þ›Ç(c¬ÜŽ^ÎÒ ÷,ʲLÊö^øº¹ãêæI™:ï°Úq?~X‹ùŠKþÒgûúGŒ rÃLRbY"µÉ3oð!³ûÕ¥Œ§ÍF}ɤŠ×ùyåyâž&ýO‘‡2P²Ó4†×+‰ Ê´DÕ9v\IÌsÞ Ëy»ôñPƒl üV,—"RˆNÒÏádÌJZb+Ééc’úèÞN&:IÃÍëQœˆ3#ÀK…ÒLM 7™sçc‰Òð8QCص(Î$[PÁQ‘naʤÝ?óo9Ÿþ“Äp&J‡N6ý0Ž;²9ÞV9§7?ÏʳױìëdRt÷7óź:,\ÂØ6Uðñô¡rPwú6sK}1l›ÍdÎÀ¦Tö«Jû1“h¦:›QÖ¬?ÏöÌŒ5Õû¶Æ°õgNÇk¹»í'BÊ¿M[OU¦<ÕÞÝ·»Tt›?›>uÊáS©5N¤ÂµU,=›€öî–ì³ä­ùÓ­j)¼+¿Á‡s»ábì†Èö…JNO-º˜ÛD)KÓ8(7W¼üëÑáÍ×ðR½èv%Ïg.éÊ®LeI…™¹9æææp{ ïMØÿô¼XýSÔAóø]|™?ÏÒÎå–Yó°HŒq>{? I€žˆƒß2yúR¶_ˆÈ0±-ÛòX—} Rn%4é'šù0?˹2w¢Ña]˜&2ªúsøßœºXÉzîŸbõôiôåËîeݰÏ3.%‰Í-}J3<ªy£Î’õ¥TÄ.íÕEåJŽD]#òƳ§?ïÔ)gæB–A‘§ÿÔ'1^>Í¿Á@’^ÂV!=ãXÙ³Ö1UuȤ¼oŸ$Löc@5»–A1óf¬ÒNš9àa¥É±¬óª?àúÌÏU•Þt2ïÃOGþ¥ê/aTÑ7ÕÖLWiîå¶TŽamÒÓeæV›:%sæj,IòYî(üñL”(„¿ùÆ|ů}+®dlºüÚê5‚š·¥ë)c%½àvåÙžÏ\˸“Ìé?«­—°ër˜‰OQóׯ¥J™ÿu #ýy…¡ M}¼ŸX.Ï8±&4Z]žZ9Uü´ZZ3+ÚT·Å2ì¿I"F#£rræÚ tZƒ”ú†iУÑêŒÖª„Î` C/ƒœÂß;ïq)%»vJ…NYoô/‘é·R—‡…Yª`êt÷7(ÑÖðÂêXZY¨e—D…"SÞkYç§Â@À›]lé8ýCŽDÖfv3ФìE(Gy’II¦9*’*ã·d|Ï’¶ôÑ–³ñ,mneûî½ìø¼'_ÌïÍš]s ²W¼ð2ÏñùÌ+]9¡ÈæIø!¬ŸÛWeÁÚ‹Lu0Ÿ~þ³6*‹7wâÑU›]WlˆåÄ?rIÝnÕ¬ÐÜ9ÎMU† jF9G5 ´D\¸DŒ.ͯ„BYoHÃÜ«e¹Ä†£©iN÷¦¾ÿÉ& ©Ý|ID'èóŒKÞéË2[4ý˜Ž›‡/£Oû.ï!ÿœŠÂ¡’Ž¥ šþ§ËÃ'ãej!æõíbþ\Úµ’Ú‚’Šþ¹žHTŠŒA–PÛ˜£–L¯•°s2Ç"}BžW%ɱZ’‰Á?Ge†U™ÃDì~k î_–Ÿ´š³Oß[ÇrªC¦uÀÜ«&e¤+l?“Ú5] ²~ÊgðYž9ddÙŒr]ßÄýÚ)õ£‘}Z¹gt³šyâ-_c兩ŒgîÁ ŽGØQÑ× ªxÊ·ùçNJúù”{gKNëž´ÄÁ¢ÓÓ¡¾ÆCF™(m)ßôMFÍXÂÆ¿Ó0b«Ï'¾Ðv%Ï2Ë3]O–©,§ºb8£¶ùòñŠ÷©eÍ3µùóólí\nyõþÅjr>î¡W®pùÒYŽlÿ…9ƒZÓeùc‚¦B[g*—Š”R„²õдÈ$^ fúW3^"U¶x{¨¸{ð0WD“€ìÖž÷»Û°{Ü>Ûø×ïÜæÚ™Ý¬šý+¯h =ÒÒpårgöýÂ'Ó6ëDK ”yÄ%ÏôåfµžÉ«Žv÷*{gîEz÷­ŒuAÓÿò0?cœßeÊè’5<ÆŒrNJe”ÖV4.ožþP¤]¯tr¤i) lÕ*¼}KRßVËù)$'Åsø¶Ÿ@ê{˜c§VbggIåGªX“>®I¦8düÖçÿlÁ'Ó ç:Æù_×±|Y7ní×Ù‚ÿ½÷._ï8Ï»7ùw_0?゚÷,éø š•Æ–‹ç9µ0Ûlž•{†·Ð<~¿ž¸ÎÍ‹ÛùrÔ<.•ëËÀª%Py´ehÃHVÌZËÕ$9ù|¶Œ°´Ì½i\ߎ‹?ýÉ¥D9ñëg/ₜz³ä ?òé·8r›opjÛ6.ë\ p1¡íJžä‘®'Ë4žØÓ_ÒzÍ>ÿŠ^^2)))¤¤¤ ÕËOŸüú)´v.û£®ZÝ‘I´ 2ª°µë½Æ'kߣ_#·Ôï±Ü:1Îa†L¬Où÷mqðj@¿Qí8:?­ëË–†ÆRgÐ4ZÖ˜öÝÙprAs6±Âe³'u`Q,`éFÕ žL´+ìn£Ìi€x×ïÃWK¦Q×À>׸(]óJ_ŽM#Fá½y§>DïH¿Å?3¶’`QÀô?ÿ<Ì{Ì/ò@–1$ű㬚׫yón5I‰Iœ»’€W€‰Å†LDh4=\è_U…¤Iáì©û1 7ÎÞaS²3ªzRÛ Ðëxø(ŽÃšlÞNÉú¶ªÏÓ&+>Óí³~ølu,¯À4Ÿ»žÅv“ølXæ&ƒ¹k =?mœw¸ù ª°²wÌ¥ut¥ÓÂ5DLžÈ§ƒÞÞaù’±TR¸ÑyÑ n½7ž¶gbîàEÃÞÃhxð{cVÔžò C‡¡mùÏQ;WàõwGÐt×7©Ùfa΃msé?û±2XxÔáÍùKægöBÛ•¼É=]O–iŽ!TCèÈúl™R¥O²m€wÁã£ÈO ³ËýþÏ“7²NIIA ÈŽÁs7Ó¬Y ‘Àž=»øqR{‘Á ÆÃÓëDš±OêÔZR7¤N&uƒêxR7­~LêÖi›Y§ûï7²öðôÊ×u÷îÞ)Ê]¬ãÿ"ÉÉ›Ð9ûiá_¬}UfQÇž¢Ý(Îy#Êüåç©…óe(xQyŸžœ:¢ç½¢)ê˜ÈQæB8ÅFÖ‚§²8E^aq ÙŠ…È@ „S¼E „•%òB ‹Sð_`b!„pfæFØ5‘;‚lé×È8'2(ßÈÃGŽŠŒ¼P<ÜœE&á¬P±²ÈA¶Ü{°‡îÝ»‹ŒŠÁÁÁ¢½~Î(D@ „S !œ@ áŠ:šfX¸ð:‘N‘‚"…ÉÚÆ ,;m'6í˜>œã*c¦®Åû¢x¦-¥u×YPUM•ù×òÞnëE†)„p O'J÷ùߨF´ûÎŽöîbfSGQiN [´wøsh:ýìÁg¶1­ž Àsœ¯{W§¤BB’JP¶ÕD6Ü2n|kìV­<í¦¶+ƒ¹„Ò±&C~ CC,[:0ö| ÿŽ÷Å\’œús !™ ûÒ œ’$!©\©õöbNÇå°Èƒ>œãªP­+˯>Ê!L )”µãZRÎZB’$«tgÞÈô=ŠN ðH ã×þõè¾ÎŸ‡ÿbBM›ÔÍcõ÷ø½oKƬĬ}—¸zz5=ãѹõLÎ$¥yÖpᛟ°˜t€G)‰„|éAðàa¬{hM»M!|UÅ‚Ê_†¢‘eäÈ•4¶2 QTbÐâÝ\¹qƒ‹»gxl,&&þ ø½×˜7‚«ðÑßàç’}˜–QìÄ€Ýþ|¸õ"a×N³²k8³Úõâ—;B:!œA¡"“¼}8#VÛ3}Ï:Þ«b•¾ãºîöz¾ØbFŸeß2¤q¾o0ãç™T¹ü O%¤‡àÒsšºb&Yâ×m4¯™â¯K‰9ܯÕßÌ€Ö5ñ+]š Mòå‚¶$üÌ¥$S ø6mH-õXyø'ú”1Ï1úû™±Æ’q¿Ì§ã ø” ¤ãß3Ùû Kv<|¶qZ@ „S ÈŒ~m©euof¬!4ÅĽ}‚’?mªÚ¦‹©™GCºDs.$ÆØ jŽ[%,Ò<)mp¶L&2!'¹Òóh÷lºº¦vµJöí6y‹]†{îÓVôÜX“–ÒÃÛ,×$‡àrb(3«¨S»% É<€©—’ˆ¼%& B8‚ÂE]aöÍÆÛ@÷_ÍMmaÍYrSÿWHOX±2ÙYÂ70 ÓLnwXÁ¹G è 2q{ûà¨4õ¡Ä³i[übw²jóu’ó4š Èʺ¬¼§G–åLîêŒÊ¢.„p …U5mjNbËîðZ×›ÆCÖqW¥êà#_fÇù¸ô+µ÷qè‘UìóQ¡( 2¬OÍ­CœÕÔdìè¶8—@)é?{ž¨Lm*qj>]tåâȦôûõ&š\ÂTû4Äóü¾?\tË B8‚çW=íêÌöíqø¹+MGm&Òý &´Ó°jÐ(–ºÂõ³™þö‡œ÷ƨšVy©²ÃÇKÅ­]{¹p÷QñHnU)£aýž»h‘I¸ôãgžÍưUáÞq1ûVq #6ÞO]!›0eÏ®ÌègÇÖݘºæ(WnÞàò‰-|7e4‹/¦ˆ¢„p ÿ]u šÍÎ-£1û¡#Í&]¤ÅÊ¿YPÿ,“ùS.°'«K¼Ëºmh™Ÿðìi6ã#]Eu/WœýFrܾ'K—¼Îå¡å°sp% ×jNé‚S¶{™Qª× ö-®Â†-xg†lÂ<’äHëŇY?ÚžMÃëãïS†€ !,½l‡ƒR«@PŒ1}§–dY6DEFˆ\äÊ®Ýb[1 ¨L‹æÍ^ù|p*é|Âø§0Z@$I@<ðØè¢ãÿiÇâ×%ýiá¤}?&°8@ (*‘ écÛ±*2ãPù޲ÿ½r˜~œ`ˆ9ÆÜnùâŒéTP_­ÙÄì–μøŽº$B~]ÈÚkƱ6IMù^£éék.ÊX „p>_ 1Gù¬kgæŸÕeÍÁkþǬ–%)£[r!¿}Î×GÓH4®=T§@ äƒßU«¹Êüzž4ýñöÓmÙ¤»Í² OêcÜ™"ëïç,š³»dM?ÿ^„DS EÃâl[Ò™ã9žõ`ø®c|ZMýòZšÑ‡™Õ¥+ ΛŠfy†¬Ýħ̈́h °83óíÞìÞµ“Ý»þÇAjðÚ¿Çö¬e¤ÿË»VŠ!ú³:wÉ"šþ ÎC4µœúý3†wiBeWœJ:ãTÒw¿Z´ì=‘o·‡’Íb7úû¿ÐÂx­SIgœ5;2ê»#D¤EKŽ ¸­3NÎþ å2Â+éL­9—HÐ=bÿŸð^¿®´¬_ _/WñÔ!œ…AÙÊÕ¨V­ÕªUÁÏÁ ÉÊ›JU«Q­ZG¿¦CcÃìZæ#–s.>³"è#÷3§[ n%qhÇÄ ·3VfIcÇ]©Y*µQ/×xßàs IDATÊÿöLÏê?ô‘™ùFWükšäϰàÌl–³hjïmaR˪´zw>k÷_â~¼ÉJ6Ñ79½}õ®O^‹9—ÇÚ3†Çœøâ jvί‡®×W•‰»y„ÕÓ:ÒzÚAËO™@Íu~Ÿ·_7ïçôÕ{D'‹upÎÿÚC£ð§ïçë9qúŽl˜F•SòÖŒdìe¡áÒ7_r½ÍŸ>ÈšAf¬Ü“ùRÀÍžIµß— kqúÔ¾íÉü7‡|/Ò—§-a‹›àTz ûã žºkßN`ÉSÑ `xð&>ÉE4åø“ÌêÜ¥²ŽÂ>¹kÄÎé8x-wrÖà‹Å'Èi=šK'³"T(PÛ—D­6òN ÔjµÑÙãh¥zòüªÔO@ ÂùßbIÕ£éݼe½½)_¿73gµ qÇF®˜¬”mÑh:óÔ§¬·?-Æ|ÍÔŠ×øiÅyâncÞ:5#¾›I¯zå)Uº2mÆ~ÉÏ£,ß“÷: ú<ý+P»W¡Nm?lŸuÄWªÀˆ?62#È1—1M-7~žÈÂk¦ÇJÓ练ÜxôˆÈ{ÿò¿QÂälÂΘu(–ÜÆ2ôür#ÇÏŸåÐÏï˜ióŽË¬ßóäH‡ß.q÷öy–ÖË,ØW]äîÛFw•£ü0PyÒáãål?}ƒGag9ºg»xjÁ+ÍsøEOÄ…L˜ö=Û.DdÌtµlÏc[gJ7¬ˆ]šŒ«\©YË‘¨¯qã¡IaoìÉY¥âN4Z¬s½{Êͼü»áÞù[¶v.„¤ZØãâ`žûÛˆö[VŸÏtÈmàfwóÇ ÀÜ•#1{G ÆK{-ˆfë/gHhÚ$ÇÔVš¾š¯úù¦f§û8>ycƒcÒÏß¿ø ¥ ^àæÞ´éã ²†Èk§8–NâÉÂâü¯0DneTŸ/¸Ûf!.ßâQx8·6uÇA)“¯a7YFVÖäÛ ‰ŒÏäNNªí™žÕH>Âôö}øö|BÎiK¹ÁÑ0ÓVÔmWLË“+]hÔ®|&oqÏñ(Çïk*ðV2¾Â4ÃÙ7³¸%Ç&=Ý.r"—ƒ§Ò±Šåë¶¡k¿áâ©B8ÿK´wŽñ¯¶Ç´ÀÏÉ¥¤#âß‹Dg³ÓqóÐE§µìºGœ:…Cå2”,]‡²\dýáȧjø-¼ŸÍ^XWªÙ L:ÄÇízç,žºDgÚÌÑgÕÖ.6™%ŘS”®”q0 CÂLm–õýã)Ðq÷÷¼6üG=‹f ÖÝäÛêj*νR¸ßíjB˜`AàÂOù}ñ/@ðò §Ê¥¥¥P6¼™Ä+¿óá—ž˜“rp:“V#ìÎv=šÙÊðvÿªX»¿Îäž¶ìýŸ®?ɵ۷ =½“3§²ì²&Ïû+óô¯çþúwiÛmg’ ž>.‹ÙòÅkØeÏö}Xüo6â©*]¦ÏY㉈×?!Xñâ2²´£DN¥¥T¡Ì:“G’ A<®òÓ;M&qk§ÏþÛ #G²¶±„$ITž—Yt䘭ô°“$FO2Ö`+:ôá*¶©•YwUÕT™íÅ VQ—@ (ú©tïÌ×_´"t|m|ÊU îà=Ž~ÇLF–9F¡Ô¦AÔ lH÷’xó‡5Œ¯l š¾•Ÿ‡Ú±uB[êT¯AÝŽãø9Ô–Röùˆ~žþ $ß?ÏñW‰}ÓB²¤|ÿålû<‹x&ä£ö}Yr!‹xZøP¯Lfá<ºå"‰¦‡ôáÚz%Óml*VÃŬ E’PdÑUÙE™tƒ·LTfÜÇýŸOµ´µáêòÕ\NŸ*,¹g1;´.dZPQ’Ÿ,ev;·B\d€FóŒýE5^ ( §~¼NÄ®·ñPXP®×Bö…ÞåîµÎï[ʸ+¸öͬs?ƽËÁ)oóñ†ó<Š'òòv>ïR:cüÑÜ›vüÊ‘kÆñÉÛçØýÓd^sUÊ›{ïr$m¡õ¬¿óòeFì'òæ2šX?mšÕ”g9Û>o™Y<ða»·ùîBb†xšyÑ®W•L¾,É´õ¡$M8G—¼ÇGMHÚö ĪÐÊÈ k{S³WæÚžsDgm“•j¬2©ÔmŸ‹~.ÕÒ¾ÉpšGý̪‹ÆnÃ#þ^|÷~=ñ3U¢L]¢±léÀØó)ü;ÞsIBrêÏ„d.,ìKƒrvH’„¤r¥ÖÛ‹9g,c·l¥‰_ñ^ÓRXI*ª~v  ßÅÇ­Ja.I(]0ríŒï‹“BY;®%å¬S-dÇ*Ý™w 2õûà|Å+0r‰—@ x‰-ÎW5åßY‘xîgZ»¾&âi†ÏÛsYÎô¢ëü4¸>¥\Ü(éQ‘öÓ÷aúIi‰–3˜ÚЩÐâjA™ú™Ì^î¯è‚¯‹^Þxú¶cñ5 XðzMÓ®Çlìø\rSrhÄð6‰ü¾ì ‰€þþŸ,ËåÈy)z[Úm á«*Tþ2,#G®¤±•¢ƒïæÊ\Ü=›Àccé0é°I>k¸øõ*ÔS¥×pj|yÌÐðï¼™\íø n\`óHs~êÙŽYç’ÁÅŽ‘A Øíχ[/ví4+»†3«]/~¹£Ï_¼,óFvñB8_&ñ쿜­óZd#žoóýÅTñ”¬k3mýJVÌ:)HÿʨSóÙôÛxê‡Cfx¿ñ.-,³×’’œLrL$ :@éΟM¥N&¥zNöŽdKÝa0¬ÿñ:no\¿•†Ñ¹ôÓÈF ª¿;™­kâWº4š äËmIø+˜KIWÙuýœi­½°P¨°²6C,‚>gш&ø•®H›)˘Yõ ?,9CÜýÌXcɸ_æÓ¿q|ÊÒñƒï™ì}%;æk"š>Ÿad/@ „óåA²Äÿl×ÛLâ¹Úõã£xšy´gÞ®sl_8–p5Yñ@eçM`«þLÿùÿ¬IuÛÂ/&•Gw–nùšÁ-(™ËnbêŠ#Yw`9ã^¯ŠësÝuLºú`zXlæ»}§ þ!”Ã_Çã©^ ô<Ú=›n®©Ý¤’„}»ÄDÞ2.Oh|™¨U†Ìï*ÊUÅ!ýûbwêÖ+IÄ™«„_;ÀåÄPfVQ§vÿJ’yS/%y3*_€’ÃòFvñ/±gA°¬ÍW—Ãù*?â9` aò2üœ©Õk*µzM-P4”î}ØÑ'W‹²ÌˆýDŽÈýɶÊ[Ìùý-æä!`–å:ðÁÊ|`<²k÷žç”ß•éßÛžFãßc_xµvE™Xð` áÐi&ácþäÜßAø•,AÒþ¾”îobáK(Í”ù·æd²².+o¦Ÿ{6/6º›Ï†&¤àñÂâ¼ÊXàßç¼.%¾ù»4w’òU¥• &‹æß:ÄYMMÆŽnK€s ”’Žð³ç‰ÊsµŽë{M&MépìhN¾8—mˆçù}x>¿~2^jŸ‚†!„p y`î?žc‘áÜú¹5öùÑM•>^*níÚË…»ˆˆŠGr«JEë÷ÜE‹LÂ¥Ÿ?ó,ù1ãRö¾Ï¨ïzëÛç äó¾ ZÏ®ÌègÇÖݘºæ(WnÞàò‰-|7e4‹/¦ä+^rAÃB8‚¼1ÃÚ±$öêüVU{šÍøˆF—FQÝËg¿‘·ïÉÒ%¯syh9ì\ 赃šSºà”ç@…9•ߟŠÏoPº"m¾N¤ïê-L TƒÂ‘Ö‹³~´=›†×Çß§ ACXzÙe¾âu$© a‚¢€é;·$˲!*2BäŠ WvíÞC÷îÝEFE€àà`Z4oöÊçƒSIçÆ?õ€Ð’ú@2Ä.ˆ1þŸv,Þx]²ÑŸÖNÚ·a²Ñ ‹S ‚‚ „S !œ@ á@§@ B8@ Â)@§@ B8@ Â)N@ „p E¸t¶u¢ï¾ø¼¯Õ„0+À‚À…7Љœ„pŠ,)äHÖ6–¤ géUŸßŸ&V.¢qÖ]gAU5Uæ_C+JP xéQf`§¯ÜçϽ!Üz]$«THx¹ØÓ%(€êåÝEéY$TM—phqcJ$?àøÒ1 ÖüCYd›åZ ˜›‹w@@PÌ„3äfË7Ÿ¥~ÍÊ´hêŒBQô2ƒAæþÖýu†þ­’¨U¹¬¨EµbÚùP±"¶T¤òßq|]CþZ™¤6̯ZÕçÐâØW,Ûïéç93:ïßÊÌßÎ)[R浑Ì_ú)o”2O-ûÈý|Öï>Ý|d§Z ùtÉ€5@â1Þ-הﲫ£]jâvÐÙ«›ÃX^'Käôáìx¿9o¬.Ï¢KpÀØóZï‹ùxÀ±ûo­¤±"”µ cÊ»¸ž•»1yñwŒoì„ØmS ÂÉêÿR£ZììHH6ºYÑÃÖΚUÙxøŠÎâ‚Bµ9èRt©›á¡áâ׫h¿é0Q{ÜÐÅÝe]ŸúŒ9בïöýF ›–‹Î­-8ýÏLÍïñ[ßö|xµ?ø›FŠc|Ñ0ÛâÌéSиèð×è zlªÁGVÒ§Œ9l á«YÖÿÿŒ+‡€!Šƒƒpª‹¶.$È3…s«ÆÐ·]/\/m¥Ÿ—Nà•Î{¢ ¨jG\²¾È'ÚÂÊŽ{á1>°Ç¿|:£°±µÅ×ÏW·âm$§–OgÙmK¾æ‹šHìº~δÖ^XÊè¿ør‹}¶ËÆvH0ãç™üU~ OMæ{¯õÌßQ‚»¿¤o- ,ó–ìg]£5ŒËmþÚŸwv7fåáéám–ã¥úû™±Æ’qÇæÓ¿²>|ÏäµÕY²ã!}xˆ Á«.œ’$ó ì_ C±H¸B’©\-’Î.E²[ùY0 D„?âôÉ“¨ÌÌptt*f)IÞÔ;)í·55Þý…ï::£#3¼k•ÁÒx6åö nHþŒ«jKš3†4t‰ædH ‰ò n**0¥²Mú¬*¶¦’Å†sŸ¶¢§¢kÎ,¥‡WîNrØ.'†r¸Šš™YÎùÞŒB‹¢ý^máT*`æˆöÅ&áoNüµZM|\ìKY°jµš •*rá 7)f±—P5Yľ…°V–À¹tÜ­•iúH(Í”é"™æ'ÇÐd@¡"Óü!…fŠ ¯RVﲌ!Ó,^%žMÛb¹y'«6_§ÓÐò¨sÕ~²².+o¦Ÿ»°-‚—‰B{¢U  ÅÄ©›¸>­³±µ%6¶xvE«ìËQ¹jUªVòÍͰ(Uù2;ÎÇ¥ÓÞ;Ä¡GT °Ç²T-JÉa»•’~>åÎ B“ŒÊ¨°ÂÉ â#ÒGæuQW¸oÈ$œNÍç±ë®\Ù”~¿ÞLÕpãc¤4ÖÿôŸ†øqžß÷‡cíŒ@ „3GádY.N¥(>q}Z‡±<^ún¯7˜ÐNêA£Xzè ×ÏndúÛrÞ£jZ¡òîÌØfá,ž¼’K‰2rÒe~™ú ¡éÊëC‹¦öœ[ò çdä„ˬž2‡3²ôD{ÇÅì[ÄþAŒØx?uA•>^*níÚË…»ˆˆŠGöìÊŒ~vlØ©kŽråæ .ŸØÂwSF³øbŠhy!œ©]µÆ>ªbᔯ€p¾ ¢™Zù¢Ñ¥QT÷rÅÙo$G’i½ø0ëGÛ³ix}ü}Ê4„¥—íðq3j‚âŒiË É²lˆŠŒxª€&-XÏwõÇPÐÆZw‹% *³¤Ç)NMðÃì9%|ÄÌŸøhðk/}ïß³›¶¯w,Ô0wíÞC÷îÝÅÓ#‚ƒƒiѼÙ+ŸN%OÿÔ“ú=¤–ÔYÉ@<6ºh ÆøÚ±xãuÉFZc8ú,VaávÕÈÁŠ3DÜLm×<ÎzN*û^t¬dƒ”—¥½Î75m©¾àÑU+,N@ xªp¦JrNÿr8«p$è£%|ÒÆE.¾ó §€ÿФpêîðS»Z,¹Ž6»ßB8àåN¥0 r¶.ÍÐ}âœæ&KêØøù4YÏ…åÃhTÚµÚµµ=–p9é1[»TãýS¸0©6jKÔîƒ9'#'„òÇûí¨àd‰Zm‰[·øò@$ºâ"rã4DóW÷rø”Épåª6æõ³òðƒü[ºº[,kSVKoæ_ô°¤l‹N´ò·‚ôcdü-„S ^8…ö§é¬Ú'M,Åô¿3ÎarN¶’£·ðõV¼V UL(§NÅaŽ ­ƒO3¯AMVö9É‘÷ʦ/mö÷»­zúuæ¯ÿ’&)ü»z";¿ó?èã©Ì9¾9ÆUBY÷þø¤–šD¢î\dÿŸ?0£÷zvÍÜÀoù`žW†d½üd¢dOƒ1³i`âœòM ÅÛâTå9«6¯s©çu17‰R•!¨eMÊy¸Qºb#ºômKió'¯ýƒÿ1û5ï-ÿŒ¾ ËSºLÚOü†ñžGøq×C 9Ü3í»Ól ²ö lÙ²øT¦n˼¿x=«ß¶ãÀ§3ØþP—z]b}ú6M+ûQ¶œÕÛŽäûãQè ±ìÜŠO/k¸2»åËùQ¶ÆDŽ'$qeåxºU§l9?Ê–¯GÇñ¿p!NŸžö«^¯D«ï®£M³Þe£ˆ Èú®ü>™ÎõŒþkÑjø*®%rL‹@ Ѝp*äcl’Î¥ýeáÿ*ŸfxÅJ4{k ³Vî"4Þ`r™ÂHºqˆ+‰×ù¬¶%¬¬S}u>¾œDÔ­(49ÄF©rîÞ”M¬¼t‹ÑšýúáŸrœõçâõ1˜Ñ—IGÊ0rÙföîZϼÖQ|;p,î«iúÝV>(oNù);¹Bè‰Ï¨¥6 QøÒcúOìܳ›í«ÆRáÌlÍû‡„,ß^ÊÙüÖÝfÜGû(=æWvØÏÞ‹ÝÌ3DW­@ ØÃö¶quRuªšeéÒÎÒÅ­{|‡U)ê7ªL)%¸8ãé—v^Tf@ (^™©«6;åÌí¼©º*;*´ìC…–}7áu^¯0šŸÎ~F‹F’qi3}úµêRuñe §WW—|›Ð*hµÚl¢¡E/²­VK¦+4Zô¤Þ?þÆ ®'ÝâŸ×«ñm– JÝŽ$I«F/ƒ¬×¡Õj±5ul9ŸÌû…Ý—£RWP· :Y‹mf?úÌ¿U¥^§{ùߘҼ%¿7kBÃÆ-èж¥JH¢& AñN9WáÔE_åÜiGJ¤WbWÊ&“p&[Ìì].´n]‡r:nmû‹KZw†º©@eC)%·÷àRw<-K`çёޚÍ#ú2]žÉÛu\‘ÃCØ·ir¯O`‘c| :‘Iy…‰¸{Û¢” ÈŠ*ÌÞ¹ŠNÎÙȵþÎá¢wñÁ¨ï‰êû%~¬M){5)§¦Òrd’ÑÂÌȯl[”gȪ]4?º›=±wÑP¾]Ò•ÿ˜F;±¸@ +áL]rOB–³±~d Ý‘‰´Î²QG½÷Ó-íYB²0çþÿ>¡ÇÇ7‰•AíUŸÞ‹eTy dÙœ&L¦Aï÷iàÿ8¼ÅöKßÑbþN~sÀô1-™ÿ°ô z˾|`§Ê>>éñÍ­3ËK€Ïé_~áŠEm†T.¹6Òì`ë©(:´qÊÆÒ•LþN G{ÿ4!Ú LèÝ2 #êòUë<ÉyU–¸(mðmØ ß†8¸9_›ÉŸ!ãiP·„¨Í@Pü,NÈö£ ÉÎÛÓ9'Ïo>bHš@”Ä»e+d2P"p4\å¸7í?úöåä«`'2èâîr=ô–údbî^âЦ•,ÝGÃiïÓÜQBahλ3ô£ ,ÇÒ¹ªD]çø®Ã^CÏrVx¸*¹ôWÛZáj¡ÆÊÉ/ÅÿØyü!¯µrA{}ó¾»’gæ1MYÎöwrȯ|{؉&MªRÊNϽ}{Õ9ó–“JL‚â'œR꾆ÅäkC•BÊ~Bœ*¶ú“³èeTz…•þ5š0éÇô¨ã‚™ ²dGƒ©?ñµÓ\¾žù6Ëâµ tb¤­Y¶¡öð!T7—n-g‚]~Ú>œdü'¨;Ã{ÚôÔ‚SK ©zmt˜ümús3í^Äȯï/ƒ…[u:͘O¿2fbrP~Є0«j5‚ß½ÌÉQ>…WùΧ¶8erì-z™Ӗ[¶´Zñçròh:îiæN³‘ h62{ÃÕ²B?oí—ùDÇwœ‘éÐà>i¶±=?JÏ´û(2ÿVútgöªîÙ[ã/‹pÊ‘¬mR’7fR:U¤íÐ9,þ¸Þæâ¡/‰p*©[­‹S©@toY$TM—phqc¬4Ñ\Ù:‡!S»Ð§\»x!6å/’ÂÝÈZ’ŠÉnœˆÝQŠú+R)°!ÇÍbHß$ )”µãZRÎZB’$«tgÞÈŒ½’BY;¡5åmSÏ[xÔeØwÓ?ÿ1<>Á‚±•$$Çš ù- ¤våXPyÚLmWs ¥éùÄc¼ë®¦Å¦ÇÛAg;LÈÛ? ßÍŒve±”$¤’µ²d1mmè»/>õ‚ÜÒ–ðA1Îâô5¡Îb‚>ž°¿Wòg˜9•–ÆÂÅŽ‘A Øíχ[/ví4+»†3«]/~¹£C$Û†7âÍÐgÕI®Þ¸ÊÑ#¨nÖÅ®áüòOïØwá гrà0Ö=L[‰CÃ…o~ÂbÒ¥$ò¥ÁƒMÏçE.þõwø¥w>½Õž§®¶s6+¦²-ÎXNy¥­Pâ'ŠŒp*‹Ùg„ÊL߾̮8"“¼© v’„¤²¡l‡ïpšö¿÷õ‚û™±Æ’q¿Ì§ã ø” ¤ãß3Ùû Kv/rò¯»½¯÷Ø3|Ù\zÖ(ƒO`7>]<oc9éóH›¡â'ŠˆpJRñZ½F’$aqÝÒAÕä[=Éݫ[Kæä¶“„ë 9ì—C™YE$¥vgJæL½”DäÍ(ân&T®HÇZ9ô€˜QªžÖi'Íð²N!2!M–Ìq«äAú²Jœ-“MÎçEÎþSnä¦ÂŸfå3¾¹µô ¢‚:52y¥M[(ñÏÜcù*'^L*ÂÓ¾•«VÖj'p¬üXÆ÷ãO²².+o¦Ÿû“ï} òeE¦î ÉdI!=aËÈ©Ÿ[=qJÆ¥åè?Ï ™{ÚЄ<[ø è gJJr±Jü¥ ^‰BÞúצB ϼ„Í󭤥{òq÷©´žµŒ››âG0¿ï§ï›®Ot™¨}à+­gÓÉhz·w,Üqw…NV™€;€.ê ·â 8åû…wMJéÿfÏ•D:WzJº¶—KÉ2.€Ú'÷´ ÏëÎŒ~v´Ø©òç ¨ï†üè"{ÖmÇÐw#ºðÑ[Óhÿö[T]1›^vĆ举Z_&­;Î…sù¾Sóº¼Ãowt9§›\~Ë226Ôþ.•’òÛ©ÇÎg@ðÿöÎ<<Š*ëÃoõ–…l@0@"H ²DbT6QD—8 (¨(âŒ: Îˆˆ"Š£‚:¨¨¨((*|耊¢ŽHØWQ²wWWu}¤:M'Ý$$ä¼ÏSOwU×­{ëÜêû«sî­ºgžÇÙØÎÓ"œöÕ™¸$‚)_,äžÎ!¥¢i8}ÆK_Z¹ùÕr{¯DÚu»š©oyp £V]ȼ¯æqskÅsò8¦vä žý(˜ûߘÁ_zuäܶ]¹jò‹LŠûžù«¢WW8 stg:6qphwާ ˆpŠpžñ¡Ú:AW’šÁk3?fÇ©ÔC¿p@IäÊ.á(îmÖV=èÙâ8[wä¡`#æ¼VØÊ™Ãˆ±“Säª$?¬u³Ù'‘æ‘QDDFwà òr‘§—çÌÖç¯ãŽ/º3wÕË\[õìÅŽýØY²‡çzÅá>fDôELË´“s0g C;€¢4ŒêV3˜‘D÷—÷¡U'½¶ŸWS‚éüÜŽR»z¯Ÿiå=l$”zzW­Z»Ç2œh.Jû¯_ÌØ«'0pœ™U¯Žà\+¨š 0М*ªêUC7ÀÐUœª³ô»¡¡ª*®òß \šUu¢¹ ݉ªª€ëØçÜ“6‹cãÞfÝG}hß,û÷ãé~kªª¢âD7Ì´êÝŸà¯Öòþ;8Úc`Žvò1U§†a¾€W6¯ -ÆäëäQ}œ·á*-·ê½îÙþ¾…EAĶiP}œÎ:«Š>ŠÂ†JcâÏ;x!5Dþ¹õ© ICocx·ˆÒ;nms.èÌ›·§óˤXÅBõwߨʋ`¼pÖɨZ·×Ù$y.³3bø½\ÄÊ®¦El ç_òõ¶Fô-"Ëyd#³#IIˆ@1 ãDØÔ㘥a³ —^þ»zp#éÎóyòîþ$4S'Ù[·“«µñ%˜hzÉßy?íe†ŽÆøÐ•̽!®Ô«õqL[ÜÅ´g9Ë6dsãðþÞý¨Þýªž#u|~|ýu¶_ÂÄîaÕG]…Büú3ù:@1?MĽâ‹÷FcL!´J –mµp¡ª® g4žšÏ1æ‡t¡Ôñ=d}Ur r‹\xêd-ºÈ%c¸vÊWäœ3˜ñœ,zh*ïmÜž­+™ußL¶'ŒæÎäÏUvLs8q­-Z÷¿gq,·Zt¦²“/ÖA5\íXijÓA¡<,ZšÞÌ9ƒfòé+½ùáá<²òœ•ÓÕòj¹9‚Õåée?³ëàvþú_<ýoe:üœ÷‰u=ÿ;23ÉHßÄw+ßeÆW2l~—?5«¢•3ª3±{*©©©¤¦¦Ð©¹%,žä RIMíBð·ÏrC×(EA±ÄpᨹüZP±O¢ÇŽ©ôïÞ•¤Sø_Ä0^˜u%»þz1:v¥÷¸µœÿÀšZ<Ÿ©,Ko!vø>™y+î¼'¿9†îã˜?•DÒoæg,¸+‚ÿ{äjz¥^Dïá“Y¸+œ¸%€ó.$¥mx„Á}/¥ï僸þ¾Y­öcúGëyoT;¬Õ°s½yL¦.Ü9w ;öícÛšgè¾q"CÝ@ቀ[gMgçµ Iß—Îl¼“6„[ìàÊáË ý³¦O¬ÜÆÞÝ¿²`D3†ÜÂÂCHg@éUÒÿõA®ç¨£˜ŒÙ­Yr×=,ý³2O¯&å ÌÛ^z—à©ÈÑUþ7¹#ÖÓf£†,ÏàÅnAt½ Õ00Ž- oHmØIá<³„Ósdˆb†+çXvµ´òóåÜ:z ùy•î³|ÙÇÜ:z Gÿü£Æß¹#ƒž½ûr,;Kþ5µˆ/;³n}¼ä½¯o‰eÀÎç9°ñnâÌ'ï‘·r8ñãâù2s™3˜‘|Óãs`Åœc´Ý̹°Ïõú–ogpÇg°q+Ouu÷,;3yöü>ýë.6Œr2ï¢N¼š¶…ÍvĪíçUuÓá·¹´ªô·åólòyüëÒoÙóFšü—›Ú¤a[¶…ý¼4³†åÓú¤»^_öxþ‚¯8ðÁDœŽŽ^î5¹ÝyW­p–ØYçèšç?é%–o>zbTgèu×séåܾ_2MËÅÒŠ=£ÉÞ´“¬ÝëÉ,ÞņnÁL÷:rÂþœ„W™»}¯¿ôÀFË.­O ø2‡Ó"ÄΞJGbW^Þl¿å!ϯ=¬œ{a;B̳¦6ª=; ÒžYˆp g…]YŸ0fØt²ú˜-_õ#1:”’u#i;´0ÀWº0Ì=Xpp£[ùè¡Ðö×,½šQ¶1y?ÞS.?uƒWŸ+ëãì¡`¶šQNSž~mTv¤¬n§,µfçú@=ð›ÕT&>xI-B1+Y›#§Â‰{Ön!·ÌqÑþ`ãÙ4ïž@‹ö}Hä7­Ë¢:~Mp|ÍÒû¦òòFû)o`ö8µ† Bãõ8Å \8O®á ³Aóè8ì¶PtKæpr ޲é€BR,(†—KC×4p–AðÓ® \8C­Ð6¾Õb@AAÙÙÙÍʦÃ9ÍÁpb¸4t]CÁ%‰ ‚gãN_±ø‡NN~ AŠŠÍfC,f f³\N\º—KEA—x¾ ‚ŸvUhà§Ã ÇŽÛÔ‚K×Ñ4 Uuàt–zš†Ë‰®;qiZéº\$‚ âq6fá4Pø#§€˜ðp Ã@UUœš†®ë`èºMs¢é:Š\$‚ "œK8}oÏÉÍEmeÃjµ¡ë:.]/uÁpáÒU4ÍYê.A&‚@»*4áTzùw]s¢9í¸Jò -ÆaÀ0Àîp`·Ûq8d/BUAÓœ¨ª†ªêŽ!g5j3’ÏgÉ}™ü|ü©ÿ!µý¼zQ'^MÛÂæG;bõ^?Ýå©éñOWÎ7ß-mbÝRç³£”M£kN rÿ$÷ýù{Iˆ Eujhš†ÕfÃf bçÁ| ‹Kp:5œª;t+Sè4Üé{Œc,î« (‹5†”´çùöØÞ8h{˜“L·vãl°-F’†ÞÆðnuÐxhì_ø3w]Çò=YäyŸþဥ%W=9gF´!,ñ^˜7…K¢÷DOÒ.Õ­Ë]o}œŠÉŒ¢˜()þS‡t¤©MÁì±µëbý÷ ¥çÜ#ØW#JQ¶ŠüšÖŸ?{ø9ñ8Åã¬wá´ÚB°ç³çh1öüC”dm¥èðì‡×¡ån£8ÿ(‡Šê48ìjÏ{”\$èE{¿âýÕÇhÙ§'­¬€+‡/'ôcÌšN<±r{wÿÊ‚YÌr é„õ{¬’JJJ())`Ïû#hnNbphüö‚é‡XxëPž>p5oÿo{ÿû(áoOåÿÜB§í}“‘÷® áéuìÁ/}^ä›ôŸøhŒÎ‚±÷°ôOW¥û§ÿë‚]ÏQG1³[³ä®Òý«]JsnZ_Ä÷÷´$xÀrŽ%Ÿ"¢†õ˜=*?Ni—ê5T ` #¦]7Š9ÑòQL±a%ÏK¶+Š}6§i?g »ííø>7‘ÍŒ{.Q¡áž°/L¤GH6è©üwVÂýȧLûO“6¾Àí]ƒˆìuþ¶8…y_þÉÈ1­ .¶âÈ|™;î^I—~aÚÅa(Å~zÕ~ÂK_Gqï·Ï‘vA(ÐŽ§ç~Ï’‹Þ*ý=wÇ,0èbbÍÛšø®å]r>%徿‘R¶Úv,³ç|ÆÇã–°}v.r«GP¿çyeü¥œc‚Ä)o2ýãN<7o}|{Õç:ÊŽ`+_wÏ‘ƒ_bR åñ ~cŸo/&íßùœ“6‹¿^ƒH¼áA®œ”VºLXµë¢:ø«?¿ö¸ÍÿùH¨V¨‡7U\oÒ´%¶ÐËù1ÇÁ6GÎ`T])÷‡mQAüxÜÎöãçPä”YQ}œ†Fá¡xsò •Ħ¥#i¶w=™Å»ØÐ-˜é^)öçà¤5A€‘¿'†ObûµÿaÓ} gÇŸÙoêÄCË·…$ôã¼à·>o4w'Ïel»vÌ¿ö]u·¦]ABXe¯:G×<ÇøI/±|óу†B¯ã¸¥n—…öý’iZ¦`–VôèMö¦díöw®áUž=@[UÄJ›ž‰”Ÿ’­9qaöUæqÙhÙÅã8æpZ„ØÙã±uê¢:ø«?ÿö°t>g.ÑÍÆãq–ÂŒ`ì%'<Žò?‚)ŠŸŽž¼]h঻3 K2mëXÜÿY>Ø“ÆÃ…aîÁ‚ƒÝÊT™«ÅÒ{®ãE&òÍk×ÓÊ\®É(ÊIeà Oèù<ö톯^Æò•«øìïyò©»Xµé5úˆ#º²>a̰éd=ô1[¾êGbt(%ëFÒvha`W³¿sÕö×,}%7.&³©ÂºB阄JS˜N2ê‰ýOg]Ô´þüÙCÍð>âq6zêwp,Ò—p𠘜"àø>$ò‹ÖeáÛpùj£>Mbö'ÓéáÑššÐ¼ +*O«åìà@aéZй©´Ñ3ùzlj8bÉîµl·{œ·¥)]aÊœE|»éC.?ºˆ7-L˜M”¾¸£¬>ð›ÕT&>xI-B1+Y›#§BXWcÏÚ-ä–è6þMóî ´hïï\«Æ¿­j›ê×…ï«fõWÿövUú8«Áõ‘Û•³œ%K–ÔzZÞ>2¶m#ÌÐ):ü=oNúã-ïäê„`ÌMF0mô?<ö¦Ï3¦WKŒ£Ûøzé*\#ŸcTá4†OÚÊàw~fL[»Ý^ÚæZƒ°Å3à²(fÍ[Èo7=L2;ø`ÊL6 )€åÜáÿš¦¯zÍêÂ'5«¿úµ‡ÐPð¼BÃ0\9Dz«u •Ÿ/çÖÑc(ÈÏ«tŸåË>æÖÑcÄê Àã¼ñÆÍùªéÓèš²”û2þǃí-rHýÉÿñL3Eù©üŽ \€P;Pyî%8îþ,ÛVèÞÏîNçtG/¿£w÷I+ œi¿´Vû3 ò~ZÀGY)\‘ÚÃ+÷Ìdêó =Wþ.gC´BêO¨mäJάfï è*ØÌ¿ïÏGì@‰WMbé¿ÇÑÞ*õs6 õ'ˆp BÝú¼4í?‡~Ÿ#¦úŸÈà AAáA„ÚABµBµ¨‹g9AD8… }¡1#¡ZAAáANAAáANAAáAA„SAD8A„Fˆáµxo§ŠÏ€Q¼¾—­›Ý¢jl@ „@$ÐÔ½D¹—p÷ï¡@°;­ÕãXŠW~‚ ‚pºE³lM§{qE”ηY@é<œesq–ÍÇ™ÏiœÓ¨b=÷¥ü"ž‚ Bmzš•iáGëò>-¨21,S÷²ÅàÄìÛe‹·`Šp ‚ §[8©DƒtZå©YF%Žá) § ²{fîòQ`oá”p­ ‚PÛ§« ¡ôMãô/`3Bi^‹Ó-'ú8áAjQ8ñpâÊ´È[Ÿõ:+QK€…©L0õJD³l0 $‚ Ôx–i“ç!oÕ©:t[­P-Tݧ©{ ¥“ÒQHïÒå±.Â)‚ Ô•pº<ôÉá^T"ªûL¿…,>2Vü¨¸§j«îÅAé£'žž¦æö6ÍTìßñAN·hBÅAªº‡SçðXʶiš¦êmVåq> ãéþúM³G§Ç¶²ížýœ‚ ‚P '‡jíœxFÓî¡_N}uôU¾$!>NïQ³ž¡Y;óº‡hZ8Ñ¿iÁAê@@½Çà”…kí@1'¿äÀIÅ­‹öqúêlÕ==Nïç9©L@ýõq–½À L}¹Äe…©J4E8A„ºΪÄSÃ÷s./¯5 Ó3L«xd\†îCX-îŒÍT|nÓ{$­ˆ¦ ‚Pâé©QžÏuêø~ã^‰ÇY­ÇQð!ž¾Þèéeúò4E8A„ºN_¯‹õ~n³ª0­O?Û=?MŸ•- ¾‰h ‚ u)ž¾æètáæ”*½M‚æK<Ë„bé=Šˆ¦ ‚p¦ˆ'T|ÜÄsme³¤§âqzÿæùÝ×HYOá¬*­ ‚ Ô•pz÷%•uGVK8ý ` ž¥ˆ¦ ‚PßâéÏ X46%Àu¥ÇA„ºÏ@'¬6NEOu_GA¡¡y¤§,†ÕM#"*‚ œmb°`ž.±±A’ˆ ‚ ‚ ‚ B=ñÿ‚iÕ‰IEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_design_reports_details.png0000644000175000017500000020760412235000130027274 0ustar00murraycmurrayc00000000000000‰PNG  IHDR6²÷ŽfsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ:-$m£Ã IDATxÚìwœEúÿßÕazÒFvÉÉ9™PO œ9GD1aÂpæt*æŒræÈ©¨¨`F2(¨ˆäœv…Í“zº»~Ìì‚’ïäûS¯Þ¯×¼–Y¶««ª»žúÔSOUB¡P( …B¡P( …B¡P( …Bqà‘RªJP( …Bñ‡¦OŸ> ¥?"ýÿñ[q‹'Ð ƒ/¹WZ>SÕ¢B¡P(Šÿs²2B¼þèuBz.†¡#¥DÓ4€ àr‡Ÿr—¦ª:Ê#¯-7DBœ>à×U5«P( ÅŸÀNº ´}¾FJ˧ÿf'•ŽØçt$šC×ÈÚ¼8®‹'÷3/¦NÜNòáçÓèߥ‡µÍ±x‚î=z@&à¤EMÍOw'a‰Åùò—²q«Îd„C”UÇwvë( …B¡øãŠ!H$¶V$XüótúÞ…„çЦóÁäç„úM‰$˲h×¥¹a³Æ³‚çy”V%Y4ï;’Éä>¨Í¢IÃúd…ýdý,Z±–%ß}ÊÉn=ûd! ù›cü6-Ãð±1¢]8HYU !ÒSWš¾µêÕx… Å M×RâyÞº… MC鹸’=°Reòp=es €„íPR™à§éŸqôqƒiV/´Çö¡i‚Me ¾úücDßã©›% ú}”UÆØ¸¥”ò’B8– ¥±§p\MÌ[^ÄügÒ±[_êfù‘¶VÆùåÇtìÜN-óñö! ÷øzâ·è†ÏËFz’œœ\¢™éÐî Ò¢&@*ƶOG‰„Í Cï‘^z Û*«j ‰W]„[4}]7®ZýCÐ3 HVü5Æ?!q“Ž]7ÐuñÿõýBà9I’^*?†.ö°@ xÉJþ¸„Ê@.mÛ´ N@û}2#=’ί…’†¡#þù$pÙ¼b%+·TjÖ™. )“Rê™ØÑ2–Ì[Fuvcº¶n@пª#7i“”¦¡£)÷³âÄ[ãJXøÃ$úõL^v˜Š¸„½Ì¿d…tìs,¿Ìúœ#?)%qÇcõ‚™ >å¤T'öÜž%ЬQ}ÖndÓÆ5äf¶EJ(\³œfÍZЬa•q‰Hçå×^ÛÓÐuƒN=û1õ«Èí®ôZ÷ìL¿sïÞ øÒ—IÀ#5•ÜIØX>®çLßPB…?.¢ñˆs¹¥A)O??©ËCtîÝ6®fÕ–(ކ  aCåúj*KñóÜx5¢]î‹K‰¢Íïy2%*Òý¹¦ fÏ]ÄÅïAÒñ~u­©kL˜±„ºur0 #-VôÚCm:Òö¶mÙÄÁmëññŒypwÖm!¤ÅhÝ"“Éó–Ò­S<Ï©E®ô²vÔHZØh5^ ‘þ¾³°©qÆxrW‘”H™Rm›7oŰ0 #!-Às]×!‰£§ $¥ÚGñ×Á“©Æ%d*æCÊšö%©Þº•Xv6×Û‘Æ™Òu(\¶‚ç'm$3çèórlrÃǖѼ©ƒž]—'ïìͲ1ßðú¦2c1N:©Ýó-Üh_»”ŸK‚TFzãq4_·–f2·ÐáÒ¥ñêÌL¶à˜–¤N¿ÇqÈ o<;›Âæ‘o¤=EîV­ŠsîyýèŽ3áÓ¥Ô,r”qV,XG÷c{pC›L,'¬Y‹˜°"NÃÌõ\®Ò‰æ:Éxœ‹–0f!4m’‰–nß)K!Ix@ù"†=½Šœö­¸îÌöô=<ŸWžÙÊS§Ú3¹øœÃh—£S¹¹˜7>_Ƕ†u©\½!#N ñÒe|á4åÆv!¦ŸÎ↹´w뾜īU¹D6l€† 1 3Âhé&^út=ÉôP4é™téÕ–3{×Å.ÞÈó-¡ÓÐA Éd6Æ à­šç›‰Ý§;#ÏÈ#l "¥¥L™³†Åeu¨“éS‹%YSûÓu½ZOê==BÖz|"í±Ñju€ëJ„¦Ñ¯[‹Ú~¾VسâyÛ½ºBÔL‹Úû{žÄN:h8Ö¥íšå3ü± ôíØ˜ÓNìIVØÏ+ã¢[Ç6Ôè±=6;Î_ãhôôG0vçÆòj¬¶Û ªiC‚?¦a i®ëâ¸.‰„Àô% X©{yHÜí–_¡øSMH¼] \/åâÇlrZg‘ëFX°"AV~zuã } g}îÑde¾~q°˜Èìm÷íL=£”g B¡ ξô(z]ŠŠªð׫ǹç„Ñޞĸ$2É HÏÁ¶=B!¹AèÚ**e}²…$fÇÙVQML·ÐðÒÓ[ –ÿ²…G  _†Gi) :ûÂ:$¤@×]Öþ²Š¾Cqnƒ$+WnÅ®“Ç€A‡óõ4îŸä…ÛÛш¿,Ù„›[—®í²y}ú6ìÆøÒSc/<éâóû°Y!*öŵâGÔØ7¹}zpÓóJ[Ë£\öÐ82CþZ±rD·føL=í!òj=@Û§µÓ^ObY>6y¾ž½œC:7åÍ{NK ")zÿ‡œ|ü‘Äí$ißš7íIÚ—Ö¹[MJá¥JX›IM#à÷ð[hš†ã¸$“Iì¤ëº„‚A222j ê¹j*JñW°2-v|›=/µ G¡œLÖÏYÈ ,òsdlsÉËjNA§æ4»ˆÕ )òºpêaA¾š$éØÉ"òóZ -—ìúé‚…_Ìä¾ÙÛå·áÙ+:pbû Ÿ,«®õ®ìèÕu…¿gq~ nïòýÄŒúÉG‡nÍÉÃÅñ4Dd3[êµe`l]±ŠûÇü̪`[Þ¾©3A! ¶…¢ÜΜ۶næËËÙb5æ–³[Ó¾ešýR‚!ÉŠb&~¿†Í‘…lšÔoÙ ÃqqÓv5±?Âêtàåû:¤sã³é¥ør òw ©~úr19´ø8»wSÎÌ_Àc…™©x—ØFî}j.Kƒ€?›ÞmÒå••Àa­êbâñÍ;_ð܃ ?ÀA-êb­®LâÈî~zKDcþuk/Ú60yìõÉ$šœÇ? Êù÷Øïù~S“踬XYȤ%e”–Gˆ™y4i’ƒt=¤²YŠ¿€ÍÚvÒMÇÑi»é“EÚ³½Ïi ýÊÓâÖß6mT@ßnp]X<Œ•¤îå¸)A"šµ!)šHå&éxHéѬQ}þýíti]!–Ï`ä+9¤Oª#±”J/QBì IþCaãyÛqkÕ›ãnß`G×t'‰ëº©¦¡cè:yuê ‡Ñu×õ°%l3!¼”’í¯´+S#¤Ëæ’ úöëÎéÝêPµ~ó*-ü`øê’-eQVÇé׳ýVTÓ]··(IŽicädI–lviÒ®%ñ5[Ø@ÚæZhD¶¯[J RÓ?†ßÀ—Þ…A³2hݺ™¸ÄÓ!t2ÇÌ ’M•qüõ’µv kN¤ÄWÀŸ›Ë ý»"‘¬[³…H‰M¦^Æ‹_®à´^¸qXsð’lX¿†Ñc7QÖ´€HI×ñðj‚¦«Öñć¹u8õȶœpZ'æ<ñ¾ÌàQ¿óA é®ë²dÝVJM -]¡îšÍ†Ò£Qå›7ãî`:„ŸTñÝJh×»#¹v”¸L EÚ¯ÛÊ–Ì *#l²u +hb¥ƒ`.íÚgQ½e¯Ì69¡GWî>\#QUÉw?­à³¥•dÖ ¡©×]ñÀ4´ÚÙ¨h"Iuu5…7ï2H^AAÝòòê`èzzr9%ˆ|¦‘Ö‘¸]+ü×£:žÀó<â ›`Z¸ÄIœô€Oh‚¤ãÖŠ€˜m#%lØ\Êáâ· B~OJÎèß…ÑŸüL—Nm±6>Ÿ•öؤöä웤0výë”KHÛÁ  Qô“¨†ª)°ëz|êÖÍ#1gÎwhZNZý)v˜Š ¹Õ¬X¼‘U†@×-ÂMЩQ.º·‰FÍ ¨E+îmV—lHM'“$“W•sHƒ|†žQQ²‘Ìp­›JÆônæãݯ—Óª­€Òâ.1À4p¶n"Vú?'Ûï¥"ûÑœ*–.KÐ¥sc‚zÊË!,?É­xÔ#?d-^Oi¨-M!%|>â›Ëp¨G¬¸ˆ§ÇÌ£()¤eózˆì 6Ìù™Û¿_€“Ï9”sÛ·æ°àB>Šå ¤L\Ízʪmcêk± Þ« Íê×¥­ßaUi%ÇÚ)³¹(…$»~>µ*Ð…Äq_‰i{TÆb@»iÜ1íüaÚ·ÈÆM[oO¦]ß; ÔH­‚Š—0oM‚ÖM5&<•/&xz=¼§½[ÔeÚ¢u$Ý >¥l›%Ò>Ïó(«¨æäÃ[ѶY½¼’e•1Fú ¹¹¹H½VíàI¡mµu½í­kCÑf*++ÓÓÏ’#º6M]ãyµ16Z:x¹F䈴ã$· k1Îìß‹Œ ÅÐûÇrx׿œ?°;w 9œ[_˜H®© ²Z*]±.›ÝÄØ¤—›Šš›´BsLÃÀò™hºŽ®§,@0D×tš6kÂs~$¡eCjU”â/ãÖÕ´t~ú>ŽþƒSÿ›¬ÞÌíÏ£¸:Jûº ¿ [2ëÓ2œ~ý%„2ý,ûyÛúÖ#ßË×—Såjdf`.á«M 9îÈCÓÓÆ û ¶±K’äYf.÷èѦ1ÿ¸ìD´, pè~“’µ•о4¾}×pßë…Äšæãøó¨[¾œ÷ŠZsvÛ–Üvi’9ÙdI$Ò¬Cò弴´W´mÅ×Ô¥°Jиq&Å¿üÂã"BÙ©ÁÏö)2‘*k½nŒy¤#–߇¡WµŽ9AÜõ«YP–Ë!ç ä• Û¨fÐ"Wòò““(¡N°«Iwû~Bh„LZ\L÷FÍéyÚ`>l£Y./<>‰bµ§àÕÈššô„e²em54É岋qΦ%<ðE€×Göcó†­DüÙ´Áeu$JÔÓ±{Ü8L¡øsyšÓÞåt@¯®k˜ÆÎ왺–êówx÷Eº-ê;,DòÒ#¿Ïàõ»NûMð°Î³ïÍÀòÉ„Íö)ôš­0<7åé6DÊ«tÉÒ£{7–nÜÌ7³WЧCc\×Ãu=Œ´BÙ1ö!¼ßØ­Ö“µ¢¯6ÁÖ­ÚpÃõצÔ^m@± +3‹²òræÿò ®™K2»žæå±QüU¼5øÂÊVoàûm‚OO‹G«ñ…`ì·‹‰v«G]ŸÎòŸ—³±0‡üP2Chšߦµ|²¥#Ã껬*܆mä"=ƒÌü\Æ¿?ƒMÝÑ*ÛÄ‹G™» ˜UNù-B,û|c+šÐÔgóÓ§[¨Ó½ Û*ðr!-à¥ÌftÊÖ1eaêÛ÷eñ4 Z×cÊ¿§Á¡MiöX4e9fûÆ4©¬ÀÆG^«¦,øx2umF¯üºdÝÔõ,XSEN.|øÍ:Ô“i ænÞ‚ykY˜Ûœ&†GÍàM l›_R¨¥ƒ ¥$ZYÉÌ9›ðjN8VÆKïÏá°Î4É4ð¶VòÓ¬­,æ’!’,^PDIQËô!=0L“ê’R¾[à²5 nÝ’ë ùAG¶Ë¥®_#QUÁÆ@aÍcñ‚"¶Ûø Z@²ha[Šâòùi.c|MiÖ1’ß̘éÐ"Û›øzQ³–âdå”*ÂFñ×7®ç3q1ž·h#ȯ›ƒãºø1ÓXLï?Uc“®KÜl®ö›]mcƒÏÐh•Ií¢ ±ãâ#‘ò9ÒÃ0 ÊâÃO×Ní‰%lêççñõÜ"Þ›´„Ý:aÛ6>ËW{­ç&dm@ñþ{lHM;ÕlÊe˜³¿ŸE^^Þö;wØ"°ºbe[Š©rsHdwÁ×>RA¡øËh2 ê²yÞZ^²å¯‚Ø4Ý¢n£¦äÇ«øbÚ’R#´H®YƒíZä7Ì!­¢sïôÉ0pc[™»*‰UOOµ3=@n¶Æ?o`†ãfÎÌ!'ÃÄ•&yu`ÊÌÕÄ=Œ¬ ÉoV`[êåäP²Y8w³“RXääbJ/-¼$! êéÌü~-=A(3„7i“Íus2Á“ÔkR@Ѫ-¼³ØÁ“ ›Yäו¬_[Ê⥛q=šN(«€F¡íqw© ðajŸOZI’íK(tÓ"3¯9º áL2ã1¦ÎYGÂI-õY²³2 †m&}½;Eƒl_jÕDFżµb ¾ì ‚à둈Tóùô5$=Ð ‹:y9ÔÁaò×K±™ÔÏ¢…-&}Uó=Œ'˜õý&¹©)¨ëçÇŸ72ÝIm¨›ÙÙu ›ÞNS` ÅŸ×Ï,ð\‡êDjj( ѶMËÝ›¸ôTSuÜÅM&S»žD×4lÛ&ž”8ŽC£FöÄëºx’h±x! –p±m]héELbËþ]r¿|æÅ¬ß´µ6Øé›`¯ÓJºµOm)ÿK¸vŒ¨©qý9=h"ªùài|o@ý CUŽB¡8ã0‰Ï0 Z&S¾ù”¦ûY{Ü[N ˆ%–Íý–£ŒíHb ›Œ`€hu9óç/ eû©£dö"¨JJ¶’¬Ü@ç‡PYEAf(ÀÏs¦ÈkIÜœ½®>t\ÉŠù³éÙ«'V ƒêhúìJ¡3ý“Wʧ¼ÿø©é?­*Ó?«Èn=6Ò#cS£4ÿ>jÕ¾5 ůÑÌþÊmŒ¸å""DãV-i!Ô …‑°“H)9zà©|ùÉ¿1Œ½¤’É$ýžFÂvˆÙ)ÿkU$F8”E«–ÍY8ûKt}ïÎ ¿?ÈaG¢¬¼²6Ö¶²:F¯Cû3å«q¯°÷> t\ºö:Ó Q‰¥$†”ût÷N%õèZj™Ø¾F +н4´¬<:v«G*^Ç«=J¡P(˜¸I:$ rÞ¾­ãňÙÉí36@4– ~£f4mÞzŸÒ‘H**«Ó±65gÇyTUWó·ãO®Ý_goy±m›²Êȯl¥&4<)öOØäéåL™½X,ª¶W( …âOLjÅô¾{‡b—14r?ë…» 0ÞŸ£–¿J@3|4U©ŸárËÕ‡SR²yßT•B¡P( ÅFÓ4¶nÝÂË£bû'l„d‡}¸q¿r•+ …B¡øC 4dÔÜ«çHí±©P( …â/ƒ6 …B¡P(”°Q( …B¡PÂF¡P( …B …B¡P( %l …B¡P(a£P( …B¡„B¡P( …6 …B¡P(JØ( …B¡Pü6R"%V€ŒŒL‚¦Ø¯Ãµ¤L‚ÊÌ$lé©ïúŽß÷ï ®?$é:2ƒaBûY? …Bñ?”ÿõõB3ühbßm”4Ó"ä7Ó=«N @ûwèãnû™^ºÑýAB>í¿ëCÒ÷÷ÿ^åù3)%‘ª*ªvù‰âü¶„Àç‹òþðø,‹^£6èû|ܦ.KÆ?DŸEÞuߢ›’¥Ÿ=\û]3´ßùèN‰t“D£q\/Ué¹Ä"ÕÄ’îP_ñh„¤»‡—Chøƒq^=ª]Fm ìß±~$ž›$‹ãJ%w Å_Ï󨮪bÛÖ­l-)Ùí§¬´4}§Î×s]ª++wê£*+«ˆÿÖ AÉü8®ÿyÌÞìíÓ™‰šî±è_×ÒyèËD]IÅÒ/9ñ¨Ó˜¶ÑýÎ\”žC,Ãñ$AÕªo9ýo§0©ÐEI"!±Ç>Dà x|3¤­ïù¿¥ÿçý¢ÐˆNçœ#òåZçOq†¤ñß&P]VJÏ6mÙºËÿ­ÏØ­ë99'áç&I&]@ ›>,À2tLËO×±±“nZY tÃÄ4SDzIÛÁ„n`ÒÔ@‚ÐRß=C«éûºŽišh©‹I&“¸®B ûüø4DÂ&ý«=RöÓX^ö£>{•^ |òWÜ;ãF¾ÁíÇ·Â4MtM€t±I\ ºib"q5CH7I")în:ò$º¾µ˜kº ¢Qaøð¥óî¹Iì´`Ò}–!¤Êè35Û¦ä—q\øÏ™<ýö tÊ•$â6èFmy¥ë`'<)ÕA¦ …â/ÁêÕ«X¼xº¦ífšâ’a—S^Vö+ÛW´zCN>…ÊÌL*W¬`‹Ì£U›l’ÑC?ü–Û;ˆ;.¶m“Ò>ŸÓgá÷ë)Ûn'Sƒ[¡a˜>L]€ôp’6. tËÔÓZ@ÃçK÷?i‚éÛÞO$í$Ž—²ñ¦tp5CxŽíH"…3¸øÒ¸~Ì8þÖHâÔmË¥×_FëÓ*Ꭾ1_ÚÌãGTW'ð˜>_:}¤m§îjú° m'g„fXø}ÚÎ-‰“Hô@7}˜††@â&“$]+·CG §y­¦ƒÅçó¡ ‰“t†›ˆãH‘êû }‡ë]:¦i€”hºŽHç±F¸ýÞ½Ô-lü¡>p/A?‹_ú'¯-ŽÓêó¹ôÌ6,ÿp<ïþãRÆEâ`eqС§0ì¬Þ˜;MÏ.bì£ÏóéÂ$]N¾‚+ŽmŠm{XA5“ßçí ÓYW)¨ßñh.»ø ö!Ǻ©Q¶b&ÿ~÷G 5ìÊÙžI×ú!¼d„Éÿº7–4åºÛ/¡SÝàÞ«á#33ƒP¦Eo`ØÓ˹ðÙ÷vxS4g#<ù$ŸÎÝLN§ã¹fÄy´öÅX4þM&Èæ´\ñãæ•Óæø‹¹þ܃Yøð?øvK% o=‹‰Ù]ùçèkˆ}ô/³ŠD€N‡r͹}ðß>0L’Ë¿äÖg`àM—±íµçX²$Ê-ÃÎ$+ïo<ú¯+ ,ý–Ñ£ßaáÖ$Í9ƒ+.@=#‰§ì¡B¡ø“#„`ýúu >ñd7n²Û¿{ôáRîÔQ6hÙŠñ?ÌAZL¿¸×$cê˜TÍžÀ+¯\ËIÅ1²›õåòkΣmŽL#ÎÜ÷eôœ…[ÍðáçÓ:ÃE3LõÞüv)N^gÎ1‚c›ìÁû‚€D1ï?õŸÿRD ù\6ârzÕ‰2ëÅÇ™ØèHšýø6ã—9ô>û:®:¾ 3G=ÈÜÕÅ<8üLžÏ9ŒûF`ãšõ4>Lcþ73¡Tàÿç9,ÕŽÛžý]ü¥|ðÌ“Løy#þfý6â ÎïÆc°qÚÜüÜBL¿Ž0ƒd×­Ã1Cïæ”N&‹?yžQïϤÔÌçØ‹®áìÞ qíëW¯%¯û€Ž[µ”Q>ôAŽ¿ô â_|M‡ëïæ¨ú.KÆæ¹÷gPjäsÌ…Ã9»Oc¥ËxkÌ—øs,fNýžd½˜A IDAT>\>â ºÖñp\¹wïÂ~ò_OE™–ŸÓ®ΕW ãøf@§aÇ\qÍÅ´O.æÃqSY¸xŸ½û ÷^1˜3Ÿ]…? ×Þ|ÁÈS8ï¶ç3æ%þqöqÜù}ŒŒ ÆŠwîâ”!Ãydô̘ö%£n»Ã.z“*c/.5!)[ôלw:·=þÓ~˜ÉÛÞÌ€óþÉ‚­qð,øâM>~ûSÖV&öQ) Ì€dö£§sü]˹êÍ÷¸ìðƾ8†Ïm_zœ4ô 2fÜË1g½HEÈbÛ¢i<1ìF´9»¯ÌâWïãí‹h{Ö•Ò°'\q7#ï>†Z‚Í…1úžtCOïʼ‘grí;Eø,½öÙÅßsÕ¥wcw;’n¹!: :“¶m{qÅÍ÷p× ƒ±VOãækïasã£rÁ‰$&äög>£Jņ+Š¿šxj5SO»óPkš†?" â7°e‰¬-&Øá8.z6-J>áÂÛ>"âI„¦Q>cÀEGõà°S¯ä¦å<ýY!¦©¡iB÷ÁÆx~f]nyêŽ;êtyú|N«* ºçùÓËí䝯 ÛÃÛº®£éño2zb€gg|ÆQM2)s½O¹[=Û¦ÕùOñ÷åÏq×#ñüÇNªæ4® 4!ð…Ðvà©|öÚMäjI„n {6•Õ¸já”B¡Pì4¨ôE៌çÐçÇsïßZÞ4–®ýžM{€ ²µŠ„í¢iÒSƒpA32½ÃÞŸÃuÍ“8I0L/ZÂw£½]8G\Ì:ÍÈÏjÇ#_~ÇñY6ŽÔ0 /QÌë®DzÛ—bK ˆíÓjº®Õz£~eÊ¥@744<Ì:M©jÃÈ/æ0(ÇÆñR黉>Þiê.µ \ó¢|üèÌlr!cnèƒI¢3±âýŸû’ÑÇäà$%ºéCÄÊY¿|zmyôìFX±ilŠ´±üå«Ùä€îÏÀJø9ú±/xñ¸:;\_Áúeߦ½er‡!ùã€aH)±rê’¡iØÑEŒ{ínõeñ…cчѲM'N¹ÿCÊ8âÚ³ÉÏlÁ™ýzbãÝ›¯äž§GqÏ5—pѕϳÕoí9ÓºE÷#Îã ¾zèVn{â¿ç.¼à.V$nŒY¯ßÁÝ·½Èâm±}WÆžML4ä¬ûÞá®CVpñ·²<û$®ì²‚ûFŒbå¶u¼vݵLÍ;Ÿ‹ºú°¹KW¨02Èe¬Y¹XÒA²N ×ÈÀ·ù+®1#h¦_@ý¾ÜþÈýX_ÝÁõc`š+ÄÝ´žõ%•$]IÛ>ǘò·>?žµ70ïë1<õζÚjE”B¡PìÊc j 6Å„ÍJ>ze 6TÖ gÉ7<üæW”TnáóÑ÷²"»=-û^À]'TqëàKølÞz6®ú‘×ﻉ¯Ó°våwmôçsAË1ìAf¯,b͂Ɍy?3¶™ìnòÁ´ÂhåE¬+Ú†íx jôŽ=L„Õ‹VIÄ-Îçâvó¸aè?ùnykLaôƒ÷1u«‰±Ót„@h:k'?Ìã³r¹ÿ¾+iôaZ&2£WÚ„uÏ»”M–óé3÷ðìOø´íåÑZœÉ©ùßóÐÃãØR¶˜'‡?ÄJÓ‡ ·çŠSšòò9góÜÄ¥lÚ°‚ñÏÞË3?–¥Výò» )A·è–áá4?Ÿ±^D3£Šßœ@ûc¡ ^`ÀBÈÔ27¿½n‘ÓVP\Éq·|ÄÛgP59ò–—ùäáKh)ÖðÙ{c™¹ÎãСCéôð4“ð¥ƒu“ ôi€F“#†òö˜‡8¦q”©åóïÖÑbð™Ú0 Ð  }]d&4¿ßBÃCøërî]/14ïK^ù5çŽû†EÒµyn[Зq“GÒÚ‹!M zéµåÕÐŒºœ:|]Þ‚üSXØh(#Ï7¹°u€¼Ãž¦Ó §SÏH·;+€_‡@³#x~ôͬ¾ÿ"nŸZNýö}8§_’KoEãÎ7RÕý ^{ùVÖ¿pm[Ä?ÁúDÆ®šB¡Pü™Éy¹f ú4âV'ž|áJV\Õ‘`ýÞŒ)Τ]ë&@§ÉñèRø[u䳚ñÐc·ÒX÷qÚ?ðHïEœß»Í:䙲B÷á÷¥'A„Žå·Ð„‡Ôò¹æÝo8®ê5þÖ±9í§…™Ô t+@Àµ¢Ãð§l~0¿-gXŸ;OhGAë+Ya† ,4!ñÜ,þ~Û¥ür×!äçÀ¤Òl®{oƒoqL§ætø…Œ[—A~X ùüÒÓB;öúEs>gÑÜOø{‡|²²sÈmÚ‡fI¿ë]Æ_WGOêLãÖ½¹úÍ%ä„5¤Ð±ü~táâÒ„›ÞŒ/¢E‹“Xrô5®Fï¼Ãø}¦[÷H)×6­„Í !ñDœ¯¿ùЦMšqÜñB éVüïª}ð¤ËW_|ŽЩc'¤”ª6‹Çùê«/hݪ RmZ¡Ú´tùlü§øƒÚ·ëð»¶i%lþ€lÙ¼…P(ƒ¾J(R¢Pç]p?ò]»týÓMIoÜHnn½ûô%RmZ¡¸pÈP{d$;u!™LþnéªÉÞ? N2‰ô<üJÜJ5¶Süð¤Ä4Mªª*ÿ”»ÊÚIĨ6­P¤Û€Ï磲¢âwoÓJØüq{íÃWÛƒ+CžjϪM+í÷h¬{SeÿI§î&mâñ8¶#÷’¾‡·ßÜKî”·?ã(é÷6€Rz$ Oî÷Ãý}ëOâØ ’Þ|&5eÝßwSîáÛÞŠåa'¸ò×÷Qãóÿ»v°/ï©ç:$â1Io—ïý^¬Îž¯ß[Y~›Ç´Øùmä>——ýx_%N"NÒýíý÷§üf ç9I줻û{ÿ¦ž~ßv%q$¶ãýþýÄ~ÚùÛŽ´Mu¤Ýþãöm¿«°B+ÝÈÓ'3uêT¦LÊÔi3øaáZ¢®L5âýôRøÌ^ÿw6jLŸç7ì.›:‰’ÉÛ¨ Oz€õUޯ̇¦K6ÿ<…‰ÓbC©­FI‰e\{XO^ZäíËÃEÊ$ëæ~Ïê’ß»þ¶p÷‘=6­êv96mνËwc=„¯ŠUó¾còĉ|;e:?-ZKT ¢›VóóŠM¸2õï3öLN9¨7ï—@ÕÊŸù©0‚õæýß̪m[ùnÊd¦NÆÔi;~¦2cæ/ü8á1š7jBƒ§ §r ¿Ì˜È¤ŸŠñ´½=/å_=IÛFMhród„.ö7ƒ!ˆnXÊwó‹ñÒß½ÊBfMýŽÕÎ~½3BH›X°x5Qgoïë6îUÀ¥_Ç“IUáRæ®Þ†üÿò¾ºüðôå~ûxœ½Ô[Éüü´ú÷nWqÆß g<7™ß}½Z|:'·;˜¶ü¦,¸”®_ÌÌÉ“øvÒd¦ÏžOqe!¬™;›u•Þ~–q:Œ‹'–@²œ%óSžøßôþÁÃ’M?ŒãÒsïeýŽ¿7æÄ;ßàµaÁ‘h>‹`À¡tbÑ(¶ãfÎÊ@OÆIHË$"}.º…çz¯%§oⶇ”`ú,º&^’Hu¡dz8ˆ “•mk©Žcå„ùþÚÓ¹xq+7…[NÊ$RÁÌÌĨ¹ŸÏHý}$JÒ_(LÐÔS/ƒôH&bDc6þŒ º ™ˆƒÏ)\¢Õ\#@8à'Auu””“I`Z~ºžcÆHº¡ÃXšMEEwOG½K‰ÜßSSkUþ.®:ÁŒ,‚}gU¿«F$+y몳‰Þø=žš_ë Ûec‘r·Fqçô„³²™b¯eN8ö^;»ø-ÂÙÙìJ§ò™dÚcWqÛ„J:÷lCЫ¦d[€Kÿõ8M¦½Å sÚ3é±Ó÷ZÏ¿º§eÎÊ$œ ½É÷W…þóg©øO” K§OaÐ%WìæºðÑ¢×yñ‰<Ú#¥ŽS8›œt1?´zšØŠáñ(UÕqtº ‹TŽDb¸R ›~²_0mB5ƒP(Œo_ÚtšãFrúgýXõåP¬è:FÝx'äÁ‘=h‘µ³•»MSP½f&÷<1ŸQoÜKp/cÙ@fö.Ú`í¸§¸¦ôlfÜsįÅÿ.†Ÿb/ïón§Ûv“&t+DFÀÂÜË53n:‘=f1çÁ¿ÍÑ>ÛÎmJ€`(DØoìæú¯ÖöïìFrìTvËG8+Ÿ¶ci%[~úˆw¼‚lÜ–FÙ:¥›«è:äf®:²c®>ÿ‹Ë¹¡ÃîûÝT~mSC™™„L*WòØOsÅ[oÑÓúß³=¿KŒf˜„4 áL?—OŸºšfÕ…|òÔ‡IŸ6Ìx“óûw£y˃è1h8Ÿ/-Í ±u&ç´¬G·+Gò¯œEûvݹãó gÎègždìüj ]Ç”Ìï~Ü‘æ-ÚÐå¨Ë™Z©}¨–e3ýÙ+èÞê zx3s·•òÚ‡qãJ@¬ç±ËûÐ(¿?¬ù‘KÚäÓuØ}üëŽ éܪ-½þ~3 “ø¬Ÿß~=:D³æ-hÕõH†šN"à'è/cÔéGкCg.õ.—Ý‘Ö}Îcìš$‹ÇŒ w›fô:ó!V8†XÉÂdÐÁíiÒ²=ý΀ùeº€dÑÜ0°]n`¹«±ÇŸáòËë÷2lÔ¿}õ ºvîÅy÷£4Ò‹3õé+8êàntì|CùŠêôÈFˆ$³F_ÏÑ=;бǑ\ÿÎ\@×]–1ŠÓïNÏc.á£NZÈÉ]_(ŒUkSiÇVNåî‹еkWú}>o}W˜y:ëxü‚“¸ë©Ç9ù°.t?jc—ÕŒ@·2öÖÓéÒ©Ü÷*"reŽðþÕgpÍ´ÊtYJ=ì<ø9BbÝTn»áž¾g8‡÷èÂgÝÉìÍiá®âé¡ýiש·¼õÉ=LøŽÇžûŽ#{‡çˆ‡yœ§Ÿ¼•‹ùרXúÁítêÜ‘cÏ}žâMóyÙ ºwëJï#Îä¥Ékp…!ˆožÉM'LÛî'ðð„X–Φ/ßç‰©ËØøÔ:uîÃ5|IL(Qó3«!éxô±Ìš:…Yß͈ zï›L>•™3^&Å^yòQ^¹‰dÅ\nºàJæ¬ÿ'íZ´áø akÐÇüßËÀÞíhÒ²G y„%U.Ú.|Ðöº™\u\ êw»™UÒ`_œ8š ´Ð©`ôðsøÌw"/?}} |T¬™Äu'N—ŽÝ9ã–7Ù€@ˆ®9™!o|ÎçF‡.GrÛ‡ËÁ+åýÛ¯aÆä·9ºS;ºÿí^ÖUóêͧӻGWº÷Àýcçï²-}|‡sSÌæ•w?fÍ›—ѹKWN¹â âB°bÜCüý®té}7½6ƒˆ»Ã\‰QÁëçÅU/¿ËðzÒ±çßyzVyÊ#µ|2w9ž®]»Ò·ÿŒ™½/Ý¥‹xtØ@zvéHïã.â½e |¦Žå+å½ÛN£kÇÞœsßXJâ; !#˜AÐÒÕšŠBÞºýlúöìJמÇpçÛ?a U¼uî߸╸np/:ô8ǧoKÛ”³^¼C»w娳G0m£üìw|E÷ÿß[nO„ÞC =4 MªˆR”&"M"Ò»€¢€Ho"" ‚4‘Þ¤÷ÞKB !åæ¶ÝýýqoMü>>ÏOp?¯×%ì½;³³3çœùÌ™™3H¢ðºÍ”&5}2Õ¦^æÓz˜sCàÊÊ)|0y63{½AÙRåh6p1vßöþ›ÛéÝ8šbe2~m,&ÃC]­šÄ¶Õ?ñ j'¾þb£Gå‹/ÇÓþ•ìý¨__²3½iq ”hÃî'‡fö¢vÕ²D–ˆæa+‰÷ÙaûüüYKÊ”,G‹_s)Q@”]üÒ½«÷oçÝÊE)V©/þe¶çï[<¬²?aÙ²bݸ²dÃOR¹¾}>ï´ìƲí÷É‘/;w6Íáí&³7ÖŠ˜+q›;ŠÞ_ÿF’3 »ÃMÒ›œ»|“«ñŒF…}SºR¯óX6¹B2*wýÎÉ»v_'e_;…Æ.åÌ+Z7aßþŒÛ?Ñå-›A4b Á¤¦póò=Ž/O¿e§0º/qhý FÌü‰k6pÛœ‡’Åra¿´ŸYýÓù›K˜,÷¯_áâÙÓÌïß™ïö\àâÁéP!Š:grôj,‡VŽäÍá‡1û‹™Ù‡†F³é„BD§~Cõc¹¦Š·¯_ãöåÛ¸´gq5j¸í÷Ø<æK<í—pøÅ„˜Áœ½—P0†Td̵lúi ¡«;Ñ~úŽŒ{ƒ·¦ÅÑmÎz6.Måì4 åÚi~;ÏÇsdÔ«×Þe—ÿ✧=Q¤ÌÛƒY½~=Ó>Œdΰì½îÍ͵?v°çjfï8Â/=Dƾÿ ×€=ƒ[ÒkGA¾Y»ŠvÁçøíŧºûܼÊÍd5ÍUwã·ST4£Ë–q:O¶8̰ò'˜0~!v4~lóß$4fåoó)ºg.ëã=žôZ¦P²Zœ=|ÙkôE¡¡‡£Ý]‰j1’ƒG³aqW,÷R(Þ¸?¯ÛÀ¬þUX>j¿Ÿw p—¯Û¼Ã™Ø´fîéùÝi$Wíæ|T³4{­äØÑ½|Ù¯.MCß ó¿à5ÿŠD– ²d$áf#a¹ R¼x$E‹F $Þåâµ8.ܱ#2V?›W]f›ÿP+‡¿ü€úL`ëiˆìfŽ~7œÊ >'ùQÃéNáÖµkܺ|÷Çò³k£x—9«ñmқ̘üù$ûEƶïB|ÕA¬Y;‹¨ãÃhýÁ(±ß»Ê†ñó(;i'VvfÛ§½XB«S¨Q§ ¿þqŠƒ¿FXb29¢Û²ø—,ÿ²-'¦våÛ i%E•[ëGÒ`Ä -žÀË%+Ò¾USеŸÆÑ#‡Y1½-÷V £åÔ‹¼7m%ëææþ’ÏørëŇì„Êý+§ù}ù!ºü¸Ÿý_•eú;øCw’HÙ–CY³~=S;aæÐ‘¸éBóÜaZû7øÝÚ”Åk7±pHc)&#—fŽbgá^¬X:Óæ)|»ãü3­ñx4²G5gîÏY9³ WgtfÒÆûÄ_?æÅ;i÷ý>S•Ym:³[ë?O ËÌ>^°†oÞ/Ä®—‡ôPÛ)ܽr‘ÛÎ4 Ë­Ë—‰sƒâˆcÛįIh>‹ƒWRæÚ"fþvM½ÍÔvm¹\f›Ö ÇñÕ¶xÌ™=Q¢L@€ØÓ—yàRP50ù`A Òä5t/–•®KNráø*xL‘ ž½š-«§[šMðίïÝžnsòåš5tË›ßÆã1Ò`ÒÞ¨Zƒ¹›Osjï üËlÏßGlÖÖ¡@ IDATdàÊxŠe‹ NÜ$ŒN}ëìJbç¦ùI€ºÃÇ2æ“të\bW2qg ²è Te©ÊÂùqé_6ËŠË¥¤ ­…øSÌ]·$š|s„»W.wk'-‹§Ï‡ú½Ê÷Çîpçàr ±ûXõ¿ZŤ €©}¿ÙÎÙãË©¤àR¬Y»m'Û·Ï¥ pðüeî%ÑyÙvêA«w»Ðÿ­\úm-w1ø¯LÕî«H81ƒ"ÙŒ@-–_ãÂü 7ÁÍÍÛ¸“t…ïÖmâ¾ÇLË/¾æó¡ýy³f8ýcö;ð ÉEÝwºñAdµgšÓU]‚› ¤[Ù0çᕨ\ì¿pDåߨƒñöNÅX©Ý¢,±ÅÉ Æ-‰¡ówóiR*áEªÐ¼fAd@)À»z]0¯}<Œâöý»ý솄–‰&º€‹§Na(DaÛ]N߸€”% ›· ÈÙðCJºqüÚqf¬O¦çìQDç §F×ÎT/’íÿØs©˜KÕ¥c½r{ímä¸óÜ»ù “6‡2hfw gËG»ñ=(d[¿^%dòüˆ‹Þ祗êÒ²C¾\ñ÷5MUÑTOÚB¼ ÈrT)Ì•S'‰7å'2›3Wï \^ʲ+¥é?¤19ãøtf7²9œ(*(š†¦zêÄã¿?%<4âÊྠ6•bØôÉTµ¥‡qðØ!V •µk#Q±Òjê4& ïK£jyàÄÆta‘37¤œ‡†ï~H×õA}¶u²áÐx†­¤ßä>äõõ|öóß³Õý½{Õ%WDY>™= Ã첫àv’»Ý8êeòÖ¥AöXÖœv ¡ j*ßbfKx~*GâÎù\u„S¹b0çõTMá캩ôšqž?Φ~˜·nTEES<Þ²+·X¾îżJ–„Kœ»'S¹˜Ÿ~?ûè» åÚ~B 3˜£;ðšùÏA`Ù*TÎgæÂ©S8‚ SÐt‹Ó±‰¸/-áû«Q|6¶Erd£HÕ&Ô-Œ;ÅŽùÕALiWü%^åí×JpøÂíg²IæÐ¢«—àÁ¥\JÊFõW¹´o¿·‹ÓJ·L” åÛP×v”§âÙ¼ãÕ?îG“9)\£5m[VÆàQžYÎT—“ÀúѳJ³QµbqN^Ã}i)?Þ(C¿AÈ^–!3»–âx¨Þ,ÔnÓ“–þ;x»f-·lO¿±s8cÜ(šw1µFÊ5kDÀýóœ¸.Q«eEîþú3‰\dκ{tùf$Õsg§Z‡÷©•ïâxUÕð¤¾Ï¿Ìöü}úT ¸cGÖG¾qogÎeæGƒ©ý öÛW‘ãs‡Òqž€d4SºDq‚|¤P±:e!.>ÃC“¬ž¤’Dw2Žä$$Æ*;&õd·GÃh¶U²V»!¤mMå=ÁɃ{ xža>^S²YP}lÔ(‚KÑ’O0ºsoÎf©Dé¼YÑnØ”$œ 1ÜVÃx7"Õ §{† 3¶`“7_?£‚Kù+†›ã?ÁgߤpdaÂ,bî&áR¼™Èf?_#*"fƒŠ3þ6qj(åÂ}¥ÂÉe àîS¼TZ†zÒF›šfSú¢MMDÁ}ï2÷ y)ìKb+J~“ˆòØ÷ðŽ`*}ÀÒmˆ¹xŽ '61¾g+N©ÛùÄ”‘ó{8³þ†ÌÞKÞâÅÈî§pív2šŠçÎyœ~yÉcôÝš­y K}ÏÔÝ3χ‡G!%9Ù»6NI!!1Çí[Ä%?`Û„îìðh-D•*…9Ùú¾J¡…yoÈWÈA§ñ8ñëÆØ ûù¼ýGäY0èì2®»r–ªBÖBä4'÷À¦I…[ÓtÂjPIqkæÌ¬ýÖñU|:bÖBQä±péF r„ MópxÃD×íK­¼ß–Œs´€+™x{<®ë§øCˆñÚÌ5ø T¡Çè’ŒsÚXÙjRp*çWN¦ß’3,L˜ÅN̽dœš†ëÖiÿ|ä2g\«¢¡©¡yƒ}6NÃ$Šxõ™lRܹu|:è„üeÉ—Õ˜k)¨S|dBÆ?kzùlF»ÝA‚ÝC‘lVß!!y±Ú£{"3͆‰iU¤i"þaVUà ‚,‚Gqß9‡Û//¹ é6!áÇLvHÓ4„Ðôž¾‚Nw®páÜ ~™1…nC-l˜öJf¯‘û;À>¿Š”/” ùv2¢çΔ8âÔ@…ûl•˜•œþÁ\|tÒý_‡¿—Ø„Táý®Ýº¼Žm«sæèVvÜ–¨Q8H©Þs™÷V~M#æÈ>îDdGQ/û:CባÙ?˜€0à,ó~¼ÈÛ]‹!ÞºÊ-ÕSªa‘¼EHŸÿM]¨’ÑŒŸŸ÷Ý4›I€ƒ„?¾c͹нü1+ÖŽ$~Xe~;xçá$--±€ŒŒŠªú¾d[ ¡AY›¼:f ŸWµâÖ<œßºG?Rnfáô)ìJŠfȈÖäŸmK_¦m€€ p^ø‘߯æÛEÃ),½eXzRC ˆ §ËÖ õÊ<ä^Õ2l|Æí„‚˜aN[½Ï¦ {ˆzw–BJ¹Bܾ홶U§åê{–¬r§ã ¦? Ý%Öžü”±E)©æ ‰¸dÇ“I¦"e)He9ç’¡¤ p]áºS¥È“ê2ÍZ™Ï_‚ðü%ˆŸ=A[.¢Ô‘Q@IdçïÛ)ؤŸµˆÆè¹ƒrüwÜCöbØ¿qS\pÿ 7]Bš+TÈxàáSWëøxy@Ñ0ûûá—%+YüC€{Ôž°Žq•L¸4ç6oÆ]Ú†ëÌZã¹}‚/FLeŸ£Ÿ oI¸ð ^MA5å¦Ù§0í@—÷G°bÙ0²e/Žã€ìfŽsÕ@Ö`#×´ÌÛwµL¶N@TÎý±¥Ø› ÿ¬"ü:d +=Þ‚h¢ÁGÉöËPz-,ÁŒw#ÓH¸ ˆ^Ù5ùb² ”nÎGíJ<êµ}HŽÓËä0ˆÎ;lX¿—òí‡3 n$¢ý"±{vâQL9JaHØÀ¥$Èå—Qi™œ<‰ $zýÐjâsÔcêèN„а}ìjf¤<®|>g´äoåð}‡÷š› ±8ÖO~FˆKËë.·’UŠ eÍgë¼6ÁêØNŒ9|6!Æ-džÉð^~YóP:k²ß?ÎÒQgHT¼Ä&õ°TõÒrVÉÎÌC#)%}õ6¾Ù¢%+Y ÎÄ©ÔÏh÷¹•œ˜iãˆ( ÿJÛó÷NE]I‘ìa«Çª£.°Õ¢AA?ʽڎè0øµ[-*7nI£W*P¶^vݶ“¾VK{RŸ…TŒ÷×"«E`݇%1‡fÇš½2KÎÄ!=!µhÂÁ}‚ÏÚ”"_•A\P%ošŒŠhŠJ@‘(BóÇ¿çÓ÷[Ð|Ú ¼ëן\D-ÃÜeêϪ~Z7xp›ÂÜ7£¨þÆÛÔ(IÕ·sA• )–­+¿cÙÜß¹¯ ¡r««*r–¢XS.q暊zë7ú ;ˆÙ,à¦Û`QëwX¼ç çýÆ‚µgù?¢WÜ8s€°ÿ~Ž¿ŒÑß‘7p¸œœØ8—Ÿ6ÞBzÒŠIMÅí_œn ­|5`·TgWþÀÞ‹7?ï«X©þj^NÎXÀuEá⚥l>õÉ$Luã «O¿×â˜4øWì¸Ø>i:§=*Ò:2!e'ßþ©Ëçð‰clšû1öK¼Ú$ŠlAØOàÈ¥kÄŻȒ5€“§®‘âtq~˯º‰$º#Þ¦U‘3Ìžu7ñ,4™«&‚¹ƒˆÙò;çïÜáA¢C'5ÿ`XC‚ Ì%Á©É›§$m¾¸B«7ë’Õâbæë¥©þÆÛ¼UŒj-‡sé!mTnðûÏKù~Þâ3Œêÿ|°¢"HYh6híC×ÓèýY$åmNÝ€?˜8ñ'ΜÞÎÐÃ0T{*fP Îå-@0bÌYŽœ¾@ìíüÂrrëêâ’Tî™Ã„™ç1™Ó5Áš»c¦öåæøÖô^ ˆd &~ÿnŽ\á~²Í›×à̘¹b/—.žbÝìÏ™¾ëÊ#[«Ãá¡&»ÃåàØúy¬ÚtIpcÈÓ‚w‹œaD߯8xþ"6.á—ƒ÷‘ ;?ëñ"ñúQŽ;ÄþýûØ·ï÷,¹Iˆ½Âí•§1rê™ ïû˜\ ¼öJ)vÌùŽ£÷Ü?»ƒ5+·à¤‡•Úµ²²ïÛe$âb÷¤/8àNµ)*N¤<-h^à$sæÁÍ}–šÌ5“)“ÔDÖÎE¿Q³Ùºÿ(‡vü̈i ±U-M1˜!nNîÚûɨ¡ÅÈ¢\æèÄí¤Ïg{1™Eòй~03Íå†ÇÃ¥õ?³óäET4dK6ûMŽ=ÉÍ[ñxþe¶çoñؘƒsP¦JyB¦m½U|¥M7Å/ð1´CðNåîôcûжNcJÔ}Mša ”-¡+^?ߪ`£-ŒâEó!» á¬_¹Õ·/M^›MùÍé\ÓŸ–'¼š¥$m^ÏÇÂSXy+Cp>ÞŸ¹™žµüÀýݪ`èí *܆éãr}ð@Z5_BDñê´ù¬¹M¨ÑqæÆ÷Fã_,Tk?’.âoø«ïƒ!t¹ð[¬¦zÓôÁ+˜uñ¿fRD²—)OÉà¼Dd±"ø¶ùZCsQ¡\1ÜùÑ4°¨LÏÞ}p·“$—€ ‰¨.“YZˆ/ýÊÙ;.¬¥ëQ¯w3ªú©8ƒsR¡\1œù‚@ÑDñò‰‰+‚•gó‚Zr¦R‰lÞÇœ‹žÓçØ¹?Ÿ-‰fâÂùLê?šn]í¨=‘…Ÿ4\„•¨@©lÆ4ÝÌUº)BÁh:5ÛÂäÁ™Иùßõä½ã}éѪ1yªÓvRRŒþÞ4e*#¨Þ€U?Ü£Uß!¬.9“†ou¢ûñÏèÛ¾-yÊ¿ÏWcúòˬ¬Œœ2˜÷¦KdÉMçW±e£ÑBÄ4ïgþò•ým4éÝóƒFÓ´ÙL EUåÝþ-Èég)˜Žß®„áCÔeR¶(:“€…ˆ2…ú:`àÜ…)a z¤ÞBKT!ìàlúöQ}Þzc—Ò«Êú¿Ók®—hóEoîØ‰œe*cMµ3Fò•F±@–z}˜7š!­›aËITëþ¨9ý±Cå†~O‡Þ}h\ë{^íØ†k[7%[J;³ú¦"9 RB Bè4ã[ÆBãŸlTk?†Î†ß ʸÄB´R¦B4G.`Ü e(¢‘Õ²¼û˜‘h0d ;¢éŠÒ|µz _M8Aÿžõø>¤ïíƒô‹(Õw6“'ö£cƒ·ÈSåe^oÒK°B Ò¶S FOîÊR©óW&Ï¿ÉûðúöÑÆŒŸÈ½»wži—Œ¦y·{[­æLžMõàt8¼±j F̾4hŠâÂáp¡"aõ³!y$¥¸|#ƒÙ‚Ùh@u$’ìòæ!͘MDÁ›¿Ãž‚'Sz'šo‡Cúµ‹Õ‚,‚ ¹IJvcò³!?ö~¢Ñ‚Å$#¨n³IBñ8±Û]m6L’€Ûž„]‘ð³YD•”Äd<’ ›Å„¨9ILr¢! M˜MF¯WJSñx¼ï¬ 2f«£à&))员—.^äܹ³4{»%’(fŽ?ðpŒ—'Í¢>CÜ‚ÿFh÷ŒåÉ»&ó:ŸgÍòc×hÏœò_qÛ>±y_=ŽÍŒAú2`à§Ïv`ž¯¾6,’Š#%ÅÙÖk,3‚+™D‡ƒÑ‚Ù${g¤Ü)ØSsæ47oÜä7ßòét†EΩÓÁO•¹ÌqlŽÃòÌ’ŸáƇuçqòúØ86©éžoêÉúþ§zý$=y\ܨ¿ø¾™Ê§ý_bcñX[“ùžÔé1ÀžZÏbøþÄN=R‚°íз7ŸŠËåúsÂ"ŠÜŽaâ„ ñ³æÎË÷uàû›$ÿÇAMq“œè~òÜ5¾užÇ\Áž˜ðÈýg IΔLß)nÉnÇSÒ{Wüg¾ö’œ9ºmÊïÅ•BR†bº]é·ºìɸÒ|& öä¤ôÉ© }¦¸$»rIMÁ‘œˆ#Ã\èÓ*Xxʵð¬éžÒ6(÷X:¦–D‘SÝfN’BÞfãÆ¡ä3üߘrfƒðøò(WæQ«æXîù¥cE ¡éGSøôRFâ)Ïx®lÍÛï-$ÅÏä ,¦b7•d·“y½tØ£©þŠÛö‰'ügùêø†mÞúvÛÓc¸ø¾S=.’]™mÎCºð$›ãÓ÷Œé5…”äDRþ~¢< O’û¿@ç…¿ ŸOZß’úýöèôý©*ógõñÑŸ§½¯ð,"$<“O ómŸ¶áŸÉÇ_‘ïgòXèSQ:þU®zM)”ŸÎ£Å§>Rü»Ÿ-åiÇæóíþÚÈí/>#ÏËÙs~à6:Òñÿ]Nõ#QtèÐuZ'6:þƒÉ_ÙüWžý7Œ2žå:tèСãŨWÁ?’,a4šÒ¶ûiz¸Z:GÓ4¬VÛs©²,c4‘|»ntÖñoFª·FU5l6¿¿]tbóDÖ¬aÜ¿ÏÑ#‡ÓŒºÿf¨ªÊÒ%‹¨¢(Ï]ù³‡‡{+†ãÇê:­C¨Š¢°xÑ<*W«ö·ë´>õd²V«•¯Ö`Ãúu,^8EQtC¨ã_ ³ÙL¥èÊ”‰*ƒªªÏ•>hš†ŸÍ5j²aÝ:̣봎=, ÑUªU:êoרü™¬ªªÓúÝ6Þé(ÝêÐ?ÇóÜêtHH(ï¶m‡(JèÛãtè:ýßÓiØüC ¡¦iÏ´¯_‡ºNëС#ú:tèСC‡NltèСC‡:tb£C‡:tèÐño%6©§gKF þâg5‚¦‚d%0ГÁ€_€ YxÂI³™òQ6áL€YöæÿÏ®4 d“•€  üLâc®ÿáï ãÿ‹Ì,6ƒ°Ô‡®u™Ñ¡C‡NlžÖ€`‚¬HB*1Ñ@2H`€ íÙò²ìæøOã¨S>Š¢ÅJЬç"’¬¡hûúP¸d=¾]ûªu`OŒ?4«ryÇ<ê ç¥q»¤ÿáš‚Œ_PA>’–þ "(ÈÙwPZæ÷w±}z*ÊÛó®ágõ°cú¢}ד¤o²x!þO”¿ÇʌјªAm‰*^˜÷VÄäçdÕ§íÒ®u™Ñ¡C‡Nlž΄8ZËˆÍØcGDƒÇÖÁ„±½Æv· ƒ(_؇"þjæÏÏ™ó9%V¢d‘û1—9{å6Š1ˆÙý¹{ñ"ZD)ÊDø¥³:Ñà G¹“‚5,ÅógCFÓ’À• 繓èBCÀèJ¾y ±Q=8³ÿIÁ9ÉiHáúíxü"ÊP*¯•„›—95†$X‚Â)R87V)ã9‹‚DÉÒÅ1˜l$_8Ê™{N¬¡(V OJ.¤[g9x扊„Ö<+”A1P±í@V¿ÖCŽ8\ê#}’( $ߺÊù«7It‚9(;E åÆ&ëç<>÷Jj4U²¡VâOä|‡¢@„š» ž«'Ø'–dÍ@Pö|͆Çm¡Î€)l윌5W)N磣Y áÆ.\¿M²[Äš“¢…ra4]ftèС›t§„™2U›‘wÆh¾Ÿ±…IßÃsšGà ˜v]гvx{ºþweÀ…êvcʘ¼’ï:£ê¾ÎJÑJîp?®Þ¸_Ó¯ykÇ8' ói\}>5{,æµû_Óoá.ÊN;Ëö–}Ö•¾?üAù™ø­ÚYFwîÀÌ1€?yŠæâÊéSøwþ‘«c«§¹ªì;¾äÍï÷pò¾¡e:>½*g'æè/t|ë#N~˜ÜIØ=A¼Òc ßôkN ý0=¾ÅÜÒnrWÆci- üx ·]òV„)œŬ>/cTT¯ïIó TâÛÝû1[D6´Š¤Þw—(Rg8[—´âÞš1t|¯OÞó’Äl%x÷Óoø¢c~vÎDë/×’{Ð^. ŽÈ4 H" GÖðÙàϘ·ù‚×Í%‡Q·ÏTf÷­YÓÐ#‚=¿Ì–E{c±h,«™•¿‹¼Ôf ß­ÃÕ¥ŸÐ¾i v_IÀ–·]†Í`T‹PV~^¿§Ü„“ìï韙Ô$îí\ÀǃÇñó¾^9òÏË[ŸÌ`Ƈ\Š.3:tèx.ñ_Xc#Q°tyJ”2Âίù)bOáèÁP¬o¸fÒõóßÈÙ~‡O]aïâö\\÷SVl!Y‘0ûª@áFýؼ}Õ¡×c¨dïÈÆýûù¦W ‚°™$ÐÀ`±"VÉÃÁÓ˜½#†œïLaçÎy§X"þæt'ɬô^¾ƒ'u!âÞ!†~úq‚HH±ºÌßqÛ6òë¯?Òµb<[¾šÏ› ¢„ ÎÁKC–°gצ6t2çˉ,Üv“N?!öüv>ªicͨ̽¤b’¯‡EPqØ“IvØqx¼~Mõ Äm¡Oßñl°;KnHºÌèСC÷Ød„9¢$¯/Ϻ£»˜>çák8©@Þ¯#îmÉ}àþÜþDÍퟖæð…+Ø]ù½ÙKðf³f”.nEÓ éAvl2`!oü„ ÷ÓÖ»ˆ¯ÕQÝÜ8ó ´}§‘EÂp¿Ñ‚é?MÌdÜUÀ¿IÞ(Ww`m¢ ÍàÚá-œwu§Ø½ãŒjó>ËOÅgHÃ-»!ÄÇ+J¿AÇúÕ(j€{‡8qñ<àdf³ÒÌÌjíÑDú ÄézŠ×Dq\>Ä¡{É@<_ÎË@_$J‡ØvÖA½§t4žÄÛœ¾xp3»Efgøí×£‰ô/‚SÕ×M¼ ']d$ û©HTñ8Ð¥RNº†Ä#¸â"‹ø$yp߾ȱ1€ƒÏáó´cÙp<™.9MºÌèСC'6¾Á%n1+oÔ/ŘŸwqvÖæäØruºU G[g dƒö´©]£Š#!O46ƒÏZd,6ãSÌ»€è[àJQAPy`OBñ‘Ùhâ‰OR1e<öû8óCù¸âPd#(.œ@¶`Мl^Øå§âyå£/éÿZn6ŒiÆä­jf/Iƒo±² ÊÈ’ØhöÙH^ ð ‘|'ŽðâFœž?ï Dƒ ļ?öSJ›](¨$Ç%S*—ŠCyr‚(!Ë2`á­Á£¨™Uă†ýna‘槦ÕñÜ:qMf$MÃP˜.Ÿõ¢€Á…†‚=I£ZV…cê“›Œp IDATÓ ²Œ,Š@ïŒA•Å'³ñä)(ê2£C‡ŽçûT” hhœ¯½A¥î{›Xs Â×%2ÐHÖªí‰Î]Œ!E´áoÒˆ9u–d‡IÓ¦OÛ˜¡ Vò…Y³óÇ1nìD–n=äÏJ ”~@œ,;œác†1ròb’3xç¯cøð“1Œœ0•×À¯A# Ün`"Gx0Jì!vr?RUZ†ì¤àܼTº4ÌÉS·‘w9±ç<þa4§Ç Q ù_¢qA4õ..?Àà‡wã\& ÌúÔ sRµtY …“§n!ùbpÆqb÷¹´çëxÁˆâÆù:Msƒ#áWcRðó·â¼u‰Ó‡¯ãjæ)Ûž³• Nñ¼@<§ÏÞÅ€˱Ýç ÈfÕeF‡ºÇ&µAÓ<8ý+Ó«Ak¾M¬Ô«V–@“Šœ¯ Óܦÿ± 鱿ˆÊ lŒ„‚= 0&áV3ñ¤€Û‰&€G1RµCgZü¶“{¿eLÒK” É w.‘ä‘(õú‡ }ï(Í^Á¸cù©ßôM²œ]F  Õí$0Ôiˆmç×|}0¿R­X0¤.V Tmþ)5WvfI¿wÙ^ñ-Ê”aWí6M AThØ‹IåºÃN2èTp;ì$ U ~÷±|åÌg_£ór#y£ÛÐ΀ÞI½(À” @rЇ!’¡ß/ÃÜ·?Ó&öa€%µZ HRq&{½˜IN AÐpÙ“ðI.·˜6£¦ã2 `Ô‚at\VŠÕèLYÓeF‡ϳ©ÌŒ}ûhcÆOäÞÝ;ÿçýž©ÛEEß MõåÓo@šw†>FÍPÆŒ‰H'GÖÖƒ–áÙ¾{$ܽþ}Úã"~éù:žCÎ(3<³Ì¨ÉŒú°Ì¤‘]ftèÐñb@þ_>LÓ4ŒFãýŒ)wyúÂΓ±xÊIí×^%ˆ)‰ÑñßkgÛýxütèøk0H"²,¾˜2§¢ª¸Ü ª¦éz¥CÇ?‰ØÈ²Ì†µ¿âñ¸ÿËaM$)”’%³ø ƒ‡3»ÖqJç4ÿ„†f¡BteG¯ ÿu-›^bÝžs8]n^´À‚²$Pª`š¼R ‹QÖ/Õ¡ãŸDlA Å‘Â;m;è5ÿcÙ’…ú¨RÇÿ’(²ïô Ví¾Lª•°˜Í/Ü;*ŠÊ±ÓY°fm”Çd4è ¯CÇ?…ØèСãïEªÇ‘’BJŠý_w€¥ÕbbÁÚã¼T­ nÕ€3éÅôæÍ“—GŽs#öA¶çßl ‚€ÙbÁl¶¤]ëС:t II‰œ?{›Í†(Šÿ¢Ó+5ÜWx˜DLl¬wŠû…mg‘ø ÄÆÜD ±!âóÝršJrr2yòæ#((XWd:±ùÿ¬‘ÞmÙvOeÜ©õ¼•Ÿ [ðu<ŸÄæÌÉ“äΛ—Ð,ÿº‘¯$jXMgèÞ¤$É)®ö= ²Ä¼UI䌈 "{Ïû:" ø¸8.œ;G¹ uEÖ¡_ìÛ®¥ Ò]š™·@ÿÛW•C“ºðуælVëÙÔØWíÿ÷®A@Àþ/{2 ®!†ÖCÒõà¹&6qq÷(U¶,n·ë_7e6ʘdàþVÓ‹k¨e«MÓp:/„Ü’ð ^Wbÿ>bóX"Æj’8üó4ÆMû™³w’ðhfr«@³=hS§ˆïå%5ZZ@»g#OQKr¾ÜŒÝ…¼AÓ{¾eFB•þ¬Ç‘š'?Ç_xœ§åÏêè©ÞÁ[&„GÎÔÐ@÷Þz þÑoP¯\8‡&· Ï’«¬T•ˆû+éÐ|0¹}àWF¼ß‡– ¼Y»Û§àÇã±ybRØ5s ÃÇ|G@Õ·¨v€Ú|Æ ùÒnº‚(W©"Ù’÷1hÐÎÆ)hj2Ë´dº[._‰B~ñœ¿šŒd6óýXf±YÀÂÊqŸðýá›úî„籃ðuéÇ‚üýUÙd! ?3Â_|ž ±YŒ>Ï£ˆÅfEþŽr©éUKû²È¹Ý©ÚñGܲª†h4qjt}*u\‹f”!ÃýÿÙGåæÎ%tì3™k‰ šª³ë;:öžÄÕDå©i<Ü8¸‹3w@åøÂ‰LÛy!Ó}ªª!fðØüGLV? ð³ e8Âæ™?ª†h4ãg–½DK”±Z͈üÕ²èÐñxlRQ£F öíÛGݺuÙ³gyóæ`ÕªU?~œ_ý•   'gpï4'ChXÑG~î­¡~ÍžºBX™Æ,Zõ² TóºÖ¯ÜÇf1"‹Bf°€÷̨õéÞ¢%³Éåy›÷ÇnàZ›âH&3Åêõ q¥‚Pi<~_”¯ߤ¿Åˆœ *Çö¬æNþ7˜Òý]‚$•2a}n&ö‚HFÅõ¡y|àØDïïÒý14 UáþK˜¾÷SÚˆ,•;Óç­j˜H¦áúµür,†Ö¥³g¢t¢ÑH‰×?âõJ¹ RÊOiʪKcø(º]+ùÖ½\„«äðõò%ÿÂômú¯CÝl©ù(øÃŽ»@;&|Ò’‘.à§c×h_>‡®Ï³ñuòFÀÏ9ózû2›à]ïõŒ^VA@°zT'z}½9¼9¿îû’ÜÎ$íYÒÃå5_Ðs•‡oÆw%À~„šŒ¢Ö„ÅÔÏ/ÿGM1H©^+5]OD {쎜+‰*¤{9ì×Opäü}¯WESãM2x~|çoýI÷+ÎÄ;œ»x‡¢¢j‚÷úRêõ“+Üå4ÓtÖZŸ—TA $ P3/£i’øè”ãÛQCABI<ɰV™¾ó&Ö¯3mñçÔÌ*âVŸµ$ƒÊá/ºÒûfMÖ¯GüÁùhòn>ù|Å‚Åg",ªªÓ/ˆÇ&Ý iDEE±zõjZ·nͱcÇX´hC† aýúõ=ÝàId̓#Õ]R›ï¶dÏʾ'&£ª"’»lÞgp‰ „ä'ÐlüC³bvÄow!ˆFrÏå»ÓLÑRAÜ:u·(úìVò–AðÝëF€˜“Û¶S7¥TسGyô@OáÉ#ôŒšä‰cñŒ¹hõ‡±ë½j¸Í°6ï¡xäÀrû DHB†zѧœ^(§ª¦¯Y4EE0Û0ú•x~×›¯dcæªÔÌ%qïÚaV._ÇÅû ¹+Ö§i½rЉì7—Sù*b:¼‘“ Ty« ¯å¶óã̹\¹çæ§/†²·\[jmbùï1ˆ²ˆd°àŸ« ¾Nᬠ'×-bå®ó¸üóPçíVTÉ!£)*ŠGõ•3u'£Š¦JZ;–/aˉX¤l%iܪ¥‚]œÞ°‚ݶÂä<ÿ;[/:(øršU-ˆ,h™ÞÛë±ñ‘¡4ꮢIF¤KKøø££ˆŠ†`¹½ýr¨x0æ}…q?¼Kñˆ`îïŸC£^39T» å% ¿ h © ððCBÃd#霙¡‡©¦Kä+t¯x˜y¿ä·)—™¿`¹,*×~¯ÀÉéW˜·`4'~Ï»D¦n=Gå\?ïÁø¯=õÌflFï )µô©ä&£=R§îÒÚYDSTäˆì8ŸûÄåð ˆFœ§¶³è´ƒ×jTÆ_Ö¸{ñ¶—hT¿¦PypäcÙâ(FƒH…¤¤;ì^1m'âDÙ`Ä¿p%ZÕ«NV›ƒý?-aý¡kZ”†­Þ¦lUQ𤶩—‘ùþ/ ¦Ä°aùüq9kDÞjшüfw&¯¾ÆFÇ ç±I%7à–š;w.óçÏ'00ðOIW5Âéõy7ìSZÐá󕜾q‡»7ϳfÉ*n<ÖñH¥26,ùÍK96}ÏöØûˆ€ ɸ~Ïøåû°§Üá—y3H.PšœÁf4ÅÁÞEcÙ{ÛIÌÖÑ Û@£æÅ‘ÜŠ¯Å+Ö%é×IŒYy”$‡ëG6³bó\©f6U—³7¥{•+ hý'ï¦`¿w‘ f°û„Aüˆ† " à2bb·-aÕº+‚s¡–Ô²mcüĵܱ;ˆ=µÝg‘dA-½hÄFKïøTMM@’ì¬Ú–)‡²3|Ò`ª„ <¸{‘/ûôbCŒ’Å‚Ø6¡ ŸÍ>€fV8ôÝT†õû{d=ê‰cä{ÝYH™ e Ž zͺ¼Z"˜ly+R»VMj¿VŸHv0{áf’M&.ÌêÊ{Sµd9 ¨ûèÙf {S$’ÎîfÞŠ$º”4oƒ¦j’Ê®‰ùËm –-Kèõ¥tj?†‹‚Ìõ?1üƒA¨HƒJYY5aë.?ðN±d˜~óN/k ¨h‚æý ¡¡¢˜Â(X¤… ¤HÑÂä4x×$!ê`ÕÐæΗòM±kçQ®$¥€ÏK¥¡’š“:¡ºU ½Ó‘Hc nsI:5 cËâ=<ð¸ð¸$$$`·'“âHÁívð {RçNm`ûº¥´z)’üùKÐ~ôb6¹È}»;-÷Tïˆ÷ß ïâ{¯%s;k¾v¶†‘3G89Ãs’-ÐÀý‹ûø~ÍN¸44MáÎù½ü°n/‰nÉq•³¾ÇT¥c7'DÉY…Ú5kP«VMBo­çûuGp$Ž|Ñž]$O™r丿šNï ã¤jäÎîU|³î”×[¨j^>¦jhJ2+G~À܃n"Ë–Æpâºô 74C&›ªªú/–ÇæaDEE=BxžØûþúWìÇÖm…Ôwõ'_Á®RâÕ¦Lšý Q’›ã©MÅáshÙ¬Ùröæå6­)Œ ¨œõcÛ :EXÅÖ̘Öâe ‘Õs3²v~v'äáÃÙkx/7ΰc!KÔ›Lÿü÷kBáXÂJðþ°ñ©ÜÚ.ÜŠ½÷û¼^z$‰R*ÔïĤÖðÔ"Ñ¡wgv´›ücd"ËW§ÐË‘Hª‚`ÎOßÙß2¤k/ÊN‰E¯È§ó¾§‚î°y!§¢Ò‰Ž†&[ж`À±h¾Þ0†è'M îìJ¶$•düÇ]( P!G<í&,äÔ»ÃEЗºÓ®viŠòñŠŠLœ{™u bósS¼t¹ý @$ÑF„˜e¼±èíf-¡²io~qŽw~ÞÄû¹T4óË8¶¾Ì¤MqL±JH²’aѨ†&Ȉqë·$…n[†ÓÀß Êq¯V#íïNuÁƒ­rgz¾^£V„×V®ç—“÷x#ŸŠšþÞÙëìP•ô }š šÇ Ù_¢]‡¶È.ÙfæàÑL> 2·˜ÜíCù·ãç-((¡]³^„/ææsØhŠï;ß̉(‚æUôÚ*ÕáBÕ„ôçú>¤¥×p$iÔí9…o7Ã&¨é^dsüÿcï¼Ã£¨Ú>|Ï̶l*$! $B $ô"JSéM° €Ä‚PìŠ"(ر¢HWª‚(½÷ZBêö™óý±›ñý€ œÛ‹+îìÌìÌ©¿óœç<§ˆ6 ¡ò«ˆAÃPŠ;LS­y»9¡oûUô “êù§’ò}QÿÔR@LEAõcùºc<к&øju‰O¶àÜ>žWWÚx⋇¨è]ÄßœàÁ_¿¥W¤åækÉlÕŠOV>Í&Mñ?…yêIûžÉDðìOƒiäEoUƒ#·=΂wÓ§*E¦­äàJrE ›ÿaŒŠ–ÜgvçóÌÖôùq3}(ß"¨¯ÎÚÄ«ù'x\ªãVðéX^VOû E£Ò Oò΋O3 ×{j<¿ÜÛDåúóýêþg˜–-ß[X‰5¨2|¼G>>íħƳ(ðà+í^žD;ŠÄ¨AYž\¾¯ÈýxsÝ®@ƒØ‘‰K:žuÖ*"©5ÌÝÀE¿¨ó! ‹üÞC?áF.ƒ‚’_„ÀãñÛM]S4|^7FµnÜÀJÆ}ð=ÕžjG3dîß„5²ÑvÛ‡¹\"}Ó9z2Ÿ®_»<ÂéÄ¥Ú¨’Z–ãëw’ÛÁßK{=^¼ª†’½’¡½†úèžhn'gç&öz3ØÑ·5S…JÂM]GN«ŽÐu¼/Ct]àØ»Š-9{y­{sÞ0 *AQÕééÌÆíUˆª‰p»q+‚‹AfŽ¯×ƒGÏïØ5Ìj¡Å£¨ãoqoáw Ü'Ø–·?Ö‘šåìœX·ƒÝ»Òj §¬’Gæ)'æ+Ç6.a¿GCUªvü8“=/§à˜Ð | Tï=‘‰WÂë2°„–%{­Ã0üi¥x}†áÃãõbðªå¸gà@þ~ônÜx'cG?LjYÞCsyü®H}úGz¤XÉÛ¸†Σ¼sK >B¨ØÂ«p£# ·nÂ^xðz}ÃÀ§äî^Éú}«y²SKTaÁ‰)4råâöZ œ†5ÇF"…Í™v›sõ¿E¿;wG-º‡<‡gž¡j±ïܹÙä¹\äûØœ~¿sÞû¼Ÿ¡Ø‰Åšd¥0²ßÙç§Åy¤CI'”|_ÉHÝY(׆%º#ÞhÇÐ#xö#ïj%$#—îwÌUÜ'È5,Ø,*(û3PÌјUÇea‰ G#¯˜UÁä:Äøç_cwëWø²_2ž\7V{8VW(÷~½ŠA•½äù@3›1rO²iŽQð\ù(„ŽM-‰ás—Ñ5<·¡¢™4tç1~žé÷Lj‚é§ü(â€lÒŠ¸ÅúÇ£»òÈËõûBwfãÎõ`XèÑ1…—^JFƒDÄÉÍì8®ã3|˜C«Ñá†XÆ?÷ ›kÇã:¼°â3@+¡Ú ž°×Ñ-lëÍgý«–yœ$ç†>>€ŠÛòÌ#u¨âœÄ³ bÅ›x¸gÁ@ž~àn’¢ðd;ˆïp?/ßßW® ‡Çÿnž¼lr\Fñw ¼zz B¥pÅVPhq±±x\:9UQùæ'¡;ðè!Œß¿)8¹Ÿþ̸þ]xn\Kf ²ñú£¯‘sÇ|tK<^‡sh$!Äðì¬5ôÎéûW“êy'ù}k~~ˆ"鯣…ÆP>¶)ã~Nc›“ yY§púŒÓ§D"…ÍEH±z2¦’—òöÓ;õ2ôûj1ž ™L’Ë\×…E ãð¹±ÄÝÈk#<õÈë 0GðiïN”þ_Ííʃש|ùæŒjOP­¬ÂzMcïoð}×÷hš÷Ã~Ñé2µ6š{?".Fw°ä«÷™kiLJƒ;¡(&#ª9ßøCïLµR;$›5sçájqµ4 WAåOEénDbWz§~È«O¼E¹—zã;‹§\§;0B1ø#h…ž.Eæh„0üþiÂ?Å‘_ƒ½Êý>`éí(Ýo¥p¸©öÌ–8+àu˜hñÀ0Æ·ÜM†G%¬Lú>¬™®™è0øCªlßGža%¦Òà ÈȦR°›õ^/•îư¦§Ø›¥W5…*!:†½¯Žý„½i§æXÂc*òÊÇŸ°çˆÿsHhEŒž@›]{9å4Ь¡”¯T “×FŸ¯—У|‡B›1 H #Ï¥6ø#µJå <ÂðáÓ}èºÂËÆÀþ?8èP¨f?Ê¢©_s,îÁ‚û¹²³{O.Q‘*ŠÏž“|ýÎ4Ö×}‚‰µÀ. “Û‘b؃/?ò.*©ÇY5ÿ7‚ÚÝMµÐ–Ÿ§èn,•ºsCð­¼6l"#jEpÎ^~_½¤6=©¬ARØH¤°¹H‚‚%4šª¡…cˆÂ- LÄÖ¬SX åf‘’Ë×`S¬#Ìÿ,è†ÀžÔޱãœôêy/ý´É ~7CßÉg^ª·Ȩ{nd¡ûT’onÅœ‡[0è`8žÿŒ!õÌ8׉‚Å:º;–²yþ/´žëŸ¶T¿ž>xŽ£¾ÇùÆÓ l׌a£r“›y¹ê÷ÃÈwÎ÷=1t¼F$w}4ç‹OÓ³Å(<¦pv¸—×nÕÈ #¯ÅËÒóßÕø#+ `q²{\õã W ÃGpB* ¡ûP¬T¯Ûðl6\¬!ÑÔn]x0: ›–çŸÆÒB¨V·*åÝFà(&¢“‰N,4FX’‰J|Ö½Iº‘gä[lJ]ÿ)º lÕZ”-¸gÑá—p>K>Íoá?;¬êuôo¿„Amëã+S“Öm»QÑáÃ0üïçL[ǰ¾/òëA¥ëðî½±|õìZ6üý¦õ[šÞÍ7o=Á­ý€ãåÁô½ácœj©­îdX #FþªmŒK"~0†wÁD7¨ IDAT^xvMŸE·•£u¯‡y¶“Rð¼ùy'‘\sÅi 2HŒxk4é'O\ði “ÉÄÏ?þ@ï»ï“)óÍ´/iß¹+>¯W&ÆEFUUæüüõ4ÄWÄÇ@³¬yÈÎ äƒj&$ÄŽpçâÔ5ìvš¢ {]8Ì6Ÿukïw/ä§¾qx½:§‡GGÑ,ÛT7 Ö ‚ÌJád‚î%ÏáÀg¨X‚‚°YL( Ÿ§Ã…a²b7ƒÃéF lÃëÈÃkøƒÆYƒ‚°˜ýñN|7N§5(›á"×­ »³ÏIž§Ðb£i+V­£ß½½ÉÍÍ»xEÅbsòí}·0§ãd&÷ˆÄé¾tË•5Mcùï« ¶a·ÛŠ}g ÇâË%·XÜ+“Õ†ÝjöûFy}¨ŠÀáô` Eó8– ̪‚áuápù°c1¦ ð¹Éu¸0P±Ù±òG÷ºq:Ü` "Hõ‘ëô¢hfì6.‡]€¢š°a1©ß,7.Wñí%4Mcã†õ´mßQVdÉyVC•ãGÓ=jTæ„I_ô ÎÅ¿þ&7ð/ï’[l¼ºÁ²­Y>Ì¥+T*û{I.%FA,‘B|Î\²ŠÐ=ädå×;9YEw‰V1aàq¸Èu»ÉËÎ"¯HÇ-|nrr Ïvåeá:ë“踹¸§ö¸È)¨ò>òŠÜLμœ§ßÉ‘‹·ˆÅ—‹û K•(ˆ<¬ .Þ®BÇã´rëKèíÉ!Ç­_â-Õü˽gæ³;'÷YÎ÷ºd%“œÙRá*Þûr³p”§®¼œ3óÛå § |xÈÍõI./Ž\o ÷+Ì;¹*Jr1¸äÂÆ§ æ¬ICÃ'Sÿ ¥‰]NØ]Ò.¯Hlÿ—ÓJç·¿ Ed0·þŸès ìŠRŠ­+º‚À—íŠrI]_\Q»{C‘ÔÉ]Ø¨Š‚*½U®ÌNV&A)¦üÿ/õ…¡Y¥&‘ÿ©NÇ¿*ê4ýqE¢©ùòí ©eBF–\AÂF£È†uÿ•Ñ”8ÿJJ5IéõWÐHþßʹ«&DR˜×WÔkÉWu›u1ò¿T„Y¦(ÅŰªÈ#h&5°­Áûáb ¶‘ebÇ¡\§mg¬˜¬ÔO²s`÷)Òu)nd \zt]çàW¥°Q¯×‹®_ùSÛÂMKÃd6_1yçr¹Ø²i£´ô^E¨ŠBHhqåËi¼à •JM©•bÂZÃCèrmªØüΆ:kÖaÙ^Æ ,°Ñ(ÉÆÁ#9äùŠ+$U³Ò8¥,y{Ó9áUQ¯ú~]6Q—‹ÕJ³7àó]«ÐTUƒ+|Ôoµëֿ✢(þ%â’«e$‚×íáà}lߺ…š)©(ê…_lré…ðÏß«¥ÔúCN˜ˆ·yøuõQN¸ ‚œ\7úYÍùþ]Èu!0 á·ò oªþ8!F~ð±«ÜbqQ8%gES5"Ê”!;+óª5뻜Î+þÝM& SQ‡"‰ä?ˆÍj¥bå$öíÝCzz:QÑÑW€°ÁoR5Jy* ÝË¡ãyvú¥ˆª€ÂM×U aŒ“¡³gëa¾ß˜3ù°â“⸵q$aÂ͎ݹhº_ð!=ý%¥ÇŠ¥Kp¹\(Òl(‘H.CTEåĉcôê}ªªàv»/Î  t„…@”ª°1ðYƒ¹¾A9^oϤzËDícļÜÖPúö¬D›#9,ÐóƨÖ0Ú5Œ`Ý’­,NÔoZžš'GDÆo‘”†¡só­·Ë„H$—-Ó§|Qd òâè€Ò6”®'†Taãð’é—%˜zeLD†Vä©dÿI¡¡VÜLÌ;”ÆÝÀAw6k»0PX¿þ8×Ç• lꇜ…‘”Š‚Çã)¶—’D"‘\.X­Ö"îÊEë0/¹°<^&E/Q#À¬ p;X³å‡þ O<ö(¬&7ß³™?Ý ‘Å„Æ#x½:>¡ û¼8<:^UE¸=¸ø|:Ÿ¸ê‡¥¶» òà"-¡”\¸¼‘y$¹ZËÿ¥ ”–{‹Rc“Ÿ¸Bˆ|#7— -ªÛY»!](™QÝŒüÍ÷wf&K$qvHÏ5ˆ(A´j8ËÝ$—CãñoEÕÐÿÒqMÓ0tŸ,ϺÁ5™ø}Å2ZÞp#N§ã’ý®¢¨hš‚®ë¡ ™4Ð}è2%RØ\ —3B)­å c1+Å“› 3=Â}-+3 œƒS^°Û6-ÝÍF,&¬dOö)–î+K«•¨œî#,Êáw –^6rZê‡a`¶Z1›ÎïÄpåQtÿFEdl^ÎÌ&níØ‹ë0³~^A=©!Kô…ΛüØ…«+Ulö â5Çðâq{Î-<˜ƒƒ1ùœ8ÜÆ9W¼çZÏÌ•G¸©K["MÌŸü#eÛÝMƒUn×$¹¤åÿÊ6¥ÇFà8yŠI¿äpÒiVjE!÷PŸÍÊ$6ÌŒ ÛíáxŽÀãÊ`ÊÒLÒÝ!|ü½zi‘6lªAî–cüj3‘åVü+§dѕڦ´¥¥ª²äÛïxúùçqÙl˜í¡˜u·ÝÁã¿üʃ‰®"mŒãènþØ`¡[û&ˆìL7[¯¹™$)l.tí(Ô.é(ÃsŒ÷noÏø=*–2•iÕó>žìוXKÉVs¹;ñÕµñe¯\Q⯺2³fí6®k×–2"?|—µúÐ0V•V9I©”ÿ+NØ¥¼*J÷x9tÒ{Fÿ«(àÈq°;[PÜޏ ûkÝëá`šÛoP€\Ê%θ˶àÊF²ÔÑuÔf×ñÁÄ f˜ûdgÖ|›±¥‚×LÅràEAQü#(Ý€¸ëû2æú€ÈAÁd6¡punÓp±Û¾üvBVº‹];ÓiñÀú5µstÛïŒ}/×,z‚ß&=MbˆZ X•ÀՆРéÛþfc’USB(¨jakdTK™”¶ŒÞPГٌªâo¡ *ů‘¾r’‹Yþ¯P‹ÍåïEœÇƒŠsž_h¢‘Í¿äòQ—ae£hƒfÑÙ]ÆÌšøZ\Û´)ÞÝ y¹W¾Z½-ŽöO~È\Çáéø}†•_&=Mp~Ý~Çz©m. ŠR$mý~y4;*פný(êÖ¿†¶­sûõwðñÊÛx³M;Oà™ç?àï´l¬qyüOè~òSFþy”]kZ3:Š{^ûˆÞbýFÏÎc.,ek3dìjÏÑ“¹sø*>ür 5ìÕ"À¤d3ãù¾ úò/òtÐä¾ü4ûu’-†ô¿‘\ es% £}l$’+¼í0Š¢c†¢£ßã#︇-·ÃÎ9-°žEú÷òf‹Í<d#Än)ð;ùõTHŒ Ûö‰"ùd (jÛÐ}x½>„áÅY…ë¯-ÏøUGx­a#^™BÛV2ç†8ö/IŸ'Ò虼:ùKFtþƒµ0|¬R™°è5êT°±ó«ÇhöÂçt]ôfÍLpp*FÀ¹P-h‡'ðÈ»‡y÷`}Êe²uÝBÝr°&¹8}ÿ)l„_´ÉJ#‘\BTê‘ÅLÝ”Ivæƒ4™`€Ip$ýû—¤1 I=£žû+¹f›n&U3aAvܹ:9Û¿cƺm¬z¨=Ÿ p±ï¸Ææí' Ѻ3ÓƒÃk&&.±udæÆ“h"ƒ»ª±×­PãlÙix!êZÚ–Ê‹·ßÁŽ;nã®>ˆÖ¼xd¾KþÔBÐuU‘AÄ®HEŽœ›/Õ.SÛ]°±œŠŽÏ¡ûpåfë«ÊèùKéä*è¼TMåÀÏ„“Ç‹!t¼n¬§T_ª*Šâ·Öx<EE÷xÑ ÏëñX4•ÎÞc'‰l†7'‹ò©½øfñûT4œ~q¢¨…êL÷Ÿ·Ç‡æÝÆÀw±¡ë‡üø^+â²~ I›¯pº=K?O=šÃ0ð¹dé5ywÕVü4)_)n$Üb#.‰#æ%6Á6_ ¸NæðÌ×Ó¾”‰PŠB   ¦„áE‰»Žfe_dÂw[i{WTá%;#Q.àÌ/üj¾oYþÆ®²ƒ»€Â³Pöû§¢ò§§ºîó‹g.;VÏdöz…{†Ä` ¿‰ˆSïóÛÚãÜU?áu’ãB±—Áj¸sóÐQÑNídí‰ОÊûWnåh¦Ó¯+0Ý•»+?ú»pâdžæw¥Û]Ýé•Ü–Ï7:iÛÒ†Ç+3^r„Í•j±‘\á·L‚˦ñ0„ÀãÈÁátã0_ð÷rÿ‹ýéó{bƒ ²Nt~ë#ûÜä9»Øë>œy<ºô±¹à¢3?ŽGA -aèxNæ›1/p`¶™Ü¬S¤;EÝG_§{õp4¥ÏÜ5—·ž½?S+cò8P#kñÈKChйÙï>ǃ'Ò¾kzwcÌãCØ[¯,™ÛW’åvã3†îÁápù}g W^.aBMû™¡ÏýFp¹²˜ٜБaÉf\^)h%±ü_iÂF"‘\|aã·  ¯ÂM#gR?8=×I¹6ƒ˜”ÔÓq aQ¨%0·èØT•p3¨‘5yþƒÑD–×dçv1xB€"P-Ñ<òå·tÎóSÌv¢â©’ƒE1Øh5ð*·ÙÂáSN„DLB‰ŠKÏá|Su+Gsâã«qãkc¨½a79؈íÚ…î÷ûH²è×l˨áMI (jûäslI^Kž\c™ ÍÆURI.«à1@îø ù¯"…DrE¡ßRA@drC"ýÃ%tÊ$¦Ð$ñ´n¶LyRËþßB•š5ΰþH.Œè,½ *(fê5#ጳõÂÕ±šJ©¨Tìf:†ArƒëH.8BÝkc Ï©ÈÓHjT ´R1µ¶_øAÕÚ ©ZlT¿åŒÌ/ÉÅ+ÿRØ\@ Ï)vm?ŒWUûãtÝÀ0"*V!>ÌzÞc®ìƒ{ÈI¤R³,±’˪ñ¸T&_É¿ÕÊY÷ª“H®Šþ×Âæ¢àËÚÀ˜—?$=,˜ìµ¿°8£Ýn¬„/Z¿ôêX‹d‹xŒß‘Wá×GÛ1ªû–ßAÁGÚo%¥-l T¹ÂeÙ°ë:áepäåIk˜ä*t]!Uµ~0Gµ`ôôiLþü †w­JÙz1áóÉ|ýÝDZøœ¾ZÓºÃ-Œœ± Îý3xäþçø+ÿ¢áèÌÁÜÿì4¶ÌÃÇ;]y¿ -[uç½Öâ•¢Fr™”sÉå:b5(EnnN±R‰l›¤°ùŸP„@QTÌ *`ÖÕ„ 8öókÜ1z3]_ú˜ñ¯öbÝ{C¿:  7Ѣ̟|0q¾3¸ëñy¤öº”öýéW+Š*Leé¯ßóh·ºÒaIRê­†ì,/ó6È¿¾[æ“Dr¹ºúâ… ¾œ±Žëú=EÃ2ÝT‹[® æÝ…»xM º>òsÅ­_lG}øGžª«šŠf44M&Iéb±Z˜ýÓh𔨉äòö>ŸO ›KC®tö/œÎ˜µA¡ ™ªÒ%µ°W®K‹Jy<²¤& ž¬-“KrYâq»éÚãVi H$—-Ó§|!…Í¥!„0ÅJl÷gy»{âßûk6?§%ñxó¿xî¹_YöV«BZÔT#‡%¥;Âëõb±XdZH$’Ë’Ká3/—N‚húÞÒ„¥Cîã½[9~l?¿~ù>þ< ÞcLù5ºæÍïÇQñ§~<»80“PÁÆþßVpÒåÄíõ!¤¨‘H$‰¤T¹ª…%ªUâC1€ 7¿Áì÷:²âõ;iÓþVÞ˜}ˆ„rá[ò.+ƒ{òЩÔ”&öeÛ„ÑìðB£çߤKÆ[4oÜ·¿[‹O–'É1¢ÿr¸%ðæfpðh¾³Ä©Ð½9:˜†K—i{>IZ,Àbàq‰èô2pú3‰ýLgÆQœÈ•«ö$«t*J $ œÊ₆C¡j§§ø¶ÓSÅO­8’m ¯‰hö 3š>—½žQ?þÁ¨¢-”´ÚHþã(Š‚ãÐfæÍ[ÈþÿžA>Jó.ÝhR-ú,£!ÁáŹïÁôQ.¨xÈ=ø ýïû‰WgNåš0™¾g¦·Àub/ógÌD4¿‹n)eÈÛ¾„o·DÒçæZ—¶¡V {ë ~ümå»’‹ÊUj±QŠ;X*Êyè‘Ó®A9s³G)j$W¹Û—ñö˜_p©6ìv;ÁÁAX´’› Õl#ÄnC=K°[­‡ØÑdõ(çáML|åIîy莎eÿõÃ>^Y²%XˆóöWç8·¤[¤ÿù3o>7‡OÇ8vlÎ{¼0qû¹~¨„û)h;!6ëi¢Fœó™ÿÝŸ-}Îþ<âR[Á$RØH$’R×þ¨åqç½ýx ì' ’"Q9Éô!]H.EB¶¼³ä(gìç.tö-GûÚ‰ÄVoë Nb±¨r×÷svÂܸ3יșþ,PMX,~K‰÷øVÞîך¤Šñ$&5fЧ+q( Š’Á{­ªq结èݤ"q©]™´%]3_䚤hªÞ8˜5¹~+œ¢xXóÙ`®«V I©Üÿî\2=þø^%=SDÛ‡©³öUF¬òË+ÅdÁjöwy›f3°kcâãã©R·cî°öä\É3ÝQ©B,Iº1q£ «Å„E9̧µ">¦m›Àá<áÙÅóm¯á‘—^àú”kwfÂßEáÄü÷éÞ<…ظjµÀ¼Ý™ Nnú™ûï{€Qƒï¤ZB×Þù[Òvñþ­IHH ÛÐoHWüƒQÅ{˜ ÜDÕ¸(*5ìÆ'k²üÇeäg)l$ÉÕ¥lTÏ)öîÞÉÎ;Ùu /~y¸-£³oaÁÎ4ÖNìÁw÷ÜÁ´c V­°Iq_Ã+C>¡ékóÙ½ò-”)ÃøK·!C=KØè¸,uöJ+V<û›S‘ÖYA4¹óuVoÙËÚ¹ÃÉþöÆ/JÀçÊæ¯ðõ_Ì ñt‡NŒ\–ÀÔU14j}žÿ€SžçáŸÍ¼½h+»V~Aø¢ÑŒ^´³dK³áÅÒš‘/Ôæ—aosì´Ã#¢èñ¶íÞÅü·;0ãí7ùó  áÞÏè{û²§Á‹ü¾m7Ë&>N5³a1±{Ò´}Ÿµ«¿"yÛç|²l' È9°C¢ó·dûUøä‘§ÙxMUxô“Eìß·™On1ôÌ2„@UGÿ¦„»Yú×oô±L£C›gѺ¿Çß˧³ô5ÆÌIÜ|ßï&¾´ `Ùž4~·Ÿö¼…ŸN!-ìRØH$’««e0a>¹œw߯Ë/¿Ì°±ß²o÷BÞ™ï!µŠ‹ÙŸå›¿ÝTµþÅĹÇ1Fñ(pjÛ –ïÂ}ÝkÕ€!o?L9— ¹Ýã¹1\‰äì£õ¸NŒ÷ Á˜¬XŽN"Ý(K—ú©¤hn|B!eü,ÊV űQoÖQl¡ )è«¥í”> ÿhµ1p{£éýúÓÌxx8¿õ¬€°*ì_9™AoýF‹ž·gÇ·o‡¼nÿ6½Š‰Ð¨ @ú[°˜£(¸§Å„ª»ð 'Yy^ª×M¦fh„€Z©ors…:ÿðP:˜’¸ã¾6³ 4%iOôg’ïzì\ÝC˜y%Ã[{xJàþºBT°½`¤®Z4„¡Ã©œRËÑ A-j '>¡:iÑÕl²¼Ia#‘H®: ³Å‚Åh&bRHRް7¸ 55UAXèðØ+ÔFdæ¤"ÌàNÛÀQŸ&}lÎÝCpòômü-ß}·GXM@g߯ß)wmúõé†]¸È˜ó*»Dá†WXø$(ò%‚ aVÖ‰$Z·¾¦¸ž¡(çÌŸZ7ÜF•ï_aξC(¡é¬üs/íú¿Å]-ª 271ãÃt]ǖؘ ìïÙzâ£òïª<Ï? \ŠŠš¹‰Ÿþðñðœ'¸9JCl?„ax‹žUì’"‹ÑýïdèP¾>•Ňhʃõ‹_ «Xe¹¼òSQ‰ä¬ÖÝ0Šw"¦&ŒxºóÜÂ{ß-à·3x÷™AL?¨`Qýç CQ½Mlë˜öÍ vïZÍ„‘_‘e5Ëäœé-0 Ýo0Óúö»9±ó/Žæ€J¹ÄêÙ²†u[ö²aá8Æ~—†Å¬C÷Q>È@×õÂN^øt`îèÛœO1hì,Y2ŸÏß|™Vð;Ò–XüwR£kÑçÆ*ÌøãPàX8É•"X¶à¶íÞÉ¢Ÿ³`U& Ìñ·ò@“S¼õä+ü¼ø7fNùˆïÖd¢i¢à~þÛèBÞA/òÝçÅM¢Q¢“ï¾[É=øüó™HsÞM`èF±÷4ô"åUºÃÔ’7ŸªÉ÷ôbÜO‹øuî·Œ~f?¥)%¿·ä?Ïþ|Í›5}¥ÍMmq:|ÏUUÙ¾m+uêÕ¿l—¢eE?S÷¸7E¿“ûó²yãªVOÆ0¤WÅE7ª( {ví"µvvnßF•ªÕÑ.Àެ†Ïƒ×VŽÆ «dRQe>²QOn¬’Ǫ%KY»ã8a)­éд!†=$–ú) *CƒÆUزð'~ûë05î|œ¦±eI©—J¸´— #}xµpêÖ¯AˆE#42†È˜b«]G›kˆI¬I¬k ³æ-e³ ·?pãªS½bY7™QݘþÍ0’#t6Î|‡‡†Œ¢É¬hP.šŽý`?›æó‘™v˜¹:‘1^t©i$ɵÊÜÌ’´›Ï˲"‘HasyWi„%ŒøJ剶AÓfͨ<í'\ºÀçØÅ‹=î¡áØÜ]«øU+>æÞ!ßbT®J…H+ÛåÐ@–!‰Dòä-Ò¹V"…ÍÕDБŸ¸»Ë‚Í Ù9÷}™zqAàа‡„b)ꩨÀ~F=;ûÃß1­O2¹ë>¥ÝÏseÅ—H$‰D ›RÆÐq—¹†'žDR„¾eSùít¶vkB½à³\TÈ^Ï'x¦{2 Z¯ #ÇÈ c‰D"‘HaSÚ„5ŠäÚõH‰4Q·V$«~»“éëÓhЬ„KEQŠì^¬œu'c‰D"‘H$¥ÇU»’_:n— ÛÅÉÙyØC˜ÕTÒÉÚ+aòÌýø¶,áï“™r*J"‘H$’ˈ«sU”!Í^ó IDATðí˜Î}=ÖlÓG¥ä®qèb'ŽœlÜ:€ÀIžGâxâý¡<6è^Ú}IbR4"×EžONFI®nΈÃB‘…ºÅ¾”±C.§L;=Èèåâ,|zT$Yf$RØœeöàçí –k+ŠŠf6cÖ4 :£.A5«@/;Œaöo˜œr+ã~ì†W¨& eÄ;(V‹,E’+¬Ï;G$í³D_SƒƒóÇóÔÁ¸‘ˆ´©E¿$çÀL|rƒ?CýP™¾ÿ( ϰï¼EÇÑÓKÈKEAÁÍw}o`rû˜Ù;îü„j1aT(8.¤0R„`ߟñÂÔ FŒ~š¹_¥ä_rNE)(ª†5ÈŽÝîÿdÃbÒP¿È±Xm˜TP0Ù‚°hJAr™­6ìö l Ö éh#¹Òjˆ¢plÑ'4¯Nå*U©V­* UZòáÜmè%E›Õ}¸=¾³:Ó+ÂÀíö 7Ø()½k¾¡UÓ{Y{Ô¢Y5•Î 1tÆö³îi$D‰7Ãpíä‰Mø|ë?Y:ºÇ…û4«³¢ޝùšî·bGV‘¨Óâ4a¤(üþ@ Ñw,.òŒ¢d ‘(YŒ‰ÓÞ¡—Xž$i±‘H$ÿCg jÊfOJ¼]C(*¶ `4ûVÎdáÚýxƒãiÞ©+µ£ÏÜ›ÊybsgÿÆ!o$µëª˜5™¦çLoÍDp°›ÝÌ¡ß>æñ¿åºW§ò\—d ›Õ³f²fO&ÁЩkS¢ƒ£/å/bˆ9²†?öåQ¡~º4«ÊþYSÙ’ã"ç«÷ÈŒIâöð¬™Ã¢ qx-Tlx¯­xÆFú‰M|=gõ»ÝDúoóH;r‚iãß#ºlmúÞ#gÛÑG !Ôg*6pÂÇÕóX¼~?¹3´¡SÓÊhèì^ð#›cëSvÇbþNSIiÝ•6)Q(²öÿÍœ«8¥ÆR1Lr/'‰´ØH$’ †0–pâÊNxX(V³Ê¡ér÷°ÙäÚÂ0öüÈ€»^f³®`*²ZPÏ;̸ÁóÕß™„ª˜üâhöhAHmsNiƒÉ¦±sÚn}ôš¿6™¡]ü¡%~£/¿¿îò׸ǸcÈl Tö-žÂ“÷<ÎÜŒªÇè|ýæËü¼#ƒ¸DÊØ,”K¬Jõªå± 'Û—­äÁ„p„)Cú2rqn‘æ_Ï.†?ñ4¿žP ·˜-KHH8‰•«Qµr¹9v³cérÒE0¡ê1¦>Ý—×f1’Gú¿È:©jÛɰÇ^áÏ\ïø†?ñ4 ÷û°{·óå[ŸpÄd•‹3$Òb#‘H.TË`#d绤$~‚‚ÀT½=_}ú cßø›^sVòP<@/l0rás¼gV¿ŸÅ©]?0çh5F¾?”†Ð2j+=ÆÊ QÏ)kT3Ö]_pÿ³UxiåJ­p,ɛǰOvÓkÞO ¬t-Kó†/3õ™NÔÖ luïâ©»º`'‡ôÕ¿óóÚ4nîÖ‚ÊSHmÖŽ55‚› m@Çt«º‹ž“~ä™Ö}PPAOcüƒÙU÷>|¢á&)µåb y›TPÿåö vÚ ÁMßëQ}'ÌàÙ6wcR "š>ÂÀžMÚü9½'S7;ˆÎü‘M7òñÐÇH òQ¿´Ê' †D ‰DrÐ=ä%ôæ»±OPÞnBµ•¡‚k»Ž³ª}->„‚Ùj¡ñ©,ô%ßð€ãÀZÌÑu¨á?U·=‰ê<écs.„ޝ\cÚ”Mã“—?£ë—PÑ ZÍ^¥&7ÔœW®9M#ŸfÃnµ…JtÍxìX(¤‘åð–b¾)†/›yï?Á+_¬"GWÀpS».@³ZÙ8êfNÕÈOOw üôÇʿѿq 6rXðÁ“¼4éw²| Šá$2¹&.ÀÐ5bk'N ¦œÝÇŽƒì#Û‰I¼™¨`P„Flj+bVgJÉÿ„œŠ’H$gëiÁN|b%¨¡¡˜\Ѽúç&6oÞÌæ-›X·vŸö*ÓY([´à2Ÿ‹7·ì¡ÎÚBÇT‡×¿ýŠ{Í“éuÏhvä¡QX½™œ(Øj;ƒcya¡fŠ;êŠÀEö÷,lpïÌð/³¹x [¶lfÓø–¸~Ç\Ãë%é¶çi©-࣯Öù󬈘QÕ‚õà”ì¯\¼ñíŸÂ° 'xmÁ¶nÙÌ–‰­q9óO{f!@sP>oÀÁ\Q0¼9x‘{UI¤°‘H$¶·E×õÂÏ71ðúS¼ÐëMÖŸpásç&óÛqQ¸·šɉ:ö+v€Îâ?`Ÿf“Í?¡»È3×bи)Ü>‡ûŽåT\wîHÚÄèóÉòå±üíY`íÌm©^_ ‚T Æ®gq4-Ã/<0ÀLt4À^}qÂfF„á#¸jWÞ9ƒŸaļƒ (X,6ôiœÌuÔ %,xRÐ]§Èrf’~ò$'ÓsÉvë`¶U`7Þ_€°š‹Ä6:ó. )ד½~[Od³ø³‰¤iÒÇF"…D"¹PšÆÐñx —ÛúÿÓkÂ|ž¯²ŒÛ$R!¹Oµ «MAèó…Ap\3†nÅG=jR·³"{¬:Ñe²–Œaàõx1t/„VcàÈ1ܘ5ž6/徯§SsÅ jÆ&ÑÿçrŒ›5šdt<>_¡¥L÷yñê:˜£éØç&õ©NDBo6'ÜÏ3NqKRµ›¿FÈÍ-±¹œ€îñàñú°TéÂØ7{³è±[xý÷,"j6¢Sêqz7I b½Á(Á¿F ‘=ÿR«¥R§n]jU-OÿÝyíV'w$U¦V³— êÞ›Û°yðè…ÊF÷zðR§+OßÅÀfÉÔi|3Äv%QqaHKŸäàŒ¢:tÈ 1â­Ñ¤Ÿú)±³UÎ=Z*ò,‡gm–ΙþÿtÍù¥üû.1Ï_Æ_Lž¼—ÕTp\W‚©×²MS¢Ïßì®ßSd™‘\ÀßÕ7<ÒY÷Ó›ŒŸµ «§¾Ã«?ïÆ¢œ]D¯ð Ç}ɨù‡ ’1åžaLy¬©ÿ“ÉBHpÚy… õÓ¬Á„™‹:ËÈEÞx7ñZ¯›yì£yÊvãÉ;ɺù“5b"' ö̆Aœ+ è?=^"‘\ÂËN|¥Š$&&ü«˜X2!é#¹,¹º,6Ts8-º´çûYË9ÑçZ*ØÈÛÍÌ?Ò¸óÑVØÝûóè½¼7{TjÃ+ŸN¤wŠ™Uï<ÎȼšÔ[ÿ9Ÿ­LC¨`0Ä5êt|¡v0âXf?CqÝhd0n@OV%?˘ÁmÙ?ñqú¿?‹ÝÇÕÛ?Τñ“d>M%(‡–}Á“CF²:ÍCÍÎOñþˆGI+j52øõ™‡êf~_8ˆ Â@ 0|>¼>AfÜßž )÷üËpæ•mGû“«9ùÂ"¾h cxçÞä¾ú3/-àÉQ3(£eñËŠõX“oáÃßäÚ¸,ƶ»Ž-$h·,O¯@ÿ¿æÅ›b¦½Ê£¯Of;”6äíÇ:SVn%‘\9M¦h¡UiÛ½jÉ£iR‘H‹Mi=E#¹^K¢ö®bcZ6 8¹mòjг^ÓïoÇÌÈÇX¶ósŸ«Ä[]ng‰GìyY?v±¯,çÀ‘CÌ~ª)}Çû˜5®¡9ù»€~JÕÎýL| =ßÛúóöà¶Ø1 ´1oÎXþ¿r˜H—§–j±‘Oæ–9 ~ãG:ŽšË–Ë¹3d¯¼5L½ˆÕÈ»I‹ŽÑö凉W@nN¤ápÚ12²ó€NÖ~ü#­§lgó7#I rãÒ ÝA=NnC:{Y„¯Ã6lÝÍØŽ'yåå÷IGÁëÈdë⃼¼b'æßÏü{;òéAH›9œS³xé§¿Ùº|2ÑËßcÔœM2îDiqÙÇH.hyRd“\ø~XZl.<¶Êµi™”Íäeh_¥›ÿœ­Q;’\¿p÷"3-_Éã—iSPƒ¨eÏ×KsxÀðqë ¨e <†Žîvîh‹ª¡_ÃÈ–“Óày¾}¹*5;6cÁìŸø"[Å–œ„kê Ѣȴ•ÁŽus8¬E“·}1S·8l±ìÙ¸–£Ù½ˆ(Т9G9á £M\`úʹG¼Ïú=[Øp(–/þœ‰âqSþžtŽð–Ø CÇÖ°+÷´¬@ív÷óógì9ê»^»Ï’ûòZÛW>þ7}QUë³ÉìU!8Tç»%;Ö­–¬¸¥„¦*l;”‡föÈÄH$—&³ã,u»ê„5†›;ÔâÃq?s´O,+çn¥Éƒ# ÊG–)šª‰1Äè.t}Ç|Cåú&Nýeâ‚‹Ü¥då©( œÚƬM~©3à_IÅ^ÞèÝ›¿“ûp{³*„ª‘˜|¹xN{BGF!‘©ÄÅÅaÄuáõÎU‰.rZp$j.{Óu¨f‚ຼðþç¸~Nç[~BU@*eãC ï\Ìl¬†¿`BÓT@ šÌX.·Ð+WøÃeˇàšÂs=ª²äã7Ñ®yŒjeíü ì™ÿ:ã®yŠÄãy° õ«GË-ø¬ÿ3 ¶?Ã-u#Ø·j'êÝÎÀë«ÊÚ[𠇣tve:Wì“‹ErÑóM>äÂZl.MÛ¤~ y³¦¯´¹©-N‡ã‚ERU•íÛ¶R§^ýR¶Úø§d*V !]/O§ûî§v´†ØêvêXv1ÿ—…¬Þ~‚èúíiפ2¦œLŒØšV‹ ¤Z b²ÖðÃì%̉¢~­”¨j4MŽF÷8q¨áÔK­NTrš–;ÌŠê6hA‡feY>í æ¬sоgb‚âiÞª.Ö¼,§Ò±ÕlÆu‰A„ÕkM¼%LœºÜÊÍi“œDåk›QÙ¹_ss fÍYŠ’Ú‹¿(‹“U“>E¹ÿ ÖMeaZ"O¼ûâL˜*Ô§SÓX¶ü:›El"ÝR‘6­šncóÆ T­žŒaÈm/¾…FaÏ®]¤Ö®ÃÞ]Û9a”C\ˆ5Bàó tÃÿÏgpΠq– ‰a9NýŒh±šÉLÅh+‡¯ô./±7÷éŃäùô@0Ðÿávúy\+”)LÅÇI÷ibâ,Ïs®ßòéÝ=?¾Ö¿¸¾(*ヱ:=d{ºPP¥Ê¹‚,6ÖÜ]¤¦¦rìØQ, aaaÿª½ËËÍeåÊ•®¿×­ÿ&pظ=€÷êÜÝ[ DÚ¬r;oº½`¤ë'ˆf½Ÿ¡Yïâµ<ªÃ½ *zž©<]¾N×"g%‹ˆ*×ñP•Âã)Ýž"%¿µ¨sÃÇÜVð]»æ‹Z÷fp µ(ØãñÐ+JË(ùï`«BG^¢Ç–‰Fý_ QÑgV¹ñ¡áÜxÚ¹ÇÖ <>;{¦Ï€3“+¤BS¾÷†bVPˆ¬Ó‰çFw’µõrj8 øÿê!°†Ûi^-œr‘ÓÐÙ´ý[Ó½ÅåÅÒÄ5åáè)ˆü¢_j ª³ü¤ƒ\!76<æ`+Í*YÙ¸#›,¯“…¦u#0ŽœâÏcÞ±úH ¨&êÖ'{Oû%‰ OW‰«R–úG\lÍôa.â g ¶Ñ¤¼‰Í{sÉñ•ü[>a¢fr©ÑfL† ;ÛÁšÙäXl\oaëž²}ç¯î¼†FÝÚ‘ÏÈ!'"ŒÆ6K¸åjË+¨}º™yu ›³­;÷ÈB9Ïóþ©ýQþù¢s†RWÎù%ßR9÷°ÍÐñz<ø<Å#|n'nŸ°œwHJCéÿ³®A±˜¨ªóÇæòtŠ +LJ.†!Ó¦ ªêwCÏ·êè†(x=à—¦êˆ\!|6kbÒˆ+ka›"Ð…J“1TreòóI/†èºá¯õ¨ªX ЭBþÂMý?öî;\ŠêþãøûÌl½½W:H/J¤ˆ(ˆØ°w%M,ÑX£&Fcû/1Æ+VbE¤K½€Ò¹p{ß{w§œß»·QôûzžûÀîÎîô™Ïœ9ç (G“šÀR.a¼žè°nì Ý*6œëjGcÅ>‹–Îa(|†"+ÉÇ*Ç%bƒiîz\ÒØ¶Aï!ÙŒM 3kU9•Ú¤m^tª ƒ¬$/nìûFìPÛ6UìÉáêhÜnl¥±]Çј/yñ6–íà¢ö0 â ;>ýHÕ#‹ú~LUŠì§òÚK§¶.ÒM*×,(j.¥Qr`9ðƒ»_êØhÛb[qÕ-úO2ü~†öˤ¶Ó¶X³¦„75DOX:z‹ÔÕŠÜ6iŒïD²¶X»)„vt¬ÇjéµzO,aP Σ—[ÉËË*©v¤Ž˜A§D«.ÄÜE%|QáÒ±w6G-¾ôÆÑ+ÍC¨´’7U’6¨ ‡¦*¬‘ë†xqF ‰}ó8*߇ϣ)/ªâý%j·)ɺ2Ú¤sB/ZL°o6R4gŽKÀ ×ðÜ̪ŒÖû¿ãñÐ5ÍdÝÂR—¸ø ز³ex42›Ž)šüØ÷_˜SÅ!‡æ00Óƒ©\¶m)çƒU5T;àOLà¸!t j6l¨Áxâ} èœDf0_·Ë ²¬‚W?«¤AîKÜçC‚øQ©{y½Kˆ‘RšƒäÀ±ŸJzµ Ž7@ïNÉ48€e±®0L×9´+)æŸóë°ã8eLƒÊ¶°ÂÆ!­5Þ@áÝâX±`+‹+ýæÓÙáºÑç–‰Ýc¤v5¶égØ\âËËyqI%U ¼>$›¸­…<º¶ŒN9œ6<ƒâ·w±4Á¶^¶|´•wêLÆÈ¡V-3?ÛÊâÑ9-ÜÂâJúLÒ¶–òäòj\“¾ýÛ2®{O-Ž>á 9mÓ8ªÉ̹;Y_§‰_º“öÝÌ\PB©¥ð{j×m˲X_b3¢WC75P²(.Sí8¬X²“6=‚|¸°˜âˆ".Î×kw²p~Ççãˆ9 ÈoàƒMš¡C³nÝÁƒaòºåp’6Õ4°l]Ù !žXZ‹6~BîIä^?RµK 6BüŒBªf?ûu´c¥~¯6A» Aú¦xÍTNÊNR|^²<,«i.±ñ'&àÕ±¦$‚ƒbÅšJzõ÷7—‰=—™ÚÄìÜ\O¹¯‹Ž‹§{\˜wÖÖr 6­/ãËîm螬(PP[XÍ—!ð+—¢‡CÊÔx”Âë1x£)5‚ŸÑCÒIñ…ñ 6Ó:d1Ʋ˜·¤˜uCaÑ[R^ËilÁT+—Q›Gûô8:¶÷“l„™3¿˜m†jþ¾Ûrñ&$q\¯ AüƒâJfœîqaÞ[[G½«X·®‚¢n9¨Æ[O¦ßgàʶós‰ðl„ß&Ù(–ýýûŠÐàq\‡˜¿º”*[ƒ«±âRñ)‹>ÙÂzÇhêŒÑµ]âsãpµ&lÙ¸€c;„"T8Lƒëòll¹¹ÇUç¸áž_áØm9>²™×Ö†pƒ`h›š°ƒ…‹ãÔ9`àq5vÄ!bÛ¸Zq5¸6 V´>“eÛ„-'˜ÄÄAÉlXRÈûÅ|™¹œÖ,ËÆÖ®w‰OòàZ  <¶ƒëºDl›°õ5n×S°¡žuÁÕjÏ1½}<²ÊÆÕ.+úý´ìtÆvñòé’l¬qhÓ)>^—°Ö˜®CUƒ¥¶¡ÎÕ¸¶EÄqÑŽÓ´M‰ŸA‰ÍTèvP »?‚Z©¦Nø„øÅ]i«÷C›èÎ…«È `‡Bl³2é›e²r³…¡M•‰£ãׄp}’¼.5EJRÓåâ#óÓ°…™…!Jܺ¤)¶”j¼‰ñtô[|\é@V´4ÆÕ.®6šëéh7Úìp# ñÅ–:ª1h—æÇ§¢ýn)¨Ù¶ƒéÛ³8qPÕŸ±£!ZA\+…ŠUß[ú \ÇÅrÀÕ6UðzT´uÛ&磲´–õ% DL )><µ§¶žbBûDØ\éâI’éÑlUdVFã<Ê6òó6RbóÍW9@¤r9/MßȰAé¼?/™E²„ñK=Aºý}±º^CE+‘ÇB‹Ç ñÞ¢ N?´ '¥×Qa+ 6,-d O¬åK¨ªŠÕÕ Þ'“M•9mxt8ZGCjïñH¦5xM@DÊKyþ3ƒÓæã¸…ÌZbâÀ6øvDHÍM ²`'Ëj5L…7Ö:Jk¡¢¯]Ǧ¨ZÓ·G u,ÙPM¡Ã½ÓÙn™tÉ1qu4|(ÓÀkh6ì`NB>ÇÎä%l E¨6R9¼g&¥u!ÔP¯Z_/ZxuhYÊ¥ºÁÁè’l1wAuUÊÏО™”Ö†X[RƒÑ6™Ã»A­á£oº¢¶Na„«™±*•Irp67àOO €‰KEyV§$ÆôôRV[Dz!l9¶ÜÇ'¹µ¯°ªª‘ UœÆÅ§››CïÏ=­·ÄzÉŒõCÓ4ŒŽ]ùÈ6-~¤+ÿýqè•Uóæ"EÕ¢“RTm.âùê8ò“=xÑlÚ¡0–SÅ»uPïh\m³pI!E™AÊe颭,ó”ZH‹¨½îÃÕµ¼³ ²p´QwYa)/~ZO¦rزu;¯”Ä‘g°qG%›‹êqLEÑW%¼¥"±õí²y}15ví:¬\¶êŒAenñþü´Oñ œz>˜[Cb¼KÄ_-ÝFy½W»,_^H]N€Gc…뙽¸ˆ6É ׯŽ×Z2ÝŸ¯(!+ÉG¼G®cùÊz¶V9hÕÀœÅEä§x0]›ò²Þ]f“oâZÕ¼5» ²qMضz;o–Å“á‡Âµ;øj›†zˆÔTòÆ¢Ùq‘°k®.GÒƒút­%Ø|mºh ¾ôÁ\zÙ@ Cñû^3¤Pª—ÏÍ´)Óyù”Ìýwm¥4Å _åº'ÖòÇ{n C’¹ë(l>p5wÚ§òæ5#šwÅ]R‘ÖZZ‰ý~àØÑÆ5ðUh÷ÖpJAuE-Õ»ló¡6µÞjóåÖðö ±Çåްig¤i)4¥%Õ”]¦EEÕµZŽšÚÊ:j[\DUWÔQ{]_WÏÚºúæ•VUËêªæñ•ÖF·¢¸†ŠÆß°#|µµyª*j©Š­çh/ÈÍqšèÓäk«ë©­®ße5GKúª*k©ªl~¯¬´†²RvVá°cG;߬h¥0p(.®¦x—ßy‰tз—“¿R(ª¸dž?þ\Ó Ãhà±á9¼sê ÞøM6‘ºj#{E»-r­ö©ó°¸œCT2‰>õ5ªzê,§õ\)܆õ\3î,úýs>çõTßj¼B|mè¦u'hûkÿÛ· }^k©_ó-–å^×A«avíhýíe4ÿî.ßiùûZãMhÕ/[ IDATÉä·Çeg¹M•xM×fþ’­Ìú²W}ó6£¿q¾Ãrß…×ϵŽMã>ðÖ[oQRRB8ÆqœVÃø|>,ËbܸqtíÚu¯¿ä‹K Þ׺ÿxo|"AoãX °ŠYòî –ûè=ê†vH@ ÅkùhÎvÔi²» aônÄ ¬|g:Åù=¨_9Š9±]!ïÍYAEÄ )ÿPŽw(Þ¸T:¶÷à5 qÊXôч¬ÙQƒ‘˜Ï°ñGb(…鉰nî|º¾–ܾG0v`¶Í|uµÞø7Öçí9þœñd™²Á‹ýWbãJ|ûQ¸¢˜;ß¹[ƒ iDà ››øǧƒñSÍ`(⢋.¢¾¾žœœRSSIMM%33“3fðôÓOÏÛ4 Ãçá˧nå¥UÔ®›Îç\ÍU@ñÜ}ã­¼½|'ẼñÀ<ôÖ* Ž7ÿp1WÞüÛH'Õ^ÄçÿŽw7†ÐV%+?[B™ Õë>æžûÿKQF;u¼yçEÜöÄG”7„)Y7ŸE_Öá (™þwúàK* —pïu×óö—øâñ{ âSHM‰G2ØŸW ÑŠ¤ÈŸüí¿?ŸIÀÛúÏc(Y6ò÷-ÿôϳ¹wãLvÚiäååqÖYg±hÑ"²²²˜={6Û·oç­·Þ"77÷ûÕCqømÎåŽë'ãç2NÂí¬&÷Ðÿ±­íq}2·ßr)éf©e—òæâBŽŸ2Ž®iÓè}ôÉœÜÝ@nE‰ý)b»88² „[?Âí¨Ÿ¬ŽÖš‘#GòÜsÏ1yòd^yåÖ¬YÃ%—\ÂÂ… ÉÈÈØ§P³ÇÛÉчáÚŠÎG Šõœ™Àˆá9ÜòÑ* s–ðþ?£ÿów4})iôÕ8Žƒ2}´ë×1ú~»3¹|ÈãœÑg £›Ì©gœÊ¨^9M%²Ê„ÐÆO¥ôãжѲÓãl\[“7¸é’ 2döÑØõ|ãe¶„±?Ô58ÜsA?PÒï¦âÀôâsK~¾ÁF)Õnn¸áN>ùd<Ï·5~Òâ j{e‹÷jØVéLÄÆ¡©)®mú´ª,„'9JæÈ«åÙ&îò›¥ÑTÔØLœ4.~á &¯žË‡ï¿ÄUÇžÁuŸÎâ³9UyâÓÐ UÔµj÷m×m»Ð”³ZÎ=Fs[ti.öÓ>ËÅç“e!„80ýÕlŒŸrƒË”)S¸ãŽ;˜6mÚ>—Ô€Ÿ1§ ¡ð¥[yá‹"êë+Xüì-<»½+Çd.†ÏËÆçïàÝ-a¬­ïrç+¥L8ïpí3‚ío<À?gEØŽPTð93¬ÁiN4Q;çòÚ¬UÄõÁéœBg£ UÑg©hâºNå0ûyb>5–MنŬØZ‡a(öPžf~üø}¯S YSÿÉ´krùÇÔAtêÔ›³-ãšW_á¤ìè@ášzÚOÆ›çô"wÈoñ^ò÷•Lê€ÓxàÆqL¿v]:§ßÊ¢Â0 U"â6fŽ2þw÷¹ôm“O›þW’péƒ\×Ë$± ‡-´vð$õ榇ï¤ú™ éÓ©=CO½ƒÅU&ʉÐ`5wmïXa¶ÞL&œ>€'ÎêJzû³X‘[QB!Äþò“ߌ߽°}8ËÇ:ìÐÄ3⊱àŠ=…¥ ç½³Žó¸Œ6ˆ&HŸã¯åíã¯Ý-0ýañÎæßÈ™ÂLÙõÇIvo kÎXy‡Ì“sNn=\ïgø´i|&Ýý"“¢/rÁc¬¼à±¦‘Jåa!„âgl¾G"Úk½”¯ G_WŸEíÃoìľåtîþ³j„BˆýÅE „B 6B!„l„B!$Ø!„BH°B!„!„B 6?'»vÿ¬÷ú¡ÞcWÑ_ûýï9a-{OMÝeäZKÇB!$Øü¬ƒÊ7}¨”¦¾ts?[NmD·î·F)ÜðæÎœKQD¡T˜o¿Ä'ëŠY:ç}–Õ¢”&Tº‘¹Ÿ-§ÆÒûï™PJ¡”Íú¯2o«…ÚSÿ>ì@Z³XþâÿñÎW‘½ß*ä©[ÿÀ‡ÛÜ]B‘ÃâGoâÎY¥{EB!ÄAÈóKœéHÙff- qÒu—Ó1Ùƒ«ü´ëš³×”§L~¿wŸû<ü쳎¿ó!"Ú‹y#^¯Ð(ÃßïÇë7v -{~.–ÖÍ=«¯ë Y8ñ?39±)ôìÞ‹±R _ ˆÏkî2“Ò…0'îjnÙÓˆ…BˆƒÐ/´ŽFÇ·eèÈ1Œ>òHÆŒF—¼dŒÐWüûʉôlŸGû‡ó»g¦ei†m³næ?8ºw{òºŽäêç Àï%>XÇßFtâ„]|¯·˜kôæªEâ½&ÞðþyÙ±têоã/ãýuµ(¥-äŽÓ†sHÛ\:÷?†{gnC)—Ï#.½‰ëOJ÷Ã'ñГOsîQ½éб#]ú̓ï¬ÕÀ¿ŽÈæì7j¢¥.áM<ùÛÉôê˜O›Ž½9ó‘…Ø(”[Çügoft¯Ž´í6Šûæ”PúÞ}Üõéf nBûN‡qýÿÍ!,¡F!„›ƒ2ðÔ®ãíi/ðâ /ðÒôYÖ×ðògñJæo˜¿¹ÍsþLñ}WðÀj‹€Ùü=«bþÃÓŒþë¶®xž¾KŸ`q؇©Þ`À„K½o|*¡åŸE[ )pCU˜Á|â*>S£÷ðÔ£!ÀPцéÅg¸„«ŠûzrÃC2€:l ê¾GˆKM`åš`²0T“ÿæ¾ÃôwÿÇü‰Ñ¿ÿwŸÝ«i\Dj©'ŽÜø¦Q¢bÿš^oSý×1ðÇS¶!„?3¿Ü~l”Â0 LÓÄT@VM.äÏkIÉÈ$#=¤ø8~³9 ¸è0”øÚ/ÙX}«jí\6[&JÈN1©(¬ˆ~Ú̦ÊzP L(]½žM%5híR´õKÊD²{¥—w ³VÙ¤fd’žžJB\Ÿi´n¥,üôs:7ýíižºï–Íýˆ’¦Ï]HìA¿Ô"^™³ÐhÇ"ùú[K^ÂGd/B!%6ukÓP¡±t´1P7n»óLN¿ù|~½fÝR¶lãÐîçXlÂá®ëh;…S¼Å¿ï~˜­ƒÓXñú\ÌllƒñççÁ{oã_¾ ·ÎeMq99N´ÔÄZÌ£üƒ•‡Ä±lÖ{t?þNró†s÷íã¹äæ³¹qâ‘d{jÙ¾¹šc$'BƒåD'0\Ä[O>²’4ò3k?_Bïá¿!Ý"l»@Gn¼åT¦Þ|>¿Y>žŽ¾jªÚœÈM§ø‰Ô×cëæn¨'ìÂÀ‘}©zòïÜÊaäˆCÛJ)ŽBˆƒÚnç±#†»}ìÑ㨅öØùû0 ƒµkè{èa?íL“éÔ³;ݺäð(4E|—Q3¢3^ÇÁŒO§ç°£Õ3—„ø:Ò•.í³ñ{ƒô8|(ÉNuVN¹˜ÉƒzÓµC;Ò»ÁðN&eyÇsÒø1ôïÝ…¼”ºžÈ„^ÔF¼ôw6çLD‚ éýÆ3º_68.þä\5Á2HÎÈ£gntÌJ@>’1]ß@'qƤ¡Ä{©zл_Ú$™ÄuÁ„a0mjúìKûŒr;w§G÷ΤAÚtîA÷ÎÉï;˜Cs ê-™ùíÉÏJÜ/Ex«V,§K×n¸®+{ØL)ņ/¿¤WŸ¾¬_[@ç.]1M‰§BˆÓÊå_нGOŠŠvâóùHJJúVÇ»ºÚZæÍ›×°dÙ/ÇÞŽáØ¿ÀúÅ•Øh­ð¥µcô‘í¢¯c KiÖŠÌîÙÒ}xë/e´çˆ š†÷%µgÌäöÍŸwë h4Aº<žîMôŽýÛÃÓ;Ðëð–Ó¢QÊC‡cé0 ÕTB÷ÁŒ‰'iÃO›‡Ó¦Çá»Ì‹‡Îc&Ó™æ~l²{àÄ^­'ÿ°1G7Ï“Æà±cbÓ›ÍÐcNa(­Š®dÏBqÐúÅ›Ý:°kñÁ¾œÒÕ×|¢¾õ´¨oË×L××vÞ÷ãÛó#„Bˆƒ™<S!„l„B!$Ø!„BH°B!„`#„B 6B!„l„B!$Ø!„BH°B!„`#„B 6B!„l„B!$Ø!„BH°B!„!„B 6B!„l„B!$Ø!„BH°B!„!„B 6B!„l„B!$Ø!„B‚B!„!„B 6B!„l„B!$Ø!„B‚B!„!„B 6B!„l„B!ÁF!„B‚B!„!„B 6B!„l„B!ÁF!„B‚B!„!„B 6B!„`#„B!ÁF!„B‚B!„!„B 6B!„`#„B!ÁF!„B‚B!„!„BH°B!„`#„B!ÁF!„B‚B!„!„BH°B!„`#„B!ÁF!„B‚B!$Ø!„BH°B!„`#„B!ÁF!„B‚B!$Ø!„BH°B!„`#„B!ÁF!„l„B!$Ø!„BH°B!„`#„B!ÁF!„l„B!$Ø!„BH°B!„`#„B 6B!„l„B!$Ø!„BH°B!„`#„B 6B!„l„B!$Ø!„BH°B!„`#„B 6B!„l„B!$Ø!„BH°B!„!„B 6B!„l„B!$Ø!„BH°B!„!„B 6B!„l„B!$Ø!„B‚B!„!„B 6B!„l„B!$Ø!„B‚B!„!„B 6B!„l„B!ÁF!„B‚B!„!„B 6B!„l„B!ÁF!„B‚B!„!„B 6B!„`#„B!ÁF!„B‚B!„!„B 6B!„`#„B!ÁF!„B‚B!„!~q´Öø|>YBˆ–R Ñ( qxd1 qð(п?ÀsOý=b!ÄDz,Gcæv¬’`#ÄALkMJZk Ö0äðax¼^$Ö!Ôã•뺔•—áØ6Á`œ!ÄîŠnÝz°nm%Å;q]ÍU¼+„ßÂ0 Ð IIM•`#„Ø=ØÄ'$Уg/B¡®ve¡!àh^ŸŸ„„”Rh­÷û-) 6B̉Ø! e!ª ³¢ž´ŠB!ÄOva&ÁF!„b/äV”¹ª8w¿M‹Öh¥š[kˆÍѵþÚey -ãŸûvûsZÖ²=ý4Ç- 6Bä+à9¶Ö?Q‹(Cá1M”Ú½X+…ÒÛvGÂh÷À«àl˜&~¿Ó4÷zÖ®‹í8M!H|ç Ó40 s'·¦íÙqÈmeßçÑÄ0Œ¯ŸÇŸrŸý —a˜{Yÿl„h­)-)aõª•TTTüÇ)ƒää$zöîCffæîqÀvJJŠ(--¥>T=°@Á0..ŽŽ;Ÿˆëº­æA)…ëºnßNÁšÕÔÔÔ"…7ßyi èÔ¹3ºtÙk¬ªªbÕŠ””–|AR)âãéÖ½ùmÚ`ì©ÄÆu)Ží³•••¿¨¾§ü>?:vänÝðx~˜"ÁFˆƒ\}}=ëׯ§O¿~t9¤ÛO2 kV³~m‰ññããw;QUWUQUUIïÞ}HNM= Šá-ËbçŽB éѳ‘Hd÷me%›6mdĨÑäæåËF÷=”—•2÷ã9ƒAÚ´m»Û­IÛ¶YWP@Ûöí8nÊ å ºT@vvÛ·mco—Îååäæå“›—ÿ£/㟋Æe––žAŸ¾ý(X½Šü6mv[Ž®ëRZVÊ„‰“ºÛ4ó˜ß¦=[6o¡¼¼Œ”´´Ý† …Bø~:vêò‹Ùžç1)9…!‡ããÙÒ±Sç=–hI°BN­®z~Ìä®ãr\gù®‹aš8` Ýr>öru]¯ß¿Çùþ¦å­¥NN«å¤µÆ`YVtÙï¾Àp÷ žG¥Àôx°k¯Û„Ñ¢>Ú/!$·\ÿqÁ8"Vy¦øY¥vñÃp¢à`šæ¾U…Ðîy¢WjŸêr4>ëÀ0 *«*X¹j9eeeO#mLJü’’’ÈHÏ ';øøø¦J£r Ðôöü}†ñ³ŸÇï}1ö’`#~ôPã8;wì ¨hçÁÛêá{ôLÒÓÓÉËÏÇãõî÷°w ÇõIVú;,_¥ ÎàCIJLŠ–Fi‹Wc;áp˜ŠŠ Ö­_C ä.Ýðþëü ¼~ÿYlÏ¿„}ö'^ýlÄ¿óº®Ë¶m[Ù¼i={õÆ×¢xÿ—"ް®`5u¡:ºu뎱‡–!ÒRk0Íh±¹vÝïL”æÀlåò§©²²’”äTŠJvàõzq]G»±[)Ã0¨o¨';;Û¶øìóyŒy$Žã„&ÍÛã8?ÊÉøëÇ¡ÑÚÀ4Õ÷(ÑhL¢³åâ8û«.ëܾË>üS¬o 6â dÛ6_­[ÏQãÇ“’’ú‹]9¹9Ìš1ƒ¶mÚ”¼Jš;˜C†i€«« µF™L¥ql§u‡yßxàuXõâŸùÕŒ$^èJÒß½Ãr7úƒÑ£¦2v9‰èï•yöñnÒ^Kl¾é«•<[£7þwóæM̘1¯×Ûê;–eqòÔ“))-¦ÿ¡¨««cöGpäè±­ÃR˜Æ.ËU»Ñõ÷£UÃcbhÛ‰Ö~i~ ÃkSzðÇáïòÅu‡4m[ßm\zÖHËá¢}߸ŽÓb=™˜æV~Û¾_Ý0—~\Š>ÿ9nŸÐã[,2eðë!“èðïÕ\7ÐdÿTïq÷i{jÞ®@¦¡vÙÜýp ”ò'oæÒùx÷‹Hò~ó2M—™—ÁÕÙ÷³êƒp]0ZS¾ß¶¦ÐBy¤‚øÑ/ûjCu¤¦¦µ:QüÒþ’’’±›pÄÚÿËØ„í¯ÝFv·ËØ\kG¯`<6Þ= Õéê< ¢ýϘ¦ëHLµ:½±÷MÓÄP í:X– G¦Ùt%÷­ãƒv£· EuÁ'¼ýÆ›|ðÞ;Ì|÷mfÏ]JI=Ãêæauãk×Mb4¼©Æ³±v í\Ï' Öv¢ïéØm¡¦kç¦ßÓ­‰n5¬þ›s4œäççs饗qÁpþpîyçrÎ9çpÁçã3½Ø¶EMM5½{õÁðø(Z9»j'ZGKvÊæÿ—A¦ÂŸDrr2ÁÄÎ\ûïyD s—õa  Å‰Ðˆ}f`ÄNŒ†Ñrª¦ïFÏ™±eb4¯ßÆ“©ÇãðüÈd:þu ÇåùQ)tüëf<0è~ê•\2,ÐÑíÇ0šÆ×ú¤¬Zm?†i¢¾Cpm<ùW­šÎáFðÞÚºkÉA“Æ…ÿ~[&vç¬àŒmš§ Å<F4õ6-·]¶{;ÁÅ}?’÷0|s÷Ù±øv]/ßéDì-/ÜDžR$&§œœLrÞ@nž¶«q›UÍË´y|Ñ „–ï7mÞªyû0 Ëv›·¥¦ ­÷¼¡è8ñ|. ¸¬yæzzN½*LjŽg×qÇ–¥Öì²l¢ËíǬ[&%6â'Ì8ú>ÿÄNlŠýUóDkÒ <’±ú¬ÑòÙèÄ4;–À«oϧ\'pظ7 ¦ã t Ÿ¾ö¯Þ߆‘'A–aàõÙ¬yï [¶ƒÔ^£8eâpÒ|-¯Lõ7çšækñhËÂÄ1í°ë*YûùVlîĸî¶V‘”Cœ©p­Š‹ëHÍÍ"R¸‘šø4̪T‡MRrÛ‘¯©,)"\ïeÛW¸f í;ç`Ô•³cg 6S²ÉÎLÁ£,Ê·l!—L¸¬ˆ¼Ž‡àñx¾ÕÒo¹Ýº±“Nee%7nŒVm:ÁE—v5EÅÅÌxÿ}ví׿A¨èÔڽɿê}+ зmõm¡ã¶Ù¼W¦ÏøS9¡·ÅëO¿ÂòšŽ<~*ÃIG¹ÖÏ~•ÿ-Ø@MÄO—áÇsÚÑÝ ­|—Ù%.¡à.« ³|Pª }ø w†ó8ôèãéššEzœpÙ6ŸØYäo›ÇGëªi3xSêCЄHeo¼ð:UÉ Ÿ2†ú…ËèyÊét FK tS2ÝÇmÚðÇhÞžÁ@áÁã­eΓàfugbûÁÑRI+ij^áý%[‰¨º;ŽãìF@¹lž÷¯Í^N¥›@÷1S9yJSþÕ<Ÿó1;Ív{Æ™ôÏR ›?y…i³WRëËæˆãOcÌ!)Ô•®gÖ§«Hð6°hÙ:Œœþœ|êq´Îß·¹m î ehÌþ×òÅÌ›É2Ã,}âz&üþQΞð0Ý<Ô—¬å¯N§ ¤žŒî£9iÊ(²ýš²eïñʇK)¬rÈì6‚3NAªáR¼òæi2ŠW0oKˆøj›€¯žE¯>ÊÜ‚Jò;š©’`‚r«˜óòó|RP„7÷0N8óDº&ÚøÓIób‡ŠYðñ\ÊצrÏÕ¤çàòËÇa¯›ËËoÍaG½I—Ã'qü¨>Ä•Ìyâ9Ê;÷¥|ál¶9ùL8û<†æªXI ?xE»½ÄFÚÃüNØû\<ªöéÏhqE°¯ßùÆ?hº:küS¨V¯£Wnêùû¡ö«Æ«LF›AR’ü˜ HŽ÷5 W¹ô5Î?ë:Ô&b¯åöóÎåÅùÛQ—o=Ž ÿ2žGBÝZ>_]ðQöÎCÜ7s+ñ ¯ÿù×<øöXß* F‹Ÿ-êÚ˜¼±«L×Ñà ॎ­·b©èôº‘J¶l,Äõz¨Ü¸ŠËÖa'd‘•ÐÀê%k¨UÁ8¼þ )Ùùäçet*Y½|UNää8*7¯bÓŽJÀ¦¸`« ¶áKÍÃ4Œ%:ûvjy;ªñ_¯ÇKzF:ii餥§‘žžFZzéiédddлW/ÆŸ|&Þi7‘Ûötèß6¬Ä®«Œ%>ö&‘ß>—´´4ÒÒRIx0=ü~"Ü÷ œD–=|!ã.|°ò²qÆS\6ùl^­ÈeHÿ®”Ïy†ËO9™†ˆ¯åîßœÃÙSobnU÷«w¸òšûÙPá ÝzÖÌùŒP|y‰å<}ù$~?½œÄ6íh“è'Ø®ƒõ£kï´KôlÛ‡Áƒ£s»–Þ x§Ðlúð9.?á<Þ¬Êc`·^ýÓµ¼°´Ür¿ô$ü¨‚ÜÌzþ{ùοýaVתæR½o[tÓòŽÝlÕè¦mÜô¬û÷%uÎÿQœAå܇™tÊ]l²`ó§ÿÇ5ž†“Ö–ÜÄW¬%¬ pÚï8ê”?Sàfâ‹UÛ°4X¥Û˜öôS”ø’(ŸyÍ–Kn IDAT+g]|?EʤèÕk9æ×ÏQ‘GjÝ®<írf”Ø„‹–s÷YgpÿÜrzÖ—êïä¦L§F™±’!½­ìhVk ¾dòÒ’IHÎ"3%@0)¿‘Š üíª_ñòŠz²s’Xþßk¹úî7©A±iæ ¾ 'Ð6ÛÏg÷_ÂÔû¾À0aÇ·øÝñ§ñÔ¦DôïCN²âWÿÊ}s+ÉÍмvçEÜþúR\ÓáƒÛNä÷Ï®&)?ºOÿÂɧÞM! žºƒ_ß„'$;¿ ‰m9tÀ@íÕ†pÁÛüê’ÛXZON²ÅKw\Áýï¬ÆU¼tÝ•üîž×vBÛ¢§8猻جL š×ç™~ô›††zž}òq¤ÁãÏ“÷)ùìíþyô -dÇ¡|åt~uíK\ûø ÉÝ_mML½{&ㆷ ™|Õc¼rÿîï—ÎôÓ?政¥`Ø}Üæ̃ ïº?)O„U7“nÞÛ|øp]Ü£PÔ3{ú‹T¾’ÿÞt6ÉF-éõgñØôùLíhsýƒ¹ôóÙü¶'Dl¬µ†ìÉÜ}ûutOÑôðìäÞËh8® ž}[@ñÆ›6¼¨¢xùùèû¬®Œì]]ŽŠÙè𠻥ÒòúѽC µÒWÏcGd0ðÖúÉHIı-Š6oÂÎèÆ°~íqêI$̪²*tn˜^Ò;ô£K;µu -NžûÈ›æ)vêøi×¶},±íZÙG7@ų7ÒùÔI.A鬹X]†ãMÊŒmŽ>6ã°Ë¹û7SI5->šý0ºË%<|÷•¤‡7S±|3‡ÞÊS׎ÀÙÞUçÝÇšUtNIaÒ­0Å ¼S:­â¨G^ tܯé‘$©ÇhÆë„Y— ±çhÆOèDXíõá­o…M`௸å¢)¤šµ”Í›Í+KwpvÆç<¾ ‹¿,ºc2ajM¼wÚÒ¦Û8ß6ØG‡W-ß@a "˹ãÞ™ d÷NΆÚþ¬î=•»\ÏU[—àë1‰Ë.»Tma; ŸµšßÝ6žŸÇ¿¦æaY..&wŽ/™ gÜÌugwBŸÞŽEýïàó'ñÞŸf1ù‰O¸k@"p™+pÛôB>8Báé0‚KÏ;›q]貋þ2“mµÇÑ-N}»fã½q$|q ñæm ]ÜøÞÜûÚkä¼l]ø2sê‡ð¯§o£³*FÂ…¿y–e…zÕ½êõb*¸xD5Çý‡¯n|r¡çYÜñ›Óh¯X^8‹Ê”ÉüíÎßÒ=Ù`h|SŸšÅMG¬ãö'CܲöQ&%¿š@má<µò†üø< Œ:tíFê–LÆŽ?–to¯ßsjÂoøûuS.ÃSÃ\>c.¿™0o¢Ÿ‘'ÿŽ3'µƒ1¦u¸÷6ßÎ%mѺÝ?ìAõG 6–e1õô³$Ôün1Y‘È>u\¦”¢ºà]&O¼‹k§¿ÇÄž “âi×Ñå·Õ,_ÿ9™]8åŒãÉOˆ>_È4£WE¿ï:n,µ®‹êâ¸Ã4ÑŽ­„§Œ¦áj¦]Ç +Of“þ íрɉÁùɯ»›QY=ð(¢EË-*öi7Z¡Óu4Ñ: m×upÝØð*ZFÑx;h÷ÎéöãžÐX¼ßx£Çn ®ãy|üÂäM ¿—-ÿwGN×hÝ@aáNúõë@УÀÒ¹SW*?+¥jÝ"¶xãÈ^\;+arqmMVŸÎ¤Ó¢Þ1ñ±9××q‡+)Ù°w6-%VN€7·>O´¤.˜À ‡¢unšîÿë}œþæõèÆêØì,*â“?ƳKåab%ƒI_¾Íäá3I®Lå‡sÙw=.}#> ­´cQ—w,o¼ûWzgùQž¹&zͧlP½ÛÛDÛ.*o$#3w²tm5ý]ƒ6ƒ!Ʊ¡ín$+À .®#CzdDëSÅňP¶p#¼þ§ ùý¿?£Ö5À©%«ïaÔCÓ…Må#´¨¤[l·×VdõjKœÒh<$Mª4õæQ“Ô‹žYàØšÄžãéêY€­[—Àì[T×­¶™¦ºRÊ€²õÔfò»Aé`»Ð‘í5O¯(åcÎ#þÏg3lètŽ7‰s.8‡a ëYY™Á•GdƒãFoÿÅæ×—D›ny˜®Æ 欧lÛ—l 2B'žˆ•7š¦¦ëÐ"(s3HN €vñø1t= VãöaìÛÞ[¶Zƒ¶ê©ízKÞ¸žL3Ìò—ïäì+neļ§ nœÍ¬·æ2¤í3(­ß”8è4¼:BÁKà¼[^dCµWÕRV9’r ~²ûv$É4pµ‹k»äíMvÀÄÑ&í»tÀ,ÝDÑêÕ,*Z¹]³0\ ÄçuáêÚ:Üæ²à%K.®¢¤d)oþëuÚÝçåMMúñÅvLoÙc¡Ý“Bº¿ŽòÐ.ëóçl”RX–½µ`ìÛ]0C¹’~¢’Ûýö½ÙÚ¶½ÛC÷åþy|b‹ûçZGëˆ$Yу² 5-¯©Pn%þw¡¶]ؾèSJŒö{Ö9 H\ϳO¿ÎÆ’0 ðz=$õŸÂE£’™ùÔ»äŸpý’5ÚÚÂkOΥ݀.Ìzz3ÈsˆÁGŸJƗﲡßéœÔÉ aþ+ÓxàŽé |Ã|¦½>‹:—acûS»¹”ÃÇ%;h±òÝgx{áFì¤.L8ý4d)v.ÿ„K=ä–-gNA™}ÆrÊ„A$y˜Zk+Á²,”½ˆÐ¾DròòÈ31~¬”x6ËÆãõQ\Y‹ãXØ®MuM9†×ÀˆÏÆþ‚í•Ð'ÎÆÖ&e±´c±"D ˶£¯#a":ÚÄöëšÙ*ÀÕ.‘H$¶Î¶ã¢ÌAC$9Ž©[ùb] GtŠÕMql,Û²ÂÑ“¢cã¸Ñß±#"‘¶miå:6®òƒ¶±,ÇñÝû†õÌíF[`¹‘úb\ †ûXˆ2 3ÚDûk6[×qˆD­ÊN¬ŽMûvíèyÉ¥±yU±RëO¢|ÚmÄ%Î$-¾;ßX@uïÓ)ÌOïôvDB  bYho<Ù¹yäçø£ÁA;Øþ4V)Û+A'¸¨p!Ûj“ÌÄÃyqÇ\F¶šÜþ÷˜ƒv"8Ntýj\lËÂ2\+…cïz×®Ûº£¡G‘0VÄ€HGƒcYØ‘0,+üó 6Wè«W±|ù_{…§µ&>`]([ž¤û“$“^a‚Çq)+¯Àq쯿¹ã15r4™YÙ8޽]ÍGKa´á#)%™Æ‡½¦$Æaª´†ºíK¹ÿÞÿò‡¾£ÈÎ*æ™+/eáÑ¿çÖóF ß»ƒ .*áýW/ C§n2, §š—ÿô; ª{sÑðL¿åfF¸ÃRÚZ˃7ÞÅ9³?¤[›dÔ¦6ôé׋™6Ó¯¼•—5–“:åå¼~ïl¼ãh&$~Åm]Ì–ž§sL÷­›ôD/VM%ÕŽÌ4séÏw,=Ó»¶¨ŠvîäÓyóðx¼±ú[`+ƒ·¿A»þÓɈïGá«_~9Îü‹ßxmGš–AcK0Û¶±íÆÛ­aèp2çr3wÜüCþ4Š%¹–÷‚'rç¡~*_w›ZúèV%-nó6–Ž4Nsc‰ž7@jFB ¸î·ï£³ûáâ'3Y³uiµº#ÁØëmK ¨ÑˆoDtsÝ –·òœ0þ®S9žGŸ[Ƚ'$ðÔ5áKoçæúz_ëeµ¬ËÚ®§´x';ââE\rwÎbóÛ+þƱ/ü㣇ùφÎ{–E‘A=j Ùú3|îJãqÙx/g\p#G¼|+ýý;˜¿ÁÇð~z·ýíठàòcƒœ0å|úMû£sm–¾û;;# Ýbµ5ïÓ¼OO¯oykZáFj)+-A™ëÞ}‰[S81Ë$;ãdRo¼‚›>‚ÛOëOdÛÌûª±C.ЏŒ „Çï|…ª†ìõ|bë\ƒòú¨ùà!þôÖ$î::Žgžx‰”Á¿#³ç Noÿ®¾èŸü÷OSIoØÄÜæÑö¤ó£·ác·ƒãâ|ÔlÜ@iƒMZJ"GŒÎ_®ý÷õÌâüÃs(\2‡etá„!´b—ºFz—ã?Ÿ`c›·lfÅò匟0‘œÜܽ†ŸÏÏ¿—þ#ND»¶y=-Y±–„¤9©AÊ+*HLNaô‘cp÷ø, …Ö.K/fÆûïrìq“IINÙ§ƒWôö¹Iü¶wÙ¶¹É¨vܼ߯†1ñù¼±mEáIMeü©¿aê¤<ôp“×úýžÙ¥×rúØIØÚdÃû×s“w]6¯± ¯ßOs5¯ÏOB~>ƒ»ga®éϤ£Æ`PŽéõãkÑdÕãóã5M¶ñóÍQ<ùç鯜¸œŸñW7‹nYÎe+¾âª¶§¡ú´å3îâŸÆ×÷LþpñIä-X?Ÿ‡­æŠ±]ñ›?L'zM'7Zº`Y6ÚÕ¸Z£\ãØ8×5èyÂÕücÓµüzHŠU®úןrÍ5/O§òü é‘u!:¹+¿{æ}ÎÖNôŠÜ6™v];z÷­NT»O´Ûtv1ó蘼–5†’Á¢ùï±BÉj߆$+Ò|B·¾-­s™AŽw9³Þ_‹ t`èÈôÁ`ÝÊy¬®w0ü)tê;8¯Ó¢ƒ²o÷ðAM´TëþG¢Á&;;—“N<¹©>ˆR`&fRxí­dºÃ)~çS"ÇÞIÆQ—éAÇö£Æ@½ú–v6/K›» ×MƒS/¤mZIÝOàÙ Ÿb†+¥‰5cwl ËŽ½Ö.Žmc;ÑÏ´ëbEl«¯‹¸yò»LJ÷ãi;š‹Ï<Šø·ë ;pÄ-7Óëè“þ¿½3¯¢:ÿÿ{fî’å&$ ìˆÊ.¢¥.à†¥J‹¸~k‹u_«?—jÕVÔº¶vq©ZªÕþüùUlÑï·V¬{µZj‹ˆ,²É¾%¹ë¬çüþ¸÷&7$¡¡…„ÀóÎk^÷ÎdîÌsÏÌùœçyÎs( •sÁžçG·ßÁˆ“Φú?Ü|ýt¾ÐçN¨Í-ÏüŠS«MVÍÿ·_zçÔÙDzãÆ'ŸåøR0ú2ßx!gÜ‹¸YΉß{Ž£F÷Æ÷¼F·ª"À÷\2v”S~ü OϸœËÆõe«¡ÏaSùÑó碂 Ñ:­5(íãù~cýPéÚÕQe†ˆ,~”1ƒ \1”Kf>ÁYµa¢æ <ü‹ïrÃ5gÒ÷š¡nC™~ëýêWxöç¿å«‡…¸·r$ç}½?¥¦M ²Ö-/È=”Â˸ô;ûtŒ_žIåôÏéÒÕ<ûÃ)DBnšý{2W\Êa}®ÄT3ñk7ðø7L¶äê”RÐwâ¦>{‡÷yœÊá×3oÁÝ<·¹ê›‡sÓvM¬öH¾ýÈc9«Ž Jgë^nÝϯëýlJ˲ø`îû|ýçQV^†çyÍ\Mª·°É4hÈbµé@˜D¢Q¢EED"‘¬Û  ˆÏ4Íf¾RÃ0ô1ÔÖöå½÷ÞeÚé§7û}Û¼©É&¡J÷<ЧfÍdâàLËdû›?æÔýæþØÜûpqŒý+1”F‡»Ó=’¢. X!2ËÍU—ÌâÜ_ýcûGÐ)ÝÌ: uao‰‚¡£ºÀê šÕÃúÕQÖ{2½ÊL|ª†HßÐRœÏÿÆâôþ9®÷(Æ RÒIu ¸Ê¤úÐZJ-¥MbÅR 7ëëV{>Ä&_žJ)|ß§nè4ÞøMˆäç+ø4Wvæ”GXzºÇ†…K(=ø`¾|ó³ñŽ_c ñ ÇC)(©ÀcYÇ“– 8©$®ñ}þñ5M*ã(‹#.ú µR¶›M/Ó¿¹.ð¯{Ž5#˜xh5Éú$“†e‡Ëäþý ]ÆÄ)GP^A.Ž }›>_<…¡Ý"¸ q‚ Ìà §RÞ]áì(¢ïèãy\7¢–ÆI5ÐнGNMEiÜ4‰ú8C&žJYÌ Ó ›Í¬Üž¸­›\nÙòÖ¹Ø*E:Æ4M ÃÀŠ”°åÁ38óë9ÏÍ%çQ5é*4ÙüJe³çÕ}üt>\|™Tf§X,E´ÏI<õÏ-v:ã+†œòm0pžßî8@ ç=öG.2h|'EÚÑ<±|*Çñ\ˆÁ‹«W᧤‚îœõƒ9œ÷`8›‡'ðȤ3øÆ™¼ùî×p2i|¥è5öþðÚ%Øé4Ê=ÛUŸ²uÁµ]ÃÏæÕEç7 VÐN&ÃgK?eøðá ˜p1¿_z5!Óà:lǦìü§øüŠg1´Âu~þƒTC .yˆ®He\‚À`ôÅ0ïrßñhÈDùéŒC %µGñàÛ+yù!+u†DƃØî~ùSYhe“HØTO¿Ÿ—þ4c¨ƒ\ùÃÃ+ãèLÛu€‘<¿i;A2NÆorïW16ñxå娶]GcÐÐЀ֊²²°¹IWH笵&ãyV(„Êeµ¬¾ïu™”Ô‘í…5%ú2ѹ޺R Çq˜?>cÇŽ%Z0%‚cÛô¨©¡¾¾n—תÉöö\× \×EYÅT×ô¦¶¶Ã2‰Tw#l6à96Žç¨l|ƒã8Zá»6Ž£QN6€5РֿÎU§^Iôº—¹ir5™dà 0Qx¶‹ã‚áÔ‘p¾›ñ£<m Ül\‘ã€ã Í ÇEy:ZN:UOÊö(6NÃ:â~@ŽñzqßÒU\T˜DYÅ™û˜‹ò=ÇÆQÙ¸¸8ŽaÍÈ=Tûx<Î]·Ï ´´´Õ=»wïÆ£>J*•¢ÁnåHG:Ñ@ºÙÖ ·é\¾“&QxÉíLšÿŽ©d’­[·Ùº©)À:'zö¨$žÈ`Ru-g.oغ93(ߦnK:»¤Ù±9Õ(T ÃÀnØ–0¹81ÃÀ2ÔmO7Ý´Csóû*Õ4!f"gÁ‚„r¾T+dñÇô¼þP7Ÿ{?ª[o‚T¢1Ø8Û“-°þx‰6âZÿ=4^&‰×æz@&•,ØÝ'•lZwÓ Ü‚fòõ pH64ÿÉ·`Í%ÿ_/“jv~7“Ä͉±_º'Þ·¨oçÃ?.`Ò/pHÄ&pt»Ë»Ð:v×]wRZÒTŸƒÀç´ÓNãŒ3ÎÀNÅÙ¹n†¸›iõ>ÙùÚÒñ†æe7¿®‡rI&›Ê%ð’I§¥%¦õiÇŽÜuÇ JJJZìçû>/¼0‹t:M²µ:â¤ip ̦퉂Ý}'Ó¸žiQÇ|2Éx‹íA:Ñôë–û¨6ʹYyâ“jhh~>¥÷êÀ¨NKЗoô à egX0ÿCF9¬q{þ5PºÀZ°o …xç­79ñäÉ,úø#jûö§¸¸˜¿ÏûGŽÿ"¾ß5æ‡i55}.ž@ðûW_åÅÙ³ùÙÏ~F&“iÖð´Ç¦ßägm²”ùÀ@mâAËÑ6ù,(]a„ÓŸp×5׳òœçxãæ ”h…Šødèˈš8ÿmÑQƒxóÎòQ,rYUŒìq|Ê9|Tßõ6Éó/Ãùë¼³d%#T@ͰS0?ú/þåë\8l;OÞùJ/@õ™Ê'\Ë S¿Ë!Ï\ϰâíÌýÝÔÉ—ÒÛl.6š,»32d÷…5ZÓ½{w^zqvÛGךd"±gï)­hï@­5åT÷ì‰e¶¾ïºYënôUîßbXÚh±ž¿®Ât†QX‡Ú3íŠhžŸ¤ÉUYYÅÉ' #7M„aœ¶gC¼®±Þšfv”J‡tƒŽúgUlÄ ,N™þ]ÆŽˆ²ýæ­z;ź¼4»y}6r ¾çyûdn4­T»ó"¡5½jjxqöoZýˆ¤’Éýj¢ÌÆûx6ZéÆIµ‚ àÎcàÀAÄbe= ü|*Èš{»Âoª5Ù«µA}}=j<"‘(Û·mC)£Ý½ÚÎF©–Cw5ىДR˜¦ÉŒ3˜vúé\vùåübæLÒéôn–U“%._àe{ÀZcjdý÷*ÈúÀs)ö}×ËŽÎÈÅ8ø¾OjÅ\^Yø)ÿ|c ?È^CõEO±ø'gò_÷ÞÆôÿAøºþœ}Ëz7 kQq³ñ^FsÄ­rÙ™gSfÝÈáS§Ñ«²*¨æf9bt3±¹ë‡Ëž{PýK¡¶S×¶ÛüÄ>ù×M‚:k¡t¨®êÉšµ«Ð`ÛŸ+.j¶ºlùRª*«ñ\o‹Û}…òÚÑœP;º ëï£v§îicƒ0Œ]Öç}µ5í±Ñí¸g÷§Lí{{®¨N6J(`š&ëÖ®&•LR‹áû~™×4¶ç“qü.!l¼Ü›v<¥p\+죴&ãxø¾×%*Xø;Mt–õ¹ÑNP\\—¾t2·Ý6ƒ³Ï:“ &à¶#wMaO,߯Sýxì·3qÒëY¶4³3ì|æÎ1H¬\Fÿ‘S™ó‡ÓsþìƒøÅòõ¨t"ëcöÊø›k×^DãèJÃ@;)Þ_¸’÷·Ü€ed]RÆ­·â&w\ûÁ·]â.DFpÿÖðÓAàyh+„Î$IxŠÃι—e—=FDÛüù‰oò½¥£é P âÿ<3ïÌÊfÕ |—tÚÎú·/W¤2.~`1áº_0×ðIÙ^“ cϦ±i Zì”{Z·ËbÓÞïØÑñöŒbÑèf­‰Dœh$ÊÛo¿I"/—Ô,å‹Îe\Îg[íVÞ¾µ}I¦’s Ò.×_å<Ù˜¦Ù«”îÔ{v_ÿý»”°É&oór\УWo2¶Íê•+8xH6ùZ¾{§³=ï ‹XlL•Ïã’µH"rïs×Ñ%nJÕòa¢U6‰çyÙQSÿœËK/ý?ÿùã}ôÑ$‰Æ¢=⦰7öý;fPRRÚÆ~ŠYÏ?G2‘P¤›ùkU£ÿÖqÛÈ lõ^ø|Ï(“ ¾Y·O‘I4´ð3coçµg~È»kK)±?çïnäô{á¡…“Šã¤vúLÐ<¥y<¹‘9{ÞÕY@{¯g_m£Ú /7jIkMii)#GŒÄ÷Ýí¹Â‘EEEì|iº}*¸Ë–O»Væ­R`Øï„ ­ô,kûöcíêU¤S)Jc±œÅ&›^_Š P]BØ(å0nü2™ L¤¨fبÓu ac´t•htcðp"™dÖ ³øÖUW1eÊ©$ ‚ÛóCiš›`_œ={—û':Û¿ŽqøñgYµ_Íi—bÌ¡=Q~ðoKÝι‰ÚKøÏN±Øìʸl¸ž»×GCüGVŒ¶¯Á ç.UÍʸ¬¬lŸ}¸ïrgâ¤IDATÓÏÊ1Ì^iMZØEËHå„þ®žZ~àþYT>›ø^ºô6¦i’N§[åéÛ¯?Ñ¢"\ÇÉÆ]Ù!·¾_©ì°½.Щ¨ìç•dx‚Xy÷®}Ûb£Z Îtk¥(ŽFùÞ­· …ð\·ÅÃÚlGVi¥AΤŸîàxÝoñÂÔ =’š¡…JÂç? Ôž 6s“uf26¡Õ)Edg2D"áVƒ!›—ÊÏ ƒ}1~Æ÷|Bᶇ‘h”D"ÍžEú õÿ.©d’ÒÒX›"¸¸¨˜D¦ií‘F¾´¤”²X ?þˆƒc™f‡TdýW®\Ayy9¥mX0ªª«Yµræ6‹XYlsIivlÛNeeU›õ¶¦G kV­bù§ŸÒ«wŸ¦Q[ÂnÕAÝöm|öÙ Ž:ú˜VŸì!+ÄàÁƒøpÞß8tجե®QiظaétšCÖê~å±2¢‘(‹.¤ÿ€˜¦±ß×§üÔ© õ,^¼cޏ×:9*l‚ ਣæÝwÞ¦¬¼Œ²²ò6ŸV(„mgظösLd¾¨–Ôl«k`Ëæ8*&‘ˆ³}G}Î’´Qc 6mÜ@´¨ˆ'Œï·ž-Ú0Mª«ªY½ò3úHÈ2¸âUJ±þóµÄb¥„BþÓ&21|Ä>[±œÅ ?&:6­€eYô¬©aÀ€·šÍ·¸¤„‘£Æ°iãêëêö)K‡išTVWQÓ«w›“·F‹Š7î–-_ÊÇÍÏ×þ­ÞzYy9_?žXY ÃlYÖ¦e2hÐ0 –|²¨ÍgɾŠišt¯¬dô˜Ñ””–´ZŸB‘0#GbÅŠå,úx ˜:‹•qÔQGQ^^Ö˜èuO œŸ+ª[·nœ4édvÔÕí2’P§L™J<(kM§PIE4 df­*®ãfýâ»øD¯^½¨éÝ›h$Ò¦ËÁ²,† ΢E³ôÓOȦeQR\Äà!ƒ‰•Åþã{Ê0 ¢EE 1’C‡·/v/=0rØwÃ0²A·¦Imß~û¤+J©ì$¢­=dóë%±c;¼ÝÆÂ.î†Ñj£–_EÂ4ô`†4´k–uî~0rñŠ­]cQq1#FŽ:ðêÓ.~ÿ.)lòP^QAyE…Üàû±E¢­Êj•U•|aüxlÛ> … @8¦$VúßÜ…ÎöŽH묞ºÊ¬Û×- »ûrw¹ö­•ŽmW©Ï»×Šïï׸çʦK áÀ`W7j>­}qI)Å%¥€ÜÔ{³¼»J½ï.ωý³¬VŠJ}j»lDØÒÀ ‚ B¦ ‚ "lAADØ‚ ‚ ì$ÆFA:ˆüˆ(Ïóذ~=õuuh±††iÒ½{%½{÷&ïñaß"lA¡£uà ð}>]²×±é?p–:€Ä繬\±œD"Î!‡ÛãÓJˆ°A„$“N§˜xü‰”””ePÛ·/ï¾ý6©d‚òŠn"lA¡«âyáp„ÒÒÒ6IiyyJ+ÇÙãÇa#‚ Ä>CüÞ¸~6‚ ‚ÐI쉠Y­ÁÊM(¬•*ˆÖÑhmbY |°B&  µËs›æNƒ¦U@Ðê|ìû2Ü[A:˜¼¥BkÝꢴÆ4Íæ‹Ñúþ†áóѯnaÂÕO÷TÁÿL,sw}q3Þs°B.OO¨æä§7cYf›çF|þþÿå”¡Ý [E|ñÂÇY£-Ì6öÿw–¼ a#‚ ‚ð©û„.>ž%%”ÄÊèqÐñüäe91`ì$x”g“¶=0L,ÓÄ4ó¶…›Jâ 0yî·8{T  s3m7'oÀqw,ã¾ëî`àÍoP_·ˆ)ŸßÎÕ÷Î#È^2 ?“(†iÿë<ÛŽ¸¢A¡³L+f Ó°yãñïóÈòáÌþhc{š¬š?­=²#¨´gÞë/ó÷϶¢Jk9æ+§1MBa¥ïÌbî'Û¨~,_=aÝ¢…G6è6h*,ÐY·Ô†¼Æœ?B2ÔÃ'MeâÐ*2 ëØ`äº)cYûÞL¶ 8Ž¡¥[Ik(·Kß}‘·þ¹?6€ã¦MclO“­KçóþEφe|°l;Ý9†©'Ay¸ãƒ£Åb#‚ "jZw-¡Ìç,!XÍÌ›/çÉ?6Yx4àñÎÍçrÛ;q0L¶½~7S/{”Oà­ÿמw ¯o´1QŽbmz‰‹.{Ž17ÌäžoM"fÀg¿¼3nú5›Uˆ†ùOqöi7³À ³õïÿË·NûO/réÝ#ÄëÝÈÌ7´ub±A„ýŒœ·fç ^e”qÚ—ñÜW/¡¸äNÆO>•¯_r%ßüòa”ly‰ïÍ\Ã^ÂUÃL|ÏG™KžÍ®šÂ}wßÊA1ŸCŒ«xâƒÅ\sÒ‘Íý¢b¢!XÃý÷ÎaâC¯òÓ =ƒ>?†»_YËN1r_Ïgû–e,Þ¦dDÜ÷¹æ–÷¹ðÃϸq À%ÄÆôçö7îä¡(„9ƒï\1!åŠnÛñà¼\=y%¡ŽuK‰°A„Î2ÙЊ;JCɈsxcÍWXò—·xýÕÿå‘sÆ3û–×x鸷X=œãGDÁ÷0¬!3@yÐkÜ¡ô,ƒiPUQNz³ƒR:;J*Ó4b*¹š•™5¼5eOå,:¦á3xHÏ»×7˜ó«?0á´þl¾ç5žš:Ÿ…é üé° îVA¸(Ìq[êñJMªíOyÄ$КXI1éõÖ»Þ;–6‚ ‚ÐÁ(¥pß÷[ý¿VX *×{_Õƒq3~Ç–ºrV²)G|,B¦‹ëûøØŽMTùxž\Ç%Ðà{vÖ£A{6h“ ^ÁõZÃ݇œÙaÃÂ×”ÂI¦øÍ§Y<âX¦#/ö›†e÷æáu+¹¸²ðbâÌ{ÊAŽcãàz>*·Z^_ø¨`ïÄßHŒ ‚ tmÆØiæ¾ò4?Ÿõ6+Ömæóeð›—_C ¨&vðyL«yŸ{ïyõi—mËÿ»7`XFÖ’?NþOZlr6­ l~©‚ν‚ß.XGÃŽuüuö“¼ðq=!LÓcãg«X¿­UZC÷°ƒÝc2׿…oO»¹«¶R·y9¯?ý0¯¬V„ÍÆ ÊY tóï³óè½d±a#‚ /kÐZµÞèeVŠßÿøRÆ4€Ã'2sý‘<óÀtÊŠ†ð矣÷;×rHuCO¼Ž?nKyØ®—u=iMà¹8žÖ ÏÎà ÂÏØ8~@àE™|Ï <ñåÍ\9¾ÝzÄYwÍ!­JùøËòï`lßjjÇ^HxÊ L}0>ÿ'nîý{NÚ“ÊÚ±\ûÿ>!1P¾Ûüü¾‡ãú¨¶„Í^œJ¢EDÏ-7}[ßÿÀÙ¾mëF\Aزy3«×¬fÂÄãð<¯u«C(B4!le3+ßÃu=V®^†E´¸ˆˆe¢u€r]zöLÔðIÛ.°"EiÇ'RZŠá¤°=M$VFØM’ò²17¡hE‘0¦¡Q“±ñ±(*Š ”&c ðÛõјDŠŠˆFB¹ï•ÉØèP”âΞ_gÏ52Ž×ª]&óê+¯0zô(zÖôjŸ`1M¶lÚÈô£ú_þê™3s›“@<÷šRc#‚ o°ÉNІå"pmÒ®Ýl[,ã¶Ûfàºn³í55=ybæL’©¦ý};M2÷ÞNÄ·;‰ §ô2)¼L‹³“NfÏa·øf 'ÄIïü‘ É‚ûvW—¯<,‚ û‘²ÙÝœ.ñxœYÏ?×òHZO$º”—E)µ·tAAèxY*7'ÔîJ§Û>fš)\åœEØ‚ BÇ0 <ÏÃó¼¬åâ$ cïŒ_a#‚ H4ZJ³}ëVªª{p ÓÑZ³iÊ‹‹ˆD¢"lA¡+S+¥_¿~,Z´ßóvÛÕÕ1M‹H$ÌÀ‰••‰°A„®ŒeYôëߟʪJÇE©à€º~Ã0‡Ã”ÆÊ°, ­õ |a#‚ ˆÖÓ²(+¯ LŠc#™‡A¡‘ä·"lAADØ‚ ‚ ÂFAA„ ‚ ‚AA6‚ ‚ "lAAa#‚ ‚°ïÒfæaÓ4A’ ‚ ‚°`µS—´6ùŒˆ›6nÈŠAA„}AÜXÖî ›x<ž¼ô¢ Ò¦iZkh|Í-‚ ‚ ŽÖ`YVàå4‰¨Ü¢ÙY¨ÔÔô mÞ¼ÅÏ žÒÜJrK‘« ‚ ˆgšfH)•Ò@þ5 dv¶À˜9ñ’_Š –(‘òA¡ñ;·d °[ ròrBÇ kâñqG ‚ ‚Ð¹ÂÆÍi'÷>Èi•16:·9a“ß–:–”§ ‚ ˆÊi/'j<šbmt[£@ÔZkDØ‚ ‚ÐÙÂ&ï]Ê¿æßëÖÜJæN‹•:ùuAA„Î"ot)\ò®¨V…QðÚÚ{AA„Î7ºµ÷ÿ[‰ M§vIEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_design_translations.png0000644000175000017500000023301012235000130026600 0ustar00murraycmurrayc00000000000000‰PNG  IHDRŲ•æßýsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ6а Þ IDATxÚìwœEúÿßÕÝ“gó.›`ÙeÉ9ˆ "¢(‚õÎp*zê©à)æp&ô3¦3¢¢‚ xT”œsÎì²9ÌNìP¿?fXLpßÓŸw×o_#Û3ÓÕaªêóRZ¸œ*RÊCJŠé&âˆË‘(4UA"ÏÅ0-,ù£²õ“çât¨Äb:³ç-¦¦lÇë“Æ]?2#¿µRµok2tÀúIOÀ0ôÌôß«ýN< ·Û#w•T [m~“F¨iˆXŒ*!ÑQñj†)í›ccó[¶E!ˆê•õQ6,ÿy‚&-ƒ¶]ú’îÇëv`YEÔ5DÙ½w¥»·‘ÀºœN:tïKºß¢Ä¿oYÕõ+ÓuŽàdÈ+lGA~.)~7ý;FnÚ–yÕ×>‘óÅËcÎÒHâU?*Šƒ¯x€­©ç=ÕǽâQ—ËMM ,„qeVÔ£»«– Ø™Í6BUP½j =›ËÙÀ·5Í"6pÓòfœPäÆ2A¨ Ši°mll~ ¢1ƒŠú(Ëæ}Á)ƒÎ¢(Û‡ù3NQeµQf|þ ôD³‰Ïí¤¦>LIy ÕûwqöAx] ògÚ®¢Vm.eÕÒïèÒã8²RÜH ².ª¥ßѹKº´ÎÆú™s‚‹™³g£jn,+iI‘”’.éÅgÆ¿£ø¥´  P}ÀcüxÖȇ兗_+kêqQ¬†RÌ’y¨Gè2š(y' &åó³wÀÆ&QǤib)‚²e‹Øæ( ¹§–­±fœÒ>)4ŠÎîuÙˆ‘Õº+í³œ‡…h~K$†n` §Cµë¸ÍŸ—hHæÍ™Aïã—™ü³‚x‡ª°~w5«çOgÀàa$¹5ÊkC,þæ3ÎöG\ªüÅ6+Ë’Ì[¸ ¯ÇI§X½f-~Ÿ—.Û#‘Âuhöà{ª"(© óÍÌ©œ0ð2SÜu9÷ã×b_Oz¢ àJxŠa þÀS<(j–@&(! 0ü̳ñú’á@”W&©2®ÐRB,bÒ7Ûñúì fsA…X„úÚJþÂ6tó¤âVRÉV¨Ü‡Tý”•ÔsÂ%§ñ÷ænLþ‚I5i—®`Y«ICŠ‚"D¼žJ‰´âõU%îf&šTü3„BíZøQ4T”²u_5A\þTÚ´Ê%ÅfëÎ*þtÇ_·”!­&·EI“ŠÊpcc·LA^»Ö'ë¬Z¸Pz6Ý‹²q+AV-ÜF8#‡ž­ÓÙ»j=%ÒIvF2Ê*ÂÒAó¢" R5„Œ²kË.öÔ¤4ËĬ£,£Y뎴MKHjöíb[Y€ˆ%ð§eѾUniQ_¾»*Ñr È—³·V')»Z$Ùž­Í‘yŒˆ¸a'ެ¾(‚ƒF—X–…P À…+ÖsåÙ=ÑCr[ÐT…éßo 3#‡æ@J‰"”FƒW•('¦ëT”•p\ûl¦}·†ÇõdOI^%D›VÉÌ]¹‘]ÚbYF£qkJ !FkÜ*ö&¦ñdG"”jh?i½K‰H´p™p 5M£¬¬·Ç…CÓâÙD,ÓÄ0 BÁª#~AqcÃn|6¿Š”‰CD‚C[…e˜ -tKbXúÓšqÝ¥]8.ÓdÞ—‹øhg=Šœl_¹…Ôí¹oxÍÛÖm⥯vYœBrN&]Ô›Úo—²¶å œî*å‘i«‰æµå¶«{ïSˆƒ¬_½‘·Yx­Œô núSŠ’ b÷n^¾}ºÅùÌqÚêDyuÛKÛ%9nKМ&s?\ÌÔ£ïBî†<½²”º}1®½c¹6ñðg›8òdN&ȼueŸ×™\%ÄÓW±ªª’ Ž;½w;Ù¸l¥yÝéŸãcÉgß2³¾b÷v’º´åÞórÉvšìذ‰gí ³u*¾ô4ÆŽèM໥,Ï=†{[;Ù<9/nTèÖÒkë¢Í/Kb¢Ñ™¦ÕÅøÙ–|@=¼ŽüˆA%„ó… ÷àc©ª¡z“8ó‚SÑßœÁ´U:ìËm½S©©ªdKµƒŽ}{1>k)—¿QE·©¤xä>Ž¢P˜º]1j>]Ô_(ÈÊ-å8³sèÙ>™ s÷áí]ÄÝg·Å©eÍ®(…íÛóh¶àºçwPS"–æÇ¥è”W‡©¨l <àfµŠ‚F^‹’ˆb™†!Irk¤ºLË@Ol§¹̘‰Ûï!-ÉÃYÉ.6× ’s39wpG6<=váò®IDBZ÷ì@Ÿd'¡S¶cOîÍ}Ó©«®bK¥Jûc{òb³e\öZ%O($Ù£Ñ|P²Kª˜^Žxf,ØD¿n…¼}ÿùÃ(W=<•ó ÓG…S4ùe~\­ƒø]iTnEÁíráq»PÃ0Ñu˜Ã4Mü^/III@\í-Ӳç6¿ÈAück’x—?¨•ñÖΛÇS*éõÇSy o*=z¥óæGp^[?Ò óí—k˜MåÊó»Ð®¸C’¦°Y¶ѽ«¹þùmDÓœDœ…8€†ªæ,ÚCy` ÕQþº摬˜|7s _Tkœ¤x8½];.ÎYdz. ÿ¦ÓèW¿ž¿>_Jvó R]a&ͨ¢]ÿ¾Œm‘ÂŽÅø6âÅ…Ž<m±GäEo`ê?¿ãå0öÉÁôqxÈ)Ìãä<7aÒKÓ˜PŸÃC×õå„7ŠQ¥ùÚ& ˆðí—«ù.œÂåi]èX؃3“?dµU¿ÞÍ ¹ìÅ2úîΘÁ…ôj¥2¹$Fa¶úCcÄÆæ€—¨ãŽéfbl[ù‰þ\$¢ƒV"Õ$Ù1M«Ñˇ=ÍÆ= šgs\ÏΘ¦E$Åh(7#1/RĽæ^cüs KZ´lžÃä¹ËèÞ&!.‡ÊcoÎåøc{Ò Ç•P¨Èľõì_EË’Ä ³ñ¦–Õh5hªŠa蘦?àÐT4U%33 Ÿßªjñ1Fôë—Í/b˜"á E3JÔh cÕ2Í7«,‹’SξÒ0Šp{ñût¼B¡Ñ­_7º¨«ªaÍ~ƒˆÏ‹"㱑Êu{·hÇ1y ûJy~¦—á½Zrû5m@²uû6žÿxnOÜŠmyL'F 0ŒëwVPïõáªñLl!ð¥åÓ¾Ue{Jèuj_nR€¾}o,’šå¡z¿~ðÌ¥…nÅc5‡Œ¶G êbY~Im‡ßWÑ€:¶ü´LR) G‘¸‘–DqkxÓ¤ºœÐN*èµµ¬­4 7½Þí5¨¹ÍpZ: 8T,Ý f`Ok±ùIÚÁði(ª Ù½wÿRB²3ÓÈÊÊ@SµF6¦›8Zc6‰5F€ Ó¢!Ų,¢Qg|Ä„pLÇH¤³(Šˆ‹d“ði8¦cIɾòN蜇ۥás;°¤ä‚S»òÊ'+èÚ©=±X §ÓÕ(¨QÝ8"ó¯‰" K]iº‚x6],m 6½à!ƒO##3ƒp8Ä’% Q”t{LÑæˆP…š`="»ˆör&óŒ–tNq!Q¨* #\IVi~K%_—pò ¼þ5¨«Ô™&yÒ`·³˜Ví@5%-;äãŒyIKŒ'˜(XÄ ð§»ÙòÍ"nûÖø¸æúþ iךޮ-TB@¦ͳ;À-%ÍŠš‘eúHVcqAQUŒêm,Y•JËv¹\sJþÚíÜúÚ 6Z> }9¨˜„O’ƒhé>¢ù}(Bò0'X6m¯£!L¡)tÉh`^U­ýžxÃVF0JaßNÅ”ÊÄõ¶ÏÇóâO\¯” šz݉ü€ãþ66?-ŒKS9ÄÆæ—¬RᤠËÁû“–³½{.²\8¥EuEs–V£´jAru•»öó}ÀÁÎ {1ZäÓ6ÉdýŠ,0 hÝJaÿ’Uü­"‡mRIs v/¯`ëÎJùÙ¸ëêX¸v 7ÉN0yîgm¢}3~-Ä‚}{Y±b7{Zt ¹ª’§¦,礎YäúTôŠ]ÌÛUÎÞÌ\2Üó¿[ƒ³&¯&¨ ˜ì¯ÜÇ|]‹ÏC :,¦‚??UŸ/`Zßäj–}VAÎ1-I/ ãJò°wãnæËµ–‡”‹ÝëãÛ¡”LvÌ]Ê5EœÔÂÉö-•ß‘y^‚A“ä¼lê—¯ãÊ ´I%Ý­^¹™ÏvVP——Cz}€Ek÷¸Hó:‰Ô7°hÝ>Âõ.’‰l<[m~FEBPLiáóz˜4w#ïÏÞð“áSô÷Cħs4õÎtÓ$#=•¿>?ëǦ)âÔŠýññG!Bˆƒóÿ™–Du¨ÔE\\óاtïÒžp,FNv&³V”0yÎzõ蟺œ=N Ñtæ_ð-i%.O¢9\,\ø=™™³‰š,ÐPWEMy)+hj7,‰eÞllŽD%–æ§0ÛÉÆ ûY¶ÊD"p8=¤¶ÈÇ ™©ì[WÊ›1wR2ʲ]ÌÓÞÔlZd¨Äb’Ì‚¨ÝΜ2É­¼-r ×Õ3í›êÆëu{}¤7s¡|ðå&Ô”f´j¦ 4ðÁôM¨©Íh‘"æ ØØü–iÐ5±,‰Çë¥}ÛâŸiÂÓ2 F ]'·XUÄb1º…a4oÞüg^L3¾¨E(ÃãÔšxx’`ÔÀ¡I ÓÂëõÒ­K{LËJL÷°ÈËiF~n6áH4>>5‰Åb¨BId´YøôG—y;ûÂ+Ù½¿²ÑõEZ`F9ªº@¨vm²±ù?b«)sgñÀíÉ÷ÀbøéÂÙù$iö=²ùõph*^·“¯g}JAÇIò»~6GD G 6-ŸÃÀAg¡›’P4F’×C8XǪU«(îx ê/¬*TVV­ÝM·cN ÐI>/+—ÌÓъŒô´Ïân‚aJ¶¬YÄ1½ŽÁåM¢!N MhÌûäµÚ¯'?9<ñÕâ ‚7å@ì'§dH‹&+PÜG`ñcÇdllþ (¾ ²ʸù¡µ¢BÑð§eQØ¢9~aa;z6¿&ј”0pÈp¾üä=Tí—­0]×9uÈp¢ºI8ϺÃø½É´iÝš5‹f ª¿ì4¹\N¢r$’º@f“ŒQÓ²44pÊéç"Ž$ * ‹QSŽNEÅ^0ŠKŽ-¤UÛ!L[[Âç]E×–Eµ¢°°ˆ¶g?K¹P!¸Ç]KÏÄg-[ŸÀ­¯GTìå¾ÞýxµL *ÞcP¯ö´,<“Ÿ¼ ^F㫈óÆ~‚Å*Î)jEaŸ¡|¶Ç‰_]É9E­hÙ÷\¾®ªeÜÉm),,¢ß¥×sbë" ‹ 9ë¶ÉTkn¢;æpË9=(,*¢¨ß9œ7°?-‹Zqê„ ü ½lãoF›Â¢øwzË“_lÆR`ëìñt+*¦à¼ëøÓ îñÏOºž¹»ìEÛmlllþ›Dqß÷[9ó¡ç¸¦1»gãê'–¢9ª˜øØíŒ²–³ÇNbî§ÿàÌô X‡Äc—¥%‘ P¸0*_š¬0N5þ‰´¬D†K)ª¢ÜO¸Þ$Nq1íÜVãõ¶k©+ß+o³d4ËB ˆIìTY›ß»(fѼ@eÕÖ Ü?¾gneÊ¢e¸9ep+ЭÄdØ8áï¼Ûçb¶Lúžºä÷Lˬ<ºµâ£eëˆåõcÄ©9DëJY<}mZú°¶–eª(¨u«™º,ÊÉWÝÍÅ£xë®›yzÆ:Ö”+\ÙcN&Q›Ò•s/è…«cí׋É(ð#hÀéömgá¢ù„ Š›^ä¾7KÄßnèÈú9ßTÐŽN™gÂÜýe¬ü~.Ž’gX¸› “„Ãg]ª©y´k^ ¬æ…§? ïøZ>^¸”©  f&מ À‰}…‰÷ŒàŠ»†1õ¯ñä_†ÓaÀšåu R Ô%¬ŠE¤¾ô(‘Çe7ŒbÁŠÑL{ùzΙږîéy¨lUÁÔrøãMw³·ú^¾o8}î‹_ARË¡L–¡hëÀ4âÛÁžpm©´±±±ù÷¸u‡qǘ[䣣ª²â_Êl”RÆÇܬµÕÕÔ£XT——ŒÌ ¼š@b¬®¤ª>„#-w¤Šº°Ä›ÖŒf©.¤Š‘újªjˆ™ŠêÄãO&-Õ ×Q^^…LÉ£yš;q`ºêjÁ†%ª“¤ô,Ò} >M¤ªº–pÌB(*.oéiÉ8UÐ#õTTÔ¢[¡%“â SSo4ŽƒJ žÔL²R|+DÅþ ‚†FrF fuÍCVv&±Šjc’¤¬|2½’ê’RêtIRVsRÌ Òˆ8¬2žüëUŒŸ±Ëf”ðJ_'aS ÔPU jX(ª·?…ôT?2ROyY%29—æénôp É¶Ç®Å6666¿$vŠBùþýŒ{âñÚ×Þœ0<ñvPŸø·ˆýÛ=ÅB*')™9¤d&š ÏÎ—Þ _zâÍ”æñìÊÄ„ˆ ‘+)¼¤ôÄ›B~aÊav’‘MJÆO¸Äî$²ó’~ô3‡;…¼‡–—’þ¨zi–ßòà¶ßßø§'§9J±$¤æ6'šƒºÏŸâ:50û IDAT˜ë&‘×¾5æþlØ]‹ÒëNîêí&bHN¹þ´Ó“L~aòÁó=lÛÆÆÆÆæßƒÐÿ MoçÁ\aÒ]šµéËw¾ÄÊOo![˜ÒΖ±±±±ù= Ù·àW—D¤e¢µèÇÏ ä^5>hzb…{A[ÿgqѳ "a㇟ڊhcccó»ÁŸÚØØØØØØ¢hcccccc‹¢ÍGÿX8»>ükØcŠ666¿ûP$æiÙ+þ×…Äÿ…PÖ‹ÿ|Q”Hù# &R"$¥Øü;“X8Š¥:p95”× þ…ßKÆä£ëÀûü 3<Šº¥G"H‡»qÝÙŸ<†4‰FM4Wü™•?×Åÿå¾H™x¦èQaÄt ‡Ó_£ÉÙ‘¦æÆ¥ý;~G‹h8Šâò Z:ºTpjJ|…ßßQ;B`Yeû÷³bù2ª««íµÿE„ Éç§K×®´,*BQ~@ço/ŠR ³r3 Öí%f Ò›w¦[»L„eÙvàÏèÄÑ‹„ŠQó g´=Ÿ•=¯aÑäiªþÛ*¨¢HJ—ÌeuµeZ ¹IÏ. }ûÖ¤¹, SÝ|!fˆÍ+Öâoß›|ÿÑ\«‚Û]ÁƒíÛ³aÜn>æ%“?"r¡¨˜Þå´ëWóÒçOÐѬdÍò¥”†â"¨yRiѪm[¤!,ëèDM„vmbc4^mšõEùòÉ\vß\{ûºg8²Àå ñbÏ–|>f sÿ”N(jýŸš¾ß¹Ša™è¼°–›·>ÊùÓ2˜òÂ5¤« ñûi‰RRS]ͺuk9uÐ rróíŽá”ªÊ ¾šù%šC£EAËÿQ”“eæÜ±Ÿ#V§ÝÆ´÷ï!ŸI©~”hˆúP)œM¶£(./>·E€”F4D0¬#…ŠÛëÃãT1õ(*N‡3TK j¡:=ø<.T%1OP …1,P.ü~/DCÄ'n‡Š¥‡iF1UsáóyP1‰†£¨^ª¢>E"px|xZܱL¢‘ á¨yè1¥ÄL”)î&Çsáv(˜z˜`0Š)?.Å !ŸË‘ðö$f,B0Á”ñNÓáòàñ8Q…@Z:¡†(ºˆ?óQIòâöúIIu© ‰™!T\^n§Šz4L(Ãw) 3"¸Öƒ'Ð<³G_ÈÍÆ¹\9 •`m %Û6btþOýgÇ—t¸ðzÝhŠÀÔ#„Ba KÁ›’ ÁZBFÜñ§ú!`Ýçã¹a×Ù¬}ùBT=L lâñyqª H“H(H$fÂa÷? T'~¿×OjªÌÁ`)®d'IN7.|žø9IS' ¡[Buâu;±$8°bƒ!tS" ß[Ó¦ ¿? Åg_Ä1ã®ã• —ò·®ÂÖï¨'‚={vÓ­{rró‘Rþj¡3›ß«sÿ½32³è?ྟ÷ ùÍ[ü*Þâožh#Q¿…–¬Eâ!ß Û7-bÙÆz„Е~Á fô¸åMª¢*áýÓÔ,ƒ^·M F*lxo ý»¶¦EAK:3ž[ˆîrãÓÊ™xûy´)nÇé×>Ä#7\IÇ–y\<¥š$Ÿ`ÇãÖ¿+- ‹(lÝ™#ŸdsÀ@Ûæþƒ“šgpâÓxå/ƒ(jÑŽA£'P5@É’·zL[ŠzœË¸Ï>å¢Lº\÷¥!‰´‚|ùøåôh_LË–Etp>O~¼áóRùÍx†Ð™…w>†a·O¥Vv~ûZdÒï <;ò$ Z´gÈÍoSµXì˜÷:'7Ï ßÃðʵ'ÓêØó™¶9ÈŠ—næ¤^(hYHa»ž ¿kÕŠ†‚À呬ùp,gõéHËÂÖt>q$_í®o1§3Æw/ü…Åmèyæ(¾ÙEQ4YÆ[·žG×6-iÑáxþüÌ·‡Ò·.¡°¸=çÞü1a·ë‡NŸ‡ºžy+O<ùO=ó<ÿxc<×<͸ s Éxùÿ¸öZf¥QÐû"&nÖIrÇøjì5Œxsª"p¨!¦Ü-7}±Ž¯.ëÏ››öq÷ÀLÜ™#X5ùþÙËèÐ<‹Ìì"^?‘:—·G²öƒûé×&—ÌÜVœ>æmJCqϰzËç\zl!-ûñðÜ›÷•SÒ`¢*»—-du•›ö]:“çmàÛ‰÷sâ Ÿb8z¨–}ûëXøèÕÜûuc;s_Ń_—`Õ.åöá71cÕn"µËyè—0mO-{Ëk1…‹šEpá“Ù'Òéܹ5æö¹LŸ» µöK.¹òA>[¾¼NÝi¡–ðÙ‡ó¨A`†ë()­eÑã72~K*ÉåÌ~ù.zuŠ*0BuìÛ_Ç¢G¯aÌûëÐ¥ŽeEX7{6[ôlºvk?²‡OŸ¹šw.Å¢°üÅQœqÍXf®ÞCDUØ»ì[ÖW44zG‘Y/rÃßßgKé^Võ*¾2•€¨åçtæ†gñ7'«a3îư;¿Âp;1ëËØ³k¥ ÈŸ±Ê…¢ ª*§›Œü®œ?rË- ÞŠðÏ«ûñlÍY|øýÞ¹ÊÁ˜#˜t£×”QRI`ÑPµŸ}eN}í+FvkÍÃÓwS³w2v¿È Oíàö) Y4çþÜ'Ó²ØöÁ½œuÛlÎxbóg½Ç•ý P, )cÌgýù˜I7eðøW27âÁ¡<ÿúýûØL¦0#ù¦ (*ªªáò¤Ñ÷WÒϳ’—ÔÝ>—Qc^¤ÃM¯óíÜiœÌm¾C­%©Ú½“Êh܃VˆQ¶s7f˾üåêKè|Å lݹƒo' gʃcC‡™ûý÷üóå1ôÈRÑ\1>y,c¾/â¹é ˜õê( UKQ¨øj*_è'0ñ‹)üÁ?‹±O¾GT›—uµ†Þ;ßÏàŽ»¸òæ‰ÔK‰4B¬šø>[Û]ÇÒÍy°Çj{ü]‚®(o_| ¯G/æ«ï'ÒþÛW˜Ñ`áLÝA‡S;øúŸl3¨â÷)"RJ,ËÂJ<£4¨gÎ×3ù`ò»|ðáD>øðÝÄßïñÙô2áwìÚ½Ó´÷û­^<ÚÃÿþWö?šÏŽú•(KÊ÷›¼~rÿÃöý ^üÊ™ÈÚo¯‰:«—Ïfq- yj(ýŽË¡ÓÝW2éëeŒÞo“Žö×D(õeÔÅ=FpÓ˜¡äec'»vï¥jo[bãŸcÅgSX=ßctº—M«îaßûwpú¥O3{E5ÕâY>«‡öW<ÉÜG~m‡½…%ãjcÔïÇÂC¿3.çÚsz‘Ý,‹ôätµQ¯‡Q²G0êöë)NI&ÕŸJ–0Ù~่½cåü›±–LbÄ—ñíS“Ùyã±4ößÙà› 8Á¯Ól úÉ)tÛ»‡Ý¥åÔ´wsS:í=v>˜É{_Î¥Þ„s^]É´‘íˆVî£Ìpa5l‰Ìߟ‰ ¦1T}—öobõ®rj>Ã=ó-ÒÛœÀè‡ÿF×è?1âIÖÎx–y·œNÏÞ1úÆ^4ïÕ‡nQ˜ )IÎ,B««Eß=…¿Msrî;]Ø¿f¢ðlÎô_Îsª¹Äñãö˜eÄâXÖ£ÄbV,†?É‹^_A µ³/?5°‡§-æÄGžcÌé‰pN‘Ц•!„ ïUOsåI…¨'>ÀÙ dÖVS:‚nÆë`°¡ŒW·ãÇÇ5‘àÍ¡ušƒ/¶Õ°1ö)%)Ýá«aÕÚJrºŸHÅ ÙSÓç‡aÆŽÛŒ'ÌÄb(†Ž¢9I÷èì/«¡ ÍqtÈLF+}‹û>vsÿúÒ¤¥¥'º™xh·$ )Ý_ÊÞÅ»iѼ%ùùÍB~'ÿ!”ÄðJ“úhY‡çÙ9*’ʵ‹ØäîH¿ÖIömemµ‹^š£)âˆö¯X½€îNôo“ïožU»6²ËH§[«ìŸMûñ$E, 0Ã5¬[³¼Î=Èò*˜ÑjV/\ÄÎÇÒŠK÷Ò¦ÿñdiÖüm!blùnFûtÈTùo˜9£ü¶š(0£5,ùìcL|4Lœ1Ÿ>¨ùç VU…PD"í:Qq„ â1Ã(¯ã鑃‘«ÇsÞÀþ×Wßõ;ƒQ"5@1§vs¢“JqNË„â 4}?>u'2„+ƾŧs²? PG(‘Ûc™ýzâo¨Ã^|€Ñ ìÛ8éQœ¬ÃÝe0­‰3JZŸÛ¸{X7–¾y3g ìωƒ†qïK3¨Ê=‹‡n¾Š^ÞÙ\zêŽ?¶?ÃF>Ϊ @ HëÚgCáN&=¨ßÊ~] $ÊO|•:ªDÃZþ~ÓœxúPþúÌ{|¾x+”H Ô*€b.<³ÁªJ‚ªd§Öh‹Ð½'í| ÎZ¦.©ß¹í[Ís·_ÍÈ»¿ ·gOºw)†† )ý®áéçžáæ‹{à0Œ_®ðñž…X¸ÓçCTm¦ ÍËX¾jKl¢ýÍri[ˆM³S?–`%­îvWq÷ÕùjüCÜ|Õ…\yïTªÌ5AI·æ^"1Ó2ÑuKJ2Z$aD£Du4IH—‡ÚWÄÇï~t®Sâ£ÊNR¦—pÅ6‚õÕl\³Š5kV³³!…?\>‚\¯Ä¢i‡©LŠjÚ…9²¸àú›hS6g½‡«/Éë³·©ÚJ¥ÒŠî¹’pÌÀ4t¢F<{5)+ M–‰´44Ål"R§`Úƒ×3òÑ÷ùné VlØK¸¡ž¸÷¦¸ª?K I¬rµŽVtÍ4‰D#(vÅëbü¤M,¡üG¥ºUT”“––Nyå~ªj*¨¬*£¬j?e¥Ôj‘ÂÂírÓºu;*«*X¹jÅŽC UE¥œ™¯?µ—_ÂeWßÄ3-ÇR”<6üH†‰$‹ù½±ìžþ"W><•àZÉÆwÆrßç»Az¾ŠÐYøÞcŒ~m1ë¨- ¢5›xã™—XWO§ŠÕnáõqϲ®J"…ÍÝÂÕ·¾ÀW 6RW»€‡F=ÂÚØ Bøü¡¿òáFý¿fŒ÷7õ…P íŸË”ï, ȼßf^ã§ß3~^ Nöàv”…qzý„¿ù‚@:#êâŒÞfÄ}AŒÈn8iÓ>ϬQ“Ü ØÌ§‹B\xrëölm|²½Qµ9óç¥'Sf~Âq{?çÒ‹SZwh&”C+¿”’¤¢ŽÀfmÚ‹ô$Q?c*럈ï¨8sùü4®ÓØy ïr1‰ .HÏkáó‘w •óæ7òÀG/óƺ{¸K¨™5‡RçY¸+v°c;Ñ‘|‡$–8¾Ã·Ö…¢Þú Ÿ,ÛŠ#å,¦|=™ìo¥ÿòMT æO!=5ØÆë“·rñ¨Îˆ²=”›^ĉ—Ô­žÅ°>cxûÂù¤)|»­×I*QTU‹[xò@tEppúϡޜ?¥¾H¡°¸ßWTEÕPNjÍdöîLn>!×¢"\9ùŒ}'¹N¡hh;HrJ*Ã&B8Q£å”%Š‘øÝT!…fNåŽ'úPSSËÊOñðïqÆc]ɵÞbÁ.‹“[©X¦Š&ŒFOçà¬ÚÍ•ÿœÎUÅ)(Û&0ñ·Ñv)›ì/-Ô¬6d™SÙ\£Ð;UCÔmgOTÒ-a„6ìÙA(«.3úû›(‘?0dl®[·–+<‰DZ’Ó‡œN}}={ÂÅóY¶| ½zöÆ4̓f’¾±#Îá‰]¹gÔ9ä†×ðÂMƒxwþ,w*צiÆ3”Uµq¡2Þ‹´‰êòás*qw@sás;õS"TõPÄ21äÁ;nš‚ãžÊ ¡&Ž)ÐâÁãvãj‰)@‡ßÄ0AÓ~˜inšÒ¨eÖÇŸQ|Éu( ø²{ñ仯¡¨qƒhïܯiuÑ7¼4¦€.o&Báp'×2ÓøË?#UG¼ìCÎ3Þ߆DÕÔCk“i"ÕCß“¦)4íp£ÅÂ0¬ƒãŠ¿òøðoê) ‡“m=Íf\\üØGTÔÕ¨¯eóçOÓÓóžžFUJg´kî£ 8¡Çüᣄ%çÁQòÝó›ÑëÌ‹¹pĵ|ZÞ€×SLÛÖ¹ _oR0ñ¼lœù'ðÊ×{}GrùÙÀrî¼ñnºã>æîýad·é½–€4c¤õÍE¹°ý1g{i{ÉÔƒ7NuQ»ôZç7gà—rá£XŠJ^jEâ;†w. ÝIÃøãåfüÌ%@=󘬻=/Ò!9‹NƒnfU N¼íBZˆ¸GÐô|¤%ñæ·¦¹? #0Û®¾–ËÇ~ÀþP¼Éä6\1t0¹>…Ù£»ãLËÁ—s,o¯«Œgé6­Hþ1ÈÎ7òø©~ª×ÏàOƒú3lغvâšÇgõú­ùœ÷&½Ï§s6ahêO†ÄëJÖ³bÙR¾™þ.·žw w®mõWž…7÷½Ä͸àykY»øKž¾õF>Ü—Lï>mØ?u Kk"ì[>“~¹€ˆG Í<Ö,XÂŽýAj—?Å]Ï|ʶŠv.[Ä‘M‹ì\.<¿?+¼>ZÌæu yoêlJæFì·Á“sZPZË–ÊÚFAÑ*6¯]Åò%ß3eüœrÑ}düåQ.m¡QÔ{Å›ßä–¿¿ÍÊõëùfêËŒ}}*%zKŸ–ÉÂL¦Ô¨å“GƱÌ•¬Ü4ê–-`ùö=TìÝÂGï<Í_o º¾Š­«×ãôûQs‡2öR'ãF\Á¤%›Y9û]^ø|/ªSùyi|¹§˜½`zp/ï¾:™­¡Ÿ¼riÅ0rÎæÎÓ«wïûTÉZ¦=6žR¢ªcÍô dž~6…ŠŽõ{{œÙON;7¦6mÚrñÅ3bÄ.1‚áçgø°á > Ãб,‹¾½#P_]Ž4¸@)&k&>ϸ¥™óÍÛÜrÙ\|ÝÃ|ÿåì{r÷®Œ°è©+é}ûûDM‰*"L{ð2=ø1 êwÌâšãóÑ„ ©øt^^8صʉ—Ií_½À©­’P„ eÿ?óå.ýaSU‹¯®îCÇV ª*šUÎû·Ÿ‰_$µ=…·–P44ìšÃµýšã«A¼°$€¦|øÇž´ý$7˜núÜø.õ"ÂÄ¡}ùàÛ/89K |#XX²ŒËO>‹9Õðé) ~}7Soo7tAJóÓ˜·o8¾ŠPP!I¿H½U΃ݳ¸evUUQ"[yêâîø„@IëĘ©[Q5‹µïÜMŸóþȵÛáöes÷¬ –O¸…ŽéBuÑû²ÇY_£ i»U¨1àÆÛé“çDxйù£½‡ ü¯¢ýMEQU`íººüìw|Åׯ¿»{[ Ih ¤Ð ½w¥‹Q¤)Š  vŠ ÅvE, `A¤„ÐC€$·lŸ÷{BËûE÷ù|†°÷îζóœsæÌ™þôl^ÉÔÐuƒò5ÓmÐù´ŠÛÄz5™f>Kÿî­¨Z­Sæ¿ÁÐh•Q¥JOîºáJê—Ó[…ó/ÅS½E—h“Ö·Lç…{FÑõü®\9úvFõj… Ä•÷aÅÔá®É2êâ.$æo¥Z—ÑÜ4¢+-Ú4$ND•O¦UË´IO1å“iÝ¢mÒãpÇ5à¾ùsyiÚtÆs ðÄxqaS³ã‡ö¦ŠÇ„„:\rÕŸy/5+ÔáÆ1£è”iûhЮ¼û1£ªK¨–Àª\?‡·îèMÓVt×\æËĶ º\µpy2ʆEaÛD¯|¯?{7};¶FÊpÙè븤wG:´­‹G·©7|* ^~„¡v¦yÝÚté3–IeÀO£v 阙ŠÏ%Ü 4jÓˆŽ™ÕQÌX†Îÿ™×& uFylQ†6ƒoæö;‡SÙ á©Ö˜¶í;Ѭ^edÛ>éå¶-‰ÄÆm‰Ëzš®¿…{ž|—`ãñ,ùê#úÔTЃÝŸþžçz™5ñFÞ6ƒMÑÍÈŒ·H¼h3 &\z1cçfqþ°[h]%”òô¿ë¼3ŽË>ÈöØ4´U/qÓÐAÜ2÷(w~ô—'¨$^<‰ÏôgÃó·sÍSøz{’â¥z‹öÔ-'cÙ6–í£fëv¤ÇˆÓ£”r©t­ŸÀg+w„%Û˜DZfhÌ}ôNnp7³¿Ê£ÿô/Y4¹.[“Úž™o?Gõ­¯sÓµ×qß««ˆOJÃgX´yð=»_ãÂ΃ø®ö(níÑ–Ê.›ä G0®Õ^&ŒƸé_áÖùðÑ \=üF™=˜:éÊ™6Ýž^Î3—ÚÌs5c¦Š^Ƈ/&‘†™µˆu‡™ÀW…ÌzéøIjÚÌD™ \‡©s¦0ÿºö˶*Ð÷|ʹÀ[‘ÌÌÚ”)y¾2 ë¥áÒ½\þÊ— s¸ø¼+Y\}(7ukOµh ~aö1\}#Ð,þ©G|–vþk*á¿……äää›»‹Ü]»Ø»›Ý{v³{ÏæåñãO«™:ý!~Z÷+‰û¿e÷•Øõô¥ÛD2 X±j©C¯¤^˜¶eÚPÿ:&dúy{öOØÑ^Ü¥XKV\¸]ndk'Ó¯Dhð ›µ3êóäÅ}X¢*SxÄqì^°cïšËE/þŠnú™siSnœÌ¶±Dît¹q+`ðóë3qa ïm=ÂŽ÷Fshñ<öÛ;‡éúSÐÿ] „Íú™ yê‹YôëfûëKèöÞ„¾œª_<ÌÓkT†/ü‘Aç_Ì×ù˜O¦¥"\ F¡ÉE X84…OîŶ-,ýê PB3Þ\q[ØØML¼¸9Wžß„—Œâöà’e ˆWúudN¹;Ù® Ž~=†ECz3c»LL´‹Ü¿%yò·¨ŒÎâºWòxbå!¬¢lÉ ™ôü4KBèùGjðÙ^ãë~Ì:˜¯‚ŠTlA9Ëò×í·O{”üCyÿs±ol>É" a˜vdýÐ…/* ·"ùØŠ‡(Ÿ ]3P|QÈFˆ€fãõùp)rÉž@] a Søý[L_rúu’1sWñìS³ØìȼÐ+ÁÆ”ÝDù¼(˜¦²—b, b+á=hèüª…âò¹.òå«YðKTc2TV¼ý/.9D¿Gæñäˆöød…¨(/Š.“mhªŠaËx}^Ü.Y’"{*C¨ºÉ¶¯ž¥ß€{ Œzœ§.À#mèU[€ìr…¤"ûø"B…ÛG”ÏnÛ"1 …°‘py¼x½n”HÛ¨Á¦Pˆ*ƒbªB× × ŸKA’¶eaè:ºa"y¢‰õ)á}y!ãäH-H¸cÊ¥DLmÂÆ²L4M oܘV=¾(Ÿ—þÞþØ IDATÐ44ÓÉ…/: ·$0tÉãÆ øÑ„‚/* KÂ2 SÂãu!K`[&ªªbZâ„ö±ÑÕ š­åUÐT ÛHŠŸGFU5\ѱ¸txÔå%:ʃŒÀ4,—„aÉ.¢¼.4U=îyMU± —×% ,÷[õ³{É‹LXV–§ï¾ŒXÄ?îÏÕ?®¢VºT«–\Bˆn·›—_}‘«‡^Úµ?²oÿ>$ä°íZ›s$IB–$”„J½:‘í—R±B]6ÌÚD͹…(òøµ½ù®ù£ÌÝ9ây+áv»øüCÝo0¯×2îÚÕE“/#Ê¥ñÉ#71KÀ¼ ¾#¥Ñ3´z9UÐ]*ßÍû˜Ë>?H×W:3ºê,²îmÄÆ—ïdȲd½pû?½ŠŽ×®â¼Þm‰f`7‹7ȼ²àº×p!¸Ý6ŸoËÍÕž'ëÞTž¹þr~ȼ‡—¯í„‹ ó&÷g¦rŸõû‰”Ì4ÚªhHnåo¾ÏEŸ ó+]¸9ñ¶Omðô…çñÉXÐfƒO窗?¤GuþÜo¹vèà ™ó1Ô”xg@:ó/â½ÛëÀÁ×i\gîø‘Þ±”^ÖÙÜÀ/\G’o“3ësôñýÌhþõ’FwéÔ÷èà…µ/¾Šñd'Í¢÷+Q,?ò²Ÿ7ïíˤ…%‡…š-Ëùªìp¶¿?‡4Âxj3{Ç€ø…IÝiºl?jš– °àãéѳ²òǃ‘H²ÌÁýûytú´£/¾<÷²ÈÇ~ 0ò÷  Ÿå5E =PT²fVâh!,Ô µøsS'à×=h%ÿUCS,’K¸•BV¼þÏìß[¡a_žl ]l !"ÖROiÇäK'P¤—8öØ¥®ÁæpöRzuVøÒ—€I/p÷à¶ø$Â$<Å9‰ØèjýbˆeêUGÐJ-¾‡#ŠŒã<íž™¿v¬ÚñíhAC;qPQa)èÄëðD¬ŸÊ ÓQdœÐW'ô,¢è4‚ Âù«Ç7‚$ 5ˆq VÛT ø= §ÌÛ2TÆq£ü¥îh?”"sI ú,×èÉŒ‡‹ˆRÀ²-Bþ¢Óz: Ë8©aAÀB ”»ºþ=l´P€Ò½a§ÊûTíc*>{3ˆ!ùÞú1ŠŸµt‚¥ß­d üÆóáþWƒþRÏè€ ¾é<ÞÜG¬BHÿhg›Ò¸e&&&R­Z2Å,…(&ÆÈ½Ññœ1’æW,%® û>øwÃöHŠ Iò’P†œ}¥ €Öæ˜$tKÆ‹uœ …'c솲͸~ÂDÒ­6pëm”æfÕKâäv”$ô‚ƒTmÜ‹›nE‚wE'\U)yNpÉFÕLªÄù°lY–ˆŽ­ŒO“0æ"âš0zÂDjY,àÖq÷‘”æaélˆNp—ÔÉ%Û'Ì5ÎÔ'±jrƯêIJU×QÅcÿâú÷sÄNææq·ÑÉ£bnº2•Ëãÿ\S.а­IÑÑ -zä–þ­p!€q<_•rž"$YÁ£O_¸\3â)Ig>á¿ xø{_³‘,Ý|]IlOa[‘½Iÿ©W »ãðä*?]âoeY%{…þ¬6-„Lí^ãÙY0lôÿ|ŒPÿ/ãH˜ŠÜ”­XÎiŽH›xbãðüÕÉò,›OOµ¦¸aã~ZýÊ)4Lò®¯èuábâŽtàè’oÉ/ׂôÑoìF(qthÓ–»n{Õc{кœ!ËW=Å㛹ù½æÄ}ýF?ì fªäåå(oâM;ŸjÆ]ì0ªqq¦Œi ,ÛÆë‘âTKŠ6ñ©­ÑoB.›NÝD)²Çd¥´sT)Ó«Eå*‰|—{C€Ë²oÏ& .Æ—v>)æ²µj\ÚXÁ0m,ÛÆçµOøýcÁ+dd"û×þ^vÃÑ…·Ðí1³¶Ï¤qŒ‰aË”„àµ-HjA¦ç–í®Àu—Äa6¶e!¹d6GÌÂÀå£jµ6o Q5­å¼2¶°%7Š\t¼UéJˆÒÂŽCЧŸä"ž –ibFªü«Öea›öÉß_É9¬ؘ‘ PUü1X¦‰®o ±"kÝ5¦uËÖÇÞËbáXöàÿf® ‹I0‘¿ø[v&tD;o<”ID×U@"ã’‘LZ4”~=1ôŠŽTT7óÆ«‹iqï|&Ô¶ð6£Ìì·xf^ŠD:÷¦u­ŠDGÇ‘R¯! ’¢ÜQTª^“iqûhÑ­‰Öví;‚•D»ÎçS')¥øp$®¨xRêeÒ )šèjõhW'Š ?o䈨H×WÓ>³µ*—'½ó¥4MÔÈÍÝG¡GÃνiùýõR¿J– žØ²¤×Ϥ^•òdÔMæpn6ûŽDÓ¤}#’*T¢v½ÚÄ{ÀS–”úMɨìA7qSiX?ŠU«‘dæ³sÏìßGAT2M3ª›HÍÆM¨cS¡å%ôhT†ý99 ºHksÝš¤EbJ:õÓ*ã’žŠtíÒ9?‡=y~<•ëѵCK’â£ˆŽ¯Dí¦MIŽ[ÈD—M¢~ÓÆTöÚØ Ã`{ö622j†ƒ¼ü ³{ÀïgÅŠåêšµëæG>Ö /<è@°Îª£üüôã*RÓkR©r¥’Ï<//ÏÍu£ndWîN4ME’dŠ×¬•rÕ1n¢æÀ&쿳ÏãĶˆ${YñÃwœ×éüR{Ö!Y–‘e «(›×g¼ÈÞzWs[ß 0m¤È…cÞ¯"¼_É:%*ž‚Ç:RïeÁ$®ny9 í† $ËØ¥b¡–†mGHқ Û“†n‰õ%+yîøKÝosâ ŒmY§¯î‰¿wÚß·ÿÜó'}gwß©êfÙÖûíS–óäúƒÍ©›Í>íµ°Ïl` ‡8ppnPbD£:î:¢mߞͺ_Ö•8Úx<^ü>™ìd*ßôVlE¬`¶°Á2K¢ãˆßŒ](°,Ûiôè88“pHÑçÒŒ¡,"ÝÃÄU«Vmê×o€„Œ$‡×_9„ ¥ jEÿÑ’g%YFŸ¶ œ#¥RtHÑçälxü„¨i:åÊU ÿp>åËU<å#eÀÜg›6o$6¦L8¦¨CŠ):¤èÀƒsÒq&OI’8œËûïÍ# ÒæÎã#Ú3jø9™„øj$×  âõz¦uHÑ!Eœ›ªbñ𢂏ø823b™æô”?vrJtL4ÇÑRtHÑç& Ã7Õ!Eü‡áõù𑘘x™Y¿·­ÁÁ¿ ²,ã/*$6¦Ì‹öæ¢þÑBP£F ¾ýæk<•*WÁ‰+ò_„DÞÁƒ¬Zùí:tÿþž¶À²m\²ô?oÀßÏ/ëÖ²sçÎSŸ£æÀÿBÄ•‰£a£F¤Ô¨,Ÿ¢$ÉhG¶°fÓa$E*©G`ÙÑÔn’IÔáÏ9¿áP¶¶¸…uïÜAµØß"Ÿ²‘þÚ³ \cf}ò—×qýN‚ñÿYĵÙòù\0t*!osð©®ë'ј†ÁæM›¨X©^r©ó–8pàà?ƒCðå—_àr»¨–œrî“"Š—KÆpᵫOñe2/¬ZJßÊ™ÜõÐdòj´§¬W’âÂ…G‘AXh¡ª…˜ ¾ n%¬^+žh¢}nd 6†"2qGEíõ`iA,—¦$2Hx¢¢‰òz°#ß+Vˆ@ÈÀK”[ “¤°1´!ÕŸ"-Éx|QDyÜHK'à÷£¸½ÄîhÞèX¼ŠŒ­«‚ Ë'ÔG ¡j&pEÇSÆ#PƒATÝäDv6 ƒ‚‚ºõìå˜P8ppÎ@,ËØ¶ý—½‰+$V¢óù]øþ»o©ZµÒÐÏ¥Q¹Ë3,úâ /ZÄ×Ë—p×XÒ/AÛ*q¡}|ùÚ‹¼¹lAS€,سŠ)C»Ó°~=uîÏ3_nCxÜ'WÆã"ëÝIôhÕÚµëÒ¤CoÆ=· ¢-M»‘æõjqù̙ܿ-µê¶åúÙkQ¼ n—Ê¢i7Ñ¢nMú=ÿ9 hEÃ+Ÿb_¨ˆÏ&_I›f™Ô®S—­{2þÅ0¢¼H(ø¢t–ͼ….­2©S·>Ì6Ë…éo»÷'õ£a­Æ\4á5ò4 ‰ÐþŸ¸ÿê4¬_†û1caÂëAñºùùÁÎT«ÛÇ?Úˆõn—²©;ÉINrÒ¹dYfíšÕH’ü—ó°m›ØØ2¨ªzÆ”‚³KŠÂÆ“FÓfMiÖº%åÖ>ÎÝ‹ýÄÕëÉÔ{®#)Ú…m‘½i¿îÌÃú‘_¹ë’L›¿W… ú˜ WåÙ/w"JI’…¼}&½‡?Áò…T©‘‚ÈYÊ«¯ÿ€êQðïÏeËÖ|rç>ÚçÅ8²Ž9cÏcÔ£Äx%Šä’µm'ïÏ´9X@PÄÊ÷?f‰dT/KÞ†ïxf|n|y± ŸŒêÀÅ·Ïæ›{¨YþÁ{lÓ”HÃîyC]È–ùbæî[¶[¸çâ®<üÖ”òåQ×.àÎáƒxâ“l„¢Ü¿•}Û¶ràhèw·§:š¢Î%ƒÿ÷þÂ3í9rvIQ’€¬À¥rÁ  ln}øYzf¸9iAPñphÅ4^݇޴ã©W¢ø7óæâeê¥ó–±Žî&Hky“œÆK7ñó;È ©»£T¼ô-6®üŽï¼‚² |ðà[äy<‘“Ö ®ÉílP5-¼‹ª1•¸áÃyÿ‰‰\sÝx¦ HË${ÉWÙù “?ÍEöTäγٛ{¢]ïÓÊ­cW£ÊÕ¬.°üÅkˆÆdñš|¯œÊKÛ sà L}è ž™9w0›ù‹‘4Iê<’«F¡]ýÊÈ¿CzglC³$#ËrdðIȲŒ,ñ'ÖkÃgÖɲŒ,ÿ>y (ù3(‘ýñ2WÿŠËSüWˆÓ÷Åÿºü¿“Ÿ Éò)Äq}ëÈpþˆÿw ûgYS {Ÿlý’[o~„\‘ĨG_c\·òèš}ÊI¿`û&v}6‹k¯ÈMÓVS§~=ªÄÇ ìc',¥ÞuL|>ÚêéôlÓ‚¦mº2ú¾wØ'ÜÈ€ TmZ¡I¬^·\‡6“o)%¤˜rIªk‡9ª ¤¼%Œ½¼í»^ÄÓŸç5‡Â/ºæ§hßn Ðq»3éÙ®…ùùeªPÖžl ¡×…Ô…ˆè$Ê–ªs$;\ŸÝ‹^aôÕýÐJjׯGÕ²±ØªIúòò¬©\Ú²Úï’bi³Bñ¤tbú+&ŠÂ?òâÜ9XÚÞ}|Ëw›HÒÍCBQ VÍ~§¾/@QNoêU¬¾œÿ6«r Ž•Û.u$Gf-I(ŠÆ×N`ΚÐiËäßµ†Y³æ±Çoýv~¶ˆ”I¶ÿÿ¦¥R)>çO>Vç#;–óØŒ·ÉÝ4Ÿ±cžd‡¤ œ¦/{~áÅçß §ÐúŸ˜½‚ûÖóÒ󯱳Àú²[ä~÷3>\ƒaßæ’(àËçgÅAù´evÒ¿?ýÖÜU2( º®—Ä5ýÍôo"E„Ìeæ-ײp§‡+Ÿ}‹Ç5ÀBT´·"Waa ÒëÜg< —|Ã7ËñÞËÏ0¡wCbJ-+JÂÆ0b¹lÚ[|»êW²×HoßÏŒ¹2n%\ÙœEËz¼lù%5Vb=*(Å!†=>K€ìrSðë|œUDƒ.·ñÑÒ…<Ü#©D³‰ª’BY¼Æ:~›O\ùòxŠöqÄ<æ¹êr ,»¸æaI9!#\Ÿª½oæ“ÅßðÍÒE¼ÿêsL¼¨)q1.¶¾9žCoávaýí+B€¬Èìxc2ç5Î µF*©©©¤T©@ó{–„+ý§®À¿k-¯Ïû‚Cª@Ø!r6ýJ^Püæ`>õ 5XûÚÌ^]6xœæ÷Žf-gö;_㊼ٯ!ŸØŒâRÂÏ 0öüÈM— bÁÆüˆÆwºô/]xQ›ƒV³íˆY"¤*#OÖÖ qê{ÅeòÅM½è;w.—ü§Úø$RQ$rß}€ó†¼D‘ÈŠBð—7èÚ¨=,?Œ×U,²Ó¬OW3t˜­[·0þhN3Yfè[³²ñáþ8©ü’Íž•Ÿ2ûóõ˜¢T›!DcYĬ— ÊÊÿ«œôï ÅS_EQغu+Íš5cÅŠ§%Æ3mr8«Þ§²;Š­/_Å£+ü¼y}'Þ¼¾øÛxîZ¼’›ª”ö(Ñ©ÐvWe,à•ÙéõãûÔpçóãÙô¾ÿMZ4(å’«DáÞó$[>BÙ&íIuíeù!?¾¨úd”—ñGÑ#_¡‚ï.d£MH ¸s åu½dÊ)þk[6ñµÇçd­‡û®ßÊ·ïmOð–UãRîïóý^ÙÂ#V祊Qäí¯ÄÛ¹?Pë4ŽF m&2²Ö‡Ìž{7½×~Bš÷(«WeÑõ®9<×<“ýß¾ÂÛ¯¹¨Ðâ"º7­ú‡€¶?‹5\ÆçõÇk†¤½•jF4.(Þìª,Ka¢²…6E®…,ƒ$£( 6Š7™1ÏÍ)1“À.ÖÐ% Y’iv„|$@ .ÀƲm$IF’›ßÂfÝò ¹iÊQ±O"ã§Î ëæçÈ$6;YIJCe¸¶b<Â%ÇI²ñ .mz11-¯[¶íHy$d–åãÒÙ_p)–e#„ŒDq„Ë_ë<yø¼ãƃˆä%ÉØ›#;6‘•¢6¶ \·ËWªž¢¤Ùäp>¥úV?¼‡Û, pÛ ê;žÊ?b\ë²H¢%c®o-`Úc’maG¼¡O*¿$(“Úž§¶?a9¿¸ü2ØaÍavý²1 Ë¥ qBù… ¶z[˜Öö¸äX}$d²¬àR$„mcIÅmBrѰÇ`ž½w›w&3Þ±£:8Ù"¸}ûvúõëGTT_|1 , uëÖ˜¦ùo7ŸÚ(1)ÔiЄæÍ›—JMiP§)I1.$w‘æ×¾Â! $Ži( °vÑr’3Û# ±×$|΂• m¬ùl>©zPU[Ť~¨“VÔŒúô½ç}ò ØûÝ‹´ÍlÄ€¾Ð4³1w|²“¯g£CfM22RiÖ}ïÿrE ðh†‡o¢(:/u®LåA“¸±O;ê¤Ö Õ¨—8h@ÞÊ×éÔykZ¡³úµ[išZ•”:mrûXš¤6ç™9³˜±j[§õ$£V+&Íùõà*îéß1R¾zô™ôy† hûnêÙ€ŒŒt2j6àÊIT”cZodíMRdŽf-äúK‡áþ2³F´DëߟB‡ÚÕIM®FÍæ}™ûóQÅ`n÷*šÄM—¶§nj ZŒxý†àðÚwèÒ¡ßﳓµoO yjU’k·aÈíci”Ô€üðfïT*]>–«º6£ù•÷±~à îØ™º‘ò_|Ç[ÐGÖ¿O·v—òÝ °Ù¾äú4¯EzZ 2vä¡¥…x½^Ø÷“¯ìHZÕª¤w¾Žorü[P¶R]*·³);/,¨8ZÓ3•RKkGå–[naܸq¬^½š/¿ü’±cDz~ýúß´Nýk4EÛT©9d>¿Ž”O¶ KµÈ.ZòüªM¸ÌEA[¢ª4ãöçßçn%¬fئªjV9îY¼šû…I0À°›2þ©7¸C k¶ÐÕ ª,qYR¢3;û3n2lL-DP5x9ï–é\0Á­â׬ˆbgSoè£,éÛ@3dŒT° •`0DÈôÐaÔ4ºÞè ;X:@Ñfï­¹I÷S²¨Ñv0ü<²äڗؘñϼÇ%õ1Ñ4CÓi4þS6ß)PCA4Ýâ÷\µŠm$Ň{ûkÜpó/(¶ÀTMê˜ÄµudÓEJ»ëyéW(øþ:˜ÌÆ+žáacÈéó;¦œÇáÏï£ý[ ±®ãe‘$…è¸x|/ìy13ó™]°>q:»6í V²Øöí+ÜýæN&¾õ—5.Oþž]xÊÁÅ"÷‡} Zð3ĺ6Ãs·æÞú.„–É,}¿n2¨}sа L t‹áÅ˸¦Õ%ø‚ëxï³Bº¿Ö¹#/dM÷9lù° ní®m؇»»wçáhê^ƒ6ÏÎá½ó“ÙµäiF½àñeÛi[EaåK·0é‰è0÷f|q^b= á+K([aìÊyA¬ä¢ƒxvËÆ{=”)ƒ"»±,aòÝpÅ+k¹³³…w÷¤¿œ@íÁc˜´à)î천u7TŽðÔíù±Ë l~¿=ýWnhÒ‡»»õ`ôÎYŸx-k¿G9íÙ;ŠP̰ö^Ò½Šïîy\Ý{?ÉãÞáÕ;à³Á<ú-wŽy¶3—³ô¢J|ÿD_úžHÛ-³‰.C0 nZµŠç埸,c ÏlÊžpù]ŠQ°˜»'¼ÅÅsÖ0¥k,_LîÉeîrø$ +!†¢µãÖ®§itÏöiÏŠ¶O±áÝNøŒMŒiч»»õä©j^bãbq).ðÏ]£¦PeÒ—¼9¤1äe±ÇvÜl‘»"‹ú¼MÖK&Ó‡æ…/ÖÒnd;·[ ýh@¡j Š¨v‰ PL5H‘zrgYZ"íX^ºF©ç†ÄÐNè1SÇq•$°O¸¶‰8¹œH–ZDzìú"a3£é«FÃ&q[6–)å¢Hø’ÒhÓ®QXk­Ù™êž¯Ù³å{>Ù™Âí·t#N†¸ÞèPe)œŸTª$@˜Pé|.ª6žº\Æê«‡píð>”ST~X»Œ¤Ný¹ Y5\XTª^ Ebé5¥SJЖ®©kr hàD[Vg IDAT‹‹’æQénš–ñ¶ºyhqñå<þÄ"ö.!~ÉT~ŒîÅc;¹jÓ~~^%µg„ùÛsˆ]¼›‡ûH$´ÊJå‰,´-ï²Á{SûÔÂ+C§ëî¤ñÌkY±S%Ú¤¸šú€´¨jòõn%­XP’Q7¿ÏF_, ç˜±ÔŸ3 °5‹´Á×Ò48¼’O¶ìaõè÷,ïÈÁ½8—§G†ÍÀ’KAÛü&?ùèªÄËV•ºÔSLVj&•za@‹d¢VMk²$¿(\;—›h7 ià¢éø96!!K.¹Ë +#¶mÓ¼yó’ÿÿ>½žÃ¤ø7ùù¢ëÑ\þäúÍ_ûCV ž“U²–i ©jDÉPÐu‘ØWÄgFÖÒÑ U„¶¥¡©6ZH,´ ·¥b„lÜn—$aé*º¬c[&ºB–-0Õ"T³O¯ßÅò÷_áåÙ72áf½‹­k¸d;¬• $_tÓÏ›¢%-,Dè!Ð%4]€¤`›nÊ(&þ£…hšËT«Ó–“X™ý y÷- åòuÔ`=‡‹ªòÄšU\UIPâ¬,lö|ÿ-ŠGÂÔU4Mà/4érÝ4æNNfÉ‹äññ¹ ¶n7Ó—ËŒ”OED"éšm[š "ä(„n£š–åÂ…®©aOKC[ÇåHQ}ÿÓ¤Rå@_,oÆo¿Æ‹#qýûY¶àv*[!l²[FWhÉ×°â-îçwdlüWÜß¿j0€-»Àh¶Š­Ëx$ -Äm‹’òÛ”*¿®GÊo¢زº@5u()Ão”KÃp¤°2Ó–-çšdz©òÞ¸ +’Ÿðc+.dC ÚA,Šb£n¯„ "» ,ÓÆºBh‚ºE´,ÐU gMñ¿Ëå*q”ÑÔÐIKAt‹™®©ÿ¢5Å¿g7¢p³kKç0!–˜¢…8>X&ª¦¢jZ8V±Š-°"N B˜˜IË„]¼öù6tIphÝ׬Î? BPª5œ7%k^vð ¹ù2mÝÉ[ß.à²ØU¼²^'µNSvþ¼œ » ±„…¿ð~Õ —©TÞ‹v‰3Šm[Oj§À¾1ضÀ›T‡.byùÙ»xrCmFŒ¨e2é\m3f/çjbš*‡öìdoÐŽ,R+o•ZÍÉùqk²¡›&Á‚Cì9xÍ.6 ‡7ÍØR-]>8VgÛÔñ¤OÅ‚U|½á¶ÐÈúâM¶Xn$!ãuCèh†°¡B#:W;ÈS/~G^(\¾ü=9ì X ö£•mÀˆ)³Yºâʬ{›ûŠ+ì¸d#¦FtÓ‰|:ïj>˜x3?ߌ§fªV±ø§˜Â`çwo²VÔ¥~Š/¼ö-l¬HŽ/Xò¤u!É¿Š%ëóèd}ñ&›,7rñX¶…]®>Sóô‹ß‘20Mü½9ì XÇœÏL OFoÒôøèÛ4[ s¨HGDÞ1û„þ¶„@õWMJù²aç¦Ç®“þ3©„ ‹Ç°{Ï ¼’;sP\.Žpë¸ñ|ñå¢ð8>U>gpw9òË9¨)rü‚³Û´¬{žƒ¿F±¶©âny³Gû¡Ya[ )’ë1éáÁô½} }>ʤR”†i(áÉÏÐð‚aµMBþ"táFÚ·€ c¢ÄÇáR÷±¥Ö«ç¡º<˜ŸÜÊÄC©^5;º:£ïº#X^Ÿ!Y¨E… Q" „§îhviÄ+VQd¦ƒÀTÊqIï¦Lê÷ZϹ\VY% §qÇŒ»ÙvóXú®N£JÿQ™ §¿@/ûXy…Ho;„‘ Ç1ùÚ!$'WÀ ¨Të2”{®oV¤ÐÃDª )Ò#{ï°Pý…øuÛÒ ‚˜¦ŽRén8‡‡÷åóšI¸lŠ12†á¡ù¥çcÜ}+WìnH÷~£ûäd²nOߟÒHŠsá? L{[žd‹»([1Šà$_v=­Ê›˜–(qO·´ …~ËP©ÞõÞœRÄ£®àÀÔg™x}&÷ßÐïjijq}¦¼BÛ2ý…•´¯(Š”ß àb:TîÅø«ÞæÞá—òUíj¸EˆŠ1aww=yÞ¶P¥ÆM¿›Í7ÞNßµ©Tsá?"èùÈ \aüLSC$vcòøNÜ1þ ~ª•ŒbÚ4õ8­E!­ÄÛÙЂøm!³ÙOUêÔ¨àDaú£Øk]D„ôâ}j•*Uâ‚ z1nÜ8zõêɲe_“žžN‡íOi>"¼Ès¶Ö>¹ý¶qâái’(ïÌELqð— øöÛoè{y?TU-éE-o7Ù{óv‰YQJH§qZ{¶å“R“r> aùÉÉÞOÙÔš”‹ägofû!“¤Ä\×é6:/þ‰ñUŽ’µ?DÕä$<’ÆÞì|ɵ¨à*`gv.ùE*¶â¥br5*F!ÈÛs)Òmí9CTMI§„×C­àvnÏá¨j!»c¨”œB•r>ò·lÀŸXôò2‡¶n&/.:=€Åþ¬,•jQÝ]DÎ~?•“«å’Vœ¬,òxª¸Ò¿ÿ2žX½Ö®ýlÛœM^*VM£Fµxûv°}÷!4¡à+SêiÕð÷“½s?AÝBö%’žNÅhéXH çïaÛa7µ3Qí ;6oÁ_&ºU$vee“4ñ•«FFzQ’A~vyeÒ¨SуÀâà¶,Š*Ö"Õ`çÞ£TJI&Ú%"gK‡Œ8ªú>çòK¾à±u_PoßÏì‹ ?n_‰¢};ؾçš­à+Sžê©ÉD[Eäî=Jbr2Ñn a…Ø»=›*xÊP-£&q¡½ìRcÈH*‹, üws@Ä“V9U/ äù}ÃxîÞ^ølËy‰ÿ£P…u?ÿD›v),,8Ž_$IbþüùŒ9Š)S&3f̘’à#'ÍÁ K/¢{žÈŠòÇÉN–9¸?NŸvôÅ—ç^ùØFþt‡ÏQRìsÙ娡Ð_–…$—mý<æí©IFq¬˜y£¿hšî§šda-^’pÙ‡ywÖ[”éÒŸ®5Ëÿƒ¶±I€Íöåóȉë@ƒ29Ì~K¼Ê7³/Ä¥jÿð-w’$عü-¶Æt QÂnfŽèËg5çðýÜKp…Îpù%ÙÎã­)’xÃ4ºU¶1mGSü¯ÂårñËÚ5´iב‚‚#'édŠ¢Mzzz‰ÓÍ© …XöÕâ3FŠŽùôœµ¡þöëˆÈ1[_=:ŠÇ”KïÌ›ïM &¦}vëaP–~7E:†õO:49lâ X˃·N'_÷P¯÷c¼óÐExB!Ìüü6φýÊÔ[åê¦N¯i|ðH<Á³P~aaQÁSŸDhA GIüOÃ.%Ù¶8ɹÞ4MÒÒÒ~wÃ~8É$o§«ÎEB$â0ó×g5a¨HC˜ÿÝ5(’Þ& ¢[âo©ö—µÞ3Ì+žä‡an$À24B¡à± ïçÀX©Û÷1¾ôTXï55‚Á³Y~ -pÞYÇ‘ÙoÍ]$‚°ÿE›÷ü/YÑFØÿO‰ÉQt4ä4çïÀTýÇöŽ:åwàà¯ÍZ’„eYáýê¶5ù—ÈÕ!E'ÊÞ¶¦ig%ä‘ü/`Û6uë5 ïàðõ_˜»$I´LåÌí&tHñƒ,+ÄDGs(/„råg(œSøës–„iìÎÍ¥bbå3Â!Ås n›´Ôt6üºž¨¨h'l–þ+tŠmÛ˜†Nã¦MOq¨µCŠÿQMQ&)¹ѱÑa;û¾8pð!E·ËMB¹²ÄDÇ IÒŸ çâ¿uXHŠ¢P¾BEÊW¨è4ˆþÓóáÿ\ñpšÕ8pHÑ8pHÑ8øÛIÑÙSçÀNÅ –ΟœUG·ÛÍÛo¼Fb¥Jgpàß¿œ(Ÿ ÿ÷øgKF„ñ5Í ÆèÀÿUx½Þ P–e²·m£K×îDEG¡ª*¶eaÛ6¶m…¯#ñžãââ¨\©2‡>#¤ø·9Ú8ë‹_›;möÚRŠ‚N‹;ppz°m›²åÊaÿÎA’$áõE±³@]gƒüùÉYBq»,ã´gþI²‚KÓ²þRÃI²Œ"‡#ºÿ›øÃår±â»oèt^WB¡àïKL.7Š01,gJ?U[®^õ-[·C×µã¾ÛüÅýŒy?–‡š¯âÂ9ÍÙ¸ö.*¨*–øcã׃ÿ")ž4ÿÈ2Á`œíÙTMI G°9ïöß×"v±âöáq;AÙÖCh'ÍŠäÛ§ŸâðùcéSǃyÊÉZPµŠ~péňóüùˆ…Ù?òÉZ?½/è@¼çß\TØ6.—+<K¤Œ/:ê䪶Ÿ5/Oç›´aÜÔ®,úoH+ÉDEEaiôÿPÄ9aÛ(Š«XÄI!ዉ¦a—1¼ÞâÝCøé"/•‘ Iùæ™™è<†+êxÎ’°î_¡Мˆ€þQï8-!=šÕ?bÛ!M%5-ý/7õçÞ˜¿ ¶ˆH ²Â®å³ع)ujÕ¤Í%×óÞº£¸< "rrxqB1عró­ðÄ©Sèp.?ýº)~óžßN‚£ÛV2ûÍ/9¢ý•çÿÙéXû‡ëféyòÂZÔ®[—:µkS§NmêŸ×² ò~ùŽv…dé7ò“°B;¸PÞÉ:}ŸüSñ¿6 ñxñØ…-»HP­r<îØŠ$%jEñrà›»èpákô¸ï ^êT…?ʨî=8øþÇ kU „YôG3à¥OPu $ I’JÖm$„€ Í/åÉæÇ~G*ž­¥ãM·RäùãÕy’ŒÛ¥üëÎ+,]—ðÿ%l[cûÖ|Ú›ÃðŽe¶@òÆR£œ‹rͧ=T­H; Dq{#"ü|ÎÆ_IP#Ê’î @èªÛ«”ÒDÃm*"Ú¿T*?@"Yœcm ¹ëV³%O¯# miìúu-®Ã: #»=¸”ãÇ\q_HR©XŽ¢X$”~¿=m8åó:¹Ö¡(@ù¤ÊDî‚cý™¤$q¬SJÊ,»ýçàl>EqѼu¼/–eRµZ ªªâ‹ŠBSϬ“æßÑFÈxÈbê°Gip÷̾½ÍµdØä7™}mžx~~s·U‹¥Ñ1toN·Ç>ã‘Ì2\õ±Ÿè(jÖ; jžJbr].¼þfÚÄÄ2r•Á‘E3h{éäÚ¨yßÓ¯VU.1‚Mê^»5÷¼W¬—/ßJ‡&µ©–\ƒôÆ—0{å^$DDaoÄãéß’J£ák[€+†Ôú-i×¶-íÚ¶¥M“T-o1¿[%êLßNl¬Å²»úRóŠ[˜Ð¿3uÓÓhÜw ›üKG_ÀK벘|aM’jdÍá_¸:5®‡Òºf úÌú•O'ö¤nÍ4’«¦ÒªÏ$V–ð¸\Û?æê6TJ®Cá×Ó>.A߉u‰s -Åñ¤"ìc&ia‡‰ÃŽ˜©Ei’³Ùúéti”F¥*\þÈR‚ŠW0‡7& ¡IF ª§fpþÈGù5Ïu##RbétåpÚÕJ¥÷Œ¥Ì½±5R¨ž’Jëþ3Ésûp‡vñæÝCiyþ¼k¦³Éoðõè^<»a^V›*µGñõ’±dTM¥fíºÔ©^Ž˜˜X®úâ(ß=8€æ÷~ŠeÛ¸äó&ö£×ãKÚfF¦ÄÒu亷¬GjjCnym3’Ï‹•û×u¬Cåjµ8ÐH:U¬D¿/œ#ý礿=Fሉ‰!ÊuLà”$|>º¦ý{ͧBraíü˜ö'qQÿæ`˜ºa“ÙöÄÏ¿°¯HÇ _ æo>À“Û⊊!Ú-!³“©ƒo&ç¢9lÏù…'»Å°71²ÅCl´/LpȈ MRûY±%—•³º²ð‘YwDÛd0¯.ÛÌáü=,T•û&¼ÊäÈ$&;"ÿ[R‰ù42(…°‘µ}|:ç>&L˜È„‰™2ã¶úeܱñÄyú;ÖGÁº|.xj99ßs9_óÌ¢môxe)£›ÖaêW{ÉßõM\C—¨Ô|Ëwåñåèš40U[÷‘¿=w§ÌØ)KÀ{'FŒaÃy3ÉÚñ+³.Oâ ‚lû\hKûø¶´‹Ç %Z¢(<8ö˜ìÛêæáÅ[ØþÍCíÏ”%yüðòT^)hË'¿æ’·s%•ox轟°„„,dÊ×À²Ü<¾è±„û?)ϼ¬|äüÂwu#Æ(dÙ쩼|¤5­Ï%oç*{¾ãþ¹ßÓyÎ2ni˜Ì] w“¿s.çwyŠÝùûÙ“»—nèLrûqü{ç^EÑöá{ö´ô^ =¡÷Þ¥ÚPDE)Š X°*(Š]±‹*Å"]齆BzNNÝÝùþ8'!„ÐüÞ÷ÃÜ\\'{¶œÝggæ7Ï´gl÷ K(‘Kà9L‰-$œp»S ,B#¦î@æ­ßÃÖo†°è±ûXY”Ç›·ßÃÊöO³a×F>Ñ„ÓM˜ ³jåõÿ¿ôÿ£Le%žä#LÔÙ5ÐFhEÙxl1ć‚ý ¡!a„øxtÍB›H4Kð–¶Ak8°˜Ù{êòø˜^Ä ?I—¡ÓÝcVbÜÐõéÚ±1ºÓIXýî¤Y^à@±æÉŒ¿¥'s7æa5sÈßÕŒ]¾©%¨ÐWµ1…ȸÒÒ"&„$$¢ýü†Ï Z¿ëè‘làÑÃiR7žÅ‡\è%à5 \Å…”8íè@HJÚ÷hÅUŒW80ÿÌ݇³£ÈWÖŒÕd|·3•{¿èM‚E’Úg]ÓÞû×[½´¹±Ìk‚ò©Ib¡õ[i›`ÅŸ2˜ûûßÃ}3!-|-ëç,¤ÿ’·€sï69¯Á7´öøjtéÙ»Û?µ;Mõ—¹cðp®½ún¼ö|bŠ·³rã_¬ûáWú/¥ç_|%#ªá5L<ÎBÜ%6tCbz¼lùòQ†}Ãë_£u˜Î|ÄqªÈ¶ØT:\л˅Qï|‡Ïb×¶¿™·#†1¯÷!ÅjÁzÁ@º§¿E¡jTü?òNHHK`Ðeéäæ½v)yÒ¼Ç7¸½>|~iø¼>|öª³fzi¤jÓ4ñù|¡aøüè¶XÚöÄÐK0@ß7~ÓDúýø½>üºÄj—x<^¬šÃ0Ñu/^Ÿ Ô»ûÀïóƒEaàõ›xöÎÐïÐïÏ™q^=\ ‡ÒwŠ—Ë…Ó‹Û#1l`ºß‹Ï'ðég¿-M³t! /šf i‹Ä[ìÄçÂçéwâôCŒôãõ )°Ù$·ŸÅ†5Ô†ž_D¾ßÎMÏ}ÈC½”«8Z¾­H͂Р¼n'FDWÞ[¹ŒŸ¿œÉGû3þ‘A,]6Ž’"7Ný€Gz7:ú|ÿô`´r¯×Ä0¡dûø#·>;“±§Û‡ß40¥ŸÏ‹´øðë¦áÇçó#…À”~¼^ ã#1ñ¹KðI+ÓƒÛcÅf5±bÁÔ½ø¼Þsj$²âŸ÷)–wÃBCyvòÄSêöûý\riŸª%ЦîEOèŨîÞ˜ò&ƒ¦_Gµ;g³g}I­^n=2À”H-ØñoêØœVá;ùì·½\Ð;•Üu‹ø»ÈÅy¥®9²\»õ‘¦ÂÀ 3w«óªsÏͽ¨ícç/ë9Tì=ÒDàx³ Í'+ßô`šfС ô{z 4 ‰VóÈKSšÁ>Ö@ÓZÙ?i"±`Å×ãCb/¬°¡†wß”$ufàE͈–9¬øùOŠ©‡HhD˨ýÌZ°›ÞýkR²yçÐ4øæY¾6nÅuMÓÀ/éÐ"šÏ~ú™½×_K,&ù›`iA·§Ç€‘èlüq!‡®¸œhçz¾ù%Ÿú÷u¤åžïx|ÞJFvI'9‚»(—5†x[©­ˆáÊ¥ˆúÝö4×¼ˆÎ‰W1kïDÚ¥'0aþJnî–AJ„OQ%–(B-Ø„Ž×íE ;†;“÷»ú=ÉÐnu±HFLd%[²ñ 6O>»öl£$¾Üà³r] H 1é´ˆÍá‹»èwe®«ø;;›jÁãLµ¶±âD±4iB²Ý•@£^—¢iV ib˜Óx|:¦)1Là æÛð ~{ÕÅ@7ðù"ôÂëü=z7ß°:) fâŒÈÄ›.&Ì’»Ø…G?"j^§ —ÏÇÞœ‡À¯ãú9-ˆ‘yèF ¿º——'`Tiàv–à ^Ã4ü”8‹ðÄt`Ø%!¼xûÝliCþÖ¿pûÁoJL¿—Û[Ö7RešIÍ#CpËÄË4ðåäÓé°ã›Ð@ßWd-ns'ºÛ‰Ó0ªßã©ûËÞƒßíÂåõ#¬ñ4oÊ;OÞÁúÝ=®-^§Ÿa" öºèuî~€&q^6ýíÃâsá¶6dÜ„+¸ú±¹îÇVÄ‹J¼¢¬/÷l·{ùB¿´Ñç²ÓíáÉ´½e*7\ÿu¢t27m¢Áð'¸´ž Ý4ñ8!?óºû7œ»V²1ãNÞÔzûoáç1“1êwÒ“#(É)¦Ñ°‡ÓÉÀítâÕ%R³ãÙú£'­'!-3o+%ÝG2 v®ÅOc&1bÔ2‚ç7¼q÷œ_–íy~Òíd¶¼ÁM¾bÂwûé¿‚ÉýŽaJš y„A½.&ã›×ûÐNj‡ûXºúÞæF0ÿãÕÍ`åTÇå,©¥s÷¸A\ùà-\·°%IZ¹N¨ö/yг UH#$¦îÅéób˜Q4 ·W/ûÛ0M“t„øïˆâ1~ê¸ûÆÊÉÏN%7çð¼SÓbµ2göW\{ÃMdg \_ÓðìgÛöLŠ<:Öˆêfdié#sÍZŒÚ­¨­:Ö­ÁS½%uc­h“¬ÍkÙzØ VZw\ø½~ýƒ;b³Øå§n4lÒÉ®­™ÄÔmH|ˆÀô²c[I åÎdí†Ý”ˆPRR£)ÊÑIoÙ€âCìÈöQ§NKÕ[®i[6o¢CÇÎ÷«iHÓǾu‘颬LÚÂIoÔÇÁ ìlH‹jv öî`‰4­À$oï9Ri˜Ž+o›¶î£Äˆ£e‡:ämÙAxÝ&$†¼©¢ý[ؼ7ÓG­vòrìÔo\“«Iö–µl9ä#-µˆqý¦Ã׿3®žyöÛrû¶-´ëЙÃÙ‡MÓÐÎƒÛØ²'¡±iÔkP‡h‹‰Ôtö¯ù›ÂøÈ;ÈÕèݨµc-˜<9™lÞ±—bŸÀKíŒt’ÂtvoÜFHÝf¤„k˜îClÙ´‡ü/ÒIú©kC '7“ÍÛƒç‡ÅR»^]#ìx 2Ù´yÅf kìÈt©—õã'4ìH“$Áá][ؼ/[D±á6dDéI6ö¬ß‚£nsRÃ50ìØ°“¨ú-H09¼m=›ºINv3qÈÃÔû&4 Å«VìQœ›ÍÆœo¾fÀåW¢ ÉK³–“Ѹ%. ÒA‰Ûë/'ŠÑÜ®â<º7 £uƒj§.všFvVS§<[0ãÝ÷¯~튂ŸÙ€ïÌ5ŸJXÀ4±G¥Ò¤uêÑû °’Ö¬u¹š¹…”&m),¯ùš_7¦WóPM›ÀÊ”¼^¤L¤a:A×<œº–yGÂEF£(@‡ðTš·/÷»ÕLˆL¤Ady¿ 5W§lšR¢I ÂFõæ^‘ŒæÄºié4)õòÄÔÈ &¨£¡±µhÝ¡VÙi‘›e»Èj hW.í¦$B£dÝ·üx0^-âYùÆTG\È3µ,x³­ÐŠó˶MIxŸ IDATr:­“ÓËm`HÀ°Ú´ ©©Ie{+3Iì±i4o›vôï`¥V“f¿MáH¤aË£A6Ìàù1Çž”8¢«Ó²Ã‘7œXI9â×!¦FC:V§VÓæG.†a‹«¤äŒ×Ò¤ß éCøì÷áÿÊ÷gQÑ1”8çdÿ™Ô=Pó >üeM€4ð¸\•¬Y¬P' ¥•§3ºÌÛÿ¯ÏR€áÅYäU©ëTkf¦I\\NgñÿdlU~¦iGqqÑY`Ë3ôþLÎbŸÊXŠ*ÅE!Ê€Tüo+#¦²ý°b§l©PüÃü£D1€Ïçcî·_#@uÆ+ Å9Š&4 ýì[¥ã.Šv»ƒ¾.W)B¡P(Îqf¾ÿÎÙ'ÖÊiV( …⌉¢B¡P(J+q òýÊ ‹Ë d[¹·Z’Éî×ißOUâTžï˜ð-¦‡ƒ»wSà=UÛHtw!™û&å›>íÙE¾GVEƒž†}MŠöídw¾ÿ˜=†§˜}ûâÑÕ$x…âÜE!0¼,üìÖí÷G¥úùsö >]° ¯!§q-!<üõé[,Ü«—‹^:+ž»«^[]Éýä°àË/ÙšoVù¡öBô¢u¼ñÔd¦LÊóÓ_áµW^`êÔ©<3é9¾Û’sŒ ×6<ˆÙ;O½¸Î]3—Ûï~†ÝE`z÷òì+ù|‹^ Š4 Y<ëcÖ>Yúñ3ï®>\óécölý•Ñw<Ʀ<5çO¡8·D0½¹|óòt–í ÌW[ùâÜñâbB“‚O\¯€…¯<Å÷YÖz. °††rìqš¥„yoÏ`»O;¡¯zbOô_TŽk!DÇE›˜€ë×éLxk3‘IñÄ&$‘_I¹¯IX˜v¬=dåæÖ¬vÂÃBÑ,„DDà°œØ;ý÷Ù6ðü¢óó/²Úyò¬e "2äØE…ÅFxx(qü_UÒŸB¡DñØ"«ÍNX¸ÉŠgûpÅ[‚‰Ÿ¾Ç€¦ XÍ]¼<²5’©×yŸo)D“=¿¼ÉàÛïeò-}ȨQvWN`] ¬Û…G·ùùp` Ñɽ˜»¯ˆµ¯ÞL»ÆµHJªÍyÃ^b—ÿX¡-Ùñ#WŸw1¯®Ébþàö¼ùçF¶J$¶æ ¬5Å[äö^ͨQ-™VýƲà@ÀËÿòæU há\}ë­Œz#W¶N&´Æù ¿á&®mÁÛCÛ–VŒVýxsáNôàû²àbñcižFvƒ˜¹Î°‡(äÛG¯¢qõDÒuã‰9Û9™«/=»yyDê¦ÄS§Ý¼ý·ó_j[ðËu­˜¶.“»$]m+\^L¼†fõjœ’Aß±39TvŠ3ïwº´qÕš2ìµeèT0™”ì[Æý[S35‘&bîn³J¤?…B‰âñDQ8ùyâõÜøM >Zö&¸ù|è¥LËÈ/;¶ññÐF÷¿‡U> ›E²ûÛŸ° y‡í™™Œk´ž_ÿžVÏ-å©&áÜøM…‡~¤Oõl©=yý§ Øý;ÃÌ7pïJg¢‹À¹ç7ÆžHÃ1/pk‹.ùx%·vjËÛ«“¿÷š–lfÒ=ˆ1“-»wòúÀ"ž¸y[ýœR0̳»Š{ð9D¹ï}"…kž˜Å¶]Û™ÿô…|òìsü}ÐHJvmamq=¾^½…¯îŒáù#ùà ‹èÏ#»{òíÆlüâvß;Œ7wÇñ 5 „O†õæ»ä±¬ØsˆßŸiÅ«—]żÂ£mžâ…­âÞÖé<½$›Â³è&‰k6˜Ï—m#só.Ü9¡“76¬ ¯¼A­'–°wÑSä¼0œñK ±ŠR7üûxéöQ”ô{3ùt¸‰×Žâoï¿?ý)JS2kÅ;˜=w -n¼•îÁèýÆëK"ÿÚÝÔ‹Ž¢Ý-pUèo¼ºÌMDõ¸–¡í“I£ö])Ì9€“bÜøJ>yu:_oqPײŒY‹œÿÊ*† ýN¼†‰ÇYš>B¨×&¿¾xƒ—Þû³nMŠ–þH Òï!yÐnn›@DÆ@&NåË7VâsXMàÛù ¯ !¬èÞzé5~9”@dÉrmð«ÒK¡ø/`=ãw %zdSÆ?s?=?”‘ÖOy릆Pr˜"-ô˜Òc©¿å¸‰!‘¶`8)‰¥±à+`næá«o$³ë éV°ýcý® 4 2w ¿þ Ouh‚…Ê{}¹{±Ä§Ó¦]kâ AÇ ®¥~u­ ' ƒ__z„gVE3ôònÔÉáÏëðö0áQŽÀë3l$Ä;È?¸‹=’¾íZÑ2Ô@—Ðò•ÙDÕNÄ}جÜMÍßC‘5•[SÏtcHA«¾'©žã_^¥(—‹Wrß÷b½ôvú¶ª‰¶˜¯6” Ò$Ô9Òo›X- ÿò\|"¡ÌFzînŒ¨:´k߆$݃DÐnÆêd¨ÙT EÕEÀ”’:ŒbÞEá\xѥܶ€®nBmË^~Ýbr~s ô-,?h§iý(Ìó8ã_4,š<²/ó~ØY‡w~¸@ñ·Ó)6€ésyÁT>¹ém]3‚_¾E§$hqäâa5Ûê_@|ÃΜ—X±¹LVѪÙ,þ#“~wÜ˵j"sþâ#£3XP»ó 9°'&#õÃlÙí¥é°dØÞb“¥c»Ge§Ã‡*{é@õ¶Ô–ï‘ÓaÍŽµ-'A|ö6¾hâHôíœË:OkÞs5u€}»¥Èšfƒ‹7Â-µ“µ«²ˆi–N˜‘°‚ !µ:§¿­NGº§U)JO,ІŽá÷ao4йßx¹ôÆÁ<Ÿð÷Èà†[FR çLccƒ‘¼ÒÌŠëG£\Ø)M ÓÀ šú ¢˜;ûSEt¢uƒ6´Œþˆ¯¾ÛHlݽL{i í‚`cà÷ë¤_ñSw_ÇC÷NfúsciOZD1‹ç}Gb‡F´lu 76ùˆI÷=NÞ®Øòw±aŸÁÀ[n¡~xÕJ Ò4‚oci\'Šç/¥g¬‹] >dáª":¬E;ùü£—ȰžÏ¡¹“YžÐ›;ºuæ¢{Îãâу˜ôÐh:%ùXûË"¢G<ÍešÄ0Íà@J‰i˜¦Bz1ùÎ †ßr=ñ ¥Ž%‡Õ¿¯¦éØg¸$é_ê$Z㨕l°lÎ×4ð´¤EN¤™ÏñýÂm\õ7O¼ºÄÁÃmè«&3þèa]Ê„¥QÜû]+(ùÝ0‘¦‰%í*F÷œÁ´Ñ÷ãq1‘%™¬ÙœC¯;ï¥U”*ÀŠÿ4Ç èÚ¥óc=/ê…Ûåú{Aš¦±uó&š·lU¾$ƯCÝÖí©kÃQ­#=šþXçäÒ»ÆÒ=z ýW­^<5éfj9$¦®#"RhÙ¨6K@T-Ñi4O¯N¶M)Z÷+ VfQ·û•\s~ΙÍâíýFõ§Flm:vnŒÍç!¤fSÚÕ‰¡N»óˆÊZ˾ˆú´¨™D­zñlYö+Ë×yhwIzô¼˜È¼µ,]¹–Ýy‚¦]zѦ^"ö*VE7}nHkM·ÖÕiÒº Ɔ_˜¿l2µõî@“¦M¨iE†'Óµc=Ö,ø•ì¸ ÿØh„AT³¾\Úþ^ü;«·"¬^W.íÒ(ÍÀpÄÒ¬i=¬¿OP§U;Ò"5ªu½ŠvqÙ,_¼œ {‹HiÓ›žmkþolpP«I ö¬ü…%Ѫß`.i‹æÌåÏÌhHµ¨Ú´i“Ž,)¡îõwÐp׿oµ1hü“\×$Ý00­Q4iÖ€»Æö¥šg K–¯b{¶NýνéÜ8‡rÿrÖ­YMƒ†VnØG\b ~30©tš—n˜Gmø}nj'ØHMˆ<õì)%N'K—.ñ¬ú{ͬà×>Àü,Œc²Õ¸ûÆÊÉÏN%7çð\-V+sfÅ¡ÃJ]¼£FÐJsd…S*læ ž¼F䤊¿YñúÇ¿fp^Z•h>­ð,ÇáL°Óéœvü÷ýoµí)¦¿Ó±ñq«JéOq®2óýwè7ðr4!yiÖr2·ÄåÓ”†‰aJÜ^?F¹m$¸ŠóèÞ0ŒÖ ªº(jÙYYLòlÁŒwß¿"øµ( ~f¾3Û|Z!CŸJ¯xÈÑÛâ´WsÇ|¼‹T¡ñžå<˜øžóoµ­øÇiÿôjF†Bñ_@ aS( …B‰¢B¡P(J …B¡P¢¨P( …E…B¡P(”(* …B¡DñøTˆû§âÒ¶ùŽÞ>îNy’Èó õ %Š'Ì•e@y×:%±!t?u½§­ „N:û©üwåñKœúÎŽBã˜Øzþ¯ éy5¿5±üLUÜNr¾&›ß˜Kü Ÿ”ǼÃÌ?ßãÚ[žb·[½C…Åÿ-Bà/ÜÎí[óÚ¢|„íYÂ]=›3ø™ïqêÇN‡>n!.B0¥]2wýê?Zì*ÁÔýøtyìý­ç¶ó{ðùöÒÉå'‰|ŒG¸åùkIíý.>!Èÿc½kDP'£ Ô§Y» þø{lÌv#NUlÿg¯@’¿úúÖ £fz=êׯOzyü£?ð§@,]7¶²ÇÐ0ñùü˜ÊÁ8…t+O–M¾Üœ¯ì9iZ>æÚÁóç iI‡—w9¿L, -zpí +-„ ¾_õÚç g~Ap¡IDDEëgq÷mÏ`½j:3îìA8^6þ2›k³°&7 ÷À‹©E{׳tw1ñî}¬Ü’Ed èÛß™¬ð„Ròí‹L[W¾7]Aì®ß˜»b+ù.”¦Ý¹¬g %×Aæ~³ˆ” úñóL6c|ð{3¸þŽ$º²`Þ<6(&¢f.íÛd›(‹R`q„n>ˆ7ðÕ{“imrxç*>xöA®º=?»‡4íìª} Z½Á|òúÓ4Kv{H86`ߊr;ž:]:¶i!Çœï+ØÁ÷ßüÀŽ’XÚv‹Áv®öTÓƒôå±lþVïÉCDÖ kŸ4O²µîæý¶—-†6=/¥cz<,ûö{¼)ÕÙ·æ/ m5¹èÊËH/\ƲÃ~<ËÞãe™BýŽ½éœœÏO¿­dO®—ˆ”Æ\Ú·;Õ­ÞÜüüý/ìÌõžÖ„nõ¬8ìóü=^&…Œ¶½èÙ±nY†·†Å[IÑÞÕÌù~)9"…Œê`Õ”‡¨PžâÃbÓ8ðët®¼îE’F¿ÏKwö ØòÖ­\÷àW¸"#9ðýT®¹õm lý'GÜÊÇÛ ë§±áóI¼þÝlié$;±5Ѭi:1a°sÁBö‘$DyùþÉaÜùɲǖX€>~ô6Þ]™G„ÃFdºÄ……’–Þ˜¦jb÷ñÙ“·óÎŠbïüIŒ}ìK 8Á2eЬ„„†K­òÈô'¨±ê-^]§ŸÈG8S¥9ÒIµš‰DEEIˆ]ãÐìûòðlŠÂâ É^ÈÝ7=ÄŸ.µì±R/à£FòÖââÂ3óÁIlÖB±œƒeªD€ôðÝãCyìÃ?±DÇaÉßÌÚÝ%8W}Ȉۦ²ÙŽ5g%ß>ŽÅ{JÀÈæ“q·1ñÃeÄÖkF䎌¹ÿ]òc«“aÇ‘œAÓ& ¨‘É¡KXŸ#‰ g×ܸuÊÏøèyÛ˜:z®È&*. ×MìóD’éÀ‘”AÓ& IKŒ,çmJ,ú”ÉŸ¬Ä¼‡70ùîûø9S+vðÑäWØgq¨T å)ž)7Åš³‚‰ä®Ù?ðÔ…µß«xrÚr.xû/îë ƒ3XÓêN^Út£¬`«w · H½XAlñ&¦ü¹ {ÿ~Ô°²¯uOzöp’„»&Ò>Xë½®Å^šÜýƒïGC`w”0gl/ÞÈ¿ŽÞ¸•6ðµèL͘Ù4íÒ‹‹3,8w|Ȭu©<9ûAšØÀІ1CeIæô©qâG3¥ydAçøæ´Iô³z].´H>» ‹ð½ïÑ5ã+,BbIkÃKo?É÷Ï®`À¿qOÀ`"Ötdòy|PW :ùž½_1sM<Ì™@èSs;=Æe“™IÐÌfúò^èkyèž·©=ék>»¨:¸¡wW°‡Gãt:1‚é®4ýÉòç—zŠ•£5,]÷Rvwþb|Jç(gÇÓO‰Lcð”Oxîâ½ÜuíüíëȰ¶9E€Œkèú;ÏOÿ•|¯ŸÜí+øsWv¨Ã¼éo°ü@ ù›ä½ù{éÕ®îq2 D ˆ†ƒk·êšÀ0a‰©üñálÞU@Íæ— ý5“wçoÆí÷°wÓ_ì*”$Ä®Ý^ê3]%Y'­Ñ…x6üÊúÃÊç/o¾Å«C­ì¡P¢xÆ¿QfVû®è×¥9›¶aÀ]o`ë;•ù/ !¶ÏàÌ¿‚£§X>Bè7}S:ldxÇÚ¤e´çÎwVcs¦‰_בÒÀÕ‚&ÝÀ7ÛӠIg>¾œfš ÿ9èiH€z<ðÖË„ÎM‹:Õi{åcüQJ«òäy‡¹©]}š÷™@µcX—ÈÒôo©œè~?^´3–¦‹o"!µ1c^ËåÉç¯aáà 2šwaÆV¸¤HL Q.áÙ'®aÁƒ}¨W'~÷¼ÍŽ"+íÇŒ¥ÙÒá$¦6âŽçÂS.£4t|º H›^ÂCj0¶{}šµÀÒÔ˨-ŽxŽ Å¹Ä1õùq÷•“ŸJnÎáÿøÄ]‹ÕÊœÙ_1dè°#íDGE½—'ýÍŠÈÞ>ÅFÉr'UüÍcïšÁÈç¥GœbÔú³ªÙ´2{–Þ_¹A'q?^ŸŽaH¬v;KÕEݬÚåÄÐ}ê­+ª¦¿ßD­‹¦Pœ:!!!èÇYåCÓ4öíÝKnnNpAÍÚõŠ©z¢èÓM>û= j)EÕ !ÊAÿÕðë¦2†Bq*ÂcÑøqM.öãäÃ0hÒ´ —'0úÔãñàóÿ÷uã.ŠB€UÓ°¨îLE!Üa%#5BB¡8 Vn/Æu¿YùÂÃB#­nÕŠ ù;ÏS¢ ý$¦Ð¬Ô©NQV¹jÇS~)~Ã<*0°Å¢cêÁ[¨ô8+{²\¸+ô ‹†5B8˜YDqnTNÊ–¡/WˆžÎÆÙ39Ð|0=ëÚË/B’ùÛlVÇ_Hÿ¦Q* *”(–C³XØ»gEEEøuÓ0‰OJÅ^=Å 1¤4Ñ-á\;° †Ä0M¼†ÀaX4Ø»)›=)14¥…ƒ+°áüÒl€7æ3 ¸•¿~+£¬k±9pXµ#M(â8%‡ªÙ)ªp ËñòT\\<Ñ1q¸½~LS¢—.óVEÑ4ƒÍ§†Næ'¦)‰Ñ1«yٹ߉Kº ã-8Ç&žßFô(’áLld²w×>Zê¤YûôªA˜4ؽ-‹/Våá”û-)+°§PcÓýì>èdŸ+Ð׫ °‡Ò½s Ϋ‚ÝÐÙ°&“¯6Y8\¦#¤ÔLášÎI$i^Öl,DZ»ƒ}ÇçNw˳ƒyj«ã¶&ÔÖ2xaît mÏ‚ûvóvô;<³d7Ûö þ”®ÿ í,åæ\釙ûâ£Lz÷Géšö¿›çº‘ôh«ê#WTñÊä)ÕÝÿgœ9O±Üc T²²ÿÁrÂoà5Mœóøi[,ÑzO-+BX¬´ê\—ÎÖ^þh;¹"„~×â¢jÅ|q0pí@,Uar*•)1ì!´m˜@º¤ÏϦ]E¤ŸW‹¦ùûxú½BÜ!‘ ½¬fmæ—`?¢4M4[wˆgÓâM¼°OÒî¼ú °x0¥‰”Ú9’¹‰÷Éã?ÕaÉC[x½€‡wÃ# ~Áhî6‹§Ï›Ã×Çðã¢R¯ÑàÏ÷Ÿá•=ùèW©z˜7o¿•©ßµäÕëÚª4¬¨Â¢xö՚ό(V0Å‘í@`T\L© v IDAT¬ Mj„8,H›ƒ†ñ!D…[Ò'!%á áÄÙùâ€?x±à5T‰rj®ŽXmv ¦ „†Ó&ÁJdX ÃSSÁ”ÄD8¨YÝÊÏ™¥Í¦&ÖØX’üE|·Ç.ü™E—KâAOýܲ¿·þ’ ¼B*7që&†»ˆÊOöÏeùú5dþõ7cÿˆ‚¢í±ÓØ…ÿº¶ØU UTá%ŠH|~«82´Ö4Lü†iâ× üt] ¦øN7d0n¢i‡Íà÷E;X˜«—Íx”¦‰a ÅtÝįKÕs øM‰ð¸Xºæ ™.¤ÄO¨ÕÏü¶°Ê+Ê‚KÃÄ‘†”2ð^„†á÷Qâ3Ñ5ôxqK‰nøtyN ´ñÿßIû~Š‹-\5~2czdiA±…`SÉSQEÑ óltÏ\óiùyŠ28`#àÝ™˜¦àˆg4£›Í"À”˜^/ûœ’¶ÕüšåÅ'Ájµ`1%Ò,"T—âI1ƒU6Ó41‚¼Qâd—ÇFûšv–op#„Àf³ ™A4¥Ý侂BÜö8’B%¹.Id\4 š Â1Ï‘>Å#mìV‰ßã zŠåѰYÁïöTr…êWá•¥;¸ë¢fD;4üî¼*i*ªx¾9ëÌglž¢V®Š`š©iجi‚ÓhV vð ³8‘’Ø>œý‡ XúgVgD„“}%&‘Qv²Öìá×°XZ°_Qq2H°Y¢œÍ¬†‹oâ–né O("Û ÑÑ6v,ÝÁßlA×Ñ_”ÇâÌ8ztªAò!?I5#°Hd£#™;@(­{6áÕ0qO®~1~w žàRVÍ.hƒóõ§yÊlO—ž½ðz=¸|&N¿¡#Xp÷FÝó'ÍkD¿/‹´A÷0ú¼:*‰*”(ViOQ‚4%ò¨xª‚â]ûy-ÇÀ#mÍšf²yñ—èØ¬P¼ç oû"IÕ(qé¸æÝ¹.ê$†¦I¼™>öåꘆÉÏ‹vã,’e+â(NüBÜù…ÌZà&Ëeiç×E»÷ñzaµãí8„dë./{‹%O_-/&Ï+1M?–íäpµp"4“ÝK¶òG¸/çŒýË×½šÞñ/¶ZÍAW¡"œK¦~JûÚa¤^õ8ï¦ýÁ®ˆ ‹ Ñ½/ñBd`Ù*{ÝžLy«®ÙB¾B:'Ó¸e5•<çD¾9·E‘cGŸø ‹YWŒ>œš•w Ÿ¼Òå°L}ûòØWª£šÀ]ädc‘ó(q˜dî/TËfº×Ëö}Þcl&ç±.ÿè/…áa§ûH¤xÝçaÛ®rÍ‚ùîàµÎ•yŠfYºÖªÓé¢êGvv¼¥Þ¤5žçõ¦EÙÎdRÊC:µæšofÔ¨QŒ¸å>>ým;úñ4_³ê¨4†Íf#4,«ÒC…Bñ/ÄzæoA#*½‰Ûeúo7óBŸš`µ†E¤ßÉ’™SyëÇõû"hÕÝŒ½º%6¼,˜x‹ÛÝHÚ/Óøn27>>‰~ö_xð‘·ØÙ™‡ž¸‹f±htùëçóÜôØ\z gÌ=‰«ðôÖ(ªuhËÖ÷§°¦× ´ˆ[D ‘¡éy+>eÊûsÙtÐCRÓK?îê„i  `ÓO¼øÒ{¬Íö“ܲ/ãî¿ †éÝÍgÝÇ'¬ô¾ë1FuK%gï|¸d/Õ=ÛùzÑf¢[\Ƹ1×Q+B°{þËLõ;™ù‚ŒóodÂèÞD ƒM_¼Æ—öV´Ú<“xè1b<£;—0í‘©üžÏõw?À€ÖÕÐþVÞ:…Ÿ7&¦I?î7œ†á" º•xoBhØÒûóÜŒ©´Hv XlvlHÖ|:‰¾XIqdƒÇ>ÂM£9¿dÿ2^˜8•ù)\1ê|6Õ*¯P(”§øÏ½ÅðúÜ9¬óž|‰”Ú4ýx|‰ ó8¾˜m/ aüì<öýõ+¯?ð]neD‹lÆ]?„cçÒfÄ=t*žÃ°‰‹pmùž;nå±q#‘ Ÿå©÷~ÇSaiêD7Nÿ´5|5oý1÷™»#—z}ocâ÷ÒüÐL®yø'L!pmû‰[GÊù|Íí#§q-'&‘šƒ¨˜h!!„„8°YÛ_Ä53 ¸rÜDîëÅäkGòC¾À®I>¦/‹é£na}òew¤~Î*¢î™«ºvå®;{S²|1û1ùkÉÈÖ¹²kCª5âŠ+z³uÕJòÝC—H´.<€%ß~Í>ýèà±õ®Å ŽéÄ%epýíÑ}Ç&C²fñlŠ:â‰[úÒ¼ikú @ýX¦ßMâ¥Syàò.tú—Ånå«>ìè8Ú âξ­‰¯N·Þ½8¸s>h}óh.i–F\ŽŒ}è"ö}ö1Ù€ÐÝØ»<Ì‹#/¢kÿAœ_SÇ:t·_Ò‰¾ƒ®¥‰e» |xö|Î×Û36üRãÓè>ò!äÌeÑö´ÁZì„gÎ䢿µ©S§6]¯`Þú?xòíÜ0å~ºÖJ¤~ïÜZg#ÏÍËÆô…&ðìšÅüœ–ÜûÀ š·º”§_¼†Ð/¦Ê[ …â_ˆõ¬¸ ià6ë0vê|rõXæ½>›&¿h+/»ŸŸ8ˆß» ‘T„4,Tkš|’0BlÕižØ,znä8w ›læ‘ÌEhH„¦‘Ñæ*Z :AÅzBÍ®ýhûÜm¼»|?4‚Çè,}ížønѱ‘„ËýÎŽÂé—d¤NTlZÀó¥Þ—i¡Z³Ôàuí$„šô˜`D&E–-sdLi¢QÈ7âå•>ã£px6czZâ¤!Hiœ|8 ‹-fi¡Ág·`³éxM'óO¶gnⵇÇ`7 ":õ¡¶C‡ãÅq7ý¸R/ã“×'Ó4ɰ†íœÏóF yÓîg«01¤ÀžÜ™ñ&>y¤Jå=°“AÀW¶Úݨm]wNV(JÿK¤ß…Öö^&\ÔžéÏÏEXâ@³Q´écæn¯ÃËßM£¡²?¿ŒA_›GÎ+…GeÙ „ Ò4BÂ’©Õ³?>~Y%~jY”€–ÎC›Óûé·IŒµ`Ñ,`,eâ´U\9ÿgF¤‡Àþ÷hÕsh1qØWG]+øW¹*ß§wtð, šËÁ¯™ôöa[û3—Ä«î¦öµÞà•D…7å •.&+Mì 餤I&¼û68öøJ›P%`qKLŒ=˜2’ˆô@» ïò`ÆÑ‡Zi–g‹¯Åsˆ" À™I¾!PO Å¿‘³gD„”€‹î}œÐ•°â` Ÿ%2 ÓÛŠrïC˰‡ÙŽˆÏÉ<¡Ñ¶ë¥¸gOä‘OW’“ŸÃ†_òî÷+(Ñ9îT‰ê—æj÷×LüÝGˆ°Äg-d{¶JøüÅ/8˜ëEhÙ©7žy/ðÜ׫ÈÍ?ÄŸ‹²»Ð² âÏqï[""Sˆ’9ì/ØÅ“þ€iÑ8îI¯aú«7„Þ ÷ÀGìÈÎcÿ¦%|ôÎ{lqžlŠ„Ä4Ë5z†tfüà8¦ÊìõYÞɼWŸæÓ:!–R_š1ˆ–%|ùs6àዠϲÇŠEå-…B¡DñŸÜ•¨ø8Bí;¬zOn¾³+±‘áXЉn0”úëŒlטöW}Éy¥zx 04.‘¸ÐÒG°›OXiil '1! Õâ*Þ}s {ÞI§]¹îñÏñ:b°U(¹í1‰$D•:ÏÕ÷Tb£ˆ @S^{wïhI“W±!µÍ›TÇ D6¿‚7^ÉÚçn¤SÇÜÿöR\;aGÝŸFx|1vÐìaÄÅD` j”ÅNl¸=¶73^½”ûÖ§y·‡I¼nõ“"Ñ{D4ñö#׊‰%Â|ÍFtL  h¡5¹ÿƒY´Þÿý»µçÂë&°Æ“BBØ ^-„Øøè`“5eS^Ú?ú=³F…3õêN´îzÓWø©§!­¡ÄÄDbÕL,aÜ÷âxÖ?u1-ÚôaE§ñ\’^öl …Bño☢kÜ}cåäg§’›sø?>ùÚbµ2göW :ìˆwXî7ŽÛ¼WæI/m–,k˜”Ù–Éñšó‚§Á9|¥¿]Ú,Yþ^¤)•†:‘HyâæÂÒÈê•¶\e‚Êú8>èèg­l›ã>k`Ÿ8Áï—»ƒÚ­’ãOñ÷ …¢”™ï¿C¿—£ ÉK³–“Ѹ%.?˜¦Ä0L Sâöú1Êm#ÁUœG÷†a´nPíÔÅNÓÈÎÊbê”g f¼ûþÁ¯@Qð3ðÙ>Å æi ÚñΫPŸp5Qé1•݇8n쯓 lj£®Ÿ°ŽrÌAâ$6;þOU~Ÿ¿§d·“Þñ)ÙE¡P(Î6Ô,k…B¡P(”(* …B¡DQ¡P( %Š …B¡P(QT( …B‰¢B¡P(ç°(V\ Mñß´o µS'>¤B¡P(Q<~!{ ;N ·"BìZñ5/|º§.þÑ5Îe‘;ÙN!$…Û—ñ⫟‘Ub=OQ çZ¦=:• %BMÜW(JO·DÒdÏ’ êÒœzéuiÒ±¿½|3´ ƒ?ÏAœâDòR5ÍÏÜÈÒu{ÖBÞОÇ{OóçBH 7þÌÍk‘‘QŒŒ j¥wà±ÿÀQóæíeéŠu8ýÇŠ¦ôbÉ/‹9äS¶U(ÿ>ÎøŠ6Ü5l ÷¿É”Þïüƒ?væQè/$77—ÜœÃhˆHBñRXâÆoH,¶P¢£#‚ëuJün'…N7R³à5@Ó~g.9¹¹äädSAHT4!VÕzŒù]d…teúÇÐ(ÁŽV¢’±!ñ: )vy15áQÑ„Û5«ÕLS÷PTXŒ×´ã0$𦩠ˆB¡P¢øOðd¯&+®=éN­ -¦Ý ïç—˜½ÇÅÞÏaäïI\6ú~Zm™ÁÃß®§ÄíÃå á’ñÓ¸¿W-Œ‚m¼úÐ8¾Úâ!6>H\­2ØñÁT¾=èCý†šÁ½Ó¢Sj„zëǨ¢‰tÄS¯qCê”3wÛw<øÈ ¶û1u­‡1ýÉk±Y izX<ã>ûh-Ž„jÔÊH¤ÐnS#¸ …ÅBxÍ^ôLü˜»ú_GçóÚѱÛE\Ò½1q=ïä¦ú¯ñÎÕïñé @I]œv+3®O#J€wùDÚMø”ë{=ÀáŸg2§ ¯}ö0õmûxù®ËùêÿØ;ïø(Š÷¿gï.—Kï!ô^z¯*E@Š( E@AT@QÅ‚Øé "Eš(éBï-ÒI/WvÜIÔïOÁy¿”ËíÞÎîÍÌ=Ÿ}fgž'ÕF¥ÑŸÑgé¢Þû™ñõö_CÆäÌ¢Ç9n=¯÷}OgÅ·4CßÀö‘1¿¸ˆÕO7˜ÐªŸìîÈ'n·bÆ*Xâ6óùì£ôž¹Š¾ÕœØ9­}w¹Ê:–H$RÚAÑÀàY‰÷¬áÄlÛ±Ù¯=ÁW5^gÁìaXTPÍ™€]M9ûy剎üv* Ed“œÝ€ëf±NS±þÂ| è)N½Öíøã˜ÙXT kv6`O /uÁž¢Åµ,{ö!ÌÛ€pñ§œí]åð°Æüö 3.Šý7 •Ý:Ⱥ°Žx¯´¬î @xϾ”^¼àNne‰D"‘¢XhkŒ'÷"ÔhÖ™Í:3üÕçèÙh8uÃ(àN†“ é8ЬQ+8ß§2ºäŸ©Ûpö´¸}®d¼ŠÎ EäJjTPj$Iž»ÕDx£æT °çª$é2éÁ|ul3]ó~-‹9‹«g/‘­茸UÒâ“íΈâbf1:=]pá·mÜHÍA(:ЇUà±ã$Û28µgIšp¤·’v3#¯*J ¼AQUÛ·>uhW:ŽIÖ‘­‚-›˜³Ç¹˜¦ÞN ¬ÙÀTº5EÒsðš}ÛÅõK8¯:É$ÉDzŠKÊæ}< 9½°™e£l‘´¬ìò|'rÞêKÛmé;âeFöæ“gžá·Ð@üœ®’aÅ" vË4Ûù!CzõÁßÛ…´(¢b6\hØ£13>ìDëùá¼÷í8ȉ6wË¡ÍLZj6õ¶ãˆ ý|"1oL¦{‡©˜ŒNèŒAôýü+šªfÒÓ3QUC@s^î½)Cº²¼¨?.ÎWk:fUÖ«D"‘¢øÐ¸µdòuÉʱ j è¸º»ch3Žõ)d[\=½p ŸAÄ‹X…“ÉÀï©x(€WY^úä[z¥gƒ¢ÇÉÉ€&t¸kàÑç;ÖwLǬêñòu‘-^žU;°â÷6¸zí<š&pkÇ'ß7 53U蜜q÷PÐéÊ‚9puÅD£~¨Ö% ‹ª`tuAË1cò”õ*‘HþÌ]ºýÆ\ÃtEsls¼ìEQ(\=¼q-h§Îˆ§ož¹.×Ç?×'oÿ)0˜Üñ3¹ß]†Á)†÷iƒ/oc®M·œ\=ñËß8Š3ž†\oõÎxù:çºÓ1Éj•H$kŠÈαà¬×cSTlª†¦€ªjØ4šª‘zÓúøŠ¢D"‘HþãΡ~® gíE§Óç@–¾¤™…ÉPQŠ¢D"‘H?T Bܲ©ŒÉÕNwïI‘boÜÀÃð¿ñ¥(J$‰äŸFÀbÓÐ[UTíþÓ×-¶ÿݲ/K"‘H$)ЉD"‘HQ”H$‰DŠ¢D"‘H$ÿ^QÌ·óï]˜i##%™L«ŒëöMPˆª5‡´ôLlDýÖT i)iXdD‰D"Eñ!Õ’ÁÑm[¹œhΓ¸ö¯s‘µ«óF¤´Î÷o KJ {_ÎòåËX¶l?/]Í‘ ¨÷h¸ý?Ó£ï»\H¹»n­77Эqg¶$˺•H$RÞŸËŠaöèQ¬;™qÛ¹§Çx·FÓòOÑ5áæå‰«N6òƒH¿¸‡FŽcý®#?~ŒcÇOs=)ƒ{ÝN(:'ÜÝ\P ÐLƒÑˆ›‡\"‘HQüS¾ NÎ& ·Ó*„¤^ÎKO7 L™rÔh֗呱¨B“|”wŸ†÷?xƒÆUËPµÙV_°9" \å»›V~“—rÓ,‡N ç- tEëòâko1fÌ»Œ}÷5ÚÖ*žl6M|:åJR®ÎLÝ]àñI§VÒ»I%JVnÇÇë1:ÉGÕ‰DŠâßJF¦+mGÌ`Ͼ]|÷BQ>3 )6„jáêÎíœ1µ`óÑs,`fò¨O‰ÖlÏ„èv¬Ý·Ž.Ù;ÙT 7#)@U 驤¦¦’–ž ìÿI^ÚU™[°ù‹ü<°7?]×0êît[æ&¼ø¦î38¸é#²¿Í.› ½¬w‰D"Eñ¯sk4°A#*:DZ}ë6âø¥œåtR&p*YƒnZ BÚô#8û4W¯mãËÍ&Þž3Š ¾ExrôËÔôsC“Îb!zcÜFF ìI×.]è6d ;Oî`ò/)´|º7ömåHZ MüOóõê ön#t‚¬ó‹Ù©5cøàø©Åûß½ŒV6òI®D"yù×…y³O¶ÉâoÆ0a—F‹z)bÈÀ’“E¶#áŸÁÙ€Þh7̪M ×i˜“opSHUÿ[ß,„““Ì)\T+ÙEÚ0mÖ$ª1"tFœo®d¬Õ@¨9‘„›6¬I‚Š/J“êndå8jU€%ñ2Š{0þŽÛ+Í¿Åt;PeÅK$)ŠZ J.§Õ|5ÎÑaìL†Ô„„=¬_¸5¯Àå~£©è|J(8u‹–kDeš)+Û¸m ÃèlÂdr¤ò ¥˜–BV¥gy¾¾>OÅÇísT¾ Æ¢•0dž"Îþ:PNcUä°µD"y$ùW ŸŠœÎÚÉöÛÙ¾};NÆàã­ðÇ®ó¤¦&°eÙì:’|{ÉFþ™¦šjÅâÁO+|ñÆ÷\ÏNcÏìùKNCÚæÂàHäé¨U @_ƒ÷‡Vá—¾ùvý!NFîdÞ‡£™Þ†QçhUùT7ZûeÁâHR3®0÷Ýoˆu6Êz—H$ÒSüS‚hp¥zxVþ1—/¶Ø²sépF¾9ý×Ó8Ô‰*µë0`TÁ®z'/ª×¯GQGÞ`ÑZõëàa…*VðÁ„wþüF*´iÇKÝŒøzJóü žÅ¨×°:žŽ4BÓД¼˜µE§0mά³ºR²zk*è"¼–Wƒ†âT”¡Ó&1å“I þ̓ºÏ}ɰ}‡ñ‘ùW$É#È]Š1zÔmüÄÉ$&ÄÿÍ‹éA§×³zårzõéçpP4{ÂÈ?ëßhZ®k´rñÀÏIòÖMÞ&Ðnu ‡0>¨Ú´‚:Q.ïSÖ»D"¹ æÏ¡}§ÎhšÆ®ÛðóóÇäâbϧxbcbðñõ%¸xHáÅNQˆ‹‰aò¤‰É³æÎïâØœ¤:^ãó?{?ÿ f^ƒ+î9d' sá› wvëÂÔš¸ÏYí‰äQC®²–H$‰DŠ¢D"‘H$R%‰D"‘¢(‘H$‰E‰D"‘H¤(J$‰D"EQò?"€uíž;ï“S"‘H¤(ÂÂæÛWÐîûeÉßÚíB#1r5/˜ÌåT5ï:E!°&ogH×Ù•"äúP‰D"Eñ¡KêEÞ¬¤Ç»HÁÁÁ‡ÒùÕÅdˆ‚ ¡ru÷<ÙÿSndj·£¯`Ñ¥§R¨&ÐHŽü•Î¥\,Lpp0AÕ3o/æ{ˆš-'“ÄĬ¥ÂPsHˆK G排H$ ÿŠ•ª8ã&ÿH¯OÐÀàì†=´©…«‘{8vù&:¯ jÖ­I€>‹+§Ž“gaÚ_ðó£EË*XcβÿÈ9Òm‚+Ö¤J¨:!E±-€µdwý1•Œ€‚³«;N@™}<{³“7jGPÚ×鮣­1Úsˆ9î„•±¢—ƒò‰DŠâ_¹ EŠ—Â×'ïæ«KÇðÜg'©Ýª6YǦñE©Á,žü$Ù©)˜³Tâbo`³ú“s˜‰¯¼Ct‘š”sKàÛ¯¿gàøit¬æ+³5MC3xRª¾Æ;›on™HÿI‘”‹¨€)é$ŸÏþƒ/¿—À;±àÐli,ÿ`s.Ó š/k¿?Äe:Y«‰DŠâŸ@œn`ÔÓùÀI Ýèñù6Þi|ž?\E¥‰Û™ÒÆâ×Ò¶þX¦éJ¿ÆM ŽNåùC(âleÏ÷oéß–Yã_¦˜S«§ eþŠM4¯Ô w=R„bÀõÚÚT߀A]±êLúú]6Ž[C½¯71º’ÈáûÎ ùhÓ0fÙkT( 9×V1g«Æ+˾ä‰`…+«Ðö“TYé‰DŠâŸõR,nåòÆ·t­éB‡O°b#9šÂGýìŸó¯KóbÉì:–B?ûqªM›™×.Q¦b[üÜt(¸R¶B5ÒWG“iÑðÐKëüà6°‘å×’Éãß¡¼ŸŠÑ“†ýLK¿Áñ'JñcZh*µLD qŒ*}e'^Õ©lßÔàiJ‹YØäȵD"‘¢ø'm²ÞDÑe)SÆýÎÆLŒZ6IÙ€ ›”,puÕ#ùŽ„  #™Ù‡s¢`µd‚ÎÔÃBߘhFoBË”§¬¿£K¤°¥0áøžuÏûñØ}ÇbtGQ-Øn9þ¶l¬é(J$’G’Ç”MCUmy·ù4ä™ò×™òñ/$Ùl\YûK«Ð+ ¡s"'.†T‹ Š3å*×äìïKÙy1œ¤“~Ÿ IDAT,]¼žÐŠ•q7 ¹d£Ðm b³Yï¼÷¨OŸz|0`'Íh–Nlþ•]±6 ÊíC0•é@©¬l9io¿½³¿áœ0¢HU”H$Rÿ *Ù˜­wäËþ—CæÍ¥Å…O¨S²4­Ç`ÈÌ©´ñ¯Êuiêµ§j—¦F‹ñh÷2ï<áÌ›íjQ¹î3 ~žQ½›à,䣭Âé¡…ŒŒ¬ÛCžö•,î<ûåb^ÜHϺe(U±/NÝ@€ÍBfV6ªjCïΨwÚóSŸÔŽhÁœ¬º”TÓ0Ë%‰ää.Í=j„6~âdâÿöÅ×:½žÕ+—Ó«O¿;Ö7×94M»}NíÖé]NeÛó§wH«Ìü^('=OÕi·:…¦¡"Q°Æ½n›Áé›ÙX®åUÉŸi¬èÌ}ÿ^yå† ÆKCßâçmç±Þ£òožÚÄØgr-ýîXn¶ÔýŒò‡ÒdÝJ$)Љ3^ÊfÏ\B’C(ÁÆÅýkY°;g½Óœ—ûGÀ)X(µ‡ð>µ{×4í± 6žž¿Ÿ¥tí¦´nÕŠ6mšR!ÄçžC(LÎý680¹˜»$‰ŇÂ.)e:¿‚ûÅߨsÅžeA³fqhçf*6mBQqš ½êìW„Rµ;3÷PB¨\Zÿ žëÏÏ6'¬T9zú”n^æýOP6¤8ÕÛd÷53BN{ZB¡nñÏaeë»=h2v&{ÔÂ?° ½¦¬#öøbž¯†hMÞ[z˜M 4±‘+é߬Å‹PµÍÖœÏqx¶î¡4mûí;t cû6T.éƒb½ÎO#;P>ÈŸ rõ½øÖ»šÑÆ•ÓiW¹8þ¡ ¹è:£Nþ²$‰ŇC i` hHëÐdöì>°¤]`ëîZ4)þOóƒÓ‹ì‰ºÂê!¼×íUvd(8uÄl=D‘!‹¸pñ “Úyµù~àìÕ(>Š¸ÆŒŸ~' ¯ŠÝùi×%âb#y»èrº¿¶ ÐãäjäÊ’ex¼ò g·NŲ|$ߎ¤ÿOØóÝsl˜9ŸóI,É'˜øö*¾µ†«×cXø¢;_¼ò&'²£^ º¬kìÞº‘ 6°qû>ÌY¬Þo´Þüq%žËÇrþÃÁ|uÆŠó-7Pè°¦åã׿ æ¸DŸü‘R[¿`¯Ù(=E‰DòHòBC8yR·U-ÞÛ±›´®UÉ>8—®õxšçùòæ¾6=GÐ}r3fíÉ`²Þ†G“nôªí¨XT¯Fy¦ª V=œô±dY!U<™1íM¾JR1¤0G®#†hælü;Žfpý`@GÍ’EñnMKzƒ{Ê»Er#S¥ØÅ¬=•IÄê/þ«MM&>æ*Ç.[¨TÁ𘈢‚’Íž?6rÞE‡âSŠ¢éÌÙ‚kí]|:bš²2Žðãºh6SnFÖ™¥œpiÉ÷]Êá ÿ*‹Ÿù ›ümI$)Šï-" T©Óý¼¥œMëÆùoVÔzAúýdO‚Ün}Ö"îp.Å ¾ &ãíg†šN.zTM4ûBÁr”W; ÂüÜd†?W—KŸ±î`UÁÝÏd/ZwЏÞ:—†**kJ,ž¥2èµ×°å ¯v% ˆþñéª ‹w†¾õ!Õ èÑ'¬ )Ç—Þ/£…› ‹bÈpŒ¾ÅÈ<¿ïvóÙÒÑ™Šâ~«æÜKà£Wå¬a‰D"EñÏâZ¾ ŠÎ`ÞÒ¯8ÈK3ÂÀ;•²Æ«ü~$‹uMq”×]©YÁõF!2Ø*z´k[Ø“X‘yC[Sˆ?EŠ­è=ŸÞ6ä·^U+.¡õqNÿ•T}õBªª¢ªŠî1^‡^ïèþ¨èË–K®ô뀦©¨6š¢'évý€1¤.Û¹’®yiW-º'áH$‰Å B)N϶ehüÊû¸¶ý‰N~5x÷µz¾ÚÉ[“þÇbë ã• :R®Z1[¬·µKSm˜-¶;ïmVÌ9ÙP¬)‚2{æzž MdégÑiþh€j5c¶ª·¯Âj1cUïX{‹ÙŒMµàZ¢ ƒêÿÌÔQ#¸Ü®&ú´\ËôäÙ¡ƒ(ãòxtM³a6[nߨ“—ç½±è<¶o\êAU+çž ìÕ)´GÅl± ª*Î!y¦êrfOýôƾ잱š }qé)J$’G’»¦ 6lPÿý–­Z“•™ù·/¾V…³§OQµz;Š#õ»w‰â ­ÎSÏu£‚ŸM¿Zmiªqíj"žÕÚ3zD7@qr¡Hp(åC‹â¤èœLyß] .Aé°ª4mTš¤3'ˆÊð¡}ÿ.T/[‰ªUJâêêIñ²¨PÔ Ppñð§lùryAðð ¢|ùÒxº¸R©IJ:§r#>‹1€ÚšS¹¸×c3™DÑ;ãT‚ŠCquRhhÜʵ䉈"¤\æf¶Žâ5›Ó¢F ÜÎø ¡\é`LN.Tª1g¸t#‡*Ý_¦mÅPÊW(ƒ‡^þÀ$ɽ9y˜rå+uõ ..® åþs@3ÒÓ1¹¸àáéYès !ÈHOg×®Ù‡ŽD.ql69Ž× Àv—Y=j„6~âdâÿvQÔéõ¬^¹œ^}úåñíº(ry.Ú­oq×P§CC ù^£ÀÜð¹>¤9þ¹Ïç=÷ p÷u?š^b¾ú»Ucš]ôõîQÃMýH$’ÿ æÏ¡}§ÎhšÆ®ÛðóóÇäâ‚Nwÿe]±11øøú\<¤ð¢¨(ÄÅÄ0yÒÄäYsçwqlNR¯q€ù_p/·á½Ÿ!½û³÷{/XHþsÝý¾ð×ý(rWýåÚ! ÕzwýH$’ÿ2 ¸D"‘H$R%‰D"‘¢(‘H$‰E‰D"‘H¤(J$‰D"EQ"‘H$)ŠFË›WñqÊ(‘H$’GY5 ÕfÅlÎ!''³ÅêîÍ_ ¦å½<©|Ý,”áë3¿üˆQGšjÃ’«Îÿ›ÞbϦjì³ÙÞ?Ìf¬V[¾6Õr…©“·7‰äQEGV‹´¨=|úJOZ6jL“& iÑñ¾üõÙ6íÎpM»§¼«È;Ê—K…#JKnŒ4yí#ºU4ä“Ђd5á¹ËÒiCœ|x9­¾Àá9ü>ùëC»÷Þ«MËç¡c»ÌMëñý9qw»:þÈŽ?Æôw_ä‰f iظ1Mš?EßQ_r4>3O[ßê+ö w÷—¡»û^Û¥ìJ$'ÿhDMÔ¬Ì=’ý/ðÝ/Ý(åaãÜæ9 ýhÎ¥~¦CÌ\~ÍhÇ€ŽåQKÚü°›úÏõ¥¬‡Æéµ3øqã ²ÝKѾß`š”0’tvkŽÇá›ržÍ‘QXÝ‚éülUôG sb+¿ž1òÜÓµÈHˆ!%[s˜U3kgòæãd»•â©Ñ´¤Ž#¿ÿH\@[ZÖ,FêáY|±Ë•>zRÂx~¢Ôà‘Ôózt;Ð9áîáŠNÉ+0i'60ÕVÎÇæàVŸþý;ìlãÀÊÄw¦]x1M#áüV2Óõéx9%±~Öw¬?GùfôÔ …Óë~f§g#ú×-äpxÍr·6§Â–Ù™˜Éù C9à]‰QŸ¡¤áNÿÀ–ÌOc†±ÒúÎOå li±Dî=†¢©h–8VÏ^@VÑ`NoÛ†¾Io*Ä"¬Ç ªz€šuŽgí ÑH[4Áõñ9°‚=qFêvL÷ÚEH»Éêí'q1'°ïÔUœK4¢_ß™þÅß°|Ï%4¿*túý„Wv®ayd¬£d §ÿXËÚ£q”lÛj^4ì:˜¡ƒž$@—·XbÖóãn~né"¸™Lx”¤qûöT)âŽfMä·Ï>àÛß®Òâ¹Á´/Á¯ q6ÝQˆù*«~ZÁ5\Øðy›á}òdfÄ‚h5éóFber(ϿЛbW¿ç©+HŽLêÂk‹ ²5u[éÿô(N:bºJoQ"‘žâßNfÔr| Pî g 7j•.BÒ²“>îE5Û«8™Eéªz¶ÏÞ@P›õã½>¿À «æÓ«„ J8É¿‡3q]23ýTDÅ.ŒìÕ’0O=žm›³êëƒÄ§?‰QËñÔY=ŠN¢è€£¼ûùyú®ÜN¯’*($¯‹`âú¦W¨DÜŠËdY.²þO>Yœk碉KZGråg©¡Ü¾ðÇ¢S؇ ¥ŸÆ0«Uh^ú&«{þÊIkkª†·A¬ÞÀ•„žxzưmý5êŒmƒ1c -Haà®Ét.*üQö-æ]ïIYƒ>—'jϘ¢nÁ¥ð1 -O…rz4Õ‚Ùl—“9Q{Iv+EX1ûÁi{GQ±ÕÒU…63¶°¨³áSŠöÝûÑ †7jú„ÈÏQ Óé€Ð,¸5{›ÁËe[g/O;ÂSýZ©Ö¼Ôµ%僌}¾?ßù¨K&Þùö&C÷~Dg´¬ÆµµùúOøº©é'J$Rÿ~WÕ`B³fa±åÒD ÛbC8pv)IÝZ.>tŠ%®1ë€?¿ ¸Å\µ%si@kVj*'çTÖ2±¨ßR¸t€ X¥êÏXËî˜LÚÛÖ°7« jzaŽB(t–«êMÎlÍ/·Ë ¡9„„aˆÙJì‰_Ù©4gTƒGïfݺK”îØƒ}¬ïqÑDÇ39§—}̨o6sÓ"pVR¸p)˜T+¸•©J÷¹l¼p“2Îß³-§6ßÕ5ÂÙÃDëËQ¯„£ ךDø'súRår 7Š{=&oJã× ×\èüõF¸¹€íÆíþáVk'/fÖ›Ã9¤Úóa:»»âWôV ­€ñ;ªUP¼VÉÛïÃ*´ò<8á⻋&_ÜD6 §wq>;ޝ{¶b–jCC`ò­IS-ð”ÖC"‘¢ø÷ãÚ ¿ø œºœEÕŠ&‡­L`ãÁó„¶Š Fª†G°xÛa'ÿÌÅŠ/ò”7îs–‰.‹62Ø?o™—6¨yÍ£OyÚ–Õ˜»åec@Wã*»äóŒÜ|pÎ4ÑcáF†ä»Èô›9Ý`Í`i<Æ%®³å•|ÄŽŸå±ÐD¡äM×bÞÏ»c×Ðø‡uŒªéI˨ßt‘ý;:…Щ~¯¬ÞIXü¼žXJyÏb¸Z6p-ª¹Är%UOegôB Úî$qÎ1gcÓn5’pxëàÕì+î·ß”蜜àf B3VqèdõÂÝzÜ}ñö0‘;CØí¶:ôh8ôEM%Ýb×`¡Óˆ;sõ&N>I#5.³MlÖLÒr®þÁ¸«¾Œ\³NƼéÿìŒe‰äñå}¦¨.é×Á“_zU‡.ã,‹Æ ã˳åù We@¡Lµ:x^ZÄð©'i6ìiœÜš3ªƒÆGFðÇ•T²R®±yÞ—üz͆Q—ß_p¥M§ZDý8–w–fÐü¹fyï485edÁG^gëå²R¢Ù2ÿKVEiàVœ:EÍÌüñ2áOWÁ3¨(ÖóÛØ¯Ô¡MñüþÈ£(ˆ€%˜èkDGGCZª½–C*€õß.árLæí*wj‹ë–O³ÁçúT²o.Ò‰þ•ÏñÉ[KˆÍLâ÷wG²É³;ÏVÐSª´?—ÝL@ôÖmÙA èÝq×nrõòuT@(œŒFŒF'ôt^õxy`E¾Ô—é¿äZl,—mbËžcdåU)û•C(ë•ıÃöç—ë&Là¤bB'gb~ƒY‡“H?»ŒwÅÓåÅœ¬–ã+™¸p©™ ¬™=…Ø¢å)^óyF4åíîã9›AFÂ~›ý[âø/á‘H¤(þOm±0¸ÓuÌ\&tÒñq¦ToÅ—'C™³h‚\ÑCÉ*„Ñs^´`h37ìË!ô´ž¶™¯ÛD3´QiJVjƸßãñwW@(èuŠÃhÙ¥KÃNÔÍ>ÃE·Nt¯œ«ôztÂî!´ú|ßµ»Á+MÊP²RÞ[‡¿»Ü©[)ÍPÎ5ŒàL)ß`Š4jI˜€G}Æ…Ð9Ὶ>O5"""‚:5«Òè£c¼3µ7»ž ¥TÕfün $ØûŽ´¤w¨…ôÚ¯ÒÉïV=û0øçÕ4¿2šÅ+0j_e­OI h·‘¼UnµŠ—¢á°…xVh‚—^½µfÙà*xõà`N~ÖHóa3˜ûFUVŽéNÝZµhñü$Ü»Nâë.UP(z=Šc8Vè|é9f8ß§dÙFl,÷" ÝmØ[¶J¥—úsæpŠ7KàÈyŒoàNfŽ¢-ÛQúØ*—©Î‡Kóáû/㯘è9#Jn£{­PÂj¶çë}V<¤áHWîºÙ=j„6~âdâÿö¬é:½žÕ+—Ó«O¿Â CÝ^–;a­†¦ …Ï OþsPî­É%w——?ƒ¼ã¼¹Ëz„½†‡_Yàxêk;è&Ï£MÞÆäºÎGM+°Ïܯï>¿£}E!úGç¹wŸÍfIÏÌjûëûä¹€ØC?3lÚ&Ìú„RN…)/ŸH$†óçоSg4Mc׎møùùcrqÉû(§bcbðñõ%¸xHáÅNQˆ‹‰aò¤‰É³æÎïâØœŽ}rI:˜ÿñˆ6÷†¾_äÕq!ní+¤7šÿ”+îYžÈgü (ëQ¾+zØ‹× æä:Ft|­ÅŸcd„³}£¸·Hܯï>¤€vyˆ¾t?,i¤eçÜý•lf232ÈJW Yž‚(‘<¦èeH¯â58~¯—"PüoóŸÀ‰§¾þnwíñ«Òžo§µ"ÀS D"EQ"yH×ÒÙÝŸòUü í¡ý;Pð,v÷B !Л<),—XH$™:J"‘H$)ЉD"‘HQ”H$‰DŠ¢D"‘H$ÿqQÔþD¾<‰D"‘HQüw)ÖýD+_¢Úû%}B#åü^æ.ÙDJކ-;Ž5óær<Á&ךÐÚ?xò‚ÚûA }å}D"y|DQ¬Ñ|٭ᄇסQÛî¼7kI–ûä¬!,¬{µ/¯NzàoKz"¯Æ`V¶ì6.^ÄéDiMoÝ4¤Ù°?äL‚ùÿ7¨9Wù|p?V](ø&ÅÞ¶6ÎnšÉÀŽÍˆˆˆ Q«n|ðý6næ¨ù"ɉDò×øÇ×)j¶¢butù]«‰=½›S†Ð|ÏküþåMMMUo‡fS!lܼr–KI9àÈŠ „†ªÞ2ˆE±GGñ­ÖŽª,fÐéîäÛÓTUË}ŒòŸK¨nËJåÊ¥h²¬j>/L½»>US¡„¦¡¡¡j Å.NyÚÊÞšª¡"Ð)ÂÑ^Í–Í‹ñʲ¡©Äú·G޳qdákôw”gßy‹aµC0Çž`Éì¹üV=Œg«Cµ© šfÅb8ö6Ö4 UUQšj³‡äsxŸBØ¿Žïy'Œí­ë¶G&P5õ¶à E±ÇY}4"H$’GÊS¼e|õ&Š£tÙŠ4èПùK¤Ò‘YÌ>š…k¾ W›FÔ¯[›&OõfîÞ8®¯šÂ·§R9=¥ õ=ÍÌ­ç¸ðÓX:¶iLxxu›õböÞ¢7}G›^㸖®åûê‰,{§ õë†Aó^Ÿ%ûÄm¢–|HçvM¯KݦÝùn{š–ÃÏ£[1ð³Mئ©^<š'O#Î ‡¾§wóêÔ¬Exã.|¹ý`aÍ[]iùÍ>GÉüøZ7žÿù({ÇôaÑ©ËLíß„ð¦#9aÉå%jz$ÓÆ¯ç…o–0¶wªV¬@íf]™øã\ž­„šu’—«§ã‹ÃèØ´1ý¦/¥_ƒ†,¹n/CMYO‡mùà ??S•ÊýÆðJ¯ö4oÒ˜NoþÀu³FüÁEtlÒ„ýûÐቖ4ïЗ÷Þ@ÒέaÔ3­hQ‹ˆFm5ÿ°ý{ßkC"‘HQüëªh÷.n{~åhTÍ› â°&ìâËéÛèñÝVöî?ÌŠ›°îã±Üìð6#«xRiÌ&vm_É æeñ©Ý‹™«wrðàÖ¾]‚©,"^oÄÍÕ”+; S zãægñ鎃8°—EwÃ[ö‰Û¸×èÁ·¿ìààÁý¬ÿ  Ó',ä†p¦Aûî$ßILš†¦fp`Ó^ê¶îHýYƃx~{"²ddq>á5v™pquÃÝx'ȯÑ䊳MPÊ úV)Å;Kv³Û*;彆œKk9êT…úuìA¼³/¯`̈ьó!‹Æ#„¡:Q¬fo~ݾ›Ÿú…¡]qrôl! ¸y¸¡Œž®¤_pâµEkùcÇêþŒË®cr5’«RwðTÖ¬ÛÂܗʳøË™D§_fê wPúÿÈžG8°ö]'¿ÈÌ wD["‘HQüÀ€›³‘œt©gWòÛîý¼÷l#Âë„óÄ /Ùu…KQd« f¥Ý>ÊÇã_hCíZuxêíåÄEî!ÊF^1¼… iLó"GÙeŸ-ø}h Ü…öŸ&uëû{{Æ2sp;jתCÛ‘ ˆ>¼—(3W '(ó$‡®§aKØÂï§|hܼ\YËú„ª ê['t„==Œvƽ¬=–…N—¯„ãÿœtrl*ÙVnnDå*µ¨Q¹!l‹AÍHDsrÇÕ!–z÷’Ô©S–¸ýkXyýƒ‰hXÓîYrïç˪ÙFh×Þ„DÏ'‹±gÙA2¯õhTÆÇ¾§JS2cˆ>´œ¥§“X3¶3ááD´Éö§Ù}ð¦´ÉcÊ¿.ö©°Ýär| EûBvaðÓŠ±ÍóI3KÔÜâuŽWÚ!ú…ïÙò}î ‹¨×|Ö{Z~+è«ðùÞ“ìZµ€ó_§âÕY}d¦ÿv§°Ox¹Ä¨Î/qö™élšÝÏ”•4m¹«ø–£UY'î¹BÕÌ/H,ÿ |€›9¨Š‘;¡Îz ‹U½ëñ›ª<«Ô£ÞXV,ËDCÁ+8§¸ª˜2~âZ"Ô ½o :ö(Aì®Õìp”©ètåvÊâRÓìÏ;o^(Zž[BÍlAC‡öû${j0@S±å¤b5Tgö¾_©§pã  K$ÒSü_¡ÚlØl2S8ºf .yÓ7ÂçR-1Åìdóá$¬ª†5;¸ØxTô8;id¥fØ H=Ïñäâôí»7ö"6=ç¾i©È‰çzŠ]‡ñͯKh¯ìbá)ÛÔ=T±Z,˜ÍfÌ’Ïsüf }^h€§âEr#9ËQŸ.´íP‡k?ËøéQ4Ð #@HSj±|k"éG—³)%Œú\ññ0‘r9@v<®\¬  XÈɶ?LÔ¹Q¦lÊ– #À ÁíèšÈ’Y+¸z3³Å‚5=…äÔ4¬yô:O|²HJ°—ô.çØ'Ý(… ¿®!ʨ×ùuC4¥›WÁUSI:~”#bQ5Q§÷sCxQ´Z{xeö’ X4 ÕšMâõ«$™.¥•D"‘žâÃXc,±‘Ì™ø:{2ÓÓIÍ´yûÚ†¸`PŸ`ij0mL?¶„E±Xð(ÝWG÷%¼s3R¦¼Ê‹çjÐ¥w'vrç‹Á¯s¤¼9×OžªaÕ@³šÉÈÊFÕìÆ?+= :¸±–wßÚŒÞË %ëQUŸebYÝO5Ëåõ|0òe|]th6þÛХ߼ô'*úbŽ9HJjÎmÏÛñ4OZ›ó™x†ƒuufˆà½:3ìýçyaA ‰ç.P÷í)tðõ‰”>“—ÞÜGˆ›ýçÑÛ¬`ð£F ¾y ÂðÖ¤!”Ôß¾0„>?dÜûÓ6`Þ^î“IŠ-Œ.U‹¡iñd¦§cvLœƒhîó IDATÆ<ñT¦Œ•*¡èÒÎcÕ²íý@3àãv” ¯¾DfÂ%Ξâó~e°\:†W «§ÄÎù¢ÎGQoà‚ªóÁçCyeü z¯/…§AÅbó¡×ĉ4÷‘ÆC"y,GÊòo=j„6~âdâÿöÅí:½žÕ+—Ó«O¿;Ù–CÌùÓÄe;Œ Á/¿@Šx¡wœ^µdpýÊÓÍ wƧH1Šú{ ·¦pùÜ’²K†QĘƅ 7ÈFüüÝH¿i£x¹8e$uÓJp±ôäpýÊu\ƒJᥤpõr473rÐgüЇìíü€ î$bËJ#êò%RÌwDÒàLi¸zù:™8áãëNVª 2%pU2™Ñ>‚¥×°~@ˆ}²”-‡˜K‰IÉÁàîOh© \ÉÑ—¸Ÿ“›nÀ#€âÞÎd§ÜàÒ•X²TÊU s”Ÿ÷³Sb¹O†EEèœñ ,F1_w„–Íõ‹Q˜‚Kãã,@kÎM._¸J†Í ßà@lI)-]Œ_zÖgf«…,l–ÕT_p)B|‰=ø3¯~±Ÿáo¼ˆÉ’‰ÁÝ’%‚pѨ܌¾Èµ„4lpó 88g Q"ùË,˜?‡ö:£i»vlÃÏÏ“‹ :Ýý“ؘ||} .Rx±Sâbb˜ÊÕTµÐ±/s ¿-û†Õœ@äž½ì?p€ƒ‡ŽpäðAØÏ¾½¸”u—pÙ2Ž1¨^8óOþ»Äí]H‡gFp&Ôì ŒhX‹™‘Vùë“H$RïŒkLéNŸr!ÕbKß~ŽúµZ0ã²ý2+öÇ·}«xxÃ?Z@¶NÜWîhÐ-Óãìî…›Éx—7t/½Ò¹•`ègSi¢l,éÓ’ÏŽ*…Â;šòïLGeK?˯¾fÆìY|úb;uz“ïæÌâ»ïæ±'ÎV€êpq÷ÀŤ®5PôN¸¹šÐ è0¹»cÔßß;• |%ÉRAÁ-¬U2Îòë…dROFrѹ(•Š:’Åj\Ýø#_m¸æX~žüG6Ï¢EDmšwþŒèÔ«Ìz«MÕ§qËî|õûYlB Dóúwàséײ6¦íBÑkÄZÈKR¯mϱ{}Î,Ÿ@×fõ¨×¼/Ä¢šǯ³fr2NMèÎ×ømhªÕyŽõWÒ@M`Ñ»ÏÑ´n-šwƒõÑ „óÇñÊì¥|5ä)tx‘uç-ÿºáB Ð{×åù³™þíw¼÷Ti¼ªôã«o¦óùÈœþ¬õë7 ÅÓCYu4î¶Pé3G—M¢Sóú4{f£Y#„•=Ó_§]ƒ:4hû<³÷ÅxÐíÀM–ëC³ºµhÚõuÖ^µ{áhR%ÉRÁf,NÏ>,_p°y˜¢•ªèn¸mPÓ£Ïsòz8áéWß&¼õVmÞÇæå¯ã‘”J@­žLÿq)߼ݒ†³øp&`ãzän~[u–WÞDz—kaÍLaû²M<5~!_ö¼ß¡ë2 nù›<óåUzOYÀÂI}ˆœ2‚é‡âQÔl®ž9M\¢J…ÑsæÌSS¶¹ÿGZ—0±vX ¾‰kÂ×KWñIëD†·~HtX“£Xýö²ûÌgç/ßÒ¼„þ_çý@ƒÁ€è: @N*Téü?-YÈ{=˜øÎDN&؇<3/eý1ïÍYÄ[áçÙ{'S“;ñürWÞž·‚9¯WgzïXFå^gר8¼9“.EðÅÏ«˜Ô!‹×[õfE>o”H$ÿYQÔ°Ye:wÄoÛ\Ö'¦qòð)*׬‹I)ŒŒÜKV¤Yã*˜“b°xU§iM#gŽŸÂ`¢Þs£¨ê­ Ó@çBƒ^ïóD¥âÔî;1O±pÞnæ­9Eþ]SRHu.ÅSÕôü¸þ"â~C´7WðÉ*=ú7EKˆÇ½aÚ›6ðÃÎ,tj6®Æ1²®/ƒ‚xD¼ ð¯×œ•ý¹—€wùº”Õ]åDlŠ]Ê|Êѧÿj” ¡õÈét0dǺ|´0‘n#»á—µd3z”8ôÕ1 t3Eé«·Lϳƒ[¡$ÆãZ·Ý71gK¶üeJ$’„G˜7ÕŠÕ¿5ÃëN惉³©Âµ‹±ün€ÊC+ûéBD`E<ôœ?B©ª9öéœð v¿mî"a·2?è(SÞ›gO—“JÂþßYrÁ„èêÑ«V¬Ú} ôã\·Ù8õÛbâlfTMàÕsEmäXaù’î="Þ8±| c§X‰`|霺I¶ÍþŒÑÙà {ÚMu%$ØDÒ¹cÄh6Œ[—±X§bÓÀШ/½Ëȱi·_ÌIn¨gÖ-&ÉQ®ÝGQ?X•¿L‰DòEÀ’ãL‹á]X}"EÇ­'ÔM½ïÃ(!ŠP@Ë!rûtµz1iäÓ¸+6–¼Ùš}¹æˆäžõ©Ú,Ä^ˆ‡¦Á€ó§“ñlW¿½:’[½Ê¸Žys™SNßåG):‡çXžVS÷å1ôòËý+ÛmšîÑ|.&ˆeåÊÔ4‰Ñ-Ë"2Ï||˜=I3šNR|:”÷D(\Î"¸[Eü-Ùv{Ÿ÷óe¡ŠÛ¯ìŽ”%@µPkÐúåË õ8,y‘H$ÿšÅûš5 Ê 'òÚ æ¼ZlÖ{j¢»§Ö˧9u5šäÔlÜ}|¹KŽ Ïá‹908Ý#I¥5“]?ã÷SÑú~0/K> è×¹ÛGôaêºã\>ÏúÙ“™y0½’ÛŠ{RÎîØKBZªOWÞí˜ÍÇϾÉÖÓ׸zj7ó'|ÀÖd=†G:,‚+E<"Ï&6Ž®ÏoÄ¡(ˆ¤3|?÷;"¯^cÃgƒX•]ƒmÚ0ö…æ=Ó•÷^äú•ã,ýì=~8o)8%“jÎŒë¦2¡ûkl<EÔ™½|?þ=~‹¥ÐK^$‰ä±ò…ÎHP™2ø¸*€woGúW› ¥*•'бzÂ50”r¯êÍØz+ãúuBödÑ‘t>ö Ï´ù¿ÒÍèþA? žF@G`ÙJ¸¸‰Û_·XÕz<Ó°)ËFv%Ò\Žwù…vn@§ ¬5NãÝÉY˜n °\^meÅ™ °Òx9k€ŽVçס¯Ódy9¦.ÿ–'¿ÝAöÇ#ù¨ßÓ¤éýo÷­¼ ¡HIÊ\©Îà\´,•ü±áÆ€·ßàê¨q4Y®P9¼Oz ?gåÚv¦T1½»’â[Ÿ‰ßF%¼¾Š_ýßåƒQÝ™fu£t޼鯋¡%‹aÔŠÅJ—ÅÇÙî“¶úb'ŸMɧ;“¢øR«õó¼é#˜‰äÒ¤üF¡Ÿ8™Ä„ø¿} N¯gõÊåôêÓÏá|åhs+zJÞ¡3 M»áæa†Õr_p¤œïËÿ¹ÂFq¹UµÆ0 æ¨+Q`»ª„BÖaáê3ßõH$’Ç’óçоSg4Mc׎møùùcrqA§ÓÝ÷¸Ø˜||} .Rx±Sâbb˜gÏ7C(â¢)ü4²?£çáå=çy³ ˜üƒ&@ãÚæY _šÆW“_¥¨KaF€^"¢&)í!u댆„àaÔÉ|Ù<œ+ïer3燻ÈÁ̓Ëxþm|úÃdÊ»ÅóI“òL‹òÀ(T Þ¡4ë2·^}ž²>ú‹þŸnäc¿ñR÷gÙ’ìŠ"À¬ùòâÇ3xï…º8pŒ%=‘s¢È¶Þ]š5™³'Î’j•?t‰DRxÒÒÒ4ø%ŒÎÎhš†¦ªhªŠŠ†ÕbEÓTûvMãıã˜ÍæÇPofWnnßÎþ¸çyª¤êõã츃‚Α€]P¬Qgúàš™„諤&esòX$ ”-ãGòµËÄ¥f£)Îø• ÐÛ•¸óçÈtóÁ’ƒÕÇ¡¬‰DM Éb¢Xhþ.vÙÉJ¼Æ•ë‰ä`À§X ‚}]Ñ9ùѲg/LþKìÿ±wÖñVkÿ®ØuºàÐÝHIƒ è”’P@D^1@P±;/**Ø\P¯Š"â50ðH(¢(‚€ÒÒúp:v¬˜yÿXû®AXë÷ù,8{ïµÖÌü&žyžyfž-ìZdïXˆ*ÉÔhÔ€d¿$k÷äÁ—DíõHòJŠí!“XE‡8Ö©]¯©±ª£ÛJ‰( 9$Û”Ûž‹+ψ#kû*f?=‰ þo3ïÎz)Þ“_¤(} ³ÿ3‰–U¼HE#.1/Pxp'™ùØZ éuë“wt“±#ùdìÌ ß –(P]‹© .~‹,PU¤”ÛFmÛa‰D°…@F¿GBÄyNŽ)ê÷Š”ÔÓšæµEô¿²[Öü€Ö -M’–!¢7­yòj®Qnfõ?[±mõ ìV™÷Î$WíÁ¸‘õxkÚ³l z±òQמ{&ßE›´l¦ìÈ[_Åyµ5âz\€j‡Xþúd¦$[dïXGný+xù_c¨¶s!÷Þ7“Cž8²€vî™r7íÛy`äÕô˜ù=×}Æš|‹à’·xeKFßq5…‹§rÛ ?W= #kV‹ñüûÁ Xóüm\õ¹ ×Føk1dtý¨P¬¬!èÄ&¥’’šDJj_|©!…/á…oÇòL¿†'][DJ¤7™MêQ=PöuÑêW˜8écdZ2Zð‡ú0mÚ5$(e )‚,xê:žü"HÝUQí"é^׃˅ ¿ª¦¡( B'bŽ¢àÑuÌègP8Yùþš¢Ä1ôÙi/¿Ãî+îfí«hÞöl¼ÿMé]š?†8E5‰nƒ†ÓÔ(à¾Gn Ív$̸Éÿ&ƧE̺çræ/ÝJ›!Iøâ¨Óz8“îê‚Îa&?$ˆ¯ÕŸÉö!¶` ·œuÓüƒÖ‹fx³/j >¹ãž^°ƒ7†hââÐLAõ nbÀÓ³ØuÕT¦öTÁ^Å•÷}Êyï-㲺۸«ËP^=€ž±^,oK®›t;u½QÁ5ŸVÊ‚(ÿ ÄÔ ÃiÕx~íAè×ðä&®zˆÙÿ>÷þ‘]AKoɽÞÄ’;_¡æñP× €ýÿÁÃ_^Ê3iJ‰4Ç80Ÿïbìë󸨉ÎúY£ºNºg—ºpáâ·i‹ŠÂþýûAJÒÒœ@µš¦±nÝ:Ô¯ªžÜ)÷bB/m ›a ÓæóÄâµlØhÒ¶ksôcÌlËBØ6¦áÕ8È[÷]H“:µ¨Y³ 7¿°¢`.  êwm•þÕ åÙg¨ íxF,›}Íúœ¼;ñ\jÖ¬IÍšµ¹ü…ùqC&v[ ‰-Á¶¢¶ì‹X’±;»ÕŒ>w&¯î/ààÎ\„-©uV7G :5ý+„›‚®jÃ:U@8¹37ÝÿO>ù$OÜ <›X™s™6–­9“–mdËúLd4Ȳ¢AhÇçä%u¤[? Ó´ïHa`K·s»páâ·!##ƒ’‘‘ªªÌû.wÝu÷I[GüƒiŠŽ‘u¸r|SZŒ¿Žîý'r_mRþ¯ÙDôi²lîS¼¾¿Ÿn|†q0ÿñá|¶JoTuµBZ–a—~4"6Z‚N¤0‘;neâic šù›ŽÒlK=£4•@lWæîú€¶Å6_-—¨>­’LËŸ‡€™Ã–½ÙÔë”^¦=ždþ¥¿ -Ú´§U•h“ÈÛH¤°Ó¶.ahLÅÛ­X]BŠæEUd¹üKÜèÀ.\¸øíѤG<ðÀôí×fÍšqøðažn±±±Ø¶ý××D$Bâ€Û¸õÂ0tÔ 4ŒcŠ¯Çƒ‘›CÈvàâÂBj·lMÃ8 {¾û#B¯<—0ƒ|ÿÁ;ì3 ¸ó}^üÜ¢ã s9¯u˜þ¨Í•Ýj– ʓ޶]N3MêÌ…­sxø–7Ø]hUÌÎU_³6ǦdŽ!÷£Vñ ¾Ýá|·áWØ*}h®`táÂÅoD8bÈ!<ýôÓƒAž}ö4hp̽‹-MQ ‚…D,<§qÃ#§E•-“¢ü|ÂÑI*¦Pqíª-;ÐÑ3‹açt"©ÎÅ̘úÄ^g÷yŽÔ´ÚèÕkc€ ”ŸGÐ,çé ¢j[˜Ø· [Yt¸æßLèDlÓ‡™8é>Æ÷úñ'6äòÇŸ¥uŒM°°Ö@€³Ædú=½8íÉŽ<ýÞ î|i÷Ýy}Þ !´ê¶êÃý3z`‡Š(°+7 Û ° KF5×ý+™rm_æ$*-–Ú-ºpûSwÒ³vü©Ù«hc‹RÅEIåŠi/’{Çý ;k*¶ ©Z;nx¾+µlƒ¢â BØxR{pãµ_rÿ˜3y)¾ u[Ô¦ªµ¨eÛ… .~=…`q1}z÷¦]Û6ÄÅÅU0žÌ!ñ¨WßqëÍò‘)“uø„Æš®óÑïqÉÿ]^AKB ¨*j…£R$¶m£h:ª"£ûUT4U‰niˆèFMS‘ÂFHJ×îEEUAØ6RÕТ¦KaÛHE!(¨ZIºÑ4„t4TEq6‘B…üI)v¹g£¿‹è FQTTMa—巢ЖY–.KÛ¦¼ )IKQ”“o:="?Šâð+£‡&ˆ('NÙ”hž%B€ª:\Kd”'ïH‰ªj®³ .þ'æÌšÉ€ACxï½w0p ÎVŒèö !lÂá0¢dߢlܸø„š4iúË…ª’yð O’÷Ò+³†F¿. ¢ÿgÆïn>UMÓ* ĨPÒt=ºçMAQµ2£(¨š†®ëèºãº«jºóYÓœ÷©ŽÛ®ªéQHÙgUE‹>«–ûMQµè÷Î{JSùü)ÊÏVÈ‹Ž¦9‚´B~˜‡(ŠŠu9Vµ$Í’w”;ÑáäË•Šù)á·$uU-_¶’<«N9£å/ã$Ê­æ D.\üš©9¤$'óå‹B ªj¥—¢ª„B!2vï&àœ”¼œRó©„ÃaÖýøCÅõ+.\¸pñ·‚¦é„ÃaÀÙQеû|õå-üŒ@ ÆÑ ¥DJeYȨÅÊ0 4jD­ÚµÿüBѲ,zžÕ !àq[… .\üÑó¬^X–”MUé~Frrr0Mãu*ú—~ŸŸ¤ädgyé$ø\œR¡(¥$5­ŠÛ\¸páÂET.ˆRçñxHOOÿÅòäd8!žÒ5E7Œ .\¸¨L.üZùp²ä‰{D¥ .\¸pñ{ ÅS±ùòïŒÿůËý©çÝåÜ…‹?—9å›÷KlǶm—‚íâÍp4MÓ+µµ—|'lÛ€;XŸ ¦©¨ªV)ïn{wáâÄö75ºíëd­)žr¡(¥$';› ëב““ãVò ‚¦éT¯^ÓZ·Áï÷W:1M“M7’±{¦i¹{ ¿‡ðûiа! 5BÓ´JÛ{~~>Ö­ãpÖap5G.~3|^uëÕ£I³fèúÉ_§\(F"¶lÙB³-hÖ¼¥[Ë'¦a°ôË/ظ~íÚ·GQ޶ŒoÛ²…`(Èð‘—àóù]ÒNr²³øjé—gßÔ3 ˲زy3µëÖeÀ Á.a.\ òYòùbvïÜIÃFNÊyo§\(š†a4kÞYcÐUYŽGóV×Ë™½Îá¥çgЪM[<žŠBQU6mÚÈ¥—ÁçóG÷ŠºÁÇË{Jj­Z·aóÆ Ô¬Uë(>…m“Åyýú»íÝ…‹ãìo ‰téÖ//¢~ÆGŸ„ögŠŽù¨\¨¡R¨“Bè%üI)Ñuˆa eekWŽùÔçó»ó æÝç÷cZæ1[¡]n-ÑåÝ…‹ãëo@ †iž´¥ˆß5J†8†ã¢()œBKá̰…´#+Œ0CØVÛ “RO õ‚àï…ÊÖ´þ`ÛvéQKRùeÎÈJtbãõzOš]ÿO6=®öîâ÷eq}ÍþâýíO)+›9K) çc‡²ÐdE˜(ºEšÜ‹*FÕ<èXèf>Ä%@LŠÙöWó®ª*ß}÷ï½;O|Uò}5RùÙÁ$Ñ<„™»‡Þ}ΣwïÞãhï.N…ü‹°êã9|Ûƒ Âsy~ÇYÜsmw¼î$ÅÅM(V:@HI0ï±ÖN¤¢a{ÓQ%˜¡bröí#PôÔ4"b Är<–Hé¸êN¬?è`¸yófrsrQE Y@Õ~vˆ9¸w7;W}NÍZµéÝ»÷ŠwÐp"r l›Säa«üööþGk·hÑÙ'š?‰”Ž1ÃÆ¶•Sêý¬é<ºŠªùð{µc”÷ï°¬ QT-ÚbÇ7/H©¢iÊ_Š¿ßE(–(•iBJ,¡& O•*-‘ÂfoÞn~Èй¹†‚-l,ËBšW˫Ԛ¦9ñ§l©QJPu UÚX¶‚®›¼Ù§>Sû~êëëF÷þQ¬yß¾s'=ϬÇ#×_€×ëûŸÏªªÂôéûؾJ)݃Wr©º~ôiÒÆ:i¥$ž¦Sß¶T‘‘­Ütæ Ìøž‰¼œ Ú©¦\þ>)%Šª;²°±Äa@QQ¬Í\Óyõ_ÚÀ-íµÈŸ†¦m`x•shôåAnacÛ§BÈ+èZ€¶½GršTP¸žÛQñ Ulåú¶ÿ íß[¸·‹Û>³lgÂ,lûw°à*äoÿŒ+¯šÁ¸WærN-õ¸Ú‹¦bR»ÖäMÙÁ“çÆœþN¶eêwÌ›eYøªS³ jl5Là 3ó0{÷îcß,¤°AZ -„m"íò’OÁ,ØÊ¥u«ñèü,PX‡šê œš!Eã:šœt"Í«*šª:÷kGÆB,{^SË=½Ï‰§hójG/Mž9€®«€JËKnäªÎ Îà-)[XïÑ©\UÓJ7¤ªÑôJóÏxdzNŒGŽ{]DQ²²²ˆDÂxt ]]­üÒx4µ”ƒ ³+]çó¡UQII‰$&&çUé>mWiœÅÒ4Õhù%Ñú)Ç‹BTÈFë¤ôûÊøÒQÌ­ŒiT“§~èš‚ª'Ñ窫éT]+µ"(ªV¡þØÔë»b»8vý”½CWgÖt¼w.BQÎzjgtm¶,=%ü¹¤í)N*k‡ÑvQáÝÑ8—”NT¢y/i??˧‚ªH,Ã@ ‚¢•ÆÆtÞ¬ô•#8R+päpí߆Aé¸YŽoM- W}4ßÇnG¦¯•ö!'mÝZËàD7/áÑUE¥hÇ"Ϊ×÷Ö•æI Fù²òþšôÊ·±’@è•?¯P°sçwü ÷)Ѹ¤åx(ׯUC+—µÜ;ŽÅ·,åÛiÃNýËŠËpR`™fÅþQžõè±çÈþR6ÆÐsìÍô®¯;e>‚‹(?ÛßJÓÿcÂßÂ|ZYA5MCAA~¡`øØXTU-s¶‘6a›X¶ ¶qÄ»bâðé*šZÌW3_!«y†QIt IDAT7 —J†Ú˜!c†SuÏ|f¿ÿ-ví³¸lÔÙ¤i;–|È7ZMÒ¶}ÅŠý º bXÏF¨€‘»…ÿ¾=Í™&5Ú÷aØÀŽ$fÍ^d]ÝÎÄ­ù”uÙÅüpØCáÂ'™TXƒÎý‡P7%Ô€4]åàêOx{þ÷äOÛs‡Ò÷ôÚÈðA¾?39™ŸV®ÄÖ\Ó)ÂÇo¾ÍêŒ|âëueèðó¨óÛ/±®þ$ÿø_VðÐaÐh¶JÆÇǽ¦ªÑ`Á ¨ÊÿžBU¢Í”¼Józð÷{‹½ïƒYd"%èXö®ý„[¹°b<°eáLÖyº2¨W–Ï|‘Ý :`®ù‚]‘ªô9†žu4@°kù‡¼»p-!_ºJ&U‘F&‹ç|H¸J5v¬^CVQ&ë‹ ½p?Ù5šrå-HL©B@'j³jÞë|¶f2¥9ý/A›T›Œo?ãëH2Uw/çëƒ^úKý¬Å¼õñr²ì§õBÿN ÐìÃ,œ3£Fmv}¿œ\oCŒº„¶U$Vtt—¿bfâ𮢰ŸÓ6rÎ ÃÉóoxŽf¨s?ÿµzƒ/ã´‰0vñΜoi{É%ÔÏ[Åì·ç³-ׯŸÚ”!ÃûÒ0Å ´ªh:á syþ»êŒ¿¢;>K é¹|:}6Ê€k9¯ìYùs?[C‘žL—þC9«E T+‹Å³çRT£.»¿ûÑþl¼^…œíËxiÉRjué;òNO×(Üö-ïö5Û‡‰¯Þš!ÃÏ£nœN0kŸ³‘xOˆ•?lA­Þž‹†õ§N,¨J_Ì~/¶Ûtê²´½hämúœ·?^F¦á¥Y н>™Íç³ß¦¸Nö­üŠÃZ=úŽº”éN@ëÝËæ2÷óõyªÐý‚œÓ$™âìm,^ú#~-̪¶P£ïÍ\Ö9ˉFLB"~r`Ø„8ôèÜNQY[–òÂWËÈÔëÓoä%œ^Õ´3¾y—¹‹×QèI£ÛÀœÓ4…Pî± ¯ÇdÍšŸ¨ÖûºFðÁ²íDˆ¥Qçþ =·~E²ç›÷xçóµêit0‚s[&²~î,¶Úܧîåë*íÖ7Â;ooFõj(z€øä$º EÌŠ¹ll2ˆÍâ@ òÍÛÛ~ç¦æ“E+ Ä(¬Y½Q¥5CG ¦a(J_ΙÍâ-aZž{þWá8ή"+ŽÎ$gËüXR܆aºä-dÅ{sX°æÞÚm¹ð’4ð mü–%{#$gmfå®ú7ãúæ£!›øxý®«™¶:Å8À´±2mÉaÒRMæÝ6ˆñS—ðÍ´;¹|ÄM¬iI‡í¨§[§ ;¶¥~­+¦\ǽ ²AQÉ]ò4ƒÇN#CK¥ª¶‡G'ŒçÍ9ˆPϽ‚{_ÿžš§µ§a\³nɳ‹Q¥Fö}|7—_?“T–O¿‹1#ocsbkÚ%lâÆ‘7±¬ØÑî~ÍLª<×eFHg°BTZ/¥Ï‘NùwI)Ðâkç'9%…”Ôb4|²ˆ7&ÝÈì …¨ûÞäêq‘¡¤à¥ˆï»‘ 7M'Ü +-”ÅŒé{9_E4²?ÃàQ“Ùª¤âËüŠkF^ÇÒ]…Hc?/Ë/}E•æmhÕ²9UcýÔiÑNškgòúw°p—¦©¬™2”ÑS¾Æ[­ʆÜïv~ÂÃÞ/æpÍ€Q¼•N§ö-Ѿ‘ácg›H&Ý—Å´›Æóê÷û‘æf^3–{f~Cz«N¤l›ÆU¦qPÑË´9ù+yWU¬çñFng¹o2½ý‹˜·4ES!²‹ÿ9‰orTE…Ð&ž½ÿq~ÊßËCWM൭ uêTCdep /XªEH ƳƒG¯ºŽOóI»^çªë^&?^'Ù‹\4ê6ÚÉĬä¦QW³à§\¤}ˆY×çÖiŸ‘Ôôtš¦úgîf8ìM${á}\:ö2Q8øÍRÖåèÔ¨žLÆÇS¹äžJ(>ðÉÓ_çÒ¢]+ò=È=Ï|LXSøúž\2y)±Õ,˜ü _ÚxT°×¾Áèq“ÙI Zl!/ß5/Ý â0³¯ŸÀmÓ’|ZgÒ3žgÌås@ÑÈ|ÿ6úNxܸj¤„VqýŘŸibd®ã±K†óØ¢ƒ4kw:õÔÒ¶Z:.DI’%‚‘RVN&ïÏ|…¼Øj+¦rÑE·²AÑÈšw}'¼Jvl5RÂ?pãÈ |zÐÀ8¼)—ŽàÑÏöÑ´]{|Û_ẻ_#”T‡‰;×n"¤Àáï¤ï„WÈŠ©FjäGn5žOöTm،Ԅdš´î@ÇvõIJ¬K«Ö­huzZŠùÜrí¶Kɲçâ©ïs£“Ñ">yæQ^ÙTˆ»‰©ÿw Sí§éém1–=Âm¼K±ªðͽƒñÐRbk&±æ…Û¹äÚ‰ÌÛ§€J9.@¢âOÔùiæ¥ô»þÔšµˆóÂʇ†0èÖURÙýöücä äj:™k>á–AÃym_Z×eõ«·óÀÜ•¥76¨ªÊÖçF2è®OUkáßó.ÃûÝÀªˆ‡ì?å–Á#xy›ŸöZ¿ëÆ»—U1TK²xçákyê£õ%wnÈÎÅ߬3u2_eôȇإ”h¼òïç}ê¬[©„Ãal!°-Ë1'©Î–"m°MlÛt„§mÊ1Öcô…NÜÏ}7¶„þ&ï7›BêÊÜzº‡‘E4ù÷GÇ]‹®XÐö:¼z ‰X$®[ÄEÏ|ÇÿݽÙjòä—S8§ªÊÐŽg^þ+¯ .Iîu÷Ž9…YS¼|Ù²}Ϋ DøÞëç+ÀAž›þmï›Áã›&³†p×G?1âjjZ=Füßµ\Ô§:Å?=Oÿåé<ùõctŒcXÆö¹–Eû‡£ë’ªÿ¸‹[†wš±`ú™Ì\¢{w/Š<¾°+%‚QUÕcÜBTÎsÉWŠ'Žâ×»¢½í¼Q³´€™=1åªOpí üPôâÒϹþ¬tບc/h‡rA½“ΣÏÝÈùëæ‘2~*ÏNìŽÇ@hç…<µh =/ö ¦Vcð¥qAMìâÍ,ybÍÏ8Ÿí¼˜¡­h^šæÐ&>¸›¶}ÊéC°šÕgÊ’¸Æ#PÚŽcòÄa¤)¹Lÿ8õ®ÌS—t,N _Æ-Ÿ¬eL«ZxR«1àâ íW «“àý®ñíÁëTEùõ³VEAS‚,š÷ ©ƒ/¤u\mІµ`ÆÇŸPpæÅÄ**Ÿ])31z}~´¢í|½Áæâ·qEÕ™$:F6E‚-Pš^Éí§ÝÍŒ9û:¡&?ÿžý¾Kþɳ·÷Á'†ÂþaL›ÿ#½¯®Š–”Lß‹odÔ°ºÚÄ;Zç_r/·ŽªQ‡UíÿÉnbØÈ›yTÕSWÿªtê?uÅCh¢€§~Oƹ”sÅÐ"acŸü’¬Ã>ny| cV|Éím=ȳB¼óþzTQÈ»s> eÔÝ<9®ºbsºv׺’«»¶Á“œHŸaÞ¯²»Ê»­ncùþ‹Yüðbú¿´„‡:&—SeCþùá>÷R¡ö\;ö ´LéhñJ%þP•î#Õœ9ôvnšÐ åŠ^ä·êÊëï 'øÄbÎa!wN"¤oê̤ÿîå‹sU”š]?ö*¶NaÓÛï`Ô>— ×^AaaÙ¯µë&/¤Ïs ˜Ü5ˆPmsW&ÍÛÏ—}»Q+mzõãìèšÞà::zðsúYÎÀ™?qIMÁ Í‹W+[Ò½^<ªSçžÚ¸|ôeôm@‡ê™\zûö®ÂíOmåŠo?çöÖ8OgîVF‰Ê÷yO²æÉ‹83ÄœUÿe@5B_pËä• ^¸ŸûºÇÀ¥ui_íJ¦nË•º@4Á}ã†Ð(^£Ax+Cg~JÖÐ+ðøüx4ˆo¹öîÕŒ]½[ê\ŒÞ®6÷Í„é^ Ù¸n$â,>|b"ÖÙ×ðäíC‰Ñg¤šLX°”ëûöÅï¥ÇЛÕ¿.œà:cøt÷?_[9%~"¿³P”Gi8RRªªªF("  …0 )m¤m`Û–e£)%ZŒ¢3Ärú¢ª¨Ó¦žÃcr-Òü59­€ä:©È‚aA®M‰—[ñÒ euò>ÚÁ¡Ë‘©-iZMEZ6qõzQOY@FfakÔëÚg€,—¾3©‘Îdoá6æŒîÆÜèI3ª"¨yE1©É¤×JAQ hë¾^ó_ίWEJE#®YO. …°-íêˆ%=&Â÷v©–öë8—LŸÎz€,G(@£Ê¶©WЭ Þs_eÛk=1‹M„ÔH¨æÅ²tNŸp+ý¦uäÅìᬟÔeƒ.AñP·}lI´éÌ ËV°Å´èÕ¶*ü©´iΛÛ2±¨?1‘juÓP„(5]VÐhTv}ÅE»¹µu:w DÁŸX“¡ù˜¶BÍöˆS$"˜Ã¼Í¼5þ\>¼A/­Ÿj£F`J‰7.ž´šÉ $èI$z‚„)§‰üÌá²ÜRbçíæÓ•[é:ÈÖ͛U;±÷£Ål;<ŒÖþ2Qé¤XÚX©gpǨt.n݈Ùçöfàà‹Ñ¿+Uj´nl,RykOž~ö%ò&Œæ_æ2lú?PBYì:TH÷ój¡©<‰´lP‹—wÂUðÆÅS½a:ªØH<ññÔlRMHì@:éþ …øâFß8UûŠðhg7!Ë4‘_=ÄxŸ(Öª˜íúŽ-œÆ“­=`I”¦çÐ6ð0V¸C9ëx÷_ƒ™¯§”ï*ÃzaJî£JÝ!žd’}!²÷mc—±e}ñJÔ¤i’ÆŠ0$$ÖN'5%Ö±$•¶gµ´?mõ(Ñ%žØx´iˆGXXžÚtjÇüo¿"ÏØÏ²~M˜¥DÓSÚ8é%ÔJ'-%)Lju¹‚£{‡…ôê=€K/MÏ”ÝìŠìåëÍxM‰úE«’†§a*%õ+Òrº¹ƒÉŽcÛð¹lSÈ)3ËK Š,_¤ÄVM%99€Í›€G1(ÚµšŸì&<Ü–€:]iëÁ.§5ƒ ¯ú„›>oο6¬d@5‰)À³5›ÍÆÜuz X6$wäìy¬ØÇ(TkÝ€$]Å–*Uk×€C«ÈØ%š ì[ŦÈAVv®Êá89y ôÈÍLj…ô–õHô¨3ÌáÌÕÌ›þ.uŸº:*°%©Å6ª'†ª «F%TiþbrŠ©PAïSi:ǽUfb*.Ì£¸8Dl\ÂQÛ4E l˲0L5Á0"HáhŒ¦a"¤Ä6 ,ËYԷͶåÓD ± e«† R`b`IAÎÎCØh¶ ë`ÄùÑý)˜Áòƒ®Iìà^òL>Írlô¶v[3°„iƒ0°UKJ¤m€TÁF¿õ ÿêS³¼[yû¾Å–ÛŒ`D4d * [^Ì'ë_£If²ø—-‘flIKH„CÅ0e­íX0M È”‹Þ`¡ª*YYY,_¾¯Ç[:Зw¤(­2vïFUUlÛy—”阶@«Jíju°Lç„a˜¶Áöy¯³4¾ =BŸóò;x¬-T;‚-lr2$&{wà«—Dà`oNl [†È.($P]Ê ¶i`3âÔ±´MLÓ9FPH‰m„ 9‰XðìÎÍ\Sž…|~o‚41Š-áD†¿ü/_Ô¬¼/4EÙ«±¥Ä2ÆŒ:Ьhûµ$X¦ù?'¯'JFI{ÏÚ²ŠõÛ÷zãiÖüÇFS,öí’|³qÍZÙ¨̈‰a‚ŒäQ± k xðc¶\öK¾XÈ´Iãø!ô 3F´)KÛ´Iì}#­î½Y3,UºñF[FDâÕUv熶…%ÂäàóëX¦l+‚aHlÃ@§Ï؆‰ Zá*n7º}̧†'ûC:v˜â~3sÔ¡Ì{´fqÒç´)+b€i • ÅaGð­a&BXØÞxV6{òAÆÛ(Ád™6µL Ãrú²aø·etýTž¾öš½ö½ªô$cç°+¨jƒÈdO¾BRXÙùû²Û&¶eS—ODó Ú&–Ûƒ'O¨*ìÞɸ´òÕZÈÊ™RZ†¡[+™ó'MáƒÛûTt´ ÿäq3Œi¨`ØBb[&–Á°>þ—\S,Ñ¢¤”!…Bdee±kç2w¯Ç çcÛ6‘H„p8L$Á°,vìÍw„eaš¶]É,°¼æ@¹}™ºCÙR#TŸœwïcòü ‚û–3uæ2:mGµ&Ci’óÏ¿¹œ¢ü-¼rǽ®?öÕµ iÚø¨’(ØóÃfŠ)ï™'!P—½ðʸ«™õíòröóÝ{/3{åþR!&¥DÚb›¢cø}n¹w.»2³Ù·ùÞœý:[‹•Š÷–+[Åò)¿HS,»ßaAØ‚p(ÕÊÃ`«X¦#m[`6¦)M²²³£Bµ\~¢Ú’]t˜½‡ö°gÏ^ödì!³ÀÄ8°šû™Ï»ŸååCùä¦ñÌß-¯2!Xþʃ,ÚYÌž“¹k¾ŸWô¡ûê¼õÐÓ|±§€}+çñü§™ êZ¯Ü,1š-†X‘ËÞŒÃØŠR¢£#ívíaÜÐe;×yˆï3²ÉÞ»yÏ=ν ­Dq“5žÓ‚÷n¾Ž—n%7ç ßÿw³¿ÙQ®ÍPIú53ײ{·|5«óͼöÎ;¼óÎ;¼3÷ &÷Kà? Ö"|µišœËúÕøü‚ÅSa­ƒ7oo¼óûýM8oèP:×ó™_\±Ý Û… {0éúéĞߟƉåMáìÎøø‰gY¼3ŸCkçóüû[éÓ¥1JTc:²TìO«¶juò²2X2{o¬+¢ä˜ßòcŠsÙ¥&ÿè_ƒ÷§?Ê’Í™äìû‘YL"·vU8š{A.¾ú²ƒly÷^ž^•ʙÆ2¾O½Œ÷~ÜK^v_¾þ/æ¬-À£V\›;°êuÞZ–Iã0b`G´ìdúÛ0®o û?DŸŸ39kóñûbP r «T½_OãáO%>{7MüøT-ž¶-Y÷æB ¼1ä­^Ä¢õ[°dy«M¹K˜ˆ}¸¼Åî»m6ûB¹Ìü¾ EФ<Šá«ÁÅ“fòhûŒê;Ž%Y:JíóÛ~LœÎ¶‚<¾|ò~ÞŠœËÕ]∠S´ä9þ`#¡Â æÌœC\Çv¤ú4§}ªÏ­çfss¿[Xºý0¹·ðÉ óÁ·\“Z ÝzœÁÓîfêG?’›ÉúÏç2{ñjB¶¤¼©¤´ýÙ•¿¤P,+d8f÷î ¶mÛÆÎ;P‰ h~gÆ)ªªøñúülØ•K0‰jŠ–eÑwc[”üíhp%Ä2J~“HÛÄ0l+,h>n4‡èJRÝsYÝæfþ5¢jb&?kîîE•j-™–w3_™H5Æ4M,!B`5Îúç}4˜×Ÿ8­6·Ìü†mcYait¾ao\Ç}ÿhHrj]úÞñ6…¦ãQk™&vÔ»VO8‡g¿€ÿ¿ãi”žF#x{]¿GÁ2 L;êƒÀ6 Lqô€öK'#åŸñù|T­Z•ôôtÒ«¥Ó¤qS5hJµôÄ'Ä“˜ORR"Õ«×Àçõ• ÔòŽ96:‘…—R»Z]4lHÃFètç –Ìº—íÍGreϺ¤ŸqwöËfò£/‘4Í{Öâž®©Ôï7“^ÿ^ÄM­üt¼v*S{ìfh“ê4è}?Í&>Æåj!„À,­_©¦qÁسxux#býýø6XŽVÄLfÜÜo¸ÒÿgÖM#­n7îÿä±Õ™TY¶³/ÖRiwåÞ¸®öoBJj-νaYYjÕ°…@ ‡÷’6%~)ïÒÙ+„£%ýwæ·4éÖ›*~]×Q=Iô:û4¶¾þ6FR=éf–Ol†7¾ÿI½Ó=!lÕdãÜÒµv 1UÚ1/0˜IƒÛ%œ¥ôÒºß@rŠŠÜ«ŠØ¶‡NWMâ‰>y\Ò¢u{ÞLú˜ÉŒïÕ¨Ô=¿´OTà7Z^#B±¯-O?;Š/‡Ö$¦JsžY¦J•d‡acZ"ºgXH Ó4Fªsó‡s©óŸÞxU¹qCmÚk’©Òââû˜sK ¦ mIJJMÎ÷û‹+ö_QÒ‡ ƒPØÇyS?à•þ™\Ý¡ÉU3ò‰/‘št´¦¨#Þ‘m[Ø ½n‹ë¬à‚¶u©Õè ^ÍíÍ´gï ®ßB->@ý´ n’B«+¾`ä«rQm½~W/ÈaBÇÚ$§5fÄÔ/ª“že–•7œµŽ‡‡w"%à£ÁÈŒšùç'z=4—Yƒó¸¦sôùÇ#‰?­1ƒ{'0±[MbÓGóñâ×X±b›&¢ª:Þ*õ˜´Ô¢Ë]Ï0Á|”D5ž³^J•Ô:H!Žà[ ¥…eF(6Ò¹ñÃ÷é¾âZj'5äñìæt‰EQ)Í«£„ؘF˜°L¤Ïýð\p"ßLãÚ>cØáGhœ–ÎùÓ ˜¶p:Ýýa›Æâ™5œ”ª-™žÕƒ'nB¬&±L˶ˆ„ã5ç[&5ù’þ«’Rãtn|s¿‚°lLÛŽ¦¯Ððü‰¼vÿ™ÌÓž´”êt¹t*[se(+:®Šèxn›f¹1Ü1ŸÌÌŽzó·Þ,™ò8ÙY‡OÊfâÂü|¾_õ=ý $‰” ÈÝ»w³uëV‚Å…4©À“XÝãDsH ò Xóèf#ÏN!,àðá|êô¤Zó³¶5ªøãb¡""–‚?>%T@ÈrÖ¯âü„ 1¥Dñđ෠…‹øìÖaÜwë; °Á°cªSu/114„! cKo\<^£ˆ"#ºŽ¡z‰‹  )’H(ˆðÄೊ(Œ8«Ãº/@Àïu¼¨„E8Ä*1q¬`FÔ<¯hgg7f$D(lᩞS6-TH‘å˜:½^/>?ƒa#Fµ _UTÞ|c—K(r¼{=^}Ï=÷]ºtcôèËðxt„„Ôäª$Æ'PPXHæáhº³öáóxúéÇY½ú{FŽÉøñW—žé©ÇÄ[!:‡‚4Š ~Õ¤8l ¥‚Ç‹Oµ±å^hÑ‚íSòÖdÀÆ2òyü1ÄøœmÖF(HذŠFL\ v°’å ÍClÀ‹‚IqAOl´þmgïž/‹?ªÚV„P0Œâ‹! ˜†ÌrŽ ~_¹ú a¥bzŠNl\³¸’jϘ’@IDAT„Xì¢"Ѻ ƒ|¾h!½ûœ‡ú Ï{vÊ­’yð O’÷Ò+³†F¿. ¢ÿg†þ{›NK¼¢E!//Ÿâ¢|¬t/º0)(4Ñ4³‘Zq6k ¬¨->b˜˜¦q„ÙÇ&XPPšV¨ ¯\ÂyF¹EäàñJ¬Hˆ !X”mUhl3Ba~ä¨é¤0Ÿ ßÚGÜ)ÿ»Ä c†‹x ¸ °â›-ƒâ£íæÓ“„ ò+n;ú9g…èì[á4sÄ ¦ÉÌÃ躗ø¸8òò=ØÂDQUT­¼ _EMÉ,. ¯ò•LÌr95B…høý’p±Aq8ŒÌ'hTÜHe„Š0BGÒnQ\®~¬H1ù‘2^ÍÂr¿K›pqá#³*.—§hýD‚˜‘àQ¹¯ž4)*0õ åy–«·²×†È/ùZ„)Ì/—ãèíú%`!òŽ&î˜|VÈO%ŸKËo‡)ÈWR8ƒ¢¢²öj[ŠŠÊ꾸üû‚¡ÒüX‘ •ð}ÌôU Š ÿ1ÞØ„‹ Wú«]–^0øË8;"=Û QªÔD`„Š1BÅGýrä{áÊó**¨¤Îí éKËá_ñø)^5…ë_=D4…Ÿ¾þ’ºã§Ð;É bˆÒž.m“¢Â²6l† É/·*ʯ¦¢J,#B0"XT@ž¡TÌc…öl rTµFBF*rc! &÷ˆþaQœ_±¿ˆ¿æ–Œ²Á´ä\ ®S,&';‡ƒyId.ŠÄ `‡s‘F!áÌý4 ³1‘p_lIÕ›!lë¸ö®X†Êéãá%­¶%þ´§çÿâµ-!+€,;éBQt]sÂOEL2öìÃP·V UÅ6mŠêl=wœtÄqì²0"ñŒ~å}‚<„ ûϵàgÊ/˵y÷8p'­šüÍ1æÂí’^ýFÓ¶CKôˆÅñìd6ÔûǦ·÷§qÒ÷ oû“ EJvŠ#£ƒsõêÕiÕ²% ìÅ Aí$ð›^O|C’k¶dßÞ}D"!*µ÷Å—îývœYInØŠ€Þˆ¿(ï’ŠÎÂFAQQ»víB×5 Ó"+?„a âc½$Ä%!Q°"†iOÛ6mÇq€¥mëÔíÔÃùûÏÌ»üù…gíM€%ÃÅIkˆ6jBºÝ B‡²üäì·!¦j}生#ŒûÃNþÿ„BÑY/Ó2E¡u›6$%%R˜•AÍT•@b;¼qÕP½ñ¨ªNl­1qkQ´$×êŠ[ÕQWÓŸçB–ÓÒMÓ¤sçÎØ¶MrR2Õª¦ ¨* P¿~ªê8‚ļü>TU¥¨8H߾瓜”Hûöí]þa'•§h• nû3 EYÉQcÑ¿ë×oõFg7eq¶0ÐT…ºš¡ÊÆè¾Xgæíâ×5–¨dI€ázõêѸqãRÏÈŠï(™–ÍDúž^©Puù_(]èÂ…+…’°O•β¬ÿaÝ (®†R)¯%k…ǘ‰¡p¤Bò,ëg9?*;â’]ÎY9Ç6‹–lsp…¢ ' ¿•Œs¡¨hŽ3G0Œ†Ëùª¦‹Š¼* ¹9Ù$'§“±¤¤dg"%%Å O Š ‹ˆ;VÅà(,(Àëõºd¹pqœã\^^. ‰'M œr¡è÷ùIKMã‡5«iذ1š¦º"îx ápˆÕ«¾§}ÇŽ•îÝBÒ±c'–.]Âéí;÷«B¹8’sç<ÌÜì,¶oßF×nÝ+ÕuM§~½ú|¿â;š5o‰¦k.y.\ü†þ ùùylX¿Žî=zž4mñ” EM×hÚ¬Û·ocÃúµ¥a¢\|>mOoGjJ*ºGwN}¨Ðh$É))tíÖm[·–nàwq|³Öø„:uîL\|\¥±(UM¥Aƒ†(ªÂ¦ëµ©Ú… eˆ‹‹§K·®$$Ä—ÆÙ=ÑÂñ” Å’x}>š5oAÓfÍqM¡'Š\@Qœ†r„@,ßpª¦§S¥JUNM¸Î¿ï²rÞu¯‡F›Ð°Qc—s.NRûS Å’È %'Ø(îž­SÆ{ùAZQwùI˜ð¹íÝ…‹S)ON½£;0ün»Ü»œ»pñéq'í Õ%×… .\¸p…¢ .\¸pá E.\¸pá¢2è..\¸8•(q>òÏ}ü‰„hjåëd'ËËÒ…+]¸pñGŠ‚iÃÁ<ƒ;³È*ý­ƒ‡èšJ­*ñ4©•LZ¼v”,ù;³gOE…Ek¾U%99™jÕkàñxNø¤ÁŠ.\¸8¥R’U`±xÅO´¬_…õjFµ¿§Öh˜?nÙK(bÒ±iUÚ‘ª"¦i²bÅ RSS¨]·Þߘ/Ó4رm+………4mÖM;±§D¹BÑ… §–€·¢m£jôìÐMs]ÔLeîÂ5ìÍIá´Z¬ÊŠBFFUªV¡c§.Çqfô_5kÕbÉ¢E’”ä E.\ü‰!2óƒ´oVUUÜÃ锤x‚¦Mج<úOQa!µëÖE×u—/ !!$‰p‚ßí E.\œZ™HAt]ì÷äþÇ!æØ\8‡÷+n\Σ(;ñ!]¡èÂ…‹ßM8þ–“IUuŽ)”¢œ™Q"¥Š¦9km¶}âbîII©‰÷ÇÕõD=¹pù.\¸ø5£c_B¤ª¢ª*ª"Âù>kÃ<†ôÿ?¾9`—»_EÓry¢cCÞÍwBÒýÌû饨k^¾•3®{…"Sœ°÷–¿~V– þSt ”8Ü—»ÑzPÊ>K)‘”Ô¥õt2¯’ÉŠ+]¸pñ·¦ëì|¦-Š’Ìç¢ëQÑ ,BÁ0¢d .²Ë²1¢©*Š<UQPJw(¶à æÊQÚhéo€0##Šª¢‘æ‘÷+%¶¢VHS=NïTMò7}ÈÕ}Z“ðHHåô!w³lO!šûÞ{€êÍ®fW‘…‚ÅöO¡iZ]nù$ƒ?»k>uáÂÅï¨,c¨Wt¶ðäÔÝtÕ‹ÍÍåðùW“,mGài&;¿ÇêŒ]øª·¡_ÿs¨H£`' fÅy‰t0Œîõ<Z¿œå¹)™X¹Ï¢ëà1´ˆ¬bÞ‚ïÈ2<4ìÔ›s;5Ä‹;ŸïæÈÊ퇑±59cÀ誂î1Ø¼è –mÌ&­eúŸÕ†8;Ÿo?ù€•Û³ð¦·æ¼ÁçÑ Î`Û¢ø!å4ªnýœ{m÷¼€~íªŸ¾N¤@TBÛ>aø€ëñœÌ²WÏ'ÝÚÃîC¯ÞXºf& =>âbx›?xËïþ/£^ûœ{ûÖÁ²ÄŸºMºš¢ .~wÁx”ÉRƒðâ§y]¿œ¸}ûb6d„}IQ®ù„½½“e/^Ç„GÞ¦E•|ÿ¯;øt·Eñ/sáùW²$¨sðë7×o/®7©Y+¹ñ=®w/_ï BpÓoŸÀ‹_î@ª& îÊØÉóȱTŠv-géú»íÍ×0½±½ Æ9!1ÓÇ#tày.Ž ‚z„N9Ç|‹Gw½À´} ¤fô"tèú.A¤P¡‹ò\¼°Ë?­,”о²Ázk¯ÿÒŒ1ŠV¿Å®+ΤÚV(3Ž~•ûßò˜|ýŒÌÜÔ7øË37ðÇŸÎâ¬Y¾ãRF&õ€ Š¢0?íF*E!Ä¡U-öP äv°êÅuœté­¬xâ ž\¹’'ŸZÎÜQY¸j;qÇÂ}o5w­x‰´Ÿæµ¿-âßöÆY†aÂÆe×ñôæ Mkï䚄̜u<–î­´båœ~êñ¬Y0»Öl¢¹eï>¿œ¿¾ü>ÆQ?cfÕëÌŸÿÛ²>;?z…ßmÅ(Ìì\IéÈ%6æB~4üæÎ^ʇۛÙñÙz[v7o7F›v­n´†+¾ÿ£½ð¦ˆsò÷Ïã˜O–qÁU÷°qk3;?y…f]Ìãտ⦠jñ¼fÉŸÄ‚‡䔦Ŝ?÷>Ò†‰Vz€ªÅþ‰_ E!ÄÁ Ä^æÝµ44ñü›>§McÛØv õ\xv«¯»›#“Š)ÇR²îfFUÕrÞÒWÞt=Ê~6¢~úxnQMÍ)ówËSÜxŠC&çâúZk"e2ñœy,™3Ž?ÿx2••u|óâE|¼Û%²FsõC0|õÆ­dìŒßñRXÊÇõC”Îw߆çy„Ö(®yd6üžcj*©žðn{qñ¸Aä{䂎'ŠÀwñB…Ö=ÍuT}k±š£h˜Î+ïbʧ‹™>~$GN™É?cçóòÊ?0Éöñƒ×ó‰BkèTæ/¾£Ö]Í´Ù‘Œ›ƒz°M·êóê+çê7/d×Î&Y9AqÀy!<ü‡|{j#†•tû¼FŠÝ»› }7?È£ã`呲#†VÕa;1´&˜Q€›s Ä‹SÄBmlj™š —%(,'AŒȺÁž•t,Û!‘p° Ð*Âs]üPa˜ñdÇ2AGxÙ,'ií}|ÌI7"²^¦E<‘ÄŽ™Z>®ëc%‹q¢_NQ± G¶‡õMãNŒ;–¿Î±'pâè$]/3¹aýzªkj¨©­í÷Ñ—Q±uëVLË&žHàØ†ÖDGÎ 0L‹‘õ£IØšlÖÍ?WÃ"YT„¹´»A¿¿‡lÛæé'W2yÒ$ªªû6ÍÅ0Mv46²ð–›[îYzßÙ…›Û¶Â~àË9E!Ä€ë˜àÞÓ²i Û˜}Ùå÷xÀ^ùÄãdÚÛÈu¹ßM·æ¿Èí{î-t³´w _/G»—ë^)E.tùÝû>>p³ì9ô+E®=èö\¢L¿ó‡ö4^o5`õ­ëT©~ÅÝÍÍ̹|Å©T÷WVT°dɽ¤Ó™N·*²m?TõÛjŠBˆƒ£—n°ÚÚZV=ûL¯ÿt:}Èõbéü ÏýÿœRý>¥²²’U«žíµýµÖ´µµÔ× ó¹] E!Ä¡ä/8ÜSX¶g2û‘CH¤÷ˆ×Z Äÿ݇ö?دêÇ¿-¡(„P‹Yd29ôr!$CÓ40{úhZ&Ùl6?²SZŒ(Š0 ú¡Z•PB l(šúá¥lþbÕÅ”§âpéSJ³ù‹”%)MXÝ#OCEE[¶l¡ªªŠT/çú›­ilh ‘ˆãØq E!Äà3a܈!¼Ñžã™µãÁa}á\Ó4ql‡Q#k¨«ˆu;µ¨ÑT?‚––Þ|caÖÕ¢iš8ŽC}}=©Ò E!Ä`¯¡2ãä¯Õ°m÷0Ü@q8÷š¦AIÒbD…M<–Ÿã×u‹eÇ8ú裩««Ã÷ƒ~¹âüàyÿضMq*…eY=¶—„¢bÐÐ:¿:LE*ÆÐ9å«ÁŽÅn4F—¾dÃ0ÐZcÅlÊʇHcõwO†4b +ÅŽ“ˆJÆŒìÛ6½œ\•…T°r—&B!$…B E!„BBQ!„PB!$…B E!„BBQ!„øõ:yß4ûgr!„b Y¦Ù§HëŠ+'4~ÙF!„âPFËúïC1N§qñE9Ó4 _¤pÏžÃú/B!3­ÁŠY­@PȳP@TØïŠ—ýún¿sqiáÛr HöE@BšU!Ä ˜¦SJe¿A!{­üâ@e§ Lns¤=…B b!à¶\akÒÝ*ÅÎIZx@G¬*ü"_ÚS!Ä Eð ›_F¾*ÐF~ÊFG BR!„Œ{»LýB•vܹ¿3&ù®Ó`#×_B1¸E…@ô bØùξŽ&5 U¢ÌÑB1Ø+ÅK\ !„_å?tF“±Fù=[IEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_design_layout_details.png0000644000175000017500000043341512235000130027114 0ustar00murraycmurrayc00000000000000‰PNG  IHDRùÏÉwÅUsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ'¶þ IDATxÚìw˜UÅùÇ?sÊ-ÛKï½÷»ô*‚ *¢¨hì)šhLĘ˜D½kb‰l€ ¥**U.½í²}o;e~Ü»…òÓDq>Ï3Ïî½÷”™÷Ìœó÷¼3 …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡Pœme…B¡P÷h…â,E*(ÔD¡P(?(;öäH]×”!ŠÿŸ×C½ÚéúÿSØ+ѯP"_¡P(ß;÷’/}¼¯¡†BCâôTˆ)%.GóòÐ-êgx*©Ä¾â爡L P(?,w=·ˆ)“ƱçPš¦|+ Bp¤ ˲¿»3 id¦%âótéÒ™]ûvÞ}â&ÏwˆvYí¯8É÷B‰}ÅYßÌ”  …â‡#ûOÈÛ~y9»äG¾ÐÚé9"¥ë€t~¶¶ÓtM€ã8HyŠßlç¬Ò†¡á8.º&°·*Äò^}kMC×4¤cãüLå¥+%ÇJ#lY¿’ú™)ø<ßîoÜŸWD½&m©W+ ¡“s´„>Mã²:ø¾E¨Wùò$ÛÉoé (gÊ“¯P(?/¼9_†Z³ë`>p%ØG×S–³ÄwøX¤$¾~ÌŒŽg‚š/2¤+OZ:MsÙµf›K\zöìF-µß„˶U_±£\Ò³g72|ÿ»"ÉP‹Wì¥mÏlÚXÊ~M0„˶ÏW±Ý‰#«g{̪í‹öïbå¶téG‡ qBçåç€íHÖ¯XLïþC¨–Àw!µ^%¿GÊÐs1tÌÔx^˜û €ùÂ]nÏIp¼W_ }…ù …B¡8M1c9èºFÄr£¯M… øè~þtÛí8¸C¯v ®&3lǦaƒFÜõð?IMïÈÙ ¥cQT‡p3a‰dR2Óðj±~וäÊ£óÅ#¸¯‘Æ=ϯŭW†¦ ò"ëŠQ<\GpÏ ÑߪK4!44­JÚ¹R"¥D¦iH×Á• éB‚ãºM«ì€H)q]‰¦i¢¿Wüïº.Ķu¥$÷X1ÏÜ3˜gÞÀK7Öæ/Ó2¾˜A7ÏÃF7¿¶ä&¸ŽÄ±ŠµêòÞUÙ,}ý#> ´!Õ-SUÙݨCÊ »H÷ìСR‚ãØÔÏL! cèÛ÷æÐ¼Q]¤Ó4Ø±ç ™©Äû½Äù½$"f‰À¶'zì«v­Úÿ²ÆÿÕCv”ÐW(‘¯P(Š3Ãu]„Qm!4\×åÖ?üœÜ< CGh!®+±-›õkóò /žsÏ í –ãiÖ”Û²ê÷ý -doªŸ#›·‘[jáML§[§¦NÄ‚ †DàJ(ÍÛËÚíG°…Ÿ–ƒ,ŠèoÕįРäÀnÖí?FÄvѼñ´jÝœúÉ^…¹¬\¿Ì.}è‘i±rÉz Rj3¨CcŽîÚʦƒ¥¸âSëÒ³c=öm\ÃÎ’ Fd7fÏÚ¯ÙÐéÕ§3ì\ò\?C4§<ï(×Ý9Ÿ²2›uÿ оc ¬œìPL·ø í—وÞ-ý ]l "µ¨ØµlÞ´ÜR ObÝ:5#Iw9°q3[Š-ÕN!7'#¥6}:4À8 ‚le¬WëÊhGjÑçk¸ý²üõ…eŒ>€–¬æwSzòÁòoðÕm„ëVtÞŽëâVuz½§øn5!ïÔøëÆ}Å6Õ»ØJè+”ÈW( Å™ˆ|"æ’I)%Žë¢K ­Bð9¶mãºQϳ”ÑŸŸ¾'_T)'éòÞÛòäò"iÒ¡k3Œœ£ÜxÃ8:¤hØ…‡yà•Íõ&ÐHT‰»Pá<õ›0wzÜ\6šz¥Fs£î]@*ÌG¶mÅ[×Ô‹ºie¹s¾bm™ìÞyà"¾zuw-Kã®{&ÓiÏN¦½¾‰acò·NIsvò›ç×1ü¢‰<ÚjÓ~³‘I·ç¡Z6¾÷Âc§° [×üéKÆ\{.ãëE¥C{¹gÖ^ŠX|Žîaø¨~Œí˜Néž­Ü2ç [ÖŠ• œp1ûrK¹îús蜪ãåñà+›Øá‰§ûùƒøG³8VnÌ¥wÇAØGörËÌ#Ôkž‰!ÝŸ¸È¯zsá¸nÔ{oüó¶ñLÿë[ü~Ú Ò“ãq¥Äq\\­?šˆvöªß_£ïàVûëÆ„}Å_-öWTûŒúг5a³B¡PüÐ"_F½®”TD {½ãâHLH !!C×@FCâãâ¢a%ÈÊýΆT¡n{õïÉ_~1ˆ{¯êŽQáÚë¼{7>0Ÿwrã¹íºNø÷ÂAM–ðM^<×lDÁ†õücqMã}8ÑÞRµs¸è¾8œ½»ùããsëSKxy›ÎyZïîN¡Yë–ôôÁ¶ür´¢Z ÂÔ6ñH)£ƒ«k×"ÞÚ=vQ!s¿  íáØðzÔªåÁ GÏ+í0VÝz´Ô€Îx¼s‡XÙ=jGÈ—@8Âò]eä(!—–ÔÊðÜ&ì7¢çû©z5„@JIi Œˆ¸X¶KÄrˆó™lߟOÏZõ) „Ñ*©ŽØT›0™ã×V÷ÜÛ±dUK¢ÚÎvlߊ˜ýê^|åÍW(‘¯P(Šï¦ÊóXåÉ—®K8¢¡  ×1b‰ ‰ìܵ³rpçO?\GâH}àHÉûsñöŽCqRs¶¯øšgÖæ£»’¤ÌdÊíZWªB'RÈðF8\PNœ®#cÑ•1ù ÃanÔ»0—;Ÿü’¸ácùSïX.dtéRèÔ×£áPqÉåüþ/óhÛ"&rɹY„™Ã‹GˆH:÷lƒž³•Ek%9§ ÉR’s(—ÂúÝ™Ú&ž…ï|Æ»BÜxÅp:ÄU+¶#±Ñ³.5欻<ÀÎÕxzÕQ4W’T+™ •Bó˜­*Ä|…òt‰¾±ø)W‰èHŠ˜:—’ÜÜÃLД†µ“yîÝUŒé׆GnËco¯")-»¾BˆX[ª,|'ÆáÛ5~$–*¼ö5G5T„_ %ò …â¿(q]©iHéVÊ˲ÒÅ0 t]CAjJ -Z4Ãu]>ø`.zÆ€è\ùg… ªô“Iãtü&ämß·ZqaŸö\—r˜`b*êG¸í–%UrÌ›†ÿÀ×l±G2éú¡4Ú¡s½8Ü@Ye¸Žˆ)a)¡Ô²iŸJÿìn îí€F RF©&ŽâÕ1õ€r$A»ÏÎhÎömyiµ‡‚ˆ†'fKÄf@BÛ·SZB¤k“s8„-ËèØº.ÅÒè˜2tœšuìN2ZV÷S«`³r[3¥g;®M:L !…Žõmþxëb¤¨ê Õ0$®û0‰…¥Åþå`Î!²ºâê»ß¡Y‹6ÜñìžûÃx2 BŽDêQh±p„¨°h*ÇϘãÄRuq¦*<§úl:5gÜ(o¾â,CW&P(Іq“¦þYÄeRóØ‚À-ÞÍн1tAÖÀôîÝ‹^={Ò·Oo† BÞ‘¯F²,eæçE$èålÞÄñl?T†Ï±X·j›"¥‡KØq´„2K’è3ˆ”•°léF>£|ö$ Á"o !\ÝäØÑ\Vð‘)ŽðÙ!›Ô´x¬ÃY0BQq)ÛFð'Ø¥lË·Ò%>Á ÷@ûÂqÂfÏÁRì̺|óéF‰~PI Ë>ßËnâ‰óJ(-ç›Ã!"$$y8r°Ýáx½â']4]ãн´iÝ–¼‚R6¨Ç#¯-£u«V¸Ò¡A½:<õÖgh¾$<ºnppïvš·jG(lÊÙË7+ç-|Dãî+’'æÀ4N"î©!ì« }…â¬C­x«P(?ÿzmžØw¤M‹j _ñj{Ž!ĉÞX! °¨˜ÒÔþ8ž´³ÎN$BÐrðx}xªÏ)]Âá–Ë^7L|^+"ì‚ßïCàÚÁ°Ðutébɪߪ#‹@ÈÍÀk¸#çÃ’H8LØ–¦–£Ä{5B! '¶0—azðy¢>0;$ä€ÇçãI‚Á®ÔñÇ{Ñ;"d»è† ®+uâã=DA"hÄù¼h8a„×›`ØÂðÅáÕ¿¥ì¡a§¢|.ÁòÒã#ÞÔ~òŠÔkš¬^þ1Ù#'pøht¤„ˆÅèWµ…ªÏšn²jÉ»Œ›8•ü¢b„¬_ù)ï=výT…éTÕ‰¡X }•ÊcŸƒ±ß"D½þ6UoN¶R®Bñ“D…ë( ÅL4f<:60Ô‰=â[^¢Ö¤EåäàgÂ0ˆ3 Ž‹£az<˜Õmæ¸èq±N€+MÇﯲYý·ãNtüvñþèvŽÝôWq"#º+ÁãõÔ¸fQûko4H\ ^Ÿ¯bƒèJKÕ{9î:.†×ƒàâ"ðù}1ÍX‘7·òŸ´ìÇ•Ïëž×9 êEز2f"¿ÿ6u›uÂc~{øÑáœýŒ8gÅeå5'S副êÑŠ™tª-‹V)äíjÛWÉ«BtJä+ …â D¾Qé¬Ð ÅÏÇq9räCGŽãèá'}«Uz;YD,;æá¯ü©bàmõu"TM—YÑÓs«uj&ªùóE ¡¯D¿B‰üosÜ(+ŠŸ­¸w¤ãàØ6RSÓq+Õ9œ_„4¿s»â‹ R%,3N%På¡wc¢½¦¿"Œ§¦‡_%AUܾÒ,ŠŸ¯È_´ðcç÷STTT92^¡P('C°uÓפ¤Ô¥eª¥äƒBñ=!%„}‡!ºèUõÕm« xª _LàŸlP®ø %ò/úDvéÒ Ã0‡CÊr …Bñm_òòò˜2²%EEåÉW(¾\×åÅ~bâ½zL¾M•¿zøÎ· |­²W^õW…è(~^"ß±,lÛ" £ëÛ÷å³ó`QtÇ“mïºtn™IƒÚÉ' °R(ŠŸƒÈ—2ºâªD¹ Š“ª˜üêSeVÑ1«‰ûŠTsa¬“5O%ö?‘ÿϧ—Ý{ö"‰ÆÄù=×Ý¿ Ç÷G×Nþè [ßý!KŸ¾„ò ¥,­øÑ#¥Àã÷¢»6¡ˆý}¡yðzáPäöÄšŽÇãAZAÂ6ÿQ¸ÐM¼¦†ã|Ϻ×4p"!,÷l©O²æL …â‡ùÄ>'÷5½÷' ÕQ}qÅÏOäççÅãõ …*^ñ>HKO!¯0pY[ÕåÝ÷ÃÑeÄÏ©àÎJ„À.+¤0è’˜œŠÏ<óû,¥°<Œ/!_µ· n„‚"4Ó2ðjò[²áRšŸO@ÄS+=]ZäA'%-¯&ÎH,»‘ …%eþ4RôS,/ð˜Å¼òû¿±©ñî¼|(F¬.GíRDaÐ&!)¿çôÃ.„nrdí‹<ð®Å-·O#Õ PXRŽîK!%Ñ‹Œ”RPXŽk&‘8Q(„ \t”"Û$=-ù„¹Â«)|Š÷|ÉSOÌ$cÒ]\ß/Ë®X&Ê ŽP&ÈLçÆAÈ_û¼¹–17þ‘¾uõ3°B"Á2Ê!W"4_\<ñ>‡ÖÄ¿fΧõÔ¿1µ‹Ç‘gAsʨPü°èTÌM[1?i4U÷Öë'ù_œ")??‘_!ì+ê!Ëå’¾—g×#¨ù‰išhB`züìí+°¡¼Y?4äèó·yèËB&O¿™~-ý„‚a„áÁcè!q¬;zO5<^L]$®c±%ÍKyüý¯è=ñV&öI!" /¹_¼Âs}ƒ«û™pÓtN²1<~<ºC0XÝÃ-дr>yö¾Ðñ÷?œÃ®OçñöüÕ$tÍ¥ãûDë™ÇD×ÒuˆD"8L¯SHlGb:Ò±E¬œÍ<ûÒjgÝ ãê*¡y¼Zôm¬kÛD,ו˜>?>OTÀj±ò¹®Ã±syø³<&\ö[²Úúbv1ñFÌ.Û9¡ã`ÚY0o;íL$M“äo[Åso~BZ«¸ñœÞyé5–pyÑT¦ÆaèÓ@ ql Ërhxý^„máh†v$ >_~Š'4åŽ[¯ vDby¤‹eYØŽ èø|~<ºŒÏg‚ë =:뽟9rÝ> ±]LC×ÒÅŠDp\IfÇ´Y°Ž¯¿XA· ý0Å™´k‚=+ù`Á—ìÍÉ£,ì ™~ÒZäW—‰ ~¿&‘®‹D‹æAHé`…-)Ñ=^<ºÀ¶tÃ@ÚV´Ì!"á?—‚”©T¾Bñƒ>¶jtYCÐ×ôÞW÷ØŸÊ{¯Ä¾âç'ò©æ‘—n4ÎÔq\ÇAã8Ì|ëm–,ûŒ‚¢"ü>I‰ ôﻓõë)KÿØ‚Â_ðÒª\tyÿþˆú\sû,šÅ¼Ï7SêÄÑ~ÀXÆe·Åã–±lö¿X²å´ƒ™:&“Yó×à1=¬}÷>V¼•Îô¿ÜD£CŸñê¢Rkס¤8u¼hðå‹·3{wK~?c ©ÒŽ.h#BJ4Ã×4ÉÛ8Ùó¿ÂhuW]ØmSœ»‘wgÏcwA˜„Ú­ÁxÚdH>úË‚qôižÆš¯¶“ØzWNlÅì×ÞÅ6Èùüqnþ$‘ o¹„o½È¦¼RèÔk?ˆ ÎíGšónKN˜%¯>Îâ-åt:ˆ=+öoè,xåï|$ëqõŒé”,y“÷—o¤ÄöÓ®ßXÎÜo5‰)4’oVñÇðº bcS4 Óƒn2÷…÷ùê¨Ãˆ‹.%«u:8A¶,ýyË7QâxiÑm0ãGõ&Ñ=À“zœ’ãhS°Š•{"tw)‚«˜¹O'ýŸ‹Fµc×ÒÙ|¼>—ÈþOøh] ½ÇLâ‰ch]ÇðfЭMc¤4j?ˆ±ã“Êcά¥ÔÍšDç†ñ••Iº3>™””8„tqݪ|Șö”Í«o¬%½Ûh®»¸7ËF„öðÖ 3Éñ5cäÈÁ¤Gvóê¿^eOPCè:²¼œcfC†lAÉÆÅ|´Ï¤g¯N˜Â&µIÆMFS§Y×AL9%‘XÁ4B…;˜5ó#´Æ=¸hòyt:ŒÖ¾a_3F3š>­âøð¹gYW˜Â9“/d@S›·^|‹Ý!Ž ³Um¬ÂŽ"@µúƒÀ0ŒXÒŽ·Vî ¶i¤ ˜Äè©ì[·’e_~MÞ‘|Š-·2LHºs˜wþõ›‚© 9‚ ¼õìKl(ÑÐu 8\àУM¹_/ä™öÒºG7üExû£]H]ühÚÕ9òcƒt½ É$'%‘KÉÉ h±ßjvžL£ˆÙ÷ßŃï¬AhÕD¼ÐðèǘuÏ]<üþWÇÿößVaºNÙºY<ðø>}ç%zÿ ¦Ç@—G™yÏ<º`;†¡Eó'¦fé³sÏ?gq4à*õ¥ø.‘_Ó;ª0œS}§„¾Byò]ÇÁ¶"±–}ÚØŽe[˜ŽA^Þje¤SPPLZJP˜cE—–c…çŽVüxz|ÞDšfıä€E½¦méØØË—ïˆnJ6ú[‘ØìÜ¿Ÿaõê¢m`íÂ÷ÙšZN}³ñ ê¦Â7‡IkКÎRÙ·ê v§à7ýë±âÝØ`VÇ Eh=ìrZJbU»ÏºnpCغ†-]´Hˆ0ˆì^ÍžP{÷ G« â óÕvî.@OH¥O®d¸‰¬út3ÇGhи.úêÍÄe¶¤KçLœ`!û7­`ë‘r\Wâj^ÂGöŒ$"Döob©té5ît«k` “&ñ¸ûBÔiÒ–ŽÍü¬úðC„)ÙòÙlCbé‚=é\·j>6áPpÐllKbÛÑ…¥Œ ,‡æE†CØ®äàþØn&YÃúÑÜ8FÎÚ­lÝ›C°WÒuHè8€!=š°bÏö”•@\&M_”'ЪM{jÅënßÍÊùk(—ѰÓ.ãXY9‰¶ †Iþê9–Ñ‘k&f/Bh[PÏo³YfÒ±S{ô¼uÌ*Õp9À‚wsÒÁŒXµ§Œ¦­ü¸¦ÃS bGDå{ ½|;ÿû®ƒåëÄ×ÃgÇ®·&±Ê˰…FB¢F8àèÁ¬Û´“¢@2µ:¶'Ù‰…:ÙÙðÒ¦KGºwnÇO)».gÓæ#´’¡tê?ŒÎb1_|]H«¬,²›8Üú5Gåˆ4°+Ê:îäC|q!îî\‡{÷zñé@{–|F7P#I`êÅ̹ïq©Íï&õD:U ušÚ1f=ø8ë'ÖçæñÝø_½ÜB#’·•Ï¿Š§^ø0kŒ^hº†à(¯=ø[§õâ÷ãÚTŽÃ0Ì0Ëž}˜Çœ®Œ?ÿjÅ©{³â´„¾øÑ.¾Åû¯Ô‰B‰üêh+^AÛ¶E8F×¶ë`j’M[·RRVN(ÀÐ5tÓ‹+]5øö§p§ZåµB  Ðt\ÇC¯Q£¨c:Hic{Ó ©—]™Â7»³K^{㦛iUm5p]‡²üÔlÛηÏÃëÃch¼þÔ‹üò† ð–¡0â¥NÝ4tYµŸ2OžÐž¡Móùtõ|^1L&í‚a˜é»èš l[ ]4=*8…}Õ/Ýè`Q)ÝØ›˜5LŽl~Ÿ•»ÊèsÞD:{óæ‡Ÿ!]}›èq $†‹ØþÕjº6É&Å+b±Õòx»ØºE]ÓEJË“‚tÝJ!&4A‚OÇuÁ Y¸ ZThI‡”½H*[Ïš·ž#aÒÅôn–ŒÐ ‚aеt=Z)ÁðHÇ­šB¢š€š†ˆ0ÿÓU”錞tÆ–ÙÌZiáJ _‘Orö¡-|¶¥=#:׋ÆåGÈhš†0t„ ‰ušÒ¿G[L‘ò2âÒÁv%‘Ò2Ó‹W¸Ç•5ŽFc¹¶''[H=£%µô-ä¬ÝHnËlzœ{ “åÑN,D§Â“/A7Ф$l9hšÀ¶B¸R¢™±ú)ˆ¾-p t4â<®kUzÃ]÷G4ØÿL'#±‚n$ŽžÃ{`@(Ôˆ$! ÝÍ—_m¦ ¤Q·e7úvn\)Q*Â[ ÍfûªålÈ Ó®W­Êådµ¬Å†Ïæ±ÓjϘ¾Él ‡±Dj]‡ˆúDºá²Í• IDAT{íbVï иÇ`ú·:^« !ÝÍʵ›8Ò¨Ó¢+ýº4BwJXñÞòë¶¥ ‡øz€zÒ·e¶}bˆâg!ö¿ë;U)JäŸJäW<ˆ]ÇÅã1HMI'%9 éEÓtŽS'3ƒfê³}ÇÊa"–‹áWÐ~ô¸_’DZzé;hØ™®ÍZ£mYÍ7ë¾&R'žcsHí2„æžÏ™ýq.õÕi&ÒÅo⸒«ßå­Ã2`*Ww³8løìcÖï+aääq$ù›?žÃGšpíõç,ÝÊîAź ŽôÐyØ$ ûm®û„9v˜)#úÐ)u›¿Oɶ îÃòµ¥mC/›d…ø­Qqnx \Íàè–y¼ìLÏqèäQ˜ŸÏÆÂmD,I´€E ç s>C»dâKòaîûš×ß,¢S÷nô©#Y|8‡­»âH’eìÝ]Âà¶]‹ÃÛâI¯KªÏÀ©Ö¦mO]FŸS¿*Ÿ¶]åu–6ĵf`ïæÌ[µ†™/î!Ágb•£I?ŽëÆ´pt µÈìHÏôe¬Xÿ3 ¾¡ìÐ~JÍæôjÏÑ=²êÇ:eÒu+;hQ¹?šûÍœ_ž˜õmâ \islÏ ¦OœÀümaÒ“LŠl/Óïû˜G/¯q)Ùþî#Œ½á>Ž$"! à'꧘G¦LæƒÄ6dºùæ@]ný„5mÁ¬7ñô!“ÙŸm¤Ÿ¾–¯¹ŽôûÖòÏ„9÷ú™xš¶ÁŸ·Ü†3È_Ü‹?^y%ñÙ·ñÙsm¸lúÕ„&ÜÍž§Gò÷‹¯âóñoÑ7~)—\z/µ×áÀ7; ¥>w¿¾‚+»DWÑìßÑý…"@bÝ¡,ÚòJµ°#A(3×LË[B¤'{)Š\zÏžþ…—G¯¸š qI8Çr±âº1÷›OÉòQn%ÅvгŽ3X‚1ês]—ˆ¡MË6<ýô“<ùäc<þÄÃ8ŽCzj{ä²rÝò‹MÇç11O¾J?îäØÉ3°e-4«œ£GŠÉh?‹G÷!Ñ-fïÞ\Dzcš×KGÄ×§^’äàÞÝDè7ñBº%9øš÷ »m=L"äç¢Ç§–šJjj*©ii¤¥¥‘–&%¦?‰”D,&¿Z’—–NFЉ‡c&Ý,•²}ød›ÃèË/§kÃDÊK¤5ëÍ•W&YÚø’RHKIBG"5ƒ”ôtR¼³NK²:6%Îã’艭F1¤[#Êvn@«ÕŒÚu2HNô!%ħ¥“ç%¾~/ÆŒìNBñ:æ/ßGBçAdµÊD·=RLz›~\<¶É³oo.¤5¢EÃÌãËá8xu¡µ7Ìžœ\×E˜>RÓÓIòëhq™0ý"ZÕÒÙöá;­Ý‡‹Æô%ݰ8>ºdŸËðMB#)=¿Žëºx’HOMÁplj÷G÷Æ)ØeÅ+5=lõ’ vî 0 »9)ÉÉx4†7z^ŸŸÞ#GЮV"{6¬ §0B‹£hV;ž@á1ŠŠ%=§\ͨ.õ(Í;ÀÁü »t¥¶æ"ƒ‡X±'Bú‰3Å õǶíXrNR¿$íÇEcúS'Á@ºñ™-uþ8šx˜>ÒÒÓI0%ËÇÀiW“Õº¡’RüuÚsÙ•ã©£ÙñI¤§¦âÑ\¤GzFq¦µQJ©I^ø‘´§ÿ×ì:Á…tLOÄôùñfÞÎúÏïgþ¶r®›ý%k–ü‹–V1s^¼¼P5­âF˜=ïMŽ îY!²ì×8œ8,@JI$œÌ_–ofþKrïÃO3º%¬üiö ºa€aÄ:Ô¢“ŒëyûÖR®góï9³Yºq»Þ»_JÆ×÷±÷Ø&¶/x‡|tÊ>ßDî‘/X‚ñS:Ò¨ç%¬\±˜§¸nMðXË?YŽÓY®̺` ×™Ò#Kùâ›@¥ºŸÝ ïâƒ-e\ýÖ—¬Yümdïþûr‚º$cýÁ]¼2c2ðóÖ– V(ŠÓöä‹èª•3`HjgÖfÌÈÑу‰IéÌý`Ú·!5%‘íÛwRZ$9%]ו'ÿ'Ä"‰ã§00úøÅYÔjÓ‡ Úõ­P8®ƒ” 6¡IÕ쮃m»€Ÿž£&Ó[ÄŽgY1šF§¬1t×¶qlh=ôÚ ‰UÝë‹Ä±½ ¸èdá`Ù6a<ô<ïRz‹èØÇ…!ã/ˆ[âØ6K§ó¹Ð‰c;HrþU×€c²$§s,O¶íÐsä$z‰ØÌ}û‚t±#.YS¯@HÛqhÐiÓºD½Ë¶ýνˆþÕì’Ѫ7“Ûô©ê;NY]$™FÖˆN¼½2‡» I;rqÓÎ l;¾†L¸äŠè› Û†Ö}¸ m_Ä:^\‘ÆØé× ›pDÒzÐÚ ëØ¸2“‘\›QÅÅqá‚ibrhÕYàØ6.-¸ðÊÖHÇ"àú=õ´˜-d\+&Om{;ààØ’NƒÆÑ¥rf–h‡¥`ß>Ê2éÛ½=Fµ7/§‹eCÝv½™Ô¡Ï ŽƒÔ&™Ú¢Ò¶pH Ïȉô]3Çq°A«¬Q´©(;ݘ~mh}’ Œž|9Û²WžñÀÛ꘸÷ñßP×vJWÊ?è|zﵬt$©½úÒ¸u3pªµ×¥¨èЖþ­RAîdK<ÍÀÈ{‡sû\Íf[&iÏÞ2 X@ЭZƒBЈv\›ì ïeêÊÛ¹¨k{BÂO§Wóú‡÷1eB=ž|a³žÍ#µË4/ýWßÜE ­¹¨m _¼ñkÆÿê RûN`HÊÞè}!\«8v-Ü™ÉI€†®ZˆNè‚‚Ý[ƒåÿ¸–I.$uïCý-Žƒ”`öè@z°Ó‡8ÁÑ` …B¡P"ÿ´X5ã\Ø`9˲èÛ³;M›4bÉgŸ³øÓ•Ô­S‡±£³éÒ¡=š*&ÿ'„©1XÐuqNg»ÊÍ#§øÞ=a;û”y×øùÎs×Ü&vNy.çTy¬~Œå>]»Ô8 ‰M³¹²y…h¯¹Ëq‡=•­+‹û­¶pª}´íêç±O±O<œâÆ7îÎôË»GËñŸ¶çSÚÌÅqì›:ßQ‡\ª™å”õñÅÿk M£ƒG¥e¼ŽÔül+ì ̦ۭ3ybH ¡ÀQÖ®ÜA²¯Z캦S¿nsà>ÝXD;óc6pb¸ŽÐ4JÖȦƒïy?«ÃÕßb+‰IF‚ÁÇJػdRCþöÊB÷Y·¢{Q}úLÛ¥vçÀ›tùÝk<=-íÁyÆÐ1¥€›ÆvaÚ¹øLÑ)Ï<CH¤,fî츺CHW¢éÓУ+:©Ü5ëuZ¥h'=ïÉRñÆOx`Q"L=Ÿsú&óØexkuaTX UæCÑi¸$Ã4£çÕ5¤ëâºÑéçtÝÄôhº—ŸŽÛW‹­Ô)%èFt_C×Ò%®~/^yðz„+9¶q)ÿ^yŒ„x/²Æö"&4 ]‹}o¢‹Šc{9Û¦C¿ÞŒ=’îöxÇeÄ„s=n M*[ÇÎç¯<‡¡[iT"tÓãÁ4è*«< ‰Hþø8éJ:¦ÇƒÇ¬°D3L -jWÓ4à4¯“”’à¡­<únç]4‘ Cš1û†Ñüù̓±9Ë*®‹‰+"j+Ã4±Ê=\7wZè±2 Œju tâý>t½â 4Ø;ïEfm±‰óDóZm¿h8½¼ ]°÷ÝgxøÞ'Y²9$È]ïñ›ûžçÅ9‹ 9TM÷Waߨ˜·¢xM ÝC¼ßƒ”ÃÐcã^$ša S=L#Z?O'š)øfÖ¬³{3ñ¼ñ4|ÁèKŸ&bh %B«~Ýcç4Mt=–_C«²«&p]YÙ.L`û[OñÎnðûL„Ðñx<•ÉÔ¢vDh'Ôa˜ºŽÇk"·r:Dµ¿”Ó—@‚W–;–?komÕ¨Q'j¶WF릧zYN3•ïYÍCóBŒ™0†‘£F0bøp& 4³z]×£×Ü)bÎÜEHÃa蘦½‡ Åî …B¡PüDDþ·¨Òu Gï~L¼î/¬ý;æ];…VÛžù%C† f@ß¾Œºô/”+þr=Ÿ­^ÌãÇð»>&°ÿ®7”¬¬þd ÇK_BÓrõÀlÈ?ƒ•,¥‹–ÞŽ¬YŒ¸ðF¦v q8¿¤Å‚'˰AY ØŸ ·¾J©a’¿èYÆ΀þýé=ä Ä'òËÆéœ3í*ÆŸ3¹; øÕó\4f=:ufÚK°¼~Ž­þ7 Ë&;»?C&^ÇªÜ å{—2hêßqd)s^“ý¯þ†C§ðáŽ"ö/zŒ C³ÉÎÀðKf°£ÔáÀâ'i3r·]{1ÃûvgìŒùØžï^’Ýu]švìLÖ€ôjQ‘ÜŠìaC¨»m&ʦß¾ Ÿ2ƒ¥1ïâ±üqúDúõéM¿irâè~wÁh²`À€!ü}î6ÜS¹xC‡yâ·—=p ýû÷犇–"’$OôJ§ã3¸ìÂsÉê?„™«ŸQ!©²²zޕܘmr`_RÓÙ0çnÆÎ&;{ £¯¾ŸœˆdÓ‹·ÑtÌU\wÑx¦=5{ûÔá¥ÍÑEu?ó;²û÷c`ö`¦>´ÝÔykøã•çÑ«SGú_÷ ù7ñâêÝl}ôbú¹žM!‡Ïžÿ#e1pàÆÝü<…B?Í!‰tlêõÇGË¿Æc:,|uÝn»’:‘p´£RžÃ=ÓÇÒ£w=»ä¶··aø½”~õ#ºt¢Ï ‘üêÁOˆx|ˆÐj†:Ÿ#!0rf è̯¿vÙùÎ?È8€¬ìl_tùßéOÉ( NË^ ˜Í…S.&©x¥hpìkn»xlôº÷ÄŸÞØŒ7©œß7IgìÕ¿eòøÑôyëF8¸üiúþñuü† Á—ÃÄ´LxÿSžßZÄÊ»'1pô V,ÿ+ÃgÔ˜shW;vÿ‚8 yîÓ«/—þãd"<7¨-/¼‰‹Æ ã·söóÑc¿ahv´MN¼ýMÊtÍð»ð>&ŒL÷.=¸ã ¸†É¶y0np´ýŒ˜þ7ö%;fÿç\ÃﯞÂÐ>ݘø×Ÿþ8Ê6¼ÎÔѶ9èœËX´³èôí&]dj{FŽÁˆaÃ>4›f™aîïNÏ+ÿÈ%“Ç10k,í.âË¿ÞÀç+æsþ¸±Ì¸ó.Z7™ÀF3 ë“›HIÍཚZU¡P(ÿ¾—·ßI×Á¶m¤c“Ðk<½÷±zs!Ó¦ü•¿¬M¢Ï`Á=CysÞ~3ãqìy‚§_}œZæ1n4¶ÿZÎÌn‰ïû˜Ko~’ úüšø„Dt!OsÀ¯݇øòW4jp2R‚¯ó/™7¬¡Coðòúdæ.ù‚Úþ2ÞÛ—]Àý/æõá7’žè'ç­qLþÛ{ {if¼‡¡Sïà×#ê³þù[øç‹µ™¿ä2ìíÜØwKǽΫW<ÃË72±¡Æ¦9÷rÓ›«ys²Ibœ´&\p>æ_È’;z`—®àÜ‹>àŽå_0 Ãeé7rÛ{ûx¶¹‰+[së“3¨'71ªé>þÍxƤZß-ô×u±] Ò!Roâ >¼º6I>“¥ áÍù›¸íAÁ“«_|–ÁM4ž»`×=;‰[Äwó,Ö ­]úÓ†ßÄŽ±o $•y$Ht6.|™m®âó§GãÓr¹©mO^ž¼o²ú­&òìŒûÈ[ù8¿z{>Sz\vA 4ÿÖûiÑð„]FYæÅ,|¶7žòO¸û‰<öñtH¶˜ýëÉüv~ÿˆ÷q:q﬛È0Køë›IxtûÈûÜ=ûϼýÍR4Jƒ`—®¢àˆŸi/?Ë}‰‡¹¸Óy̾c WôjFQö+,¾¢.¥æ0u‘ˬE_Ð .À3qÛ’‹yy˜ï;WÍ”2*ë·ëAÉâùæ—™ûÉŒüvá@gÛÒçY˜6™%K.Æ<ò=»_ΈòÆ•÷Óã©ü­2«ŸÄ @¢‘óZƒ?1‡ ³Þ\Æå¯-áÆ¦yGŠÐ#!ÜÓj§QϽs-2Ù:Óï• +ÀK÷=׽ȚÑq¹|à•|}î\¼I‚ÞcÅíç6d᣿æé/pw}/‰>3úVB ’’Éì1ŒémSx÷Š7xý¼Ba—?ña¾ÇÐsþvE6ú +jMäÓ/'§áÖÝxæüͤ$ùIo8—z’òm/qÝãM˜·ìÒ}%Ü; 'w}9á¦Eaa;žš{æ±/¹tÒ]ä¾™?ß³œ,ù‚n©6θœ[><Ì£ \ÙŽÛÿy3™Ö†·¼Š5¿jdz—<Ĺ‹62½¹ÉžeÏrÍ« u×DNÃ_ 5¾¯ÿD“€”è¾Ú<½äC¼IÍ»^Ì ¿êÂîÿÁ³?ãµÑïàó¼ðòƒ¤zKñ/ÀëëŠÈ^XHÖ%=Èûr;ß—Ê?Y¨ä)/þkœ@ìMa|b<¡ò2+nì-?)*Çðû””bW“az‰7%¥ÈIÂ:ÿ[ùx“0B%¬“ظ"Ÿ†¤4ø?ÊçÉhñ~“òò òl-§B¡Dþrƒ8ÙÍ4C°wÁ}\y÷;ÙV0ÄÅ/A:qHéb[v ‡uÅGØ7©ÏIÐIê5%*^+ËifÃãt¾e³Æ:²‹®™Ê‹‹.`ºñ‹ß[Dvoà Ê/¢pËB¦ýêAvZ²„ÚÝzbK0â“hÚ¬6ŽíàX’æÿÇÞyÇYMtÿÿ=InÛ¾,½,DAPD@)"Øh*Š€(MPA»("¢¨€…" H¥÷Þ{ï½o½ý&™ß÷î.à"è÷ñy~j>¯W^,7™ÌÌ9“Éçœ9gòpCŠ9$~WETwrbíKw¯äá;Ê"E˜ÜR2•P<$×½‹¼BÇ2üRmøÎÃYü.Šæq"ÄE+xÒ!©rEÊ$ºPíù¸5)À©4ƒ’2ì×Mïþ9,Yü+÷Tš‹ ªp÷…T¤(t“^¢$–áùGèýÃB‹V¢¼K„?•¨h\8º“Ú÷4Å¥ì%kÑ8ß 6oÞÃæÌÒ|W§R÷S¦þ“Øq1Çðɾ·ÕE«Çï¦iÝêüÒ -Ût ÉÝ17ù@„ ´û»eXÛ¢œ^ÿO½=„'ëåÈÅ}Lë\—9"¢÷·Ó9D±E‘\º ¦n˜Ïùô JÑ\p92 =d„A÷v:ÜÛ™ƒÖR­H,ë~YÂÂÏ¿¢Ü÷}RàˆIâ…ÔLLC¡ô½U°£pöÀ/,ž´š*K¾CJ°ÙUº”†””oòy5_Þ;¨˜?ÈÙísXvhÍ«—E&e:§£G Õ¨L¡c8 P<&ƒËÇw²&å"kÞÂ;Ò’|“¬$ô[Ï!üeº°hâ3^…cƒ¬75’+—Fè!\ ðø|HSGš]× Øãy¼qÚYŒûl/¿ûßtü‰ÿËBàóz¹|ùÁ`îÉ v»bÅKbúdU gž`ß±tDVÞ€¢¢Ùl-^šhÛÿ¥Q*6q”æ[óæÜåTÌ£d5§ÓMÿJɤ¼ò#ë¾ÃàÝk©%<‘O‰J¤P8½`8ÏÍÏÖaÍñþ\’LàòiŽ\HÇ0$¤ÂÅ(˜7cëÝe2æž8–½¼Ÿï‰þm®ŽP8úëZÌ+Ìž/Ãü‡æYÏ©Õ<ôÆfíÿ$,Xø[{ò³½ Š¢ 4™ëf²*p+ý ìá¹ú‹è·s7ÍJ$±ñãêL Fˆ Š"Žh¢¼z,;Λ¥ýøM›dzŽæ›eúÒDq$P @~B‰%éÚ¹:Ý7l¦ó£¥¨ÐèVOébJl2ý/<ô=F.eÁ]%þÚ„C+ê ÇÑ Eraÿpذ‹gN¸Éóx ò/6 aœTªîçäžÅárÈH쳊‚DM(J!W¦ìØÄmŠÍŽp³cÞ†ˆüdÄ{žEÐn.e/ë«÷6ÏVži½·ìâñÒùØùYu¾„ûã¹”.š 玧â*Vˆ¨3Q<ùÓ¾ºÛ†;$°i Ð9¦fõ@Fþ5Mì®BÔî÷ó^ªIflv;2xŽÏ®‰gÎÒÕMyò¥DØãÈ_ JÞRô|«)w¾?›PÓU ` IDAT³â+Z—…;fRD ¡ÚíàMcÍ÷Fv²fd‘L-©$îÔó¡"0ÑT5² ‘Ó–+Û¦¨ BØ’JRîž¶¬šû)NL4‡éN!=pã$í,™†æ¯6¡ý]Ýè1b-È¥™8ã“8~Ù‡Ó¦ ™)HÑhR8/qfç| ·Û5¤ç ^ÓBCÃŒÜØ$Ã@APµÍl¿ÿyî_Ë‹O>AêŠí<_8À ²ÇQT|>òçÏO‘Æ-©:ð~>1f,-Æ­çÛû¢qÁfÓ…N†õž%ÛȘІ4•júHñ™ˆÈyEQÂr’!†¾ø"ÁW¦óö£…0‚ö˜"Ôx¥Kú5Â’Øìdà<ÃÍ𽤩cK,ÉmÕaõ/a‘gÒ{‘IsLÎï¿€°Ã&Ü\NÓ‰-X’"Iw2g÷RJÛü(v—ΦÉsr\#mÑIÄë±¼µö4Oæuc Íð‘â ÜÝ–ÒD¸’(^¢†'„4Å3×e«È ELÊ>öîÆCÙù@©Îí¿ø’0Ïçc×®T¸µR®—ìܱƒ²åoÁãå|E#xq33¦íB±)›ŒU#¹­+öÌçμÑ虩 ÐQ¸’0°»¢‰qÙ1‚~L›ƒPF*~CÁK”]EêA2Ý>@!*6gt,‰‰vt¿‡Lo€€?š^ ÷àÊ›ÿ#ÕQº ®ø4=ˆæ°£Õ~šw¨øf8w(&—Mà÷úPì6¼™™˜ÂFtl vUò{pû‚Yf0BC£^âÞÉùéß¾éÇ7óËF£§ BªÍIL´ Ÿ;Ÿ.ˆ‹‹E»b³_f MÇo qŒ à  ѱ±WÔBÑìĸœ¸bˆ2%~w:î $:!Ü©xuP4ÑvÈôÄÆ¸0¤‚Ó®ò¹Éô…@¨¸bb‰ÊêŸÃ†7#óŠút¿‡L_Esm誧&¸3ð³6±s›+–§ !Lü7¾€ŽbË¥\H!!!&'±_š¸3Ò™*Q±±84#è#ÓãÇU°*c†V@%œ匎%Ê®òùÀáÀŸ‘Ž.¯-çC*6b\ ¡â´)½™¸ýú?wÕÂ…¿ þ#1ù2òJ9¹“Í›Ö1}ä@ª?ñ)=Ž»óÆR".=‡ÓHÝ=†Wß݆f{"δ£lÙ„³Þ|ðby>hø0–ofõ¯?òöW?4ùƒ»S„½Cfú!6lØÄº#xcàJjV(³\G*û®C§³}놿օŽ;)‘OcëžKxO¯ SÏ%8¢4®]>šß¼^ ˜´‰¥CŸgèéêÔh؆Á­à•g^dù¦-üòý§¼?o5" I“¸°|1ÛŽž$5é1úÔ?C÷nï²~ëf~:€Aë.áTEöõ’kìM’£G%ã3Øu(•ô½?òò€-Øá隣+yiØ/ìZ5™®“ݼһÝ[ÝÃȇ`ØÜ lX:•wßþˆ³~%»=Ù2CT­û4>xׯ-cÛú…|Ü£K/Ù²=ÚW8o^WpŸdã†lX:ž»Lâ–Ê5°•ldz%7Ñ­ïWlÞ¶±ï½Æg;üaÙÊ/º” ?ö2ÏqGÚtÞú~ûv®aÔŒ­ ‰C)"SSj/•‡#óæ³çè ÌÒÏsOƺžÄ¶­kѧ#‚]½ÉöKÀÔ •|žã‡÷Ñ»Iélâ'Íj<ÆÎaoóíª]üðÆk¬)û2OÜy;o5 òAßÉdOòýCHµ©H{iJr‚5G/rzËæï:‚¢{?r0‹ö]F˜2¤“¼QÊMÊ8ܾ G·³iÓ&&ü”µ)åy°d mŸiÀØfùtöz6.ŸÁ{ýrÜ«\aœeÉÍ$©P9|Ëæ±9ÕËÚ±£X2Q„Reâ9°`!NgplQÆ»kóÁÃ…¹pæin·ÜÓ–‹ß¼ÂË£³}Ã>éñóÎkÙ¾tiH¨Ø‘‚›†Ñí«9lß²Ša=;1þ„ŠÍÅÙ)/2jÑæ¼×Š ñ÷P¤òót­²Ÿ_ý”[71aÐ ÞâÆ©^=ð¤”ãk1ô…X^oö,ó×mfáOÃygÚ4ñ¦Å´¬X¶œ+W²rÕN§\5E `aOÄ~ù0›áâ¥tÔrÍ)Ÿ±[©d¢Ô<”¸£ÿÉO‹H)IHH¤êÕr=â~ã‘F¨RÍxkà[ôíÛ—×ÛÖbåN;üB­ghŸä`ÔqB¨¬óŒÜ@´êãçþÍÑT;ÕZ½H}WŸˆÂ!OóÑ·ãP5òßñ$+N‡·Ue&?½ö šj£Zçï *͸Äèך“Mù]Xy^ë¥_I Ûu fãɾ#höþ|œ[à=ëE¨ùhûÙêV{ãGóè­yQmvêõIFȼjMFQ®Û[ÑçÞ¼óÅ8šÇogÿÙ bã¸7(£¡Ä§÷ôƒ¸ü»¹·BªÍަi(ªÆð½3žªFï%>TU#óØRšVÌ‹ªÙ©ûâ7d„$B(Ø‚yµn1„šH‡çáÕ¢^ÙáÀ¦Ú9¿ý[¼4 áÝÁCµëðj‹jØÕ(êõƒ°©Øƒy­~2BÍK›!ŸR·òýöÛq_F³ŠùP5uº~MzHp|Ñpª´ïÃKu‹£¨yh?ö 6{V¾@uÚXÚÿ!¢m¨ŽB¼òýtTŽ/þš*í^çåzYåãYF™¼±á>«Jt¦QÐÓvðB­d4U£R‹~wƒÿÜÚtÿ °éçÔ²2ŠK“ïS/oI–¦¹ÐÓwæ”kÞ—cnûøbî}¤%½®€¢ÆÐôÓuhvÕ"ø,üIþµ»QhB£êsx¨ð/ZÁ±`qF.;ÈÔçÊâS+ðí¯_"ù˜Á?§ÒoÚ7Ô¿%?BËKï7[±|òh¦ÎÛI¹W&3ï“ûÙ8ãG¦¯:FÅÊ·#¤‹žiE^§¸¹1€bµZ0°)Ì›3Ÿ¥ëOóø жhI|:e •Ò×1züLRŠÔæž.ºú)wÃÛ_­¢íÈát|´*2h§^‡.”‰“ʼïåýŸ'Rþè f®Ìøùc)ez¨7d5ƒšçaöOXyBP»L^Dl1ž~¤&HI¡ûÛ1¤IˆQ_üÀö£<9b]«ú™<þ'¶yòS7Ù…«XÚÖ-‹n˜„B.vîÁíqúMõ7**ЏØX ×zŠ·»Ô­#fÇ>0ƒ&^àÍi#iX© ¨yi?tÝ’1zÖ^^8“…‚äkñ>ë~lÇÑùøiÞvŠV«K ÷´íJ…<€O“–MˆÒ$Ñeê1wÖÇØ¶ÏdÌÏKÐn„òQ’*­ºó` Ã4p$”¡åýÕoªí¦))P¾}[eéÜE,^¹ýf1棧P‚*]Æ,¡Y¾“üøãÏÔÊQ¿¨JBÅûx¶f!‚º‰T©ùl7*& ¤ˆç½ “){i-ã~^„-!GTQžjREJtÝFíݸ7Q§B¡¼Qy?ÿ˜ÄÙP,ïMžÅÁ-Œ?óùjp_A‰~;ì¨Bã¶¶}èÔ°ÑQ1ä-PˆÄXñ…ëÐíùäOˆ%¶l=¦Û£s~bOž¬Û WšúCçÑ»ìv>þ`,Å_ÿ™Þ*#¥‹ždïÏ_1~“A¿w?àÞü6ÊËÇæ9?1fî1úM›N‹<¾›jŸM±Qý…Ü—¸—Å‹sX¯ÀÌõ“©g'ïCo°î§Nœ^4‘ ¿l¡@µûIP4î}®;•“ÂÏw¡ÛîãÉÊyQ ÝÁ¨õ™ôÉ'lˆ{€/ßèN5@µþ£y¾Èf¾új*)Îò<\¾ú9C>̨Õ'‰-~Óg}NÜž_=i!TzˆŠ±pÛ“]hZZÃ0 ”¨Â|=m<¥Ï-gô„Ùd–¬G$Iñº-ùxìpB«'°F4eÜÈ~Dë&í¾_NëR—˜8~2{âÔ/j#¦ÌÝ<[;™n EѸs7J«~j~°Œ‘/”fÁÏX¸ÇCòÅ0nrç¤B·×§ÿÓùX¹dkÖ®eíºõ»¬Q½ÝËÔ+ª`š&Ñ+òT `ÏOŸ>O°ø§˜µt/^Y‚žƒzÒûÛÑ…WÉzü¯¿ˆ%"Ë}¦ØÔTÞéÖ‹šƒ¦òúm‚ ^AÉrl EæÙ8·}2ƒ7cÛ©³Ll[œí!ˆÑ<|Óêqv?8šôPuCjðé[ã7 ãøqDƒœ:¾™ò¿â‹C:+¿èÃpÚrðÂyæ÷Œ¦ÃÝ8¡ÛQ5°'·à”ÏÏЇâÃ+BøûrV×üŠó©ûhí[À.3—rŒþmzÑrìnž ®/¹Ž¿ë<“7zÞ~óüäÒ¾›‘Ýn'_þWK)%½{¿FîÝo(ŸkÛ9oî\ZµiKFzŠò\8‚Ë/rðàz¤I®—Ì™5ƒú÷7Äëñ\UŸ.˜Þ®}X8¢ QBåºÈ %ªQ}á9ZÕÙ8i ÃŒ–ôW>`„÷y†t¨ƒÓvšf…ïãþ… ˜ùÌý¬:álwj`Þú4G¾J¯FÏÓsÊ\*&éŒëØ„_Ÿ™ÂÝ?=NTï)t)‡ª¦e¹Gé¸j«(‹óëc¼\ÍÎ饣xr^~6\‹g<Ã3óhï"ê=ðãFÞE¥Úï`*jd«W“Äfsæ³Zx}B=ƒž¢Þʆ,þø.2Olæ~ßòú´Zךš¢ªJdn1yòûCŒhžDêÔï0‡™‹¿¡T¬É躥XñòÆÜ:’تoc\Q_Âó³Yßt7ͦ%±qh Tõ¯ç7/s!)))× k¸ÑÏ×#7$ ò~ GÞtý~?Ë—-AUsTðz½ —שOæ^.÷kå"QYÈÌ̼®®ÒÒÒ0MóÉê÷ë¾òÚkuòçæïíÛób·n¿ë=½|ùrîÄôzãâ?×aš&ƒ>ú¡Ÿ Éu̦¦¦^§]¹Ë3÷fÝxl_/çÆãýO>o¿«ç›C0Ìu\ú|¾«¿'Ÿ¬saÿïù”¡(lуîš²jeWbõLL©€¨JDnB Í ¦”¨v¾ U¨2ˆ× ç²3ò1öÂaÚ$…š1Cd¦í‚¬ü Dø›H4E!=(Ð?î‚M€@Ó®1x„‚†A†® *adâ7Aq8È—§«/,¢”b†ƒðýi\Šä„m:-ï­ÜUãN‚UëÐk×ÏŒY{ŽXí?…Yo·ÈÎyÒð]ÜÈ«­úÐã«åÓ¸j·*a·“7¡.+/-¥Lv}l½Õ¦eòŠHª" I6ÜÍ ºi¿B÷YsAøZ™!UQQ 7~)Pì’âîeååå”U#õ2Ø6g/BU®>föˆŠŠ+s6-ŸÂ§;ÎÐì–>lS3kÜiYå"ñûŠ qy1½zæËŸ‘×Б6 XíÝÃ=Žˆ.C^Nî]’C·.Âß¡Ð=øL°ihT`•wµ®(wb÷¼p{³%$ÿÐûÀ‚  þÔǰ®…Ïï'555×ãzÿ¯z™¥¤¤ü¦ ×'øoddd^ÕÏëüÿ‘ex妫üÿ=ÀuÇ|V?„øß­U{½Þ\Û•––ö?m×ß¹ËkW0ÿì\ù?yÖ;žCynÈa¾ùü”c{9qò§Îœ#Ó(@íÛ$[×!ޕƬïGã1uŠÜÞŒu?|ÍÚóVŽù†Õ¾ "¦o6WéT¿3kœâà¦ù 7‹`n«Pi\§ƒ:¿ÏöË©L~½+ ·æŽÂZîfœ=§jºèÝi§=çþâŽØìÈmh›¼œ}ÇqìÔ Vü4œ¯6§âT¯\©ÞËœ;w;fóݘÝT,EÁ;Z³ï›> ùugNìaâG}™ì =[tÄþæb:ßW‡Ë•“«aê˜%ZÓ®äJz¼1†£§N²rÒW|µ9Ç5q'ÐI¤î].ÖÏXOL‚ΜO>æ‚bÏ] ¶8ž¨Çë?ç”ç<_wïÏ!›Y¢Ï•YM÷>£9zò$«&ÍW/ãÐn8¸ª‹|ù’pïÇwv_¹ì}uÕÞ]´oÔ‰òΥɭy±;P¨1}ëæ…¶³÷Ø)¶ÌÏ—‹öa»â«Í÷Ö¨Ä'½†²/#ƒñýÞg§jGlLßúGx¡Í p¹"åryÖdbÁÂß‘ä[‡uX‡uXÇÿº#?^%l.®F@œçµVMhØø!?ø>þ,Kwh2r&é#šP¦Zì½F…Äò2²{9:Õ¯Éà‰ÔŽŠEA£Ñ—«Õø­ëU§Þ3oqŽD„°Q¸xrvÂz|áâV©ÒñC~|ô"OÜYƒ×cÉ¢$è:yK–#3¼Êa‹N¤DX Cå¡A?2°àî®Ú”3¾LuU'ŒåµÙë)¹c0÷Ô¸‡Î_¬ @œ†™“ë£`9’ô§æ]µiØâUò=?‚nuŠãL¾—™c^bf¯‡¹½æÃŒÚ©QȼÀ©¨hÖ¾u?%’KPªì-ü°Ë$>¹,…b ½fo¤ìîϨU£&/ [FþX5*ùc ü¦JÁÒe‰1 ê}9—j;S¬äƒœ~` µ E°S´XaT!R!1¹ ßûw‹Í£fÕG8ñ`îRuBÁzÎÞÄ-û>§ÖÝ5y~èòÅj¨®°\ÂùKK—#A‹ìføšñã°:¼pg1êõXÃ]'^¨Q‰”()§R LY\—s*!³_ªM‰¥(S¥&³öÛxvÚ^ž¶Ïâ{îâ‰>ãp¸œ ¹H.œTiÛ/k¢qõûXY¦µm=h§ÝÔ½´rÌ—{} v—´(’ ç윥¯Tò;,O¾ ÿs'ÏÍ\““ïóz9p`ª¢Z’³`Á‚…`ÍšÕtîÚý?“Ÿzù2 ÌCSsŸƒu]§}Ççqgº³ë“R¢Ø\¸ì׿H‚~? ‡Ã0Á4ðû2Ùw*•*·•çØŒ7©ÒãÛ¤pȇjs`×@¢ƒu‰Ãi'Ç‹kªoÉiw`·)`ü )°¹\ð2%ŠjáJ|!óâ>¶Jqß-¦÷ªÃÛ'_`ÑmqH°;쨊i ÐÍpîC¸oœ¶y˜z@HGJ¢i8ì¶ìm[A‡ÃqUEÐï» 5ä#`„wÒ±;WÕg »*ñu@`w¹0^t©âp:P…Dé! „LÁ@0¼Õ¥Ó‰òã=€íâÔ½ÅŬÞ÷òÆÁö,ß§iþ¦>Ch8®©O¼„Ìœm“U›‡MEš¦#Ä*•«ËÃÛ•Š«ôîÃJ8q8Ro(D—‡M%bfža[j,u*åeõ'Íi:¡;×ô#N]§œB  \Ìå‚€— É_²rhÅä[°psÐþèƒU®Ü-–Ô,X°`á&°wïÞÿؽ¤i’'o>:wévÝ$m)%>¯ïš˜pÔýxõëÎìüW‡U*ÒÇôwŸä¾_]´&ãM¤¸î#(Áð…®²=ÙÁFÖßW]NŒÖ#u !¦Žß GÛx½QC¶œR²þ‹LžøN@ÁÀo7|Èé[Ÿþ[ÿ• ÿ5'ýþ\BH¾H›Ã+ ×Ö‡Ô \AXC~_¸̰‘pç,fËCøÃ„;t7¼ŸMg¯Û…Ÿz—̵×­OäÈÜÌ­ßÒÈ¥è¿ › ÷3ðsõç%03G3Î1¤u}îM#Õ–Ìœ÷&‰F~·œÈ¥½,Xøü¬—ˆ ,X¸™ ó?w+!¦¡ßTŽÑÿÍ{*‘Ž|¼3i;ƒ4¤×ã!hÈ¿,ŸCJ£Øc¬9ÑM XLJ!ùGäHibiʪcOÿ-ú'¥ÄÈsÓ¶žÁ¦L3„×íE7±rz,Xø'“| ,X°ð¿Á‡`…we xÝþKu‡÷òáÉ ]ÝñÒ›Ôñdfü-ún¯×ùÔ‡ ÿ(–,X°`Á‚ ,X°H¾ ,X°`Á‚ ,’oÁ‚ ,X°`Á‚‹ä[°`Á‚ ,X°`áOÁJ¼µ`Á‚ ÿgX;¯ý{õk§ ,’oÁ‚ þÁä^Ïëeÿþýø}^¬mXþ™°Ûì”*]šÄ×ì½Lì× aþUž|P 6O›ÅôiÓ˜4}*gý½Í%ÁÅu³™5}*ÓçÌbÁ©PXÿÑž~x=&ž NŸÎÜŠ#"HÍá¹6Þe *Zgf¿'h÷á/ákb+3fÕ*^®ê"¨ÿuÄÁ{r7S'OcÚŒéLßq’ÿ†#\Q%ÛgÌbÆ´iLš2‰“¾?§!ÂÏ\£&í‰ÓàÒáeÌ\wE€Eµþ• )Á—@”vcÂ-%hQ±Ä9LSbM Êö#êÿíP1)AQE± ŒÿÔüm…ûY°`‘üÜàŒŠâ¹Û« ¨ZΡF «ú IDATi(j&^ŽBSD6 ”¡t֭߯•üMF^R×RFEÕÙ·|!gÝ©»Ù¸n+!SæÊdä ¯ІçølžlÑ‹½Nš^Äøîµ±™¡+î%ÑC|^/׋?Ĉ48ëcA¼‡@PGš:~_¸Œ×À0% 1õ ^¯S_U%è —óøá~˜Á@ŸÏ›}O¯×‹?”Y­úÝW zоg侟‡€¼BíA/O¸}+”!Mƒ€ß‡×©×ç'd˜9oÖß©)Yõë<Îx °— Ã½~?VÜô3ùµ–´ÿf-J2lÙ2šÞGà ‡xXþœ6y}CÆ',Û€ßé³C‚ àõzÃ: êÙ2Óý¼A5¢Õ â‰è×4‰¡‡øýáòžYuã&Ç›I Ò^ǃÏÀëñbdÕ©iWéݼB¶¦Ì;Yã-[ï2b(")]³¥£@¦ñé„UMAX4ÿÓ4ñ¸sÆQÖá×Í«¬>gT€O*Øé´(ˆªˆ›&K»Ô¢ÂãäI|[ÍA»Ù^Ô?¹š•ΑuA?n_(;Ô#èóàõ‡Ò¼êºëRš„|¼!ó7÷Î:„¢3«ãÝTvUU"¿K¤4 x<„Œ›«ëßt\9gåvîðáÄB¡ëÊÜ2¦,Xø—’ü€ÏÇàó8qâk6D­:˜—β}ö‡þúu^ó=¦®=ÔT@ i!6þü}ú¾ÏŒm—pÚv§Âá%ãx§oÞ>…ÓA;×{W)šÂåóÔÿMÞ4’é v[41Qö†-!9¹r$Ýó,»aq<Ö ßt¸#Lò„!pØB¬ÿéZ=\‡’ÉÅI.^‚ääâT¸ó~º½?–K¦@vN­D±â%H.^‚–ßæƒžÏP¹d¸L±rwñâWK@œ˜ú>… –gäÙpçB—OñtÕ"á{×éÄ?œÙ:¦µ«Q&¹xö=‹%çöÚÓç‹dêâú}xÒëÁŠá{/Aç¯gѽL2MÇîʾlUûŠä)n_§i©¨ª é9Ä}ÚS»jyŠ%Gê-S•Þ`áá6ÛïdHDgíÊ٨䢔K΋”¹+Q³øå£ötúr޼wòÃú´/m aƒaÃfœâ»¨[½BN›’ËPçÑ6 ™¾œ`ã2¯Ô¯ésU&.ù‘ŽÜC±äâ$'ç¶ûž`ô¦L¢5&Ý_‚»žûŒˆpü³ä+–Eå÷wbÂËOsÇí·†Ëgé Ä­Üߢã·\Æi»¾4›àÈü!Ôˆ´7¹Ìà ~»…ò—fØÉ°<ŒÌËúeBÑдœCPÔ«Ó4UU™Ý¬$¦¨ªŠ&ÄÕרY}°g‡ô唕 ¨\€_ÏGêÈ>—UV„dñï;rÓW–ìV¯^MµjÕhܸ1^¯÷†å-X°ð/"ùRJ®(bbbˆqh :‰‹!}Ï1JÞûm›UdR÷&ÌÚé©K¦2âLÚ=RŠMdìy'§ìAý·wP¿uîðŒçég‘!ÕÜ^'dìšM£.c)÷hkI>H“í8hËùPµù0üêïǸ©gèÛë-vù4ž¾’ï^i€f ÂDJHÉúïòøKŸ°hËQBW”Ï8³—Ÿ‡¾J•'Ç G;"†‡gäüš9#òãR.ë‘|g˜<°#DÇ&­åþêt%&  ûò)v=ß•Ÿ[+W¡RÙ"(À¥£[ùî—ùdÑ>ì¹Y@B!J;Aïúµøq{-?˜ËØ>R0ßõå‘cÃå8Gߺ5yûû¹¹èÃ[ˆJ¥ó@àk~ùžö4`ñ‰°\®ó–ã<;W§P(ñ Ä«\‡ãsy«´´ăÿõÜY4)íÄ’ÙF–Ëq™wëÕàõ¯f²ÿ¬ûŠÒAmZÈûÑû‡ÝHE ¸b²²RèÕêfm>‘C–®bà³Ùí³] 溲(oG!ÄM[8w9“f8~«ÂPÚ^ip/ßÔx{ß¾R pòÉ“µ]«f_{ÿ¬T¤Ô1ß<–Èîa/2âhø\òÓß‘–q†‡.³űľ‹‡5inx ¶\%ª"½‡"¡O•¿ã’ïÚtc‰½Ô“Ìß{–s;'S;*ü«'s3k7¦ñÄüNÍüˆ„ˆ-Xºÿ̈,t¶¾Y´ Öß,àœ×àÄö•Ìš> û÷ñÃ3"÷ßÅWã¢ü†, Îoø–'êÉ ?Ø’k1qöªç±S á‹¤|ô+ñöÇåcÆé°Þ=['P2 ¦}Ѓc~öÞ™s˜³ûwpæâaºVL`÷Wo0ἊM ëÀ4ŠÝ‘œ]ûÎMç@U,_þ?BE %âVöütþrçøáÃÔo7 é²£h:{6»™¿ÿ4#›{éöþDŒŒíô|ÿW†¬'š¼ÏËÊ¡ŽgK(؉Í¢„tÂ%ñ®:ÅyŸàÎJe)­£KÁgãëQ:>woµ;å<¥Ë–¦Lù¢è^½ŠÉÑÑÏÒå‰iÜìFå’­SGð}×–t¾Õ‘ãEFÃtogÃÞðU±·V§C£Š¤_JA-Ó‚Ï:¾AýÏO°eö:B÷=pÕ]+?ÒŠê•AØ4Ú>Vw—x“/ Aü™™²ÃÜM2ÓÓIÓB„·YÄF)ŒìÙˆñëOðÐM‰A¼Y6Ïžcd ×5½9´m¤‰pÄñê׳èݬ"!·‰À—‘J†?'Ð=äN#®ãÑAÓ¼Ls,û\Úê©VácL fÀ_Ò`Åæ½„x0÷Á#èddQþ¨x”›b›©|ÝþEZ1вŠ3B„ ±tåáì«îì÷ qùRŠö¢Þ—˜½×À½÷0ÇÓq^yO]G}JB6j#žlèbÕLR¸Ó<ÝvÒ2}9ñ©~7¾´T|FxL[,ÅÄ&ž½ûIv_  …0¥€PZv —öE…¯!8) îù!ì·=ÍüŸS%¿Ó4A÷“áÕñ]¡wwZiŽ  àTv3}qD?º‡o_y˜ñ½$BxOgFîžqóÏÑæÙ|ˆP8Á›]{æù E¬ÙíŽØëu£í¼½ Ó ˜ù¸`6A’{PØe'ññîèm§rjÏ–­[Å®úw ¤?‡{Ñn¿–­ ŽLâÛíçˆ{¡!Ÿ#ñ?‡QäC?¹—ko#Ÿîü¡£G =u7[6Þ*4âü/Œ9v‹»ÔÄtêÖ’v+л´ ÿC­y¼„n¡q‘sl8 •tƒ;HÄP¢HÙö=•žiŽG÷sñl9òvW;5ä³F¯°|J’ ÔL¼†IfZ= –nZÁ©¹Ó¨šüB•œ¿”ÉÞc>*ßjû7ZŒ¿Ñ—iš¼ñÆÙq÷-Z´ÈþÛ‚ ÉÏJú~~ÝŸïz·£¦r‰}Ÿï'X8ì}¾¼g{.y©ãððËü“”kq7w¯Á´ÍºT„P€ôLÿ »WºÉ Š•®Äªõ©¼ÛúœÂ #%»SÃÈ<ËŸ‹Bùâ~×›©8£(]¼÷Åôíç•{jÂÒ¥´­œ€4MP2”CX£œq8´ïiÞRI@˜äÝ)WŤŠä)ˆ*ÂËÉöGNÓÍ-w ›Éˆ÷ñÁì‚Ä‚ÉäKp¢™\NÉS=˜½cÍU¢‰¬`H R*7½\#ÌÝ9@0õgÒsÎGÅŃ4QCòº/ùð–1Ä—Ó—Éïu7ºÊÝ=¶‰ýi:öç‰æqÌž8ä(CJ„0Ió²¯/V 3Òi¡8pÅ;bþ·/¢BQ0|)üÚ#—2DR‡YsrÉB¡ ýé¤y Š/ˆ©HÄ5þ®‡ø½Ù:às£Üú¿vXL­{;²tÙ7ÜÔ‘HB~IÁŽ  BÕÄçõá²û“ ßGȘ!?FÈ$mï—tu‘Y[rKÌAª–ëŽ/"àRøž†\Ú¹Œ#çŸ!6ŸÍéC— ýü’Œt'ý—ì§÷m±9_&¿þ¯?†î·ßŽ»GÀ©“§(T¨ªª"„àÒ¥KÄÅÅa³Ù®™â¥õ¥[ þ&øËöl4ýnŒÌ¡„;y§C<]î»—ÇžéÎü”…@8£Rù¾Wkî¾çÆ%udx‡[xþÃÁTœß:÷Õ£~ã¦ô> ¯_F:A$&™™¤4¨Ö¤Ï„¦R¿î}Ôkøíz}Î b¹8ùi|þüŠúût%ñîwSy·yV¨ÃIz>òãv¤­ &ÂUŒ¢YþÙËðÂ!!v—ÉžÅrˆUáRØÅ5ÌJQrcrWÿtEEˆùT±63vvJ„´ÝÅÄåÙ²u [§¼Kœó÷'Øâ¥ï¢T¼‚ îÔ”7fž&*Ê–+ÑÌúþ€” òçØ}5ߟÅêÅs™7÷×ð1ËV¬bÑçí¹¾ÿËD¸JS.Êä¹xŸqýöÚn{ž% ¾£J¾°®N¬þš‹ƒÄ„;¡Q")'v~ÃÆ Ø]ZXx¦‡ËÇ=áñy)à´]ÓÃk¾q ~?Æ@DB\² € +Wã1Ãɽ¿`ãÆìØ»‡¹/•¸ÁèO¤ýs÷"sßO<øPkÖ “ñ¬öe @Én—İ£BÖŽKQyùpò’ùÏý•‹³fÝZ†?]˜`ÈŒèPrfëñìÚ+V+†åûg³|ðz|”ª|ù¢ýŒÿt2™B oB,ùî ÎúC¬Ÿú%J¥ ­Ø÷â/±p7)—N³xìpæŸ!'Ñ6›ÁPºÅ-`àç¿pþÒE¶Î›È¤½nlî£ 2ž‹êo7CÈzn )1#‡¤î£ò“ƒùµkˆÆÕš°ÞÞ¶Å7ò騕ø2ó툩Ú}‘'Ê)hÑ·0wÉDò8¤«0/}5ƒÍ7°võræLDy‘FÁŽ+ÙûKO\Æ ¼4ÒD·¦ë¨5¼þp˜¸IÏ>^®÷£„Є‰u+÷5ˆ{~Ž®¦çÐéx‚>öNêKëY¾Èby´uu”k—6o°Õ¤”vb"Q!¯CûŽãóE¶y9xÝL%Ó$íòY>ýè Ò}¿ï¦-Ñ%³ú §0²}Þùõ R„w”ˆKŒÊ¾vßœÕ\ñù|ÍhžèX+ûÜÒ7Þâ½(ÉÉÉ$'#yšïtäû{¯?ÉK´BÜV3Ìòϧíâb¦y]ϲ ‰«ð(ó¦~JþÈŽg6Œ¤ÉýÝ8î‰Fý¦5²½Ù§†>Å€y' …Òøùݶ,>1lî¾¢q~—ÚæÒ‡Ë‰ˆúøòmœñ…·I ™¡dŵ›œI BÐÍÅÍcx¸÷ž2°j]Æ1óÍðgß½ñX»Þ\˜(€”6bóDtppבÈÖ¨‚¢4-Ÿ 'jèžËL™²š‚E‹…uP¬0ž=³yüÁ^\NŒE‘áN©ÂÃò%YÉÅ·òt!ÚÜþ©p8iаMO‚_6%*_eVÅ–¢XtøëѪ-–ÊÕœ4([˜ç¦ÚùªïS¨ñU3ªc:Ô _á[èòí6¢£›3¼ÓŽÍ鮘ô¼ûË|ž£h‘d¿2S3ó8ßœÊe¡]çù—HSfo‰j#Ê¡4w¼0Ž_ûç£Éã_ðòò¥G6§@á»8_çmzÜW‚ TpØÕÈöš›+ %ußûˆ¤±÷âRï`Wé—y:áW’óÒõÇã”úìu¼Õׯ¿{æä-.péî.‘FB@R %DB%ÄBDD1°øÙ„´Š¨  "(ÒÒÜ83³ß?ιÉ%_šy`>çÜs¦Îš={=û™µ×*Si(6;6tÊwyŽßÇ%2¸c¶·Óý¹!LìP‚¼å¢Äý“ù¢ŸÆÕ ‘¿tÞ[åÁfå:N¡™™úÙ0 Âá0Fƒ (R¤(Õ«×àµW_#!!ÁL¡iÂÄUŒ‹®#„]#¨Gß¡àÉ„;Ž„<èY· =L¶‚¡ôp(Ñ„ÃZ†0+sî[0„ Î:ì<õþŒÁÝxeÑ`ßÔãë ªWˆûŸ|•ßÖfmªÁoo¦ä›Y·¡ûKŸ3¸¼N8¤žÛ`H³Q£Ã°éOðgÄm5T¹ý)–}ø0»eø &o£Çeˆ%ŒŸÅ"ÐOS Jêa,7Žaå?-{¿ÀÑ€äÅ·’oþ<Ô$‰Š··ÇñÚ*À¡™½(: ?Óví£gÇ—˜þÀNýo9º÷WºÔ,I|b®4QÝ¿Éiì*$BZixS{¬?Îdzï?vþw‚Š•9¥þcØk毥Vnëñ18¼~*]úÅ3ÿ“¨Úäæ?¹†Þ¾ÃO ã»Ôd|Öí 6âÙ'G’páµjÔ „RC ¯˜H¹¢õÛFµhA u;uøwò`ŠLÃðy¨Ñ 0üqøô×6 Õ£3xq÷­Œž»ïšé4íaå빯RÅ5;7†¿W@Èͳ=jó,P¶í#,›1†Öæqûò[ù|³Ÿ_>|˜2S'1^%5-}\e²ˆÿ(©[˜¹)òDÃÙî.Åhèa™ûÓ#W1$ª½ Ÿ¬ø–€Ç‹W›yÀ"$¡Î[ãÁâãÁ¦Q'>F8R/€" ú°bÏ=¨t=„ß뇗¿c¥á#5Å ïÒCôºð…uìùk1}Å^f+ihø½>´fû¾Žx]ô“ÂuÈ–yEJ(Ñg"'ú뤹B BTë7ƒC÷¸½s7Ū´ _ „£|{~ú¨#_o8žñƒ7 ?·ñëá0¡ãNóÒxúZ³tMC±|./bÒ":è~ÒÒ¼äï<…]=%^nyƒ×2ˆ+ÅOÓG¦pðñˆhýŸ?t]‡Ž–‰v½F†ßõù|<ðÀýhZ˜öíÛSµjB¡P.Û›$ß„‰ëZÉ¿²aÞméÅ…$„%=ãWÆwNX mcXÛv¼¿5HѺò݆xóÁ[)›¾U[ôaî/kxgPÂц4´hA'I8K¡id&ß †£Y` ¶~À“wÔÏþbèèšÂÝo.æÅÍ"Õa R·<Âòï^ÁžëÒ2AHôÈõPXÃú(Üìa¾œØ7ò¡{#ÛÖá•?¼Xª=Ä/³FQ11ëå×0$„*·Žý„µ‹?¤gÓÊØwjâ¨Öô6ž}gÏôitZ-:t O¬ þÝL_µ›"2ª¡kçÔôHäMЇ³j¾˜ÿ…¢CÏÝ?½I³úÙb¥Ù£SYóÓ,z5«œi«øât{ìm6ÿù9«Æex®p†cÊ>gA×¢G ¥%##¾^ô.-ËåÉö+t 1•:ñËÊ™tªš?zÞy¸oòRæßW:c½–¯…Ó¯q]Jt%žûÞ]ÌËm"S£O¬ø®wãˆ'HÓ{Þã¹»š`Ë>:$΂µxÿç|þòjÃOjšgRiÚöƧ?J-‚耂=«~ggšÈÃcýšCØ8e]W3"ñ}>Odb:RÇçqãr{ý¸Ý~P! _ ˆÛåÂíñcDC¨¥Æãv‘æráñÐè/žPdbwØë¯EÅ©ã÷¸q¹\¸=>4 Bj¸Ý^ !rÕO$dK¡©ý¤zBH"kA/in?†ÆëJ#55? ÑC¸½(4ð»Òðë õî´TRRÝhÒ àu‘––†ÇëÅ•æA“’°Ïƒ;¹wô—Û¹ÿB~ÒRSHMóa ¼¤¥¦’šš†Ç)‘GåNœ á€/™i‹#_œ ‰@†\¤xÂQë+8bbqÚ­C ùq{ýHìÎXbÖ õÉã×É“I!oHNõE Ý8HLŒEH‰öãrû‘T»“<±Ž 7ìs¥Ð$ªÕA\¬33í§0ð¤¤Fž€ P,VœN¶h±¤¦… ƒÃÚi›ŽìƒOû5dÐ‚ÝØ¿vM¥ŒF¬v'q1Že zIñ3žºÅJž„ØŒ8ui„p¥E”CE±àŒqb³FÂ"pýø!¤Œ)± ñØ-*B¸“ÓE’=6/±öHñ*Ÿ'`ØÈ,ƒ5Z\G‰/5¿.Š•Ø¸Xl¤NÀë!@ yã­H ZÐÛF #&ž»!"s‚z$G=.‘8[t¶Äåöa p8cq:2¯» àòú"EƒXìNb¶Œ¢?ÒÐ ‡CÁhõaP$S¹‰‘³¶_±˖̦LŒa΋»Bðí×_sGï>¸ÒRQ”kWSÙ¾u+…‹#..μèWºÓ‚}{÷P£fmRR’Ï˧/[ò7·nsÙø€aLŸ:…‘£Ÿ\“Þ}B@€H–]R€Ôèkúgžèzèváè~ô,îÌÕ˜¸jq}% Ž;%ùä‘N4/{Ðç"è;¹SI(à%È}¿éëZ€Ôä@Žca/É)ÞûŒô!AŸç¤cF¦dJB~!öoRSSNÞ¿$59xÒçFÈOJŽDÎ3ˆ+-xò1Eº¨Æç ã;±¡’PÐÊíoNaÙ¾¡ü™º™ißå…öù04‰ô“ôçb À“–šš‹-"OI|w.ç”yÞBH|nW¶uÒ÷ò¥ò‘‹íÂxFrz IDAT\i¹:C¤†×†7Û7’“OÞOÐçÎv3ŽëM%Ù›óŒ%A¿‡ ?ÛFþ£‡ü¸CþS:jPÁ»Ž5›4ªVªÎ­ãß |¼4çÜš¸<Ý«C×ͪ¨WºÖEæu2 #ËÄÿ³ÕÊLÎk„IòM\ÏRš£&ïÿº‹=èÃ6Lp!µÔ ¦Ó߀„ý^‚ºic—Š¢àò¸pÆ8ÍÜêWJ–*ͱ£G"DÿH»‚P8ŒÅbR&L’oâº&úIÐç͈¿7Éç…6±tüÞÜž™0qé/k×®!Oã<ÄÅǃ©ö^ñPUõœ· ¬üm9å+T4 h„IòM˜0aÂĵŽÄÄDªV©Ê?|Çí6ƒ˜¯QÄÄÄP»NmŠ)b &L˜$ß„ &L\Ë2’§hñbÜZ´3Ò0)þ5 ªj‰\w“è›0a’|&L˜0qr¾hf1!Š¢^—‰™¯Ã¡i&L’oâJtÈç‹i„‰s‡¢^Œ×Tt¯;OrÙÓôžC–qšW‘c½¬‹YQÐÄU?Š6IþõÒb¤Än·s`ÿ~¾ý櫈âf„‰‹ŠƒÒóŽ^¦!L˜¸Àp8¼9é•z¦%L\ÉkaFŒzòl —Ì1ý“~“ä_'ÐuO¥ví: õ$ÒLsgÂÄE†`þgŸ\IF×u<·iR×âbãPϦ30|ä㦱®SœKªÞœ…Ïe[!ÄIO*Ïe{Õb¡VÍZú¾ýû4ø¾3‘}qÒÎîÄ$ùפ4X¹â7úÞÕ)%G6bÂÄŦøBàóy/Ⱦq‚P0H‚…Îx;vÔ4ØuEQðy½ìÛ·‡íÛ¶rºˆ*‰¤J•*+Vgl Ò†×ãæ§eKϺl±X¸©Ysbãâ‘R¢( ·›þ^lj'N»­®ë4nÒ„aÈ‹žJ‹Â‚å»iÔ°!ƒ' _iÝö˜Ùuä ÷é‹‘å5çBŽuΊè[.´ñý?ë×þIÚu°Ùl—HÑ„¶²÷vtýÊurÁ°F•¤ËS+3G½£N _¾Dv‹Uè†A0B¢×Ob˜© ç7°¾ ,_`H‰5ÆÊÒA7ðxJSN™H¡80m(=ÖôbÍMùM¢.×À›ÝΨö˜³q#V›“X«†ÛD æå©é/±n“B‡ÅYñÒ=¼Räi¾¼»(Pî!µû~œÎÃûz°kb#Â&É?GW%Ïùú™¸ŽH~éøl®©r œÃ‚|ùò1ö¹çöípðÆë¯gÛ:ÉY¸´”’Î]ºðã?2ñ¥—HJJbçÎ<ôðÃÙDQȲ4mg’Ÿ“ÜëÑ%ë{}UNAô¹è$_QÖ¯]KõZµ°Z-Æ¥q6ª¢‚PxéÁöWtãLNóðóÿ^6gfè:ˆ,$_Qˆq:pÚmX,‚¡0¡`MÓ°Û¬$æIŒ´Kød×Ò„‰kÉ]P’ƒ,ñìÝÆ†ŸRùäþx¬Y ‚Ç÷³u¿„ ˜ü»%Ôò)E±q ù8p(™éã¿TBe+D2ÛvFÍSœr%ó£ö°w÷^Ÿ/#\'ë¾u]H¢ŠÀÐÓ·<0 ƒùŸ}ÆŸþIãÆ0p Cî½—§žzŠ?üp8Œ5Ú” ÒçCfì>§VðÃ@(ËkúH6kÚLÉå×ɼñÎ"‹PˆqÚñûüÿï[TJ‹ +‘Yž-«6Áïo<Á—ûu¤„øÂ•épG_–² ¹ø´Ý«™·-–û;T=Å„)gßJîzé¼÷(ß}„Žûûqèõ&„Îä E\¶ž3㚤¿úý~J+‚¢*(JdV¸Ãî XÑâC!þ;x€j•«cµXM5Ê„‰ó!+ø¾‰8CBPÏËS§V§üs·¤*<|<¬ì-HírIÞzwzÑ •<%’°h:šEÅi-Iõâ Á€Ž3)ŽÐ>ü;—³mß^7‹”¨ñ7Ò³„?¬GÉÔµx¢ÄÞгôq2ò{¥qòºõi‘¿Óºvýƶ;xýù1X¤j«Á%%þ}‘õ5]G7’slãgi/3…¦ÙV4ؘ:´o’%Ú@×uv{„Ègi#Y'ØêšFÀï§Y³f|ñÅÙt‹æÍ Eë !"qõY'íºŽ®i”+[¤¤k×®¤¥¤ðâ„ ,þþ{¡P4dGFâø£Ùu² /™*|V?Ø£¯é*~ÖÓË™Ró´„ÿ“|ÁI5¥«ÍŠGÏ@ {·s×€÷yù½I°*¹Œ,X„NH“œ)ÂÅ0@U¢¿^f^!`ù”·`èWt«*ØðÃn*7’±?ïgTC;†!°Úl( =LX“¸÷­ãà óàmµQe]X°Y”h££é±%±àF`›ƒxGd„TlVKÄÒ†F(¤e›-‘—ä§§pJ-“Òà–6íhÝê–“ÔÇ@ÀχS> NÍ:”,^ÒÌ``ÂÄÿ‡è_¸®MÓP4!A†}„+Þdz·~ÌôoŽ£€<¾Š ³=|t`uí‚¥OÔäûަÉÈãjM#Œ†.%zXCÓ@Ó =„R¬>I ‡xäé(æ0ŠŠ04¼þ0×j–Ât§Ÿ­8 "ÐŒˆ/Õ4 ¡i‘0PÃÈ\ÏÐÐÃA”¢õ(¿ûŸOé˜t›…Ù¸C‡¨½5Í$ùç:UÎê‘·™Bóz‡¦k8cœÜÜêæS~Ÿq_ËÌì:Bš†4huŠmCáP´m‰ŒšYÛ¦k”*]’R¥K’æJËè¤ÛµkK(Ê6 ÈàÄ™m51 9ײ| ¶è«Bfñ,™ É7r!÷Ùþ¾(J~öpjõñà-¸cÞ/4,á@"ÀšÄÝ{`郪 … Cüûác t bÇØÚ¤¤ùФÀf·£ 0´Ápf¬«¢TqbÒHÏh!"¯ª²Un aÓ¼Üts;:WîÄ ÷?ÂÝ«§’ºh<½°€4©c-Ö’)cÙëØöw"Íþþ€>ϼNÕ_Ç0lÑ4¯õú2õá8üÀÍ#~aõWÏGÕ:ðýø!<>ÿ_VAbÕA|:ãAâBÁ¬åò)ùd¦Ó4¢…‹òÞûÿ˵ƒ@Åòå)Q¬Ä­È„‰+žDráóäR¢ƒÃZ DÓÁcyêƒ;ñç×Ñã+Ó¹V*ÿ{e*ŠæƒÏRûICB ʈ ü„Hæ,C  øÑ õdXóÙ ½8mn(ÎÁ[©<âM•U]£<5ëÓÍ̬c#Ä„#}¦a`haü¡0†”¯_#¯¼ÄKJK:÷íÂèv³xà¾aÜR¯4‡7o¡Â°×if„ð‡"þÈ u¼xcS€º†Nñ%ؼq æ´Ñ*þù{ÅK”ÌxZÏÆ S±båh|ÿ©C³}>/.Wj$\'ÚÄ'$pèàäÉ“xÚcKC²jÕï.R$ƒg¼æÍBÒ³’ü`üdªø{Ö#—ÀI¸xá:ÙF=gB éä_ “YôÍ2ªÖ­…âÚÅø‘ðÕ†TòVêÄÔ÷ïeÖìÏ9~t%ç䙩Óè\ÒÅèfÉNÍŒc€›2½‘pRFÓ Iz²$ÃÐ"“G5Iá®SdÌS¸ýÂcÃòâ_ëi˜Wòó„<ôé~æÍG_ä×É· „ðÕx—Uã bEòÑ£7óãÆ>tÎg!!Þqáé)™ü»yñƒM¼°uÝâüœ8ê ä¨e&Q•Ë×q¦w†š¦Q½jµ³RTL˜0ñÿbùa_˜fÿû…Zñ0tØbùjÕ/ø¬Åp{â=÷Kvî=†amÈ´¥·#-yQb“ßzšB² “¾þ„¸<ÂAA¡NS™NBjÐó…y4Ú³wÐÀÚ®+ÅKˆk–àŸŠXJCR Û üÚ*é !¸±+ó*E›’ÚäûŠ{HXȃ Ëss¨»w/®€µmŠ•T±æ”ÏÃñøÌºí¦˜á:×#|^/7ÖkÀö­[ùõ—Ÿ¢õ}NÍE+VªLݺõðù¼ÄÇÅát8ødÞlìvÇ™­Û´Åïóàr¥Q·n=V­Z+-íôýt8Dã&7Q´h1~ίó=\G#3þ> ÁÏ9)WɲdUó/ÅÄÛ“•|a9J¥a …‚¡Ùມðó¼WÙ[w+Þ©ÇÖ5P•< xk=w±þ‰š¤ºñr×Äöý˜e-yyèPÞ¬SÇëä% Ë¨’±…ŒþC 2²TK™ñB%¼k ?îù›¿«E‘¤ì}ƒ –“HCC×ÂHÅàŸOF2àÅEx¥Š'MgLG_¹7¢ $8Ëòô€âô+[‰o»þC†Ò¦f\Æ$׈)ddf÷e@z¥ÛóQKL˜0qž÷Ü…Ýad"§.ˆ)VžÒÓáª)Y>20×4„3‰ò•“N¢MÅŠ)ÑQ)R¦$ £ë Æ— p´ßF±S¼lÅl[×pÍÜ”|5¡0ˆLÌG%éñâvŠ–­DÑ l§X™ŠËjíø$Jqñå&ÎË7™~ìú„Çã¡r•ªT¯YûôƒB!ÐB!ÒÒR3¢B¡‡“žwö9«öãJKËÖ7øý~š5oyÆ2!¿Ç[ÄDzvtŸžI'åå"ÁOÿÞJfXže8"r¢\’Ÿ7ªiZÆ'Rh‘Œš†¦©H”Œ š&oR!v~<ÉÎ4ºviG!ä°?€îKãx² mϧ|¸6@ëD}¢ãÞµ“= w2ê†"Ù„@U ¤dåÔєҡ¢(lNÿM}›Ã‰5(Rª,Eck°x×_TwD@z€Í߬B( ŠP°Ÿø†~ÃÖðá¡ý´*dgÎCuاÇÑâBJ¤f¥ã„oØqßvlüŽ^ÍÚòÊÎ-Ü’èÏœ{'/Ov)%¿þ¼ ÿÉ£I&L\,’=rø‚&ø3 ‰‚|qH¾I¯.’¯ª*þùÛ4ØõÛPÎI 9Iõ8[ &·÷+.J ÍôÔC?0ª†Fz¦IG$%º¢Ú­£ø¸üïÌ3‹VÞãý_çS@J¤ÔÑuÍŸŠ3© oü… Eö«‡qy#ï³*ù9ç!H=ÄÎMkùC(üûã4†½ò+c~ÜMb)Ï´z’{¿À·bϯ_³·þî)Ÿ´ÕËY³£.•“(wœm{Ó¨þß<7yƒnKßwæ"‘ïž{{ n¾™ü¾ÜjyÙäõ28h!níŒÇí6;&.!ÍiúUóM2záátÆd¥L\-$?Ó¶}GÓ`&®w p§¥±}Çv€˜\H~Ö¢¹…ðXs|‘åõ”Ìòâ„ëH#“ܦ˜ ¿Ï‹×«!¥‚Bæ:‡w®G/RŸ/Ô&ms7¾ßâ>§JÚ–chŠD-Ý‘†¶©Ìüf÷·.Cê®ü—P‘ ÚÑ£YêTE RfþV-(h4àîüù;ñ…[°tÓ4.mÃï‘ôùø/⦾ˬg[¨ =JÇ›§-“ícê›ïѺï|²ô-Þœ5Ž7ò×â¥/? oÑÔ„RÜÕYA¯N†”+JHÍC½*?ÌžBÐQ€W~Oã˜a-ëàQ\¶‰·9_MЄ‰KGX.`¨‹ÅbÉ(VgÂĵ E9û‹¦O3q5!KØ“ì“iU²‡è¤|[”§ç$øY³îˆ,¯—Bɇìé¡%†âÄîíš™ª¨Þ„™ä‘:†T8ôÏW<òÜŽé 5»<ÎGU-ÄïHµ†P¡\ Ï͢)o3ú¡Ôá&¾h]žyÿMnH?Ž”XDd²-d)v–42–†9ÎÏŠ–ÂVãé'™W£Ýr ¢Ÿs¹t$?§’±!„À¢ä,øuåAÀe™xk„ çŒì3’0_ˆÝ¥W9¾ÈZ%òz±m6[˜0aâz@ÎxúôØ|å, ½8×]èì’/WEŒÀLg„‰ÿ7AÌú 4{2’³Ì¾“£fF®[îßÇëoLçÉÌ ÑlÇ>ûš¾BH¶Ì~‘§”–ÏrœÔ½¿0éÓß.?ÁÏaØœO¤å9ïâÔ¶=±yãæý™i‹“®«<‹v OÑÎï™0aâR±Ál±ø‚“Ãpr Í9öÁiþ¾8$?kžüK¹\iå†n\rÛ˜0aâZr!¼VoÙEØÖp-ÍZ>ŠO„ÐYþ|[ª·{’#œ¿5wÛ !Ù4ý ¿¼î´¶õßËòM‡r\WYmKsÿþÈuÌå¤]D®õ‚öI<<ëB„x®¶•EŠQ¬x j7ïÎ;Ëö˜O ®Šq»9 »Î®Ÿ8Á?ÝrFbŸ<\G‹ E¹´•þÊU¨Ä•®WØív„¢p`ÿ¥sfV«™Ã„‰kQ²Xm8bí¬>Š_),þ{Õc$Û–ÍáÓŸ¶S® ú·%¯ñûÔwH)]M¿ý†£BK†öjÁ?ŸOç¿}<;öµZõ¡eâNf|÷'|6nèЇ. Jd÷%ž}Lþ`­ú´å×Íû8±kÏì+É]# ‚üÙÓf³#MP¿s:Ô,|R¸€=± …ãÒÝŽ‹E½Çï‡ã¨W?îÊ e V› +:sŸèÍ””Ûøqñ"ÌêÏ?bѺîۑ»»ÖÇ!Ü|?{>öx+¿®ÝIÙ½èÛ²8+[AÚ‘4ÆúKÓñž¡Ù³˜Ù?o"@^Úöº›†e³2¼w9¯Í?ÄŠ±ä¸dÏÜq<ñ{E{n±{W3uÎ"Ž‹|t¸{(õ‹X3B|›KÔxF¾ZÌ™»„¦%ÿmù‰7eøÐoyµ_-Ìé`W.EÁãñ°~Ý:|>¯i«6»š5k‘?Òù¤s=y?™?“¢qI¾®iÔ¬]·+í’<\Ñ ÂjµR¡bÅKzL‡ÃÉ× ¿0ïF&®1¨VÉŠ ·1iEY¾ûþMÊÅH|;‘[žÞ‡`û«ýh÷›‹?>êÌoïM`I£ñ|:a8óF÷â£2èÛ¹7%÷îàñу±9l›þ-Å›v£}'Ï?Ò Ë”ßhW,}@á㥻z¡Ý=*… иJi~){Ï ,ްjLês'Ž/rgÇ D|÷íóŠqü’½?Ìäƒâ7pG­–=r3ãR0uTE^îÛŸÃÝß¼‚œ·Æ‚áM˜Ä—oßC°~bz_™y“»ñÕ°^Œ8ò)“‡å³gGaý¯=Ò€!=¥@¯iܤé³#j#-6Ö|óõ;ö&ñØ/Œz`$3¼µ‹ÿvz÷Gש_Qº‚ÂÍ…íüqûžm‡HÙNÿ!ãéøÄxš~¡ÏÍ}™ùï'Ô>ňHÕfÇCù;ñöôÇi1j&Þ^µˆ³šóY¯TæÌ™É-mÚ“˜7ï¹UT5qYÉÞ.™7g&}ïîO|\üù+6¹“8YíçlÉýE#ùéǽ\¨ÌÂ9¢ÙY˜0qm’üëýfÆ­ûŠr±€¡ñÅ·¿ÓÚ§´©é¤ÍŒ÷ø¦ê#üº auÐ¥OòÅÚhÞ¦%ã6apKªÅFŒ#€ª}{“¶l%›NØiØ$‰ ·Ó¾8àÞθÛÛh?‰7ÚW ¬ªŠb‹A±Úá¿ùlkAîžÆæ:MŠæ…ùi?¸h.^)}æí:Æ~ná¹PÅÏOê˽?…¯ à ëŽylEflLœï她yrÉ—ÜXnœû m†|B`È0¬Åkð@—ÆÄä3èXÅÎüý<ã°¡Ø‹€{wãç_Ö±'KïÌN IDAT\ÒÎÃü“¤–¢ ZΨ>opËË3é]!б*`qÄàpØÙ÷ÇLR × OÊNöÚKÐÆ¹”÷~ôó^[çY‘[Ѻĺ×Ð â­¦–¥bë–-´nÕ–Zµk£¨ªi«<ü( æJ×n·_‘|˼ëM˜0aâ*D8OæÎ¹—i·5gé^?`à èT-N­‹S"6€×§!„[L„< a]æ àÇÛ¡-S6«”)_Ek¡ÈWî,øù87ÞÜ ×óÐn…ÄRT¬T‘Šå+Òeü,fuK:ýÉûNf-FÙÆ’¿q—8ÄóÔìØÀ_ên~Ôœá]‡rXB^RÉK¥üÑßl/M¬áG7$V»5êI%6EÐdŽÍvh{;«=‰”¯PŽ‚ º Æ‘?ø~ƒ ^µ"¹ª·c»(P¢ å*T¤lÉ žócÙÎF݉¼zöàsÄb3Óº]ÑØU½j„9S@ŒØ 11Û}©æs>ˆÅ¼½LœgëF"P-j¤ˆ™®ŸUŠ= ¡`Q ]C7@µZP¤¦éÈ«e’X–ßoœåo7aâ7A Ü4šï¦Hnîõs¾C•’y™»d;=û× ¸m!kCx:Ñ–««Š#Àï6¾ßZ€÷~èH- ¶LÞN¨h4 ¤TWÖ¼]‚Îwu£Â§³iPÌÍ*z#µMÔòíÉãyò”¤jQþ´dBÎ3ÌŠ­HØ],ßåKá¿—’*Û_9¶5ªvy…I»úrS——øíó!ܘtœO–§I›$ެ]€/± vUÉ¥ ¢ÀbQ{ý‘üÎ_®jŒ»³CÇøð¿ƒHöúcYòÈô:ŽySÇPÄ¡`·@Мä­Ð‚}_¤P™Šäs<)Ész¥×Ðut=L(˜Êü'ÆQ¦Ñ$bmfïôÿêçÓ}”nœ]_^ÛE[ôŸ´û¥xò©!zÎÙ Kˆå©;«_÷Íãjˆ1•|ÙF¥Ž¸xòæÍ{Ò’ïÌ®4 Íêgþè¡ô6–ÝiÆY‘\!%;–Íâî;{ðÁÚ 1Ž&èA¿— _‚M+gOÄa‰’ÕFbb6…³N/(QˆË^:ÛQ°ZRùð‰ÇÙžšE•Åæ Ái1S×™¸¨ÞÙçr¡ýn>š#‹Ð³qGdó{(òÅ#´hÙ†V¾bÀÛoS‚0þ´zdK=À¡*O¥ä…´íÔ…·KžîŸÀCíºÓð£,M‰EjHWÊ1Dµ¡Ì™ØŽaÝïâÛP·[GBö¡e‡¡¬•͘øXží×v;qû]#øùxî-?ìwã @I^ûp0 ïí@ßþ÷𿟼ú®ch¸\>$pócSøðæõÜÜz4]Çâø„Î´nÕ’^ãvðèè¡XÐñ¹ÜD‹¯ò¹ñ„%E7%áÛá´êÔ%®& ½é wwëÍ DZÑmC3$†$5õ[gR›´m{?ÿxÍwåÏgÚqs§'ñÕèÇ#ÕÒ³c[Úu¼•¾÷¿ÀFöÓ ¹Sð…"':´Ž»Ò®]{níÒåÆ2iDSÍ;ã Î .o¾“}_þ|äsñ¿=¹ë¥O K‰b±“˜7ñÎÓ¨îB`·¥ðÎÀžÜõbd»sñm16ÀiS‰±[°«‰Àa³c?»ÅaQŠzêul*ù $Ò«N^ìVgÆw*6ŠåÔÛ:lfHÑÕóÞ7‘›ÃÁ˜æõxí '}Wºî~Z2‘#Ó+ªÎ–_¾ç;w9†?ž#ŸtD²ÏµcKÞ»‘ïÿˆ³ŽU °ö»ù6­N¤ä[nrGÎ,Q•$×A´ØãÞ¨eÅ÷솷ÉÇ¡_'S¢û4^]µ‚^¥º<õ®££„¶›nMGòÒüO(›{÷¬(Aþþõgª?”夅`ËÌ'é½¥›^¼ _À8¥fcjk&Î_]Œå®ÏœWêúÛºF¾¾½eË÷¢`̆”Œukôxš%Ñ6øÚüŸ2W½½)s9Ü× ? ¡é½¬\yod?Ųâï™+õ|šo{>}FMé¦W³&zùÝÏ?Ü’ÐpYÕ1)q«Çê•õ¢v¶ÑâÑyl|4òõœŸîÈaÛâLY¹"º©B¯—Ð ´fѪ֙«¾»„9Uj(´ˆüæºÞäŸÑž¡ÃDÖvÈ<ŸRO¼G·'8©M z.óÑ3Ú—Mؤ1!ñFb¦Ñ<âòç§¥ª²âd‡Â¨¹³9ôË~òÔÆŽ,z⽞¥üàe,­ZH'·9‘5À_‹–ðM½*9;ü\O&T»“ÑÝ‹óþg»pP¾A†” ñò‚Ýœg?޹§r-T±8ƒ ¸yö7§âäV» IѧQQQJ× o¿‘:ÿáÝ:ª"̉À&É7q-@×4nês7z“ÿH^ó3–o¥r“;èØ(;Vmã Ï£J…‚›Ð¯çM8ÒujEòߟ߲dý’ê´ãžNµÐ4‰Ý!YýÅ,~X¿ò”¦ËÝ©”ÿôñ¤›Êk3éŸ$ëqÔ½¹•ÂøyÖ«ü–\‹Ç†ßJìiòÿK@µÙpÆ9ÙÿÃËô·’)«¡K9Á¶•ß0}Á*ŒBÕxÿ]”qY5í¶”mHòÏ_‘_“¡ÞEò¬7ø{ïN^~î ÊU¿•þͬÌþl1{S *ÜÔ“kg‘øª0çi”ëÑ-?-%eÇù3mû ¥Ey_~ôìsS±yOú¶®†YÍÄù!Çàùô¤8û`8ëºÿŸÖw¦mC‡fâ? Ù£a;F˜ÄÊ=y¸OmÔÓœóeüÝXgø9mËyÙ6ûo§>Ÿ\Ž+δ*f2гAÈï§×£ÐÈfgÓŒI,:”D÷{î¤Dl MÊ–#ðØST(Ü‹qœ¯>_Œ[7gŸ.CÑRúÄz>Y°˜}iPúÆvô½íÆ“Ž¡ÙÈ{³â,Óþ·×A5N7E¢M‡—§M‚›‰Ÿà°¦R¡bAj¶á>–Æo[ÓH 5ª%!:å 9I9t‚_÷([2±‰z6g㦣I qÉìBgó¶£lMÖ²9M%>Žv•¬Ùá§Z¬ `ÅâÜQ(À’‡ñÅÅqSÕ|$ ±qóQ<&ç7IþÕ †¡¨Øl6Ð5³´¸®iÜÔûnš)°ñͽÌX¾êÍû1fTI”­Á"¿ŸxïÖ¾ö S6-eËk"î_G¿«yðò kæmcV—||u_SºOÛAÉ*•lÞÄİiÅ[§Û¿ä´è7E(lIæÉïòÂÌ¥ i–—e3^ãmw2tt7â4í´¡0Bl™=œ±ßdÁÚ¯hš_phÃb:ö{‹MÂöÍ“ÔmsˆýëFòÏ'o1ο‹¾˜È÷oç™Éù™;ÈC#Ÿ¢x¢“CßÍÆY«ƒŠº™4 {ä?¼Ü%âfí1‚ÏjÁ—EžaF¾bšµ¤@¡fŒ{¦1"ÆÉ—÷Ôb^á'yºwiÞyü!|IŸòP„ÍŽÒÄ5 kÁÆ<öL½ì÷¤j7ãCM\±$¿÷Sc±Å©Ìùéu*H߇FмXÇAú4/<ÆàöI¬Z±– püïo˜±¯ îéÀóZ²x_^*–‹aǤ‰,±ˆïÇ—ÌvŒð‘M¼õÚ$ò·,FßuÏ@ò#ŠzíÕi{œ78ŒÇP(scyªæÝ%ǩ޼ýóìà½UêÔ/ãïÌüë(=Û—Å}t ;÷§áò{Yø‡ ©KJ•²³÷qÒìñt¿¹,)_oÇeøÂbg`ûRl]¶•CÉ›=Öùr—Vwµ.Åοöò§Œcp·ò,]¼Ïl4W .cŸ-É­X ¥îeù’ïøò«…,Zº‚½i2RÜãÿõˆ(óV®qsÂʱ 3ˆq8(9a'qNõºœ™®ød7—AXbì—‹3¤7wÞ5˜…`ûÇq{ÄfÎrÌýc'Gö.¥^|òøG¤œøƒGçí ±lCžxfcÇ´‡syêw/NË©,m°ð«i÷ÅpÏï0ùíûˆó㣅ß"„Ê-ƒždôS]‰ ‡Ïë.B³ç}AŸ)Óh_\ÅÊ¿+>£öˆÚ¼÷¾ö7¿ÊÜ-:ha~Žªùc¹±×ýÞ¹ ÕîÄ¢ª8cbqX­T¼­+5-‡Y¿ÍGËÛ«²é‡ ! xœÉÛ3-æq¦íŽUX­6«ƒ¸¸xbO,ä©Ï ~ÕXþݸŸJ òÖ‚­8m&Ý1q ÷%ŠØØØlKŒÃb†Œ˜¸z|_–?„Ž´VàÍ÷^$Ÿ€:,áÄ‘•Týã ïƒÛ&¼Á/õ°ú™E·„¼ôª¢°è×C¸u‰TmÜRÑÎwßìbóQŸ½‡<% §‚îñËŽ4‚Áކ©W@%¨I¤a H!Ù»ùz¬“‚ö0‡}*%cT )1ñÜÑ©<ûVïä犔è Ý Òpä+@Ý‡Çæ €5ÌÆp<­ËXÌùfW .Ÿ’/£ÊÎÙ´k2Œ?“Ó«¼ ”ªÁó—ѵv>œ‰ßã&¬ƒ#6›E!àN#$1‘¿A'àõÒ$V‡§Ý†  ØìÝl ñ݇Ëa%!!‚^ôŠ]ùw}#Ôü¥ðŒÈÄ–œûÔ%ÎØF؇×:c¸¦Õ“ÂËà ìRŸìà0‚Eç_`QBâ“ Š†a £.E—SG Kn¯ˆ÷Ÿ½üy$Dá€Ä""ÅêpÆR+ >>êGE`äài§ŸÇËÑ”Èï>²x›‚AµÌq5àòɉBàP3ê–{ù3ÙÆƒÓV#eÆuâØÞ˜ðúÿX6° Bå‹M)XqóDërË'‡ö/g@ÃÂ!ÖÒ<7=É’ }BP«×b…Bõa hœG 꼃Ÿ€åØ œBPcâr{¿¡~íº´ýh?1N+˘¾OK)žýlÒðhKÝ9fx$„£<«B‰üØË‚Hv‡®aENÁµy©Ø2b÷öhE\Ο{h/ßýºšk¾áïíS¯-¥Š—å†xá„¢<òÜ$Þœô÷uíDëê hºè>öo]Ë'?Ä·ª‡Õa½¶ˆ½=à$n·ÄÖOsG…WîjÅm¼Ëþ0H¿)ÀïJ5Ä_=JËOq¤\æ¼u+š¨È3'ÑÌö/ëU¡b•šô|ö´ à I„0ðAóøA§ÁãÞ¹¯ß^“r*S·í`V ’]ë·²{å&Bg¨(]aü~¢\¾z7·mÆWáÜ|t6M›¶¢Ñm¯Ð~ò Ú%ñ»\x¢òÒãöúÀR€eSé}kîy~%Þ[“gÚ´àÖƒ™³ßŠ Þ”øŠvç›Å¯ñÙÃÝxï¯4Ê7lLÒOP¯yWfn(Ì»?ÎÃÚÑú–¶´ïzŸmIÅ,>i„ Wžï ¹$à"œ!ixü »#ìùk7¢EE'›?ÊÕúâ®7š÷GÜÆoµ¢tÙŠT©Ó–éºP‰×†;¢€îìڰ›?ÿ>€qÆÄô‡ME( ÛþÙŇ;ìŒìY–­kb½¡"£{Vã¡›bY²ò ~ì6K†ð¥ZTìŠ å¨WñØÉG½“Ð¥ ùóÇ(ÝÃ&Êögû°²l'V|7ûîy4©?üþf}çÕä©;O û>›ÏØÃ Ë»Tê=‘V¾ÊúO¿â¶Êÿboу™ã>à†ûÞaÞ‹½±^¡Á¦v»ƒW_žÀðQOœuU6)%ŠÅŠÍ¢¢k!šDµZ±ª †¡*ŠÐ 5T» ÍXT©k„4-#…¦ÅbÅ¢*€ÄÐu4MŊͪ¢‡ƒ„u°:쨆F0¤E LY°¨*BDòkZC‚jµc:Áàÿ±wÞaR[ÿU÷äÙDf%KN @Q‘l"# ˜DÌéšsΑkÀf.¨(IE‚€’ã›gg¦»«êûcfIùîDì÷yú™™žî:ÕÕÞ:uê{ÿ.4“nÀ<¾È8RFàóùÐŽ…&^ Za[vbiÓçCH+T˜x=Û‘¦¯Ç@+ËŸ×(¤ÔBaÙ ¯Ï‡´­„L¯ [ ¼^/¦N‰ ¯Óh­pl©´ëõâ€ÿLžÌÀ!‰þÐ0þû™]~^¨ß áaÔÂìîæÏuûêâp`ËæÍäQµjµý^£”âÍ×_ã‚‘¼~49v˜¾^CaÅmTb Ãë÷cj‡¸-Kûz!…³Àôàñ$ˆ¶Ö é88RïvÂÀçõ‚²±l¹[ÛZ¸à{jÖÊ¢EËV\ùüLC` "®µÆ‘Óh¥Q:± ñ¿FJ0†¥4J<€L^k˜CkU²¿„‘p4"5xŒò2 ß5àñ Þ~tRnja®?·©[Y“xæÉÇ~Á…¨?ÙL]XPÀ„ osËmw.Lž’$â‘ـĀ(Pä'\ /ùYr®(y],yŸLG–ë®5üÅÞuŒÌÖt)&­XÆô%ÛsF=~}ÿ ¾SP­Yaá£Ã°‘˜—½È5ÿò«6Úp¶¤à—š”=xñ‰©àÕä¯_Ñ.DüÓDÅL©˜ Þ¤ 뜜|ñ8>}z,›rbœ:ò2Cšœòy §jÞ—ž¼‰ ^MÁ†ßíÃT×-H fŽûØë8ˆÁ9·¿Ã. µéˆç(ù„hé—N©vC96ñR[Né¿)ö’·Ï{÷ç|_ñ-ö|–¿z"ñwλ‹ÿuàKŒ?vœøý´cÅqÊ©ÿ¤]6î%H‰mÉ=“Ûí>´Â*‡ ÿO(ÇÊòá-!¦ÀÜCWkšeé†(5Ñ0Ë_+Ä>W=b2x<»û‡õ˜Çý®‹Ã̳ÿ²¾ˆ›yùƒ›H‰®åšž- ‡Óh=ä,|\sݵ„MI«ö=¨]1Ù³vpÊÈžTÓU§uKgûÒ/¹ùÎûyäαô¿à_ì øK+_I¬Q&<ž»/ÏdÝê 8º/ëŒ)Õny¡Î™<Ø-ìeÓiÞu-ýFÜÆ¿_½¶œœ¤¸`­º7§n병;"3DëŽ Ý ïÂ…‹ÃKFD1·õ<“Å[c[§ÞEÃ&ç²`—8° ¤䯙Iÿë_MìAÚŸÆÔÊæÃ¾ ®Êߪ˜{×`ÎzkÛ¾ï߯UíªP§NêÔ®I¥ºÃY+ö±ú&BñHÏ“ør½üëûR!ˆmÿ…­«'ó^ƒjMF±m¿yßÉ­çœÅ²]Ê\4ØŽ:¢)]Çüeš|A"¬wøÄ{øõÇxâÙ ¬Ú'µz^q½šú‰Æ%ám¹tÀù|³Íá‚'¡´FƼŒødOÞǻ߮ÂûÈõœš¦ÙQ¯5}{u§UUO2* FÆÚ\ýV¼JAó9·¶DE5¾”tëÖ‰”!âÅ^†¼’Œ§îçoVb‹†\óȵtM‡¨¨Å¨Ëû·@2ì”,‚Õ+0¼ÿé¬uÚÒ¹Žn}wáÂÅa†‹aø¼¬þüiF>²š×çÌñš­Ëæ2ÙVüÕѹS+Â8¬š5H•ZlZ¹_õæœÖ¡)æÏ`Óª|ôñGÔnv2ÍBÛùæçß(Š{¨Û¦#íVJöÕIÄvòåŒe´8¹K×l`[î>gqRÏÓÉ ˜{©qòR;ñù¤—¨0цôÄ´ ‹ç°hõNµšÓ¥CSœ³øi[.ES? (ëúönËÎåß1oÙV|U¡KçÖ„£ž\+‡œÊý™7ç‚R¡H~_0“ŸÖå‘QïX:·o@á¢/Y¶eÓ'}ÀÚ¬æô:½›~šÅÂU; ÕlN—ŽM“AÝ)€‹?«xÉ­yủG~vµkrZVGîFä¿Ð\'ŽÙ.&­áéÜûl·„¦Dk”’Ç¡¢m*2ú±#J:$&ŠXÌGÏ«î§÷èä²RH%©ÜóbÞésiòÚÄ ÐÊÂ[­oLêZá'l¨SkžÄóŸLé·p|ô¸ò>zÚ=M;íoþ7SD”DéêÜ÷ƧI³ŒX¢ wÍ/\¸pqazËÆ]ÂC;¼6ùuÚehvÌy‰3®™Áõ÷\Èú§/àÙ©1í¡Î|tý0¾:ávž¼ª+“ž¸‘íáqœ^«.¡ “¦ÍšQ13…u¼ÎÚŒ644×ñðE¸â/èT9¹§Å«yiÔVxB*§… T?†–-j‘²{Eí “U£ )åÎmüøº=°ž»îÀü»Ïcb÷×yõ¢úT x¨Õ°MêTf×ÜÓmÔ4ÆÞsŸ»ˆ§§ÜÇ´G»cÎÁÛ—Nô »[õ꥜3ÞËý·uãÓz3óòO¸½K*ÔkÜŒF™UÙ4énθ{5wÞ7ïïëÇÛ§¾Âø;ºAÀ\ü!Áàß.ºËye°#;›ôŒ ûŽÇôÏ&ù%DÐ{/ÿ”¯@JÊ2Ïå¢L·¤”d÷}ÉŽÚ-[ë’óe6¤ºÔ޼äÚ}¥)h锳©.»ïŸ%×… Éß¹€ËîÜÆs«¥]U@Ù|øÁ4z¾ð.œ˜=ÜÖüv–ß×Ó¤ïÐËhÕ,ˆè݉ÚÂàÎu §[4k’Ø@WýâkÈX³žBÕœ Îú’?®¤ó™`ʼráÉ|Wÿ&\x2Š*i)ª7â˜F™ûÍ_hÛÚ6iŠqÒ¾Ä÷÷Ä ¯ÃÐwf3¨1 ê ]»=EÎØqT xÈ:¦9Íêhƽ4…nϾÁ…Ó¡W §7¾‘nïÎñé‡kX2­}•&M?B[Åd^þ)³n¨Î}/þÌå“qv-8ûØ(§4–J¡õ7§QF„]7‹ÁoÍdp3|ªI×.O°~TGê…ÜúêbÿhÒ´)ï¼5%*W­ŠiêïÂÂ>ýä#Î>Â%ù.\¸páâàÁÉhÃóžÀ}Î¥Ù—ïÓ¾’"§ÈáøÚÉnÝhÄ1)EäÙÃK0Ý—˜AÌÞÓ†<Ÿ†ŸËì̳8»}]¶mµ±jÆ/Άoxø×м´ªûîé?ÑnD«œÎ¿NfÀD˜>°v 0(«dÐŒÞBŠË†ÓšœB‹ö%>úD#¥‘W.’¯ÅYC™7õABR#<>ˆüÊvY‰v5—È”f¤8ó°U¹]ÆÙóqVíäï@Sjù (Žk¹ª û‡ÏãcðóY·n-9¿þêÈßúû>à IDAT^¯—!C‡ †PJ‘«.ÉwáÂ…‹¿!”öÒ|à“|T÷Fz¸‘™_>Bj)LýaýjdÁŽoX­AõŒ$aÖ{ta‚J®H-aü7^]{5-Ï|€o“­ÍFƒùñ±0}Î:ŸÆSß Q†i ¤m'“Õ-ö&ýÂÄçà/±××aV´™¼¨€3:¥¡6Ì`½¨AšÏ‹ÇЉ¨Â «ZŸÿÍÀ¬º°ëGjpy¥Ãë½F&~¯‰?p³2Sv2m±ÍIÇy)^;“H8ŸáÁ*á:Ϥ~EÅ”Eytï’Þ4“5ª&!áZ廸ãy%¿ßOãÆMÜÂø;¾¿#x‚Kò]¸páâoH ¢‘"+Jƒ>1nÃ%tét /…÷]Ĉ) )X¹”.ÿG}$±Â‚IÒŽ‰Ûx*סú¦‡¹üºœÑ§—ž)¹óÊ;9¡–àç…õ[HЂ¢üBà­›îcä°ëxü§iuFGro¼†+WžÈÕwŽ¥IêÑq´¢8R¼û¶HaÔ-—0xt?.j^ìå+9ç¶·¨H€ö§Ôâ©[/ç›æ=¸á²+ùôÂK>­!E+—Òé_¯Ðêpš»(IQ$¶ë¯Ê]dð˜>\Ö¢›—¯gøÃïà£"­›äò&öñÍÚã;Y¿mec¸ £Z-ªWØ;߆aóÞUgpÉ›s¹nÒ&nëà/Ýëg›×/>•1¾ç¦iÛ¸©½y^ÂÜen.Žl’¤^Ófn9¸páÂ…Kò]”À¶­D ŽìÙ¿MyŽNc^ØíÜÙ·¿Í¿¯éA0%…€×DK›HQG ¼0 ˜ Šnx¤¦1u1Áp ð'k0<„SRðšåÄ),,Fj¦gŠ˜­ðû…yH—ì»ø‡ÃkºmÀÅÑŸG¸~â]¸pIþÿZ£K‚oaÄúH6[1<^‚@Ë‘Ÿ0í‰ÎàHVî®ë=”7æoÁ“yŸÈ;¿Õ笳Z±üÛYüž]LJõ¦tëÚ?É@<~¿›ÌÆôvÔøí?¬Z»ŠÞŸHíúí9óÔÆ¬Ÿ?ù+·ã¯Ú„®]Ú“jÊrƒ­"‹+ àØ'Ù>å<òÖÿΤWï¦s¯UÌñ"µ¼~¿I¬8ŽúC-\=&lÛAL P…Œé݇A§T9rj‰‚W~Å·ÏŸJbÿô8< YÇ÷åöËÎÂghжn%³‘Aä«ÒBš¸6ñû¼(Ñ55à %Ìo:\pWvjˆB‘»9›«J>x ½‰‰’«¾tá"AòËy±‘JcÉUN­q˜¦øí^‘ Lãt™^¶åÆËm¾­4R<âÒÖ þø"q¶[ú°ìÎq”Æsò®T©€ü(;l×À±—ã»pqÐ`AM›øŽ_8ç´¤Ýü9¯ŽîŒÚƒ÷WãÙ5Ÿ³û\Ã&m²þë78÷Œ, 5¥NÎDÎëw/EÕêQ= ¨V¿-›eamYËü_wQ!ÌwO\ÂYO®ÄçK¨™M¿—õï\Éi—½‡'=ÔÚ IOM§IóS¯*_¿˜î׆Y±"k?¾–Q}†£÷½H£1¼!RÓÒ¨V¯%—Ý;Žs½ßp÷üb|k> õqW°Ñf¿ã…ÖhmR¡2•+W"#þ¿ø§SµPÂ4è/"'?‡ÜÜ\ìcÎãÆ°~þlÞÿ|3>{›ûïyY1\ÚAkiê0†ÎŒ¿~,ÅÓÏK&fêt3gU„ïÞ{—f~Çgo>Ç#OLÃÈ•/\.\”uÉC£$œÔ¾•} ”ÆW)ƒ »V£šG—»î7à§GÓ0Jéý^ƒðp|ÃTÌrç•‚êªÐ§†-õ¾ïÃàôö• P”ŸýJ ê5¨@«û‘w0áõÒ·] ¥ÿç¼K ›V¢©?1q8´y?Z·ãwáâ`áÈ1vö†Ø:ñJ޹a<ômHÜ1`ýë|°½-_ÝtÕ=…ü:ånÿ6¦Ò9÷suÏ6ènwÒäÉ~¬õÜFfÀ@5lA«æ^„ÈbĹélʉrÙØ3éxé‹lû×Ó «¦šüˆ­À0 2„J˜?–˜rHuhI Ò‚JiTRk! AJÐKÀÒIæ†}ø‰ÇïA(I~ÄÁÑ`zL2B&ÒÑå§HWMýçšG—ä»pq’|'J•^’úÅ «Ù·ÇœHdë2¼êà72Søbm!`R©NÊR(<„}6¶,¯j7ø}ÖK\ôôôëÓ‰Lk"VD0 ¾ùäúÜðí "{Ðõh.[h¶æG~q—]7ŠÐ””Ö€dW¤˜ôj)˜5:1î¥ÎX±ØŸ˜ë$—q£_sÍëpǦÎGÄ‹‚½G3ïܱ('NÜ’ Ó-qT%®zêCƘ‰)Š’ñ¸M×ëžbñM&v<Š--ª¶Ìçó†#´Bj¸×0’ÿIüUZóè{_ñ„ 5RÚXÅ’Ëß›Éh¡‰ÇâHÜ%n.Jº—ÿI¬þ)i™éÞÀÏœ¹[XU¬ WHePû4Öm(&¥z*žmÙ|´4ÎqÝjQwW.‹¶ÚÔ©]‘µK·³+àÅã5©”ê#Ï‘øk¦ÓÂ+)Ô& ª{ùöûmluòl[Ó´u5Ž‘…L_ULÐc`ú½TI…x‘Ml7GºDï‘ÜGéñФN*†%ɨ&”½“÷WZ4;1“®Þ(³~/&T-ƒÔü]|µ:Fë¶™Ô¶‹Ù7iVÅÏæÕ ’h vtéªÖ:Ño£ñø}´¨‚m)ªd†ë¶óñ‡¶]jÒ.^È·ë£T̬Œ½eó·ØthWÔ‚»´—†©~Õ‰Išáöf6Œºpáâ(#ùZªq"“Ç5¢}½ŒMÿ‰‡ºtÂØù>; RüùÌ[áÄ+* æë²%½Ò ®Cu$“å gÑ}ô=\{z#r¿^B¡Š$4æŽdä£ï°å–³¹(s.ÏôÉDa"”L F)ÕhÎgc¥Ó¸§{–#‘òOì3K´LJQ´}9“kny¥V,Na\â øþ„´'ôø+_y•â¼eçþJ@K›hÔ.ÕĕϳmŰw»A m‹²ËZ9Ä¢ÎÞi ZaÅb{ uâ1œò“.þ®8ˆX'û˜Äw…òûèÕÒäóikXBдnÙ?må‹­VY\Þ£2UÝ„#5«×å²,[± *zø,»˜âÊ>–­/Hä³p';M¡[¬Ô©äeó6R‚Æm³8Ž<Þý¹ÁŽb‡XaKÖÛxŒ²^¬TÍ’ÔXk¥ â —ïÂcäf‡+NI#í×í8r¶æðãz ïvÉyÇA/-Rm>˜¹‹"LÒ«„Î Êi×ÉL¤¯”F‹DÞãE1æ.cg«bTÇtB¿íÀQ°uSK68„ó¡W"/H–Š2ai–á¥f­0(•0=rìŸ7·Œ\üm&¤úˆv~ä|N´BÓ&^¥'3~úˆ^½ûr“Ïõ½M.:œšÁ\6ÖÂ'ÇúX1£˜¢¸Bˆ„†¨¸°¨Â)çµå’[‡ó{›ž\1°ÏÜ/Åß6$²fDª¡€xQ”H¨SæMàü>gpsÁÜ? !M‚¿3zô•´?eüûNο¬ý&4#¤-*¶;‡®<›R -),Š&¬W”&¶èYF FqA9»rètßËôª¨‰.}‹¬Ó§±`×êÇ#`b. ¾ƒ{^]Șñ0­\wy¦i²bù2¬xüˆ¯à.\ü•ÈÞ¾ý ¥%µÆQÐhX6ßnµèر:›gm#Û~Ë“h*e»]Ÿ™PBD£GiâRãõjl¥ÐZa+…Ò­ÛÕàØ€Å–BI0Í$² l¥0ÓSé´xﳊ¥@à$:?lµ/§ÃBŽR8*qÎ Ñ»mE¢Eq"ʃÇo"¤B¡)*p°•FH™ÐÖ|¨xœb;±]g̦’JʇV“Òht"ï"±R™R!>-RÈ-´‰âCx4H…F)r°•–‰²Ð ‘h1–TضÍËA+…-«£.þÿs,‘4wMŒCnÙº8,Ô>i¹œ øG:Ñ?"H¾ŒK:¼º‚å°#EˆÌSùlî|l¼Ï{‡^Ñ„w¯?€O+ÚŽ~žEx)Š9@mÞ\¶O°cìg̺"ŽÂC(äcÒÄs <Þ¹çy8Œž¿å›íyñËï±´a˜Ü>þ â¶Ä0}'òéœþÄ x}~¼¢ìk´cáwmHM­þw²­¯$ðÓãÅç󢤯l2”u«üC‚ŸLÕW‰/øOÐwÐ5€‡‚ä¯úu#.ºÛ¶Ý6ïÂÅ~ȶƒIò¥Â‘(±sW¬^º‘U5j0ääJ<ûe6ù1EÝÅ‚| ¾U<’‚¨ƒÒ ”Äv6íJÉéTÛ‘H_€µá“7±Y ÛFJâ8'7Ô 9µoLßB“ÜDª$¶#a/>¡„ÇGbÉ„M}FF*…›wñŸUHË }½l'±‚Š–8RbÈÄ„$^Ey‚-±5„½&JJlG!ŒCLò‰Ö*‘w‘Ð,W®fýÊlfn‰cVªÊ‰u¼8ŽDjÐJâ8 G*´6ˆFñxM¤”ØÂ Õc#%ŽÄõv íFʾֶm–þ²„åË–¹v]6„‚!ÚµoOVº®&ÿ€‰£?D™_פ$¶c0¼{6M¯Ÿ`é/(Tò¡pYDÈ@°œ§–$wö–;gú¥éx|<åܱ{üA<þýtB†I0˜ðÔ#<>Bž}ùqá%>°•BBåKàÈ'0 .\¸ØW9¸æšræ:I÷™ØðÛf>O¯Ãè3ª0qi>mÛÖ¢W…"RkV`×ÊÍl‰iZš†.3sô°b±”Štj¤X·#Êò]'6«Àòb'Ô6ÙúK‚p{<‚‚›ù8P‹Á'Tâýù;Øž#µYe:éËÖ'w·”hD ÀIÍ+WaòwFȨšJ‹¨ £Z*ЉÿÌäÄEi×4Б\~ÎO£c£ ¶X&õ*ùØ–Ì¿R‡Þ\Ç…9¥Ee”Hôu…EÅÔ©Ns#FfVaØh¥f2ï:aËï1vA.©EÇúiä~2ÃòÐ(Å!75:p dÝ4MV¯\‰Ïïgô5׺çâ°¡¸8ÂÔÉ“ðú¼TϬájò]¸páb“Å¿»nψ¨}pÉO™ÅW³Ö‹(„†Ÿ~ØÀ¦4/±"‹qÓ‹H¨uyäÙÁܯCG÷ïØ¼‹…BXš¿ÝBšß µ™1{=•Â&B+Þ›–‡ÐeÃ'ó¶ׂõ«¶0q›—¸‚¢ Ûy5×GÐÔK½×fI-m>ûj³TåA´(ÆŠÜbÂÁºìÍ,[!È7aù¼u¬±% ­b>^ÇÑš 6P!Å‹PŠ·ÿ“Žª„+ÏCü>­hŒw¿ÚˆÏ(S¸DŠ,Vl÷4aÃö ,^Å^ÁO³gi,1ñ*.,äÃ%­%3çm¢b؃’ż¶%'BÒ Ómó†٦ɒŸæÊ«Ç$Û†vÍG]„BaÎ8³ß~3‹ê™5Žè¼º$ÿ/SW%²Rî»tñ_A:ÙÙÙÔ¨Q㛃0ny`uM&&*i¿~ˆŸAJ¶oÛJÍZY{}!ÄAmè ŸñeePP/ßÙ™›Ü®nK¢Å»w6EeÜ­¸"'ù=‰)ça,ÛÚ[nnQÙjÝ®¼²ï¹ùQr„Aåt帕¡Ûó,òò£û`Ð1 ÷8åň–NÊÉSŠ¹Î¾'O‡9yûÊ»$¿ä{òïH¹r•JQú ,ÅvË>Z»ýC;4è Û±w»Ç5Ùqq¸êh ı#>¯.Éÿ‹ 1 £´SúÛj ´F˜>~/ØЭijC!¬héö¹.þ £,iZkBá”}^·eÖ[ܵ¼/]Òå â‘ÅÇô~Ì›5k?{çìÞ<7 1[òúoº”|k O¿/ѵüþƒZ^êkO AFºŸ°¥ÖT6Ù¹îôßÅ;™=d.÷dÔ%ùÿ<†×ëeá‚ïiÝæØCZYü‘dìs×·è=Ž;yßßÌ„³*³ré×êTnŸö9*øöêÁõŸNjÊ–ÿÅn;ݾü(ê$Ë}Â) hPŸÖ¬-»@ºÏNOf…˜’ICZrgûOùåêÇ$Zì½é3wõLwB˜ -}Hµ§åŸAk¦‡ÕÓ¢ßù÷²2ß¡M»ôê{öÁ#ùGÜÊ™båš\·2»8ˆcÊWÇ÷5¦h­‘ÊÙmŒ5 ÃHx‰ú»M~½.po×ÝÙwù¼—™U%b^ˆÃö(½[r—äÿC „àô3ºñÓâÅ|úñ‡‡T–iš‡t• ¡…d4¨Í‚kFòs×I4òi<>/Bkdá6>›ð&ó~Ë¥BýŽŒº¢/„ÅüWŸau“.lŸþ±Z]¸fx;&¿ð?Uã²k.¦AÈÄ üüñ+¼;{%º'sé%ý©ê±Ü t´üÒM¤ŠhQ/͟˳6<;€“¿Àú/BLao]Æd xûZ¾üu Ù[îãòßêrù]c©_Ãk/ç·B]Î9­+'máUÂâ!ž–„I :› ú=ÎÕSa`Ë4>{ÿ݃’ÄmETºÝ]í,_ýWdv_íL*ÅC߃%v ”D*M‡ú½èÝþlö9ýOF+Þó¤”Ýäzí‚©,¶gHë*ì•Òü*äAY6,Ÿù‹*u£õò×(jw '7¬€a&ÊÄqäõnLS±ðµ'øí„1 næKF­ øà•÷9uøH*þç©Û~þ‚gß™Nfës5üX>~ä)Zô=™ o®àÊû®¤ ±ÿt5ù.þ¨3òx<´kßþË <úðòCø, -mœF£x¬î‹¼:q>ž_¿ô9£9»(7aĈ:|õÐåt\[ߟmÃï<Ám…ßóæ3×°àî~÷ä Œ|ðzZÌ}Œn××eÓø^,}´ÝޯLJ/\ÄÆ £~õN>}î"ü®‡Š£¦$‚'v¨ú!ü¦AÈo"Ì))a0lÖ-ŸÍÓs[rE·Ó8µIß·¹†‡/ªðsç€þø?Áðz9\Üo|?›:"Ñák­=É׉ÁJ—„£’¨òP¥JeÒRƒ„Ò«9RiÎ?µuë5t+Ž‹£Û¶n&)øŸ >$\lFd6ÁªÙDã¤EVÞ¾¯ÇäÃ3Ré?#ŽÇPª´åùI1ìØLä_Aê„`Í÷S™X±.CÚTÙ+ßâîõ™téϼwnŽ£þWqøÃédøMé•PÞÄâû‡Gr¥y?\ßéÈÿbuTòÃë1-ý 7÷%žC6Û7oÆ–º$Pö¯± ¸ã¦èrÿktoPAZÅÊø¼!ªT­€Iɸpúþ¿I{:"Hþ¦M›˜=gèØñdêÔ©×ëe„‰Ø¶eY\|ñEض”’·ßyŸ×GÍš5èܹ3ß}÷ë×oÀ¶m ˆÏçÃçó1nÜ8¼^¦i0tèPlÛfóæ-Ìš=  C‡“¨[·.^¯—‰'bYû—W£F&]ºt`îܹ¬[·~¿ò Ãàüóò¶lÝÊÌ3BpÒI'R¯^½„¼÷ÞÊ[»ÉSJñÖÛoãóúÈ̬N×®]ÑZ3oÞ|Ö®]‹mÛ 8¿ßŸ”÷o¼^/ ;ÿ|lÛfÛ¶m|ýõ „téÒùP35´Ö8qI—ŸâÞ!ãØ5ôA„NLRj5䔯ÛXøó êvlÍ–{_eÓ³¯¢‹N—?ËÙëqÜí#øjBn=«NóAÜØçk¶ÇÚqÇ+Ëésõ6ÿ²ZœKþsSÉ/A•ᎄG Éßk€.õ “ˆnZò[|Ã$œ–Nñò‡øt] n4w°t“âÔ̵Ü5qo{’KÁZ&’_òéPì?•7_Á•ýOæáJÕ¨]­ç tp:kÓÀçu뾋£ÓøŸ ”#©ˆÆ¢(ac„ ƒ¶ÀrâX¶Ö¯×ƒ!ŒÒ¾@Æ"œóÐϼ~Y-Výç :|³~žt[—Ìfæâµ^S»ŸJfl o~üÚ¦ŸPµ:ôìÜŒÅ3¾§qçÓ©àU¬]<]YÇsBu“u‹f2{i6uڵdzf5õÏìMÆŽ™6{ EÒGÝVèв&†½ƒ™S¿d³]ˆJ€Uȳgòë–BBUÑýÌãñg¯äû9ü6c"¯Õ¦÷О¤ì\Å—3¿'O…8®kZVó²aþ,V¦7€ß±UVáÔݨ™"رb3~X‹c¦rìÉ]iR3ÓÆZ<%á†t®BÙ–ü²ŒmÖg¼óÎJN<±2ßÌü áÓO8« ½;´‚âmÌœ>‹í1“f»Ñ¾NesŽ„aŽÙÊô²Ã¬ÅéÝ:QÉ¢SϤú±üÍ,X—OFÎ*~Ú"iyZÚU)dÒgÓɉJ„á! Ðö´ä}; _Çshš‘«Y’¢ÊòY´QÑvÙ\V¦ö%ûÇï¨:à ¤ÁèQu˜³ðNl×+g5_~õ=vZmêÌÖi_ÅÃö¥s˜ñÃTjmºt?š¡K¦þ‡Hµ,Ö/_¿fkºŸÒïßLÉxDü´´4Z¶hÒÓÓ MJš6mšXb“‰#1Ó´nÕ Ó4IMK+dkee‘ššŠ” 3¹´$¥¤U«Ö˜¦Fi©©)Cøz· IDAT¥ò222v“W"kŸòRSKmÊkÕªEJJ RíOž(“—’BË–-@ì!¯I“?”—’’ZJTjÕªI8Ú‡¼V¥òT2p¸œ¼ Ù{SJaYv" ŽŠã«Üžþïâ’÷6S˶£XöåóŒ|i3ÿ;:•ká·—qlé!­ªŸh¤ˆ¸ S3ÕGaq S) ¡8’Çö¸“›Ö§¾7†Ô xñå3I1lÛu“v4@: v ¨&”#5h'qÞ¶q‰––mãH–‰:W¼e9fÅÚÔoØ€€V4|ì#†g¦P8ÁA;‰ëíC¼ñVÊÄòué3X6 úÜÊÔncÈËÝÅ´Io¹›]¸8L ƒ‚ÿò—Ï߈Ôž´"haz$Ú£ùyó×üúéÇèÑj0=ÛöÆ–6%öÚZCJ¥¤§U +³©l|ÀÎ/âøësç=ðfÝEÏ×2sÂp5j¢ßÜÈÀ§²øí»kyhÔ5Ü>9í2,¦?/ß{—Ö}ÄɃßç–ÇG3ë yè³-L_s v8—·?Åiv²lÑRNjS‹÷†ÀËþ˸öŒÍÜóÈ«T~îJÔ®ÍÌûiue1ÿ¥«xtÁ+,¸+‹Ì°‡´:ÍiÓª*ÞâM\9x5û¡X@¯Žï2iõG¬yñ&|“ÉÄ ‘6í*.üz;Ÿ?R•~½n¦ÿCPËÞÈok¶Ð¤fm}>ÙüDò¾A·÷W°øÝ‘T­T?hÓº1é©^56ÁT¶O¹‚k?êNÏŽxì¾l?~§×ÚÅȃyzÁt '"Y~/³Ù7]ȶ÷.dêÊy㺦<<özîøÏ,2ÖÏåü“¯eäøéœJïS¦ðíêרS¿!•ÿ† œÔï>Ï=.@ů%w§ÃöåS¸gf &ôkF…p*Ç4mA½jŠWú`í+9Œ?IP°e6w<¹„Ïß½ž;ÎíAôì{éœ3•sG?JϹQZ¬|.ŸÍ-w]s Û‹ßñýôëyëâ~|yê½¼rݼw÷ål Àí2±ƒ)èQGò[µjµlÞ¼Ùn¿!±iµM›6{¥Q;+ ²²ö€Û´i½Wû“׬ٟË+y­YYYd ¼ÔÔÔ–'„Ø]^É$¦V-jÕªõ‡òd©¼”Ry~àv¬J©Dp­q´ŸQ· á±S/cSãJ\¦ 6._D—¡×Ó»cK6L~|)Ð*^+‰R ©fJJD²CPþÊœX½)?ÃðáÍÐVŒüb ´Â5K>JH~ÒöV©2³£4€”NÔg©Z%5Ä‹"HÇÂÛ '¼ðT¨C³ê~Šór°Ã&ùJƒV(©J'χr¢ "ù `¨B6l(¦BÕŠ¤¤W ˜RñP4¼„^L”) E¹ˆÜ‰ßâOÓ(¹©lé|—É›·æ‘Y³¦{Éû£{÷‘Z9"u ÷ÅÙôû*Õ­G2þà!÷‡¾Ïíy{”×É×Q6®ßIµÚY¥>÷ÿ™[ÿ=Ê¿¥qvªžöÇP iÚ˜>‰%bèê«ÈÍ·(ŠJr#§ƒØ£½xëŠL¹ÞÀ"…ëÇMÆïòàKÿ¡ïƒÏsJ]jù3ûç§œ±œrRäÆI÷¯<²ð Òý+0=fé{6L¦!ø|Ò§ôyñß\Õ½6œnñúG×¢‹·²6/óO>žvÕÓé]1 yrÛ‡A&äÝÌñA(úi2o+…‘ÙŒáCƒlÈ.¤ù˜³xaÐsdßõ:5CÒê´äØ6lw'««œÊØM0M¸äÅÜ3% °i0ì)úx ´yˆç»=GÞöÉ3²h{\W;Êi~GÒgÔ(֬ߎ®9ˆ×F<Çç*2«T$`6¦y‹&8Žâ„Ž °V¾N«'sxnÙ¿ðl|†×5à¥;ÚöH.mð7¼·•.©J‰â[ÛQZ~«‡Ö§¸‹×}‹TÍ0MOÒÉ‚"ÔùjîíßhH«ñÙ:/cm*^ÏWLæÂ)Kéš!ùÔã¥tMS˜*6lAFJ:ÍZµ¢f(–(wQÒà <Þ zÍ«LwNcÎ5C©@w¾zs"†¶÷ïÏèv÷CœÚÈjs³{ôcAöh­Ø]ûuñ¿‘ ­QNœü¢ZKtó 7x +–ä 8-:õcñÓ×Ð{àpb…8hbED¬¹“v”¢âx"j¤Œ“—!N7¾ôÕßIçSOãŒ^çqï›3ˆÉ23 ÷øû%DY—F3U8Ñ"âVòœBZQò‹-¤28n@ ŸíG»Nðƒç4¾²5× :“ÓÎìÁÙC¯gÖN ñùQ§Ô&ÿЪ”øiÀ´çÑQÃéq晜~úé¼=ñóƒOH…@ˆ8ãïú¿çXÅ¿¼Çð·³¼@˜…÷ÞÅ7fÀií¹à/°¶¯"?Ü˜Ì XñÕša*MöÂñô9ÿ¦ÍžËü_6¡#ÙR'‚Ï) pý""¹Ù|¿p!óæ,¤Öµ/0¶™$j *fA9Xq0‰P\ýBž¿ëd^¿ã úvîÀã“–á.dx÷¾¼1y& \BA^.–DJ…V°±m‡ØÎ%ôîû W|>›µ ²ö{rŠ£,^´€óîw+÷ïŲ’åªmiRµa:ÊqˆÛ ïJ¡‘Žã(Ò«‡pœ8 Hñ;EQ¥ß»i0ѳå¹îA Ž"õÛ±m¤-%Ž“0Á’ŽƒVÉrWÚNÔ oøozM¶ÔH­ˆcÇÙž·½öæ.XÀ·3—ÑãÁižj¡…ŠãX¥)ŽÛPZ_œÃáîèèÐ仸›r|v÷Ú `Ý—‚xq‚ tzd9yO€eÙèŒLúºoBC+Ͼ VNœ«îb´´°¬(5NúŸtÔØŽÄÎ@î†AXE…èxnê·xL#á©Ç±q¤rÝh•óŤm»#©{ÃäÞ$‰GÁžês +ÎUD"v£øyõX ¡°â6zؽÌéÁ 7¶mÃõo² IQT†|—å_kEÜ׊g&…i“'}zˆ–u%¿Ì™CóK5…ëæÐwÈSŒøä;š¥cÅˆÛ Ö@À!4V4Š6=HÛÓK0à#ºk#ß.úâ¡§`š~¼B³l´x|~|^ßçK*Ú$±˜?äaëÏß1§ð<ÔÉA´Ç_ªå/™@Øù >ü†??Ž®YšïOæ·"`ÉwÌ©{.ê”ÚãGÛq,[¢…ßïÇc€Æ‰Çˆ;‚pHã0tŒ_gMCu/¢SµÁÿÐh¨„ ï÷) ½ö}n{åiÚfðÅÄÏY… g0·Â(®>ÎÄðùQV ËQaâø1Ä^;ÃRaø~„,bé¬éÈš¥ú…ü.Ù?È«iR–ÍB¥LLð‹âù쌭EóÁ¶BàÄ(/&”V8R&­Ê¸[J¥êTP›Yš#hT9Ä'¾“xvh]b¶Ä‘ _Øà«›º“Ýõ6^îX™â¨…Ï"Ýc‰Ä¡›³·¡•¤zµ*Œ_¼•KšW&þël~‰¨¸Mæ‰x¨Ë„­/8¶é­¬v?µå[¬Î¶¨œâ°iýRìŠ&¿/œJ»a£¸nÐñÎÛBDmB¡0LVÛ² ÕëD”­œÕo!@ÚfÀ`ƒL®œ'MƒµÖØqI˾Wòì€(øõyz=ð TÞÉæŒÓyùÚËñd/≻&&Ì€…@Y1´#ÁP¼{Ã@j^û£Z‡(.¶ðÖëJ˜÷éÜ«uRE‚h›^lÛN¬pš¥“d\:HG¡KÞ›Ö¥&Ë:ù> !‘„¿¿z6cæ´bÁ¼žX1ôR5U°kG>ªQˆÜÍË(rª”>—”Ž4¨œfòóÖ\$)Üø3»b~<µOBfÏ`W‘…,ß¶™t ^• fzOàÅó³$Ž£H ÄQ”t2áü%A:8NBÎß¡»$ßÅÿDóµÖhé+ǧ´'ZNógÅËý™4]Vñ²H‘ZÚX²ôfb±²ô+ŽãôQ;8—x¦)O„µ'V¾–96ñ²Äcåk„".÷¨!ÊâpYt•÷TâaǶâ%ÕÇ9t91<»~x“ó|— _ÿŒá ¢¿MgÄ¥hØ€ÂUËizÅ«<00‹‡ÛWãÛS®¥S¦â—ŸVqÙ3ãðMy— K‹yø¡<Ž=ó|ŽYò O,‰´rؘ[^y–ÆÞÄ–9¯W0ã™1<µ´ß?„¹+Ö±}ܹ͋¥6Ãn¸‚F)ÞÝ5«;S|Ìi\pjÂlð‚[[CÑfîY¶–ìÕ‰ûFÜ|)KÍ—ya¬› Í¼zcoâ¿Å &Ô²%D>›¼>ræý‡;$Æø‡ÙU£57þk 釨\ ·.!tr?Î=¡1—ÞÙ™½ŒñksX?åiîúµ—Ý>Œ™w_ÃÂH˜ÂÍëIí~3Ï]|E?O¤ßeã¨Þ¾%!'—Á Û§¿Ç7ÙŬ~åA–Õ<žn<›°ÛüjÜ;0hXñ8²#U¨©–oûšH•…H©0?5 zS¿B â!›†Õš$' A"ÑL}ùZ.œ›BÞ¦ÕDÚ^ÊðúRn½•¯† æÌÏSÙ§ðT;Ž»ÏʡϓËè5â;®;oVkns!çžÛˆ‡¯E«úéÌY¸–Z¶¤Û ‘<Óÿz}ÑŠªÞBRÃ<9ßrÉeOc¤§¡rW“Ùç"ªVëÊ·6ãÞ‘#iÛ¬"‹¦þ†l£^»ž,¾ñQnZÞœøÆ9`apÒ€.Üzßù ›Ñ•»Ÿºœ‹k ¡ïyC©W5LAŽââq¯£bEÅerµÔ!µÐkÞdÐ-Ó©T#Âmkè<àA| }Ô+Å7Û¤ÅÖ°z{[Cë“'vÑXnîÌE'üÂ¥ã×Óß󣿋¿IWî¹ôd8õ+{Y¹Er<^†^w3“_À_5¢j@!Ò›ððscˆE‰;¥4Ž¥(nïµ}¤ã@&"âþ{îP×Þp3‘¢¢?\ª4L“éÓ¦ÒðP òóþ¾Q\"øý{ä®»ñŠ Ê;ñz½|òáûÿÇÞY‡Wq¼oÿ³»Gc$!HpKðâR\Š»Cq+Úb…–b-ÒRJ)¥P ÐâîÜÝ¡¸»C<ÇVÞ?NH€öm(ýþö¾®½ÎÙsf白癙ç¡UÛÎäžÍû²;ÊN`VýÌðd)e*ÏaþÙÕ,/“ eÄi×àØ’QLQê3½ÌSšN¸ÌÚI=Üˆ’;§f·b»ÿ7ô­ì cŸY|œù,cï6bõôøTöiÊè )lî¿¢‘°PåP¾mõÓª”©Ó€nýûQ%§7û†6cdÎÉlé«$ˆ=[ ?¦S«¡ \ôg¾þ˜í¥Çò[Ý,pùgòÖ_ÃÊóÛÙY5'êO—é]Øðʹ„räMú6¬Ãº[žT¨ß„^ûR:ÐȆNe™SgK›¤J,?ú,ÕÌà÷mXÚ¦6w»/å§r©pœA±O¯±cßL~¯\‚ü¿Ÿ¦~1EÓþ¿€û÷îFÚ´é^« X´pª¢Ðë³¾ÄÄD¿JüѰ;œŒ éÆcï-n£²5R§YÉö±èÕím²=»GŽŒ ¦Øv¡8íØ]2 "M˜%…˜„JQÂj± ¨.lv§{¿¸(€ÑŒYP]l.ðul¤`¾ÉÌ»³\®PdEQÂd¶`”7ɵÙQ‘$$# v;² £„"kX<,ˆªŒÍæ@ÑD<¼¬Š »Ã‰¢¹ÏXÌfT§ Y²`1 )Ø2f“„ÃîtŸ}Š '‰²Ã†CV%w;3Y,H(ØívdUÀlp&4h ñ0›@SÜéÓ@ îÕ­g…\vŠÁŠÅà~?‡SÁl6â´;0š-šŒÝ¥a5 gŒ ÁlFvØyú6Y=Ý«Ž6;Š&`0б%ì'f³)¶LU6²*`0ÑT-vURÁf³#IŸZÍ)¶x=3ªØN*"£ ³IÂe³!˜­EUvâÔ$,F÷á —ËÅþ=»)[¾Â[s Èˆ-šÏà!#ŽÆ ƒ€«þtvÀDá±W(û÷[Tl8{ìs®ØxâÕ¥q’®É×ñÿ¯É×÷Ïèø;šhQDÅ÷Ћë_Ð’"F£ UU’ø/eYœâD»ÚLìó &£QáöãhêµÍŸ¦<…¬ßñ0̉ š Èä>ìiõ ü±ìÞîßteNýŒáknáããIÌ“ë”û,1GgÑ|}v>è¯ôò÷®‰ûÑàÇÐeÇéyó4{v¬gxÅbìZtœ:’ðâAí9Óúueõeo+œ>M—ƽ'QÔ)ûÁÕÈkX÷”öB B}šÁ;“·ŸcØå£ìÞ¶’^…? Ó¶Sä…øýYªãc?ëÅÞû^&/Š„Én„iZܽÆ`.\—\âøN—´NûÿUM¾šl" "ŠSD7àTdŒš„æ›  òêø%š¬x$1© &¬SšŽÕú’’BSÑ ‹Õš¨^©O3rêFÒ¤ñääÊ9dí3üVªhÁ˜0\¬£(³Åš8 Í/ €ª¢"bŽ“¥ºe'zVSfL â6™Œh€ÉbIœFUC4šIôJšŠŠ€Él%îÍ­†WËL–aÐÔDä\2Y¦Áh@S5Œ&“;Ï1_äµ!6mÒKù*ªæ–•84÷{%à$F³õEÞJnµöžù#9ü<×­ýœ¬Ëø YEŒX¼¸¦jÌ–e"0%¨ ÿ•qK'ù:þ6ŒF’Á X:t¼fb$_ô¥Ý+©¹ðvú™C ûÚËÈÑ;2M3êe.Gyáëeˆ×nÆ ±zL1¶õÆå‹ñWy+¥Mpì§Xír‡·jËæª6>m<” +Fã;j’˜€¼XN¨Õ÷ÏVˆ† xr ]¡V „·¢q}6+/çfÉúïðWžðqµ¶n³¿^\ U!°ßä¡K@Äí+!þYMCK²œ0íé‚KÐ<¸~{–0qíEz‹Bü;Û.þÎ)é#V®ûkäÊ—† ™ð·j\…J@ø5ž(î” /VrR(íÿwI¾›Ô%•ŸI$gª"xÇø#DT Ò{gI6|ŠÂ7ˆŽ­#S¹Zc²çȈjwéø.늢Pè£öø=Š©ŸdˆU–ÿž_Ý„¦ŽÿõŽuýê•zFèБ,Ç÷î¦T D•]¸T#ÕÌâZ—(ÖÙ—Å×drÏÎäÕ‘›¿…©ÁXò`,ÇkÕ4MEQT >i‘®ÎaÝÞ(’Ó‡™B ÙtŽÔ2bê5JŒqk®].(Øq£Ÿ·¦ÍðÅ,Ý’œù³pgù\væ®Fá¢à—ÀI— Øn.¦ç×Ç©T·<žçøa§–¿—$×ÍŒÜ]4ykS<¸þŽIœ8}ãÅy<N/Ö¯Hõ/ÇSñ§V\›9•ûF EÈW 5¬^BA[J–΃9E&eOÍdøŒ;T¬Z éá!¾=í˧_!ÏÖL\]6‡]ªQ(k ”Gk9{þ2výƵ»1¨‚n- Q·÷”_c?Lá‰); ‚²›Ùµn5þ¥ R¢D.ŒzëøgI~¬õ”¤Ð³FDá…ƒ-E•‘ùÝ{,LdÌLƸ{UAÕ‹ïÃ3ufò¦~qÿw5òq–Õt’¯ã“¿u6Ö3B‡Ž×ÀáJ©cãf:Œú–Lþ&@¢Ç´ÕäÙ°Cáæl[CçPü³Y|^± Óhìo³¸‰xæ’ ùÒþ>ü8¦'®>äAÚ\ü°z[÷žãü³¬ü´i%ª)¢UdÀ€Î˜U*}§aؼŸ‡Á­¾fVÚ]\»õG¡‚¼ÌZÍë0 {Z®ÞCõ/À¤Û)•Û Å‡3ÛWoÞ!ºP &O1ràâ9<37dÁººä6€Ån¬òÙÅ‘SÉÜþ'–U»O& ò}·×ö#­:É×ñ߃ ð>а¹Ä—œÕG¯È:ÞæABõŽAúßu*®iHt:<É|ˆ7©CG @VdÊ–(ǽ{(õaY IÏï‚€Éî;(W¾‚Nòuèp; þðvv¢_6¾ U«ƒ–+—®Á×ñ^ Jľû²/›ö!FÌKÝú ÿGçÚÂkóA'ø:Rª¢’%k6œN»vls{­Õ뜎ïá¬V+¥?ü_?¿÷ÞONòuümÄØl”,QY–‰ŒŒLtøÉÃÃÈÈHŽ9BÖ¬Y_fÜ où&ÜjøÍŸ.aòQ _ü1›´Û1döq>ì8–J£EÜà‡}ÙtášÑ‹¢õûñc¿‘¹wé<—ÌåÐÐ8¿~*}ÇΣH—/y¶ònòðÝä Ï`Ò JÇ;…虞^ßΧÝñ¯h9࢞!:t¤á‚rç!(87ú†ïVÉá6‘üŠS'ù:þWàaµBûöíÙ°aÖÎ?ºwïNÛ¶mÉš5k2ÀÉÝkWØ;¶7ƒ²bx•Åó˜Îç¦}7•¶QÜ#”;aFJW¨Èó‹ûY6²LgYÒË›{—ÎqÁ÷)¶ð'\»qƒ ß¡ra/.íXÆ_K³it]¹£ãÝvþ’?_#ªEÒ÷ ëБâdKÐŒéøwëß{ŒwºaTUU¼}RÅ_q'âFcüo&“éµaøß¼¼¼âÍgyzzÆÿ—éÿWå †òÌ)«ÉΜ93“&M¢Zµj„††¢ª*åÊ•£víÚ”-[öõ³\EÆðáç;°‹¦e2`5JŒÚq˜Åƒˆ æþ³P¬~9¨T2ˆg·¯f×0y¦âɾ͸Ý×%†æ²Suà æ.™GYƒƒK·¦¨©=:tèСC‡ä©|Ýû—$IÂËË‹T¾nû kÖ¬AA`ñâ%±a}ñõõE’$Aˆk·Ûãã¨W¯>F£ƒÁ@«VLJ Ež‡‡G|ëׯ—·`ÁÂxyþþþ äùàt:ãã¨]»&“ ƒÁ@›6mãÆ††¾"Ïb±ÄË ‰—7wî\wØT©xEžË劣Fš˜L&$I¢}ûñaŸ={öŠ<³Ù/oëÖ­ñòfÍš•âåZ @,X@Þ¼y)Y²$?þø#õë×ã2–¦i¤Ê‘ ;F£ HCÆÔ`°Ýn® V®¯íN·áÓ ÍU‡OZUÁb@u%¹4«i¾™R^f Uѵ¨:Þ=R¼ÖiZ¢‚Wì„§ôêAvÉÞkA¾ª¸°9å÷¨ð^}¯DYûNåjC®†ì°a—õ¾O‡Ž”ï.ÞÿvöNI~xX(š¦¡( QQ‘D„‡ÄBMÓhÑ¢9áá„……¢( š¦Å‡µX,ñq¬Y³—Ë…,Ë,X0?>¬Ï+òbb¢ãã¨S§N¼¼?n/ïùóg ä¹' &“)>Žõë×át:‘e™¹sçćõ‹%è åÙí6ÂÃÜòjÖ¬/¯mÛ¶ny<}òøyF£1>Ž8NEaÖ¬?âæNúy‡ð0÷d£Zµjñò:vèðN*zÖ¬½ß)î IDATYÙ³g#FŒ T©RsŸZÂÕ=Iq„=îúSºL~b>ÀåÔí!ëx¿!h*§JŒÍB ‚€ ¸Ø6e$ N>ŠŸÐ_]=‰ç"ÑRzù8VÞ¹㘲f?Šæ^²~º{6¿…<øKíþÖ¶©T±é=*<WÔCæÿ8Šõ·”ؼUÙ·x·ž;SnKˆ  ©Ñ¬›4’e"ãËôìò)»óä*¬l[Š&+Âÿo´µØm:¢ ¢~é×;¸„ø>N„÷žè¿Ó=ù¢(ž¨á¯4ÞȈˆWÂIÆa³ÙÀf{¯ä‰âäEFþÃòÄWä™Í–wÒÑjšFpp0ÁÁÁoIð5\Ù½¡Fv9q8Ü®É5Ù‰Óî@vDÔt ]Ôc|Û†4lYMTp:•X•#Þ£¨¦È8ìv\ªö"n—¬ÆÒñîs—.M>bûé0²dΖBB\ìüm?O~ÊG&‘¸¶êöÕiJåüÞI*Šß̽“6{©Å>üòãççÿ@ß3Û)Qa%ýL<Û=›ßž}À'µ“Ò$iQK4˜ð²ÿFZß>¬{Nú½’ê§ä¨G,™2š3<¨¼cžhì[4‹²%š“Õß”biÐÔ6NÅ’Yªžƒ?pvùÂý[P<»Ç[ÇiôðÂÓ$½9IÿøV¦O“®±eü›šËåâìŸg8îÜB«ªãVŠ—(Aæ¬Ùtë:¯ë5Œ+¦çÓTEÆåt¡$KÝÚ^ÉìER±ÛnMRÒôGä]voÝ©P]ªç1qjÓf.k¾T)_³~TçŸ$úI}O¾ìó°6\‹kFÎ?ÁHw €~;ÐúÅdÊŽKL‰»ýyj\5`æ]{ü÷âíFq¿Ý(w š'³ØÔݲšŽwصyfaަˬ_»&Åȇ˜¹Ý;è6å«{厭ä2K¾hÍ쳑¸bŠwÁØörtRoÚOE ù4ûÿ|Låþß‘æÌ6Ÿ¸Hê²}™;òcLö»LúÏ=@VTr7ú†Ÿz—#©“=‚ÁJíÒié9f'ÇÆ×ˆïsŽOø„aÛï"Ûl¤)Ú‚Icºã/„3ÌþØ{É`$Ç)|™Å„ëú&¾ê<='¯‘¦Á¬ñ“?LÇÂzP æ"·ÆÐý‡Y4,hazÿެ¾ƒ3ªöÿ‘!õs³e@=> +N•¨#»FƒÏ‡á<0‡ÝÞ ¸Ùfô©†v‰Ñ‡±ïV(²%ÚcTû"HIõ š†¡dW:>›ÌÏÛÚóÕG~ñy+GÜåûŸ²ç¶‡ÍHã‘Óù¬BZ–4+Â(¿Æ”xz€s·´ë÷)×¶.àÐ…û”í;ñ­ £>:Æàþ£8õ$Y3R½÷D4Ș bîZôŒZÌÀùŸð{›¬±}©[Ë?³{V^ŽÁ£Q±Ï oTåñq¾ê5˜£¡*’Á›6ßÏÁßdâöŽItY¸Ÿ³×žÐâÛeô«i¢K’«6&ìÎuY‹3ö×ø\ÞF¿Ñ¿pë™ »ÀgÓfÓ4XaìiÙ^¦ž·ŽòLÌJÿVÅY»j='®ÚèýŒÅ[râ®í5ŠHÄíÝ´éø ½V?Âlµ³¨GÚõÉí(}ÛÇ¿Yö ÛDâöñ–URHæ; ÉÕ¡#Å«w‚ï6»=Åä¸/:Mþç´žœq&œÒJ4üz>!6²mëÜ^»kš€Åj•“Ñ 6phY;Öþ†¢ŸýFÈÆõø_ÞÀu›ÆÉ ³¸Zª›¶leÛöU¤]Ø•7“™Ì P¶Coò¬ïÇ´ë %hx>™ÈÆ Ù²c'u½w±÷Z8Î,dΣü¬ÙÌæ«ù¦~V\²‹Ç÷ýè;m9ûþ:w0»"²hÁoó–òÇè:¬Ø° Aò¤ÓKÙ´q#;ÖbÛäÙr¦}JÆ3f‡© Q„¹Tn?8ÃúþµÙ* hxæ¢NŒHÆú˜âÀš³-•­uXr% “èž¾)Ñwׯ;K<À ÚyôäBÝEA®ª¥1¾Ù /ësÒx™°ÈXO ÇÆåg× éR–5š††ˆWPi4—œxVؘîU~gáîëŪù5%‚9C;óë–k¢Ì{™y"Û9}[¡ã·yÐ,^Q\AµËbÔtyðÔN h`ñKM¦4^€J_#ûžËh÷ŽÑµÇPŽÞŽÂ$F¢x6ņ‚‘àbù0 à—!/%3äÂ,‰˜s¤‡§wp8op,ì);ëãgUA·bwdÀø•E.Ù»ø¢%úÔ¡#%¡i«Ù%¿÷i}?ìär2uí*gp°á»Î´øq;ã'.¤Âø–Ìë]ƒ~óþÄàã‰Óf¤îðU XF¿}1ÀEº5©BÚÜMù¦F4=~ÝO`jÂÉV¹#kçNÄëîÊ~ø #OqyXšê^ŽO¤ZÍaÜöL‹oÌcÂÒõáÞõïñ¶ÙõZ¬C‡Ž÷Ÿç;]ýxßôø^"’d†›3™q0=›O,$Jë*m“ÔVk‰o“9•FOazã‰Ã&³}RsÙð®5‘ª ë²ãÒS¤´¸¶ÒcÈi&_>M X=¼&Od‹„—÷m'c(_“,Ø/LcKx9öŸ^…§ãK I"pÂ÷Òb¹ €Ið¥ö´Müð¡õ•4ÐÊToΉ¯Ú3iÓI®œ=Ào#‡q"\Hzϩ斴jߘ߷]ÃlŒÉìù”ëwD\YÊÓ.#à$s±vÄ,Ä Ǹxl+¿oºÁ(&ÃòµÄd\U0øçÄþˆ¨H;ûþÆ•;Ñ yt’“7ƒhÒ´kÚÖçÝg¹xj7SÇŽåZÌ›Éh@…NtsÎcâQ Kê¬wM|Ú©<¿Õ©Ï²C8t S~™Æ'¯Nx4 Ï *ô 8̈].L¢ŠÁ/'rä#"#í^2 7¢Ð=Û~ÈôF-XwâÇ·Î'äL¸{»bRf?_6Ó‰@@êTœ»üÍvo‡®Ã`–^_Qbï]ädBï ¯Ó‹=^æøöeL^µ÷_uJg‘èM€¬ÈÈŠ+þЛľŸ—{Òõöï—ô÷¿*óïÅA¢|N:MüÿåÇËÏ'ßßoá/Õ£ÿÞ#·’dÀñè) ÐêAÄŸ[Ø?º AßJX<½(T$€¨gŒjìäÀåDv8X1¶='m'ÓeÉâz hD¸’7y¦É6²UA³’}©“- ^”jП9s¿$#NæëСã=†‘Ú´'½—h0èK®¤ÙG©ÜfHU›I_?géÔH­c&ç%“Æâ5é Ä>ž‹vÝšá'º‡*õ›“Ñ"aÍ]›­k<˜»bó[ÉU´.Á>I§ ßÇýH›Ë­ÏY®)CFÚ‘s¤™½ö{¦-ùŽi© 2réDü½2²`Ùæ,ZÏBÙƒ‹“Ê»í*¦ŠÑƒj=>#“lmû5«›pZòÒ¼¢CÆBŒéÉŒ_~"Kžõ]9Òžµ m€—; k>>në…‡½iܪ!¤úðö­ÈÌüµKX¨y‘ÿÃZd°&3(z¥§u‹*±îö¼è7óGb–?%S*ô™;3°Ü ~úùWòm͈¯ìøyw¡i3’ošÕ³ak:v¨ƒàSo4Ò¬dá–…œ})V¹.¾ ö¶¢õÚ4ÅÇ$Ú~û ÷òþI¡ÌÆ ÍÛ-’?&ÿDÆàŠŒWš´@ÚcØã¿˜EkæsÒ3 :zciØ™fÁî´¦ 4m\^Ôlמô ’§z3šd7Q±ÌΘͨIÞTüriN0¥;õC të3ä¯Bu2¸™º}?q nbIþY¬_9Õ#=UVüOhVeYfÄ’,vUAv)4(Ú‘2yË'‡’á%ç‹šŠ¢¾+– I‘¬ž2›Z÷"«÷ë ¦$i™öO«¢fNÃßt›!òüæBn§¢]ż¼½Ëè²ð˜n J Ææ‘$iœþc' F‡"ÿŸy'"ªOX8a<ûn2lr?B—LdƒO>x¼¯ZÝ(`$ÅÝäüG4ùo3ÆŒ®öø%ÑQQ¯Áˆ’ÄÖ4kÕšˆð°7ÎvLV“?ÌÊç§³°êð&Šh§èÞ® ›Î?£Õ˜íüZe-~N¤Ò¸ÍléU—jçäºMdhÜŠ³¨¿5+›Nn§bšÇ4®úÛîÔãbØjnwÏJåéaŒÛzˆV©RªdgR{š3ƒèÌOraî\O.Ãk fÁÅÚï?¡ý¸ÕŒ>e£_ÿ+~”Ìf ãÇ}Ë€Aƒ‰ŠŒüGf F£‘UË—Ò®SWkéÐñ,[º„ oâöï <, È‘3×+æ(_ÞJ“´IÇ›B›?L¼Y䯘¯LH®ËOfkÏkâNl2qZãML’´%œ¸H_~¯æ“3 ™DŒ «ka Óð"|‚4$cB4> /eÎ[™!N6η/‡¤óôʼnò?aþ&#ûïùGIŒû÷îFÚ´é’ £ª*‹.@UúôÿY~»½Ñ‚ ÃÐ]ñσÝÃ5³÷¥zá:‰<ÏÇ>€A™^R¤û ¼³UaÁ–¥ÔÊê…ü.ˆ¾ bЩ@EÚ„\ b ¼R0H SŠxsiì3&V³Æí¿&ÓÀµ]ãùtOV¶|Ýùµ„È]ÜõCâñ‰Ô›Æñ?z¢Èn³ØƒÆþÑ=Ø]a_•÷|C|o˜ð$îþV–z›š³ä§VdËâÏíM ÙíYÜÏ·áQ¾9Å| È)LÂ].[B6P®BÅ·®ó‘,Z4ŸÁCFýIÁ½êœ€°Q@xì „Å~ÆýÎûœ+6%A+ÖÜ*œy†!Ûm _¤Q±lîŸwz*¶ɨOËb” 2±õvªç÷é0<{„Ø£MÚ‘·YuÄË©Y -¹*¥uÙò„L_C’0?|hȪ{™×±5\öpÙÑ3·w£X»¤KÇóGHÜŒª™AÕÕø:’a&ÉÙ ×ñß+×DD™ÿ¦—êßËLÒãMr&nß𬦰åo˜±ñwŽsâ5êQ @BÐ"Ù²‘ËáÞ¤µ@œ^ÂùìÛv"Tõ h•ZLgäöáÝ\ôÊŠzv/áÙëТTn·7£Âå}k9pÝEÁ*u(–ÉD¶ê­0e0 s~ËbÒeäæù‹X2¦fùB„]ÞHȡLj’€Á á[¸e½nsÜ‘ª¹üAˆdÏš}¤Ï›™ÅKÏ!¤²sðB™|¢¸—¥ ]ò§ZpxÍ&®T­OWÇ7‡pú‘@ÁrŰ?‰¢T±|h1صum"yËT£d¶T<¾pœSBZ<¯àJ¤7ejÕ!W*í‚ þ«{òv­âСC>tˆ#‡pòð^VüÖ‡tZ Šl¤ÃÏ›9}ò{ׯb÷±ãœÜ?™ŒöÒ5ú…?âðÁ,ù¹#}FÎáÄáƒ,øu2!»sàÀ>>.”ï5Ù~pËÛf &ʃ¾ëq8ä‚|œd¯1ž3dz~õ*9Æ¿RÀè@ÕñèH0˜=<½š¦Ïúçñ{u¤÷Ö’ÖRýÓmR„¦thÌ¡ûÊ?W¦/¥Ób6ý·ËC¨Þy$ËV,gùr÷µjélêMÞMêx¯ú×\Ѷh~\;ŠqñËÎáx§ÁêBò1y«ì¸±Œ«z2pAg^<€$bû¢X…¨ â—6#~~iLã9u*LÀÝ=(Ûuš_wV÷¥Í€yØMi ÎLpþ¢x^˜ÄS6ƒó*#‡#Ì ¢`cÑ~ü~KãÁŠ”lû;ø[XþY=j÷Éóðƒ4)߆Kjj|a\:w-¾O´øÙüee†¯¹‰¯I$üú\ ÃÏÏÌ–aMh0ñjZ' Š0¿WU~Û÷_K4ÃZ·dÍC/¥~ن삲¯¥fÕ<E¶}V†Î¿œÀÏr‹Ÿú|ÃsÁ¶‡ôþ¸GBxF¥NÙ6œÔŒœ˜>˜ÚÕºð8u>²ûÝ+š¢Èãe£µã ÚÍ•T*Ó›Ø3¸CvDvætnBŸ·“#nvNèÆÜÓðöÍLppÁAÙY÷]æ]µqg×\o¸ê¶‹-Ügt›.œ5g#W€ Ï49)˜#5O/nå‹™›AUŒmÓžíQptD]ê ÝJ*_›”¦ÝÄ•¨‚ƒ ê²æ’TÂ}ºÖiÅöH‰~¥V…Vœ÷.@æÇ¿S¿ñHž †7Ö«ÿ ÿnÃðË–¿WþQã—9£™r¿ü$V2çÊ“è×\y|ã¿û¦Žûf$W¾n ” isä&mÜ_’Ùrù%¡¸Õi\JuÄ7o“óîøª¦=ámÒúÙ7mIx%‚ˆ(IH¯{&¡¤„7¯MŸŽ— Fà韫8h‡¯=AòÏF‹OGñy«RX„¤êBR[1’ñ¼7ˆŸ¨(T½.齄7”ir[?’¨_‚@ÄÝ ì6€WBÉœ!5k×ýïÎqßN­CÇ¿¬‹y}et).Ãs<Ò=Ãb²£š(’IÁ)Ø!ýžG8ˆŒÒ~€4®N'ëdà[‹@ŒÈÏëƒü€/Æî¥Í/«(æï@þl›>™ÀcZRºl6fÐnr$¿žýI8„$Iñ G” HªóvÑkí:4A©‡,/º-ò÷é(YªEÓ}DZ_+pAaIÏŠ¬ m̱Oñ‘eÄ‚eéì—‘ûaNú©Aé^“‰ì;1VŽžÎ绞LÚT•t‚“Î¥óå¢[lÉ®â[4ýk¾æÃÁ¥9y³5}~ çÛÐhè Y"wÒó†Ðs3¹ä_‘¾eò ™óÐujY¾YJœdúøÚU+ˆ,ËÄïtR´‚½˜7¼+P—­s³þ.¤5âÇPÉjäãΟQô\ Ê1òØ]>éV”2$Î/ù„ ¹úr´n:NÍøß ,©È`Ä; /…ƒRs÷©€$Šñë ¦˜› œ|‹Q—vÑ$> ü“2ßKh·þ`Ñ•lLZoIá“ é|¾ä>ˆ.Ò6Ÿ@×Ê… òXrMlÂåÐo(™ê¿ßɉz÷ ã]vÄ'Ož¤J•*Ô¨QƒJ•*Å_UªT¡qãÆ :4éý•±'÷¯mŸÃç=:Ñ¡ëgLYu“»ÓüÓy-#vVN×Opê¹Ûføú_‡Ñ¥cz Ä•p‚ prùºvíÊïk60 k{Æ-ØÍˆÞ­8ó¢»s·aP‹æ|½í.Þ>~ç+@߸9± S‡Ó¥c{z ý™Ëa.g3Fw¡Ë—+Q•ÃûÑ{Ä$ž æõ¡I÷_x*k:1z­ÖXÀvÿ-ÛM¥ê¨E?{ž=+~"tE?&~Ìéy_±õÜ“Xë‘ÌêÛƒuwAc×ôÁ´jÒž#çðÈ% hO˜9v$ ~LÓÆiÚýBã,#(×7òg"T•'·®ítkd"¯îf`§–4kÛƒ•çÂ\øaô¯ ­×†½ÏlÄ¡#‡9|ø.¾úoQÆþø8µêÿJ¯Í»ø(З††¢ÈȲìvÞå´ñ8J£hZÅáÿÈ"9ˆökļ-X=²'+–`ÐŒ¸49ü>“] í¨¾økvdÙÅÉ•c©Õí;¶í;À¡óOlO°¡¢h j ò­cKËN¹yñE¦÷ÃóÑb†íp½`1Ê—*ÇSÏÇœŸùcŽ¢žä¶hÑlÔ~îœÐØ{=˜5óqìÊ.?Hš2 ©ÁÇ“4ôÑr†í°“½À‡T(Užg^O8?c"£¡mž¼ü(¬cËú£\sù‘ËÆ3ëXqÅL™FA˜M@ßÓÿD=ºI–Œ5â* ‚iS§Ãyó:i ÖæÎøåDõ©ÁùU;Iߥ?™¸JïåOÈÓ0œ9“E‘3röôAj1LÁeè[;/ Ò£iª að¬Ìþv;žú‘ØõeI$âÂ,ÎE{’kã.rH‡™²ÙÆà¢®¹Eºˆ>ÿ©#Ç·oáü¥Í˜+LÀ÷5“Y·¹‰gÜ?º6Õ V‡ŽT½iµÌd0‘˯Q®œÊNÎ……`OsUÑd‹nHæÔ¹°YídM›EQ^xÑEÃ&3ûûO9¿ØÄ“kl6„™RÑ`Ò0Zt©Eý¥ùñdRªÇÐéµð.-, èud–|ÕÙ¥:5 (|>àsr§9zõå]úw¢j›zÔ/^_!_3Òý5´¸ït¾8ž\áƒ:ƒð2(Ä„‡áÊ݃ÛêµoŒòûbÊVª@—ƒyZ<á—N‚-°G9°9ؽk3aÐj·n@ŽœD?¡ê˜T’íDÚ]±ï¨`‹#ÂT”©ªÐ£]+N–̵½g±—Á;¨-3·¥AÓÖdOëIÄ3•οÏBµGåP翦¢ÈN¢bÜg5MÁaîj8¢#ˆvº ÀØ£bpÈ*ª* ;bˆÑ$vNþ˜“¦ìœ÷ûlv24ÁWª‘áç¡´‹ÚI wx¦Ä « ÄDí)£ª2~ÙKPàVw:ô¿MVó3îªD Y™ðSsê6­ÈÙRy¢àå™ 5MF4]G—ÍÈ™95‘Om4˜8›œNQªìvc§)ÄDF «êk땾'_‡Žd† L›61cÆÐ¿V­ZÅ¡C‡H“&ÍköíkØcÂQ$›@²[UއŠHù¨EEÖý6…yY\—ª³¨™?\ÅaðWœ<¼w ѯ]û¡¨§ 9¶}fÍ—3žÀ—ïÞß_†°oö0VßҨܩ:~Vx˜0‘áØ ¾Š“÷n"ù¥k¿ÂöT)ôanÖ°~æ*B3v䛊 Y9o&WÍÞ4úÐí¾ ^i³qëàó¸Ê‚&<~öS–¬xû墸ë03®Úˆ:ñã‚!úOž;ÓðÙÀA”‘¢Q4$™±H÷0ZMñù¥u'Ç|ÍÉëÓî”cMU+n+dÄ x@PÙôÐÔ½¼Ùg‹'ÆÌ¹õùRö–é]¡·WŒeÆá0*Nûàu³Yb˜Þ²< cjÒCø?Ó¸“1gù…?^íÍg‹Þ`âTÇ¿Cò•láîÂcb²a'“æ&ùN(ž­Õ ÖAÕTdEŽw*]Ý£}ÜžsAÄd¶`´Ù @s–ïi€Ã%"““P›{ óKFU õ· iâp(1pÐD³Š(5gû¡úØÞás)Yc;–lõ™µ  Š¢‚(a¶XP0åèi –h¤ÔmØ´¥ ­˜ƒz²¡ŒE02Jk„Îû̸NJuû™õí(ª† J˜Ì&ÄC9ÚH"ÊæÒ3íê]$k$†VYÛІ¢  FDè:a1íN DɀŬ ÎÜOuÉB´CIÓ i 7eï —SÁåLÅWî#X«¯QÇ`%"¾>sÁ š¦R¸Í(6aÀ¨àN-¾LE³NcjæoZSV‘ŒF>ÿJÆh G™XPeÁ3#ã/ÇáR F|1ɱö7쯃C³b?;Š®s=ÑÚ_̤j;²¢hÀl`ÀLŽ`$2Æ de1X\¯5. “|:^£Í×4!C†Ð®];Ž;FêÔ©ýÿ2Á‘¼Ë`Z¶š‰7Ò1`'ëŸ)^:f |¹†øÏþ†Ñ£òtM~€\娘JæˆÁŸ:-Ú“VŠäئƒäÏáÁÃ8ÛXbÜ[Ó¯ø@†ü¶OƒåšÔÅør:r•£R*™Ã?ê´hO:)’ã›R » I(M pòØz‚‡|A‘nñÙø™XÒT §®ÂÓ` d+ÒqÈ04,N“BØ_â·Ù«iÛw)àC·ºé©9ìW óÐ?ÀRjgÀÔ¹Ç)Ó£(&Ûsî>‹!{àK‘[*Ñ¿ÒCFöšŽO»¯ÉE¢q ï¼õy4~7#›R0‰G×® gÌGÆbõ ºÖ†c…:‘Î+Y'ùúN^¶HþTÛC¦ôlMH®ñô.nK!+42g·®%<¨*e³¹I=:¶™§é+/“5…«šÌ…ƒ{8ÿ A4`6h82Šl$g¾~Šå“zqóONº²R1È'ÙÉÐÝíÓh¸>Ç~jôžT§lYº“Hƒˆd² ©N\ŠŠWºÌ8æ dÞG«XÚÜë{BP Ö ÈOLf’§2¿Jzvô»Îõ¼ôÆ¢$_}Õ¾ýëH("Û\áEARDMˆ·,îÖæ&n´’ÙŠõ¥–g^4˜°L þ1áñ’£5MUA4`±& \‚†rs;_þvŒì ì[0‹ÂŸ.'Ш¢ –—dÑlMEÕÀh¶¸×L– ·,)îÕmÀdN¢³H|¾-wÜ(>ˆ #H˜þ®©ˆF3¦ùð"f㋸   ‚É Ò'ˆL¢ëKŒTU5$£«1Ñ ‚Á‚‰2ÜeÆh@$ì'§2xYÁi¢ Y°šº?nBÔÜF]L+¦ï‚dÄœ ¾„yþJû7¡ïÉ×ñ¯’ý¹sç’:uê7ÌŠÝZ±j¿el—ªìÑ]g“§ùLé×,åÊ’xîLE×z…b{A¦¯_ÈGâU+O¥êM˜vè1^pÙc Ç!Ç÷·€†ƒZÂÓg„û¶¢ya·5Uvæ$Ê©ù˜¾~Õ Çh\­<•ª5á×ð”S1šeŽày˜‰:åÓ“&}IüÄg8Y)lÐ9þ›ê„¦aÍP‚%sº±eH ŠÈG¹F}ðmüŸ—Ë @ÎðXö5–ü°ŠàË …KÈ¿¯?% æ¥H…ÆÌÚ}P‰‰ŠvwÒ±U«\ïölÝô':æììQ‘¸Œ5Û)˜ÞµŠ“§`1šõÿ•;2 §i®;xxeÁ€@¦œYˆÎWÃ=‰L Ü=¹€ÑóqyÕ@fOú%…´¸æ÷mB­fãýåäÏÝY¸/4YMôÛL³’tø™„YS!v‹8¾ŒNC6!›%44|²•cñ„î<ܳ˜á[Ÿ¿~2˜ññ0¾OµAPLÎLîÆ´Û(ª†ì©òËVæ7ñv ÿ„­Å×f®ÙÛ£Þêß™&ÿ-/“ÁHoI‚…ä7´!ÈX¯ôn"þâùÿ¾T!} º·©CÙ²Õ>o+?wʃæRÞm:þ/Mva nH÷–Õ(S©Vn¥c¹4ÿ¼¬ÿ¸ú6aRÊã­Ž”ÇÿŠÇÛdMhÆ“—–úÝíO{ÍÊÀ«Þ%_YVOÂãåë¶%íU3ù¸t$]ÎIæÑ+æ/‰S»%íy3A k±Ï¿\Ž$ÚRA²uKH"PrÛK^Nÿº5«©Q«ö?ëñ€†Õ©Âýg¡8ûìb^«@6wb_í=Œjž–ÅŸ7ä»-7P„Ô´=…õòstRoºÞÌEÅKóXsÉLŸi30¬Ê”Mg)Óy"ÓÔÁ¨„±lì@Æ-ÞK´)-†Ïdx£àWÚVÜ+†oGïý¸³ÍÝD^ÝNÃÑ'ÙöG'¾¨˜ŸÅðñHǨE‹)ïØEï>ßrö™ƒU»3ãûÞ¨‡gÓzKvŒ©û>T>´eº·[n–[Ã/Ÿ¸M5oh]_jîbÇO”î; !•?FÏêì8ü¾û”ïì&Ê@“!3Õ4˳»ÇI&×ôÔö_À_õxÛ½Wo¢£¢þÚ¸h4Ç÷±&6UEÏ|o YvqèÀÊ–¯ð^{¼Õ5ù:þ³Q!y¯•I9¨JlçøõsÛ¸p¯„5¹˜TؤÓñÚÐ þ[–óëòOx¹“©/ûOMª_rà™lÝúìwxEÛ‡ïÝ===@ ¡7)‚ôÞ;Š"½IG‘Ž‚(HD¥KoQ:J©Ò{'ôHH9uË÷Ç I¨¢/áÛûºöÒfwfggg~óì3Ï<*‘ð”;~:]®çVW-ˆÞqydNk÷Ooj÷›ÉÁCG8²};¦Oáf›™˜#>ŽÜÇá¹uß± ¦rp×Z”­s9ïÐ8²j2«‚[°ûèIŽíŸMÌðf,»úð»u//EÕ¼‹íîý"ð±™Ä`:tlO®ž¿qäÀ:¼v›=~¢Çoû8rä(=ÃŽ1`ÍU¬/“¥ûgê]8¨&}ÅP1Úü°Ò5Î'yLô\p˜£»¾%fõ,µ6à¯#'8¶>‰#›±ô6º{Þ 4 üÓÃévât;pº8ÜŽ¤0Œš~èÇSªªûäëèèèèv ‰ŠJ\b.®ºÁ*«ä¨ß€ P°¹ñúké0 >Dd¹ã˜³›X;z<_ €€ÑæÇë×fýç“ÙƒêñÆÊæÜjV:̪"Þyˆâ"¢['¨&¦A-ìÁ£‚ÇåŒ\>³žµ_"â[0X¬ä¿’H€ÞB_ŒÈWµ4ã­ójM.ÓB祋|4ŠêòPºýF~4ƒì Q4Á•iŒˆYú"áÆDÚÖl‘䲂xÿ—‰ä½$“סÓlú.F× h@ûÇ_¢4îíòéDư ü~l1R%¹²é`šÝ:B½÷&JéhüóVÆÕÏžúɰHßãy«,, ñ ñiÆ?ZçÕ@E&£ùå/«þ¸ttttÒ&*¶ÌÅir’]X €5 7F\Ùü›ÿºyŸð~¼h’)SõV÷x™] úÊqæÁ¸·–$8W·ïâ®Ç!-y¿À~º Yȵè쌜Œ£ X iѧÅHæ g'Áî¦h•†lì׎é;Ïsûê æ;œC.}h}ÞÈŠL‰%ÙþçEMrÁÓýxÞ‡H||<›7n g®\/ý{¢[òutttÒËW À"FZöÿ€ ö¥äÉ$BpCFu;ÎG­[–¿?jJ°æ…© ù%Jùj¥° € ’¿X)‚~…±~–ˆñ}Xâñ¥p•¦Ô~BHShêTðIþ"`ôIOÙ"Þ/ì­ŽôÛû­šl¥ç¨Qtž·aèçôü0ÿˆ¢t­d d¥b—sWàôEkQ$»_òt*¤heÊDx#Õ7•ýÑrMY¦Ïí˺9n†û˜ån…*5¡®ÊÔ¢H¨¤7Õ焪¨dÉš ·ÛŦ ëeY_¡ó +V«•ÒeÊôÒ¯µÓ£ë¼â¼*ÑuttÒ"‹.àíw<Ûè:³ÙÒã"Ýëîï ô`¤)xÚ.â¾´Dú§›[½\›a=U鉛[=ªÒˆÄ¤…OÏÓF×ùeú4Ú¶ïp_ûÓÑyaâYAÿÑûý¿ˆ®£[òutñ¾Á]ã…š‰ÿ5÷wìL}ºI{£Ë}уŠôd{Îýéÿæ\Mfñ7ï3rþ>î-mT¥@>7“÷’ö.xš2ýý-½LíîˆMwo ï$¼¤÷ö*¾ÂK½[²Îÿƒö÷£;ê¼²Âýql=ô³ wn'Ã~ùóþЈ‚€ DñíÀ¯¸æJmÕK}­ûþzº`©Òh³@ î»§õãBdMCxDÙµ`½Ó?cÈú؇îñÆñ?·b¿.Ftnª‚FŸLeïþýìO:îÙÈ{å#ôµŽ::::/9ºÈ×yU§×‚À’zéðMFxx8!a…˜ºýÂ# o®Ø«l=|9Y«§Ë®Í;HPR]W‹¡c…œ¼ãFTŽLëDDº+<`Õ{ô¢·ö-¦ZŸÙ· ¸bع÷8ê}§ª¬éR‰Ú³¢{îãÄ¿%(„ ¾Ÿ‘xû¾®·‡›ê“_1ÿ·hiÀÒ¡»ëè¼ÒH&+-GnäÛ™@0[m Æ±rúdö\N wÅÆ4¯’ÿõ"s`éT"÷ÅR¾Q ŒX;g0š1û˜Ø:±;Ÿm aý¾ä1«[3‹È-gñËW‰ö­ªá/¸Ø2íg#rr`û_¬Íû ˰Ù|nì70ä‹(JÖkC)é03ÿØK¬ÓB©ú­©[4Ó}RK‹=Ÿ©;©Û¼"›ÎÞâÆot:+v%‹ý,3gÌçB¢‘r:R#_p²KÎ}"?8”PŸ{¯| Kþ™=ÑA~M@Ò§û:::imšdèð~…Ôg:/DÚ{Þ“Ü[_v7W]äë¼òX|ƒðõI ²¼{5–„}Jß&LÐ g†4LõŽž›7€úãœÌŸÙ‘Úó¹1Z`ïèªÌõÊ· `0ilþ¬£gõÒd6kœ_8Z_G3ë—îìÖ‚wvdÃwÕØøýPöÔùŽÙ{2±{+få›Í›uv×Å€O›"™,›IŽÊÈ#cpÏføÎ^G +€ˆ(ÜeP»¤ë=‡¼aa”Ï•‘ƒ%»óE‹cC[µÃ¿ùW4 ¿A×–ï!n^A5_áÁ%•œ]>…©…+Ѩ «ß¯ÄwRO~ìÆÐæˆíFªV*ÎØ£wh’ß‚hÔ0™¼;‰jÝ‚»vrÂíKñ"6¹Déר£|öî['Чb@Å$‰ˆ&+’ÉŒ5™µ72ÓS¸ÉÉP)ÃFþMµ÷Ò?d×î-(T¶3t™/ß\ì@>#|6¢1ýÏÈzSÑÑÑI3H’Äé“'1™ÍtïÕG¯†ÝžÈªåË0šŒd̦[òutþwÔë=‹ïZ‡ —Æg §@þ<¤—äË7ˆé²c¿z%)½LœÛHÙ{Ûr ̰E†ðòÐbp§+ϯ JÓó­šÜ´‚RédâÜ"î'd!ÌâÄáTDF‹„ˆh¸•{ iïu ×ù´f-â›|M§Ê¹°òå¦ìñþÓÝüz@å«ñ…ywž›'1¦ÏFî¼y1i*yÆüJÛŒO¬âor×AoÈoLÁù° ºLGG'm‰üCòažÞuHzt0„ÍæCZuØúç&2f {©Ëª{âê¼ú2_2` $ K% NpÅ•|¯½FÎ,aû›S-¶5“7“™Õ{£pZÃYÅ€(€ëî5nÇ»PU°ªŸóÛèR´i܇ã F f¶0ï3Þ™þÑß8¦å"ÄÇøˆiˆ¢„âtxÿŒ?ÂÚ³átý°6…ógÅ~ö Ð@ÌÕš½ë:2¶ukÝr&ƒ€+Ñ{®%w] wÎ`NŸüùó‘5S|¯ MƒÀ‚1ŸbgÒ:ã+‡7¯é]AÚB寙c\ˆq&ÿ’på47ïz^@¼p Ç­‹œ¾jOiS€s‰Óbî[(þày÷<*^^× •è¨SÄÚï}%óÎåsÜuÈO¬ݱ x’Œ!÷ÚÓ=±¯úñ<UU±X­Èž—ÿ ¸>²ë¼Ò¸ãc°»Ô-"fܤ^üöÑ[Ô}³o7íÂ’3w‘T7q‰.ÀD›~]‰ÝšF-ÛÑwVÅŽf‚ƒß×gÐŒ€Fb|<²ÛMöz_°¨‹‘úe’áÝ ˜Õ‘ÊU«Sóýut;Š È8âbq%Eç‘]Ü2æ¬ùÉqթÛÔÊH—ºMh×éc¶ÜõEU4M&.æ¦"=˜9 íë·aÝ R-Þæî÷¨R·G¬5Þ./}š×¥v½·hܶ?Ûc]žÄ8â\*‹1“Þc^ûz´nבi[Ȋ¶p0ºNÞhô÷dþ–«0fåÍÇÎížF¼?*ÝÃÑš»ÇQ¶îpî$‰-YÖ»íf]|hPI¹fJüù-®Ú£3~Šr?!Tî¿·oÊWK   ×èפ nÊO¨/á ójíß=íiŸ‡Ž.<õãq¤twWµ×G®K¤!©6zÒ42WxŸEkßà„fì(îMgÌR…i+ª<,í¦d’x˜µ{KòàR¨ùXN7÷¦ª[±æ"@`Ä¡Ée*Ýy4$]ãç›S’ÖZÊ;¸?” [^ì©‘tÍÐnì:Ô-%Q›aüÞæïÅKõI;¨žT挕z³¤Rï‡Jýswš1cbÍ]Œ*§Òç÷.üXÛÉlÅhPXз>ýD³æà³)3éP>+{èEϘb”Ø4Œ9QŒY2Ç´ö ^x˜Æƒçðm§Š'›¾ïK·oë—þS"éV6ýC¹×íIýÞ‰<2”N {˜ï÷„ðÅ…ÙüSO:]Œ+]FÌ[@Ë‚~,hRŠrµÄ¸økè0™lû~!›õ.“Öœ¡t¯©,êWØm3hÚûKö_p·VoæOïC¸ÀRÅpW¨IäÜhóÓš*´lñ Ç}ë±lãTŠú€çÎaúµjÍâƒ×ÉSïcfíC˜ø7‘ó¦.Ó±£¿Ý„Úâ DÀµm$G‚ߤXè57lÌäÍ—ÈRõfÍø‚ܶ+t«X)GVìºLƒBl/PŸ¼¾fÍ¥t ž·šÎ¥ÙúU :LÚB¢’ŽN_Oe`Óâ\Û2vËnSùÜ,ÆþebÐâUØù G­àÖß3ëËfø 2‡¢cÿ \&”Îc2ä­\zó¤a_xFC‡–dôHqÉø ®ïÒ~{ÿîÙ)»\óø]¡ÿÅøÍßì*ýOvçþÿŒnÉ×yU{üû:!Å„ø·…ðQõ(›Ý“;²‡wÎü{»ßß‹»¿;7ñâZ†~:Áƒ{ÏòÃâ#Én+³.ðÓn20øÇÙ? —|Çp™¨Í£X4ê{n `´¹°jmåÐoЯ^Ì~âÌÁU\]ò—*g~ŸÄø›eÙ{é—wf{ç·X{ûáñ²Ò¯g>6.þ8·ûO+|@±+ ´Zbõ‰óìû¥CÞlÃ^Í€ÉGâÎi ËOÝ`}·\;r¢ƒWréê.ló?ç—›`ލÈÔ§¸yãã ¯¤ë°€„êr çkͱ3û)rv -¦ÈÌÚwùµÏÐiÀ6 †‘Z’û‹Í\ºr¡%®3xñÞñž h¤ËV…°³ëù3ÀÁ”!Ë)Ö®-óÚ5â¯Rã8}‰oʦ÷€™hˆ8nÅ“³ÝDÎßGƒBV®ï¼Í·›OqeS'~ú)75Èõæ Žœ»ÌåÓ«ˆ^>†c± F‰+ëvSnì6¢–´á»5Ù›µ'Ï$ïñ l?›Hܹ5ŒXëaÕ©+\=ÉõÏ›1õ¢Þö'Ο…e6ún4ýçtaèoÝù!ÿÒ‰è¸ÛÏQï;xäõ$ÉÁÊÆp.V¼iÓž[ áêa&-Û( É¿K’Ê¡é#™yДê÷u "¨ÑÌÝŸ®=Æs]’8¾è;Fÿq…?f}Ïöh7’ð?¶âë–|ÿ¶ðJ|4¨ìý³yƒY"ýª¡x õb`õòÌ_–"Éÿ qiÇj×$Ö­—˜› n°xdr4yŸ"éLP¾:ùƒÏS®d¬¢“¼™dn¹!öÄZvNÙGîý@G¥üY5ÒYSM½–¼Í>çNë9$*o²cíJZ·™Íý})öf[rø¡hCšgÊÊCn z 6k‰ 5,Xœòá&ÀŸ™Üº m¯1¼Á»,?((ªyü2P³zi¬VÈ“«–wÑb&¤Î븇ƒ»ÑÌ=z‹øw 1 Õˆ¹aYhSâ_Ø4ŸPšÕ<=ŠMÍŽ0á| –Ö“øhx}g”Ç”kß©Ý|•êØ2ç JL€‚Ç­³Q ‚²”#°œ7ˆW–R¡Q=uà÷ IDAT®$ÊØ!ÔLôª(dªÓ‚*Yý ¼4¹M ©X»f ”(Ht‚‡;—±yñjŠ®š ¸ãî`Ø Yõöÿ€À&VOA$Á‘€l¾‰  *.N‡Ó‰  j¬8DTùàG–ŽkE‘ï×ÞÐfD_º€CqÜÜEã‘,šó%áïÝËR,æÿcq)ˆ$\=Ääåq|ðN‰T»Àk$\âjn…'¹Ñ=Íd[2\žÔ€Q»š²`L3Òi2 ~Áûð Æ& IÌÿïê"­¸Ìé"_GçCLøø˜ôŠøÿ ó]2•º fìà9d“DDÑ7gÓoâ5–¾@N›ƒuZz¿âh ™¤dÁ!â½\Iƒ–"ûÒyÁ>†T }HD¥|éñ°†€b”ôÁš¨Ý¬Û%òÉÀ ¨W-8Ü÷¶‡–‰wA&³š€dSé„ûw†FMä«.±õ^Á•:™áhªuzQH*¡ a”„ͤ©`0b6bå¥5ä|Pø Â?¶æƒ‘wÛ׿£†Ã˜oÊ@ºÖ}Éc‘‘4ñÀ ’fǃ„$€ ŠbÊ­ˆ1åZ‚ˆ%n-M;-ã›=QT ‰½ jÞ‰’dLyˆRò¦tâ½òK>Ôý|ÓzV{ÂóÐy¸g jUȇ 'W­">8”ËgÏaËüµËåÇ{‘]Q1øÜ:͉;"…ª¾IÑLFàôößÙyê&¶°BÔ¨R› ß÷ž §þ\Æö(…ªÖ£XfÙk5ÇfÁñ5«°‡†sþØ ,™‹P»BabO­bõΛˆ’€Á XäMÊù\`¯;œj¹‚@ˆgËÒ­dz-3óEt°ãx,™ý¸šµ: „MÙµôwNW«Onßöþ±šƒ7D^/ÿŽ[‰”*–Í~ƒMk7rÝ!ñZÙš”ÌæÏã{9(„`;³3ñ~”­S\ê+¾ÀEw×ÑÑÑÑI«:ü²•£±i7ƒ¶z0¼ÂO´øjƒ;»aË_מÎü¤)”¬X›ùÝ>`ʼnÛ8b/±jêŽÆ?•KÐ$oW/Äæ­‰ÎÛ„lV¤!‡fýÀŸ—â89†¹žº´Ê'yÒ¿LUMÄ'4 ˆá‹îKÀjºçùûD{šêS—Ë¢ÛGsˆNH$j÷,Øwù ®wOA¡6tZE×Q{ø¤]~ ‚÷+xðá¢í·˜Ú«~…ka…¿·è  ,dÈ\[É̹Çy*G"ÕE¦7Zs~Æ`~Ùu gÂMÖOϟѺkÝC­à?¸]‚Àé+g8¯_¯ü˜y{ÇbB´Éˆ6™€ &mÆàß>¤ß¬¸tërJžIkÍèKxpé"2")`ó7scÁ‡”ë45(=——ô¢Õdz;?lËë þYrãž ‘3{zNo@Ýþ«0§ âàŒÎô™°M¹Æ Z5¹ÃN‘B99ôSjÕmÆÞx‰}cP²\æŒ!ñx$ouŸ‰`¸}`;/»I 1ïƒÊtœup2£]C>¿ÜòñçøÎ|¹í Îó[iUª*‘ Y(pŠ%ê³C‘8;¡!µû­À”.ˆ#3ß§ç¸ßQµ”zF”¸±hÃ7ÞB;ÿ+•˽Ï léß„¿tðæ—£@^6Œù€™‡®ãAž<¹É“;;ËFödÖY;—6ÍäÓ•§A@¸ÊðV9lÎF®ô&|2ä¢PŽtD_C¿)x'õ\ã«VmXŸ»×£Þ uÚÛ° m¾û Upñmû7YzÒE€p…Nõš±>^"jåÔ©Ø‚ã~‰¸9•úïåŽ`xåÞê"_GGG' Êû¬Y½¢^°ñÁ§Í ËIz_BZ1¤±HíråèþËMª6(UspF²›“z~_²æÌŒ1éZÂ2c!]É6¬]ŸÛW£tõ,¹DˆÏc”+"ÅêÕ$‹ª·oÈQéŸU`ð;Uè0í¿þ90düÂsîçnÑBxæŒI_D‚³ä ÄæÃ€qŸrþ£Ò”®Ñ“\=Û‘?ÔÉ-'÷"ц„‘Þ’4lY3‘3K õ‚ÔW#©[©ï Y€ÍfùŠÀŸNC“·B5*…Zu¾_Í'¡«©U²„|ÌŸ×$2eÍŠYòÖ‰-$‚,÷>›Ï†Xƒi£ÊÐ¥LIêöÝEÍàoldÍpo'n+YsgÚ¤Ýý2d!À"bÎTŠÓzóû§ (Yém&‰Ð[ÿC­1i Ö¿:ˆsÄað½ƒ%ì*Áynb r ÚD«Œœq?·Œ›ˆÕŽcw9Ròô6h|¢f“>(‹)ÇÍbn} ßL«±)ž=5{ dzg7 ’dM#0[ü2Pèõ×É|ÎCÒaÔGäÏ’ƒ7ßÿ˜CVàÑ@ÌQ–/»¼Ãëù_#Ðì!ë»?ѯm ¾™ÒYƒ=:ðAϾØNlåáUЩN "r–dÐ lŸ8 $›‘í»R¸àôéÔˆ _­GµŠHåzñu“Rykßü“'®§óЃ´õ1²ä ^—~Û´·ª¥Ü³*Ãëݘùy'Ú}>†·â—²ü2H#÷>dIV#-:t§èë%húv9"÷\Æ',?eË—ÃïÒlNäêÅÌz¡ØILùJ( XÓ’+½ÿŒù(’;hI¼/ÉEß ¾úgÖoÍ?·Áê‘Ð.Leþéì´¬[‚¯W£s® ô]p³è!¤É:U)LµÞ#ɵ˜Ó1ÿ¾í¤tw´e¶DÃJŸIS“-ŠBΖlÙÜòÞ?S¹ÛOlíö€rmÚŸéIé±”gÊâòIŠÖLac’ÏÍ^³Ëkv{*ë)™ª±j}µ”¿ÉW¯7êõN•N¤Ö¨…ÔJJ#ÙrñͨO“þÍL‹‰ “ÊQƒYk$Ÿ×òmïÏ=fþš¬½ë÷žrÏ…°ä§¤B tû+](ß¿ŒoèÊôµ¾g{­T÷*ðÞ¨HÞ•R§š€I“’ë®d1Þ\šdcøäï½%oø%›~y>0¥è=·œLY3ƒ{a9«ðcò53¼ÑyÞ÷,½žHº5ÿç_GZUQñ¨ܲŒ,&â’îà1ÝÅáq`w»qØeœv£ÛЦ¨Èò½è;²ÇCbæúsÖ+¨RáS&,ÉM·‡“;Ù)¹Qi; ?þ’Œ‚†"{Ešê½–w…ËŠ„c;øKu "Ò³[+4YÆìŠ‚GVñx2æ MÃ%úŒìqáQ$Ø]nÖMèÎG›M´«[”€è8pÞÆ‰ ’ß@²ìÁìïƒûÒEâå\¤Ï„"»Ð ÂòqçÈ~.*‰ÇSÊÒ£û{ ÊÈšwb.Ë*ér#ËN `«B¼C!¦¡Þ‹L$š0ûȲAU±;Ý€ÊõÕŸS½×E~Ý?ÕãAQ¯…^ñ€ä]ó È ¨š*#ËdEFÓŒhÁ¤€rÜM®i)n—Œ–þ ‚¥3$žßÅm‡“ƒ{ÿ¤©Xßý„aEÄ/ƒtY¬€°=8Ýž¤gùÏ‘e9M„÷ÑE¾N9©"×hÚù4Ï#"v‘òAýßùöê¼DÍ%Uh·gæíg¶|b„§Gß’ð˜ôs®&3ûóf œ±+9:“"1xÚ2Þ¯ší!kêcŠûe}Ìs]Ráþ‹>Öºû/+ø¡K>úZ+Æ“êøÉå|ü5ŸT¾ÿϨªŠòöùEUUPT…[ ×¹+]·Ñ­¢x@õT ¯Õ_QeENDEAD’$üòÖcjÛOiÞÿWªÉœõ¯ÂW ‚qyÌBšª¢ ¨¨IÖ/œ×­·¸•±&ƒ*[‘eE“@=›”^FQT 4Å»V@Q4Í{ïŠâݼMñØYµþ(=&¬¢m„•‹ÓgÒOËÁ™ÃçðäËι§ñ-ðÅÃ¥?÷qÍ­‰ü¾î&Ÿ–Ŷr7Ckòy+YAñ.ØA$UASUEAÍ+ÈUðZùñúº{Ë©y»¦"_ÞEý÷—òÕŽ=”q+`6Y±GÅx]`nžäl‚*Þ{Mz¶¢dC‰Å¥*ï\àL¼LßòY.òû¡DÞÈoæÖÁ•\óäÆ˜½~Ì¡BFd÷Pd${dMRAöÖŸªi¨Šò¯E¾¢ÈiBè"_'ŠœX"¿ý‰Ë9+Ñý2ñ;»?Jö“ĺ È\:—µ¨×² ¯ù_gö˜É$”nÇ•"ô:ÑjüVãG ­§í‚ qþ÷™lLÿ.íŠûqhöwÜ*÷!Õ²Ÿû=˜Íi{´&h5l1­†ý£Ç¥£ó»ÿæ­ª*¡¡äô©€Iˆ‰»ÃI{$.Ÿkhª†án8E¤w ñÇå¯äˆª&My5M•Iˆ·£ª*²S¡Ø ïH—³-Õ~Ȥau¨¿¨þ‚Œ_šŒð&Ž„x<ŠŒÁ'9ì;éôAWÊÕêȸ™iÑ«:M äǬ¸ÉTµ #Zf&1!EÕP5 =ž—êÝuUq‘èðŠUU&>ÞŽ,˜x³ÖëôîÒ“EB¹qè’» *¢ ±aápÞ_§qü辜ÖÙ¾†ë~zµí€rç4G3ÌŠÆ¥ñË4€&=ªÑ¸`,Š›Œ•Z0¼]M¯‹¦¢xÜ$Ø]Iu¯âŒwàR4܉ñ$ºU@À‘ˆKVQUÙíÀ®Øø}sö›²³ï›lu8 k8˜O+Õ ÓøA¼—°L\â¶bÇ£‚âˆ'Ñ)£ª2ÁÙKPàBÚö¹@Vóm.«q$ˆÙ3¶ o6ªÈáR¯!$\Ã×7j†wÜp9š6&gD:⢼3n9=v4Ù»Ž{BUý×m'­øä?M-Œú¹Ú§ožh%‰µ«WѸyKâîÆêŸ_Ìf £¿ù’ú}JB|ü3y&F£‘ß/ä½öþ‡wvž–™ ³£ÖNÍèý„ÙjŸ”Ì̬LS¹º´ñ®çbÚ{5é³ñSÖ¤Q–ÔÊ\œ=¶r`p½!½ ¢¶Óì­FŽ3 |(T©1_ŒLñŒÒc66RXÖ¦+›®ã纾ëŽ91ûk"3wf`å f×ÉÁÑ~ÇYÅú\îÁ~ëÃ{tcö¶(²eËËúõ+¹ãŸý/¹‹äÈ©o„¤ójsõÊââb }¢0Ÿ7wª¢ÐµG/ìöÄÿ>Q@C$Î\;ÃðmQ®‚ BL†Vý,!ᨚšìÇŸr®ŠÓéÁb5'/w;ˆf+È.\1˜Ì˜"n‡ÉlA@ö¸py$ƒ‹YÂãrâ–½"Ùh¶`’Àérc2[ ÙåD–,X hœ. ³Ù„€ŠÃéÁl5#ª2§ £QD‘E‚Ò9éŸ/3ÎÐ,§Š ±Z,ÜÚ7ŸÆ3Ø8¦9v—†ÑlÁlí²˜1¤”{Vdœ²†ÕlôÞ¯Ý`±!¸íÈ+¸³£( Èn<0ªNœ-¹ÎE³ ›QHÎK2A–1Zm;n,XLÞòÈno]‰#‚"#Yl%ÙiÇ¥YqJç™!,üî$MÁåt"k ŠÌ3È.ܱE@Ååpa°X‘þ¥$òxµ®Š‹cÞ¼Ù|:pðîä TÀ¸'à€»IG ›ôß{¿%$¥s&çIºŽ’Ê©nÉ×I+Ö¼‘D.ÜÁÁKvò E’„ûT_ÜÅ#ì>E¢b!kþâÎȉõ¿s:VÁ%ícÕ².IÀõ£¼ƒ¢ ØÒe¥L邨D#µ?CŽÎ.òG$…èKõY\¹{‘»pÇ.cò "OÁbdµé.<ÏÅÍíðŽÚ×õÎ v,ùÎõëðó²¥”ÈhÅ~ý$[v&Q ¤XåjdS/°ïJ QÛ–°ÈNõw*½o‡/Æbð £b•RBKÔ¤–x½’Ÿ[̹Ýüyà²èCÁ’åÈæÿŸŸ©Ó~—œo}ÊÖ±EX9%ÍX|ttÒ䨠©)–õÿz-AÃ(‘í"Šæ”‹v’B¸’›]{ ¦’ÙlDSÕä_ f‹7±Á„Õ`J59Ñ0˜ÍÜsg &¬†”“Œf¬©>0ª˜L&ÐToz£ªª&“÷þµ¤2 ª¨ˆ˜-) ƒ$ i*.‡U4bµŠÉõ¦(2N—ŒÑlÁ&jÉ(àᲤ®cAÄ›÷7ƒÅâÕ˜&KRùRê@U5Ñ€ @´$ßoê:¹//ƒ!)4®Sª|S×F‚$áÜ7‘OÇ‘'C"«ç,á­1¿#j*&‹•äš×TŒ˜S]Ïh6'×ë¿áYµ¹ç.òuÒ‚¦qùÏ4î4„Ó7b±†dÁ¦Y’ð}‹hÔ©?§®ŠøIvœr3nö,.ý‚­wü1ÇÎ¥[×ÕtŸ>‰øîõ˜c*J¸pÃgâ)Ü'’uгfT_>ÞtŸÿ8FÃ,©s¿Ãˆ®m™²ñá9ó{ö %»¯`Zÿ Hú£yöH&|L6 ³S÷ƒÑ¸n5äÛ Q̯; ¦ì{íÉzs ê¬dÉæ/Éh3à—9/… dÀ$dzﯣøç-Àùõi´%‘uësdò@†ä›ÊúŽa$àØL‡fC©÷ùgd–/uá:¹3ùó_wg-G‡¬Þ?ýBòèÏSG繊ü¤P˜ÏâZŠŠ¿Õܶj¢ h(¾¾š¢’v¶@ºßDæL´ÑsÙ6Lá¤ìÔª)¤Ë_‡yŸ«xÜjÚ»+Ùƒ1ï;|ÐìNE Fîd ~q;Ñê;Þêè<Ën Öþ>›¨› ƒwÆÓ3p¹_ë¼ÓÞòȉ>kbÄ–­4±®¦B±žŒ›»‰+qéu#?eŽäêªÄ­9Cëè«\½Ãü/šóËOS¸1 4’$a0-Ô8Ž_:‡%O¦ÏïF¨¯“&êñg_ÐsÈùNÇp>t R™w¨W8;š5¦Wã—ƒ_SØÇˆ_æ×È—Ïë®óv«¦\¸v‡¼ê3µÓB.¯Ž(JD!Õ -@Üyb…0 ¿^€Ü*`•à1NAO?RÖ~hì×voëRGçyŠüTVôÿŠŸÕ/Ny¥—ìòFIäϖ ’¿$Ù:L¾d I;Vé‡0‘3_PÊߊ‚úÂÚnÉ×Ñy¦rïîí+x”¼TÊP‰¢F{¼*œ˜›—Ì‘Ÿ·g©¬‘·V5Òe B%·& ¨.ïebÖмj'…Õ‹q6NBrÞÁþ¤¬Å¬ î÷ Ÿ™L…Üc°fÎM“÷‡óeÚ˜tçk)ìö¬é°_=Ž|LJý‡Ì¨ð3rhI5º;om£cçñ¯÷Ù¬7ð$ÜÁñ(Ù®ÉÚ’1ƒÜÌÕŸ'/S·ï:WÏýß“&-î^;¬%3þ4Ó¼‹ÞHttž«È†VUMÓpºzÅê<UÕ-ù::ÏLàƒ@ÆÌy1IûÙxD¥HÀ&¸ IÖt‘ÌÙó#¸PD$]ó‹Øc.r쪌ˆˆÁ ¡Úïà´ÃëØzEåý¯‡3²m!>­>“k¹uc,ÒˆykÞÇ ] Uöòü¾k#ƒäÚ˜ŒúÓyÏ[Kl9†Õ‹¶Òü›aØnææÁ04j˜.NÆ`2p\Ä& H8¹ k‘†ôìØ9jÕ­yºÞº@|ýV'æòî°HÚWûãPù h.ÖkJ·µè×%“£ó<{ UK»–h4=¹L ‹òt‘¯“ºM{ðëÊŽ (•™ÈŠÅ1ª ܲ»z­°m¾(È7ÁA¸Ý:Mñ‚Ùx£Ne¤q=H?‘é‹GÒ¦È2&ÞŽÃ+‹sG#în¢wy»=‘»qñxT…„8…x§Üe⇵˜µ'+vb ™éZýM|ô·ç9tœ*îӿѽÛ5‡Ø›WÈP{­ cv¶§ÆÜiÐj3AFì f>øq,¥Tä‹1麭 }ÒmÜ— ù2 é΢c(€ìL$!ÉïÔ‡S1Â¥t軞 Lþ$܈¢\ýAHÿÑŒ/W÷ΠՈThÁö¥Ûyï­zúƒÕÑyö‹…ø„ø4ã­ój Š"‡“ÑœÔÓS¤ÑCh¦]^•š^[þ½°^ZR¨-7ªdÂj6" ¡x<¸=²7 $a41H"ŠìÆå–“"X7.‚ ‘,bõ± º¸ “ÅŠAPqÚhF V“ˆìv㑽h¢„ÙlNµ·Î3{Ϊ‚ÓéLŠx JLfSr˜3Uöàr»Q5Ñ`Àl2!j2N§ Y±Ú,¨n'EC”$4EÃl³ ¹x£€ìt ­˜D§Ó¢>Ûgª*œN7K~û•F›w7V¡©£óÆä ±ŽŽÎ³GUT²d͆ÛíbÓ†uÞKu»‹Îs×"V«•ÒeÊôÒ³u‘¯££££££“¹óæ#wž¼è;:/´í âcwZ×E¾ŽŽŽŽŽŽŽÎ[BrD+ÿIû{‰ÑC}ëèèèèèèèèè¼b¼pK~BªÅ»>I>ϲ,ãt:°X, Þb%&&ÞPE¾¾¾ÉÿŸ˜˜ˆ H’„ÅbÀét¢( š¦áã㓜ÇsËÏåB‘土ÙlNöÓý'ù¹\.ä§ÌOQoœ_IÒ?Öèèèèèèèè}š©Ó¦#-š7ç7Š`±˜2ä Nç}ù)ŠÂ€ƒ°Z­äË›—Ž; ª*K–,aÿþ8NFŽü›ÕêͯW/,+’$2vÌ·8NΞ=Ëä)S‘¦ÍšR¬hQÌf3_ ŠÝîÀa·3i’7?UU0p V«÷+“–bõ¼nœ3Hg”K¬Ûr•¡Ó!‡hW£-9ßnK„ó«od¡^h"æp+ÌÞFÏE먛f~Þ‘=†¢ä ŒcÉæx¾ûõ;ò…Ç»Téèèè¼ ñOGGosÿ+‘ÿ€ÿ´·’„䟞›Hxd¾©|¯Ÿ:_ Ùé@6X±^.9s¿°À·ûUÁ`۵=áá"ª3ŽrcSeçRªŒžN¿ÜãÛô­Ó†ŽºÞô¢ÏÅ鬳ç·Ï{ã£\æÀÊß½[•q¸j!ý+¾ÆG£1ôÀ*ÞKy ÅB—žŸR#·‰L·Z3õ@ŸIàSâ}z¶x(ʆ Øy§Õº#¯Ã‰*ÙÈokÆÖƒçÉWD@ ­Â¨Ÿà'ŸfOÁÚh¿¥ÏkPC¬Â¼mg©í»_OgaòÌ"νÍÀwù­A€.ðutt^’1ðÅŠ=USQU%UYD$QJcð#—µ¥REÏâ+í£óxt~:iYä î»W˜õÃϤo9˜ÆÙ%<¨¬Ÿ1\oµ!Kñ¹å«Êñü:ök ®*•wã1MSæ"¸ï^CVÁ¤%p9>ŽG]X•!´ ß¶ù‰ïæl‚êÀqÆÌ櫳()ÀÁqë™,ßo{¸©JÕR½øªŠQœPÛÚõLŸ¢Ç-¨ó1eHV*÷ƒ^pùÛN:LXH£P#‰+[ñë÷†L¯êšÌéXÈ(Ü_ í¾¹íƒŸ7¾¯áξ]äaÆ…ñV \Ë!%¥øZêËÝw_2æ,¥ rÓgЂOy_::::¯ ÀP5×m Á·pzâÑ4•»/Šª =&l® ˆ?I›fÝYuô>_§ë7SÚ¼š¢$õ»^/‡çzo‚¸X7a$Ù+÷¥hˆ”Ü—+î.ߌMîÿÿ})»H^·*YƘ¥%åmûù~ÆBÏœÁÞÓW‘5àÐòëÅm@u9pÉÞ:*Öù[¢Ïî&Ñ¥Ù©_ÔÅÄÑ X¹ø'F.¸Ž$z•´ËéJn[n—“¤ÓÑd.—Õ¯>ƒùÐ÷Ãøá§Ü»ÓO¹±G“Ý8Ü^•¡ÉDê›Wsä²0S¦X8³ÆMgõòy|6ù&<8¤2|ûQ>Fvü `Äw³IP<.'÷ .ŠÛ…KÑÐNšÜ-¹<…x«Ðm~þ>’åó¿ã‡Ñ‚†¦©¸Üîä´.GÊ}©²·Û‰˜©9 _マƒ˜øÓvë΂‹¼HD::::/ jRér»p)ND«Œhóª&ãr¹q¹ÝYçI"îÏáä,З¢Ÿ.âüÕkì[ñ âæÅœÒ®þµ‘ 'αvÑ/Dþu–¿¶ÿ…KQP8þçÝ…˜»Ùpü.ŸÏÜÅp!AÂ`9ºf;÷ìdñ‚y¬Ú~ÂkìW޲tÁæ.^͹x’¿ßÄ îòaÍÃÊmÇ‘U sP6Þ*ŸUU‰>±› §.±cåf/\ET¼„!ñsgÎföœÙÌ¿ˆ%vâTصv-w< qñàNöF'²}q$1&®íÿ‹8—÷RùÝšØ"êP¿tû.Å` úô.Ì™ËÚ½GÙµbQ ƒA ê¯?˜7{K×ï'Q3 Èž-›8²c-sçÌcóñ›Hz¬ÈGò?Yxëð„ÑoúPÞþd}k I)ŒfÏøƒtA¾ÈÇ&“ñéüæH¬Vl¾•™5g Ñ«:Pá«ílYºŒ +«(ÚiwÚdZßøZÆ*¡hñ»iRícÎW[FN¿”|]ÿÇÞy‡WQt ü·í–ô¡†ÞEªÒ¤( 4¤HDTQ°!Š ‚Š€ ˆˆÅÒ»Ô´[·Ì÷ǽ¤PÔ×ï5BÞý=Ï>¹ÙÌ3;ÙÙ9söÌ9F‹Úåo 5Bå²ûºýÇY±W¥ûô:áÅzáP¿’n¼—/¯×òXo âÚ;XúYÿžŽ!iÄ%#•¾ï¬FMQ@Šdȳs8pø$’³m솣8 nçã…b´i+yÅUG|MÞÙ¸‹ Š‘ zí=ö<‰¡Fñ§1D ¨O¿2$—ÄñØü·p‡=bb[¾Â¬†E€6cÞ¦æÁƒ¤ûM´V)QÚqÉë*Ýc«»œË£Ÿì¤wf4­z’JûãNƾñY™*N öCóx½Ã~Îy œ1I¸¥xyç}b’B«æ¦Cgp]D EÅ,h|Þ-‰Ç–}Nd|<-}ÄÞÃg°´º¼±¦+²#ÍmñâÓeqHÅy~Å"bÂã§Lç×c%#PèýÔBn¶”¸ÿÖê8$ƒ +—f`¡rëÆÄ©ž”ªDˆŸ°„ÀLɤH ˤd¼ÂƳ¾Cèq÷h¶ÉÆ!ebÆö‡„$9¨’V MVI(Y†•*­©¸+–€“É>ýßœ;Å7•eа…"-‡bÈN&.Zé÷¢[ð?±P’Т©ï %¨œ_ÓLHÍÍ êˆL R•„ *L¤r¥ð (QÈ\3 EKUâ|®E9"‘ U/jN‰R%r†PJj™œóJtiJo£â¢D¹Êœ/)§ùå—Xrnò+%²8•SSÈ›Ç42±,Õ΋ԢH­T5÷ºÎo´•4RR+‘’ç{ÅRËæ|ŽN.Atø:S£s‡{±óS£ŠR©êÅ%K•pŸï5J–Ï­ÏW†b9¢#)]¡Š­YØØØ\!ÓCÁN†Y3¸O¡E›¸\AL-€"™è¾$ +s7ÞtDr¾6 :?ÖhÑ0ðoNé†ÏqÖ0xbà t¯Ùôn^Ëó-’$ç¼%•U5ä„`‰é<“û›]ÍæqÛë©lÜ=%B£çÝý¹öšŠßw+5ž^Oçû7ãlуεÊ#"¢÷‹µxiýËÌh¬b‰pÍšÆ}O¥×±”9·'¶§G=U‘Cv~3@ÑîÏrO³k¡Ù“¤¾Ðƒ=¾q¤5HÄ:ú)uÝÉÔM‡‰wìBQÕœk•ER(žšŠéåÚJ•‘8‚¬ª9×$É Šêd÷7/R²ßDFßÑ:'0gÖZ´À!˜ð}?ZMõHúfÀÄ¥ø‡<Œ£\]½»Utº•žÊÜïý4k¢"ö;å_É$ÙÁ þ­¹¶ßóÜéDRœì[ÿ‡ª dïû=‰ùý}¢¯y3gHåÄÁ%ïVøœ¬:p"è³üfÔ–"”TÈ›•!. W¤Ã}Qð,zÅ8HR\xžÆ'çš°}ÏjŠvP¹Æ0PqøÙv\âŽDËRÑT3tË\ù"Ÿsî OÂäÙ/P}Ò>n[mÓýÄÜ¡çiH¾5ažë‘P"ã‰ö¹·û÷7D¬Lß_Óì])´.oðÖ›Ûxh\m;¼Ø•bm ža×Ο0´ðf,aâHrS)µˆíêbcccó7Ñu½@^B%ß š„i ™µsåL¼V¯OÇï1 ú$ §‰aèy" ÑJ€ý'ƒPZ ÔÏñ3}hWú&$KG×eŠUŒË@7BÖvÃ00L#ÉÇÐу‚”ª ‚%…¤bÎÍDRDÅ90 gL$Á#Ç8~ôôß#Ù¸LÕ'½MõÔ A=¤o¨ªŽ¤8ˆŒS üÈÈø!7#!L SÇ0$ʸ KÕñtŒÀiúwKÇ÷Öq_5Œ 0 Ãí/†Žaš LLLT‚á­k†ÞÿhYd?@¹Ä‚~?W å\2ôã6e<¿~Ãfˇ…ÌÀÁw#™Î(7–e ë.Õ"à £`ôÃ0® KkÁ+ùáŒae:<Ä€q•xú§ÊôÄ""¡ 'ŽýŽ'óïÍxlon§ËhÇ ÀÒâù`cª5mDÕÅ3¨.`Õ7‡è3 ?‰q‘ì„kofHüd†­6™5ÌB¯@ c3™™™|÷îlvÿžÐbv_ªµîÀµL¥ø©Mœ*qË_þŸ $’cXúË)|i?2lØ4gÇ‹®B„Ã]’ç÷`d/=œÂ-7u§ØÜ¡8mãko†w®Ë“÷öæÚ1¯Ð²X—߇ïæÞ9ÓXt]úGN§”¤èŠ@Ž®L§;*Ûacccó_²,L³€“)!Ÿ|_ÐËï :Ï‚îGV$ ?Ë„Š‚ŒV>¿|¡&rO›Òtyxã× &Ú8Ã:e™˜„eb™¦ˆÀmùðu 9ƒgÒ‰&¨°{Ùz2FVÆÜ˦Ÿtz&D xÙ³sz•²ìýå7¢ª¦Q²dMŽm-E÷;nGXÃБ59GI5…‰X¦‰a LK ,Ó´á¾5-0M0LLÓÄB i_ŽoÍÃy¾I2^o§#‚8MÇëñcF8úû1,aaXV¨0…“ÄHAÖ9fQ™“Ç÷péÄ”¬ÊöÍ0ÍZ}ÏÁ-QÅ©é>É䖌¿)Ý00…‚dÀ"Ô6ÓÄ †¦\`J¾iW…q®€•|WŠ{z5G¶¾`Yð"þwÏQ2FP²~Fï}‰'§Í¢fÃ{˜”à'&`Pãö(U¦V$ÛoÑQ$¥xàþDë:I½g±=åÞZþÛ•xêµêL¬–«JKJ·ÝÕhM"hFrÿsOqtÞO\[RÆU¦ÓûeñÒŒi”©Úš§¦4%ÙÐ)Ýçy¶&¾ÉÛ‹_gkTnK‹FëÖª:1LÙYŠÛok"ÅpËÝw‘ì–Bæšö½‘Ë9éØp*'_xGŸ‰¡Å¤é”ü^C J4ºJJ(’O™k[ÓFKÁ°VR#Fö7Q¼~Ò&ÅG׾’Eo@dqZum…@¢j(æRþpg·)¾ «~XÉ‚·—rÈk+ù66666…‘ÇpXP˜¦Iù¤ªxf!K°÷Ô÷œN\EÐ " ™Ø3õ©×)R¢t|¥|í3t™æSÞf\ÿûiwãg”*žˆð¥“]¿3M ö{²ð-„e`ªåhSC0|èpª•Ù²ç8t…ƒ"b9ôþšô=ßh5žå#X) Ö¼û¿¯üòÓ1¦¼>„rů¥Õ+÷ТËç¤Æ;ÈÎv1hΫ4ˆYÔ…0ñeyÂ’0^<¦eèdûü!0ü²œf¸¯M¼/Òö™isçf†=¼µÄ5Œr·u¿†g†õgu…"|ýí>’ûX#H–'€……?˜D¡í4ünöÕ*Í®µ?á¹×G…î"eæ½´ëó9%Ý¡S@.ÅÌ7ÆrÛC-èzM5\¦NÑÆ=˜Ú·ÞìlL3”£ èÉÂcˆ½®‰¿‘qòÄǬ¡#FãÉÎþCß7YQXõÙ§t½£'™é—Í›!’éO}éò|'R8RR„?_.¡Ã%’aý¹—®óëÈw‰—êà<'óÖ‘/¡ˆKEaÉS_^9n·›Ñ#‡óÄÔ§q¹\\˜ kʤñ ùÙYYÿßEMÓøèƒ÷èÓ÷>{†±±ùÞï]:vêLfF:²ü÷Ã?d¤§#€rå+ØjS¨9vô(™™é$'½l˲X¸à,ÓdÀ !x½žgqÀ²ó6ÌäÛàó…E(”ÓocD«gph*R¾yW’¤PnKÇ…—$ÍéD•Á›™‰¡ºrnZF@YAF ;l™r'ÃãdzùdøÁév•ɨ*Õ(óæot/g!)n§IÊ­ÃEÃét³5 AÐçCrºÑd Ó¢ §bá×n§† ”4Üš X|TM µ+WÄír! Ÿ/€dTY͉S2ñ.-Üw&~Ÿ‹°ß¿¢áTe„Äç7ˆßS§Ìž:ú37¹² ü õ“C‘øƒh.²$Ðý~LÍ…K)8ƒ¦®ë|½~ 7ùËzUVf& Î瑱㷜_/ ABñ¿}@6>ÎéáŸçÏe‡ËùÃßÓÃõ˜yÔEÿB2¬¼Ÿ¥ÿð;ù;2Ï÷/[—t±\þâ&?ißåêÈw‰²¬’.wm—‘-]FÎ¥JÚ:66666…!,,ËúWÛ Y F¦JДQ%K Ï×â¼Kn®Õw×®] 8‡ãâhk•+WfÖ¬ç ƒX瓯È*.·šgî·0ô~]àt»‰,Ëú|X’†Û-çô×°rs»ª3d´,$«8ŒS -¨$UÃ^\hN'n÷*¤°ȸÜî¼'±q9Èó’pºÜùnÙÇyé幘‘ ìÿâ="úN¦Y¬Ã'P4'îÔ”òÄ:¥|çO:ˆ•\–d—è«ünNÿx׋ÜÈ@’òùsý¡Ë˜=ÿ „eý«HÛ\ßžvµ;…”~B›rƒFð²ÖÞ iþé|÷G¸R(˜fþúS+@[´ÿ{È$—*Ÿ'#½…i]É÷u•ôªÍU®4»©ÖzÈ\ +¿$綯`н=éÞ½;Ý»uáÞ‹ð]RòzÏ,ß{aÄ//Ýs;ÓËS¯$ñóKÃè7v:'ü!ßÉsæqÿôíÿ|WIBÏ<À„Ç^Æ#„„yn/cF>ÏIéö„Ø÷½ÍyKþ¿y膎?èÃôá úè+¢]öñÏWËBʶä C§Aƒ¬]³†GF Ç oÚ±, ÅuúýÌ'Çê±ê•vè^Õ„0ƒ~º ²‚ÓåB‘@u¹sRw[¦ŽßDsQN´ çÓß­áåP§Ímôk\ÿá|öm(…•e u,!¡hœIXAdI4ªÓ…C2ñùƒ 8p»4$BaЦ%P.œš’ÿÍÕOúŽwùèH_z• ùhúáS¾Ö™‚ÀïóaZ :œ84Lƒ€a![KÂ) „¢b:H*.— Ѓ~tÃB’œ.'ŠF €!« 0Ãè݇Ӆ¦È€À rúÓátå¦@·±±±¹Ò”|K\5þÑ6…kqy5Äд•üBÀy¥±e«V´iÛ6Ÿ ˆÃádʤñ…åiŽWr¥Êçœ îýœ~Ãçâ,žŒ~j/1MÆ2ó¡úç{0oD–N&5^bÇ®ßi"'¾æé…§øpG0 ®o߇7_x‡ÞÇä{½µwþdžÜ|–3ƒÇ4›ûiEöгîÍ$4i‡yî0‡cêqGñl;qŠm_ŸdÔât,/³éõÌþ2ƒ„XØŸžÈ´WŸ¤J„”ëz$ $-šÛ›¥Òwú7ôšÙ€Í‹ß£k·wøáõAŒZ|Š %ö¥eöÜiDîþ€¶¼Jó6I¨r-bÆÝ,¿n 7—•ùõûít7‡Î•æ<>†_ýnÎØO±ÛŸdúUøô¡V<|îZ:—4صy åÛ݇ûÜÏÙÿ+¢þpæh‰~`-÷}5% óÔ^Ü F1ãáÑÀNØeccs%iY¸\.²²³ìW›6Š,Ëø|>šÓVò/\ù„B<†ðûýH’„,ËhZhë´®ëX–.ëÌQ-Ηp†wv[–E0Ú˜¡iŠÊ$þ–<§Ó™#ãj•gF>y¦¡ž‘¥ºQ¿¾2eTL_&7<³ƒÖ[ߠꔌªª'Þ¶»î[‰*Æ‘E¼·?•…‹ž¡ˆ±Û7~º¥2ö³zýAú=ܰ(zm[nXs/W dš–«æ—ï=ž×î ý¾ÿý¼þÙ÷¤õŒFŠ¨È ÇŸ¢zôiîkÞŠm·ofVÓ(ö̾‘ ïGÇ!™<=ÿ4³×¼E ¾yêF-ÿ¥ÝŠåQ–%@¢^Nȵ&°éé5Ô—71ÿk'3Æf@ŸŒüfÍ“,OéÍ“_fzª‚™Ôœ‰“Æà"Àì9‘ÔiÝŸ1ÝRØóå Løj·^׊OÍ ÉIÿŠúíçqòŽi|¤}U IDAT8Ý*ÑÑwðÌŒìœJ½ÁÛølÙË$eí ÍosjD –=÷:'¼Å#5\ÀFµº•½o$-Ñ~°ÛØØ\9¦AôFlüj=õ4DU»Sl ‰¬¬,Ö­]C£ÆMl%?/ÑÑÑÔª]‡¨¨(«V~ŽÇãáëy|üã IŒóMš4!22’›ÛµÃëõ‘Ŷ­[ñx<ƒAš4mFTTõêÕeâ„ !˜º¨¬ÃáÈ©CØÀ#£G3v̘.>—••Å×.–W¯^½œVyå}ôáâ‹Êjš–Ož®‡,ã#GŽ`ôèQ—÷Uîõ†ëHKKcÍ_\$oñä”õx^º”Š+rk·îȲœïo…eãm|íN¼œ‘«ó ˆk4µË°qÇ~²¬xšwlN ·LzWI¤8=“/7îäTl ^Zð>¥³ ãF^O$P}Ð,‰ »¼$¦1û£åæ: žIï½Åªu?ð㉞úd ~³(n>2˜x‡Dsߤlj‹ µ)ªîFT(‹ºÏü„òë×qð\6Åëw nYÇ¥B€”À°7?¡££Qákëðì ’×¬ãH¦Å”·ßâúd'~­!ãï<¯¨kÜ<åUŒŠ¡ÿwBå›èÀ™šÌ´Añìܽ›R­³ ¶N1 êIŒIŠwf3^— ¸K0îñ"ë÷cíòÚlؾ,3–;7%Ùi1›« [É/(ªÊŽíßÑå¶®9I± [2,$ WJ%Ú¤ä;@‘òuh_¾N¾â›´Êù‘T›;V¸ ÂÊthúä¬ÓŠœ}¥²Fúm©qþ×"•hݹÒEÍ©Ó -üÉɵåœwo@½âçGW4i7µç|Iaéx³}ˆ<ÿ)OÈͲ׵¢lÞkSb¨×²õòÈuÅ—¤QŽ¿‘B…¦ms¯3¡ ÂÑR+¦µ âmŽº¾ ÅÎ×ï*MƒókÑ4l\+§\\¹Ú´/WÛX666666—ájеl%¿0è¿„\FÎßl’"õÊ| œû–gŸþ”@X©ÇÒq—í̈¾iØq!llllþù/즚óìyϦ@frDßöÉ·)°‡Í•½â—1ö©F—ú#‚Ëg·µ±±±±¹]×ÙùãüüÓO…"³»ÍÕA„;‚:ii”*“j[òó"«?®øˆ¨Z­)¯†VÞ²Äî«pUmDé8×eWNö*ý?ãÜÎ l8 i«ævg\é‹0{Ӛ́¢(ü¶k§“C†ÚbS`x½>]ö1šC£XJqÛ’Ÿ;*]\ý+&óüu1‘q°›QŽaÌŠTŽŒFUd0x<>L!…U .pKs#KOC ¹£p;T@ û²ñMdÍI„*a¨N4Yôdaª‘¸*VЋÇD Åá"Òí,to6>Ý*J×¾·'pûÂ#Ì^°Þ‘66666…NÉÿaÇúŒ¢pîE³¹"‰ˆˆ¤eë¶løêKŠ¥¿¢Û*¤03à¥NÏ¡¬[¾]–5'§?~”ƒeºR‰Íô¨U’¸È(Ê6¸‹M'š|€Ž¥âèÖ¾)¥+Õb@³Z$ß=‰.uË’P–Ç—A‰ÐølxKRŠ&P¤Hiî{n%Adö,{š²]3 Y9Î ^üoŽnOb¬ƒº}ž#Ý‘,/ŸÍx€rIqÄ%§r÷‹›š†È<¯{N`^ͪ¾iRæÆ{øqëzÛJlccccS¸$ôpF÷ó®:ç•}û°ò°, —Û¡Wü0)P%a’T® ¥÷Æ'ge¢ÔL{tÍìÎÌÛï$ãÞ%úýoöñ2úÑ9…ŒpÐrä›üåÚÕˆÂ"™W7îçȦ1¬š2ŽãYi¾Ì¾ãg8sh#ò×sØy.ˆÃ©qvg&wÏß̱uóö8Ùl:¿íÛÅ §Þæ›}ÙœÚù!s÷WdÛÑs¤[Gôì^ÌüU#°q"î~¦]ÅO@“¸iˆß¶"ɶšoccccS8±Oûø7Ž«Uò% ”èâô­¯0öù~ù˜WÏ´fèM:«cP¯Z¨Båš[îG>þ~CU*•ëËÁëóc¡|‡6±¼HÉ5(ªžÆg*ìûb*e£4ÔØTæ-ßÉa¿ ¦ t›ö¤%»I¨T“rÎdê7¨ˆæ*FÕ*Qœõ™œýå#>m,‰nÅY‘¹GÏpt× ¢Ú¿Îo& \Õ>ÙÈÍ%Î! -_\þé~ÉҺϋqQvXAÐï#håŸ.õ9gâøóÙ%.;ðCm šâ²eÅ%ë¾|ûþV?Zþ€noR³±±)TH’T €i™¦žs˜–ù_h ÿQYøo]Ï¥>ÿwû•ÿêµÿ»ÇU£´@K8è2ðVN¿0Чß^OŇÇPÕ%p‹lŽz4Õjœ$ ;QB±±òDɯ® IÅuf!wÚλ¿e`š:t*ÎyÕL’¤Å)_ô %"™VcÞÇ4MLÓ@×MætŽÅ íêjh¡Ñ²{=„uõ+t’díÙÂìg&3aÂ&NxŒi/¯!pÉÁ`z³Š,úåÂWi¦´mȘù'†ƒKf3ÿ«3áëçƒg²z¿7'<ÛŸ­\%Igã³ÙyÚB\vðûy®aI&o1ó}W÷ãý¥_bŠK,Å“ÝïÎ`Ù÷™ÿ•Kö¡%Ü:h&–­ØØØ" ÜeC^ù|“– b‡x|qÞ^û–°.ÿ=dd9ÿqq9‰`ÖAÞXô9†õgíP?Ÿ¿ò<ûÒM×Ï߸EÑÙðâ¬÷ §ö/gò“ ÈÊÕcÅ·-ù—5%¢^ß—a%×óØŒŸ™Ô«Aµg½ÿ ~ÛÆ«còáqþ¯'Òî®—ñhŽ«ü©gAù»ÂaµÍÞýÏ®”h×éfZµjÃM*]vç¸3*†‹×iî¨èP–×<\:›ùÎðÑ›xã`2J»/1‰\¾m›ßœÍ¯YòÜyΨ\´Iϰxù”ó ü%„ì~wË·gæÜó—´Â_¦q¾PUGx£¹­àÿÝÃ4M²õÓhENaÆÄŒ>D¶~ë2Ê0’‚’ù ÷4(C–ˆ.y=O|°•¾˜w! ¡gâÍw?Ç+“—_4„ H+^™Åþ ðÚL»®ÃðZâ/)úy4)@gà a%?ÏÜ!,?ÇŽŸÄâo-r0ÏüÂ]CÞæÆþss½r€Ll‘x5ŠÄ„Xd®"w«dl¨ÿÂh$Œ§ïÌ¡lYQ’ú‰Nü™¶/É ãGðPŸ!”k=‡—GµD2S»Icb4 ! èµhRÆ…iZXÄP¯Q]äøv,zm;£{7'"õFNL —Œ;¹<ͪ'cZ¤"4kߌ"²‰¥¯iqÜÅÓødÙ {b4=gkT¾áVF iD8Õ«Z7Ž«Ñ„fÑ…ìIn!%Ԡεi9§¬Sß1fèD¾û=ÃR¹©ÿLÆt)—£XƒÎ’©ðÌÊC-YšÀsÔ’€ŒÝ,Û˜IÛ¶uÂÊöiæÀÛ»X6³.t–ÏÂôw£J©íGðʰ›ùjÂÜû[y:G`çÏ{©Ò÷e†D}È›½D÷ïÈÂä<7>'ʾ3~üÁx¼ô&Ý«„”xYU ú’ALäúñoQíÃ!lù:ƒ.·}Oí6ƒuo“‹¥tÁo’Ÿêˤõ'0}~J4º‹çëƒwÇB:Œý˜6UÜü°ó7¬º#Y<¥þíoÒãþÈN(M¥*Å jUl­ÀÆÆÆæo`Z&ºa¢:† »udÕD˜ëQdUUQä\‹’"Ÿd`­¦üÒãC}Ößïù!CA–çwÖ­^Ç1 äu7R?Õbÿ¦ÏزÏCåÆmiP6 ïñÝ¬Ýø='³-Rª5¤yÝPŽtIY“9ôå2öüö çϧL冴¸¡{¾^Á·¿$²x ZÜX‡H2ØüÕ’ŸÇƒ4¿¹=Å¢äœùÅwz/Kßý=¾­oLÃåH U‹¨dù•mYNboã§3uZßB¨Ã,üà+$Y#2®M›7bÿ«HjÖ‘RnÁéý?°ßUççï°ßçäìö¯9vCk¬_Ç5]o§ˆîî¶-¿¢aÕ’¤þ•_ýˆ«de’=§ˆjt35ãàð¶/Xÿãa”„J´hÕˆD‡—m+¿@ÄF³k÷Aâ+ß@«Úeí›ô_Uò%º"M&°¸™À0-„°ðù#¹õÑWè:NB ÓðbˆDNžˆešX–Äõ÷Œ§¶0ñëH¥1y¦éCj;’ÚB °L‘p3O]AÝ¥ O½õ4–À2¡iŸ‰`™¦ ®z[^x¯]xåjaš~¨?œù7€a¹3 !(ç$¦¶»Uq¡nIZ݉˜¾,êŒÿ‚7?‹6h>+Ò¢€ƒ jó{:,ßk*æ‰yyƒÆ»ËVP,ð·6ï‚,GÖ1ééý4l[Iu²åÕ~”=ÕµAÌß—óüç~Þøø3JËèÝâN^êz3 "(κL}é dß::·œŒ²a!½g¿K©YKéZÌ`€Y –¢lœš¿A·Ïî ëç%´|îM^ð1+D¨8:g–±pî¸Ðk5!þÂ='¨=à>zÛðâÈžl>Ú…ëTKªÈÃ3'Ï>zV¼•χ5bå}ÏPëùLhÍö7º3à;[É·±±)DöŸr$‰ëÞdïÙíH2èÎ3D¹ƒ(šiZ>ûO,„4¨—ÚŠnzäøécy8pƤb½Æ‹‹…ën$Õ41ñ2±k3v_?ˆ^uãØ´mõn–Iÿb.UªD§äÝ´k¼uG—¹~[Ï%R;ÉË‹wÔcã »™Ø&tí–)ˆ)S‘˜Ø=T¯Qƒ¢Å“Ø3ëVÚ¾›ÂÔQ­ùáÍûYþãSÌP’qmZ;~!¶¯†KÉí;I¶øð¹'¨óÐ-lz²?ú–0¦¡ŸGƽʒ¥/rìÛèxßûLz÷-êúgÓæ¦/Ùúýd*T¬ˆ®8Q~šÎ½÷³ãÄbžïÛ“–[¼ô,i²óóטÝ—¹+ávÿN•êÕ(™àgì½]IøÂäñªpèû™´¶+FÕណ½¨>è Êm˜CŸÇ^gÈ/‚â«SÒ¦NèÆÉO†Ñ}Y?VÌiÏsÝnáD¿Wx²[&éKðÝÏé”â@ÿ‡Ý”¯–}mÿBÆÛ°o¼01ÌܺIÍ<¾Â¡r–iæ¬T…ebæ)oš& !,úè?€)Η˜†™S§°rëDX˜ù¾,°Bm»JcîÚXÁf½Ê>y»z¶ADL$Ó—îfI¿&,#äïU®" «&)àß÷‘ej“¥ D•ãúb)¨~›×†oˤH¥úlyÿ#~¼£9µ4û¾ÀUºÅbT$JÓ²œÅòí42%^RÈÝ¥HÔ2ñš–ÝßÑÍ 4†M²pÈYŽNx‘A2˜>êqf|ºŽÎ¢B3ôvÉGxcÒ_x¼ðÝ‚<üÒWPH?+ñä½:’€ÄšU‰ 墳øýè¶e–å•¡·:åoêNÑm‡m­ÀÆÆ¦ÐPsžÇ8»è)$w·+ˆ©Qœ&ºÏE÷’‘ÀsÖଯFþMºrYÞ^6•FS)R‰†7¶cð¨\ï…2›òÍäDË‚Ž²DÖ‘u˜å»òæÔ‡ˆâ,›fUæíáéÛïãžÝ{9t2~ìu _°³MÇð<&ˆM­DLìjÔ¬I´ØËÏ=˧S-ÂC¹GÐÿÉeèýD)WŸÉt¦Bì…þ£&mûÍäžîE¹)åwú®üµq9%\ÎÔ‰í0‰¡mkãiðH]6žšEÇ´zpn+-nYψO÷SÑõ;Šªr>°Ÿ$ÉÈÈ$•¯LDä.j^S7§‘U-¼÷dÍMÆOs9Sû^&ÞÝÙ¬Îüç>D1Î1nÚZî˜ñiIA¬Søü®‰õ´EK,ÊC}{smE…îõ“y}[:&#Ù±%þ-%ßæyUùÿÃBr'WâB–G0’® Ö0¾jÞrþðCÔ"e0|™9>‡A?QUkP¹ÍHž«þ6›tæåÕË©ŸŠ7óLØUÆààÙ )Å܈_óFÓÉÙâ €¬„|ò—¿ù2¥ÍcnË °{ 廞 W¸gDÞyð~ʸˆVEzæóɿĄ%ËyÆ™3dê^^ýe5]ðÚ6ä-.ˆÆ#¹bˆ%‹\£Þãx…RÕÆÆ¦ð ëzÙä,Ë"h̺‘A@=GPÎÆkðú‚ø=AŸ‚eZFnÄ¡ë¸ clj~Üw€¾œGÏî²vÂQ¢’ª#ŒA,@Á0 âJÄaz}—E¼ËâœÏÃ{C»óäá*ômUõ€3N°‘ÉÐ1 a…äZYG9lªx~ù†Í– ™Á{#Lw|$’ebä1p*ªŽiiÄ b˜*º ¯D¨NÝ€"¥"@AD: ¼~ ¡xªßT›ú!7b rúÀa†Û'L ¡ƒ¤‡Ë ݹV AöáŸI,R @„3Š2‘n‚ÞtŽùü”ým›öë˜Hô7žÍ@v8Q4nèh²E–/¦Žaü³:‘aW…!ØVò …‚ª¦!,+W¹+¤Öü|‹9’ûïlFÝí©üö4jjGY»a=†ô uŠeâ¬x7¥Nõfþ»©–¾Šõ¿ ½ìšO«Ñy!…)Q¡Ý$VjciÞõAV®|œj'ÛòÜÒ¶41×°àl]ÖÖup`õ»ê…À’¤¦Hlÿf "*ŸT„_öœÂjÉ3ã– ;šä/Ù¤Ó럢ÁÍ]IY¹ˆ*®"(Çe랃THL¢H\ÄE›wpâ·-lú6aI$¦DQÂušCǃ”ô¾ËKó÷1¼¿tјÑåÛÉà±±+h8%yc¦“ž:Ê4666…ÃôcY˜fÁ$%’$ KXx‚Yœ îÇp§ƒ@’% ¿¦†$ddI »ÿšá¶I|^/²ª’T²7´¾•Èé30RoÆä3NeúIqK˜ÂÄ´,,º.Ó40à;΂'»a)baç´i¼b LË@ °LË ­ ÃÄŠ*AM÷)NkŸfntÃÄ Xû‡ LCÊ1T©"äIa™†©bšX†iæ”·, a™ÓÉÄI•ØñdsÞ1º°¾ë5x½A\N’¢Yç<˜E%NÛK°ìy÷ìЦeSÖHŽ‘8w*«RçŽüLv° ®Òu9¶h¾ œ±Ò³(刢j¬ÁQM™v[~ÝÄ4Á%ŸÃ‚p?‰ÐBÁ2Á4þq%ß4«"8¹­ä C§Aƒ†ìرú n¸HÁ/,Vþ¨Š70¸kl¾ÅMÑ›ccâ¬XÀ/r,×7mO 2õï|ˆèD@IbòìÇymÁKüT¬E\"`”¥E“h4 L§‡èU¤%ZMæÍ¬Y¶ÎÓï½É¼¹KX)aѲ¤`¡7îDŸÈ¸p â¹å®^ÄÐnÆ{ýcæ¾U‹‘Ã'ùÊžxn M†=NÜv ¨{÷ÓMœ%Æòѳo³aç>j4-ÇØáíX<¿¥uáŽv5¹0(P¥îC©õÛV®Ë ¶YÞúpBæÄþÝT¾s" Å[2¸ÙRzu¿ƒrE#kÜÉÌ*/dþì ¼J}:”`bï~l®ÃÍçPâ‚!ðfg¡›&JD åü›¹ïÁþ4ly/Ͼõ(=· kõj¸Ì ÅšõfJïÒx²=˜–È}LHN +ˆOG2dûƒÓÄãõb ô‘íÓÃûM¼Y™wÎ!mÌ&ö¨Ã¸aCbŠÑäXz<ÜŽAÃïfo­Òüºæg¼ýL„iíña ‹€CÏq½è6ª#›UãôÛȾ¶)Ñ•zÒDïN—>{)m’áRÌÇ­wµ§ýâêÄ*‘odúøvø²2ÑM°º/n^”cæ78^Áü•¹^š<ñ1kèˆÑx²³ÿÐB,+ «>û”®wô$3#½ðú†_¡ÖŒU+?ç»m[Ñu#ç-’% Eâ:b4ÙYYÿ•ÿ‰¦i|ôÁ{ôé{_Á=Èóܬ"ìÒ"…ÃIÒ¾Lm‚p ü<î1ö$¯'Mh€Ÿ—-þ|(]FÎ_Úgû·>¹m˹V›çý÷Þ¥c§Îdf¤‡âWÿM2ÒÓ@¹òìNµ)Ô;z”ÌÌt’“‹þá|·pÁ;X¦É€ACðz=»¨@`&Ï®Ãnm!º¥£Zj9àþ&£P‰ “& =HP7B/ƒe—Ó‰"K¡$…þ–EsáÔ 0qºH‚>8#ÐÐñû‚X’ŒC“1-—S%èó£8](z€€n¢¨N\N=à'h„‚’hN'E"¢9]9>óçÛ§û¼GEÂ2u‚¦„K“ñ œN °Ü¼>‡F Ì£1ʸ\ndÉÄïóc!£*2(NEà ˜¸\Žðü*c US’ŒKS–ÏÀÍ!ÚÕèýÛ¢[¬ÀO@7ÕáÀ©)|>TgŠ,0ƒAtÙKýçg<]×ùzý:6nò—õª¬ÌL.œÏ#cÇo Ÿ2 Ð !_c d„s@zøçùsÙárþð÷ôp=f-H€mÉ/4ȲL»·Ð©s—|çUÍÁ”Iã¯úëË;„rÔå’Uýy«Ü"yçŸ Ô¼Î_ö/ ðËÈÉ[Í7ïOáÙ…Û°ÂO^!9éüÐz6)ó-.l›­àÛØØV„°°¬‚Oï'Â1|*AÃDH "6WÅ—Èi"+.E˧X[–dœ.w>›Ã¡", ¨N`!PpºsË) X–@u:Cu øÍƒ6 IDATUnõübH hNÜyDZ4‡„Å…h§;·M’‚C •w8BîGÈ*N™œþÖ\.Üî óÊX!廦l gžë Ç…et/‹çNã¨(Ê©mŸ’Ñrè~+|mŽ<‹=îËIÕpäôé?Ë¿qÏý TÉ·,‹Ø¸ø<Ö©sÈáx²îˆHü>/º®#„ &6Ñ1¡‘d™ÙÙÙDFF¢¨Zxµ”ñ7åÅæ(lyßDü™¼ì¬ÌP¼R^DJ89×É3t=Ÿ¼Â’«ðOT‚]ÇРë%ÿú×6666ÿƒÏNq©Œáÿ0²$Q&¶:ÁÓ·!k–”ˆ®˜û†Øæo®ž4šµïÁñ³^äfÍY.Ù¼ò4;ãíÅÄÆÅIJJ ©©©ÄƆ”Ù+>'11‘¤¤$–,Y @LL *T %%…ˆˆˆœ²@ §ŽÞ½û iªªrÿ’’’BTTYYYÉ+S¦ ±q¡EêU«ILL$9)‰Å~R¬££©T©r޼˜˜‚Á ¤¤¤Ð£gϰ<…þäÈKOOˋϑWªT©ykÖ¬!11äädÞ{ÿýyUªT%%%·ÛMLt(Ä¡a9òºß~;‡EQ8xp޼³gÏæÈ‹ŠŠ"%%…’%KæÈûrÝ:Bò.\h?4®†çÚšêmßÆÆÆæ²J¾²æä!„ Gã>Lìò,ã;Ï`B—g¹µ^·P0†¡=…æ_,•jÕªQ¥b*‘ ¡ÈWØÚ—påS –üÌŒ 23Òs^aeff"I­[·â÷ÇA  Ù”™™É¯¿üœ£/ët:sê0M“@ À ³gñòK/"I^¯÷Òò22$‰æÍoºH^VV?ÿ´ó"y‡ƒ¬ÌŒ°åÜÄïÉ{þ¹çxaöì ä¥_R^³fÍøýĉ‹äíüñ‡\yayUUóȳðûCá Ÿ1ƒçŸ{î"yéçräù¼^Ün7mZ·æÌ™39ý^Üullllll.©äÿKVÕ ´ÿÿ£„KÐU§äçUPÏÿ¡$ByÏŸÿ›Ï绨,pÉ:‚Áà_–gYV¡“gY«>ÿœmÛ¶ ëz¾`bb‚="mllll Ÿ’o‰«Æ?Ú¦p-.¯†—ìöÆÛB€ªª¬X±‚ø"E÷ø¤Üìt€Óé´-ù66666…MËÂår‘•eûÀÛ(²,ãóùphN[É·)%_cÓ7_3~ÂDDDüÏ?ø/V“¼á*Eø³ô¯´éßHVvaøO;¼­ÍÕŒa4LkÄÆ¯ÖS¯ACTU±;ŦÈÊÊbÝÚ54jÜÄVòm à–“ÀÐõÿWî«Ay÷ŸÜÇú­?’í…ƒuÄV£u‹êht†„Ÿ©ie)ùÆ!zW×òü)›ñM‘ýüv¦_›û•Ó[Wòkô 4ªè|»j5‘×ÞÄ5Éu•n²{ý¸¯oIÉèK„¬”$$|L»®Y/abƒÜagαuç ÒjUA¾Pñ!IHV:[¾üšÃçühQIÔLK£Td€-?£Níª(Aa—$O´lÊé§7ódì6S‘&å¢ìÁcccsUb™¥Ë¤ ørÍj ðcØ€Š/áv»©ß qññW¼ÁìªVò…wL4x2ñ™üO['ÿ®ýÜÖ¥ô{ò(3G5ÂðYˆ?¸fWLŽ‹ ;DÆÄb^pþ§Yýy¢Òg¬[‘5;3õh Þº¡å%ï·K‹TXñØJ¿ó¥¢/ÿhpÅÄc\0â„ñ;Ͼü‹^s‘!IHy«O æIíص'~ü’£ÎbªúW§O* X¬ŸöY€W‰¢Õ°wÝåVV¿Ô…GÎÞLý_çóÝþ ÷ÿg“GðŸý~¢šÜÀKyÛ²hJKžx¥]´oNŸ@ƒ‚™%;}?ÏuíFì iT›ÜšoWÙT¯>—º_á­aͲ*¥`þ̤i<¼óEÚåhÀ’îøö‹êÕ?£^—1 .¶Žžo.âä9“2wôåÃqƒ)ê²Y÷é0Œ]LTÙ[IúÝG‰ôcŒŸ¾€ƒ§×Pe\þ³pMJ%È #‘H®Q±¥\~bD‰äJÜW1WXä+øo¥u§Ùü¸ù\fdæ]U':&&"ú |i˜BÁÓ‚ÃXøÒ½˜t§‡(·0‰Ž‹CÕä”O³sÌý´ÜZ—áí å/¿æBÛõ÷wžå÷R¥ÿÇT_û{š½Ã¶ñÅ!°™Þ-¦Ñò‘ÛMÇ:ûcfŸ`κí”ÈøVº )ÀžY´êy€õ›ßBÑœl›ò(“;õcÝ’®$(`Ÿùšïåão6SAÙEû{3íîï¨ãÂÿS>†Û_žÃ# ’Õ˜ÏO.dæ‡Ï„÷ùb·º~uMâ™fmXß´>Z´£YÍR4~gw>>ŸÞ|ïñª|ÕéeÜÀÆ·›2q~3^hr„Q“aúš” n¡Ý=qÅ¥O—¶lw>Í×}ŠæhR"‘H$ɵϕâVTÜnçÂ?px#÷Ö(Œ¢¨$ÞÐ…Ò ::ÈØ nøåó:ˆ-ݘµGƒ(Âb퇈Պ×ï˾#܃·Bdø‚RìgžU]¥HÍ®<úèãÿZáÿ9¶™ÔŽW^ɈѯÑ÷f?ÞÍ¢‡ë’””DR¹¶|ç3ñzC(€¢A`ÿÜeP2w±ªÔ.^ KUaïæ·H$<Õ‘Pmë~Âk…Mö/A/Ó€²ù]8òU¦M…ŸoJC±¡D“FDä©L1çÒ¬ †-¬pˆŒÿW^ºï6Š)FÅîÓ1n# “1‡ÐxÜti„¬PË2 e^£ Ô¶@­^ÿšõ GP«·{5 ë„õ(fË2 FrõšÇ–Ò¦zYŠK¢ýk{ðzÏØ¿­TÊ$:p©BíR%°„iZØF ›'BÖ‰D"‘Hþׂ¶º*Fj*±%yq΄±vˆF«û§Ò]è…`°2[Î|÷bIÞžºóô7 ýà_î;ÉÚÑMØyòwtU%´þ%ŠTÈ)W”¼ó"'‘Ûº<ÂF‰)Jé¤2T¨X‘"y_ O¬O&99™ää#X·*qŽð‘ Тóa›È«\›€eäØy¨Ú~Ÿt8Ë= ä§TÐc ô¥G*ˆÍ©t“< ÎKÜÞ"r®!œVK~ð¢Ë‡?~”äõC±‚‘žƒÐ¸·g;¦<û [Ò"k‰p\Ÿz>õM¶ä¼-r#ú?ÇÒ%“Ø4ùK|N EUÐTÌýôè2Žóöpôh2ÛÇ×Âï7Ðbò#²Ä¼ `…;ÄBÔliVeÇX"‘\“O¹H˜Žª(¨Š*¹\EÉŠŽPåªúÿúÀ[!Àåð1í‘6¼ñùNPj¼Éz ,­š¢z3H([‹ô}øw-&ñÖVTNtU°w–(„iÛ8ë¾Äï{® O¶|¹¸ãBö©¤ÕhúÜWƒZwu¤â¢qÜäHfùÊm´~°[øÞ²,\{‘÷pvœ}”ÊgÖ°j÷!š+ÀÁyty”' FL[§Îƒ1/Ïî½w(ë¿LÒ/M™´ºwš_ñÑáŠ,¯çæäš‹+´ÀVN±÷2ŠÇåál@|¼3l6¶³~ÖþWió4oÔ}Š»÷fÑ×SÄuì‡Î¦Q26 ‡CÏŠ-UB;ÐçSîì×[Šé,yc4Λ{«Åb;È¡3i”Õ‰w†H éÚÊ#}Kþ'ÂY¡'…OtcÛ©!Tó®gåŽ}4RTòç!yÙÒz!Js £È¬‰äšÃ0 ~þi»vîÌ=o¬%W=Qž(n©Y“¤%eLþåÄšªª¨Š šÎÊÉ/ócåá¤.èLtò[ÄÞôvf9MÍ.§PQa®öU[™¾TÝM|<Æeó¤__rÛP$w¡r4¾-_¶¢B‰¯±:ú]ƾ؟‰j" ïíC,*åê7"O,(Žb¼úæ#<;¸Î7ò@·~ˆ +<(9ñ–{¨W8œi¦ò}ï2öØ^šzš7f¿Ã‹Ï>Ç·ZA>X<žÒØ„ÊßBýOd¢©Ñ ž´zcß’óïâ£^fßÐátZGÛ.}i÷­†”¹½ 8›ü5^czúf.ÛÂðöUÒ½Ï?Ô›ª÷<ÊS}ê_X)eèÖº$S?ÃìôoìÌòÇ;¡¸,÷¨Äóý{scÓ!|°p4O½Ð®ñÕéúÑNûZF{œçžèδ¢Uèܽ?‰±P ã`†lžÎ÷~ð÷^§^ÑXÙjK$’k MÓØ¿w/N—‹ƒ‡È"¹bø||ñùbN… ‘Ùu.ø„ÒH>’ŒË´Š“4CÁ“¿ÑZ_˜L†R:Kžfïœ 3Hô½>ù,GìAÛ7Ÿ¯ýƪ‚±g}'¤óÚÛýˆ3Cò.DÅðŸ#LË]E!ÏÍ­xïæÌ餕p@’P(ßì>jöHöþ -^—õ1ÿ -ø`J‹ :@‚6Lz?|ƒU0ŽÊœŸ$ªÅco’YúÍ)õ³u* bû¼@f,^!~é¹°ÁÒ-xwÚyCÞú4ëïŽÍÂ+7ñ~d;‚î}Ž"Û¬Óéiêtºl׆ZíP«ý€‹ºp*u:§NÇóß›Þ⢓&ÈW©)&7½hÝ$zue;.Ù)–H$ךÈß±};?:!„œäOrÅˆŠŠ¦Q㦬]ó-… ¹ª÷õŠ‹|ÕÍ Ž54¿3œ‡Ü6‚ôŸ¶’R¯>@‰\téÑ€Ú{L!È[²<…¢Ã±åš;Žt´ØªŒ{±÷ß\<75 Yúäu‚}ö0›~<‹‘›'„úxŠVÂ3û)n­ sÇv×üñdoº³òË¥MSþ|kÊù]ºÝË­¥p™²áÁr;Ù7³òà ¿+3O¾ê¡çK“y´y¹KDø_z”]æx”¿VL"‘H®â‡‚‚aYŽ“ìÿK$ÿ$Bܦa^õûzeE¾°ñ¾‰›~EÍ ³QŒ€å‹Í¼¥LÓFþ´ Ý>û%ä'd™ä-לIC!“ò‡°½åSÛB¨*vÀO¨ÌPvÿ à÷ù¯ûp!•ÀÆÁáϯ¼ü¼¬•×À5»»ß;üØ/Ç_‘Aó‰DrùöS"‘÷Ü¿-ò•ðÀÉ ?‡Á±ÖŸ†.kF¾S”ð¤FA#¼ Û2ðû³gIQP„ßœƒK=ÒòæµwÍ.úUž ‰D"ù¯ÛÐkSDš–Iöügšª£þ¿¢D¶Ñz9;þ(|3ûo9‡Gßæ…¿‡Ckåòv%¹AäK®û^¥D"‘H$òøÇ˜–Å ³žBwû±m ðhY­;õªÜþÇǪ…=€e]\NE12yúVîíÚž(-ów›m_ÌæP¥¶t(ãÆ²37¥]²ùí¿ÂÖƒéQ̓e_¼}ÿï»™þ}ýÚÕÂÎú]ESŽñé[K¸§ÿƒtڹᆻ&vS°ç†Æ-R¥Ð—H$Éõ(ðsÓ ñ‰“hyN`ÅþŠ•Œ7’HãÖSvO$O´‡gWd„ƒ'²—AA1~áÓO>#Ã"ÛzÛ–Ìà³Cþp¦j!P4…-Ï6Cw¹p88ÍMãì‰Ãüæµ{ç/Zßï»™¸pcØkŸÍ.ÊoLyëN„”Üq®‘º!=ù¹Ë4¹©Z ~=tˆJUªäz‡D"‘H$¹Ã4±m¯ßªe¢ê ‚  2°l §Ã‘C¸ŒÉâI+©Øáv~œô¾;átÝ`ç7ËøáˆÍ·¹ph Ë÷+¿ü–=?§ƒê%A4VÆi¢šÍãÈ”:}&®˜X¼; SĉmƒªÙ´b{Oú(\©. k”OðY_Óm¬_ÁÚ}éÜX??º¦È٥ȗüíFÁ0hڬ˿\Æ‚ùs1-ë‚ߺv=¹t.;ðú|<¡ˆü­\Çðg9./*/#%ÉõDnqdù‚>Þ]ö:!å†e“_€'„¦›84…oýŒ ¿~Eº×GÇZrû 1²fqW°ƒ)ÌÙà½Ï>b|Ûî$ŸëO…|vïMÿÿF;Þyà1vÇ6Âá2x·}=ÖWNçrûùhúRjÜ/ÈòÐ#ÂÆ‘PŒ„ØDˆ0X:ì>¦ôØËònùXùøíŒ9Û–mJòñ“9øú"îÓÂÏ àè¢W¸eÀF^{·/“z”MJÔ\r½äÀ[ÉÅápЦm;týÂKêpº5â…\!ÞÍŒsüzìwBV¸ Ñ\ù)[¦ta…cn-CÑI¿ÒµŠ#ÛO^^¼£Þ··ðzÕó«d?ȱ “’%’pª`¤žà—´Ê'Åüã‡eϲÿoت‚ªiËB…IJ™Õ¸&yßÛC×Êp<ùwò-ŠCÍA¾+ © ­[Ÿæ³·Ð ˜¬Ö‰äú!· º5- K;CTÁÓØÎ¶+ˆ¥¨. [ @¡ÝœM ’îœË¸”ì)¥u¼ÇVq®ømT‹/Æ]uó°`× ž®ãäåw7ñøWûèR:—ÛE©žÇÐŽNfü¶r|µà!Jë~Z2—=ÙΧ(ÎXÎNi@ž…:Â2²ô(Žp¬¾¿“ÊËâ£K‹ ™û3]»‡£Àä“)Ëé1%}ošÇ˜W}JØ %“äN‘oÛ6ñ y²>§¦œCUUnOÁ€ŸP(tÙ²±qñaÝg[¤§§ƒª…Ç›ž†⺴gš&º®ã‰ŠÎTǹæf=ùí'4|n+u¯Ž U°>%/ù\±q8/ù!šèØXÌ‹F¢lÞœ»—¹X¼f5Í*ÄsjñêÎkÁ©EMsìlˆ?Ëà‰×Ë©!»ØËn¤fù¢/:_|2…ªºS4ÊAÙ¦é;w-"ÞJ /?ò¯-š#§D¼8î˜XtÙxJ$’ë Ã0rEÚlË21m Ì–ê'¤#äH!(2ð™!ü~ƒ@†E0…°Â¡º¦e€Í£³õݧX»,ŽFw­$õðÏìøq%O/¼F} ƒ4EêRTŸ?ù'Ìø²Äh!àPb vY&˜&¦ÎÁc½Ä·›Ë±iu ùL!Š¢ i111YuÑ¢Eឣ¢0kÖìHÙÐ4 EQ²Ê¬m´lÙ ‡Ã®ëÜ笲©©©—Ø‹ŠŠÊÚÆ’%K²ìMŸ>#Ë^Þ¼y³ÙK  em£Y³æ8Nt]çºf•=wîÜ%öÜnw–½eË–eÙ›2eJ¸l|<ùòå»Ä^¸± o£qã&8N4M£{÷YeÏœ9s‰=—Ë•eoÅŠYö&M𔋼5à.×–Ç?ÁСO3°G}\¤2gX;ÊÎGéšíX°'M+ Ûç r‰¢Toч§È¯>_0\ 4'j7àí)+ŸuW¸‡<ç9n­R’‚KÑ~ØLRÅØOÏæMÓ¯  •¦ÿäI^õ*7—L¤rÓç9l‡Ïý™ÝËèP«‡¢@àÀZ†T„{®ÕµÐ¯¼¢žüÔ”sÙâ˜i©)(ŠB«V­²¾ø}†AZj*))ç²[fY·ÛUÖ2 222˜>}³çÌ =-õí5oÞÔú:Ò±Qtì´õ<ûÖLÙx ißдI_JªÀÖw(×i/Û÷~¢B½Žä]ò<¹—öÚùªuCG–nA~]°`X&,ªÃ°f 野ðÔçqŽöM»1ôÞ±|{0™/ûUgäGݘø ÂKƒÿÀÏv3·˜`âƒx~ÃŒ­—ãl»N)&ìó©Åt§ ÛgÑpÒt»ï1FÌù”x`΀欮õ¿¼[ßÞéôú ·ÎzV>í%ÉuGöÌ2×:NÍIÙ<·*Ea3ÄÎß¾$;¶%PCJzÛ”X¿'@É¥³:ª¦ñÓ{/ò]ÉÁ,¨_—?ˆî®Àóz3äåÍ|3ª mûv õΪYi"§5Ã;ÏàéþP%ÉÉ×ß¡Poû|ö[`úÓI˰.È*ÊH##h`¸êñáøÎ<Ô£ Ë+•$”êçæÁcécâõ8èñH7Ú ìÅ÷WC;¹S1-!còs«ÈWU5K€‡5NX䘦yÁ÷™¿¥§¥]R6»ˆÏþ½ßï'<ÖÕcOUÿÄ^$çÿk/sÒ‰oV}͆ï×cF–3[Ø‚Ä﹤5·±â«Ð¤Y# ¯AÞ"‚Y{w²ne{Š÷ÏÌørœN †ã Uì‹^©7rã*T—;ÊÇ@õG9¸]àÎÜtt)ÞZ™½_åö®,“±Ú.:ÕmÏÇ|€N—²G‚Ä”¯Aëš%q»ã(›P˜z4'Vƒ;[Uâ³ÍGû72ïûí̯]0½g(R2êTù{Ǭ–—iâͰ‰×ޱüÀV,nBñgÂcÌâwà Io¾D"‘"ÿZÆ¡;hSó¾°3Ïç㙥ßtŠˆÈ‡%n§qÕ–ØÂ‡ÓXávß2‚ë1ߺ;ÐÒ30Ó ·OØÅ:ËA”û6–/ëaæÊ+¶Ë6i2t2 A*O}Åá"=dG¶iqÓ˜ï8&œ2Âá5!?´[|ˆVº†Ÿ²íG²´yÓ ¨¸Ün4š³úC²ˆªÒ–Ï¿hBÈh'/¼nât‡È —KŠ|É•»ˆºƒµk× „`ø3Ï_0…Ûíą—rIkn¡$Tà–›j†?ÛéÒb¹-™ž‰Ù ù:S#;¢ÃëE>ÛˆHŒšŽÛ}Ó±ÍÆÒçÝêLYysäÛ#tiþõçna~õhÎ|Ñ—†;USÏ‹pUÃ9åªöÆ+NÅ«vdõÚwqfÛ3;Ò!ûo^ó)ŠªJ(=ïø‰ö®ì¿¦ÉŠ ‘H®C‘ocÛv®;.MÕ0ƒ fªŽiYh– ¶’™º&’ýæ¼ÐTt'n¸ð\h.Üض@wº³ > !l@Ååöd?›Ù&°t×%ÛTnœÙÊ9\nÙÖ¨¸ç×Ñœn²,è;ˆükåž““aå†Þ¿CçÛU+¹»Qcbã∊ŽÎZ²Äh®@‘­b©Ñtm^Žg÷gã1/é¿ïeÁÌY¤gN«mÙ¸+u'êЗ €8ö#«öDS€#_2hاx³5NEßWŸfÕüEYqó¶P‰/ ìcè“+P]9ô‹/n°lJôâ×R†}¼¯?mK§1ÿPõï |!@‹Á‘q’i~pf`«< nô?ŸÌ åèOÌ[¸ C&Í”H$ץȈÝ\¶8urñ5)§t¤Šþå­ÈS(,.sáñ^“Ë5€ôäçé«(ƒA4=w_N=&‘²IqÙw•ʽƳÄñ4O¶©ÃY­ Í{¥%*‰%Êç´QÜå3²}ÕÃ]öÔiD¢ðgË–_0€¨"eHÊöEä­ØŽv§ñ… gêÜAtl_ƒI‰õè÷bN[NPœ)V]UB%K9õjlÅ DcÇsŸ-ãù‡P|ùËßÁˆw;ýa»`ñxt5«C“·DYâ]yèÞ»[ÞF¡[gÞ„ELÄÃÍj“á.FÇA/¢£’¿DI<Y$Éu&òm;WαôD«gPP²ªVx",ÉÕpß]žü¿âþS^yùy{È“ÃÈðzÿ0¿©ªi¬Xöîï’5ô:»ÅA\œ›Œ´tìëÜ‹éñxöÔŒ=¯wž4 IDATwö”£F¼ÀãO Ç›žþ?¹&‡ƒóæÐ­Wß+W¡²Ý¬"29”r¹‰¯þt6¨Èz‘{)s™c²?<þ, æù¿/š`ëÏ&°ºø~Î>™•oõ²›Êéø²}''úz˜;g6­Û´%-5%+EîCjJ (]¦¬<©’\ÍñcÇHKK¡@‚—-cÛ63gLǶ,|x^¯L݃[ÿ 'Kqà2¿ã¶ cùxÍb ‰ T—'âY•X¡SåÉÇ“ýÊžŸüã2¡/ÊŸo-§ 7WÔËU\%Ç¿/êlä°®uhUjʼ9oRtÓ4†o8Çú^‰(JM6üŒëz .§N|‰;Yv(MQð¨¿3ªU9%½?݃'ÖÁÆ~wòÖ¯tª ã)ö§£bq»aát×{UwQ¦ag¶n\-=»Wø:O‘_"‘Hþ¦eR³æ­¬_³˲³&€”‹\þÙE%==ï¾YE™²Wøä• ×±M⓪‘¶f“æ'R¡Tin¨V…¢ :ðú]/1±ó–ßGFÊ œ}ÆqrÒ-œ\õ&uúM`Ïša,îß… QC8žÒ–%0Ë{OüŽá?”£Ö¢ßh]Ê uíë¸nÿŠíþ¯(ðrÝê|Û ±ÔxÞ@Bù@H$I.zÄY6ÅK”$ òíª•˜¦)c%ÿ8 ‡Ûj×&!Ožnìéµ(ò…°H¬ÐŽ¥“K±lÉ2ÞÿøEV'—fÞÖùL #ãAت›sÛ?åæžð~Nÿ^Žƒ°pKˆ1 {WWé>öeÞ½k2FF:~KàM=Kzš†R± ?ïhO‘@âú¾Ñc R_OæRTÖL‰D"‘ä®ÇœªP®BEÊ•¯€ Ø‘\Ñ{OEQ/› ãºù PT…+Ô¢Oåz |aoT‹á¥·¶ÒGUïBT¾ƒïðÄÔ4>ß¼ŸJQ{¸©âcá!ÊŽG§.Rtå 8ã(U2Ë´®û8g¡¸i×¶¯-—™$‰D’Å–rù$ É•¸ÿ®b®pL¾ƒSû–òѬU=u†_6/cÉAAá2…HŒ±9¶'Ûá@øÏS¬ÂÆÏÆIS¥t Ê7@¾'?çƒû‹rûˆ1ä\^“Ýå‡Ð)æsóäcà¬dJ—,Œm;¹oÜTÚÿÔWTAÆém¨Ÿ `ø=Ü÷b_F7-NÞòƒ8íÝÏ;ï."Uw^×={ÕéÆãP€˜\#ÞmÓÀçË ##¼øü¡K_Ñ* Šàõú¥™±Ë¸è'/#×fØOʽo+è#²#fl~!ëïqá÷aÚ"çWÆ‘}zó¶ÂŒØh^”‹ß" ý¡ð7¾¬cÎÈÌ4u™ý°‚~¦ìDH$‰DòÏÊ’«ÿY{Åcòc“0eõ>fh*`cýøü~ÌÂmYwÒFÁ—æ¥Î´­<¡+ئ‰ª)d¤yÉP óÜ¡ ¡<¯áËÈ@i:†Á7A„ðf˜¤í‰7Õ{ݦÒBP}Ôr¾ÎeÇubÙ[Ôxl­•Ã6‚Ä$µaÔ mÈi&ÍéB»¤ …Óéä⩾ë^Ž*®b͋طp$MØÏÓ|@£RQ÷3.s?)¼Ý°%æ£CÒT6§ ý¢}2½{é4` §¼xY#KÚbˆ·wUŽÆ²£é4d8÷T.˜ã~¬܈Q W²¢£û²÷†"SùH$’\€ Ó ·i²]“\…ži*ò,•1ùUH„…?#ýâP„7-5ë+Ëç%tqÁŒt‚™ßÃÂF˜ÒÓYEÓÓŒë:F/·Š8EU‰©þL¸/2ù‰‚Jˆ¯F÷âÑ÷¾B”jÂøÙS¸«È…Ç`å;Ü÷ÐkhU[R#ÕæâdCº'–¸3ûÓx´—Å«§R5¯û„zà¨Z”§'ͦo­ÂlxýF8Rrñs,H…ËhžïZê|‰Dr­¢iû÷îÅér1pðyB$W Ÿ/ƒ/>_ŒÃé Pá"WµÐWååÊ%ú7òÚ(—%¶m#lÛ¨–/·þ̱e#©_£wõû]'vr,%~…«)vOǪҞz%cÈW½)÷T.‰%€›bÛú×Èé<œ>º‡sQ¥©q£öL'X©wVÈCBÅFô®r†‰k½¨–I™îƒ) P®‡9eñ[_š…‚¨|nÖ¼ÝêÕªóÈÔŸm]“qöÆìôS†Þ„2Ò0Œ¡Ìkw™ÆBXvøØ…‚¢Á¹óHjÜ™ÚE£)x['zÚÎÔ B¦é ¿ ·|[UN$¾ü]ô®šÆ‡k2"gR"‘H®m‘¿cûvê7hˆ"Ò> ¹Èå_¢¢¢iÔ¸)¿þúËU_O¤'?`Y*Uæô©S$/ž{T˜Pà6Ú´l9ð4§D3rõ::Æg/䛬u@×µ¬>­CÕƒcõ8’Šf è·õ|‡á–±¬ú´îˆàÎI ë.-[çJ „’¥ÏEá‹÷žãë"²u[#8ù>UîÙƒ 4ÊW.ÊŠU;xðžJÄf áɲtO~éš-¹·}á¬ÏÇ.+Õ³ûè/S•â^"‘äφiDšMqÁÿÉ?*E„Àíñ`¦ù’žP(DëÖmX¾ì |~?¶mŸ—y‘ùrI«~a:P-šö ‹Ò©ÓKÜ4c8¥ÔßYÿýNj5¹3"ÞîÊÑŽä¸ÙŸ’ç~fõ_hðûz^Ÿ}†¶À Ž'~Iüðûhÿ `Å„î¸w=Ȫ}=©m¯áã]‰¼U/c³¸DT ÕI‚ÓÏ©“iP>>_²·ÝÀ¢±óðiÕ"×C¡åãã¹iEwZt?ÎâÉáÖ¢0N ͆Díò*ܶ­ >'ÜÐäï°±OSJ™Å¤7±àVöB…{‰¸*u!f?¾ÞÓ‡úê>ÞÇØúÑ—t$‰äZ]‰¼ç¤Èϵx<ÚÝÛá’,›Ñ¯¼œ;$¾¦ãqëÙäµF­G'ò‰ý0ªçœVˆÖ¿D½& ·]±P£«1òÉz´¿±"QjQ¶h…pÖ›˜0q?=m‰æòàv –N#?ãx¯»i4¢<Ÿ¾×‡Î-ªsL/ÂðgS?Êfƒî•žGÅåvcú¡ÕKƒhÞ¥<¯FuaÓÚá,nq'eŸÈOï¾Õ(öüëAÅM£áŸahÃÀqÕ˜2¨6kœ¢F©$nï–óÀ[Í…+{J !ˆ.Ò€qOl¤kíJ¤%TbìÒ9ÜðøÓ”mÜ–øʲìÀJƽÝNmnæ¥Ã&Î ÇãË·‰$—q5:³„ØÂ¾ÀI£(*šª]Ñý͹Í?ïêù_dˆùóçŠt-ý+õ⯔yååçí!O#ÃëýÃAÕ4V,û‚÷w!-5å’²¶mŸ'ë‚§¥¦¢( º®ã‰ {~†a „ .>>k³o/6.›a™á㨨(t‡€ôH–ž+eÏ›–ŠÈÁ^jJ*ªúöââ@Qÿ¾½ô´¬Ä í¥ ªêö6£F¾ÄãO Ç›žþ?iX æÍ¡[¯¾W®‘Êv³ŠHk¢‘ó¬ÆÚ–DÖ»¨eú³†.{#îÅgÚþ —-@½ÔÎßܬ—ƒÅ¬óò·!ùç™;g6­Û´%-5\7ÿ[RSR@é2eåI•äjŽ;FZZ  ¼|sjÛÌœ1Û²4ä ,˺*EÁÜu3Øyb¶°Â&¯«¶Š®i—”×rø.ó™eZöŸ 6ECSÁ¶¬ ælÑ´ _½ý&y:¥Fþó᜾ß~fòútÜWÛúÿy¦5Íbû‰|´òWšöD£2ïOÛJ÷{B|´2–þ}šâ$÷¼q1B!–/[J½·ÿågjzZ3gNcø3/lŠ|e6`! ø/YÎ)‘ÿ3¿óFÊ"ë‘íXÙT€+<ð6>!Š¢ i11±ÄÅ'°xñâp¾[Eaöì9ÄÅÇ“M ÷x3ˬm´n݇îëtéò@VÙ´´´KìEEEgmcéÒ¥Yöf̘™e/oÞÄlöÂB; em£E‹–á<ëºN·nݳʞKI¹ÄžÛí!>!lïË/¿Ì²7uêÔ°½¸8òå/p‰=Ã0²¶Ñ´i3œN'š¦Ñ³g¯¬²gΜ¹ÄžËåÎü+V¬È²7éÓOs]o437rx’©ÿ¦ëšMgÛÀŸUÔì?+Øþ \ÍÙNöm.}«;%‹#))‰¤¤$Š•(ÏèÏvs~L®ò‡‡¨ü…´±RàK$’ÜÆÕ[DfZÏœ 1ÈÊwG³ù¤}þ|V0£'S³¼Xÿýq‚qà Z<ö ížxœºåò#ybPôxò&Ä‚ w À½FêÆ ×IM9wASjÊ9TU¥uëÖYß~B¡©))¤DÄsö²n·ûü Û"==œsæÌÌÖ‡“é龜½-ZähïìÙ³—”u:9Ú›6m*3fÎüKöš6mz©½ÔTNŸ>}IY‡Ã‘£½É“?eê´ihÏ›ž†Ãá yóæ|?jÄ ò)p <¤šžLóÁ9{qäkN‰D"¹6°…a˜ØÂ&hPcMT‡‰6V†I0BØ]Ó.ðÞ—«Q'~Çô¡Có'y{åLJyt2NìeÎÔu=EhÐäJ¸O³â³ï(Ѹ=eŽo^Æïùo#zÃçØ¿ƒ™Ó¦Q¢B]Ö**λ†Ò’w0wû.<ūӸNe\yKÒ²^aۜ޽‰íZ!<û×s0#–ºM[RNÝÉ”Ï6ak ªæ"ª@Mo¿m«¾§\Ã{Èë°9²}#§ŠV%ðÙgœsÆñÛÖH»½>{×m¦a»ÖD9 ;Ø’œBÝ’qœØ½•›‘Xñ&â~û…wµ¦\¬Íþõ_²aßI¢ŠÜÀÝwÔ$FIeÓêM¸;¦X»¸£J.;á»äßùªªf…Òd~†°÷Ú0RÿRYà‚ï3=“™a-׫=!kV¯fë–͘¦‘M \.§¼Ó¯rþØÃ.¾D"‘ü‘“äªUšÎ¢ïçóã‘U8Aý,±Bh¶…i™dhGµt0‚rùjÐëÖÕ4¼‰‰˜®tœº‹<‰‰¸ö-àö®“éût?âwŒ§Áè/Ù¸ùM\?¤ë ßÈǽ­ãŵ[)\¼qñ¨rãäË— it<ü^&¾?‰¸•ëÈÉ¿¡µ†o`Û´ìYø6MÇ%óáÜñßÿ mîÛÁºÅ})W¾<¸b®ƽcó³ÿǧ;` OnØÏmy V}8НÛ«¥K¢» *W©@þ¸T†÷ºŸF›|t)f±eñŒ‹éÃü»ÓiÙæ Ú¿ô,gf¾Àз—óÎ1?ÚÔ4ž^€ÑÚ°sêC,Þ:Š+ÅóÍQ`Ä<¯åæ¡û{0vÃWÜî61®‚ë-ÞJ®¸H¼ó®»¸§qã ¾w8]Ò“/‘H$’ëÔIrå÷%-pw¾S8b-Üî–#ˆ¦Xþ ø•ô´}øR ò ä¼ÿY)A–Ì›ÅMÑ´JAÄ­ÏÑdr=îK¿‘ßrÛ]·Q¿Ìa’Fî¤I©(¼žòÄÅoâÆªUñ¨ÙS)ý†Œ¢KÃxŠŸý‘W6ÿÆý554M —1ƒìø&½Þ ÇPr|öûŸ¥fí|ØÇ¾àæg~fÔÆdò8÷¢izV¨©ªjhŠF‘R%ТýÜT¾ Éhºž¥ª¨ºîfßúñ$=8‚a÷ßmùðopðÐK[éµ`%U¢3(ÛF,"øè`œ¥kñl–TL4èX|4·¸½ŽbJÇ—ù×!¦ibšfNm…D"‘H$¹’ðX¶«dgìpRŒDX&†™FÈqŽš†Ïâó2,B~ÓebšÆE"_Á4-6–epúÔalå'Ö«‡1l…º¯N¥fþ ¡`, êägÜ*kú”Æ1MaÛ˜¦™Mä뺚‹èx`0€Š†/``YV¸¼e`˜ ‰%¢Lp; !3xš‡;>C›¹ßÑ·² fÀ²Âûn –‰iY ,,,tÂßÛ–)#Â&õ·_)•ÏC(Àé.DiJ å7Žš*¾=ßóƒíÇFeà ž(¶‰3Æm›†‰[³Hó…»gþûÂÆ4Ík"Mù‰D"‘H®IlÛÆ²®¢I‰´pL¾?äã÷ÔÄ\gÁ j f„íDAGCE‘Cf %,¾…À2MŠ.Á~q#SºÔ!hؘ¦‰ær:>W¹ø Û ºwøˆM3º",À61M K¤WQ,aaκcZ˶ Ûáóg °-0M,Ó è ß¾p‡k?ɸðù‚¸œœ&ÞVt€c'cÛ¦eƒX˜¨ÂEþAú¹ ¬‚ '$ä W¬Û~ü˪AèÈ6¶g˜´Ž)Ìž3œ(ЈçïŒÂ0-,¡¡Ø¿FÎ^"û',óªù–e^´WTä_OéûrJøo¿L¦"‘H$’Üû¬WU|´eY”É_ß±tTžÚÊé|+Ù!¡æ6*'4@‰V(ž§\ŽûnÛÞô ,Ûæî®CXÐõQîü¡$Ec ¥ÏéÎËõzQÜz·v°ûŽ:¼º¨ÏÝ]˜ÒèÛÿajßу;ÝŠf „°¤{ Z6ÂV0ƒ~2lÛ2ðú!0ü¤»ÌHæ _†àúghúúÏ4íþ?¶½è ¬/íï«Âë`eÙ<¬Ûxˆ‚Ým„"-#€M ”ŸÎ5çÑ'zr°Fqö¬Ú…¯_€ru{Pøí>4ï¶œbžª¦T‹óöäg¸÷‘»épCÜVˆ‚ º0ºgi2¼˜¶À‚`F:>Ó¾j®·ŒÉ¿ŒÀ7-riIfUÕ£U.Ü ¶mcÛWnx¸q L»,‘H$I®ùÂâæÒ·P£ôÍØ¶àÓuoqÝ}…í©'7Í¥ó¨o9üõ3Œœõ}Ddÿï–ˆõ|–·_ÑL¾ÿ6Ï„.8Æs_åöòý§ýùä‡Ã¨Ñ®ªy«zÝ–ù Ÿ6©ò%‰D’+Un·›toúÿôù-¹üÙ¢( ~¿§ÃuÕW“Õ“Ÿ²m£f5àùî7‚–÷7ÞŸ°€´§rÏWY ˜¦¦ët˜„mb££©{ºl4ML$º®pfýRvVæÉMÂeêve^MUiȇÕOüY>Û2¨‘iŸ3m˜ hhjö=²1Mû/gË —SP1ùòý·q6êMé¼Î¬c¬Öùyj*0•ú–…)@QÕ lZ¦‰@¹hŸC¸b£‰vê hÈqz‰D"ɘ–IÝšõX¿f5µj×½äù-‘ü3(¤§§óÝ7«¨W¿ù9wÀ#±ùº§zô¸]hjx@öÿt§éïýùý?5ù ^~žÉׯâgö8N‡W—1¸øLêôX€36šôß°¯Öœý° µîÂÊe“Hð¤Ò'©"ê§kÑßXDðÐ6êÜ·‘Å7¥}µ¾¼÷ãV*ÇeðÊÝ7³ëù Ì,»™{[öe‡•HÕZåÙ:m%Ÿ?JùíïÒë‰8eÙ(yªòŸ&PÅ·’:^¥ÑÍ…Ùþó|7=É7“ze€úÇa2Jfê%UY‰ðÀ!D€Y/ô`Ì¢h„¨pÿhf<׌MŸâÁwVàÐ5ô¤{ù|Ñ3ÄîûœºcWPÇUˆç&ÏBQ56ÏÆ=#V³ÿ·¯ÌûVÖI‰D"‘ä*l˦x‰’„BA¾]µÓ4¯‰ð ɵ.ñ<·Õ®MBžM _.wLÑšÍgã^#ðÐ öõ­AÊúç(9+±—~Þäái™ö/C¿iëYz¿[)ÃSL¡¸ç0më1åp/Sø«‘—ÜŠ‚¢èÌáõo,Y·bönÝØžq÷5`ß”5<¶b= Bú¹¢­S<ѹ?¡ÇV³¹c¦?%ÚÁ„ðhÁüIorü›‘ ™³”º1²bJ$‰$— .U¡\…Š”+_œ*¹¢÷žŠ¢f…ïH‘Ÿð´É L?Võ—øþ³V3,B'wЪǜ¬˜õÈ?ئJ©ú7¡!PcK ™›°,Û’aõ[cþšÞ·æÅw23{öŽG6a˜6ˆÈ̯öù2Yol‹½‡Ïr_ß2`Ú$ÔiKUÇi‡DòoÜW1WXä+ضM0g¼1LTw ,DÐg$.Õ" 2-„¶À 0‚A‚¡ ¶mb•Å#{³éö×X:°,> C X¡`SÉà¬/DáP0l3„Ç¥²ëdŠGÁ™½3Àöä#/˜¸ç(ãƒxG·/¶ ¡Š`Ú6˜ABÁ Ö$~µm‹P(¨XJK„cÿ-Ë(ñI¤žýË4°EûN…(˜è¤j‡÷8Ø|?{w}GF IÛºš|ê6' î)a`¡#DS€e5B¡–eÈW˜‰D"‘H$×WVä+æ´B€°°„‰eZ᳄ñˆG<ùárÙ²×hN‚?çá©!>ûª>§’¡¸bHˆ*O¡³?³.ù,Ígù/ÇèåÑض…©—á¦|gXýÓâóü̵ۨ…Jë&µ¹¡Ë@êÍzœí£_!Ùå"”ØŒwz(<ÜzéBúOß°­`*A¶ý<,¶ø+žüÌüª6ª-F:[7®A=êÆ¶ O…^”:И×ÜMÔ…Ló7bÛ-&¼ù«ÝM ÃGÑÄç-ÉèG*Rë®6Tœù ÑÉëQnhwþX…øÃ)³%‰ä¶Id&“üÝG[dÓœ¼z™o®å‰ýë:@U”«>B"ÛLéÉ¿ô´d ÏâõÛ3"o1œJÎ8A”ZŽÇ†t¡@t FµFô $ÜÐij†i¢¸ŠÑ©Ý]Xæa:Ük1ãݱضû¦–¼Ð¹/¿5”÷?|íe«1vÔ( œ•[òÄ}¥0‚VHåÁ·'ðþÄñ¼ŸXž§^}w!…¤:O³J|Ä”ÉsiÐ ÕÖ¼2¸ûÝ-¼1e<ó§~Š#¡­ëåCu›tm°mB! ‚š×ÀŠ žýc]}¾³åJà¾Aýùæ—Y}„ 1á)>X8‰w?\È2G–­z–¢¶ J‰6™•Z,¯~½œVÑ^Äy¬*9‘¹3>FÉ[žÿcï¼Ã¬ª®6þÛ§Ü:™¡ ½IGŒˆ¢1¦X°—ÄDìF£±ÅkÔ[ôÓX"°Eco(EiR”&½·é·ŸsöÞß÷ÎJˆàyyî3Ã{Î={í²ÞµöÚk1(B¿s® ¢­”ÁâÎŒê²næ‡þlôáÃÇ6••ëº,^´êªªÍòñ¥!MJKi×¾=–em¢ô³ÎÁŠÊ Sç­¦6žñEºØ&ÝڕѹEa±UÛHäÂtÎáùð±G8ìFk¦“ÿ])…’’t:M‹žC1M“kFèMbê.¹4H”e\G—<×19ü”‹9|“O·ãŒãÚ¡¥Â•6G\pà"å·Å­¶¦L•RäçSZÚœÚÚÚÆ¿I)‰]#žìËå7öm|ßÑÐkð)ôÚ¨YiǺ;—îÃ6ú‚3/ËÞËóufÄQ!îóI¾>¶A–´RÌ™=›¼¼(?;ú˜ìZæïnMhxžÇÔÉ_0oîzô蹉²B°®Æáíñ_sòÐ>´nÞÄçv„x<ÅSo~mvd¿Š|Ö– ”ëº|ýÕ,æÌžíïZûØcˆ„#ôëߟVmÚúžüÍy?t®ˆEÃÙÍáêêê=*<#`0gô­üëîÍz_ÌØ'NÃÎdcæwXYnm±Ñ •¢¶¶– ëÖ" c¥Q]UµKÛåWôáÃÇö@*EmM G 9²qöC%¶²”kmÛ6è^zþ9:wîB Üx9göòŽØNmš¡”òå¹2--)`ä¯r׳Ó¶ÙA¶ÀRLÓdÁüù‚A.¾ì _x>ö’Éo¿ùvÀ¦Yó¾'#~‹"W‚Z*++·9á÷T^nxø…ìvªVH/…»s޶ÁñQ¹TÕÔìÅíÇÛ·ví[Ð? yåäcžç!¥üÞgÒŽ$?/âËsdªµ& SKo5TÇ4Mf͜Ʌ—\ºI%R>v7"‘(G} ãÇ¥Yó?êgÝ£$ß¶lbõõ›¾ý1A)¹K)Ã[ü[:Ú£í÷·0}øð±ãk¡ïØ^˜¦¹õ„ bûä™Í)ðH¥1„ÀÎmôªŸØ:nšÛQ½V\ÏÝDÏùúÎÇžâU¡pÏõ~ôÏjíI¡ôìÕ‹ ãÇqÈ!‡b[Ö>×ñBV¯^M0¶íï-8‘H”õëÖѲeÅÅÅ{dAÚåìÇݿ–ùØUÊoë2ÕL’¼ñU’ñsª©®KÙìß±„_ôɧ¢È@æbGý¾Ù<¿ðáÃsÿC’šN;á8¯¾<†L&³Ïuº!ÍZ´à€ú‰F¿“iÂá½{÷a¸Ϩ©©Ù#ƒDá+>|ì9Ö˜DAçÒJ‚›N!­0!«áÌ’@E:•! í’¼(ÊsÈh‹HÀüQ*à-=“0c¥ËEO/eÁ‚%X ,@òö8ÉC¥åÜ~zNìE©ÍßgãŒ>»X Ü ¶J#0KlVÖB€›J¢ÆžÏº/è9¥U®fNc«°Lëµ­anú»FkÑø»Ÿ™hßÅôä äg¯^tëÞô¾·ܰ¨™¦ù½ø@!4`PÞ´)ÇŸð‹ÆÜÿ»ÁPˆûï½Ûé>|øØ®5쇄 a`¬Ï }ıÜÀA-À0<ž>ª%ÿ¾` ãÏ,Âó4S,唾?ç/ŸÍ¤w“ͧJÜf"ƒF*“ï?ŸS—²üÖþHOýˆÒÒoYž–!˜¾2Ã9ÏfCeŒ`^ IÀ6 KpÉ?¿¤ú´îœ}HñfïóÙKw0µô,®ÚÏÛuºU`2烿óxühN_x“zßÏÅÇ´gúc—òëÕ§³üÎ9Y LÓã= XõÏ÷Þã†ÖÞîÍB0kÉ ^šô–©Q(œ„ÍͧÞG8Úêø2Í,•ÛܹC¸|òô“$†^Àñ-ÙZ¦XÅÓ¼ÅÑ¿ÿåõm›(¹ÃIG~‚žŸä×[Ñ@|MÓŒŸ€ºÜt¹lh¿aì¹¶›~¸Ž>v‚pìÔu†bâC÷qßK“Y›w8ý¯:D È Z€eh•uzDòó l²E#=…°ÌFí =‰FNgä>#Zƒ±ÑçÐf0B¾´²DŲ@K<©›\OÖS*LÌMÎN)úarßÂu„ÄRuˆü (;…Ò.ñD>Žë†¶ÐFaY¼uÝ~œ¶à jGŸÿ=WcŸþ'ëzþŽã+rF³ VóÌÿGŸs/ ÌÎÞ†QËyý‡sÑÑ«,à×oÛ†÷c…±§ñOHMþ8ÚïÏR>|ì aRJíÔK'×ò÷ÒŒú`4ë&¼DÜÍyÍóÇü‰£ö£K§®Üúú\´P»˜Ï>†ý{÷`¿¡—ñMF3é®3)<|§?‚áw}ÆÒ÷ïbH¿>ô; Ÿp9óë\Db9=íHºõèIïÞ0ò¥•„BA3žæ¼ã¡C³2N¸í3”e±~Â#s`öúþ?; +RÔÎ{.Ýæ¢3Od`ß®pÎÓ$- ­w¢ÍZosÝœL 4o}gÆÂ „Â!l l,};–ðê{2â  –©À ±!¦xnâ “o¿ÛÔ|z é£ïåÚ&c¸ãÓ4†aQ9{½N½¡5–µ–CAn[bðÉgÒ­g/Ø¿GŒøéÚ÷) ÉË">ú—QÈ›«,Ü¥rÀà IÅ‹#â€þýèݽçÝû6Rk„a“šõ¿=þP:6/ãØ›>FcæÌ%ÀL{þ:õÛŸúöâÐSnbyZ1ý‘‘9›‘#†sP·v ¿ñ#<Ëúžl~ZdQ“q2ŽK"À¹#"ÁôH¦Ó¤§ññw¬j =›?»kÜ‹¼SoäŒ8Aºjÿý<¯¼7‰„':Û;K'¿ËsϽĴÅõØæF;h¹è‚L*…Ò©]ɸYß0ïÓ×yXœÔ-ÌKÏbìÌÕ(Ãå0gâ;<ÿüó¼üßqÔºÀ²\æ{“z…iËWòù¸)d”^=Þ~™Q/¼ÈÄùë1ü(¡½‘äû¬Ò‡>öjEî,ÏŽ¼&Õ˧³¦ÓáW±?]CK˜X™={eiy(/:•/Þ¿÷jG¯38ášÇ™:õsnh:“î™G^QGÈ£oåí«‚\8ò5îþtS§Íâžõ\üÚ æ¼õw^krS¦McÊçsó°r\ÏaÝšVÜùÚxÎ~š5^Îüúùüî7÷sáÛÙ럿¸7=7‘pÐF‰\ýØËŒûò-Z¿q=Ï.sgÚ½“2U>ùº†ò<“ÇÎiÅKµgôÅí}igš—D(Ê qûˆ®Î€!gðç;^Á«¸îWÇ1nIéÔ3yÂ,"…E,{û޼ê]LË`öCçqØïG,üë¬#øÕõ7 ^y$Ž[OQ8Í_Î<™×W»Xbïí¿½»6–Ck,Û&•LúZòG£¬}øðácüŠZg îèZc[Ì{û>Ú´9“Ù_Í£s³ ~vÃÿÜé(ºŸt4ùÂ#Ó´­­û©L{äW´¢W»2´a3äÈ.œýÏi$Î6h?l ù Þåƒ%әѩ9†¢Ã%—°03“ã¹€¨ ®¦ÐÏQ´?fe¶€&]èWGõ‚ |²~%“zµÀÔ  ÙˆÿÃJ{v¥y@…t,Œ³¢h¹ãÊ[kc[j1wÏMï+5TÅ‚Á =Zд8ü=âj[&Ãû5§EQ€³[DMÌ éz„¬lX’šû/î]r/E°$|*M—^ÇܵÓv3)%e¤-ן׆_·êÂ3¿8‘s/Éð’VœyBÿëMf¬h͵âÃqñöÓ³év÷AX"Ø¿žÌŸžžŠ'4ëÖqŽ£iáiÚ Ly@@ 3ók©IæÂD„‰7ÿ?|0ó#mÓBѽ} N± bÐDQhI«H-ÕIÐù?Ì{¿·F !¨IT,®"T^C(äàÙiLCâ9.”¬&m/#Y—&?Ý Oz›´Õd=·Ü6¯Éà6ºÓUÌ»ùmÚ-zœOŒ¡Œ¿d…zÿý×hPižxæ=Îyí~Û?ýVðJ¿¶(?Æì{)ÏÜp¤»ðpx(û¿–ä”Öš1šóV2¸M{N>ÿ –¬ª¦û™¿áÁ“žañCƒ¸ãñ\ûþF´ÝñáÉs¬Åmoyàý£hF†sÍ5/,á—Wï‡Ð~ÊÞ½‚äk­Ù¯k7&ŽûŒ^û÷Ù¾\·>v+ Óð…àÇí^ÃÇÙ‰š!‚°±”ǘ‚qÒ FY@(¯˜%wßÂ××¾‚64kç®BQ„Ò1ªÓK¹$jãÄSi¤Ô¬^^E¨¢ ¸Z9 TAKZæõæÝ¥SéhxHWÿZÀ×+êAH<ÏÀ6<\©Ð^d­¤R¨H)%”óÄü ÍoxVU3ÿƒ’.'ƒagð”ÆtÇÁÛAiJÔVHДޓÙ,‘Š4ž,Y£>é4¾ßª,J(WêuÜì <òIŽYH±G(Ç‘áñêÃoÒâ×2ù…§øLÛ”vŠòÞ´y\дëâ¹,bT&=Ü´bð¯³è¼y,˜ý.§8gÙb†Ÿv"k޹•µ?;Ÿƒ›÷bÔ´?óþ¼¶Ü{`>Þ7wpëË>úf]Â1N:l(ž›Áõ$Ús²²ÖRi<7ƒÔ ݺ° mZÿŒ ‹ß¦e I>ÔA5ô‘Î uö:ÇÙ4Åz‡¾¸®»w:´t6ôÊ•)^œŒUkÖ“Ri‡TÒ#“Te¤”x…í$gÄ‹‹ªh{é0&)*+?ç±µüVÏ"Ú¤È žaÓ¦° ÕNšuqÁÀ Ì8˜M¤½ý,®ëây †—-X*]\WRÚ®ée0•E8XAE>8̨EÚq‰­ú€“N»›ƒO8‘v‘Õdê7P—ˆ±.“ÇY¥/ãAéþ4³¾"¹l*k]Áü/'±R¹ˆN殞EH×ÁÛ Oùzž·WxQw)ÉWJѬy ”RŒýè#\×ñµæÿšä†ŸBÓ‡;@ôw<.ZX!jÞ¹™wÂç2ëöë)r3Ãix£%{m5‡ÃÌ}öwš—bQm”òR ]ï dŠSnBÊ‘h­q=›!g]Æ!a—Œ iÞk(gϘFm´=ßsÝs;Í÷ÀÃ7_G›Ò<¼ “÷ž‚t°”Ç'¾Ç HŒ ¹æžk1ŽìDÆÌç´ßÝF׈¤ãdò‡óÔCëyæÁ[(l½?÷>|m-E^ï#9¿c32®D“Çñ#/¦)É;÷*â'mpéKŸÓü‰ÿãé§æQTÑ›“+LòÓC8¿MóÆëŽ»èb:„½ïÉ'.¶}joŠþ.<éѦ¬=í* hZ¬®YÆ2ïu«¡!X¹}£Ã –ùìàFu ^=Ž?üû.Ú´+@bЦÉù¬½óZVÜü"#º½Ée—_Mû 3ç¯g€´9ïÒ3váÙ\xxÌu_âê4žjŸBiE"Ç“ åeˆ§ÒYù*x&†«²µ/ÜT‚t:A~¯_ãÞu;×ܰ£z&µÉ$£„ën=“agáW÷"ìUR)&•?Œ¿_û*>ýÚ·oA¢*ÁÛcd÷™½0ZgosÛ3‹Ä_o¹Q]qÕ5$âqß+¼—! òÀýãÊ«¯%‹í’þ³m›×^Í™çþÖ°[Á˜Ñ/qÂ/N¤¾®v¦ÎÝ)Ï”ç1vì'3ü¸ÍæÛÞÂá0ýúõgΜ9¹TÁ …wÆ côè—p]wŸìcÓ4yù¥9jèP‘èFN/xcÒjÚ¯ ÍŠ#›]{ ãæ×qÕ+qëÕ†MC*ƒt“—’ÈHÖÔy|ðåjŽí”àÊáßIý¹o"´ùãƒïqùˆA†6oX½ðü(””Œ¼ä2’ÉÄÞkWçv’ aðÙÜyfñH<» \Ý—Û‡¿HQ^~nLmÚ÷™T ;ÂØ¨Z&-0‡rI§0L 4"&hhÜt GjL;Ò# o”åF“I¥±C!„’¤=M8hŠT2C Æ Êb›'“Æ• Ó²PRŠdŸGf’¤UˆÀª8ú’5¼þæ=Ù39é4Ri„0 „‚X{éxv]— Ÿ}Ê¡m7¯ŠÕ×ó Ïqíu7MiXvÉ&¤rH) Ôå^5@mîgÃ{ñÜçÒ¹ëÜÜ}ä·îš¬ëÁO¢îÇ>6!P;®“ˆÇ™1c:†ñýsXžë‹Ç÷Yy†±õœr[ÙQÀ!ò¹rHšÿ›¸”ªúfôiWHYq˜XÚcÞª$_-ZÃÐvi.;¦%;N´w_µÝ¡;^ö£5…3q Cì´Æ@dÇÐfŠªÙÁ äÂÓ²ÅF…I(Þd´)f Dã»– Z±ñj¸§A›FÙCÁÆÏ +ˆ (­±Áo‰¤ h74W=³˜ÎÍ=û¯}›|lÌšvªšc]míOS\ÛRöZ£Õ– mi ¿8 „þmS¼5}ã§d¨M„LEïVwß„n-0ûDѧ]"ÓMä—K'¹·×ZQšWNû8 ‘=ß(È'°w*ÛÕÿ®ó<ŒÖGrái]Hºš#?—¶­ËÉ•ÚÝ·ÖIŸäï©sUý 4ž”hÀZòáÃǾµ™ƒ>¶ a[Tø‚o=°["èRJ‰*YÏÏÚ¤ÔÂÁq\,Û$h^ UU.ùùù„B¡ŸÉß~¥sFÔ¾`þtjÞ™›uïÆ­Ãq½o>Zù´ëÜu£A­({‹áµËóäk ¢EÅƲ x™ñDÅ®Êg«ÑZ)jBXÇ©ªKƒ»‡x AÀNñü•Wð†lÍí7þ‰VùÆÿbDÈÊ6 tã³¹ñb™ïx‰r†I¤°ËKûZ؇Û»´f “ö‹n?!Ý2ÁÔ:›bKºÏ0 òòòˆD"Yk¾½^ Ä·YÒ~*ý¢ôŽ{ò÷H)‘2åOª½aŒªŸ¢'_„Â5ü¾¤”gbß~EŸ_^dz^FKÓÛ2[Z"Åf>g`…2\ÞÔà±ü¨™w%*ánÿ½s$xsïoîALÃcîØwxÛéÉ5×èïlÖÀØr›ØÂN€n<¨¶%Ù*w-¿.*å¿…·ñà<þ{fWmÚÑ8×ì×–ý_^åÏF>|lÉP2»[é{òw@ï Ì-ª6MƒD2AiAÑ6½±Ûªöº/‘ÙmˆדX–±]Ž;­ü'ÿã^ë½"¤cׇëhìÞüù–“Ø0v4ÿ÷êÍ\Òö`^¾þ „[Å;/<Ï—Ëë(lÛ³NF±‘fâóOññzÉ!½Ú1ùóYäu>”óu•ó>ã¹1ÓiÄõœ²_œgo”ÕûЧf“2Ÿñ׿¸ìß¿#s&Ì!mˆìA(iÐçWgr|·fÔ,žÊ˜7>deܤÓÃ9uxoîzFßõ–u>‚ÃÔ\Þ]SÎåçÿ‚»šÿ¼8†9kÓ”u9Œ³O9‚pƒŸÆÔ¬œüoM_@ùÃ9x\AɤWŸãÃY+Eíøå)¿¦c±Íò©ðâSépıTOú€º`kN9ã7´Ì3ÉT-à•—ß`Q•GE¯Ÿqæ¯ÆJg¶¾å(^ÅŒ{ymò,´;aÞ»/ñi^wBŸæ«xsN»d$M?~Š«<¾ºãÕ«¥?#}øð±-zE4¡ª²’òò¦~LâöizV¯ZEiYB˜ßóæT”F™ñÍ šçQ øòÚxžâ“iKéÛ¥ËØJp¬Ö„B!bñø;Ó~"• IDATO>ö à •J°ƒ?A’߀h7~wÉÅÌLNç©÷f¢%Âî?®7M´Ø¯o{V|yw½~«ßÁ”çž Ë ¸‚ör%‹ë¢²Ý×üfõ8î}à!Žp çôªcÌÝ÷2åè3¸š©ÌJ‰©Œµ cǼÂaá¬^I¥48»÷ñ -^ΩÃáóµ%tjm³ðÞ;y÷/3úª^»÷¼å=Zèq2ž8÷×›gå±_ï–,½ïo<ðî¿X<æ¨l›–LbÄ9³‰xq’Üô1‹xæøB^ýíNþ÷2ÚvëBbÎîü÷4æO¼—UÓ>àÞ{ŸÆ}ä Ú„“,«LËòüÈž\rì^^TH—ýŠYtß=<=þe>½oH¶œÜÖtŠ ¸¤ Mò-4 Ü$Ë'¼Ê•Ï<Øq¯pÞøßsúYu|üß 8¼é?è}Ù_ØðÑãþ¬ôáÃÇÖ—iнGO¦LžÄ† üíTöÍ[4§gÏ^„¡ïr|:4‹O–óÌ;³¨¬O€/Òm"°èÞ±‚^+ˆÄEæICûÆÄqŸqЀC±,Óž=â ‰Åb|úÉÇ6pÐO”ä  öÚF_È}KWÎ9wâË›¹i¢KÏ“/á¦ûòÎSáÉ÷®à‰ù§gsÿÚeücÌœÛq,ÛžÎ+Ÿ®æÔ®FN™ ±q2a~÷ÞT·+ä¾üY5÷¤ãI¬?ÝOÍŒç8àŒAçòÇ£ú0祡|¾~õ·9¯å Fžq cGßÍÊ‘wfýùƒ™¸ôløðœF^ÇŸ5åÉ;þÌ›¯]ÌV,È~6Ò…W¾ÏQÑi ê5Œçÿô|—¾´”’ιöúËp¾~”‹o–ë>¿?XYÄQ—½Åû·‡è/äÓÙ«©7š—ÁÐîâ’’[/ÿS^ºšI×~ÉA…['ù¡Êñœ0ø‚†ÀMjÎyå3z¸iZŸ÷~Ñ)·õŸhýàÕTº—0ÁHÞné`ÏóX¾l)Þ>šûÚ‡>Mµ5Õ{Å£fsÛ ŠŠ‹9ògG!•ò½£;¢Hm»Q†Ë44èÛ± *š ´¿5²½ô!dkJ""—O}órSRѺM['ÃØ?ÌVmõEìc·OA8æà(*.þÑ׎Ú=$_yÇðþØ[ˆÎÑçÞÍ=×ÝÀÓWœ7ž'Ÿž°:óóŸ÷¤©L± ¢¬(HܤÒ.jcù EFšL|lIì-³ccEe˜fΩâcG ¥ïÊTkMÈ„l_>;:{²:lë3H‚N]ö£Sç.þ&‰=íÃAã{ÆýOƒä‡ñk õµë÷J Æ@·áÜwóɘn=SÞø„ž­C,Ýì|ÖDÃù¥&3CÂD   ì0[ÆÜE+h“çºC[Û‰‡^¾‚¼õKXo´£eÿaÀ“4=îZÖ”DíJfL_K~(»C ÌÜv ô(>ðxŠ˜€Ýÿtºäp¼T“ßšHÇf¹XÊ•‹x{ü4ÜèT¾^ ÑaGÓªugöϳ˜VØš+o½v—yŸŽ#Ú£€Ì ½©á(ORzðÏ 1›¼#.â‘Óº’ޝgÊG3iQd¡ñvˆ4èýí/]×õvK¯æø³Ü‡m  ùBøÉ(}±]ïùØ~#y{”¡È²-߉ïãG3ïLØõ¹ …&YÄßah¿þzæ=Ðô.¹b$y-Å‹O^‰õÆtíÜ…ÎÝûsõèy˜¶ «ƒÚ:h/[»7åÒáÀ¡×»€/ÿ~¿zhÍ€X,‰ô‚vÖPXû/éÑ—¿Ý|O/ô.:ò z÷ëÇ ï~EÇÃÿÄ#æý‘iÛ¡3ÝûÇK³â†"îÏy饃n}.£îÿ•ÿ–;Ó¥ç!ÜúÎJ,K¬K€í1å‘‘yêMTwþ9Ïÿ}8žÑ•'GÝË!LåèºÒ¹k/N¹õ 2“Ä’®FE\[WK¸ëHž¼éd¾¾ñÚvèÌ~½àÁñ•æ6*­p—|ÁÉÇ2xÈ‘ 8€ ž^^‚úŒÎ-ŠŠx}i7ŸÁ'õå†_„aþLôáÇ>|øøIËÛñ™¿Þr£ºâªkHÄã[·Zr©)í`sã´íJâºn¶²0°l;ƒ¯5Jy¸®Â °¸N…‘-Íì9d|øðñ¿å‹ÀÇ!z~û÷ñvnæP‘‚t:ÍúukY¾lRzþ„ØV,_Þ(3>|øðáÃ'ù>ö âçd2TVU‘N%÷9Â+„ š—OYyÙ÷*7x¯“É$•U•x®»Ïµß0MŠŠ‹)..FJµIû•RTnXë:}ìplÛO²…Q„'GóåÔ©,]²h§2Ö4dhß50s™”’øyw¯9oš&Ò“ß3Ô ÃðSî!˜–…’rã‰Auuµ/>|’ïcw`ÏuY¶|)…´m×~ŸóT:ŽÃ²¥‹‰D£âºnc…¤’)æÎýšÎ]ºÍËßçhV"‘`Þܯéwà€l鈌֚Ë—qÔÑÇâynöü‰ÍP|8üˆ#¨¯¯§¬¼l§î±níJš4AIÕ²'„ ™H°fÍjº÷è‰R~HÐn3v ƒÏ'ŒcàCˆÕ×oò·9³¿fÿú G|AíF¸žËØ>àÀƒlÒÚ½G_8>|ø$ßÇî@2•Âí:tFJoŸ‹ÍG"tïÙ›Ï'ŒcÈφRW[»)ùZ·†nÝzRÖ´®ëìsý‰F‰DdÎ׳è½ÿß;?ây¦eáìƒmßUÐ rŒFwúJIJKËPjÓÝ”DÔ´YS„ð¯ûðá“|»{ÕmÌö#¥÷=²O4­±m›L:½Ù¬(ŽãÍ/Àq2ûd¼µRм‚RÉÔVv)tã8ð±ûÆá¶M‰ïÃó<2™ ¶mo4>³5K´ÖxRâ¹ùþy ½]}äã‡÷?F}øðI¾=µênBµÖÿsE—­ wixì¶SêEÛwŒmµ+GÅÿ ýÙ¸t±Ù1¹C†ê^4×¶À0a3Þz×q‡B€F)FƒÎR%Ó4± #¢ºªš¢¢BLÓüñÉc#¯¹øŸ‰_o磊½`(m«2§O¦}øðI¾ßÕ ?äb †eƒòP:GDL‰·Qò¶ˆPº~=ëÜ<Ú”FvYys­õÖïÕ@²vDÁk°l,Ñh& ¤Ì¶ík+ Ë™“Ùî"ÛáŲ5&v+Ù3° 6©#!„dÝ‚yPÚŠØÚ ´èÒ‘°ØÎž×k—¯¥¤e+æÔˆmöÁæäß`e—X¬ž†ª:g˜†Ã„€òò26lØ@~A–emò½–•­A’}•­ž½;ûZ“×ÊCið5¬Œ´mVˆþ‘÷Í®2ô Óü^+)Pû×N{—×½¸hpK¤Ô[mS¿”¿5ŸsNŠ;(îyÒ߬óác/…àæãèäáξ@X°äÓ7X¼>“ý¿aP7ë]>Q™«'°÷2µkY3‰Ú 2^ì’×6$°ƒ÷† rÊ»üçõWyãµWxç½OYUÎ6c;Ûj˜ >y‹eõò[2¾^Û*¢wÓwoüʬ[Àû)6yß´BDòò…£äå…ÛÝïÖ¬\ƒm™»x¬ì†>ØÊÔÛè{­5†äŸŸG^~ùyùäçå°m¤'1„AII ©Tr“±$“UŒk o¾þ*o¾6†ÿ¼9™´aîÖ¶¦dÑØ7YX-³…]‡ !¢þgý´Íp­wÙ 4Ë_¹¦ùlËÂ0‹8îêQÄ„¹ó÷Ôš5SßáÑÏVe’­}P^ŠUk«Ðh¾~úúÞ2Ë2¶~Ýxùðácçà{ò}ü ?Ö]„ -ÐR †@K •‡°B˜¦ë¤©Y¿”§‰—SÉÆ{©zªªëð´I^“r B(jÖ¯fmBPTÖ”¼À‹@Ø xGcr @{Š:Íà^yÔ,ŸÁçsÓb@*«âc M¼º UPJ(]KLñjRÒ¢¸i3‚ñJj2.yUëXQ yE)*^MeM m†(./'b*âÖá"¤êkhÙºÝga1¶‡à°ûc’µVHòÈ ›ÔÇÜÜØ3ˆ–Q»n V^^*Bà%k¨¬Ž!1‰•R ‚v©­Ü@Ò‘¢%”fÒ©º T×& •Ò$/†À©¯¢ª.¶"4)+%d*bÖá¤b1ŒP!eMö`6%½ù¹] ïxs}#•"N!r>ù£AhHgÒÌûf>eeeÄëk©\·†’&å¡´$êÄqÇ÷F{ -,lS‘ɸĪÖS—t°£%”–äch—ºªj„€XÚ% ÃùˆX%i”•“®YO}ZQTZN$`¢½ 5ÕU¤…)¢¬4/VMMÚ#P½Žq›òòšLR®C®«¤ª.‰DiRVJÐð¨ß°iÙ$ ‚¡ÊÔ3}òL2ÁBDÝR¦|1™*¢ôfÆÞö9:v…'_k.%lE)iÕ’ü€ ¡T=7œñ>^¥)pæsòLȘTMϤÕ¥’gÎ=”KFo@ˆ$ŸþK.zl»w£4?È’¿ŸÏ“ßX0ûQŽxK “I7æÿü’‚â0¯ßzÿx1^Õ×\yË“HLJË›*ïHŸÞÝ(/ðöGð×7–R˜¯ùÇE§2j~=±ùqÒ¡ÇòVª5Ý̉ x!K “Ï+ùž|>~äž|‘##RJ_b{[[»y³f£0’öTª ÓÆþ‡€•%åÚIRÐA Ò+Y°ÎæÐûÎÔÓ®Ù*ÅK±;L¿®%ÄciŠ “ú壬/ôhA&YÀÊ¥©÷zR"2»×ŠÙѶkÀ°X?û-Þü‰Š@’âþ]™4w¢e:Ò„^Ý:tê©ñ2„*£g—Å1–N®¦{Ï.ˆøz–._ˆ Ú‹ÊhUàá¦Zu(eÊ‚оP­Ò¤“0ò1´ÇÂEëiÑg¥¡©æ Μ‡'[€¡s×nä›qbÊÃ@à厮ˆìYàUç^S¸%%,N4w–b·íM¯6¥$šsW! ñ½]‘={ðVƒÁøôtš4 £œ8E‡\ÇM‡7%³ð>Iöៃ{ ô䂿qÍËUŒ;c¿]¸õ)“›þ2€SŸxï¤s0ó£\ðû‘ôíaÖ´gÑÞÆ?.þ ðKÖ¼]ćï¼Îý·¯âÊÉçÐÖLpÒÉùèõÉ\q}+,ÓLÊš6#˜îH÷=¡î5®x2ÃN µHqæQ¸ú¥ùw´&飼¹á­9ê⮼¿ô_œ_!ü3¼>|ì-$?«gÔ¿Ÿ!•JùÛË „Øm™´ÖxÞË‘/4H¤×!ÇТ “_;óæhÉÊÊÔ ’é4†iO „›¢´<@¢º–´Ê¶-ã(‚…ad¢–dÚÃ0ާñ„÷ƒÚ·54T»Üù #›v´Iç¡ ÜÏfý¢i,^¼˜â¶vö¥òð¼ìÁCSk¤T ,Üd×Uh#3sÕJ)IgRXn=uñ¨è8¥y‚:-°šDÚagvÏ·Ö~!RÉ=PKd`kV®ç!P¤hQ¤‰ÕÆðDˆ å¡¬fôè‘bíü™ÔTU“ߺ7òkÐÈÄI¦3dó0yA‰SŸN#Pd¤ ä9XN-õ ´9àPÊ"°R˜¸$3.Z+m =Oï~#•ÜæüÛœóÅó$RJ¤’d2™áý–Kš¶ÍêK)oZF]M±XœŠÖm±l×õPž‡›×…áC»“NxÓÄK¯'¥B4‰*â5 \A«¶PÛ†L‚„ã"%„ Cdbu¤=Úad*Ž“ñPÊEuËg3g=tl_AD P´™;›"¥Dʬ¡¢½ )OR”©%¦ƒöû÷§(¨Ñ†‰¡2$<©4Ù)äáz-²u¦á‘L;(¥p I’±‰×Æp…AÈ©4žò61¬²FÔÖûGxÞ.;˜êeȃdÍØdê’ü÷–#ùッx ë$êb&Ó¦NÁDSrîÜØWòßÛÎ㺩%œwL¢kã®&ƒ‡a ç™x®ƒë(*úµ2¸騵…s&³B‡Y÷ÕD¦zi„hÍ_NîG"³¥%žçfÇžò…Z1UÊfÉŒ/¨–¢Õ`îìÞ’úÄ4ŠZDÑ2ƒ0Ñ G<­ð<ßÿîÃÇ^Bòï¸ûþ†zì&ÙA ä@!Pœ{å^ù¹¿G€PîZ{£{}»3íc·à¶›oè¿»H¾”ò„‚ˆ¬ç0P¤Si0  ÂÒ¨`µ’º¸KHJbñåA‚‰ë«êiÛ,„T qÉ*ë¿”ª‘ôh­ðä ùly·^ä<ÙJíØî–aÈIv2‚MÚ‘™¶¯}'„òrùËRŽK ‡/AÉìß²»úYO+R!µ$±Á(¤ ¬IÉ,IªÕgåªUŽìéì¡­÷ÿ*Pª!”Aæ*¿jBÁê IŠC/µž¸ ´7£My[ö³ª˜øùrŒý›b¹ ¨OzrÏ*DV~Z*”ÒŠ"“•F1"i™•s],‰¹¾Fåž%kà©=@òµR[é½Å‚WJeç¥! B¡ð&*„ÁÊe‹iÖ¼œx]ŒD*MiysLÓÊ̅͜‰Pé´ ,ò¬kªÒ´'¾m`’“§’g´V(©û.û»jÌHUµ¡–ŽC[]Gå’žävŽ4:צ¯ºQ[3KhNâ(ÐÚ£&î546ÛVÓÀM;Ùu)#íÐ*»Ù¨4J(´ÊÎ);¥¾.†,,Bº1bž¦$÷œz9*¶³£”FÊ]gèfkŽäº*P@Ûö%,[¸œàð!˜|ÆÐ~CYX ]A’ËÞ[À_ü˜Mm?ú7KÂC‘ÍÊãI64‹Þýœš›"O¯`Ü”}/BOûïØ]ç”î&ZI$ÎÚe9#ËC#PN%]ŒŠCèd|ì.ûxcO{ƒ÷ÝÊyòC@ø;žü¢<ù…¹÷órŸ 害r÷17º·?‹wþzË_yõµÄ¿£ìêëêX·n-íÚwØi%§µÎœ2))- ¦²-)‰4iŽŒ­'åH¬P”‚ü(¦Ð$j«I:Yoc(¿˜¼°@R_U‰(lF(¹ŽÚ´aˆq“‰n£ašL÷ÇÿâDjª«7‘Ý‚ùóh×±Jîx¬;Z“WÖY¿´§³Ù…Š›üÿöÞÞùÕ[ïáâ»}l*dñK%œM›˜>LfË.2ÅÃk“É3X0Œ+äûØTðˆü"Ó•úñÈ×Gµ4Ít9``Ë¥Éñ#ºàq]—;~z;g¿à\jµZ[ùñ­7sþ…/_Ò25ß@™Í[,¸­à`ýF¦Êô RȺDµ¦¦ŠDNƒƒ}¸Žƒ ªLMM‹(ÌÂÁIDATÆ×ë£s®1ÔŠcLG9¶x#EbØ´ó)DcQ‰ ›‡èõ2"ÊÓ“”|ËÐ`““Óı¥wÛÊ#õ>Ëí‰áÃ÷´§Gí³JÏ”J<ðÀýìÛJjM~¹R¦·§·õ3ÆÔûx»†ƒþØÂÖ¡v"Žã0=]¤P(´&€³Öâô ±Í›axÜÇ8föÂ×Ͳy`€œëP+O3=SÁd{ÊÇŒLW!¶ônß…™:L9ˆÉäû)˜*Ó•±ÛËÎ-.#Óàmf¨¿cÊ‹k+Ë>¹ž6÷æ‰kÓ”è¥/g¼qèÝ8îX:/"ò× £i²á8÷ÜõëÆ{Xg¶Äѯ8éäý8Ž!¨-[w%š£ŽT¦F)O%îVŒ>FÙ ÖÖðKµ£¼âÌ[äÍŒþ0>6ÊÈO`¸³ÑI¢(ä9ÏÍ1Qñ1øõ}2J¥z³ž‘Gggÿ *Œõ+äêô8•éF=—aîñ&FGŽ8€8‹ ±ËÙùÖÃÏÞN¾o×uÙêi`#ŠãO0m}O¢2ã#39ÊfÃWT-2V™®ß;r #~ý¸á@qøÑÖù.ORnÖè6ÊÛøødãý`fäqŒqV¨Óñÿƪ0 kc ™¬ÇÞ“÷’/ôÔkÙ}ç“ïÏŒqxÆ4&N|F09:Ü8ÆN}{m&q< 3#‚q0‚ʵÆqt¢ÃÃïV­Èèðt"T×__›™`¤dÇ~†±æwÞÆ”&G)6ï8ƒ!bl¢V¿ˆ !ÓcÃLY3ÛìŘًtåÑaÊ6âð#÷âR&ÞývyU&‹´õv¶ \}6ËR”…(Ž9ï¼ èëëkÅ"7ß|±uð’M¯lLŒƒW˜]—qëM“2^ˆë“!»<€Llc¯šÍÎ2¹|[°rÙ 6®7[ÊzùÆk ¶íÁb‹—¡õ7 ›O|®ˆsG;ôŠíî›KرÌïܼ+€BþÚùG*Žcž¹g/¹\.ý©µÔjµV¸šó‡×tÜÄm<¶K7çíÂ…ÿI6WÚ²•;Ÿ2gæÐ0ŒæîÓlJ™S³mçÙÿÎ|tçv¾áuì Œ‘o9ýŒ³p]·í|„aÐú÷ÓYÓÖ%ŽOk&ãd§J3ç¹´=·ýýWlX¿†×é:ºN£Ãh&“aûöÝ©ïÓ¶í;ÁZ h•‘î«Ý:ž6qr{ûñL;:fn}V[ùL¼Þ$íx­™÷Ü´Ÿÿä¶öóë°eçñôõo"ë>Ïs)MLÌ=‹˜+‚%j²æÃ-7ß”º­Þá\DdeBþBá>êð›mcÔñv]ü¥è|Y­V—íBâh,tk8Šã#ÇÙ÷ýU·¯iguÜ¢pI;7nÅR‘M}›YÕÎ ÇZ£$EQD6›Ý ã’²YCu¦D(é±¥Õ'`)$›Å=¹*‘¥ ùvž u„úf;£f|Ïk>VÈ_³# q#ä®Wqáy^ëÖvÛ'›e¦X¤§·w݃ Èy¹®á¢9±×r·ÉßÐÒ lëVôÇÁ¯T™÷Mš÷j\×Ý-Tv:–úˆ=úˆÈZùi÷í»…û°ìk€O}¸Ìd ~H½ß%m‚GYò^Çu£``]†ƒÇ9ľgB9¥óîö;¹ëÎ_râ3÷ËåÖßNqÏÝ¿æygÝjÖ1÷?ÍH¹ü)þ˜omúš¹\îˆÊe¬ÆÔs.–æ==1úˆÈšùÉ`Ÿü™lžu ønâ5Ab]s}²]¾¬Ù\–“÷ígtd„ÉɉzY/gÐÖ'­ÚuÜq mÁ÷ý95u½}}œyö9 ?þ8•ÊÌú:¹¶^³ûÜ3ÎÂËåZý"’<Ï£T,ê‹°ŒZeS¾XÍÖ7ÝB¹Bç]ìÆ1Ù\.õxf³Y&&ÆÔÅÑ2^d•Ëe<ÏÓÁYŸüÓ9zN²yN•ö&:Q"àg˜mï(ܯÁ Øh¢G1CC[Öõ¾¦Üfg;ŒaûŽnÿ1œðŒgr׿dï¾g­š¶ûë-àÏ”f˜šš¬ÕÙ1«m.›#ßS`|l”-[·)Ô/“‡ø-ûöŸB¥\ž³í„ãOä?ø>/9ÿ¥ômÚ„ZÍ/½™Ò ?¸ñ{œóÂsDV(ä§µÃOÖâWi9§9¨ŸùNbiý]ÓéX;Dû¿q÷ÕÃŽ;éííåÐõf–¥U(ôpÚsž›:C6—eïÞ}<òÈÃüöþû0—c¶mßÎŽ;©–ËsæEØÜßϹ/z?=x€J¥²„£zI=òù¶nÝÆ‹Ï¿@wR–7íã4æ¥PÐYúßöÓÚã‡Ìm~ÓÜVKü´QuôEÖ`з֪…Žu·Çq¬ã¿ÒÇ¿ccý˜Âç±="rÔ!¿3ðwNz• ë6±>›øÝjñõí]ÆÿuDDDDòðÝDïÜÞl¦,ðòEDDDDŽQÈO6Õ1‰ ß¥\d!ߥ}\üÎuð——Ž¯ˆˆˆˆBþ¢uýd[ýf;ýdí}Z ¾B¨B¾ˆˆˆ¬#ê(½öB~Zm~gØovÀmýnlÕLGDDDdü xìÑG©TÊ©“ú­eÆÙ¶}{k ŠÕxQs$3Þ¦5ÛIލÓì“3Ú*à‹ˆˆˆ¬SÆ¢0äàí·³sÇvNÚ{òúšÊÃÔ'мý'·Q«ù·ûi«ö®ÅÑ6×i}›îq"ø'C~g°WÈ_±â("""²2*Õ*==ž{æó‰ãx]5ÝiÖÚ¿üñÕ¯ü+»víÂq3«òßz¤£ë˜”ßãD¨4)ë<òEDDd³qŒ—/Çq+¯«ý³–|>Oi¦DÇ8îêüwÍ8ùÉ sgÅíÖ,'Ùž_òEDDdÝ%ý£zk óÝH¶…2íâ­…¥¸¹°Úìs”ûfSÛŽÇqÇiYñEDDDd…s¾í²Çi[HyŽë–¸î³Ÿâþ©¸mÛÄÝ·òÙïÜ‹ëîûÖçøÌ&q]Óõó¦ü ó¡KùàWsçD ;Ï¿mqËZà,Å9L¹˜±]ÖË1øŽéˆˆˆÈ±iáØ æ¯Þp=ÆØÍëÿüËLY·ý¹ÌpÝg?ÉýSvö"˜¸û>{ýTFqh:l~XÇçAìñ¾7¼Î{ ¯Ý3ÊË^ÿ9×ÖÈÏ,Ãù„ö&" ™Ç–šëˆˆˆÈÊý´0lC®ýà;øtôf~5ò]z§ïã–?H“ñ9xã Üu¸ÈæÝ§qÑKv`ûÍOøêÿ>Àоs¸ðy'´½ÝSÎy÷õbc‹›‰ùå¯çއ&8þy\ðÂSaæA8/¼|·^c9Á¿›“\‡C?½‘›~qwË.xÙ¹lË•9øÝïcûû¹çÞÜó^vÆ köø;Ëu^µ¬ªEDDDä˜ýö%bdbší§¿ˆ·°ãÄ3øƒ7¾†m|ÿÒòΫHOÿ&ÝuSÕˆ`øaþîK߯df¸ê­¯ãºÃ5²¦n,?ûÔûx×·F0ŽË½7üz‡ú¸ñê·óÑoþÇF˜\òÏ®â#ßpùÆõŸä„8汯½Ÿ³ÿèK„[9üíKyÝ{þ‰À”øôë˾~7ûöíæ‹—¾ƒÿ~Ü'cÒïH¬ö„•Qñ‘å0·3lŽw}ä£üÏË^ÉÖèçŒs/à/ýsþðäŸóîOMðùñOó’Íq½>‡±}Ûø‹}˜WïÏan¿ž/Þ>Å2³ƒ8Ç%ã°·óöÜÏ;| ÏÈ”Øö¶·ð§ßº‰+_z&اÿéŒÞûïüì÷òŠ}Y®øÄ¸äoÿƒçoˆÞ÷1nxë•<2sÙ-ÛyÏ;ÞÊi{\.yÁ®98Å«wïÀ¬Á*S…|YR6Ž ‚ZúƧžÏõ÷ÜÇc>ÀƒwÝÀû^qý_¾„‘ü^vo߯žWÃÍÈy–jµŠçŠåQ!‚8jDÖb㞸C6ÏØ/oå@XÓLJÞvUˆv½ÿü{Ÿ·_ô;üèêk©ùôüæ6~ô`@dÞøá+Ù’ prN6¦DdŒ¥Xö!¬6åâeu'…|YÚo-Q¥¶Ëƒ ã°iÛnN?î^ÐÙSØc?Ãm÷Ló”ÝÇ× ±@†„‘%Šb°!a\oöcãˆÈRüƒ{85÷Á‰¯à’çe‰£ˆˆ ÑÔÖÆÔª>ÇŸÿn¾vé×yñnã5C–{zÏãã¯ÝN5ˆˆ"È;ÄÖ…!Qëó"ˆB°}?\×]õç@!_DDDD–6äCk2¬ö !×áÃ|ñÆßÒ»©ÀÌcw1vêŸðÞ3/æ?ý=Þõ¦ßåÛûvcöó‰]B¥X$ˆ,6¶ÕJµˆØ©RªÔ°Äå¥jDœyÿòoïçMï~)wžº§Rå¯ý—½(À&¹îªwsýpÌ¿(ñ¦¿¾˜>µ—×¾õb.ú¯ý ¸!=Ïx1Ÿ¸òUTJ‰Ïóg(ùQkÔž¤Ô}[e4òÊúg>vÕ_Æø³Ë(‹ëjjiY}ŠÓÓ<|èaž}ÚsR·ÇQ€ïÄÖ‚qÈæ~†L.‡—uñ+2^®QÍ'prä3s³S.—ãŸ?ÿ9^wÉ%d³¹E“k¯ý —]~ÅÆªˆúüQPª@(Se˜lül®+5žWm¼.`vªæõ•Õ䋈ˆˆÈ³ÖGÝæãtð<¯õ(“q¹üòË9pà@k]µêóå/]î]»ÀFÄ8n†1Ï…8Š0™,³Ÿ•ÉæÈd[ÿ l ¹LÈÐÓ\EÄ€ãf)¸ÙÄÅGL6çµ>Ï4>/ŽÒ.TVÿ\£ ù""""²,A1‚ àÊ+®˜ÓÚ ÃU;ñÔZ˜K!_DDDD–T["[Ÿ©v1¢5ÐÆ}­ý{òEDDDdÉc¨ù~½Ãê ï‹åW«ôöö²š+ôòEDDDdÉx^žJy†C=ÄŽ;ÁÚõ³s¢ÈrÇOrÚé§ãG!_DDDDÖ¿L6Ùg=Ÿ{gG=¼®öÍ®ã°ë©»Øµk™lkíª½P!_DDDD–&7¯—Ïsê³OÛû¼Z‡'WÈ‘% ¼š—çØstDDDDDòEDDDDD!_DDDDDòEDDDDD!_DDDDDòEDDDDòEDDDDduÓ8ù„1ÇÑ5ˆˆˆÈJg0ŽÁ´ ù@E<ðÛû~üq ‘–Ëå°q¼²:ìëÿò×wþ*Ž¢P³Ï‰ˆˆˆ#Ùl޽'ï;X b h,U  ”€i`²±L$~Ÿnl¯4ž_k¼6n¼÷¶ šü aÿ³Nq¿ºÔûadà=@°èË@cÙÔØÞä¯Í&ÞËèbQDDDdQZ!<ñ»MÙÖùš'M!ã°n; [·ŸQA_DDDdá€oöçËo‹ ý ù ú¶KÁ‹Kò¶Rsé ÷ ù""""‹Ë^¹*JÉ_É–ð­B¾,¦0¤|›(xñ-ÜG]~³£mŒ:ÞŠˆˆˆikæ­ˆÙv:Ã~ZKŠùj÷òU¸ºý¨#ÔÔ‡gÊ0[k'+䋈ˆˆYÈ™Ëo,µ”À¥„û;á*äoœe¸’L^9Ö‹O}¸Ìd ~H½ߥ½=¾‚¾ˆˆˆÈüy Ú5iÖä×AßO¬ 9-b‘µø ù·p% YòvQZÀw¯ ëšë“íòEDDDdás›ëT™èªšÈdAâ¹Qâõ݆:WÈßà…¬sôœdóœ*íMt¢DÀÏ0ÛßQ¸9¢ÖÙùÖgvæÛÎYmÚ›íĨM¾¤¬´Na"à'GΉ/K{{|'ñ¾ û""""óg0ùª³]~²6¿L{~H{Mþ‚Ívò7F2)ߦ\AÖ:»mlóéµø ÷""""O.›¥Õæ'›LW˜[›¿P'ܶ …üöÓÚã‡Ìm~ÓÜVKü´QuôEDDDŸÇ`î¤WƒŸ4kñ“q;‡ÕÕäKJë¼M” ë6±>›øÝjñòEDDDò»Õæ'[W4kõ“5ùãåÓ-ì+äoÜ€ï&‚|çv›(dó|…|‘#ùóýôqó›µøóv¾UÈß8ÊtüŒÛ£”‹€L£@¹´‹ß9¢Ž¾ˆˆˆÈ“úÉÜ•7?bîFi3àjMéZÀâ”—¼’LÖÞ§Õà+䋈ˆˆ]Èï¬Ñ™;.þ|MuR) m,&å§“øÙm1¤w´Uù9ò oIý°ÛÒ9F~j-¾Bš‚>‰ÐÞ6³3Ø;ÏSÀYž íCd&GÒ‰;ž×5à+¨mìßù{Úˆ9É?ßkEDDDäÈB~çïia¾[3k…|YTÐO†ûùjìUnDDDD–6èw®ë6«í‚_aMA1ÊŒˆˆˆÈŠ}»Àú¾›t+*""""«ï`Áp¯0'‹- *#""""Ç6Ø/:Ü+À‰Ê…ˆˆˆÈÚ ü"""""""""""²¦ý?b?-?JŽIEND®B`‚glom-1.22.4/docs/user-guide/de/figures/glom_design_reports_group_by.png0000644000175000017500000006207512235000130027476 0ustar00murraycmurrayc00000000000000‰PNG  IHDRsÁNsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ$È5?Å IDATxÚìw|Õú‡Ÿ™í›²é„$z ÕŽ˵qí]¬\E½÷þ¼b{ïýêµaAÀ‚ H•&½$HH€ôd³Ù63¿?vÓ7$DBó<:Ÿ,³§ÏÌ÷¼ç=gÏ€@ @ @ ©ómýA磵õ7(Kÿü`ƒÖü䊟þ§‰ö‚Î壧ni¡Ë±qñA~áÖµÙ_ Ðô»€Ý^ýÛ<Í݃©·ß)ZY :™^üMsoã½ÿ\ÞXÔÍ~ñV¥Ù_µ51—4¿š¯Y2O»ùúk(*sˆV‚V(­tàUÔÅÕëd"mV¦LŒàÊÿ{W{÷ÁËêÝâoo£¿’ÿ¯H-sMcíÒ´›¯¿†½%5â* AB^VUÃæßçw(~Ï!ãQUH›•µŒ7‰«üX{çÿ.•ü–¹Ðæ-ë]/­XææèõÂ.‚À”UÕRRagëê_údzt ?¤øÛòË™?÷+2 "ÔRÿ9ºG[ü"Þ\ÈUÿ¿[æ«ùB»äÊ›Øs ºÅw®]?â±wl(…9õTqõíCµ³uùFö¸!(­?#’Íb•h—c—ÇËÖÕ¿0zâ9D†Z(©tRüÈP ™ƒÆ±uõ/ }ªß€ŽµÐ«GWÞ÷ºdû­òæB®Ãçv! e^÷!Qî±sï?îïP¥ŸxêQ„¡tÐ ·ÑÎÅ÷^PïN˜¾ËÂÀx/;7æÓed»*Ž”`œvþX½‰·æ–MÉÆý­ÖãößmØì%$·7þ¢ßY~2ô±aõØYþãrÞÈ¥g×ং©ÚÙþG[ñ"ˆQJ‰‘Ís½Ã‰ Òù¢:ªøcõfÞ^²—جD‚5;¹›òIÞ—‡¯H 5DÍþ;xþË"ÜŸ!“q§÷ä²Áá¬|‚#n™×ñâ´³™:óÛúÏMúÿfá}–yÀl ~×ãó“7rüÿhÝ=§i-ŽúLe“ÙˆÅlÆl6c±˜±Z̘MFL&#½ÞgµëeÌFÓAÓGç^G1%A]95Á×ö+—ðì*I}2ˆ’Aq:ع-oV–`°hlò%œ<„K{Zp9<¸›;_4ßË´–žŒ†ø#rjh [öºÁÊÈIc¸>*ŸÍ%ž…ó¥ï¦pËnº?‘{Ç$ä"gg …º`ú”Í“³o[9ÞVë!£” ãPâÂÅ]4T†`†™Í©J{jËg£ÍxùU{IìAˆ³’Û‹X»»·5”£†ñà('Ûv–±wëºMžÈôqI¤†Èh55ì«’ˆK‹&¬Ö·Q“$=‰‡DÛåGç´¼þÜÄ“‡Õ xˆ7ò©3¿eâÉÃZèª$PoÛC‡}æ²,c21êõè zô:=ŠªR[[‹ËíBQ4UÃd4Toµ ßÞ‘CuÖ „w'ÚçpaÇÆ* ‰¡ìÚTÅu~‹Ú7Nß˃¬Ã)5tº8öðäs+Y^–Ø$¬’«é}ÑÆeÔö¬æî×ó©FÏØ›Îâ†$#ÆÆóλÕMĨ½áTw EAÜ›ejøê¥y¼_àEÅóÓú’Ô£7§[ä WpÀz˜#ã2¸ìPâïßÀ/m£À˜ÄC £· d˜]ê!ÅbhÖÁÑF<‰Ùû£Yñæ,>·kXCÍ„ô$ŽÍ¿†[‰êLìüí†ep_–/í=¿ÌgúüJYEGÏŒXŒ;ªò±ïä¡çVñ‡¹;3ÿÑŸTZ)Ÿàˆ[æãGe3uæ·-¬ñ©3¿eü¨ì€VüA|æNÌÝ¥ef|;z½A$I8j¸ÝîúI:ª¬‰5(è i :É_îmz…544UÂ`†ý{«8JŒ¥‘X6Š[¾nk é „ä©bG™«‰«LSUÔÖ söm/¦&&•t--;j )"¢ˆQ‹)ÂpÈáp:0¤Gù;§ &O=ŸÉMXÉŒOY zXñÈ!/úÐâïßTHIDá•5ìwBo+˜¬zÔB.Üh‚IiÒ­Åó”ì'|äIüsLÑÍÇÅV+ÁŠ SB4‘”ñͲbz÷"֊ˉªkÚê%ksØlI"¬¦Œ<¤¶V>Áñ™×8ÝíŠÓZ8I’:¬‘ú¶Ü,­‰¹ï³„ÛåDñ*H²„^§k$¶0Q‘Q˜ÍfÚ3©*8Ì.s£©´ŒbâˆCGF/žtéÂì·`ö‰¼yvXà›­ÒƒlÖù¬©©P˲„ª*¸%]à¼uz Mñ ¾¬“Zýö†k‰“UË÷PÔÄ|WÙ_ŒI \MÒ9¾Ç¥€Îç”TüÑ%ÿ=®jZ“u¼So-ž>®ÓÆÅŒJÎòõÌÉsbéÞ—ëY) øú†Üø¦ù8k¼ÈFɮջ‡–OÐi-‘RÔ†Îö÷Õ´°ÊûЇ ê×ðÈrý³åéè–u³¨ªŠËíB–$t:²,5q¥Xƒ­\Ý•TTTâõz˜ýý·ÂÍr¤-S¶êÝüXÔ“¿ÇCxön/^Î[+r8à–I6ÉM¤³Å¥©_ò&¡—¼T»}Ó0¶3Þu…˜»gÓ­•Y—˜Þ]H˜¿‰­„qy/ßž”•R,™Ðiê!‡Ð f\E%”IU›7ñN®†^ÒP4]3ã ªÕ£oî Ñ|u“-ÖÆб4_0LósAÑ6‚ò:!o,èƒôõ‹yCZâf9X¢Š¢ ù{NF–%dïbЈŒŒ¤²²’„ÄxÖ®^‹ÛíE‰"n°#ЉØ.f~úd ½oÈ@‹™ì³Æ}V»m{ÿõ2ª·³zÂÄ,1'åéT¶dA­EêÉÓÿN£36€‡å qGÇbÁ‘±ÌýÞ¯oïzk¼_ßÞmžoœVG¯[ —ša┺/¹ò&öì¯hñ¥¹àëvÿœÿëo¾"wg.žð¸L âªE4¯ƒÒýÅWTSëñÝ-²Á„58”ˆÈH"‚ Èšƒü-¹{ÀœÐ¬S“DsWR°k/ÅÉ`%*Ö†koUu銵¤šÉwO¨_~× 7ÞZŠl",¾ )Ñtªƒüm‡P—GS]TìÛÇþ²j^¿Èd%ÄA|\fÚ¨GGâ«ölÎ¥Ä8MZ+o‹xzjöç³{_5.MÂIlüýNCéÖ;…P4ÕMÅþ"ö—Ö•Q‡)8’Ô´X¬-Ÿ S°™ùáû/¹èo—‘³·´Ci[L,úéN=ó|*kzkWeåOÿã§>¨þ£¦ÑçZÀyÈ :K4O<õh» 鉌Ç/Ì„£ÎBDB2 ­»TTÉBbÏÞ$6r³5¹j†P3Bë¿ 2ÒØAAI³,Ã’Éênj2ÔS¬Oh­<’[|2¶øVêAõèH|ÉBR¯Þ$µ–fkåm¬1)dÅ4×( Øâ’±ÅÆò :Õ2ßWfèfiʪëÓR”ϼ*|8„b.BÈÿ¦¿ÖÊP_ëX8à8ÁéQ˜xæùüôý—$e'Ì|Hñ+*íl]ÆÄ3ÏÇéQŽŽÏ\ hÀJB:|ùøÿxÝ ¦¸ zDÜCí 'ØN¬f#ãOŸÌü¹_QÐ4ÆŸ>—Û‹£ëÔ‹e.´Ž…øÌžÄ·yÿ´7œ@p|PSë"ÂÄYçþ­Cñ]/5µ®ß´æCˆ¹@ J+ì‡=ÍÆ+e:$æ™!%|ýÃbquà(“RÂOÆ2ÿ承QVZ"ZR Ž{ òyó…í +‹æ‚ã!æ@ Ä\ BÌ@ Ä\ BÌ@ˆ¹@ „˜ @ˆ¹@ „˜·EíjîéMdT4Ã_ÈÅ#ZD´‹@ðWs¥|-Ÿ}žûÎHðõ&†ïCü˜§.JRTƒþ³§}S’|ßMøxŸïubÎúY1j£øCþù_šM—¨h"»Žäš××Q­¶t<ÜîïŸDBb'¿¼³Þ 9óøvÆåŒÊL 2*šÈÔ¡œwÿgl­ÑZ¤ß¢‡ÿÿ>âé«G“MdÒP¦¼²–j­m÷G«ñ”}̾û ÷HòåMLÆ.ø×—äÔ6$¬9w1ûÑ+Ó3Ñ.:Aç=ÆGÓ,5û>˜:žní)Ÿ@ 8~ÅÜ•ó9ïoô}Žžò.oLKj°ï­ðúDúN¸”ÎKÃÔ,^îKwðø¼"¬¡˜uM¿kÏÖ¾;_»ö§Ý7ìÛøúó™:§µƒáêñîåókÆsÕó?°¹4Šþ' !͓Ǣ7naâÕŸRàm£‡ÿå;yjŽ.±€39ÿ¾‘—·´ý’Vã)Õl_ñe¡=9iÜxÆMÃT¾ƒ¯ÞÈä«qøëøÙÕã¸â™ïÙpÀ™Ljœ—]K–RÐlßüÏ^Å=Ÿl ‚C+Ÿ@ 8Þļ`­ÿõI&Ù‡©©EMdÒ,h¾Ÿ{Ĺ¼³~'Û·ç°ìß}17s¹íâJƒŸäç>ã‹âÉU|÷Ü÷* W_ŸÍoðÈÕ@2·ý¸œùßÌaÉ‚è8æ?É›[\­‡t¨ñ{ÜÇ/+°pákœ¤ØÉO«K[ïlÚŠgHáÚÙ;ÉYñï?ÿ$O½ôo_ã{%ðÞïf±Ý ÎM¯ñð¾ËfÞù=9[V³jÃNv.{œìæ¾°˜ËùßÖB WÌ  ù‚ÍÍÒ › o>Ò…Ú/ƒä°ÖCÇN¾‰S €„ÁØÔ4—ä¶Mó®c‡«ôqdŸœì;¹{{\ çC¥bÓ ç´‡&¦MüðGØ@¿ï°7yzÓzH‡?åŒÓH7”DŠÍïM)w´9aÜj<µ’Õ¯\΀„$ºõÄà¡£¹äí½¾{©ðªTl\A!¸ùšÁØd¶ô^Ä›æ“xþUŒŠÒcŒïO¯ð†|ÁÑ¡ÓfåLIýIb»p²fÎ&ìã‡lÌCß/âÚ7'0à¾MãÙâCÑèT¯ß.õÖRÓʺ8Å]g»j¨îÖ¥¯½áZÃ)WžKjÿ‰ô4cÛõ8„ø¦“¯§•dôR]IÛÑî­Ä³/{kŸYHFú_ùO®…}ÁÃÜ÷i!hZ³´Ûî4ƒ¢‚üùè0Êí/Ÿ@ 8ÞļۅLéõ,36Á÷¯æÆô×yôŠ“HRpزB¹¹c\" ÔBñöýxˆ¦zÙ—¬kE÷Ìþ†-wõ¤›øf®ßòLDà>ôpu˜°žCId5{Qˆ8ínžá3OëXŒÜ-¸©6©GâV*r¶úüÛæñ<ð71.¸Š…óhZÆ^CI`-…¬áµ÷Öpö=ƒ ‘Uªwm£6!‹ñ¼A7‹1ƒßxŒñaÅÌý÷d¤Ä•ÄIlo:–nLd ÿ¥ó{êFLù–ÊÖÂç>Ëø=Éìq*Ïå„pæmg‘ ë`¸ºÎ©×õÜ7!(åÓ‹‡pÒ¤‹¸ðœñôOíÁØ+_e£ãàvéŸÿçÐÑsÑθÿÎÿã¡Û/æêÏÊ›„2÷¾‘žÀæ™§“ž5˜ÁýºÑ5û^–׈‡E økŠ9`îq-ÿ]>›™×M¤Oœ¥AŸczpÒùwðü1"¨D¤N}òe®T‘»7„sŸx„1¦ÀÁ»ÝñŸÛ epöC_ðâYÑ-\í ×0†IââwçóÎí§Ó;ÚÉöe øeÉVj» ãÜÛ®ephMùgãÿI¬ƒàýžJW“ÊŽ¯ßâ‹ü!Ýÿ½œE·¥þ¡O{à Á1€ï…Îoðâ+¯ÔÿQÓès-à{³Á €s@ 8816 ± âÉÍÅ!‘Ĥ$¥s;j!æÇ1*¾ø@>óºsªªòÁï4sÎ;‡Â½E¤¥u£¢ª’Ë2løØc^ ”Âwßã>ºÏÝÄ-s²9yîu¬\1îFÀ½™Ùƒ™uÃF~½1¥å ïÝÛ£{óæ«YrWÆQ{'lk£«ºó*{ šFl\N§ °Xƒp{¼”WT~‚Ýðµì^<Ÿ= c8©[°Ø“ä˜s­Œ¯'õàšåÍÎGNaîºg*Ü~N4ß ºª©\~ùŸ]§iþ½ÏB×T­Ñç†÷þ}°pÑJËŠ‰ŒŒiMF)úèzßø)÷­aÙ½8ŽÉvw=÷$¶ô`Ï™Á3³ˆÑ7´‰ÖÁ<Ø÷Gì*ìý{4¨‰ ‰õaµFoÒ‘« 鄆„PZVŠÛíÂh06KÙMÑÒy¬+kvژ°ñý?Vdšƒ]‹P4†iA>áÖd‚b’ˆ'ØèÅá[ #–¹„~Ø£Ìzdu¶³dŒ¢›p×þi9×Ô†ñ¸¦5 §šä{è%ß5@½ÁÈÇŸ|DÝΤ³Î!!.ʺP D_õ.!Ù—´Í~ãwl½Ùûñûl¹ë ú…X êΤkºûþ We7—èc_ÊiµCn\2­ÉùzY—}%KìÝ‹Wñ‹ÉdbO^.1q‰„„†6m»¨!ŒÝ ²™P®šZíÐJ¯ª ËR§´‹d !È· ’‘Èý‰5éð*ž\µÎ+ë_ÞÍ¢ K§O¿~„4ÿ™Ç×LcÆû‹Øå€°¬IÜþÔLnA ÃA-[Æs·LeæO»qEôçŠû/Åÿ´\ °)KÝrDMÓøøã)ÉY_Åð¥·Òc:˜vŒfý»W<äâ&a<;¿à-=¸óû{YrÞ4Þ_û/ú ówɵ¿3­ïDv<¿›oΰùÝ^?sy«ûb+/ ƒ­ÞÍ­3>fõ~/èÃé~ú¿øè‰úé\úNKçëµÏ0È¢²ÿ“ dݰ‘s¾Éáݱ¡P1›‹zÞB¬-<—-³õõ›¹íåïù}Wè¢éá<ÿÌõô –¨Û¬F­XÅ+SÎáÉY[±‡õçŠg>áÉ ºbTÚHSýom.³šÊCï.ðÝw=ÏãŽg^âÖèÜÛxzøP¾8÷N_÷ï,Ì¡:¨?SêÒ븯¬Ë\«ŸÝ»wï!%¹¯h.G5±ñ1(^•E{ itÓ€l %,ÔŠÛY÷«S—ɪjhžrölÚ@ÎÞJ<ÈX¢ÒÈìÛƒX‹ ª‹¥0&‹ÈŠä—Õbé6˜¸}k8ПøŠmä¨A³Ä1p ]¤6®ÛÊ>»cD7ú Ê$Ò(*Õ»þ`SÞ>*^L„&v§w¯®„ê½ÿþ [«TXû5_­ ]:®öe Ø“0šé~7‹Zþ­ëÙ¶§„Z ! ¤öîCj„)PYÓûQ°‘š>§04Ö/ƒÞ¬¿ÃÐñô¶Õ²sñ¯Åõ&º*—=%5(:‰½Ó3ÁŠ hîrÿøƒ¼cIÝ»àܺ ã ôÐý5Å< j9 î=‡©ëNçÉÏã¤x7›ÿ÷7þíb–}ÊÅÍGþÊ>¾¼ùÍÌ+?ßN¶¼š—o½“ùv#ù¤‡¼WÆ3ø‰ fmz›ÑÁ'”–·bÕÕ›o\zÙeþXI« ­±™×ˆ²ûÓë…ܵrQËÑÅŽÿ½Ëî¾wqnÿñôœè憷Vòà°±-:å@eóì~îœG÷gæõ Éè+rX»¦ £$ÜïtÒÊÞbi‘‡iµlš»ÉâbíÏ;qŽíºýGÖkýù{w µ¸¤žüýÙ©¼Ò=eÏ/¼4õv.þw_V>3œ @ÃÍæþÃÌdö}‘ìþð&®½e*£FÃäˆf¶¹Z΂i§pëºI<ùÕ3ŒLp³é“iÜxþ߉^õ —DûÒÛúêGœóÙ|¶ž/g­þôbäÃqÝŽP¡ IDATý$$&62U›~§håü¼Üz!¯©®>H ª¢4MAs±ïål©Š£ï˜‘$ZjØõûbÖþndô¨t¬~á·ï*"aÄ8Ί·¡ÓªÙþƒJu^.á=1ª¿‰ê-‹X½j5%V#1½ÇÐ+¸†Ü¥Ëؘ—˜L«ßíBò€,²#‚‘j÷±mÅ ÖæDrrVуÇÑsÉö¦Obbfˆ_¸+Ø HÆP‚Màp:)Ù¸” •ñô™M|(TïZÅŠßÿ hÜbuʪ”òGÁFtVƒ‡§¡ö:k(}­¯£Ù]D—c9=6ïžßøyÕfââ†%ÕR¸v%¹®NìCœ¾œ+—Qà…dk(PsÄu@>¤È5ï"ºFEé?†ÎÜŽsÿ<žüÊÌͯÍà’aÝINéÍiw>͉ËygA1ͽdÞ½ßóÊ —¿ðõO!¥ïd|ê"bÆŸ˜ãû0tH¡‘5úï²o<“x½ìëÎEÿãk,-oß W©ØM™>“Ç&-!žäž£8çò3I6‚>z8'Çäñãš 4g.óÿç¢;FQ³h)û¼ —,¦¢Ûéô ‘+}¯ŸÆeãÞ%™î']ÉÃOœŠcÞWl¯mÈ/tâLfÞ8‘¾™™tσŒ×­æ‡mŽ–åÚ÷O|aá–7ŸàÒ™$wíËéÓ^⎤¥¼óËúû.ú‚G™:2ƒd!ýÜ[cX0½C3̵‡ŠŠ†õQÝœ‡äÿÜè¿F^Köäå׫`¯®ÂátÙ4}@Ù;ŸYŸÏbî÷ß1ïûïX¼£EÓPk É; “8ä$2ã‚Ñl$÷Í"´:—|—ÙŸ«!i ½’mH.;{5 ñƒÔ3‰ð  ¢ÓR°ºÊ1õÎ&+%’ k]»†â*.G5è@“ IéFRŒ £¤"™£éÖ3oÑ>Üzh*ª š Jm%•åTV:Puvªs¹…:Ò²³Éˆ B/é éÒ›tK1{*tè¥e­©ÁKƒ1£ù]‘Z3÷–1y ™ !HNjhQRÅ.#:g»KõtÍJz„ IF×^]± !I-¯å_Ôg.cM芒û9µy¬•ÈÌf1R Êñ4sž¸ ×Q wçÎ̆óÖcÉ4~]×ßÞËÌ=ï¯â1o˜E’øo;Ý,§¬  Ûθ¯IŽ?Þf–} ÏŒ‹F,ý¯arÈi¼¹ „ “£ë­„æe«û·±Çå\Ñë ¦öÉäƒ3Î`Üij¹ð‚q¤I`Ncì`#ÏÛLåüfïÃôsO'ç¯X_q>Îw3f8ÑzÐP(ùõi¦Ýÿó6SÿƒxËÙT( é $ é†Uò—ÅIB°›ÝµEÙœ»—S›ËÊaa<Õü¾Ë/Ã0“¡®nº¢,.v5Kï°Zæ¶ÓÍâuÕ6±Èk.""¢Œjùô5ñ™Kè­6‚¨¡¢¬’ZBèeÀã¨ÄíÕÀ†Íä¦Â.aˆ–Kd0²»–Z¯ê/®Œ%2§»Ë‹*ÑËÂmf4g5.¯†d҃ljªÓ£Çƒ«4‡Í[ò(®r5iz¯Îˆ¹nmµ¶ »RCùOŸ²£ÙwA5^ qËÚ[×b³"{jq{Uôt^œŠÙ[I­J\˜·£¢!™ÂÒí:j3/ǬÏÜ‘«¡éñòú9\`áÍ0K¢ÇØ8¨lÀðX·¤x=wÚ«ó™ëd™)SþîŸë”êÿ63æ(¼;±…çtŸÂè wáv9-Q¬fÙ_²¯¼‚KS¬M¯åk³)8ýRâ=nT@óºñ¸]~ÏŒEÕãÆ£ëÁÔÙÛ8eÑl~˜?Ÿ>‹'¿‚O>˘p=Ý&fâxüÖ,ýƒ‚Ôóé™0€Ñ3wår\›M ¸+ ÙíÂUú-·\ü¥7~À‚/F‘aÁ¹ì]jÇãváÁ¢IHšÛå{ÐÜTMEõºð¸Ý(*hНœU7˜ÖÿÈEî;÷vßÄ êi”ž¥>=W‡®¡WñÜQÏëõâõzQ¼ ±±qõK"°ÊíÊÝNl| .§»^È &3A!¡ÍÒ÷àÕ@6†b¤¦Ú7‘èuTP¡*¸=Š?/µNnP<þ½f$dÍ÷IBu;q¹¨?ŠÿœæQ|^øz—Ý’ÌIÃm¼üÎÿØ2é6²ÈaÖCϲI“è­BíúWyzA ã&!-ÌKþOß³ÍÇU14ô #É™ÁÇ‹"ùÛ´dôª…Œñ]?OÆ¿èg“ÑTÐEõ"Yú”9‹Š8ãìxÜ;>á?37‚”‚Öø5z~¿«V÷¹Ñ¹úV9ölîþÛc\vû<¦ÎàâÁ1h%ÛXúý|Ô ÿéíL¯¾ÕºuãšFAA~Û®R/ä ]R0›-­lÄÖtʴ·Þ`EÓ%j›W¬ÁÖ'‹j§p[5A ‹’ñ–7uPi-Vã4ø¡çØàCö†`,±oV'.û^väUƒdCBCCÙ(áØ¿êè ÜÐë´¦ O 1¤$ìdýŠ¥÷I#ܪw JÑâ3H´(+fÂÂtäïØIUD š·†};ò°‘-:–õ“,1$Eì`ÛÊ„öŒÁè­¢`kÎF>s!æõÝm8㞚ˇ1Ó™1ítž¯,ñôw)÷…ÉÔŸó_ýÝ·Ü΄nbŠèÂÈ)73rÑ«õOŸ³h+wRu‚íý¯i͇:Ÿ¹$É\sõµõÖþNB òn} ‰§¾TVŸž¦j~LCú¿¼³iØ{ m–§±gžËË~NÎuÓòÀk\ÝÍœ‘þ昞œyëmŒþùŸgÕd`ÿÜ\õÈnª50% ã¢ç>ä† ¿'ÚÜñýL|¼¨ºûz^[¿SHgÅÙ'‘hð»â'3óÉ߸áè1-”ð¤‘üýöI,Ÿ©6óØšYàÑ—Ãóļ}/ß3‘—ý÷]ß±—ó›|ˆéÖ©%ºtI¦©‡¬Á†Ü¹ck‹<-#óà¦e›ù™ˆÎLVÞ6¶,ÏÃŒ%²+ƒF"RsP¦žzJæ8ºgU±í÷ÙÌ×ôèÍá$¦ÅS¹Sª—¨°ôt"6®bþÏ 8²™%'ˆè1”þÁ¹ìÜ´œn@g&$*™6ÕÈ\Ėއ䭛Y8o=²1ˆè®éD–ílŸ»B2ÛkÞm›Y»tª!”Än™D:rÐI•Ÿ,r¼¦Þ|£û…—_¥¬´Á±Ëê]µ¼ÿÕž¾û¼ú}9óí×só S))=Ð0Lo<\—$ro gàGpË߆ra%IÓbNî¦i„††ñÂKÏrîùSĆMdú ³¹bòXu ükªêª*Ö®YŸ‰§Rëh¹¦h_]SºÖû`%©éc+I»}+;vî&1!«ÙHRrWLf  ¡×ÈËË#!!! —ÕK¨VFq¹+°þȬ¡6‚Ìd4·ƒêÊj\Š’ž È(ÌŽbJþõ%Îé¬DFá,-¡Æë-š#‰ ñPVR…W“ÐYl„…˜Ñ¡¡ªnjkÁ •Êqk ‚±…cÒI ÖR^\>"‹³„Òo½ëÄl#ØbB/š‚ÇUKMU5.-@¹dÁa6¬FT/N{-º`”òTytêg $:}å~Ê]š/¾Í†Õ¤C+_ËÜö~æY„×hҌ˖,æ¬sΣª²òù¼ùƼøÊkçµ€ÃÔ4ú\ 8ÅF['„e®6¬\iâ mð·¾õö›Åæ#Xs9¤Üÿ4æ” Ã`I«OÛ7l?™>:·ác~þž€AvìÜMFZ I)©˜ÍæFÞ€¶–‚¨8ËŠp4ˆGE ]j^jJö5]Qèœâ tÓTg)œ •Tj+(­mš|M£D4Šb{“ïÝ¥ûš–KSpU—á ¸¤>@¹|ØËÐ$eGMëq4Õöù¾­*¢ÄL¸³šRW9{·mÆÚ‡„ •Ú#¿Ì\ìšxB<ïjà_€6öÛ]wíõõÖ8,ô›oºµÞÝ¢úÀZ£}BTU ˜¶àðûÊo–ÖpÔ¹Y-iAB"9¹kƒ6©-㫪&^G×—Ì[EÑÖ-ls©€KTƒ‡õ"D±ã>sAÇŒ·ÀkÝDŒoòR«ÿÍT÷BMBó;`¥fÆ „Ô$®àhê¼æ¿–u^wýíÍðú;t±nçˆgxwŽBx¸ƒìs”+®*ÊG§<â’œCñæ‚ëv»±…E‘“»ƒn釼­¦iääî "2—Ë…Ñhí|„QUƒÑ€ÃáÀjµvè:LF“ï=£bÞãð_#w%¥û+‰²1?-sUU)-)Áã…ù 2gîwõ/7¨ ßd_KÊ|ËÍæ`,ÖJKJˆ‰bй^–€²¦ª””£¨êAGH-öfÑ|s%zŒN§Çívc2‰­HOè‘‚h‚@T­ÅÛ¿ÃÂÃIKMÇãýsë0 z=aþ—‰7Œ µ½Á@ppðŸnwY–1 ¢A…˜ Ž}Ë¼åÆ‡ƒ‘ĤäÃj9 ŽÜè |–õá´¦Å܇sÁ1Š$,AµÝŽA/ÞÕy¬áñ*ÈR“mpZµœ55¢ÁN`Ž„‹RˆùqŒQ†øH+[sóéÓ=E4È1ÆÖÜ|"­äÖ-bI– ÆQSƒÅjvRëpÒénJ!æÇ1‘Á:Æe÷âóVâö¨ô鞌A/&)¾E®²aû~þ}'œšMdPë×Äh0’Ô…œÛHKÏ (8X4à DÝÎÎÜôé7—ËÕ©y 1?މ±é©r†0ù”¡,þ}s–ç!~ßs ©%Hˆ â¼S² ¶’Ñú®n£¸¸x¬V+9Û·a·ÛÅDó‰røG]={÷!2*ªÓ]iBÌct²L÷83Ef‰ÓÆÅ£Hb¢ò@’@/kDX !ÂÒFX UU‰ŒŒ"îä±üóCUUÜn÷™b~GB¸‰„pÑÇ3.—«Ó‡á‚|$ š@ „˜ @ˆ¹@ „˜ @ˆ¹@ œ(ˆÕ, ]¨Š‚WQÄF=‡‚$¡óï\)Ä\ u<{ Ø´qååå¢AÚ,ËØBmdfe‘ܵk§ï\)Ä\ ´i‘8Àš5«;v,)©éètbc·öt€»órYôë¯èô:’“S;±Ý„˜ ‚ƒâUÖ¯[Ǹ HMM ÒN ݺg¢ÓXöÛoÄÆÆb±uÞH@4¹@ 8(šFYyY“G ÚOR—d**Ëñx¼š°ÌA›¨ªŠN§/¸èˆÈêõ(ŠŠ¦uîjÂ2‚!æ@ Äü(âÍçí1‰ !Okaì ˜Òµ;7-­9±ê%4M;6×éiaÀ‹yx:ß³‹—ZéýÄ6ÜG¨Ì'¾˜ke|}V4‘QÍŽw±²ö/ðtxwóÚèDF¾²«A¸å 2N»3z†ˆa“àW÷R>?Y^ßè0'0èÒ™,)UŽa6ˆÌI—qNŸPß3æÝÉóýƒè÷ìñm@ úa2ë‘!Ô-Ú‘ŒQt3ír©¸Ý`4Ê—¾'À„ˆÁèéÏ1ú˜-·@Ðìùý2‹_Iæ¦|Ë·üçºéœ}[?r?šH˜ÔÏ埜H”£÷àŒn–Ã.,>ýúÑÏôÍJÄ*Î<¾þ×ù JöYì飮æ…åe´Öç«eËxæ’Á$DEÙ}"w}±‹&Ûý,=÷ž–Ȉ_cú¤þ$EÅ1ê¹í¸›X"¶~t;{ÆûFqÝ~Å[äø©•kxý†±dDGÕ…ü‡9þ/[¤K|—¡<°ÙÍ–!.*šÈŒ©,« àféH¹Ûç¤G?`ÆÅÙ¤ÅGÝm»û2l>ë=ºßßxjq ^MCÓjÙôҌ̈ðYö¦†^ù*k«T¿Ke+ö´ÒçÞç¸}l*¡zýß‚[¥ø<-‹^1a$S?Û…KkGžž]¼2(ˆÞOnÇ­U2çÜ^ܽÑŦôÀ¢×£¹šÅö6Òð—«ï¿Þä³2‰²è1Fá†OòÊð—r³´.gÁ½ç0uQ7¦}¶„µ«ðò¤RžùÛ |^@Ε}|yó%<š3šç~^Åš/nBÿ΃̷k‡ž›moüósÈ=PÈ‚[Òiü\ïž¹é?“vÿ·¬Ú°µ Þcú©]0úóŸuÓùÜ¿"“¾[ʪ…¯sžý-¦\ø4œH¿ˆüÜe<ÜÓHÖC¿³¯¤˜Ò/2ÜÚ‘vhVî›"ù­q¶¾ñ)¦Ûf³­0ŸÅñÍÓ˜]¬ò^MdÊ5,² ´ßj®Ùõ3ÿý¥”¸ÙĵŒŸnÏu ºóÏÙÈÙ¾Š·'óؤËù¸@ñYÚrO®yé'¶ää°á§‡é·ânνo ·ž›-/~ˆyú"¸¬¼³;Ülšù9“Þg}Îz¾½Ùȇ—Åcœíȳ1¡œ>kO÷6Ñë©m8<<ûßf¤¥=i¸ÙüÒ˜þ±Âš*6=•À—7Þ̬ýGç®Ç€˜k¸æ]D×F>ó¡3·ãÜ?'¿2sók3¸dXw’SzsÚOsGârÞYPLóæòîýžWX¸ü…‡¸¨ )}'óàSƒOÌ•v¦zÖƒÜ=.“¬Çd ñ(Q©ØC™®+£Ç $5>Žä¬œsé©$}ù¿ô³‹ž‚+†eÚû ¦¿z=sÞãÍuކ[ç é¢#å6Ùæ©vĉ:ïAnA2“vöõŒ1üÁÛks|†É TüAÐÆóëüîL"  açó^Ô½|úø‚¥è;f|fæŽfò÷‘™¤¤öcÒ}¯rOÒ^ÿy?*VúßtWž2n))dŽºŠ§ž9š9_°µÑ¼™mòÜJ&YOP°ï¹1ü8Ïß8Šn)Yœzï›ü§ÏÞzíªÛ̳m”v¦sÑãÜ5:ƒd¡Ûä©L0¬aÎV‡ð™ùûkBW”Ü—È©Ícå¨Df6‹‘ZPއà&çÜ…ë(»sgfÃyk±d¿Àµ{Yéé‰ýShí]ê¦îsE¯w¸mà ><íÆ?ƒ 'ŸLj„»pùR7nîR/І¸¡dGU²vG%Ê@ÚL?)wûâ‰ÍŒó*tÁD™ìr¨€Žøó^fîyBªíó™/zi$Áš{Á ÞùÇL¾ª«>¿œˆ]‹ÙîÈeYÿ`i3}w9b©\ðS§½Èwë4¸­çRát¾ç&iP*–fÒ•zr_ÂëÌQ}C³£(ùc%;ÛÊ3¸ÍZ9Û,·ÿê•@ýôž.„(‹“¼š£c™vWÏ<¤Ñ9G®†¦ÄËëçpql€„7¿¹’ž&ó~²ƒÜà é¹w:ƒ®ukÙÒ‹»¾ßÄ‹æ0oþ/Ì{üBž˜9…/Î$»Í[ž¶ÓoÅò9ôr·'H²Ô2/Ä/üñxlušwö&@ÑšNŒªš8(³{1uÉ&M|ù[1J€‰Aמelðôç–›&’iAÆCñúM”+4µ‘gC'äOKBr‚Žü…‹Ù¼÷%evÔö¦Ñ¸\ugŽÒj–cwzKgÜSsù0f:3¦Îó•€%ž~ã.å¾09‚qþ«²û–Û™ÐíAL]9åfF.zµcér•˜ ì›ó—ÏØC•¦Äl.}á=nén)Žó^ý‚’ÜÍÎF9&’G_ËoÜM3^ógcÔôi »r:cúÜá3{õ=®K]UœEXù»“*¯1AS˼‰º£áýíÆ­wv“<ò*^~ç!†ih„1îéù8æºsÏúïÅþ¦ð€MFŽ›Ì‹Ï,æŠÛû‘t[(á]FqÍ]“Xò¸ÚD›Ž4ÀHÏÛî&ùë+t÷>”ÈA\óöçLëcBÃtÐ<µzÓ¼.ÍPFÝ/Ã/ÿ#3oƒðK˜»ùÕ¶ÓP®ÆÄ‘&ûÖ0õæÝ/¼ü*e¥%âþþâ¸].>ûß§\wãM¸Ýâ—áýwÞfÒÙgc ?¤x{ òyó7xñ•×Îj‡ÿ¨iô¹pŠ…g n Mm˜… ˆl3NyY©h¸#„s@Ð^/K÷A{Fîbÿs!æà˜ÓrMˆ³s@pÜ‹yý²Cs@p\"Ë2v{ :ØóPQß+÷„˜ ‚£‹$FiI1ÑÑÑ¢=‘²ÒbÂÃ#¤Îí…˜ ‚ƒ¢“uôéÓ—åK—04{QÑ1Ȳ$¦ TU£¤ø¿¯\Aÿ1;÷% BÌÁA‘u2ññ ôîÓ‡uk×PUY‰¢Š"Úìu:laaôîÓ›¨ÈHÌs§æ'Ä\ I’Ð ¤¥¥‘˜˜ˆ×«t?!A£ŽP’Ñ ˜Í–NÏKˆ¹@ hŸ¥©7`ÕDC«‡h@ b.!æ@ b.!æ@p¢ V³‚v¡* ^Eñ¿BÐ.$ NF§ë|©b.ÚÄãñ°· €M7P^^.¤ȲŒ-ÔFfVÉ]»b0tî²N!æ M‹¼øÀÖ¬YÍØ±cIIM?"Gàî¼\ýú+:½ŽäääNl7!æà x…õëÖ1nÂRSÓEƒ´ƒÁ@·î™èô–ýö±±±X¬A7M.ЦQV^FrrWÑ ©K2•åx<ûvta™ ‚6QUßžÜâMCY½EQ;}?a™ Á €s@ b~”qïà™a‰œüf>Þ#•§}Sºv禥5(E1>º7--cý¿û5ìYv¸‘öñæóö˜D†¿‹§õZCÓ´cãpmᑞ¼˜‡§#ñ=»xy •ÞOlÃ}„Êü—sWþ\f\:’n1ÑDFEÛm0¯|’Å¥ÇÇ~ɲ-›;gÎàÒ´ '=ÀÌ{Çs8g"´2¾>Ë×6MŽw±²VŒàhª{)ŸŸ¬G¯ot˜téL–”*ÇðCDæ¤^¯ IDATË8§O¨O½;y¾ýž=ˆÑspt'@]›xê‚¿ó’q òÙ‰&ìùëYüóŠkÕãbà Y38ëŠ ß?â.äÊ! ­âvƒÑx¨õ’Ð{”Y ¡na“dŒ¢›éh×¾£õœ8HèG¿Ìâ—F¤¹)ßò-ÿ¹n:gßÖÜ&&uÆ=÷' ½ÿoï¼ãs:ß?þ~V–È2$ BP”µµFk|ÕjKûÕJJkmùU«Z­Ñ–ÚE«´V‹jíU1j+µ"F*ø’¡Èzæùý‘„‘AÁõ~½Î+Ožû9÷¸Î9Ÿûº¯û>ç¨=h6zÍ$ÌR„Q€K1¬;íB§ÏÇЧy-ª„U¥nËî ùüc:ùg÷3™gY1ª3µ²<ÒŠ^còŸ)äÚÙ2ª1~á}XxFûVÅ×^¿=¬Æ€?Óo†ižùt>cºÕ#ØÇÏJÍôË?äDJ,)»˜Ôý)|=6Ó…ß™¶Åž^“?¦kd Õ;1z|W¼Ès{ª¿þ=›Õ ¸|yBë÷dÌØæ¤¯_Il¦ÕéÒn4Cšùb«Öb›º‘ñiÓíþúµ]©`3¯;!–Ì‚Ú'§¿Ë§=µ·u{ÊØ`çAÝ:!8É] O¢¯N檶¸ëtèt¶¸„tæ;á,×GÀ|ic–Ø1pþ^iF`P Ú¿7aþ;˜¹ñ2ˆŒFïVµ¨HX£>ŒŸÔ†´ÕË8a5'äÜésÞoå­ZKG*À¶É8¾î׈Já´>›"Nñ팿¸‘o™ùc.`^]Ç1¸±7:•=•:  …î«O¤?1sìyu.û;ÿÃíÛÙ½÷O6/LûIs¶îWúgì".ã,{ù1áŽ=ƒ®bD 8:© ÿU·æÛ­_ò¢oa›dƒwX9nʿƻLÎ¥[0\§²¦£ÈÚ“3ßöMC© »™ûî@:õ©Ì¾¥½p;ClúivE:2öŽ=+Æ_ň7×¶ŒgÀÐ)¬:|åÖ5äð"ÿšMÖ5ä_;û;¤+¨Iu\sÜQm9êÖó é¯S$ɯLÇ|[•™o½µYÚQÕ÷Öõª)‹‡}&gÓ,O¢˜çèguÚô N›ôú:c¶`òø¼Ú_AÑÔfêáÕtóÎea8•%& Z`·a‹7Äóü«oW•½ÝîH`¹#„¥Rßý#@¥å¶ù=µ]öÿ–ä5 è5¤~ßóË3»Ù“¹+š=ÒP¬NvNcU|Ú”O̼¬Õwé§óÉËtþ®¶çÕž|ëf8•K{„'£ÑˆÉdµÞCÑc²€ÖŇ à ¬s³bc'leéóãXpòÞ4˜°hžbæÉMô,w÷9e¹°Œ×;Ž%©ÿvÿÚˆŠîdîèKX—T †Lôè1)*Ô*}f–GlÐcR@1éÑç|G&‹Š}>e¢ÿçöýMwç—±˜Àb@¯ÏÌšSÒ0+ fc&z½M‰ŸÒ· Á¶•Ü!óßT4þu æËw&ç14ÒàÖèCVÌkÇÉáˆ^vþÖ„œÚ7HKI¿¹¿éêi.¤lBÂÆ¯þij/áÖŸþâAÎdfíoLØÍ߯D½Ñœw{4*Iãj‹ÞmˤM4U!óʯ=EY7áñ ©ä6ŠrûĨEQ€tRRMØ–¯GEŽòóöD̹L êÿÙÅc$oEµ$ÄÝ5F媙Û'ïšP4q.æWÍ9kÇ/³wO2nÁxæ]¦’í§Ýj µ³ùæoò«÷½ë¥äj§Ç^ÌÍÓ§ó[|þÃZv9Á‰#;XöùFÐPçÅš¸ø¶cD7'6¾Ó‡O–ïãôùóÄÜȼ1ï3ç¤á¶†w›/X5ívõw×\κ‰È&€ÆÏ8stÞRŽ¥gÍNÿ<ækŽжZ¿¶D5LfˆÍPP2ãXúÉlÎæ¤{U%PÇïÛ/aD!=v1£&%/·UãSÐ6À[/d^ùµçþêfæÒò·x®Ë8eŠÜ=ÖR®ä¾šÅt=ž“ÇsüØßìß4†.ãšwsZÛ¢öéÀ=œYý2£—îáÔ?ñÄî_Ç·cÖñ̬kH˪?.bP,¤XÈ{Ÿ¹](sëH}ÌH†~»“ÓçO°qb4cŽÓ»Oeò)óV'”—¦,¾ÎoáØ…+$¥¤b)hÖõÊùæI\Í¢v©Nó°lüò-:4mÄ3M_dà¢ë4ý3 z¢S»Òlü~xÓ™5CŸ£nÍZÔë0˜âœp¹³ê:ü;Má·ñUXýz'>ü# e¨7rQ³hYÁŸ ºQìxjÏ:ª ª–tžþQL¦E¥`Bë¼Æ¦êÑ4tPg'wäë ­ˆR‡ é×w ‘ï´Ã-¯àU¡Ú”Ÿ ™W>í¹¿ºYȼt„={OqÝ$‚÷¤yæ `Ú>¦uëQ·^ž}ñ=6º÷aꊱÔ/£ ¨\h6q= £œY=¨µªFPû¹·ùþ”ÎjÔ>˜2©5±ïÔÀ¿|%jõÙLäàö¸io»˵¡ÊÛCXÑ›ÚUêÒqzÝæ,eh„m¾e*7]óœüœhôþpêŸ|—†a•ŠÂîŒä÷©<1ÏMÕt¢û&ONJr’œ¿‚ð„cÐëY²x}ûEa0È]÷Ã÷sçоCœ]\ µß…„óÌž5‹)Óft2€ôì-Íês)‹ÉA(`˜EA±ÜšMqusÏwŸ«)Éb¸BÄ\„‚FYn dä.Ï?1¡Ôi¹"â,b.Â#/æ7— "æ‚ <’¨ÕjRSÓÐhä ™…ÅlÎz垈¹ • ’“ñôô{’”äD\]ÝP©Š·#1!O4j ÕùsçêÖ{O/Ôjy C~X, I‰WØ»g7‘µjacS¼/ 1!OÔ5>>¾T‹ˆàÐÁ\¿v ³Eøo'¨ÑàìâBµˆjx¸»cgo'b.ÂÃC¥R¡µÑŒŸŸ&“E1/PG¨R£µÑagg_ìe‰˜ ‚P0OS«ÃA«C”ÖŽCL ‚ b.‚ ˆ˜ ‚ "æ‚ ‚ˆ¹ Âガf*§bO²=&†+W.c6›Å B‰1àíÅ^†J­F§Óakk[ìe‰˜ øâÙ°a=­ZµÁ×Ï•Jî*JŽŸ—..Öü5 ...T '$4³¹x׿‹˜ ­›7ó|Û„††RÆÑQÄ\(yï|ààbËÛh4î,1Û¶âæîŽ——W±¾©IbæÂCã—.âåå%B.<–èt:*…„òlÓæìÞµ ›bµˆ˜  ³ÙŒJ¥!küË’’ŒZ-OMA(6ŠûíIZ­¶D&÷Å3Ax 1A1DIÝÂËB‰Ú™†SLzÚ&³Ïc*ªüMç™ó¬õ'ŸÆXÄUO?ð!õžz=iÅ[Î}c¾Ä’®Õéð}ÚSŠ EQJd{üÅ\IaE;OÜ=nm^¡ é1v ð¢.CH›ÿð|•²Y6Å3£± §{0Ñ5_dåÇ‹pìÛZer)§4 ñ¡íàVœ›ô5ûÒî·ÉìøêU†øáçHÍÞã—³™¢<‚Pº=sÚذc;;¶þμè@ö}Ù›~K/R:ï´`0ä³ø_íFã_1ª…EùWÙ%|s "}ÚûgÍ\S9J™š¯ð¢f%S¶¥PxŸÄD¢7yyR<¿ø­¾ãu‡å èù‡Òå‚„RfÑ8R¹2aÕêÒ6ú^ 4qroYιž³£iS;8Ë{÷§Yô\§fËDv˜ä™Oç3¦[=‚}<ñ¬ÔœA¿üCŽsoIÙŤîOáëá‰{hK/;‡þ.gpãºDRÎÃϰç¶â|ÖþÙù7=ƒí#ñ÷(G£¯b1džeŨÎÔÈQTlô“ÿLÉê€n Ü`C¯ú|pÌÀñÿ«C9OÜC°+È+»0r~í2ÎTèÀ3^šÜÃ9°Å]äU‡ìü_Ƥžuðóðħf¾Þÿ/×þšÍf“ÊíÆ²-ÙªÖ¶•x¾‘– ÷q­°'ƒñ K§ï¹ÇFvŒ$¤JSúÿ€È„™±ï†\±B‰†ZÖ®]ËÚµkø7OŒ˜ßRÔ4â·þĪxÂêúc“ã «+óòøåì=x€]+F±=>ÚË­Q¼³aûöoœ¼xžÝ—cåÀ¡ü–hóÿø9º;ŸÆ5æ«û8°, íÜÑlJµ6°ã“'r¦ÍtvÜ΢ÿêXÔ·“Žêo¦Ÿœµ»A«9}å"[¢ÜÙ>ül«ÄÐ%;8¸ SÛ'3é¥7YzñN).KË»[ņð÷ò¿¤D’OM¡¾ÝU¶8@¹Á‘g)‰wž Jó°Å]ƒŒ‚ÔÁÀ±é“ˆm:‘u1«¹Ÿ{ô¢×Ð=Ôúx%;ÖL¡yüWD?DÆÍŒí©Ø0ý¡-œ)dtD¹~œíñ6TkQ‡ìï´^OÑØ?•Ã^À Ú#” ³gϦK—.¬[·.×ôuëÖÑ¥KfÏž-ž9(è×v¥‚‡'îÞ¨Õã;܆,dNWßìÐ=Õ_‡žÍj\¾<¡õ{2flsÒׯ$ÖJ(<:ަOt*;‚;¼Á³º¿X›éÂïLÛbO¯ÉÓ52Àê=¾+^wlŽæ‹×ê\¾2Í~ÍûUNóý¼#7Ê©Ýh†4óÅV­Å6u#ã±#zƺ?J@`5Ú šÈ@¿?™»%‘‚<Á|y-_&ãeN\4ãì‘ïÍ÷²ÅýÖÁ©ùX¾øocª…?MÏ¡¯P!ù0Nƒ?'ªYau:ónT8)1;¹h¼:sð À.å$— )ææ—¸ª8áëbÕJ3~Îðï…eRU(Q,X@“&Mrô!oÒ¤ ,xèu-7 ©ÐÖǪqõ°¹z”e£3gÓ!’?‹§ÀLRÌ†ŽœÉÚ£I·&íÛrÍYî» Þaå²=y@㈇]&çÒ-."AÊ 0Ç›%:TnJ˜ÍŠÛÌøLœsº6­7µŸr#åï3¤*5~‘ä¼[[¿‹¸Œ³ìiäÇ„;Z”p#Žù¶:ÿ<ÊqÛÍ¿Š‘tØØéòéïm‹Â×A èð¯|ËKvòÁÉÆ—šQeÛ®¬OYTé)¤Y¡ÖÙ¡³d’nR¹ÃSx4±³³cÙ²etéÒ….]º0iÒ$Z¶lÉúõë2dMš4aÙ²eØÙÙ‰˜g9^A„W­JYªRmn:ûë䃕ÝXÚµªä5 è5¤~ßóË3»Ù“¹+š=Ònó­UjÕ]¿‚  Òbc­€jºBITht+IRP4µ™zx5ݼsÉÈt¾@#’<ó¸k U÷2*ÒÿMǜϻ§- [Ã)@…Zc•¦Rj´Ö_eo÷°3þ%S댋Má„\SÖWÕu.þk僛¯qá¸ø¹È-ËB‘b41™ò^c¦RÁÂ… èÞ½ÑÑÑ7¿oÙ²% .@¥½þ᯶*uë̵å;2¬ƒ=LZHœŒ »ùÛXƒ¨7šânFe"éïc\-àxÛÆ¯þij/áV´Uñ g2­ÅÇDüŽc\Ëñ,MWØ¿/×jA8æ¢E¶åëÌ1–ïLÆR@3kT (–ûÏCçIµJ¶\9ö¿"‹¾ÅDJ\7ïѧ#º9±ñ>|²|§ÏŸ'îàFæyŸ9's‘ZmYÊûjIضƒ—’H¾š†RØ›Zš+èE›O¦ÒF•ðhDYJ, "b.‚PlZ®ˆ˜ ‚ <òb®(XDÌAu1/þ0‹ÙlA£)þ皊˜  Fƒ¥„&‡á^j^Ü”)ɉ¸¹¹û¹.b.<4Êùø¢×ëÅÂÃÓòbŒ™[, I‰WØ»g7Ï6k^ì纈¹ðÐx¶Y3ý´€.ÿy‰ÐÊ%2k¾›óm±Ž<]]]y¦Q#|ýüHOK+Ö¶ˆ˜ À€@Z¶lÅêßVqùòlÌf³E(1ÆŸXìeX, C± ¹ˆ¹ðÐ ­LHhe1„PâönÌÒŽÜ*‚ b.‚ ˆ˜ ‚ "æ‚ ‚ˆ¹ ‚ˆ¹ ‚ b.‚ ˆ˜ ‚ "æ‚ "æ‚ ‚ˆ¹ ‚ b.‚ Ü/×2T­äOº—;AžE/½"æB©öȯ\áÀý4mÚ”À Šò‹ìãÏžfÛ ÑjD}{&§šIJ¾ÆcgéÖº!Þh4•½Û›8~ö¿l>ŒN‹“½ îŽE{.‹˜ ¥“ÙÌáC‡hÖ¢AAÅ ˆN§£Rh­Ž]Û·ãíí½C™\›”jᯓñôlS› åÄxl{-ÕCË£S«ùmû1œœŠ\Ì¥«J/ŠBÊÕ*ˆ-Šÿòü{í*F£éÞž¤YáRJ*Áå½Ä`EH¥@o.¥¤b4ý„xæB©Æb± ÑhŠí¥»O"Z­³Ù‚¢XòêG1›-h4j±}‘Ú^“mû¢Ï[:Š^ ò8ué¤[Ĉ"ñ±×¢Õjq iÂë_þÁåœy\%™¥Mt8v\Ïõ›§D"†VÇ®L]FmKÏ\ LçY9m/.þœŸÿG3г0 ƒEl^B¤ù‚ÖOõbnúsŒûíOî߯wQØ=¢9ußø•ËæÜ·KüöNÚÍtfäæ |ÔØMÄ\…P‹áÌRf cøŒñ´¼¶˜ÙR­Ò̉›Ý&{­߆ Xr}AÒõ'ø´Šÿâ¦A8im‰w}zK†´"Ä9Ë[ô¬ñãc’0e—kIcÉ»Ïæš•îP¾>QË0f—g¹¶—¯»UÃU«EëY‡7:›]%¯¼³ëS}Ôl>h†‡½›;÷/¢¡þCMÏ2ïQì©ò)[~ý”WšÕ¦Zõú¼0h.›—u'sþ›ŒŒ¹–õÛl/^1œçç~ é¸À‡±[çýºN¨$Ì"zbÎá\d4]jµ$º3wßn`à脱ĵÿžÃq‡ù5Ú†z¶ã³#™N?>åìFlãŠ>=︳õíæôÝÊÈߎ»9ù¬}/&˜Á’̺þMèñ=ôœ·›q'Øñm?j:戎¿'}ÈÁÙ|øO÷63ÿh–_¶€%… yå½ÿ±oæcûîV.¦]çèx_~î—½ÿã<»¸Žï÷ªi:¬7áv·Ë—g‹Á¼ÈÊù‡I»y*œã§×ÒmEe&Ŭdp­²¨ž€+@Ä\x<È8ʼWhп-~Zgô{ÝšéĤÜî Ù6Ç×ýQ)0œÖÃgóQÄ)¾ñéLwîô9ï·òÇV­ÅîÆZ>YbÇÀùx¥aA5hÿÞt†ùï`æÆË/¬`Ì™t™·€^¨EÅÀŠD¶z…¾­ýÉy*Šsë/™Ò¿‘áµéôþZk÷³úD:æK«“GÞ9ríÕuƒ{£SÙS©ÓZè°úDúãÕM_<Ìü¨š‹(ÛòtŠ”g¸aÉòÊ3׿EÿŸœù¿Ké_­Ì!ä"æÂcCÚÁÙ,½ÑŒ·Zx¡ÊÔêKW§ÍLÛ”È-?UKP“ê¸æœõÚrÔ­çAÒ_§²… ¿tþµƒ°ÏNÎ<ClúiÆF:¢Óé²6‡ªŒ<‘ArüUnÄïä´N»Ú®÷åë…à˜“h㎟£žä4K¾y³vÀ»ª/¶9ÙiÊâaŸIrÚ“ËWA¥6Ô.sŒoÆ,áô4 .w€ ¥£ÑˆÉdÌã7ˆ™¶Œ‹)ÿò¢·Ím)šoVß¶'¾f=&“½>3[à31XPŒôIW¡V™0d§ë &,š§˜yr=ËÝí¥í4£`ÁdÈD¯¿CÎ Yù©#z}&f½‹¢`6fæ›7úXL `1XíoÀœ³¿Þ¦„l_¸‡ãÃ\öM"3ÌãöŽ1ó$;Î(¸6ñÇÆ¨Çd»Ê}ùiÞӼܲ/Mz«Ù2»+:ñÌ¡÷„’%%†™k,´žº‰]»vÞܶ-î‡ßYü–`Ìžx2q.æWÍ9k—Ù»'·ˆ`ʨ ’X•k[¾9ÊÏÛ1çR/ÛòõVà÷W±Ük"ì®ï²¶üòÎoÿ¢›„{ø†êrÍéQË̶Ió9‘af&qód~8ïA»ÕpÈ™UÔ8Fä—ßGà÷ëë´ê¿’ FYg._Ê•¼WT$nžÉ&¥ };úeF/Ýéâ‰Ý¿Žo?Ƭ㙨}Ú3â?¶,ïû_ü~ˆ3çÏphÓB欿p³>·‰eÎ7È[Égÿ¢»i¨¬fÑòÊ×P󨇴þÏÿ±pËAŽù“USúѦûRl»OæÃúŽwØDEÙ:ÃY¾| .‹zÑfèZ.›DÌ¡T{æëfÅ z¦O•½#ͦ"/´÷æø¼%Äf*€ UÞBÀŠÞÔ®R—ŽÓ3è6g)C#l³/²üÒï6• Í&®ga”3«µ VÕj?÷6ߟr"ÀY¢r¥Å—k˜ÓÍÀü>©Q%’ý¾åp:7ßštW{r¼íüòÎoÿÇÈ3WûêCXµm&=lÖò.gŒ™IDATA§&<Ý ÿ~–Ú­â)Ïã©¶nWÎ~*\Žbå²~èæu£í[k1Ïm^F7 ºŸaòÔé¤$'‰Ž ƒ^Ï’Å‹èÛ/ ƒÁ )B¾Ÿ;‡ö:àìâškú‘?¯ÛÉçžÛ1£fn¤sëDøç?¯q!á<³gÍbÊ´ ={K³úœdʨð„Y˽Wh¸º¹ç›ÇÕ”d1d1ؾ$(Èñ•c,«Y„G#Ê’çð´ #Hy&wñؾ$(h„àI?Æ"æÂ# 'Šˆ±Ø^1‡¡¾EEl/ˆ˜ .jµšÔÔ4y3|’õ:¸¼_&¬RF£&55F%F+2Û+h4jTÅ`Rs¡ô¢RáââBrR"žžžb""%9WW7Tª{w: 7G.&^Çß«¬­ˆ¸˜xƒrnŽØC)b.”Z4j ÕùsçêÖ{O/Ôjñï‹E!)ñ {÷ì&²V-lllïù[÷2jj„²2æ$Ï×!ÀÛ µ ŽÀöðÏåë¬ÞuŠú5Cpw,zcŠ˜ ¥µF/Õ""8tðׯ]Ãl‘BÜwç¨ÑàìâBµˆjx¸»cgowo1wTsÃʼnšUƒØr0žËWS1›Åö÷o{5^®ŽÔªŒ§›3îŽsáÉA¥R¡µÑŒŸŸ&“EAy R¥Fk£ÃÎÎ>_ÛWðÐáhç·‡F³‚̃>ȹœºr-£Æ³„\Ä\x4¼­­N ñȳ¬ϲ1Æ£ÐQ‹ ADÌAsAAÄ\A1A1ADÌAsAÁŠ, leto # msgid "" msgstr "" "Project-Id-Version: glom help master\n" "POT-Creation-Date: 2010-10-19 11:06+0000\n" "PO-Revision-Date: 2010-10-22 19:21+0100\n" "Last-Translator: Matej UrbanÄiÄ \n" "Language-Team: Slovenian GNOME Translation Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-Country: SLOVENIA\n" "X-Poedit-Language: Slovenian\n" "X-Poedit-SourceCharset: utf-8\n" #: C/legal.xml:2(para) #: C/glom.xml:2(para) msgid "Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual." msgstr "" #: C/legal.xml:12(para) #: C/glom.xml:12(para) msgid "This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license." msgstr "" #: C/legal.xml:19(para) #: C/glom.xml:19(para) msgid "Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters." msgstr "" #: C/legal.xml:35(para) #: C/glom.xml:35(para) msgid "DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND" msgstr "" #: C/legal.xml:55(para) #: C/glom.xml:55(para) msgid "UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES." msgstr "" #: C/legal.xml:28(para) #: C/glom.xml:28(para) msgid "DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: " msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:181(None) msgid "@@image: 'figures/start.png'; md5=b8c9acc03f9f1cdb213e37c9da91817a" msgstr "@@image: 'figures/start.png'; md5=b8c9acc03f9f1cdb213e37c9da91817a" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:212(None) msgid "@@image: 'figures/glom_tables.png'; md5=e725285aae974272ca99dc991c7ae9ed" msgstr "@@image: 'figures/glom_tables.png'; md5=e725285aae974272ca99dc991c7ae9ed" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:238(None) msgid "@@image: 'figures/glom_data_list.png'; md5=3c43533f6b0ce3e645b29402f59af76f" msgstr "@@image: 'figures/glom_data_list.png'; md5=3c43533f6b0ce3e645b29402f59af76f" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:261(None) msgid "@@image: 'figures/glom_data_details.png'; md5=5444ab817d4e4e4da6899abbc5cbfd2f" msgstr "@@image: 'figures/glom_data_details.png'; md5=5444ab817d4e4e4da6899abbc5cbfd2f" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:291(None) msgid "@@image: 'figures/glom_report_result.png'; md5=ceeb0ce107453125736a604d91165bf4" msgstr "@@image: 'figures/glom_report_result.png'; md5=ceeb0ce107453125736a604d91165bf4" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:329(None) msgid "@@image: 'figures/glom_design_fields.png'; md5=e7137a37c7c74a96a914b0df777f5f6b" msgstr "@@image: 'figures/glom_design_fields.png'; md5=e7137a37c7c74a96a914b0df777f5f6b" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:379(None) msgid "@@image: 'figures/glom_design_layout_list.png'; md5=5c5fc16b70e39173785ef3167d66aceb" msgstr "@@image: 'figures/glom_design_layout_list.png'; md5=5c5fc16b70e39173785ef3167d66aceb" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:398(None) msgid "@@image: 'figures/glom_design_layout_details.png'; md5=34946df95ce29f04b3d204ba0cbca904" msgstr "@@image: 'figures/glom_design_layout_details.png'; md5=34946df95ce29f04b3d204ba0cbca904" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:444(None) msgid "@@image: 'figures/glom_design_translations.png'; md5=94376c6bf38d86581d56b3309441a792" msgstr "@@image: 'figures/glom_design_translations.png'; md5=94376c6bf38d86581d56b3309441a792" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:471(None) msgid "@@image: 'figures/glom_design_reports.png'; md5=74c35ae3dd601490b9f4f2276383a518" msgstr "@@image: 'figures/glom_design_reports.png'; md5=74c35ae3dd601490b9f4f2276383a518" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:503(None) msgid "@@image: 'figures/glom_design_reports_details.png'; md5=b75a1a60a48659c6166f4fdd7da6c68c" msgstr "@@image: 'figures/glom_design_reports_details.png'; md5=b75a1a60a48659c6166f4fdd7da6c68c" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:520(None) msgid "@@image: 'figures/glom_design_reports_group_by.png'; md5=3d6a191a50ca351183a6690ce0039a9d" msgstr "@@image: 'figures/glom_design_reports_group_by.png'; md5=3d6a191a50ca351183a6690ce0039a9d" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:536(None) msgid "@@image: 'figures/glom_design_reports_vertical_group.png'; md5=0328958fcf2f55c27045dbc203761214" msgstr "@@image: 'figures/glom_design_reports_vertical_group.png'; md5=0328958fcf2f55c27045dbc203761214" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:752(None) msgid "@@image: 'figures/glom_design_fields_dialog_calculated.png'; md5=3306db510932ab3bb99f7e1c676b2512" msgstr "@@image: 'figures/glom_design_fields_dialog_calculated.png'; md5=3306db510932ab3bb99f7e1c676b2512" #: C/glom.xml:28(title) msgid "Glom User Guide V0.2" msgstr "" #: C/glom.xml:29(subtitle) msgid "for Glom v1.6" msgstr "" #: C/glom.xml:32(year) msgid "2004" msgstr "2004" #: C/glom.xml:33(holder) #: C/glom.xml:99(para) #: C/glom.xml:100(para) msgid "Murray Cumming" msgstr "Murray Cumming" #: C/glom.xml:47(publishername) #: C/glom.xml:60(orgname) msgid "Glom Development Team" msgstr "" #: C/glom.xml:57(firstname) msgid "Murray" msgstr "Murray" #: C/glom.xml:58(surname) msgid "Cumming" msgstr "Cumming" #: C/glom.xml:61(email) msgid "murrayc@murrayc.com" msgstr "murrayc@murrayc.com" #: C/glom.xml:96(revnumber) msgid "Glom 1.6" msgstr "" #: C/glom.xml:97(date) msgid "20 June 2004" msgstr "" #: C/glom.xml:105(releaseinfo) msgid "This manual describes version 1.6 of Glom" msgstr "" #: C/glom.xml:108(title) msgid "Feedback" msgstr "Odziv" #: C/glom.xml:109(para) msgid "To report a bug or make a suggestion regarding the Glom or this manual can be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla before submitting your bug to ensure that yours hasn't already been reported." msgstr "" #: C/glom.xml:119(para) msgid "User manual for Glom." msgstr "" #: C/glom.xml:124(primary) msgid "MY-GNOME-APP" msgstr "" #: C/glom.xml:127(primary) msgid "mygnomeapp" msgstr "" #: C/glom.xml:135(title) msgid "Introduction" msgstr "Uvod" #: C/glom.xml:136(para) msgid "Glom allows you to design and use database systems." msgstr "" #: C/glom.xml:150(title) msgid "Getting Started" msgstr "" #: C/glom.xml:153(title) msgid "Starting Glom" msgstr "" #: C/glom.xml:154(para) msgid "You can start Glom in the following ways:" msgstr "" #: C/glom.xml:158(term) msgid "Applications menu" msgstr "" #: C/glom.xml:160(para) msgid "Choose OfficeGlom." msgstr "" #: C/glom.xml:171(title) msgid "When You Start Glom" msgstr "" #: C/glom.xml:172(para) msgid "When you start Glom, the following window is displayed." msgstr "" #: C/glom.xml:177(title) msgid "Glom Start Up Window" msgstr "" #: C/glom.xml:184(phrase) msgid "Shows Glom main window." msgstr "" #: C/glom.xml:198(title) msgid "Using Glom as an Operator" msgstr "" #: C/glom.xml:199(para) msgid "To open an existing Glom document, either open that document from the File Manager, or choose Glom from the Applications menu, and then choose the document when asked. Glom will ask you for a user name and password to access the database. Your administrator will provide your user name and password." msgstr "" #: C/glom.xml:201(para) msgid "When you open an existing document, Glom will be in Operatoruser level. This user level allows you to find and edit records, but does not allow you to change the fundamental structure of the database." msgstr "" #: C/glom.xml:204(title) msgid "Navigation" msgstr "" #: C/glom.xml:205(para) msgid "Each database has several tables. To look at a different table, choose Tables from the Navigate menu. Then double-click on the table, or select it and click the Open button." msgstr "" #: C/glom.xml:208(title) msgid "Navigating to a Table" msgstr "" #: C/glom.xml:215(phrase) msgid "Navigating to a Table." msgstr "" #: C/glom.xml:224(title) msgid "Viewing and Entering Data" msgstr "" #: C/glom.xml:225(para) msgid "When in Data Mode, you can view or enter information in either the List or Details view." msgstr "" #: C/glom.xml:228(title) #: C/glom.xml:234(title) msgid "The List View" msgstr "" #: C/glom.xml:229(para) msgid "The List view shows many records at once and usually shows only the most important fields." msgstr "" #: C/glom.xml:230(para) #: C/glom.xml:253(para) msgid "When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you." msgstr "" #: C/glom.xml:231(para) msgid "To create a new record just click the New button, or start typing into a field in the last empty row. A new record row will be created with blank fields for you to fill in." msgstr "" #: C/glom.xml:241(phrase) msgid "The List View." msgstr "" #: C/glom.xml:247(para) msgid "To sort the records just click on a column header. For instance, you could might click on a date column to list invoices in order of their date, and click again to list them in reverse order." msgstr "" #: C/glom.xml:251(title) #: C/glom.xml:257(title) msgid "The Details View" msgstr "" #: C/glom.xml:252(para) msgid "The details view shows only one record and usually shows all the fields arranged suitably." msgstr "" #: C/glom.xml:254(para) msgid "To create a new record just click the New button. A new record will be created with blank fields for you to fill in." msgstr "" #: C/glom.xml:264(phrase) msgid "The Details View." msgstr "" #: C/glom.xml:275(title) msgid "Finding Data" msgstr "" #: C/glom.xml:276(para) msgid "Choose Find Mode from the Mode menu. The fields in the List and Details views will now be empty, and a Find button will appear at the bottom of the window." msgstr "" #: C/glom.xml:277(para) msgid "Enter information, or part of the information, into a field to find records with that information in that field. For instance, enter Jim into a name field to find records with \"Jim\" or \"Jimmy\" in the name." msgstr "" #: C/glom.xml:278(para) msgid "When you press the Find button, Glom will search for records and then display them. If only one record is found then it will show you that record in the Details view. If several records are found then it will show you those records in the List view." msgstr "" #: C/glom.xml:283(title) msgid "Printing Reports" msgstr "" #: C/glom.xml:284(para) msgid "If your database developer has defined some reports for a table then you will seem them listed in the Reports menu. Just choose the report from the menu to create the report. If you have previously performed a search then the report will contain only the currently-found data. Otherwise it will contain all data in the current report. Remember that each table has its own reports so you may need to switch to the relevant table to use a particular report." msgstr "" #: C/glom.xml:287(title) msgid "A report" msgstr "" #: C/glom.xml:294(phrase) msgid "A report." msgstr "" #: C/glom.xml:306(title) msgid "Using Glom as a Developer" msgstr "" #: C/glom.xml:307(para) msgid "When you create a new document, Glom will be in the Developeruser level. You can also change to the Developer user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it." msgstr "" #: C/glom.xml:310(title) msgid "Adding Tables" msgstr "" #: C/glom.xml:311(para) msgid "You can see the list of existing tables by choosing Tables from the Navigate menu. You will also see this window after connecting to a database server, after creating a new document. To create a new table, click the Add button and enter the name for the new table. Glom will suggest a human-readable title for this table. Operators will see this title instead of the actual table name. You can also mark a tables as hidden from Operators. For instance, Operators should see \"Invoice Lines\" as related records from the \"Invoices\" table, but they should never be able to navigate directly to the \"Invoice Lines\" table." msgstr "" #. TODO: screenshot #: C/glom.xml:313(para) msgid "You can also specify one table as the default table. This table will be shown whenever an operator opens an existing document, without asking him to select a table from the list." msgstr "" #: C/glom.xml:314(para) msgid "You can also use this window to rename an existing table." msgstr "" #: C/glom.xml:315(para) msgid "Click the Open button to look at the selected table." msgstr "" #: C/glom.xml:319(title) #: C/glom.xml:325(title) msgid "Editing Fields" msgstr "" #: C/glom.xml:320(para) msgid "Choose Fields from the Developer menu. This shows the list of fields in the table. New tables automatically have a primary key field, but you can change this field if necessary." msgstr "" #: C/glom.xml:321(para) msgid "Click the Add button to add a new field, then enter the name of the new field. Glom will guess an appropriate human-readable title for this field, but you can edit this. Operators will see this title instead of the actual field name." msgstr "" #: C/glom.xml:322(para) msgid "To specify more field details, select the field and click the Details button." msgstr "" #: C/glom.xml:332(phrase) msgid "Editing the table's fields." msgstr "" #: C/glom.xml:340(title) msgid "Primary Keys" msgstr "" #: C/glom.xml:341(para) msgid "Each table must have one, and only one, Primary Key. The value in this field will be unique, meaning that each value in this field will appear in only one record in the table. For instance, each record in a \"Customers\" table would have a \"Customer ID\". This value will be used to refer to that customer from other tables, such as \"Projects\" and \"Invoices\" records. See the Creating Relationships section to see how you can relate tables together." msgstr "" #: C/glom.xml:345(title) msgid "Field Types" msgstr "" #: C/glom.xml:348(simpara) msgid "Number" msgstr "" #: C/glom.xml:349(simpara) msgid "Text" msgstr "" #: C/glom.xml:350(simpara) msgid "Date" msgstr "" #: C/glom.xml:351(simpara) msgid "Time" msgstr "" #: C/glom.xml:352(simpara) msgid "Boolean - either true or false" msgstr "" #: C/glom.xml:353(simpara) msgid "Image" msgstr "" #: C/glom.xml:346(para) msgid "Glom offers a few simple field types: " msgstr "" #: C/glom.xml:359(title) msgid "Calculated Fields" msgstr "" #: C/glom.xml:360(para) msgid "Field values can be calculated in terms of other fields, using the Python programming language. This calculation should be the implementation of a python function, which should return a value. The return value will be used as the value of the field. This value will be recalculated every time one of the source fields changes. TODO: This only works for default values at the moment, and you can not use field values in the calculation yet." msgstr "" #: C/glom.xml:361(para) msgid "You can also use calculations to specify a default value for fields, by selecting the Default Value tab in the Field Details window, clicking on the Calculate Value check box, and then entering a Python calculation. You can test this calculation in the Edit window." msgstr "" #: C/glom.xml:367(title) msgid "Arranging Layouts" msgstr "" #: C/glom.xml:368(para) msgid "Each table has List and Details views, and by default these show all fields in the table, in order of creation. You can edit the layout by choosing Layout from the Developer menu." msgstr "" #: C/glom.xml:371(title) msgid "Arranging the List View" msgstr "" #: C/glom.xml:372(para) msgid "For the List view, you can specify the sequence of field columns, and whether some fields are hidden." msgstr "" #: C/glom.xml:375(title) msgid "Editing the List Layout" msgstr "" #: C/glom.xml:382(phrase) msgid "Editing the list layout." msgstr "" #: C/glom.xml:390(title) msgid "Arranging the Details View" msgstr "" #: C/glom.xml:391(para) msgid "For the Details view, you can create groups of fields, and give these groups titles. You can then place fields in these groups and specify the sequence fo fields in these groups. You can also specify the sequence of these groups. For instance, in a \"Contacts\" table, you might create a \"Name\" group, and place the \"title\", \"first_name\" and \"last_name\" fields in that group. You might have other groups for the \"Address\" fields." msgstr "" #: C/glom.xml:394(title) msgid "Editing the details Layout" msgstr "" #: C/glom.xml:401(phrase) msgid "Editing the Details Layout." msgstr "" #: C/glom.xml:411(title) msgid "Creating Relationships" msgstr "" #: C/glom.xml:412(para) msgid "Tables in the Database are often related together. For instance, an \"Invoices\" table might have a \"Customer ID\" field. A value in this field would specify a record in the \"Customers\" table with the same value. Glom can show extra information, such as the customer name, from that related record. Or it can show a list of several related records - for instance, several related \"Invoice Lines\" that are related to a record in the \"Invoice\" record." msgstr "" #: C/glom.xml:413(para) msgid "To create relationships, choose Relationships from the Developer menu. This will show the list of existing relationships. Click the Add button to create a new relationship, and enter a name for it. You should then choose a field in the current table, and a field in another table to which it should be related. This relationship will find any records in the other table for which the values in both fields are equal." msgstr "" #: C/glom.xml:418(simpara) msgid "To show a related field on the List or Details view." msgstr "" #: C/glom.xml:419(simpara) msgid "To show a list of related records on the Details view." msgstr "" #: C/glom.xml:420(simpara) msgid "To lookup a value from a field in a related record. For instance, to copy the current price of a \"Product\" into the \"Price\" field of an \"Invoice Line\" record." msgstr "" #: C/glom.xml:421(simpara) msgid "To calculate a field value." msgstr "" #. TODO: screenshot #: C/glom.xml:415(para) msgid "You can use the relationship in the following places. " msgstr "" #: C/glom.xml:427(title) msgid "Users Administration" msgstr "" #: C/glom.xml:428(para) msgid "To define the Operators who can use your database, and to specify what access they have to the various tables, choose Users from the Developer menu." msgstr "" #: C/glom.xml:433(title) #: C/glom.xml:440(title) msgid "Translations" msgstr "" #: C/glom.xml:434(para) msgid "Glom's user interface (and this document) is translated into several languages, as you should see already if you are using your computer with a non-English user interface. In addition, Glom automatically shows and understands numbers and dates according to the current user's local conventions. For instance, a user in the USA might enter a price as 1.99 and a date as 1/13/2008, but a German user of the same database will later see that as 1,99 and 13.1.2008." msgstr "" #: C/glom.xml:435(para) msgid "However, the Glom system that you create also contains text that must be translated if it will be used by people who speak different languages. For instance, you must provide translations for the titles of your tables, fields, and reports. All of these text items can be seen in a list when you choose Translations from the Developer menu. In this window you can specify the language that you used for the original text, and enter translations for each text item for additional languages. When the Glom system is opened by a user of that language then these text items will be shown in the user interface." msgstr "" #: C/glom.xml:447(phrase) msgid "Translations." msgstr "" #: C/glom.xml:453(para) msgid "Experienced translators may be more familiar with the .po file format, or you might wish to use the many tools that work with the .po file format. By using the Export button you can create a .po file to use in a separate tool or to send to a translator. You can then import the resulting translation by using the Import button." msgstr "" #: C/glom.xml:458(title) msgid "Defining Reports" msgstr "" #: C/glom.xml:461(title) msgid "Adding or Editing Reports" msgstr "" #: C/glom.xml:463(para) msgid "Glom can produce reports to show specific fields for sets of records, sorted and grouped. For instance, a shop might need a report listing all products sold in one month, grouped by product type, and sorted by price inside each group. Each table has its own reports, which are available to the operator from the Reports menu." msgstr "" #: C/glom.xml:465(para) msgid "To define a report, or to change the definition of an existing report, choose Reports from the Developer menu." msgstr "" #: C/glom.xml:467(title) msgid "Creating or Editing Reports" msgstr "" #: C/glom.xml:474(phrase) msgid "Creating or editing reports." msgstr "" #: C/glom.xml:480(para) msgid "Notice that each report has an ID as well as a human-readable name. This allows your report to have a translated title when used on a computer that uses a different language." msgstr "" #: C/glom.xml:485(title) #: C/glom.xml:499(title) msgid "Editing a Report" msgstr "" #: C/glom.xml:489(simpara) msgid "The Header, which appears at the start of the report" msgstr "" #: C/glom.xml:490(simpara) msgid "The Main area, in which the records and summary lines are shown, with the actual data from the database." msgstr "" #: C/glom.xml:491(simpara) msgid "The Footer, which appears at the end of the report." msgstr "" #: C/glom.xml:487(para) msgid "A Glom report has three areas: " msgstr "" #: C/glom.xml:495(para) msgid "Inside an area, such as the Main part, you may add report Parts, such as fields, text, or images. These will usually appear in a row on the printed report, with one row for each record. In the simple case, this will look much like Glom's list view. You can add parts to your report by selecting them from the Available Parts list and then clicking the Add button. The part will then be added to the Parts list, in the selected area." msgstr "" #: C/glom.xml:496(para) msgid "To specify details for the parts, such as the text or image to display, or to choose the field to display, select the part in the Parts list and click the Edit button. You may also specify field formatting by clicking the Formatting button, just as you would when defining a details or list layout." msgstr "" #: C/glom.xml:506(phrase) #: C/glom.xml:523(phrase) msgid "Editing a report." msgstr "" #: C/glom.xml:512(para) msgid "Some parts may contain other parts and have extra properties to control how they present their child parts. For instance, the Group By part groups records together by a field. For instance, a products report might group a list of products by product type. You can even add a second sub-grouping inside the main Group By part, by selecting your top-level Group By part in the Parts list while adding a new Group By part from the Available Parts list. For instance, you might group your products by manufacturer, inside each product type group." msgstr "" #: C/glom.xml:513(para) msgid "To specify the field by which the records should be grouped, select your Group By part in the Parts list and click the Edit button. You can then choose the field by which the records should be grouped, and select the fields by which these records should be sorted within the group. You may also specify some additional fields to be displayed in the group's title row. For instance, you might want to group products by a manufacturer ID, but also show the manufacturer name." msgstr "" #: C/glom.xml:516(title) msgid "Editing a Group By Part" msgstr "" #: C/glom.xml:529(para) msgid "The Vertical Group part may contain other items. For instance, it allows you to arrange fields below each other instead of just one after the other in the horizontal row. This is useful for grouping related fields such as address lines, or just to squeeze more information into the records's row on the report." msgstr "" #: C/glom.xml:532(title) msgid "A Report with Vertical Groups" msgstr "" #: C/glom.xml:539(phrase) msgid "A Report with Vertical Groups." msgstr "" #: C/glom.xml:545(para) msgid "When you have finished, click the Close button to save the report's definition. Your report can then be chosen from the Reports menu. See the Printing Reports section for more details." msgstr "" #: C/glom.xml:559(title) msgid "Dialogs" msgstr "" #: C/glom.xml:562(title) msgid "Dialog: Initial dialog" msgstr "" #: C/glom.xml:563(para) msgid "This dialog allows the user to choose an existing document or create a new document. Existing documents may be selecting from the list of recently opened documents or by select a file with the file chooser dialog. Documents can also be opened via the network if other users are running Glom on the local network. Finally, a new document can be created either by opening a template file which already contains some initial tables and records, or by creating an empty document." msgstr "" #: C/glom.xml:567(title) msgid "Dialog: New database" msgstr "" #: C/glom.xml:572(title) msgid "Dialog: Create database" msgstr "" #: C/glom.xml:577(title) msgid "Dialog: Connection" msgstr "" #: C/glom.xml:578(para) msgid "This dialog requests a user name and password for connection to a database server. This is usually not the same username and password combination with which you log in to your system. All Glom systems require a database server on which the actual data will be stored. If the database server is not running on your local computer (\"localhost\"), then you must also provide its network hostname, such as \"glomserver.openismus.com\", though your hostname will be different." msgstr "" #: C/glom.xml:579(para) msgid "Your system administrator can provide these database login details." msgstr "" #: C/glom.xml:580(para) msgid "If you are the system administrator, see Glom's Postgres Configuration web page for help with installing and configuring a database server." msgstr "" #: C/glom.xml:584(title) msgid "Dialog: Connection Error" msgstr "" #: C/glom.xml:585(para) msgid "This dialog is shown when Glom could not connect to the specified database server. Either the database server is not running at the specified hostname, or the user name and password were not accepted by the database server. See the Connection Dialog section for more details." msgstr "" #: C/glom.xml:591(title) msgid "Dialog: Database preferences" msgstr "" #: C/glom.xml:596(title) msgid "Dialog: Change language" msgstr "" #: C/glom.xml:601(title) msgid "Window: Textobject" msgstr "" #: C/glom.xml:606(title) msgid "Window: Imageobject" msgstr "" #: C/glom.xml:611(title) msgid "Dialog: Notebook" msgstr "" #: C/glom.xml:616(title) msgid "Dialog: Data invalid format" msgstr "" #: C/glom.xml:621(title) msgid "Dialog: Relationship overview" msgstr "" #: C/glom.xml:626(title) msgid "Window: Groups" msgstr "" #: C/glom.xml:631(title) msgid "Dialog: Group by sort fields" msgstr "" #: C/glom.xml:636(title) msgid "Dialog: Group by secondary fields" msgstr "" #: C/glom.xml:641(title) msgid "Window: Button script" msgstr "" #: C/glom.xml:646(title) msgid "Window: Field calculation" msgstr "" #: C/glom.xml:651(title) msgid "Dialog: New group" msgstr "" #: C/glom.xml:656(title) msgid "Dialog: Choose user" msgstr "" #: C/glom.xml:661(title) msgid "Dialog: User" msgstr "" #: C/glom.xml:666(title) msgid "Dialog: Translation identify original" msgstr "" #: C/glom.xml:671(title) msgid "Dialog: Translation copy" msgstr "" #: C/glom.xml:676(title) msgid "Dialog: Choose Date" msgstr "" #: C/glom.xml:681(title) msgid "Dialog: Import Into Table" msgstr "" #: C/glom.xml:682(para) msgid "This dialog allows the user to import a CSV (comma separated value) file into the current database table. It shows the first few rows of the file to import and allows the user to select the target field in the database for each column in the CSV file. For auto-incremented primary keys, the primary key field cannot be used as a target field, but otherwise one column must be imported into the primary key field." msgstr "" #: C/glom.xml:705(title) msgid "About Glom" msgstr "" #: C/glom.xml:706(para) msgid "Glom is maintained by Glom and GNOME community volunteers. To find more information about Glom, please visit the Glom Web site." msgstr "" #: C/glom.xml:711(para) msgid "To report a bug or make a suggestion regarding this application or this manual, you can submit them using bugzilla." msgstr "" #: C/glom.xml:717(para) msgid "Another excellent source of information are the Glom mailing lists." msgstr "" #: C/glom.xml:722(para) msgid "This program is distributed under the terms of the GNU General Public license as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of this license can be found at this link, or in the file COPYING included with the source code of this program." msgstr "" #: C/glom.xml:731(title) msgid "Concepts" msgstr "" #: C/glom.xml:734(simpara) msgid "Database: Each Glom document allows access to one database." msgstr "" #: C/glom.xml:735(simpara) msgid "Table: Each database contains several tables, such as \"Customers\" and \"Invoices\" tables." msgstr "" #: C/glom.xml:736(simpara) msgid "Field: Each table has several fields, such as \"Customer ID\", \"First Name\", and \"Date of Birth\" fields. In other documents and applications, fields are sometimes called \"Columns\"" msgstr "" #: C/glom.xml:737(simpara) msgid "Records: Each table contains several records, each of which has values for each of the fields. For instance, the \"Customers\" table will have a record for each customer. In other documents and applications, records are sometimes called Rows." msgstr "" #: C/glom.xml:738(simpara) msgid "Relationships: Each table might be related to other tables, via fields in both tables. For instance, a \"Customers\" table could have a relationship to the \"Invoices\" table, so that people could see all the invoices for that customer. Only developers need to understand this concept. In other documents and applications, relationships are sometimes called \"Joins\"." msgstr "" #: C/glom.xml:732(para) msgid "Glom is easy to use, but you must understand the following basic concepts. " msgstr "" #: C/glom.xml:744(title) msgid "Calculated fields and button scripts" msgstr "" #: C/glom.xml:745(para) msgid "Calculated fields and button scripts use the Python programming language. The calculation or script is the implementation of a function whose signature is provided for you." msgstr "" #: C/glom.xml:748(title) msgid "Editing the definition of a calculated field" msgstr "" #: C/glom.xml:755(phrase) msgid "Editing the definition of a calculated field." msgstr "" #: C/glom.xml:762(title) msgid "Field values" msgstr "" #: C/glom.xml:763(programlisting) #, no-wrap msgid "record[\"name_first\"]" msgstr "" #: C/glom.xml:763(para) msgid "For instance, is the value of the name_first field in the current record." msgstr "" #: C/glom.xml:767(title) msgid "Related Records" msgstr "" #: C/glom.xml:768(programlisting) #, no-wrap msgid "record.related[\"location\"]" msgstr "" #: C/glom.xml:768(para) msgid "For instance, provides the related records for the current record." msgstr "" #: C/glom.xml:771(title) msgid "Single related records" msgstr "" #: C/glom.xml:772(programlisting) #, no-wrap msgid "record.related[\"location\"][\"name\"]" msgstr "" #: C/glom.xml:772(para) msgid "For relationships that specify a single record, you can get the value of a field in that record. For instance, is the value of the name field in the table indicated by the location relationship (often called location::name)." msgstr "" #: C/glom.xml:776(title) msgid "Multiple related records" msgstr "" #: C/glom.xml:777(programlisting) #, no-wrap msgid "record.related[\"invoice_lines\"].sum(\"total_price\")" msgstr "" #: C/glom.xml:777(para) msgid "For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance, ." msgstr "" #: C/glom.xml:783(title) msgid "Testing for empty values" msgstr "" #: C/glom.xml:784(para) msgid "How you test for empty values depends on the type of field:" msgstr "" #: C/glom.xml:789(title) msgid "Non-text fields" msgstr "" #: C/glom.xml:790(para) msgid "Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0." msgstr "" #: C/glom.xml:791(para) msgid "You can test whether a field is empty by using Python's None. For instance:" msgstr "" #: C/glom.xml:793(programlisting) #, no-wrap msgid "" "\n" " if(record[\"contact_id\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" #: C/glom.xml:800(para) msgid "You might also test whether there are any related records. For instance:" msgstr "" #: C/glom.xml:802(programlisting) #, no-wrap msgid "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" #: C/glom.xml:812(title) msgid "Text fields" msgstr "" #: C/glom.xml:813(para) msgid "For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance:" msgstr "" #: C/glom.xml:815(programlisting) #, no-wrap msgid "" "\n" " if(record[\"name_full\"] == \"\"):\n" " return \"No Name\"\n" " else:\n" " return record[\"name_full\"]\n" " " msgstr "" #: C/glom.xml:827(title) msgid "Using the full pygda API" msgstr "" #: C/glom.xml:828(para) msgid "pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the current database directly. This allows you to run any SQL query, for instance to read data from the database with a SELECT, or to change values in the database with an UPDATE. Note that the connection is already open so you can avoid the difficult work of specifying the connection details." msgstr "" #: C/glom.xml:829(para) msgid "The record's table_name attribute also provides the name of the current table." msgstr "" #: C/glom.xml:830(para) msgid "This example reads all data from the current table and prints the values to the terminal:" msgstr "" #: C/glom.xml:832(programlisting) #, no-wrap msgid "" "\n" "# Use the current database's connection \n" "# to get all the data for the current table.\n" "#\n" "# record.connection is an already-open gda.connection object,\n" "# saving us the bother of opening the connection,\n" "# or even knowing the name of the database.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "data_model = gda.gda_execute_select_command(record.connection, query)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Number of columns: \", columns\n" "\n" "for i in range(columns):\n" " print \" column \", i;\n" " print \" name=\", data_model.get_column_title(i)\n" "\n" " # Find out whether it's the primary key:\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (primary key)\"\n" "\n" " print \"\\n" "\";\n" " \n" "print \" Number of rows: \", rows\n" "\n" "for row_index in range(rows):\n" " print \" row \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" value=\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n" "\";\n" " " msgstr "" #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/glom.xml:0(None) msgid "translator-credits" msgstr "" glom-1.22.4/docs/user-guide/sl/legal.xml0000644000175000017500000000773212235000130021204 0ustar00murraycmurrayc00000000000000 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. glom-1.22.4/docs/user-guide/sl/glom.xml0000644000175000017500000013247612235000130021062 0ustar00murraycmurrayc00000000000000 ]>
Glom User Guide V0.2 for Glom v1.6 2004 Murray Cumming Glom Development Team Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. Murray Cumming Glom Development Team
murrayc@murrayc.com
Glom 1.6 20 June 2004 Murray Cumming Murray Cumming This manual describes version 1.6 of Glom Odziv To report a bug or make a suggestion regarding the Glom or this manual can be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla before submitting your bug to ensure that yours hasn't already been reported. User manual for Glom.
MY-GNOME-APP mygnomeapp Uvod Glom allows you to design and use database systems. Getting Started Starting Glom You can start Glom in the following ways: Applications menu Choose Office Glom . When You Start Glom When you start Glom, the following window is displayed. You may open an existing Glom file or create a new one, possibly basing a new Glom file on one of the examples.
Glom Start Up Window, Opening an Existing File Shows Glom main window used to open an existing Glom file.
Glom Start Up Window, Creating a New File Shows Glom main window used to create a new Glom file.
Using Glom as an Operator To open an existing Glom document, either open that document from the File Manager, or choose Glom from the Applications menu, and then choose the document when asked. Glom will ask you for a user name and password to access the database. Your administrator will provide your user name and password. When you open an existing document, Glom will be in Operator user level. This user level allows you to find and edit records, but does not allow you to change the fundamental structure of the database. Navigation Each database has several tables. To look at a different table, choose Tables from the Navigate menu. Then double-click on the table, or select it and click the Open button.
Navigating to a Table Navigating to a Table.
Viewing and Entering Data When in Data Mode, you can view or enter information in either the List or Details view. The List View The List view shows many records at once and usually shows only the most important fields. When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you. To create a new record just click the New button, or start typing into a field in the last empty row. A new record row will be created with blank fields for you to fill in.
The List View The List View.
To sort the records just click on a column header. For instance, you could might click on a date column to list invoices in order of their date, and click again to list them in reverse order.
The Details View The details view shows only one record and usually shows all the fields arranged suitably. When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you. To create a new record just click the New button. A new record will be created with blank fields for you to fill in.
The Details View The Details View.
Finding Data Choose Find Mode from the Mode menu. The fields in the List and Details views will now be empty, and a Find button will appear at the bottom of the window. Enter information, or part of the information, into a field to find records with that information in that field. For instance, enter Jim into a name field to find records with "Jim" or "Jimmy" in the name. When you press the Find button, Glom will search for records and then display them. If only one record is found then it will show you that record in the Details view. If several records are found then it will show you those records in the List view. Printing Reports If your database developer has defined some reports for a table then you will seem them listed in the Reports menu. Just choose the report from the menu to create the report. If you have previously performed a search then the report will contain only the currently-found data. Otherwise it will contain all data in the current report. Remember that each table has its own reports so you may need to switch to the relevant table to use a particular report.
A report A report.
Using Glom as a Developer When you create a new document, Glom will be in the Developer user level. You can also change to the Developer user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it. Adding Tables You can see the list of existing tables by choosing Tables from the Navigate menu. You will also see this window after connecting to a database server, after creating a new document. To create a new table, click the Add button and enter the name for the new table. Glom will suggest a human-readable title for this table. Operators will see this title instead of the actual table name. You can also mark a tables as hidden from Operators. For instance, Operators should see "Invoice Lines" as related records from the "Invoices" table, but they should never be able to navigate directly to the "Invoice Lines" table. You can also specify one table as the default table. This table will be shown whenever an operator opens an existing document, without asking him to select a table from the list. You can also use this window to rename an existing table. Click the Open button to look at the selected table. Editing Fields Choose Fields from the Developer menu. This shows the list of fields in the table. New tables automatically have a primary key field, but you can change this field if necessary. Click the Add button to add a new field, then enter the name of the new field. Glom will guess an appropriate human-readable title for this field, but you can edit this. Operators will see this title instead of the actual field name. To specify more field details, select the field and click the Details button.
Editing Fields Editing the table's fields.
Primary Keys Each table must have one, and only one, Primary Key. The value in this field will be unique, meaning that each value in this field will appear in only one record in the table. For instance, each record in a "Customers" table would have a "Customer ID". This value will be used to refer to that customer from other tables, such as "Projects" and "Invoices" records. See the Creating Relationships section to see how you can relate tables together. Field Types Glom offers a few simple field types: Number Text Date Time Boolean - either true or false Image Calculated Fields Field values can be calculated in terms of other fields, using the Python programming language. This calculation should be the implementation of a python function, which should return a value. The return value will be used as the value of the field. This value will be recalculated every time one of the source fields changes. TODO: This only works for default values at the moment, and you can not use field values in the calculation yet. You can also use calculations to specify a default value for fields, by selecting the Default Value tab in the Field Details window, clicking on the Calculate Value check box, and then entering a Python calculation. You can test this calculation in the Edit window.
Arranging Layouts Each table has List and Details views, and by default these show all fields in the table, in order of creation. You can edit the layout by choosing Layout from the Developer menu. Arranging the List View For the List view, you can specify the sequence of field columns, and whether some fields are hidden.
Editing the List Layout Editing the list layout.
Arranging the Details View For the Details view, you can create groups of fields, and give these groups titles. You can then place fields in these groups and specify the sequence fo fields in these groups. You can also specify the sequence of these groups. For instance, in a "Contacts" table, you might create a "Name" group, and place the "title", "first_name" and "last_name" fields in that group. You might have other groups for the "Address" fields.
Editing the details Layout Editing the Details Layout.
Creating Relationships Tables in the Database are often related together. For instance, an "Invoices" table might have a "Customer ID" field. A value in this field would specify a record in the "Customers" table with the same value. Glom can show extra information, such as the customer name, from that related record. Or it can show a list of several related records - for instance, several related "Invoice Lines" that are related to a record in the "Invoice" record. To create relationships, choose Relationships from the Developer menu. This will show the list of existing relationships. Click the Add button to create a new relationship, and enter a name for it. You should then choose a field in the current table, and a field in another table to which it should be related. This relationship will find any records in the other table for which the values in both fields are equal. You can use the relationship in the following places. To show a related field on the List or Details view. To show a list of related records on the Details view. To lookup a value from a field in a related record. For instance, to copy the current price of a "Product" into the "Price" field of an "Invoice Line" record. To calculate a field value. Users Administration To define the Operators who can use your database, and to specify what access they have to the various tables, choose Users from the Developer menu. Translations Glom's user interface (and this document) is translated into several languages, as you should see already if you are using your computer with a non-English user interface. In addition, Glom automatically shows and understands numbers and dates according to the current user's local conventions. For instance, a user in the USA might enter a price as 1.99 and a date as 1/13/2008, but a German user of the same database will later see that as 1,99 and 13.1.2008. However, the Glom system that you create also contains text that must be translated if it will be used by people who speak different languages. For instance, you must provide translations for the titles of your tables, fields, and reports. All of these text items can be seen in a list when you choose Translations from the Developer menu. In this window you can specify the language that you used for the original text, and enter translations for each text item for additional languages. When the Glom system is opened by a user of that language then these text items will be shown in the user interface.
Translations Translations.
Experienced translators may be more familiar with the .po file format, or you might wish to use the many tools that work with the .po file format. By using the Export button you can create a .po file to use in a separate tool or to send to a translator. You can then import the resulting translation by using the Import button.
Defining Reports Adding or Editing Reports Glom can produce reports to show specific fields for sets of records, sorted and grouped. For instance, a shop might need a report listing all products sold in one month, grouped by product type, and sorted by price inside each group. Each table has its own reports, which are available to the operator from the Reports menu. To define a report, or to change the definition of an existing report, choose Reports from the Developer menu.
Creating or Editing Reports Creating or editing reports.
Notice that each report has an ID as well as a human-readable name. This allows your report to have a translated title when used on a computer that uses a different language.
Editing a Report A Glom report has three areas: The Header, which appears at the start of the report The Main area, in which the records and summary lines are shown, with the actual data from the database. The Footer, which appears at the end of the report. Inside an area, such as the Main part, you may add report Parts, such as fields, text, or images. These will usually appear in a row on the printed report, with one row for each record. In the simple case, this will look much like Glom's list view. You can add parts to your report by selecting them from the Available Parts list and then clicking the Add button. The part will then be added to the Parts list, in the selected area. To specify details for the parts, such as the text or image to display, or to choose the field to display, select the part in the Parts list and click the Edit button. You may also specify field formatting by clicking the Formatting button, just as you would when defining a details or list layout.
Editing a Report Editing a report.
Some parts may contain other parts and have extra properties to control how they present their child parts. For instance, the Group By part groups records together by a field. For instance, a products report might group a list of products by product type. You can even add a second sub-grouping inside the main Group By part, by selecting your top-level Group By part in the Parts list while adding a new Group By part from the Available Parts list. For instance, you might group your products by manufacturer, inside each product type group. To specify the field by which the records should be grouped, select your Group By part in the Parts list and click the Edit button. You can then choose the field by which the records should be grouped, and select the fields by which these records should be sorted within the group. You may also specify some additional fields to be displayed in the group's title row. For instance, you might want to group products by a manufacturer ID, but also show the manufacturer name.
Editing a Group By Part Editing a report.
The Vertical Group part may contain other items. For instance, it allows you to arrange fields below each other instead of just one after the other in the horizontal row. This is useful for grouping related fields such as address lines, or just to squeeze more information into the records's row on the report.
A Report with Vertical Groups A Report with Vertical Groups.
When you have finished, click the Close button to save the report's definition. Your report can then be chosen from the Reports menu. See the Printing Reports section for more details.
Dialogs Dialog: Initial dialog This dialog allows the user to choose an existing document or create a new document. Existing documents may be selecting from the list of recently opened documents or by select a file with the file chooser dialog. Documents can also be opened via the network if other users are running Glom on the local network. Finally, a new document can be created either by opening a template file which already contains some initial tables and records, or by creating an empty document. Dialog: New database Dialog: Create database Dialog: Connection This dialog requests a user name and password for connection to a database server. This is usually not the same username and password combination with which you log in to your system. All Glom systems require a database server on which the actual data will be stored. If the database server is not running on your local computer ("localhost"), then you must also provide its network hostname, such as "glomserver.openismus.com", though your hostname will be different. Your system administrator can provide these database login details. If you are the system administrator, see Glom's Postgres Configuration web page for help with installing and configuring a database server. Dialog: Connection Error This dialog is shown when Glom could not connect to the specified database server. Either the database server is not running at the specified hostname, or the user name and password were not accepted by the database server. See the Connection Dialog section for more details. Dialog: Database preferences Dialog: Change language Window: Textobject Window: Imageobject Dialog: Notebook Dialog: Data invalid format Dialog: Relationship overview Window: Groups Dialog: Group by sort fields Dialog: Group by secondary fields Window: Button script Window: Field calculation Dialog: New group Dialog: Choose user Dialog: User Dialog: Translation identify original Dialog: Translation copy Dialog: Choose Date Dialog: Import Into Table This dialog allows the user to import a CSV (comma separated value) file into the current database table. It shows the first few rows of the file to import and allows the user to select the target field in the database for each column in the CSV file. For auto-incremented primary keys, the primary key field cannot be used as a target field, but otherwise one column must be imported into the primary key field. About Glom Glom is maintained by Glom and GNOME community volunteers. To find more information about Glom, please visit the Glom Web site. To report a bug or make a suggestion regarding this application or this manual, you can submit them using bugzilla. Another excellent source of information are the Glom mailing lists. This program is distributed under the terms of the GNU General Public license as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of this license can be found at this link, or in the file COPYING included with the source code of this program. Concepts Glom is easy to use, but you must understand the following basic concepts. Database: Each Glom document allows access to one database. Table: Each database contains several tables, such as "Customers" and "Invoices" tables. Field: Each table has several fields, such as "Customer ID", "First Name", and "Date of Birth" fields. In other documents and applications, fields are sometimes called "Columns" Records: Each table contains several records, each of which has values for each of the fields. For instance, the "Customers" table will have a record for each customer. In other documents and applications, records are sometimes called Rows. Relationships: Each table might be related to other tables, via fields in both tables. For instance, a "Customers" table could have a relationship to the "Invoices" table, so that people could see all the invoices for that customer. Only developers need to understand this concept. In other documents and applications, relationships are sometimes called "Joins". Calculated fields and button scripts Calculated fields and button scripts use the Python programming language. The calculation or script is the implementation of a function whose signature is provided for you.
Editing the definition of a calculated field Editing the definition of a calculated field.
Field values For instance, record["name_first"] is the value of the name_first field in the current record. Related Records For instance, record.related["location"] provides the related records for the current record. Single related records For relationships that specify a single record, you can get the value of a field in that record. For instance, record.related["location"]["name"] is the value of the name field in the table indicated by the location relationship (often called location::name). Multiple related records For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance, record.related["invoice_lines"].sum("total_price"). Testing for empty values How you test for empty values depends on the type of field: Non-text fields Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0. You can test whether a field is empty by using Python's None. For instance: if(record["contact_id"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] You might also test whether there are any related records. For instance: if(record.related["contacts"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] Text fields For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance: if(record["name_full"] == ""): return "No Name" else: return record["name_full"] Using the full pygda API pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the current database directly. This allows you to run any SQL query, for instance to read data from the database with a SELECT, or to change values in the database with an UPDATE. Note that the connection is already open so you can avoid the difficult work of specifying the connection details. The record's table_name attribute also provides the name of the current table. This example reads all data from the current table and prints the values to the terminal: # Use the current database's connection # to get all the data for the current table. # # record.connection is an already-open gda.connection object, # saving us the bother of opening the connection, # or even knowing the name of the database. query = "SELECT * FROM %s" % record.table_name data_model = gda.gda_execute_select_command(record.connection, query) rows = data_model.get_n_rows() columns = data_model.get_n_columns() print " Number of columns: ", columns for i in range(columns): print " column ", i; print " name=", data_model.get_column_title(i) # Find out whether it's the primary key: field = data_model.describe_column(i) if field.get_primary_key(): print " (primary key)" print "\n"; print " Number of rows: ", rows for row_index in range(rows): print " row ", row_index; for col_index in range(columns): print " value=", data_model.get_value_at(col_index, row_index).get() print "\n";
glom-1.22.4/docs/user-guide/en_GB/0000755000175000017500000000000012235000130017721 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/en_GB/en_GB.po0000644000175000017500000013711012235000130021236 0ustar00murraycmurrayc00000000000000msgid "" msgstr "" "Project-Id-Version: glom-docs\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-04-22 07:18+0100\n" "PO-Revision-Date: 2007-05-16 07:13-0000\n" "Last-Translator: David Lodge \n" "Language-Team: en_GB \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: C/legal.xml:2(para) #: C/glom.xml:2(para) msgid "Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual." msgstr "Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation Licence (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual." #: C/legal.xml:12(para) #: C/glom.xml:12(para) msgid "This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license." msgstr "This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the licence to the manual, as described in section 6 of the licence." #: C/legal.xml:19(para) #: C/glom.xml:19(para) msgid "Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters." msgstr "Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters." #: C/legal.xml:35(para) #: C/glom.xml:35(para) msgid "DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND" msgstr "DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENCE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORISED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND" #: C/legal.xml:55(para) #: C/glom.xml:55(para) msgid "UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES." msgstr "UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES." #: C/legal.xml:28(para) #: C/glom.xml:28(para) msgid "DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: " msgstr "DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENCE WITH THE FURTHER UNDERSTANDING THAT: " #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:180(None) msgid "@@image: 'figures/start.png'; md5=b8c9acc03f9f1cdb213e37c9da91817a" msgstr "@@image: 'figures/start.png'; md5=b8c9acc03f9f1cdb213e37c9da91817a" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:248(None) msgid "@@image: 'figures/glom_design_fields.png'; md5=e7137a37c7c74a96a914b0df777f5f6b" msgstr "@@image: 'figures/glom_design_fields.png'; md5=e7137a37c7c74a96a914b0df777f5f6b" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:503(None) msgid "@@image: 'figures/glom_design_fields_dialog_calculated.png'; md5=3306db510932ab3bb99f7e1c676b2512" msgstr "@@image: 'figures/glom_design_fields_dialog_calculated.png'; md5=3306db510932ab3bb99f7e1c676b2512" #: C/glom.xml:28(title) msgid "Glom User Guide V0.1" msgstr "Glom User Guide V0.1" #: C/glom.xml:29(subtitle) msgid "for Glom v0.8" msgstr "for Glom v0.8" #: C/glom.xml:32(year) msgid "2004" msgstr "2004" #: C/glom.xml:33(holder) #: C/glom.xml:99(para) #: C/glom.xml:100(para) msgid "Murray Cumming" msgstr "Murray Cumming" #: C/glom.xml:47(publishername) #: C/glom.xml:60(orgname) msgid "Glom Development Team" msgstr "Glom Development Team" #: C/glom.xml:57(firstname) msgid "Murrayc" msgstr "Murrayc" #: C/glom.xml:58(surname) msgid "Cumming" msgstr "Cumming" #: C/glom.xml:61(email) msgid "murrayc@murrayc.com" msgstr "murrayc@murrayc.com" #: C/glom.xml:96(revnumber) msgid "Glom 0.8" msgstr "Glom 0.8" #: C/glom.xml:97(date) msgid "20 June 2004" msgstr "20 June 2004" #: C/glom.xml:105(releaseinfo) msgid "This manual describes version 0.8 of Glom" msgstr "This manual describes version 0.8 of Glom" #: C/glom.xml:108(title) msgid "Feedback" msgstr "Feedback" #: C/glom.xml:109(para) msgid "To report a bug or make a suggestion regarding the Glom or this manual can be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla before submitting your bug to ensure that yours hasn't already been reported." msgstr "To report a bug or make a suggestion regarding the Glom or this manual can be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla before submitting your bug to ensure that yours hasn't already been reported." #: C/glom.xml:119(para) msgid "User manual for Glom." msgstr "User manual for Glom." #: C/glom.xml:124(primary) msgid "MY-GNOME-APP" msgstr "MY-GNOME-APP" #: C/glom.xml:127(primary) msgid "mygnomeapp" msgstr "mygnomeapp" #: C/glom.xml:135(title) msgid "Introduction" msgstr "Introduction" #: C/glom.xml:136(para) msgid "Glom allows you to design and use database systems." msgstr "Glom allows you to design and use database systems." #: C/glom.xml:149(title) msgid "Getting Started" msgstr "Getting Started" #: C/glom.xml:152(title) msgid "Starting Glom" msgstr "Starting Glom" #: C/glom.xml:153(para) msgid "You can start Glom in the following ways:" msgstr "You can start Glom in the following ways:" #: C/glom.xml:157(term) msgid "Applications menu" msgstr "Applications menu" #: C/glom.xml:159(para) msgid "Choose OfficeGlom." msgstr "Choose OfficeGlom." #: C/glom.xml:170(title) msgid "When You Start Glom" msgstr "When You Start Glom" #: C/glom.xml:171(para) msgid "When you start Glom, the following window is displayed." msgstr "When you start Glom, the following window is displayed." #: C/glom.xml:176(title) msgid "Glom Start Up Window" msgstr "Glom Start Up Window" #: C/glom.xml:183(phrase) msgid "Shows Glom main window." msgstr "Shows Glom main window." #: C/glom.xml:198(title) msgid "Using Glom as an Operator" msgstr "Using Glom as an Operator" #: C/glom.xml:199(para) msgid "To open an existing glom document, either open that document from the File Manager, or choose Glom from the Applications menu, and then choose the document when asked. Glom will ask you for a user name and password to access the database. Your administrator will provide your user name and password." msgstr "To open an existing glom document, either open that document from the File Manager, or choose Glom from the Applications menu, and then choose the document when asked. Glom will ask you for a user name and password to access the database. Your administrator will provide your user name and password." #: C/glom.xml:201(para) msgid "When you open an existing document, Glom will be in Operatoruser level. This user level allows you to find and edit records, but does not allow you to change the fundamental structure of the database." msgstr "When you open an existing document, Glom will be in Operatoruser level. This user level allows you to find and edit records, but does not allow you to change the fundamental structure of the database." #: C/glom.xml:204(title) msgid "Navigation" msgstr "Navigation" #: C/glom.xml:205(para) msgid "Each database has several tables. To look at a different table, choose Table from the Navigate menu. Then double-click on the table, or select it and click the Open button." msgstr "Each database has several tables. To look at a different table, choose Table from the Navigate menu. Then double-click on the table, or select it and click the Open button." #: C/glom.xml:209(title) msgid "Entering Data" msgstr "Entering Data" #: C/glom.xml:210(para) msgid "When in Data Mode, you can enter information into either the List or Details view. The List view shows many records at once, but does not show every field. The details view shows only one record, and shows all the fields arranged suitably." msgstr "When in Data Mode, you can enter information into either the List or Details view. The List view shows many records at once, but does not show every field. The details view shows only one record, and shows all the fields arranged suitably." #: C/glom.xml:211(para) msgid "When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you." msgstr "When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you." #: C/glom.xml:212(para) msgid "To create a new record just click the New button. A new record will be created with blank fields for you to fill in." msgstr "To create a new record just click the New button. A new record will be created with blank fields for you to fill in." #: C/glom.xml:216(title) msgid "Finding Data" msgstr "Finding Data" #: C/glom.xml:217(para) msgid "Choose Find Mode from the Mode menu. The fields in the List and Details views will now be empty, and a Find button will appear at the bottom of the window." msgstr "Choose Find Mode from the Mode menu. The fields in the List and Details views will now be empty, and a Find button will appear at the bottom of the window." #: C/glom.xml:218(para) msgid "Enter information, or part of the information, into a field to find records with that information in that field. For instance, enter Jim into a name field to find records with \"Jim\" or \"Jimmy\" in the name." msgstr "Enter information, or part of the information, into a field to find records with that information in that field. For instance, enter Jim into a name field to find records with \"Jim\" or \"Jimmy\" in the name." #: C/glom.xml:219(para) msgid "When you press the Find button, glom will search for records and then display them. If only one record is found then it will show you that record in the Details view. If several records are found then it will show you those records in the List view." msgstr "When you press the Find button, glom will search for records and then display them. If only one record is found then it will show you that record in the Details view. If several records are found then it will show you those records in the List view." #: C/glom.xml:226(title) msgid "Using Glom as a Developer" msgstr "Using Glom as a Developer" #: C/glom.xml:227(para) msgid "When you create a new document, Glom will be in the Developeruser level. You can also change to the Developer user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it." msgstr "When you create a new document, Glom will be in the Developeruser level. You can also change to the Developer user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it." #: C/glom.xml:230(title) msgid "Adding Tables" msgstr "Adding Tables" #: C/glom.xml:231(para) msgid "You can see the list of existing tables by choosing Table from the Navigate menu. You will also see this window after connecting to a database server, after creating a new document. To create a new table, click the Add button and enter the name for the new table. This name should not contain any spaces or special characters. Glom will suggest a human-readable title for this table. Operators will see this title instead of the actual table name. You can also marka a tables as hidden from Operators. For instance, Operators should see \"Invoice Lines\" as related records from the \"Invoices\" table, but they should never be able to navigate directly to the \"Invoice Lines\" table." msgstr "You can see the list of existing tables by choosing Table from the Navigate menu. You will also see this window after connecting to a database server, after creating a new document. To create a new table, click the Add button and enter the name for the new table. This name should not contain any spaces or special characters. Glom will suggest a human-readable title for this table. Operators will see this title instead of the actual table name. You can also mark tables as hidden from Operators. For instance, Operators should see \"Invoice Lines\" as related records from the \"Invoices\" table, but they should never be able to navigate directly to the \"Invoice Lines\" table." #: C/glom.xml:232(para) msgid "You can also specify one table as the default table. This table will be shown whenever an operator opens an existing document, without asking him to select a table from the list." msgstr "You can also specify one table as the default table. This table will be shown whenever an operator opens an existing document, without asking him to select a table from the list." #: C/glom.xml:233(para) msgid "You can also use this window to rename an existing table." msgstr "You can also use this window to rename an existing table." #: C/glom.xml:234(para) msgid "Click the Open button to look at the selected table." msgstr "Click the Open button to look at the selected table." #: C/glom.xml:238(title) #: C/glom.xml:244(title) msgid "Editing Fields" msgstr "Editing Fields" #: C/glom.xml:239(para) msgid "Choose Fields from the Developer menu. This shows the list of fields in the table. New tables automatically have a primary key field, but you can change this field if necessary." msgstr "Choose Fields from the Developer menu. This shows the list of fields in the table. New tables automatically have a primary key field, but you can change this field if necessary." #: C/glom.xml:240(para) msgid "Click the Add button to add a new field, then enter the name of the new field. The name should not contain spaces or special characters. Glom will guess an appropriate human-readable title for this field, but you can edit this. Operators will see this title instead of the actual field name." msgstr "Click the Add button to add a new field, then enter the name of the new field. The name should not contain spaces or special characters. Glom will guess an appropriate human-readable title for this field, but you can edit this. Operators will see this title instead of the actual field name." #: C/glom.xml:241(para) msgid "To specify more field details, select the field and click the Details button." msgstr "To specify more field details, select the field and click the Details button." #: C/glom.xml:251(phrase) msgid "Editing the table's fields." msgstr "Editing the table's fields." #: C/glom.xml:260(title) msgid "Primary Keys" msgstr "Primary Keys" #: C/glom.xml:261(para) msgid "Each table must have one, and only one, Primary Key. The value in this field will be unique, meaning that each value in this field will appear in only one record in the table. For instance, each record in a \"Customers\" table would have a \"Customer ID\". This value will be used to refer to that customer from other tables, such as \"Projects\" and \"Invoices\" records. See the Creating Relationships section to see how you can relate tables together." msgstr "Each table must have one, and only one, Primary Key. The value in this field will be unique, meaning that each value in this field will appear in only one record in the table. For instance, each record in a \"Customers\" table would have a \"Customer ID\". This value will be used to refer to that customer from other tables, such as \"Projects\" and \"Invoices\" records. See the Creating Relationships section to see how you can relate tables together." #: C/glom.xml:265(title) msgid "Field Types" msgstr "Field Types" #: C/glom.xml:268(simpara) msgid "Number" msgstr "Number" #: C/glom.xml:269(simpara) msgid "Text" msgstr "Text" #: C/glom.xml:270(simpara) msgid "Date" msgstr "Date" #: C/glom.xml:271(simpara) msgid "Time" msgstr "Time" #: C/glom.xml:272(simpara) msgid "Boolean - either true or false" msgstr "Boolean - either true or false" #: C/glom.xml:273(simpara) msgid "Image" msgstr "Image" #: C/glom.xml:266(para) msgid "Glom offers a few simple field types: " msgstr "Glom offers a few simple field types: " #: C/glom.xml:279(title) msgid "Calculated Fields" msgstr "Calculated Fields" #: C/glom.xml:280(para) msgid "Field values can be calculated in terms of other fields, using the Python programming language. This calculation should be the implementation of a python function, which should return a value. The return value will be used as the value of the field. This value will be recalculated every time one of the source fields changes. TODO: This only works for default values at the moment, and you can not use field values in the calculation yet." msgstr "Field values can be calculated in terms of other fields, using the Python programming language. This calculation should be the implementation of a python function, which should return a value. The return value will be used as the value of the field. This value will be recalculated every time one of the source fields changes. TODO: This only works for default values at the moment, and you can not use field values in the calculation yet." #: C/glom.xml:281(para) msgid "You can also use calculations to specify a default value for fields, by selecting the Default Value tab in the Field Details window, clicking on the Calculate Value check box, and then entering a Python calculation. You can test this calculation in the Edit window." msgstr "You can also use calculations to specify a default value for fields, by selecting the Default Value tab in the Field Details window, clicking on the Calculate Value check box, and then entering a Python calculation. You can test this calculation in the Edit window." #: C/glom.xml:287(title) msgid "Arranging Layouts" msgstr "Arranging Layouts" #: C/glom.xml:288(para) msgid "Each table has List and Details views, and by default these show all fields in the table, in order of creation. You can edit the layout by choosing Layout from the Developer menu." msgstr "Each table has List and Details views, and by default these show all fields in the table, in order of creation. You can edit the layout by choosing Layout from the Developer menu." #: C/glom.xml:289(para) msgid "For the List view, you can specify the sequence of field columns, and whether some fields are hidden." msgstr "For the List view, you can specify the sequence of field columns, and whether some fields are hidden." #: C/glom.xml:290(para) msgid "For the Details view, you can create groups of fields, and give these groups titles. You can then place fields in these groups and specify the sequence fo fields in these groups. You can also specify the sequence of these groups. For instance, in a \"Contacts\" table, you might create a \"Name\" group, and place the \"title\", \"first_name\" and \"last_name\" fields in that group. You might have other groups for the \"Address\" fields." msgstr "For the Details view, you can create groups of fields, and give these groups titles. You can then place fields in these groups and specify the sequence fo fields in these groups. You can also specify the sequence of these groups. For instance, in a \"Contacts\" table, you might create a \"Name\" group, and place the \"title\", \"first_name\" and \"last_name\" fields in that group. You might have other groups for the \"Address\" fields." #: C/glom.xml:292(para) msgid "Date and Time fields will be displayed, and entered, in the correct format according to the user's locale, but stored in the database in a canonical form. Therefore, a German user can enter a date in the German format, but this will later be displayed to a U.S. user in the U.S. format." msgstr "Date and Time fields will be displayed, and entered, in the correct format according to the user's locale, but stored in the database in a canonical form. Therefore, a German user can enter a date in the German format, but this will later be displayed to a U.S. user in the U.S. format." #: C/glom.xml:296(title) msgid "Creating Relationships" msgstr "Creating Relationships" #: C/glom.xml:297(para) msgid "Tables in the Database are often related together. For instance, an \"Invoices\" table might have a \"Customer ID\" field. A value in this field would specify a record in the \"Customers\" table with the same value. Glom can show extra information, such as the customer name, from that related record. Or it can show a list of several related records - for instance, several related \"Invoice Lines\" that are related to a record in the \"Invoice\" record." msgstr "Tables in the Database are often related together. For instance, an \"Invoices\" table might have a \"Customer ID\" field. A value in this field would specify a record in the \"Customers\" table with the same value. Glom can show extra information, such as the customer name, from that related record. Or it can show a list of several related records - for instance, several related \"Invoice Lines\" that are related to a record in the \"Invoice\" record." #: C/glom.xml:298(para) msgid "To create relationships, choose Relationships from the Developer menu. This will show the list of existing relationships. Click the Add button to create a new relationship, and enter a name for it. You should then choose a field in the current table, and a field in another table to which it should be related. This relationship will find any records in the other table for which the values in both fields are equal." msgstr "To create relationships, choose Relationships from the Developer menu. This will show the list of existing relationships. Click the Add button to create a new relationship, and enter a name for it. You should then choose a field in the current table, and a field in another table to which it should be related. This relationship will find any records in the other table for which the values in both fields are equal." #: C/glom.xml:302(simpara) msgid "To show a related field on the List or Details view." msgstr "To show a related field on the List or Details view." #: C/glom.xml:303(simpara) msgid "To show a list of related records on the Details view." msgstr "To show a list of related records on the Details view." #: C/glom.xml:304(simpara) msgid "To lookup a value from a field in a related record. For instance, to copy the current price of a \"Product\" into the \"Price\" field of an \"Invoice Line\" record." msgstr "To lookup a value from a field in a related record. For instance, to copy the current price of a \"Product\" into the \"Price\" field of an \"Invoice Line\" record." #: C/glom.xml:305(simpara) msgid "To calculate a field value." msgstr "To calculate a field value." #: C/glom.xml:299(para) msgid "You can use the relationship in the following places. " msgstr "You can use the relationship in the following places. " #: C/glom.xml:311(title) msgid "Users Administration" msgstr "Users Administration" #: C/glom.xml:312(para) msgid "To define the Operators who can use your database, and to specify what access they have to the various tables, choose Users from the Developer menu.." msgstr "To define the Operators who can use your database, and to specify what access they have to the various tables, choose Users from the Developer menu.." #: C/glom.xml:321(title) msgid "Dialogs" msgstr "Dialogues" #: C/glom.xml:323(title) msgid "Dialog: New database" msgstr "Dialogue: New database" #: C/glom.xml:328(title) msgid "Dialog: Create database" msgstr "Dialogue: Create database" #: C/glom.xml:333(title) msgid "Dialog: Connection" msgstr "Dialogue: Connection" #: C/glom.xml:334(para) msgid "This dialog requests a user name and password for connection to a database server. This is usually not the same username and password combination with which you log in to your system. All Glom systems require a database server on which the actual data will be stored. If the database server is not running on your local computer (\"localhost\"), then you must also provide its network hostname, such as \"glomserver.openismus.com\", though your hostname will be different." msgstr "This dialogue requests a user name and password for connection to a database server. This is usually not the same username and password combination with which you log in to your system. All Glom systems require a database server on which the actual data will be stored. If the database server is not running on your local computer (\"localhost\"), then you must also provide its network hostname, such as \"glomserver.openismus.com\", though your hostname will be different." #: C/glom.xml:335(para) msgid "Your system administrator can provide these database login details." msgstr "Your system administrator can provide these database login details." #: C/glom.xml:336(para) msgid "If you are the system administrator, see Glom's Postgres Configuration web page for help with installing and configuring a database server." msgstr "If you are the system administrator, see Glom's Postgres Configuration web page for help with installing and configuring a database server." #: C/glom.xml:340(title) msgid "Dialog: Connection Error" msgstr "Dialogue: Connection Error" #: C/glom.xml:341(para) msgid "This dialog is shown when Glom could not connect to the specified database server. Either the database server is not running at the specified hostname, or the user name and password were not accepted by the database server. See the Connection Dialog section for more details." msgstr "This dialogue is shown when Glom could not connect to the specified database server. Either the database server is not running at the specified hostname, or the user name and password were not accepted by the database server. See the Connection Dialogue section for more details." #: C/glom.xml:347(title) msgid "Dialog: Database preferences" msgstr "Dialogue: Database preferences" #: C/glom.xml:352(title) msgid "Dialog: Change language" msgstr "Dialogue: Change language" #: C/glom.xml:357(title) msgid "Window: Textobject" msgstr "Window: Textobject" #: C/glom.xml:362(title) msgid "Window: Imageobject" msgstr "Window: Imageobject" #: C/glom.xml:367(title) msgid "Dialog: Notebook" msgstr "Dialogue: Notebook" #: C/glom.xml:372(title) msgid "Dialog: Data invalid format" msgstr "Dialogue: Data invalid format" #: C/glom.xml:377(title) msgid "Dialog: Relationship overview" msgstr "Dialogue: Relationship overview" #: C/glom.xml:382(title) msgid "Window: Groups" msgstr "Window: Groups" #: C/glom.xml:387(title) msgid "Dialog: Group by sort fields" msgstr "Dialogue: Group by sort fields" #: C/glom.xml:392(title) msgid "Dialog: Group by secondary fields" msgstr "Dialogue: Group by secondary fields" #: C/glom.xml:397(title) msgid "Window: Button script" msgstr "Window: Button script" #: C/glom.xml:402(title) msgid "Window: Field calculation" msgstr "Window: Field calculation" #: C/glom.xml:407(title) msgid "Dialog: New group" msgstr "Dialogue: New group" #: C/glom.xml:412(title) msgid "Dialog: Choose user" msgstr "Dialogue: Choose user" #: C/glom.xml:417(title) msgid "Dialog: User" msgstr "Dialogue: User" #: C/glom.xml:422(title) msgid "Dialog: Translation identify original" msgstr "Dialogue: Translation identify original" #: C/glom.xml:427(title) msgid "Dialog: Translation copy" msgstr "Dialogue: Translation copy" #: C/glom.xml:432(title) msgid "Dialog: Choose Date" msgstr "Dialogue: Choose Date" #: C/glom.xml:456(title) msgid "About Glom" msgstr "About Glom" #: C/glom.xml:457(para) msgid "Glom is maintained by Glom and GNOME community volunteers. To find more information about Glom, please visit the Glom Web site." msgstr "Glom is maintained by Glom and GNOME community volunteers. To find more information about Glom, please visit the Glom Web site." #: C/glom.xml:462(para) msgid "To report a bug or make a suggestion regarding this application or this manual, you can submit them using bugzilla." msgstr "To report a bug or make a suggestion regarding this application or this manual, you can submit them using bugzilla." #: C/glom.xml:468(para) msgid "Another excellent source of information are the Glom mailing lists." msgstr "Another excellent source of information are the Glom mailing lists." #: C/glom.xml:473(para) msgid "This program is distributed under the terms of the GNU General Public license as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of this license can be found at this link, or in the file COPYING included with the source code of this program." msgstr "This program is distributed under the terms of the GNU General Public licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version. A copy of this licence can be found at this link, or in the file COPYING included with the source code of this program." #: C/glom.xml:482(title) msgid "Concepts" msgstr "Concepts" #: C/glom.xml:485(simpara) msgid "Database: Each glom document allows access to one database." msgstr "Database: Each glom document allows access to one database." #: C/glom.xml:486(simpara) msgid "Table: Each database contains several tables, such as \"Customers\" and \"Invoices\" tables." msgstr "Table: Each database contains several tables, such as \"Customers\" and \"Invoices\" tables." #: C/glom.xml:487(simpara) msgid "Field: Each table has several fields, such as \"Customer ID\", \"First Name\", and \"Date of Birth\" fields. In other documents and applications, fields are sometimes called \"Columns\"" msgstr "Field: Each table has several fields, such as \"Customer ID\", \"First Name\", and \"Date of Birth\" fields. In other documents and applications, fields are sometimes called \"Columns\"" #: C/glom.xml:488(simpara) msgid "Records: Each table contains several records, each of which has values for each of the fields. For instance, the \"Customers\" table will have a record for each customer. In other documents and applications, records are sometimes called Rows." msgstr "Records: Each table contains several records, each of which has values for each of the fields. For instance, the \"Customers\" table will have a record for each customer. In other documents and applications, records are sometimes called Rows." #: C/glom.xml:489(simpara) msgid "Relationships: Each table might be related to other tables, via fields in both tables. For instance, a \"Customers\" table could have a relationship to the \"Invoices\" table, so that people could see all the invoices for that customer. Only developers need to understand this concept. In other documents and applications, relationships are sometimes called \"Joins\"." msgstr "Relationships: Each table might be related to other tables, via fields in both tables. For instance, a \"Customers\" table could have a relationship to the \"Invoices\" table, so that people could see all the invoices for that customer. Only developers need to understand this concept. In other documents and applications, relationships are sometimes called \"Joins\"." #: C/glom.xml:483(para) msgid "Glom is easy to use, but you must understand the following basic concepts. " msgstr "Glom is easy to use, but you must understand the following basic concepts. " #: C/glom.xml:495(title) msgid "Calculated fields and button scripts" msgstr "Calculated fields and button scripts" #: C/glom.xml:496(para) msgid "Calculated fields and button scripts use the Python programming language. The calculation or script is the implementation of a function whose signature is provided for you." msgstr "Calculated fields and button scripts use the Python programming language. The calculation or script is the implementation of a function whose signature is provided for you." #: C/glom.xml:499(title) msgid "Editing the definition of a calculated field" msgstr "Editing the definition of a calculated field" #: C/glom.xml:506(phrase) msgid "Editing the definition of a calculated field." msgstr "Editing the definition of a calculated field." #: C/glom.xml:514(title) msgid "Field values" msgstr "Field values" #: C/glom.xml:515(programlisting) #, no-wrap msgid "record[\"name_first\"]" msgstr "record[\"name_first\"]" #: C/glom.xml:515(para) msgid "For instance, is the value of the name_first field in the current record." msgstr "For instance, is the value of the name_first field in the current record." #: C/glom.xml:519(title) msgid "Related Records" msgstr "Related Records" #: C/glom.xml:520(programlisting) #, no-wrap msgid "record.related[\"location\"]" msgstr "record.related[\"location\"]" #: C/glom.xml:520(para) msgid "For instance, provides the related records for the current record." msgstr "For instance, provides the related records for the current record." #: C/glom.xml:523(title) msgid "Single related records" msgstr "Single related records" #: C/glom.xml:524(programlisting) #, no-wrap msgid "record.related[\"location\"][\"name\"]" msgstr "record.related[\"location\"][\"name\"]" #: C/glom.xml:524(para) msgid "For relationships that specify a single record, you can get the value of a field in that record. For instance, is the value of the name field in the table indicated by the location relationship (often called location::name)." msgstr "For relationships that specify a single record, you can get the value of a field in that record. For instance, is the value of the name field in the table indicated by the location relationship (often called location::name)." #: C/glom.xml:528(title) msgid "Multiple related records" msgstr "Multiple related records" #: C/glom.xml:529(programlisting) #, no-wrap msgid "record.related[\"invoice_lines\"].sum(\"total_price\")" msgstr "record.related[\"invoice_lines\"].sum(\"total_price\")" #: C/glom.xml:529(para) msgid "For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance, ." msgstr "For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance, ." #: C/glom.xml:535(title) msgid "Testing for empty values" msgstr "Testing for empty values" #: C/glom.xml:536(para) msgid "How you test for empty values depends on the type of field:" msgstr "How you test for empty values depends on the type of field:" #: C/glom.xml:541(title) msgid "Non-text fields" msgstr "Non-text fields" #: C/glom.xml:542(para) msgid "Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0." msgstr "Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0." #: C/glom.xml:543(para) msgid "You can test whether a field is empty by using Python's None. For instance:" msgstr "You can test whether a field is empty by using Python's None. For instance:" #: C/glom.xml:545(programlisting) #, no-wrap msgid "" "\n" " if(record[\"contact_id\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" "\n" " if(record[\"contact_id\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " #: C/glom.xml:552(para) msgid "You might also test whether there are any related records. For instance:" msgstr "You might also test whether there are any related records. For instance:" #: C/glom.xml:554(programlisting) #, no-wrap msgid "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " #: C/glom.xml:564(title) msgid "Text fields" msgstr "Text fields" #: C/glom.xml:565(para) msgid "For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance:" msgstr "For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance:" #: C/glom.xml:567(programlisting) #, no-wrap msgid "" "\n" " if(record[\"name_full\"] == \"\"):\n" " return \"No Name\"\n" " else:\n" " return record[\"name_full\"]\n" " " msgstr "" "\n" " if(record[\"name_full\"] == \"\"):\n" " return \"No Name\"\n" " else:\n" " return record[\"name_full\"]\n" " " #: C/glom.xml:578(title) msgid "Using the full pygda API" msgstr "Using the full pygda API" #: C/glom.xml:579(para) msgid "pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the current database directly. This allows you to run any SQL query, for instance to read data from the database with a SELECT, or to change values in the database with an UPDATE. Note that the connection is already open so you can avoid the difficult work of specifying the connection details." msgstr "pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the current database directly. This allows you to run any SQL query, for instance to read data from the database with a SELECT, or to change values in the database with an UPDATE. Note that the connection is already open so you can avoid the difficult work of specifying the connection details." #: C/glom.xml:580(para) msgid "The record's table_name attribute also provides the name of the current table." msgstr "The record's table_name attribute also provides the name of the current table." #: C/glom.xml:581(para) msgid "(Note that the record.connection and record.table_name attributes are only available since Glom 1.1.6.)" msgstr "(Note that the record.connection and record.table_name attributes are only available since Glom 1.1.6.)" #: C/glom.xml:582(para) msgid "This example reads all data from the current table and prints the values to the terminal:" msgstr "This example reads all data from the current table and prints the values to the terminal:" #: C/glom.xml:584(programlisting) #, no-wrap msgid "" "\n" "# Use the current database's connection \n" "# to get all the data for the current table.\n" "#\n" "# record.connection is an already-open gda.connection object,\n" "# saving us the bother of opening the connection,\n" "# or even knowing the name of the database.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "command = gda.Command(query)\n" "data_model = record.connection.execute_single_command(command)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Number of columns: \", columns\n" "\n" "for i in range(columns):\n" " print \" column \", i;\n" " print \" name=\", data_model.get_column_title(i)\n" "\n" " # Find out whether it's the primary key:\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (primary key)\"\n" "\n" " print \"\\n" "\";\n" " \n" "print \" Number of rows: \", rows\n" "\n" "for row_index in range(rows):\n" " print \" row \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" value=\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n" "\";\n" " " msgstr "" "\n" "# Use the current database's connection \n" "# to get all the data for the current table.\n" "#\n" "# record.connection is an already-open gda.connection object,\n" "# saving us the bother of opening the connection,\n" "# or even knowing the name of the database.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "command = gda.Command(query)\n" "data_model = record.connection.execute_single_command(command)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Number of columns: \", columns\n" "\n" "for i in range(columns):\n" " print \" column \", i;\n" " print \" name=\", data_model.get_column_title(i)\n" "\n" " # Find out whether it's the primary key:\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (primary key)\"\n" "\n" " print \"\\n" "\";\n" " \n" "print \" Number of rows: \", rows\n" "\n" "for row_index in range(rows):\n" " print \" row \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" value=\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n" "\";\n" " " #. Put one translator per line, in the form of NAME , YEAR1, YEAR2. #: C/glom.xml:0(None) msgid "translator-credits" msgstr "David Lodge , 2007" glom-1.22.4/docs/user-guide/en_GB/legal.xml0000644000175000017500000000573412235000130021540 0ustar00murraycmurrayc00000000000000 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation Licence (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the licence to the manual, as described in section 6 of the licence. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENCE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENCE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORISED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. glom-1.22.4/docs/user-guide/en_GB/glom.xml0000644000175000017500000013043212235000130021404 0ustar00murraycmurrayc00000000000000 ]>
Glom User Guide V0.2 for Glom v1.6 2004 Murray Cumming 2007David Lodge (dave@cirt.net) Glom Development Team Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation Licence (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the licence to the manual, as described in section 6 of the licence. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENCE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENCE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORISED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. Murray Cumming Glom Development Team
murrayc@murrayc.com
Glom 1.6 20 June 2004 Murray Cumming Murray Cumming This manual describes version 1.6 of Glom Feedback To report a bug or make a suggestion regarding the Glom or this manual can be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla before submitting your bug to ensure that yours hasn't already been reported. User manual for Glom.
MY-GNOME-APP mygnomeapp Introduction Glom allows you to design and use database systems. Getting Started Starting Glom You can start Glom in the following ways: Applications menu Choose OfficeGlom. When You Start Glom When you start Glom, the following window is displayed. You may open an existing Glom file or create a new one, possibly basing a new Glom file on one of the examples.
Glom Start Up Window, Opening an Existing File Shows Glom main window used to open an existing Glom file.
Glom Start Up Window, Creating a New File Shows Glom main window used to create a new Glom file.
Using Glom as an Operator To open an existing Glom document, either open that document from the File Manager, or choose Glom from the Applications menu, and then choose the document when asked. Glom will ask you for a user name and password to access the database. Your administrator will provide your user name and password. When you open an existing document, Glom will be in Operatoruser level. This user level allows you to find and edit records, but does not allow you to change the fundamental structure of the database. Navigation Each database has several tables. To look at a different table, choose Tables from the Navigate menu. Then double-click on the table, or select it and click the Open button.
Navigating to a Table Navigating to a Table.
Viewing and Entering Data When in Data Mode, you can view or enter information in either the List or Details view. The List View The List view shows many records at once and usually shows only the most important fields. When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you. To create a new record just click the New button, or start typing into a field in the last empty row. A new record row will be created with blank fields for you to fill in.
The List View The List View.
To sort the records just click on a column header. For instance, you could might click on a date column to list invoices in order of their date, and click again to list them in reverse order.
The Details View The details view shows only one record and usually shows all the fields arranged suitably. When you enter data into a field it will be saved into the database immediately after you finish editing the field. If it is a date or time field then the data format will be checked for you. To create a new record just click the New button. A new record will be created with blank fields for you to fill in.
The Details View The Details View.
Finding Data Choose Find Mode from the Mode menu. The fields in the List and Details views will now be empty, and a Find button will appear at the bottom of the window. Enter information, or part of the information, into a field to find records with that information in that field. For instance, enter Jim into a name field to find records with "Jim" or "Jimmy" in the name. When you press the Find button, Glom will search for records and then display them. If only one record is found then it will show you that record in the Details view. If several records are found then it will show you those records in the List view. Printing Reports If your database developer has defined some reports for a table then you will seem them listed in the Reports menu. Just choose the report from the menu to create the report. If you have previously performed a search then the report will contain only the currently-found data. Otherwise it will contain all data in the current report. Remember that each table has its own reports so you may need to switch to the relevant table to use a particular report.
A report A report.
Using Glom as a Developer When you create a new document, Glom will be in the Developeruser level. You can also change to the Developer user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it. Adding Tables You can see the list of existing tables by choosing Tables from the Navigate menu. You will also see this window after connecting to a database server, after creating a new document. To create a new table, click the Add button and enter the name for the new table. Glom will suggest a human-readable title for this table. Operators will see this title instead of the actual table name. You can also mark a tables as hidden from Operators. For instance, Operators should see "Invoice Lines" as related records from the "Invoices" table, but they should never be able to navigate directly to the "Invoice Lines" table. You can also specify one table as the default table. This table will be shown whenever an operator opens an existing document, without asking him to select a table from the list. You can also use this window to rename an existing table. Click the Open button to look at the selected table. Editing Fields Choose Fields from the Developer menu. This shows the list of fields in the table. New tables automatically have a primary key field, but you can change this field if necessary. Click the Add button to add a new field, then enter the name of the new field. Glom will guess an appropriate human-readable title for this field, but you can edit this. Operators will see this title instead of the actual field name. To specify more field details, select the field and click the Details button.
Editing Fields Editing the table's fields.
Primary Keys Each table must have one, and only one, Primary Key. The value in this field will be unique, meaning that each value in this field will appear in only one record in the table. For instance, each record in a "Customers" table would have a "Customer ID". This value will be used to refer to that customer from other tables, such as "Projects" and "Invoices" records. See the Creating Relationships section to see how you can relate tables together. Field Types Glom offers a few simple field types: Number Text Date Time Boolean - either true or false Image Calculated Fields Field values can be calculated in terms of other fields, using the Python programming language. This calculation should be the implementation of a python function, which should return a value. The return value will be used as the value of the field. This value will be recalculated every time one of the source fields changes. TODO: This only works for default values at the moment, and you can not use field values in the calculation yet. You can also use calculations to specify a default value for fields, by selecting the Default Value tab in the Field Details window, clicking on the Calculate Value check box, and then entering a Python calculation. You can test this calculation in the Edit window.
Arranging Layouts Each table has List and Details views, and by default these show all fields in the table, in order of creation. You can edit the layout by choosing Layout from the Developer menu. Arranging the List View For the List view, you can specify the sequence of field columns, and whether some fields are hidden.
Editing the List Layout Editing the list layout.
Arranging the Details View For the Details view, you can create groups of fields, and give these groups titles. You can then place fields in these groups and specify the sequence fo fields in these groups. You can also specify the sequence of these groups. For instance, in a "Contacts" table, you might create a "Name" group, and place the "title", "first_name" and "last_name" fields in that group. You might have other groups for the "Address" fields.
Editing the details Layout Editing the Details Layout.
Creating Relationships Tables in the Database are often related together. For instance, an "Invoices" table might have a "Customer ID" field. A value in this field would specify a record in the "Customers" table with the same value. Glom can show extra information, such as the customer name, from that related record. Or it can show a list of several related records - for instance, several related "Invoice Lines" that are related to a record in the "Invoice" record. To create relationships, choose Relationships from the Developer menu. This will show the list of existing relationships. Click the Add button to create a new relationship, and enter a name for it. You should then choose a field in the current table, and a field in another table to which it should be related. This relationship will find any records in the other table for which the values in both fields are equal. You can use the relationship in the following places. To show a related field on the List or Details view. To show a list of related records on the Details view. To lookup a value from a field in a related record. For instance, to copy the current price of a "Product" into the "Price" field of an "Invoice Line" record. To calculate a field value. Users Administration To define the Operators who can use your database, and to specify what access they have to the various tables, choose Users from the Developer menu. Translations Glom's user interface (and this document) is translated into several languages, as you should see already if you are using your computer with a non-English user interface. In addition, Glom automatically shows and understands numbers and dates according to the current user's local conventions. For instance, a user in the USA might enter a price as 1.99 and a date as 1/13/2008, but a German user of the same database will later see that as 1,99 and 13.1.2008. However, the Glom system that you create also contains text that must be translated if it will be used by people who speak different languages. For instance, you must provide translations for the titles of your tables, fields, and reports. All of these text items can be seen in a list when you choose Translations from the Developer menu. In this window you can specify the language that you used for the original text, and enter translations for each text item for additional languages. When the Glom system is opened by a user of that language then these text items will be shown in the user interface.
Translations Translations.
Experienced translators may be more familiar with the .po file format, or you might wish to use the many tools that work with the .po file format. By using the Export button you can create a .po file to use in a separate tool or to send to a translator. You can then import the resulting translation by using the Import button.
Defining Reports Adding or Editing Reports Glom can produce reports to show specific fields for sets of records, sorted and grouped. For instance, a shop might need a report listing all products sold in one month, grouped by product type, and sorted by price inside each group. Each table has its own reports, which are available to the operator from the Reports menu. To define a report, or to change the definition of an existing report, choose Reports from the Developer menu.
Creating or Editing Reports Creating or editing reports.
Notice that each report has an ID as well as a human-readable name. This allows your report to have a translated title when used on a computer that uses a different language.
Editing a Report A Glom report has three areas: The Header, which appears at the start of the report The Main area, in which the records and summary lines are shown, with the actual data from the database. The Footer, which appears at the end of the report. Inside an area, such as the Main part, you may add report Parts, such as fields, text, or images. These will usually appear in a row on the printed report, with one row for each record. In the simple case, this will look much like Glom's list view. You can add parts to your report by selecting them from the Available Parts list and then clicking the Add button. The part will then be added to the Parts list, in the selected area. To specify details for the parts, such as the text or image to display, or to choose the field to display, select the part in the Parts list and click the Edit button. You may also specify field formatting by clicking the Formatting button, just as you would when defining a details or list layout.
Editing a Report Editing a report.
Some parts may contain other parts and have extra properties to control how they present their child parts. For instance, the Group By part groups records together by a field. For instance, a products report might group a list of products by product type. You can even add a second sub-grouping inside the main Group By part, by selecting your top-level Group By part in the Parts list while adding a new Group By part from the Available Parts list. For instance, you might group your products by manufacturer, inside each product type group. To specify the field by which the records should be grouped, select your Group By part in the Parts list and click the Edit button. You can then choose the field by which the records should be grouped, and select the fields by which these records should be sorted within the group. You may also specify some additional fields to be displayed in the group's title row. For instance, you might want to group products by a manufacturer ID, but also show the manufacturer name.
Editing a Group By Part Editing a report.
The Vertical Group part may contain other items. For instance, it allows you to arrange fields below each other instead of just one after the other in the horizontal row. This is useful for grouping related fields such as address lines, or just to squeeze more information into the records's row on the report.
A Report with Vertical Groups A Report with Vertical Groups.
When you have finished, click the Close button to save the report's definition. Your report can then be chosen from the Reports menu. See the Printing Reports section for more details.
Dialogues Dialog: Initial dialog This dialog allows the user to choose an existing document or create a new document. Existing documents may be selecting from the list of recently opened documents or by select a file with the file chooser dialog. Documents can also be opened via the network if other users are running Glom on the local network. Finally, a new document can be created either by opening a template file which already contains some initial tables and records, or by creating an empty document. Dialogue: New database Dialogue: Create database Dialogue: Connection This dialogue requests a user name and password for connection to a database server. This is usually not the same username and password combination with which you log in to your system. All Glom systems require a database server on which the actual data will be stored. If the database server is not running on your local computer ("localhost"), then you must also provide its network hostname, such as "glomserver.openismus.com", though your hostname will be different. Your system administrator can provide these database login details. If you are the system administrator, see Glom's Postgres Configuration web page for help with installing and configuring a database server. Dialogue: Connection Error This dialogue is shown when Glom could not connect to the specified database server. Either the database server is not running at the specified hostname, or the user name and password were not accepted by the database server. See the Connection Dialogue section for more details. Dialogue: Database preferences Dialogue: Change language Window: Textobject Window: Imageobject Dialogue: Notebook Dialogue: Data invalid format Dialogue: Relationship overview Window: Groups Dialogue: Group by sort fields Dialogue: Group by secondary fields Window: Button script Window: Field calculation Dialogue: New group Dialogue: Choose user Dialogue: User Dialogue: Translation identify original Dialogue: Translation copy Dialogue: Choose Date Dialog: Import Into Table This dialog allows the user to import a CSV (comma separated value) file into the current database table. It shows the first few rows of the file to import and allows the user to select the target field in the database for each column in the CSV file. For auto-incremented primary keys, the primary key field cannot be used as a target field, but otherwise one column must be imported into the primary key field. About Glom Glom is maintained by Glom and GNOME community volunteers. To find more information about Glom, please visit the Glom Web site. To report a bug or make a suggestion regarding this application or this manual, you can submit them using bugzilla. Another excellent source of information are the Glom mailing lists. This program is distributed under the terms of the GNU General Public licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version. A copy of this licence can be found at this link, or in the file COPYING included with the source code of this program. Concepts Glom is easy to use, but you must understand the following basic concepts. Database: Each Glom document allows access to one database. Table: Each database contains several tables, such as "Customers" and "Invoices" tables. Field: Each table has several fields, such as "Customer ID", "First Name", and "Date of Birth" fields. In other documents and applications, fields are sometimes called "Columns" Records: Each table contains several records, each of which has values for each of the fields. For instance, the "Customers" table will have a record for each customer. In other documents and applications, records are sometimes called Rows. Relationships: Each table might be related to other tables, via fields in both tables. For instance, a "Customers" table could have a relationship to the "Invoices" table, so that people could see all the invoices for that customer. Only developers need to understand this concept. In other documents and applications, relationships are sometimes called "Joins". Calculated fields and button scripts Calculated fields and button scripts use the Python programming language. The calculation or script is the implementation of a function whose signature is provided for you.
Editing the definition of a calculated field Editing the definition of a calculated field.
Field values For instance, record["name_first"] is the value of the name_first field in the current record. Related Records For instance, record.related["location"] provides the related records for the current record. Single related records For relationships that specify a single record, you can get the value of a field in that record. For instance, record.related["location"]["name"] is the value of the name field in the table indicated by the location relationship (often called location::name). Multiple related records For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance, record.related["invoice_lines"].sum("total_price"). Testing for empty values How you test for empty values depends on the type of field: Non-text fields Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0. You can test whether a field is empty by using Python's None. For instance: if(record["contact_id"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] You might also test whether there are any related records. For instance: if(record.related["contacts"] == None): return "No Contact" else: return record.related["contacts"]["name_full"] Text fields For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance: if(record["name_full"] == ""): return "No Name" else: return record["name_full"] Using the full pygda API pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the current database directly. This allows you to run any SQL query, for instance to read data from the database with a SELECT, or to change values in the database with an UPDATE. Note that the connection is already open so you can avoid the difficult work of specifying the connection details. The record's table_name attribute also provides the name of the current table. This example reads all data from the current table and prints the values to the terminal: # Use the current database's connection # to get all the data for the current table. # # record.connection is an already-open gda.connection object, # saving us the bother of opening the connection, # or even knowing the name of the database. query = "SELECT * FROM %s" % record.table_name data_model = gda.gda_execute_select_command(record.connection, query) rows = data_model.get_n_rows() columns = data_model.get_n_columns() print " Number of columns: ", columns for i in range(columns): print " column ", i; print " name=", data_model.get_column_title(i) # Find out whether it's the primary key: field = data_model.describe_column(i) if field.get_primary_key(): print " (primary key)" print "\n"; print " Number of rows: ", rows for row_index in range(rows): print " row ", row_index; for col_index in range(columns): print " value=", data_model.get_value_at(col_index, row_index).get() print "\n";
glom-1.22.4/docs/user-guide/ChangeLog0000644000175000017500000000755012234252645020553 0ustar00murraycmurrayc000000000000002011-11-03 Murray Cumming Updated more screenshots. * C/figures/glom_design_details_layout_toolbar.png: * C/figures/glom_design_print_layout.png: * C/figures/glom_initial_dialog_local_network.png: Updated more screenshots. 2011-11-03 Murray Cumming Updated some more screenshots. * C/figures/glom_data_details.png: * C/figures/glom_design_fields.png: * C/figures/glom_design_layout_details.png: * C/figures/glom_report_result.png: Updated. Only 2 are left. 2011-10-28 Murray Cumming Updated screenshots for functionality that actually works. * C/figures/start.png: Replace with: * C/figures/start_create.png: * C/figures/start_open.png: and adapted: * docs/user-guide/C/glom.xml and * docs/user-guide/Makefile.am * docs/user-guide/C/figures/glom_design_fields_dialog_calculated.png * docs/user-guide/C/figures/glom_design_layout_details.png * docs/user-guide/C/figures/glom_design_layout_list.png * docs/user-guide/C/figures/glom_design_reports.png * docs/user-guide/C/figures/glom_design_reports_details.png * docs/user-guide/C/figures/glom_design_reports_group_by.png * docs/user-guide/C/figures/glom_design_reports_vertical_group.png * docs/user-guide/C/figures/glom_design_translations.png * docs/user-guide/C/figures/glom_import.png * docs/user-guide/C/figures/glom_tables.png: Updated 2010-05-02 Murray Cumming User Guide: Update the pygda example for pygda 4. * C/glom.xml: using-the-full-pygda-api: Update the example for pygda 4 and its (currently ugly, until I fix it) API. 2009-01-01 Mario Blättermann * de/de.po: Updated German translation 2008-06-07 Jorge Gonzalez * es/es.po: Updated Spanish translation by Daniel Mustieles 2008-06-10 Claude Paroz * Makefile.am: Added fr to DOC_LINGUAS. * fr/fr.po: Added French translation. * fr/figures/*: Translated screenshots. 2008-06-01 Jorge Gonzalez * es/es.po: Updated Spanish translation by Daniel Mustieles. 2008-04-25 Jorge Gonzalez * es/es.po: Updated Spanish translation by Daniel Mustieles. 2008-04-24 Murray Cumming * C/glom.xml: Use &app; instead of &glom; because &glom; is not defined. 2008-04-13 Jorge Gonzalez * es/es.po: Updated Spanish translation by Daniel Mustieles. 2008-04-05 Jorge Gonzalez * es/es.po: Updated Spanish translation by Daniel Mustieles. 2008-04-01 Frederic Peters * C/glom.xml: Added more section IDs so that the Table Of Contents works on library.gnome.org (it works without them in Glom). 2008-03-29 Murray Cumming * Makefile.am: Mention all the image files. 2008-03-29 Murray Cumming * C/glom.xml: Added mention of vertical groups to the reports section. 2008-03-29 Jorge Gonzalez * es/es.po: Updated Spanish translation by Daniel Mustieles. 2008-01-21 Jorge Gonzalez * es/es.po: Updated Spanish translation by Daniel Mustieles. 2008-01-20 Jorge Gonzalez * es/es.po: Updated Spanish translation by Daniel Mustieles. 2007-10-14 Yannig Marchegay * configure.in: Added 'oc' to ALL_LINGUAS. 2007-05-15 David Lodge * en_GB/en_GB.po: Added (British) English translation. * Makefile.am: Added en_GB to DOC_LINGUAS 2007-05-09 Murray Cumming * es/legal.xml: 2007-04-25 Jorge Gonzalez * es/es.po: Added spanish translation * Makefile.am: Added es to DOC_LINGUAS. 2006-11-16 Daniel Nylander * sv/sv.po: Added initial Swedish translation. * Makefile.am: Added sv to DOC_LINGUAS. glom-1.22.4/docs/user-guide/glom.omf.in0000644000175000017500000000046312235000130021020 0ustar00murraycmurrayc00000000000000 user's guide glom-1.22.4/docs/user-guide/Makefile.in0000644000175000017500000011461512234777123021052 0ustar00murraycmurrayc00000000000000# Makefile.in generated by automake 1.13.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # gnome-doc-utils.make - make magic for building documentation # Copyright (C) 2004-2005 Shaun McCance # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. ################################################################################ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/gnome-doc-utils.make $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am ChangeLog subdir = docs/user-guide ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/macros/ax_boost_python_murrayc.m4 \ $(top_srcdir)/macros/gettext.m4 \ $(top_srcdir)/macros/gnome-doc-utils.m4 \ $(top_srcdir)/macros/iconv.m4 \ $(top_srcdir)/macros/intlmacosx.m4 \ $(top_srcdir)/macros/intltool.m4 \ $(top_srcdir)/macros/lib-ld.m4 \ $(top_srcdir)/macros/lib-link.m4 \ $(top_srcdir)/macros/lib-prefix.m4 \ $(top_srcdir)/macros/libtool.m4 \ $(top_srcdir)/macros/ltoptions.m4 \ $(top_srcdir)/macros/ltsugar.m4 \ $(top_srcdir)/macros/ltversion.m4 \ $(top_srcdir)/macros/lt~obsolete.m4 \ $(top_srcdir)/macros/mm-pkg.m4 \ $(top_srcdir)/macros/mm-python.m4 $(top_srcdir)/macros/nls.m4 \ $(top_srcdir)/macros/po.m4 $(top_srcdir)/macros/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h \ $(top_builddir)/glom/libglom/libglom_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_FLAGS = @ACLOCAL_FLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIB = @DL_LIB@ DOCINSTALL_FLAGS = @DOCINSTALL_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DOT = @DOT@ DOXYGEN = @DOXYGEN@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GENHTML = @GENHTML@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLOM_ABI_VERSION = @GLOM_ABI_VERSION@ GLOM_ABI_VERSION_UNDERLINED = @GLOM_ABI_VERSION_UNDERLINED@ GLOM_CFLAGS = @GLOM_CFLAGS@ GLOM_GZIP = @GLOM_GZIP@ GLOM_LIBS = @GLOM_LIBS@ GLOM_MSGFMT = @GLOM_MSGFMT@ GLOM_TAR = @GLOM_TAR@ GLOM_WFLAGS = @GLOM_WFLAGS@ GLOM_WXXFLAGS = @GLOM_WXXFLAGS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ ISO_CODES_PREFIX = @ISO_CODES_PREFIX@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGLOM_API_VERSION = @LIBGLOM_API_VERSION@ LIBGLOM_CFLAGS = @LIBGLOM_CFLAGS@ LIBGLOM_LIBS = @LIBGLOM_LIBS@ LIBGLOM_MAJOR_VERSION = @LIBGLOM_MAJOR_VERSION@ LIBGLOM_MICRO_VERSION = @LIBGLOM_MICRO_VERSION@ LIBGLOM_MINOR_VERSION = @LIBGLOM_MINOR_VERSION@ LIBGLOM_MODULE_NAME = @LIBGLOM_MODULE_NAME@ LIBGLOM_VERSION = @LIBGLOM_VERSION@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MMDOCTOOLDIR = @MMDOCTOOLDIR@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = -Wno-portability _clean_doc_header = $(if $(DOC_H_FILE),clean-doc-header) _DOC_REAL_FORMATS = $(if $(DOC_USER_FORMATS),$(DOC_USER_FORMATS),$(DOC_FORMATS)) _DOC_REAL_LINGUAS = $(if $(filter environment,$(origin LINGUAS)), \ $(filter $(LINGUAS),$(DOC_LINGUAS)), \ $(DOC_LINGUAS)) _DOC_ABS_SRCDIR = @abs_srcdir@ _xml2po_mode = $(if $(DOC_ID),mallard,docbook) @ENABLE_SK_TRUE@_ENABLE_SK = true ################################################################################ GDU_V_XML2PO = $(GDU__v_XML2PO_$(V)) GDU__v_XML2PO_ = $(GDU__v_XML2PO_$(AM_DEFAULT_VERBOSITY)) GDU__v_XML2PO_0 = @echo " XML2PO" $@; GDU_V_MSGFMT = $(GDU__v_MSGFMT_$(V)) GDU__v_MSGFMT_ = $(GDU__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) GDU__v_MSGFMT_0 = @echo " MSGFMT" $@; GDU_V_DB2OMF = $(GDU__v_DB2OMF_$(V)) GDU__v_DB2OMF_ = $(GDU__v_DB2OMF_$(AM_DEFAULT_VERBOSITY)) GDU__v_DB2OMF_0 = @echo " DB2OMF" $@; GDU_V_DB2HTM = $(GDU__v_DB2HTM_$(V)) GDU__v_DB2HTM_ = $(GDU__v_DB2HTM_$(AM_DEFAULT_VERBOSITY)) GDU__v_DB2HTM_0 = @echo " DB2HTM" $@; ################################################################################ db2omf_args = \ --stringparam db2omf.basename $(DOC_MODULE) \ --stringparam db2omf.format $(3) \ --stringparam db2omf.dtd \ $(shell xmllint --format $(2) | grep -h PUBLIC | head -n 1 \ | sed -e 's/.*PUBLIC \(\"[^\"]*\"\).*/\1/') \ --stringparam db2omf.lang $(notdir $(patsubst %/$(notdir $(2)),%,$(2))) \ --stringparam db2omf.omf_dir "$(OMF_DIR)" \ --stringparam db2omf.help_dir "$(HELP_DIR)" \ --stringparam db2omf.omf_in "$(_DOC_OMF_IN)" \ $(if $(_ENABLE_SK), \ --stringparam db2omf.scrollkeeper_cl "$(_skcontentslist)") \ $(_db2omf) $(2) _DOC_OMF_IN = $(if $(DOC_MODULE),$(wildcard $(_DOC_ABS_SRCDIR)/$(DOC_MODULE).omf.in)) _DOC_OMF_DB = $(if $(_DOC_OMF_IN), \ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-$(lc).omf)) _DOC_OMF_HTML = $(if $(_DOC_OMF_IN), \ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-html-$(lc).omf)) # FIXME _DOC_OMF_ALL = \ $(if $(filter docbook,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_DB)) \ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_HTML)) ################################################################################ _DOC_C_MODULE = $(if $(DOC_MODULE),C/$(DOC_MODULE).xml) _DOC_C_PAGES = $(foreach page,$(DOC_PAGES),C/$(page)) _DOC_C_ENTITIES = $(foreach ent,$(DOC_ENTITIES),C/$(ent)) _DOC_C_INCLUDES = $(foreach inc,$(DOC_INCLUDES),C/$(inc)) _DOC_C_DOCS = \ $(_DOC_C_ENTITIES) $(_DOC_C_INCLUDES) \ $(_DOC_C_PAGES) $(_DOC_C_MODULE) _DOC_C_DOCS_NOENT = \ $(_DOC_C_MODULE) $(_DOC_C_INCLUDES) \ $(_DOC_C_PAGES) _DOC_C_FIGURES = $(if $(DOC_FIGURES), \ $(foreach fig,$(DOC_FIGURES),C/$(fig)), \ $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/C/figures/*.png))) # FIXME: probably have to shell escape to determine the file names _DOC_C_HTML = $(foreach f, \ $(shell xsltproc --xinclude \ --stringparam db.chunk.basename "$(DOC_MODULE)" \ $(_chunks) "C/$(DOC_MODULE).xml"), \ C/$(f).xhtml) ############################################################################### _DOC_POFILES = $(if $(DOC_MODULE)$(DOC_ID), \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(lc).po)) _DOC_MOFILES = $(patsubst %.po,%.mo,$(_DOC_POFILES)) _DOC_LC_MODULES = $(if $(DOC_MODULE), \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xml)) _DOC_LC_PAGES = \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach page,$(_DOC_C_PAGES), \ $(lc)/$(notdir $(page)) )) _DOC_LC_INCLUDES = \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach inc,$(_DOC_C_INCLUDES), \ $(lc)/$(notdir $(inc)) )) # FIXME: probably have to shell escape to determine the file names _DOC_LC_HTML = \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach doc,$(_DOC_C_HTML), \ $(lc)/$(notdir $(doc)) )) _DOC_LC_DOCS = \ $(_DOC_LC_MODULES) $(_DOC_LC_INCLUDES) $(_DOC_LC_PAGES) \ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_LC_HTML)) _DOC_LC_FIGURES = $(foreach lc,$(_DOC_REAL_LINGUAS), \ $(patsubst C/%,$(lc)/%,$(_DOC_C_FIGURES)) ) _DOC_SRC_FIGURES = \ $(foreach fig,$(_DOC_C_FIGURES), $(foreach lc,C $(_DOC_REAL_LINGUAS), \ $(wildcard $(srcdir)/$(lc)/$(patsubst C/%,%,$(fig))) )) _DOC_POT = $(if $(DOC_MODULE),$(DOC_MODULE).pot,$(if $(DOC_ID),$(DOC_ID).pot)) ################################################################################ _DOC_HTML_ALL = $(if $(filter html HTML,$(_DOC_REAL_FORMATS)), \ $(_DOC_C_HTML) $(_DOC_LC_HTML)) _DOC_HTML_TOPS = $(foreach lc,C $(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xhtml) _clean_omf = $(if $(_DOC_OMF_IN),clean-doc-omf) _clean_dsk = $(if $(_DOC_DSK_IN),clean-doc-dsk) _clean_lc = $(if $(_DOC_REAL_LINGUAS),clean-doc-lc) _clean_dir = $(if $(DOC_MODULE)$(DOC_ID),clean-doc-dir) _doc_install_dir = $(if $(DOC_ID),$(DOC_ID),$(DOC_MODULE)) DOC_MODULE = glom DOC_ENTITIES = DOC_INCLUDES = legal.xml DOC_FIGURES = \ figures/glom_data_details.png \ figures/glom_design_layout_details.png \ figures/glom_design_reports.png \ figures/glom_tables.png \ figures/glom_data_list.png \ figures/glom_design_layout_list.png \ figures/glom_design_reports_vertical_group.png \ figures/glom_import.png \ figures/glom_initial_dialog_local_network.png \ figures/start_open.png \ figures/start_create.png \ figures/glom_design_fields_dialog_calculated.png \ figures/glom_design_reports_details.png \ figures/glom_design_translations.png \ figures/glom_design_fields.png \ figures/glom_design_reports_group_by.png \ figures/glom_report_result.png DOC_LINGUAS = de en_GB es fr sl sv all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/gnome-doc-utils.make $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/user-guide/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/user-guide/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/gnome-doc-utils.make: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool \ mostlyclean-local pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local cscopelist-am ctags-am dist-hook distclean \ distclean-generic distclean-libtool distclean-local distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic \ maintainer-clean-local mostlyclean mostlyclean-generic \ mostlyclean-libtool mostlyclean-local pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am uninstall-local DOC_H_FILE ?= DOC_H_DOCS ?= $(DOC_H_FILE): $(DOC_H_DOCS); @rm -f $@.tmp; touch $@.tmp; echo 'const gchar* documentation_credits[] = {' >> $@.tmp list='$(DOC_H_DOCS)'; for doc in $$list; do \ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ xsltproc --path "$$xmlpath" $(_credits) $$doc; \ done | sort | uniq \ | awk 'BEGIN{s=""}{n=split($$0,w,"<");if(s!=""&&s!=substr(w[1],1,length(w[1])-1)){print s};if(n>1){print $$0;s=""}else{s=$$0}};END{if(s!=""){print s}}' \ | sed -e 's/\\/\\\\/' -e 's/"/\\"/' -e 's/\(.*\)/\t"\1",/' >> $@.tmp echo ' NULL' >> $@.tmp echo '};' >> $@.tmp echo >> $@.tmp list='$(DOC_H_DOCS)'; for doc in $$list; do \ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ docid=`echo "$$doc" | sed -e 's/.*\/\([^/]*\)\.xml/\1/' \ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`; \ echo $$xmlpath; \ ids=`xsltproc --xinclude --path "$$xmlpath" $(_ids) $$doc`; \ for id in $$ids; do \ echo '#define HELP_'`echo $$docid`'_'`echo $$id \ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`' "'$$id'"' >> $@.tmp; \ done; \ echo >> $@.tmp; \ done; cp $@.tmp $@ && rm -f $@.tmp dist-check-gdu: @HAVE_GNOME_DOC_UTILS_FALSE@ @echo "*** GNOME Doc Utils must be installed in order to make dist" @HAVE_GNOME_DOC_UTILS_FALSE@ @false .PHONY: dist-doc-header dist-doc-header: $(DOC_H_FILE) @if test -f "$(DOC_H_FILE)"; then d=; else d="$(srcdir)/"; fi; \ echo "$(INSTALL_DATA) $${d}$(DOC_H_FILE) $(distdir)/$(DOC_H_FILE)"; \ $(INSTALL_DATA) "$${d}$(DOC_H_FILE)" "$(distdir)/$(DOC_H_FILE)"; doc-dist-hook: dist-check-gdu $(if $(DOC_H_FILE),dist-doc-header) .PHONY: clean-doc-header clean-local: $(_clean_doc_header) distclean-local: $(_clean_doc_header) mostlyclean-local: $(_clean_doc_header) maintainer-clean-local: $(_clean_doc_header) clean-doc-header: rm -f $(DOC_H_FILE) all: $(DOC_H_FILE) ################################################################################ DOC_MODULE ?= DOC_ID ?= DOC_PAGES ?= DOC_ENTITIES ?= DOC_INCLUDES ?= DOC_FIGURES ?= DOC_FORMATS ?= docbook DOC_LINGUAS ?= ################################################################################ _xml2po ?= `which xml2po` _db2html ?= `$(PKG_CONFIG) --variable db2html gnome-doc-utils` _db2omf ?= `$(PKG_CONFIG) --variable db2omf gnome-doc-utils` _chunks ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/chunks.xsl _credits ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/credits.xsl _ids ?= $(shell $(PKG_CONFIG) --variable xmldir gnome-doc-utils)/gnome/xslt/docbook/utils/ids.xsl @ENABLE_SK_TRUE@_skpkgdatadir ?= `scrollkeeper-config --pkgdatadir` @ENABLE_SK_TRUE@_sklocalstatedir ?= `scrollkeeper-config --pkglocalstatedir` @ENABLE_SK_TRUE@_skcontentslist ?= $(_skpkgdatadir)/Templates/C/scrollkeeper_cl.xml $(_DOC_OMF_DB) : $(_DOC_OMF_IN) $(_DOC_OMF_DB) : $(DOC_MODULE)-%.omf : %/$(DOC_MODULE).xml @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ echo "The file '$(_skcontentslist)' does not exist." >&2; \ echo "Please check your ScrollKeeper installation." >&2; \ exit 1; } $(GDU_V_DB2OMF)xsltproc -o $@ $(call db2omf_args,$@,$<,'docbook') || { rm -f "$@"; exit 1; } $(_DOC_OMF_HTML) : $(_DOC_OMF_IN) $(_DOC_OMF_HTML) : $(DOC_MODULE)-html-%.omf : %/$(DOC_MODULE).xml @ENABLE_SK_TRUE@ @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ @ENABLE_SK_TRUE@ echo "The file '$(_skcontentslist)' does not exist" >&2; \ @ENABLE_SK_TRUE@ echo "Please check your ScrollKeeper installation." >&2; \ @ENABLE_SK_TRUE@ exit 1; } $(GDU_V_DB2OMF)xsltproc -o $@ $(call db2omf_args,$@,$<,'xhtml') || { rm -f "$@"; exit 1; } .PHONY: omf omf: $(_DOC_OMF_ALL) .PHONY: po po: $(_DOC_POFILES) .PHONY: mo mo: $(_DOC_MOFILES) $(_DOC_POFILES): @if ! test -d $(dir $@); then \ echo "mkdir $(dir $@)"; \ mkdir "$(dir $@)"; \ fi @if test ! -f $@ -a -f $(srcdir)/$@; then \ echo "cp $(srcdir)/$@ $@"; \ cp "$(srcdir)/$@" "$@"; \ fi; @docs=; \ list='$(_DOC_C_DOCS_NOENT)'; for doc in $$list; do \ docs="$$docs $(_DOC_ABS_SRCDIR)/$$doc"; \ done; \ if ! test -f $@; then \ echo "(cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp)"; \ (cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp); \ else \ echo "(cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs)"; \ (cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs); \ fi $(_DOC_MOFILES): %.mo: %.po $(AM_V_at)if ! test -d $(dir $@); then mkdir "$(dir $@)"; fi $(GDU_V_MSGFMT)msgfmt -o $@ $< # FIXME: fix the dependancy # FIXME: hook xml2po up $(_DOC_LC_DOCS) : $(_DOC_MOFILES) $(_DOC_LC_DOCS) : $(_DOC_C_DOCS) $(AM_V_at)if ! test -d $(dir $@); then mkdir $(dir $@); fi $(GDU_V_XML2PO)if [ -f "C/$(notdir $@)" ]; then d="../"; else d="$(_DOC_ABS_SRCDIR)/"; fi; \ mo="$(dir $@)$(patsubst %/$(notdir $@),%,$@).mo"; \ if [ -f "$${mo}" ]; then mo="../$${mo}"; else mo="$(_DOC_ABS_SRCDIR)/$${mo}"; fi; \ (cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e -t "$${mo}" \ "$${d}C/$(notdir $@)" > $(notdir $@).tmp && \ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp) .PHONY: pot pot: $(_DOC_POT) $(_DOC_POT): $(_DOC_C_DOCS_NOENT) $(GDU_V_XML2PO)$(_xml2po) -m $(_xml2po_mode) -e -o $@ $^ $(_DOC_HTML_TOPS): $(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(GDU_V_DB2HTM)xsltproc -o $@ --xinclude --param db.chunk.chunk_top "false()" --stringparam db.chunk.basename "$(DOC_MODULE)" --stringparam db.chunk.extension ".xhtml" $(_db2html) $(patsubst %.xhtml,%.xml,$@) ################################################################################ all: \ $(_DOC_C_DOCS) $(_DOC_LC_DOCS) \ $(_DOC_OMF_ALL) $(_DOC_DSK_ALL) \ $(_DOC_HTML_ALL) $(_DOC_POFILES) ################################################################################ .PHONY: clean-doc-omf clean-doc-dsk clean-doc-lc clean-doc-dir clean-doc-omf: ; rm -f $(_DOC_OMF_DB) $(_DOC_OMF_HTML) clean-doc-dsk: ; rm -f $(_DOC_DSK_DB) $(_DOC_DSK_HTML) clean-doc-lc: rm -f $(_DOC_LC_DOCS) rm -f $(_DOC_MOFILES) @list='$(_DOC_POFILES)'; for po in $$list; do \ if ! test "$$po" -ef "$(srcdir)/$$po"; then \ echo "rm -f $$po"; \ rm -f "$$po"; \ fi; \ done # .xml2.po.mo cleaning is obsolete as of 0.18.1 and could be removed in 0.20.x @for lc in C $(_DOC_REAL_LINGUAS); do \ if test -f "$$lc/.xml2po.mo"; then \ echo "rm -f $$lc/.xml2po.mo"; \ rm -f "$$lc/.xml2po.mo"; \ fi; \ done clean-doc-dir: clean-doc-lc @for lc in C $(_DOC_REAL_LINGUAS); do \ for dir in `find $$lc -depth -type d`; do \ if ! test $$dir -ef $(srcdir)/$$dir; then \ echo "rmdir $$dir"; \ rmdir "$$dir"; \ fi; \ done; \ done clean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) distclean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) mostlyclean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) maintainer-clean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) ################################################################################ .PHONY: dist-doc-docs dist-doc-pages dist-doc-figs dist-doc-omf dist-doc-dsk doc-dist-hook: \ $(if $(DOC_MODULE)$(DOC_ID),dist-doc-docs) \ $(if $(_DOC_C_FIGURES),dist-doc-figs) \ $(if $(_DOC_OMF_IN),dist-doc-omf) # $(if $(_DOC_DSK_IN),dist-doc-dsk) dist-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES) @for lc in C $(_DOC_REAL_LINGUAS); do \ echo " $(mkinstalldirs) $(distdir)/$$lc"; \ $(mkinstalldirs) "$(distdir)/$$lc"; \ done @list='$(_DOC_C_DOCS)'; \ for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$docdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ $(mkinstalldirs) "$(distdir)/$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ done @list='$(_DOC_LC_DOCS)'; \ for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$docdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ $(mkinstalldirs) "$(distdir)/$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ done @list='$(_DOC_POFILES)'; \ for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$docdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ $(mkinstalldirs) "$(distdir)/$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ done dist-doc-figs: $(_DOC_SRC_FIGURES) @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; \ for fig in $$list; do \ if test -f "$$fig"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$fig"; then \ figdir=`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$figdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$figdir"; \ $(mkinstalldirs) "$(distdir)/$$figdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$fig $(distdir)/$$fig"; \ $(INSTALL_DATA) "$$d$$fig" "$(distdir)/$$fig"; \ fi; \ done; dist-doc-omf: @if test -f "$(_DOC_OMF_IN)"; then d=; else d="$(srcdir)/"; fi; \ echo "$(INSTALL_DATA) $$d$(_DOC_OMF_IN) $(distdir)/$(notdir $(_DOC_OMF_IN))"; \ $(INSTALL_DATA) "$$d$(_DOC_OMF_IN)" "$(distdir)/$(notdir $(_DOC_OMF_IN))" dist-doc-dsk: @if test -f "$(_DOC_DSK_IN)"; then d=; else d="$(srcdir)/"; fi; \ echo "$(INSTALL_DATA) $$d$(_DOC_DSK_IN) $(distdir)/$(notdir $(_DOC_DSK_IN))"; \ $(INSTALL_DATA) "$$d$(_DOC_DSK_IN)" "$(distdir)/$(notdir $(_DOC_DSK_IN))" ################################################################################ .PHONY: check-doc-docs check-doc-omf check: \ $(if $(DOC_MODULE),check-doc-docs) \ $(if $(DOC_ID),check-doc-pages) \ $(if $(_DOC_OMF_IN),check-doc-omf) check-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) @for lc in C $(_DOC_REAL_LINGUAS); do \ if test -f "$$lc"; \ then d=; \ xmlpath="$$lc"; \ else \ d="$(srcdir)/"; \ xmlpath="$$lc:$(srcdir)/$$lc"; \ fi; \ echo "xmllint --noout --noent --path $$xmlpath --xinclude --postvalid $$d$$lc/$(DOC_MODULE).xml"; \ xmllint --noout --noent --path "$$xmlpath" --xinclude --postvalid "$$d$$lc/$(DOC_MODULE).xml"; \ done check-doc-pages: $(_DOC_C_PAGES) $(_DOC_LC_PAGES) for lc in C $(_DOC_REAL_LINGUAS); do \ if test -f "$$lc"; \ then d=; \ xmlpath="$$lc"; \ else \ d="$(srcdir)/"; \ xmlpath="$$lc:$(srcdir)/$$lc"; \ fi; \ for page in $(DOC_PAGES); do \ echo "xmllint --noout --noent --path $$xmlpath --xinclude $$d$$lc/$$page"; \ xmllint --noout --noent --path "$$xmlpath" --xinclude "$$d$$lc/$$page"; \ done; \ done check-doc-omf: $(_DOC_OMF_ALL) @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ echo "xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf"; \ xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf; \ done ################################################################################ .PHONY: install-doc-docs install-doc-html install-doc-figs install-doc-omf install-doc-dsk install-data-local: \ $(if $(DOC_MODULE)$(DOC_ID),install-doc-docs) \ $(if $(_DOC_HTML_ALL),install-doc-html) \ $(if $(_DOC_C_FIGURES),install-doc-figs) \ $(if $(_DOC_OMF_IN),install-doc-omf) # $(if $(_DOC_DSK_IN),install-doc-dsk) install-doc-docs: @for lc in C $(_DOC_REAL_LINGUAS); do \ echo "$(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc"; \ $(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc; \ done @list='$(_DOC_C_DOCS)'; for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ if ! test -d "$$docdir"; then \ echo "$(mkinstalldirs) $$docdir"; \ $(mkinstalldirs) "$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ done @list='$(_DOC_LC_DOCS)'; for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ if ! test -d "$$docdir"; then \ echo "$(mkinstalldirs) $$docdir"; \ $(mkinstalldirs) "$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ done install-doc-figs: @list='$(patsubst C/%,%,$(_DOC_C_FIGURES))'; for fig in $$list; do \ for lc in C $(_DOC_REAL_LINGUAS); do \ figsymlink=false; \ if test -f "$$lc/$$fig"; then \ figfile="$$lc/$$fig"; \ elif test -f "$(srcdir)/$$lc/$$fig"; then \ figfile="$(srcdir)/$$lc/$$fig"; \ else \ figsymlink=true; \ fi; \ figdir="$$lc/"`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ figdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$figdir"; \ if ! test -d "$$figdir"; then \ echo "$(mkinstalldirs) $$figdir"; \ $(mkinstalldirs) "$$figdir"; \ fi; \ figbase=`echo $$fig | sed -e 's/^.*\///'`; \ if $$figsymlink; then \ echo "cd $$figdir && $(LN_S) -f $(HELP_DIR)/$(_doc_install_dir)/C/$$fig $$figbase"; \ ( cd "$$figdir" && $(LN_S) -f "$(HELP_DIR)/$(_doc_install_dir)/C/$$fig" "$$figbase" ); \ else \ echo "$(INSTALL_DATA) $$figfile $$figdir$$figbase"; \ $(INSTALL_DATA) "$$figfile" "$$figdir$$figbase"; \ fi; \ done; \ done install-doc-html: echo install-html install-doc-omf: $(mkinstalldirs) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir) @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ echo "$(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ $(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf; \ done @if test "x$(_ENABLE_SK)" = "xtrue"; then \ echo "scrollkeeper-update -p $(DESTDIR)$(_sklocalstatedir) -o $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ scrollkeeper-update -p "$(DESTDIR)$(_sklocalstatedir)" -o "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ fi; install-doc-dsk: echo install-dsk ################################################################################ .PHONY: uninstall-doc-docs uninstall-doc-html uninstall-doc-figs uninstall-doc-omf uninstall-doc-dsk uninstall-local: \ $(if $(DOC_MODULE)$(DOC_ID),uninstall-doc-docs) \ $(if $(_DOC_HTML_ALL),uninstall-doc-html) \ $(if $(_DOC_C_FIGURES),uninstall-doc-figs) \ $(if $(_DOC_OMF_IN),uninstall-doc-omf) # $(if $(_DOC_DSK_IN),uninstall-doc-dsk) uninstall-doc-docs: @list='$(_DOC_C_DOCS)'; for doc in $$list; do \ echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ done @list='$(_DOC_LC_DOCS)'; for doc in $$list; do \ echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ done uninstall-doc-figs: @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; for fig in $$list; do \ echo "rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ done; uninstall-doc-omf: @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ if test "x$(_ENABLE_SK)" = "xtrue"; then \ echo "scrollkeeper-uninstall -p $(_sklocalstatedir) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ scrollkeeper-uninstall -p "$(_sklocalstatedir)" "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ fi; \ echo "rm -f $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ rm -f "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ done dist-hook: doc-dist-hook # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: glom-1.22.4/docs/user-guide/Makefile.am0000644000175000017500000000152012234776363021034 0ustar00murraycmurrayc00000000000000AUTOMAKE_OPTIONS = -Wno-portability include $(top_srcdir)/gnome-doc-utils.make dist-hook: doc-dist-hook DOC_MODULE = glom DOC_ENTITIES = DOC_INCLUDES = legal.xml DOC_FIGURES = \ figures/glom_data_details.png \ figures/glom_design_layout_details.png \ figures/glom_design_reports.png \ figures/glom_tables.png \ figures/glom_data_list.png \ figures/glom_design_layout_list.png \ figures/glom_design_reports_vertical_group.png \ figures/glom_import.png \ figures/glom_initial_dialog_local_network.png \ figures/start_open.png \ figures/start_create.png \ figures/glom_design_fields_dialog_calculated.png \ figures/glom_design_reports_details.png \ figures/glom_design_translations.png \ figures/glom_design_fields.png \ figures/glom_design_reports_group_by.png \ figures/glom_report_result.png DOC_LINGUAS = de en_GB es fr sl sv glom-1.22.4/docs/pyglom_reference/0000755000175000017500000000000012235000130020223 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/pyglom_reference/index.rst.in0000644000175000017500000000141012234252645022510 0ustar00murraycmurrayc00000000000000.. glom_1_16 documentation master file, created by sphinx-quickstart on Fri Apr 16 16:21:26 2010. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Glom Python Documentation ===================================== This API may be used in Glom field calculations or button scripts. Field calculations have a :class:`glom_@GLOM_ABI_VERSION_UNDERLINED@.Record` parameter. Button scripts have a :class:`glom_@GLOM_ABI_VERSION_UNDERLINED@.Record` parameter and a :class:`glom_@GLOM_ABI_VERSION_UNDERLINED@.UI` parameter. .. toctree:: :maxdepth: 3 .. automodule:: glom_@GLOM_ABI_VERSION_UNDERLINED@ :members: :undoc-members: Indices and tables ================== * :ref:`genindex` * :ref:`search` glom-1.22.4/docs/pyglom_reference/html/0000755000175000017500000000000012235000130021167 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/pyglom_reference/html/index.html0000644000175000017500000004645212234777150023225 0ustar00murraycmurrayc00000000000000 Glom Python Documentation — glom_1.22 1.22.4 documentation

Glom Python Documentation¶

This API may be used in Glom field calculations or button scripts. Field calculations have a glom_1_22.Record parameter. Button scripts have a glom_1_22.Record parameter and a glom_1_22.UI parameter.

class glom_1_22.Record¶

This is the current record of the current table. A Record object is passed to field calculations and button scripts, providing access to the values of the fields in that record. The Record object passed to field calculations is read-only.

Field values

Use record[‘field_name’] to get the value of a specified field in the current record. For instance, this concatenates the values of the name_first and name_last fields in the current record.

record['name_first'] + ' ' + record['name_last']

You may also use this syntax to set the value of a field in the current record. This is possible in a button script, but not in a field calculation. For instance, this sets the value of the name_first field in the current record.

record['name_first'] = 'Bob'
Related Records
Use the related attribute to access related records via a relationship.
Testing for Empty Values

How you test for empty values depends on the type of field.

Non-Text Fields

Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0. You can test whether a field is empty by using Python’s None. For instance.

if(record['contact_id'] == None):
    return 'No Contact'
else:
    return record.related['contacts']['name_full']
Text Fields

For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance:

if(record['name_full'] == ''):
    return 'No Name'
else:
    return record['name_full']
connection¶

The current database connection for use with the gi.repository.Gda API. This is a Gda.Connection object.

related¶

Related records. Use the [‘relationship_name’] notation with this object.

table_name¶

The name of the current table as a string.

class glom_1_22.Related¶

This object provides access to related records via its [] syntax, which takes a relationship name and returns a RelatedRecord. For instance, this provides the related records for the current record, via the Record.related attribute

record.related['location']
class glom_1_22.RelatedRecord¶

One or more related records, returned by the [] syntax on a Related object, such as the Record.related attribute.

Single Related Records

For relationships that specify a single record, you can get the value of a field in that record by using the [] synax, providing a field name. For instance, this is the value of the name field in the table indicated by the location relationship (often called location::name).

record.related['location']['name']
Multiple Related Records

For relationships that specify multiple records, you can use the aggregate functions to get overall values. For instance, this provides the sum of all total_price values from all of the lines of the current invoice record. See the RelatedRecord class for more aggregate functions.

record.related['invoice_lines'].sum('total_price')
count()¶

Count all values in the field in the related records.

Parameters:field_name (string) – The name of the field.
Returns:The summarized value.
max()¶

Maximum of all values of the field in the related records.

Parameters:field_name (string) – The name of the field.
Returns:The summarized value.
min()¶

Minimum of all values of the field in the related records.

Parameters:field_name (string) – The name of the field.
Returns:The summarized value.
sum()¶

Add all values of the field in the related records.

Parameters:field_name (string) – The name of the field.
Returns:The summarized value.
class glom_1_22.UI¶

A collection of methods to programatically change the Glom UI, performing some tasks that might otherwise be done by the user via the mouse and keyboard. A UI object is passed to button scripts, allowing them to control the user interface.

print_layout()¶

Print the current layout for the current table.

print_report()¶

Print the specified report for the current table.

Parameters:report_name (string) – The name of the report to print.
show_table_details()¶

Navigate to the specified table, showing its details view for the specified record.

Parameters:
  • table_name (string) – The name of the table to navigate to.
  • primary_key_value – The value of the primary key field in the record to navigate to.
show_table_list()¶

Navigate to the specified table, showing its list view.

Parameters:table_name – The name of the table to navigate to. :type table_name: string
start_new_record()¶

Start a new empty record for the current table, offering the empty record in the UI.

Indices and tables¶

Table Of Contents

glom-1.22.4/docs/pyglom_reference/html/genindex.html0000644000175000017500000001441012234777150023704 0ustar00murraycmurrayc00000000000000 Index — glom_1.22 1.22.4 documentation glom-1.22.4/docs/pyglom_reference/html/_static/0000755000175000017500000000000012235000130022615 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/pyglom_reference/html/_static/pygments.css0000644000175000017500000000753412234777150025234 0ustar00murraycmurrayc00000000000000.highlight .hll { background-color: #ffffcc } .highlight { background: #eeffcc; } .highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */ .highlight .o { color: #666666 } /* Operator */ .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #007020 } /* Comment.Preproc */ .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .go { color: #333333 } /* Generic.Output */ .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #0044DD } /* Generic.Traceback */ .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #007020 } /* Keyword.Pseudo */ .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #902000 } /* Keyword.Type */ .highlight .m { color: #208050 } /* Literal.Number */ .highlight .s { color: #4070a0 } /* Literal.String */ .highlight .na { color: #4070a0 } /* Name.Attribute */ .highlight .nb { color: #007020 } /* Name.Builtin */ .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ .highlight .no { color: #60add5 } /* Name.Constant */ .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ .highlight .ne { color: #007020 } /* Name.Exception */ .highlight .nf { color: #06287e } /* Name.Function */ .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #bb60d5 } /* Name.Variable */ .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mf { color: #208050 } /* Literal.Number.Float */ .highlight .mh { color: #208050 } /* Literal.Number.Hex */ .highlight .mi { color: #208050 } /* Literal.Number.Integer */ .highlight .mo { color: #208050 } /* Literal.Number.Oct */ .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ .highlight .sc { color: #4070a0 } /* Literal.String.Char */ .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ .highlight .sx { color: #c65d09 } /* Literal.String.Other */ .highlight .sr { color: #235388 } /* Literal.String.Regex */ .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ .highlight .ss { color: #517918 } /* Literal.String.Symbol */ .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */glom-1.22.4/docs/pyglom_reference/html/_static/websupport.js0000644000175000017500000006123611653721004025412 0ustar00murraycmurrayc00000000000000/* * websupport.js * ~~~~~~~~~~~~~ * * sphinx.websupport utilties for all documentation. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ (function($) { $.fn.autogrow = function() { return this.each(function() { var textarea = this; $.fn.autogrow.resize(textarea); $(textarea) .focus(function() { textarea.interval = setInterval(function() { $.fn.autogrow.resize(textarea); }, 500); }) .blur(function() { clearInterval(textarea.interval); }); }); }; $.fn.autogrow.resize = function(textarea) { var lineHeight = parseInt($(textarea).css('line-height'), 10); var lines = textarea.value.split('\n'); var columns = textarea.cols; var lineCount = 0; $.each(lines, function() { lineCount += Math.ceil(this.length / columns) || 1; }); var height = lineHeight * (lineCount + 1); $(textarea).css('height', height); }; })(jQuery); (function($) { var comp, by; function init() { initEvents(); initComparator(); } function initEvents() { $('a.comment-close').live("click", function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }); $('a.vote').live("click", function(event) { event.preventDefault(); handleVote($(this)); }); $('a.reply').live("click", function(event) { event.preventDefault(); openReply($(this).attr('id').substring(2)); }); $('a.close-reply').live("click", function(event) { event.preventDefault(); closeReply($(this).attr('id').substring(2)); }); $('a.sort-option').live("click", function(event) { event.preventDefault(); handleReSort($(this)); }); $('a.show-proposal').live("click", function(event) { event.preventDefault(); showProposal($(this).attr('id').substring(2)); }); $('a.hide-proposal').live("click", function(event) { event.preventDefault(); hideProposal($(this).attr('id').substring(2)); }); $('a.show-propose-change').live("click", function(event) { event.preventDefault(); showProposeChange($(this).attr('id').substring(2)); }); $('a.hide-propose-change').live("click", function(event) { event.preventDefault(); hideProposeChange($(this).attr('id').substring(2)); }); $('a.accept-comment').live("click", function(event) { event.preventDefault(); acceptComment($(this).attr('id').substring(2)); }); $('a.delete-comment').live("click", function(event) { event.preventDefault(); deleteComment($(this).attr('id').substring(2)); }); $('a.comment-markup').live("click", function(event) { event.preventDefault(); toggleCommentMarkupBox($(this).attr('id').substring(2)); }); } /** * Set comp, which is a comparator function used for sorting and * inserting comments into the list. */ function setComparator() { // If the first three letters are "asc", sort in ascending order // and remove the prefix. if (by.substring(0,3) == 'asc') { var i = by.substring(3); comp = function(a, b) { return a[i] - b[i]; }; } else { // Otherwise sort in descending order. comp = function(a, b) { return b[by] - a[by]; }; } // Reset link styles and format the selected sort option. $('a.sel').attr('href', '#').removeClass('sel'); $('a.by' + by).removeAttr('href').addClass('sel'); } /** * Create a comp function. If the user has preferences stored in * the sortBy cookie, use those, otherwise use the default. */ function initComparator() { by = 'rating'; // Default to sort by rating. // If the sortBy cookie is set, use that instead. if (document.cookie.length > 0) { var start = document.cookie.indexOf('sortBy='); if (start != -1) { start = start + 7; var end = document.cookie.indexOf(";", start); if (end == -1) { end = document.cookie.length; by = unescape(document.cookie.substring(start, end)); } } } setComparator(); } /** * Show a comment div. */ function show(id) { $('#ao' + id).hide(); $('#ah' + id).show(); var context = $.extend({id: id}, opts); var popup = $(renderTemplate(popupTemplate, context)).hide(); popup.find('textarea[name="proposal"]').hide(); popup.find('a.by' + by).addClass('sel'); var form = popup.find('#cf' + id); form.submit(function(event) { event.preventDefault(); addComment(form); }); $('#s' + id).after(popup); popup.slideDown('fast', function() { getComments(id); }); } /** * Hide a comment div. */ function hide(id) { $('#ah' + id).hide(); $('#ao' + id).show(); var div = $('#sc' + id); div.slideUp('fast', function() { div.remove(); }); } /** * Perform an ajax request to get comments for a node * and insert the comments into the comments tree. */ function getComments(id) { $.ajax({ type: 'GET', url: opts.getCommentsURL, data: {node: id}, success: function(data, textStatus, request) { var ul = $('#cl' + id); var speed = 100; $('#cf' + id) .find('textarea[name="proposal"]') .data('source', data.source); if (data.comments.length === 0) { ul.html('
  • No comments yet.
  • '); ul.data('empty', true); } else { // If there are comments, sort them and put them in the list. var comments = sortComments(data.comments); speed = data.comments.length * 100; appendComments(comments, ul); ul.data('empty', false); } $('#cn' + id).slideUp(speed + 200); ul.slideDown(speed); }, error: function(request, textStatus, error) { showError('Oops, there was a problem retrieving the comments.'); }, dataType: 'json' }); } /** * Add a comment via ajax and insert the comment into the comment tree. */ function addComment(form) { var node_id = form.find('input[name="node"]').val(); var parent_id = form.find('input[name="parent"]').val(); var text = form.find('textarea[name="comment"]').val(); var proposal = form.find('textarea[name="proposal"]').val(); if (text == '') { showError('Please enter a comment.'); return; } // Disable the form that is being submitted. form.find('textarea,input').attr('disabled', 'disabled'); // Send the comment to the server. $.ajax({ type: "POST", url: opts.addCommentURL, dataType: 'json', data: { node: node_id, parent: parent_id, text: text, proposal: proposal }, success: function(data, textStatus, error) { // Reset the form. if (node_id) { hideProposeChange(node_id); } form.find('textarea') .val('') .add(form.find('input')) .removeAttr('disabled'); var ul = $('#cl' + (node_id || parent_id)); if (ul.data('empty')) { $(ul).empty(); ul.data('empty', false); } insertComment(data.comment); var ao = $('#ao' + node_id); ao.find('img').attr({'src': opts.commentBrightImage}); if (node_id) { // if this was a "root" comment, remove the commenting box // (the user can get it back by reopening the comment popup) $('#ca' + node_id).slideUp(); } }, error: function(request, textStatus, error) { form.find('textarea,input').removeAttr('disabled'); showError('Oops, there was a problem adding the comment.'); } }); } /** * Recursively append comments to the main comment list and children * lists, creating the comment tree. */ function appendComments(comments, ul) { $.each(comments, function() { var div = createCommentDiv(this); ul.append($(document.createElement('li')).html(div)); appendComments(this.children, div.find('ul.comment-children')); // To avoid stagnating data, don't store the comments children in data. this.children = null; div.data('comment', this); }); } /** * After adding a new comment, it must be inserted in the correct * location in the comment tree. */ function insertComment(comment) { var div = createCommentDiv(comment); // To avoid stagnating data, don't store the comments children in data. comment.children = null; div.data('comment', comment); var ul = $('#cl' + (comment.node || comment.parent)); var siblings = getChildren(ul); var li = $(document.createElement('li')); li.hide(); // Determine where in the parents children list to insert this comment. for(i=0; i < siblings.length; i++) { if (comp(comment, siblings[i]) <= 0) { $('#cd' + siblings[i].id) .parent() .before(li.html(div)); li.slideDown('fast'); return; } } // If we get here, this comment rates lower than all the others, // or it is the only comment in the list. ul.append(li.html(div)); li.slideDown('fast'); } function acceptComment(id) { $.ajax({ type: 'POST', url: opts.acceptCommentURL, data: {id: id}, success: function(data, textStatus, request) { $('#cm' + id).fadeOut('fast'); $('#cd' + id).removeClass('moderate'); }, error: function(request, textStatus, error) { showError('Oops, there was a problem accepting the comment.'); } }); } function deleteComment(id) { $.ajax({ type: 'POST', url: opts.deleteCommentURL, data: {id: id}, success: function(data, textStatus, request) { var div = $('#cd' + id); if (data == 'delete') { // Moderator mode: remove the comment and all children immediately div.slideUp('fast', function() { div.remove(); }); return; } // User mode: only mark the comment as deleted div .find('span.user-id:first') .text('[deleted]').end() .find('div.comment-text:first') .text('[deleted]').end() .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) .remove(); var comment = div.data('comment'); comment.username = '[deleted]'; comment.text = '[deleted]'; div.data('comment', comment); }, error: function(request, textStatus, error) { showError('Oops, there was a problem deleting the comment.'); } }); } function showProposal(id) { $('#sp' + id).hide(); $('#hp' + id).show(); $('#pr' + id).slideDown('fast'); } function hideProposal(id) { $('#hp' + id).hide(); $('#sp' + id).show(); $('#pr' + id).slideUp('fast'); } function showProposeChange(id) { $('#pc' + id).hide(); $('#hc' + id).show(); var textarea = $('#pt' + id); textarea.val(textarea.data('source')); $.fn.autogrow.resize(textarea[0]); textarea.slideDown('fast'); } function hideProposeChange(id) { $('#hc' + id).hide(); $('#pc' + id).show(); var textarea = $('#pt' + id); textarea.val('').removeAttr('disabled'); textarea.slideUp('fast'); } function toggleCommentMarkupBox(id) { $('#mb' + id).toggle(); } /** Handle when the user clicks on a sort by link. */ function handleReSort(link) { var classes = link.attr('class').split(/\s+/); for (var i=0; iThank you! Your comment will show up ' + 'once it is has been approved by a moderator.'); } // Prettify the comment rating. comment.pretty_rating = comment.rating + ' point' + (comment.rating == 1 ? '' : 's'); // Make a class (for displaying not yet moderated comments differently) comment.css_class = comment.displayed ? '' : ' moderate'; // Create a div for this comment. var context = $.extend({}, opts, comment); var div = $(renderTemplate(commentTemplate, context)); // If the user has voted on this comment, highlight the correct arrow. if (comment.vote) { var direction = (comment.vote == 1) ? 'u' : 'd'; div.find('#' + direction + 'v' + comment.id).hide(); div.find('#' + direction + 'u' + comment.id).show(); } if (opts.moderator || comment.text != '[deleted]') { div.find('a.reply').show(); if (comment.proposal_diff) div.find('#sp' + comment.id).show(); if (opts.moderator && !comment.displayed) div.find('#cm' + comment.id).show(); if (opts.moderator || (opts.username == comment.username)) div.find('#dc' + comment.id).show(); } return div; } /** * A simple template renderer. Placeholders such as <%id%> are replaced * by context['id'] with items being escaped. Placeholders such as <#id#> * are not escaped. */ function renderTemplate(template, context) { var esc = $(document.createElement('div')); function handle(ph, escape) { var cur = context; $.each(ph.split('.'), function() { cur = cur[this]; }); return escape ? esc.text(cur || "").html() : cur; } return template.replace(/<([%#])([\w\.]*)\1>/g, function() { return handle(arguments[2], arguments[1] == '%' ? true : false); }); } /** Flash an error message briefly. */ function showError(message) { $(document.createElement('div')).attr({'class': 'popup-error'}) .append($(document.createElement('div')) .attr({'class': 'error-message'}).text(message)) .appendTo('body') .fadeIn("slow") .delay(2000) .fadeOut("slow"); } /** Add a link the user uses to open the comments popup. */ $.fn.comment = function() { return this.each(function() { var id = $(this).attr('id').substring(1); var count = COMMENT_METADATA[id]; var title = count + ' comment' + (count == 1 ? '' : 's'); var image = count > 0 ? opts.commentBrightImage : opts.commentImage; var addcls = count == 0 ? ' nocomment' : ''; $(this) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-open' + addcls, id: 'ao' + id }) .append($(document.createElement('img')).attr({ src: image, alt: 'comment', title: title })) .click(function(event) { event.preventDefault(); show($(this).attr('id').substring(2)); }) ) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-close hidden', id: 'ah' + id }) .append($(document.createElement('img')).attr({ src: opts.closeCommentImage, alt: 'close', title: 'close' })) .click(function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }) ); }); }; var opts = { processVoteURL: '/_process_vote', addCommentURL: '/_add_comment', getCommentsURL: '/_get_comments', acceptCommentURL: '/_accept_comment', deleteCommentURL: '/_delete_comment', commentImage: '/static/_static/comment.png', closeCommentImage: '/static/_static/comment-close.png', loadingImage: '/static/_static/ajax-loader.gif', commentBrightImage: '/static/_static/comment-bright.png', upArrow: '/static/_static/up.png', downArrow: '/static/_static/down.png', upArrowPressed: '/static/_static/up-pressed.png', downArrowPressed: '/static/_static/down-pressed.png', voting: false, moderator: false }; if (typeof COMMENT_OPTIONS != "undefined") { opts = jQuery.extend(opts, COMMENT_OPTIONS); } var popupTemplate = '\
    \

    \ Sort by:\ best rated\ newest\ oldest\

    \
    Comments
    \
    \ loading comments...
    \
      \
      \

      Add a comment\ (markup):

      \
      \ reStructured text markup: *emph*, **strong**, \ ``code``, \ code blocks: :: and an indented block after blank line
      \
      \ \

      \ \ Propose a change ▹\ \ \ Propose a change ▿\ \

      \ \ \ \ \
      \
      \
      '; var commentTemplate = '\
      \
      \
      \ \ \ \ \ \ \
      \
      \ \ \ \ \ \ \
      \
      \
      \

      \ <%username%>\ <%pretty_rating%>\ <%time.delta%>\

      \
      <#text#>
      \

      \ \ reply ▿\ proposal ▹\ proposal ▿\ \ \

      \
      \
      <#proposal_diff#>\
              
      \
        \
        \
        \
        \ '; var replyTemplate = '\
      • \
        \
        \ \ \ \ \ \
        \
        \
      • '; $(document).ready(function() { init(); }); })(jQuery); $(document).ready(function() { // add comment anchors for all paragraphs that are commentable $('.sphinx-has-comment').comment(); // highlight search words in search results $("div.context").each(function() { var params = $.getQueryParameters(); var terms = (params.q) ? params.q[0].split(/\s+/) : []; var result = $(this); $.each(terms, function() { result.highlightText(this.toLowerCase(), 'highlighted'); }); }); // directly open comment window if requested var anchor = document.location.hash; if (anchor.substring(0, 9) == '#comment-') { $('#ao' + anchor.substring(9)).click(); document.location.hash = '#s' + anchor.substring(9); } }); glom-1.22.4/docs/pyglom_reference/html/_static/plus.png0000644000175000017500000000030711644410761024330 0ustar00murraycmurrayc00000000000000‰PNG  IHDR &Îàq pHYs  šœtIME× 1l9tEXtCommentöÌ–¿RIDATÓczô(BÅñãÇáÒpö¿ÿ¨èˆip»‘¹P÷îÝÃc· ¸ |¶IEND®B`‚glom-1.22.4/docs/pyglom_reference/html/_static/jquery.js0000644000175000017500000075571712165551476024552 0ustar00murraycmurrayc00000000000000/*! * jQuery JavaScript Library v1.7.2 * http://jquery.com/ * * Copyright 2011, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Fri Jul 5 14:07:58 UTC 2013 */ (function( window, undefined ) { // Use the correct document accordingly with window argument (sandbox) var document = window.document, navigator = window.navigator, location = window.location; var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // A central reference to the root jQuery(document) rootjQuery, // A simple way to check for HTML strings or ID strings // Prioritize #id over to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.2", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { return obj != null && obj == obj.window; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { if ( typeof data !== "string" || !data ) { return null; } var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, fn, key, value, chainable, emptyGet, pass ) { var exec, bulk = key == null, i = 0, length = elems.length; // Sets many values if ( key && typeof key === "object" ) { for ( i in key ) { jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); } chainable = 1; // Sets one value } else if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = pass === undefined && jQuery.isFunction( value ); if ( bulk ) { // Bulk operations only iterate when executing function values if ( exec ) { exec = fn; fn = function( elem, key, value ) { return exec.call( jQuery( elem ), value ); }; // Otherwise they run against the entire set } else { fn.call( elems, value ); fn = null; } } if ( fn ) { for (; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } } chainable = 1; } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; fired = true; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
        a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true, pixelMargin: true }; // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute input.setAttribute( "name", "t" ); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for ( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, paddingMarginBorderVisibility, paddingMarginBorder, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; paddingMarginBorder = "padding:0;margin:0;border:"; positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; html = "
        " + "" + "
        "; container = document.createElement("div"); container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
        t
        "; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { div.innerHTML = ""; marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.innerHTML = ""; div.style.width = div.style.padding = "1px"; div.style.border = 0; div.style.overflow = "hidden"; div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = "block"; div.style.overflow = "visible"; div.innerHTML = "
        "; support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); if ( window.getComputedStyle ) { div.style.marginTop = "1%"; support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; } if ( typeof container.style.zoom !== "undefined" ) { container.style.zoom = 1; } body.removeChild( container ); marginDiv = div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, part, attr, name, l, elem = this[0], i = 0, data = null; // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { attr = elem.attributes; for ( l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( elem, name, data[ name ] ); } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split( ".", 2 ); parts[1] = parts[1] ? "." + parts[1] : ""; part = parts[1] + "!"; return jQuery.access( this, function( value ) { if ( value === undefined ) { data = this.triggerHandler( "getData" + part, [ parts[0] ] ); // Try to fetch any internally stored data first if ( data === undefined && elem ) { data = jQuery.data( elem, key ); data = dataAttr( elem, key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } parts[1] = value; this.each(function() { var self = jQuery( this ); self.triggerHandler( "setData" + part, parts ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + part, parts ); }); }, null, value, arguments.length > 1, null, false ); }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise( object ); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, isBool, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; isBool = rboolean.test( name ); // See #9699 for explanation of this approach (setting first, then removal) // Do not do this for boolean attributes (see #10870) if ( !isBool ) { jQuery.attr( elem, name, "" ); } elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( isBool && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true, coords: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: selector && quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, special = jQuery.event.special[ event.type ] || {}, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers that should run if there are delegated events // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { // Don't process events on disabled elements (#6911, #8165) if ( cur.disabled !== true ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // && selector != null // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; /* falls through */ case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } // Expose origPOS // "global" as in regardless of relation to brackets/parens Expr.match.globalPOS = origPOS; var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

        "; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function( query, context, extra, seed ) { context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { // See if we find a selector to speed up var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { // Speed-up: Sizzle("TAG") if ( match[1] ) { return makeArray( context.getElementsByTagName( query ), extra ); // Speed-up: Sizzle(".CLASS") } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { return makeArray( context.getElementsByClassName( match[2] ), extra ); } } if ( context.nodeType === 9 ) { // Speed-up: Sizzle("body") // The body element only exists once, optimize finding it if ( query === "body" && context.body ) { return makeArray( [ context.body ], extra ); // Speed-up: Sizzle("#ID") } else if ( match && match[3] ) { var elem = context.getElementById( match[3] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id === match[3] ) { return makeArray( [ elem ], extra ); } } else { return makeArray( [], extra ); } } try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { var oldContext = context, old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); } else { nid = nid.replace( /'/g, "\\$&" ); } if ( relativeHierarchySelector && hasParent ) { context = context.parentNode; } try { if ( !relativeHierarchySelector || hasParent ) { return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); } } catch(pseudoError) { } finally { if ( !old ) { oldContext.removeAttribute( "id" ); } } } } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } // release memory in IE div = null; })(); } (function(){ var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9 fails this) var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), pseudoWorks = false; try { // This should fail with an exception // Gecko does not error, returns false instead matches.call( document.documentElement, "[test!='']:sizzle" ); } catch( pseudoError ) { pseudoWorks = true; } Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { var ret = matches.call( node, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || !disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9, so check for that node.document && node.document.nodeType !== 11 ) { return ret; } } } catch(e) {} } return Sizzle(expr, null, null, [node]).length > 0; }; } })(); (function(){ var div = document.createElement("div"); div.innerHTML = "
        "; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function( match, context, isXML ) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; // release memory in IE div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem[ expando ] = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem[ expando ] = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } if ( document.documentElement.contains ) { Sizzle.contains = function( a, b ) { return a !== b && (a.contains ? a.contains(b) : true); }; } else if ( document.documentElement.compareDocumentPosition ) { Sizzle.contains = function( a, b ) { return !!(a.compareDocumentPosition(b) & 16); }; } else { Sizzle.contains = function() { return false; }; } Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function( selector, context, seed ) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet, seed ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE // Override sizzle attribute retrieval Sizzle.attr = jQuery.attr; Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.globalPOS, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var self = this, i, l; if ( typeof selector !== "string" ) { return jQuery( selector ).filter(function() { for ( i = 0, l = self.length; i < l; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }); } var ret = this.pushStack( "", "find", selector ), length, n, r; for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( n = length; n < ret.length; n++ ) { for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && ( typeof selector === "string" ? // If this is a positional selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". POS.test( selector ) ? jQuery( selector, this.context ).index( this[0] ) >= 0 : jQuery.filter( selector, this ).length > 0 : this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; // Array (deprecated as of jQuery 1.7) if ( jQuery.isArray( selectors ) ) { var level = 1; while ( cur && cur.ownerDocument && cur !== context ) { for ( i = 0; i < selectors.length; i++ ) { if ( jQuery( cur ).is( selectors[ i ] ) ) { ret.push({ selector: selectors[ i ], elem: cur, level: level }); } } cur = cur.parentNode; level++; } return ret; } // String var pos = POS.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; while ( cur ) { if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { ret.push( cur ); break; } else { cur = cur.parentNode; if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } ret = ret.length > 1 ? jQuery.unique( ret ) : ret; return this.pushStack( ret, "closest", selectors ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call( arguments ).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { // Can't pass null or undefined to indexOf in Firefox 4 // Set to 0 to skip string check qualifier = qualifier || 0; if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); return retVal === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return ( elem === qualifier ) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; }); } function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /]", "i"), // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptType = /\/(java|ecma)script/i, rcleanScript = /^\s*", "" ], legend: [ 1, "
        ", "
        " ], thead: [ 1, "", "
        " ], tr: [ 2, "", "
        " ], td: [ 3, "", "
        " ], col: [ 2, "", "
        " ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }, safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and

        Search

        Please activate JavaScript to enable the search functionality.

        From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

        glom-1.22.4/docs/pyglom_reference/html/objects.inv0000644000175000017500000000060412234777150023364 0ustar00murraycmurrayc00000000000000# Sphinx inventory version 2 # Project: glom_1.22 # Version: 1.22.4 # The remainder of this file is compressed using zlib. xÚ“ÁjÃ0Dïù A{µ©sÌäP()=‹µ´Ø‚•6Hk’ü}ãÊ©(©œëjžgvdy¶.X<«$vGÐ"©ªQÇK姃ºO/êí@¨öãhÓaøºM'"KB4ý½0Ï&Ùg|@‡›ŽØëFo·×;ŸßÔâ£yV½ªjÖÖ4툂”T³$î¥_û: DÑO:þr¥gû<  ÍVuü3˜‡s6Æìù¤ZBmQÀQ*Fѹnwä(¥PQ{Ó†C@#ŽÃHHtí XÐCñÍË“KòL׆‡ ++#¸ðPìöc“C𸶋Û?áB‘áâEüŸ*Îu¯ôà’¾MiBglom-1.22.4/docs/pyglom_reference/html/_sources/0000755000175000017500000000000012235000130023011 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/pyglom_reference/html/_sources/index.txt0000644000175000017500000000124412234777136024714 0ustar00murraycmurrayc00000000000000.. glom_1_16 documentation master file, created by sphinx-quickstart on Fri Apr 16 16:21:26 2010. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Glom Python Documentation ===================================== This API may be used in Glom field calculations or button scripts. Field calculations have a :class:`glom_1_22.Record` parameter. Button scripts have a :class:`glom_1_22.Record` parameter and a :class:`glom_1_22.UI` parameter. .. toctree:: :maxdepth: 3 .. automodule:: glom_1_22 :members: :undoc-members: Indices and tables ================== * :ref:`genindex` * :ref:`search` glom-1.22.4/docs/pyglom_reference/html/searchindex.js0000644000175000017500000000410612234777150024051 0ustar00murraycmurrayc00000000000000Search.setIndex({objects:{"":{glom_1_22:[0,0,1,""]},"glom_1_22.Record":{connection:[0,3,1,""],table_name:[0,3,1,""],related:[0,3,1,""]},"glom_1_22.UI":{start_new_record:[0,2,1,""],print_report:[0,2,1,""],show_table_details:[0,2,1,""],print_layout:[0,2,1,""],show_table_list:[0,2,1,""]},glom_1_22:{Record:[0,1,1,""],RelatedRecord:[0,1,1,""],UI:[0,1,1,""],Related:[0,1,1,""]},"glom_1_22.RelatedRecord":{count:[0,2,1,""],max:[0,2,1,""],sum:[0,2,1,""],min:[0,2,1,""]}},terms:{all:0,show:0,text:0,becaus:0,contact_id:0,syntax:0,gda:0,keyboard:0,synax:0,paramet:0,current:0,onli:0,depend:0,field:0,name_ful:0,should:0,whether:0,add:0,els:0,might:0,table_nam:0,non:0,"return":0,string:0,get:0,read:0,overal:0,mous:0,invoice_lin:0,field_nam:0,relationship_nam:0,layout:0,name:0,button:0,list:0,show_table_detail:0,collect:0,page:0,view:0,set:0,often:0,some:0,zero:0,connect:0,pass:0,index:0,kei:0,databas:0,sum:0,primari:0,access:0,concaten:0,print_layout:0,between:0,print:0,"new":0,method:0,attribut:0,navig:0,numer:0,relatedrecord:0,repositori:0,distinguish:0,locat:0,print_report:0,valu:0,search:0,length:0,instanc:0,chang:0,mean:0,via:0,name_first:0,api:0,done:0,empti:0,assum:0,summar:0,from:0,script:0,show_table_list:0,"class":0,start:0,call:0,interfac:0,type:0,more:0,"function":0,relationship:0,offer:0,python:0,programat:0,relat:0,specifi:0,ani:0,task:0,line:0,report_nam:0,count:0,notat:0,none:0,total_pric:0,possibl:0,provid:0,also:0,maximum:0,record:0,calcul:0,can:0,absenc:0,report:0,otherwis:0,aggreg:0,control:0,advantag:0,them:0,indic:0,minimum:0,have:0,tabl:0,glom_1_22:0,multipl:0,min:0,perform:0,detail:0,check:0,how:0,take:0,which:0,test:0,you:0,document:0,singl:0,glom:0,see:0,start_new_record:0,object:0,user:0,thi:0,mai:0,bob:0,max:0,primary_key_valu:0,name_last:0,doe:0,contact:0,allow:0,enter:0,invoic:0},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute"},titles:["Glom Python Documentation"],objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"]},filenames:["index"]})glom-1.22.4/docs/pyglom_reference/Makefile.in0000644000175000017500000005332712234777123022330 0ustar00murraycmurrayc00000000000000# Makefile.in generated by automake 1.13.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # pydoc can write docs for all modules in a directory (or a module name), # but doesn't like being given a path to any actual file. # Using pydoc instead: # html: # pydoc -w $(top_builddir)/glom/python_embed/python_module/.libs/ # mkdir html # mv glom_1_22.html html/index.html VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs/pyglom_reference DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/conf.py.in $(srcdir)/index.rst.in \ $(dist_htmlref_DATA) $(dist_htmlref_sources_DATA) \ $(dist_htmlref_static_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/macros/ax_boost_python_murrayc.m4 \ $(top_srcdir)/macros/gettext.m4 \ $(top_srcdir)/macros/gnome-doc-utils.m4 \ $(top_srcdir)/macros/iconv.m4 \ $(top_srcdir)/macros/intlmacosx.m4 \ $(top_srcdir)/macros/intltool.m4 \ $(top_srcdir)/macros/lib-ld.m4 \ $(top_srcdir)/macros/lib-link.m4 \ $(top_srcdir)/macros/lib-prefix.m4 \ $(top_srcdir)/macros/libtool.m4 \ $(top_srcdir)/macros/ltoptions.m4 \ $(top_srcdir)/macros/ltsugar.m4 \ $(top_srcdir)/macros/ltversion.m4 \ $(top_srcdir)/macros/lt~obsolete.m4 \ $(top_srcdir)/macros/mm-pkg.m4 \ $(top_srcdir)/macros/mm-python.m4 $(top_srcdir)/macros/nls.m4 \ $(top_srcdir)/macros/po.m4 $(top_srcdir)/macros/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h \ $(top_builddir)/glom/libglom/libglom_config.h CONFIG_CLEAN_FILES = conf.py index.rst CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(htmlrefdir)" \ "$(DESTDIR)$(htmlref_sourcesdir)" \ "$(DESTDIR)$(htmlref_staticdir)" DATA = $(dist_htmlref_DATA) $(dist_htmlref_sources_DATA) \ $(dist_htmlref_static_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_FLAGS = @ACLOCAL_FLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIB = @DL_LIB@ DOCINSTALL_FLAGS = @DOCINSTALL_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DOT = @DOT@ DOXYGEN = @DOXYGEN@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GENHTML = @GENHTML@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLOM_ABI_VERSION = @GLOM_ABI_VERSION@ GLOM_ABI_VERSION_UNDERLINED = @GLOM_ABI_VERSION_UNDERLINED@ GLOM_CFLAGS = @GLOM_CFLAGS@ GLOM_GZIP = @GLOM_GZIP@ GLOM_LIBS = @GLOM_LIBS@ GLOM_MSGFMT = @GLOM_MSGFMT@ GLOM_TAR = @GLOM_TAR@ GLOM_WFLAGS = @GLOM_WFLAGS@ GLOM_WXXFLAGS = @GLOM_WXXFLAGS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ ISO_CODES_PREFIX = @ISO_CODES_PREFIX@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGLOM_API_VERSION = @LIBGLOM_API_VERSION@ LIBGLOM_CFLAGS = @LIBGLOM_CFLAGS@ LIBGLOM_LIBS = @LIBGLOM_LIBS@ LIBGLOM_MAJOR_VERSION = @LIBGLOM_MAJOR_VERSION@ LIBGLOM_MICRO_VERSION = @LIBGLOM_MICRO_VERSION@ LIBGLOM_MINOR_VERSION = @LIBGLOM_MINOR_VERSION@ LIBGLOM_MODULE_NAME = @LIBGLOM_MODULE_NAME@ LIBGLOM_VERSION = @LIBGLOM_VERSION@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MMDOCTOOLDIR = @MMDOCTOOLDIR@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ book_name = pyglom_$(GLOM_ABI_VERSION_UNDERLINED) # The name of the sub-directory where the generated documentation # will be placed. html_outdir = html # A list of wildcard patterns matching the documentation files to distribute. htmlref_patterns = *.css *.gif *.html *.png *.js *.inv *.txt # Installation directories. libdocdir = $(datarootdir)/doc/$(book_name) referencedir = $(libdocdir)/reference htmlrefdir = $(referencedir)/html htmlref_staticdir = $(htmlrefdir)/_static htmlref_sourcesdir = $(htmlrefdir)/_sources # Function: $(call vpath_listall,PATTERN ...) # Get all filenames which match a PATTERN from the list. Look for files # relative to either the current directory or $(srcdir). Strip $(srcdir)/ # again before returning and remove any duplicates. vpath_srclist = $(patsubst $(srcdir)/%,%,$(wildcard $(addprefix $(srcdir)/,$(1)))) vpath_listall = $(sort $(wildcard $(1)) $(if $(srcdir:.=),$(vpath_srclist))) dist_htmlref_DATA = $(call vpath_listall,$(addprefix $(html_outdir)/,$(htmlref_patterns))) dist_htmlref_static_DATA = $(call vpath_listall,$(addprefix $(html_outdir)/_static/,$(htmlref_patterns))) dist_htmlref_sources_DATA = $(call vpath_listall,$(addprefix $(html_outdir)/_sources/,$(htmlref_patterns))) MAINTAINERCLEANFILES = $(html_outdir)/_sources/* $(html_outdir)/_static/* $(html_outdir)/* all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/pyglom_reference/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/pyglom_reference/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): conf.py: $(top_builddir)/config.status $(srcdir)/conf.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ index.rst: $(top_builddir)/config.status $(srcdir)/index.rst.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_htmlrefDATA: $(dist_htmlref_DATA) @$(NORMAL_INSTALL) @list='$(dist_htmlref_DATA)'; test -n "$(htmlrefdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmlrefdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmlrefdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmlrefdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmlrefdir)" || exit $$?; \ done uninstall-dist_htmlrefDATA: @$(NORMAL_UNINSTALL) @list='$(dist_htmlref_DATA)'; test -n "$(htmlrefdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(htmlrefdir)'; $(am__uninstall_files_from_dir) install-dist_htmlref_sourcesDATA: $(dist_htmlref_sources_DATA) @$(NORMAL_INSTALL) @list='$(dist_htmlref_sources_DATA)'; test -n "$(htmlref_sourcesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmlref_sourcesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmlref_sourcesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmlref_sourcesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmlref_sourcesdir)" || exit $$?; \ done uninstall-dist_htmlref_sourcesDATA: @$(NORMAL_UNINSTALL) @list='$(dist_htmlref_sources_DATA)'; test -n "$(htmlref_sourcesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(htmlref_sourcesdir)'; $(am__uninstall_files_from_dir) install-dist_htmlref_staticDATA: $(dist_htmlref_static_DATA) @$(NORMAL_INSTALL) @list='$(dist_htmlref_static_DATA)'; test -n "$(htmlref_staticdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmlref_staticdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmlref_staticdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmlref_staticdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmlref_staticdir)" || exit $$?; \ done uninstall-dist_htmlref_staticDATA: @$(NORMAL_UNINSTALL) @list='$(dist_htmlref_static_DATA)'; test -n "$(htmlref_staticdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(htmlref_staticdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(htmlrefdir)" "$(DESTDIR)$(htmlref_sourcesdir)" "$(DESTDIR)$(htmlref_staticdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_htmlrefDATA \ install-dist_htmlref_sourcesDATA \ install-dist_htmlref_staticDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_htmlrefDATA \ uninstall-dist_htmlref_sourcesDATA \ uninstall-dist_htmlref_staticDATA .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_htmlrefDATA \ install-dist_htmlref_sourcesDATA \ install-dist_htmlref_staticDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_htmlrefDATA \ uninstall-dist_htmlref_sourcesDATA \ uninstall-dist_htmlref_staticDATA html/index.html: -$(AM_V_at)rm -fr $(html_outdir) $(AM_V_GEN)$(SPHINX_BUILD) -b html . $(html_outdir) # Explicitly depend on the files to be distributed or installed. @ENABLE_DOCUMENTATION_TRUE@all-local: html/index.html @ENABLE_DOCUMENTATION_FALSE@all-local: # Instruct GNU make to delete the targets of a rule after it failed, in # order to avoid the complication of handling that situation manually. .DELETE_ON_ERROR: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: glom-1.22.4/docs/pyglom_reference/conf.py.in0000644000175000017500000001447712234252645022167 0ustar00murraycmurrayc00000000000000# -*- coding: utf-8 -*- # # glom_@GLOM_ABI_VERSION_UNDERLINED@ documentation build configuration file, created by # sphinx-quickstart on Fri Apr 16 16:21:26 2010. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.append(os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8' # The master toctree document. master_doc = 'index' # General information about the project. project = u'glom_@GLOM_ABI_VERSION@' copyright = u'2010, Murray Cumming' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '@PACKAGE_VERSION@' # The full version, including alpha/beta/rc tags. release = '@PACKAGE_VERSION@' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". #html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. html_use_modindex = False # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. html_show_sourcelink = False # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'glom_@GLOM_ABI_VERSION_UNDERLINED@doc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'glom_@GLOM_ABI_VERSION_UNDERLINED@.tex', u'glom\\_1\\_@GLOM_ABI_VERSION@ Documentation', u'Openismus GmbH', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. latex_use_modindex = False glom-1.22.4/docs/pyglom_reference/Makefile.am0000644000175000017500000000374612234776363022324 0ustar00murraycmurrayc00000000000000# pydoc can write docs for all modules in a directory (or a module name), # but doesn't like being given a path to any actual file. # Using pydoc instead: # html: # pydoc -w $(top_builddir)/glom/python_embed/python_module/.libs/ # mkdir html # mv glom_1_22.html html/index.html book_name = pyglom_$(GLOM_ABI_VERSION_UNDERLINED) # The name of the sub-directory where the generated documentation # will be placed. html_outdir = html # A list of wildcard patterns matching the documentation files to distribute. htmlref_patterns = *.css *.gif *.html *.png *.js *.inv *.txt # Installation directories. libdocdir = $(datarootdir)/doc/$(book_name) referencedir = $(libdocdir)/reference htmlrefdir = $(referencedir)/html htmlref_staticdir = $(htmlrefdir)/_static htmlref_sourcesdir = $(htmlrefdir)/_sources # Function: $(call vpath_listall,PATTERN ...) # Get all filenames which match a PATTERN from the list. Look for files # relative to either the current directory or $(srcdir). Strip $(srcdir)/ # again before returning and remove any duplicates. vpath_srclist = $(patsubst $(srcdir)/%,%,$(wildcard $(addprefix $(srcdir)/,$(1)))) vpath_listall = $(sort $(wildcard $(1)) $(if $(srcdir:.=),$(vpath_srclist))) dist_htmlref_DATA = $(call vpath_listall,$(addprefix $(html_outdir)/,$(htmlref_patterns))) dist_htmlref_static_DATA = $(call vpath_listall,$(addprefix $(html_outdir)/_static/,$(htmlref_patterns))) dist_htmlref_sources_DATA = $(call vpath_listall,$(addprefix $(html_outdir)/_sources/,$(htmlref_patterns))) MAINTAINERCLEANFILES = $(html_outdir)/_sources/* $(html_outdir)/_static/* $(html_outdir)/* html/index.html: -$(AM_V_at)rm -fr $(html_outdir) $(AM_V_GEN)$(SPHINX_BUILD) -b html . $(html_outdir) # Explicitly depend on the files to be distributed or installed. if ENABLE_DOCUMENTATION all-local: html/index.html else all-local: endif # Instruct GNU make to delete the targets of a rule after it failed, in # order to avoid the complication of handling that situation manually. .DELETE_ON_ERROR: glom-1.22.4/docs/postgres_gda_test.c0000644000175000017500000000361012234252645020605 0ustar00murraycmurrayc00000000000000/* Compile this like so, or similar: gcc postgres_gda_test.c `pkg-config libgda --libs --cflags` murrayc */ #include /* Show errors from a working connection */ static void get_errors (GdaConnection *connection) { GList *list; GList *node; GdaError *error; list = (GList *) gda_connection_get_errors (connection); for (node = g_list_first (list); node != NULL; node = g_list_next (node)) { error = (GdaError *) node->data; g_print ("Error no: %d\t", gda_error_get_number (error)); g_print ("desc: %s\t", gda_error_get_description (error)); g_print ("source: %s\t", gda_error_get_source (error)); g_print ("sqlstate: %s\n", gda_error_get_sqlstate (error)); } } int main(int argc, char *argv[]) { const gchar* connection_string = "HOST=localhost;USER=murrayc;PASSWORD=yourpasswordhere;DATABASE=template1"; GdaClient *client = 0; GdaConnection *con = 0; gboolean errors = FALSE; gint rows; gda_init ("glom-gda-test", NULL, argc, argv); /* 3. Create a gda client */ client = gda_client_new (); /* 4. Open the connection */ con = gda_client_open_connection_from_string (client, "PostgreSQL", connection_string, 0); if (!GDA_IS_CONNECTION (con)) { g_print ("** ERROR: could not open connection.\n"); /* This cannot work because it needs a working connection: get_errors (con); */ return 0; } gboolean created = gda_connection_create_database(con, "glomtest"); if(!created) { g_print("** Error: gda_connection_create_database failed.\n"); get_errors(con); } gda_connection_close (con); g_object_unref (G_OBJECT (client)); g_print ("** Connection successfully opened, database created, and connection closed.\n"); return 0; } glom-1.22.4/docs/postgres_test.c0000644000175000017500000000726712234252645020006 0ustar00murraycmurrayc00000000000000/* Compile this like so, or similar: gcc postgres_test.c -I /usr/include/postgresql -lpq or, on Ubuntu Breezy: gcc postgres_test.c -I /usr/include/postgresql -lpq -I/usr/include/postgresql/8.0/ murrayc */ /* * testlibpq.c * * Test the C version of LIBPQ, the POSTGRES frontend library. */ #include #include #include "libpq-fe.h" static void exit_nicely(PGconn *conn) { PQfinish(conn); exit(1); } int main(int argc, char **argv) { const char *conninfo; PGconn *conn; PGresult *res; int nFields; int i, j; /* * If the user supplies a parameter on the command line, use it as * the conninfo string; otherwise default to setting dbname=template1 * and using environment variables or defaults for all other connection * parameters. */ if (argc > 1) conninfo = argv[1]; else conninfo = "host=192.168.1.101 dbname=template1 user=murrayc password=thepasswordhere"; /* Make a connection to the database */ conn = PQconnectdb(conninfo); /* Check to see that the backend connection was successfully made */ if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn)); exit_nicely(conn); } /* * Our test case here involves using a cursor, for which we must be * inside a transaction block. We could do the whole thing with a * single PQexec() of "select * from pg_database", but that's too * trivial to make a good example. */ /* Start a transaction block */ res = PQexec(conn, "BEGIN"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } /* * Should PQclear PGresult whenever it is no longer needed to avoid * memory leaks */ PQclear(res); /* * Fetch rows from pg_database, the system catalog of databases */ res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } PQclear(res); res = PQexec(conn, "FETCH ALL in myportal"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } /* first, print out the attribute names */ nFields = PQnfields(res); for (i = 0; i < nFields; i++) printf("%-15s", PQfname(res, i)); printf("\n\n"); /* next, print out the rows */ for (i = 0; i < PQntuples(res); i++) { for (j = 0; j < nFields; j++) printf("%-15s", PQgetvalue(res, i, j)); printf("\n"); } PQclear(res); /* close the portal ... we don't bother to check for errors ... */ res = PQexec(conn, "CLOSE myportal"); PQclear(res); /* end the transaction */ res = PQexec(conn, "END"); PQclear(res); /* close the connection to the database and cleanup */ PQfinish(conn); return 0; } glom-1.22.4/docs/libglom_reference/0000755000175000017500000000000012235000130020341 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/libglom_reference/doc-install.pl0000644000175000017500000001530612234777071023144 0ustar00murraycmurrayc00000000000000package main; # Copyright (c) 2009 Openismus GmbH # # This file is part of mm-common. # # mm-common is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published # by the Free Software Foundation, either version 2 of the License, # or (at your option) any later version. # # mm-common is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with mm-common. If not, see . use strict; use warnings; use bytes; use File::Glob qw(:glob); use File::Spec; use Getopt::Long qw(:config no_getopt_compat no_ignore_case require_order bundling); # Globals my $message_prefix; my %tags_hash; my $book_base; my $perm_mode; my $target_dir; my $target_nodir = ''; my $expand_glob = ''; my $verbose = ''; sub path_basename ($) { my ($path) = @_; my $basename = File::Spec->splitpath($path); return $basename; } sub exit_help () { my $script_name = path_basename($0) || 'doc-install.pl'; print <<"EOF"; Usage: perl $script_name [OPTION]... [-T] SOURCE DEST or: perl $script_name [OPTION]... SOURCE... DIRECTORY or: perl $script_name [OPTION]... -t DIRECTORY SOURCE... Copy SOURCE to DEST or multiple SOURCE files to the existing DIRECTORY, while setting permission modes. For HTML files, translate references to external documentation. Mandatory arguments to long options are mandatory for short options, too. --book-base=BASEPATH use reference BASEPATH for Devhelp book -l, --tag-base=TAGFILE\@BASEPATH use BASEPATH for references from TAGFILE -m, --mode=MODE override file permission MODE (octal) -t, --target-directory=DIRECTORY copy all SOURCE arguments into DIRECTORY -T, --no-target-directory treat DEST as normal file --glob expand SOURCE as filename glob pattern -v, --verbose enable informational messages -?, --help display this help and exit EOF exit; } sub notice (@) { print($message_prefix, @_, "\n") if ($verbose); } sub warning (@) { print STDERR ($message_prefix, @_, "\n"); } sub error (@) { warning(@_); exit 1; } # Copy file to destination while translating references on the fly. # Sniff the content for the file type, as it is always read in anyway. sub install_file ($$$) { my ($in_name, $out_name, $basename) = @_; my ($in, $out, $buf); { local $/; # slurp mode: read entire file into buffer open($in, '<', $in_name) and binmode($in) and defined($buf = <$in>) and close($in) or error('Failed to read ', $basename, ': ', $!); } if (%tags_hash and $buf =~ m/\A(?> \s*)(?> (?> <[?!][^<]+ )* )\s]/sx) { my $count = 0; my $total = $buf =~ s!(?<= \s) doxygen="((?> [^:"]+)):((?> [^"]*))" # doxygen="(TAGFILE):(BASEPATH)" (?> \s+) ((?> href|src) =") \2 ((?> [^"]*)") # (href|src=")BASEPATH(RELPATH") ! $3 . ((exists $tags_hash{$1}) ? (++$count, $tags_hash{$1}) : $2) . $4 !egsx; my $change = $total ? "rewrote $count of $total" : 'no'; notice('Translating ', $basename, ' (', $change, ' references)'); } elsif (defined($book_base) and $buf =~ m/\A(?> \s*)(?> (?> <[?!][^<]+ )* ) my $change = $buf =~ s/(]*? \b base=") (?> [^"]*) (?= ")/$1$book_base/sx ? 'rewrote base path' : 'base path not set'; notice('Translating ', $basename, ' (', $change, ')'); } else { notice('Copying ', $basename); } # Avoid inheriting permissions of existing file unlink($out_name); open($out, '>', $out_name) and binmode($out) and print $out ($buf) and close($out) or error('Failed to write ', $basename, ': ', $!); chmod($perm_mode, $out_name) or warning('Failed to set ', $basename, ' permissions: ', $!); } # Split TAGFILE@BASEPATH argument into key/value pair sub split_key_value ($) { my ($mapping) = @_; my ($name, $path) = split(m'@', $mapping, 2); error('Invalid base path mapping: ', $mapping) unless (defined($name) and $name ne ''); if (defined $path) { notice('Using base path ', $path, ' for tag file ', $name); return ($name, $path); } notice('Not changing base path for tag file ', $name); return (); } # Define line leader of log messages $message_prefix = path_basename($0); $message_prefix =~ s/\.[^.]*$//s if (defined $message_prefix); $message_prefix = ($message_prefix || 'doc-install') . ': '; # Process command-line options { my @tags = (); my $mode = '0644'; GetOptions('book-base=s' => \$book_base, 'tag-base|l=s' => \@tags, 'mode|m=s' => \$mode, 'target-directory|t=s' => \$target_dir, 'no-target-directory|T' => \$target_nodir, 'glob' => \$expand_glob, 'verbose|v' => \$verbose, 'help|?' => \&exit_help) or exit 2; error('Invalid permission mode: ', $mode) unless ($mode =~ m/^[0-7]+$/s); $perm_mode = oct($mode); %tags_hash = map(split_key_value($_), @tags); } notice('Using base path ', $book_base, ' for Devhelp book') if (defined $book_base); if ($target_nodir) { error('Conflicting target directory options') if (defined $target_dir); error('Source and destination filenames expected') unless ($#ARGV == 1); error('Filename globbing requires target directory') if ($expand_glob); install_file($ARGV[0], $ARGV[1], path_basename($ARGV[1])); exit; } unless (defined $target_dir) { if (!$expand_glob and $#ARGV == 1) { my $basename = path_basename($ARGV[1]); if (defined($basename) and $basename ne '') { install_file($ARGV[0], $ARGV[1], $basename); exit; } } $target_dir = pop(@ARGV); } error('No target directory specified') unless (defined($target_dir) and $target_dir ne ''); @ARGV = map(bsd_glob($_, GLOB_NOSORT), @ARGV) if ($expand_glob); my %basename_hash = (); foreach my $in_name (@ARGV) { my $basename = path_basename($in_name); # If there are multiple files with the same base name in the list, only # the first one will be installed. This behavior makes it very easy to # implement a VPATH search for each individual file. unless (exists $basename_hash{$basename}) { $basename_hash{$basename} = undef; my $out_name = File::Spec->catfile($target_dir, $basename); install_file($in_name, $out_name, $basename); } } exit; glom-1.22.4/docs/libglom_reference/doxygen.css0000644000175000017500000000661312234777071022566 0ustar00murraycmurrayc00000000000000/* GNOME C++ bindings Doxygen style */ html, body { background: #FFFFFF; color: #222222; margin: 0; } body { font: normal 90%/150% sans-serif; padding: 1.5em; min-width: 28em; } table { font-size: inherit; } img { border-style: none; } address img { vertical-align: middle; } h1 { font-size: 150%; line-height: 120%; text-align: center; } h2 { font-size: 120%; } h3 { font-size: 100%; } h1 + h3 { text-align: center; } .navpath { display: none; } caption { font-weight: bold; } p, dl { margin: 0.75em 0; } .center { text-align: center; } div.qindex { width: 100%; line-height: 140%; background-color: #E8EEF2; border: 1px solid #84B0C7; text-align: center; margin: 0.2em; padding: 0.2em; } a { color: #153788; font-weight: normal; text-decoration: none; } .contents a:visited { color: #1B77C5; } a:hover { text-decoration: underline; } a.el, a.qindex { font-weight: bold; } dl.el { margin-left: -1.5em; } code, .fragment { font-family: monospace, fixed; } pre.fragment, div.fragment { background-color: #EEEEFF; border: 1px solid #AAAAFF; padding: 0.5em; margin: 0.375em 0.75em 0.375em 0.2em; } div.fragment > pre.fragment { border-style: none; padding: 0; margin: 0; } div.line { white-space: pre; } div.ah { background-color: #000000; color: #FFFFFF; font-weight: bold; margin: 0.2em 0; } .indexkey, .indexvalue { background-color: #E8EEF2; border: 1px solid #CCCCCC; margin: 0.2em 0; padding: 0.2em 0.75em; } .indexkey { font-weight: bold; } .memlist { background-color: #F0F0F0; } span.keyword { color: #008000; } span.keywordtype { color: #604020; } span.keywordflow { color: #E08000; } span.comment { color: #800000; } span.preprocessor { color: #806020; } span.stringliteral { color: #002080; } span.charliteral { color: #008080; } .tiny { font-size: 80%; } hr { height: 0; border: none; border-top: 1px solid #666666; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #FAFAFA; border: none; margin: 0.375em; padding: 0.125em 0 0 0.75em; } .mdescLeft, .mdescRight { padding: 0 0.75em 0.375em; color: #555555; } .memItemLeft, .memItemRight, .memTemplParams { border-top: 1px solid #CCCCCC; } .memTemplParams { color: #606060; } .memtemplate { color: #606060; font-size: 90%; font-weight: normal; margin-left: 0.2em; } .memnav { background-color: #E8EEF2; border: 1px solid #84B0C7; text-align: center; margin: 0.2em 1em 0.2em 0; padding: 0.2em; } .memitem { margin: 0.5em 0; padding: 0; } .memname { white-space: nowrap; font-weight: bold; line-height: 120%; } .memproto, .memdoc { border: 1px solid #84B0C7; } .memproto { padding: 0; background-color: #D5E1E8; font-weight: bold; -webkit-border-top-left-radius: 1ex; -webkit-border-top-right-radius: 1ex; -moz-border-radius-topleft: 1ex; -moz-border-radius-topright: 1ex; } .memdoc { padding: 0.2em 0.5em; background-color: #EEF3F5; border-top-width: 0; -webkit-border-bottom-left-radius: 1ex; -webkit-border-bottom-right-radius: 1ex; -moz-border-radius-bottomleft: 1ex; -moz-border-radius-bottomright: 1ex; } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } glom-1.22.4/docs/libglom_reference/tagfile-to-devhelp2.xsl0000644000175000017500000001425412234777071024671 0ustar00murraycmurrayc00000000000000 glom-1.22.4/docs/libglom_reference/libglom-1.22.tag0000644000175000017500000112177112234777145023107 0ustar00murraycmurrayc00000000000000 Glom namespaceGlom.html Glom::Conversions Glom::DbUtils Glom::Utils Glom::AppState Glom::sharedptr Glom::ReportBuilder Glom::DatabaseTitle Glom::ChoiceValue Glom::predicate_FieldHasName Glom::Field Glom::FieldTypes Glom::FoundSet Glom::HasTitleSingular Glom::GroupInfo Glom::NumericFormat Glom::PrintLayout Glom::Privileges Glom::Relationship Glom::Report Glom::SystemPrefs Glom::TableInfo Glom::TranslatableItem Glom::CustomTitle Glom::Formatting Glom::LayoutGroup Glom::LayoutItem Glom::LayoutItem_Button Glom::LayoutItem_CalendarPortal Glom::predicate_LayoutItem_Field_IsSameField Glom::LayoutItem_Field Glom::LayoutItem_Image Glom::LayoutItem_Line Glom::LayoutItem_Notebook Glom::LayoutItem_Placeholder Glom::LayoutItem_Portal Glom::LayoutItem_Text Glom::LayoutItem_WithFormatting Glom::UsesRelationship Glom::LayoutItem_FieldSummary Glom::LayoutItem_Footer Glom::LayoutItem_GroupBy Glom::LayoutItem_Header Glom::LayoutItem_Summary Glom::LayoutItem_VerticalGroup Glom::Document std::pair< sharedptr< const LayoutItem_Field >, bool > type_pair_sort_field namespaceGlom.html a4d496233c15b7b68fbf1430ca004b457 std::vector< type_pair_sort_field > type_sort_clause namespaceGlom.html af57cbe771f8ddfb8ec259a74acad97c6 GlomBakery::View< Document > View_Glom namespaceGlom.html a3a03874268c9995ac1f9431c4748850b GlomBakery::View_Composite< Document > View_Composite_Glom namespaceGlom.html a0d2b1800bbebf8ac2892789b8da66d58 void libglom_init namespaceGlom.html af89e82bb7f67620b685dc0a0d4714b44 () void libglom_deinit namespaceGlom.html a665a5a3e65ac061131c030aa677e6834 () sharedptr< T_obj > glom_sharedptr_clone namespaceGlom.html adf154467b6daddd6d88248c71f03f888 (const sharedptr< T_obj > &src) sharedptr< T_obj > glom_sharedptr_clone namespaceGlom.html ad5c6b1f14fa17c6ff8a45488f4da6338 (const sharedptr< const T_obj > &src) bool write_pot_file namespaceGlom.html a0907aa7815f030889ca5efd91ebff09a (Document *document, const Glib::ustring &pot_file_uri) bool write_translations_to_po_file namespaceGlom.html a2e255d4ed9d025976868e6007e5405ff (Document *document, const Glib::ustring &po_file_uri, const Glib::ustring &translation_locale, const Glib::ustring &locale_name=Glib::ustring()) bool import_translations_from_po_file namespaceGlom.html ae57d99d1d06e03a358636be4f1a748be (Document *document, const Glib::ustring &po_file_uri, const Glib::ustring &translation_locale) Glib::ustring get_po_context_for_item namespaceGlom.html adc47141d052f4cc87bd7a2daacfbb874 (const sharedptr< const TranslatableItem > &item, const Glib::ustring &hint) Glib::ustring glom_get_sharedptr_name namespaceGlom.html ab7fe54776b31db7521aa7653db9dba19 (const sharedptr< T_object > &item) const char GLOM_IMAGE_FORMAT namespaceGlom.html ac3b184c3ec03b2475714fab2f7c7d460 [] const char GLOM_IMAGE_FORMAT_MIME_TYPE namespaceGlom.html a88b68c39541524abdb8c1634fefdcad7 [] Glom::AppState classGlom_1_1AppState.html userlevels classGlom_1_1AppState.html a2f279293e922b57b080096c2b75815d7 USERLEVEL_OPERATOR classGlom_1_1AppState.html a2f279293e922b57b080096c2b75815d7add9130b87161b0f30eead81d5605f07b USERLEVEL_DEVELOPER classGlom_1_1AppState.html a2f279293e922b57b080096c2b75815d7a0cd11138a9ca84a6a80d2f7a8a89e3d0 sigc::signal< void, userlevels > type_signal_userlevel_changed classGlom_1_1AppState.html a884b9a86115c0e570aca5682f515d463 AppState classGlom_1_1AppState.html a649b630319deb65a77de938692e8bec8 () virtual ~AppState classGlom_1_1AppState.html ae50333c4d14f20a5d88b976f14b50891 () virtual userlevels get_userlevel classGlom_1_1AppState.html a0ce1eb8f2e8953cde66d394d3c6dad8e () const virtual void set_userlevel classGlom_1_1AppState.html a191adcdc494f374d9088633c02cae3e2 (userlevels value) virtual void emit_userlevel_changed classGlom_1_1AppState.html aacd37490e17a9ecaf27598bed59c2f84 () type_signal_userlevel_changed signal_userlevel_changed classGlom_1_1AppState.html a3480358c40652fda0526490ccbda4927 () Glom::sharedptr classGlom_1_1sharedptr.html T_obj size_t size_type classGlom_1_1sharedptr.html a136c71f35df111e6f6bfa9e03e9917a0 T_obj object_type classGlom_1_1sharedptr.html acb058473e72cf4f006a7a23ffbbdaf35 sharedptr classGlom_1_1sharedptr.html a7749eb805a1a96911d3244bae89611a4 () sharedptr classGlom_1_1sharedptr.html a915c7a122a951ec527f04ae985112ef1 (T_obj *pobj) sharedptr classGlom_1_1sharedptr.html a7e090a36f58b2811717c25cab64cae14 (T_obj *pobj, size_type *refcount) sharedptr classGlom_1_1sharedptr.html a6102dbc1119f259160e667856633042b (const sharedptr &src) void swap classGlom_1_1sharedptr.html a04d5ed27e0cb5ef44d49fadcfeafa928 (sharedptr< T_obj > &other) sharedptr classGlom_1_1sharedptr.html a512b65f7a40867492db88c6a89930a51 (const sharedptr< T_CastFrom > &src) sharedptr & operator= classGlom_1_1sharedptr.html a1cdd392b3e161e02a16ca205ea54311a (const sharedptr &src) sharedptr< T_obj > & operator= classGlom_1_1sharedptr.html a9a3c4a52a541002ce237c05970b9f9ca (const sharedptr< T_CastFrom > &src) virtual ~sharedptr classGlom_1_1sharedptr.html ab4de9a1efd217faa77e39a1813c4bd0b () bool operator== classGlom_1_1sharedptr.html af93fe9dabf864468837057cb430d6817 (const sharedptr< T_obj > &src) const bool operator!= classGlom_1_1sharedptr.html a107f3107052d1d026b54a7dde628cc13 (const sharedptr< T_obj > &src) const virtual void clear classGlom_1_1sharedptr.html a4d421575966613b3eb0862e1d0776419 () T_obj & operator* classGlom_1_1sharedptr.html ace647214b829e740d49a7a760341ee09 () const T_obj & operator* classGlom_1_1sharedptr.html a249c5d4eef8f2c27c72c4b5c9807cc52 () const T_obj * operator-> classGlom_1_1sharedptr.html a3f3e93d6c6f2f2858f54abcaf3aecdcf () const operator bool classGlom_1_1sharedptr.html a2a9e0c086b97df95d465d39d29e5467b () const bool operator! classGlom_1_1sharedptr.html ad854eea3ed6f8bff576b1323d0f458f7 () const T_obj * obj classGlom_1_1sharedptr.html a4b254013a623c15f9040b4e26772d399 () const T_obj * obj classGlom_1_1sharedptr.html a14b85493ef0d6ea82e6305050259ca84 () const sharedptr< T_obj > cast_dynamic classGlom_1_1sharedptr.html a38743b87bcca519da456fa31df8e5358 (const sharedptr< T_CastFrom > &src) sharedptr< T_obj > cast_static classGlom_1_1sharedptr.html a14fcdb93ce49fe08d9de6e15247a3c1c (const sharedptr< T_CastFrom > &src) sharedptr< T_obj > cast_const classGlom_1_1sharedptr.html a7a1b79e8e08ce7c4b432d601d2f72ace (const sharedptr< T_CastFrom > &src) static sharedptr< T_obj > cast_dynamic classGlom_1_1sharedptr.html ab7583fb02e8c265c351f771530219d43 (const sharedptr< T_CastFrom > &src) static sharedptr< T_obj > cast_static classGlom_1_1sharedptr.html a3e9dde92d2bce5ff52a6e410458392cf (const sharedptr< T_CastFrom > &src) static sharedptr< T_obj > cast_const classGlom_1_1sharedptr.html a112fe302a55b759a64ce867614be1fcd (const sharedptr< T_CastFrom > &src) static sharedptr< T_obj > create classGlom_1_1sharedptr.html aeb06d0326d1404fe72a9eb9eeb8dd981 () Glom::ReportBuilder classGlom_1_1ReportBuilder.html ReportBuilder classGlom_1_1ReportBuilder.html aac2f3468736ffaff343e8c98a27d6337 (const Glib::ustring &locale) virtual ~ReportBuilder classGlom_1_1ReportBuilder.html acdf24f227b81b505d2f07db2c524c8c0 () void set_document classGlom_1_1ReportBuilder.html ab542882d3546771daa09543ecfa60f05 (Document *document) Glib::ustring report_build classGlom_1_1ReportBuilder.html a5b98be6636f5dad19059761353f2fe10 (const FoundSet &found_set, const sharedptr< const Report > &report) std::string report_build_and_save classGlom_1_1ReportBuilder.html a30ca32165dcec68b2dedbc8dc49c68fb (const FoundSet &found_set, const sharedptr< const Report > &report) static sharedptr< Report > create_standard_list_report classGlom_1_1ReportBuilder.html ad80193c31211cabb99db9fbc8f97ca4d (const Document *document, const Glib::ustring &table_name) Glom::DatabaseTitle classGlom_1_1DatabaseTitle.html Glom::TranslatableItem DatabaseTitle classGlom_1_1DatabaseTitle.html aa75973e4f65c92ea44b08e5f49145495 () DatabaseTitle classGlom_1_1DatabaseTitle.html a31c5b04a2fee5ecf55a46b0f7ed45c01 (const DatabaseTitle &src) DatabaseTitle & operator= classGlom_1_1DatabaseTitle.html a159733dd669369c810b18b8352a3b028 (const DatabaseTitle &src) TranslatableItem classGlom_1_1TranslatableItem.html a59d9f54952fb3953c70c3cf79e5b0397 () TranslatableItem classGlom_1_1TranslatableItem.html a6d86fb79fc616db7ba0ac5005d0e74c1 (const TranslatableItem &src) virtual ~TranslatableItem classGlom_1_1TranslatableItem.html ab51c8f9f14efe502dc9d3d438dcb765a () TranslatableItem & operator= classGlom_1_1TranslatableItem.html afdbcbf1375c65a72fde249add210f109 (const TranslatableItem &src) bool operator== classGlom_1_1TranslatableItem.html ae33a145dda75b7322e7a5f2a5635f8d8 (const TranslatableItem &src) const bool operator!= classGlom_1_1TranslatableItem.html a1c80c03608eedd719b36f9e917d92bbe (const TranslatableItem &src) const virtual void set_name classGlom_1_1TranslatableItem.html a1d92c4d6473471e3a31ccfd2608f8302 (const Glib::ustring &name) virtual Glib::ustring get_name classGlom_1_1TranslatableItem.html a77169f3b9749c430de2237cfae53bd1b () const bool get_name_not_empty classGlom_1_1TranslatableItem.html aa1c2999c30fc5878b9c55eeaafa1d04d () const virtual Glib::ustring get_title_or_name classGlom_1_1TranslatableItem.html a1151d82f3656f24f43f5691d6c50e505 (const Glib::ustring &locale) const virtual Glib::ustring get_title classGlom_1_1TranslatableItem.html a081e678cb381005f8e126281af5fce13 (const Glib::ustring &locale) const virtual Glib::ustring get_title_original classGlom_1_1TranslatableItem.html ac037a93ad7f0ca1b4b33df9c9a04b6c0 () const Glib::ustring get_title_translation classGlom_1_1TranslatableItem.html a1d9de54d4e85998c323fb505fb611dbb (const Glib::ustring &locale, bool fallback=true) const void set_title classGlom_1_1TranslatableItem.html a3b45cf3c5e81775eead52c3a865af2fc (const Glib::ustring &title, const Glib::ustring &locale) void set_title_original classGlom_1_1TranslatableItem.html a9a6619911111f34afbb378e477366048 (const Glib::ustring &title) void clear_title_in_all_locales classGlom_1_1TranslatableItem.html ad972e58a60f9d2a7458e2abd1253b75f () bool get_has_translations classGlom_1_1TranslatableItem.html a627b76316a98caa6e84f4f12eb2e8e65 () const enumTranslatableItemType get_translatable_item_type classGlom_1_1TranslatableItem.html a3ba6261adc433f183838d85ae490b39c () const enumTranslatableItemType classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09 TRANSLATABLE_TYPE_INVALID classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09aa0e068f4c925e126640b5713d30df90d TRANSLATABLE_TYPE_FIELD classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09a0d44075d1d61db1c44573ee2fc1d7085 TRANSLATABLE_TYPE_RELATIONSHIP classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09a351c7ac2e55e769d65eb352ab56d259d TRANSLATABLE_TYPE_LAYOUT_ITEM classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09a5b6a542b337cf60fdfeeb14fc81df55e TRANSLATABLE_TYPE_CUSTOM_TITLE classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09a9ac77fa3c1931a962640283b55f6be2a TRANSLATABLE_TYPE_PRINT_LAYOUT classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09a4d90339e4e1360096b7b3e2cce3b6694 TRANSLATABLE_TYPE_REPORT classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09acc95af040162973a318d31805618bceb TRANSLATABLE_TYPE_TABLE classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09ae7222449dfa5a27b485267d70a587fcd TRANSLATABLE_TYPE_BUTTON classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09abb8fada243c986dc43e4795155bf1e07 TRANSLATABLE_TYPE_TEXTOBJECT classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09a6174f2152734f488adfe3d572f746a66 TRANSLATABLE_TYPE_IMAGEOBJECT classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09a4a84bd31da6cda2d3bb4a1d522d794b3 TRANSLATABLE_TYPE_CHOICEVALUE classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09a649b6e0e9899c780f5012f0434e65fde TRANSLATABLE_TYPE_DATABASE_TITLE classGlom_1_1TranslatableItem.html a42caf941e237ef5c654c2a232a272f09a24af3b3dad2a699b90c8c3bff66ca04d std::map< Glib::ustring, Glib::ustring > type_map_locale_to_translations classGlom_1_1TranslatableItem.html a1c9755f8567b4247f4a37bb46435f4c5 static Glib::ustring get_translatable_type_name classGlom_1_1TranslatableItem.html af948c5c1a66dd832543f311887ba4d8c (enumTranslatableItemType item_type) static Glib::ustring get_translatable_type_name_nontranslated classGlom_1_1TranslatableItem.html afd55350c7ad05e7be1e03de43fb83608 (enumTranslatableItemType item_type) enumTranslatableItemType m_translatable_item_type classGlom_1_1TranslatableItem.html ab4ef5af7ccfc36bbf2f5feb23918b9f6 Glom::ChoiceValue classGlom_1_1ChoiceValue.html Glom::TranslatableItem ChoiceValue classGlom_1_1ChoiceValue.html ad37fb4ce1ad53769931a14c9fcdc25bc () ChoiceValue classGlom_1_1ChoiceValue.html a35f8f7f1f6a4abf533cfe43ac06b75ca (const ChoiceValue &src) ~ChoiceValue classGlom_1_1ChoiceValue.html af49d1593a8e3e80135b502e8d1efd895 () ChoiceValue & operator= classGlom_1_1ChoiceValue.html a6e10847a5c29dc7089ab0bc4f76e1e81 (const ChoiceValue &src) bool operator== classGlom_1_1ChoiceValue.html aa9200faacadff55e2a08ae5e9e685651 (const ChoiceValue &src) const bool operator!= classGlom_1_1ChoiceValue.html aefc4508ab03d72c6e90bcb682a66b62e (const ChoiceValue &src) const ChoiceValue * clone classGlom_1_1ChoiceValue.html a414f8303b6718d4ce2128014723828dd () const void set_value classGlom_1_1ChoiceValue.html a8d1d0d995ecfb33cd6da2e106e9df019 (const Gnome::Gda::Value &value) Gnome::Gda::Value get_value classGlom_1_1ChoiceValue.html a267e0d03bb3d437a5c6dd5288fa624de () const virtual Glib::ustring get_title_original classGlom_1_1ChoiceValue.html a55f73d960c9a376bf9c8b7d33a0468ef () const bool is_translatable classGlom_1_1ChoiceValue.html a2e4fe73a37e250fc7d2922da2da6f44b () const Glom::predicate_FieldHasName classGlom_1_1predicate__FieldHasName.html predicate_FieldHasName classGlom_1_1predicate__FieldHasName.html a7b14ca1de37ade9e22301fd3a71584d8 (const Glib::ustring &strName) virtual ~predicate_FieldHasName classGlom_1_1predicate__FieldHasName.html a1ed9865d798553335f7f8a69bef1ff7f () bool operator() classGlom_1_1predicate__FieldHasName.html ac772ed0984769f6a73dc919f26f137b1 (const T_Element &element) bool operator() classGlom_1_1predicate__FieldHasName.html a0ba37cd302871723594b17229f3fa0aa (const sharedptr< T_Element > &element) bool operator() classGlom_1_1predicate__FieldHasName.html a2238be40ba9eb848a4378287d53dc7dd (const sharedptr< const T_Element > &element) Glom::Field classGlom_1_1Field.html Glom::TranslatableItem sql_format classGlom_1_1Field.html ada8c5d83c1e0937fd60888ce7dc0f6d5 SQL_FORMAT_POSTGRES classGlom_1_1Field.html ada8c5d83c1e0937fd60888ce7dc0f6d5a3cf3686d521e0d67add2da215a7dba6d SQL_FORMAT_SQLITE classGlom_1_1Field.html ada8c5d83c1e0937fd60888ce7dc0f6d5ab56283c9f73d17dd0c0725e061512367 glom_field_type classGlom_1_1Field.html add1ab8498c593222460a6ed3b100b12c TYPE_INVALID classGlom_1_1Field.html add1ab8498c593222460a6ed3b100b12ca00cf52d1858c9fa384818e30e6361e7e TYPE_NUMERIC classGlom_1_1Field.html add1ab8498c593222460a6ed3b100b12cad950dc2be538deaf32d1d8a0c3b2ae1e TYPE_TEXT classGlom_1_1Field.html add1ab8498c593222460a6ed3b100b12ca1c7d059c2af6e8d926faeda822032db6 TYPE_DATE classGlom_1_1Field.html add1ab8498c593222460a6ed3b100b12ca9022b56a7ca173c9d0bb7d80c68b4995 TYPE_TIME classGlom_1_1Field.html add1ab8498c593222460a6ed3b100b12cac9a5b1fff349153aaae3cd82e3cdb69f TYPE_BOOLEAN classGlom_1_1Field.html add1ab8498c593222460a6ed3b100b12ca627e8e7391477bfc55396801a93eb483 TYPE_IMAGE classGlom_1_1Field.html add1ab8498c593222460a6ed3b100b12ca83e2891317bc48d680d35398ad3e017d std::vector< Glib::ustring > type_list_strings classGlom_1_1Field.html ac9af277289b00330df2f7b5868c06bbb std::map< glom_field_type, Glib::ustring > type_map_type_names classGlom_1_1Field.html a56155f103e46e51360cdd2993590f13f Field classGlom_1_1Field.html ab16773ddcb24e1abf06698394ddeddea () Field classGlom_1_1Field.html a47d5af89431e1a0aa03c9d2e0920a1a8 (const Field &src) ~Field classGlom_1_1Field.html aa0cd80c44dcdc16eb9df80a76a807333 () Field & operator= classGlom_1_1Field.html ae7b077ead4a13ea12632f2c124b8e389 (const Field &src) bool operator== classGlom_1_1Field.html a0404d92688dcc5ab74f9455b27d73f5e (const Field &src) const bool operator!= classGlom_1_1Field.html ae656efcd871323cbdc33f19f91c83397 (const Field &src) const Field * clone classGlom_1_1Field.html ae98793c84128a5a7022c4d4d5db066e4 () const glom_field_type get_glom_type classGlom_1_1Field.html a1c0be7f23eed331e03933c64ae76f8a1 () const void set_glom_type classGlom_1_1Field.html a3406391c25e522224ea2ad8027bea3aa (glom_field_type fieldtype) virtual Glib::ustring get_name classGlom_1_1Field.html aad54268166b2657723a7446947f26801 () const virtual void set_name classGlom_1_1Field.html a17d91155b336c922354c48843924b9df (const Glib::ustring &value) bool get_auto_increment classGlom_1_1Field.html a194e7066edf0c068c92789cdf798d2fc () const void set_auto_increment classGlom_1_1Field.html a85f425795b1e92440fac67a0252f1995 (bool val=true) bool get_primary_key classGlom_1_1Field.html a4347150af91b26fe0b44691c77b1b483 () const void set_primary_key classGlom_1_1Field.html a512e83cec34d698e69e86d7698b5b79a (bool val=true) bool get_unique_key classGlom_1_1Field.html a7ec1971af5993f1ef6cddd8091486d41 () const void set_unique_key classGlom_1_1Field.html a30976018811becd64286979eb5d7d9fb (bool val=true) Gnome::Gda::Value get_default_value classGlom_1_1Field.html ae0a95c5473b7938c605b08596ab4917b () const void set_default_value classGlom_1_1Field.html ab47c1ab9feeb66914091319fb42bcfeb (const Gnome::Gda::Value &value) Glib::RefPtr< Gnome::Gda::Column > get_field_info classGlom_1_1Field.html a917f58f6c9c15c2a093e82c825e32fe4 () Glib::RefPtr< const Gnome::Gda::Column > get_field_info classGlom_1_1Field.html a4467ff420c300199b659bff2103fb653 () const void set_field_info classGlom_1_1Field.html a0225380341f4687252524cfa181d537b (const Glib::RefPtr< Gnome::Gda::Column > &fieldInfo) bool field_info_from_database_is_equal classGlom_1_1Field.html acfa5b26f62bc28c446ef606f7520afc6 (const Glib::RefPtr< const Gnome::Gda::Column > &field) bool get_is_lookup classGlom_1_1Field.html ad753285064bd881597dc7daa09caf18f () const sharedptr< Relationship > get_lookup_relationship classGlom_1_1Field.html ad35f87b975d716c6266d59d457d8959b () const void set_lookup_relationship classGlom_1_1Field.html a06e99b24090775e710146f1609078d3f (const sharedptr< Relationship > &strRelationship) Glib::ustring get_lookup_field classGlom_1_1Field.html a71eeb4dccbdfb37004a7d509301285e4 () const void set_lookup_field classGlom_1_1Field.html a8950d7de8111a4222c5ab73d131d4ce3 (const Glib::ustring &strField) Glib::ustring get_sql_type classGlom_1_1Field.html a90925cd40a7309423b5f7df9c2b7b5b1 () const Glib::ustring get_gda_type_name classGlom_1_1Field.html a3dbb72491db5f94a100b7d805ef9077f () const Glib::ustring sql classGlom_1_1Field.html a1f08a2e6f26f7adea81fc5ff846cf664 (const Gnome::Gda::Value &value, const Glib::RefPtr< Gnome::Gda::Connection > &connection) const Glib::ustring to_file_format classGlom_1_1Field.html aac63bd78c81d3d818e5dba334fbd46bd (const Gnome::Gda::Value &value) const Gnome::Gda::Value from_file_format classGlom_1_1Field.html a1fc51c5610d4084bfcbb77926fa8d75a (const Glib::ustring &str, bool &success) const Glib::ustring sql_find classGlom_1_1Field.html a1df606157199ef2c9aefd41385fa4f50 (const Gnome::Gda::Value &value, const Glib::RefPtr< Gnome::Gda::Connection > &connection) const Gnome::Gda::SqlOperatorType sql_find_operator classGlom_1_1Field.html a779392a8792e1e0603d0d5aa27b76a7b () const Glib::ustring get_calculation classGlom_1_1Field.html a1978cfe72f5e20a01c90779f720eddce () const void set_calculation classGlom_1_1Field.html a941efb1d13243d663adfeff41a7f3888 (const Glib::ustring &calculation) bool get_has_calculation classGlom_1_1Field.html a40bfeff3fcd237db92d887f15ac2dc47 () const type_list_strings get_calculation_relationships classGlom_1_1Field.html afda7d568e1b84835fb0ab564d3e6a982 () const void set_visible classGlom_1_1Field.html aa6d99f2ec74aaa32bdf47cddae28f4cc (bool val=true) bool get_visible classGlom_1_1Field.html a428a1225bd43e4d2f7050564739e0765 () const static Glib::ustring to_file_format classGlom_1_1Field.html ae44179e45b5b63d125c6a5f409a0c814 (const Gnome::Gda::Value &value, glom_field_type glom_type) static Gnome::Gda::Value from_file_format classGlom_1_1Field.html ae327ced903f23e1b5347eb417789e113 (const Glib::ustring &str, glom_field_type glom_type, bool &success) static type_map_type_names get_type_names classGlom_1_1Field.html a2a9fbdc2129b709682441bcac77e5415 () static type_map_type_names get_type_names_ui classGlom_1_1Field.html ac0aad53771b673e864ca2e5eb267ebc2 () static type_map_type_names get_usable_type_names classGlom_1_1Field.html a75f3add1adbf94e6284332677c836181 () static Glib::ustring get_type_name_ui classGlom_1_1Field.html aa9247323b6a478eb3f5071137d11dbf8 (glom_field_type glom_type) static glom_field_type get_type_for_ui_name classGlom_1_1Field.html a52e67b6848bea20dea02f434bf5f833f (const Glib::ustring &glom_type) static glom_field_type get_glom_type_for_gda_type classGlom_1_1Field.html a6ff5da53f569ff62d80525cb75dd4a16 (GType gda_type) static GType get_gda_type_for_glom_type classGlom_1_1Field.html ade2da04e5bee34dfdb4359e8a2bb8d8c (Field::glom_field_type glom_type) static bool get_conversion_possible classGlom_1_1Field.html a4009927f4b9dbfca9e17ecaa8c8883e3 (glom_field_type field_type_src, glom_field_type field_type_dest) Formatting m_default_formatting classGlom_1_1Field.html a44b4c164debaeb43e4cb8de6ec6804f8 Glom::FieldTypes classGlom_1_1FieldTypes.html FieldTypes classGlom_1_1FieldTypes.html ac9cc840694ac1ff2017f61846690d34b (const Glib::RefPtr< Gnome::Gda::Connection > &gda_connection) virtual ~FieldTypes classGlom_1_1FieldTypes.html a0bdcdb038c32a7b0aa5b9675ce868beb () Glib::ustring get_string_name_for_gdavaluetype classGlom_1_1FieldTypes.html a31372ed25860df9ac7612087f9c4ac8f (GType field_type) const GType get_fallback_type_for_gdavaluetype classGlom_1_1FieldTypes.html a085a318379cbd6bd7bf260abb899a9a7 (GType field_type) const guint get_types_count classGlom_1_1FieldTypes.html abb18292be3336c0a23f09cb76f1b5e32 () const Glom::FoundSet classGlom_1_1FoundSet.html std::pair< sharedptr< const LayoutItem_Field >, bool > type_pair_sort_field classGlom_1_1FoundSet.html a4bfb5c943cef4b5a5b571b2aba979dbc std::vector< type_pair_sort_field > type_sort_clause classGlom_1_1FoundSet.html ad693920d9a1d40d60fdca9506fd36c6b FoundSet classGlom_1_1FoundSet.html a4c287194a475ab7d4f9b22521564d11a () FoundSet classGlom_1_1FoundSet.html abd97863cdbbffcef50f4e3cc23718707 (const FoundSet &src) FoundSet & operator= classGlom_1_1FoundSet.html ab1d7d2b141e71363b68271fc184005af (const FoundSet &src) bool operator== classGlom_1_1FoundSet.html a408114590c6006b5e73d8764903ece4a (const FoundSet &src) const Glib::ustring m_table_name classGlom_1_1FoundSet.html af21405a9e9b748acf2704e3886e4b67f sharedptr< const Relationship > m_extra_join classGlom_1_1FoundSet.html ae76bc6b6344e980b98166c9cdee61a54 Gnome::Gda::SqlExpr m_where_clause classGlom_1_1FoundSet.html a717a83daf941a7af1f004c2cc64e5291 type_sort_clause m_sort_clause classGlom_1_1FoundSet.html adbb2fd3155dfaa83e44b7cc4dc085ca7 Glom::HasTitleSingular classGlom_1_1HasTitleSingular.html HasTitleSingular classGlom_1_1HasTitleSingular.html aa0c39ce866aeb19abc259c1a2837a421 () HasTitleSingular classGlom_1_1HasTitleSingular.html a5fdc3e299b428451ca61c33ddfb9dd49 (const HasTitleSingular &src) virtual ~HasTitleSingular classGlom_1_1HasTitleSingular.html a2383a07ff844ebae9038b588320cccb0 () HasTitleSingular & operator= classGlom_1_1HasTitleSingular.html a20b23a4cac31f668e1f4861d0095e22e (const HasTitleSingular &src) bool operator== classGlom_1_1HasTitleSingular.html a17759330bd64796d6da3f26061c25610 (const HasTitleSingular &src) const bool operator!= classGlom_1_1HasTitleSingular.html a605244ae6c172dcad52db98cad6af476 (const HasTitleSingular &src) const Glib::ustring get_title_singular classGlom_1_1HasTitleSingular.html aca5ea77f7c9b8ff00c60c7df04d2693a (const Glib::ustring &locale) const Glib::ustring get_title_singular_original classGlom_1_1HasTitleSingular.html ac667600add259d61ff33e1f14a601ec5 () const Glib::ustring get_title_singular_with_fallback classGlom_1_1HasTitleSingular.html a9cd9ad6f2cba2b14e0a252aad5254a94 (const Glib::ustring &locale) const void set_title_singular classGlom_1_1HasTitleSingular.html a44237b50c455720458fd241b39fdf2e6 (const Glib::ustring &title, const Glib::ustring &locale) sharedptr< TranslatableItem > m_title_singular classGlom_1_1HasTitleSingular.html a2a6b14f5898388830e09b071092b53cf Glom::GroupInfo classGlom_1_1GroupInfo.html Glom::TranslatableItem std::map< Glib::ustring, Privileges > type_map_table_privileges classGlom_1_1GroupInfo.html ac0c0a9cf3ce4d33656a8691d55e564f7 GroupInfo classGlom_1_1GroupInfo.html aab4134bcd0e0f328ee2167dd524ba785 () GroupInfo classGlom_1_1GroupInfo.html a75ca49042cc16c8fd832fc3946debdc9 (const GroupInfo &src) virtual ~GroupInfo classGlom_1_1GroupInfo.html a1283dbf70da8aaf687ec24df17de0aa7 () GroupInfo & operator= classGlom_1_1GroupInfo.html ad1dd9d70cb5755d9120a085d81c243c8 (const GroupInfo &src) bool operator== classGlom_1_1GroupInfo.html aba1272fb72097e814696404bc49efb55 (const GroupInfo &src) const bool operator!= classGlom_1_1GroupInfo.html a8837141e8516889ba9ba0efd098e3847 (const GroupInfo &src) const bool m_developer classGlom_1_1GroupInfo.html a38d0afd82991f1e0d82132a68ddd8c07 type_map_table_privileges m_map_privileges classGlom_1_1GroupInfo.html aae8d6c3c5e6a544d49a80a0500de260a Glom::NumericFormat classGlom_1_1NumericFormat.html NumericFormat classGlom_1_1NumericFormat.html aaf955d13fa451e126e504d3dc2c87de1 () NumericFormat classGlom_1_1NumericFormat.html a32243f98e403d8eba8be283a7911162f (const NumericFormat &src) ~NumericFormat classGlom_1_1NumericFormat.html af3e680cf6d09f07af1b76ba6c349dfea () NumericFormat & operator= classGlom_1_1NumericFormat.html adbe33abed5ce3977ba164c6a3480a8e0 (const NumericFormat &src) bool operator== classGlom_1_1NumericFormat.html a9b87f17b841f81b3149c1117155c0088 (const NumericFormat &src) const bool operator!= classGlom_1_1NumericFormat.html ae54a335f1c28a4440b8ee5f6d1f8468b (const NumericFormat &src) const static Glib::ustring get_alternative_color_for_negatives classGlom_1_1NumericFormat.html a5028510bfcbcb32aee9073699441da01 () static guint get_default_precision classGlom_1_1NumericFormat.html a4eb5117e40ee6192902a35c79105b441 () Glib::ustring m_currency_symbol classGlom_1_1NumericFormat.html a2138c60199b12fbb39e206c8b7a0be3d bool m_use_thousands_separator classGlom_1_1NumericFormat.html a0cc3f7af432d63a9ed58f0b1352a9d1d bool m_decimal_places_restricted classGlom_1_1NumericFormat.html a00fa7436dfe76375b60a20efa3371bfd guint m_decimal_places classGlom_1_1NumericFormat.html a551be2f91ec8b1bbd08342b16447950d bool m_alt_foreground_color_for_negatives classGlom_1_1NumericFormat.html a687d90667e6d6f4e7ea782e88488347c Glom::PrintLayout classGlom_1_1PrintLayout.html Glom::TranslatableItem std::vector< double > type_vec_doubles classGlom_1_1PrintLayout.html a95a2d43865c2ae583b2f1b69159e2078 PrintLayout classGlom_1_1PrintLayout.html aa24618bcdf93f211321336657b8ce440 () PrintLayout classGlom_1_1PrintLayout.html a5b1c2ddc046b18cf2c3a06a35cca1300 (const PrintLayout &src) PrintLayout & operator= classGlom_1_1PrintLayout.html af452974b6a8fa144a13c64218243a88c (const PrintLayout &src) bool get_show_table_title classGlom_1_1PrintLayout.html a262eb060afda4aae28206387e3bf56c8 () const void set_show_table_title classGlom_1_1PrintLayout.html ad8dbb34ebb40ca05367938cb811ec5b7 (bool show_table_title=true) sharedptr< LayoutGroup > get_layout_group classGlom_1_1PrintLayout.html a20169566df2cd68f580acc4385e29355 () sharedptr< const LayoutGroup > get_layout_group classGlom_1_1PrintLayout.html ad89e43967329fa7bc5e81402213c9c48 () const void set_page_setup classGlom_1_1PrintLayout.html a2bacab030c749af331df465c13ba9d15 (const std::string &page_setup) std::string get_page_setup classGlom_1_1PrintLayout.html ac1272d3458acb8005a955fc1f4d270df () const void set_page_count classGlom_1_1PrintLayout.html a007a19c35a73bf027139cf739812e714 (guint count) guint get_page_count classGlom_1_1PrintLayout.html af7453686a4fc0518f9b7105e8a5b43b9 () const bool get_show_grid classGlom_1_1PrintLayout.html ab626479b562a545462daa2af3b2ddb37 () const void set_show_grid classGlom_1_1PrintLayout.html aa559a4a6f253dc53d521193a3d0c4679 (bool show_grid=true) bool get_show_rules classGlom_1_1PrintLayout.html ae88e2820c876cfa3dfa1cff6ff532c29 () const void set_show_rules classGlom_1_1PrintLayout.html a2ae4e7d1114252163d977ac7e5b861e1 (bool show_rules=true) bool get_show_outlines classGlom_1_1PrintLayout.html a1d6bb8701aae6d8cee8d4db3cf0802be () const void set_show_outlines classGlom_1_1PrintLayout.html a7c01eb46aba5ebb59304ebd03aa3655c (bool show_outlines=true) type_vec_doubles get_horizontal_rules classGlom_1_1PrintLayout.html a23c3c0d66e9861abea576824c7ad0168 () const void set_horizontal_rules classGlom_1_1PrintLayout.html aa73b4578a0c62985f392dbe7d823c6cc (const type_vec_doubles &rules) type_vec_doubles get_vertical_rules classGlom_1_1PrintLayout.html a06be49334dc418f160ca6955e151d201 () const void set_vertical_rules classGlom_1_1PrintLayout.html abffab0cef45d5b5a70a2cdcad75f5e86 (const type_vec_doubles &rules) Glom::Privileges classGlom_1_1Privileges.html Privileges classGlom_1_1Privileges.html aa44942247f9f5cd37c0158ea3135253f () Privileges classGlom_1_1Privileges.html aff22fb4d93c74fb5533903930c0ee02e (const Privileges &src) virtual ~Privileges classGlom_1_1Privileges.html a62cac50bc16c8f5935245303afcc710a () Privileges & operator= classGlom_1_1Privileges.html a885340a310cb27f174c29e375519fa03 (const Privileges &src) bool operator== classGlom_1_1Privileges.html a7264e33cc541dd98b27ce1180312a8f8 (const Privileges &src) const bool m_view classGlom_1_1Privileges.html a1f8f0726dc4b89fdd9d909df18ba1dd6 bool m_edit classGlom_1_1Privileges.html a83b1171087ab5947209e14b82cd93cc4 bool m_create classGlom_1_1Privileges.html a57d83d9f39bd03c21cdf1e41c24c7590 bool m_delete classGlom_1_1Privileges.html ab52ae304f6508b669d766682b21d43b7 Glom::Relationship classGlom_1_1Relationship.html Glom::TranslatableItem Glom::HasTitleSingular Relationship classGlom_1_1Relationship.html a94cde292c4af02b28692980f82ef19ff () Relationship classGlom_1_1Relationship.html a330ffdd12dc99aae589364a432b19c2f (const Relationship &src) ~Relationship classGlom_1_1Relationship.html a94560e4f063db28593bdc56bcbd30877 () Relationship & operator= classGlom_1_1Relationship.html a3e10c06dc8bee36e41c1dda026d0cecf (const Relationship &src) bool operator== classGlom_1_1Relationship.html a2e2ba2b426295ebe9dbed54850ef447a (const Relationship &src) const Relationship * clone classGlom_1_1Relationship.html abeabb4e90d4615cced2b94c490066389 () const Glib::ustring get_from_table classGlom_1_1Relationship.html a3b3e458ca899746fc175f8731ea4ff49 () const Glib::ustring get_from_field classGlom_1_1Relationship.html a08462b33b37d76c0c3a221f4f7ccf528 () const Glib::ustring get_to_table classGlom_1_1Relationship.html a04fc32785f3eea359abfed6831c79ba8 () const Glib::ustring get_to_field classGlom_1_1Relationship.html a990a22e48d31b32b738dcc3bdfdbd051 () const void set_from_table classGlom_1_1Relationship.html a41b604bd24c681045dc8ee3fa23c3573 (const Glib::ustring &strVal) void set_from_field classGlom_1_1Relationship.html acfe2d31f53f95630165be62a173121c4 (const Glib::ustring &strVal) void set_to_table classGlom_1_1Relationship.html a0fcdbf621390747042fea5363f80bf74 (const Glib::ustring &strVal) void set_to_field classGlom_1_1Relationship.html a80c36f036e5d5ec265635b574cd42e18 (const Glib::ustring &strVal) bool get_auto_create classGlom_1_1Relationship.html ae656e6249a01e944f5f7307a9536ee64 () const void set_auto_create classGlom_1_1Relationship.html ac93cbceb752c10780babe3a9631e22e7 (bool val=true) bool get_allow_edit classGlom_1_1Relationship.html a20b38d5f5a4ded2aa137c3b9fc0fc9ab () const void set_allow_edit classGlom_1_1Relationship.html a7cdacd3004b9be677b6d2e480d443753 (bool val=true) bool get_has_fields classGlom_1_1Relationship.html a6512b2b14220b946b2679ddda4456f88 () const bool get_has_to_table classGlom_1_1Relationship.html ac93aa928e7eb80165bc8c9b1d2183bdb () const Glom::Report classGlom_1_1Report.html Glom::TranslatableItem Report classGlom_1_1Report.html ac16b046a107dcb425a9c063be5c76662 () Report classGlom_1_1Report.html a9c08e09fb6722138ca649668d6f85c2f (const Report &src) Report & operator= classGlom_1_1Report.html a02a557a43bb0cb59ac3f0260d2d3cad5 (const Report &src) bool get_show_table_title classGlom_1_1Report.html ad2ce809d2f6c3dee2bae42584f942327 () const void set_show_table_title classGlom_1_1Report.html a169be4aa13172643ecb93377638846e8 (bool show_table_title=true) sharedptr< LayoutGroup > get_layout_group classGlom_1_1Report.html a99e3c9729131c82ac8964f3ef24a63dc () sharedptr< const LayoutGroup > get_layout_group classGlom_1_1Report.html ab84e04b78600f130c80bcb625f4897e3 () const Glom::SystemPrefs classGlom_1_1SystemPrefs.html SystemPrefs classGlom_1_1SystemPrefs.html a8b7d28ad827593d08a7b50f90ff2e07d () SystemPrefs classGlom_1_1SystemPrefs.html ac62d875762a01da2c80ec4950f01ed43 (const SystemPrefs &src) SystemPrefs & operator= classGlom_1_1SystemPrefs.html af83c57cbc23dbcfea42263de1cc6ba1e (const SystemPrefs &src) bool operator== classGlom_1_1SystemPrefs.html a666871462dfe6ab78cf4ca95019bd39c (const SystemPrefs &src) const bool operator!= classGlom_1_1SystemPrefs.html abafecd292eab60314c9da5b0eb780e4e (const SystemPrefs &src) const Glib::ustring m_name classGlom_1_1SystemPrefs.html aaa6b3baae3c6c36d70fad0bfb0aa5932 Glib::ustring m_org_name classGlom_1_1SystemPrefs.html a4c77401a02d4d8d916b7549d01abcf7a Glib::ustring m_org_address_street classGlom_1_1SystemPrefs.html a49def901c0c857f7114b2659bd621c6a Glib::ustring m_org_address_street2 classGlom_1_1SystemPrefs.html aa8d9cfd0ca0673c07ad95b454e2990bd Glib::ustring m_org_address_town classGlom_1_1SystemPrefs.html a64ab452bd2ba2dbd00c6ad4b185a9772 Glib::ustring m_org_address_county classGlom_1_1SystemPrefs.html a0ed741d895302266d54f1c4c319b89e0 Glib::ustring m_org_address_country classGlom_1_1SystemPrefs.html ab4528856d49e81dd0720c81f4699a1b3 Glib::ustring m_org_address_postcode classGlom_1_1SystemPrefs.html ab5e758740c2f6defa091f98307d77cba Gnome::Gda::Value m_org_logo classGlom_1_1SystemPrefs.html ab3d3a3730e198564e4702ec3e2bee844 Glom::TableInfo classGlom_1_1TableInfo.html Glom::TranslatableItem Glom::HasTitleSingular TableInfo classGlom_1_1TableInfo.html aad05b7307836a9b7548e5161ba6cd8f2 () TableInfo classGlom_1_1TableInfo.html a9557bc606d9bb73c58544ed90c962b55 (const TableInfo &src) TableInfo & operator= classGlom_1_1TableInfo.html acc160e1cf3e0c85d2a48dfd4995ab287 (const TableInfo &src) bool get_hidden classGlom_1_1TableInfo.html a8742f89690fc6a6cfdbbfbe22bfc5a5d () const void set_hidden classGlom_1_1TableInfo.html af569b1ba2c9a30c70a4c56ea5f93a723 (bool val=true) bool get_default classGlom_1_1TableInfo.html a2cad2254b418715f28f1a52e5f343b2d () const void set_default classGlom_1_1TableInfo.html a8c1cee812de354a3ab799020be722b50 (bool val=true) Glom::TranslatableItem classGlom_1_1TranslatableItem.html Glom::CustomTitle classGlom_1_1CustomTitle.html Glom::TranslatableItem CustomTitle classGlom_1_1CustomTitle.html a83b387ddcc97c0e6305fd01ecf024c1a () CustomTitle classGlom_1_1CustomTitle.html ac372dc9e7e50789eafd5e9e339e29706 (const CustomTitle &src) CustomTitle & operator= classGlom_1_1CustomTitle.html a2ddbdb3a5e017514ea8f313a3f22af4b (const CustomTitle &src) virtual ~CustomTitle classGlom_1_1CustomTitle.html a655048366beddddc589b79f5772f4100 () bool operator== classGlom_1_1CustomTitle.html ae9de8d727f7891656d4de1df2df5dca4 (const CustomTitle &src) const bool get_use_custom_title classGlom_1_1CustomTitle.html aa88c42fa7f233511bc8cd96bd34347b4 () const void set_use_custom_title classGlom_1_1CustomTitle.html a0b700c95ca30481b7e029df969dcde53 (bool use_custom_title=true) Glom::Formatting classGlom_1_1Formatting.html Glom::UsesRelationship HorizontalAlignment classGlom_1_1Formatting.html a1592ab92d931781a32bb9ba9bd82f923 HORIZONTAL_ALIGNMENT_AUTO classGlom_1_1Formatting.html a1592ab92d931781a32bb9ba9bd82f923af6b6afd9219b369f4e85432ad5c64e29 HORIZONTAL_ALIGNMENT_LEFT classGlom_1_1Formatting.html a1592ab92d931781a32bb9ba9bd82f923a6b1f36e19b1d82a1e64d8574cfca926f HORIZONTAL_ALIGNMENT_RIGHT classGlom_1_1Formatting.html a1592ab92d931781a32bb9ba9bd82f923a7c5f7feb13146122c701fd5edf5bc2cc std::vector< sharedptr< ChoiceValue > > type_list_values classGlom_1_1Formatting.html a0a937a775d40dd58116299ed963dec59 std::pair< sharedptr< const LayoutItem_Field >, bool > type_pair_sort_field classGlom_1_1Formatting.html aa85c56c618a08dbb85e5a7e4d9500d80 std::vector< type_pair_sort_field > type_list_sort_fields classGlom_1_1Formatting.html a471931c666d9ba9d1a264c7779b11a1e Formatting classGlom_1_1Formatting.html a8cefd35244ea950e8fbe4b60c7005804 () Formatting classGlom_1_1Formatting.html ac217c90b68e603bebebbe7575559b867 (const Formatting &src) Formatting & operator= classGlom_1_1Formatting.html a76f9bdacd82356589eb4b70394bc9322 (const Formatting &src) virtual ~Formatting classGlom_1_1Formatting.html a2c5b9e7f68d22a0894c2163cf8480eab () bool operator== classGlom_1_1Formatting.html a532db02ec0b34a03be301b2709c7236c (const Formatting &src) const bool get_has_choices classGlom_1_1Formatting.html ad6a6c3e2f9984679c3dbbd4b78862f8a () const bool get_has_related_choices classGlom_1_1Formatting.html a02a54590984b358527a60cacd03c0657 () const bool get_has_related_choices classGlom_1_1Formatting.html ab15167adfbeccf3f5b19668c2ba8d29f (bool &show_all, bool &with_second) const void set_has_related_choices classGlom_1_1Formatting.html a559e0226887154ad1b1d38921d65eddc (bool val=true) bool get_has_custom_choices classGlom_1_1Formatting.html aa05d15b51a6c4a0731d2b2badc1a5e54 () const void set_has_custom_choices classGlom_1_1Formatting.html abd0c02540e2e4f5659b481901ea39fe1 (bool val=true) virtual type_list_values get_choices_custom classGlom_1_1Formatting.html afdfe7267641ceab5e2866ea251ae3eaa () const virtual void set_choices_custom classGlom_1_1Formatting.html ab1902dcbf81504eba026b249dc2a1293 (const type_list_values &choices) Glib::ustring get_custom_choice_original_for_translated_text classGlom_1_1Formatting.html af2ddf157d2dc4cfc35512b99a21e1c8e (const Glib::ustring &text, const Glib::ustring &locale=Glib::ustring()) const Glib::ustring get_custom_choice_translated classGlom_1_1Formatting.html a5311e032cebf6fcaf9b53c191261e2d3 (const Glib::ustring &original_text, const Glib::ustring &locale=Glib::ustring()) const bool get_choices_restricted classGlom_1_1Formatting.html a90d827f996d05acceb581d00485aea88 (bool &as_radio_buttons) const void set_choices_restricted classGlom_1_1Formatting.html a217517a0787e506e009333a16f6d8396 (bool val=true, bool as_radio_buttons=false) void get_choices_related classGlom_1_1Formatting.html ae6fa1dfffddcc8c4178c39b40fa1c24c (sharedptr< const Relationship > &relationship, sharedptr< LayoutItem_Field > &field, sharedptr< LayoutGroup > &extra_layout, type_list_sort_fields &sort_fields, bool &show_all) void get_choices_related classGlom_1_1Formatting.html ac607645ed2dd017c26d99d38ec9559ec (sharedptr< const Relationship > &relationship, sharedptr< const LayoutItem_Field > &field, sharedptr< const LayoutGroup > &extra_layout, type_list_sort_fields &sort_fields, bool &show_all) const void set_choices_related classGlom_1_1Formatting.html a32edf487eba8afb0bddd5af5af04438c (const sharedptr< const Relationship > &relationship_name, const sharedptr< LayoutItem_Field > &field, const sharedptr< LayoutGroup > &extra_layout, const type_list_sort_fields &sort_fields, bool show_all) sharedptr< const Relationship > get_choices_related_relationship classGlom_1_1Formatting.html a561892d0620b8a9608c4af62cb125d3a (bool &show_all) const bool get_text_format_multiline classGlom_1_1Formatting.html a3acf76fd114b2eb2162e48dcc74c7321 () const void set_text_format_multiline classGlom_1_1Formatting.html a8213e2b1029ea63d89475d6d79f51bb0 (bool value=true) guint get_text_format_multiline_height_lines classGlom_1_1Formatting.html a0ef3a9745a0b4be23ea0f19935d404bf () const void set_text_format_multiline_height_lines classGlom_1_1Formatting.html abce7076e405bef50bf31cc5722293451 (guint value) void set_text_format_font classGlom_1_1Formatting.html a8fcc08f3077676398f3613bde410242f (const Glib::ustring &font_desc) Glib::ustring get_text_format_font classGlom_1_1Formatting.html a50a4cc0ba124d7ce146788c21bea9530 () const void set_text_format_color_foreground classGlom_1_1Formatting.html a1d0f616d627d69f5187419b3d2da6696 (const Glib::ustring &color) Glib::ustring get_text_format_color_foreground_to_use classGlom_1_1Formatting.html aa0e55b99d575037b6944c8c9f8944756 (const Gnome::Gda::Value &value) const Glib::ustring get_text_format_color_foreground classGlom_1_1Formatting.html aeb82182a140b6f350e182314dedeb7eb () const void set_text_format_color_background classGlom_1_1Formatting.html a16855daa7f6ab551272df222d1f09b3d (const Glib::ustring &color) Glib::ustring get_text_format_color_background classGlom_1_1Formatting.html a9defbf66cb65185d2790e4d090d535df () const void set_horizontal_alignment classGlom_1_1Formatting.html a0ac91366daa05368d7726c0d95a7a7b1 (HorizontalAlignment alignment) HorizontalAlignment get_horizontal_alignment classGlom_1_1Formatting.html aaa9ec3b725e137af6eae3fc4ddac906a () const bool change_field_item_name classGlom_1_1Formatting.html afb057b514006f18406dd7104e0e6c3d3 (const Glib::ustring &table_name, const Glib::ustring &field_name_old, const Glib::ustring &field_name_new) UsesRelationship classGlom_1_1UsesRelationship.html a08d9232e304a6be1929f826c07be8401 () UsesRelationship classGlom_1_1UsesRelationship.html ad1c70e67858276fa99873c02ff8a792b (const UsesRelationship &src) UsesRelationship & operator= classGlom_1_1UsesRelationship.html af4fb6ac7c853d638f6f8d0b804af8e0a (const UsesRelationship &src) virtual ~UsesRelationship classGlom_1_1UsesRelationship.html af5bfa953f8b4a33bd715c74e9530d435 () bool operator== classGlom_1_1UsesRelationship.html a854b7d9573391af22ffd58a315e27f24 (const UsesRelationship &src) const bool get_has_relationship_name classGlom_1_1UsesRelationship.html a8de43ba6a30c8f6d0b59dfe7dd1d070b () const bool get_has_related_relationship_name classGlom_1_1UsesRelationship.html a77c12cb5a554e4364992394492e64178 () const Glib::ustring get_relationship_name classGlom_1_1UsesRelationship.html ab6ea484067457f54de8895d34fe6c2dc () const Glib::ustring get_related_relationship_name classGlom_1_1UsesRelationship.html a7d15ed810c92859fb53a82e26b5face0 () const sharedptr< const Relationship > get_relationship classGlom_1_1UsesRelationship.html a40cfa11ef5fdf8d3c0e3e16085cad938 () const void set_relationship classGlom_1_1UsesRelationship.html a74095e72197767f88d82c46a7e34a736 (const sharedptr< const Relationship > &relationship) sharedptr< const Relationship > get_related_relationship classGlom_1_1UsesRelationship.html abcf10758be1aab7fa9c9fbef1bead50e () const void set_related_relationship classGlom_1_1UsesRelationship.html a54efb0dfb756d96fbb8b5158ea987d1f (const sharedptr< const Relationship > &relationship) Glib::ustring get_table_used classGlom_1_1UsesRelationship.html a9c318b7b53b289b2cce4b7a2837c6ac3 (const Glib::ustring &parent_table) const Glib::ustring get_title_used classGlom_1_1UsesRelationship.html a2ccf4d8cd1befada6a147b0778c1576a (const Glib::ustring &parent_table_title, const Glib::ustring &locale) const Glib::ustring get_title_singular_used classGlom_1_1UsesRelationship.html ab063e8289aa2d55e107bf2de71953118 (const Glib::ustring &parent_table_title, const Glib::ustring &locale) const Glib::ustring get_to_field_used classGlom_1_1UsesRelationship.html ad617dbc1dac6a36622e1df4d19460820 () const Glib::ustring get_relationship_name_used classGlom_1_1UsesRelationship.html aba1275ef9104195d0295ededca4baa87 () const bool get_relationship_used_allows_edit classGlom_1_1UsesRelationship.html a5f62a279a3b92f332a281908e7373cc1 () const Glib::ustring get_sql_join_alias_name classGlom_1_1UsesRelationship.html a848a62d4a236699d2b72eeb07336e118 () const Glib::ustring get_sql_table_or_join_alias_name classGlom_1_1UsesRelationship.html a4e11c0d9f8ce41071d029a577c2d1bb4 (const Glib::ustring &parent_table) const Glib::ustring get_relationship_display_name classGlom_1_1UsesRelationship.html a5f39f0e0ba5ca199ed38cb30aa17a519 () const NumericFormat m_numeric_format classGlom_1_1Formatting.html a864f56d7a3da40090ed64f73dbac7322 Glom::LayoutGroup classGlom_1_1LayoutGroup.html Glom::LayoutItem std::vector< sharedptr< LayoutItem > > type_list_items classGlom_1_1LayoutGroup.html a5444b6f4cd0a9f227dc4ee06fe3b3cf0 std::vector< sharedptr< const LayoutItem > > type_list_const_items classGlom_1_1LayoutGroup.html af8b21f87bf200e1eb5362f2ce60e8e4a LayoutGroup classGlom_1_1LayoutGroup.html ab6f26b67e8f5ac3d1663435efc517950 () LayoutGroup classGlom_1_1LayoutGroup.html ad28231f56022d8e89693d72136b9ea8c (const LayoutGroup &src) LayoutGroup & operator= classGlom_1_1LayoutGroup.html aaa8a5bba0d9680acc8ae21c60674899d (const LayoutGroup &src) virtual ~LayoutGroup classGlom_1_1LayoutGroup.html af1e2feb8df081463c5f02851abbbe87c () virtual LayoutItem * clone classGlom_1_1LayoutGroup.html a1ddf5c761622a415411253a265a67027 () const bool has_field classGlom_1_1LayoutGroup.html ad967dd891c96a894eabbff130e7c90e9 (const Glib::ustring &parent_table_name, const Glib::ustring &table_name, const Glib::ustring &field_name) const bool has_any_fields classGlom_1_1LayoutGroup.html affc3a68341d7ffff6fc3df720a677fda () const void add_item classGlom_1_1LayoutGroup.html a2f600f375268eda33a8f87affe1e2940 (const sharedptr< LayoutItem > &item) void add_item classGlom_1_1LayoutGroup.html acf3a338ec10048565183f5f42e71f6f5 (const sharedptr< LayoutItem > &item, const sharedptr< const LayoutItem > &position) void remove_item classGlom_1_1LayoutGroup.html a948a966cd9828181f58247d74cedcc0b (const sharedptr< LayoutItem > &item) void remove_field classGlom_1_1LayoutGroup.html a45bdb23b5aae36a859a033d55fa0ee14 (const Glib::ustring &parent_table_name, const Glib::ustring &table_name, const Glib::ustring &field_name) virtual void change_field_item_name classGlom_1_1LayoutGroup.html a782b22d60d283514519d5853cc4d4791 (const Glib::ustring &table_name, const Glib::ustring &field_name, const Glib::ustring &field_name_new) virtual void change_related_field_item_name classGlom_1_1LayoutGroup.html a602a9612a4ff78598f5b02688f9cba70 (const Glib::ustring &table_name, const Glib::ustring &field_name, const Glib::ustring &field_name_new) virtual void remove_relationship classGlom_1_1LayoutGroup.html a8a93478039c6c4bd9a432d2a1ef7da34 (const sharedptr< const Relationship > &relationship) void remove_all_items classGlom_1_1LayoutGroup.html ab59d9816e75104f40f00ccdbcbdab22e () double get_border_width classGlom_1_1LayoutGroup.html ae18431459e3d9ebfddcb1f70611f9b7b () const void set_border_width classGlom_1_1LayoutGroup.html a5e8081f3580ce4a9ee15c58a6215c4a3 (double border_width) guint get_items_count classGlom_1_1LayoutGroup.html afd4f75d0f44bd3271763973853133a31 () const guint get_columns_count classGlom_1_1LayoutGroup.html a1fa9afce617b16ccedeb39e74a8cc1ff () const void set_columns_count classGlom_1_1LayoutGroup.html a6e72f4a42d7332dfe32429d5036f39ce (guint columns_count) type_list_items get_items classGlom_1_1LayoutGroup.html aa8afa06e32af948046dcacf8ec54c5df () type_list_const_items get_items classGlom_1_1LayoutGroup.html aa1725fd135554a0637ad1d00f68c0333 () const type_list_const_items get_items_recursive classGlom_1_1LayoutGroup.html a365ddadcd1a6027c95aaa99f5380db35 () const type_list_items get_items_recursive classGlom_1_1LayoutGroup.html a7dbc8ffb45e9b4b8d4a1bb304e40079d () type_list_const_items get_items_recursive_with_groups classGlom_1_1LayoutGroup.html a3f3494a943baab0f8dfe13543f3688b7 () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutGroup.html a634bd443769eb5cb7806b6003d50298b () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutGroup.html a7de834453116afaadf759c1793743d32 () const LayoutItem classGlom_1_1LayoutItem.html a370b521941530a78789bca5628b7dd5f () LayoutItem classGlom_1_1LayoutItem.html a193bc6da7f754929c242fdcc58a5862a (const LayoutItem &src) LayoutItem & operator= classGlom_1_1LayoutItem.html aa68eb6b1540dda91d1e5db768e8a6cc1 (const LayoutItem &src) virtual ~LayoutItem classGlom_1_1LayoutItem.html abcfb3b2398aa99cd41fde144f95b5f4e () bool operator== classGlom_1_1LayoutItem.html ad07e79bf80a127b9581039b504bda49f (const LayoutItem &src) const virtual bool get_editable classGlom_1_1LayoutItem.html abaed7e31de4a7b3a228ff9d7468359d1 () const virtual void set_editable classGlom_1_1LayoutItem.html ab432aa3e83f9c8d3333d92c0ce541f2f (bool val=true) virtual Glib::ustring get_layout_display_name classGlom_1_1LayoutItem.html ab7d9a251ecd46551198878528623b1ce () const guint get_display_width classGlom_1_1LayoutItem.html ab893b325d963cad72ae557d9e55fb028 () const void set_display_width classGlom_1_1LayoutItem.html a45c16168ebc8e42034c4be660f85ea97 (guint value) void get_print_layout_position classGlom_1_1LayoutItem.html ae4f9461068589f667c4076bfae665211 (double &x, double &y, double &width, double &height) const void set_print_layout_position classGlom_1_1LayoutItem.html a0772df4266c5ef33161ba9e61b3f0c4a (double x, double y, double width, double height) void set_print_layout_position_y classGlom_1_1LayoutItem.html a871eccfb0235967dae9f2e559f43b0e3 (double y) void set_print_layout_split_across_pages classGlom_1_1LayoutItem.html afec222cdd038e9c8821aa19209911d26 (bool split=true) bool get_print_layout_split_across_pages classGlom_1_1LayoutItem.html a4ec5a36401301273708a2578a5ad2066 () const type_list_items m_list_items classGlom_1_1LayoutGroup.html a39cb33d72ffed3ddaad8930c773e385a Glom::LayoutItem classGlom_1_1LayoutItem.html Glom::TranslatableItem virtual LayoutItem * clone classGlom_1_1LayoutItem.html aec14051b9835ffc6b370847bbba39234 () const =0 virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem.html a294c70c200ae58a60b1764419fd962f9 () const =0 virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem.html aa7f041f7f67d684532ca0e0d035865e7 () const Glom::LayoutItem_Button classGlom_1_1LayoutItem__Button.html Glom::LayoutItem_WithFormatting LayoutItem_Button classGlom_1_1LayoutItem__Button.html a00b3f32c5de0f54a75b7c3b43ea67df7 () LayoutItem_Button classGlom_1_1LayoutItem__Button.html a2a4ff9550af019cae8483f91e8480f57 (const LayoutItem_Button &src) LayoutItem_Button & operator= classGlom_1_1LayoutItem__Button.html acf38a587ada5b5385f32ddcd089e79c1 (const LayoutItem_Button &src) virtual ~LayoutItem_Button classGlom_1_1LayoutItem__Button.html a672fe5d19abc8ca872c61171db9fd87f () virtual LayoutItem * clone classGlom_1_1LayoutItem__Button.html ab21e53587b70467ca19e02832c5313a3 () const bool operator== classGlom_1_1LayoutItem__Button.html acd7d494fd05a26c1a54911fcff348ffa (const LayoutItem_Button &src) const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Button.html a1688d872d97a30860e8a116ad080129a () const Glib::ustring get_script classGlom_1_1LayoutItem__Button.html a17a9f7f4a29eef0d493067d567f09663 () const bool get_has_script classGlom_1_1LayoutItem__Button.html aedd2bb0ab0a11abc2a0ae72c06c676fd () const void set_script classGlom_1_1LayoutItem__Button.html a81253a97704133bc0a4a12cebdab6764 (const Glib::ustring &script) LayoutItem_WithFormatting classGlom_1_1LayoutItem__WithFormatting.html a3af7021b565392474390d225bcf6840e () LayoutItem_WithFormatting classGlom_1_1LayoutItem__WithFormatting.html ab362e44a2c211cd24a8372871a85a6db (const LayoutItem_WithFormatting &src) LayoutItem_WithFormatting & operator= classGlom_1_1LayoutItem__WithFormatting.html aa0c0c041d7c00e11d8414a18b9d43b82 (const LayoutItem_WithFormatting &src) virtual ~LayoutItem_WithFormatting classGlom_1_1LayoutItem__WithFormatting.html aec0e9171c508e98e8dfb2fe1686024f0 () bool operator== classGlom_1_1LayoutItem__WithFormatting.html abc75b88f0302d9faf23a010dde2c52ef (const LayoutItem_WithFormatting &src) const virtual const Formatting & get_formatting_used classGlom_1_1LayoutItem__WithFormatting.html a16407abedf0cb445c7d11d946ba45938 () const virtual Formatting::HorizontalAlignment get_formatting_used_horizontal_alignment classGlom_1_1LayoutItem__WithFormatting.html ad0432f912c0141c569d2d75eeedf80e9 (bool for_details_view=false) const Formatting m_formatting classGlom_1_1LayoutItem__WithFormatting.html a5d10955e0f1e9fe426d6a79f6eb7c60b Glom::LayoutItem_CalendarPortal classGlom_1_1LayoutItem__CalendarPortal.html Glom::LayoutItem_Portal LayoutItem_CalendarPortal classGlom_1_1LayoutItem__CalendarPortal.html af51129ed35a198ff4af45f19302a82d9 () LayoutItem_CalendarPortal classGlom_1_1LayoutItem__CalendarPortal.html a160ecf721711fd7245a18b6c5cdd6d20 (const LayoutItem_CalendarPortal &src) LayoutItem_CalendarPortal & operator= classGlom_1_1LayoutItem__CalendarPortal.html a3690429a0898c800925148618e6b53a6 (const LayoutItem_CalendarPortal &src) virtual ~LayoutItem_CalendarPortal classGlom_1_1LayoutItem__CalendarPortal.html a148637c95541f3ff639aa5d0e4ce93a4 () virtual LayoutItem * clone classGlom_1_1LayoutItem__CalendarPortal.html adb5e7757076a6f76bdebc61196833d07 () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__CalendarPortal.html a8591138cfa51a4e3ae109c790f6ad80e () const sharedptr< Field > get_date_field classGlom_1_1LayoutItem__CalendarPortal.html ac25a7693d3206c5a7a831601b501e5bd () sharedptr< const Field > get_date_field classGlom_1_1LayoutItem__CalendarPortal.html abacf290a745eacaba0d767b400bf87d0 () const void set_date_field classGlom_1_1LayoutItem__CalendarPortal.html a9c6fd10f1b7f9a4ceb521fb9a461f301 (const sharedptr< Field > &field) virtual void change_field_item_name classGlom_1_1LayoutItem__CalendarPortal.html a21ba211a5d784363fdd4bdac42c7c790 (const Glib::ustring &table_name, const Glib::ustring &field_name, const Glib::ustring &field_name_new) virtual void change_related_field_item_name classGlom_1_1LayoutItem__CalendarPortal.html aec5b8b069543b47ae537970595821bae (const Glib::ustring &table_name, const Glib::ustring &field_name, const Glib::ustring &field_name_new) LayoutItem_Portal classGlom_1_1LayoutItem__Portal.html ac3f6ee86b16bf685a1865ca4af56ffcf () LayoutItem_Portal classGlom_1_1LayoutItem__Portal.html a954b4241b93c441733d4efccfc273551 (const LayoutItem_Portal &src) LayoutItem_Portal & operator= classGlom_1_1LayoutItem__Portal.html a43edecb7d7ef207f571022899d006260 (const LayoutItem_Portal &src) virtual ~LayoutItem_Portal classGlom_1_1LayoutItem__Portal.html aa09b2ee368553c600d8793699c454816 () virtual Glib::ustring get_title classGlom_1_1LayoutItem__Portal.html ac209719cb1c9d4211ad17a04eef2f271 (const Glib::ustring &locale) const virtual Glib::ustring get_title_or_name classGlom_1_1LayoutItem__Portal.html af8dbd64a20f83845e866351680a315f1 (const Glib::ustring &locale) const Glib::ustring get_from_table classGlom_1_1LayoutItem__Portal.html acdb03d31a8822f900c7baf42b2dbe026 () const sharedptr< UsesRelationship > get_navigation_relationship_specific classGlom_1_1LayoutItem__Portal.html a95e5f43421d21e805695c8789e8cf2e7 () sharedptr< const UsesRelationship > get_navigation_relationship_specific classGlom_1_1LayoutItem__Portal.html aaffff294ec775a400fa3def7d2be08bc () const void set_navigation_relationship_specific classGlom_1_1LayoutItem__Portal.html a0f8420d7b9f54e5a42e6f98fea43ced7 (const sharedptr< UsesRelationship > &relationship) void reset_navigation_relationship classGlom_1_1LayoutItem__Portal.html ae115a916fb3cc3e510d9cdeba2be20da () navigation_type get_navigation_type classGlom_1_1LayoutItem__Portal.html a7919b2be87e5e2f9de31e19597b1282b () const void set_navigation_type classGlom_1_1LayoutItem__Portal.html a4b6e005d2800eb04995b9c641872bb65 (navigation_type type) void get_suitable_table_to_view_details classGlom_1_1LayoutItem__Portal.html ae9431f02555153084df6f562a7b12167 (Glib::ustring &table_name, sharedptr< const UsesRelationship > &relationship, const Document *document) const sharedptr< const UsesRelationship > get_portal_navigation_relationship_automatic classGlom_1_1LayoutItem__Portal.html a426fde8bbffc4889c4bb08282db4d526 (const Document *document) const double get_print_layout_row_height classGlom_1_1LayoutItem__Portal.html a0fc8ea5d4186768c8d029cd585a94823 () const void set_print_layout_row_height classGlom_1_1LayoutItem__Portal.html ad30c7ab27c5af843f2aba81f31e7bc48 (double row_height) double get_print_layout_row_line_width classGlom_1_1LayoutItem__Portal.html af0f846bd5913e00933ad489c29ae5cf0 () const void set_print_layout_row_line_width classGlom_1_1LayoutItem__Portal.html a935e51fb356b70139bb3e5856bfcb7d3 (double width) double get_print_layout_column_line_width classGlom_1_1LayoutItem__Portal.html a41b913c6a72b1ef550f1ec96182e1c06 () const void set_print_layout_column_line_width classGlom_1_1LayoutItem__Portal.html ae3e8454174c06036606636c36dd7d2c8 (double width) Glib::ustring get_print_layout_line_color classGlom_1_1LayoutItem__Portal.html acafecb5c818c16e8e32378e3808f6359 () const void set_print_layout_line_color classGlom_1_1LayoutItem__Portal.html abc31e267981d9470ac82876db578a6ef (const Glib::ustring &color) void get_rows_count classGlom_1_1LayoutItem__Portal.html ac864524195fefaf6fc49c18270eef87e (gulong &rows_count_min, gulong &rows_count_max) const void set_rows_count classGlom_1_1LayoutItem__Portal.html a1d507ac7e721307e940bc762e560ec9a (gulong rows_count_min, gulong rows_count_max) navigation_type classGlom_1_1LayoutItem__Portal.html aee2aed2ac459d4f6a0e32b6b6c9f0f75 NAVIGATION_NONE classGlom_1_1LayoutItem__Portal.html aee2aed2ac459d4f6a0e32b6b6c9f0f75a329b6c6510b5d604146a8b20aad5af9b NAVIGATION_AUTOMATIC classGlom_1_1LayoutItem__Portal.html aee2aed2ac459d4f6a0e32b6b6c9f0f75a1bd463cd69729f739cbd493b27a2cdcd NAVIGATION_SPECIFIC classGlom_1_1LayoutItem__Portal.html aee2aed2ac459d4f6a0e32b6b6c9f0f75a0db576ac945533ba968c47c548ed79fe Glom::predicate_LayoutItem_Field_IsSameField classGlom_1_1predicate__LayoutItem__Field__IsSameField.html predicate_LayoutItem_Field_IsSameField classGlom_1_1predicate__LayoutItem__Field__IsSameField.html a06105ddbce2bb9160307a73dc354ae05 (const sharedptr< const T_ElementField > &layout_item) bool operator() classGlom_1_1predicate__LayoutItem__Field__IsSameField.html a44bdce15ef16940266f8049a3c3ddbaf (const sharedptr< const T_Element > &element) Glom::LayoutItem_Field classGlom_1_1LayoutItem__Field.html Glom::LayoutItem_WithFormatting Glom::UsesRelationship LayoutItem_Field classGlom_1_1LayoutItem__Field.html a312279764f2e2b122e72175e7c784491 () LayoutItem_Field classGlom_1_1LayoutItem__Field.html a83995649de46f3b46768f79022e93b07 (const LayoutItem_Field &src) LayoutItem_Field & operator= classGlom_1_1LayoutItem__Field.html a51ab08b4c2fe1e3216278205ccd8345c (const LayoutItem_Field &src) virtual ~LayoutItem_Field classGlom_1_1LayoutItem__Field.html acc10b38c3fd09adf745877289c5519c7 () virtual LayoutItem * clone classGlom_1_1LayoutItem__Field.html adb84dde6619536fb5d1cbfa723318e62 () const bool operator== classGlom_1_1LayoutItem__Field.html a3a2ac0bc68570560609f8226aef49ff9 (const LayoutItem_Field &src) const virtual void set_name classGlom_1_1LayoutItem__Field.html a5e96a2b505a5729ebecc1005a9ac1a7c (const Glib::ustring &name) virtual Glib::ustring get_name classGlom_1_1LayoutItem__Field.html aa0248c59510ec98e8b954d6ecfcb4cb1 () const virtual Glib::ustring get_title classGlom_1_1LayoutItem__Field.html a22743f4bd8f4ae1a29a04dceb303f37e (const Glib::ustring &locale) const virtual Glib::ustring get_title_or_name classGlom_1_1LayoutItem__Field.html af44e668221773b31a481011030ce0d52 (const Glib::ustring &locale) const Glib::ustring get_title_or_name_no_custom classGlom_1_1LayoutItem__Field.html a9267dd2249996ee55532ea5b5fa5e0ba (const Glib::ustring &locale) const sharedptr< const CustomTitle > get_title_custom classGlom_1_1LayoutItem__Field.html af7585cb570b7d2cbe97565923b1547bf () const sharedptr< CustomTitle > get_title_custom classGlom_1_1LayoutItem__Field.html afa37c8c67e87952027215bf3ed0d7d06 () void set_title_custom classGlom_1_1LayoutItem__Field.html a92e701f44e8b59cad3235cac4a301cd2 (const sharedptr< CustomTitle > &title) virtual Glib::ustring get_layout_display_name classGlom_1_1LayoutItem__Field.html aca877212b1731c41f905fed3f2e7261b () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Field.html ae18e50675595ea39d3c7c8e0eaaa5318 () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__Field.html a2563ec56502589479bb2ec2ec21ed205 () const void set_full_field_details classGlom_1_1LayoutItem__Field.html a9ab952dfe0242c0eca45a6fc3fb5d8df (const sharedptr< const Field > &field) sharedptr< const Field > get_full_field_details classGlom_1_1LayoutItem__Field.html af176258e62a5906ca2a67d0e913e2f99 () const Field::glom_field_type get_glom_type classGlom_1_1LayoutItem__Field.html a4f988b415db9bd4aa4e5c8488d4e2998 () const bool get_editable_and_allowed classGlom_1_1LayoutItem__Field.html a90d532d50123f0094940cf0b7dc9a91a () const bool get_hidden classGlom_1_1LayoutItem__Field.html af2eb4539b3550bc75d0adff0e364b82d () const void set_hidden classGlom_1_1LayoutItem__Field.html a9a1015d10fc93c8810c8d460313f25d6 (bool val=true) bool get_formatting_use_default classGlom_1_1LayoutItem__Field.html a118b982f10589e3f0306c62aa84d2695 () const void set_formatting_use_default classGlom_1_1LayoutItem__Field.html a2e3083a50fe5c26e63f496e3a46a3268 (bool use_default=true) virtual const Formatting & get_formatting_used classGlom_1_1LayoutItem__Field.html ae199528886ff70c7758445b56e281985 () const virtual Formatting::HorizontalAlignment get_formatting_used_horizontal_alignment classGlom_1_1LayoutItem__Field.html ad282bfea592bce996332636180b66d58 (bool for_details_view=false) const bool get_formatting_used_has_translatable_choices classGlom_1_1LayoutItem__Field.html a6a7f15fbc8dcaccf819a6cdbc6e912e9 () const bool is_same_field classGlom_1_1LayoutItem__Field.html a56d81dae9c69e16ae9742c59150f1c0e (const sharedptr< const LayoutItem_Field > &field) const bool m_priv_view classGlom_1_1LayoutItem__Field.html a89c7f17a6fe692c7e2388032cd1cec96 bool m_priv_edit classGlom_1_1LayoutItem__Field.html a2bf327f386eaf382447e1f7dc8f57d97 Glom::LayoutItem_Image classGlom_1_1LayoutItem__Image.html Glom::LayoutItem LayoutItem_Image classGlom_1_1LayoutItem__Image.html aad409f1b3b0248e49f78e9b18263bbbb () LayoutItem_Image classGlom_1_1LayoutItem__Image.html a1167f8d69a599aa2954bd3f6777aa55b (const LayoutItem_Image &src) LayoutItem_Image & operator= classGlom_1_1LayoutItem__Image.html a1c93fc8ace0dd45bb912cb5103ac4b3a (const LayoutItem_Image &src) virtual ~LayoutItem_Image classGlom_1_1LayoutItem__Image.html a99f1ba6c5be562b567d957d9c90b0bc1 () virtual LayoutItem * clone classGlom_1_1LayoutItem__Image.html aefd3186f7ccd65c8d4992885443c82cc () const bool operator== classGlom_1_1LayoutItem__Image.html a1361251a5f1a68473f8cd0e734e210fd (const LayoutItem_Image &src) const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Image.html a06b49e2e856ba3d175dc9900ca7481fc () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__Image.html a5c3ded4748529c109f8fc771595aba4e () const Gnome::Gda::Value get_image classGlom_1_1LayoutItem__Image.html a71112b07fca1b96c24b657a1530857e5 () const void set_image classGlom_1_1LayoutItem__Image.html a6d85bae161efeafc6be7a25bc950e7a2 (const Gnome::Gda::Value &image) Glib::ustring create_local_image_uri classGlom_1_1LayoutItem__Image.html a995973b3bc0a34e784b03857ddf05b8b () const Gnome::Gda::Value m_image classGlom_1_1LayoutItem__Image.html ad73ae1d7a678f8b3395b9301905422a0 Glom::LayoutItem_Line classGlom_1_1LayoutItem__Line.html Glom::LayoutItem LayoutItem_Line classGlom_1_1LayoutItem__Line.html a56566dcba44ad36603724e1aeaa00e9b () LayoutItem_Line classGlom_1_1LayoutItem__Line.html a09512d126a5e21f038025a01027ed8a6 (const LayoutItem_Line &src) LayoutItem_Line & operator= classGlom_1_1LayoutItem__Line.html a77ef7cc070a42a709080b3f220ad2dd7 (const LayoutItem_Line &src) virtual ~LayoutItem_Line classGlom_1_1LayoutItem__Line.html a78c4bb191f4a5ff2e33b6f50a744b51d () virtual LayoutItem * clone classGlom_1_1LayoutItem__Line.html a2bf6fcf8c42dc9749296c9a4c09884dd () const bool operator== classGlom_1_1LayoutItem__Line.html a1d4a3a10824a01d06550e75bc70903cb (const LayoutItem_Line &src) const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Line.html ae5422861e4b17f540958ca066b193097 () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__Line.html ab304d1dc4baff0d88cad3cd6a6a2f0a7 () const void get_coordinates classGlom_1_1LayoutItem__Line.html afefd4f89604aaa0cf28ac8b9e89f9ea8 (double &start_x, double &start_y, double &end_x, double &end_y) const void set_coordinates classGlom_1_1LayoutItem__Line.html a296b6a81745f8bfd80c9d4d9a2356f1e (double start_x, double start_y, double end_x, double end_y) double get_line_width classGlom_1_1LayoutItem__Line.html a02f77947d7837a497884780f4d9e6ea1 () const void set_line_width classGlom_1_1LayoutItem__Line.html a90de85c150524c8f03245d3e1212c560 (double line_width) Glib::ustring get_line_color classGlom_1_1LayoutItem__Line.html a699c7285e9ef853e174af3e4890f5918 () const void set_line_color classGlom_1_1LayoutItem__Line.html a10731087f63c58df78c58a8cbe5ff774 (const Glib::ustring &color) Glom::LayoutItem_Notebook classGlom_1_1LayoutItem__Notebook.html Glom::LayoutGroup LayoutItem_Notebook classGlom_1_1LayoutItem__Notebook.html a1db785b35a8a27e0168e07040e06ada0 () LayoutItem_Notebook classGlom_1_1LayoutItem__Notebook.html a5a88eac42b2ce249535524bd1f605fe9 (const LayoutItem_Notebook &src) LayoutItem_Notebook & operator= classGlom_1_1LayoutItem__Notebook.html abd93103fdc0270208a174e958b4d3d81 (const LayoutItem_Notebook &src) virtual ~LayoutItem_Notebook classGlom_1_1LayoutItem__Notebook.html a37314fb234b269926fb96655053fb369 () virtual LayoutItem * clone classGlom_1_1LayoutItem__Notebook.html afbaeb08aa14f882d5e2130ab9277ca20 () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Notebook.html a2eb0a6017bddf620fd743f1eb586b1ba () const Glom::LayoutItem_Placeholder classGlom_1_1LayoutItem__Placeholder.html Glom::LayoutItem LayoutItem_Placeholder classGlom_1_1LayoutItem__Placeholder.html a5e2da34b8731604cc7147f4c736f74c9 () ~LayoutItem_Placeholder classGlom_1_1LayoutItem__Placeholder.html aa9eb7caa697c5df480c5557075d626f3 () LayoutItem_Placeholder classGlom_1_1LayoutItem__Placeholder.html aafc3689d681ea80b8ed88bbbe205fb1e (const LayoutItem_Placeholder &src) virtual LayoutItem * clone classGlom_1_1LayoutItem__Placeholder.html a35cb8c68a84a45c02b73c84361f698bb () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Placeholder.html a572489919f4cf00e478a7b0cb11b6611 () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__Placeholder.html a6cfd34400b8f169bcdac845cb2cf1f94 () const bool operator== classGlom_1_1LayoutItem__Placeholder.html aa4712068ad68656f2ece7f5ff6a68990 (const LayoutItem_Placeholder *src) const Glom::LayoutItem_Portal classGlom_1_1LayoutItem__Portal.html Glom::LayoutGroup Glom::UsesRelationship virtual LayoutItem * clone classGlom_1_1LayoutItem__Portal.html ad2b7fa5dc4e10ea20419a38b033de855 () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Portal.html ac367919be804872aa902578b678c5705 () const virtual void change_field_item_name classGlom_1_1LayoutItem__Portal.html a03538cdb5aaa32ff28f853294f92515e (const Glib::ustring &table_name, const Glib::ustring &field_name, const Glib::ustring &field_name_new) virtual void change_related_field_item_name classGlom_1_1LayoutItem__Portal.html a57445965ca4471e5fce086bd3a532519 (const Glib::ustring &table_name, const Glib::ustring &field_name, const Glib::ustring &field_name_new) Glom::LayoutItem_Text classGlom_1_1LayoutItem__Text.html Glom::LayoutItem_WithFormatting LayoutItem_Text classGlom_1_1LayoutItem__Text.html a5cf0aa60dacdba7f3294bb34e777b0d1 () LayoutItem_Text classGlom_1_1LayoutItem__Text.html afe3b7b46f6690b54d9e5f0dadb3a7cd1 (const LayoutItem_Text &src) LayoutItem_Text & operator= classGlom_1_1LayoutItem__Text.html aa2cde544e052ad1b4fdcd6492ec145f4 (const LayoutItem_Text &src) virtual ~LayoutItem_Text classGlom_1_1LayoutItem__Text.html a1a2ad4428f294a78a402eafd00e27168 () virtual LayoutItem * clone classGlom_1_1LayoutItem__Text.html a9454fdbd40c634be172306978c1f660c () const bool operator== classGlom_1_1LayoutItem__Text.html a1a27554f574c0489086afc6b8962c0c5 (const LayoutItem_Text &src) const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Text.html a8ca162c630f723d3aa443a7db6d4b519 () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__Text.html acda4996ffb302eb596d4beb7baf87ad5 () const Glib::ustring get_text classGlom_1_1LayoutItem__Text.html a2b7692c272d642c91d75665d984c59a6 (const Glib::ustring &locale) const void set_text classGlom_1_1LayoutItem__Text.html a6fa770b6562b0f64afeaa66c37a2ec12 (const Glib::ustring &text, const Glib::ustring &locale) void set_text_original classGlom_1_1LayoutItem__Text.html a87daed6da9ad65094177cdbe64ebe38f (const Glib::ustring &text) sharedptr< TranslatableItem > m_text classGlom_1_1LayoutItem__Text.html ac28edbfeef06c5bc6f9ad122994d9933 Glom::LayoutItem_WithFormatting classGlom_1_1LayoutItem__WithFormatting.html Glom::LayoutItem Glom::UsesRelationship classGlom_1_1UsesRelationship.html Glom::LayoutItem_FieldSummary classGlom_1_1LayoutItem__FieldSummary.html Glom::LayoutItem_Field summaryType classGlom_1_1LayoutItem__FieldSummary.html ac7a444ba46f7e39d99f404f0732470a8 TYPE_INVALID classGlom_1_1LayoutItem__FieldSummary.html ac7a444ba46f7e39d99f404f0732470a8a93cc3a5462b74dcefc32c7cbd7f86e95 TYPE_SUM classGlom_1_1LayoutItem__FieldSummary.html ac7a444ba46f7e39d99f404f0732470a8aaf4eed59bf396496c2aa7a19bd30ac64 TYPE_AVERAGE classGlom_1_1LayoutItem__FieldSummary.html ac7a444ba46f7e39d99f404f0732470a8a00e4f4aaa38f0cd0e129b66294f63fde TYPE_COUNT classGlom_1_1LayoutItem__FieldSummary.html ac7a444ba46f7e39d99f404f0732470a8a31f89bf6388e3abff94f08dfdc5e68b6 LayoutItem_FieldSummary classGlom_1_1LayoutItem__FieldSummary.html a1a383a4360f51784799b0231494a9c65 () LayoutItem_FieldSummary classGlom_1_1LayoutItem__FieldSummary.html aa3bf4352da0411e0e5800a1295d69213 (const LayoutItem_FieldSummary &src) LayoutItem_FieldSummary & operator= classGlom_1_1LayoutItem__FieldSummary.html a16cf05d7a4fc348180853e32d95bff86 (const LayoutItem_FieldSummary &src) virtual ~LayoutItem_FieldSummary classGlom_1_1LayoutItem__FieldSummary.html a6fa170a3d750d6f9ee7adc7810fc4496 () virtual LayoutItem * clone classGlom_1_1LayoutItem__FieldSummary.html a19923194d1c2539943d09e0e26e5019a () const bool operator== classGlom_1_1LayoutItem__FieldSummary.html a543e2195dd01dfd706ee9974c51cee13 (const LayoutItem_FieldSummary &src) const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__FieldSummary.html af9cd593a191dc9346350adb59228caaa () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__FieldSummary.html af6bf3d9534a0851dbdcd73f856301599 () const summaryType get_summary_type classGlom_1_1LayoutItem__FieldSummary.html a485f114337139cdc3a56582354358e66 () const void set_summary_type classGlom_1_1LayoutItem__FieldSummary.html ac8f5d02ec14cd7ef0632a7553a70982a (summaryType summary_type) Glib::ustring get_summary_type_sql classGlom_1_1LayoutItem__FieldSummary.html a0939ff5eb6ae75dbb9699fd611a3227b () const void set_summary_type_from_sql classGlom_1_1LayoutItem__FieldSummary.html a40e8f2829757218074199758c33d298a (const Glib::ustring &summary_type) void set_field classGlom_1_1LayoutItem__FieldSummary.html ad5efd580794a4a82845dda895f0c641c (const sharedptr< LayoutItem_Field > &field) virtual Glib::ustring get_title classGlom_1_1LayoutItem__FieldSummary.html a0b4b52267f4a2aa37d3084834357da8c (const Glib::ustring &locale) const virtual Glib::ustring get_title_or_name classGlom_1_1LayoutItem__FieldSummary.html ab2d6a72c81bf705fe684823ee72bcaab (const Glib::ustring &locale) const virtual Glib::ustring get_layout_display_name classGlom_1_1LayoutItem__FieldSummary.html a83dca29064de2165f09f8e92bc36d6e0 () const Glib::ustring get_layout_display_name_field classGlom_1_1LayoutItem__FieldSummary.html af8e643306d8317bc1515cde40e50a0fc () const static Glib::ustring get_summary_type_name classGlom_1_1LayoutItem__FieldSummary.html a73400ed5d8aca7f8c5cb427a542871a9 (summaryType summary_type) Glom::LayoutItem_Footer classGlom_1_1LayoutItem__Footer.html Glom::LayoutGroup LayoutItem_Footer classGlom_1_1LayoutItem__Footer.html af42d7a6df5f3f6bce10160cf4d480a3b () LayoutItem_Footer classGlom_1_1LayoutItem__Footer.html ab29ec6bf51dba1da570443eed0022247 (const LayoutItem_Footer &src) LayoutItem_Footer & operator= classGlom_1_1LayoutItem__Footer.html ac352b9abb7d43aff4a3aec839170ef19 (const LayoutItem_Footer &src) virtual ~LayoutItem_Footer classGlom_1_1LayoutItem__Footer.html a1e719d590a8d26f7edbab966b9c6275e () virtual LayoutItem * clone classGlom_1_1LayoutItem__Footer.html a1e1bca341bf633e8d5b9d6c08bdcd94e () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Footer.html aed9b8281b68262a077693ae625eb4ee3 () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__Footer.html a6af2e86389acd26332d71355e1b243b4 () const Glom::LayoutItem_GroupBy classGlom_1_1LayoutItem__GroupBy.html Glom::LayoutGroup Formatting::type_pair_sort_field type_pair_sort_field classGlom_1_1LayoutItem__GroupBy.html af5705c8779ec1567fe28d0a07ab1dae1 Formatting::type_list_sort_fields type_list_sort_fields classGlom_1_1LayoutItem__GroupBy.html afeaa8db3528f28ff5543280771d7ea9a LayoutItem_GroupBy classGlom_1_1LayoutItem__GroupBy.html aef2d5076b2bcd6ea87fc6f6fb778bd77 () LayoutItem_GroupBy classGlom_1_1LayoutItem__GroupBy.html a177a17665f678a1b8c07069ab0a343a6 (const LayoutItem_GroupBy &src) LayoutItem_GroupBy & operator= classGlom_1_1LayoutItem__GroupBy.html ab8952eca3d750a55cfb358db2e8a053f (const LayoutItem_GroupBy &src) virtual ~LayoutItem_GroupBy classGlom_1_1LayoutItem__GroupBy.html abfeb7c298375ebec4d589a9780c1c604 () virtual LayoutItem * clone classGlom_1_1LayoutItem__GroupBy.html a2973ccf0450912be8e8892ee149430d3 () const sharedptr< LayoutItem_Field > get_field_group_by classGlom_1_1LayoutItem__GroupBy.html af5b9976941cc8328939f5e39ffcfd52d () sharedptr< const LayoutItem_Field > get_field_group_by classGlom_1_1LayoutItem__GroupBy.html a52c726e6f3d5a0b60ca0ef755debd036 () const bool get_has_field_group_by classGlom_1_1LayoutItem__GroupBy.html ad72cab568a4f32840cfba438ac97da1e () const void set_field_group_by classGlom_1_1LayoutItem__GroupBy.html ac27d718e2d915c0e3c196f5c44d1b8ad (const sharedptr< LayoutItem_Field > &field) type_list_sort_fields get_fields_sort_by classGlom_1_1LayoutItem__GroupBy.html add29516e3c95f5509178aae73601a245 () type_list_sort_fields get_fields_sort_by classGlom_1_1LayoutItem__GroupBy.html adc8fb840e69c11058a29b76b530b34e7 () const bool get_has_fields_sort_by classGlom_1_1LayoutItem__GroupBy.html a5d6486b3ea63b5a833d0fcea310a084e () const void set_fields_sort_by classGlom_1_1LayoutItem__GroupBy.html af6233ebe91f08a75108a5252e8653657 (const type_list_sort_fields &field) virtual Glib::ustring get_layout_display_name classGlom_1_1LayoutItem__GroupBy.html aab72f62b0b4133d80719cc0d562b5e31 () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__GroupBy.html a708270a94b3f40aa817ff6a74be28fc9 () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__GroupBy.html a75ad3b1c59d57e5b8cd6e1ebd430910b () const sharedptr< LayoutGroup > get_secondary_fields classGlom_1_1LayoutItem__GroupBy.html af2c284f6f063ca9228ea727e411ded14 () sharedptr< const LayoutGroup > get_secondary_fields classGlom_1_1LayoutItem__GroupBy.html a47be9413a8016d09d5e1ec4dc8cf8959 () const type_list_sort_fields get_sort_by classGlom_1_1LayoutItem__GroupBy.html a71c37a064d32065da7d7cb0408a4524f () const void set_sort_by classGlom_1_1LayoutItem__GroupBy.html aad39d8d5db4934d63365514bf9fc3e2c (const type_list_sort_fields &sort_by) Glom::LayoutItem_Header classGlom_1_1LayoutItem__Header.html Glom::LayoutGroup LayoutItem_Header classGlom_1_1LayoutItem__Header.html a298fce41d5a9e990b8180a34fa89c7a1 () LayoutItem_Header classGlom_1_1LayoutItem__Header.html a882f33e654234866417d2aa94fd9bc78 (const LayoutItem_Header &src) LayoutItem_Header & operator= classGlom_1_1LayoutItem__Header.html af6ce4cd7277a6838928966ee3463cf41 (const LayoutItem_Header &src) virtual ~LayoutItem_Header classGlom_1_1LayoutItem__Header.html a78160bc0cb8fb66259497930e729549e () virtual LayoutItem * clone classGlom_1_1LayoutItem__Header.html a95fe5d54548a1558af18caf2c43cdeeb () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Header.html a2464f44e07ebf75415cc9b714b3cca9f () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__Header.html af17682c3a50c894eb944ebb9073e8659 () const Glom::LayoutItem_Summary classGlom_1_1LayoutItem__Summary.html Glom::LayoutGroup LayoutItem_Summary classGlom_1_1LayoutItem__Summary.html a18f140ac144c7b8e4be2e9b792a9e006 () LayoutItem_Summary classGlom_1_1LayoutItem__Summary.html aac13147739481f2874215e83244a7b5d (const LayoutItem_Summary &src) LayoutItem_Summary & operator= classGlom_1_1LayoutItem__Summary.html ac9eca899e182114045a74a7727c7cf7a (const LayoutItem_Summary &src) virtual ~LayoutItem_Summary classGlom_1_1LayoutItem__Summary.html a7fd0db396f1cfabcd8263dcd878c9a9c () virtual LayoutItem * clone classGlom_1_1LayoutItem__Summary.html a9b136c6c351f0d2fb8582e25d0845396 () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__Summary.html a73cbf61053eab424681c6c7071dd2574 () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__Summary.html a9f00bcf851f7df72c990b5086e9eeca1 () const Glom::LayoutItem_VerticalGroup classGlom_1_1LayoutItem__VerticalGroup.html Glom::LayoutGroup LayoutItem_VerticalGroup classGlom_1_1LayoutItem__VerticalGroup.html a0565284ac341dd56b2969fdc1125bb36 () LayoutItem_VerticalGroup classGlom_1_1LayoutItem__VerticalGroup.html a75020c234aeda70afa11e81005c6c932 (const LayoutItem_VerticalGroup &src) LayoutItem_VerticalGroup & operator= classGlom_1_1LayoutItem__VerticalGroup.html a752efa41e5688d659419001cca39d2d0 (const LayoutItem_VerticalGroup &src) virtual ~LayoutItem_VerticalGroup classGlom_1_1LayoutItem__VerticalGroup.html a5ec7b24846d5ab61d99070bd1f9ca219 () virtual LayoutItem * clone classGlom_1_1LayoutItem__VerticalGroup.html a47e75f27cbe504ec935641d9fced5f49 () const virtual Glib::ustring get_part_type_name classGlom_1_1LayoutItem__VerticalGroup.html a014d47784b111300bd9bad18aa1849d4 () const virtual Glib::ustring get_report_part_id classGlom_1_1LayoutItem__VerticalGroup.html a96f65b960fe7413ac36127c7faf60435 () const Glom::Document classGlom_1_1Document.html GlomBakery::Document_XML HostingMode classGlom_1_1Document.html a54256dad3f42641da3434bf687d5da49 HOSTING_MODE_POSTGRES_CENTRAL classGlom_1_1Document.html a54256dad3f42641da3434bf687d5da49ab86dcd950027408ed28e171902e769aa HOSTING_MODE_POSTGRES_SELF classGlom_1_1Document.html a54256dad3f42641da3434bf687d5da49af6a98f13e469bdd6bfcd933b25fea68b HOSTING_MODE_SQLITE classGlom_1_1Document.html a54256dad3f42641da3434bf687d5da49abf9c730e96318c88df8766514cfdfa9f HOSTING_MODE_DEFAULT classGlom_1_1Document.html a54256dad3f42641da3434bf687d5da49a901e9051108e8e556ba4f260d5adb2f1 userLevelReason classGlom_1_1Document.html abc26e179ab1bb3fc08dbfbe06fbaf410 USER_LEVEL_REASON_UNKNOWN classGlom_1_1Document.html abc26e179ab1bb3fc08dbfbe06fbaf410a8d7d9bacad5ba54589f1b5a412bb3dd4 USER_LEVEL_REASON_FILE_READ_ONLY classGlom_1_1Document.html abc26e179ab1bb3fc08dbfbe06fbaf410a8c5889c747c97b125f96d0d720598315 USER_LEVEL_REASON_DATABASE_ACCESS_LEVEL classGlom_1_1Document.html abc26e179ab1bb3fc08dbfbe06fbaf410a4e77ef46784db3ff58ff34686c45cc7e USER_LEVEL_REASON_OPENED_FROM_BROWSE classGlom_1_1Document.html abc26e179ab1bb3fc08dbfbe06fbaf410a014d8667d572ce4617e504183bdf7462 load_failure_codes classGlom_1_1Document.html a66a6e7180bd2e8ed4b0cd3c98e04bb77 LOAD_FAILURE_CODE_FILE_VERSION_TOO_NEW classGlom_1_1Document.html a66a6e7180bd2e8ed4b0cd3c98e04bb77aaa943ae3fc9f302196739a7da25e2f4a std::vector< sharedptr< Relationship > > type_vec_relationships classGlom_1_1Document.html a5f5a0cd04d7505fc767d8c3fa3619721 std::vector< sharedptr< Field > > type_vec_fields classGlom_1_1Document.html a9cae49d450ede55a856575682eab53dc std::pair< sharedptr< LayoutItem_Field >, sharedptr< Relationship > > type_pairFieldTrigger classGlom_1_1Document.html a5dee218c91225d8fd8f96ffc203b2445 std::vector< type_pairFieldTrigger > type_list_lookups classGlom_1_1Document.html a3f75f2a76002e657af2cfe0d5963d893 std::vector< sharedptr< LayoutGroup > > type_list_layout_groups classGlom_1_1Document.html a9d8a77d03f244bc189e08e133eb475fe std::pair< sharedptr< TranslatableItem >, Glib::ustring > pair_translatable_item_and_hint classGlom_1_1Document.html a446ae20944c704a9357302d9fb02b3aa std::vector< pair_translatable_item_and_hint > type_list_translatables classGlom_1_1Document.html a06d9c2c705edec455df27152ba5d03c7 std::vector< sharedptr< TableInfo > > type_listTableInfo classGlom_1_1Document.html ae25cc2c7c2347816c33d05c7f6e17be7 std::vector< Gnome::Gda::Value > type_row_data classGlom_1_1Document.html aca8431de4908b829ce8024e798b4ff8c std::vector< type_row_data > type_example_rows classGlom_1_1Document.html ab5905a45fa16a88d745959b620a038bc std::vector< GroupInfo > type_list_groups classGlom_1_1Document.html a99ca7426da3e38cfa83b2d4e6b891b1b sigc::signal< void, AppState::userlevels > type_signal_userlevel_changed classGlom_1_1Document.html a7a0abb07acbcae993250c2108c650184 sigc::slot< void > SlotProgress classGlom_1_1Document.html a7fd0175b92c01373c623a3e50b75a9e4 Document classGlom_1_1Document.html a90ff6b08dcaf5ddcae4f3499c2578bf3 () virtual ~Document classGlom_1_1Document.html ad1137e6d112a281cfa43a20bcff4e9bd () virtual void set_modified classGlom_1_1Document.html a6603e178b34d70fc90575b152f0bc1a8 (bool value=true) virtual void set_file_uri classGlom_1_1Document.html a5ceef4693df960dd98481061f3742e59 (const Glib::ustring &file_uri, bool bEnforceFileExtension=false) bool load classGlom_1_1Document.html a1ede7d94348089309c46b7b01229e79e (int &failure_code) void set_opened_from_browse classGlom_1_1Document.html a0e008dfbf0d238b5a77c0f45298edf29 (bool val=true) bool get_opened_from_browse classGlom_1_1Document.html a18bb5479ce943ef28278558960920766 () const void set_allow_autosave classGlom_1_1Document.html ae203d2b063dac5287da64fa63ae50c5e (bool value=true) bool get_is_example_file classGlom_1_1Document.html a2ecc05580205e89f46aa90c5230ac6a4 () const void set_is_example_file classGlom_1_1Document.html a8d4d81de8c825f1f68d1821c05d1023e (bool value=true) bool get_is_backup_file classGlom_1_1Document.html a975584b92b39970310ba24f18581f95e () const void set_is_backup_file classGlom_1_1Document.html accadb18c3bb59d1176df9083b3a2212d (bool value=true) guint get_document_format_version classGlom_1_1Document.html ac3976a7656969455e9c4e1c3c7567972 () void set_hosting_mode classGlom_1_1Document.html ace5a3278c813d2110776852899c22944 (HostingMode mode) HostingMode get_hosting_mode classGlom_1_1Document.html aee42dce3aeb3af15c7e4f5f8ce32fb3c () const void set_network_shared classGlom_1_1Document.html a3e15ba717ea6589c46c5082564e700e7 (bool shared=true) bool get_network_shared classGlom_1_1Document.html a07e3a92de7638d028f8b66f69f588466 () const void set_connection_server classGlom_1_1Document.html a044d90398f59d87e55a6bb7b79bbdc1e (const Glib::ustring &strVal) void set_connection_database classGlom_1_1Document.html a0c9cd11c69ff2d32661a9c6d9473b660 (const Glib::ustring &strVal) void set_connection_port classGlom_1_1Document.html a05e4aec6becad68439b753d020b8c43d (unsigned int port_number) void set_connection_try_other_ports classGlom_1_1Document.html a288a93328e6058bb769e74f56ed18791 (bool val) void set_connection_user classGlom_1_1Document.html ad2d85b9e4840a99197ec327a3f39584b (const Glib::ustring &strVal) std::string get_connection_self_hosted_directory_uri classGlom_1_1Document.html a6bac0c857baecc5c84731af9d6fa6251 () const Glib::ustring get_connection_server classGlom_1_1Document.html a1883d24f1120b747ad064b8d7a73d21f () const Glib::ustring get_connection_database classGlom_1_1Document.html a85c082c4808d6fe39c42e4a14f2299a4 () const unsigned int get_connection_port classGlom_1_1Document.html a7bfc56a68650f5a899573c57a38aa425 () const bool get_connection_try_other_ports classGlom_1_1Document.html a7a11f7a921bf490a9de6506919fd213d () const Glib::ustring get_connection_user classGlom_1_1Document.html a036e47f17250ef6b8af83164cce5c1b1 () const void set_translation_original_locale classGlom_1_1Document.html abd8e2bc47132dbdf9c5fa98024729b07 (const Glib::ustring &locale) Glib::ustring get_translation_original_locale classGlom_1_1Document.html a8d805cbac982814fec599d010c5236dc () const std::vector< Glib::ustring > get_translation_available_locales classGlom_1_1Document.html a8924476f388f01ae3db7aed4559a1346 () const type_vec_relationships get_relationships classGlom_1_1Document.html ad57c89ae1226099b004879ba999c26f3 (const Glib::ustring &table_name, bool plus_system_prefs=false) const void set_relationships classGlom_1_1Document.html a3d8df9373a64f30bc6c9127a69f0a07b (const Glib::ustring &table_name, const type_vec_relationships &vecRelationships) sharedptr< Relationship > get_relationship classGlom_1_1Document.html a18d63c511eb610c6f52ad0091d76cd0a (const Glib::ustring &table_name, const Glib::ustring &relationship_name) const void set_relationship classGlom_1_1Document.html a16f7565b30384dadcd17d3525f628be6 (const Glib::ustring &table_name, const sharedptr< Relationship > &relationship) void remove_relationship classGlom_1_1Document.html a15a2ab17697301f2726d080d7baad1f5 (const sharedptr< const Relationship > &relationship) bool get_relationship_is_to_one classGlom_1_1Document.html a3c98c23ac46b78af711d49111fa5b44d (const Glib::ustring &table_name, const Glib::ustring &relationship_name) const sharedptr< const Relationship > get_field_used_in_relationship_to_one classGlom_1_1Document.html a59be2eee4286b47d7a0142aa8672974a (const Glib::ustring &table_name, const sharedptr< const LayoutItem_Field > &layout_field) const type_vec_fields get_table_fields classGlom_1_1Document.html a0cfc1350c6fc648215c156dd4793ad15 (const Glib::ustring &table_name) const void set_table_fields classGlom_1_1Document.html a657108407aaed9a6cca6232a1587f116 (const Glib::ustring &table_name, const type_vec_fields &vecFields) sharedptr< Field > get_field classGlom_1_1Document.html a202075e290a0ad7d94fbbb38a52f1c1c (const Glib::ustring &table_name, const Glib::ustring &strFieldName) const sharedptr< Field > get_field_primary_key classGlom_1_1Document.html ab3cfa3d036ca0e8116186d5d2a70a8b7 (const Glib::ustring &table_name) const void remove_field classGlom_1_1Document.html a07027365c86499ca1a5d820aabfe0457 (const Glib::ustring &table_name, const Glib::ustring &field_name) type_list_lookups get_lookup_fields classGlom_1_1Document.html a7c902b42b1e8cba89ae9951fbaa4e52e (const Glib::ustring &table_name, const Glib::ustring &field_name) const type_list_layout_groups get_data_layout_groups classGlom_1_1Document.html abda9d5440a4f8ffc4836633af2711b32 (const Glib::ustring &layout_name, const Glib::ustring &parent_table_name, const Glib::ustring &layout_platform=Glib::ustring()) const bool get_data_layout_groups_have_any_fields classGlom_1_1Document.html a7e381754fc804dd08b3096ee7522214b (const Glib::ustring &layout_name, const Glib::ustring &parent_table_name, const Glib::ustring &layout_platform=Glib::ustring()) const void set_data_layout_groups classGlom_1_1Document.html ab33878ff9cf67dfcfea57a095a0eced4 (const Glib::ustring &layout_name, const Glib::ustring &parent_table_name, const Glib::ustring &layout_platform, const type_list_layout_groups &groups) type_list_layout_groups get_data_layout_groups_plus_new_fields classGlom_1_1Document.html ade3010c94dce5edf4d03f4c5d3fb32b9 (const Glib::ustring &layout_name, const Glib::ustring &parent_table_name, const Glib::ustring &layout_platform=Glib::ustring()) const type_list_layout_groups get_data_layout_groups_default classGlom_1_1Document.html a9caf5b84d58e39a21e1c1d92a460a903 (const Glib::ustring &layout_name, const Glib::ustring &parent_table_name, const Glib::ustring &layout_platform=Glib::ustring()) const type_list_translatables get_translatable_items classGlom_1_1Document.html a609353e7b7e1ce54244db344bec2fa75 () void fill_layout_field_details classGlom_1_1Document.html a78d0b24d0b76a960c3229a0df2014d14 (const Glib::ustring &parent_table_name, const sharedptr< LayoutGroup > &layout_group) const void fill_layout_field_details classGlom_1_1Document.html ad600378dbbd8dd695a860b1442f1c4ac (const Glib::ustring &parent_table_name, type_list_layout_groups &groups) const void change_field_name classGlom_1_1Document.html af5a1f5b0c3da19b7efcda3c930ca47b2 (const Glib::ustring &table_name, const Glib::ustring &strFieldNameOld, const Glib::ustring &strFieldNameNew) void change_table_name classGlom_1_1Document.html a4cf00bbe1e0e933babbb7232fe18f3e2 (const Glib::ustring &table_name_old, const Glib::ustring &table_name_new) void change_relationship_name classGlom_1_1Document.html a70f3bcd7d6a6b6db063f0b3d99a59f9c (const Glib::ustring &table_name, const Glib::ustring &name, const Glib::ustring &name_new) type_listTableInfo get_tables classGlom_1_1Document.html a4089c972eef475174f1900b95bfebbe6 (bool plus_system_prefs=false) const std::vector< Glib::ustring > get_table_names classGlom_1_1Document.html a1616c5f5d3f883b7f5efd78e1c7515c5 (bool plus_system_prefs=false) const void set_tables classGlom_1_1Document.html a1793737ae7580ca7eda799182dce95bc (const type_listTableInfo &tables) sharedptr< TableInfo > get_table classGlom_1_1Document.html a9ddf9ceedb1fb8702ee6fd6099e3b2d0 (const Glib::ustring &table_name) const void add_table classGlom_1_1Document.html aa10ca51126b3584e6b08c252d1b0de94 (const sharedptr< TableInfo > &table_name) void remove_table classGlom_1_1Document.html af8a8df4382e37d65864efb6d211f50e2 (const Glib::ustring &table_name) bool get_table_is_known classGlom_1_1Document.html aef76714a9cbca223eaa407c2eaa0327f (const Glib::ustring &table_name) const bool get_table_is_hidden classGlom_1_1Document.html a2879c2d8d949bab631e07ff421bc481b (const Glib::ustring &table_name) const Glib::ustring get_table_title classGlom_1_1Document.html a840fce91857ab2d115b64840abe982ca (const Glib::ustring &table_name, const Glib::ustring &locale) const Glib::ustring get_table_title_original classGlom_1_1Document.html ab85ee89f7a2c23defd0324906f146485 (const Glib::ustring &table_name) const void set_table_title classGlom_1_1Document.html a1ea580201a7059746d6c2fdab7f3b72a (const Glib::ustring &table_name, const Glib::ustring &value, const Glib::ustring &locale) Glib::ustring get_table_title_singular classGlom_1_1Document.html a8b69af6ef75ffbbe1b205f9ba5cae6ca (const Glib::ustring &table_name, const Glib::ustring &locale) const Glib::ustring get_table_title_singular_original classGlom_1_1Document.html a277c7ed2bc7c804d97b599d820912c43 (const Glib::ustring &table_name) const void set_table_example_data classGlom_1_1Document.html afedc945ec10ff9dbab28eddee55fa8d0 (const Glib::ustring &table_name, const type_example_rows &rows) type_example_rows get_table_example_data classGlom_1_1Document.html a08778c86bf51fc7f31e778b0417bc572 (const Glib::ustring &table_name) const virtual Glib::ustring get_name classGlom_1_1Document.html abc53c753fc86bf0278610b0f20d31f9e () const Glib::ustring get_default_table classGlom_1_1Document.html a3578eab4e777bdbc552e6d72c4cbcd12 () const Glib::ustring get_first_table classGlom_1_1Document.html a194af911d3ce865c40b9a0e3cc4a6fba () const Glib::ustring get_database_title_original classGlom_1_1Document.html a5b1f5e744648f1adf09165b8bdd119b1 () const Glib::ustring get_database_title classGlom_1_1Document.html a86c7da78b3e944aa1654c10bf947c58b (const Glib::ustring &locale) const void set_database_title_original classGlom_1_1Document.html a0ba2096102b62228dddc0e99f350f264 (const Glib::ustring &title) std::vector< Glib::ustring > get_library_module_names classGlom_1_1Document.html a624cb5b533b2947a1ca33af0c9dee3cf () const void set_library_module classGlom_1_1Document.html ab92ce8dd4687ae3b45257ad007a60511 (const Glib::ustring &name, const Glib::ustring &script) Glib::ustring get_library_module classGlom_1_1Document.html af40255606bf9091cbac43fa54c2dd703 (const Glib::ustring &name) const void remove_library_module classGlom_1_1Document.html a0fdc644b88c714eaf8fb13d3d05f97fe (const Glib::ustring &name) Glib::ustring get_startup_script classGlom_1_1Document.html ae917d14c0bb3760a3b249e2f82688d24 () const void set_startup_script classGlom_1_1Document.html a7babdeae6c108d1a8fe5ce98b62b1541 (const Glib::ustring &script) type_list_groups get_groups classGlom_1_1Document.html a5df0256b130fd6d93b76d0a1863dc92a () const void set_group classGlom_1_1Document.html a3e77240d9e4eb38502951e604d5c4e5c (GroupInfo &group) void remove_group classGlom_1_1Document.html ae49bf6ebfe9961f3b1d4f7cf09ca6dc2 (const Glib::ustring &group_name) std::vector< Glib::ustring > get_report_names classGlom_1_1Document.html a53b51c1515ee94c4ba36645d0e3fe6c3 (const Glib::ustring &table_name) const void set_report classGlom_1_1Document.html a47faae146fbbc9dea0752f412f2a3595 (const Glib::ustring &table_name, const sharedptr< Report > &report) sharedptr< Report > get_report classGlom_1_1Document.html aec14f82fc1c02f5ee0d28e3b4b28ec87 (const Glib::ustring &table_name, const Glib::ustring &report_name) const void remove_report classGlom_1_1Document.html a8b231a7d8dbfe07ad8c5074fa2dde323 (const Glib::ustring &table_name, const Glib::ustring &report_name) std::vector< Glib::ustring > get_print_layout_names classGlom_1_1Document.html ab5a4067f445c0e03aee81838a88b1ff1 (const Glib::ustring &table_name) const void set_print_layout classGlom_1_1Document.html a2afd8bdf6a5634933c2c819c3e9373a1 (const Glib::ustring &table_name, const sharedptr< PrintLayout > &print_layout) sharedptr< PrintLayout > get_print_layout classGlom_1_1Document.html acfed669f397069f1b76138f4fc7accbe (const Glib::ustring &table_name, const Glib::ustring &print_layout_name) const void remove_print_layout classGlom_1_1Document.html a375934cf55b339d500daa64ca8435f05 (const Glib::ustring &table_name, const Glib::ustring &print_layout_name) void set_layout_record_viewed classGlom_1_1Document.html a11900053dde2eb3cd26e54e5c0f5e53f (const Glib::ustring &table_name, const Glib::ustring &layout_name, const Gnome::Gda::Value &primary_key_value) void forget_layout_record_viewed classGlom_1_1Document.html a7f4be165d31a3a2a79ac48b949164d74 (const Glib::ustring &table_name) Gnome::Gda::Value get_layout_record_viewed classGlom_1_1Document.html a9e5f6ebd2ea216bef094c024540ab179 (const Glib::ustring &table_name, const Glib::ustring &layout_name) const void set_layout_current classGlom_1_1Document.html a6d2ce3a3100db68f9b901198d308cf90 (const Glib::ustring &table_name, const Glib::ustring &layout_name) void set_criteria_current classGlom_1_1Document.html ac8fe4bdc200ddc160df1ce8c98b91af5 (const Glib::ustring &table_name, const FoundSet &found_set) Glib::ustring get_layout_current classGlom_1_1Document.html a4c0a2e8c578cd930b67d8995783df6dc (const Glib::ustring &table_name) const FoundSet get_criteria_current classGlom_1_1Document.html acd5d4b86efeb529937d481a04153a1c6 (const Glib::ustring &table_name) const bool get_table_overview_position classGlom_1_1Document.html a3a092c6f1683877c1ac7b488b44d156a (const Glib::ustring &table_name, float &x, float &y) const void set_table_overview_position classGlom_1_1Document.html a18f56166c46a675e0b3485f1983a6280 (const Glib::ustring &utable_name, float x, float y) AppState::userlevels get_userlevel classGlom_1_1Document.html ad3647830784ebc50678b3fef30c6fedf (userLevelReason &reason) const AppState::userlevels get_userlevel classGlom_1_1Document.html a3beaf21050dd7b8a5be28e5cac4f2690 () const bool set_userlevel classGlom_1_1Document.html aa6ec845cf0ea70ed218b248aeb554a4c (AppState::userlevels userlevel) type_signal_userlevel_changed signal_userlevel_changed classGlom_1_1Document.html a3c2bf693aaceaa8cfb91eb81b1b06846 () void emit_userlevel_changed classGlom_1_1Document.html a9bd93833eb1d8e098c6a6111a5bd2ce0 () Glib::ustring get_active_layout_platform classGlom_1_1Document.html ab72b14ad85f8a6764fead1cd8af2bd82 () const void set_active_layout_platform classGlom_1_1Document.html a0a0a5ce1b3e1456628a6db90b387a5db (const Glib::ustring &layout_platform=Glib::ustring()) Glib::ustring build_and_get_contents classGlom_1_1Document.html aad09e0b498f1071f526ba441183f8a0f () const Glib::ustring save_backup_file classGlom_1_1Document.html a077761b2542b90634df6c8ab059245da (const Glib::ustring &uri, const SlotProgress &slot_progress) Document_XML classGlomBakery_1_1Document__XML.html a92f6aff28272abe41b6aa14545660243 () virtual ~Document_XML classGlomBakery_1_1Document__XML.html acaf74f89ead221993f19e1d6d59eb977 () void set_dtd_name classGlomBakery_1_1Document__XML.html a7cb117b1444954eadc60dcce2e3fd5ef (const std::string &strVal) std::string get_dtd_name classGlomBakery_1_1Document__XML.html af1c479c9f64f2ad904ad4fe171b1e2cf () const void set_dtd_root_node_name classGlomBakery_1_1Document__XML.html a499c9b565a3054c7e1e57edd922bce2e (const Glib::ustring &strVal, const Glib::ustring &xmlns=Glib::ustring()) Glib::ustring get_dtd_root_node_name classGlomBakery_1_1Document__XML.html a6ed81009e4168b32867bf992aee16985 () const Glib::ustring get_xml classGlomBakery_1_1Document__XML.html a8b57b63ee4c42d33fee05397599d6462 () const Document classGlomBakery_1_1Document.html a7021d383cf7160ac5a393c257bbae2a9 () bool save classGlomBakery_1_1Document.html a5d8543c7cbf31acdd6778c8444037e2d () bool load classGlomBakery_1_1Document.html a6bdd515846e4e047a44daa54b38ce9aa (int &failure_code) bool load_from_data classGlomBakery_1_1Document.html ad639db1aebeb7a2db2d50c9f6ee0a159 (const guchar *data, std::size_t length, int &failure_code) bool get_modified classGlomBakery_1_1Document.html a7d0fa388f9dc3011c4e6e806ade550e4 () const bool get_is_new classGlomBakery_1_1Document.html af1a8d6f2c8eaf55ba0ee5e7968ba0c9a () const void set_is_new classGlomBakery_1_1Document.html a76c8b9c6ecc0e191e3f85cf7f39a8376 (bool bVal) Glib::ustring get_contents classGlomBakery_1_1Document.html a896bf57ee143517b22cf56308ff8bd4a () const Glib::ustring get_file_uri_with_extension classGlomBakery_1_1Document.html a50e355f3c5e974071cd8bf0223ff1802 (const Glib::ustring &uri) Glib::ustring get_file_uri classGlomBakery_1_1Document.html a5fff07fdeaae76a4ed2dad64579fda59 () const bool get_read_only classGlomBakery_1_1Document.html a69e0b06ad7a5c095b2549d5ea8689f11 () const void set_read_only classGlomBakery_1_1Document.html aca92138301a2be9318ec5f3ceb01d5d3 (bool bVal) void set_view classGlomBakery_1_1Document.html a5ab97a539e9daccd3dc30eb1af0239c4 (ViewBase *pView) ViewBase * get_view classGlomBakery_1_1Document.html a94507eea243c59a8729a1511cb643417 () void set_file_extension classGlomBakery_1_1Document.html ad487e0619d41cb27d757a94f211ba516 (const Glib::ustring &strVal) Glib::ustring get_file_extension classGlomBakery_1_1Document.html adea9e4e177278e9a65245cbcad0c94b2 () const type_signal_modified & signal_modified classGlomBakery_1_1Document.html a2cf84900ee8116c57c49be9c5e7eb077 () type_signal_forget & signal_forget classGlomBakery_1_1Document.html abc145161b68bdbb33295318905b6f16c () static guint get_latest_known_document_format_version classGlom_1_1Document.html a68275fcf2ed364f98040aabdf4b48a79 () static void fill_translatable_custom_choices classGlom_1_1Document.html a87fd419db8e9a42c11cdc1fd0d6602fb (Formatting &formatting, type_list_translatables &the_list, const Glib::ustring &hint) static Glib::ustring restore_backup_file classGlom_1_1Document.html a6f0fbca2b24feb7481affca8dfda8988 (const Glib::ustring &backup_uri, const SlotProgress &slot_progress) static sharedptr< TableInfo > create_table_system_preferences classGlom_1_1Document.html a7ad8db097fa9d525a0d01f1200a9d6b5 () static sharedptr< TableInfo > create_table_system_preferences classGlom_1_1Document.html ab39ed3e2fa2249f1f486ee544f66ae38 (type_vec_fields &fields) static sharedptr< Relationship > create_relationship_system_preferences classGlom_1_1Document.html a161b891548f4b59d81405c88fea5fe49 (const Glib::ustring &table_name) static bool get_relationship_is_system_properties classGlom_1_1Document.html a90bef6dd6f39ac421fe8626f488cb0a8 (const sharedptr< const Relationship > &relationship) GlomBakery::Document type_base classGlomBakery_1_1Document__XML.html aa3ae223391c3b157f24c09d91ee01bfe const xmlpp::Element * get_node_document classGlomBakery_1_1Document__XML.html a4ebd78f7c993de6973d691c17aebaa70 () const xmlpp::Element * get_node_document classGlomBakery_1_1Document__XML.html ac7d1d5976389e3f0ec4740f5e4a38314 () void Util_DOM_Write classGlomBakery_1_1Document__XML.html aedadf61425d76ea986d40c282768d0d8 (Glib::ustring &refstrXML) const void add_indenting_white_space_to_node classGlomBakery_1_1Document__XML.html af7de2985683f5539cea5d9fa0fe4d75d (xmlpp::Node *node=0, const Glib::ustring &start_indent=Glib::ustring()) xmlpp::DomParser m_DOM_Parser classGlomBakery_1_1Document__XML.html a600b6538863c6d22cc6027d0d2dbd20a xmlpp::Document * m_pDOM_Document classGlomBakery_1_1Document__XML.html aa690187c9bae2055901a3576b4e228ef std::string m_strDTD_Name classGlomBakery_1_1Document__XML.html a690c6dbe1564e23d58b382e78eb82333 Glib::ustring m_strRootNodeName classGlomBakery_1_1Document__XML.html a48baedb0ab2139019adee963cb0a04e6 Glib::ustring m_root_xmlns classGlomBakery_1_1Document__XML.html ae0796cbd8cf5584a028a418ae324eedb bool m_write_formatted classGlomBakery_1_1Document__XML.html a0de7e441b660c1aeb00a0de754925601 Glom::Conversions namespaceGlom_1_1Conversions.html Glib::ustring get_text_for_gda_value namespaceGlom_1_1Conversions.html a48b6fb46196063a4f2c04a051f9a0107 (Field::glom_field_type glom_type, const Gnome::Gda::Value &value, const NumericFormat &numeric_format=NumericFormat()) Glib::ustring get_text_for_gda_value namespaceGlom_1_1Conversions.html a01aae2cbc1607de2bb918880494a9f0b (Field::glom_field_type glom_type, const Gnome::Gda::Value &value, const std::locale &locale, const NumericFormat &numeric_format=NumericFormat(), bool iso_format=false) double get_double_for_gda_value_numeric namespaceGlom_1_1Conversions.html a033e0bf3a766f7d69b2f818205669e67 (const Gnome::Gda::Value &value) Glib::ustring format_time namespaceGlom_1_1Conversions.html a051b5314fe433eabf051f3c43a8f7dfc (const tm &tm_data) Glib::ustring format_time namespaceGlom_1_1Conversions.html a6714edf75c290bd4de66af771a4b3a56 (const tm &tm_data, const std::locale &locale, bool iso_format=false) Glib::ustring format_date namespaceGlom_1_1Conversions.html a764f1ac62953357796ada21349d8a563 (const tm &tm_data) Glib::ustring format_date namespaceGlom_1_1Conversions.html ad865bddc0f3454b011f979abd66ee7df (const tm &tm_data, const std::locale &locale, bool iso_format=false) Gnome::Gda::Value parse_value namespaceGlom_1_1Conversions.html aeb7a666d6bb259222cf845be878433b3 (double number) Gnome::Gda::Value parse_value namespaceGlom_1_1Conversions.html a242567311d55e2e445389b485354ab1c (Field::glom_field_type glom_type, const Glib::ustring &text, bool &success, bool iso_format=false) Gnome::Gda::Value parse_value namespaceGlom_1_1Conversions.html a07d9613945623145e881e2037ba4c31b (Field::glom_field_type glom_type, const Glib::ustring &text, const NumericFormat &numeric_format, bool &success, bool iso_format=false) tm parse_date namespaceGlom_1_1Conversions.html a2e6cff95cf134f278a10d82fc0088f42 (const Glib::ustring &text, bool &success) tm parse_date namespaceGlom_1_1Conversions.html a0c39a1f6bd76df296d7dd8a1782c3c00 (const Glib::ustring &text, const std::locale &locale, bool &success) tm parse_time namespaceGlom_1_1Conversions.html ab1d9cd8f22d5f3a033f6ecad14676f70 (const Glib::ustring &text, bool &success) tm parse_time namespaceGlom_1_1Conversions.html a00d777f4efd24b5c43a8fe8d917f965b (const Glib::ustring &text, const std::locale &locale, bool &success) bool sanity_check_date_parsing namespaceGlom_1_1Conversions.html a46a1c1a6c1e5fe998d64835e7788a4b4 () bool sanity_check_date_text_representation_uses_4_digit_years namespaceGlom_1_1Conversions.html a66dd29fe0a9bd12ea1b12b203c95ab4d (bool debug_output=false) Glib::ustring format_tm namespaceGlom_1_1Conversions.html afa89e12c3c63d94cb14fd2bc5a59c2b0 (const tm &tm_data, const std::locale &locale, const char *format) bool value_is_empty namespaceGlom_1_1Conversions.html a2b8ded4c899f974d4bb995d5aef600b7 (const Gnome::Gda::Value &value) Gnome::Gda::Value get_empty_value namespaceGlom_1_1Conversions.html ae75ba006d16abd95bb4fb82920bc5a54 (Field::glom_field_type field_type) Gnome::Gda::Value get_example_value namespaceGlom_1_1Conversions.html ababe2a34181fa01f8575f34a67184016 (Field::glom_field_type field_type) Gnome::Gda::Value convert_value namespaceGlom_1_1Conversions.html afdb2d3c3d6db46bdd372b69f3009c6e1 (const Gnome::Gda::Value &value, Field::glom_field_type target_glom_type) Glom::DbUtils namespaceGlom_1_1DbUtils.html std::vector< sharedptr< Field > > type_vec_fields namespaceGlom_1_1DbUtils.html abb42c8203423a937b841974ac822410c std::vector< Glib::ustring > type_vec_strings namespaceGlom_1_1DbUtils.html ae9bc6d6b4fb5d622d9aaca35a3d5669c bool create_database namespaceGlom_1_1DbUtils.html a74ca3ca573827b629d8505a9a64f56e3 (Document *document, const Glib::ustring &database_name, const Glib::ustring &title, const sigc::slot< void > &progress) bool recreate_database_from_document namespaceGlom_1_1DbUtils.html ad4ceee76d0b1ed6efcf33840a5ff44e6 (Document *document, const sigc::slot< void > &progress) SystemPrefs get_database_preferences namespaceGlom_1_1DbUtils.html a91478a871fc311c36bac24e48a3c1bea (Document *document) void set_database_preferences namespaceGlom_1_1DbUtils.html aecf3de9ed6b204dacd7116f2894013e7 (Document *document, const SystemPrefs &prefs) bool add_standard_tables namespaceGlom_1_1DbUtils.html a83d04c8f108de2758c3f92d2da39c47b (Document *document) bool add_standard_groups namespaceGlom_1_1DbUtils.html adbc2d8d8eb196a30e4ac0dd836497351 (Document *document) bool add_groups_from_document namespaceGlom_1_1DbUtils.html ae6f25b14f488d2a569f7e24ae10a0e0b (Document *document) bool set_table_privileges_groups_from_document namespaceGlom_1_1DbUtils.html a42c07c63ee9f84a6f09a4b5dff5d513d (Document *document) type_vec_fields get_fields_for_table_from_database namespaceGlom_1_1DbUtils.html af4de0e165e8f68f08c2c856305e51e48 (const Glib::ustring &table_name, bool including_system_fields=false) bool get_field_exists_in_database namespaceGlom_1_1DbUtils.html a4304740177c37fe5064fe935d75bc100 (const Glib::ustring &table_name, const Glib::ustring &field_name) type_vec_fields get_fields_for_table namespaceGlom_1_1DbUtils.html a50db4968251157bb2f847e2a75e1a031 (const Document *document, const Glib::ustring &table_name, bool including_system_fields=false) sharedptr< Field > get_fields_for_table_one_field namespaceGlom_1_1DbUtils.html aca0de5631436f35a4da9c69f5fbf0e2c (const Document *document, const Glib::ustring &table_name, const Glib::ustring &field_name) type_vec_strings get_table_names_from_database namespaceGlom_1_1DbUtils.html a6bac069d6654e675bc739648dbdc8bbf (bool ignore_system_tables=false) bool get_table_exists_in_database namespaceGlom_1_1DbUtils.html a7b1489bc8fdb5c434ad4ee6cba96d8c9 (const Glib::ustring &table_name) bool create_table namespaceGlom_1_1DbUtils.html a62551bf0590fd1de03447367afde2f0a (const sharedptr< const TableInfo > &table_info, const Document::type_vec_fields &fields) bool create_table_with_default_fields namespaceGlom_1_1DbUtils.html a85188d99df945b3aea151693148ad658 (Document *document, const Glib::ustring &table_name) bool create_table_add_missing_fields namespaceGlom_1_1DbUtils.html a13bb08a30e11285983135abd6d06e7b4 (const sharedptr< const TableInfo > &table_info, const Document::type_vec_fields &fields) bool add_column namespaceGlom_1_1DbUtils.html a7cd3f238eb92dfe05a4a1e90951e9bcc (const Glib::ustring &table_name, const sharedptr< const Field > &field, Gtk::Window *parent_window) bool drop_column namespaceGlom_1_1DbUtils.html a91dce7a060ca1c249d77e26f34e5ec94 (const Glib::ustring &table_name, const Glib::ustring &field_name) bool insert_example_data namespaceGlom_1_1DbUtils.html a7dbd8b794276e7bade759eb1e3e6faf3 (Document *document, const Glib::ustring &table_name) Glib::RefPtr< Gnome::Gda::DataModel > query_execute_select namespaceGlom_1_1DbUtils.html aa7e3c7e44ee803b29de888b4839dd90d (const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &builder, bool use_cursor=false) bool query_execute_string namespaceGlom_1_1DbUtils.html ab5f26298a395abc3b9b2b503ebd49178 (const Glib::ustring &strQuery, const Glib::RefPtr< Gnome::Gda::Set > &params=Glib::RefPtr< Gnome::Gda::Set >(0)) bool query_execute namespaceGlom_1_1DbUtils.html a7df091154f81400dfaf04c8b2005d3eb (const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &builder) Gnome::Gda::Value auto_increment_insert_first_if_necessary namespaceGlom_1_1DbUtils.html abd90a12ee756f6eee5bc7b5911aef431 (const Glib::ustring &table_name, const Glib::ustring &field_name) Gnome::Gda::Value get_next_auto_increment_value namespaceGlom_1_1DbUtils.html ac8dec35caeb1bfd4300a881ef466962b (const Glib::ustring &table_name, const Glib::ustring &field_name) void remove_auto_increment namespaceGlom_1_1DbUtils.html a1387981b8ab07885b9d805a1a2f8250d (const Glib::ustring &table_name, const Glib::ustring &field_name) void layout_item_fill_field_details namespaceGlom_1_1DbUtils.html a761c02e5c6e710bf1898f3f0c8aba8b2 (Document *document, const Glib::ustring &parent_table_name, sharedptr< LayoutItem_Field > &layout_item) bool layout_field_should_have_navigation namespaceGlom_1_1DbUtils.html a785cc54d9b161914c3dd4a60f512f357 (const Glib::ustring &table_name, const sharedptr< const LayoutItem_Field > &layout_item, const Document *document, sharedptr< Relationship > &field_used_in_relationship_to_one) Glib::ustring get_unused_database_name namespaceGlom_1_1DbUtils.html abea6d0f83f17ddf2882319e096cce3c1 (const Glib::ustring &base_name) int count_rows_returned_by namespaceGlom_1_1DbUtils.html a08e633cef13054b3a83148abf2f23797 (const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &sql_query) bool rename_table namespaceGlom_1_1DbUtils.html a07716c1ec4274884c4687826913bb32a (const Glib::ustring &table_name, const Glib::ustring &new_table_name) bool drop_table namespaceGlom_1_1DbUtils.html ab96735eb94f8d49062d139c1aa9b00f3 (const Glib::ustring &table_name) Glib::ustring escape_sql_id namespaceGlom_1_1DbUtils.html a237fa2e0bd26217598eacd2e2f8a183a (const Glib::ustring &id) Glib::ustring gda_cnc_string_encode namespaceGlom_1_1DbUtils.html a4c5560a328cf03974dec19bf4b415163 (const Glib::ustring &str) Glib::ustring build_query_create_group namespaceGlom_1_1DbUtils.html ae78521d24e54707443446508a0009f72 (const Glib::ustring &group, bool superuser=false) Glib::ustring build_query_add_user_to_group namespaceGlom_1_1DbUtils.html a1a87d07a3a466ff05e7205bda13e775e (const Glib::ustring &group, const Glib::ustring &user) bool add_user namespaceGlom_1_1DbUtils.html a18328de1424f3d87ab258bb26ac6b6ce (const Document *document, const Glib::ustring &user, const Glib::ustring &password, const Glib::ustring &group) bool remove_user namespaceGlom_1_1DbUtils.html ac7959c3063f66f360966d7916dea5e6e (const Glib::ustring &user) bool add_group namespaceGlom_1_1DbUtils.html abcd94a81cde4a613f8269d2fbe689175 (const Document *document, const Glib::ustring &group, bool superuser=false) bool remove_user_from_group namespaceGlom_1_1DbUtils.html aba8a26fa0a85f939dcc386988a9e576f (const Glib::ustring &user, const Glib::ustring &group) Gnome::Gda::Value get_lookup_value namespaceGlom_1_1DbUtils.html a93de6fc9ce528740978ac1cdc0a0012f (Document *document, const Glib::ustring &table_name, const sharedptr< const Relationship > &relationship, const sharedptr< const Field > &source_field, const Gnome::Gda::Value &key_value) void set_fake_connection namespaceGlom_1_1DbUtils.html a446436e43532a0125bea79a9b9a69876 () Glom::Utils namespaceGlom_1_1Utils.html std::vector< sharedptr< LayoutItem_Field > > type_vecLayoutFields namespaceGlom_1_1Utils.html a8f8fbf1c248f46a7142f510b9e76dbae std::vector< sharedptr< const LayoutItem_Field > > type_vecConstLayoutFields namespaceGlom_1_1Utils.html a62d84be27491c2ba60f84bb54ed7795e std::vector< Gnome::Gda::Value > type_list_values namespaceGlom_1_1Utils.html aa8961936e633342d3bff4cb74d3fe7d5 std::vector< std::pair< Gnome::Gda::Value, type_list_values > > type_list_values_with_second namespaceGlom_1_1Utils.html a7e54bc05142a2a940d87aa42c621dead std::vector< Glib::ustring > type_vec_strings namespaceGlom_1_1Utils.html a52b82841a1690a3a6fe86838470ec1ed Glib::ustring trim_whitespace namespaceGlom_1_1Utils.html acc1ef56d72b6a4a34ad1411490c0bba4 (const Glib::ustring &text) Glib::ustring string_replace namespaceGlom_1_1Utils.html a042b6b2d25000ba1d2a6ea3342d7f652 (const Glib::ustring &src, const Glib::ustring &search_for, const Glib::ustring &replace_with) Glib::ustring string_clean_for_xml namespaceGlom_1_1Utils.html a199966b2ee8cad4b651d53225cfa063b (const Glib::ustring &src) Gnome::Gda::SqlExpr build_simple_where_expression namespaceGlom_1_1Utils.html a5aa4fb1c8b23f01e444056e29368126e (const Glib::ustring &table_name, const sharedptr< const Field > &key_field, const Gnome::Gda::Value &key_value) Gnome::Gda::SqlExpr build_combined_where_expression namespaceGlom_1_1Utils.html ace11f9a501566ea3f92748218f214040 (const Gnome::Gda::SqlExpr &a, const Gnome::Gda::SqlExpr &b, Gnome::Gda::SqlOperatorType op) void build_sql_select_add_fields_to_get namespaceGlom_1_1Utils.html a6577405c94a0065afe93ec224dd97746 (const Glib::RefPtr< Gnome::Gda::SqlBuilder > &builder, const Glib::ustring &table_name, const type_vecConstLayoutFields &fieldsToGet, const type_sort_clause &sort_clause, bool extra_join) Glib::RefPtr< Gnome::Gda::SqlBuilder > build_sql_select_with_where_clause namespaceGlom_1_1Utils.html a2f26e87b17eab858036651566ea74f65 (const Glib::ustring &table_name, const type_vecLayoutFields &fieldsToGet, const Gnome::Gda::SqlExpr &where_clause=Gnome::Gda::SqlExpr(), const sharedptr< const Relationship > &extra_join=sharedptr< const Relationship >(), const type_sort_clause &sort_clause=type_sort_clause(), guint limit=0) Glib::RefPtr< Gnome::Gda::SqlBuilder > build_sql_select_with_where_clause namespaceGlom_1_1Utils.html a3f15847d59ef474b79392fd485b05c1b (const Glib::ustring &table_name, const type_vecConstLayoutFields &fieldsToGet, const Gnome::Gda::SqlExpr &where_clause=Gnome::Gda::SqlExpr(), const sharedptr< const Relationship > &extra_join=sharedptr< const Relationship >(), const type_sort_clause &sort_clause=type_sort_clause(), guint limit=0) Glib::RefPtr< Gnome::Gda::SqlBuilder > build_sql_select_with_key namespaceGlom_1_1Utils.html a6667229a934e57cad16c3702f0e1f040 (const Glib::ustring &table_name, const type_vecLayoutFields &fieldsToGet, const sharedptr< const Field > &key_field, const Gnome::Gda::Value &key_value, const type_sort_clause &sort_clause=type_sort_clause(), guint limit=0) Glib::RefPtr< Gnome::Gda::SqlBuilder > build_sql_select_with_key namespaceGlom_1_1Utils.html a0d57bf38138da7c86ebd348a79fc35de (const Glib::ustring &table_name, const type_vecConstLayoutFields &fieldsToGet, const sharedptr< const Field > &key_field, const Gnome::Gda::Value &key_value, const type_sort_clause &sort_clause=type_sort_clause(), guint limit=0) Glib::RefPtr< Gnome::Gda::SqlBuilder > build_sql_select_count_rows namespaceGlom_1_1Utils.html a03666744f8a4a1fd76cd18467d39cf03 (const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &sql_query) Gnome::Gda::SqlExpr get_find_where_clause_quick namespaceGlom_1_1Utils.html a2754ca449d65f9bf8d58f9433144f9b8 (const Document *document, const Glib::ustring &table_name, const Gnome::Gda::Value &quick_search) Glib::RefPtr< Gnome::Gda::SqlBuilder > build_sql_update_with_where_clause namespaceGlom_1_1Utils.html a107141db428e1202df9cf9a8ab4fd7c0 (const Glib::ustring &table_name, const sharedptr< const Field > &field, const Gnome::Gda::Value &value, const Gnome::Gda::SqlExpr &where_clause) type_list_values_with_second get_choice_values_all namespaceGlom_1_1Utils.html a2ed07f25d7a4d24f4082b5fe667fa563 (const Document *document, const sharedptr< const LayoutItem_Field > &field) type_list_values_with_second get_choice_values namespaceGlom_1_1Utils.html a62cad8c90e5532328cf0fbbac25e0159 (const Document *document, const sharedptr< const LayoutItem_Field > &field, const Gnome::Gda::Value &foreign_key_value) std::string sqlbuilder_get_full_query namespaceGlom_1_1Utils.html a8c88e4670ad36350d71a256621b8dd60 (const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &builder) Glib::ustring create_name_from_title namespaceGlom_1_1Utils.html ace6b7b73bbbfc9a213e1d7661d83af49 (const Glib::ustring &title) Glib::ustring string_escape_underscores namespaceGlom_1_1Utils.html adc81f0ad92fcc2ca0c120067d7dfa586 (const Glib::ustring &text) Glib::ustring locale_simplify namespaceGlom_1_1Utils.html a1eea3c7eef1c01a97e960a3ec6a6a733 (const Glib::ustring &locale_id) Glib::ustring locale_language_id namespaceGlom_1_1Utils.html aa44a168cd7efec82207c21fe65672e71 (const Glib::ustring &locale_id) Glib::ustring create_local_image_uri namespaceGlom_1_1Utils.html a61dcbaa20abb7153e2f873dccfdfff85 (const Gnome::Gda::Value &value) Glib::ustring string_from_decimal namespaceGlom_1_1Utils.html ada8087969d3728b1cd1d9c2513d3fc28 (guint decimal) Glib::ustring title_from_string namespaceGlom_1_1Utils.html aaa273e5833bc375648851bc23f9bed9f (const Glib::ustring &text) type_vec_strings string_separate namespaceGlom_1_1Utils.html ab2c1a87110d1bae3e630815038d21f89 (const Glib::ustring &str, const Glib::ustring &separator, bool ignore_quoted_separator=false) Glib::ustring string_trim namespaceGlom_1_1Utils.html a837d3376b91338c742cdcb7eb3c4125c (const Glib::ustring &str, const Glib::ustring &to_remove) Glib::ustring string_remove_suffix namespaceGlom_1_1Utils.html a255530113a42f6c853b09605d42b7efb (const Glib::ustring &str, const Glib::ustring &suffix, bool case_sensitive=true) bool file_exists namespaceGlom_1_1Utils.html a3eed787dc0ed308e80d95a8f4819d582 (const Glib::ustring &uri) bool file_exists namespaceGlom_1_1Utils.html a1d73c0303388a5e5417a7dccefae3bc7 (const Glib::RefPtr< Gio::File > &file) bool delete_directory namespaceGlom_1_1Utils.html a49d9014b117c54fb6f63d1488201a3cf (const Glib::RefPtr< Gio::File > &directory) bool delete_directory namespaceGlom_1_1Utils.html ab2154776db257cd90059224089a5f768 (const std::string &uri) Glib::ustring get_directory_child_with_suffix namespaceGlom_1_1Utils.html a14b3b3833c80138102f68a68ce1a2f9d (const Glib::ustring &uri_directory, const std::string &suffix, bool recursive) Glib::ustring get_file_uri_without_extension namespaceGlom_1_1Utils.html a92abe1e4cc75719e6ea4f2d209238b52 (const Glib::ustring &uri) std::string get_file_path_without_extension namespaceGlom_1_1Utils.html a5b4990a3afa5f47fef68f01c0c02f7f4 (const std::string &filepath) Glib::ustring get_list_of_layout_items_for_display namespaceGlom_1_1Utils.html afd0af4acc4a7b14c275160ebedc394a7 (const LayoutGroup::type_list_items &list_layout_fields) Glib::ustring get_list_of_layout_items_for_display namespaceGlom_1_1Utils.html a7f180d430c5def14c2b96817f76dd896 (const sharedptr< const LayoutGroup > &layout_group) Glib::ustring get_list_of_sort_fields_for_display namespaceGlom_1_1Utils.html a3ade4430798df12f652b1111c51f83ec (const Formatting::type_list_sort_fields &sort_fields) LayoutGroup::type_list_const_items get_layout_items_plus_primary_key namespaceGlom_1_1Utils.html af3cce0b84f929c1f0d213807df5c7a29 (const LayoutGroup::type_list_const_items &items, const Document *document, const Glib::ustring &table_name) LayoutGroup::type_list_items get_layout_items_plus_primary_key namespaceGlom_1_1Utils.html aa5c91d1f0c47549f50d3a25c39ede856 (const LayoutGroup::type_list_items &items, const Document *document, const Glib::ustring &table_name) std::string get_temp_file_path namespaceGlom_1_1Utils.html a9e7ed258a7019df5d9c566ae785b0742 (const std::string &prefix=std::string(), const std::string &extension=std::string()) Glib::ustring get_temp_file_uri namespaceGlom_1_1Utils.html a65dfa09f34681b14818c05afb9c9a9a2 (const std::string &prefix=std::string(), const std::string &extension=std::string()) std::string get_temp_directory_path namespaceGlom_1_1Utils.html ac91a06f4c8e995e928e7dd51188988cc (const std::string &prefix=std::string()) Glib::ustring get_temp_directory_uri namespaceGlom_1_1Utils.html ac0954f6db1f6d9ebc03d9acad7dc625f (const std::string &prefix=std::string()) bool script_check_for_pygtk2 namespaceGlom_1_1Utils.html a5dc133b531a84ee5826ddab6d46b761e (const Glib::ustring &script) GlomBakery namespaceGlomBakery.html GlomBakery::Document GlomBakery::Document_XML GlomBakery::View GlomBakery::View_Composite GlomBakery::ViewBase GlomBakery::Document classGlomBakery_1_1Document.html LoadFailureCodes classGlomBakery_1_1Document.html aee1b6b5a8d4686c9bfc169d9a75bdc53 LOAD_FAILURE_CODE_NONE classGlomBakery_1_1Document.html aee1b6b5a8d4686c9bfc169d9a75bdc53a1cab8645581656f92574a3c98519b653 LOAD_FAILURE_CODE_NOT_FOUND classGlomBakery_1_1Document.html aee1b6b5a8d4686c9bfc169d9a75bdc53abb44f06404dbf86bbccdcb50a679a3be LOAD_FAILURE_CODE_LAST classGlomBakery_1_1Document.html aee1b6b5a8d4686c9bfc169d9a75bdc53ad4109c4886aa5ac52a48e740acb54e5b sigc::signal< void, bool > type_signal_modified classGlomBakery_1_1Document.html a3338f8ada621546f631e871e9bcae2f4 sigc::signal< void > type_signal_forget classGlomBakery_1_1Document.html a8247a2739645ca2398e35f6037f3dcfd virtual ~Document classGlomBakery_1_1Document.html a39431a55d3de96daeb19f54761dc5611 () virtual void set_modified classGlomBakery_1_1Document.html afa5d675e0c12fa51e416047f0daa93d8 (bool bVal=true) virtual void set_file_uri classGlomBakery_1_1Document.html a6e78066f06cc7a9e8eb7c51583d2a4b8 (const Glib::ustring &file_uri, bool bEnforceFileExtension=false) virtual Glib::ustring get_name classGlomBakery_1_1Document.html ae2e5f2165ed384a31d4ea0b2bf3a1e47 () const static Glib::ustring util_file_uri_get_name classGlomBakery_1_1Document.html afd048ced2b460fd52ca616297af87086 (const Glib::ustring &file_uri, const Glib::ustring &file_extension) virtual bool load_after classGlomBakery_1_1Document.html a4c8ac0b46b4695eb5f04727b0e3be371 (int &failure_code) virtual bool save_before classGlomBakery_1_1Document.html abd0e672bb5e8ddd7fc5cb81b76b2d314 () bool read_from_disk classGlomBakery_1_1Document.html a47de195a88290d2ca8547899ab53432d (int &failure_code) bool write_to_disk classGlomBakery_1_1Document.html a613b6457c155ed3678eb5de98c4b3360 () Glib::ustring m_strContents classGlomBakery_1_1Document.html a09071125e90b766828eaa1be07455412 Glib::ustring m_file_uri classGlomBakery_1_1Document.html a992fbbb6c4bedf0564333234bd5009b4 Glib::ustring m_file_extension classGlomBakery_1_1Document.html a03baa3e84f21e9ac4820d78dc28fe076 ViewBase * m_pView classGlomBakery_1_1Document.html adff3979feb69cc4b4d7631322b3b098a type_signal_modified signal_modified_ classGlomBakery_1_1Document.html a8c2cb147672f6b9612b8d4d1f5dedeaf type_signal_forget signal_forget_ classGlomBakery_1_1Document.html a98b58ec93a7909f7f70bf0037c2f7360 bool m_bModified classGlomBakery_1_1Document.html a490873f3f13b3c0b95c45fb6b8a653dd bool m_bIsNew classGlomBakery_1_1Document.html ab184cb795e5528f3b919b3b138b6f39d bool m_bReadOnly classGlomBakery_1_1Document.html a9e413c2d465c6f8b235ec4cf374c17b6 GlomBakery::Document_XML classGlomBakery_1_1Document__XML.html GlomBakery::Document virtual bool load_after classGlomBakery_1_1Document__XML.html afb041d83177715c7f6f4f079a0b9faf5 (int &failure_code) virtual bool save_before classGlomBakery_1_1Document__XML.html aba129457041243e5229e96a11e922bd1 () GlomBakery::View classGlomBakery_1_1View.html GlomBakery::ViewBase View< T_Document > type_self classGlomBakery_1_1View.html ab1b595773be83ad108df574b5d9297df View classGlomBakery_1_1View.html afed624fec48619fb1b374609c9160a15 () virtual ~View classGlomBakery_1_1View.html a7feea682734afc980f69fe0507badd7c () virtual T_Document * get_document classGlomBakery_1_1View.html a2507e30b994c4a49c47119639e195811 () virtual const T_Document * get_document classGlomBakery_1_1View.html aad8d8742b3ca8cb5e0dd000e23bcc84b () const virtual void set_document classGlomBakery_1_1View.html a8f5a68a501f9af2e7fc6cc18c8c2a6d0 (T_Document *pDocument) virtual void set_modified classGlomBakery_1_1View.html ae885ea7e7fdd5fd477f8a0ed974660f0 (bool val=true) ViewBase classGlomBakery_1_1ViewBase.html a7948afa22bc7a7769bb049f23dddc3bc () virtual ~ViewBase classGlomBakery_1_1ViewBase.html ad36ce7da0fbb26962a0559c219efb9b4 () virtual void load_from_document classGlomBakery_1_1ViewBase.html a202370fe4a22aba9df41687d2290ff48 () virtual void save_to_document classGlomBakery_1_1ViewBase.html ae0232282d6f5ff7e781ced408d5b1614 () virtual void clipboard_copy classGlomBakery_1_1ViewBase.html a353afaaa7ec3f179a4cc6623b80c5a34 () virtual void clipboard_paste classGlomBakery_1_1ViewBase.html a68fa9510b56b2133b39cffc367d11ad4 () virtual void clipboard_clear classGlomBakery_1_1ViewBase.html a68132a802bd9edf7e0337e008dd1cbaf () void on_document_forget classGlomBakery_1_1View.html afc7d8dfe849f5358acf1be53fd130c3b () T_Document * m_pDocument classGlomBakery_1_1View.html a8f82380a65a1f1fb1625913b4a9e2b5e GlomBakery::View_Composite classGlomBakery_1_1View__Composite.html GlomBakery::View View< T_Document > type_view classGlomBakery_1_1View__Composite.html a3c886ba14fb8e9e4471f5328cae5421e View_Composite classGlomBakery_1_1View__Composite.html aa4341ec5946d3b8c5b00ddae0fe83b47 () virtual ~View_Composite classGlomBakery_1_1View__Composite.html af86e0f7d8844e70c100d10401fadbc34 () virtual void add_view classGlomBakery_1_1View__Composite.html a266321969053523ba8e1613ede9896a1 (type_view *pView) virtual void remove_view classGlomBakery_1_1View__Composite.html aee997e9bf84fc72e37c01797f9ec0244 (type_view *pView) virtual void set_document classGlomBakery_1_1View__Composite.html a43be3e59014edafd8f91f632bad8f806 (T_Document *pDocument) virtual void load_from_document classGlomBakery_1_1View__Composite.html ab66293fd7ac7926b158c1d8b9c2b9034 () virtual void save_to_document classGlomBakery_1_1View__Composite.html a0afd143dd3d2384226745fcc2e6e42ab () std::vector< type_view * > type_vec_views classGlomBakery_1_1View__Composite.html a6e5a4a09f5716106fbb62c0c412560b4 type_vec_views m_vecViews classGlomBakery_1_1View__Composite.html ac81060a8eb58e1776d1ecefe96227a2d GlomBakery::ViewBase classGlomBakery_1_1ViewBase.html sigc::trackable Gtk namespaceGtk.html libglom/document/bakery /home/murrayc/checkout/gnome/glom/glom/libglom/document/bakery/ dir_96c245ed9dfbd1862602a5e39af1c96f.html libglom/document/bakery/view document.h document_xml.h libglom/data_structure /home/murrayc/checkout/gnome/glom/glom/libglom/data_structure/ dir_f071f38b98068934095ce7ce9f5ceda3.html libglom/data_structure/layout choicevalue.h database_title.h field.h fieldtypes.h foundset.h glomconversions.h groupinfo.h has_title_singular.h numeric_format.h print_layout.h privileges.h relationship.h report.h system_prefs.h tableinfo.h translatable_item.h libglom/document /home/murrayc/checkout/gnome/glom/glom/libglom/document/ dir_4257d9b4f9ac811b1e2ea282aa1cf0e7.html libglom/document/bakery document.h view.h libglom/data_structure/layout /home/murrayc/checkout/gnome/glom/glom/libglom/data_structure/layout/ dir_b3890f6bb47b53a6abf21354c7f7f634.html libglom/data_structure/layout/report_parts custom_title.h formatting.h layoutgroup.h layoutitem.h layoutitem_button.h layoutitem_calendarportal.h layoutitem_field.h layoutitem_image.h layoutitem_line.h layoutitem_notebook.h layoutitem_placeholder.h layoutitem_portal.h layoutitem_text.h layoutitem_withformatting.h usesrelationship.h libglom /home/murrayc/checkout/gnome/glom/glom/libglom/ dir_19bfda69641299eed8e11251504b6c3c.html libglom/data_structure libglom/document appstate.h db_utils.h init.h libglom_config.h report_builder.h sharedptr.h standard_table_prefs_fields.h translations_po.h utils.h libglom/data_structure/layout/report_parts /home/murrayc/checkout/gnome/glom/glom/libglom/data_structure/layout/report_parts/ dir_434e757db745f7bb2046098563428a3c.html layoutitem_fieldsummary.h layoutitem_footer.h layoutitem_groupby.h layoutitem_header.h layoutitem_summary.h layoutitem_verticalgroup.h libglom/document/bakery/view /home/murrayc/checkout/gnome/glom/glom/libglom/document/bakery/view/ dir_afe145b47a4ac6593d2f41db8bc076f3.html view.h view_composite.h viewbase.h index libglom Reference Manual index description warning basics glom-1.22.4/docs/libglom_reference/Doxyfile.in0000644000175000017500000002532312234252645022504 0ustar00murraycmurrayc00000000000000# Doxyfile 1.6.1 # @configure_input@ #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = libglom-@GLOM_ABI_VERSION@ PROJECT_NUMBER = @PACKAGE_VERSION@ OUTPUT_DIRECTORY = . CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = "@abs_top_builddir@/glom/" \ "@abs_top_srcdir@/glom/" \ "@abs_top_builddir@/" \ "@abs_top_srcdir@/" STRIP_FROM_INC_PATH = "@abs_top_builddir@/glom/" \ "@abs_top_srcdir@/glom/" \ "@abs_top_builddir@/" \ "@abs_top_srcdir@/" SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = "newin{2}=\xrefitem since_\1_\2 \"Since @PACKAGE_NAME@ \1.\2\" \"New API in @PACKAGE_NAME@ \1.\2\"" OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO EXTENSION_MAPPING = BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES TYPEDEF_HIDES_STRUCT = NO SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = NO EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = YES HIDE_FRIEND_COMPOUNDS = YES HIDE_IN_BODY_DOCS = YES INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = YES SORT_GROUP_NAMES = YES SORT_BY_SCOPE_NAME = YES GENERATE_TODOLIST = NO GENERATE_TESTLIST = NO GENERATE_BUGLIST = NO GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 2 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO SHOW_FILES = NO SHOW_NAMESPACES = YES FILE_VERSION_FILTER = LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = reference/doxygen.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # We provide the input path when calling doxygen instead. INPUT = INPUT_ENCODING = UTF-8 FILE_PATTERNS = RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = _* \ adaptor_trait \ basic_filebuf \ basic_streambuf \ binary_function \ char_traits \ internal \ pair \ unary_function EXAMPLE_PATH = EXAMPLE_PATTERNS = *.cc \ *.h EXAMPLE_RECURSIVE = YES IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = "@MMDOCTOOLDIR@/doxygen.css" HTML_ALIGN_MEMBERS = YES HTML_DYNAMIC_SECTIONS = NO GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO CHM_INDEX_ENCODING = BINARY_TOC = NO TOC_EXPAND = NO GENERATE_QHP = NO QCH_FILE = QHP_NAMESPACE = QHP_VIRTUAL_FOLDER = doc QHP_CUST_FILTER_NAME = QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = QHG_LOCATION = DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 1 GENERATE_TREEVIEW = NONE USE_INLINE_TREES = NO TREEVIEW_WIDTH = 250 FORMULA_FONTSIZE = 10 SEARCHENGINE = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = NO #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES SEARCH_INCLUDES = YES INCLUDE_PATH = "@abs_top_builddir@/glom" \ "@abs_top_srcdir@/glom" INCLUDE_FILE_PATTERNS = *.h PREDEFINED = __cplusplus \ DOXYGEN_SHOULD_SKIP_THIS \ "G_GNUC_CONST=" \ "G_GNUC_NORETURN=" \ "G_GNUC_NULL_TERMINATED=" \ "G_GNUC_PURE=" \ GLIBMM_DEFAULT_SIGNAL_HANDLERS_ENABLED \ GLIBMM_EXCEPTIONS_ENABLED \ GLIBMM_HAVE_WIDE_STREAM \ GLIBMM_PROPERTIES_ENABLED \ GLIBMM_VFUNCS_ENABLED \ "ATKMM_API=" \ "GDKMM_API=" \ "GTKMM_API=" \ GTKMM_ATKMM_ENABLED \ "GTKMM_USING_STD(x)=" EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = @DOXYGEN_TAGFILES@ GENERATE_TAGFILE = "libglom-@GLOM_ABI_VERSION@.tag" ALLEXTERNALS = NO EXTERNAL_GROUPS = NO PERL_PATH = @PERL@ #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO MSCGEN_PATH = HIDE_UNDOC_RELATIONS = NO HAVE_DOT = YES DOT_FONTNAME = FreeSans DOT_FONTSIZE = 10 DOT_FONTPATH = CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = YES INCLUDE_GRAPH = NO INCLUDED_BY_GRAPH = NO CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = NO DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = YES GENERATE_LEGEND = YES DOT_CLEANUP = YES glom-1.22.4/docs/libglom_reference/doc-postprocess.pl0000644000175000017500000000535712234777071024067 0ustar00murraycmurrayc00000000000000package main; # Copyright (c) 2009 Openismus GmbH # # This file is part of mm-common. # # mm-common is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published # by the Free Software Foundation, either version 2 of the License, # or (at your option) any later version. # # mm-common is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with mm-common. If not, see . use strict; use warnings; use bytes; use File::Glob qw(:glob); use File::Spec; use Getopt::Long qw(:config no_getopt_compat no_ignore_case require_order bundling); sub path_basename ($) { my ($path) = @_; my $basename = File::Spec->splitpath($path); return $basename; } sub exit_help () { my $script_name = path_basename($0) || 'doc-postprocess.pl'; print <<"EOF"; Usage: perl $script_name [OPTION]... [PATTERN]... Post-process the Doxygen-generated HTML files matching PATTERN. Options: -?, --help display this help and exit EOF exit; } sub error (@) { my $script_name = path_basename($0); $script_name =~ s/\.[^.]*$//s if (defined $script_name); print STDERR ($script_name || 'doc-postprocess', ': ', @_, "\n"); exit 1; } GetOptions('help|?' => \&exit_help) or exit 2; foreach my $filename (map(bsd_glob($_, GLOB_NOSORT), @ARGV)) { my @buf; my $file; open($file, '<', $filename) and (@buf = <$file>) and close($file) or error('Failed to read ', path_basename($filename), ': ', $!); foreach (@buf) { if (/|)template</$1template </; } s/©/©/g; s/—/—/g; s/–/–/g; s/ *  */ /g; } # write the whole buffer back open($file, '>', $filename) and print $file (@buf) and close($file) or error('Failed to write ', path_basename($filename), ': ', $!); } exit; glom-1.22.4/docs/libglom_reference/libglom-1.22.devhelp20000644000175000017500000044437412234777147024055 0ustar00murraycmurrayc00000000000000 glom-1.22.4/docs/libglom_reference/html/0000755000175000017500000000000012235000130021305 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/libglom_reference/html/functions_0x73.html0000644000175000017500000006117512234777147025032 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - s -

        glom-1.22.4/docs/libglom_reference/html/inherit_graph_10.png0000644000175000017500000000466212234777146025201 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“ gIDATxœíœ{HSoÇߣ†æ9µËv6µy«,üC†˜†öcTâ-,­,° (PaBK»Hv3(JÅtja¢ˆiÊ1³e:oå˜6uKRÛœ;¿?^~çwÚM¦ÖÎç¯÷œó¼Ï¾ïûœsÞ—ç9 ÁqP˜ «-€bE¡âm^Pñ6/¬ÈÃÃÃ---«%…âwÀb±‚‚‚þ?ÆI”••­ž0ŠßBLL 9ÄVºÔŽý¯!66Vë µ~›T¼Í *Þæoó‚Š·yAÅÛ¼01Þ“““çÎc±XÖÖÖ,+99Y"‘ÀK‚´··/ŸB= 266ö§¸]S˜oFóÏ?ÿ´µµUTT ×ÔÔØØØ+•Êe×G±¼èÉ·ÌËãÇûúúÄb±ÀÕÕõÞ½{—/_¶²2ÅÛŸ‚ 2™ÌÅÅeµ…,I‰)ÏwIIIjj* 6F³´´$Õjµ@ `±X... ããã„ÖgÏž¡(êàà‘‘QZZÊ`0Ïž=K“†ÙÚÚº»»@³ŠŠŠM›69;;ߺu ÐÙÙN§Óׯ_ïççW^^Nxklld³Ù………999t:=66êQ*•§OŸÞ¸q£««ëíÛ· ñ‚TUUyxxÐh´¸¸¸ññqA®®®ð…O¸}ôè‘ÖäÈd2ò¡F£ÉÉÉáp8vvvÍÍÍÆ'çåË—(ŠÒéô»wï“ZÃ×R²htóçø|899UWWº %fggs8œÖÖV‘H´{÷îWù|þØØXEE`ïÞ½D»¯¯Çñ¢¢¢þþ~rcË–-iiiR©´²²ÒÂÂbdd511QVVfeeõóçOŸ'N ŒŒŒX[[+•JøsÁÁÁMMM×®]óôô|÷îX,æóù0«,ØlvSS“H$ …Ñ‚½|}}[[[»ººBBBöïßO«d·ÓÓÓÄÀ›ššâãã}}}ɳ‘——Çb±%‰@ pvvž529£££•••p\††O(1NLLŒVþÜ”x[YY577ÿïâ?är9þ_¼½¼¼žþ øþý;¼ÚÐЀãøÜÜœVÃ0½?G§ÓoÞ¼ Ûr¹\­V:::ˆŽ2™L¡P¨Õjh#‰È‘ …8ŽoÛ¶­¤¤H$KKË©©)ÂÂBxòãÇä^?†ç;;;¡x­xC·8ŽOOO?|øÐßß?,,¬¬¬L¥R‘Åoݺµ  ¶5\.×h4F&çùóçäq¾Éñ6å}Î`0zzzÈa&6ç_¿~åp8° ÃÃÃðÐÞÞ`aa¡Õ6D~~~NNŽ››ÛÑ£G»ººàª¢(¹£B¡<Á`¤¤¤»³ÙlÀÀÀÀ¡C‡A„ÉdÎÍÍ K¥RooohF4Èš>>>dñZnëëëÝÜÜ>}úTZZÚÐзnÝ:²Ùàà ô@„F£!bdr˜L¦Ö„è¾É˜ï}ûöåççÃ{@£ÑÞ¿¯eƒ¢h?lÃÁ0MbddäÐÐP(ܼysXX¼·à2FÀãñúûû¯_¿>88X__O¾çŽÁ`¼xñ‚üœy{{£(Jܸb±˜Ü«¯¯6z{{õЇnQår¹õõõµµµr¹\W<ƒÁ  ÅÜÜœ‘ÉÑ—¡á›Œ)ñÎÌÌ”J¥|>¿½½]*•VUU]¸pAËæÈ‘#—.]Â0¬§§çÔ©S|>ŸF£-Äyqq1œ ¢áïžÎf³p·±±Ñí5;;Ëår½¼¼º»»“’’dƒ¤¤$@ÐÞÞ.‹SRRvíÚHLL¼xñbsssoo/±a„deeaÖÝÝššJˆ×èöíÛkjjêêê$ÉŽ;’““;::ÈÇŽ;þüÛ·oGFFnܸ¢èÌÌÌ¢&GïðõÞ[ ‚ür_àúãø—/_œœœlmmù|>¼IÉë·J¥JKKc2™t:ýàÁƒä•X§õ¶EEE䯛7oüüülll8Nii)®³u’ÉdÕÕÕîîîÖÖÖÁÁÁµµµpßD¸U©Tééé(ŠÚÛÛGDDÀ½¡R© •É Y®@e}bÔjµñb¹^©k¡¾¾Bû5"?àääÔÐÐàïïppp0dOØ@ŒX®ºb,,,ŠŠŠVW•i¬P¼Éù#{{ûysm ±ù}h˜õŠ9|øðŠëZÖèúýãÇ "WÀq\·’ 櫬é¥UrÖ-0“ÅJàËÙ[ˆ¡ú:Öô–}êæœl[x>Õd€áº'ÙF "ÕŠaØ;wt+Ùø|•u#½tKÎà×|­®Âƈ[ à Õ×!uuunnnYYY£££Ë6¿¿²<õ殺ÀxëµçõV²ñù*ëFzé–œµâmHŒL&3âÃ0Cõu‚¡¡¡ŒŒ EÛÚÚæ™»Å³<õïÕEo%^2RY7ÒK·ä¼,bFêë6›}åʱX¼gÏžãÇs¹\4,Š?/Þz+ÙKé¥[r^.1FêëdD"QKKËäädxx¸ÉJÈÍŸÃ-qèàà@|×+ÙL&“F£]½zµ½½ýÇó:\l/¹\¾@»…õuŸ 6hÕ×J¥R(Þ¿_¥R libglom-1.22: Member List
        Glom::LayoutItem_Summary Member List

        This is the complete list of members for Glom::LayoutItem_Summary, including all inherited members.

        add_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        add_item(const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)Glom::LayoutGroup
        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Summaryvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_border_width() const Glom::LayoutGroup
        get_columns_count() const Glom::LayoutGroup
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_items()Glom::LayoutGroup
        get_items() const Glom::LayoutGroup
        get_items_count() const Glom::LayoutGroup
        get_items_recursive() const Glom::LayoutGroup
        get_items_recursive()Glom::LayoutGroup
        get_items_recursive_with_groups() const Glom::LayoutGroup
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Summaryvirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItem_Summaryvirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        has_any_fields() const Glom::LayoutGroup
        has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::LayoutGroup
        LayoutGroup()Glom::LayoutGroup
        LayoutGroup(const LayoutGroup& src)Glom::LayoutGroup
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Summary()Glom::LayoutItem_Summary
        LayoutItem_Summary(const LayoutItem_Summary& src)Glom::LayoutItem_Summary
        m_list_itemsGlom::LayoutGroup
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Summary& src)Glom::LayoutItem_Summary
        Glom::LayoutGroup::operator=(const LayoutGroup& src)Glom::LayoutGroup
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        remove_all_items()Glom::LayoutGroup
        remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::LayoutGroup
        remove_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::LayoutGroupvirtual
        set_border_width(double border_width)Glom::LayoutGroup
        set_columns_count(guint columns_count)Glom::LayoutGroup
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_list_const_items typedefGlom::LayoutGroup
        type_list_items typedefGlom::LayoutGroup
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutGroup()Glom::LayoutGroupvirtual
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Summary()Glom::LayoutItem_Summaryvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_17.png0000644000175000017500000000432012234777146025177 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“…IDATxœíœ}HSßÇÏUÃe*ÛJ²ín>?PB"SA- 3F45-¬ (RaýQ‰JýeøGiT*æÓ EDÄ'f¢)ÊtjÖdêÔ™¤8SÏïÃ÷þN»ÛRs3»÷õ×¹çž{îç~Þ»çœ÷!,ŒÁn§`±)¬Þ̂՛Y8ভ­m§Ba±"‘(,,ìÿÇ£¢¢bçc± 2™ —ØÞ‚]±ÿ3ÄÇÇÕ°ó7³`õf¬Þ̂՛Y°z3 Vof±E½nß¾-‰E"QZZÚÄÄ:EDWW×öEh‚ fffvK·`§Ó…³½×××OŸ>ÝÙÙY]]­Ñhêêê8Nxx¸Á`Øöøþþ®tÑ÷×àï(..vwwÿñã^©×ëWWWÑ^R©üm'@§ÓÙ¸Û-ßtÓ%“ÉŒö×¶ò~—••eddìÛ·¯är¹öööÔáêêª\.‰DHJJšEõA¼}û–$I—ìììòòr@àêêzëÖ-ªAii)^P*•aaaNNNžžžEEE¨Yuuµ»»ûþýûŸ?>>Åc0nܸqðàA77·§OŸRÁ¡P(¼¼¼¸\nBBÂìì,A7774àSݾ|ùÒ(9:ΖéÚ4¸ø|¿y<^mm­¹³H¡¼¼<ŸŽŽ•JuâĉsçÎQg¥RéÌÌLuu5 ..Ž*ŒŒ@KJJFGGñ‚··wff¦V«­©©±³³›œœœ?~nn®¢¢ÂÁÁayy9 àêÕ«ccc“““EEEŽŽŽƒÝ.<<¼¥¥åáǾ¾¾íííjµZ*•¢O½\.‹Å---*•*** ü÷;::"""Ξ= }¿©n—––¨oiiILL ´eº,C¿·¢·ƒƒCkk+1B¯×Sàçç÷úõkÔ ¿¿ðýûwt¶©© B¸¶¶fT67¬ñùüÇ£2ÝÝÝÔ…:n~~ B•J…+WUU!<|øpYYj011aoo¿¸¸èååU\\Œ*{{{ñ«^½z…ê{zzPðFz£n!„KKK/^¼ŽŽŽ®¨¨XYYÙÙtálÏx.†††ð¸©Õ&Å·oß|||P4 :tvvØÙÙ•ÍQXX˜ŸŸïááqùòå4 ’$‰_8??/—Ë###Azz:~¹X,Œ%''A„P(\[[Óh4Z­Ößß5£ xÌ€€€þ\^^ÞÔÔ”°gÏžM—e¶rå™3g ѧ Àår?}údÔ†$ÉÑÑQTF@°µO:5>>^UUuèСèèh”,4¡RDFFŽŽŽ>zôèË—/ø)”@ðþý{ô___×ëõþþþ$IRJ¨Õjüª‘‘T6<ê–$ÉÐÐÐÆÆÆúúz½^o2~§Ë2[ÑûîÝ»Z­V*•vuuiµZ…BqïÞ=£6—.]zðàR©º~ýºT*år¹é¼´´tll /gee‰Åâ!‡Ã¡_õóçÏÐÐP??¿ÁÁÁÔÔTÀÜÜÞ 55U.—wuu©ÕêôôôãÇRRRîß¿ßÚÚ:<ÿâÅ‹øÌGM<&Ë€’’¼ðñãÇ   ‡ãããS^^iK'NW[[ëéééèè^__‹ÖMT·+++YYY$I:;;ÇÆÆ¢ÅŽÁ`¸yó&ZŸ¿yó`ów^^ž¯¯¯««ë… ¦§§!„‘‘‘gvvšùµ¸¸øüùó¨¨([¦Ë2ôù›€Ø ¢²²211¯a&A(•ÊäOA¿w¨ªª¢jØýsfaâ÷L,ÿðǾß̂՛Y°z3‹] 7a sž±IÛ²Çü[úÎ;NNNF_èw)»`½Fírðx¼¦¦¦àà`€‹‹‹Í(((hnnæóù6»£õØzã;MÎÎÎÖÚx2Ïòò²···oj%þºñœî›Äœá P(žžž\.W&“MOOSõBºN¿û‡H’äóùÏž=ÿmÔ#çÛœK@Ý'ÀÊà›mßOµtÿ›`›ˆ ïcÇŽõöööõõI$’¸¸8ê‚‚ºiû”±±±SSS555ÈY‡Øö­9—ÑÐÐàáá‘““355eÕmœíñ¿w \ †72‰!„Ⱥ@ë,¥RiÒ‡4½ß½{1gbz›s©)ÆÇdz³³I’LIIéìì´^*6Èöøß o___T hµZthÒ§÷, Ù‚K‹Å¹¹¹jµúäÉ“W®\ ýÃÇÜvv«Þ oÊÉV©TAˆD"thÒ§÷lä¬ãlÐ¥V©Tmmm 111[z8+ò×éM÷¿MbÁðÎÊÊêëëëïï¿víZ||<õÍͤ¾),»Ôƒ¡´´4"""--M"‘ äæænöVÜÿ†ùÐüoü5ÑZ0¼ËÊÊ„B!ÇKNN6ò˜é8´è1Íßæ\j„B¡HJJjoo·Zn6 ë3 Öÿf:¬Þ̂՛Y°z3 VofÁêÍ,X½™… ÿ›þ'm,»”ŽŽ‰D‚×üò~‹D"™LfÛX¬ˆD"ùåÏS ØÝ4FÁÎß̂՛Y°z3‹ÿ%mx’}W€IEND®B`‚glom-1.22.4/docs/libglom_reference/html/inherit_graph_8.png0000644000175000017500000000437512234777146025131 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“²IDATxœíœmHS_ÇÏUcË'æTªy7æSeà s‚ZVŒȇ°´B°@‚¢@… =˜J=ûÂ4,S§…‰""æ[bÊt>ÕÖ´©3Iksîþ_ºÝöô·å¦uïçÕ¹çžsîïü¾w÷ÎWD0 ¤Ái½ p(”Þä‚Ò›\¸/ Eww÷z…BaØlvttôÏkŒ@mmíúFa’’’ˆ»˜¶ vìÿ ÉÉÉF5ÔúM.(½É¥7¹ ô&”Þä‚Ò›\ب÷ÂÂÂ¥K—Øl6Fc³Ù™™™J¥ÞBD*•®]„f@dffæovCa‹ÞƒáÀ}}}b±X¡P477Óét@ Õj×<>еÅÌyËÿRQQ1::*—ËÝÜܾ¾¾>¼~ýº‹‹-£ý- ¢V«}||Ö;?ŠÄ–ßwuuuvv6‡Á`8;;ã—z½^$±ÙlŸ´´´ÙÙY<ÖgÏž¡(êáá‘——WSSÃb±<==/^¼ˆ7¨ªª"$Itt´««k@@@YYl&‹·nÝêíí}÷î]ÀÀÀ@BB“ÉܼysDDD]]>ZGG‡Ã)///.. d2™ÉÉÉ0­V{þüù-[¶øúúÞ»wAÆÆÆÀÀ@ƒ‘’’2;;‹ À××~ðña?~l”µZM¼4 ÅÅÅ\.×ÍÍÏçwuuYOÎË—/Qe2™<€•FÓ7Šä·1=?Çþ//¯¦¦&KwaˆEEE\.···W&“íÙ³çðáÃø]¡P833#‹û÷ïÇË£££†UVVŽ AAA999*•ª¡¡ÁÉÉijj päÈ‘¹¹¹ÚÚZ—ïß¿‡……={v|||jjª¬¬ŒF£iµZø8@ÐÙÙyãÆàààžž¹\. ᩲH$âp82™,..ª{…‡‡÷ööÆÄÄ:tV»Äa—––ð‰wvv¦¦¦†‡‡³qçÎ6›ÝÑÑ¡T*E"‘··÷òò²•ä$&&NOO744ÀyYš>‰u’’’ŒÎÏmÑÛÅÅ¥««ëç?Ðh4ؽCBBž|6[TVV ¯^½Šˆˆ Óé\.·¦¦3Ù:©Õꦦ¦€€&ZZZá¾ V§Óåææ¢(êî˜÷†Z­öÂ… pþôéS@X¿‹ŠŠ‚ƒƒ====úùóg Ãbccétúìì¬Qä8‹‹‹¥¥¥qqqÄJN—ŸŸÏáp\]]y<ܯ¬29°ÞtúÄH¬cº~#aÃUWW—ššŠ‘þï‘H$QQQëÈŸÿÞ¡¾¾¯¡ÎÏÉÅ¿|"f3ÿðŽú}“ JorAéM.6œÞŽtÖ¤R©^¯·n„› ãoñÎ7Ö~ :낈Åâ   OŸ>•–– ‚ááaf'¶··GFFâ—NNN•••öxܺ³±ôv¼³îîînz¶uâÄ ;=nÝÙXßs;뀯_¿ÎÿwàÇÃ0SËÇ’w~Ýšåe !¶­þ<ÕN8ØY7J…ÑYæýû÷M-s< KÞ9¤µµÕßß¿  `zzÚ>©ZkãÛ;ë–nAñÌZæx/KÞ9Îääd^^Š¢ééé}}}ÛYÿÛ~8ØY·ŽYË¿kÅ;‡p8œÂÂB¹\¾wïÞ3gÎðx<›#YC6–ÞvÖ­cÖ2'†aÉ;'"“ɺ»»ìäï²±ôv°³n³–9Žï Õj«ªªbbb233ù|þàà`aaáj‚´;Äûº¯ß˜cu`uý6k™ã½,yçÆÆÆ´´´žž;ei•Pþ7¹ üo²CéM.(½É¥7¹ ô&”Þä‚Ò›\˜ñ•MÿIÅ_Joo/ŸÏ'Öüòûf³ÙIIIŽ ‰ÂŽðùü_þy*ušF*¨õ›\Pz“ JorñkRÍR?%ãIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_0x74.html0000644000175000017500000003223012234777147025021 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - t -

        glom-1.22.4/docs/libglom_reference/html/index.html0000644000175000017500000001100312234777147023331 0ustar00murraycmurrayc00000000000000 libglom-1.22: libglom Reference Manual
        libglom Reference Manual

        Description

        libglom provides API to access Glom's XML-based Glom::Document structure. AppWindows may use it to load a .glom document and then call methods on the document to discover the connection details and the data structure, including:

        • The list of tables
        • The list of fields in each table
        • The details of each field, such as field type, title, default value, formatting, etc.
        • The relationships between tables.
        • The layout of fields on list and details views.
        • The layout of print layouts.
        • The layout of reports.

        libglom also contains utility functions, such as Glom::Utils::build_sql_select_with_where_clause(), to build the complicated SQL queries used by Glom to retrieve information from the database.

        See http://git.gnome.org/browse/glom/tree/glom/libglom/example_document_load.cc for a small working example.

        Warning

        libglom is not yet API stable, not properly documented, not thoroughly tested, and not yet really intended for serious use by applications other than Glom and Qlom.

        Basic Usage

        Include the individual libglom headers. For instance:

        #include <libglom/document/document.h>

        If your source file is program.cc, you can compile it with:

        g++ program.cc -o program `pkg-config --cflags --libs glom-1.22`

        Alternatively, if using autoconf, use the following in configure.ac:

        PKG_CHECK_MODULES([DEPS], [glom-1.22])

        Then use the generated DEPS_CFLAGS and DEPS_LIBS variables in the project Makefile.am files. For example:

        program_CPPFLAGS = $(DEPS_CFLAGS)
        program_LDADD = $(DEPS_LIBS)
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Portal.html0000644000175000017500000036667212234777147030334 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Portal Class Reference
        Glom::LayoutItem_Portal Class Reference

        get_title() returns either the title of the Field or the CustomTitle. More...

        Inheritance diagram for Glom::LayoutItem_Portal:
        Collaboration diagram for Glom::LayoutItem_Portal:

        Public Types

        enum  navigation_type {
          NAVIGATION_NONE,
          NAVIGATION_AUTOMATIC,
          NAVIGATION_SPECIFIC
        }
         The navigation (if any) that should be used when the user activates a related record row. More...
         
        - Public Types inherited from Glom::LayoutGroup
        typedef std::vector< sharedptr
        < LayoutItem > > 
        type_list_items
         
        typedef std::vector< sharedptr
        < const LayoutItem > > 
        type_list_const_items
         

        Public Member Functions

         LayoutItem_Portal ()
         
         LayoutItem_Portal (const LayoutItem_Portal& src)
         
        LayoutItem_Portaloperator= (const LayoutItem_Portal& src)
         
        virtual ~LayoutItem_Portal ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual void change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void change_related_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        Glib::ustring get_from_table () const
         A helper method to avoid extra ifs to avoid null dereferencing. More...
         
        sharedptr< UsesRelationshipget_navigation_relationship_specific ()
         Gets the relationship to use for navigation if get_navigation_type() is NAVIGATION_NONE. More...
         
        sharedptr< const UsesRelationshipget_navigation_relationship_specific () const
         Get the relationship to use for navigation if get_navigation_type() is NAVIGATION_NONE. More...
         
        void set_navigation_relationship_specific (const sharedptr< UsesRelationship >& relationship)
         Set the relationship to use for navigation if get_navigation_type() is NAVIGATION_NONE. More...
         
        void reset_navigation_relationship ()
         
        navigation_type get_navigation_type () const
         Discover what type (if any) navigation should be used when the user activates a related record row. More...
         
        void set_navigation_type (navigation_type type)
         Set what type (if any) navigation should be used when the user activates a related record row. More...
         
        void get_suitable_table_to_view_details (Glib::ustring& table_name, sharedptr< const UsesRelationship >& relationship, const Document* document) const
         Discover what table to show when clicking on a related record. More...
         
        sharedptr< const UsesRelationshipget_portal_navigation_relationship_automatic (const Document* document) const
         Get the relationship (from the related table) into which the row button should navigate, or none if it should use the portal's directly related table itself. More...
         
        double get_print_layout_row_height () const
         This is used only for the print layouts. More...
         
        void set_print_layout_row_height (double row_height)
         This is used only for the print layouts. More...
         
        double get_print_layout_row_line_width () const
         This is used only for the print layouts. More...
         
        void set_print_layout_row_line_width (double width)
         This is used only for the print layouts. More...
         
        double get_print_layout_column_line_width () const
         This is used only for the print layouts. More...
         
        void set_print_layout_column_line_width (double width)
         This is used only for the print layouts. More...
         
        Glib::ustring get_print_layout_line_color () const
         This is used only for the print layouts. More...
         
        void set_print_layout_line_color (const Glib::ustring& color)
         This is used only for the print layouts. More...
         
        void get_rows_count (gulong& rows_count_min, gulong& rows_count_max) const
         Get the number of rows that should be displayed. More...
         
        void set_rows_count (gulong rows_count_min, gulong rows_count_max)
         Set the number of rows that should be displayed. More...
         
        - Public Member Functions inherited from Glom::LayoutGroup
         LayoutGroup ()
         
         LayoutGroup (const LayoutGroup& src)
         
        LayoutGroupoperator= (const LayoutGroup& src)
         
        virtual ~LayoutGroup ()
         
        bool has_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Discover whether the layout group contains the specified field (from the current table). More...
         
        bool has_any_fields () const
         Discover whether the layout group contains any fields. More...
         
        void add_item (const sharedptr< LayoutItem >& item)
         Add the item to the end of the list. More...
         
        void add_item (const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)
         Add the item after the specified existing item. More...
         
        void remove_item (const sharedptr< LayoutItem >& item)
         Remove a layout item from the group. More...
         
        void remove_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Remove any instance of the field from the layout. More...
         
        virtual void remove_relationship (const sharedptr< const Relationship >& relationship)
         Remove any use of the relationship from the layout. More...
         
        void remove_all_items ()
         
        double get_border_width () const
         
        void set_border_width (double border_width)
         
        guint get_items_count () const
         
        guint get_columns_count () const
         
        void set_columns_count (guint columns_count)
         
        type_list_items get_items ()
         
        type_list_const_items get_items () const
         
        type_list_const_items get_items_recursive () const
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_items get_items_recursive ()
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_const_items get_items_recursive_with_groups () const
         Get the items recursively, depth-first, also returning the groups. More...
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         
        - Public Member Functions inherited from Glom::UsesRelationship
         UsesRelationship ()
         
         UsesRelationship (const UsesRelationship& src)
         
        UsesRelationshipoperator= (const UsesRelationship& src)
         
        virtual ~UsesRelationship ()
         
        bool operator== (const UsesRelationship& src) const
         
        bool get_has_relationship_name () const
         
        bool get_has_related_relationship_name () const
         
        Glib::ustring get_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        Glib::ustring get_related_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        sharedptr< const Relationshipget_relationship () const
         Return the relationship used by this item, if any, or a null sharedptr. More...
         
        void set_relationship (const sharedptr< const Relationship >& relationship)
         
        sharedptr< const Relationshipget_related_relationship () const
         Return the related relationship used by this item, if any, or a null sharedptr. More...
         
        void set_related_relationship (const sharedptr< const Relationship >& relationship)
         
        Glib::ustring get_table_used (const Glib::ustring& parent_table) const
         Returns either the parent_table, related to table, or doubly-related to-table. More...
         
        Glib::ustring get_title_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the title of the relationship that is actually used, falling back to the relationship's name. More...
         
        Glib::ustring get_title_singular_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the singular title of the relationship that is actually used, falling back to the regular (plural) title, and then to the relationship's name. More...
         
        Glib::ustring get_to_field_used () const
         
        Glib::ustring get_relationship_name_used () const
         Get the name of the related relationship used, if any, or the relationship if there is no related relationship, or an empty string if neither are used by this item. More...
         
        bool get_relationship_used_allows_edit () const
         Discover whether the relationship used allows the user to edit values in its to table. More...
         
        Glib::ustring get_sql_join_alias_name () const
         Get a name to use as an alias in SQL statements. More...
         
        Glib::ustring get_sql_table_or_join_alias_name (const Glib::ustring& parent_table) const
         Get the item's alias name, if it uses a relationship, or just get its table name. More...
         
        Glib::ustring get_relationship_display_name () const
         Get a human-readable representation of th relationship. More...
         

        Additional Inherited Members

        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::LayoutGroup
        type_list_items m_list_items
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        get_title() returns either the title of the Field or the CustomTitle.

        You should not call get/set_title_original() or get/set_title_translation() on items of this type.

        Member Enumeration Documentation

        The navigation (if any) that should be used when the user activates a related record row.

        Enumerator
        NAVIGATION_NONE 

        No navigation will be offered.

        NAVIGATION_AUTOMATIC 

        The destination related table will be chosen automatically based on the relationship and the visible fields.

        NAVIGATION_SPECIFIC 

        The destination related table will be determined by a specified relationship.

        Constructor & Destructor Documentation

        Glom::LayoutItem_Portal::LayoutItem_Portal ( )
        Glom::LayoutItem_Portal::LayoutItem_Portal ( const LayoutItem_Portal src)
        virtual Glom::LayoutItem_Portal::~LayoutItem_Portal ( )
        virtual

        Member Function Documentation

        virtual void Glom::LayoutItem_Portal::change_field_item_name ( const Glib::ustring table_name,
        const Glib::ustring field_name,
        const Glib::ustring field_name_new 
        )
        virtual

        Reimplemented from Glom::LayoutGroup.

        Reimplemented in Glom::LayoutItem_CalendarPortal.

        virtual void Glom::LayoutItem_Portal::change_related_field_item_name ( const Glib::ustring table_name,
        const Glib::ustring field_name,
        const Glib::ustring field_name_new 
        )
        virtual

        Reimplemented from Glom::LayoutGroup.

        Reimplemented in Glom::LayoutItem_CalendarPortal.

        virtual LayoutItem* Glom::LayoutItem_Portal::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Reimplemented from Glom::LayoutGroup.

        Reimplemented in Glom::LayoutItem_CalendarPortal.

        Glib::ustring Glom::LayoutItem_Portal::get_from_table ( ) const

        A helper method to avoid extra ifs to avoid null dereferencing.

        sharedptr<UsesRelationship> Glom::LayoutItem_Portal::get_navigation_relationship_specific ( )

        Gets the relationship to use for navigation if get_navigation_type() is NAVIGATION_NONE.

        sharedptr<const UsesRelationship> Glom::LayoutItem_Portal::get_navigation_relationship_specific ( ) const

        Get the relationship to use for navigation if get_navigation_type() is NAVIGATION_NONE.

        navigation_type Glom::LayoutItem_Portal::get_navigation_type ( ) const

        Discover what type (if any) navigation should be used when the user activates a related record row.

        virtual Glib::ustring Glom::LayoutItem_Portal::get_part_type_name ( ) const
        virtual

        Reimplemented from Glom::LayoutGroup.

        Reimplemented in Glom::LayoutItem_CalendarPortal.

        sharedptr<const UsesRelationship> Glom::LayoutItem_Portal::get_portal_navigation_relationship_automatic ( const Document document) const

        Get the relationship (from the related table) into which the row button should navigate, or none if it should use the portal's directly related table itself.

        (If that should be chosen automatically, by looking at the fields in the portal.)

        double Glom::LayoutItem_Portal::get_print_layout_column_line_width ( ) const

        This is used only for the print layouts.

        Glib::ustring Glom::LayoutItem_Portal::get_print_layout_line_color ( ) const

        This is used only for the print layouts.

        double Glom::LayoutItem_Portal::get_print_layout_row_height ( ) const

        This is used only for the print layouts.

        double Glom::LayoutItem_Portal::get_print_layout_row_line_width ( ) const

        This is used only for the print layouts.

        void Glom::LayoutItem_Portal::get_rows_count ( gulong &  rows_count_min,
        gulong &  rows_count_max 
        ) const

        Get the number of rows that should be displayed.

        void Glom::LayoutItem_Portal::get_suitable_table_to_view_details ( Glib::ustring table_name,
        sharedptr< const UsesRelationship >&  relationship,
        const Document document 
        ) const

        Discover what table to show when clicking on a related record.

        This table will not necessarily just be the directly related table. The caller should check, in the document, that the returned table_name is not hidden.

        Parameters
        table_nameThe table that should be shown.
        relationshipThe relationship in the directly related table that should be used to get to that table. If this is empty then we should just show the table directly.
        virtual Glib::ustring Glom::LayoutItem_Portal::get_title ( const Glib::ustring locale) const
        virtual

        Get the title's translation for the specified locale, falling back to the original text if there is no translation.

        See also get_title_translation() and get_title_original(), which (optionally) do not use fallbacks.

        Parameters
        localeThe locale whose title text should be returned. If this is empty then the original text will be returned.
        Returns
        The text of the title.

        Reimplemented from Glom::TranslatableItem.

        virtual Glib::ustring Glom::LayoutItem_Portal::get_title_or_name ( const Glib::ustring locale) const
        virtual

        Reimplemented from Glom::TranslatableItem.

        LayoutItem_Portal& Glom::LayoutItem_Portal::operator= ( const LayoutItem_Portal src)
        void Glom::LayoutItem_Portal::reset_navigation_relationship ( )
        void Glom::LayoutItem_Portal::set_navigation_relationship_specific ( const sharedptr< UsesRelationship >&  relationship)

        Set the relationship to use for navigation if get_navigation_type() is NAVIGATION_NONE.

        void Glom::LayoutItem_Portal::set_navigation_type ( navigation_type  type)

        Set what type (if any) navigation should be used when the user activates a related record row.

        void Glom::LayoutItem_Portal::set_print_layout_column_line_width ( double  width)

        This is used only for the print layouts.

        void Glom::LayoutItem_Portal::set_print_layout_line_color ( const Glib::ustring color)

        This is used only for the print layouts.

        void Glom::LayoutItem_Portal::set_print_layout_row_height ( double  row_height)

        This is used only for the print layouts.

        void Glom::LayoutItem_Portal::set_print_layout_row_line_width ( double  width)

        This is used only for the print layouts.

        void Glom::LayoutItem_Portal::set_rows_count ( gulong  rows_count_min,
        gulong  rows_count_max 
        )

        Set the number of rows that should be displayed.


        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_portal.h
        glom-1.22.4/docs/libglom_reference/html/dir_19bfda69641299eed8e11251504b6c3c.html0000644000175000017500000001224112234777147027370 0ustar00murraycmurrayc00000000000000 libglom-1.22: libglom Directory Reference
        libglom Directory Reference

        Directories

        directory  data_structure
         
        directory  document
         

        Files

        file  appstate.h
         
        file  db_utils.h
         
        file  init.h
         
        file  libglom_config.h
         
        file  report_builder.h
         
        file  sharedptr.h
         
        file  standard_table_prefs_fields.h
         
        file  translations_po.h
         
        file  utils.h
         
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Document__coll__graph.png0000644000175000017500000027330712234777146030635 0ustar00murraycmurrayc00000000000000‰PNG  IHDRíu1®bKGDÿÿÿ ½§“ IDATxœìÝw\Ó×þ?ðóÉNHBXao•áÅ ¸m­£ŠpѪÕZ»¬·W[ѶꯥUÛoë¨VkZ®«½ÕŽ«7Ö…ˆFöIØdýþøX.´ ¯çÇONNÎçý‰<‰ŸçÊd2€N†aîZ :#äXÐ!Ç€Î9tFȱ 3BŽ]Cllì´iÓš·œ:uŠÇãUVVRU^^n®Â  Ç€®!::ú?ÿùO]]]SË‘#GF-‘HE"‘k€ö€ º†1cưÙìŸþ¹©åÈ‘#S§N¥(*66–Ëåš±6hȱ }QµgÏ‘Hôî»ïîÞ½ÛÉÉI,/Y²äá¯:xð §§§D"™6mšJ¥âp8“&MJJJ¢;\¿~½¨¨h„ tçòòr“É”àééimm¥R©!aaa[¶l!„QµnÝ:BHyy9ƒÁÈËËk÷‹€§€ ÚÝ®]»®]»öÝwß%$$$&&¦¥¥}ûí·Ÿ}öYvvöC^µ|ùò={öœ;wîîÝ»sçÎ%„DGG;v¬¡¡räÈ‘#FH$’¦þ›6múæ›ovïÞššZ__ÿÊ+¯BÆwòäIBHrr²@ 8uê!$%%¥W¯^îîîíyÑð´(“ÉdîàYFQÔÉ“'‡ f4™LfóãÔÔÔ½ê»ï¾›5k!äÚµk}ûöÕh4ÀÁÁaÇŽ&L^´hÑœ9sèÎJ¥rèС˗/Ÿ>}:!äîÝ»nnnZ­6--m„ ¥¥¥ ,‹ÅÛ¶mS©To¿ý6›Í¦çf@§…ùXÐî„B!!„Á`ÜwüpÞÞÞôŸŸ!¤°°ÅbM™2%))©   --mÒ¤IÍûçää̘1ƒ¢(Š¢œ CaaဠCzzzrrò¼yóÄbñ•+W’““Ç׿— m 9tRYYYôÁ;w!NNN„èèè£G&%% 6ÌÚÚºy''§Ã‡›L&“Éd4+++}}} ÆèÑ£wïÞ­Ñhüüü"##>œ““#“É:þŠà± Ç€NjÍš5©©©‹-?~<½ÖСC¹\îš5k¦Nz_ÿ¸¸¸øøøK—.effΟ??22’n7n܆ """!Ç߸qã°aÃ8N_<.–¹ €{Î;WPP`î* - <ØÅÅÅÜUtasçÎ>}zYYÙ¨Q£¾úê+º‘ÉdN:uË–-“'O¾¯ÿ»ï¾[WW7yòdµZ~àÀº}̘1UUUM9–F£Á¢‚]e2™Ì]BHTTTRR’¹«€¶´wïÞiÓ¦™» €®Š¢¨ÔÔÔsfƒùXÈÔ©S÷ïßoî* mPeãÇ·:5jùòå_ t6ȱÀlÆŽû %"Ö¬YÓÁÅ@gƒ ÚLcÁd¸w¬«1˜Œ÷îM[H9 v+“ËÒjtµÆ–íÒ@ ¶€Ñ²½ð¼¶±ÚвÝ%LÌ2Ôߨ3éëþrÏ‘®¸•oA9¿©´ú–íèþèþèþèþmÕŸþþC1 Ç‚Iar,Eü}  ›CŽ`NU†êÒFë|sEev½¡á^âÒ<²²`ñ[ÉunVÕ«õÿëÿgn8CÊ·f·ìŸ²:¯º¸±y‹®Æh4˜F$xŠ]¸-ûÿ{ÎmuN}Ëö ;ü$ž¼Vú¿¤¨ÌªkÙ>u_/+ïV~ÎSVç?VÿóŸ=¨?Gøý¥A­ÞWº¼­¸"ýÑýÑýÑýÑ¿û§¬Î«ÌjåûÕƒ¾ÿÜø±Ì¨7ñ$,®„Å“°6l 6ƒ‰Ä º êA‹x@‹ŠŠ"„`¬gEQ{÷î6mZëO›Hñ•êۇʳU÷šj;èŸ.[ü™Œ¦Æj#!ÄÐhÔ7Ƀç÷\ÞV\S¦£uÍr¦o9 9-ûÿ{ŽBsï¾Fcµ±)gš²§—µO+÷)Dg´zäAý¿‘¥Î½w„#dPŒ{w4†äiéÖJ.Õ¼þ{¯0) ˜.Ø´’{=Ùï·¬GâÅcq[Éášgu©ªÙkž%ô÷“Ѥ«1Bôõ&C£‘båÍcrZù¾tâ­¬Š;uõj½¾þÞ·,‹:ržÿʧÕïŸÏÌÇèPuº;Ç*Ò÷)«‹LÊd2éZYT­› ÿO¯>'°ã09­ä9¿«4z£Ñ¤ûkÎ#ص’»œ\ž«Î«ožKÑÓ›ÆoómuÞÛÉøÕíVr£É»zÚö´l¯-×U5ÐÇl &ãϬÅô€ÆÀÒ¾©?õg4&thý¦ÃØ/{õÆÿõÿs|ް•›„±_z·~âèÿ²ãcõ÷)y¬þÒ@‹ÇêO/§Ð}4}ÿáIéžÌ˜ÿ»÷}O_o¬WëkJuUE Ú¢žuë/?¹ñ;¿V§Ú”ߪ­È¬£ä^ÄfÐq—±µÅâ!þÿ°«¯Ð³LŠEØ&ƒI±- &%ñh¥BÈó[|ø.´:~´Ýcõ·"7€gEd+Ü!&#©*j¨¸SW‘UW™Y_–Vƒ º(äX]ŒÑh|î¹ç(ŠJJJòòòº{÷î×_=xð`…BÁå¶2÷åqˆ‹‹{â1÷Òž†¡ÑxuGé©Í7Ål«GéÏ·e[ر)ŠÐÿilšÏÔ¾£•w+9VñUu•úæ3™èŒŠoË~ø‚xÍiòê¯ì()»^£Éo ‘xð¤þvçbK÷6øEI€§‡;ž]Ì®]»-Ztß,"‰DÂdþï÷æôz}||¼«««­­íôéÓU*ÝNQÔž={\\\D"ѻᄏ{÷n'''±X¼dÉ’¦×VWW«ÕjµZ““³zõêÀÀ@__ß«W¯Ž9ÒÚÚšÏç4_ñ¬V«M&SBB‚§§§µµuTTTóS'''»¹¹QõÙgŸÑçÏŸ·µµÕétEíܹ“î¶sçN‡3iÒ¤¤¤$ºÛõë×‹ŠŠ&L˜@w(//oõ,aaa[¶l!„QµnÝ:BHyy9ƒÁÈËË{ÜKKMM4h@ ðððؾ}ûƒ®«UL£Ï,û]ÿXų!,£ù†÷Ú±'ïì9)±çs›}žÛì3æ ïŸx޸ijÕ‹â,òiå:Xìûìÿþïÿ˜LfLLŒÏåË—sss/^×ØØØ4æªU«Ž;ö믿J$’M›6}óÍ7»wïNMM­¯¯å•Wšº½÷Þ{?þøãW_}ÕPíÙ³gêÔ©l6;111<<œÒt}ìØ±††BÈ‘#GFŒ!‘üo5ŒVÏ2nܸ“'OB’““Á©S§!)))½zõrwwÜK‹‰‰:thvvögŸ}¶`Á‚•+W>èºZÅâ3®¨OòŸ+;4u_ï 8{+¡Ť(æý–î‰öÇh+<+–ûPËÐ×_Øîw*(äU'sWpÖè,q]A6›œœ|8??¿ººZ(ÒS¾ …ŸŸ½œ EQï¼óÎÚµkoܸáïïOñ÷÷_¾|ùôéÓ !wïÞussÓjµ€¢¨ýû÷O:U£Ñ888dff:::ºººîÞ½;""¢åeêõz‡;vL˜0!88xÑ¢EsæÌ!®d8tèЖgIKK›0aBiié‚ Äbñ¶mÛT*ÕÛo¿Íf³×­[÷¸—fcc³bÅŠ·Þz‹¢V«ÃÂÂV®\Ùòºò/EQÔÞ½{§M›ÖÔR™UŸ—¢Îý¯¦üV aP 14š!"'nÌQÿ¿ý 0¯“+r5yõN!"ÏÛ^~;Ú¾qt1NNN …¢éaeeeQQÑ}} ¼½½écú °°~( ! ã¾ã–D"ÑêÕ«ïÞ½«P(Ôju|||DD„““Óüùó›w“ËåcÇŽMHH æää̘1ƒ¢(Š¢œ CÓ©ÝÜÜ!–––#GŽ~üøG]ª««ÕjµZ­.**Z¶lYß¾}]\\t:]hh¨OFF½\aEEÝŸÇãyxx,_¾|Ñ¢E:....>>þÒ¥K™™™óçÏŒŒlyЉ'^ºtiÏž=ô2}„;wæää4? „ :”Ëå®Y³fêÔ©÷𠳌7nÆ ôB…Ç߸qã°aÃ8Î\Zß¾}—-[æææb2™æÏŸÿ·×õ؆çHÉ º´ÉhÃÊ›×g–ýø¯}c µÞ!´äX]ŒT*={ö¬µµõèÑ£{ôèñí·ß¶ÜRkéÒ¥/¾øâäÉ“ $•J¿ýöÛG?22ÒÊÊÊÊÊÊÇÇ'??ÿþýEmݺuãÆNNN¯¾úêìٳnjCÏLjòÏþÓ`0|þùçï¾ûîøñã'OžÜ¯_¿‚‚‚´<…X,5j”³³sŸ>}è–™3gž9s¦ù!„ÉdÒûiMž<ù¾t–1cÆTUU5åX¦ù¢‚uiÛ·oÿí·ß<==—.]š˜˜¸nݺ¿½.€î†+fº·úT­J§L¯íàzàÙC™L&sׄEiJ=“&MšúÞ{ï™»vDQÔÞ½{§M›fîBÌ }òìÚ± ×k´•÷+ë|sW]öÇ€U[[›––öË/¿|ñÅæ®Ú‹ŒÓQöo•Y'*¯î(:p<†Iô_jÈþU}ûˆêØË k~ï(»ã¬Ùü6@·†  9þ|TTÔÓÓÐÀT«¹,–ÉÆ¦îéGèlÓo¢ßDmAíÃå—¾ºë4@déÆ5w]`Nȱ:‹Aƒ=ÍËõz†FÃÕh¸j5¯®ŽÅdšjc™ÑÔ©S]]]Í]@×#v冾îÜÿeG“±º;Êd2™»xBZm]ròm¹\!—+òòT\.+4Ô+"ÂW&óõ÷wf2ñuº0äX]LCƒþâÅì”…\®HO/b0¨°0o:»êÝÛ™ÅBvϲŒ¤ò’+Õ±RÛ^s×í9@`4šnÜ(”Ë))ŠÔÔœ†}` ‹LæáÛ¿¿»…Ö €î"ÿ´æòÖbåÍZÇ`Q`¬Ômˆ%…_éxv!Çè¼®_/Ë/æ\º”[YYãìlÙS&ó ó¶³™»:³)¿U{ãDz¬ã•öì^SìzM±åˆ˜æ. Úr,€Î¥¸Xýûïr¹ââÅìÒR­D"É|é?îî6æ® Ñä5¤ýXzçX…ÀŽ=í`oŠA™»"hcȱÌO«­KN¾-—+ärE^žŠËe…†zÑ[^ùû;3™Xàê5ú EÓ¬\ð BŽ`ú ²SRr¹"=½ˆÁ Â¼#"| ð råñØæ.ÀÌct£ÑtãF¡\®HIQ\º”[_¯ t‘É|#"|û÷w·°àš»@€gJMi£…=ÇÜUÀ“CŽÐî®_/¸x1'55çÌ™;5ÎÎV‘‘=e2ß½¥R,zÐ.êÕúÝÏݰïkÑož£c¡¹Ë€'  ]«ÿ=C.W\¼˜]Zªµ´Ðû]Éd¾îî6æ® [(½VsõÛ’üÓ~ß¹^#¬eîšàq Çh3Zm]ròm¹\!—+òòT\.+4Ô‹Ž¯üý™L†¹ èŽJ®V_ÙVRx^+ ´è7ÏÁmˆ¥¹+€G… à©46ê/\ÈNIQÈåŠôô"ƒêÛ׎¯ ðäñØæ.!D™^sy[I¾\3"ÁÓk”•¹Ë€G‚ ౦7 årEJŠâÒ¥Üúz]` ‹LæáÛ¿¿»…×Ü@ë”éµ6¾|Ë t ȱÕíÛ%©©9r¹âÌ™;5NN’áÃ{Éd¾zK¥"sWð¬AŽð0%%šß~»)—+.^Ì.-ÕZZ èý®d2_wwsWmÃd4Q LÒètcÜO«­ON¾%—+ärE^žŠËeÑû]Éd¾þþÎL&ÃÜ@ûï{9E/t»`¿€N9!„46ê/\ÈNIQÈåŠôô"“ÉpoË«9ù=õ*/OÅá°ôŠˆð•É|ýý™L¬ Щ!Ç‚gŠNg8>+%E!—+nÞ,2M.ô–W!!|>ÇÜÀ£BŽ]žÉdJK+”Ë))Š?þÈ­­m r•É|CC=ƒƒ=¬­-Ì] <;ª‹ù6,& ½täXÐUåç«èyWgÏfªTÕŽŽ’#zÉd¾¡¡^ööXºÚűùwªK¾éâ9BbîZž}ȱ +)-Õ¤¤(RSsè-¯ÄbþС~2™¯LæëîncîêàÙ× 5\ÞZ|s¿ÒÆ?蟮ö}° @;BŽ]UUý©S·är]q8¬½""|e2_g&³ø £iòêÏ­/*8«ña5p±³Ð{r´ äXÐét†óç³èeoÞ,2M.2™oD„oHˆŸ¯†`n&’õKå…/Štµ†az¸µ4wAÏ äXÐY˜L¦´´B¹\‘’¢øãÜÚÚÆ  ×ÇÜÀcpqqÁ4gr,€¶¢«5ìŸzÓ%Lú†3ß·àž>D¡™L¦´´B¹\‘’¢øãÜÚÚFww™ÌwÑ¢ááá>ÖÖæ. Ý±ÌÁ︞[_¸JzÈ"§^/ÚQXŒàñ!Ç‚¶QPP‘œ|[.Wœ;—Y^^íà`9rdïØØA¡¡žöö–æ® £yޏ_ÞV|îÓ¬ã•+Ü,Ýyæ.  ‹AŽO®²²æôé;M[^‰Å¼¡C{þë_ÏÉd¾îî6æ®ÀÌX|FèÎ>ÏÛ¤¬ÎKŠÊœ) ^àÄäPæ®  Ë@ާªªþÔ©[r¹ââÅœÌÌR‹9p Wlì ™Ì×ßß™ÉÄ y€¿°òæ½ðïõÄÒ›ûʃâì™Ü‘xTøÔ„¿§ÓΟÏJIQÈ力7‹ŒFS@€Ë¨Qþ«WO ñàó9æ. Sc0©¾³§Ûc2;î IDATÀcAŽ­3™Lii…r¹"%Eñǹµµnn6¾‹ <¸‡ÐÜ@ ×ëÙl¶R©´µµíœÃR•ššÒ&…µêAÕRÕæï tr±r,ø‹ÂÂJzÙÀsç2ËË«,GŽì=ujHh¨¶¼€ÇÅd2E"Q'öÒ¥K ¸¯%88¸Mo§7 ;@ŽD­®•ËôŸ¼<•XÌ:´ç¿þõœLæ‹ì žEQ±±±Ø~ýúUVVÒÇ%%%111AAAm5x;½ ð̨*j¸›Zí7ц`²@ sæQ]ÝpôèÕ+ûY@@ük¯íÌËSÅÆ:~üí7þßÖ­³bc!Ä€Î@£©ÕhjÕêÚ¼½qãÆk×®edd45FGGüñÇkÖ¬!„$%%…‡‡8p`Ïž=IIIVVV .œ7oÞ¡C‡šú¯Y³æÐ¡CJ¥óçÏo£·º¼ž/ÚÚX¤|˜·orzÿùŽAqö~óàO”yïA{3™Lii…r¹"%Eqùr^MMƒ››MD„¯Læ;xp¡¹ €Î¢¾^§ÕÖWW×WUÕkµuM]uu½V[_UUOTW׫յUU÷ZêëõÕÕ÷â¨Vq8÷’‡)óÙl¦…—Çcóxl .‹Å „ˆD<ãÞ“IBD">ƒABÄb>EBˆD" ´´äB(Š‹ùmrÉMmÓµ74è !F£I«­£kku:!D§3ÔÖ6ÐUUõ:ÝÿRºêêzΨÕÖétz:Ékl4<$c³™b1_,æ‹Å<±˜/‘Äb¾¥%¿y#ýþ»Så^QQQ„ýû÷?¼›ÍŠ+Þzë-BˆZ­‰D,K©TOK«ÕÚÛÛ_½zÕÏÏoèС³gÏþøãããããââ!éééF,S¥T*CCCãããçÌ™C¹~ýzŸ>}èžî_¦QµwïÞiÓ¦™»€nǨ7¥í,»´å®Ôß"â}wK7®¹+è0ëÙTXXyêÔ-¹\qþ|–RYeoo)“ù¼ÿþDlyЭÔÔ4¨Õµjume%ýwMó‡UUuUU ͽhŠÎlš³°à …<±˜'ñD"žXÌws³‹yB!O$âñxl¡Ëb1--ù,Ö_f#1™L±˜g–K~Líõ™¨×kjêëëutÚ×}Ñ¡V[GTUÕç竚7êõÉY,qYZòml„¶¶B[[‘T*¶±±°³ÙÙ‰éF:ùë$6oÞüæ›o~þùç‘‘‘óçÏc=;ÔêZ¹\AÿÉËS‰D¼aÃz¾óÎ8dWϽިRU«TÕååUM¡Tó€J­®U«k*+kÄb¾••ÀÊÊB"H$;;…<‘ˆ+óéÔJ(äI$ü¦yQðX,†¥¥ÀÒò±_XSÓ ÕÖiµõMáVSÄ¥RUWTÔ(¥eeZ•ªšž@Fa0¨û".©Tlk+¢ììD66B6›ÙÆWø`cÇŽÍËË»víÚ¡C‡† –““C·;::æääЋfeeÑNNN999C† ¡Ò­è)SO3,í¾y]aaak×®íׯŸÉdâñZ‰Z92hÐ ±XL?tqq =qℇ‡‡½½½••UË—DGG¯]»V(Nš4I(º¸¸dggÓõdggÓרÔÙÅÅE¡PÐ×›™™ùðwº';‹É;{]Ù^Ì·ie·N€n9V×V_¯KMÍ¡·¼ºq£Éd„…yÇÆ’É|{÷v¦—l€®E§3TTT+•Õ¥¥•ªF©Ô–•U©TÕeeUååUååU*UMóeëèPÊÚú^:åâbee% %DbÑô¹TçgaÁµ°à::þ}Ïêê¥R«RU«T5Je•RYE§›7n©T·éö¦Ÿ[[¡ƒƒ¥££ÄÅÅÚÑÑÒÑÑÒÅÅÚÁÁÒÑÑ’Ãiãoƒ}ûö4iÒÒ¥KCBBšÇE3fÌX³fMïÞ½ù|þ’%K!E½ôÒK|ð§§g=vîÜùÁ”””…Â;w†‡‡{zz6<Ö°­¦ÓéBCC}||222>úè#BHEEÅ}kú8qB&“5=ô÷÷?vìXvvö¦M›ÇŒ³hÑ¢þýû7É /¼0wîÜ7nÙ²…2kÖ¬Õ«W÷ìÙÓÒÒòõ×_?~|óIf3gÎ\µj•ŸŸŸT*¥«¥5]æ“¿ïð ar¨Wþ¾@÷€«ëÑé çÏgÑÙÕÍ›Eƒ)0ÐE&ó]¾||p°G§ÚHZE‡RÅÅj:~P*«ÊË«ÊÊ´ååÕååÕ*UuSO.—ek+rp[[ Ýܬ 𰱡§Ýˆè 7‰àAwíáÙ&r…B;OO»u0Œ*UMEEuyyuq±º¨¨²¨H“£>^¥R9R"‘¬]»öĉl6û_ÿúWCCÃŒ3ÊËËŽ;& !3gÎLLLôôôl:x¬a[-lëÖ­o¼ñÆòå˃ƒƒããã5Íĉ322š÷‘ËåÿøÇ?î{¡——×úõëW¯^½k×®·ß~ûÔ©SÍŸãÇ?wî\dd$!déÒ¥ÕÕÕ“'O®««=zô† šw^¶l™Z­ž2eŠÑh\¿~ý/¿üB·7]æ½åÏ2êAûC§b2™ÒÒ årEJŠâò弚šWWë¡Cýd2ßAƒzØÚ Í] üEeeMi©¶¤DSVVUR¢)+»w\\¬.+Ó6-÷Çã±mm…ööb‘N íìÄvv"[[¡T*‰ºÄ.SÐõTTÔUÞ½«.,¬(,¬¼{W“£ÌÎVÖÖ6B,,¸^^vžžvÞÞvÞÞR//;//»¹sã!û÷ïú³§§§*•ʦ8ªM´Ó°€¢¨¤¤¤)S¦˜»B¡(jïÞ½Ó¦M3w!„ Çêz½± @õߘ~¢¢Ê“'oÉåŠóç³”Ê*++‹!C|d2_ly`v ú»w+‹Š*‹‹5¥¥ÚÒRmi©æÏìJÛ´w—Ë’JÅ–ööb{{ú驪bKKy¯à>ÅÅê¬,ev¶2'G™•U–•¥,(PéõFB—« )yâËßßÿùçŸ_±bEMMÍ«¯¾ªÕjûí·§/¸†í`=zô8wîœÝcWlȱ:-C£éò×Å}fÛs„·û)€Ùa]ÁvwçN髯&º»ÛlßþÒ£ôW«kårý'/O%ñ† ëùÎ;ã]˜Eyy5=m¥¨¨²°°¢¨HMÇWeeUt6›)•Š%vvÂÀ@—#z;8XJ¥":¬²²²0oý^¯g³ÙJ¥ò¾½ˆ(ŠjÙøˆÏþ-Š¢RSSCBBôlËÆ‡ôï>è5‡ ñijÑé ùùª¬¬²5kÖ>ÍÈ{÷î}óÍ7œœL&Sxxø×_ýÔŶã°,33ÓÜ%@ É¯¿}¤<óxŰUŽý±6tȱڑÑhúúëä>:j0óóUF£‰Áh} “†ýÅ‹Ùô–WééE æ;H&óíÝÛ™ÅbtpåÝMc£žÞ=¨¨¨²°°²ypÕ4³ÊÎNää$qv¶ ö˜4©¿³³ýÐÎNdÞâ;?&“™˜˜(u¢7ª²²’>°²²:yòdß¾} !m[aAAÁK/½táÂOOÏM›6Éd²6¼#±ÙLoo©··tÛ¶Ú§' à÷ßo«ªÚ{X€NȺÊÞÞ§?ÊÿiÁ 8iÈ+N 6öÊ€gr¬öróæÝW_ýáÎ2zåÆªªú´´Â>}\›:èt†óç³RR/f§¥64è]d2ßåËÇ{óÕðÌÒé t:•Ÿ_‘Ÿ¯Êϯ((¨(,¬(-ÕÒ8–³³•³³ÄÙÙjÀgg+:¯rq±ærñ¡ù„(ŠŠ5w!‘HšŽ…Baó‡må­·Þâp8ééé›7o~ñÅsrr„BüÎ,<¾5kÔ:/ÅQÕÙO Ïi#W{ZycK]xÆá–\Û3Œ[¶œüä“ÿ˜L¤iû16›qú´"(È%-­P.W¤¤(._Ϋ©ipuµ:ÔoÞ¼ˆAƒzØÚâö@Û0™L¥¥Z:©ÊÏWTTä竊‹5ƒ‘Âã±ÝÜlÜÝm‚‚\Çïãâbåädåìl%•v¢9CR©l¾…Ïøñãûöí»fÍBHYY™³³óÍ›7¿ÿþûï¿ÿ¾®®nôèÑ6l°±±!.(‰–.]º{÷n£Ñ¸bÅŠ¿=ÝÁƒ?úè#µZ=räÈÍ›7[[[ðÁ÷ ®×ë[6¶á%_½zõŸÿüçåË—ëêê¼½½W®\IïDQÔ©S§fΜ¹|ùr…B‘˜˜Èf³?üðÃ×^{íôéÓ!!!ÉÉɉ‰‰nnnË—/ÿä“OÒÓÓ؆…@·åû‚C_á—çн¶Ä¹÷ÔN±Ë&@;AŽÕƲ³•‹íLK+0MÍÛõzcbâ¹¼“£´°à†…y½óÎ8™Ì§gOÇV·è€GTUUŸ›[ž›[N'Uô«‚‚ŠÆF=!„Íf:;[¹ºZ{zÚEDø¹¹Y»ºÚ¸¹Yc1ÀÇuúôé7^»v-##£©1::úã?¦s¬¤¤¤ðððìÙ³'))ÉÊÊjáÂ…óæÍ;tèPSÿ5kÖ:tèÀR©tþüù{Ò¯¿þúßÿþ7ƒÁxùå—gÏžÑrðuëÖ=äŒO/&&&22rûöí|>ÿرcqqq“&Mâp8„÷Þ{ïÇ}ú<üìëÖ­ "„lÞ¼¹ÿþ©©©ëׯ¿oð;v<äŒOïÂ… B¡ÉdBd2YCCƒV«¥³™Å‹2dΜ9+V¬èß¿?!dãÆtÁ„KKKBˆB¡˜>}ú;ï¼ãææÖV%éd;œu@1¿ÿþûâÅ‹ïܹãîîþùçŸ7® €.ŠÁ¢¼îdî*Úr¬¶QTTùƻΟÏnZH°%ƒÁ4dˆOh¨WGÐEÕÔ4äæ–gg+ssËsrÊsr”99ʲ²*BƒA99I<<ìôЉèéiëéiëáaËáàC­8qbæÌ™111»wïîÙ³gËb±xܸq˜={ö•+W~úé§W_}ÕÛÛ›~–>(,,ìÝ»7ÝR\\ìëëK7>ËFZ÷Ê+?üðÃÙ û "wì˜sòäÒììO/^\¹oßÂO>‰zå•acÆøú: Äj...¡¡¡'NœøÏþÓ4ãä>ÑÑÑLJJš4i’P(tqqÉÎΦŸ¢œœœš¨P(èãÌÌÌ¿- ©ÏíÛ·)в··o9øÃÏøô"""²³³×®]›››{âĉæO1 Bˆ££cNNÝ’••EäååõíÛ÷È‘#gÏžíÎ!ÖÁƒ=<<$ÉÔ©SËÊÊôz}||¼«««­­íôéÓU*!¤ÕÆ6tõêÕ‘#GZ[[óùü€€€}ûöÑíE%''»¹¹mݺuÉ’%R©ÔÙÙyûöí<ïÒ¥K„äää×_Þᬼ¼<==ÝŒÅ\»vmåÊ• .ÔjµM?rϼ¿ÜõÛ·o_tt´¹JéŠ ¾¥åpχÂb18–ÉdÒë­Zúÿþ÷Ö;ï`èÖŠ‹ÕYYeYYʬ¬²¬¬²ìleaa¥Á`$„89I<=m{ôŽÙÛÓÓÎÓÓÖÓÓŽËE@e6þþþÇŽËÎÎÞ´iS``à˜1c-ZD/ ×ä…^˜;wîÆ·lÙB™5kÖêÕ«{öìiiiùúë¯?¾ùÜ”™3g®ZµÊÏÏO*•.Y²¤©}çÎááážžž÷°lÙ²mÛ¶Qµpᨨ¨ÀÀÀ–ƒ?üŒüétºÐÐPŸŒŒŒ>úˆRQQÑ|ϧ3f¬Y³¦wïÞ|>Ÿ¾(Š¢Þ}÷Ýœœœ]»v‰D"µZM‰DL&ó)‹ér°ÃY[C/SYZZºoß>''§îó#O¦üV­mO,±ψVnîÝ»·ãëè¢jjôMãÅ‹×þyãÆm••55*UMi©¦¼¼ª²²N£©¥oÎÒÒÓ ««„B®kè0ô.VyyªÛ·KŠ’ü|ÕÝ»jÎ@qw·¡·°ŠŒìåççàæfãä$ÁÞ“——×úõëW¯^½k×®·ß~ûÔ©SÍŸãÇ?wî\dd$!déÒ¥ÕÕÕ“'O®««=zô† šw^¶l™Z­ž2eŠÑh\¿~ý/¿üB·Ïœ9311±å­ù7ÞxcܸqµµµÏ=÷ÜÆ-,,Zþð3>dðG´uëÖ7ÞxcùòåÁÁÁñññfâĉMâããU*ÕÈ‘#%ÉÚµkOœ8Áf³ÿýwBHó™X©©©!!!OYL—ƒÎÚªZXXX^^Þ?ü€Eà!*³êϼåû‚Íàw\Y|,Å]Õ|æ=ëá‹ãAKߪ«ÊË«**jè?Ç÷²µm}s€.­¤D£P”(¥™™¥ÙÙʬ,eq±šÂd2\]­½¼ìzôzyIéKs× EQIIIS¦Lérƒß'===00P©TÚØØ˜½˜6EÙ¿ÿ#ö§(ª  ÀÅÅ…RWW'!§OŸ'„Ô××óùüôôôàààß~ûí¾ÆÞ½{SE‡{–‡wËËËÛ²eKÓgÉÉÉJ¥ÒÖÖ–¢¨ .„††òùüû  |‚ÎÚ¯úå&“éàÁƒ±±±ÅÅÅí± WÓUìÝ»wÚ´ií4>t€»—ªNÆç2XÔð<íƒ,Ì]ÀSÁbMíN(ä …\Û¿ï Ðu”–jŠ…¢äöí{´Ú:BˆD"ðö–öè!ˆðóò²óö–zzÚbó*x8ooó~üøñqãZYûwùòåkÖ¬yÈ ýýýŸþù+VÔÔÔ¬X±bøðá ±½˜gFff&cÑ;œI¥Òììl:¤¹o‡³ûÛ°†ˆˆˆ°°°µk×öë×Ïd2ñx¼¦§šïpFÐ|‡³ÈÈH>ŸöìYWWWóCÑh4ôD®çž{®¾¾¾]s,x8…ˆ¦ìîuêý¼có}ç:ôّ¼,è²pcþ†Ñhºs§”N­ŠÒÛ·Krr”:Á zô°÷ós õŠäççàáa'óþ~D€¿ÊÌÌ4ûàcÇŽ}²)é{÷î}óÍ7œœL&Sxxø×_ýôÅ<3°ÃY›C0`@llì‚ víÚeggçååõôï <ÛxV¬±_xߨSvá‹¢ÒkÕÃV{lØæ. àI Ç€ûUTÔdd+%·oß¹SzëVIee !ÄÞ^ìãã0dˆÏœ92{??kk¬PÝ]@@½´„ÎÚ¤BÈŽ;^{íµ?þ¸Gû÷ïçr¹OÿÎÀ³"ÿÚø NÆç\þºxÈ»m°ß'@ÇÃþXmïtieeU×®åÓ+*¥99ʪªz&“áí-õósðõµ÷õuðõuðò²c³™æ.Ìæq÷Çj+Ýv‡3sƒý± ó+,,<{ö¬¹«è^\]] dî*àÉÕkô Åá?tÐ%a>@÷¢Ó²²ÊŠ’›7ïÞ¾]rëVq~~…Éd²´ôêåì>cFXïÞN¾¾"VóëŠ;œuªbÚOi©F,æóù3ÖÝÓÙ³g£££Í]E÷2uêÔŽÿ]hCÆôz=›ÍV*•Í÷7 Š¢±ŒV{RE¯Ónt´ÆFý­[ÅôD+…¢äúõ‚ÒR-!Ä‚ۻ·SP눽}}í{öt‹ùæ.:#zožû˜ëãÅtO]q‡³NUL›»s§ôĉG^¹qãîÅ‹+œ‘c€y`M”CÏÉ0—6ȱ˜Lfbb¢H$zú¡à)ÕÕ5fdß¼y÷ÆÂôô»·oWW7Bœ­zötˆŠЫ—SÏžŽ=zH±H <ŠÊÊJúÀÊÊêäÉ“}ûö%„´í‡þï¿ÿ¾xñâ;w»þùç­Îbé°bhZ­ÖÇÇç§Ÿ~zH(ÕÅÄÅÅ%&&ÒÇÏ?ÿü±cÇÚpphÒ©v8ëTÅ4g4š®\É?~<íÈ‘+……L&Ó`0B¸\lí« r,Š¢bccÛdœÎ0©  kQ*«èÔêÆ¢›7ïfg+ #ÇîÕËÑßßyÊ”^½{õÂt+xB‰¤éX(6ØVæÎ;kÖ¬… þøã111%%%|~ë?®P mÍš5eeeïÓÅdffîÛ·oÔ¨Q„6i˜AuuÃÏ?_ÿõ×ô“'oÕÔ4r8ÌÆF=!„±!|>~2º*M~ÕíŃßqžYÐÉ1žà5©©©ƒ Û·o'„PU^^®Óé–,Y"•J·oßÎãñ.]ºd4¼½½-,,ÂÂÂΜ9CBQÔÎ;›èÅyìììÊËËéÆääd77·7ÞxcäÈ‘ÖÖÖ|>? `ß¾}„Ù$>>>88X­V_½zµåËiôððH$S§Nm~¯Êd2%$$xzzZ[[GEE©Tª'x‹ÚICƒþâÅìíÛSþõ¯}'~éç÷nŸ>+§Oߺÿ%6›9mÚ€;æ\¹òAvö§?ý´øÓO§Íž>p B,èúÌmúLߺukËï „k×®­\¹ÒÁÁ¹¼r² IDATaáÂ…Z­6''ÇŒÅB²²²jkkŸ¾†§/&333((ÈÂÂB"‘XXX´aI§Õê¶oO™:u“¿ÿ{‹ïþå—ôššBLtˆÕæct]õj}Ñ…ªϽ­-h0w-ó$9VLLÌСC³³³?ûì³ ”––Òík×®=zôèñãÇýõ×ÄÄD½^OÙ°aÃæÍ›¿ýöÛ;wîŒ5jâĉt{bbbxxxÓ½°uóùXï½÷Þ?þxäÈŸË—/çææ.^¼8..®±±ñAcÒV­ZuìØ±_ýU"‘ÄÄÄ´|9Ýí믿þ÷¿ÿ}úô颢¢Ù³g7½|Ó¦Mß|óÍîÝ»SSSëëë_yå•'x‹ÚJCƒþÊ•ü;Ï-[¶ÿ…¾ð÷_>iÒ†>8|öl¦ƒƒåk¯Ø¹sþåËïŸ:µôË/g,Z4bÔ({{KsW ÝÑC>séÏô–ß!–––L&³´´tûöíNNNžžžf,†²mÛ¶O>ùäékxÊb´Z­R©Œ‹‹ãr¹^^^§OŸnÃ’:Õš¦¼Åt’bš3™L‡_¶¶žüÁ¬\yèâÅlÎh4¶_Ñ ê矯ÿöÛM¹\ñǹׯde•åå©**j4šZ£ûÖtjöA“ìɱͼ•ZcîrèIÖT«Õ/¾ø¢J¥jÚ â»ï¾[±bEÿþý !7n "„lݺõý÷߈ˆ „¬ZµjÉ’%L&“Ò´áƒÖ$\¼xñ!C®_¿. é—Èd²††­Vû 1 !Ÿ~úéÚµkoܸammM¹páBË—ÓQÙºuëè 7oÞÜ¿ÿ¦].¾úê«?ü0,,Œ.ÞÍÍ­¶¶V <Áð”ʪ«Wó¯_/¸~½ðúõ‚ÒR-!ÄÚÚ"8Ø#,Ì;.npP«——v·‚Îæ!Ÿ¹ôgúœ9sZ~Oh–——÷Ã?™>}zvv6‹Õ+BwìgfÆbŒFã믿þý÷ß»¸¸ìرcðàÁò*Š¢ÆŒ ¨«»Õ³g@nn5½^ÂC0Ô‚ß?¼X̧(J"áS%ó J$â1™ ‘ˆÇb1,,¸l6K àp¹,>ŸÍå²y<6ÇærY|>‡Ëe 6›)Þ{ “I‰D|ão €G$°aßæ“ºé²ú̲°È‰Âç,t>Or7dóæÍo¾ùæçŸ9þü¦ÿxyyÑÇ>>>ôAnn®ŸŸ}LQÔ£ïáææFQ«Õ gΜÉÌÌôõýÿìÝwXSç÷ðs #ad {ˆ ˆˆEp¡¢•‚¡W]µŽjiÕVpUë@í·\¸(2Ô:ZÅñs@¬Z ²Â$dýþ¸mJ! Æù<<>—›{ß{„ÜÜsßs¬Þ;fBB‚§§çöíÛÉëRw'YXX ÖÖÖðæÍòÛÜÜÜ€€€€€É–………öE¡TUU÷øqaffáãÇ…þY”›[*‰ÕÔ¨ƒ3>ùd¨­-ÓÖ–ia¡K¡´g-B]¦…÷\ò=]êy‚DNNÎÙ³g§L™òὦÚLmm-9_¼µ/r¶:¬Y³fÇŽ¹¹¹M_·î û™É0˜ŸþùÁƒéééQQQóçÏöìY+w¤Ñ9œg_}eãî>ñÌ™Ô'_¿fS(rB¡¨éÆ**JÏžýH.s¹|Ïåò¹\d™Çp¹|6»Ž\hºAU‡Ë%WòmS[Ë•zP %%y*U‘J•§RÿN€))É“i0Éò?‰±Ön£¡÷®!„ês9Âi9C{€òíÍùo×ÛnJÓêI÷N!„ê ÚóÎäé陟ŸŸ‘‘qîܹѣGKúXèëëçææ’W^¾|I®400ÈÍÍ9r$ù-›ÍVSS“LŸjœœ¸»»;;;‡††:T,S©Ô–ÇŒƒ^°`Á¨Q£¤îNÊÎÎf2™ðüùs‚ %ïÞ½ÛÛÛÄbqUUUç]vAõAb±8+«D2Ý*+«¤ªª¬¬úÛÙ1ýýȬ ˆzœÞsÉ÷t©ç PUUENWšŸïäädiiùìÙ³ü***š¨Tª¶¶öºuë–.]úèÑ#©»“‡X»víÑ£G ‚X²d‰¯¯¯¤–ËìÙ³ƒƒƒ Nß±cGjjê£GÚýú"„”•Õfd¼JO/ ÓW%%U §§nkËüüó‘66L[[&“©)ë0ú -¼ç’¤ž'ÀðáÃ/^©££CÎLjxzЕÁ4*ø6tèPãèèèãã³|ùòŸ~úÉÑÑ‘Á`|x0Ý“¿¿ÿ˜1cÂÃÃi4Ú¥K—fÏžíã㣨¨ÿ´‹'[ˆQ©Ô%K–4ígvàÀÙ#ég–’’bbbòË/¿Hî¸êú`àÙ³güñG@@€ADD„››[û“#ÜܬÜܬBB¼bbR""î”+(Pø|!()uXÆ®9]™“LÃôB½…Ba±X^á¶“†ýpÝ60Ômi[+ψD`„BÝO{òXááá+W®dˆáœ9ÙÚ2mm uuñ#%êUZxÏ%I=O€ãÇ/[¶lÛ¶m±±±JJJÐà<¡‹ƒiTðœí-«`X,ÖâŋÆ~úôirã ¦{Â~f ÔÔÔTTT”––†……|x0zzË—{,[6îþýœÈÈ{/¦óùB*µÓóXÓc˜C}AÍõçî†Ã~¸nêÎ0‰…B¨{"Ö‰‰‰ñóók¸¦Ýž=uêÔ©S§8΄ öíÛGžH©©©­Y³&**J$…„„|õÕWm­+Øîs„B¡Ñ‘'üñLJ„„¼{÷.$$dìØ±}!‰…ê›8œúÇ SRr““s%‰+mmÕ¡C]ìì íì õôÔe&BïÊ•+“&Mjº~ݺuäõ”æ´é<ÁÜÜÜÝ݃iw0= ö3ëð`ÌÌÌx<ðù| ÑhLCêêÔ9s\;vLÔœž2{¬¦†#µ”TÀôêzþþþ¾¾¾çλ{÷®¯¯¯——¹>44´iQÖ}ûö………EDDXXXÉB›†%}ñźºº>>> ¦¦¦…²±$‡yàÀ:¾dÉ‹Õðyy{{/Z´èùóç ˆŽŽž;wî¶mÛÖ¯_?bÄØ»w¯Muuµºúß7ÕEFFnذlܸwïÞ!C†tìëŒz½û{ é¦Të©m˜Ã‡Bu¬ŽÝÑÞÞpà@ЬÃD¨gèVç L·‚ýÌ:<˜µk×fff4ÈÁÁ!**ªC‚A¨50=†é±n%,,쫯¾úé§ŸÆŒ³hÑ¢>úˆ\_PP`ffF.KÊ®æåå 0€\&¢á[̇ K"onÌÙe³ÙÛ·o—”m4~||ü¬Y³üýý£¢¢¬­­› ®®>iÒ¤3gÎÌ;÷Ñ£G¿ÿþû—_~innN>J.4ˆ\óæÍÉQš¡÷ƒœ‘°õU铺VRñÆM„B2€gÒ!ô/.—Ÿ™YШZ ÙæjÙ2''SL\!„P[½wšš———¤(HÊ3JvTRR €'OžA^lî-”Ñë¼`\\\233›(“`TTTΟ?ߦ`êκ&=VUU×B_1LõDžžžùùùçÎ=ztnn.¹^jQVƒÜÜ\rÒ°Ùl555ò‰–DN–•h¡l,0™L''§øøx===MMͦ1øùù…††ªªªúøø¨ªª2™ÌœœòÐ999äÓi8`VVùÔzåÄnÔ¹pZÎШr{S^Å ŽÇN3=YÇ„B¨ÏÁS^„P_WRR•–öêáüGò33 ß½ã)*ÊÛÚ2¼¼ìŒ‡566ÆV!ÔºU 1 !„鱦ÛÐé4*UJUìé1{{{Ÿ5kÖ8::6LI-Ê:oÞ¼7šššZXXDDDlܸ±¸¸XUUUR”U²Ð¦a¥ÖrÙØÁƒ_ºt)''çÀ¶¶¶'N\ºt)Y®PÂËËkþüùû÷ï?tèÌ™3ç‡~°¶¶ÖÐÐX¾|ù”)SÎ'›5kÖæÍ›  ««KFÂz³¨õL=ètSë«A/›óׄ=æ:ƒ: (B!Ôz½áÜ!„Ú„Ë姤ä&'çdf¦§¿*-­¡Päf nêï?ÂÎÎÐÂB—B‘“u˜õR¯Î¤¤¤8::öñ`š ¥¥¥ÚÚÚAtŸÀºR·j!†Á „: ¦ÇºOz,<<|åÊ•‡b0,K’é—Z”uõêÕ</  ¬¬ÌÆÆæÒ¥KªªªÐ («d¡MÃJ ì½ecÀÌÌl÷îÝ?üðCddä×_}ëÖ­†*++O™2åÞ½{cÆŒ€5kÖÔÖÖN:•ÃáL˜0aß¾} 7^»v-›Íž>}ºH$Ú½{÷Õ«WÉõXoµ‰¦9uÚ¯Ö7Cò.Îî¶ÎØrŠ–¬#B!Ô‡ ?3ÇÄÄøùùµïSt_†¯BÝ_EÅ»‡ó>ÌKIÉÍÈ(¨««WUU²·7vt4qp0vp0ÖÒR‘uŒõ¼ÑšaƵrw±Xéë뫤¤ÔCóX¾¾¾+ë@Pç""::zæÌ™²!Ô¹jkyB¡°¦†'Šª«9b±¸ªêß««¹B¡¨¶–+ˆjkyðÝ;^}½€Ãá7Lžq8õõõ‚ººúúza]϶pD‚ ÔÕi ¡¦F¥PäTU© rÊÊJŠŠee%EEyM’S Rå••äUT”äååTU©ä¿ ¡®Nûã?–.Ó!ŸÁŸJ¡È‘3´„B …×®}3x0C–á"„ ´´&%%÷Áƒœääœ'OŠ„B±……®ƒƒqHÈ'Æ™XYõ—“kíÜJ„Pçñ÷÷3fLxx8F»téÒìÙ³}||àûï¿ÿõ×_ããã/^¼xåÊ*•ºdÉ@@îøìÙ³?þø# ÀÀÀ ""ÂÍÍM†ÁHBJMM=vìXËG9pà@ZZZbb¢ŸŸßÂ… •””šÛòþýû_|ñÅÂ… .\¨««ûáO°ïÀ¦h!ÔG¨©Q¡Áì±gÏT?d4›7nt@X]2,B!„Â;ÿåãã`hØï³Ïq8õAã{»„B‘P@¡ŽŽ&˜ÄBHVD"ñŸ&'禤ä&'ç””T««SGŒ0Ÿ2eȦM>66LeeEYLjjìÁƒªªªd«*777W]]MÎLZµjÕÈ‘#?ÿüóØ¿¿¤d_MMMEEEiiiXXX@@@NN·Ï[jw0¤;w._¾ü½Gùâ‹/tuu}||AMMM y,OOÏ;wî:thذacÆŒY¶l™““Ó>ǎǯ¡É 8‚îuê(©ôب)ZGÿMÑ( ‹ÅêÀxB!„B¡>¨{]Œ¹aÃŒ/\øjæÌ06»®¹µb1,X€%¤êR<ž 99'99'99÷Ñ£üÚZ^¿~ª}d±té8''ÓAƒòòXסnÍfoß¾=)));;ÛÊʪáCFFFPPP`ffF®±´´”N$@É-(¾ÅסòÑhc»Ë/-dÓ`S4„B¡î€Ç-Hª¶ ÀÒ!„:^ùmlÀ€þ¿ÿ¾ÊÀ€® @‘º®2iR.a „ڇͮ»x1=$䜧çKË5~~/^Ì06î·uëô{÷‚?þáðá9 ¸ÛÙb ¡îÏÝÝ='''444///>>¾áCd¦G__?77—\óòåKÉ£fff<ø|>Ðh4çÏŸwqqQWWïQ¤–¼kÙóçÏïÞ½[]]íááÑÖ};Eê ø¿ñðò¨Y€Ó‘ûE=x2zzzº‡‡‡––F³±±‰‰‰!×qûöm##£Ã‡éêê2Œððp*•šššJ¡Pèÿ }oS´‹/2™L--­ýû÷KV–••5ݘÍf7ªW‰B¨‡jîO}ëwOMMíÀxz@ð/¬Dg¿Âdœ Þ¸q#F#‚ .—ÛúA:/È.Pö¬.ùç¢ÛóE|±¬cA!Ô á|,)˜LÍË—¿8’™Y þ§À ¼¼\}=ïÞksæŒÔÖþ ’Ü¡¦^½*ð '%%7!!+?¿\Abooäæf4qÈ#]],Í„POÅçóœœ,--Ÿ={öã?@EEYʰeË–AƒÑh´   ø'äíí½cÇŽþüóÏL&"""\]]MMM»8ˆoÔ£ëƒ{ðàÁúúúeË–ýïÿk¡a—²Z æ @Óžìå]ɽ"ë€Ú›¢!„B=H«ÍÛ0à;w^»vÍØØ8%%…<Ùè ,&i©(]ûæåÅYã÷˜)÷köÖ„B¨0%®÷å‚'îÜÉj˜Ê‹aܸû÷ß »9mÚ°¹s]±QB¢i³+*UaøpÓ3œÌŒUTºÇÅ\„Ї9|øðŠ+Ö­[7lذààપ*ooïgÏžI6.//÷ðð '¾ÄÇÇ“_Ö®]›™™9hÐ ‡¨¨(rãY³f±X¬v§ŽÚ $$$|úé§ GûÀ`à?þ¸|ùòîÝ»Û=H;ÕæÂ›x1X.‘ò¨Æà®Ž§Ó`S4„B¨éqµyÌáp¬­­µµµ eUÓ¢2å¨UüÊ—æeMüŸ¹¦UÖ!„ê=°W³h4Å_~Yèë;\r ¶¼<ÅÃcÐÁƒs?Þ²i“OZZÞøñ»&NÜq¯®®^¶Ñ"ÔƒÔ× ²vï¾âçwpàÀï==÷üôÓUXºtÜ•+_gemŽ^äéæf…I,„z ±XìèèØÂ^^^¹¹¹\.7))iÒ¤IW®\!óF’•””ÂÂÂ***rrr¬­­ ‚ ûK©¨¨œ?žÃá$%%5ìeÕBÁÎ ^½z5eÊ”F6 ¦a b±˜Ì—4\háÔ©S###».‰%¨…¢‹º.ZÁ3H_ ì?»èвÃf³ƒƒƒÝÝÝ -ZÔð¡V6E›9sæ{ÒŽ¦hÙÙÙãÇ_¼x1æ±B¨ç:{ö¬‰‰ NŸ1cÆÛ·oApp°¡¡¡¶¶ögŸ}V^^RW6Õg Ϧ¤¤¸¸¸(++›˜˜„‡‡Ã?¥öø|~Ó¿ ­œos5„[FÄéÓ§™L¦ššÚwß}e`` ®®NÎÈ—úSãñx+W®ÔÓÓÓÑÑÙ»woáÊÊÊÈ+H:::d]Á²²2±X¼}ûvSSS---__ß–ééè&TïSTõ.|þüuj¬ÃA!Ô{`«%ŠÜ®]~óæ$ODáܹ#@UU)0ÐåÆÕ¿ý¶ÜÄD{ݺ3V¯Žyñ¢DÖ!#ÔM ¢‡óöï¿1kÖ;»?¿ƒ'O&©¨(yþþûªŒŒÍØì ¡ÞáÊ•+„4ÁÁÁ-ï8xðàÕ«W×ÔÔ‡„„Œ;¶_¿~ÍmlnnîîîÞ³‚éµpc Äõƒ;S¡<Œýa|"Ì(ƒádY§Ã¦h!„:Ï‘#G.\¸˜˜XTT4wîÜ]»v>}:..îîÝ»%%% ,©+›ºÿ¾……ÅÖ­[ß¾}ÛµOâƒ8¢Ò'ïþ:WvwgÁÍuyíÁßßÔ¨Q999{öìY¼xqIÉßWWBCCÉ¿׮]c±X “|d9ßðððU«Vñx<KKË´´´¼¼¼U«VÍž=»¾¾U7GFFfddœýÔYKK¥ë£EH†x½¡.fccsãÆ YGñ·nL{Tf€Š(jJyÈ~G—GÓ-`S4„BÇ‚\°¶¶€²²2sssr ¹PXXXPPÐtå AƒšŽFžÝ°aCLLÌâÅ‹’““»àY´@ADU­×y[ZžÅyûø]Õ+®'9yB$Ã?w ‰„b9BË¢ÙâÏ- ûꫯ~úé§1cÆ,Z´è£>"×·Pø·Q9_6›½}ûö¤¤¤ììì†Å¨ßKUUU2NÃeòèMjoÞ¼‘ŒßšåææHÖ´cž‡-ËöüO@!„¤Â¼ý—9êþêëäܹ“•œœóøq!—Ë76îçæfµtéØ#Ìuu1w…B_ Å×àõxsêŠÀù8˜Í“uL]ç½ï¼¼¼¼¼¼$ßNš4©ÑŽdS´°°0xòäI£¦hM”Ú­érÓÒÔ©SÉ{½BõÙÙÙL&ž?N„®®nNNŽ««+ää䀓Élº²…1%…gýüüºâ94¯ôIÓëY*õÚIÛ ä(„Høï;šHÐäýW¦í™aìé陟ŸŸ‘‘qîܹѣGKŠý’…É×­QáßF÷»»»;;;‡††:T,S©Ôv„шԟ“ÉÌÊÊ"§Rµf^¾ÁîÝ»½½½@,WUUÑéô¶‚Bõq˜Çêx––z?ü0uõêIçÏ? ¿ãí½×ÎÎ00Ðeúôa4𢬣C¨c4Ì]ýùg‡Soh¨5jÔ€ ÜœLõô4d Bõ µ¹ð*Þ\Ò$‹AÇ,—‚'hÚË:2Ù¸råŠ$GÕкuë¶lÙÒÂŽƒþøãCBBÞ½{׫š¢!„ê|k×®=zô(AK–,ñõõµµµýᇬ­­544–/_>eÊ:>gΜ¦+›Õ Ïê V¾Ë 7¨¶s«´¼±H(Ö4mOÉÞÞÞÇÇgÍš5ŽŽŽ ³P-þmä½5„ÛAêOmÖ¬Y›7o0`€®®.RËfÏžÌ`0ètúŽ;RSS=zÔÖAB¡>óXEMèàœ˜ø""âÞ÷ßÇmÙrÑ×wøÂ…îFF}«#ê5ÈÜUrrNrrnjj‡SÏ`hŽcèâädflŒÿ±B¨ËU¤@ÎI`zÃàu ã ”¾^¿›¢!„êz+V¬˜4iR]]ÝäÉ“÷ï߯¢¢R[[;uêT‡3a„}ûöÀš5kš®lª{žƒ¸H=cOÔº¬ åÉû^óë¢æóYׂrÔ˜JšfTM3šSQÓ”F7¥ïk ¾råÊC‡1 ‹%¹›¤…¿¼·†p;Hý©­]»–ÍfOŸ>]$íÞ½ûêÕ«-òÝwßq8œ©S§²ÙlWW×3gδc^ƒSÁ§iIÿ "„B- Ú÷QµUIIUDĽ“'“*+ß¹ºZºLžlG¡¼ïT!Yãó…÷ï¿l˜»êß_cäHK''377+Ì]!„Œ‰…@ÈH¿1¹cùúú@lll ÉAÑÑÑ3gΔu !Ô¬˜˜???¼šÑežðëDOcJ}#ˆšf³hröóûWæpÙ¹\vWÀ€’ºüG«™“´>0Œ'OžØÚÚ–––¶0gug9×*¶¾jf0» „jœÕEôô4‚‚<—/÷ˆÿ3"âÞâŧLL´œ?ûÌYSSEÖÑ!ô sWæÕÕÕkjªŒi¹i“æ®B¨K ¹ðö6]‚ŠT˜pWJ¾Š È",„BõQ ÊrCæê ðé—ùKIfÄ[‚øO—,Msšý¼þ#†Úâzv·2‡«e)}ÊxARµ€+Ò4£ª*ÉÉK¹/§M…›Óî²Ã]©GùLÆÒ_§ÔüñeöGß2ÍÔ‘u8!„zÌcu)EEy//{//ûÌÌ‚ˆˆ{{ö\ݵ늗—ýâÅ£fÈ::Ô×T$$dݹ“•”ô¢¼¼–FStt4Y±b¼««Å!Fòò8}!„ºJ]¼¾ ¯‡â xšCé BP: c9B¡ÞG (((”––6êDDÓ•­|ô½‚HIIqttlßî¨G£ÒåV0xk§ì+ʽÅ&ä@,‚Bü'_E€ª¾¢ª¾"ÓE½¹qžŸ/˽Á9yB©D7£Ò©šfT¦«:UCÚXø·9í.;Ü•zDHŽBŒüÎHIC>ig§R0l‘~—Ô@!Ô`K6ìì wî4 þ$&&ùر;qq©vv†.3f8R©X)uªªº¤¤l2}•›[ª @qp0ž;wäÈ‘–Æ x›?Bu¹„iPpä”@o4 Ý /P6”uL!„º5 …Âb±ÔÔ°TêRÆJ»ÌÞ<¬¹ÿSQù_ub‘XÃD©M#xì4 ÄïJê+^rÙ9Üê"Þ›´Ú?O¿õ>9€ÌcÙØØÜ¸q£sÂG²@Àð¥j Ť êÞòG®3$ä0—…Bèý0%KêêÔ Ü?ÿÜ-)éEDĽヒ ½}zêÔ©S§Nq8œ &ìÛ·lD TSS[³fMTT”H$ yïáΞ=ûã?²Ùl°°0--­76\ 4]Ùt(6›­ªª*/ß9êŠàÍex}††‚ªY§}L=èÆ£5D¨Œ'§Ðìe‹IZì/ÿvU]”åè&Ô)áV˜ éY †«yî³È8U "Y‡‚B¨'Àû÷¿Vý;aU>¯ê·¶¸^jK$ç^cÓM•4Œ©òTÌru;zCT&ì1—u!„z¢×·‘ì¹23 ""îÅÅ¥R(rS§:Ì›7rà@Y…z€ââªëן&$d=xðòíÛuuê¨QÖäœ?cc)7N"„ê\b¼Mø;}Uû¨ýé /èïÚûwG!Ô«q8œÈÈÈÐéô%K–L:UAáß–ÉÕÕÕzzzééé 5jÔܹs·mÛ<{ölxòä‰MUU•ºº:9ËÉÉ)88øóÏ?€ÌÌÌ!C†”––jkkK=4A7oÞ=z4V“›[úë¯"#ïÕÔpÇŽ¸`ûÈ‘–ѹ¨Q·R]ÍML̺uë¯[·þ*,¬ÔÒR9ÒŠœzeh¨%ëèB¨¯bÿ gÀÈ4É:„B=LNN΢££'Nœ¸téR‡†ÖÕÕéêê:thìØ±[¶lùå—_"##544–,Y¢¬¬|ñâE çc………?~<22RWWwÙ²eW¯^%çcEDD¸ººššš6™ ˆ#F=z” ˆ… ÙÚÚ6¼…#6œÅãñbcc—í*à‰øbPÑS°ž¦í°oHê"Ü*AEÇ`8öóF!ô˜Çê‘x<Á… ¾õôékssÝ9s\?ýt„ŠŠ´ ¨Wàó…÷s'ëÚµ'YYÅŠŠò£F ?~0¶¼B!«H…Wg à,Ôd2†’~S9B!ô>uuu‘‘‘‘‘‘·nÝjô¿¿ÿ½{÷òòò‚àóù!!!g„ ûöí#Ë’y,uuõµk×þúë¯"‘ˆìtE求`±X ‡%"22rõêÕuuu“'OÞ¿¿ŠŠJÓÁ[8bÃ<Ö¹sçâââ–/_îìì,åé‰Eð×nx}JA,mç¿»^i Àû2Q·#Šk y•9\v—nB5#¥NE6ç] ŸnBUÕW$°–Éd•¤ìíbd5¯u „úæ±z¶ÌÌ‚ðð;çÏ?¢R¼½‡~þ¹›µ5Þ%Ô{TÄÇÿyíÚ“‡óêêê--õ&L°qw·rt4¡ÑeBõaÕÏ!û0œ…wù j †ÓÁpôx !„P·DD\\ÜôéÓeÄÿy€²!L‚þãAQJE„z–”¯Ó€ý\×aÉ„B˜Çê…rrJ£¢DDÜ««ãyzÚº¸¹YÉ:($›]wíÚ“ëן޿ÿ²´´F]6jÔA£FYëêbSS„’)n1^€×—Á5 (TYGƒBu?b”Þ…7Wàõe¨ÌyeГ€áʆ²¡nç¯ßÊÞ¤Ô²ó¸ì<®€+*]žnJù½‘¦žmJñ2¾òÖú<ëiÚ®kðO Bõu˜Çêµjky¿ý–vâD³goll³g»N›6LY›*ÉÞ_½ù¿ÿ{vóæ³ää\>_hn®;vìÀ1c¬Í©T,¢B2U› qPð”ß ô=aØ^PfÈ:,„B¨û)8 3@Ý &Á$Ðu9%YÇ„PO †š7õìº`»•UYÕçp¹ü¤¤ׯ?½qãiaa¥ŠŠ’››ÕèÑÖcÆXjÉ::„BùQð×OPžJý€áLП€í=B¡f ê€[ª¦²Ž¡ÞéÔèŒú¡œ<¡n¨¤iF¥›PéfTº µŸë»™-„B}æ±úŠ’’길”ãÇKJª\]-]&M²“—ÇÃm“ý6!áù¼yn­Ü>3³€ìz•––/‰mm™ãÇ?~° SÏ;B¨[yqÊ“ÁØú{ „BUOáõe(M·8 (²Ž¡¾E$¿+©¯xÉeçp+s8•9\vW$ÏK²—£àõ„B} æ±ú>_xåÊ㈈{ Yýûk8ϛ禥¥"ë¸z†èèäµkcÕÔh›¢Ù³ÆúzÁíÛϯ]{’•Ÿ_®®N5ÊÚÃcИ1µµU»2`„B!„jA-ßø»ëÕ»| ê‚þDö3(jÊ:2„ú:_\ó¦^ÃHJÏúZáÕ¯sè¦JtSª¦)•nBUÑþ!„zÌcõQÙÙoOJŠŠº/ˆ&N´Y°À}øp,Ѭšî7ßD_º”Aþ¾ÄÇÙÚ2móæ û÷ß3¯]{’ššÇáÔÛÙº¹Y?ÈÁÁç½!„P·PW¯â ú98’u(!„P·”²^ž±ú9ýÝõJÓü8ƒPwWWÎO {ÍÎá²ó¸¼j!((Sè¦JúCÕF¬bÀ½{÷öìÙ#ë0Qgqqqùúë¯eBu"Ìcõi55Üóç;vçùób;;ÃÀ@—éÓ‡ÑhxÏÎÜ¿ÿrÑ¢SUUu|¾å—.ûí·“@$§¦æ^»öôÚµ'YYÅJJòîîÆìînedÔOÖ#„€ÒW¯b¡ì>(jÓFÅÊ!„¯b@,„þ@ ?Î ÔSÕ•óÙ9\v>·ò%WQ™2|¹ÄÄÄøùù͘1CÖÑ¡Žwÿþ}ggçØØXY‚BóXÄbqb⋈ˆ{—/g*++ùú_¸ÐÓ0Àç wî¼|ðàÿ€Hôïoй¹îŠׯ?MJzQQñŽÁÐôô´0aððá¦Tª‚ìâE!ô_Ù‡!ç(»ŠÀøŒ|A<ÈI©Ä‚Bõb!”Ý‚íd B¨ëy,¼Ø+ùúúæ±B½ÞŒŒ€ 77+77«’’ªˆˆ{'O&8‘àêjè2y²…ÒG‹H¼zU¾xñ©?ÿ,j˜Á"½|ùvÕª(;;ÃyóFŽ7ÈÎÎPN›¬"„P÷S™jæ0ø;L_!„êë¸%ðú2¼¹o®B}%˜ÍÅ<B!„ê)0…þ¥§§ä¹bÅø+WGDÜ[¼ø”‰‰v@€ógŸ9kjªÈ:º.uᣠ Ó<žP(5}”B‘[½zòòåãº>0„Bm0ü ¬#@!„dŠWýo.CÅ#§îh°Û “@Õ\Ö‘!„B!ÔZ˜ÇB)(P¼¼ì½¼ì?.d±îîÙs54ôÊ'ŸØ/Z4ÚÆ†!ëè:‡Sÿí·1gÏ>$ˆf«nŠÅâ„„ç˜ÇB!Ùã•B~ ˆ…0`…¬CA!„º9(ü ú{ÀA×(4Y„B!„P›a 5ËÖ–¹sçÌo¾™yź{æÌCWW˹s]'L°‘—ïÅóòÊæÏ?ž•U-”‰Ä¼¬««WVVìÂèBýCP …ç!ïWxs(Š`6_Ö!„B2%¨ ˆ&ÓÔáã?eB!„BóX½AtTß&BIÉðúuÛ;w½}{\,vаÝf­¡1– þNM‰Å"øgRDƒ…|¾¨_¿Á\nö?c¯T„êbxýäý …çAÈýñàr˜> ¯*ëÀB}]Çu£î®;ù‹¡" Š.BÑ%¨L‡q7A×MÖ!!„B!Ôñ0Õû­\¹ÒÅÅ¥£F{÷ޝ¢âÑQ£uèÍ›:O$Š9A}½H q8>_Äç‹9@ ª¯‘q¹BO4a“'Þ»wïÿûŸ¬ÃG¡>‚€Œ`PfÂð0`zƒ‚†¬ãA¡uìY7ꆺ˙¿à”܄חáÍe¨Í%mПÖ«€n+ëÈB½AuuõæÍ›£££ß¾}«««;a„͛73 "%%ÅÑѱ}#7¼çC]]ÝÖÖvË–-£GnaûÒÒRmmíö®5‘P( ‹€€€? B¡„y¬ÞÏÅÅeæÌ™²Ž¢7ëŸfB¨Ÿò*²¢ºwï^AA¬£@]á£>b2™²Ž¢çÁ³î¾ [œùÿ¹ží­á`: &–£”r‚!Ô."‘hòäÉAÄÅÅ™™™½~ýúÈ‘#}ôQVV–’’Ò‡óæM{{{¨¬¬ ›>}ú«W¯TTdpzOFRSSsñâÅùó竨¨øøøt}!„Z óX!„êfê+€Wj–RÂ$–ììÙ³'..NÖQ ®ù„º/ë•00”:~‚B5‘H´}ûvsssgg礤$ÉAËÊÊ-·ü"´ÿÅ‹™L¦––ÖþýûáŸÊ‡:::’C „P‡y,„BÉ”¨^ÅÂm/ˆÓ‚»³@NÜâ`d¬¬ÃB!„ÚETßž½¸o!—IŸÁY=¸êÙG@X×Ñ‘!Ô³ ‚†™ƒADjjjs®^½ZYY¹¢¢âÃÔã=cÆ ‹åêê ’…F  ¨¨HêSÛ·o_XX؉'^¼x1~üxooo@ÐÂëÓ‹ÐBüHKK _µjÇ#o-ÂùX!$uB!$;"\°„ºè7†lc? éË:&„B¨½^Cõš IDAT‡ÜSàq» »ˆEpÝÊî!:®0ðПšöD§E‰PD¡PX,–ššZghß¾}·oßÖÒÒêìuC555ýúõ“|KÎ €ÊÊJ² ?~|ýúõ#FŒ€½{÷ÚØØTWW«««@PPP¿~ý¦N «W¯–,WTT˜™™@JJŠ££#y µk×Κ5ëÕ«W¢Æ:pª~' Ûr€qjˆBè_& f%ë B¨«õô³îF[6ÕÊ}{‰‚spÁÞ\“ƒ×—o ¨ƒ×—¡æ…ôݬ†È«vnõ4)))...ÊÊÊ&&&áááðÏç}>Ÿ¤««Ë`0ÂÃéT*ù§i“¡÷6^jªa_¢A‘ݘ>Ü4©=zJ»£O>ù$,,L(’ßÒéô‡6Ú†ÉdJê’ í8YOUUÕÝÝ='''444///>>¾á6±±±<{öìíÛ·ÉýöÛodGO‘HTYYieõ÷çIhæÌ™qqqÑÑÑþþþ-'œ$¢££‡ª©©)õ©äææJ6f³Ù’ׇ¬þ'ÉE½W ñ·2T„ê³0…뤩ú]V Ûzò¤èéÓײŽ!„ºœXo®ÂÝøóY‡‚BÝHo:ë®üܼy“\:thWÆ 3ü¸ Ó@P ">€þÍcÕ¼€ç{áæ$8£ ·&CáyFŠPãïï?jÔ¨œœœ={ö,^¼¸¤¤„\zñâÅ+W®\»vÅb5lVÔ¨ÉPË—¤jØ—¨…FPd7¦Â¦‘HíÔSÚ…„„¼yófÊ”)©©©oÞ¼9{öì¦M›m3gΜ~ø!%%%++kùòåS¦L‘”|¯ÚÚZ6›Íf³‹ŠŠÖ®]kooÏd2ù|¾“““¥¥å³gÏfÏž ’ædT*ÕÄÄdݺuK—.åóù³gÏNMMÍÎÎ^´hј1cšÂÛÛ;55õôéÓŸ}ö¹&""‚LDI$‘Š%âðáÃ+V¬X·nݰaƒƒ«ªª¼½½Ÿ={&Ùë›o¾a±X?ýôÓwß}Çáp¦NÊf³]]]Ïœ9ÓôêêêãÇùòå!CÈ5³fÍb±X¦¦¦’I$rrr–––'Nœðòòjî©­^½šÇ㔕•ÙØØ\ºt‰¬¸wïÞo¿ývíÚµ?ÿüó¡C‡Zóô[¿„»»»]QQQßlÕ†B‰Q¯ÑÑÑ-o“œœìììL£ÑŒ=*þç.¡úúú¯¿þZGGÇÀÀàèÑ£JJJ)))B¡pÛ¶mfffÊÊÊ#FŒHLL”ˆÅb5\hÓ°ä£.\`0šššûöí‹Å=7nœ¦¦&•J0¼ÀóŸáÑj±ô IT…ÀvcçE‚P_`ooïãã³fÍGGG±XL¥RÉõ[¶l4hF ‚&é+‰†—~üñG¨¨¨hýû,Ù-ÉÚÚZCCCj#(©‘= Nß±cGjjê£GÈí+++ñ]¾S]¾|yîܹëׯ766–u,!„:ÎA¶}ûvccã¹sç>}úT’k)((A¶´´$òòò @.A§Ó›;_lÓ°$ƒÿÜÖl6;88ØÝÝÝÀÀ`Ñ¢E­F䂵µ5<{öLê8"|õêU@@y 6ƒÁ …………-èåË·¿ý–§«;Μðß~{TSÃ…&髆._ÎܺõÒÖ­—¶oÿýÀä×Ñ£·#"î‘_gΤ^¼˜N~ݺõWBBù•™Y@~=}ú:?¿œü*)©ªªª#¿øüæ?E#„P'‹ ¾BúC˜ÄêÃRRR\\\”••MLLÂÃÀ ˆ²²2>Ÿ¤««Ë`0ÂÃéTjjjªH$Ú¾}»¹¹¹ŠŠŠ³³sRR9A Ú4,ùèÅ‹™L¦––Öþýû ==ÝÃÃCKK‹F£ÙØØÄÄÄ4 ›B¡ÐÿºaÃ)S(JKK?äÅ!âöíÛFFFÇŽÛ¾}»©©©–––¯¯oyy9üs NGG§¬¬Lò%;JV’#?~¼ésDÝ\=ëŽ766ÎÌÌŒŠŠºyóæÌ™3¥þv´‰‘‘äææ¶õô»ÑRŸNçQ‚šßV<\ ¢zñß³5;£ÙwI„P넇‡_¿~ÝÔÔtÍš5,«_¿~äúààà±cÇzxx|üñÇ .€æþ.>|xÿþý_~ùåܹs'NœèííÝúÖ¬Y3mÚ´©S§º¸¸èêêž8q¢ÑR#ùî»ï¦L™2uêÔ¡C‡Hz ‘íŽ**ð/C'š>}zMMÍÚµkeB¡†ó±ÐßSõ322Î;7zôhɤxr‚5“ )~)À Æ‚äHkAÂà¿}ò0`d (¿³»"6é¥&L˜ðàÁÕ=øë.zqqqqqq——GäÂU*·ýüü”× 0eÊ”Fó4Ky”J¥FGGGGG·4€N§7„J¥îܹsçÎuíÚµ6ÿßX]ˆ8»B×Õ5°ŽÿÚFº3 Ã’’’fÏîh9‹¼¼<''§ªªªvÜåÔõÓv¥äää   ¦?Gwï–¦¥e§¥ýYW'¢PHÄb©„„%& ÕD˜½ŸX,‰$ J‰ì—²Hc]˜XÙÆå qÇqP&ÈTœr±šD" %аd­a‰D|¾X&S€ÊµÚZ!ขǽm´ÚÚ ‰D£5d¼Øl™LR&À8&‰„)K8r8L Ô¥•_I2"Ç©ü’È®1Tƒ‚a‡ÓÌŸ4ÒN·ƒ–Ø|,Ó7Fz£ÀÀ@HIIi}—Ëe0D‰³˜˜˜’’33³ªª*­[·ë«òòò³²²‚ƒƒ7oÞB<¶•Êio5­››†aÄÅú\]]===×®]«¬œFTðSyìØ±ÄÄÄŒŒ â¤yyy6lxüøñ²eË>üðÃÖË©©ÎóÆ1l¶œšj]A Ã*++ ÊÊÊÌÍÍ›FÛô9ª¥u¼º®ûtÕÝ­`–šš:kÖ,õNÛÒ•?‚ H;Hêäü*© Z*Pþ¿Jjê©=xf3¿ÍŸfrŸ\©Õ2 1û7,±bP™ý($r[+Ž w°^¬Wé‚ =Z…´H-Kõ;iZµTèT..–..–[¶ø_ºôðÇoÿö[¾\®@kq:N!Ê êèh&™LÁç‹@e‘™²£P(•Hd Rþ±¾^$—ãÊÅd<žH¡À•Y4bEZ]¨²’ ™³g#òg"‘„È´µ“I£Ñ(ʪŒÄ—Ê•d,Vã/©T ™¬ü’N¥’)Ñ_ÍfP($2™D,>Sfà´´þMÈ©óeEº•wâ5Ò3ôÐÊi„ŒŒŒ±cÇ*¿DåԮѯºÛM³—ë¶¶¶DÁRAÍ’‰F3"å§UgîxJl“¨SŸÊ6¢2õ©djóOYŒÑ±£¡¿uA¤@y,¤EjYªßIÓª¥@ RÉS¦8M™âTSÃ?}ú®‘ºîìµ(±J#ˆžg"‘T$’©~IäºD"âп_6;˜hÃVQÁkep]°¹ÞoÍ Ó) Á 0Te‰EbÝñ±Mz«a ÈY"—ƒ  GB:¢GWN»~ýú|Ð訜ÒÙºóUw»iör½°°PS§F¤o¼”VÜçó+%ür)¿ZÂ/—ò+%ü*©õÝñÛ›ù¥l1FÇ÷€­–!ÙÂÔoþÒ¥3´t»OO1uÀâ¼Ì§‚¿5È¿h4S FÅq9€ÇqÇŀ㠗(^o7ôDàñ®áx[oKm£€€õNˆ ÒÝ º‚½ª ÓÙÐÚ|¤O©¯Ëår©TÁç‹¡aa™BÙÀ¬®N$—+‰T*'`Äê4…¢¡M‘*SF$É k‰„ik3@G‡‰a ­ËˆNft:…ɤËÅš cP(¤¦Ã”Õ9‰„Ã:ó%ìÆêK è” ¦=Ôt4Hw¤ÆŠ%¨rZçéx95tõØ>èuë Е?‚ôY‚—RA•”_)%Ó03ONÓÏnð.­/fPYý©Z†Tf?ª–!•ÕªkÃè?¸[´».++»y󦦣èi>[pnsJÍ©NÓ±üÇ“'õGŽäóù-¦¦0¬!ƒˆã¸¥¥öêÕŽjÁÜÜ|äÈ‘jŸA¤û@·´#‚ mE”€þýÙw.Wuuâ×é.™X,‰¤R©œÏ+øë¬1L$—ãªÃD"éË—õ8Ž­Ëˆ–f¯‡5”vlQz‘N'¿Nw10 ^§»˜$¦£Ã$òdDF …¬¥E'ZšËȈ„Q•‘ͦS($mm&‰Ô]o~¬ø ¾çç€ÞlÁÀ¥šézeå´f¡rj‚ ÒÓqKEw¿+¯/—ð«$‚*©\ÒÀ6}G»Ù<–ùh·7†wmŒoÇÌ̬§ßl+ðŠüÃÕPáYí,à-XŸ—W&—7s¯Žq†aŸ~:möl.A¤ÇCy,A¤{!*4v^F±X&IˆUe8ŽóxBx݇¬¾^,“ɉ–fÄZ1©TÎçKT‡)xiéK"O&“Éù|1±žLÙá¬*i0’¶6ƒh Íý˜P©d__'--tã ‚ H{ <‚¨'zþüUYYÍÓ§/ËÊjž=«yò¤êùó.W¸oߜٳÝ5 ‚ ëuImr¹…çñDD1©T!ˆÅb™P(!2^Dš\ H$r>_$“)x<Žã\®°¼œÇã årE}½H&SÔ׋¥RÑÒ @@àÀµFgäp4EK‹N¬ÓÖfOJ[›A§SX,º–F£p8D’Œ¢£Ã¤Ñ(,(±Èá0 ‘/DA©©©!6ôôô®\¹2|øpÐÖÖVïY íììÞ˜ê‚`ž={öá‡Þ¾}ÛÚÚ:66vìØ± æòåËkÖ¬yüø±¥¥åÞ½{›­ÚÉä„„µ×uOOÏ5kÖh:оëÖ­[ûöíkeÀóÛuw¼(¿WOe:5%—àÏoóê+$‚*)¿\ʯ”ð«¤õå*“4ï¢sÓñZ†Ô±á–,Cª±¬Š‰–U!bñb/këþK—•Hdr¹BõT*¿pá¯O>I t3ÆÝ5ˆ òVÐL½ß­[·4B'ª¯—>}Z?h.…¢+©TqñâmcàáÃWËÊj +ž={õâWY[ŒB!á8¨^»¸ºZv}œ‚ôtÄ:N==­v>^.2³Ñ>¢¾"±Þ‹h0V_/–Ëuu"¹\Áã ‰ÄX}½X"‘ÕÕ‰ˆUbee5¯÷‹$Y]˜H¡µtf‡I§7ä·èt ›Ýãpò^l6F£hk3ˆ¦bÊ|›Í Ñ(ÚÚt¢]Y;Ÿ8‚ H·¤«««Üf³Ùª_ªKiié† ºI0«W¯¦Ñhyyyqqqï¿ÿ~II ›Ýü’è.fÑ¢E , =qâDpppyy9“ÙøWd_€aؼyó4E{ô‚?=]³y,\¥×jÿ<üâÕc!FŠRœÊ"·ï,’z9¿Bʯ”ˆjdßÓonž±¦ˆ¦EÖ2¢jÒØÆ4£ál-Cª–aóe·É4’Ý´fçA5›0aèùóŸÎ›÷]UU½Löo{f}}­… Ǥ¥e§¦fbè1s¦‹‘Q3íÖA¦ÐC½ß¾}ûZ¿aª§ÓÕ}Á°‹KE¢B±¸D¡wáÉ1ËYGÇçË/Ï`ÖtÙ¸LöŸ»oØlºA†‡ HŸWýäm‡Š+0£èýTõÕ¸hLY±¶VHlkÅjkÄ—+ ê(r¹¯¡Ê"QPñõbq‹)1eíDV³…uu6ˆ=¯û5Œg0(ºº£/¢' IDATZh‰XWêVõÁP0HuÿþýÏ>ûìîÝ»B¡ÐÖÖvÓ¦MÄ'ø†]½z5$$$<<üÑ£G T*õË/¿\¹reff¦›››••U÷ æÚµk ááá»víÊËË{çw4LNN›Í&“É¡¡¡aaa%%%C‡Uë£9UUUÿþ‰1mÚ´áÇGEE@ee¥©©éÇ=zôèQ¡P8iÒ¤o¾ù¦_¿~𺄠¶¶ö† Nž<©P("##M^[[Ëf³)ôÛi‘L¬øû§êœ£Âjà8à¯ÿæWHu­ÛœÇÂáÚÖR~…„_)åWH¤‚†Y(t’õD]2­ñò)2ôaæpÔ­ª·zY ø}ÛÓ ÑÖ³Y…oÈ“‹×-\øý½{¥ÄÍT*yÎÏÏ>óýì3ß‚‚òÔÔ츸ËQQg]]­Ýýý]ØìùLAº ºíå4Øf¼ËÔÔðÇŽÝùê•ŲÃ0ÌÝÝzúô¾¾Ž¨ïÓÙVq¹‚Ý»3þïÿ®S(¤F‰+UîîÖhå8‚ ]‡òK¿^dÛœ·™ÑÙ§TVS42jÿÛ/—+‹åB¡¤¾^$Ëø|±@ ‹e<^C®«®N$‘ÈêëÅD"‘q¹B¢ñ±€ŒÏ—b©TÞÒü::,:ÌdÒØlNN¤1™46›ÎfÓ™L‹E#Š%2™4&‹Ec0¨l6Cy´ÝO­B•Ó4 ªœÖk{{{ÇÇÇ3™ÌóçÏÏŸ?ßßߟF£À_|qâĉŒŒŒsçÎ¥§§3ŒÐÐP™¬ánâ¯õ^y¶;˜¢¢"bV~~>‰D266Ö`0:::PQQ‘œœlbbbmmÝñ`4%33óàÁƒ999ùùùÊAAA;wî$òX©©©£GNKKûñÇSSSõôôBCC/^|êÔ)åø¨¨¨S§N¥¥¥.]º´Ñ)þøãåË—/Y²dÉ’%†††]ó¼žBR'p¢2ïÇJ _Ž7wñů”² ©Ä²*A¥´¾B¯” *¥ãwZ5³N ¹X¡eD3rfkRY†TöË€ÊÐiñc+”Äê­žÝà^ÞXbèÄfèõà-õõµ’’–ú鉟ÎÅq\*•¿ÿ¾+qÈÞ~@xø´õë§\½úwjjvxxZdäO“&9¸y{¡PÐ76‚ H3zð¯!èéiÅÅ…|ðÁa…Àoß.þóÏ'_|‘jeÕêÔa>>C;;{¤£ÃŠŠš9}ú°Ï>K..®T(šÏR(d}}vM ¿ý•ÁAÞHƇ¢x(øê‹Át*øüc4Ó[ *(vŽã<žXûUW'‹e˜ÏK$2ODäÃx<‘D"ãóÅ|¾X(”¾|Y__/ ¥B¡¤¶V(IZZÆá0˜L“Iãp˜L&•ɤik3´´èL&•Å¢G‰UbÄ0mmº–ɤiiÑ´µ™$Rº›UNC•ÓŽ»}û6±xÆŽ+‹y<^ÿþý`Íš5cÆŒùè£"##]\\ààÁƒÎÎÍt…Ñx0DêèÑ£GsæÌY·n………ƒ!xzz–––;v¬'þh…ÂÄÄÄØØX]]ÝÐÐЄ„Õ£3fÌXºtiAA½½}RRÒÂ… wîܹiÓ&b Üy<‡ÓPÉ*11qóæÍcÆŒ!Ž6Lu6__ßßÿýСC®®®ÞÞÞ+W®ôððèª'Št_‚jiÎÿUü}ºZ!ÅòæÿþÅ0ìʦ'Âj)ñ%…NÒ2¢² ¨ì4¹§6wÅ7~GÎ+#êòçáw¼p˜m0ò33¬‡_93™´Ã‡ìÙ“±gÏ{ûƒÿç6*•ìããàããÀå ÎËIIÉZ° ~À©S‡Í™óÎ!&š A¤{By,¤7ðò² òHMÍ–ÉäÄ}.ðäIõáÃWcc/hOžìèããð©Ôv–ç~#›Ë—×=zcÇŽó2™Bµ2A*•Ÿ:õgZZ¶‹‹¥‹‹•««å!&è^AÔéi ÜÛ–A06ôFh:ÍÀ0LG‡ÕÁ’‰ ^W'äó%"‘´¾^Dt %<žHwñx"@"Jø|qy9W$’ ÄQ‰P(åñ„ÍNK£Q˜Lš®.“Å¢mÃtt˜Ä²0--:‡Ã`³Ä—ÚÚ "CFtãp˜½xE/ªœ¦ö`z_å´>«¶¶6::úÆ………ƒ R=Ddƒž={fccCì±³³ëžÁðx¼èèè„„„èèè¹sçj6BqqñO?ý4oÞ¼iÓ¦uF.¹óddd„„„ŸIšž§)-.€À¨`ê¡m;YmDcPºèÓ'ä rüÆÎggªG†™9~ÐK€bækg7 ®®ù¿@G‡5oÞÈyóF>~\qö콤¤;ßÿ»³³y@€Ûûï»êë£;¡AP é56ož~éRÞ«W…âßÊ~D2©ªª.)éÎñã·ôõYaa¾~ØbŸ¢RÉ‹{Mšäðùç©W®üM"‘TƒÁ0,7w[YÙ«;wJrsŸýï™_|‘J¡ll Í<_` Ðt=‰D$ÃÚ¿>ŒÈrÕ×K¾$„(H$ȈÄΪ*ž@ áóÒ`¤®NÔtB"×ÅbÑttXZZ Û“ÍnXòÅá0µµÄ0"õÅbщ‘x%ºªœ¦ö`zSå´>ÎËËËÓÓs÷îÝ#FŒÀqœÁø·H,‰Dccã’’’Ñ£G@QQQ7 ¦´´ÔÛÛ›ÉdÞ¼yÓÜÜ\³Á—Ë%²¼ï½÷žH$zñâEÏÊc™™™yxxdddXYYééé5´{÷n6›íïïÏf³ÍÌÌŠ‹‹‰—¢¸¸LLLT'|ô豫°°°¥óܼy“Çã©ÿY!=„ J*¼ÜT¿é2±#ad*È¥-62À@c“-ÆtQµ¤§“ ä—Ö—”ß«Ÿø••wOz[n‹éÓ‡·e˜QX˜ïš5“oÜxœ’’ýsTÔ¹qãìÜ|}:ï¶lAå±^BG‡µoßœ#Í•J冉Ųñã;ýfd ‹~‰‰Ë.^Ì[¿>¥ººŽhé VVýôõµôõµœþ€úô埖޽[zï^é™3÷¤R¹±±®‹‹åˆ..–ÎÎæ¨ ‚ oDGI¬n‚Å¢±X´~ýš¯,÷Fuu ë½xÿüó’’’ÄÄDmmíÚÚZÐÖÖ&“É ÜÝÝçÍ›·lÙ²ÄÄDbÍVƒi‡êÛÀ/Kõ§|Ο?_\\ëää4yòä+VoJ~~~‹-:xðà¡C‡`Á‚Û¶m_œ—÷<7·,+«$:úçÊÊ:*•HuíB³üüüüüü”_N™2¥Ñétz\\\\\äååafjjÚÊü­,Îë¤`***Zš°ëƒ€1cÆÜ¿ÿ­‚y3Ás(ýŠ~ÞCÀÈ€·Ú5H}X,Ö’%K–,YÒôÐ?þ¨Ü¦R©ÑÑÑÑѯ”¯Õž={öìÙCl‡„„¨Ž™9sæÌ™=þÇðyóæõ”i;®‹cèQ¬ÞÕµzWd"EU¿ü¿ün]E_ô ­ÇBÞJbµÄÔToÅŠ ¡¡ã³³KRS³÷ï¿ý˨QܦMÆd¢B>‚ô õy‚h‹E‹ Q(þów/…B²²ê?oÞH„äæf}ùòúÈÈéï¼Óx=V+´´è6‹{>¼àþý­÷îm‰ÿÐÇgè£Gå7¦z{ï2ä‹  ocbÒ/^Ì«©áw^ü‚t#Õ7áŠ/dx€°Æá;;ïTXs²³³;ïŒíÐ#‚ì)Èd’žž–•Uggó1cM:ìƒ<—-{wݺ)QQï80÷ÿ[daÁ뤳«Ö›?>¼zõJuQìîÝ»ùùùm©œVRRÒÅÁ•ÓÂÃÉÊiµµµr¹\SÁ€»»ûöíÛ+**¾ýö[ÕÊi IZZöìÙq®®[¾üò̃Ï:2¢*==½Ù÷´ˆˆˆÖèàà°~ýúºººòòòÈÈÈñãÇ÷ë×bù[[[///L»ƒiLTwÁy{8m÷7ï!tY iEVVÖÈ‘#Y,–••U||<`V]]-•JàMMMããã Fvv¶B¡ˆŽŽ¶µµÕÒÒòôô¼qã1 †aÇWÝx«i‰£çÎ333Ó××?xð Ü¿âĉúúúL&ÓÑÑ199¹õ'RUU¥úå´iÓ”ßù•••T*õñãÇæææýû÷Ÿ3gÎË—/•ÁWWW‹ÅâÕ«W8p ÑäµµµÊ®ŠêBaŒ]µG,0%ÎnÁõaïÅ TïüÒ—‘H˜‡‡ÍW_Í~ð *..„Á †…ý8bÄæO>I¼~ýÑïÿ@éñpéu"#27_kl¼ÚØxµ©é;»ï½·wàÀ 'Oþ¡éÐÔ@*•ÿý÷‹ää;ëÖ%mjºÆØxµ§ç¶U«Ž9ríöí"±XªéQ·ÊLü²žxÆ(üŸŒ.8aÍkpåÊb[&“uÁ©Û®k‚|üø1dee©wÚž(  |ã xöìY+++:>jÔ¨_~ùeòäɃV} H$ ÕÓÓ³¶¶NMM€œœœ–怄„„.ÆÐаÑ561X#Áà8~ýúõaÆ1 GGÇ«W¯¶å•Q*))IuD";{öÞܹ‡ÍÍÃLMך˜¬!®²¦NÝûÆÙúަ¯[×xðàÁøñãÙl¶––Ö¤I“ŠŠŠº>†¾LRRàþø0žá‰Ÿ á'Èx"†'B3ÿ]ìø‘FÚø›ÈÆÆfÆ /^¼HKK#‘HåååPUUµ}ûv;;»?ÿü3//ÏËË‹L&geeíÛ·ÏÜÜüÚµkÏŸ?ˆˆèׯŸT*ÅqyR­é A: †£Œ=Òë…oï¯þù§V&“cö¿ÿ-òörøð•¯¾úuÔ¨ûöÍ12âh:Fµ©¯?|ØPð?ŠªªPBé}pHw2œ6ÁŸ.>·Zw¼¯øçWcwtU¥¥¥k×®ýé§Ÿ:iþž%00RRR4F^^ž““SUUUKK+0 KMM5k ¦}Á`–””4{öldz²J’“³NŸ¾'HH$h´ä}øp‹_~Y£¶'ÐÃ)_7M‚t\~-yséµíóDZ@.ÀšoÊÛ@×3ÜC×7ÿÛüáWP~o}üµ;þéþÆßDýúõ‹ŒŒ\½z5ÔÖÖjkkS(”ªªªQ£FEFFµúrss‡ ÖèzìéÓ§‡JHHðöö^¹r¥‡‡Gë/,$''õŽÏ‘X,Ö… ,--³²²üýýI$’Ú/)qOLL $Zñ!™PQ|¹fд.j^Þäæ>KIÉ>}únM ßÕÕ*0Ð}æL--ô]‡ H¯‚úc!½“IÛ·ïƒY³bI$lÎOX±bÂÈ‘W®<>qâî={‚‰½›M÷ð°!Š@E77·ìÎ’;wŠo‰DRCCíaÃ,ˆœ–»»µ®.KÓ!#ò¶0hzw‚ªª*ƒv?ð«W¯†„„lÞ¼¹ªªêðáÃ\.w„ ‡êׯñIò“åg(Êmå [¶lY´hÑÙ³gCCCÁÖ­[W®\Ùñ'xÿþýÏ>ûìîÝ»B¡ÐÖÖvÓ¦MÄgÍÊ󆇇?zô(!!J¥~ùå—+W®ÌÌÌtss³²²êøÙ¥ôôteUáááQQQ­<ÐÁÁaêÔ©‘‘‘|>_ÅÊP0-©®mß~>%åNee™L"ÚŽ*š|b¯P4S?Çáxã¡\®°égž\® ÑOØd'Îå6³“Ç5Ú)—+êëï”Éõõâ&#åMwJ¥r@Òh§D"kv§PØ¸é ›Ý×SݽŸBB. o[ËŒÜüïnR ,RXhüÇ eÔæþW\\ܧŸ~ºwï^ooï¥K—Ž5ŠØÿìÙ3¢Î*ØÙÙOž<±··'¶1 k¥›à[MK º²  ¶¶6::úÆ………ƒ j4FFFHHHppðÉ“'Ü4‡3eÊ”´´´… Þ»wïçŸþøãmmm‰£ÄFYYÙС m¡_¼x¡¼þþ'’XÍ*(¨01ÑÌz, ÓÖf6ÚI&cÚÚŒ&#IMwR(¤¦7)S©ä¦;µ´èÚMFRš^C^»VÓÆà‘žŠÌ|†yÅ.ãAùE(þ”\Mr·Úa̺ýÇ •0èmnÝè“ã¿ßØ–±¾¾¾¥¥¥999§Nz÷Ýw•­KJJF EEEÄN“’’’1cÆ_ ­ˆ%S™–ÐèÂËËËÓÓs÷îÝ#FŒÀq\YÔŽ`ffæáá‘‘‘aeeedd¤§×Ìå_PPÐîÝ»Ùl¶¿¿?›Í633+..&N]\\L<Õ =zD<µV~ܼy“Çãµ4¦›Ã0ìäÉ“Ÿ}ö—Ë]¹r¥³³sXXX}}ý’%KbbbZz(oäR½RÅq|×®]nÌjåÔo¼C«SËô,Ïo×]ÞX¢oÇx/ÖŽ¡‡>T3âããàããP[+8>'%%kÁ‚xccÝ÷ßw3çkëöß¶ˆ Ò _H¯õùçS?úh,ƒñŸ|´µÌõñqX¿>åþý˜ØØ''3MEØÙ(’½ý{ûîPW'ÊÏÿ'+«äÎ’.VW׳X4S"§åìlno?@Ó!#H À_°ÿ,ƒ›9Ê}:C» ŠFUk:8áš5kÆŒ³lÙ²/¿üÒÓÓ>laa!X¬6-%f ¶—/_nhhèïï/“Éêêê:žÇº}û¶²ŒÏرcÅb1Ç#>P ÎûÑGEFFº¸¸ÀÁƒ;xFD½/_¾¬é(ôâ`¨T²››•DòÌÒÒ¾¼\@£Qär¹\Þb‚ÍÐá×h'‡Ã$‘§~9fÓt°ŽN3oºº³S†q8wvCM_ŠV4›×TýRÌ[#3ÀÔLý@R ÏÏ“ðâ`8à8@o(¶Ö >Üß߯ nnnªé¢¹sçFEE :”Éd†……†a~øá–-[¬­­xüøñ-[¶”——³ÙìãÇ=ÚÚÚZ¹ñVÓ6˜T*õðð°³³ËÏÏß±c¼zõJ™áppp8þ|qqqll¬““ÓäÉ“W¬XA\œ(ùùù-Z´èàÁƒ‡€ lÛ¶mðàÁ:::«V­š6mšêz²­[·ÚÛÛ©‹Å)))ß~û­D"Y¹rå¾}ûztí»ÄÄÄœœœ«W¯L™2åÁƒÄöŠ+”«åT©ÞhÕèß+66¶éYoêZíV½KÎÿ*²bÿä§?z£™†îëDºº¬yóFΛ7òÑ£ò””ì””;±±—ÍÜÞßU__KÓ"‚´K—vãBn£¬ìÕÌ™ßXX„}ýõ¯r¹BÓáh@yyí… EE›>}¿µõ:cãÕÇoš?ÿÈ×_ÿzáÂ_µµ|Mˆ ½‘\‚_ž„'~Ê —‹ÿs¨&¿6OÄðªEzzºÁªU«òóóß8ÚÐïnß¾ã8“Ùø³æ‚‚üu³qåà¦Ûʈí;wî4Ü‘ ŸŸÿÝwß7®é³ ²°°P(8ŽK$’ 6˜ššêëë7ºÄ‹ÅkÖ¬1222008vìX£ËªŸ~úiΜ9·nÝz«‚ 4ŠxÇÀq\.—7Únå Põ‚P¹‘••5tèÐÄÄDbÌóçRï IDATÏÉd2Ÿßâ_Ç-]Ù5 ð6_Íönr‰â÷­¥ñwóÓúúK¡2™ü÷ß V­:nc³ÞÒò³ùóœ={O"QÿU‚ H§Bë±>ÊÔT/%åãC‡®|õÕ¯·oïß?ÇØ¸ÅJè½RÓ „YY%wîŸ;—³gÏ ³µ5$Öi¡ „¢¸nÎ…ÊßD/àÑA¼ æÜ[å— Ÿ;Œ¿ýGuv m©Zó¶ˆÆ&&&1113fÌ€×Ò›m2ã8”••5 ö:~­”ñ!ÎÛJE é›LLt/öZ¼Øëùóš_}pêÔÝû÷ŸR(d¹\®P4¬8ie©Ò:Õ÷F6›ÝJ?žŠŠŠª¬¬Ôx0………ÉÉÉ>>>@¥¶Ö ¥ ‚Ù¿ÿíÛ·ïß¿òäÉE‹u°¬n¶58|_@í(= ÅGAø¦EÚk„ ýIYY·÷®S§îj:"!*Λ7òÀ¹W¯nøûïii+ݸ\áþýýý¿2ä‹3DFžJIÉ*-}©éx¤gÊ^OÓ@!PÈ!w ¼¼™³áWW¿„ñaò0± !ªÖüúë¯ÏŸ?wrrZ´hÑÝ»êyœ?~DDDvvvaaáÒ¥K½½½•‡ˆ›ë@WW÷Ì™3<oûöímŸùøñãÊ.í ZÆgþüùðêÕ+ÕDE »wïæçç·^¨ãÁôXs²³³Q0Ý*˜725Õ[¼ØëçŸWÿöÛúU«&XYõ¢nsÓ^µ»ÿþĉõõõ™L¦££crrC¿% î]»faaqøðá°°0CCCSSÓøøxƒ¡ü^***Ý!˜ÂÂBggg---]]]--õ”3jw0ÉÉÉëׯ·´´ŒŒŒTOK•® Û3Ë`Ò 0_Í“#æàà°~ýúºººòòòÈÈÈñãÇ·Ò÷HãÓ"šbbbrúôiâÖo…BQSSÓzëwh!Ns ýìQKã8F` {RRèõëŸÏ›7òÒ¥¼É“cÞ}wWlì媪:MG‡ òè7+Ò×añë¯kÞ}wðÊ•Ç7nLáóÅšŽHó´µ6+VL8ztñƒÛîÝÛ²wïÎÎæ¹¹ÏÖ¯O92jÄˆÍ ÄÇĤ_¼˜Çåªóóéµò¶Cáa•>ð !\ /³Àó{ðí¢ –*›˜˜˜Gyzz®]»V-s~þùçÓ¦M›9sæˆ#ž={–––Fì÷òòrvv&RGˆˆˆ°±±QvÃj‹7n´;°Ã‡ûÌ73ó‹Ë—×/_îmaÑOíK'‘¦‚ƒƒíììîÞ½ûäÉ“5kÖÌŸ?_"‘‡ˆæ+eeeçÎKOO¿xñbBB‚L&S>öÈ‘#»víÒx0<¯ªªjþüùt:ÝÆÆ&33SƒÁ@~~þ/¿üÂb±,--¯_¿®–`šÀ ÿ¨æa"•””ô矚˜˜ 8(Ü×§E4¥•³šjßZ} …AÒµb¼yÒUll ÂÂ|oÜ?}z•‡‡õþý]\¶}›’’%I5‚ H º¼’!‚tSIIwìí7¾óζÌÌÇšŽ¥û’Hdÿý"!áæªUÇÇ‹61Ycf¶vܸèU«Ž9r-'ç©L&×tŒÒý<þOĺe¨þw’‚ó 5\Ï©©©]s®¿þú ðêêêîL·ÒîþXÐÉ ÆÖ­[×öSt^0#GŽLNN&’Rõõõš fÏž=®®®?Þºu+Ñ|¥í Í}žžªÙþX‰dãÆfffl6{òäÉEEE­œúرcFFFýúõ;~üx£yAº-¡Pröì½ù󘙭µ·ÿ|ݺ¤Û·‹ˆ&|‚ ÝZ… fÏvÏÌ wt4 Œ]¶ì(ZfÔ,*•¬Z0?ljËüü†q¹Â}û.øúî<øß „OŸ¢ „ð, ²–4W} Çà¯m]P;¥§§7[ -""¢ ÎnkkëååÕyA¾UE 6ƒ´ªœ¦ö`:·rÚk––¨pV§«­­ˆˆðòò211Yºt©ê!¢ùʳgÏlllˆ=vvvÊ£õõõ®®®Ý!Çãããõôô6lØðìÙ3µ”fm÷+Ãd2?ýôS]]Ý•+Wª+A4 Çq77·Ö·›}Tÿþým¸¹¹Q©Ô;w>{ö¬®®.==]ùNÒ¬òòòêêê¹sç6š§ÑY¤Ûb0¨~~Ã]|çNäªUnÞ,ô÷ÿfܸ蘘tô©‚ ÝÊc!È¿ú÷gÇÇxøð‚7¿ûó4QwÇá0ÆŽæ{ôèâ¿þŠºwoËž=ÁDÂuë’==ÿ­@xýú#¡P¢éx¤ËUþ7>€–ZÈàRx’µumLíäëëÛì1QQQ]pöÂÂBƒÎ ò­*µ1¤íPå4õ]T9 é ^^^ÅÅÅ»wï~òäIFF†ê!¢ùб±±2STT¤<êëëK$òÀÝÝ]- ØÚLmm­Bñoe]‹¥Á`lllÄb1H¥R`2™AnK-wbiöv®ž¥ìû5k詌uW¬˜™ùEzúÚqãÿßÿe޵}ÆŒÇßB=8Ñ8Ц@nÇÏo¸§§íÆ) ĸíØÀfÓ5TÏ`d¤ãç7ÜÏo8H¥òüüîÜ)ÉÍ}vî\Ξ=H$ÌÖÖÐÙÙÌÙÙÜÃÃÚÑÑŒDB}5^—×ü—7¿‹€ãpÿsx÷\†…4ÃÑÑñòåËšŽ¢ïº}û6›Í&“É0vìX±XÌãñˆ›—׬Y3f̘>ú(22ÒÅÅ<èììL<ðÆêZüÔ‘` ÀÉÉ)==}×®]sæÌ)..¦P:z¥ÝîW¦®®îÕ«WUUUqqqsçÎUK0ˆFH¥R;;»üüü;vÀ«W¯ToíŸ;wnTTÔСC™LfXX¹+¢èéé]¹r…hÀvüøñÑ£G[[[wq0nnnþþþ«V­Ú»w¯›››©©©ƒ™1cÆ®]»† ²ÿ~33³Žƒ H·EÜäÔ&éõrüÏC/rþW>üÃn›h:¤CœÍÍ##ý®]+HMÍOÛ´é”üy#ÇŒ±CRÑô-‚4ÃÀ@ûûï?:wîþÆ©ãÇ ;v¦ƒêa¨T2qéC|Éã sržÝ¹Sœ›[¶wï…š¾–}èP"§åéik` ­Ù€DÍepi<È€+þ³#F…¤a›ed ˆ_•çBú®ÚÚÚèèè7nôŸ_¸o¬œ6zôèî Q9ØÞ°aî]»JJJTCíÊ`à¿•ÓÂÃÃÕ ¢‡þä“OÂÃÃ]]]#""¸\îŒ3TkEFDD¼|ùrâĉººº»wïÎÈÈ R© «««£Ì††„„$$$´;[Óî`–-[çîîþã?ƒ5ÌÆsss‡êââròäIµƒ ÒÇ ª¤¿}QR•'n1ØÕQì%h4ŠƒCm­àüùœ„„›AAßš˜èΜé:w®§•ú‡F¤K¡<‚´ˆX˜µaCJpð¡¹s=7mšfµ‡Ã;v2XZú’Èiåæ>KH¸)‘ÈŒŒ8ÎÎæÎÎf6nnVL&M³weee7oÞÔtÈÛ¡AýDy8/W€J)ÈV‡ó0s.˜Ö‘My`Z Pˆ)ðàL‹+FEÜ*Ž ½˜———§§çîÝ»GŒã8ƒÁPR­F¤¬UNSn»»»geeµÒ£³ƒ©­­åp8ÄP_å´öƒ*§õo¼ÁßÏÏÏÏÏOùå”)S=N§ÇÅÅÅÅÅ@^^†aÄj§–NÑÊ7Cç3räÈÜÜܦj$--­3gμU0H·RVV¦lØ ‰DÁãIú÷g¼q$òVnݺ¥én§äRíïÛJÙÆ´÷OÖ±D?t½®.kÞ¼‘óæ,((OMÍNN¾{ÙÙÙ< ÀmÖ,W==u–F@i Êc!Hk ´ø¡aaÖµk11ÁcÆ Û™ÕÀÒ²Ÿ¥e¿À@wàñD÷ï—Þ½[zïÞÓ£GoÄÄd0T''3Ë#,]\,ÍÌô4¯&ݼy3((HÓQ oEƒK_€Ôþx¹OeÿŸÃßÿÀÓ—/(}«Ù’’’fÏž­ö ›­¡– iT9MíÁ Êi=Nzzº2£*<<¼õS§NŒŒäóù‘‘‘ãÇïׯž¶¶¶^^^(˜vƒtüñGKׯF£Ó-i4SÍ„J5HÊ_¾Lêâð¤OQHñÛûžÿ•Tédèñ© ™FÒtDHç²·>mãÆ÷nÞ,LIÉÚ¹óçíÛÏMšäàæí=„BAß‚t¦fÛ¡#ÒHEoáÂx“5ëÖ%Õ׋4NoVQÁ»pᯯ¿þuþü#C†|al¼ÚÎnÃôéû#"~JN¾SZZ­é»ZRRz¯îaįp‘z¾Q ))I-S5Ró\¹r…Ø–Édj<ÅÓ§O'L˜Àf³œœ~ÿýwÍséÒ%'''ƒaooÿË/¿h6—Ë544ÌÊÊRûÌ'  €ÖŸéÙ³g­¬¬ètú¨Q£~ùå—É“'|8eÊ‹edd´téR§éˆz¤šbáÿÆÝÏOC?k}—+HH¸9}ú~“5ÇoŠˆøé¯¿Ê4‚ ½†£f•Ò68Ž=zsûös¦¦z11Á®®–šŽ¨÷“JåþsïÞÓû÷KïÝ{ZTT©PàÖÖ#FXŒa1|¸…££ÞËו&''¡÷ê¾ Ã°NZ¥zŠNZl4kÖ,¡PxèС¸¸¸ï¿ÿ¾¤¤„Ífk*++« „††ž8qâË/¿,//cý¨Î †°~ýúÝ»w÷¬•^’’¢Ù0òòòœœœªªªZZZaXjjê¬Y³P0í ¦ Þyz%ôºõ説›P(ð¿þ*»~ýÑï¿?ÊÎ~"JŒŒtÆŽµóð°;v¥%ê9мAMM½½ý’%K>þøãŠŠŠÐÐP{{ûcÇŽi:®I—ӴȚŽѰÂÂÊ3gd?}úrРnAAïôïÿ†¿þAÞ Zò‰ m…aØÂ…£/_^g`Àž1cdä)>_¬é z9*•ý€µõº‘#£>ù$1>þ÷;wŠÅb™¦CFÞæþýû'NÔ××g2™ŽŽŽÊކ]»vÍÂÂâðáÃaaa†††¦¦¦ñññ #;;®]»¶jÕ* ‹ðððêêê¼¼< “““³iÓ¦„††òx¼’’ EEE ã1ô8éééXs"""Z ƒƒÃúõëëêêÊËËÕX¬ ƒ Òƒäæ>‹½¼`A¼³s¤¯ïžo¾¹¤«ËúòKÿ[·"îÝÛràÀÜyóF¢$¢ ðêêê¦ûcbbœœœ¶oßnjjêââräÈ‘ü‘Çã©eòÎxTw†’X hæ{óføéÓ«<<¬÷í»8bÄæ  oÏ»/•Ê5‚ ½Êc!ÈÛ±°è—’²âÛoçŸ9swôèíçÎÝ×tD}•Jvv6_¼ØëÀ¹W¯nÈÏßqúôªyóFr¹Â.úû3hÐÆwßݵ~}rJJVAA9º[A:.88ØÎÎîîÝ»Ožÿ»ï¾kepaa¡ ¦ÝÁ ‚tÏŸ×?~kÙ²£Ã‡oòõÝóõ×é"‘44Ô;=}m^ÞöÇ ÜU¯„aØ?þhff¦­­ýù矟K"ašŽ«ï22ÒññÑññq™LQTT™›û,7·,+«äÿþïºBqœÍÍœÍßydžÃyCwA ¶¶6::úÆ………ƒ R=daaÏž=³±±!öØÙÙ)òx¼èèè„„„èèhÕ;^5 ¡¸¸ø§Ÿ~š7oÞ´iÓtuu5L}}ýèÑ£;xvAª©©!6ôôô®\¹2|øpÐÖÖV×üÙÙÙîîîö¸ººªk~¤—©«]½ú÷õëîÜ)),¬Àqpr2›6m¸—× K--º¦DºZXXX¿~ýfΜ ëׯWn¿zõJy}ÕHmmí€ ðþûï¿|ù²éÚš5kÆŒx ¹ü~øaÓ¦Mï¼ó8pÀÑÑ‘Çãq8X¾|¹¡¡¡¿¿¿L&«««£ÓÿýžüöÛo¿üòKOOO8|ø°………@ `±X­?ª-w/ W7—š¸j\g¦éXžÄØXwÅŠ +VLÈÍ}–’’ýÙ{÷^=Ú. ÀmêÔa,MÓ"Ò“ <‚tÈÈ‘¶ééa;wþ¼eËé‹óvì˜ekk¨é  PHööìíºŸ/ÎË{ž›[–›û,55;&&ƒL&ÙÚ9-gg³#,©TT×Ašáåååéé¹{÷î#Fà8Î`0”‡H$—””‰™¢¢"âPii©··7“ɼy󦹹¹fƒ.—Ëf³Édò{ï½'‰^¼xÑñ—ÉææúãÆÙ‡…Möô´ýöî<ªõøg¬3 Ù˾/WˆbQJÑ"Ül7Ѧn{Ê-ÊhUiU·ÒBÝj”,å–n©”V„’6—‹!”ƾ;¿?νóóeŒÝ çýG¯Ç™ç<çsÎ̜Μç9ÏGRrèÞÓG™L†ÿ®©Ú–Ù Ú°aC`` ……ÅŠ+LLLÚUÀG€’’N·°°`¾Ä`0„„„ TUUñ%x¡°°P[[dee;‹N§»ºº¶¶UXXˆrb³Vw šë[fþù]Ñ\DÙhN‡ƒ WzzòzzòTªÍýûR½¼®Q©7¬¬t&OVǧÜDaåÇB¾"“ù÷îýùæÍõåå5Ӧܷïvmm#§ƒBþ‡  ?…¢‚'ÖÂA_¸°ÔÆf\EEÝÑ£÷ììN¨©y[[õó‹1‰µš››"‡p?6K RSSû²zG}iéLSS…BQWWÏÈÈpww€²²²¶\]]ýýý_¿~‘‘'- [·n¥Óé¾¾¾BBB ƒÁ`´´´@hh(Nä`ÀÈÈhïÞ½_¿~=}ú´¤¤$>Œ—SÁ”ÿâãã úÌkˆŸ Úž3‡T`Ò#oÞ¼±´´#‘H:::ørf²™³gÏzyyIIIÉÊʆ„„‰ÄÔÔTnnn‘ÿ:thÇŽ¼¼¼Ì6ñ©Y9´C‡ef_¸ðlÙ² ãÆípv>}ùò‹Ñ£…·o·}øpKRõàA'}Ô‰…ô‚µµu~~~dd¤´´ôÔ©S‹ŠŠÚU`ö'Í™3çÒ¥KÌå>|¯ªª’““ËÍý7‹^‘‘ÁÿdsŸ]FFæÏ?ÿħ©Ïþî|—s\qZõuç z\ù´ýÊ3ލÄx»^A:ÇÏÏcc£é’GJÊŽÍ›gýý÷gçÓFF»÷î½—×Ï÷.yÐóXÒ?&LPºwÏ+**uÏž[ɾ¾6†hPÉÐÔvBÈÏ/MNÎş֢ћ……‰ššÒŠ …¢l` (!AælÀ½ÀÍÍM£Ñú}nŠ~o¶×“ ôlHÓÙ³gׯ_ïëë;aÂ*•ZQQakk›‘‘Á¬@¥RKKK---ñ;•÷îÝãåå}øð!´—Š?uäææF£Ñ”••3¸páÂÚµk÷ï߯¦¦‰Oê©`Ú=ÁÍÍÝ÷`~XC|b´:#È sqq±°° !‘H·oßvww·³³ããã€mÛ¶]½zõÞ½{111±±±D"qÕªUí:¨222RSSÏŸ?ßvaRRÒÊ•+—/_¾|ùr))4™ÁÈ——÷ýÅ‹ž?ÿ'!!»¤¤ŠDâ34TZµÊÂÔT}Ü8y4¾éúúúvvvÞÞÞ†††ÌgåËËË%$$ÚÕܲe‹¦¦ææÍ›×¯__QQ±zõj;;;‘E‹íÙ³GKKkÔ¨QëÖ­ër&j¼qwww*•*+++""ràÀÔÔÔ´´´.×ê,à!¢µ {óGqÚùb)ÁY§Ô„åÐÜžH=ZØÃÃÜÃÃ<3³8**5<üå©Sõôä.œdkk $4„¾ ‚ !ÊË… #VEE-•zCNn“½ý‰?s:¤g›ÿþû –°n]è”)22¥¥=õõ·»»Ÿ<÷òeNmmà ‡4R3Š@JJJss3óÙ”ŒŒŒqãÆ56ö,}7ôGRzh“oyH€ððpNGÑï߿ǟ>é¬DEE¡`8L¯9880S—5ýr*è¨ïç(¦Šp »3Ï1|[—NüÙ)¼œ™™ÉüO"##1 SWW¿|ù2^áíÛ·í\¼xqpppÇfóóó·nÝ*''çææöòåËþÚ5R¯ÊHzú§àà'+V\ÔÑ¡JK{jjú¬Xq18øIzú§ææNG‡ imO#•;Š‹‹ÓÑÑ!‰ªªªaaa†™››‰ÄÒÒÒŽëâOš’H¤Ñ£G/Y²¯ÓØØèíí-+++&&æââÂüÐ.|9³ñÆÆF9992™lee•““ÓµX|077çææNII9v옼¼ü“'OŠŠŠ¨Tª¸¸8~;•F£åææ¶-ô¨Y ÃÀÊÊêëׯׯ_çáᩯ¯×ÔÔ\¹r%N/.. áççohhÀ:Ü5ûøñ£žž^Çýzö왳³³––Vg;ÞÍ~,“gÏž.Ç'306Þ#-í©¨ˆú®ÔëF‚ #YYŇߥPvKK{N™pòdÜ÷ïUœ ACWá2°**jýýc37ßÿðáGN‡ƒô›¦¦–¿ÿþ‘L¥Þ°²:"'·IZÚsÜ8?w÷àÇïÞ¿ÿ¾´´º_6ÔÍ;&bbbx¹¼¼OMQRRÂrªŸŸ~ú)$$_ˆç"µGÍbÑÑцµ´´à5ÙLFÄfÒ¡ÚÚÚàà`}}ý©S§†‡‡³™È«›ýXøÄGÚÚÚW®\Áqss×ÔÔ`ÝëÇÂ[`¹ì·ÞÃ÷®(2" ë~¬š­] Oô°!<©:óôÎð=n]~}¤¥¥>\ZZúæÍ'''ÈÌÌl»"•JÕÔÔ|õêÕÇ­¬¬ 55_wÁ‚{öìéØf}}=F311144¼xñ†éG¨‹©¼¼æÖ­´Í›Ãñ¾+/'§ Ã‡ï>}š9ø³p#‚ #RKKëË—9›7‡«ªnQPðrw¾u+­±±™Óq!Â<,G² Ò_„…I¾¾sùeâ®]7.<7cÆØ]»ì””ÚgšE†.MÍ1ššc ¦¦áÇ¢·o ß¾-ˆ‰I?räŒ-L¡¨)ëéÉééɉ¼OPPІ -,,V¬Xabb‚//((PQQÁËêêêx!//OSS/6é‹{Ô,NVV¸¸þÍ×Í`0^¼x‘­¡¡Ár+ׯ_?~ü8þç½{÷ÜÜÜ\\\´´´zv :¡  t:ÝÕÕÕÕÕ•¹¼°°°³¨X¶€k·‚ }lÎEø·›Íi­Ý9ŠöíÛ·cÇŽˆˆˆ_ý•——799¹›»ƒ ƒéìÙ³ëׯ÷õõ0a•J­¨¨°µµÍÈÈ`V R©¥¥¥–––"""‡ºwï/ï¿×<Ïž=ûå—_:¶yçλwï9rÄØØxvé³ÊÊú'Oþ~ö,+9™žýttäæÎÕ77ט0AI@€Ó"Òc­MýCÕJ”Ó  \\ E…BQñó›û.**uåÊËÂÂ$›q†Š §DdP¡~, **’—.yܾ¾gÏ­éÓ­Ze±zõ4ôco$äÇ/°ð?¿~­|û¶àíÛ‚·o ï——×ððp©¨HééÉá=[ê꣹¸ý€µµu~~~zzzttôÔ©Sét:¾\ZZšN§›šš@NN¾PFF†N§Ož<ÿÏ]ÁÍÍÝÇfqÂÿì—¹¹¹±±ñ¡C‡ 0 #‰·róæÍI“& ãÊÉÉQ(”{÷î)))=ZT´~Vá·•eddŽ9bkk †UTT°ìÃÃ0 ;¶€k·‚ }lÎEø·›Íi­Ý9Š^œ233*++{º.‚ô ¬MªH–llllll˜Κ5«ÝŠüüüAAAAAAðáÀ÷éÀ§OŸX¶ioooooßÇÈ‘AÐÐМœœûôiÖ³gY>µ¶bººr3fŒÝ³ÇÞÀ@‘Læçt€‚ô^ABeâášâFqM’ˆ‹Ÿi2D >fDG¿ºr%)44QCcŒ££¡£#EJJˆÓ"2ÐXrø'&Rq13ÓÈÏ/õó»aaq@Kk«­íï~~Ñ‘‘)Ÿ>•ö}‹úúú>>> †††moѺººúûû¿~ý:##ÃËË Â’%KvîÜùüùóâââÇËÉÉáYÙCCCñž*f¡GͲ ¬©©‰B¡¨««gdd¸»»@YYY»:÷îÝ333cþ9vìØÛ·oß½{·¨¨HWWwÙ²e¯_¿îû!www*•šššš½bÅ æKåååxADDäæÍ›•••{÷îí~ËÌ#6\XIMMEÁ ©`:jnn&ß¿€!ØÐ×幈Íi­Ý9 úã+ßÐÐjjjºlÙ2ccã?îÛ·¯/ "HßÅÆÆ²<R©Tö+Ž;vË–-UUUÅÅÅ~~~Ó¦Mœ˜‘ÐÔÔòìYÖÞ½·mmÿé§m..gž=Ë22R rKOß»É×w®™™êÄBá«<§î¯•ÿĮϖÒp¾5ub!Ã…ŒŒÈš5Ó|cc7Q(Ê¿ÿ7~ügçÓ‘‘)µµœŽAƹ) äÇUVVíô›¡á.-¡¥…uj"dDjllþûï/x6ì)Sdd6JK{êëog&Ö*/¯i[¿›™âââtttˆD¢ªªjXXö_R–úúúU«V‰ŠŠ*++GEE@zzzcc£ŸŸŸ‚‚‚€€…B‰ÇîÌ3²ýÈÇíÝ»wÓ¦M#“É‚‚‚3gÎdþ÷:òŒàüX­­­?~>þ©‡ÇÚÚ¾ÒÒžzz~+W^¢Ñrs¿q::aaÇŽÌ1vuuu'.z¤©© 8·nw4Ö´¤œ*:oœvÍöý§çœ Aú¨¾¾éÖ­4w÷`yùMšš>ëÖ…>}šÙYòoA†;ÖÕ<‚ ÏŸÇŽÝ {©£#ëëk3y²z×ë #NUU}FÆç·o SRèII9%%U ¨(nd¤¬§'¯§'—âêêÒ/çê>èêê–””ôï(éjvx!QQQóçÏï÷fÃÃÜœú·Ùv›HII144ì÷–MLL6nÜ8cÆ àååä`0W®\¹víZXXØÕ«WÛ¦uä`ZZZªªªðrqq±‹‹KJJ 3‘L Üáꌣ£#DFFÚ9¥ËÓÚ}凈A8óŒHè¸ý"""œGÌ/èÖVìï¿¿$$d'&f'%喗׈‹“UMLTMMÕ54Æp:@aG@@àþýûŠŠŠ)))vvv\\\ƒiÔ#†]¹rÅÑÑ‘ŸŸcÏ26Õ¶DÎÿØXÝ2nÑ=÷ÑÜ|h²td„øúµ"&&ýÚµ—?~–•µ³¿pá$EÅ÷‚ŒHh^AᑃþúËsÔ(gçÓË—_ÌÉùÆé Á&$D¤PT<<ÌÏž]”–¶ëñcïÀÀ_,,´²²¾îÙsËÎîÄöí©}9WÐT?Cp¡^φÔ/TUUÍÍÍaCƒïÍ›7–––bbb$IGG'""_N žZxxø«W¯dddÔÔÔð9úú%Ôj¶/¬­­Y>wìïï?[ÏÎΖ””„ >uuõׯ_çååmܸÑÝݽ±ñߙǷmÛvõêÕ˜˜˜ØØØÐh4¼+¥²²²¤¤ÄÝÝŸŸ_EEåùóç 222îܹ#  ¨¨øìÙ3Îà )55ÕÞÞžýVN:õúõë764°û –””¤¦¦¶wïÞoß~è!½>ôè´6‚¿ò‚Œ~,âtP‚ôÒð¸ GÊÓ§™ÖÖGðÞ¬œ”WùG7Œî˜ ýn(ôcåååùøø˜™™IKKO™2¥í¼§„H$>þ¯\WW×±Á²²2ÈÊÊâ`0‚‚‚qqq†UTTp< à †PEEw 99™Yî² W__ùòe}}}##£.w³GP?ÖõÇô:n?‚!~UÆì»²²:¢ à%#³õ]!ÃÄÇÇcÿ Üi[fs1ÖÙ¥‘¶¶ö•+Wð:EEEÜÜÜ555,[è¬fNNޏ¸¸††FLLL»mu¶ ˱Gbbbxåòòrü¯’’uuõK—.áËß¿ø5!ËFz‡‘W—p° ¹¡µ×- ¾¶î‰D¢±±1ûKñî4èêêÚnI7ÛdüûÒ2Â)™™_¾kd´KZÚÓÊêHpð“ÒÒjN… HÏðôðñ-Aœ™™ÆÝ»›ž=Ëò÷17ß?gÎ8ŸÙÊÊhþ"A8ÀÜÜÜØØøÐ¡C†‰DæKx*iii:njj 999ÌW †°°03]€€ƒQQQÁ'åkjj‰ÄÁ`àæÍ›“&Mîr+øT6=’™™™PYYéììÜÓué‹ÄÄDN‡€ ¬!ø××7¥¤ÐŸ>Ízö,ëãÇ¢–LWWÎÈHyÍši'ªJI q:@é2™ ÿ]Aµ-÷Nwuuuuue.),,ÔÐÐè~M•Y³f½xñböìÙÝo\VV¶]ØAAA6l ´°°X±b…‰‰ ¾¼  @UU/ã…ÂÂBmmm–ôTyn}Úù/¹÷â¤Ú’F!YN¦ãê©øøx}}}¨ªªÚ·oßÏ?ÿœ››ËÃÓûû–aaaëׯ§P(ý〷Œ  1^^Ö7Z½xñOddJ@À_þþ1S¦h:8Z[ëòòrs:@Aº†ú±dˆ23ÓˆÝ÷ñàÁ»S§°µ5Ø´ÉJII‚Óq!CË»Þ)))†††(˜¡Ì0ÒÔÔD¡PÔÕÕ322öíÛeeeÿ.ruuõ÷÷×ÖÖ&‘HxüPÚÙÙ­[·.00ÐÐÐÿYjjjª¬¬<ÈÁØÚÚ8pà§Ÿ~:~üøøñãåää8 Ü»wÏÌ̬mk} "##OŸ>ÝØØ¸víÚcÇŽõ)‘8Ö t•ˆ =sìØ±cÇŽq: d䫪ªOJÊIN¦wì»26V•”D}WÈMFFæÈ‘#¶¶¶€aXEE…ˆˆHj¦¦¦>~üx̘1'NœØ°aC7ïø[ÃÚÚ:???===::zêÔ©t:_.''—››‹uÊÍÍÅ›í¬‘î+û§.-¤˜þ¨\LdyHYiŠô¾±D JJJÚ^33‘ÉdüxŠˆˆìÝ»÷Ì™3t:]]]½×;::zzz&$$ôKäm \ËÈ€ââ"˜™i˜™iøûÏ¿wï]TTêÊ•—G"Í;náÂIzzòœA¶8ù0‚ ÝÐÒÒzëVÚäÉû¼Ö­ ÍËûÎéˆAÕÓlÊÿñññx™™Å§¿üóÏ?ÐÉ!˜OŸ>MŸ>L&ëêê>}ú”³ÁÄÅÅéêê‰DMMÍ;wîô½Aó ÞºuKII‰ŸŸßÄÄäÎ;VVVZZZmW¬¯¯_µj•¨¨¨²²2žÉ ==ð„„]]]‰dnnžÍÜFü`ª««çÍ›G$MLL2339 †aòòòÌ™jØÓ6èj^Á7n,X° 11‘MÌ]hiÀ¾<ÀÒ¼±»°hùޝ£yƒpæA¤§**êîßÏ(/¿IFf£•Õÿ˜û÷ß—”Tq::é“v<,Ë,×byi´k×.”””þùÇÃÃC__¿³XÖ¬¯¯×ÖÖŽŠŠzûö­ˆˆNÇ[Æg¥î¬q–×lJJJžžž_¾|‰ŠŠâááùþý;þÒž={ÔÕÕ“““ñüXsçÎeÓHwTÔß]÷Ϲ ¯®»|Ì+Çf6A “••%“É>>>W¯^•––Ú´i›µ’““I$’¢¢bpp0óV$ó-{üø±¼¼üùóçÛ½Ý rss›šš|}}åääÄÅÅùå—ïß¿cÆraÇÆ_¼x¡ªªÆÜ…””–ëÖ××oذAJJJBBâøñãx#­­­û÷ïWRRuppÀk²i9--múô颢¢D"qìØ±Ì«)ö‡®³­ ƒ£°°ìäɸI“üñD’'OÆ}ýZÉé a ´E¡Ž‹‹`c£?gθ¿þJ?pàŽ¹ù~ggʦMVcÆŒâthÈPÔv¼!sD[ÿÊÏÏ÷öö"Áxzzòññ}øð!((è矦ÓéøT$ fÙ²e‹-ZµjÕÕ«W]\\Š‹‹ûeþº…ýïdôÙØØØØØ0ÿœ5kV»ùùùƒ‚‚‚‚‚àÇôjÒ¤Ioß¾íØ ›c2pÁ Þ¼ysˆŸ>}êN0mc`–;pööööööìcf­2¾=…oO øÔ~I3ÔW±|$+))ÉÑѱ7[AAz¨¡¡9--?!!;))÷Õ«¼ººF%% ccÕeËÌLLÔdeE9 ‚ E[·n­««³··g0¦¦¦×¯_ïQM???MMÍùóçÀêÕ«—/_þàÁsss==½¢¢¢î7!!!žžžgΜ‘••¥Ñhâââørooïêêj{{ûººº™3gž8q¢»Ì'Ä @˜uRMθë9«ûâÊ•+ééé?vpp˜5kÖ»wïðòš5kTTTX®ââââèèàèèX\\|ø€Ïtßk!<<ßú@‹eöÄ´åëëëïïÏfűcÇΙ3ÇÏϯ¦¦fõêÕ•••qqqUVSSKLL””ì"á fPÅh@]ˆ‚ì\3DÇA'ÓÐ=ztæ†A¦M›&MšÄé(äGTUUŸ’Bù2÷åËÜ7o>566++KNš¤:i’ª‰‰š´tÿÂAé?uêÔÖÖVnnî¶e6¿­ÄÅÅýüü<==€Á` ñðð0»šBdd¤ƒƒt˜S‘››ûÑ£GæææT*ÕÝÝ>|ø ££SQQahhØq¡°°pÛ~,æ¾)S¦Ìœ9Ó××_²`Á‚ŽëêëëS©Ô¥K—ÀÛ·oÇWRR2eÊ__ß ÀçÏŸ*++:kY]]ÿ1YYYšššx0ìÝ¢E‹XneàÞÊÁ„ßÍÀßâa¡¥…‹Áà¯ãt @aaaRRÒÐì¹ ÚÚÚœùýþc())ùøñc»w=… à þl–µµîŸ¾>zô^DDŠ““‘——õèÑ;ð ‘ØŒÇÅÝ»w/&&&66–H$®Zµª¹¹_ÿ¤/³·÷c0999øX\\\ÒÒÒ fÔ¨Qðõë׈ˆ™¾ä:|ÖÖÖ½»@ ß°aƒŒŒ †a¦¦¦çÎcS9;;Ó—`z¯&x…€OŒÅKÓIº;Ù°6mÚÔÿ!‚üð23‹SRèÉɹ))ôüüR>>ž‰UÌÌÔ½¼¬ Éä>$;Da®×Éú½‘!ƒæÆV~.NmÿÙÅÅÅÕ®ÌFPPІ -,,V¬XabbÒ®‚‚‚³¯¯¯ÁÁÁ?ÿüs^^^AAªª*^/²\ØÙB|ëÌç½X®ûåË |!³@§Ó]]]]]]™M2_íØ2ƒÁxñâEvvvÛjì]—[†æó4ÈЇ÷ƒr:ŠN9::N:•ÓQŒX?ÞµkW»…¨ A†^^nGG#;»ñááÉGÞ»~ýÕ‚ÆëÖYJI¡¬ÎH¼|ù’9^ÌÌ̬¡¡¡²²¼¶qãÆÉ“'/]ºÔÏÏoüøñpòäI==½! Þu”••µ`Á‚Í›7·ý!4øÁàŒóóó/_¾<ô'ì:::>ätÿBÁü kª <Êß#ÊÓ¡î3L U•PBcAA…aØ»w…ÉÉt¼ûêë×Jaaâĉª N22RÖÕ•#‘ø8#‚ ½NÔïpVõ—ÆQ%ÙwÊTfŠo”ãt8=`mmŸŸŸžž=uêT:Þ®BÛž°¶s¿{yyQ©ÔþùGNƒ¯ IDATN.77×ÔÔrss@FF†åÂÎb?~üÏ?ÿ¼mÛ6üÏÎÌÊÊštè†aÌùÙër+‚ õc!ÈpÅË˽pá$ggJxxò‘#±aaI¿üb¼~½¥¤$êÍBº…Íx1¼7¨  €9ѹººúÐ ¦²²2 €F£´ÅÆ‘`p¹¹¹7nÜX¸páܹsÑ„2ŽÀ»íÐ\ \¼0j,ˆ™9 f"ã8‚ È«©©%--?%…þôiÖ›7ŸªªêEE'OV_³f:…¢¬­-ËÃñg,šZ›°‚ÄÊì¿Êòž0¸y ª3ÅÔf±z¶~Ó××·³³óöö644dví”——3SXu†H$„²²²E‹íÙ³GKKkÔ¨QëÖ­Ãa±\ˆ¯È²ñ½{÷jiiáe–뺹¹íÞ½[SSSJJÊËË ¯éîîN¥ReeeEDD8ššš––Ʀ妦& …¢®®ž‘‘±oß>(++ërO»³AP?‚ wxoÖüù®\I:y2îÚµ—‹O^»vÚ¨Q#d>edà°/†‹“––¦ÓéøPµœœœ!L~~¾……‰DJHH—ï·gJz}d˜ù±fÏž]__ÿåËÔ… ˆæj¨ü¸øAD—Å«’&0þˆàB³Q!‚pL}}Þq•œœûáCQmm£œœ¨±±ªŸß<33 EEqNˆ ÈÕTÛ’t´ˆþÑPÕ*MN¬ÐÐPSSÓ^g„ê]0[·n¥ÓéW®\b0 $$ÄÍÍÍ‘`ÀÈÈháÂ…¿þúë•+W$%%ñg¶ú ‚@s5”¥AeTf@ETþ 5Ÿ0Pp‚Éá,êKL‰Iƒ%‚ À`Ô>{–…ÏøñcQK ¦®>šBQöð0§P”GÅéxIܵ%MãVµ%K‰õmçfì¬ÜÑôéÓß½{×vÉ“'OºÙηoßðB@@@@@@Û—xyy;.dÓ8øùùùùùuÖ ßÑ£G=Šÿéææ†öïß¿ÿþv[aÓ² s93+[—‡ŽåVAvP?‚Œ¤͛g­^=íâÅç'N<Ôv:Á””CCCŽ.\X»víþýûÕÔÔ"##ùùùû~d¾'Á£@ "º@V™Y0j,ŒÒR§iAÁôù3ãÅ‹RRèÉÉôœœo†éèÈ™™ixyYéë+ I¿‡GGǨ¨(NG1„ ÷”Q#¬Ž«r:ˆîŠeöÙ´åëëëïï?øñ ‚ #]» ȈTZZüäâÅç°d‰ÙòåSÄÄ9ÒÎÎÎ?WøðAWW·¤¤D\œõ8!**jþüù(˜~ †@ „‡‡;99õ-FdHj©ƒj:ÔäCu6TfAÕ?À+“#Y׬+AE  Ô)‚ CEffqJ =997%…žŸ_ÊÏÏC¡¨P(ÊŠÊøñŠ‚‚hZ×!ÇÑѱ°°pãÆœ„ó;Æñß?¸†Ê–‚çyO*3DU,E9‚ ˆîßͨ¬¬Ü½{wxxø·oߤ¤¤fΜ¹{÷nYYY øpÕÞÅÐvRaaa]]]ÿ©S§²©_RRÒeb³¾DÂÍÍ­¦¦æçç×_¾Íýû÷gÏžœœ<~üx|‰§§g\\Üëׯùøø˜1cŠŠŠðt ¸Ù³gß½{{úVvÿóS_ßTYY?˜ƒø ÂŽ;Ø|pµµµ—.]Š///544\ºt)þé²°°8s挦¦f…daa¸¸¸deeÝÝÝ---û«ñÁ÷øñã]»vµ{÷ÑóX22‰‹“}|æ¬_?ãêÕ¤  GAAlm 6nœ©¬,ÉéÐÁÖëñqcÇŽ3gŽŸŸ_MMŸŸß´iÓ:ëªUUUsssL¯ƒA~ 5ŸàžÔ pƒ€•AP™u²+à&=χ ÂytzIr2=))'9™N§—ðññèë+Ì›g0q¢Š‘‘²±ë&Ž’““CÃpÇŽãt?¨Šüú‚„Êü'ů« Ü c(ÄG~Y¯¤µ¶¶Îž=ª¢¢òùóçsçΙ˜˜deeásœôQ||¼¾¾>”——ÍŸ?ÿÓ§O‚‚êGRUU³lÙ2AAA;;»Á£×fΜéêêºråʤ¤$..®W¯^>}úÙ³g||ÿNZZZúüùsæ ŠŠŠgÏž \<ÍÍ­OŸfþùçë»wßúùÙº»› ܶzÃ0ooo°k×.iiéÒÒÒ˜˜˜5kÖ„††²™ë¨/ÕÔÔjkkCÝWh(p¬^áö•¹xaÊ-à—y ŽAY¬A†—¦¦–´´ü”zr2ýíÛ‚¯_+‰D^##e›qŠŠ¾¾š0Aîh¨l.N«ùžQ;a¥tÇWIb¼úKÇ ~THßõ1?Ò¥´´4OOOöu>|íÚµ¨¨(QQÑU«VyxxàwÆàÊ•+ééé?vpp˜5kÖ»wïðòš5kð!§Ì¼AÀÅÅõàÁnnn ‹‰tûömwww;;;æüx»wï¾}ûö£GDDDNž%‘Hm_ÒÓÓ#“É/^¼˜N*˜Ÿ_zý:]HhòÇŸïÄê †Á¯nÜxÕëÍõ©Ë:âââcÇŽÅÿŒ‰‰ihhh÷„Ö·oßdddð2^())QTTüY7üFVÛr7•””€„„ËMãOâÍ2ûÕ:Ã&˜ââbÿ¶›–““÷ÞÓ°ÙCýXòC£PT(•ŒŒÏ§OÇ{y];zôÞ²eænn&hºÿ᫼¼/ˆŠŠÆÇÇëëë€P¿o¨²²R]]ý¯¿þbÓ4Á¸»»ã—0gΜ۷os0˜ÖÖÖuëÖ]ºtINNîÂ… Ì ñ^= T±8ˆ;ßžZ1 0VÏwc4Рjª¬°hªh©ƒ–z€QÚÀÍê‚ïï@¨ÿ ÐXÍÕÐ\ MÕÐTfQ ¨Ä¢~ò ¨ø.à¼ÂÀ#7Í›››™›¸­ ©+kææ#ð‘Y< ¡¿d47Ÿ´¤¶ŸÊtÅ@ ûí·ß***Ö®]«§§çååU]]½|ùò#GްYëñãÇnnnT*õÓ§O—.]ª««›9sæ‰'ÄÅÅ›››wîÜÙn!3»Ogß—3gΜ;w.99™‡‡gÓ¦MŸ?¾víZ÷Ã#·nÝZµjUmmíîÝ»×®] )))ëׯOOO—’’¢R©}ŸBí4oÞ¼   777ü‘#‘gÏžµ«#''—››‹OЗ›› ÿÝ‘ï©ææf “É“'O666>tè†am“EFF677;ÖÃÃcÊ”)222Gޱµµ Ã***˜½JÌ ''§àààŒŒ —nÞµ700e¹k222t:}òäÉxeƒ!$$„<ûTaaa7w™Mü½è`HKK;|øðãÇ'MšD£ÑV®\Ó¶‚¾¾>‘HŒýý÷ß{Ú>“¢¢øÒ¥š..»oÞL‰ˆHyüøo<þÖV¬ceàèîÞ×;0ÝG 벎©©éÍ›7gΜÉì_|ûöm»:’’’Ÿ?Æ'üòå ôå ¶¶=z¤®®.$$Ärâââ_¾|ÑÕÕÅ+WWW àqâ0¼¬;ÄÅÅW¯^€1 «©©aöŠõcݪF~úIæ÷ß]ûÍ:8øé¾}·Oœˆsw7Y¾|ª°0J0ü´§C&“»¶Ókþþþß¾}ãx0ÙÙÙø“Ô¼¼ì?B0Çùòå›7o–-[–‘‘Ñû¶Zêáíö¢“ÀÝ øaf7ü &bYu(š\aMËSVAU6‹å”3@f5Ëè‹P•Åb¹éUÒ`±<ÎÊÓY,ŸõDDZX^šòoû¼£€Wx„€( |">g63¸xYw‰±$ ×Ýš‚ ÈpVVVóâÅ?ÉÉô”zFÆç¦¦q Eù·ßf)«©I ÍLàÈÐÑÚÚ:{öl¥¢¢òùóçsçΙ˜˜dee1'\âææ¦Ñh1PŒ¥AÞÜ®¥+ùXÃÈ­/Ï©/ɨ-Ï©k¬n1õ‘×vdñÄ¿‚z޳»ºÌ`Äž|èÁƒ³±Ì–ÔevŸ_ý5""âðáÃÓ§Oˆˆ`ÞSî~xíò ñó󻸸8::FGG'$$àO¢Œ=ºÝÀÏÏo„ sçÎݳg¬¬lbbâ¾}ûÚÕY´hÑž={´´´Fµnݺ¹sçvÿ}uu5ƒÁ€šš???}}}99¹¦¦& …¢®®ž‘‘o®¬¬ ÿä‰D __ß5kÖ¤¥¥¹»»S©TYYY‘¤¦¦¦¥µŸ½ÃÖÖö×_Å?9ø’ÐÐPSSSeeefIUUÕíÛ·8€ç©b¹kK–,Ù¹s§²²²ššZhhèÎ;‹‹‹ñû7oÞtrrÚ»wo7w¿;ñ·U^^ÞÙ7¨¹¹yéÒ¥K–,™4iœÁMƒƒz6‡®ž§Å› ߀‹·ÓIð€OÆX²XÎÛÉ-’,`¬®üF cT`±œ§“k,Ê9hªü÷y)à&þÛç$ ˺¾éUÖË;Ã+ܳú‚ ÈÈ•—÷ýÕ«¼×¯óSSó22>·´`ªª’††Ê‹›*«ªJöûhPd»xñbNNNvv¶   HJJž:ujïÞ½<<ÿó„@ t™ï¤wXÞ‚¸Í!í¼¿ö-õÔ—¦Ú.‚ˆ2QL¤8e”˜:IRý"î«.3±„'ZºtiÇìAl²%±A BBB(ÊüqæÌ<ûQÂë˜OˆÁ`Œ3f̘1?ÿüsii)êrî))©„„Ÿ™3g644L›6-22²Ý‘÷öö®®®¶··g>×ýö™y‰H$’‰‰Idd$@8{öìúõë}}}'L˜@¥R+**lmmÛEýí·ßh4Z``àÖ­[ëêêìíí †©©éõë×;nBXXxÆŒ999ãÆý;jÓÍÍF£)++3 ÌH¸¸¸ÔÕÕÿøã›ÎvmË–- ®®®ß¿×Ñѹ}û6Þ½ñûï¿oÞ¼ÙÇÇçøñãgΜéÎîw'~&sss==½¢¢"æ·£­€€€ââ üO%%¥íÛ·{zzΘ1£m—•££c@@ÀªU«:¶À|/ ‡YDD.œ´pᤢ¢ò?ÿ|}åJb^^)×PîÐ9yòä¹sç6oÞÜØØ8~üø;w.X° m_~ù¥®®ÎÏϯ¡¡ÁÈÈhýúõÝl|ß¾}Û¶m“––f`ãÆ@ äää¼½½ñ)‚XnÂÅÅ¥©©Éßß¿¢¢BYYyÿþýølë֭ß[]·nÝ­[·ºÉ‚ üüüª««uttvïÞͦ²žžÞ²eË¢¢¢zwª$à‹!‚´õý{upð“Ë—š›[œ)æJJh ΈˆˆpvvîŹŸö„Íe–––………··7‰Dº}ûöš5k*++ùøø‚‰‰ÉîÝ»~íÚ5"‘¸jÕª/^$%%á úøøøùù‘Éän^y P0£F¢P()))JJJ—/_f>wÏ‘##""bggwåÊ™ÐÐÐn΋Í>Ôððp'''({Ùg!ï 4×À¢ JÚ ,bû¸9AêêÓÓ ^½ÊKMÍ{ý:¿¤¤ŠDâ7NÞÐPÉÈHyÂ%11ANLj 9ŽŽŽ€~gcúôéT*•å«ÌËHf‡~3tß¾} ÃÒÒ2((HJJŠ@ Ðh´… ¶-0;¨˜åvÓ‘-_¾ß ³e|ÕÎ;—-[Æ\ØnZ³¦¦&–#Ï:ÓÍßÕ-ù+ˆ¢Üò¦#á©£–F¬êsCeaCUa#Y†OÑœÅN}ÿ»¶,«Nâ'e"êÿî7muVf¹ÖË—/) ‰DŠ‹‹Ã'­ª¯¯'‘H>|˜0aBÇ…ÚÚÚÝ™êÓÍÍ ÏŠ„O¢Õexm ÉÉÉFFFÐæ‹¾aÃ~~~ ‹+Vô}nù‘¤×w3†#;;; …²mÛ6N2r°ùü`–ššý*:úuEE! Àapç$ìØ±cêÔ©ƒ¶ÅÍãÇwíÚÕîÝGÏc!‚„yëÖ9¿ýfý矯OŸŽ¿pᙑ‘òÚµÓ--µÑ€ÖãåË—d2ŽÛÌ̬¡¡¡²²¿âg|óóó?~<œhinÔ… ‚Œ(åå5©©yÉÉôääÜŒŒÏÕÕ Â¤‰U )}}!!”ÉéUUUmS¬3ïY———w–‹åðáÃø¨¦   ñãÇ———3§d?`—Ó‘á#¨Ú-l7­ÙÅ‹YŽ¯ê©æ†Ö‚ç•ÙwË žW´4 ÃZ‹›@è"w g4×µVm¬+m®ùÖX[ÚDÅ£aâ3»µ «)n¥H”7%$Ç',Ë/,ÇÏ'4$w éËìAl²%±ÉîÓÐаhÑ¢cÇŽihh˜››ÛÚÚ*))õ1<}}};;;oooCCC ÈDôÓçîÝ»‹/Þ¾}»¢¢"§céÖÖÖÃå):^^nKKmKKmN‚ t'A®Q(*ŠJFÆç?þx¾}{ô¡CwÝÝM–.5Es¶ cæææÆÆÆ‡200hwÁ|“––¦Óéx—UNNóUkkkfÙÈȨG“÷{0 CXX¯ý0‚²×Á¨¨¨444@SSàó ! çz»áë#Èù ¯W¿¥CAŽèøÐ@PWM¡(/\8IOO^MMŠ››‹Óa"#œŒŒLVVsf°òòòÚÚZöOW¨©©á---øò勨¨hw¶´aÆÀÀÀΦ#ÃGPµƒüúíl|U75Õ¶ä=ªÈ¹WV”\…µb¬øok|M¯W€Áš’£µk¬limÆ$Y\Ü~ÿ»6Þ7¯æ[cSí¿“lsqHâ<²a–ýXRº‚³O÷ë¨2„Xfê,[ûì>~~~šššóçÏ€Õ«W/_¾üÁƒ} /$$ÄÓÓóÌ™3²²²4­mGø ¥k¨jn¬li¨lÁ di¾1$Q¡æÏŸ¨P¨ Aîúé'™ƒÖ¯ŸqþüÓsçžœ;÷ÄÑÑhñâÉjjRœ 馦& …¢®®ž‘‘±oß>(++k;rÍÕÕÕßß_[[›D"yyyÁ#RËËËñ ¢¢¢ñññjjjŠ'/Ì` íììÖ­[hhhˆÿ°çT0¶¶¶øéÿػ󰦮ôàïMÈ „]ö5Y"kв´(Z­Pi+ê¨h«NÆ­–¶ZmGªX~NkÝ«Ó jA­SuZÐ:.¨Tâ‚T¤ ¬ !ìY\›2¨¬ay?OŸ>7çž{ï7!ä½çœ±c·mÛæççgkkÛ÷0Ý!(0&ÆD€|74Ýíÿó#„BL"i‰Ä]1™´À@§™3;{sóÞ¬P¯½úê«»víŠ%§˜ær¹999ÝRZZJ¾ë+..&ÂÎÎNk7òÞöªª*M˳ӑ=uˆ¦XÕÙSÓšuuU÷ÖÝSŸ-_üÏ ø*…º2GÚÓ"–¢]¥”©eM ¥L­hWÉ[•TÅÂKËM:~úìA‡T)kRtH•R¥¼U ¦nú¯r¶¿¾Íyб9MŸüÏŒÆ2¡XÝò:ìèj»›£h4ZJJJJJJç½ZàÂ… ÝœóÓO?ÕlòÉ'ÏïÙÎÛ“&Múù矻¹è𢒫;~û÷(kRt4* ,iVþZ~—e5\ÜX¡hÿŸ•›)4‚e:ÚêX¡Áu,„PÏØÚoØ0ãÝw_ÎÈÈûç?/ýóŸ—BBxo¾2eŠ'Þ!;¼ìÝ»wåÊ• þþþ‰‰‰3fÌ(**ÒtHLL¬¯¯ˆˆàr¹©©©ÙÙÙ4 :Ï©¢YG*666--­×Õš^‡IKK[ºté®]»¿ùæ²³®Â¬]»¶  ÀÃÃÃÏÏïðáÃýæ¹Ð ÁÄÏBõ•J}÷nH$ÎË+']€ƒƒi` SLL`` “‹‹…ž¾¥D:“””äïï¹qãF›ÜÜ\ò®¦n¬]»vß¾}AÄÅÅÅÄÄp8ÍmLš .—ûÝwßÍš5KóÑ9t1Y7S¢iÕÕýU]iz kûÁb‹WÖù ÷ŠöòUg*•êøü_žjäØÐ#¶8?Û¹¡¬ýè¬;϶s˜1GµLúD¥S(4‚ëÄ`p †Tº!•ÁÑcRY&ÚgÐ7£ù/µêò¹¡ah€–áú«û µJ-kVÊš”²f¥¬Y)kRÉZ”úf4›´Ô¥î“œKº§hûߺ”á:ÕDkËÂ[?xæŸ-ÃPaHÕcáop„Ð@Á:B¨78æ’%aK–„Tîßñ/9ÀåêÏš%\¸0ØÖö¹¦Ñ@í§3ŽŠŠŠŠŠÒ<Ô¼Ñ×È`0víÚµk×.(,,$â©9UžºD7Óè \˜ñãÇ<{B„100øî»ïzf”P(4­óºå$‚ žmì¼÷ÙÆ~™Ç²†T„^ÚÚd?ÿ\uãÆýk×ÄׯWÔÔ4R©>ß2,ÌÍßß1 ÀÑÙÙ\×zÂÂÂâÊ•+k×®2eJGGÇĉ9¢™¸O«•+WN›6­µµõ•W^Ù±ctºI³ñÅ_¼ÿþûk׮ݶmÛž={ÈŸŽ¬û)Ñ´êêþª®plèôÉÅÓÿv_Ò.Qt*eiGcQŸýÈ›i¬ý£$¶}Ò'=…J§Ð9T* ±(4}*…¦½´¦oN›´y oöBCÞ-Ã3ŒV÷y~ŠvUË#¹¼EÙ!}R—’·(eÍJ¶5©e2Êó§ãŸ£I¥Žá\­u,³±úÁt®KQé=š~—u)Ž ƒcƒ‹4#„Ö±B}"Ø}ñż„„¨ôô+ÿú×åÝ»ÿ;i’Ç’%a!!¼îïDƒ¦×7£yzzNŸ>=))©¥¥%))iâĉÝLöíââ†azfd£R©iiiÏ®^Þ½§f°ôññ€žžä•––òx¼?¬H B˜ÊÊÊ·ÞzëêÕ«NNN;wî íÇ“#„Ð`R«Õååµ7nTܼYqýzEQѯ …ÊÐåïï;> ÀÑ××Ãaþñ‰Ò;;»ƒvnéfz1rcîܹÝ÷%·çÍ›Gn<;Yç)ѺŸß¬óv÷wž=EÖ¤”úG´K ñ‡Ÿô³mèÂݰ3š>Å9ojDè¹´7*êŠZÉñRò•¢C%oUÊ[TF ¯?iY»¡:¿ù‡e¥š‡z, M¥³©Öþ­u, ~ħÎt6•aH¥Pél*M¡Ò»¬K±ÇÐù¯Ž®Å½Bà ֱBýÀÒÒ0>~j\ÜÄcÇ®ýóŸ—fÏÞíåe3þ„×_÷g³ñëõÍh«V­²¶¶V«ÕÁÁÁ_~ùe7KKK»Ù‹aF9‚ æÏŸßÓ£žšÁ²óÃþRQQ±fÍš!æwÞ¡Óé………»vízýõ×Åb1›3Ë#„†û÷ë¯^-/(¨*(¨,,|ÐÚ*c2iÞÞ¶aanï½7U °µ´4ÒuF„F Ý_t•9¾á§“§gºÿUÖ¬€º\«­V~9¥’i¤ÇàR™Fz #=&—ÊäÒ86ôþ2 aJ™JÑ®–5+©tBßL˨ǦEßÖÉš”ò6•¢U%oS’Û¦n¬‰ŸhwØPÚNÖ¥èT›,JéÑÙT&WûGµ–öë‡Üél*C¥³©åîf™Ðœ&õÿß,!¤+XÇBõ}}zlì„ØØ —/—¦§_Y¿þøÆ'^{ÍoþüñöåŽÑPæååuöìY]§xà µµµææ¿ÏþéããC_{ôè‘Í;w8pàÀ¶¶¶)S¦lß¾ü0…œBÃá¬Y³æðáÃ*•*))©¿Råçç¿÷Þ{7nÜhkksqqY¿~ý¬Y³È‹ž?>666!!¡¤¤$--F£}üñÇË—/¿téR@@€££ceè{˜ .¤¥¥ÙÛÛ'$$lÙ²¥°°ð…^è÷x!Ô_ÚÚd×®ÝËË{R»ª©‘ÁãY ¶¸ÒBƒ¦G÷W‘}åɇ_þûþž{ç%ù_U×·Q¨„J©Öú¡8A!ÊÚÚe{£B¥P€¾m^¶÷³å­ª;™µä‡ìt6…ÎÖŒ¡ÒÙÔ¾>U„úFѦ’Ük—·©TrUG“R%S+ÚU²%˄ƛ®e&Ϻ¢Ö׈m*¥\%kRjÚ-¯þÓíÙþò6Õƒ«Mt6UE¡±(LM¥±(]M¾géc°ðü8:çyÿiÐô)¦núÏÙyHÁ©zЈôñÇüñǺN1º` !Ôÿ‚ƒ]ƒƒ]›šÚ¿ûîfzzîÔ©wq±˜3G8wn±±®Ó!„zãÒ¥K;vì¸uëVQQ‘¦qöìÙ›7o&ëXG >vìØ7ß|sôèQcc㸸¸%K–?~\Ó?99ùøñãÇŽ³°°xûí·û+Ûœ9sÂÃÃ÷ïßÏb±N:µ`Á‚èèh:ëÖ­;tèPvvöÉ“'³²²˜Lf\\œB¡ $äõï_V½SVVFÀ***¢P(VV¸Œ9BhhQ«Õ%%5"‘˜¬]•—?R(TÆÆŽóç dz74ÄÙT½¾¿Š¢G8G;GWç7çÿ£º2WJ¡d™ª3Ûñœ?rÔ<”µ(;$JE»´é*о­“·(å­*¥L¥içØÐçœðz¶{ƒB´ëW=…Ê è*•F¡±(zú‡jŒ#8G¥LÝZ+S)@ÞªT)Õò•J©–·*=­ë9I+;D;~%ûG©•jY‹Ê”Çš¼UËšv âöÇþ¢yH¥zL MŸjêÆÒZÇÒ· }ÝLI¡Ò º!•J£è1)4 Ý@{åÉÄ•õZºûó?_ •xþ"Ö05a„ŒŒ ]§@¨ÿá7¶N` !4P8æüùãçÏ/‰ÌýûßOñů½æ;ÁÓóyçXGéV[[ÛÁƒwîÜÉårãââÒÒÒ:ï1cÆÛo¿]\\ìææ–‘‘ñæ›onÞ¼yýúõä@¢/¾øÂËËK*•’ý<¸aÆrï¸qãú%äÕ«WÙl6•J€ÐÐÐŽŽ©Tjff«W¯ Y´hQRR’ŸŸìرC ôËuû7Œ‘‘”””Ì;÷ý÷ß···¸!ôœ?n¹~ý^^ž8/¯ü—_65µÓhTûÐPþ²e…Bg\K¡ámŒ{êv×ÇwÛ 3jKN>µZ¥ü­šE€‰ëÿŒÿ P»úØcèsNx’Ûj•ZÖ¬"kZ]õWÊTM:í*¥LÝ!Uª*E›JÞ¢2´ch­c5V´g¾~§sÝKEŽ5=âS-u‹öEAz Pé=hl …BÐ9TçÉZÖñR)Ô-5²'OBÐ~{¦ºyÖÃù5"·ÉŸÜ¦èQ ,µÌ›×Þ¨¸wVò¤¿J-ÿíX–‰žÖu•¤U—6ÝE»š¬kÊš•j;1_Þæòl‰¸ýÛ¹E϶›ðXo|3öÙv‚J•N0 AcS A7 ²L´ÔiÊcÍ9áIeR¨4 Ãð¿ ú¦´qoZþa7Ô [[[rj „FüÆÖ ¬c!„\` S` Ó–-³NŸ¾žž;eÊVggóèhߘ˜@{{ü죟iY"‰Fy˜çGÄÐ98²³³cccçÌ™søðaww-wN›6íØ±co¾ùæÍ›7ÿóŸÿüõ¯uqyòw)¹QUUåááA¶<|øÏç“Ûš¾“H$)))—/_.--}ê´d5¨²²ÒÙùɧ<¯¿®Û¿a¤RiJJJZZZJJŠfx„d2™"?ÿ~AA9F öö¦B¡ST”@`ëåe«¯ëâ 4Ò˜ðX¡‰ö>o¹}èÑ/ÿ®U)@¥PƒÌÆör3‚B0 ©ÝW ,é¯ìêÁ3–)mÒ'E»J%SwH•J¹JÑ®}S-Eµ(\m"«5j•ZÞ¢T+AÖ¢4vai­c5VtuçÙvcÖÌL-u‰¸ýÄ¢âgÛ¹NÌW¿Ò2ªãìZñ³í†vŒI›µ¬ŸÔXÑþÊ2-çwdLýÂõÙö†òö“‹µæa½ú•–7Þ åíÇfk«¹²ÞÈÐò|ÛêyÛÛë|\†Ö:•þdJ==:…Ê$€n@%(DWë?92^Kw'(M!Ïß}‘cMŸ´EËëÖ èjŠ?„BCÖ±Bƒ„ÁЋŠò‰Šòùù窌Œ¼¯¾º´mÛ™ðð±11S¦xÒéøã¨444ÆÆÆçÎóññGË< ½síÚµÀÀÀ§Züýýu 4[[[¡P˜íèèhiiil¬åþÙ³g§¦¦²Ùìèèh6›mkk[^^ ååå`mmÝù„%%%äx¬ÒÒÒþÊ”ššêëë«V«™Ìßgµ¢P(`ee%‹ÉTeeZ>èG½ SQQÎb±®\¹bg‡ "„UEE=9U H$.*úU.W²Xtr¶@ÀN °µ´Ä ¾86ôñïÛú-µ*:Vûsú£v‰¢«¡-:AgS#´¼튡-£Gó¼qléšþÇ*Ñôµ/õÇ4Ñ®Ð2ÑÃPû‹¦Ç¢he¢½Ç0Òûº™–ëvQÒ7£iÍChhÃÐÔ)4‚Æzò4©tíÏר™¹à\fS0° …&ô`‚=¥×uS„B#ÞzG‚%¼½m½½mÿö·×._¾{äˆhÕªCjµzòdÏ™3&NK¥âzà}Âår5Ûl6»óÃ~áëë«©NUWWÏ™3§›)Ú:ŒNQ[[KN7âyzzž:uª¼¼|çÎÞÞÞ/¿üò²eËÈ ñ4¢¢¢/^¼cÇŽ={öÀÂ… 7nÜèîîndd´bÅŠÈÈÈÎ_÷ØØØ¿ýíonnnñññšöôôôàà`'§ÜPÙ™\. …<¯¨¨hÓ¦MðøñãÎ_£yóæ%''{xx°X,òºÝ¬‰¥“0~ø¡X,>xð ‡Ã‘H$Àáp¨Tjà „Vmm²k×«‚‚Êš)A<ž¥Pè´xq¨@`çâb¡§‡oÉ¥†TŸ·Æxϳ,Ëz¬o¡½Ä2"õ´ŽÂ4Òs×Vgꊾ©ö:S—ççêõh^;†!µGyºª«!„BCÖ±BºA¡¡¡üÐP~bâ«ÇŽ]ËÌÌ[¸p¿‹‹Åë¯û¿öšŸ£ã¨(èV~~þ{ï½wãÆ¶¶6—õëד3üqþüùØØØ„„„’’’´´4öñÇ/_¾üÒ¥Kš²D||ü† h´~øãVk•Jõé§ŸîÛ·¯ººÚÛÛ{ëÖ­ÁÁÁZáËKšm‚ >üÞ{ï566._¾\ ÄÇÇ777ÿùÏÞºukWGu‰,~˜››×ÖÖr¹Ü>úèÀmmmS¦LÙ¾}»©©içð£>Z´hH$6›­§7\ç:;;oݺuãÆ|÷ÝwÏŸ?ßy¯¾¾~dddnnnxx8¬Y³¦¹¹ùµ×^Ó¼,;¯]»V"‘¼ñÆ*•jëÖ­§OŸ&ÛcccÓÒÒz]­Ù»wïÊ•+üýýg̘QTôû4)‰‰‰õõõ\.7555;;»›ï[„!Whï< 9¹eà „I¥Rß½[CNXPPUVöH©T™˜øû;.Yè4v¬5‡Ãüã!4œUUUeffê:…îåææ>O7*Ð:YB!„¨Bhh¸y³bݺ£žž VVïDF~ö\|ôHªëPº—‘‘Ñ»ŸÕ ‰ºéàææö—¿üE,WWWïß¿ŸÁ`tttN˜0!'''11‘Çã]¿~½°°0,,ŒJ¥v>á;wÁ€†ùüóÏíìì.\¸ðàÁƒÄÄDSSS¹\®µ‘¼Dmm­ærä6DFFÖÕÕ=z¦M›¦Ù.++ëæ(‘HÔÍëCvÛ¼y³‹‹ËO?ýT\\ÑÑ~ffl]GÓÌÌÌÙ³g÷âg5AäxŽ®:466²Ùl*• %%%nnnš1LGŽ™9s&ŸÏOJJŠ€ŸþY t>á[o½¼dÉ’ ¿xñbP«ÕFFFžžžÏ6ÑÕx¬sçνôÒK*•ŠJ¥vÞ&ótu”H$âñx]½>äŸÏOLL\°`zyy566j^ÀÎOðþýû{öìIKK _¾|¹P(|Î×-##ƒ'7²¹ººæææš››wß-++kÚ´i϶'$$$''ws §§çôéÓ“’’ZZZþú׿J¥Òüq$…A!Éùù÷Ée®òòÊkj¤àà`è$Ø …NcÇZÓhÚWIA!„B¡!k¸Îq„©(B(t ×­›ž}ûøñ7žØ´éÔ”)žÑÑ~áác üÁÕ?$IJJÊåË—KKKù|~ç]öööPYYéììL¶ðx¼Î;¶mÛ¶ sïÞ=777r› r>C­Ý`³Ù@¡PžÚî]¤Î*++]\\Èmr£ªªÊÃÃ~{;³··ß´iÓ† 233—.]J£Ñòòòž'Æ(QZZú<ݦNÚ»ûo222V­Zemm­V«ƒƒƒ¿üòË!4jWT’µ«¢¢_år%‹Epœ?¼@`'ØZZé:#B!„Bõ ~Œ¢X,zt´_t´_CCË©S·Ž¿±dÉ?Y,ú¤Ic_yeܤIc ºÎ8¼………¥¦¦úúúªÕj&ó÷U1ÈJ•••X,&WŸ*++ë|ìwß}7~üxCCà cmm-‹CBBÈ>‰„Ãáhm$GM‘E…ªªª]º«£ºy}H¶¶¶åååäëS^^N&wuU*+..¾råŠT*={vB¢>òòò"  †T„а#•¶]½ZNÖ® *kj¤ áêj):-^*عºZP©ÏuÇB!„B XÇB uÆÆ±±bc'H$­gΞ:ukåʃJ¥ÊÏÏ!*Ê'*ÊÇҲߪ)£Š\. …<¯¨¨hÓ¦Mðøñcr†=Ò¼yó’““=<~Ü’ýó÷ßlÜxbãÆÁÁ¼éÓ/¿ì=j×Ðê½{÷®\¹2!!Áßß?11±±±qÆŒEEEš‰‰‰õõõ\.7555;;›F£‘»rrrþô§?u>[lllZZZ¯ëXZÃtttÌ›7¯®®ÎËËëÔ©Sl6ûƒ>x¶¾øâ‹÷ßíÚµÛ¶mÛ³gÏs^·›£ºz}ÂÂÂÁƒÖ¬YÓÜÜüÚk¯µµµM™2eûöí]]åûï¿ÿᇶnÝÔ»×!„Ш"‘´Þ¼y??ÿɵµM ÁãYúù9üùÏa~~|þt…B!„%ˆÞ-í€BCA{»<'§ääÉüÓ§oK¥í|þ˜É“='Oö tÒŒî233gÏž­óŸÕ………ÞÞÞµµµ¦¦¦Z;qôèÑ7ÞxcƒlAdddÌš5K·žm‰Dfè„A wŠÛ·«ÈÚÕÍ›÷ÅâZ°´4òñ±óñ±®•X IDAT÷ósðñ±çpžžá!„B!„F…ƘLÚäÉž“'{¶µÉ.\(Îξ}øðO;wžåóǼü²×Ô©Þ>>v#¦ ÕkYYYÓ¦M{¶=!!!99¹›===§OŸž””ÔÒÒ’””4qâÄ®ŠXàââ6pa®444ÆÆÆçÎóññ‡Ó—8{öìêÕ«ïÞ½ëààðÙgŸiý´0$©TÊãñþóŸÿtS”„0 ,HKK#·§OŸ~êÔ©~<9BH·::·nÝ'׸‰Äõ`nÎññ±Ÿ;÷…À@'wwkCC,\!„B!„Ö±B#‹EŸ:Õ{êTo¥R%‰³³oŸ<™¿}û––FS¦xNêìJ§ÒŸxS§NíÝp®ŒŒŒU«VY[[«Õêààà/¿ü²›Î¥¥¥éJçE¿ÈuÈúý‹/^¸pa\\Ü¡C‡æÌ™S]]Íb±t†”œœüèÑ£îû B˜ÒÒÒÌÌÌÉ“'€fVO„Ð0¥R©ïÞ­!«Vyyb±¸V.Wé …N3gv­¥¥‘®c"„B!„Ѓ“ª#„F*•ä²aÃŒ+W®^MZ¶lâ½{uo¾¹ßÍíÃÙ³wïÜy¶´ô>›F^^^gÏžmjjjnnÎÎÎvvvÖu"4¤åççGDD˜˜˜°X,//¯ÌÌL² ˆ .ØÛÛïÝ»7>>ÞÂÂÂÆÆfÿþýL&óÚµkpëÖ­õë×3&..N*•ŠÅb†€²²²ÖÖÖ¾gè{˜ÒÒR@```Àår ú1BhpwnÍíÛX?uòdO,b!„B!„V£ttBh4°³3Y²$lÉ’°êêÆ3g Ïž-úì³Ó›6ýÇËË&"ÂcÒ${ e´Ï:ˆP™3gNxxøþýûY,Ö©S§,XM§Ó`ݺu‡ÊÎÎ>yòdVV“ÉŒ‹‹S(äFFFPSS“™™immíää¤Ã0°oß¾-[¶ìܹ³ï1úF*•ÖÖÖ.X°@$9::~ýõ×!!!ý !4@[óòÄ•ä„55R …puµlcbœÍi4ª®c"„B!„Ðp‚u,„ÐÈ7fŒQlì„ØØ J¥ª°ðÁ™3…gÎÜùüó3,-8˜7y²çäÉx4B}tõêU6›M¥R 44´££C*•š™™ÀêÕ«CBB-Z”””äçç;vì ª¨¨øú믻šTppÂ\¾|9&&¦?õ. 9W§··wVVÖ–-[æÎ[^^®§§Ëwn¹¹¹•••: €Í„ lmmubxÉùùO–¹*(¨*+{¤Tª,,8/¼à²lÙ$ÀvìXk—¹B!„B¡ÞÃ:Bh¡R)@`?õîÝš¼óßÿÞIH8¶nÝÑÀ@§—^ré%w//‚ÀAZõ˜D"III¹|ùrii)ŸÏï¼ËÞÞ*++5³Sòx¼§///ÿöÛoçÏŸÙ÷µ¦z¦¹¹988¸Wï—0~~~šÅäÖ¬Y³e˱Xüìë6˜þþ÷¿=zT‡РÉÈȘ5k–®S Qjµº¤¤†¬Z‰D⢢_år%—«è5—¹B!„B¡~‡u,„Ð(ÅãYòx–qqáRiûÅ‹ÅçÎýòÏ^Ú¼ù?ææœ_t Æ75eë:&BÃFXXXPPPjjª¯¯¯Z­f2@¡PÀÊÊJ,“U¢²²2ÍÞÆÆFr¸Ò+¯¼ÒÞÞþðáþױzfêÔ©šíÀÀ@‘H «0‰ÄÐÐìúúú}LÒw3gÎûì³€€›¾‡A=¶6Ùµk÷òòÊq™+„B!„Ò9¬c!„ÐïLÆÏŸ?^¡PݸqïÌ™;99%þÄ`è:……ñCCùÝ`F²³³›9sæ`^õŽZ 7ªÇl ;oÊjµšt0ª[Ø¿6qjZ jZ jZÙ5-Í2úóŸsæÌ™vvƒúýÖ{÷î]¹reBB‚¿¿bbbccãŒ3ŠŠŠ4ëëë#""¸\njjjvv6F€¯¾újùòå›7ovuu=räƒÁ€ØØØ´´´^Wkz¦óP0Í¢Vº “––¶téÒ]»v~óÍ7dç>†Ai%—+oÞ¬xj™+{{S¡Ð‰\æÊÃÆÍfè:&B!„BF„fé„BZÕÕ5çæ–ž9Søãw$’VrVh(ÿÅÝ qåvô¿šJ ;äA­ú­‰ÔJ5€žèÛƒ‘;pÜ`ÌD3YwYu©°°ÐÛÛ»¶¶ÖÔTûd\A=zô7ÞÀ0: ór`(Î+8â1ÖÇê¼ÌUAAeaáƒÖV™±±A@€£@`‹Ë\!„B!„ÐÐã±B蘙±£¢|¢¢|”JUaნœ’‹K22ÒÕjµ¯¯Ã”)ž¡¡|oo[\Ppøq΄€¢ÔJPuªi(Z@ZÒ_Ô`ù¢ŽRöIVVÖ´iÓžmOHHHNNîæ@OOÏéÓ§'%%µ´´$%%Mœ8±«R ¸¸¸„……a˜^‡A=«¾¾ùÆŠ‚‚ʼ<ñ­[•Ri¹Ì•@`·dI˜Pè„…+„B!„‚p<BõFMMãùóÅçÎýrñb19H+<Üý¥—Ü'Làá¼C$?á ×”²žAÑÓ`ò¥Á¥c·oß^µjU^^žZ­Þ½{7¹†Raºã±F‰‘4K.WýzëVe~~e~~EIIR©²³3ñõµ÷ñqðñ±óö¶50ÀßÚ!„B!4¤a !„úª¢¢þÌ™Â3g ¯^-W(”^^¶¡¡ü°0þ /8Óé8ìu´jȇ3a lí²”59ÌC7B}‚u¬QbX×± ÕÝ»5•·nÝ¿u«²°ðW™LajÊ7ÎÎ××~Ü8{{33¶®c"„B!„ê¬c!„P¿‘HZ/]º{ñbñÅ‹%÷ïײBBxaanaa|GG3]§Cƒ®.ÎNUÇÿÌ+„˜ÁäÅB¨—zWÇR(4­¶¶Ö̬? öãi ‚‰DýL«®ÒÑï¯Lß ¯:–L¦ÈÏ¿O®qUPPU^þH¡PYXpƳl…Bçqãì YºŽ‰B!„B¨÷p Bõ.W?2r\dä8¨­múé§²œœ’Ï??½ví33öøñ®¡¡üI“ÆZYqu ³ñðÒ)87ÔЩ”¥V@C>Ü|ÜÞ}[ÅChPP©Ô´´4‡3ÄO{íÚµÀÀÀ§Züýýûåäô"ŒNr¹òæÍ MáJ,®•Ë•&&þþŽQQã;À—¹B!„B¡‘Çc!„Ѐ«¨¨ÏÉ)9s¦ðâÅ⎅ƒƒih(?4”>Óùž†óÓA­Pƒ±&€müòtԂß`ì{ÀõÖuÊ^"âÙÆÚ2,Â<«óˆœA4F꼂ä—Ã××·©©‰l©®®ž3gŽH$¢Ñh}iõ‡T*59U Y»*,|ÐÚ*32Ò [,\!„B!„ЈGÑu„ùLçÏàÀ’¢¢Mq‘‘>Uqq_{x¬›1ã‹;ÏTªTxWÁe5B2~+±¨à›c߃èJ=wà{œ 'Ÿº†•†ßÀ¹sçÈm__ß~¼„J¥Z¶l›Ívww¿råŠÃ\»vø_ׯ_þÃGψ‘H4~üx}}}GGÇýû÷Auuur¹<>>ÞÂÂÂÆÆfÿþýL&óÚµk*•*%%ÅÅÅÅÀÀ ((èòåËäI‚HOOï¼Ñ£Ó’{Ož‚¨Õêââê#GDIIÇgÌøÂÝýÃðð-kÖ)(¨ì6ožyîÜšÛ·78°$>~êäÉžXÄB!„B¡‘ çD¡ÁÃdÒÈ‘XP_ß|åJiNNÉ¿þuù“ON™˜óBCù/½änkk¬ë¤¨_Ù½Â=·,^³ñl¢Àz:T‡Â¸ð*D\‹P]gí.÷÷I2Ùlvç‡ýeÛ¶mW¯^ÍÏÏ?|øðâÅ‹‹ŠŠtÆ××—,’ÁoãuÁóNÄüùóû7ÒÐ4gΜ˜˜˜ãÇ_¹r%&&&**ŠlOMM=yòdVV“ÉŒ‹‹S(°}ûö]»v¥§§»ººîÞ½{ÆŒÕÕÕzzziiiÁÁÁ ÙèÑiI;wî¼qãÆ¥K—fÏžýç?ÿyΜ9áááû÷ïg±X§NZ°`Att4N*QQѵk×þñ<Õ~éÒ¥;vܺu«ó7áìÙ³7oÞœœœ G >vìØ7ß|sôèQcc㸸¸%K–?~\Ó?99ùøñãÇŽ³°°xûí·ûé% Š‹«5#®Š‹J¥ítºÞ¸qvÝüùã; ==¼!„B!„F%5B!]»w¯.-íÊÛoÿËÍm­•Õ;AAß?ãĉ›mºŽ†úÏ/Ÿ«‚ºö²ö½rÔjÕàêO ‰ºépóæÍI“&3™LOOÏŒŒ ÍçÏŸ·³³Û³gÏ»ï¾knnnmm½oß>ƒAž0(((##C&“ …0‹-úöÛo»ÏpâÄ ccãíÛ·kkkkŸMØÐÐ —ËŸÿ êÊÌ™3gΜù‡ÝLLL>ûì3r»¡¡,,ÕÖÖòx¼¯¿þšl/(( _„±cÇîß¿ŸlT©T *•ö=:­Z­€ãÇ«Õj¥RIö”H$ …‚ìY\\ÜÕ—ãÍ7ßÜ·oŸæakkë¾}û|||^zé¥g¿™Læ/¿ü¢V«Ã¾úê+wàÀrïíÛ· ±±QýÛWßÉÉéÿø¹÷Ö­[š C hþQtåòå»§OßîËUjj¤§Oßþ¿ÿûaÖ¬]îî묬ޱ±Yýâ‹)￟‘™™÷Ë/e2E_ÎB!„BhÄÀ»BH÷ȉ÷î]xóæÇ.:Õûúõ{ùË×>>ëÿô§=»vý÷öí8ñà°ç¶ ^:f´ï5ù}îÁ‘hΜ9<ïÆ÷îÝ[½zõ‚ d2¹kݺu‡ªªª"GÕœ9s&--M3ª¦¨¨èûï¿×××wppÈÉÉÑmM¤k×®½öÚkÝ_… ´ÿþÕ«WwtttÓó§Ÿ~ruuýä“O=zÔǧ6ìÚµ+%%ÅÁÁáÍ7ß¼sç•J%Û+++ÉmGnÜ»wÏÍÍÜ&‚Ëåj]笧§%ÙØØ…òäí®D"ILL ³¶¶îj,Tccã±cÇ4KCegg;88>|øÜ¹s³fÍzj²ACCÃiÓ¦;vì×_½yófLLLee¥‹‹ ¹—ܨªªÒôøð!ŸÏ'·5ÃKuuãÒ¥fÎÜùý÷=:°¾¾ù̙­[³.Üïë»ÁÇgý›oþãäÉ[––†ññ/ÿûß+Š‹7Ÿ?¿æÓOgÅĺ¹¡Ñ¨ôB!„B /8¯ B !,=<Ü=<Ü=jºx±øâÅâ}û.&'ŸÔL<Âst4ÓuRÔ+ÖÓ{|Híeh¯›W¢e©žaäêÕ«l6›¬=„††vttH¥R333X½zuHHÈ¢E‹’’’üüü`ÇŽš)ûššš?~\[[»k×®yóæ•——ëéõõÝK¯Ã>ýôÓ+VüáUþò—¿XXXDGG+Ц¦&ƒÑUÏ©S§^¼xqÏž=þþþáááË—/ …}|Ž:4uêÔŠŠŠ[·n?~ü¥—^‹Åd»•••X,&' ,++#­­­ÅbqHHùP"‘p8Mª×§%=U JMMõõõU«ÕL&óÙ«|÷ÝwãÇ744$ÚÚÚ …ÂììlGGGKKKcc-“¾Îž=;55•ÍfGGG³Ùl[[Ûòòr2Oyy9ù5mmmKJJÈç[ZZÚý+9ÔÈåÊ/¿<ÿÿ—-—+@$wß_"i‰ÄšÙkj¤Àçl—-›$ØŽkÍáhù* „B!„Ba !„†( ÎÌ™3g@M4/¯<'§äïÏþàƒL33öøñ®¸˜Ö¨Ps~þ˜æà²\þ öºÔK‰$%%åòåË¥¥¥O C±··‡®GÕ°X¬U«Vq¹ÜåË—'$$ˆÅâ§ÆÜ føm¼Î¶mÛþð*O êž½½ý¦M›6lØ™™¹téR–——÷œOg¨ñññ‰ŽŽ^³fM@@@çrѼyó’““=<ùøq‹R©"[Äâºææ6û÷m[›ì矫D"q^žXS¸27çøøØ“k\ v––†ºy!„B!„†-¬c!„Ð0`iiååõ99%99%ÉÉ'>ø ÓÁÁ44”OþÇåêë:)êo^‰à¼îîÒ/¡p3XOç7Á& (t]'ë™n†Â•ž®FÕ8;;““òÉår`±X: ÏŒ×éFWÕ”n_¹rE*•Ξ=»§Çû÷ïçwöìÙccc“––fjjJ¶'&&Ö××GDDp¹ÜÔÔÔììlöÁtttÌ›7¯®®ÎËËëÔ©Sl6bccÓÒÒœœœ4=:­Ö`{÷î]¹reBB‚¿¿bbbccãŒ3ŠŠŠ:÷ÉÉÉùÓŸþôÔÎÎÎ[·nݸqãÁƒß}÷ÝóçÏwÞ«¯¯™››kÖ¬inn~íµ×ÚÚÚ¦L™²}ûöÎ×®]+‘HÞxã •JµuëÖÓ§O“íš§Ù«—|`•”TøáÑÜÜ2 …è<íZ­¾y³‚ÁÐ#‡[T••=R*UÆÆŽ¿®l--t!„B!„Ð@¨Õ¸à B K …êÎ99%/–üôS™R©òò² 凅ñ…BgïTYTpÿ(ˆÓ úG`˜Â«å g ëL¿#B$tÕÁÚÚ:>>þ­·Þª¬¬Ü´iSfffqq1ŸÏט””täÈ‘C‡±X¬Õ«Wggg_»vÍßß?))éâÅ‹ÿú׿¶mÛ–““sýúuø£Á+æÍ›7vìØÄÄDÍÙ´†éœ ˆÚÚZ33³Îvtt9rd÷îÝ2™lùòåsæÌéfBЉ‰€#GŽôýT………ÞÞÞµµµšrT¿ Ó‚ Ž=úÆoè:A³fÍjnîØ²åûýëA€B¡zªF Èå :v¬õ¸qv>>vãÆÙóùcôôp ^„B!„Bý?åD¡áJOBNÓ´lÙ¤ÖVÙõë÷.^,ÉÉ)Ùµë¿ †ž··­PèÆ r¡Ñ´,6ƒ† çã^éuÐ6^§ï#i¾ÿþû~øaëÖ­AAA½>ÉÐçéé9}úô¤¤¤–––¤¤¤‰'öKµi€N;È\\\ÂÂÂtâwjµúÈÑßþvB"iÕL$ø• ›ää×==­étü›!„B!„Ð@ÁñX!4ÒÔÕ5çæ–æä”\¸P\YùØÀ€áççÆ å vºN‡ÐûÃQ5ƒ9xeH…Ñ­>ŽÇº}ûöªU«òòòÔjuppðîÝ»5‹õÅv4£ÑŒƒƒW•”4Äü¥àà`𛛨M„B!„B¨ï°Ž…B#–Z­.*zH.¦õÓOe­­2ggó°0~HÂW\Lkº•UÇÁ& l"Á< Çë3õ]VVÖ´iÓžmOHHHNNîæÀΣjþú׿J¥Òü±«Î®®®¹¹¹æææÃ(ÌÐó ¢¡I.W~þùé¿ÿý‚ R(„žU.Wtó·A%%› †â4˜!„B!„F ¬c!„Ш R©oß®"ÓÊË+ïèP88˜: …Î/½änkk¬ë€¨?<ºâtxpÚk€í¶3À& ,B€S~ ©Q5C*ÌÐu¬Ñ@¡P1™&ë×joïYQQ'ו—?º¿^&S…BÐéz …J¡P’ý¿ývyP‹N##„B!„á°Ž…B£NssÇÕ«e¹¹e?ýTVPP©R©Ýܬ&Lp0Á5(ÈÙØx˜-¼„ž¦VA}<8U' ±è&0å ºé:ö°Ž5J‘‘‘1kÖ,M‹Z­®®n‹ë**êîÝ«‹ëJKkî߯om•}ôQôÛo¿¨Ã´!„B!„F¼apƒ6B¡þÅf3&Mò˜4É Õ;ÈqZæ¶·ËqœÖ°GPÀ,Ì‚`Ü&h.ƒ_¿Ž«®3¡Ñˆ ´Ìl)‰0ÌÐ ó<‚°²âZYq'LøŸ&õõÍr¹RW©B!„B]@!¤KzzÀnÙ²Iq%%)YYïΟ?¾¦Fº~ýq¡ðoãÇ'¯\y0==·²ò±®“¢^a»T-»äMðóGP{ TòA…F…†ßÀ¹sçÈm__ßþ½Jii)A×®]Óy˜ÊÊʈˆ‡#rrrtæìÙ³€Åb¹»»ÿðÃýxæÎLMÙcÆ ÐÉB!„B!ŽÇB!ôYÓ"ËZšqZyyâO|ðA»¥¥¡PèÊñE7;;]‡E}Ör?=6X¼c"`ÌD0òÔ^ôB¨ç¸\®f›Ífw~Ø_***Ö¬Y3D¼óÎ;t:½°°p×®]¯¿þºX,f³Ùº ³xñâ… ÆÅÅ:thΜ9ÕÕÕ,«ß¯‚B!„B …BH Í8­–~’•õî’%aííòO¼ðÂF_ß K—HOϽ¿^×IQoq½!ªfT€ÿ6 Âø~5†[ët :ùùù&&&,ËËË+33“l'âÂ… ööö{÷î·°°°±±Ù¿?“É$`9::~ûí·C$Ì… V¬XaooŸPWWWXX¨Ã0·nÝZ¿~ý˜1câââ¤R©X,î{„B!„BH'p<B¡?Ðiœ´µÉ®]»—›[våJiBÂ1…BÅç[¹8¾ð‚ ®§5ü؃Ë"pY †Æ;ð(ômt :sæÌ ß¿?‹Å:uêÔ‚ ¢££ét:¬[·îСCÙÙÙ'OžÌÊÊb2™qqq …‚¶øIDAT] ¬¬¬Äbqpp0”•• Á0ááá,ëÊ•+vvýö/¢×¯Lcc#9ë•W^iooøð!Ö±B!„B SXÇB!Ôÿ,- 'Oöœ<ÙZZ: ˆDâ¼P*U––†Pèè$Ø1™¸äÒÈ¢h…¦P¶ƒY–½.@îB0p¶#8‚Øk °l†ãöÊ™W 4¬c!„B!„Rp^A„BCžÅÍmŒ›Û˜˜˜@xü¸åæÍŠüüÊüüŠÝ»Ï}òÉ)‹îímëãcçãcïáaíìl¡§GÑujÔ7zú`ìÓå^}[p}ZîAKÔæBK¨:ìgBˆ¶*‹¢ÍÀ´ *0B!„B!„XÇB!4̘˜Lšä1i’ù°¢¢ž\UëæÍûéé¹­­2CÏÝÝÊÃÃÆÓÓzìXkOOkCC–n3£~ÆvÏu«¡½ÚªÊÐ޿⸺=`ZÓXVÀ´¦%X¼Ö¯ Jb„B!„B!ÔXÇB!4¼98˜:8˜Î˜áK>$Ö*)©..®þúë+¥¥5*•ÚÈHŸÏ·ìÜÜÆðù–ãÆÙ3øp$!€9˜cºÜo “þ m¿Bû#h¯†öh ·@£½ŽUù-”ÿ ¦À0º)0Ìžl³AßnàžÆCZF¿‰D¢€€ 3t „B!„BC~ЇBhD±´4š<ÙhòdOòassÇ;JJjŠ‹« *ú©­MF£QœÌÉš–@`çãconŽ‹*hLK`Zö ?• 4#h¯Æ;ÐQu —x~ã6ié_y*ÍèF@3º1ÐŒ€f†|`»ôÏS†È ccãsçÎùøø‡ÓÿÿÖ¤R)ÇûÏþÓMhÂ,X° --Üž>}ú©S§tF¥R­X±âÀ¶¶¶_}õÕ„ úñä!„B!„Ð`Â:B¡‘ŒÍf…ÎB¡3ù°£CñË/ >(,üõüù_ššÚ ‚pp0õô´qw·âó-]]-\\,ètü9ŠY¿òô8-•dõ@ébÞB• MÐZòF7‚L2 €ƒ×z-ýïl¢T T}Ð3xÒî´œbµô¯AÃM-í&`â§¥½±ïhiçzƒ¡»–öG î'-ía`6^Kûóár¹šm6›ÝùaÿJNN~ôè‘ÎÔ––fffNž<h4šnÃlÛ¶íêÕ«ùùù‡^¼xqQQQ¿_!„B!„ø!B¡Q„ÁÐ7Înܸ'SéÕꊊúÂÂwîüZXøkff^UUƒZ­¦R)vv&<ž%géêjÁãáñ,p‘­QBënÞB‡Ùà0ûéF¹(tíý-Ãfr)È¥ lE+(ÛAÙzlíý«„¢T-ížë´×±*¾ÛÉZÚÁ+QKûãëPú¥–v=ƒ¾Ô±ž_~~þ{ï½wãÆ¶¶6—õë×Ïš5 ‚8þ|lllBBBIIIZZFûøã—/_~éÒ%rôUYYYkkëPSZZ* º/b N˜ÌÌÌ>øÀÁÁ!)))))©¿ò „B!„BƒëX!„F/‚ ÍͦOG¶(ªî߯/.®.)©‰ÄiiWššÚÀÐéèhîà`Êç[òùcøü1®®T*E§Ï a4Ã.w™ ÁT؃Sy~žö ¿`#6ö ¿û»àþnú÷·9s愇‡ïß¿ŸÅb:ujÁ‚ÑÑÑt:Ö­[wèСììì“'Ofee1™Ì¸¸8…B¡9vß¾}[¶lÙ¹s§nÃH¥ÒÚÚÚ ˆD"GGǯ¿þ:$$DWa ¨¨èû￟7ožµµuzzzhhhßà „B!„B:u,„BèwzzSÓÐP>Ù¢Tª*+—”T—–>*-}TRR}áB±TÚl6ÃÕÕ’¶åâbáèhæèhÊbu1!Ô…«W¯²Ùl*• ¡¡¡R©ÔÌÌ V¯^²hÑ¢¤¤$???رc‡@ ¼|ùrLLŒA7'œ0¥¥¥àíí••µeË–¹sç–——ëéõõv¯_™¦¦¦Ç×ÖÖîÚµkÞ¼yý!„B!„Ò üƒ!„ê•J!ÇlM™ò{cMôîÝš²²G%%5¥¥5—/ßýõW ¹Ë‚ãà`æèhfooêèhJn˜›st“¡ç#—+%’Ö††‰¤U"imhhmhh•HZZZZZëëM\]ÄÕ%IJJÊåË—KKKù|~ç]öööPYYéìüd•;§ÙÛÜÜ<Âøùù©Õjr{Íš5[¶l‹Å£f`±X«V­âr¹Ë—/OHHè—0!„B!„N` !„ê1KKCKKÃß?ni騨¨¯¨¨¿w¯îþýú{÷êD"ñƒ r¹ôõé¶¶&ÖÖ\ckk®­­1¹amÍ¥Óñw1êgÍÍmm²ÖVYSS{[›¬­MÖØØ&•¶‘ÿ×l46¶75=Ùnm•u>‹Eçrõõõ¹\gg .W?;ûö JMMõõõU«ÕL&S³‹B¡€•••X,&KVeeeš½S§NÕlŠD"rÑ,„‘H$†††dÐ××ïc’¾„qvvîèè¹\,.ï‡B!„Bh¸ÂÏÎB¡~``Àðð°öð°îܨYmëþýú$4ˆÅµ—/ßÕÔ·‚°°àX[sÍÍ ml¸æækkcKKÃ1cŒÆŒ142ê‡ÏÁѰ#—+[[;¤Òö¶6Y{»¼±±ÜJÛ[Z:ÚÚd--²æf²@Õyo[k«¬­MÖÜÜñì9 Y“Ãa²ÙL‡Áá0­¬¸nn,6›Áá09Öÿ·ww¡qToÇÏdwvf6û’4&µI Úд“Ö`I›‹1Ò‹TjJ¡6 ¢¡–±¼‰ "B,¤ôâ ­kë…4¡HiE©6â"D-Ô†41›}é¾În÷1uYb’¦yén6ß!ÌÎù䓟~úimmíæÍ›—ß YAŽÀjIï¶5ë|*•šœ Þ¼93>î÷ݼ9sëV`ttüÖ-ÿÄ„?Keª*oÚTTZjè!ÛÆŽ’[i©½¬ÌQRRXZê(+³³Wn £‘ˆ‰Äýþp4ªG"éI…¢Á`4ÕÃáx ‰DÒWcѨ ÆB¡h"qç¿÷t84«Õ¢i»]µÙM“­VÅáÐ~Ø©i²Ý®ªš&[­§ón¥ÍfTZ¬Ö\ÿ?éëë{ûí·Oœ8±sçN—Ëå÷û[ZZ<OºÀårMOO755õôô ɲ,„(**Jפ÷‘:räHÿ’Óš%7ÓßßôèÑ“'O>óÌ3Ÿþ¹Qœ­fÞ}÷Ý_ýµººº¶¶öìÙ³+Ò Y!¥—ò¹`f&tëV`|Ü75¼ysÆë y½¡©©€×šž¾íõ†Ò9‡Õjq84§S³Û5§SÍ8ÖŒcãÀøq:5Y6e÷Õr\,–ˆFãÁ`L×FÚ‹%ˆ®'•úâñ„ßÑõd( ‡ãÆžRFduû¶1YJ…æ˜%梬VËZ ¢Z[[…çÎËn£££;v옚š*)™$I:þühfiÍH’äv»<¸ =pߘ@n)..,..|â‰MóÌÌ„¦§C^ïíééP ñùÂ~Äïûý‘7¼>Ÿ±õQØç‹Äã‰Ìšfq8T#Ö²Z-‹ÉjU,³¦É‹YÓ,ªjVUYQdU•UUV³q.°XÌÆÀY-ÙlªÉT°²‡`0zçÎì™Iáp<O¦R©@ "„ˆDtã}¾°¸DéBˆ@ ’J¥âñ¤±íÓíÛÑdòŽ®ßý Åâñd ‰ÇÆB|ºž¢óub6ªª*«ªÙnWÅlµ*šfQseeÉ ¢²nppð…^øïù'Ntuu-0pÛ¶mûöíëìì …BóE5Bˆ­[·644ÐÌ’› §c°ÆA—e÷¬ŒFu#Ð2R®tÜelª'ŒEí&'F걘êÑhÂ(XNŸ‹ßßËï/çAiFØ&„p8Ô‚I–MV«"„°Ù“©Àl.°ÙT!Di©Ýb1;š¢˜yQŠb¶Û¤J.,TÅl³©Fª·ݺÕÜܼ´•Ün÷ñãÇËËËS©T}}ý©S§(£™å4@Na]A0¯tÜ‹%ÂḮ¿“³Ê‚Áh29{î”ßYäSœNí¿'íö9$«Õ"Ë&I’MaÌ‘÷“™aÉrd]A¬6Öäæc€yišEÓ,Ng¶ûÀºÄ:9ÈEäXX“¤¹ g»¯»‰„$Iÿüó"§` !ÇÀš4ó/!Ä¥K—Œãššš•ºÿððð¬ìçŸ^üp“ÉÔßßo·ÛWªÖ!öÇÀšTTT”>¶Ùl™WDMM’ !&&&:ôÔSO-~¸$I/¿üòʶÀzÃ|,ä¹_~ù¥©©iÆ š¦mß¾ý‹/¾0ÎK’tùòåÊÊʾ¾¾ŽŽŽ²²²ŠŠŠÓ§O«ª:<i¬+8‹ÏçK$«ñ¦är,ä¹C‡UUUŒŒ\¿~½½½½­­-—Þ{ï½3gÎüý÷ß.\¼xñbÿ¬Éãñ ¿øâ‹ ?å³Ï>9}út{{{,[ òêÕ«?þø|099¹ÌW ¿‘c Ïýøã½½½>úèÆ÷î݋ŀq©½½}Ïž=n·»³³³¶¶¶ººº··7™Lfÿ裎;vϧ¼ùæ›eeeû÷ïO$Á`pÊæææ+W®„B¡;w¶µµýôÓOËy;ò9òœÏçs¹\ åååo¼ñFæ¥ÊÊJ!Ä7¶lÙbœ©ªªÊ,ðûý_~ùåÁƒïù”ŠŠ !DAÁ¢¾`WVVvww=÷ÜsG­««[ä»°®c Ï544üùçŸ===ׯ_ʼdÄN›6mú믿Œ3üñGfÁW_}µ{÷n‡ÃqϧH’t¿ýþûï?üðC hjjºß±¬äXÈsº®×ÕÕUUUy<ž¶¶6!„×ëÍ,8|øpWW×ÈȈÇãéèè¡ÔÐÐÐÞ½{3‹Ò¡×ÒÄb±úúú×^{íÙgŸýí·ßº»»—sCò9ò\___oooyyù[o½õꫯ>ÿüó---™.—«±±±©©iß¾}¯¿þºB–eãÒwß}÷ôÓOg9räûï¿_N?_ýõ7ß|óñÇ_»ví•W^Qe9w I©T*Û= ×µ¶¶ !Î;—íFVÝèèèŽ;¦¦¦JJJæ,$éüùóxÀ=’$¹ÝîÅìÀÀ|,ä‰ÁÁAi..—káÛ¶m{çw‚ÁàÄÄDgggccã|!–bëÖ­ +Ý;˜ƒ9Û +£¹¹yi‹ ¸ÝîãÇ———§R©úúúS§N-P<66¶ÔÀý!ÇÀz·}ûöo¿ý6Û]€ÙXW¹ˆ ¹ˆ ¹ˆ ¹Èœí°6\½zµµµ5Û]€u„ ÷¶{÷îl·€ᥗ^zä‘G²ÝwI©T*Û=³±?r9r9rÑÿ*ÐõNgVwxIEND®B`‚glom-1.22.4/docs/libglom_reference/html/namespaceGlom.html0000644000175000017500000013535212234777147025013 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom Namespace Reference
        Glom Namespace Reference

        Namespaces

         Conversions
         
         DbUtils
         
         Utils
         

        Classes

        class  AppState
         There is one instance per document. More...
         
        class  sharedptr
         A ref-counting smart-pointer for the underlying C++ object. More...
         
        class  ReportBuilder
         
        class  DatabaseTitle
         This is a separate class, instead of just deriving Document from TranslatableItem, to avoid the need to use Document via sharedptr. More...
         
        class  ChoiceValue
         A value of a custom choice, for a field or a layout item. More...
         
        class  predicate_FieldHasName
         A predicate for use with std::find_if() to find a Field or LayoutItem which refers to the same field, looking at just the name. More...
         
        class  Field
         
        class  FieldTypes
         
        class  FoundSet
         A grouping of information about a view of a table, including what records are viewed (the where clause), how the are sorted (the sort clause). More...
         
        class  HasTitleSingular
         HasTitleSingular instances may have a (translated) singular form of their title. More...
         
        class  GroupInfo
         
        class  NumericFormat
         
        class  PrintLayout
         
        class  Privileges
         
        class  Relationship
         
        class  Report
         
        class  SystemPrefs
         
        class  TableInfo
         
        class  TranslatableItem
         TranslatableItem have a map of translation strings - one string for each locale. More...
         
        class  CustomTitle
         
        class  Formatting
         This specifies how to display data for fields or static text items. More...
         
        class  LayoutGroup
         
        class  LayoutItem
         
        class  LayoutItem_Button
         
        class  LayoutItem_CalendarPortal
         
        class  predicate_LayoutItem_Field_IsSameField
         A predicate for use with std::find_if() to find a LayoutItem_Field which refers to the same field, without comparing irrelevant stuff such as formatting. More...
         
        class  LayoutItem_Field
         A LayoutItem that shows the data from a table field. More...
         
        class  LayoutItem_Image
         
        class  LayoutItem_Line
         This is only used on print layouts. More...
         
        class  LayoutItem_Notebook
         The child items are LayoutGroups, each of which will be shown on its own tab. More...
         
        class  LayoutItem_Placeholder
         
        class  LayoutItem_Portal
         get_title() returns either the title of the Field or the CustomTitle. More...
         
        class  LayoutItem_Text
         
        class  LayoutItem_WithFormatting
         A base class for all layout items that may have formatting options. More...
         
        class  UsesRelationship
         
        class  LayoutItem_FieldSummary
         
        class  LayoutItem_Footer
         
        class  LayoutItem_GroupBy
         The child items are fields to be shown for each record in the group. More...
         
        class  LayoutItem_Header
         
        class  LayoutItem_Summary
         
        class  LayoutItem_VerticalGroup
         The child items are arranged vertically in a row on a report. More...
         
        class  Document
         

        Typedefs

        typedef std::pair< sharedptr
        < const LayoutItem_Field >
        , bool > 
        type_pair_sort_field
         field, ascending More...
         
        typedef std::vector
        < type_pair_sort_field
        type_sort_clause
         
        typedef GlomBakery::View
        < Document
        View_Glom
         The base View for the document. More...
         
        typedef
        GlomBakery::View_Composite
        < Document
        View_Composite_Glom
         

        Functions

        void libglom_init ()
         This must be used by applications other than Glom, which are unlikely to otherwise initialize the libraries used by libglom. More...
         
        void libglom_deinit ()
         
        template<class T_obj >
        sharedptr< T_obj > glom_sharedptr_clone (const sharedptr< T_obj >& src)
         
        template<class T_obj >
        sharedptr< T_obj > glom_sharedptr_clone (const sharedptr< const T_obj >& src)
         
        bool write_pot_file (Document* document, const Glib::ustring& pot_file_uri)
         Create a pot template file that can be used by translators to create a new .po file. More...
         
        bool write_translations_to_po_file (Document* document, const Glib::ustring& po_file_uri, const Glib::ustring& translation_locale, const Glib::ustring& locale_name=Glib::ustring())
         Create a po file containing the translations from the Glom document. More...
         
        bool import_translations_from_po_file (Document* document, const Glib::ustring& po_file_uri, const Glib::ustring& translation_locale)
         Parse a po file, storing its translations in the Glom document. More...
         
        Glib::ustring get_po_context_for_item (const sharedptr< const TranslatableItem >& item, const Glib::ustring& hint)
         Get a hint about what the text is for. More...
         
        template<class T_object >
        Glib::ustring glom_get_sharedptr_name (const sharedptr< T_object >& item)
         

        Variables

        const char GLOM_IMAGE_FORMAT [] = "png"
         
        const char GLOM_IMAGE_FORMAT_MIME_TYPE [] = "image/png"
         

        Typedef Documentation

        field, ascending

        The base View for the document.

        Function Documentation

        Glib::ustring Glom::get_po_context_for_item ( const sharedptr< const TranslatableItem > &  item,
        const Glib::ustring hint 
        )

        Get a hint about what the text is for.

        This is also necessary to uniquely identify the item, because not all text with the same contents should be translated the same way in all languages - the context might change the translation.

        template <class T_object >
        Glib::ustring Glom::glom_get_sharedptr_name ( const sharedptr< T_object > &  item)
        template <class T_obj >
        sharedptr<T_obj> Glom::glom_sharedptr_clone ( const sharedptr< T_obj > &  src)
        template <class T_obj >
        sharedptr<T_obj> Glom::glom_sharedptr_clone ( const sharedptr< const T_obj > &  src)
        bool Glom::import_translations_from_po_file ( Document *  document,
        const Glib::ustring po_file_uri,
        const Glib::ustring translation_locale 
        )

        Parse a po file, storing its translations in the Glom document.

        Parameters
        documentThe document into which the translations should be stored.
        po_fileThe filepath at which to find a .po file.
        translation_localeFor instance, de_DE.
        void Glom::libglom_deinit ( )
        void Glom::libglom_init ( )

        This must be used by applications other than Glom, which are unlikely to otherwise initialize the libraries used by libglom.

        Glom uses it too, just to avoid duplicating code.

        bool Glom::write_pot_file ( Document *  document,
        const Glib::ustring pot_file_uri 
        )

        Create a pot template file that can be used by translators to create a new .po file.

        Parameters
        documentThe document whose translations should be written to a .po file.
        pot_fileThe filepath at which to create a .po file.
        bool Glom::write_translations_to_po_file ( Document *  document,
        const Glib::ustring po_file_uri,
        const Glib::ustring translation_locale,
        const Glib::ustring locale_name = Glib::ustring() 
        )

        Create a po file containing the translations from the Glom document.

        Parameters
        documentThe document whose translations should be written to a .po file.
        po_fileThe filepath at which to create a .po file.
        translation_localeFor instance, de_DE.
        locale_nameFor instance, Deutsch, to identify the translation team.

        Variable Documentation

        const char Glom::GLOM_IMAGE_FORMAT[] = "png"
        const char Glom::GLOM_IMAGE_FORMAT_MIME_TYPE[] = "image/png"
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Notebook.html0000644000175000017500000017715112234777147030643 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Notebook Class Reference
        Glom::LayoutItem_Notebook Class Reference

        The child items are LayoutGroups, each of which will be shown on its own tab. More...

        Inheritance diagram for Glom::LayoutItem_Notebook:
        Collaboration diagram for Glom::LayoutItem_Notebook:

        Public Member Functions

         LayoutItem_Notebook ()
         
         LayoutItem_Notebook (const LayoutItem_Notebook& src)
         
        LayoutItem_Notebookoperator= (const LayoutItem_Notebook& src)
         
        virtual ~LayoutItem_Notebook ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        - Public Member Functions inherited from Glom::LayoutGroup
         LayoutGroup ()
         
         LayoutGroup (const LayoutGroup& src)
         
        LayoutGroupoperator= (const LayoutGroup& src)
         
        virtual ~LayoutGroup ()
         
        bool has_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Discover whether the layout group contains the specified field (from the current table). More...
         
        bool has_any_fields () const
         Discover whether the layout group contains any fields. More...
         
        void add_item (const sharedptr< LayoutItem >& item)
         Add the item to the end of the list. More...
         
        void add_item (const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)
         Add the item after the specified existing item. More...
         
        void remove_item (const sharedptr< LayoutItem >& item)
         Remove a layout item from the group. More...
         
        void remove_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Remove any instance of the field from the layout. More...
         
        virtual void change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void change_related_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void remove_relationship (const sharedptr< const Relationship >& relationship)
         Remove any use of the relationship from the layout. More...
         
        void remove_all_items ()
         
        double get_border_width () const
         
        void set_border_width (double border_width)
         
        guint get_items_count () const
         
        guint get_columns_count () const
         
        void set_columns_count (guint columns_count)
         
        type_list_items get_items ()
         
        type_list_const_items get_items () const
         
        type_list_const_items get_items_recursive () const
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_items get_items_recursive ()
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_const_items get_items_recursive_with_groups () const
         Get the items recursively, depth-first, also returning the groups. More...
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::LayoutGroup
        typedef std::vector< sharedptr
        < LayoutItem > > 
        type_list_items
         
        typedef std::vector< sharedptr
        < const LayoutItem > > 
        type_list_const_items
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::LayoutGroup
        type_list_items m_list_items
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        The child items are LayoutGroups, each of which will be shown on its own tab.

        Constructor & Destructor Documentation

        Glom::LayoutItem_Notebook::LayoutItem_Notebook ( )
        Glom::LayoutItem_Notebook::LayoutItem_Notebook ( const LayoutItem_Notebook src)
        virtual Glom::LayoutItem_Notebook::~LayoutItem_Notebook ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Notebook::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_Notebook::get_part_type_name ( ) const
        virtual

        Reimplemented from Glom::LayoutGroup.

        LayoutItem_Notebook& Glom::LayoutItem_Notebook::operator= ( const LayoutItem_Notebook src)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_notebook.h
        glom-1.22.4/docs/libglom_reference/html/functions_0x76.html0000644000175000017500000001144712234777147025032 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - v -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1ReportBuilder-members.html0000644000175000017500000001114112234777147030744 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::ReportBuilder Member List

        This is the complete list of members for Glom::ReportBuilder, including all inherited members.

        create_standard_list_report(const Document* document, const Glib::ustring& table_name)Glom::ReportBuilderstatic
        report_build(const FoundSet& found_set, const sharedptr< const Report >& report)Glom::ReportBuilder
        report_build_and_save(const FoundSet& found_set, const sharedptr< const Report >& report)Glom::ReportBuilder
        ReportBuilder(const Glib::ustring& locale)Glom::ReportBuilderexplicit
        set_document(Document* document)Glom::ReportBuilder
        ~ReportBuilder()Glom::ReportBuildervirtual
        glom-1.22.4/docs/libglom_reference/html/tabs.css0000644000175000017500000000221312234777145023000 0ustar00murraycmurrayc00000000000000.tabs, .tabs2, .tabs3 { background-image: url('tab_b.png'); width: 100%; z-index: 101; font-size: 13px; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; } .tabs2 { font-size: 10px; } .tabs3 { font-size: 9px; } .tablist { margin: 0; padding: 0; display: table; } .tablist li { float: left; display: table-cell; background-image: url('tab_b.png'); line-height: 36px; list-style: none; } .tablist a { display: block; padding: 0 20px; font-weight: bold; background-image:url('tab_s.png'); background-repeat:no-repeat; background-position:right; color: #283A5D; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); text-decoration: none; outline: none; } .tabs3 .tablist a { padding: 0 10px; } .tablist a:hover { background-image: url('tab_h.png'); background-repeat:repeat-x; color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); text-decoration: none; } .tablist li.current a { background-image: url('tab_a.png'); background-repeat:repeat-x; color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); } glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Text-members.html0000644000175000017500000006157712234777147031443 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_Text Member List

        This is the complete list of members for Glom::LayoutItem_Text, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Textvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_formatting_used() const Glom::LayoutItem_WithFormattingvirtual
        get_formatting_used_horizontal_alignment(bool for_details_view=false) const Glom::LayoutItem_WithFormattingvirtual
        get_has_translations() const Glom::TranslatableItem
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Textvirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItem_Textvirtual
        get_text(const Glib::ustring& locale) const Glom::LayoutItem_Text
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Text()Glom::LayoutItem_Text
        LayoutItem_Text(const LayoutItem_Text& src)Glom::LayoutItem_Text
        LayoutItem_WithFormatting()Glom::LayoutItem_WithFormatting
        LayoutItem_WithFormatting(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        m_formattingGlom::LayoutItem_WithFormatting
        m_textGlom::LayoutItem_Text
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Text& src)Glom::LayoutItem_Text
        Glom::LayoutItem_WithFormatting::operator=(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem_Text& src) const Glom::LayoutItem_Text
        Glom::LayoutItem_WithFormatting::operator==(const LayoutItem_WithFormatting& src) const Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_text(const Glib::ustring& text, const Glib::ustring& locale)Glom::LayoutItem_Text
        set_text_original(const Glib::ustring& text)Glom::LayoutItem_Text
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Text()Glom::LayoutItem_Textvirtual
        ~LayoutItem_WithFormatting()Glom::LayoutItem_WithFormattingvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1GroupInfo__inherit__graph.png0000644000175000017500000000605312234777145031467 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“ àIDATxœí}LSWÇÏmé(Øj[ }A_y0!Ï3Ø$ÖhPl%´ $°d‹Ù4ŸmZt¸øýÃÝ£ÔRÞ3·à †±™‡ÎId/%d¼iKA'q–rŸ?Ž»»ëËëõöÑs>áß=÷Çï÷;çÛžs_Ú^‚$I€A^° Àp Ö-°ÞhõF ¬7b4 C°ËÁ°LVV]âo¬úKÃñãÇ=Z|è­Óé8)óÜ1-xýF ¬7Z`½ÑëXo´Pïû÷ïüñÇ*•*44T¥R½ûî»ÃÃÃpA&“‰½ á SwîÜ;w,˼yóQQQ¥¥¥ $Ú¬H$ʉDôM Âf³EFF¾ ñ=d>¯©©Ù±c›B"‘ðù|jszzº¸¸X¥REFFæää8ØNÄ¥K—”J¥X,Þ³gÏÅ‹årùüùó?úè#Ê¡ººšnøƒ ˆëׯÇÄÄ®[·N&“………%&&ÖÖÖR---J¥R&“:u 6vuu%''‡‡‡ÇÆÆVTTPÑnݺå„ @TT”Ýn÷éihhˆ•H$YYYcccT;I’GŽY´h‘L&ÓjµÔ л@Å÷ç<ëˆ=Þ×ÏÉÙJ¥ÍÍÍþöÂ1=|øp||ü7ÌfóÚµk333©½Æn·×ÕÕ6nÜHÙwîÜ!I²ªªª¯¯nxD¦o¦¤¤tttÄÄļÿþûýýý£££¡¡¡þù'tHKK»wï^}}}HHÈ£GH’Œ‹‹ÓëõV«µ¾¾žÇ㎎°˖-óÄf³‘$ÉàðÚk¯uwwß¾}û7ÞØ¸q#UêÉ“'/^üÃ?X,FC]ʦw„ŠÏàÌ|HúÑ›Á9àóÖ;ù\.—÷ööÒe¦Î)ããã¡ ¡¡!¸)‰<ÏÀ˜˜ÀÄÄDqqqjjª\.ß¶mÝA¡PxÄ/++;räÈÂ… ßyç_~ù…Zƒ‚Ìê°xñbh,_¾`µZáfnn.<¡P(n·›oœY±@þ-##£¬¬ ¾Ä‰äÇôðQ*•}}}І†\.¬D`·SSSûúúŽ;v÷îÝo¾ù†îH:6l0ÑÑÑkÖ¬¡^© Afu°X,Ð0›ÍA¨T*¸)—Ë›ššàkffÆét.]ºÔ__žÊ9`Ñ{ß¾}V«U£Ñ˜L&«ÕÚÐÐPRRâᓟŸ¿ÿþ®®®ÞÞÞ‚‚F3Çãêêêêþþ~º1+.—kÕªUK–,ùõ×_óòòÀ_3ªO’’’ŠŠŠbbb^ýu’$…Bá¬Aà !ƒCQQÑíÛ·{zz>øà­VK+æåå›L&‹Å²mÛ6µZí³$ŽÎÏ }rŸãúM’äï¿ÿž““#•JÃÃÃ5 |Ó×ïÇëõz…B!“ɶnÝ —(ï¥ËÛTUUÑ àµ~ÃÍæææØØØÐÐД””¯¾ú*--mùòåÞña ×®]KLL …ñññ/^¤ÜüIMM …‡ƒ!KMMB¡J¥¹¹¹ƒPTT¤T*E"QZZuxE/ŒŠ?g¶?¼×o‚¤pÕÖÖnÙ²…Þ‚y¡ÑjµàŸwÁñõs´Àz£Ö-°ÞhõF ¬7Z ª·Õ:삃;Öô;}/+æìì¸yóÁ.äù244¤T*ÿÑD¿ø‚È7Kx™C\®i£± ‹N¨èívÏÔ×›<&sˆÍöÀdºËyEÁ½oÜès8úÜ%ðѹð‚ŠÞW®Ü€x啸'ð)Ûí&››‚'å/=Ïå¼ÿ‡$&*>ùdµyðà•·ßþwBÂß_y™˜˜Šˆ£4NAñþ@.ÿÏ™3ùIÁ.„kP™Ï1¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z°ö{ðÑ…/ ÃÃb™ìQX˜+Ø…Ì•?ü099ùÙã°¦7A QQQ¬DÃй~ýºÁ`ÐétÏŠÍßgÒjµkÖ¬a1 ÂⳡñúXo´Àz£Ö-°ÞhÁµÞSSS§OŸÖétëׯ×étGµÛíp—Z­6›Íœ¥c‘Y+ÿâ‹/6lØðàAðwÆéïå’$©×ë ‚())‰ŽŽv8---;v쨮®Ø”'Çéhhh8qâ„X,æ2©O8Õû믿©©© …‰D²sçÎ÷Þ{Ï÷|ìÀ‹˜ŽÇGGGsœÔ'œÎç­­­™™™pô)D"÷wn·»²²R§ÓmÞ¼ùÀ÷ï߇íjµº­­M«Õ¦§§———ûí·YYY›6m*++£Z[[és:µZÝÝݽeË–+W®øË899éa«ÕꎎŽììlFSRRB9S¨Õêï¿ÿ^«Õfdd466‚¿®–dffNNNúëgpª·Åb‰gö1 mmm%%%¥¥¥ãããÇŽ£v]»v­²²²¨¨èÂ… ­­­gÏžÕëõF£ÑjµöîÝ›˜˜H7fMW^^^\\l³ÙüeôIEEŧŸ~ZZZj·Û=êíÐÔÔT^^¾k×®ÒÒR—ËÕÞÞ,XÀÐ;nàTï©©© P›ê¿øã?¨Æ«W¯æçç¯X±B©T~÷ÝwSSSp—N§›?þêÕ«[·n¥lø.Y¿~=œ3)cÖtZ­våÊ•mmmþ2ú$''gÅŠ .ܹsggg§·sFF†D"yë­·Ün·Ç^†Þq§zGDD R›---uuu>cccrù“Ç@Ãf{òÈǰ°0AvÀé^}õUæŒ>¡œU*•OçÈÈHµ=m.ÖáTï7ß|óòåË33Ož"‰¼Oc¢¢¢FFF  'ꈈˆç”JÂÞ<ô„ròYëÅÞ§zçåå9Ž={ö˜Íf‡ÃÑÑÑqþüyŸ´´´ªªªß~ûmhhèĉÉÉÉ"Ñœ+ÒÚÚ G2æ’Ž!£H$‚Óuuu5Ý: ÙÙÙ«W¯Þ·oßöíÛ¥R©^¯ŸcðC‡õôôй¤cÈXPPPYY™½råJºzzú¶oß.‘HvïÞýT#pïØ‚ÍÏ;|öÙg/ýýoµZ}æÌ™eË–qœ”­Ï;àëçhÊóÇØžL¿¸à÷7Z`½ÑëXo´Àz£Ö1H–v?^r +2±vþm0Ø …ñ&%%…•8ˆ>ÿYðúXo´Àz£Ö-þš#`˜·5.VIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1FoundSet.html0000644000175000017500000004003012234777147026260 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::FoundSet Class Reference

        A grouping of information about a view of a table, including what records are viewed (the where clause), how the are sorted (the sort clause). More...

        Collaboration diagram for Glom::FoundSet:

        Public Types

        typedef std::pair< sharedptr
        < const LayoutItem_Field >
        , bool > 
        type_pair_sort_field
         field, ascending More...
         
        typedef std::vector
        < type_pair_sort_field
        type_sort_clause
         

        Public Member Functions

         FoundSet ()
         
         FoundSet (const FoundSet& src)
         
        FoundSetoperator= (const FoundSet& src)
         
        bool operator== (const FoundSet& src) const
         

        Public Attributes

        Glib::ustring m_table_name
         
        sharedptr< const Relationshipm_extra_join
         
        Gnome::Gda::SqlExpr m_where_clause
         
        type_sort_clause m_sort_clause
         

        Detailed Description

        A grouping of information about a view of a table, including what records are viewed (the where clause), how the are sorted (the sort clause).

        Member Typedef Documentation

        Constructor & Destructor Documentation

        Glom::FoundSet::FoundSet ( )
        Glom::FoundSet::FoundSet ( const FoundSet src)

        Member Function Documentation

        FoundSet& Glom::FoundSet::operator= ( const FoundSet src)
        bool Glom::FoundSet::operator== ( const FoundSet src) const

        Member Data Documentation

        sharedptr<const Relationship> Glom::FoundSet::m_extra_join
        type_sort_clause Glom::FoundSet::m_sort_clause
        Glib::ustring Glom::FoundSet::m_table_name
        Gnome::Gda::SqlExpr Glom::FoundSet::m_where_clause

        The documentation for this class was generated from the following file:
        • libglom/data_structure/foundset.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Text__coll__graph.png0000644000175000017500000006576012234777146032320 0ustar00murraycmurrayc00000000000000‰PNG  IHDRO½ƒ¶bKGDÿÿÿ ½§“ IDATxœìÝy@×ú8ü3I°Â"„$ì‚J[µÖöârmQË«b½`]®½.µÚ¯`±ßÚJå¶Ö¥*µ­-Rv´êu鿥.`ÁÅ`(;aß²ÌûÇ´c IK2Ix>LΜy2s’'³œ Çq˜4Õ:Ù€éƒlÀôA¶`ú Û0} ª"""²²²¨ŽÂ€ÀõóCÙ` Þ}÷]ª£ ^^^Þž={¨ŽÂèA¶(.—Iu²ÝÐÁy;¦²ÓÙ€éƒlÀôA¶`ú ÛŒ[kkë¦M›x<ž¹¹9Ç[µjUUUñ†a………R©ð††b QÐÅÅÃÙ`Äärù¼yó®^½š••UYYyúôi&“ÔÓÓCÖ¡ÓéÉÉÉ666ú IÏ‹Z‚ñv#vôèÑÒÒR‘Hdee…rtt88øÙgŸmjjÒ>`@0kÖ¬Ù³g¿úê«ÿú׿Bfffƒøà` 0x.ÀEDD „úM]FíîÝ»Ï<óL}}½â…6}edd,^¼~«‡öí@&L˜°yóæ¶¶¶ššš­[·Îš5KsªÃ²èOzzúµk×8Ž··wGGÇ¡C‡¨Žh¤€ñv ?þþþ¿üò ÕQŒD°oÀôA¶`ú Û0}í@­ÖÊžþ+cW© TeeeFFµ1t¤»Zþ5˜¥ŒÂòòò(\ºÉ€l0Pùùù‹/¦0[3ûOýÏ}·9ýõ¦<È}„€{©€jwRêòwU:Ž·\˜ìGu,`¨à¼¨&:Ó„ª/îl¯é¥:0Tí@…–G= ÷;B4:&:;€û>ÃÙT(ý±‰n†!„ä2üÁ)ÈvF²¨ðàT“L‚#„Žšu7‰º¨Ž d;PÖp¿³µêÉH;šVzn`Om†²(+='¦™=y¤¸\‚—œnDp»1ƒlOÁåèÁ™&¹ä©äÖY/©½ÝAUH`è ÛÀSjn´w5J”&ÒXéy¸VňA¶€§”žk¢10¥‰r)þàL“\G3d;xB.ÁEç›äRY­·]öGA›þCòÈvLd;¦ÆÛ€ZmU=l3†ì=ÈvLüa`ú Û0}í˜>ÈvLd;Ãð††-kê:d;¦²¨•6ÿnÅ媣ò¨ÕVÕ#é|òpW ÃÒÒÒ¸\®Í–-[RSS9Ž­­mLLŒºäryBB‚———••U@@Àå˗ɦÈ#~dðÜÜ\>ŸäȲ|øðá„„6›ÑØØHÎuêÔ).—Ëf³÷ï߯nY¯¾úê®]»ˆYòóó$‰ÊP ---ÝÝÝ“’’TΨÍÈÉÉqwwg±XáááuuuR©T ðx<‡¨¨(2~}èqhòµÒ›È—¡ÐÐІ††¬¬,„ÐܹsÉrii©ÊöìÙÃãñrss«ªª½½½D"!šª¯¯'›%Ê¡   ‹/vvv’åO?ýÔÛÛ;//O$…†††‡‡“s…„„ÔÖÖfgg3Œîîn•Ë:zôh`` 1ËÛo¿½fÍuÖÓÓ366¶ºº:;;›F£ýç?ÿé;c¿k!ôüóÏߺuëÎ;sçÎݱc‡——W~~¾P(œ5kÖÂ… Éø ¿m²¨Õ7Û]¸pÇq™L¦TV÷Ã=nܸ¤¤$¢,—ËÅb±\.ÇÕg»ÌÌLr"Q?~|JJ 1±ªªŠN§wttŽ?NP__¯rYÍÍÍL&³²²R&“q8œÜÜ\u–ÍfïÞ½›(‹ÅâÆÆÆ¾3ö»ȉ8Ž_¿~!äààðí·ßSŠŠŠB---¸Þ³É€°¶¶FÑh4¥²:>ôõõ%ʆ±X, Ã4ÔçóùJåòòòèèh Ã0 suu•Éd•••DWWWÅT.kôèѳgÏÎÎÎþí·ß Æßþö7u‹NLLLHHpss[±bŽ{÷Øl¶Êû]ÞÞÞDÁÏÏ!ÔÐÐàååEL! düúÙtˆÃá”——“/›››‰=!„±£ôÓ¯˜9ˆ2‡Ã9qⱃBì±;–¨ ”8Õ-+222+++==}É’%ríœ9s=z”™™éââ2cÆŒªª*-gT"‰ˆ‚P(Ä0l̘1eeeÄ¢Àáp´ljA¶Z¹rå‡~xéÒ¥ššš;wr¹Ü®®.„‹Åúá‡Z[[ããã5·°lÙ2@PXX(‰V¯^=sæÌ.kÁ‚………iiiQQQ4qâĸ¸8>Ÿ?eÊÇ™L¦–3*‰‹‹»sçNQQѺuë"""Þzë­?þ¸   ¤¤dÆ ¡¡¡,KûÖ† Cÿ‹€‘cóæÍ===ÑÑÑ þþþ§OŸ&Žþ}ñÅÿþ÷¿ãââöîÝ{ðàA -lÙ²¥««+,,¬¹¹yÚ´iÙÙÙ]–­­íË/¿\ZZúÜsÏiXPRRÒ;ï¼sðàAWW×ääd{{{„63*Ù¸qãܹs;;;çÍ›·ÿ~++«ööö°°°®®®W^yeß¾}Ú75Œà‰? –É<ßnáÂ…S§N}ÿý÷õ6£¡1úMºcãj®eª;w@ Ðušuvv^½zõÇŒŽŽPœJ3;8’ Ã`Μ9†y¨ììÙ³+V¬øàƒÜÜÜÐ@âTšÑØÁ‘L¦Žd0}í˜>ÈvLd;¦²¨Ï·3í@-¥çÛãÙ€éƒlÀôA¶`ú Û0}í˜>ÈvLÜÔ2™çÛÈvLüa`ú Û0}í˜>ÈvLd;¦²ÓÙÔ‚çÛ™ Èv <ßÎd@¶`ú Û0}OÝ9,//o×®]F†]``à{ï½7ÄFvíÚ•——7,ñC“™™9Ä"""†%Ã4ëÑ»EŽÿ­³,¡:]yï½÷©ŽBžÚ·«¨¨ÈÊÊ¢*0ìòóó‡%Kååååçç½`P*++‡åûž••UYY9ôv Ó¯n»M8ÕeeeUTTP…ž0úNú=` †ñOw@@t “‘‘±xñâaiêÝwߌŒ–¦€>aFuúçí˜>ÈvLd;¦²ÓÙ€éd¶kmmÝ´iÇ377çñx«V­ªªª"ÞÂ0¬°°pø"D˜*øˆ!¶†aXCCÀÚöUd8ôÜ1”ú"û˜……E`` æµ\¢T*UÙOžR#ÃÕ²è¹o,]ºTiŠî¾týnþ‚- &ÛÉåòyóæ]½z•gsúôi&“ÔÓÓ3ìñ!„ÄA]¸p(Oš4IËC¡çŽ¡#d+))™8qâ¢E‹¤RéÛ¤ÓéÉÉÉ666á~Z^úï©©©¿ÿþ»ŽW¢ÍV ûü‚QEÅx»~=z´´´T$YYY!„8Ï` ¦µ~±X,²lmm­øR0 «¯¯wpp0ÒöõIÏCGÈ>Æb±âããñÔÙÙI4µgÏ—››[UU%ìíí% ®p/b‰†Ï«Ø¬†À´éxCßv&c0ÙŽÁ`\¾|ùI‹Åø_½ÊÇÇçÛo¿%*!„ZZZˆw/\¸€ã8ñïF±¬ôË¥"Ö>Ù.33Çñææf©TJL …Š=øøñãdûÄD6›½{÷n¢²X,&NÉhh„(h¨@| ǯ_¿Žjjj"Ú?~|JJ ñVUUNïèèPú d;*zé9Ûé¹chÈvJ[Ù××WåºUÙÑéôÜÜ\\ãÖѦóe _˾zýúu¥jŠ…£GõoÞ¼I6®Ž>³U}#88xûöíŠSÔe; ‹Ð°õ‰Ÿ ²©qãÆÇp—Ëåb±X.—ãªú*Žã>¯b³Ó¦ãi6¢²Ý`Ždr8œ’’'·I‹ÅäµU¤ŠŠ ///¢LÈûÆZ[[#„h4šRyø|>B¨¹¹Y s8œÕ«W+VpuuUj?111!!ÁÍÍmÅŠ÷îÝ#¤hh¤ß ÞÞÞDÁÏÏ!T]]M¼,//ŽŽ&.Áruu•Édnž«¡ò0®12„ŽAÆQÚÊ?V¹nUvòj‚ÚÚÚmÛ¶-Z´¨½½]ó¦ì·óhóñµì«\.WÚ!÷õõUlœrTõÝ»wúé§Än±f¡aë?A¤‡k!„a‹ÅÒp#J ŸW±Y ißñÜy»ùóç'&&ÿ/B,ëÚµkJu¸\nYYQ& gqªFlõààಲ²Ï>ûìáÇçÏŸW¬Ð·«Í™3çÑ£G™™™...3fÌ ¿ré·‚H$" B¡Ã0G¼äp8'Nœ þVôÆŽ«î³ ¨²aÒsÇpss+//'_>xð!äááúleÇU®[•¸š€Åb999ÅÄÄ466>xð@óÖé·óhóñµì«šoã[ZZª¸6tñ¥ª~4&Ož¼hÑ¢÷ß_q"Žãh 4l}¥¤Ëápû$yŠN% ŸWË\®}ÇhpÙnëÖ­ÕÕÕ¡¡¡………ÕÕÕ999Û¶mSª³|ùò?þ¸   ¤¤dÆ ¡¡¡Z^tìØ1¢»…~I$’©S§úøø/[¶ ýu,Q¥‰'ÆÅÅñùü)S¦à8Îd2ûm„ü ¡B\\Ü;wŠŠŠÖ­[A^ˆ¼lÙ2@PXX(‰V¯^=sæL•!íkYÙé¹c¬\¹rË–-?þøcMMM~~þ²eË-ZÄf³QŸ­¼zõj•ëV]g 1™L Úšš4o~;Ïà>~¿áõµ}ûö‚‚‚âââõë×k¿nõ€ÂøøxűX¬~ø¡µµ5>>^Ëàµÿn®\¹òÃ?¼téRMMÍÎ;¹\nWW—ºÊƒþ¼$í;@hPW©à8þøñ㨨(;;;KKËÐÐPâ‰â!øÞÞÞØØXWWW6›½dÉÅ劧¬ú–BÉÉÉŠêsÞŽxyòäIwwwssó   3g΄„„øùùõmŸˆáçŸö÷÷g2™^^^©©©d5u3™ÌÆÆF KIIIquuµ³³‹ŽŽVZ qqq\.×ÚÚ:$$„¼¨D10²}m*«+«£çóv¸~;†T*ݹs§ŸŸŸ………‡‡Ç¦M›Z[[‰¹”¶²ºu«®3(~"GGÇéÓ§×ÖÖjØ:ývü¯¨åÇ×ÐWUžs" ;vìðöö¶µµ}íµ×êêê4o,}ž·ÃõÛ7”¶ãG}DNùî»ïÆŒcooO\½I®: ‹Ðò»Ilß­[·òù|KKË©S§’gôU~[ýyñt<Í´Üv¦á©g—Ï»RœŒñ|»áz85<ßÎÀaVPP0eÊ-ë×÷ðôôtx¾1QÛÎ/v†—1Ýä •@Ø·`ú Û0}í˜>ÈvLd;¦oDg»Ÿ~ºÛÝ-¡: `XRRòàâF“Ñ^ÓKuÀP¨ ùF|¦dôèY2Yg{{>ÕèPxxø°´“••5B:†“Óª•+I$ýßG/^¼xñbª£@ ÌŒcáɳðåYøº[wazæTíËmÈêN0}K"ù³tvvçæ © ¨dË5÷_âDë›Î0„aXÈ/Ws Âoäf»¢¢*©TF”e2yii]FÆïÔ†(ôë¯Å]]O_Òé´ìl8˜iˆ:$M“Žú\E4s»»óDk*‚F`„f;Çæ¹åcàVÎ@w Û!„¯¯óýûðÐôG\Ö·³¢ê÷6Ÿyì¾ô±c²OT²Bùù¹h¾T0¼Š³ë;ê$s÷ysm©ŽŒíBhìXçG»»%L&üÁ@¦¾åJ{£1àñ@Oà(9Bùù9Ëdr‘¨Žê@)4Hu@Ÿ Û!„§§Ó¨Q 8u¦ Žd"„ƒAóòrRy«hÀ Ézñ¢ïëhfØ3ÑNTÇF:Ø·û“¯¯³Pûv ›‡ÿkΊ¸wãp ,€}»?ùú:§¤äQ¦ övGÞΊÆû]ã#'¯qV|pT^ø'??—ªªæ¶¶n&Õ±`¬:%¿ï­zp¦‰hûZÆ8–;|›€¡€l÷'__gÇKJjŸÞêX0VeçŶÍüØÝ{[݃  œ·ûŸooi9 NÝ0ã##³'xÏ5ôT'•J1 khhÐ\›7o¶´´ljjÒQT@§`ßîO46v¬3\– ÀPÐÆ1`œN§'''ÛØ ìANûöíËÍÍe³Ù:Š èìÛ=áë Ù€ð¥K—š›ìI°ÝÝÝžžž: ‰0ˆ=N %ÈvOŒ ƒèŸ\‚ßþ®örB…†:†¥¥¥q¹\›-[¶¤¦¦r8[[Û˜˜Ís:uŠËå²Ùìýû÷“É@–5·ãxBB‚‡‡›ÍŽˆˆhll$gÏÍÍåóùGŽ!š’Ëå ^^^VVV—/_ÖBÈÑѱ¡¡A*• çà८} Þ¼ysöìÙl6ÛÂÂÂßß?##CiÚl008øË¯¿»¸¼ÓÔÔNu €J..ïüðà ª£0\ÿל¾°(éÅëù{*q¹Új¡ÐÐІ††¬¬,„ÐܹsÉrii©†¹BBBjkk³³³ Fww71±¾¾ž¬@”5·¿oß>ooï¼¼<‘HNÎtñâÅÎÎN¢©={öðx¼ÜÜܪª*@`oo/‘H4„G,}ÇŽ^^^ùùùB¡pÖ¬Y .TÙ¾†}}}×®][^^^SS“””dnnÞÓӣ޶ì IDATôaÁð‚l÷Ĉ]\Þ¹rEDu €JíÔ©½Ý~üõû‡ž¿vaky{M¯æÊ¡ .à8.“É”Êæ:~ü8Y“Ll*³†öÇŸ’’BÌRUUE§Ó;::ˆ¹233›7n\RR1E.—‹Åb¹\m'—îããóí·ß‹ŠŠB---}Û×ass³T*%j …B• /8’ù„‹ ËÖÖNÝ ¤«Iò¿žü§P.•‡~5vÆGîÚ<ŽÎÚÚ!D£Ñ”Êš¹ººjYSCûåååÑÑцaæêê*“É*++‰·ø|¾b#>ôõõ%ʆ±X,L‹[¿TTTxyye¢ ²} 677 ‚àà`‡³zõê~—†²ÝSüü\JJàÔO©¿×ùøbK@ wáw~.Ï[ëtY*“ ŽãH!£ô‹Ãáœ8q‚øGOì±;–xK)r8œòòròess3±û¥—Ë-++#ÊDÃá¨l_ààಲ²Ï>ûìáÇçÏŸ×f0Dížâëë|ÿ>ìÛðþK£—œô÷_âDÉè‹õÃ?´¶¶ÆÇÇk9˲eËAaa¡H$Z½zõÌ™3ÕÕ\¹rå‡~xéÒ¥ššš;wr¹Ü®®®~Û_¾|ùÇ\PPPRR²aÆÐÐP‹¥íçA!$‘H¦NêããS\\¼lÙ2„9ŒO,¨) %ÈvOñõu..†};”²¡Sµè/¾øB xzz¾ôÒKZβeË–ÐÐа°°I“&UTTdgg««¹yóæèèèèèh//¯ÌÌÌÓ§O‡5‹]´hQXXX`` ““Ó7ß|£í‡ùËW_}µÿ~‡óæ›o®X±"$$dÁ‚¡àààgŸ}°ëF"„Ë—EnÜØ6fŒ-Õ±jp8ï<¸|þü‰TN°o÷”qã\B0êŒ@¸•œlü1¦éøð¹sç0Un¬ Ü9ì)l¶•££Íýû5ÁÁ¾TÇ€þÔÞjÏÛYÙXÒ5a±£L"§Òáÿà9sæò!% d;epÿ00¢´Vöäí¬||±ÅçUöË;=­ÆŒ¢:"t²2__—7Q:×Û!»–X}/«ÞΓzÈÇåùÝ"ãÙN™¯¯sZÚUǵd €ñꬓˆÎ7MÝè:a±£Q<¸€¡€l§ÌÏϹ££§²RÌãÁs=€)cy0£Îøëô†:º2__ Ãî߇Ë2éƒTFèëÊll˜ .TSÙN¸,˜’G¿µüwíi·œê@ d;üü\àH&0â²î³ëE?¾Wjåd&ílF4¸JE…±cþM&“Óéðo¥®&ÉÕ=U¢³MΓ¬¥Œ³÷µ :"(ÙN??çžéÇ ^^NTÇÀÀÈzñ›ßÔÜN®µ`3^þÜË-x4Õ` Û©0v¬3N»¿²0:’NÙýã þÿpš¸ÒÙÌNð'ø2¨Àdšñùöp¡ 0FLcÉÉ /¬ç@ª@|Tóõu.)lŒŒ¢ /øV¨æçç1“ÙN5__ç²²ºÞ^)Õ Zí­öÓ«tÔI¨ãÙN5__g©T^ZZGu (ë¨íýõÿ•Ÿ\UÂ`br)<‰ ­À5™ªyy9™™Ñ…šqã8TÇÀŸžzFÏWðŒ²jfft//'¸,\Ž O4^ûª—ãÁ[ݼç±18.À@@¶SkìXg¸0¸ Ýù¾Îmúè)ë8L;øÚ0`ðµQË××93³€ê(@!š¶è{?ZÀ Á—G-??—Ç;;{©„`CßµüüœårüÁƒZª0TíÔrss°°§î€>Uæµf†ß«¹ÑNu ˜8o§†ùøŒû‡ý訓ì¯zp¦Éq¼•™%êp05í4ñõ…Ë2ÎI:e…ªïe×[9™½² žÑ€N@¶ÓÄ××ùÒ¥TGLYùÏÍW÷Vv6HŸ]:fâ?æ=•••W®\¡: €B</00ê(Œd;M|}««›[[»lmáÑÏ@'œmt °}~µ‹¥£Õ± À•+W/^Lu!„ÂÃÃ333©ŽÂ@¶ÓÄÏÏ!$Ö¼ð‚Õ±Óô÷Æ;´Çá.‹ˆˆ :£a¬_3ýàpX¶¶pêèŽñ¦:Œ |Ó4Á0ÌÇg Ü-Œd»~øù¹À 0D®ӫ<8ÝDu Œ\íúƒÀPô´ÊòvVžXv¿³AbédLס`bà*•~øù974´74´;8XS 0&²^¼èûº›Gkèf<£ÊQí222ô¿ÐAkk“ „L;ÖˆÇüFFFê¡yyyú_îÐåååuw— ¥¼—Ö~ÌUÞ`>ê¹³¿5Ýè¼#k¸¢S‹’­ €ÑÀõŽêO<`£F¹`˜qƒÒÿVÆq<<<œêÏ=ffN4šùÐÛyÕù ®ÅØ¡·£=}nÜôôt-—ØÒÒÃårGÅårÿùÏVVVo!„ t&Žª¯¯7¢fûÒ¼ŠÂÃÃÃÃÇ=“DÍ‘ÌôôtøªŽ†q¯úAíVÖ@.—Ï›7ð¬¬,OOÏ?þøãСCAAA%%%ææÃð—ÂĈÅb¢`ggwáÂ…‰'"„lll( ÊtÀy;€®=z´´´T$YYY!„8Ï`˜ò/†aõõõ‘Åb‘ekkkÅ—`èà¼9@WRRRÖ¯_O¤:‹Å¢ÓŸ<äA*• çààÕØØHLÇ0,--ËåÚØØlÙ²%55•ÃáØÚÚÆÄÄŽ;¦X((( ´´´twwOJJ"ªeee9;;ÛÛÛïÝ»!tóæÍÙ³g³Ùl ò2 Ãrssù|þáÇ<<<ØlvDDOOOÏ;ï¼3fÌGGÇ/¾ø‚ ðœœ‹ÙØØˆaBÈÑѱ¡¡A±Ù#GŽ(­œúúúaZÍ@;ú?xŠJOO×ÿrG&íϯ ;8£ 7úßÊZ.ÑÎÎîäÉ“êÞEìØ±ÃËË+??_(Κ5ká…仡¡¡ YYY¡¹sç’åÒÒRÇ“““ËÊÊ žžž±±±ÕÕÕÙÙÙ4­¦¦!ÖÔÔ”žžÎ`0º»»}}}×®][^^^SS“””dnnÞÓÓC,.((èâÅ‹Ÿ~ú©··w^^žH$ %ú°@ àóù/^ …Ó§OG·Cùùùåççß»woÚ´i ,ÀŸ>«G6ÛÙÙI~ð‹/.^¼ØÏÏOóšéwõâð-Èv&²ÝH`°ÙŽÁ`\¾|™|IþɋŸ_¿é>>>ß~û-Q¡¨¨!ÔÒÒB¼{áÂÇe2™RY]&`³Ù»wï&Êb±X*•"„®_¿NÎX__ßÜÜ,•J‰:B¡P1oeffâ8>~üø””¢BUUNïèèððð8|ø01ñÖ­[Šs=z”˜~óæM"x¥lG4‹ãxggç×_=qâÄ3f¤§§÷ööª[oítŽdt…Ãá””<Ë!‹«ªª”êTTTxyye¢PYYI¼´¶¶FÑh4¥²:‰‰‰ nnn+V¬¸wïq¼”Ëå*ÎØÜÜ,‚ƒƒ9ÎêÕ«gçóù¡òòòèèh Ã0 suu•Éd•••ÕÕÕcÇþy…-YPŒ!äë뫼R³çÏŸwss»}ûvjjê… "##ÍÌŒûJo£Ù +óçÏOLL$ö«B,ëÚµkJu¸\nYYQ& gp‹›3gΣG233]\\f̘AdVâD)88¸¬¬ì³Ï>{øðáùóçß"2"‡Ã9qâ±7 —ËÅbñرc¹\.™¶E"‘â\¥¥¥DáÁƒ*ƒ'šår¹S§N=þü™3gÈk/>n¶kmmÝ´iÇ377çñx«V­"ÿbVXX8ŒËö p‰†LÏÛZ‰þ7„T*Å0Œ¸ŠÁ´mݺµºº:44´°°°ºº:''gÛ¶mJu–/_þñÇ”””lذ!44TËk;V^^®X˜8qb\\ŸÏŸ2e ŽãL&³ï\‰dêÔ©>>>ÅÅÅË–-C55=uÿÒeË– ‚ÂÂB‘H´zõê™3g"„^ýõ>úèòåË< /“!lß¾½   ¸¸xýúõdð}óÙ„ NŸ>}öìÙªªªgžyfÕªUׯ_׿c‚áb ÙަsõêÕ¬¬¬ÊÊÊÓ§O3™Ì   žžªCÃLÿÛúÂ… b“&MÒтԡÓéÉÉÉ#a•““Ó•+WØlö+¯¼âííýÍ7ßô»hÑ¢°°°ÀÀ@''§o¾ùFËÆ_ýõË—/+’’’~þùgØØØääd{{û¾s}õÕWû÷ïçp8o¾ùæŠ+BBB,X XaË–-¡¡¡aaa“&Mª¨¨ÈÎÎFÅÅÅ-Z´èµ×^›6mÚÒ¥Kë¯Zµ**** ÀÉɉ¸ð288øÙgŸUJ¢OOÏÏ?ÿ¼¤¤$ à½÷ÞÓò“‚á¡ÿS…H‹«T>ìììÜÞÞ®8‘8íŒëà ÃÞ º¥(ž»&—ˆts_‚á_¥b’ÛZqqŠ]GÚ`¯R1yzîN}ÁU*Ú3Ð};=ÓéKå œW_}u×®]D…üü|‡®®.u1Ç©ˆ²Ò(’âtÇûôÑæ5ýoëöööæ¿§”4´O–Ò¼,•Fqãö†EN:ÅårÙlöþýûB‰$&&ÆÉÉÉÕÕ5))‰ÉdÂAo†þ,ÒbßNÏÃtPŸ?h*å=z400¨ðöÛo¯Y³FC }ÿÑ£þöíöíÛ×w 6ŸHÃß·Óÿ¶VDl 퓃¥4/KÃ(.•ûvн"$$¤¶¶6;;›ïããsíÚµ»wïÓéô~÷`ßnÄ‚};íh¶Óó0¾o©”ÓÜÜÌd2+++e2‡ÃÉÍÍÕà ²Ê>ƒûD$ÃÏv”okÇ5´O–Ò¼, £¸úÍvÇÇ„ùøø|÷ÝwDµÛ·oæV†lg ÛiÏ@dêy˜N_*åŒ=zöìÙÙÙÙ¿ýöƒÁøÛßþ¦!†AP9Ðg¸>‘Á¢|[knŸ,Õï²4Œâê—«««bSžžžDÙÇÇg Ÿ ’þbêy˜N_êåDFFfee¥§§/Y²Ã0 1à8Ž˜üTô®Od°(ßÖšÛ×2wjÅÕ/¥a...ÄõôHa,`ˆ 4Ûéy˜ês傺A9 ,(,,LKK‹ŠŠÒ‹Åúá‡Z[[ããã­nT)1]å@“§ÿmÝ× Û'iÅ¥¸ÑµV½}ûöëׯ—À(¥C0t*Ç;ŽA#—þž"íî“ùøñ㨨(;;;KKËÐÐPâ·â¹œÞÞÞØØXWWW6›½dÉu§Äú–BÉÉÉJE'Ožtww777 :sæLHHy ×ùóçO˜0(«‹á»ï¾3fŒ½½=q 1=88˜Éd666*FNïíí‹‹ãr¹ÖÖÖ!!!ä(ý~" ÿ¼®÷mÝw¥ º}²¬®Ã(nt¥@ž·S:ƒÛÝݽnÝ:;;;â*˜[·ni^pÞn ªÑ ÉÉÉÝÝÝ”Ä3hpÞN{®÷‡‰cfÔOs]¸páÔ©Sßÿ}ªÑ ñœOýoe„PDDBžæ:wïÞ}æ™gêëëU”&é+Sد†Å Aghà[¦==’i˜:;;¯^½úã?FGGS 0Y&Lؼys[[[MMÍÖ­[gÍš¥9Õ Ô¤Dåä主»³X¬ðððºº:ÔçH&q-AÝ€l7gÏž={ö|àææFu,Àd¥§§_»vÃáx{{wtt:tˆêˆŒØÎ;ÓÒÒ²²²®\¹R[[ûÆoo:tèäÉ“—.]ªªªZ±bEßyóóó½½½ããã‰\ŒƒêŒÉk¯½öÚk¯Q0qþþþ¿üò ÕQ˜ˆ#GŽ|ðÁ/¾ø"Bè‹/¾ð÷÷ommµµµEíܹóÙgŸE%&&Nž<¹ïDsæÌùí·ß<øüóÏÏœ9ó­·Þš:uªþ?.°o0YFRz{{???„PuuußÙù|þ'Ÿ|"‰^~ùå5kÖ@¶3jí&KÃHJò1uB¡Ã0§®¡PxåÊ•ÖÖÖÙ³gë8^ Cp$`²ˆ‘”~~~£GVI÷õ×_c¶nݺˆˆˆ¾`êééÉÌÌüòË/{{{ßzë­={ö˜››ëý€aÙn˜uwKp·°Eu @[Õ×Ú]ž·¦:  ±±±íííaaa]]]¯¼òʾ}ûÈ·6nÜ8wîÜÎÎÎyóæOŸPræÌ™³gÏ~þùçz è 5ãí¸\®ž—«8ŽîÞu´±éuqi5JNu8¨²²2??ŸªñvùùùþKáÞò¢móm§¨dHô¿•}¼JÆ8ÆÛi‚óvááᦚêB†8œöÊJ›ÂB—’vGÅ;y\.7<<œ’Exªsn?¶if/­‹ê@†ŠÂ­l Î;‡©"´lááÇ¡Q£à¨ŒÉ¢àH¦Éÿ Áq<$dWQQ•XlS_où îëÖÍzåmdÝíð½÷Þ£:M*ó[Ïm,Åq|A䫯ûÕá€!™3gÎPv4ËÊÊüýýW®\I N& ®É~†}ðÁ|„p©T†ºvíѪUß<÷ÜŸ~®¹¹“êèBÕÜhÿñR\Žhf˜¹ œ½é<==;;;9Bu @‡ ÛéÄK/ùxÑé4„\Žã8ÞØØ±wïO“'¸ys†H·f R£°ëÜ‘\†ŽãrÜÜ–NuDƒl§+[·Î—Ë­àR©¼»[’žþûôé ¯¿þõÅ‹%jg:ÓöGï™õd½8.ÇB¸ ‚lÀÙNW&MâO›æÃ`(ÿ’J$2ÇûM¸xñ—aaûÛÛ{( odêj’œ^]ÒÛ&“Ëžü1·…#™˜>Èv:ôþû¯Êdª!H$2 Ã/~ÁÚƫꉤSvv½¨³^"—>u9É¹š ©Žèü«Õ¡‰ùóæ=ûãE‰Lé- Ã>ùäµ%K^¤$°HÖ‹ŸÛP*.íVÜ«#ÀU*ƒF ö2^ŸLÿuwÁ‹õVT2x†?¤ÕpÀ¾nmÙòª\®¼{‡a(.nÞòåÓ( iÂåø/±euEí}S‚}»AáñxÆ>ÂÏɲÃÛ®)еŠê@†$ 00ê(Œ÷Ri6lH9yò¹{G£a£G[~óÍ?§Nõ¤6°‘#oWeQjRuP£coü>IïP´ÝÞŠFC¯Þ£: °o§s›7Ï%/ÎÄ0,*êÅ9sü##¿úè$—Ëž0Á•êMœ½¯¥[ðhI§\\ÖM£Ó𧆅 ö¨g¢œ¨Š PF| ÝG!š2³EcfQÐ9ÈvúàïïzøðÅ©S½¾ùæŸfft ÃfÌð37g9,–ÅäÉnThâ,Íý4bþüI£F=Yáë×ÿÝÒrÔÖ­Ç{z¤o¾ -uÎÒÁŒn†™Û0&­s7½¾åq†!& .QpTþÂ%¾ê¬@ÈžKnâ Ûé‰ÊÁ+WþÍÚš“&wþ¿ÿªÿ¨Fiüþñ†ñ‘Ž–8MXìTõ{[Qjí(~05ä¡®ê'/ifèQ*d;“_uŠED¼`nÎØ°!¥½½;>þµ‘öœ}*;/îíýyÜC®/Ú¸¾h#ë¥þ„@ߦ"š’ÿµo'— òchÒN„Á޾)ƒlG½ùó'YZš¯^}´­­{Ïž(®Ô‰¢´:ÏÙv–fŠé£`m0¸•{’ê= ¨î74f&E1}€¯ºA˜={ü÷߯ùé§»o¼ñMO”êpLPÍöFaׄ%ŽT¨Vó+’4+O¤™¡GßS ÐÈv†" À+#ãÍÂÂò¥K¿êè€[E³»iõެœüøQ`xÿÈ‘#šqóæÍÙ³g³Ùl ÿŒŒ ¥E(–ÑÓ™ïÔ©S\.—Ífïß¿!$‘Hbbbœœœ\]]“’’˜L&…‡†ŒÞI/ôÇÕ½Y__¯4%%%eýúõVVVŠ•2†Þ¢¹bvìØ1Å‚:dÇÛ¸qcß~…Tu„PAAA`` ¥¥¥»»{RRÙZ¿SeBNNŽ»»;‹Å ¯««#§ã8žàááÁf³#""È• øÈöÕUÖòkÛÜÜ,•J5¬®'p`Bš›;BCwO™²M$ª¥:‚ mhhÈÊÊBÍ;—,—––j˜«¾¾Çñ;vxyyåçç …ÂY³f-\¸¬tñâÅÎÎNÍ‹ðõõ]»vmyyyMMMRR’¹¹yOOâ"Ô•B!!!µµµÙÙÙ £»»;>>ÞÇÇçÚµkwïÞ ¦Óé:]{¦,áÒûN¾xñââÅ‹ýüü”¦ÛÙÙ󌠨¨’êX BèÂ… 8ŽËd2¥²†TA~}||¾ýö[bbQQB¨¥¥…¨™™©Í"ˆ¿ŸDM¡P¨˜ÌúÍvÇ'›ª¯¯÷ññùî»ïˆj·oßÖü@?žÎv_ýõĉg̘‘žžÞÛÛ«TÁ`\¾|™|Iî3ˆÅbü¯Ÿr ½e\R¶#:ž†~¥Ômpg³Ù»wï&*‹ÅbbH›Î©¡ñ)p¿~ý:Bˆ¸¤«  `üøñ)))Ä[UUUt:½££ ÆµÆ IDATW“í4TÖr=zôhË–-\.÷õ×_¿zõªºÕG2M••yrò¿¦Lñxíµ……åT‡£? ŽjÇZ[[#„h4šRY^^^D™(TVV/ù|¾6‹hnnÁÁÁgõêÕú\®®®ŠMUTTg}||ÔÐàüùónnn·oßNMM½páBdd¤™™òmç8NIÉ“ÇLŠÅbò‚L’†Þ2”N¨„èxú•R·A%&&&$$¸¹¹­X±âÞ½{äÑ×~;§† ÞÞÞDÁÏÏ!T]]M¼,//ŽŽ&."uuu•ÉdäJèKCe-ןÏÿä“OD"ÑË/¿¼fÍš©S§ª\d;4j㫯–Ϙá»dÉÁÜ\!Õáèƒ\†ÿ´©ìFR.çr¹eeeD™(p8⥖¿VÁÁÁeeeŸ}öÙÇÏŸ?? ¥+ÝÎÅÅ¥¼üÏ?1¥¥p›ÇaÃår§Nzþüù3gΗAö5þüÄÄDb÷!Äb±®]»Ö·u½eOC¿ê{CÁ9sæ}öìÙªªªgžyfÕªUÄÑ9E[·n­®® -,,¬®®ÎÉÉÙ¶m›RA÷–cÇŽÿcÈB¿4ô«¾&NœÇçó§L™‚ã8“Éì·¢Cj¨wç΢¢¢uëÖEDDÃf–-[& E"ÑêÕ«gΜ©2$¢}-+«ÓÓÓsìØ±iÓ¦­Zµ* àÞ½{Ÿ|ò‰êªš£&—Ë·m;Áå¾—–¦öX¶i8¹JøcŒ¦ëMϨ,«œ‹8¯ÐÛÛëêêÊf³—,Y¢xv­ßf‰òÉ“'ÝÝÝÍÍ̓‚‚Μ9B\Ìd2•ÊHáÔˆÒyŽîîîuëÖÙÙÙyxxgìoݺ5¨uÔ^¥ÒÑÑqèСéÓ§÷}ëñãÇQQQvvv–––¡¡¡ÄÞ›ây»A÷„Prr²b„úœ·#^ªëW}» Žã?ÿü³¿¿?“ÉôòòJMMŵ’’’âêêjgg­´âââ¸\®µµuHHyQ‰b`dûÚTÖðµÍÉÉ‰ŠŠÊËËÓ° ®p®˜¤~ùä“ÿnÛ¶ð7‚©ŽE'Š;/½ÿêW>œ)#kDöÝ»wŸyæ™úúz{{{ªc1N'½Ð”}ˆ3ê8€>À‘LÓ·~ýß·oû¿ÿ;±k×À΋⬶ÅàRݹsçTÞŸI  {œÃb„ ›7onkk«©©Ùºuë¬Y³ Õ ÞüRHu#<ñgDX¹òo66ï½—ÚÕ%1±gÀv·HEg›7q7ûœ9sŒëðFzzúÛo¿ÍáppŸ6mÚ¡C‡¨ŽãÙn¤Ÿ2j}Æ”ööîøø×Læ‘xN7ÑFa^sô}7KªøûûÿòË/TG€ñl7‚ÌŸ?ÉÊÊü_ÿ:ÚÚÚµwo4ƒa DZ}Ø;ù[™YšÂgè\¥2âäç—._žàuèÐ ssø» ÛD·oWDE}5nœËÑ£oXYÁ½ö¦²ÝõàAíâÅ_º¸ŒNIYÃbYRèœí¡||Æœ8±A,Llll§:¨0ÀçÛ£Ùnäâóíß •ÊÃÂöUW7Sz§ñùvÀÄ@¶ÑÆŒ±ÍÈxÓÜÜlÁ‚/>Ôës„@Ÿ ÛtÖÙÙë]\X ~Q\üÕáh—£k_VwÔJ¨`4 Ûdkk‘–¶vÜ8΢E®]{Du8ý{ô[ó#ÕÒ9ÕŒd;€B£¾ûî_/½ä³dÉ——.•ô?¥î¦ÕsmGóaì@[íÀŸÌÌè. }néүϻCu8j5=èú£ mÂb'ªÈvà :¶k×’å˧­YóíÉ“7©Gµ{™õ£Ý˜¼ [ª¸qx †aÛ¶-´µe®_ŸÜÞÞ@uDOéi•>øoÓ 8ÈDnj (eí‰ÖTô²P!&f“iöïg´µu¯Y3ƒêpžþÐH£c¾óá‰n`8Ì/¥: ?í€jë×ÿÝÆÆâý÷³Ú ç‘xµ7;¼ç²Í,éT02pŸL Éñã×ßyçû¥Kƒ¶oÃ0ƒ8z(í‘3Ìá|3```ßh6ÙÚÚ|õê£ííÝŸ¾Ä‰©0°oúwù²håʤY³ÆïÛmfGƲÐÊÍ›£¢¾š2ÅýСL¦ÕáÀÀ@¶Ú**ªŠŠ:èí=æÛoß°±aR œÚò÷w=~|ÃãÇ‘‘‰MMðT0`üàùv# d;0^^N'Nllmí^´hMM Õá04ð|»‘².×îĉ t:máÂ}úy$Þ…mg׋¤ÝðÄÀàA¶æèh““³ÞÑÑ:,lßýûÕº^Ücu2‰œÁ„¾ <øƒ1z´ezú›cÇ:GF&Þ½[¥»µ<êy|©žx"Èv`,-G%'ÿkÊ×^;PPP®£¥g×ÛpF¹Ï­£öA_ØÈ°æ0òza1ÕQèCDDÕÝŠzp/0x£F1¾újù† Ç–,9xäÈ?§O÷Þö{;d÷7NZåŒÑ â¦e#Jzz:Õ!èÃß©@vïÞMu²33ú¯ÇÆf.[öubâ믾úÜ06.:Ó„Ëq¿EÃØ&ÐRdd$Õ!€á‘™™IuŽd‚¡¢ÓiŸ}¹jÕßÖ®ý.=ý÷akGE©u^sìÌmá^e€¡‚};0 0 ûàƒööÖï½—ÖÖÖýÆÁCo³·SÆö±á8ô¦²6ë×ÿÝÒÒ|ëÖœ––®˜˜!¶6ÊŠ>û?žÃ@¶ÃiåÊ—ll˜ï½—ÚÝ-1œgÀd;0ÌÂçŒÅذáX[[×'Ÿ„ÓàrJ€€«T†„êQ4jÁ‚Iuu?<ø5N§:–GŸý¿µµuÓ¦M<ÏÜÜœÇã­ZµªªªŠüjêté†54 ÿ½ëtÔ,¢zuØ·ªwÞy'00ê( ÖT0‚äååíÙ³Go‹“ËåóæÍÃ0,++ËÓÓó?þ8tèPPPPII‰¹¹¹ÞÂ0°º(Ùn¨ad0úÌvG---‰DVVV!GGÇÄÇÇ3¦ü«‚aX}}½ƒÃ€Ç€ŽÌÕePàH&`0RRRÖ¯_Oüv“X,þd|¤T*<ÏÁÁ!**ª±±‘˜ŽaXZZ—˵±±Ù²eKjj*‡Ã±µµ‰‰!+;vL±PPPhiiéîîž””DTËÊÊrvv¶··ß»w/BèæÍ›³gÏf³Ùþþþdk¹¹¹|>ÿðáà l6;""‚ˆ§§§çwÞ3fŒ££ã_|AaXNNއ‡‹ÅŠŒŒlll$;::‡:Éf9¢´rêëëõ¹º€Vp0¡ôôtª£Çqœ¸×—ÞÚ±³³;yò¤ºwB;vìðòòÊÏÏ …³fÍZ¸p!ùnhhhCCCVVBhîܹd¹´´Çñäää²²2Å‚§§gllluuuvv6F«©©A………555¥§§3Œîîn__ßµk×–——×ÔÔ$%%™››÷ôô‹ ºxñâ§Ÿ~êíí——'‰BCCÃÃÃq|>ÿâÅ‹B¡púôé¡úúzb.??¿üüü{÷îM›6mÁ‚ÄDâ]Åf;;;É~ñâÅÅ‹ûùùésuiN|Ò²Ý@¶†CÏÙŽÁ`\¾|™|Iþ‹Åø_?ß>>>ß~û-Q¡¨¨!ÔÒÒB¼{áÂÇe2™R¹  @åâØlöîÝ»‰²X,–J¥¡ëׯ“3Ö××777K¥R¢ŽP(TÌ[™™™8Ž?>%%…¨PUUE§Ó;::<<<>LL¼uë–â\G%¦ß¼y“^)ÛÍâ8ÞÙÙùõ×_Oœ8qÆŒééé½½½Ô®.Eíp$0§¤¤„|)‹É+ I^^^D™(TVV/­­­B4M©¬NbbbBB‚››ÛŠ+îÝ»Gär¹Š3677 ‚àà`‡³zõjÅÙù|>B¨¼¼<::š¸xÕÕÕU&“UVVVWW;–¨FcFùúú*¯ÔìùóçÝÜÜnß¾ššzáÂ…ÈÈH333jWè Ö`0æÏŸŸ˜˜Hìa „X,Öµk×”êp¹Ü²²2¢L8Îà7gΜGþÿöî= ¦¼ÿøwšRè~‘j¤;JîZ‘Ò*±©M±Øu/¹Ôo±ž}û„õ Ö%—–¡lV.»ŠÇ%—HXD%¹Tªiæüþ8»óÌ3MÓTÓœ™éýúët:sÎ{Fæ3ç|Ïg¾O9baa1räHºTˆu\xzz}ûí·Ož<9sæŒè¯èÚ`ii™––FÒNNNGX‡ EõèÑ#zááÇÃÓ»åp8nnngΜ9}útEE…Äü ~¹ !T;EPdŸâwÚúˆ...ÑÑÑÂ}}}ÇŒ#üqãÆöööõõõÛ¤[)Fñ­NV!ÑÑÑ/_¾ôññÉËË{ùòejjêÚµkŶ™>}ú7ß|“››ûàÁƒ… úøøʲ󤤤Ç‹.ôë×oÅŠÖÖÖƒ ¢(JGG§á£x<ž›››££ã½{÷BCC !oÞ¼Ý 444***//¯°°pΜ9\.—2mÚ´uëÖýöÛo>»ï#&&&77÷Þ½{óçφoXÏ\\\Nž<™‘‘ñâÅ WW×Y³f]¿~]‘/È„Ñë¨*È0nÇçó‡ æááqùòåÒÒÒ7nÌ›7ÏÚÚº¦¦†úëz½|#Éw‡ŒñË/¿=z4½\[[««««­­]UUE¯™4iÒŒ3Áþýûé—T,›p”Etevvv…á`Â4¸5"2n·~ýz}}}ÿÒÒRŠ¢<==uttÊËË©Fþò«ªªvîÜ9bÄE¾\ÒaÜŽ†j×*²T»„„„®]»VVVŠ®¾Ãªhµ{£ýï×°º´Ò¡C‡ EQÙÙÙ§N¢kii™˜˜(%›Äj§ÈMæ‘ÅW;õ¦øŽmÕŽ†+™mNÁmI IlB?~ü¦M›è ._¾ljjúñãÇÆ2/¸ÑËb]GB¢ë)ŠjØØ$Ë3jÈÓÓóÝ»w÷îÝ#„œ9sf̘1^^^™™™„/^>\J6±–,ZeeåÛ¿ÐC)Rþ „=UÒÃK|Eó4ìÖ.¤§§s8ccã­[·Bx<ÞÒ¥K»tébeeµ{÷n|­@k1]nU‘áÜNÁmI¤ÁR‰MH{öìqww§7X¼xñܹs¥dhxjBš:·‹oØØ$Ë3’ÈÁÁ¾G|À€ÇŽKOOwrr¢(*%%ÅÂÂBz6±–,Jäæo^ÊÓöTI/¥ÙKâ¹h`//¯’’’””:dll¬££ãµk×îܹãééÉf³e9ÉÀ¹H„s;þ¦[E–j§à>›†¿’Ø„ôöí[çÏŸóù|KKË .HÉЂj'±±©eψ¢¨™3gΞ=»´´´C‡ïÞ½«¬¬ÔÖÖ.**ŠŒŒ ”žM¬%KâKDQ””§/ì©’^J³W“ÕîØ±c¢!÷íÛGovëÖ-é/ŽªH„jGÕÌ6ÇxŸÄ&$ƒÑ£G§¤¤\¼xQSSsøðáR2´€ÄƦ?#OOÏ+W®dee |888XJCCÃãÇ¿ÿ>66VôÐuÑÒë%66µ˜¥¥å±cÇD«Ý©S§455{÷îÝX†fi}«“”f/Ñ<²d ‰‰‰¹~ýú½{÷è[`]¹r%‡Ã™6mÚ•+WZÿ‚£ÚÑp%Fw4JiXëG$Lw'}'Mnààà@/ôìÙ“òòåKúG)Í£ µ¾ÓÔÚÚ:..®°°p̘1sçÎuss“òÒìPí€aô›¾”†Å† §»“¾“&7NnWPPÀb±ºuëFÿجæQyušüþûïïß¿=zt  ¡Ú€üIì•®ÉÙéD56Ý]“]R6X±bÅíÛ·óóó¿úê«€€===z½ŒÍ£ré4­­­MJJ6lجY³† r÷îݸ¸¸fíÅØ5Tµ@0nJC©ÆíHƒNPÑ_‰ÛÑ?69;%2<&qº;Yº¥åÀVVVFFF!!!bí°M6Ê«Ó4555888''§•¯¿(ŒÛÑXTƒ~d‹ÅZ²d‰»»;ÓAÚ—'O*Y,Ò½».ÓA”KNNΖ-[Zÿ?ú§Ÿ~úüóÏñΠ6!GŽa:Ã4™ ò¶lÙ²e˦S´/Úff¡AýÇ÷jjî×׿e:(;T»VÁç_¦;v}þüýzzîzzCúöíèæç×ߨ¸sÓ€v w©€Jš4i—ÛKS“E¹uëù×_suöñÙ’””óáC Óé@é ÚªÚ¸1€ÍÖ „PU_/ (êæÍg‘‘Gz÷Ž Ý•ž~ƒÇã3”ª¨*ÇhÉ’±ÿíÄâóEñxüóç æÎÝçìµhÑK—à‚3 Ú ûòK®¥¥‘hÁ£Õ×ó ¡ªªjRR®-ZtàÍ›*Fâ€ò@µ¦­­"åÌMK‹}àÀ\ô*´w¸'TÛ'ŸØùûLK»^_/û‹ÅÚ¶mª³³%#ÁTèT8ÊWÔIPÜQÛC|. „<þœÃá0‚y¨v òÖ®øóÏùïßÿÏ­˜¬Ù³GŒß—©TªîóÏ?g:‚L ´L'[-q3·õÑâÛñ¿1GIMž<™éÌÃw©€:8p gùò#Â?fMM }ýŽæ»w‡™šâ2¦zð¨üC¥y?¼ä× tŒ4§þìÊj0‚ „q;PÁÁCúõ릩É&„°Ùææ))ókjx\îÆœœGL§ù{xòÍÁñ·s·óëlV¯ÏLQê@:T;P,kãÆ@@@ÑÔÔØ»÷‹=,RS êôÃÁƒ—™rSñècúìç×<­yÃÔS„€êágÊt.Pvì5kÖ0@ºtѯ¨¨¾qã­[§zx8B´´Ø>>};tÐüúë´W¯ÞÙ“îFUWÉ¿ú}ñ…uT—ñ(þŸW­YlÒÕµ³ë4sf³òø¨ÊÊÚƒ/Ï™3Blý¹s÷æÍÛß³§Å®]3ÌÌôÉ­A HAÚëÜmÅu•ÁÿÞ|Ëbϯ»;ùš0• Tª´ —……%~øP“Ö¯Ÿ5Óq JnUý¶áò‡ EHƒ·+Mmi¿ôÑ숳vhþD ]°µ5;yrIß¾Ý&MŠÿé§\¦ã€¬œ,?9ëAEa H(uš,»ÑF(u ŒÛA{Ñ¡ƒæ„ ý´´ØQQ©%%ï¸Ü^ ¿r ”‘mǪ’º×%þ–÷eÝô,;(8¨"\É„v'=ýFxø!77»~˜f`Љé8дû©¯]ÿŒŠ³c}+íÏ»0 T ®@»ãëÛ/=}qQQ™·÷æû÷_2šÖó3S¯Ù±µ44Øÿ]©¡Áê17§€¬Pí =êÕË2##¼[7c_ßïOºÉthÚóß>°ØDÇXKCóÏëÏ”€8ŽGµY¡ÚA;edÔùàÁ¹3fxÌ™³76ö¤@€KúÊëöÒ;É¥#×ÚLÜÛÓÐFGƒÍbi°,ëvî¢Åt4P¨vÐ~±Ù«WûÄLJ$$\œ1c·Ø÷Jƒ’xzþÝ•-ÏÍ·´eØÙ\ËoOÎ0=J@õ˜ˆïOfÀ]*äöíç3g&jkkîÙó…ƒC¦ãÀ•|Lÿ¢ÀÁÛØcÕ»$)¹¾ëe¿0sv|^Y¡ÚBHIÉû/¾H|ð $>>dìØÞLÇB©*á¥M¿od«3.ÞA8\Ð2ød@!ææú)) |}ûÍšõã¶m¿àS 2Èùƨ8[”:h=œÛü¤¤œÕ«S¼½ûlÞÔ±#Ú–™T]ÆãU ºk3Ôª€¸«W‹fÏÞcf¦÷㳺u3f:È®dˆss³ËÌŒÐÒb·é×_2äÕ@ ô´E£G;ïØ¶í¦ã@káJ&€4»w_\»öøÄ‰¾ý6PG½Ìª Õ  ÙÙ÷çÍÛïàÐe÷î0ss}¦ã¨­ú†KƒÛ/¡MàJ&@¸Üžá••5ãÆmºví)ÓqÔ% Ù«Ÿœ~ÂtP[¨vM³±1MO_2`€µ¿ÿÖC‡.3G ]Þüüùå÷®SÍ™j ³¹È„ž ¶Cöÿý_Ú«WïFŽìÉfãâ|Ü=ZvmÇKn¬ ç\(†¶‚q;€æÉʺ³`A’³³åÎ3ÌÌô˜Ž£ò^\ù¹°°_X×_Y0Ôª@³Ý»÷ræÌ„º:~bâ̾}»1G…½{Zs|Fg¨þ¨[‚ÛS -áR @³õêe‘‘áèh>q⿎Ée:ŽªâUó³þ^¤kÑaøêî(uÐÖ0nÐ::Z“& ¨®æ­[wâíÛ#FôÐÐÀvó°55êªøn ­tŒ4™ÎêW2Z%-íúÒ¥ÉC†Ømß>ÍÀ ÓqÚ/‹UVVfjÚŒ)^[ðP]¸’ Ð*'8~|ÑÇ%ÞÞ› ^1G°X¬Ã‡s8==½•+W:tÈÒÒR__éÒ¥RB133{ýú5EQ6l°µµ566(//'„ìØ±cÀ€õõõ„ˆˆˆ   ч(ꙣ(hµòòJÿ­ŽŽ‘§Oßb:‹Ê#„øøø¼~ýúèÑ£„oooáò£G¤<ª¬¬Œ¢¨øøx‡œœœÂÂBŸÉ“'S%¸\îúõë¯^½jeeU^^.úhPíäƒÇãGE¥ZZ†ÇĤóù¦ã¨0BHvv6EQ|>_l977WÊ£èÒåìì|àÀzå‹/ØlvUUEQ=211qrrJOO{´¸’ ššß|3iãÆ€;χ…%¼_Ãt"¦««KÑÐÐ[–ÅãÇCBBX,‹Å²²²âóùÏŸ?'„ØÙÙy{{óx¼O?ý´Í‚ƒòBµ§©SÝóæãÇo~ô¨”é8JDÀ£²–•ܬlëYZZ¦¥¥ÑçAEE…““!$/ª‚m IDAT/ïüùó&&&ñññm”ª€œ l›™¹TOOÇ×÷û‹ ˜Ž£(’õ¤8÷ƒ¶A6TTTBBCC£¢¢òòò çÌ™Ãår !µµµÓ§Oß²eKbbâš5kž¾©×³ì0j½ J0çv BQÔöíçÖ¯?<$6Ö_K‹Ít"€vÕ@¡Îž½»`Á~''‹]»f˜›cªnAµP´GJÃÂ>|¨MH0 ;ÓqÚŒÛ(š½}—S§Âûôá|öÙÖää«LÇhpnÀ >_°aÃéíÛÏ…„` Í¡Ú0éøñÿDDîÛ·ÛÎ3LMu™ŽÓ*µïùùKûÑUCw`‚ÒÁ•L&ùùõ?qbÑ‹ãÆ}wëÖ3¦ã´œ žú%²¨àøëšwõLgÕ€a..V¶¶¦Ÿ}¶õäÉ›LÇi¡KßüQv·Ú{›c'-¦³H€jÀ}:¼¶¶ÞÛ{Óï¿*츔€:»¼¨ª¤Žk«°ƒÈª€Š±³3;u*|Ð ›  .*æ WÿU\œûaÌ?íõ,Ñ*‰½fͦ3@ótè éçן¢¨¸¸S%%ïFŽìÉf·á'×{)¯s·øÚÆz¸AÛ MaÜ@…8q#"â‹‹Õ®]a]ºèµÅ!Šs?d,(ì3Í|ð˶Ø?€b Ú¨¶»w‹gÎL¬««OH˜Ù¿¿œ¿šYÀ£’'Ý1vè8v“Ki¿½ @¨vâ6mÚ”““ÃtŠf¨«cß¿oR_Ïîßÿ‹%çÿÑúµ]«;¼©gÕÉw· áîîÎt `’&Ó”NNNÎ… œ™Ò ]»–ðxÚ¯_×È}Ïe¤LîûT° . Úµs¨v8;;ã.µÁår™ŽÌC¨?T;P¨v þPí@ý¡Ú€úÃ=™-W]]½wïÞìì슊 ##£AƒÍœ9ÓÔÔ”ÂårwìØÑ£‡Ü¦ û•áˆï–TðÓ„vÕ …(ŠŠŒŒd±Xk×®µ°°(//OOOŸ?~RR’–“Ï©¢ôôtzÁ××wóæÍ„N:1 Ô®d´Pfffqqñ?þñ^½zÚÛÛ/Y²$!!Íf3­å¸\î»wïd_ßJº!„tìØ‘^ÖÐõ}©RZBµh¡¬¬¬‰'êè舮{³æóù ~~~111ïß¿§×s¹ÜsçÎ|úé§»víúå—_&Ož<~üøíÛ· 7ÈÊÊ]h¨°°péÒ¥&Lðòò ;þwîÜÚµk·mÛöæÍ›o¿ýVø«³gÏ&$$¬X±âàÁƒYYY‰‰‰‘‘‘GŽyùò%!dÕªU½{÷]hhݺugç·ˆ‹‹«¯¯çr¹.\ 78wî܈#RRRË &;;›’––f``ÐØú´´´Ó§OGGGïØ±£®®nÓ¦M2>#ÙI<„¯¯¯®®nrròýû÷³³³ÃÃÃK ª@ UWW‹¾ÏrÿRYY)\™‘‘1}úô^½zq8œE‹ýúë¯ÕÕÕô¯õõõ‡N .Ó§2cÆŒ±°°]hè‡~X¼xq×®]ŒŒúôéÃãñªªª<<<>|øúõkŠ¢ÎŸ??zôh)ZàøñãaaaÎÎΖ––K—.½téRmm­,Ϩ•‡`±XË–-KNNŽˆˆÐÓk“é@á.€211yö왋‹ ýczzzmmíäÉ“E·)--µ´üsZ8z¡¬¬¬{÷;BX,–زì*++<˜ŸŸÿâÅ ‡C¯ìܹóÀ/^¼hggÇf³]]]¥dhW¯^ÅÄÄÄÄÄ×”••ÑGoý3’~ ‹O>ù$??È!- íª@ 6ìøñãcÇŽ¥êtuuoݺ%¶™™Yqq1})’¾ gbb"¯‹-rvvþòË/)Š;v,½~äÈ‘§Nzúôé¨Q£X,–” ô„_ee͘åÀÄÄdÞ¼yÆ £^UUEßc"G¢  àÆÆÆÆ©©©þþþò=(¨=\Éh¡ÐÐÐòòò•+W”——_ºtiïÞ½bÛxyyíß¿ÿþýûÏŸ?ÿþûïÝÝÝe¬ YYYte.B>~üXù@Àçóéë“OŸ>‹‹#„|øðâááQPPpîܹѣGKÉ ««ûÛo¿UWW'%%‰šÞICôz//¯„„„‚‚‚/^|÷ÝwáááÍyÍd"ñ<oýúõ ,X¾|ùž={^½z%=-€T;€244ܺu«žžÞ²eËBBB222N4eÊ”áÇGGGÏ›7ÏÈÈ(22RÆÇÅÅåçç‹.BÂÃÃ}ÿòðáȈˆcÇŽùûûoÞ¼yܸqƒ^½z5!¤S§N455¥o¢i,ÃÂ… ¦L™âêê*}fÍšÕ°„×»»»GGGÏž=»´´tݺuÍ}Ýš$ñ‰‰‰ÖÖÖžžžvvv~~~ÿüç?¥¤hs—ˆ (++Séùí¢¢¢zõêÂt¥Àår“““™L¸€Z©­­-**ÊËË[¸p!ÓYþtõêU‰'µS§N5k–âó@û„j V®\¹²aÆÐÐPsss¦³üÉÍÍî`ª€Zñôôôôôd:€ÒÁ]* þPí@ý¡Ú€úCµõ‡jê÷dHpáÂzú4Pø.q999Ïž=c:ÈÓСC…ÓD@û„jêãv þPí@ý¡Ú€úCµõ÷ÿ-†ÞÎûñ°IEND®B`‚glom-1.22.4/docs/libglom_reference/html/ftv2folderclosed.png0000644000175000017500000000115012234777145025311 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÚ}\ˆ/IDATxí]MOÔ@~ÚúuØlp]ö¿#›Å]PYECˆ\9ù¼yÑß`ÖÄÿàÿÀÉxóâ¢C &=qÐÄ£—vZçv¶3m؃‡vžLûNç}Þ÷}Þ½ZA@n° OäNp ’xóþK°ññ€xÜj”°8sÑ€“ “€œ_¼[Âíæ§ïD'‚•yye+ø¼û 7#rNŸlïük* ¾0Ь_d«_(àñÖ±àôz=ñxõv§÷h©‰z¹€šØP-äóä’̪uý¼$»\DãJc—B4¯ãÝÖ.:£Ï-ÑÏß}µŠLEíºþ #—ûáºÀÏgN;BŠ€6ïýñ䬜…ö@’Ðåñp&™h>p9¤™EEά¨ÎÊ‘" u¥n€$R"?{¹<˜…ë…%PNtâ$‰ß¶±úá+^<é"§2 ªDq”q´\¬«Ò™a–Œ‘©Aÿ€"Ôµ ™êŸèP£}#Eàz{û.8i îp³ê(ADwD¦E<ê¬cE¦$ HdÊÄ ”.:Ù GŽ-`ŒL‚ý¾'¢‰Ä<¤CIª½;ÙÇTZd±i};>èôß‚z×;K×§8t ¤Ž q”:uvÿv•Ý›¬²ÙvEân{„M·FXg¼ÌfZÖ¨°¹‰*›ßÌß©±ù©:›j–YqèÜë#3çÏSøWøÿÿÑr'ø Ôùù‚ ©¡IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__CalendarPortal.html0000644000175000017500000033561012234777147031752 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_CalendarPortal Class Reference
        Glom::LayoutItem_CalendarPortal Class Reference
        Inheritance diagram for Glom::LayoutItem_CalendarPortal:
        Collaboration diagram for Glom::LayoutItem_CalendarPortal:

        Public Member Functions

         LayoutItem_CalendarPortal ()
         
         LayoutItem_CalendarPortal (const LayoutItem_CalendarPortal& src)
         
        LayoutItem_CalendarPortaloperator= (const LayoutItem_CalendarPortal& src)
         
        virtual ~LayoutItem_CalendarPortal ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        sharedptr< Fieldget_date_field ()
         
        sharedptr< const Fieldget_date_field () const
         
        void set_date_field (const sharedptr< Field >& field)
         
        virtual void change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void change_related_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        - Public Member Functions inherited from Glom::LayoutItem_Portal
         LayoutItem_Portal ()
         
         LayoutItem_Portal (const LayoutItem_Portal& src)
         
        LayoutItem_Portaloperator= (const LayoutItem_Portal& src)
         
        virtual ~LayoutItem_Portal ()
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        Glib::ustring get_from_table () const
         A helper method to avoid extra ifs to avoid null dereferencing. More...
         
        sharedptr< UsesRelationshipget_navigation_relationship_specific ()
         Gets the relationship to use for navigation if get_navigation_type() is NAVIGATION_NONE. More...
         
        sharedptr< const UsesRelationshipget_navigation_relationship_specific () const
         Get the relationship to use for navigation if get_navigation_type() is NAVIGATION_NONE. More...
         
        void set_navigation_relationship_specific (const sharedptr< UsesRelationship >& relationship)
         Set the relationship to use for navigation if get_navigation_type() is NAVIGATION_NONE. More...
         
        void reset_navigation_relationship ()
         
        navigation_type get_navigation_type () const
         Discover what type (if any) navigation should be used when the user activates a related record row. More...
         
        void set_navigation_type (navigation_type type)
         Set what type (if any) navigation should be used when the user activates a related record row. More...
         
        void get_suitable_table_to_view_details (Glib::ustring& table_name, sharedptr< const UsesRelationship >& relationship, const Document* document) const
         Discover what table to show when clicking on a related record. More...
         
        sharedptr< const UsesRelationshipget_portal_navigation_relationship_automatic (const Document* document) const
         Get the relationship (from the related table) into which the row button should navigate, or none if it should use the portal's directly related table itself. More...
         
        double get_print_layout_row_height () const
         This is used only for the print layouts. More...
         
        void set_print_layout_row_height (double row_height)
         This is used only for the print layouts. More...
         
        double get_print_layout_row_line_width () const
         This is used only for the print layouts. More...
         
        void set_print_layout_row_line_width (double width)
         This is used only for the print layouts. More...
         
        double get_print_layout_column_line_width () const
         This is used only for the print layouts. More...
         
        void set_print_layout_column_line_width (double width)
         This is used only for the print layouts. More...
         
        Glib::ustring get_print_layout_line_color () const
         This is used only for the print layouts. More...
         
        void set_print_layout_line_color (const Glib::ustring& color)
         This is used only for the print layouts. More...
         
        void get_rows_count (gulong& rows_count_min, gulong& rows_count_max) const
         Get the number of rows that should be displayed. More...
         
        void set_rows_count (gulong rows_count_min, gulong rows_count_max)
         Set the number of rows that should be displayed. More...
         
        - Public Member Functions inherited from Glom::LayoutGroup
         LayoutGroup ()
         
         LayoutGroup (const LayoutGroup& src)
         
        LayoutGroupoperator= (const LayoutGroup& src)
         
        virtual ~LayoutGroup ()
         
        bool has_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Discover whether the layout group contains the specified field (from the current table). More...
         
        bool has_any_fields () const
         Discover whether the layout group contains any fields. More...
         
        void add_item (const sharedptr< LayoutItem >& item)
         Add the item to the end of the list. More...
         
        void add_item (const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)
         Add the item after the specified existing item. More...
         
        void remove_item (const sharedptr< LayoutItem >& item)
         Remove a layout item from the group. More...
         
        void remove_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Remove any instance of the field from the layout. More...
         
        virtual void remove_relationship (const sharedptr< const Relationship >& relationship)
         Remove any use of the relationship from the layout. More...
         
        void remove_all_items ()
         
        double get_border_width () const
         
        void set_border_width (double border_width)
         
        guint get_items_count () const
         
        guint get_columns_count () const
         
        void set_columns_count (guint columns_count)
         
        type_list_items get_items ()
         
        type_list_const_items get_items () const
         
        type_list_const_items get_items_recursive () const
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_items get_items_recursive ()
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_const_items get_items_recursive_with_groups () const
         Get the items recursively, depth-first, also returning the groups. More...
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         
        - Public Member Functions inherited from Glom::UsesRelationship
         UsesRelationship ()
         
         UsesRelationship (const UsesRelationship& src)
         
        UsesRelationshipoperator= (const UsesRelationship& src)
         
        virtual ~UsesRelationship ()
         
        bool operator== (const UsesRelationship& src) const
         
        bool get_has_relationship_name () const
         
        bool get_has_related_relationship_name () const
         
        Glib::ustring get_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        Glib::ustring get_related_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        sharedptr< const Relationshipget_relationship () const
         Return the relationship used by this item, if any, or a null sharedptr. More...
         
        void set_relationship (const sharedptr< const Relationship >& relationship)
         
        sharedptr< const Relationshipget_related_relationship () const
         Return the related relationship used by this item, if any, or a null sharedptr. More...
         
        void set_related_relationship (const sharedptr< const Relationship >& relationship)
         
        Glib::ustring get_table_used (const Glib::ustring& parent_table) const
         Returns either the parent_table, related to table, or doubly-related to-table. More...
         
        Glib::ustring get_title_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the title of the relationship that is actually used, falling back to the relationship's name. More...
         
        Glib::ustring get_title_singular_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the singular title of the relationship that is actually used, falling back to the regular (plural) title, and then to the relationship's name. More...
         
        Glib::ustring get_to_field_used () const
         
        Glib::ustring get_relationship_name_used () const
         Get the name of the related relationship used, if any, or the relationship if there is no related relationship, or an empty string if neither are used by this item. More...
         
        bool get_relationship_used_allows_edit () const
         Discover whether the relationship used allows the user to edit values in its to table. More...
         
        Glib::ustring get_sql_join_alias_name () const
         Get a name to use as an alias in SQL statements. More...
         
        Glib::ustring get_sql_table_or_join_alias_name (const Glib::ustring& parent_table) const
         Get the item's alias name, if it uses a relationship, or just get its table name. More...
         
        Glib::ustring get_relationship_display_name () const
         Get a human-readable representation of th relationship. More...
         

        Additional Inherited Members

        - Public Types inherited from Glom::LayoutItem_Portal
        enum  navigation_type {
          NAVIGATION_NONE,
          NAVIGATION_AUTOMATIC,
          NAVIGATION_SPECIFIC
        }
         The navigation (if any) that should be used when the user activates a related record row. More...
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::LayoutGroup
        type_list_items m_list_items
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::LayoutItem_CalendarPortal::LayoutItem_CalendarPortal ( )
        Glom::LayoutItem_CalendarPortal::LayoutItem_CalendarPortal ( const LayoutItem_CalendarPortal src)
        virtual Glom::LayoutItem_CalendarPortal::~LayoutItem_CalendarPortal ( )
        virtual

        Member Function Documentation

        virtual void Glom::LayoutItem_CalendarPortal::change_field_item_name ( const Glib::ustring table_name,
        const Glib::ustring field_name,
        const Glib::ustring field_name_new 
        )
        virtual

        Reimplemented from Glom::LayoutItem_Portal.

        virtual void Glom::LayoutItem_CalendarPortal::change_related_field_item_name ( const Glib::ustring table_name,
        const Glib::ustring field_name,
        const Glib::ustring field_name_new 
        )
        virtual

        Reimplemented from Glom::LayoutItem_Portal.

        virtual LayoutItem* Glom::LayoutItem_CalendarPortal::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Reimplemented from Glom::LayoutItem_Portal.

        sharedptr<Field> Glom::LayoutItem_CalendarPortal::get_date_field ( )
        sharedptr<const Field> Glom::LayoutItem_CalendarPortal::get_date_field ( ) const
        virtual Glib::ustring Glom::LayoutItem_CalendarPortal::get_part_type_name ( ) const
        virtual

        Reimplemented from Glom::LayoutItem_Portal.

        LayoutItem_CalendarPortal& Glom::LayoutItem_CalendarPortal::operator= ( const LayoutItem_CalendarPortal src)
        void Glom::LayoutItem_CalendarPortal::set_date_field ( const sharedptr< Field >&  field)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_calendarportal.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Portal-members.html0000644000175000017500000012527312234777147031752 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_Portal Member List

        This is the complete list of members for Glom::LayoutItem_Portal, including all inherited members.

        add_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        add_item(const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)Glom::LayoutGroup
        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutItem_Portalvirtual
        change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutItem_Portalvirtual
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Portalvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_border_width() const Glom::LayoutGroup
        get_columns_count() const Glom::LayoutGroup
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_from_table() const Glom::LayoutItem_Portal
        get_has_related_relationship_name() const Glom::UsesRelationship
        get_has_relationship_name() const Glom::UsesRelationship
        get_has_translations() const Glom::TranslatableItem
        get_items()Glom::LayoutGroup
        get_items() const Glom::LayoutGroup
        get_items_count() const Glom::LayoutGroup
        get_items_recursive() const Glom::LayoutGroup
        get_items_recursive()Glom::LayoutGroup
        get_items_recursive_with_groups() const Glom::LayoutGroup
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_navigation_relationship_specific()Glom::LayoutItem_Portal
        get_navigation_relationship_specific() const Glom::LayoutItem_Portal
        get_navigation_type() const Glom::LayoutItem_Portal
        get_part_type_name() const Glom::LayoutItem_Portalvirtual
        get_portal_navigation_relationship_automatic(const Document* document) const Glom::LayoutItem_Portal
        get_print_layout_column_line_width() const Glom::LayoutItem_Portal
        get_print_layout_line_color() const Glom::LayoutItem_Portal
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_row_height() const Glom::LayoutItem_Portal
        get_print_layout_row_line_width() const Glom::LayoutItem_Portal
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_related_relationship() const Glom::UsesRelationship
        get_related_relationship_name() const Glom::UsesRelationship
        get_relationship() const Glom::UsesRelationship
        get_relationship_display_name() const Glom::UsesRelationship
        get_relationship_name() const Glom::UsesRelationship
        get_relationship_name_used() const Glom::UsesRelationship
        get_relationship_used_allows_edit() const Glom::UsesRelationship
        get_report_part_id() const Glom::LayoutGroupvirtual
        get_rows_count(gulong& rows_count_min, gulong& rows_count_max) const Glom::LayoutItem_Portal
        get_sql_join_alias_name() const Glom::UsesRelationship
        get_sql_table_or_join_alias_name(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_suitable_table_to_view_details(Glib::ustring& table_name, sharedptr< const UsesRelationship >& relationship, const Document* document) const Glom::LayoutItem_Portal
        get_table_used(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_title(const Glib::ustring& locale) const Glom::LayoutItem_Portalvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::LayoutItem_Portalvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_singular_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_title_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_to_field_used() const Glom::UsesRelationship
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        has_any_fields() const Glom::LayoutGroup
        has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::LayoutGroup
        LayoutGroup()Glom::LayoutGroup
        LayoutGroup(const LayoutGroup& src)Glom::LayoutGroup
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Portal()Glom::LayoutItem_Portal
        LayoutItem_Portal(const LayoutItem_Portal& src)Glom::LayoutItem_Portal
        m_list_itemsGlom::LayoutGroup
        m_translatable_item_typeGlom::TranslatableItemprotected
        NAVIGATION_AUTOMATIC enum valueGlom::LayoutItem_Portal
        NAVIGATION_NONE enum valueGlom::LayoutItem_Portal
        NAVIGATION_SPECIFIC enum valueGlom::LayoutItem_Portal
        navigation_type enum nameGlom::LayoutItem_Portal
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Portal& src)Glom::LayoutItem_Portal
        Glom::LayoutGroup::operator=(const LayoutGroup& src)Glom::LayoutGroup
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        Glom::UsesRelationship::operator=(const UsesRelationship& src)Glom::UsesRelationship
        Glom::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        Glom::UsesRelationship::operator==(const UsesRelationship& src) const Glom::UsesRelationship
        remove_all_items()Glom::LayoutGroup
        remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::LayoutGroup
        remove_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::LayoutGroupvirtual
        reset_navigation_relationship()Glom::LayoutItem_Portal
        set_border_width(double border_width)Glom::LayoutGroup
        set_columns_count(guint columns_count)Glom::LayoutGroup
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_navigation_relationship_specific(const sharedptr< UsesRelationship >& relationship)Glom::LayoutItem_Portal
        set_navigation_type(navigation_type type)Glom::LayoutItem_Portal
        set_print_layout_column_line_width(double width)Glom::LayoutItem_Portal
        set_print_layout_line_color(const Glib::ustring& color)Glom::LayoutItem_Portal
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_row_height(double row_height)Glom::LayoutItem_Portal
        set_print_layout_row_line_width(double width)Glom::LayoutItem_Portal
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_related_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_rows_count(gulong rows_count_min, gulong rows_count_max)Glom::LayoutItem_Portal
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_list_const_items typedefGlom::LayoutGroup
        type_list_items typedefGlom::LayoutGroup
        type_map_locale_to_translations typedefGlom::TranslatableItem
        UsesRelationship()Glom::UsesRelationship
        UsesRelationship(const UsesRelationship& src)Glom::UsesRelationship
        ~LayoutGroup()Glom::LayoutGroupvirtual
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Portal()Glom::LayoutItem_Portalvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        ~UsesRelationship()Glom::UsesRelationshipvirtual
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_23.png0000644000175000017500000000662212234777146025203 0ustar00murraycmurrayc00000000000000‰PNG  IHDRC%Îiz¢bKGDÿÿÿ ½§“ GIDATxœíÝkP×ð³!Jä¡<|@HðZÁÞ¡€To[,ÒF¡CFêk SõŠ*©Ò^c‹­EîTûA­‘‡#´>h+PDP‚b¥zA$-Ä©4  " 9÷Ãö¦! !CXüÿ&–ÍÉîÿìþ9gsöcŒÊ¢™;`B '@mГ 6ºÆßõõõ]]]f L‚   ‹eî(þ"‹/_¾lî(µEGG›;„¿Aû99t´cx4.—k¦ØÀdxÊæÞ€òÌÅ£@û99´Û1Íïd!.—[\\<ùÁS#ÂÜ!è€áêY`”S§NÅÄĘ; MÐ~ššÎv Γ 6èÉPôd¨ z2Ô=jƒž µß“õ÷÷'''³ÙlKKK6›½uëÖîînò-‚ „B¡ÑK&ÔÌ™3'88¸ººZù½:C"¡ÓéžžžEEE¦XË”ÒÓ#ÍÏ¿™gî@Fd£„ÊÊJ:~íÚ5Õœ¤¤$Ÿááa„AÎÎÎJ¥Rý#o½õ–jNpWê$—\¸Ð’˜xüûïo<Û%OéRZÛ4H­q鸟ÌJ¥’LÁ’’’%K–ôôô|õÕWAAAmmm–––«ªªÊ××!$‘Hòóó###;;;­­­'¾dã"¨¨¨Øºu«µµuDDÄä‡aj2٣ᄏQR"¼zU„1²²šiîˆþÉFo¾ùf\\\bbbCCFkjj*((¨­­9ó¯têëë»téÒªU«È?e2Ymm­)"Q*ñ•+eeMååמ „׬ñ6ÅŠŒcê”ÖFõÔŸö=ê\.wÜ[Ù¿þúk''§ÁÁAõ™‰D¡P7º666}Ÿ¼ÆÇe2BèÖ­[zÊÿñÇF¯ÎðH²²²–/_nŠM„áÕGZ÷Æ÷÷?æó/s8‡™ÌÝlö..»“œ“ÜÜRMì(ä3>Æ-É6uŒ[ý¾¾¾ùóççåå)Š+V$''«6,,lÇŽª9|>?,,LUñ§Ý•Úù£T*¯\¹›’"X¶,ÍÙy÷Â…Éd>3™»KJŒOÃM…öSÛôH-õ’ÚÏø0rt±¨¨hûöíÇ­vvvª? EFF›Íž;wnlll__9Ÿ ˆ“'O²X,[[Û?üðÛo¿e2™³gÏÞ³g곃ƒƒR©T*•ŠD¢ììì_|ÑÝݽ¹¹9$$ÄÁÁaÖ¬Y>>>§NÒˆ*##ãå—_–J¥c·xñb‡¨¨(õU×ÔÔ¸ººñù矓3æÎ+—Ë ‚(,,$‹‘bbbnܸA&œvÕ”J%Çsss³¶¶¨««S­T5¥šÖ¿ôÄ_QQÁb±òòòÐÿowŸ7oÞS yÉå#ÍññG}|2RS‹››;1Æ …R©œŠÛ€d£P²988äææ¦§§§§§ ìß¿_ý].—[VV†ÿÿT—ÒÒÒÈÈȱõT~ýµ;3óôŠû""Žœ:uupp!<<¬x& æLšÒÓ5µÆ¡Ñ³xLaoo_^^®§Ïlllÿò¼y›ÆúW×x±XXr‚/ ý‘cH6ª%ÛÐЗ—N?zô¨v÷îÝ»k×.Œ±@  Q¯øSõdwîÜ Ùçìü/²£ÒŸfãxV¯%Kv˜½ýÔ6mRKµvƒž l&“ÙÖÖ¤Ú=rqqQ/ÓÕÕåææFN“b±ØËË !dccƒ¢ÑhÓÚlmm³³³óóóÛÚÚ¬¬¬x<^]]]{{»»»»z±ÚÚÚµk×òx<>Ÿ‰Dqqqqqqªb±˜üˆ««+BhΜ9!!!¥¥¥/½ôNõÕW ©5ù{ ...:«öÛo¿yxx3 ‚°³³Ó¿4=AOüäFks… ˆØØ€­[£9œí--²¡™3ézÆ^f̰ÈÏßøT«0B}}=74n1H6j%Ûþýûi4ZaaaBBBXX˜ÆžŠŠŠZ·nÝ_|1Á¡Å¥KçGE-®¯/ˆ¹u«gÆ úȈbôu‘£lÙüÊ+nF¯Î@_~yÈb“–Ò:Q7µô0²'[¿~}~~þÆÉ];;;íkX,VGGÇÊ•+B!&“iĺ BÈÆÆ&888 à³Ï>óóóÃ3 U™ââb…Báíí½mÛ¶Õ«W3™ÌC‡…‡‡#„0Æ2™Lµ?TÛ.::úèÑ£·oßÞ°aƒ‰~~~ööö:«Æd2E"Qpp0YX*•ÚÚÚ’Û‡<Ž‹ÅVYOüF?ÏžF#†‡Å11KŠ‹£„BQyù’’«ýýCtº…B1¢U˜¶n¯q+2ÜãÇm&’BÉvýúõœœœêêêÀÀ@>ŸŸ˜˜XQQ¡^À××—Á`TUU?>77÷i—¯ÎÎÎòáæöôHÏžý¥¬¬©¹¹“N§)::4?¿…“Ò'NŒd†&7¥µQ4µô3²KÌÌ̼wï‡Ã …÷îÝ+++Û·oŸF™wß}7;;»±±±­­mçÎgÜî]Eu¾»»;--Í××—ÅbÉårÿe˖ݾ};>>!ôçŸ’å Æ¢E‹ÒÓÓ·oß.—Ëããã322„Ba{{û{ï½÷Úk¯i¯"<<\(žºtéRoooNN‹Åzüø1BÈÎÎîÌ™3ýýýŸ|ò‰Õ7$~u‰ÄÀ%#„h4ÂßÉÇ¿óË/ÙÇo ÷e0f¢Ó§èmòlTI6…B±eË–Í›7"„òòò.^¼¨}Ñ—Ëݱc‡¯¯ï‚ 4ÞRí ©TJ=‚É´Û¶mÕÙ³»««SwíZÃf;"„fδ÷ƒæbÒ”ž–©5>ÑFÏ“aŒ;;;cccííí­¬¬8Ù¥«ó§¦¦º¸¸888lذA}ŒU5h«sZ=¼Y³f½ñÆwîÜÁ———/Z´ÈÒÒ2((èìÙ³¡¡¡žžžê¬Ož<ñôô libglom-1.22: Member List
        Glom::LayoutItem Member List

        This is the complete list of members for Glom::LayoutItem, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const =0Glom::LayoutItempure virtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const =0Glom::LayoutItempure virtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItemvirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutItem()Glom::LayoutItemvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Report.html0000644000175000017500000010215012234777147026006 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::Report Class Reference
        Glom::Report Class Reference
        Inheritance diagram for Glom::Report:
        Collaboration diagram for Glom::Report:

        Public Member Functions

         Report ()
         
         Report (const Report& src)
         
        Reportoperator= (const Report& src)
         
        bool get_show_table_title () const
         
        void set_show_table_title (bool show_table_title=true)
         
        sharedptr< LayoutGroupget_layout_group ()
         
        sharedptr< const LayoutGroupget_layout_group () const
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::Report::Report ( )
        Glom::Report::Report ( const Report src)

        Member Function Documentation

        sharedptr<LayoutGroup> Glom::Report::get_layout_group ( )
        sharedptr<const LayoutGroup> Glom::Report::get_layout_group ( ) const
        bool Glom::Report::get_show_table_title ( ) const
        Report& Glom::Report::operator= ( const Report src)
        void Glom::Report::set_show_table_title ( bool  show_table_title = true)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/report.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1ChoiceValue-members.html0000644000175000017500000004150712234777147030362 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::ChoiceValue Member List

        This is the complete list of members for Glom::ChoiceValue, including all inherited members.

        ChoiceValue()Glom::ChoiceValue
        ChoiceValue(const ChoiceValue& src)Glom::ChoiceValue
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::ChoiceValue
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_has_translations() const Glom::TranslatableItem
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::ChoiceValuevirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_value() const Glom::ChoiceValue
        is_translatable() const Glom::ChoiceValue
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const ChoiceValue& src) const Glom::ChoiceValue
        Glom::TranslatableItem::operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const ChoiceValue& src)Glom::ChoiceValue
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const ChoiceValue& src) const Glom::ChoiceValue
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        set_value(const Gnome::Gda::Value& value)Glom::ChoiceValue
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~ChoiceValue()Glom::ChoiceValue
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Placeholder.html0000644000175000017500000013306512234777147031301 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Placeholder Class Reference
        Glom::LayoutItem_Placeholder Class Reference
        Inheritance diagram for Glom::LayoutItem_Placeholder:
        Collaboration diagram for Glom::LayoutItem_Placeholder:

        Public Member Functions

         LayoutItem_Placeholder ()
         
         ~LayoutItem_Placeholder ()
         
         LayoutItem_Placeholder (const LayoutItem_Placeholder& src)
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        bool operator== (const LayoutItem_Placeholder* src) const
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::LayoutItem_Placeholder::LayoutItem_Placeholder ( )
        Glom::LayoutItem_Placeholder::~LayoutItem_Placeholder ( )
        Glom::LayoutItem_Placeholder::LayoutItem_Placeholder ( const LayoutItem_Placeholder src)

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Placeholder::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Implements Glom::LayoutItem.

        virtual Glib::ustring Glom::LayoutItem_Placeholder::get_part_type_name ( ) const
        virtual

        Implements Glom::LayoutItem.

        virtual Glib::ustring Glom::LayoutItem_Placeholder::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutItem.

        bool Glom::LayoutItem_Placeholder::operator== ( const LayoutItem_Placeholder src) const

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_placeholder.h
        glom-1.22.4/docs/libglom_reference/html/functions_eval.html0000644000175000017500000002651212234777147025254 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Enumerator
         

        - h -

        - l -

        - n -

        - s -

        - t -

        - u -

        glom-1.22.4/docs/libglom_reference/html/inherit_graph_19.png0000644000175000017500000000472112234777146025206 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“ †IDATxœíœkHßÇϸ†»¦²®™ºÎ®n^)_˜y!µ¬Kó–ZHP(©°½¨,¥‚è‚/J£¼àÝÂD1‘Í[kbQÊz7ÝÖuÍÒ\SÏÿÅá7ÿqfwó–þjæóêì™gžy<ß=3ÇóƒÆ`²Õ°l*¬Þ̂՛Y˜’?ŒŒŒ455mU),¿‘HäïïÿÿÏDIIÉÖÆò[ˆˆˆ KlJ`Wì ‘‘‘”öùÍ,X½™«7³`õf¬Þ̂՛Y¬Qïééé””‘Hdff&‰FGGÑ! ÃÚÚÚ6®B=`611ñ§¤[=\dÖ¢÷ÒÒÒ?ÿüÓÚÚZ^^>22R]]Íårt:݆×÷ðß.úþü¹¹¹öööß¿'wjµÚ……´W£P(~™d=Ôjõ&§]óE·p¸"""(ûkk™ß………IIIÛ·o'wòù|‡C|\XXÉd"‘hÇŽ111õcV\\Œã¸¥¥ezzzQQ‘P(´²²JNN& È …Báïïonnîì윓“ƒÂÊËËííímllîÝ»èèè <ÏËË«´´”ÈÖÐÐ ‹sss³²²$‰@ ˆŒŒDõètº‹/ÚÙÙÙÚÚÞ¿Ÿ(ðÊÊJ‰DÂçó£¢¢4 †a[[[tÃ'Ò>yò„28jµz3‡kÕÅ_áü¶¶¶®ªª2t)”™™éââÒÒÒ¢T*:tüøqâ¨T*˜˜(//9r„h÷õõAóóóûûûÉ]»v¥¦¦ŽUTT˜˜˜ŒNœ8199YRRbjj:77çááqþüùñññœœ333N‡. —ËoݺåêêÚÜÜÜÛÛ+•JÑ·^&“‰Åb¹\®T*ƒƒƒÁ¿3àééÙÒÒÒÙÙxìØ1¸|~iggg‰?\.—GGG{zznæp‡>¿×¢·©©icc#¹b„V«%þ77·gÏž¡€?¾~ýŠŽÖ××C)mC·5@p÷î]ÔF·A@{{;q¢Z­žššB·G¡R©$+WVV!ܽ{waa! åp8333‰$77u¾ÿž|ÖÓ§OQGG*ž¢7J !œ}üø±··wHHHIIÉüüüÖ™¹Ÿ …ÂîînrÝÄj“`xxØÅŵQcdd}´°°˜˜˜PÚ†ÈÎÎÎÊÊrrr:{ölgg'º â8N>qjjJ&“ …ÂÄÄDòéb±000púôi Ã0 stt\\\swwGaDƒ\3ÀÃÃ\<%m]]““Ó‡ŠŠŠêë룢¢¶mÛ¶µÃeœµœyôèÑììlô-ðùüwïÞQbpïïïGmÔ …k+ñðáÃCCCeee!!!h°Ð• ((¨¿¿ÿöíÛƒƒƒuuuäCht„Bá‹/Ðw|iiI«Õº»»ã8N(ÑÛÛK>«¯¯5zzzôÒâ8îëë[WWWSS£ÕjõÖ¿ÉÃeœµè}åÊ•±±1©TÚÖÖ666VYYyõêUJL||üõë× Eww÷… ¤R)ŸÏ_Iò‚‚‚rÃÛÛ;--M,ûøø@¹\.ý¬Ÿ?úúúº¹¹uuuÅÅÅ&''Éqqq2™¬­­­··711ñàÁƒ€ØØØk×®566öôôPV@ …¢««+))‰(ž®èž={ª««kkkGGG÷îÝ›ÐÞÞ¾™ÃµjÈ7÷>¿!„Ÿ?މ‰±¶¶677—J¥è+I~ ÍÏϧ¦¦::: ‚S§N‘Ÿ|ăGoŸŸOn¼~ýÚËË‹Ë庸¸AÚÒI­VWUU9;;›™™ÔÔÔ„……¡u‘v~~>-- Çq ‹°°0´ØÑét—.]Bëó¼¼<@z~gffºººZYYŸÏçóE"Ñ7†‡‡ÑfÜ f†agΜ133ÛÐJÁoͼZ6Xoº{mб !¤[Ôô0zä ˜ššÊ€Ðë‘Ó퉉 #nôË—/q>4RŞ˿Us¨¹|«î5@Þl[ù~ª!èî5 íü=c[&“Ñ-jzò¿‰œÓÓÓ—/_Þ¿?„ðÁƒz3 x#9ewÖˆ¦R©***ïn¨<Š=O¾ Ðg®#jkkœœ222T*ÕzT Øÿ{UÑ›bl{xxÐ-jz}p8œ††hÀä&®hÄ#§èmÄ~þü9$ùî†Ê£Øóp¹Þtsœ¡¡¡ôôtÇccc[[[×9øÿ½ÛÚÚ „ÅÅÅvvvb±8>>¾±±‘ÇãQ„T*•ô0øï[h½¦R©222lll¾}ûf(ªapp0--íÀ”·Y(zs¹Ü7oÞ ž?~>}ú„޾}û–i¨¿™«7³`õfÿ—!ªiýëéIEND®B`‚glom-1.22.4/docs/libglom_reference/html/pages.html0000644000175000017500000000712412234777147023332 0ustar00murraycmurrayc00000000000000 libglom-1.22: Related Pages
        Related Pages
        Here is a list of all related documentation pages:
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Relationship__coll__graph.png0000644000175000017500000003537212234777145031515 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¨Sã…MbKGDÿÿÿ ½§“ IDATxœíÝ{\Wú0ð3 PÀEKᮨإ­e[‹ÚíЂ¢}uQ—ÖÕ¢-tk¥¢µõÚEô§"W-Z-«]ªÐ ºxÈ€P aÞ?N;Mä’ó|?üqfæäÌ“™ÉÃ\Ï$I" †¶MƒÄ H|ÚÄ H|ÚÑÑv`4 BÛ!€_Á}}‰ Ž7º¸¸h; ZËÍÍýú믵Åȉ ___mGAwøúÎñh€v ñh€v ñhМ¦¦¦Í›7›››³X,ssóÕ«WWVVâIAäççéÜ ‚¨­­AÍv5Ô‹ˆ>àv !‹-""--ÍÚÚúÉ“'±±±®®®EEE,KÛÑ ;2™ Œ³³³B†††Z jô€Ä4äøñãÅÅÅb±xܸq!“ƒFEEéèŒæ ©T:qâÄý ›Í¦Êʃ`ààPhHbbbPPÎz6›Íd2©A¹\nnn>qâD??¿ºº:<ž ˆÓ§Oóx>¾¤¤D¹`mm"‘HÒÓÓ FUUBèÝwß­¯¯ONNÖÑÑyþüùÔ©S×­[WZZZUUÇb±ÚÚÚðì\]]srrvíÚekk›››+‹··7I’ááá|>?''G$Í™3!$•Jñ§ìííóòò gÏž½xñb<OUn¶µµ•úâ999K—.µ··W¿dú²’““áÝG°˜À èKâÓÑѹ~ýºòG0™LFþöó¶³³;qâ®pïÞ=„Pcc#žšM’¤B¡P)÷”8ÎÞ½{qY&“Éår„Э[·¨J¥Ò††¹\ŽëˆD"å–ššJ’äôéÓq…ÊÊJ&“ÙÒÒbeeuôèQ<òöíÛÊŸ:~ü8_PP€ƒWI|¸Y’$[[[9âèè8wîÜäääööv5Ëß ƒC] !\.·¨¨ˆ”ÉdÔ%]Jyy¹ .ãBEE400@1 •rO:maa±jÕªÂÂB|@Íãñ”?ØÐÐîææÆår•?ÎçóB¥¥¥þþþøŠª™™™B¡¨¨¨H$S¦LÁÕ¨‚rÌ¡©S§*¯ÒlVV–……Å;w’’’²³³}}}uuuÕ|0è ñ ñòò:tèÞÛB±Ùì›7oªÔáñx%%%¸Œ \.·³[°`AYYYjjª©©éܹsq’Ué>ËÍÍ­¤¤$&&æÑ£GYYYÊ“prär¹gÏžÅû2™lÊ”)<Êàb±XùSÅÅŸððáÃnƒÇÍòx<''§¬¬¬ .PWo&Aâ!‘HA~~¾D"ÉÈÈØ¶m›J•+Wnß¾](}ôÑG W3JKK• ŽŽŽ¡¡¡|>Ö¬Y$IêééuýTGG‡“““݃BõõõÊÂÃÃóóóÅbq`` »»;BhÅŠ_|ñÅõë×>|H]]Á"##…BჂ‚‚¨à»¦¶3fœ?þâÅ‹•••3gÎ\½zõ­[·úò5Á Ñê6%PÎñ‘$ùøñc???ccã±cÇ ¼O§|ޝ½½=$$ÄÌÌŒÃá,[¶Lùìuž«Û2B(>>^¹pùòe===›¤¤$²Ëu©Tš™™iiiÉb±\]]/\¸àéé‰/2PͶ··‡††òx<OOO|!¥­­mÓ¦MøªîÉ“'‘Ò9¾;wÚÚÚ½÷Þ{555$Iº¹¹éééÕÕÕ‘=œ­kii‰3gŽše çøAB­`À‚HNN¦y|A…ÂY³fi+€”””¥K—Â/º/àP@;£ù¦y4 vµFØãÐ$>í@âÐ$>@wÝv¨7D½ìa݈‡ÎïF1¸ª @7–/_®íÀ‚=>@=uö‡ÊÈȰ´´d³ÙÞÞÞ555¨Ë¡.îÇE Aƒ¡‰ÐÅîÝ»OŸ>––vãÆêêê5kÖP“bcc333úé§ÊÊÊU«Vuýl^^ž­­mTTN‹`ÄÓò#s`T@}{VW»zíì$IÜYz°+++ ãñx+V¬øùçŸ5{ŸÀ³º}{|€.Ôtögkk‹ ööö!‰DÒõã|>ÇŽb±xþüùk×®urrÒDÐ`h@ât¡¦³?ª[=‘HD„¹¹yOˆD¢7n455yxx q¼`ÁU]@¸³?{{ûñãÇ«tözäÈ‚ Ö¯_ïããÓõF–¶¶¶ÔÔÔÇ···øá‡_ý5¼sDƒÄè"$$¤¹¹ùÝwß}öìÙ[o½µÿ~jÒ† .\ØÚÚºhÑ¢týì… .^¼¸gÏggg † † ôÇÁèë¯ßïÃÕ"è¯ïàm~øá¢;ááá}láÑ£G¡1cÆ a”@«àPŒ6 ,È^OII‰ƒƒÃ|`dd4ˆQa`mmÝÚÚªí(ÀЂC]í@âÐ$>í@â!„â9R<×v@Càâ¹¹¹Úa@ÌÉ\„ˆrbߟ<ÒW&Á Ì`¡í*c#"zïkmÇ1`ð‹î Øãƒ`ÄÿØÚëQúd„²­ak;0äàUd"Ô‰U|§íP€&@â¡Ò¨ô„¶Cš‰ÐÞ³'¨æ"ˆT škèy•¶C ½Çi1` Ç©Ú h$>@{¥'©øm@JNj3 ø½=£ú›ývUš$QýMÔ\ªÕ˜ÀƒÄèíq bèþa C•ÖR4@C ñz+þ?ÔÙñ‡1pmwÔƒÄh¬á.jw3¾I„îi< 9ø•%!FwýË3Æ ²$G4 -•œ@íÝLélG¥'¿âFH|€®ê„èÙD0ÁìòÇ@­¨._Û!‚¡ºj“"ÛÀßëþ‹Bœ”*Ôh:$ )Ð-!„~òE¡7R´Ð8ÔÐ$>í@âÐ$>í@âÐ$>íÀí, „j.A!kmÇ4€vàP@;ø´‰@;ø´‰€~jjjÚ¼y³¹¹9‹Å277_½zuee%žDD~þ`öjEtgg1ÀÖ‚¨­­}¡6}½è– €þèìì\´hAiiiÖÖÖOž<‰uuu-**b±Xƒ>;™L† ÆÆÆÙÙÙŽŽŽ!CCÃAŸM@â!„PA(B9F÷±úñãÇ‹‹‹Åbñ¸qãB&&&ŒŠŠÒђߛͦÊʃ@„T*8qâm¿+8Ô!„Psɯ÷0wG*•ªŒILL ÂYÂf³™L&5(—ËÃÃÃÍÍÍ'NœèççWWW‡Çqúôighh–””ÄårŒŒ‚ƒƒ© Ê…žqíÚ5>Ÿ¿aÇ£¯¯ïàà’’BU8wîÇãp8À#…B¡‹‹Ëرc---ãââ¨Ö º6BBÈÄĤ¶¶¶Û XFF†¥¥%›Íööö®©ù½W’$£££­¬¬8޵”¿Õ~O•{]bXCCƒ\.W³¸~GH’Ìñ!s|º“³téR{{{•ñÆÆÆ™™™=5†“ËÎ;mllòòòD"Ѽyó–,YBMµµµiii¡… Råââb’$ãããKJJ” *-+ºººæääðùüuëÖ•––VUUÅÅűX¬¶¶6\ÁÓÓ³ºº:==]GGçùóç$IZ[[‡„„H$’ôôtƒQUU…›:ujOH¥R’$ÕTxíµ×nß¾}÷î]ggç… R¡îß¿ßÖÖ677W, ooï®_„j_MeõK »xñ¢……Eddduuµúµ ‰’$U_kkë‘#GçΛœœÜÞÞ®R]GGçúõëÔ µ'!“ÉÈß~Õvvv'NœÀîÝ»‡jllÄS³³³I’T(*eå¤Ö­®‰/55•$I¼³ƒGŠD"*• „Μ9CµGr8œ½{÷âÊ2™ ï% …B5à‚š ø[$yëÖ-„P}}=nsúô鉉‰xRee%“Élii!{H|j*÷q‰•••………ñx¼+VüüóÏ=-F8Ô@UVV–……Å;w’’’²³³}}}uuuUêp¹Ü¢¢"jP&“Q—t)ååå666¸Œ xÐÀÀ!Ä`0TÊýÀçóB ááánnn\.700P¹‚™™™Jû‡ŠŽŽ¶°°XµjUaa!ux®¦‘^+ØÚÚ₽½=BH"‘àÁÒÒR|ÚÌÌL¡PP ¡+5•û¸Äø|þŽ;Äbñüùó×®]ëääÔµ‚s|tÅãñœœœ²²².\¸@]NUáååuèÐ!¼Ób³Ù7oÞìÚNIɯç qËåz´ø÷ïææVRRóèÑ£¬¬,å ø$š² ”••¥¦¦šššÎ;—JÙj鵂Xüë«ÙE"AæææxËåž={ïguvvÊd²)S¦ôô]^¨²"‘èÆMMMÝV€Ä€ª3fœ?þâÅ‹•••3gÎ\½z5>|S!‘HA~~¾D"ÉÈÈØ¶m›J•+Wnß¾](}ôÑG WcJKK• ½êèèprr²³³{ðàA@@úí`³[ŽŽŽ¡¡¡|>Ö¬Y$IêééõÚþ ¦BhhèÝ»wïÝ»·~ýzêV›€€€ðððüü|±XèîîÞmH¸ý>VîI[[[BBÂìÙ³W¯^íìì\XX¸cǎ?¡]ôpq£¥¥%66vΜ9]'=~üØÏÏÏØØxìØ±ïÓ)Ÿãkoo 133ãp8Ë–-ç±È.§·º–BñññÊ êrŽfffZZZ²X,WW× .xzzâ 2¨»Si—/_vppÐÓÓ³±±IJJ¢ªõÔˆ›››žž^]]š¹$&&š™™ûûû«,„ÐÐPg``àééI]‹PŒj¿/•{*“$™‘‘áçç—››«f=cÐ-!è^ ñhÎñh€v ñh€v ñh€v ñ€B¨ ô×.ù @G¤ „šÎøÀè{|ÚÄ H|ÚÄ H|ÚÄ è– „ôÇG/ø´‡ºÚÄ H|ÚÄ H|ÚÄ H| „ ?>zþø@A|ô{|ÚÄ xd ôÂÇÇGÛ!h‚·ý„PÚ/Ó´ˆ&¤¦¦j;-ƒÄzA„³³3ÇÓv `TTTäååÁ¯èAÉÉɾ¾¾Ú ‚”””¥K—¯Îñh€v ñh€v ñhMMM›7o677g±Xæææ«W¯®¬¬Ä“‚ÈÏÏÒ¹Q[[;RšEÚ^\‹-úùçŸÓÒÒ***Ο?¯§§çêêÚÖÖ¦íІ#X\Z€Apüøñââb±X0ƒ‚‚ðϘÂf³™L&5(—ËÃÃÃÍÍÍ'NœèççWWW‡Çqúôighh–””ÄårŒŒ‚ƒƒ© Ê¡Pèââ2vìXKK˸¸8\---í¥—^š0aÂ7ß|ƒ*((ðððàp8úúú)))Tk×®]ãóùGŽŽ¶²²âp8>>>8ž¶¶¶7Nž<ÙÄÄdß¾}TðAdddXYY±Ùl__ߺº:‚ B&&&øX˜jöرc* G*•jrq>!P !”œœ¬¾Ž±±qff¦š„BáÎ;mllòòòD"Ѽyó–,YBMµµµiii¡… Råââb’$ãããKJJ” ÖÖÖ!!!‰$==Á`TUU!„Þ}÷ÝúúúäädçÏŸO:uݺu¥¥¥UUUqqq,«­­ ÏÎÕÕ5''g×®]¶¶¶¹¹¹b±X x{{“$ÎçósrrD"Ñœ9sBR©ÊÞÞ>//¯°°pöìÙ‹/Æ#ñTåf[[[©/ž““³téR{{{M..õ’““áWO’$,Ћ¾$>ëׯ+“Édäo¿d;;»'Nà ÷îÝC566â©ÙÙÙ$I* •²P(ìvvgïÞ½¸,“Éär9BèÖ­[Ô¥RiCCƒ\.ÇuD"‘r KMM%Irúô鉉‰¸Bee%“Élii±²²:zô(yûömåO?~/((ÀÁ«$>Ü,I’­­­GŽqttœ;wnrrr{{»v—2H|ê‚AÀår‹ŠŠ¨A™LF]£¤”——ÛØØà2.TTTàA„ƒÁP)÷äСCÑÑÑ«V­*,,ÄGˆ¸êƒ ááánnn\.700Pùã|>!TZZêïïOAfff …¢¢¢B"‘L™2W£ Ê1#„¦Nª¼J³YYYwîÜIJJÊÎÎöõõÕÕÕÕîâ]ÁòƒÀËËëСCx¿!Äf³oÞ¼©R‡Çã•”üÚË1.p¹ÜþÍnÁ‚eee©©©¦¦¦sçÎÅYŸt£¸¹¹•””ÄÄÄúè#@Àf³ûÒxBBBii©rÁÑÑ144”ÏçÏš5‹$I==½®Ÿêèèprr²³³{ðàA@@B¨¾¾^¹B@@@xxx~~¾X, twwG­X±â‹/¾¸~ýúÇU.DFF …ÂQÁwMm3fÌ8þüÅ‹+++gΜ¹zõê[·nirq>Ñê6PÎñ‘$ùøñc???ccã±cÇ ¼“¢|Òª½½=$$ÄÌÌŒÃá,[¶LùìurªÛ2B(>>^¹pùòe===›¤¤$²Ëu©Tš™™iiiÉb±\]]/\¸àéé‰/2PͶ··‡††òx<OOO|e ­­mÓ¦MøªîÉ“'‘Ò9¾;wÚÚÚ½÷Þ{555$Iº¹¹éééÕÕÕ©DNiii‰3gŽ&—zpŽƒþø@/ ?>„AB¡pÖ¬YÚd  ?> u´wŠÐ;ØEe`@;ø´‰@;ø€ÝÄNèØZ·Ýð©o:ÑYàâÐê¾_ccãììlGGG„¡¡¡Vƒ4‰hòC~&¡ßýè “öÁÀÁ¡.r];ÔSS÷j·aÆžzÓ;wîÇãp8À#»ížõÐ%Ÿr?z=õÙ‡ÊÈȰ´´d³ÙÞÞÞ555Ôx’$»öâ§ò¨ö{ªÜÇ>õp3/´¨A_iõ¹0 ¾=²¦F×õ”W~Ð ýÖ«ŸÏï©7=OOÏêêêôôtÜïÙC÷|B¡PM—|ø 05^{íµÛ·oß½{×ÙÙyáÂ…T¨û÷ïïÚ‹Ùåé1ܾšÊ}éSïâÅ‹‘‘‘ÕÕÕYþÊà‘5 èÅÀŸúÆUîÕNMozgΜ!•úÝ#{èžO(ªiÔTÀýÜ‘$‰»À…Ân{ñ#{H|j*÷±O½²²²°°0·bÅŠŸþyà ‡º`xÁ½Ú©éMÏÌÌ ý±ºn»çSßH¯lmmqÁÞÞ!$‘Hð`·½øõô]ÔTîcŸz|>ÇŽb±xþüùk×®urrR³è@ßAâà þý«éMO¥ß=ÔC÷|êéµÕŸH$"ÂÜÜvÛ‹_Oßå…*«!‰nܸÑÔÔäááу® ñ!×µC½^õÚ›ž²žºçSÓ¾ŸFM…ÐÐлwïÞ»woýúõ>>>Ô­6Ýöâ×n¿•{ÒÖÖ–0{öìÕ«W;;;îØ±ã…Z=ÒÚA6!ЀÏñ¡.ê)OR9LJ{íMT:•Öm÷|B¡°§F¨~ôÔÌ%11ÑÌÌÌØØØßß_¥›¼®½ø©Fµß—Ê=•I’ÌÈÈðóóËÍÍÈÂWçø0èôúãM ?> u´‰@;ø´‰@;ø´‰@;ø@!D"D÷{[sW#m‡†üw=<_Ï`"“xx¾Ç>`Àh‰Ð]Gk磫²N9ꔓ²e­ÚŽ 9H|€îÿ§Q!ÿõ„BN>ÎiÔn<@ ñº+ºPG _¯\ˆ_P}q} ñZ{Þ(¯Ì{JvþºÇGv’å¹OŸ7ÂKG9H|€Ö]i þøÄÈG?6h+ ø­¯ïüã ]$‰àÚÐWKuGÍfòWqÉNT}»¹¥ºCKAM€Äè«øR=Áìæ‰<‚I”\’i!  )ø}=>íÀ¡.€v ñh€v ñhƒO.—Q[[«2ž ˆüüü¡h¹Ìȉ€ÁÇd2ããã GPË´‰„_¬_è;†¨}1‚ –/_Îb±”G å–A¿Aâ!„Ê®6–]m¤ ‚8}ú4Ç344 KJJâr¹FFFÁÁÁ=µ@BÈÄÄ„Ê}µµµ*#1’$£££­¬¬8ŽO]ºnî…B¡‹‹Ëرc---ãââÐÓë¹sçx<‡Ã9pàB¨££#88xÒ¤Ifffqqqzzzø`V9ùª$â‚‚‡£¯¯ïàà’’BU»víŸÏ?vìØ .Ë‘€äå­%—·–Pƒ!@P[[›––†Z¸p!U...î©„T*U)«Œ …û÷ï·µµÍÍÍ‹ÅÀÛÛ[M`ÖÖÖ!!!‰$==Á`TUU)·ìééY]]žž®££óüùó¨¨(;;»›7oÞ¿ßÍÍÉd …B5 …©S§®[·®´´´ªª*..ŽÅbµµµá©®®®999­­­X®Ã$>H²»Ä—M’¤B¡P)ãTÒ­>&¾éÓ§'&&â1•••L&³¥¥¥§69ÎÞ½{qY&“Éårå–Ïœ9C&•JíììNž<‰+ß¹s‡ŠVMâkhhËåx’H$RžšššÚçå7ÂÀ¡.Ý300@1 •òÀ•––úûûA„™™™B¡¨¨¨è©ò¡C‡¢££-,,V­ZUXXÈd2•§š™™)V^^nmmËvvv} ¦¡¡!<<ÜÍÍËå*Oâóù/ô½FH|h—Ë={ö,Þõèìì”ÉdS¦Lé©ò‚ ÊÊÊRSSMMMçÎ[YY©<•øãkMMMKKKq¹¸¸XyI’¡®ÖÍÍ­¤¤$&&æÑ£GYYYÊ“+ÑC£ö‹ 2Y7o"WžŸŸ/‹ÝÝÝÕ4èèèÊçógÍšE’¤žžžšÊþþþ‘‘‘·nÝzðྃ3#›Íþî»ïššš¢¢¢T>ÒÑÑáäädgg÷àÁƒ€€„P}ý@¯nø4nnn/¿ü²Jâè:2,,L ¼û¼òJyyyzzºš6ãââ._¾lee?aÂ5•ÃÃÃçÍ›çááñöÛoÿíoCéêê"„öíÛnmmýÆo¨|ä_ÿú׸\îßÿþ÷U«Vyzz.^¼øE¿øˆÝR€Bø^‹¹ãµÈ ¹ÿþÌ™3¥RêÏÕ€£IDAT©ú\IO°ÇBYÌßǬ÷Ã?Ý ï÷Ü«Í3flݺõéÓ§UUUóæÍƒ¬×-Øã`ô¸wïÞ?þñÿþ÷¿$IΞ=ûðáÃÔE^  €vàP@;ø´‰@;ø´‰„©?>0R@â¡.ýñÑ €v ñh€v ñh€v ñhGGÛ0,Ø.äh; 9Ð; €vàP@;ø´‰@;ø´‰@;ø´‰„ ?>šÄBÐÍ@âÐ$>íüá‘µŠŠŠ7nh10èÌÍÍ]\\ÒM¶Šg&#„ôUk;!çêêÊãñ´…¶‘J’““µdÞÞÞäÀÀV1Ê$''p“ºé…„n F ŸÁj ¶ŠÑ m‡0,À9>í@âÐ$>í@âÐ$>í@âÐN?_SSÓæÍ›ÍÍÍY,–¹¹ùêÕ«+++ñ$‚ òóó/BDtgg1ÀÖ‚¨­­}¡6} Þ*T|ÑYt»]åååõc…>{öìÓO?µ±±ÑÓÓ›qâD??¿ºº:<ž ˆÓ§Oóx>¾¤¤D¹ Ò²ò ««kNNŸÏ_·n]iiiUUU\\‹ÅjkkÃ<==«««ÓÓÓuttž?N’¤µµuHHˆD"IOOg0UUU¸Ù©S§öÔˆT*%IRM…×^{íöíÛwïÞuvv^¸p!êþýûmmmsssÅb±@  ›Uþ"Tûj*«_bjx{{Ö³º½VÓðVÑíÆ¬f=v]ï*±)â5BÈÞVhLL “Éôöö>qâDee¥Ê§ZSÙ£¢¢ìììnÞ¼yÿþ}777&“‰ÃP™/õqõ[)þ-´¶¶ª_MžÕ%I’$û“øttt®_¿þ{¿‘ÉdäokÈÎÎîĉ¸Â½{÷Bxjvv6I’ …B¥¬¼ñuk— 455•$Ɇ†¹\ŽGŠD"åmåÌ™3Tûx$‡ÃÙ»w/®,“Éär9nVM#¸ ¦þ$IÞºu !T__Ûœ>}zbb"žTYYÉd2[ZZÈŸšÊý^bšL|Þ*ºNR¿»®÷žšR“øzZG$I^¿~}Ó¦M3gÎ$âÕW_ý÷¿ÿݵ5•­ÑÎÎîäÉ“¸Ú;w¨0Ô$>5!þ-ô ÖŸC].—[TT¤¼eSï(ååå666¸Œ xÐÀÀ!Ä`0TÊýÀçóB ááánnn\.700P¹‚™™™Jû‡ŠŽŽ¶°°XµjUaa!u ¦¦‘^+ØÚÚ₽½=BH"‘àÁÒÒR|¹ÐÌÌL¡PP ¡+5•q‰ a²Uô´šzZï/¤§uÔØØøç?ÿù«¯¾ºsçNee¥³³óâÅ‹»žÙPÙËËË­­­qÙÎÎn ßýö[}ÔŸmËËËëСCøBˆÍfß¼yS¥Ç+))Áe\àr¹ˆ³{xrss+))‰‰‰yôèQVV–r…®}Q,X° ¬¬,55ÕÔÔtîܹÔSM#½V‹Å¸ ‰‚077ǃ\.÷ìÙ³ø?Lgg§L&›2eJOßå…*CÃd«èi5õ´Þ_HOëhÚ´ißÿ=®cjjºsçÎgÏžáe*[£©©iii).+O"I)ýWèõÛ¡aù¿p8ëÏŠˆˆH$ ??_"‘dddlÛ¶M¥ÎÊ•+·oß. ‹ŠŠ>úè#@ÐÇ«± xk  ½êèèprr²³³{ðàA@@úí`³[ŽŽŽ¡¡¡|>Ö¬Y$IêééõÚ¾ïAM…ÐÐлwïÞ»woýúõ>>>Ôí áááùùùb±800ÐÝݽÛpû}¬ùäKKK]]]·|ùòêêj•ÖºnÏŸ?_¿~½±±±••¾’sûöm’$Ož<9yòä &àë×Êï˦®‚s|$I’亞OIIYºt©ò0¢áŽHSSSÒlpÿþý™3gJ¥Ò & 錂HNNöõõÒ¹ p^í˜1cÆÖ­[Ÿ>}ZUU1oÞ¼¡Îz€‰íHNN¾yó&—˵µµmii‰ÕvD42L'`Ôspp¸r劶£ )ØãÐ$>í@âÐ$¾?¨®nÒv€!×ÍÅA| õˆS]=¶©IÏÆFÆ`Œ†ÛÖòòòœ¥©a¾U<{¦ÓÔ4¦¥e ÷tÌ…¶ÃÃÝŸ¹¹¹···¶BŒŒÚÄbNk«®½}-‹5â?ÎÎÎ...ldxn$I47ë>}ÊjjÓØÈ’Ë![ÛzÈzêy{{SÏ’Ów䫘93¢®®ÙÐPï_ÿZ9w®½¶Ã¿knn»yó‘PXzýú‚Çmmr&“ÑÙÙ‰7a—˜º?úŸª  øÌÌ‚ÎN!ôÁoþóŸ^ººýé I’EEÕBaéÿ[rã†øÉ“‚@ºº:ííråj::LGG~zz¬)ÐGøT%$䆅¥)!&“ñ꫱±«&O6Òv\tÔÙI.^¼ïæÍG,–N[›¼Û: ÃȈuùòV.W£/c#\ÕUåâbƒ³BH¡è,(xìîþåO?©ÿ ±{÷R&“ÑSÖCyäÈÿƒ¬^$>U66“8j°£CÑÔôìý÷¿Ý³ç|ü 4iêÔ—‚ƒ= Õe1‚@Ÿ¾döl[ GF:H|Ýpuµa2_2¤BA~õÕ¿W®ŒkllÕb`ôôᇶ¶“•צ£Ãðö~}õj7­DF4H|Ýpq±íÒe="IòÚ5Ñüù» Ÿh#(ú*+«µµ¤r2ZG‡ig7ùË/‡õÝ…`Ø‚Ä×?ÿÙZ.ïì:^.WH$ï¼óõùó·5 ut(¾þúß1eeuÞÞ¯S;} ¡¯?æøñ5zzºÚŒPÐ-U7ìíMÇÓkiy®2ž ’$gÎä98˜i%0Zùé§¢­[SkkŸnßþW??çÖÖöììµµÍx×ïÈ‘•ææmÇF*ØãëƒAÌžm«rB]W—i`À:|8àìÙ ––µÈd-6$.]úí´i¦99aË—»0„kçNo’$ "(è/nnSµ&Á`¯{®®¶?þø ³S~ÝÑC|þ„ŒŒML µÚ(—š*ŒŠ:×ÙI~ûmÀ;ï8*OZ´èåùóg´¶¶oݺP[áÑ_÷œœ¬ärBHW—Ébéz{Ï:qâúƒOLL`Gc¨{Öáá1=:ÚÇÄݦ¦iË–”Ü:nKÛÑ6ä±c9»w_411JOrv¶é©æäÉã5­à‘µ…†¦zzÎtwÿµŸ‚šš§sæD/]úúçŸ/Ñn`£LQQÕ–-)7lð ú \¨‰ïœ>ýóæÍÉgÎ|ôúëVÚŽe4ho—ÇÄü{ÕÁÁl÷î¥Ó¦qµ  H|/ÆÏï_õ—.ma±à,Á€Ü¼Y¶eKryy}HÈ¢U«ÞÐÑÓv@s`k{1»vùVU5îßYÛŒ`ÍÍm[·¦xy}óÒKã¯\Ù²fd= a°Ç÷ÂŽý϶mß]¸ð1ÜÆÜ/Þýä“t¹\±cÇ{*w« 1ø^Xg'ù׿hmmûþûMÐóeßUU5†„¤^ºtùr—O?Œ?VÛú‚CŒÆ`{ö,}ø°úÈ‘kÚŽed I2!!wîÜ/ùE’˜¸v×._Èz@»`¯Ÿöí»üõ×ÿ¾re‹••‰¶cÖŠ‹k¶lI K×­sÿøã·ôõÇh;" ñõ—\Þ)|=nܘ´´ ¢k'V¡Žž}—üqêÔ—vï^:cœÃ$¾þ+,|²páWÛ·ÿ5 ÀUÛ± ;ƒƒ“ËÊjCC߆»UÀp›cÿMŸÎ]·Î=*êÜ“' ÚŽeiii‹ˆ8ãåõÍĉW®l…»UÀ0{|ÒÞ.ë­=ææÆññÚŽeX¸vM’ÚÜüüŸÿ\ìí= N€á þȘ1:{ö,»zU”‘qSÛ±hY}}ËÚµ'Þÿ[''«ììŸ×!ëa öøAxxÆ™3·®^ ¡mo}©©ÂíÛ3Y,Ýèhï¿üeº¶Ã øÁ³gíóæírtä> íX4­¢BšzíšîV#ê}ý111K33 ~øá®¶cÑ…¢óàÁ+sæDWVÊΞýèÓOõÀH{|ƒfÓ¦¤«W¹z5„%ܽ[|úáÃê͛΅G÷ÀÈ{|ƒfÛ¶w ‚ˆŒ<¯í@†V[›<*êüÛoïe³Çfg‡ý²q`o0]ºtÕª£IIkGë;À~úéáÖ­) ­Û¶-»UÀȉo­]{¢ àñè{5GCCëgŸIO¿)üiûö¿NšDÓë×`t€Ä7Èêë[æÌ‰ööžõÏ.Öv,ƒæÜ¹‚ˆˆ æÎÞóçÏÐv8 œãdθþsñ‘#×òóKµË xò¤aåʸõëO¾óÎ+?þYŒ°Ç7$V­:ZRR3¢_ÍA½òñ¥—Ø11¾ð~%0š@âUUsç~ù·¿¹/Ðv,ýñðaõæÍÉ·o—oÙw«€Qu‡ÄK/ {û›o.Ý»W©íX^L{»<*꼇GŒ®.3;{+Ü­F%Øã*$I.]úmsóósçþÁdŽŒ0ø•••²ˆ/g¸[ŒV#ã9ñå—Þ¿ü"‰¯æÀ¯|\¼økk“ÿü'lùrÈz`ƒ=¾¡uèлwÿ0Ì_Í_ùHèË/}àº- H|CK¡è|çoôõu‡ç«9jk›?ý4ýûïoðÁ›[¶,02Ò×vDhê-&“±gϲüüG ¹ÚŽåð+ßxcǃOÒÓ?ܾý]Èz€>`OvïþáÈ‘kÙÙ!\.[Û± „PI‰tóæä›7mØàñá‡#÷fCúŸ&tt(<=÷˜™±µþjê•Ó§scb–N›fªÝxÐ H|ò¿ÿ=öòúfß>ÿwß}U[1<Þ¼9ùñãºÏ>[ìççÌ` »sŽhœãÓW^á¯YãžQ[Û¬ù¹S¯|œ<ÙèÊ•­Ë—»@Öt{|šóìYû_þãèÈ?th…&çûŸÿˆBBR[ZÚ¢¢Þ{çGM΀á öø4G_ÌîÝK¿ûî{5Ço¯|ü×›oNÉÉ ƒ¬{|š¶ukÊ¥K÷5ðjŽÔTadä9CC½˜˜¥..6C:/FH|šöôésw÷/çÍ›¶k—ïÍ¢¢B–zíšhíZ÷à`O==Ý!š#ÔhK|¹¹¹åååÚŽ¢wîÔÿßÿ‰>úh†µµÑ 7þ¿ÿÕ¥¤”Œ¯»l™¥¥Ö:ˆ÷õª´ÀÀ¶Äçãã“––¦í(z7v¬Ãóç;;Û½å1cÌnjᶴ䓤bÐï»Q¶]QfÞ²?gΜÏ?ÿ\ÛQÐ×Õ«W·mÛ¦í(P®êh€v ñh€v ñh€vè›øZ[[>ìëë;þ|__ß]»vÕÖÖâIîîî"‘hçå®ÄÓÓ3((H}û} @¡P¸»»766<<•F«e†§Qx__$BĶmÛLMMëêêÎ;” «;$xíÝ»×ÖÖ!ÔÚÚš˜˜øÙgŸ:uŠÉÐ+k Æ'Ÿ|2vìà?ó;t-0Ðtï‡~xòäÉ®]»¦M›Æf³mll6nÜxôèÑf"5ôõõ &Mš´fÍššš‰DÒ¿¦¨}1‚ æÏŸ?™zèZ`8 iâ»téÒ’%Kôôô”G0¿/…BqôèQ__ßÅ‹GFF655áñîîî?þø£Ï¢E‹Ž9råÊooï·ß~ûСCT…K—.)Tà¹0™L’$O:õþûï{yy}þùçÔ,0±XìåååééùÁ\½z·‰Z²d Î}8 ª õÆ>>>^^^gΜÁ#ùå—    ,[¶ìûï¿Ç#¯]»ö׿þÕËË+==ú,5‹œœœ÷ß_ lÛ¶M%HF"š&>±XlcÓKOMÉÉÉ?þøã¶mÛùÄÁÁA¹ ¬µµ5!!aÚ´i¦¦¦gÏž½páBDDÄ·ß~ÛÞÞþÕW_)×üâ‹/x<^llìéÓ§}||vìØ!—˳³³BgÏž?~|_B={öì‘#G¶lÙrðàÁŽŽÜìŸþô§S§NíÙ³G&“!„òóóOœ8ññÇ>|WS÷ÙgŸø µµŸöòõõ522zóÍ7BË–-£ÊMMM¦¦¦óçÏÇ-P„кuë¨2ƒÁØ»w/Bè»ï¾ûàƒ¦OŸŽ öõõmkkc±X¸ÚáÇõõõñîáË/¿ÜÑÑÑÒÒ¢6EM¨^^^l6û7ÞP(ø[777s8‡óæ›offfâj+V¬044œ3gζmÛTBÈÏÏ7¾qãÆ5kÖP0BÑ4ñM˜0¡¼¼|ÆŒxðܹsmmmÞÞÞÊujjj¸\..ã‚T*µ°°@éëë#„ð •ËjP7ärùùóç#""NŸ>]UUIU“J¥<—›››O:uïÞ½ÊÊJjd·Ô„:qâD•ð6mÚ´ÿþÔÔÔW^yåwÞÁ ÁÄÄDÍ· 777Wn€Ц‰oöìÙß}÷Ý[o½…÷§ îܹ£RÇÄÄäÉ“'øXÃN˜0¡ßsÄ7pÙ××÷èÑ£&Løûßÿ>{öl„I’---T„І ¦OŸ¾nÝ:;;;’$ßzë­žWj×\æä䔜œ\\\œ““³qãÆ¤¤¤n«){òäÉÌ™3Bh`ˀဦçøêêêÂÂÂD"Q]]]NNΉ'TêxzzÆÇÇÿòË/ß|ó‹‹‹rVRãÒ¥K8ûPcÆŒ!âéÓ§žžžG‰D•••{öìÙ´i“r5…B1mÚ4WVV¶cÇ„ÐÓ§Oñ$ªÐP׬Y;iÒ¤©S§’$9f̘^¿n¼¬¬ì…–ÃM÷øØlöbcc·lÙÒÞÞþꫯ~þùç~~~ÊuÞÿýgÏžEDD´µµ½þúë6lècã;vìøä“OLMM©B×:ãÇ?yòäçŸÞÖÖÑÜÜìààðÅ_(×ùøã÷ïß7eÊ”+V´´´|úé§'Nœxùå—W¯^––fhhØP·lÙràÀÌÌ̉'~òÉ'FF½÷½hÑ¢ÈÈH™L6kÖ,•ì ÀH4 {`–J¥Ðé rwwÿöÛo§NÚÇú¸#ÒQ¶]Q†¦‡º:£é¡.è;|ç £ ìñh€v ñh€v ñhg^Õ-,,„ûø´H*•j;z1ÚŸ‹‹‹¶C ;Üß ÃÖh{rzçø´‰@;ø´‰@;ø´óÿ€±×Ѿ°…IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1FoundSet-members.html0000644000175000017500000001224412234777147027716 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::FoundSet Member List
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1predicate__FieldHasName.html0000644000175000017500000002536512234777147031206 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::predicate_FieldHasName< T_Element > Class Template Reference
        Glom::predicate_FieldHasName< T_Element > Class Template Reference

        A predicate for use with std::find_if() to find a Field or LayoutItem which refers to the same field, looking at just the name. More...

        Public Member Functions

         predicate_FieldHasName (const Glib::ustring& strName)
         
        virtual ~predicate_FieldHasName ()
         
        bool operator() (const T_Element& element)
         
        bool operator() (const sharedptr< T_Element >& element)
         
        bool operator() (const sharedptr< const T_Element >& element)
         

        Detailed Description

        template<class T_Element>
        class Glom::predicate_FieldHasName< T_Element >

        A predicate for use with std::find_if() to find a Field or LayoutItem which refers to the same field, looking at just the name.

        Constructor & Destructor Documentation

        template <class T_Element >
        Glom::predicate_FieldHasName< T_Element >::predicate_FieldHasName ( const Glib::ustring strName)
        inline
        template <class T_Element >
        virtual Glom::predicate_FieldHasName< T_Element >::~predicate_FieldHasName ( )
        inlinevirtual

        Member Function Documentation

        template <class T_Element >
        bool Glom::predicate_FieldHasName< T_Element >::operator() ( const T_Element &  element)
        inline
        template <class T_Element >
        bool Glom::predicate_FieldHasName< T_Element >::operator() ( const sharedptr< T_Element >&  element)
        inline
        template <class T_Element >
        bool Glom::predicate_FieldHasName< T_Element >::operator() ( const sharedptr< const T_Element >&  element)
        inline

        The documentation for this class was generated from the following file:
        • libglom/data_structure/field.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1FoundSet__coll__graph.png0000644000175000017500000005335612234777145030605 0ustar00murraycmurrayc00000000000000‰PNG  IHDR³Ï¨tbKGDÿÿÿ ½§“ IDATxœìÝwXGÿðÙ;ÊwpTá8:ˆ –—€ļּDA)c{%1æÕø¾A#&öXb/ V0J±%þ@£1*jÀ^E@éõŽ£^Ýß“l.×8êqðýÄ@yQPPP·WüͳgÏt]€>Æ€DÆ`€DÆ`€DÆ`]Q]]­eæwß}7""B~É/¿üÂ`0êëë» jjµ©Î ×èA÷Œ###SSS›››©%.\˜8q"‹ÅÒa­@Ñ9‘q§Üg4i’¡¡aZZµäÂ… aaaÝ_е'2ÎÈÈ055uuu‹‹#!dkk[]]- —/_Þ¯_?[[ÛÝ»wS«‘ ŸPfdd’’’‚?>~ü¸¤¤dêÔ©$IÆÆÆº¹¹YYY…‡‡×ÔÔ „d2Yll¬‡‡‡™™™¿¿ÿ­[·páTM$ILLŒ“““MTT^ ç¹~ýº³³ó‘#GÔíàÙ³g]]]ÙlvXXXeeåÇÇoeeebbâãã“””¤²TÖSYUUUÛštRNEEŵk×ÈÖ¸»»GGG—••9s†F£•——#„ªªªH’Œ‰‰qvv¾qãFvvöرc©åñññùùùò •ÒÒÒX,VKK I’6l˜2e I’{öìñôô¼}ûv^^^pppXXI’;wîtrrº~ýzIIILLŒµµµX,&I’Úâ_|áááqçÎììì7ß|3$$o!4jÔ¨7n455©¬BhĈ=zò䉿¿ÿ”)S¼½½—,YRPPP^^gll, •Û!&&F¹žònܸ9`À€V[øéÓ§OŸ>m5èD퉌­¬¬¾þúkœæñx‰„ŠGÝÜÜ>Œ¿zôèµ\Kb±ØÚÚúÂ… $I>5hР“'Oâ %%%t:½±±qàÀø6-I’2™ŒÇãÉd2R.2öòò:~ü8ÎðôéS„P]]Μœ¬¡!ªîß¿*((H$xIvv6µ …vðööV®'I’MMMß~û­¯¯oPPPbb¢H$jµ´Œ%R‰6Ù@«Ú3šbÿþý±±±...óæÍ{þü9N§¾*++ëß¿?NS í̘1#%%¥¨¨èÉ“'!!!805kAA8::J¥ÒâââÂÂBooo¼Al6¥ yxxà4NãÎÎΚ«áéé‰ @eeeÅÄÄr8œE‹©k‡W¯^)×óòåË...?>uêÔµk×""" ÛÚ,*Ýuùéå«=:¥4ОÈxòäÉ/_¾LNNvpp *))¡¾âr¹9998——׎Â###øá‡”””   +++„‡Ã9þ<äñíáþýûs8œ‚‚j->Ÿ/•JåËár¹ùùù8¤ÑZÙkªæÙÙÙAÌš5+??ëÖ­………—/_V×$I*דËåúùù]¾|955•Çãµ£A”òK·^ÞêµÆkÄÆ»¯î.©+i} …öDƾ¾¾«V­rvv9r$I’ !„þٳgoذáÖ­[¹¹¹+W®¤VIHHÀ,•PgìØ±ÆÆÆ›6m¢f¥˜3gNLLLfff^^Þ¢E‹Æ‡š?þºuënÞ¼Y^^¾mÛ6.—KM÷†k2wîÜ7fddäää,[¶,88˜Ífk¹ƒ«V­zòäÉÓ§Oßÿýððpƒáçççåå•••5g΄Pmm­r;,Z´H¹žƒ¾xñbZZZIIÉ!C,X€Gh´UMCÍ®Ÿwù®÷uüŸã§g?Í«ÌC‘$)•I[]hE~h…–㌯\¹âããÃ`0<<€ šRRñntCKƒ†jt#†!ƒúH#h&òX –Í€úhlhljd*ŸÁÒÔò¯Ò ÿ*Fû[QfFfFkIô)­gél—.]š2eŠòò5kÖlÚ´©ïÔA³÷Ïn<¿ñaÙCj‰æxtÔ£:²9¶)›@„ÂBss:®2÷k5·ˆ[Ф¢Fac×m”N£›3Ì©LÓnˆ2güÑ28Ú¦bkš‹ÁB™™!¹€ž ¸qÛ—cabA#hlS6AlŧHÐÍàžq#•IOüxâÇܯ\©®¯660J„ò?üì!ŽÉ(tÝÜÄ\!¶©¶#­õ”T&´”—óÿzö±IÔDµ§Œ”Õ5×Q_5 EÑE‘RAó_EÕ·ÔKd„P]sL&Cñšxò%ˆ¥â†–„P"l5!„šÅôT±‚A«ãÂ-M- ‚`›²ñ­qü|@qðÿÃns†¹!ÝÐÂÄß&g3 醖¦–†tC&ƒijdjl`ÜæFú0Ü3šÑit?'??'¿SƒO=+}–œ™|ìÖ±—µ/ éªÇTp-¹ÖLëî¯gD§ÑåNPT.Ôagn'?! Ð)tü§…z-œ¥¥åµk×|}}B,KãJZ‘J¥gΜqqqINN–Œ{‚ FyŒå1j{øv)ι€N˜š˜°M8lŽ–ùEQ]s EÀoâ×5× šµµµµµMµµµ5 55 5¹¹xaƒ°Aa[VfVÊÿY3­­Ì¬l˜6Ô=g–=ŸŽ#cù÷Ò1™Lí_Sת«W¯ŠD¢½{÷.\¸P(÷·ô ‚Pžs ½`d`d˲µeÙj™_áž´BâÁ«¥u¥¼F^mc­üt.ênBs,8l|ÚÞžF´ç… z™ús$AgΜY¹r%Ç›8q⬭Û6ýBbbbHHÈÛo¿-‘H~üñÇ·ß~[e6‰D²nݺãÇ777Oœ8qÏž=ÖÖÖ2™ì«¯¾úöÛoËˡ ²}ûöÑ£GS«ðù|&“i`ÐC›€ÞJË{Ò™¤º¾ºº¡ºº¡º²¾²ª¾ªª¾ªº¡ºª¾ª²¾2«, §ågÐc1XýÌûÙ²lñmf;–Ùm˜66§Ÿy?;–Ü{€¾ ç†wkÖ¬9}ú´¹¹ùÂ… ,Xpþüyí׋ÅçÎKHH011™___@`n®íÔªW®\A?!ºtéRu*Ž9òÙgŸá íÞ½ÛÇÇG :tèóÏ? DmذaåÊ•tú_·‹&Ožü믿 …³fͪ®®öññ¹xñ"#„RSSÓÒÒ¶oßîïïßi{«¤EÒò¸ø1‚³Ê³ž?)¬.¬i¬Aˆ Óé2™LFÊhm’Ϥ®« +Ò ¬œœ¬œ”¿"I²BPQÂÿ+b.æ?,z˜ú$õUí«&QBˆiÌtµqu³qs³qsµvuµquµvu³qc›vÚÄ—Ð7$ù×{"*++Ÿ?¤»úüAå ê‚HII™1c†®jÕ=®d]yïÈ{/ù/B4‚fH7KÅÔò é†[÷þçŸÿéÞ:tC(–ðJò«óó«òó«òq¢”_ZVW†þàánãînëŽçÍp·uw·qw³qSùÂQ ºãžñ¥K—¦L™¢¼|Íš5›6mÒ¾<_DçÛÓŒ8þ›éß|uý«Ÿ_ül@7g2±T<ÂeD·ÕMÁíÛ·‹ŠŠtµõ>ÅÉÉ) @×µºgl`ìnëînëŽþmyY]YauaAuAaM!N\ýýê«ÚWx`† ÓßW¦î4÷ï×ßÕÚµs'i...NOOïÄA—‚« *õÐ{Æ}ܳgÏB¦ïŸ|ÿ᫇$"å“<AK_•>Üe¸!ݰ{ëˆBááá)))Ý¿Ý>(,,,99Y×µzFFÊJù¥…5…UÍ5…Użb‰Lbd`äaëámïíeçÕ¿_ÿþýú{Û{÷3ï×îÍ%%%éöqdÐ&pU@¥ž;Îø¹ùe¬ÉH¸“°Ï¯ÎVúìÂà YeYø? ‡ÁœÁƒ8ƒðUe0g0Ì è­ 2Ö–¦–»fîš?zþÒ“KÓ_¤Ó~ @ÄH—‘ø=^o¿öÇ´¥üR*PÞzykMC BÈÁÂßNá2b´çh+3+]î ç160ÆQ/µD(æVä>/{þ¨èÑ“’'ß?ü~÷Ï»BLcæ`Îà¡Ü¡C¹C‡p‡ å…{z ˆŒõ†¯“ïèGoN‰´ÄR±X*æ4L!›†@yßµ}Õ Õèïr€GÌ Pfl`ìãèããè12/©k®{RòäIñ“GÅž?IÌL4 BNVNC‡5!˜ ç 2Ö'4‚¶`Ì‚Ãg|þýçû®î“!Ù0gÅÈX†@yÿ/û«ê«Ðßew[–m—ï @Y˜XŒñCZ&I²°¦ðqñã'%O?Î*ÉB0Æ çTDÆxb CÀÜÜ\Ý·lSö®™»¾±pïµ½,«M%k”ür ²¾ý=P~Ýýu;–]GöÐ[瀛æ; á¹)ÌMÐo‹Œ †­-Ü/Ô=sss ‘1æãèsð݃܆@ùàõƒ‚ ô÷@ÙÏͯ#“:ôd‹ŒÍÍͬ.+èõäe)˭Ƚÿêþ½—÷¿óÊκæ:Aë߯ÿp—?¦‡#±!êÌéႨªª²±Ñ¿qÏ*_0¦üGÐÍ$‰¡¡¡;Õºuë¾üòË––„Pss3ƒ¡zJuoýÔÓÓ¡³@ hIçý€ÞÆÕhÍÛÞÛÛÞû¿wðù;ÊÛ.o+«+óaø h Ûzö<',--¯]»æëë‹b±Ú6Öt::¯ÃñÕW_ýôÓO...FFFºªèÝtÞÏèM 2ÚRzñ¢êÅò—·¯¨n¾Ô ›c³ÙTšÉdÊì³z ?‚ Þ}÷Ý.-_ó>6770ÀÆÆÆÉɩ몡ïôú‚Ðú9} M×úÊÃÖƒ!Ój¶ÿŒŒŒ€€SSSWW׸¸8<ðÀÖÖ¶ººZ(._¾¼_¿~¶¶¶»wï¦V!"!!JÇÄÄà¯*++ óóócccÝÜܬ¬¬ÂÃÃkjjB2™,66ÖÃÃÃÌÌÌßßÿÖ­[èÏqxs‰$&&ÆÉÉÉÆÆ&** ¯…ó\¿~ÝÙÙùÈ‘# •¯ªªêH+qöìY7776›Am±÷Qh(ùfÿ׿þµcǼüÎ;666b±X¹eH’T>¦ê(¯þðáÃñãÇ[YY™˜˜øøø$%%Q9«««‘Æ£Œ)tÔV{‹ü>ª«$Î@®†æ}Tw:`|>_"Qñ"L½Ó›.úØÏ­ h¯°°°°°°V³¹»»GGG—••9s†F£•——#„ªªªH’Œ‰‰qvv¾qãFvvöرc©åñññùùùTâĉÄ¥íÛ·oìØ±{öìñôô¼}ûv^^^pp0®ÆÎ;œœ®_¿^RRcmm-‹I’¤Šýâ‹/<<<îܹ“ýæ›o†„„à2B£FºqãFSSUí7nDFF0 Mm‚ÊÈÈÿ8`À€;wî<þ|ôèÑÓ¦MkSi˜–í¬+êŠjöcÇŽà…ÿùÏ/^Lªj•ÇTåÕ½½½—,YRPPP^^gll, å«¡ò(ËSè¨Ë—/oµ·P…k¨'µõªª*uûˆ»ºÓKKKsqqÙ´iSEE…†-êPbb¢6SzÙAïú9Öï*èDÆ ý´¼¶ZYY}ýõ×8Íãñð}/|wss;|ø0þêÑ£Gê⌺º:ƒñûï¿“$xäÈ‘Aƒ}Šª««Ã’““ñò¦¦¦o¿ýÖ××7(((11Q$µ©M”#ãcÇŽáôÇ©-¶IÏüÖjCQÍÎçó Fqq±T*åp8ׯ_'Uµ —ËU>¦ê¶®¼ú«W¯$ ^’­’’?Ê*)tTww÷V{K[#c•ý–ü³Û´z:¼|ùrõêÕ\.wöìÙwïÞÕ°]Ð22îe½ëçXϼªÐ@d ÚOËkëéÓ§ûõëçìì¡9šT設ö²í‘±Ê~KþÙm´<ZZZNœ8áëëûüC滟–‘q/» è]?ÇzàU€Æƒ.7yòä—/_&'';88•””P_q¹ÜœœœÎËËÓPHddäÙ³gSRRBBB˜L&‡Ã9þ<îÄønPÿþý9NAAµ ŸÏ—J¥ò…p¹Üüü|œÆ ‡ƒ?Òh4œÁÏÏïòåË©©©ÔtôâÅ œÈÍ͕ߢ^kkCEDD¤¤¤$&&Μ9“šáN¡e¬­­•©†2VŸ9sf~~þÖ­[ /_¾¬r|”ÕQè¨Ahî-í ²ßRßjy:dgg§§§ ‚ñãÇ·¯ºÕ‹/zÑÏ­èÞ@ô*ZÞupuu]¾|yYYYJJŠ~L$''‡$Éõë×»¸¸Ü¼y3''gâĉHͰB’$ÍÌ̼¼¼~þùg¼¢OFFFnnî{ï½çëëK’ä¦M›ÜÝÝoܸQVV¶uëV33³úúz’$©ÍmܸÑËËë·ß~Ãà ƒƒƒq Ñßoô¾xñâã?vttü÷¿ÿ}ïÞ½6µ RºgìééùÛo¿=þü7ÞÀ[¤vJKZµss™½‡¼@JšÛTáŽÐÜPT³“$YWWgbbÂf³>|H}«Ð2*©:Ê«;88lÛ¶ ?¢änÇR÷Òä2…Žº|ùòV{‹ü>ª«§ü-=uûˆËTw:`---ñññ£F9rä±cÇZZZ4lW'´¼gÜË.z×Ï1¸g €:ƒöÓòÚzåʃáááqêÔ)’$ FMMP(\±b~ýĉò÷øøxùI’‘‘‘Ôo”"‘hÕªU\.—ÉdNš4éÅ‹xáÚµkMMMýüü®]»†W¤6'‰¢££­¬¬fΜI…*ÿ–466~óÍ7cÇŽmS›(GÆ_|ñ…§§§¹¹ùŒ3*++vJšÚY\OæŸ žH~G'O"ò$"%š»é êŠjvüqêÔ©ƒ¦¾Un•ÇTåÕ¿ÿþ{WWWccãQ£F¥¦¦Nš4 ?,¥}Ä ÐQµé- û¨²žò‘±º}Äeª;°³gÏFEEݾ}[Ã.è––‘q/» è]?Ç 2@‚$Éμ ú’ððp„Prr²®+Òs©{·YJJÊŒ3´,DE;KQÑô2•ýˆ‰BäŸ?G6!ºâ˜Ëž $$ÄÏÏïÓO?ÅU¶Œö:¸:è III‘‘‘}üoоôs¸z ŒF@[—.]"T¡¦VÕ’‡‡G```{j £’ÐÍp”b…îÌGå?!R‚Hé_aqÔÔÔt÷îÝüqÖ¬YmZ±³\Ëz§Gõs@»Á;ðÐÖäÉ“Ûz?Le~Í)#ämU~[Œ^&"q¢!™!„HY›ÊÑ•´´´yóæ}öÙg...ÔBmZRCƒoÚ´©}•iÇAÔI™@ïô¨~h7MÚ~ë/_¥-r6t¨~ãÐ?¯ªX^q ýü&ä‡ü•ÆNtæ7ø›¢àê €:pÏ€žÍ%âЃoFs_½5ˆ„ÕˆyqV IDATnŒ¤BMùG% š‘âB†ễј$Ë!?äo{þÛ·oßÍûZuNÐpÏ´Üuèµsí=TpžDš¿ÆT(è©Oà^žÀÓ#põ@xôï¿ÿ>Aßÿ½üB‚ 233åúÍj± M¯@n ÷¹ÈÀ !„h†º®½ßºuëLLLð³q---격¼Ô§mô|ƒÞ@*•ž9sÆÅÅ¥OÜ!èÈv òû…–¡€ÈþŸˆ #‚Ž@Wùꫯ~úé§W¯^9sÆÈHiÀ ·€?¥ 7¸zõªH$Ú»wïÂ… …B¡±±±®kÔ- YÈm6r›„UèU2*H@Õwt]'ôAUUU666ê24770ÀÆÆÆÉÉ©;+èfpÏô‰‰‰!!!o¿ý¶D"ùñÇÕe“H$111NNN666QQQ555!™LëááaffæïïëÖ-ùUø|¾D"éòè c[äõš˜Ž¦"ZßøWêedd˜ššºººÆÅÅ©<ñBA\¿~ÝÙÙ™ „­­­º1T<š¢ººš$ÉØØX777++«ððpªLL(._¾¿Ìo÷îÝ ¥éÇU€¾ "c ÷Äbñ¹sç"##MLL&Ožœ”¤êáz„BÛ¶m;}útJJJzzzEEÅ{gÚ³gÏþýû=š››;a„iÓ¦ÉÿѺs玧§çæÍ›+++»cg:ÈÌpRƒ¾næÌ™cÇŽÍÏÏß±cÇâÅ‹ÿ÷¿ÿ)ŸøØ§Ÿ~úÝwß555!„4Ü3&ÿþúe„о}û>|êÔ©ŒŒŒ–––%K–Èçß´iÓ¹sçΜ9sëÖ­³gÏ*”¦gWúšî!5è5ÂÂÂÂÂÂt] 255ÕÊÊJ$‘$onnÞÒÒ‚¿BeddP //¯ãÇ㯞>}Šª««8p`\\^(“Éx<žL&“/ÿåË—«W¯ær¹³gϾ{÷n÷íØŸzH; Ybbbù›beeõõ×_ã4ÇswwW>ñI’D%''ãåèÏÀW$WUU 4èäÉ“ø«’’:ÞØØHþy©qss;|ø0þöÑ£GÊ…ÃU€ n/½—˜˜X[[kddDÄìÙ³ºEEE8ÅÅÅ………ÞÞÞx!Al6ÿrJqvvÞ²eK^^Þ„ /^ìççו{è¨ýû÷ÇÆÆº¸¸Ì›7ïùó祥¥Ê'>þèììܾMÌš5 ®ptt”J¥T™¡²²²þýûã4•W•¥—L^: DÆ@¿‰D¢óçÏŸ8q‚÷§‰'ª›¡‚Ëåæççã4Np8‡SPP@åáóùR©TyÝìììôôt@0~üø.Ø@§™ññG­9Îùóçñ&ü[“|ÌårsrrpZÃÛàáª@sSývéÒ%‰D2cÆ SSS¼$""båÊ•"‘Hyf¥¹sçnܸqÀ€Ë–- f³ÙóçÏ_·n›››§§gBBºuëÊËË™L&^E(&''8p@$}øá‡;wîì+_ ·|}}CBB¢££GŽI’äâÅ‹•O|åµx<ž†¹)Ì™3'&&ÆÑÑ‘Ífùå—™™™< ¾={ö† ¼½½íììV®\©°.\UºN«sŒÐ*¸g ô[bbâÛo¿M…Å¡ÆÆÆË—/+gŽŽŽž>}zhhh@@€ÝÑ£GBŸ|òɬY³fÍšåáᑜœ|ñâE*,F¥¦¦¦¥¥mß¾=##cîܹ𠀞/..îÊ•+nnnÑÑÑñññ_}õ•ò‰¯ 00pèСµµµZnbõêÕÁÁÁ¡¡¡Ã† +**:sæŒü·«V­š>}úŒ3Fýî»ï*¬Û¯*Aœ>}šËå²X¬Õ«WŸ:uŠÃᘛ›+ÿ³A^§Ï1¢y&¢‡Ž?ÞÊÊÊÄÄÄÇLJz˜[þE-TZ¡n¤Æ¹J€žÑå g çàŽîí ôBÏy´ª›¯*¡àààêêê””„Д)S¨ô‹/Ô­åîî]VVvæÌ¶|ùr;wîdgg¿ùæ›!!!Tá£Fºqã5LjºwîÜéäätýúõ’’’˜˜kkk±XLþùܤ··÷’%K ÊËËãâ⌅B!ù÷§3©´BÝbbb<==oß¾—— Wl½W1Ð~ÝymMKKSùO»5kÖtOt"c º92îŠkB߹δéª"ɤYëùÔC]»v$Iü‡|O¤R§Ï1¢n&"\ <Ï4þ6;;ý}6…òêæíí­r® `œ1Г'O&ÿœIºâšÐ—¯3¢ic…¸±JÔT%n¨5U‰JEõ¥¢æ‰°^•6ÄÌΰ#åãQjø‘Gù´û÷ïÿÏþóõ×_7nÑ¢E*ç4hÒzŽ噈ä¿åóù±±±·nÝÊËËS9£ˆ†º½zõ Ê£2·Zè™ 2úA±Ð©nCʺ¶¶°¾XØX)n®KEü“€ !Dˆ$IÙùÍì ;·žcäÑ£GçÎ 200ÈÏÏ=z4jï#x&¢1cÆà|>ŸÅbÑétü100Ðßßë֭Æ #I’Á`P+â/ÉO̧P7:~þüùiÓ¦áÌuuu*ŸòzžÀúǤ³`D^jmÅãÆ†r#„H"¥…ÅàŒd餞¾¾¾«V­rvv–Ÿc$###''Gó#ê Ä3ݼy³¼¼|Û¶m\.·¹¹™úV,ûùùyyyeeeÍ™3!„ŸÈd³Ù.\›7oVW·E‹ÅÄÄdffæåå-Z´hܸqÙ {Ad ô! ™ßÿÕyŸwˆ Bˆ ³“öÙ3t•NŸcDóLD‡Ú»w/‡ÃùàƒæÍ›7iÒ$|x÷îÝ111îîîÔÍfåºmÛ¶MÃ\%@¿}vLè¸ððp„º×j€Îí ôBRRRdd$üMÑ ÔU¥ì^ýõõ/ËÅ2©Ú÷ÏXw×7-htÍ4½Ü3ú(‡¬°äA¾ÿ¶'èÍ@EìK3$~^•|ì£ÿ[œ{ï@YQº@Ô â-¡ívéÒ%B•˜˜˜U&è;à <Ð!wîÜÁ÷@×¹s玿¿¿®k€Và‚ ä¯*Æ´KÜþÉþåó—µ9Mò7ý â˜|Ì-ÐPv¿!ïríý¸2‚†,=LþëÆve¨.½-`ŽÐÓ@d Ú/ @×Uèüýý¡©AÏçää¦ëZ­(_U¬¼LBdŸ¯¾½­X&%e!DÐhØæNÆæNÆý§Z#„šªÄåÊ6˜Úê`¶ ºŒ3ÀEÂ_7¾,¿ßˆ"Irê‘þý^Óö <™„üåóÂ~C˜öØV^& ØzîàæNÆÁ‡úç\¬¹½µX""mši¿®P •Iȇ˛kÅFLº½/³ß03‡aLÛAf4Cx€è¸g E--)))22R×µ!øí¢Ÿ»Ô¸®¥™õ¥õ9ß×>:VÁ°4àŒdqF²¼‚­ *î1‚È  ™;›;µAÕ—Ë4–?jx–Xéj­ëªEt–£1ËÑØ+ØJ]©HÖP&²p9.t"c€ž¢4³áÒ²<ÛÀnˆ™½/Óñu–ÍSÃ’» DÆ=…Ãæ¿z•Ýk(ͬ¿w¨ô·=¤¹“1g$ËsŠ¥Ã–®k×ûAd ÐSÓ8ÿ`qþÁ$BYåãÆ²{ e÷êkrš!2îƒÎ'6lؘ˜XYYigg7qâÄ 68::"„‚ÈÈÈ9rd×m ˆªª*})VyaW7QÏ×]Hþ0 __ß={öh(_Ë H$CCÃŽ÷åŽ×Y%w¸ ý¢áàvÿÙGEÉáᡳížÍö- sì@d :™L&{ë­·‚HIIqww/--ýæ›oF•““cll¬ëÚõ8<',--¯]»æëë‹b±úô]îïBTË×××oÙ²eúôéùùùº<Òéôøøø®8”]WrW€ Ð;Î/ž})))ƒ ²µµíþM÷bUUUÏŸ?WX‘1èdÇŽ{ñâE^^ž™™BÈÖÖvß¾}›7oî`œÑõû›Í¦ÒL&Sþc_ ²Ýº¿ Q-Ïf³7oÞ|ðàÁ‚‚//¯vEíAï¾ûng×ôMtQÉ].P“nÖñ]Öp~éöì  ÒÕÖ{¥_~ùeýúõ a~iÐÉNž<¹téRüWÂf³ét:õQ"‘ÄÄÄ899ÙØØDEEÕÔÔàåAœ>}šËå²X¬Õ«WŸ:uŠÃᘛ›¯\¹’Ê ŸÈÈÈ055uuu‹‹ÃÙRRRìíí­­­wíÚ…zøðáøñã­¬¬LLL|||’’’¨Ò®_¿îìì|øðáØØX777++«ððp\¡P¸|ùò~ýúÙÚÚîÞ½›ª_"‘¨:°Ý .Ú_ºíÓ¹V¬2•çãÁƒ‡ŽûùÇ €Èt²¼öÚkšólÛ¶íôéÓ)))éééï½÷õÕÉ“'=ztìØ±ØØØøøø'Ož=ztÇŽùùù¡øøøÑ£GË'fΜ9vìØüüü;v,^¼¸¢¢!ôã?fee8pà¿ÿý¯P(œ9s¦——×ýû÷ W¬X1gΑH„7÷é§Ÿ~÷Ýwµµµ‡>uêTFFFKKË’%KB›6m:wîÜ™3gnݺuöì߯v­Y³æôéÓ·oß.--]°`I’!ù»¸ØwÞy‡ZåæÍ›3gÎ ìhûv •µÝ³gÏþýû=š››;a„iÓ¦I$ ‡rß¾}÷ïß‹‹[±b…P(DJ«¼¼ý½Ý°nîBòðhŠ×_ÝÍÍmß¾}ʽ‚¢²S)÷ÍUmµ‰Tög…:+ôFjù;w<==7oÞ\YY©¹1»\Ö„n;ÅzÍGV™ÊóqñâÅl6{Û¶mIIIû÷ïW×ø.\PwÐÕÑÐòòµR8  p7@A$&&j~;´¡¡áõë×GE­‚<Ífãn¢¢¢bbbæÌ™ƒzöì™O]]¹¹9A×®] ’Édt:]>­î1kkëµk×._¾!ÄçóY,–Áýû÷‡ †W¬ªª244d2™øUNNŽ··7õ{wrrrXXØàÁƒ×¬Y…*--uvv>>>111ÿþ÷¿B?~íµ×¨µŽ;6wî\„УG|}}ëêê,,,¨k1U,B¨¹¹ùäÉ“ûöíc³Ùï¿ÿ~hh¨¡¡¡º¶ÕòQ$üvè®8s5×vРA+W®Ä±I’x¯½½½ÕÊsçÎ…„„PGÁÆÆFåÁRþ³ÝÍ]Há!H:~õêÕÀÀ@•½ÂÔÔWÀËËK]§’ï UUU£Fê`)ôgù­¨ìæææx_^½zuðàÁøøøqãÆ}øá‡~~~î#ѲÂAû B·b*á·CwÏë¾ÛqdÕùùù~~~ÖÖÖÛ·oFMA5~]]ʃ®®zšÏ\êÐ+‚.m´Ï?ÿFSt.<šBá:÷ŒA'ãp8999ÔGWRR¢§¨¨ÈÃçq¢¸¸d2™!¦Vgÿþý±±±...óæÍ{þü9¾ðq¹\ùù|~LLL`` ‡ÃY´h‘üêÎÎΡ‚‚‚Y³fA„£££T*-...++ëß¿?ÎF%äëŒòöö–¯¼B±—/_vqqyüøñ©S§®]»¡.,î Z­maa!Þ_„A8¬Ñp(ñäò‡OåÁRÖÍ]!tíÚ5Çãñ***Ö¯_?}úô††•½‚ZEC§Ò¾ªZ6‘BV ¡7:;;oÙ²%//o„ ‹/îÜÈXKpA@Z_ºíë ÚzdÕîîîS¦L‹Åo½õ–ÊqãkÂR4´Ÿ/•J5Jå éT,eÝ܅ПOà±Ùl;;»•+WÖÔÔäææªìÔ*:•öUÕ²‰TNíGiµ7fgg§§§ ‚ñãÇ·Ö.Hë B·búHÝù˜™™ùË/¿X[[ïÙ³G劸ñµ?a)ÚtKÍç&ÐSƒN¶víÚ²²²àààÌÌ̲²²³gÏ*?ø9wîÜ7fddäää,[¶,88XË9ð_*áëë»jÕ*ggç‘#G’$É`¨xѼX,öóóóòòÊÊÊÂ?ÕÖÖÊg˜3gNLLLfff^^Þ¢E‹Æ‡š={ö† nݺ•››«ð\ȦM›222²²²–.]JU^ùOÝàÁƒ/^¼˜––VRR2dÈ Ü¿_›Ýì4’&Ô¢íÓVk;þüuëÖݼy³¼¼|Û¶m\.·¹¹¹M‡RåÁRn·nîB  Aµµµ*{EC§RØ£Ž7‘f*{#BH(&$$Œ=zÁ‚þþþÏŸ?ß²eK«¥u:¸ PzÎ)ÖA¢z©P íÜ2[¥ò …¹sçîܹóÈ‘#ëÖ­+,,Ä™•w¹Õƒ®¬ÝÝR·ššš81a„ˆˆˆ¯¾úŠzþrܸqÙÙÙ¸­qJ:·|¼‰ºº:„P(Œ‹‹‹ŠŠš8qbhhèêÕ«•g[ë,ƒNfgg—žžnee5qâDOOÏ£G*\‹ŽŽž>}zhhh@@€ÝÑ£Gµ,|öìÙøym*wåÊ77·èèèøøxkkkåµ:´wï^‡óÁÌ›7oÒ¤IÓ¦M“ϰzõêàààÐÐÐaÆ9s!´jÕªéӧϘ1côèÑ Óô,X° **ÊßßßÎÎ?o8tèP•—Zww÷íÛ·çääøûûüñÇZîi‡ÈĨä"JŸ…ÎÚ¢Ò´6­ª¡¶Ÿ|òɬY³fÍšåáᑜœ|ñâE&“Ù¦C©|°T¶[7w!e6667n\²d‰r¯ ¨ëTÊ{ÔÁ&ju”{#–ššš––¶}ûöŒŒŒ¹sçêjò`¸ (è §XûH„²ü+¼Ÿ>ÎO˜ð¸ú÷¦ŽØ&*ÊÚµk½½½g̘1dÈ>ø`áÂ…HMã·zЕµ»[êI’ÑÑÑYYYëׯONNþâ‹/ŒŒŒ–.]*‹»h‹_ýõrÚ7Ù¥6öìÙsëÖ­èè褤¤={ö <øã?njê’~Oà6Ðæ ¼^¯ÞÚ¥™Ú'ŸHªº O¡—§X€DJ‘ÿQä>WÕÝA‡½±ëžÕ/:¿ tuOàɤdÉú¼Kµ?ó¥"A¤Œ|뀗£Ÿ~¼k¦zæ$ÐÚ<—––wòäIù_KLMMi4Ú¸qãuêÔsçÎ!„ÄbñÞ½{CCCCBBä§G400À“0*ìI’xJÄ©S§®[·o¶ ¡¶Ø&½ù-Dt…t“¬ê&z•Œ^&¢– D"RŒB²V&é½Iê}Uo;$*Ôûµù—y¢F)͉I„)í¦ÝœüðáÃÏ?ÿüõ×_?räN‡††:88|úé§>>>!*Z±bU2¾¬¡|•Ο?ÿí·ß>yòdýúõÁÁÁñññ7nÜØ°aƒ¥¥å¶mÛ¨l‘‘‘;wî¼wïÞ¨Q£FŒA ”:þ|jjêÚµkÙlöÞ½{wìØ±nݺk×®iyÏX%ˆŒÐ3&dÍÊ·ú¿!¨î)"舔"„þ‹•Uü‚dªæŸ÷T3oQÞ7ª—C~ȯM~ ·LÅ–öƒNO{Z_""è…qX¬¬èf]}±â…… Þ!*v“22û|òò™ß]yèjO«¿MMMò± õÜð?ü€§ÆC¥¥¥Í;wàÀ¡>úhþüùMMM¦¦¦¡ˆˆssó7Þx!4sæL*-&L˜€K èÏhX¾ÊWiêÔ©l6{̘1R©´©©éÊ•+óæÍ2d^z{Qdd¤Ïõë×ccc===-Z4räÈ .ÌŸ?РA¡•+WFDD…Â>V‘1zE=BvxÊL„êž"‚ø#,Ö à*8¦b¹ºÈæ·Åª—C~ȯM~ Ÿª³šUM±:×׊wˆŸœT1é ݈¦2’“IÈ›_AþÎʯµµuQQÑàÁƒñÇ~øA(*ÜE®¬¬¤¦ŸÃ‰ªª*„‰‰ ús*:ùt›h(_%ê,øcMM ž€ý99ÖØØ8pà@¼k555ñññ111IIIååå›6mÚ´i•³ªªJ~Åv€È½bî}“þÉ¢÷"ùO£—§PéOˆ ’"u¿?úkÛxQmüòC~ ÿlšfr¾326ü{Wö÷Õe÷h4B&#‘šãߦ'ðèF´…÷†k_Èßn£G¾páÂĉ©W¨<~üX!­­mii)QVV†Òfíi(Ÿzw·|~…àÛÖÖ¶¸¸ß3–Ÿ{îܹü1~›¦µµõ¢E‹.\¸ ¬­­?øàürx’$©»ãí耾‚ jZGÍ {¾º&„Üæ  44£ýc²òCˆ@4ø‡.Ð3à¿ÿý¯“““±±±““Ó‚ ¨¿…Adffvâ¶äŸ²211 Ð\¾–H$rQ.¤³JÖž„Þ‡…µ‹IDATâlüMÿ¨ÿóy}…£¥» Bˆf/³ÐsæÌ©©©Y½zuvvvMMÍ7Ž?®gÒ¤Iñññ¿ÿþ{qqñ®]»´ %úé'éR •Ô•Ïd2oݺÕÔÔ” a+'N<~üøÓ§O‹‹‹©‡ÿBcÇŽÝ¿FFFMMMaaá¾}ûÈår'Mštøðáììì’’’íÛ·Ë{®¯¯×f¿”Ad ú´øøxKŸç2¶Fž‹Ð¤;hZº ™¹!„ DzA&“½õÖ[wïÞMII)..¾xñ"ƒÁ5j”P¨jd|g ^ž““ãëë;}út‰DÒÁ2étz]Fº®äV™õ3òyÇ.,i`XÒ ßÛ›Ù!„è†"÷tø)4‹õ¿ÿýoÖ¬YiiiëÖ­SÈóÎ;ï¼ñÆk×®ýàƒ,--£££µ,|Ë–-OŸ>•O¨¤®üeË–>|øwÞÁ÷ƒÕ‰ŠŠ üì³Ï–-[&? yñâÅAAA;vì˜9sæ'Ÿ|"‹ñ«‹¢¢¢Ö®]»páÂÊÊÊ 6àüC‡]°`Aû‚c˜Ï´^ÏgÜ3§¨lMóÈ’2Tu~‡^žFâ:„Ú>šít|>ã#GެY³&//ÏÌÌŒZÈçóY,Nïôy‚ ¬­­µ¶¶ÎÉÉQ÷nÍèôë‰Î/Pêæ3FxJã»õ/Òj ®ò%B"Û6št mæ3móƒ>A"‘ÄÄÄ899ÙØØDEEÕÔüõÌïÙ³g]]]ÙlvXXXee%Rú“Ïçwü’.4dˆü¢•(ðr‰DjŸ@·Nž<¹téRù°!Äf³ét:õQÝéLÄéÓ§¹\.‹ÅZ½zõ©S§8޹¹9õÞf‚ ð¶TBÞŠI’±±±nnnVVVáááòW „ÐÇÇoeeebbâãã“””„þikk‹¯ø2¢¡ª?üð—˵²²Ú»w/^˜‘‘`jjêêꇦ¤¤ØÛÛ[[[ïÚµ‹Z—ÚÄÙ³gÝÜÜØlvDD„|%»áªE£N£Ìƒ6ºÎþy蛛ݜ-àþ1èÅ 2½Í¶mÛNŸ>’’’žž^QQñÞ{ïQ_}óÍ7ßÿýÍ›7KJJæÍ›§¼î;w<==7oÞŒãf=F3BÜ©hôiä®ëª Úƒ^{í5Íy4œÎ'Ož|ôèѱcÇbccãããŸ|øÔ©S---K–,‘Ï9sæL//¯û÷ï®X±bΜ9"‘ˆzHþ¯†ªîÛ·ïþýûqqq+V¬ÀcEfΜ9vìØüüü;v,^¼¿ÂàÇÌÊÊ:pàÀÿû_å!%kÖ¬9}úôíÛ·KKK©©¬P÷^µ 4I–“¾ö°Öчœè±`<"èmŽ9òÙgŸ½þúë¡Ý»wûøø___ªp¸jйàž1èmŠŠŠ<<?&&&00Ãá,Z¤ig UuttT¨Þþýûccc]\\æÍ›÷üùsyãIXÕíU8~±‚|%ûæUKÝtC;¥ èƒ 2½ —ËÅ?§"„p‚šujêÔ©û÷ï—Jÿx[ ›Í¾wïžB §s;0™L6›Íf³íììV®\YSS“››ËápΟ?O’$I’2™ŒÇãõïߟZ%000??ëÖ­………—/_ÖP¸†ª*¿.aòäÉ/_¾LNNvpp Âÿ$ÐüV…/^àDnn.RÕpÕ S@d z›¹sçnܸ1###''gÙ²eÁÁÁÔ/³«V­zòäÉÓ§Oßÿýððpåé„BaBBÂèÑ£,Xàïïÿüùs¡€Á`Q[[;gΜ˜˜˜ÌÌ̼¼¼E‹Q/ÔÅÄb±ŸŸŸ——WVVÖœ9sBµµµø+…áXmªª¯¯ïªU«œGŽI’$ƒÁhu6mÚ”‘‘‘••µtéRùÂ{ëUKO'›½DÆ ·‰ŽŽž>}zhhh@@€ÝÑ£G©¯>úè£)S¦zxx:tHyÝÔÔÔ´´´íÛ·gddÌ;·ƒï^h`gg—žžnee5qâDOOÏ£G*O¦átÖlöìÙ·nÝ’O(³±±Ù¸qã’%K‚ƒƒCCC‡ VTTtæÌù<‡Ú»w/‡ÃùàƒæÍ›7iÒ¤iÓ¦!„‡JEÉm­j\\Ü•+WÜÜÜ¢££ãããµy Ù‚ ¢¢¢üýýíììŽ9B-ïùW­V'Q¹ úsö•Óƒ`ÊÓ ašçQÞ–Âä!궨yGÚ´QГÁ|Æ  ôz>c•t>‡h;t|Y:úawêôÙ•i˜Ï¸ƒ‚>vìØ/¿ü6eÊ”øøxœ~ñâ…»»»ºµðÅyÀ€ãÆ‹ŽŽ611¹xñâÒ¥K‘‘A#FŒ8räF[¸p¡¥¥ejj*n¨;wîìÚµ+>>ÞÖÖvùòå CÃ~1iÒ¤'Nܼy322²¡¡áµ×^S·E ;’ššªýFÛ׌0Ÿq§S9Ÿ1"ÐB(11Q×µøCZZšÊ޾fÍ-KÀ¿±ÖÕÕui=;]bb"œ¹@ç v'„PFFF—n",,,,,¬+JF]»v$I<¦\>­a§BUUU$Iâ ›ñÂììlj9UI’÷ïßGtÉÈÈ4hÐÉ“'ñW%%%t:½±±QÆÎ;GU©ªªªÕ-ªÜ‘6m´þÒ± ¬þa9ÑÜЪ3âþN¡©aÖ6 ¯&Ož¬|±Ð^~~¾ÏüùóñÌGÐcuäZ×´c" ŸÏ½uëV^^žüÑHýtCx¾‘Y³fQ9‹‹‹Ö•§0yˆ†-jØ‘¶n´­Éš¤ÈDúÊTòÒDZm„2 )3ìߨY›DÆ rwwojjÒu-hèïï¿uëÖaÆ‘Z1//Ou§0݇ÃÙ¾};N’d]]æ7fѰE ÚºÑ6Éÿ‰gtqhuV3B¤¥‡ çŸ,‡‘LûáL†ÅðÎÚ @d €‡ÇãÙØØÈO‚§Ý¨­­Å‡¬ZµêÛo¿%Baº!<߈££#›ÍþòË/333úè£5kÖŒ1"&&¦®®nÚ´iYYYèÏ醚ššÞzë-<­¶zõêæææÐÐP>Ÿ?zôh…ùFZ¥a‹tp£B´âQƒ¤Yæ>ÑRù[ç1Îc,ÚT h7˜›´Aï››BÁœ '€~ØËtÝÜ@¦jqùý†ò‡ e÷x/š"œß0Ÿ¸ÃC×õêë`>cèÀ¥K—UbbbôtCZÕKCžœôä—Ï k²›ß°˜´ËsÎ/C!,î `4t ƒS õÀ iɈEik3ÀÔv°)ÝîQö,ƒ¶‰ŒŒŒŒŒÔu-=‚ÂCý@¯………éº ½Dc…¸âICåãÆÊ§Aë]ÍT¼˜Ðç»î¯ÐDÆ  ðÜþ0jÔ(¸ ô2Ô¬g j²›K3ë+7VE¥! Ï$c€±Y ´{¬ ξgß§£Å#”¥›MkvÒv2›‘Œ¾§§îÖ¿ËZGœõUÒݼ<½9_?/_¯3iÂ]¦Éà{ÜýþÖÏúÍyú¤\Ã’1x€¸ì>[£«ïªóæ7ÎáÞ-'—‡»"DîÚf¿oþy³ïªÓÚàrÞQ©%C–6i‰na‘Aö+¬ #„d f¿ÞÿÞš£Wço5›–êŒèb´l>‡ ÐM¢›ß#Û›ÝÖ&§­Ñµâ×É/Ò†»"D+ÖŒ@ôh÷ܨ¶5º¬®6Pôó4¦%úÀˆîÒÅX3Ñç«¿vwžLZ¢ þ$.Ž›£W‡»(D=’1ˆ8Ь ´{mM®¸¤˜ôÕ ã`Û9Lº)@PÄàÿ¼ÖF§µÑektÙ-.ŸKV©¥¥Å¦ “1±Ó5c~Ý_ úÛë’J2,Ôš–ê’–èLKu‰9q1±ÜD3‡d f‚P­çÍ‘Œ'çŽÕï•Ú<†,-QaD2Ó"0¢ô·¸í×\¶k.Û5WÿuO`DÖ™4¿ú4O"ý""‘ŒÀý'”×~ës´Ç$åênÿ,‰‹O‹ wiÀ"€{äòÛ›Ýæ<ý„[ÊõÔßJH‹ÕÏÓÌ|aÀ½!€©QÄP·×Þì¶[\v‹»ßâ¾Õ;"„øÅ?r’  wqÀ}@2Srfg[û™I%æfh¹q¡‰9ñl±Y‚d @Ôó{åo«o&¯x(õÑøŸò>¹¿Å› NHŸ ØÚà øcŽN£ã:ÌNìô@4SDëgŽ‹érÙ|þ.õn“±Çá·[\öf·Ýâ¶[\ƒßyå€ò³ß$¯Úž:þ`Ó2ý}*ˆP$c@$*..>~üx¸«ˆ ~ÇÛwÕyn_§­É% !©„Ý⾫÷lþ—ý?ìT"!=Ö˜£Ë^Ÿ˜˜g\¬ãš9<°HÆ€µzõê²²²pW~.\xï½÷Æ<9Ôå=ÿçÎÎsC*µB(BYX\có»åþ·ß+§®š`-yþ“ ?’¸8Žî ˆd ˆPééé›7owat2¹¨û[OC­5¸Y†¸sØ­#C]ÞÁ¯ýºË~Ím·¸‡:=Š,LËt›>Ìÿ¶:£Fgdy¸ƒd @tPd¥¡ÆZÿ÷ŸGVŠw€¢Ôü²A¡3jsâ2>ט“b|$nn›kSB2 tž:¿¿s¸Ë«(Áæ‰ ¨ÔbÙóŠÒyq‰¬÷‚d @D“c¶eýéôï[„~(ß&IŠ,ˆÅÀ=£ã€ÈåìóyÎ&¦j³TjI(ŠB¥‘$•4áÁ²_±5½ÀÔ±f @äÒ›5º }ø°DÈÃÝ#ŽvÏ@»g°Ãc¿îüÎãsÉBµF’ÔRÀ++Šè¿~w7n0É݆††öìÙSSSÓ××g6›×­[·gÏž´´4!„$I—.]*((Ðh4V«5))I’¤à`úêñûý¡ÓÝÇ·•TRÂüØ„ù± 熞tÙ}mžÏ@›§¿Åíh÷xúýÎ>ŸÞLCp/HÆ€(&Ëò³Ï>+IÒñãdz²²nܸQYYùøã[,–ØØÛ7dP«ÕÕÕÕññ?iÛä©›ÉÓo»6zß»g@­¡U¸G$c@;räHkkkKK‹^¯B˜L¦ƒîÝ»7&æÎœ$I/¿üòtœ}Âèé;ÝTÌÑ«Ãuj`àßJ@ûè£^{íµ`,1 jõ÷¢$I6›-8>qâDff¦Á`xá…úúú‚¯=ztÌ t|h|éÒ¥Ç{L§ÓeffVUUI’$„0™LÁW%IúòË/322>š"IÒ©S§ÒÓÓ8 „ðù|;vì0›ÍiiiUUUZ­öòåËÓû70e$c@ûúë¯W¬XqWS*++Ož¨­­|Ê믿þÌ3Ï.Z´èСCBˆ­[·ž;wnôàý÷ßß½{wVVÖè¾áªªª3gÎ,\¸pçÎÕÕÕF£±°°0??¿¿¿êïÞ½»¨¨èé§ŸÞ°aÃ+¯¼"„ÐhØ•ˆRðÛ""Jqq±âGcnTkhhÈË˳Z­£/"ïØ±c%%%|^3€5cfβeËÞxãáááÞÞÞòòò¢¢¢Éc1€™D2`æÔÔÔÔÕÕ¥¦¦fgg;ÎÊÊÊpWàîg ÀÌY¾|ù_|î*LŒ5c@’1D2„ A\ˆP]]]ÇŽ wáwáÂ…p—<(HÆ€uñâÅ’’’pWàÂx€ôA$c@’1D2„âÿ ÄA%]<µIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_0x68.html0000644000175000017500000001430012234777147025022 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - h -

        glom-1.22.4/docs/libglom_reference/html/sync_on.png0000644000175000017500000000151512234777145023517 0ustar00murraycmurrayc00000000000000‰PNG  IHDRàw=øIDATxíÝ_HTYÀñï8ã¤ó§i§4-g6ÆËÕ&kQ)¨Ô!Š0ÒURKÚ…„ê¡/»PEÁ>ìK-+KÁ²Ñ.Y”¾dEPaA‰ø°¥¶›ZSÓïÜ;3wºŠ–¯—߯gfîïœsçœWKÇñ.€ÉøD­¨a‘'¬âq_ôˆk¢ÀŒ ÀDŽøQ´ÄïC¨¶åñÏÿgÅ ñ 0„Y‚:qZ¦Á)~õâ€èLý0HVñ× žz-¿‰C“%¨g¦˜6€é8%Úõ¬ëwêÙUÏ¿˜ª³Ä }? ?€·3ÀÀž©Š À”K• @hà a±ðaÇæUe‹ sù~ë2²ì“&Ú&B*AÄljæºììi*˨,Ëçí»÷oÆ£T”,d[˜¼3-*ÁÀ…>å‡Ë çLÉŸçfk˜Ò éw#*AEjKUy>ûšËÉõ&{µ¢8—m5Ki¬ jjƒD*¿NŽÖigwÃ7Dª’mz骹úKÛ¾±ˆ¶M!æ¤ÍkÐ?šoý¬_åÓlXí#Ò~–¸¬ê×ÒÑXŠÓ‘ùRÙ*Eû‚ՂדðEÜ;6«e"Q(²Ù=–¿Ezæ5Kؼָ_ 1òzBªJë ±XŒì96åªjL^7{ùãJÑ÷1½i@%8'7M©_\Qœ#ÓUŒËñýÿyõ Wo Éx8¼s¥v¯ªì|×SnÜ q_m Ýé î>bèÕí[JX,½4[Tú{R£ë¼ôˆ¾þa€tÝjjzzÅ'ÅìȶiIžŽòwÏs ¡€—ÕKøõâC^ŽŒ˜Y­¨µÉ%6¨´êˆº]vÛðhâ½iWv–hôëê°Ò¨¾'æÌ‚·ñ|[ßìúÅ^€YrD=<ýDû]äÇ÷s€Ïõ‹8™ºCì? À ¨—t4õᩎ¡Jã‡W‹É± îr¼cjMɘìx| šE©øNÔ‰œøA¢þ«–€Z¼ñ‡jó î#™§¢¢4gIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__CalendarPortal__coll__graph.png0000644000175000017500000006425712234777146034267 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÅù,|bKGDÿÿÿ ½§“ IDATxœìÝi\×Úð3I€€€1ˆhÔ*méÕ"K hQô-*–E‹EiiÕÖêÕ¶·`Km«¶òV¯Öjím–²¸´Ä×{¹ˆ 6hq)–Ýd'ˆlYçý05Í !H2dòü~˜LΜóÌ$<ž™9s‚á8ŽŒì€" Ÿ€v@>í€| Úù´ƒAvÀ0´´´”——“@![[ÛY³f‘Pò)†™3g’‚±«¯¯';0(ȧ`&MšDvÆ®µµ•ìÀ àú)häSÐȧ O@; Ÿ€v@>äÀ0¬­­Mï½öZDD„âšÿüç?L&óñãÇ:mPÊ!ȧÀ¬X±"77·¯¯O¾æÌ™3 .´²²"1*”@>º¥•>]PP‰‰I^^ž|Í™3gÂÂÂô j@>ÚÄçó½½½-,,œœœŽ9‚aBÈÖÖ¶­­M(nÞ¼ÙÎÎÎÖÖö›o¾‘o‚aXJJŠâÂ@¦¦¦!!!YYYÄË›7o644,]ºÇñ„„ggg6›ÞÞÞŽ’Éd ...ãÆóòòº|ù2Q¹<‰Dïàà0qâÄÈÈHb+¢Laa!Ç;zôè`;˜““ãääÄb±ÂÂÂZZZÊÊÊÙl¶¹¹¹»»ûÉ“'U•qcõ €š›› †,6uêÔØØØÆÆÆììlÖÔÔ„jmmÅq<>>žÇãUTTøûûË×'''×ÖÖ*.¨”——geeÕßßãøöíÛ/^Œãø\]]‹‹‹«««ƒƒƒÃÂÂpÿúë¯ âããmllÄb1ŽãòwíÚåââRRRRQQ1þü¢ „OQQQoo¯ÊB³gϾqãÆ­[·¼¼¼/^<}úôõë××ÕÕ5559rÄÌÌL(<ñññãTTTT´bÅŠ3f y„oß¾}ûöí!‹R@>Ñ0Ÿ²Ùì}ûöË@"‘ȳ˜³³sbb"ñÖ7äë5$‹mllΜ9ƒãø_þò¢ª™3g¦¦¦ètzOOÏSO=Et q—Éd@&“á ùÔÍÍíĉDÛ·o#„=zDÈÌÌTBH~®_¿Žª««“H$ÄšŠŠ yJÇaúôéãÄq¼··÷ðáÃ"‘hÈãùt,ƒ| 4¢a>MOO·³³ãñxkÖ¬¹|ù2®Å˜LfQQQŒ¸³4¬|ŠãøÚµk£¢¢îß¿obbÒÞގ㸹¹¹ÒùVEE…¹¹¹¼!EŠ‘\ºtI1’ß~û(põêU5 „}šø*]ÑiÓ¦q8œºº:ùVR©T±.—[[[K, ‡xI£ ñ!¼¢¢ðU«VÕÖÖîÞ½ûîÝ»ùùùƒÇÆÉår===óóósssÁsHËäÀ hØ?urrÚ¼yscccVVƒÁ î§WVVâ8þùçŸ;::^ºt©²²ráÂ…h˜×Oq—H$vvvl6ûûï¿'Ö|þùçîîî|>¿ªªêÍ7ßôððÀq|çÎS§N-**jllܽ{÷¸qã?~Œã¸<’;v¸¹¹ýòË/ÄõÓàà`¢6„ŸÏWBhîܹ7oÞ$®ŸFDDL™2eÏž=íííeeeÄÙŠŠŠÇaÓ¦Mã$ÔÔÔ¼÷Þ{öööo¼ñƵk׆<ÂÐ?Ë Ÿh˜O/\¸àîîÎd2]\\ÒÒÒp÷óóc2™íííB¡pË–-Äýý¤¤$y>E%''+.¨±aÃ:ÞÒÒB¼‰Dqqq\.×ÒÒ2((¨¦¦†XùÉ'Ÿðx< OOOyØòHD"Qll¬½½=›Í^¹r¥ü²ƒ&ù455ÕÞÞ~„ «V­gÏžurr233óññÉÍÍ "î))•q*êééùá‡üýý‡<ÂOÇ2 Çq’zÆÀóóˆ±ûí·ßB0?ÿØ×OÁrîÜ9L•øøx£Š(˜ŸŒ!‹-"ý„i,Ä ôO@; Ÿ€v@>í€| Æ(•7…JKKµRùÛo¿aØÙ³g•Z$ê×bCÀ¨@>c”à „PAA±üÜsϾf©Tšíè蘙™9úÚƒûû`Œb±XòeKKKÅ—£ôïÿ[$Œ‰‰Ö¶b±øÔ©S+V¬077_´h‘|èöìÙ“žžž••uåÊ•æææ7ß|!tàÀC‡;v¬ªªjÁ‚Ë–-SL %%%®®®_|ñEKKˈ÷0’ŸwBÃç÷uý÷cõ¡ãÇËeeeèÉì¥ÊÍÍe³ÙÄL£ÉÉÉÖÖÖÄÕŠ  *§IlrU¹{÷îmݺ•ËåFEE©Ÿýodàùý± ú§À𸸸 Ó§OGÕ××k¾mFFFGG‡©©)†aQQQ]]]ƒò?xð@Þ±P__÷î]¢Q„†a,‹ø%9÷å—_VWW/X°`ݺužžžÃÜ9`À ŸÃSSSC,TUU!…ÙK‡$‰NŸ>””$<°páÂÁîò«œ&uÈÉU W®\éêê Ôx·€Áƒ| ÏÎ;ù|þ;w6lØÌb±RRRÓÜ`Î;'‘HBCCYODDDœ={V$ ,¼fÍš;vðùüÊÊÊ7 ½þúëŸ}öÙ¥K—šššöìÙÃårÅZ(¦¤¤øúúÆÄÄxyy•——ùå—ÚÜs0¶Áx)`xbbb"##[ZZ,XðÝwß!„¢¢¢’““Õo˜‘‘±dÉ ùšõë×ççç/Y²D©plllww÷òåËûúú.\xàÀ„Ї~( W­ZÕÖÖæîîþóÏ?[ZZÊ7ÉÍÍÍËËûûßÿîå奵½†æ?;óŸbÆçóçÌ™£´2+++44”¬¨ôæ?Ëà|I[“º¸¸øùùi½Z†Î÷™F0Ù¨ÊòJ?ðs˜R@ÿ´ò)häSÐȧ OQKÅd‡¨îïƒa0Ði“pß‘¿cÛ¢mšo’[žû¬ý³öãíuÕÈÀ„­cäS0 åååd‡0¥¥ÇJ޽âð Óô„¬­±Í?Ó?Ö;Ö—ë«ÓØFÀÖÖ–ì€jð| ¾€Ý…•…¥ñ¥³gk¸IŸ¸µ‰%’Š6ÎÛ¸'|)ÃT§j€ë§€â®ß¿^XYˆaØÅÊ‹šoenbîãâƒ!ìÐÍùbNmk­î"”ùPÜŽŸv0h Ãþuç_ÃÚp±ûb!•Iï<¼óÔ'OýpñE(ò) ²ÊæÊ37ÎHd™Lv±ò¢ —i¾màÌ@bT€D&IEë“ׯJ\Õ-ìÖY°ÀàA>T¶'ƒöÇM×ÇÂÇ·nk¾­‡ƒËâÏUÅžÉÏ|æógn<¸¡å(U@>”Õø¨ñø•ãò‘§ :£°²PóÍimÁS ô?ÇÀˆ¥âížÿâùýÿÚ¯åX%@>”uàßpôçðLJ•OB f-P#‘IÄRñ{ï-ûvYgo§vTã¥5=ê{dÿ7ûaâÊ Ú¿nWú=5jZk\?rUùƒÎà±yg6œq·wm¬€*  ¨éðÅÃB±Pi¥ WPÑ\¡y%.¶.ö,ÕHá8^×V—R’2òå@>$’ˆvçï–à¥õt}X£PBKž]bB7QZÉ 3œ':_‰»’š0ª@µ@>”z5µ­» ©º”UX1¼K¨3%²?ó2FÇöþ‚÷o~vÓk*üèø/ðü> Ç¿:÷•Ê·¤2iAEÁ°j{iÆKˆûZ&t“ÉÖ“ ûMó371×B¬€Z  ¨&ïvÞïM¿cfÆ0xªÞø¨ñ^û=ÍkcY°Üí݉Ÿó{uî«7?»¹hÖ¢ècÑ- rª- SpP̓Ž¿=ü­©«©^PßÜÕ|¦ìL¿¸CXGOqæžôFR”w”æÆeÇ%^NL\“¸ôÙ¥¡ÎÞΧ?{zŽÓœSïœÒÕ>ÃùPœÿnÿ§íŸ>yÇñæ®æ¦®&+¦•‹­‹æ5T·TO°˜`ci#_sþ·ó‹ö/J‰I‰œ©ƒ¡‚ó}@qÍ]Í“¬&!„0 ›<~²‡ƒÇ°’)BÈu’«b2E-œµð ß76ü¸¡^P¯ÍXƒ| (®¥«e’õ$­W»7bïxóñoÎð€äS@eB‰°³¯ÓÎÚNë5[›[>záÎ…ÄK‰Z¯(ȧ€ÊZ·â8NœïkÝüóß÷îæŒÍ5­5º¨ȧ€ÊˆQMº8ß'$„&سì£FkfU@UO•µtµ „쬴¾O°0µ8ñƉâÚâÿ> £&€| ¨¬¹«™i´6·Ö]^S½þô·¸ì¸ßþ¦»V€A€| ¨¬åq‹Ž.ž*úlégÓ즭9ºF>w50NO•µ”…ãxëãVý\?•Û¸Ù×ÕwÍÑ5}â>}¶ Æȧ€²½±T¬·ë§F;öú±‡?>õ±>ÛcäS@YÍ]Í!}žïœ':öÕþ ûÿSñ=7 ÈùPñð¾žû§„u~ë‚f½~ìõÇýõß: äS@YmÝm†)M­†Ys¤«¿ëƒÌôß: äS@YíÝíÖLkœñå°8_¯øú‡‹?äÞÊ%% OeuôtÒ9•‹òŽ ›öVÒ[=$†ôò) ¬Žžö86¹1|÷ÚwR™tSÚ&rÃúùPÖXȧ-'~õ}êÕÔÌÒLr#zùPVGO‡Í82Ï÷ Ë<–½æõÚ;©ïã·…A>”5ú§„ƒ‘ÍMÍ×&­%; [Oeµ÷´‘|:Þ||âšÄŸnþ”TœDv,@‡ ŸÊ;ýS„Ђ™ Þzñ­Mi›îwÜ'; +Oe©|ŠÚ±×ÖÊ6æx ŽãdÇtò) ¦^Qo¿¸,Ü’g6îøëÇ * ¾¿ø=Ù±€| ¨‰B?¦ú§!_WßM/mú 󃪖*²cÚùPS{w;{ù!´ë•]N6NÑG£¥2)Ù±-ƒ| ¨‰èŸ’û¼©Jf ³¤˜$þ]þ×¾&; eO5uôv`6ÁbÙ¨ðÞ_bÅ~|êãÛ ·ÉŽhäS@MíÝíãÍÇÓit²QíÓ¥ŸºÛ»¯>ºZ,“ Ðȧ€šÆÚ`)% #é¤;wvåî"; 5O5 zcj°Ô@393·oÛñóŽÒ»¥dÇ´ò) ¦öî±ò°©±‹c½¦z­9¶¦_ÜOv,@ ŸjêìídY°ÈŽb4Œö}Ô÷µ­µ y dÇ´ò) ¦®þ.k¦µú2áááÙfÙÏê?ßÿùêÏÉD·ÂÃÃõ󹓋œŸÖ@×÷?¶bZ YÌËËkË–-zˆÇ˜íÛ·ìôò) & ó)—ˈˆÐC<Æ,3ÓX~›Î÷5i˜OÐ"ȧ€š Ÿýƒ| ¨ ò)Ð?ȧ€‚úÄ}™ò)Ð3ȧ€‚÷?FA>zö_ùôäÉ“dSZf$ãþ”•O1 kkkÓs£Z¡òËSZ ŠñRúè‚ñŒûSýÓáÄ„  <<<BVVp‡GE>…áx”a<ãþ”ü‘OÍt•0 kmm8q¢Žê×s,ÖŸÏæZZZ*¾šƒë§€‚´Û?åóùÞÞÞNNNGŽÁ0 !dkkÛÖÖ& 7oÞlgggkkûÍ7ßÈ7Á0,%%E¾O¼ÕÒÒbbbR[[›àììÌf³ÃÃÃÛÛÛB2™,!!ÁÅÅeܸq^^^—/_&j7'‘Hâãã&NœIlE”),,äñxGU ¾µµu4ûŽaXNN޳³3‹ÅŠˆˆ·T‚| (èqÿc:naj¡•ÚV®\éïï_[[»wïÞuëÖ555!„ˆãÎ;O:•}ùò圜ù&ÉÉɾ¾¾ò…+VÈßÍÊÊòõõÍÍÍMLLLKKãóùýýýëׯG8pàСCÇŽ«ªªZ°`Á²eË$ ñãÒDs{öìIOOÏÊʺråJssó›o¾)oñ£>úñÇ_}õUùšK—.­\¹ÒÏÏo”»ÿñǧ§§?|ø0&&f”µQ®€¸rŠª #; ¾xØz£õÅ4<>l6{ß¾}IJ@ H$¡ÖÖVlj·nܸ!_¯äÑ£GL&ó÷ßÇqÜÏÏïèÑ£3gÎLMM%Þmhh Óé===O=õÔ‘#Gˆ•2™L Èd2üI>ÅqÜÍÍíĉDÛ·o#„=zDÈÌÌ$Ö÷öö>|ØÃÃ# ##C$ ¹ƒŠB|>_ñåñãlj岲2y‹Ãb<ßCèŸ zÜÿX‹O:”àèè]^^N§ÿù*Ó¦M#–å Y[[/^¼8;;ûáÇ¿þúkxxx]]ݪU«ˆÛèöööR©´¾¾þîݻӧO'6Á0ŒÅb'ûrµhÑ¢{÷îeffN™2%  ¡¡Aþ—Ë­¬¬$–«««ÕTBœògee…„„XZZr8œÓ§O¢+:mÚ4‡SWW'ߤ³³S*ý¯ß”ær¹µµµÄ2±Àápˆ—4(àé陟ŸŸ››+¿e?J555ÄBUU•b‹` æÓ®®®>øÀÁÁÁÌÌÌÁÁ!&&Fþ%Óú°5]Œem*‡ª¯FöéÚc¡6󩇇G\\Ç›3gŽãL&=`µ}ûöË—/WUU½ÿþûòMRRRˆÌ(_X²dÉï¿ÿ~ðàÁèèh„ÐêÕ«ãããKKK«««×®];oÞ<„Ð믿þÙgŸ]ºt©©©iÏž=\.·¯¯¨hnÍš5;vìàóù•••7n Vº?kÖ¬Ÿþ9//¯¡¡áé§ŸŽ‰‰¹~ýú(wçÎ|>ÿÎ;6l Z”ïP¦xò¯áõS©Têëëû /”””´´´”••½óÎ;<¯¿¿pýeôO „ ˆeâ:½VŒ2`¤ê’™ú:µ~ˆc<×­”¬K^7Ïü!‹ix|.\¸àîîÎd2]\\ÒÒÒp÷óóc2™íííB¡pË–-Äýý¤¤$ù—!”œœ¬¸€ãøŠ+x<qIT$ÅÅÅq¹\KKË   ššbå'Ÿ|Âãñ,,,<== ˆ å͉D¢ØØX{{{6›½råJùOå7ª§§ç‡~ð÷÷×äˆÉ¡×OwíÚåêêjmmÚÒÒ¢´Sš0žïáHòibbâäÉ“»»»WÊsœî’…Žj2÷©¼Ã ¾€æùtÈúGÃx¾ÇJ"G.;¸lÈbF{|4§ò›ŒÊÊÊÒ¼ã9Î#9ßOMMݰaøqãW²X,ÅëôjÊ¥§§s¹\++«­[·¦¥¥q8kkkù¹’ÒÀ=5aÈÇÜmÚ´)00Íf›››»»»ŸX%DÿQMÙ³g߸qãÖ­[^^^‹/–‡zàÀWW×âââêêêàà`ùÑHUÿTMaõGL ãé( ØðvÊÛC3Úã£gÆsœG’O ÆåË—ÿ¬â @€?IjÊW…ˆ—ŠËCžȨ̈Ę»ÎÎNùåÔŠŠ ¤p ëÔ©Sòú‰•*Çòù|5• j ȯs×þ;::ˆ:UŽ1Äɧj øˆÏ÷XÉì³?ÌúpÈbF{|ôÌxŽóHÎ÷9Ž|Œ‘FGÔ ”³´´DO†w(.1殳³3>>ÞÏÏÃá¬]»V±€½½½Rýƒ%TSÉ\]]‰…3f „‰—*Ƕ/j kñˆ‰®¾.8ßú7’?Ë¥K—:tH>2ŽÅb]»vM©ŒšrZD¤??¿ÚÚÚÝ»wß½{7??_±€Òph4øXB5• Y@>ð°¢¢Ã0â¥Ê1†ƒí˰ õ´;^ $Ÿ~òÉ'ÁÁÁ¥¥¥999Ÿþ¹R™!Ê fàÀ½!‰ÅbOOO77·;wî¬^½=9ãVIåXBõ•CµÔˆ‹‹»uëÖíÛ·ß~ûíððpù,g*ÇDÔ¯aa  í>¥o¿ý6†agÏžU\)ª c– ƒâÉ¿æÏïß¿?22r„ ÁÁÁDTñú©&åT.#U÷–W|yöìY'''333ŸÜÜÜ   3f ¬ŸˆaàXB¢Ø`•ȇþ©i%55ÕÞÞ~„ «V­R:Ç*¦8´pȃ-Æx®[)’H%Ø[ØIþÉ!KŽã#‘Hlmm_{í5ÅõŠú³¬ cç8ë̇BeÆó=Vô¨÷zåÝʲäØ9>çÏŸ?~|FF†µµ51…ùÔ°Àm @5…†79FFFHHÈ’%K$Éùóç+¦rX·ÊYSåˆq):߀‚ùPõ܈ÅâS§N­X±ÂÜÜ|Ñ¢EŠŠ(Q9ÿ©ÊYSå›”””¸ºº~ñÅŠOš| ¨¦»¿!difIv šºpáB(00!´|ùò³gÏ …B•%=ºmÛ¶¹sçN›6í›o¾9}útWW×÷ßÿé§Ÿ#ù¶oß^]]­ø¤â¢E‹.^¼ØÓÓ3{öìÕ«WÿòË/úÙ)ãùPMŸ¸!¤­Éùõ ##£££ÃÔÔ𨨨®®®ÁNùUërÖT÷å—_VWW/X°`ݺužžžºÜ£ùPM¯¨!dnjNv ‰D§OŸNJJ’Ï£¶páÂÁ~HQå°î!gM%TTT\¹r¥««‹è]€| ¨¦OÔ‡271Œ|zîÜ9‰DÊz"""âìÙ³"‘h`a•úÕÌšŠ …)))¾¾¾111^^^ååå_~ù¥÷ϸ¨ø½hcp÷n›““ž~ìèYŸ¸N£›2LÉD#K–,±°øóêDHHÈúõëóóó—,Y¢T866¶»»{ùòå}}} .Us{‘2¾û®üµ×ܬ¬FûÓ:c\}}=—Ë%; }ëõJç!”ššª´ÆÆÆF,Ëø“ù†ä ŠåMLL¶oß¾}ûv•õ/_¾|ùòåÚŒ NE>]±b…þãÐ'ÍÂÎî­M›¾êí½Iv,:FvúÖ+êƒOÏ;·xñâë?þøã;wê?  ÿ•O#"""""È Eo.üôÓÓþþѹ¹[ÈŽh_Ÿx,öO-Z$ïcª2ÆûQÙÙ×B7n@Ñé´S§”§Ð'îƒçûÀ]>=sæW:BH*•<É'; }†u? P‰ÑåÓŒŒ_$)BÇñªªæŠŠ&²#ZýS@ãʧååïÝk—ß01¡Ÿ9ó+©íëõBÿ¸ÆóŸ:uÝÔ”!ý1ûŽX,ÍÌäÿío‹þ, 0\úU__Oú€kêFšZF_#£èߣñŒƒ¦æç§Žã™™|y2%44ÊÊ<÷¬¨€Öõ‰ûl­l5,\RRBî€ëY\trªhAá{ö”Œd´åÓÒÒ»--]J+MLè§O_‡|J%š?lÚý©úºöW$Í/Y°C IDAT\ö ¾{#ÉÁ€Q3¢ë§§O_75UþÿC,–fg—J¥2RBºÐ'2„ûQ¢tq)*}ÉD!4%ˆì€€K>•Hd99×”Nö =%%µú èH¯¨w¬ç˜‹~rCÏ!âÞ¨…²‚ß§cɧ—/W=zÔ¯ò-: ì§’1=þT&D×6¡ÿ#á#$#„f‚ì•ç‘ÊXòéÙ³e!ƒ>ðŸD"ûç?oˆÅ*¦à†hìŽ?}\‰Î=*!„#$ÿ¾IàdŸ2Œå~”Ÿß4Å›N~xrÕ*ïgŸu¯éîîŸ0a¡-›ó¡ Šýè×®ô?7ÙÍ#'$ mÆ’O—-{Nñ凞|ñÅiK—zÐ^ᛯO$@%1¨á4R1¿†&ÎE&óS¬@=cɧÀHà8Þ/éC÷£e¨èÔû@U2EˆÆ@“¢e,×O‘J„8Ž¡ó} 4á9„K‘Êgðdb4y¡ÞcºùP ñcÑcè|ß̽˜^ÈDŒñˆ6à÷uL' ›9d„tò) ”?~,zìôO ¡hÉïhü,„z©q²sGPäS@)üXôØéŸÊIºÑãjÄùDg"qßB†¦,"9* UO¥çûcè~A&F—"ËùŸFA¿ ëéaÇÑä@²#ÚùPÊýÓ±v¾ÿÛ—¨«ù¤"ŒXO£E×ÐÌ¿!Ö3È| Ù‘m‚| (eÌÝBµ_E·w¢ç¾B–SÿXC3Cÿ‹^ú©aíƒ| (…èŸ2L²yBÒ‹Š£Ñ”…Èm½ò[f6dtÆóJJ„!¦É˜É§·>CýMhþy¸o ŸJJ„†™ÐŒô$‹K š<Y8 ]>ȧ€RD‘ Ýd ý ˜õtd=ì €žÀõS@)B‰ÐŒaFvÀHA>”ùò) ‘DdÊ0%; `¤ ŸJþ) äS@)B±äþiã9$ äS@)"©ˆÌþé£rtq9ª=NZ€TO¥y¾/íG—ÂÑDo4ý¯äÈãO¥y?êÖ§¨¯ÍËGtSŒ|ð€RH럶¢;{Ð_ö! îhªÁ0¬­­M[Aé¡ÚÒÒR­W;¦Zȧ€R„b2ò©¸ •¼ŽBÑÔ5únŒ%O¥ˆ¤dœï_IúÐó‡ôÝ®–è¨÷ª-ƒ…7Æ| (…œþéähîad6Q}©ÖÖV¥5|>ßÛÛÛÂÂÂÉÉéÈ‘#Äʬ¬¬É“'ÛØØìß¿!TVVÈf³ÍÍÍÝÝÝOžìáá‘‘!‰” °Ùì}ûöË€è]¿~Çq©TJä ¢sD”©¨¨PÌ2™™™8ŽÏœ9355•(ÐÐÐ@§Ó{zzœ‰•7nÜPÜêøñãÄú²²2„УG”Q­&ņ̃*£íììd2™õõõR©”Ãẹ¹8q‚(vûöm" |¤ùTå Ȧâ²RØ÷îÝÛºu+—ËŠŠºzõêÀrÈ„4ØÔù”ªü¿ò'å²£Àq?w­íÆïܹ3X™ôôt;;;·f͚˗/ã8Žjii!Þ%òÅÝ»wãââ^|ñÅ)S¦(õ4‰?lssåw©¨¨`2™EEED=}}}Š[)­ÿí·ß”Q­&ñLLƒE¼ÿþ‚‚'“ɘLæ¥K—”ÂÀGšOU…U.+êïïOJJòððxþùçUîïàú) ¡Dhf2&žßçr¹žžžùùù¹¹¹ê'P-ZtïÞ½ÌÌÌ)S¦444 'WåüüüjkkwïÞ}÷îÝüü|Å·h4BˆÃáœ>}šø{–Éd`Ú´i\.·²²’(V]]­¸UMM ±PUUEl®Q­&ñ4X´YYY+W®Ä0ŒËåÖÖÖo ò0ˆ|W__¯a‹ƒÍ7—«¨¨¸råJWWW` êß²äS@)"‰È”>&æ—š5kÖÏ?ÿœ——×ÐÐðôÓOÇÄÄ\¿~]©Œ‡‡G\\Ç›3gŽãL¦ŠŸi‹ÅžžžnnnwîÜY½z5B¨££C±ÀêÕ«ãããKKK«««×®];oÞ<„PTTÔöíÛ/_¾\UU¥tûeçÎ|>ÿÎ;6lf±X¡S“øBÝÝÝOH¥ÒÁ¢]¶lYiiizzzdd$BhÍš5;vìàóù•••7n”‡Áb±Îœ9ÓÕÕõÅ_(¶2XB'Ö«<š …)))¾¾¾111^^^ååå_~ùå° üi°ž<µÁù>UÍÚ6kÛ™m:o¦½Çešïééùá‡üýý•Ö_¸pÁÝÝÉdº¸¸¤¥¥áªNxÏž=ëäädffæãã“››DÜBONZE"Q\\—˵´´ "î´…Â-[¶÷÷“’’¹ó®]»\]]­­­CCC‰k ~~~L&³½½ä\x°ø•’ ŸÏ,ZÇ—.]:kÖ,bY$ÅÆÆÚÛÛ³Ùì•+WÊw9))ÉÎÎÎÆÆ&%%Eó`áÉ׫<¸Æçû999‘‘‘ÅÅŃ}|CÃcÀálùÇ?Ö,]êAv @ËÜ>v‹ö‰þøåu؆àW”ï…|R/\‡­è†a|>Μ9úo:$$ÄÓÓó£>ÒÓzçû€RDÏ/%éE—_E“ ^˜[¡–ÞÞÞ«W¯ž?~ÕªUdÇ¢[0  ß*‹E"ò:j ¿ÿLÊùh^^^ttô¶mÛõߺ>A>”"”ux?êaªüùå æ$]5AE¡¡¡¡¡¡dG¡p¾(E$éª*ê@WßDN«7D'õÃùPŠÇKñ7 =P'•J€| ¨C†Ë$2‰Næ—Âeˆi‡<¿G&ãµ_9  ¸~ ¨C"• „Lè&Ú¯£¡Ù_k¿Z@-Ð?Ô!–Š‘Žò)€| ¨ƒÈ§ œur@>ÔýS@.ȧ€:$2 BÈ„ùò) -Ÿï÷7k§`4 ŸêÐæù~[1:ãŒ:®i¡*`4 ŸêÐÚx)qº‰&¿„ØÑBXÀh@>Ô¡µóýk›‘´ÍM4ÐIOY`d  Ž?Î÷Gy?ê~ª=†üNä'`¸  ¨ãûû£9ßïoBü·‘ˈ»Lka£ùP‡îGý²™N@³¿ÑZLÀ˜@>Ô1Úë§â.$lGž? Æ8m†Œ\?Ô1Úûû&ÖhÁ%mŒ ôOuÀó¦€\Ouüq¾O‡³.@ȧ€:´p€Q€| ¨C,cóõ²@>Ô!–ЇLeBÝÄŒäS@©dxù´é_è§é¨¯QgãùP‡X*ÆÃ¦ýÍèJ$²™‹Ì§è2(`DàJ“1Ú»woqq1ÙQh_ƒiÓ”®Ia»æµÝ[súíר<¹¼½½ß{ï=²£C€|jŒŠ‹‹KJJ¼¼¼ÈDËìEöö"{ —5ÛýõÂ"±ÔNÑJJJÈhò©‘òòòÊÌÌ$;   {Ü€tðŸ3ȧ O@; Ÿ€v@>íÕýýâââ½{÷j+}²´´;p`Or²á=k86Ç!bÖÚÚ:qâD²…m GŒÞ¨ú§<ÈÊÊÒV(úôì³Í,–á%Ó’’JŽÃ€´0þ†1ê éãõÜó¢dG’;pý ŠÏç{{{[XX8999rÃ0„­­m[[›P(ܼy³­­í7ßüùëu†¥¤¤È‚ƒƒãã㉷ZZZLLLjkkœÙlvxxx{{;BH&“%$$¸¸¸Œ7ÎËËëòåËD òæ$I||¼ƒƒÃĉ###‰­ˆ2………<ïèÑ£JÁ·¶¶ªßbeVVÖäÉ“mllöïß*++ d³Ùæææîîî'OžTj(11q`üjŽFNN޳³3‹ÅŠˆˆhooWÜ)õñƒ„BFFÆ(kæ·z¦NÛØØ˜M£ÑšššB­­­8ŽÇÇÇóx¼¢¢¢ŠŠ ùúäääÚÚZùBRRÒSO=EÔöí·ßúûû8pÀÕÕµ¸¸¸ºº:88˜ã믿vpp(,,lhhˆ·±±‹Å8ŽË«Ýµk—‹‹KIIIEEÅüùóCBBˆ:B>>>EEE½½½ò°‹ŠŠV¬X1cÆ Mvgùòå £¿¿úôéëׯ¯««kjj:r䈙™™P(Tl諯¾ÿ`G!4cÆŒ’’’òòr__ßeË–)îÔ`ñøó¤ƒ|jHôœOÙlö¾}ûˆe@ ‘Hä¹ÀÙÙ911‘xëÆŠ9BÑ£G˜Læï¿ÿŽã¸ŸŸßÑ£GgΜ™ššJ¼ÛÐÐ@§Ó{zzžzê©#GŽ+e2™@ Éd¸Bêqss;qâQàöíÛ¡G233‰õ½½½‡öððÈÈȉDšìÎõë×q—J¥D[‰„(SQQ¡˜‰†TÆ?ØÑ@?~œX_VVF„­”Oåñ«ùÔPÀù>Ô¡C‡£££ËËËétºü­ÆÆÆiÓ¦Ëò…¬­­/^œýðáÃ_ý5<<¼®®nÕªU†afoo/•JëëëïÞ½;}útb ÃX,q^,÷àÁb™X¨¯¯'^òx<„P~~¾££ãÍ›7ÓÒÒ """LL”'îS¹;\.!D£ýñ‡ÐÙÙïççÇápÖ®]«¸9ÑÊøÕ yØÄÊÃVªPäS0¨E‹Ý»w/33sÊ”) ò·¸\nee%±\]]­¦’+Vääädee…„„XZZr8œÓ§Oÿ™]ÑiÓ¦q8œºº:ù&D‡Q±¹ÚÚZb™Xàp8ÄK"r¹\OOÏüüüÜÜ\@ ùî(%n??¿ÚÚÚÝ»wß½{7??_ñ-¢!•ñ«9555ÄBUU•bØJÕjÐÓgÙÕÕõÁ888˜™™988ÄÄÄÈÿ81 +--Õb[Z¯p ¶¨qqq<oΜ98Ž3™L„‘­¢¢¢¶oß~ùò媪ª÷ß_¾IJJ ‘å K–,ùý÷ß<Z½zu|||iiiuuõÚµkçÍ›‡zýõ×?ûì³K—.555íÙ³‡ËåöõõÍ­Y³fÇŽ|>¿²²rãÆÁÁÁ,K1ÔY³fýüóÏyyy O?ýtLLÌõë×5Ù%b±ØÓÓÓÍÍíÎ;«W¯Futt(Pÿ`G!´sçN>ŸçÎ 6ÈÃ,ãƒ7š‹^?•J¥¾¾¾/¼ðBIIIKKKYYÙ;ï¼ÃãñúûûqGñùüÑ„¡DëŽõ|ýôÂ… îîîL&ÓÅÅ%-- Çq???&“ÙÞÞ. ·lÙBÜÑNJJB W “““p_±bÇ#.‰ŠD¢¸¸8.—kiiTSSC¬üä“Ox<ž………§§gAA±¡¼9‘HkooÏf³W®\©xýqà‘ïééùá‡üýý‡Üôß—2[[[Ïž=ëäädffæãã“››DÜ×’7¤2~5Gc×®]®®®ÖÖÖ¡¡¡---Š;5Xü#þ¼éô‘O'OžÜÝÝ­¸’¸!€l>UúS”·ˆ¹3£zΧ`”´õU„ÏËPèã|?55uÆ ãÆS\Éb±ïo¨`˜žžÎår­¬¬¶nÝš––Æáp¬­­ågUJU rPáË/¿,X¶¤¤dâĉ}}}ƒÅ@Œ”/+"”S\ãøÀŠšìÀ@é#Ÿþúë¯Ï>û¬ú2{öìIOOÏÊʺråJssó›o¾)+55õÆÇOHHHNN¾uëÖ±cÇöîÝKÜ—HNNöõõU\håÊ•nnnׯ_¿{÷î–-[V¯^-‰"""ä˦§§‡……íß¿°”àOú¡JO¹(®ÿöÛoÓÒÒø|~ÿúõë5Ü#@8ŽÏ™3‡ì(€¦s«áù>ƒÁ¸|ù²ü¥¼i@€?9'R3À¸šFÜðU\ìLjà[*vvv2™Ìúúz©TÊáp ÕÄ t•màÊçû**Žläà|ß8Áçe(ôÑ?åp8òÑ$DUyCP3ÀÐÒÒ=V¢¸¬9•ƒ ǘ}ñâEƒñâ‹/ª‰aTTÔÖÆ }ü/]ºôСCò…,ëÚµkJeÔ 0½Á§ü+W®Ä0LM 8Ž£a¦W•µµG€1Hùô“O>ill .--mllÌÉÉùüóÏ•Ê 9Àp0<"„º»»;ŸJ¥ƒ *\¶lYiiizzzdd¤šX,Ö™3gººº¾øâ ŦEH¬W9PÑÁp``<ô‘O'MštåÊ6›½páBWW×cÇŽ œâ/66ö•W^Y¾|¹··÷¤I“Ž;¦aåQQQÄtDò„мyó&<ñ믿~ÿý÷äp8ï¼óNtttPPвeËBÖÖÖ ,°··'n— Ã7ß|?uêÔ^xAÞ®ŸŸß3Ï<£4Ø[qýÖ­[ƒƒƒ—/_þÜsÏ=xð ;;{Ø`P0\áÑp?/0Æ{¤··÷êÕ«çÏŸ_µjÙ±PÇÀYG2ÄáÀÄ5;5d` Œ7ŸæåånÛ¶ÍÑÑ‘ìX¨àÒ¥K+W®ôóó²¤!.))quuýâ‹/ZZZTÆ0d`F3Ø æ?Õ³18þtÈYGU†ß»woëÖ­\.7**êêÕ«ÅF ÆŸ ãퟂÑÓdÖÑ t80ÇûòË/«««,X°nÝ:OOÏá”ùŒœ&³ŽdÐÃ+**®\¹ÒÕÕ8²€Â Ÿ‚‘ÓdÖQD‰áÀB¡0%%Å××7&&ÆËË«¼¼üË/¿V`Fs±®ŸêÙ¼~*7ج£Jß7>Ÿ?Ø£8Ž/]ºtÖ¬YÄò`sž&%%ÙÙÙÙØØÓ‰ë›TTqÕó–â.¶ª\Æq<'''22²¸¸x°Ý²ÀhÀõSCaìãOå +æÎÊd}ùD†8þtX k8°ÞŒÙÏ (aŒ¾ ¥_à1PÏ2™®ÁÓ£ÃÂÂÈA'z{{oݺuþüùýû÷“ #4ª|êããCœòSÀo¿ þý…>Z»ö)SÓ±{YÙÁÁìt"///::†ƒ6ª|Êår#""´ ¹îÜyxøðï5533[ÒÒÖ[X˜’‘q %; FeìvÄôÌÞžÂq¼¬ìÞ²eßtvö’ÀÀ@>ýƒµ5“蓊ŲÊʦ°°o!¥†ò韦LO,ˆÅÒªªæÐЃA¹! äÓ?ñx6ý1VA,–VUµ„†~ ) !ȧâñlLLþ< ‰´ºº%4ôÛŽH©úÐÓ,Ôö“#§…ñ§”Áá°”ÆÒ>I©³³ße³Ç‘˜.deeÃN³Ú½6ÃÊó“òå=’.²Ã‹¨:î˜bFõ|Åää\Û´)U&S> ÝÁ}êÔÆI“¬H L늋‹kkæš5¾ÿøÇzz„dÇ2Vô´ˆŠ©ü囲€dO‡mýú‘H’’RLv c‚ ¦ïtÔï{fŠqQȧÃ6a¸×^óþî»÷÷‹ÉŽ…d-·{~z³ÊrŠiðÓ,lLÈ’A>‰·ßžßÕÕŸ–v•ì@ÈÔðËãÜ·«&>eþòwnfÖ04 ȧ#2i’Õ«¯ÎýöÛ‰ÅR²c!ǃË]ç·ÔØ{Y}íÊ0‡oA>± ^jm}|òä/dBŽ{;|­çáL7…é øb0Œî¿%\†#„0$Sþdt‰@‹Þ}÷¥†Á©S×È„ e2Å0¬´´T"‘`ÖÖÖ6‚F³-ºùtäm–/Ÿ½oßy©TõOw‚!Ñéôääd+«‘L,=šmÐȧ£²eËÂ:þùÏdb¨0 {íµ×ÌÌÌ{WM÷Sq[訂±òé¨89M|ùåg÷î=/“Q÷24Žú:Ô´Å0,==ËåZYYmݺ5--ÃáX[[¿ÿþûšT/O…|>ßÛÛÛÂÂÂÉÉéÈ‘#†!„lmmÕ§Ô¶¶6Å’8Ž'$$8;;³Ùìðððööv ƒTj]³CÀÃÁèTT4ÚÛoÉͽIv :!“âwÞK[r["” V!ÜÖÖ–••…Z¼x±|¹¦¦FÍV|>ŸXhmmÅq|êÔ©±±±ÙÙÙ4­©©Iþ–šJˆò…¸ººWWW‡……iäÀÖGr¼€qƒ|ª¯¿ž¸`Án™lÐŒc $Bé¹ÍÕÇ_,{xí±šb¡‚‚Ç¥R©Ò2‘1ÛJ)Ÿ²Ùì}ûöï ‰D2‚|:sæÌÔÔTâ݆†:ÞÓÓ£I[êð  Î÷µà½÷‚~ûíá¿ÿ}‡ì@´IÜ+Í{·¦åVÏËß»Mù‹¥ú–––!¦´<,‡JHHpttŒŽŽ.//§ÓGòÌU]]ݪU«0 Ã0ÌÞÞ^*•Ö××k¤VZFò©¸»ÛÏŸ?cß¾ód¢5ý’®¯êªï_rxÚħ,ôÓè¢E‹îÝ»—™™9eÊ”€€€††‘LXÅápNŸ>Mtd2™@ ˜6mšÞZFò©v¶>»u IDATlÞtýú½K—*ÉD zZÄ?¿U)z,]š8åÌÔ[»qqq<oΜ98Ž3™L„@ Ðps¢äêÕ«ãããKKK«««×®];o޼ѴÀ°@>ÕŽÙ³_xaÚ×_ÿÙhAçÝ~Œ†½ü7Ë)¦úl÷È‘#.\pvvŽMNN¶±±ñóó{æ™g:::†ÜV^rëÖ­ÁÁÁË—/î¹çÕ²_ú¿ÿûíæÍd¢©®zøaA´ò©–-X0ë™g4Œ.jÕ?;2C˛ʺÉ*€|ª}ï¾ûÒ?ÿyó÷ßÉd7“š ?»;w‹ýd!hò©ö½üò3Ó§O>pàÙ¨óËþÁ‡þŸ:¹¯œDv,PäSíÃ0ìÝw_:{¶¬¶¶•ìXTÀeèÒ®û·RZæítr f“ÔùT'–-{ÎÑÑf vQeü?ŸÜ­ú©cáÞ©SN ;(ò©NÐé´sr®Ý¿ßNv,ÿE"”õ´ˆîsqðOv,P Œç×±Xúâ‹»¦'$„“ @ ª+&&ôwÞ™ŸžþKcc'Ù±ôò©­\éiccùÝwdÐȧ:djÊxûíyÉÉWš›»ÈŽ sOu+*ʇŲ8|¸”Ö7ŽRRšÀA>Õ-33Æ[où?~©½]ßÏtvTõ}½’ð¡žÛÀhA>Õ¹èèÌÍM‹ôÙhÃÕÇgߨ˜àjî¹Ñ^Ÿí`Ì Ÿêœ……iLÌ‹‰‰=êÕO‹w :ó7Ws½­ƒ¾va˜ÃG €žÀ›>ÄÄøÑh´£G/é¡­ÊŸÛÿ[粈ýR‚3ÝÓC‹äS}°²b¾ñÆ ‡vwëv²ÑÛé-…ŸÝ›¹ÂÖ›#Fƒd €^A>Õ“·Þò—H¤II—uÚŠð‘ôéU“¼ßã"È¥èí€| Úù´Ã¸òiWW×|ààà`ffæààÓÐÐ@¼…aXi騞YR¢õ 5¡f)‰ÜtôM` ÌÍͽ½½ÕW¨a‹‰ð¶¶¶ÑÄF4§T‰¶j¦*#ʧ2™ìþç®^½š••U__ÿóÏ?3™L¡P·sæë åwP 5ö·  @ ‚ÊÊJW^yE"‘Œ²N:žœœlee¥•õS3Eý@„……iòLNbbâäÉ“»»»W ‰D‚ã8BˆÏçk1*­W8X+­­­Ä²úÔ ? õˆç£†,Fú:ú&”jhooGUVVjƒÒ»ò/ƒVè¢Bj?eDýÓÔÔÔ 6Œ7Nq%‹Å¢Óéò—‰$>>ÞÁÁaâĉ‘‘‘Ä÷!„aXzz:—˵²²ÚºukZZ‡Ã±¶¶~ÿý÷åRRR*++ d³Ùæææîîî'OžD½üòË{÷î% ”””Lœ8±¯¯o°äçYÄ2ñ´‰­­-±^ýbVXXÈãñ~øá ë'rrrœY,VDD„¼ðX@ú*Ççó½½½-,,œœœŽ9‚ãxBB‚³³3›Í—7ªTl`=Dä c°*¿HJ_âT³û?ýô—Ëe³ÙT^VVÖäÉ“mllöïß/ßvì7HCvB× ûD&L8{öì`ï"„ø|þ®]»\\\JJJ***æÏŸ"788¸­­-++ !´xñbùrMM ŽãÉÉɵµµŠ h@Wbúôéëׯ¯««kjj:r䈙™™P(<~ü¸··7Qà¯ýëºuëÔÄ ï,È—W¹ƒ>>>EEEÛ¶mVý3fÌ()))//÷õõ]¶l™úƒ¬Ïþ)é¨|ÍÔ©Sccc³³³i4Z||¼««kqqquuupp°ü€(kjjR¬³««ëÃ?œ;w.ŽãPYQ^å Wõ ªÙý   æææììlƒÑßß?XxË—/ïèèÈÈÈñw7‚þ©åSƒqùòeùKùÿ(òMuss;qâQàöíÛ¡Gïà8.•J•–;ÿøVgg§üÔ»¢¢‚ø^vvv2™Ìúúz©TÊáp ÕÄ >Ÿ¹ƒ™™™8Ž·þãÇ+ËÊÊä…£Ï|Jú*_Ãf³÷íÛG¬Ó§OOMM%^644ÐéôžžžÅ^'¥Óé………8ŽÏœ9Se D‹*¿H¸ªOPÍîŸ:uJ¾ËÄV*û~ýºR±7p#ȧFt¾Ïáp*++å/ÁÀ{ß>ÞÏÏÃá¬]»–X9~üøÀÀÀììì‹/2Œ_|QM £ÜA§~U’ž>}ºæÁèé(zr–}èС„„GGÇèèèòòòû÷ï¯ZµŠ¸kooo/•J‰F•Šg÷òûQÍÍÍŸþù+¯¼ÒÝÝ]WW§²‚Ê/’JjvßÞÞ^i—U†GÌ­7Ø‘³ß ²Q>]ºté¡C‡ˆÿiB,ëÚµkJe¸\nmm-±L,p8màççW[[»{÷î»wïæççË×GDDdeeedd¬\¹Ã051à8ŽÿÖ¹ƒÄ_Åp믩©!ªªªVÈ(éùutt¬««“¿$ކ³³3BhÑ¢E÷îÝËÌÌœ2eJ@@Žã§OŸ&:,2™L L›6m`1"û[ZZ²X,‹5iÒ¤÷ß¿½½½ªªŠÃᨬ0Øi 5»?pª'•᩟jÌ~7ÈbDùô“O>ill .--mllÌÉÉùüóϕʬY³fÇŽ|>¿²²rãÆÁÁÁ,K“ÊSRRˆ?6ùB¨»»»ó ©T*‹===ÝÜÜîܹ³zõj„PGGBhÙ²e¥¥¥ééé‘‘‘jb`±XgΜéêêúâ‹/›šïàêß¹s'ŸÏ¿sçΆ 4? z çôõ×_ߺuëùó盚šJJJV¯^ýÊ+¯°Ùl„‡‡G\\Ç›3gŽãk×®/--­®®^»ví¼yóˆ:•Š1™L¥F™L&†a«W¯VYa°/Rø2Œ`÷‡ o 1ûÝ ´Lókv÷ïߌŒœ0a‚……Epp0ñ?¶âå6‘HkooÏf³W®\©x5J~íLå2B(99YiAŸÏ?{ö¬“““™™™OnnnPPÐŒ3ˆz–.]:kÖ,by°’’’ìììlllˆÛÍÄz???&“ÙÞÞ®á·~„Ю]»\]]­­­CCC[ZZ´õY¨¡áõS\¿¨D"Ù³gÏŒ3ÌÍÍ?øàƒ®®.b« .¸»»3™L—´´4‘HÇår---ƒ‚‚ˆ\‹áª®ÉÚÚÚúûû777«¬AýIñË@|‚î>±^exj.Ù÷»ÁõS*üÞ 1‡±AÏ'âééùÑG‘ˆ2 Ãø|þœ9s4,¯•ÏâäÉ“+V¬ À7“Ú†ûÝ 6ÉÈȈˆˆÐ]Tä2¢óý±©··÷êÕ«çÏŸ_µjÙ±F…"¿wb¸òòò¢££·mÛæèèHv,*@' ¾A>%Yhhhhh(ÙQ´Î÷@; Ÿ€v@>í€| €þÔÖ¶’Ð!ŠÜ*))!F>'‘ˆ^_o5nœhüx“9ÚÙˆG£¤¤ÄËËK+UQï½{w<†aŽŽdt… ùÔÛÛ›ìHfj*7N\]ÍF1²ñã…ÖÖB++‘¥¥Ãô:¨ÅËËkô‡ƒƒCXX˜Vâ;îݳnh°ru ]”ºÂÂÂÈŽB‡¨ð| |ðÁÉ,Fa¢ÑhR©ÌÌŒááÁóõu{þyçÙ³,-ÍÈŽÑI¥²¸¸¬ÔÔb„ЩSçÎJvD@W ŸR‡X,}啃7nÕ­®®þ¨¨~ýõ>ñ?œ•³¢bÙA‚ûû”Âá°ŽVÓï %t:mÏžH¦ºÖÜü(8xŸ<™"„¦NDnH@× ŸRÍ /¸}úiÈ`)•FÃ>ø`Ñ´i“õ”ѹ{·-8øë»wÛåÉ”Á ?õÔr£ºù”‚Þ|Ó/4tƒ¡üáÒ阫«Ý† /‘•ñ¸sçá’%_77w)^Ȧѫ+ôO)ò)5}õU„››RJÅqäâ2éÞ½6²¢2¥¥uË–xô¨Ÿ¸%'É\\ ŸRäSjb2MŽÓÜÜT~ŸÁ ……=ï^[`àîýûÿO,–ª¯Œ@AÁïáá‡úúDJC,BáÐ?¥<¸¿Oe/VDF~/“á†Mž<¾¨h+“iòã%Û·Ÿ™8ÑꫯÂ_xaÚе͜?{íÚb±TåߎÕÖî61¡ë?0 7Ð?¥2?¿éï¼óÿíÝ{@LyÃðßt¿ŒŒ.2±.­v=ëáÝ,‘-¹$-](²d½ÅJ[R„\òDíÖŠ¥‹R–tY—Ý×ÃFŠÝÊ¥«Ô´skÞ?ާ­iTN¹|?ÎLg¾çàë7sæüÎd –D" ›m` £¡Áš?ß:7wݰa}ÝÝ#}}×Ô40SE Úwúô÷ !::2.;ìÛ—ƒ2UyŸª8±¸ÉÝ=’ÍÖ‰‰YÚâ¡´´;ë×'ih°¶l™=sæ(F⩞G^ìØqîܹ_µ´XBáëPY,–UllË?P1èSÕW]Ý Šz÷îÙú¡ººÆ°°´ãÇoØÙYmßîbn®ö÷û¥ÉªU'rs>{V«©©!7éèh}þùÄõë™Î] ï÷UŸ±±¡Ì2%„éïÚå–”´²¸¸bòäGæ´ua´_YYMjê¿}}íbb– hª©©!‰ 2e:t9ŒOBþüSqù›o2Fê¿{·»¥eo¦)±/¿ü1/¯8;;P[[S,nJJº~þСcÆ d:t-ô)ü×ýûå~~§þóŸ²eË&ùûO•y^ä+,|fg~à€§³ó‡Ò•ˆ´qž T úþF$jЉùyçÎsÆááî£G+â]¬ÙâÅÑååµéék0}—Âç§ð7ZZK—Ú\¾ìß§OO'§ý_}__Ïg:”Ò(((¹pán`à ”©zÂøÚ”–v'((IKKsÛ¶9Ó¦d:ŽøôÓÚÚšññ_0˜ñ)´iæÌQ?ÿ¼ÎÞÞjÉ’ï–/­¬¬g:‘B»|ùÞÍ›%ëÖáKQê ãSx³+W~ Lxù²18x¦§çGx3ÛZS“ÄÞ>üwL££?c: 0ãSx3[Û÷²²,·n]âœ9½`:‘ÂII¹ýðáó  NÕúÚE__gýzÇôô5{ûÝ{ö¤c†*)@´sç¹9sþ…ùÔú:`øð~ii«ƒ‚¾2mÚÞ;w~g:‘B8~üzEÅ«€€éL†¡O¡cþúBÕW&&l'§ý!!É jý…ªúzþÞ½.ü¸OÙõ‚ú@ŸBg `rò¤÷ž=sOŸ¾õÉ'áÙÙ…L'bÌ‘#ÙB¡ÈÇÇŽé À<ô)t‹Åru“•0vìÀyó"—/­®V»©T++ëÊ\¾ÜÖØØé,À<ô)¼3³ß|ãùß߾ýdÒ¤ ùL'êVfê,_>‰é  Ч@;;«œœ@w÷ÿY³æä‚Q¥¥5L'êOžT}ÿýÏ«VÙè0úèA}¡*%ŧ´´fâÄ—Åâ¦7ÿš2Û·ïb¿~½æÏÇtP¸> h&Š£¢²ÂÃÓ‡í³{·ûÈ‘\¦u j^¾ýû=fÏÍtPèSèW~õU|^^ñ²e“Ö®ª««jS.^]VV“žî§¡«oá5ô)t‰D’˜X°qc ‡c°k—Ûøñ–L'¢M~~ɬYßüðÃçvvVLg‚>…®õâÅ«ÓgÏþ2gÎèÍ›?åp ˜NDgçÚÚ +™Š磠kýã=¾ývaLÌ’k׊&MÚqöì/L'z[—/ßËÏ/ šÉtP8ŸB7©«û3<üü÷ßç~ò‰ÕŽ.}û*彩©yù,,Lbb–0ƧÐMŒŒô¶lù49ÙçñãJ[[e½7urò­žbêãSènÒ/T}ð…rÝ›Z M˜°ÝÚzð¾}LgE„ñ)t7mmÍ•+?IO_ÓÔ$±³ ߺõ¬²L¥wýùóºµk§1ƧÀ‰Drüø-[Rûõë¥ø÷¦®¯ç[[‡Íž=zÓ&g¦³€‚ÂøÃb±æÏ·ÎÉ 4ÈlÖ,E¿7uTT–@ ZµÊžé  ¸0>…péÒ$¢˜÷¦®¬¬·¶óö¶õós`: (.ŒOA!ØÛÏÊ °··Zºô{¼7õ:ÞÞ“˜ } ŠÂÈH×.·Ó§ÿ÷þýò ¶ÇÅ]W7OOžTÅÄüìãcgh¨ËtPhx¿ ‡Ï<˜ñÍ7ÿú×;áá1›gõêyyÅ99ë´µ5™M ãSP8ººZ~~SÓÓ×üù§ÐÎ.<"â²HÄØTª÷î•'&¬Yã€2…7ÂøWS“äĉ›60Àd÷n÷Q£úw†E‹¢KK«/^\‹yùà0>Å¥¡Áš?ß:3ó«Þ½¨{Sóx‚î Ÿ_rñâÝ€€é(ShŒOA9¤¥Ý Jb³uwîtµ±Ú=/êì|@S“•”ô¿Ýór ì0>å0s樟^7a»óæ}Û=÷¦Îȸwófq@¦>öÂø”ÌõëüýO½zõgpðLW×1]ô*Ô¼|\®qlìÒ.z P=Ÿ‚’±¶œ‘áïæ6–º7uYY—Ü›:9ùVaá³ÀÀ]±qPUŸÂk¥¥¥×®]c:E<~üêäÉâ—/îîƒF2¡qËb±dûö;† ¾Kãf››ÓT ú^‹wwwg:EǰXš††c‚2àz·¬§7D(¬‹_Ò»Y…‚û´Sµ»øÂ[¿1u Œÿw*|~ @ô)=Чô@ŸÐ} @ô)=ЧÐauuuk×®µ°°ÐÕÕµ°°X²dIYYõ‹Å*(( ñµhß "¼"«‡ãèèXRRBãÆ»ùˆú:¦©©iúôéyyy‰‰‰¥¥¥gÏžÕÓÓ7nŸ¯¸·&U@W®\©©©©©©ÉËËÓÐИ3gÓ‰€ø>?tLLLÌ£GŠŠŠ !fff[·nÕÒRâ¿K,«¢¢ÂÔÔ´ëß›Íæp8„‡óí·ßš››—––r¹ÜNGE€ñ)tÌñãÇW®\I•©‡ÃÑÔüïí@D"Qpp°………©©©‡‡GUUµžÅb…Ž yúô©££cAAÁÓ§OOŸ>½iÓ¦ÏY¸pá–-[òóó?í"˜Ÿ^£æVê¿ÎÎÎcÇŽ b:ˆ¢S?kÅ„÷û  x<^^^ÞÅ‹===™ÎòZzz:K–àà`¦£AWQâkZ¤ÎŸ?¿hÑ¢ 6 0€é,¯M:@uƒ>U0gÎ\ŒÃû}z Oè> úÔÝO?ýÂtP8ãêêÊt„nÕРSXhó”é Ýêm¦290>…×,,,\\\˜NÑÝ**ô5t˜Ò­¸\®þYw\êK"‘|øaèóçu+V؆„81”Ƨ ¾nÜ(~þ¼ŽrêÔM±¸‰é8 ôЧ ¾’“okkkBª«yׯ?b:(=ô)¨)¡Pœ’r[(B´µ5’“[Îâ ÐQèSPSÙÙ… RËB¡85õ@Äl$PvèSPS§Oßj~OVåÊo æ€>uÔÐÀ?þW‘H,]£©©‘”„·üðVЧ Ž22îQŸœJ‰Dâ‹ï64ð™Š*} ê(1±€ÅbµX)‰ÓÓÿ‘< Ч vjj²²~“õ…SVRR@U OAíœ;÷«ÌõMMM¹¹««º9¨ ô)¨¤¤[b±ìˬÅbI[m ðFèSP/ÏŸ×åç—ÒÖ´’””ÛÝTæCµ–šzÇÛ;¶¼ük¦ƒ€*Àø€èSz Oè> ú€èSz Oè> ú€èSz Oè> ú€èSz Oè> ú€èSz Oè> ú€èSz Oè> ú€èSz Oè> ú€èSz Oè> ú€èSz Oè> ú€ZL€îÏtòïW“¿³°°°¶¶f:…RbI$¦3@·b±XLGP ÚÚ¦|þïLQ ... L§PJŸª£7Nš4‰é ˆBCC™Ž Äðù)=Чô@ŸÐ} @ô)=Чô@Ÿ‚l<ïðáÃnnnööönnn»víª¬¬¤²µµ-,,¤ñµhß ‚¼â“'O§N:{öì={öðx¼®‹dkkûòåËNÿ:Ð} 2H$’€€€û÷ïoŒ™’Ò@IDATÚ´)!!aûöí:::+W® …LGS¯^½Z½zõ!CâââvîÜYTT´ÿ~¦CA×BŸ‚ éééååå»ví6l‡Ã|káðáÃúúúÔpøý÷ß … ãÇß»woee¥‰‰IVVÖ† ÂÃÃÛÊÐ gΜY¼x±••!ÄÏÏÏÍÍÏçëêê¾qdn­­™†dîšôhËÉàääÄápÆ/‹y<^FFÆ¢E‹FŽIíû’%KäoÜÕÕ•z2tô)È`bbòÇ >œú1--Ï绸¸4΋/ÌÍÍ©ej¡¢¢bÀ€„}}}ò×DVÍ—Û¯¾¾þĉwïÞ-++ãr¹ÔJCCÃÑ£Gçää 4HSSsäÈ‘r2t³gϤk***¨WïÄõéÓçÙ³g-vÊÀÀ@段'ƒ©©ió×­ªª’þºtAÎÆ{÷îÝ®£o} 2|üñÇgΜ™2e 5Òa³Ù¿þúk‹ç˜™™•——SoØ©·½&&&tðõõµ²²òöö¶´´”H$S¦L¡ÖOš4é§Ÿ~zòäÉäÉ“Y,–œ Ôð°¢¢¢ý/jbbòÅ_|üñÇÔ¯744HãðÑG¥§§O›6úññãÇŸ}öYjjj[»öÆ -ÜÌ̬´´”r–••Q+åló4v|~ 2xyyUUU­[·®°°°ªª*77766¶ÅsŽ;öÛo¿•––îß¿ßÚÚºíséÒ%ªû¤ „ÆÆÆú¿455‰ÅâaÆq¹Ü'OžlÛ¶òêÕ+BÈøñã 333íììäd`³ÙW¯^åñxqqqÍ_šÚHkÔz‡èèè²²²={ö|ùå—9f-Í›7¯¸¸822òÅ‹%%%_ýõøñãÙlv[»Fi†)S¦ÄÆÆÞ½{·´´TzfLþÆ¡«a| 2p8œƒFEEùûû ‚?ü044ÔÃãùsæÍ›×ØØÂçóÇŒãëëÛÎoÛ¶-((¨oß¾ÒBHó∌Œ\³fÍŽ=úî»ï.X° ¡¡aýúõ±±±£G.//§N—µ•ÁÇÇ'222**ÊÇÇ'55•Zùþûï/Y²$11±GÍóH×{xxðùüúúú#FlÞ¼¹³ÇB8ξ}û>ìååe``ðÑG­X±‚ÒÖ®Q¿Õþ õõõ6lH$+V¬(((xãÆ¡«a~~µÃb±”z>éàààaÆyzz2D5…††š™™a~þÎÁø”ŸÏ/...((ðñña:Ëk7oÞ h½~þüùÔ wP+èSPyyy;vìðòòRœSÕcÇŽ¥¾Á @Ч Dllllll˜NÐ&œß ú€x¿ªFzu,!ÄÐÐpäÈ‘¾¾¾m]Ú‰GFF:”–­ŠAŸ‚ úú믇 B©©©‰ŒŒÜ¸qcTTÓ¡@õáý>¨ }}}6›Íf³-,,Ö¬YóðáÃv^xŠYîám`| *Žš[$‰Å☘˜ .H/¦222"„ØÚÚîÛ·oÛ¶m/^¼ „8;;§¤¤TTT>|øáÇ|>ßÜÜ|áÂ…Ê{tŒOA•ÕÖÖFDDp¹Ü>}úÈ™°•š4==ü5ªüYJdÂøT··7µÀb±† Êb±äLØÚznPù³”È„>$=¥£££££C­”3Yjë ®äÏR úTu>ªÅJ9“¥¶žTþ,¥2¡OA]P“¥öïߟÍfË™°õÕ«W={öl>‘(5‰*µ¾ÛSƒ2AŸ‚ºhÏ„­Ò¹P1‘(tæ?U;Ê>ÿ)t)Ìú6ð})z Oè> ú€èSz Oè> ¾Ï¯Ž²²²˜NŠèÞ½{'Nd:…²BŸª¦#€âš8q¢µµ5Ó)”® >? ú€èSz Oè> Çÿ¤Y¶³ûBíIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Field__coll__graph.png0000644000175000017500000003677512234777145030107 0ustar00murraycmurrayc00000000000000‰PNG  IHDRè@ø}xØbKGDÿÿÿ ½§“ IDATxœíÝy@gÞðgc8”p#j±u­k[×µTѪÒz¼îZ­ÕêÚ Úh½¨lµj]kѪh/lk«­RµÒ‚Vë —‚÷™dÞ?¦1@¸B&ïç¯'“gžç7ÉÃ/Of&MÓ ‡í }¸ 7€Aâ00HÜƈí ã(Šb;=Ïvº€Ä `Ø/^ìããÃvìÛ²e Û!è7€aóññ e; öõ¹6k܉ÀÀ q$nƒÄ ``¸º¿ŠŠŠ>ø@$™˜˜ˆD¢9sæ0OQ•šš*“É(Š*..f¶0…®£Út7@7§P(&L˜ð믿;v,??ÿÌ™3¦¦¦¾¾¾õõõÊ:\.766ÖÊÊJ7!鸻îçqtsûöíËÊÊÊÌÌ´°° „ØÙÙíØ±#22ÒÈèéŸ?EQo½õVWôNQ”D"±µµUÛØEÝõ˜qts‡Z°`“µ•x<—ËUÝ¢ºvqüøqüäÉæÙƒª”õ•å””sss—˜˜æŠ|;;;å"LRR’““ÓÞ½{UWf…B!ŸÏŽŽ&„466.]ºÔÞÞÞÑÑ1&&ÆÔÔ455µk_#CƒÄ ÐÍýþûï/¼ðB»vÙ½{÷éÓ§/_¾\PP0kÖ,BHllìÈ‘#U Íš:uê¨Q£²³³7oÞüÎ;ïBTgÜ+V¬øú믧M›¦º×Ž;®_¿³dÉ’úúú7&&&ž={öܹs±±±2™¬GÜýa© ›«¬¬´±±Q>TÞ—J*•òx¼fwÙ´iÓóÏ?OÙ¹sçСC¥R©reCóGYYY¿~ýúõë7eÊ”’’’¦«ØK–,yùå—Õ6Λ7ÏÞÞ>((H&“UVVîÛ·oåÊ•C‡%„DGG3‘€*̸º9@‘‘¡|(•J•§”´ÄÃÃ) 0€RXXØÆ¾vîÜåììŸÿÚk¯yxx|õÕW­ÞuÑ¢EãÇ÷óóswwÿâ‹/!o¿ýö•+WT Û¶m‹ÅnnnªkÖ111çÏŸwuu µ±±ñóó{þùçKKKÛ°X,3fÌØ±c_ýõÿûß„ccãx7F1ÿì€!¢(*..®ßûÎ;ƒ–H$ªß¯6+$$„ô˜»rcÆ úå¹çž[¶lYeeeQQÑÊ•+ÇŒÓjÖîi¸@¿ÄÅÅ]»vM xxxTWWïÞ½›íˆôÎãýâííýã?²…^ÃŒÀÀ q$nƒÄ U‘_ßz%Ð|9 `Ø®^½ÊnŠjn홾o>b7Œüü|¡PÈn :ƒ p ˜>\ îoú¦ðÃe·*ÛqydWî!à`Æ `Àôaâuòí{’»5Wö¥yO·g;–žkÜÐqU… ’´BHæ·,O·{$nè¸ÌïJ¹\Š"I«)€¯(u‰:.ýt‰\NB¸ÆTÖ9Lºu‰:¨ô~mE^=¡ !DÞHß?Ä­#HÜÐAYg¥£§9¤¢ ¾$½†Åxz$nèšdœ)QÈÊ c*ólû~ì:‰:âñÕ5Ū[ôýoJiEK{€Ö q@Gd}_Ê1R¿ü§¶¤±èF+ñô(HÜÐn 9}ÿÛR…LýòŽ'ë,¾¢ìrHÜÐn~«l¨’7Ý®)2ÏJì_ÏÙ½!q@»e~'åp›¿MЬFžÿk…Žãéi¸ }ä ŠÜ‹eM×I4M²ÏáÜ’®…»@ûÔWÈ ~{:§.I¯¹w²dd¸H¹ÅØŒ#Ù›Ðz ÜÚÇÄšë6¶ÏÓÇ4©+}üÌèbX*00H܉ÀÀ q$nƒÄ ``p7tЬVQ[ÚhåhÂv =7€ÁR €Aâ00H܉ÀÀ qèEQÅÅÅm¬™ššÚt;7€Aâ€NÉ»R~dâ¶£èY¸ Sk•õʇE9rD(ZYY-_¾üðáÃÀÚÚzéÒ¥-µ P(¢¢¢ÜÝÝ-,,FŒqåÊeSÊ%e™¢¨¤¤$''§½{÷*Ë{ö쉊Šruuåóù!!!%%%ʽ…B!ŸÏŽŽn©¯×_}óæÍÌ.ÉÉɶ¶¶Í†š’’âããcnnîââÓìŽmyŽ?îââÂãñ‚ƒƒŸ}º2þÑõCéî¡×” !ÅÅÅÇŽ#„Œ?^YÎÊÊj¶…­[·ŠD¢¤¤¤‚‚±XlccÓØØÈ4%‘H”Í2eBˆ¯¯ï¥K—jjj”åO?ýÔÃÃãêÕ«™™™ÁÁÁʽ?~œ`ddTWW×l_ûöíóññavyÿý÷ßyç–ÖÍÍ-<<¼°°0!!Ãáü÷¿ÿmºc«¯!äÅ_¼yóæ­[·FŒ1~üø 6¸»»'''§§§3&((HJJJÓ0¸ Sš&î .Ð4-—ËÕÊÍæ š¦Ô …T*U(tˉ;>>^¹‘)4èСCÌÆ‚‚.—[]]ÍT8qâ„2‰DÒl_eee¦¦¦ùùùr¹\ $%%µt°|>Ë–-LY*•–””4ݱÕW@¹‘¦éëׯBlmm÷ïßÏl¹}û6!¤¼¼œn9qc©´ÌÒÒ’ÂápÔÊ-ÉÍÍõòòbÊEñx<Šjþ'äNNNj圜œ°°0Š¢(Šrtt”ËåùùùLGGGÕší«wïÞcÇŽMHHøù矌Œ^yå•–ºÞ¹sgTT”³³ó¬Y³îÞ½Ëçó›Ý±ÕWÀÃÃ) 0€R\\ìîîÎla Êø›…Ä ,999ʇeeeÌü”ÂÌ:Õ²˜jdÊàäÉ“ªóèþýû3Ô>Zê+44ôرcqqqS§NÕð±1nܸÄÇÇ;88Œ=º   ;ªÉÌÌd éééEõíÛ7;;›Ù†ݑ¸€e³gÏ^½zõåË—‹ŠŠ6mÚ$ kkk !<ïÔ©S‘‘‘š[˜1c†X,NMMÍÌÌœ;w®¿¿{ûš4iRjjê‘#G¦OŸ®¡£!C†DDD899 6Œ¦iSSÓ6î¨&""âÖ­[·oßž?~HHÈ{ï½·nݺ”””ŒŒŒ… òx< »ãWÞ€eË–-«¯¯ +..ööö>sæ ³¼°mÛ¶?ü0""âóÏ?ßµk—†–/_^[[;yòä²²²‘#G&$$´·/kkëW_}5++ë…^ÐÐQLLÌâÅ‹wíÚåèèkccCiËŽj-Z4~üøššš &DGG[XXTUUMž<¹¶¶öµ×^Û¾}»æÝq[Wè”ns?î   áǯX±Bg;v–J SŒÌ8mÌÚgÏž¥š#‹»:HÍjjj~ýõ×~ø!,,¬]qªí¨3X*7nœ~þ‹ÿÝwßÍš5kÕªUÎÎΤ=qªí¨3X*00X*00H܉ÀÀ q$nèÜ[÷¸ SÔîÇ :€Ä ``¸ 7€Aâ00H܉ÀÀà&SÐ)Ýæ~܉ÀÀ`©ÀÀ q$nƒÄ ``¸ 7€Aâ€NÁý¸u‰:÷ãÖ=$nƒÄ ``pɻք„„°t Ÿÿüç?iáêÕ«›7oÖV<úƾ¦¿·äõŸœ·°HŠg;„g`Æ­5ÇŽËÏÏg; вäää«W¯v²‘¼¼¼cÇŽi%=ôÄ<£gíüü|=|ïŒØ [Y²dIhh(ÛQ€6iñ)}›µA[=zôÍ7ßd; u˜q$nƒÄ ``¸ 7€AâÖµŠŠŠ>ø@$™˜˜ˆD¢9sæ0OQ•ššªÅ¾š6Øù.(fff>>>šlc2™Œ¢¨âââÎÄÆt§Öˆ¶ZÖ ·ÞzKm‹v»PÕêA5ÑuÁ:$nR(&Løõ×_™“¾Ïœ9cjjêëë[_oH·z¸pá‚T*•J¥C† ™2eŠL&ëd›\.766ÖÊÊJ+ê¦e­Óýð8|øðo¿ýÖE«iË¡ZŒ¿ýíoº‰Íà qëÔ¾}û²²²Îž=ûÒK/ÙÙÙ½ð ;vì¸y󦑑!PoiiÉãñx<žH$ŠŒŒÌËËËÉÉéXSÊ)3û31Ñþ/…w]ËZ§ûá²xñâ.j\M[ÞåÐbp¹Ü.ÇPþk ‰[§:´`Á ÕjT&“‰Åb‘Hdkk;}úô’’f;EQGŽ …VVVË—/?|ø°@ °¶¶^ºt©²ÂÁƒU ¤¤¤øøø˜››»¸¸ÄÄÄÐ4åêêÊçóCBB”ªUkÚ¹‘‘QK-0nܸ1vìX>Ÿoffæíí}ôèQ&NBˆ2wk8üÄÄD¡PÈçó£££5„wìØ±~ýúÙØØ|þùçÊ}•]?~ÜÕÕ•Çã…††ªÉ:ÝE‹=yòäÈ‘#j‘¨&5ÕWOC- Š¢’’’œœœöîÝË4¥P(¢¢¢ÜÝÝ-,,FŒqåÊe¿UUUe‘ËåšWµY µeì´„§¹NŸ>}NŸ>­¡…””” 6¸»»'''§§§3&((Hùl```qq1sîøñã•嬬,š¦ccc³³³U LƒM» iÚÍÍ-<<¼°°0!!ÃáˆÅb«W¯fff3õÕª©¶YQQ±lÙ²—^z‰¦éíÛ·7ÛSßËËkÞ¼y999EEE111&&&õõõ̳‰DYS"‘h8ü€€€Ç'$$ÕÕÕµÞäÉ“KKKãââ”Õ”½B œœ|÷îÝ‘#GNš4©Õ·588Xy,×–¿5V†GBB‚³³smm-­2<š¾/­v¡aøúú^ºt©¦¦†ijëÖ­"‘())©  @,ÛØØ466ÒMnšÄD¢áxU›ÕX[Æ^çß;Ó»€ W[·‘‘Ñ•+WTwaH¥Rú¯?OOÏýû÷3nß¾M)//gž½páMÓÌLDµ¬–UÛo)qóùü-[¶0¥R©——סC‡˜‡\.·ºººiµ¦kÙ\.7))‰¦éAƒ5ÛÓcYY™L&cžMOOWÍj BÃáŸ8qByÈÌ^͆wýúuµjª…}ûö1õoܸ¡l\]&n¶†‡ŸŸßúõëé6$n ]hñññªM 8ù'¦i…B!•J ÝÜp¥iZÃñª6«!°¶Œ= ô3qc©D§AFF†ò¡T*Už3 ”——çîîΔ™‚òÞU–––„‡£VnæŸÄ;wFEE9;;Ïš5ëîÝ»> c¾Êwtt”ËåL§jÕ˜ÿÙ•ß =~üxÍš5S¦L©ªªÊÉÉi¶FYY™X,öóósçÎÕž†ÃwttT;äfà …^eã^^^ªë¶†Ç–-[>ýôSæÿÍ4t¡a899©6’››Ë¼ø„Š¢x<3&›¥áxU›ÕXÛÇžAâÖ©‰'îܹ“™ Bx<Þµk×Ôê…Âììl¦ÌAǺsvvVýÚðþýû„WWWBȸqãØ4 µÏ@ :,•ËÙÍÒp¼müXjûØ3 HÜ:µråÊÂÂÂÀÀÀÔÔÔÂÂÂãǯY³F­ÎÌ™3×­[—’’’‘‘±páÂÀÀ@×–Æ<Èü=( ³gÏ^¾|ù?üPTT”œœö ‰Îgº-Ò†5nš¦>|8}úô>}ú˜››2“ÕĔ††ððpGGG>Ÿ?uêTÕ¥Få `³eBHll¬jA&“mÚ´iÀ€fff®®®|ðAEE³×ùóç½½½MMMÝÝÝ>ÜÐÐ! ---˜¯³šV£›[ˆ´³³5jÔãÇ›m©úôi__ßo¿ý6 `À€4Mûùù™šš–””Э9¶ñð™í͆×ì⬲°aÃkkëþóŸOž|øpfIºi<Œ/Ýž±§~®qãp´†¢¨¸¸8Ü[ŸQ•’’2lذ¶ïÂÜ»“·Òfî錿5C¤Ÿï–J Œ!]°ÐIú6oè̸ 7€Aâ00H܉ÀÀ qƒÖ|úéw¥¥ÕlGU–[W‘gH¿ìÑá­Ñ|‹ŒžÀÚÚÏÄĹ´ô”\^Áv,Ú¬• p´Oq4óx‘7öïü×(B­I›Ú¨@î~Jßò$·Ö07hïÉRS%fZXÍ;ÐÙÙ’íp´F$ùøøt¦…üüü_~ùE[ñh—ü±Iã=ËÆ»–Š cB¡h‹iŒD-Þ<¤gÒ·+¢‘¸Ak22ŠFþ/!ÄØ˜ýÖo a;"hžBFçýR‘s^ú ©¼¡JÎ1¢2šÂáRƒBí|>² ´‰´F¡ =<Âëê)ŠÐ4ù¿ÿó[»6ˆÃéé+HúCÑHç]­È9/}p±¼¡úi¾fP\ÊÂÞ8äØ #S|õ¥ïpÉ;h ‡C àpãÆCf2°oߥÂBéŽo›š³ZO'Í®»{T’ýƒ´®\ÆáR 9MQÍÚ„ZN¿ò‘²¶AÀ›Ú4t¨s¯^Î ú‡îm“H*Ù L¬¹Y?HëÊe„&k«áQž6Bk‡Ä Ú4x°P&{úk&r¹üîÝÂqã6§§·þ³XÐuÌmÇ}îNq›_¶¢8”Io#ßeXÚ6HÜ MÏ?/T(ž™ÐÉdò'OÊ'LØ|þü]¶¢Bˆý`‹á‹¤¹ÔM+èQ;õ²àê<(è $nÐ&OÏ~½z©ÿýËåt]lÖ¬˜¯¾ºÄJTÀx>¬¯Ý sγï‡K¹ðE#{³t7h“‘ÇãoÓí4M+ôGŠú'2±BÑH_ù4Or§ÆØÒèi±×7‹$‰´lèPgcãfþé62âˆDü_tÁ%¦ºW‘Wr潬³¥¯mqü“R9Góå"ÓÞ8»ÌÀ qƒ–=ÿ¼Hm™ÛØØÈ¢תU“®\ùèÕWŸc+°+ç|Ù‰°{#Δ¯:ûõæ{šX*$¡8”ÈÇÚíÕ>lí†OZвÁƒ…r¹‚)q Z(ìsòäB;;+vë2ú×-·ãžx¿i?ü}·×ŸµA!v…׫ò.—¿"vf7Bè̸AË p02âPEQ”§gßÝ»g•'$\c;®ž¨ø^ͽÅ#ÃE> •Y›á·ÒÙ?ÒÕ¢/®2H¸ä´oÔ¨¨Ç+>ú(púô\.ç³ÏÎ~ñÅÅK—Vôí‹ë;t­¶´ÑŒìÜÝ qƒö={ËÇǽwosæa]]ã¨QQ¾¾[¶Lc70€î‰t!1ñƼyß:‹ª…Ä :²£²²þÛo—à~„/'AG"#ÿ™–ö(>>…í@º§Iåwâ$lG:‚Ä :Ò¿¿·ßöŒL¬¨¨c;–nE!§ÛVðÃÒ¬ªG lÇ:‚Ä ºóá‡ãhšlÝú=Ût• §g¥ß;Q°Õý¥%Žl‡:‚Ä ºÓ»·ù²eã÷ì¹”™ù„íXºƒ¼_*N¾}OÞHàô2îÕƒàËIÐ)…‚ Üjee7ŸíX ­ Sv<º¹ÿ±×$›‘á"µ‹k ÛÃû :ÅáPk×]¾|ÿûïo³‹£äÉÕ# ýÄÎÈÚ=fÜÀ‚÷Þ;xíZîÅ‹&&¸[NÑ B!c÷TxçbñÅÅU»v]`;†¬Ý“áÍôë×{Ñ¢±Û¶ÏÏ—² €áAâvÌ›çïàÐû“Oΰˆ lGz‰ØalÌýøãI'O^¿z5‹íXôZÎe oÞ­+“±H›Èd2ТЋ‹Ûµ×²eËÌÍÍKKK»(ªî‰Xóê«ÏýãW­:¡üáP%«W\\•{><Ûɯw/+Ãø v.—keÕ¾ÍØ¾}ûÅ‹ù|~EÕýà¬`SnnñèÑÿ]³&hæÌ‘lÇ¢_* êÏ/Ë©(¨½ÚÅyt7¿¸†¢(‰DbkkkÐ]èfÜÀ&ÛýËï¿ÿý¶´´šíXôHîOeǧßSÈé Ô²6EQGŽ …VVVË—/?|ø°@ °¶¶^ºt©†)ŠJLL …|>?::Z¹Q¹¦¡,knŸ¦é¨¨(WWW>ŸRRR¢Ü=))ÉÉÉiïÞ½LS …"**ÊÝÝÝÂÂbĈW®\Ñ!ÄÎή¸¸X&“‰Åb‘Hdkk;}úô–Ú×á7ÆŽËçóÍÌ̼½½=ªÖEÞ}D°ª²²nÈW¬8Æv úâÖ¡Ç_»~~YvCµ¬é³„ÀÀÀâââcÇŽBƯ,geeµÔ&!$ àñãÇ FFFuuuÌF‰D¢¬À”5·¿}ûv«W¯fff+w÷õõ½téRMM ÓÔÖ­[E"QRRRAAX,¶±±illÔÓû† ÜÝÝ“““ÓÓÓÇŒÔlû"ôòòš7o^NNNQQQLLŒ‰‰I}}½ÚÁvHÜÀ¾¸¸ß„ÂÿܹSÀv z!ï—ò[_?néYBÈ… hš–Ëåjå”” {8qBYS™£›MÜÚ4hСC‡˜] ¸\nuu5³W||¼jSŒ‰‰a¶( ©TªP(4„Çôîéé¹ÿ~fãíÛ· !åååMÛ×aYY™Löç^zzz³Û `©Ø2lÈÑŠ 4¾q!Dècí=Í^CKKKB‡ÃQ+kæèèØÆšÚÏÉÉ c~ ÚÑÑQ.—ççç3O999©6’››ëååÅ”)ŠâñxÌz…fyyyîîîL™)4Û¾†ËÊÊÄb±ŸŸŸ@ ˜;wn«=($n`EQŸ|œšš“˜xƒíXº­fó&óI©LŽ­'Ožd&}Ì<ºÿþÌSj  ''Gù°¬¬Œ™k& ³³³™2SͶß??¿ììì7æææ~ÿ}·½07è…Áƒ…o¾ùÒš5§kjðk:ÂãñN:UQQÙÆ]f̘!‹SSS333çÎëïïßRÍÙ³g¯^½úòåËEEE›6m …µµµ­¶?sæÌuëÖ¥¤¤ddd,\¸000Çãµõx!„466>ÜÓÓ3--mÆŒ„åéáRi÷¹L‰ôÅòå¯WW×ïØñ#ÛèNeA‹WEnÛ¶M,»¹¹½üòËmÜeùòå“'OþÛßþ–———ÐRÍeË–………………¹»»ÇÇÇŸ9s†YÓÐ,<<|Ê”)“'Oöññ±··ÿꫯÚz0ùâ‹/¢££Á»ï¾;kÖ¬€€€I“&BüüüžþùnsÎã=²{wÒ† g’’"œœlØŽ¥Ëe•^Š|0â?“»ÉÉÅ 3˜qƒù¿ÿ{ÅÍÍnÍšSlÒµduŠ‹«r/¬ÌüV_¯IZûˆ:{ö,Õ±X¬­.:CÏÃ3,˜qƒ~¹|9#4ô‡½ãï?€íXºDE^ýùðìªÂ†Qk\œýºù%‘ÐE¸AïÌ™³73óÉùóÆ :Ú.û¼ôÒÚ‡½]LÇ~êjÙ¯ÛအâSsÒ¦IDATÂR è?žôðaÉW_]f;-+ø­ò§å9N~½¿ðDÖ†ÎÀŒôÑÆßÅÄüüóÏËûöµf;­¡ôƒ¤rÿößÐ7裺ºF?¿ ¯¼âõÙgo² €ÞÁR è#SSc±ø¸¸_ÿý!Û±è̸A隷o<}úý¶Üæ çÀŒôWdä?oÞÌ‹Oe;v«,¨—Ü­a; 趸Ayyõ{ûmßÈÈÄŠŠ:¶ci‡IåÇÃîÝøªˆí@ ÛBâ½¶lÙx¹\±mÛ9¶iE#})òá¹²¼§Ùý¯+Ûá@·…Ä z­woó?ÿå—IYYOØŽ¥•Nÿ_zö9髟¹¿øŽÅÁºª½ÚÅy4~%؇7žÿügœ‰‰ÑgŸ}¯ƒ¾r*;>í­ ƒ @Ö=Ä †ÇÒÒ$"âõýû¯¤¥=ê꾊ïÕ}¬'â’HÐ'X*ƒDÓôo|nff¿ k;R ÓÐ3’`(Šúä“^½š•˜x£k;ŸèŒJ0TÏ?/ ùûš5§jjØŽ@§žY*ÉÏÏÿå—_XŒ´N$ùøøt¦} ‘‘7þñÁk¯ ÙŽEk|}}…Âîs8Ð%hqqql‡ZLwŽž SS##ÛQhS\\\'ß2èöš¹Ž€Æ×•ÝEHHˆ¶šÂ¨Ð üž=´Ö¸ 7€Aâ00H܉ÀÀ q˜&Š>ø@$™˜˜ˆD¢9sæ0OQ•ššª½ Õ-vÑÉÖ(Š*..nW›Z‰ô»£B÷/©L&köÝèj¹¼B¡˜0aEQÇŽsss{ôèÑîÝ»}}}322LL´5©TÊúôésáÂ…!C†B¬¬¬´Þt†ŽG!D9º\.766Ct¯#‰{ß¾}YYY™™™„;;»;vDFFuÉÏ‚ðxO¯‹³´´T}¨EI$[[[m_gt<*ˆnƒêÛ¤,SõÖ[oé&UY*9tèЂ ˜¿O%Çår•e2™X,‰D¶¶¶Ó§O/))a¶SuäÈ¡Pheeµ|ùòÇ kkë¥K—*+Ÿoffæíí}ôèQe…ÄÄD¡PÈçó£££™)))>>>æææ...111ÊÖnܸѴæ26;;»âââf+0Ž?îââÂãñ‚ƒƒŸf̘   å³ÅÅÅÇŽ#„Œ?^YÎÊÊ¢i:666;;[µ Ö²êC__ßK—.999Í›7/''§¨¨(&&ÆÄĤ¾¾ž©ðøñã„„##£ºº:š¦ÝÜÜÂÃà 8NQQÓ¬——WKH$š¦5TxñÅoÞ¼yëÖ­#FŒ?^êöíÛ=<<®^½š™™¨¼mˆê(Û×PYó+¦App°¶îUÒj5 µa̼žÚg†JMMæ¾Z-•›¶ÈÈHOOÏk׮ݹsÇÏÏË媎^ /îU­êHâ622ºråÊÓ&þ"•Jé¿þD===÷ïßÏT¸}û6!¤¼¼œyöÂ… 4M3S$Õr«Ãºi⎧iº¬¬L&“1ÓÓÓUÿ–Nœ8¡lŸÙÈçó·lÙÂT–J¥2™ŒiVC#LACæ(hš¾~ý:!¤´´”isРA‡bž*((àr¹ÕÕÕt ‰[Cå¿bºLÜ:Í>¥¡}f¨´ÚW«Ã ¥rÓÁæééyàÀ¦ÚüÑ–÷‹F↶éÈR‰@ ÈÈÈPýËTž< ”——çîîΔ™B~~>óÐÒÒ’ÂápÔÊàääD)++‹Å~~~`îܹªÕÚß¹sgTT”³³ó¬Y³îÞ½«üG^C#­Vððð`  „2srr˜sår¹òEhJCe-¾b]GF…†ö™¡Òj_­ Ô[^^ž››Söôôlï±hБ¿ÿ‰'îܹ“™YBx<Þµk×Ôê…Âììl¦ÌA'âlóGâçç—½qãÆÜÜÜï¿æd›Þkmܸq<ˆwpp=z´2¹hh¤Õ ™™™L!==¢(‘HÄ<'Ožd>! …T*íß¿KÇÒ®ÊzHF…†öÛø1Ðê0Ð@m°988äää0嬬¬v5 YG÷Ê•+ SSS ?¾f͵:3gÎ\·n]JJJFFÆÂ… ÛxÀÁƒ™á®,´ª±±qøðážžžiii3fÌ -V4kÈ!NNNÆ £iÚÔÔ´ÕF˜ó5Tˆˆˆ¸uëÖíÛ·çÏŸ¢Ãùóç½½½MMMÝÝÝ>¬¬ÖR#~~~¦¦¦%%%z9t裣cŸ>}ÂÂÂÔ^„ˆˆ¡Phii ü.Q50eûm©ÜR¹%º\ã¦u;*š=ü·O·y¨•‰Ê·Ú`«««›?~Ÿ>}\]]™/?oÞ¼ÙêkH°Æ mðÌO—=zôÍ7ßTÝù!…øøøÎ4‚QÑywîܺêrd€ÎÛÛûÇd; èž0ã00H܉ÀÀ qÿ‰¦éŸNg; hECµœíØ×Ì—“ÌÉ¿=Ðï¿Û;:VÙÛ×°ˆÖ$''1B+M±;*Œ¦ýª9TzgÚ$•š>`1}ðLâ‰DÁÁÁl…Â:33ùýûüÆF®£c%Û±hLj#|||:Ù›£‚¦lêœ+†ØW{qç±Å½nŸµƒƒƒ•÷ºh …+â”6nünëÖ!óæ‹qg UäÕgœ)IK(©+käPD¡ \êÍÏYôíÅvhìÃyÜOyyõ£(J¡ ¿øâbvö“]»fš˜àõÑ©º2YúÉ’ôSÅåë9F”BFB4!2lžY€Äô”§g_…‚&„(м;mÚ®ýûÿeeeÊv\ÝŸBNç^(Ë8URð[MZA!LÖ&„P\ÊÊ¡—÷4{6CÐ'X*yª¾^æî¾ŒÉÝ„##nÿþ}ãâæÛØX²X7¦h¤oì/J‹/®)n¤8­h~4luwz¥·ŽcÐ[8ð)£~ýžf™Lž‘ñ80pkAAë7_†ŽáS òšâFBH³Y›cD‰|­‘µT!q?cÐ GÕ¯$e2yA4 à³´´GìÕÍX"tÛ‡cÔüWÁE^þȩ٧z,$îgxyõ36æªn‘Éååµ'nûí·l¶¢êæ(2z­s³¦¹›âP/ÌîgÙßI<‰ûör¹ú?ìr¹¢¶¶aêÔÿ]¾œÑì^ÐIF&?±·Åá>ÍÝEÌíŒ^˜Õ—ÅÀô÷3<=ûÊ劦Û º¾^öåÍ›yºªÛ“Ü©þ~q–™1Å%ù3wÓ4ñý@dd‚!  Ïèß¿_Óën¸\!døp·“'¾ð®jÓ²ŒÄ’Ós2ì[üóðÀ1‘®„¢ !#Jø’•˘öýÔ/@ó¸ŸaiibccY\üç%nnvë×Oyå•þìÆÖýÐ ’üYþí#O†Îuxq®¡ˆËÞ9ý~)¢ä¥ÿÙ@O!q«ëß¿oII%!„ËåZXôª©© ù;²¶Ö5TËZž[ðk…ß*g¯IOŒqØß@Ûo —˵²²Òq¿`p¸;(8xØÀ6|Ãv lª“ÊμsÿæÇºî·®ÎÍͭû·:«ídûíAY¦(ê­·Þ21Á½ HÜÄáP¯ÿðÃí+W2ÙŽ…Å÷jŽOO«)npz¹·ÚSE9rD(ZYY-_¾üðáÃÀÚÚzéÒ¥-µV__¿xñâ¾}ûÚÙÙmÛ¶ÙHÓtTT”««+ŸÏ )))a'„ØÙÙ߸qcìØ±|>ßÌÌÌÛÛûèѣʚ¦EåCåîÍF¢ZA&“‰Åb‘Hdkk;}út&¦NRR’““ÓÞ½{5l³ªv¡jOLL …|>?::šÒØØ¸téR{{{GGǘ˜SSÓ6®ü@7DC'„„ìœ0a³B¡`;]ËM*ûêåßÿ^[ÖØôYBH```qqñ±cÇ!ãÇW–³²²šmP,;99]ºt)==}Ô¨Q„‰D²}ûv«W¯fff+Û—H$4M{yyÍ›7/''§¨¨(&&ÆÄĤ¾¾^µ‚j™’’’¢öl³”6lØàîîžœœœžž>f̘   e__ßK—.ÕÔÔh>ØvE¨m@@ÀãÇŒŒŒêêê"##===¯]»vçÎ???.—Ëô@HÜrãÆC`É7ßÜd;ºñUїî_ü8WÞÐü'!äÂ… 4MËårµrK¹ÆÕÕuÏž=LùæÍ›Lþ4hСC‡˜\.·ººšVÉneee2™Œ©žž®šõ´’¸===÷ïßÏl¼}û6!¤¼¼œ©ß–ƒmW„jÑž8qBÙ”D"ñôôpà@ß¾}mll²³ÃÕÐåîܹ3xð`‰DbccÃv,À,•hǼyþÖÖf[·žc;}wöìYª9b±¸ÇFÒFÏ=÷ܲeË*++‹ŠŠV®\9fÌdí 3n­9xðêG%$%E¸¸Ø²‹È¿~^0dV?s;c¶cB¹}ûöûï¿ÿÛo¿Ñ4=räÈÿýï]}y'è-$n­‘ËcÇnôòrصkÛ±tVm©ìÜÒ¬òõŸ»Û¶`;x–J´†ËåDD¼ž˜xãÚµlÇÒ)Åi5ǧ§ÉêSDÖÐC˜qkYPÐv.—JHxí@:èÁÅòŸÄ9‚aVc>q56Çç:€>Â_¦–­Z5199û§ŸÒؤ#®}QøÃY^“l^Û솬  ·0ãÖ¾9söææÿðÃ\®!å>iVíñi÷^|×aȬ~lÇš qk_v¶Äßÿ¿7¾úw¶ciŸŠüzk!n  ï iJh(ÜÜì¦N})*꛺ºF¶cidmƒ€ÄÝ%>üp|UUÝW_]f;膸»„­­å¿ÿ=êóÏÏ••Õ° t7HÜ]åÝwǘ˜EGÿÈv Í¡IáµJ¶ƒ€Bâî*&‹¿ºgÏÏmºƒ¨ÎÈêçóÏ.̪~ÜÀv,ÐHÜ]è­·|‚>›6e;§*5œœ‘þävÍį¼,úöb;è$î.dlÌ ŸŸrçNÛ±BHáõª“oÝ32¡‚ö{Ùx™±tÎãîZ4MOœ¸Ç3‹Õþ/"¶Ëý3¥—"¸ŒáúØ™Û Ø À]‹¢¨> üñÇ´Ë—3X #óléÅÕ¹ƒBìü×¹ k:̸uáí·w—”TóÍb¶~$°¡Ržw¥Â}œö+t“/]X±â[·òo²@/+.²6@·Ä­ :ûä“3r¶cƒ‡Ä­#áá$’ʃ¯²<$néׯ÷ìÙ/oÞü}ee]W÷%oÀ÷Ý·î,Z4V¡ ¿øâb×uA+ȯŸ|óN­@î趸uÇÚÚlá±»v]xü¸¢+Úo¨”÷^潄â¿ýËâ°sú è·NÍ™óŠÕ–-ßk½åòu'gÜ+X÷Æžþ¢‘ÖZoô·Ns—.wèPòýûµØì£ÔÊS³2zYMÚçÅ÷ĵìÝ·®M™òâ A‚O?ýN[ f•ž]˜Õo¨Åë»<ÍmµÕ,è-$n]ãp¨åË_ÿæ››©©9Zi°¾Jæ=ÍîÕîø]v€—¼?rìØ1ÝôÕ§O`mí½ººLÝt×.qqq¡¡¡lG-2b;ý2hР]õö¢®:j‡5kÖ°´‰ûvvv£Gf; 6!qè?¬Š$nƒÄ ``¸ 7€Aâššÿýï¡¡¡¯¾újhhè§Ÿ~Z\\Ì<åïž®Å¾ü›HOO—Ëåþþþåååöj†æ]ÀPàtÀv£i:<<œ¢¨5kÖ888”””$&&.X°ààÁƒÆÆ]rÅù–-[<<<”ÍÍÍ)ŠZ±b…¹¹yWtz‰»ÝΞ=ûèÑ£C‡™ššBx<ÞâÅ‹ÿõ¯q¹Ü.êÑÌÌÌÒÒRm㫯¾ÚEÝ€žÃRI»;w.((ˆÉÚJ–––ÎÓS.—ïÙ³'44tÒ¤Iëׯ¯¨øóÜþþþ?ýôSHHÈ„ ¾üòËü188øõ×_ß¹s§²Â¹sçT „ÚÚÚª¿( eÍòòrš¦¿þúëiÓ¦Mœ8qõêÕÊŽÑÑÑ“'O :~üx×¼ kHÜí–™™éîN\\ÜO?ý´fÍš;v”––nܸQùÔùóç÷ìÙñõ×_Ÿ;wnïÞ½áááñññ………„+Vx{{«!K–,yã/÷ïßWíèäÉ“ß~ûíÊ•+wíÚÕÐаyófÕgccc/]º´víÚèèèŸþY+‡¬ÃRI»ÕÔÔôîÝ[ùÐßߟ)$&&*4¾ûî»™3g8²hÑ¢Ù³g×ÔÔ0KÒ¡¡¡ÖÖÖ¯¼ò !dêÔ©ÊrEE…ƒƒƒrDu%d×®]^^^ÍsêÔ©Ù³g4ˆ²téÒÐÐÐúúzæÙóçÏÏš5kðàÁLsæÌÑâëlÁŒ»Ýlllòòò”›ÞSðÉ“'€)3‰DÂ<433#„P¥V¢¢õë×3g›+ eG„’’¡PÈ”•0t˜q·ÛÈ‘#O:õÚk¯1‹Ú–––üñ‡Z;;»G1k̈MWcccóî»ïŽ9’BÓtuuµêטvvvùùùÌŒ»   +ÝÃŒ»Ýf̘QRR²|ùòôôô’’’K—.íß¿_­N@@@llì½{÷òóó?ÿüsŸ¦§…4ëܹsL¢W4 سgOzzzAAÁgŸ}¶dÉÕg_{íµýû÷ß¾};??_ùý':̸ÛÇãEGGïÞ½ûÃ?lhh:tèêÕ«§OŸ®ZgÚ´iµµµ+W®¬¯¯ÿûßÿ¾hÑ¢66þÉ'Ÿ¬X±ÂÁÁAYÐ\úôéõõõ+W®¬ªªòöö^»v­Ú³UUU«V­¢izþüù©©©í:RÐOøœ§BBB$ÉêÕ«Ù„Mþþþø=‡¥ƒÄ ``¸ 7€Aâ00H܉ÀÀàœgH$’‹/²€&HÜϸ{÷îš5kØŽ@\9 ``°Æ ``¸ 7€Aâ00HÜæÿÒ,¹f•IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__FieldSummary__coll__graph.png0000644000175000017500000006123312234777146033764 0ustar00murraycmurrayc00000000000000‰PNG  IHDRຟ‰öbKGDÿÿÿ ½§“ IDATxœìÝy@gÚðw’`ÂÂ!„„ûR©ÚÖµ‚J+µE+Þ ,µíWZ«]]Ô6vu•ÕV{ŠçR«"U¼°=–R° µJÂ!—B8ä÷•c¾?ÆÆB¸2 y~½™Ì¼óÌ‘y23#á8Ž=ÕÐ  ùò„  0¨/ èA„……%%%Q0j•Ö­[@uÔûòË/©È€R‹-¢: êÁ™ÐpÿB @òäA>ú¯©©iÆ |>ŸÉdòùüwÞyG,_a–-“É0 «­­%†…¡£<;†È@¯)Š×^{íÖ­[ÉÉÉååå/^d±Xä8t:=>>ÞÒÒR7!éxvè <ôÚÑ£G‹ŠŠ ÍÍÍBöööûö틉‰a0þÚu1 [ºtéPÌðšš;;;•C4;¨ç@¯%$$¬^½šH$6›M§Ó•‡(_À9s挛››Í {üø1ñí‰'T äød9+++ ÀÌÌÌÍÍ-..ŽèNÃÞÞž¼•žžîââräÈåËS©©©<ÃáÄÆÆ"„¤RéúõëœãââX,VvvöЮ# ä ×þøãqãÆõi’Ç_¸páúõëb±xÙ²e¡øøøÉ“'+ÔZ²dÉ‹/¾X\\üÅ_¬X±¢ªª !¤|~ðÑG}ÿý÷¯¿þºòTûöí»sçN\\܇~ØÙÙ¹{÷îÔÔÔ+W®üôÓOñññ2™¬K eàzÐkÍÍͶ¶¶äG² <‰DÂf³ÕN²gÏž±cÇ"„öïßÿÜsÏI$òòŽæë< ŽŽŽŽŽŽ ,¨««ë~‡àÃ?œ2eŠÊÀ•+W:88Ì›7O&“577=ztË–-Ï=÷B(66–ˆƒç@¯q¹Ü‚‚ò£D"!õÄËË‹(øùù!„*++µœ×þýûwíÚåêêºlÙ2‘H¤rI !äââÒ}*ggg„öä§TVVæááA”½½½µœ5úòÐksæÌÙ¿¿\.'>²ÙìÛ·okž¤°°(äççcÆçóÕŽ†ã8B¨¼¼œ2cÆŒ‡&%%999½ôÒKÝyÐW¦Òk·““SII Q.**Ò*zòÐk[¶l©¬¬ ÍÎή¬¬zÍÁÁáæÍ›çÕW_õòòúî»ïzíúƒ>˜9sfPP§§ç¡C‡Bo¼ñÆ7” ß|ó@ ðððP¾÷óÏ?»»»oܸ1>>ÞÖÖ6((hìØ±õõõÚ,‚ƒƒ§OŸ>kÖ¬wß}!dbbÒ@÷0â¬ÝÃ0,11q¿ÿ@(>óÌ3555Ê·ÄÕ Gð@58?`03&::º¹¹¹ªªjË–-ÁÁÁ½&ôäSbbâíÛ·¹\®——WkkëáÇ©ŽmÁó &ÿ_~ù…ê(è8?€äÈ‚|@Sygï#`à~2 RFFµ(ZéíGš/® 6ŒòòrGm Àóh€2úБÃ4ûE‹yÿˆÎ i’öá!ä¡Ï£jÁù Œ>ü9÷F^¨íÆÑ\ÿªc€bpÿ¯–Ê®šÜ6„Pá%ŠOЀñ*¼\O§c¡šÜ¶Æ‡pW;ÈÀxå_¨“Ëq„Ý+ú N€±ƒ|ŒTýƒö¦²N„#„\Š?¸ù;ÈÀH]‘ÐíÿMâκü6 ã€r€QÂQÁÅ:…LA ™`…Wúö*4†ÈÀUßkm«•*QHñ?Ô㊞¦`øƒ|ŒQÑÕzCõi¸ö:iÕÝJâ@@>FG!Ç\ªWÈTŸ†£1hEWà®20^€Ñ©ø½¹«EÞ}¸B¦(¼"QH©jJ@>F§ð²„FWßu’¬M^~«IÇñ ' ã"ïR”þÚÐýbÇQñOÐÊ)èß—Î&¹ø÷¿ÎêòÛòÎÕMÞÈ'‡˜˜Òø“­© ŠAÿ¦À¸0­èÓmþúŒ£Žú꧆`¬àz„  @>€äÈ‚|€Ï£&kW´×K-™Tõ @® @>€äÈ‚|è Ãjkkµ3;;{¨ãƒò„ #Wv£ñÔ!ÕQ  £&mS4‹;Ɇ:uŠÇãYZZnÞ¼ùäÉ“\.×ÊÊjýúõ=Õ P(víÚåééinn>iÒ¤7nU‘×UÈ2†aééé...GŽ!Ëß~ûí®]»ÜÝÝ9Nxxx]]9Ujj*Çãp8±±±=ÍkÖ¬Y_|ñ1Iff¦T*UjVVV@@€™™™››[\\œÚ µYgΜqssc³Ùaaa?–Éd€ÏçÛÙÙEDDñÃ`ÄŠ~¬?üÜmò#B(44´¶¶699!4sæL²\TT¤¶†¯¾úŠÏç§§§‹Åb@`kk+•J‰ªjjjÈj‰2B(00ðÚµkmmmdù³Ï>óòòÊÈÈ(,, #§ ©®®NIIa0jçuôèÑ€€b’µk×®X±¢§…õððظqceeeJJ FûôÓO»OØë@=ÿüóþùçýû÷'Mš4sæÌ;wzzzfffæççÏ›7Œ?++«ÿÛèä`Ժ烴´4Çår¹J¹§CÛ¨Q£ââ∲B¡H$ …ï9$%%‘‰òèÑ£ˆb±˜N§·¶¶#œ={–  ¦¦Fí¼X,Vyy¹\.çr¹ééé=-,‡ÃùòË/‰²D"©««ë>a¯k€ˆãø;wBvvvÇŽ#†äää „qÈ®ð „FS)÷¤´´Ô××—(cÆf³1 Ó0¾‹‹‹J¹¤¤$22Ã0 Üåryyy91‚³³³rjçemm=}úô”””ß~ûÁ`L:µ§Yï߿׮]®®®Ë–-‰DG턽®///¢àç燪­­õôô$†2~`X 0 \.·¤¤„üØÐÐ@ü›Fá8Žº•­D™Ëåž;wŽøƒFüë÷ññ!FPI-=ÍkÑ¢EÉÉɉ‰‰K–,Ñf̘ñðáä¤$''§—^zI,k9¡ŠÂÂB¢ŸŸaØÈ‘#‹‹‹‰!DËåjYÐ+·Þzkë֭ׯ_¯ªªÚ³gÇkooG±ÙìóçÏ755ÅÄÄh®!**J dgg._¾|Ú´i}×ܹs³³³O:¡aFãÇß´i“‹‹Ë„ pg±XZN¨bÓ¦M÷ïßÏÉÉYµjUxxøûï¿¿}ûö¬¬¬‚‚‚5kÖ„††²ÙlíkúƒAu¶èèèÎÎÎÈÈÈÚÚZÿ‹/×X¾ùæ›üã›6múúë¯<¨¡†Í›7···ÏŸ?¿¡¡aòäÉ)))}—••Õ+¯¼RTT4nÜ8 3Š‹‹[·nÝÁƒãããmmmBÚL¨âƒ>˜9sf[[Ûk¯½knnÞÒÒ2þüöööW_}uïÞ½ÚWô ôw ŒÚ°yÿÁ¼yó&NœøÑGélB0üÀõ"`Ô¦4-“Á•+W0uÁP©Y[[Û­[·~üñÇÈÈÈ>Å©2!p½­Ì˜1C?O¦/_¾¼lÙ²O>ùÄÕÕõ%N• €ëE‚ëE ùò„ #ï?€ù5•÷`Ì @òäA>@€|!ÈП0jÃæý äÁõ"È‚|€ùB @ò0rðþH€Qƒ÷@‚|!ÈOõW‘‘‘ñÅ_P tÿûßRÃðÞ+Ú|ükfý×õKªBIII¬!<<|P"úFåøðÔùAYYYrr²ÎCC%333##c€• ï½â±YÁ0Nåå僲풓“ËËË^Ð+ÝŒî# üßЃø·ö CtúôéÅ‹JU~øá¢E‹¥* 'ºàþ„  @>€äÈêw>hjjÚ°aŸÏg2™|>ÿwÞ‹ÅÄW†egg^„Sgg1ÀÚ0 «­­íSƒ¾Šô„Ž÷Š¥K—ª ºµ*“ÉÔnhå¹Ý.j(t¼¨T8ðY(o>SSÓ€€Íj9Ç^wíÃS©d°j&õ'(Š×^{íÖ­[D«ä‹/²X¬ÀÀÀÎÎ!éFò?¡´´4¢üì³Ïż@¿éx¯@ø`úôéÇÔÔÔßßÿôéÓä©©©<ÃáÄÆÆ³²²ÌÌÌÜÜÜâââÈÚîÞ½Û½ ÃBöööµµµjG œ9sÆÍÍÍf‡……=~ü˜Žãø®]»ÜÝÝ9Nxx8¹”¬¿§‘{]czB÷{Å|ðøñãS§N©D¢|M–5ÏBÃÊ'ö±#GŽU)Š]»vyzzš››Oš4éÆä|[ZZþG.—k^^åj5Öën9°6˜ôä°€ºýÆ{Ú¸= HDä CóY›mDì<_Ë#Urr²£££­­í×_MNKÎâÌ™3îîîl6{Ñ¢EÝ6ZÁ•$&&ª QËÆÆæÂ… =}K,ÉÎ;===333óó󃃃çÍ›G~Z[[KÖÖÖFTõÕW_ñùüôôt±X,lmm¥R)®Ô ùcÆq\Ãò*W«!°^wËAÙv½B%&&j‡’ û,ðn¿q@ vãöt( ¾mjjŠŽŽ~á…p¿MmdYÃâky¤š?~}}}bb"9šòîçç—™™)‰&OžFV5jÔ(â/'Žã …B"‘( \Ýá Çq Ë«\­†ÀzÝ-5Óe> jè>Då7îëë«vãª=(£Óééé鏯ߦ–Ûˆ(kX|-TwîÜQM¹pôèQbü»wï’•kÐýøÐŸëE\.·  @y{“­HeeežžžD™(ýaYXX „h4šJ¹\\\B  ((ˆËå._¾\yggg•ú÷ïß¿k×.WW×eË–‰D"òdVC%½ŽàååEüüüB•••ÄÇ’’’ÈÈH¢¹‚³³³\.×Ð)˜†‘q ªöŠ/¿üò³Ï>#þ=i¦aV>±‘JKK}}}‰2†al6›¸2 –†åU®VC`½î–úC ĶPù?zôHíÆU{( ï'WWWoÛ¶mÁ‚---šÈÚo# ‹¯å‘ŠÇãiX3dåÄ.Ú.ûsX™3gÎþýû‰…b³Ù·oßV‡Çãe¢Àårû1/͈õT\\¼{÷îÒÒÒ«W¯*Ðý·:cÆŒ‡&%%999½ôÒKä.«¡’^G(,,$ ùùù†ñù|â#—Ë=wî‘x‰ÿ’>>>=-KŸFÖCTíÏ=÷Ü‚ >úè#åÄß%íV¾ÊoËå–””É[jiX^-v½î–úCÇ;€«««ò†xðàBÈÝÝuûã8®vãª=÷“Ùl¶ƒƒÃúõëëêêxиoŸhêTÇ… Ý) **Çl8%ÿ>éì”yzF+ø”)>§O¯¢:@¥”%¹õÚÙn¬°¤Ñ˜Q_C†?nÞ½ûòÉ“™a …âðáe¡¡OÈ劗^ÚUTT3i’ç™3ïS§>0Þ}¿  J¡ÀB7n<øùgÕáÊÈ»pIqB¨ñagáå{Ƨ©©}Ë–³Ï?¿599K¡À ÅÈ‘V3g>£2Ú±c7JKëBTS¦1Þ|Ÿ_E£a! CŸ|rF&ƒ&&FJRÔŽËq„Žð¬X±Bj¤gÌÃIW—lß¾_&Lø×ñã7ärÑ’N§/[6…Nê '‘´îÜùƒ\®@ÕÕµ47wP±~0ê|À`ÐB þèQýÉ“™TG¨Q›×†Ñ1„ÂQk­´ µ_/"úÇñÔÔ»S¦ìüôÓK­­Ré_o+Â0´t©ê½´Ý»¯(·;/.®ÑQ zÉxóA^^eWד}E¡Àwî¼hä ŒVm^Û_oÂQÖþ Y'œ,¤[·ŠgÌø|Õªã 2™BùÞ(ƒA›5k¬­­…òøyy•ññ7d²'Ç +,4êKFÆ›„ å--¦Q  Ðã{m ÙÿŽ8êl”ç¥ÔRè³úúÖ÷ß?±`Al^^5q«@e™L5YeàÖ­ç”ß@É`ЋŠàüÀø´µuUW7*‘ɱ±¿TT4P „Böäf2 Wà·UJÛz|+2ÐCÖÖ¦L„Tª¦Ó ü¼<•þ÷¿¹×®=P¾q(“É ª†:T}f¤ù   JmCÛÏ>»¬û`…$ÅŠnM ¤m á)£þŸhpètÚ®]áÛ¶ÍÃ05ïœÇ0´|ùKÊC¤Rùǧ¨Œ©Pàyy•C¨~3Ò|@6.R&•Ê“’²rrÄ”„(Q—׆uÛpþÇwUMн•ù¿ÿ :|øM:¦òë65e.\ø¼òãÇo”—KˆçÊ=ª'Ú'#ÍU ½ûp:ö¯]Ð}<€*µym˜šÉ;ñû u(SÓ h=ˆ21¡¿þúDSÓä8õõ­»v]R{Ü—ÉäeeÆû Š‘æƒ¼¼Ê®.5ÿþd2ùõëЭ•ñxœÓ¦ö\Žß?ñ¸£N ɽ{eóçï7Îåܹµl¶™‰ !$“)Þ~{ªòh_}õc[[WO•s“S#Í"Ñ_‹ “É ®$2™Œ1cœïß/§,2 C¸I Û”‡`Fñä´¬î"’ÜÜʈˆCÏ<ã|ìØ;ãÇóÏûÀÞÞ !ì…ÜÝÜìÈÑšš:nÞ,¤ÑBˆFC#FýŸŸ{׉ƀÿ†¤  jÑ¢ý®®¶GþŸò}Ë3gÖ°X&Ý'a2cÇòÇŽå …â††ÖË—ÿ^UÕ(UäæVÐhFzÕg>°¶6SîÓÊËËÁÄ„žŸ_åççDaT@÷¬øL+>“üÈve)dx³¸ËÚ•©a* W<¨ßÏãq¾ÿ~¥¥%Kå[â¡ D¢ŠÑ£BŽŽÖŽŽÖÁÁ£†*PC`¼™dbB÷ð°ÏÏ7êçPBÈÚ•‰0Ôðº-1¥¥µK–ärÙ§N­´²RM½Âq<'G§š†+È!äçç¨PàFÞÕ-@±]Y p~ ß„Bñ¢Eû]\lOZÉfèÍç"Q\,Rù!„\]íX,“¼<¸¥lìÜ_f¿ü©q½Qݰ…â%Kº¹Ù&$,ïß=•Úàf²2cloÚ†y{4ò®nBÈ|äó‘#zP!3³hÙ²oÇŒá;ön¯ I{ÕÜÜñðaÜyò$—˵²²Z¿~½†ª0 KMMåñx'66–H"ɲæúqßµk—»»;‡Ã ¯««#'OOOwqq9räQ•B¡Øµk—§§§¹¹ù¤I“nܸ¡!6„½½}mm­L&|>ßÎÎ.""¢§ú5Dx÷îÝéÓ§s8SSSÿÓ§O«ÌBûõâDÆÂ…û&Nô8{öýôE¡™PXááá öÕF ÿsíZ¾“Óºššfª;÷fÞÏ)A…††ÖÖÖ&''#„fΜI–‹ŠŠzª!R]]’’Â`0:::ˆ555äDYsý{÷îõòòÊÈÈ(,, #' ¼víZ[[QÕW_}ÅçóÓÓÓÅb±@ °µµ•J¥Â#æ¾sçNOOÏÌÌÌüüüàààyóæ©­_C„¾¾¾+W®,))©ªªŠ‹‹c2™* Û«ÖÖÎU«Ž»¸¬¿©å$ý¶té¡U«Žõ\ 䃿<~Üää´îÚµªûõ“ÒK«(A¥¥¥á8.—ËUÊYYY=Õƒ:{ö,9&yèW›4Ô?zôè„„b±XL§Ó[[[‰©’’’”«5jT\\1D¡PH$…B¡!xŠŸ41ÈÚ•ÕRÕ%ïR ¼*µ‡cÇ‘Ò1·W\.÷ܹsÄ?8â_¿ñ•J¦ár¹%%%ädž†â/¼f<¯¸¸˜(.—«¶þžïÞ½»´´ôêÕ«ÚLBÉŸ~z)"âД)>©©kÝÜì´Ÿ¶ßrs+BcÆ@>Pùà)¾¾NÐË)°veâ ÔT6$_³ÙìóçÏ755ÅÄÄh9ITT”@ ÈÎÎ.,,\¾|ù´iÓzó­·ÞÚºuëõë׫ªªöìÙÃãñÚÛÛ{™ôæ›onß¾=++«  `Íš5¡¡¡l6[ÛåA!$•J'Nœèíí››…"kH$=MUZZ;{öWqq¿}ùåëF™›ëèµÕBa…½½¥ƒC?ߢ3ŒA>xН¯cAA%ñ÷ -+>£¡!zÂ7ß|#<<<¦L™¢å$›7o ?þ³Ï>[VV–’’ÒÓ˜ÑÑÑ‘‘‘‘‘‘žžžIII/^$.ìh¶qãÆ ÌŸ?? ÀÁÁá»ï¾ÓvaþçСC±±±\.÷½÷Þ[¶lYHHÈܹsBAAAcÇŽUûÈÛ… „„|.—+®^]þ·¾Îq D"1eYY%sç~“ýO.·oÿÀ0Óø°Ã‰IÛ ¾¶¶®˜˜‹G^_²ä…;曚꺃ñ—_Þ=mšŸ@0[ÇóÕp~ð__' Ãà)`íÊÒ2\¹rSG  uÚзðnÞ,|ùåÏΟ¿sð`ÔçŸ/Ö}2èê’VÃùZÐ_ÅS¬¬XŽŽÖyy•ÁÁ£¨Ž†3fèóI¶þ„×ÐжqcRjêÝ¥K‚ÙTu$üàAµT*‡| äU~~Žð¢4WZZÞæÍÉÍÍû÷¿1oÞsF’“#f2^^#)ŒAoA>PåççtãF!ÕQ0LPåã3’FÃòò*!y—‚>B_d†"7·rÇŽ iiy3g>³mÛ|φêˆþRQÑÐÐÐ=UôöuU¦¦#\\l¡É)Èü²üÒ*¸“Ô ~xò•Wv‹Å 'N,ÿöÛ·õ* „„B1†aðZ´žÀù¾¾Ð‹@Ö|Vþ¹:„#¥õ¦¦¦y÷îˉ‰¿;;Û8:N?ßS/ŠÙT5uÕÔðósºz5‡ê(ÅlPÃ××qÿþÿJ¥r:Õ±ÊØxš"„$ÅíÔjoï:räÚiR©üƒ¦/[6EgÒõ›PX1>•O?è9Èjøú:I¥ò¢¢ÇðzUcÆ´¢›ÙšÔµó¬¨ŽE¿tuÉ2cc©«kyýõÞÿeggýºO VkkçÇµÐØTÈjxy9˜˜Ðóó« 9O–¤HõÅ8Ƭ¹¹ãðá_¿ûîºT*_¾üÅe˦ØÚöÞªžÈË«T(pÈ@>PÃÄ„îáa·”‡iõýVª£Ð mm]'OfîߟV_ßðþûÁNNÖpNŽØÒ’åêjKu ú òz¾¾NðâLÀö`UÜn¦: ŠÕ×·~÷ݵ#G®wvJ_}ÒêÕÁŽŽÖTÕ"QŨQ\ýlø¤' ¨çë똜œMu€b£ÚZh¼%TÅÆþrþüvv–~øê’%/XXèûc D"ñر|ª£ÐkÔóõu|ø°¶½½K÷ý³@¹{÷ÊüõâÅ»ÎÎ6Û¶Í_¼øo†þCP(ðÜÜÊ%K^ :½ù@=??'…ð þPãÑÕ%»xñÏï¾»vûöñcù±±oÌš5vxtìXZZÛÖÖ=Uhù@=WW[Ë$/¯ ò0Tÿç?é.üÑÕ% ›°sg¸¿ÿ°:tæäˆétÚ¨QÐbPÈêÑé4oï‘ðb0¼á8~ãFá±c7®^½ommöÖ[Sß|s²Þ.ÖL$»»Ûéó³ÓúòAüüœ W;0\Õ×·ž>uâÄÍââš±cù{ö,™7ïÙ#†ízªÐưÝüçëëxäÈ5ª£`0ÉåŠK—î8‘qóf!›m¶dÉ ‹Oôòr :®!'V¼õÖª£ÐwzäëëXYÙØÔÔ½!9IQ;“Í0³5ìK µµ-gÎÜNHÈxð zÂ÷={Ïž=ÞḬ̀[ i©¾¾µ²²žLîäƒùù9á8^PP5a‚;Õ±*]]Wä·Ðnü2GªéÎNÙ?æ$'g§¥åZ[›-\øüþ³ÌÇÇ —¥ßD¢ „¼ö WzÄå²--YyyŒ‡©Áõb$“)ÒÒr““³úIˆaجYcVLžìM£ãÓ¹B¡ØÎÎbäÈaxŸ|pA>è†a>>ðb€l¼XåMTG¡­‚‚ªsçþ8wîNiií¨QN›6Íš?ÿ9{{Kªã¢’HTOhò&~~Ћ@6¦9ß×à Óã?×Õ?ÿǹsäæVŒi={ö¸°° ðô A(¿ø¢/ÕQæƒòòò›7oêrŽÔÖVùçŸâÓ§OSHÿñùü€€ª£PeX{‚¼Š)ïâŸ:|ŽÎ‘R‹¥¥ÍçΕ>|ØjfÆ7޳zõ//+ “æåeäåeãòx“Éäóùï¼óŽX,&¾Â0,;{0ßt?èêá —Ž÷ºßL2™ ðÚÚZÏw¸‚›É}¢ù@¡P¼öÚk·nÝJNN.//¿xñ"‹Å ììì¤:4 SºßÒÒÒ$Jž}öÙ!šQOètz||¼¥¥Qw74ˆ„B1tkª=}ì¿èèÑ£EEE………æææ!{{û}ûöÅÄÄ0ú­–0 «©©±³³Ór8@Tì l6{ˆ*W¡¼éÉ2†aK—.ÕMÃ^kkgii-ÜLÖž>ž$$$¬^½š8Øl6N'?Êd2@Àçóíìì"""êêêˆá†:uŠÇãYZZnÞ¼ùäÉ“\.×ÊÊjýúõä'NœP.tw÷îÝéÓ§s8SSS¢ÿ¢Y³f}ñÅÄ™™™vvvííí=Å@žïeâQ{{{•ëÊÃqßµk—»»;‡Ã ×~‰†1Ýï --- ÿ#—Ë5ןžžîââräÈÍóR»;)oz•݃Ü0 KMMåñx'66!$•Jׯ_ïàààììÇb±à£yyU ׋ú@—c½Öô:šÍ… zú!”••µsçNOOÏÌÌÌüüüàààyóæ‘߆††ÖÖÖ&''#„fΜI–‹ŠŠp/..V.*ÏÂ××wåÊ•%%%UUUqqqL&³³³óèÑ£Äk×®]±b…†jjjTÊ*É9’Ã÷îÝëåå•‘‘QXXJö;Ôëi¦Ïýõ:šî÷eÄ6ÒP``àµk×ÚÚÚ4ÏKíî„÷°ŸàOï3!!!ÕÕÕ))) £££#&&ÆÛÛûöíÛB¡0((ˆN§«ìº=­(ãì¿èر>>› Õ }Ì ãÆäGò÷)‘Hðÿ¼½½;FŒ““ƒjll$¾MKKÃqœøs§\îé—Óý«††™LF”óóó‰ßgCC‹Å*//—Ëå\.7==]C ýÈ£GNHH ŠÅb:ÞÚÚÚ¿%"z> |OÀq\CýIII䄿¥vwµËgÏž%«ª©©ñöö>~ü81Ú½{÷´Ùp#Î7žž=ûkª£0$úx½ˆËå% Ù¤„TVVæééI”‰Byy9ñÑÂÂ!D£ÑTÊÚkhhAAA\.wùòåÄ@kkëéÓ§§¤¤üöÛo cêÔ©b臒’’ÈÈH¢Y‹³³³\.Ä%2P”ï šëwqq!GÓ0/µ»“–œ•«*++óðð ÊÞÞÞ}]c#VøûÃ̓>ÐÇÃÊœ9söïßOü'B±ÙìÛ·o«ŒÃãñŠ‹‹‰2QàrmÃïÞ½»´´ôêÕ«äðE‹%'''&&.Y²Ã0 1à8Žú˜¸\î¹sçˆ,­P($‰Ï`-‘¢|OÐ\¿–Ù¥§ÝI*]“:99•””墢¢>Uel <7^‹Ö7ú˜¶lÙRYYš]YYyæÌ™mÛ¶©Œóæ›onß¾=++«  `Íš5¡¡¡Z6 9qâñ‹" ¨Û]D©T:qâDooïÜÜܨ¨(„P}}=BhîܹÙÙÙ§NŠˆˆÐ›Í>þ|SSSLLŒò¬%‰ÚˆáQQQ ;;»°°pùòåÓ¦Áë;(غëwý¤žv'ôô.ÑÓî¡,22rÇŽwîÜÉÍÍ%nVy_Ö<|XÛÖÖ‹úF—§´¼jŒãø£G"""lllÌÌÌBCC‰ÿeÊW»ºº6nÜèììÌáp–,YÒÓ¥ùîe„P||¼JAYVVÖ… ÜÜܘLf``à¥K—BBBüüüˆzæÌ™3fÌ¢ÜS Ç9r¤­­-Ñj…Äb±êêêT#‡wuumÚ´‰ÇãYXX„„„÷Š{]" ýþ®ó=¡û*íwýd¹§ÝIy—PÙ=Èû*÷™:::V­ZeccãîîNܯþóÏ?{]‡È(臘ÞåñþÞÚÚIu †ÃuøN’Ó§O/^¼X—stóæÍ›8qâG}Du Z!Þ‡“””Du ª†Áž@9¡PøÌ3ÏÔÔÔØÚÚjðÄÄÄE‹é&0=ñÙg—SSï^»¶™ê@ ‰>^/ÒOmmm·nÝúñÇ###©Ž©1cÆDGG777WUUmÙ²%88¸×d`´„B1ƒ|€¶$Å %TGz=Uô÷“‰FñFH¡ÀŠŠØ!SS©™™ÌÔTÊbɇôñÒÌÌÌI“& á Æàöïú—p„rÒ©h"•Ê ªV¬x‰ê@ NóŸÏ Óåõ †»¸4Ý»çðøñ“ý1 1™2 "=t™šÊLMe4Ú =¥5iÒ¤€€€Áªm➀!Ì©e B¨ˆóŽ éIº°°0>ŸOuºSXX-•Ê¡±i?èôùd€zð zöì¯[[;år9FȾÇ1 ÙÛ[zy9Œëâååð⋾ÎÎ6F HsZÏ¿™šwÜ×~Œy¯ãª$'goØøàÁ.zïc%pÿ@×¼½G&$¬`0hÊ=‘oì@á8þøqóÍ›E‡ÿúÑGÉÔ… T^ª§10{p©žêX€&"‘ØÛ{$$ƒ~€|@çŸw%RÖýîÁ“!t:mùò—àä@O(äøƒKõ ®á~¨WÈá¬ZåäTøûÓýù€^‡/ëéf2†a,Öˆ÷ßY·AUüÞÜÕòä5 ]-òЬfjãˆDbx2¹ P&$ÄçNõ l0 [·î++S‡zRxYB£?ÉÞ4:Vx¹÷wJTU5Ö×·Âkpúò•–. ذa†ÊY†™›3/]º÷ûïÅÅž"ëT”ü,QÈž\#RÈð’Ÿ%²N…æ©%„B1BõäŠýýï!ï¼ó¢òGï¼3•N§-XûÁ ååðW”beךä]OÝ0wâe×›¨Šh Vp¹l6ÛŒê@ äêmÛ6wþüç BˆN§y{ܰaƹskNž\YPP¸#:útu5}(óàröô£¡ÂËu…4‰àµýù€z†íÙ³øùçÝ šBoÚôqº0uªÏåËîÛ÷Æõëcbb.65µS¬Ñéj–—]oRiP¤ã®5u5Ë©Š ôD(¬€|Ðoô“É8vì]OO‡±cù3fŠŒ+ð⟠õ—‰Ä~~NêûZþì X^^åÎ?üô“pêTŸ­[çåDuDÃÜ/KB/êNu @½9s¾=Úi×.ëG]Àùóós:vìÿW56¶‡„쉎>]]ÝHuPPC¡Àóò*àÉä€|`ðžn–úoh– ŒÓ£Gu--ÐØt  Ð,¡PL£apÕt  Ð,3‘¨ÂÍÍÎÌlÕ0Èà 4KÆ)'zª(ÈÓJ³ÔÙ³¿†f©`x‰*àÉä‚|0œñx6Ÿ}¶è‡>451þÞÅ‹äæVR”³ä°äÁå}ÔÐÐ&Kàü`€àùcqíZÁŽ©B¡xÁ‚ç?þ8täHkª#`ÐܼY¶ïöí:9±©ŽÅ€Áù±˜:ÕçÊ•¿8•] ÍRÁ0#Up8æ òf©`¸ áɃòÑQi–ÍRÁƒ|0( )²Yê‚Ï g‚ƒ?ƒf©À@I¥ò‚‚jè©bà 5²Yê /x¬Zu|öì¯23‹¨j˜‹ŽŽ633«¯×õ»d2†aµµµ:ž¯>îê’ùûC>(È@¹Y*sÁ‚ØÅ‹äæVPÔ°µwïÞ_ý•Ãáèx¾t:=>>ÞÒÒRÇóÕ‘HlbB÷öIu òxbÜ8þéÓ«W54´½òÊž+Ž••Áû¿žÒ,îlw°’ŽŽA‰§'Êçdð¥K—2™Ì!5%D¢ oï‘&&tª1xÀSÈf©÷ï—¿ôÒ§Ð,UÙïßTüþÍ_gN†:uŠÇãYZZnÞ¼ùäÉ“\.×ÊÊjýúõ=Õ€aBÈÞÞ¾¶¶V&“ >ŸoggQWWGŽ“žžîââräÈͳ¸{÷îôéÓ9Ž©©©¿¿ÿéÓ§Uf¡\FOç†ÔÔTÇápbccBR©týúõÎÎÎqqq,+;;{ÈVä ƒž* €:]]²øø›cÇn5ê£ØØŸÛÛ»¨Žˆz?Gÿ]L~D…††ÖÖÖ&''#„fΜI–‹ŠŠzª!TSSƒãøÎ;===333óó󃃃çÍ›GŽxíÚµ¶¶6ͳðõõ]¹reIIIUUU\\“ÉìììTžEOe„PHHHuuuJJ ƒÁèè舉‰ñöö¾}û¶P( ¢ÓéYYYC³Ÿ¿¿ààÁ4ª£ MZ[;ccöñÙôÜs[ããoÊdrª#¢R÷|––†ã¸\.W)k8˜’eooïcÇŽsrrBÄIIIÚÌ¢¡¡A&“cæçç+î{ÍgÏž%«ª©©ñöö>~ü81Ú½{÷4/‚^©ªjprZwíZÕ p½hÍR5³°°@Ñh4•²6ÊÊÊ<==‰2Q(//'>º¸¸h3‹††@Äår—/_Þ§È•«*++#ïjx{{÷©*j …¡1càáƒAùôŽl–:nåJh–:8x<^qñ“Ng‰—ûä ¦eR *..Þ½{wiiéÕ«Wû4wâÖÉÉÉ©¤¤„(ÒÆ‰*œœØ66æT2@>Úâñl¾ù&òÒ¥MMG@³Ô{óÍ7·oßž••UPP°fÍšÐÐP6»oÝïH¥Ò‰'z{{çææFEE!„ÈÇ$ 9šr¹'‘‘‘;vì¸sçNnn.q³Z%aè-¡P 'ƒòè›qãø§O¿ÍRnãÆ ,˜?~@@€ƒƒÃwß}××:Ëårß{ï½eË–…„„Ì;!4vìX"7(—5ÁÁÁÓ§OŸ5kֻヒ211é×béôT1ˆ ¿kÐO8Ž_¼øçÎ?ˆÅ’¨¨É6„X[›QÔÐú}¯!4qÍ0oÚ( Ÿy晚š[[[ªcéE{{—Ïæ}ûÞ˜3g<Õ± p~ú‰ì-5&fá… Lš³oß/RªãB×8k™ ®\¹‚©#†:Èþ3fLtttsssUUÕ–-[‚ƒƒõ? „òòªärôT1Xàü ‚ÖÖΣG¯óÍϬ?|uÉ’ ø«aHrrrÖ®]ûûï¿ã8>yòä õCÔƒ"!!cëÖóùù;i4øۡç €AS_ßzà@Úþ“îâÂùÇ?f††Ž3”{’À@}üqʽ{e©©ë¨d˜€?q`ÐÍRÿûßèQ£¸+WŸ3çëŒ Cj¹ NNŽº¹DÀ óð°?tèÍ~Xgj:báÂØÅ‹ˆDÐ, >Çss+ qÑ ‚|†Äøñ.D³T‰¤õÕW÷¬XqìÑ£:ªƒÃÊÇu--p3yA>ChêTŸ«W×½¥Nº3:út]] ÕAaB$ª Ñ°Q£àü`Ð@>CK¹YêÕ«9S¦ì4Üf©ƒòþ0XD¢ WW;3³T2|@>º`bB_º4àæÍß?øë¯ Œ9q"C&SPWߨ¼ÿP zªt€î˜›3‰ÞR.œðñÇ)ÁÁŸ¦¦Þ…Ï  §ŠAùèš­­ÅLJ¦¥m$š¥Îž ÍRAŸ56¶‰Å ðZ´ÁùPƒl–jfÍRAŸ‰D•8ŽC>\• Y*è‘HÌá˜s¹}ë!hùPoêTŸ+WÖ8uï^Ñ,µ¶š¥M„ŠQ£œ¨Žb¸|ôMö w IDAT†Íž=þ·ß6ÍRw|þùm– t@(„ž*ä GÈf©k×¾rèЯúÖ,Õ’7Â’­Ý©'•Êóó« qÑ ƒþMžª«kù꫟Ž»îêj ½¥‚¿äåUöÓOà~òà‚ó §lm-¶oŸÿ믛F~Ò,õæÍBªƒzA$ª01¡ûø8RÈpùè5¥ÞRMÂÂö-^|@(S ˜HTáå5ÒÄ„Nu à ä`ÆwIJZM4K ù|ÅŠcB³Tã=U ÈÀ`(7K ‚f©Æ ^ƒ3D C¢Ü,õÊ•û;bb.¶´@Ÿ£Fäñãæºº8? €á!š¥fdÖ­{娱ëAA;õªY*RÄ $hY4 CEö–:kÖ¸>Jž6mÈ{K…÷è‘HìèhÍá˜SÈ0ù6¢YjZÚF¢YjhèW7n U³Txÿ> +àbÑ|†OO‡C‡Þ¼xq™Ùˆðph–:œAOCò>ž}öI³Ôúzh–:<µ·w×ÀùÁ|†›©S}®^…f©ÃS~~•\®€›ÉC„Au@Œ³ç 3176>¾ý›o6vv–¼Â »¡éŸxU wþE¢ SÓnnvƒ@ŒÇºu먎‚íí2SÓ±ÂÕhñ Öf„222¾úê«þMK¼ö€N‡ Cò±X´hÕQ€BýÎ"‘º¹:f†Çq‘¨ ÈÃPVVßÜÜ‹†ä€a +h4lÔ(ÈCòÀ0ˆDb[ &Õ [†A(¬€'†ä𗦦¦ 6ðù|&“Éçóßyç±øI¯†eggâ¼½BÊç8f̘-[¶gÏžýÊ+¯?ýôSOOO™L†aXmmm÷ØÔT¡ã5†ê)`J…иhhA{Sð„B¡xíµ×0 KNNöð𨨨8|øp```AA“ gè½ ÊÌÌ$Ê]]]¿þú«T*mkk333Cݺu+((ˆN§ÇÇÇ[ZZjYgZZÚøñãÉÚO8XúðÐijj//—ÀÍä!çà‰£G]¹rå…^°··7nܾ}ûþüóOÀÿ4ôôßv(þó¾øâ‹YYYÄc·7oÞtttäóù¿þú+ñ-‘0 [ºt)‘_µ‰Á‚­„NÂ7+ÇC–•¦–HTã8\/RÀ «W¯67ª[y•cL&|>ßÎÎ.""¢®îIoq†:uŠÇãYZZnÞ¼ùäÉ“\.×ÊÊjýúõä'NœP.tw÷îÝéÓ§s8SSSÿÓ§O#„fÍšõÅ_#dffÚÙÙµ··÷ƒÊáŒè¥ÃÞÞ^å°«<Çñ]»v¹»»s8œððpí—¨»   ÆÆÆÜÜ\„ÐÕ«W_yå•+W® „ÄbqEEÅÔ©S5Ä–œœìèèhkkûõ×_“u¶´´4ü\.×¼ ÒÓÓ]\\Ž9¢9xµëY9•Ø”sCjj*Çãp8±±±!©Tº~ýzgg縸8‹5tW´D¢ kk3gg›!ª „ŒB(11Qó8666.\ÐPCVVÖÎ;===333óó󃃃çÍ›G~Z[[›œœŒš9s&Y.**Âq<>>¾¸¸X¹@T¨< __ß•+W–””TUUÅÅÅ1™ÌÎÎΣG#¬]»vÅŠb¨©©Q)« $çHß»w¯——WFFFaaahhhXX˜–K¤–——×·ß~‹ãøsÏ=wöìÙÔÔTÇSRRœœœ4Ç6þüúúúÄÄDƒÑÑÑwëÞ‡^Ãâ^»v­­­Msðj×sO+P%àêêê””"Ș˜ooïÛ·o …Bâj˜Ê6U+11±Gž¿ÿýÔÂ…±} ô 䣠M>`07nÜPž„ ‘HðÿL½½½;FŒ““ƒjll$¾MKKÃqœø«\îéÑý«††™LF”óóó‰ÃPCC‹Å*//—Ëå\.7==]C ýÈ£GNHH ŠÅb:ÞÚÚÚ¿%Âqüí·ß~÷Ýw?~eÊ”«W¯74OËãñ´™…†Åwqq!GÓ¼Úõ¬%gggåªÊÊÊ<<<ˆ²··wŸªê™L‘›[ 7†äðÄœ9söïßOüõC±ÙìÛ·o«ŒÃãñŠ‹‹‰2Qàr­½GPPPqqñîÝ»KKK¯^½J_´hQrrrbbâ’%K0 ÓŽã¨éËåž;wŽøs¤P($‰O¿áÅ_ …gΜyõÕW‰!3f̸téÒíÛ·{ÍZöI®añµLÀ=­gm¨éääTRRB”‹ŠŠúTUŸ?îê’AcÓ¡ù<±eË–ÊÊÊÐÐÐìììÊÊÊ3gÎlÛ¶Meœ7ß|sûöíYYYkÖ¬ e³ÙÚT~âÄ âÀAP·›¥R©tâĉÞÞÞ¹¹¹QQQ¡úúz„Ðܹs³³³O:¡!6›}þüù¦¦¦˜˜åYK$µ!㢢Avvvaaáòå˧M›Ö—u¦ÊÍÍËåž={V9üðà Ãßß¿§ú¤ß›€ÔÓzV‰G›Ø"##wìØqçÎÜÜ\âfõ½iC(¬01¡ûú:Eåà/”^­:‚´¸€ãø£G"""lllÌÌÌBCC‰¿ŸÊ÷ººº6nÜèììÌáp–,YÒÓ¥ùîe„P||¼JAYVVÖ… ÜÜܘLf``à¥K—BBBüüüˆzæÌ™3fÌ¢ÜS Ç9r¤­­-Ñ~‰Äb±êêêT#‡wuumÚ´‰ÇãYXX„„„÷Š{]¢ž,]º”Íf“èqçñx³gÏVÞjcS{½¾û¼ú½ ÈrOëY9µ±¡n7`:::V­ZeccãîîNܯþóÏ?5¬B?îlß~!8øÓ>MúÃûõ–"`X0 KLL4Ü÷Ì›7oâĉ}ôÕ€ …Âgžy¦¦¦ÆÖÖVó˜§OŸ^¼xqŸŽ<‡lm-öîXŒ p½èµ¶¶¶[·nýøã‘‘úr,¸råJ÷ž$0 T‡¦kcÆŒ‰ŽŽnnn®ªªÚ²eKppp¯É  § Ý0àGO1¸|ùò²eË>ùäWWWªcybÆŒpVMHLL\»v-—ËÅq|òäɇйÔÔ4×Ô4CO:ùèµ… .\¸ê(€zþþþ¿üòËPÏE(#„ ±©Àõ"€^‰*FŽ´²µµ :áò@¯ …b89РȽ&UÀÍdÝ€|Ð_²¢¢Çp~ p?ÙXdddP‚‘zô¨¥¹Yêãcmb¿ê㮘Ÿ_)“)àü@7ày4£0D½m`ÝÎîu:ݦ««¬££¸³³D.o¦:(êiyä9y2S 8[P°“N‡l:äàüÀ(@Ö§VnneHÈçæÆb¹ã8îîn7kÖ¸éÓG?ÿ¼æ4 +üüa-霠 ß}wmË–³ Å“ŸÛˆŒ®.ÙˆŒÉ“½gÎ|fúôÑŽŽÖÔF¨Ÿ,ˆõôtؽÛP»Z1,ÐÇ—.=|ýú©T®<œøç+—+ÜÜìfÍ÷Ê+£'Lp§ÑàúBá8>jÔG7Îzë­)TÇbà, ]À0lÏžÅ#F˜¨¼¤@.WÈå „ÐÇu¦Í›·÷ܹ;Ô„¨ÊË%MMÐS…Î@>@GœœØ{ö,Âqõÿýq§Ó±—_=þs:Lo …b ÃF†Æ¦:ùÝ™;÷Ùðð¿1j~w ÍÆÆbß¾¥ÐŒ$V¸¸p,,˜Tb,  Sÿþ÷BGGv÷3 ~àÀVV¦”D¥ŸD"è©B§  Sff#öï_ªÒŽƒFÃØl³ªªFª¢ÒOÐS…ŽA>@×&Lp_»öòÁÄ„>f ÷•WüW¯>ññÇ)RjÃÓMMÕÃù.A>€ëÖ½êí=ÒÄ„A¼[mïÞ¥_~¹äûïW\ºt綾>ÍÎ.¡:@êååUà8çºù ˜˜ÐˆÂ0„ãøÖ­ó||B/¾èûÓOÿðõu\° öóϯíP–P(¶¶6ãñl¨ĈзnÝJu #;; KKNߺu.Ù¦ÈÌlļyÏ:8XíÞ}åÆS§úXZ²¨“* ™&&´Å‹_ :#çPæí·§ÆÆª60Å0léҀ˗?”HÚ¦MûÔhO‰*àɃ|e0 ³²Rÿ÷ßÇÇñ‡> Ÿ¸zõ‰>HhmíÔqlÔ’Éyy•ðd²ŽA>@O1™ŒíÛçÿýŠk× ^~y·QÝd.)©éèÂÍdƒ|€^3ΛÌB¡ØÄ„îççDu ÆòúÎÎÎâèÑwþýï°ýûÓ/>PYÙ@uDCN(¬ðð°1^ТS0äM憆¶iÓ>={v˜ßd†ž*(ùƒAÜd~ãÿÛ»÷ &Îõàïr9‚F=`¨U¼ë©­3xAcZå þ” ¨¨ã j¬h;( V¨ZGO­­¢”ŽZ¹è€œzââ8j“žÖ6`£R h!‚ÈÅ@ÂþþxišHä² |?sþx³,û>›=ÝoØgݬ˜ÑË›ÌxR'–ÄÎÎæ“Ozw“¹²òÅÓ§µøûÀô–Ç×·77™ïÝ+'„ Ly`‘´›ÌAAÿ]ÁuEF#•ʇu2Ä‘ëBú䀥Ò4™›üüþÕkšÌ……åøã€ÈËÖûšÌxRWO»É<{ö^‹n2+•ª¢¢§xR'½„¯ï¸+W>~ã W‹n2ß¿ÿD¥jÁͦœ@ôÎÎßd.(ÛÛÿÍÃc(×…ôEÈ€^ÅÒ›ÌåcÇÓ|™(˜Þt€^Èr›ÌxR‡½“N“Y,¶€&3˲åh&syЛišÌ‹Y@“Y.¯©­mÄͦ\Aôr:MæÒRóm2ʆÁÍE\Aô~š&óË—ÍþþæÛd–JåîÚÿQèiÈ€¾bìØ¿ÿç?›Ì¹ÉŒÇ\s yЇ˜y“¹°Íd.!úól2¿xñ²´T›M9„<è‹Ì°ÉüÛo,Ëâz‡}”N“ùìÙ¹­G*•`ïî>˜Û2ú2ä@Ÿ¦i2oÜx’Û&saa¹§§+Ã0\È€¾ÎLšÌxRç@×MfµºåÞ½ Ü\Ä-ä´â°É\RRõòe3žTÁ-äü…«&sa¡ÜÆÆjܸ¿›f:hòté4™ëêz¼É\PP>jÔÐ~ýl{z"0yíÐj2?x÷Ýo2Èñ/8‡<½|}Ç]¹ò‘ šÌøÚs€<Cþ·ÉüuO4™«ªêž>}Ž›M9‡<€W Mæ‹7¿|©ê‰&ó½{å„Ü\Ä9ätȘ1Ãz¨É,•Ê]\œ†u2Ö¡kÐQ´Éüí·ëŒÛdÆ×˜ ätÎŒcÛdÆ“*Ìò:͈MææfuQÑžž®F,º†aY–ë •Å=ÝÓÖv(÷^]¸±ñ^—7beåÀ²*–m2baæÉÌÏ·È3Â0̦M›|||¸.¤Tª\ix…[·n8pÀÌÏ·6\ÿÃÇÇG(r]߸.áê@ò(ä‚< y„ ,QmmíG}äîînggçîî¾f͹\NÄ0ŒD"1â\Fß 9ÌÈ´!‘HT*Ã0UUU*Ìð¯XÜo `aZZZæÍ›Ç0Lffæ¨Q£ÊË˧Nzÿþ};;;®«³W¯^4i’楓““••UJJŠ“Sß}¬òÀÂ?~üáÇEEEýû÷'„¸¸¸ÄÇÇïÚµËÆÆ‚ÿsf¦²²rÈ!\Þ}ŽŽŽ<OgáòåË>‘Áõ" sòäÉ 6Ð0ÐàñxÖÖÖš—*•J$¹»»2$44T¡h}¾Ã0§OŸæóùNNNÛ¶mûöÛoÝÜÜ °eËÍ ©©©Úƒ¶~þùç9sæ <ØÞÞÞËË+==2þüýû÷Ónß¾=dÈÆÆF}5h.°Ð1}J‡‹‹‹Î…íå,ËîÙ³gäÈ‘ƒîøéSWWWó'µZ­]¾¹(¥R¹iÓ¦aƹ¸¸|ýõ׆g±0,˜ BHZZšáu tîÜ9[‹ÅŸþ¹‡‡ÇíÛ·e2ÙìÙ³ƒ‚‚4? ¨ªªÊÌÌ$„¼ÿþûšñÇY–MII)..ÖÐ jO1nܸuëÖ•””>>t…?üpíÚµj¨¬¬Ôë,Ǫ̂Y~ðàÁÑ£Gߺu«¨¨( `ñâÅÜ#}ï’6é Ì%‹E"Ñk¯½vãÆ ™L6sæLíÊ HKK3ÿó­¹×Чt$lllnÞ¼©ý+Tuu5ûç9k̘1ÉÉÉt©TJyþü9ýéÕ«WY–¥ŸˆµÇ:'}ííëü¨¦¦F¥RѱL&£'Äššš~ýú•••©Õj77·ëׯ¨¡ y0~üø“'OÒ…r¹ÜÚÚº¾¾¾k{ÔîNiOg`.±X|¸Z­6âu|.BHEEÅØ±céX3è&00ððáÚKÞ<ïÇu¿Ð˜ÏçÓ1¸¹í È|}}‹‹‹÷íÛ÷èÑ£K—.i– …ÂÌÌÌ´´´%K–0 c –eI'ãÁÍÍ-++‹~Œmii©®®î¹s±á¹ø|¾&‹ŠŠz¨N ,LLLLEEE@@€D"©¨¨8{ölll¬Î:+W®üì³ÏÄbñýû÷#""ÚÞKÓ®ÔÔÔ’’íiÓzmnnž2eʘ1cîÝ»Fyöì!dÁ‚‰äôéÓ¡¡¡jàñxÙÙÙµµµ»víÒžººººÝ’èò°°0‘H$‘HŠŠŠÂÃÃAgÞ³Î1<׊+ââânÞ¼ùàÁƒWv­- gWª  Òþ˲¿ÿþ{hhè Aƒè§oíþASSSTTÔðáüdÉ}—æÛŽ !))):mb±øÜ¹s¯¿þºÝÔ©SÏŸ?ïïïÿÆoÐíN˜0ŽõÕpâĉaÆ9;;Óû—èr__ß~ýú) Â4Ë›šš¶nÝÊçóýýý5½âW÷Ù@ÿÀð\J¥222’Þ_tâÄ Ò‹úø>3Â0LZZšå~ÿAPPД)S¢££¹.Ä줧§‡„„˜ùù׋ÀîܹsùòåeË–q]K«‹/¶}.Ã0"‘ˆëÒÌ”ÿƒF0.\XµjÕöíÛGŒÁu-­Þ{ï=3ÿbРBª«s¸.ÄtÌü|‹¿̈™Ÿ/Œ¨¦¦ÁÛ;†R\\Ïã9p]‚þpâÒ%)ýþ•K—¤\×­À´´;lëóû~àºh…<S{òäù;%,˶´°wî?yòœëŠ€ä˜Þ¹s?[[·ž|¬­­rr~æ¶ `jbÍ÷»©T-bnë y&U\\YP ׺‘Š•JåÅÅ•–òL*+ë¿¶¶ÖÚKlm­³³âªÐ@€Iedˆ››ÕÚKš›Õéé¸Ëˆ{È0_-+-U´]^ZªJ妯´!ÀtÚ^,¢lm­³²þkúz@òL¤¥…ÍÌ”è\,¢š›Õâ––¾ò¸ó„<‘HJ*+_ØÚZÿío6:ÿ³µµ®¬|ñ㸮±OÃóìÀD^¾lÞ°á]ÍK±¸„òÎ;#µWà ,øžw ÜX»6™òï¯äºh…ëE@ò(ä‚< y„ €B!È @ò(ä‚< y„ €B!È @ò(ä‚< y„ €B!È @ò(ä‚< y„ €B!È @ò(ä‚< y„°,Ëu )===$$„ë*,˜ƒƒ7!¤¡áW® ±`iiiB¡ÐX[³1Ö†ú¦O?ý”ë,Ýÿq]€¥Š5î‘Ý2kÖ,®K€>Êèy€þ‚< y„ €B!Èhhh8räˆP(œ;w®P(Ü»woUUý‘@ ÉdFœËè4‡mÈd2µZ-ž?Þ©Â4¿¢T*;êçç·páÂmÛ¶öè^˜?Üo гX–ŠŠb&66ÖÕÕU¡Pääälذ!55ÕÖÖ–ëê,Æ—_~9zôhÍK†a¢££º¶ÁƒDEE1¢®®îÚµk›7o>{öl—7Ø àuñâÅòòò½{÷zzzòx<M›6%%%Y[[s]Z×éû`nø{wØÛÛ;j±²²bfîܹ]ÎÔüüüõë׿ùæ›<Ïç/_¾<33³_¿~Æ-Û² zVnnnPPΉ†žÑ4/ÕjuRR’P(\°`ÁÎ;kkkér@——}ÚîAi»Ë<Vh÷(Ðߺ{÷nHHˆ@ Ð9"*•Êð{btÈ€žUTTäááax´´´¼¼¼ØØØøøøgÏžíÛ·Oó£+W®$%%mݺõÔ©S¹¹¹ß|óMTTTFFFEE!$::ÚËËK{ÐV\\ŸÏOLL<}útppðîÝ»U*•@ ¸~ý:]!//oæÌ™gΜÑWƒŽ«W¯B²²²¨oyVVÖùóçcbbšššöïßßÁ=Ò'22òŸzðàö ÌEIII¹qãF\\Ü¡C‡òóó5ËCBB8°cÇŽË—/+ Sw¼r+´{èo=zT$EFFêS_ÏGÿ g544hŸ7é‡hBHNNŽ££#_¸paåÊ•žžž„7®^½º¡¡^È … ˜1c!dÉ’%šqmm­««ëܹsé4ƒ¶Ž9booO?ùNœ8±¹¹¹¾¾~úôéû÷ﯪªrvv¾víÚöíÛ÷íÛ§¯†.ÈÎÎ^½zõøñã ![¶l …J¥ÒÎÎî•{¤oƒ ãÆëì\„+W®¬ZµÊÛÛ›îך5kèò//¯ëׯ§¥¥íÙ³gôèÑáááo¿ý¶zeåVh÷(Ðÿc{{{5*>>^ûˆtâí6ä@Ïrvv~üøñ„ èËœœ¥R¹xñbíuþøã777:¦ƒÊÊÊ#FBìíí ! ÃèŒ;®®®îÔ©SR©T.—óù|º°ÿþ“'OÎÏÏ5j”µµµ···ºàÉ“';wîܹs§fIee%½û{Ôñ¹! …B3Ö !õõõžžžô¸(Š””‘H”žž>`À}½²r+´{¨aÆ‘öŽH×Þî@ô¬iÓ¦eggûùùÑÏ†ŽŽŽ¿üò‹Î:...åååô‚½øàììl¬6nÜ8~üøuëÖ3†eY???º|Ö¬Yß}÷]iiéìÙ³†1P}*~eeeÇ'uvvþàƒ¦M›F½¾¾^óÇÑžËÅÅ¥¬¬Œž^år¹fùÊ•+7oÞ>><{æææÒs·f@Ú´^Õjµ§s}Bš,IDAT§'ŸÏ/--ݽ{7!äÅ‹„éÓ§Ëd²¼¼¼9sæ¨ÁÑÑñæÍ› ©©©ÚSÓ´E—ûûû'%%Éd2¹\þÅ_DFFvæ=ëÃsùùù%''K¥Ò²²2í®õÌ™3>,‹ Å£Gâããé»Dôïrwè; ÚtŽˆéáÅãñ:”˜˜øñÇ755½õÖ[;vì Õ^géÒ¥111J¥òwÞÙ¸qc7¾{÷îèèhWWWÍ€¢}BLHHؼyóÁƒ;6vìØ+VÔ××òÉ'ÉÉÉ“'O.//§ín}5DDD$$$$&&FDDœ;wŽ.œ8qâš5k233œœ´ëÑ, U*•111uuu^^^qqq]}ÿ^Íð\¡¡¡uuuÛ·ogYvýúõ‰„._»v­½½=m¢ 4hÒ¤Iô4­o—»IßQÐ^G爘¾  ‹è÷£Ñ›j,”H$òôô\¶l×…@«N@€ïG€îR*•ÅÅʼn$""‚ëZZýðÃQQQm—/_¾\sSP/fGyÐݹsgÏž=aaaôæs0eÊ‹þc«›Ìሠú"______®«€¿˜ÃÁýE@ò(ä‚< ýd€nÑ<¸ÀÒ!º%66–ëŒÿ>Aÿ(ä‚< y„ €ú# !r°Ü–ãIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Field.html0000644000175000017500000031573212234777147030105 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Field Class Reference
        Glom::LayoutItem_Field Class Reference

        A LayoutItem that shows the data from a table field. More...

        Inheritance diagram for Glom::LayoutItem_Field:
        Collaboration diagram for Glom::LayoutItem_Field:

        Public Member Functions

         LayoutItem_Field ()
         
         LayoutItem_Field (const LayoutItem_Field& src)
         
        LayoutItem_Fieldoperator= (const LayoutItem_Field& src)
         
        virtual ~LayoutItem_Field ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        bool operator== (const LayoutItem_Field& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-user-visible name of the field. More...
         
        virtual Glib::ustring get_name () const
         Get the non-user-visible name of the field. More...
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the user-visible title for the field, in the user's current locale. More...
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         Get the user-visible title for the field, in the user's current locale. More...
         
        Glib::ustring get_title_or_name_no_custom (const Glib::ustring& locale) const
         
        sharedptr< const CustomTitleget_title_custom () const
         
        sharedptr< CustomTitleget_title_custom ()
         
        void set_title_custom (const sharedptr< CustomTitle >& title)
         
        virtual Glib::ustring get_layout_display_name () const
         Get a text representation for the field, such as Relationship::FieldName. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        void set_full_field_details (const sharedptr< const Field >& field)
         
        sharedptr< const Fieldget_full_field_details () const
         
        Field::glom_field_type get_glom_type () const
         Convenience function, to avoid use of get_full_field_details(). More...
         
        bool get_editable_and_allowed () const
         
        bool get_hidden () const
         For extra fields, needed for SQL queries. The user should never be able to make an item hidden - he can just remove it. More...
         
        void set_hidden (bool val=true)
         
        bool get_formatting_use_default () const
         Discover whether to use the default formatting for this field, instead of some custom per-layout-item field formatting. More...
         
        void set_formatting_use_default (bool use_default=true)
         Specify whether to use the default formatting for this field, instead of some custom per-layout-item field formatting. More...
         
        virtual const Formattingget_formatting_used () const
         Get the field formatting used by this layout item, which may be either custom field formatting or the default field formatting. More...
         
        virtual
        Formatting::HorizontalAlignment 
        get_formatting_used_horizontal_alignment (bool for_details_view=false) const
         Get the alignment for the formatting used (see get_formatting_used()), choosing an appropriate alignment if it is set to HORIZONTAL_ALIGNMENT_AUTO. More...
         
        bool get_formatting_used_has_translatable_choices () const
         A convenience method to discover whether the formatting that is used has custom choices with the values restricted to those choices, meaning that those choices could be translated. More...
         
        bool is_same_field (const sharedptr< const LayoutItem_Field >& field) const
         Compare the name, relationship, and related_relationship. More...
         
        - Public Member Functions inherited from Glom::LayoutItem_WithFormatting
         LayoutItem_WithFormatting ()
         
         LayoutItem_WithFormatting (const LayoutItem_WithFormatting& src)
         
        LayoutItem_WithFormattingoperator= (const LayoutItem_WithFormatting& src)
         
        virtual ~LayoutItem_WithFormatting ()
         
        bool operator== (const LayoutItem_WithFormatting& src) const
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         
        - Public Member Functions inherited from Glom::UsesRelationship
         UsesRelationship ()
         
         UsesRelationship (const UsesRelationship& src)
         
        UsesRelationshipoperator= (const UsesRelationship& src)
         
        virtual ~UsesRelationship ()
         
        bool operator== (const UsesRelationship& src) const
         
        bool get_has_relationship_name () const
         
        bool get_has_related_relationship_name () const
         
        Glib::ustring get_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        Glib::ustring get_related_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        sharedptr< const Relationshipget_relationship () const
         Return the relationship used by this item, if any, or a null sharedptr. More...
         
        void set_relationship (const sharedptr< const Relationship >& relationship)
         
        sharedptr< const Relationshipget_related_relationship () const
         Return the related relationship used by this item, if any, or a null sharedptr. More...
         
        void set_related_relationship (const sharedptr< const Relationship >& relationship)
         
        Glib::ustring get_table_used (const Glib::ustring& parent_table) const
         Returns either the parent_table, related to table, or doubly-related to-table. More...
         
        Glib::ustring get_title_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the title of the relationship that is actually used, falling back to the relationship's name. More...
         
        Glib::ustring get_title_singular_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the singular title of the relationship that is actually used, falling back to the regular (plural) title, and then to the relationship's name. More...
         
        Glib::ustring get_to_field_used () const
         
        Glib::ustring get_relationship_name_used () const
         Get the name of the related relationship used, if any, or the relationship if there is no related relationship, or an empty string if neither are used by this item. More...
         
        bool get_relationship_used_allows_edit () const
         Discover whether the relationship used allows the user to edit values in its to table. More...
         
        Glib::ustring get_sql_join_alias_name () const
         Get a name to use as an alias in SQL statements. More...
         
        Glib::ustring get_sql_table_or_join_alias_name (const Glib::ustring& parent_table) const
         Get the item's alias name, if it uses a relationship, or just get its table name. More...
         
        Glib::ustring get_relationship_display_name () const
         Get a human-readable representation of th relationship. More...
         

        Public Attributes

        bool m_priv_view
         
        bool m_priv_edit
         
        - Public Attributes inherited from Glom::LayoutItem_WithFormatting
        Formatting m_formatting
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        A LayoutItem that shows the data from a table field.

        The field may be in a known table, or in a to table of a relationship or related relatinoship. See UsesRelationship::get_relationship() and UsesRelationship::get_related_relationship() in the base class.

        get_title() returns either the title of the Field or the CustomTitle. You should not call get/set_title_original() or get/set_title_translation() on items of this type.

        Constructor & Destructor Documentation

        Glom::LayoutItem_Field::LayoutItem_Field ( )
        Glom::LayoutItem_Field::LayoutItem_Field ( const LayoutItem_Field src)
        virtual Glom::LayoutItem_Field::~LayoutItem_Field ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Field::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Implements Glom::LayoutItem.

        Reimplemented in Glom::LayoutItem_FieldSummary.

        bool Glom::LayoutItem_Field::get_editable_and_allowed ( ) const
        bool Glom::LayoutItem_Field::get_formatting_use_default ( ) const

        Discover whether to use the default formatting for this field, instead of some custom per-layout-item field formatting.

        virtual const Formatting& Glom::LayoutItem_Field::get_formatting_used ( ) const
        virtual

        Get the field formatting used by this layout item, which may be either custom field formatting or the default field formatting.

        Reimplemented from Glom::LayoutItem_WithFormatting.

        bool Glom::LayoutItem_Field::get_formatting_used_has_translatable_choices ( ) const

        A convenience method to discover whether the formatting that is used has custom choices with the values restricted to those choices, meaning that those choices could be translated.

        virtual Formatting::HorizontalAlignment Glom::LayoutItem_Field::get_formatting_used_horizontal_alignment ( bool  for_details_view = false) const
        virtual

        Get the alignment for the formatting used (see get_formatting_used()), choosing an appropriate alignment if it is set to HORIZONTAL_ALIGNMENT_AUTO.

        Note that this never returns HORIZONTAL_ALIGNMENT_AUTO.

        Parameters
        for_details_viewThis can change the effect of HORIZONTAL_ALIGNMENT_AUTO.

        Reimplemented from Glom::LayoutItem_WithFormatting.

        sharedptr<const Field> Glom::LayoutItem_Field::get_full_field_details ( ) const
        Field::glom_field_type Glom::LayoutItem_Field::get_glom_type ( ) const

        Convenience function, to avoid use of get_full_field_details().

        bool Glom::LayoutItem_Field::get_hidden ( ) const

        For extra fields, needed for SQL queries. The user should never be able to make an item hidden - he can just remove it.

        virtual Glib::ustring Glom::LayoutItem_Field::get_layout_display_name ( ) const
        virtual

        Get a text representation for the field, such as Relationship::FieldName.

        Reimplemented from Glom::LayoutItem.

        Reimplemented in Glom::LayoutItem_FieldSummary.

        virtual Glib::ustring Glom::LayoutItem_Field::get_name ( ) const
        virtual

        Get the non-user-visible name of the field.

        Reimplemented from Glom::TranslatableItem.

        virtual Glib::ustring Glom::LayoutItem_Field::get_part_type_name ( ) const
        virtual

        Implements Glom::LayoutItem.

        Reimplemented in Glom::LayoutItem_FieldSummary.

        virtual Glib::ustring Glom::LayoutItem_Field::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutItem.

        Reimplemented in Glom::LayoutItem_FieldSummary.

        virtual Glib::ustring Glom::LayoutItem_Field::get_title ( const Glib::ustring locale) const
        virtual

        Get the user-visible title for the field, in the user's current locale.

        This returns the name if no title is set.

        Reimplemented from Glom::TranslatableItem.

        Reimplemented in Glom::LayoutItem_FieldSummary.

        sharedptr<const CustomTitle> Glom::LayoutItem_Field::get_title_custom ( ) const
        sharedptr<CustomTitle> Glom::LayoutItem_Field::get_title_custom ( )
        virtual Glib::ustring Glom::LayoutItem_Field::get_title_or_name ( const Glib::ustring locale) const
        virtual

        Get the user-visible title for the field, in the user's current locale.

        Reimplemented from Glom::TranslatableItem.

        Reimplemented in Glom::LayoutItem_FieldSummary.

        Glib::ustring Glom::LayoutItem_Field::get_title_or_name_no_custom ( const Glib::ustring locale) const
        bool Glom::LayoutItem_Field::is_same_field ( const sharedptr< const LayoutItem_Field >&  field) const

        Compare the name, relationship, and related_relationship.

        LayoutItem_Field& Glom::LayoutItem_Field::operator= ( const LayoutItem_Field src)
        bool Glom::LayoutItem_Field::operator== ( const LayoutItem_Field src) const
        void Glom::LayoutItem_Field::set_formatting_use_default ( bool  use_default = true)

        Specify whether to use the default formatting for this field, instead of some custom per-layout-item field formatting.

        void Glom::LayoutItem_Field::set_full_field_details ( const sharedptr< const Field >&  field)
        void Glom::LayoutItem_Field::set_hidden ( bool  val = true)
        virtual void Glom::LayoutItem_Field::set_name ( const Glib::ustring name)
        virtual

        Set the non-user-visible name of the field.

        Reimplemented from Glom::TranslatableItem.

        void Glom::LayoutItem_Field::set_title_custom ( const sharedptr< CustomTitle >&  title)

        Member Data Documentation

        bool Glom::LayoutItem_Field::m_priv_edit
        bool Glom::LayoutItem_Field::m_priv_view

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_field.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1TableInfo__inherit__graph.png0000644000175000017500000001404212234777145031417 0ustar00murraycmurrayc00000000000000‰PNG  IHDRUuqµåûbKGDÿÿÿ ½§“×IDATxœíÝy\gúð™$ÜW¸›9T(ZWmQT,|¶‚Š”V‚(ÈQ)µ ²Tø¬ZªÖ´r‰\Š¢x£¢k»Šë*Š å–KP@ a~Ìog³„ÃIÈóýëÍÌ›wž™÷}`î †!™D!;i ÿ]ÿÈ.Èdä?2 ã‘Mv8@Ä\]]±£b‚ÉÎÎ&:—6älñÇÆCLLŒ¨š‚Q11¬\¹’÷ãùïææ&®`ÀøÊÉÉUS0*&¾ü‡ãdä?² òÙù€ì‚ü@v1ÿ;;;ÿö·¿*((®]»¶®®Ÿ…¢è½{÷D!‚E„‹øÀÖPmiiU›"ßDBÌ£‚¯ÁÑ.bÈquçÎ1thOOÏŽ;LMMõõõœœîܹƒ ‡Ã²µ1§13Äõ¿a ,]ºEÑ“'Oš˜˜Ô××'$$ØØØ<þ\AAAä!¶··ãMMÍ¢¢¢™3g"¢¦¦&ò!æQñá†Wªªªééé£]ÅÅÅ)))'Nœ°··ollTSSCkâ4–üOMM}ùòeEE…ŠŠ ‚ ºººñññ»wï¦ÑÆÒÚ°èt:QVUUåý((Š677ëèèHiûb#æQñá+OOO¼0ò®ÉÍÍÍÊÊZ´h‚ zzz;vìØ°aƒŠŠ Š¢Dk’i,ûÿ™™™øêñN¤ÓéT*•øÈáp uttV¯^ÝÚÚŠOGQôøñã,KMMmÛ¶mÇŽc2™êêêÁÁÁD…ŒŒ Þ‚ (ŠÞ¸qÃÈÈ(00ð¯ý«–––’’’••Õ‰'ˆ ,KKK+..Ÿx÷îÝyóæ)++'%%­=xð`p#(Š"¢««ÛÒÒ2d\^^ž±±1Nwuu}ýú51𨨨ɓ'kii±Ùlb#ð®Ѿ ÊÃn1 !þQñîÝ»7<ð‰‚ºIP¿†ï±óv 1KPÉËËWWW¹âÄþÿàÑØß߬§§g``””¤¨¨ˆïáó2ð>Z;"RRR„¬Úßé=ì ášššgΜ4ßÖ?ÿü³©©é;wÊËËííí]\\ˆ¹NNN---'OžDdÉ’%DùåË—†¥§§WVVòøZæýhccsóæM##£uëÖUUU566&%%)((ôööâšššrssi4Úû÷ï1 311 ihhÈÍÍ¥P(x³S§NÔHss3†aB*Ìž=ûáÇ?ž;wî’%KˆPcccÍÌÌŠ‹‹+**œœœˆ[ñyW„h_Heá[LWWWQÝÿ?l51Š!³~Üï|±ñ~Ä{„(`Ãuè¾}û¨Tª««ëÑ£GëêêøVœho4îÞ½ÛÜܼ¤¤¤¬¬ÌÖÖ–J¥âað-—øºðQŠçBww·ðnBþ÷þÿ±ä?F»uëo‹¸ööv"Pssó£GâJKKéèèÀçaÆårùʼ} (t¾~ÊÉÉÁ0ìÍ›7ŸX^^λÉN:E´OÔÒÒŠ‰‰Á+···s8¼Y!à!ðµÀ0ìþýû‚´µµámZZZfffâ³êêê¨TjWW& ÿ…Tógþ‹yT ž%¼÷» ¦„ä¿ >Â0ìÖ­[›7ož>}:Š¢³fͺ|ùòàÖøF£¹¹yZZ^íÑ£GDBò_È ÄsaX|ù?–ý&“ùüùsÞ&NójjjLMMñ2^¨­­Å?ªªª"B¡PøÊc`dd„ È›7oÂÂÂlmm™L¦¿¿?o¾ö<5iÒ$Ÿ'Ož{§B¶‚™™^˜6m‚ øÇªª*üIJ—Ë%6Â`B*‹p‹ ‚ºIP¿Š >êèè°¶¶ŽŽŽ~ôèQ]]Ýܹs¿üòËÁ‡{|£±¦¦ÆÄÄ/›››ÈÚ!ÿÉ…ÑË&vvv>xð þg A:^RRÂW‡ÅbUVVâe¼Àd2ǰ,áðMikk[YY¹oß¾W¯^]ºt‰·~ÇËÑѱºº:''‡Á`|þùçÄÒȰ***ðByy9Š¢†††øG&“™ŸŸÿ¡hooŸ2eŠ uUe $!£BP7 ê÷QÔGçÎÃë0ŒŸþ¹§§ß äÅ7 FUU^~ùò%ï,üõàÿBáØþ\Žå;ááá NNN÷îÝkhhÈËË‹ŒŒä«ãííýÓO?ݽ{÷ùóçßÿ½““ÓÏÛgddà…( «¿¿ÿ³Ï>377úô©——òŸ=ð!Íœ9344ÔÈÈhΜ9†)**Û~¡HH…ÐÐÐÇ—––°Ùlâz——WXXؽ{÷***üýýíìì† o„•%–„Œ AÝ$¨ß…#®âõ›Í¾téRCCCYYÙ–-[¬­­‡ý—îáá±k×®û÷ï?}ú?Ó‰ÿ Óé§OŸîììܽ{÷×nìx Fx¤‡aØŸþ¹zõjMMMeee'''üo9ï‘^___HHˆ–––»»;ßq”2‚ ééé¼ÞC¾ã4üã™3gŒlllΟ?ïàà0mÚ´Áíã1\¹rÅÊÊJQQÑÔÔôرcD5AØÚÚ***¶¶¶ YJff¦¦¦¦‡‡ßF e±XªªªÄé:ÞÀˆöGRYPYqÿcâƒW_x?îw¾/ò~Ä#º®C{zz¶oßnll,''Çb±<==›ššøZ<ß¿ ©©9yòdüdçÇ1 KKKÓ×××ÖÖÆ¯tð~}$C]8äÿQŒçT͉'V®\É;H56›|ð[`TˆAYYÙôéÓ›››µµµÇuA(Šfggos¸ÓHȈ?þxëÖ­oß¾mll ···ïä òrdgg—””0™L33³®®®„„ñÇ ¡÷f0áYYY]½z•Üàÿ?² òÙù€ì‚ü@v qþ÷ÉVP_ßýòeÇœ9zJJc¹cœ\µµµ,K$MIݨÀ0ìŋΦ¦ž… ?";É5DþóýBÐÖv;yR¿§çYw÷ãþþF²ÃWWW‘´#E£‚BQQV¶TVžA¥ª¶´‹k";"É…Â}]ÃzðàÏeËþŽ?”an®¿v­íW_ÍRSÑ ä@l¸Ü¢¢géé·¯]{‚aèÀÀ›=çÀ²ã’hÿ#”uêÔ}‡‹¢(•JAÄÁÁÊËËfÁóÁ1{ú´áÈ‘›ùùÿîêê¥Ñ(ýý\A”•åïÜ ×ÑQ%;:‰ù?"ÍÍoçÎÝÕÓÓGL‘—§öõqŒ´×¬™·zõ\MM!_ã¡»»//¯$-ívii-ÞÄ, …²}û²õëíI O*@þTLÌåèèK\îïD¾Ý… ¥é‰}éUZZ—–v+/¯äýû~ …ÂápyçR((“©yëÖv99é;e+fÿ#ÕÝÝgmýS[Û»!7˜¼<­¯3w®iVÖwŠŠrbN†üãW~ùå<±Ÿ?ôða¯åËgŠ5,é×ÿGJYY>,l¹ £ý¾>Š¢¾¾ ùÇ›ŸŸ­……À·ÉÉQçÌ™É?Bÿ£àæöé'ŸÒhCl4Eù… ÃN ”•åOœÐÓSò~ûöIÍ¥JÒAþŠ¢;w~ÍåòP(èúõöžžóH‰Jii©;¶NQQŽï¥w4eÕªyS§Â ?#ù?:³gOZ¶lï‰%¢££6kÖXÞ¾ ÆŒBA 4PA∠UP YBbTRòÔÂÃäÿwh4ê§Ÿš|ýõl?¿Ôýû/’˜ì¸ví©£ã~µŸ~úŠè E‚ƒµµá‚ÿ(P#""ÈŽAÊhh(½}ûþÁƒ?i4*“©™½ÎÑqº††RTÔ¹úú7öö– Ü4ŽÒÒnf.[631Ñgölãžžþ’’W(ŠÐcc=ð˱`¤FòÎPÀ§££{êÔm––Û««[ˆ‰.<21ÙêíÔÝÝKbl—;–Ç`lúõ× ÄÄo¾Ia06=û€Üð¤\ÿ£ììM›ÆøäCÞ‰÷ïW{{'j=ê§«+¹¿ú,Þ¿ï ʺxññÞ½n+W~Æ7ë×_/†…-'+6éù/b¯^µxz&p8™™þ¦¦zd‡3A´¶¾óñI~ñ¢1)ÉwÁ¸ÉRd ÿE¯½½ËÇ'ùÅ‹¦#GÖZ[›ŽÔ«¬löôLàp¸ééþpmO´àd‰èijª?¾î³ÏLV®~ <4ýýÜÐГÙÙDD¸øùÙ’ÎDù/%%¯¼½“&OÖIMõƒÔ„{ûöý·ß¦Þ½[ç¹dÉt²Ã™à ÿÅäÅ‹&Ã453Óòd]²Ã‘Puuí^^‰--ïRSýþòx¤bÜÁa•˜˜›ëŸ=»Y]]ÉÉéÀ½{Ud‡#‰?®ur:Àá Aò‹ä¿øèé©ååmœ={’»ûo……ed‡#Y ˾þ:ÎÔT÷Ì™@##qÿ ¶Ì‚ü+eeù#GÖººÎùæ›”#G~';IqäÈïß|“âè8ýرuÊd‡#CàúŸ¸Q©”¨(¶™™~XX^ee³Œ_À~ü1?9ùŸÁÁ[¶8ÀËÔÅ òŸ~~¶tºrpðñ¦¦ŽØXOYìˆ÷ïû7nÌ(,,‹‰YÅ÷H8ÿO¦ßáç—2e #5u­––lý‚@KË;Ÿ¤ŠŠ×II>ðHY ÿIV^Þèé™ ¢¢‘áÏbi’Ž˜TT¼^³&Ë€GzÈçÿH6uêGgÏÉËSœb=ª!;q(.~¹|ù:]ùìÙÍüä‚ü'Ÿ¾¾Æ©Sß[Y±V¬ˆ¿rå ÙጯÜÜ{î­Mrs7êéÁ+RHù/TTRSý\\fùú&§¥Ý&;œñ²ÿÅÀÀ¬5kl’“}••åÉÀù‰A£Qöîeô‘zhh΋M;wºL¤‹aýýÜ­[OääÜŒ„Gz$ä¿AQ48Ø‘ÅÒÚºõDggϯ¿®œ¿`ÙÙÙãç—ZRò*1Ñé‘(pþ_ݼùÜÏïÈ'Ÿ%%ùª«+’Ω­m_³&¡­­ é‘@ÿêéÓOÏ ¥Œ &“Nv8côða·w¢††rzú·pW¿‚óÊ‚qîÜ& ]¶ìïeeud‡3—/—®Xgf¦ôH,ÈÉõÑG¹¹LMu]\b‹Šž‘Îè$'ÿsíÚ#K—΀Gz$ìÿKºþ~î¦MYgÏ>Ü¿ßÝÕuÙá ˈˆ8’rsË–ÅðH„ƒóÿ’NNŽçib¢”U]ÝìHvDÂôôômØqõê“èhwx¤GòAþKüº “I É©­mß»×M2¯ ¾~ýÖÇ'©²²93ó» ÌÉ öÿ¥ÉõëÏüýSgÍ2NLôQS“¬ë‚OžÔ{z&Ðhx¤GŠ@þK™þôöNÒÑQËÈø–Á”ë‚EEϾû.ÕÔTïèÑoá®~)çÿ¥ÌÌ™FAýý—Ø/šÈA$=ý¶·w¢9<Ò#u ÿ¥‘‘ö™3AL&ÝÙùÅÅ/IŒðððS!!9^^óá‘iûÿÒª¯”uáÂ㘘U_}5Küôör3Ï{¿Ò#½¨dÇÆ‚J¥,[6£»»/2ò4‚`66fâ\z[[—‡GÂT>ìíæ×ù¤\ÿ“b(ŠîØá¤¯¯‘ßÐÐŦÑÄq@WUÕìá‘ÐÕÕ{òäx¤GªÁþÿDpáÂã Ò-šzðà%¥ñ=ÿ׿*}}SttTᑞ ò‚¸u«bíÚ Æ‘#kéôñºßþÊ•'iÓ¦1RS×™Nÿ¢]\\,þåvw˽z¥>uj;•:0N‹hmUjkS23kGQ†MNNŽø:±Aþ‹›Í¾qㆥ¥%ÙLÍÍÍOž<±*rpþo\XZZÂ…º~ýzdd$ÙQL@pÿ² òÙù€ì‚ü@vAþ » ÿÉÔÝÝ}èÐ!77·/¾øÂÍÍmïÞ½---ø,;;»òòr.Ën(‚agg×ÑÑ1x¢† øðáÃŽŽŽoß¾Cð`œÀõ?Ò`‚¢hdd$ƒÁhmm-((ذaCFF†œœœÈWPP€–/_cff† ˆ²²øÞÌ›——wàÀ55xA€ü'ÍÅ‹ëëë333¡Óé›6mòóó£RÇåÝ~ªªÿ½]WII‰÷£xôõõ1 1/ûÿ¤),,tqqÁ“Ÿ ªªJ¡ü·S¸\nrr²››Û—_~¹k×®ÎÎN|ºÝµkרlöÒ¥K¯^½êêêºlÙ²ƒ y Cª¨¨vvvvppðõõ½~ý:1ëæÍ›îîîNNN?þøã›7oˆé†eee­ZµÊÙÙ9""‚‰—ÝíÛ·Ùl¶³³ó©S§ð)‚¸¸¸tttZ) ~ÿ¤©¨¨055^';;ûÚµk‘‘‘ñññmmmûöí#f]¹r%999444++«°°0%%%$$$''§¡¡AíÛ·[YYñ†´sçN‹•püøq6›½gχƒÏ*((سgOlllKKKTTñ•üüüóçχ‡‡ÿöÛo}}}ÑÑÑC¶œŸŸŸ˜˜øÃ?ÄÇÇ÷÷÷á544„¬3Øÿ'Mww·††ñÿ‰ HAA±s~áÂooo A}}}»»»ñƒv777uuõ… "âîîN”;;; Æ_|·@†tèÐ!%%%|cÆŒýýý]]]xT&&&‚lÚ´Éßߟ8owúôi___üé†àà`77·ÞÞ^¾–étú‚ ¸\.ßš Y) fÿ¤ÑÖÖ®©©ùøãñ½½½®®®¼u^¿~Íd2ñ2^hnnž4i‚ JJJ‚à¿®Ã[•wïÞeee•––ÖÕÕ±X,ÞYxÁÈÈA¶¶6ücccã®]»víÚEÔlnnæû.‚ :::‚B²R@Ì ÿI3þüÓ§O/^¼ÿ÷«ªªúèÑ#¾:ºººõõõø<¾c¯­-ÊWnZZZ®[·ÎÜÜðŋ³êêêtuu©©©AQ/ã¬_¿~þüù‚`ÖÕÕ5ä©D!ŒÆ{¥ÀÈÁñ?i¼¼¼Z[[·mÛV^^ÞÚÚzóæÍ£GòÕqppHOOöìYmmíæÍ›7Âóö………xj…!q¹\ ‹U]]½gÏAˆýü„„„ÊÊʪªª˜˜˜E‹ûçÉÉÉåååuuuû÷ïß¼yóhW|Ì+Dþÿ“†N§ÇÅÅ%$$üðÃ}}}³fÍŠˆˆX½z5oU«Võôô„‡‡÷öö~úé§#l|Ïž=Û·og0DaÈj[¶l‰MJJš2eÊš5kºººvìØÿZ±bEHHHoo¯µµuPPñ•Õ«W÷öö†‡‡¿{÷ÎÊÊjçΣ]ñ1¯9xÿ‡è±Ùìææfxþ_„ðçÿa¬Šìÿ » ÿ]ÿÈ.Èdä?² òÙù€ì‚ü@vÁýãâÆÄó|H,¸ÿOôŠ‹‹kjjÈŽbrss#;„‰òÙÇÿÈ.Èdä?² òÙõ8Ü䌰ÊRƒIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__CalendarPortal__inherit__graph.png0000644000175000017500000003120212234777146034760 0ustar00murraycmurrayc00000000000000‰PNG  IHDROm˘bKGDÿÿÿ ½§“ IDATxœíÝkX׺ð5I”‹ÃÍK(J•ZOí¶‚JÅC‹—l¤rQ ¢‹X«mÅV´h¥õÔVwQ±Šèm­ÝhP±Z-ÈE   @’9ÆŽÙ!„pËÖû{ü°²2¬yg2ÿdf2 ’$,¦ h ¤\@ÚÀ¤\@ÚÀÅ¥=%%…‹SÛèo8í»’““µ_è »wïfºШH»¯¯¯öë}!55•é@?ÇíàÒ. íàÒ. í࢛ioll\·n•••žžž••UPPPEEõAyyy½W!Rù5r/΢‡£Q[[Û¥1{}  ßÀuJ.—Ï;— ‘H4f̘‡´îìÉ'&&®ZµŠŠ:Çã±Ùlú¡T* ·²²277÷÷÷¯««£ú ‚8vì˜@ 022Ú°aCRRŸÏ766 ¥'HHHPlt„ ˆ¬¬,kkë5kÖ¸¹¹™šš8::¦¤¤Ðœ:uJ ˜ššîÝ»—ê‹ÅNNN†††£Gމ‰¡GËÏÏo?A! ‹ÚÚZ•PŽ?>zôhçííýèÑ#ºŸ$É;vØØØ˜ššúøøÐ+Aqèñ;š¸Ó5€¦HÔ5³dgLLL222:z!$‹·oßnkk›““SPP0kÖ,OOOúY¡PX[[+‰BsæÌ¡ÛÅÅÅ$IÆÇÇ—””(6”FV|èìì|ùòekkëÒÒÒªªª˜˜==½––jww÷êêê´´4‡óüùs’$ÇŒ³~ýúÊÊÊ´´4‹UUUE ;nܸŽ©©©!IRÍ“'O¾qãÆÍ›7§N:gκÔ={öØÙÙegg …Booïö B¯fbõkL ooozº“v‡såÊ•—CüM"‘oÊöööqqqÔ·nÝB544PÏ^¼x‘$I™L¦ÔVL²êZÛ¥=55•$Éúúz©TJuÐùA8q‚Ÿê455ݽ{75±D"‘J¥Ô°j¡j& –‚$Ék×®!„?~L9~üøÄÄDê©ŠŠ 6›ÝÔÔDvv5w{AÚ¢îìÉóùüÂÂBÅÓ'äieee¶¶¶T›j”——S¹\.BˆÅb)µ»ÁÚÚ!T__îââÂç󃃃'°´´T?**jÇŽ£FZºtéíÛ·é£5ƒt:Õppp@UVVRKKK¨/,--e2½ÚS3q/®1€³îl4QQQÔÇ BˆÇã]½zUi@PRRBµ©ŸÏïAªQ½‹‹KIIÉÎ;ïÝ»wîÜ9Å ¨cE³gϾÿ~jjêÈ‘#gΜI¿O©¤Ó ŠŠŠ¨FAAAVVVÔC>ŸŸžžN½­Êår‰D2vìØŽ–¥KÐ ÝIû¦M›*++…Ba^^^eeåñãÇ#""”¦Y²dÉÖ­[ÅbqaaáêÕ«…B¡†çÒJKKjkk›2eн½ý;wÑßûÒ*Mš4),,ÌÚÚú7Þ IR__¿ÓA¨¯ÕLvóæÍ[·n­\¹ÒÇLJþv0000<<›ÍBÉdr‘HÌt9hviOIËdr„I¢[·*JJj˜®-Á+íU……Uô‰ÉAƒØ'O^g¶$´¯´gd\4èåÏ`·µÉRR~g°´ £´“$™’"nk“)vÞ¿_÷çŸÊ?¡ À€„QÚoÜ(«¨(uÄ9qÎÌ,`”öôôkŠ»ñ”¶6ijªÃKŒ†pI»L&OKËSÚ§ÔÔ<ÉË»§õŠÐ6\Òž“SRWפò©AƒØp™ À.i?}:!bð`õoÐ 6Ý–ÉÈŒŒëÔ—ð `}ò0÷CŽŽ–_|1~yúÝw_?þå_S_ßlfÆe¢4´Ç{àB|þ§ÑÑK<<&1]ڃ˞<Ò. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ.’$»ýÇÙÙÙ»víêÅj´¦¢ÂÈÔô¹AÓ…t™““ÓÚµk™®è¤}¶—••‰D¢Þ*E›,-ŸèbÔsrr²³³™®è*NχHMMíù @>>>L—t·€ H;¸€´€ H;¸€´€ -¥½±±qݺuVVVzzzVVVAAAÔSAäååõâ¼z}À~8GºAi—ËåsçÎÍÍ͉Dååå§OŸÖ××wvvniiÑÂÜ”^ø¾½S±±±ÅÅÅEEEC† AYXXìÛ·/22’ÃÑÆÜûA555æææöÀ8m|¶'&&®ZµŠŠ:Çã±Ùlú¡T* ·²²277÷÷÷¯««£ú ‚8vì˜@ 022Ú°aCRRŸÏ766 ¥'HHHPl´—ŸŸïææfjjj``àè蘒’‚š7o}ÙoNN޹¹ù³gÏ:ª¡¶¶V±MBÈ‚¥ûI’ܱc‡©©©æK@_!{ 99Y“LLL222:z!$‹·oßnkk›““SPP0kÖ,OOOúY¡PX[[K]¢;gκ]\\L’d|||II‰bƒPqãÆ )--­ªªŠ‰‰ÑÓÓkii‰urr¢&øøãW¬X¡¦†šš¥¶R'=GºÏž=vvvÙÙÙEEEB¡ÐÛÛ[Ã%RÃÛÛ›€®ÒFÚ9Ε+W^Îòo‰„ü;*öööqqqÔ·nÝB544PÏ^¼x‘$I™L¦ÔVŠ´âøJOÕ××K¥Rª]PP@²¾¾^__¿¼¼\&“ñùü¬¬,55t#íãÇOLL¤:+**ØlvSSS÷–ˆi=¡=y>Ÿ_XX¨rú„<­¬¬ÌÖÖ–jSòòrê!—ËE±X,¥¶æêëëÃÃÃ]\\ø|~pp0Õ9tèP77·´´´K—.q8œ3f¨©¡JKK‚ ÂÒÒR&“õâÐ ÚØÈ<<<¢¢¢¨/„Ç»zõªÒ4 ¤¤„jS >Ÿß[¸¸¸”””ìܹóÞ½{çΣû}}}E"Qrrò¢E‹‚PSI’¨‹áçóùéééÔ{ª\.—H$cÇŽí­% ´‘öM›6UVV …¼¼¼ÊÊÊãÇGDD(M³dÉ’­[·ŠÅâÂÂÂÕ«W …B§Éà ¥¥¥Š „ÐÓ§Oëÿ&“ÉÚÚÚ¦L™booçÎÀÀ@„ÐãÇBóçÏÏËË;v옿¿¿šx<ÞÉ“'###g-‘HT–Dõ†‡‡çå建ºveÐzr áq;I’<ð÷÷711144 …Ô'§âq{kkëúõë---MMM-ZÔÑ!qû6B(>>^©¡H,gddŒ=ZOOÏÙÙùÌ™3îîîÔ8&L ÚÕpäÈ‘áÇ›™™Qçü©~}}ýºº:¥ÂèþÖÖÖ°°0@ÀårÝÝÝé3p.‘pÜz¢G¿]“’’²pឌÀ8OOÏ)S¦lܸ‘éB4BÝß?(ºß“CÍÍ͹¹¹?ýôS@@Óµ  ø¦=33ÓÍÍmóæÍ£Fbº´A‡¯]í!//////¦«@{ðýl7vpi˜¦½­MÆt h¦iÿx€›^8'OÝÔ­SXǰeˇ--˜®¤Ë¼½½™.èª]KW^^þÛo¿õb5ÚqçNýw¦L±ð÷·cº–.³²²rrrbº  “z”vµzuÂñãW ônßþzð`|¯8¸Á©©åÔ©$‰ž=kýé§?™.íÁ.íçÏß–Je!‹uü¸òmö `Ø¥=--:­(“É~ùåvcãs¦+@KðJ»DÒôë¯Édrê¡L&?{ö&³% 5x¥=3ó¦\þò!Aiið¼\à•v‘(¡—ßAÈdò+WîÖÔÿÓèè%“˜.íÁeOivpivpivpivpivpivpivpivpivpivpivpivpivpivpivpivpiœ®þAJJJ_Ô¡eVVÜ7~þ¼éBzÊÙÙY ôd„ììì²²²Þªô+¾¾¾ÿõ˜ì"†Êª%''wõTâííÍôB€¾¢ôZwù³!”œœ¬üž˜@D¯ŒãííššÚ+C~"%%eáÂ…JpÜ. íàÒ. íàÒ. íࢯÒÞØØ¸nÝ:+++===++«   ŠŠ ê)‚ òòòzq^½> &Ô,à@ÅìkÚóY œœœÔ¨á¥R)Aµµµ=©šÒ ½52­OÒ.—ËçΛ››+‰ÊËËOŸ>­¯¯ïììÜÒÒÒ³Ó¾¿€í ŒE¾xñ¢D"‘H$………“&MZ°`T*íá˜l6;>>ÞÈȨW*ìÛ‘»q-]§×o>|xĈOŸ>Uì”H$R©”A,wu¾êKêÝ;šKMM ÕV¿€Z£ÉkÑ)oooooïN'cü5íù,”F¨««Cj^ƒÒ³ôöÐ+zwÀäääöéî“ÏöÄÄÄU«V 2D±“Çã±Ùlú¡T* ·²²277÷÷÷§V=Bˆ ˆcÇŽ ##£ 6$%%ñù|ccãÐÐPz‚„„ÅF{ùùùnnn¦¦¦ŽŽŽÔµýóæÍÛµk5ANN޹¹ù³gÏ:ªÞ}¢ÚÔUkT¿ú$"++ËÚÚúàÁƒŽO5Ž?nccÃãñ|}}é‰û Æ_SšX,vrr244=ztLL I’;vì°±±155õññ¡gª4Yûq¨Ê9NG#PTnKJÛõ"ªYüS§N SSÓ½{÷ª)O$1ÂÌÌìûï¿§ÿ¶77®¾g >OLLL222ÔŒ ‹·oßnkk›““SPP0kÖ,OOOúY¡PX[[+‰BsæÌ¡ÛÅÅÅ$IÆÇÇ—””(6P»÷àqãÆ…„„”––VUUÅÄÄèééµ´´ÄÆÆ:99Q|üñÇ+V¬PSý.K·;;]@ggçË—/oÞ¼¹Kã;88äääܾ}{Ú´ióçÏW¿’Ií~¶3þšÒ=cÆŒY¿~}eeeZZ‹Å ·³³ËÎÎ.** …ô²(MVUU¥8fccãçŸþæ›o’$¹gÏ•#PÓ«Ü–HU/¢šÅwww¯®®NKKãp8ÏŸ?屮wß}÷ñãÇÉÉÉôdÝÞí.`jj*I’]?66–êÌÏϧ'VC›igü5¥{LMMwïÞMuJ$’qãÆ%&&R+**ØlvSSSûÉÚŸ³Ù쬬,’$ǯrjŽ*·%RÕ‹¨fñOœ8A/2õW*Ë»víšÒdÝÞ<´·'Ïçó _ÞL*‘HÚŸ¯.++³µµ¥ÚT£¼¼œzÈårB,K©­¹úúúððp>ŸLu:ÔÍÍ---íÒ¥KgÆŒjjèáZ[[«_F•è‰Ç§y1ÚÁøkŠþÞŽŠŠÚ±cǨQ£–.]zûöíPgÚ---e25S¥É¨ývú,]uuuDDÄ‚ ž>}ZZZªrŠÊmI%5‹oii©´È*Ë£n^îhÍô|óè“´{xxDEEQoQ!wõêU¥iAII Õ¦|>¿· pqq)))Ù¹sç½{÷Î;G÷ûúúŠD¢äääE‹¡¦êÝ´£ÚéR/XWÇ/..¦wïÞE½ºBzN˯é¨Q£JKKé‡Ô ±±±AÍž=ûþýû©©©#GŽœ9s&I’éééÔg—\.—H$cÇŽm?õÞÄåry<Ç6lXhhh]]ÝÝ»wù|¾Ê(mKí©Yüöw+ª,OýM½°y¨ÙP i°÷X]]-fÏž-‹>|˜––6yòdôß{}[·nµ··ÿý÷ß©ƒ¡PHOï©l«<ƣ߳©¢‘#G~ûí·uuuùùùÔ͹$I644ðx¼üü|’$;ªÇã:t¨¡¡!$$)ìJÑço5YÀnŒogg÷ûï¿ß¾}{ÆŒôÄ=|-:¥áž¼–_Ó-[¶ØÚÚž;w®²²2;;{êÔ© , þjôèÑŸ|òIee¥H$âp8kÖ¬qtt‹ÅwïÞ]¾|ù¤I“TNFëR:: âüùó*G ¦ïh[RܨQÃŧ^n•å©9~ìêæ¡½ãv’$>^©¡H,gddŒ=ZOOÏÙÙùÌ™3îîîÔ8&L ÚÕpäÈ‘áÇ›™™Q燩~}}ýºº: °«ã#„¶oßngggllìååõèÑ£Þz-ÔÓ0í¤v_S©Túí·ß:88ØØØ¬[·®±±‘ú«óçÏ;::êëëÛÚÚ&%%µ¶¶†…… .—ëîîNök?™Ò¬)o½õVuuµÊÔoKŠÛõ"j¸øT¿ÊòÔ§½K›‡VÓÞoÍŸ??22’é*Th¿-jò'ÚL;`PW7í¥ëŸš››sssúé§€€¦k€Ýù¥*•™™¹téÒÍ›75ŠéZT á7ÿ@ÇzeóÀ(í^^^^^^LWc0Ú“svpivuÚÚd­­=½ÿhAS“.Ýfϔ۽{7>ÿÙÀ;æ\nëðáMƒ˘®¥¯äääøøø0]Ew$Q[kPYɵ·l`ïË/©¼è»ËiÇí?9òÉŸZ”•™›?ãóŸr¹­LWô’···••Uqrrê•b´¬µ•UU5¤ªŠÛÖÆ1¢ ¢®D ´*_óvÊËk_vv‡Ã’Jå'Z}ø¡ëœ9 bwþ— üñGÙ¡C—Nž¼N’¤L&<˜“›>|øP¦ëÒöÎݹóÐÍí[jE±XBÈÈHÿ½÷œ—-›Îçó˜®ÏŸ·‰Dy?üpù¯¿* bµµÉBl6kõj·Ï?ŸÃtuºÒ®‘+â23oJ¥/Ý9I¢9s^]¾ÜeÊ”1 Ö6àUVÖÿðóŸ!„äò—[¬‘‘¾Xü¥±±>sÕéH»F<¨›6m›L&Wê§vï'L°\²dšÏ?ôô0º6Q ÄâÒC‡²23o’J•W>‹E„‡{„„Ìd¢4i×ÔÚµÇD"qûm½Èh»­MÅ·!LL¸bñ&ƒÁÚ/OGÁ÷íšúüó9ý´ˆT*'rñbgˆzo!âÃ] ·ßŸ¢' › QïH»¦FŒºr¥«â*Ó‚øè#·5kÜ´_Õ6q¢Urò‡ƒ±©3£ŠX,bÔ(s?¿7)LwAÚ»àÃÿ×ÐpR'‹Åòó{3,l.#% l“':thAýWàårþO6¶Þ®õÕÆÆúü¶âG ›Í²·6fÌ0õ¿ºmØ0£ øñòì›Ízí5Áœ9¯2X•Ž‚´wMP‹™—Š6‡Ãš:ÕvÁ‚7"#OmÛvÎwöº+Wм½÷nÚ4Ÿ~?•Éä_~9ŸÙÂt|cÔ5zzœÐÐÙ7Š8–ÅáÃËŒ “O>9úðaýîÝ~p]o9yòúš5‰ LÞ¹s!‡Ãª®n8t( !âÍ7ÇLjËtuº©ç¿‡›ÖVéoDLž¼¥ªêåÖqùr½ýúÅ‹67·0XÛ€qàÀ¯|þ§ér¹œê‘Ëå}”Àçzýú}fkÓ]ð}{wüòËm[Ûa£G›+v^¿þ`ñ⃣G›ÇÇ`b2¤£¿ŠŒ<½oß/_|!\µêû¥RùÑ£9ÎL¦ë í½©°°ÊÏ±~RRȈpŸF—ÉådxxÚ‘#¿mÛæ ©îuö^VVöØÏ/Z*•'%­°±±`º]ÒÖ&ûøã£™™ìß8{6œrï}öÞWSó$ àÀ£G‰‰+&L°dºÝðôiËûïÿŸÿÇ—O›fÇt9¤½O45µ¼ÿþ7n”9²îëÔãÇM‹|ðàqBBðk¯õô÷9@Gàûö>1dˆ^|ü..c}}÷gfÞdºœ~­²²~Á‚½ÕÕÇQïSö¾2x0gÿþ@oï7‚ƒcËeºœ~ª¤¤ÆÓsL&?yr½ýp¦Ëààêš>Äf³vîô51š\_ÿ îÄVrëVE@Àkk³øøxŒôj 'nΜùãÃãgÏvܳç=¸ÖXk íZâãó¡C BB޼ÌÅeÓåô¾ºº§ï½w°ºº1))dܸL—ƒ;øþƒIƒü1ÈÍm|``ÌéÓ7˜.§—UTHÞ}wOcãóôôÕõþÒΰAƒØQQ‹—-›¾rå‘ÄÄl¦Ëé5wîT …ßëé :qbµµµÓå„àêšþ€ ˆ/¿œonÎýüóÔúúæðEôÕ«÷/>4n܈¸¸åÆÆL—^€´÷«Výï!úááiUU_}å©»?PŸ•UôÃÌ™QQ‹† ¬£YºtÚðáÆ+Wil|öÝw‹8Ý;Î:u*ÿ£¼¼ÞعÓ®Šíoàœ|¿óŸÿÜ}ÿýÃÎÎöÑÑúúÊÿU–½aƒ(8ø­ððêî¾Éiïòó¼÷ÞA‡‘?þ¤+wƒ~÷ÝÙ]»~‚ àû3H{?u÷nµŸ_´¹¹QBB°¹9—érÔ‘ËÉ/¿L‹ûÏ·ß.òõýÓå€AÚû¯òr‰Ÿ_´T*KJ QúŸ*ú¶6ÙÚµÇNŸÎŽ^âîîÈt9@H{¿V_ß¼xñÁòrÉÑ£!¯¼2’ér”=Þ¶bE\NNñ?ÁÏB÷öþ®©©%(èÇ7Êâã—¿ñ† Óå¼ÔØø|éÒ˜»w«ƒ'N„ߊÕvÐÚ*ý裄âc+IDAT„ î:´ÌÕÕérB¨ººÁÏïÀ“'Ï“’Bììø=||#ª¨«~÷ÝÉK—Ædd\gºtï^íüù{>ý1D]‡ÀÕ5ºÍf}óψÆ«V%Ô×?cðD¼}û¡¿´••YBÂC‡ÂÏBëH»Î "4t6g¸q£¨¬ìñ_µ_ƒX\óúëÖ‡-34¬ý@O@ÚuLP g¸ví±ææÖ­[ßÕæU_¸pçƒbß~{ž=ð³ÐºÒ®{¼¼Þ066X±"®¡¡y÷n?íïäÉëkÖ$úù½ ? ­«àœ¼®ÊÉ)^º4æÍ7mXÒ×—Ó<˜q®ŠÕuvö×_•~~,-yññ˜˜ôÕUGFžÞ¿ÿÂÖ­ –-›ÞG³Ú»d:ÌÁadJÊÊÊʆ¥KËå}ò®ýktôÅo¾ñ…¨X¶Œ»2Ùl#Ǽ¥¥Tçײääd___¦«`îgé>ùä'''¦«}náÂ…L—À<ÜÓîää„ùû=& íŽÛÀ¤\@ÚÀ¤\@ÚÀ¤½sëÖ­³²²ÒÓÓ³²² ª¨¨ ž""//¯çÕëö‡9 x<žP(,-íµ/ðµ¿Æt¤½r¹|îܹ¹¹¹"‘¨¼¼üôéÓúúúÎÎÎ---L—¦K.^¼(‘H$Inn.‹Åòòòbº"áþ}{§bcc‹‹‹‹ŠŠ† ‚²°°Ø·o_dd$‡£Ã«Ž ˆššssåß±í¨¿ç¸\.ÇCñx¼ðùüòòr@ÐíRA7Àg{'W­ZEEÆãñØì—÷™J¥Òððp+++sssÿºº:ªŸ ˆcÇŽ ##£ 6$%%ñù|ccãÐÐPz‚„„ÅF{ùùùnnn¦¦¦ŽŽŽ)))¡yóæíÚµ‹š ''ÇÜÜüÙ³gÕP[[«Ø¦®¶°° ûégé~’$wìØacccjjêãã£ùi‚z£lmmU³Þ²²²¬­­KR¹@×C%''«ŸÆÄÄ$##CÍb±xûöí¶¶¶999³fÍòôô¤Ÿ …µµµ"‘!4gκ]\\L’d|||II‰bƒPqãÆ )--­ªªŠ‰‰ÑÓÓkii‰urr¢&øøãW¬X¡¦†šš¥¶R'=GºÏž=vvvÙÙÙEEEB¡ÐÛÛ[Ã%R³–¨vuuu@@€½½½L&SS³³³óåË—›››é’T®•k¬£:}­Ÿ_XXH?”H$ô yZYY™­­-Õ¦åååÔC.—‹b±XJmÍÕ×ׇ‡‡»¸¸ðùüàà`ªsèСnnniii—.]âp83fÌPSC7”––PgÑ---e2Y—ˆ>K×ÜÜ|íÚµ×^{ ©]oÖÖÖš¬Ð%öNxxxDEEQ_!wõêU¥iAII Õ¦|>¿· pqq)))Ù¹sç½{÷Î;G÷ûúúŠD¢äääE‹¡¦’$QÃÏçóÓÓÓ©¹\.‘HÆŽÛ“¥ ÎÒñx<}ý—ÿ‰¥ššÛ¿ƒt´€æ íØ´iSee¥P(ÌËË«¬¬<~üxDD„Ò4K–,Ùºu«X,.,,\½zµP(¤Î?w*!!úæ™n „ž>}Zÿ7™LÖÖÖ6eÊ{{û;wî"„?~Œš?~^^Þ±cÇüýýÕÔÀãñNž<ÙØØ©8k‰D¢²$ª?000<<…Û[[[ׯ_oiiijjºhÑ¢Ž‰Û·BñññJ Eb±8##côèÑzzzÎÎÎgΜqwwwpp Æñðð˜0aÕ#GŽ >ÜÌÌŒ:çOõ»¸¸èëë×ÕÕ)F÷·¶¶†…… .—ëîîNŸët‰:ZÏ*ŸÕd½Ñ%u´ÔÏZ±8nÇý·ktú÷L<==§L™²qãF¦ ѺþZ÷ Ø“×IÍÍ͹¹¹?ýôS@@Óµ¼pöìYB•ððp¦K/èða8ËÌÌ\ºtéæÍ›GÅt-/Ìž=çýDi×I^^^p©9è*Ø“vpivì´´H™.0÷³tÙÙÙL— m'NÜûç?­9x£ÇîW×0]‚¶{ذàúú³ã?{긺ë´cèßÿ¾ñÁ±Bᤃ—0] Ð6ØÃKzú5„Ðùó67·2] Ð6H;FŸýôÓŸ¡ÖVifæL—´ ÒŽ‘ÌÌ›ÔóNDZü*3v íIMÍCˆDÉdòË—ï>~ÜÄtE@« í¸xôèINN‘Löò¤ìéÓ7¬h¤§N]g±^~ãH’¤H$f° }v\¤¦Š©ƒvŠ\N^½z¿¬ ~ì #v,Ü¿_wóf…bÚBl6ëÔ©|¦JÚiÇBzúµö—ÊÊd²ÔTؙǤ ÉÉ¿·µÉ”:ITT1RÐ>HûÀwçÎÃ{÷jU>5h;#㺖ëL´|ù©¾ÿ§­M&Áe6¸ÀýŽW´µÉþùÏ×è‡üQ6j”ÙС†tÏ£GO† 3b¢4 UpvøüO££—xxLbº m°'. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íà‚ I’éúÖ®]»²³³™®¢É͵´·ljúŒéBú‘ÔÔT¦KІŸvŸ¬¬¬ñãÇ3]èjjjnß¾=àS@á0]€6Œ?~Ë–-LWú£_ý5""‚é*´ŽÛÀ¤\@ÚÀ¤\@ÚÀ¤ý¥æææýû÷ûúú¾ýöÛ¾¾¾ß|óMmm-õ”««kAAA/Ϋ×ì's¼ÿ~XXØìÙ³,XðÝwß577÷]I®®® Ýþs AÚ_ Irýúõwî܉ˆˆHMMݾ}ûàÁƒW­ZÕÖÖÆti:ãÉ“'Ÿ|ò‰]BBÂÿýßÿ}ÿý÷L^‚´¿pöìÙ‡~óÍ7¯¼ò dzµµýä“O>Ìf³™.­û:úôë£OÅ””›åË—›››ÛÛÛöÙg.\Pÿñ´ ÒþÂÏ?ÿìé驯¯¯ØÉårY¬—«H&“>|Ø××wþüù_ýucc#Õïêêz៹sç:tè—_~ñööž7o^TT=ÁÏ?ÿ¬Øh¯¨¨(44ÔÃÃÃÝÝ}Ù²e¿þú+B(,,Œ¾¨óöíÛóçÏoiié¨:ÀTÛÕÕ!äéé©lÅ~’$=êçççáá±eËÍ—H¥+W®¼ýöÛôÃ1cÆœ8qB___å¢ÑÔÔðÛo¿ùøøxxxœ8q!ÔÖÖ¶wïÞwß}×ÓÓóøñãjÖõç7nÜX¸paff¦šš±i¡¨¨ÈÖÖVý4ÉÉÉ.\ˆˆˆØ·oßãÇwîÜI?uþüùLJ……=zôçŸþá‡Ö¯_ŸššZYY‰Ú¸q££££b£½¯¾úJ >>Û¶m“J¥®®®YYYÔ.\xë­·ÒÒÒ:ªAÉÅ‹BéééC‡í¨?==ýÌ™3›6mŠŽŽnmmݵk—†K¤ÒÇGŒ¡ØC½]ª\4z55¤§§:tè³Ï>Û·o_[[[||üåË—¿ú꫽{÷^ºtIÍz£ž:tèPxxø¬Y³:*7X\9«‰ææfÅTP€¡S§Nq¹\ª™™¹dÉ’W^y!´fÍšeË–577"„|}}g̘Z´hÝnll9r$ý‰§øÑ§dÿþýÔ®ÄĉÛÚÚššš¦OŸ¾k×®ÚÚZ33³_ýuóæÍ;wî쨆n8yòä²e˨›BCC}}}[ZZôôô:]"•£utµ¹ÊE£×¶š<<|¸Fkö¦M›vòäÉwÞy‡ú”àr¹üñ‡Ò4>¤vÅ©Z33³Þ*`Íš5ãÇ ±··'IòwÞ¡úgΜùïÿûþýû³fÍ"BM ÔGkMMæ3533ûðçM›FýySS½#Ó S§N={öìœ9s¨‡÷îÝ{ÿý÷322:Z´NkPz±°°(//§>®+**¨N5ƒwõ wÀƒãöëêê6lØPPPPWWwùò常8¥iÜÝÝãããÿúë¯òòòï¿ÿÞÉÉIÃlüüóÏT2éBèÙ³gOÿ&—Ëe2Ù+¯¼"îß¿¿mÛ6„Г'OBÓ§O/((¸pá‚›››š¸\î•+Wš››gM ÒÕïîî~øðá‚‚‚ŠŠŠï¾ûîÓO?íÊ:SæççWRRýèÑ£ÒÒÒÝ»wOŸ>Ëåv´hÍkxçwââânݺU^^NŸ/T?8PŸí/ðx¼½{÷kmm}ýõ×·lÙâïï¯8ŸŸß³gÏ6mÚÔÒÒòücÍš5¾mÛ¶7Ž9’n „7ëèèèµk×îÙ³'&&fìØ±‹/njjúâ‹/âââ 'OžüðáCê$bG5¬^½:::úàÁƒ«W¯ÎÈÈ :'Nœ$‰ŒŒŒë¡ûýýý[ZZ6mÚôôéSGGǯ¾úª»ë!„x<Þ¿þõ¯ýû÷N:uåÊ•¡Žú+Íkð÷÷úôéæÍ›I’\¹re^^^§ƒEXüšEMMNßßþÊ+¯0]ÈDÝß>àS@Ïö~­¥¥¥¤¤$//oõêÕL×òÂï¿ÿ¾~ýúöýï½÷u’ô[ö~-77wÇŽýçôò”)S¨oìδ÷k......LW8'. íàöäu}‘/BhÈ!¯¾úêš5k:º¸µƒGGG7®WFÌ‚´»wï¶³³CI$’èèè/¿üòàÁƒLúØ“ ¸\.—˵²²Z»víÝ»w5¼~~þ+ðÙ>ÐP?¿!•Je2Yllì¹sçè«îŒB®®®ÿú׿¶mÛöèÑ#„§§gzzzMMÍþýûïÞ½ÛÒÒÂçó—,Y2sæLfô:ølPêëë÷íÛ'FŒ¡æn|êÆï³gÏ¢¿otW :à³}  ¡AØÙÙmÙ²… 5wã·¿ñ[ý-è``€´ôYºÁƒ<˜êTs'|û+óÔß‚Hû@@¥SêTs'|û¿Õß‚Hû€EÝ ommÍårÕÜÿäÉ“¡C‡*Þ%NÝ!Oõk½jЇ í–&wãÓ7ºÃ]â8€ûÛÖ°º¿¾vpivpivpivpŵtYYYŠ?çžþµtÙÙÙeeeLWú5___¦KІŸvŽÛÀ¤\@ÚÀ¤\ü?#î±­s½;IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1ViewBase-members.html0000644000175000017500000001133712234777147031034 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        GlomBakery::ViewBase Member List
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_4.png0000644000175000017500000000476012234777146025123 0ustar00murraycmurrayc00000000000000‰PNG  IHDRµ5ˆ=&bKGDÿÿÿ ½§“ ¥IDATxœíœ{HSmÇŸ£†æ¹”hnó~© ,D¼€ZÚ˨(/ai…`FʼaÑÅ?LÁRñna¡ ÁóR[aÊtÞÒåeÚL2ó¶óþñðæÙÎãœ:}ëùüõœç<—ï9ûí<¿óì«I’ƒaÀh«`¶58>0(p|`P˜ÐŽÛÛÛ‡‡‡·D f;µâ˜\IDDÄ Ãl hñ e}‰ˆˆ 1•••šÁ€ó 8>0(p|`PàøÀ ÀñA¡|ÌÌÌܸqƒÇ㙚šòx¼øøx¹\O!‘H6HáÆ@ÄäääÒÒ,fF‰dUZoÕEóìfßjúþ©Ž¨Tªþù‡ ˆššggçoß¾ôôô˜ššn¬Ä ÄØØ¸¤¤ÄÊÊÊ0Ó‰D"oooêÐÊÊÊÈÈÈÖžñQ\\Ü××'“É,,,vvv?ÎÌÌ41Ñs@Ã@Ĺsçôè¥P(lmm×ÚÑÒÒ’ÅbÑ*õ°…è¹¾”••%&&Âà `±XÆÆÆÔáÒÒ’P(äñx¶¶¶111SSS°ž ˆŠŠ .—kee•ššZ^^Îáp¬­­¯_¿N5(--¥êêꜜœX,VTTŠ ˆææf>Ÿ_TT”““ãääÄf³###áÙùùù¤¤¤Ý»wÛÙÙ=xð€RŸÕ*•*''ÇÅÅÅÂÂÂÏϯµµÐÙÙÊf³wîÜéååUUUÛììì&''I’ÔœÁÏŸ?§ÿcyyY]z(&ñ´1§§§a¥Vå±XìïïonnîèèXXX¸Ê‡ªÚ&kDD„.ûë666õõõLg¡²ììl—ŽŽ©TzäÈ‘“'ORgÁäädMM àØ±cT¹¯¯$É’’’þþ~õÀÓÓ³£££««+00ðĉ°2  ¥¥%77×ÕÕµ½½]&“ ¨_(òùü––©T P(°—B¡¸ÿ>Çknn–ËåB¡p×®]‹‹‹—/_+,,455ŸŸ§º$ùðáC͉7A±XLÕ+ ¦¡`K„xMÄb1“rggçäääÑÑÑÚÚZ##£±±1„`¸¿N¿ Ú±ŽñabbÒÚÚªy/”J%u‘nnnOŸ>… ¾|ùøñã<+‰H’„_)õ2u5ïuqq1,wvv¡ÕÕÕ$IîÛ·¯¬¬ ž•ËåÆÆÆ³³³NNNEEE°òÓ§O´øØ»woaa!<«R©”J¥J¥šžž^ZZ‚•R©”Ö…i"¦[Ät9p4¦¡`/„xÚ˜°†I9›ÍÎË˃õJ¥’j£­ñ¡çúÂápzzzÔÂzy¡vqqeX‡–––###Z5”‡‡5ŸÏ œ={¾#ØÛÛ///ŒŒŒŽŽº»»Ã.TbppŽ ‚Åb1==- ƒ‚‚8NBB‚¦­¡e3 -^&åùùù999.\èêêR_ýuDÏø8~üx~~>µ¦²X¬>ÐÚp¹Üþþ~X†‡£ßt€¾¾>Xèíí¥†‚QÅáp^¼x¡þ0pwwçr¹TËd2Úhg``€:„ùAPPPÿÝ»w›šš45hH¿ËA…¯ “òððð¡¡¡êêê={ö„„„h~‡WEÏøHKK‰dtt´®®îöíÛ´6çÏŸ¿sçŽX,îéé¹råŠ@ ÐLæµRZZ ?<ªÈÈÈ‹ÅÝÝ݉‰‰´¡âââ„B¡D"‘Éd ‡ÄÆÆ¦§§·¶¶öööR™/ÅÅ‹oݺõöíÛ±±±{÷îq¹Ü¹¹¹ÅÅE___77·îî8À÷ïßa{¥RÉ4‘~ ‡B‹×„I¹··wJJ ŸÏ÷ññ!IÒÌÌlÍBiëŽùI’_¿~‰‰±±±177ð ¡ž,,,$''ÛÛÛ³Ùì3gÎÀ‘¶ˆj-JJJh…ììlWWWkkëÓ§OOLL¨·_XXHIIár¹–––aaa0ÉŸŸ¿ví|xöìX™L,,,¤¥¥ñù|sss___˜Õ××;::ššš444„……yzz’$dff655¥u"&2ÿ` öBˆ×š0)óæ———™™™‹‹Kyy9úÕšäʬ822P]]½æ@ÛL‚‹Å>>>[-äO¦ªª*::šø÷—uñúõkÍ}t‚ „BáVKÛ¶õv'Éðê¿å„‡‡o[m~~`PàøÀ ÀñA±éñ¡ù“é–¸C´f‘L2˜ZnC_ËfcˆçGyyùû÷ï 0åD",?0º€ãƒÇŽ ZÞ_:::à.æ¯BëßÓãÃßßß b0Û.—«ùßÕéû§Œ:8ÿÀ ÀñAãƒâ_o.Ú—ª•IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1NumericFormat-members.html0000644000175000017500000001447712234777147030754 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::NumericFormat Member List
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_20.png0000644000175000017500000000417212234777146025176 0ustar00murraycmurrayc00000000000000‰PNG  IHDR5ó¥ÿêbKGDÿÿÿ ½§“/IDATxœíœ{HSoÇߣ«™©mK©æÙœ:u”„¨ZX^•45,Í0¬°¢(pÂú£‹)]èn05,/[šH˜¶ÐÄ"”éœZ®™Sg’«-õüþxáüNÛL—yä|þzÎy/{Îû=ç}Ÿ=ïÙ ÃÅŠÇÁÞPÌ J'r@éDhăææf{¹BA„Ãᄆ†þŒ¨¬¬´Ÿc!‰ˆÒÐ,kP ÝIHH0;C­Oä€Ò‰P:‘J'r@éD(È:_¼x‘ÃáÐét‡“žž®Ñh`‚ ­­­‹ç¡&Q·–Ìwˆ¬|š•éé鸸8Aär¹Ï·oߤRiXXXWWN·¡ÃÕ^¯‡“Élhh ¸ººÎ«[t*..îééQ©Tëׯxxxpà^* ‡‡‡år9 66·{zz0 +))Q«ÕDÃÇÇ'++K«Õ>þÜÁÁapp?::ZYYI£Ñ~ÿþpòäÉÞÞÞÁÁÁÂÂB:n4áÇ………566Þ¸qƒÏç¿{÷N¥R …B˜=“H$\.·±±Q©TFDDÀQ†­B¡èèèØ¹sçþýûáIXJìÖ`0àÞØØ˜””$þ=2³/†a"‘È,¿g‹N4­©©‰øñ½^{ãçç÷ôéSXáóçÏ€?~ÀÒ†† 榦Ìì™®ÅbݹsÚz½~rrÐÖÖ†7Ôétccc“““°ŽR©$ޏL&Ã0lëÖ­eee°‚F£qttœ˜˜ðöö.**‚'?~üHlU\\ Ï···CçÍt‚Ýbf0 ‚‚‚"##+++M&ÓLã¶l™÷ØlvWWQ<ØÃùúõ«¯¯/´¡100]\\föLäçççååyyy¥¥¥uttÀÙEQbñ±1‰DÎf³322ˆÍ¹\. ··÷ðáÃ0ÖòôôœššÐjµþþþ°n}7ë¶¾¾ÞËËëÓ§Oååå ‰‰‰kÖ¬ùǵ،-:íÛ·/??Þ˃ñáó:(ŠªÕjhCƒÍfÛæbLLL¿L&Û²eKdd$¼'à‚®V«oÞ¼Ù××W__O,‚Z²Ùì/^À{szzZ¯×ûûû£(Šßp*•ŠØª§§ÝÝÝV‡Ý¢(\___[[‹ÇuK-:]ºtI«Õ …ÂÖÖV­V[]]}ùòe³:G½zõjKKKWW×™3g„BáãœÒÒÒÞÞ^¢$‹¹\îŽ;0 srr²lõçÏŸàà`??¿ÎÎÎÔÔTÀèè(±BjjªD"immU©T»ví¤¤¤\¹r¥©©©»»d ×®]kiiéììÌÌÌÄ·TbÛ¶m/_¾¬««Óh4Û·oOOOokk›ËeÎâ$8Çõ ð/_¾$''3™Lggg¡PŸâúd2™²²²<==Y,Ö¡C‡ˆ3;>G[µ%%%Dãõë×NNN¾¾¾ååå˜Å’®Óéjjjx<N «­­ŽŽ†ë9Þ­Éd‹Å(Šº¸¸DGGØÅh4ž?Æ{Ïž=„õ)77—Ï绹¹}÷î]R¼ËFJ²²²~þüÿëׯ½{÷>xð/:{ölll¬Á`ˆ‹‹{øð¡eÛÚÚÚºººÛ·o‡„„,£Ë Á¹áªªª¤¤$låe‹‚ÍïÝÙø;5™L†ŸYÑëÓ«W¯¬¾ô+‘HæØC__`íÚµKèå²°¢ç½˜˜˜…<Üjµ:00ðرcnnn‹è•]XÑ:-ƒÁ`o/‡=ïQàP:‘J'r@éD¬Ä–2A±Ì( ³¯á=OG$-¯KV ùëÏÌò+j}"”Nä€Ò‰ü›„ßrzƒþ®IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Placeholder__inherit__graph.png0000644000175000017500000001330212234777146034310 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÐÃ|„bKGDÿÿÿ ½§“wIDATxœíÝ{PSgÞðç$‘›AC€u ‰¢€U¤N§vB[*Jµ¤-D¶PÇwÔÖÁíjw@+ÖÛԩݯ¥²# (áV.-ÖËz­#”àë…W Ê%€€ $9ïžÍˆ Ï!úûüõäÉÃs~ç䛓sN@Ñ4 …ÃvàÅDAàQ8@ÅsìtE9vBÀ:Ç^ÇppàBŸ}öYhh¨Ã§ä]ºtéïÿ»cçt|àBCCe2™Ã§¬pxààDAàQ8@ÅNົ»?ÿüs‰Dâêê*‘H–/_ÞÔÔ„Ÿ¢(J©T:pYÔP¸ˆß9EQmmmvÍéðMD’ã/‹<•ÉdZ´hEQ………S§NmnnÎÈÈ «««suuuøât:nxyy9sæ•W^Ayzz:|AÀ,îðá÷oßV«ÕcÇŽEùúúîÛ·oÛ¶m<Þ3)F 0m>ŸoþŠ¢Z[[}||œt~‡cá#577wõêÕ8m @Àår™‡ƒ!55U"‘øøøÈåòöövÜOQT^^žX,öôô\¿~ýÑ£GE"ѸqãÖ­[Ç ÈÉÉ1o ‡¢¨sçÎMš4iÍš5‘‘‘B¡ÐÝÝ=$$$??ŸP^^.‹…BáÞ½{qguuuhh¨‡‡‡¿¿ÿ¡C‡˜Ù®\¹2xüEŸ¯¯o[[Û°ââb@ûàÁ¦Ÿ¦é;wN™2E(ÆÅÅ1Á|˜ù‡üÔ-FíP!…Ba}Œ——WYY™•ª««wìØPYY©R©æÍ›Ã<+•JÛÚÚ B .dÚ·oߦi:;;»¾¾Þ¼a1³ùð°° .Lš4iÕªU ---‡ruuÕëõx@TTÔýû÷‹ŠŠx<Þo¿ýFÓôÔ©S“““µZmQQ‡ÃiiiÁÓ¾ôÒKÃMÒÚÚJÓ´•³gϾzõêõë×_ýõ… 2¥îÙ³'00ðÒ¥KjµZ*•ÆÆÆ^f~+ƒ­o1+ …ãâàélÇ»xñ¢ù`:Ž~²5ƒ‚‚²²²ð€ÚÚZ„PWW~öÌ™34MF‹¶y˜†«Í"p4Mwvv Ü©R©˜—!ôý÷ß3óãN¡PøÍ7ßàÁ:Î`0ài­L‚VൠiúòåË¡ŽŽRE"Q]]óP§Ó1§¨Œ{÷îà6nh4üÏç#„8ŽE{&Mš„êììLMM ‰D+V¬0àççg1ÿþýûwîÜ9yòä?þøÆÌa€•Iž: 007¦OŸŽÒjµøaCCC||<>­öóó3ÌFÌÊ`n±ß…GGGïß¿¿ÉB ¦¦ÆbŒX,®¯¯Çm܉D¯o÷ðððúúú]»vݹsçøñãæßmõÎ;ï466Lœ8qîܹÌ[ÅÊ$O V«qC¥RQ%‘HðC‘HTRR‚w &“I§ÓM›6m¸u±k0‹X\ZZšV«•J¥J¥R«Õ§§§[ŒILLüòË/«««ëêê’’’¤R©g—999 様3gNPPÐÍ›7Гµ!½òÊ+)))“&Mzíµ×hšvss{ê$øºŒ•)))ׯ_¯­­ýä“Oâââ˜K6 ©©©J¥R­V¯X±"""bÈ’ðü6fŸc?¡‘ Çp4Mß½{W.—{yyyxxH¥R¼3?†ëïïONNöóó …K—.Ň)ô Ã—Ám„Pvv¶yü6‹c8ü°¬¬ÌßßßÕÕ5,,¬¢¢"**júôéƒçÇ5œ:u*$$ÄÍÍ- àèѣ̰á& wsskoo·²”ÜÜ\???//¯øøx‹’’"‹ù|~TTsŒo^3¿-ƒ‡kçYÃQ´Cïç¤(J¡PÀýpχüüü%K–86!ð]* ˆ‚À¢ p€( ˆ‚ÀÄÇ¿=|øÛU8%Çß‚véÒ%‡Ï9ÚTU= (jÎ_¶ y¶žÅKéø ¿œmÔ ßGˆîèøžíBHplB¼‡slq£Óýû]¯¾šNQèþýî?ünU·ÃÙ­¢â:‡CQUQqíZœÎnùùU4M›L´BQÅv-ÎgŸ;wÚ®^Õ˜L4M›®]Óܽkù{À:œ}ÊÊ®Œƒïò¥xUí³‰Á`*.VZ|žbýýÆâb¥Ñh"_•3‚ÀÙ¤²òvgç£1c8..<ž‹ ×Å…‹ÛcÆptº¾ÊÊz¶kt,ü¹.g4f wãF)󰸸!ôþû³™Þº6qðíI/ˆ•+³Bß~›Èv!ÎÞ—€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( Šå?¹ÇâÒG¬£Ã!$>b»‘(((`qé,Ž¢¨×_],³XËC£ÑTVV²üг8…B!“ÉX¬áÅ‘ŸŸ¿dÉv_q8†DAàQ8@D9Gົ»?ÿüs‰Dâêê*‘H–/_ÞÔÔ„Ÿ¢(J©T:pYŸp.‘EN8“É´hÑ¢ªªªÂÂBFóÃ?¸¹¹………éõz¶Kvs‚ÿ&xøðáÛ·o«Õê±cÇ"„|}}÷íÛ·mÛ6Ï ŠEQ­­­>>>6ö?7œ`—››»zõjœ6†@ àrÿóÿ™ CjjªD"ñññ‘Ëåííí¸Ÿ¢¨¼¼<±Xìéé¹~ýú£GŠD¢qãÆ­[·Ž““cÞìÊ•+‘‘‘B¡ÐÝÝ=$$$??!ôî»ïîÞ½¨¬¬ôññyôèÑp5´µµ™·)ŠBùúú2ý̳L?MÓ;wîœ2eŠP(Œ‹‹³}F;šU!…Ba}Œ——WYY™•ª««wìØPYY©R©æÍ›Ã<+•JÛÚÚ B .dÚ·oߦi:;;»¾¾Þ¼'4_ÄK/½´jÕª†††–––C‡¹ººêõúLJ††âùË_V®\i¥†ÖÖV‹¶E'³D¦Ïž=—.]R«ÕR©466ÖÆ5²B¡P°ÿг¼xÇãñ.^¼hþ#˜N§£Ÿ¼ZAAAYYYx@mm-B¨«« ?{æÌš¦F£EÛ"Uæó[<ÕÙÙi0p[¥RáLtvvº¹¹i4£Ñ(‰Î;g¥†.88877w655q¹ÜÞÞÞ‘­c4Î >RE"Q]]óP§Ó1§¨Œ{÷îà6nh4üÏç#„8ŽEÛv©©©ááá"‘hÅŠ¸süøñ‘‘‘EEEçÏŸçñxo½õ–•F ¡¡!>>ž¢(Š¢üüüŒF£׈ENPhttôþýûñ›!$jjj,ƈÅâúúÇÿu7D"‘£ ¯¯¯ßµk×;wŽ?ÎôËd²ÂÂB…B±téRŠ¢¬Ô@Ó4²3"‘¨¤¤ïL&“N§›6mš£ÖˆEN¸´´4­V+•J•J¥V«-..NOO·“˜˜øå—_VWW×ÕÕ%%%I¥R@`Ëä999 æ „POOOçF£q```Μ9AAA7oÞLHH@utt „/^¬T*óòòär¹•Aiiiww÷¶mÛÌ­Óé†, ÷'$$¤¦¦*•JµZ½bÅŠˆˆ{¶Ù(ÆêºMÇp4Mß½{W.—{yyyxxH¥R¼ÿ0?†ëïïONNöóó …K—.îðhp!”mÑ0W]]]VVæïïïêêVQQ5}út>!óçÏd»'Çpv+(PòxÇ)(¨f»ç³ÏÇ¿8Qk0˜ ã‰ÿ×Û ¿9fœ}ޝ5L¸m0úé:»õ8œ}ŠŠ”ÎãŠ¢ŠŠ^”_`vœÚÚz~þ¹Îh|¼‡3M.üÚÑÑËnUÎg‡ŠŠkY^ùñÇ«¬㤠pv(,¬¶øFËd¢ á\Õ8[i4ºššF‹Ëô4M+•Zm'[U9œ­Ê˯p¹Cl..—SZz…|=N g«‚‚jæwcÍ&¸l;œMZoÝÒù­7MÓ7o6ß¹Ó6Äs`ø›ÔÔ4û™L/ˆÜ¿ßš0a~Èápjjîøû?·cËX¾=ÉI­\™…úöÛD¶ q>ð‘ ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢þëoüæçç³U‡séëkE°¹lfþ_qÿëoü:é?£œyÆ,ÿŠù_|1wî\¢å€ç×Ù³gÓÓÓÍ{àDAàQ8@D$p}}}ÉdóçÏ—Éd_}õU[Ûãÿ¥¡R©XŸÃ' KŒ0#•Jׯ_¯Õj»ôˆˆˆ®®.G^¢í?n/»ÿ› MÓÉÉÉE¥§§Oœ8±½½½¼¼|õêÕ999cÆŒy%>—¾ùæ›ÀÀ@„N§;xðà_|‘‘‘ÁvQ$ؽ‡ûé§Ÿš››¿úê«3f‚€€€Ï>û,33“Ëå>‹úÈî ýìÞèîîî|>ŸÏçK$’µk×þú믭­­ÏbA£Ý;yòdLLŒ›››y'ŸÏçpþ3•ÑhÌÌÌ”Éd‹/Þºukww78}út\\Ü¢E‹¾ûî»ÿûß±±±ï¾ûîþýû™'Ož4o ¦V«×­[µlÙ²³gÏ"„RRR ð€7n,^¼X¯×W“!ÜŽˆˆ@ÅÄÄXd˼Ÿ¦é#GŽ|øá‡ÑÑÑ›7o¶}lß«ƒÁú:âärù;ï¼óé§ŸÖÖÖ2ƒ C;wîý÷ߎŽ.**²ò¢`{÷î}ï½÷bbbŠ‹‹q§•µ¾zõê’%KŽ;fûjbvN­VX£P(NŸ>žž¾oß¾ŽŽŽ]»v1O:u*333%%åÈ‘#'Ožüç?ÿ™œœ\PP€b6lØbÞlË–-b±8###///..nûöíƒ!""âܹsxÀéÓ§ß~ûí¢¢¢áj°pæÌ„PIIÉøñã‡ë/))©¨¨HKK;xð`ÿîÝ»m\£§êììÜ·oŸX,þãÿh}‹‹‹KKKSRRrss_{íµ7F+…)•ʬ¬¬µk×8p```ÀÊ‹‚ÊÎξpá–-[öîÝ{þüyÜieòï¾û.55uÞ¼y¶¬£9»áúúúÌ_¼@•——óù|Ü>vìXbbâŒ3BkÖ¬Y¶lY__Ÿ‡‡BH&“7î­·ÞB-]º”iwwwOœ8qþüùx¦1ØÜÝÝñuÖ¬Y½½½o¾ùæîÝ»ÛÚÚ¼½½Ïž=»iÓ¦]»v WÔ––.[¶,88!´nÝ:™L¦×ë]]]ŸºFÃM¸jÕ*Ü (*00póæÍæwN ¹Žåå剉‰³fÍB-[¶L&“q8+…}ôÑGžžžo¿ývzzz__Ÿ•!têÔ©?þøå—_ÆÏ._¾ÜúZÇÅÅáÁö²;pÞÞÞ÷îÝ›9s&~X^^®×ëcccÍdžKHHhoo_¿~½J¥joo¿páBVV–ب¨¨ììì[·ni4šüã¡¡¡6¾<'OžÄÛ‚i „=zÔó„Éd23fÌ‹ÅÛ·oG=|ø!ôæ›oªTªÓ§OGFFZ©Ïç_¼x±¯¯/''Ç|Ñx’ÁpTTTff¦J¥jjjúúë¯ÿú׿ڳÍì6ä:.\¸ððáÃׯ_ïèèP(qqqz½Þö¬¿( ,ÈÊʪ­­Õh4ÌϳXk»÷p`ïÞ½ûÛßúûû_}õÕÍ›7Ëåró1~øá£GÒÒÒôzýŸþô§5kÖØ8ùöíÛ7lØ0qâD¦2_σ®]»vÏž=‡š6mÚG}ÔÛÛ»qãÆ¬¬,Ù³g777ãsšájHJJ:xð`FFFRRRYYîœ5kÖòåË ===Íëaúår¹^¯OKKëéé Ù²e‹½ÛÍ.C®cffæÀÀÀÖ­[»ºº¦L™²cÇwwwÛ ³þ¢ÈåòžžžM›6Ñ4ýÉ'Ÿ(•JÜéðµ¶¼ãשoÀLMM1cF||<Û…€Çð ˜ÖîøuRz½¾¾¾^©T&%%±]Ëc¿üòKrròàþ?ÿùÏøðÅôœ®ªªjçÎ #>{r¸9sæà+yÀÜs¸ðððððp¶«O·'¢ p€( ˆ²¼Œ¿ƒà÷kmm½qãÆ°×á,¾ƒàwòõõÅ7›0þkÀ³Çp€( ˆ‚À¢ p€¨ÿmj³Æ libglom-1.22: Glom::LayoutItem Class Reference
        Glom::LayoutItem Class Referenceabstract
        Inheritance diagram for Glom::LayoutItem:
        Collaboration diagram for Glom::LayoutItem:

        Public Member Functions

         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        virtual LayoutItemclone () const =0
         Create a new copied instance. More...
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        virtual Glib::ustring get_part_type_name () const =0
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::LayoutItem::LayoutItem ( )
        Glom::LayoutItem::LayoutItem ( const LayoutItem src)
        virtual Glom::LayoutItem::~LayoutItem ( )
        virtual

        Member Function Documentation

        guint Glom::LayoutItem::get_display_width ( ) const
        virtual bool Glom::LayoutItem::get_editable ( ) const
        virtual
        virtual Glib::ustring Glom::LayoutItem::get_layout_display_name ( ) const
        virtual
        void Glom::LayoutItem::get_print_layout_position ( double &  x,
        double &  y,
        double &  width,
        double &  height 
        ) const

        This is used only for the print layouts.

        bool Glom::LayoutItem::get_print_layout_split_across_pages ( ) const

        This is used only for the print layouts.

        virtual Glib::ustring Glom::LayoutItem::get_report_part_id ( ) const
        virtual
        LayoutItem& Glom::LayoutItem::operator= ( const LayoutItem src)
        bool Glom::LayoutItem::operator== ( const LayoutItem src) const
        void Glom::LayoutItem::set_display_width ( guint  value)
        virtual void Glom::LayoutItem::set_editable ( bool  val = true)
        virtual
        void Glom::LayoutItem::set_print_layout_position ( double  x,
        double  y,
        double  width,
        double  height 
        )

        This is used only for the print layouts.

        void Glom::LayoutItem::set_print_layout_position_y ( double  y)

        This is used only for the print layouts.

        void Glom::LayoutItem::set_print_layout_split_across_pages ( bool  split = true)

        This is used only for the print layouts.


        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem.h
        glom-1.22.4/docs/libglom_reference/html/functions_func_0x75.html0000644000175000017500000001134512234777147026041 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - u -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Relationship__inherit__graph.png0000644000175000017500000001451612234777145032223 0ustar00murraycmurrayc00000000000000‰PNG  IHDRUuqµåûbKGDÿÿÿ ½§“IDATxœíÝy\Wð™$œr„» ‘C„âQµ^U\ü¬)µ$¢Ü…Z--¢¬Bº`ÑZ-°® -r+"ˆ Õ]ªØU\oE¥r ˆ „Ù?fw6 @$™„ü¾½Ì¼¼üfÞû%sÅ0 ($ ÙHù€â‚ü@qAþ ¸ ÿP`˜€ÜÜ\²ÃãÌÍÍ {;0*&˜ÜÜ\¢siCΖ~L@âããÇ«)ÃÚµk_‘ÿGZÁÉÊË˯¦`TL Bùûÿ(.Èä?Š òÅù€â3ÿ;;;ÿò—¿˜˜˜¨¨¨˜˜˜øûû×××ã³P½qãÆøEˆ CÇxËÖPmmmS›ã¾Šd„”G…Pƒcýˆ!ÇÕµk×ÄèОžž;vXXX¨ªª9;;_»v A7dkbИâü߈V®\‰¢è‰'ÌÍÍ’’’-Zôøñc•q±½½/èèè”––Κ5 AMMÍqÿ ð6¤<*ÞÞãJCC#33s¬£+((¨¼¼<55ÕÆÆ¦££ãøñãË–-kjjÒÔÔ£5i'ÿÓÒÒª«««ªª&Mš„ ˆAbbâ®]»h4qZN'Ê‚/¥EÑ––}}}9m_j¤<*ÞÞpãÊÓÓ/Œ¾kòóósrr–.]Š ˆ¡¡áŽ;'Mš„¢(Ñšlgû?;;_<Á‰t:J¥/y<^DD„‰‰‰¾¾þúõëÛÚÚðé(Š;vŒÅbijj~ýõ×Ge2™ZZZ!!!D…¬¬,ÁÂpP½|ù²©©iPPПÿüg]]]555;;»ãÇŠ‹‹Y,–®®nBB>ñúõë .TWW733KNN&Z»uëÖàFPEÄÀÀ µµuÈ ¸‚‚333:îææöâÅ b:†a{öì™2eŠ®®.›Í&V‚à"íWyÄ5&#¤?*ººº^ À'×MÃõû`ø»`׳†ë#eeåÚÚÚ!œØþ<ûûûCBB “““UUUñ-|Á]¡Ý‡á–ŽÈ…ÔÔT‹6„ÁWzxA¸ŽŽNQQÑpsñuýÝwßYXX\»v­²²rÙ²e®®®Ä\ggçÖÖÖ'N ²bÅ ¢\]]aXfffMM`A¨eÁ—‹-*++355ݸqãÓ§O›šš’““UTTz{{ñ ŽŽŽÍÍÍùùù4íÍ›7†™››‡††666æççS(”¦¦&¼YkkëáiiiÁ0LD…9sæÜ¾}ûîÝ» ,X±bê,--ËËË«ªªœ‰Kñ„h_DeÑkL77·ñºþÄjRCfý8¸ß…b|‰÷QÀFêÐ}ûöQ©T77·ôôôúúz¡'Z»ví²²²ª¨¨¸ÿ¾½½=•JÅÃú\âí¢G)ž \.Wt7!ÿý¿8ùO£Ñ®\¹"Ø"®½½ÔÊÊ*==¯pïÞ=A:::ð¹¥¥¥†ñù|¡²` ºP?åååaöêÕ+‡O¬¬¬\e'Ož$ÚÇ'êêêÆÇÇã•ÛÛÛy<Þ¬ˆFð‚ˆ øR`vóæMA^¾|‰·ikk›Ïª¯¯§R©ÝÝÝØ0ù/¢²ØkLšù/åQ1x–è~ÜïÃ5%"ÿ‡ë# î\¹²eË–éÓ§£(:{öì_ýupkB£ÑÊÊ*##¯vçÎ" ù/bâ¹0"¡ügûŸÉd>~üX°ƒ‰Ã¼„çÏŸ[XXàe¼PWW‡¿ÔÐÐ@„B¡•Å`jjŠ È«W¯"""ìíí™Læ† + µðàÁ={öLž<Ù××÷ÁƒÄÖ©ˆFF¬`ii‰¦M›† Hcc#þòéÓ§øeccc>ŸO¬„ÁDTÇ5&922*†ë¦áú}L†ë£ŽŽŽùóçÇÅÅݹs§¾¾~Á‚}ôÑàÝ=¡Ñøüùssss¼leeõ6K‡ü7ÆJœUìâârðàAük A:^QQ!T‡ÅbÕÔÔàe¼Àd2Åø,ÑðUioo_SS³oß¾gÏžýòË/‚ð½8ANNNµµµyyy ãOú1FE42b…ªª*¼PYY‰¢¨‰‰ þ’Édâ_´íííS§NnYÆTYÉȨ®›†ë÷1®lllΜ9ƒ×a0ß}÷]OO¾(Hh42Œ§OŸâåêêjÁYøõà_ ƒP¼¯KqÞÙØØèìì|ãÆÆÆÆ‚‚‚èèh¡:>>>ß~ûíõë×?~üÕW_9;;ò¸}VV¾RˆÂˆúûûçÍ›geeõðáCoooä¿[àCš5kVXX˜©©éܹs1 SUU±üD‘ˆ aaawïÞ½wïÞ¦M›Øl6q¾ÇÛÛ;""âÆUUU6lppp2$¼ýQV–Y22*†ë¦áú]4â!n¸>b³Ù!!!¿üòKccãýû÷·nÝ:þüÒ=<¾©©ž—×ÂõëèèLñv \n_AAEFÆÕ{÷êðî fQ(”ððU_|±ŒÄðääÿhÅÇÿ÷ Ÿ? 8Qhs`Éyºc_~Ý»WŸ‘q¥  âÍ›~ …ÂãñçR((“©såJ¸’’ü²•2ÈÿÑârûæÏÿöåË®!W˜²2­¯·`ENÎ窪JRNüýïç¿ÿþgb;(èO?y¯^=KªaÉ'8ÿ?ZêêÊ«‡ÛÛïëã¡(êç·’_Òìml†}j’uîÜÉü£ù?Îû3gšÐhC¬4E¿ÿž ÃN ÔÕ•ßdh¨5ä3üöí“›S•¤ƒüEwî\Ãç ïP(è_,óô\HJT HWwÒÑ£UU•„zG£QÖ­[hm üŒäÿØÌ™3yÕª‚–h4о¾æìÙâ<}ˆBAµQAb UQQ ]AbTròÌ"#]ä?›4õý÷Í׬™{ŽÜÀÇÅ‹œbõõ5¿ýöc¢/P qÒÓƒþc@ŠŠ";9£­­öúõ›[·þ Ñ¨L¦NnîF'§éÚÚj{öœihxµl™-…WIPFÆÕ  ìU«f>ì;gŽYOOEÅ3Eéxà§cÁh晡@HG×Úúk[ÛðÚÚVbâÙ³wÌÍ·ûø$s¹½$Æ6ñù Fð?œ &~úi*ƒ|úô-rÓGpþ_L¹¹ÿœ61s¦‰àÄ›7k}|’MLtÓÓ d÷_ŸåÑ›7ý›7çœ;wwï^ÎÚµó„fýðùˆˆÕdÅ&¿ ÿÇÙ³g­žžI<Þ@vö C²Ã™ ÚÚº|}Sžû,íúõ§ ž+VL';œ ò_JžrÄßÍmî§Ÿ¦9òÙáÈŠ#G~ûôÓT'§éGnÔÖV';çÿ¤J¥ìÙö´4Šˆ(¨©iQðó‚Ø_ÿZ˜’òÇ­[áaêRùOŽ€{:]=$äXssÇž**ŠØoÞôùeVIÉýøøuB·ôé€ãÿdúí·'©S§2ÒÒüuuëZ[»|}“«ª^$'ûÂ-=dü'Yee“§gÒ¤I*YYX,²Ã‘’ªª^^I|þÜÒC.8þG2këwNŸÞ¬¬LuvŽ¿sç9ÙáHCyyõêÕûétõÓ§·@ò“ òŸ|FFÚ'O~egÇúä“ÄóçŽdåçßpw?4¾y~þ—††ðˆ’AþË„I“TÒÒ\]gûù¥dd\%;I‰=”ãåµ(%ÅO]]™ìpÿ—4eï^ö;ïh……å=yÒ¼s§ëD:ÖßÏß¾ýx^Þõèh¸¥G†@þËECBœX,ÝíÛwvöüðÃÚ‰ñ–=iÏöƒ[zd ÿ—EeeŽÌœišœì§¥¥Jv8o¥®®ÝË+éåËn¸¥GAþ˨‡==“´µÕ²²60™t²ÃÓíÛÏ}|kk«gf~WõË 8þ'£llgÎS(èªU»¿žìpÄñë¯÷>ù$ÁÒÒné‘Yÿ²ëw´óó-, \]”–>";œ±IIù‡¿ÿ‘•+gÀ-=² ¶ÿe]??88çôéÛ±±înnsÉgd|þ@TÔ©ÔÔ²­[?„[zdÿ—uJJÔ„OssƒÍ›sjk[CBœÈŽH”žž¾ÀÀ¬ ÄŹÃ-=²ò_àç™Lzhh^]]ûÞ½Ùc0då¼`ié£Ï?O³°0LOÿ ®ê—#pü_ÎÌšeZ\¼¹¿ŸçêzàÉ“f²ÃAÉ̼êãsxÑ"+¸¥Gî@þËSS½¢¢ÍL&ÝÅåïååÕ$F‚aXdäÉÐÐsæ6üKü¢FEE‘•JYµj—Û} A°E‹,¥ùé/_v{x$ýþ{ÍO?ùp8pžO^Áù?9†¢èŽÎFFZQQ…{ö°i4iìÐ=}Úâá‘ÔÝÝ{âD ÜÒ#×`û"8{ön``æÒ¥Öz©©Iv'üŸÿ¬ñóKÕ××€[z&Èÿ âÊ•*ÿTÆ‘#þtº¤®·?þÁ¦MÓ¦1ÒÒüáL'ÈñÅÅÅ•——“Åÿp¹JÏžiY[·S©úˆ¶6µ—/Õ,-ÛQT††M^^Ù!È+Èñ±ÙìË—/ÛÚÚ’ˆâjiiyðàŒa±Áñ¿·bkk 'PHtéÒ¥èèh²£cpýŠ òÅù€â‚ü@qAþ ¸ ÿ¥Ëå:tˆÃá,_¾œÃáìÝ»·µµŸåààPYY9ŽŸå ÀÑÑ100Ptû£ €Ïç;88ttt¼}xBŒWË@ pþOâ0 EQ4::šÁ`´µµfee)))Iâããã---ár¹ÙÙÙß|óMNN•úV £P(áááêêãe¡äZ#‚߉;wî\CCÃÞ½{mllètº……EpppJJÊ[&¤jjj†††/^¼hll¯)â—EÑåË—Kâ Kr-ƒAþK\II‰«««ªêÿ=®OCCƒBùßÊçóù)))ç£>Љ‰éììħ;88\¼x‘Íf¯\¹òðáÃ.\pss[µjÕÁƒ‰ %%%‚!ø§P©T ÃrrrÖ­[çââE|®ªª*$$ÄÅÅÅÑÑÑÏÏïÒ¥Kx›‚¸ººâ_øwˆP¯^½Êf³]\\Nž<‰O|ôèQ`` “““»»û™3gð‰—/_^³f‹‹K~~>ñ^â#ÊÊÊÖ­[çìì-$wÿWUUeaa!ºNnnîÅ‹£££_¾|¹oß>bÖùóçSRRÂÂÂrrrJJJRSSCCCóòòðŸôððp;;;Á‚ .—›••eccÃ`0 þùçÈÈÈü±¯¯/..N°æÎ;Y,VRRÒ±cÇØlöîÝ»y<^ii)‚ ………ÚÚÚ£ µ°°ððáÃÛ¶mKLLìïïÇ›9sfNNN```lll{{;‚ 7nÜHOOߺuë¡C‡ðj‚’““¿ùæ›ÄÄÄÖÖÖ½{÷Žv-±Àþ¿Äq¹\ÁüÁT)..ÖÐøÏ-tgÏžõññ±±±A$((ÈÏÏËåâ»ÄGKKkÉ’%‚¸»»åÎÎNƒ±|ùr¼¢€ ÈÆ‰2…B‰GäÔ©S~~~øÝ !!!§··WEE¯vèÐ!555|caÆŒýýýÝÝÝ‚aD„êââB§Ó/^Ìçóñ¥îêêÒÕÕÕÕÕ]²dIQQ^ÍËËKSSséÒ¥ÑÑÑB+Aõë×ãI€ü—8==½çÏŸ¿ûî»øËâââÞÞ^777Á:/^¼`2™x/´´´Lž<A555AðÑ,‹@ÿãñx§OŸŽŒŒøàÔ©S~ø!þ몡¡qçΡ: ø<¾a¯§'þ£5ðãx™Ãᤤ¤ÔÕÕééé}ñÅ|ð‚ †uwwu ²µµÝ¸q£••†a~øáp‹upJÏ›7/77·ººº¬¬,88øèÑ£CVÔÐÐ0}útAêêê·[`D°ÿ/qÞÞÞmmm_ýueee[[[YYYzzºPGGÇÌÌÌGÕÕÕíß¿áÂ…‚É)BII ž„DAˆ²²2Š¢¯_¿vttLII©¬¬¬¯¯Ý²e‹`5>ŸoccÃb±jkkwïÞ ÈëׯñYDAŒP’’’ ­­­1 SVùÙDxãµµµcZ@<ðû/qt:=!!!))iÛ¶m}}}³gÏŽŠŠZ¿~½`uëÖõôôDFFööö¾ÿþûAAA£l|÷îÝááá ƒ( ®£­­‘‘ÕÛÛÙÕÕegg·sçNÁ:[·n=pà@rròÔ©S½¼¼º»»wìØ‘žž>cÆ ÿ'NhjjŠê¶mÛŠŠŠôõõÃÃõ´´F\¢•+WÆÄÄ´··Ï;WèK Œ;xþ‡øØlvKK Üÿ?Ž~üñGkkëQÖÇïÿ‡1,6Øþ@qÁö?!ø@jà÷Åù€â‚ü@qAþ ¸ ÿP\ÿ(.8ÿ÷V._¾LÜÏ€ÜëÿÄW^^þüùs²£‡Ã!;yù€â‚ýä?Š òÅù€âú7ÿxgø±%IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1TranslatableItem-members.html0000644000175000017500000003411412234777147031422 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::TranslatableItem Member List

        This is the complete list of members for Glom::TranslatableItem, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_has_translations() const Glom::TranslatableItem
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1GroupInfo__coll__graph.png0000644000175000017500000003224112234777145030754 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¤õ7ç4bKGDÿÿÿ ½§“ IDATxœíÝy\×Ú8ð3 Hd3ÑBØnñ–K*ˆ?-.Qie±R­·öu©¿¶¶¶‚{«õ-mí¢¶WÑ*HY\/hµRJ4`q”Ed7,‚Hæýcn§1LB€„æù~üãdæÌ9ÏLÈã,''ŽãF;ÝÀP€d`HvF€d`HvFУ;0ò`Fw `Ä’ˆ 6xyyÑèCNNÎ×_MwÃ$;0^^^!!!tGúÉŽ÷ìŒÉÀìŒÉÀìŒÉÐ Ã°ÆÆFº£ †aX^^ùò£> …:ê«7ÅÞÁ ÁÐ4²cÇŽ¸¸¸ììl]´/‘Hˆ‚™™Yff¦»»;BÈÄÄD}1$;0D0 khh?~<Ý Ä÷ßÿÅ_dffNš4IG]p¹\²lll¬øh\Æ‹Å^^^†††¶¶¶±±±Ä7Ì,,,»ºº6lØ0qâD ‹o¿ý–Üð£G*Ž;&LLL6oÞœ˜˜ÈçóMMM7n܈*((˜={6Ç;v¬««ëñãÇÉvÒÒÒììì¸\nHHHSSSïð4ß—ÄÄĈˆˆôôô矞X‚ãø®]»ìììx<^pp0ÑÅ‚ ¾úê+¢Bnnîøñã»»»ûä”i²;@#8ý„JJJR_ÇÞÞ><<¼¦¦&55•ÅbÕÖÖ"„pŒŒ …ÙÙÙÅÅÅ~~~äòøøø²²2ÅBH$566¦¤¤ „æÍ›G–KKK×®][^^^[[k``ÐÕÕElåââ’››{÷î]ŸÅ‹+–êââ¢áž~úé§ÇÞÞ¾½½\þÝwß9::æää”””ˆD¢   Ç>ìååETxï½÷Ö¬Y£ñUîT,+¾T³;ê%%%Ágœô›&ÉŽÇãíÞ½›(K$’žž2©ÙÙÙL,/((@µ´´ttt8pÀÝÝ}æÌ™IIIR©TÃ=555½|ù²››Û† ÈåS¦LIHH ÊÕÕÕl6»½½½¹¹™ÃáTUUÉd2>ŸŸ••¥I”*%»Þ»£aSìÁe,Љ}ûöíÚµËÆÆfåÊ•wïÞe³Ù䪚šòÎWŸ·ÀŒB,K©ŒjnnŽŒŒôõõåóù«W¯VÜÊÁÁ(8;;#„tèо}ûrrrˆ…åååaaaÄS+++™LVUU5nܸٳg§¦¦þöÛozzz3fÌа‹>)íNUU•¶ZfHv@'æÎ[QQ‘œœlii9sæÌêêjr•@ ¸wïQ.))p¾¾¾eee111<8þ¼âªÒÒR¢pÿþ}„§§§§§çùóçÓÓÓɇž …!÷Þ{ïÍ7ßìêêBñùü“'Oç r¹\"‘Y;$$$%%%))iéÒ¥ZœKiwø|¾¶ZfHv@'ÜÝÝ#""„B¡‡‡Žãý9ºbùòåÛ·o¿|ùòýû÷‰G „£G–——+Ôëîîöôôtrr*,,\±bBèñãÇ΍¨(±X\XX¸~ýz‘HäããsöìÙŒŒŒêêj77·U«V]¿~½¿{´mÛ6™Löé§Ÿ"„V¬X™——WRR²zõj¢ÎâÅ‹óòòŽ;¶lÙ2¥ ¥Ýár¹Zi–qh½ˆ#ÒàžÝÅ‹]]]9ŽƒƒCbb"Žã¾¾¾§©©©««ëý÷ß'žÆÆÅÅ!…{mñññJòîUïòéÓ§mmm ¼½½ÓÓӈǡ;w:::ššš.Y²¤¾¾^1°öööýû÷ûùùi¸§Š·Ï~ûí7}}ý¼¼<©T!ŒJKKÉ:‹-š:uªb ľhõºg×{w4lîÙ)‚úM“dG#¥d1Ä/^­LJJÊ`¤Ü ›…d§.cÓ;wŽò«Z‘‘‘ýj§££ãêÕ«?ÿüsXX¹ÐÁÁÁ××Wë})5 4ß £ ÞÏŸ\˜;wn7¡”‘‘±råÊO>ùDñûdJO`ÐeýÁ<Øa,HvhÇ’%K–,YBw@%¸Œ0$;#@²t*,,œ?¾‘‘ÑsÏ=·fÍš¶¶6º# uëÖavúôiÅ…ä„t03ÝpÉÐF"‘øùùM›6íÞ½{éééëׯ§;¨Éd©©©666ÉÉÉtÇT‚dhóå—_º¹¹EGG[YYýýï?pàÀ±cÇZ[[鎫ß.]º$•J?ÿüóÓ§Oß'Ã$;@›S§N)IûÛßþV__oddÔÓÓimm=~üøeË–‘3¸©ŸÞQMý¦f묬,¡PxðàÁÞ3ÓõWRRR``àÂ… {zz~þùgUÕ(÷K.—ïÚµËÁÁÁÈÈhúôé—/_VÜ„˜Ùe! ôŽi#ÒÒ7(ÆŽ{éÒ¥ÞËwîÜéàà››[\\;;»¦¦&&&ÆÈȨ­­l­³³3>>ÞÛÛÛÃÃãðáÃ䲆à2VÐoÚJv8ŽOKÇŽ;qâÄþóŸMMM8ŽK¥Òððp+++·téRò*4IvJS¿©™óŽØDÕÌtH³ ã–-[¶téRÅ%zzz§OŸÆ{%;Êý’J¥[·n …†††žžžÄHRZZÚ²eËrrrvx!Ù)ÂpmÌ÷ð¤¤$âDiXÁ0L,{xxh¥©”””‘þÅþãLJ††Âgœ÷ì€nik·!¦£yè`Š' [Úš-NZìhðóÐáÎìŒÉÀìŒÉÀì@!$ëD²Nºƒ:OcÁ@äääЂ–Yã9a•ØtºѦÑ÷6  *ý¦ôMõÑ!mÂZò5Ýqè|Æ pfúm~x¤QêD„0¼«áÒ Ð ¸gBU§’#$CU§èè $;*?‚††Êô]ŒLìã=}„ê³.C¸ Õg¡ÎZº:É0ÞÄؾ`¡‡ðsˆ£$;Àxåq''–¡²8:ƒ:É0[[ zœÐŸÏ—q=ÎGOÊÕnF$Hv€ÙG,ýg–°ôPÅ1š¢:É0[éHÞýÌy7<“• Ùk¾…ž”P,o-FÍ·‡< [ìƒU$"ÖŠå¬1¨"qÈ£ºÉ0ŽÊŽ ¹”b\ŠÊãþzjFHv€©šÄèé#„±Æîõ…:ªPSÝ!m‚‰Su5 ÇÕ½lº†Bæž ê‡:$ K0Å!„~A¡—ŽÓиŒ0$;#@²0$;#@²0$;#ÀÐB=)C!c{ºãºÉÀp `HvF€d`HvF€dÀµ¶¶~øá‡ÖÖÖÖÖÖ«V­ª®®&Va–——×ÓÓƒaXcc#±„(èŽbwƒ„)àr¹"‘¨¼\ùGˆÔt§´ãyyÃb²,Hv „\.Ÿ?þÕ«WSRRªªªÎž=Ëáp¼½½»ººÈ:l6;>>ÞÄÄdhBÒnw™™™‰D"‘\½z•Åb-Y²Dóî†xÇ5CO@!TBî»4¬~èС?þ¸¤¤ÄÈȈ\ØÜÜlbbÂf³1 ‹Åä* ÃÆ¯•`µÛeûŠñ×ÔÔðùüÊÊJ@0Ȧhgv „zRößqÅT”–$$$¬_¿^1Ó!„¸\.›ÍV\¢x¡—––fkkËårƒ‚‚êë뉵GU*õɲX,öòò244´µµÅ0 !daaA^'fee …ÂC‡)^<ž9sF ðx¼={ö „º»»7nÜ8aÂ++«ØØX‡£ùÕ¥žžBH*•Rv'‰"##‰šõõõúúúåååJW¸8ŽïÚµËÎÎŽÇã755© ‰²fïƒ@¶ÜÜÜÜÓÓ£Ñnàdzƒñì`ŠÅÙÙ¡¡¡...JËÍÌÌNŸ>­ª1âÃIˆÂ /¼pãÆ[·nMŸ>}Þ¼y8ŽÇÇÇ—••)ÈúŠe{{ûðððšššÔÔT‹U[[«TÍÛÛ;;;»££C±»€€€ºººÔÔT==½ÎÎÎèèh''§üüü;wîøúú²Ùl"Bõñã8^WWæää$“É(»‹‹‹›°²²zóÍ7óóó•ª×ÕÕ ‚¹sçŠÅâG¥¦¦¾ð Hí™Ý‹/¾xóæMâž]HHNuÏŽËå8p ¥¥eíڵ䶶¶¶6l¨©©IIIÑÓÓ#nüß»wˆ)œ£¡gϧFFF:;;çççß½{7 !D< »V„TŸ÷Qv×ÞÞnddäääôË/¿PF²mÛ6WWW±X|ÿþý·ÞzËÝÝÇqÊ(kRbyggg||¼···‡‡ÇáÇ;;;U½ÃìÀq\åŠöööýû÷7Ý•<|øpÙ²efff†††"‘¨¬¬L}²KHH°²²233 #«ÅÇÇ+âââ&NœhnnN<œ%¶½xñ¢««+‡ÃqppHLLÄqÜ××—Ãá455á'»ÎÎÎuëÖ™™™ÙÙÙ¥¤¤ „nܸ¡Øµ¢þ&;ÇCCC…B¡\.§ŒD*•FDDcc €ÒÒRÇ)C¢¬IyiiiË–-ËÉÉ¡ŒVŒ³!ĬùìîÜ¹ãææÖÐÐ`nnŽaXJJJï1Ã4†¤£.àž!„ŒíGw¦›:uê¦M›ÚÚÚjkk·nÝ:kÖ,"­888øúú«t’Œ”””ŸŸÏçó‰ksbyII‰……Ű IGà2Àpf`HvF€d`HvF€dB¡‚ˆÿNiF)=º`xP=™àÌÀìŒÉÀìŒÉÀ쌀bÖ|vÌÉÀp `HvF€d`HvF€d`HvF€dBæ³ý`>;B0ŸÝègvF€d`øºèÛW_}•““CwºäRˆJ)šLw ºåååõÁÐ=àžè[NNNnnîôéÓéD‡F}šCåææÒ ÙLŸ>=99™î(À Óàž€ Ù’€ Ù’€žy›““óÕW_Ñ Ð…á9® ð†††ñãÇÓjmmݾ}{RRR}}ý„ ^~ùåíÛ·[YYAŠÅbwww}}}"Ú!»§§‡ìNw½0Ó3gv•••)))t…´.77wÔ ¹\>þü«W¯¦¤¤TUU={–Ãáx{{wuu‘uØlv||¼‰‰ÉЄ4ÄÝ1 Å8;N5jÐ>®jøœÁQ:|øpiiiII‰‘‘BÈÂÂbïÞ½ÑÑÑzz}.0 {ýõ×uÑ;åÁÑ]wîÙ­‹Å^^^†††¶¶¶±±±†!„,,,»ºº6lØ0qâD ‹o¿ý–Üð£G*Ž;&LLL6oÞœ˜˜ÈçóMMM7n܈*((˜={6Ç;v¬««ëñãÇÉvÒÒÒììì¸\nHHHSSSïð”–$$$¬_¿žÈt$.—Ëf³—`ÖØØH”ÓÒÒlmm¹\nPPP}}½ª] ë“e5‡¨–••% :Dn‚aØ™3gÇÛ³gB¨»»{ãÆ&L°²²Šåp8yyyý£˜ W””¤´ŒhAAAAAACÖŽ½½}xxxMMMjj*‹Åª­­E544à8) ³³³‹‹‹ýüüÈåñññeeeŠ„H$jll$î¨Ì›7,—––:;;¯]»¶¼¼¼¶¶666ÖÀÀ ««‹ØÊÅÅ%77÷îÝ»>>>‹/V ,;;;44ÔÅÅE)`33³Ó§O«Ú„X,& D´¡^xáÆ·nÝš>}ú¼yóTíQ_±¬æàÕ¼½½³³³;::» ¨««KMMÕÓÓëì쌎ŽvrrÊÏÏ¿s环¯/›Í&"Ô¶þF(Hv£Ù';·{÷n¢,‘HzzzÈÏ­ÝÁƒ‰U7nÜPüœ+Aeffâ8.“É”Êb±¸¹¹¹§§‡¨Y\\¬˜>L,/((@µ´´ttt8pÀÝÝ}æÌ™IIIR©T©/==½Ë—/+vMH$¸ŠdGăãøõë×B?¦Ü…ÞÉNÍÁ!ª%''+m‚:qâ¹û NNNqqqDµ›7o’jˆáÉ.cÖìÛ·o×®]666+W®¼{÷®âÅ`MMͤI“ˆ2YPÅØØ!Äb±”Ê¡æææÈÈH___>Ÿ¿zõjÅ­ˆ‚³³3BèàÁƒ6667oÞLLLÌÌÌ Ñ××WêˆÏçß»w|)‘Hª««ÕÇæèèH\\\ˆýR_Ÿ¤æà„Baï­ˆçÂäîWVVÚÛÛe''' »Hv@kæÎ[QQ‘œœlii9sæLÅÄ!È´RRR2à.|}}ËÊÊbbbâ¼ !ÄåróóóÕ@_\\Œa˜µµ5e5ÇBUUUä5‡@f4EÄ­=’¥¥eyy9Q&÷hh€É®µµõÃ?´¶¶600°¶¶^µjùæa¦Ý›¦-v1ÈÖïFkئÖÑ0áîî! =<ñ¨pôèQâÓKÔëîîöôôtrr*,,\±bBèñãÇ΍¨(±X\XX¸~ýz‘HäããsöìÙŒŒŒêêj77·U«VžŠ¶nÝZSS#‰òòòjjjÒÒÒ¶mÛ¦>€ˆˆˆ[·nݾ}{ݺuÁÁÁ&&&½wËåž:uªµµ5::Z“ƒ£¹°°°¨¨¨ëׯ‡‘Ȇ=¦S¼¦ÕðžL&óññy饗rssëëë Þ~ûm¡PØÙÙ‰+ÜéÐÉŸB™™™D™¼q3xƒ QÝ~RߦÖ‘*C|ÏîâÅ‹®®®ÇÁÁ!11Çq___‡ÓÔÔÔÕÕõþûïOcãââÂm©øøx¥ypz—OŸ>mkkk``àíížž@\¶l™™™™¡¡¡H$*++CjïÙ%$$XYY™™™………‘Õ”v!..nâÄ‰æææÄÃYb[5§÷ž’Ý)-ììì\·n™™™ñÐæÆŠ]kå}­’ì<øÜsÏ=yòDq!™€t÷IÖQË}&&U·ÒÕTÐ<ÙõÙþ` q²£Ñýÿ1|ܾ}›¸ªÀq!”’’Òç&Ãÿ}Ô©\Æj2:©§§'22ÒÚÚzüøñË–-#Ç=©E…¨F-©BMz÷ÝwU½R¦„z w"[£À¥8JÕ/D5öŠ€ãø®]»ìììx<^pppïÁ_Ší«ªÜçÌ1uêÔM›6µµµÕÖÖnݺuÖ¬Yæææ!___º£ö3Ÿ†gvšŒNÚ¹s§ƒƒCnnnqqñ¬Y³ɵjFQáT£–”ZV|I M …ªÆ^) SÂU w‹Åjpg^j*ô{E´ùÝwß9::æää”””ˆD"ò?UDuf§¦²ú#¦sÎìâÖ­[³fÍ266622zùå—ûüPÂð÷q ÉN“ÑINNNGŽ!*ܾ}!ÔÒÒ‚÷5ŠªX{%;bh’š±WJÔpÃÔà" j*ô{E´9eÊ”„„bUuu5›ÍnooÇU$;5•|Ä ÙE r«Éè¤ÊÊJrÜQ ëEÕ_ÄÐ$5c¯”†)!ÕÃÔ4ÒgUc¯ÊËËÈÇÇVVV2™Lq,‚5•µxÄ`¬|f4$ˆ[!¢Àçó'5â3¯fì•Ò0%¤z¸“šFú¬ jìŸÏ?yò$ñ¿Š\.—H$jÆÓö«2 ¿’ì4ôÆo|öÙgb±øÞ½{ï¼óŽH$âr¹š4ÞßWHíØ«Þ(‡;©o„õ¢¦Bï±WÄò+VDFFæåå•””¬^½Úßߟ2$¢} +3œâXK.—+‰zÿ‘ôôôP~TZ5ZG;•¯i5ÿnlŸ£“¤Rixx¸••Ç[ºt©âwÕŒ¢Â©F-‘P¯{vÄK5c¯zßë=Ü ©ÀE†RÓ åØ+â DDDcc òv²b`dûšTVUVeôݳC c-‹ŠŠ.\8mÚ4¥:r¹<>>žx¥f•&p”>ï#-0\á ÃñãÇCCC—€˜Ïnðj«Á#föðð ^ÖÔÔðùüÊÊJ@0Ȧ˜`ø¼´€ûÜ`#fÙ”J¥ˆjJ8‘HIÔ¬¯¯×××///WºÂÅ©†7RNGY©¹I<¾²CúÉŒTõõõï¿ÿ¾“““­­-±dË–-?ýôÓk¯½F¼ MKK#Ê)))>>>vvvJìÝ»÷àÁƒ‰‰‰b±¸³³síÚµ¡˜˜˜3gΜ;wîÂ… ñññD΢¬‰Zºt©ŸŸ_YYÙW_}µfÍšºº:bynn®££ctt´â8s@'ÅkZ˜Ïn”•÷ìH†M›6­  €\¥4%\KK ‡Ã)**ÂqÜ××÷СC¸ÂÝ[¤z,$å´qªBö¹IF[QQ±yóf@°|ùò«W¯êøØômø¼´€3;0Â(:::®_¿þüóÏ“«”¦„3557o^jjê£GþøãÊ_ä ÞH9mœªj&ª …;vì())™3gΚ5k<==µ~4€æ ÙÆØØ˜Ëår¹\rØ©÷XkâJ6%%%00­„rx#å´qªBö9Q]qqñ•+WZä¤OJIDAT[[gÏž=øÝÉŒf .,**Ú³gÏÊ•+)+Po¤œ6NÕ@HU#7»ººŽ=êãã³jÕªéÓ§ß½{wÇŽC±Ï@ŠŸR`Ô Ææä䨤½yóæ§OŸ¾òÊ+ÍÍÍ>>>©©©¡ÈÈȦ¦¦Ù³gs¹Ü˜˜˜óçÏëëëSÖDÅÆÆnذá‡~°²²Š'¦!A¥§§gdd|ùå—Ó§OšêÁ8»¿deûù9Ó…6¾qvCïÎ;nnn d¹˜ü>"Ê3»Þß'e/P*­~òDLw ÚDw#ÏÔ©S,X°uëÖöövÅiãÀˆöL²óöö&FŸ0Ó‰²²j,XòÊ+v£&á«úE FRRÒ{ï½Ççóq÷ññÙ¿?Ý-x&Ù ‚ºB¡]Wו¬¬ä߯33³üöÛ0}}å» áêêúË/¿ÐÐ2xûgççBr9þŸÿÜÞÛÚÚIwD­d÷'§‰D¡§G~ýúC‘hwmm ½!´’Ý_ÌÌŒLMÇåžÙƒM ì.+k 7*€V@²{†£ã²ÜÓ#khh[¸ðë›7+i  ìž1e _OOñ!å­­ßýúkQU:[zžÔH鎌 ð Šg·íH2™ÇñåËìÙóúâÅÓh‰j8HII>0õ0}×q>Þ¼EBC—í…¡²6º#1˜<îcì÷%(]ºTøúëÔƒªX,ì‹/B—.}qˆCrrr*+‡Åµ¼¬†Ó}ÛDzÛ—²BcÔq…L×ÖÖÖ^^^tGAHvϨ¬|ü⋟Q®"ÎkVÏœé2´AÔ^×}?£©0¥ñI”ÅÆä2c£‰3ZxÀ —ÓM0ÜÁeì33G¿³³[q!›Í’Ëñ_´û׿Ÿ¾0t:›{J2Ÿlz\ò”¥É»q„\†#„0 óýÄ2Ð$»g`fk;¾¨¨†|‰aÈÎn|tô’3àW\‡ˆ¼ðkó½SMÕ×Zqár„"2ÅÆþ¶bâ8¡m!‚’2Ë{÷êär¹¾¾ž©)§³³Ûß2dº!Ó^'=õæ½öZ)KÉ©~¯Ã—íþÏç†<40²ÁÐe“&M”Ë円c6n ¸vmë–- þýÁŠ_\º`4qŒK 9Æ¢Ît!!ŸMB}CøÓý(”]¸pç÷ßï¿÷ÞÏ!ÔÝ-óóÛ5mšpïÞåt‡Æ YÛ+JÎ>&nÏ)bécV/šÌýÆ‘–¨ÀˆÉ®o§NýñöÛñïÿíoðtbˆÈ¤ò3oÝk*~*ïyæï“= 91Õø¹1tF.¸èÛ¢Eînn‚;ÿCw ÂÒc _ǧÇR¸«Œ±1÷UÏA¦É®o†}òÉ¢¬¬âìì{tÇÂÒvÙÏï—Þ8\çñ¶%ÆÆ0„!„0füÜ÷7๠HvñövôósÞ¶í”\Wýº%)í<±¬HRötqœ³sàx¿ÙâŽÂqÜû#KFÖ‚d§©­[Õœ9S@w £Yů-§VMÐŒwá9ŽE9˜M[õBH8ÃT8cÝ‚ PôÃúõñùù¿ý1f ŒOÔ6åﯹ~ f’Èü¥-BöLqÕï;N[ei4QŸ¾øÀˆgvý± ¶¶åèѺ…ên>¹~ æïÿcé÷/›g2BC/mB¦ƒgvýóÉ''Nœ¸~åÊÇ&&ºcmšŠŸš;¥; 0jÁ™]ÿlØð²TÚ³ÿ¯t2 A¦:É®x<£µkýøá×úz˜F €‘’]¿­Y3ÓØØà›o~¦;@?@²ë7CÃ16¼|ôhNy9üðØ@È»ñºOèŽ0$» ó²µÿ¿ÿ›Aw #ÏÓÇÝg×Ü¿ðayw‡œîX³@²==Ö‡Î=s¦ ?¿‚îXF’úÛíi¯ɺä¯u†9šÀƒ¡'„ãø¢EߎÃNMýÿtÇ22Ü;ÓôûއÖ>ãfn·…L†üÍ †a,ÊÉ)…Ÿ”í.Çsbª~Û^ñÂþœ{Èt€pf7(¯¿¾¿¦¦åÂ…Y,ø‚ºJ×¾«¾ýSýK '‰ÌéŽ0$»A),¬™3'æÛoÃ^}õºc¾Úë¤íõÝÜŒè0$»Áz÷Ý„«W˲³7Ãì gp÷d°6mš_W×w…î@ê@²,ÀlåJŸ¯¿þ¹­­“îX€6õôô`ÖØHñÃrŠ«0 ËËËòè@¿A²Ó‚wßÓÓ#ûá‡Lº¡_Wk´MFwÚÁf³ãããMLLúµ [ì´€Ç3Z·nÖ¿ÿýk]]+ݱЩùAçÉÅ9_Tшv`öúë¯ôk¶ ÙiÇš53Ç3üúkæÎðà׿“Ë‹Œ&è¿ø¾U﵆;vL ˜˜˜lÞ¼911‘Ï盚šnܸQM›ê·*((˜={6Ç;v¬««ëñãÇÉ­ÒÒÒììì¸\nHHHSS“šö{×Ä0,++K(:tˆ¸V‰D‘‘‘Ä&õõõúúúåååJW¸8ŽïÚµËÎÎŽÇãMuwwoܸq„ VVV±±±'//²&BH,{yyÚÚÚÆÆÆöëàà@Kââ.[[pï^-ÝÐ ï‡Gû_ÈÏÚö@&•SV@‰D¢ÆÆÆ””„мyóÈrii©ªfÕoåìì¼víÚòòòÚÚÚØØXƒ®®.b+—ÜÜÜ»wïúøø,^¼XMû½k"„¼½½³³³;::B qqq“'O&6Ù»w¯ŸŸQ­¡¡(ˆÅâï¾ûÎÑÑ1''§¤¤D$á8íä䔟ŸçÎ___6›­ª&Žãöööááá555©©©,«¶–‰H:ÉNkzzd¾¾;W¯>Lw Cª»SöËæ²XÏë…© jª!„233q—ÉdJe±X<°­š››{zzˆšÅÅÅŠÙçðáÿ¾ ¡––Uí÷®‰JNN&+444´´´p8œ¢¢"Ç}}}:„÷JvS¦LIHH ¶ª®®f³ÙíííNNNqqqÄ›7oª©‰ã8ÇÛ½{7±\"‘»´.cµ†ÍfmÚ4ïìÙùùèŽeˆÈ{ðóï–>Ìncïòêxõ•B,K©<à­š››###}}}ù|þêÕ«·rpp ÎÎΡª*•·)k …BÅ:¦¦¦óæÍKMM}ôèÑüÜ»òòò°°0 Ã0 ³²²’ÉdUUU•••öööD'''55BûöíÛµk—ÍÊ•+ïÞ½Ëf³û<8 _ ÙiÓ‚Ï¿ð‚mtôYº",=ÌÆoÜâÃÎ6¾4üÈ¡¯¯oYYYLL̃Ο?¯¸ª´´”(Ü¿!ÄçóU5BY³w MKKKII $r®>ŸòäIâ B.—K$’I“&YZZ–——+uDY!4wîÜŠŠŠäädKKË™3gVWW÷ûˆµ ÙiÙÇ‹rsKùå.Ý ×eÌèùí¡îînOOO''§ÂÂÂ+V „?~L¬ŠŠŠ‹Å………ëׯ‰D\.WU#Ö\¸paQQÑž={V®\IYaÅŠ‘‘‘yyy%%%«W¯ö÷÷G………EEE]¿~½°°x¨‚aeM„»»{DD„P(ôððÀqœÃ_tÒ6Ú. G¯+Ìšõ¿2õ­zfB ÷æT•û»ÕéÓ§mmm ¼½½ÓÓÓ\\\ˆµ;wîttt455]²dI}}½šö{×Tꈸ1‡ãxhh¨P(”ËåJ«ˆúR©4""B O]:;;×­[gfffggGú裰°°ŒŒŒO?ýT©Îk¯½6cÆŒ­[·¾ýöÛfffááá6¾cÇŽÛ·o+4éNMï¼óÎÁƒ_{í5777ÅúóçÏŠŠzûí·¹\î¦M›úu¼w gŒ›©˜ “wúûûÿðÃÎÎÎCÖ#1y'sþ–ÀHgvF€oPŒBL8{ ¿àÌÀìŒÉÀìŒÉÀŒ{K9d |y  JvÖÖÖAAAtG1:YXXL™2…î(P‡Aß 0ܳ0$;#@²0$;#@²0Âÿ„àØWqù_IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1SystemPrefs.html0000644000175000017500000004477612234777147027042 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::SystemPrefs Class Reference
        Glom::SystemPrefs Class Reference
        Collaboration diagram for Glom::SystemPrefs:

        Public Member Functions

         SystemPrefs ()
         
         SystemPrefs (const SystemPrefs& src)
         
        SystemPrefsoperator= (const SystemPrefs& src)
         
        bool operator== (const SystemPrefs& src) const
         
        bool operator!= (const SystemPrefs& src) const
         

        Public Attributes

        Glib::ustring m_name
         
        Glib::ustring m_org_name
         
        Glib::ustring m_org_address_street
         
        Glib::ustring m_org_address_street2
         
        Glib::ustring m_org_address_town
         
        Glib::ustring m_org_address_county
         
        Glib::ustring m_org_address_country
         
        Glib::ustring m_org_address_postcode
         
        Gnome::Gda::Value m_org_logo
         

        Constructor & Destructor Documentation

        Glom::SystemPrefs::SystemPrefs ( )
        Glom::SystemPrefs::SystemPrefs ( const SystemPrefs src)

        Member Function Documentation

        bool Glom::SystemPrefs::operator!= ( const SystemPrefs src) const
        SystemPrefs& Glom::SystemPrefs::operator= ( const SystemPrefs src)
        bool Glom::SystemPrefs::operator== ( const SystemPrefs src) const

        Member Data Documentation

        Glib::ustring Glom::SystemPrefs::m_name
        Glib::ustring Glom::SystemPrefs::m_org_address_country
        Glib::ustring Glom::SystemPrefs::m_org_address_county
        Glib::ustring Glom::SystemPrefs::m_org_address_postcode
        Glib::ustring Glom::SystemPrefs::m_org_address_street
        Glib::ustring Glom::SystemPrefs::m_org_address_street2
        Glib::ustring Glom::SystemPrefs::m_org_address_town
        Gnome::Gda::Value Glom::SystemPrefs::m_org_logo
        Glib::ustring Glom::SystemPrefs::m_org_name

        The documentation for this class was generated from the following file:
        • libglom/data_structure/system_prefs.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Summary__inherit__graph.png0000644000175000017500000001636612234777146033540 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÂÀWÈbKGDÿÿÿ ½§“«IDATxœíÝyT“Wúðû’Ð"„±†T¤âÒNÇ©G°Rq¨¸d9,"ô`{œAZ:.3@­ë©38S+£2G ¨@@D«ãR ˜è`EÚ ‹Êª!(KC–÷÷Ç­oÓ„—$Øçsüãæærßç½ù&ï›ÍP4M#†ÍÁÖ€$ Id@’$@=TQQQ¶®–““3ä<°‡³á¹sçnܸ‘ÔnÛZ±bÅpþ|XIâóù111ÙØa& Γ$@$ Id@’ÖHRggç–-[‡Ã«W¯njjÂWQ%•J n‹2†à&†9EQmmmƒš“øa½ ` N·téRŠ¢Äbñ”)Sš››>T]]ÍápˆoN©T↻»{qqñ믿Ž;v,ñ #ž¤cÇŽÕÖÖÖÔÔŒ3!äååuèСݻw³Ù#²i.—Ë´]]]õ/ZEQr¹ÜÓÓs”Î?#~tËÎÎ^»v-ŽƒËå²X,æ¢F£‰DÀÓÓ3..N¡Pà~Š¢N:ÅçóÇŽ›ššzòäIçææ¶yóff@VV–~Ê¢JJJ|||Ö¯_êáááììeúišÞ·oßäÉ“=<<¢££™EÐßf~Sƒ\±4œ÷Ý¢¢¢æîî^TTdêZ„D"Ù»w¯ŸŸ_YY™L&[¸paDDs­P(lkk‹Å¡%K–0íÚÚZš¦333ëêêô3ë_ ºqã†ORRR}}}kkëÑ£G9ŽJ¥Âž>>¡ööv‘HÌãñõx{{ÌŸžž¾oß>__ßwß}·ªªŠ9"›™dÀS§NÅ€€„PKK ¾X__Ÿlz{{kµZfú33˜àŠ Êˆo#<<<==ß-B\.÷öíÛcø|~]]nãÇ#^ ^Ðàà຺ºýû÷?|øðâÅ‹úð‰ˆ¾Å‹?zô(//oâĉ ,`îf&p@MM nÈd2Š¢¾Èãñ ñý[§Ó)•ÊW^yÅÔ¾ j°uŒx’¶nÝÚÒÒ" ¥RiKKKAAÁŽ; ƬZµjçΉ¤ººzݺuB¡ÐÂç\YYYõõõú©Õê9sæøûûûí· èùñŨ×_=%%ÅÇÇç7¿ù MÓNNNN‚_†03 %%åÞ½{•••ï¿ÿ~tt4ó EBB‚H$’J¥555‰‰‰!!!FKÂó[8ت†|\´ð<‰¦éÇÇÅŹ»»»¸¸…Bü¨£žÔ××—œœìíííáá‹Oè~§ýÛ¡ÌÌLýõ;OÂ‹ŠŠ&MšÄáp‚‚‚Ο?Ð~\Õ+WfÍšåäääççwòäIf˜©I‚ƒƒœœ …™­dgg{{{»»»ÇÇÇ,BJJ ŸÏwuu cNõ cæ·d°©¶)hxçI=Ôï»EGG#„òòò†žb`O(ŠÊÉÉòÎà}7@$ Id@’$@$ IXKK»­K†õ!¡ÆÆFýÏK¼º»Õ'OÖýáÓl]ˆÝòkš¿os»¸ÌzùåuN¶.Äló÷/DDħ·nÕïݵjÕ<[×b×à<Éœ'O:¥Ò‡…NŸ6üü0I2§°ðEQ4$’‡ &?2$É<±X¢ÓÑ!ËáìÙ [—c× I&ÕÕÉïßoÆç‘Z­./ObëŠì$ɤÂÂ;ŽŽ?®MÓ2Ykuu«mK²g$“òò$jµŽ¹èèÈ**‚œI$ã*+›=úÙ7ÎÔjmNÎ-[Õcÿ IÆÞqtdt65)ïÞm°I=ö’d„NGçåIÔj­A¿£#«°ðŽMJ²$#¤Òz¹üûþýjµV,–jµºþWH’……wØlÃC¦Pt•—×Y¹žQ’dH«ÕUètôK/±ñ?GGÓFˆ:wžÁ1âÿëͨÓÞÞóþû?}±ªªùôé;}$dzÜÝÇû»_:ø,ÀŠŠ*’’Ž77°u!öŽn€ H ’È€$2 I€ H ’È€$2 I€ H ’È€$2 I€ H ’È€$2 I€ H ’È€$2 I€ H ’È€$2 I€ H ’È€$2 I€ H ’È€$2 I€ H Ãzÿ;`ZZZii©u¶EPo¯ã³gNÞÞFþSeû·iÓ¦ÀÀ@ëlËzI¥¥¥eeeVÛ)ÎÎêQ#±XÜÐ`½_4°êÿ};wîܼ¼¼xñ"Ó#‹srrbcc)Š2S~<T°x<^aa!¾sët:¥RùÊ+¯Ú#ë°»$mݺµ¥¥E(J¥Ò–––‚‚‚;vŒYµjÕÎ;%Iuuõºuë„B!—˵dò¬¬¬úúzýB¨«««ý9­V«V«çÌ™ãïïÿí·ß&$$ „ž={†Z¾|¹T*=uêT\\œ™¸\î™3g:;;wïÞ­¿i¥Ri´$ÜŸ ‰¤RiMMMbbbHHˆÑÁvÍjÇQ Ï“hš~üøq\\œ»»»‹‹‹P(Ä÷xý󤾾¾äädoooØØXS§ ýÛ¡ÌÌLƒ†>‰DRTT4iÒ$‡tþüù°°°€€láü¸QPP0yòd.—à ¶¥‘ ©…÷ww÷¢¢"S×"„$ÉÞ½{ýüüÊÊÊd2ÙÂ… #""˜k…Ba[[›X,F-Y²„i×ÖÖÒ4™™YWW§ß@ý“¦M›–””T__ßÚÚzôèQ‡£R©Ž;ˆlذaÍš5fj`~˜¶~ç€;tãÆmÛ¶ jþ€€€²²²ªªªyóæ-_¾Üü"[á1ÉöIb³Ù7oÞü© ç”J%ýü†÷÷÷?~ü8PYY‰êèèÀ×Ó4­Õj Ú¦aý¯joog42™ ßZíííNNNZ­–Çã•””˜©Á|’ÜÁ¼¼<š¦;ÿ±cÇpgEE3Ø”_ÄÑÇãUWW3•Jeÿç5 ~~~¸ø¢««+BÈÁÁÁ m¹ööv‘HÌãñqç¸qãBCCóóó¯_¿Îf³çÏŸo¦†aî ù}4ЧÑh&Nœø·¿ýM¡PTTTàÏ‚Éd2š¦;::œ¹\nEEMÓ¦jàr¹GŽéèèHJJBzGŸêêjËwpóO:õÖ­[UUUóçÏgó¶Û'‰¦éÇÇÅŹ»»»¸¸…B|Ô_è¾¾¾äädoooØØXýóóIBeff4ôI$’¢¢¢I“&q8œ   óçχ……àyÂÃÃgΜ‰Û¦jøâ‹/&L˜0~üxüÜ÷;99) wp°ó#„öîÝ;uêT77·ÈÈȧOŸ’º-†Ì.’d·–/_¾{÷n[Waä«b¿ˆ3nûÔÓÓS^^~éÒ¥øøx[×2:Œø§oG© .¼ûî»Û¶móõõµu-FÐö÷™fH’q‘‘‘‘‘‘¶®b4£ ’È€$2 I+.þÎÖ%Œ#~Æ=Ò›Q==Ž2Ùøÿû¿V[2,VxWn“ATTÔÈÍo …KO»§ÇÑÖ… ŸÏéÛ‚²ÃW&ìMÓo¼ñqssûºu¡©©Ël]Ž]ƒó$s¾ù¦±¹¹!TPpîræA’ÌÉÏ—::²BMMÊ;wÙº»I2I«ÕHÕj-B襗X§Oß±uEv ’dRiiͳg=¸Ý×§ÍÏ¿­Ñèl[’=ƒ$™TPð?6û§ï·ttô~ýõÖcç IÆõõiŠŠþ§Ñh™GG‡‚Ã$ɸk×¾ëííÓïQ«µçÎÝýáµ­J²s$ãòóo³X”Ago¯Þ91’dDw·êâÅÊþç×p€3 ’dÄ¥K÷ñ“Z­öÒ¥ÊÎά_’ýƒ$qúômüÝþþÔjÝW_UY¹žQ’d¨££§¤¤Z§3õÒ]X/QïàR©4­­ÌÅ+Wª¶n-(-1=,–Ÿïn‹Òì|#À‡ÃöõÏ\ôò‹ÒïFÁÑ Id@’$@$ Id@’$@$ Id@’$@$ Id@’$@$ Id@’$@$ Id@’$@$ Id@’$@$ Id@’$@$ I„Ðzl]‹=¢(Gkœ­«°GQQQúá1ü&£¢¢fΜi“ÊÀ(’——gÐc˜¤™3g.X°ÀJå€QëÚµk=pžÈ€$2 I€ H ’ÈJ’zzz>ÿü󘘘·ß~;&&æ“O>ikkÃW…„„Èd2‚õŸÐ¶¨R©Ž=·hÑ¢ßÿþ÷©©©UU£þ÷™ý»%4M'''SµcÇŽ‰'*гgÏ®]»6++ËÑÑq$J|ñŸÿÎ;ïˆÅb'''ⲦA'éòåË»íêêêàðÓTZ­6###&&fùòå»víêììÄý!!!W¯^ŽŽ^ºté‘#G¾úꫨ¨¨eË–¥§§3._¾¬ß详¦fóæÍáááaaaï½÷~‰,%%…yÕµªªjùòå*•ÊT L8p;$$!aý~š¦Oœ8±råÊðððíÛ·[¾GF±Ùì'Ož]ÀþåY¸nf]1üWwïÞ]±bEHHˆÁêi43õ5è$ÕÔÔøùù™“““sõêÕ;v:tèÙ³gû÷ïg®ºråJFFFJJʉ'._¾üïÿ;999//¯¥¥!ôá‡Κ5K¿ÑßÇÌçó>|êÔ©èèè={öh4š’’<àêÕ«o½õV~~¾© #„ Çgª¿°°ðüùó[·ný׿þÕ××—––fáµbÅŠüãÛ·o¿té’B¡0¿˜nÅÌ£+†ÿêÈ‘#"‘hãÆ«Çfú´gÐIêééÑ_ñ纺º˜Î .¬Zµjúôé|>ýúõÿýï{zzðU111nnnóçÏGÅÆÆ2m|/ûí·'Nœ¨ßèïóÏ?ß°aÃË/¿ìîîþÚk¯©Õêîîî7ß|óÁƒmmm4M_»v-44ÔL CpæÌ™÷Þ{oÆŒ<oóæÍ7nÜP©T–ì‘Q+V¬øôÓOõ«_åääDGG'&&J¥Ró ¸3Œ®þ«èèèW_}õ·¿ý­Áê a‰½ñãÇ7440ïòž={V¥REEEéyúô)ÇÃmÜËå¾¾¾!ggg„þ•Yý¶åºººNœ8QYYÙÔÔÄçóqç˜1cfÏž}ýúõ)S¦°X¬W_}ÕL CÐÚÚºk×®]»v1=r¹o}{ÔÝÝ=}út¼† …"33S$åææº¹¹™ú“·bf€ÑÃ&L˜€Œ­žE‹òsƒNÒ¼yóΜ9³hÑ"|\wuuýæ›o Æxyy577ãÃ~ø?žØo6®_¿~ÆŒIIIþþþ4M/Z´÷/X°àË/¿|ôèÑÂ… )Š2SþüŒ\.·|£ãÇÿàƒæÍ›‡ÿ¼»»ÛÕÕuÈ»°jÕªM›6á™Ïœ9ÓÙÙ‰“4„òÌ3µbH/m«7„­ úè– P(RSSe2™B¡¸qãÆñãÇ Æ„……eff~÷Ýwÿüç?-\÷Ë—/ã[i „z{{»žÓétZ­³=z´gÏ„Ð÷ßzóÍ7e2ÙÕ«Wñƒ³©\]]oÞ¼ÙÓÓ“••¥¿i;vìŸÿüçøøø .lß¾Ý`ÌÊ•+çÏŸ¿uëÖ>øÀÝÝ=99ÙÂÉ÷ìÙSYY©ß@mܸñwÏ=xð`Ó¦M§OŸŽŒŒú!äââ2{ölOOOü„ÀT ëÖ­ËÈÈX¹r¥þcøk¯½¶zõêþëËôÇÅÅnݺõüãÓ§O?þøãÁ®›¾5kÖ,X° ---66ö/ù‹Z­Æ7°©ò†ÉÔŠé3X½!øÙosSõ׿þuô~>I$MŸ>=>>ÞÖ…ŒJƒZ½íÛ·{yyéÞíùmn•JUWW'•J×­[gëZ~tëÖ-£Æï¼óÎêÕ«­_DVïIRyyù¾}ûð“{0gÎüŠ”ý#²z/H’‚ƒƒƒƒƒm]ÅhEdõàS%€ H ’È€$2 ϸïß¿o“:Àè"—˽¼¼~ÖßæCcðmn ˆ€ó$@$ Id@’$@Æÿ¾øqtIEND®B`‚glom-1.22.4/docs/libglom_reference/html/ftv2plastnode.png0000644000175000017500000000034512234777145024642 0ustar00murraycmurrayc00000000000000‰PNG  IHDRɪ|¬IDATxí=QF‘Ø¥D«ÔkÄ:‰F©PK؃=V@§Õ³ Õ8SHxñÌ0bnrróŠ{ò½¿¾’$ ÀÏTŠP  ö¼X¬OÛd6êìòð"°²S´±O¥B€(¡àQé)š+YĈ ÒªËRÉÐ>VtÉsˆm9(ê„䜥k‚-@ȧ-Ü$ó b Ò[he ¿Kp-ôl|CùÿApRG'rÍ­aIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__GroupBy-members.html0000644000175000017500000010155312234777147032073 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_GroupBy Member List

        This is the complete list of members for Glom::LayoutItem_GroupBy, including all inherited members.

        add_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        add_item(const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)Glom::LayoutGroup
        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_GroupByvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_border_width() const Glom::LayoutGroup
        get_columns_count() const Glom::LayoutGroup
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_field_group_by()Glom::LayoutItem_GroupBy
        get_field_group_by() const Glom::LayoutItem_GroupBy
        get_fields_sort_by()Glom::LayoutItem_GroupBy
        get_fields_sort_by() const Glom::LayoutItem_GroupBy
        get_has_field_group_by() const Glom::LayoutItem_GroupBy
        get_has_fields_sort_by() const Glom::LayoutItem_GroupBy
        get_has_translations() const Glom::TranslatableItem
        get_items()Glom::LayoutGroup
        get_items() const Glom::LayoutGroup
        get_items_count() const Glom::LayoutGroup
        get_items_recursive() const Glom::LayoutGroup
        get_items_recursive()Glom::LayoutGroup
        get_items_recursive_with_groups() const Glom::LayoutGroup
        get_layout_display_name() const Glom::LayoutItem_GroupByvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_GroupByvirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItem_GroupByvirtual
        get_secondary_fields()Glom::LayoutItem_GroupBy
        get_secondary_fields() const Glom::LayoutItem_GroupBy
        get_sort_by() const Glom::LayoutItem_GroupBy
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        has_any_fields() const Glom::LayoutGroup
        has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::LayoutGroup
        LayoutGroup()Glom::LayoutGroup
        LayoutGroup(const LayoutGroup& src)Glom::LayoutGroup
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_GroupBy()Glom::LayoutItem_GroupBy
        LayoutItem_GroupBy(const LayoutItem_GroupBy& src)Glom::LayoutItem_GroupBy
        m_list_itemsGlom::LayoutGroup
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_GroupBy& src)Glom::LayoutItem_GroupBy
        Glom::LayoutGroup::operator=(const LayoutGroup& src)Glom::LayoutGroup
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        remove_all_items()Glom::LayoutGroup
        remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::LayoutGroup
        remove_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::LayoutGroupvirtual
        set_border_width(double border_width)Glom::LayoutGroup
        set_columns_count(guint columns_count)Glom::LayoutGroup
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_field_group_by(const sharedptr< LayoutItem_Field >& field)Glom::LayoutItem_GroupBy
        set_fields_sort_by(const type_list_sort_fields& field)Glom::LayoutItem_GroupBy
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_sort_by(const type_list_sort_fields& sort_by)Glom::LayoutItem_GroupBy
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_list_const_items typedefGlom::LayoutGroup
        type_list_items typedefGlom::LayoutGroup
        type_list_sort_fields typedefGlom::LayoutItem_GroupBy
        type_map_locale_to_translations typedefGlom::TranslatableItem
        type_pair_sort_field typedefGlom::LayoutItem_GroupBy
        ~LayoutGroup()Glom::LayoutGroupvirtual
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_GroupBy()Glom::LayoutItem_GroupByvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1predicate__LayoutItem__Field__IsSameField.html0000644000175000017500000001642112234777147034621 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element > Class Template Reference
        Glom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element > Class Template Reference

        A predicate for use with std::find_if() to find a LayoutItem_Field which refers to the same field, without comparing irrelevant stuff such as formatting. More...

        Public Member Functions

         predicate_LayoutItem_Field_IsSameField (const sharedptr< const T_ElementField >& layout_item)
         
        bool operator() (const sharedptr< const T_Element >& element)
         

        Detailed Description

        template<class T_ElementField, class T_Element = T_ElementField>
        class Glom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element >

        A predicate for use with std::find_if() to find a LayoutItem_Field which refers to the same field, without comparing irrelevant stuff such as formatting.

        Constructor & Destructor Documentation

        template <class T_ElementField , class T_Element = T_ElementField>
        Glom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element >::predicate_LayoutItem_Field_IsSameField ( const sharedptr< const T_ElementField >&  layout_item)
        inline

        Member Function Documentation

        template <class T_ElementField , class T_Element = T_ElementField>
        bool Glom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element >::operator() ( const sharedptr< const T_Element >&  element)
        inline

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_field.h
        glom-1.22.4/docs/libglom_reference/html/closed.png0000644000175000017500000000020412234777145023312 0ustar00murraycmurrayc00000000000000‰PNG  IHDR à‘KIDATxíÝm @!†ÑGk™É7À-`&séts¦Àñþòð@åk}ª2€… P%Á_Ëþ¿N² .:0Dk¥‹Â›x" Ö›)¡xÒ5õIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_func_0x6f.html0000644000175000017500000003243012234777147026117 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - o -

        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1ViewBase__inherit__graph.png0000644000175000017500000002551312234777146032425 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÍ0›¥bMbKGDÿÿÿ ½§“ IDATxœíyXSWúÇÏM‚„MB@-! V”–T‡ VJ™‘ÅbµeèƒùéhÑqit@ÅâÔ.óhű0­*«,´.È  ZPDQd"KÀ„UC–óû㎷ n=Ÿ‡?Î=÷Üó¾ç䛳Üû†‹A1ÆP4íâwÒ‚ Îd€t† ¤3Ð4í€b0 Ó´ ÚJZZZHHˆ¦½Ì8Õ`Ó¦MšöBË Õ´ Š¿:óðð‡ßËqθÕZŸ!Èé AHg2@:CÒ‚ &ŽÎ$ †ašv¨î†Â’†•——_šdâèŒJ¥&''iÚ„&ŽÎ0 ûðÃuuu_¿žñ0(N0´Xg\.×ÃÃC__ßÚÚ:11¼ˆX,ŽŽŽž:uª……Ebb"N///—Édñññ666îîî×®]Ã+Á0,%%…HàÏ»¦L™‚K ðââb++«7úøø0™L===ggçôôt€²: 8Ž«««P(¬¨¨z9Nvv¶µµ5ƒÁ joo'ò!„ñññ3fÌ`2™ÁÁÁcÛ›c —ÒÒÒ†/3sæÌmÛ¶µ´´deeQ(”ÖÖVŸÏ‹‹³³³»yóæÝ»w½¼¼¨T*—ËýöÛo---‹‹‹y<‡Ã155‹ÅÂää人:ù^ ᆧ§gII‰••Õ§Ÿ~Z__ßÚÚš˜˜¨««+‰”Õ‰×;wîÜÎÎN¡½½ýÐËñ’®®®•••wîÜqww_¾|9žÉår:dkk[ZZZ[[ëï冷~ÓZ¬3&“ùÍ7ßài@ ‘HðØÎÎîĉxþíÛ·ñmöìÙ‰‰‰x¦L&2™L™iyedd@…B¡D"Á3kjjð2ÊêlݺPUU…ŸUx9^²¨¨Ï¿uëàéÓ§¸ÃŽŽŽ©©©ø)G¥RûúúÔÒoA‹çÍ#GŽÄÇÇOŸ>ýã?®®®¦R©x~SSÓÌ™3ñ´žhhh°··ÇÓ†1 CB¬¬¬B¡Ãáxyy±X¬ÈÈÈWÖYRRâçç*¼ÇÖÖO888ZZZðÃúúúÕ«Wc†a˜………T*mnnI÷Œ/´Xg~~~æææK–,áñxx¾¹¹y}}=ž~ôèž`±XD&@(J¥RU¬P(€——W]]Ý—_~ÙÐÐpþüùWÖ™‘‘‘]\\¬ìrœÚÚZàƒå¬Y³Tïœñ†ëÌÅÅeûöíVVVo½õ„N§ãù«W¯Þ·oß­[·îÝ» À0,<<<&&æêÕ«­­­d³ÙÏž=¤¤¤àZ!@0È–X,vss³³³»wïÞÚµkOŸ>UV'€N§[[[þùçQQQb±XáåxÉíÛ·ß¹s§ªªê¯ýkpp0q_fíÚµ§¼¼¼¶¶622ÒÛÛ{,ûrìÑ謭 Â:ãâÅ‹ÎÎÎt:ÝÆÆæÔ©SðÅÒêùóçýë_MLLf̘‘™™ ¨¬¬صk—•••¾¾¾››±*$''Ë'¼¼¼èt:¾~p¹\a^^žµµµ®®®§§gAA¯¯¯ƒƒÃ0uâË/‘HäààpàÀ…—ã%SSS-,,LLLV¯^-£Û·og³Ù†††¾¾¾=RW¿i-Ö™*TUUá7;^¿*­`ÜêL‹çMe899ýýïïééimmݵk×Ò¥KMMM5íÔï ¨³´´´›7o²X,[[Û¾¾¾cÇŽiÚ#Ä8ŽÛ5ÎÎΗ.]Ò´ˆ—˜€ãb‚t† ¤3 ˜–¡¦]Ð>Æï> ´´TÓ.(&1±æƒfèhÚ­BÓ7ð£é^Q …B77ߨ¯ï¤iG”2>ïÓbp¨ã¼¶sg¦›ÛÌœœ šöE›@병qæL9†òòúööMû¢M €¦¦§åå Ëɹ¥iw´ ¤³Ÿ_A¥RR©,3“«iw´ ¤³žÎ•JeAU¯®Ž¯i´¤3U©©i}ð •Ø6éèPssÕ¬KZÒ™ªäåýª£C%Åbizú ú£] ©„0=+¿ô“‚ÆÆÎ»wyšrI»@:S‰ÊÊ&oðtthgΠ]§J ©DNÎ-ùIG,–ddpÑnU@:{5R©,+«|Ф‰Ãç÷”—7î‘ötöjÊÊê:;ûžÒÑ¡¢¶ª€töjΞ­›4‰†ÿéèP‰´T óò~Åoª!†aüÆœ->ÿ|qwöOšïèÈ"r„Â~SSCM¸¦5 xÃbm>zô£€M;¢M yAHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2PÛÿ ---ýúë¯ÕRÕ8‡Ç3b2Ÿëé‰5íȘãááñÙgŸ©¥*µý䦦¦ÌÌÌÅ‹««ÂqˤIüÞ^ÐÛ«i?Ƙêêj5Ö¦æÿ·£Þ šB½%ZŸ!Èé AHg2@:CÒ‚ 4ð~§þþþãÇ “·Þzë/ù‹™™ÀÛÛûèÑ£ööö£«ÙÛÛ›HëëëÏœ93""ÂÅEé r¼½½srrŒGgNqqq‰äÿø‘SQQñ÷¿ÿ=+++ `tGÚ´ñÙ:ƒnÛ¶ Ã°ØØXssóÎÎÎüüü¨¨¨””ׯÿ›o¾±µµôôôäææîÞ½;==N§¿~ͪãíí½wï^‘H¤««‹ç\»víí·ß644ܹs§¾¾þèªM5dÏ›çÎ{òäÉ?ÿùÏÙ³g3 ›M›6%%%Q©ƒßÖ;:ôôô ÍÍÍ×®]ÛÓÓÓÖÖ¦–šUÇÍÍF£Ý¸qƒÈ¹víÚâÅ‹1 {çwFýuM5dëìÂ… ƒ¾…†††ÊožH¥Ò¤¤¤÷ßß¾}ÝÝÝx¾··÷åË—ƒƒƒß}÷Ýï¿ÿþÒ¥KAAA+V¬8räqí³gÏz{{{{{[ZZNœ81sæLKKËÚÚÚèè耀__ßððð+W® ò*)))22²··BxòäÉ>ø &&FÞteeehh¨··wFFžY]]ýþûïK$ooï .àÅ.\¸@£Ñ.\X\\Œ«««ãóùžžžx®®.…VÖ¯_Ÿ——èèèðööNKKtuu-]º×Óˆšvÿþý¨¨(??¿U«VýôÓOÊÚEd묶¶ÖÆÆfø2iii—/_Žýî»ïž>}úå—_§.^¼˜””´}ûö“'O^¸pá?ÿù϶mÛ222ZZZð›7o~ï½÷Þ{ï½°°°ôôôÿû¿ÿ£P({öìa³ÙÇŽ;}útppðþýû% Qç‰'JKK¿úê+CCÜœœ‚‚‚]»v=zt``@þ‰í÷ßÏáp6oÞLèòåË‹/¦Ñh;wîtvv ooïÒÒR±X ¸zõª«««¡áo/èThåøÃ¯¿þ ¨¬¬ÔÕÕ­¨¨Ü¾}ÛÊÊjÚ´i#mÚž={æÎ{òäɨ¨¨¯¾úê‡~PÖ.r {}Ößß/¿ &–·ùùùÄ'QXXøÑGÍž=°qãÆðððþþ~|Y2yòäE‹V­ZE¤»»»ÍÍÍÄ6¢¿¿ÿرcqqqééé zzzøùæ›oŠÅâ¾¾>ÜÓ§OŸ>}ú‡~022äææ†‡‡;::¢££CBBˆeVppðœ9sfΜùÝwßutt˜šš^¹re÷îÝ€wÞy÷œH¸ººÒh4.—ëééyõêÕ?ýéOò ÐŠ››[NN ¢¢"00ðìÙ³2™¬¢¢âø~ÕˆšÖÛÛËd2™Læ¢E‹òòòÖ¯_¯¬]ä@¶ÎLMM›ššœœœðÃüü|‘H$_¦½½ÅúßÛzñŸÏŸ>}:@OO€aØ ôPôõõ#""rss›ššètúÉ“'«ªªx<›Í–/vûöm77·“'OîܹÐÚÚºoß¾}ûöø|>~ >¨¸ººþ÷¿ÿ9s&•J3gŽBëT*ÕËË«¸¸ØÖÖ¶¾¾~áÂ…ògZqppÉd •••qqqEEE>¬¬¬\¿~ý(š¶yóæC‡eddÌ›7ï½÷ÞkooWÖ.r [g ,ÈÍÍ]¶lþ444¼}ûö 2S¦Lyòä >ᢩ©é(lI¥R€žžÞ† ?ýôS;;;á²eˈ2111R©ôã?^±bÅܹsMMMׯ_¿`Á„°¯¯e A/Y²ä§Ÿ~jll\ºt©2•–.]º{÷n[[[|°$Pfåí·ß¾téR__Ÿ¥¥¥‹‹ËÕ«W[ZZÞ|óÍQ4ÍÍÍ---íÑ£G%%%›6m¢P(ûöíSØ.r {}¶víÚÎÎÎ;vÔÔÔtvv–””?~|P__ßäääû÷ï777ÿë_ÿòððP½SˆÅrGGDZcÇlmm§L™"•JgÏžÍf³÷ïßèééÁËOš4é7ÞX³fÍ·ß~+‘H|}}“’’jjjx<ÞW_}µyóæ¡&.\XSSsùòe<çÂ… ø÷HæÎ«££“œœ<4VJ™77·ììl\XóçÏ?s挋‹ FEÓ>ùä“cÇŽM:ÕÞÞBèïïÿÊv)dg ãðáÃÇŽÛºuëÀÀÀüùócbbÂÂÂäË|ðÁÏž=Ûµk—H$zûí·7nܨzýDêêê:99ÅÄÄ`öÙgŸ:t(11qÖ¬YkÖ¬éëëûüóÏåõúóÏ?gff†……‰D¢]»võöö:;;ïÙ³g¨ }}}WW×'Ožšýû÷ïܹÓÜÜœH(ÊâÅ‹óòòMšeVÜÜÜž={6wî\À¼yóúúúˆÅÙH›¶uëÖÇçåå™™™íܹÓËËë‡~¾]cŠÚâiÓÓÓCCC‹ŠŠÔRÛ8‡ÃáÌž={õêÕšvd ‰‰‰™2e qç5AÏ7G†H$ºwï^yy91i"Téld\¿~=::zíÚµøö¡"xŽ®ÕxyyyyyiÚ íg2@:CÒ‚ Îd€t6bnÜx¢i´5ï7åË'*S§† ?‰ÅíšvdÌßð:¨íy@ssó/¿ü¢–ªÆ3MM½_}uÇÇÇÂßßJÓ¾Œ9–––j©Jm:û°gOîÑ£W¦M3¾uëÃk Ög#@*•¥§smm]ׯ×iÚmél”–Ö>}ÚÐÑ¡ž9sKÓîhHg# ;û–Ž Ksso‰ÅRM{¤5 ©ÊÀ€$/¯‚ÐVOÏóââͺ¤E ©ÊåË÷ž= ©TJvöM ú£] ©JvöMù™J$²ÂÂÛýýÃ\‚ @:S‰Þ^ÑÏ?ßÅýA K/^¼«)—´ ¤3•8wîŽD2xÕO¡`™™åñGë@:S‰¬¬ò¡we%YQÑ} O#.iHg¯¦££÷êÕR©LáÙÂÂ;$û£ ½šÂÂÛR%wʤRˆvª€töjrrn ì)0¼~½®½½‡T‡´ô}İX›ý( @kþ—âxg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:Cšß'LPZZÚÔÔ4F•kœÒÒÒçÏhÚ‹1!$$dLê…cƒ_y<ÞÐÕµ¢Pô5íÅX1FzÃy3((hŒœÖ,ÏŸ7J¥}šöBý¤¥¥Ðú AHg2@:CÒ‚ Îd€t† Í묻»{Ë–-–––ººº–––<?…aXyùè_¤ŠÉall¼páÂ+W® _¾££cÔæ”ñᇺùyåÊ:.ÆÈ"x¹í¯Ó™¯‰†u&“ÉÞ}÷Ýëׯgff677Ÿ={–N§{zzŠD"µÔ_TT$AEE…‡‡ÇÊ•+ûúÈ~-khhhAAÁ³gψœÜÜÜeË–1Œääd##£±0*xë„yóæ…-•£›~AAAªÜ§MJJzã7z{{å3D"¸\î¨}tyWW ººz˜ò|>Ôæ”!‰ FVV‘3cÆŒãÇ«ÝBTïCü>í¹¡áñ,555**ÊÀÀ@>“Á`P©TâP"‘p8KKK33³°°°ÎÎN<ðӧO³Ùl##£;vœ:uŠÅbMž<9::š¸¶··W( …Âúúú½{÷Ι3gÖ¬Y>>>L&SOOÏÙÙ9==}WÇÕÕU(Bãããg̘Ád2ƒƒƒåM[YYaöõ×_ã™eeefffb±ð””¼XJJʤI“333ñb·oßæñxàÅL­ÐŠ»»ûÑ£G<ðƒ:::(Jccã ‡ù|þk|¤0FúUq<311ÉËËSvÀår¿øâ ›²²²ššš¥K—gýýý;::ðpùòåDúÑ£GpÈ{E)Ê¥K— „öööŸ~úi}}}kkkbb¢®®®H$‚/Æ³ØØØ¹sçvvvB:dkk[ZZZ[[ëïïO´àééYRR’àáágþío[·n„099¹®®N>QXXhddôüùsáž={–/_NÔÃçóZ‰‰‰ ¦¦¦êëë¯X±B˜••åèè(ßE%%%¡¡¡Ã÷á+?8Æã™†uF£Ñ®]»ö›7/ðEÙÙÙ³LUU «« ?[TT!”J¥ƒÒxÏÊwqww÷úõëY,–D" …ø¼ !¬©©/¦KÀÖ­[UUUøYGGÇÔÔT<Íãñ¨Tj__^2##B( étzss³T*e±XÅÅÅ ›)‹MMMsss!„óçÏOJJ"ÚËçóZ)++›:u*„022rË–-ÆÆÆ‰dãÆÑÑÑÂþþþï¿ÿÞÅÅeÉ’%iiiÊzé B­¬¬~øáâP à›MyÑéô«W¯âðÕôÝ»wáË=¨0=¨‹ñù¨ººº¡¡aûöí‹-277_¼x±¼ÎÜÝÝýüü>üðCü==½AƒbMM ^òúõëxÿýë_EEEVVV2™LYK###׬Yóøñc|°„/t¦ÐŠT*555­ªª²··¿ÿ¾¥¥%—Ë;wîÅ‹Ï;7eÊ” 6Ü»wï•=ùÄÅÅe¨¹®®.===ƒQQQç ]ŸA%É´iÓ˜Læ¿ÿýo¢ùàÅŠP¡•'NLž<_¥ýøãÆÆÆĵ=úì³Ï,,,þò—¿Ü¼ySYƒñ1žiXgÂLJ……™˜˜èëëûûûã#–¼Î¶mÛfaaÁd2W­ZEÜzPEgzzzüã>|!ÌË˳¶¶ÖÕÕõôô,((ðõõÅ×Ñ„ÎD"‘ƒƒÃ¶oßÎf³ }}}ñíòá899‡€äädùNTT•Jmoo—/Éçó•YikkÃ0ìðáÃx/õ^__ß±cÇ/^¬¬{ljÎ08d_¦‚ƒƒcQùx#00ÐÍÍmçΚväµHOO #=hþ¹“VÓßßýúõŸþyõêÕšöe\ƒtöZúøøìÞ½{úôéšöe\3V¿wú°råÊ•+WjÚ -g2@:CÁ„ÕtE£ÑRSS5íÑ¼>+**rqqéééÉÏψˆ000 Ô´S¿S&²Î  ƒÁX¿~}[[[LLÌxÓ†a|>ßÌÌLÓŽŒ9vÞDhhhee%A94šM&“ÅÇÇÛØØ¸»»_»v ¿J>®šH÷•‡¬åçç³Ùl&“yøða<0eÊùÐm<–„¼~!1zΠús§1¼ü¼¥»»pçÎ…Ñlß~û­¥¥eqq1Çãp8¦¦¦b±¾a äÂ:†‰{&dÍ××·­­-++‹F£á±h`HoaaáôéÓ÷íÛ×ÖÖFJ?ýƾ9F(Ó™Âh¶Ù³g'&&â™xÄá£LgÃĽ ²væÌ¢$QÕÐHñÆÆÆ;v°Ùì5kÖÑG$0‘ã‚Hÿ'YMMM666x&žhnnnhh°··Ç31 c0ÃDø Á‹Ð ù4 ¾¾~õêÕøV×ÂÂB*•677ã§,,,äK*ÃÊÊjÿþýµµµï¼óκuëÜÜÜFÙæñÄïEgiiióæÍ311QÍÆb±êëë‰ÂB¡‰ƒ­¼’aBÖ†×î jjj~ùå—îînÕ¯·Ldá?BijjJHH8pà@ll,à£>Ú»w/—Ë}ðàÁ† üýý FxxxLLÌÕ«W[[[<Èf³ñÀ]ƒ‘››ÛÝݧ¢Ñµk×r8œòòòÚÚÚÈÈHooïáË T‰D))) ,ˆˆˆpww¯®®Þ¿ÿ¨Z?Σùx<¬Ïp(н½ýÉ“'ñ|…Ñl»ví²²²Ò××wss×\Â'NL›6ÍÔÔÿý±¨&îM•5¢*///:N„qC³³³ÃÂÂJKKǸ{€âÏd€âÏ”rîÜ9…?ðçp8šv ñÚý<ÀÏÏoŒ¾õ¢ÝãB[@:CÒ‚ Îd€t6bjjZ5í‚ö1†ûͲ²2ü.ÚãÎ)ööO'M’jÚ5£ú³µQ0V:óðð£š5‹HDíéÑíèÐc±z5틚a³Ùc÷¶¤±z0Qùî»KqqgY/nÕ´/ÚZŸŒÌÌrÀ½{- còÿ‹'*Hg#àþý|@£Q²²ÿÿ,Ä0 €ÜÜ_ut¨±Xš‘ÁÕ´;ÚÒ™ª@32¸bñÿ¶™wÞ¾=a_d«vÎTåÖ­ÇOž‰CjNÎ- ú£] ©JNÎ-ßn‰ÅÒôôr©T¦A—´¤3•JeÙÙåbñK¿¬|ú´÷Æze— äA:S‰k× ýƒ2i4ê™3hêT ¤3•ÈξI£QeJ$Ò3gn;Ä0 ½šçÏÅgÏVJ$ ôÔ×'ºrå>ù.iHg¯¦¸¸¦¿@á)*ËÍý•d´¤³W3Ì"L*•;wçÙ3Å*D çè¯æÆ:‘è·fhh¦MË<€¯"))é7Þèíí•ωû—Ë}e%ÊtyWW ººz˜ò|>Ôæ”!‰ÕªÐ ôIDAT FVV‘3cÆŒãÇ«ÝÐ矾téRâ°²²RGG§««Kí†FÄköjPPРç£ÏRSS£¢¢ ä3 •úÛ›% ‡Ã±´´433 ëììÄó1 ;}ú4›Í622Ú±cÇ©S§X,ÖäÉ“£££‰k{{{…B¡P(¬¯¯ß»wïœ9sfÍšUQQáããÃd2õôôœÓÓÓyÅáp\]]…B!„0>>~ÆŒL&388XÞtqq±••†a_ý5žYVVfff&‹1 KIIÁ‹¥¤¤Lš4)00033/vûöm^ÌÔ ­¸»»=zÀãñ0 ;xð  ££ƒB¡466*ìÌÜÜÜÕ«W‡o¾ùf{{»Á¨;ðììì3f0ŒÎÎNeUq¹\}}}kkëÄÄD¢i†¦L™¢¬™£A^t*Žg&&&yyyÊÎâ øâ‹/lllÊÊÊjjj–.]Hœõ÷÷ïèèÀ?ÂåË—éGÁ!/¥P(—.]‚ÚÛÛúé§õõõ­­­‰‰‰ººº"‘¾øæÅÆÆÎ;·³³BxèÐ![[ÛÒÒÒÚÚZâ‹ðôô,))IHHðððÀ3ÿö·¿­[·B˜œœ\WW'Ÿ(,,422zþü9„pÏž=Ë—/'êáóù ­ÄÄÄ„„„@SSSõõõW¬X!ÌÊÊrttTÖ]zzz—/_šÿ:èààPVVV]]½`Á‚÷ß_YU3gÎܶm[KKKVV…Bimm/†1"¡¬3‡gèx6Ñh´k×®ýVÅ |¡3;;;b–©ªªàs ¨¨B(•J¥ñéÈÍ›ÝÝÝëׯg±X‰D(âó2„°¦¦F¾G¶nÝ ¨ªªÂÏ:::¦¦¦âiG¥Rûúúð’B¡PH§Ó›››¥R)‹Å*..VØL±Xljjš›› !œ?~RRÑ^>Ÿ¯ÐJYYÙÔ©S!„‘‘‘[¶l166–H$7nŒŽŽVÖ™t:]¡Î^§üñGüÂŠŠ À´iÓVÅd2¿ùæ<_ö Õ™²ÎõÌ›,ëÁƒòò"6›MMM66ÿ{ã.žhnnÆ ñjPz(FFF{÷î}òäɃ„B!‡Ãñòòb±X‘‘‘òÅJJJüüüâããñÃúúúÕ«Wã;V ©TJ˜¶²²ûøødeeý÷¿ÿ¥Ñh‹-RhF£­\¹233³©©éÎ;ògZyûí·¥RéÝ»w‹‹‹?ùä“É“'ÿúë¯ÅÅÅË—/WÖ™ÖÖÖõõõò9B¡P*•¾NÚÛÛÚÚÚVuäÈ‘øøøéÓ§üñÇÕÕÕò˞ᛩ¬-Ã09rÿ ÆÍ›7•a³ÙuuuxO°X¬QØÂ¿d†††^^^uuu_~ùeCCÃùóçåËddd$$$dggã†rrrð¯‘L&³fýïÝ¿Äç’™™™––¶jÕ*|9¢ÐÐÐüüüÌÌÌ%K–0™/Å)´B¡P–-[vêÔ©®®.{{{ooœúúzeR¬X±âøñãÄáÝ»wMMM{zz^§=z„'>|033SX•ŸŸ_cccFF†¹¹ù’%K†Êš©¢/!?¸©8o¶µµ±Ùl???.—ûäÉ“¬¬,WWWðò¼¹wï^;;»7nàküZ 7-*L¹ûÍÍÍááá...2™ÌÜÜüàÁƒø­ššù>..ÎÉÉi`` 66ÖÙÙ™Ëå>|øð“O>qqqj®««KOOÁ`TTTà9C×gB‰D2mÚ4&“ùïÿ›h>x±"Thåĉ“'OÆWi?þø£±±q@@ÀðÉ`0¶lÙòøñã;wî,Z´èÏþ3„ðu:ÐÖÖöÆÕÕÕ‹-ò÷÷WV•µµõ¦M›ZZZ233i4~猘7}ß¾}mmm£è:2ÑÖçNýýýßÿ½‹‹Ë’%KÒÒÒ”•|) ùš={vbb"ž‰,Èd2¨\gÇ wæÌ¢ä 0ywìØÁf³×¬YsýúuzN3hås§óçÏOŸ>ýöíÛ§N*** ÑÑÑQcýMMM …!_ xÃ0ƒ1L68l˜X.  <ÀÊÊjÿþýµµµï¼óκuëÜÜÜFÙfÒѱÙl77·óçÏûJ5’––6oÞ<…!_,K>BÄÓB ~øJ†‰å^»ƒ¨©©ùå—_º»»}||T¿J³hΜœœÎž=[XXÈãñæÌ™që֭׬ÿ©KSSSBBÂbcc}ôÑÞ½{¹\îƒ6lØàïïÏ`0ÂÃÃcbb®^½ÚÚÚzðàA6›ÿØŽÁ`äæævwwÇÅÅ©htíÚµ§¼¼¼¶¶622ÒÛÛ{øòƒ¾T"‘(%%eÁ‚îîîÕÕÕû÷ïUë5ü$:n×g}}}ÇŽ[¼x±²@µõ…B±··?yò$ž¯0Nk```×®]VVVúúúnnnø’ BxâĉiÓ¦™ššâ¿’"UÇ©†D€nggg‡……•––ޤÃ4ÃÐõåú====44ŽËþ-"88¼ü_д`Þ(äk\1Až …Ì/Ä+™°ãb\t† ¤3 !Èé A ö›Cÿå1"š››Ùl¶|Ž…††’åbÂ$ˆ¡›L@ë3 !Èé AHg2@:CÁÿ‹ê hb€IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1PrintLayout__coll__graph.png0000644000175000017500000000662712234777145031347 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“ LIDATxœí}LS×ÇÏmy§¸¶@6JA8…1?œ %|éYFQ$Á9Ãf$f@¬S¶ÉÌHF– #¼,@)AXÆ•7÷£s™®XAÆKP‹¨LÖ–ûûãèõ®Ð‚¥/Îs>áçžûô9Ï9ßöœsï-=I’ƒ {'€±)Xo´Àz£Ö-°ÞˆAÒH$öNca’““é;ÌõÀª?3”Ì£wJJŠM’ÁX©TjP‚ço´Àz£Ö-°ÞhõF 3õžššzÿý÷ýüüœýüüvïÞ=<< O!—Ë-—! æÃ‚U,1AOÓâ]´xæ¹[ÙÙÙÍ›7ÑÐÐ822RVVÕÛÛëììlñ5 48ŽL&[³f ÀÃÃÃâ¡€9zŸŸïááqðàÁÓ§Oóx¼eË–eggS555tÃAtvvúûûgffÆÇÇs¹\WW×°°°úúzÊ¡µµ•Ïçs¹Ü'NÀ®®®ÈÈH77·€€€ŠŠ *Ú•+Wæ!àíí=111¯äÌ™3l6;99yllŒ*'Iòøñã/¾ø"—ˉDT'Л@Å7æ¼`=s ÁápZZZŒ…}úÉ'Ÿ]ºtI¡PÄÅÅ%%%Qg…BáÄÄDCC`Ó¦M”}óæM’$«««ûúúè†AdúaTTÔ… üýý322úûûGGG+**œgff CBBŸþÙØØèààðàÁ’$srrT*Ucc#ƒÁ…aW®\i,Èøø8I’&"""º»»¯^½úꫯnÚ´‰Jõ‹/¾þé§Ÿ”J¥P(¤neÓBÅ7álºÇLœœlpÿܽ.^¼HïwˆF£¡³bÅŠªª*èÐÓÓ¸sç<+“ÉH’Ôëõ6]Ëy™«·T*%IrrrR§ÓÁB…BAõ  ©©‰Š ¹\nQQtÖh4:†5&`+H’¼|ù2àöíÛ0fhhhmm-<5<<Ìd2ïß¿OÑÛ„³Ù=6WosÆs×ÛÛK—™ZœS ACCCðÅb †mþþþ€ÉÉI±XÃãñöìÙCwðõõ5ˆ_RRrüøñåË—¿õÖ[×®]£æ At†ÆªU«*• ö÷÷§¥¥Á ___½^OuÂ\L8[°ÇÌyYbbbII |‹Ølö/¿übàÃçóûúú  g^Š&€Íމ‰éëë+,,¼uëÖwß}Gw€$7 H¥RŸØØXêj"È‚J¥ …‚ ???xÈãñš››ákvvV£Ñ¼ôÒKÆÚòDÎfcŽÞ‡V©TB¡P.—«Tª3gÎäççøìܹó£>êêêêííÝ·oŸP(\人¦¦¦¿¿Ÿn,ˆV«]·nÝŠ+®_¿žžž¨ó²fÍšÜÜ\ÿµk×’$éââ²`xAhÂ!77÷êÕ«===ï¼óŽH$¢®ÓÓÓÅb±\.W*•{öìó¦ã/Òy©Ð÷EÎß$IþñÇ;vìàp8nnnB¡~‚éó÷ßÿ““ãëëËår·oß§¨¹S×\P]]M7(Àœù¶´´8;;GEE}óÍ7 «V­šæpîܹ°°0—   Ó§OSnÆ‚ÄÄĸ¸¸¨ÕjµÔÖÖúúúr8œ´´4ƒNÈÍÍåóù,+!!Z^Ñ£â/ÆÙ˜mŒ¹ó7AÒ\õõõÛ¶m£—`þÕˆD"ðϧàøþ9Z`½ÑëXo´Àz£Ö-Õ[¥š´w öaž'Öô'}Ï*ŠÔÔ@wwG{'b]†††ø|þ?Šè7_ùÏÃÅÇ'ÓÍíe{'b LÝ_C„“'/æå5¬[ØÜ¼ÏÞ¹Øçï¦&9A¹¼l쮽s±5Èé=8x[. IÀ`Í͗펭ANïÖÖ+L& ×Ï64tÙ;[ƒœÞõõ]zý,€$AOÏp_߸½3²)hé­PŒööŽRKTGGæÙ³¿Ú7%ƒ–Þ--¿::>þÒ´V«¯¯ÿŸó±=éM’d}}—V«§ ¨ûÍðË–Ï0éÝÝ=8<¬1(ttthjBh•ŽÞÍÍ—éƒ9D«ÕI¥]èÜtBEo½~¶±Qn0˜CÆÇïÊå·lž‘}@EïK—úÔêûóžrtd¢s㽿þú „““üstdR¶^O¶´ü /ÊŸy¬ò¼O!aa¾‡m¡ûú7þúø_^&'§==YöHͦ ø| Àãí/-Ý™˜¸ÆÞ‰ØTÆs ëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëKú=¸]á¿‘áa.÷««ÖÞ‰˜CVVVdd¤y¯]’ÞA„††z{{›ó¤tvvJ$’””ó^¾Ôßg‰D±±±K ‚Yz½>>>¾¹¹ù¹çž[L@Ëfh_¬®7I’999Aäççûøø¨ÕêÖÖÖ½{÷ÖÔÔ8:Zeû΢¢¢àà`€F£)--=räHYYÝÁ`äåå¹¹¹Y£ö§«çß~ûíÈÈȧŸ~Âf³ƒ‚‚Þ{ï½ÊÊJ&Óp«KáêêÊb±X,–ŸŸ_VVÖ7ÆÇÿ±éA6l0ñnwîܱRzö­Ñêz···'%%¹¸¸Ð Y,ƒñ¸j½^_YY™’’²uëÖ?þxjj – ‚ŽŽ‘H´yóæòòòï¿ÿ>99yË–-%%%”C{{;Ý0¾«t:ôéîîÞ¶m[[[Õ¿àljD‰‰‰MMMàÑŒ””dL¥R™˜˜˜°k×®óçÏrss¥R)t¸víÚÖ­[gffŒ5ŠŠ ík´ V×[©T™ö‘H$ùùùÅÅÅ·oß.,,¤N;w®²²277÷Ô©Sííí_}õUNNŽT*U©T€¼¼¼°°0ºAgrr²¸¸˜Ïç¿ð °¤¼¼\,ÇÅÅÑÝš››ËËË8P\\¬Õje2,46»øá‡|>¿¬¬¬®®N$èt:@ÐÙÙ :::^ýõÆÆFc2`Á-ˆÕçïééiz3¨õTkk+‹õð÷åÛÚÚvîÜÈÌÌܵk×ôô4œ_SRR–-[¶~ýzÀöíÛ){jjÊÇÇgÆ 0e222 ADppðÑ£G ‚€%"‘(<<Ü ÃÄÄD6›­×ë ²—/¿üÒÕÕŽO«W¯Öjµ÷ïߎŽþì³Ï&&&<==ÏŸ?ÿÁk”±ºÞžžžƒƒƒ/¿üp³íÖÖÖ™™™äädºÏØØ÷p«hŒ/_¾àêê €‚ÑmPë5''''''ú©çŸ~®?¼RX0,Ž{÷N:ÕÓÓ3<Ü„Åb) ooï‘‘hÃÚÓÓÓì©õšØÀˆ¨‹W’™™922’‘‘QWWG¥ccc;;;e2Y\\A&ŸI¬"mƒÕõNOOW«ÕT(jµúÂ… UUU> ÕÕÕ¿ÿþûÐÐÐçŸI õ¦ioo‡]I–âîÝÇ[ƒÿõ×_÷1;;«×ëCBBø|þÀÀ@AAå­P(:::âããM4ŠÅb]¼xqzzº¦¦ÆXÖÃêz³Ùì'Nxxx8p --­­­íèÑ£>©©©ëׯ?|øð»ï¾Ëáprrr¼   §§‡nX„Õ«WïÞ½›`ÿþýÿ}Ä7²²²šššÞ|óÍ¢¢¢7¾òÊ+‡¸¹¹EDDxyyÁõ©±FíÛ·¯²²255•¾’0¨Ñz,õûGŽÁÏ¿)ÄbqHHHZZšõªKù¾¾nfff®_¿.—Ëá`þÔ‚õ¶ ?ÿüsvvvzzú¼—O¨ì7gmbbbbbbìÅÂàÏ7Z`½ÑëXo´Àz#¹ì;¢H$³%[Òõ˜D"±T0‹'**Êì×"ºÿ7²àù-°ÞhõF ¬7Züþ M̓&úSIEND®B`‚glom-1.22.4/docs/libglom_reference/html/ftv2vertline.png0000644000175000017500000000012612234777145024476 0ustar00murraycmurrayc00000000000000‰PNG  IHDRɪ|IDATxíݱðøScOx@ –¨y}IEND®B`‚glom-1.22.4/docs/libglom_reference/html/dir_96c245ed9dfbd1862602a5e39af1c96f.html0000644000175000017500000000646612234777147027557 0ustar00murraycmurrayc00000000000000 libglom-1.22: libglom/document/bakery Directory Reference
        bakery Directory Reference

        Directories

        directory  view
         

        Files

        file  document.h
         
        file  document_xml.h
         
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Placeholder-members.html0000644000175000017500000005136612234777147032734 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_Placeholder Member List

        This is the complete list of members for Glom::LayoutItem_Placeholder, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Placeholdervirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Placeholdervirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItem_Placeholdervirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Placeholder()Glom::LayoutItem_Placeholder
        LayoutItem_Placeholder(const LayoutItem_Placeholder& src)Glom::LayoutItem_Placeholder
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem_Placeholder* src) const Glom::LayoutItem_Placeholder
        Glom::LayoutItem::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Placeholder()Glom::LayoutItem_Placeholder
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/ftv2pnode.png0000644000175000017500000000034512234777145023756 0ustar00murraycmurrayc00000000000000‰PNG  IHDRɪ|¬IDATxí=QF‘Ø¥D«ÔkÄ:‰F©PK؃=V@§Õ³ Õ8SHxñÌ0bnrróŠ{ò½¿¾’$ ÀÏTŠP  ö¼X¬OÛd6êìòð"°²S´±O¥B€(¡àQé)š+YĈ ÒªËRÉÐ>VtÉsˆm9(ê„䜥k‚-@ȧ-Ü$ó b Ò[he ¿Kp-ôl|CùÿApRG'rÍ­aIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_func.html0000644000175000017500000001176212234777147025261 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - a -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Formatting-members.html0000644000175000017500000005500612234777147030304 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::Formatting Member List

        This is the complete list of members for Glom::Formatting, including all inherited members.

        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name_old, const Glib::ustring& field_name_new)Glom::Formatting
        Formatting()Glom::Formatting
        Formatting(const Formatting& src)Glom::Formatting
        get_choices_custom() const Glom::Formattingvirtual
        get_choices_related(sharedptr< const Relationship >& relationship, sharedptr< LayoutItem_Field >& field, sharedptr< LayoutGroup >& extra_layout, type_list_sort_fields& sort_fields, bool& show_all)Glom::Formatting
        get_choices_related(sharedptr< const Relationship >& relationship, sharedptr< const LayoutItem_Field >& field, sharedptr< const LayoutGroup >& extra_layout, type_list_sort_fields& sort_fields, bool& show_all) const Glom::Formatting
        get_choices_related_relationship(bool& show_all) const Glom::Formatting
        get_choices_restricted(bool& as_radio_buttons) const Glom::Formatting
        get_custom_choice_original_for_translated_text(const Glib::ustring& text, const Glib::ustring& locale=Glib::ustring()) const Glom::Formatting
        get_custom_choice_translated(const Glib::ustring& original_text, const Glib::ustring& locale=Glib::ustring()) const Glom::Formatting
        get_has_choices() const Glom::Formatting
        get_has_custom_choices() const Glom::Formatting
        get_has_related_choices() const Glom::Formatting
        get_has_related_choices(bool& show_all, bool& with_second) const Glom::Formatting
        get_has_related_relationship_name() const Glom::UsesRelationship
        get_has_relationship_name() const Glom::UsesRelationship
        get_horizontal_alignment() const Glom::Formatting
        get_related_relationship() const Glom::UsesRelationship
        get_related_relationship_name() const Glom::UsesRelationship
        get_relationship() const Glom::UsesRelationship
        get_relationship_display_name() const Glom::UsesRelationship
        get_relationship_name() const Glom::UsesRelationship
        get_relationship_name_used() const Glom::UsesRelationship
        get_relationship_used_allows_edit() const Glom::UsesRelationship
        get_sql_join_alias_name() const Glom::UsesRelationship
        get_sql_table_or_join_alias_name(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_table_used(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_text_format_color_background() const Glom::Formatting
        get_text_format_color_foreground() const Glom::Formatting
        get_text_format_color_foreground_to_use(const Gnome::Gda::Value& value) const Glom::Formatting
        get_text_format_font() const Glom::Formatting
        get_text_format_multiline() const Glom::Formatting
        get_text_format_multiline_height_lines() const Glom::Formatting
        get_title_singular_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_title_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_to_field_used() const Glom::UsesRelationship
        HORIZONTAL_ALIGNMENT_AUTO enum valueGlom::Formatting
        HORIZONTAL_ALIGNMENT_LEFT enum valueGlom::Formatting
        HORIZONTAL_ALIGNMENT_RIGHT enum valueGlom::Formatting
        HorizontalAlignment enum nameGlom::Formatting
        m_numeric_formatGlom::Formatting
        operator=(const Formatting& src)Glom::Formatting
        Glom::UsesRelationship::operator=(const UsesRelationship& src)Glom::UsesRelationship
        operator==(const Formatting& src) const Glom::Formatting
        Glom::UsesRelationship::operator==(const UsesRelationship& src) const Glom::UsesRelationship
        set_choices_custom(const type_list_values& choices)Glom::Formattingvirtual
        set_choices_related(const sharedptr< const Relationship >& relationship_name, const sharedptr< LayoutItem_Field >& field, const sharedptr< LayoutGroup >& extra_layout, const type_list_sort_fields& sort_fields, bool show_all)Glom::Formatting
        set_choices_restricted(bool val=true, bool as_radio_buttons=false)Glom::Formatting
        set_has_custom_choices(bool val=true)Glom::Formatting
        set_has_related_choices(bool val=true)Glom::Formatting
        set_horizontal_alignment(HorizontalAlignment alignment)Glom::Formatting
        set_related_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_text_format_color_background(const Glib::ustring& color)Glom::Formatting
        set_text_format_color_foreground(const Glib::ustring& color)Glom::Formatting
        set_text_format_font(const Glib::ustring& font_desc)Glom::Formatting
        set_text_format_multiline(bool value=true)Glom::Formatting
        set_text_format_multiline_height_lines(guint value)Glom::Formatting
        type_list_sort_fields typedefGlom::Formatting
        type_list_values typedefGlom::Formatting
        type_pair_sort_field typedefGlom::Formatting
        UsesRelationship()Glom::UsesRelationship
        UsesRelationship(const UsesRelationship& src)Glom::UsesRelationship
        ~Formatting()Glom::Formattingvirtual
        ~UsesRelationship()Glom::UsesRelationshipvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1View.html0000644000175000017500000005212312234777147026607 0ustar00murraycmurrayc00000000000000 libglom-1.22: GlomBakery::View< T_Document > Class Template Reference
        GlomBakery::View< T_Document > Class Template Reference

        This is a base class which should be multiple-inherited with gtkmm widgets. More...

        Inheritance diagram for GlomBakery::View< T_Document >:
        Collaboration diagram for GlomBakery::View< T_Document >:

        Public Types

        typedef View< T_Document > type_self
         

        Public Member Functions

         View ()
         
        virtual ~View ()
         
        virtual T_Document* get_document ()
         
        virtual const T_Document* get_document () const
         
        virtual void set_document (T_Document* pDocument)
         
        virtual void set_modified (bool val=true)
         Just a convenience, instead of get_docuement()->set_modified(). More...
         
        - Public Member Functions inherited from GlomBakery::ViewBase
         ViewBase ()
         
        virtual ~ViewBase ()
         
        virtual void load_from_document ()
         
        virtual void save_to_document ()
         
        virtual void clipboard_copy ()
         
        virtual void clipboard_paste ()
         
        virtual void clipboard_clear ()
         

        Protected Member Functions

        void on_document_forget ()
         

        Protected Attributes

        T_Document* m_pDocument
         

        Detailed Description

        template<class T_Document>
        class GlomBakery::View< T_Document >

        This is a base class which should be multiple-inherited with gtkmm widgets.

        You should override save_to_document() and load_from_document().

        Member Typedef Documentation

        template <class T_Document >
        typedef View<T_Document> GlomBakery::View< T_Document >::type_self

        Constructor & Destructor Documentation

        template <class T_Document >
        GlomBakery::View< T_Document >::View ( )
        inline
        template <class T_Document >
        virtual GlomBakery::View< T_Document >::~View ( )
        inlinevirtual

        Member Function Documentation

        template <class T_Document >
        virtual T_Document* GlomBakery::View< T_Document >::get_document ( )
        inlinevirtual
        template <class T_Document >
        virtual const T_Document* GlomBakery::View< T_Document >::get_document ( ) const
        inlinevirtual
        template <class T_Document >
        void GlomBakery::View< T_Document >::on_document_forget ( )
        inlineprotected
        template <class T_Document >
        virtual void GlomBakery::View< T_Document >::set_document ( T_Document *  pDocument)
        inlinevirtual
        template <class T_Document >
        virtual void GlomBakery::View< T_Document >::set_modified ( bool  val = true)
        inlinevirtual

        Just a convenience, instead of get_docuement()->set_modified().

        Member Data Documentation

        template <class T_Document >
        T_Document* GlomBakery::View< T_Document >::m_pDocument
        protected

        The documentation for this class was generated from the following file:
        • libglom/document/bakery/view/view.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1PrintLayout__inherit__graph.png0000644000175000017500000000662712234777145032060 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“ LIDATxœí}LS×ÇÏmy§¸¶@6JA8…1?œ %|éYFQ$Á9Ãf$f@¬S¶ÉÌHF– #¼,@)AXÆ•7÷£s™®XAÆKP‹¨LÖ–ûûãèõ®Ð‚¥/Îs>áçžûô9Ï9ßöœsï-=I’ƒ {'€±)Xo´Àz£Ö-°ÞˆAÒH$öNca’““é;ÌõÀª?3”Ì£wJJŠM’ÁX©TjP‚ço´Àz£Ö-°ÞhõF 3õžššzÿý÷ýüüœýüüvïÞ=<< O!—Ë-—! æÃ‚U,1AOÓâ]´xæ¹[ÙÙÙÍ›7ÑÐÐ822RVVÕÛÛëììlñ5 48ŽL&[³f ÀÃÃÃâ¡€9zŸŸïááqðàÁÓ§Oóx¼eË–eggS555tÃAtvvúûûgffÆÇÇs¹\WW×°°°úúzÊ¡µµ•Ïçs¹Ü'NÀ®®®ÈÈH77·€€€ŠŠ *Ú•+Wæ!àíí=111¯äÌ™3l6;99yllŒ*'Iòøñã/¾ø"—ˉDT'Л@Å7æ¼`=s ÁápZZZŒ…}úÉ'Ÿ]ºtI¡PÄÅÅ%%%Qg…BáÄÄDCC`Ó¦M”}óæM’$«««ûúúè†AdúaTTÔ… üýý322úûûGGG+**œgff CBBŸþÙØØèààðàÁ’$srrT*Ucc#ƒÁ…aW®\i,Èøø8I’&"""º»»¯^½úꫯnÚ´‰Jõ‹/¾þé§Ÿ”J¥P(¤neÓBÅ7álºÇLœœlpÿܽ.^¼HïwˆF£¡³bÅŠªª*èÐÓÓ¸sç<+“ÉH’Ôëõ6]Ëy™«·T*%IrrrR§ÓÁB…BAõ  ©©‰Š ¹\nQQtÖh4:†5&`+H’¼|ù2àöíÛ0fhhhmm-<5<<Ìd2ïß¿OÑÛ„³Ù=6WosÆs×ÛÛK—™ZœS ACCCðÅb †mþþþ€ÉÉI±XÃãñöìÙCwðõõ5ˆ_RRrüøñåË—¿õÖ[×®]£æ At†ÆªU«*• ö÷÷§¥¥Á ___½^OuÂ\L8[°ÇÌyYbbbII |‹Ølö/¿übàÃçóûúú  g^Š&€Íމ‰éëë+,,¼uëÖwß}Gw€$7 H¥RŸØØXêj"È‚J¥ …‚ ???xÈãñš››ákvvV£Ñ¼ôÒKÆÚòDÎfcŽÞ‡V©TB¡P.—«Tª3gÎäççøìܹó£>êêêêííÝ·oŸP(\人¦¦¦¿¿Ÿn,ˆV«]·nÝŠ+®_¿žžž¨ó²fÍšÜÜ\ÿµk×’$éââ²`xAhÂ!77÷êÕ«===ï¼óŽH$¢®ÓÓÓÅb±\.W*•{öìó¦ã/Òy©Ð÷EÎß$IþñÇ;vìàp8nnnB¡~‚éó÷ßÿ““ãëëËår·oß§¨¹S×\P]]M7(Àœù¶´´8;;GEE}óÍ7 «V­šæpîܹ°°0—   Ó§OSnÆ‚ÄÄĸ¸¸¨ÕjµÔÖÖúúúr8œ´´4ƒNÈÍÍåóù,+!!Z^Ñ£â/ÆÙ˜mŒ¹ó7AÒ\õõõÛ¶m£—`þÕˆD"ðϧàøþ9Z`½ÑëXo´Àz£Ö-Õ[¥š´w öaž'Öô'}Ï*ŠÔÔ@wwG{'b]†††ø|þ?Šè7_ùÏÃÅÇ'ÓÍíe{'b LÝ_C„“'/æå5¬[ØÜ¼ÏÞ¹Øçï¦&9A¹¼l쮽s±5Èé=8x[. IÀ`Í͗펭ANïÖÖ+L& ×Ï64tÙ;[ƒœÞõõ]zý,€$AOÏp_߸½3²)hé­PŒööŽRKTGGæÙ³¿Ú7%ƒ–Þ--¿::>þÒ´V«¯¯ÿŸó±=éM’d}}—V«§ ¨ûÍðË–Ï0éÝÝ=8<¬1(ttthjBh•ŽÞÍÍ—éƒ9D«ÕI¥]èÜtBEo½~¶±Qn0˜CÆÇïÊå·lž‘}@EïK—úÔêûóžrtd¢s㽿þú „““üstdR¶^O¶´ü /ÊŸy¬ò¼O!aa¾‡m¡ûú7þúø_^&'§==YöHͦ ø| Àãí/-Ý™˜¸ÆÞ‰ØTÆs ëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëKú=¸]á¿‘áa.÷««ÖÞ‰˜CVVVdd¤y¯]’ÞA„††z{{›ó¤tvvJ$’””ó^¾Ôßg‰D±±±K ‚Yz½>>>¾¹¹ù¹çž[L@Ëfh_¬®7I’999Aäççûøø¨ÕêÖÖÖ½{÷ÖÔÔ8:Zeû΢¢¢àà`€F£)--=räHYYÝÁ`äåå¹¹¹Y£ö§«çß~ûíÈÈȧŸ~Âf³ƒ‚‚Þ{ï½ÊÊJ&Óp«KáêêÊb±X,–ŸŸ_VVÖ7ÆÇÿ±éA6l0ñnwîܱRzö­Ñêz···'%%¹¸¸Ð Y,ƒñ¸j½^_YY™’’²uëÖ?þxjj – ‚ŽŽ‘H´yóæòòòï¿ÿ>99yË–-%%%”C{{;Ý0¾«t:ôéîîÞ¶m[[[Õ¿àljD‰‰‰MMMàÑŒ””dL¥R™˜˜˜°k×®óçÏrss¥R)t¸víÚÖ­[gffŒ5ŠŠ ík´ V×[©T™ö‘H$ùùùÅÅÅ·oß.,,¤N;w®²²277÷Ô©Sííí_}õUNNŽT*U©T€¼¼¼°°0ºAgrr²¸¸˜Ïç¿ð °¤¼¼\,ÇÅÅÑÝš››ËËË8P\\¬Õje2,46»øá‡|>¿¬¬¬®®N$èt:@ÐÙÙ :::^ýõÆÆFc2`Á-ˆÕçïééiz3¨õTkk+‹õð÷åÛÚÚvîÜÈÌÌܵk×ôô4œ_SRR–-[¶~ýzÀöíÛ){jjÊÇÇgÆ 0e222 ADppðÑ£G ‚€%"‘(<<Ü ÃÄÄD6›­×ë ²—/¿üÒÕÕŽO«W¯Öjµ÷ïߎŽþì³Ï&&&<==ÏŸ?ÿÁk”±ºÞžžžƒƒƒ/¿üp³íÖÖÖ™™™äädºÏØØ÷p«hŒ/_¾àêê €‚ÑmPë5''''''ú©çŸ~®?¼RX0,Ž{÷N:ÕÓÓ3<Ü„Åb) ooï‘‘hÃÚÓÓÓì©õšØÀˆ¨‹W’™™922’‘‘QWWG¥ccc;;;e2Y\\A&ŸI¬"mƒÕõNOOW«ÕT(jµúÂ… UUU> ÕÕÕ¿ÿþûÐÐÐçŸI õ¦ioo‡]I–âîÝÇ[ƒÿõ×_÷1;;«×ëCBBø|þÀÀ@AAå­P(:::âããM4ŠÅb]¼xqzzº¦¦ÆXÖÃêz³Ùì'Nxxx8p --­­­íèÑ£>©©©ëׯ?|øð»ï¾Ëáprrr¼   §§‡nX„Õ«WïÞ½›`ÿþýÿ}Ä7²²²šššÞ|óÍ¢¢¢7¾òÊ+‡¸¹¹EDDxyyÁõ©±FíÛ·¯²²255•¾’0¨Ñz,õûGŽÁÏ¿)ÄbqHHHZZšõªKù¾¾nfff®_¿.—Ëá`þÔ‚õ¶ ?ÿüsvvvzzú¼—O¨ì7gmbbbbbbìÅÂàÏ7Z`½ÑëXo´Àz#¹ì;¢H$³%[Òõ˜D"±T0‹'**Êì×"ºÿ7²àù-°ÞhõF ¬7Züþ M̓&úSIEND®B`‚glom-1.22.4/docs/libglom_reference/html/inherit_graph_7.png0000644000175000017500000000306612234777146025124 0ustar00murraycmurrayc00000000000000‰PNG  IHDR•%Ä ‹Y(Ùƒ(Ž Fõ ðA"F)̶Â+øÌP§T$RÑÓ0qq Äp›Ò5–®Ó1ƒÉôÛƒï/ç¹]k¿•^ÝëÑçîûñ>ïû¾ïûO”BŠbÉÙm*ÿ Õ?e£ú§l´’ëÉÉÉÅÅÅ]‘¢’õõõÛ®Ñvìvû. SI ‰_IæO»ÝŽTö/^¼Øi–ºþ)Õ?e£ú§lTÿ”ꟲQýS6™ûFïÝ»g6›÷íÛg6›oÞ¼ qEQ'K ÿ{ !77×f³e÷ùòzô(„ÃáTb,‹|iƒÁàt:¿|ù"~eyB¡žl€2jª!úwñâÅžž|øpKKK$ñù| üzõ ‰[[[‚ ΚŸŸÇÏç€ÂÂÂTb~úéÞëâO ð !½¿–e‰Ù~¿2jÓÑ” ¬½½= qçñxB¡ÐÈÈHGG‡$çÆN§“çy¯×ÛÜÜÌqMÓé<|pp0ˆ :Ž¢¨oß¾]¿~Ýápx<¿ßߨØxæÌ’óèÑ#žç?}úÔÔÔÄqÜíÛ·Ó#‰Éþ% ¶¶¶–——³, 4M¿~ý:>~ü8Õ+\»víáÇ>ŸìËdÔfŽd>MsýC}þü¹¡¡!??ÿþýÇáZ¼þmllð1bKGDÿÿÿ ½§“ IDATxœìÝy\gúðwG@Äp‰„Að¦-]]ŠPñXÜ¢àÊU¬GK«¶®Vk· ¥Ö[V]m«µ[Žrˆ´?P×–"*ØP‹G±Ü 7äÊ9¿?¦¦i`’I&Ï÷ã/“wÞ÷™!<ÎñÎ;ŽãÀðPÐ$S $S $S $S !ÕÝÐÐÐP\\Lu!„lmm§NJu@$S0S¦L¡:}W]]Mu@9H¦`FMuú®±±‘ê€rpÍHÉHÉHÉHÉHÉPð¦¦&+¿ñÆÁÁÁòK~üñG&“ùìÙ35„Ö§AÅ ô $S BBB²²²º»»eK.^¼¸`Á‚‘#GRò ™õ"åhnáÂ…FFFÙÙÙ²%/^ Ô|$ô’) Ç›1c†™™™““Ó©S§0 CÙÚÚ655 ‚M›6ÙÙÙÙÚÚ~ñŲU0 ‹—/ôfllššJüx÷îÝššš%K–à8íììleeÔÜÜŒ’J¥ÑÑÑ...#FŒðôô¼qãѸ,±XåèèhccF¬EÔÉÍÍår¹§OŸîkÓÓÓœœX,V```CCCQQѼy󬬬LMMÝÜÜΟ?¯t?(³7¯ÛpTP__Ÿ““3`µqãÆEDDÔÖÖ¦¥¥ÔÕÕ!„qŠŠâr¹yyy%%%³fÍ’-‹‹«¬¬”/(•=räÈžžÇwíÚµhÑ"Ç=êêꚟŸ_^^îççˆãøgŸ}æè蘛›[SSemm-‰p—õ¸ÿ~—‚‚‚’’’¹sç] „¼¼¼òòòººº”Æ€š6mÚ;wîÝ»çéé¹hÑ¢‰'®[·®ªªª®®îÔ©S&&& ÷~ˆŠŠê§¼¼¼¼I“& ¸‡ïß¿ÿþý«̓d T¢b2µ²²:räQæóùb±X–œcbbˆîܹ#[®"‘Hdmm}ñâEÇÿò—¿MM™2%!!¨PSSÃ`0:;;'OžL â8.•Jù|¾T*Åå’éøñãÏ;GT¸ÿ>B¨­­¨’’ÒO !ÙN¸}û6B¨ªªJ,KJJJd](쇉'öŽÇñ®®®“'Oº»»Ïž=;99Y(¸ ™j-H¦@%*&Ó¤¤$;;;.—»jÕª7nàr)ŒÉdæååÕˆ[IƒJ¦8ޝY³fÅŠ?622jnnÆqÜÔÔTáL«¤¤ÄÔÔTÖ‘<ùH®_¿.ɯ¿þJT¸uëV? „žpppxë­·~þùç÷0™j-H¦@%*&Ó«W¯º¹¹1™L—ÄÄDÇ}||˜Lfss³@ ؼy3q7?66V–LBqqqò…~¬_¿žÁ`444? …ÂÈÈH‡cnn¾páÂŠŠ bá'Ÿ|ÂårÍÌÌ<< Ôº"‘èÂ… !!!¦¦¦¾¾¾²éœ{;tèPRRRjjêÍ›7ëëëß~ûm„ÐÑ£G?~æÌ™²²²ùóçûûûËgÏ‚‚WW×½{÷644 y뀮¢øqV #T|6_П™G={–(¡ç³‘ª(++ËÊÊŠ˜94..΂˜pZ¾#¢ tÚÓ¾&K•yôèÑÖ­[9Ί+úŸÐohàÙ|­G¦@÷¸¸¸…‰'"„ª««U_799¹¥¥ÅØØð+V´··÷u¦ÿäÉYGD¡ººúáÇD§! ÃX,ñB.—»oß¾òòòùóç¯]»ÖÃÃct$S {***ˆBYY’›t@B¡0###66V6T`Á‚}ÝÓW:í逓¥JJJnÞ¼ÙÞÞ>oÞ<•7 è6H¦@÷ìÙ³‡Çã=xð`ýúõ~~~,+>>^>ÇõåÒ¥Kb±xÙ²e¬ç‚ƒƒ333…BaïÊ«V­Ú½{7Ç+--ݰaÑÑ›o¾¹cÇŽëׯ×ÕÕ:tˆÃáÈ¿€Z ÄÇÇ{{{‡‡‡{zzïÛ·Ì-ÚŒêë @7hÕ5Óýû÷»ººZXX,[¶Œ˜Û©0*Žãaaa¡¡¡òKššš 333ñ^×L•N{Ú×d©„ôôô°°°üü|6»pÍTkÁ|¦@%Ú3Ÿ)†a<oúôé SSS—-[FUTó™j-8ÍT"kòPÒ›@uð Ò&UZ_á }0')Ð<82@2@2@2@2zA$Q 9¸›AG'CÂq|÷åÝÛ}·«¾JVqÖK/9ŒrP_TC°j-H¦`Š‹‹©a( k Ïœù‡ã? 0UOÅšj›f¥ÌŠ˜áÍñVklC`kkKu@ x Ðß샳sKs £ §¦â*Ý¢nÖF–P"Ü0gá CƆÆjÐ\34wûñíÜÒ\ î•^S}-S#S// aÇ<>}ïôÊÆJõEè’) ¹Ýßî640Ä0ìûßjÅEn‹ %RɃ§&2ùĵjŠÐ$S@g¥õ¥ï\KÅR©ôZé5).U}ÝySæcÄR±P"\·nyÌòA‡Ú‚º ’) ³C—ü~—õ™àÙýšûª¯ëîèÎ2û㕨8ÂSx)/î|ñΓ;$G h’) ­Ú¶Ú³7ÏÊF˜2 sKsU_Ý3˜?y¾!ã/"‰èIó“¿îýëçßNr¬@÷A2´uô‡£8úc° ŽãƒJ¦¡ùSç+ wKÅ"‰èƒäü¿ôoíj%'P@ 04 ÐS[w›Ã¿:ò -Í,›?kVx^?*+\·¹*ýÈaȵâ^\ÑÍÁm¸±Z€#S@O'¯ˆ ù]ü’úÕq±uq`) Çñª¦ªø‚ø¡‡è’) !¡XxðòA1.VXÎ0` j´)BhñK‹F †Î6Î7#oF/‹V €F ™J¸•ÐÔÑ„”]ÁÊ-ÜeÓyS扥$e†CØ–ù[îî¸ë9Îs˜q:góÝà8~àÒ¥I¤’œ’œAµö·IÃFÜÈ2b±óLðÌg‚©‘) ±#S@7Ù÷³«û Ã0C“Þgèµmµš©ÞËŒåæàF¼ïõW^¿»ã®ïTßÕgV7<ÓÉ ´€úÀÝ|@7OZžüúô׺öºj~u}{ýÅ¢‹=¢ a--Ä {ì[±+f¬P½ÁȴȘ11«b–¼´!ÔÚÕúÂŽ¦;M¿ðÞumÐALÍÍ:8뇎…Ãq¼¾½¾®½n$s¤‹­‹ê-”7”[šYZ›[Ë–\ùõŠïç¾ñáña¯„©!d “à4Ð\}{ýè‘£B†5ÆÝÑ}P™!ä:ÚU>“"„L]ð–÷[ë¿Y_ͯ&3V Ë ™škhom1šôfe:ê­³oÁ¹ @2t& Z»[í,ìHoÙÂÔâôêÓW\¹Czã@A2tÖø¬Çqâ4Ÿts'ÍýçœnJÞTÑX¡Žönd èŒÀ¤ŽÓ|Bô²h–ÃêÓ«5S* %H¦€ÎÚBv#É?Í'˜›{ë\~eþÑŽª©  + ™:«o¯g1-L-Ô×…ç8Ï-üWdZä¯OU_/@ûA2tÖð¬AMLåíX²c‚Ý„U§WÉ&¢z’) ³†g 긕¯ÀÄÐäÜ[çîÕÜ;xù ºûZ ’) ³úözõÝ}’çîèõZÔÎowÞ­¾«î€‚d 謡]G¦„­ßêîè¾òôJ¡X¨™Vd èL3×L ††çÞ:WZWºë»]šéhH¦€ÎdækƤ1“ö,Ýóïìߪº¥±N–€d h ÇñÆgš¹f*³iÞ&oWïU§Wu‹º5Ù/ $S@[ü.¾H"ÒØ5S‚fpæÍ3O[Ÿ~|ácMö (ÉÐV}{=BH“§ùgç>¿úù%?j¸k@!H¦€¶ˆó5|dJXë³váÔ…ožyóYÏ3Í÷(ÉÐVSG†a ó:k†a§Vjïiÿ0åCÍ÷(ÉÐVsG³ÓÂЀšWð²YìÏB>;qíDÖ½,JÉÐVKg %‡¥2+f¬œøNì;--†4’) ­–ΫVÔÆðÕ_I¤’‰© h$S@[ÚLmÌm¾^ñu­„”Âj#êÉÐVKg‹õ*Oó þîþox¾ñ^Â{ÄP-@WLmiÑ)áXØ1ScÓ5±k¨¨$S@[ÍÍZ’LG™ŽŠYóíÝocóc©Ž¨ $S@[ÚsdŠš?eþ;3ßÙ˜¸ñqËcªcjÉЖV%S„Ðáàö#mÃφã8Nu,€|L=u »zD=ÚpJf„Ɉ³ožÍ)ÉùúÚ×TÇÈÉÐ1N^«ŽLBÞ®Þÿ¶ñÔËʨŽ ’) §æŽf¤}É!´ÿû¬VŸ^-‘J¨Ž ’) 'âÈ”ÚÇI•214‰ å=ä}võ3ªcd‚d è©¥«Ã0K3KªQâ/Ü¿DøF||áãû5÷©Ž’) §æŽæQ¦£ ªQîÓ%Ÿº9¸­<½R$Q $S@OÚ6.J¡aì[±jìÏÚOu,€L=ñ»øZ5.ª·)ì)Ûý¶ïþnwáÃBªc$€d 詹C[ž%íGÄ¢Ïqž«Î¬êõP .H¦€žZ»ZYf,ª£€fðõН++£³£©Ž $S@Oí=íL‹þëaT›ê0µçJÏΕ;©D½‚‚‚4ó{§5¯Ç@Ýžõ<É9`5OOÏÍ›7k }väȪCÐH¦€žTL¦'88Xñè³”½xËœæzR1™@H¦€ž ™ ƒd è ’)Ð0H¦€†ºEÝb©’)Ð$H¦€†žõ>^Vðóó‹ŠŠ">jhh022ª¬¬ŒŽŽvvv¶²² jnnFI¥Òèèh—#FxzzÞ¸qƒhAÖX,ŽŠŠrtt´±± #Ö"êäæær¹ÜÓ§O+ߨØ8œmÇ0,==ÝÙÙ™ÅbËz½A24ô¬çÀaflFJk¡¡¡³fͪ¬¬<|øðÚµkëêêBÄ¡âž={.\¸––vãÆôôtÙ*qqqÞÞÞ²BHHˆìÓÔÔTooשּׁ¬˜˜˜ÄÄD×ÓÓ³nÝ:„ÐÑ£G?~æÌ™²²²ùóçûûû‹Åbâ½ÐDw‡JJJJMM½yóf}}ýÛo¿-ëqÛ¶mß|óÍ믿.[rýúõÐÐPŸanþÇœ”””ŸŸÿôéÓððða¶Fg¸âj)è"00000ê((pòÚI‹ VSqÿXYY9r„(óù|±XŒjllÄqÜÙÙ9&&†øèÎ;²å ÚÚÚ˜Læo¿ý†ã¸ÏéÓ§§L™’@|ZSSÃ`0:;;'Ož|êÔ)b¡T*åóùR©žLq?~ü¹sçˆ ÷ïßGµµµRRRˆå]]]'OžtwwŸ={vrr²P(på!„x<žügÏž%ÊEEE²EO¾‡pd hèYÏ3/˜?~<::zìØ±«W¯...f0þxJmmí„ ˆ²¬Ð›……Å¢E‹ÒÒÒž>}úË/¿UUU-_¾œ¸iîàà ‘Hª««>|8qâDb ÃX,qŽ/óäÉ¢Lª««‰¹\.BèòåËcÇŽ½{÷nbbbNNNpp°‘‘Ñ07_Ö#›¬G ’) !ròõõ}ôèQJJн½ýìÙ³kjjdq8œÒÒR¢\^^ÞO#Ä™~jjj@@€¹¹9›ÍÎÈÈ ŽhˆƒÐ &°Ù쪪*Ù*­­­ÉŸ^Íáp*++‰2Q`³ÙÄDË—/geeÉnÐSEEQ(++“ï(b2mooÿðÃMLLÃÃÃeß0Ò‡§©{Ü0[S:´°ÿ6aŸº=™LÝÝÝ###¹\îôéÓqg2™èùX¢+VìÚµëÆeee[¶l‘­O¤EYañâÅ¿ýöÛ±cÇV¯^Z¹reTTTaaayyùš5kæÌ™ƒzóÍ7wìØqýúõºººC‡q8œîîn¢A¢»U«VíÞ½›Çã•––nذÁÏÏOá¶ûÔ©S¿ûî»ìììššš^x!<<üöíÛÃÜü={öðx¼¬_¿žèQ¶QàOäÏùU¼f*‘H¼½½_}õÕ‚‚‚†††¢¢¢÷Þ{Ëåöôô཮¹ ÿ9„PNNQ&.Ì“b˜#e—Éúo“ô]Ô=¹VÕÛÚ¸µsͰšŠûçêÕ«nnnL&ÓÅÅ%11Çq&“ÙÜÜ,6oÞLÜÍ•}BqqqòÇCBB¸\.qT(FFFr8ssó… VTT ?ùä.—kffæáá‘““C¬(ëN(FDD888XYY…††Ê¾xJ¿Q'Nœ˜5k–*{Lõºfºÿ~WWW ‹eË–544(l”*ôä{8”d3fÌ˜ŽŽù…²§¾L¡¦–L|Jo)ô_Aõd:`ûá'_âÞÂN†ùó°šÞîÕ)ý&#„RSSUoDOöóPNóÖ¯_?bÄù…,KþÂ|?â’’’8ÎÈ‘#·nÝš˜˜Èf³-,,d§H ôú C6¶nãÆóæÍ³²²255uss;þ¼¬Â·ß~Ëáp¬¬¬Ž;F,T3(k­¨¨¨w#òCü”V ¤§§;99±X¬ÀÀÀ††ÙrÇ{%TØYû}UpÞ`Ê(¥.]º¤ô¢™l ¬Š\\\†?⊆ä3«ŠG¦–––™™™}}Šâñxû÷ïwqq)((())™;wn@@€ìS??¿¦¦¦ÔÔT„ТE‹deâL'..®²²R¾ Ð²ü^^^yyy\.wݺuUUUuuu§N211D…… Ö××§¥¥W!ÆQ[[›––f``@Œäñx'Nì«âȱŸ Ó¦M»sçν{÷<==-Z$ õèÑ£®®®ùùùååå~~~²ÿœ‘²#Ó~*÷¿Çú¡'G½Í>8ûÝøw¬¦·ûGÃôd?%™Þ¸qã&žãóùøóLÑÏ€8âJq›R¾<à)|ïdJŒ­kmm•]B-))Ar×­.\¸ kŸX¨tÌ Çë§¢ÐOÙµ-âbKK Ѧұ„xÉ´ŸÊCÞczò%îmÚîi¥~4`5½Ý?¦'ûy(§ùl6[6„È¡òƒEý ˆ377GÏGrÈ—‡€[×ÚÚåããÃf³×¬Y#_ÁÁÁA¡ý¾Æ öÓÈ€\]]‰Â¤I“BµµµÄJÇöµ-ýT&qé‰öîv8Í6”¿É%K–?~\6ŽÅbýüóÏ uúG""§øøøTVV ›gÝ›f?999 `ñâÅb±øÊ•+}US:|[é,¨2Ä(µo€‰NýèÜ;KD"Ñ… BBBLMM}}}åŸQ t>S¥³ ÊV)((puuÝ»w¯üã$@ ™ºéèé@™›˜Sˆª®^½Šš7oBhéÒ¥™™™@iÍÓ§Ooß¾ý•W^™0aÂ_|‘‘‘ÑÞÞþõ×_úé§Ä ½]»v•——Ë?‹èëë{íÚµÎÎÎiÓ¦­\¹ò§Ÿ~ÒÌFé!H¦€nºEÝ!²¦Ù×€äää––ccc ÃV¬XÑÞÞÞ×™¾ÒáÛ΂Êår÷íÛW^^>þüµk×zxx¨skô$S@7]Â.„©±)Õ¨D(fddÄÆÆÊfG[°`A_oBT:|{ÀYP %%%7oÞloo'é ™ºév#„Lt#™^ºtI,/[¶Œõ\pppff¦P(ì]Yéðí~fAE ‚øøxooïððpOOÏâââ}ûöipûôˆ’W=냇›œœ4ôž^ aÝ¢n†ÃØÐ˜ê@T’œœ¼xñb3³?.J¬[·îòåË‹/V¨ÑÑѱtéÒîîî =z!ôÑG ‚åË—755¹¹¹}÷ÝwÄ3Ç„¬¬¬ìììÿüç?žžžšÙ"½¥$™ös3‘6¾úªø7Æ9Ü×ãh¹êêj‡CušÖ-ìÖ•ÃR„PBB‚Âkkk‘HD”ñç É ÑÑÑÑÑÑòõŒŒvíÚµk×.¥í/]ºtéÒ¥dF ú $™†„„h>M200³³{gãÆ]]w©ŽEí©AÓº„]ZxÁôÒ¥K‹-ê½üã?Þ³gæã¤ûS2 ¦*9y2÷ÓO3fÍZ•µ™êXùºEÚxdêëë+;º´¤7 ÒÒ~FݹóäéÓVªcäëvëи(@z—L«ªïÞ}‚b0 .\Pœ9Ð@·¨[ Oóíé]2½xñ##BH"‘ž?Ï£:@>ݺhCï’iròOb±!„ãxYY}IIÕ’Á‘) „~%Óââ§5Ën1.^ü…Òˆùº„]pd 4O¿í_¸pÛØØP(ü}N‘H’’Âû׿|{¿Ýè®AÝ€ª®®¦|`µ!êyQ’PÄX%¥éߣžŒw¦ç/O)ÇSRx²LJ¨©á=yùe.UQÒu‹ºmGÚªX¹  €ÚÕS9èüFTÒ€‚õ9) èÃxg=J¦……Ú122nC2¥ÕÇ™ö5Ÿˆæ”ýýü>’ §øÜ@q0`xôèšiFÆmccÅÿ¡¥¥³  Ró!5éviû ý§YèÛñèé%DÜ 5sD#áµÞ:O_’éemm=J?22bÀè}:Ñêq¦Rúy#úÑ ÚT„B˜rPœ è"}I¦™™E!CCFïb±ôÿþïŽH¤d>] ‹´wœé³Rt鯨ô8B8B²ï›ÎñéA_n@ùøL¿ËôÑGç—/ŸñÒK޲%=––#¨ L;':A%Ÿ£_>BG¸ÂÛ d7‡š©ô%™úû¿,ÿãGŸ9sÂ’%îTÅÔ§K eSð ù¨ Õd %³FaÈæd¤3/RýЗd ôŽã=â-ºÅ/Byÿ@]O”eR„ [É$§@éË5S 'bŽãZtšoæˆ,_F¸)}ÊN*Bch<& L­ïyÖ¢Ó|k43 ½š‚ G!ƒ^¯É1¶DÖÓ© ’) •ßßó¬=G¦ÇehñohÔT„äŽO1âæ…  H¦€V~ϳö™Êˆ;гrÄþ;b0‘q¯BŠì})Ž ’) â4_‹n@¤"t=±ÜЬ ´ð'd1! á83êÈi ™ZùýÈTÛNó݇ÚK‘W ëäû3šò/Äz™ÚS $S@+Zw !Ô| Ý߃^>€ÌÇý¾ÄÀ¹ÿýí{JÃ$ƒd h…82e2©ä9qÊ_ì ñë?2±¦"  .0hЊ@,@1´&™ÞÛzêÐÜ+pמö ™Zˆ†1z褊K83™9\è8H¦€V„b¡ÃH‹^êe1YL¤:  pÍЊ@,014¡:   ™Zd ¨ÉЊP,464¦:   ™Z#S@H¦€V"ÅG¦µ—Oe€"L­%B*Lۊѵ¥¨ò,eê@2´Båi¾¤]B63ÐÄ÷© P Æ™Z¡òÔ½OQw-šsapŒ¢à·h…²#Ó†\ôàúËdÆZ†555‘”Z›-,,$½Y­êq° ™Zˆ¨H¦¢vTð&r\†Æ­Òt×@k@2´"”Pqšû$îF=®é~‡MMÇ­dé+<í ’) jŽLÇÌG¯œD&6}}ÞØØ¨°„Çã͘1ÃÌÌÌÉÉéÔ©SÄÂÔÔÔ1cÆX[[þùç¡¢¢¢yóæYYY™ššº¹¹?ž¨†aXnn.—ˉ‰‰ŽŽvvv¶²² jnnF ‚M›6ÙÙÙÙÚÚ~ñŲ1 KOOwvvf±XÁÁÁÍÍÍÄ ¶¶¶Db’5{úôéãïMi´¯½öÚálj 666ÝÝÝQQQŽŽŽ666aaaDÌèÏù‘(+„'¿!²å8Ž÷ÞD¤¤$‡3räÈ­[·&&&²Ùl ‹-[¶È7ÕÚÚ*‹ûÙ¨+ü ®—ìí7]¼ø ÕQòù}á·"fÕQü!///$$dÒ¤I ËÇQ[[›––f``PWW‡ZºtiKKKrr²¡¡aOOÏĉ×­[WUUUWWwêÔ)@€ã8BÈËË+//ïÀ®®®ùùùååå~~~8ŽGEEq¹Ü¼¼¼’’’Y³f!„‰µ&MšTPPP\\ìíííïïO,$>•o¶««kÀøB<O~‰ÒhÏž=;cÆ ¢Âûï¿¿víÚýû÷»¸¸”””Ì;7 @Ö |$²˜åÊz”-?zôhï=@TðóókjjJMME-Z´HV®¨¨Åœ=vìØ={öÔ××+ýõ XáOûdÀ´É”®Y~6œê(ð®®®“'Oº»»Ïž=;99Y(*T°²²:räQæóùÄáÏíÛ·q—H$D² ‹ˆ:%%%ò)&%%Çñ)S¦$$$jjj Fgg§³³sLL ±ðÎ;òk={–X^TT„jkkSÈVD³ªÄß;™*¶µµ•ÉdVWWK$6›››;~üøsçÎÕîß¿O„5™*ÝD…œœÙΔ/+„ýèÑ£­[·r8œ+Vܺu«÷¯rÀ ì“~>£1H¦t5ëÀ¬÷âߣ6†K—.ÙÚÚnذáÁƒ}ÕIJJ²³³ãr¹«V­ºqãŽã¡††âS"Y<|ø022ræÌ™ööö ǘÄ_µ©©âÛYJJJ˜Lf^^ÑNww·üZ ËýõW…lE4«Jü½³R_Ñúùù}þùç999\.W*•2™Ìëׯ+„5™*ݽ++-Ëëéé‰uwwÿë_ÿªt{¬€ã8\3´" LŒ(~6ŸÃáxxx\¾|9++‹ÏWþh©¯¯ï£GRRRìíígÏž]SSƒž_ ”ñññ©¬¬" ²0ˆdW]]­b}íÕW—)))¹yóf{{û¼yÊß;`7 ÍÅBcųFM:õ»ï¾ËÎή©©yá…ÂÃÃoß¾­PÇÝÝ=22’ËåNŸ>Çq&SÉ{VD"‘‡‡Çøñã⪱ºèêêºuëÖ•+W–/_Nu,jZQû ¨¢$ä#ÏÓ:÷êfJÎA³³³W¯^½}ûö±cÇj¾w ƒd hE ¨ñÔÓlTú%òIGÌÑêê‚^–-[¶lÙ2ª£Ð8Í´" Õud*lA·ÞFNË'@-íÉЊ‡FñÖ#Cô×cjiè>H¦€>¤¸T,«eÖ(\Š˜vÈãkd4ŠüÆ-À5S@b‰!dÄ0"¿iÌMûŒüfÀ‘) ‘D„Ô”L$S@D254€ó-@H¦€>àÈP’) ±TŒ22„d (ÉÐɧù=õä´ô$S@džæ7壋Ψågšú’) Ò†F‰ÚÑ04æoÈê/$„ô$S@¤æÿ¼ IºÑ+1:7›   "ôñûiþ0o@=NE•gOÌfŽL}ü~78§ù=uˆ÷.ry qüI èH¦€>H¸õÓZdl‰¦}AZL@o@2ô1Ük¦¢v$hF'á2Ãú®™úîÝ|# 4ÿ:™}G¦€>àqR@!H¦€>~?ÍgÀù $S@$ÜÍ`¨ ™úID†Á|€L}ˆ$¢AgR©@=±½ÉЇX"\2­û};uת-" G ™úIDƒx–´§Ý CÖ¯ S{uô\]ÒG‡ÎÏϧ: òÕ×0™AAAªTv·«_ãÞ±5½»ís•êSkÆŒ|ðÕQ€þ@2ÕGùùùžžžTB2¡ƒƒÐAÅÊEõvï_õItà䬠 €êÀÀ ™ê)OOÏ””ª£*QñXPKþ[íÉHÉHÉHÉH0¬»ùùùù‡&+M27·;zôP\œî=J¨ã 1 kll´±±¡:ÁQSØ:º7À0 ëÈôÉ“'©©©d…¢I/½TÏbé^&-(( å`{h€„q¦0\Qc(o¨ác.ZâÑr£‚k¦ <oÆŒfffNNN§NÂ0 !dkkÛÔÔ$6mÚdgggkkûż~ðøøxYÁÏÏ/**Šø¨¡¡ÁÈȨ²²2::ÚÙÙÙÊÊ*((¨¹¹!$•J£££]\\FŒáééyãÆ ¢Ywb±8**ÊÑÑÑÆÆ&,,ŒX‹¨“››ËårOŸ>­|cccÿ›C,LMM3fŒµµõ矎***š7ož•••©©©››Ûùóç:Љ‰é?{#==ÝÙÙ™Åb777ËoTÿñ݃Crrò0[ƒ¨±vÆQ[[›––f``PWW‡jllÄq<**ŠËåæåå•””Ìš5K¶<..®²²RVˆ­©©a0“'O>uê±P*•òù|©TŠËåñãÇŸ;wލpÿþ}„P[[Q!%%…XÞÕÕuòäIww÷Ù³g''' …BU6çöíÛ8ŽK$¢¯ÖÖV±XLÔ)))‘O‹DGJãïko „Ξ=K,/**"ÂVH¦²øûÉT'Ài>èÓñãÇ£££ÇŽ»zõêââbƒ!û¨¶¶v„ DYVèÍÂÂbÑ¢EiiiOŸ>ýå—_‚‚‚ªªª–/_Ža†a‰¤ººúáÇ'N$VÁ0ŒÅb§Ã2Ož|xùòeùˆŽ”ÆßÏÞ¨¨¨ eeeòa+4 h@C¿Èööö?üÐÑÑÑÄÄÄÑÑ1<<\ö—‰aXaa!‰}‘Þ ö¨îîî‘‘‘\.wúôé8Ž3™L„‘ªV¬X±k×®7n”••mÙ²E¶J||<‘e…Å‹ÿöÛoÇŽ[½z5BhåÊ•QQQ………åååkÖ¬™3gBèÍ7ßܱcÇõë×ëêê:Äápº»»‰‰îV­Zµ{÷nWZZºaÃ???‹%êÔ©S¿ûî»ìììššš^x!<<üöíÛªlŽ‘Häáá1~üø¬\¹!ÔÒÒ"_Aiü}í „Ðž={x<ÞƒÖ¯_/ »¯ttÛp®¨xÍT"‘x{{¿úê« EEEï½÷—ËíééÁq!Äãñ††ÒÔž5|ÍôêÕ«nnnL&ÓÅÅ%11Çq&“ÙÜÜ,6oÞLÜ¿ŽErW ãââä 8އ„„p¹\â2¨P(ŒŒŒäp8æææ .¬¨¨ ~òÉ'\.×ÌÌÌÃÃ#''‡XQÖP(Œˆˆppp°²² •¿æØ{Ïwvvž8qbÖ¬YnúóåËÆÆÆÌÌL'''//¯¬¬¬… 7²d)¿Ÿ½±ÿ~WWW ‹eË–544ÈoT_ñù÷¨¥‰d3fÌ˜ŽŽù…Ä\g“©Âß¡¬GÔÇ­Rh8™‚a"ë«¿/ ‰Óü„„„õë×1B~!‹Å’¿¡ÑÏ@¤¤$‡3räÈ­[·&&&²Ùl ÙÉ”ÂÀF¥(<øÚk¯Éž…-((°±±éîîî+bT ¬¬0ZPF~9Žã½$ª²E]¤‰dúË/¿¼ôÒKý×9tèPRRRjjêÍ›7ëëëß~ûmÙG wîÜ9{ölttt\\ܽ{÷Μ9søðaâFD\\œ···|¡·ÐÐÐñãÇß¾}ûáÇ›7o^¹r¥P( –= ›””øùçŸ÷ƒüù¨Âs,òË¿üò˘˜˜ÄÄD×ÓÓ³nÝ:·ÐŽãÓ§O§:  )Ã9¬Uñ4ßÐÐðƲe]óù|üù©P? ‰+hÄí]ùr_'P½?R:x°µµ•ÉdVWWK$6›››ÛO WÖz/ì}š¯t@âжHNóõü¾t‚&ŽLÙl¶là‘CåÙúHhnnŽž ‘/«NéàÁQ£FÍ›7/--íÚµk†††3gÎì'†!P: ‘¬-hMü /Y²äøñ㲑ƒ,ëçŸV¨ÓÏ@Âáëkð q¦ŸœœŠaX?1à8Ž™[•H$k‹ÚFÉô“O>©­­õóó+,,¬­­MOOß¹s§Bö¥÷ÀF„PGGGës‰¤¯Áƒþþþ………IIIaaaýÄÀb±.^¼ØÞÞ¾wï^ù®û-H,W: QÁ°_ '4‘LG}óæM++« ¸ººž9s¦÷¬}ÿøÇ?–.]:cƌѣGŸ9sFÅÆW¬XAL2$+ „æÌ™cùÜ/¿üòõ×_;vŒÍf¿÷Þ{«W¯^¸p¡¿¿?BÈÂÂbþüùÄý±¾bøâ‹/¢¢¢Æ÷ꫯÊúõññyñÅFtË/ߺu«ŸŸßÒ¥K_~ùå'Ož¤¥¥ zÇt†Ëݬóçχ„„ §ÊxxxlÛ¶ê@TBÌg:ü dÉjG†ñxYX0ÃÂ<  ÞØøìƒ½½÷~ûmü÷è ’iÂÃgÃà8.•â55üwßõõ=|ãFoŠè!H¦ýqv¶õòÏ`ü¾—Äb©TŠ—”Ô}tü×_ßÐ[L°fÍ,‰äOçõB¡!ôÓO• ügÍšs7S@‹@2Àܹ“íìFö^.Ip¿téÞœ9rr~Ó|`z¥êûÖ®fÕQÐÆ™ÒƒaðöÛ>ÿþw¶X,éý©T*]¶ÌÃÇG÷^šª„ 0Æ?Ø<¬|?ºçKu,T¢ëøb:¡Qkoï~é¥íâÔ¿†íØáÿÎ;³(‰j8òóóŸaؘi#Ü*ú’©ª^{í¥¿ýmò¡C!vv£ˆ%ë×ÿ­¹¹ã_ÿ:Ïb™ùú¾@mx4Py•Ÿ»ý¡TŒ¤r{1d?MÉÐ4´ Ü€©W˜èÇñ>Hºxñ—¤¤u㨠L×IÅø­Ã5÷Ï7 e_ƀ؉¶SGh<(n@ Bï)£0 ;p ØËËõÍ7O—–êõØ!´‹/m(ÿ5Ey&ecÖÍ4ƒÉt¸ŒŒ'O®vqúßêjU_*R1~iCEÍOÏp©²1d;u„vÌ$ @ÿ ™’ÀÔÔøÜ¹pss“7Þ8ÑÚÚEu8ºÄÀ[ô¥«[Èh CC1ia¯ÀS  ™’ÃÒrDrò»=Ë—ÝÕ%¤:]blΘñÇïÔ„‘öÆΧR!nÿa t$SÒØÛ³ÖVU5­[wN6¨hŒ»ùßö;cŒ10Ùy½!fë·ž€n€dJ¦‰ÇÄÅ­¹y³|Ó¦o`˜Ä HÅxî®Ç£¸&Kb&Œä˜‡¨VãM Mà+ t|SI6mÚØ¯¾Z™™ù˾}ÿGu,ºäιúg5‚™sG¿0"0iòËïŒ10ÄØ… ¦@gÀ8SµHM-|ÿýo>ùdɺu³©ŽEð+z.¼ñÀc£ƒÛë£ÿXXÙ#Ia\Ðð”ZN¯©áïÞiii3Kõ—â×v=²™ËÌÜèà`Iu8µ€dª --þþ_\¸°Å‚ÛÓМ[i‚•Õˆ„„5­­]+Vœ€‡M %H¦ÂåZóͺòòÆwß…‡M H¦š3y²ýéÓo]»VòÁ‰pušdªQ3f¸|ýõªŒŒÛdS eýØ&îcs@7Œ;vPƒ~qqmkk±gÏ·#GšN›æDu8šÖp¯3ûŸe–ãL­\á…£€Và ( ¼ñÆŒúúö;/ZZšý•êp4G"”þøéCîÌQ.¾0D Ð œæScË–…áá3?ü0ùÇ£:͹}²®«Qìõ‘ã0ÛÁ0¬°°P,cÖÔÔ4„†³.JA2¥Ì޾¾/„‡Ÿùùç‡TÇ¢ M¿uÝ=WÿײÍÇ“Ò ƒÁˆ‹‹9r(Óô g]”‚AûT‰$+Vœ¼¿úâÅ..t~ØT*Æ3VþfdÊð;9aøš`Æãñ¦OŸÞÆÆFUZS±&ý€#S*o6up°\¾üD}};Õá¨ÑýĆÖ*Ïv®B&Å0,))‰ÃáŒ9rëÖ­‰‰‰l6ÛÂÂbË–-ª4+;Uçñx3fÌ033srr:uê†a![[Û~Nä‰uåkâ8íììleeÔÜܬb ½eÀÕššžy{ï3çß­­TÇ¢.%™MEgêz/Gùùù555¥¦¦"„-Z$+WTTôÕBˆÇã…ÆÆFÇÇQ[[›––f``PWW'û¨ŸFˆ ²ÂÑ£G]]]óóóËËËýüüU ²wïCßS@gA2Õ 6½ôÒ'ÿøÇÑžÕ±hB(''Çq‰D¢P&Òe_k)$S++«#GŽŸòù|±X<„d:eÊ”„„âÓššƒÑÙÙ©J½{òº NóµÂر։‰ë~ýõéÚµz÷fSsss„ByPŽ?=vìØÕ«W3Œ!DRUUµ|ùr Ã0 sppH$ÕÕÕªIJï@×A2Õ“'³OŸ~ëÇÛ¶-•êXt¯¯ï£GRRRìíígÏž]°”ãL IDATSS3„FØlvFFq”!•Jù|þ„ 4Ö;ÐuLµˆ——ëÿ»21ñÖþs‰êXtŒ»»{dd$—Ë>}:ŽãL&!ÄçóU\¨¹råʨ¨¨ÂÂÂòòò5kÖÌ™3g8½}ÉT»øú¾°wï²ÿüçò©SרŽE—œ:uêêÕ«ÎÎÎqqqÖÖÖ>>>/¾øbKKË€ëÊjnݺÕÏÏoéÒ¥/¿üò“'OÒÒÒ†Üûð¶è$gªÌþüóÿ}õÕÊŋݩŽeˆp)‚ä½ßwmô¯-Z½úÕþ3>7·„êX†èæÁ'7>N —.]”‰ŠŠÒp#¨ŽLµ”D"}÷ÝØü--íŸ/¼À¡:œÁ©¹õ,k}Ùßö9[š}ÉT{ â×_ÿoYYýÅ‹dz¥:U‰ÒôЖãLçÿgÕ± 9pš¯½LL Ï{ÛÞ~Ôòå_74<£:UÝþº¶›/öŽîÔPèH¦ZmäHf\ÜG¯¿þU{{7Õá ¬éA×½ø:˜ÙQ ÉTÛÙÙY$%­kjêxë­ÓB¡˜êpú#ã¹;Ù½4bò2˜ èH¦:ÀÉÉ&6ö»wŸ¬[+‘hïæOn¶·=êñÞÊEÕ¡ qpJg\¿^öÆ'BC=¢£ƒ¨Ž¥Om£¸&TGà…z:ƒËµvv¶Žþ? ÃfÌp¡:嘣à­b@OÁW_—øû¿ÌçwmÛ–:j”é[oͤ:À ™ê˜Õ«½kk[?ý4côh ?¿—¨ð;H¦º'2òïMMë×Çe:s¦JsÄÔ n@é$‰Dºví¹¼¼Ò´´º¹9P†Fé&ÃàØ±7¦La¯XqâñãfªÂvH~»Ð„Káÿc ™ê,&Óèܹw¬­ÍCCÿÛØHÍæ?­¹}¢VÔ¥½C_ÐH¦:Ì‚™°F"‘®\y²£C áÞknµ?Hkš5ÖØ^y$Sgg7*9ùÝšþ[oÅhòaSQ—4oÏcW_+Go u €6ƒdªóˆ‡Mùåñûï#ÕÔåËÛ_׊{¤3þ¥c­ >LéÀÝ{æÌ[YYw£¢T}mÑp4þÚuï›Ï-xÞ H¦4ñê«>û,,6öæÑ£WÕÚ‘TŒ_Ûõˆ;ÓÂÕ×J­ [àÈ‚>–.ýKkkWTTºùë¯{ª©\Š;ÍfMX/ààO ™ÒÊ›o¾ZSÃÿ裔Q£Ìþþ÷ÕÑÃØ`Ú»öêhO@Ñ Žã[¶$gdÜNL\÷Ê+ð&4’) I$ÒwÞ9{ófYzú†)SØT‡€^€dJO==¢¯?nÉÌÜèèwŠP;H¦´Åçw.]zL(gf¾occNu8Ð ¢-KËIIëÄbÉÊ•';;‡õ°©°CBVTЙ’àüùóT‡Ð§§O»Ž½?ikÕª¡Î|У޳ŽLo¾á„RCS///͚ɔ¦Õoã46æ $ Ÿ¹S†¹—¤Ý$F¥>ÉÉÉÁÁÁTGôŒ3%ük -ÿ Ð\3@2@2@2@2@2@2Õœööö?üÐÑÑÑÄÄÄÑÑ1<<¼¦¦†øðÂÂBû"½AUô³Ð$S ‘J¥ÿûßoݺ•ššZ]]ýÝwß1™L///@ÓoUÚo ýƒAûröìÙŠŠŠòòò#F „lmm¿üò˽{÷êð¯Ã°ÆÆFDÓ @updª! ëׯ' ‹Åb0þxé¼X,ŽŠŠrtt´±± knn&–c–””ÄápF޹uëÖÄÄD6›maa±eËY…øøxùBoEEEóæÍ³²²255uss#æxíµ×>LT(((°±±éîîî+†¦¦&ù2ñ¬‘­­-±¼ÿ Ä0,77—Ëåž8qBÅö‰Bzzº³³3‹Å –U@á`ØBÉÉÉý×±´´ÌÌÌì§·ÿ~—‚‚‚’’’¹sçÈ>õóókjjJMME-Z´HV®¨¨Àq<..®²²R¾@4(ßÅĉ×­[WUUUWWwêÔ)@pöìÙ3fÞÿýµk×öCcc£BY~á€èåå•——·}ûöAµ?iÒ¤‚‚‚ââboooÿþw2®Úïu€dJUþ€ oܸ!¿ ÏçãÏsßøñãÏ;GT¸ÿ>B¨­­ø4''Çq‰D¢PVȘòí+|ÔÚÚ*‹‰rII ‘°Z[[™LfuuµD"a³Ù¹¹¹ýÄÐ2pSRRplûgÏž%É*÷’)  œæk›Í.--•ýÈçó{ßé~ò䉋‹ Q& ÕÕÕÄæææ!…²êZ[[£¢¢|||Ølöš5kˆ…£Fš7o^ZZÚµk× gΜÙO ÃÜ@.—Ûÿ6*%«|øðòå˲åÁÁÁ©©©ÉÉÉ¡¡¡†õŽã¨ït6àÙ°íWTT…²²2Dê€dTÓRáÔ²¾¾žÃáøúúòx¼§OŸ¦¥¥M›6 ýù4÷îÝãÇÿé§Ÿˆë‰~~~²öeçìJËJ¯™æääðŸ‹Åööö‡jnn.**"f ,))Áq¼­­ÍÔÔ”Åbá8ÞW ,ëäÉ“mmmëÖ­Cr§á¥¥¥ªoàÚwuuýé§ŸŠ‹‹gΜ)«<ÌßêÉ”*þ?~ü8,,ÌÒÒÒÌÌÌÏÏ8.“Ï5B¡0""ÂÁÁÁÊÊ*44TþbÿÉ!§PÇãñ233œœLLL¼¼¼²²².\8iÒ$¢%K–L:•(÷Cll¬µµ51Z€XîããÃd2›››UÜÀÁ¶Ú¿¿«««……ŲeËÈú]@:˜iŸ†éôäÐÛ¶m£:E†ñx¼éÓ§jþ]Ý×LõZWW×­[·®\¹²|ùrªc@·ÁÓ)z-;;{õêÕÛ·o;v,Õ±(§M@‡@2ÕkË–-[¶lÕQ@pš$€d $€d $€d ~wçΪC@‡Á (r9r$%%…ê(†åîÝÑ&43™ª@'A2%A`` Õ! WOá³gÆMM¦NÕ± K`` ££#ÕQ}O@„:räÊÁƒÙ®®v×®ER : ®™„JK+D•—×—•ÕS : ’)@÷ï×TV6"„Œ ‰¬ ,H¦edÜ62b „„Bqjj!\ù` ™ê;©OIá‰D¿ßÄú´õöíGÔ†€.‚dªï~ú©²±ñ™ìGccà nS: ’©¾»pá÷s|‚P(NO/‹¥†€.‚dª×D"ÉÅ‹·eçø„ÖÖž›7˨ ÉT¯åæ–<{Ö£°ÐÈKKS|Ù LõZzúÏ Ca¡H$ý¿ÿ»ÓÓ#¢$$t$SýÕÕ%Ìξ++y¿§GôÃ4º ’©þúþûb@ù´&†àž>ƒÉTedÜFHùø|‰ÿþû⎆C@wÁD'úëÁƒ§ò÷ñ}}oÛæçã3A¶ÄÕÕÎÌ̘ŠÐÐ=0Ÿþš<™­°„˵~ñE˜¿€¡€Ó| $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S !Õh‹êêê›7oRÅòóó{zJ©Ž‚2ŽŽŽ3fÌ :  «0Ç©ŽA+œ?>$$„ê(¨db‰š¤Ò.ª¡L```JJ ÕQ]G¦’““Cu€;vì : Ûàš)’)’)’)’)’)’é uuu}õÕWÁÁÁóçÏ>pà@SSñÑœ9sJJJHì‹ôµ¡ÇÞ] ³Ó9sæ´µµ ;.†Æ™Žã†íܹÓÞÞ¾¹¹ùÛo¿]¿~}||¼‘‘ÕÑ(G¦ƒséÒ¥§OŸ8p`òäÉ,ËÅÅeÓ¦M111 ƒêІ®¯#;8â@uLçÿû_@@“É”_hnnn`ðÇž”H$111ÁÁÁþþþ{öìioo'–Ï™3ç‡~ úûßÿ~òäÉï¿ÿ>00ðµ×^;~ü¸¬Âÿþ÷?ùBoååå[¶lY²dÉÂ… ß|óÍü!){²¸¸Øßß_ ôƒ,?å9sæ „ò¦ürÇ¿ùæ›×_}É’%;vìP}‹úÒÝÝÝ!‡X¨´¥Û+‰Ž;¶téÒ€€€ôôô~V'‚¼sçNHHHvvvÿQ0L§¼¼ÜÅÅ¥ÿ:ÉÉÉ?üðÃÎ;¿üòË–––ƒÊ>ºzõjLLLddä7ß|ó¿ÿýïôéÓ)))µµµ¡mÛ¶¹¹¹ÉzÛµk‡Ã9qâDRRRPPо}ûÄbñœ9srss‰ ?üðìY³ÒÒÒúŠAñmFFƨQ£úZž‘‘‘••õÉ'Ÿü÷¿ÿ …‡Vq‹ú²yóæÅrˆ…J{Qº½qqqyyy»ví:vìØµk×úYpòäɨ¨¨¹sçöÃ×L§«ëÿÛ¹Ÿ—Ô–8à#¡Y  -]$¢iDé?PVV–¸©@¡"¢ŠDHQH.¤hÕÆ$ZE‹ÂUHä&T"sSjœ¢|‹ ñ–yÕwÞõÕý~V_‡9g¾s_æœÁ‰&¼|C9N&“‰ã½½½þþ~.—‹Òëõ&2 „R©,..njjBuuuÅ㇇6›ÝÖÖ†ï>[[[£Óéx!,^^^"‘ˆD"YZZº¿¿'âèèÈh4.,,|•C‡F£áñx¡±±1¥RI’dAAÁogôÕ -KMM͇ǘt”¤ó=88àóùxvZ­6u’¸3ÿ(¦™!âææ¦¶¶ÿt:$I¶··'ö¹»»+++Ã1‚Á`EEBˆN§#„h4Ú‡8}ápxkkËívûý~‡ƒ …Báññqeee^^ŸÏO‘Cnooçæææææâ-Á`þïg”z”üüüÏó …Bñ8¤H²´´4»”HÓ̈Åb‡Ã!—ËñZ‰Éd^\\|èÃb±~OÇo»AP•€^¯çñxƒƒƒUUU±XL.—ãöæææÝÝ]¯×ÛÒÒB£ÑRä€] ƒéJÄðð°X,Æ—G"‘ø2œBIGéììü<_‹åóùðbÓï÷ÿ6ɬë;éƒo¦™Q«Õ¡PhrrÒãñ„B¡““»Ýþ¡B¡ØØØ¸ººòù|ËËË"‘(ÍÒ³¿¿ _<@¿îÕ¼½½½¾¾r¹\‡ãõzÍf3Bèññ!$‘H<ÏááakkkŠ˜Læééi4ÝÜÜLßä3Ü®P(l6›Çãñûý‹‹‹###™<³t%%é|år¹Ýnw»Ý>Ÿ/¾Ùõg’à+°2ÍLIIÉêêªÕj~~®¯¯7™L*•*±Oww÷ÓÓ“Á` I²¡¡A¯×§ys³Ù<55Åf³ãB(±(X,–ÑÑÑ•••õõõêêê¾¾¾H$2==m·Û †P( xì«t:Åb±Z­:ngg7 ­V»½½]TT”˜O¼]¥R‘$i0Âáp]]Ýììl¶Ï/•¤£$¯Íf ‡ÃF£1‹ ¹\®¯.à“ößá“ö¿õáÐ333\.·§§'׉|K&“‰ÅbÁIû k°2ý H’¼¾¾v¹\:.×¹¼;??Ÿ˜˜øÜÞÛÛ‹7ßøa ˜þgggóóójµúÿ³mÝØØø­—ùd ŠéO •J¥Ri®³à¯»ù@(¦@(¦@(¦@Ø€ú…ÉdÊu 7.//e2Y®³ßÓwåååÎ+™L&‰røÆàP@øf €b €b €b €b ø´˜„'_òIEND®B`‚glom-1.22.4/docs/libglom_reference/html/doxygen.png0000644000175000017500000000730312234777145023525 0ustar00murraycmurrayc00000000000000‰PNG  IHDRh ;ˆØŠIDATxí]y\•Õº~45%TL Q”PE"q–Û11±]8a„w*©¨(*â" ˆzÀè`8 ¨‰¢mÅ,’òà„p$%”œBó(8k†Ü÷ýÜû6lòö»§k÷Ç÷[ÏÞß·Ö;?k½ëßÕÕÕPxÑêÏ't´ÏùÈ€zÀÇÅ3_€Q4€g@œmÿ ¾ò‰âci‰ôçÿ{ ðÇð¬ù~½Á€4:õHcÂü ðŸÁ³„ª'ÕPÆæ P7^h،♠zb„cóP¨„ 3‚† Ò}çÿO²qÁºNkÝTÛ(É?d Ç~z<’«4Óǡ؞Þv­zµÙ¦õ¬ZâdÛ,Ë6Ók±]Fz< ¾ZçƒsÕ?ìƒsUø2SÉåwê1”c`[ì—}%ѽ.Ô¼6‚BLZ˜û!F8[ ¹…×TéÛ— »Þ#gó]å:vžu?‡vèbÙR˜?wùŽŸ¾ÊÐgbÑÉÌÕ$kF~Ê;عÆ•¢ïX®?ÉèlÆÙôõà»Nʪ¼­,ìHC§gAz•ÆlÓº­gÑú ]œjÎñåM…3ÓÚæoÒ³'=‘$Ò÷f}G•ŸS_‡öèco.Êȹ :ó£ Ãds®Ù:1=¼{ƒå9?÷ý…zqÛvîÓi‰D’p¿Ë šmÙíoÛâýaÖüEqÒµwÌ}¿~{òj€ç{ôºŸFNëí[ëOq·ÇOSúXO]°>‚‚muæÄ¾e¤“5Ë{¨JÕ¯£(›´«bÂçû’ÍlÓÅ}žïú`éUÞy„ac§Á†ÔCºŠóAkl‘±y¥†ô¢ùôs÷Aø¬7ÄõôoJ±äÄ ù.¥Be. Z¬Ð×ÇÈöå¹­ù'Ù-PëìŠyF.ž‚žÝÚ€lp&.êˆð•jò7’re’z19»ã§HGíø%œüq°ïüz׈c¬_k_")ŸHJnÐÑ~ˆÐÖ˜á´äÕ5 µÁq€ÿ5#¸·îà¶+9T‘‚ ðŽ÷Rܸrz“Ï´Ì =Ï…{ðáO£Èf ¡Íwg|Ž’Ü/¢Þ$÷¯¢ëðúÀ;¿à¨Ö™âÒÆ­]¯ÜW"Þ/< ‡÷DÏà°½üB}çyIEc^—ƒ=[V“Ýh²ëMä$l];Kû®¸ýr¦È*Åò ÿtÒõ$]•MŸ÷´;×I€1èó!‚œõ¸M õ¨(fÌæ<ÁÎÎò5~z¿ù¶ž mÌêÕ >–âÚ©âëˆIÎÞçz;ãu[i·eç^ÆÜÙÓ³NÞëF6B\}7†»+üŽÓ,Ã'a ½˜-yHY¿,‘^—ñfú~ß?Hcø¸…¸ñó{Z+4\såƒû·¯Ù·nߣð«íFÆ¡sغëû§D¾?ò<–Ævkx0ÅM±ælذÁIÓxÿd”žÜÉ÷EE»AªM«g*È£YEí7Û™^[uíý®v[wGå†=Ed¼n×¶ÆæÖÅl¡'¨pGÚk+‹æ¢À¬¨C8ªâš2 dz3H£ß ¡¨BÒûSÃÅù[wŘ ~xpçútÁæmö¤Å£¥iQæ­‰AB1ÉfÙ‰›4u¹ïìIÒ]Ë6äò%ÿ†† 1t.’NJph¬zÌ ÎR1Ž"3-"¸‡‹&ìó°1âüžìó[:‡ï„¼‘……N m–“W0®_èÜœ ×õ6ùò&»)Æìꦬýæ}¬ñ~»{múù]z½£M•ºP~^Îá:eQTÙ_*7ÕÄ9É8—·Ëï 3°¶47E•î¿u÷“SÉ»U¯ _ NíºôW¬e¸ÄNÓ|»;™¿;ŒæÅd"ȉôøòÞµõï¾®½"èÄ´ÖMM+bYµ‘_ÉæEÝüÎ]P»¹XKÐI½Þ¥oE<_¹(„EP±Œ|mÇÁ¡‘Ý,ŠÓ©ººZ±Îߺ§×kÝ,kÍMš`Äø…jzeU»æ ™Át3ÓÀ½˜6—ÒöùË·r¨¹Ñ}““wö:Χùë¼ ¿|‚TܵÉQˆKßç_ÁâÀ™œ”pÑÐóໃ¼Ydâ0!®àa –øöçW$ÃÁ‘Á$/\¬$ð 2ÞímÞLH‹Ÿ èd£HVÜ,:ò½»RÍZšJ­a„z*>‹_…NT(ù‚^SVF­U¹8ñEþôñ܈óùnd;«®8™\C]ø=Èêm¬Æ:‚´ÆbãDd=Áãßžˆ‹UU5O‹|]þð®Pèêv‰á\]2ßìÿ"yÈ[ïyʧz£g{Y«{„Ùø5©ÿ;w{N3é­nâĨw§Á¢ÍK¢Ý­ûÏ29Id¿’ì y)ìPÞò8ŒÅ©¯‰±@mPÔñwjl,6 áhWÕ˜d öà uõmÁp®.™á£Ç…twöR x­BδYcŒxg*vo  yò‘•“[¬?ÜVœ˜0ÒN¡O난~Žó’¯·h#´Hkýœ±8kÓß^Àq@]àÓ“ø,56´¯÷Í-κU»n…[>]@nîøÏœp›[œ6# €4tën¯:ŽÒþ}…—8äT9_žY$/´G’K™©ù†•(óÑ’Mø©`ŸÉdѺ;ùO‹B Ó&P{qöhJÉ+Úé–§¦l2«MïöÝ_1ÑÓ«’t¸½±l€ëØya ¦ô©«®½ÆL^¬žêñš¸ùy.¾Û½Š[ u/]½‹iS}øN>²e1™q‡jfÚ&¢©iT\=kÏ›ÀXô-.84V5ðu!TE˜ þ.ŒOH´¶4—zwTr.ï‰¦Ë xõµ·œÖ„HÆù£žÈHùg Ñhñ’T$ßyq¸zþ¨p¿´ë< q•ró÷š‰wÿÍÑð–I]´–æI²é²˜sÂ"×:Õ–bÕ¦“ÈÙL6¢9VÊÓWž§<æ;”3?ý©Mê3AV#µ±ËÞ¯‘ž K£UrÝ9!›qát¦H£Ù+6ÇV…/TS^pÃùqgLP'Ú5E ‚–ÀÞºîÄ Ën"2|Ÿ;®W»Îý"Ö¬TwÖâµtúŽO'› á+W Ã+¦âZÌ–<ÕÆ&nOÝ,IŠ£06.ÁZ.Çñúøh*INÚ’Oe½ÉgBXÐÔZóäøä9èü“hÒíDSš¥¡Ê µA¯/Ôc¸ö“`A§¯"zå|‘ €ÅŸ¨ú;HÍ#‚Î|%ÄOˆƒ«OàÌÉÐÜD ž mÜðâc–ƤÉÂqm¶uË&~÷núÒË £ÇÏ€ZÕj =«_n[‡‡÷nN§ÏÝ$_¾bE˜‚€Õ)ù8¾?6‘lú“ÍÙæÖ}#bW( œ³d-®•p&¡ý’œÖa”"9öõņÐ$’Ú›AÜ!ä;ÐÑõè{~á¹8‘ÛÞ£1ÛÓÉ0ž`²#´kÒuäNÅÖ Q¹bhæ ”8ûÓMáŽa›•¿”w±h²¢®qŠæ°(bK ‚’Z¾Ò%ÐÆémáãÖË(Éý‚ÛJ)@> þ›7% ï{y Á“¾ÆÒîohfòô>{pÿ.­_Î%±ÉèägëlZØ\B2B #™¸ÚüÒºp‚hÝšü®[¥Ü<‹#SpñÌA7’ãØHƒt4:Ÿ|g¨tÓL¶*($Æ©»ì…®ù’ó÷$;b›ÔÙ`=¶£¦M„MÌÄ5ò«·Ç¾“H·ÌH.¼žHeAîº5}r­dõ¨±)ÀT};€Q5iÖ2…O0ü…0óñÃ;óæ,Š´²µ냔}g‘£]‹7å9ˆà©_{üèîêžC>úhê{Ž .ÈìðIIð€?[Kswz6Òuíý¬;µ€ç§OåâJÉa˶zv°éd† ¤µâ‚l´é舊«Åüy¾c÷ÁèÖÍ'ràúÅ™TWÕôÓ°¡L €|ʽŒ¼ì­høBã ÝTëî'ò]Kø£ìâÏ(=¹Kx €¿ LÌ,Pý¤Êµu‡¹…׈ §Å¾÷à1Ý«Äý;¿pGDäxZYÛ kfæ6¸ùóæ7®œ®þ6·ÕoÚ¾ÔH~ò®Þ¸â 8Uø“p<ºw3¡a£ÏÑ’‘3èÏ"€bˆ-ÎܺÏ_ªÅ]+ËM©zü°s“f-êçhÇãÑýÊãôÿ5}ZQNb{Ó?å%ÿ\SUõعIÓæ}~}p[œoÔÄ„êÐMMZáNÅå@>Œ„²á6(?¡Åé âK½+ü?À%ÝÝ·/Ç1‚9áUø?B)”ÕèâÞlÈÒêÏ @=àùÄÞžk­®ÅIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1UsesRelationship__inherit__graph.png0000644000175000017500000002761412234777146033067 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÓLVýbKGDÿÿÿ ½§“ IDATxœíÝi@×Úà3 KÀ(a µˆV¥Z©(´X«Q·zõZ+­ŠKm-z¥ÕÚ¯V{­K«‚¨l.`ë¾–‚PâFmeÑû!d¾S§¹!„@B& ïók2ÎygaÞÌ™sf0ÇÐY4ª`Ü ‘Ð $ZD@+Hh‰KJJ€‰JJJ¢úø@SfT´õŸÿü‡ê€ŽEGGS‰Äè½óÎ;T‡t  0.д@+Hh ­@" H$´‰¤[‰D?üðChhè¤I“BCC¿ù曪ª*â+ÿ¼¼<ÖÕº@í«ðW¡¾@ k”ÉdþþþõõõÚÄFT§Tˆ®JÀ(@÷_Ó‡ãø† 0 ‹ŽŽvvv®®®>þ|DDD||¼¹¹9ÕÑiê»ï¾0`BH$8qbóæÍ'Ož¤ÓéÚ”I£Ñ6nÜhmm­£õQ2®HLߥK—JKK¿ùæ›Áƒ³X,ww÷Õ«WÇÆÆjyÖ3+++&“Éd2{÷î½téÒŠŠ @й¢Èk Ã&MšÔÙ´ëJÀA"1}W¯^ b0Š3™L&öÏÞ—Éd±±±¡¡¡3fÌØºu«P($æûûû߸q#$$dêÔ©‡º~ýzppð´iÓöïßO.põêUÅ 5žüäÉ“;wîŸrvvF=:11±   ==}õêÕ4mëÖ­ãÆCá8ÞØØH\!)-vêÔ)ôêf;Qfhhhll,ŸÏ···_±bEë+W®2dÈòåË=<A"!$“ÉÏœ¹{àÀ­Ç'‰ˆ˜0zôkj–ÏÎ.3FÝ:u&..S±]‹`aA_°`Ü—_ÎìêtâÙ³ò¤¤œ¤¤ß*+_æ:¾÷Ì™^=zXR:‰¤»“H¤Çg>œ^\\3s¦×òåþC†°© !„¤Rù°aQuuM*¿µµµÎÍý’N7šö"™Lž™™çÒ¥ß ó€ÏQãÇ{PÒ@€nA"龚š$'Nd8p«²òå‚>K–øTÃ˯¿> ÝonNÃ0"[*†ÂqyK‹<99bÜ8ÕOW4d/ÓÒîŸ:•ýøq©»{ï  aac\\``#0bHº£úzQLÌ/GfˆD’ðð±Ë—¿c€'²ììB¯ˆüxæÌ]„ЬYo‘sFŽì¯‡æµ®“›[œœÌ;}š'6ç1¾÷”)o¨y"  I÷R^.Ü»÷zbb6N_ºÔ÷ý÷ÇÛÛ3©J#|p !tàÀ"ªÑ1†L$’¤v÷î«II9¶¶=""&„…a2é~¯©&RiiÝÙ³wãâîüõ CF‰é{ö¬|Ïžk©©÷]\l##'Ϙ1ÂÂÂø^hfò‰„@C9}ú®Lö÷0” Q·Ð A"1e÷ïÿõßÿ^¹~ýOw÷Þ}ô.14ê :©›$ CF‰iºzõb\áˆn«WOVšnŒº["!=}Z–œÌKLÌ®®n9²_HȨY³Þ²¶¶ :.þ‰Ä¤(MŸ4ih»ã H·M$„–Ù­[ORRx0  ãk+*I¥ò³gïþøãÍ'OʸÜá—/¯}ã ÕA17§Oš4tÒ¤¡ååÂóçœ:•’òÀ½çÌ2º«ßc€zpEbôÄbi\\fLÌ/¥¥µAA^~8að`}?b]ºùIk¹¹Åññwλ×ÔÔâã3†¡ A"1b/_6µ ‘¼¼²]».ÿüóÃ~ýV­šdÔã ; IçÃPjjßz †¡€.‰Ä Ý½ûâûï¯^»ö§§§ËºuSL`\a§A"Ñ9 åâÅ\++ bŠÊ×_Ð p³Ý@‘CÓßz«ïÑ£K&NCÏ@§µ†’•’Â#†¡„†Ž†ž@KpEbXˆWÞ:tûÑ£š®%¸"Ñ-†t‰¡ †¦ïß#?¿bæL¯>xF(‚DÒ‡¡ØØXq¹Ãß¼¼kH$Ôknn‰¿sèÐm .(È+"âÝAƒúP”ÁDÒ¥ŠŠ*Ïœ¹›””S\\ÃP@GA"¡’PØtèÐícÇ2ÄóæyðÁ;ŽÁ½òÖ@@"ÑrÊO?=Äq|òdÏùó½áÑ ]H¨QQñrÏžkII¿aöïû-Z4ÞÁÁ8^yKH$úD C‰¿“›[ ÃP@» ‘è›@P·ÿÍS§²˜LË>š8gÎèž=Te ‘P"/¯,%…—][ ÃP@› ‘èOAAÅîÝWSSï;:ö\¾Ü?<|,üCj …$éíÛyÄ0kk‹ÀÀÁÁ#¡?! Á8}xø°x×®ËׯÿùÚkŽß~;§{MÆËÂÂìÕ0”ú”ÞÉ“Ùññw<<œBCGÁ0€àФ«ñxE;v\JOúæ›n‘‘¦ðÊ[ªÀ‰A!†¡œ={¯¹†¡H$]Cñ•·ãÇ\·.Ú´‰Ä57·\½ú1 ÅÑ‘9}úˆðð1ƒÃ0”nš¶tŒš~àÀ­Ç'9wîcH!ÀT1æÄÛP +Ïž½›˜ø[lì/Ä0”àà‘,–5Õ=+‘H¤Çg>œ^\\3s¦×‡úÃO3‚+ÃÃPº-H$:ÐÔ$9q"ëÀ[UU/çÏ÷YºÔzÜë$#B C‰‹Ëüýw>›Íš9ó­ ¼Mø=ЉVêëE11¿=š!IÂÃÇ._þŽ‹ MïHŒ1 åÔ©¬º:1 eöì·¬¬ ×»©DÒIåå½{¯'&fÓéô¥K}/öµ³ƒu!H$Æ †¡˜<¸ÙÞaÏŸWíÚu9-í­mO>™6†ÉìF¯¼ £”†¡œ8‘EC™3g <ÈÀI<{V¾gϵÔÔû..¶‘‘“gÌaa™XOàŠÄ”ÃP$é;ï¼<†¡5H$¹ÿ¯ÿþ÷Êõ뺻÷þè£wahºþA"1= â‹sSRx¿þú¬wïž\î›0 ÅHA"iùÊ[/¯¾«VM‚¡éTDbÂÈa(|~í°a®óç{yA‹±D¢šâÐtxå­!€Dbòˆa(ññw.]úFÃ`ŠùŸDBa(¥¡ÁâáÃÞ66bGÈb‰»¢ ooï5kÖhSB·Ú_55V!;»&ªÑŸäädJê¥ü¸’HèÖåå=š›ÍÜÜê]]_Ri[³f···–…üO"Á0lìØ±GËBMƒHdnmÝÒE…gee;VË3ì/SÅçó³²²¨j-0œãJ(´°°3Rª1Y)))‰‰‰¡¡¡Z–£Üé(22RûBA»tõ£ö—IJJJš3g…ÀqÕMèªÙ¦“Rt[Hh ­@" H$´Ò™D" ×­[çêêjiiéêêºdÉ’’’â+ Ãx<žãÃZÑmùšJ¥†UUUé¹^]ÑóþÒóÒC*Âv •õ¤Ž+í« ±X,.—[TT¤ÃÂõ¹Å:œHärùÔ©S³³³SRRø|þO?ýÄ`0|||Äâ.µ‡ºyóf­‚#FtQEm¡Óéqqq={öÔs½:¡ÿýe’Z„F}ThŽ+ «ììl6{ölª#ê¤?¼öèÑ£ùùù=zô@9::îÛ·oÛ¶mff]õ\&“Éb±º¨p%†UVV:88(Nc6þ|ý súß_z ¸›4™¯=•¡ñÚƒãJ'ÈãŠÅb8p€Ífóù|M†‚v]HÓá+’'NDDDG‰ÅbÑéÿ< W*•FEE¹ºº:88„‡‡WWWó1 KHHàp8={öüì³ÏN:Åf³{õêµvíZrøøxÅ „PCCCÝ+2™L}ù·oßvss;|ø°úºPƒÊ½ 8“¬‘œ¿gÏžܹs'??ŸËå’›ºÝ5jk+µ>ÉêÔÔ•““åææ–žžž——÷öÛo+F®Fbb¢Òÿ¦>Áq…ëë¸"«(//Ÿ7ož‡‡‡L&ÓðüF„¤æT¦É‰H“}­‰'33³ŒŒ Å?!ÔÖÖ⯢÷ðð8vì±À£GBõõõÄ·7oÞÄqœøM§8ÝÖ:«üJMùÉÉÉ䪩«®®N*•Kæååµu$©<ÔΞ=KUYYéááqüøqb±ÜÜ\ ÷ŸÞ åûK妮««c0|>_&“±ÙìÛ·o«‰¡ÿðC† 9qâ1³¤¤„N§766vnT®”bujêÊÉÉéß¿ll,ñíÇM&‘Àq¥“㊄a؈#2™L„FSšî5廹¹‘‹©©«®®.**ÊÏÏÍf/[¶¬Cµ»¸¸(U\\üÚk?aÞÃã£ëÒÕ(ß_*7µÍĉOŸ>ýË/¿˜™™ùúúª‰¡ŠŠŠæÍ›Gô‡qqq‘Édº=5¬ !$HL“&Ž+WäÍv‘HtïÞ½áÇ#Ïoj¶ƒþuø_(00pÿþýd31‹Åº{÷®Ò2§°°˜&&Øl]¾õLMùŽ~~~………;vìxþüùåË—;T»ÒcΜÉN{*J(ß_mmêÐÐPâÉ£aaa†©‰øÝÔ¡ÿ6›}îÜ9â·’\.¯­­íº“¸úº8yÂÍÏÏï¢ôŽ+WÄÍv‹Å`0È™:¿is*Ó¡'’M›6 .—ËãñÁ™3g¢££•–Y´hÑ—_~™““óôéÓ?þ˜ËåjØí*>>ž8)“*uº|RKKËèÑ£=<<?~¼páB„PMM ñUmm-¹˜ât[æÍ›·uëÖ{÷î=~ü˜¸·fPïáÑÿþRº/ÝÖ¦ž1cÇKHHW‹ÅJMM …Û¶mS¬º­]CÌ_¸paTTÇËÏÏ_¶l™¿¿G¶YǨ¯kÁ‚_|ñEFFƳgÏ:tëÕÀÁqÕuÇ•†ÛIÍ©L¯:Ñ^ö×_…‡‡ÛÚÚZ[[s¹\"g*¶J$’ 6¸¸¸ØÙÙ………µÕìØz!§4Ѻ¥¯Óå“Óiiiýúõ³´´ôññ¹páB@@À믿Žã¸ŸŸƒÁ¨®®VšFªZ‰™ÍÍÍ~ø¡­­mÿþý‰Ûk>lwêí ®÷ý¥HͦÆq<00pèСÄt[1?~ÜÉÉÉÞÞžè½CÌWÚ5d`ä|‰Dòé§Ÿr8&“@ÞðÔäQ¹ÕÜ#Q_—X,ŽŒŒ$zm?~™Ê=Ž«.;®4ÙndHmmõU+Æ@ÍÍv Æ£GÈ.¡êé3‘¬3flÛ¶ê( ‘Q$ƒÇ•ætµ¯áY[Ú:tè'Ÿ|òòå˲²²M›6M˜0ÁÞÞžê  H$ÊÎξråʼyó¨Žåo—.]jý( ⢢¨ h Ž+ªñ0T‘˜˜¸jÕ*6›ãø¸qãÒhŒö5-Zp\u”µõ¶¶S©ŽBßt2 ÑL©DªV¦ruuÕ²„n²¿®_/9þ¯M›þ;dˆ-Õ±t Ýä¸jíäÉ‚œœÊ­[ç88t£_->>>Ú‚uç Àð‰ÅR/¯ÿÔÖŠV®œøé§Ó¨˜²Q£¾()© ûí·s¨ŽÅÈÀ=`Ðâã3…Âf„°_}Fu,À”•— KJjB‰‰¿ñùí?ö(‚D WK‹l÷îk2Žþûï|‰DJuDÀdåäÑhBˆFÃ~üñÕáH$Àp>Í«®n@Gµ´È~ÿ½óï¶@½œœ"33B¨¥EŸYUÕ@uDÆ 0P2™|çÎÞøfaAÏÎ.¤0`Ú23ó%’¿_øˆãxLÌmjã1.H€úùç‡AÙD*•C"]¤±QüäI)ù±¥Eó‹PØDaHÆ 0D8ŽïÜyY±G¡\Žgg@'CÐ<(–ÉþçЋ¥GfPÑD ÑõëŸ=«PJBasaa%U!öÛo…ææÿ3¨N&“ïÛw]$’P’qD ÑÎétLi&NËÉ)¢$`Ú²² ¤Rå>"‘äÔ©,Jâ1:H€Á¹s§àáC¾L&Wšaè·ß ‘“Éäwï>oÝh*“Éwï¾ÖÒ"£"(#‰œ]».Óé*ŽL©Tž‘ÃŽå啵ՄU]Ý’’£çxŒ$`Xþø£$33!„aÊM[!>¿¶¦¦QïASFŽ QBŒOÜ·ï†\]<Úïl†¥¥E¶nÝ”òòúÒÒºââš’’Ú†1ñ†!Çy¼¢É“=© ˜ï¹L†#„C_i4ÌÆÆºo_{77;''[¡°‰Å²¦:LƒmmæÌ=:ED¼[VV_ZZWV&ôôt?ރ글é8räW„‹ ËÉɦO› ¾Y·nÊâÅ㩎˘À 0hAýÜédß5IDAT;ï¼îæfïæfOu,À4)å gg›²²zª‚1Rp.Ç‚:ggÕ€n„Íf uTGad ‘ÃUUÕÐÒ"c³m¨t#ÎÎH:  0\Äÿ3\‘}êÓǦ´š¶: 0\A=‚Dô š¶: 0\¥¥u66ÖÖÖTºgg›ææ–ÚZ®ÔH€á*+«‡$@ÏØl[ôêjh 0\Ðe è›ÍB•–BëV@"†  Ð?kk‹^½¬à6I‡@"†«´´¾OhÚúÆf³`Lb‡@"†K ¨ƒ{$@ÿœm i«C ‘U[ÛØÜÜM[@ÿœYp³½C ‘ƒHUœmàI‡@"Šh[€Dôž’ÒQH€ê˜LË^½TºggVCƒX(l¦:£‰¨²²z¸”pv¶A¯õ4‰¨ÒRD¨AŒI„D¢9H$À@ õÄCô¬W/«=,!‘h 0PAñÃýsv†‡Éw$` ‚:Ö¨·: 0DBasCƒÀ[I: 0DÄÿ04mªÀàöD Ñ«—ìBÓ FŸ>𸭀D ‘@PgeeakÛƒê@@7åìl#656Š©Ä8@"† ¨õj( ´ni 0Dð’]@-¢£Üo×$`ˆà݈€Z¶¶Ö †9Ü&Ñ$`ˆ ‘jaÖ§Ÿ/“ÉØlöíÛ·ÕÄЉD2dÈ'N3KJJètzcccçÖÇqƒ¡2‘¨\52$51œ={–¬·²²²ÿþ±±±Ä’>$7Q[…'''·ª¢Ö‰š¶Áf³Ÿ>}J~¬­­-))QZ¦¸¸ØÝݘ&&ø|>ñ‘Éd"„h4šÒ´æêêꢢ¢üüüØlö²eˈ™666'N<}úô/¿übffæëë«&†N(**š7o†a†¹¸¸Èd2mÖ¨_¿~EEEJ+%“ÉT®š&1¸¸¸(Ö+HL“j wssëÐÖ A"tF``àþýû‰¿!‹u÷î]¥e8Naa!1ML°Ùl]àççWXX¸cÇŽçÏŸ_¾|™œš’’’˜˜†a˜šˆ×Ê+l6ûܹsÄÏp¹\^[[Kž ;aÚ´iÇŽ#?þñÇööö/_¾lkÕÚAé¹¼‡LöùùùÄ„šÂ;šËÿùÃÎýÐ’P(\·n«««¥¥¥««ë’%KÈ_s†ñx<Ö¥ó ¡F¬'•JÕ÷®Qù'MMMŸþ¹»»;ƒÁprrâr¹YYY]ºFmÓ¦M€Ëåòx<@pæÌ™èèh¥e-Zôå—_æää<}úôã?ær¹,–F¿‰'~ª“¡†††ºWd2YKKËèÑ£=<<?~¼páB„PMM BhÆŒ</!!!<<\M ,+55U(nÛ¶M±êÚÚZ•!ó.\Åãñòóó—-[æïïß‘m¦ì“O>ÉÍÍ]¿~}qqñ£G>üðà  ‹ÕÖª4aÁ‚_|ñEFFƳgÏÈÛþê ï$MZÄ€†4¼G"“ÉÆ7~üø¬¬¬ŠŠŠ¬X±ÂÍÍ­¹¹‡‘\WqóæÍZR©T.—ÇÅÅ›QóÀЫ6â¥K—:ôÖ­[åååOŸ>ݺu«••Ñžnô|Çñ¿þú+<<ÜÖÖÖÚÚšËå¿÷ï‘H$’ 6¸¸¸ØÙÙ………µuû¡õ4B(..NiBQNNNZZZ¿~ý,--}||.\¸ðúë¯å:”˜n+†ãÇ;99ÙÛ۽ˆù~~~ £ººZ)0r¾D"ùôÓO9“É  o¤·»Fm!úPYYY999-^¼˜¨º­U#·ª&1TVVŠÅâÈÈH¢×Öñãlj™ê ×d¿#¸ÙÞ¥4L$±±±}úôihhPœIœ q£M$¨½»”:¯®+¥>‘ØÚÚ^¼xQñ+r§ý'ƒ5cÆŒmÛ¶Q…ÉjH i‹Ð_ûø¨UC‡b libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - u -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Relationship-members.html0000644000175000017500000005602712234777147030637 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::Relationship Member List

        This is the complete list of members for Glom::Relationship, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::Relationship
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_allow_edit() const Glom::Relationship
        get_auto_create() const Glom::Relationship
        get_from_field() const Glom::Relationship
        get_from_table() const Glom::Relationship
        get_has_fields() const Glom::Relationship
        get_has_to_table() const Glom::Relationship
        get_has_translations() const Glom::TranslatableItem
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_singular(const Glib::ustring& locale) const Glom::HasTitleSingular
        get_title_singular_original() const Glom::HasTitleSingular
        get_title_singular_with_fallback(const Glib::ustring& locale) const Glom::HasTitleSingular
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_to_field() const Glom::Relationship
        get_to_table() const Glom::Relationship
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        HasTitleSingular()Glom::HasTitleSingular
        HasTitleSingular(const HasTitleSingular& src)Glom::HasTitleSingular
        m_title_singularGlom::HasTitleSingular
        m_translatable_item_typeGlom::TranslatableItemprotected
        Glom::operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        Glom::HasTitleSingular::operator!=(const HasTitleSingular& src) const Glom::HasTitleSingular
        operator=(const Relationship& src)Glom::Relationship
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        Glom::HasTitleSingular::operator=(const HasTitleSingular& src)Glom::HasTitleSingular
        operator==(const Relationship& src) const Glom::Relationship
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        Glom::HasTitleSingular::operator==(const HasTitleSingular& src) const Glom::HasTitleSingular
        Relationship()Glom::Relationship
        Relationship(const Relationship& src)Glom::Relationship
        set_allow_edit(bool val=true)Glom::Relationship
        set_auto_create(bool val=true)Glom::Relationship
        set_from_field(const Glib::ustring& strVal)Glom::Relationship
        set_from_table(const Glib::ustring& strVal)Glom::Relationship
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        set_title_singular(const Glib::ustring& title, const Glib::ustring& locale)Glom::HasTitleSingular
        set_to_field(const Glib::ustring& strVal)Glom::Relationship
        set_to_table(const Glib::ustring& strVal)Glom::Relationship
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~HasTitleSingular()Glom::HasTitleSingularvirtual
        ~Relationship()Glom::Relationship
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1UsesRelationship.html0000644000175000017500000011445512234777147030047 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::UsesRelationship Class Reference
        Glom::UsesRelationship Class Reference
        Inheritance diagram for Glom::UsesRelationship:

        Public Member Functions

         UsesRelationship ()
         
         UsesRelationship (const UsesRelationship& src)
         
        UsesRelationshipoperator= (const UsesRelationship& src)
         
        virtual ~UsesRelationship ()
         
        bool operator== (const UsesRelationship& src) const
         
        bool get_has_relationship_name () const
         
        bool get_has_related_relationship_name () const
         
        Glib::ustring get_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        Glib::ustring get_related_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        sharedptr< const Relationshipget_relationship () const
         Return the relationship used by this item, if any, or a null sharedptr. More...
         
        void set_relationship (const sharedptr< const Relationship >& relationship)
         
        sharedptr< const Relationshipget_related_relationship () const
         Return the related relationship used by this item, if any, or a null sharedptr. More...
         
        void set_related_relationship (const sharedptr< const Relationship >& relationship)
         
        Glib::ustring get_table_used (const Glib::ustring& parent_table) const
         Returns either the parent_table, related to table, or doubly-related to-table. More...
         
        Glib::ustring get_title_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the title of the relationship that is actually used, falling back to the relationship's name. More...
         
        Glib::ustring get_title_singular_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the singular title of the relationship that is actually used, falling back to the regular (plural) title, and then to the relationship's name. More...
         
        Glib::ustring get_to_field_used () const
         
        Glib::ustring get_relationship_name_used () const
         Get the name of the related relationship used, if any, or the relationship if there is no related relationship, or an empty string if neither are used by this item. More...
         
        bool get_relationship_used_allows_edit () const
         Discover whether the relationship used allows the user to edit values in its to table. More...
         
        Glib::ustring get_sql_join_alias_name () const
         Get a name to use as an alias in SQL statements. More...
         
        Glib::ustring get_sql_table_or_join_alias_name (const Glib::ustring& parent_table) const
         Get the item's alias name, if it uses a relationship, or just get its table name. More...
         
        Glib::ustring get_relationship_display_name () const
         Get a human-readable representation of th relationship. More...
         

        Constructor & Destructor Documentation

        Glom::UsesRelationship::UsesRelationship ( )
        Glom::UsesRelationship::UsesRelationship ( const UsesRelationship src)
        virtual Glom::UsesRelationship::~UsesRelationship ( )
        virtual

        Member Function Documentation

        bool Glom::UsesRelationship::get_has_related_relationship_name ( ) const
        bool Glom::UsesRelationship::get_has_relationship_name ( ) const
        sharedptr<const Relationship> Glom::UsesRelationship::get_related_relationship ( ) const

        Return the related relationship used by this item, if any, or a null sharedptr.

        See also get_has_related_relationship_name() which can prevent the need for your own null sharedptr check.

        Glib::ustring Glom::UsesRelationship::get_related_relationship_name ( ) const

        Convenience function, equivalent to get_relationship()->get_name().

        sharedptr<const Relationship> Glom::UsesRelationship::get_relationship ( ) const

        Return the relationship used by this item, if any, or a null sharedptr.

        See also get_has_relationship_name() which can prevent the need for your own null sharedptr check.

        Glib::ustring Glom::UsesRelationship::get_relationship_display_name ( ) const

        Get a human-readable representation of th relationship.

        This just concatenates the chain of relationships, separating them by ":".

        Glib::ustring Glom::UsesRelationship::get_relationship_name ( ) const

        Convenience function, equivalent to get_relationship()->get_name().

        Glib::ustring Glom::UsesRelationship::get_relationship_name_used ( ) const

        Get the name of the related relationship used, if any, or the relationship if there is no related relationship, or an empty string if neither are used by this item.

        bool Glom::UsesRelationship::get_relationship_used_allows_edit ( ) const

        Discover whether the relationship used allows the user to edit values in its to table.

        Glib::ustring Glom::UsesRelationship::get_sql_join_alias_name ( ) const

        Get a name to use as an alias in SQL statements.

        This will always be the same string for items that have the same definition.

        Glib::ustring Glom::UsesRelationship::get_sql_table_or_join_alias_name ( const Glib::ustring parent_table) const

        Get the item's alias name, if it uses a relationship, or just get its table name.

        Parameters
        parent_tableThe table to which the item (or its relatinoships) belong.
        Glib::ustring Glom::UsesRelationship::get_table_used ( const Glib::ustring parent_table) const

        Returns either the parent_table, related to table, or doubly-related to-table.

        Glib::ustring Glom::UsesRelationship::get_title_singular_used ( const Glib::ustring parent_table_title,
        const Glib::ustring locale 
        ) const

        Get the singular title of the relationship that is actually used, falling back to the regular (plural) title, and then to the relationship's name.

        Parameters
        parent_table_titleThe title of table to which the item (or its relatinoships) belong.
        Glib::ustring Glom::UsesRelationship::get_title_used ( const Glib::ustring parent_table_title,
        const Glib::ustring locale 
        ) const

        Get the title of the relationship that is actually used, falling back to the relationship's name.

        Parameters
        parent_table_titleThe title of table to which the item (or its relatinoships) belong.
        Glib::ustring Glom::UsesRelationship::get_to_field_used ( ) const
        UsesRelationship& Glom::UsesRelationship::operator= ( const UsesRelationship src)
        bool Glom::UsesRelationship::operator== ( const UsesRelationship src) const
        void Glom::UsesRelationship::set_related_relationship ( const sharedptr< const Relationship >&  relationship)
        void Glom::UsesRelationship::set_relationship ( const sharedptr< const Relationship >&  relationship)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/usesrelationship.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1DatabaseTitle-members.html0000644000175000017500000003567012234777147030705 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::DatabaseTitle Member List

        This is the complete list of members for Glom::DatabaseTitle, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        DatabaseTitle()Glom::DatabaseTitle
        DatabaseTitle(const DatabaseTitle& src)Glom::DatabaseTitle
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_has_translations() const Glom::TranslatableItem
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const DatabaseTitle& src)Glom::DatabaseTitle
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/functions_0x63.html0000644000175000017500000002421012234777147025016 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - c -

        glom-1.22.4/docs/libglom_reference/html/dir_b3890f6bb47b53a6abf21354c7f7f634.html0000644000175000017500000001526112234777147027455 0ustar00murraycmurrayc00000000000000 libglom-1.22: libglom/data_structure/layout Directory Reference
        layout Directory Reference

        Directories

        directory  report_parts
         

        Files

        file  custom_title.h
         
        file  formatting.h
         
        file  layoutgroup.h
         
        file  layoutitem.h
         
        file  layoutitem_button.h
         
        file  layoutitem_calendarportal.h
         
        file  layoutitem_field.h
         
        file  layoutitem_image.h
         
        file  layoutitem_line.h
         
        file  layoutitem_notebook.h
         
        file  layoutitem_placeholder.h
         
        file  layoutitem_portal.h
         
        file  layoutitem_text.h
         
        file  layoutitem_withformatting.h
         
        file  usesrelationship.h
         
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1View__Composite__coll__graph.png0000644000175000017500000005647512234777146033315 0ustar00murraycmurrayc00000000000000‰PNG  IHDR}s]NvbKGDÿÿÿ ½§“ IDATxœìi\SÇÞÇç$ÂTBØdSÁJ«"¸Ze©ˆxA n]´hËÕZµU+ö*j¥W[Ûº`[µV¤€Dô‚úØ"Å´¨ˆ²‹¶€ìKÖy^œS;ÉÉ2ß/&sæÌüæ@~ÌÌùŸ9„ „!-@¨Èw„¼A¾ƒ@ ä ò!oï y£A´„ðèÑ#‡C´ Lš4i̘1D«)ÈwƒÂÀÀ€Á`­BÝ),,$ZÂè€|1(´´´Tà߬²£2¾ƒÖw„¼A¾ƒ@ ä ò!oï yƒ|@Èú†.çΓÝïEÀ0¬¡¡a…W¬X*™sýúu*•ÚÖÖ&i}2$͈þ‘í}ô7zxxÈ´ Õ#,,Œh ŠEXXØÛo¿ÝÕÕ¥­­ç\¸pÁÇÇG__ŸXaˆa#[ßñððèñŸ 1 ªä;†q8SSÓ‘TâëëK¡P233ÿõ¯á9.\صk—ü• F ´¾ƒ5X,–‡‡‡ŽŽŽÍ‰'0 ˜™™544p¹Ü7Ž;ÖÌÌìû￟‚aØÙ³g%½ÑÔÔ b2™øÇ°ÙìÀÀ@aLLŒ­­-F[ºticc#@$ÅÄÄØÙÙéê꺻»ß¼y¯\¬D DEEYZZššš.[¶ ? /“meeuêÔ©¾:˜ššjcccddR__ŸŸŸ?þ|¦­­íââ"ž÷¸RuöF½žD2””$»úU¼n?~üÖ­[kjjRRRH$Rmm-€Ãá@£¢¢¬¬¬rrrŠŠŠ¼¼¼Äùqqqååå’ ©dffêëëwwwC£££ýýý!„‡¶··¿}ûviii@@@HH„ðÛo¿µ´´ÌÎÎf³ÙQQQ&&&|>B(nqÿþývvv¹¹¹EEEóæÍ ›̜93''§³³SªÀÔ©Sïß¿ÿðáCwww''§uëÖUTTÔÖÖž8qBKK‹Ëåö¾QQQ½uJ’““6a„¯pVVV]]Ý€Åä; ‡^·AúF;tèžnjjâo»­­íÉ“'ñC÷ïßç>ŸobbráÂáo¼W5iÒ¤øøx¼›Í&“É'NćB‘HÔÔÔ$‰ „ï888üòË/â~ZZZðÉÉÉýhdeeáé{÷î***žSTT$n¢Çuprrê­BØÙÙùÓO?¹ººz{{'%%ñx¼¯òAT­xߥ@¯Û }'11qìØ±VVVï¼óÎÍ›7¡Ä·J¥æääàźºº†ê;ˆˆˆ•+W>{öŒB¡466BÅËÌbŠŠŠ´µµÅ I"©äÆ’J=z„¸sçN?ÏŸ?ÇÓ€ŒŒŒmÛ¶Í™3ÇÜÜ\r×ã:HÕyùòe33³õë×?~üxðAe|­ï F ??¿ÊÊÊäädsssooo6›->Ä`0Š‹‹ñtiié0* »xñ"“Éôöö¦Ñh:ž––†ÿãCGGG:^QQ!>«¹¹Y(JÖÃ`0ÊËËñ4ž ÓéøGi€¯ƒXyQQ†aË—////?pàÀÓ§O¯\¹Ò×u€öÖÉ`0ÜÜÜ®\¹’‘‘ÑÔÔ4Œ ¢Ô(–¼ ©%1 ËËË“.…ÆÕÕuÛ¶mVVVÓ¦MƒR©Tþ¥Z¹rettôÍ›7KJJ6oÞ,>åìÙ³¸Mˆ}áå奥¥µwïÞ¨+yçwöìÙÃb±Š‹‹×¯_`dd4ÈnÛ¶íáÇ~øáÒ¥K©Tª›››ƒƒÃãÇW­ZxñâEïëÑ[§³³ó¥K—233ÙlöäÉ“W¯^ÏÝÔÙ ¥ÀÐç "‘(.._>$0艀Ԓ‹5즕tžuíÚ5*•jgg—!ôôô¤R©\.÷“O>Áïg9sF|Ñqqq’‰~ˆŒŒ$“ÉõõõøG·mÛ6ƒ¡§§çëë[VV†gîܹÓÊÊJGGÇÍÍM¼"#VÂãñ¶nÝjaaA£ÑÂÃÃÅ¿»e€øøx ccãåË—755¥§§ÛØØhiiÍœ93##Ã××_îq¤ê”¤££ãÇôòòð «Ì< ƒ2{†aIII„ÄïŒàe\†••Uïh‹þÃ=vïÞ=eÊüîI_Á WX|9h—`2*×MÎ rž…5*3Ï"ØwúŠøppp8sæ žÿàÁükÜWh†Ô¦%}ËhnnîmÑO¸Ç§Ÿ~ ߤž¥…uà‹‹,Kj€É¨\79ƒ|GAPß!xžuìØ±˜˜kkëwß}·°°L&ãùÏŸ??~<žvppÀOŸ>urrÂÓ†áSª±²²477GEEyzzÒéôˆˆˆëÌÉÉñó󋉉Á?J=ÇÞÞOL˜0PSSƒ¬¨¨X¾|9>P·°° …UUUC¹<„jB°ïôñann.¾«ZVV†' Íè <.ÃÓÓ³w´E?u&''ÇÆÆ¦¦¦fgg÷u:N°KKKqå½7qU…`ß‘ñX¾|ùÞ½{ïÝ»÷øñc<Üð¾B3¤Æ€ôŽÅâóù½£-ú ÷ R©666;v숌ŒäóùROÇKöëïÏ 5À1 RWvG+êÃ?Ä0,==½G‹xýêxE²›ÂA¬SôŽøp8œîîî?üÐØØØÖÖùþýû}…f€^1 â` (—!5Ú¢Ÿ:ñå.—;a„¯¾úª¯` Ð+¬CÜè€þnrFÎë;M/deeáiñâÚHfffÖÖÖ+V¬Ìÿ‘€^É•YßQ¬¸A©à7×G^•R€|G̨»ÀÕ«W “’’ $ÃS‘ïÈÅzNBŒ³³ógŸ}ÖÖÖV[[»sçÎyóæ™˜˜- A0†¥¦¦ÚÚÚ…††#*)))((hÑ¢EàêÕ«}“ºGOÿ¡^øíÎatJ=QPßIJJº{÷.N···Ç£È‰V„PvìØ‘˜˜xûöíêêêÕ«Wé\>Ÿþüù°°0mmm??¿~6±>xð`bb"“ɼuëV]]Ýš5k‡>vìØÏ?ÿ\RR²`Á‚Å‹KMnn®½½ý¾}û$G}"»¡P¼ù‚R €×MAæY€Ó§Oãéüü|ðrëœA’‘‘A£Ñðmnâââ$§ZàŸó,©{ô >VYY¹}ûvƒ±råÊþ·Ô6hž…@€žÀ£®†•””ôâÅ MMM ÃV®\ÙÚÚÚ×Tëùóçâ†ðDUUÕ€ácVVV_~ùeiié‚ Ö®]ëææ6ÄΩÈwÊ„8˜«¤¤Hl3 </--íÌ™3â›e>>>ÉÉÉR KÝ£gácEEE·nÝjmm?þ »¥v ßA({÷îe±X?ŽŒŒÄ·ÎpãœË—/ ‚àà`£—„††¦§§óx¼Þ…¥îÑÓO¨€Ëåž={vÖ¬Y«W¯vww/,,üòË/G³çª…lßc£°Õ:9#ZbȬ^½zÙ²eõõõ ,ˆ¬\¹2..ÎÖÖ¶ÿ“’’-Z¤££#Î Z·nÝ•+W-ZÔ£ðÖ­[ÛÛÛ—,YÒÕÕåããsøðaÀgŸ}Æår—/_ÞÐÐàââréÒ%===ñ)™™™_ýµ»»û¨õVu‘íþ; û޾Ç­Zå`h¨I´)„……¡ýw¤"uW# ØLfpp0Qªä‰Êì¿#ÛûYŠ ™¬gnþ±®îëD éu¸Ÿ•™™)µï;vìèë -¨ÏÎÎN¼áðªU"Tæ~– çYPQ­çرß÷î½8s沫WÕiG[ÃÏÏo¨!RË÷Ø%~Õ"ä:®+§¤Ü_˜šzW " !#öeìã´qeõeC=w¶Ãl `±×cç}=ïEÇ ¨C¨ïðù´´¿zL²pZZºoÜ(–¿$„ŒxÈ~øßÌÿŠ Hƒ¬QR_2ÔÓgÚÍÔ kˆ (·,wÒ“îV¢ ¯ÑG]|çúõ'ÒïnhhΟG[ªÃú„õøÓȹŒ3äñÎŒñ3øB>€/ä7´7Ìþjvʽ”ÑW©Þ¨‹ï\¼˜ß×S;03³€ÇC›r«Ì»ÌìâlÜ8xB^IÝÇ;oX½¡Aþ{YG(vó»CއlMÙ*‚h2>j¨Ë²Ùâů/XðjqtíÚ_>øÀkÚ4qNWOSS]®†ªÒÁíXŸ°ž„‘p€>©}2ÔJ¨êÄq²¾Ê‚ààÕƒÅuÅgWŸÕÕÒEÁj‹º|ÓÞ|s’äǵk™:ÕfÑ"W¢ô dÁW—¿jhk‰^ Lž6<…5>ËÓѳ¨¶ˆ'|µ¡H$ºôàÒ´}Ó2?δ1±-Áj‹ºÌ³*Oq]qLfŒ@ôùr¿«¾mÈáŽ3lgô¨  JëJ]w»^/º>€|¡2|’ô‰ÔüÒúR©ùý0ÍfšÔÕHÐÚÝêû­ïù¿ÎYBä;Uàþ—ñ0_N–„D" ã–Ö„qô¨z½óµ(ZÀ"<#æ:ͦPùBèæwÿ‘Ôç!($Ê0|Ã0w[w ¼Z"‘H³ìf=ÞóøðÛ‡tŒF¤XíA¾ƒPzÿ~øÙ‹g}ÍŒÊ9åès¦ýLŠOSÈ ’†Ÿ³ßo›së8"­ò„ `I³üÐûéÖS554d *…ŠŠ„…ÕÃyœuºÍtž§IÖÄ0l•Ǫ£ËŽ^}tõvÙíÑԭƨË}t„ >=<|z8€/ä_-¼ð}Àb×Å¥õ¥…Õ…|!ÿiãÓaÔ9Ãv€ÀiœÓ+ð°óœÿëüÚ¸µ÷¾¸‡9è "T ™ÂðHé—÷~ÑÕÒå ùªÝ­¼+‚¢!í†0Ó7‹[÷¶ÛÛdÒßÏþÝä]“eÛðæhW/Ð< ¡RÜ~¼Ùx<ª˜B¦¸Zº®ž=´-xĬp_!6€ýûÏü>‹J‹b7£½qG ò„Jñ êÁkŒ×dTùço}nnh¾åÜÕ¯> ßA¨÷«îËÎw´4´¿}8‘•˜Y ý­¤ˆA‚|¡:´vµV4TLaL‘]>Î>!SC>Nøm?ï T‡‚êáKúàû·¿¯o«?på€L[Qmï T‡ûÏïhÈúyqsCó;÷gì^D" ßA¨ªL¶˜,‡·}<ÿc§qNÅ$ë†Tä;ÕáQõ# 94¤AÒ8²ìÈÕ«©÷RåМê|¡:BІ„’ ßA(7 {½7hCB1ÈwÊMMK ݈N´ŠAa?Æ~Ó‚M»ÒwÕµÖ­…`4ˆ€@Œˆš–š™v3û/³téR&“)= €wd­D6„„„$''X ùB¹©k­k0vÀbîîîŸ|ò‰ô¨3‡dIä;妶¥v0¾Ã`0BCCå GÌH­ï ”˜Ö®Ö.~×8ÃqD A ä;%¦®­0˜ñB¡@¾ƒPbj[jã ÐxGÉ@¾ƒPbêZëÈ$²™¾ÑBCùB‰©m©5Ñ5!“ÈD A øÎ¹sç0õ ¾þç  7¢Uȃ¥K—õ·%y}ÔÁ0¬¡A).—úG’——'gRî£'%%ÉYBF >žBI©k­C7³†DSSž066ÎÊÊruuèëëËY†ßAa*Ãàã)””ÚÖAï  Ã8Ž©©©ìšssFFFâ´žžžäGy‚ÖwJÌèŽwX,–‡‡‡ŽŽŽÍ‰'0 ˜™™544p¹Ü7Ž;ÖÌÌìû￟‚aØÙ³gʼn€€€¨¨(üP}}=…B)//‰‰±µµ¥ÑhK—.mllˆD¢˜˜;;;]]]ww÷›7oâ5ˆ›QQQ–––¦¦¦Ë–-ÃÏÂËdgg[YY:uª‡x‡3’¾c–ššjkkkdd*nQF ßA(1œ6Ž™Þ¨ÝÌ ÷òò*//ÿæ›oÖ®][[[ À {÷î=þ|JJÊÍ›7SS_½+..nÖ¬YâDXX˜ø(“Éœ5kVFFÆÉ“'X,Vww÷ºuë‡>vìØÏ?ÿ\RR²`Á‚Å‹ |f¼¹ƒ&&&2™Ì[·nÕÕÕ­Y³FÜâçŸþ믿¾ýöÛâœ7n„‡‡{zzްû;vìHLL¼}ûvuuõêÕ«GXÛ@ ð•ˆPBBBBBBˆV!Côÿ­"çÄ€Åyh4Ú¡C‡ðtSS“@ p8¡­­íÉ“'ñC÷ïßç÷ ¥¥…J¥>yòBèééyêÔ©I“&ÅÇÇãGÙl6™Lîèè˜8qâ‰Ë‰DMMM"‘¾ô¡ƒƒÃ/¿ü‚(((´´´à’““ñüÎÎΟ~úÉÕÕÕÛÛ;))‰Çã ØAI,KòãéÓ§ñt~~¾¸Å!1ø¿74ÞA(+<¯­»ÍToÔVCŽ;cmmýî»ï’ɯnÏ×ÔÔ8::âiq¢7þþþ)))ÕÕÕýõ×Ò¥K+**–/_Žß6²°° …UUUOŸ>urrÂOÁ0ÌÈÈûç¾eÏŸ?·³ûûuïx¢ªª ÿhee¸r劵µõƒ²²²BCC)”‘¾.UÜ"®MÜ¢,@¾ƒPV;&z£¶Ã©ŸŸ_eeerr²¹¹¹··7›Íb0ÅÅÅxº´´´ŸJð©“É ÒÓÓ£Óéiiiø?y|hãèèH§Ó+**ħ477 …BÉJ Fyy9žÆtúß{ ‘H$¼€››Û•+W222Ä·¨FHYYž())‘lQ ÓwZ[[·lÙbii©¥¥eii¹zõjñ/i„á’a†††³gϾ~ýzÿåeI±bÅŠ÷õ®_¿N¥R›šš†ÝâP»†èŸÆöFÀ(î¬ìêêºmÛ6++«iÓ¦A©T*xyãyåÊ•ÑÑÑ7oÞ,))Ù¼y³ø”³gÏâ"N,Z´èÉ“'GŽy÷Ýw«V­ŠŠŠÊËË+--ˆˆ˜;w.à½÷ÞÛµk×7jkk<È`0ºººð ñæÞyç={ö°X¬âââõë×ô¸ñäìì|éÒ¥ÌÌL6›=yòäÕ«Wß»wo„Ýß»w/‹Åzüøqdd$Þ¢¸S£ä¤kë;B¡pÖ¬Y³gÏÎÍÍ­¯¯ÏÏÏÿ裬¬¬º»»a¯yãPdee555555•——oÙ²…F£µ··÷S^êL{„¤§§ëêêvvvŠs6nܸhÑ"‘H‡÷t¨ µk#Gµ×wrJrÀPÝ\=`ÉA^‡k×®¹¸¸P©T;;»„„¡§§'•Jmllär¹Ÿ|ò ~?ëÌ™3â¿:@\\œdBfee…/Ùðx¼mÛ¶1 ===__ß²²2`öÍ7ßà™¹¹¹¦¦¦|>¿G †¦¦fPPxs̰ÙìÀÀ@ðrf'µww÷ãÇØl6†a444H¤ÊÊÊ¡v­G8I_ýR[:y-¢…(—/_–ú<„8¶hØÙÙüö¼t$Mhãccãôôô¾ŽX,Öþýûíììrss‹ŠŠæÍ›$>ÐÐЀ¥ýýýÅi|ÚC‰Dúí·ß „NNNëÖ­«¨¨¨­­=qâ„––—Ë…/Ç;»wïž2eJcc#„ððáÃööö·oß.-- 0`æÌ™999±±±xæÇ¼víZa\\\yy¹d"33S__ŸREGGûûû‹ëáp8R[ÙµkWhh(„0>>^GGgáÂ…”””I“& £kãÇߺukMMMJJ ‰DŠŠŠ’Ú¯~Píÿóq·ã´Öi ¦¤j_ÅA¶ó, ›7o¾ªâ%MMMð¥ïô€€Ïfñ|É4>Ìã½ÖÖÖ>úˆN§ ‚ææf|!,**ìO?ýPPP€•1%bš››©TjUU•P(¤ÓéÙÙÙR»ÉçóMLL.\¸!|ã7ÄáxÓR[ÉÍÍ3f „0""bË–-†††`Æ ›7oF×z„“899IíW?¨ö÷íøõãÆŒSRµ¯ƒâ ÛyNßSÄíFòŽ#N?zzzàåí@Étoôõõ÷ìÙS]]]\\ÜÜÜåééI§Ó#""$‹åääøùùÅÄÄà¥FLà‡ðØCCÃùó秤¤üñÇsæÌ‘Úº††Fpp0“É|þüùǃ‚‚$JmeúôéB¡ðÑ£GÙÙÙkÖ¬100øë¯¿²³³ýýý‡Ñµá$Ïž=ë«_ê _ȧG´‚ „áøN``à±cÇÄFFFwïÞíQ¦Ÿ„!ÇŒêééyzz–——8pàéÓ§W®\‘,“œœ›ššš7Ô;b/)6¸ÐÐP&“™””ŽõýªÉ°°°‹/2™Looo&yHj+$ÉÇÇ'!!¡¥¥ÅÉÉiîܹiiiR­mÀ®õ'öÕ/õÃ0zÎ^JÁpÛà¯é IDAT|gçÎ555yyy555©©©»wïîQfÀ„~/¾²ÙìmÛ¶¹ºº2 >ŸïæææààðøñãU«V^¼x—§R©666;v숌ŒäóùR#&z°xñâ¼¼¼ÄÄÄeË–á9½1^^^ZZZ{÷î éQC_­øûû>|_›7oÞ‘#G¼½½555‡Ñµá$öK­À0 öZ5S|>üðC ÃÒÓÓ%3ÅQo„ì†C’“®Á?ŸõìÙ³eË–ëèèà#ÉõÁ HMKjÓÖÖ~óÍ7KJJ „ééé666ZZZ3gÎÌÈÈðõõ0a”¸Îår'L˜ðÕW_I˜€½î:;;‹?iÂÈÈH2™Œ‡3ˆKr8œ¾Z©««Ã0ìÈ‘#øUÄÆÆŠOR×z„“ôÕb?¨öºÆ±¬c&MSRq®ƒ@ 033³¶¶^±b…d>¶¾©tÈv]Y5X¼xñ¾}ûˆV![çû& b¯Ç*ï\½zÕÐÐ0))ÉÀÀ@2úTÝ|GŸÏêìì¼sçÎÕ«W—/_N´ÄðѦhwr;‰V14’’’‚‚‚-Z$®^½ÚW1©áoRwíƒß•yF uôÌÌÌùóçñÅÖÖÖDkA mƒ.~_È'ZÈ`áóùçÏŸ ÓÖÖöóóëû*Fêþ;Rwퟒ››koo¿oß¾úúzytfd¨£ï·µµmÛ¶h!ˆa@5´u·-d°\»v 0þ|À’%KÒÓÓ¹\®Ô’§Núâ‹/f̘áèèøý÷ß§¥¥µ¶¶þðÃÿùÏðx‹èèèÒÒRÉ'üüüþøãŽŽŽ©S§®ZµêÏ?ÿ”O§†‡:úB5Чê¥ò¤¤¤/^hjjb¶råÊÖÖÖ¾¦ZRÃßܵÇÊÊêË/¿,--]°`ÁÚµkÝÜÜdÙ›|¡¬(—ïðx¼´´´3gÎ4½ÄÇǧ¯÷¥†¿ ¸kNQQÑ­[·Z[[ñ•b‚|¡¬à;~5´+Ç{¬._¾,‚ƒƒ^šžžÎãñz–þÖÏ®=.—{öìÙY³f­^½ÚÝݽ°°ðË/¿”cÿ††”÷بOŸ6ØØÈéå$a¦gF!SjZjˆ2(’’’-Z¤£óêéù   uëÖ]¹reÑ¢E= oݺµ½½}É’%]]]>>>‡|öÙg\.wùòå ...—.]Â3ÂÉÈÈÈÌÌüúë¯ÝÝÝåÓ£‘ ÅwúYfWbc W¬pÐ×Wñ§{ªªª Ñ*d†ac Æ*‹ïÄÇÇ÷È111áóÿ¾_†•Š111âGq(Jttttt´Ôú—,Y²dÉ’ÑT,K¤øNXX˜üuÈIgìØ6løog碵ȜÞOx¨æ†æŠæ;—/_îý0`ÇŽ{÷î•¿Å侪/ ýé§ìÿü'ÍËëÝŒŒOˆÖ‚ã ÇÕ4+–ïøùùA%|jLΨãºrJÊ]ÀýûÏ««›‰Ö‚ã ÆÕ¶Ö­1dÔÎw**8<ɤóç{nßP.¬M¬Ÿ6<%ZbȨï\¸ð…B…¢sçXDËAŒˆñfã++"¥y. £v¾“”ô§@ @KJꊊÐ(]‰±5µˆÏ_<'Zbh¨—ïVWV6ŠWý(ò… ª1"Æ›T4ÈæÝròA$%nPåQ¯¸ÁóçïijjðxËù|ar2ëÓOýúÙê¡ÈŒÑ£§¥WÎ)Ÿ7a^ÿ%«ªª00ÍVŒ…Ÿ‰2: >^L|B˜œÌ››Ý”Ÿÿüõ×­ˆR…!¶¦¶ƒïäææ*Z`šµ)¸µ|ó?ðuFÏBåeñbjä;yyOëë[{dR(ä´´{Èw”S›rNyÿeúzü’H¸ àŠh¯8øýɃÿ{Ÿh5òFÖwÒÒîijöôY>_˜’’'Š‘„9“Ì'Ö­bˆÚÁï @çsÐ4&Z ¨‹ï¢ÔÔ»=&Y8/^täæð¡°8Ó‹j‹”éVº°dù–G׌|G…¹y³¤¥¥[ê! …Œ•g g®€[V_F´ÁàFhüˆ^nÏŠ|G…IOÏhhñ2™,N ¢ÿýï>Ÿ/e %„â3aÜFzTýˆh!ƒ‚Ü÷Aõ•W¦ÔÔwÔe]ÙÓÓQrñø³ÏÎ-_î1eŠ¥8§½½ÛØX—iˆ¡£©ckjû¨úÑ¿ÞøÑZâ~¨ø€þ‡Ó¢õQZ•QßY¼øuÉŸ}vnÎÇÀ@W¢ô F %ï<ùî=^¬Œ‘†^'¨2ê2ÏB¨0ÎtgE÷òÓàÞÐ{ }"Ôò„ÒãLw.®+VÜiUg‚;kzŽtp(†rW£ ßA(=Îtgž€WZ_J´i¼¸r‚ì#@L-wò„ à8ΑL"+hô`S>Ф&m-UËDî‚ä;¥G›¢íbáòg…B¾!Óî}°¤ ,ÈŒÅ#’ä«H@ËŒ0a„‚|¡ ¸Ù¸Ý)¿C´Š¾1› æ0s0z µ¦ `$õ ÞÈwªÁtÛéw+ï E ü  â43,©¯t ï JŒ›[;·]A—xpªÒAgpü7Ð46ÅÀë"3›hYÄ€|¡ ¸X¸èié)ôT«ø00÷zvÄHÀ"˜ûª‰0ï T2‰ü†õ º´ h~ê®§õDëPï T7[·?Ÿ*ªï¹Ñ:ä;aºÍôvA·ƒh!½à6‚гÀ1´÷ß ßA¨n¶nB‘ðÞ³{D éEO¶+ˆÖ¡@ ßA¨6&6fúf¬§Š÷.F£×€Ïmµ}K*ÈwªÃlûÙ׋®­10Èwªƒ—“×Å(tô €|¡Jx9zµtµôlÅ"©oܸîéé)™‰»$‡Ã155 e2™x~bbbHH…BìØ±#11ñöíÛÕÕÕ«W¯>zôèÉ“'X,Vww÷ºuëú’–ššŠ§™Læ¬Y³lmmñR+ñ÷÷ÏÊÊdggëèè\¿~ðÇLœ8ÑÚÚ?‘L&ïÞ½›B¡DGGkh¼Ú²>77×ÞÞ~ß¾}õõõý]"¨–˜›o¼pá/¢U d‚H$2ßlþåÿ¾$¦y^3<§ ôÈîììüé§Ÿ\]]½½½“’’x<^¸ï@›››©TjUU•P(¤ÓéÙÙÙøÑÓ§Oã%óóó #>>Ïa³Ùd2¹££Cª¢––*•úäÉ¡§§ç©S§ÄÍMš4©w%¹¹¹cÆŒFDDlÙ²ÅÐÐP lذaóæÍƒ¹•••Û·og0+W®¼sçŽÔ2Èw*Ȫ“«¼þëELÛO¾ƒIºÛ$™wùòe33³õë×?~ü¸¯óľ! øî»ï²²²¬¬¬D"~4''?ÚÕ%ý}QQQ_•/Y²dß¾}l6[__¿­­MÜœ¶¶vïJ„B¡‰‰IAA““Ó“'O,--Y,Ö”)S®]»6øËÐÝÝ}æÌWW×éÓ§÷>ŠæYÄ×Ù÷féÍ–®Ú6q¯šF’y ÃÍÍíÊ•+MMMÖOµ’’’ÂÃÃñ¥@YYž())˜˜˜¤¥¥á_c‘HÔÔÔäèèØW…øT‹Édéé½z#;Nï] ‰DòññIHHhiiqrrš;wnZZZEEÅœ9sŠŠŠnݺÕÚÚ:þ|)‡o`ªï¨6œ6éÒù{ç‰òÊÊÊ6mÚdaañþûïß½{·ÇQ@qq1žniiÑÖÖ622ÊÏϵ··ÿóÏ? çÌ™°{÷n‹URR²fÍWW×~šîèèÐÕÕuppøí·ßÄr8œ¾*9sæŒAhh(„ðôéÓ†††ƒécwww\\ÜÌ™3§M›vúôéîîn©Åï T“i{§­‹[G´ )tttüøã^^^=ò===©T*~£ Bèìì,> Ø¿¿½½½Appp}}=ÇÛ¶mƒÁÐÓÓóõõ-++ë¿Ý°°0ñ¬ ¾ô¾*©««Ã0ìÈ‘#ÂgÏžbccÓ»ÔÔÔe˖ݾ}»ÿb$ðv#qÐéŸ?þN` +ÑB²bgÚγ¹g+b*ˆ2L‚‚‚ÜÜÜ>ÿüsü#†a,kÚ´iĪ-ÐúB5ñuñ}Úø´¨¶ˆh!C¦³³óÎ;W¯^]¾|ùN¼|ù2& qðŽâ í]ñ„òã>ÞÝPÛðò£ËN㜈Ö24233ß}÷Ý/¾øB,^øôŸŸŸ²L_Ðx¡šh4¼¼¯>ºJ´!ÜÖÖ¶mÛ6¢…Èä;•%pJàokëÎÓC‚ª4 â˾!ùBe ˜  ®Ê~ÈSûøc h!|ó ¥ùBe£?f†íŒ‹÷/ʼ¥'ß‚±ÞÀÝ,ÈwªÌ¢)‹.=¸$Û7L´ƒê àøo6¡r ßA¨2SÛo—ß–a%?]kÀ’a*ò„*3‰>ÉaŒƒ §Z‚P~ ØGŒ,«&Tä;gÑ”Eéù鲪ýéY ìöȪ~ùBÅY4eÑ“Ú'ÅuÅ2©½ô'`´LeR¹ê‚â•*Î,ûYF:F3Çö¹MÄð™“á9Êï T ™²pòÂÔ{©2©]×èÙʤf•ùBõ z³ôfus5ÑBƒ|¡úø:ûêQõÎÿužh!ˆ¿A¾ƒP}´4´Þry+å^ ÑBƒ|¡O þ£øú¶~_®‚ÈwjÁ[“ߢR¨ò/-ò„𠣩ãçì—rw4¦Zw@A4€¿ÑÈwêBðÔàߟüþ¢ãÅH+*<ª/ ž ä;uá­Éo‘0ÒÿüoDµt<UiÀ©¿wŸ#ùB]0Ô6\øÚ¸ܸÕRúÐ6–!£$JMA¾ƒP#–ÍXöû“ßk[j‡y¾°”þì#‰2ªºÔä;5báä…úTý¤¼¤až_™íÀaݨŠRGï Ô*…ºäõ%ñ¹ñÃ<¿è;` ´ÌFU”:‚|¡^,›±Œõ”5œm1ºj@W pøP¢Ôä;õbÞ„yF & ùLms°¤ ˜ºË@”ÚÑßûÑ¿ùæ›Û·e¹1-qܽ;nüøfcãn¢…È„ääd¢%(4›ÎmºxÿbñÞb È֢¦ô7Þ¹}ûvnn®Ü¤È“©SkUÒtªªª˜L&Ñ*enËJëKó*󈢾 séîîŽþy*çÎ #Z…¢3ÍfšÓ8§_ïü:Ýf:ÑZÔ´¾ƒPGÞv{;‘•(Û÷j!úùBYá¾¢®µî÷'¿-DMA¾ƒPGìÌì¦ÛLÿõίD QSï Ô”e3–¥þ•ÚÅï Ü5àá.yR'ï Ô”°iaÜŽK÷/õW¨»TĽñò¥.ŒÎ"­­­ÑÑÑIIIõõõcÆŒñññ‰ŽŽ¶°°`Æb±¦M›6¼š%#, &Ož¼wï^ooï~Ês8SÓQ~ÚŠ+x<Þ¹sçÄ9ׯ_÷óó«©©¡Ñh²hü³ïbFr1‰ Çmõ`¢ÖÄþxNx®¯úš¼7mœþw>/’Ù›Ž†M›6yxxȧ­QïˆD¢·ÞzëÎ;L&³ªªêÒ¥KT*uæÌ™\.w䕲²²ššššššòóó=<<‚ƒƒ;::F¥æÁ–‘‘ÑÕõjL~áÂ##£¸¸8}}}Y4Úô q^ýuY´%‰ Çmõ`w‚‘ШŸm<Í´b'¾Hõß}Îd2Ÿ?.¿ö`ß„„„„„„ôSçäÉ“ãÆkoo—Ìljjx04‹Å°’¾èqzKK  °°°ŸògØÍõ—Ë522JIIçØÚÚþòË/£ÞT “’’úÿ†AþÞª ))InÍÂx'>>>22RWWW2ÓÈȈL~õ_B DEEYZZššš.[¶¬±±ÏÇ0,11‘Á`èëëoß¾=!!N§lÞ¼Y|n{{{ssssssEEÅž={&Ožìè蘟Ÿ?þ|¦­­íââ"9Â‰ŠŠš:ujss3„0&&ÆÖÖ–F£-]ºT²éììl+++ þùæ<377×ÔÔ”ÏçcvöìY¼ØÙ³g555ƒ‚‚Ä¡À<`³Ùx††©­¸»»?~Àf³1 ;xð  ¡¡D"UVVöÌápFðK@ ”Š~|$yTj+Ó§O …=ÊÎÎ^³fÁ_ý•íïïåÊkkë$$$dee…††R(hëL„º0 ¾xìØ1|022º{÷n2 £¼¼Oã :>Œ¶@OOÏÓÓ³¼¼üÀOŸ>½råŠd™ää䨨ØÔÔÔììl¼¡´´4ÜeE"QSS“££#^Rlp¡¡¡L&3)))<<¼Ÿ½ÂÂÂ.^¼Èd2½½½i4šä!©­H$Ÿ„„„––''§¹s禥¥UTTÌ™3‡Á`¸¹¹]¹r%##¿c…@¨£à;;w© ÈËË«©©IMMݽ{w2ï¼óΞ={X,Vqqñúõ댌ú»)‰x]™ÍfoÛ¶ÍÕÕ•Á`ðù|777‡Ç¯Zµ ðâÅßïE¢R©666;v숌Œäóù«V­ŠŠŠÊËË+--ˆˆ˜;wnï&/^œ———˜˜¸lÙ2<çìÙ³’ €———––ÖÞ½{CBz¾N ¯Vüýý>ìéé ˜7oÞ‘#G¼½½555/]º”™™Éf³'Ož¼zõê{÷î ò‚(øÒ;Ñ*@0òkÒÙÙ‰aX[[Ûh©’+ýÌÁ?ÏöìÙ²eËŒuttðäúÇÛºu«……F ßê+RÓ’Rµµµß|óÍ’’azzº––ÖÌ™3322|}}ñuYðr¡‡ËåN˜0᫯¾âñxÛ¶mc0zzz¾¾¾ør5ìµhèìì,þˆ‹‹“LàDFF’ÉäúúzÉ’§¯Vêêê0 ;rä~•±±±=®^GGÇ?þèååÕ×åJ¾¾dÜ ¼ˆD¢¸¸8üÅð8vìØ[o½ð÷÷?zôèÈ%¥[WV /^¼oß>¢UŒb}§/‘‘ïŒnµJgŽŸ~ú©‹‹ËÆG¥69ûz> tvvÞ¹sçêÕ«Ë—/'Z‹2Áb±<<€Á`H L7ÅÍ #ìk@*++·oßÎ`0V®\yçÎÁœ‘ï F‚<}'11qìØ±VVVï¼ó8*þêR©Ôœœ¼þ0m_K'K–,Ù·o›ÍÖ××okkÓÖÖî1/**ÒÖÖ×&‰ds7nÜlîÑ£Gxü‹wùòe33³õë×?~ü¸¯îHŠ øî»ï²²²¬¬¬Ä×£G½)**ê«òÝ7'µ¿B¡ÐÄĤ  ÀÉÉéÉ“'–––,kÊ”)×®]ëï÷ñOº»»Ïœ9ãêê:}úôÁ”—³ï õÄ0ñó󫬬LNN677÷öö– e0âPÒÒÒÒ~* KMMe2™AAAzzzRàètº8”ÐÜÜ,7×Wt¢5Ôh)©ñ\eeex¢¤¤`bbÒW\Ø€Ýç5ìk@åbŠŠŠnݺÕÚÚ:þüÁŸ%?úñ$ÂÇ;b‘d2ÙÉÉéìÙ³ŠQ ä9Þ±±±Ù¸qcMM “ÉÔÐÐÀ£QŠ‹‹!„»wï¶¶¶¾qãFqq±èc}BØÑÑ¡««ëàà€?v·{÷n‹URR²fÍWWWáÞ½{ÇŸ““SSSsàÀ]]]ñonÏž=þù'¾¾€+ÿŒ?(++Û´i“……Åûï¿÷îÝÝ×!liiÑÖÖ622ÊÏϵ··ÿóÏ? çÌ™ Uj_ôè&”xPj%gΜ100ÀWyNŸ>mhh8àoBØÝÝ7sæÌiÓ¦>}zð·êšg‰/÷yöìÙÑ£Gµ´´ÎŸ?O ÅGž¾síÚ5*•jgg—!ôôô¤R©\.÷“O>Áïg9sH<=×;**,,L<‘ÅãñvîÜiee¥££ãææ†?Ä'ÙÜ`¢ÃÄô-%® ÿØ;žkÿþýöööÁÁÁõõõ}Elõ…d7áh„}I%55uÙ²e·oßLaIï¼¢ÇßÍ_|1eÊõH(R܇bÆ *#=⹤Z˜*!gßQ¦õ°°°û÷ïã·NzÇkHòÿ Ò§ûß÷ö½eÏÅ‹ F;räøg܇X§ÒÄP ¤1ìx®Ë—/cÒï ^Ñ'þüóŸLkk+àáÇRã5ŒòLƒ~÷ýégË__ߺºº”” |ò zw†C1rÐxgä¨R<×àhž%¦/ß‘¯1`”ü§ïô³ïO?[öà LxIqU½çYË¡9ÈwÃCξ£Ló,|ßi ©»ù<}úÔÉÉ ÏÄ0ÌÈȨŸ-@¿ûþô³eþ’Œ¾vceeõå—_–––.X°`íÚµnnnÃì3¡Š(“ï$%%½Î e¦ÚIDATþúëÆÆÆRã5ú‰òÀí\ìÒÏ–=ý{Y=† E÷|óçÏŸÇÆÆ~õÕWøÎ>Rwóyï½÷víÚuãÆÚÚÚƒ2 <®ÔÈÈèÂ… ­­­ûöíd£ƒÙ²G’¡h\.÷ìÙ³³fÍZ½zµ»»{aaá—_~9¬Þ#ªÉè¼·Ovàßy‰äààðóÏ?/Z´°uëÖööö%K–tuuùøø>|ðÙgŸq¹ÜåË—744¸¸¸\ºt Ÿ=}ÿý÷Ÿ~úé¶mÛ¾ûî;ü1ßÙ¾}{WW×’%Kš››gÍš•’’ÒOaOOÏ×^{Íf‹w ÌÈÈÈÌÌüúë¯ÝÝÝGØ}B%Á`¯w6ˆYºt) 99YŽz#âܹsaaaýüNƒÊÿÞ«óÚ0 3Ÿª7pQµ𤤤ÐÐPù4Gü< E=( L&Sê/EÙ!aäEôˆ‹OœÜ­‰Ö¢XÈùŒøy–ŸŸßÿ?#F—M›6áCCÔAîJ'x¦M¢ñOÄÇ-Gá˜9s¦ÜÚ"ÞwІ‡‡‡‡‡Ñ*F™š»m×>«µ 1 NòµðA´"µùBÅ àC삤z à,fè-JÝA¾ƒPe:êù¿o+¯}Øàßa\­(ò„ÊòüfkÖŽ ~—ˆ^faÀÄQ›¢C&RùB%é=·Â!i`–3 †À!þ>ºÒQPÐóíï…¢“Ãÿ_DqÁ¹z¤éD|h> -îÏã<ŽC>R”=½iTª}[[.—û”h-ˆžÔÜkÿmk9·Uðjn%Iûš®ÜE!zÒŸï¨jÇéêþç?w)” KKÝ·Þ²š8q°/zGÈ(‚Ei ]/@ÚÿJ 3g *ãOÏI úbÏžôãdzH$L(¯½ÆØ¶í-oï D‹BüMÕíÖëÿyÚÝ,„Âüm“4°7>0}Í8¢„!Ä ßNÛ´i»ø|€L&‰DÐÞ~Ì–-~SдTൠs±‹Ò0ìá?;¡y–"€ÆœÃÁÌL?8x:…B…"aEgݺ_¼½¿ºx1Y9áhê‘éÓôÈZ$-C2éåZ‚•dæ¬C¨.Äß ß&‘‘ó‚WK—BPQÁY»öŒ·÷‘ûKGïfÌóIKMC’'ZÎ4÷º.‰ŒF£ òabg7ÆËËQCãhX^^¿ví/ßݸQL”<µ‚ìÝ•ºc(Ó#-´iŸCvs÷Øhê’-f ÈE­ï Ÿ[·JCBŽöS`ÆŒñ¿þºV[[Sn’€¢ 9{Ÿžr3ùÕRNg_$€zãÐïB!@ãá3s¦½««™,å’ɤùó'%%}ˆLGδ×òr¿®š¼|Œ¤étL)Ètä;#bÆùBaÏ#™LZ°ÀùäÉ÷55Ñc(ò‚?¢+uÇQ¦}D'Z ¢?ïŒ__É{çd2iölÇ~x¿Û…'ÝÍ‚ŽzþìíVdM´~¬Ð ߆EFÎÛ‰„-\øÚ;eŸž‚ÎäÕX#äܤq¯£m.ä;#%8xš¾¾6€LÆBB¦=ºòôéÕL&kÓ¦Dd=òCÑÊy×®]DkPn44È<žàÖ­Ò+<#“IÖÖ¦'ÒÿûßÌÆÆŽyó&-P8ïŒ&˜“ɤ]»‚H¤¿g\ööcœœÆíÛw±¥¥ =º…@ôÅïÈädÖ'Ÿ$lÚä»i“/ÑZÝè•!K—N E›7'ijjüûßo-PïÈ–ððÜ;Ïkh×­ó&ZŽªÑZÅÍÚñôͯlQL r|Gæ¬^í)ˆ¢£Óuu5W®”ß«ÑT(‚YQOÝ"m…h-ˆ¡|G¬]ëÝÒÒµ};SGG38xÑrT„‡¿Ö7<î :ã„¢•ä;râ³Ïüù|áÆ äÅ‹_'ZŽÒÓTÞw´Úõ½q&NhKåùŽüøüó…Ý6Äëèh.XàL´%ŠàÑ•ÆvÚ¯€6-UJPt§üÀ0lß¾à°0·5k~þý÷ÇDËQbÆ×7<éôú5ÚÇKIA¾#W0 ‹‰Yºh‘뜾u«”h9J‰ [ôàLë»ãhÚDkA 7HB¡(2òìµk~ýu­›Ûx¢å(mÕ<Ý1’ì(+ÈwˆÏ®Yóó;eIIM™bI´B® ß! >_øÞ{'óóŸ1™‘&˜-Èwˆ¤«‹·bÅ%%u))ÿvpK´BN ue"ÑÖÖ<}z¥%-<üxee#Ñr}²bÅŠÐÐPÉœëׯS©Ô¦¦& Ȧ¤ ß!}}jB‡ffú!!G«ªšˆ–ƒNXXXFFFWW—8çÂ… >>>FFFqqqúúújSFïõ×_×êéi……ÅÖÕµ-Gá€"xÿt¯CH ___ …’™™)ιpáBHH†a+V¬ÐÒÒ"P›2‚|G! Ñt““#Éd,$ä(‡ÓF´Åâa|}Þñêöžd&†a‰‰‰ C__ûöí t:ÝÀÀ`óæÍ}Õ…§ëëë)JyyyLLŒ­­-F[ºticc#@$ÅÄÄØÙÙéê꺻»ß¼y ©©Äd2ñÓÎåò‰ÖB"¡(åíÂó+ "©À°Æ;ººº¿ýö„p÷îÝ...,«¤¤dÍš5®®®½{÷Ž?>''§¦¦æÀºººmmmøé`ìØ±4í‡~TÂáp¤V!{ö ‹ºvíš‹‹ •Jµ³³KHHÚÕQrÐs ‹UñöÛÇß|sÒ±c+Éd4)F¨èOY¡™>ÝöçŸW_½Z°eK’H„þC ŠË—/cÒï w”€¬¬'ï½wrùr}ûþE´b@ã%`îÜ ÇŽ­Œ‹»ùŸÿ¤­ÐûÑ•‡±––&û÷_‚ΜiO´bD ÷I( !!Ó„BѦM‰ššë×Ï'ZÎèÓð¸Ót‚@›—ªh¼£L¸¸XëDG§ëèhMŸnK´œÑ¤áqç…wŠhÚF¶£%ˆPXÐxGÉxÿý9h÷î ººZ«V©È[\Ñï;žZ¸ëÛÌ5"Z B ßQ>""¼Z[»>ÿœ©««"o=¾{¼¦»‰¿ð¸ÑBrùŽR²e‹'P·׿·?<[7g‡µî ÑZrù޲òùçpÆxmmŠ Ñr†‰€+ú#úÃÃÀ)È„h-ùâw”˜;ÃÃg|ðÁéß~+$ZË0¹[ÓÝÄ÷ÜiM´„\A¾£Ä`¶H`àëÊûÖc(‚në-tÌÐ K½@ÏI(=â·Çǯ1½õ¡ ßQÐ[Êò½õ¡D ßQººx+WþT\\‹ÞzŒPp屮eË~xö¬ñüùõÖÖèÎ4BAA÷³T Í3g>3Æ $äèóç/ˆ–#!ýŸC ßQ9ð·ëëSÃÂbëêZˆ–óø¢”ðÂòÿC¯Wwï¨ 4šî¹sQ(äc õÖãܯ«º›„ã^×#Z‚`ï¨&¦¦z‰‰ëaxøñææN¢åÀó›­OÒf~ÆÐ1EQ‚êò•ÅÜ܈ɌlkëZ±âǶ¶nbÅp[…9{+mçÙûÓ.Puï¨2ÆII²ÙMË—ÿØÑÁ%PÉïªD0{»ŠòÇÖ֌Ɍ¬üÿöî>ªôø3LBSl^~ÚŠ-*l2µ›—îìz)yi×Ûh#±–„í8¬°8¢µki7ËbZ["/‡pìvv¶¡Å*uvQYNRs´ØŒµ53äeÌï»Ý&Y2 ñýüuçÎsŸçÞ‡ûûÜ—ïes|}gí­Ç]õÚËû-é)ªBþ€Ä…`íZÍ‚‚C7oÞß¿?gddBÏíªþ×1ÕU;Tdß4˜›à¾Á…â·ßØžž––o|ûí~2Y¦¿7Âq4öx|‘2üÈAÜY@®_¿K§‹aë32¼á­Ç`AÜyFQQÑl¯ÂËuëÖÀéÓí»w¯Â0xvôårwwŸíU˜» î<ƒDšÿooZ¼Xwdä/¡pd¶Wdžƒ=K¸¾0ѧŸ~ºcÇŽÙ^ ð «©©‰‹‹›íµ˜Ó`5ˆ;Yƒ¸5ˆ;Yƒ¸5ˆ;Yƒ¸ó"322ÜÝÝmllÜÝÝ“““9þ†aííí/\3&ÂÁÁ!((¨©©Irù‡¥ŸTðøñã®755ÙÚÚr¹\©·Èf³#""ìííß{ï½”””ÁÁÙÉ$^Rg‚çAÜ™6¡PþÇÄÅÅ'%%)((ŽŽŽJ¥þÔÔÔÊÊÊÊÊÊœœœ 6ÄÄÄ<~,ëì9†]¹rexøiêŒúúzsss …©¬¬,­†¸\nHHˆ¾¾~^^ÞgŸ}ÖÑÑqòäIiU>-rrrÒÝ4 Äi»xñbwwwrr²¡¡¡ªªêÚµkCBB †¼¼¼TêWRR¢P( E[[ÛÛÛ›Ëåþõ×_R©yê¨T*™Lnll$æÔ××[[[“H$›E‹¤–0°¨¨hõêÕþþþêêêaaa,kVyD7 |^6ˆ;ÓÆd2]\\EgR(9¹§) †»»»³³sBB£Gðù†±X,77·]»vegg_ºtÉÕÕÕÁÁá›o¾!–âñx<¯§§çÌ™3kÖ¬ÑÕÕíèè8zô¨“““¯¯oMMÍ„µb0äñxB¡0??ŸN§;99ÅÆÆŠ6ÝÜÜìááaXqq1>³µµÕÙÙyll Ã0&“‰c2™d2ÙÂÂâòåËx±ÎÎξ¾¾·ß~=Ù'ŶPQQâp8†"„>|H£Ñ& õõõ666ÄÇ5kÖ”••)**¾pbV[[K§ÓwïÞ÷èѣɪjkk ´··÷ôô¬ªª"6 Ã0„‹‹Ëd› fâδutt¬]»Vr™ÂÂB‹—žžþ÷ßþùçÄW?ÿü3ƒÁˆˆˆÈÏÏg2™§OŸ/..îééÁ „††::::::zyy>|XNN.>>^GG'++ëüùónnn‰‰‰ccO3éœ9s¦¡¡!%%…B¡\¸pá‡~ˆŽŽÎÌÌùòË/‰bÙÙÙQQQ¡¡¡D@a±XÖÖÖd2922rãÆ!bð††|ðXWWgffF¡<ÍÇ.¶•­[·þþûï¡æææÅ‹ãg¦ZZZôôôþ÷?ñïìîîÖÒÒƒGð™t`NNNLLLzz:‡ÃINNž¬ªøøx“üüüÀÀÀ”””ßrQ]]o ŠŠŠ„Î3qgÚUTž¦°"Nóx`ÁÿÕÔ^ä­Á!¤¤¤dddtèÐ!¡PhkkK”‰û÷ïwpp011QSS ؾ};BH(òù|b|DìŸ;v쨪ªb³Ù4MB꣯¯ojjŠL&kÅÜÜüÒ¥K|>_WW×ÔÔ´®®®§§ÇØØx²&¶mÛvñâÅ;wâïÝ»wàÀŠŠŠ™t`ww7Lïß¿RQQ[•J-,,¼sçNmmmHHHAAÁóUIèL0p¼3mÞÞÞýýýŸ|òI{{{mmí÷ß?¡ŒÝÙ³gÛÚÚîß¿òäÉ·Þzkêÿ¯Äye‡“••¥¯¯¯¡¡!ð‘›ÍNLLDq¹ÿ¾OAAAKKkß¾}iiicccvvv £½½ýÏ?ÿLII }¾ ‹ööv‹…²BL&ß'‰ „‰‰É¢E‹Îž=;a…o ØV¨Tjii)h6oÞ\VVfjjJ&OúóF§Ó;;;333ñ£ªÔÔT …2“Äd³Ùø‚ï¿ÿ¾Øªüýý³²²455×­[' D+Á»w* ^ïL›ªªê©S§²²²ÂÂÂFFF6oÞëåå%Z†N§ EGG›››9rdêõÿÜ‹/Þ°aCll,‰Dúøã¿þú뜜œ7Þxcß¾}|>ÿرc¢ñÎÃÃã§Ÿ~*))ñòòŽŽŽæñx7nŒ¾ eee33³îînâybbbdd¤¶¶61’““³¶¶®¨¨˜0ÈBMÖ •J211A½ùæ›|>_ ïÌ´´´ŒŒ oooeeåmÛ¶}ôÑG3ìÀ]»v%$$ lÙ²%44”B¡ˆ­*,,ìÔ©Sêêê‘‘‘Ë–-#j066öóó›bg‚ùŸA"‘HÞ¯¨¨(CCý{÷ÎöŠH†a™™™ëÖ­›ÅuÀó~Áž%ï,8ÃÃÃׯ_ ’M‹áááÏÏÿàƒüüüd³`N¸³à\½zõĉÞÞÞ“ÝS#uT*¿)FdÖ˜ ˆ; Ž•••••Õl¯XÐàz@Ö îd ÆYóþ(ã“]Ö! ËÉÉ­\¹ÒÛÛ›¸‹Ù€¸3TVVâŽŽŽ©©©úúú! ©dð2ƒƒƒ ÉÉÉŠŠŠÏß¡ÀËã¬ù€òIß#ö#^FSSÓÙÙ™N§çææÊn]§2àÌow^=ÿüók£ÑhwîÜár¹bóÔà h¼¼¼ìíínÞ¼‰/%ˆiÉÉq$$úõ×_ÝÜÜœœœÊÊÊГ‘ ž‡XO‡?­æˆ;¯’7nÄÇÇK±N „‡Ã›§¦´´´¼¼<""âܹs[¶l9vì˜ä_Br ¹l.\¸–žž>::*š‡(ÓÚÚºwïÞ¼¼<é†]0+ ‡‡«ªª>üðÃÓ§O[YY1Œ—ÑŠØ”7•••>>>ÆÆÆjjj¾¾¾çΓ0|C“ãHÈeãä䤪ªjaa!&KrJ¥R¿úê«Ç\½zuRR>z ÊÌÌÌÊÊ Âß!ñŸ¦•ˆȀCß]¹råêÕ«FFF3Ùv0@þg,œü;àåü;ÿ Žwæ'Hyæ2ˆ;ó“,SÞ0]pÿ@Ö îd â@Ö îd â@ÖàþgH$###üm^L___kk+ìYÀuôg¸ººÎö*€Wž††ÜT-ïd Îïd â@Ö îd â@Ö îdíÿͦW ÅÕ^SIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Header__inherit__graph.png0000644000175000017500000001610512234777146033262 0ustar00murraycmurrayc00000000000000‰PNG  IHDRµy—¢bKGDÿÿÿ ½§“úIDATxœíÝ}PSWÞðs 4€AÃÛZB‚/ˆ¢ÒN§î: VV*Uó } HauœÇÚu°ÛêhÑõ]§nuv|©«°T ‚«µZV0ÑâJµ¡TÂK 1@ $¹ÏÇ^c€cÀ 7”ßgüãääxîïÞ|sïÍMB(š¦ýpàº`× €òH €òˆhäääp]&`™L&³å¡w´}FHɯÆl9€|ÄÄÄ ª`wòòòl ç€òH €òH €„å|´··oذA"‘ðù|‰D²jÕª††|EQJ¥’ÅeQ}aq¯8EQ---š“õMôêðúö¥Ìfó¢E‹(Š’Ëå“'Onll`'N …2™ìÑ£GL?MÓ{÷î4i’‡‡Gtt4³,W™¿¿Á/Ýbì°ýý——sww/**êï^üìÙ³Çßß¿¼¼\¥RÍŸ??**йW*•¶´´Èår„ÐÂ… ™vmm-MÓ™™™jµÚ²a5³åÍk×®ùùù­Y³¦®®®¹¹955•Ïç < ""â§Ÿ~ÊÏÏwtt|úô)MÓ“'ONJJjjjÊÏÏwpphnnÆÓN›6­¿I´Z-MÓ„³fͺ}ûö;w~ÿûß/\¸)õàÁƒS¦L¹~ýzMMT*eÞ ±\f~Â`ò#Éd6¾ÿÂf>ËÊÊžOý ½^Oÿ²òx@UUB¨­­ ß[RRBÓ´Éd²j[>ö}¯C¯|äååÑ4ÝÚÚj4q§J¥b¶8BèôéÓÌü¸ÓÃÃãÀx°^¯7xZÂ$¸A€×‚¦é[·n!„?~Œçœ1cFvv6¾«¡¡ÇãuttÐýäƒ0xÐ[Ìö|°y|‰DÕÕÕ–±`^¼0êëëýýýq74 ¾)BVíAðóóCµ¶¶¦¤¤„††ŠD¢Õ«W[ðõõµšÿÈ‘#{÷î0aŠ+îÞ½Ë “¼tÀ”)Sp#00!ÔÔÔ„oÖÕÕÅÇÇã\¾¾¾&“‰Ù½³¸ÅúÃæt‘‘‘GŽÁF …›7oZ‹Åjµ·qC$±X†7Shh¨Z­Þ·oßýû÷/\¸`9à-½÷Þ{<ÈËËóññ™7o“lÂ$/PSSƒ*•Š¢(‰D‚oŠD¢ÂÂBü5›Íz½~êÔ©ý­Ë€³ŽÍ|lÞ¼¹©©I*•*•ʦ¦¦‚‚‚mÛ¶YY¾|ùŽ; Euuubb¢T*µñuGVVV]]eã¥zzzfÏžpïÞ½„„ô˾Oo½õVrr²ŸŸßoû[š¦_: ~Mœœ|çΪªª>ú(::šyí’’¢T*kjjV¯^ÖgIx~[B6žÐ4ýðáø¸8wwwWWW©TŠ÷–çÝÝÝIII¾¾¾±±±øK÷:ôön#„233- Ôëüß,**š8q"ŸÏ 9wî\DDD```ïùq —.] rvvö÷÷?yò$3¬¿IBCCu:a)ÙÙÙ¾¾¾îîîñññV!99Y, ‚ˆˆætÒ²0f~[÷×îíçmÃ÷_rss—-[fËH0"DGG#Û>ï¿È |È |È |¼ ©©•ëìË>™aùÎõ¯Ujªêƒ&ãÄu!CK£ÑˆÅb›†Úrm”|sÎÁÁÙÇg«ëL® l^?%ÒÓË6m’Ïž=¹°0‘ëZìœB¨¨è;'§ç_Âèé1åæÞà°ûù@4Mçæ*zzL–è¾ÿÞúÃÕ£äݾ]ßР·êtrr<}^Å@>*,¼eypÁzzŒyy ¸x8Úóa2™óó•VL«ýY©¼?ìÙ—ÑžòrµN×Ñç]NN<¸P6Úóqöl%BÔk¯9âNN<¦m2ÑEEßá‹"£Öüå…$(È÷³Ï37wí:ûþûoϘñü+}­­žž.J³ ðþí D¢OŽ]ù×…Ø‹Ñ~|d@ù$@ù$@ù$@ù$@ù$@ù$@ù$@ù$@ù$@ù$@ù$@ù$@ù$@ù$@ù$@ù$@2$_êúõëû÷ïg}ÚaÐÐàæáñÔÅ¥‡ëB,88øÓO?e}Ú!ÙÔ××Ëåò¡˜y¨ùúþ<ÃQ^^~ýúõ¡˜yÿ~a^^ÞÐM,EGGÑÌpþH €òH €òH8ÎG{{û† $ ŸÏ—H$«V­jhxö«ME)•J—Åú„v¸DÖq™³Ù¼hÑ¢ŠŠ ¹\®ÑhΞ=ëììb08¬ Xâò÷ÒÓÓkkkkjjÆŒƒòöö>|øð®]»Gð¯JP¥Õj½¼¼lì·s\î?²³³×®]‹ÃÁ …<Þó_û2)))‰ÄËË+..N§Óá~Š¢N:%‹ÝÜÜ6nÜxòäI‘H4vìØõë×3²²²,½UVV†‡‡{xx¸¸¸åææ"„/^̼9P^^îååÕÕÕÕ_ ---–mŠ¢BÞÞÞL?s/ÓOÓôÞ½{'Mšäáámûqƒ999¶Ììîî^TTÔß½!…B±gÏÿòòr•J5þü¨¨(æ^©TÚÒÒ‚/ä/\¸i×ÖÖÒ4™™©V«-xBËEL›6mÍš5uuuÍÍÍ©©©|>ß`0¤§§ãüñ‡~H¨A«ÕZµ­:™%2ýœ2eÊõë×kjj¤R©L&³qd23»¸Ì‡££cYYÙóR~¡×ëé_6n@@@FFPUU…jkkÃ÷–””Ð4m2™¬ÚV!°œßê®ÖÖV£ÑˆÛ*• ?„­­­ÎÎÎÆd2‰D¢ÒÒRB ƒÈÇŒ3²³³qgCCÇëèèÜ1†.\_D"Quu5sS¯×3/^õõõþþþ¸ß!«¶íZ[[SRRBCCE"ÑêÕ«qç¸qãÂÃÃóóó¯^½êèè8wî\B ƒPWWOQEQ¾¾¾&“‰Å5b—‹ŒŒ>žëZ¸ù°vþüùððð-[¶L˜0ëZ¸7‚¯d‘¥K—.]º”ë*ìì? ä@> äã==&®K°/|ñÅ×KCøúèaDq?þÿ¶ný³ÁðëJL&“ Å´CrýT£Ñüç?ÿa}Ú¡vï^ë?ÿyoöl︸)\×2`‰$88˜õi‡$#TbbVAÁMþÝ»;_{ ® !猎CqñmšF]]Ýß|ó=×åØ ÈÇ3—.Ý5M!‡‚롌Zgòó•ø„Úd2}ûíÝöö§\Wd !¤×w\¹òƒÉdÆ7M&ó×_ßá¶$;ù@¡óçï˜ÍÏoR•Ÿ?²¿÷ÆÈBÉåJ„ž¿Ž3™Ìee?jµ?sX’€| ææ¶Š µÙüÂë|Š¢Îž½ÍUIöòŠ‹+¬/õÒ4-—+8©Ç®@>P^žÂlyöBÈl6WVÖ××?æ¤$û1ÚóQW§­ªjèë2åèèPTôÝð—dWF{>Ξ½Pßï#öô˜äòÑþ*f´¿ËPSó(0ðuæfm­vüø±ßttä=zôóo~ãÆQu܃÷ç^ }rôèòÈÈ·¸.Ä^Œöã ƒ|È |È |È |È |È |È |È |È |È |È |È |È |È |È |È |È |ÖþþXnn.[SqH"ܾ}ãéÓj® yU!!!b±˜…‰h–°P `ONN++›¿0'''&&†Å Áà°øËpþH €òH €òH €d¸óÑÞÞ¾aÉDÂçó%ɪU«ð]E)•lþ^ëÚ‚°‚#ѰæÃl6/Z´¨¢¢B.—k4š³gÏ:;;‡„„ †á,cèü W•«l4M#®Ù¥¥¥½þúëOž<±ìÔëõF£Ï P(تg(&ìo)Z­·É+8lly,l4¬ûìììµk׎3ƲS(òx<æ¦ÑhLII‘H$^^^qqq:÷SuêÔ)±Xìææ¶qãÆ“'OŠD¢±cÇ®_¿ž••eÙè­²²2<<ÜÃÃÃÅÅ%((¿g´xñâýû÷ãååå^^^]]]ýÕÐÒÒbÙÆW*½½½q?y)Š*--õóó;vì˜óãFAAÁ¤I“„BaLL 3x˜°’2ڶ̺»»fP({öìñ÷÷///W©TóçÏŠŠbî•J¥---r¹!´páB¦][[KÓtff¦Z­¶l ^ûiÓ¦­Y³¦®®®¹¹955•Ïç †ôôôàà`<àã?þðà 50» ¦mÙùÒ ¹víÚ–-[4```yyùÝ»wçÌ™³dÉòF¦YÝ k>ËÊÊ,ÿ ¦×ëé_΀€€ŒŒ < ªª !ÔÖÖ†ï-))¡iÚd2Yµû;ˆô¾«µµ•ÙÕ«T*ü´¶¶:;;k4“É$‰JKK 5óñÒÌËË£iz ó§§§ãÎÊÊJf0‹ùÖã‹H$ª®~þÖ¹^¯ï}n___ïïïÛ¸¡ÑhðM@€rpp°jÛ®µµ5%%%44T$­^½wŽ7.<<1ƒ§M›f{1¬Ö|DFF9r?éBB¡ðæÍ›VcÄb±Z­Æm܉DlªV«÷íÛwÿþý .0ý111r¹<'''66–¢(B øÙÙß#ôÒÄèüµµµ¸ñã?"V7È˱²¢mÛ§ýôÓOb±ø½÷ÞS(ùùù³fÍB/_vìØpãÆ |l–J¥ÌüÌÁ¢ÏvŸç%%%ú_FŸ¿ÿýï:®²²A¥RÑ4ÝÖÖæââ" +++išî¯¡Pxüøñ¶¶¶5kÖ ‹ýuuµí+8ˆù§L™rãÆ»wïÎ;—üŠ…†54M?|ø0..ÎÝÝÝÕÕU*•âgåæëîîNJJòõõõððˆµ<“óÊÌÌ´jXR(EEE'Näóù!!!ç΋ˆˆ ÄóDFFΜ9·û«á«¯¾?~¼§§'~}„ûCCCu:+8ÐùB{öì™2eÊØ±c—.]úèÑ#¶ [ w>ìÖ’%KvíÚÅu}@¿ŠÃâcï¿ ÎÎÎŠŠŠo¾ù&>>žëZìÎhÿ}d„ÐùóçW¬X±eË– &p]KhN?Û ù@K—.]ºt)×UØ)8¾È |ÈÇ JJ~àºûÂæùéòòòXœpøÝº5>0ð±«k×…Ø Öò!“ÉØšŠ+N]]N:ËHχL&“H$¬LEqûòÚ®ìÞ}öСo}}ÝoÜØÌâWG48ÿx†¦é‚‚›¡†ý;Ã÷ºƒ|}‹Ãzìä!„NŸ¾éäô|Sôô˜ŠŠ*»»–d' èéÓž³go÷ô˜,;;;Ÿ––ª¸*É~@>ÐåË÷ºº¬/ˆñxð*!ÈB¨ àfïïI¦¯¿¾ÓÑ1b¿7Ë’Ñžöö§/~Ï|#Á’Ñhºxñûá/É®Œö|\ºô}OO¿—:àUÌhÏGaá-„ú~Êl¦¯\Qµ·wõyï(1ÚߟÓhô–—JƒƒwîØñ¿áá3˜ž×_ÇçÞOéŽÞ5ÇÄbw«oo· <9)Æöã ƒ|È |È |È |È |È |È |È |È |È |È |È |È |È |È |È |È |"ËÓÎÉÉẎñxã(ʉë*¸$“É,#ÑÇßûÛßþ6üe{ÐûçûÈǼyó†£`®\¹bÕç€òH €òH €dùèììüòË/cbbÞ}÷ݘ˜˜Ï?ÿ¼¥¥ß¦R±ùËK¬OhK콈W\hXXX[[Û+×em0¦é¤¤$Š¢¶mÛæãã£Ó銋‹×®]›••åä4ª/.ýú fÿñõ×_766~þùçÓ§O …þþþùË_ÒÒÒx<ëõ ›þžCô¼)“‹/FEE9;;[v Ë_é2™Liii111K–,Ù¹sg{{;î »|ùrttô¢E‹Ž?þí·ßÊd²Å‹9r„pñâEËFo555ëׯŒŒŒˆˆX¹r%¾ª“œœÌ\þ»{÷î’%K C509n‡……!„¢¢¢¬¢`ÙOÓô‰'>øàƒÈÈÈ­[·Ú¾Fýéêêzbwö¹”>×·§§çСCï¿ÿ~TTTAAá¿ã"oß¾½lÙ²óçÏ“«²2˜|ÔÔÔøûû“Çäää\¾|yÛ¶m‡~üøñ¾}û˜».]º”–––œœ|âĉ‹/þë_ÿJJJÊËËkjjBmÚ´)((ȲÑÛöíÛÅbñ±cÇN:½{÷n£ÑVZZŠ\¾|ùøC~~~5X)))AŽ7®¿þÂÂÂsçÎmÞ¼ùèÑ£ÝÝÝû÷ï·qúóÉ'ŸüÜÙçRú\ßÌÌÌk×®mß¾ýСCW¯^%üwìøñã)))óçÏ'”ÔÛ`Î?:;;-·#~’!„Š‹‹nŸ?~ùòåÓ§OG­[·nåÊ•®®®¡˜˜˜±cÇÎ;!Ë´ÛÛÛ}||Þ}÷]<ÓèíË/¿tqqÁ»«7ß|³§§§££ãwÞÙ¿KK‹§§ç•+W¶lÙ²oß¾þj„3gά\¹rÆŒ¡õë×ÇÄÄ >ŸÿÒ5êo£GN›6Íj3ö¹”>×÷Ò¥K+V¬xã7ðÚ­ZµŠ\dtt4< ƒÉ‡§§g}}ýÌ™3ñÍââbƒÁ “É,Ç@àݬ§'k?Ê´nݺ3f¬Y³& €¦é àþyóæýûßÿ~ðàÁüùó)Š"Ô€UM«ÕÚ¾POOÏ?ÿùÏsæÌÁÿ½££ƒÙY²¨Ï¥,[¶¬÷úz{{k4¼Khhhxi‘ƒ‹ì`Î?t:ÝÆU*•N§»víZFF†Õ˜ˆˆˆÌÌÌ~øA£Ñüãÿ¶qk^¼x?–L½x*g6›M&ÓôéÓÅbñƒvïÞúùçŸBï¼óŽJ¥º|ùrxx8¡@PVVÖÙÙ™••e¹h—Òçú¦¥¥=yòdË–-4MôÑGJ¥²¿ÿþ*^øýÊÜÜÜeË–á“ö*%%eúôéñññ\2"mݺÕÛÛÛòSB¿žß¯4 jµZ©T&&&r]Ë37nÜHJJêÝÿÇ?þ¿Ü°¿ž|TTTìÝ»7!!ap'êCaöìÙ#zgŒ~Mù 床_x@> ä@>Iç§½¿F ­VëíímÙÓG>¶mÛ6\õ»ƒßûe¼pý+pþH €òH €òHþ*. #’ÙÈIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1TranslatableItem__inherit__graph.png0000644000175000017500000024317212234777146033020 0ustar00murraycmurrayc00000000000000‰PNG  IHDR[# F„bKGDÿÿÿ ½§“ IDATxœìÝ{@Lùÿ?ð3ESr›ŠHî—\ÖB"2’U²¹&’K¡(–¥뺻È-Ä”nST6rKQ,*mé‚J¨Lw]¦9¿?Îî|û¥ËÈÔiêùøë=gÞó~?ÏY[óêœó> ’$ €vIŠî´AEí*"h¿dè┕•õèÑ#ºS@KÓÐИ0aÝ)$*"€6åÑ£Gæææt§€–fjj@w ‰„Š  ÂZ²íŠ™™Ý$î#€ö ´_¨ˆ ýBEí*"h¿P@û…Š ***Ú¼y³†††¬¬¬††ÆŠ+²³³©· F\\œçû€­aFÆWZx@,ð<"€öH 1 .—Û¯_¿÷ïߟ9sFWW7%%EVV–ît#22RGGGøRQQ‘Æ0Ð4¨ˆÚ#OOÏ´´´ÔÔTyyy‚ ºuëvâÄ 777 þnÀ`0rssUUUEÜþý˜Lf“?Þ|Á@t¸j =òöö¶³³£Ê!!&“)---|Éçó]]]544TUU-,,òóó©í Ã××W]]]QQqÛ¶m>>>,KIIÉÑÑQØÁËË«fãkÏŸ?700PQQéÔ©Ó°aÃüýý ‚˜3gΑ#G¨111ªªª_¾|©/C^^^Í6ƒÁ ¢[·nÂíÂw…ÛI’ܿ߾}UTTÌÌÌDߣú”””ü§ººº¾ƒVçFƒÝ»w¯wïÞçÏŸo8 4 mˆŸŸŸ(¿ß•••CBBê{— ˆØØØ}ûöiiiÅÄÄ$''ëë뛘˜ße³Ùyyy\.— ˆÙ³g Ûiii$Ir8œôôôš jÀšS 8ÐÖÖ6##ãDz²²žžž&L :lذaõêÕ dÈÍÍ­Õ®µQ8£pû±cÇú÷ïššÊf³MMMEÜ£úŽRMÔtunt/¦««ûàÁƒ²²²þkššš ?ß @›"bE$##%|)üZÏãñÈÿÊ mmí‹/R‚(,,¤ÞŒŒ$I’:+R³]«ì©9~­· ø|>ÕNNN¦jƒ‚‚99¹¬¬¬êêj‹uïÞ½24¡"2dˆ··7µ1;;[ZZº´´´i{TçN‘$YgàF÷¢`õBEð=pÕ@{Äb±RRR„/y<žp¡9¡ÌÌL---ªM5²²²¨— AHIIÕj‹®  ÀÕÕUOOÅbÙØØP»téb``xÿþ}™É“'7¡ 222,--©uáÔÔÔª««Å¸G”:7º ëÝ»wb€èP´GÆÆÆîîîÔi‚ ˜LæÓ§OkõQWWOOO§ÚTƒÅb‰+€žž^zzúÁƒß¼ysóæMáö… r¹\??¿E‹1Œ2$I|cÄb±®^½JýUX ðx¼ˆk(unôH6¬i…ˆÿ´G;vìÈÉÉa³Ùqqq999AAA»wï®ÕÇÚÚzÏž=±±±)))öööl6[ÄuÕ¼¼¼222j6ˆ¯!¨ªª7nœ¶¶vRRÒ’%K‚øüù3AóæÍ‹‹‹óõõµ°°h “É .**rss«95Ç«3µ}É’%®®®qqq©©©666Ó¦Mû–c&’:7p$[,Ô‹¶ëõ ˆxI’ïÞ½³°°PVVîܹ3›Í¦Î]Ô¼¨²²ÒÉÉIMMMEEeÑ¢EõÝ¢óu› ‡S«QSlllHHˆ¦¦¦¬¬¬®®nXX˜¡¡á Aƒ¨qŒ‡JµëËpéÒ¥=ztíÚ•ZËŽÚ®§§'''—ŸŸ_+˜p{ee¥³³³ººº‚‚‚¡¡¡pÕ„F÷¨Nu¾[gàúö⛂5÷|ùÕ)\þþþæææýûÝÄÄdܸqÛ·o§;ˆÄ033#" €î  WÍ@kQVVöøñãððpKKKº³üëÆŒº¸ººÒ ÄC‚ŸK mÌõë×—.]ºsçÎ>}úÐå_³fÍ’ènÐ(TDÐZ,X°`Á‚t§€öWÍ@û…ŠÚ/TDÐ~¡"€ö ++´AÔjDTRÒ±²RJE¥¼ùò@³Š‰‰?~<Ý)$*"€6ECCÃÔÔT”žåå2Ÿ>uÊË“ÿòE¦K—rTD’küøñ&L ;€¤b`‰}€v%7·8$äï+Wž={öVUUÁØxÔO?=ºµ<ÿ …¡"hø|Áõë/½¼¢£¢^3™çÏ3wîȱcûJI1èŽ@'TDm\AA™ŸßçQzzî˜1}¬¬tÙì‘òò²tçhP´YÏž½½t)*8øïŽe,ce¥;d‹îP­ *"€¶†Ï\¹òôÌ™{¯^½Ÿ4IÛÊj‚¡á°Ž±œ@P=ÌÌ̸\.Ý)€ ÂÏÏoáÂ…t§ñ¨¬äÆ:u7-í“¡á°µk§ƒ%‚?mÆ¿iÓ&ºS´wææætGñ(*úÂá<òð¸Ïã•-X0öüùåZZÝé PmÔÕÕqj‚v¨ˆÚ€¢¢/ǎݾpáœ\‡eË&-[6YEEžîP€¤ªªªöòŠþãð²²Ê5k¦­Z5UIIŽîP€äáó¾¾ /))_¿Þ`éÒIXM iPH˜RvíºššúÉÜ|ܦM3{õbÒ@‚¡"99»w‡„<Ÿ;Wçܹ嚚ªt'x¨ˆ$@Eÿøñ['NÜ<¸×õë#GjР¢;@#ŠŠŠ6oÞ¬¡¡!++«¡¡±bÅŠììlê-ƒ'Þé’’’ŒŒŒäåå{öì¹zõêââbá\yyy~œÏç‹ØSÈÊʪ֚{wïÞ•““N]Ksì5´r‰S§î¿pááo¿™…†nD9 F¨ˆ UFFF?ær¹YYY×®]“““ÓÕÕ­¨¨hŽéx<Þ”)SF•’’öüùs;;»oAZZšÃá(**Šþssó°°°/_¾·Ïœ9󛀶êÝ»|kkeËÎ }øp»™ÙRR ºC´)¨ˆ UóôôLKK»qãÆ?þØ­[·‘#Gž8qâÅ‹22ÍrÁçáLJîææ¦¦¦6zôè³gÏúúú‰>ƒÁ°²²’•ý†Ÿ ;tèpýúuá–àà`SSÓoÈ mQEÿðáS§þ–Ÿ_¶iÏžùLfgºC´A¨ˆ Uóöö¶³³“—ÿÿ5Èd2¥¥¥…/ù|¾«««†††ªªª……E~~>µÁ`øúúª««+**nÛ¶ÍÇLJÅb)))9:: ;xyyÕl[ZZ G1bħOŸ„³s¹Üž={víÚõ?þhxÞ¼¼<@°ÿ~---yyùñãÇGEEA’äþýûûöí«¢¢bffF}¤cÇŽ&&&\.—úøË—/³³³Ÿ?n`` ¢¢Ò©S§aÆùûû×:85/Ï£ÚuŽ’èÖ­WÓ¦ýæéõÛof!!FŒÀerÍ´jÿý÷È‘#îsèÐ!___.—ûèÑ£?®\¹Rø–··÷‹/<==÷ïßÏápâãã/\¸päÈ‘ôôt‚ 8Îĉk6ÒÒÒúöí[sðšÕWxxxRRÒÉ“'7oÞ\QQÑÀ¼A;vÌÝÝýÂ… ¯_¿ž1cƼyóø|þ‰'Î;çãã[^^nkkKu677¿víu)`ppðôéÓ™Læ¢E‹´µµŸ={öæÍ›M›6-Y²¤²²²áCQßø A Ê6n¼lmí1fŒæ­[[p™@³#è`jjjjjÚh7™¨¨(áKá¿[G½ŒÕÖÖ¾xñ"Õ!!! ˆÂÂBêÝÈÈH’$«««kµcccëœNNNîÎ;u¾EijgÏ„#äææ60onnîàÁƒ=<<¨wÇC† ñöö¦6fggKKK—––’$YUUÕµk×àà`’$G}îÜ9’$ ø|>Õ999™V¸×‰„ñrssë¿Aøùù5ÜZÌ_½9rÇ?îyøð5ÝYÚ œ#‚VÅb¥¤¤_òx<áBsB™™™ZZZT›jdeeQ/‚’’ªÕ®¦¦fFFFÍ-T D„ººz͘— ˆ7oÞ 8j3 &“É`0222,-- ƒÁPSS«®®¦>"##³`Á.—›™™obbBMíêꪧ§Çb±lllD9\õ­ßû÷VVgV¯¾hf6îÞ=ç‰ûÓ ½@E­š±±±»»»°&a2™OŸ>­ÕG]]º Ž ªÁb±š6Ýœ9s.^¼(|™˜˜Øµkך p‹>/‹ÅªY\Q•‹Åºzõ*õ×êÄÑ€¨æææ¡¡¡\.wêÔ©***Aèé饧§üðááC‡ÔÕÕ¿|ù²dÉWW׸¸¸ÔÔT›iÓ¦ ûO™2EVVvïÞ½ÂU檪ªÆ§­­””´dÉ‚ >þ\3“É .**rss£¶40>´Néé¹?ýtÜÅ%pýzƒˆˆÍ£G÷¡;@»ƒ¿BA«Ö½{÷G9;;Ïœ9³¢¢B__?  _¿~5û899•””ÌŸ?ÿË—/3gεåôéÓëׯwqq3fŒ««kaaá¼yó’’’„ùóÏ?·lÙâììüÇœ:uŠ ˆÆ€Ö¦ºZpêTäáÃ7û÷ï~ýºÃ!M<¹mff&Þ`Ж888L˜0î­ƒ¬q·:@‹¡~…Ф½c0~~~ .¤;@ûòúõGß—/3·nmc3µCéÆ?Sƒ1~üxêFG€š¸\.~ˆçˆZÔåË1;w^a±˜AAëÆŒÑüþ7mÚ„o½ðµZ·¿@}P´Â²­[®]{±bÅd—¹XA 5ÀÏb€–pçNÒÆ—;tñ÷_‹ÅµZTDÍ«ªªú×_CΟ0w®ÎfJJèNÿ@3ÊÈÈ]»–óúõÇßÿÙÌìºã@mx@sñòŠ64<\]-¸qÃå@넊@ü Ëll<¬­']»¶±ÿîôæ)**Ú¼y³†††¬¬¬††ÆŠ+²³³©· F\\œçû€­dÆŽ¡1jèҥˤI“îÞ½+öY &\5´ÉÊÊò÷÷±sU• Cð ²×¬¹ôùs©‡Ç²Y³†Ó‡FFF ƒËåöë×ïýû÷gΜÑÕÕMII‘••¥;dhÉc©££CÇsww_°`Á»wïäååÅ; ¡"ÚÄÄĘ››7ÚMN®Ÿ¼üX£c^žW ¤øNÞÞÑ®®AcÇj¬íÙ³ Ýq‚ <==ÓÒÒRSS©oÕݺu;qâ„›››ŒŒ `0¹¹¹ªªª"nÿN-y ˜L&AL&sÇŽ‡z÷îÝàÁƒÅ>PðGw G@@Ù˜¨¨×ææ'••'L˜àã³M 4úh<Ø@\ŠŠÊ—/?¿}{ ‹Ë\ÿÖRáíímggWë$“É”––¾äóù®®®ªªªùùùÔvƒáëë«®®®¨¨¸mÛ6‹¥¤¤äèè(ìàååU³ñµçÏŸ¨¨¨têÔiذaÔsæÌ9räÕ!&&FUUõË—/õeÈË˫٦ž=Ú­[7ává»Âí$Iîß¿¿oß¾***fff¢ïQŽ!ƒÁ¸wï^ï޽Ϝ9#â.P   ¾}û2™Ì…  ;—””dddìÙ³gøðá øúpUUU5¾Ý_Æêðøqš±ñ½zmüé§c÷ï'Ó qIIï'NtÓÑÙùèQjKÎK„ŸŸ_Ã}”••CBB!66vß¾}ZZZ111ÉÉÉúúú&&&ÂwÙlv^^—Ë%böìÙÂvZZI’'==½fƒ°æ´µµÍÈÈøðჇ‡‡¬¬lEE…§§ç„ ¨6lX½zursskµkmÎ(Ü~ìØ±þýûGGG§¦¦²ÙlSSS÷¨iÇPWW÷Áƒ;wîü¦]4hPLLÌ«W¯&Nœ8oÞ}ªuô:uê4}úôׯ_ 3Ô<\ñß0ȯ~r´€””k×rÞ¼ÉÛºÕhÅŠÉÒÒ8/’¡¼¼ÊÁÁ7,ì寿Î_²D—î8ƒÁðóó“ÜeôMLLÆ·}ûvºƒÐ€Á`ÄÆÆŽ;Vô|Óá’ô-_C±FFG»tét÷®³Í”C )޽˟3çhllÆ_ml åD+++{üøqxx¸¥¥%ÝYþuãÆ F]\]]éŽÖ@›!Á«ITTTîàà‘¸c‡ñŠ“qc(H¨¨TϾ}U/_¶íÑC‰î8ïúõëK—.ݹsgŸ>}èÎò¯Y³fµäµ3ß4W+<\m*"h9iiŸllØÐpø´iƒåèŽÐBP8Q«l;8Ìtp0d0tÇUbböâÅgå8œU½{w¥;N³KJÊ }üwFF®ººòÌ™ÃfÍöãZ:HÓ  ¥¡"ñ IÒÍíÚÉ“‘۷ϱ³“Œ+ï(wî$ÙÚ^>\ýüùå]º´åeåžrd‘¹ù8ºã|ç‘‹Kà¼y£YÔVϼ_ü÷«Wï»wWœ3GgÞ<±cûJIád>ÎÁw«ªª¶·÷O8sf©ÁÑ?˜••õèÑ£æ ¢X¸p!ÝhC’äÎWÏ»ïèhØ&¯õ­¨à_¿þÒÏïɃ)JJØì‘ÆÆ£&LÐÂMž5¡"‚ïRQÁ_µêBLLÚÅ‹«&LÐú¦Ïúûû‹q¹Xhü€v‹Ï8;øù=Ù½ÛdùòÉtÇ'’$>|íåž %%5gÎ3³&NÔÆ!€:áª9hºÒÒ kk¤¤ÿµ::M\— ßÈ邊Ú³òòª5k.Ý¿Ÿrîܲ™3‡ÑGlòòJüýŸøûǦ¤|:TmûvöüùcTUèÎЪ¡"‚&*/¯Z¾üü«Wï½½W7¹hyŸ?—ZYÉÌü´näH ºãˆG\\†§gÔµk/ºté4þè“'Ì¢;€d@EMQ^^emíñêÕûÀ@;üÒ òþ}ÁÏ?Ÿ*+«¼ržÿîtÇù^eÞÞÑ—/?~ó&oÒ$í³g—NŸ>WÇ|TDðÍJJ*,-O¿{—õª½––ÄŸ€ö#5õÓÏ?ŸRR’»vmC]èŽó]³OŸ¾ú\ZZêçŸÇ/]:?š|›ÒÒ +«3ïÞås¹vøí äéÓ7‹Ÿíß¿‡³R¢:æî~ûκwWZ¿~†•Õ„nÝé ÁPÁ7(-­°´<óæM.—»åHÈÈV­ºðãýΞ]Ö¹sGºã4…@@†…½|(ܱãÊ?üzòdäܹ£>Üþ矖(‡Ä 4®ºZ`k{ñáß5-¿R­@ 022züø1—ËÍÊʺvíšœœœ®®nEEEsLÇãñ¦L™2jÔ¨”””°°°çÏŸÛÙÙ5ÇD g IµÇŽËápq·À78uêî®]Á¶¶SwíšÇ`HÒ Sš IDATlŸ>ïÞÜÍÍ 55µ³gÏŽ;öøñãJJJ"ŽÀ`0rssUUU›œÉd Û Â—VVVâš =8räæ¡C7\\ØvvÓéÎò >~,rw¿Ãá<êÒ¥³““‘…ÅxyyYºC´e8GعóêÕ«Ÿ?¿|ìØ¾´ðöö¶³³£Ê!!&“)-ýW¿ðù|WWW UUU ‹üü|j;ƒÁðõõUWWWTTܶm›‹ÅRRRrttvðòòªÙ¶´´ŽQ³×¼hMØŽ0aBçÎ555=<<¨?BwëÖ-//¯É©êCMZs á[$Iîß¿¿oß¾***fff¹Ú'€Ü¶ûûïáÇŽYJP9ôæMÞúõÞãÆý‘øÛofOžìXµj Ê!€fGÔï÷ßÃ54ÂÂ^6Çà~~~¢ü TVV ©ï]‚ bcc÷íÛ§¥¥“œœ¬¯¯obb"|—Ífçååq¹\‚ fÏž-l§¥¥‘$ÉápÒÓÓk6:uêtçÎúæÊÍÍ­ÕîׯŸ““SNNN`` ””Ô‡„o59U­½û:@­$±±±ÇŽëß¿tttjj*›Í655môÀŠxü$NuµÀÑÑ·woÇààgtgUzú'{{¯Þ½uuÝüýŸTVòéNÐŽàûÔËÏï ‹µÉÓóa³/Ò7r™¨¨(áKa1ÏãñÈÿêmmí‹/R‚(,,¤ÞŒŒ$I²ºººV»f¥Q“œœÜ7UD***G¥6òx<>Ÿ/|ëûS‰^ 2ÄÛÛ›Ú’---]ZZÚðEEmRe%ßÖö¢¦ææˆˆDº³ˆ$;›·m[@Ÿ>›GÞuþüƒŠŠ*º´;¸jêöÒÑÑwÛ¶9ÖÖéMÂb±RRR„/y<žp¡9¡ÌÌL---ªM5²²²¨— AHIIÕj×GSS3##£æ–‚‚ª\©“»»ûþýûûôé³téÒW¯^Õ¼–OŒ©•‘‘aiiI­J§¦¦V]]-œ  ý¨¨à¯\yáÖ­WÞÞ« †Ð§¹¹Å;w^ÑÕu OܵË$:ÚeÙ²I;âþ^€–†Šê›±n×Ò¥“Ö­£ÿú{cccwwwaMÂd2Ÿ>}Z«ººzzz:Õ¦,«iÓÍ™3çâŋ—‰‰‰]»v.ÀM’$Q£°!bÖ¬Yoß¾ èÕ«×Ô©SkVkbLÕ(‹uõêUêï€Çã 0 ™æhÊË«V¬8ÿøqš··®nºã4äãÇ¢­[ýÇŽÝ}ëÖ«cÇ,Ÿ<Ù¹téDÔBtAEµ¥¦~ZºôÜôéCvï6¡; AÄŽ;rrrØlv\\\NNNPPÐîÝ»kõ±¶¶Þ³gOlllJJн½=›Í®¹\[¼¼¼¨3BÂÆÖ­[_¾|¹eË–ÌÌÌ„„„5kÖ˜˜˜P£1™Ìààࢢ"j%:ŠŽŽŽ³³sï޽ǎK’¤œœAÔÂÙMN% j ¡%K–¸ººÆÅÅ¥¦¦ÚØØL›6M\H„’’ ‹ÓÏŸ¿ °7®ÝqêUXXæævmâD·[·^¹¹-¸wÏyî\))IZ  ¢ó’=h}Þ¿ç½kÞ¼?¿|©lî¹D¿åÝ»wÊÊÊ;wf³ÙÔù–š÷UVV:99©©©©¨¨,Z´¨Ö=6 ´ ‚àp85$I>þÜÀÀ S§N=zôX¶lY~~>µýÒ¥K=zôèÚµ+µ*5Ë­[·† &''§¥¥åããC’¤žžžœœ\~~~“S õÜG$œ¢æpvvVWWWPP044¬µBÃw€VŽÇ+=ûˆŽÎ/))èÎR¯ÂÂ/{÷†öï藍³“ÃyÔLk'Pÿ_C{&ÊÊ:P ƒ¬q«:´s_¾TššžàñÊBB6¨ª*4÷tþþþæææøHh¨³C™™ù¾¾kìIwœ:TUU_¾óûï_¾T¬Z5ÕÆfŠ¢¢\3ÍEýº¨Ý:zô¨ººz@@ÝA$ ®Z† ¤×Û·ù×®mlràû—[ZžÉÊú´®oßntÇ©$ɰ°—ûöý•“S¸j•ž­í4&³s Ì»pá˜Z!ÔBMƒŠþåäpÿ~rPÐ:MMUº³4ŽÇ+57?YTTºAMM™î8µED$þï×22òV­š²ví4eeùÆ?t@EAgÎÜóñ‰9sféˆtghœ° ´kmåP||ÖÞ½¡¾^°`Œ——Mk‹µ "âúõø_ Þ¾md4‚î,ãñJ.›Ÿ_ÒJÊ¡ÄÄìÝ»ƒ£¢R,°¶W/&݉¾@ 022b0\.·_¿~ïß¿?s挮®nJJЬ¬,ÝéZ*¢vêüùW®<ãpViiu§+ƒ†††©©©(=++¥>~TÌÉ‘¯®f((ðåå+›;[{ ®®.âñ ]ii…¥åéìì‚  ;ÚŸ;ôñc‘›[hPÐÓQ£ú„†n=º½yšÀÓÓ3---55U^^ž ˆnݺ8qÂÍÍMFF‚¿0ŒÜÜ\UÕÚ¨o;Àÿ!¡ýyøðµ††Ã±c·èÒ¸¸¸7K–œUSÛ4vìî³gï—ÓZZqq9›}TGç—ŒŒ\z“TVòOŠ8pÛС..<¬ªª¦7Ï×üüüDùÍ®¯¯¿gÏžúÞ%"66¶ªªÊÅÅE]]½k×®?ÿüs^^žð]555ggçË—/÷êÕKQQÑÁÁAØÃáÔjÄÆÆÖœâï¿ÿž>}º²²²œœÜСCýüüH’422:|ø0Õ!::ºk×®eeeõeÈÍÍ­Ù~«¡¶ g¬¹] ìÛ·OSSSYYÙÔÔTô=ªï(EFFòj &­s–:÷·¼¼|Æ Ý»wWUUýã? y÷î] sçÎ5ÊÔÔÔÔÔ´P'TDíÎû÷¼‘#w¬Xq^ Ð¥! YK—z°X›¦LÙùrtEE݉€¥¥ÆÆŒ¹#-í½I|øàáá!++[QQáéé9aªÆ V¯^Ý@†ZÑ×…3 ·;v¬ÿþÑÑÑ©©©l6[X94ºGõ¥¯ÅÆÆÖ9KûëêêÚ»wï$''O™2…ÊÙ@H]]Ý”••5ð_@Ó "j_*+ùlöQ}ýßJJZïÉ–ÄÄìåËϱX›ŒŒŽ„‡'´òÊ šOyy•¹ùÉ!C\^½zOcŒ”” º÷êµÑÆÆ“öóT ±"’‘‘‰ŠŠ¾~¡çñxäå„¶¶öÅ‹© A’ÿ!I²ºººV»VÙSsüZoðù|ªœœLrrrYYYÕÕÕ,ëÞ½{ dhBE4dÈooojcvv¶´´tiiiÓö¨Î¢¶Ô9KûÛ·o_á Ÿ/^PP_!TDMƒµæÚ—;¯¤§ç]¼¸J^¾5Þ;›””³rå…3}úTÄá¬úë¯M3f Å3=Ú§ªªj[Û‹/^dúû¯<¸-JK+vì¸b`pðÓ§"ÿ5§O[kj¶…ÛQX,VJJŠð%Ç.4'”™™©¥¥Eµ©†p9‚ ¤¤¤jµEWPPàêꪧ§Çb±lll¨]ºt100 ¼ÿ¾ŒŒÌäÉ“ÈЖ–– ƒÁ`¨©©UWW‹qž¥ÎýÍÉÉ0`Õ6Ù»wï&î94Q;{éÒ£ßÿY]þešjy÷.õê‹«ªª¯^µ ݨ¯?˜îP@>_°v-çáÃ×^^«†U£%C@@ìäÉûüýŸìØa¾yÒ¤´ÄhÆÆÆîîîÔi‚ ˜LæÓ§OkõQWWOOO§ÚTƒÅb‰+€žž^zzúÁƒß¼ysóæMáö… r¹\??¿E‹1Œ2$I|cÄb±®^½Jý=X ðxý`||ÖùóË/^\ùÃ}étHGGß[·/\X>fŒfËxó&ÏÚÚcÆË?üÐ÷έ+WêIÊS†D´cÇŽœœ6›—““´{÷îZ}¬­­÷ìÙ›’’booÏf³™L‘V÷òòÊÈȨ٠¢¤¤¤à?ÕÕÕUUUãÆÓÖÖNJJZ²d AŸ?&bÞ¼yqqq¾¾¾ d`2™ÁÁÁEEEnnn5§¦–7øµ}É’%®®®qqq©©©666Ó¦Mû–c&ª:g©s/^ü믿FEE½~ýÚÑѱ@³£åZ=haEE_&Nt[¸ÐÏoE+#ñùÕÎ#ƹr8ZáªMÐòÁ¦M>}úl¾{÷Ÿ–Ÿ½¢¢êèÑ›}ûnÑ×ÿíáÃ×-à;‰xI’ïÞ½³°°PVVîܹ3›Í¦ÎÀÔ¼¨²²ÒÉÉIMMMEEeÑ¢EõÝ¢óu›¨k­¹šbccCBB455eeeuuuà Dcllý`~~ɵk2o%Á€v'OFþùç­ƒ¶p9”ͳ¶öX¼øì¸q}##ÌÌ~ÄrHÒ•••=~ü8<<ÜÒÒ’î,ÿºqã£.®®®tGq’à§Sƒ(^¼Èüå—«[¶Ìž0A‹î,AÏŸ¿stôMKËݲeÖêÕÓddP“À¿Îž½·gOÈÿþgúóÏã[lÒêjÁ©S‘G†³XL.×NW·‹M µ\¿~}éÒ¥;wîìÓ§ÝYþ5kÖ,‰>á"BEÔ–ñx¥+W^Ð×¼nÝtº³yâÄíC‡n Ðó¯¿6Òµx´N~~Oví vtœµtéÄ›ôéÓ·NNþ©©Ÿìí§¯[g +‹ß‰tZ°`Á‚ èNí~ú·Y$InØpYFFêèÑE´?Ò'7·ØÞÞûÑ£×6Ì\¿Þ ­ÚßéÖ­W[·úÛØLqt4l™y¼Ò_~¹øtòäËÚÆS† iPµYîîw>|}íÚÆ.]:Ó›äÖ­W7^VRêtíÚÆ#4è ­MLLšçO?Ù¹Ó¸¦#I’Ëss ÈS§–̫ӓ@k†Š¨mzúôÍ×wì02DlÔk‚ªªê_ 9þ±±Î åh ­P||–µµ‡¾þàC‡Ì[àlöë×·mãÆÄ¤-[6yË–YJJš{FhýPµAÅÅåvv^3g[¹RÆïÞåÛÚ^JNþðûï?›™ý@chÒÒ>YXœ:Tíøq+iéæ]g¥¢‚èÐ3gî ۄóÕ „Ѝ rpð‡/¢1õk/6oöíÕ‹yýú¦zÒ˜Z§ìlž¹ùI‹yñâJ9¹Í:×Ý»ÿlߘ—W¼c‡ñÒ¥“Úü*—þþþÍ:~u5YVÆWTlÞÿjÐYYYêêêt§<¨ˆÚšÀÀ¸7âí””è¹DMx¥ÜO?Ù¿ßT^^––К—/]zNFFúÒ¥•Íz=mQÑ—_ ññy}ºÒ@>ëÁƒ”û÷Sbc3ÊË« èÉfëèé 3F³sçŽthF¨ˆÚˆgÏÞ:t}×.mí-<5Ÿ/ؾëåmg7ÝÙÙ¨¹ŒÉuøð _ßÇË&LÐjŽñß¿/غÕÿÞ½d[Ûi3;uÂ÷øF|üXñêÁƒ”˜˜´ÜÜb%%¹)SýúëüÉ“à¢8h?Pµ¥¥ëÖyM:hÙ²I-z{ÛLš4 e& Åç V¯¾øþ}Ahèñ|5'IòÂ…‡nn× êyíÚÆæ{¢Që—“SpëÖ«Û·“>L)+«<¸—™Ùúúƒø¡/-¤h¨ˆ$•“S@×®Š[·µÌtÙÙ< ‹Ó%%W¯®<¸ý~ mÛÆŠzíç·FSSU,fgó6mòyò$cëÖÙ«WOm‡>#I2!!;<<1<()ÉÍœ9ìÏ?-±j6@³BE$aþúëEhè ?¿5;wlî¹._Žqr X¸pÜo¿™µäƒ><==ÓÒÒRSSååå ‚èÖ­Û‰'ÜÜÜddšëŸ«‚‚“Éd2™k×®ýøñã®]»¨ˆ Fnn®ªªxn“ùwPQ©¶••]‘ê”™ùyåÊ ººý¿ÿ‘?mÞìùÏš5ú›7Ï’•mË¿­ÊÊ*oß~‘x÷î?yy%ýúu›={Äf£Gkâ!K-?j%I~~‰³3×Ü|ܤIÚÍ=×¹s÷·lñ_»Vÿðaóþ•ìíímggG•CBL&SZúÿPâóù®®®ªªªùùùÔvƒáëë«®®®¨¨¸mÛ6‹¥¤¤äèè(ìàååU³Q‹¹¹ù‹/x<ÞóçÏ TTT:uê4lØ0â¿g˜vëÖ-//¯Î”   MMM&“ijjúéÓ§úzÆÆÆN˜0¡sçΚšš$Iîß¿¿oß¾***fffªuÕ\ÍH·¾u(€ïW\\¾dÉÙ=”NŸ^ú?4®_Ÿ1ã`ZZî•+ö..ì¶Z}üXäåmmí1l˜ëš5—Þ¾Í_½zjd¤ÓÇÛ]\ØãÆõC9ÐBHöö^£Gï*,üÒÜíÝÊbm:þx‡555555m´›²²rHHH}ï»oß>--­˜˜˜ääd}}}á»l6;//Ëå1{öla;--$I‡“žž^³A (¿¨¨ˆ ˆøøøÚÚÚfdd|øðÁÃÃCVV¶¢¢‚ꟛ›K’dÆŒóâÅ‹øøøñãÇÏž=»¾žýúõsrrÊÉÉ ”’’ruuíß¿tttjj*›ÍþúXÕŠ*L"lû;v¬á¡ê;¶~~~¢ô¨¥²’?þ±~ØýñcÑ÷ŒÃã•ÚØxöêµqË¿¢¢fÿYG‹/Þ:tÝÐð°šÚ¦þýll<ýýŸäåÓ  ýBE$1n܈ïÕkcxxB³Î"¶o窩mòòz$öÁE¬ˆddd¢¢¢„/…Õ;Ç#ÿûƯ­­}ñâEªCBBA………Ô»‘‘‘$IVWW×j׬%jª¯"*((àóùÔÆäää¯Ë:Pó’$ùìÙ3‚ 222êì©¢¢rôèQj;Ç8p ··7õ2;;[ZZº´´´¨ TDC† ix¨ú*"hš/¸-99ç{yð yìØÝ::;oÝJW°V¢ºZ÷æÿ»6mÚo½zm4hûš5—‚ƒŸ–Ñ ȶy)BÛSXXæìÌ51=cÆÐæ›E ·mãúú>>qbñ¼y£šo¢†±X¬””]]]ê%Ç+++SSS«Ù'33SKëßGÓR¬¬¬!C†¡  @„””T­¶ˆ233 ‚PSS+((Ø¿TTTjjê€u<‘¶ýû÷§ƒ ""))éôéÓ_÷twwß°aÃÑ£G§M›fccóîÝ;KKKKKKa‡¬¬¬:§nTFF†¸†hÔÉ“‘q—.­0 gÓF(-­Ø½;ØÛ;ÆÐpØ UUÄ›.%%ׯ¿¼dþF IDATuëÕýû)EE_†WŸ3gÄï¿ÿêêêééé'N$"== K<ëPùùù5JYYYGGgüøñ5jI’rrrµzêééÕ×!55U]] ˆäädƒaii9cÆŒ¯{Κ5ëíÛ·/^¼¸råÊÔ©S¥¥¥¯^½:oÞ<‚ H’,,,¬¹¦Â7a±X‡ËP »q#ÞÍ-ôÀ…S§jÚ Ùë×{¿}›¿wïOK—N¤n“hEEåwq#þΤÒÒÊ‘#5Ö¬™fh8làÀ&VŒÐ¬pצˆ‹Ëðñ‰Ù±ÃXYY¾ñÞMRUU½n'<<ÑËk5½åA;vìÈÉÉa³Ùqqq999AAA»wï®ÕÇÚÚzÏž=±±±)))öööl6[Äoü^^^5A”””dffž>+,ìeXØËׯ?vï®hh8ÜÙÙhâDí¤éŽÍ Qk”–ö騱[..s»wWïÈT9ôàAÊåË«¿éŠhçø|Áš5—¤¤gÎ,•‘i95j…¿þz±fþ–-³šãàïD-úüΤϟKµµ{ë°Ù:xv@»Òê~?A..Aô\±b²x‡åóvvœ{÷’½½mÆŽí+ÞÁ mÛ»7äùów×®mñ.š/2×®å}9~ù̙Ú;Þ7)+«¼}ûUDDâ­[¯ ¿Œ«¹qãÌ3†öéóm E@ÛÐBMÑ…„<ø0åÀ…â}¨I’[·ú‡‡'ž>m=nýa rùrŒ‡Çý?ÿ´ÔÖîÑhg’$Ïœ¹glüGŸ>]oßÞÚzÊ¡’’Š€€XkkáÃw¬YséíÛ|ÃÇw¯_¹R¯ —CEEE›7oÖÐЕ•ÕÐÐX±bEvv6õƒÁˆ‹‹ã\b°5ÌÈ`0¬¬¬Ä8)ƒÁÈËË£ëãð5œ#j]ŠŠÊwî Z´èG±?h÷îàÀÀ8eúúƒÅ;ò7ár¹ßSµ”Tç·JK+ÞK*hÀãÇéÛ¶q ¯m>~,\·Î+6ö›Û+« -¯Qùù%ׯÇGD$Þ¿ŸL­½¿©¾þà®]%`½»ï'ŒŒŒ —Ëíׯßû÷ïÏœ9£««›’’"++Kw:‰áãã³~ýúqãÆÑš*¢Öåøñ[ÕÎÎsÄ;ìÁƒ×ÏŸpæÌÒ3†Šwäoâàà`ffÖä“$™šZõ1>þs‡R?üÐý§ŸVµòE«$Ž®®.Ý€NUUÕµÈÉ)X½Úsöì›6Ílôã‘‘ÿ¬_ï­¤Ô)4tÃðáêÍS$?…†> }þìÙ[ii©)S8°pÆŒ¡ímílOOÏ´´´ÔÔTyyy‚ ºuëvâÄ 777 þÀ`0rssUUk?»¼¾íßÏÌÌlãÆ=úžxÐz‘Ðjddäöé³ùüùûâöÔ©Hk“¿ÿñÛ’òóKNœ¸­«ë֫ׯ™3yy=*))§;@[#fÍ:|çN’pKYYÅŒ ùRÙðg++ù®®A,Ö&;;Nq1ÿ{fdä?~ËØø5µMÚÚNöö^áá ee4Fj&¦¦¦¦¦¦vÓ××ß³gO}ïUåâ⢮®Þµkןþ9//Oø®ššš‚‚‚³³óåË—{õꥨ¨èàà ìÀáü?öî<ªîø{ʾe¬)´ˆJ EQˆ²>’ê¡h·T*ZU´?I‰5;E‹´HekТR²U¨É2ŒÝ,÷÷Ç}žùÎÏ2cÆrÞ¯^½ÎÜ{î9Ÿ;†™Ïœ{ωìQÀ`0Ô]¼}ûvÕªUBBB<<íœÅÀ6™ ƒ©Ø¾=LVÖ}Ö¬#§O§}û†euD0n}—”tA£].\xD"‘aÞµ+rî\¯Ÿ?‘ X,¾Ï¿¯_»öòôéYøÍKM .88kÆkÒÒn B“’ š›;XЙ ¥¦¦ö·ùdïãã3}úô¼¼¼¯_¿®\¹ÒÌÌŒ²×ØØ¸¾¾>11‚ 5kÖPÊååå0 GFFVTTPzgDÊÊÊÎÎΕ••¿ÿæææîêê ÓÒÒB*ìÛ·ÏÉɉF =2¢Þ)=R¶_»vmÆŒ¹¹¹eeeÆÆÆ”'jÀ3¢ñ,%%%ÉÉÉuttÐó¼ †ººúû÷ï‹‹‹555׬YÓgS´Û?yò¤ššZCC­? à #:€ßÑâùó4Ú5?¿ß¿ÈCðàÁ{ii·Ó§ÓØ&sHäÇ‹--oHJºhhœ Èߟl`48v,EFÆ]RÒEZÚÍÄäê¹seeÝ)”ÚÛ»45½ÓÒÞõ8êÞ½·ÊʇV®<Ï’/,¾~ýuñâ£eË|%%]ÔÔŽzy%çç—3ö{¥Q‹ÎŒˆƒƒ#;;›ò2‚ , ŸìÃÃÑ ?~„ ¨¹¹Ù›™™ Ã0‰DêQî‘öP·ßcWSS‘HDÊ_¿~E>Í755ñððTWW“H$4••E#†!dD³gÏŽŽŽF6ÖÔÔ°³³·µµ 패»ÐÕÕ=}ú4=ÏaÀ0\TTA¨¨hï¦h´àÀ‚>~üØ_ÌÔ@F×'éĉ»FFª œ./¯|÷þZ|äƒïJQííÝ11y!!¯ªªê/V¸uk‹¡á\ÆN»@od2œ”T@$’ "‘Èïßÿøô©fË–%”?JgÏÞÿþ½qß¾;**Ròò¢uvŒOL,ppÐõò2áæfÞJee݃îßÿáÃOAA^//]]¥Q¸äË¡ÑèÒÒRÊ-‚8®½½]JJŠºÎÏŸ?§OŸŽ”‘BuuõìÙ³!š2e Alll=ÊôkjjòõõÍÎÎ.++SRRB6 èéé%%%©ªªrppèèèЈa*++7nܸqãFÊ–êêj¤÷áœÑ•+WV¬Xáàà€<0fa̘1Ù2sæL‚êëë{7E£ýW¯^úúúFFFÒÿ´ÐðAsTˆŒÌùñ£ÁËË„Q WoÞ¼zµŠ¯¯åX™{ ¥¥óÚµ§‹{Ÿ:•ºp¡|zº[JÊ##5`0•m”‡‰@ ††¾º~ýA/_~ } Apw7ÉÎ.¨½½»²²nݺ«Ÿ‚ƒ·z{¯Z:D è¯ Ãð›7G¦,^ì½dÉÙ;wòtt”îÞÝóñãé+WþÒÓ› Ò¡>­[·îÆÈ0A‚‚‚………=êHKKWTT e¤€F£€®®nEEÅ… ªªª?~LÙnee•˜˜gccƒB¡hÄÃ0AÕÕÕôwŠF£ïÞ½‹|õK&“q8%Ž lذáÈ‘#Èß7a”••!…¯_¿¢P( ‰ÞMÑh?!!! 999++køçxÿ`½ÆÆ¶ ÒWÈÊ2f5Œòò?¶¶‹M»vm#ÛH‡°Øfÿç±±ùììlÛ¶énÙ²t‚ÌŠ £Gjê[NNvê…H$CäãóàíÛ……U(ÉDúñ£qË–~JI ¦¥í£g…¢>ݾý:?¿üæÍÍ´«Á0ŒÁT¦¥½ü¸¸º7mš˜•Õ"cãyÊÊS‡ÖïDsôèQuuucccooo))©ÜÜܳgÏö¨³yófooï™3g ìÙ³ÇØØXPPžÆ£¢¢–,Y2mÚ4J‚ ÖÖÖ¦¦&¤@ÐÐÐPTT,))Aºnll555urr*..~ñâïÝ»geeuæÌê®q8\Ÿ“¹!Ûííí½¼¼¤¤¤Ï;WPPðöíÛÁ>u}:sæ 2ªC#fzÂ8tèЭ[·P(ÔŽ;,--çÎÛ»)íóððˆŠŠzzzîÚµëíÛ·œœœ 9;˜¸Xtµð?GŽ$-\x’QS!56¶.]zÖÀà?n¼©¯o9}:MQÑCYùÏýººVG‰Dž3ÇKRÒ¥ÿ®ÔÑhW;»À' ëO[[—“S˜¤¤‹¬¬{Ó¤—/¿zy%««Ÿ”tÑÑ9{ñâ£/_~ ã,Ç:ï#‚aøÇ¶¶¶BBB¼¼¼ÆÆÆÈhõ}DÝÝÝRRRÂÂÂ666ýÝ¢Ó» õ5×5 “šš*//ÏÍÍ­­­ýðáCƒ™3g"í¬[·nΜ9H¹¿"""$$$DDD¢¢¢ ÿîÏÑÕÕåááA& Œ²½»»ûСCÒÒÒS¦L100 Ìš0àõ©ÇÞS§NÑ~Þè #::ZJJJHHhãÆ8®Ï¦hü\rWW×Ì™3Ï;Gûî#€¡à^¿f*)ùµzõÅ+Wþ²°X8üÖÚÛ»ÍÍý[[»RS÷ M~ƒ#§­­+((+ à977§££îÖ­:üü<¬ &¨ÜÜrssÿ>w¡Pl0LîµÅÁÁvÿ¾Ë*/ÿ³ysð÷ï $™ uýú&SÓù”½éÅ‹/iiïž?/illSRšjb¢F„ú„,ï–Àê@†ÎÌÌLCCƒr0Bâãã­­­Áç= \5Çbǧ,X gn®>ü¦H$²³sxmmSZھќuvBB^^¿þœƒƒíØ1Skk+BÀd))ElÈerì\\ì\\--$ÒÿÛÃ0™ ;8„>}zpPßeÄÆæ{x$À0Œ4ˆB¡RRŠLMçS¡gÏJp¸¶E‹¦¹¸¬Öן#'ǘk‰Ñ¦½½½¸¸8##ãêÕ«¬Žå_ééékÖ¬é½ÝÓÓóôéÓÌf+ed|ÌÉ){øÐ•!“9’”“S–”´›Q÷#1‘HŽÍ¿r%£µµsï^½-[–NžÌÍê `¢#É©©EÔéòI_¶„„@ddNtA"‘kk›<<âìé饻›èé™tçN> CSyþüóþýqÏž}ÆbñŠŠ[¶,12R›=›a·õ£Ó£G¶lÙrìØ1999VÇò/CCC0ŠȈX¦»›xâÄ=s󅪪2ÃoíæÍwîä…†þ­¦Æ€ÖFBaá÷£G“?~¬¶´Ôpw7@£éºm€‘–ý ï¢<äädççŸtù²¨(Ÿ‰É?drߟ‘1% ¦òË—_3gJÒîâdž­[CJK±½?q’Éä—/¿ÚÛ/12RUR—ÆMææææææ¬Žà_ #b™ˆˆ,ïá±vøM%'z{§ž8aª¯?gø­1‹?{ö~bbÁòåÊÏŸ{̘!ÎêˆøŸ»w‹89Ù;;™ [Z.:vlDze¾=F¯ÙØPlll$YUUÚÜ|!Wµef~qvŽèèèîs¬ …bSQ‘vu]ͨÓ¯Èd¸®®åÏüïßÍX,‹mþù“_FÏê¸Æ±ßùÏ?ÎΡ?TòæM…»{¬ƒƒÎ¶m˵µuýóÏ“—òò¢ññ;—,™ÁêˆøÒÇ» àä ¬/VNŸN«­m"‘`ˆ*RS“Y¿^ÝÐp®´´=“ɰσ7žCÿ-)Órá\[[¸†‚ ºº–ºº–ÚÚ¦úú–ÚÚ¦ºº–_¿šÿüÁÿúÕÜÐÐB¹²qòdnIIÖV.ÖF 0n€Œˆ5üüžpr²ïÚµj˜í”—ÿÙº5tÕªÙ'N˜1$0Fa81±ÀÇçA{{ב#Æ[¶,åà ­À¨óúõ·––N ek«yø°1A>ü Ì$“aNNv"‘¬¦&kb2oíÚ¹ƒºGïܽ;òÙ³ÏÞšA _¼øbd¤6œRmm‹ ò ÿš±Xü ¿7wu‘jll(11>  ~ þ¹s¥(e99^¤2×0|`öm¨©Á-]zöäÉõööÚÃi§©©ÝÄä*//WròîQõõjUU½—WrfæSÓùÇŽ­›:U€ÕÀPXZZ&&&²:Š‘%  ÏÅ…nn~ÒÝ]‹lA¡ØEDþâä!jÛÛK»ºÊH¤¶Á6ËÉ)*(hÌÁÑÇ8e.oŠòîÃÖÑQÚÔôˆv›Î4]_ßÿfçΕƒ ˜QˆDrM ®w΃üknnGª¡P(qñÿå<üÔeaá)ôÌÀ9fߘ̾ cD,páÂ#YY‘5‡Ó@rt¼ÝÙIHLÜ5zÒ¡înâõëÏýüž((ˆ''ï^¼XÕÀ°hjjººº²:Š‘B&ÃYY¿ut¦rpüï†Æ²2|CC§ŠŠðäÉCƒ¨ªjéîþ7óéì$Q¦g Èù¿Þ!ʨ—‚ŽÎ ^¹r…v?~4dÞ¹“G"ÁÛ·/¹Ai‰\]=pÎA%Ï‘“ÑИFó MæâbÀûo^^)T]]Íê`´³}üX“˜X¸™}XoØîî±?ÖÜ¿ï"!ÁϨ؆éþý÷ÇŽ¥tuÏŸ·27_ÈÆÆ€)Å€µ¤¥¥­¬¬XŲ±auô¡1òùs­Ÿß“û÷ß³±¡;mZ$$†>4M"‘ëë[(IÎ÷ï ýå<üü“¦Ní;çœÌÍ=²ï°ZZZ#Ú>0nHKK[XX°: Õ@FÄl¾¾,æóþþÏîÞ-ŠˆØ6Jæm«®Æyz&=}úÙÜ\ÝËk¸8«#`œƒaøéÓÏÿüóäíÛïìd2L‰úõ«™vFD&Ãuuø>y°ØæÆÆ6„Ôäçç™:UIrTUez\äÆÃÃ9âçÙ?777ö0ž€Œˆ©^¿.}þ¼$%eÏpIM}çãóàÄ ÓåËg2*°!#‘ÈÙçÎ=äçŸæ0:§ÿ`üܾ}¹›ÛêI“ÀT°Œ ÎNBTTn@@&Û AÁDbÏ›Å98ØJts‹Åáþ7!„˜Ÿ¨(-0{6ZOo¶˜Ÿ¤¤€˜¿¤¤€¨(˜ `‚󤥽ûô©æÚ5»!·ðûwóÖ­¡ NóöÞÀÀÀ† »›xáBz``æ¢EÓ²²ÉË‹²6Æ7 …ÅN^¼Ø»¡¡†û]Ý‚ 66”‚‚¨±±š¤¤ ˜-(*ÊGÏÔmÀ„2"&!HgÏ>07_8ä;::º·l áåå ÚÌÚw÷ÂÂïû÷ÇVWãΞµØ¸Q…3(0‚êêZÊÊ„'‘É-ììl´'&‘ÈÓ¦‰mݪôð€±\*À$QQ9uu-k®Ú†÷í»óý{CD„£  /cc£_[[×Áƒñ¦¦WÅÄøŸ=;`g§ÅÂtÈÒÒ Pñññ¬úx<~ÿþý222ÜÜÜ222555È. UPPÀÀ¾Þ =hœ ˆ‰ñ)+7jiÕäæzùøXlذ™c“ ÅÁÑóë!‰\SƒcZlÀ8ƈ˜¡½½ûêÕ'ööÚC^«4 óÑ£âÐп§OgÙärEEß]]cª«qÇ›:8莆ɵÇ÷Z1ô°¶¶fuD&“×®]‹B¡jkkƒ‚‚´µµKKK¹¹GËZaÃ1zNPNNDNNËÎN †áÒRl~~Å›7¯_ûóÏÆ†âââèì$@T[ÛĄ̈€±dDÌöº½½{Ͻ¡þâÅŸ‡±j&7tåJ†¿ÿS …ðpÇÑs×и_+f@ # ÂÂÂÊËËËÊÊ&Ož A˜˜Øõë×Ïœ9ÃÁ1†ÿÀ¢P¨ºº:QQQhTž …RVžª¬<ÕÞ^‚ š\^^ù›7•¯^•~ÿÞÐØØÊªÀ€±\57âš›Ûýüž:;¯ž<„ÃKKoßfi¹hçΕ >üÔ׿œué’Mbâ®Ñ“À(½k×.$[ dgÿß]D"ÑËËKFFFTTÔÖÖ¶¡¡ÙŽB¡bcc¥¥¥ùøø>ƒF£ùùùÝÝÝ)¢¢¢¨ ½½{÷NOOOXXxÒ¤I***È…”FFF—/_F*äå削ŠvttôC}}=u…BA$&&†l§}‚(*++KVV6((ˆÎö‘Brrò´iÓ­¬¬(•‡FJJÈÜ|á¹s–99žÅÅÞ—/ÿ5œÖ€‰dD#îÖ­—œœìNNˇp,ßéàp{Æ ¬6M Μ¹olü˜Ø”gÏZZ.b~ 0ú½}ûVMm€5—/^¼›˜˜˜““ƒÅb)»¢££ß¿æëëY\\|ûöíË—/WTT@¹dÉêBo666ŠŠŠEEEUUU®®®öööÝÝÝVVV‰‰‰H…ØØX ‹«W¯öCÈÔ”1¢OðÈ‘#wîÜ©©©¡³}„§§glllnnnmm­ƒƒíÊôž FFR}}ËŒ~~O†p,‰DÞ¼9xî\¯êêF†6 ²2ìÚµ—§O?™C&“™À€,,,,,,X‹AÇê(Æ-:_cÙÙÙ”‡”¿®8yˆÁ`ÃÃÑ ?~„ ¨¹¹Ù›™™ Ã0‰DêQÆ`0}v×{WSS‘HDÊ_¿~… ¨®®®©©‰‡‡§ººšD"¡Ñ謬,1ÔÕÕQGÊÔ<Á„„†Û~XX²ñÝ»w”Êý¿ïÀÈ¥íÐÞ IDATcD#+0ðŤIœºC8öŸ223K‚ƒ·JI 1<0Úbcó׬¹ÜÕELKÛÇÚ å`ôC£Ñ¥¥¥”‡8®÷}:RF ÕÕÕÈÃ)S¦@ÄÆÆÖ£L¿¦¦&///]]]4½}ûvd£€€€žž^RRÒË—/988ttthÄ0Ì”••¥}Ž}¢TVVV¦?`8 ºº–ÐÐW;w®âååì±¼¿té±——‰††ÂHÄÖŸÆÆ6GÇÛÄÿý·Î£Gn³f¡™Ù;ŒEëÖ­»qã2°A  `aaa:ÒÒÒÈUp!4ša¿\ººº.\¨ªªzüø1e;rá\\\œ …¢ ÃPÿ9É€'ˆ¤pƒm¿¼¼)|ûö bèƒ2¢týú3~þI[·.쥥¿]]c¬¬mÛ¶l$ëÏãÇ—-ó-)ù•–¶ïÐ!£q³Ê;“׊顠 €H$Rß\ÞçQ½Ã }0z=zôׯ_ÆÆÆ¿~ýJNN>yòd:›7oöööÆ`0¥¥¥{öì166¤§ñ¨¨¨ÊÊJêA­­­Mÿ!‘HACCCQQ±¤¤ÄÞÞ‚ ÆÆF‚LMM bccmmmiÄ ((xïÞ=<æÌê®q8ý'8„öOŸ>Á`JJJvíÚEÿ2 ÆÆ¶'O>1¤)`‚ÓÎr¿~5…‡g=ºŽ›{pO22›Âôéâ¾¾–#[omm]‡'&&ØÙi;f:eÊxXDÁü¥T233çÍ›GyÈÇÇÇÆÆÉÇÇ7Ý,'..ž““sèСիWwuu­\¹2!!AAáÿîzxx´¶¶®_¿¾££cõêÕ×®]£³ñM›6EFFN›6R€ hÅŠ”  &00pïÞ½žžžêêê^^^ÍÍͦ¦¦%%%üüüúúúåååȼýÅàççwàÀC‡]½zõæÍ›ÈF]]]UUÕššaaazNp°íCäàà`kkûçÏ}}ý€€úŸðÞz̾-,Ì[\|z8 0ª\¾|977—ÕQ£ZBBÂpGÁT·É äé™ôøñÇœO.®ÁeD;vD¼xñõÑ#W¦ÍsÁTîÙÇw\¸`ed4À”Y£‡¥¥%DÇ/@hh¨§§'e)DSS;;; …Â`0 .dTTCk°Ï£¨„¡q`\\Ü_”iäÐùÍÌÌÌ444Ž9Âê@zìoJŸüß ­¹¹å¯_—64´¢PŠD‚!RT”ÈÊ:4B‘À|–––yyyššš¬ª««óòò†™Ñ€1¢ñãGCTT®·÷†Á¦C/îßãÌœt†á[·^ž={öltl,“:e²þ–R¡~H$Oœ8Nùn[DD‚  ³ÿþæææÝ»w«ªªº»»·¶¶nÛ¶íÒ¥KH…ÈÈH;;;JúïŠ&¤e$ï‚þKoDDDÎ;ØÜܼjÕª›7o"!ººº<<ÕdÞ½[ÄÎÎFIo ’àG ¼¼ÊÊSûl¤Ï|éÇŸOŸâkjpDâ¿P4ò%4ZäKcȈ©¾¾5**÷È‘A¬múógãîÝQææ ‡°+ý`Èôõ} ¯?çòe›‘‰U˜¿V ‡îèèX¿~}SSÓ’%K’’’¨÷:t¨©©ÉÜÜœL&_ºt)##cPg ãUg'HDAÔÜÜN½]FFÄßßnçΕþþÏÒÒÞrp°#3.P2"Ú†œ/UWã(ìÑÈ—¤¥…&OfåÚnÈ”åÀáææ¦¥¥Åê(XÇŸ:u*..îÏŸ?âââ«W¯>uêr©ü(Yocô÷XRRâîîž••ÅÇÇgjjzñâE *3$za1RPÐ ~þIvvÚtÖ'É{÷F O>}zÃÈEU_ߺsgD~~ÅÙ³vvñÏ¥ŒŒLtt4õʤõ”‚¯¯¯¯¯o©ç¶ï³L£Ð_S>>>>>>ýí½|ùòåË—‘ò¦M›hžÀ ÕÕÕáá1œœlãÿÓU[ÛÞÕE"ÈííD"‘ÜÝMîè ’HpW¹«‹H À]]¤®.Rw7©£ƒÜÝM’”äupPFŽmi!¼{ÇßÕÅ7k–'.H$"R˜?ÿÄ£Gnjj2à xPùÒ÷ï X,ƒ©Äb›ëêZ(3àõΗdeE$$ø%$ÐhÁ‘¾)11QSSSZZzD{FƒÄÄDKKK1Möñ‡Ã-[¶lÛ¶m·nÝÂb±;vìØµkWDD«ãq #b˜¦¦ö°°×..«¹¹é}V/]Jÿþ烮#wÝEaáw'§0vv¶´´}ªªÃú|JCCkmí”oßdÎojJïèøÊêˆÆ6..´ àvö¿h„a2 !ß P £P(ý/í¬ªÊÊÈ8FyˆB±Ï›÷÷ïß“Q(ˆö*|($++2Ìth@4ò%ÔØØŠÅâÿû׌zçK¼üÿý .3*_ruu+8Oá®`z„……•——SÖd»~ýú™3g88ÆðÇÝþFQFhtåÒ¥KsçÎ=sæ ARRR·nÝZ¸p¡¿¿?2ï8Ö#b˜—ÜÜœ[¶Ð{ñÛ“'ŸüüžúøXÌš%9B!¿47÷WRššžîÒ! GGGwZÚ»mÛÂ-:U]-²v­ÞÕ«ÿ~ ÃÓÕUSZêgh8— …BA(±A; ÅAì(u:AÐË—±Ô‡“ÉÄ¢¢ ë×7qr²spÐzçbggÿë/V.lÏÉÉ.!! ª*£¯?ÇÎNËÝÝðüy«ðpÇôt··oOVTœûöDzº[x¸£§§±‰‰šœœHssÇ«W¥×¯?svŽ03»¦¥uZNnÿ¬YžË—Ÿ³¶Ø»7úÌ™ûÁÁ/ÓÒÞ½ySñý{å'¨õ·&;2µ‚H$zyyÉÈÈˆŠŠÚÚÚ644 ÛQ(Tll¬´´4ßáÇcbbÐh4???å¶^ E]èíÝ»wzzz“&MRQQ‰‡ ÈÈȈrõG^^ž¨¨hGGG1Ô××S—‘\WLLŒ²²—²†a__ßiÓ¦ [ZZÒF}ºwïõŒ¸ªªªþü™¨Iºé×ÞÞ}ð`üÝ»E‡íܹ|{´µ´t¦§ß¿ÿ>+ë+''ûš5s7ëè(ñðp²:´ñC@€74ô‡G‰D¦ž ¡QQ¾>yÖ¯_ ¨(agÔØØÖcŠ9 ‰ln®Î° ‹‹CBB@B¢ï5d»ºˆMMm½Ç—JK±H™R“Æø’´´;;øº˜ˆÞ¾}ëââB»eMv!!¡;v8::¦¤¤ »5Ù_¼xaaa±fÍšââb¤¼k×.…>×dïÁÆÆfÅŠÁÁÁ“&Mºÿ¾½½½™™™••U`` ››A±±±W¯^í/†`îs,ˆz»¿¿?²ø»˜˜˜‹‹‹³³sBB=gÔgååå=nŠFæšêóÔ¸¸þýÐKY€¾w ׯ_/**zýúµµµõ¶mÛ(‹Ñ‹‹‹oß¾Æó†4~äÈ‘;wø_u1FDD6 Åæà KOe‰¼sg¤  ¯¯¯ÅHSZúÛÑñv}}kx¸ãªU³G¢ Ò‹_RSßed|ìì$èè(;gih¨2¡fa2KËEêêòÛ¶Ýþö ÛçX''»®®bß㨨H={vÀÁ!´¨è{ïÃQ(ÔŒ⢢ýÞ<ÊqsÓÊ—êë[ëêZjkqõõ­µµMõõ-µµMu¯_khh¥d˜¼¼\È:K“'ƒUž‰…ùk²÷ŸŸ?eÊdHJGG§«« Ç›™™9;;×ÔÔHJJ&$$ÄÄÄ8::öÃÐXüöõÙÜÏuÉ}ž%O£ƒ³³³¸¸¸™™‘Hliiés1z»ºº"•GȈ ­­ëæÍÌ¿ÿ^Jçí@þþÏ ªÒÒöÄ4DiiïÜÝc%bcw ÑtM! ЧO5ññ˜””ÂææŽ¥KOZo` "(!fPPKOw¿z5ãÊ•'(D¹¯A ““ ¿~Ũ¬^=gî\éÙ‘ˆÈ”„„] ññoz‹BAuêê'ìì´¶lY:ujß©Å%*:ETtJŸZÃ0\W×ZW‡ÿõ«ùÏŸÿü˜Èü €…X¾&{SS“¯¯ovvvYYe¥u==½¤¤$UUU1 Å߇pFòòò•••+V¬ >)>>¾>OžçŸÒoŸ‹ÑÓh\VvdW¦¡ë éì$üý·=•1˜ÊK—Ò6fø=éèÑgçkëÅ)){@:½ÕÕµeéé]Ð׿˜•õuçÎU……'¢£¬­5@:ÄLœœìû÷¯‰‰q˜Ôc Ž´4CC•û÷ß^VQ9ºwotZÚ»ÖÖ.êÃ/_¶ñõµdgg£~ƒgcc{ùòÐŽ+’’ .}iiiéïÔŒ¡ÇWZÈbôH™²=Æ›”Ȉ†‹H$¾°µÕ™2`e®ÍÙ9båÊÙNNËÛleuãμ«Wm½½×sqÑ?ø‰œ–öÎÚ:`þüã~~OV¬˜õâ…Ç‹ÎÎËEEþÍFˆ®®rVÖaMÍéllÿ¾e²³³éê*©«Ë»»¾xá‘›ëå꺋ÅïÚ9w®—µu@pðK,¶©lg§•œ¼›ŸŸ™k]Ooö´ib»v­ÊÎ>rùò_ÍÍ›7ý“”T@ã¶¥ Çïß¿_FF†››[FFÆÁÁ¡¦¦Ù…B¡ ØÃ =¢¨ WVV2°qÆÆÿãG[mŽ=úë×/ccã‚‚‚_¿~%''ŸCB¶#‹¿”••mß¾zxg<øáÇüüùóãÇ;vì033ìïÔôÇ€,FŸýíÛ7Ê´gð¹y¸îÞ-úõ«içΕôTÞ¿?ŽL†/]²fìT¯_—îØÉÇÇ“šºwΩ/ª««©g;éî&sq$øðøŽ„LDDηoØùóe/\°Z·n>k×ͨ‰ŠN‰ŽvºråñÕ«O?Œ«W«PöÊɉ8:ê::êâpmOŸ~~úôóùóOœ¸«¢"­¯?ÛØxÞ¢EÓ>tµ·¿…ÌÀ¶~ýä@..+«EVV‹>}ª Ï>x0áĉ{[¶,Ù¶m9?ÿH­v0õ["33sÞ¼ya±Ø˜››±:¨ÿ§¦wïÞÛÄÄ‚ÆÆÖwïN±:œ‘Âü5Ù©?úc0˜ÀÀÀ½{÷zzzª««{yy577›šš–””ðóóëëë———#·ÍôƒŸŸß:tõêÕ›7o"uuuUUUkjj„……©ã¡l§½øû`‰‹‹¿xñbÿþýÊÊÊüüük×®½xñ"Aýrý1ô¹=íÆ™„Y3¯ŽOd2yÅŠs..wè©“‡F»ff–06†¨¨YYwk뀆†Vƶ<ÊYXü;/ï”) ÅÄìÅÅ·2õ—gtˆ‹‹cõb”úúõ×þýq =<<â‹‹«Y@Kvö7/4Ú‹ÅÓ¨ÖÑÑýòåW/¯äyóŽIJºhjz{y%gd|´·¿¥¨èÑÙIèó¨ß¿›ŽOQP8¨ªzôÆç­­#s£ =BBB¦NÚÚúÿÞ>p8‘HDZÀ`0Œ ‰± ö×K]]]ï©·3¶;ꓪ­­… èçÏŸƒ •žÆiTëógÝÐÐöÚÈè í*-í*)é:gŽ'=6¬ŽbXLMMÏœ9Ãê(Ƨ¸¸8hØ øB}Xž?/)-ý½kתk–•ýñôLÞ½{Õòå3Õ;‘HöôL>x0ÁÉiytôvaáÉ3ŽÄÄÄ=yòÉÉ)\Vv'­·iÓÚÔT/2™Ìß®1,¿ØÛë×ß6m Z±â|QQÕ©SfoßžôõµTQ™@çc‘¶öŒ—/¹¹­§5S§ŽŽ’·÷úÂÂéén _½*ݼ9¸  J]]>#ã#õíF'N˜½{wrûöe~~OçÏ?~ôhÊŸ?-#v6cX¿eøë·ô€,ÚÝÝMãyC–X¡‰öb/ƒU_ßüÒØøŸ¹szy%¿}û†a † ñOÝ(ÔÞÞžŸŸŸ‘‘A=ñk¥§§£úâååÅêÐX‡ÕçÆ¶ ®ÙÛß°Zw7Q_ÿ‚±ñĨ®±X¼‰ÉUeåCÈ}ÙL~ùòëž=QÊʇeeÝ·oËÈøØÝMdu\ëuw“’ ôõ/HJºXYÝxþ¼dfÈSUUý­[YVV7ddܦM;`euãÖ­¬ß¿›û¬ÜÐÐêëû@Ié²ò¡sç65µ19Z¦è#JMM¥Ñƒñññ™>}z^^Þׯ_W®\iffFÙkll\__Ÿ˜˜AК5k(åòòr†###+**¨ P¯eeeggçÊÊÊß¿ssswuu………iii!öíÛçääD#êá ¤ 4FtíÚµ3fäææ–••S<#ÏRÆb±7nTTT$‘H4bÖÖÖ~õêU{{;%¤>Ÿ‡>Ÿ±þbˆ‹‹kiéŒcnî/%åŠF»JK»IJºôøƈ˜/11qÊ”)>>>¬dÜbÈ ž“ðŒÂÂ*“«ÉÉ»55§Ó®yútZDDvFÆ~yyQÚ5éôîÝ¿ÿåææ uès&Öq©ªª>::ïÞ½¢êjÜ¢EÓ,-™˜¨uc‚ZZ:ƒ‚^„‡g·¶vmܨåà Ã¨ß5`l©©Áed|LOÿ˜—WA¦ætCùkÖÌí= wss{pðËààWll¨ýû ìì´{Ly7 P¨¸¸8ÚÃÈœœœYYY”ÙŠ{¬ß‚B¡0Œ­­­——r»ó§OŸTTTš››ùùùQ(TffæòåËÉd2;;;uƒÁ,\¸°Ïzìjnn¦¬CRZZª¬¬\WWÇÉÉ9uêÔ²²2IIIdý–þb ,^I)÷ØH鑲}Μ9žžžÈ=îµµµ²²²x<ž——wgýÿ©´P(Ô¼yónß¾­¦¦¦¤¤Ô_Ì È…ß”ú|s¡Ñ5‚D"Ož,oh¸ããǦöön66TYé© Lòô4¡ÑÚè~]P°‹²è'P‹·¶¶fFfVº€€LuuùӡׯKoÞ̼xÑšQÑ’’ öïÓÐP Ü<æ nié¼wïmTTî‡?ÅÄø¬¬4,-*)Meu\À¨ÐÞÞ™s󿋦¦6[[Í;WJI ±:(€e¤¤„¶nÕÙºUïÌÌ,IO/öõ}pôhò‚òkת©ÊÈü{k²€¯»»áŽ+ž{{§]¿þÜÃc­…ÅBÆN{3úõ[ÃY¿¢šY‡‡‡‡çß©;hÄÜ{‰Ú‹½Ð@&Ã9úoÞü¡l¡QŸH$<8¬KòXBDdŠ `Ä£€Œhˆ¾}æ§m¡] ‡kÛ»÷މÉ<›ÅÃï”L†}|ܸñ|çΕ‡­egÏ·Á0œŸ_yðà}GG÷òå3oÞÜl` ÂÍ ^´AP[[WHÈ«[·²::ºíì´vìX)!1Ä¿ñ‡ŸŸÇÔt¾©é|‰\XX•–ö>0ðÅ©S÷ääDôô昘¨-Z4 …Bñòr¹»ÚÚjúøyÒL]]žÕá3²~˦M›Ñ AAÁW¯^õ¨ƒ¬²dÉhdÖoÑÔÔ¼páÂüùóa¦¤VVV·nÝ*))¡^¿¥Ïà!­ßréÒ%SSSäðææf:ç_îÏ”)Sz·@#æÞYVÏÃ€ØØP[·.ýûoþ¹M$N½s'ÿׯ&NN¡ïõy¹¹9¿};Gÿ©–––¬çÆóGê”5}º¸¡á\ÚÕöïãà`;wŽ¿Éx|çæÍ·‚ƒ³®]Ûèéi<ŽÓ¡šÜ•+K–œÝ°ÁÿÝ»®®'""¶­[7¤CA)4ô•–Öiÿ§ýµ8?ÿè‰f úÄÎΦ¡¡àí½¾°ðøÝ»{Œç={öÙÌ욦æé£GSÞ¼©€aXRRÐÏoãƒ.ìëÖù99…×Ôô½úÇøÖoþú-ý¡óyCBþz,’’¼îî†̱»w÷lÚ¤- 0 …‚¥º€Ñol­j5> ó>¤‰é÷ïf9¹ý‘‘9´«ÅÄäIK»ååõ{;&ýÊʰK—žUS;ŠÁT ¿µÑ©¥¥322ÇÀà’¤¤‹šÚÑÓ§Ó¾}ò:(`t!H‘‘9óçWR:äïÿt‚Ì¡ 0Ü—/¿.^|´téYIIuõÄed|$H$966Þ¼ã3g‰Íë3s@ôÍÎÿãÇ[[[!!!^^^cccd4‡ÃÁÿÝÖßÝÝíáá!%%%,,lccÓߤ½ËEFFö(PÃ`0©©©òòòÜÜÜÚÚÚ>400˜9s&ÒκuëæÌ™ƒ”û‹!""BBBBDD™ËÙ®««ËÃÃÓÐÐÐ#0ÊöîîîC‡IKKO™2ÅÀÀ€2k€gÔßóÜç^zž7JHý=´»¦Ž¡ÇϺ«‹‘ñq×®Hyùýh´«””+˜Ya4ƒ (33‡Ãáp¸/_¾˜˜˜ £…Œjœ ³Þ³˜Ye.\x™óæÍ1ÎþêTWãôôÎÛÚj;f:Ìî^¿.ݾ=\^^44ôïÞ÷u0 ¿~ý-**7#ã#™ ε³ÓÒÖž1ŽÁ€¡ÉÌürútZYÖÚZÃÕuµ¤ä°®r‚>Ϧˆ IDAT¾~ý}ÿþ»'O>øðSHhòªU³LLæih(\½šüRKkÆùóVrr"¬sˆè™Ya4333ÓÐÐ8rä«hü¬q¸¶ÔÔw‰‰EEßaæýøñ4ó#&䪹q<³B)4~ýú…F£þü)--Mϱ”©Dèi|üaÈÌ àCç µ·w‡†¾þûoé Ãnn±RRB‡ ³»ëןÙÚêëÏIIÙ3ÎÒ¡ªªú3gî/\xÊÚ:àû÷oï >œ ܬ££Ò!€ZUUýæÍÁvvAJJ/^xœ?oÒ!€!”•§º»¦§»åæz¹º®þþ½aË–MÍÓõõ­ÇŽ­ÃáÚV®<ò|uÈd`ýš¼yó’´´}ùùG1RQø6Àr£aU«‰Ü•1h‰‰]]{û%4êea0»sq ý&‘È'NÜ }åæ¶ÚÍÍ`ÜÌ€ÔÖÖ•’R„Ì'*:ÅÚz±…ÅBee0wÐ<¾óÂ…Gáá¯çÍ“KOw›;¼—#BNNÄÑQ×ÑQ·º—ž^œ–ö.)©››SFFèĉ{¼÷󳓖Ó2É£G¶lÙrìØ1999VÇò/CCñžKK íÞ½j÷î×”XëÏŸ?nnnŠŠŠòòòçÏŸMLLÚ±c‡££cJJ RíÈ‘#wîÜQWWçååEƈ–.]ºbÅŠàààI“&Ý¿ßÞÞÞÌÌŒ‹‹‹µ§3V€ŒhpÈd8(èņ ê“û«óõëoŸîîÙ!ºµµËÙ9|ø‡II)Äã;–,Qô÷·[»V•ÆP0Á¥¦¾=y2µ½½ûäI3{û%`ä`ii!$5ªªªðàýƒÈdøÍ›Ê%KÎØÛ/9zÔd8ßst277777guÀT‹-B ȪV lll¡¡¡ÇŽ[¼x1A~~~***x<žŸŸ‚ WW×¥K—R·ŸŸOYÕJGG§«« ÇÓ¸š þ²NffIee}HÈßýU H{÷FÏ›'»k×¨¨³³ "I÷ï»Ìœ9æ`Åã;’’ cbò>~¬‘—ݶm™•Õ"°h @Û|ð`ÂÓ§Ÿml9b$"2…Õ޼¼è®]«víZUSƒ»w¯èÖ­—!!/#"rÖ¯_`eµHSs:Û8·`4`áªV2¢Á ÊÒÕU¢q‰W@@æ·oØ'OöùÍ27·ÜÑñ¶œœHX˜£¸8ßP#e="‘üèч¨¨Üœœ²I“8ÍÌ\¼h­ª*Ã글QL†ž_¾œ!%%˜šºO]}´\3LXRRB;w®Ú¹sUBæÐ¡„û÷ß%$`&«YX,DÖ5buŒŒy,\Õ €@F4(Ÿ?×¾zUµ½¿ %%µ—.¥{zšLŸ.>´. öï[»VõÊ•¿ÆîÚ;ß¿7DEå&&üùƒ_ºTñÆMúúsÀÕqÀ€~ýj:p >3ó‹½½¶——ÉäÉܬŽþÇÒr‘††‚“Sxeå“y_¾ü23»&%%dh8×ÚZCEEŠÕ0Þ «ZÍœ9S@@€öªV¢¢¢Ô«Z={‚ ÆÆFpÕÆêgn– y¥¨(±bÅÌ>÷¤={¢.”wtÔBã0 Ÿ=ûàÆçcw…ÎNBZÚ»ÄÄ‚ììo“­­[[k̘1Ää˜h^½*ݱ#‚——+.ÎyéR0ÜŒFrr"÷îí=p îÎ>vìXqäˆñhÎ+êë[ãâòïÜɯ¬¬SU•9qÂÌÔt>˜á–‚‚ÊM›‚ÔÕåCBþž2Ì£Œm+VÌ °wp6MtϽÞxy¹¬­5¬­5JKÇÄäGDäüóϓŋ¬­5ŒÕÀT",2¢……½ž5 ­¥5½÷®³gÓðøŽ³g-èo@ 8—’RtåÊ_VV}ÏÓÀr”;…ÒÓ‹'OæÞ¸QËÂb!ui€~Ÿ>ÕØÙÝÒÒšê&$Æ•óç­ˆ— ñ‡]Iiêñã¦G®ËÎþ–€9r$ÉÃ#aÙ2e ‹…kÖ¨rpô\o` ‡k»wïíÉ“f½wåå•GDä\¾ü—„?­µ¶v9:Þ.*ªŠŒÜ¦««ÌÐH£¶¶éöí×ÉÉ…¿7/]ªèïo·zµ Óæ­®®ÎÉÉaN_Ëï+øô©ÆÜüº†Æ´¿™œÅÇÇ3³;`”`ÚkÞÖVóË—_ġѴg ecCéè(éè(>mþøqqbb³s„¸8¿±±š­­æ¬Y’Ì  ÷ àÆçþþÏ ÷¸Õ§³“°jÕ…3ÄÃÃélª¾¾ÕÞþVuucDĶyódG Ø¡#‘È~ˆŠÊÍÉ)äµ±aÍâªÈ• LîtBaíï;Ûldô-ãÄü+…À¼Þ3_óD"ÙÞþVqqõÓ§û%$±Aqqu\Ü›””¢æævmmE ‹…kÖÌ×'¸ !÷Œˆ‰¬¥uÚÈHíøqÓ»Nºó&+ë¸8=MUVÖÙÚ²±±Ý¹ã$'7ŠV4¯®Æ…‡g'%`±ø¥Kíì´ T¸¸X3xÈ×4Ð'–?·Ý6ø·µuÝ¿ïÂÏ?‰ù P¨¸¸8–’LÃ’×<ß©¯AAAìΧÁ&á)#ãc|<æÅ‹/ììl«WÏÙ°A}ÅŠYàâR°´´LLLduÀ¨fVAÏŸ—ÔÖ6mÞ¼¤Çö÷ïÞºõÒÇÇ‚ÎtèÇŸ›6Ý’”ŒŒÜ&&F×!#H$?zô!**7;ûÛÔ©7jš›/s#„D"oÛVSƒ{øÐ%é0??OPЖuë®dîܹrPÇrr²©©ápmiiïSR ·n ˜db2oݺùšš ììàF#`‚rssC†‰`„€Œˆ–ÈÈ¥y@rs‹ÕÒš¾q£&=<{öÙÉ)\SszPÐ^^Öϲ]W×’€‰ŽÎ«ªª×ÔTðóÛhd¤Æ´;…€‰éÊ•ŒW¯J££·KK3{‘J`255—ÕçÎ=\¶LyΩ!´ $4ÙÞ^ÛÞ^»¦—’R”’R™#"2ÅÐp®‘‘ê’%Š`Ô˜h´´´´´´X0žÏÁýúñ£áùó’Ðп{l |QQñçÖ­ƒô\{øp¢••†¯¯%k碒’²·×67_8uê ®t€¡yýºôŸ2Nœ0£}»9Œ{öè={öyß¾;¹ '{‘’Ú½{ÕîÝ«jk›>üðäÉ'{û[ì::JÆÆj††à^#ÆQ¿"#s¥¤„ôôæPo,+ûsñbº‹‹¾‚‚Ø€-\º”~ùr†›Ûj77ÞÕÝÔÔ‰ŒÌ©¨¨[²D1 Àž™‹¦Û¼cG¤©é|GG]VÇLÂÁÁæç·qåÊóÙ xå£Ñ‚ŽŽºŽŽº?6>|øáÁƒ®®1žžIË—ÏÔÓ›£§7[Xxòð{˜°@FÔ·înbLLž££.õò©0 {xÄ+*JìÞÝÇ|Ô`>u*5((ËÓÓx°—’3 ²¦PpðËçÏK$$ø·n]ja±pPÓÀ0Á0ìê;içٳ欎˜JAAlçΕçÎ=41™Oç§ô‘vrZîä´‹mNOÿøäÉ'x"‘¬®.¿zõ}ý9ŠŠŒê `âQßÒÓ‹[Z:mmÿßE«±±ùoÞT¦¦î£}ý‘Hvw½{·ÈÏÏÖÜ|áGÚ‡††ÖØØü;wò«ªêõôf߹㤭=Ü’ 0_TTî«W¥ÉÉ»xY 0ÛÞ½z‰‰˜ ]¸Àø%$6o^²yó"‘\TT•–öþöí×§O§‰ŠNY¾|¦¾þœ•+g1Ž{€1 |Jî[ddŽžÞlê/ö°Øæ“'ïmÙ²tþ|ZK µ¶vÙÚÞLO/މqfr:Ãð«W¥NNáêê'oÞ|±v­jvö‘ðpG¥ñ—áñøýû÷ËÈÈpssËÈÈ888ÔÔÔ »P(TAAÓºc #?xð //occ#û UUõ'NÜÛ¹så¢EÓXË 0ó¥5¯U–÷Èü“µxx8X›_Ròkäzáà`ÓÐPðö^ÁËÌôprZþý{ÃŽsçµ¶~‰Å6\ïã#êCEE]NNytôvêÇßœ|ø°Ûìì‚~þlŒß©¦&3ÂaþOSS{ttn\Ü›òòº¥K¯]ÛÈÂ5…˜€L&¯]»…B%&&*((ÔÖÖikk—––rs3þ;Q&wGõkײ²²„……™ÙéÐÀ0¼œœœˆ»»«c„Ñó³Æ ‹…aa¯}}п–÷p(+OUVžºkת††ÖçÏKž>ý|þüÃ'HëëÏÖן3w®4Xª ·qû¡yPîÞ-Z¶LYHèß;SCB²deE–-S¦THO/NM}µÆôÙ¿~5ýõW`kkgròn¦]ÉýæMEHÈ«ŒŒ“&qmܨec£1}º8sºf¡°°°òòò²²²É“'C$&&výúõ3gÎppŒÈë™ÉÝÑÐÙÙ©  ÀäN‡&<<'?¿"5uߨÊÌGÏÏšP(T]]¨hÏÕÆúÛ0 …:xpí_Ý,*ú¾`Óú™bi¹ÈÒrQg'ƒ©ÌÈøwéÒcii!䚺eË”ÇÖï&ÀˆoS ÍÉ“©jjÇo?^ÒÞÞ‡ioïÄ`*‘½x|Çáɦ¦óW®œAPGGwï**êLMýH$òÝ»{™µµuEEå^63»ÖÔÔîç·ñíÛ“žžÆ!‚ (::z×®]ÈgV AAAvöÿM G$½¼¼dddDEEmmmí(*66VZZšïðáÃ111h4šŸŸßÝÝR!**Šº@»; •••%++Ô_õõõ=Ê(*99yÚ´i‚‚‚VVV”Ê(*--MZZZXXØßßÙA˜˜X}}}g7JTUÕŸ>ê켂ö%¦£“_Z½½{÷NOOOXXxÒ¤I***ñññ]¾|©——'**ÚÑÑAç‹úeCÝõv†}}}§M›&,,liiIÿ ˆv }ž,@pww—’’ æáá)((è/Â1aÙ2åE‹¦]¹ò˜%½óðpêè(!×Ô%'ï^·n~nnùæÍÁ œØ½;*1± ®®…%Œ.0Ã3g–”tA£]%%]fÎ<,/y¸gOT]]Ë‘#‰sæx64´Â0ÜÕEX¾Ü·¨è;õáÅÅÕªªGõõ/ÔÕµŒt¨Ÿ>Õ8§¤thÆ âÞ¿ÿ1Ò=2S\\=¯I!!¡ÔÔÔþöB„Á`|||¦OŸž——÷õëו+Wš™™Qö×××'&&B´fÍJ¹¼¼†áÈÈÈŠŠ ê€Ýikk¿zõêØ±cýõXWW×£ AÐÌ™3óòò>þ¼dÉSSSJ䔚X,6))‰ƒƒ£³³“úðþÎŽ:ŸÛá#“ÉþË—ûvu˜Ðý Š‹‹£]‡É/-êŸ8BYYÙÙÙ¹²²ò÷ïßÁÁÁÜÜÜ]]]aaaZZZH…}ûö999ш¡ÏõFêײýÚµk3fÌÈÍÍ-++366¶°° óŒh®A¶äå•++²²ºÑÚÚ9r¶·wEFæ\’”tÑÓ»™ƒÇwŒ\w¬Bç'ŽììlÊCJzÃáàÿ>)**†‡‡#>~üAPss3²733†a‰Ô£Üã³)ýÝ%$$À0L£Ç>?¤†……!ß½{‡TîñQ2%%…[¶ýõEÓ>ÆÆæKI¹æç÷û‰™UèɈ˜üÒ꽫©©‰H$"å¯_¿"?ñ¦¦&žêêj‰„F£³²²ûb£Íž=;::ÙXSSÃÎÎÞÖÖ6´3êÝú:ä0pç°êãK ÐÐÐPóƒA£ÑtuuUUU³²²\\\ØòSVVVééé111ŽŽŽ\bhïb«®®æ¶ÝÅÅÅßß?===''gùòåÆÆÆ¿rκŽãÁ.Z´(((èÍ›7YYYØ ‚ð*ÂD$âõ/_~ÙØÈíYX€Ã!ZZ îî3bcW¥§o;|x¡ŠŠtLÌËùóOž¸qã•›73›š8Ì0A4€ñb¨^ÿRWGa‰¨½ÿÉË{µÝ¨ °aÒ¤_¿vð KEEýŒûäå½de= w±D£1®_ϰ³;)'ç©§xâÄÝòòº^8Ü~­óãþ ÅÅÅ…„„æÍ›‡=&gÙƒJ¥úøøÈÉÉIHH888´÷EÛ2 ""‚½Ð™æ˜Lf{-^ºtIFFFRR›^ŒõjÇîÝ»GŽ)**jmm]^^Î=¶V/„´×VœÛ®ùö­nôè-þþW{¯‰nxˆÙ·—V«ßÆiiiׯ_>|8??ÿ”)SnÞ¼9kÖ¬Q£Faû±´´ÔÐÐÀÊ¿t± TVV¶ ŒµJ¥úúúÊËË‹ˆˆÌš5‹5kB‡GÔÞyîð[\¶¹¹yÕªUâââ#FŒÀæ`x÷î]{r×Þ#”—×))yGF>ï©ÚØØôø-x¼˜ÐX «aÃÖàñ"}Ù4Ô#zꃠA avÔ=2èUV6ŒÀ½€CQ€¢×8%%©ë×=X˵çóçovv'++Xƒô®^]£§§RRRö,>>­²²aöl-''}Uîw\DïÊ•+ööö¿Ã5‰ HZZÚ¤I“ú¬ÅÞ>·Ë–…}üXrïÞFAÁv×ìâ-AbccíììxHÍŸ?_WWwË–-¼¤ï|üøqìØ±’’’]øz?ü}²fMäçÏßnßîìôåÜÙÚÚ{zzöÈÞ:¯¹™! ð ## žKMM=räH¿úo‚ú›:¸¥µ´Ð¹W@dÔ(Ù¬¬2ŽŸÒéhnn¹‹Ë¹øxw~þvÏ狹ÎÎg››i¬qwîðá¿¥¤Dþú+sÈ{{]''ýáÃáj‰ÐÀsófæÍ›™—/¯è·éЀÖÔÔôþýû¿ÿþûèÑ£¼Žå‡”””Ù³g·ÝîççÔ=khhÌ;7  ±±1 ÀÄĤkéPÿ´dÉT ‹£¯_™8±gVk•——¸I>Ô—Ž9Âë ¨_ƒ RÛ͈p8AÀ¶mó÷î½ÉÊdØññètÆìÙZ«VsI‡®_ÏX³&’Á@ÙÐÐéè³gŸgÎÔˆˆXöÛv ±TU5~ùR™‘ñ‡ë «mpLÏêJJª½½c]]§L›¦ÎëX§[·n-^¼xëÖ­JJ=sÝ}æææ½t ÇÆÆ®[·ŽL&3™Lƒ3gÎôF+¼2qâpMM¹ÈÈç=•AA=fD?õáp6:Ž@ÀóñΟ_’ššÓÒBcÿ ‚ „„øW¬˜æìl0tè.û?yò~pð @Ûû7a‚’¡!'Mª®nlhhQP胶(jaaUaaeaaå…ª¢¢Jlæ=||Ãú ¨§Ðh 7·‹ Û·Ïçu,ƒ–µµµµµ5¯£è#ššš÷îÝãu½háÂÉÁÁ7vìX'Ë ê?`FXÙ‘ˆçç'644œ¼¼øåË+DD/>ÇzóÇ¡(*##ºzµÉÂ…“¹¯A„¢Ì­[¯]¼ø¤½g©t:ãÂ…'îî&x¥Ó™«V›˜ŒîÌß°ÆÆ–¥K/>~œ @»ù‡àñ8:qéÒó¾Ìˆ¾}«;qâ^DÄseÒé ‚ ùùÜ¿Åd2±AnXÂóí[í·ou……•¥¥54Ú¨¢2TIIÒÐPÍÉéGæ3l˜—׫ íýûbw÷ˆ¥K &ó:H/žþüÙ³ÏS§°uf!‚«ŸîV±¹Jy ¯ðó—°ÌÏ´´L3©«{ìïÄßDE ……µ)”œÆÆô„„ò„„N퇒°"eØ72™ ¨(Jg2©(ÚŒ¢ÍL&E©L&õÚµ'²‚KîÔ666qqqX¹m.ô_l̼¼ÿgDõõÍùùðfd¤Æð&&&ÔñCýS]eõêMMù€K^ÇAŒšÚ°É“•Ãß÷YFTWW·sçÎØØØòòò¡C‡š™™íܹSNNôÂJ}¿´@´H¡P‚‚‚bbbJJJÄÄÄtttüýýõôôz¯E‚ú‡ç÷Û¶mëû8x¨ €F¥2ÕÔþLKkVT$ÊÈX` ÑÀÛ·Í£Gó‰ˆè Óù–—3š›Q>>„G „Hì°ci^·Ž¡æB,¥¥5^^ÑEEU……U¥¥5ØÄz‚‚|ŠŠŠŠ’3gj`ìÿ¹¿=Õ}¶¶¶½ºÿßSqqqOíª¹™æêz®±±%>~õÀýxøðaÖ¿ŠNGø)¼¬lcÏFõ’¼æ{œ««ÁÚµ‘ee5²²¤Þn EÑ9sæ ¯¬¬\ZZzæÌ™)S¦dggóó÷î/óAÃÃÃ#55õÂ… £G®­­½r劉‰Éׯ_EEEyA=ƒCF4}úô>ƒ—(º   ¯ÏàçÿéöÎÔ”G1õ‡R©ø€€k‘‘Ï ι†FcäåU¨¨ÈLª¦¤$©  ©¨(!-Ím½Þ   ÐÇ«°ÿ>äåå{äÜR©t—³ùù‰‰22bÝßaŸéÂáS(ĺ:b}=}=…Bd2CF¦ ‡<“§b=uÍ÷†9s´¶n¾|ùņ æ½ÝVXXXnnnNNް°0@ZZ:$$$88˜@ÀC𩍍’j½‚_{Û»)!!áòåËÓ¦M :ÔÏÏÏÝÝ;Ÿ øbOÁÒ!@«th kj¢UVËÍ•IK{Ü™úþþ“&èí¨¸Ó××ïò#|¨ (ÓË+&#£06vÕ€[M¸3—VeeÃóç9¯^ågf}üXÒÔDä›4i¸®î--…ñãûþ14(‰xGG½ÈÈTÓÞîhŠŠj{ûN"ýÔ7E§Ó·oßN¡PÌÌÌŽ?Ž-Œ‹ Htt´··wmmíš5k´´´6lØÐÐаlÙ²ƒb"""œœœX…¶¼}ûÖÛÛûÍ›7 EEEeëÖ­vvvsçÎ1c†——àÅ‹óæÍ+** æ+ÉÁÊÒÒÒiiéVÉ6Û.))¹wïÞÓ§O×ÖÖΘ1ãÔ©S<"Žøøø¾|ùÂñ¶ OJJª3çKŽg ûÖÇ‹ŠŠ<È~öÊÊʈDb'/ ‚ÚâͤÏP¨¨hÂáPqñfÖBC||<žóè=A «ú0:hàa0Ðõë/߸ñîÂ…?'L$ëK2hffѹsW¬×ÖÞ6vlÀŠáOžd+)Inß>ÿÁŸOŸvÇÆ®Ú°ÁÜÔT¦CPrvžòý{CJÊûÞn(##cܸqÜë8p &&&>>þùóçß¾}sssc}õîÝ»°°°={öDDD¼ÿþâÅ‹‡ÊËËDDD°ÚrppPUU}óæMAA§§§‹‹ •Jµ³³‹Ç*ÄÄÄØØØ=z´½ZÁVnÛľ=$$äüùóÑÑÑiiiÍÍÍ+W®ìäqäíííîînkk{éÒ¥ÒÒRî'³“­p©ÀñŒaßÚ²eËåË—CCC[=˜AP7Á>¢AKIIL\¼\ZšwºººñíÛ¢·o 32¾¼y󥪪‡CˆD<•ÊÀþ„‰¸.OÀ ýZZèË–]|ù2/6vÕäÉʼ§[ªª_¿.xõ*ÿÕ«¼þ)mll êèŒprÒ×ÒRÐÒR‘ï@½ŽL&ºté™…Åø^m¨¾¾ëÁ°Þj­®®fut\¸paëÖ­“'O;vLSS³®®{IfÆ ’’’ ,lÚ´‰U®ªªRVVfu qì¼|ùRDDÇ [ZZêêêæÏŸ¿råÊ’’YYÙ¸¸¸èèh77·öbè‚ÐÐÐ;v`“œ>}ZQQ±©©IHH¨Ã#â¸7ooï)S¦ÄÇÇ8p`ñâÅÚÚÚ{öì1å:°¾ÃV¸TàxưôÏÓÓsêÔ©cÇŽõôôd?{];K±ÀŒè· ..ll<ÊØxöciiMFÆ—·o‹^½Êûð¡„B¡R©ŒÂB˜Aœ56¶¸ºžËÊ*»reõ¸q ¼ç—¡(óÇbl,\ZZ>–ü+)Iê茰µÕÑÑ¡¢2”@€æP_[·ÎÔÂâèË—y½ú”L&gggO™2û±ººº©© ›hŽ¥¨¨HEE+c…âââ1cÆDDD8®U¹ójjjöìÙóìÙ³œœ5µÓ뉉‰Íœ93!!AKK‹@ r‰¡ òóó-Z´hÑ"Ö–ââb¬õ.QmmíäÉ“±sXVVdeeUTTÄžj¶Òa+\*p˜ýŽÈd™Lš;wE™¹¹åoßb+ÕBP+õË–…}úô5*jùJ‡jjšÒÒò±Ž ¬¬Ò††~~‚––¼yãuuGhiɬi! AiâÄáúú*GÞ¹|yEïµbiiyòäIggg¬ÏD"=yò¤Uyyù¼¼vl‘ˆH\·¤¶¶ K^½Êû¶°¾¾™0nì‚ ##u--…ûgÏ.î¥&†úüùs___33³––“¸¸¸V/Ìøøø444,X°€5Ï['wîìì1bÄVüü3--íôéÓ~~~'Nô÷÷¯­­µ²²ÊÊÊ555ÍÍÍÅ&~h/†cÇŽmܸÑ××÷èÑ£§NÂ6iii•””HHH°ÇÃÚ¾yóf …²`Á‚ššƒ„N®°Þ޽{÷Šˆˆ`/>ÉÈÈLŸ>ýúõë\Âë¦öÎ{Vg‚ nêJF”’’RZZ…õä’H¤õë×»¹¹a=ò=_‹dÿ±pì@û‡ .hi¡%_¸ðdÙ2#ËþóŽ “ÉÌÎþ–––ÿêU^ffqnn9ƒJKÑÓSÙ¸q6ì‚"oosW×s¯_Lœ8¼—šPPPˆŠŠbß‚ ôb/ìÙ³gÏž=­¾Èú´½2—; VyöìÙ¬2‚ ŽŽŽX™H$rŒÁÙÙÙÙÙ+³Þ zôèÇÀØ·ïÞ½{÷îÝ¿zD sìâ^çÏ[{eŽg¬Uìg‚ nêJFtçÎùóç³l?ç-ƒvûöí––lÆcc €ÐÐÐÆÆÆ (++‡††R(”¹sç®^½«°eËSSSV¡½0Œ9²k×®©S§|þü¹¥¥…L&»ººb‹Ì>|¸¥¥eÉ’%Ø,.ÿþûïñãÇsssI$’³³óܹs±½åä䄆†¶Ú ö kþüù‰‰‰m+`ß}òäIdddCCÃĉ===Yƒ ˜Lftttrrrccã„ ¼¼¼ZM›Ã¾QQQŽ•;—ÊÜÏX‡g ‚:£¤¤Ú×7îáÃOk×ÎôòšÕÇ#å(jzzÁ«Wy¯^å¿{WXW;‚ ßÈÈ‘C&ïÛwËÂb¼€Ào±Ô¦µµµµµ5¯£¨àÙƒ וŒHRR²¨¨HCCû199¹¥¥ÅÆÆ†½Nyy9kÞL¬PQQ=Ìÿ-Ç^î@CCÃåË—?|øPRR"//Ï^››…}ÿžžžÇ‹‹ÓÖÖ¶°°`—tXµ°¶P@UUöãׯ_ƒ‚‚Ø/UTTpÜ9÷Ê=xÆ ¨-:=wîñÁƒ)ÒÒCââVëéuÐÜS>}úŠÍ ÷êU~^^9ŽJH¨z{ÏÖÒ’×Ô”âë›H ˆç6nœ}ýúÛ}ûnnÝjÅëX ‚~;]Ɉ ’’’ÌÌÌX+‹eff¶ª#--]ZZŠ {ÃwqYȬ˰ÄÀÃÃc̘1+W®TUUe2™fff­*°ÓÕÕÍÍÍ}òäÉúõëY+=sÙI‡JJJ¤¥¥EEE‚`e€¤¤äêÕ«±Õ˜Lfcc#—i!~©2uŽ®[µt©Ñ„ ÆW}ú(^‡Aô{éJFäââ²|ùòÍ›7ckýóÏ?‘‘‘­êÌš5+""BQQQDDäèÑ£úúú¼¿¿s玦¦¦¬¬,«ÐáW ÆèÑ£ååå¿|ù‚ER__ßÞìmnnnS§N]¸p¡ºº:“Éäããëp'XK…3gÎx{{#røðáiÓ¦±FâÍš5ëüùóRRR"""ÑÑÑŸ>}:{ölÛ°ýt²2ý:]·îòµkoP”êÂþQuuã¾}·""žOª¹lÄéÞ mG¸¸ð¤I×-›¦£3BCCNX¸?Îë A}ÏÒRûæÍ÷^^1lƒ+L@õ®dD$éĉgΜٸq#•J0aÂöíÛ[M¹páB …Àšk®“;ßµk×–-[deeY…¿âååuüøñsçΩ©©9;;766úùù…‡‡s¬¼qãÆ'N\¿~]JJjË–-¬ÉßÚÛ‰––ÖÒ¥Kããã¹´bmmíããÓÒÒ2yòäuëÖ±Úrttlii hhhÐÔÔܹsgÛxXûïLeú%4cùòð»w?nÜxëçg!//hj¢ž=û(4ô¾  Hˆ³••6û·˜LæµkoæÏŸÐµi¯ZZèïÞb)PffÑ·ou°#‚:i÷nkcã½Û¶%9gU† ê;ûôöW®\±··Ç&@ƒíÛ·KKKÇÅÅñ:ˆZœœN¿ySH§3D"ÞÉiJ@€ÅùóCBî¸M›æØÛë¶&—“SîíûêUÞýû›Fêì¼……•/_æef§¥åÿóO Ž’HB::#tuGèèŒ3F®.ð AýÐ_½[¾<<4ÔÅÒr<÷š¶¶¶ÅÅÅžžž}4p¥¦¦9r„ûšKô›ëJAý\]]³£ã©ÌÌb,ÐhŒÈÈÔ»w?~ûV·x±‡‡©„„0ûWš›iÇŽÝ=~ü.‚<÷úu—ŒˆJ¥¿}Ûº#häH]ÝK—ÂŽ ê²¹sÇ­\9}ݺ( mmEî•_¼xaooß7A b0#úÝ¡(37·üíÛB*•¾h‘>¯Ãz@UU£MHNÎ7:eßÎd¢ââB k°±sì’“ßnÙrµ®®‰Á@îÕ«üV×CqqujjÖ”•UJ£1ÄÄ„tuG89éëê*¯8dˆ€ ¨Ûüü,rrÊÿüóü­[^Ƶ;ï<ìÿ‡ ê)0#ú•–Ödd|yû¶èÕ«¼J(*ÀÞ^fDƒÀ·oµÖÖ!EEU­Ò!ŽVJIý4ÇIqqõæÍñ÷ïg!@Q&«æóç¹m;‚QUýѤ¥¥0räP<¾O—-‚ ß‡„„8Ï›wdÙ²°„w>>ø—‚ ¨wÁß³¿l¾¯ÌÌâ7o ²²Êš›i8‚ Ö!àã#ÀaNƒ@YYÍ‚'JJªYÿ²­Ô×·Äǧ;9éh4ƱcwNœ¸‡¢€Él=¼¤¤zìØ€úúf"?v¬¼¥¥öĉJ“& “I}p ô›á?}ÚÕÂâÈ–- û÷ÛÁ5è ‚z̈­/_j««‡VVŠOœ¸½¬¬€Ç# ÆÛ^eðÿ[`¡¨3¢­´´fþüceeµí¥Cƒú`Ñ"½7o¾xyÅææ~cõ µ5w 'ki)ðóÃ_Ô×ÔÕ‡>½xÉ’ó||øà`k˜Aõx£3hIK ¡(®¦F€Á¨Å¶°Ò¡¶˜L¦¢¢D_…õ¼/_*,8^QQÿ_:Äàÿ÷Ox<ž@@P”I£¡ùùvv'Ÿ?ÏÅãq\Ò!"'-=DGgDïÇAgÆÆ£.]rsu=G¡ÐtèÚ„øAP‡`F(º  ÐÒÂàçÇwX "JJ~UUEçÌYsèÐíúúf.]€  **C%””$$%¤¥‡ôM¨‡JMMí›¶% …øþ½Æ~õ"Â$˜C@€A$¢||(‘ÈhiÁ—— ={–`MCÇަ¥å÷rà|ØçaðRA­±ÕÐàù²yØ0‚’ÒsB£·o›GæùµwÇËËÍÍ(ÂLJ#€€B$òf¼CEE…´´´››‘££ÞåË/¸äE||xee©ÂÂïOŸf—–Ö`uù%%%Ù3%aá^[&55õÅ‹zzz=»Ûߊ"ååÂC‡6a9ƒHD‰D”HlðP©øÊJA™ÆœœÒQ£&64€ªªFìý!"‡Çã™LÐÒBÃ*3™Ì·o  tϯ§§'//Ïë@ P\\üâÅ ^GÑ+¦MS?qÂiÕªK‚‚ÄÀÀ?`RAÔã8¬ÐÊÃhx‚Ÿ¸„„eUÕ5<^LL̤®îqcã[ì#QQCaam %§±1F+ïäq8! +"Q†}#“ɀТt&“Š¢Í(ÚÌdRQ”ŠýØØø†ý­ždccÃzhÚØØý’c^¤¬,ýôéÖµµM_¾T~ùRYXXÉ*ÿx_Ÿ ++¦¨(©¤$©¤$‰FŒîòäËØ£úÁ÷p·ßB$66ÖÎÎŽFc”•Õ””ÔW•”T—”ÔäçWU}ýZK£1wîxkhÈñ:ÞÞÂ:¼êØß¯A¼eròÛ5k"ÍÌ4_$ @äu8AƒÊO}Dvvv¿áÍÁ³g9¶¶!rrÇ;¹¹]¾hÑú£Gˆß¿7èêîD5AA5==ew÷&&£;ÓÝÓØØ²téÅdzYy‚àij kÂá<G§3LLÆDD,륣c',Ìïæf´páä°°§GÞ¥P¨X†ƒ `ÄiöšbbBZZBZZ ìi4Fii +Gúö­öË—Ê'O² «°»11!ö +Èɉƒ¶“a #ñX *­>ªªj,)©:T”'AÔŠ…Åxqqa7·‹66!/.í³QÍA¿øÀÞji¡oÝz@¥ÒoÞÌ,-­ w“’YµÊøøñ{t:ãÕ«‚—/ÏÉÊŠ­\iìè¨'$ÄÇeŸÂÂüQQË®†‡?oï™%Š2Q”ps3êãâ›»ûŒE‹ôOŸ~xæÌC:EQ´3So‰x,Ï14üi{K ýë×ZöÞ¤'O²ÃÃËZNRRDFF¬U¦¤¨(§NêÏ$$„%$„yAÿ7uªjbâZ—³ææ‡.^ü³ÕC+‚ ¨Ë`Føù‰eVTÔ‰x*0hff‘‘ÑžÈÈe+VŸ9ó˜Ng ( (+«Ý¾=qïÞ¿ôÜÝM¸¬&ŽÇãví²QVºmÛµöÆq ——02Rë#ã†Dòñ™³|ù´Ó§ž;÷¸;‹ñóÚfJt:ZZZ]XXYXX…ýQQ勹õX a,/RP¬ª” tóˆ ‚½Q£dSR6¬Y9þñìÿøc"¯#‚  `FXËÓh Åá°IеµMVVÇrX½ÚøðáÛt: À…,©ááÏž.X0ÁÝ}†ºú°övîæf$..´~}4“Él;Ó1‡[²Ä‡]%ââ¾¾sW¬˜Žõçô ÷ßp¬Ÿ45Q +‹Šª°Þ¤Âªû÷ÿAP'IHGF.?|ø¶‡GÔ“'Ùˆˆôðl7A¿˜öÕ'Ù“EQàáqyéRC¾††föoa3_»öæêÕ׳fiº»Ï˜0A‰ãþ­­'ÉȈ-^|¶¹ùGG ‚ é""ü Lèñ Ü:O\\X\¼ÆG ñ%;j”,ûF8 2APçápȆ æ&&cÜÝ#¦Oßsü¸“¾~ëW!‚ Îƒ¯¼ÿ”µÂd&“yáÂiiŽÃ¹b0PeÞºõ~Û¶Ä–z{û™:UõÆ O aö9Ü´ijjj2þþW'O ¼žŸ_ÑÍcôêêê¼½½øùù–.]ZRR‚}„ Hzzz¶Õã;ì‡-r‡¢Ìââj^GÁ{ðªëñ&èt:‚ ß¿ïÕv=mmÅÛ·7L™2ÒÆ&$ à6?$AÔ0#úÿ¨¹ö (³¨¨A8¿ D ൵•bcWqɬ£FÉÞ¼é)//A ü˜oŽNG==g…„8¿èë;÷Ñ£O»ÌÍEF¦R(Ô®Ëà†¢èœ9s^¾|_\\|ãÆ )S¦´´ôð?èãÇ’  äI“vìØ‘ÄëXx ^u½ÇGDD gKë®!CŽ[´¿]tô‹ùóee•ò:"‚  fDgD:¢€Ö/üø‘çªøY IDAT#‡FG¯ä>õF^^üúõu£G#ð‚¨ªÊ`í† prÒ¿{wcJŠ—––ü¶m‰ÚÚÛ6mº’•UÖ¥´ÂÂÂrssSRR&Ož,--=nܸwïÞxðg{OÊyò½ àûáÃO™ljzàÌ™‡_¿ÖÞÅ]: ^u½€““??|û¥g8:êݽ»QPÏÜüÐîÝ57ÓxAÐ3"ÐÉ¥î˜Lf«ET œ¤¤pLÌJQÑήL*%%ríšÇÔ©ªL&séÒÖ“nki)ìÛg—‘±Ýßß2--ÆŒ}X—ü󆉊Šrwwþé•'‰„g[æ‰N§ûûû+((HII9::VVVbÛ‰‰‰‘——2dÈæÍ›£££Éd²¨¨è† X"##Ù m½}ûvæÌ™‚‚‚šššW®\Ì;÷СCX…/^HIIQ(”öb`ÝnbelR iiéV·¡ìÛ™Læž={FŒ!!!akkÛù#ê¼üüŠƒS¦NÝ=eJðá÷ ¾°©D xÕõÒUÇ Aäädyyy ‰'NÚkâbøp©øx÷'œ._~¡¯|ëÖ{^GA4ÀŒ¸g{#ñx<¢¯?’U“@ÀKHˆTW7ýêèm!!¾K—–-[6­½YSEEœô<ðIL\«¤$éç—0~ü¶M›®dgí|+ƒRFFƸqã¸×9pà@LLL||üóçÏ¿}ûæææÆú(**êÝ»waaa{ö쉈ˆxÿþýÅ‹:”——ˆˆˆ000`/´åàà ªªúæÍ›‚‚OOO*•jggUˆ‰‰±±±9zôh{1´‚­UUQQ!%%ÕÞöóçÏGGG§¥¥577¯\¹²“GÔ¡oßêBBîî60Øuôèì56˜µ¯ºž½ê8 yóæÍ¹sç<==[ZZ¸´qga1þîÝ'*¹¹]twøúµ–×A H{ë‡þV””¼¹g5&(íÛg§¬,­£XUÕ@ àDD®_÷¨¨¨_¼øÜ˜1raanï)ú%ååõqq¯""R‹Šª¦NUurÒ77K$â;þæÀÍ5ǽ‘H|ôèÑ”)S°YÙiuu5‰DB$--ÍÑÑÑßßßÅÅðñãGMMÍÚÚZQQQAnÛ–XQQïá1sÅŠéAô;ƒ¿%€HijgD°¿ª8NT”_Jjˆ½½î˜1d€——©ŸßU~~b|üj•¡**C=.SY)zíÚk …†Ã! çÁrÚÚJ¯_oërsý\gG†W]÷¯ºµú‡èãÖ+>>‚»ûŒE‹ô¼½té…±cå7ož;u*L,!‚8ø-î¤;$ ÀG àÍÌ4"#—¿y³H$HI‰\»¶æÈG))oos)©!>>W||„›7=µµÙ¿®¨(yíÚZ!!þ Ž÷öq22bîî3^¼ðŽ^) @\¹ò’ŽÎŽàà¿Ãº1eeeóæÍKOO/++»zõêŽ;ZÕquu LKKËÎÎ^»ví¼yó:y/™ŸŸÏ^444Ôü‡Á`Ðh4]]]UUÕ¬¬,lxRUUÀÊÊ*===&&çÓ^ $)))©®®.88˜½éêjÎÿvØvÿôôôœœœåË—ÿÊ9kSYYtÿ~»ƒÃ–ZZjóñp8‡ë8CøÝÀ«®G®ºVŽrï\ó¿)I(0pÁÍ›^ââÂvv¡‹Ÿÿ÷_8‹)APk°¶m³œ6M]\üÇtRŽŽº‰‰ÚÚJØÄìmmO^¿þÖÒr¼  ‡‰¶edD¯^uwv>gm}""bÙĉÃ{5`<‡u|Šzó’Õe4gŽ?8Ý¡C‡>þÜ×××Ì̬¥¥ÅÄÄ$..NYY™½ŽOCC (Š™™ÙñãÇ;¹sgg爈ˆ#F° ö[±´´´Ó§O{xxøùùMœ8Ñßß¿¶¶ÖÊÊ*++KTTÔÔÔ477{¿½Ž;¶qãF__ߣGž:u Ûhdd¤¥¥URR"!!ÁkûæÍ›)Ê‚ jjj ºzþ8àç'˜šj˜šjìÞm}ûö‡ÄÄ7B„Á@áëxÕõÈU×ê ¸¼çèÕk~pKMM-**âø‘¥%ISSãÆ/3fì36&[Z*õqlPãþ†$A­À™8()©ÖÓ :sfñìÙcY==£ïßÏzüØWL¬Ý|›š¨Ë–]|ù2ïüù?§MSï“`€Fc¤¤¼ŒL}úô³ŒŒ¨µõ¤%K¦’ÉfœI'gVèÏæÏŸ¯««»eË^Ò)‚ÄÆÆrü{YPðýÚµ7qq¯ *@æÌÑ:wnqŸØG¸œ‡a`]u½ ά°µµeMBØ~þá‚knîú܀Ѐð›ÿ·A¿jpv&t“œœ¸‘‘ZDÄsöÛ¶YvîLæòE!!¾°0·™3Ǹ¸œ½qã]ïFɆHÄ[XŒ]õø±¯µõ¤Ë—_LžèêzîÉ“lø;±·555½|ùòï¿ÿf|à>\ÊÓÓìùsÿÛ·7¬X1mØ0Q^GqЯº””„^‡ö{±±±arÕÜœO¡är¯ h±±±¼¾ !hàgÎÎS=ú„­Ð‚!‘„vî\óòÉ“l._$ñ'N8ÏŸ?ÁÝ=">>½÷#ý‰ŠÊP?¿yoÞl?yÒ¹¹™foj`°+$ä^eeCGòû¸uëÖÌ™3·nݪ¤4¨F¡Œ+¿m›UPмâ ^uæææo΂‚‚xAufDœÍœ©!##zùòKöVVÚff¾¾ñÍÍ4.ß%pGŽ,\ºÔpݺË'NÜëåH9àç'`]Fú̘1æÈ‘;&l_±"võkkëúúz___^ýFàUAA=fDœ¸… 'GG¿ RéìÛƒƒ­+*êþ›û×ÙºÕêàAû}ûn®_™ûò¯½GMmX`à‚´´­~~ÿüSjojn~(22µ±±…'ñ@AAP3¢vÙÛëÖÔ4ݾý}#™LòõzÿÇ’÷àà0ùüù?““ß99©¯oîµH;@" -_>íÉ“Í))^ãÆ)lßž¨¡á»Œ ‚ ‚ ÀŒˆ EEI“ÑááÏZm_¼xª¶¶Ò¦MWÚ[Ô’©©FB‚{VV©ÝÉŠŠúÞ‰´³´´öí³KMõß´iö‡%öö¡³f¼té9³5‚ ‚ â-˜q³t©Ñóç9ïßÿ´Ö;‡<èðÏ?¥çÏ·^ºž£ñã““×××7[XÍÍ-ïH´ôÕ«Mž=Û’’â5~¼âÎIcÇÀ.#S_ßüï¿ewî| ¶k×Þ^q‚ ‚ ˆç`FÄ‘‘šŠÊÐK—ž·Ú>räÐ5kfìÝ{óË—ÊÎìGII29yÝС¢GÓÒò{!Ò®ÀºŒ22vý‘Ÿ_ao:uêî{߿Éé=¤®ŽšžžŸ””qòä}?¿„E‹Nì9ÒG]}³‰É¾Å‹Ïùû_=q➘˜ ¯C… ¨çÕÕÕy{{+((ðóó+((,]º´¤äÇPpAÒÓ{r¢Ôß!Ï[trrjµŽÙÇêëa$NGäû÷ï¿ÔtߟLúMx@¿† ˆ««ÁîÝùùÍ#‘~Z˜uÍš×®½ÙºõZx¸[gv%..³rÕªKvv'wš7o\ï„üˆ prÒwrÒÏÌ,ŠŒL=räξ}·ÌÍÇ:9éOªŠ Hß„ßgm 2B ‘̉D£ EP´ E›Œ&mDÑ&¥0 L& €Ã ‹‰M'‡ÉÊzlÝú€×8B à f«! L&`0P)©!hß®±·····çuÔ§P3g‚ ñññÊÊÊ¥¥¥gΜ™2eJvv6???¯£ìíí.\H¡P<3JJJ2332dHçw‚Çã#""~é+õ˜uÀÁaòþý·®\I[¾|ûvâÁƒö66!W®¤ÙÙétfWBB|.üéç—°jÕ¥ÊÊ?\] z'ä.ÒÒRØ·OaëV«ÄÄ7‘‘©öö¡²²¤?þ˜¸dÉÔÞ¾-öòò²µµíÕ&7ƒ–ýþ}2‚àpE‰Ç#ÂÂ>bmmË·o<a0˜(ʤR9O„H àôô”ûèx®cýžÂÂÂrsssrr„……ÒÒÒ!!!ÁÁÁ¾%@¤¢¢BJJª“Û»cÖ¬YD"ñÖ­[üñcŶ¤¤¤íÛ·ÿRœ‚899õ`TuK.£,‚~M‡ÕLLLÛû––F£Ñüüüäåå%%%.\øýûwÖ§ÑÑÑrrr"""¾¾¾—/_–••2dˆ——«BDDD«BZZ{3fÌÐÐЈe2™sæÌ9xð V!55URR²©©©½***ØË¬[l;«Eöí(ŠîÞ½{øðáâââ666?"Ž/^¼páB¬üîÝ;>>¾êêj.M<|øPAA¡mœ c÷îÝÊÊÊBBB“'O~úôi{§ˆãÉl {ÖýA­À÷ˆ:ö矆_¾T>zô©íG›6ÍVR’ܸ1EaNw÷»wÛ„…=Ý´)ŽWKuH]}˜Ÿß¼ŒŒ'O:V¬×ÑÙ|£¤¤š×¡A¸§?ÿ4ä>øHÄÏž=vÖ¬±ýå¹g­  ‘ϱ&ƒFF¦nÝz-))þ£CÐ`’‘‘1n\#·8ÿüùóoß¾¹¹ý|xTTÔ»wïÂÂÂöìÙñþýû‹/:t(//a``À^hËÁÁAUUõÍ›7žžž...T*ÕÎÎ.>>«cccsôèÑöbh…ù_vѪ/ˆ}{HHÈùó磣£ÓÒÒš››W®\ÙÉ#âÈÞÞþÆ---€¤¤¤3fH$.MlÙ²åòåËMMMmã<~üøÉ“'/^¼øùógSSS+++:Îñµ A=€×)ÙÀ`m}ÂÅå,ÇÞ¿/VTÜpþüã_Ýçß9ÒÇÞ>´¶–Òí{]zz§g´ŠÊ&%%ï+Â=ú—c§Äsû÷ß’•åÖS”‘ñ…Uùë×Zw÷¬G¨U5EÅ ë×GOŸ¾ëwÒÖÞæævñÔ©iiy--4 Aíéd@xöìëGÖý@uu5ó¿^UUÕððp¬Â‡µµµØ§<`2™ £U¹½¾‹¶ÕÔÔÐét¬üéÓ'@EEEMM€€@qq1ƒÁ “É=âC«>¢¶Y-²¶3&** ÛXRR‚Çã»vDL&“F£IJJ&%%1™Ì &œ?ž{qqq­âa•G}îÜ9l Š¢X_ÇSÄñd¶ûˆ ¨ `Q§8;O¹?«¸˜Ã“rMM9™ÁÁ7òò*Ú~Ê…©©Æëóó+ÌÍö‡Y¹¹›8QéÐ!‡ŒŒ;w.((øîàpJ_?èðá¿ËÊjxôoos?¿¹{Šðxœ¶¶ÒøñЬ-22¢'N8]¹²ZNNœ@ø©³hìXùÇ<ðùüyObâÚÕ«Mp8$$䞥å1ŸéÓ÷zxDEF¦~úô• 'm‡ …L&ggg³~¬®®fM4ÇRTT¤¢¢‚•±Bqñ…(DDD8®U¹ójjjüýýŒŒÈdòòå˱bbb3gÎLHHxüø1@044äCäçç/Z´AAäää FwŽˆ@ X[[ÇÇǽÿ~þüùÜ›PTTloWêêêXA‰„ ÇSAPïQ§Ì™£%%5$,ì)ÇO×­3SW¶nÝåάÙÊN]}Ø­[^جܩ©¹=iï2DÀÅeJJŠ×Ó§[,-µÃžNœ¸ÃÜüPdd*…;ôû w÷AA´MŠ fvö×{ÍÍ4öíS§ª>|è³nÝLO$||x=½7"‚‚|ººÊnnF§O»fffdl?yÒÙÐPíË—J?¿cã½£Go±·=x0åÎuu”¾9F‚ºÌÒÒòäÉ“X7€D"½~ýºUyyyÖ˜1¬@&“{*##£¼¼¼ýû÷ܾ}›µ8ëàà€ —°1¿” ‘ÉäÄÄDìa0Ö£¦¦Ö£°··ONNŽŸ>}º„„÷&¸¤Xd29?ÿÿËrÔÔÔ0ŒöNA½fDB$âÝÜ /]zVW×ÜöSwô¨ã‡ŧO?üÕ=KHÇÆ®š6M}áÂS f‘eei?¿yoÞl]¥¤$¹eK¼¶ö¶M›®´ZÍâ•%K¦îÝk‹ ?ò"A%-Ò;p ÅØxïµkoØ_~ nØ`~ó¦ç¨QÃp8Ƙ0A‰ãžedÄ,,Æ.HJòÈÊÚ•˜¸ÖÛ{6‰$öÌÕõœ††ÿôé{7mº—» ¨ (++›7o^zzzYYÙÕ«WwìØÑªŽ««k```ZZZvvöÚµkçÍ›G"ujÒÑÈÈHìþžU444Ôü‡Á`Ðh4]]]UUÕ¬¬,@UUÀÊÊ*===&&ÆÑÑ‘K $)))©®®.88˜½éêjÎo}uq9‹Çã"#—++Kw5Ò~!3³(2251ñ …B›2e¤““þìÙZ|{­¯Ý»÷¶¶Ç›NGÞîÝ{SZzÈ®]ÖÓ§êí`ZþùçG÷QzzAuõOÝGººÊJJ’½ J:#JHHX¼x±ŸŸŸ¯¯/¯cØ`FA]3¢_óôég;»“7oz²OaÌE™vv'««›RR¼º<ò­¼¼~ñâs_¾T^¸ðçäÉÊ݈·_¨«£$$¼ŽŽ~ñáCÉðáR¶¶:vv:rr⼎ ú¿üü ŸøgÏ>/Y2Õßߢ/{lÚë>¤qãùù{«ç ‚™A=fDÔ0#úe¦¦F–=vlQ{ŠŠªfÌØ·t©‘Ïœ.·ÒÐвjUxjjîÑ£Žsçv°¸ø@‘™Y›víÚëº:Šª½½îœ9Zp¸TÿûjëÖk²²¤'œ45åú>€††–ŒŒ/X‚ôêU~mm‘ˆ=š¬£3BKK^OOEAA¢ï£‚ fD€u ̈~Ylì«M›®¼xáßêetv‘‘©[¶Ä'%­ÓÖnwQ¶1èŽIçÏ?ñò2óòš5hæ'`0ÐçÏs"#SSRÞãpˆ™™¦Í$“Ñç«€úXyy½·wÌÇÿ®Xa¼iÓlÎðÁ` 99å™™EØøºÏŸ¿1™?u¯Ø{/>AÐ@3"ÀŒ‚ºfD¿ŒJ¥ëêî\¸PK“É´·?UYYë–W7oÚ®_ÏðôŒÑÓS uìήú›ÚÚ¦ääw‘‘©™™E²²¤?þ˜¸h‘ÞðáR¼ŽëwÇ` §N=طΈӧ]»9é\O©¯o~û¶ë>zù2¯®ŽÂê>ÒÕ¡§§§î€ ÁšÕÕÕíܹ366¶¼¼|èСfff;wãA?ö€3"ê˜uÅþý·.]zž–¶•ˈ¯ââê™3÷9:êmÝjÕÍæ>~,Y¼ø<!,l©ªªL7÷Ö}úô5>>=6öå÷ï ZZ NNú Læçu\¿µJ–-»H§£.ü9v¬<¯ÃùI{ÝGØ´uZZòÚÚJqþzê¦A™¡(jdd„ È”••KKKÏœ9sãÆììl~~øg‚˜APÀŒ¨+jjšttvúúÎYºÔˆKµ›73—- [jjªÑÍ¿}«ss»ðéÓ×'œÌÌ4»¹·þ‰}435Õ€ËñVCC‹‡GÔýûY»w[/\¨ÇëpÚUW×üî]á«WyØäu UHˆOCC_§¯?RJª_tsAPo”Ñ… üüürrr„…ÿ?[fMMÍ!Cðxøàƒ˜APÀŒ¨‹üý¯¦¤¼OMõçþ(ÚÓ3úîÝîÝÛ4thw‡ôP©tŸ¸øøt_ß9îî3º¹·þ¬¤¤úÊ•´¸¸´‚‚ï£FÉÚÙéþñÇÄîŸ@¨ èt488ùÌ™GkÖÌðõÓÿ³S¬û(--_» ßʠ̈f̘allìïïÏñSA>|èìììïï_XXN¡PÌÌÌŽ?.))‰U¨¨¨’’b/#’°aÆêêj33³ÐÐP¬òà3"ê˜uQQQ•Aðáà ­­'q©ÖÔD53; ¨(µ¼Gî&±9æÎw胠 _÷wØo1™Ì—/ó®\Iûë¯w uúôQ66:³fi¹˜û^\\š·w¬­­ÎÞ½¶kŒòòúwï 33‹^½ÊOKËon¦±w¨Ü~­Œ IDATu!¨­A™IHH„‡‡[XXpüA)S¦ìÝ»÷Î;QQQQQQâââ«V­½víh?#5jTXX˜¨¨è²eˤ¤¤ûô¨z̈ ¨ `FÔuîîÿþ[v÷îFî©Î»wE––G·nµä>Ä®ó=ú´rå%ñ‹—þ«úÀÑtýÁóç9K–œ×ÓS9}Úu€N˜N§£¹¹ÿï>ÊÎþ PR’ÔÑ%Hššò8¼¨ lPfDD"ñÑ£GS¦LÁ~dý毮®&‘H‚ÄÅÅÙØØ¨©©ùûû»¸¸>~ü¨©©Y[[+**Ú^Fæêê x÷îÝøñã±Ê<:Ä3"ê‚ô¸·¿Y³fÆ¿ÿ~}ðà_îÕÆSX·Î400ùŸJ{¤ÝiÓÔoÝò¤Rææ‡RSs{dŸý34T;}ÚõýûÀ;|ýZëàpjÒ¤ÁÁ7òó+xÝïbÊ”‘—.-{ù2÷Ï?/47ÓxNW8uõaNNúÇŽ-zøÐ'#cGx¸›Í¤oßꂃ“ÍÍ©«o¶²:|ãÎÕռނ “ÉÙÙÙ¬«««KJJØ+(**ŠŠŠTTT°-X¡¸¸˜ËnY•ÕÕÕ;¬ AР3¢®=šÞ›’âåã3GII29ù­«ë9 }ý ¨sçgf¡(|Ú A¼aiiyòäIãÇï‰ô?öî<ªõø93c߯’eD¨t‹t e*‰reÉRQÚÕmAT”Ñ­+©\m¢M¥h±¥Ô-mW¥¢;Zo]—,mRC²ÏÌïsïüæ;1 fÌàó~ùãqæ9Ïó9Ë̜ϜsžóðáCÎ 8A²²2l V ‘HØ¿ØÙ®œ§´ôßß_¾|ÉY00ÁUs=r÷îK/¯ø‹,,ôy×|ÿž>eJôÌ™‘‘3Õ{{;ó—_Î'&Þ]¹Ò6$ıoÝàÑsííÌ[·þIO/¸zõ/II‚““™—×cdž«é„ª°°ÒÝ}ÿر „þ¹Ë•–~zøðuAAùÇ¯Š‹?2Luu…Ñ£õÇŒÑ3FßÂB ½×@_Ñ/¯šûôé“……ň#"""´µµóòò¶mÛöðáCöUs4m̘1[·n=yòä©S§”””~þùgYYÙ‹/"¢¬¬íåårðàAöUsC† 9}ú´¼¼ü²eË”””°Êý\5@w°@ÏüôÓîE‹ŽòSóÌ™|iMNN¡`HN¾¯«Œ¢ii#5µ¹yS ÝÞdyy%ƒ¯[»6…Éd pOèªÞZO8 u99s"ÑA]}‘¦æJ”»?á.Ýs¢ŽBðÞ¼yãíí­¬¬,++ëä䄪­­e±X‚Ðh4‹ÕÚÚ¢­­­¢¢2{ö쪪*lÞ“'Ojhh¨ªª&''#‚MG$**jÈ!ŠŠŠîîîŸ>}áÒ ö­*ê(ècàQO]¼ødùò“·n…ðóìÔ€€Ó×®½¸qc­`GDxñ¢béÒÄ/_š˜7a‚±[îدY=Ï‹imeJJÂ÷ß———·gÏžž¼÷oÞü{Ñ¢cAASX— (heeÕk=²X¬ÚÚVx(dÿÔó÷…ÈõËsDÂÀ>³$ê@„ÎÐ 0qOMŸ>’LV9zôÎöížß­åñøñëU«’ÓÓW ðÂSSí«Wƒƒ‚Îz{ q\±Â¶Ï]9æåå%ê–={öôdö)S†GGÏZ³æŒŽŽ2ïè…ÊÊÊ ö @=|_è£àõž"pË–MJIùóãǺïV–••l„b% `êèÑzþþ§ZZÚE ·^Þmzy+÷B<Þ ‚꽇ï#þg:£o Œ¼¼ÔâÅ6GŽÜ^ºt¢¢¢ ?³9äç—.]züÊ• iaDe`0èâÅ€uëR}|¯Xa»aÃO8\˜Ãd2QMOO700xÿþýáÇ­­­‹‹‹¥¤„ò|˜œœ333A>~ü¸nÝ:ww÷GqVÀãñIII Âè½oÁáÐ|'OÞ¹uëň7Q‡óÿz·é—¾û^â#??{*°Þ½ƒÓõtœ#¤¥K'!râÄ=>ë¸Ã‡45µ­Z•,¼‡©ÉÉIÅÅÍ s:t(géÒãuuBêH¨KKK³³³Ç7hРQ£FÅÅÅ=}ú”@VV///O$‰D¢‰‰É¡C‡?~Ìõ5ƒ¢èܹsyX÷þO×"ü±\SSiË×cÇrÅêldïï6½ ³­,¼­ÿÝ÷VVV–––¢Žˆ˜ŽŽŽ‡‡‡¨£ ¯aŠŒ¼8|xXCC3ÿ³<|øJW7xÿþ‹ “—WbnþË?n)((v_üKIIág?´µµˆˆèìUAh4Z[[[XX˜ŽŽŽªªêœ9sª««Ù¯ž9sF[[[^^>44ôôéÓZZZ AAAì III\ÆnÿÓ§O‚”––b/ݺu‹L&=zAªª*lbVV–¶¶¶²²rll,‹#¿eWàlÅb=~üxÊ”)ÊÊÊÒÒÒ¦¦¦))),ËÑÑ1&&«——§ªªÚØØØÙBa-³Ë\=ö|wƒŸ_¢¹ù/túWa4ÎAl¥ñ Ú݆%ü­Ìî‘s:“ÉŒŠŠÒ××WVVöððà‰x¬%ö¿\ïÖá22Œ¨¨(YYÙqãÆÝ½{—ÅbñìÀ***{öìa±X<6 FknnPWWWSSÛ»wïw—šý†å±˜,a¾/ˆ9øô°ÏŸ† 9|øV—æ:rä¶ŽNÐíÛÿ)*¶úú¦åËOHk¨Ôs­­íÂîŽ|…(++geeuö*vœehh˜ŸŸ_TTdkkëêêÊ~ÕÉÉ©ºº:==AéÓ§³ËØ]RRRYYgó(ðãÇ>>>FFF {ÉÚÚ:77·±±‘óÀÔÁÁáãÇ¡¹¹™õÍá,×±²‰‰ÉòåËËËË?|ø %%ÕÒÒ’˜˜hee…UX¶l…â:VæšØóuÞ Ÿ?7ŒxZsá'#ánƒöVæì‘==66vÈ!yyy%%%NNN|.µ„•¿}/Ðh´—qÏž=d2ùöíÛT*UUUµ­­G`nnn555)))ØÛ‡Ç ¡ÑhT*UWW777·¨¨hâĉ؂óhœý†í|Oa± #€ >ýoÓ¦L3³MÍÍm]škÕªä‘#Ã++éBŠŠSjêŸëÝÜb{§;Þø< !÷îÝcÿËþE¼¶¶–õßq’‘‘щ'° ÏŸ?G¤®®{5''‡Åb1 ®2×ñë·í#‚¢¨¹¹ù“'OØ/¥¥¥±ËìƒÔÌÌLv³¼\1t:½½ýߤ´¨¨«L§Ó¥¥¥ß½{Ç`0H$ÒíÛ·y,”fD,ëâÅ'$Òš7^©}6~2¢Þßmzy+w˜ >üÔ©SØÄŠŠ <ÿõë×î-ë{ïÖá26,!!›Èd2kkk™L&À=zÄâxûðX!4mðàÁì>OŸ>ÅfáÑ8û ËdD0`Á}D‚çç7±¦ækjêŸ]škûvee¹¥K{áñAžž?fgÕÕ5ÚÙE_¿þBØÝ ‰D*..fÿ[[[Ë1ŒííÛ·†††X+°ïv——G‡Ãq•yÈÉÉ©­­­­­mll|ôèѨQ£Ø/éêê~[_[[›ŸfÙèt:•J¥P($ÉÏÏ›¨¤¤dgg—‘‘qçÎ`ccÃc¡Ä““Ó(7·ÑkצŠÃk½¿ÛpÉV.//÷ññÁF‡ÓÖÖf0=\"ï…ΖñÕ«W&&&X¤EQéèèpÃ{…TVVcevGã¾a6ȈO[[yÞ<ë]»®65µò?—œœÔÑ£ ‹Š*·oÿ]x±±iœ?ï?q¢ÉÂ…G£¢~ÿ§¸:;;ÇÇÇc?!#B$>|ÈUGGG§¬¬ +c‰ÔíÙw“KKsØáA$Švm? …RVVýêÕ««W¯²§{yy¥§§§¤¤Ìž=EQ Åb±±L¢¢<Üš5gEˆv."ÙÊ$éüùóØ^ØùvÚÐ=<Þ H'ËH"‘8¬§ÓéØ ±ÎãzûðÞ(:::ìD·¤¤ä»KÝÕ<À@ßBáï?µ¾¾ùäÉû]šËÐP=:zÖÁƒ·~ÿý©㤠 7/&fö±c¹..û^½ëz„‡‡WVV:99TVVž;wnË–-\uæÏŸA£ÑŠ‹‹W¯^íääD$ùi<99;zc¥¶¶–]nhh ÿ‡Á`´µµ;ÖÈȨ°°Ð××AššA\\\ Ξ=ëííÍc¡ˆDâ… êëë###;ëQT¤wïž}õêó ‹6’ÞßmD»•±é¾¾¾T*µ   ¤¤ÄÏÏoòäÉ]Yg]Öá2.\¸póæÍwïÞýðáÃo¿ý¦££ÓÔÔÄ`¼7ʼyó~ýõ×{÷î½|ù288›ØËK  _Å¥z¯¿^05 ûò¥ ƒÎa‚ƒÏº±¼üûwƒÊ»w5nn±úúk¹Íd2{­_ ÿ×î¿yóÆÛÛ[YYYVVÖÉÉ ûå˜ó†ÖÖÖmmm•Ù³gwv¯Å·e„AÃØŽîÜèp"…B‘––þüù3뛡Õi4ZVV–¾¾¾”””µµõåË—†еàììljjŠ•;[¨“'Ojhh¨ªª&''wØ£@ÖyO¬_Ÿjb²áýûZ!µðq«×w›^ÞÊœ±§·¶¶†††êèèÈËË;88°GMøîu¶žy¿:\ÆÖÖÖððp]]]YYÙ±cÇb÷,ñŒëv)Þ¥¥¥eÍš5ƒ :yò${–ï.5op X(KhÁàjj¾ZZF¬Zeçïo×¥ÛÚ³f¨ªúòûïk…òØÖo1̃svî¼2~¼Ñž=Þêê½÷ÔÑÔÔÔY³fÁ~ÈÉÕÕuìØ±7nRû½³Î[í좌4NœX"ŒöQMIIñòòFã½@Ø[t|À€WÍ ‹ŠŠÜ¢E6ññtõþr ü¡Có¿~mñ÷?ÅdöÒw3[¹rÊùóþ¯^UÛÙí¼yóïÞépill|ðàÁµk×|||DKOÉÊJnßîqãÆßçÎqߺ3À‰áVÎÎÎF;B¥RE t ÑŠ¶(Š&$Üéꌃ)9²ðÖ­öì¹&ŒÀ:cn®{åÊKKà ŽnßÞ†[è®\¹bgg·iÓ&===QÇ"Љ¯¯õ† éb~—Z/í>‡_¾üxùr –Q°áuÉ«WÕë×§åç—,[6yݺi’’p¦tAQч™3÷¡œì'!u8èà>¢^‚Çã6ntºzõùŸ–u¯ üáÃóåä$,8ÚÔÔ*ØðºD__-%eyLÌìS§òb?~#Â`@Ÿcb¢yìØ¢‚‚WAAgÛÛa¬ˆœ#êUžžqMMm/tû‚ŸÒÒONN{mlŒš/ò«†Þ¾­Y¿>õþý?¿IAAö22’¢ô!¹¹Å µ±1>xp¾”œf€Èà7oÞ,ê##Í]»®ššj¢Ñ½TTäFŽÔÙ¹ó ‚ VVC]—))ÉxxŒÑÕU‰‹»™œœ§¯¯fh¨.Ú@_¡§§:yò°ØØ›7o::Ž‚¤¢Q¯ÒÒR*,|Ÿ™ùÈ×w|·ÇjÓÓSÓÔTÚ²%ËÐpÐСZ‚°†'ÍŸ?¡¶¶1<<3/¯dôh}9Qú ÅI“†&$ܹ~ýùÔ©#z8Ð@÷ÀUs½­¬¬jòä‘‘îsçZõ¤°°sgÎägd¬27ÙÐs\ž?¯ Iýûï÷«VMY½ÚF\ü(/¯š;÷HKK[bâ’#´Eý§gwžôú   +«]00ÁÈ ½ÍÀ`М9ãbb²{4:ÂæÍ.£Gëùù%~üX'¨ØzhÄíóçýƒ‚ââþ˜>}÷ƒÝC (ƒºv-xÄ'§=©©4Q‡@žžþîÝ;QGz[zzúÛ·oE}œ#êêkë­+WN ˜Ú“vèôÆ3öÊÈHœ;·Z^^Œ®8zýú3•šñÇÿ¸¸˜oÚ䬩©$ꈀ¸kog†‡Ÿ;yò~P}` =?ÖÐ}(Ц¤¤xyy‰:Ы`»ÐmpØ!jjò~~“âânVW7ô¤"Q6-mEMÍ×ùó´¶¶ *¼žÓÓSMJòKM]QTT9n\DxxfCC‹¨ƒb@ÀEEyDFºÇÆÞôôŒ¯¨¨uD( # ?¿I’’„þèa;ššJÉÉ~/^Tœ·Ó}ãǹzumd¤{fæC %*-&nq³`Áøë××~ùÒyòÄÊÊÊÝÝýëׯ¢ Ðe‰˜žžê’%”èèìÚZ|†JIŽ_$//åí}H œœÔš5öyyTooËþ;vËöí¿÷p8rÐ_IKKOËÌ\ýõkËôé»÷î½ÞÜÜ&ê èÛKKK³³³Ç7hРQ£FÅÅÅ=}ú”@ ˆ:´îCQ´ººƒñŠ:›ÞsòòòD"‘H$<8<<¼¦¦æÍ›7ü„'¼Ý‘èÚKKbb® ¤5ee¹´´MM­ñuuiSxTUå7løéÑ£-k×NOO/°°Øì華ƣ=Z/;;((È~ÿþ›JÔ… a×Kt:½½½+aN—––~÷îƒÁ ‘H·oßæC72¢áÇŸ:u ›XQQÇã¿~ýÚ½%âꢾ¾~ÅŠ$ [(þ3" ˜™™Éƒ=#ÐmpÕœXÀáЈ·{÷^Þ¸ñ· Ú6ŒtìØ¢;wŠÖ¬9Ãê;IHà==¼~}mjê éeËNX[G22’³ëÚÚŽŸæŒM÷õõ¥R©%%%~~~“'OîÊ:ë{¡***BCCÍÌÌtttø +w{%¨²Ùÿèë«ùùMŒŽÎvv6WS“T³îîcê뛨ÔL"QÖÇÇJPÍö6²ŸÔÔÃ’’A÷î} M ÏøñGõ™3õà'´"“ÉVVb´Wt›¼¼ÔÊ•SæÌ±

        û1§££ávçΆ3Ìââþ P¢âãÿ¨¯ou\=ȈÄÔ’%CCõ ÒÞ2–¹ºŽ^²äøÍ›DGG92ÒýÁƒpw÷1ûö]·°Ø²qczié'QÇQ‚ŒHL¸;½îÜ)ºrå/7ŽÃ¡»vÍvv6[º4ñîÝ—oq6h•:ãÙ³ˆmÛÜóóËll¢\\ö]¼ø¤½)êÐ ð<"ñen®;kÖ¸ððsбœœ”`Çãq»wÏa±ùóNž\:~üÁ¶€˜“”$xzþèî>æêÕç‡ßZ¶ì„‘‘ÆâÅOÏ122’¢Ž€®iiiõªû{ýºZRRGÔ@_çˆÄZxøŒ––öÝ»¯ £q<·k×l Åxñ⣿FQ__¿víZ2™,%%E&“/^\QQ½„¢hAAûâYUFFÆÊÊŠwû|ÐÞÞŽ¢huuuÏÃãjDP-X8:}ú™™«ïÝÛH¡˜lÙraøð0ÿS/^Tˆ:4:V_ßüìÙÛ¬¬'±±7‚‚κ»ï·°Øb`°~òä ‹»ùüù{NÀ?¢@ÿçˆÄ‘(æ´~}ê̙Ǔ޾„þðáK–Ÿ=ûÀÉ“KÇ3øþ<½‹Éd:::¢(šžžn``ðþýûÇ[[[KI å+?''ÇÌÌ A/_¾lÛ¶mæÌ™eeeBÞ)x<>))IAAA@1öFËÍàÁƒ""ÜV®´MNÎ;u*?#ãáøñC|}Ç;8ŒÀ‹::01Ìwïjß¼ù\Tô¡¸øÃëן߼ù\YY×ÚÚŽ ˆŒŒ¤‘‘†žžêèÑúnnzzªººª$Û]Q4`Ö¬Y³fÍõB@߀²XðÔB±Æb±<<â Vfæ*E…уÁ\»6%3óÑÁƒ¾Ó¦ý Œ.:ÄÏÓµ;VRR"''ÇžH§Óðx<Š¢4m̘1 ‰³ÁššUUÕââb###~êûjUU•šššÃlƒžžž‚¤¥¥ ªÁþÉdÝ»÷299ïÊ•g²²Ržž?.YBÑÓSu\@”<(ËÏ/ ˜*ŒÆ›šZ_¾üˆå<¯_Æ ïßÓÛÚ‚((H<ËyôôT5LL4•”dy4˜šš*Œ8ø³¶¶ÖÑk&è:A<ø×_½ÓÑ JK£ ¯ &“¹qc†®nð… …× ARRRx×±µµˆˆàÑFkkk ÓÑÑQUU3gNuu5ûÕ3gÎhkkËˡ††ž>}ZKKKAA!((ˆ]!))‰«@£ýÿz¦Óé‚”••1™Ì¨¨(}}}eeeÎ.h4ÚãǧL™¢¬¬,--mjjŠ-û-VUU…ý[UUÅ#Ô¬¬,mmmee娨XlâŸþiii)##£§§wäȬÚ444TTTöìÙÞ—ÝEFF†¾¾¾’’’§§'»q<<<<<<¾[mÀ*-ý´yóùaÃ6’ÉA $\½úW[CÔAÞVPðÊÝ=NK+ÐÊjkÏ[«¯ozúôMVÖãýûo¬[—âì¼wèÐZZØŸ¥e„—Wüºu)û÷ßÈÊzüôé:ýkÏ;ÀdD}CTÔ%“Ð÷ïk…דÉüå—L 3gò…× '~2"ee嬬,-Ðh´¨¨(CCÃüüü¢¢"[[[WWWö«NNNÕÕÕééé‚LŸ>].--e±XIIIeeeœÎŒ¨¾¾~ýúõãÆc±X±±±C† ÉËË+))qrrbgX}“åË————øð!!!AJJª¥¥…Å‘«°Ë‚ OŸ>533Ãç±z᪹.ùð¡.#£àÔ©üW¯ª5==ÇÌž=NUU^ÔqÁ{òäMDÄż¼Ç9,;¶I[[™«2“Ézû¶†ó‚7¬PW׈ €ÓÖV66Ö46ÖÔÓSÅ.~ÓÒR’”„ûx@\À'rß )Iˆ‰™íâ²/3ó‘›ÛháuÌÈxèí}H]]ÁÙÙ|æL 33]QºéÅ‹ŠíÛ/ÿñG!"ßäB‚àñ¸5kNUVÖ!"!×ÕUÕ×Wµ³3Õ×WÕ×WÓ×WÓÕU…äú"Ȉú’ÐPÇë×_„‡g<è+ÔŽ,Ï`06m:á6ü$Ô¾x ·°°prrŠˆˆÐÖÖÎËËÛ¶mWùóçGDD :TIIiõêÕNNNœé ÉÉÉãÇýìßW¯ªŸ={ûôéÛ«W––~nlDjj¾ª¨È‰6H‚7†öIS¦ Ÿ9ÓbíÚ”úú¦^èŽLV¹x1`ð`µ™3÷çå•öB ôõÕœÍÃÃýýM?|ˆ¿};TZZBÔA0Ȉúª_ue0˜Û¶]êî””dÏž]>yòÐ9s^¸ðøû3@Ã22Ò••u 2¢¾JYYî—_\’“óòó{餤$!>~Þ’%”+’âãa-Ð@Fԇ͜iáà0ÂßÿT}}sïôˆ¢(•:cýúé‘‘—¢¢~g2áÆзAFÔ·íÞ=‡ÅB‚‚Îôf§S÷îõ>tèÖ¢EÇZz³k¾U__¿víZ2™,%%E&“/^\QQ½„¢hAAûxƒ"ïÑÔÔ4<<œýïŒ3¦NÊþwÇŽ†††ííí(ŠVWW[‡¹ôòC¤³€€ÁXs}›¢¢Ìþýs=<âRSi^^?öZ¿c†'-X`oÿ[bâbccÍîµ³{÷n±}Î@ŸŸoii)ê(z„Éd:::¢(šžžn``ðþýûÇ[[[KII‰:º>€B¡äççcåÖÖÖ[·nµµµ566ÊÊÊ"òàÁ …‚Çã“’’øl3''ÇÌÌŒý/ÿ3 JW0ÀÁ9¢>oÜ8?¿‰aaååU½Ùïðá¤ìì`MM%'§=×®=ïF ::: ðÏÒÒ²Ï=ÿ”Kbbbiiivvö¸qã 4jÔ¨¸¸¸§OŸ}øçžÎÎoã¼Çĉi46tûýû÷555Édò­[·°W±ŒEѹsçb&?1ÈËË9àñxÁÆÌ‰3v™3`àûX ïkii³³‹ž>}Wkk{ïwxZG'hÿþ½Ü5è÷IIIá]ÇÖÖ6""‚G 4­­­-,,LGGGUUuΜ9ÕÕÕìWÏœ9£­­-//zúôi---…   v…¤¤$®–?°=~üxÊ”)ÊÊÊÒÒÒ¦¦¦XÀŽŽŽ111X…¼¼}:»\ZZÊb±’’’ÊÊÊ8 ßfD&&&Ë—////ÿðáCBB‚””TKKKbb¢••V! `Ù²e}’””¬««khh’’*++ ñòòâÛ£GØ]pÔâÄcñÓÒÒØ­ñ¾ÃõÜÙ ä 833“3H##£“'ObÕž={Æ{å°AFýÜGÔ,Zd3iÒÐU«’¿|é¥Á¸9Mš443sU]]“«ë¾çÏ+z?00‘H¤ââbö¿µµµìæØÞ¾}khhˆ•±v=‚ òòò‚àp8®2ÿèt:•J¥P($ÉÏÏ›¨¤¤dgg—‘‘qçÎ`ccÃ#†n(//÷ññÁFrÓÖÖf0=Y" …òàÁƒëׯÿøãŠŠŠrrr&L¸zõ*vïy±[¿ÛÅ×ÕÕeWã|‡ë™OÚÚÚœM½}ûÖÀÀ+u©)ýdDýŠ¢»vÍillÝ´)S$ Fº|y ™¬2cÆžÄÄ{"‰ 4ÎÎÎñññØÏÿ‚‰Ä‡rÕÑÑÑ)++ÃÊXD" * …RVVýêÕ««W¯²§{yy¥§§§¤¤Ìž=EQ1°X,¤‹ ‰D:þ<ö³“ɬ­­566îö"Lœ8ñÅ‹çγ··Ç¦L›6íòåË>ünF„¢(?]ðX|>SÐÎÖ3?¸‚ÔÒÒ*//ÇÊ¥¥½ô„kâ 2¢~EMM~çN¯””?³²‹$UUùôô•aa3~ù%sÖ¬UU_D8ÂÃÃ+++œœ *++Ï;·eË®:óçψˆ ÑhÅÅÅ«W¯vrr"‰ü4žœœŒ:³ ‚444ÐÿÃ`0ÚÚÚÆŽkddTXXèëë‹ HMM ‚ ...gÏžõööæ‘H¼páB}}}dd$g×µµµ†„M÷õõ¥R©%%%~~~“'OîÊ:㦯¯O"‘23393¢ßÿ@ Œ1¢³º¤Û›€­³õÌ?±ùøølݺõÑ£G………ÁÁÁßy?¾~m¹víyLL¶ ì¹ÔÔÔoú OOOQïbÝáéé)ê5:®}²P :äà0ÂÛÛrýú4 }mmåÞEÑ%K(#Fh¯X‘4mÚ®øøyãÆô~`€PWW¿ÿ~hh¨½½}KK‹­­mZZûš(LHHHCCƒ››[SS“½½}ll,ŸÏ›7/))iðàÁì‚ œéF;tè¿¿XX˜……•J­««sqq),,TTTœ:ujiié¨Q£xİoß¾uëÖ…††îÝ»÷àÁƒØD …2räÈŠŠ ÎxØÓ7lØÐÔÔäææF§ÓÇŸ‘‘ÑÝõ÷¯‰'^ºtéÇÿ}¦Ùˆ#H$’¹¹ù·ßÅÆ[·7[gë™3>c£R©Ÿ?¶³³#‰ÑÑÑW¯^•èj<\ ßçäüsýú‹‚‚W ÓÐP=8xZÛ,ì>(ÐÏìÞ½[Ô!tŸ¥¥åš5kDˆòòòöìÙÃ5e}34èë¾|iž:õ7CÃAÉÉ~ßÐôššš¯§nÝ* œhÇà IÐ5(Ц¤¤xyy‰:nruu;vìÆEèÔ‹/~øá‡ªª*UUUÞ5SSSgÍšÅùYW×xçNñµk/nÞü›NoÄãq {ÉÜ\ï÷ß…wW|9è7°D}ñAç}7rÐtø©©ý‚‚ôþý>wフÿC„a¨¨È<¹ô—_\öí»1{öëE ½©±±ñÁƒ×®]óññu,ÿÊÎÎîð²*•*êÐz›©©éúõë¿|ùòáÇððp[[Ûï¦ClmmŒÜÜâÈÈK––[‡ [±"éüùGtz#‚ ìtA9¡„@8હþi̘ÁááΛ7Ÿ5Šig½oŸÏäÉCE ½æÊ•+ ,Ø´i“žžž¨cù×´iÓà,&%%% €D"±X¬ñãÇ>|ø»³Ô×7T‰ÓGŒÿò¥IBßÖÆ@þ7 bÃáP"QVðqȈú­%K(ùù¥+W&_¿¾N]]A„‘˜›ë^¼°zõ©ùóØûûÛIHàEÂæîîîîî.ê(@ÇFŒqóæÍ.Í"//%#CÀᤚ \{;ƒGe<÷ìÙ[w÷ýŠŠ2D¢¬¢¢Œ¢¢Œ’Ò¿ŠŠ2JJ²XA^^ªg‹@0 #êÏvíšmo³råɳgím<ƒ)œ>½,.îæo¿eggÿµgÏSSmÆüÃáPSSåššó>Г“óŽÍ­«kDQ”Éìà´‡êè(ëé©ÒéMUU_JJ>ÕÕ5Ö×7ÕÕ5µ´´sÖ$pX¾„%NÿeMÿæKD¢ G6%«¤$¿%€@FÔŸ)*Ê<èëâ²/.î;уá«WÛ9;›¯[—âàãím¹y³«¬¬¤h£þih(O[½ÚîêÕç‡Ýzôè5û :6&¡PL–-›Ôa ÍÍmuutzS]]c]]ÞXW×Äžòñc}Qч––v¬Ú§O_¸®u”’"‰²X‚D$ÊbÉ‘(óí"QNJ ¾â€/ðqÙÏ™™é†„8îØqÙÚÚp̘Á¢ÑÓS=sfyBÂ;¯<|ø*&f¶™™î÷g±!)I˜1ÃlÆ ³gÏÞ&%奥јLûR:&“©¤$ÓÙ¼ÒÒÒÒJJütT_ßÌ>¿TWׄêë›èô'¾ySS__åT­\³ci“ÙŒÃIó×]ý¯¿þš’’òéÓ'uuu{{û_ýU[[AEi4Ú˜1cøi‡oPzüvpWfff&!!QUU¥¦¦Æ`(Šò˜¥«èôÆK—žNjª¡¡({ì–=ï‚kJÏw˦¦¦­[·ž={¶¢¢BIIéǤR©–––ÂZ†^Qÿ÷óÏ“<(óó;qíÚZ55yQ‡ƒàñ¸eË&98ŒX¿>ÕÉiÏìÙãBB åNñT_ß\SÓP[Û(##1t¨–¨Ãá6r$9:šdòäý“'ïÕÕ5áñø¶¶vEÅN3¢.QT”VTä+™A¤­ñ¿¹S#VÈÏ\PÐöÝÙ™L¦££#Š¢éééïß¿?|ø°µµuX2ŽŒ IDATqq±”Üïįœœ333ö¿ 8.))IAAßqÍÍm×®=OK+¸uëƒyûvhŸËˆ`·ï–þþþyyyÇŽ6lX]]]jjª­­í‡ûØÆ 2¢þEÑøøy?ý´gá£çέ“+ÑõõÕRSWäæoÚ”ii¹uÑ"›ÀÀ©rrðþG^^ž¨C‚Ç`°Û¿~mkllold|ýÚÖÐÐöõk;ö÷åKëׯííÍÍíÌÿÆrst$ÛÛëˆ0f»¢–1$ÄqÍû‹Ÿ9rçÙ³·JJ"kNB¯ª*¯ªÊý³× AŸ““y ILL,---))‘““CdРAqqq‘‘‘B>NèìL‹`ÏÀp’——'‰\çÎ+ðŽx`0˜¹¹Åéé—/?mia (Òá o}ì–!ðÝ2##ãôéÓ'NDD]]=,,låÊ•Ø6êÃX``()ùhlúË/™¢„[SSë޽ׇ ±²Úšý—¨ÃbDÔŸŽ@xP99 MÍUZZZZZZšš«55Wkjúÿ7…ûOBBSÔ1#ߘ¿þð¡NØïþ¥¤¤ð¹­­mDDDg¯"B£ÑÚÚÚÂÂÂtttTUUçÌ™S]]Í~õÌ™3ÚÚÚòòò¡¡¡§OŸÖÒÒRPP bWHJJâ*Ðh4Î.?~$$$HIIµ´´$&&ZYYa–-[Æ#†Ã8'²{dO2dH^^^II‰““ûý»KÔÙZâÄÕ¾h4•JÕÕÕÍÍÍ-**Â~zç?#zð ”J=gj¦¥øm"Ô§3"Ø-Ås·ŒŽŽÆãñ'Nœ¨¨¨àê®ÃEæ9ï nl.kkëÜÜÜpm‘ÎÖ¦ÃOEôÛ•ú±_~9útþ¥K&&bñƒ+—ÂÂʘ˜ì+Wþ=ZwÍ[Ûa¢Ž DL&ëØ±Ü_ÍB¤³‡üàñ8‡ {7´þ#55uÖ¬Yßý®—¸}û¶µµ5ö/ûnìÚÚZ"‘ˆÝfíííM¥R}}}yñâň#êêêQÍÉÉ™4i“ÉÄãñœåÎîÿö¾íºº:yyy< Hqq±‰‰IUU•„„„¦¦fII‰––™L>sæÌ’%K:‹}Å»Ì5‘Ý#{º©©iXX˜··7‚ ïß¿×ÕÕ­¯¯—••íÆu¸PìéUUU'Nì¬/æååE¥R-Z„ ȳgÏFõÝ ¨>~¬ss üôI¾±‘@ àÚÛ;x^0' }ñßµ¢âO-­†´´4ÞÕ`·ÛÝòþýûééé7nÜxþü¹¹¹ùöíÛ§NŠüﵜ‹Ì;rÞŒŒŒ¾Ý X³iiiuuu\[„B¡ðد:üTå3j@ï£Rg˜˜h®Xqòë×QÇÒaô^¿¾V]]qÞ¼#?ý´ûúõ´Ð_ápè’%”7Öš˜hðxfƒÁÊÉùçÛ±Ô€‘H¤ââbö¿µµµ\uÞ¾}khhˆ•±Â»wï°åååÁáp\eþÑét*•J¡PH$’ŸŸ6QIIÉÎÎ.##ãÎ;ÁÆÆ†G ÝP^^îãモ(Š¢ÚÚÚ C€KÄ_‚TVVcev·/_Z˜L<ƒÁ=’Xg¥‰DY1ùÃᾓ¿a`·Ïݲ®®nܸq»vízöìYEE…¥¥¥‹‹ËçÏŸytôÝÈyTèp+`tuu‘޶H7VE¾5 tƒ„þÈ‘ŽŽ»N9²àÛ1ÅÁðᤣG½xQñÛoÙ 52ÒX¶l¢»ûIIØ]臌5¯\ >t(gûöË(ŠpýÔÍ`0Ÿ={ããó—„~Ì}c33²hŸ:Ýÿ8;;ÇÇÇÏ›7û!–H$ææærÕÑÑÑ)++?~<‚ eee‚H$A@¡P,--£££ÍÍÍY,–´ô¿ƒìyyy9r¤°°pöìÙ(Šòˆûù¬KG¢$)&&ÆÅÅ›½®®îÛÐ…w_:::ÅÅÅ&L@¤¤¤„Ÿ‡ Q'“ëÈäºÈÈØ‹Ÿœ=K«¨¨áq²hófW## A,Šxz^â§ì–â¹[6ìàÁƒÎÎ΂hiiEEEÅÇÇ×ÔÔ¨ªª"ÝZdÞ:Û GÖĵEºÑ |£ 8ZZĤ$¿œœ¶o¿,êXx15Õ>~|ñýûa66Æáá™?üžYYIu\Á#p+WN¹v-ØÀ@@øŸ/&--âÇ›Ÿ>ýuÿþ¹††êÉÉy3fì12 5ë@\ÜÍgÏÞöÝq´ÄJxxxee¥““SAAAeeå¹sç¶lÙÂUgþüù4­¸¸xõêÕNNN|¨%''———sihh ÿ‡Á`´µµ;ÖÈȨ°°»ú¨¦¦A—‚‚‚³gÏböt‘H¼páB}}}dd$g×µµµ†„M÷õõ¥R©%%%~~~“'OîÊ:ëÞ}Í›7ï×_½wïÞË—/ƒƒƒ»Ô²±±fpð4-<''dÙ²ÉØxƒ‚XŒ+ÛC°[Šçnééé|õêÕÊÊÊ/^7ÎÈÈé|‘{¢³­À‰k‹tüè>¡½w¯÷òå'† Óru-êpxÑÓSˆpó÷·;qâ^lì•ãÇoY%'ÏtÊÊÊ*((HÔQÐÆ‘®__»wïµ={®£(Ê`0%$pØý„ƒ)`EEäõëϹ¹Å¹¹Å±±7##/©¨ÈodccL¡ëꪊz!ú*uuõû÷†ÚÛÛ·´´ØÚÚ¦¥¥pÖ ihhpsskjj²··å³ñyóæ%%% <˜]@„óØ‹F£:tÈßß?,,Ì‚J¥ÖÕÕ¹¸¸***N:µ´´tÔ¨QÞ}…††Òétwww&“síÚµntab¢æ´~ýôœœÂsç]½ú¼µµ@Àµµ}øuñ»¥xî–;vì——_¾|yEE…††Æ¤I“²²²x,ru¶8ëpm‘n€‘®mÛ.%$ÜÉÌ\=jYÔ±ð‡“05nb"¢°Óv,??ßÒÒò»÷ª æîÞ}é益¦¡½7ÏÅżÃj óÅ‹ŠÜÜâ;wŠ<(kmm×ÓSµ±1¶±1ž0ÁHY¹?C@øYAœ¹ººŽ;vãÆ¢Dìxzz"ÒÙgþׯ-×®½ÈÈ(¸}»{B«8]5Ç+ò>vKqÃÿéðSÎ \!!ŽÏž½[¾üÄåËkúÄ¡‹Õ>×ËËKÔˆ/ì;€¾n£۷C7m:Ÿ–öç„ FUÃãq#G’GŽ$¯\9¥©©µ àÕ;ʹŧNå£(2b„Žñرƒ­¬†ÈËÃÓŸû¤ÆÆÆ¿þúëÚµkسPÄAvvöôéÓ¿¶uëÖÞ‡99)7·Ñnn£kk¿^ºôTQQFÔõ°[ŠlȈ.<w诣ãž%KŽŸ=û³„D¸æÐ?((HïÞ={Þ<+즈‘ÄÎ!R]Ý—W’›[|᣸¸›nøpmì²:KKCø¬ëC®\¹²`Á‚M›6ééé‰:–M›6­ÏpSV–›7ÏZÔQô°[ŠlȈ4%%Ù3g–99íYµ*ùÀ_N‡ž X£GwçëMMMþÛ›Ž’“óâânÊÉI­G¡ÛØÙ7.ÈÜÝÝÝÝÝEÿvKq#-Ñ@§««zôè"OÏøèè+!!Ž¢IOOUOÏjî\+Î›Ž¢£³##/ih(Žk`cclg7\SSIÔ‘Ȉòãƒ÷íóùùç“ÚÚÊsçZ‰:¼În:úý÷4&“Å’aÒ¤¡ Òßo@?@qv6+.þ–¡¯¯:a_OË€>Šó¦£ÏŸîß/ÉÍ-¾}»(99n:€žÐ þä0uªéòå'_½ªu,=R__¿víZ2™,%%E&“/^\QQ½„¢hAAûB9ÈÈÈXYY ¶}€°©ªÊϘa¶s§×ƒáyyÔmÛ<ôôTOÊ›5ëÀðáaìçÀä»– ßƒsDà_8ëãáçí}èÂÿAƒDQw0™LGGGEÓÓÓ Þ¿øðakkëââb))¡ ¿›““cff† È—/_¶mÛ6sæÌ²²2ÞYô=웎˜LÖóçï°›Ž~û-;2ò’ººÂ¸q†66ÆS¦ ÓÒ"Š:Ò.KMMu@ðÞ½{§££#ê(ºéÝ»w°[‘ÈËËûv"<¡üúúf7·}L&ëüùÕJJ²¢ç ÿ×Þ‡5uå}?¢P Vk0Ô‚Š:V^¨­Ö­©-% bçÕ¢ÖÑÖ¥n`Ÿú fdûRp« Èn­u\úÌ)q¤TÇÈÖd(bÀ…-$yÿ¸6ÍD‹Ëòýüõ˽'÷ü.9÷œCQÆ÷#:qâDDDDYY™•Õo;,544X[[›››S%•JgΜi”ô/xÿþ}{{{¹\.vºƒJïz©««sppè²åØó` iiQI¥•ô¤£ÒR…þ¤£—_ždc3Ð'Ñ{2ô±X<ÿæfgg3 kžšƒÿbcc™’þðaËµétz,55uÆ úå!„Ãᘛÿ6 ½½=22R 888„„„Ô××ÓÇ)ŠJOOçóùÖÖÖ»víJKKãr¹666[·nÕ5HIIÑ н°X,­Vãììlgg¨ßÅ©S§œ9NPPP}}½‘dòòòÆGQ!ÄÑÑñÞ½Áý4#À ei9Â××-"Btá–’’¨#GÂ|}Ýòóåk×&{xD,Zt :úl~¾\¥R3iÇ‚‚‚´0t Ærˆ’••ÅôO†;ƒßITD`hìXNJJøÍ›5k×&«Õ¦Óé™ââbOOOãmbccÓÓÓ³³³ jkk׬Y£;•ššzýúõ¤¤¤˜˜‰DRRR’˜˜xàÀŠŠ BˆD"ñññÑôÑOÍÍž=ÛÙÙ9>>þøñãiiiR©´¥¥eݺuºféééW®\¹{÷îêÕ«$³{÷î“'O655Bº9F}ÊÖÖŠžttåJdqñÇ +§NåggË–-;ôâ‹»1é`°bºBƒª  lüømÛ·g2Èo!ÆÛ°X¬Ë—/ë¿…¦T*é—R©T(&''Ó JKK !ôÙÜÜ\­V«V« b©TÚYJúÌÍÍóòò´Z­»»{jj*ݦººÚÜÜüñãÇtû¤¤$úø?ü@3fLgÉè¾B#„ÔÕÕuçG$‹ÅbqwZ€ UUÝ“H ÂÓ„ÂcÇ~0eJdxx’DR PÜg:5èæCǼ¼\ÿüç Í›Ó»?üaÓét—Ë•ËåÞÞÞôK¥RÙÔÔÄãñôÛܹsÇÕÕ•Žé@¡P¸»»BØl6!ÄÌÌÌ 6B·²B[[Û±cÇÞ~ûíªªªÊÊÊ+V¬X±B×L¡P¸¹¹éz$„¼ð „ÚÚÚÎ’7nÜ3ü$ ÿè–dho×ܸñd؈ˆ•J­7éè›ç˜Î:€§æ SAA/EG|òÉÙÇ/1Kw-]º4!!Ø!„p8œ¢¢"ƒ6|>Ÿ~ ŽB\.·×=²Ùl‡Ãápœœœ¶nÝZ__ûöm.—{úôiú[F£T*érˆR^^N·oß&„888t–L—Å 4,–½ lFÆú7¢32Ö‹DÓþõ/ÅڵɑºIGmmƒo–&À†1"0fÕ*ŸÆÆ¦¨¨3£G[._>‡étº¶gÏžßýîw"‘(**ŠÇã]¹rå“O>1h5iҤѣGoܸQ$q8ÝZK7%%ÅÇÇÇÙÙY4°´´¤(êþýû¡¡¡‘‘‘<ÃáüéO’ÉdÅÅÅt›}ûö¹»»³Ùì 6ˆD¢Ù³gw'¥R‰yDƒ‹••…nØ_~yxõjy~¾<'Gÿçž9sæ??7__·)Søô*ÀTDÐ…÷ßíáÖíÛ³ØlË7Þ˜Æt:]prr*((عsç‚ Z[[_}õÕ¬¬,ý6;vìxôè‘¿¿ssó‚ âââºyñ•+WJ$ggg]ðt‡¨¨¨ÌÌÌææfÿ††Ÿœœ]ƒÕ«W‡„„üòË/¯½öÚ¡C‡8N—ÉøùùM:µººÚÎή'? (œœ¬ßxcý'ô§Ÿêóóåùùò¸¸¿GGŸµ·g{{O¤«ðo€Øº¦ÕjwîÌNO¿šœ¼fîÜIL¥Ñýˆ8“oˆdû "ú“Ž Ëõ'ùúºq8kG8€! cDÐ5Š¢¢£êê®[—œ‘ñž§§€éŒ=zÒ=﨩©­¨¨ŠÞ65µÐÌŒòðàùúºùù¹Íšåbak€>„1"è®¶¶öU«Žÿœ™¹~Ê~ÿ'0ƈúƈ†€ºº‡……åùùòo¿½y÷nƒ¥åˆ—^r¦'MžÌ73ä#CE= R©ÃÓ ÊÒÒÖ͘1¾Ÿ{GEÔ%TDCŒnÒQ^Þ­šíì¬||„ôØÑ¸qöLg0D "‚žQ©Ôï¾›TXX––¶~úô~Ý0Q—P UjµæÇ;žtô?ÿ#´µµb:A€A ôSE*¢.¡"ô'•”((ŠLžÌ§Ž^zÉÙÒrÓ  2¨ˆ 7ZZTaaŸß¸q73sý‹/ö~{ÓAEÔ%TDÃͽ{®\)ËÏ—_ºôo…BÉb™¹»?Y’ÁËk"‹…žº†Šz‰.ŠJJ©©kûg¤Q—P gºIGß}'ollb³-¦OO/É0u*Öè*"è=•J½aƒäÿ¸yüøïûaŸ"TD]BEä¿']½ZÑÖÖ>fŒÍ¬Y.¾¾nóç»?ÿüh¦XPÁ3Q«5Û¶eœ:U”°òõ×=û´/ŠÂš³]‹Å¨ˆ@§¹¹M&{2騴T¡ÑhuK2Ì;ÉÚÚ’é˜‡Šž•V«ýè£ÓIIßÇÆ.[¶lVßu”™™Ùw2——ÓYÀ@T_ÿ¨  Œ^ËûÎûú“ŽæÌq1œé˜ŠL@«ÕFDäH$Wúº(“ÐM:ÊÏ—744YYY̘ñdÒÑ”)|ŒÉÀ°‚ŠLC«ÕFGŸ=t(w÷î×7l˜Çt:Ð-¶´TAO:úç?+Z[Ûœ¬gÏvõõu›7ïűc9L'ÐçP)¥§_ݾ=3 `æþý˰ê+ÀàÒÒ¢’J+;œtôòË“ll0é†&TD`b/–®_ÿ…Ÿß ‡‡b£@€AJ©|üý÷·éÇê~ú©ÞÜÜÌÓŽ`hBE¦WTôSXØ1gg‡ääwí쬘N`¸S(½~{MMÓíÛ·n5–—?hiQ[Y±ÜÜF{{ ±7c°Ž€ ¡"‚>ñãÕï¼sÔÑÑZ"ywÌ|d0)33sÙ²e¦¸’ÙÈ‘Ï)°°×Ôôcsó S\z{-˜‹é`hòðà}õÕ¦•+-Yr09yÍäÉ<¦3îðèAïÇ ¦‚¹ïÐWƳ?wnóÔ©|‘è`NŽŒét:€Šú••ʼnÿ»qã¼M›Nþå/ðõ$ 4xjúEQ[·.âñlwìȺ}»öàÁ,@ƈ ?ÏNN^séÒ¿—/?üŸÿ42À¨ˆ ŸÌ;éoÛüàAók¯ÅæåÝb:BPAruu:~Ë[oÍ 9²gÏ—*•šéŒ`¸CEýjäHVT”ÿÁƒËÓÒ ƒƒ)J¦3€ßEQ”LfÊ…CM~ÁÐ#Õ‘~¾Mè)TDÀ€ÀÀ—ÎÛÜØØñY,ÖåË—u/uÿUP*•ôK©T* “““饥¥„ÆÆFúlnn®V«U«Õ±T*í°»§O544´··Óñ­[·!uuu ––– …B­Vs¹Ü¼¼<#9ÔÕÕé.NÇu=ꎻ»»§¦¦Ò«««ÍÍÍ?~Ü»;êìî:뢼¼ÜÞÞÞÍÍí믿6ÈÊ8±X,‹»lÝ„1"(F¹uë¢o¿Ý>mÚ¸÷ß?˜põjϾ„€gÁårår¹î¥R©Ô-4§sçÎWWW:¦…BA¿d³Ù„333ƒ¸û"##ýüü¸\nxx8}pôèÑóçÏÏÉÉùî»ïX,–¯¯¯‘z¡²²rÅŠô¢p<O­V›ðŽŒwáââ²xñb•JµdÉ’^çÏ ,&8;¶êË/7¶µ©ýýã>ËÏ—wý6xfK—.MHH ‡A!§¨¨È  ŸÏ×=3F\.×T øùùUTTìß¿¿ªªêâÅ‹ºãôƒsôd#9hµZÒÉËåž>}šþžX£Ñ(•J777SÝ‘ñ.d2Ù¥K—ìííãââLÛ#ô*"ˆfÏv9sfSvöË|Ù²Co¼qðï¿¡Õ{„LnÏž=555"‘H&“ÕÔÔœ:ujïÞ½m¢¢¢¤R©\.߸q£H$¢×UëRJJJee¥~@yôèQïÔjµJ¥š5k–P(¼yófhh(!äþýû„7ß|S&“¥§§‡„„ÉÃá|õÕW<ˆŽŽÖïš^ ûiôñÐÐÐÈÈH™LVVVþÊ+¯ôägÖ-vÑÚÚvðàÁ'N|üñÇUUUƳ€>ÄÔãz1øe±ì9œ…ööŒü2ðÄ9ÀpÖÍyDZ­öçŸ ±µµ5j”H$¢G`ôçµµµíرƒÇãÙÙÙw6Eçé˜"‘H }R©ôÌ™3&L°°°ðöö>wîÜÂ… 'MšD_géÒ¥tÜY_|ñŘ1cìííéµìèã~~~–––õõõ‰éŽ·µµíܹ“Ïç³Ùì… –——wóŽŒÓoÖa~ø¡¿¿?Ý`÷îÝóçÏ7ÈÖÌ#0-J‹ïÝa€¡(êƒ>ðòòÒ?¨RiFŒÀf/ýõ¯åóùYYYL'ÌÈÌÌ\¶lÙ þÄë­·fÍšµ{÷n¦ !ø«`*ƒxÏ5¼¼¼‚‚‚˜ÎbèÀ§& ^MMM%%%ß|óͧŸ~Êt.O\¸pañâÅOˆˆØ·o_ÿçϲ§–·IDAT \çÏŸ_µjÕG}4~üx¦sybÑ¢EƒzÀ  "€+ €é,`(ÃÄ ¾PÀð…Š†/TD0X=xð`Û¶mÀÂÂB ¬^½ºººš>EQ”L&3a_TG:ë‚¢¨{÷î=}ÐHJ]&¼}ûöQ£FÑ;€ ae”4Í’%K(ŠÊÎÎvqq¹{÷îÑ£G½½½år¹………É»Óí nkk›››;mÚ4BˆµµµÉ;êL\\\^^ž]¿õC½‰ ………sæÌa: €¡ JIIIåååeeeVVV„GGÇøøøèèh«O~¥9Ž.f³Ùú/ûGKK‹‹‹K?w C†@ ‹ÅLg&3g΃}Ìà™hBHFF†ñ6¯¾újTT”‘+H¥R•JÁçóííí—/_~ïÞ=ÝÙ´´4Çf³wîÜyòäɱcÇZ[[oÙ²E×@"‘èW¦ãâââyóæÙÚÚZZZzxxèr&„9rdüøñ£G¨­­Õ½Q£Ñüñœ0a‚­­­X,ÖOIwYBÈ™3gx<ž­­m\\œVoË‹ºººÎnÊ8±X,‹»Ó`¸Á<"”Š‹‹===·‰MOOÏÎÎ.((¨­­]³fîTjjêõëד’’bbb$IIIIbbâ***!‰ÄÇÇG?èPpp°P(¼víZUUÕæÍ›CCCÛÚÚèSG=sæÌ÷ß_]]½jÕ*Ý[âãã?ž––&•J[ZZÖ­[×á•ããã¯]»öùçŸoÞ¼¹µµU«ÕBêêêŒÜôÓ%€!Ò1"‹uùòeý·Ð”J¥ö×!¡P˜œœL7(--%„466ÒgsssµZ­Z­6ˆu5FrÓµihhhoo§ã[·nBêêêô¯¯Õj¯]»F¡WDJ¥îîî©©©ô©êêjssóÇkŸ#úòË/u)é®IÝ”q#è Æˆ`Pâr¹r¹\÷R©TêšÓ¹s玫«+ÓB¡ _²ÙlBˆ™™™AÜ# ‘‘‘~~~\.7<<\ÿÔĉé`Ò¤I„ššúeeeåŠ+è¥êx<žZ­Ö¥¤Çãu–’‘›€^@EƒÒÒ¥KèQB‡Ã)**2hÃçóé§à!tÀårM˜ƒŸŸ_EEÅþýû«ªª.^¼¨ª¬¬ŒnݺEQ”@  _r¹ÜÓ§OÓßFh4¥Réææöô•)Šê¬Ó¾¾)€á J{öì©©©‰D2™¬¦¦æÔ©S{÷î5h%•JårùÆE"Q7׈KII©¬¬Ô:¤R©fÍš% oÞ¼J~}:޲sçÎ’’’ÒÒÒõë×êÖé ŒŒ”Édeeeáá᯼òJOo¼×7BEƒ’““SAAÝ‚ &Nœ˜˜˜˜••eÐfÇŽo¿ý¶¿¿¿———““Sbbb7/¾råÊË—/ë:räÈgŸ}Æårß{ï½U«V-\¸ðÍ7ߤOmÚ´iñâÅ~~~®®®GŽѽe×®]"‘ÈßßúôéwîÜÉÉÉéÙm?ÃM@‡(­Þ¬t€€¢¨ŒŒŒ   ¦:èmŸ.cD0|¡"€á  _¨ˆ`øBEÃ*"¾PÀðÅb:€\¹r…醅BÁçó™Î` ­0àPÅt CX,Æ­OCEÃæÀð…Š†/TD0|¡"€áëÿQ¤³fÁoÍùIEND®B`‚glom-1.22.4/docs/libglom_reference/html/doxygen.css0000644000175000017500000005003512234777145023531 0ustar00murraycmurrayc00000000000000/* The standard CSS for doxygen 1.8.4 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; } /* @group Heading Levels */ h1.groupheader { font-size: 150%; } .title { font: 400 14px/28px Roboto,sans-serif; font-size: 150%; font-weight: bold; margin: 10px 2px; } h2.groupheader { border-bottom: 1px solid #879ECB; color: #354C7B; font-size: 150%; font-weight: normal; margin-top: 1.75em; padding-top: 8px; padding-bottom: 4px; width: 100%; } h3.groupheader { font-size: 100%; } h1, h2, h3, h4, h5, h6 { -webkit-transition: text-shadow 0.5s linear; -moz-transition: text-shadow 0.5s linear; -ms-transition: text-shadow 0.5s linear; -o-transition: text-shadow 0.5s linear; transition: text-shadow 0.5s linear; margin-right: 15px; } h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { text-shadow: 0 0 15px cyan; } dt { font-weight: bold; } div.multicol { -moz-column-gap: 1em; -webkit-column-gap: 1em; -moz-column-count: 3; -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { margin-top: 2px; } p.endli { margin-bottom: 0px; } p.enddd { margin-bottom: 4px; } p.endtd { margin-bottom: 2px; } /* @end */ caption { font-weight: bold; } span.legend { font-size: 70%; text-align: center; } h3.version { font-size: 90%; text-align: center; } div.qindex, div.navtab{ background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #3D578C; font-weight: normal; text-decoration: none; } .contents a:visited { color: #4665A2; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #9CAFD4; color: #ffffff; border: 1px double #869DCA; } .contents a.qindexHL:visited { color: #ffffff; } a.el { font-weight: bold; } a.elRef { } a.code, a.code:visited { color: #4665A2; } a.codeRef, a.codeRef:visited { color: #4665A2; } /* @end */ dl.el { margin-left: -1cm; } pre.fragment { border: 1px solid #C4CFE5; background-color: #FBFCFD; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; font-family: monospace, fixed; font-size: 105%; } div.fragment { padding: 0px; margin: 0px; background-color: #FBFCFD; border: 1px solid #C4CFE5; } div.line { font-family: monospace, fixed; font-size: 13px; min-height: 13px; line-height: 1.0; text-wrap: unrestricted; white-space: -moz-pre-wrap; /* Moz */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: pre-wrap; /* CSS3 */ word-wrap: break-word; /* IE 5.5+ */ text-indent: -53px; padding-left: 53px; padding-bottom: 0px; margin: 0px; -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; -moz-transition-duration: 0.5s; -ms-transition-property: background-color, box-shadow; -ms-transition-duration: 0.5s; -o-transition-property: background-color, box-shadow; -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } div.line.glow { background-color: cyan; box-shadow: 0 0 10px cyan; } span.lineno { padding-right: 4px; text-align: right; border-right: 2px solid #0F0; background-color: #E8E8E8; white-space: pre; } span.lineno a { background-color: #D8D8D8; } span.lineno a:hover { background-color: #C8C8C8; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; border: solid thin #333; border-radius: 0.5em; -webkit-border-radius: .5em; -moz-border-radius: .5em; box-shadow: 2px 2px 3px #999; -webkit-box-shadow: 2px 2px 3px #999; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { margin-left: 16px; margin-top: 12px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background-color: white; color: black; margin: 0; } div.contents { margin-top: 10px; margin-left: 12px; margin-right: 8px; } td.indexkey { background-color: #EBEFF6; font-weight: bold; border: 1px solid #C4CFE5; margin: 2px 0px 2px 0; padding: 2px 10px; white-space: nowrap; vertical-align: top; } td.indexvalue { background-color: #EBEFF6; border: 1px solid #C4CFE5; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #EEF1F7; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } div.center { text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { border: 0px; } address.footer { text-align: right; padding-right: 12px; } img.footer { border: 0px; vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } blockquote { background-color: #F7F8FB; border-left: 2px solid #9CAFD4; margin: 0 24px 0 4px; padding: 0 12px 0 16px; } /* @end */ /* .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } */ td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #A3B4D7; } th.dirtab { background: #EBEFF6; font-weight: bold; } hr { height: 0px; border: none; border-top: 1px solid #4A6AAA; } hr.footer { height: 1px; } /* @group Member Descriptions */ table.memberdecls { border-spacing: 0px; padding: 0px; } .memberdecls td, .fieldtable tr { -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; -moz-transition-duration: 0.5s; -ms-transition-property: background-color, box-shadow; -ms-transition-duration: 0.5s; -o-transition-property: background-color, box-shadow; -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } .memberdecls td.glow, .fieldtable tr.glow { background-color: cyan; box-shadow: 0 0 15px cyan; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #F9FAFC; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memSeparator { border-bottom: 1px solid #DEE4F0; line-height: 1px; margin: 0px; padding: 0px; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } .memItemRight { width: 100%; } .memTemplParams { color: #4665A2; white-space: nowrap; font-size: 80%; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtemplate { font-size: 80%; color: #4665A2; font-weight: normal; margin-left: 9px; } .memnav { background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .mempage { width: 100%; } .memitem { padding: 0; margin-bottom: 10px; margin-right: 5px; -webkit-transition: box-shadow 0.5s linear; -moz-transition: box-shadow 0.5s linear; -ms-transition: box-shadow 0.5s linear; -o-transition: box-shadow 0.5s linear; transition: box-shadow 0.5s linear; display: table !important; width: 100%; } .memitem.glow { box-shadow: 0 0 15px cyan; } .memname { font-weight: bold; margin-left: 6px; } .memname td { vertical-align: bottom; } .memproto, dl.reflist dt { border-top: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 0px 6px 0px; color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 4px; border-top-left-radius: 4px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 4px; -moz-border-radius-topleft: 4px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 4px; -webkit-border-top-left-radius: 4px; } .memdoc, dl.reflist dd { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 10px 2px 10px; background-color: #FBFCFD; border-top-width: 0; background-image:url('nav_g.png'); background-repeat:repeat-x; background-color: #FFFFFF; /* opera specific markup */ border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); /* firefox specific markup */ -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; /* webkit specific markup */ -webkit-border-bottom-left-radius: 4px; -webkit-border-bottom-right-radius: 4px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); } dl.reflist dt { padding: 5px; } dl.reflist dd { margin: 0px 0px 10px 0px; padding: 5px; } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } .paramname code { line-height: 14px; } .params, .retval, .exception, .tparams { margin-left: 0px; padding-left: 0px; } .params .paramname, .retval .paramname { font-weight: bold; vertical-align: top; } .params .paramtype { font-style: italic; vertical-align: top; } .params .paramdir { font-family: "courier new",courier,monospace; vertical-align: top; } table.mlabels { border-spacing: 0px; } td.mlabels-left { width: 100%; padding: 0px; } td.mlabels-right { vertical-align: bottom; padding: 0px; white-space: nowrap; } span.mlabels { margin-left: 8px; } span.mlabel { background-color: #728DC1; border-top:1px solid #5373B4; border-left:1px solid #5373B4; border-right:1px solid #C4CFE5; border-bottom:1px solid #C4CFE5; text-shadow: none; color: white; margin-right: 4px; padding: 2px 3px; border-radius: 3px; font-size: 7pt; white-space: nowrap; vertical-align: middle; } /* @end */ /* these are for tree view when not used as main index */ div.directory { margin: 10px 0px; border-top: 1px solid #A8B8D9; border-bottom: 1px solid #A8B8D9; width: 100%; } .directory table { border-collapse:collapse; } .directory td { margin: 0px; padding: 0px; vertical-align: top; } .directory td.entry { white-space: nowrap; padding-right: 6px; padding-top: 3px; } .directory td.entry a { outline:none; } .directory td.entry a img { border: none; } .directory td.desc { width: 100%; padding-left: 6px; padding-right: 6px; padding-top: 3px; border-left: 1px solid rgba(0,0,0,0.05); } .directory tr.even { padding-left: 6px; background-color: #F7F8FB; } .directory img { vertical-align: -30%; } .directory .levels { white-space: nowrap; width: 100%; text-align: right; font-size: 9pt; } .directory .levels span { cursor: pointer; padding-left: 2px; padding-right: 2px; color: #3D578C; } div.dynheader { margin-top: 8px; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } address { font-style: normal; color: #2A3D61; } table.doxtable { border-collapse:collapse; margin-top: 4px; margin-bottom: 4px; } table.doxtable td, table.doxtable th { border: 1px solid #2D4068; padding: 3px 7px 2px; } table.doxtable th { background-color: #374F7F; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; } table.fieldtable { /*width: 100%;*/ margin-bottom: 10px; border: 1px solid #A8B8D9; border-spacing: 0px; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); } .fieldtable td, .fieldtable th { padding: 3px 7px 2px; } .fieldtable td.fieldtype, .fieldtable td.fieldname { white-space: nowrap; border-right: 1px solid #A8B8D9; border-bottom: 1px solid #A8B8D9; vertical-align: top; } .fieldtable td.fieldname { padding-top: 3px; } .fieldtable td.fielddoc { border-bottom: 1px solid #A8B8D9; /*width: 100%;*/ } .fieldtable td.fielddoc p:first-child { margin-top: 0px; } .fieldtable td.fielddoc p:last-child { margin-bottom: 2px; } .fieldtable tr:last-child td { border-bottom: none; } .fieldtable th { background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; font-size: 90%; color: #253555; padding-bottom: 4px; padding-top: 5px; text-align:left; -moz-border-radius-topleft: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-left-radius: 4px; -webkit-border-top-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom: 1px solid #A8B8D9; } .tabsearch { top: 0px; left: 10px; height: 36px; background-image: url('tab_b.png'); z-index: 101; overflow: hidden; font-size: 13px; } .navpath ul { font-size: 11px; background-image:url('tab_b.png'); background-repeat:repeat-x; background-position: 0 -5px; height:30px; line-height:30px; color:#8AA0CC; border:solid 1px #C2CDE4; overflow:hidden; margin:0px; padding:0px; } .navpath li { list-style-type:none; float:left; padding-left:10px; padding-right:15px; background-image:url('bc_s.png'); background-repeat:no-repeat; background-position:right; color:#364D7C; } .navpath li.navelem a { height:32px; display:block; text-decoration: none; outline: none; color: #283A5D; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); text-decoration: none; } .navpath li.navelem a:hover { color:#6884BD; } .navpath li.footer { list-style-type:none; float:right; padding-left:10px; padding-right:15px; background-image:none; background-repeat:no-repeat; background-position:right; color:#364D7C; font-size: 8pt; } div.summary { float: right; font-size: 8pt; padding-right: 5px; width: 50%; text-align: right; } div.summary a { white-space: nowrap; } div.ingroups { font-size: 8pt; width: 50%; text-align: left; } div.ingroups a { white-space: nowrap; } div.header { background-image:url('nav_h.png'); background-repeat:repeat-x; background-color: #F9FAFC; margin: 0px; border-bottom: 1px solid #C4CFE5; } div.headertitle { padding: 5px 5px 5px 10px; } dl { padding: 0 0 0 10px; } /* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ dl.section { margin-left: 0px; padding-left: 0px; } dl.note { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #D0C000; } dl.warning, dl.attention { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #FF0000; } dl.pre, dl.post, dl.invariant { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #00D000; } dl.deprecated { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #505050; } dl.todo { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #00C0E0; } dl.test { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #3030E0; } dl.bug { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #C08050; } dl.section dd { margin-bottom: 6px; } #projectlogo { text-align: center; vertical-align: bottom; border-collapse: separate; } #projectlogo img { border: 0px none; } #projectname { font: 300% Tahoma, Arial,sans-serif; margin: 0px; padding: 2px 0px; } #projectbrief { font: 120% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #projectnumber { font: 50% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #titlearea { padding: 0px; margin: 0px; width: 100%; border-bottom: 1px solid #5373B4; } .image { text-align: center; } .dotgraph { text-align: center; } .mscgraph { text-align: center; } .caption { font-weight: bold; } div.zoom { border: 1px solid #90A5CE; } dl.citelist { margin-bottom:50px; } dl.citelist dt { color:#334975; float:left; font-weight:bold; margin-right:10px; padding:5px; } dl.citelist dd { margin:2px 0; padding:5px 0; } div.toc { padding: 14px 25px; background-color: #F4F6FA; border: 1px solid #D8DFEE; border-radius: 7px 7px 7px 7px; float: right; height: auto; margin: 0 20px 10px 10px; width: 200px; } div.toc li { background: url("bdwn.png") no-repeat scroll 0 5px transparent; font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; margin-top: 5px; padding-left: 10px; padding-top: 2px; } div.toc h3 { font: bold 12px/1.2 Arial,FreeSans,sans-serif; color: #4665A2; border-bottom: 0 none; margin: 0; } div.toc ul { list-style: none outside none; border: medium none; padding: 0px; } div.toc li.level1 { margin-left: 0px; } div.toc li.level2 { margin-left: 15px; } div.toc li.level3 { margin-left: 30px; } div.toc li.level4 { margin-left: 45px; } .inherit_header { font-weight: bold; color: gray; cursor: pointer; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .inherit_header td { padding: 6px 0px 2px 5px; } .inherit { display: none; } tr.heading h2 { margin-top: 12px; margin-bottom: 4px; } @media print { #top { display: none; } #side-nav { display: none; } #nav-path { display: none; } body { overflow:visible; } h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } .summary { display: none; } .memitem { page-break-inside: avoid; } #doc-content { margin-left:0 !important; height:auto !important; width:auto !important; overflow:inherit; display:inline; } } glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__VerticalGroup-members.html0000644000175000017500000007153712234777147033302 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List

        Glom::LayoutItem_VerticalGroup Member List

        This is the complete list of members for Glom::LayoutItem_VerticalGroup, including all inherited members.

        add_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        add_item(const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)Glom::LayoutGroup
        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_VerticalGroupvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_border_width() const Glom::LayoutGroup
        get_columns_count() const Glom::LayoutGroup
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_items()Glom::LayoutGroup
        get_items() const Glom::LayoutGroup
        get_items_count() const Glom::LayoutGroup
        get_items_recursive() const Glom::LayoutGroup
        get_items_recursive()Glom::LayoutGroup
        get_items_recursive_with_groups() const Glom::LayoutGroup
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_VerticalGroupvirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItem_VerticalGroupvirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        has_any_fields() const Glom::LayoutGroup
        has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::LayoutGroup
        LayoutGroup()Glom::LayoutGroup
        LayoutGroup(const LayoutGroup& src)Glom::LayoutGroup
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_VerticalGroup()Glom::LayoutItem_VerticalGroup
        LayoutItem_VerticalGroup(const LayoutItem_VerticalGroup& src)Glom::LayoutItem_VerticalGroup
        m_list_itemsGlom::LayoutGroup
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_VerticalGroup& src)Glom::LayoutItem_VerticalGroup
        Glom::LayoutGroup::operator=(const LayoutGroup& src)Glom::LayoutGroup
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        remove_all_items()Glom::LayoutGroup
        remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::LayoutGroup
        remove_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::LayoutGroupvirtual
        set_border_width(double border_width)Glom::LayoutGroup
        set_columns_count(guint columns_count)Glom::LayoutGroup
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_list_const_items typedefGlom::LayoutGroup
        type_list_items typedefGlom::LayoutGroup
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutGroup()Glom::LayoutGroupvirtual
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_VerticalGroup()Glom::LayoutItem_VerticalGroupvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1ChoiceValue__inherit__graph.png0000644000175000017500000000730312234777145031745 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“xIDATxœí{P×Çφ ƒ ¯ ò´J©eŠ:€§¼,C½AÀJÛq| ÔB"B,‚Õ±ÔQ¡Ð‘á¡$>NæææMMM33³5otÑûÆOž<‘J¥›7oX[[_¿~ýüùótº.Ñ–…Éd’6ƒÁ n®†) ++«ÿÓøjè2ž—••PØÙÙ©T*²£Åy {L—jaaa¹¹¹Ä)`2™?üðƒš›Í–Éd„M,K·µ@¶ŸŸŸL&»téÒÓ§O¿þúkª1AR îíí …¶¶¶¯¿þ:y¦j ²¬ƒT*% ‰D‚a‡Ã!6Y,Vmm-qa-,,ŒoÛ¶MÓ±¬ÊYgtÑ;--M.—‡††ŠÅb¹\^]]‘‘¡æûñÇwtttwwÇÇLJ††®ð¾º´´´§§‡j,‹R©Ü³g««ëãÇcbbÀÿFÔ%ñððàóùööö»víÂqÜØØxÙ ÄB-|>¿³³³««ëøñã<ü¬“šš*‹¥RéÑ£G¹\î’)ñWèüW¡î+œ¿qÿå—_¢££ÍÍÍMMMCCC‰+˜:ÏÍÍ%''ÛÙÙYXXDFFSÔâ©k± ())¡$`ÑüMlŠD"###ŸÛ·omß¾}q|"‡»wﺻ»;;;ß¼y“tÓÄÏÏÏØØxttTK+eeevvvæææ‡Vë>ŸÏf³ FPPy{EMŒŒ¿gM¶&ÏßN¹á‡¢– þ¯áñxàÏOÁÑú9\ ½áé Ho¸@zÃÒ. Õ[.ŸØè6†%žXSŸôýS),”DE9mÞl¸Ñ‰è—þþ~6›ý§"êâ $¿,¡ÑŒmmLM_ÚèDÖmëkpãF[JJåž=NµµñËzãü]S#Æ0 ÷ ?ßè\Öèôîë‹{qÐhXmíýNg½Nïúú4€JµPYÙ±Ñé¬7Ðé-t¨T ]]2™b£3ZWàÒ["êî"oQ êê~ÜØ”Ö¸ô‰~44üãKÓJ¥J ø~óY ÒÇq C©TQ {{Gÿýoõ/[þƒHï‡ûÆÕ é55Ý¥C¤wmí}ê`N TÎ …ð,:Á¢·JµPU%VÌ ŠçbñÓuÏhc€Eï{÷d££ÓKî244€g὿üòئMtâÏÐЀ´U*\$ú‘øPþG/¿àýâînwöì›äæùó_þë_¯º¹ýñ“—‰‰KKÆF¤¶®Àø| Àb}Ÿæ±Ñ‰¬7°Œç¤7\ ½áé Ho¸@zÃÒ.Þpô† ¤7\ ½áé Ho¸@zÃÒ.Þpô† ¤7\ ½áé Ho¸@zÃÒ.Þpô† ¤7\ ½áé Ho¸@zÃÒ.Þpô† ¤7\¬úÿy´··úé§zÊfÝ0³°øÝÄD¹Ñ‰ü%¼½½WUeÕÿ¯§¯¯¯²²ÒßßµÿVlÚ¤˜šSSÇ_àÑ£G:ÔÒñÿ3¥§§ëV±Vè&š¿áé Ho¸@zÃÒ.ô¨÷ÌÌL^^^DDD@@@DDÄÅ‹GFFˆ]\.W"‘¬ms½½½|>?88øàÁƒ—/_ž™™!Ûšœœ\¶ºJ¥Z¡'Éùóç322¨%< $›VCG½Zô¥7ŽãÉÉÉ?ÎÈÈ …ÙÙÙ›6m:yò¤R©—%ŽçÏŸŸ:uÊÅÅ¥´´ô“O>‘J¥W®\YU–’’bjjºò*\.÷Þ½{³³³dI[[ÛîÝ»WdÑ—ÞwîܼxñâŽ;˜L¦³³ó©S§ŠŠŠ Ôß0°&GGÇ÷Þ{ÏÊÊÊÕÕõôéÓš®³%Á0, ÀÐpoݳgNÿþû?ÞxÓÖÖö7_‰Ò—Þ 066¦2 íU*UQQQDDÄ[o½•™™ùìÙ3¢œËå666òx¼ýû÷þùçß|óMxxø›o¾™››K:444P¶¶¶€€2²““SMM ÙzssóÁƒꪪ´·;99‰ãxyyytttppð‰'ºººDaTTTXXXzz:Q…N§ûúú677Õe2™B¡ðññ‘J¥IIIaaaAAAqqqß~û­ZçP'j£jñõ¾ô–J¥ÎÎÎÚ}***322®_¿>66véÒ%r×Ý»w‹ŠŠø|~yyyCCÃ_|‘œœ, år9 %%ÅÝÝj ÚØØPƒSÏ-±X\\\œ˜˜˜——§T*µ´ ¨®®®««ãóùeee»ví:{ö¬J¥ª­­½}ûvZZZ~~þÜÜùËå¶··“Tkk«§§'ƒÁ8wî›Í.((¸uëÇËÊÊšŸŸ×Þšâ¯9úÒ{ffæ…^ 7¹ÿcвfýÕW_ÅÆÆîرƒÍf'$$´¶¶’#pDDÄ–-[^{í5@dd$i'~@@€­­-ÕÐþÔçÈ‘#fffþþþ*•jffFK»€úúúØØØ;wZZZÆÅÅ•••Ñh´ººº¸¸8777‹•””ÔÒÒBLÛžžžt:½££ÐÚÚJ æyyyï¿ÿ¾¹¹ùÎ;•JåôôÒ¯Ò ÑÍÑ×û ,--ûúú^zé¿ïØ®¯¯Ÿ §ú ³Xÿ}Ãa(Š­[·LLL†©Ùš°±±¢–LMM™šš—¸µµ55‚–vCCC‡°1 c0Dafffff&_¡P°Ùl??¿ææf—žž___¢éòòò®®®õ×­k@Sü•Ô]úÒ{ïÞ½uuuD3ŒŸ~úIÍÇÚÚzpp‰ÚÒÒR·æ¼¼¼îܹBl>}úôwÞ‰D„ZjçŠöv---årùË/¿Ll祥å‰'öîÝ Àq|zzšˆ Ø·oßG}äâââááaffHHHpss;v옫«+Žã‹&$…BA6ª)þÚ¢¯ñ<&&fttôÌ™3‰dtt´¥¥¥¸¸XÍ'((¨¤¤äçŸîïï¿r劷·÷ ²¡¡Ð‰4¢¢¢d2Y~~þððpOOONNޝ¯¯¦hÚÛ ¹qãFggçØØXEEÇ› ***’H$—/_þàƒHÿW^yÅÐत„¼3W©TÄdÑÛÛ›••xþüO/g0mmm333¥¥¥dJšâ¯-úº¾™Læµk× NŸ>=77÷ꫯ¦§§GGGS}¢¢¢~ûí·´´´ÙÙÙÝ»w'$$¬0xVVVJJŠ­­-i0™ÌÏ>û,///&&ÆÔÔÔËËëøñ㚪ko722R©TfffNNN:::fgg›˜˜DGGÏÎΦ¥¥MMM¹»»Ÿ;wŽô§Ñhþþþ"‘ˆÌ‰‰‰W¯^-,,ܶmÛ‘#G¦§§Ïž=K=Ýãããóóó âããE"@KüµeÕßo‡jjjÒSBˆ’žžnmm- WU ­ŸÃÒ.Þpô† ¤7\ ½áé Ho¸Ðq}Ëå®mP{þ´V½¾ÖßßÿÝwß­¶„>àp8ÞÞÞ«ªéû¿¡Íßpô† ¤7\ ½áâ?С±×[ßIEND®B`‚glom-1.22.4/docs/libglom_reference/html/inherit_graph_22.png0000644000175000017500000026435312234777146025211 0ustar00murraycmurrayc00000000000000‰PNG  IHDR[|®»9ëbKGDÿÿÿ ½§“ IDATxœìÝg\×û6ðºJY¢KQDP±&( DŲ"J3 ¨Ñ`Áޱ¢ÑĨIì%”jƒ]Ä *ViJ—²ËÒawçy1ÉþxD`(×÷“‡ÙÙs®ìÍÌœCREtJRL` *"è¼P@ç%ÃthN™™™<`:´6]]]333¦S´K¨ˆ:”8;;3Z›ƒƒCpp0Ó)Ú%TDæ’íT™ŽÐŽá9"è¼P@ç…Š:/TDÐy¡"€Î t^¨ˆ:)>Ÿ¿zõj]]]yyy]]ÝyóæeeeÑ/‘$׌c5{‡maDò#­|ŒÐ,°@g$‰&MšD’dHHHŸ>}²³³;fnnž””$//Ïtºv#22rذaâ/•”” MƒŠ 3òññIIIINNîÖ­Aôöö–‘iÇŸ H’ÌÏÏWWWoäö/§¨¨Èb±šüö– ‡»æ:#ºc±XÒÒÒâ/———®®®ººº‹‹Kaa!½$É€€%%¥õëן={–Íf+++{zzŠwðóó«ÝøX||üرcÕÔÔºté2hР   ‚ &Ož¼wï^z‡˜˜uuõŠŠŠOe(((¨Ý&I’  ñvñ«âíEíÚµK___MMÍÑѱñGô)¥¥¥¼ÿ…ÂO´z762XTT”žžÞÉ“'%'€¦£  lÌïwUUÕ°°°O½JDllìÎ; bbb­­­íììįr8œ‚‚‚‚ &Nœ(n§¤¤Påë뛚šZ»AwX{ˆ~ýú-\¸0---77÷ĉòòòUUU>>>fffôË—/_°`„ ùùùuÚu6ŠGo߿߾}£££“““9ŽƒƒC#èSg©6z¸z7x‚™››ß½{·¼¼\¿¦ƒƒƒø-ð¹Pt(¬ˆdddîß¿/þRü±žËåRÿ•†††§N¢wxùò%AÅÅÅô«‘‘‘EÑWEj·ë”=µû¯óÇt;11‘® x<ž‚‚Bff¦P(d³ÙQQQ24¡"266ö÷÷§7feeIKK—••5íˆê=(Š¢ê ÜàQHü©b¨ˆ¾îšèŒØlvRR’øK.—+žhN,##ÃÀÀ€nÓÌÌLúKEEE‚ ¤¤¤ê´ÇãyyyYZZ²Ùlwwwz£ŠŠÊرcCCCïܹ###caa!!C¤¥¥¹ººÒóÂikk …Âf<"Z½< Áôôôš@gdkk{èÐ!ú2A,ëñãÇuöÑÑÑIMM¥ÛtƒÍf7WKKËÔÔÔÝ»w§§§_½zU¼ÝÉÉ)$$$00pÆŒ$IJÈ@Qñ™›Í¾páýWa‘HÄårŒŒšëˆhõnðLJÖ´Â ßcѦM›rrr8N\\\NNιsç¶nÝZgŸÙ³goß¾=666))iéÒ¥§‘óªùùù¥¥¥ÕnMBPSScjjjhh˜àææFDQQAS§N‹‹ pqq‘Åb]¼x‘Ïç{{{ךËåÖ‰Þîæææåå—œœìîîneeõ9ç¬Qê ,áL¶Z0ø$Æî×€ÐÈçˆ(Šzÿþ½‹‹‹ªªj×®]9}í¢ösDÕÕÕk×®ÕÖÖVSS›1cƧÑù¸M„¯¯oFm±±±aaa½{÷–——777ˆˆ°±±éß¿?Ý­­íÀéö§2œ>}ZKK«{÷îô\vôvKKK…ÂÂÂ:ÁÄÛ«««×­[§£££¨¨hcc#ž5¡Á#ªW½¯ÖøSGñYÁ$ÀsD_‚¤>ú!íWPP³³s»þýngggjjºaæƒ´ŽŽŽA3 ]Â]sÐV”——?|øðÚµk®®®Lgùו+WÈúxyy1 šG;^—:˜Ë—/Ï™3góæÍ½zõb:Ë¿&L˜Ð®/¸@ƒP@[aoooooÏt è\p×t^¨ˆ óBE*"è¼0³@D/PÓH¥¥rÕÕRjj•-—ZTLLÌÈ‘#™NÐ^¡"èPtuu³ge¥Ì‡] ºUTȨ¨T¢"j¿FŽiffÆt €öŠÄûJ~~IXØÓóçŸòõ}ššobÒkæLsgh·nòLçhPtXOž¼;}úþÅ‹OåädìíMfÎ476f3  mAEÐÑ¢óç;õúuöèц3gšÙØ ’“ÃtJõ@EÐqTW BC㎹’òÁÆfÐâÅß™˜`ÊIPt|~…¯ïƒ'îp¹åööÃ/¶20Ðd:@;€ èíŸ_±ÿÍ¿ÿ¾«  ;wîè¹s-ÔÔº1  ÝÀ5"€öª¦FèçýÇ×ÊË«,øöÇ¿UVV`:@;ƒkDí@ x¸oßµÒÒÊeËÆÎ™3³i4 *"€væîݤ-[.$'pv6]¹r|Ïž,¦´c¨ˆÚœÞÖ­ÃÂâ§Lö×_?ôî­Ît"€v@;PU%8pàÆÁƒ· èyùòª¡Cu™NÐA "hë®_µyóù’’Ê_~q´·.%E2 ã@EÐv½_¸iÓù›7_ÏkáéiÃbue:@GƒŠ -ß&glÌŽˆX9dn“h¨ˆÚœ7^ã69€ÖŠ  áñÊ·l¹7}º‰—×--e¦tp¨ˆÚŠˆˆç6„((È-5ª/Óq:TDÌËÎæ­Y•¸p¡ÕêÕäåñ  •à.“(Šò÷Ù¾=¬gOÖŋ˾þºÓ‰:TDŒIMÍ÷ô xòäÝš5ÝÝ¿•••f:@§ƒŠ€B¡èÈ‘È={®öí«yùò*ccvÓúqttlÞ`Б¬ZµÊÌÌŒémÓ:·oóììöÿúëeOO›þYÙärˆ ˆÌÌÌfÌFHHHFFÓ)Ú\#hUgÎÄlÞ|žÍf;·ÄĤ÷—w¸råJ''§/ï:’Ä2V‚Š •—¯Y|éÒ³yó,6nœ‚ åÚü,h ·n%¬XqFVVk ´)¨ˆZVMpÛ¶°“'ïN™2ì×_••»0þ@ JKË_¼Ø÷íÛ¼ßÿÞÑqÓq .Ì5ÐRüü¢mlö…¢+W>>fffôË—/_°`„ ùùùuÚu6ŠGo߿߾}£££“““9ŽƒƒC#¨içÐÜÜüîÝ»›7oþ¬Cèß¿LLÌëׯG5uêTzcmRRR7oÞ¤(êãÓõ©0µS5øÿP…ŠàK?ÿ¸oßµŽŽ‡òóKZyèÆ|ê•‘‘¹ÿ~í·Ð¸\.õ_9ahhxêÔ)z‡—/_Q\\L¿IQ”P(¬Ó®SöÔî¿ÎK<O ÐíÄÄDº$àñx ™™™B¡ÍfGEEIÈЄŠÈØØØßߟޘ••%--]VVÖ´#jÌ9 ¦(êsÁÇLJÞOï\;ŸÏ_¼x1›ÍŸ®OE­@cà®9€¦«©®Y´d‰ßÂ…ßž9³@]]‘éDõ`³ÙIIIâ/¹\îÇ“¤eddÐmº‘™™I©¨¨H„””Tvãñx„Ï!]S}î!¤¤¤Ð·oßõs@@üW¶Õ9]M>¨£þìhã"#ßLœ¸OZš¼~}õ¸q™Ž#ɦM›rrr8N\\\NNιsç¶nÝZgŸÙ³goß¾=666))iéÒ¥‡Åb5¦s??¿´´´Ú ¢ÖÜ<O(ÖÔÔ˜šš&$$¸¹¹QTTDÄÔ©Sãââ\\\$d`±X/^äóùÞÞÞµ‡ær¹õF¢·»¹¹yyyÅÅÅ%''»»»[YY}Î9««1ç° ‡°cÇŽØØØ„„ñÎâ³—••µnݺaÆéèè||º Ù0yË@;$‰¼©«»ÊÃ÷¬¬ŠÙ0Dãžyÿþ½‹‹‹ªªj×®]9}ù¢ösDÕÕÕk×®ÕÖÖVSS›1cƧÑù¸M„¯¯oFm±±±aaa½{÷–——777ˆˆ°±±éß¿?Ý­­íÀéö§2œ>}ZKK«{÷îô\vôvKKK…ÂÂÂ:ÁÄÛ«««×­[§£££¨¨hcc#ž5¡Á#jò9üÜC bçÎ}ûöUVV¶··ÿðáC³×¥K—ï¾ûîíÛ·â µOWƒùÿÔG?¹àS*+kV­ ˆˆx¾mÛ477s¦ã$I:991¤‰ìììLMM7lØÀt$;|øðÆ¿å³NW{ÿ Õà®9€Æzÿ¾pòä}±±iÿü³¢-”CíZyyùǯ]»æêêÊt–]¹r…¬——ÓÑÚâéè0ÚñbÕ­éþýdww}}õ3gji)3§Ý»|ùòœ9s6oÞÜ«W/¦³ük„ ­yïÌgÕO@‡Š a'OÞݲåÂôé&¿þê$'‡ßžÍÀÞÞÞÞÞžéíN@ËÁÏtIjj„7†ž9³e‹Ýüù–LÇ€f†Šà“ KçÏÿ;!!ûôé­­0š*"€ú%&æÎûEQ.,ëß¿'Óq E`®9€z\¹ò‚Ãù]GGõòåU(‡:0TDu>ýÀÝÝgòä!~~î,VW¦ã@ Â]sÿ#Q?ÿ|éðáÈõë'/YòÓqÅÙÙÙÙÙ¹¹z“’’——×WPèSY™ZQñ¦¹ºh³Pü«´´ÊÝÝçáÃÔ¿þš;aÂ`¦ã4J```³ôSTTõòeÑ‹ÜÔT>A}û*ûíÔXÍÒ90ÅÜë4ŒlÍ•ÈÚ¬œÞÌ™Ç J||æõ•ÓqZÉË—Yϯ]{ùúu¶²r—ï¾`c3ØÊª¿’’ÓÑZ *"âÕ«¬Y³Ž+))øúþ¨§×é8-.!!'<<þâŧiiù::ªãÇš0aÐ7ßÈÊJ3  µ¡"€ÎîÖ­„… O ¬sòä**y…GRÃß]¹ò"+‹k` ig÷‡3¬_¿Lç`ž#€NÍ×÷ÁÆ¡S§~½wz…$;›wñâÓׯ³55•&O6uê°áÃõ¥¤H¦£0׈ “¢(jóæ ýuÇÓÓfÕ*’ìhåAU•àòåçîÞMRVîÂá µµýÊÌÌ@Zkoü*"èŒѺuÁ¶nµûá ¦ã4'Š¢îÝ{ëç}íÚK))©É“‡8:Ž5ÊW„ê…Š:ÊÊšE‹Nß¹“tøð¬ñã1§Ù”= ŠMJÊ8PÛÉiÄ´i&êêŠLçhÓP@çRTT6s汌Œ"??÷¡Cu™ŽÓ<ââÒ||î_ºôLE¥Ë´i_;;›Àf:@û€Š:‘ìlÞ÷ß)/¯>{vaß¾šLÇùR<^¹¿ô™3ÓÓ F6œ?ßò»ïŒqwÀgÁ\sÐY$'øþû#ÊÊ —.-×ÒRa:Îyõ*ëèÑÛááñÒÒRß?rΜQí¾À`®@§ðøqú¬YÇûöÕòõß®ŠŽN9tèæ­[o45•ÝÜÌgÎ4ÓÐPb:@;†Š:¾ÈÈ7?þø÷7ßô9~|n×®rLÇi ‘ˆŠˆx~øð­§Oߢ»h‘Õ¤IC:êJ­ tpaaO—.õŸ8qÈþý®í±„àó+Žòõ}PTTfg÷õ?Ž••qs3ÿá --e¦CtL¨ˆ cÚ»÷êo¿]Ù¸‘ãáñÓY>C^ÿС[¾¾TTº.^låâ2²[7y¦Ctd¨ˆ £‰¨Cýý£÷íûÞÞ~8Óq+=½`ïÞ«/>ÕÖV]¹r¼Ý×íñ©'€vt("µfMPppìþý®¶¶_1§QÒÒò÷í»vñâSµ+Æ¡hM¨ˆ ã¨©.[æåÊ‹ãÇçŽkÌtœ†egó¸qæÌÃîÝ—,ùÎÕu¤œ&=hU¨ˆ ƒ¨ª¸»ûLÇ‘$/¿gÏ•ÀÀGÚÚªû÷»Nž¿rÿþ>>÷å=='´P-äììÜìÝB;âààÌt €vwÍ@;VZZåæv"'‡ÐFË¡šá™31¿ÿ~½¢¢jáB+w÷1JJ -:b```‹ömÖ¾}û˜ŽÐ.¡"€öª¤¤ÒÕõXffѹsKôõ5˜ŽSEQÏwîü''§øÇ-.´b±º¶Â¸NNN­0 ´A¸:Ð4¨ˆ ]ârËœóù•áá˵µU™ŽS×õë¯~þùRZZÁ?ŽY¼ØJUµÓ‰ ~¨ˆ ý—C¡¡m­zñ"sÇŽð{÷ÞÚÛ›øù¹·µxP*"hg¸Ü2'§Ã%%m®JO/عóŸK—ž™›DD¬:T—éDÐ0TDО´Ír¨´´êàÁ›ÇŽEõè¡rôèìÉ“‡$–hP@»ÑË!¡Pøè×_#‘—×”™3ͰÄ@û"Åt€FiƒåPxxü˜1»6n 5ËüÑ£ÍsçŽn/åŸÏ_½zµ®®®¼¼¼®®î¼yó²²²è—H’Œ‹‹kƱš½Ã¶0âÇC|á $I|q.h \#€v€Ï¯œ5ëxaai)‡^½ÊÚºõâýûÉöö&ÁÁ‹{öd1è3ˆD¢I“&‘$Ò§OŸìììcÇŽ™››'%%ÉËË3 µ¡"€¶®¬¬ÊÕõhVïÜ9Æ×ÊËã{{‡Ÿ;÷ø«¯z…‡/ÿúë^ÌæiŸ”””ääänݺ¡¡¡qðàAooo™vü©€$Éüü|uuõFnÃ]sЦ•–V͘q83“{þ<Ã˰ÖÔ½=fÌ®[·vì°?~i{,‡‚ð÷÷÷ðð Ë!1‹%-ý¿[þ———®®®ººº‹‹Kaa!½$É€€%%¥õëן={–Íf+++{zzŠwðóó«ÝøX||üرcÕÔÔºté2hР   ‚ &Ož¼wï^z‡˜˜uuõŠŠŠOeß`F·éy,444êÜxV{;EQ»víÒ××WSSsttlü}Jii)¯zc½£Ô{¼UUU+V¬ÐÒÒÒÐÐøóÏ?%¼¥§§wòäIÉ© )(€¶ª¬¬ÊÖö¡C7¥¤|`6ÉÝ»‰cÆìÒÓóü¿ÿ;Ïã•1æSó›]UU5,,ìS¯»sçNƒ˜˜˜ÄÄDkkk;;;ñ«§   $$„ ˆ‰'ŠÛ)))Eùúú¦¦¦ÖnÐÖ¢_¿~ .LKKËÍÍ=qℼ¼|UU•™™½ÃòåË,X !C~~~vâÅÛ÷ïßß·oßèèèääd‡ãààÐÈ#úÔYúXlll½£Ô{¼^^^zzzwïÞMLL3f SBHssó»wï–——Kø—upp¿´Q••5η7¾~Í`Œ¤¤\'§C={®pw÷IKËg0IƒYÉÈÈÜ¿_ü¥ø=—Ë¥þ+' O:EïðòåK‚ Š‹‹éW###)Š …uÚuÊžÚý×y‰Çã º˜˜H<OAA!33S(²Ù쨨( šPûûûÓ³²²¤¥¥ËÊÊšvDõ½¥ÞQê=^}}ý¿þú‹ÞøìÙ3z£„ÁÁÁŸ #†Š ip×´E55Â… O={–´hÀ€žŒd(+«Ú´éüر»?|à-:ztvïÞáq6›””$þ’ËåŠ'šËÈÈ000 Ût#33“þRQQ‘ ))©:íÆãñx^^^–––l6ÛÝÝÞ¨¢¢2vìØÐÐÐ;wîÈÈÈXXXHÈÐiii®®®$I’$©­­- ›ñˆ$RïñæääÑmqCBH==½&94´9hñbß{÷Þúùý8p 6#‚ƒc-,v=Ú´ÉöÚµÕ£G1£%ØÚÚ:tˆ¾ B‹Åzüøq}tttRSSé6Ý`³ÙÍÀÒÒ255u÷îÝéééW¯^owrr œ1cI’2PE|fÄf³/\¸@ÿ=X$q¹\qÒŒê¥ÞãÕÑÑ×¥ÉÉÉ †lr‘ Âw´-"åépãÆ«¿ÿþÁĤwëHO/˜=ûÄòågFŒÐ¿ukÍüù–íe•¡FÚ´iSNN‡Ã‰‹‹ËÉÉ9wîÜÖ­[ëì3{öìíÛ·ÇÆÆ&%%-]º”Ãá°XšaÜÏÏ/--­vƒøÿ'! …555¦¦¦††† nnnA1uêÔ¸¸¸€€ X,ÖÅ‹ù|¾··wí¡¹\n½‘èínnn^^^qqqÉÉÉîîîVVVŸsΫÞQê=ÞY³fmÛ¶íþýûoß¾ÏâÐ:! .FîÕ¨—H$Z¹òl¯^«oß~Óú£WUÕìÛwU_ÿ'kë_îÝ{Ûú¾P#Ÿ#¢(êýû÷...ªªª]»våp8ô˜ÚÏUWW¯]»V[[[MMmÆŒŸzDçã6A¾¾¾uµÅÆÆ†……õîÝ[^^ÞÜÜ<""ÂÆÆ¦ÿþt?¶iž(° IDAT¶¶¤ÛŸÊpúôi--­îÝ»ÓsÙÑÛ--- ëo¯®®^·nŽŽŽ¢¢¢xÖ„¨^¿*>oRïñVUU­\¹’žkîôéÓô4&¤xŽ iHêó¥´¾_~‰Ø¿ÿÆþý3§Mûº•‡¾yóõÆçJJ*·l™jo?\JŠlå_.((ÈÙÙ¹]ÿf·³³355ݰaÓAÚ%GGG‚ ‚ƒƒ™ÐÎà®9h+ŽüóÏ»w;µr9”•Å=ûĬYÇMMõ##×::ŽhåP{W^^þðáÃk×®¹ºº2å_W®\!ëãååÅt4hNíxujèHŽÚ¾=ì矾ÿ~d« *ŠŽ‰Ü·ï›Í ñ07ïÛjCC—/_ž3gÎæÍ›{õj+ëÞN˜0¡]_p€FBEÌ |´eËEOÏ sæŒjµA?~·vmPrò‡¥K¿[²d¬¼<~'2ÉÞÞÞÞÞžéÐá§?0ìÆ×kÖ¹»ñô´i¹Ü²ÿû¿ ¡¡-,ŒNœ˜Û1V€¦AELЉIqw÷™>ÝdófÛVŽ¢¨8oïp‘ˆ:rÄmÊ”a­0(´e¨ˆ€1/^dΞ}ÂÚzÀo¿9“d‹OfðömÞúõ!11)sçZüôÓeå.-="´}¨ˆ€))\\ލ}àÀLié–û´ªJðÛoWŽ»mlÌŽˆX9dˆn‹í*"`@V×Ùù0›Í:uj¾‚‚l‹Žuûö› B J6m²3g´ŒL_y"((¨Eû ©òr’RËþ«Adffêèè0 ýAE­­¤¤rΜ¿dd¤OŸž¯¤¤ÐrñùÛ¶…=ûÐÂÂèÌ™dggç–èVVVS^^ONNONŽ]]YTt¡%F/äààÀt€ö‡ÄDûКª«®®GsÖ·h‰rýú«µkƒá¶mÓììZuÉ׃ϯ¼ÿmTÔ›¨¨Äwï •”F2üöÛþcÆôëÕ«;Óéš*"h=hÞ¼“¥?¿¤ÿž-4JnnñÚµÁ7n¼vuéåe«¬Ü‚—¡:žª*Á£G©×®½ºqãÕ»w…²²Ò#GXZYX ¤#%Õâ`´2Ü5­gýú;wÏœYØråŸ_ôŽáÝ»+ž;·ä›oú´Ð( EQ/^dÞ½›tçNRllZee‘Qg˜¥¥‘‰Iï®]å˜ЂpZÉž=W~ÿýú‰smlµDÿÙÙ¼5k‚¢¢.´Zµj|—.ø߀¼¼âë×_ß½›“’Ÿ_¢¬¬0fL # #Ü®@k8yòîž=Wwîth‰rˆ¢(ÿ˜;´´TΟ_2|¸~³ÑaˆDÔ‹™·n%DE%>y’.ˆŒŒzL›öõ˜1ýÍÌ ZzÞ?€6׈ Åýóϳ… O/Zdµa§Ù;OO/Xµ*àñãôeËÆ.Y2V^쫟_•xëV­[ ùù%,VWKK£1cú}ûmÿž=YL§`*"hY¦Î˜qØÎîë½{gds>—/Q‡ßÚ»÷Zß¾šûö}olÌnÆÎ;‘ˆŠ‹K£ï‹{ù2SZZŠž#aìØýúõ`:@[ŠZPjj¾­íÆÆlÿ²²ÒÍØsJʇU«ž=Ëøé§ XuøuW¯¸¸üÚµW7n¼¾ÿmQQY*cÇÓO±X]™NÐæ "€–RXX:eÊ]»Ê?¿´Wb EGŽDîÙsuÀ€ž{÷~ËÄ“Å]¿þêúõׯ^eII‘¸ÐH¨ˆ E”•UMŸ~ ¤¤òÒ¥jjÝš«Û¤¤\OÏ€„„œ-[ì\\FvòåqJJ*oß~sýú«¨¨Äüü--åqãZXm¨ªÚlç cÃã§ÐüÑ‚§²³yááË›«¢(êï¿ïy{_ê߿ǥK+ZnE£¶/'‡wãÆë›7îÝK*/¯0 §£ãkë#Fè7ï­‰®@óûé§ ØÀÀE¦¦Í³FjVwåʳ¥­Y3qÁ‚o¥¥;ÝSCE½|™uíÚ«k×^¾|™Õ­›œ……‘µõ+«l6&‹h:\#€fvøpäÙ³1‡»5K9DO(·gÏÕÁƒu¢¢Öu¶•CKJ*¯\yqãÆë{÷Þr¹eFF=¦Lº{·ÓÀÚ°,h ¸FŒqttd:fff«V­b:t(çÏ?Y²ÄoãFÎâÅÖ_Þ[v6oÕª€èèä5k&vª å²³yϯ_õèQªHDi0nÜÀqãv¶‚ à0&$$däÈ‘:::Lé¼bbb˜ŽMllÚªUgøÁ¢YÊ!?¿è;´µÕ®\Y5`@Ç_kˆ¢¨ØØ´ë×__¿þ*))WYYaüøAþéŠY³Z®cH’ trrb:HçE_¦ f:tEÎïƒiŸ:õã^ÌÉËã¯^ùfÑ"ëÕ«'ÈËwä¿ß•—Wß¼ùúúõW·o¿)((íÓGcâÄ!ãÆýuïÎsM €Aùw ´š’’J7·ãZZÊGÎùÂÏñ—/¿X»6HQQáüù¥#Fè7W¶&/ýú«ë×_ݽ›T]-01é½`Á·X> õ¡"€/US#œ=ûDYYÕ¥K+å›ÜW¾vmpxxüÌ™f›6Ù6㢮mÇóçô:ª/_fvé"gm=à—_­­tï®Èt4€N |©5k‚^¿Î [¦©©ÔäNîÝKZ¹2@ úúþøÝwÆÍq"õôéûk×^^¿þêÍ›•®VVý/¶úöÛþÊÊ]˜NÐÙ¡"€/røpdhhÜéÓ?5ñv¯²²ª­[/úûÇØØ úõW'uõrµ¤´´êòåç7n¼¾s'‰Ï¯9yò¾®]å®__=wîèv]%'سçÊ„ {7üôSEÞÞö¯^툈X¹lÙX”Cm®A›&‰&MšD’dHHHŸ>}²³³;fnnž””$/ßô§·%ˆŒŒ6lA%%%?ÿüóôéÓSSSed¾è;EZZÚ××WI©éÏW´~Ï ÊÉáÍ{r̘~[¶Ø5áíééK—ú=ž¹i“í¼yí´¢W vãÆ«wï 54”llyzÚXX)(ȶèÐÑÑÑ-:t$Xë@TDЦùøø¤¤¤$''wëÖ  ƒz{{a‰"¢¢"‹Å"‚Åby{{9r$--ÍÐа ]‘$™ŸŸ¯®®N’äÌ™3›;é¿C´PÏ’UW ÜÝO±X]þøÃµ Ä„†Æmت©©¶|èPÝ–HØ¢jj„·o¿¹~ýÕ­[ ÙÙ¼>}48œaãÆ›˜ô––n¥›/öîÝÒ:cA€Š@Ü5mš¿¿¿‡‡]‰±X,iiiñ—ÀËËKWWW]]ÝÅÅ¥°°ÞN’d@@€ŽŽŽ’’ÒúõëÏž=Ëf³•••===Å;øùùÕnÔA"##CQÔ®]»ôõõÕÔÔÅCÐâããÇŽ«¦¦Ö¥K—AƒÑ}¡¡¡AßÒFßÛ&!jxx¸ŽŽŽššÚè±±±fff]»víÝ»÷‰'è!!!=zôèÞ½ûü!~¯xˆsçÎéëë³X,''§:!š×š5Aiiù§NÍWVþ¼ ²‹‹Ë,8µlÙ''Óë×W·¯r¨¤¤288vÁ‚SC†lž3ç¯ÄÄܹsGGF®½woÃÆSÓ>­VÑ(€†¶æÿ–íÓß§Ðy(yUUÕ°°0 =ÄÆÆîܹÓÀÀ &&&11ÑÚÚÚÎÎNü*‡Ã)(( ÿŒ:qâDq;%%…¢(__ßÔÔÔÚ ºCúí|>Íš5ß|ó EQû÷ïïÛ·otttrr2‡Ã ¡÷ïׯßÂ… ÓÒÒrssOœ8!//_UUE¿šŸŸ/Þ3??_BT›¼¼¼ÐÐP™ÊÊJŠ¢úôé³víÚœœœÐÐP))©ÜÜ\‚ ¦M›VTT(ÞM< Aýû÷‰‰yýúõ¨Q£¦NÚà?ƒƒ>QAìߣW¯ÕqqiŸûƘ˜”#¶ºéÖ­„ÈÕRrsyÇG99êÝ{µžž§›Ûq_ßE̦Â÷/4]1 MÃw0¦1‘ŒŒÌýû÷k¿…Æår©ÿ CCÃS§NÑ;¼|ù’ ˆââbúÕÈÈHŠ¢„Ba¶¸ìù8RmÒÒÒQQQEûûûÓûdeeIKK—••‰ðx<@@¿š˜˜X»D©SIˆzþüyq<ú]jjjûöí£wær¹€ ˆ'OžÔÙ­vÃÇLJÞ?>>^ܹøDMpíÚKmí•>ë]ÕÕ‚;ÂutVÍšu,?¿¤…²5¯¤¤Üß~»lc³G[{¥¡áÚ¥Kýžr¹eLçú¾¡‘P4ÏA›Æf³“’’ÌÍÍé/¹\nyy¹¶¶ví}222 è6ÝÈÌÌ466&BQQ‘ ))©:m Ä3+TWW?~|úôééééiii®®®®®®âÝ233ŒŒè6ÇÛµk×ýû÷“““Åë%!*}Pµã:thùòåûöí³²²rww§O‚ŽŽŽ„£wÞ¯_¿Ú4—7or<<|gÏíä4¢ñïJO/ððð}ó&wçNWבm|…·oó""ž_¾üâÅ‹LEEy+«‹[YY PRú¼û ½ÀsDЦÙÚÚ:tˆ¾$B‹Åzüøq}tttRSSé6Ý`³ÙM‘žYÅbijjzzz¾}û–Íf_¸pþ+‚H$âr¹µ+KKËÔÔÔÝ»w§§§_½zUBç¢~üq„ ïÞ½ îÙ³ç·ß~KÏ9.ù£dJJ Ýxûö-ñeçàcEEesæü5l˜ÞÖ­Ÿ1¹œŸ_´ÍžêjáåË+gÎ4k³åЋ™¿ü1fÌ®1cvýý÷Ý¡CuýýÝ_¾Üq䈛­íW(‡:0\#‚6mÓ¦M&&&gûöíÚÚÚÑÑÑ?ÿüs}fÏž½}ûöþýû«¨¨,]º”ÃáГÅ5ÈÏÏoÔ¨QúúúâFH’,**rssóòòÒÖÖf±X¿üòK\\ÜÓ§OÅ»ÕÔÔ˜šš&$$ÐñŠŠŠÔÕÕ ‚àr¹t£ Q‡ fgg·víÚáÇS¥ Ðð²;v+**zxx4þ<4†@ Z´è´”yìØ™Fý5­¸¸|Íšàþy¶h‘õO?M“ks¿qè)ãÂÃãoÝJ(**34Ô²µÆá ÃÚAJ›ûýP›¦¦æƒÖ­[7~üøªª*kkëààà>}úÔÞgíÚµ¥¥¥Ó¦M«¨¨?~üþýûÙù¬Y³|}}õõõÅ÷QWWß¾}{PPPEEÅ´iÓx<Þ¨Q£BCCkïsôèÑeË–mܸÑÄÄÄËË«¸¸xêÔ© –––C† ÉÊÊRSSkBÔ'N¬X±âÈ‘#ÚÚÚ¾¾¾Ý»woðˆæÍ›çââòáÇqãÆ>|¸‘ç 1vì‹éÒ «kcöö,cñb_>¿âäÉÆÔÒñ>KyyõÍ›¯¯_uãÆëââŠáÃ{¯X1~ܸ½z5ü]I}ô49@ë I200+$4’$ccc‡Þø·8::Üb¡ ƒ8s&fÍš ¿þúÁƦáÚ†¢¨ãÇïx{‡eøûï.ššmeáÒҪ˗Ÿ_ºôìÞ½·UU5&&½§L6aÂ`U¦£5Eã¿ù|þ¶mÛ?|ø ©©9~üømÛ¶ÑÏ.6áç†dÍÞa[‘$IWW×Ú‹4|á âÕêZçíAAAÎÎÎø¼ ®€$¦®_²j•McÊ¡¼¼â%KübcÓ½½ígÎ4k…x *,,½|ùÅõë¯îÜI‰¨o¿í¿k—ƒµõ€îÝ™ŽÖD"ѤI“H’ éÓ§Ovvö±cÇÌÍÍ“’’äåå™N×nœ={vÙ²e¦¦¦L€Š ƒÀßÿàËÕÔee¥koÉÉá-Xà3qâ•+Ç7øöÈÈ7Ë–ù++w _>x°N‹Ål”¼<~xx|xxü“'拉¥ÆŒé÷ë¯NãÆ lä]†OJJJrr2½Ôµ††ÆÁƒ½½½edÚñ€O]$ùÂk/8::®X±âÁƒ_Ú,Ì5AEÙÚþùF¼¥¢¢zöì=z°~ÿý{ÉsÄÕÔ7m:?sæ±1cú]½êÉ`9”ž^pðàÍ©Sÿ41Ùò믽zu?yò‡„ïS§æ;:ŽèlåAþþþt9$Æb±¤¥ÿWú ///]]]uuu—ÂÂBz;I’:::JJJëׯ?{ö,›ÍVVVöôôï@ßK&n|,>>~ìØ±jjj]ºt4hPPPA“'OÞ»w/½CLLŒººzEEŧ2ÔnÓÿ+jhhˆ·‹_o§(j×®]úúújjjŽŽŽ?¢OY¶lÙ‡jo¬÷¼5&AçÎëÝ»7‹ÅrppøðáC½]}êßEÌËËËÄÄ„ÇãI cf$h3rsy'OÞm•ŠccSCCãöí»ºråY‡²² ®Ð - +í×oµõ¯oßæµzd*11ç·ß.³«gÏC‡nòò:÷ðaŠ@ lý$­¯‘ß¿222÷ïß)þ{(—Ë¥þûdohhxêÔ)z‡—/_Q\\L¿IQ½(\ív²§vÿu^âñx€n'&&ÒŸæy<ž‚‚Bff¦P(d³ÙQQQ24¡"266ö÷÷§7feeIKK—••5íˆjaii¹cÇŽÆœ·FÆ (êÉ“'A¨««Ü•„þúé'‚ ^¾|ù©Ìµ¡"hP;¾š,/¿ÿ _ß"%Šx¼ò²²ªnÝ>ï[>¿"=½àÝ»Â÷ï ß½+¤99ÅÕÕ‚ ””ôõ5zõêÞ¯_ÏñãõêÕ]O¯{Ïž*µ$Ù¼™ÛÌM%Q¡¡q ¡PôìÙûW¯²æÌejúïd÷?ÿ|éÝ»¢åËÏ ¤Ý»·:A••5kÖ…„ÄÍ›géå5E^¾õ~¡¤¥åÿóÏóK—ž=žÁbuµ±äå5ÅÒÒ¨ .yÄ86›””dnnNÉårËËË鉿Ä222 è6ÝÈÌÌ466&BQQ‘ ))©:íÆãñx»víºÿ~rr²xmk•±cdž††2DFFÆÂÂBB†&HKKsuuuuuoÉÌ̤Gÿ’#Ú·oŸ••Õ¼yóè/Ì,!Fß¾}é-ýû÷'¢  àã®$ô÷îÝ &ìÚµË××·ñ§>¥î/èè茌 F¢@K¨3·uzzÁž=W.\xJ’$ýчöþ}á€ìz{¨¨¨~û6.xrsù>ðéú§¸¸œ )mmU=½î½zu·´4¢½zuWQét7ë´k±±iEEeâ/kj„E}*++Û,GÐiÕsƒƒƒVlìèÙ‚x÷®ð·ß._¸ð”$‰:µMFFf÷î+Ë–ù—”T!%Eöè¡Ò«W÷zÚØÐ7¼©éé©·Ä2‹ÎÎÎtH‰¤ºt1’‘Q-)‰nöàààÀt`žHD]¼_»ªýRDÄs‚ âßGPáýûo­­û?>WA¡)ŸÃÊË«W­:/++]ZZ¥¨XÏ-»(::ùÚµW—/?ÏÎæõí«éìlŠB¨ 455k×®---6mZEEÅøñã÷ïßßÈÎgÍšåë뫯¯/naee%Þ!66öèѣ˖-Û¸q£‰‰‰——WqqñÔ©S”••Ç—’’2tèP þüóÏŸ~úiݺuüñÇ‘#Gè–––C† ÉÊÊRSS«G¼}ýúõÓ¦Mãñx£F mêù«‹ÍfÿôÓO›7o–¹11–-[6qâÄòòòI“&8p [·nwÕà¿ËêÕ«}}}÷íÛ·fÍšæ:@€Î‰¤þÿ5L°†}‡äââ¾hѺ¢ÿÜ[/YYé‘# &MB_öÑÕUkË>ô¬¢GòoÝÊær«FŒÐtvÖ—<ÿ/4®®®™Y›XFbo Þ—HRŠ¢êþô IRFFêÒ¥M˜e;%åÃìÙ'Þ½+ ERRäÁƒ³¦NýJüjMðöí7ááñ·n%•õ˜2e( ¡zu€ß×vvv¦¦¦â›Ð …Ð!­óyjÃC¨Ÿ_yñbº†Æ¬ÐÐÇ î\S#’““ž={T+«­Î3NµUW NŸ~pèЭÂÂRggÓ%K¾ÓÓëÞšÙ:•óçŸÈÈHÕù»‰ŒŒ´œœ´œœLIIeËËE‰DÔ¼y'oÜX£¬¬Ðø®]LQÝ!I’çÏ?™:õ+q!tóf—[6b„þŠãÇØ«¾ñ;¦òòò/^\»ví?þ`:Ë¿®\¹2qâÄ·oܸqÇŽ­ŸZ*¢ŽIYYÁÚZûܹ£[·xü8ýéÓw¥¥UÒÒR²²2UUÕýˆJK+¨·ŸÖGQTxx¼·÷¥üü—‘Ö={6Ãã°ð)(,ìIírˆ¾;nœ±––Нïƒzï¶ EÙÙ¼µkƒvkÌ(ÕÕ‚CÏœyHQ„ø<¡PtëÖëÕ«oÞ|—Ç74Ôš3gÔäÉC›í±~h›._¾þÝÓ§ï=JËÌ,ªª”ª«+2•0'‡·uëÅððg£Fõ=p`æ AÚ ¿šÃ… Ode¥jj„ÒÒR"åè8bóf[99™1cvÕypOJŠ”’’ EC†èØÛoä]m‘‘o.<]QQ]ïµ&’”4HgåÊñÍu8•HDåç—|øÀÏÍ-ÎËãçågd(ëêò™ÎР"êŒäädLLz™˜ü{¯Wþôé{™Ï[t¯¹ˆDÔ©S÷wíúGSSùÔ©ùcÇ6q=>h‚šaDÄ󚡜œ4‹Õm÷n§qã±cGxv6O(¤ˆZ…ÐСºÓ¦™L˜0XGGµ1‹DÔÎÿ:t‹øoI™Ñ7Î5a‘è)?¿$?¿$;›WPP’ÍËÏ/ÉÉ)þðŸ“S\XX"¾³±[7ùž=UJKå˜M Ða4½"âóùÛ¶m üðღ¦æøñã·mÛF/ƒM’dllìðáÛ+åÇ~îõÎQmff–ŸŸ_gMÉWTTìØ±# ++KEEeĈ^^^#G޲²²÷ÖÍ~%c±ºZYõo±êˆ¿zu`zzÁºu“çÌÍTUÐiÝ»÷¶¤¤’$I—‘ë×s””‚xþ<ãèÑH‘ˆ’••DC‡êM™2lÒ¤ÁŸ5Á Ÿ_¹d‰ïÍ›¯|4£¦Ftûö›É“‡~É´ 55Âìl^^}‘‡þ¯8/ÿþ}annqU•€ÞMJŠÔÐPÒÒRÑÒRÖÒR>~õêÕOž<©¨¨000ؼy3½ÄMllì²eËž={¦©©éåå5þüO]ihh¡¡¡Q»(¢(ê—_~9zôhqqñwß}wäÈ:¿œœÜ»wïê=pqYE’dXXØ¢E‹ÊËË·mÛ¶dÉ’šššuëÖùúúÊÊÊnݺuÉ’%÷îÝ>|xíJ¬NUö©£#IòöíÛ³fÍÚ²eË?üðYÿpmAXXüO?õˆŒ\«­Ý¨§˜¢££#aá¬`Æ ¦4Ž„«C¯_gÿùçõK—žII‘ô“6……%ZZ*MK(”ˆ‹œwï ?Uó(+wéÑ£þš‡Åê&/ß²"ÄÚÊÐH:::L§hÓšøóúéÓ§+V¬¼Ïo¿ý¢ªªºhÑ¢ùóçŸ?ž~ÉßßÿÙ³g·oßvpp˜8qâ‹/趇‡GŸ>}|}}GE„¸A„••ÕÇC̘1ÃÊÊêĉ]ºt¹té’›››œœÜŒ3ÏŸ?ÿàÁGGÇ)S¦hiiIˆJQÔÇ׈<ø×_={VCCcÅŠ .¤%¯^½ÚÃÃãÆS¦L;v,›]ÿº|òäɽ{÷œéb/<<üÊ•+ ‹-’Ïž„£#bÆ gΜ111i°“6¥¦F¸qc¨¿ÌâÅÖk×NÂSCÐdEݸñú÷߯?}úNFFZ$¢ÄW¢rrŠ%WD"•ŸÏ¯÷"O^^qQQYMÞSYY¡G]ä ¢+.xèâGAA¶ÅóÓV­ZÅàèI+¢’’ú‚ MmÚ4‚ Ö¬Y#nõéÓG|ïYí›Ð>žY ˆ‡***JKKaaaQUUÅçóÕÕÕy<^=zôè1}úô¦=Ûsøðá­[·Ž9’ ˆ£Gêéé•——wíÚuõêÕæææ!!!¿ýöÛœ9s¾úê«]»v7®ÎÛ.\¨©©igg'JJJ|||6mÚôõ×_qàÀ!C†4àSGGÄÊ•+GÝ„ƒbWþãÇÇg80sÚ´¯™Ží•@ :þñþý7““?ÈÈAÂÚ;äåñ)Šúðá“5—[^]ýåÙlUºÎ12êѦjhM¬ˆØlvRR’¹¹9ý%—Ë-//§'šËÈÈ000 Ût#33ÓØØ˜ EEE‚ ¤¤¤ê´?ÇÛµk×ýû÷“““ŒŒÄÛ:´|ùò}ûöYYY¹»»‹s~–´´4WWWWWWñ–ÌÌL##£âââo¾ù†î3''gÇŽS§NÍÈȨ]"AŸ ñqeddôéÓ‡n~ÉÑ¡§§×„#bPJÊ7·EýóÏ L¢MSYYãç}øpd^^1Aü?öî<ª~ ø9È’5kÆ¥ÞÊÛ¾ª´¡ˆP–RQQ*)[(Z%-(„”’W²¦H‰VmZ¨”, !û}fîç½s]1 ÆœÁóýÜÏýgÎü~Ï9oižù-‚ ”ŽŽ®;Ùqp°;9ÅØÚFÔÖþ¢žãå''M"¨ªNã—””å‡ñjæú˜­^½ÚßßÓ¦M؆гgϺ\#--]PP€M{+((@¤§ f}¦¢¢2oÞ¼3gÎLŸ>B¡psscçW®\YTTôþýû›7o.Y²¤°°°K¶Fàéé©££ƒ …B©¯¯Ç†¿&NœxáÂ…Õ«W#"))éîîîïï_SSÓ%#ê²ß·¤¤daa!ö4òóó;¿„•éø}ácOw‡ô5ÄKròKËkÓ§Ë]ºdJÝ7èG"¡¼sçºVW7R(=V7B„ UPÕÒš*))$&ÆO ‰ŠòÃÖmhèã냖••iiiedd”••ÅÆÆ=z´Ë5¦¦¦®®®ééé¹¹¹VVVZZZ]¶^èɵk× ;ô¤½½}Μ9ŠŠŠ999&&&‚ÔÔÔ 2mÚ4'''YYÙY³fuÉ%h îÐ111qqqÉÈÈÈËËÛ¾};u!“]RRRYYÙÇmmmçÎûÇaŸ 6?~üÍ›7999vvvÈS&!!¡¸¸8"‘èææFçÝ .~~ÍÌ‚ g_¿né *+òòF VV6t[\®3‰,//¶eË¢•+ÿž9sŒ¤¤¤ChëcF$..þòåKaaauuõqãÆÿ¾££ãš5kôôôæÏŸ/..Lgã›6mzñâE烞ž?ž@ ìÚµkóæÍ+V¬À†t‚‚‚>>... ¿¯ êéî ‰|èÐÍ'îìÛ§qüø˜—†0"‘hoo/##ÃÅÅ%##cffVZZн„¢hFFûbxƒô qƒL &Æ?aBÍüù¥©©.îîúkÖÌ@„ åàèšíHäÒÒÚ‡v™{€U6øc<Ð?~üûï¿+++éIÕú,**ÊÈȈÆÜ’ÕÒÒ¾kWè“'Ÿ½½µµ§áýDçïC2™¬¢¢‚¢¨‡‡µbuBBV±EÑ.ÃôÃü#Ú7Èœºü· P(¹¹¯^¼~]ðüùן?‰ll(''GKK;‚ ŠŠ))NÌ ÀÀ¢U‡žÉ“'¯ZµêàÁƒ¿~ý:xðà²eË4ê-2™B¡PØÙ3ŒSUÕhbr©¤¤ææM«©SeÒ&,kÐU¬¦Gç‚,xƒ(ŠN˜0z„Ñ&&Ê‚”–Ö¦¥å¿~]øìYnQQuMM#^Œ`"“DFFfff„qãÆýúõëâÅ‹xG„TT“’>œlhhhllLJJ¢îÄÍL¿~µ¦¦æûû?ÚºõÊ”)§O?¼eËe?¿G©©yÍÍm¨þw‘•U¬«ë+ Às󦕜 ‚0pÞ¾};uêTÚ×P+V¿|ù²¢¢ÂÜÜœúV±úêÕ«'Ož ÍÎÎöòò¶èì¶buëÖ­STT|óæÍ·oßlllLLLÚÚÚ cbb° """ôõõ½½½{Š¡ l¶-uŒè7ˆÕŒ.--¥³}Œ³³sDDDjjê?ÌÌÌh_L?aa^5µÉŒj Àp0ˆ'u€?BQŽ×¯ ÒÓ _½*|û¶¨ººAPNNö޵¸;‰DFD\\ ÿ;¼zU`jô×_’!!f°­>˜_±º‹n«9ëêêîØ±£´´TRR2:::<<ÜÜܼ§úyƒXÍè­[·öª}'''ìb??¿iÓ¦Ñ Àp0F44‰-ááùºº¾'OÞMIù\]M¬§´µuPÓ!ªþç¶/BO1øøøìÛ·ÏÉÉÉÛÛûÂ… ØI¬huii©°°0=7ØÛö133366þùó§ššZ@@ýüw]vß™}¼? VºVhõòòJMMÅ+Àp‹K’É”žò¢„ë3亼·µµ£¼¼þû÷ꢢj,S**ª.(øÙØøïü:žÍÍãÇK¨©M–“Ã’%ឣ脢hdd¤¡¡aAåå¾ÏMWWwΜ9À;®Ð^Ö™í©Bkjjþóç¹ÕÕØ08‰DA B+€^ê:Fdkk‹K€ °ñ¢•+ÿŽŠzíå•\QAD –ÉÈÿ~=–ç,Zôçëë›ŠŠª¯\y1s¦ìÈ‘\ ïJKk;:È‚prr`cJÔINNdÌ1n¦Ü%A¤©©);;;99ÙÛÛïXƒLFŸ=Ë}ú4755ïãÇÒÖÖvv6 åß_b ‚¥CH¿Ð€žÀîÛÃΈì6Ì74œõÚÓ3©¼¼ž‹‹CT”þG>~ü"&&ÃÃÃpýúyØÉövRMMcE‘:šTTTýìYî÷ï5Ø8¤ àHjŽ$!! !! ''¢¨(ÁÃÃ9 ÷ À𖘘¸yóæC‡ÉÉuþe]¦'ÐVYÙðå‹pM ‘Q;;™LÁÞÞíž1ììl£G 2,PÃdDÖ­_?ïÎ÷ññïP´óܼ½ïŸ>xæÌÿÒ!¬A A Á)Sd:_\Sóëû÷êïßkŠ‹«±uJwî¼/-­mo'!ÂÉÉ!##,++ÜyŠÂKúkíÚµk×®Å; Æã7®¶¢¢­©I®²’H×-¶ÂÂÊààg’’Bbbü‚¨(ÿˆìÌ Àà=‡5l¶ö4úßâãóàôéÄÓ§ Œçýùjææ6M¶Ëylêu@éǺ·o¿çæ–·´´³³Ã÷»€ÿÃÎN!##?|øÉÃ#1;»”­Û1¢Žraa•‡GRmí/êI11~QQ~APLL€@ã—””åï}jƒdD ‚ƒŸ:u×ÙYkÆþn'(8rÊ”‘]”Z[;Š‹k}úÙ8`HbcCÕÔ&«©M~ýºÀÛûÁãÇ9ì¤Î×HäS§ ÔÔ&#R_ßT^Nüù“X^^ÿó';~ö,÷çO"ué#‚ \\£G Š‹ ü÷ÿ¨ÇRR£øø¸p¸UL Wxxš‹ËÍýûWíÚµl€ºàââ7NAhÕ“¥"‰ÇŽ‹ŒŒüù󧸸¸ººú±cǤ¤¤ÞocõGÝÎ*ì© E+++EEE»œ¤Òvpp8þ|II‰°0,™3G!,lûÇ¥oÝzÃÎΆMÄÅ`µ)(8r„ÑÝ6Òm¾”•Uü౤¤–:E#_’–ÅË ù zºDD¼²·rrÒܽ›‘u‡úŒL&kjj¢(£  ðãÇ‹/*++çæærq1þ µTå¨Q£?~¬ƒw,ÿçíÛ·ÖÖÖ´¯ñððˆˆˆˆ‰‰5jÔÎ;ÍÍÍoÞ¼‰½öþýû'OžèëëkhhdggcÇ––– ¡¡¡ ,@„zЭuëÖ-]º4((ˆ‡‡'!!ÁÄÄDWW—““A‹/ÆÇdz±±mÛ¶móæÍwïÞÅÞâççwùòåððp111kkë;vtûiÆÏÏïÍ›7ÏŸ?722Ú¶m…B¡®M:yòdO7Žõ?k¶·“V¯ö&‘È ÿprö÷÷ùçÏeªªg¸¹¥¹¸dF07W16ž'$Ôý8ɑɔ³g“½¼’P¡Î1ëÛâÅ“BC[úÖQg¢¢|·Ð‘Nœœ4ò¥ÖÖŽºº®ùRQQuVVIE±¾¾‰ze·ù’œœˆ„„€¨(?=ù:AFzTPPif¼`Á¸“'õ{U°ˆ :Pë­­¥Ž]¹råСCsçÎEÄÇÇGII‰H$  bgg'""¢§§‡ ˆƒƒõ¸¦¦FAA:(ÔÓèæÕ«W|||ììì‚,Z´¨µµ•H$b*xxxL™2Aÿ3fP—!=z›å(++ÛÔÔ4rd×Oœ;vì×ÕÕíèèhhhè¼2ŠÆMaÈÍív~þÏädûþ§C‚üõ—¤¡áœ72ÚÛIååõ'OÞuw¿£¡ñ÷¶m‹gÏ–ïmkll¨ÝŠ Æ™›‰-]v„ëŒL¦¬Y3³±\\´ò¥ÊʆÊʆ?ꪪ~ü¨«¬l(+«ÏËûùìÙ×êêêæx¼¼\’’‚55¢'V11v² #Ýûù³ÁØ8pìXñ‹7³`qC››«¬¬ŒýX[[ÛÔÔ„m4GU\\èV{{ûœ9ssrrLLL©©©Á^rrrÊÎÎþðáÃÎ; ¨ût›˜˜¸¸¸dddäååmß¾}éÒ¥½½ñ>ßJÚÛI;v„ˆ‹óŸ8Ak³¾Ùµk'g×ïAÈd2™L©­m |¬¬ìæìK{iPl..ÚW®låáÑeÛ2™"%%tôhÜôé‡ BC_VWCj€© #ÿ‡L¦ìÙöùsÙµkÛ{šéÎ ÄÅÅ_¾|),,¬®®>nܸàààßÁ;::®Y³FOOoþüùâââÁÁÁt6¾iÓ¦/^t>èV``àùóç ®]»6oÞ¼bÅ ÷ŸØ³g†††ŠŠÊرc©oÙ¿¿–––žžÞôéÓ‹‹‹oܸѻÛîÇMV0k IDAT¡ÄË+éÓ§¦#Gr2¼q!¡‘ÖÖj=l×F!‘È$iÉ’ ll½^[¸råßIIö²²"1‚ÝÛÛ8'ÇíÊ•­£G ¸¹Ýþûïƒ+Wz=-/¯ïÇ}€ÿ!‰ööö222\\\222fff¥¥¥ØK(Šfdd0°/†7È =677;;;;–››[BBBKK 6³`ˆA©Û€€ ˆ›[ÂÅ‹O¶/\ØÍl.æ@Q422’º“5è?d0ìœè‘’òeÆÀ'ôML”¨‹ÖÖŽ¹s]++~ÿEQÿMý™ª÷ëW«MÄÝ»ïÉd ;;ÛŠJAA[¨¯¶µu¤¤|¹}û]rò‡ÆÆÖ™3ÇhkOÓÖžÊÊ_Ðà…ο×d2YEEEQj=ë„„¬ž5Š¢ééé³fÍbTT ozܶm[jjªŸŸßĉëë룢¢ÜÜÜÊËËË®6ØîÛðy`ŒüÏ?ÿ¼ô÷töìzÓ! D+«k::Ó.B„‹‹cÿþU¿ŸGQôĉµý\¹ÄËËhâà ÉƆ’Hmíi_åääPS›ìã³!+Ë58ØLNNä̙ę3êèø=­¨€Q£^ÃêYß»woîܹbbbS§Nõóó{ÿþýÕ³fE«ªºÙg¯§óýtãÆ Å‹‹‹‹+**:;;ÿøñ£KA<À ø×½{ÙÄ8;k Ÿmp\H$²¥e(//—»»Á@÷e`0[QQ¢óÔ8Eåä„/žÐÿÆQݳG5<| ¤ªÚýN‰J`SzõTÏ«€éèèpqq‘‘‘566®®®ÆÎ£(!--ÍÏÏ¿ÿþððp `ggG½àÚµk~÷îÝ;UUUaaa%%¥¨¨(AV­Zååå…]––&**ÚÜÜÜS Ô$;¦­î’üt>O¡PNž<)///,,l``@ÿu‹““³¨¨¨Ûø{xt>7tûİw¥¤¤ÈÊÊ¢(Úåéµ··Óˆðg(”ÌÌoòòûöïÆ; …BA$22ï(†}}}}}}¼£ýuöl’¬¬Ý»wß™Ó]ròIIkì‚­mÄÊ•žJJ.™™ßÕů_­ô_ÜÒÒžœüÁÊꚢ¢£””ÍêÕÞ—.¥”—×3*˜A‡Î¿×£FŠïéUAÒÓÓÝÝÝÇŽ›––öåË—eË–éêêR_ÕÒÒªªªŠ‰‰ADCCƒzœŸŸO¡PBCC :` vîb„ ;vì(,,,// âââjmm½zõêüùó± öîÝkaaA#†ÊÊÊ.Ç]NR{¤ž÷õõ7n\jjj^^ž––õAýñŽºuæÌvvv}}ýÒÒÒ.°Ûðh÷Bû‚nŸö.eeågÏžtyz=EމŒŒ„Ï{ÐC¥¤¤fÚ´CëÖ´·“ðŽ…BŒh@F4<{–+%esáÂcfvª©yVZÚVFÆvãÆ‹íí¤ÖÖv ‹99û›73™FݦFDC¯988^¼xAý‘ú}hmm-å¿é„¢¢bHHvÁ‡©¯¯Ç^}üø1…BÁJt>î’ötn¿ËKuuuØñ—/_°´¡®®Ž››»¤¤„D"„””1ô!#š4iRXXv²´´”ýׯ_}»#Ì‹/lllþþûoEg̘‘œœÜ¥Ç.áÑî…öÝ>1ì]ÑÑÑØ#íòôhDNŒ:À¬¹áŽHlްᢰ0ߥK[zØ] €3"±ÅÎ.BEe¶m‹™Ùï¡C«I$òÔ©²—.mæà`ãääØdn®biyÍÓó3#錋ëß uÙÙDZ u§Oß1ã06¡îçϼcMX=kêµµµÔ樺-ýŒýØÿzÖuuu...***aûöíØIAAAUUÕ7n<}ú”ƒƒcÑ¢E4bè¬6Š¢(ŠJII‘H¤þÜQ}}ýܹs½¼¼²²²JKKçÍ›§££C‰×­?öBã‚nŸFVVéîéÑùX=OÀÙLÙ»÷zUUÃåË[øø¸ðÐ=›ëmm¤óç7öaÏëþ˜;WÁÊJ5,l;µR3Š¢..ÚGêž=›|ðàÍ^U%b8jjD]ktêÔÝ™3`©Qe%¤FÂõ¬{*fmhh¹nÝ:EiÄ@¡P^&Ht–æÓĉïܹƒKJJº»»777S Ðõ!<Úh”ÿ¦fM]ž£º`Ø‚ŒhXóð¸÷èQΕ+[ÇŒÅ;@÷ÂÂR““?úûoÆao«ýûW ðt9in®rñâæ°°ÔmÛ‚[Zð_ÒÍÍ=â¿£F®W®lÅR£3 5B<êY766Öý‰D꩘µŽŽNFFFDD„±±1„„„âââˆD¢››[ç®kkk» ;ßÿrØØÙÙ%%%•••}üøÑÖÖvîÜ¹ŠŠŠ4Âëå¿©º<=@? âÍ7A?ݼùÆÛû¾··ñœ9 xÇÒUjjj·ç›š:FŽ„?´½VRR"--w /¾~­8tè–…Å’ùóÇâËÿÑÔœ½ËÔ4ÈÀÀïêUs>¼#Bÿ¦Fjj“[ZÚŸ=˽}ûÝÉ“wŽ›1CN[{š®î QQ–ˆ“™°zÖNNNêêê­­­Ë–-‹ŽŽVPø¿_ûŽŽŽzzzÍÍÍêêê¾¾¾t6¾iÓ¦ÐÐPyyyê‚ ÓôôôÀÀÀ={ö8;;Ïœ9ÓÅÅ¥¾¾^GG'''G@@@MM-??êÔ©4bðññÙ·oŸ“““··÷… °“***S¦L)--îõüþýû›››õôôêêê,XЇrØ:uŠoÇŽ¥¥¥K–,‰§^?õôÄ:_Óåéú *´SïÞ}×ÓóݼyááÃ:xÇÒU·88Dyy§óðüU]ÑÞ^Éü¨;}}}¨Ð:è´¶vhhxÉyó¦Õˆì~Óåæ–oÜx‘ƒƒýúu Öj¦¦Fwïfµ¶v ¥ÔhT^ÖÕÕ3gÎðdP¢ÿéA…Vþ2¢á¨ªªQCÃk„Ñ!!æìì,=s’D"ÇÆf^¾ü,+«xÖ,y+«åË—ObòR ðräÈ­ë×Ó’“íY3ÙÀTTML.UTÔÿó϶)Sdð§GÍÍmÏŸí’ééÍ`‘Ñ­>ÔQSSSvvöÒ¥KsrräääðAäÞ½{¿Ÿwvv>~ü8óã¡¡·O2"þ& ;íí$3³+#F°ûùmdåtˆD"ÇŽõõ}›[±xñ„ˆˆ** ( À`qÿþÇK—žzy­cåtA ØØÝ;v„¬YsþÂÓž*®âއ‡›Pwê”–¹»ÿoBÝš53qY¦5l%&&nÞ¼ùСC,’!²råÊÁ’3°àÓ`°ƒ1¢aÇÕ5>$äE|üÞI“¶•c‘É”øø·^^Iß¾UééÍܹsé_IâLõógƒªêé… ÇûûoÂ;º´µuìÝ{ýîݬ³gׯY3ïpèB$¶$%e'$¼OIù‚ ÈâÅ´´¦®Xñ·€7Þ¡ÑePf‚1"þƈ†—¤¤.<9~#k¦C䈈W>>÷++6nTŽˆXJ еßC …B±¶¾ÎÃÃyò¤ޱЋ““Ãß“›[‚•UXaa•­­:ëï, Àm`0ÛÀ`6‘Øœ”ô!!á½½}ä¾}Qƒ.5ÐO #_¿VìÞ}ÍÌl‘žÞ ¼céÆãÇŸ‹+(¨Ôן½gªœœÞ€  §ÏŸçÞ¸±{p}"ÇJM™"mmž“óÃ×w'ÞAÑE@€‡Fj´råßüüƒé?€Þ‚YsÃEssÛªUçøù¹cb,YmÓª¯_+Ž{üø³žÞ GGMá?¿€!êÇR-­sVVËíìVâKef~۲岄„à?ÿ˜KJÊaÞúú¦ää ïŸ<ùÌÆ†ª¨°bj³æ`ÖÑpaiš’ò%9Ùž¥æ¡ýüÙpüx|llæœ9 ÇŽé))Iáxjnn[¹ÒKLŒ?*j× ÞS±¨¨ÚÄäRCCKHˆùßâZXݦFSøø¸ð 2"@/Ȉø#ÖÝj 0Ðõëiqqo}|6°N:D¡PBB^,^|òÙ³¯gÏ®¿qÃÒ!¾UYÙàã³aP§C‚ÈɉÄÇï7NbÍšó÷ïÄ;œ¾i`0;$Ä<+ëØéÓ†‚ØÛGþý·‹©iPttzcc+Þ`#ú²³KV¯öÞ±c©££&Þ±ü«°°ÒÎ.2#£ÐÂb©µµ//þß¶€»øø·;vüséÒæU«†HúŽò¡C±¡¡©‡똛«àcÔÕ5ݿϣF111Lî ^ðy #âˆÄ–•+=eeE®_·`…oÛÚ:Μ¹wñâ%%)/¯õ&ŒÆ;"XBII­ªê ¿Ïž]w, ôôÈ‘[ÆÆóNœÐçà::§Fììl‹×Òšª©9…i_ñ¤¦¦3§/0⬠2¢¡ŒB¡lÞ|9+«äþ}{QQüë²çä”ÙÚ†úôcÏÕ={ÔXmƒðB¡PŒ¿}«JN¶g©µûŒòèQÎŽ!3gŽ Ü<¸6УGmí¯>%$¼ü8‡ƒƒù©€~‚Œh( |âæv;2r×üùcñŽ }yèÐMEE‰sçŒY³x¹|ùé‘#q7oîž5KïXJNΓ ~~îþÙ&-= ïpD·©ÑªUSGŽ»À°ÑõêUŸƒƒæîÝËñ¤®®iïÞë~²±Q·¶Vgg:Ófè¿OŸ~hjžÝ»WÍÆFïXVEE½©éåòòºà`óéÓeñgAjƒ dDCSuu£ººçÔ©2—/oÁ·r|zzáÎÿHäóç7-X0ÇH`A--í+Wz‰ˆðFG[²ÂJ¿ÖÔÔfiúäÉg/¯õ¬Y*š±jj~=|øoj4bÇÂ…Š ‚ŒhhÚ²årVVIr²ˆnˇÈdÊÙ³IÞÞ÷.ïã³2Àj޹þêþ}{YY¼caêt..ÚKð‡I°Ô(&&ãÅ‹¯\\#°ÔHKk*¤F€?Ȉ† ààç‡ÝŒÝ={6nk*+vï¾–––ðàj3³EøŽSÀšž?Ï]·î‚§ç:#£9xÇÂl—/?=z4NGgÆ™3†ÜÜ#ð‡yÊËëÞß¾ý.3󗺺’¶ö´Å‹'prrà _ 599ešš^;w.spÐÀ+†W¯ ví ¥P(þþ›æÍÃSXP]]Ó²e§çÌ‘¿pÁïXð‘‘Qhn,"Âw劙œÜp"£*+«»s'ëöíwßøù¹ÕÕ'kkO[²ä/Ø„˜2¢!¥½´jÕY..Ž›7÷àU÷#(è©«küܹ ¾¾%$p‰Ögnœ™ùíáCaa^¼cÁMyy½™Ù•ª LTT&à> 5ÜAF4¤¸¹%„„É×w#“{`pñ÷têÔÝ»wm&O–Â;–óí[ÕÖ­W~þ$^¸`ºp¡"Þá°’’Ú{÷þMyTU!5F‚Œh(ÀkMB{;ÉÙùƵk©vv+lmWôj‹íÔÔÔâââ‹ ÐOYYYZZï(†…OŸ~hjžupÐØµkÞ±°¨_¿Z­­Ã“’²‡û²¢nAj2¢A¯¸¸FM팡áœcǘº&¡²²aÛ¶«ÙÙ%^^ëtt¦÷öí111è­ÈÈHCCC¼£úZZÚW®ô㋌ÜûŽÐ@¡Püý¹»ßÑÓ›9ܪѯ¸¸&)éÃíÛïÒÓ Gâ]¾|¢¶ö´¥K'âµË( j n$yíZ¿††–ÄDf®IøúµbóæË ÍAA[æÌQèC ‚DGG3:4Ð;(ŠBFÄGŽÜŠŒLôhŸ¤¤Þ± ~²´ •“½re«”Ô(¼Ãa]@ÿÁoÌÁÍßÿQVV±¿ÿ&f¦C¯^¬^í3r$gb¢mßÒ!†›Gr.]zêæ¶Ò!:-_>éî]Û––v-­s™™Ex‡Ãºdd„ÍÍUââö¤¥¹ØØ¨U›šMzhÏž°û÷?vtñȈ±ÜÜrOÏ$;»&ŒfZ§±±™††þ**ãïܱ†/n G]]“½}¤ŽÎô5kfâË`¢  vó¦Õ¸qâ~7o¾Á;V'++ò{j4m¤Fðg0kn°jo'ijžåç玉±dÚšOÏ{^^ɦ¦Ê®®kØÙû•Nì9³æ˜ÀÜ<8+«øÁn¼c|::ÈGŽÜºr噹¹ÊÁƒ«a úUß¿ÿ1&&#+«XX˜wÙ²‰³,P„elÐTì.\xœŸÿóáÃ}Ìù·L¦:tóêÕçGêš›«0¡G††;wÞ'&f_¿néPßpp°?¾fÑ¢ñ{÷†½zU´ªÑINNÄÜ\ÅÜ\åË—ò„„w·o¿‰É=ZpÕª©ÚÚSgÍ’‡Ô00knPúò¥ÜÓ3ÉÞ~¥¼¼ºkiiß¶-84ôå¹sÆ@¿²²:;»H3³E‹3ugü¡gÅ ¥;wlZ[;44¼ž>ý‚w8ƒÌ„ £íìV>yâøø±ã† óž>ý¢«ë;{ö±ƒo¾~]SEfÍ >$YGLJíÖ-+&|ÃWSóËÔôÒׯAA[.ϨfaÖ‹€Ys‡B¡×Ü¿oÏÃÉw8CAcc«­mxbb¶µµZok Î°Q£¸¸·yy?%%…45§hkO=[)`x‚1¢Á'(èéÇ¥^^똕–Ö®YsþÇú›7÷00ê"‘hoo/##ÃÅÅ%##cffVZZн„¢hFFc»ËÉÉÑÔÔäåå=z´……ECCµ¯ªªª?¾½££ƒÎ+©6nÜØ%!yòä 777µë.â®Á@ˆˆxõüùWoï 1 W` éáÃ:>>¶l¹B$¶àÑ`…¥¤8ݾm½zõ´{÷²uu}UTNž>˜›[ŽwtÀl 2……•§O'ZY©Ž'>Ð}T®Ys¾­­ãÆ Ë‰%º»n‘ÉdMMÍW¯^ÅÄÄ”””$$$pss+++·¶¶Dwµµµ‹/ž>}znnîÝ»wß½{giiÙ«ØÙÙCCCùùùé‹‘‘ÑÝ»w›››©gâââÔÕÕ{Õ`5%%µGŽÄYX,™9SïX†EÍÍU"#w¾{W¤©éõå ||ÿ´7ØØØfÍsäˆnFÆáÊÊÐ÷ïã=<"gÍÒïU#€5áý‡€AfÍ &d2EW×·µµýΛ®¾÷ùsÙºu£G ]»¶]T”áíÓ9kîÊ•+ÎÎÎyyy¼¼¼Ô“uuuüüüììì(Ц§§Ïš5‹QQ¹¸¸¤¦¦>|øû1++kÖ¬YUUU(ŠVVVŠŠŠ2ª/ª¶¶6 ‰Ë—/¯Y³;£  päÈ“n¯gì]£0knP(#£€êêÆÄD[fÖ VŠŠªÍ̓KJj½½×««+áK000())±±±és  ¥½ÌÉ ú b©©©ç΃Owô W®<“•µûø±t ;JO/˜0a¿‘QÀ¯_­Ô…¾¾¾¾¾þ/[¶l™««kO¯"’žžÞÞÞîìì,---""²~ýúªª*ê«áááRRR|||NNNׯ_—””äçç·µµ¥^Úù@IIéòåË»¨­­íèèÀ® Æþ±¡Ñoee%‰DrwwWPP9räܹsŸ?N¡PÈd²»»û˜1cF¥¯¯O}ËæÍ›×¯_¿ÿž““³¶¶öíÛ·Ë—/5j77÷äÉ“###;ß5µ£ÎöÔ> ‚P[ŒrùòSYY»ìì¼⚛۬­¯6ǎŵµuàþèü½ †¶ÈÈHøt@oÁ¬¹A£¨¨ÚÍíöŽK'M" hGÏžå®[wAYyÜ?ÿ˜‰óú‡·oßN:•ö5111/_¾¬¨¨077§¾öþýû«W¯žÈÏÏ———ïܸ;û¿_—&''çääØÛÛ·¶¶ÒèA___ÿààà¯_¿ª©©éèètttøùù]¾|9<<<==½¥¥eÇŽØÅFFF ØTÀ¸¸¸åË— ­[·NQQñÍ›7ß¾}³±±111ikk£ý(zj0SAA¥›[ÂîÝË•”¤ðŽeˆãæqöìú  -aaiZZç¾}ëÅú=àðNÉ]Èd²ß’%'[[Û´£¤¤l99ûíÛ¯ô®t~—ÉÁÁñâÅ êÔ?·µµµ”ÿŽ–(**†„„`|øðAúúzìÕÇS(‰Ôåcù77÷£Gº} A7oÞP[¨¬¬¤Ñoeeåĉƒ‚‚°WÉdrmm-™Lž4iRXXv²´´”ýׯ_ ¥½½]DD$..ŽB¡Ì˜1§ª««Ã†§(Ê—/_ÿŽ!=õÔ> Œ1TGIKëÜŠžíí$¼cFòó._~züx§øø·xÇ‚'## O`Œhpˆˆx•ššïé¹n@×$ܹó~Û¶«kÖÌô÷ßÄ"…á Bnn.õÇÚÚZêFsTÅÅÅcÇŽÅŽ±ƒ’’ìG>>>AØØØº÷d̘1………ÏÔÕÕa)‚ ÒÒÒ[ Ñ/‚ ß¾}›0áß4(Š ¡(ZXX¸aÃlÙ«””‰DÂÞÂÁÁ±víÚ˜˜˜âââììl]]]¬k°}ûvzWOí¦ |òáC‰ñ@¯ô)(ˆÝ¹cch8gÇŽ¼ÙÞNÂ;"ƒ ü›=TU5ººÞ61Qž1c7­ŠŠJß±ãSÓžžFìì¬òcõêÕþþþÔœDHH(33³Ë5ÒÒÒØ,8A°¡ W­ZBýñãÇ"""7ি_Ð9¹Â2+pëÖ-ìÛlàhüø÷4722º}ûvLLÌ’%K„……QQQ)((8sæÌ·oß’’’º ˜B¡ 21í&ÈÉ);}:ÑÆfÅøñ£ñŽeØáââpuÕóñ1Žˆxµzµ÷÷ïÕxG`Ð`•¾€†ãÇã¹¹Gì߯5p]„‡§ÙÚ†[X,9zT—¥ví>~̘1\\\ÊÊÊwïÞ]±bÅ_ýÕ9þþùGBBBDDäÚµkÔNi´ß-Ö1ˆ‡G¢¼ü¾¯_+ðPˆÄf ‹«RR6îî ÃjAý¿Wëëëíì줥¥999¥¥¥·nÝZRòïÖˆHÏ+-û†á âÞㆠ :Ÿyüø1‘H¤¿‘öööÎÿ¬Ð‰ž[ƒuDôüai­­íÊÊn&&—®‹ë×S¥¤l¼¼’®‹nÁ `C¼}[$#cðï@ÀÿDE½7ÎQ]Ý#?ÿ'Þ±0 ¿WI$Ò‚ .\˜––öóçÏwïÞíÚµKVV¶¥¥…âããyyy›šš¨g¬­­µµµ{Õ™L Åž9ý #`€À¬9–váÂÝ KO IDAT“ŠŠú'ÖPûÁÁÏíí£Ò±±Q .òZ[;öî½>k–üöí‹ñŽüÁì¤$; …¢ªz&(è)Þá°«W¯æççß»woîܹbbbS§Nõóó{ÿþ=Ç ®&Œ¢hUU7Û¯÷t¾?V¬X1bĈÄÄDꙸ¸8ê„gÚ¨ñ (ºqãF...ÆÆèȈX×÷ïÕçÎ%[Y©JIˆö¯^}áâ{ðàjø@œ9“øãGݹsëÙØXh @DAA,!ÁzÆù‡ßÚ¾ýj}}Þ±„°°0KKK^^ÞÎ';×^C¤££ÃÅÅEFFFTTÔØØ¸ºúß*Pˆˆ––æççß¿xx8@°³³£^€Íã¥ü›œ,,,ÌÃ㤤… ȪU«¼¼¼° ÒÒÒDEE›››{Ššä`ÇØòW11±.ÉOçó åäÉ“òòòÂÂÂôßÑï899uuucbb°³²²JKKW¯^M£‹””YYÙ.qbÁ“Éä“'OŽ;–——wÞ¼y/^¼èéÎcT g¦¦A**îT($ä`ãéyo §ÌšcÌšëŸÔÔ<))›+Wžâ %9ùäIγg}ýºïX¿WGßÓ«‚¤§§»»»;6--íË—/Ë–-ÓÕÕ¥¾ª¥¥UUU…åÔclábhhhAAAçä·‰^&LرcGaaayyyPPWkkëÕ«WçÏŸ]°wï^ 1tY·ùûÉÎ G±ó¾¾¾ãÆKMMÍËËÓÒÒ¢>¨?ÞQ·ùùù±9oÇŽÓÐР݅²²ò³gÏššš~þܹs222)))¥¥¥..."""íííÝ>¢næï`Ö}gXTRR6`“šš7‡†¾$lΜIˆÆé‹€Œ¨?[æÍs]·.€L&ã øƒ?jõô|edl=<I¤¡ùß‹5+_ÿþR·å§ëê긹¹KJJ°B)))´«`S§3#ê©€uîˆÒCYm]DGGw‰‡zÜm9ï?Vè¦2"úfͱ¢¦¦6gçX]ÝéóæexãÑÑéNNÑ{÷ªÙÛ¯dxã +îîwjj~9cÄR{ÖƒnIJ EFî´°XzölòæÍAUUxG„&W¾þ]·å§UUUoܸñôéSŽE‹Ñ®‚Ý[4 X÷Ꮊ-«M£ YYÙžšê¶œw*tú2"Väãs¿¡¡åÈ]†·|ãF†­mÄîÝË4Þ8ÃÊ«WW¯>ß¿_KZz@Vú†1‚ÝÙYëúu‹ììÒåËO?xð ïˆðÁäÊ׿ë©ü´¡¡aLLLddäºuëP¥åÿ‹SÓƒá¬/«M£ )V·å¼é©Ð ` ȈXÎׯ4ÄÄøÛrbb¶­mĦMó5Û2ÃMKK»­m„²²¢©©2Þ±€ÞQQ™ðô©ÓŠJ&&—öì ûõ«ɕ¯ill¬û/‰ÔSùiŒŒŒˆˆccc1ü^œS[[ÛmHØy†°þ½¬6]t‰³ÛrެР`¬A¼ÕæD¡P£•”¤6o^ÈØ–Ÿ>ý²cGˆ‘Ñ7·µ,2Ã'--ÍÀÀ oïmiáøõk„ˆH3cC€N'N$TW7Þ¸aÉ"›@¯ðósŸ>m¸xñ‡èeËNûún˜3Gï ˜G\\üåË—NNNêêê­­­Ë–-‹ŽŽVPø¿'àèèØØØ¨§§×Üܬ®®îëëKgã›6m •——§ Ò97HOO ܳg³³óÌ™3]\\êëëuttrrrÔÔÔòóó§NJ#Ÿ}ûö999y{{_¸p;©¢¢2eÊ”ÒÒRl¸†Šz~ÿþýÍÍÍzzzuuu ,¸qãF_Ÿß¿ØÙÙõõõ/\¸ §§‡¡§‹ßãtpphmmݰaCUU•’’RBB_O¨Ÿ1z‚R:­ª¸KHxoag5k–<›MKË76\³fæ™3†,òÎËË+55µ·ï"“‘šžòrÞúznžö3*"¶áÆÖÖvþüùxG1˜¼~]°fÍy7·µ¦¦ ðŽôKeeƒ]Ä“'Ÿ-,–:8hŒÁþç÷°0ì;¦èèh¼é;]]Ý9sæ8pï@±¨¨(###øt@¯À iii?v,ÎÐp6cÓ¡ììSÓ 5µÉ§N°H:„ ˆ­­m¯®ÏÉùü<>þmSS›†Æ”ç/X å_óµ¶vØÙE.X hbóå=11þ󰰴Ço¥¦æ?¿qÌQ¼ƒ¦ššš²³³“““½½½ñŽå_÷îÝÓÐèfÍ­³³óñãÇ™`à@FÄB|}‰-..Ú l3?ÿ§±qàÌ™cΟßÈÎ>ø–Q(”§Osƒ‚R?þFµùãG‘Q€¼¼ØåË[Ýlææ¶˜˜ŒË—Ÿåæ–Ϙ!wþüFMÍ)œœð'à)+«ØÏïáÚ²²"xÇIIIêÞ=;7·Û;wþ“˜˜uâÄÚQ£xñjxY»víÚµkñŽ0LÁçKVáæ– ''²uë"F5XW×´aC wHˆ'£še‚ÒÒÚààçׯ§56¶hjNõô\7s&«|e†³öv’­mÄ´irÛ·/Æ;Àx\\ÇŽééèÌØ»7LYùÄñãzk×ÎÂ;(ÌKHK˺ƒƒ1Û~ýjݸñbSS[\ÜžAôMgVV±§gÒÇŸÄÅ,-—Íe؈ýtáÂãüüŸ÷ïïƒlCØÌ™rìóôLÚ»÷zròGww}aáAó+@ß ¾…%C™L9tèæòå—/ŸÄÛÚ:¶l¹RRR¹sôhA†´9ÐrrÊvîüGSóì§O?\]õ^¼8`i¹Ò!À:rsË==“¬¬TÇÇ;0°¸¹G`…\33¿-]z*)éÞ wD"ÑÞÞ^FF†‹‹KFFÆÌ̬´´ï C dDø‹Œ|•›[á꺆!­aÞ¾- 6;<ž«£ã³|ùéoߪ‚ƒÍ^½:¸eË¢Á5Í y$ÙÎ.büx‰={ÔðŽ0‰ŠÊ„GW¬Pڲ岅EH}}Þ Sd2YSSóÕ«W111%%% ÜÜÜÊÊÊ­­Ã®´.`àÀ¬9œ‰-îîw6o^À¨ìÅÓ3)6634tÛôé² ipà|ùRîî~'9ùÃäÉR.˜jiM…ÉH€5…„¼ÈÊ*¹{׆QóZÁ  À}ú´á¼ycc54Îz{ÏžÍÈÒ€W¯^ÍÏÏÏËËãååEDLLÌÏÏÏÍ̓>ÀþuÇ™Ï}66ÔÎn%CZ ~vî\²¯ïF• ip€”–ÖÚØ„«ªž))© 1ON¶[½z¤C€5}ûVåæ–°mÛâÉ“¥ðŽà`Íš™ÏžíŸ8QRW×wÏž°º:,bª°°0KKK,¢bggGEÑ””YYÙ‹/º¸¸ÈÈÈˆŠŠWWWcW¢(ZUUÕåEÑØØXyyy!!!CCCêÅ€a 2"<T^º”bg·’ŸŸ»ÿ­Ý»—}èÐ-GGMV.¦QQAtpˆRVvËÎ.¹~ÝâÁƒ}jj“¡® `Y ÅÁ!JZz”ƒC7…Á0!*Ê´ÅÃÃ09ùãÊ•^ÏŸçâÑ0òöíÛ©S§Ò¸àÀׯ_/--ˆˆˆ‰‰yùòeEE…¹¹9íf#""RSSüøaffÆÐƒ :ãÉÕ5~âD† óûßTffÑ®]¡&&ÊVVªýom ´µu\º”âëû‡gıczÆÆó]‰$0 EE¥¿|™·ja s(Š®_?OSsŠ›[‚¡a€¶ö´'Ö2°|èICCƒˆÈÿÊQ¿A«­­BÄÆÆfáÂ…[·n=tèÐܹsñññQRR"‰=5ëää„]ìçç7mÚ4Ú†<#ÂMjj~RÒgg­þÏûö­jóæ • ÇŽé1$6†»ÿã’%§¼½ïïÚµìåKgSÓÖW^^øðMSÓ3gŽÁ;ÀGž>mfñömÑÒ¥§¢£ÓñŽhè#¹¹ÿ”«­­í²Ñœ¬¬,‚ ÅÅÅcÇŽÅÎ`%%%4š¥^þ݃ŸÎœ19rxЧ³³Ö­[VÅÅ5K—žºv-ûØ îàÁƒeeeZZZeee±±±Gýý2SSSWW×ôôôÜÜ\+++---lNP\\‘Htssë|ýñãÇÓÓÓsrr,--©†-ȈpÐÖÖqêÔ]cãy býi‡L¦ìÝöùsùµkÛ%$Xh4…B‰Œ|½lÙéÇ?Ÿ:e»[I 6éƒIuuã1††³.TÄ;ÀºfΓ˜h»q£ò1&&—ŠŠ`Ë2Æùò¥°°°ººú¸qゃƒ£££¿ÌÑÑqÍš5zzzóçÏÆÎûøø¸¸¸(((,\¸°óõfffÆÆÆóæÍ¿rå 3îÀÂPøZ‹ùŸxzÞ{ùÒET´_«rÏžM>{6éêUóeË&2*¶þËÉ)srŠ~û¶ÈÔt¡½ý AAƒ•UØ‹_Ÿ`Èûð¡ÔÁ!êóç2kkõ;—âµNÒÀÀAnЊ¢ééé³fÍÂ;eddŸîè#b¶ºº¦sçîoß¾¤ŸéÐ÷Μ1bt¨¶öמ=ajjgxx8SRœ\]õ ƒQrò‡72N2€tÐIIIêÎëS§ .]JQQqô(ïˆôì'Ël~~89Ùwî\ÚŸF23¿ÙÛGZX,62šÃ¨ÀúƒB¡ÄÄd¸¹Ý&“)&ÚÚ¬[ ÚˆÄfGǘի§©©MÆ;0˜ (j`0[Mmò‰ ›6]RUäî®O ÀêVã'€.`Œˆ©~ü¨ J±¶VëÏ.EEÕ¦¦A‹ÿåâÒß"7·\_ßÏÆ&\[{úóç ƒš‡Ç½––ö£GYt#{Àâ„„Fž>mxã†eQQµŠŠ»ŸßC‰ŒwPþ2"¦òð¸'))´q£rŸ[ [LMƒ$$ÎŸßØÿBFýD"‘khœ­¬lˆŒÜåêª' ÀƒoHôGFFá•+ÏŽÕe©­JÀ 3oÞØÄD›­[>¨«ëûéÓ¼#@ dDÌóùsYttº““fŸÝ’Hä]»þ©©i¼z՜罶?.[½ÚûäÉ;»v-{øÐaÁ‚qøÆ@?µ·“¢•• gã ôxx8ÐJIqâççVSóس'ìçϼƒÐ=Ȉ˜ÇÝýδi2ý™Tæî~çùó¯—/o•‘f``½ÕÚÚáæ– ®î1r$gJŠ“Ý ¼6V€.^|RXXyê”>Þ€¡cÌѰ°ígÏ®úôËÒ¥§®^}“è€ÁÎ Lòüù×û÷?Þ¸±Eû8ÕíÚµTÿGÞÞÆ³gË36¶^yù2ÏÞ>²ªªáÄ ý æõùvIMMõòòb`l `£^Ì·oUžžIVVªòòýª@(ŠÎÖÖžêïÿèèÑ[—.¥9¢ûvKŒˆIΜI\´hüüùcûööÌÌ¢ƒcÍÍU p›ÏÓÚÚááq/0ðñôér¡¡ÛÆŽïgƒÅÅÅ111úúð•<>JJJÒÒÒðŽ‚Uìß#++be¥Šw `hâáá´³[¹~ý¼“'-Z4ÞÕUoüøÑ 﨤¤$**ŠáÍ‚A$55ï| #b†>ed|KL´éÛÛ+*ˆææÁóç;|X‡±Ñ/--ßÚ:œHlöô\§¯?«?CC]À^°*~xGÁnÝzóôinlìn˜ÿ  äã³ÁÐpΡC7ÕÔ|¸oãÆù œ)‹xñ"/<üÕ‘#ºBB#ñŽ ;‚P@€É“'Ž22Âkמ74 øð¡ï `8‚Œh`ÅŽùþ½ÚÞ~eÞûòeÞ‘#·llÔÕÕ•m?~Ô­_èãóÀÚZ=2r—¬, !¨­­ÃÉ)zÑ¢ñkÖÌÄ;0|)*JšÆÇïimm_±ÂÓÂ"äû÷j¼ƒ€á2¢ÔÑAöôLZ»vÖ˜1¢½}ï÷ïÕÛ¶]]±âo[Û>N·ë³¸¸·Ë–®®n¸sÇÆÆFƒþ€¡)(èiqq›Û¼™5KþÖ-« L>|(]´ÈýàÁ›Db3ÞAÀpvPLLzii­]¯ˆš›ÛÌÌ‚ÅÄøÏž]Ï̹j55¿Ì̓wï¾¶m›JR’½’’Óº¦H$ÚÛÛËÈÈpqqÉÈȘ™™•–þ;·EÑŒŒ Æv—““£©©ÉËË;zôh ‹†fWšG»“––†¢hUUÕï3ü ¥¥µ^^I»w/ïÿ>ò0Š¢ÚÚÓ=rptÔŒ‰ÉX¼øÔõëiPÑdD¥½äå•dd4Gú?ìÝw\çð÷!!! Á"•¡¢âÄ" ‚ ÅúÓZG(`[µ8ꪳRТ€ÈTѺêFDPD!KdÂ&ã~\›¦Œ ÆóýøÇ›Ë›÷ž;âåž{ïÞ—ªØÑϺ»‡çç—Ÿ?¿²'GS¸ÿýÔ©‡’’ò®\Yçæ6»÷t q8œ9sæ¼|ù2""¢  àæÍ›’’’VVVݱ::>yòd“ŒŒŒ[·n½yófÆ ݱ"þ1B="Êfff²²²=Lå¡°yó QÀHHˆ­_o·kÁÓ]»"§L9™ÀfC^ݨ·œõö?!!/KJª·l™ÙÑÇFE%þòË¢»t]_ßäî¶b…ÿ„ úyL˜ ×3ëP@@@VVÖ;wÌÍ͇ 2vìØ3gÎ$''‹‰uËØñG3fŒ…B7nœŸŸß•+W †à-´Ú“Ó! ÿ@ÉÈÈe11±eË–IHHeÜ;o=úàã³& ½“¼¼´—×ÜÄÄŸlmÜÝÃ-- Š…þ"è&u‹†æñã÷\\,54:ôÁ·o ¼¼¢Ö®booÜM±5“™Y2oÞéððø}ûæ9³LNN˜s Eppð† Ì»PAALþ÷\–Åbyyyijjª¨¨,]º´¼üïç’1 »rå •J•••ݹsgHHˆ†††œœœ››·BPPoáúõë...Ü–ŒŒJJJˆµóæ!Ür||¼¥¥¥´´´¶¶¶¿¿?q—ã!CÊÊÊ:U[ˆ•ò®‚ûŽãÔÑÑQRRrvvæ® ´T[Ûèåeoo2iÒpQÇ?JJƒwí²{õÊÛÁaÜîÝW'L𼺺Ÿß]]÷/_ª:ô©òòSÓŸ/þÍætS`Í„†¾6Ì}êÔCiiŸ{fÿ]{¨ ß@EEÅèèè¶ÞEÅÇÇ8p`ذaqqqééé666ŽŽŽÜwíììÊÊÊ"""B¶¶¶ÜrVVŽãÙÙÙ¼))©‡¶µ®ÒÒÒfe]]]¢¢¢ÈÈH‰ôåËî[ŽªÙÖµ  Y$ñññ§NÒÓÓ‹ÍÌÌ´³³srrjwÇ ¸ÿûŸ#Fx3DPVVýóÏ7ttvLš´?,ì‹ÅuDÐ Äó¡îÖÐÀ46þq×®È}ŠÅb;;Ÿ51ù±´´º›ãUUU÷¿ÿ§P¶9r›ÉÍ/«€gäbbbÏŸ?ç¾ä&ót:ÿ'Ð×׿xñ"QáÝ»w¡ªª*âÝGá8Îf³›•y3 ^’’’ʈ”””Ž?N,¤Óé,‹ûV×£<#=ztpp0±¤°°L&×ÖÖòß±3#JO/¢ÑÜ|}‹::#7·lË–ËššÛfÍ:zïÞ;§‡.Ÿ@ÿwÍ ßåËq••µ7NëЧNž¼ÿòe–ŸßJ™n Œ+11wúôà Ÿ._þ®W ¢Ð* ŒŒ îK:ÎhŽ+??ذaD™(/eddB$©Y¹-ÚÚÚ999¼K*++‰t¥UgÏž=xð ––Ö7ß|óþý{Þ{ù„U»rrr\\\ˆQé( ›Íæ® pá8îá>|øÐU«&‰::ƒFS>~|ÉÓ§;GŽºjÕ…©S ‰kjb‰:.èÛzõ©p_ÔÔÄ:}úÁòåVjjò‚êÉ“ô£GïìÚ5×ÔT«ûbCá8îïÿtÁ‚ÓTªÒ;Û¬­Gtëê„ÂÞÞþìٳܜDAA!11±Y*•šM”‰‚††FçV÷õ×__¼x‘û255UYY™;7Žãˆ'±AÍž=;777<<\]]}Ê”)¼Ùš£j—††Æµk׈ë‡N§É4•ŸóË/ Éd8ô>L[[å×_—&&þ4wîØ}ûny{{_ýò¥JÔq@_§Búª¢¢fÆt}ùRµqcÐ×_]³fr÷†ªªªûßÿ.ìÙs}ãÆiááëÕÕ;6ꃨx{{ÙÙÙ%$$EEEíÙ³§Y+VìÛ·/>>>##cãÆvvvÄ@mí "z„¸ww÷”””;väçç¿{÷nݺuŽŽŽDk ׯ_g0>>>ÜŒ===i4š™™Žã’’’!bàìNG%b\®®®^^^ ™™™kÖ¬™:uª°VÔo0õ{÷F/ZdnbBu,Á!²nn³ããwoßn{çÎ[só}›6øP$긠ïé–ñ‹,‹sæÌÃE‹Æ«©É ø&“ýí·(*>vlq·Æ–žþeõê?ªªê.]úvêԑݺ.áRUU}ñâ…§§çÌ™3mllÂÃÃuuuyëxxxÔÔÔÌ›7¯¾¾~æÌ™§N°ñåË—êèèp ªªª?Þ¾}ûˆ#äääæÌ™säÈ¢òÉ“'wìØáééyâĉsçÎ ýýý·lÙrîÜ9 …¨¬¬lmmmddTXXØé¨ÚÅ]…’’±dçÎõõõóæÍ«¬¬œ0aBdd¤°ÖÕo:t›Íæx{Ïu ÓàÁ«W[»ºZ…‡Çûú>ž>ýð´i£—-³´±}¡ ßˆÍÏÏu W[¸paW>Žá<ªƒ. ‹ß±#ôÅ‹]Š ³²îÝ{ýâÅþ¹eäHõî ,**ÑÝ=ÌÐêëëÚ¡ÛùºUXXØ¢E‹à(*jÿ¿ÿyöì£{öÌ[¹r¢¨c »p8øƒï/^|þøñ55ù¥KÍ—,±èè$ôBÎÎÎĈ¬´¥‹ç3ÐG$4l6ç×_ïÍŸo*x:ôøñ‡ßrès÷¥CõõMáQQ‰[·Îܲe&\2Žã»vEŽMquµu,t# ›1Ã`Æ ƒ’’êððW—.½8zô®‘‘æ²e–NNf’’⢀Îsrr u 7"®ðv±8?š?ÿL.(¨Ø¼y†€õ éëÖ:;åâbÙM!}úTfoò¯¿Þ¬vs› é˜ÂÂâ>> *€BUUvÆiÏžýpîÜ YY ð öïß3#㋨C€Þúˆ„ƒÃÁ¿7w®±¶¶Š õÙlÎ÷ß©©Éùø,è¦þü3yÛ¶+Ʃ޿¿]ðn+ú£ÞÇçÆ’%æcÆPE =J\œloolooœ•Urùr\xxÂéÓŒŒ4œÌÇõÀLÐW ý› IDATÀSáøë¯Ô‹·l™)`ý_½—’Ràë»BZzЃa2ÙÞÞW׬¹hoorõêFH‡À@vìØ]6ÿá;Q€È ¦êímŸ”ôÓ;Û¾úJç×_ïïvp8[SÓ(êè@ô Hp?vì®­­‘¾¾š õŸ=ûxüø½œFŒ*ô`JJª×®½˜œœÿë¯Kœ¿zûô!iiE.ÄìÙ3OAAZÔ± zFFšFFš;w~}ûvJDDÂÎûöEO›6zÎ#›QÝq…úȈ„àùóÌ·o ~ùE Qÿ**j7m vp0Y¾\øyÇÇç|÷ÝE ±ë×7R„Þ>}Ë?^1BT€—´ô  Ì,0+.®ºq#ùöí”uë.‰‹“§Lik;fæLyy¸‚X #‚S§îO™2rìXÍvkâ8¾iS°„„ØÎÂÇñ³g:tkÆ ƒ_]*++)ÜöèsnÜxóüyæõëa@00………µ[GN-Z¤úõ׊ïÞÑSRòÝÜRq×Ó“wtÔRW‡¼¨/±²²¢RáiI: 2¢®JL̉ɸzu£ •ýýŸÆÄdDGo–“fÆÂ`4lÞ|ÿþ{OÏ9ë×Û`&ÄÆè‹êêš~úéú‚¦ff:¢ŽÑèÄp´6HRR§¶V/&æ›Í莨@7 íâ •ýƒÁØ»wohhhII‰ªªêÌ™3÷îÝK¡PB†ÅÇÇ›™™ k]Bo°—¬1--ÍÍÍíÉ“'²²²GŽ‘••í¦0 +--UQhX²nQW;÷ÈÌLÇÜ\·ÝšiiEû÷ßܾ}¶ ½I‚ûô©lÕª? é.üoÆ !¶Ü3„’¿‘HRRR#Èd9ãi×[ýÀéÓjk¼½íE¢gÉ\ %p8œ9sæ`¡««ûùóçßÿÝÊÊ*##CBBBÔÑõ t:}òäÉß~û­ŸŸ_qqñºuë6lØpéÒ%QÇÕí #ê’œœÒÛ·SüüV¶[³±‘µaCàW_énØ0Mˆ<{öñ»ï.*çÎ6þî=¬¬¬BCC»Ò‹ÅIM¥ÇÇ—¥¥ÑÉdÌØXyÉ’õðò³KÏœy°s§Ý!m^ÖÐÏdeeeff<!4dÈ3gÎøøøˆ‰õáÓݶzQº©wåèÑ£cÆŒñññAQ(???33³Ó§OËÉÉ wE½º`ÇŽPkë§ÝšžžáFFÞ¥¥ÕB\û‘#·54¶nÙr¹±‘)Äf{?‹}ïÞ»5kttvÐhnkÖÜ»÷n íÀ‡««ŸÍ!&“-ê@%„Phh¨¨£=¡ßÿ­œœœœœÚ­fcc³oß¾¶ÞEÅÇÇ3™Ì]»vQ©Teeå%K–”••qß ¡P(222žžž—/_VWW—••ݶm·B```³B||<ï*’’’¦M›¦¨¨())i``@üQæÌ™sôèQ¢Bll¬²²r]]][1”––ò–¹§ëÄrîy—s8œhkk+**:99 ¾E­244<þ<ï:Îb±ZÝ4nH|bˆŽŽ¦P(ŠŠŠ§NÂq¼¡¡aóæÍªªª***'Nœ 6Oã?ÖÔÔlR3Äåu>Qç}ùR¥¥µ=(èE»5ïÞ}«¡±õÁƒ÷ÂZu]]ãÚµ©Ôm~~O„ÕfŸšZèåebò£ºú{û/èôZQz—˜˜tuõ-¦‰:D¬ßŸ%®~ÿ·0#RTTŒŽŽnë]âÜýÀÆ ‹‹‹KOO·±±qttä¾kggWVV²µµå–³²²p ÌÎÎæ-´ÌˆFŒ±víÚœœœ/_¾øûûKHH466XZZ6oÞüÝwßñ‰¡YFÔr!wÜå§NÒÓÓ‹ÍÌÌ´³³ãî¨v·¨URRR>l¹¼ÕMã†Ä'†Y³fGFFЉ‰544xyyÑh´˜˜˜ôôôÉ“'[Á§q++«˜˜˜ººº¶Æ!#¹nïn·kâË—*ƒ]aÂZoAAÅŒ‡GŒØùèÑ@9ç+-­>}úþäÉÕÕ·|õÕž#Gn§§‰:(Ð55±¬­¬\ÉïbD¿?K\ýþo-`F$&&öüùsîKnG NÇÿ9w××׿xñ"QáÝ»w¡ªª*âÝGá8Îf³›•›¥=¼í7{«²²’Åbåôôtât¿²²RRR²  €Ífkhh|8±P^^~úôé‘‘‘FFFbbb“&MâC'ää丸¸¸¸¸p—kïÄikkçääL:•w£dee[Ý4Ab ö?w½EEEÜs |§Ñh‚i::éòå8„Ð7ßLä_íüù˜/2Ïžu•’Â\à¡¡¯æÏ?mlL»ysKÿN‡23K||nŽ¿ï»ï.––Vÿô“ëW»Ožt™4i8¤C -tzí/¿ÜYµj’––²¨cÐÓìííÏž=KtG „›Õ¡R©ÙÙÙD™(hhh+kkëìììÇúôéîÝ»Üå .Œˆˆ ]¼x1†a|b :F _©††Æµk׈އC§Ó[f,‚ûúë¯/^¼È}™ššª¬¬\]]ÝÖ¦µC³ñ®¨TjFFQÎÌÌ$ |ïhRÚiu“Éþý÷ÇK—ZðŸõýûÏ?ÿ|ÃÝÝÖЧš X,Ž»{ضmW6nœváÂÿddúç ’ FCPPìܹ'¬­DD$89™=yâyëÖÖ•+')) ut ·;qâ¯AƒÈ[·Îu ô% cûöíšššššš«V­*,,$ÞÂ0,!!Aˆëzƒ½a;;»œœ!6.¬ø è§O?X¼øœPZë¼½½‹ŠŠìììŠŠŠ¢¢¢öìÙӬΊ+öíÛŸ‘‘±qãF;;;A "þ²ÜB¨¦¦¦òl6›ÉdŽ?^__?--ÍÕÕ!TQQrppHHH¸råÊÒ¥KùÄ   pýúuƒA õÆE§Ó[ ‰Xîêêêåå•™™¹fÍÞîNpwwOIIÙ±cG~~þ»wïÖ­[çè訠 ÐÖ¦aùòå{÷î}þüùÇÝÜ܈…üï!]¼ën`ŠŒLÐÔÜ–Ÿ_Á§NSkÆŒÃöö'X¬®xUUU·dÉ9]]÷k×^w±©Þ©©‰äêêG£¹ééyìØúòe›Ýþ~pefÓhnÏD½àÙ6›=a„‰'ÆÅÅ•””¼yófýúõ4­¡¡oí1‰®‡$Ü{ÃB=¢Óét:ýÇsçÎ511bã‚ÄÏço]QQðÌÎîW ­êê[ v +¶ž$àsD8Žçåå-]ºTQQQZZÚÎÎŽèá}ލ©©ÉÃÃB¡())-^¼¸­GtZ–QkcÍñŠŽŽÖÖÖ–°²²ºuëÖ¬Y³FŽI´cooo``@”ÛŠáÒ¥KjjjÊÊÊAAAèŸgi¬­­%%%ËËË›Æ]ÞÔÔäééI¥ReddfÍšÅ5¡Ý-jË›7o¦OŸ.%%¥¦¦¶råJbÕmmw¯ CiiiccãÖ­[ÕÔÔ† BLsTZZÊ¿ñvÿèByŽÃ[üEA»fÍ:ª§§zæÌr>uºuþüÓû÷wÐh]ºçãÇâo¾9Ïd²þøc•AWûšz›ÔÔÂ+W^ݸ‘TZZ3q¢¾““ÙìÙcø÷¼Ъ+ü *îÝÛN&C×7!„aX»3´^¸pa×®]Üù[Äcd2¹‹³Ñ·’plk-ÜyZxרMó·4Û¨¢¢" üü|*•Ú¡PiœOµf늊ڨ¨Äk×^'%å‘É›ý÷)©’Òàwï~hÃzggg„Pxx¸¨é¾}[°n Ÿ:qqY§NÝß·o~Ó¡¿þJýúëãC‡Êݾ½­?¥CµgÎ<˜2åÐŒGîÝ{·|¹ULÌÎÐÐuÎÎ_A::áñãý•ºgÏmݺÕÕÕµ©©‰x ¨påÊ''§'N´C3Ü›sšu¼ð.?sæÌùóçCBBâããÖ®]+൫¤¤dëÖ­úúúÚÚÚ|öÛ?üpùò庺:nH­îAÖøRj*}ãÆ 1c¼¶n yò$Åb³Ù6›Ó‘F@·¸}ûöôéÓwïÞ­¥¥%êXþ6{öìVïûùç¾×(,0úvÇdf–Ü¿ÿþüù•|ê8ðgmmã¡CÎ^ ‡ƒïßó·ßmß>{Ë–͆é苊‹«ÂÂâCB^~úT6j”ú?ØÍŸoª¢ÒÒ< r—/Çå䔬u ô=ÕÕÕÊÊÿÞËÀý¹¡ÓéÜÇÍ/\¸°{÷nsss„ÐÉ“'  †œœBÈÍÍMYYyÞ¼y!wwwn¹¢¢BWWwÙ²eD ÜBK/_¾”‘‘!º¤&MšÔØØÈ`0×®][XX¨®®²zõê¶bè„ß~ûmÏž=!___VWW'--ÝîµÕàW_}ÅÝÆÆÆááá$‰Ï~Ûºuëĉÿ«¶Õý È ~~ñâsUÕoüü>ð,d·U¿±‘©¡±µÝf{eeå‘#ËEE'-X°`Á‚¢Ž´2¢Ž¹pá©––òÌ™†mUxüøÃ<;{vy§{uŒ†ï¾ xõ*Çߥ­í˜ÎFÚ+°Xœ‡ßÇ=z”&-=hÞ<Ósç\Œ4Eè?ŒúÇo¯X1¡G@7ù[]™¿!ôèÑ#ccc„¤¤¤¤äß÷~ó‰¹å+ü'{áƒDÂ\]­Ö­[jk».5µª¦¦Q\œÌd¶™‰‰‘}}WÞ~/qæÌaQ‡ú9Ȉ:€N¯ ÿᇯۚ§ººÁÝ=lîܱ&[EAÝÕÕÁ¨¿qcóèÑB ¿ç¥¦^¼ø<:úM]]£­­Ñùóÿ›2e¤¸8¹ýOЧO?`2Ù[¶Ìu ôIÄü-Ë—/'z'bbbšÕ!æN!n{ëŽù[,,,>LŒÏÆM'.\èçç—––Æ;K«1àš¿åèÑ£ÄÇ«ªª¹-222-[àsË,«­ý 2™Ôؘ¿dɰ œ?…‡'\½šXW×$&Ff±š§Fd2iî\ãm]opéR‡î! Ãà9¢¸|9N\œ´h‘y[öì¹ÞÔÄÚ¿ß©sí¿y“7wî¯ââä?ÿÜÒGÓ¡ššÆ  ØÙ³Í˜qäéÓŒ§½zµÛ×wÅŒ¡ûü¹Òßÿé–-3aº*:æoéúü-mp¿! e>2™4~¼îáà SS}.^\íà`,))Ža 9Óûõ•Y­ú³.ŽÞ=p45±LL~üé§kmU¸?UCcëÝ»o;×þµk¯µµ·»ºúÕÔ4t6F‘áp8OŸ¦¯Y ­½]GgÇÆAOŸ¦Ã„B »mØheåÓÔÄu ôFH€ùˆp˜¿¥Ëó·´õ® ûRçciëo]^^ðÌÁᄆÆVm…²­ßÏGÔG¡^0«Ußóõ¨k×^oÚüâ…•ªØòÝÊʺ©SMœ8üÔ©Î ­xôècÇîýï“~úÉ¡o]Ë)+« }yåÊ«¬¬’Q£4V®œ8wîXyyiQÇú¿””|[Ûã¾¾+ììÚ) €Iùˆz3˜¿Epíþ­ éׯ'ED$TTÔ¼y³·'cŠ~0½aV«¾ æ#êQ.<›>Ý Õt!äåE&“||:<–“ÉÞ¶íʉ:ä¼o_Ÿ™M…;޶©éO¿þú—¥å°;w¶=x°cÙ2KH‡@ÏØ»7ÚÌLÒ!ú˜¿Eè(Åõëm>tŽÞ,êX@ûD;«ÕÀ#+$99?!!'"bC«ïÞ¼™|õêëïää:6»(ƒQ¿zu@rrÞ¥KßN™2R‘v»¼¼òÀÀØÈÈ„/_ª&M~äÈ"[[# QÇ–‡Óbc³à§€~éöíÛß|óM/œ¿EÔQA'Ž= ¤¤dÛ¶mĬV¿üò 1«•¢¢âºuëV¯^}õêU¢1«•©©©´´4ÑG4qâÄ©S§úûûKIIݼyÓÕÕÕÑÑqРA¢Ýœ¾2"øû?52Ò´²ÒkùViiµ§gø’%æÖÖ#:Ôfvvé²e¿3™ìk×6¥.¤H» ‡ƒ?y’û×_©’’âöö&K—Z˜˜4?€Àfs||nÌžmhjÚ[ΖBó·€H„³Z‘ JK«££“l}9w÷099©½{çu¨Íwï —/ÿ]Iipxøz ¥õ;ñz‰â⪗!!/óó+LMµr¶·7‘–†K@d""23KüüøM” ô!"œÕ ȈòRFFrÞ<Ó–oEE%Þ»—º®CBLLƪUÆÓöóûFV¶c7Úõ&“}çÎÛ  ØçÏ?*) ^´È|éRs!¢Ž tõõM‡Ýrq±ÐÕ…o#€~B´³ZȈÚÁbq.]z¾d‰¹¤¤x³·>®üá‡Èo¾™8q¢¾à ¾øá‡È¥K-öï_Ð;ÇQHOÿTQQkc3ê·ß\gϳ ^Âßÿimm£›ÛlQt/bV«‘#GÊËËóŸÕJEE…wV«ýû÷#„***à®9AFÔŽ{÷Þ3¾ùfbË·~üñš¼¼ÔÎ_ ÞšÏÍ3gìÚe·aÃ4áÅ( ̈ˆ„  Ø””| …5k&ÏŸoª®Þ¥i¼›qvvŽˆˆbƒ@èzùX½ee5§NÝ_¿ÞFYYFÔ±ÝËÃ㦦fÞ¼yõõõ3gÎ 2"~_èé©Z[7¯cïÞh‰ôã‚4R^^ãêê——W±¡— Wýþý瀀gÑÑIuuM¶¶F»vÙM˜ O"a¢Ž ~¾­¥¥¼t©…¨ oàöÑéµ ŸRRòSR RRò‹‹!-##ª‘‘¦‘UM­{/‡@oQ›êêš"#¶m›MÌÌ“úê·ß\™5'§ÔÅåw„ЛµµEüp“ɾ{÷]`à‹gÏ>*+^¶ÌÊÅņ}BFÆ—ÈÈÄ3g–÷ÎñHèUªªê^½Êi–)+ËŒ§µl™%¤@Ð dDmŠŠJd±8‹›ó.¬«kÚ±#læL{{ãv[HIÉ_¾ÜoèPùÀÀ5ªª²Ýiû èÁÁ±W®¼,)©ž8Qß×wŬY†0|èC޹3j”úܹcE½Q]]Ó»w))ññ9¯^e)’Ò`SSmH ]µ) àÙܹÆÍ:‚Ž¿WYYÛÖl­¼bc³V®ß¿ßé›o&toÄÿ`³9·nýÝ)¤¨8xñbó¥KÍûúðqYYY™™™ƒF 2äÌ™3>>>bbÝõu•‘‘QPPPPPX¿~}qqñO?ýÄ'#zP»¸e"T¢¼lÙ2Q…Ôc?þŸóçŸ[DÂ×ÔÄzóæß('§”ÉdKJŠCå¦@Æ©Š‰A :KKKQ‡z/*•ÚÖôk€77ß·hÑÙèè¤ÆF&Žãff{fÌ8R_ßD¼ËápœœNOž|°©‰ÕV MM¬ i4·«W{&æÒÒêÓ§ï[Zþ¬¡±uáƒïÍœœœœœœÚ­fcc³oß¾¶ÞEÅÇÇ3™Ì]»vQ©Teeå%K–”••qß ¡P(222žžž—/_VWW—••ݶm·B```³B||<·ýÔÔT„PEEERRÒ´iÓ%%% BCCqžYŸKKK[­@ÔñõõÕÒÒ’——_°`Aqqq[5_½zeaa!%%¥¥¥åççÇáp8 ­­­¨¨èääÄݨfÛÎû²´´”7$nv›jkßrcë 8άYG]]ýDÂÑÔÄzù2ËÏïÉÆA“'¤ÑÜÔÕ·hko··?áåöêÇ"&“-ê0`ÀŒÇqÜÀ`—ºú -zzëÖ]RWߢ®¾ÅÌì§¿þJÅq<,ì…²5!áQyß¾h£ž÷ãõõM®®~ººîDýnÅápž>M_³&€Fs=z×Ï?ßÈÌ,îî• ‹€‘¢¢bttt[ïgü6lX\\\zzº££#÷];;»²²²ˆˆ„­­-·œ••…ãx```vv6o¡YšÁ`0Boß¾1bÄÚµksrr¾|ùâïï/!!ÑØØˆÿ“‡à8Χ‚©©irròÛ·o-,,lmmÛª©««ëááQTTI"‘¼¼¼ôôôbcc333íììZî«V3"޷ΩS§ø7ÕÖ¾íUÑŸ&S([ß¿ÿ,ê@è$6›óáCQXØ+/¯¨Y³Ž)–¤@¹5 IDATлÀ]s!ÔØÈBá8ª­m¼y3™Xøùs•««ŸÍ¨´´¢E‹ÌMMµB/^dž=ûðÕ«œÐеRRƒB FÃ7ßø§§ _Ï;ƒÐÑéµ—/Ç…„¼ÌÎ.4iøéÓËfÍ24¨þ«««••ÿ}\˜;®NçÞ0váÂ…Ý»w›››#„Nž×Ô4’É$ wj H —ƒŒ!ž,¨%Çq…„Äݽûnᯒ’òpG‹Ëvv>K§×ÖÔ4†…­ëhŠ—en®Ëlº  Ø°°ø‹ÇŒ¡>¼ÐÞÞD$³õ0{{û³gÏ._¾œèTQPPˆ‰‰iV‡J¥fggO˜0!”ÒÐÐÊÚCCCMLL-,,>lbb‚㸤¤d³šÖÖÖmUÈÌ̤R©¡ôôt Ã\\\f̘ѲæìÙ³sss“““¯^½:eÊ2™|íÚ5„ŽãUUU¼c*tˆ††ÆÑ£G…Ò”Hà8~ôè;;ãî»Ð@çà8ž‘ño ôáCQuu‰„éé©QçÎ562¢R¥¥‰:R‚êÿ§×íb±8ÞnòòšÓ§ð,a'&檪ÊDFnÔÖîØŒ!!qîîáÁÁk¬­G´ZáÝ»ÂK—ž_»öÇѼyãNr12ÒìÐ*ú4oooSSS;;»}ûöQ(”ØØØýû÷7«³bÅŠ}ûö9R^^~ãÆvvvžñM˜0AGG‡[@ÕÔÔTVVVWWß¼yóСCááá!&“9~üx}}ý´´4"€ŠŠ â¦8:®¢¢Â§‚§§§ŸŸ†aëÖ­svvމ‰iµ¦±±±£££‡‡‡™™ŽãkÖ¬ñòò¢P( ‡JHHHJJp§!q_ºººvº©Þ௿R?|(:{:ˆ€è ’Pî–¹ôȈPc#!„Ž¿6›Ób »¤¤úÈ‘Û'OºðŸ¤ˆ×áÃwŽ¿‡aèÂ…gÍ2¢ºº¦¨¨Ä  Ø””|ÊîÝ&²²Í»&ú=UUÕ/^xzzΜ9³±±ÑÆÆ&<<\W÷?ÓÑxxxÔÔÔÌ›7¯¾¾~æÌ™§N°ñåË—êèèp ¡©S§"„H$’¾¾þü1wî\„¯¯ï¦M›víÚejjêååUUUåàà––fmmmddTXXØV„ЦM›lmmëêêæÌ™súô阘˜VkúûûoÙ²åܹs %00pÁ‚»wïž7o^eeå„ "##Ü(nHJJJÄ’;wÖ××w¢©ÞÇñ£GïΚe8|8tŽ©¬¬#“I]?l¦§á¦@ééE FóhôhŠŒ ¤@ÐO`8ÞN÷H¿G§×xñ¯#&Fâppbh¾fo‘Hزe–¶?k“ÉÞ¼ùrttÑ%…aX\œ—¦¦B(-­è?b¢£“˜L΂¦Ä­çÝ Þ‹˜[轆a¡¡¡ .mÏž}\¸ðìŸn51¡‰6Їp8xppìž8±tÆ ƒŽ~<7·üÕ«ìR / F=†aúújFFT##M##ê¨Qðú ÐG„ššXü+ˆ‰‘de¥*+k[M9üÒ¥**2Û·Ûòi„ÁhX±Â/!!‡{‡™Lºté…––2Ñ)4j”º——½½½‰œüè‚Í×÷ÑĉÃ!‚KLÌuwûð¡ÃPJJ¾ QIIurr·#¨¸˜ÁMˆ^ ‘#5àh dD¨¡_FD&“ÆÓ*-­©ªªkµƒÃ0IIñºº¦ÆFV[ÃU:;ÿ–›[Æfÿۋžpá)“Éž>ÝÀÃcÎäÉ#¿õ€þ*-íóƒi!!kEè éžž¼'“I8Ž#„%&~jµfiiõ›7ÿIBÇ52¢nØ0ÍȈ:r¤ºœœTF w€Œè?}Dd2‰Ãáp [¶ÌÊÔT{Ë–àf£/É$6›C£)oÝ:ÓÁÁ„ϼ@iiŸ.ü­ªª®å“H¬ýû¸ºNÚÆt‡ƒC>zÿ˜Ñ£5&On}иššX§NÝ?uêB8úçQOÇß¼É'*”•Õ$%å6KÔÔäÆ×…/Ȉþ͈Èd‰„á8†ã8‰DÂ0tà€ÓâÅæVV>¼Cbbd‹=v¬ææÍ3¦MÍ?‘ˆ‹ËZ¾Ü¯¡Ù2"DF&Š6#z÷®ðÈ‘;3g,]jÑí××7ååUäå•ççW”—K)+×wÇZ@ÿPZZ™p𠓨½Ýƒïø!²¨¨ªåÜ ••uß~ûÇÇ%™™Å.''id¤¹`ñ8¶¶J« È #âÞ5‡!„$%Ū«ÅÄȃúãUÃBC_}þL'î—'³Ù{{ã5k& 2òAttÒ÷ß³Ùœ¶†¯àpðøøœŠFŽTâ (5µðС[¤!„w}Ö&“]XHÏϯÈË+'R ‚‚м¼ŠÒÒj„¸8™BQd2AFø¸r奬¬¤£ã8Qz¯¼¼ò]»¢>L#‘°V¯4aÊÌ,±±¹eËŒ±c5µµUøÏü@Fôw†!Ÿùžž†©«Ë~;|øP‹sôè]4HŒÃáÌŸoºfÍ”Q£Ê^‚ƒc=<Â9DÜÑÑ ÃBB^îÙã(”mÐë×¹>>7cc3ÅÄH8Ž“HاO¥~¶¾¾éãÇâÜÜòâbFq1#/¯<7·<7·¼ªª!$&F¢Pi4e--åÙ³Ç--eyyiôÏXs´ŠÃÁ_,Yb.)).êX@oÔØÈ:}úþÉ“÷‰a?yËä%..6{ö9=€¾ë?Qllì±cÇDЍTVJ"¤B¡0|R–“kÐÐx·k×F„PIÉà‚E2WU¥««WäíÞ%H›ùùòyy²!âÒd«]D†“É8‰„‡…ÝKM ˜–––Û¶mã¾äæBââd„‹ÅAq8xVVóŒˆÍæй O³ÌÃ0M‰HxæÎ«ª*7t¨<¦¬¡¡@´ @G=x𾨨jÅŠž¸‰t`ëú´ÊJ‰¬,ņ†ö¯â1™¬7oòz ¤~ïØ±c±±±¢Žb©)¡ÿüºäççGDD89 ¬›ø94dH–VÕ§OòJµ–V‘œp8¨´TZG§RM­–LîÀ¬M’duõ11œLæÉ11œDâüóãÉ8†uûLPqqqÜ2o¿BˆÉüÏÍ÷yyåý•ʽá-/¯"?¿¼¦¦!$&FRWWÐÒR60 ØÚŽÑÒRÖÔT¦Ñ”† ‘íDHaaa]Û,Ð?¾°¶N¡(öÀºæ±®ïb2Iuu⊊ buubMMdÇB†0 ÇqŒ÷ªŽ#Ȉ„"666..΢[1¼ x¯=¯•ëmí*ÅÇÅTª¢”Ô ””|Þ§ƒYd2‰Èú(â.µ¤¤¼Ÿ¾›).NBÿô 5SSÓ¸råMÍ¿ox33ÓnvÛ°ÄÅÅ-Z´Hˆ ‚þ!?¿âáÃ4?¿•=¹Òv¬ë7ØlNa!=7·üÓ§²OŸÊ²³K33Kòó+þ&«ªª/,¤÷LvÝ¿YXXÀ“¿Œˆ}´¨}™L¢Ñ”i4åI“†ó./.fÐh£¿ÿÞSUU—èâÑçOúA[ž?ÏÌÊR¬©'f-#µÚ;ô¬¼¼ºç‚€ŽãW®¼tvþ B]¡¦&×ÔThn®ºp! «  #ê·&LÐ32*ÁqäãsŠ˜£01ñÓÛ·l6GLŒ„ãˆwàZqqò§Oå"Œ d Ÿòó+œ¿u ˆ #êç0 1tĈ¡Äé&ƒQŸ””—””ûúunbb.^‹&))ÖÔÄÊϯu°`€ŠˆH04¤t}R,€N€Œh`‘““š›/àá7""bèСÊÊÊ'Nœà~–»Š¨¨(…… ¶<„¶«ºº!((ÖÎî×Ñ£½ÜÝÃ_¾Ìâpp‡ƒãm ´©çÿ›ÔÔÔTþƒÍfóoŸ8O¸páÿuµûoõûZûª3™L777UUU …âïï/))ÙKî“ðƒó m¶¤UŠŠŠÑÑÑm½‹Š?pàÀ°aÃâââÒÓÓmll¹ïÚÙÙ•••EDD „lmm¹å¬¬,dz³³y ÍZæ}ieeC£ÑÖ®]›““óåË ‰ÆÆF¢Â¬Y³Š‹‹###ÅÄÄp×ÕÕõðð(**ŠŒŒ$‘H_¾|!š1bD[”––â8Χ‚©©irròÛ·o-,,lmm¹¡ž:uJOO/66633ÓÎÎÎÉÉ©å†pÛçS™ÿãÃÉɉÛ½‡GØÌ™Gz~½½óX×ìÇ»¤ÙËËË«ÕÃE[Ç7â]ƒáîînnnŽó=àr<ä–ùl¾€‡ßyóæUTT„††r«qׂ9rd\\Üû÷ï'L˜àààÐîŸ !Z[Ûöjùòß55Ý(”­Tê6uõ-ÍþÑhní¶6À ø ÒóÿMx_o>íç uuuü×%øw¾Y¹åWÝÇÇG__?11155ÕÚÚšL&7ûÝ’€G$@÷éL§vuuµ²²2÷%qá!D§Ó¹Ù.\ؽ{·¹¹9BèäÉ“††† CNN!äææ¦¬¬~üøÔ©S׬YÃÝ >´[AOO(Œ9!TTTD¼ÌÉÉqqqqqqáÖ,((hµqþ•…¸Çè=Þ¿ÿ\\̘>}´¨iSo8Öç—Í\yyy­.Z=¾=zôÈØØ!ÔÔÔäçç7þüOŸ>ñ?:µ{<dó<üR©T>{†Ûøˆ#xo Çñððxyùé/^KþI‡Z‡ãÈÝ=ŒO€a ‚dD½á¿ Ÿö‰óŸu þo©ÙW=??Ÿ{±²sìz^g2"{{û³gÏ._¾œ¸š¢  Ó¬•JÍÎΞ0aB(;;!¤¡¡Ñåh›#@ÖÖÖ‡611Áq\RR’[{±ŠköìÙ¹¹¹ÉÉÉW¯^2eJNN±œO#íVÈÌÌ$~ÔÓÓÓ1 ÓÔÔ$–khh=zÔÁÁ!„ãxUUŸ‡A;T€~àþý÷C‡ÊRÚ¯*"=|¬ÓÒÒÊÉÉá^üþøñ#BHGGµ8p‘Éäk×®µ<\´z|ã} ÝÍÍÍËËëãÇü8íÙ|¿-«ñÊÊÊ".ð{ƒÏ¾Å0lÑ¢ñ‹›Ÿ8ñ“9ôÊ•W……tqq1&³õõH$,?ÿ8ŸUgggAªõ†S>í ˜_ þo©ÙwX]]=''‡&++Kðv"Ô™®oo";;»„„„¢¢¢¨¨¨={ö4«³bÅŠ}ûöÅÇÇgddlܸÑÎÎNÀóû   âg’[h“É?~¼¾¾~ZZš««+B¨¢¢¢­ÊÆÆÆžžž4ÍÌÌŒ÷¨Ç§â.8><==ß¾}ûîÝ»uëÖ9;;sïÄsuuõòòJHHÈÌÌ\³fÍÔ©S[ ‰h_ÀÊô}˜>>--mÆ îÛ¡C¥ÝÜfÇÇï¾sg›««•¢¢4BF–ë>½á” Óís øoöýo•‹‹ËÏ?ÿüúõë´´4b؆Þ|”ü÷¡"ÁŸíËËË[ºt©¢¢¢´´´qI†N§ãÿ‡ßVUç8 §§'''·`Á‚’’’vÿ^¡ÐÐPÞ%,ûéÓôï¿ÔÕÝ¡¡±…BÙ#+Hð_žüoÒêo_§ÛÇ;òoùýoÙTiiiCCúuëuttˆ‘’““ùï@Y‘Ãpž‘[ÂÂÂ-ZÄ»ôiÄ=ááᢀæ=ú°lÙïÉÉ{UTdz~íp¬ë0 kù }» ]¸paË·Œú[·R""bc³p‰‹“rs/Ø~~Aº.55u̘1¥¥¥¼ƒO´G$D®/Í3è7bc3‡ "’t LrrR‹›/^l^\\uíZÒ­[)¢ŽôO_ýµ··wmm­··· ÿtÐÀe!„jk?~,u`‰Í²´Ôu WÃq¼CDRS“ÿî»)ׯozË „BCC544ôôôjkkÿýwQGhô PL&;-ísRRÞë×¹ ŸrsËììÆž;·BÔq¡®®)%%ÕªI¢„ÌÐÐðÁƒ¢ŽÐ1 ž]úæM^RRÞË—Y_X,‰D"ž'#ijB·>è!‰‰Ÿ˜L6ô 7€Œ¨?kl$×Ô Ú¿ÿf\\Vjja}=Ã0 c³9D‡Ã­¬¥è!±±YÚÚ*jjr¢2¢þëÅ‹Ì÷ïUêêÄ?|x€†ŽÂqœÍne4‹C£)õxŒ`€ŠÍ„"ôõ[VVzÆÆÅååRlö¨ììR #q»†ZõêU“ÉÖÒRÑÔT’è_ŒØØØüü|QG!zVVVT*UÔQt“ÉNNÎ_¼Ø\Ô€~‚Édçå•çä”åæ–ÉÉMñõMûõWŸ“'—š™éˆ:4}C8ñín¦)) 66¦ÅÎ;V^^šX^SÓ˜žþÅÔTK´áu†!•úðð11{÷F¿ÿ™÷–9^$æç÷´ºº!„a˜ªª¦¤¥¥L£)kj*ÑhÊ4š’ºº‰Ô‹&Þ>vì1ùÝ×Öì+½Vzú—†¦‰ MÔ€¾§¶¶17·üÓ§²OŸÊrrÊÒÓ¿äæ––•չɤÁƒÒÒ*1 1B]ÔÁè3ZɈ0¬õö yù©eeW¤¥GoÛf@§G³Xtâ-%%G “¨­MlhÈ"î:„¤¤®¼ü „Ž3q¼‰ÍnÀñoâpšp¼ Ç›8œFž—L§‘ÍfÞ~‡899!„&Mþ×_ÛùäEC†È&%ía2ÙŸ?Wæå•çæ–çæ–çå•ß¿ÿþÓ§2£ž¨&//­¥¥LdJÜ•ªH&‹fw''§>{`_üßš’’/-=hØ0UQÒ'÷ÞÀD"IÉÉM• ’H_±Âq6†aÍ&`³9Ä*UQVVRö;ðß0ü'#²²² U(¢’‘Quöì{SÓ­sçjýöÛ{ å+W5J!”›[süø»AƒÔ%¦O§Œ?D\\ SÿÜÜšsçÒêëY!11„"‘0 Ã0 GãpˆÞþ®¬¦&½sçØnÚ:MMMn™›íÙsýýû"2ùß¼HGG!$.N&òœIÿ¹ªªŽÈ‘Š‹ÅÅŒ¼¼ò˜˜Œ Šë뛈Oih(ðæHZZÊjjrjjòÝ´Q OKIÉ70 ˆ*‹& Ìc]ŸÖØÈ¾w¯ðÑ£Ï!Ç0r[5ÉdÜ/'Û¶msvvuÐþ“Q©Ô¾uûP¼z•}öìûÏŸë?}"“HXSÛÏïÃîÝkÖLF¥¤ø=~œF§7FFæÜ¹óùÛo'óÍD™v›ur*]´è·/_,!Äáàÿôý§/ˆDÂ6nœ½paÏMÌ2iÒð{÷¶_¿žtøð­¼¼ CaÚÚCø|D^^ÚÈHÚÈH³Ùrn¦ÄíVЉÉÈϯàpp„„„ØÐ¡òÍ2¥aÃT–è¶}ÀÛ·&&"¾u`ëúºåËQQQåÏ?߸zõ5™Ü惑†ôõEßÙXZZZZZŠ: è Ø¿]Õ›7ysæG‘É$YYÉÊÊ:„†asæŒ9yÒ%/¯ÂÆæî^#ã8nk;fýzcãv„¨ªª[¶ì÷7o Ølv[u¤¤¥¤ìI’Àáàׯ'ýòË­ÜÜr9›7ÏJ³-o½#îûú­wÄÅK¸k®o=GÄd²‡÷ŸH%$Äöï_À¿Õ«­‡•_¿þ‡ƒwÐá8rwŸcg7öηAA±vv¿êè¨,Yb¾d‰…’ÒàÎnM?!++9z´ÆèÑÍ–3ˆì(/¯<**SÀÖ ÆÞ½{CCCKJJTUUgΜ¹wï^ …‚Â0,>>ÞÌÌLX‘·¼Ç/>>ÞØØX\\¼´´TEE¥­Oµ Ã0>é£ÒÓ‹FŽlþg +llF=}êéëûøÿìÝy>–Lhñüùs===ʯBBB(***JH\x†¾¯™7O›ÓQ¿^^ÌæÍó]\ŒŽ4¨™ EDÆ" ’§'APMM3¥û(*ê-2‰:Aš:U \±øý€Œâåeh'ôu{!ŒBÁköÅüù’’6;9]hjê\±Â˜:SU•°Ü¾}á£G_¢£ÓÏ«©I;:8;‰Š‚AÀC^TTTXX( A””Ô¹sç8€Á°êä¥Yéââ¢æF¦¦ŽÚÚV NüžÄÄ‚ƒ— §333³ŸI;u‚ù¶®Ž6Aš6MIL $H#ÜÌhFÄÃ3†…ú¹Ç`B¡ 1cxÚÕœžžâýûÛ”•¥\\úxÎÆÊJ/.nË;MMµNž|> #"Ö~ú´ÿǽk‘?ÝááoÜÜ.kkNž¼ÇÍírhhêãÇyÈÀôA(ŒÁ è<×F¡Pð–-óÿøcš©é!ÒÏ‚ð©SNùùUžžÑ••M7Îe¼E%%ÉÇ·ËK§Œ††lpð’;ݾý>"â£ãy£%K¦€'œʇ¼¼¼è—9vìXlllBB‚˜˜Ø† Ö®]›””„¼óéÓ§/^ØÙÙYXX|þüYöôôTQQ‰ŠŠš1cA”‚æÌ™C©™ftйsç®\¹rãÆ )))///ê™!BBB’’’¥¥¥ÝÝÝ™µ¸Ç÷ï5‚‚|òò´h0"ÐéAºvíucc;DÕƒd` 2uªý¿ó—AºÏŒ8¤¢"éïo¹pá$‚œœ cb2H$òþý¶K—Nƒ HVVdÏžÛx|Ç®]‹é<˜ˆƒÿ&ù\\Œ\\ŒrsË¢£Ó÷î½½ÿ[Û)®®3&N”gxûFµÖÖV ʯ”c„Çã)÷¶]½z5((ÈÐЂ Ó§OOœ8±¥¥EXX‚  ‰%K–@äëëKYnllTQQ¡Ü G}S©Ο?¿oß¾éÓ§CtñâEEEÅŽŽŽ±cÞ³gÏž™3g"aèêê2q?pƒïßkÔÔdÿ˜7£“ ]½ú:4ô!RU•Fî¯ÓÑÁMš„3$HÜdDA ‚z¡½ŠÁ ‰D"³gM\Ü»#GÌ›7‡½u«YllæŽkÖ˜ ï]»ÖDDdŒOl]]˱cËXô”…#G­““?\»–ŽtýñÇTp ’>,[PP`llŒüŠÇã;::‰æ(ÊÊÊTUU‘ed¡¼¼|„  B„Ü-I½<4%%%ÎÎÎÎÎÿŸ¸¼¼\CãçUUU”eÊÂ鸞 F] "~Ot¤ãÇ65uÐ$H:: üü<œ@€Œ‚þJÄÏÏce¥ga1iݺp†V®œ±}»…°0ÿ”)ãæÍ;zîÜS/¯rr¢ññ)3·"ìíõ……ÇxxD´´t?ïÊØäuC!,ÌOÝe”’lm=yÕª™ãǃûfmm¶bÅ dਨhZZMW\\ŒÜöV\\ AË’ý‰ÅbCCCmll "“ÉÍÍÍÔs0àp¸‚‚¤¨°Ñ¹ÅGÂÂ##UNGìðk‚ôî]É»w%¹¹e÷ïçvtô`0( pAÍž­5s¦º¥¥.2DÇÈHµ±±cÿþŸs)+Ky{/ }¸x±®ºº M:„07Ÿ³~Õª++V\ºzu  k‡ú ]F–7of_¹òŠÒe´téTpWÝ»wO:ÕÒÒ288X^^>==ýÏ?ÿ¤)ãææ¬¥¥%""²yófKKË_'‹ëSttôŒ3”••) ôË»ººÊËË‹ŠŠ>|8;;ûÇ”WW¬X±ÿ~MMMiiiÊä ¿öö&ÐGŒN22"ȃ "I……µH÷QnnÙ½{¹´ ’®®"ë.®4À\‚ 3gþó€sOÏyË—_Èϯ?^Y³aÃÜ””;wÞLLôìo„±±Z|üF—KaÑÑîlxf…ˆÈصkMV¯žõæÍ÷èèô€€Äkk½5kL45Át^?IKK¿}ûÖÏÏoÁ‚ÝÝÝsçνyó¦ŠÊÒÚ;w¶µµ-Y²¤³³sÁ‚gΜa°ò+VDEE)++Sè—÷÷÷ïìì\²dISSÓŒ3©_õóókjjZºt)‰D }ôèÑ ¶”ËýøQO&“UU¥9pÒÔ”ÕÔ”µ·×‡~IîÞýÔÕÕËÃVV–¢$HzzŠ N‹ í#G‚ÈdòÌ™gÏÖ:pàÊÊK­¬Nýøýû}ÔóìÝ{ûÆÌ—/ýdeEè¼÷ÇúeË.`0¨7<ÄYìHd¤Ëèþý\qq£qã$~çH2"hDeD'N<ºy3ëíÛN# ÉÀ@Y__YGGAMMO:õ­±±}êÔ½‡Ù;:PVvvöÌ{D[[þòåUôß^SÓìät±±±=:Ú][›3ÓdWW7'&f_½úº¦¦yÆ u£… 'ýN—AF¨ŒhӦ薖ÎÈÈuœF°Þ^bqq%Aúô©¬§‡ À7a–2Cƒºº æ¸õËÓ3ª´´!%å?÷|ýú»£ãùË—WYXL¢ÿöŽŽˆ7o /\p¥L7Ä~½½ÄÔÔÏÑÑé¯_—–²³Ówu5fÏ+€ŒQÑ¢E' Uöì±át ðû I>~,íí% ò$€AQ¿Þ¼)´·?÷왯––õú-[bÒÒ ^¾ôC¿"‘äïŸpãFæK]]YìÀ¾~­ŒŠz{ëVNWW¯…Å$gg£3ÔGô¿IA#*#ÒÒò°Z±‚Ãøõöóó+‘9¾ssË‹Šj‰DM‚¤¡ž’ @ dDý"“ɦ¦‡fÎTÿóO;êõx|»©é¡E‹t²g¤žsçž8p×ÓsÞ®]‹9þ¨½½;)é}LLú§OeJJ’Ë—::JK q6ª¡4r2¢ÚÚV=½ „Occ5NÇ£E{{w^^åA±……5$YHˆ_KK$HÔÀlžý‚axõj“ààd_ßE¢¢c)ëÅÄöì±ÙºõúLíóÙD4<=çIJ ùúÆ×Õµ=êÈÙ‘<|È3^‹Šjccß]ºôòðáû¿å(#€«ÕB¦Þvà30P¡üŸª¯oC†åæ–Ý»÷éÊ•WÉɉêêþ|ÒÔ©JÂÂü €3@=ííÝS§îݶm¡»»)ÍKnn—‹‹ëž<ÙÁàCô^½ú¶víµÉ“Ç]¾¼JHˆ[þåôô>ü‚Œ2’’´·IÓ>"häôEG§'ûvÓÀ¨ïèèøëzæåá‘äá‘áá‘æá‘Á`Ä“º»ÿa„ÀpØÙÙÄÿƒööö œŽÕh2 ÐGD€Ÿ~xøëµkMh†ÜìÛg;wî‘óçŸyy-`¤*Íøønn—mmÏÄĸӟ¿›mxy1ÈcÔKJê®_ÏŒ‹Ë<þÙê2ÊÈÈ@ò"€Ëת¨Hq: ½âââèhnÁ€;èF’'Np:„¡›>}º··7§£F£ôôô“'OÒ¬ÑÖ¬™uíÚëçÏóçÍ›@½^IIrûö…GŽ<07Ÿ4~¼\o§¦§§˜’²ÕÙù’qÕDÊÊR–¾¾ÈÄt‘’’‚ÖÖ“]\Œ45e9]ߌŒè=*w”°³³SPPàt+*ªãªFîïI†`$öQàp8pZœ2¢ASV–š5K#<ü5MFA‡Çœ§O¿nØùð¡ƒ÷Î)*J¤¤lus»leu*<| #ÃØ‰‡týøQŸ˜˜}ãFæ•+¯tt\\Œìì¦ñóóp:Àÿضm§CUXXkg7ÓQô<åz`«VÍ|öìïââ:šõ(|âÄòÊJüñã¯MTtlLÌz==EgçKÏžå35R¦QR’ôñY˜™¹;.nøqþþ zz{|}ãóó«80òôöËÊ@Ü dD›?‚‚‚xdä›__RT” ´ {öþý F£ òED¬µ´Ô]¹òrxxÕr 45k–ÆÅ‹nÏŸï\¾Üðþý\3³£ÎÎïÝûÔÛKättÀˆQZÚ@ À8"¸Ȉ†F£\\ŒbcßutôüúêŠF¦¦š[·^ïêêe¼Nô‰˃‚lvï¾µ}{—'jjÒ{öؼ¿÷ܹ½½Dw÷ˆ©S÷îß§°°–Ó¡#@^^ZCC†ÓôdD qt4èêê½}ûý¯/Á0|ì˜c}}ÛáÃ÷[íÚµ&‘‘ë’“?¬XñWKK3"e!^^ŒÍäøøïßïY¿~vj꓃³g>wî)ßÎéèî•—W©ª*ÍË F-À@FÄ))¡¥K§……=#‘úx|“¬¬È¾}¶ýõ2=½h°5Ï™£uûö–ÂÂ[ÛÓxfËr22"žžó^¿ÞuûöfåãÇM™²wýúˆ´´ðx+àW_¿VL˜€åt  ¥¥eûöí ||| kÖ¬©¨¨@^‚a8;;›‰m1½BnhþEvv6@€a¸¾¾~PÑË`55uDG§×Ô´0«Bv§åð›`úiÙÙÙ ªªÊÏÏ/##cii™‘‘ÁÒ­`1ÊÝÝ´¤¤þÅ‹¿û|ÕÁAáÂIÞÞ7ÚÚº[ó„ Ø{÷¼0”¥åÉOŸÊ†)› P°Ê‘#>ì þ£¸¸ÎÑñüÌ™CCS++›8ÀEòò*AF\ŽD"-Z´(333!!¡¼¼üîÝ»üüüÆÆÆÝ݃þ§6š=þOeòäÉh4:**JHHˆýÁtuõ"7¡Lš´Û×7¾¥¥“ý1 8-™‚é§å–-[îܹsõêÕÒÒÒׯ_Í;·¥eD¦Ü #b”¦¦ìÌ™ê—.½ì¯ÀáÃöÝþ™2„ÊedD’’6ëè(,]zöáÃ/Ó„…Ǹ¸=~¼=5uÛܹã¯\I34 vt<Ÿ’ò‘@ q::€ÃÛ««›µµå9ô„‡‡¥¦¦JIIéêêž;wîÓ§O̾ߵ¿«àÌí¡&(((JFÃ0ìââÂÇÇÇŠæúD$’^¼ø{Ó¦è vmØõüy>‘8RÿƒÓ’)˜~Z&&&;vÌÔÔTZZZ]]=  ²²R@@€¹a³ȈÁÝÝôÕ«oùù•}¾*!!²4"âíóç}÷#Ñ' ÀwõêjGGõk¯;÷tx‘r†ŽŽBpð’ö……­€ ÈÃ#R_ßwü`É'¾~­„ ô—‹‰‰ñôô¤ùNƒ|y¢üJ $%%œœõ0 ÇÆÆâp8!!!ÿ7n`±XaaaJèèhê…_}üøqþüùâââcÆŒ™8qb||<A‹/>~ü8R ##CRR²³³³¿(ß&‘e†!’’’¢ù–I½žL&:tHYYY\\ÜÞÞžñ-êO[[[Ó¿ˆD"u<ýµ…èîîöòò’‘‘‘’’:}ú4ýVúD$’?ÎÛ¼9ZSÓßÙùRJÊÇ®.™Lîónÿ‘œ–ÜyZòòòþóÏæX¦”_7™ÁcA§@ŸGy×Ë—/a¦9"½½ƒ˜íì'2À0‰dbrÐÇ'–N™õë#&OÞÓÔÔ>äVþú를¼72Ý+á……5!!)“&ÊË{[[ŸŠŠzÛÑÑÍé v»téÅĉœŽF¯¸¸8Fþ׋‰‰%''÷÷*AYYYTUUÍÈÈøöíÛܹsmmm)¯ZZZÖ××'$$@daaAY.**"“ÉQQQÅÅÅÔ H…ÔMhjjzxx”””TWW_¾|™¯»»;<<ÜÈÈ)°uëÖõë×Ó‰¡®®Žf™f%¥EÊú3gΨ©©¥§§ZZZÚÙÙ1¸Eýí%j4ÍÑi++++00PQQ1--íÛ·o¦¦¦Ô‘Óaggggg—™YxK[;@NÎKQÑGNΫϟ‚‚ê+d$ò‹Ó’;OË£G¢Ñh;;»ˆˆˆŠŠ šæúÜdú‘Ó/ÐçQ@Þellœ––vþüyš#ÒßÞ@ôùWþugtDF¾ JÊÊ ’’êûæK<¾}ΜÃsçN8~|Ù[IMýìém` |éÒJ!!þ!×à ººzïÞýtãFFFF±´´¾££šxXçh±aCd[[WT”;§€Q*>>ÞÑÑqÀÿõ<<¾¾÷ž™™¶ƒƒþŽqÏŸï;´†¦MSNIÙêævÙÂâøÕ««uu†5WPV– °ô÷_œ]’½oßÿcc5£… 'ñð ®iJKjjš ”9°¶¶ [±br!VTT4--¦ ‡+..ž1cAÅÅÅa±L"hbb2}úô£GNž<™L&óóÿ¼?ÂÁÁ᯿þÊÏÏ_¶l Ãtb@®øê›(‹ µ±±AÞÞÜÜ,**ʬ-T[8®  `æÌ™2R¡šš´‚B³‚BógRR>ÆÆfUT4Òé,Ú»×V][ž”mo—‘bà´äÎÓrüøñ.\°¶¶† HNNîàÁƒaaaÐ6™¾þŽD•5Ñ‘!´úˆmõê™ÍÍÉÉè”Ù·o ƒHNCJJ’l›2eœµõ©ë×GüDïÊœÝïßïEn,ôðˆÔÕ òõÏË£½ðŒtïÞ•ðñaôô9ؽ{wUU•¥¥evvvUUÕ­[·öíÛGSÆÍÍ-888++«  `óæÍ––– ~Q‹ŽŽ.))¡^€~íÝÛÛk`` ®®žŸŸÜ}ÔØØAMvvvll,rcO1ˆŠŠÞ¹s§¥¥åÀÔMãñ}?èYïêê˜]XXèîî>gΜÁì³Á¡ßÖŠ+öïßÿæÍ›ïß¿8Pž†††¬Ï¬¬ÝÏŸï\¿~Ž„„ AÌïpœ–ÜyZÚÛÛûøø<|ø°ªª*//oÛ¶m†††êêêPÿ›<ýj4Gd(è=ú´~}„¹y(ý2ça±Þ©©Ÿ‡Ù‰D:{ö‰¼¼÷Žq==„aÖÆ…ŠŠj{`h,'çejzèìÙ' mœ `_ßx+«SœŽF5gV “É¥¥¥NNNbbbcÇŽµ´´D.uãñxò¿Ã¬{zzvîÜ)///..¾lÙ²þF‡ÿº APTT͵¬¬¬ääd%%%>>>ccãû÷ï›››kii!õX[[kkk#ËýÅ)###!!L†¬711áççohh  Œ²¾§§ÇÏχà š››S†§¸E}êïU$úmuww{{{#“zEFFBƒ™YfeOááÃÏë×G()íÀb½)s-ŒÄ™Èà´äÊÓ²³³s×®]JJJ<<<8ÎÅÅ¥¦¦†Î&3r,èèï(Ðlõ¡̬À4_¿V𙋉qŸ=[‹N±Ý»“nÞÌzòd'6ÌïÞýäåu}Ò$Ü_­’”fm\ˆD"#wÓݺ•C LM5íì¦YXè`0 s›;÷Èܹã­8Œ^ άÀÍlmm víÚÅé@¸Ž½½=AýÍOÐÞÞýèQ^bbö˗߈DÒË—~Üt×½ÈGpZrƘYi&LÀš˜h„…=£_l÷n+yy±Í›£‡ÿp4KKÝ””­UUÍVV'ÿþ»j˜µq!ÊÝt»wí²,/o\¿>ÂÄäàñãKKéÕ¸VKKgAAõ´iJœ€‘ª££#33óÑ£GÎÎΜŽå§ÔÔT¸/œ–€ß’%S¢£Ýss÷>l/,<†Óý&ÀiÉm˜rD@F4Džžs_¿þž“ó2¼¼˜°°Ÿ>•;7@Ù IDATĈñã±xãpbVV§îßÏ~…ÜIRRÐÝÝôéSßÔÔms挿r%ÍÈèÀœ½q#£µÌM7’¤¥À0lh¨Âé@©lO§ Ã'N8Í›w$((éĉåLiÚÅÅH]]fݺk¶¶g®][­¨(Á”j¹™¿½½¾½½~UUÓ­[97ndFG§«ªJÛÚN¶³Ó7î÷ß#KffqKK§¹ùDN,—Ÿ_uöì“ää0 !‚©®nNFD"‘ëêZjj(?Í55-ÿüÓ€üÚÜÜA))"2vÜ8 aa dYFFXLL€—AP||ü›7ÃßL€ßȈ†F¹»ÏÞ»÷ö¶mæôoÏ•”>žÕMìW^^>rÿB–——ƒÓàˆôôô_W‚Œh¸V­šö,&&}Æ9ôK ð]¹²ÚÂâø±c©;w.bVh4Êß±‰‰æÆ‘ffÇ._^¥¥%ǬÊ9L>à ÈÌ*ìiëþý\))!==…áWåíííàà0üz`˜"#o|ùBÐ×njj§ä9}"“ɂ˗JK ËɉHK ËÊŠp¼«‡m€Íu ‘«ddd€Óà #.QѱW®¼Z»ÖdÀë|šš²{÷ÚîÚ•`l¬6k–Ø1C-5u›»{„•Õ©cÇml&3±r`‰DŽ‹{go¯Ï¬ŽPà¸ææŽää¦46¶¡Ñ(To/±¿ÂIDd̺u¦ìŒpYà6àÒ'ÀmÀW&Ø´in}}Ûõë Ý’äêjlm=yÓ¦èÚÚVæ†!''š”´yåÊ™6DúúÆÓù‡ ¬“ž^T^Ž_¾ÜÓÓˆˆŒupP©©¹ôñãþ°°®®3´´äGÂóðÐ^X$“Éåå ‰1œœ¨££ÁÙ³OLBÑ>ÞÞ×™þx\ `yîÜŠ[·r¬­O•—ã™[? (11[WWAUUšÓóIK YYé/yöÌ7;;èÌçeË GÒÁ0>q=¬k‹ bbb<==¨WÒ|ñ" ’’’NNN ?'Ã…a866‡Ã ùûû߸q‹Å ûøøP DGGS/Ðo†á—/_***^ºt©¿ûüÆvëÖ-eeeQQQJa †SRRp8œ¸¸øÙ³g‘5IIIÕ××÷·uôôiþׯ•[·š \”©Ø|2üêãÇóçÏ3fÌĉ‘G°/^¼øøñãHŒŒ IIÉÎÎNOêMÝõz2™|èÐ!eeeqqq{{{Æ·èW&&&ÍÍÍùùù=|øÐÌÌÌÜÜ<55‚ ŠŠŠÊÊÊY³fщ-!!AVVVBBâÔ©S”:ÛÚÚšþE$éäãsõêUúÁ÷¹Ÿ©ã¡‰ú³FóQêííõññ‘–––——¿|ù2???ûïë¸ `ªÜÜ2,Öûùó|ÆßB"‘Ö¬¹ª«»»ºº™u!ÒÒ ôô‚ öggÿ`u[CÇÈ9)&&–œœÜß«eee~}©©©‰@ Ëß¾}CŽQSS??yy9‘HÄb±/_¾ìéA?#š0aBLL ²²¢¢F···m‹ÈdòêÕ«×­[W[[ËËËÛÜÜÜÖÖÆÇÇW\\¼sçNú±½ÿžüËYúk[t6ùø |Ÿû¹¿H0ÍGI]]=22)–››KçP€Œà7îšc>OÏy99?Þ½Ä]p‚‚|/®|ÿ¾ôرTÖ†”ŒŽvß½ÛúÈ‘+W^ÁãÛYÝ"Óa±Ø‚‚ʯx<þ×™ßÊÊÊTUU‘ed¡¼¼ùUPP‚  E³<äæé·Ø'JaMMÍ> ËËË÷Û`Ûb)´gO’••Þ´iÊìoÍ'ïšššMLL°X¬»»;²RDDdþüù‰‰‰¯^½Â`0³fÍbî!+))qvvFfr“——'‰ÃÙ"“ÌÌÌÇëëë Ìœ9óáÃ‡È "úïÅápŒ4Agó‘Ï€Á÷¹ŸDóQ*++£ŒÇSWWTUÀo dDÌ7c†š¡¡ÊÑ£õ®ñãåŽu8}úIjêgFÃðÚµ&ׯ{äæ–/ZtâÇ6µµuXXrÅ‚ QQÑœÚgãâp¸ââŸI)²€ÅbYÔòM‹N‹d2úåpQQ²ðýû÷>ÃCÆEô‰‰[7|qq™ÿüÓ°k—%GZgóÉð+“âââ£GþøñãáÇ”õ qqqË–-ƒax°§}X,ööíÛÈe-‰„Çã544†¼ ¦¦¦yyy·nÝZ°`²fáÂ…÷ïßÏÉÉ0#¢s–R£³ù ¦ ýígFÐ)''WRR‚,S>†Àh2"–°|ó¦ðÅ‹¿õ®?þ˜º|¹¡·wì?ÿ°c üŒjOžlWS“¶µ=}æÌŸ-Ë vïÞ]UUeii™]UUuëÖ­}ûöÑ”qss ÎÊÊ*((ؼy³¥¥¥¨¨(#•GGG#ß–( Œ4G§EQQÑ;wî´´´8p€º|HHHVVV~~¾§§'ãá s똮££çøñGË–Ž'Á‘Ø|2@¿LÐÛÛk`` ®®žŸŸïêê AòÀ(›ìììØØX''':1ôwzàñø>CBÖ»ººfggº»»Ï™3g0ûŒ–’’‹MJJ¢ÎˆîÝ»‡Á`&NœØ_ ƒ2ü3¶¿ýL#±9;;‡„„¼ÿ>??™¶Á¼ømqò–½ßš“ÓsóÐÁÔéèèž;÷°¥å‰îî^ö«øøwjj;-:^RRǶFûÄøú¥¥¥NNNbbbcÇŽµ´´D®:SéééÙ¹s§¼¼¼¸¸ø²eËú•ñë2AQQQÔ Œ4G&“ûk122RFFFBB™¬Œ2¶áàÁƒjjjÂÂÂK—.­­­¥͉þÚbʾ”R45ýjk[˜^3™±qDdöž 4?³²²’““•””øøøŒïß¿onn®¥¥…Ôcmm­­­,êô011áççohh  Œ²¾§§ÇÏχà š››SfMp‹úãââ"**J¨C&“q8œ••õ±è3¶>ÇíüÚÖe¹¿ýLOŸ±ýúQêêêÚ°aƒ˜˜˜²²22sçOŸèìGðƒÉ Ï Jnn™…ʼnk×V/XÐÇEV:JJê,,NXYé=êÀ¢Ø~UTT»qcTII]P‹‹ÛÚ¥ïèè8ÎI†³²²¦M›Æ¶Y±o¿~­\¸04$d©«+KžÊ Ãp\\œƒû>Ìekkk``°k×.Nô+//oÒ¤IuuutrŽž¿N£¸kŽUttÌÌ´¾O" î?¨²²ÔåË+cc3¯^McQl¿RU•¾wÏ{ýúÙ~~7ÝÝÛ›;ØÖ40B‘Éä]»ut8˜Bs­ŽŽŽÌÌÌG9;;s:–ŸRSSá¾r:4vÓÖÖöõõmmm­®®Þ½{÷ܹsL‡€ßȈXhçÎEß¾Uß»÷i°oœ9ScçÎE{÷Þ~û¶õ ƒAùø,ŒˆX›‘Q´xñÉOŸÊØÖô(D&“ÙÙAÄ 7ofgg—ìÛg‹B1´Ø÷*+K9ã¼jÕ•É“W­šÅŠðè—‹‹Û“±wïígÏòOŸvÒÖ–gs ·))© JÚ°a¸_U//öôé'¯_dgÿèêêÅ`PD" ™|Žæ999ÎD ȈXNIIréÒiÇ?ZºtÚ®©›™i{{›ïÝ{GK kd¤ÊŠé€aØÅÅhÊ”q›7ÇX[Ÿ ´ts› FÒZ=«W_ÕÕUðó[ÌéX€}š›;ââŠ%$ìºGYI ô=@FÉË‹³+´¾ÅÇÇs6€SŒq8§£€‘dDì°u«Ù­[97ndº¹ÍÂÛ½¼Ìrr~lÜyÿ¾·œÜàôÎ&`<ð>z45(èvJʧÐPGee)ö‡p\@À­úú¶7<@V p‘HÂã;ðøv<¾ïhjêhllÿ÷§­®®µ±±½¹¹£³“ðùó~¾á´%"2ÖÙYíîÝ?I¸páyw7‘@èwâ4õúõw[Û3²²"22²²"ÒÒBrr¢RRBrr¢‚‚Ê„AŽŽŽlhàB#únÀAà ­l²{wRRRNzz ÿÞÞÖÖmcsŠH$''oJ L‘Ÿ_µcGÜçÏåîî³Y1²y"së¨ çó~ç·£†ðÐá!ƒanÉ»0q^^99 F´¡!ÓáŒj<<²""sÑhQŠ÷¿¯Éd¤Ó†áÿOÔÓSÕÐǬÖÉdrkkW\Ü»S§ãñídrŸ)´©©–‚‚XeeS]]keeSCC嶺±cy‘ì‹ý™#!ù’´´¬¬È˜1¼¿´9#ýéÆÀЀãC2"6ill72 Y»ÖdÇ‹¡ÕPVÖ¸xñ …ˆˆµh4Ç& $‘ÈׯgìÛwGQQüøñ庺 L¬¼¼¼üíÛ·L¬ 1äÿ”yy66§]]ƒ‚l˜¼ó§«‹XZÚVRÒúÏ?­%%m4–—PR²¶‡ÁpKª6:54tÅÄ·XF™™a.dÚŸ)Ê'¨§‡pç·ÐЇee (Šú 0 ?ïfm­GýÆ®®Þšš–ššæšš–~.WU5µ¶v!ÅxxÐââ22"22ÂÿþüYZZ˜ÁËà›ñèŽ; ȈØçäÉGgÏ>}ó&@FFxh5dg—ØÙ…­]khÅÜØ«´´Á×÷æÛ·ßׯŸ³cÇB0çØï­ººÙÂ⸎ŽÂµkk~×ûåz{‰>ü“›[ž•Uòî]qMM A²::8}}eUUi <®€‹Ü¼™åçw³·—Dç6‚RR¼¦NeÕsrI$òÓ§_CCSssËÑèÿçE·oo60ÄcŽèäKøöön¤//FLllù’ŒÌÿ§sߌG'pÜ`È@FÄ>]]½3füif6áÐ!û!WrófÖÖ­×qpq1bblC@"‘##ß>ŒŽŽ‚ Ò4ä»XîñãG½§gô§Oe$Òÿ“"4d£¥%ûèQ^jêçŠ ¼¤¤àìÙZffÚsæŒg]†_\\§¢ÂáÙ8A_ÁèŽ; ȈØ-5õóêÕW““·L›¦<äJººzÿøãl{{wJÊV.é–éêê=wîé™3Ouu²?^ŽÓÃuùò«½{oŸ=ëbk;…Ó± BŸAŠŠHþc` ü‚ ÊȢׯwQ’“oߪŸ<É{õª =½F¨˜™i[XL’—ãXÐ,¾Nà¸ÀŒˆllN£PpRÒæáTRZÚ°xñI}}åË—WqOŸÌçÏå¾¾ñùùU›6ÍÛ¼y>¸-s¤º{÷“‡GD` µ‡ÇlNÇ2°¦¦Ž¬¬¤#(?¿²­­›—£«KéÂQ:~c>”nÚ]^ÞØÛK””ÊÍÝÿk™Êʦ'O¾>y’÷úõ÷ž‚®®ÂüùÚ––ºC¾™™ 1øÍ¸¥¥eÿþýqqqµµµÒÒÒ ,Ø¿¿¼¼]ÕÊJÏÀ@yüx,ÓŸ—p¿É“Ÿ>ÝqèÐý¿þz9wîø>Ë`±¢®®Æ®®Æ=¯_ü8/2òíѣƗ³²Ò³¶žÌñ{ÞØƒD"-Z´†á„„•ÊÊÊK—.ðñøAƒlóüùs===‚ðx|XXØÒ¥KKKKX;™Lúˆ8cõê«……5ÏžíæÝ;ç­^}Õ××bóæùÌŠ)šš:BC†‡¿ÖÑÁ…„,3Ñ ÙÙ%NNÍÌ´ÏœqážîG‚ZZ:33‹ssËÞ½+ùø±´µµ éBî…30PAEffqww¯‰‰&#…I$ò»wÅÉÉîÝË­«k8QÞÚz²µµž¢¢«ãdFú ®^½PXXHýõ½©©IHHFÐ>"†ëêê$%%iZ¤^ÏÜæ¨7ª¥¥EDDäëׯãÇ÷Ó„Çô@ ¸™ž3,ü¨OHÈf=ffÚ,=tèþÍ›Ã­Š¹DEÇ/IMÝÆË‹±²:¹eKL}}§ƒööm¡£ã.I‡Èdò·oÕÑÑé[¶ÄÌž}X[;ÐÍírDÄQѱ;vXܾ½9?ÿÀ;[‚ƒ—XYét fh¨Â`:A OŸ®úçŸvŸ>íOMÝfh¨zåJÚôé!³g M-‰0™Û IDAT+kdi¨œãééIÓ›!**ŠFÿ¿s•@ *((HJJ:99544 ëaŽÅápBBBþþþ7nÜÀb±ÂÂÂ>>>”ÑÑÑÔ ¿úøñãüùóÅÅÅÇŒ3qâDä‰Ì‹/>~ü8R ##CRR²³³³¿êëë©—‘{ؤ¤¤(ë)¯RÖ“ÉäC‡)++‹‹‹ÛÛÛ3¾Eýikkkjjjjj*)) ž4i’††Æ€áQ/ÓÙÉ)))8N\\üìÙ³ôÃ`¸È‡xy]Ÿ6m_ggÏð«Ú³'IQÑçåË¿‡_+œ@àØajnî|ôè˱cÂ45ýää¼}¬­OÞJNþP]ÝÄ©À€Q¥§‡ðèÑe劊>®®%%åttts:.FAG¿Œ˜˜Xrr2²²²<¨ªªš‘‘ñíÛ·¹sçÚÚÚR^µ´´¬¯¯OHH€ È‚²\TTD&“£¢¢Š‹‹© ©›ÐÔÔôðð())©®®¾|ù2_wwwxx¸‘‘R`ëÖ­ëׯ§C]]Í2ÍJJ‹”õgΜQSSKOO/,,´´´´³³cp‹úÛKÔP(ÔÓ§OY¦³æææ555‰‰‰ ¦«««ßcIπǀ>ŒˆcêêZ55ý¾?üªˆDÒÚµ×44üòò*†_+47wîÛw[QÑgÁ‚cÏŸçs:œÑîë×Ê_WfekjúÛÛŸcJ–Î8‰ô÷ßUññïvìˆ35=„Ãm““óš81ÐÝ=ü¯¿^ffµ·˜¯¡Àï§µµ+>þ£ãyn›††Ÿ¯oü§O¥œj`Œ|3Æ`0oÞ¼¡~ Ç“ÿM'ÔÕÕ#""_¾| ¨¹¹yõùóçd2™H$Ò,Ó¤=ÔõÓ¼ÔÔÔD åoß¾!BSS??yy9‘HÄb±/_¾¤Ã2¢ &ÄÄÄ ++**Ðht{{ûжˆ¦‰–––7b±Xd£ψèl`RR% Êé ¸kŽc$%·l1;þÙðoÉ@¡à³g]´´ä\\.UV61%<ææ ²yöÌWAAÜÙù’½ý¹œœ8Ô(•˜˜meu²¢O½òÙ³|GÇ S§Ž _ËÏÏÃ꺺zÓÒ BCSÝÜ.Ož¼gΜÃÞÞ7rsËgÍÒ [ñáÃÞÏŸƒ/^t[»ÖÄÀ@eìX^VÇýä³·×õÈÎÞãåµ #£háÂãææ¡ÑÑé=œŽnX°XlAAåW<_QQAS¦¬¬LUUYFÊËË‘_!B¡P4ËŒkjj 411Áb±îîîÈJ‘ùóç'&&¾zõ ƒÁÌš5‹N CPRRâìì Ã0 ÃòòòD"‘Y[$$$\YYI½WAg‘yÿ»cð1ã¤uëLååÅH~U||˜ðð5|..—ZZ:‡_!+¨ªJ_¾¼êÙ3_qqA+«“ŽŽçssË8Ôè’›[¶m[lgg¯Ÿ_eebböªUW/Ö _˺ôãÛ·ê›7³|}ãgÏ>¬¡áçèxþÚµ×­[gzûöæoߦ¦n#‚®%##¼aÜ—/ýRR¶Nš„Û·ïÎÔ©ûþüónuu3§C"kkë°°0¤ÿ‚ QQÑœœš28®¸¸YF°X,³011)..>zôè?>|HYïàà·lÙ2†éÄ@&“¡A&HX,ööíÛÈ%a‰„Çã‘a?LA  ³)ÆÃ£³Ô³{ÀR #â$tPuròÇŒŒ¢á×&&&íÞÐжfÍÕÞ^âð+dMMÙ‹Ý¢¢ÖÕ×·-^|rëÖë……µœjT¨®nvrº@$’ÈdòÓ§ùwï~"‘ÈÞÛ²åúºu¦§N91wºj:A¡¡ËÒÓ¿| ‰ˆXëé9ÏÀ@E@Ìö Œ S§*;易³gÓ¦y‰‰9††Á[·^/.®ãt\ƒ¶{÷*KKËìì쪪ª[·níÛ·¦Œ››[pppVVVAAÁæÍ›---EEE©<::º¤¤„z¢š„ ©©‰H$ööö¨««çç绺ºBÔØØAMvvvll¬““DEEïܹÓÒÒràÀê¦ñx<Ôd½««k```vvvaa¡»»ûœ9s³Ïú@Ù¨ŠŠ ???===Ç`xÈòw2ÌÄÁ;öÄòåÌÌŽ"ßS‡/=½pܸíÛ·Ç‘HÌ©uˆDRBBÖŒäå½×­»öùs9§#úuw÷.\x ¥#'ç…ÅzO˜°ËÙùâ¸qÛcc3©K––6¬\yyh£wþù§>>þ]`à-sóP…mrr^ãÇïruýëìÙ'™™E­­ €¤§‡˜˜={ö!nÛæÍÑ……5œŽè'ˆ±ñ$¥¥¥NNNbbbcÇŽµ´´D:(¨ÇõôôìܹS^^^\\|Ù²eý Ñùu‚ ¨¨(šjYYYÉÉÉJJJ|||ÆÆÆ÷ïß777×ÒÒBê±¶¶ÖÖÖF–û‹!22RFFFBB™ËYobbÂÏÏßÐÐ@e}OOŸŸ‡477§Ìš0àõ·Ÿ)ÆŒ3oÞ¼ïß¿3uHŒìd0ŽX <ˆó ªÍÌŽ>l¿l™!S*LIù¸qcÔÆsýý3¥BVKK+8z45;»D__yÓ¦yÃyp-П͛cnß~O$’(k0”††ìÁƒvúúÊÈšÞ^â¥K/ŽMíé!$&n22R°Úîn§O¥YY%ïÞ•äæ–ÕÔ´ Pðĉ8}}eœÊ¸q#õ‰.À¸´´‚ÇïøP:þsÎÆ3ÒŸKckkk``°k×.N2ÂŒôã„át¤¡!ëâbtðà½Å‹u…„ø‡_¡••^OaëÖë|[¶pד[û4k–ƬYÏžåŸ9óÄÍíòôéª6Ì™7oÇŸ‡óÛ¸víubbýçò@Êϯ¢ŒÙÍÊ*Ù¶-öÇz"‘„Á sr~ô—••5fdåæ–ge•äçWööEDÆ(»¸¨èé)2å4€dÖ,™3Õ<ø|âģŋO.Y2e×.KYY0"nÐ:::>þüèÑ£S§Nq:–ŸRSS-,,~]Âþx`ÐGÄš›;Œÿtvž¾k—%³ê¼v--00éða{#fÕÉïÞŸ;÷ìéÓ¯ŠŠkך88 ‚&Ãòöm¡£ãyêÞ! ¥¬,»!((éÞ½Oh4 )†BÁ¦¦š11ë‘b==„ÿÓ𺺌²¾¾²ŽŽ‚šš4 %D&“=Ê;p ¥²²iË3Ù¼¼¸ò8rû W®\àççÇéXFž‘{Ü€ã@FÄ-®\yµò‹;••¥˜UçÁƒ÷Î{æjm­Ç¬:Ù£¬¬12òmttzWW••ž§çô11Ñ<}úñ´iû<<"Þ¼)ù<×®¥ÅÇg‰$^^ ‚ ´žÞ¸y󯋉E£a2¢³Q(øÇz6Æ ¿'•Ç·ïß¿ääÉG ËÉù‡Ó´@wùñ£~ΜÃ~~‹×¯ŸÍÄj[[»–.=ÛÒÒuçÎf®›þÈÞÞ>!!ÁÂ0ŒæãS;v-PWÅÒÀF.^^œ„Ä„"‘:º»+z{+{zªI¤v!¡cÆhB„BÁ ª§‡Þ“|ÕÔ¤_½ògWÈ,žþ>:qÏÿ¸?êwî¼™ž^èá1gÛ6s~~Öµú F'pÜ`È@FÄuŽxáÂó—/ý˜;r½¾¾ÍÖö4JHðä¶[ÎìííËË˽½½õ®öv‚€˜>¾D"ùåË*II~%%Aaa^ê—Z[{›šzÿ\½z“¤ä¸Š |iiCyycSS'R€‡‡M"‘:;{aúûÍ\0 {yy¤©áHOO?yò$Wý#“É Ù{÷Þ{ì˜ãôé?òkh`ž>}:‡cQýwJHH Ȉ¸No/qÞ¼#ZZr—.­dnÍõõmööçzzˆ·nyrUO‘½½=A7oÞät £Å¯×»ºz+*ðÿþ4••5–•5TV6Ÿ:ådh¨ÂÁP™\=mâãã¹ð\KKgHHJttº••Þ¡CvbbLoù£ ŒBÛ¶m×}`À%v®ÃÃ>p`©£ãù'O¾ÎŸ?‰5KJ ÆÇo´·[ºô\bâ&a&VŒhüü<ªªÒªªÒœ~ÂÂcŽq˜5K# ÑÌìØ¡CöÌýS LƒfVàF³fiØØL Jêî&0·f))¡›77¢Ñ(;»sµµ­Ì­`••Þ‹~*®®­Zu¥´´ÓŒ^ #âRûö-ill?{ö Ók–’Šõ Ivvgëê@RÀââaa+’’6—–6Κup÷î¤ÖÖ.N0ŒˆKIK íØ±ðÌ™§EEµL¯\NN41Ñ“@ -[vogzýƒ URS·mß¾ðÆŒùó>xð™ÓŒ: #â^+WÎÔÔ” ¸ÅŠÊåäD<;:º΃¤ø_{w×ĵö|†‰l†MjHDÅ⎂—bq‰‚e‘ låª-ußPÑÖ*ê­Õë^­hQ@ ↶b7Ekƒ­Š"‹ È@@–,ïÓæå"DÄ$ÂïûñÃÌdÎs’3ÏÌœ3@#]]Æüùîü>b„mHÈ÷ï¿ÿõ¹stЉ #Ò\ †Î×_û]»ö01Q%?;!!ôÅ‹º3¾­¨¨UEJWUUµlÙ2§§§ÇãñfÏžýôéSjI’éééJ¬Ké;ÔÀ»qãñÙ³Ò…º¡i~Úª{w£]»B»Î{dÆŒooÞÄã\Ô‘F88rݺSUU*¹¹ÜÊÊ䨱¹%%/‚‚"UT…I¥ÒÉ“'§¥¥%$$œ?žÅb¹ººÖ××ÓšVÉÎ~¾uë…áÿš:uÇùó·èG­ÐÇ€v..½OŸžŸ˜¸@&#øüžž»RSsè @Ë!#Òt«WO%Irûö$íßÖÖâäÉÏŸ=ùúî-/×èÛ碢¢rrr’’’FŒaaa1pàÀ½{÷Þºu‹ÉìÀ“È“$YZZÚöåªSTTyàÀåqãþãæ¶y÷î_ž>¡yrQ-ô1ÐÆÙÄÇzäHÈË— >>{gÏ>ŒëEªƒŒHÓ³V®œüý÷¿ß¿_¨¢*lm-~øaqCƒxÚ´ÏžU¨¨–·j`ð?O3d³Ù Cþ§X,çñxæææeeOhK’d\\—Ë522ZµjÕñãÇ9ޱ±ñÒ¥KåÄÄÄ4-¼*##ÃÝÝÝÔÔ´k×® ˆ'bÊ”)Û·o§6HMM577ùòek1È@©2I’AXXX4;0mº\&“mÙ²ÅÆÆÆÔÔÔ××·í-j£çÏ_DF^qwß:dÈ—ç<("B,–¾ÑN´ú˜rû˜â=´ØØÆÆÆ¥K—vïÞÝÊÊ*22’Åb¥§§·¡Ö›0ÁñâÅ¥‘‘?^ÅçïðñÙûÛo™Ri';Q 2ÐxR©túôÝ“'o‹%ª«¥¤äÅøñ_¶>7÷¹êji‘Ïk7311ILLlm-AB¡póæÍ½{÷NMM}ðàÁøñã½¼¼äkù|~iiiBBA“&M’—srrd2YtttnnnӵæU888Ì›7///¯¨¨(22ROO¯¾¾>**ÊÅÅ…Ú`áÂ…sçÎUCIII³r³…òåËwïÞmgg—’’’ÍçóåoÔk[¤AGŽ‹ŽþcÊ”ÿZY-ær—p8‹{ôXôê¿Ù³¿íçÒQ!oƒ>öö}¬Y öÐbc#""ìííoܸq÷î]777ƒ! [‹P1@ M¿q))ÙAA9œÅ..wïþåùó*º#Ф¬³ÝÓ1åç—ÿõüùî ¸«®–ÊÊÚÀÀï Êÿ´_¿ª«¨___¢ Y×ÕÕMNNvuu¥þ¤Nr!‰Øl6I’B¡0 <<<((ˆ ˆ»wï0 ²²ÒØØ˜$ÉK—.;V*•2Œ¦e¡P8lذW«£vØtUee¥¡¡!u¹ ++ËÁÁ¡¤¤DWW÷wÞÉÎÎîÑ£Ç;~üxHHHk1”””˜››S;§ÊÍÊk”/wtt\³fM@@AÏž=ëÙ³gUU•¾¾~;ZD„D"ýãì©Sç³Ù¥$I*>ßììl«§×okêܹ]QQëýüülƒ>öö}¬Y ö`ooÿjc]]]×®];sæL‚ þúë/'''¡PÜb„Š?ñøøø3fhÙo\nnÉ‘#ׂë/_6Lœø®Ÿßð±cû2¸Ýà­hɱŽÖãñLÃÂ&oØpÎÃc€ƒÃ;*ª¥[7ýcÇæÍœù·÷žØØ¹ƒ÷TQEíÃáp²²²äG«"‘¨¶¶ÖÊʪé6ùùù½{÷¦ÊT¡   ÿþA¡££Ó¬Üv[¶l¹víZvvvŸ>}¨…ݺusww?yò¤“““É=z´‚Ú!///00000P¾¤  €ª½-jl”TV¾ÔÑÑ“Hdÿí+B’$›ýšãÎŽB&¿vô1ÊÛô±fì¡ÅÆæççÛÚÚRe{{û×FØÙØÚZ¬_ï6ùôé›±±)3g´´ìæí=tÆ g{{Kº£è¨u<úܹ[K—Æ=»@ugYqqó>þøð¿þõmLÌœaÃlTTQ;L›6mß¾}3gΤN*³Ùì«W¯6Û†ËåæææŽ5Š ˆÜÜ\‚ 8޲pss9räÖ­[,“ÉX,µÜÏÏïàÁƒ™™™þþþ$I*ˆ:]]PPÐöJ9ζmÛ<==©—WVV²Ùìv7ÅÒåóŠDçö쉳°/LJúK*•‘$ÑâÅ"33ÂÛ]Fùî»Y¯Ý}ìíûX󵯯=zäååQMËÉÉ¡7BÕµk—€€‘#Ÿ=«8}úFllê¾}¿õéóޝï0??g #ºè`p©½ÃÐÑ!·m›q÷îÓC‡š¢)W×®]Ž quµ÷÷ßåÊ•ÖõFÖ®][XXÈçóÓÓÓ O:µ~ýúfÛoذA(feeÍŸ?ŸÏç·ñÈ)&&&//¯i ˆêêêŠH$’ÆÆFggg{{ûÌÌLꆥòòr‚ <==ÓÓÓãâ⨻zZ‹ÍfŸ={¶ªª*""¢iÕ"‘¨Å¨åAAAáááéééÙÙÙsæÌ7nÜ›¼g­b2É œu÷îÆ;þ5fŒƒAêè::m¸r¤½ÐÇ”ØÇ^«ÅÆnܸñæÍ›™™™Ô $IÒ¡æãpØ¡¡ï_½º*6vn¿~=¾ù&ÉÙù«yóŽüò˽ÆF ÝÑtt `‚öÙµëg[Ûyy%ª®¨®®1(è`ïÞ+~ú鎪ëjãÌ 2™ìÉ“'&&&úúú|>Ÿ:;.‰dÿŒçnhhX¹r¥•••©©©¿¿kÊ_-ݬДP(LLL´¶¶ÖÓÓsuuýñÇ=<<úöíKígÚ´iŽŽŽT¹µŽ=jiiiffFÍ3F-wssc±XeeeÍ“/ohh ãr¹†††òí¯m‘DKs <~\ºk×ÏcÆlîÑcQÏžK{ôXÜ gV¡½ukË«4¶®®îÓO?511±±±¡æ`¸uëVk*¦e3+´EeeíѣצNÝÉá,î×oõ’%qÉÉ÷U:%€vÀÌ ŒX,:u‡¾~—„„P²-AÞBc£dÙ2ÁéÓ76oö tQ]EmœYA“yyy9;;¯^½šî@Ú„$I@ÐÚ÷ïž9sóĉôŠ)S<8K½Ñ©ŠâVk¾ŽÕÇ”âîÝ»ï¾ûnII‰™™Y;^®•3+´QyyÍ?Þ>qB˜žþÈȈõÁŽS§;¶¯®.ãõ/è|p×\Ãdêlßþ(::EÕuéê2vî X·ÎsÅŠkמÆC0ZT[[›––öÓO?5öÝ¡õíÛ#,lJzúºsçòùé4±%%%‘- Ë=;::®X±âÅ‹EEEk×®?~|ûÒ¡NÎÔÔà£\Ξ]põêªyóÆÞ¹ó488rĈ _|q&==ÿ™4ƒ™:ž~ý8Ÿþ~DĹ÷ßïgee¢êêBBÜØlý¥K㊊*÷ìùHkæbV– .Ìš5kݺu½zõ¢;e"IrèPë¡C­é4±Mœ8QE×^ÁÂ… 9ŽL&5jÔwß}§ŠZ:[[‹E‹>X´èƒŠÎË8{öσ“--?ø`À¤IïŽe«FAஹ©±Qâá±ÍÜÜH ˜§ê{ç(¿ÿþ0$äð»ïršmlÌRîÎµà®¹Ž¥£ß?Ö>³ÕYg¾kNüüò‹ïüüóÝ””l&“1ztŸ =<`†:èÌp×\‡¤«ËضÍ?%%;>^¨žß{ÏþÌ™yy¥žž;Ÿ=«PO¥ \<žiHˆ›@ðiJJxxøÔ—/V¯Npvþ*88òرÔââJº 2¢ŽjðàžÁÁ£6lH,-­VO}ûöøá‡E †Î”);îÝ{¦žJ@¬¬L>ùdt|üg·n}õŸÿø1:kמ2d½‡Ç¶­[/ܼùàó@FÔ­Z5ÅȈµtiœÚn ±´ìÿ—ËöóÛwãÆ#õT ªcbbàç7üðáO²²6Ÿ>ý¹››Ãùó·øü}ú„GÆÄ¤àÂh=Œ’ïÀ ôž:uçáÃWgÏvSO¥¦¦ññŸ…†Æøøìýúk?_ßáê©Tª®®ñéSÑ?ÿ*òóËóóËž=«Ü¹3`Ä[º£€·•’’²}ûö6nܽ;a`Ð¥¬L/%¥úçŸïêè}û–š˜Ô©4BxS...K–,¡; -Œ¨csrâ-^üÁ† ç\]íúõ㨧Ү]»:ôñ¾}¿-^|\(Ì‹ˆð~ûÙŠ âãã•^gÓØ(Íʪ46îbdÄ42êÂ`(šiãŋƊŠË.9¹ðîÝ3¹¹ÏóóË +_¼øûX‡Édèèb±D*•é莎Vji„𤤍|ÎzÐø¸›ÊÏÏOHHðññiãö  ={¾hh`ˆD,CÕ†o*55•î´ æšëð¤R™¯ïÞòò𤤥jžû—_î…†F÷ïÏ9xðcssÃvïÇ××—z8=´¾þ»Ýº'’ ©´A&{)‘TK$ÕRéK©´V*­‘Hj¥ÒZ‚c±ú¡£C2™: »µ³ë~åÊ*5µAõÔ3+#hüÆQ0óž–Á­Ê…kDžŽùßÿþk„o¶lùá‹/<ÕYµ»{ÿ3g|üñ¡©Sw|ÿýì¾}{´o?ø?ýí8!\¼ø¸T*ÓÑéB]Œn É`0d2™X,mzÔµk}}ݪª—ŠÓ¡.]®®vª\}p,-ÂÌ Ú gO³?üî»äß~ËTsÕýúõ¸pa1—k2uêÎ þRsí çë;|ÿþ`CG~%D"‘54ˆ%Í2’$¯\Y½v­'‹¥«àvG±XÚ»wwÕ  i _ßáÓ¦ ZºT Õ¨¹jƒãÇ?õós ù>"â<ÎÄÓ…Ï(|ª§Çd0Zý^ëê2BBF›˜è‡„¸]¾¼ò½÷ìI’ÔÑiáv2©TöÅgV͘ñí¶mI?ÿ|·²²V•áÐ㈴GUÕË÷ßßêäÄ=tèZˆ‰IY³æäĉïîØñ¯®]»Ð\¿žp ¾^,‘H_]«««sãÆú¦ƒ¾~þùîòåñåå5bñÿÜDÇfwÝ·/èÆÇ7n<ºyó³èýE IDATQUU®.Ãɉ;dˆõСÖÇ[÷èÁVyc@I0ŽHË`€ra‘ö06îº{w ÏÞ¸¸4ÿêà£\,-?ÿÜvìØ¾cÇö¥6+.®¼~=ïúõ¼ŒŒ'QQ¿76JŒŒXƒõtv¶qrâaklÜUmmP"Ü5§UFŽì=gΘððS¹¹%´0a‚ã?,nl”xxlKLü“–ÀɉwîÜÂnݺ2™ÿ3LH,–\¾|úôÝééyM—ëëwY³†úô|kk &S‡ ƒ1|¸MÓm,-»M:hÆégÏ.ÈÌÜtæÌüåË'±ÙúGŽ\ Žtt ;ö? įĤïœ=»ÀÄD_ž1™:ãÇ÷¿tie÷îÆÓ¦íš1ãÛ¿þ*hú’áÃm~ùeùÊ•“»ta66Їµnmçúú]œmCBܾ}{ß~¹oßÌÑ£û<~\¶fÍÉqãþ3hÐÁÁ‘Û¶%]½šõò%cÐaH¥ÒÉ“'§¥¥%$$œ?žÅb¹ººÖ×ãò¶ýƒ ˆK—.QåÁƒÓ(‚qDZèÞ½g“'ÿwñâ.œ@c?ýtgÑ¢ãff†û÷iÙƒ>;Šüüò?ÜS\\E:}zþˆ¶A\ºtÓ¦óΘ1",l²™™a³W­[wzïÞ™úúo<¬¦¦þîݧ·o…y×®=,/¯a2ulm»;;Û nãäÄspxGY­€¶kã8¢Ã‡¯Y³&;;ÛÀÀ@¾°¢¢ÂÈȈÁ`$) ‡ ¦¬¨”¾ÃÖj)))177oVcÓå*ª·­kcTG \¸F¤…ú÷ç„…MÙ¶-éúõ\Ãøàƒ¿ü²ÜÔÔ€Ïßy…ÆH:-ÏôäÉÐîÝI’tt´¢Ò!‚ Æë{ñâÒ]»““ï½9&&E*•5}Õ÷ßÏnG:D„žüòÑ;SR·mó=ºÏíÛ‹7î?ƒ­“_>ª«kTN;@IbccCCC›¦CA°ÙlãÿoÁ‹Åááá<ÏÜÜ<  ¬¬ŒZN’d\\—Ë522ZµjÕñãÇ9ޱ±ñÒ¥KåÄÄÄ4-¼*##ÃÝÝÝÔÔ´k×® ˆ'bÊ”)Û·o§6HMM577ùòek1”––6-S$°°°/—¯•/—Éd[¶l±±±155õõõm{‹Ú®Å*öïß?dȱXLÄ’%Küýý[‹TNZjöìÃNNk‹Š*é £±QòÍ7¬¬òÉ¡ŠŠzƒéœž=qöìÍWW54ˆ÷ìù¥W¯eï¿ÿuzzžJè®®KKËٳ痠 ƒýû¯éÑc·d̘-Ë— âã¯ß¿_¨ÒÚ:9@Ж_|“ÄÄÄÖÖ! 7oÞÜ»wïÔÔÔŒ?ÞËËK¾–Ïç—––&$$1iÒ$y9''G&“EGGçææ6-P;lZ…ƒƒÃ¼yóòòòŠŠŠ"##õôôêë룢¢\\\¨ .\8wî\1”””4+7[(¯Q¾|÷îÝvvv)))ÙÙÙ|>ßÇǧ-R¬i]-V!•JÇ·yóæëׯ[YY•••5‹Vyœðöi­ÊÊÚ‘#7øøì‹%tÇ";>ÃÁ!lôèMwï>¥;–Ψ¤äõ¨ÖÝ»÷”ÏßÁã-Y·îtuuzBzô¨4>þzxø)mVV‹{ôX4hк  ƒ{öü’––SWרž0:‰6fDL&óÚµkò?å'OE"‘ìŸC|{{û#GŽPܹs‡ ˆÊÊJjí¥K—d2™D"iVn–ö4ݳUb±˜*?xð€J***X,VAAD"áp8ÉÉÉ bhGFÔ¿ÿØØXjáÓ§O FMMMûZÔZëZ«"''ÇÌ̬OŸ>çÎk•bȈ” wÍi-cã®û÷_¿ž·gϯtÇBL™2ðâÅe††¬I“¶oÛv‘®Y:-ssCj¹õëÇ9{vAD„w|¼ÐÃcÛ­[ùj©W/3_ßá6LOJZrÿþæ3g懄¸±wïo^^»ííWNœ¸}íÚÓ'NŸ<)SC<@‡ÃÉÊÊ’ÿ)‰äÍÉåçç÷îÝ›*S…‚‚¿§i144$BGG§Y¹í***ÂÃÃÝÜÜ8Μ9s¨…ݺusww?yòä•+W˜LæèÑ£ÄÐyyyÔ¤pVVV‰D‰-R\…­­í¤I“'OžÜîøàí!#ÒfòÂçnÝzá÷ßÒ Ñ«—Ùùó‹""¼÷ï¿4fÌ–ÔÔº#‚ÿ§£CΜézõê*;;K>GDÄyuf­††zÎζ¡¡ï9rï^5úÈɉ{õjÖ¢EÇGŽÜ8xðÁÁ‘{÷þzýznCƒXmt6Ó¦MÛ·ou„ 6›}ãÆfÛp¹ÜÜÜ¿©R‡£¬ÜÜÜrss·nÝúèÑ£‹/Ê—ûùù%$$j°‚d2ñ† ‡Ã9sæ užX*•ŠD¢>}ú(«EŠ«HOO¿|ù²™™ÙîÝ»•[#¼dDZ.$Ämüø~‹¯¨¨¥;BG‡üè#—_]Îã™úøì]±"¾¶S3kssè¨ÙÛ·ûGEý>}úîGèÚK]>úúk¿Ë—WÞ¿¿I øô£\‚س‡º|&¿|TP ¢%BmµvíÚÂÂB>ŸŸžž^XXxêÔ©õë×7Û&88xÆ B¡0++kþüù|>ŸÍf·eç111yyyM ATWWWüC"‘466:;;ÛÛÛgffQ^^N„§§gzzz\\\@@€‚ØlöÙ³g«ªª"""šVMÍ…ý*jyPPPxxxzzzvvöœ9sÆ÷&ïY›´XE}}}ppðŽ;>üå—_>zôHq´ B´Ý¯êR^^=lØúÀÀ‰”îXþ&‘H##“íìVº¹m¾|ù>Ýá@s™™ÏÞÿëwß OM}ýèaµ‹%÷ïÆÇ__¾\0fÌçïÑGsæD<˜œ––S_ÑG-kã8"™LöäÉ“€€}}}>ŸO]i:ލ¡¡aåÊ•VVV¦¦¦þþþ­ ÑyµLDttt³BSB¡011ÑÚÚZOOÏÕÕõÇôððèÛ·/µŸiÓ¦9::RåÖb8zô¨¥¥¥™™5—µÜÍÍÅbÉç-&_ÞÐÐÆår =<<ä³&¼¶EŠ5ݬÅ*–/_>}útjƒÕ«W»»»7‹VŒ#P.<¨SÈÌ|Æçïü÷¿Ý¦ÐËÿËÏ/ÿê«Ä~¸5a‚ã_xÚÚZÐü¿úzñ²e‚ÄÄ?7nüpæLWºÃiAUUÝ­[O®_Ͻ}» --§ªª®k×.X99ñœm\\ìÌÍ _¿€Î¡Ï#Òd^^^ÎÎΫW¯¦;€ç(2¢ÎâäÉô Ž<8kòd'ºcù·nåùå¡0ïÇ®[牣X“²zuÂÔ©ƒ¶móg±té§U‰4;û¹P˜G%HËd2KKcggÛáÃmœœ¸ƒ÷ÒÕe¼~GZªCgDµµµýõ׸qã233{õêEw8AIII“&Mzuùš5k6nܨ†(2¢NdÅŠøÄÄŒ¤¤%ÖÖªzDwûH¥²'„[¶ü K,pÿè#—®]ÛóxPP…‹ï|þyÌ!½¢¢fw”Ï¥¤äEFƓ۷ó¯_Ï óêêõõ»8:þ}ùÈÕÕÎÌ ‰7t.:#:yòä¬Y³Ö¬YFw,š€r!#êDÄ^^»ëëÏŸ_¤‡¶55õû÷_:x0YOO÷³Ïƹj`Ó_øûïï߿Ǒ#ÿÖ×ï`ŠX,ÍÉùÿËGYYEAÈ/9;Û ÀÕÑ!é@µ:tF¯BF \Ȉ:—ÇË&NÜ>eŠÓ7ßÌ ;––ÕÔÔ?ž¶{÷//_6¿÷ùçã»uÓ§;( rržûøì³´4Ž‹›ÇfwàO¤¸¸êöíü¦— ôú÷ç8;Û:;Û jmjj@wŒÊ‡ŒHË #P.dDί¿Þ ŽŒˆðEw,­ª¨¨=pàò¡CWºtaΚõÞ¬Yïa|í23 gÌØgkÛýر¹îJQ‹š^> ó?.#¢W/³áÃm¨ûëpù´2"-ƒŒ@¹uF&õUâ‘#!ãÇ÷£;ED¢šÃ‡?rä÷/ê||†Ï;Öή;ÝAujy{ï2¤×áó™Lm{šYqqåíÛׯS÷×å×׋ õúõûûòÑðá6úâtrȈ´ 2"åBFÔI-_þü­ Ó>ËBAAÁü¡`±X–ž^rùraqqmÿþ&Ó§[››³ÔžóóókÇ«23ŸMŸ¾{ܸ~{÷Îìè×Oâãã[[UW'yò¤:/ïÅãÇ/òòª_¾3¤••µµÑ´i½˜ÌŽÝp-Ö¾^Ý #Ò2Ȉ” Q'ÕØ(™1ãÛÒÒçÏ/66¦3Á ~§Û²¥žžµÁÀŠŠŸ¤Ò—ªŽª3h÷wÿ—_î}òÉ¡Ï>¯Q·j’lkbÃdšvéÒCW·“É.+KPiTð6ð‹ÖdDZ€r1éè¡«Ë8p xÒ¤í Æ:ô í'ûñ;­NmÏB[äîÞÿë¯ý–,‰ëÛ·‡—×%¦~W´Ã[öêN¢íg@óùøøÐ€ö@FÔyYX8ìí½wçΟ/þ€îp #ñ÷ñðañâÅÇmm-œœxt‡¯áêê*莔‰ÇÃÿ½JƒŒ¨S:ÔzëV¿E‹ŽÛؘwô“ý f«WóïÝ{ò}RÒRÌX  á¸\..‡´FÛf‹‚7åë;|Ù²‰ ûý÷,ºcŽ„ÁÐÙ±# ±Q²jÆÕ@†ŒˆE‹&xzž=ûûû÷ éŽ:KKã‚üñ¶@pîXÚ $InÛæïäÄ5ëPii5Ýá@Gâìlûï»…‡Ÿzô¨”îXÚAèê2öí ’J¥óæil”Ðt$+VLîÑ£[XX& €ŽüÍÂÂèèÑÿõWÁâÅÇ5óжªªjÙ²e<OOOÇãÍž=ûéÓ§Ô*’$ÓÓÓ•XÙ›ÍæóùyyyͶ‹Å$I––¶éÚˆÒ#Ô,–îŽ×®=ŒÒ‹J¨¹ã©¹Ÿ¨¡ÆW«x£ï€ª!#‚ÿ×·o£Gÿý÷V¯>Iw,ÍI¥ÒÉ“'§¥¥%$$œ?žÅb¹ººÖ×׫¨ÆK—.‰D"‘H”––¦££ãííÝlƒmdd¤¢:!CzÍ;vݺӅ…tÇ¢dêïx¾; QÁÿ1ÂöÀà˜˜”o¿½Dw,ÿ#***'''))iĈÜ»wï­[·˜LUÍ ohhÈf³Ùl¶ƒƒÃþüóÏ‚‚‚¦$ùÑGéééµ¶õŸ§ñ¼û²eÍÌ W®Ô¶¨«¿ã©AkýDmýçµßuBFÍ}ðÁ€M›¼7nŸïããÓÆ)x—^]ØÚw§µÚS]¯­‡ßh™D";÷H¿~«33Ÿ©´¢6Ç0™Ìk×®Éÿ”§ô"‘HöÏ!—½½ý‘#G¨ îܹCDee%µöÒ¥K2™L"‘4+¿z ÖlÿA$9xðàŒŒ ùª'NÈËò£ºÓ§OËw«ø¸“RQQ!‹©òƒ¨+**X,VAAD"áp8ÉÉÉ ¥QYYµ£ãšåË_“fhˆ¶dDêïxjî'-fDýû÷¥>}ú”Á`ÔÔÔ´¯E-6J¦ð»ÓZíŠ!#€vÃ]sÐ2r×®€wßåþë_û5áQ3'++Kþ§H$’Ï÷%—ŸŸß»woªLä# ‚ÐÑÑiVV@>³BmmíÍ›7(_Õ³gÏW··²²jËnå***ÂÃÃÝÜÜ8Μ9s¨…ݺusww?yòä•+W˜LæèÑ£4J™š¬_ï›úÇÙtÇ¢êïxÍÐÒOòòò©¹­¬¬$‰[ôªfßµ¨2"hU—.Ì#GBlm->üpÏ“'4ßÊ?mÚ´}ûöQg‘ ‚`³Ù7nÜh¶ —ËÍÍÍ¥ÊTÃá´»FùÌ ,«Ùª©amçææ–››»uëÖG]¼xQ¾ÜÏÏ/!!A øûû“$© Q2™ŒÐ¼ÉÛ{ؤIï.Zt¬ºZfcSÇk†–~ÂápΜ9C6“J¥"‘¨OŸ>ÊjÑ«š}wÔ\;2"P„ÅÒŠ ±´4ö÷ß_\\Ic$k×®-,,äóùééé………§NZ¿~}³m‚ƒƒ7lØ  ³²²æÏŸÏçóÙlv[vC=nH^P‘H$/WWWWüC"‘466:;;ÛÛÛgffQ^^N„§§gzzz\\\@@€‚F±Ùì³gÏVUUEDD´V#]6mò©®®ß²åºQõwŸÏ§N„7ÎÑÐаråJ+++SSSÿÖFJ¼Z&"::ºY¡-#=ˆ&c!^]èææÆb±ÊÊÊd¯<ñV(&&&Z[[ëé鹺ºþøã}ûö¥ö0mÚ4GGGªÜZ£Ž=jiiiffFÍQöjJyÏÛ->þº•ÕâÔÔVGÛk¢ ãˆdjïxjî'M“/ohh ãr¹†††òY^Û¢ÖÞçf’)üî´V»bGíFÊ^ù¹xUAÈÓs‡ÃŽ‹›g` Ì§ˆÄÇÇϘ1ý°)///ggçÕ«W«hÿêyÏ?þøÐÇſþºBOOCÝC’¤@ ðóó£;vRu?éXð? ´6árM‚O?.9ó`mmÝáh­ÚÚÚ´´´Ÿ~ú)00îXÞÖ–->¥¥ÕÛ·_|ý¦ð†4°Ÿ$%%‘- §;4€×@Fmeg×ýÌ™yy¥3f|ûâEÝáh§ .¸»»¯[·®W¯^tÇò¶,-»­\9yÿþK·oçÓ‹¶ÑÀ~2qâÄïCظq#Ý¡¼2"x¶¶'O†ˆ¿ÓŽ™Ä4··÷‹/ÂÂÂèD9fÍõÞ{öóæE ­\ZÖOè…ŒÞ •åç—@RŠ‘$¹oßL±X²xñqºch2"xc¶¶ÇŽÍÉÍ}ò}]]#Ýá€FëÖMÿ¿ÿ HJúëèÑ?莠Ȉ =úõãÄÇvçNÁÌ™ßÕÔàJ(2j”Ýòå“Ö®=uõjݱ4‡ŒÚ©ÎÙ³ rsK§Oß]VVMw8 Ñ.œàçç<{öá{÷žÑ ÀÿÀóˆà­ˆüüö1™:Á§=z°Û±ê)">>>J ZSPPššªæï~]]£·÷žòòš3gXZ«³êÖ$9räH.—Kw  ´ôjÐȈàm=þÂßÿÛššzàSkkó7}yJJÊöíÛU(vâÄ 5×X\\å嵋ÅÒMH533Tsí¯òõõ¥;P2õ÷jÐȈ@ Š‹+ýü¾­«kl_RGQQå‡îa0tNžü¼{w#ºÃÀ8"PKËn§N}nlÜuúôÝwï>¥;Ð\ï¼ÓíØ±¹ÕÕõ³fEŠD5t‡€Œ”ÄÌÌðìÙŽŽVžž»~ýõÝá€æ²¶6?qâ³¢¢ÊiÓv=~\Fw8ÐÙ!#¥Ñ×ïâå5äã;–Jw8 ¹ììº'%-54Ô›8q{JJÝá@§ÆøòË/鎴‡Ž9a‚£L&ûê«D‚¹ºÚÑh(=OÏÁׯçíÙó«­­…ƒÃ;tG2"P2’$]]íX,æ×_'Õ×7¾÷ž=I’tšHOéé9øÙ³ŠM›Î—–V݇ÉÄUkP7Ì5ªrâ„pÙ2ÁäÉN;vèé1é4WRÒ_K–Ä™™îßäèhEw8й #ºqãñ'Ÿ277:z4ÄÊÊ„îp@såå•Ì›w4'çùºuž3gºàº"¨ 2"P­ÂŠààÈ’’QQ!òè4WCƒxÓ¦ó‡]:Ôúë¯}ûôÁÈ"PdD r55õ¡¡1¿ÿžµ{÷G“&½Kw8 Ñ23 W®<‘‘ñ88ø½°°ÉztGZ3+€Êuéœ2e`QQå¦Mçõõõ†í…{¢ 5F~~ÃÙlýï¾K>uêgÚ»wwºƒm†kD >‡_]¿þìØ±}wìø—‰‰Ýá€F+*ªüê«Ä³gÿ:ÔzÕª)..½éŽ´2"P«;wžÎ™U]]·sgà¸q}é4]vöó­[/œ?kÈ^«Wó‘€Ò!#u«¨¨]¸ðØ¥K™Ë–Múüó÷utp¼FJJΦMçnÞ|Âç\¾|’AFôˆ‰I ?eg×ý›of Ô“îp ¸z5+"âüíÛùÇÛ|þùû&8ÒhdD@›ŒŒ'Ë—Çge-Xà¾`Á]]ݦ“Je?þx{ß¾ß22žŒe÷Ùgï뀉:àm #:Éd²ØØÔ MM þó_77º#‚ŽáÚµìo¿ýíÒ¥ûýûsBCÇóùƒ˜Lºƒ€ Ð/?¿|Õª„Ë—ïûú_±bRlº#‚Žáñã²ÈÈ+±±)zzº>>ÃfÏmmmNwPÐÁ #Mqî\ƦMçŸ?âú¾±1‹îˆ cxö¬":úãÇSËÊjÜÝûÏœé:vl_ÌØm„Œ4ˆX,‹Kûæ› 55 óæ }ŸÅÒ¥;(è%.üuôèµ””.×$0ÐeƌᖖÝèŽ 42"Ð8••µ;wþ|øðï––ÆŸ}6Þß„ž“î  Ã(*ªŒM9räZiiµ“ÏÇg˜—×ssCºã …Œ4T~~ùž=¿ ×MLôçÎ7s¦‹ÝAA‡QW×øÓOwNž¼qùò}Cçƒx{;¶/¦4€fF+.®úî»ËÑÑtéÂ43+èÞ½†îˆ4‹‹Ë’%KèŽB|}}Û²™X¬SZª_R¢_UÕEWW:dH!“‰ÿô U'Nœ ;P7dDÐTTÔ>|uÍšÏ 2çr¹t‡£¹RSSGŽÙIéH’9rdÛûC}=³²RI5´¦   55¿‰2"è0H’~~~t¢¹¨Ë&'#B%ŠŸ1c~:!<Ó:/dDÐy!#€Î t^Ȉ óBFÚ¦ªªjÙ²e<OOOÇãÍž=ûéÓ§Ô*’$ÓÓÓ•XÙD×®]]\\”»x{jîjîj¨±i'g³Ù|>?//O¹µ“$YZZÚÆ-_­±í/h2"Ð*R©tòäÉiii çÏŸg±X®®®õõõ*ªñÒ¥K"‘H$eee 4èÃ?‹Å*ª Þ”úûƒV’wò´´4oooº#P&dD U¢¢¢rrr’’’FŒaaa1pàÀ½{÷Þºu‹Édª¨FCCC6›Íf³y<^DDD~~¾ü º²àA :ØIDATx»©¿?¨AkýAuýDÞÉ8ð矨¢"Z #­j``Ðt!›Íf0ò?Åbqxx8Ç377(++£–“$ÇårŒŒV­Zuüøq‡cll¼téRù111M ÍPµ0™L™L¶eËSSS__ߦUœ:uÊÆÆ†Ífûùù•••)&99¹gÏž$Iaaa¤¨èíAddd¸»»›ššvíÚuÀ€ñññAL™2eûöíÔ©©©æææ/_¾l-ùçN•[ëM—+è~Š[ÔT2ÙÐР¸R©tË–-½{÷6009räµkׂh-0‚ Þyç33³;w*øP(õõõ‹-²´´´°°ØµkµPA«©¯ÒáÇÛÞLè\dA@ñ6&&&‰‰‰ ö  7oÞÜ»wïÔÔÔŒ?ÞËËK¾–Ïç—––&$$1iÒ$y9''G&“EGGçææ6-P;¤^^UUµbÅŠ#FÈd²Ý»wÛÙÙ¥¤¤dggóù|y}ûöMMM½wïÞ¨Q£<==ãêêzõêÕÚÚZ‚ JJJÚòùøøÈëÒzÞ(óæÍËËË+**ŠŒŒÔÓÓ«¯¯ŠŠrqq¡6X¸páܹsÄ ÿèååf å5Ê—+è~Š[¤à]¢ÊÅÅÅööö‰D¾ªÅ6îØ±ƒÇã%''?}ú4<<ÜÌ̬±±QA`Ó§O///L&³®®NÁ" ÃÃÃ{öìyõêÕŒ3†j¸‚Ë¿J­÷™L&øMèœð¿?tm9f2™×®]kúŠH$’ýs8eooäÈjƒ;wîQYYI­½té’L&“H$ÍÊÍs_Ý?…Á`$''Ëd²þýûÇÆÆRÛ<}ú”Á`ÔÔÔPÛGEEQË322‚°´´l-˜'NÈkAFô*ÍìÍVUTTˆÅbªüàÁ꣬¨¨`±X‰„Ãá$''+ˆ¡‘‚î÷¦-’ýo''IrðàÁMko±ýúõ‹ŒŒ¤J¥R‘H$•JvóæMy0%%% Þ¡PhccsèÐ!jí­[·¨—(عü«¤2"€N wÍVáp8YYYò?E"‘|b1¹üüüÞ½{Seª ahhH„ŽŽN³²òAçÅÅÅëׯÿðë««óòò©é¹¬¬¬$‰¼ yÕA·LÏž=Ûó@êïÍTTT„‡‡»¹¹q8œ9sæP »uëæîî~òäÉ+W®0™ÌÑ£G+ˆ¡t¿öµHÞÉkkkoÞ¼9pàÀ×¶ñÑ£GT'‚š¤Ž$Iq¹Ü¦Á(~C ûôéC•å;ÇW CFZeÚ´iûöí£Î4Áf³oܸÑl.—›››K•©‡ÃiwòAçÝ»w_ºtiYYÙÇ9Ι3g¨³Ô rùq[NNUxøð!Aæææ­ó¦ßð*õ÷‡fÜÜÜrss·nÝúèÑ£‹/Ê—ûùù%$$’$Ä “Ɉ7Lt¿ö‘wr‹õêÚÛÈápšN1RQQA]k-0j”œâ…ËåÊÝììì×¶_%P ¿ UÖ®][XXÈçóÓÓÓ O:µ~ýúfÛoذA(feeÍŸ?ŸÏç³Ùì¶ì<&&†:È“ša±X$I–——…‡‡§§§gggÏ™3gܸqòm6nÜ( 333CCCù|þÂ… ÛŒH$zƒwþ¡þþP]]]ñ‰DÒØØèììlooŸ™™DDyy9Ažžžéééqqq b`³ÙgÏž­ªªŠˆˆhZukýZ® û©B‹müøã¿üòËßÿ½¨¨è›o¾ár¹/_¾l{`Š?”™3g~õÕW×®]{øð¡|Z5·´ŠÚïÓh'¢ ãFd2Ù“'OLLLôõõù|>u‚¹é¸‘†††•+WZYY™ššúûû·6$ãÕ2AÑÑÑÍ Í`XXXŒ3¦¸¸8,,ŒËåzxxȇ­±yóf;;;cccooïçÏŸ·%777‹UVVöÚ¶cÑ«ÔÜš …‰‰‰ÖÖÖzzz®®®?þø£‡‡Gß¾}©ýL›6ÍÑÑ‘*·ÃÑ£G---ÍĮ̀¹ì¨åMûC‹ý¤¡¡¡µî§¸E­½ÏŠÇMµØÆ†††µk×öìÙS__ßÙÙ™³¤ °fÃ¥(õõõ‹/¦æš;zô¨ü%¯mµbGÐi‘²W~Å4I’ÀÏÏî@Ú$I¡P8lØ0íß××— ˆ'N¨hÿ¥£÷///ggçÕ«WÓü->>~ÆŒøMè„p×€ZÕÖÖ¦¥¥ýôÓOtÇò·¤¤$²%ááát‡ røÁíN?A.\˜5kÖºuëzõêEw,›8q":'tZȈÔÊÛÛÛÛÛ›î(ào¸k:/dDÐy!#€Î t^Ȉ óÂZ¡Ã I’î:ŸÎó„VºC-„ßD€N³oC‡!è¡àñxt‡ &è ¸FÆ@ç…Œ:/dDÐyý–¾u1ÁèIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_func_0x63.html0000644000175000017500000002411412234777147026034 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - c -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Button__coll__graph.png0000644000175000017500000004655112234777146032644 0ustar00murraycmurrayc00000000000000‰PNG  IHDR1Ð¥¦ubKGDÿÿÿ ½§“ IDATxœìÝy\õÿðÏì.rã²Êî‚Êáhv™hRú³PC¼@ üzä7ÓüjåQPZ’–}µ¾™¡©xq‰G¥f¥¤&šH ‡ È}ȵÇüþ˜Z×…]„Yx=þñÙaö3ï9Ü×α3MÓ€xlð7dp2 ¸™\L®°]@ ‚‚‚âââØ®‚CºÉ5ÒÈ$à¨áÇ/[¶Œí*ØwñâÅ/¿ü’í* ™%•J§OŸÎvœÐ}2 ç“€+IÀÈ$à dp2 ¸™Æ­ººúÝwßuvv655uvvž?~AAó'Š¢RRRär9EQ¥¥¥Ì¦ÑyÔ'm…L#¦T*'L˜péÒ¥¸¸¸üüüï¿ÿÞÌÌlĈªqø|~TT”µµµaJ2ðäºü> ŒØîÝ»³³³³²²,-- ![·nˆˆ~¸Q5k֬Θ:EQ%%%ööö;irÝö“Àˆíß¿ñâÅL ©…B>Ÿ¯>Dý`ÚáÇûöí+ ïß¿Ïüuß¾} Õøªvrr²……Eß¾}###)Š"„888¨Ž &&&º¸¸ìÚµKýPáñãÇ¥R©H$Ú²e !D&“…††:::J$’ÈÈH33³”””Î]FF™FìÏ?ÿ|â‰'Úô–;v;vìüùósçÎ%„DEE9R½Ñ¢™3g¾ð 9997n|ã7ŠŠŠ!êûIï¿ÿþ^}õUõwmݺõÊ•+‘‘‘Ë–-kllܰaÃñãÇOžsçνyó¦ÆáABˆ‹‹KówI$B÷÷‡m^^ž««+ÓöððÐsÒÝ2 ŒX@@À¶mÛ óR(^¾|Y÷[²²²˜FFFEQÎÎÎ-ŽÆ<"??_5dܸqwî܉urrzñÅ›‡Ÿ*xÔ©vÝNNN¹¹¹L;;;[w©Ý2 ŒXxxxaa¡¿¿JJJaaááÇ׬Y£û-+W®¼qãFjjê¢E‹‚‚‚¬­­÷íÛÇ䄪! =Z]]¡zãСCW®\éââòÌ3ÏÐ4mffF©¨¨hSÁ!!!k×®½råJzzzhh(iZÝ2 Œ˜££ãï¿ÿ.‰^~ùeww÷ï¾û.66V÷[–.]:~üx___77·o¾ù†ò¯ýëÂ… êÿýïaaa®®®êç‡"##þùç~ýú­X±"**ÊÎÎÎ××wÈ!åååú6f̘±cǾòÊ+¯¿þ:!ÄÄĤ3ÞUQÝäÙ…`\‚‚‚!­ŒQKKKfÌÝÔÝ “ '::úòåËb±ØÝÝýÁƒ;vì`»"nÁï“ ÇÛÛû—_~a» îÂ~p2 ¸™\LЪ:¿±õ‘ ãàà¨üüü˜˜vkx-±˜XDY(X¬áâÅ‹,NÝÀIÀQIII3fÌ`±»Ï½Oî]}¶¤+ÿt—Sp€–ÝØ?ic¾ƒ§Åä¨l×Ò]à|@˲~,'„”¤×Õ5±]KwLhAÕÆÒ¿ê!<>•u¢ wY…ÇLhAöOå|Š¢TзŽ#“ ™Ђ[ÇË2šBhRy§¡<«žíŠºd€¦Ò¿êª þ2‰gBeŸlÛ³û }Iš²OVðL>þU)£3¿/#¸H¹ó!“A+É­Ë•²G"¨®DV|ý[%uÈ$€GýY[_&ÓÈPÙ§p¥C§C&<"ûd9O@i TÊé[?–+8~×¹I)etÖ©r¥¼…ìiªUÜK®1|IÝ 2 à¡ü¤jy²Å?ñøTÖ \}×¹I圮ÐvP¥œ¾}¦RÑ„Ãw÷`x(ïB•¬þá~Ò…ÏòN¶³`¡"fcjÃg£´nϪxÈydOõ—¿¬Èµëoá:Ö–­zº»®@&W “€+IÀÈ$à dp~Ÿ UMA£¹ÈD`ޝï‚L®@øW “€+IÀÈ$à dtŠ¢JKKõ3%%Ec 2 ¸™ Õ¡€´¼ UlWÑ “´ª)h”©= ¢¨C‡I¥RkkëU«VkþÆV—!äé§Ÿ¾víÚ7†>~üøuëÖ¹¹¹%%%eddŒ3fòäɪú“““5j@&hÕ<“Μ9CÓ´B¡Ðh7ÿxe 4(22’i+•ÊŠŠ ¥RIkÏ¤ØØXÕ@¦íéé¹ÿ~f`AAŸÏðà3BBB‚ª€’’’§UYYiff–ŸŸ¯P(Äbqbb¢¶™‰D›6mbÚeeeÍߨêP ¤iúÊ•+„{{û={ö0CRSS !UUU´–L±;€6°²²"„ðx<¶6·oß0`Ó¦(J(R¥c|vnnnHHEQEI$…B‘ŸŸÏŒ ‘HÔ hqZ={ö;vl||üo¿ý&F¥mÒÛ¶m[¿~}Ÿ>}æÎ{óæM‘HÔâ[]îîîLcàÀ„ÒÒR777fÓPÕß2  ‰ÅâÜÜ\ÕËÊÊJf¯‚Âì+h|@«¾3m±X|äÈõ½Ÿþýû3#hÄ›¶iMŸ>=...::zæÌ™:qܸqwî܉urrzñÅ ô|£†¬¬,¦‘‘‘AQT¯^½rrr˜!LC,k{/2  Í›7oõêÕçÏŸ/**úâ‹/¤Ri}}=!D(=z´ºº:""Bw³gÏ KIIÉÊÊZ°`ÁèÑ£Û:­I“&¥¤¤:t(88XÇ„†ºråJ—gžy†¦i333=ߨaåÊ•7nÜHMM]´hQPPÐþóŸO>ù$99933sÉ’%þþþB¡PÛ{úOÚjùòå!!!¥¥¥ÞÞÞßÿ=s¼ëÿûß{ï½·råʯ¾újûöí:zXµjU}}ý”)S*++GŽßÖiÙØØ¼ôÒKÙÙÙO<ñ„Ž EFF¾ýöÛÛ·o—H$QQQvvv„}Þ¨aéÒ¥ãǯ««›0a–-[,--kkk§L™R__ÿòË/oÞ¼YÇ{ñ¬ ­ºÌó“&Ož}ú¶Ô©ñFÃÀ±;à »®@&W “€+IÀÈ$­ðü$C&h¥ñü$èlÈ$à dp2 ¸™\L®@&Wà¬Zu™ç' dp¸™\L®@&W “€+IÀÈ$­ðü$C&h…ç'2 ¸™\ñȽ….^¼¸qãF«çããóÎ;ï}z‡t†DQÛ%hÂù$à dp2 ¸™\L®hg&UWW¿ûî»ÎÎΦ¦¦ÎÎÎóçÏ/((`þDQTJJJÇUH¨–tà$³7Š¢JKKÛÔg‡/"î0ð†¡ÑáãOB}377÷ññÑÝ¡žS”Ëå-n'í(O£“ŽêÙ ¼mÌš5KcHçý§ku-tê'XÓžLR*•&L¸téó»„ï¿ÿÞÌÌlĈ^!¤â„3gÎ0í'Ÿ|²3¦ÃÀF'Qmc™™™C‡:uª\.Ì>ù|~TT”µµu‡Th˜ž;–á·ƒþñÇÔ¹}Ö‚j»Â'˜n-ü>©U»wïÎÎÎÎÊʲ´´$„888lݺ5""B hOo­ …ª¶•••úK (ª¤¤ÄÞÞÞHû7$oDµ …ˆˆˆíÛ·çææzxx´£+ÕÊmþµ½£t^ÏËðÛFPPÐÛo¿ýûï¿wRÿêôY †üì2êO•öì'íß¿ñâÅ̶¥" ù|¾ê¥\. svv¶··.++c†SuèÐ!©Tjmm½jÕªƒŠÅb›ÐÐPÕûöíSohCQTbb¢‹‹ËÒ¥KÇŽ+‰ÌÍͽ½½cbbT#?~\*•ŠD¢-[¶0“““}||,,,úöí©êíêÕ«Í;a~PæààPZZÚâŒÃ‡÷íÛW(Þ¿_5œ¦éõë×÷ë×O$©‚ú,¨ú×6r«KŒ;8²afkYÛ²Õ¶1¨0• Ý«²Õ‡üsØMÇìë¹­ÆÅÅõîÝÛÎÎ¾R½W5‰Ã‡÷ë×O(NŸ>½ùöÆ"ÃoK—.½ÿþ¡C‡4*Q?Ȧ¾ètLBÇÿMæ#h×®]LWJ¥rýúõnnn–––Ç¿pá‚jºµµµ•ÿP(ºçW½[…é³áZMtt´ÆÙÚÚ;vLÛ_ !ÉÉÉëÖ­sssKJJÊÈÈ3fÌäÉ“Uõ÷÷/--enj2~üxU;;;›¦é¨¨¨œœõ†FÏê/GŒqîÜ9—… æææEFFššš6662#øùùÇÇÇ ‚††š¦]]]W¬XQXXÏãñŠŠŠ˜n  ­“’’š¦uŒðôÓO_»víÆÇ?~¼ªÔÍ›7»»»_¼x1++Ëßß?00°ùŒ¨ú×1²î%¦C`` ªŸÇ¡g?Þ04¶õ!k9,,¬Åe«mc`þZ]]½|ùòçž{ŽÖ¹vôÙxTm³¯ç¶:eÊ”òòòèèhÕhª©B˜””tóæÍ‘#GNš4I÷úÒóÿ{«!ÑÑѺÇaeÛˆïÓ§O}}=­¶m4_)­NBÇÚg>‚êê꘮¾üòKggçÄÄÄ‚‚‚°°0;;;™LF«ÝS”ÁT¢c~Õ»ÕQ˜>Þã¯;kO& ‚ .<ìâô?ëÞÃÃcÏž=Ì©©©„ªª*æ¯gΜ¡išù¦ ÞÖø|i¡Öf™KÓtee¥\.gfdd¨og ªþ™"‘hÓ¦MÌÈÌ©‚ääd0 #0sAÓô•+W!åååLŸžžžû÷ïgþTPPÀçóD[&é˜„ŽµÏ|©º4h³_NÓ´R©¬¨¨P*•tKÛ*MÓ:æW½[…é³áéÆÁLjϱ;±Xœ™ù𦄪ëgTòòòÜÜܘ6ÓPÝ¥ÑÊÊŠÂãñ4ÚíàââB©¬¬ óõõ‹Å ,PA"‘hô¿mÛ¶õë×÷éÓgîܹ7oÞT:ÐÑI«#¸»»3B ™—¹¹¹!!!Ìe6‰D¡Pè¸U¥Ž‘;p‰u*.lÌ µ|÷îÝ—m‹ƒê\tqqñš5k¦NZ[[«{U¶ºñè3ûzn«R©TÇ’Qu>`ÀõÎYÇÖ¶±iÓ¦Ï?ÿœÙÅÔMÇ$t¬}æ#HåöíÛÌ’'„P% uÜPNÇüªw«£0ý7<#Òž¶€€€mÛ¶1YM …—/_ÖG*•æää0m¦!‹£Î–1ëÆ××7''gÆ ·oß>uê”úÍ7ˆqãÆÝ¹s'66ÖÉÉéÅ_TýÇÐÑI«#dee1ŒŒ Š¢œ™—b±øÈ‘#Lø3_šú÷ï¯m^Ú427xÃèÓ§Onn®êå­[·!ýúõ#ÍÖ2MÓ-.Û7æ\´P(ttt -++»uë–îµÓêÆ£Ïìë¹­ê¾ifvv¶úÒèŒÿtíÃÖ‡ÆSO=5uêÔ÷ß_} MÓ¤-­cíkD£X,Vß&U§ŽZ¤c~õL\ý7<#ÒžL /,,ô÷÷OII),,<|øðš5k4Æ™3gÎ'Ÿ|’œœœ™™¹dÉ=¯9Ù·o³RUVÉd²aÆyxx¤§§Ïž=›üsô¬EC‡]¹r¥‹‹Ë3ÏûìÆF½îkŒ3f̘1ƒ­©[ðmz™¹ô6íÛˬOo³>b3w»NgKcbó7±U´Û#÷qÈÏÏ7Ìc9bÏžÌ?ÿ, v6ÌíZ:‹³³³Ïcvrñâż¼¼©‡ã®]+ûî»Ì'ž°›7ÏÈn€Ûnÿ~õç[v:¥¨(Ë{(Ë{(ËM÷M•&t#B(B(š()BHïó Ťë‰ê#FŒ`n6ÏTwþÝ‹/®ÏÌ,‰,“’­¬LÙ.Ø÷úëßýðÃu33“ÔÔµ=Ø.Ê¿X}þÓ»µE2ZIBxŠÐD©Ðüøâñ)éHë—¾pãñ‘HF©ûžOR*éÛ·Ë!ÕÕ ›6u‘Û¼Ã㨮®ÿé§4BHS“üĉël—pzÚJÑDåß!¤”Ó-’€ç8Ärìg®$ãÕ}3éÞ½JæT¶\®Ø±#1'§„튀e'NÜP*iBEQññ)l—à÷à ["¡µŸÔä (ûæã·¸ó{tßµ. û®¼ììûª6G­^}„Åb€ bcS˜«] å¹s·Ê˰]<Â}‚ȶŸ)ÕÒ‡O@õìc:~«»À¬û~¦u Ýwýee ?ø\&SüüóÍÄD\Þ}Ý¿_“””¥P;ôý÷×X¬š£xd@€=­ÔÎPæv‚ [=zXñÙ¨ :R÷ͤììûê‡ø|êƒâåòfÛ;tÇÿÉã=Ü hšŽ‹Kf±ÐPy»áçå9I_å›ÚðyjÑCñ©V|ÿý-LØ«:L÷ͤ¿þ*–ɪ— }ûvéI,–,ŠMV*î$)•ôåËwòòÊY, UwY‘x³¦ iÂV—7º)ÿùKñˆÀŒzå)®›í"ºo&ݺU¤1D©¤#"ŽWVÖ±R°èβ7 Ô3‰ÂçóŽ¿ÊVI@©+‘‹¸t³,³îÿÖ÷›²o ä9ëÞOZ9=eÅPEQ<ê¥/ÜDîælW ¦›fÒƒ-žÁ®¯oúê«Ó†¯ØuäÈ@óÿ‚B¡ˆÅá;6¥*¹}¦rØRÉ´èA®cmU¿}îm s!øÿ­ë'fÍf‰ÐѺéof¯_Ï7nc‹âóygÏ®pss4pIÀ¢#"nß.mñOgά0 ·ëFÓE‹®\8šã2ªç€Év†¯ :U7ÝOÊÉ)Q?¡­N©¤×®=nàz€Eéé÷´’‰ ÿر? \¨ô°ä·H„Ñ}H]R7ͤììû|þßóÎãQff&Ì F--{<ûl_©TôàA#«‚á;v•h¹3šL¦ˆ‹Ãg V¶í€ ~‡ÔUµp_ðî +ë>sÑ££õàÁÎ.Üš;wäo¼èâ‚o^ÝŽL¦˜8ñ ÕËôôB‰Dhcóð´ùýû5ŽŽ8iÑYî%×$o¹'~ÆúÙ%b¶köuÓóI?þx½gO ooqÏž„‰¿zâ çµk§²]°O,^¶}ûœ€€¡lÒõUä4¤l»wûl¥äYëg—H<-Ø®Ø×M÷“&L¢þÒÛ[’–VÀV1ÝMÕÆ”m÷r~©pzÒjÒw[²]pE7Í$ žžâÇ/Ó4Ý[À®+; ÿÜUdéØcÌÚ~n~¶xʨC&Bˆ§§¤¦¦áîÝò>}p>  sY9õ¾L:hª=ÏqšI„2hŸÏ»yó2  ³õŸˆÿe ®§$„ ‹}ûÚß¼‰SJlB&ýÍËK’šŠLè 4É>UQS€ßùAÛ “þæå%Æ¥w"ïBõáô_?ÈÍ»PÍv-`dp>éožžâ‚‚ʪª:æKЗj’·”ܬsý?Û1Ÿöö5c»"02Ȥ¿y{Khš¾y³ÐÇÇíZŒOÑŸµl¾W|­Vòœõä=¼ðÝÚ™ô·^½zÚÛ[¥¥ “Úáâó•rÚïK7—Q=Ù®Œ2é¡AƒpJ  ü¾t3™P8C [ÐC¸Ã@»YØ# `#zÈÓSœ™YÌÜ/ZÔÖ‡J°N.—SUZÚò#²´Y¾|¹……Eyyy'UÚ “òô”45ɳ²î³])ô_‡Kú§\2¦+¼ù|~TT”µuÛž6²yóæ³gÏŠD¢Nª ´A&=äáÑËÔT€ÃwÍÝ=W•ò×…Ïò\Fõ´u3oý œAQÔ¬Y³LMMÛô®††WW×N*‰Ñ޽·î™ô@Àëß¿7î0 .ççŠøé?½“ã8Øræ1¯çW¹XØ›¨@QÔ¡C‡¤R©µµõªU«<(‹mllBCCutKQÔñãÇ¥R©H$Ú²e‹j êcZÕÖÝ?MÓëׯïׯŸH$ *++S½=11ÑÅÅe×®]LWJ¥rýúõnnn–––Ç¿pႎÚ!¥¥¥r¹<,,ÌÙÙÙÞÞ>88X[ÿ:*¼zõêØ±cE"‘¹¹¹··wLLŒÆ$Ú±Rº2Ô¼ýöéÓ·±]°ÉÉéí£Gÿd» N7*N,ÉÚñÔåïßȼŸú@Ûh„ÿÒÒÒ¸¸8BÈøñãUíììlïòóó+..Ž ÌÀ’’ÕL[wÿ›7ovww¿xñbVV–¿¿`` êí#FŒ8wî\]]ÓÕ—_~éì윘˜XPPfgg'“Ét”ÇL}ݺunnnIIIcÿšX IDATÆŒ™ó'õNnß¾=`À¦MQ”P(ÔçžyyynnÿŽži´Ø¿Ž +++ÃÂÂ|}}Åbñ‚ Zb7‡Lz„——˜¢(Ü ÀZŒš¦‰Úç~«Äbñ‘#G˜¯ØÌÞOÿþý™?i¤X,ÎÍÍU½¬¬¬dvet“J¥999L›iˆÅâûׯ××7''gÆ ·oß>uê”>oéÎI°±1—JmoÞ¼Çv!†#«S¦E—pá‡GB¡ðèÑ£ÕÕÕz¾eöìÙaaa)))YYY ,=z´¶1çÍ›·zõêóçÏ}ñÅR©´¾¾¾ÕþçÌ™óÉ'Ÿ$''gff.Y²Äßß_(ê;?„Bd2Ù°aÃ<<<ÒÓÓgÏžMQýì©¢¢¢M]uÈ$Mžžb\zÝ„RF§º=)5yKAù­¶Ë!ÿûßÿÂÂÂ\]]Ÿþy=ß²jÕ*ÿ)S¦<ùä“yyyñññÚÆ\¾|yHHHHHˆ››[llì÷ßÏdÓmÅŠS§N2eŠ££ãwß}§ïÌüã›o¾Ù²e‹X,~óÍ7çÎëçç7iÒ$Bˆ¯¯ï!Cð³\ ³§ *ÿýïÉ„„+çÏ¿Ïv!À±xÙöís†²]HçR4Ñ©î_ßW,¯WzÍtxbN/SÜý؇ý$Mžž’Û·K<Àó1¡k¢•ô_‡Kc¦¦]þæÞ€Iv¯~ï=l‰¤“éäÉ“TKÂÂÂ:crmÅñòº'|3Òäé)V*é¿þ*|úé¾l×ÐñêËä¿oÈwióÌ›b[×Î}æÞ¸qã¸|$†ãåuOÈ$M.."³´´{È$è’,Lfõ²t4i}TƒÃ±;ME „Ë +C g!“Zàé‰)AW hR²]@Û “Zàå%NO/TràçíSW*;q÷ÀøÔÆj9Ûµ´Î'µÀËKRW×”›[âææÈv-m#oP¦¸mO1Ï„zr~oŸíŠÚ™Ô‚z ¼´´{È$0"Š&eê’ë{‹)>yî-Iÿ‰v<“ÖïçÀ)Ȥ˜™™¸º:Þ¼YÐå8 ]FEvÃé÷rj ›<§Û×ÛLˆÿÚ`”°á¶ÌËKŒËÀˆX9õpi3dV/Ë^¸¦Œ®qh™——$5wb£abÁó •"ÀØ!“Zæé)..®*-­e»€n™Ô2oo)!$=»JÀ-5÷š²NàNÒÐe!“Zfooåèh‡ûwÔ—Ë~ß35íÊ·…J~<]®qÐÊËK‚‡ûÔ—ËR¾.Ì<^féh2zmß~cl)|™„. ™¤•§§ä×_o²]tkMµŠ«ßÝŒ)˜ñG.wÆOŽ ËÃ×-­¼¼Ä·n76âÖ,Àšü߫Ӗ tŒ4pª= º<ì'iåå%‘Ë•™™EƒKÙ®º©~cm{?eea+¼¡»À~’V®®ææ=ðËY`Å#$èVIZñù¼z§¥á20Yq~ý]oÄ{Î&Ûñ¸ÂàoÈ$]¬¬Lûô±KK»7nÜ`¶k®ÃZÚcè¼Þ^3f8xðdR+<=ŸÌ:–£·¥£·%ÛUp¾¦µ‚¹Ìí*ºö“bbb ?Ñv«¬,ÏË+߳瀹¹ïSNŸ>Ýð½xñb^^žá§ûø.^¼ØÐùøý(JzÐõ|Kýãw¥VÖ2@Ç¢ ¡3EÓ]ϬGqcã]š6âß±r9{PPP\\œá§û˜LM]d²R¥²îñ»êib?Ö1$¾à«ÇïJøÑtìdRtt4¾ÓFLLÌŒ3ØÊ$BHll¬á'Ýݰ¸–:Î'W “€+IÀÈ$à dp2 ¸‚»™T]]ýî»ï:;;›šš:;;ÏŸ?¿ àï{üP•’’ÒÓêð98E.3ðºÖ`ø!—Ë)Š*--5ðt¸£™¤T*'L˜péÒ¥¸¸¸üüüï¿ÿÞÌÌlĈl—ÌðëúÌ™3jž|òÉNš6|>?**ÊÚϧÐÄÑûåìÞ½;;;;++ËÒÒ’âàà°uëÖˆˆ€£냢¨’’{{{=‡w†_×VVVB¡°“:× ¾rUmŠ¢fÍše˜Œ G÷“öïß¿xñbæCJE(òù|ÕK¹\æììloo\VVÆ §(êСCR©ÔÚÚzÕªU‹Å666¡¡¡ªöíÛ§ÞhîêÕ«cÇŽ‰DæææÞÞÞÌ=ú^yå•72#$%%ÙÛÛ×××k«Aud†i3wTrppÐ8b£>œ¦éõë×÷ë×O$é?GFÍð뺶¶¶ò …Bwÿ‰‰‰...»víÒ=­7õ•«±¨¶Š¢Ž?.•JE"Ñ–-[!2™,44ÔÑÑQ"‘DFFš™™á0/t#´ÁB¢££uckk{ìØ1=$''¯[·ÎÍÍ-)))##c̘1“'OVýÕßß¿´´”¹ÙÚøñãUíììl𦣢¢rrrÔL‡ê“0`ÀÂ… sss‹ŠŠ"##MMMwïÞíããÃŒðÖ[o½ñÆ:j())Ñhk TMQ5|óæÍîîî/^ÌÊÊò÷÷ ÔsŽtˆŽŽfe-Ó4¨š ¿®Õ1kAGÿ#FŒ8wî\]]îiµ¸ÁÐZ¶úÑ­ÂÏϯ¸¸8>>^ 444DDDxxx\¾|9--Í××—ÏçklœÍ±¸–:G3I \¸pAý-ŒŠŠ úŸÏ)={ö0#¤¦¦Bªªª˜¿ž9s†¦iæ+°z[Ûÿíæª¬¬”ËåL;##ƒù©¬¬433ËÏÏW(b±811QG íÈ$OOÏýû÷3 ø|þƒÚ7G*ÜÏ$Ö×5MÓ:úU½QÇ´ZÜ`hý2)!!AÕUII‰‡‡ÇÞ½{™Ñ®_¿Îñµ б8zìN,gf>|X@EE…êB,•¼¼<777¦Í4òóó™—VVV„§ÑÖ_eeeXX˜¯¯¯X,^°`3°gÏžcÇŽÿí·ßÁ¨Q£tÔй¹¹!!!ÌÅ`‰D¡PtàqëëZwÿ...ªÑtL«Å FO‰D½«¼¼‰¦é»wïÛÚÚZXXøûû3ß^ÕÏ1455­X±B"‘ˆD¢™3gj;UÓ¼M‰ŠŠÒh¨KNN>vìXß¾}MMMGŒñã?úùù 8é' ÀËË‹ik«aïÞ½½zõ²³³c®õb†ûúúš™™•••i¦ÞÔÔ´råJ©Tjeeåç秺~¡Õ9Òûç“hƒ¯ëæ ­Ýý«ÚÚ6õ•®±¨Î'iœYlhhX´h‘­­m¿~ý˜k(®]»¦{â|tx¦_›MžÛ…èÏô3jiiiƒ.))±³³Ó1žé]GÝqS]]Ý¥K—~úé§¶k.ËËËkùòå555EEEááácÆŒÑH] 2© Nœ81vìØ?ü°OŸ>l×]VttôåË—Åb±»»ûƒvìØÁvE†cÄ·ê1¼iÓ¦M›6í* ‹óööþå—_Ø®€ØO®@&W “€+I¬°°’í uÙ J®œàv®qØ´iSWýÙJAUU•™TZccÉÇ>Îý÷_RRó+%¡©¾UÃê<’Å-?¦Ä±»–: ™hø‰Œ“Óƒü|›7¬¬šœ«E¢vë‘J¥l-pV¦«ƒ…\è] l”dÙþÆv-‰Åµ бX¸C—·mÛ¯k×§(Ц‰››Ch¨ßĉCù|&eÙ_ ¥¿oÈS4Bè©Ùõ7g»"ЄLêxõõMO?½ºªª¦iŠ¢(Š…æ‹™7o”…E¶«ëŽj‹šÎ†ß.¼ZK”„bջǫ?x³]´€¿zõj¶kèjLLø„ßÏR*iBM“úzÙÅ‹Y;wžkj’{zŠÍÌLØ®±ùëpé©·³k ›h!„ðL(WìœGذ]´ûI¢®ŽÙUª×.ð~HˆÏâÅcz÷îÉJmÝG]©,ñ£;—ªiBˆÚf>ákÉ0kÖÊíp’£SXXôø÷¿_øÃåreCƒl÷îóǯý裄û÷kX)¯;¸}¶2.èfAr M?H žÓSVìÕº “:Ë¿ÿ=ªGÍLb(J™L~þ|–©iË#Àãh¬Vüü^îéМÆýèxâ<²'O€Gäp2©³ôìi±hÑèæ»J„€?x°4!aIÏž†/¬k+¾þàð«é·ÏVòÈîƒV’>£pÈ€»Ièõ×_ìÑCó`РÞ11‹mlÌX©ªkk¬–7Õ)´n×4åü<®nà.dR'²±1[°ààáBø½{Û|ôÑR'qy¾çŒ/ésÖÕìE‡XšõÄóY¸ ™Ô¹,x¹4œ"ðì-•Ú¾öÚÎ?ÿ¼Ëna]˜™P0î+÷ᡞ€âñ&Gõ#d±0h2©s …sæŒ41ᛘðûõs8xpá¡C‹ž{Î50pëùó·Ø®®ë¢HÏ>f¦B…£‰êŠ¥‚îó"N&p2©Ó-\8†¢(Q|üìì¬zôDFÎ5ªÿœ9‘çÏg²]]×T[Ôtæƒ\épëi‡õyQH(Šb-îa#5e»4Ð÷qèt––¦={š‡‡Orpøûwš|>ï•Wž¸q#ÿË/O?ù¤KŸ>öìVØÅÐJúô;94Mùmr3±ä»¾dkéhRTÝßß^êƒ 8 ÷q`L¦X´hïÏ?ßüöÛ¹/½äÅv9]ÇŸ‘Eî, øn€ýÀ‡—ÚWæ6(´È÷]à4»c‰ ÿ›oæ¼òÊÿû»Ÿ~Je»œ.¢øZí•…Ï.–¨!DØÏ À}È$6ñù¼ÿý/$ àÉ×_ß}êbéq5VËYu[:Òfpˆ#Ûµ@{ “XÆçó¾üòÕÉ“ŸZ°`÷É“7Ø.ǸUç5š˜óF}àBpó ã„óIœ P(CC%$\ùúëÙ& a»#F+ …/ZF ÿ}9ÏçmÜøêÔ©O¿ñÆž„„+l—cÄHF ÷Yá Ú¸q¦¹¹ÉÒ¥û•Jå´iϰ]€¡!“8„¢¨ˆˆiÅ{ûíƒ4MKн “¸…¢¨µk§ðxÔ²e•JzúôgÙ®ÀpIœCQÔÇOæñ¨wÞ9HÓôŒÃØ®ˆ»du s>®²è2I\DQÔš5“ÍÍMÞyçP}½lîÜ‘lWÄE´’œÍéÙÇläJg¶k€ŽL⮕+_áñx|OÓô¼yϳ]ç\ù¶°øÚŸw¥l™ÄiË—çñ¨°°Ã4M¿öÚ(¶Ëá{É5F•ÚºáŽA]~ÍÁuï¾;îw^OˆŒüíZ¸¢¡J~ö£Û.¾=½g´ÿBË—/·°°(//ïÀÂô!—Ë)Š*--5ðtŒö“Œ@hè833“>:BÓô믿Àv9l£Iâ‡w(Šz᣾suÃæÍ›E"QÇU¦>Ÿemmmàéd’qX¼øÿ(Šúè£#õõ²¥KDz]›nÆ•äý^ýÊ7¦6üÇé§¡¡ÁÕÕµ£ªjEQ%%%öööêmŠ¢fÍšÕ©Ó0^8vg4Þ|sLxxÀúõ?|ùåOlצºRÙ9:=e¥BQÔ¡C‡¤R©µµõªU«<(‹mllBCCµuBQ!ÄÁÁ¡´´T.—‡……9;;ÛÛÛ—••©ÆILLtqqÙµk—îI\½zuìØ±"‘ÈÜÜÜÛÛ;&&FcêmæOªÆñãÇ¥R©H$Ú²e !D&“…††:::J$’ÈÈH33³”””N[–ÜCƒQÙ¾ýŒ“ÓÛÿýïI¶ áBˆ¿¿iii\\!düøñªvvv¶Žw•””Ð4½nÝ:77·¤¤¤ŒŒŒ1cÆLž?99¹S—§ “ŒÏž=Äâe_|q‚íB¸‚ræÌ𦠅F[Ǻ*<<<öìÙà LMM%„TUU1#ÄÆÆê3‰ÊÊJ¹\ÎŒ™‘‘¡9­fRBB‚ª«’’½{÷2£]¿~]÷,t=8Ÿd|fÏÁãQ+WÆ64È?øÀŸír8ÁÊÊŠÂãñ4ÚúÈËËssscÚL#??ßÓÓ“âââ¢Ï$*++ׯ_áÂ…¬¬¬þýû·©r‰D¢ÞU^^žê,—‡‡G›ºèp>É(ÍšåóÙgA_ýëÚµÇÙ®ÅèI¥Òœœ¦Í4Äb1óRÏ`óõõÍÉÉÙ°aÃíÛ·O:Õ¦©3§šTœœœrss™vvvv›ºè°Ÿd¬BB|x<ê½÷bhš`»#6gΜO>ùdàÀ={ö\²d‰¿¿¿P(lS2™lذaéééŸ~ú)!¤¼¼œ¹Ü®¢¢‚ih´µ Y»v­§§§¹¹9s…FhtmÈ$#öê«ÃÍÌz,]º_©¤?úhÛåt–º2™…Içõ¿bÅŠÚÚÚ)S¦Ô×׿üòË›7onkß|óÍÒ¥K?øàƒ§Ÿ~:,,¬ªªjÒ¤Iééé¾¾¾C† )((‰Dêm]………•••;V(nذáÔ©S&&8ï\ƒgŸ½£Gÿ\²d_pððuë»Þwêâkµ?,Ìš¸³¿ƒ§ÛµZZZÚàÁƒKJJìììØ®À@p>ÉèMšôä–-³HZ¹2®‹}Ãh¨”ÿ²2×y„M»éäÉ“TKÂÂÂ:¶ÔŽâååµ|ùòššš¢¢¢ððð1cÆ  [Á±»® àIŠ¢þóŸ}J%ýÙgA<^—Ø[¢ÉÙoS|Ê÷£>íîcܸqÆ•ÓÑÑÑo½õ–X,¦izäÈ‘;vì`»"ƒB&u'¥(jñâ(š¦?ÿ|zˆ¥´è’ü‹5þ;÷BÆÅÛÛû—_~a» Ö “ºÿ'ÌÌLþýïï”Jú‹/fu,•eÔ]ú*ÿÉù½{?iÕúØÐUà‡®æ—_nþûßß?dóæ>ß(ÏÊê !Y:ö˜ðµe”sí„ÿñ]ÍÿýŸç®]óOœ¸þŸÿì“Ë•l—Ó²z¥ÔÔ÷Ã>$€îûI]ÓÙ³½öÚ®—_öÚ²å_>ÚÀ8 “º¬‹³gÏþv̘A[¶Ì21éF— €ñB&ueIIÙÿú×·£Gܺõ_ˆ%à>dRwéRοþµcøp·ÈÈy=zà2Kà4dR×—œœòÍsϹFF¾fjŠXîÂÙï®ïÙgû8ðÆäΟ¿«±QÎv9-h¬V4Vs±000dR·ðÌ3ýbcß¼råμy;dl—£é·5wN½…g2©Û2Ä9:zѵky\‹¥ûïß=W5ì- Û…ûIÝÈàÁÒèèEׯçóàA#ÛåBHé_uÉ[ ž|½w‡à‡î'-­`ÆŒ¯=sss“ËåE•––6¯­Å ¼Ä!Ú €ÇkÁ[§T*'L˜@QT\\œ««ë½{÷vìØ1bĈÌÌLSSS¶«3¾¾¾IIIL»©©éìÙ³2™¬®®Î‚réÒ%___>Ÿemm­gŸgΜ:t¨ê¥þoì(m-ôý¤ÖíÞ½;;;ûäÉ“Ï=÷œƒƒÃO<±uëÖk×® FœèÚ¾ãwÆwÿ^x!99™¹cÈï¿ÿÞ»woggç³gÏ2e2‰¢¨Y³f1¯O VVVB5|>¿ckV§^ª­^0tdRëöïß¿xñbKËGÀªñ9(—ËÜíí탃ƒËÊʘáE:tH*•Z[[¯ZµêàÁƒb±ØÆÆ&44T5¾}ûÔÍ]½zuìØ±"‘ÈÜÜÜÛÛ;&&†òÊ+¯lܸ‘!))ÉÞÞ¾¾¾^[ ©EB4>úÕ‡Ó4½~ýú~ýú‰D¢   ýç¨9__ߪªªôôtBÈ©S§^zé%??¿“'OB îÝ»7jÔ(µÅÅÅõîÝÛÎÎ¾RõY[[[ù…B¡{$&&º¸¸ìÚµKwñ-.gõz4jSϧãÇK¥R‘H´eËBˆL& utt”H$‘‘‘fff†?º`”ènŒ¹«P«£ÙÚÚ;vLÛ_ !ÉÉÉëÖ­sssKJJÊÈÈ3fÌäÉ“Uõ÷÷/--‹‹#„Œ?^ÕÎÎΦi:***''G½Át¨>‰,\¸077·¨¨(22ÒÔÔ´±±q÷îÝ>>>Ìo½õÖo¼¡£†’’¶Æ@ÕUÃ7oÞìîî~ñâŬ¬,ÿÀÀ@=ç¨Eîîî;wî¤iú©§žJHH8~üxÿþýišŽwrrÒ]Û”)SÊËË£££ACCÝìLñ:fĈçΫ««Ó]|‹ËYÛÔ(ØÏϯ¸¸8>>ž)2""ÂÃÃãòåËiiiÌ‘IuÚ¢ÀÀ@ÕrèžI­/@páÂÕKÕGaEEýϺ‡‡Çž={˜RSS !UUUÌ_Ïœ9CÓ4ó]^½­íCªùŸ*++år9ÓÎÈÈ`> +++ÍÌÌòóó …X,NLLÔQC;2ÉÓÓsÿþýÌÀ‚‚>ŸÿàÁƒöÍMÓ¯½öÚ믿~ÿþý=zTUUÕÖÖšššæää¬X±búôéºk»råŠjªšOKÇìÇÆÆªzÓQ|‹ËYÛÔ(8!!A½H½{÷2£]¿~]÷ÂQA&àØ]ëÄbqff¦êeEE…ê¢;•¼¼<777¦Í4òóó™—VVV„§ÑÖ_eeeXX˜¯¯¯X,^°`3°gÏžcÇŽÿí·ßÁ¨ ² IDATQ£tÔй¹¹!!!ÌUm‰D¡P<Îùúú^ºtéôéÓÏ>û¬¥¥åóÏ?êÔ)æd’î÷J¥R}&¡cö]\\T£é(¾Åå¬'‰D¢ÞU^^ž««+ÓöððhSWÝ2©uÛ¶mc¾B„BáåË—5Æ‘J¥999L›iˆÅâŽ*À××7''gÆ ·oß>uê”jøôéÓãâ⢣£gΜIQ”Žhš&mŒ(±X|äÈ曋R©¬¨¨èß¿»gá…^HKK;|øðË/¿Ì 7nÜ?þxùòåV3‰9‹Ó*³¯ç—mËYE:99åææ2íììì6uÐ!“Z^XXèï’RXXxøðá5kÖhŒ3gΜO>ù$99933sÉ’%þþþB¡PŸÎ÷íÛÇ|x©¤Ù |™L6lØ0ôôôÙ³gBÊËË !“&MJII9tèPpp°Ž„BáÑ£G«««#""Ô']QQÑbIÌðÙ³g‡……¥¤¤dee-X°`ôèÑmYfšúöí+‹Ô3é‡~ÞÞÞÚjh“v¯mËY£}j Y»ví•+WÒÓÓ™ (ôLV€îŽÕ#‡,Óó|MÓwïÞ ¶µµµ°°ð÷÷g¾†«ŸOjjjZ±b…D"‰D3gÎÔvª¦y›¥ÑP—œœ|ìØ±¾}ûšššŽ1âÇôóó8p ÓO@@€——ÓÖVÃÞ½{{õêeggÇ\×Ç ÷õõ533+++Ó(L5¼©©iåÊ•R©ÔÊÊÊÏÏOuýB«s¤Í¬Y³„B¡ê„ MÓR©tâĉª—ÚjkñüMóiµ{¨ÚÚ–³z=-ÖFškhhX´h‘­­m¿~ý˜k(®]»¦cá0p> Ï™aÔK`òäÉÆ {ÿý÷Ù.´JKKss?€n ™Df̘Áv Æ¢zôêµàôé½õõl×bôÙ.€MÝú>Ð!bb’ß~ûÀèÑ÷ïƒíZÀ¸á|<®„„Ë„P¿ý–YUUÇv-`ÜIðXJJjÎË$„&„;v•írÀ¸!“à±|ÿýU"„Ð4—Ìv9`ÜIðXbbR”Jš¢TÒ))wîÝ«d»"0bÈ$h¿»wË®_Ïc2‰ÂçóŽý“Ý’À¨!“ ýŽùS x¸ )ÊØX¾€öC&AûÅÆ&ËdJÕKš¦ÿú«03³ˆÅ’À¨!“ ÒÓ ³³ï3WÜ©˜˜ðqõ´2 ÚéÈ‘+=zhÞD&SDGÿb@û “ =hšŽŽþ£©IÞüOׯç¾$èIЗ/ß¾¿ºÅ?™˜ð¹bàz k@&A{;v•ªGAó …2!áŠêqýá¾àЉíâÅcT/ýó™gúI$BÕòòööVl”F ÷‡ /Û¾}N@ÀP¶ ã†cwÀÈ$à dp2 ¸™\L®@&W “€+IÀÈ$à dp2 ¸™\L®@&W “€+IÀÈ$à dp2 ¸™\L®@&W “€+IÀÈ$à dp2 ¸™\L®@&W “€+IÀÈ$à dp2 ¸™\AÑ4Ív ]EQl—Àšž=ÿ¯®î†LvŸíBØ=}út¶«è lÐ¥zyy±][žg»v¬Y³†íºdRGòòòzñÅÙ® ™Ðp> ¸™\L®@&W “€+pÝ¡ÕÕÕíÙ³çÌ™3¶¶¶Ï<óÌk¯½fooO=zôöíÛ ÐQÓêð¹0ÅÑ£G«Ú®®®óçÏ:thçM ™dP4M¯X±‚¢¨5kÖ899•••?~|ñâÅûöí311a»:£±iÓ&wwwBHMMÍÑ£G?üðؘ333¶ë€Ç…cwuòäÉ{÷î}þùçƒ  …nnno¿ýöÎ;ù|>Û¥µßèÑ£«ªªôþøÌÍÍ­¬¬¬¬¬œœœfÏž]SSS\\¬OyWtd’A>}zòäÉßè­¬¬x¼‡+B¡Pìܹsúôé“&MZ»vmuu53|ôèÑ¿þúkPPЄ ¾ýöÛ_~ù%00ð•W^Ù¶m›j„Ó§O«7šËÊÊ ðóó›7oÞÙ³g !+W®ŒeF¸yóæ¤I“µÕ ñùÎI›½k×®+VÄÆÆBÞÿ}oooõFsü±T*ݱcÇ¡C‡‚‚‚>ýôS¹\>zôèÄÄDf„_ýõ…^ˆ×Vƒ†3gÎBŽ9Ò³gOmÃ9òã?†‡‡oß¾½©©iãÆzΑ6Ë–-›8qâĉƒƒƒcbbþóŸÿ¨‡º¶2ÔÛ:ò‘#G¾ýöÛ÷Þ{oëÖ­2™LGÐáIUWW§þÙ=úµµµª'Nœ˜3gΠAƒ¤RéÒ¥KÏŸ?_WWÇüiúôé666£F"„Ìœ9SÕf¾æ¿ôÒKNNNêæ¾þúë·Þz«wïÞ¶¶¶C† ‘Éd HcccNNNJJÊ’%KØ®åoüñG‹û.³fÍúÿvî ‚ˆ¢à¸À aK!Á b0‚ül°+aÎÐs¶JÁËnÀ§÷þüàšÄµÖc´ÖJ)§·üÔZ¿Ï‰€¿¢I\§W¸ã@š@š@š@î8Üiï}zÀ‹iÒæœsÎÓ+ÞÊ?dá< €,4 €,4 €,4 €,4 €,>–sd»ð Ð IEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_func_0x62.html0000644000175000017500000001065612234777147026041 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - b -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__GroupBy__inherit__graph.png0000644000175000017500000001640012234777146033457 0ustar00murraycmurrayc00000000000000‰PNG  IHDR½j@âãbKGDÿÿÿ ½§“µIDATxœíÝ}PSWÞðsyiƒ„G (/ŠJ;Îê: VV¶TM‘}İ‹í2u×EÛêhÑ•*êÔ­ÎŽÕew@@"R­ÕŠ/Ë &Z\Q A%¼(Äòb É}þ8ÛK “cBb÷÷ÿ899œû»‡/¹77‰¡hšF˜ÈÎÚ€×ä€Ü@rˆÐ&*,,´vÉÀÌbbbLÙ– =? ø)ÂÜÄÅÅ‘ý °5ÅÅÅ?ç7€ä€Ü@rHX07===›7oæóù,‹Ïç'%%µ´´à»(Š’H$fÜ53nâg£(ª³³Ó¤9;DæEø<ü¥´Zí²eË(ЉD~~~­­­YYY¡¡¡õõõ,Ëì›S*•¸áææVYY9wî\„«««Ù70Kå&''§±±±¡¡a„ !OOÏC‡edd88Xd‹‡i³Ùlݛ〢¨ŽŽ×t~–:N¬_¿‡†Áápìíí™›jµ:--Ïç{xx…B…Bû)Š:yò$Çsuuݲeˉ'¸\îĉ7mÚÄ ÈÏÏ×mŒ…¢¨+W®øøølذ!""ÂÝÝÝÙÙ988¸¨¨ˆpæÌçîîþå—_âN±Xâââ2mÚ´ììlf¶ÚÚÚ‘“P…òôôìììuVZZ:mÚ4‡óäɦŸ¦é½{÷NŸ>ÝÝÝ=66–YÝ]`ækðKWÌüÈ^Ÿzé077·òòò±îE‰Åâ={öøûûWWWK¥Ò%K–DGG3÷ ‚ÎÎN‘H„Zºt)Ónll¤i://O&“é6ôfÖ½zíÚ5ŸuëÖ555µ··ggg³X,•J…DFF>~ü¸¤¤ÄÁÁáùóç4Mûùù¥¤¤´µµ•””ØÙÙµ··ãigΜ9Ö$4M0oÞ¼Û·oß¹sç¿øÅÒ¥K™R<pýúõ††@À¼T¤»#Ìü^1bbb^Ÿ²Tnªªª†7ó#¥RIÿ¸(¹¹¹x@]]B¨»»ß[YYIÓ´F£Ñkëfbôý‘›ââbš¦»ººÔj5î”J¥Ìo!têÔ)f~Üéîî~àÀŒ#âp87oÞÔÃãñd2nã—Ë5{%xùÂÂÂd2Ù¾}ûÊÏÏojjÒm¼ÔÐÐЂ ïß¿Ÿ˜˜ˆ~>>óçϧiÚÉÉ饓à ¤¦¦Þ¹s§®®î÷¿ÿ}ll,s 111--M"‘444¬]»6<<|Ô’ðüF¦ØŒ<¿¡iúÑ£GB¡ÐÍÍÍÅÅE àGÝó›ÁÁÁ””oooww÷øøx|§GÚG¶Byyyº q~ƒo–——O›6Åb…††ž={6222((häü¸†‹/;99ùûûŸ8q‚6Ö$aaaNNN …ÂÀV ¼½½ÝÜÜô!55•Çã±ÙìÈÈHæ4V·0f~cÕ Ùù E›øù©¢¢¢U«V™úSÀfÅÆÆ"Óß…¯O@rH@n È ¹$ 7cjkë²v ¶‹ðÝ0ºïø©ÊΖ®^í7a‚£µ ±,¹\ÎãñLþ1S/þ—|RÓÎÎÉËkƒ‹Ëk2Æãzñ‰œœª­[E ø••%[»[ç7£;uJBQH"izò䙵k±E›Q47?•HÒ4²³£ÊÊnY»[¹Å™3µööv!F+‰­]Ž-‚ÜŒ¢¨H¬ÑhB4êêZd²kWds 7ú¤Òöúúvæé‚££ýéÓßY·$¹ÑW^þ£ãð‡u††4EE7¬Xm‚ܼ€¦é¢"ñÐF·óáCÅÝ»úoªÿ/¹yÁíÛÍ--J½NGG‡S§àYÕ 7/(+»¥{††ÔÅÅb¸@ª r3L£Ñ–”HôRXGÇ3‰äÁ¸Wd» 7ê«e Eߨw9:ÚÃ@]›aµQo¼á€ÿ9:Ú3m†./ÿ_ÔÈrÿÉë(8ØûÓO—3732*~ýëŸÍž=üÒ®®þÉ“ÙÖ(ÍæÀëácâr?ÎÌ\5×Ú…Ø"8N@rH@n È ¹$ 7€ä€Ü@rH@n È ¹$ 7€ä€Ü@rH@n È ¹$ 7€ä€Ü@rH@n È ¹$ 7€ä€Ü@ÂâÿOÛõë×÷ïßoÑMXHK‹«»ûsgç!kb²O>ùÄ¢›°øãMss³H$²ôV,ÁÛûÙëšêêêëׯ[z+ãôÿ‰φ@llì8lÎo È ¹$ 7€ä°¡ÜôôôlÞ¼™Ïç³X,>ŸŸ””ÔÒòŸo™£(J"‘˜q[fŸÐ·hQ¶’­V»lÙ²šš‘H$—Ë+**œœœBCCU*•µK£°•ïƒÉÉÉilllhh˜0aBÈÓÓóСC¶R!Š¢:::<<<ŒìØÊãMAAÁúõëqhÇÞ~ø[ ÕjuZZŸÏ÷ðð … …÷SuòäIçêêºeË–'Np¹Ü‰'nÚ´‰ŸŸ¯Û©¶¶6""ÂÝÝÝÙÙ988¸¨¨!´|ùræE’êêj±jèììÔmS…òôôdú™{™~š¦÷îÝ;}útww÷ØØXã÷Èúh +,,4f+nnnåååcÝ‹‹Å{öìñ÷÷¯®®–J¥K–,‰ŽŽfîø¥K—2íÆÆFš¦óòòd2™nO¨»‰™3g®[·®©©©½½=;;›Åb©Tªœœœ<`ãÆ~ø¡:::ôÚzÌ™þƒ\¿~½¡¡A ÄÄĹGÄÄÄ0óXŽ­äÆÁÁ¡ªªŠ¹ÉÄZ©TÒ?.z```nn.PWW‡êîîÆ÷VVVÒ4­ÑhôÚzáÐ_ï®®®.µZÛR©ÿj»ººœœœär¹F£ár¹W®\1PAnfÏž]PP€;[ZZìííûúúÈöˆ1>¹±•ã—Ë­¯¯gn*•JæÉ£¹¹Ùßß·qC.—ã›l6!dgg§×6^WWWZZZXX—Ë]»v-îœ4iRDDDIIÉÕ«W-Zd MMM EQåíí­Ñh̸Ge+¥DEE>|ÿI!„8ÎÍ›7õÆðx<™L†Û¸Áår‘™„……Éd²}ûö=xðàüùóL\\œH$*,,Œ§(Ê@ øq¤q¹Ü²²2ü¬Õj•JåŒ3̵Ge+¹Ù¶m[[[›@ H$mmm¥¥¥ééézcÖ¬Y³sçN±X\__Ÿœœ,8Ž1“ççç755é6B½½½]?Òh4CCC , ¼ÿ~bb"BèéÓ§¡+VH$’“'O …B5p8œÓ§O÷ôôdddènZ©Ôÿ{ÝþÄÄÄ´´4‰DÒÐаvíÚððpSÖ̪,} 4òü†¦éG …B777@€ÿšuÏoSRR¼½½ÝÝÝãããÇ:uÙFåååé5t‰ÅâòòòiÓ¦±X¬ÐÐгgÏFFFáy¢¢¢æÌ™ƒÛcÕpìØ±)S¦Lž<?_ÃýaaaNNN …B¯0¦pp055•Çã±ÙìÈÈHæœ÷¥{dÀøœßXüý~EEE«V­²ôV,*::zÁ‚[·nµv!FÁ￱ôžlå8e›úûûkjj¾ù曄„k×b[ 7†œ;w.""bûöí¾¾¾Ö®Å¶¼ÆWñÇÁÊ•+W®\ií*l<Þ@rH@nÆ44¤±v ¶ r3¦/¾ø¢3–qz>…ßtòZ±›2åÿvìøƒJõÈÚ•˜,&&ÆÒ›°øõb¹\þ¯ýË¢›°„û÷»þþ÷û x …Ö®Åd|>?$$Ä¢›°xn^SÉÉù¥¥7Y÷îíz㠸ʥÎoFÑ×§:sæ6M£Áo¾¹kírläf/ÞS«5!;;»ÒRý·¹UI‰ŸÈk4šo¿½×ÓóÜÚÙÈ>¥²ïòåï5-¾©Ñh¿þúŽuK²A}çÎÝÑj‡oRURòÓùœ¥¹@nô‰D„†Ÿcj4Úªª::žY±$¹yA{{wML«}áÚEQ·­U’m‚ܼàÌ™Z;;ýKÛ4M‹Db«Ôc³ 7/(.kuÏnBiµÚÚÚæææ§V)É6An†55uÔÕµŒvýœrp°+/ÿnüK²Y›a·ýõס!HϪ†Á+/ÞMen66vL™2‘Ífá›öOž<ûŸÿqµRu¶^×—ûqf暨¨¹Ö.ÄÁq €Ü@rH@n È ¹$ 7€ä€Ü@rH@n È ¹$ 7€ä€Ü@rH@n È ¹$ 7€ä€Ü@rH@n È ¹$ 7€ä€ÜùÿýŠŠŠ,1í8ãóÙ·oßxþ¼ÞÚ…¼ªÐÐPgæIi 0s‰àÕšýWl©ÿO´°°0..ÎB“ãYè›Máü€Ü@rH@n È aÍÜôôôlÞ¼™Ïç³X,>ŸŸ””ÔÒÒ‚ï¢(J"1ç÷¯˜}BcØÁ×Õr£Õj—-[VSS#‰äryEE…““Shh¨J¥²VIæõßA³_I¤iqòèÑ£S§NíííÕíT*•jµÏ ‹Í[’y'k+¸mxÇ1¿ V{¼)((X¿~ý„ t;9޽½=sS­V§¥¥ñù|¡P¨P(p?EQ'Ožäñx®®®[¶l9qâ—Ë8qâ¦M›˜ùùùº‘jkk#""ÜÝ݃ƒƒñkjË—/ß¿?P]]íáá1000V ºm|eÖÓÓ÷ÞAŠ¢®\¹âãã“••eäü¸QZZ:}út‡Ç ¶³'‘6.ãnnnåååf‹Å{öìñ÷÷¯®®–J¥K–,‰ŽŽfî"‘!´téR¦ÝØØHÓt^^žL&Óm 73gÎ\·n]SSS{{{vv6‹ÅR©T999!!!xÀÆ?üðC50-L[·ó¥;zíÚµíÛ·›4PPPuuõ½{÷.\¸bŠËL[ìñÆj¹qpp¨ªªÒýL©TÒ?þšsssñ€ºº:„Pww7¾·²²’¦iF£×ë`4ò®®®.æ!•Jñ嶺«ËÉÉI.—k4.—{åÊ5ÎÍKw°¸¸˜¦iSçÏÉÉÁµµµÌ`,”«§¸\n}ýð[”JåÈçÍÍÍþþþ¸r¹ßd³Ù!;;;½¶ñºººÒÒÒ¸\îÚµkqç¤I“"""JJJ®^½êàà°hÑ"5¼âúøøÞÇQ1ƒgΜi|1fgµÜDEE>|?H „8ÎÍ›7õÆðx<™L†Û¸ÁårÍU@XX˜L&Û·o߃Ο?ÏôÇÅʼnD¢ÂÂÂøøxŠ¢ Ô€ÿšÇúͽtqÐM¿±±7~øádÖ1ÙÁhã?~ÌãñÞ}÷]±XÜÚÚZRR2oÞ<ôâqjçÎ7nÜÀÇ~@ÀÌÏtFmz~SYY©ü‘Z­öòòúË_þ¢P(jkkñ[>¤R)MÓÝÝÝÎÎΧ¶¶–¦é±jàp8GŽéîî^·nÒ9ŽÔ×׿ƒóܸqãÞ½{‹-b¿âï‚€ÕrCÓô£G„B¡›››‹‹‹@ ÀmºË:88˜’’âíííîî¯{¼7œ„P^^ž^C—X,.//Ÿ6m‹Å ={öldddPPž'**jΜ9¸=V ÇŽ›2eÊäÉ“ñó5Üæää¤P(ŒÜASçGíÙ³' `âĉ+W®|ò䉹~¦²fnlÖŠ+222¬]Å(éW¡,ô»€×§^Ðßß_SSóÍ7ß$$$X»›ß;ÿ‚sçνÿþûÛ·o÷õõµv-£ mæ½Û›¬\¹råʕ֮â5Ç)@rH@n È͘*+¿·v ¶ËRçÅ(..¶ÐäããÖ­)AAO]\†¬]ˆ-²Hnbbb,1íxêïwpT(œ_÷ÜÄÄÄðù|³OKÙÎ%›²{wÅ—_~ëíívãÆ6 }Töµç7£ iº´ô&B¨¥EyçŽuÞ¨`ã 7£¸yóAkkBÈÑѾ¤DÿÝAnFuêÔwo¼aÒ”–J4­µ+²9}jµ¶´ôæààÞo¥Pô]¿ÞhÝ’läF_UÕÝÝÌMGGûS§nY±Û¹ÑwêÔMGÇáeÒ”—ת­X’ ‚ܼàùó¡ŠŠÛCCÝÎþþçW®H­U’m‚ܼàÒ¥ûúúìíáY•>ÈÍ JKoŽü|˜páÂÝÆH ›6mŠŠŠŠŒŒüàƒ._¾ŒJMM-..ÆîÝ»·bÅ •J5V Lp?˜GGGëED·Ÿ¦éãǯ^½:**jÇŽÆïÁ†‡‡ß¾}{ÕªUFîn\»vmõêÕ ==<00ÐÛÛÛÛÛÛÖÖvìØ1???>Ÿ?r¹ÔjÓ¾°ØäÜ444øûûSXXxéÒ¥ôôôC‡=}útß¾}Ì]/^ø`öìÙ\.wÓ¦M×®]S©TÆìÙÆÆÆ¾ùæ›—.]2i„Bá¬Y³|}}?ú裪ª*<833³²²²²²ò«¯¾ŠŠŠÊÈÈÐjµ#—ËÔ1ù¼xòäÉÍÍÍÌkŸgΜQ©T111ºcž¬{¯‹‹KRRÒéÓ§›››}}}õ–˨UÐarn.\xúôéwÞyŒÙlö¿ÿýo½1žžž­­­ø@ƒ®'O6Û·ÆmذaöìÙëÖ­ ¤iúwÞÁý‹/þꫯ>|¸dÉŠ¢ Ô€ß1¢·¬†Mž<ùøÃÂ… ñ÷õõ±Ùlâ]xéâ䙺 ­­­8r¹¶æø«Šq¸õ–ËÔ]0ù8•˜˜¨P(¶lÙ"•J ŵk×rssõÆDFFæåå}ÿý÷r¹ü¯ýkHHˆ‘«|á¼@LéœÙõööjµZFƒº>|¸{÷n„гgÏBo¿ý¶T*½té~Ô«6›Ãóóóu7' ÷GFF=zT*•¶´´|ñÅü±)k¦Ï˜5$Ø<øáǺƒ™ÕëììÌÊÊ ðôô¹\¦2ùñ†Ãá|ùå—YYYúÓŸö³ŸíرC(êŽY½zõÀÀÀ¶mÛT*ÕÏþó 69ùîÝ»·nÝêååÅ4Bº¿¤ÌÌÌO>ùäàÁƒÙÙÙ3fÌøíoÛ××÷é§Ÿæææº¸¸Ì›7¯µµŸrŽUCrrrfffVVVrrryy9î|ë­·’’’D"‘«««n=L¿P(T©TÛ¶mëíí þì³ÏL]7]Ƭ¡©»€Z¶lÙ®]»”Jåüùó™Ec,kΜ9;vìÀ.zËeª¾Ï—¢¨?ÿùϯïûoÒÒÒfÍš•`íB¬€à2·IË^XX‡oþD¾ÏW¥RÉd2‰D’œœlíZþãÆ)))#ûó›ß$%%=º^}¹~"¹©©©Ù»wobb"~&b ,X€¯“¶õêËõÉMXXXXX˜µ«xm¼úrÁû( È ¹$ 7€„þyñÝ»w­RxÍÀç|‘t?çKA\8¿$ 7€ä€Ü@âÿ5Ýé m ªIEND®B`‚glom-1.22.4/docs/libglom_reference/html/namespaceGlom_1_1Conversions.html0000644000175000017500000011771012234777147027702 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::Conversions Namespace Reference
        Glom::Conversions Namespace Reference

        Functions

        Glib::ustring get_text_for_gda_value (Field::glom_field_type glom_type, const Gnome::Gda::Value&value, const NumericFormat& numeric_format=NumericFormat())
         Get text for display to the user. More...
         
        Glib::ustring get_text_for_gda_value (Field::glom_field_type glom_type, const Gnome::Gda::Value&value, const std::locale& locale, const NumericFormat& numeric_format=NumericFormat(), bool iso_format=false)
         
        double get_double_for_gda_value_numeric (const Gnome::Gda::Value&value)
         
        Glib::ustring format_time (const tm& tm_data)
         
        Glib::ustring format_time (const tm& tm_data, const std::locale& locale, bool iso_format=false)
         
        Glib::ustring format_date (const tm& tm_data)
         
        Glib::ustring format_date (const tm& tm_data, const std::locale& locale, bool iso_format=false)
         
        Gnome::Gda::Value parse_value (double number)
         
        Gnome::Gda::Value parse_value (Field::glom_field_type glom_type, const Glib::ustring& text, bool& success, bool iso_format=false)
         
        Gnome::Gda::Value parse_value (Field::glom_field_type glom_type, const Glib::ustring& text, const NumericFormat& numeric_format, bool& success, bool iso_format=false)
         
        tm parse_date (const Glib::ustring& text, bool& success)
         
        tm parse_date (const Glib::ustring& text, const std::locale& locale, bool& success)
         
        tm parse_time (const Glib::ustring& text, bool& success)
         
        tm parse_time (const Glib::ustring& text, const std::locale& locale, bool& success)
         
        bool sanity_check_date_parsing ()
         Check that Glom can parse text representations of dates for which is has itself created the text representation. More...
         
        bool sanity_check_date_text_representation_uses_4_digit_years (bool debug_output=false)
         Check that Glom uses 4 digits to show years in text representations of dates. More...
         
        Glib::ustring format_tm (const tm& tm_data, const std::locale& locale, const char* format)
         
        bool value_is_empty (const Gnome::Gda::Value&value)
         
        Gnome::Gda::Value get_empty_value (Field::glom_field_type field_type)
         
        Gnome::Gda::Value get_example_value (Field::glom_field_type field_type)
         
        Gnome::Gda::Value convert_value (const Gnome::Gda::Value&value, Field::glom_field_type target_glom_type)
         Convert the value to a different type, if necessary. More...
         

        Function Documentation

        Gnome::Gda::Value Glom::Conversions::convert_value ( const Gnome::Gda::Value &  value,
        Field::glom_field_type  target_glom_type 
        )

        Convert the value to a different type, if necessary.

        Any text-to-number or number-to-text conversions will be in the ISO format, ignoring the current locale.

        Glib::ustring Glom::Conversions::format_date ( const tm &  tm_data)
        Glib::ustring Glom::Conversions::format_date ( const tm &  tm_data,
        const std::locale locale,
        bool  iso_format = false 
        )
        Glib::ustring Glom::Conversions::format_time ( const tm &  tm_data)
        Glib::ustring Glom::Conversions::format_time ( const tm &  tm_data,
        const std::locale locale,
        bool  iso_format = false 
        )
        Glib::ustring Glom::Conversions::format_tm ( const tm &  tm_data,
        const std::locale locale,
        const char *  format 
        )
        double Glom::Conversions::get_double_for_gda_value_numeric ( const Gnome::Gda::Value &  value)
        Gnome::Gda::Value Glom::Conversions::get_empty_value ( Field::glom_field_type  field_type)
        Gnome::Gda::Value Glom::Conversions::get_example_value ( Field::glom_field_type  field_type)
        Glib::ustring Glom::Conversions::get_text_for_gda_value ( Field::glom_field_type  glom_type,
        const Gnome::Gda::Value &  value,
        const NumericFormat &  numeric_format = NumericFormat() 
        )

        Get text for display to the user.

        Glib::ustring Glom::Conversions::get_text_for_gda_value ( Field::glom_field_type  glom_type,
        const Gnome::Gda::Value &  value,
        const std::locale locale,
        const NumericFormat &  numeric_format = NumericFormat(),
        bool  iso_format = false 
        )
        tm Glom::Conversions::parse_date ( const Glib::ustring text,
        bool &  success 
        )
        tm Glom::Conversions::parse_date ( const Glib::ustring text,
        const std::locale locale,
        bool &  success 
        )
        tm Glom::Conversions::parse_time ( const Glib::ustring text,
        bool &  success 
        )
        tm Glom::Conversions::parse_time ( const Glib::ustring text,
        const std::locale locale,
        bool &  success 
        )
        Gnome::Gda::Value Glom::Conversions::parse_value ( double  number)
        Gnome::Gda::Value Glom::Conversions::parse_value ( Field::glom_field_type  glom_type,
        const Glib::ustring text,
        bool &  success,
        bool  iso_format = false 
        )
        Gnome::Gda::Value Glom::Conversions::parse_value ( Field::glom_field_type  glom_type,
        const Glib::ustring text,
        const NumericFormat &  numeric_format,
        bool &  success,
        bool  iso_format = false 
        )
        bool Glom::Conversions::sanity_check_date_parsing ( )

        Check that Glom can parse text representations of dates for which is has itself created the text representation.

        This may fail in some locales if a translation of the date format is missing.

        Returns
        true if parsing is working.
        bool Glom::Conversions::sanity_check_date_text_representation_uses_4_digit_years ( bool  debug_output = false)

        Check that Glom uses 4 digits to show years in text representations of dates.

        This may fail in some locales if a translation of the date format is missing. If it fails then Glom will default to using a dd/mm/yy format, which might be incorrect for the locale.

        Returns
        true if 4 digits are used.
        bool Glom::Conversions::value_is_empty ( const Gnome::Gda::Value &  value)
        glom-1.22.4/docs/libglom_reference/html/tab_h.png0000644000175000017500000000026112234777145023121 0ustar00murraycmurrayc00000000000000‰PNG  IHDR$ÇÇ[xIDATxíÝMÁ@†áž~¥ÜÆÎ’Evˆ¿"!•²‘d*×rGq=Š{¼ßSݧçë­ÓÉHÇ uO^õø[À_‡¢ãXvyËþÒ±=·VCffææ{°öŠó´Rçœ%_õçÿŽ¢ö·°Çrug¶(?gh\i>|sIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1View__coll__graph.png0000644000175000017500000001601212234777146031113 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥Óo2DQbKGDÿÿÿ ½§“¿IDATxœíy\GßÀg(ƒry!"‡ ¢ð¥B ¬ˆô#‡‚ÅRûðX¬TK-TÁ‚ŠZÚ>­Â£ðTDN9¬´9¡€A ˆ(A 0 —!ǾÌã¾)D$ 2ûýøÇd2;ó›ýfgvwVÃq EÞÈÒ7Z¾Ñ‚ô¤oÄÀ¥†¼{ö“˜˜(%) R{çÎ666Rmbêáéé)½Ê¥ëÛÆÆÆÃÃCªML=¤ê›œ¿Ñ‚ô¤o´ }£é-&—o@€aXGG‡¼cCbI ÃÊËË¥׫2¹|S©ÔØØXUUUy2e™\¾1 Û¼y³’’Ò«×3‰Iˆœ}³Ùl}}ýèèhð\ŸÏ œ5k–®®ntt4F+//‰DGŽ144œ6mÚ²eËŠ‹‹a%†ÅÅÅ Ã3g΄Ê1 +,,d2™«V­ÒÐÐPVV677OJJŒT'AHHˆ••UWWWEEÅðÍ!iiiúúújjjnnníííD>ŽãGŽ™7ož†††»»{gg§t÷æXÒ}ZÇÁîµ¶¶¦¦¦R(”¶¶6‡Ã‰ˆˆ066¾yóæ;wììì¨T*›ÍþöÛoõôô [ZZBBB455ù|>Žã±±±õõõâ X †­­íõë×™Læ¶mÛÚÚÚ¢££•””x<ÞHuÂÂÃÃ-,,:;;q711¾9,ieeUYYyûöíeË–­Y³f²Ùìï¿ÿÞÈȨ¤¤¤®®ÎÙÙÙÍÍm¢öÛ¸‘³o “'OÂ4—ËpG_¸pæWUUÁÝ·`Á‚èèh˜)‰¸\®H$©iqßÉÉÉ8Žwuu ˜Y[[ ËŒT'`÷îÝ€êêjø­ÄÍaÉüü|˜ëÖ-À“'O`Àfffñññð«––*•Ú××7!ûmÜÈyoÞ¼””@eeåàà`hh(“ÉTQQ±¶¶&fM@ll¬xÂÎÎŽF£Áó,›ÍÆq<33S___IIÉÖÖöêÕ«ŽŽŽ¦¦¦£Ô §ggjjúõ×_KÜ–Œ×ÕÕUWW÷ööær¹D£ƒƒƒÁÁÁ ƒN§;::>xð`¢öÛ¸‘³ï±P]] /Ò^½ª×©úž\÷[.\øÅ_ôôô´µµ…††:88hjjÊ;¨©À$õ˜˜xóæM##£¾¾¾3gÎÈ;¢)‚tŸg7æææ×®]“wSIz|“H Ò7Z¾ÑQß­­]òA>H÷|­¤¤Dªõ›èèÚM› ¦MS”w 2GJ×õø$þÿD M[;@Ee¡¼éÝoÁ&³)qî\ñž=)ÖÖéé;䋬Aqþ¾|¹Ã@yyC{{¼c‘5ÈùnjzR^Þˆã€BÁÒÓoÉ;Yƒœï¬¬ *• E))ly‡#kó”Ä EÕÕ-õõyG$SÐò][ÛöÇmÄ)ª¢"5#ãwù†$cÐò™ù»¢"•øÈç “’nÈ1ÙƒoÇ“’Ø|þ_yklì¼s§E^!É„|WV6µ´ }¨MQQáòe„ÎÒòž~K|0‡ðù‚äd6:7Pñ-ŠRSˇ æ§§¼ü¡Ì#’¨ø.-­ïìì“ø•¢"/¨ø¾r¥ì7à?EE*‘ ñÌÌßáEù”g’>¿6ᘛëîÝ»–øqå½÷Þ43Ó!rººú55éòM¦ ¸>ÐÑÙµÅÅÅRÞÈTÆsé-HßhAúF Ò7Z¾Ñ‚ô¤o´ }£é-HßhAúF Ò7Z¾Ñ‚ô¤o´ }£é-HßhAúF Ò7Z¾Ñ‚ô¤o´ }£é-HßhAúF Ò7Z¾Ñ‚ô¤o´ }£é-þò÷ýüóÏõôô”””ôôô¶nÝÚÒò¿·`V^^>î€01f̘±|ùò‚‚‚ÑËwttŒ»¹‘ؼy³‡‡‡xNAAFãr¹ãnñe»& Æã[$½ûî»eee)))ÍÍÍW®\¡Ñh¶¶¶<oBbÊÏÏçr¹\.·¢¢ÂÆÆfÆ }}’ÿ”µôðôô¼zõêÀÀ‘“‘‘±zõj55µØØXUUÕñU+ÿ®‰¿\211Œá¢111sæÌéííÏär¹Þ­c³Ùã~ÁåÍ»»»555£”çp8ãnn$x<žššZjj*‘3oÞ¼óçÏ¿J/ÛµWÇÍÍÍÍÍM}z`` ±moooWWWWWWCCÃ-Z4þüŠŠŠU«Vihh(++›››'%% ‰*$$ÄÊʪ«« Çñ#GŽÌ›7OCCÃÝÝ]¼éÂÂB&“‰aqÛ¸´´TKK‹Ïçc‹ÅÅŽñÆ®®®ÄÝÆªªª––ð|‘ØÊ²eË¢¢¢---†?~ÐÑÑA¡P_¶kl6ÛÆÆFEEE__?::z¤~½âòÇx|«««gffŽô- ôðáÆ††¥¥¥µµµ®®®Ä·ÎÎÎpW®Y³†H?xðöǹ)ʵk×p711Ù¶m[CCC[[[tt´’’Çßßááá8Žÿý÷FFF%%%uuuÎÎÎÄ`kk{ýúõÈÈH˜ùé§ŸþóŸÿÄq<66¶¾¾^<‘­ªªúìÙ3Ç÷ïß¿fÍ¢‡#±•°°0ÇãããUTTÖ®]‹ãxjjª™™Ù8ºf``ÔÚÚšššJ¡PBBB$ök†ßãñ­  P\\,.Âår ßÆÆÆÄèW]] èîî†ßæççã8. ‡¤áXĽ§OŸúûûëèè‚®®.8_à8^[[ žã€Ý»wª««á·fffñññ0ÝÒÒB¥Rûúú`ÉäädÇ»ººh4Zss³P(ÔÑÑ),,”ØM>Ÿ¯©©™‘‘ãø›o¾Cô—ÃáHl¥´´tÖ¬Y8Žûùù}þùç3fÌã蚆†ÆÉ“'a>—Ë511‘دQ˜ßL&óÇ$>r¹\xr.î›F£Áð¬çÎ;Cú,1 þ:ÉÁQ«¦¦æáÇÁÁÁ+V¬ÐÖÖ¶··÷½lÙ2''§Í›7ÃM”••‡Iµµµ°dYY,ãììüÝwßåçç3™L‘H4ROýüüÞÿý?ÿüSQQøsß[ …šššÕÕÕ&&&÷îÝÓÓÓc³Ù¹¹¹ãèÚ¥K—fÏžÍd2·lÙR\\úÈÒÒrxsÝÝÝÊÊÊjjj0gøüã¸@ ˜={¶††Æ¿ÿýo¢ûàùƒÄV.\¸0}út8‹Ÿ;wnÆŒ...Ć/Õ5}}ý;w¶¶¶¦¤¤(((Hlq&f<ÇqüÏ?ÿôòòRWWWQQqvv†G°¸ïÁÁÁ   ]]] 7—LcñM ¬¬ü÷¿ÿýþýû8Žgffêëë+))ÙÚÚ^½zÕÑÑÑÔÔóÍãñLMM¿þúëÁÁÁàà`ƒA§Óái >l8uqqY¸páÿïbccÅíÛ·S©Ôöövñ’g¤V?~ŒaØ?ü÷ 22’Øð¥º–››knnN£Ñ Fjq†ûþËó-IIIžžžC"›ª¸ººZ[[ïÙ³GÞH¸þ-þ@Š÷ÏûûûËÊÊ~ýõWoooyÇ"kPô½jÕª}ûöÍ;WÞ±ÈTÞ7'Ά 6lØ ï(äŠÇ7ʾтô¤o´@Ô÷O?UÊ;ù áü|”ûÉS†Y³|¹ÜŸøüvy"uÜÜÜÄ?þåþZssóo¿ý&ódMSSW­ÒuvfÊ;©£§§gccC|Dñýßû÷gDEÌž=ãÖ­¯PÌÄAnþ EIIlÀãÇÝeeõòGÖ ç»¤¤îÉ“~€¢"õòå[òGÖ ç;-í–¢"Àç 32nñùByG$SÐò=8(È̬ ÷ô<+,¬•oH2-ßyyw‰T*%-mè“XS´|§¥Ý$a¢ììªþþÁQ6™b ä»·—÷ë¯wˆÇ,!|¾07÷޼B’=ùþùçÛÁг3 KIÿÿn|í@Èwjjùð»+(?ÿ—+ëÿ(/PñÝÑÑ[Tô‡P(’ømvömÇ#/Pñ]%áJ[(ÄÑ9KGÅwzú-FZ)ÀËÊêÛÛ{dœ@q½ £³+*j‹‹‹¥¼‘5¨ß$Ò7Z¾Ñ‚ô¤o´ }£é-HßhAúF Ò7Z¾Ñ‚ô¤o´ }£é-HßhAúF Ò7Z¾Ñ‚ô¤o´ }£é-HßhAúF Ò7Z¾Ñ‚ô¤o´ }£é-HßhAúF Ò7ZŒöþ±’’’¦¦&™…"cJJJž=ûCÞQHøÒYÉŒþ¶Q)S””˜ŠŠ¼££8}ÁûíííÃÂÂd$ÉPPP>JrþF Ò7Z¾Ñ‚ô¤o´ }£Åļソ¿ÿüùóùùù\.W]]}É’%~ø¡––€ÅbEEE™˜˜Œ¯f‹E¤UTT ¶nÝji9âß=e±Xééé3fÌ_s#!¾úê+"§¢¢â‹/¾HMMuqq‘F‹à¯}'x• &Ä7ŽãAAA†…‡‡kkkwvvfeemß¾=..NQQñÕë?yò¤‘‘ §§'##cß¾}III4íÕk;,ëÀ<OII æ/]º”N§ïÙ³GEE*·n²²²`bݺuÄNxŶ&`<ÿùçŸ=ztôèÑ ¨©©îܹ3&&†J¥¾zåeee:N§Óµµµ}||zzz?~ù„B¡ìß¿ŸÁ`œ9sæÒ¥Kîîî‡D.\())9qâNOOO¿zõjhhhTTÔààà7ß|C;{ölHHÈ®]»‘yyyööö {öì177 ‹URRÂçóEEEVVVðȃHlå­·Þúý÷ß•••JJJ€ªª*&“9{ölbÛÛ·oïß¿ÿÓO?×î9&`þîïï?[!Î2²²²ˆ=’½eË– |}}ûûûáTäáá1}úô+V6nÜH¤Ÿ>}ª­­ ÄÎPúûûÏœ9‘””©¬¬ ‡Å‹óùü¾¾>Æ¥K—.]ºôã?ªªª222|}}ÍÌÌÄ4ìîî¾hÑ"ƒS§NutthjjìÛ·ðÎ;ïÀȉ„•••‚‚›Í¶µµ-**zï½÷Äw‚ÄV¬­­ÓÓÓ®®®W®\‰Do½õ€Çãåææ¦§§Óéôõë×ïÙ³çÕ]¼ ð­©©ÙÔÔ´páBø1++‹Çã Y[koo×ÑÑi˜àp8sçÎ(++ƒç/™OGEEeëÖ­MMM4íâÅ‹ÕÕÕ--- C¼XUU•µµõÅ‹álkk;xðàÁƒ‰n²iÓ¦YYYý÷¿ÿ500 R©‹-’Ø:•Jµ³³+,,422jhhX¾|¹ø·[155‰D>¬¬¬ŒˆˆÈÏÏ¿ÿ~ee¥¿¿?›Í>t胃Chh(“)»×O€ï·ß~;##cõêÕðh£ÓéUUUCÊÌœ9óÑ£Gp`„µ¦¦æ8Ú‚o‹SVVÞ±c‡™™Ù¶mÛŒq_½z5Q&,,L(~ðÁk×®µ°°ÐÔÔô÷÷ûí·8Ž÷õõ£ñÃZ¹råO?ýÔØØèàà0ÊÁöíÛgdddii ‚‘ZYºtéµk×úúúôôô,--‹ŠŠZ[[/^ÜÜÜljjzãÆ9s樫«©MzLÀüíããÓÙÙùå—_ÖÖÖvvv^¿~ýüùóCÊ8::ÆÆÆÞ»w¯¹¹ù»ï¾³±±ŸüF‡8_ëèè8s挑‘ÑÌ™3…Bá‚  Fccã¡C‡==ÿ{áÌo¼1gΜ÷ßÿÛo¿ŽŽŽ111µµµ---'NœØµk×ð&–/_^[[›——·jÕ*˜“““—D`aa¡¨¨koo?¼ƒ[±¶¶NKK[¼x1àÍ7ß¼|ù²¥¥¥‚‚‚¾¾þáÇ=Êáp>üðãGÞ¿Œ;äU˜ßjjj?üðƒªªêîÝ»½½½³³³‡/™oÚ´iÅŠ¡¡¡þþþêêêAAAc¯Ÿ8_Û¼yóãÇÃÂÂ0 ûì³Ï._¾¼aÆ“'O:99-]ºtïÞ½â[yzzŠD¢””///›ÐÐÐüãíííû÷ïÞ„ŠŠŠ•••––qâyèСêêjñ€B¡ØÛÛ÷õõ Ì#µbmm=00`aaøÛßþÖ××'oˆ¶¶¶¿¿\\œ™™Ù©S§Æ¾OÆÍhï'rwwçp8ˆ<ï²`ÁoooyòJÀçFqJÞ?<ïîÝ»åååÄ`>…!}ƒ²²²ÀÀ@ñkâ©ÊĬ—¼ÖØÙÙÙÙÙÉ; AßhAúF‹I=ž·f)Š®®® §TReRûÏ¿ûûûKJJŽ=J£Ñ†_û’ŒÉ>žÃußY³f­_¿~Ó¦MçΓwDCë¡òŽb¬Lvßâ888>~É’%{÷î}§²î>Ê’yzzúÙ³gwïÞ}êÔ)>ŸŸŸŸ3ÅW„kjj¼½½ãââdóÃKñ:ù& VÓ F@@@QQQVVÖ–-[/^¬©©éëë?ú£?£¬»‹Ù:::ׯ_çñxp+55µåË— …Âþþ~‰5[[[ÿë_ÿzö왟ŸßáÇïÝ»7Ñ;`üLöó5q8@KKKâjz[[›žžÌÄ0ì…ëo£¬»²dºeÍ2kÖ¬>úhË–-ùùù'NœPPPˆŒŒ|ÙþJƒ×Éw^^ž±±±ªªªÄÕtMMÍÖÖVâi…ÞÞ^xˆÃõøs cY2 MMMwîÜéëësppûVRe²û†‹ßðz,!!.ÖÁÕt&“I§Ó‰Õô5kÖœ;wN[[[WW7''çܹsiiiðô¾¸¸˜ÅbÅÅűQ¸˜­¥¥E§ÓjkkÏž=;Jùžžñù›Ïçddd‚÷Þ{ï“O>‘Ò¬ã`²û†`Æ`0‚‚‚à#¡›6m åñxK—. lܸ‘Ïçî²yóæ­[·Ê>ž©ü}[[[ëXðZ^“ŒÒ7Z¾Ñ‚ô¤o´xÁùyMM yýýñÂ{Æ£ù¶±±™Ð`H¤ÎÌ™3G¿©7Úý5’©9£é-HßhAúF Ò7Zü„gs¢«ãkŠIEND®B`‚glom-1.22.4/docs/libglom_reference/html/ftv2doc.png0000644000175000017500000000135212234777145023415 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÚ}\ˆ±IDATxíMOS[…Ÿžsúa?-XZ(PD4‚ AWbu`b 77wäHFÆCËÔÂÿà/`vo„ˆAPòq‹P @ ­ûÝè980 îà¤+»§Ýy×^ïZï9SW¹\83g‰3'°Nâçl¹¸_b¯p ïåûÆVÜÖ¡€Ÿ×"¬Ö†X€d]Ðà3“ÉÃÄÌ™xŸ ßMàœ[<çSPkvc—hÈ'…™˜^Åm™hØ7 `Û™¦ èÀåráq›‘œ¾!daeKŸþÆÕ˜:Ì*³_דâèi?I–eP*B7Ÿ¿åô!¹Ýgr6Ër6oKbëþãðôrI”ËTˆüªŒ¨xóö=›ù¢&‰(e+ßóÄkýÇ`ëÁÜb.“¸ÐW×w0¥°jÑzN™¬|©WEãµ¢a¯6[öX†AkÓù*/œ¨‰€ÉY­ ÿV’§–u²jÂ>1W *½·°PGŽzÿ¨/Eg{ ŸÇâaoŠÁVú:è¿™¤1$ôR§W,–ªà¨@ŠË56¾ÀÔÜ-¾,mê¸Î/æè¹– òr5¥T*S(Vf8ö9u’ Õ£w›ùóa=Í<{Ò¡UŒ÷r¯+ÉådDÏF$è°…£é¿`zþ»ÎúöN‘µÜ®0Q3£~_^Ëóâ¯N=ˆvpTà±LžT}ˆîkq†Òm<¼ÎÓ?Zh¿X£ï_þÝ¥[)ƒ `gêÃa_Ô*äÔ2`'=õ´Fÿ2EâÁPú ÷»›l=8‹Wv°%THqÉ¿<"¤ïG¾ÆxH{#ÆÖ«aÔJÕÞ‡—m‹„ çñKsÿàñVŠØ¡°·MâÒ^ TÁ– Ý›r¥ß½ømüÿ_™?ªWİ÷#uIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_0x65.html0000644000175000017500000001135312234777147025024 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - e -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1PrintLayout.html0000644000175000017500000014261612234777147027040 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::PrintLayout Class Reference
        Glom::PrintLayout Class Reference
        Inheritance diagram for Glom::PrintLayout:
        Collaboration diagram for Glom::PrintLayout:

        Public Types

        typedef std::vector< double > type_vec_doubles
         
        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         

        Public Member Functions

         PrintLayout ()
         
         PrintLayout (const PrintLayout& src)
         
        PrintLayoutoperator= (const PrintLayout& src)
         
        bool get_show_table_title () const
         
        void set_show_table_title (bool show_table_title=true)
         
        sharedptr< LayoutGroupget_layout_group ()
         
        sharedptr< const LayoutGroupget_layout_group () const
         
        void set_page_setup (const std::string& page_setup)
         Sets the Page Setup as it would be created by a Gtk::PageSetup. More...
         
        std::string get_page_setup () const
         Returns the Page Setup as it would be created by a Gtk::PageSetup. More...
         
        void set_page_count (guint count)
         
        guint get_page_count () const
         
        bool get_show_grid () const
         
        void set_show_grid (bool show_grid=true)
         
        bool get_show_rules () const
         
        void set_show_rules (bool show_rules=true)
         
        bool get_show_outlines () const
         
        void set_show_outlines (bool show_outlines=true)
         
        type_vec_doubles get_horizontal_rules () const
         Get the y positions of the horizontal rule lines. More...
         
        void set_horizontal_rules (const type_vec_doubles& rules)
         
        type_vec_doubles get_vertical_rules () const
         Get the x positions of the vertical rule lines. More...
         
        void set_vertical_rules (const type_vec_doubles& rules)
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Member Typedef Documentation

        Constructor & Destructor Documentation

        Glom::PrintLayout::PrintLayout ( )
        Glom::PrintLayout::PrintLayout ( const PrintLayout src)

        Member Function Documentation

        type_vec_doubles Glom::PrintLayout::get_horizontal_rules ( ) const

        Get the y positions of the horizontal rule lines.

        sharedptr<LayoutGroup> Glom::PrintLayout::get_layout_group ( )
        sharedptr<const LayoutGroup> Glom::PrintLayout::get_layout_group ( ) const
        guint Glom::PrintLayout::get_page_count ( ) const
        std::string Glom::PrintLayout::get_page_setup ( ) const

        Returns the Page Setup as it would be created by a Gtk::PageSetup.

        bool Glom::PrintLayout::get_show_grid ( ) const
        bool Glom::PrintLayout::get_show_outlines ( ) const
        bool Glom::PrintLayout::get_show_rules ( ) const
        bool Glom::PrintLayout::get_show_table_title ( ) const
        type_vec_doubles Glom::PrintLayout::get_vertical_rules ( ) const

        Get the x positions of the vertical rule lines.

        PrintLayout& Glom::PrintLayout::operator= ( const PrintLayout src)
        void Glom::PrintLayout::set_horizontal_rules ( const type_vec_doubles rules)
        void Glom::PrintLayout::set_page_count ( guint  count)
        void Glom::PrintLayout::set_page_setup ( const std::string page_setup)

        Sets the Page Setup as it would be created by a Gtk::PageSetup.

        void Glom::PrintLayout::set_show_grid ( bool  show_grid = true)
        void Glom::PrintLayout::set_show_outlines ( bool  show_outlines = true)
        void Glom::PrintLayout::set_show_rules ( bool  show_rules = true)
        void Glom::PrintLayout::set_show_table_title ( bool  show_table_title = true)
        void Glom::PrintLayout::set_vertical_rules ( const type_vec_doubles rules)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/print_layout.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1GroupInfo.html0000644000175000017500000011210212234777147026441 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::GroupInfo Class Reference
        Inheritance diagram for Glom::GroupInfo:
        Collaboration diagram for Glom::GroupInfo:

        Public Types

        typedef std::map
        < Glib::ustring, Privileges
        type_map_table_privileges
         
        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         

        Public Member Functions

         GroupInfo ()
         
         GroupInfo (const GroupInfo& src)
         
        virtual ~GroupInfo ()
         
        GroupInfooperator= (const GroupInfo& src)
         
        bool operator== (const GroupInfo& src) const
         
        bool operator!= (const GroupInfo& src) const
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Public Attributes

        bool m_developer
         
        type_map_table_privileges m_map_privileges
         

        Additional Inherited Members

        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Member Typedef Documentation

        Constructor & Destructor Documentation

        Glom::GroupInfo::GroupInfo ( )
        Glom::GroupInfo::GroupInfo ( const GroupInfo src)
        virtual Glom::GroupInfo::~GroupInfo ( )
        virtual

        Member Function Documentation

        bool Glom::GroupInfo::operator!= ( const GroupInfo src) const
        GroupInfo& Glom::GroupInfo::operator= ( const GroupInfo src)
        bool Glom::GroupInfo::operator== ( const GroupInfo src) const

        Member Data Documentation

        bool Glom::GroupInfo::m_developer
        type_map_table_privileges Glom::GroupInfo::m_map_privileges

        The documentation for this class was generated from the following file:
        • libglom/data_structure/groupinfo.h
        glom-1.22.4/docs/libglom_reference/html/functions_func_0x72.html0000644000175000017500000001566012234777147026042 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - r -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Footer.html0000644000175000017500000020015512234777147030310 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Footer Class Reference
        Glom::LayoutItem_Footer Class Reference
        Inheritance diagram for Glom::LayoutItem_Footer:
        Collaboration diagram for Glom::LayoutItem_Footer:

        Public Member Functions

         LayoutItem_Footer ()
         
         LayoutItem_Footer (const LayoutItem_Footer& src)
         
        LayoutItem_Footeroperator= (const LayoutItem_Footer& src)
         
        virtual ~LayoutItem_Footer ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        - Public Member Functions inherited from Glom::LayoutGroup
         LayoutGroup ()
         
         LayoutGroup (const LayoutGroup& src)
         
        LayoutGroupoperator= (const LayoutGroup& src)
         
        virtual ~LayoutGroup ()
         
        bool has_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Discover whether the layout group contains the specified field (from the current table). More...
         
        bool has_any_fields () const
         Discover whether the layout group contains any fields. More...
         
        void add_item (const sharedptr< LayoutItem >& item)
         Add the item to the end of the list. More...
         
        void add_item (const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)
         Add the item after the specified existing item. More...
         
        void remove_item (const sharedptr< LayoutItem >& item)
         Remove a layout item from the group. More...
         
        void remove_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Remove any instance of the field from the layout. More...
         
        virtual void change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void change_related_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void remove_relationship (const sharedptr< const Relationship >& relationship)
         Remove any use of the relationship from the layout. More...
         
        void remove_all_items ()
         
        double get_border_width () const
         
        void set_border_width (double border_width)
         
        guint get_items_count () const
         
        guint get_columns_count () const
         
        void set_columns_count (guint columns_count)
         
        type_list_items get_items ()
         
        type_list_const_items get_items () const
         
        type_list_const_items get_items_recursive () const
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_items get_items_recursive ()
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_const_items get_items_recursive_with_groups () const
         Get the items recursively, depth-first, also returning the groups. More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::LayoutGroup
        typedef std::vector< sharedptr
        < LayoutItem > > 
        type_list_items
         
        typedef std::vector< sharedptr
        < const LayoutItem > > 
        type_list_const_items
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::LayoutGroup
        type_list_items m_list_items
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::LayoutItem_Footer::LayoutItem_Footer ( )
        Glom::LayoutItem_Footer::LayoutItem_Footer ( const LayoutItem_Footer src)
        virtual Glom::LayoutItem_Footer::~LayoutItem_Footer ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Footer::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_Footer::get_part_type_name ( ) const
        virtual

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_Footer::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutGroup.

        LayoutItem_Footer& Glom::LayoutItem_Footer::operator= ( const LayoutItem_Footer src)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/report_parts/layoutitem_footer.h
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_9.png0000644000175000017500000000466612234777146025135 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“ kIDATxœíœ}HS]ÇÏu ç+sjÙ¼›š¯•ÈòÔ°bôb¾„¡‚F*LÈ2• z÷Ò°TÌ×ÂDó™X„²9ßj2ל3QkszŸ?Ï}nws­mͧv?{û;ç{ï=Çó"† ›Án³ °*”Þ¶¥·mA'H¥ÒÞÞÞÍJ…âwÀáp"##ÿ;ÆÔÕÕm^b¿…¤¤$¢ÄtÝÔŠý¯!99™TCÍß¶¥·mAém[PzÛ”Þ¶¥·ma¢Þ‹‹‹—/_æp8ööö'33sffžBdppÐrêA¹¹¹?%ìÿ Sô^__?|øðÀÀ@cc£T*mmme0QQQjµÚâùQX=û-?¥²²r||\"‘899<===ztãÆ :Ý”h ‚( ÍNĬLLy¿kjj²³³¡Ø8L&“F£á‡Z­V p8´´4¥R‰çúâÅ E]\\òóókkkÙl¶««kNNÞ ººšX …‘‘‘ŽŽŽ¾¾¾ååå°Ycc£———»»û½{÷ÃÃÃñññ,ËÁÁ!44´¾¾ÖÕÕÅår+**JKKýüüX,Vrr2ÌG­V_¼xqÛ¶mžžž÷ïßÇ“G¤¹¹ÙÏÏÉd¦¤¤(•JAžžžðƒ‡}úô)ip ñp}}½´´ÔßßßÉÉ)""¢§§Çðà¼~ýEQ‹õðáCXIê>)“_Fwÿûnnn---…)–””øûû÷÷÷‹D¢ýû÷;v ?Ëçóçææ‡ÂËããã†UUUMLL ;vìÈÍÍ•ÉdMMMvvv³³³€ãÇÏÏÏ×ÕÕÑéôïß¿Ÿ?~rrrvv¶¼¼ÜÞÞ^­VÃÛEEEuwwß¼y3  ¯¯O"‘ðù|¸«,¸\nww·H$Š…jÁ«BBBúûûGFF¢££= +áYbØ••¼ãÝÝÝ©©©!!!ÄѸ{÷.‡Ãéêêš™™îîî«««'!!A.—755Á~mÔ}<Ã$%%‘öÏMÑ›N§÷ôôüâ_T*ö¯ÞÏž=ƒ >~üøúõ+<ÛÙÙ‰aØÚÚ©, õÞŽÅbݹs–U*•V« á*Š……­V ÛˆD"¢r †íÚµ«¦¦6˜™™¡ÑhËËË~~~°òýû÷Ä«*++aýðð0Lž¤7 ‹aØÊÊÊ“'OÂÂÂâââêêê4 1ù;w–——ÃòúúºJ¥Z__708/_¾$ök£î›¬·)ßs6›-‹‰2ã‹sœÏŸ?ûûûÃ2,H¥Rxèìì °³³#•7¢¬¬¬´´ÔÇÇçÌ™3###pÖ@Q”xá‚@ ˆ‰‰a³ÙYYYÄ˹\.`rròÔ©S‚ âíí½¶¶&•Je2YPPl†ˆ9‚ƒƒ‰É“Âvttøøø|øð¡¶¶¶³³3%%eË–-ÄfSSS0A&“‰ ˆÁñöö& ˆÞ)z9r¤¬¬ >ƒ&“ùîÝ;RE'&&`Øl¶i)ŸÏd2 ^]] /„……åååq¹Üððp à †îU«««</00ptt4##0??Ol‘‘!%IVVÖ¾}ûééé×®]ëééÃŒ¢¢"¡P8::š'¯«èîÝ»[[[ÛÛÛgfföìÙ“™™944DlpöìÙ«W¯¾}ûvvvööíÛ(Š~ûöí—Go÷õ>[FAü¸9cöéÓ§´´4777GGG>ŸRâü­Ñhrss½½½Y,ÖÉ“'‰3>Oë-ªªªˆ…7oÞ„††2 ÿÚÚZLgé¤P(ZZZ|}}ííí£¢¢ÚÚÚຠ«ÑhòòòPuvvNHH€kCµZ}éÒ%¸>þü9 Ìß%%%®®®'Nœøòå †a111 C©T’2ÇY^^~üøqll,±R£Ñp¹\GGG×+F¬×í>1ÃèÎßFXpÕ××§¦¦b6ÿ{A„Baxxøf'b.ð÷ x µn[üÍ;b&óá¨÷Û¶ ô¶-(½m ËëmMk!ààài8¾‘ hµZ‹xáºA,Ùd,¬·õ­ñÎÎN•J¥R©ÄbqXXXbb"Üa6VUUåââb‘ ­ÙXˆŒ¿ß²^^^KKKÄJ¸Ëm°Ma¤€ÐX‹ÅF¶×=k¤a|z– ø«XÆ/1€•­qð.t:Ã0]·G¯Y®ëpÏÍÍ™cTÃJ’Oy]—ÏÚ}¿>üF@ßü÷ÛÊÖ8 ¼¯‹‹‹W®\Ù»w/†a<Ðu»ñöÌrÒ6­ùF5ɧ'ÞèsÙ!ííí>>>EEEr¹Ü9,ãÀÊÖ8éÙ¥Ñh]]]Øn7ž€³œ¤·ùF5ɧÇ~Ô[×eÇ»6==ŸŸ¢hzzúÀÀ€irüö﹕­q@X¯ÉåòÂÂÂÄÄÄ¥¥%½n7~‰³ÜøT4ªI>= .;—Ë-..–H$8wîÇ3<Fba½­lœ™L&“ÉܺukNNŽR©Óëvã—0ËOÕH£Z·‘Ÿºì"‘¨··wqq1>>þg#aÖÛÊÖ8 ƒ Èüü¼^·Ç€YNò•Í7ª £×e¨ÕêêêêèèèÌÌ̈ˆˆ‘‘‘âââŸF3 âÇÝüù³®5t¦vOOÏØØX¹\®ëvãí72ËI·B¡0Ó¨: RA×e‡477§¥¥õõõ™©åÿ°‚ËNùß¶åo›ò¥ÞoÛ‚ÒÛ¶ ô¶-(½m JoÛBÏú\÷Ÿ´Qü¡ô÷÷GDDk~x¿9NRR’uS¢øDDDüðÏS@¨Ý4›‚š¿m JoÛ‚ÒÛ¶øY†íW)šIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__WithFormatting-members.html0000644000175000017500000005421412234777147033453 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_WithFormatting Member List

        This is the complete list of members for Glom::LayoutItem_WithFormatting, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const =0Glom::LayoutItempure virtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_formatting_used() const Glom::LayoutItem_WithFormattingvirtual
        get_formatting_used_horizontal_alignment(bool for_details_view=false) const Glom::LayoutItem_WithFormattingvirtual
        get_has_translations() const Glom::TranslatableItem
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const =0Glom::LayoutItempure virtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItemvirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_WithFormatting()Glom::LayoutItem_WithFormatting
        LayoutItem_WithFormatting(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        m_formattingGlom::LayoutItem_WithFormatting
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem_WithFormatting& src) const Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_WithFormatting()Glom::LayoutItem_WithFormattingvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/functions_0x67.html0000644000175000017500000012025412234777147025027 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - g -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1TableInfo-members.html0000644000175000017500000004650412234777147030040 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::TableInfo Member List

        This is the complete list of members for Glom::TableInfo, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_default() const Glom::TableInfo
        get_has_translations() const Glom::TranslatableItem
        get_hidden() const Glom::TableInfo
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_singular(const Glib::ustring& locale) const Glom::HasTitleSingular
        get_title_singular_original() const Glom::HasTitleSingular
        get_title_singular_with_fallback(const Glib::ustring& locale) const Glom::HasTitleSingular
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        HasTitleSingular()Glom::HasTitleSingular
        HasTitleSingular(const HasTitleSingular& src)Glom::HasTitleSingular
        m_title_singularGlom::HasTitleSingular
        m_translatable_item_typeGlom::TranslatableItemprotected
        Glom::operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        Glom::HasTitleSingular::operator!=(const HasTitleSingular& src) const Glom::HasTitleSingular
        operator=(const TableInfo& src)Glom::TableInfo
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        Glom::HasTitleSingular::operator=(const HasTitleSingular& src)Glom::HasTitleSingular
        Glom::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        Glom::HasTitleSingular::operator==(const HasTitleSingular& src) const Glom::HasTitleSingular
        set_default(bool val=true)Glom::TableInfo
        set_hidden(bool val=true)Glom::TableInfo
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        set_title_singular(const Glib::ustring& title, const Glib::ustring& locale)Glom::HasTitleSingular
        TableInfo()Glom::TableInfo
        TableInfo(const TableInfo& src)Glom::TableInfo
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~HasTitleSingular()Glom::HasTitleSingularvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1View__Composite-members.html0000644000175000017500000002463412234777147032426 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        GlomBakery::View_Composite< T_Document > Member List
        glom-1.22.4/docs/libglom_reference/html/functions_0x6e.html0000644000175000017500000001224712234777147025107 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - n -

        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1View__Composite__inherit__graph.png0000644000175000017500000002542612234777146034016 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÍ0›¥bMbKGDÿÿÿ ½§“ IDATxœíy\“GþÇçI@‰TBˆ( ˆ´PiY ŠBU°RJWÅk­.mu½jýI-ºà‰­V»ÕÂ*l­€È}Õ£õ@(`ЂâAEN 9žß³>˜Ä€É‚ó~ñÇ<óÌÌ÷;“3ó<Ï7y0Ç¡f(švñZ€t† ¤3 !Èé A:šv@6†iÚm%999((HÓ^ d˜ê °qãF777M{¡ekÚÙ _¹¹¹ ÃÿËaΰÕÚŸ!Èé AHg2@:CÒ‚ FŽÎD"†aíííšv(ï†Ì’†•••©Á/M2rtF¥Rããã 5íB#Gg†-]ºTOOïÕÛ“âC‹uÆårÝÜÜ ,--cccÁ3‰…ÂÍ›77ÎÜÜ<66–F£•••I$’¨¨(++«Ñ£G»ººÁF0 KHH ðy—©©)”†aùùùgýúõsæÌa2™úúú)))ym„‡‡;;;óùüòòò«C222,-- F@@À£Gˆ|Ç£¢¢&MšÄd2;::Ô;šê–’““—™ŸîááÁb±BCC_ÚfAAOTT<”Ybmm vvv€ææfxX[[»dÉ Ã0 377‹Åƒžá…ëÌÇǧ¾¾>55ÕÌÌlöìÙMMM0ßÌ̬¶¶¦ïß¿,‹Èðù|±X¬Œ …ðð𨩩ùæ›oêêê~ùå——¶™šš‘‘‘ŸŸ/¯:¤ºº&ªªª0 ³°° ÏÊÊ‚“œ,§L™¢üà 7´XgNNNaaaçí·ßÆqœF£Áü%K–ìÞ½ûúõëwîÜÙ¼y3ð•+WFDD¶´´8p€Íf?yòµB$<o€-¡PèââbccsçÎåË—?~,¯MF³´´üꫯ֮]+ eV‡%ÃÂÂnÞ¼YYYùÙgŸ÷e–/_^VVV]]êéé©Î±T?]µå”Øg\¼xÑÁÁF£YYY%%%á϶VOŸ>ýì³ÏÆŽ;iÒ¤´´4@EEEÿöíÛ9Ž‹‹ ±+ÄÇÇK'<<šnoÏ"røü>ccº&\ÓP¼Æ a±6ÅĬðósÒ´#ÚZ7d€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† •ýnhqqñ·ß~«’¦†9MM†LæS}}¡¦Q;nnnŸþ¹JšRÙ|ÖÐЖ–¦ªÖ†3ææÝ¯ƒÈJJJTøŠzÿÞvjjªjDhŠÀÀ@¶†ög2@:CÒ‚ Îd€t†  謫«ë‹/¾°°°ÐÓÓ³°°XµjUSÓÿÞÊ‹aXYYÙ[Ƥ022š1cÆ•+W—ooo²9y,]º4((H:çÊ•+4Çã Ùâ`»6Ü [g‰äý÷ß/--MKKkllüùçŸi4š»»»@ PIûyyy<Çã•——»¹¹-\¸°·Wö+ ÕGppðÙ³gŸŸÏçókkkwíÚõÆoL™2¥¼¼|Μ9L&S__ßÁÁ!%%e€WáááÎÎÎ|>Çñ¨¨¨I“&1™ÌÀÀ@iÓùùùÃ0âñZII‰‰‰‰P(Ä0,!!KHH5j”¿¿?ñtäÆMMM~~~àÙJ-ÓŠ««kLL  ©© ðÚÛÛ)J}}ý`»ÆårÝÜÜ ,--cccåõ‹Áq<>>¾¦¦F:qîÜ9CCçOŸâ8¾sçÎùóçí´µµÉ´„ãxbb¢Á‚ pOOO···B×&Ož¼uëÖæææôôt ….³_ Pí|F¶ÎtttŠŠŠþ4ÿ ‡?Ó™ ±ÊTVV:;;áÙ¼¼<ÇÅbñ€4\S€ÔâÒÕÕµfÍ‹%‰ø|>\—q¯ªªÏ–KÀ–-[•••𬽽}bb"L755Q©ÔÞÞ^X255Çq>ŸO£ÑÅb1‹ÅÊÏÏ—ÙM¡PhllœãøôéÓãââˆþ¶µµÉ´RRR2nÜ8ÇCCC¿øâ ###‘H´~ýúÍ›7¡kL&óСC0ŸÇãÙÚÚÊì—´[gçÇ$y<¼Ø”ÖF+,,„ànúÖ­[øóc-3 žßÄÀÕáöíÛuuuaaa3gÎ433›5k–´Î\]]}||–.] «èëë˜9ªªª`ÉÒÒRXÆ××÷»ï¾ËËËãp8‰D^OCCC—-[öàÁ]]]8YâÏt&ÓŠX,666®¬¬´µµ½{÷®……—Ëutt¼xñâºvúôéñãÇs8œ+VÉë—´{æçç÷Ã?ÀIÀ`0®]»6  ›Í®©©i˜`±X`ðˆD"N÷ð𨩩ùæ›oêêê~ùåé2©©©ÑÑÑùùùÐPVV‰DÂãñ¦L™KR(ÿ«   ´´´äääE‹a&ÏzpppnnnZZÚìÙ³™L¦ô)™V(ʼyó’’’:;;mmm===³²²jkkgΜ9„®ùøøÔ××§¦¦š™™Íž=Çqyý" U VÉù¬µµ•Ífûøøp¹Ü‡¦§§;;;ƒçç³]»vÙØØ\½zîÏ|}}a] Ä|F\ü766®\¹ÒÉÉI"‘˜™™8p £££¼¼ÞÙ"f)øß¿gÏžiÓ¦õ÷÷GFF:88p¹Ü{÷î­^½ÚÉÉéEsúúú £¼¼漸?Ãq\$?žÉdþûßÿ&ºžíeZ9yòä˜1cà.íĉFFF~~~DÅAuÍÒÒrãÆÍÍÍiii:::ëׯ—iQÚ½nâ8þàÁƒ±cÇøúúÂKZgýýý[·n577g2™‹-"n=(£3}}ý÷Þ{ïÞ½{8ŽçääXZZêéé¹»»Ÿ={ÖÛÛÛÎΗҙ@ °³³Û¿XX›Í¦ÓéÞÞÞðòaÙòóó›6mqˆ—N@Ö®]K¥R=z$]²­­Mž•ÖÖV ÃŽ9G MTT×.^¼èàà@£Ñ¬¬¬’’’äYT€ju¦²xÚ”””àà`Uµ6Ìñ÷÷wqqÙ¶m›¦Q#0þLU…èùæàèëë+--ýõ×_—,Y¢i_´ ¤³Áqîܹ9sæìرcâĉšöE›PqÜöˆgáÂ… .Ô´ÚšÏd€t† ¤3 !ÈélМ9S¡i´_o*xÞ7b7n%wF(|¤iGÔN@@€ªšRÙ󀯯Æß~ûM%M gz¼9g޹¯/GÓ¾¨ 777•4¥2½&ìÜ™seüx£ë×ÿù:LÞªíÏX,IIáZ[;KKk4íŽ6t6Š‹«?îèêR33¯kÚméldd\×Õ¥„Bqvöu¡P¬i´¤3eéïåä”Úêî~šŸ_¥Y—´¤3e¹|ùΓ'ýÄ!•JÉÈqŽÒ™²dd\#¾"‰$çÎÝèëëWPA€t¦==‚_½E|}"Š/^¼¥)—´ ¤3¥8þ¦H4p×O¡`iiCÿÕ™× ¤3¥HO/{ñ®¬H$ÉË»ËãiÏ©h¤³—ÓÞÞSXø‡X,‘yöܹ›$û£ ½œsçnˆåÜ)‹qtÕ© Hg/'+ë:òž㥥5u“ꂞ£kSLÌ ??'M;¢M ù AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2Pñû„ Š‹‹ÔÔ¸Æ)..~úôM{¡‚‚‚ÔÒ.®TøÊãᆞ‡B1дêBMzP㺠&§5ËÓ§õbq¯¦½P=ÉÉÉêÚŸ!Èé AHg2@:CÒ‚ Îd yuuu}ñÅzzz«V­jjj‚§0 ++ú‹T1)ŒŒŒf̘qåÊÅåÛÛÛ‡lNK—.póóÊ•+4Çã©É"x¾ï¯2˜¯ˆ†u&‘HÞÿýÒÒÒ´´´ÆÆÆŸþ™F£¹»» •´Ÿ——Çãñx<^yy¹››ÛÂ… {{É~-kppðÙ³gŸm\\Ü„ zzz¤3y<žH$ÂqÀår‡ìÀê€Û·o+(ßÖÖ6dsò #==È™4iÒO?ý¤rC2Q~ á}Z5¹¡áù,11qíÚµ£G–Îd0T*•8‰Dááá&&&!!!0ðӧO³ÙlCCÃ/¿ü2))‰Åb3fóæÍDÝžž>ŸÏçókkkwíÚõÆoL™2¥¼¼|Μ9L&S__ßÁÁ!%%e€WáááÎÎÎ|>Çñ¨¨¨I“&1™ÌÀÀ@iÓùùùðo¿ýf–””˜˜˜…B Ã`±„„„Q£Fùûû§¥¥Áb7nÜhjjòóóÏVj™V\]]cbbMMM†8pÐÞÞN¡Pêëë8ÜÖÖö )¨I¿JÎgcÇŽÍÉÉ‘wÀår÷íÛgeeURRRUUååååïïOœõõõmoo‡áüùó‰ôýû÷ñÞ+J¡P.]º„㸭­í§Ÿ~Z[[ÛÒÒ«§§'ðgóYdd¤££cGGŽãßÿ½µµuqqquuµ¯¯/Ñ#€»»{AAAtt´››ÌܰaÃ'Ÿ|‚ãx|||MMtâܹs†††OŸ>Åq|çÎóçÏ'Úikk“i%"""((ÇñÄÄDƒ à8žžžnoo/=DÁÁÁvvvŠÇð¥®æùLÃ:ÓÑÑ)**úÓ›gðx<üÙÙØØ«Lee% ³³žÍËËÃq\,Hѕ⮮®5kÖ°X,‘HÄçóẌãxUUx¶\¶lÙ¨¬¬„gíííaº©©‰J¥öööÂ’©©©8Žóù|ÖØØ(‹Y,V~~¾Ìn …BccãììlǧOŸGô·­­M¦•’’’qãÆá8úÅ_‰D¢õë×oÞ¼Çñ¾¾¾ãÇ;99Íž=;99¹¿¿_Þ#á8Žs8œü‘8äñxðbSZg4­°°€»é[·náÏ Ìô€!†ëÑíÛ·ëêêÂÂÂfΜiff6kÖ,i¹ººúøø,]ºVÑ××0)VUUÁ’¥¥¥°Œ¯¯ïwß}———Çáp$‰¼ž†††.[¶ìÁƒºººp²ÄŸéL¦±Xlll\YYikk{÷î] .—ëèèxñâÅóçÏ›šš®[·îÎ;/áa¢3 ïÏüüü~øáñ³×Ü3Œk×¾ÖžÍf×ÔÔÀ4L°X¬!؉D:îááQSSóÍ7ßÔÕÕýòË/ÒeRSS£££322òó󡡬¬,8R‰„ÇãM™2–¤Pþ7tAAAiiiÉÉÉ‹-Â0LžõàààÜÜÜ´´´Ù³g3™LéS2­P(”yóæ%%%uvvÚÚÚzzzfeeÕÖÖΜ9“Íf»¸¸üòË/gÏž…W”Z€šô«ä|ÖÚÚÊf³}||¸\îÇÓÓÓÁóóÙ®]»lll®^½ ÷g¾¾¾°.Pb>#.éW®\éää$‘HÌÌÌ8ÐÑÑQ^^ïl³œØöìÙ3mÚ´þþþÈÈH.—{ïÞ½Õ«W;99½h®³³S__ŸÁ`”——Ü÷g8Ž‹D¢ñãÇ3™ÌÿûßD÷Á³¡L+'Ož3f Ü¥8qÂÈÈÈÏϨ{ÿþýÏ?ÿÜÜÜüã?¾víš¼Ãc>Ó°ÎpðàAHHÈØ±c |}}áŒ%­³þþþ­[·š››3™ÌE‹·”Ѿ¾þ{ï½wïÞ=Çsrr,--õôôÜÝÝÏž=ëíí ÷Ñ„ÎÝþýûûûûÃÂÂØl6N÷öö†—ø žŸŸß´iÓˆC@||¼t²víZ*•úèÑ#é’mmmò¬´¶¶bväÈ8J€èèè£×ÛÛ{ìØ±Y³fÉÞa¢3 áºL%RSSÕÑøpÃßßßÅÅeÛ¶mšvä•HII V“4ÿÜI«éëë+--ýõ×_—,Y¢i_†5Hg¯Ä¹sçæÌ™³cÇŽ‰'jÚ—aº¾ïôš°páÂ… jÚ -Íg2@:CÁˆÕt¥££cgg—˜˜¨i^kFòþ,//ÏÉÉ©»»;77wÕªU£Gö÷÷×´S¯)#Ygt:Á`0Œ5kÖ´¶¶FDD 7aÖÖÖfbb¢iGÔΈ]7\QQ#(_Œf“H$QQQVVV£Gvuu-**‚µ¤ãª‰´â¸7\~ÈZnn.›Íf2™GŽ9SSSéÐmKBÞ¸†šž3(ÿÜIM€çŸ·tuunÞ¼)3šíðáÃùùùMMMáááÆÆÆB¡>ÂH…u(ˆ{S²æííÝÚÚšžž®££cÑÀ ¼çΛ8qâîÝ»[[[I§?áÏ7Õ„<ÉŒf›:ujll,Ì„0ÂGžÎĽ)YËÌÌ$JM½)^__ÿå—_²ÙìeË–ÑG$0’ã‚HþH–¹¹yCCƒ••Ì„‰ÆÆÆºº:[[[˜‰aƒÁPá ÓéàYhtP[[»dÉx©knn.‹á)sssé’òàp8{÷î­®®ž;wî'Ÿ|âââ2Ä>'^%''¿õÖ[cÇŽ•ÍÆb±jkk‰Â|>Ÿ‰Ãq@hå¥(YS¬ÝTUUýöÛo]]]sæÌQ¾Ö°e$ë ~ ¥¡¡!::zÿþý‘‘‘€+VìÚµ‹ËåþñÇëÖ­óõõe0+W®Œˆˆ(,,lii9pà›Í†» #;;»««kÏž=J]¾|yxxxYYYuuuhh¨§§§âòABB»ᄏjÕ*WW×Û·oïÝ»wH½f¨i=û3…B±µµ=uêÌ—ÍÖßß¿}ûv‡c``àââ·\8ŽŸ,,ÌÇÇç¯ýëÁƒûú¾P–Äb±š Mg8ŽoݺõÎ;‘‘‘©©©ûöí5jÔÚµk…B¡J|:tèPnnnnnnllì´iÓvìØñôéS•´¬<žžž%%%€È)**zçwètú¶mÛ Te¨»»{ãÆÖÖÖ û÷ﯮ®þî»ïTÕø  P(ªíÚs¡Îùóç>|øõ×_O:•Á`XYYmܸ1..ŽJøÆÝ¡¡¯¯O§Óétº™™ÙòåË»»»[[[UÒ²ò¸¸¸èèè\½z•È)**š5k†asçÎÕÕÕU•¡”””I“&­^½ÚÄÄÄÆÆfË–-—/_ÖÈ”&Ý5•OlCÑÙ… üýýi´çÞH§Ó)”?[‹ÅqqqAAA~øáîÝ»»ºº`¾§§çåË—ßÿýãÇ_ºt) `Á‚?üðQ÷É“'======ÍÍÍ'Ožœ~üø›o¾!N]¼x1...,,ìÔ©S.\øÏþ³uëÖÔÔÔææfX`Ó¦M|ðÁ|’’’òüƒB¡ìܹ“Íf;vìôéÓ{÷î‰þ|'æÉ“'‹‹‹|ø.@p>766‚-±X Ð××_·n½½ý§Ÿ~jccƒãø¼yóˆ2b±øoûÛ‚ ׬Yóî»ïpïíí%Ö;âó˜={ö™3gêëë½¼¼ä©àååµcÇkkk'''8YȳòÎ;ï\ºt©··×ÂÂÂÉÉ©°°°¹¹ùÍ7ß”gÂÕÕõüùóóçχ‡uuuüqNNΫ àÇá?Occ#ÀÈÈHfS...ÉÉÉ÷ïß/((ظqcRRÒ‹M)ÌA1”ùlùòå_~ùeUUUGGGAAÁO?ý4 Œ··w||üÝ»w¿ûî;777åý#®ÚÛÛ;fmmmjj*‹áÌ___¿wï^@ww7,?jÔ¨ &,[¶ìðáÃ"‘ÈÛÛ;..®ªªª©©éàÁƒ›6mzÑÄŒ3ªªª._¾ MÀ… àg@$ŽŽŽºººñññMØA™V\\\222 °¦OŸž™™éä䤣#÷ÿyñâÅ555111pÖvìØ¸qãlmmq5j”t#px•LeÊ|Æ`0Ž9rìØ±-[¶ô÷÷OŸ>="""$$DºÌâÅ‹Ÿ½|ùrWW×Ï>ûìðý÷ßß½{7Ç{ûí·7mÚD§Óe6µeË–#GŽää䘘˜lÛ¶m̘1D o¾ùæªU«”LeÀ¤÷¡)))ÁÁÁðrcÄ>uêÔ%K–hÚãééckk«A"""LMM¥£‡2Ÿi; ¦¦¦¬¬lݺuäX¼zõêÖ­[_Ì_ºtéªU«ÈñA³¼Ž:+--ŠŠZ¾|¹¼{Z*ÇÅÅ…´Ubx.G¯£Î<<<<<<4íÅëŠ BÒ‚ FȺ ý@ÞeQ˜B¡˜››/_¾œ¸‹†P#Dg¹¹¹0ñÁ:tÈÚÚ  ” –éëë+..þúë¯i4Ú‹wÈ*d„¬›ôg©ð5™ì °Ì¸qã>üðÃÅ‹Ÿ8q‚<_•C}¡­A+uÆçóUØš——×ýû÷»»»eÆiÁ¬Ÿ5kÖTVVÂZÒ: ÒŠƒÃÆýöÛo~~~™™™àÙÊ#À?{zzàÓ^mDËtvóæÍ;wnذA…mšššÚÛÛeÆiedddgg‡……%&&¾ýöÛ_}õ•â[Ap˜‚X®¬¬¬ãÇoÙ²åèÑ£B¡P:Œ(sûöí%K–$$$¨öߌ´CgàÌ™3ÿûßÿóŸÿxxxÄÅũÊ̯ÜÜÜ+V¼ùæ›ÆÆÆ+W®LLLT°…Áa b¹üüü ÆŒ3Äb±¼ m—ýë_OŸ> Ý·oßÝ»wU=jD ®¸\îÞ½{½¼¼¶oßÎápTÞ> ¨211‘òÕÒÒ£¸†½4hBApŒåÚ½{·´i6› ­ùqxãÆ[½zõŠ+òòò<¨££=Øþj-Й©©©ÝÕ«Wa0í€8°WçòåË666†††2C¾Œ›››‰XÈžž8¥Áåãþ” ŒS††††[·nõöözyy)_K³hÎ,--÷íÛ×ÜÜœ™™ùñÇ¿óÎ;}ô‘Í«´ CÜà}¤¤¤ˆˆð,fŽÃáÐét"Nkþüù'Nœ033377¿pá‰'222àåjQQ‘§§gBB‚’Fa,—‰‰ NOJJªªª:~ü¸‚òÝÝÝÒû3¡PxåÊ•ììl‘HôÑGýãÿPá×®Ôè bff¶fÍšU«V]¸páèÑ£‡~•Ö`ˆ†al6{ëÖ­ð‹L2C¾-Z$ wïÞÝÙÙ9iÒ¤}ûöÁÕpݺu111ÇŽ[·nüŽÓKT,FÌß%%%¥¥¥kÖ¬±··•¾k„×7þ ¡>^£ø3ò5¬±:#3ä ñR´ãþBÛA:CÒ‚ Îd€t† ×›/þä1(ÚÚÚ` ø½Lb xhÉû]$B… ý‚ Îd€t† ¤3 !ÈàÿqH» ›·xIEND®B`‚glom-1.22.4/docs/libglom_reference/html/sync_off.png0000644000175000017500000000152512234777145023656 0ustar00murraycmurrayc00000000000000‰PNG  IHDRàw=øIDATxíÝKhTWÀñÿä1I&3™8M¦Iš™†I3Ú©b$cÌ I1V1±-(Tö±±Ð.* t!‚K[¥Ä¥ˆ„¨´f£`l(øl©"Y”¤6ÆgÌTú}·sgîܹ ±d{8?æÌ¹÷;çÜuíÚ`:!±F¬¢BäŠ?ŰÄm'yÊÅ>ÑlU¯½üý‰è_‹?€Œê ]€Y(ŠNñ±8fý1°Öqún-eâ¨øtºmâÈ Ó0}b›ù%·©µ×Œ®=Ÿ0´³?Š1sŸ‹0€¯8À‘;_ ‹W|%\ Zð— >舽ln¨p©.aÇ{ )t;Ú b nŸš¯›65°¢¡2çÅÔ?Žž>Oдàuönm¤¢Ì`×­Z¬WjC~>‘Ö¾0+á {{©fÝ×Mæ·æÅ•ìÙ¼˜` Ý›%uA6´½ÅÆö¨Á,]k¢ÄW¼™u±›]‹ˆ7§¯iòh€ ¶¶¬ÏÖu1 ló —Ҷ̺–:ÞÍ\ÄcãÏxøhR²Êè‡Qt$¿ß§¨ ª fdºü<4BÿÙ[•f¸d7=.Mé9/—éªÃëù/ÿO Üaàò}€,‘j?Ÿõ.5Úšm?œÿŸ®ŽXÿ2¬#¸d píæ(£?cÛú¼!½›a1¥Þ—ŽòØ©ܾ7dÔK:‚ùÒ‰ì)Ê3‚Ü™àÌà]€,±H€µ+køöäu<|`·LhC7¹ÔeÍ Ÿ×Ÿ˜tÜ‹ óH$^2%l.êaeÐäýE”ÌÉ|ÅÜìî‰Ýsä }¸ýDû^hzé~ðR›¦Ã¡¿]|#ü¯@×—Ö‡[k¹–<|š(Ç*€Ý¹dÇtMé:Ýñø«Ø,êÅû¢]”' øXÓ_nò¡Æ|Øý /c§fžâOIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Portal__coll__graph.png0000644000175000017500000005664412234777146032636 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÅ³ÑØ›bKGDÿÿÿ ½§“ IDATxœìÝi\×Úð3I€€€1ˆhÔ*méÕ"K hQô-*–E‹EiiÕÖêÕ¶·`Km«¶òV¯Öjím–²¸´Ä×{¹ˆ 6hq)–Ýd'ˆlYçý05Í !H2dòü~˜LΜóÌ$<ž™9s‚á8ŽŒì€" Ÿ€v@>í€| Úù´ƒAvÀ0´´´”——“@![[ÛY³f‘Pò)†™3g’‚±«¯¯';0(ȧ`&MšDvÆ®µµ•ìÀ àú)häSÐȧ O@; Ÿ€v@>äÀ0¬­­Mï½öZDD„âšÿüç?L&óñãÇ:mPÊ!ȧÀ¬X±"77·¯¯O¾æÌ™3 .´²²"1*”@>º¥•>]PP‰‰I^^ž|Í™3gÂÂÂô j@>ÚÄçó½½½-,,œœœŽ9‚aBÈÖÖ¶­­M(nÞ¼ÙÎÎÎÖÖö›o¾‘o‚aXJJŠâÂ@¦¦¦!!!YYYÄË›7o644,]ºÇñ„„ggg6›ÞÞÞŽ’Éd ...ãÆóòòº|ù2Q¹<‰Dïàà0qâÄÈÈHb+¢Laa!Ç;zôè`;˜““ãääÄb±ÂÂÂZZZÊÊÊÙl¶¹¹¹»»ûÉ“'U•qcõ €š›› †,6uêÔØØØÆÆÆììlÖÔÔ„jmmÅq<>>žÇãUTTøûûË×'''×ÖÖ*.¨”——geeÕßßãøöíÛ/^Œãø\]]‹‹‹«««ƒƒƒÃÂÂpÿúë¯ âããmllÄb1ŽãòwíÚåââRRRRQQ1þü¢ „OQQQoo¯ÊB³gϾqãÆ­[·¼¼¼/^<}úôõë××ÕÕ5559rÄÌÌL(<ñññãTTTT´bÅŠ3f y„oß¾}ûöí!‹R@>Ñ0Ÿ²Ùì}ûöË@"‘ȳ˜³³sbb"ñÖ7äë5$‹mllΜ9ƒãø_þò¢ª™3g¦¦¦ètzOOÏSO=Et q—Éd@&“á ùÔÍÍíĉDÛ·o#„=zDÈÌÌTBH~®_¿Žª««“H$ÄšŠŠ yJÇaúôéãÄq¼··÷ðáÃ"‘hÈãùt,ƒ| 4¢a>MOO·³³ãñxkÖ¬¹|ù2®Å˜LfQQQŒ¸³4¬|ŠãøÚµk£¢¢îß¿obbÒÞގ㸹¹¹ÒùVEE…¹¹¹¼!EŠ‘\ºtI1’ß~û(põêU5 „}šø*]ÑiÓ¦q8œºº:ùVR©T±.—[[[K, ‡xI£ ñ!¼¢¢ðU«VÕÖÖîÞ½ûîÝ»ùùùƒÇÆÉår===óóósssÁsHËäÀ hØ?urrÚ¼yscccVVƒÁ î§WVVâ8þùçŸ;::^ºt©²²ráÂ…h˜×Oq—H$vvvl6ûûï¿'Ö|þùçîîî|>¿ªªêÍ7ßôððÀq|çÎS§N-**jllܽ{÷¸qã?~Œã¸<’;v¸¹¹ýòË/ÄõÓàà`¢6„ŸÏWBhîܹ7oÞ$®ŸFDDL™2eÏž=íííeeeÄÙŠŠŠÇaÓ¦Mã$ÔÔÔ¼÷Þ{öööo¼ñƵk׆<ÂÐ?Ë Ÿh˜O/\¸àîîÎd2]\\ÒÒÒp÷óóc2™íííB¡pË–-Äýý¤¤$y>E%''+.¨±aÃ:ÞÒÒB¼‰Dqqq\.×ÒÒ2((¨¦¦†XùÉ'Ÿðx< OOOyØòHD"Qll¬½½=›Í^¹r¥ü²ƒ&ù455ÕÞÞ~„ «V­gÏžurr233óññÉÍÍ "î))•q*êééùá‡üýý‡<ÂOÇ2 Çq’zÆÀóóˆ±ûí·ßB0?ÿØ×OÁrîÜ9L•øøx£Š(˜ŸŒ!‹-"ý„i,Ä ôO@; Ÿ€v@>í€| Æ(•7…JKKµRùÛo¿aØÙ³g•Z$ê×bCÀ¨@>c”à „PAA±üÜsϾf©Tšíè蘙™9úÚƒûû`Œb±XòeKKKÅ—£ôïÿ[$Œ‰‰Ö¶b±øÔ©S+V¬077_´h‘|èöìÙ“žžž••uåÊ•æææ7ß|!tàÀC‡;v¬ªªjÁ‚Ë–-SL %%%®®®_|ñEKKˈ÷0’ŸwBÃç÷uý÷cõ¡ãÇËeeeèÉì¥ÊÍÍe³ÙÄL£ÉÉÉÖÖÖÄÕŠ  *§IlrU¹{÷îmݺ•ËåFEE©Ÿýodàùý± ú§À𸸸 Ó§OGÕ××k¾mFFFGG‡©©)†aQQQ]]]ƒò?xð@Þ±P__÷î]¢Q„†a,‹ø%9÷å—_VWW/X°`ݺužžžÃÜ9`À ŸÃSSSC,TUU!…ÙK‡$‰NŸ>””$<°páÂÁîò«œ&uÈÉU W®\éêê Ôx·€Áƒ| ÏÎ;ù|þ;w6lØÌb±RRRÓÜ`Î;'‘HBCCYODDDœ={V$ ,¼fÍš;vðùüÊÊÊ7 ½þúëŸ}öÙ¥K—šššöìÙÃårÅZ(¦¤¤øúúÆÄÄxyy•——ùå—ÚÜs0¶Áx)`xbbb"##[ZZ,XðÝwß!„¢¢¢’““Õo˜‘‘±dÉ ùšõë×ççç/Y²D©plllww÷òåËûúú.\xàÀ„Ї~( W­ZÕÖÖæîîþóÏ?[ZZÊ7ÉÍÍÍËËûûßÿîå奵½†æ?;óŸbÆçóçÌ™£´2+++44”¬¨ôæ?Ëà|I[“º¸¸øùùi½Z†Î÷™F0Ù¨ÊòJ?ðs˜R@ÿ´ò)häSÐȧ OQKÅd‡¨îïƒa0Ði“pß‘¿cÛ¢mšo’[žû¬ý³öãíuÕÈÀ„­cäS0 åååd‡0¥¥ÇJ޽âð Óô„¬­±Í?Ó?Ö;Ö—ë«ÓØFÀÖÖ–ì€jð| ¾€Ý…•…¥ñ¥³gk¸IŸ¸µ‰%’Š6ÎÛ¸'|)ÃT§j€ë§€â®ß¿^XYˆaØÅÊ‹šoenbîãâƒ!ìÐÍùbNmk­î"”ùPÜŽŸv0h Ãþuç_ÃÚp±ûb!•Iï<¼óÔ'OýpñE(ò) ²ÊæÊ37ÎHd™Lv±ò¢ —i¾màÌ@bT€D&IEë“ׯJ\Õ-ìÖY°ÀàA>T¶'ƒöÇM×ÇÂÇ·nk¾­‡ƒËâÏUÅžÉÏ|æógn<¸¡å(U@>”Õø¨ñø•ãò‘§ :£°²PóÍimÁS ô?ÇÀˆ¥âížÿâùýÿÚ¯åX%@>”uàßpôçðLJ•OB f-P#‘IÄRñ{ï-ûvYgo§vTã¥5=ê{dÿ7ûaâÊ Ú¿nWú=5jZk\?rUùƒÎà±yg6œq·wm¬€*  ¨éðÅÃB±Pi¥ WPÑ\¡y%.¶.ö,ÕHá8^×V—R’2òå@>$’ˆvçï–à¥õt}X£PBKž]bB7QZÉ 3œ':_‰»’š0ª@µ@>”z5µ­» ©º”UX1¼K¨3%²?ó2FÇöþ‚÷o~vÓk*üèø/ðü> Ç¿:÷•Ê·¤2iAEÁ°j{iÆKˆûZ&t“ÉÖ“ ûMó371×B¬€Z  ¨&ïvÞïM¿cfÆ0xªÞø¨ñ^û=ÍkcY°Üí݉Ÿó{uî«7?»¹hÖ¢ècÑ- rª- SpP̓Ž¿=ü­©«©^PßÜÕ|¦ìL¿¸CXGOqæžôFR”w”æÆeÇ%^NL\“¸ôÙ¥¡ÎÞΧ?{zŽÓœSïœÒÕ>ÃùPœÿnÿ§íŸ>yÇñæ®æ¦®&+¦•‹­‹æ5T·TO°˜`ci#_sþ·ó‹ö/J‰I‰œ©ƒ¡‚ó}@qÍ]Í“¬&!„0 ›<~²‡ƒÇ°’)BÈu’«b2E-œµð ß76ü¸¡^P¯ÍXƒ| (®¥«e’õ$­W»7bïxóñoÎð€äS@eB‰°³¯ÓÎÚNë5[›[>záÎ…ÄK‰Z¯(ȧ€ÊZ·â8NœïkÝüóß÷îæŒÍ5­5º¨ȧ€ÊˆQMº8ß'$„&سì£FkfU@UO•µtµ „쬴¾O°0µ8ñƉâÚâÿ> £&€| ¨¬¹«™i´6·Ö]^S½þô·¸ì¸ßþ¦»V€A€| ¨¬åq‹Ž.ž*úlégÓ즭9ºF>w50NO•µ”…ãxëãVý\?•Û¸Ù×ÕwÍÑ5}â>}¶ Æȧ€²½±T¬·ë§F;öú±‡?>õ±>ÛcäS@YÍ]Í!}žïœ':öÕþ ûÿSñ=7 ÈùPñð¾žû§„u~ë‚f½~ìõÇýõß: äS@YmÝm†)M­†Ys¤«¿ëƒÌôß: äS@YíÝíÖLkœñå°8_¯øú‡‹?äÞÊ%% OeuôtÒ9•‹òŽ ›öVÒ[=$†ôò) ¬Žžö86¹1|÷ÚwR™tSÚ&rÃúùPÖXȧ-'~õ}êÕÔÌÒLr#zùPVGO‡Í82Ï÷ Ë<–½æõÚ;©ïã·…A>”5ú§„ƒ‘ÍMÍ×&­%; [Oeµ÷´‘|:Þ||âšÄŸnþ”TœDv,@‡ ŸÊ;ýS„Ђ™ Þzñ­Mi›îwÜ'; +Oe©|ŠÚ±×ÖÊ6æx ŽãdÇtò) ¦^Qo¿¸,Ü’g6îøëÇ * ¾¿ø=Ù±€| ¨‰B?¦ú§!_WßM/mú 󃪖*²cÚùPS{w;{ù!´ë•]N6NÑG£¥2)Ù±-ƒ| ¨‰èŸ’û¼©Jf ³¤˜$þ]þ×¾&; eO5uôv`6ÁbÙ¨ðÞ_bÅ~|êãÛ ·ÉŽhäS@MíÝíãÍÇÓit²QíÓ¥ŸºÛ»¯>ºZ,“ Ðȧ€šÆÚ`)% #é¤;wvåî"; 5O5 zcj°Ô@393·oÛñóŽÒ»¥dÇ´ò) ¦öî±ò°©±‹c½¦z­9¶¦_ÜOv,@ ŸjêìídY°ÈŽb4Œö}Ô÷µ­µ y dÇ´ò) ¦®þ.k¦µú2áááÙfÙÏê?ßÿùêÏÉD·ÂÃÃõ󹓋œŸÖ@×÷?¶bZ YÌËËkË–-zˆÇ˜íÛ·ìôò) & ó)—ˈˆÐC<Æ,3ÓX~›Î÷5i˜OÐ"ȧ€š Ÿýƒ| ¨ ò)Ð?ȧ€‚úÄ}™ò)Ð3ȧ€‚÷?FA>zö_ùôäÉ“dSZf$ãþ”•O1 kkkÓs£Z¡òËSZ ŠñRúè‚ñŒûSýÓáÄ„  <<<BVVp‡GE>…áx”a<ãþ”ü‘OÍt•0 kmm8q¢Žê×s,ÖŸÏæZZZ*¾šƒë§€‚´Û?åóùÞÞÞNNNGŽÁ0 !dkkÛÖÖ& 7oÞlgggkkûÍ7ßÈ7Á0,%%E¾O¼ÕÒÒbbbR[[›àììÌf³ÃÃÃÛÛÛB2™,!!ÁÅÅeܸq^^^—/_&j7'‘Hâãã&NœIlE”),,äñxGU ¾µµu4ûŽaXNN޳³3‹ÅŠˆˆ·T‚| (èqÿc:naj¡•ÚV®\éïï_[[»wïÞuëÖ555!„ˆãÎ;O:•}ùò圜ù&ÉÉɾ¾¾ò…+VÈßÍÊÊòõõÍÍÍMLLLKKãóùýýýëׯG8pàСCÇŽ«ªªZ°`Á²eË$ ñãÒDs{öìIOOÏÊʺråJssó›o¾)oñ£>úñÇ_}õUùšK—.­\¹ÒÏÏo”»ÿñǧ§§?|ø0&&f”µQ®€¸rŠª #; ¾xØz£õÅ4<>l6{ß¾}IJ@ H$¡ÖÖVlj·nܸ!_¯äÑ£GL&ó÷ßÇqÜÏÏïèÑ£3gÎLMM%Þmhh Óé===O=õÔ‘#Gˆ•2™L Èd2üI>ÅqÜÍÍíĉDÛ·o#„=zDÈÌÌ$Ö÷öö>|ØÃÃ# ##C$ ¹ƒŠB|>_ñåñãlj岲2y‹Ãb<ßCèŸ zÜÿX‹O:”àèè]^^N§ÿù*Ó¦M#–å Y[[/^¼8;;ûáÇ¿þúkxxx]]ݪU«ˆÛèöööR©´¾¾þîݻӧO'6Á0ŒÅb'ûrµhÑ¢{÷îeffN™2%  ¡¡Aþ—Ë­¬¬$–«««ÕTBœògee…„„XZZr8œÓ§O¢+:mÚ4‡SWW'ߤ³³S*ý¯ß”ær¹µµµÄ2±Àápˆ—4(àé陟ŸŸ››+¿e?J555ÄBUU•b‹` æÓ®®®>øÀÁÁÁÌÌÌÁÁ!&&Fþ%Óú°5]Œem*‡ª¯FöéÚc¡6󩇇G\\Ç›3gŽãL&=`µ}ûöË—/WUU½ÿþûòMRRRˆÌ(_X²dÉï¿ÿ~ðàÁèèh„ÐêÕ«ãããKKK«««×®];oÞ<„Ð믿þÙgŸ]ºt©©©iÏž=\.·¯¯¨hnÍš5;vìàóù•••7n Vº?kÖ¬Ÿþ9//¯¡¡áé§ŸŽ‰‰¹~ýú(wçÎ|>ÿÎ;6l Z”ïP¦xò¯áõS©Têëëû /”””´´´”••½óÎ;<¯¿¿pýeôO „ ˆeâ:½VŒ2`¤ê’™ú:µ~ˆc<×­”¬K^7Ïü!‹ix|.\¸àîîÎd2]\\ÒÒÒp÷óóc2™íííB¡pË–-Äýý¤¤$ù—!”œœ¬¸€ãøŠ+x<qIT$ÅÅÅq¹\KKË   ššbå'Ÿ|Âãñ,,,<== ˆ å͉D¢ØØX{{{6›½råJùOå7ª§§ç‡~ð÷÷×äˆÉ¡×OwíÚåêêjmmÚÒÒ¢´Sš0žïáHòibbâäÉ“»»»WÊsœî’…Žj2÷©¼Ã ¾€æùtÈúGÃx¾ÇJ"G.;¸lÈbF{|4§ò›ŒÊÊÊÒ¼ã9Î#9ßOMMݰaøqãW²X,ÅëôjÊ¥§§s¹\++«­[·¦¥¥q8kkkù¹’ÒÀ=5aÈÇÜmÚ´)00Íf›››»»»ŸX%DÿQMÙ³g߸qãÖ­[^^^‹/–‡zàÀWW×âââêêêàà`ùÑHUÿTMaõGL ãé( ØðvÊÛC3Úã£gÆsœG’O ÆåË—ÿ¬â @€?IjÊW…ˆ—ŠËCžȨ̈Ę»ÎÎNùåÔŠŠ ¤p ëÔ©Sòú‰•*Çòù|5• j ȯs×þ;::ˆ:UŽ1Äɧj øˆÏ÷XÉì³?ÌúpÈbF{|ôÌxŽóHÎ÷9Ž|Œ‘FGÔ ”³´´DO†w(.1殳³3>>ÞÏÏÃá¬]»V±€½½½Rýƒ%TSÉ\]]‰…3f „‰—*Ƕ/j kñˆ‰®¾.8ßú7’?Ë¥K—:tH>2ŽÅb]»vM©ŒšrZD¤??¿ÚÚÚÝ»wß½{7??_±€Òph4øXB5• Y@>ð°¢¢Ã0â¥Ê1†ƒí˰ õ´;^ $Ÿ~òÉ'ÁÁÁ¥¥¥999Ÿþ¹R™!Ê fàÀ½!‰ÅbOOO77·;wî¬^½=9ãVIåXBõ•CµÔˆ‹‹»uëÖíÛ·ß~ûíððpù,g*ÇDÔ¯aa  í>¥o¿ý6†agÏžU\)ª c– ƒâÉ¿æÏïß¿?22r„ ÁÁÁDTñú©&åT.#U÷–W|yöìY'''333ŸÜÜÜ   3f ¬ŸˆaàXB¢Ø`•ȇþ©i%55ÕÞÞ~„ «V­R:Ç*¦8´pȃ-Æx®[)’H%Ø[ØIþÉ!KŽã#‘Hlmm_{í5ÅõŠú³¬ cç8ë̇BeÆó=Vô¨÷zåÝʲäØ9>çÏŸ?~|FF†µµ51…ùÔ°Àm @5…†79FFFHHÈ’%K$Éùóç+¦rX·ÊYSåˆq):߀‚ùPõ܈ÅâS§N­X±ÂÜÜ|Ñ¢EŠŠ(Q9ÿ©ÊYSå›”””¸ºº~ñÅŠOš| ¨¦»¿!difIv šºpáB(00!´|ùò³gÏ …B•%=ºmÛ¶¹sçN›6í›o¾9}útWW×÷ßÿé§Ÿ#ù¶oß^]]­ø¤â¢E‹.^¼ØÓÓ3{öìÕ«WÿòË/úÙ)ãùPMŸ¸!¤­Éùõ ##£££ÃÔÔ𨨨®®®ÁNùUërÖT÷å—_VWW/X°`ݺužžžºÜ£ùPM¯¨!dnjNv ‰D§OŸNJJ’Ï£¶páÂÁ~HQå°î!gM%TTT\¹r¥««‹è]€| ¨¦OÔ‡271Œ|zîÜ9‰DÊz"""âìÙ³"‘h`a•úÕÌšŠ …)))¾¾¾111^^^ååå_~ù¥÷ϸ¨ø½hcp÷n›““ž~ìèYŸ¸N£›2LÉD#K–,±°øóêDHHÈúõëóóó—,Y¢T866¶»»{ùòå}}} .Us{‘2¾û®üµ×ܬ¬FûÓ:c\}}=—Ë%; }ëõJç!”ššª´ÆÆÆF,Ëø“ù†ä ŠåMLL¶oß¾}ûv•õ/_¾|ùòåÚŒ NE>]±b…þãÐ'ÍÂÎî­M›¾êí½Iv,:FvúÖ+êƒOÏ;·xñâë?þøã;wê?  ÿ•O#"""""È Eo.üôÓÓþþѹ¹[ÈŽh_Ÿx,öO-Z$ïcª2ÆûQÙÙ×B7n@Ñé´S§”§Ð'îƒçûÀ]>=sæW:BH*•<É'; }†u? P‰ÑåÓŒŒ_$)BÇñªªæŠŠ&²#ZýS@ãʧååïÝk—ß01¡Ÿ9ó+©íëõBÿ¸ÆóŸ:uÝÔ”!ý1ûŽX,ÍÌäÿío‹þ, 0\úU__Oú€kêFšZF_#£èߣñŒƒ¦æç§Žã™™|y2%44ÊÊ<÷¬¨€Öõ‰ûl­l5,\RRBî€ëY\trªhAá{ö”Œd´åÓÒÒ»--]J+MLè§O_‡|J%š?lÚý©úºöW$Í/Y°C IDAT\ö ¾{#ÉÁ€Q3¢ë§§O_75UþÿC,–fg—J¥2RBºÐ'2„ûQ¢tq)*}ÉD!4%ˆì€€K>•Hd99×”Nö =%%µú èH¯¨w¬ç˜‹~rCÏ!âÞ¨…²‚ß§cɧ—/W=zÔ¯ò-: ì§’1=þT&D×6¡ÿ#á#$#„f‚ì•ç‘ÊXòéÙ³e!ƒ>ðŸD"ûç?oˆÅ*¦à†hìŽ?}\‰Î=*!„#$ÿ¾IàdŸ2Œå~”Ÿß4Å›N~xrÕ*ïgŸu¯éîîŸ0a¡-›ó¡ Šýè×®ô?7ÙÍ#'$ mÆ’O—-{Nñ凞|ñÅiK—zÐ^ᛯO$@%1¨á4R1¿†&ÎE&óS¬@=cɧÀHà8Þ/éC÷£e¨èÔû@U2EˆÆ@“¢e,×O‘J„8Ž¡ó} 4á9„K‘Êgðdb4y¡ÞcºùP ñcÑcè|ß̽˜^ÈDŒñˆ6à÷uL' ›9d„tò) ”?~,zìôO ¡hÉïhü,„z©q²sGPäS@)üXôØéŸÊIºÑãjÄùDg"qßB†¦,"9* UO¥çûcè~A&F—"ËùŸFA¿ ëéaÇÑä@²#ÚùPÊýÓ±v¾ÿÛ—¨«ù¤"ŒXO£E×ÐÌ¿!Ö3È| Ù‘m‚| (eÌÝBµ_E·w¢ç¾B–SÿXC3Cÿ‹^ú©aíƒ| (…èŸ2L²yBÒ‹Š£Ñ”…Èm½ò[f6dtÆóJJ„!¦É˜É§·>CýMhþy¸o ŸJJ„†™ÐŒô$‹K š<Y8 ]>ȧ€RD‘ Ýd ý ˜õtd=ì €žÀõS@)B‰ÐŒaFvÀHA>”ùò) ‘DdÊ0%; `¤ ŸJþ) äS@)B±äþiã9$ äS@)"©ˆÌþé£rtq9ª=NZ€TO¥y¾/íG—ÂÑDo4ý¯äÈãO¥y?êÖ§¨¯ÍËGtSŒ|ð€RH럶¢;{Ð_ö! îhªÁ0¬­­M[Aé¡ÚÒÒR­W;¦Zȧ€R„b2ò©¸ •¼ŽBÑÔ5únŒ%O¥ˆ¤dœï_IúÐó‡ôÝ®–è¨÷ª-ƒ…7Æ| (…œþéähîad6Q}©ÖÖV¥5|>ßÛÛÛÂÂÂÉÉéÈ‘#Äʬ¬¬É“'ÛØØìß¿!TVVÈf³ÍÍÍÝÝÝOžìáá‘‘!‰” °Ùì}ûöË€è]¿~Çq©TJä ¢sD”©¨¨PÌ2™™™8ŽÏœ9355•(ÐÐÐ@§Ó{zzœ‰•7nÜPÜêøñãÄú²²2„УG”Q­&ņ̃*£íììd2™õõõR©”Ãẹ¹8q‚(vûöm" |¤ùTå Ȧâ²RØ÷îÝÛºu+—ËŠŠºzõêÀrÈ„4ØÔù”ªü¿ò'å²£Àq?w­íÆïܹ3X™ôôt;;;·f͚˗/ã8Žjii!Þ%òÅÝ»wãââ^|ñÅ)S¦(õ4‰?lssåw©¨¨`2™EEED=}}}Š[)­ÿí·ß”Q­&ñLLƒE¼ÿþ‚‚'“ɘLæ¥K—”ÂÀGšOU…U.+êïïOJJòððxþùçUîïàú) ¡Dhf2&žßçr¹žžžùùù¹¹¹ê'P-ZtïÞ½ÌÌÌ)S¦444 'WåüüüjkkwïÞ}÷îÝüü|Å·h4BˆÃáœ>}šø{–Éd`Ú´i\.·²²’(V]]­¸UMM ±PUUEl®Q­&ñ4X´YYY+W®Ä0ŒËåÖÖÖo ò0ˆ|W__¯a‹ƒÍ7—«¨¨¸råJWWW` êß²äS@)"‰È”>&æ—š5kÖÏ?ÿœ——×ÐÐðôÓOÇÄÄ\¿~]©Œ‡‡G\\Ç›3gŽãL¦ŠŸi‹ÅžžžnnnwîÜY½z5B¨££C±ÀêÕ«ãããKKK«««×®];oÞ<„PTTÔöíÛ/_¾\UU¥tûeçÎ|>ÿÎ;6lf±X¡S“øBÝÝÝOH¥ÒÁ¢]¶lYiiizzzdd$BhÍš5;vìàóù•••7n”‡Áb±Îœ9ÓÕÕõÅ_(¶2XB'Ö«<š …)))¾¾¾111^^^ååå_~ùå° üi°ž<µÁù>UÍÚ6kÛ™m:o¦½Çešïééùá‡üýý•Ö_¸pÁÝÝÉdº¸¸¤¥¥áªNxÏž=ëäädffæãã“››DÜBONZE"Q\\—˵´´ "î´…Â-[¶÷÷“’’¹ó®]»\]]­­­CCC‰k ~~~L&³½½ä\x°ø•’ ŸÏ,ZÇ—.]:kÖ,bY$ÅÆÆÚÛÛ³Ùì•+WÊw9))ÉÎÎÎÆÆ&%%Eó`áÉ׫<¸Æçû999‘‘‘ÅÅŃ}|CÃcÀálùÇ?Ö,]êAv @ËÜ>v‹ö‰þøåu؆àW”ï…|R/\‡­è†a|>Μ9úo:$$ÄÓÓó£>ÒÓzçû€RDÏ/%éE—_E“ ^˜[¡–ÞÞÞ«W¯ž?~ÕªUdÇ¢[0  ß*‹E"ò:j ¿ÿLÊùh^^^ttô¶mÛõߺ>A>”"”ux?êaªüùå æ$]5AE¡¡¡¡¡¡dG¡p¾(E$éª*ê@WßDN«7D'õÃùPŠÇKñ7 =P'•J€| ¨C†Ë$2‰Næ—Âeˆi‡<¿G&ãµ_9  ¸~ ¨C"• „Lè&Ú¯£¡Ù_k¿Z@-Ð?Ô!–Š‘Žò)€| ¨ƒÈ§ œur@>ÔýS@.ȧ€:$2 BÈ„ùò) -Ÿï÷7k§`4 ŸêÐæù~[1:ãŒ:®i¡*`4 ŸêÐÚx)qº‰&¿„ØÑBXÀh@>Ô¡µóýk›‘´ÍM4ÐIOY`d  Ž?Î÷Gy?ê~ª=†üNä'`¸  ¨ãûû£9ßïoBü·‘ˈ»Lka£ùP‡îGý²™N@³¿ÑZLÀ˜@>Ô1Úë§â.$lGž? Æ8m†Œ\?Ô1Úûû&ÖhÁ%mŒ ôOuÀó¦€\Ouüq¾O‡³.@ȧ€:´p€Q€| ¨C,cóõ²@>Ô!–ЇLeBÝÄŒäS@©dxù´é_è§é¨¯QgãùP‡X*ÆÃ¦ýÍèJ$²™‹Ì§è2(`DàJ“1Ú»woqq1ÙQh_ƒiÓ”®Ia»æµÝ[súíר<¹¼½½ß{ï=²£C€|jŒŠ‹‹KJJ¼¼¼ÈDËìEöö"{ —5ÛýõÂ"±ÔNÑJJJÈhò©‘òòòÊÌÌ$;   {Ü€tðŸ3ȧ O@; Ÿ€v@>íÕýýâââ½{÷j+}²´´;p`Or²á=k86Ç!bÖÚÚ:qâD²…m GŒÞ¨ú§<ÈÊÊÒV(úôì³Í,–á%Ó’’JŽÃ€´0þ†1ê éãõÜó¢dG’;pý ŠÏç{{{[XX8999rÃ0„­­m[[›P(ܼy³­­í7ßüùëu†¥¤¤È‚ƒƒãã㉷ZZZLLLjkkœÙlvxxx{{;BH&“%$$¸¸¸Œ7ÎËËëòåËD òæ$I||¼ƒƒÃĉ###‰­ˆ2………<ïèÑ£JÁ·¶¶ªßbeVVÖäÉ“mllöïß*++ d³Ùæææîîî'OžTj(11q`üjŽFNN޳³3‹ÅŠˆˆhooWÜ)õñƒ„BFFÆ(kæ·z¦NÛØØ˜M£ÑšššB­­­8ŽÇÇÇóx¼¢¢¢ŠŠ ùúäääÚÚZùBRRÒSO=EÔöí·ßúûû8pÀÕÕµ¸¸¸ºº:88˜ã믿vpp(,,lhhˆ·±±‹Å8ŽË«Ýµk—‹‹KIIIEEÅüùóCBBˆ:B>>>EEE½½½ò°‹ŠŠV¬X1cÆ Mvgùòå £¿¿úôéëׯ¯««kjj:r䈙™™P(Tl諯¾ÿ`G!4cÆŒ’’’òòr__ßeË–)îÔ`ñøó¤ƒ|jHôœOÙlö¾}ûˆe@ ‘Hä¹ÀÙÙ911‘xëÆŠ9BÑ£G˜Læï¿ÿŽã¸ŸŸßÑ£GgΜ™ššJ¼ÛÐÐ@§Ó{zzžzê©#GŽ+e2™@ Éd¸Bêqss;qâQàöíÛ¡G233‰õ½½½‡öððÈÈȉDšìÎõë×q—J¥D[‰„(SQQ¡˜‰†TÆ?ØÑ@?~œX_VVF„­”Oåñ«ùÔPÀù>Ô¡C‡£££ËËËétºü­ÆÆÆiÓ¦Ëò…¬­­/^œýðáÃ_ý5<<¼®®nÕªU†afoo/•JëëëïÞ½;}útb ÃX,q^,÷àÁb™X¨¯¯'^òx<„P~~¾££ãÍ›7ÓÒÒ """LL”'îS¹;\.!D£ýñ‡ÐÙÙïççÇápÖ®]«¸9ÑÊøÕ yØÄÊÃVªPäS0¨E‹Ý»w/33sÊ”) ò·¸\nee%±\]]­¦’+Vääädee…„„XZZr8œÓ§Oÿ™]ÑiÓ¦q8œºº:ù&D‡Q±¹ÚÚZb™Xàp8ÄK"r¹\OOÏüüüÜÜ\@ ùî(%n??¿ÚÚÚÝ»wß½{7??_ñ-¢!•ñ«9555ÄBUU•bØJÕjÐÓgÙÕÕõÁ888˜™™988ÄÄÄÈÿ81 +--Õb[Z¯p ¶¨qqq<oΜ98Ž3™L„‘­¢¢¢¶oß~ùò媪ª÷ß_¾IJJ ‘å K–,ùý÷ß<Z½zu|||iiiuuõÚµkçÍ›‡zýõ×?ûì³K—.555íÙ³‡ËåöõõÍ­Y³fÇŽ|>¿²²rãÆÁÁÁ,K1ÔY³fýüóÏyyy O?ýtLLÌõë×5Ù%b±ØÓÓÓÍÍíÎ;«W¯Futt(Pÿ`G!´sçN>ŸçÎ 6ÈÃ,ãƒ7š‹^?•J¥¾¾¾/¼ðBIIIKKKYYÙ;ï¼ÃãñúûûqGñùüÑ„¡DëŽõ|ýôÂ… îîîL&ÓÅÅ%-- Çq???&“ÙÞÞ. ·lÙBÜÑNJJB W “““p_±bÇ#.‰ŠD¢¸¸8.—kiiTSSC¬üä“Ox<ž………§§gAA±¡¼9‘HkooÏf³W®\©xýqà‘ïééùá‡üýý‡Üôß—2[[[Ïž=ëäädffæãã“››DÜ×’7¤2~5Gc×®]®®®ÖÖÖ¡¡¡---Š;5Xü#þ¼éô‘O'OžÜÝÝ­¸’¸!€l>UúS”·ˆ¹3£zΧ`”´õU„ÏËPèã|?55uÆ ãÆS\Éb±ïo¨`˜žžÎår­¬¬¶nÝš––Æáp¬­­ågUJU rPáË/¿,X¶¤¤dâĉ}}}ƒÅ@Œ”/+"”S\ãøÀŠšìÀ@é#Ÿþúë¯Ï>û¬ú2{öìIOOÏÊʺråJssó›o¾)+55õÆÇOHHHNN¾uëÖ±cÇöîÝKÜ—HNNöõõU\håÊ•nnnׯ_¿{÷î–-[V¯^-‰"""ä˦§§‡……íß¿°”àOú¡JO¹(®ÿöÛoÓÒÒø|~ÿúõë5Ü#@8ŽÏ™3‡ì(€¦s«áù>ƒÁ¸|ù²ü¥¼i@€?9'R3À¸šFÜðU\ìLjà[*vvv2™Ìúúz©TÊáp ÕÄ t•màÊçû**Žläà|ß8Áçe(ôÑ?åp8òÑ$DUyCP3ÀÐÒÒ=V¢¸¬9•ƒ ǘ}ñâEƒñâ‹/ª‰aTTÔÖÆ }ü/]ºôСCò…,ëÚµkJeÔ 0½Á§ü+W®Ä0LM 8Ž£a¦W•µµG€1Hùô“O>ill .--mllÌÉÉùüóÏ•Ê 9Àp0<"„º»»;ŸJ¥ƒ *\¶lYiiizzzdd¤šX,Ö™3gººº¾øâ ŦEH¬W9PÑÁp``<ô‘O'MštåÊ6›½páBWW×cÇŽ œâ/66ö•W^Y¾|¹··÷¤I“Ž;¦aåQQQÄtDò„мyó&<ñ믿~ÿý÷äp8ï¼óNtttPPвeËBÖÖÖ ,°··'n— Ã7ß|?uêÔ^xAÞ®ŸŸß3Ï<£4Ø[qýÖ­[ƒƒƒ—/_þÜsÏ=xð ;;{Ø`P0\áÑp?/0Æ{¤··÷êÕ«çÏŸ_µjÙ±PÇÀYG2ÄáÀÄ5;5d` Œ7ŸæåånÛ¶ÍÑÑ‘ìX¨àÒ¥K+W®ôóó²¤!.))quuýâ‹/ZZZTÆ0d`F3Ø æ?Õ³18þtÈYGU†ß»woëÖ­\.7**êêÕ«ÅF ÆŸ ãퟂÑÓdÖÑ t80ÇûòË/«««,X°nÝ:OOÏá”ùŒœ&³ŽdÐÃ+**®\¹ÒÕÕ8²€Â Ÿ‚‘ÓdÖQD‰áÀB¡0%%Å××7&&ÆËË«¼¼üË/¿V`Fs±®ŸêÙ¼~*7ج£Jß7>Ÿ?Ø£8Ž/]ºtÖ¬YÄò`sž&%%ÙÙÙÙØØÓ‰ë›TTqÕó–â.¶ª\Æq<'''22²¸¸x°Ý²ÀhÀõSCaìãOå +æÎÊd}ùD†8þtX k8°ÞŒÙÏ (aŒ¾ ¥_à1PÏ2™®ÁÓ£ÃÂÂÈA'z{{oݺuþüùýû÷“ #4ª|êããCœòSÀo¿ þý…>Z»ö)SÓ±{YÙÁÁìt"///::†ƒ6ª|Êår#""´ ¹îÜyxøðï5533[ÒÒÖ[X˜’‘q %; FeìvÄôÌÞžÂq¼¬ìÞ²eßtvö’ÀÀ@>ýƒµ5“蓊ŲÊʦ°°o!¥†ò韦LO,ˆÅÒªªæÐЃA¹! äÓ?ñx6ý1VA,–VUµ„†~ ) !ȧâñlLLþ< ‰´ºº%4ôÛŽH©úÐÓ,Ôö“#§…ñ§”Áá°”ÆÒ>I©³³ße³Ç‘˜.deeÃN³Ú½6ÃÊó“òå=’.²Ã‹¨:î˜bFõ|Åää\Û´)U&S> ÝÁ}êÔÆI“¬H L늋‹kkæš5¾ÿøÇzz„dÇ2Vô´ˆŠ©ü囲€dO‡mýú‘H’’RLv c‚ ¦ïtÔï{fŠqQȧÃ6a¸×^óþî»÷÷‹ÉŽ…d-·{~z³ÊrŠiðÓ,lLÈ’A>‰·ßžßÕÕŸ–v•ì@ÈÔðËãÜ·«&>eþòwnfÖ04 ȧ#2i’Õ«¯ÎýöÛ‰ÅR²c!ǃË]ç·ÔØ{Y}íÊ0‡oA>± ^jm}|òä/dBŽ{;|­çáL7…é øb0Œî¿%\†#„0$Sþdt‰@‹Þ}÷¥†Á©S×È„ e2Å0¬´´T"‘`ÖÖÖ6‚F³-ºùtäm–/Ÿ½oßy©TõOw‚!Ñéôääd+«‘L,=šmÐȧ£²eËÂ:þùÏdb¨0 {íµ×ÌÌÌ{WM÷Sq[訂±òé¨89M|ùåg÷î=/“Q÷24Žú:Ô´Å0,==ËåZYYmݺ5--ÃáX[[¿ÿþûšT/O…|>ßÛÛÛÂÂÂÉÉéÈ‘#†!„lmmÕ§Ô¶¶6Å’8Ž'$$8;;³Ùìðððööv ƒTj]³CÀÃÁèTT4ÚÛoÉͽIv :!“âwÞK[r["” V!ÜÖÖ–••…Z¼x±|¹¦¦FÍV|>ŸXhmmÅq|êÔ©±±±ÙÙÙ4­©©Iþ–šJˆò…¸ººWWW‡……iäÀÖGr¼€qƒ|ª¯¿ž¸`Án™lÐŒc $Bé¹ÍÕÇ_,{xí±šb¡‚‚Ç¥R©Ò2‘1ÛJ)Ÿ²Ùì}ûöï ‰D2‚|:sæÌÔÔTâ݆†:ÞÓÓ£I[êð  Î÷µà½÷‚~ûíá¿ÿ}‡ì@´IÜ+Í{·¦åVÏËß»Mù‹¥ú–––!¦´<,‡JHHpttŒŽŽ.//§ÓGòÌU]]ݪU«0 Ã0ÌÞÞ^*•Ö××k¤VZFò©¸»ÛÏŸ?cß¾ód¢5ý’®¯êªï_rxÚħ,ôÓè¢E‹îÝ»—™™9eÊ”€€€††‘LXÅápNŸ>Mtd2™@ ˜6mšÞZFò©v¶>»uAIDATlÞtýú½K—*ÉD zZÄ?¿U)z,]š8åÌÔ[»qqq<oΜ98Ž3™L„@ Ðps¢äêÕ«ãããKKK«««×®];o޼ѴÀ°@>ÕŽÙ³_xaÚ×_ÿÙhAçÝ~Œ†½ü7Ë)¦úl÷È‘#.\pvvŽMNN¶±±ñóó{æ™g:::†ÜV^rëÖ­ÁÁÁË—/î¹çÕ²_ú¿ÿûíæÍd¢©®zøaA´ò©–-X0ë™g4Œ.jÕ?;2C˛ʺÉ*€|ª}ï¾ûÒ?ÿyó÷ßÉd7“š ?»;w‹ýd!hò©ö½üò3Ó§O>pàÙ¨óËþÁ‡þŸ:¹¯œDv,PäSíÃ0ìÝw_:{¶¬¶¶•ìXTÀeèÒ®û·RZæítr f“ÔùT'–-{ÎÑÑf vQeü?ŸÜ­ú©cáÞ©SN ;(ò©NÐé´sr®Ý¿ßNv,ÿE"”õ´ˆîsqðOv,P Œç×±Xúâ‹»¦'$„“ @ ª+&&ôwÞ™ŸžþKcc'Ù±ôò©­\éiccùÝwdÐȧ:djÊxûíyÉÉWš›»ÈŽ sOu+*ʇŲ8|¸”Ö7ŽRRšÀA>Õ-33Æ[où?~©½]ßÏtvTõ}½’ð¡žÛÀhA>Õ¹èèÌÍM‹ôÙhÃÕÇgߨ˜àjî¹Ñ^Ÿí`Ì Ÿêœ……iLÌ‹‰‰=êÕO‹w :ó7Ws½­ƒ¾va˜ÃG €žÀ›>ÄÄøÑh´£G/é¡­ÊŸÛÿ[粈ýR‚3ÝÓC‹äS}°²b¾ñÆ ‡vwëv²ÑÛé-…ŸÝ›¹ÂÖ›#Fƒd €^A>Õ“·Þò—H¤II—uÚŠð‘ôéU“¼ßã"È¥èí€| Úù´Ã¸òiWW×|ààà`ffæààÓÐÐ@¼…aXi騞YR¢õ 5¡f)‰ÜtôM` ÌÍͽ½½ÕW¨a‹‰ð¶¶¶ÑÄF4§T‰¶j¦*#ʧ2™ìþç®^½š••U__ÿóÏ?3™L¡P·sæë åwP 5ö·  @ ‚ÊÊJW^yE"‘Œ²N:žœœlee¥•õS3Eý@„……iòLNbbâäÉ“»»»W ‰D‚ã8BˆÏçk1*­W8X+­­­Ä²úÔ ? õˆç£†,Fú:ú&”jhooGUVVjƒÒ»ò/ƒVè¢Bj?eDýÓÔÔÔ 6Œ7Nq%‹Å¢Óéò—‰$>>ÞÁÁaâĉ‘‘‘Ä÷!„aXzz:—˵²²ÚºukZZ‡Ã±¶¶~ÿý÷åRRR*++ d³Ùæææîîî'OžD½üòË{÷î% ”””Lœ8±¯¯o°äçYÄ2ñ´‰­­-±^ýbVXXÈãñ~øá ë'rrrœY,VDD„¼ðX@ú*Ççó½½½-,,œœœŽ9‚ãxBB‚³³3›Í—7ªTl`=Dä c°*¿HJ_âT³û?ýô—Ëe³ÙT^VVÖäÉ“mllöïß/ßvì7HCvB× ûD&L8{öì`ï"„ø|þ®]»\\\JJJ***æÏŸ"788¸­­-++ !´xñbùrMM ŽãÉÉɵµµŠ h@Wbúôéëׯ¯««kjj:r䈙™™P(<~ü¸··7Qà¯ýëºuëÔÄ ï,È—W¹ƒ>>>EEEÛ¶mVý3fÌ()))//÷õõ]¶l™úƒ¬Ïþ)é¨|ÍÔ©Sccc³³³i4Z||¼««kqqquuupp°ü€(kjjR¬³««ëÃ?œ;w.ŽãPYQ^å Wõ ªÙý   æææììlƒÑßß?XxË—/ïèèÈÈÈñw7‚þ©åSƒqùòeùKùÿ(òMuss;qâQàöíÛ¡Gïà8.•J•–;ÿøVgg§üÔ»¢¢‚ø^vvv2™Ìúúz©TÊáp ÕÄ >Ÿ¹ƒ™™™8Ž·þãÇ+ËÊÊä…£Ï|Jú*_Ãf³÷íÛG¬Ó§OOMM%^644ÐéôžžžÅ^'¥Óé………8ŽÏœ9Se D‹*¿H¸ªOPÍîŸ:uJ¾ËÄV*û~ýºR±7p#ȧFt¾Ïáp*++å/ÁÀ{ß>ÞÏÏÃá¬]»–X9~üøÀÀÀììì‹/2Œ_|QM £ÜA§~U’ž>}ºæÁèé(zr–}èС„„GGÇèèèòòòû÷ï¯ZµŠ¸kooo/•J‰F•Šg÷òûQÍÍÍŸþù+¯¼ÒÝÝ]WW§²‚Ê/’JjvßÞÞ^i—U†GÌ­7Ø‘³ß ²Q>]ºté¡C‡ˆÿiB,ëÚµkJe¸\nmm-±L,p8màççW[[»{÷î»wïæççË×GDDdeeedd¬\¹Ã051à8ŽÿÖ¹ƒÄ_Åp믩©!ªªªVÈ(éùutt¬««“¿$ކ³³3BhÑ¢E÷îÝËÌÌœ2eJ@@Žã§OŸ&:,2™L L›6m`1"û[ZZ²X,‹5iÒ¤÷ß¿½½½ªªŠÃᨬ0Øi 5»?pª'•᩟jÌ~7ÈbDùô“O>ill .--mllÌÉÉùüóϕʬY³fÇŽ|>¿²²rãÆÁÁÁ,K“ÊSRRˆ?6ùB¨»»»ó ©T*‹===ÝÜÜîܹ³zõj„PGGBhÙ²e¥¥¥ééé‘‘‘jb`±XgΜéêêúâ‹/›šïàêß¹s'ŸÏ¿sçΆ 4? z çôõ×_ߺuëùó盚šJJJV¯^ýÊ+¯°Ùl„‡‡G\\Ç›3gŽãk×®/--­®®^»ví¼yóˆ:•Š1™L¥F™L&†a«W¯VYa°/Rø2Œ`÷‡ o 1ûÝ ´Lókv÷ïߌŒœ0a‚……Epp0ñ?¶âå6‘HkooÏf³W®\©x5J~íLå2B(99YiAŸÏ?{ö¬“““™™™OnnnPPÐŒ3ˆz–.]:kÖ,by°’’’ìììlllˆÛÍÄz???&“ÙÞÞ®á·~„Ю]»\]]­­­CCC[ZZ´õY¨¡áõS\¿¨D"Ù³gÏŒ3ÌÍÍ?øàƒ®®.b« .¸»»3™L—´´4‘HÇår---ƒ‚‚ˆ\‹áª®ÉÚÚÚúûû777«¬AýIñË@|‚î>±^exj.Ù÷»ÁõS*üÞ 1‡±AÏ'âééùÑG‘ˆ2 Ãø|þœ9s4,¯•ÏâäÉ“+V¬ À7“Ú†ûÝ 6ÉÈȈˆˆÐ]Tä2¢óý±©··÷êÕ«çÏŸ_µjÙ±F…"¿wb¸òòò¢££·mÛæèèHv,*@' ¾A>%Yhhhhh(ÙQ´Î÷@; Ÿ€v@>í€| €þÔÖ¶’Ð!ŠÜ*))!F>'‘ˆ^_o5nœhüx“9ÚÙˆG£¤¤ÄËËK+UQï½{w<†aŽŽdt… ùÔÛÛ›ìHfj*7N\]ÍF1²ñã…ÖÖB++‘¥¥Ãô:¨ÅËËkô‡ƒƒCXX˜Vâ;îݳnh°ru ]”ºÂÂÂÈŽB‡¨ð| |ðÁÉ,Fa¢ÑhR©ÌÌŒááÁóõu{þyçÙ³,-ÍÈŽÑI¥²¸¸¬ÔÔb„ЩSçÎJvD@W ŸR‡X,}啃7nÕ­®®þ¨¨~ýõ>ñ?œ•³¢bÙA‚ûû”Âá°ŽVÓï %t:mÏžH¦ºÖÜü(8xŸ<™"„¦NDnH@× ŸRÍ /¸}úiÈ`)•FÃ>ø`Ñ´i“õ”ѹ{·-8øë»wÛåÉ”Á ?õÔr£ºù”‚Þ|Ó/4tƒ¡üáÒ阫«Ý† /‘•ñ¸sçá’%_77w)^Ȧѫ+ôO)ò)5}õU„››RJÅqäâ2éÞ½6²¢2¥¥uË–xô¨Ÿ¸%'É\\ ŸRäSjb2MŽÓÜÜT~ŸÁ ……=ï^[`àîýûÿO,–ª¯Œ@AÁïáá‡úúDJC,BáÐ?¥<¸¿Oe/VDF~/“á†Mž<¾¨h+“iòã%Û·Ÿ™8ÑꫯÂ_xaÚе͜?{íÚb±TåߎÕÖî61¡ë?0 7Ð?¥2?¿éï¼óÿíÝkXgà DD#«(¬-j]°¸\Ku7« ÑD~©‰‰¡žÃÏ}éR„­­¥@|´¡¡™ê˜:bêTËE‹¦ahØÃm‡––æ(¦:ý©ŽS*Û‚T&Ó0=}u——$’›QQ9zzŒíÛ—º¹9PO÷Ü»W“˜xöìÙo‡ c´µ½8…Ê`0¸\»ŒŒ® cPOuߣGÍmmбcGv©±ñY|¼äèѯ¸\»;–?äŸ÷«!6d]ºTöðác}}=¥²ÝÐpØš5s¢¢–P >ïë¾Ñ£M{,¦A˜™'%ñsrÖ——×λó_ÿ*éíÆ*P_UUÃgŸý'8˜›žðæ›côõõ ¥ÍªsÁ€C AÏŸ·¥¤îÛWààðû]»S¦Œ¥:‘Û´éߥ¥å/†è+•í99_‹Dç\1cÆ›TGƒ…z ¿úþûêÐÐãß}Wõþû.aa z¼®}“Ér¹¢ýû}==ÿÔ±R.W½\§]‚z ¿¡P´§§_Þ¹ó¬µõh‘HàèHǧXÓ™¿¿¸ºú±T‚黆 œ?…ß6Loõjç°qãFº»ïݲåDSS+Õ¡´Æ÷¿øâvxøbÓ¡ ý)ôJ"¹™3l˜~B‚×Â…öTÇÑï¾»ßÀ@ÿĉuTj ?…^¹¹9\¾ÁãÙ|¼vmF]]Õ‰h­°ðεk÷#"𥨡 ý)¼Ü… ?„‡g?yò,:ÚÍ×÷/ø0Û]{»ŠÇ½ñƱøïTgÊ ?…—ãpþP\,\±â¯'½¼RîÝ«¡:íäå}SVösd$šÓ! õÔbllµD* yöLÎãíÚ½[Šª:ÈåŠ;Ïzy½ƒù†8ÔSè‡iÓ&H$##—:taáÂä›7ÿGu"Z8zôjmíS¡pÕA€b¨§Ð?¿|¡j ‹Åtwß“ÛÜ<¤¿PÕÔÔšœ|~ÕªYãÆõ|S/ ¨§ð*&Nd;¸{÷{§N}=ožèâEÕ‰(søðŶ6EP—ê @=ÔSxE ÃÛ{Fq±pæÌ7}|R×®ÍxôhÈM¥ZW×tð`ÑÚµœÑ£M©ÎÔC=…×ba1bß>ßO>YóÍ7..‰ÙÙשN4¨(055\»Ö…ê @ ¨§ \®]II¸@ðçc+V¤UV6Ph0TTÔ9ryÞ‰‰!ÕY€POA3È/TååUV6Ì™“˜’R¨T¶¿üÇ´Ù‡žŸ0a”Ÿß_©tû£@ÃÚÚ”iiÅ"‘têÔq»v ìí­¨N4 Èyùöî]¾t©#ÕY€.POa@›šœ—ÏÚš•ž@u ô§0HÌ̆oßþnnnЃu޶>›:7÷ëÿþ÷çðpL}=@ ƒ­ã Uü£µv=›Z.W89í`³'}øárª³¡?…Áf` ¿~ý<©4¤½]ÅåŠþùÏ3Ú2•jfæÕŸnܼy!ÕA€¦ÐŸeT*ÕÑ£_mßþÙ„ £èÿlꦦV6;~éRǸ8Oª³M¡?Ê0 ??vII¸…‡ÝŸM–V,—+6làQè ý)ÐB~þwBa¶JEÐóÙÔuuMlv|` '4Ô•ê,@_èOx¼iÅÅBÏnõê#4|6õþý&&†.TZC=º033NJâŸ:õ￯vrÚ‘™y•&ž**êÓÓ/qMM¨Î´†Ïû@;­­Š öí+xç7D"µy6nÌ*--/)‰00Ч6 ÐúS #£a¡¡ ¤ÒçÏÛ¸\QJJ¡BAÙTªwîTŸ}íæí=c€ŽBÎËge5:#cõtúSÐ2lö¤‚‚0>&ùlꪪy6unî×2ÙÃððűsÐUèOá…ÊÊÊ+W®P¢Ÿêºõ^8qâ„@  :Eÿ0ú¦¦3äò*¹üGÍîyøðÉmmµJåÍî–Vð_ãtí)¾ðš.\¸@upÅÅÅqqqT§ÐA8  ¨§šz  ¨§šz  ¨§šz ýÖÒÒrèÐ!>ŸÏãñø|~RRR]]ù‡Ã‘Éd<–ÆwH‡#r:Y²dIDDÄO?ý¤ÁòˆA|ÿúG¥R …BƒgiiY__/‘HÖ¯_Ÿ™™i``@u:­±gϞɓ'ÑÐКšºuëÖ´´4ªCÁëB ý#•J«««“’’lmmÍÍÍ'Mš´qãF±X¬¯¯ÅÓ×s8œ'Oz¸ª·õ¯ÏØØ˜Éd2™Lkkë²²²ÚÚZu~pà"ÁëC=…þÉÏÏ÷ôô>|xç•L&SOï×KJ¥R,óù|øøøÆÆFr=‡Ã)**òöö^´hÑáÇ —-[¶xñâƒvlŸŸßy¡»»w†º»»»ººúûûžMnpçÎÖÖÖÞ2tÔ#r™ÃááééÙ¥Nu^¯R©²²²|||ÜÝÝcccÕGê )Š>ÆíÖ­[ s¤Ç¨…z ýs÷îÝI“&õ½ÍñãÇ‹ŠŠâââRRR=z$‰:^*((‹ÅáááYYYùùùü±P(ÌÎÎ&O FFF¾ýöÛºÛ¶m›••UZZÚ±cǼ½½ ‡Ã¹xñ"¹AQQÑœ9srrrzËÐy‹m^^ÞÈ‘#{[Ÿ——wöìÙ˜˜˜ÔÔT¹\žœœ¬æ;z©Ç§¤¤XYY7®q;|øptt´T*íˆÔã8¨sD88 ýÓÒÒÒ¹îA‰„Éd’ËçÎ[µj•­­-AÁÁÁþþþ---&&&Aðù|333'''‚ Þ{ï½ŽåÆÆFKKKGî¡c¡»C‡“íðôéÓÛÚÚš››gÏžœœ\WWÇb±Š‹‹?øà‘HÔ[†Wpúôi;;;‚ BCCù|~kk«‘‘ÑKßQo; $ ÆäÉ“ccc FãæíímooÿÒqèò+ê)ô‹ÅúñǧM›FþQ"‘´¶¶.[¶¬ó6555ãÇ'—É…ÚÚÚ‰'allLƒÁ責¾¦¦¦¬¬¬Û·oWUUYYY‘+MMMKJJlllôõõíííûÈð >|ß±¦¶¶–<ú«½£ŽëQ††††††äÊ>2;Vqj¡žBÿÌš5ëôéÓóçÏ';#&“ùí·ßvÙÆÂ¢ººšüÀN~ìe±46?ipp°]``à”)ST*ÕüùóÉõ...ŸþyEEÅܹs FÈyêÔ¼þCb±XëÖ­›5kùãÍÍÍÍø«!¯GuYÙGæî5º·q áü)ôÏÊ•+ëëë#""d2Y}}ý¥K—222ºlãêêúé§ŸþðÕ••{÷îe³ÙjVŸüü|²Žt,ñìÙ³¦_´··+•J[[[++«ŠŠŠ„„‚ ž>}JÄìÙ³e2YQQ—Ëí#“ÉüòË/[ZZ233;šÜIwäzWWW±X,“ɪªªvïÞ½iÓ¦þŒ™ºÔ72RoãB=…þ177?pàÀˆ#ÂÂÂ|}}Ï;Ûe''§˜˜˜uëÖ5J(ª¹ó„„„Û·ow^ bÓ¦Mn¿(++ ÉÍÍõòòÚ³gÏ‚ f̘E„‰‰‰££ã˜1cÈËe½e ‹Å>>>OGNŸ>=  {=êX¿|ùr6›³fÍššššmÛ¶õwÜԡθuDêm€B˜Ÿ^ çç×êù¤£££mmm}}}©Bwä|Òø¿¯q8 º µµµ¼¼üÆAAATgyáÚµk=6˜~~~ƒŸê)è‚ÒÒÒÄÄÄ•+Wv¿N•™3gju³¯õt³³³³³3Õ)`¨Ãõ(Í@=Ð ÔSÍ@=Ð \‚ßèþå|Ð=ýº×Ô‡z /X[[w™Öt•……9WhîÐ œ?Ð ÔSÍ@=Ð ÔSÍ@=ÐŒÿ‹ ÌQê~âIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1HasTitleSingular-members.html0000644000175000017500000001377412234777147031422 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::HasTitleSingular Member List

        This is the complete list of members for Glom::HasTitleSingular, including all inherited members.

        get_title_singular(const Glib::ustring& locale) const Glom::HasTitleSingular
        get_title_singular_original() const Glom::HasTitleSingular
        get_title_singular_with_fallback(const Glib::ustring& locale) const Glom::HasTitleSingular
        HasTitleSingular()Glom::HasTitleSingular
        HasTitleSingular(const HasTitleSingular& src)Glom::HasTitleSingular
        m_title_singularGlom::HasTitleSingular
        operator!=(const HasTitleSingular& src) const Glom::HasTitleSingular
        operator=(const HasTitleSingular& src)Glom::HasTitleSingular
        operator==(const HasTitleSingular& src) const Glom::HasTitleSingular
        set_title_singular(const Glib::ustring& title, const Glib::ustring& locale)Glom::HasTitleSingular
        ~HasTitleSingular()Glom::HasTitleSingularvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1Document__inherit__graph.png0000644000175000017500000001467712234777146032507 0ustar00murraycmurrayc00000000000000‰PNG  IHDRËãÊr bKGDÿÿÿ ½§“tIDATxœíÝkTgðwBAíJHì*‚xiíz*µlq]¥È (žª,{,«ÕÖU¨à¥ÕZ×®ÊEÂEØjµ‚H-"袲¶P$*÷†˜p7 Éì‡ÙNc!Ã}~‡o&oæ}f柹$!ÁpGP†Awà Ô‚„jAµ a€bøÐѽ€BB¡pˆ a½@0ôù€—MllìÐg2 sppøàƒ†>ð²–„Áy $ P ¨ Ô‚„j õ¤‘º»»OŸ>]XX(“ÉlllÞyç¿ýíoööö!Ÿ'N¸¹¹ nÎ>>>d›ÅbMš4)<<|æÌ™ú‹D¢±cÇn8c*a0NNN+W®œ?þ°bZF(a8ŽoݺÃ°ØØXGGG©TšŸŸ¿nݺÔÔÔQ£F }þ_}õÕäÉ“B¹¹¹;wîÌÌÌ´°°úœWIwwwIIÉ_|aaa1wîÜ‘/ãå1BGÉK—.566~ñÅîîîÇÙÙù³Ï>KNN633–ù[ZZ²Ùl6›íèè¸råÊŽŽŽ–––a™óà*yã7–,Y²|ùòS§NÑR†>>>mmm#6Ü%ìÊ•+:;6›Í`ü^€Z­NNN^²dÉž={ÚÛÛ‰é>>>`Ñ¢EIIIW¯^ Z¼xññãÇÉÇöôôtvvvvv6559sfÒ¤I|>¿¦¦fÓ¦M¾¾¾aaa×®]Ó©*99yÍš58ާ§§/_¾< &&F{è»w„øøødeeŸOLÄ0Œ|¦õÇÀJ0P?qµÞßê#”°÷Þ{/77wÁ‚ÄÓ”Ífß»wO§ƒƒCcc#q¸!vvvƒ‹8ÖXZZ®_¿ÞÃÃ#""ÂÅÅÇñ }bbbÔjõêÕ«/^øà›o¾yüøñ¼yóŒÜ`...ÖÖÖzÍÎή©©‰ kgg'‹Å"ÖŽãè·€Øúé2Bça+W®”J¥Û¶m«ªª’J¥ÅÅŧOŸÖéãëë›’’òóÏ?×××ÿë_ÿš3g΀Oky¦ßÚÚš˜˜8yòdµZíîîÎãñ?~¼wï^„PGGÑôèÑãÇÿè£:ÔÛÛëë뛜œ\UUÕÐÐðå—_nܸ±ïsçέªª*(( _âºrå ²AVòë¯¿æææž={võêÕý-šŸŸß©S§îß¿ÿôéS¡P( BˆÍf߸q£»»;55ÕÈÅ7¦~mäz#´ãp8GMLLܲe‹R©|ûí·cbbBCCµû,_¾¼§§'::Z¡Püñܰaƒñó'ש¹¹ùÔ©Scbb0 ûç?ÿyäÈ‘“'Oººº~ôÑG]]];vìÐNvHHÈåË—³³³CCC Etttgg§§§ç®]»úÁb±fÍšÕØØH^²ìÝ»wûö펎Ždƒ¬Ã0·uëV//¯þmÙ²e*•jÏž=mmm'NÜ·oqì[¿~ý‰'ׯ_Ÿ——gÌâS?iúôéáááÙÙÙÄ9(Õ0|hÿ/)$ILLÌ0ÕóR‹ŠŠrww_±bÝ…Œ¡P<”™Àû’FQ(?ýôSyy9¼ ô¢ aF)--Ý´iÓÊ•+‰KK`¼‘{çÛ¤y{{{{{Ó]…I‚} $ P ¨ {1OŸöÐ]‚‰†3}‰DÒ÷ƒ1¯$…¿v­Ç×—Ew!&eˆÿ3þZ}«‹å9~üzƒ†ÎÒeèß*0Ô×ô_+‡oÝïÛ´jÕ{t×b2à<ÌX--íåå0 ?›îZL $ÌX"Ñ Ãp••=ª«{Jw9&f¬ìì2G™™1òó+è.Çd@ÂŒR[+ùï‰sVµZ“•UFwE&f‘èΨQÿ_W8ŽWU5WW7Ó[’©€„%+«L¥Ò7G2Ë˃¥Q a«¬lxüXª=E¥R …·èªÇ´@Â&Ý5J÷ÓdwïÖÑRi„ @£Á³²ÊT*Ýÿ•5ÊL$ºCKI¦6€òr±D¢ç?sT*uvv¹Z­é{Ð €Ht‡ÉÔÿõ-Rigiií×cr a†¨Õš¼¼ =šIüeF¶Â.\€+ÊÀçô ‘Ë»ÿñß¿þîÁƒÆóçïìØáON±±±¢£.SŸ­xyy§¿¢»SGI@-H $ P ¨ Ô‚„jAµ a€Z0@-H $ P ¨ Ô‚„jAµ a€Z0@-H $ P ¨ Ô‚„jAµ a€Z0@-H $ P ¨ Ô‚„jAµ a€Z0@-H Ösß²YRRrðàA«yÉõôŒzúÔÂÉIÏ—ŸRVV–öÍçöauuuÙÙÙ#[)±´TA¼ ¨¯¯ï›=ßE­“AŒ”™™¢3Îõ a€Z0@-H $ Pk kooß¼y3ŸÏ777çóùááá Ä]†•——º LËØ±cçÎ{íÚ5Ãý[[[=œ1•0™Ì)S¦¤¥¥Q1 ¥._¾Ìd2ïÜùýw0?ûì3OOO¥R‰Â0ÌÑÑQ£yî -ZDnÁ!nJÂ`¦Ñh-ZTZZš]__á ///…B1Äj………2™L&“UTTÌ™3géÒ¥]]]Ã2çÁU"‹7lØ.‰h)cÐ,X°bÅŠˆˆ"F·oßNHHøúë¯GMtJ¥?üðÙ¿­­­¸¸x˜‹Àµ…B)z%''?¾³³S{¢L&ëíí%Þ!(++p&ýÑyx[[BèÁƒúK$’Ag|%;wîœ1c Å€‹/•Jßxã£Gööö¾ýöÛ›7oÖ~¬ŸŸß'Ÿ|BNIIIñóó#üE7¥Þü f–––¶nÝ:+«ç~øŽÃᘙýþKŸ½½½QQQ|>ßÞÞ>44T*ýÿ/±c–‘‘Áãñ¬­­·mÛvöìY.—;f̘M›6‘íìì”Ëår¹\,ïÞ½{Ú´i®®®óçÏ·µµµ´´ôôôÌÌÌÔ©***jÖ¬Yr¹Çñøøø‰'ÚÚÚ í¡‹ŠŠ&L˜€aùæØÍ›7íííU*†a©©©D7¢¡#$$äîݻĩï¢i4šøøxggg++«wß}÷Æä äAœl^ êÏÏÏçñx¶¶¶G%¦ „ œ'ØÚÚ>|xÇŽ;vìèèèØµk—ö½AAAçÎÃ{ç0''géÒ¥ýÍjÌ`_666yyyýÝ‹*++Û·oŸ³³óÍ›7«ªªæÍ›HÞëïïßÚÚJ¼½àççG¶>|ˆ÷ù)BƒqõêUÇÝÜÜ"""ÄbqssóÉ“'ÍÍÍ þÛ“866vÆŒR©Çñ#GŽLž<¹¤¤¤¦¦Æßß?((ˆÚËË«¸¸8!!aΜ9ÄÄO?ýôã?Æq<%%¥¶¶V»ž···#„îß¿¯wÑ:Äçó‹ŠŠ¢¢¢ìììT*þü>†l^ ê÷õõmiiÉÉÉa2™Ïž=ÃÞ…/^¼!týúõ¾[ÊÕÕµ¸¸ÇñÎÎNkkk"¬Ã¸L˜Læ7´ %Èd2²,—Ó§O*++BmmmĽ………8Ž«Õjvߥjoo_»v-—Ëííí•ËåÄQÇñªª*í­µeË„Pee%q¯‡‡GZZÑnhh033ëêê"zfeeá8.—Ë-,,êëëÕj5—Ë-**Ò»˜ý%L»»ŸgS§Ný}E D¬zíÁ`¸¹¹¥§§=õ.šR©ŒŽŽž0a‹Åš={6qj…ãø™3gÆgggG\Ÿ“0cê'gåíímaaA\âôµ{÷îñãÇÛ…ogg×Üܬ=CâtøðaÛqN6œ {,Y²$..Žî*^)Ãv¦o꺻»KKK/_¾¼bÅ ºk—.]Âô‰ŠŠ¢»4}Ÿq}å]¼xqõêÕ;wî|óÍ7é®ex,\¸ïsP{I¼Ž [ºt)—å@¯×ñ( F$ P ¨ {1*•šîL $ì¨Tꃿ¸ТçZro~½&ÌÍßäpFF~ˆfàÞ!¤ó½õõõ?þø#Õ¼äÒÓknÝ’|ü±»»;‡îZ^^Ä»Æ$ì¥}¥îe£PôNº£§G¹té;‡¿"oŒ83ÖåË•==*GùùÝÝJºË10c;w›ÁÀB*•úûïÿKw9&f”ööž«WR«5!ËÉê¾> aF¹xñ>ùŸ«½½š‚‚ŸåònzK20£dgëî´.^¼GK%&60‰¤£¤¤F£Ñ¾èƳ²tÿ5è Ø… Ä9>I­ÆKK67·ÑU’ „ ,3³üùB™™a.Ü¥¥Ó À“'Ò{÷êú&L£Á³²Êh)É´@—WÁdêYK ~ÿ~½X,ù’L $lÙÙåýbû渢Àëø9}ãµ´´Íœ2Å‘¸ÙÙ©hiiwvv ;ÔÔ´ÐTšÉ€w¾_@^^EDÄ鯯¯è.Ä”ÀQP ¨ Ô‚„jAµ a€Z0@-H $ P ¨ Ô‚„jAµ a€Z0@-H $ P ¨ Ô‚„jAµ a€Z0@-H $ P ¨ Ô‚„jAµ a€Z0@-H $ P ¨Eç÷¸–””ÔÕÕÑXÀ‹ªª’óùìÌÌLº y1^^^<¶áqúѶد¡PHãV¦ù»¨ƒ‚‚²²²è­áÕFû¯¶Ãy $ P ¨ Ô‚„jAµL#aííí›7oæóùæææ|>?<<¼¡¡¸ ðòrÝá ì7L&sÊ”)iiiÃ8ó× $L£Ñ,Z´¨´´4;;»¾¾þÂ… ^^^ …‚¢ e2™X,Þ°aCxx¸H$¢h × üúß©S§>|XSScee…rpp8vìX\\“IUñl6›Ãáp8œµk×¶´´ÄÄÄR4Öà`&‘Hìííé.d`&°KKK[·n/‡Ã133#oöööFEEñù|{{ûÐÐP©TJLÇ0,##ƒÇãY[[oÛ¶íìÙ³\.w̘1›6m";¤¦¦j7t„„„ܽ{W&“éB£ÑÄÇÇ;;;[YY½ûî»7nÜ gÛÚÚªÓ6\ Žãñññ'N´µµÚ‹ŸŸÏãñlmm=Š~{™ÞÁÁâ¥Fã;VAAAAAAv³±±ÉËËëï^„PYYÙ¾}ûœoÞ¼YUU5oÞ¼ÀÀ@ò^ÿÖÖÖììl„ŸŸÙ~øð!Žã)))µµµÚ b†äüÛÛÛB÷ïß×;Ä¡C‡ø|~QQQCCCTT”J¥"f"‘HȈ¶ábŽ92yòä’’’ššrÍ „|}}[ZZrrr˜Læ³gÏtæo¢û}IH“ɼqãy“|nÈd2ü·@¸¸¸œ>}šèPYY‰jkk#î-,,Äq\­Vë´µc¤­¿„éÂÝÝýäÉ“ÄDF#“É4 Þ ãáá‘––F<¤¡¡ÁÌ̬««‹xÔùóçÉžä¬L%a&p”är¹ÕÕÕäM™LF^H’êê꜉6Ѩ¯¯'n²Ùl„ƒÁÐi‰ø|‘“““Þ!=zäææFLÄ0ŒÃá~§Ù@1b±xÅŠÄe¬“““Z­&ÁÉÉéEË~y˜@ÑÇ'žÁ!‡sûöm><¯¶¶–h .—;,£ …·ÞzËÆÆFï\.W,“år9Y'±ÿ S2 .—+‰ˆç=±;tuu%î¢ýóCa ‹ŽŽnjjò÷÷///ojj:wî\ll¬NŸU«VíÞ½»¬¬¬ººzýúõþþþǘ™§¦¦!¡ÎÎN¹\^WW—ðùçŸÃé",,,&&æ‡~hnn>pàÇëééAq8œÜÜÜööö¸¸8#såÊ•QQQååå555kÖ¬ñññ1Ü_&“9gšÑx„6ò< Çñ'Ož„††ÚØØ°X,b¢}¦T*·nÝêäädkk»lÙ2ís ò¤Jo!”’’¢Ó 0 77·ôôtâ!z‡P*•ÑÑÑ&L`±X³gÏ&N­p?sæÌ¸qãìììˆëSòäÉ@1J¥222’Çã±Ùl___âB¤oObVÞÞÞR©tÀU‡è>Ãp­u:ÂB>H) ÄBapp0]˜ÀQ˜4H $ P ¨ Ô‚„jAµhþ|ØÍ›7‰WÅÀ«ŠÎ„Í™3‡ÆÑ_AAA|>ŸÆè|M¼à< P ¨ Ô‚„jAµþ0¿ê EDþIEND®B`‚glom-1.22.4/docs/libglom_reference/html/namespaceGlom_1_1DbUtils.html0000644000175000017500000027150012234777147026736 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::DbUtils Namespace Reference
        Glom::DbUtils Namespace Reference

        Typedefs

        typedef std::vector< sharedptr
        < Field > > 
        type_vec_fields
         
        typedef std::vector
        < Glib::ustring
        type_vec_strings
         

        Functions

        bool create_database (Document* document, const Glib::ustring& database_name, const Glib::ustring& title, const sigc::slot< void >& progress)
         
        bool recreate_database_from_document (Document* document, const sigc::slot< void >& progress)
         Create the database on an already-connected server. More...
         
        SystemPrefs get_database_preferences (Document* document)
         This creates the standard tables if necessary, filling them with some information from the document. More...
         
        void set_database_preferences (Document* document, const SystemPrefs& prefs)
         
        bool add_standard_tables (Document* document)
         
        bool add_standard_groups (Document* document)
         
        bool add_groups_from_document (Document* document)
         
        bool set_table_privileges_groups_from_document (Document* document)
         
        type_vec_fields get_fields_for_table_from_database (const Glib::ustring& table_name, bool including_system_fields=false)
         
        bool get_field_exists_in_database (const Glib::ustring& table_name, const Glib::ustring& field_name)
         
        type_vec_fields get_fields_for_table (const Document* document, const Glib::ustring& table_name, bool including_system_fields=false)
         Get all the fields for a table, including any from the database that are not yet known in the document. More...
         
        sharedptr< Fieldget_fields_for_table_one_field (const Document* document, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Get a single field definition for a table, even if the field is in the datasbase but not yet known in the document. More...
         
        type_vec_strings get_table_names_from_database (bool ignore_system_tables=false)
         Get the table names from the database server. More...
         
        bool get_table_exists_in_database (const Glib::ustring& table_name)
         
        bool create_table (const sharedptr< const TableInfo >& table_info, const Document::type_vec_fields& fields)
         
        bool create_table_with_default_fields (Document* document, const Glib::ustring& table_name)
         Also saves the table information in the document: More...
         
        bool create_table_add_missing_fields (const sharedptr< const TableInfo >& table_info, const Document::type_vec_fields& fields)
         
        bool add_column (const Glib::ustring& table_name, const sharedptr< const Field >& field, Gtk::Window* parent_window)
         
        bool drop_column (const Glib::ustring& table_name, const Glib::ustring& field_name)
         
        bool insert_example_data (Document* document, const Glib::ustring& table_name)
         Insert example data, from the document, into the table on the database server. More...
         
        Glib::RefPtr
        < Gnome::Gda::DataModel > 
        query_execute_select (const Glib::RefPtr< const Gnome::Gda::SqlBuilder >& builder, bool use_cursor=false)
         Execute a SQL Select command, returning the result. More...
         
        bool query_execute_string (const Glib::ustring& strQuery, const Glib::RefPtr< Gnome::Gda::Set >& params=Glib::RefPtr< Gnome::Gda::Set >(0))
         Execute a SQL non-select command, returning true if it succeeded. More...
         
        bool query_execute (const Glib::RefPtr< const Gnome::Gda::SqlBuilder >& builder)
         Execute a SQL non-select command, returning true if it succeeded. More...
         
        Gnome::Gda::Value auto_increment_insert_first_if_necessary (const Glib::ustring& table_name, const Glib::ustring& field_name)
         Insert the auto-increment row in the database preferences table, if necessary, returning the next value. More...
         
        Gnome::Gda::Value get_next_auto_increment_value (const Glib::ustring& table_name, const Glib::ustring& field_name)
         Get the next auto-increment value for this primary key, from the glom system table. More...
         
        void remove_auto_increment (const Glib::ustring& table_name, const Glib::ustring& field_name)
         Use this, for instance, when deleting a table. More...
         
        void layout_item_fill_field_details (Document* document, const Glib::ustring& parent_table_name, sharedptr< LayoutItem_Field >& layout_item)
         
        bool layout_field_should_have_navigation (const Glib::ustring& table_name, const sharedptr< const LayoutItem_Field >& layout_item, const Document* document, sharedptr< Relationship >& field_used_in_relationship_to_one)
         Decides whether a field should have an Open button next to it, allowing the user to navigate to a related record. More...
         
        Glib::ustring get_unused_database_name (const Glib::ustring& base_name)
         Discover a database name that is not yet used. More...
         
        int count_rows_returned_by (const Glib::RefPtr< const Gnome::Gda::SqlBuilder >& sql_query)
         Discover how many rows a SQL query would return if it was run. More...
         
        bool rename_table (const Glib::ustring& table_name, const Glib::ustring& new_table_name)
         Rename a table in the database. More...
         
        bool drop_table (const Glib::ustring& table_name)
         
        Glib::ustring escape_sql_id (const Glib::ustring& id)
         Escape, and quote, SQL identifiers such as table names. More...
         
        Glib::ustring gda_cnc_string_encode (const Glib::ustring& str)
         Just a wrapper around gda_rfc1738_encode(), for use when building libgda connection strings or authentication strings. More...
         
        Glib::ustring build_query_create_group (const Glib::ustring&group, bool superuser=false)
         
        Glib::ustring build_query_add_user_to_group (const Glib::ustring&group, const Glib::ustring& user)
         
        bool add_user (const Document* document, const Glib::ustring& user, const Glib::ustring& password, const Glib::ustring&group)
         Add a user to the database, with the specified password, in the specified group. More...
         
        bool remove_user (const Glib::ustring& user)
         Remove the user from the database. More...
         
        bool add_group (const Document* document, const Glib::ustring&group, bool superuser=false)
         Add a group to the database. More...
         
        bool remove_user_from_group (const Glib::ustring& user, const Glib::ustring&group)
         
        Gnome::Gda::Value get_lookup_value (Document* document, const Glib::ustring& table_name, const sharedptr< const Relationship >& relationship, const sharedptr< const Field >& source_field, const Gnome::Gda::Value& key_value)
         Get the value of the source_field from the relationship, using the key_value. More...
         
        void set_fake_connection ()
         Allow a fake connection, so sqlbuilder_get_full_query() can work. More...
         

        Typedef Documentation

        Function Documentation

        bool Glom::DbUtils::add_column ( const Glib::ustring table_name,
        const sharedptr< const Field > &  field,
        Gtk::Window *  parent_window 
        )
        bool Glom::DbUtils::add_group ( const Document *  document,
        const Glib::ustring group,
        bool  superuser = false 
        )

        Add a group to the database.

        Returns
        true if the addition succeeded.
        bool Glom::DbUtils::add_groups_from_document ( Document *  document)
        bool Glom::DbUtils::add_standard_groups ( Document *  document)
        bool Glom::DbUtils::add_standard_tables ( Document *  document)
        bool Glom::DbUtils::add_user ( const Document *  document,
        const Glib::ustring user,
        const Glib::ustring password,
        const Glib::ustring group 
        )

        Add a user to the database, with the specified password, in the specified group.

        Returns
        true if the addition succeeded.
        Gnome::Gda::Value Glom::DbUtils::auto_increment_insert_first_if_necessary ( const Glib::ustring table_name,
        const Glib::ustring field_name 
        )

        Insert the auto-increment row in the database preferences table, if necessary, returning the next value.

        Glib::ustring Glom::DbUtils::build_query_add_user_to_group ( const Glib::ustring group,
        const Glib::ustring user 
        )
        Glib::ustring Glom::DbUtils::build_query_create_group ( const Glib::ustring group,
        bool  superuser = false 
        )
        int Glom::DbUtils::count_rows_returned_by ( const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &  sql_query)

        Discover how many rows a SQL query would return if it was run.

        This uses a COUNT * on a the sql_query as a sub-statement. Be careful not to include ORDER BY clauses in the supplied SQL query, because that would make it unnecessarily slow.

        A SQL query.

        Returns
        The number of rows. Or -1 if something went wrong.
        bool Glom::DbUtils::create_database ( Document *  document,
        const Glib::ustring database_name,
        const Glib::ustring title,
        const sigc::slot< void > &  progress 
        )
        bool Glom::DbUtils::create_table ( const sharedptr< const TableInfo > &  table_info,
        const Document::type_vec_fields &  fields 
        )
        bool Glom::DbUtils::create_table_add_missing_fields ( const sharedptr< const TableInfo > &  table_info,
        const Document::type_vec_fields &  fields 
        )
        bool Glom::DbUtils::create_table_with_default_fields ( Document *  document,
        const Glib::ustring table_name 
        )

        Also saves the table information in the document:

        bool Glom::DbUtils::drop_column ( const Glib::ustring table_name,
        const Glib::ustring field_name 
        )
        bool Glom::DbUtils::drop_table ( const Glib::ustring table_name)
        Glib::ustring Glom::DbUtils::escape_sql_id ( const Glib::ustring id)

        Escape, and quote, SQL identifiers such as table names.

        Glib::ustring Glom::DbUtils::gda_cnc_string_encode ( const Glib::ustring str)

        Just a wrapper around gda_rfc1738_encode(), for use when building libgda connection strings or authentication strings.

        SystemPrefs Glom::DbUtils::get_database_preferences ( Document *  document)

        This creates the standard tables if necessary, filling them with some information from the document.

        bool Glom::DbUtils::get_field_exists_in_database ( const Glib::ustring table_name,
        const Glib::ustring field_name 
        )
        type_vec_fields Glom::DbUtils::get_fields_for_table ( const Document *  document,
        const Glib::ustring table_name,
        bool  including_system_fields = false 
        )

        Get all the fields for a table, including any from the database that are not yet known in the document.

        Parameters
        table_nameThe name of the table whose fields should be listed.
        including_system_fieldsWhether extra non-user-visible fields should be included in the list.
        Returns
        A list of fields.
        type_vec_fields Glom::DbUtils::get_fields_for_table_from_database ( const Glib::ustring table_name,
        bool  including_system_fields = false 
        )
        sharedptr<Field> Glom::DbUtils::get_fields_for_table_one_field ( const Document *  document,
        const Glib::ustring table_name,
        const Glib::ustring field_name 
        )

        Get a single field definition for a table, even if the field is in the datasbase but not yet known in the document.

        Parameters
        table_nameThe name of the table whose fields should be listed.
        field_nameThe name of the field for which to get the definition.
        Returns
        The field definition.
        Gnome::Gda::Value Glom::DbUtils::get_lookup_value ( Document *  document,
        const Glib::ustring table_name,
        const sharedptr< const Relationship > &  relationship,
        const sharedptr< const Field > &  source_field,
        const Gnome::Gda::Value &  key_value 
        )

        Get the value of the source_field from the relationship, using the key_value.

        Gnome::Gda::Value Glom::DbUtils::get_next_auto_increment_value ( const Glib::ustring table_name,
        const Glib::ustring field_name 
        )

        Get the next auto-increment value for this primary key, from the glom system table.

        Add a row for this field in the system table if it does not exist already. This increments the next value after obtaining the current next value.

        bool Glom::DbUtils::get_table_exists_in_database ( const Glib::ustring table_name)
        type_vec_strings Glom::DbUtils::get_table_names_from_database ( bool  ignore_system_tables = false)

        Get the table names from the database server.

        This could theoretically be different than the ones listed in the document.

        Glib::ustring Glom::DbUtils::get_unused_database_name ( const Glib::ustring base_name)

        Discover a database name that is not yet used.

        This assumes that all other connection details are correctly set.

        Parameters
        base_nameThe wished-for name, to be modified until an unused name is found.
        Returns
        A database name that does not yet exist on the server.
        bool Glom::DbUtils::insert_example_data ( Document *  document,
        const Glib::ustring table_name 
        )

        Insert example data, from the document, into the table on the database server.

        bool Glom::DbUtils::layout_field_should_have_navigation ( const Glib::ustring table_name,
        const sharedptr< const LayoutItem_Field > &  layout_item,
        const Document *  document,
        sharedptr< Relationship > &  field_used_in_relationship_to_one 
        )

        Decides whether a field should have an Open button next to it, allowing the user to navigate to a related record.

        Parameters
        layout_itemA field on a layout. This must have full field details.
        field_used_in_relationship_to_oneA relationship, if the field identifies a single record, so a Find button would also make sense, to choose the ID, in editing mode.
        void Glom::DbUtils::layout_item_fill_field_details ( Document *  document,
        const Glib::ustring parent_table_name,
        sharedptr< LayoutItem_Field > &  layout_item 
        )
        bool Glom::DbUtils::query_execute ( const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &  builder)

        Execute a SQL non-select command, returning true if it succeeded.

        Glib::RefPtr<Gnome::Gda::DataModel> Glom::DbUtils::query_execute_select ( const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &  builder,
        bool  use_cursor = false 
        )

        Execute a SQL Select command, returning the result.

        Parameters
        builderThe finished SqlBuilder object. Whether the data model should be cursor-based (not allowing random access).
        bool Glom::DbUtils::query_execute_string ( const Glib::ustring strQuery,
        const Glib::RefPtr< Gnome::Gda::Set > &  params = Glib::RefPtr< Gnome::Gda::Set >(0) 
        )

        Execute a SQL non-select command, returning true if it succeeded.

        See also query_execute(), which takes a SqlBuilder. This should only be used for SQL commands that are not supported by SqlBuilder, such as ADD GROUP.

        bool Glom::DbUtils::recreate_database_from_document ( Document *  document,
        const sigc::slot< void > &  progress 
        )

        Create the database on an already-connected server.

        void Glom::DbUtils::remove_auto_increment ( const Glib::ustring table_name,
        const Glib::ustring field_name 
        )

        Use this, for instance, when deleting a table.

        bool Glom::DbUtils::remove_user ( const Glib::ustring user)

        Remove the user from the database.

        Returns
        true if the removal succeeded.
        bool Glom::DbUtils::remove_user_from_group ( const Glib::ustring user,
        const Glib::ustring group 
        )
        bool Glom::DbUtils::rename_table ( const Glib::ustring table_name,
        const Glib::ustring new_table_name 
        )

        Rename a table in the database.

        void Glom::DbUtils::set_database_preferences ( Document *  document,
        const SystemPrefs &  prefs 
        )
        void Glom::DbUtils::set_fake_connection ( )

        Allow a fake connection, so sqlbuilder_get_full_query() can work.

        bool Glom::DbUtils::set_table_privileges_groups_from_document ( Document *  document)
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Document__inherit__graph.png0000644000175000017500000001452212234777146031336 0ustar00murraycmurrayc00000000000000‰PNG  IHDRËãÊr bKGDÿÿÿ ½§“IDATxœíÝ}PSWÞðsC,oA‹[ Ö"‚Е֮#ÙÁ²-²Ã‹gjYœÊêVÛQTpDt¥‹k»Ö¢#Ò©´1A#¸jµJ‘¥ˆQ7VÖ§  …˜„7MBrž?N{C¸Æèï3þqrsrÏïÞûÍ}I®„Â#òuà Ì‚„fA³ a€axl’’’l½€A`Œ a½ˆyóæ}üñÇcŸxÚ,Y²dì3‡„ñùü”””±ÏˆÓmË+ÁBýUUU|>ßÓÓsÏž=d BhÒ¤I '˜1Æ„Z¹óð𨬬îY„D"Ù±cG@@ÀÅ‹›šš,X@?×ÝÝ-‰B .¤Û·o߯CîÑe±XçÎÃeffÊd²ŽŽŽ8::j4üë›8//oöìÙ …cüùçŸO:µ¾¾þÖ­[qqqô!„ÂÃÃkkk÷îÝF&®Y³fÅŠãÒÒÒ––ãztÖÓÓƒº~ýºÙEûì³ÏüüüjjjÚÚÚrrr¼¼¼t:~tC·-¯ õÇÄÄtvvVTT°Ùì‡â'¾{B c³Ùuuu¿ú+¥R‰Ý0$Bjµš<[]]1Öëõ&m²9·kOOÏÊ•+y<Þàà J¥"GaŒqSS“ñÖZ¿~=B¨±±‘<;cÆŒòòrÒnkksppèïï'=…B!ÆX¥R999Éår½^ÏãñjjjÌ.æp 3»hÓ§O?pà™h0”J¥Á`ÀÃ'ÌÂJ°Pÿ±cÇèžô¬žÁ£$Çknn¦*•JúB’ÖÚÚ@Ú¤!—ËÉC‡ƒb±X&í¡ÜÜÜòóóÛÛÛ›››U*UNNNdd$ÇûàƒŒ»ÕÖÖÆÆÆ‡2™léÒ¥ä2Ð××W¯×ÓCûûû#„ÜÝÝ£££+**.\¸Àf³çÏŸoÍR·¶¶"„|}}Í.Ú;w‚‚‚ÈDŠ¢¸\.9„ ÇÂJ°P¿¯¯¯…Õõ<¡ãã㋊ŠÈ; !Äår¯\¹bÒ‡Ïç·´´6iðx¼QŒ588ˆâp8‘‘‘---………wîÜùöÛoû…½{÷=z´¦¦† $‹w'Ó¦M#=ém“’’"‰Ajjªå(ÐÁk¯½æááavÑx<žL&£;«T*zýý’Y¨ßÊR4Æ} •GÉÎÎN>Ÿ+‘HÚÛÛ+**æÌ™ƒ=Jæçç^ºt‰œ¬ÄÅÅ‘×"£CÙ62ú´B.—§§§‡†† Ÿ;w* ©TJîþhjjÂF‡‰íÛ·Ïœ9S«Õæåå…„„H$’›7o._¾<44tèpjµÚÙÙ™ËåJ¥R2Åìy©äîÝ»EEEŽŽŽäìÓì¢mÛ¶í•W^©­­½wï^aa¡««koo/ƘËå«ÕêÌÌLdth³°¬©ßxVÍÍÍÖl\dGçaã»w殮¥yxx¸¸¸ÄÅÅ‘·²q´ZmVV–¯¯¯§§gjjªñ¹Èˆ £9;;¿õÖ[7oÞÄWVV¾üòËŽŽŽááá'OžŒ‰‰ ÆFëZ£ÑòÉ'Z­6;;›Ïçs8œ˜˜r‡œWÅÇÇÏœ9“~ˆ*--5i,+((èСC¤§ÙEÓjµ¹¹¹þþþ...sçÎ%§V㯿þúÅ_ôòò"×§Ö$ÌšúéYEFF:99‘KËÆ%a~t =®ääd„P(ËLìEBBÂܹs7nÜhëBžŠ¢Áoþƒï%­200ÐÐÐpæÌ™¥K—Úº; ³Ê©S§¢££7oÞüÒK/Ùº;3wQ?m]…]‚}`$ 0 ˜ {<÷î©l]‚‡3}¹\>ôƘgR¿îðá–å˃l]ˆ]ã'¶ÏÕ_pq ™<ùCËÉÖ…<9¶ÿLÿ¹’°ûÒ%ÙŽIË–½iëZ윇Y«³³çòå;…Ž3½+X ³–X|•¢(Œ‘Dr§µõ¾­Ë±0k‰Dƒ#„XUUR[—c7 aViiéúïÛÉ9«^o %¶®Èn@¬"_0á—u…1njêhnî°mIöf¡P¢Óè‡&8TVÂÒ*°‘56¶ýßÿ)Œ§ètzà’­ê±/°‘‰ÅW'Lp0™ØÖ¦¼v­Õ&õØHØ ,Jt:½Éô Äâ«6)ɾ@ÂFpù²¬««wètN/]Öë CŸÆ a#‹¯²Ù¦‡HB¡èkhhyÂõØH˜%z½¡²Rj0à^`“&8Ðm„¨'àŠrpŸ¾%*ÕÀ_þE?¼q£ýر«›6ÅÑS<<\ͽüî­x ••ÒÌ̃ííŸÚº{GIÀ,H`$ 0 ˜ Ì‚„fA³ a€Y0À,H`$ 0 ˜ Ì‚„fA³ a€Y0À,H`$ 0 ˜ Ì‚„fA³ a€Y0À,H`$ 0 ˜ Ì‚„fA³ a€Y0À,H`Ö#e³¾¾~×®]6¬æ)÷àÁ„û÷|}Íüñs@ …ÆÙ‡µ¶¶ŠD¢'[=qvÖA¼,ËåCócæoQ›d+9rdÉ’%&á< 0 ˜ Ì‚„fA³F™°žžžuëÖùùù9::úùùedd´µµ‘§(Šº|ùò¨ ¢Œ¸»»GDD|ÿý÷–ûwwwz8k*a³ÙÁÁÁåååLŒÂ¨3gΰÙì«WûÌ>ú($$D«Õ"„(Šòññ1ùÃE‹Ñ[pŒ›’M âE‹D"‘\.?qâ„““Sxx¸F£c5DuuµR©T*•R©4,,,11±¿¿\æ<ºJd2ÙêÕ«322Äb±Mʵ·ß~{éÒ¥™™™$FW®\Ù»wï—_~ù / …âßÿþ7Ý_­V×ÖÖŽs؈@ 0™bVIIÉäÉ“ûúúŒ'*•ÊÁÁAò D"q&Ã1y¹Z­FݸqÃBÿ®®®Qg}%›7ož={6ň‹¯P(~÷»ßíÙ³gppðõ×__·nñk.\ø×¿þ•žRZZºpáBzÁwSšÍÏhöaååå«V­ru}ä‡ï¸\®ƒÃo¿ô988˜““ãçççíí––¦PüòKìE}óÍ7|>ßÍÍmÆ ‡æñx'N\»v-ýÚ¾¾>•J¥R©d2Y~~þ¬Y³¦M›&•J£££===CBBŽ9bRUNNΜ9sT*Ƹ  `Ê”)žžžÉÉÉÆC×ÔÔøûûSE9vñâEoooNGQTYYéF&–,YríÚ5òFºhƒ¡   ÀÕÕuÞ¼yuuuô ôAœn[^ ꯪªâóùžžž{öì!SB“&M²pžàéé¹{÷îM›6mÚ´©··wëÖ­ÆÏ&%%=zÿúÍaEEEbbâp³¥38”‡‡GeeåpÏ"„$ÉŽ;.^¼ØÔÔ´`Á‚„„úÙ¸¸¸îînòõÂÂ… éöíÛ·ñŸ"d±XçÎÃeffÊd²ŽŽŽ8::j4üë›8//oöìÙ …cüùçŸO:µ¾¾þÖ­[qqqIIIôÐáááµµµ{÷î #׬Y³bÅ ŒqiiiKK‹q=úîééA]¿~Ýì¢}öÙg~~~555mmm999^^^:?º¡Û–W‚…úcbb:;;+**ØlöDZջðwÞy!táÂ…¡[jÚ´iµµµã¾¾>777Öq܇&al6»®®Î¸PB©TÒe. ÍQ’Çã577‹¾¤µ¶¶6iÈåròÃá“I{(77·üüüöööææf•J•““Éãñ>øàãnµµµ±±±ä¡L&[ºt)¹ ôõõÕëõôÐþþþ!ww÷èèèŠŠŠ .°Ùìùóç[³Ô­­­!___³‹vçΠ  2‘¢(.—Kañ°,Ôïëëkau gëÖ­,«¬¬lݺuC·TrrrEEƘ‘Cäè®%ãã㋊ŠÈ; !Äår¯\¹bÒ‡Ïç·´üò+ë¤ÁãñF1Öàà BˆÃáDFF¶´´Þ¹sçÛo¿5î# ÷îÝ{ôèÑšš2X,6ÞL›6ô¤·MJJŠH$©©©–£@¯½öš‡‡‡ÙEãñx2™Œî¬R©èõCvtJFd¡~+K5öŸÿügçÎû÷ï_²dIDDDff¦I‡ÐÐP''§êêêÓ§OÿéOzÜùlĽÜP|>?66V"‘´··WTTÌ™3=z”ÌÏÏ ¼té9Y‰‹‹3Þ3[h#£O+äryzzzhh¨Á`ðññÙ¹s§B¡J¥)))¡¦¦<˜Ø¾}ûÌ™3µZm^^^HHˆD"¹yóæòåËCCC‡§V«¹\®T*%SÌž‡‘JîÞ½[TTäèèHÎ>Í.Ú¶mÛ^yå•ÚÚÚ{÷ºöööbŒ¹\nqq±Z­&›–>´YX ÖÔo<«æææá¶”N§ %'šc™LæââRZZj2ÃìììéÓ§GFFZØôgŒÛyÆøîÝ»iii...qqqä­lœ0­V›••åëëëé陚šj|.2bÂhÎÎÎo½õÖÍ›71Æ•••/¿ü²££cxxøÉ“'cbb‚ƒƒ±ÑºÖh4ÁÁÁŸ|ò‰V«ÍÎÎæóù'&&†\@à!gñññ3gÎümE DV½qƒ`±XAAA‡"=Í.šV«ÍÍÍõ÷÷wqq™;w.9µÂýõ×/¾ø¢——¹>µ&aÖÔOÏ*22ÒÉɉ\â •ŸŸ?yòd²]ˆ‚‚//¯ŽŽã’CÐîÝ»-l dÅ9Ùx&ì°xñâíÛ·ÛºŠgʸéÛ»†††3gÎ,]ºÔÖµŒÓ§OSæäääØº4s÷¸>óN:õþûïoÞ¼ù¥—^²u-ã#669¨=%žÇ„%&&2qYÌz’àI‚„fA³ aG§ÓÛº; { :~×®oG¹–Å—_Ï GÇ—¸ÜØììÿAÈ0ro€2ù»r¹ü‡~°a5O¹C‡n]ºÔµbÅôéÓ¹¶®åéE¾5¦QOí'uOfpæÌMhߨ½ûù2à €ó0k9ÓøàcTU%ÐÚº» ³ÖÑ£WX, !¤Óé¿ûî¿¶.Çn@¬ÒÓóàܹÿÕë !‹ª¨ëÿ"|~@¬rêÔuú®ΟÿI¥°mIöf‘Èt§uêÔ6©Äî@ÂFÖÕÕ[_Ë`0¾èÆB¡éMfAÂFvâ„”œãÓôzÜÐp»£Cm«’ì$ldGŽ\~t†BÔ‰×lR}„àî]Å?¶M˜Á€…B‰MJ²/°TVJÙl3kÉ`ÀׯËe²®'_’}„@$º<ü;Ô¿þW”#xïÓ·^ggÏ /°ƒƒ}Èþ>MggO@À$ºÃ­[6*ÍnÀ7ß¡²Rš™y°½ýS[bOà( ˜ Ì‚„fA³ a€Y0À,H`$ 0 ˜ Ì‚„fA³ a€Y0À,H`$ 0 ˜ Ì‚„fA³ a€Y0À,H`$ 0 ˜ Ì‚„fA³ a€Y0À,H`$ 0 ˜ ̲åßq­¯¯ommµa«©IåçÇ9r䈭 y<ááá|>ßfÃcÛIJJ²Ùb?O ·²ÿõþð‡-[¶Ø¶†g[TT”m €ó0À,H`$ 0 ˜ Ì‚„fÙÇ/g >> …¢ªªjÕªUeee&L`bÄO?ýtêÔ©õõõÿûßœœ"""˜èy` ;}út{{{yy¹““BˆËå~ôÑGË—/wpp`hDggg‡Ãáp/^|ÿþý¯¾úêiKXTT”X,vww·u!#³ƒó°³gÏ&$$xÑ8‹õ[ñz½¾¤¤$%%eñâÅÛ¶mëéé!Ó£¢¢ÎŸ?Ÿœœ¼hÑ¢âââsçÎ%%%½óÎ;EEEt‡³gÏ7L,X°àöíÛ½½½f‡À:t(---66våÊ•ôlÕjµIÛr1dVï¾ûn||ü–-[Œá‡~HNNŽ?vìúõ8ž@ñ4³ƒ„ݺu+ Àr@pþüù¼¼¼/¾øâþýû………ôSß}÷]IIIvvö¡C‡Îž=ûå—_fee …Â{÷î!„6nÜbÜ01iÒ$„Pww·Ù!Ž=züøñìììòòò7ÞxcÓ¦Mzýp?¨;B1b±øäÉ“¹¹¹ûöíÓjµ»ví¢_%‹‹‹‹×¯_ÿÅ_ètºêêj2Ñ.öavp”0^•ô™xUU‡Ã!íS§N-[¶lúôé¡Õ«W§§§ ¸¸¸ „RRR&Nœ8þ|„Pjj*ÝîééñññùãÿHæ@7†cvˆªªªeË–½úê«¡ôôô””ã=ëPŠ9~üxzzúŒ3Bk×®MIIÑh4ŽŽŽ¡øøx.—¡×ëMÖÆÓÏöa^^^Æ7ùTUU‰D"“>?ÿü3Ç#mÒèêúå7ÞBE™´­DæãíímvˆŽŽ???2‘¢(‡cyæŠéèèØ¶m[TTTTTTRR’Á` \5?VÙO;؇½ùæ›Çûí·ÉîÃáüø£éï·Oš4©½½æÈáÏËËk\F?þ|`` ›››Ù!¼¼¼îÝ»7kÖ,Ò¹¯¯ÏÅÅ…Ô‰1FFA‘——×Ê•+ß|óMòÚþþ~zm§Ù"ì`öÞ{ï)Š 6455)ŠÚÚÚƒšô‰‰‰)--ýé§Ÿärù?ÿùϰ°0zóXvöìYºzðàA__ßÏ?ÿ|üøñÇ¿ÿþûà ±p᯾úêúõë÷ïßÉÉÉ!ÄápêêêÊÊʬ\̘˜˜’’’¦¦¦¶¶¶üãü±åþ½½½VÎÙ¶ì`Æår÷ìÙ³ÿþõë×kµÚ×_}Ë–-iiiÆ}Þ}÷Ýäææj4šßÿþ÷«W¯¶ræûÛß6nÜèããC7BdëRÅçó³²²ÂÃÇ"55U§ÓmÛ¶M­VO™2eÇŽäØ÷á‡îÛ·oÿþý~øaee¥5•¤¥¥i4šÜÜܾ¾¾­[·ZèüꫯfddˆD"777+—ÔV(²3·‰äää®®.¸‘QQQQ %%ÅVØÁQØ5H`$ 0 ˜ Ì‚„fA³lü‰ë7àó°g›-fÃÑŸIIIôwó6aËÏôÁóÎó a€Y0À,H`$ 0ëÿÎ/j´††QIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_type.html0000644000175000017500000001770712234777147025314 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Typedefs
         

        - o -

        - p -

        - s -

        - t -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Image-members.html0000644000175000017500000005407212234777147031531 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_Image Member List

        This is the complete list of members for Glom::LayoutItem_Image, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Imagevirtual
        create_local_image_uri() const Glom::LayoutItem_Image
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_image() const Glom::LayoutItem_Image
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Imagevirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItem_Imagevirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Image()Glom::LayoutItem_Image
        LayoutItem_Image(const LayoutItem_Image& src)Glom::LayoutItem_Image
        m_imageGlom::LayoutItem_Image
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Image& src)Glom::LayoutItem_Image
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem_Image& src) const Glom::LayoutItem_Image
        Glom::LayoutItem::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_image(const Gnome::Gda::Value& image)Glom::LayoutItem_Image
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Image()Glom::LayoutItem_Imagevirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1ViewBase.html0000644000175000017500000003100712234777147027400 0ustar00murraycmurrayc00000000000000 libglom-1.22: GlomBakery::ViewBase Class Reference
        GlomBakery::ViewBase Class Reference

        This is a base class for View. More...

        Inheritance diagram for GlomBakery::ViewBase:
        Collaboration diagram for GlomBakery::ViewBase:

        Public Member Functions

         ViewBase ()
         
        virtual ~ViewBase ()
         
        virtual void load_from_document ()
         
        virtual void save_to_document ()
         
        virtual void clipboard_copy ()
         
        virtual void clipboard_paste ()
         
        virtual void clipboard_clear ()
         

        Detailed Description

        This is a base class for View.

        This allows the App to call load_from_document() and save_to_document(), without knowing exactly what type of document the view uses.

        Constructor & Destructor Documentation

        GlomBakery::ViewBase::ViewBase ( )
        virtual GlomBakery::ViewBase::~ViewBase ( )
        virtual

        Member Function Documentation

        virtual void GlomBakery::ViewBase::clipboard_clear ( )
        virtual
        virtual void GlomBakery::ViewBase::clipboard_copy ( )
        virtual
        virtual void GlomBakery::ViewBase::clipboard_paste ( )
        virtual
        virtual void GlomBakery::ViewBase::load_from_document ( )
        virtual
        virtual void GlomBakery::ViewBase::save_to_document ( )
        virtual

        The documentation for this class was generated from the following file:
        • libglom/document/bakery/view/viewbase.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Button__inherit__graph.png0000644000175000017500000002001312234777146033336 0ustar00murraycmurrayc00000000000000‰PNG  IHDRåÀƒ$_bKGDÿÿÿ ½§“ÀIDATxœíÝ{TgúðwH0€A“UB¢ÈÅØõ¬-[¨¦â¡â%"ý ¨àÁ¶œZ[WÝV» W«Xw=ÕÓãe]«=* r¿Y/ÅŠ—U¡«¥P* (`…\æ÷Ç´c6pq`ò¦ÏçøÇ;o^ßyføÞdB$‰À„ÛÐW€È+À äàò °B¡ääd¶0,$$d(#Äú#„ÔZŒÝ»wñYÈkXXØÐï †ÔÔÔ!Þ#¬_N ¯'W€È+À äàÄLóÚÚÚº~ýz©TÊãñ¤RiTTTmm-õA …‚Á}=ap/9Aýš“ñSd>Xx?«W:nÞ¼yA¤¥¥¹¹¹=|øðàÁƒ~~~ååå<ñÝ©T*ª! óóó§Nв··g|Gàå™c^9RYYYQQ1|øp„““Ó¾}ûâãã¹ÜA©V Ðm>Ÿ¯¿9‚hhhpttÄtþ!fŽë¤¤¤U«VQa¥ ‡Coj4šØØX©TêèèÞÔÔDõqòäI‰Dboo¿aÆ'NˆÅâ#F¬[·Ž˜˜¨ß0† ˆK—.3fÍš5"‘ÈÖÖÖÛÛ;%%…››+‘HD"ÑÞ½{©Î¢¢"___;;;WW×C‡ѳݼy³û$A „œœœ{@ÉÈÈpuu!!!?¦ûI’ܱcǸqãD"Qhh(}ôžßØà^ϘyÊ‹¿Ô•Ø^‡ …œœc"„ŠŠŠ¾üòKww÷‚‚‚²²²Y³fÓÊåòÆÆÆ´´4„Ðܹsévee%I’ J¥R¿a0³þ¦ŸŸß•+WÆŒ³råʪªªúúúC‡ñx¼ÎÎNj@``à£GÒÓÓ¹\îóçÏI’tss‹ŽŽ®««KOO·²²ª¯¯§¦0a‚±IH’41`Ú´i·nݺ}ûöo¼1wî\ºÔ={öxxx\¿~½¢¢B.—Ó—òõ„žßÄ`ÓgÌ„!¾ÀóÊår¯^½JoÒßZ*•Šüý‹áééyôèQj@II B¨¥¥…z4??Ÿ$I­VkÐÖÏbºç555•$ÉææfFCu–••Ñ @effÒóS"‘h÷îÝÔ`•J¥Ñh¨iMLB5L  Ž‚$É7n „žcCŸWs\ˆÅâòòrzS¥RÑoЪ««ÝÝÝ©6Õ¨©©¡6ù|>BÈÊÊÊ =cÆŒA577ÇÆÆÊd2±X¼bÅ ý...óï߿ǎcÇŽ}÷ÝwïÞ½K¯aLLÒëª1qâD„P]]µYUUA½¡áââ¢Õjé“ЉÁ ž±ÁfŽeíß¿ŸúG ‚ââbƒ1‰D©TRmª!‹¯„ú²Éd2¥R¹sçÎ{÷î;wNµ@Ô7gΜû÷罹¦:;;Ïœ9“þN31I¯***¨FYYAR©”Ú‹ÅYYYÔN§S©TãÇ7v,ýl¶Ì1¯qqquuur¹\¡PÔÕÕeddlÙ²Å`ÌòåË·nÝZTTT^^¾zõj¹\ÞÇ×õ‰‰‰UUUú^©ÕjOOÏÒÒÒÈÈHôûOäM:5&&f̘1¯½öI’666½NB½¡fb@LLÌíÛ·KJJ>úè£ÐÐPú½¶ÈÈÈØØX…BQQQ±bÅ ÿK¢æïã`s7”‹>®_I’|ðàAxx¸P(´³³“ËåÔ3¨þúµ««+::ÚÅÅE$-Y²„Z¢‘Ý–nÝÛ¡„„ý u[¿R›999®®®<ÏÏÏïôéÓ'Nì>?UÃùóç½½½mllÜÝÝOœ8A36‰L&³±±ijj2±—¤¤$¡Papbbb$ ŸÏ ¤_éFÏß—ÁÆÚÆ ýú• ‡ð襤¤,^¼x(÷Uhh(Ú»`Íq=€1W€È+À äàò py8¼Šººf¶K°L,Üÿª§œ¥:t¨léR·áíÙ.dpÕÔÔH$’!ÝåP^œøƒüe++gç5vv^l2,ùúÖÄ‘#W7nLóñqËÊZÍv-–Ö¯ÌËÌTR(ª?~Êv-–òʰêê' Å}’DVVDVÖ ¶Ë±4W†åæÞäp¬BZ­.-­ˆír, ä•a))EZ­!D’¨¤¤V©l`»"‹yeRYY}yy=ýÖÚš“ý»%YÈ+“rr~²¶~ñKçjµ6%åGë±>^×*•ªÇ’¨þÈÈÈØØX…BQQQ±bÅ ÿþœ3l±ºéEׯ$I>xð <<\(ÚÙÙÉårêÙKýÚÕÕíââ"‰–,YbliؽJHH0hè+**ÊÉÉquuåñx~~~§OŸ œ8q"5OPP——Õ6VñcÇFåàà@½ÿ@õËd2›¦¦&ƒÂèþ®®®˜˜‰DÂçóé×R½‘ æ¿~5ëß/HIIY¼x±9WØ«àà`Ÿ7²]HŸP÷¿šó Ç–°0O………ßÿ}DDÛµXÈë`9sæL@@À¦M›ÆŽËv-–ã+–fnÑ¢E‹-b» Kϯ'W€È+À äuP¨ÕZ¶K°L×AñÕWg!²ƒƒ÷¨›>±b5jÔ›7ÜÙù€íJú-$$„íL1ëë[555×®]c»Š~+-mþÏJ}|œÂÃ=Ø®¥ß¤R©¯¯/ÛUeÖyÅÔêÕ‰Ŷ¶¼»w· †ÁO0ŒÀú•aíí¹¹·H={Öõý÷wØ.ÇÒ@^vþü]F‹²²²ÊÈ0¼ ¼$È+ÃÒÓÔ D­VûÃw[[Ÿ³]‘E¼2I¥j¿xñ­VGmjµº³go³[’…¼2éÌ™Û:Ý‹M‚ ÒÓáï²0 òʤ´4B/ÞoÑjuW¯þÚÐð”Å’, ä•1õõ-……JîÞ$âÔ©[l•dy ¯ŒÉͽieex)Ž$É´´"Vê±HWƤ¦éôW¯!„t:ÝÍ›ÕÕÕOX)Éò@^™QUÕPRRÛÓµB‚˵ÊÉùièK²HWfœ:u ¡žïËQ«µiið.3àê63**Oœ8šÞ¬¬l5jŸÏ£6¹\ÎãÇO_yÅž¥ê,Üï2(ÄâOX4•íB, ¬N ¯'W€È+À äàò py8¼œ@^N ¯'W€È+À äàò py8¼œ@^N ¯'W€È+À äàò py8¼œ@^N ¯'W€È+À äàò py8¼œ@^N ¯'ÿóù555×®]c«K"•òoÝúñùór¶ ÁžT*õõõ}±MêINNf¯0z¢Ñ>>˜‰ÐÐPƒX¿œ@^N ¯'W€È+À äàd€ymmm]¿~½T*åñxR©4**ª¶¶–zˆ …‚É£f|BÖ÷èååGo.X°àí·ß¦7ÿùϺ»»k4‚ »×Öc§!>c!c3k ŸÏ­ÓéæÍ›GDZZš››ÛÇ<èççW^^Îãñ/ÑòÈd²‚‚ªÝÕÕuñâEµZÝÑÑagg‡*,,”Éd'!!ÁÞ¾¯韟?uê‹WîûdJ ˜<¿9r¤²²òìÙ³ùË_œœœþô§?íÛ·ïÖ­[\.ÆŸNoì¹a0ž3Þzë­¢¢"êºÌµk×F-•J/^¼H=Jå• ˆeË–Qßÿ}©Ïç ôp8fkÖ§_ÝÖ/xð $¯III«V­>|¸~§Á9Òh4±±±R©ÔÑÑ1<<¼©©‰ê'âäÉ“‰ÄÞÞ~Æ 'Nœ‹Å#FŒX·n= 11Q¿ÑÝÍ›7D"‘­­­··wJJ Bhþüù»ví¢8::>{öÌX §› „“““A,ôûI’ܱcǸqãD"Qhhhߨ;™LÖÒÒRZZŠ:wîÜÛo¿xöìY„PmmíÇg̘a¢¶´´´Ñ£G;88|ýõ×ôœmmmÍ¿Ójµ¦¿—.]3fÌ·ß~kºøϳ~=µég777W"‘ˆD¢½{÷"„Ôjõºuë^yå—C‡ÙØØ pÅÒýþ²7B¡0''ÇØ£¡¢¢¢/¿üÒÝݽ   ¬¬lÖ¬YÁÁÁô£r¹¼±±1-- !4wî\º]YYI’dBB‚R©ÔoPêïb„ +W®¬ªªª¯¯?tèÇëìì|˜$É?ÿùÏ™™™¹¹¹ãÇ'I2==ÝÙÙÙtmï¼óΓ'O’““¹\îóçÏÉn×Ï©âM¾ŸŸß•+W:::Lßãy6v  |ôèQzz:Ud||¼§§gqqñ;w¨ÕŽÁ×´G!!!÷ $¯\.÷êÕ«/¦øJ¥"ÿb{zz=z”PRR‚jii¡ÍÏÏ'I’zÐo;€î577k4ª]VVF¦ææf›šš­V+‹/]ºd¢†äuòäÉIIITgmm-‡ÃiooØ‘$ùþûïðÁ?6lXKKK[[ÇS*•ÑÑÑaaa¦k»qã½ z@÷}™8üÔÔTz6Å÷xž@ƒ‚333õ‹ôôô|øôéÓÏ;G-^Mÿ_‰DÒ—]˜8ü1cÆÐÃLßãyî#ý©ª««ÝÜܨ¶§§g¿¦Ò7¼íß¿ŸúÖA ‚ââbƒ1‰D©TRmª!‹\¥™L¦T*wîÜyïÞ½sçÎÑýaaaiiiÉÉÉK–,!ÂD Ôs@¿â+‹³²²¨ïrN§R©Æ?àCxë­·îܹ“‘‘1{ölªgΜ9§OŸ...î5¯Ôª±W&¿OÆÎs_éìì\UUEµ+++û5•¾ä5..®®®N.—+ŠºººŒŒŒ-[¶ŒY¾|ùÖ­[‹ŠŠÊËËW¯^-—ËA_&OLL¤Œn n/&Ôjµ§§giiidd$BèÉ“'¡… *Š“'O†‡‡›¨A dgg·¶¶ÆÇÇëïZ¥RõXÕ«P(***V¬XáïïߟsfÈÕÕU,gffêçõ»ï¾ãr¹ÞÞÞÆjè— hÆÎ³A=}©-""bÛ¶m7nÜ(--¥^Ìõñ»Îþâ ëW’$""‚íZ~söìÙîWJ ‚ˆe»´¡æååõ÷¿ÿýéÓ§õõõqqq³fÍê5¬=ÂøŠ”3gμûî»›6m;v,ÛµüfΜ9Xÿ°bPrròÚµkÅb1I’o¾ùæÁƒ6åäuÑ¢E‹-b» Ð3ooï~øáå籜õø#€¼œ@^N ¯ƒ"?ÿ¶K°L=¼ÞêþG @ݸ1jâÄ'vvj¶ Á[AAÁo¼¡ßó?ϯR©4$$dhK²@ÖÏžY75Ù²]öÞxãÿùãYð!ã¶o?µwï..ÂŒàUr`¬_F’dFF1B¨¶VuûöÀo_=‚¼2¬¸øÞÇÍ!kkNzºám–à%A^–™ùÓ°a„Z­ÍÈPhµ:¶+²(W&i4ºŒŒâ®®ßîdojj¿~}à÷&ƒî ¯Lºzõ×––gô¦µ5'3ó‹õXÈ+“23‹­­_œRµZ›“s³«KÃbIòʘçÏÕ§NÝR«µúÏ/]*c«$ËyeÌ… ¥Ïž^Ðâpà]&A^“‘QÜý÷N5íÙ³·ÛÛ;Y)Éò@^™ÑÚúÍÎÎÞ´iSJJŠ Ûu1åõÀÙ³g>|ø¯ýkÒ¤IÀÝÝýoûÛáÇ9»…½ ÿ–––¾÷¿<[[[>ŸÏçó###Ÿ>}úèÑ£¾”7x% –óš——lðLÀçó­¬^¦Õj>¶páÂmÛ¶µ¶¶Rýþþþ.\ 7oÞ7ß|óÃ?„„„ÌŸ?ÿþýô€¼¼<ýFwëÖ­ |ï½÷.^¼ˆЉ‰IMM¥ܽ{wáÂ…Æj0øÚS?ƒƒƒ r ßO’äñãÇ—.]´y󿾑1Ïž=kkkkkk«««;v옛››T*íµ<ý¶‰“|íÚµÐÐР  ÌÌLÓe –óZQQáîînzLrrò… ¶lÙ²oß¾'Ožìܹ“~èüùó‡މ‰9~üx^^Þ·ß~ššZWW‡Ú¸q£···~£»/¾øB"‘}:..îÀ]]]»víêãóÉ'Ÿ,X°`Á‚ááá)))ýë_õ¿á•¡ß6q’³²²¾ùæ›Ï>ûlß¾}jµÚDC€å¼vttè]ý×ÖÖFwž9sfùòå“&M’H$kÖ¬ùïÿÛÑÑA=6bĈ3f „–,YB·©§‡·ß~ÛÙÙY¿ÑÝ¿ÿýïµk׎=Z(¾úê«jµº½½}úôé¿þúkcc#I’/^ 0QÃdgg¿÷Þ{“'O‹ÅëÖ­»råJggg_ŽÈ˜äççççç÷ÝwAAAñññ:®_%™8À   @0}út­Vû2GÍ–_o988TWWÓ÷Ääæævvv†„„èyüø±X,¦ÚT£¡¡aìØ±![[[„Aí¾kkk;~üxIIImm­D"¡:‡>mÚ´Ë—/»¹¹q8œ)S¦˜¨aêëë·mÛ¶mÛ6º§¡¡ÚûK‘]TTTvvvuuu¿Ê3q€Ô{5ý=±ƒ„å¼¾ùæ›ÙÙÙ³gϦ~~ñùüŸþÙ`Œ““ÓÇ©èÔE¦ X³fÍäÉ“W®\éééI’äìÙ³©þ™3g~÷Ýw÷ïߟ5kA&j îœlhhèûN>þøã7ß|“úïííí|>Ÿ©#Òjµè÷¬÷½<h&I¥°¼ˆŒŒljjÚ°aCYYYSSÓ•+WŽ=j0&000!!á—_~©©©ùúë¯}}}ûøÕÍËË£N=Ý@z/MÚÚÚt:V«¥~Þ¿ûöí¡§OŸ"„¦OŸ^VVváÂ…€€5ðùü«W¯vtt$&&êïšš¤;ª?00ððáÃeeeµµµ_}õÕ'Ÿ|ÒŸsÖú <èáááääÔÇòè’v’‡Ëy{÷îµ··ÿì³Ï"""Μ9³yófƒ1K—.1cF\\ÜÇ, £££û8ùöíÛKJJôHï¥É‚ ~ýõ×O?ý433sÑ¢E»wïž3gÎ믿þùçŸ#„ììì¦M›æèèH½4VÃêÕ«>¼téÒ)S¦Ðû}õÕW£¢¢ºG–î÷õõ‹‹ûàƒ?~üÅ_ô÷¼ jÙ²e=Ú¼y3õ¤Økyt{À'yˆƒ÷‹AüãÿÀ÷þ×ØØØI“&EDD°]füýý“““ÃÂÂcrö¯Çš¡ÎÎN¥R©P(V¯^Ív-¿ùñÇ{|Î[¶lYTTÔÐ×ÃÈk wìØ9jÔ(¶kùõvéäµ2™L&“±]èÜOpy8¼œ@^N÷õÖ;wu~ð‡3H7fð.Có7xh¯oÀ8X¿œ@^N ¯'W€È+ÀÉÿï"“¶¨óq"IEND®B`‚glom-1.22.4/docs/libglom_reference/html/inherits.html0000644000175000017500000004172712234777147024067 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Hierarchy
        Class Hierarchy
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Notebook__coll__graph.png0000644000175000017500000005200212234777146033135 0ustar00murraycmurrayc00000000000000‰PNG  IHDRij>ð1bKGDÿÿÿ ½§“ IDATxœìÝy\gþðgG@Äp‰„Að¦-]]ŠPñXÜRÁå,Ö£ÒzÔÕÚÚ-h©õ–UWÛjíVŤ€"íÔµ¥ˆ 6ÔâQ”Ûä&€\9ç÷Ç´i˜d’É÷ýêÃäÉ3ßðÓ9ž<ÁpG†Ç€ê€ L€¦@S „)Àê€nhhh(..¦º €B¶¶¶S§N¥º  Â ”)S¨.AßUWWS]P ÂèÑ£©.Aß566R]Pî™ L€¦@S „)ÂPð¦¦&¿ùæ›!!!òk~üñG&“ùüùs5”Ö§AÕ ô „)С¡¡YYYÝÝݲ5/^\°`ÁÈ‘#)¬ y¦@½H9›[¸p¡‘‘Qvv¶lÍÅ‹ƒ‚‚4_ }0dâñx3fÌ033srr:yò$†a![[Û¦¦&@°iÓ&;;;[[Û/¾øBö ÃÎ;'¿Ð›±±q@@@jj*ñãÝ»wkjj/^ŒãxLLŒ³³³••Upppss3BH*•ÆÄĸ¸¸Œ1ÂÓÓóÆDç²JÄbqtt´£££Mxx8ñ.¢Mnn.—Ë=uêT_;˜žžîääÄb±‚‚‚ŠŠŠæÍ›geeejjêæævþüy¥ÇAi½Á€|݆ ‚úúúœœœ›7.22²¶¶6--ÍÀÀ ®®!ÔØØˆãxtt4—ËÍËË+))™5k–l}|||ee¥ü‚RÙÙÙ#GŽìééÁq|ç΋-ÂqüÈ‘#®®®ùùùååå~~~AAA8ŽöÙgŽŽŽ¹¹¹555ÑÑÑÖÖÖ"‘ÇqÙ÷íÛçââRPPPRR2wîÜ€€b!//¯¼¼¼®®.¥5 „¦M›vçÎ{÷îyzz.Z´hâĉk×®­ªªª««;yò¤‰‰‰@ è}¢££{×)////44tÒ¤Iáû÷ïß¿Àf@ó LJT S++«Ã‡Ë|>_,Ë"ÌÙÙ966–xéÎ;²õ*‰DÖÖÖ/^Äqü/ù ÑÕ”)Sˆ555 £³³sòäÉÄÉ ŽãR©”ÏçK¥R\.LÇöìY¢Áýû÷BmmmDƒ”””~j@ÉÂíÛ·BUUUb±˜XSRR"Û„Âq˜8qbï:qïêê:qâ„»»ûìÙ³“““…Bá€ÇÂTkA˜•¨¦IIIvvv\.wÅŠ7nÜÀå"ŒÉdæåå͈GIƒ SÇW¯^½lÙ²'Ož577ã8njjªp¥URRbjj*Û<ùJ®_¿._ɯ¿þJ4¸uëV? „ž>}J,wuu!„²²²¢¢¢fΜioo/º­p”ÖyéÒ%[[Û 6Ð"¾¾¾”_*iC @Á™)ÂHa $€0ZJéS ÂÂBR:_·n†a™™™ [$ú'qC@@˜-ÅÿB(''‡X~ù嗇߳D"IKK;vlJJÊð{€Oó–b±X²esssù‡é‡~ …G}çw‰‰ Y=}g¦@Ç`–žžîììÌb±BBBúš´ÉÉɯ¿þºX,¾råJ_Í”N{ªt²T™ÖÖVb¢, ‡ Lîùøã“’’òóóŸ={1¨÷ŠD¢ .„††šššúúúʦsîíàÁƒIII©©©7oÞ¬¯¯ûí·BGŽ9vìØéÓ§ËÊÊæÏŸïïï/Ÿž®®®{öìihhòÞ]EñÇYŽPñ³ùê€þü‘y„Й3gˆå¢¢"ôûl¤*ÊÊʲ²²"f·°° &œ–ß± tÚÓ¾&K•yüøñ–-[8βeËúŸÐohà³ùZ ÎLîqqq!&Nœˆª®®Vý½ÉÉÉ---ÆÆÆ†-[¶¬½½½¯+ý§OŸÊ6D,TWW?zôˆØ(BÃ0‹E|!Š —ËÝ»woyyùüùó׬Yãáá1Ⱥ ÂèžŠŠ b¡¬¬ ÉÍF: ¡P˜‘‘'*°`Á‚¾žé+ötÀÉR %%%7oÞlooŸ7ožÊ»t„)Ð=»wïæñxS­—ù€JdMêâââããCz·¨>¨4„ÉC•¶Wø†>˜“hœ™ L€¦@S „)Ð "‰ˆêÍÁÓ|0::Žã».ïÚæ»Mõ·dg½äð’Ã(õU540«Ö‚0ƒP\\Lu CQX[xºàô?ÿa€©z)ÖTÛ4+eVäŒHoŽ·Zk[[[ªKJÀ' ýÍ>0;·4·0ºpÚØi*¾¥[ÔÍÚÈJ„æl8|ÐØÐX­€{¦€æn?¹[š‹aصÒkª¿ËÔÈÔËÅ CرMß3½²±R}z€04·ëÛ]†††}ÿàûA½q‘Û"CC‰TòàكɟL>~í¸š*ôa 謴¾ôâ‹b©X*•^+½&Å¥ª¿wÞ”yıT,”ׯ¯]»´CС¶bnƒ0tvðòACƒßž²><¿_s_õ÷º;º³ÌþøJTá)¼”w¼xçé’«´a h«¶­öÌÍ3²¦† ÃÜÒ\Õßn€ÌŸ<ßñLj‘Dô´ùé_÷üõóï?'¹V û LmùáŽþ¬‚ãø Â!4ê|…á.b©X$}üÿ—þ­]­ä h†Fzjënsø—C§ S~¥¥™eógÍ _×ŠÆ ×­®J_2dr­¸×_tspn­€àÌÐÓ‰k'"ÂJ~¿¤¾DõN\l]XÊ?…ãxUSÕ¹‚sC/Ð „) !¡Xxàò1.VXÏ0` j´)Bèõ—^7b)¬4d:Û8ߌº3¬B@˜J¸•ÐÔÑ„”ÝÁÊ-ÜmÓyS扥„2À!lóüÍw·ßõç9Ì:ÀgóÝà8¾ÿÒ~¥/I¤’œ’œAõö·IÃF<È2b±ó\ðÜg‚©‘) µ3S@7Ù÷³Ö=Ä0ÌÄФ÷zm[íãæÇª÷Æ2c¹9¸ßÇ÷Æ+oÜÝ~×wªïÊÓ+žëäZ@}ài> ›§-O}ök]{]5¿º¾½þbÑÅQ†°–Îâ‚=nUܲËTï0*-*öFlìŠØÅ/-Fµvµ¾°ý…éNÓ/¼{A]ût„) ¹Yf½àðÂÑð£8Ž×·××µ×dŽt±uQ½‡ò†rK3KkskÙš+¿^ñýÜ÷\ĹðWÂÕP2ÐIp™h®¾½~ôÈÑ! ÃÆŒãîè>¨$E¹Žv•OR„Ђ© Vy¯ZÿÍúj~5™µ]a h®¡½a´ÅhÒ»=rh”é¨UgVÁµ @˜:ˆ­Ý­vv¤÷lajqjå©«®Æ^%½s ‹ L5>oÄqœ¸Ì'ÝÜIsÿ9矛’7U4V¨£ [ L˜Ôq™Oˆ Œq`9¬<µrP3¥Z‚0tÖÐÞ€²Iþe>ÁÌØì쪳ù•ùG~8¢¦M]a 謾½žiÄ´0µPß&<Çyþká¿¢Ò¢~}ö«ú¶´„) ³†ç jºa*oûâíì&¬8µB65ÐC¦€Îž7¨ãQ¾C“³«ÎÞ«¹wàòuo h-S@gõíõê{ú$ÏÝÑ=úµèßî¸[}W›ZÂÐYC»&ÎL [þ¾ÅÝÑ}ù©åB±P3[ZÂЙfî™ Ï®:[ZWºó»šÙ"Ð*¦€ÎdÌ׌Ic&í^²ûßÙÿ¾UuKcZÂÐŽãÏ5sÏTfÓ¼MÞ®Þ+N­èukr»€r¦€¶ø]|‘D¤±{¦Ìàô[§Ÿµ>ûøÂÇšÜ. „) ­úöz„&/ó Î6Îûƒö~õóK~Ô𦅠LmÌ×ð™)aÏš…S¾uú­ç=Ï5¿u@ S@[MM†)Ì묆\q²½§ýÔ5¿u@ S@[ÍÍL Cj¾‚—ÍbúÙñkdzîeQRÐ0S@[--”œ–Ê,›±,hZÐ;qï´t¶PXÐ S@[--V#¬¨­á«7¿’H%7R[ÐS@[Ú¦6æ6_/û:áVBJa µ•uƒ0´ÕÒÙb=‚ÊË|‚¿»ÿ›žo¾›ð.1T Є) -m83% ?jjlº:n5Õ…5‚0´ÕÜÙ¬%a:ÊtTìŠØoï~—Gu-@] LmiÏ™)Bhþ”ùïÌ|gcâÆ'-O¨®¨„) -­ S„СC¶#m#ÎDà8Nu-€|¦€žº„]=¢mx%3ÂdÄ™·Îä”ä|}íkªkäƒ0ôDŒ“ת3S„·«÷Æ¿mü0åò†2ªk$ƒ0ôÔÜÑŒ´/LBûþ±ÏÉÚiå©•©„êZ™ L=g¦Ô~œT)C“¸ˆ8Þ#ÞgW?£º@&S@O-]-†YšYR]ˆáþ%Ò7òã ߯¹Ou-€4¦€žš;šG™Žb0¨.D¹Oêæà¶üÔr‘DDu-€¦€ž´m\”CøUqjìËÚGu-€¦€žø]|­ÕÛö”m~Ûv}·«ðQ!Õµ@˜zjîЖϒö#rQ¤ç8ϧWôˆz¨® „) §Ö®V–‹ê*`€|½ìëÊÆÊ˜ìªkÃa 詽§Ý‚iÑ›àà`ŒjS¦ö\éÙ±|Õ…¨Wpp°f~ï¢æëqP·ç=ÏG2GØÌÓÓóý÷ß×@=úìðáÃT—  ¦€žT S‡¢zôYJŠ^|Ë\æzR1L „) 'S a¦€ž L†A˜êu‹¥bS I¦€†ž÷Ÿ/‹B8Ž;;;ÇÆÆ/ݹsG¶^A[[“É|øð!Žã>>>§Nš2eJBBñjMM ƒÁèììœI?D}Ñ“{U½­‰_3÷àÜ›©x|®^½êææÆd2]\\q÷ñña2™ÍÍÍàý÷ß'žæÇÅÅÉþBñññò 8އ††r¹\â6¨P(ŒŠŠâp8æææ .¬¨¨ V~òÉ'\.×ÌÌÌÃÃ#''‡x£lsB¡022ÒÁÁÁÊÊ*,,Lö‡§ô/ª³³óøñã³fÍRåˆÉ ^÷L÷íÛçêêjaaØÐР°SªÐ“¿Ã¡„illì˜1c:::äWÊN}I¡¦ž >¥úo z˜ØÿpèÉqoá'ÂýúØLoê”þ%#„RSSUïDOŽóP.óÖ¯_?bÄù•,KþÆ|?â’’’8ÎÈ‘#·lÙ’˜˜Èf³-,,d—H ôú)C6¶nãÆóæÍ³²²255uss;þ¼¬Á·ß~Ëáp¬¬¬Ž=J¬T3(ë­¨¨¨w'òCü”6 ¤§§;99±X¬   ††ÙzÇ{%TØYÿ}5ðˆÞ`Ê(¥.]º¤ô¦™l ¬Š\\\†?⊆ä“UÅ3SKKËÌÌ̾^Eñx¼}ûö¹¸¸”””Ì;7 @öªŸŸ_SSSjj*BhÑ¢E²eâJ'>>¾²²R~A¡gù½¼¼òòò¸\îÚµk«ªªêêêNž©­­õóó+,,¬­­MOOß±c‡B›Äõ¥÷½‰D"ñãÇ?xð`ùòåè÷ m¥”Žì¿bTV? ¢¢¢îÝ»wÿþýuëÖË&.S:–°7¢Uû (ÍX·n†a™™™ò+eC’al²¿æWý³ùOž< ·´´433óóó#Î=å2 Né2R6@¯w{ù333œœLLL¼¼¼²²².\8iÒ¤Þý5ô3H4ë«Ù¿~¶’ààà`ii¹téR…ƒÐ{,¡BaòClÜ×r_ôä^•±DŒ½ƒç°¥ö±Xlkk;vìØ7ß|S~½ü¿ ÍŒMVí9ÎjЙžü+hëjCo£ì{Ù¶ÔžãsåÊ•Q£F%''[XXÃN¦:žcºy.нiö“““^ýu±X|åÊ•¾š)¾­tTbŠÚwÀD'€~tî;KD"Ñ… BCCMMM}}}å?¢@é|¦JgA•½¥  ÀÕÕuÏž=ò'êa 覣§!dnbNu!ªºzõ*BhÞ¼y¡%K–dff ¥-O:µmÛ¶W^ye„ _|ñEFFF{{û×_ýé§ŸƒövîÜY^^.ÿYD__ßk×®uvvN›6mùòå?ýô“fvJA˜ºéu#„Èšf_’““[ZZŒ1 [¶lY{{{_WúJ‡o8 *—ËÝ»woyyùüùó׬Yãáá¡Î½Ñ_¦€nº„]!ScSª Q‰P(ÌÈȈ‹‹“ÍŽ¶`Á‚¾¾ QéðígA%”””ܼy³½½8¤ƒ0tÓ-ìF™éF˜^ºtI,²~’™™) {7V:|»ŸYPBàܹsÞÞÞžžžÅÅÅ{÷îÕàþé%_õ¬=jrrÒÐ÷ô ëu3 ƆÆT¢’äää×_ÝÌì›k×®½|ùò믿®Ð822²££cÉ’%ÝÝÝ ,8räBè£>K—.mjjrssûî»ïˆÏ²²²²³³ÿóŸÿxzzjfô–’0íça"m|õUñ›oŽ9r¸_£åª««9ÕUhZ·°[WNKB k¬­­E"±Œÿ>‘l!&&&&&F¾½‘‘ÑÎ;wîÜ©´ÿ%K–,Y²„ÌŠA”„ihh¨æëÐ$3;»w6nÜßÕu—êZÔ.((ˆê4­KØ¥…7L/]º´hÑ¢Þë?þøãÝ»wk¾@º?…iHHHHHU¥h̉¹Ÿ~š1kÖʬ¬÷©®¯[¤g¦¾¾¾²³K@Kúø*-íg„Ð;OŸ=k¥º@¾na·‹´¡waZUÕx÷îS„ƒapá‚âÌ€ºEÝZx™hOïÂôâÅ_ŒŒ!‰Dzþ<êrùtë  ½ ÓääŸÄb BÇñ²²ú’’:ª+$ƒ3S@ ý Óââg7Ë1.^ü…ÒŠùº„]pf 4O¿í_¸pÛØØP(ümN‘H’’Âû׿|{» Ð]ƒzU]]MùÀjCÔó¢$¡ˆ±BJÓz2Þ™ž¿<¥pOIáÉ’”PSÃ/*zúòË\ªª¤ëuÛŽ´U±qAAµ«§rÐù¨¤ìsSЇñÎz¦……ÚV122nC˜Ò‰êãLûšODsÊþ‹~~I…Sü¿Àl ¸0hõ8S©ý¼ýè‡mH*B!Ì9(Ît‘¾„iffBÈÐÑû?±XúÿwG$R2Ÿ.ÐEÚ;Îôy)ºôWTz !!Ùß›®ñéA_@ùøLÊôÑGç—.ñÒK޲5=––#¨( L;':A%Ÿ£_>BG¸Âÿ¶Èn5%RéK˜úû¿,ÿãGŸ9sÂâÅîTÕÔ§K eSð ù¨ Õd %³FaÈæd¤3_¤ ú¡/a ôŽã=â-zÅ/Byÿ@]O•%)B†ˆ­d’S ‹ôåž)бÇq-ºÌ7sD–/#\‚”~ÊN*Bch¼& ¦€VˆïyÖ¢Ë|k43 ½š‚ G!ƒ^_“cl‰¬§SQ „) •ß¾çY{ÎL Žèõ‡hÔT„äÎO1âæ…  S@+¿}ϳöœ™Êˆ;ÐórÄþ;b0‘ñ¬BŠì})® ÂÐ q™¯E Rº‚XnhVZø²˜ˆ†p™Gue€4¦€V~;3Õ¶Ëü_÷¢öRä•€0CÄzùþŒ¦ü ±^D¦öTWHa hEë@!„šo¡û»ÑËû‘ù¸ßÖ˜ ÷£¿}OiY€d¦€Vˆ3S¦!“êB~'îBù+‘ý4~­âK&ÖTÔíZˆ!¦‘Ö„é½í¨§ͽOíiÂЊ@,À0̈ÑkD'U\"И¹ÈÌqà–@ÇA˜ZŠ…F #-úR/‹‰Èb"ÕEM€{¦€Vb‰¡ ÕU}a hÂPÂЊP,464¦º   L­À™)  „) H@ñ™ií%$äSY „) ¡DHå™i[1º¶Už¡¬@S@+T^æKzÐõ`d3M|š¥`œ) *@Ýûu×¢9—ç(ú~ë€V(;3mÈE¢¿Ffœ¡u€aXSS¹E©µÛÂÂBÒ»Õª-„) ˆŠ0µ£‚·c ·BÓ›ZÂЊPBÅeþí¸ýõ˜¦·;lj:o%K_åigÙ¦€V¨933½r™Øôõzcc£Â7cÆ 333''§“'O+SSSÇŒcmmýùçŸ#„ŠŠŠæÍ›geeejjêæævþüy¢†a¹¹¹\.7666&&ÆÙÙÙÊÊ*88¸¹¹!$6mÚdgggkkûÅ_ȶˆaXzzº³³3‹Å inn&f0°µµ%‚IÖí©S§¬¿7¥Õ¾öÚk‡"ØØØtwwGGG;::ÚØØ„‡‡5£?ç#±¬PžüŽÈÖã8Þûm’’’8ÎÈ‘#·lÙ’˜˜Èf³-,,6oÞ,ßUkk«X,îg§lð'¸^²·ßtñâ/TWÈç÷…ß²ØeTWñ‡¼¼¼ÐÐÐI“&)¬7n\dddmmmZZšA]]BhÉ’%---ÉÉɆ††==='N\»vmUUU]]ÝÉ“'MLLŽã!//¯¼¼¼ýû÷»ººæçç———ûùùá8ÍåróòòJJJfÍš…jll$Þ5iÒ¤‚‚‚ââbooob%ñª|·]]]Öâñxòk”V{æÌ™3f Þ{ï½5kÖìÛ·ÏÅÅ¥   ¤¤dîܹ²å+‘Õ,¿R¶EÙú#GŽô>D??¿¦¦¦ÔÔT„ТE‹dË²š³³³ÇŽ»{÷îúúz¥¿¾üé˜ Ø‚– LéjÁág"¨®ïêê:qâ„»»ûìÙ³“““…B¡B++«Ã‡Ë|>Ÿ8ý¹}û6Žã‰„ â´ˆhSRR"1)))8ŽO™2%!!hPSSÃ`0:;;ccc‰•wîܑי3gˆõEEE¡¶¶6…´"ºU¥þÞaª´ÚÖÖV&“Y]]-‘HØlvnnîøñãÏž=K4»ÿ>Q>Ô0Uzˆ999²ƒ)¿¬PöãÇ·lÙÂáp–-[vëÖ­Þ¿ÊüqLúyÆ LéjÖþYïž{—Ú.]ºdkk»aÆôÕ&))ÉÎÎŽËå®X±âÆ8Ž#„ˆW‰°xôèQTTÔÌ™3íííÎ1‰Õ¦¦ŠßÎRRRÂd2óòòˆ~º»»åߥ°þ×_UH+¢[UêïJ}Uëçç÷ùçŸçääp¹\©TÊd2¯_¿®P>Ô0Uzz7Vº,¯§§'..ÎÝÝý¯ý«Òý°ŽãpÏЊ@,01¢ø³ùÇÃÃãòåËYYY|¾ò–úúú>~ü8%%ÅÞÞ~öìÙ555è÷»2>>>•••xôèÑåË—å_200@±Ù쌌 â_²T*åóù&Làp8¥¥¥D³òòrùwUTT eeeÄÛª"ºU¥þÞúª6$$$555999,, Ã0‡SYYI¼D,ÈÊ Â®ººZÅ-öuT»LIIÉÍ›7ÛÛÛçÍSþ}±6@ð ÐŒP,4fPkÖ,…õW¯^ussc2™...‰‰‰¸²ëÜÌÌL'''//¯¬¬¬… ‚ÐïתB¡0**ŠÃᘛ›/\¸x´"Þÿ}âi~\\’»dÞ·oŸ«««……E`` qKÁÇLJÉd677ã}\÷U¿BŒðx¼¾ªÅq|ñâÅS§N%–…Badd¤ƒƒƒ••UXX˜l—ãââìì쬭­Ï;'«¹¯òdë•\åËüôôôðððüüü¾~}6‡õ>.ú€Í~ÿ¿ÿ]±x±;Õ…’ÿxüJ¯•¿ö±·Áÿ]öD^ç7X[!†a<oúôéšßt@@€‡‡ÇÖ­[5¿iM‚Ë|@+B±šgw¡o 1ó7H[¡‹®®®[·n]¹reéÒ¥T×¢v0Ñ  µ?€*ŠDB>ò<¥s_ÝLÉ5hvvöÊ•+·mÛ6vìXÍo]à L­Ä5>€z–J¿D>éˆ9Z]› —ÀÀÀÀÀ@ª«Ð¸Ì´" Õuf*lA·ÞFNK'@-ýa hEC£xë‘!úëQµtt„) ).KÅj™5 —"¦òø"¿s@ pÏЇX"F1ŒÈï3@Ó>#¿[@#pf èC$!5…)0ôA„©¡\o @˜ú€3S@!S@b©!dda (a èƒäËüžzrúúÂЙ—ùMùè¢3jù™„®€~€0ôAÚÐ(Q;ºŽÆü Yý…„²€~€0ôAÚeþÏ›¤½«s³™ Á @¿]æóÔ“TTyùdÀl&`PàÌÐÇoOó‡s™ßS‡xëË*Äñ'­,  L}ðê§5ÈØMû‚´š€Þ€0ô1Ü{¦¢v$hFÇ‘á2Ëúî™úîÓ|# 4ÿ:™}g¦€>à㤀B¦€>~»ÌgÀõ „) žæ0T¦€>D†a0 „) ‘D4è$• ÔS Ð;¦€>Äñà´î{ôíDÔ]«¶Š€0ô!’ˆñYÒžzt3Y¿‚LíÕYÐpwI:t(??Ÿê*ÈWc\Ã4f«ÒØÝ®~µ{Ç–ôî¶ÏUjO­3f|ðÁTWúaªòóó <==©.„dB¡ƒŠ‹êíÞ»ê+’èÀÅYAAÕ%€A˜ê)OOÏ””ª«*Qñ\PKþ· ÚÂHa $€0@˜ †õ4???ÿСCd•¢IæævGŽŒ×½jçxC Ãmll¨.dpÔT¶Ž 0LÃ:3}úôijj*Y¥hÒK/Õ³Xº—¤´l 0Ά+j åã 5|ÎEËSŸ/‹eAàììK¼tçÎù€×ÖÖÆd2>|ˆã¸Ï©S§¦L™’@¼ZSSÃ`0:;;'Ož|òäIb¥T*åóùR©—ËñãÇŸ={–hpÿþ}„P[[Ñ %%…XßÕÕuâÄ ww÷Ù³g''' …BUvçöíÛ8ŽK$b[­­­b±˜hSRR"‹Ä†”Öß×Ñ@9s†X_TTD”­¦²úûaªà2ô騱c111cÇŽ]¹reqq1ƒÁ½T[[;aÂbY¶Ð›……Å¢E‹ÒÒÒž={öË/¿WUU-]ºÃ0 Ã$Iuuõ£G&NœH¼Ã0‹E\Ë<}úÔÅÅ…X&ª««‰¹\.BèòåËcÇŽ½{÷nbbbNNNHHˆ‘‘â\|Jw‡Ãá „ ~û‡ÐÚÚíããÃf³W¯^-ÿvbCJëïçhÈÊ&vPV¶B·€ LAŸ|}}?~œ’’boo?{öìššÙK§´´”X.//ï§“ÐÐÐôôôÔÔÔ€€sss6›‘‘AüŸœ8 0a›Í®ªª’½¥µµ•8U”ß\ee%±L,°ÙlâG"9އ‡ÇåË—³²²ø|¾ê»£Ú>>>•••xôèÑåË—å_"6¤´þ~ŽFEE±PVV&_¶B·€4ô‹looÿðÃMLL#""dÿ21 +,,$q[¤w¨…[Ô ww÷¨¨(.—;}útÇ™L&BˆˆªeË–íܹóÆeee›7o–½åܹsD,Ê^ýõ‡=ztåÊ•¡åË—GGG–——¯^½zΜ9¡·Þzkûöíׯ_¯««;xð ‡Ãéîî&:$6·bÅŠ]»vñx¼ÒÒÒ 6øùù±X,ùR§NúÝwßegg×ÔÔ¼ð ·oßVewˆD"ñãÇ?xð`ùòå¡––ùJëïëh „vïÞÍãñ}èÐ!âAD||¼···üBoaaaãÇ¿}ûö£GÞÿýåË— …ÂÙga“’’‚‚‚>ÿüó¾jP€ÿ~ªð9ùõ_~ùelllbb"ÇëééY»v­Š{hÇñéÓ§S]ДáœÖªx™ohhxãÆ Ù²Móù|ü÷K¡~wЈǻòË}]@õ~IéàÁÖÖV&“Y]]-‘HØlvnnn?5(ÜYë½²÷e¾Ò‰CÛ#¸Ì×OðûÒ š83e³Ù²#D†Ê²!ô3ÐÜÜý>‚D~YuJŽ5jÞ¼yiii×®]344œ9sf?5 Ò‰dí@ÛhâßðâÅ‹;&9Èb±~þùg…6ý $¾¾WúÉÉÉaaa†õSŽãhÙªt@"Y{Ð6šÓO>ù¤¶¶ÖÏϯ°°°¶¶6==}ÇŽ mHØ—ÞB­¿“H$} ô÷÷/,,LJJ ï§‹uñâÅööö={öÈoº¯Ñ‚Äz¥õ ûzBa:zôè›7oZYY-X°ÀÕÕõôéÓ½g틌ŒüÇ?þ±dÉ’3fŒ=úôéÓ*v¾lÙ2b’!ÙBhΜ9–¿ûå—_¾þúë£G²Ùìwß}wåÊ• .ô÷÷GYXXÌŸ?ßÁÁx>ÖW _|ñEttô¸qã^}õUÙv}||^|ñE…Ýòë·lÙâçç·dÉ’—_~ùéÓ§iiiƒ>pÝárO„ëüùó¡¡¡Ãér[·n¥º•ó™Y²úQ†a<Oݵå' •ß"=&Õäï ™þ>÷èêêºuëÖ•+W–.]Ju-ôÑ{ÑÞtqØ/1 ¤Ÿ° =ý ÓìììyóæmÛ¶mìØ±T×Bׯ_ óññ°¥.û-((puuݳgOCCƒÒlèo8ãª`>S ÓÂq¦Î"Šè2ì÷ñãÇ[¶láp8Ë–-»uëVïC1`ƒ!ƒq¦:AÏLÁð©2‹ho::ì—ËåîÝ»·¼¼|þüùkÖ¬ñððl@o¦`èT™E´7ö[RRróæÍöööyóæ ­ +S0tªÌ"Šh1ìW œ;wÎÛÛ;""ÂÓÓ³¸¸xïÞ½ƒjèo8÷àž©†iá=S™¾fUø{ãñx}ÍŠãøâÅ‹§NJ,÷5‡i\\œµµ51I±¾¯IBågDí=)Þë«ÒeÇÓÓÓÃÃÃóóóûÚý Ü3Õ ú>δ/mm]]]B{{•>…¥1º8ÎtPtkدÆhíï È3~ ߢC66o :;yR©€êZþDu jÑÕÕuïÞ½+W®ß_€ÎV˜zyyWú´”›[{á‚Í+ p||ì µâÿŽŽŽT— ÙÙÙ+W®„a¿@w ë2ŸÞÚÛ{ÜÝ·õôˆ ÌÚzäÖ­~AAÓ ´"R‡ .u ü¾t<Íï“…3<ÜÓÐ!‘àÏ?ø ÑÛ{Ï·ßÁÿ~½A˜ö'"b&ñaÇ¥R¼¦†¿n]œ¯ï¡7úû¦x€‚0í³³­—×xã·£$K¥R¼¤¤.8øËààc¿þªø}½a:€Õ«gI$º® Å¡Ÿ~ª\°à?«WŸ}ò¤™¢ÒZÂtsçN¶³Ù{½H$ÁqüÒ¥{sæìÏÉy¨ùÂôJÕ÷­]Í"ª« ?$Œ3¥7Ãàí·}þýïl±XÒûU©Tèáã£{_šª„ 0Æ?Ø<¬|?ºçKu-T¢ëøb:¡Qkoï~é¥mâÔ¿†mßîÿÎ;³(©j8òóóŸ>}Ju“v2º.ØKj˜†“:Fø×Q]•g̘Au ?¦*Ù¼995•'ýqrÊ`üç?¡!!0ÍšºÔßíüßæŠž61.AÞ‘ŽSBl©®€þÀ=S•¬^=K,–ˆ²Xf••E Ý9SÿíªÒîV .A!ûiæT×Ààž©J&NãîîxçÎS ÃLL Ïž}§®®uãÆo,,Lß}w.ÕÕÑŠ°C’óIÕ“kÏÂŽBÆ#–ãL©® €@˜ªjõêÙëÖÅYY™&%½ëææ€ª«kÛ³ç;+«aa¯P]Mð+z.¿_ÞY'Bè·»O˜6fڤʀ¾ƒ0UÕk¯½ô·¿M>x0ÔÎn±fýú¿57wüë_çY,3_ߨ-*¯òs·=’Š‘Tn`/f€ì§)š€¶Pƒ •â à8þÁI/þ’”´ÖÃcU…é:©¿u¨æþù¤ì1 n¢íÔ/ €ÁPƒÐ{Ê( Ãöïñòr}ë­S¥¥z=vgÈíâKÊMQž¤ cÌz¢™Æ‹`Ð L‡ËȈqâÄJ—Ñaaÿ­®VõKåA*Æ/m¨¨ùé9.Uö2†l§Ž0ÐŽ™dè„) LMÏž077yóÍã­­]T—£K ±E_ºº…ŽÆ0„1CÓÀsxn˜ÝaJKËÉÉë::z–.ýº«KHu9ºÄØœ1ã#ŽßÉ #í þœ§R!nÿa t„)iìíY kªªšÖ®=+áT4ÆÝüoûœFŒ1ƘìºÞÀ³uƒGO@7@˜’iâÄ1ññ«oÞ,ß´é&1(R1ž»óÉ(®ÉâØ #9&Ä)ªÕxSCøºþRI6mÚØ¯¾Zž™ùËÞ½ÿGu-ºäÎÙúç5‚™sG¿0"(iòËïŒ10ÄØ…¦@gÀ8SµHM-|ï½o>ùdñÚµ³©®Eð+z.¼ùÀc£ƒÛ£ÿXYÙ#Ia\Ðð (µ š^SÃßµ+ÓÒÒ,4f–ê.ůí|l3yÄÔÐÑòë-Ç1©* €!€0U—÷Þ›Ïçw~ôÑy[Û‘sçN¦ºíõkrcsi×?'cpÏ è2øûU£O?õøË;ïœ),¬¢º-%î‘þr¢î…7íXNp tÜ3U/‘H²bÅÉ;wž^¼¸ÑÕuôÀoÐ?üŠ Gc†1üè6Sµëè}ÙØø<3s£ƒƒ%ÕåÔÂTZZ:ýý¿044¸pa‹§ !¸¶Ò+« «[[»–-;6€– L5„˵þ曵ååëÖÅÁ‡M SÍ™<ÙþÔ©U×®•|ðA"Ü]€f L5jÆ —¯¿^‘‘q{ÿþlªk¡ÌãÛÄ=pn膱}ûvªkÐ/..£mm-vïþväHÓiÓœ¨.GÓîufÿ³Ìrœ©•+|á( øÞ|sF}}ûŽ--Í‚ƒÿJu9š#Jüôwæ(_"è.ó©±y󈈙~˜üã©®EsnŸ¨ëj{}ä8Ì~0 +,,‹Å†555 ¡‡á¼¥ L)³}{€¯ï §þùÕµhBÓî»gëÿúO¶ùcR:d0ñññ#Geš¾á¼¥`Ð>•D"ɲe'î߯¾xq£‹ ?l*ãË™2üNLþ„&†ñx¼éÓ§÷ߦ±±ÑÆÆF•ÞTl @?àÌ”JÄ7›:8X.]z¼¾¾êrÔè~bCk•ÀgW!I1 KJJâp8#GŽÜ²eKbb"›Í¶°°Ø¼y³*ÝÊ.Õy<ÞŒ3ÌÌÌœœœNž<‰aBÈÖÖ¶Ÿ yâ½ò-q‰‰qvv¶²² nnnV±H…­åÀÕššž{{ï™3çß­­T×¢.%™ME§ëz¯Gùùù555¥¦¦"„-Z$[®¨¨è«7„Ç#q7n\dddmmmZZšA]]ì¥~:!ÈŽ9âêꚟŸ_^^îçç¤b‘½·>ô#t„©Vxô¨é¥—>ùÇ?Žôôˆ¨®E£B9998ŽK$…e".ûz—B˜ZYY>|˜x•Ïç‹Åâ!„é”)SˆWkjj Fgg§*EöÞúÐ]p™¯ÆŽµNL\ûë¯Ï֬ѻo6577G(,ʱcÇbbbÆŽ»råÊââbƒ1„Jªªª–.]Ša†a‰¤ººZ•"IÙ:Ðu¦Úbòdö©S«~üñáÖ­©T×¢{|}}?~œ’’booÅjêBŸIDAT?{öìššš!tÂf³322ˆ³ ©TÊçó'L˜ ±­]aªE¼¼\ÿûß剉·þóŸKT×¢cÜÝÝ£¢¢¸\îôéÓqg2™!>Ÿ¯âÛ‰–Ë—/ŽŽ.,,,//_½zõœ9s†³u o Lµ‹¯ï {öþç?—Ož¼Fu-ºääÉ“W¯^uvvŽŒŒŒ·¶¶öññyñÅ[ZZ|¯¬å–-[üüü–,YòòË/?}ú4--mÈ[ÞÞãLµÑÙŸþ¿¯¾ZþúëîT×2D¸Áä½ïÚè_ÿZ´rå«ÿüç¹Üܪk¢›žÞ<ðt8=\ºt S&::Zà 83ÕR‰tݺ¸|˜–öÏ^àP]ÎàÔÜzžµ¾ìo{Ç-€ M€¾€0Õ^ø7þ[VVñâÆqãl©.GUb4=ìå8ÓùÿGu-h\æk/ógß¶·µté× Ï©.GU·¿®í拽£†;5ºÂT«ÉŒ_ãè7¾jo了œ5=èºw®ÁãŸf¶FT×€FA˜j;;;‹¤¤µMM«V ÅT—Ó©ÏÝñØî¥“a& w Lu€““M\Ü;wï>]»6N"ÑÞ›>½ÙÞö¸Ç{ aT—€ÆÁ(qýzÙ›o óˆ‰ ¦º–>µ=ŒâšP]€/ÔÓ\®µ³³mLÌÿa6c† Õå(Çß*ôüéëÿ—ùü®­[SG2]µj&ÕåþaªcV®ô®­mýôӌѣ-üü^¢ºÀo LuOTÔß›š:Ö¯5ÊtæL•戨<€ÒI‰tÍš³yy¥iiÿtss º ÒM †ÁÑ£oN™Â^¶ìø“'ÍT•!ì<¼Ð„KáÿÇ@˜ê,&ÓèìÙw¬­ÍÃÂþÛØH͇M:Rsûx­¨K{‡¾ 1¦:Ì‚™°Z"‘._~¢£C á­×ÜjÖ43z¬±9|å¦:ÎÎnTròºšþªU±šü°©¨Kš·û‰«¯•£·…Æ6 €6ƒ0ÕyćMùåÉ{ï}#ÕÔíËÛ_׊{¤3þ¥c­ >¦tàîÎ=}zUVÖÝèhU¿¶h8íº÷Mƒçf|Þ SšxõÕ Ÿ}wóÈ‘«jÝTŒ_Ûù˜;ÓÂÕ×J­@·À™},Yò—ÖÖ®èètó7ÞðTÓVp)î4›5a1|'aJ+o½õjM ÿ£RF2ûûß_TÇ&ÆÓÖÙ«£gt|Šnpß¼99#ãvbâÚW^oa@C LiH"‘¾óΙ›7ËÒÓ7L™Â¦ºô„)=õôˆBC¿zò¤%3s££#<)@í Li‹Ïï\²ä¨P(ÎÌ|ÏÆÆœêr 9E[––#’’ÖŠÅ’åËOtvëæÂ YU@WpfJ‚óçÏS]BŸž=ë:räþ¤I¬+†:ó)Ž:Î82½ù†:H-M]¼¼¼8øhÐ4S`˜V§±1!©PølÈ=˜2Ì¥¸D í&±*õINN ¡º  w`œ)9à°–Ðòÿ±ƒ{¦@S „)ÂHa $€0@˜jN{{û‡~èèèhbbâèèQSSC¼„aXaa!‰Û"½CUô³ƒÐ„©†H¥Ò¿ÿýï·nÝJMM­®®þî»ï˜L¦———@ éoUÚï ýƒAûræÌ™ŠŠŠòòò#F „lmm¿üòË={öêð¯Ã°ÆÆFDÓ@upfª! ëׯ'‚F†Åb1|é¼X,ŽŽŽvtt´±± onn&Öc–””ÄápF޹eË–ÄÄD6›maa±yófYƒsçÎÉ/ôVTT4oÞ<+++SSS777b>×^{íСCDƒ‚‚›îîî¾jhjj’_&>kdkkK¬ï1 ËÍÍår¹ÇW±b!==ÝÙÙ™Åb…„„È p0l¡äääþÛXZZffföÓÇÛ·oŸ‹‹KAAAIIÉܹsd¯úùù555¥¦¦"„-Z$[®¨¨Àq<>>¾²²R~èP~'N\»vmUUU]]ÝÉ“'MLLÁ™3gf̘A4xï½÷Ö¬YÓO Ëò+ÜA//¯¼¼¼mÛ¶ ªÿI“&{{{ûûû÷qÕ~¨„) TùlhhxãÆ ù·ø|>þ{ö?þìÙ³Dƒû÷ï#„ÚÚÚˆWsrrp—H$ Ë ‰)ß¿ÂK­­­b±˜X.))!«µµ•ÉdVWWK$6›››ÛO ý‡é€;˜’’‚ãø`û?sæ ±²¨¨HÖ¸¦€*p™¯!l6»´´Tö#ŸÏïý¤ûéÓ§...Ä2±P]]MühnnŽ200PXV]kkktt´›Í^½z5±rÔ¨QóæÍKKK»víš¡¡áÌ™3û©a˜;ÈårûßG¥d'Nœ¨z1h„©†,^¼øØ±cÄé$BˆÅbýüóÏ m8Nee%±L,°Ù¤}ƒ“Oeeå=ztùòeÙúÔÔÔäää°°0 Ãú©ÇqÔwœ ¸ƒDú¶ÿŠŠ b¡¬¬ ‘z@ Õ§Æt€T¸´¬¯¯çp8¾¾¾<ïÙ³giiiÓ¦MC¾Ìßµk×øñãúé'â~¢ŸŸŸ¬Ù5»Òe¥÷Lsrrø¿‹Åööölnn.**"f ,))Áq¼­­ÍÔÔ”Åbá8ÞW ,ëĉmmmk×®Er—ᥥ¥ªïàúwuuýé§ŸŠ‹‹gΜ)k<ÌßêaJÿ?yò$<<ÜÒÒÒÌÌÌÏÏ8/“Ï¡Péàà`ee&±ÿ0EÅÇÇ+,Èãñx™™™NNN&&&^^^YYY .œ4iÑÏâÅ‹§NJ,÷UC\\œµµ51Z€XïããÃd2›››UÜÁÁöÚ·oŸ«««……E```CCY¿ H3í“Ã0ž: ÀÃÃcëÖ­T¢Ã07}úôA½E§@wÁ=S½ÖÕÕuëÖ­+W®,]º”êZÐmðé½–½råÊmÛ¶;–êZ”€Ë& C LõZ````` ÕU@p™$€0@˜ LÁoîÜyJu è0xEŽÃ‡§¤¤P]Űܽ;z„f&SBu!è$SQ]Âpõô>nÜÔdÊátP]˰9::R]ÐGð (€B‡_9p ÛÕÕîÚµ(ªk@'Á=S€Bii…¡òòú²²zªk@'A˜tÿ~Mee#BÈØØHUÀ`A˜”‘qÛȈ Å©©…pç€!€0ÕwR)ž’‰~{ˆÿìYëíÛ©- ]aªï~ú©²±ñ¹ìGccà nSX: ÂTß]¸ðÛ5>A(§§ŠÅR K@A˜ê5‘HrñâmÙ5>¡µµçæÍ2ªJ@GA˜êµÜÜ’çÏ{VaiiŠ_öè„©^KOÿ™Á`(¬‰¤ÿ÷wzzD””€Ž‚0Õ_]]Âìì»b±’ã÷ôˆ~øáæK@wA˜ê¯ï¿/”Ok‚ažé0(¦ú+#ã6BÊÇçK$ø÷ßwt4\º &:Ñ_<“Žïë{hëV?Ÿ ²5®®vffÆT”€î)øô×äÉl…5\®õ‹/Âüu \æ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S !ÕP ??ÿéÓ§TW¡òóó{zJ©®Bë„„„P]ÐŽãT× iÁÁÁ©©©TW¡uLL¸"Q“TÚEu!ZGÿ€!ÐÇ3S„ЬY³¶oßNu@Ûýøã;vì º  àž)ÂHa $€0@˜ L€¦ýéêêúꫯBBBæÏŸ²ÿþ¦¦&â¥9sæ”””¸-Ò;Ô†-Ι3gÏž=$ntΜ9mmmT½€~@˜ö ÇñÈÈÈìØ±#%%eß¾}ÆÆÆëׯ‰DT—¦K¾ÿþû‡R]jaÚ§K—.={ölÿþý“'Of±X...›6mŠe0T—6t}š©ï”möìÙGU±1œ9ÝaÚ§ÿýïL&S~¥¹¹¹ÁM"‘ÄÆÆ†„„øûûïÞ½»½½X?gΜ~ø!88øïÿû‰'¾ÿþû   ×^{íØ±c²ÿûßÿäz+//ß¼yóâÅ‹.\øÖ[oýøã¡¨¨¨””¢Aqq±¿¿¿@ è«Y0ËsæÌA(–üzÇ¿ùæ›7ÞxcñâÅÛ·oW}úÈçóøáù•J›*e „òòòÂÂÂüüü>ýôÓÖÖV¥]õõ{‘‰]½zuGGGÿÅ :Ó>•——»¸¸ôß&99ù‡~رcÇ—_~ÙÒÒràÀÙKW¯^ŠŠúæ›oþ÷¿ÿ:u*222%%¥¶¶!´uëV777ù…ÞvîÜÉápŽ?ž””¼wï^±Xùä“ÿþ÷¿B¡ðСC*îQ_ ×®]{üøq¡ðÿÛ¹·Pvÿ8àßõ+9Œ¦µfHQS[EhñsáJ–Ü› d›CZN%ií‚e-k9„äIQ’‘&7v!KMrH˜’mzÿŸ–ý=Æïé·ößçuõÝÓããý|×>žÃ|ˆçÍÅ‹‹‹J¥rhhèúúZ¥Rýg)‚÷!4>>¾½½Ý××G¥R ’ð-ÐL?e·Û›Î?¿9žÎ,//WTTp8œððp™L¶¹¹i·¿-RPP”––†***zãgIÙÙÙ,ËqàlddD.—‡„„ÇÅÅ=>>Úl¶ÔÔÔÃÃÃëëë×××õõõ¬¬,‚ ?0??_UUÅårCCC›››õz=†a®´´4&“9;;ëʼ}£¶¶6***22²¡¡Á`0ÌÎÎ:—"¨?33£Óé:::~~^(â7I©TªÑhü°ƒÁ8??ǯÓñ«]:NV™LÆårkjjØlöëë«P(Ä·gdd,--gffR(‚ øÚqßê­t:½®®ŽÏçã?n³ÙH¹f³Ù`ttùå¼Ä8;;c0¡““ …B£ÑœKÔïêêz~~®¬¬ÌÍÍÿóCg¦Ÿ*//·X,­­­&“Éb±èõú±±±ûäääLLLœžžòx<[Ïêê*þ! „îïï­¿½¼¼::êïïOOOÏËËs.EPßÇÇ'$$¤¬¬l``àé鉬£ÎL?E£Ñ†‡‡5MKKËÃÃCBBBWW—X,vܧ¸¸øþþ¾³³ð¤¤$™Læbq¥RÙÖÖÆb±Þ!Ç–¡V«›šš†††FGG£££ËÊÊl6[{{ûØØ˜¿¿bbâùù9þ|ì³ R©T­Vk4©Tº°°€oŒ‹‹“H$sssî¾o‹Å†uvvZ­Ö˜˜˜îîîŸÎßGt:½°°P§Ódv%F~~¾B¡À0,%%E.—ûúú:—úò}),,\YY™››+**"ë—óÒ•ö¯®®¯BØP[[ë®sžºŠŠjooÿ+÷°Z­ä½ ••uôèQXáÒ¥K€[·nÁ£çÎ#IÒår1Ê ¡ÐÛ¯ªª‚å .À¦õõõ$IΞ=ûĉð¨ÙlŽŒŒ¼}ûvffæáÇá΋/2„’]YY Ž[­Öññq›Í666wšL&wmyìÈ[ŠÜ‡ã±}›Í&‘H].—\.ommeÉÝ{‹™ÇU˜¤xÔ=ÏyŽ\.¿rå ]îÔÊk×®)•JX†…ÁÁA¸ˆˆˆ`”Y šš9s&Õ”B¡ôõõ­_¿Ã0 ÃÒÒÒ\.×àà Åb™1c<…*Pô÷÷Ãv†I¥R Ãl6›N§S«Õr¹|Ë–-î1xìˆ=l:Ûä‘GòóóõzýÏ?ÿµxñb–¼ñ€%fW!là9ÎU«V}ùå—ðë •Jûí7FÇ{{{aär9ß8AOO,\½z•j ^'¹\þÝwßÁÏ1üòž1cŽãÔ'³»»›Ñš\.ïëë£6m6›ËåR«Õ½½½èïïoiiqÁcG܇à­ýââↆ†ÚÚÚuëÖaÆ’7’$Á?s¸ÂS÷{÷îµX,Æh4Z,–S§N½õÖ[Œ:›6mzçw‚¸råÊöíÛ5T*åÒøñãÇ¡(©`ß¾}AtuumÛ¶ÑÔÆu:ÑhìîîÞ²eËSO=ذaÃÛo¿ÝÞÞ~õêU÷{µçŸþÍ7ß<þüÐÐЇ~ˆã¸Ýn¿{÷®J¥ÊÊÊêêêÚ¸q#àæÍ›°¾ÕjõÖ ÿþû¯í.—Ë[û«W¯6555%%%,y“J¥ßÿýèèè»ï¾KïÆæ¿˜ÅcÞÃq~O’ä_ýURR’˜˜«Ñhà7}~ït:wíÚ•––&“ÉÖ­[çmê^TWW3 Ó§OOHH(,,üçŸèõNgYYŽãqqqð¶ÌápìØ±>Ï9vì¸Bìt:÷îÝ«P(bccU*œÝž>}:###::://¯±±±  `Ö¬Y$IªÕj‰DrãÆ yƒ‘g‚ ¼µO’äªU«æÌ™ËÞòvìØ±”””©S§Âg\p?#™>cöyÂó{Œ¼ÿ BmÝ †aAÌŸ??Øø‹5kÖ¨TªÝ»w;0®;aè\,÷1~¢¹¹ó„N§ãØÂ;w:;;Ïž=»~ýz¿†Š Ò¯W)H·iCˆ°|ùòŒ­©©é¹çž{ã7¦M›&TTŸL݇1………………ÁŽBt yBŒ Ý#Ĉºw¿½3>-ï]ãºgÏwË´ ~°ôî<ö΀KÿaØððpRRK0Ö…Àó{Æ›y¸þa"YÍëÞìò>!"777666##£²²ððà ÐëÀ…íïÀ—%lvxx˜{""bhhèÀ‘‘‘Z­öèÑ£f³™:‹Å^ÏâDg Ûƒmkk[»v-åb`ÏÇËh6‚ øùòYÎ*((¸~ýº^¯ŠŠúï¿ÿ¨TXîé¿÷ˆ·‹e1‚áÍ.ï³#™LöÉ'ŸÀ²Õj…÷ööö;vÌ›7ð'Ÿ|òìÙ³¤û;éˉζ°ƒ½sçΡC‡rrr–.]Z[[ët:'šj.u|Ž‹_6¾ýö[ª&ûÚ¡ÒÅ‘ ë>&&†ñ¡7™LÔY‰¤­­ Ö·ÛíÜu_SS“’’¢P(6mÚ—ÂÐõý÷ß¿øâ‹111###ýýýeee‹/NMMe¬Àbqh±‡-à`›››“““·oßÞÕÕÅ;Õ\êpׄ²ñ믿Ò3@ND÷jÃ!×ð€ÝÎn—gaùòåõõõ©©©K—.5›ÍÙÙÙ?þø#<šššZQQa·ÛoÞ¼éÓ^Ï#l‹ã¸J¥jiiillôf-ÁÇ'ôþ†·6XœîÙàìvyrrrÊÊÊ ÅüùóI’”H$EEE;wîlii±X,—/_~íµ×,X••Åb¯ç¶€ƒ3gΙ3gšššÌfó¼yó6oÞüûï¿sσGXîký1.w8~€ùiƒ¾tlîååå8Žoذ¡³³“w€ ûÅ ¿ŸŸg9+-- pø¡z…BñÞ{ïuww?ýôÓ[·nU©TþßdéÞ¿׿n2™~ùå—ÑÑÑüü|žSÐó€÷µÔf||<õÿí ³<--M*•¾ÿþûF£ñ?þðÙàDϲZ­ôç9‡£¾¾þ«¯¾r:/½ôÒÁƒ'ú/ä{`¬“ ÿdyyy¹ÝnöÙgm6Û¢E‹ôz=—'t–Z­~üñÇÍf³L&ƒ{›šš>ú装 òPøƒü÷ˆ0ýþ=ÄlsKÐ<‡b¶¹‡%èû!Fîbé!Fîbé!F<<Ï1 ð)>PÖ&:LÝçææ$"@à8®Õj;™ïk1€æ÷1‚t#H÷1ò?àCºê 6wIEND®B`‚glom-1.22.4/docs/libglom_reference/html/inherit_graph_18.png0000644000175000017500000000444112234777146025204 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“ÖIDATxœíœ}HS_ÇÏUÃe*ÛR²ínj¾RB"SA- 3F/45-¬¢(PaýQ‰Jý½à¥Q©˜o+L!߸&š¢L§fM¦NIJ3õüþ8üîï¶í^×\óW÷~þzî¹Ï}îsϳ{ÎÙùŽaBÀÁœ¶;‡ÂÕ›]põf.Ô­VÛÑѱ]©pü$ITTÔÇBuuõö%Æñ[P(Ô»˜{p+ö¿†ääd“nþf\½ÙWovÁÕ›]põf\½Ù…õ^ZZºqã†D"quu•H$YYYSSSè†a===öËІÍÍÍý)aÁvw[ê½±±qüøñîî:­VÛØØÈãñ¢££F£Ýóû øu—ùþÜŒ²²2Ÿoß¾Q ÃÚÚÚ«!bÓ [ ×ëÖæ›ncw) “ý5[ÞïÊÊÊœœœ]»vQù|¾³³3y¸¶¶¦T*%‰——WZZÚüü>~ïÞ½OŸ>µ´´PO¡Þ‰DoÞ¼AŸñ ƒÁŒã8Y FC½jll £££“GaqŒŒliiijj2 ówpw1cK½oÞ¼©ÓéäryOON§S©T·nÝ2ñ9wîÜ;w‚¹|ù²\.çóùÖ¯¨¨˜˜˜ áááyyyR©4""BÈãñ̯úñãGdddPPÐððpff&`aaê™™©T*{zz4MvvöáÇ·oßnoo5Y1<<œ““C&o^Ñ466677OMMùò% ÌßEEEžžžgΜ™…ÆÆÆòx¼ùùyHó%jyyùÉ“'qqqŽì.fÌço RV555©©©Ôv‚aAÛÈVA¿w¨­­%[¸ýsvaá÷Lñǽßì‚«7»àêÍ.QoÌv}·Í¢ìÍÓÁ¢µqÄzܦ­­­áááÜšÃGÔ›ºUäîîþ»vŽhÀ0L¯×{yyý¡ñí‹ýÇss›Á©ÈW®\¡S¯ß¾}‹ã¸P(|üø1j´(‡ œª[Óiä•JåççÇçó Åìì,Ù!4WÍMŒOçl¥†$¾_êj[ n¶Y¿ŸÊ€¹€M~ÞÿªÈR©”N½NLLœ™™©¯¯G:7¤‘à ‚`ÀÑö$ƒÃ¡C‡úûûd2YRR™ê£GÌUsh¶µ‰â38[£a777ûúúÌÌÌl±$öÑ¿mƼÞHEfP¯_¿~ ):7¤‘à ‚`‚ ¤+C‘Ú´‚ ,ªæ¦Þ ÎVjØ“““ùùù8Žgddtwwo½Ãí£Û¤"3¨×b±ü¬øZ”ÙƒlꈌÐÐP€N§C‡Usºgap¶RÖJ¥………æèÑ£.\ˆŒŒdè:ÛØæz£ÇfP¯Mtn@#‡3ÙÔ¿Õj5†a‰ZTÍéžå—œP«ÕKKK 6\ÎŒýëm.`oʦê5:9œ!úBÈà——700088xéÒ¥äädò»¢EÕÜßJg:ŒFcEEELLLVV–L&*,,ü¥VAÜí23›zÊdþF‡›ª×2MZ”à ‚  BêÖ w©¬¬‹Å ==ÝD–6WÍM#ã[ãLgCU*UZZZggçûŸ §³ Nÿf;\½ÙWovÁÕ›]põf\½ÙWovaAÿ6ÿ“6Ž?”®®.™LFmùéý–H$ …±)qüFd2ÙOž Æí¦± nþf\½ÙWovñP3WÈðÖôIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Text.html0000644000175000017500000017360712234777147030011 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Text Class Reference
        Glom::LayoutItem_Text Class Reference
        Inheritance diagram for Glom::LayoutItem_Text:
        Collaboration diagram for Glom::LayoutItem_Text:

        Public Member Functions

         LayoutItem_Text ()
         
         LayoutItem_Text (const LayoutItem_Text& src)
         
        LayoutItem_Textoperator= (const LayoutItem_Text& src)
         
        virtual ~LayoutItem_Text ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        bool operator== (const LayoutItem_Text& src) const
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        Glib::ustring get_text (const Glib::ustring& locale) const
         Get the text that will be shown on each record. More...
         
        void set_text (const Glib::ustring& text, const Glib::ustring& locale)
         Set the text that will be shown on each record. More...
         
        void set_text_original (const Glib::ustring& text)
         Set the text's original (non-translated, usually English) text. More...
         
        - Public Member Functions inherited from Glom::LayoutItem_WithFormatting
         LayoutItem_WithFormatting ()
         
         LayoutItem_WithFormatting (const LayoutItem_WithFormatting& src)
         
        LayoutItem_WithFormattingoperator= (const LayoutItem_WithFormatting& src)
         
        virtual ~LayoutItem_WithFormatting ()
         
        bool operator== (const LayoutItem_WithFormatting& src) const
         
        virtual const Formattingget_formatting_used () const
         Get the field formatting used by this layout item, which may be either custom field formatting or the default field formatting. More...
         
        virtual
        Formatting::HorizontalAlignment 
        get_formatting_used_horizontal_alignment (bool for_details_view=false) const
         Get the alignment for the formatting used (see get_formatting_used()), choosing an appropriate alignment if it is set to HORIZONTAL_ALIGNMENT_AUTO. More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Public Attributes

        sharedptr< TranslatableItemm_text
         
        - Public Attributes inherited from Glom::LayoutItem_WithFormatting
        Formatting m_formatting
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::LayoutItem_Text::LayoutItem_Text ( )
        Glom::LayoutItem_Text::LayoutItem_Text ( const LayoutItem_Text src)
        virtual Glom::LayoutItem_Text::~LayoutItem_Text ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Text::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Implements Glom::LayoutItem.

        virtual Glib::ustring Glom::LayoutItem_Text::get_part_type_name ( ) const
        virtual

        Implements Glom::LayoutItem.

        virtual Glib::ustring Glom::LayoutItem_Text::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutItem.

        Glib::ustring Glom::LayoutItem_Text::get_text ( const Glib::ustring locale) const

        Get the text that will be shown on each record.

        LayoutItem_Text& Glom::LayoutItem_Text::operator= ( const LayoutItem_Text src)
        bool Glom::LayoutItem_Text::operator== ( const LayoutItem_Text src) const
        void Glom::LayoutItem_Text::set_text ( const Glib::ustring text,
        const Glib::ustring locale 
        )

        Set the text that will be shown on each record.

        void Glom::LayoutItem_Text::set_text_original ( const Glib::ustring text)

        Set the text's original (non-translated, usually English) text.

        This is the same as calling set_text() with an empty locale parameter.

        Member Data Documentation

        sharedptr<TranslatableItem> Glom::LayoutItem_Text::m_text

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_text.h
        glom-1.22.4/docs/libglom_reference/html/nav_g.png0000644000175000017500000000013612234777145023137 0ustar00murraycmurrayc00000000000000‰PNG  IHDRô1%IDATxíÝ;±{¥3Â𯆓,1íIuäÁÃ<«—Q¬IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Document-members.html0000644000175000017500000017203112234777147027746 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::Document Member List

        This is the complete list of members for Glom::Document, including all inherited members.

        add_indenting_white_space_to_node(xmlpp::Node* node=0, const Glib::ustring& start_indent=Glib::ustring())GlomBakery::Document_XMLprotected
        add_table(const sharedptr< TableInfo >& table_name)Glom::Document
        build_and_get_contents() const Glom::Document
        change_field_name(const Glib::ustring& table_name, const Glib::ustring& strFieldNameOld, const Glib::ustring& strFieldNameNew)Glom::Document
        change_relationship_name(const Glib::ustring& table_name, const Glib::ustring& name, const Glib::ustring& name_new)Glom::Document
        change_table_name(const Glib::ustring& table_name_old, const Glib::ustring& table_name_new)Glom::Document
        create_relationship_system_preferences(const Glib::ustring& table_name)Glom::Documentstatic
        create_table_system_preferences()Glom::Documentstatic
        create_table_system_preferences(type_vec_fields& fields)Glom::Documentstatic
        Document()Glom::Document
        Document_XML()GlomBakery::Document_XML
        emit_userlevel_changed()Glom::Document
        fill_layout_field_details(const Glib::ustring& parent_table_name, const sharedptr< LayoutGroup >& layout_group) const Glom::Document
        fill_layout_field_details(const Glib::ustring& parent_table_name, type_list_layout_groups& groups) const Glom::Document
        fill_translatable_custom_choices(Formatting& formatting, type_list_translatables& the_list, const Glib::ustring& hint)Glom::Documentstatic
        forget_layout_record_viewed(const Glib::ustring& table_name)Glom::Document
        get_active_layout_platform() const Glom::Document
        get_connection_database() const Glom::Document
        get_connection_port() const Glom::Document
        get_connection_self_hosted_directory_uri() const Glom::Document
        get_connection_server() const Glom::Document
        get_connection_try_other_ports() const Glom::Document
        get_connection_user() const Glom::Document
        get_contents() const GlomBakery::Document
        get_criteria_current(const Glib::ustring& table_name) const Glom::Document
        get_data_layout_groups(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform=Glib::ustring()) const Glom::Document
        get_data_layout_groups_default(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform=Glib::ustring()) const Glom::Document
        get_data_layout_groups_have_any_fields(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform=Glib::ustring()) const Glom::Document
        get_data_layout_groups_plus_new_fields(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform=Glib::ustring()) const Glom::Document
        get_database_title(const Glib::ustring& locale) const Glom::Document
        get_database_title_original() const Glom::Document
        get_default_table() const Glom::Document
        get_document_format_version()Glom::Document
        get_dtd_name() const GlomBakery::Document_XML
        get_dtd_root_node_name() const GlomBakery::Document_XML
        get_field(const Glib::ustring& table_name, const Glib::ustring& strFieldName) const Glom::Document
        get_field_primary_key(const Glib::ustring& table_name) const Glom::Document
        get_field_used_in_relationship_to_one(const Glib::ustring& table_name, const sharedptr< const LayoutItem_Field >& layout_field) const Glom::Document
        get_file_extension() const GlomBakery::Document
        get_file_uri() const GlomBakery::Document
        get_file_uri_with_extension(const Glib::ustring& uri)GlomBakery::Document
        get_first_table() const Glom::Document
        get_groups() const Glom::Document
        get_hosting_mode() const Glom::Document
        get_is_backup_file() const Glom::Document
        get_is_example_file() const Glom::Document
        get_is_new() const GlomBakery::Document
        get_latest_known_document_format_version()Glom::Documentstatic
        get_layout_current(const Glib::ustring& table_name) const Glom::Document
        get_layout_record_viewed(const Glib::ustring& table_name, const Glib::ustring& layout_name) const Glom::Document
        get_library_module(const Glib::ustring& name) const Glom::Document
        get_library_module_names() const Glom::Document
        get_lookup_fields(const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::Document
        get_modified() const GlomBakery::Document
        get_name() const Glom::Documentvirtual
        get_network_shared() const Glom::Document
        get_node_document() const GlomBakery::Document_XMLprotected
        get_node_document()GlomBakery::Document_XMLprotected
        get_opened_from_browse() const Glom::Document
        get_print_layout(const Glib::ustring& table_name, const Glib::ustring& print_layout_name) const Glom::Document
        get_print_layout_names(const Glib::ustring& table_name) const Glom::Document
        get_read_only() const GlomBakery::Document
        get_relationship(const Glib::ustring& table_name, const Glib::ustring& relationship_name) const Glom::Document
        get_relationship_is_system_properties(const sharedptr< const Relationship >& relationship)Glom::Documentstatic
        get_relationship_is_to_one(const Glib::ustring& table_name, const Glib::ustring& relationship_name) const Glom::Document
        get_relationships(const Glib::ustring& table_name, bool plus_system_prefs=false) const Glom::Document
        get_report(const Glib::ustring& table_name, const Glib::ustring& report_name) const Glom::Document
        get_report_names(const Glib::ustring& table_name) const Glom::Document
        get_startup_script() const Glom::Document
        get_table(const Glib::ustring& table_name) const Glom::Document
        get_table_example_data(const Glib::ustring& table_name) const Glom::Document
        get_table_fields(const Glib::ustring& table_name) const Glom::Document
        get_table_is_hidden(const Glib::ustring& table_name) const Glom::Document
        get_table_is_known(const Glib::ustring& table_name) const Glom::Document
        get_table_names(bool plus_system_prefs=false) const Glom::Document
        get_table_overview_position(const Glib::ustring& table_name, float& x, float& y) const Glom::Document
        get_table_title(const Glib::ustring& table_name, const Glib::ustring& locale) const Glom::Document
        get_table_title_original(const Glib::ustring& table_name) const Glom::Document
        get_table_title_singular(const Glib::ustring& table_name, const Glib::ustring& locale) const Glom::Document
        get_table_title_singular_original(const Glib::ustring& table_name) const Glom::Document
        get_tables(bool plus_system_prefs=false) const Glom::Document
        get_translatable_items()Glom::Document
        get_translation_available_locales() const Glom::Document
        get_translation_original_locale() const Glom::Document
        get_userlevel(userLevelReason& reason) const Glom::Document
        get_userlevel() const Glom::Document
        get_view()GlomBakery::Document
        get_xml() const GlomBakery::Document_XML
        HOSTING_MODE_DEFAULT enum valueGlom::Document
        HOSTING_MODE_POSTGRES_CENTRAL enum valueGlom::Document
        HOSTING_MODE_POSTGRES_SELF enum valueGlom::Document
        HOSTING_MODE_SQLITE enum valueGlom::Document
        HostingMode enum nameGlom::Document
        load(int& failure_code)Glom::Document
        LOAD_FAILURE_CODE_FILE_VERSION_TOO_NEW enum valueGlom::Document
        LOAD_FAILURE_CODE_LAST enum valueGlomBakery::Document
        LOAD_FAILURE_CODE_NONE enum valueGlomBakery::Document
        LOAD_FAILURE_CODE_NOT_FOUND enum valueGlomBakery::Document
        load_failure_codes enum nameGlom::Document
        load_from_data(const guchar* data, std::size_t length, int& failure_code)GlomBakery::Document
        LoadFailureCodes enum nameGlomBakery::Document
        m_bIsNewGlomBakery::Documentprotected
        m_bModifiedGlomBakery::Documentprotected
        m_bReadOnlyGlomBakery::Documentprotected
        m_DOM_ParserGlomBakery::Document_XMLprotected
        m_file_extensionGlomBakery::Documentprotected
        m_file_uriGlomBakery::Documentprotected
        m_pDOM_DocumentGlomBakery::Document_XMLprotected
        m_pViewGlomBakery::Documentprotected
        m_root_xmlnsGlomBakery::Document_XMLprotected
        m_strContentsGlomBakery::Documentprotected
        m_strDTD_NameGlomBakery::Document_XMLprotected
        m_strRootNodeNameGlomBakery::Document_XMLprotected
        m_write_formattedGlomBakery::Document_XMLprotected
        pair_translatable_item_and_hint typedefGlom::Document
        read_from_disk(int& failure_code)GlomBakery::Documentprotected
        remove_field(const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::Document
        remove_group(const Glib::ustring& group_name)Glom::Document
        remove_library_module(const Glib::ustring& name)Glom::Document
        remove_print_layout(const Glib::ustring& table_name, const Glib::ustring& print_layout_name)Glom::Document
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::Document
        remove_report(const Glib::ustring& table_name, const Glib::ustring& report_name)Glom::Document
        remove_table(const Glib::ustring& table_name)Glom::Document
        restore_backup_file(const Glib::ustring& backup_uri, const SlotProgress& slot_progress)Glom::Documentstatic
        save()GlomBakery::Document
        save_backup_file(const Glib::ustring& uri, const SlotProgress& slot_progress)Glom::Document
        set_active_layout_platform(const Glib::ustring& layout_platform=Glib::ustring())Glom::Document
        set_allow_autosave(bool value=true)Glom::Document
        set_connection_database(const Glib::ustring& strVal)Glom::Document
        set_connection_port(unsigned int port_number)Glom::Document
        set_connection_server(const Glib::ustring& strVal)Glom::Document
        set_connection_try_other_ports(bool val)Glom::Document
        set_connection_user(const Glib::ustring& strVal)Glom::Document
        set_criteria_current(const Glib::ustring& table_name, const FoundSet& found_set)Glom::Document
        set_data_layout_groups(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform, const type_list_layout_groups& groups)Glom::Document
        set_database_title_original(const Glib::ustring& title)Glom::Document
        set_dtd_name(const std::string& strVal)GlomBakery::Document_XML
        set_dtd_root_node_name(const Glib::ustring& strVal, const Glib::ustring& xmlns=Glib::ustring())GlomBakery::Document_XML
        set_file_extension(const Glib::ustring& strVal)GlomBakery::Document
        set_file_uri(const Glib::ustring& file_uri, bool bEnforceFileExtension=false)Glom::Documentvirtual
        set_group(GroupInfo& group)Glom::Document
        set_hosting_mode(HostingMode mode)Glom::Document
        set_is_backup_file(bool value=true)Glom::Document
        set_is_example_file(bool value=true)Glom::Document
        set_is_new(bool bVal)GlomBakery::Document
        set_layout_current(const Glib::ustring& table_name, const Glib::ustring& layout_name)Glom::Document
        set_layout_record_viewed(const Glib::ustring& table_name, const Glib::ustring& layout_name, const Gnome::Gda::Value& primary_key_value)Glom::Document
        set_library_module(const Glib::ustring& name, const Glib::ustring& script)Glom::Document
        set_modified(bool value=true)Glom::Documentvirtual
        set_network_shared(bool shared=true)Glom::Document
        set_opened_from_browse(bool val=true)Glom::Document
        set_print_layout(const Glib::ustring& table_name, const sharedptr< PrintLayout >& print_layout)Glom::Document
        set_read_only(bool bVal)GlomBakery::Document
        set_relationship(const Glib::ustring& table_name, const sharedptr< Relationship >& relationship)Glom::Document
        set_relationships(const Glib::ustring& table_name, const type_vec_relationships& vecRelationships)Glom::Document
        set_report(const Glib::ustring& table_name, const sharedptr< Report >& report)Glom::Document
        set_startup_script(const Glib::ustring& script)Glom::Document
        set_table_example_data(const Glib::ustring& table_name, const type_example_rows& rows)Glom::Document
        set_table_fields(const Glib::ustring& table_name, const type_vec_fields& vecFields)Glom::Document
        set_table_overview_position(const Glib::ustring& utable_name, float x, float y)Glom::Document
        set_table_title(const Glib::ustring& table_name, const Glib::ustring& value, const Glib::ustring& locale)Glom::Document
        set_tables(const type_listTableInfo& tables)Glom::Document
        set_translation_original_locale(const Glib::ustring& locale)Glom::Document
        set_userlevel(AppState::userlevels userlevel)Glom::Document
        set_view(ViewBase* pView)GlomBakery::Document
        signal_forget()GlomBakery::Document
        signal_forget_GlomBakery::Documentprotected
        signal_modified()GlomBakery::Document
        signal_modified_GlomBakery::Documentprotected
        signal_userlevel_changed()Glom::Document
        SlotProgress typedefGlom::Document
        type_base typedefGlomBakery::Document_XMLprotected
        type_example_rows typedefGlom::Document
        type_list_groups typedefGlom::Document
        type_list_layout_groups typedefGlom::Document
        type_list_lookups typedefGlom::Document
        type_list_translatables typedefGlom::Document
        type_listTableInfo typedefGlom::Document
        type_pairFieldTrigger typedefGlom::Document
        type_row_data typedefGlom::Document
        type_signal_forget typedefGlomBakery::Document
        type_signal_modified typedefGlomBakery::Document
        type_signal_userlevel_changed typedefGlom::Document
        type_vec_fields typedefGlom::Document
        type_vec_relationships typedefGlom::Document
        USER_LEVEL_REASON_DATABASE_ACCESS_LEVEL enum valueGlom::Document
        USER_LEVEL_REASON_FILE_READ_ONLY enum valueGlom::Document
        USER_LEVEL_REASON_OPENED_FROM_BROWSE enum valueGlom::Document
        USER_LEVEL_REASON_UNKNOWN enum valueGlom::Document
        userLevelReason enum nameGlom::Document
        Util_DOM_Write(Glib::ustring& refstrXML) const GlomBakery::Document_XMLprotected
        util_file_uri_get_name(const Glib::ustring& file_uri, const Glib::ustring& file_extension)GlomBakery::Documentstatic
        write_to_disk()GlomBakery::Documentprotected
        ~Document()Glom::Documentvirtual
        ~Document_XML()GlomBakery::Document_XMLvirtual
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_21.png0000644000175000017500000000323212234777146025173 0ustar00murraycmurrayc00000000000000‰PNG  IHDR%"#÷)bKGDÿÿÿ ½§“OIDAThíšoHS]ÇÏÝV]Öª»a”×mZsAÿè‘›P”ý»¨à²EA½ˆŠ2ÒÌ‚è…R`/_e$*›QQH˜¥xÇVDT˜¢ÛZ’릔£å<Ï‹Ãs¹Ý]×mÏrÏ}žûyõ»çÜ{Î÷œï=î Bd¤ƒ"Ýd~Ù0‰!&1T¼ãþþ~¿ßŸ)2ñ «ÕúSü›Í–&m2Øl6žAü†Nr¹\s/N†‡ÝnO”×0‰!&1dÃ$†l˜Ä “²a#yÃ&''Ïž=k0,X`0Ž9 Q†a>Ÿ/E  ‰\¸pÁd2á8¾lÙ2Š¢hšNaù¿ã@EQÃÃÃ"¯=wîœZ­þüùsJ”$iØÌÌÌÞ½{=Ûí<Àq}úôOðZôáÀßïÿ£µ z‘äkmm=~üøÂ… ¹‰A(•JöpzzºººÚ`0ddd8Žp8ŒÒ1 koo×ëõ‹-:þ|[[I’‹/.//gOhiiáóçω¯kß¾}uuu(…¦éŒŒŒ?~x½^«ÕªV«srrnܸa`éÒ¥ãããÂÚÚÚ+Vèt:»Ý.^•JˆF£èÚžž£ÑØØØ_8·vä:W[2]/ÆÕx´Zíýû÷gËEÊjjjL&MÓïÞ½+((())as)Šw»Ý€={ö°ñû÷ï!„ÍÍÍCCCÜàÚµkJ¥Òf³555ƒA¶¢[·nY­VŸ:uêØ±c•+WVTT„B¡ŽŽ…BññãGð÷=^__Ÿ››Ûßß?88HQÛÒ_Jœ666æt:Ífs,CYùùùÏž=»zõêl…³#,^[‚Nô"IÃT*U__×!Ã0lóÌfsSS:áõë×€‰‰ ”ÛÝÝ !ŒÅb¼8ÁDÚ××wúôéõë×c¶yóæ®®.á—/_p±XŒ$Éžž¡N§»~ý:º Íœl—­Y³¦µµeƒA¥RùíÛ71’¸·8†a›6mzùò%Ûv—Ë•¸pÖ°xm :9•S"I’\ŸØ-"‹ßï7™L(FA @‡ P(xñlLLLäååÕÕÕ½zõ* Z,–âââp8¼dÉ’ÂÂÂŽŽŽ§OŸªTªmÛ¶jkk³³³>üöí[î,=<<ìt:Ñf/+++‹‰—Än:¦¦¦^¼x±aÃ6Ëh4&.œ%6‘$iXQQQCCºA<þœwŽ^¯B1 H’L®ºÕ«W?|øÅ™™™555‘Hm”÷ïßïv»oß¾]VV†ŒÝ»wŒŒ¸\®ÌÌÌ;vpï$’$ïÞ½‹nÕ™™†aV­Z%RƒF£!‚ ÇyYÈZ1…'Ð&’$ »xñb(¢(Êçó…B¡;wî\¾|™wΡC‡®\¹âõzNœ8AQAb oiiAO9l`·ÛËËË=z …Þ¼ysæÌ™¼¼<³Ù (..öù|ííí‡]¾qãÆÊÊJ£Ñ¸eË!ê_†a¬®®öù|ƒƒƒGݹsgrÍDLá‚Ú~1ó¦ £££‡C«ÕªÕjŠ¢Ðâ®aÑh´¢¢"++K§Ó•••±ó8à¬U‚1 ¹¹™D"‘ªªªœœœyóæéõúŒ±JŠŠŠÖ®]Ë>~üxݺu8Ž›L¦¶¶6áöíÛq‡ÃÑh´²²R¯×k4š]»v¡ …HI³­¯lV‚ÂÙ¶ÇkK€ üyEEͤõ³¤¤dëÖ­UUUé’b½ö»Ä©©)ÇÓÕÕåt:Ó­e޶a………—.]ÊÎÎN·–9BàŸ QZZ*þÞi°ÿ!²aC6LbȆI MMÓ‚¿0ÊÌ14M[,^"ß0þŸÜ2éÃb±ÄÛÁÓ!ó/G^Ã$†l˜Ä “ä×úŒæ;IEND®B`‚glom-1.22.4/docs/libglom_reference/html/bc_s.png0000644000175000017500000000124412234777145022754 0ustar00murraycmurrayc00000000000000‰PNG  IHDR€_ kIDATxíËkQÆÏ¹É̤I&“¦mš&156*nÄ…”ܸR,4 +Hµ(U­b”ª1‚ŠˆJ.º(E·mßúhëJmKS'C›(‚èäÑ…¤ï &äÖþ ‡ïrÎåü3gö(z÷ýÒ&_9ó}’ÕŸ@‰mÚu ` Øh`ñ÷Ô¯  „ú&·ññ×Ù~“½—Üò‡ÎÝÑM4¸%‰3²§?Êêh)€ÿù™\ÄYi>Jb @gûßiÞˆú²Ñkg§ãê\è½­šEUæv+?E€î"pæÖÛB\ƒY&ðØó$vM+ê’Dn¼)}òþ:§Xoâ ƒ3ŠÚ¯'¯¿.‚fÁ0ìuŠ9òLýj€f6¸%«3Gf”Ô#Ôsm(,ùÃk*Ê’³Jª…¯¼JË¢o䆔¼u_~ °r]%%mnu]z°r5[ÍÆ°«Úò•Xeµ’†Iù<ÈèÐÅg@IÔÚÞàµë3‚:/<JÇ’ÐQ) ñ¹…tÚß÷(Mû\63éCgl!ýí;ÿ¸4Ùhâñ=÷Zë29­w’ÝÒ´·ˆV;ÊL3ƒj&7©·º½÷a!I†)ëë$-öÇÓú³›‹7tIV¾VàñÔübf¨8¡ÈƒB<﫵imnÿœÈ‡„ lߣù‡ÛD —#É5“­'Æ4?쬲øM’™›°»g¬‚|5Åçµ½GNdÓÐr|ô”Ã&„ì"7+'³@ 5‡G➑Džâɬ^;õã–.3Òr"ý_R³¿Â@²oI¾å$IEND®B`‚glom-1.22.4/docs/libglom_reference/html/nav_f.png0000644000175000017500000000023112234777145023132 0ustar00murraycmurrayc00000000000000‰PNG  IHDR8³»`IDATxíÝK€ EÑ–·[†øBÑmkâÄÂH—prÓ¼.‚Žó‚ꎤR6Z VI±E‚5j³„lóš›iI˜¬ÞêçJ0ŒÑÑ/Žû›™uøñóÞ¿6sH ÝõyIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_0x66.html0000644000175000017500000001302012234777147025016 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - f -

        glom-1.22.4/docs/libglom_reference/html/functions_func_0x66.html0000644000175000017500000001272412234777147026043 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - f -

        glom-1.22.4/docs/libglom_reference/html/functions_enum.html0000644000175000017500000001014312234777147025262 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Enumerations
         
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Notebook__inherit__graph.png0000644000175000017500000001644012234777146033654 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÂÀWÈbKGDÿÿÿ ½§“ÕIDATxœíÝ{TgÞðgH0QÃí¨!Á ¢¨l·ïºuk*ZªæEöÂí±‡ÒuѶº´hµVñÔÖî®—z(lE@n­®7(º0Ñ•jC!¨\0riÈeÞ?¦NÓ„IÐßçøÇ3OŸùÍä›™É$I"FÌÁÖ€g$ àIx@’$€ 9\"‘ÈÖµÌrss‡æHV¼hÑ¢÷ß×fÛZ³fÍHþûˆ’Äãñ"""F2°#L\'< IHÀ’ð€$<¬‘¤®®®-[¶ðù|‹Åçóׯ_ßÔÔDÝD„T*Ÿ.ÂŒ«álA´··iNì»h”ŒèUKètº•+W!‹gΜÙÜÜœ’’PSSÃb±°¯N¡PP WW×ÒÒÒ_|!4aÂì+F=IÇŽ««««­­?~>>T›j466R‹...!ƒö0x{{#„”JeRR’@ àr¹±±±ú¼¼¼ æ?räȾ}û¦M›¶nݺ»wïÒgd3“ :`Ö¬YTÃÏÏ!ÔÒÒB-Ö××GGGSO6½¼¼´Z-½23ã’Q_GHHÈ‘#G¨‡BˆÃáܸqÃ` Ç“ËåT›jp¹\ì•P;T Èåòýû÷ß¿ÿüùóú¨ }¯¿þúƒòóó§NºlÙ2ú1`f’AÔÖÖR ™LFŸÏ§¹\nQQõøÖét …böìÙ¦¶eHƒ­cÔ“´}ûö––¡P(•J[ZZ wíÚe0fíÚµ»wï–H$555ñññB¡ÐÂç\™™™õõõúA©Õê… úúúÞ»w/&&==¿õâ‹/&&&z{{ÿñ$I’Íf: õ2„™‰‰‰wîÜ©®®~÷ÝwÃÃÃéW(bbb’’’¤Rimmmlll`` Ñ’¨ù-lUÃ>/ZxD’äÇ£¢¢\]]…B!uÔÑ¿NêïïOHHðòòrss‹ŒŒ¤.È—Û¡ŒŒ ý ¸N¢‹‹‹§OŸÎb±Ξ=ìçç7p~ª†K—.ùûû³ÙlŸììlz˜©I›Íîèè0³–¬¬,///WW×èèhƒ˜˜Èãñ\\\‚ƒƒé dýÂèù-lªm ÙuA÷ûnááá¡üüüá§Ø‚ rss‡ý3xß àIx@’$€$ àIx@’×Ò¢´u cÀˆ>$ÔØØ¨ÿy‰gRO:;[þöÛsl]ˆÝökšÏÉ·¹ý§L‰wp`Ûºk°ÍkÜωÐÐ]¿^Ÿœ,Z»v‰­k±kpdΣG]Ré}‚@'O~~€$™STt“ ’DÉý†“’džX,ÑéH„ƒápút•­Ë±k$“äò¶ï¿o¦®#µZ]~¾ÄÖÙ5H’IEE7Ù?$IÊd­55­¶-ÉžA’LÊÏ—¨Õ:zÑÑ‘Q\ '8“ IÆUW7=xð›oœ©ÕÚÜÜ붪ÇþA’Œ+*ºéèÈ0èljRܺÕ`“zì$ÉŽÌÏ—¨ÕZƒ~GGFQÑM›”dÿ IFH¥õmm? ìW«µb±T«Õ ¼ @’Œ(*ºÉdžÚ(Ý••r+×3&@’ iµºââ*Ž7ŽIýstdÐm„ˆ3gàœ£þWoÆ¥²÷Ýwý"âÝ»Í'OÞüðC!Ýãê:ÞØÿ{ÞÁgQ\\—ÞÜü…­ ±wpvx@’$€$ àIx@’$€$ àIx@’$€$ àIx@’$€$ àIx@’$€$ àIx@’$€$ àIx@’$€$ àIx@’$€$ àIx@’Öûë€(//·Îº0êës|ò„íåeä*Û¿>ø`ñâÅÖY—õŽIåååV[.NNê1#±XÜÐ`½_4°êß¾]´hQ~~¾5×ø<#š«ƒë$€$ àIx@’$€‡=&©««kË–-|>ŸÅbñùüõë×755Q7!•J1® û„v¸Fë°»$étº•+WVVVŠÅâÆÆÆ3gΰÙ쀀•JeëÒ€9v÷[JÇŽ««««­­?~ßÃÃ#**ª£ã—Ÿ>&"''‡ÇãM˜0aëÖ­ÙÙÙ\.wâĉ›7o¦dffê7ªªª rsssrrò÷÷ÏËËC­ZµêÀÔ€ŠŠ ¾¾>S5´··ë·©W===é~úVºŸ$É}ûö͘1ÃÍÍ-<<Üò-²#¤µˆD"‘H4è0WW×ââbS·"„$Irr²OEE…L&[¾|yhh(}«P(loo‹Å¡+VÐíºº:’$322är¹~ƒšPsæÌ‰‹‹«¯¯ommMMMe±X*•êØ±c‹/¦lÚ´éwÞ1SC[[›AÛ “^#ÝðàÁY³f•——×ÖÖ …BzG ºEf „rssÝá¸Ø]’˜Læµk×èE:ñ …‚|z7øúú¦§§Sª««BÔ­¥¥¥$IjµZƒ¶A\ôç7¸I©Tj4ª-“ɨ;[©T²ÙìÆÆF­VËårËÊÊÌÔ0Œ$Í›7/++‹êljjb0===ÃÛ"ýM³f’ìîìÆårkjjèE…BA?q£544øøøPmªÑØØH-º¸¸ „ Ú–S*•III€Ë寯ÆR“&M *((¸rå “É\ºt©™†¡¾¾>::š ‚ ¼¼¼´Z-Æ-²»«)$$äÈ‘#ÔÃ!Äápnܸa0†ÇãÉå¿ü¬1Õàr¹¸ r¹|ÿþý÷ïß?þ<Ý!‹sss### ‚0Su<R°¸\nQQõàÖét …böìÙ¸¶È:ì.IÛ·ooii …R©´¥¥¥°°p×®]cÖ®]»{÷n‰DRSS/ 9Ž%“gffÖ××ë7BÝÝÝʧ´Z­Z­^¸p¡¯¯ï½{÷bbbBOžÇmèÑ£®qã˜~~S©ÅînÕ£G]>>žô€ÚÚG6*Í®Á;¸ƒ(.®Š‹KonþÂÖ…Ø;8»< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IQü;“ß}÷ÝèÍo2™’ÏwÉË˳u!DDDŒâìä¨ÉÍÍźÁÐÞ}M’ä¨ÿí[þ"ªÈËË[³fͨ®®“$€$ àIx@’$€‡]$©««kË–-|>ŸÅbñùüõë×755Q7!•âüQlìZÂÌ>3lŸ$N·råÊÊÊJ±XÜØØxæÌ6› R©l]Ïüþbô^ô¤^ãtXZZÚ”)Sº»»õ; …F£!I!$‘H0V…}BSkikk£Úæ7Ð:,¼/FÂöǤ¬¬¬ 6Œ?^¿“Ãá0 zQ£Ñ$%%ñù|¨¨¨ŽŽªŸ ˆœœ7a„­[·fggs¹Ü‰'nÞ¼™™™©ß¨ªª*((ÈÍÍÍÉÉÉßߟz‹mÕªU TTTxxxôõõ™ª¡½½]¿MBÈÓÓ“ê7¿A”••y{{§¤¤X8?Õ(,,œ1c‡Ã‰ˆˆ ÛÒè…ÔÂÇ««kqq±©[B‰$99ÙÇǧ¢¢B&“-_¾<44”¾U(¶··‹Åb„Њ+èv]]I’r¹\¿“æÌ™W__ßÚÚšššÊb±T*Õ±cÇ/^L Ø´iÓ;ï¼c¦úðC·õ;ÝÀ€€€«W¯îرcHóûùùUTTܽ{wÉ’%«W¯6¿“­pL²}’˜Læµk×~-è)…BA>½ã}}}ÓÓÓ©ÕÕÕ¡ÎÎNêÖÒÒR’$µZ­AÛÔ)làMJ¥’>ÑÈd2êÞR*•l6»±±Q«Õr¹Ü²²235˜OÒ ˜ŸŸO’äPç?vìÕYUUE6å¹8»q¹ÜššzQ¡P |^ÓÐÐàããCµ©Fcc#µèââ‚rpp0h[N©T&%% .—KuNš4)((¨  àÊ•+L&séÒ¥fjáz{{›ßF£èÁsæÌ±¼˜Ñcû$…„„9r„: „8Î7 Æðx<¹\Nµ©—ËÅU€@ Ëåû÷ï¿ÿþùóçéþˆˆ±Xœ››I„™¨ƒ„©ûrÐ ¤¢?Ôùëêê¨Æ?þˆ°îa½Ã…GÔGñx¼×_]"‘477,X°ýöì¶{÷n__ßëׯS×B¡ú¿HïTe´mô:©´´Tñ”F£™:uêgŸ}ÖÑÑQUUE}L&“‘$ÙÙÙéääÄápªªªH’4U‡Ãùꫯ:;;ãââÞÙ§¦¦Æò Æü³fͺ~ýúÝ»w—.]Já}1¶OI’>ŒŠŠruuuvv …Ô#RG÷÷÷'$$xyy¹¹¹EFFê_7˜OB(##à¡O"‘OŸ>Åbœ={688ØÏÏš'$$dþüùTÛT ÇŸÓ I2.,,,,,ÌÖUŒ%pvx@’$€$ip¥¥?غ„1`Ô¯¸ÃÃÃG{£ª·×Q&sÿŸÿiµu!#b…wåFñ˜ÄçóE"ÑèÍoν½ÌÞ^G[2"<o´ï Â_™°$I¾ôÒÇÍÍÊøø ­[WÙº»×IæÜ¾ÝØÜ¬DÞ€‡œy$s ¤ŽŽ „PS“âæÍ¶.Ç®A’LÒju……RµZ‹7ŽqòäM[Wd× I&•—×>yÒKµûûµ74mK²g$“ ÿÉüõû-}ß}÷£ ë±s$ãúû5ÅÅÿ§ÑhéGG‡ÂBÃ$ɸo¿ý¡¯¯_¿G­Öž9sëçŸÕ¶*ÉÎA’Œ+(¸Á`}}jxçÄH’==ªóç«^_;8À Î$H’.|O=ù7 Õj/\¨îêúÙú%Ù?H’'OÞ ¾Û?Z­»|ù®•ë I†:;{ËÊjt:S/‘EEð¥ð®!•JÓÚÚI/^ºtwûöÂòò$º‡Ápàñ\mQš]ƒob±˜Ó¦¹Ó‹žžBú=À(8»< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IHÀ’ð€$< IR­k±GáÈ`L²uöH$é‡ÇðïLŠD¢ùóçÛ¤20†äççô&iþüùË–-³R9`ÌúöÛo zà: àIx@’$€$ à1œ$õöö~ùå—¯¾újDDħŸ~ÚÞÞNÝ(“É0Ö‡}B{Xc``àž={0®400°³³sðq£óß)CNI’ ÷îÝÛµkW~~~rrò¸qã6lØ VÃÏzÁåË—øá™úùÊ!'é?ÿùOssó§Ÿ~:wî\‡ãããóÞ{便¥1ŒÁÿ³½2õ Äò`5jÙ²e‡²pðè•Ñ“tñâÅÐÐP6›­ßéâââàðëTZ­6---""bõêÕŸ|òIWWÕXRR¾råʯ¾úêòåË"‘hÕªUGŽ¡\¼xQ¿1PmmíæÍ›CBB‚ƒƒßzë-ê%²ÄÄDúU×»wï®^½Z¥R™ª¾W¨v`` B(44ÔàÞÒï'Iòĉo¼ñFHHÈÎ;-ß"S EII‰~§ÑýfI¡«W¯FFF …Â>úH©TÊÔýBKKK‹íîî6_¼QCNRmm­ù1¹¹¹%%%»ví:|øð“'OöïßOßtéÒ¥´´´ÄÄÄ'N\¼xñßÿþwBBB~~~KK BhÛ¶mþþþú>þøc—’’’““¾wï^FXVVF ())yå•W LÕ` ´´!TTT4iÒ$SýEEEgϞݾ}ûÑ£Gûûû8`á™Âd2ãââRRRúûýp£ûÍÂ2NŸ>½wïÞƒ¶··ïÛ·ÏèTfî„ÐñãÇËËË?ÿüs3•›2ä$õööêïñÀ§ôƒ|îܹµk×Î;—Çãmܸñ¿ÿýooo/uSDDÄĉ—.]ŠŠŒŒ¤ÛÔããÕW_:uª~c /¿ürÓ¦MS¦Lquu}á…ÔjuOOÏË/¿üã?¶··“$ùí·ß™©aN:õÖ[oÍ›7ËånÞ¼ùêÕ«*•Ê’-2céÒ¥“'OÎË˳d¿ ZÆ»ï¾;sæÌ3f¼÷Þ{•••yyy§23NNÎ×_””4a„áí¢!'ÉÝݽ¡¡^<}ú´X,6óøñc.—Kµ©F[[µèää„¢~eV¿m¹îîî´´´M›6‰D¢Ï>ûŒê?~ü‚ ®\¹rëÖ-ƒñ»ßýÎL ÃÐÚÚúÉ'ŸP‘H¤Óé°lÑßþö·ììì'OžP‹ƒÖl¦ ///ªáííêìì8•™ùoß¾½páÂ'N e¯üÆsrÉ’%§Nzíµ×¨ #—Û·oŒñôôlnn¦NOÔAÞÝÛo6nܸqÞ¼yqqq¾¾¾$I¾öÚkTÿ²e˾ùæ›,_¾œ 35PŸŸR°ÜÝÝÿú׿.Y²„úï===Ã;ðõõ©©©Ôâ ûÍLMMMžžž¡††‚ 8ÎÀ©ÌÌ¿sçN­V»nݺU«Výþ÷¿ƶ ù˜ÓÑѱuëV™LÖÑÑqõêÕôôtƒ1ÁÁÁ?üðCccã?ÿùÏÅ‹[¸ß/^¼Hm!Ý@õõõu?¥Óé´Z-u|~ðàÁÞ½{B?ýôBèå—_–Éd%%%AAAfjpqq¹víZoooff¦þª©I¢úƒƒƒÓÒÒd2YSSÓçŸþþûïeŸ™óöÛoÓWxföÛ e¤¤¤Èåòúúú/¾øâ•W^ùóŸÿú裱ûù¤¤¤¤¹sçFGGÛºgßÎ;===õ?ïöŒü6·J¥’ËåR©4>>ÞÖµüâúõë ûÿò—¿¬_¿ÞúõŒ¶g$I•••ûö틉‰™ libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - a -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Footer-members.html0000644000175000017500000007120612234777147031743 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_Footer Member List

        This is the complete list of members for Glom::LayoutItem_Footer, including all inherited members.

        add_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        add_item(const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)Glom::LayoutGroup
        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Footervirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_border_width() const Glom::LayoutGroup
        get_columns_count() const Glom::LayoutGroup
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_items()Glom::LayoutGroup
        get_items() const Glom::LayoutGroup
        get_items_count() const Glom::LayoutGroup
        get_items_recursive() const Glom::LayoutGroup
        get_items_recursive()Glom::LayoutGroup
        get_items_recursive_with_groups() const Glom::LayoutGroup
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Footervirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItem_Footervirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        has_any_fields() const Glom::LayoutGroup
        has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::LayoutGroup
        LayoutGroup()Glom::LayoutGroup
        LayoutGroup(const LayoutGroup& src)Glom::LayoutGroup
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Footer()Glom::LayoutItem_Footer
        LayoutItem_Footer(const LayoutItem_Footer& src)Glom::LayoutItem_Footer
        m_list_itemsGlom::LayoutGroup
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Footer& src)Glom::LayoutItem_Footer
        Glom::LayoutGroup::operator=(const LayoutGroup& src)Glom::LayoutGroup
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        remove_all_items()Glom::LayoutGroup
        remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::LayoutGroup
        remove_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::LayoutGroupvirtual
        set_border_width(double border_width)Glom::LayoutGroup
        set_columns_count(guint columns_count)Glom::LayoutGroup
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_list_const_items typedefGlom::LayoutGroup
        type_list_items typedefGlom::LayoutGroup
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutGroup()Glom::LayoutGroupvirtual
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Footer()Glom::LayoutItem_Footervirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_3.png0000644000175000017500000000302412234777146025112 0ustar00murraycmurrayc00000000000000‰PNG  IHDR %JÐubKGDÿÿÿ ½§“ÉIDATxœí›oHS_ÇÏœ03®S îvW±LÞè Y{1(‚Q\"ÂAX!ˆ JÐ6Pk$D½’¨6QÒ¢$‚^ )så_¡ÌMtcù¶Dιû{qúßén]×Më×å|^=÷œsŸó<÷{î}÷n2ŽãAºäýé; Xâ%N>ïxlllaaá„Bøu†9|øðwMÜ÷Ô××ÿ¡ØÛ@}}=OPþ  þþ࿈ÅbÉl$5Xâ%Xâ%Xâ%Žx———;::†Q( Ã455ƒAØ%“É<Ï6EøÍá¹sçx-Û;N*•’ÉdKKKñðع`~‘§Óé'N|üøqhh(¼~ýº  Àh4®¯¯oo|ˆþþþOŸ>ísr¹Üáp Œq¹\1ŒšššßÛÏ’åEG.<~üxvvÖëõÊËËìœÌF&*•Š¢¨ß Œ'‰”••‰8WäÜ×××ÚÚ ÕEP%—ËÑa*•²Z­ Ô••544D£QîÀÀ€V«-..¾zõj?MÓ»víºtéàt:qÐÞÞ¾¸¸800À‹–"[x ŽãzzzöíÛ§V«- ØÈȈN§{ôèt•N§{zzôz}QQ‘Á`E󮬬ÄÿessS8_Ü­@`“““ÇŽS«Õ………‡zöì<P^^.P2„È|ù>3“’’’áááõÆÇÇoÞ¼©×ëÝn÷ôôôÑ£GO:…zY–]ZZ?~Ù³³³Ç9ŸÏ‡ÐáóçÏ÷ìÙ“H$P 4"‘ò má)îß¿¿ÿþ±±1¯×˲,Ê`4ß½{·¶¶]Ý»wa˜‘‘‘`0hµZKKK7662"#Èw+XeeeKK‹ßï‡Ã½½½ …b}}—£Yµ)p~~þèè(®($‹¡«_QQñäÉ8`jj ðõëWØër¹8Žƒ ·á•Êu™L¦7np9,0ÅÁƒûúúà)Á`P.—¯®®Â³qWÕÕÕ½½½°%NÇb±t:ÏŽ#/îV °x<žJ¥àÈééi<Ñ‹|DÓ4=33ƒëŠ¶Ðˆ……½^mhx¨R©yyy<{KîÞ½{ëÖ­p8¼åH)ü~ÿÙ³gáîW£Ñlnn¢Àt:îdnn®²²Ú2™Œ¢(øÀÌŠ@¾¸[Àâñ¸Õj5™L4M777o™c.ˆøäÉ“>„K@QÔÄÄoŒV«õù|ІMÓbãüFmmíéÓ§¯]»†7Â5Ž®æ–Ð4ýòåKü¾Ý½{wii)Üo£¢%0E2™¼råŠV«U©Tf³îì2GF"‘d2i³Ùt:R©¬««ƒ%33ˆè|‘=<<¼wï^…Ba4ß¼yc6›«ªª8Ž3™LÑhTX‘¬Úɸï÷„ð£1ùàÿ7’U;ò.Zâ%Xâ%Xâ%Xâdù|ëv»³þ„šð?Çív ^#_`þ?[ƒ!S>þ›,‚Ä 5Xâ%Xâü¬¥{ß $IEND®B`‚glom-1.22.4/docs/libglom_reference/html/inherit_graph_13.png0000644000175000017500000000406112234777146025175 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“æIDATxœíœmHS_ÇÏÆ–9™+ÉæÝtm>P¾áL ÊÑM K &HP¨°^T¦R/¢ _”‹j“¥Ó"Æ u²e¡L§fmLœ:·ÔûqèþoÛ\ýý»-½÷óêwÏÓ~ç|ïyØù!† Ò@ ¶…Ò›\Pz“‹PâƒÅbééé –+þ€Ë妧§ÿûŒhjj žc~A*•%õ,AØ· ùùùn)ÔþM.(½É¥7¹ ô&”Þä‚Ò›\lPïùùùëׯs¹\:Îåre2™Õj…Y‚ÆÍóÐ ‚LOOo•fA°‡‹ÈFô^[[;~üx___KK‹Åbioog0N§sÓýÛü]Ãåy¿†ý…B½°°@Lt8+++ð®Æ`0ü¶‘ÿÀn·¸Ù h‡K*•ºÝ¯md~766–——ïÚµ‹˜Èb±BBBðÇ••¹\Îår÷ìÙSTT433Óyùò%Š¢L&³ªªJ­Vs8œˆˆˆk×®áT*Ñ0 éééaaaqqq °XKKKttôîÝ»ŸÍfçççCœNç•+WöîÝõðáCÜyA´Z-ŸÏg±X333‚¢¢¢à‚7ûôéS·Á±Ûí®ÿ Qü?œß‘‘‘mmmëåB…jkk^¯7™L‡>uêž+‘H¦§§[ZZÇŽÃíÑÑQ ÔJ娨ÑØ¿EE…Ífkmm¥Ñh“““€Ó§OÏÎÎ655…††.//'&&–••ONN644Ðét§Ó ?.##£««ëîÝ»B¡°··×l6K$øÖËår×ÕÕe2™²²²ÀÏ HJJÒëõƒƒƒ™™™'OžÄ~ßx³KKKxÇ»ºº “’’9\¾ñœßÑ;44´»»›è1Äápàˆþü9,ðùógÀ÷ïßangg'†a«««nöz˛;ÿ>´á2èïïÇ+Úíö¹¹9¸Ÿ¯P(`âljµž={Ó ónzÃf1 [ZZzòäIJJJvvvSS“Ëå îpÙœõœÃá ýÆO›8ß¾}І†Åbáááæf¯G}}}]]]llìÅ‹á2ˆ¢(±âÜÜœ\.‹Å§´´”XÇãÆÇÇÏ;‡ ‚ 111«««‹Åf³%$$Àb¸Aô˜˜HtÞ­YNûéÓ'µZÝÙÙYPP°cÇŽà—o6Róĉõõõð-°X¬÷ïß»•AQtll ÚÐàp8sñèÑ£fß¾}ÙÙÙp°à†Š#‹ÇÆÆîÝ»÷åËNGÌ‚£Ãáp^¿~ ßñµµ5‡Ã‘€¢(®„Ùl&Ö…ÆÈȈWça³(ŠŠD"N×ÑÑáp8¼úàáòÍFô¾qã†Íf“H$F£Ñf³iµÚ›7oº•¹páÂíÛ· ÃðððåË—% ‹Åú“ÆU*Õøø8ÑHII©¬¬äñx©©©†1 ÏZ?~ü‰DñññCCC%%%€ÙÙYb’’¹\n4ÍfsiiiNN ¸¸øÖ­[ÝÝÝ###n' êêjƒÁ044T^^Ž;ï©èÁƒÛÛÛß¼ycµZ:$“Éúûû9\ÿââþ‡û7†a_¿~-**ŠŒŒ “H$ð•$nH.—«¢¢"&&†ÍfŸ={–¸óáW T*‰ÆÛ·o“““ †@ P«Õ˜ÇÑÉn··µµÅÅÅÑéôŒŒŒŽŽŽ¼¼áWSSc6›9réÒ%‘H ¿7²èí5þçú„1™L===óóó¹¹¹~÷Ø?lU½=Ãä¾ñÿÆñ8N•J•™™)“ÉÒÒÒkjj6±/…¸¸o¡ýx„ÉÏýÛkü¯µ^ ¢Õj‹ŠŠz{{ҳ̈́Š“ *þMv(½É¥7¹ ô&”Þä‚Ò›\Pz“ /ñoÏ?i£Ø¢èõú´´4bÊ/ó›ËåJ¥ÒÀºDáGÒÒÒ~ùóTê6TPû7¹ ô&”ÞäâÙÐøÜcË@IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1DatabaseTitle.html0000644000175000017500000007517512234777147027261 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::DatabaseTitle Class Reference
        Glom::DatabaseTitle Class Reference

        This is a separate class, instead of just deriving Document from TranslatableItem, to avoid the need to use Document via sharedptr. More...

        Inheritance diagram for Glom::DatabaseTitle:
        Collaboration diagram for Glom::DatabaseTitle:

        Public Member Functions

         DatabaseTitle ()
         
         DatabaseTitle (const DatabaseTitle& src)
         
        DatabaseTitleoperator= (const DatabaseTitle& src)
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        This is a separate class, instead of just deriving Document from TranslatableItem, to avoid the need to use Document via sharedptr.

        Constructor & Destructor Documentation

        Glom::DatabaseTitle::DatabaseTitle ( )
        Glom::DatabaseTitle::DatabaseTitle ( const DatabaseTitle src)

        Member Function Documentation

        DatabaseTitle& Glom::DatabaseTitle::operator= ( const DatabaseTitle src)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/database_title.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__FieldSummary-members.html0000644000175000017500000012176412234777147033113 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_FieldSummary Member List

        This is the complete list of members for Glom::LayoutItem_FieldSummary, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_FieldSummaryvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_editable_and_allowed() const Glom::LayoutItem_Field
        get_formatting_use_default() const Glom::LayoutItem_Field
        get_formatting_used() const Glom::LayoutItem_Fieldvirtual
        get_formatting_used_has_translatable_choices() const Glom::LayoutItem_Field
        get_formatting_used_horizontal_alignment(bool for_details_view=false) const Glom::LayoutItem_Fieldvirtual
        get_full_field_details() const Glom::LayoutItem_Field
        get_glom_type() const Glom::LayoutItem_Field
        get_has_related_relationship_name() const Glom::UsesRelationship
        get_has_relationship_name() const Glom::UsesRelationship
        get_has_translations() const Glom::TranslatableItem
        get_hidden() const Glom::LayoutItem_Field
        get_layout_display_name() const Glom::LayoutItem_FieldSummaryvirtual
        get_layout_display_name_field() const Glom::LayoutItem_FieldSummary
        get_name() const Glom::LayoutItem_Fieldvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_FieldSummaryvirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_related_relationship() const Glom::UsesRelationship
        get_related_relationship_name() const Glom::UsesRelationship
        get_relationship() const Glom::UsesRelationship
        get_relationship_display_name() const Glom::UsesRelationship
        get_relationship_name() const Glom::UsesRelationship
        get_relationship_name_used() const Glom::UsesRelationship
        get_relationship_used_allows_edit() const Glom::UsesRelationship
        get_report_part_id() const Glom::LayoutItem_FieldSummaryvirtual
        get_sql_join_alias_name() const Glom::UsesRelationship
        get_sql_table_or_join_alias_name(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_summary_type() const Glom::LayoutItem_FieldSummary
        get_summary_type_name(summaryType summary_type)Glom::LayoutItem_FieldSummarystatic
        get_summary_type_sql() const Glom::LayoutItem_FieldSummary
        get_table_used(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_title(const Glib::ustring& locale) const Glom::LayoutItem_FieldSummaryvirtual
        get_title_custom() const Glom::LayoutItem_Field
        get_title_custom()Glom::LayoutItem_Field
        get_title_or_name(const Glib::ustring& locale) const Glom::LayoutItem_FieldSummaryvirtual
        get_title_or_name_no_custom(const Glib::ustring& locale) const Glom::LayoutItem_Field
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_singular_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_title_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_to_field_used() const Glom::UsesRelationship
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        is_same_field(const sharedptr< const LayoutItem_Field >& field) const Glom::LayoutItem_Field
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Field()Glom::LayoutItem_Field
        LayoutItem_Field(const LayoutItem_Field& src)Glom::LayoutItem_Field
        LayoutItem_FieldSummary()Glom::LayoutItem_FieldSummary
        LayoutItem_FieldSummary(const LayoutItem_FieldSummary& src)Glom::LayoutItem_FieldSummary
        LayoutItem_WithFormatting()Glom::LayoutItem_WithFormatting
        LayoutItem_WithFormatting(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        m_formattingGlom::LayoutItem_WithFormatting
        m_priv_editGlom::LayoutItem_Field
        m_priv_viewGlom::LayoutItem_Field
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_FieldSummary& src)Glom::LayoutItem_FieldSummary
        Glom::LayoutItem_Field::operator=(const LayoutItem_Field& src)Glom::LayoutItem_Field
        Glom::LayoutItem_WithFormatting::operator=(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        Glom::UsesRelationship::operator=(const UsesRelationship& src)Glom::UsesRelationship
        operator==(const LayoutItem_FieldSummary& src) const Glom::LayoutItem_FieldSummary
        Glom::LayoutItem_Field::operator==(const LayoutItem_Field& src) const Glom::LayoutItem_Field
        Glom::LayoutItem_WithFormatting::operator==(const LayoutItem_WithFormatting& src) const Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        Glom::UsesRelationship::operator==(const UsesRelationship& src) const Glom::UsesRelationship
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_field(const sharedptr< LayoutItem_Field >& field)Glom::LayoutItem_FieldSummary
        set_formatting_use_default(bool use_default=true)Glom::LayoutItem_Field
        set_full_field_details(const sharedptr< const Field >& field)Glom::LayoutItem_Field
        set_hidden(bool val=true)Glom::LayoutItem_Field
        set_name(const Glib::ustring& name)Glom::LayoutItem_Fieldvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_related_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_summary_type(summaryType summary_type)Glom::LayoutItem_FieldSummary
        set_summary_type_from_sql(const Glib::ustring& summary_type)Glom::LayoutItem_FieldSummary
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_custom(const sharedptr< CustomTitle >& title)Glom::LayoutItem_Field
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        summaryType enum nameGlom::LayoutItem_FieldSummary
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        TYPE_AVERAGE enum valueGlom::LayoutItem_FieldSummary
        TYPE_COUNT enum valueGlom::LayoutItem_FieldSummary
        TYPE_INVALID enum valueGlom::LayoutItem_FieldSummary
        type_map_locale_to_translations typedefGlom::TranslatableItem
        TYPE_SUM enum valueGlom::LayoutItem_FieldSummary
        UsesRelationship()Glom::UsesRelationship
        UsesRelationship(const UsesRelationship& src)Glom::UsesRelationship
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Field()Glom::LayoutItem_Fieldvirtual
        ~LayoutItem_FieldSummary()Glom::LayoutItem_FieldSummaryvirtual
        ~LayoutItem_WithFormatting()Glom::LayoutItem_WithFormattingvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        ~UsesRelationship()Glom::UsesRelationshipvirtual
        glom-1.22.4/docs/libglom_reference/html/ftv2folderopen.png0000644000175000017500000000112512234777145025003 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÚ}\ˆIDATxí]?oÓPÿ9iš4i°;ii“¶‰ZЉ‘‰ÀÀ7`bèÔÙ¬Øù,HìU'ô$*Tµ]‚T¡DPÚÄ6wÏ}‰;¡C; a¿ÓߟûÝïîž¼jAÀ­InSþ}€9H“ÓŽ|?íÁ÷ =_ÊÆŠ­†¥Àue*;¯YEäsYäæB¢Ÿ¿þÄ—£sÙ½½ÙŒ† É«›©ÀYÇq !GÇ¿v̇¹ÑØ®š °Œ‚ÔF¹}q¥b]÷7í·0)Úd›¾ÿð-èº}Pfä£ÖY{4™ÑÂ@}úæôñ2ÛüÔ—ñúåNŒI‚ÁǃcçÁº%£¬UаI³mc±ô˜å¼ÔÆüÈ>é¸xþt9Æ$µý OæVE*õU´Ì‚ç#ž×ˆ•ïûr@l$øPÿrHaaÇ¥ ²›dZ®rè‘ãqI„o¼øT\Ž,tªj2FAxv-LŸp׌p TÄI/ \¥sfí½; jViTƒèú¤o^cpÅü¼ûû»Ïb]”€¢¤<†aþÕœ²“ßÓ˜y“£§9:Œîù+À³€ñà,E žf³6éNˆÄE£KU}Ü^;¶ØnZ¢uß­US4— ѬëbížN¶.Úk¦ØjTÄöº%µªâ i¯VÄÊÝò§™ Èù¸)ùÿG€™òºJ@T x”IEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_func_0x6c.html0000644000175000017500000001766012234777147026124 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - l -

        glom-1.22.4/docs/libglom_reference/html/functions_func_0x7e.html0000644000175000017500000002404012234777147026115 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - ~ -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Header-members.html0000644000175000017500000007120612234777147031675 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_Header Member List

        This is the complete list of members for Glom::LayoutItem_Header, including all inherited members.

        add_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        add_item(const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)Glom::LayoutGroup
        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Headervirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_border_width() const Glom::LayoutGroup
        get_columns_count() const Glom::LayoutGroup
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_items()Glom::LayoutGroup
        get_items() const Glom::LayoutGroup
        get_items_count() const Glom::LayoutGroup
        get_items_recursive() const Glom::LayoutGroup
        get_items_recursive()Glom::LayoutGroup
        get_items_recursive_with_groups() const Glom::LayoutGroup
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Headervirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItem_Headervirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        has_any_fields() const Glom::LayoutGroup
        has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::LayoutGroup
        LayoutGroup()Glom::LayoutGroup
        LayoutGroup(const LayoutGroup& src)Glom::LayoutGroup
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Header()Glom::LayoutItem_Header
        LayoutItem_Header(const LayoutItem_Header& src)Glom::LayoutItem_Header
        m_list_itemsGlom::LayoutGroup
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Header& src)Glom::LayoutItem_Header
        Glom::LayoutGroup::operator=(const LayoutGroup& src)Glom::LayoutGroup
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        remove_all_items()Glom::LayoutGroup
        remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::LayoutGroup
        remove_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::LayoutGroupvirtual
        set_border_width(double border_width)Glom::LayoutGroup
        set_columns_count(guint columns_count)Glom::LayoutGroup
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_list_const_items typedefGlom::LayoutGroup
        type_list_items typedefGlom::LayoutGroup
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutGroup()Glom::LayoutGroupvirtual
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Header()Glom::LayoutItem_Headervirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1View-members.html0000644000175000017500000001730712234777147030244 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        GlomBakery::View< T_Document > Member List
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1sharedptr.html0000644000175000017500000014061212234777147026534 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::sharedptr< T_obj > Class Template Reference
        Glom::sharedptr< T_obj > Class Template Reference

        A ref-counting smart-pointer for the underlying C++ object. More...

        Inheritance diagram for Glom::sharedptr< T_obj >:

        Public Types

        typedef size_t size_type
         
        typedef T_obj object_type
         

        Public Member Functions

         sharedptr ()
         
         sharedptr (T_obj* pobj)
         Take ownership. More...
         
         sharedptr (T_obj* pobj, size_type* refcount)
         Take ownership. More...
         
         sharedptr (const sharedptr& src)
         Share ownership. More...
         
        void swap (sharedptr< T_obj >& other)
         Swap the contents of two sharedptr<>. More...
         
        template<class T_CastFrom >
         sharedptr (const sharedptr< T_CastFrom >& src)
         Copy constructor (from different, but castable type). More...
         
        sharedptroperator= (const sharedptr& src)
         Share ownership. More...
         
        template<class T_CastFrom >
        sharedptr< T_obj >& operator= (const sharedptr< T_CastFrom >& src)
         Copy from different, but castable type). More...
         
        virtual ~sharedptr ()
         
        bool operator== (const sharedptr< T_obj >& src) const
         
        bool operator!= (const sharedptr< T_obj >& src) const
         
        virtual void clear ()
         Forget the instance. More...
         
        T_obj& operator* ()
         Dereferencing. More...
         
        const T_obj& operator* () const
         Dereferencing. More...
         
        T_obj* operator-> () const
         Dereferencing. More...
         
         operator bool () const
         Test whether the sharedptr<> points to any underlying instance. More...
         
        bool operator! () const
         Test whether the sharedptr<> points to any underlying instance. More...
         
        T_obj* obj ()
         Get the underlying instance: More...
         
        const T_obj* obj () const
         Get the underlying instance: More...
         
        template<class T_CastFrom >
        sharedptr< T_obj > cast_dynamic (const sharedptr< T_CastFrom >& src)
         
        template<class T_CastFrom >
        sharedptr< T_obj > cast_static (const sharedptr< T_CastFrom >& src)
         
        template<class T_CastFrom >
        sharedptr< T_obj > cast_const (const sharedptr< T_CastFrom >& src)
         

        Static Public Member Functions

        template<class T_CastFrom >
        static sharedptr< T_obj > cast_dynamic (const sharedptr< T_CastFrom >& src)
         Dynamic cast to derived class. More...
         
        template<class T_CastFrom >
        static sharedptr< T_obj > cast_static (const sharedptr< T_CastFrom >& src)
         Static cast to derived class. More...
         
        template<class T_CastFrom >
        static sharedptr< T_obj > cast_const (const sharedptr< T_CastFrom >& src)
         Cast to non-const. More...
         
        static sharedptr< T_obj > create ()
         

        Detailed Description

        template<typename T_obj>
        class Glom::sharedptr< T_obj >

        A ref-counting smart-pointer for the underlying C++ object.

        You can copy these smarpointers-of-C++-resources, and therefore the C++ classes can have simple copy constructors which just share the underlying resources.

        Member Typedef Documentation

        template <typename T_obj>
        typedef T_obj Glom::sharedptr< T_obj >::object_type
        template <typename T_obj>
        typedef size_t Glom::sharedptr< T_obj >::size_type

        Constructor & Destructor Documentation

        template <typename T_obj >
        Glom::sharedptr< T_obj >::sharedptr ( )
        template <typename T_obj>
        Glom::sharedptr< T_obj >::sharedptr ( T_obj *  pobj)
        explicit

        Take ownership.

        template <typename T_obj>
        Glom::sharedptr< T_obj >::sharedptr ( T_obj *  pobj,
        size_type refcount 
        )
        explicit

        Take ownership.

        This is only for internal use.

        template <typename T_obj>
        Glom::sharedptr< T_obj >::sharedptr ( const sharedptr< T_obj >&  src)

        Share ownership.

        template <class T_obj >
        template <class T_CastFrom >
        Glom::sharedptr< T_obj >::sharedptr ( const sharedptr< T_CastFrom >&  src)
        inline

        Copy constructor (from different, but castable type).

        Increments the reference count.

        template <typename T_obj >
        Glom::sharedptr< T_obj >::~sharedptr ( )
        virtual

        Member Function Documentation

        template <typename T_obj>
        template <class T_CastFrom >
        static sharedptr<T_obj> Glom::sharedptr< T_obj >::cast_const ( const sharedptr< T_CastFrom >&  src)
        inlinestatic

        Cast to non-const.

        The sharedptr can't be cast with the usual notation so instead you can use

        ptr_unconst = sharedptr<UnConstType>::cast_const(ptr_const);
        template <typename T_obj>
        template <class T_CastFrom >
        sharedptr<T_obj> Glom::sharedptr< T_obj >::cast_const ( const sharedptr< T_CastFrom >&  src)
        inline
        template <typename T_obj>
        template <class T_CastFrom >
        static sharedptr<T_obj> Glom::sharedptr< T_obj >::cast_dynamic ( const sharedptr< T_CastFrom >&  src)
        inlinestatic

        Dynamic cast to derived class.

        The sharedptr can't be cast with the usual notation so instead you can use

        ptr_derived = sharedptr<Derived>::cast_dynamic(ptr_base);
        template <typename T_obj>
        template <class T_CastFrom >
        sharedptr<T_obj> Glom::sharedptr< T_obj >::cast_dynamic ( const sharedptr< T_CastFrom >&  src)
        inline
        template <typename T_obj>
        template <class T_CastFrom >
        static sharedptr<T_obj> Glom::sharedptr< T_obj >::cast_static ( const sharedptr< T_CastFrom >&  src)
        inlinestatic

        Static cast to derived class.

        Like the dynamic cast; the notation is

        ptr_derived = sharedptr<Derived>::cast_static(ptr_base);
        template <typename T_obj>
        template <class T_CastFrom >
        sharedptr<T_obj> Glom::sharedptr< T_obj >::cast_static ( const sharedptr< T_CastFrom >&  src)
        inline
        template <typename T_obj >
        void Glom::sharedptr< T_obj >::clear ( )
        virtual

        Forget the instance.

        template <typename T_obj>
        static sharedptr<T_obj> Glom::sharedptr< T_obj >::create ( )
        inlinestatic
        template <typename T_obj >
        T_obj* Glom::sharedptr< T_obj >::obj ( )
        inline

        Get the underlying instance:

        template <typename T_obj >
        const T_obj* Glom::sharedptr< T_obj >::obj ( ) const
        inline

        Get the underlying instance:

        template <class T_obj >
        Glom::sharedptr< T_obj >::operator bool ( ) const
        inline

        Test whether the sharedptr<> points to any underlying instance.

        Mimics usage of ordinary pointers:

        if(ptr)
        do_something();
        template <class T_obj >
        bool Glom::sharedptr< T_obj >::operator! ( ) const
        inline

        Test whether the sharedptr<> points to any underlying instance.

        Mimics usage of ordinary pointers:

        if(!ptr)
        do_something();
        template <class T_obj>
        bool Glom::sharedptr< T_obj >::operator!= ( const sharedptr< T_obj >&  src) const
        inline
        template <typename T_obj >
        T_obj& Glom::sharedptr< T_obj >::operator* ( )
        inline

        Dereferencing.

        template <typename T_obj >
        const T_obj& Glom::sharedptr< T_obj >::operator* ( ) const
        inline

        Dereferencing.

        template <typename T_obj >
        T_obj* Glom::sharedptr< T_obj >::operator-> ( ) const
        inline

        Dereferencing.

        Use the methods of the underlying instance like so: sharedptr->memberfun().

        template <typename T_obj >
        sharedptr< T_obj >& Glom::sharedptr< T_obj >::operator= ( const sharedptr< T_obj >&  src)

        Share ownership.

        template <class T_obj >
        template <class T_CastFrom >
        sharedptr< T_obj >& Glom::sharedptr< T_obj >::operator= ( const sharedptr< T_CastFrom >&  src)
        inline

        Copy from different, but castable type).

        Increments the reference count.

        template <class T_obj>
        bool Glom::sharedptr< T_obj >::operator== ( const sharedptr< T_obj >&  src) const
        inline
        template <class T_obj>
        void Glom::sharedptr< T_obj >::swap ( sharedptr< T_obj >&  other)
        inline

        Swap the contents of two sharedptr<>.

        This method swaps the internal pointers. This can be done safely without involving a reference/unreference cycle and is therefore highly efficient.


        The documentation for this class was generated from the following file:
        • libglom/sharedptr.h
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_2.png0000644000175000017500000000265512234777146025122 0ustar00murraycmurrayc00000000000000‰PNG  IHDR}%à?qèbKGDÿÿÿ ½§“bIDAThíšQLR_ÇÏRVÈ€dÜëT²67ç ÔƒM_˜í.}€é´ôÁ­—V‹l« ª5ÝÚz¨Öƒ›m Ì"ÓÔ9§/<4” zÈéƒD¸JD†D8Ú„ó8ûŸÿ ø{·ºŸ§ß9çw¿s¿üöã\.„p8loà/…Ó8ÝÙϬ®®ÎÍͱµ•?Š¢NŸ>ýß2xùò%{ûÃÑëõL©ùéÜ 'ï †”®¿³§;;pº³§;;pº³§;;ä¨ûæææ7(Š***¢(ª³³Óï÷£%‚ Ünwþvˆ4ò¥ØØØÄãñ;wî¨T*@ —Ëišv:ùÍ…Èp~ß“d2yîÜ9‚ FFF***ÖÖÖúûûÏœ9ãñxŠŠŠò¾E€Ýn¯®®ÆÃâââÿ# àêÕ«óóóÏŸ?W«ÕÑhÔf³Õ×ׯ¯¯‹D¢räsR,óx<<ÜÙÙ1™LE•””´¶¶†Ãa4OÄ‹/H’,..¾}ûöðð°B¡‰D]]]ØÁb±0 @,ûö/‰D"{|Ô1˜6A“““$IJ¥Ò§OŸ¶··¯]»&—Ëe2ÙãÇñ¶ ?}ú”~_¾¾¾òòr©Tj0P:‚ 2™ gü˜Â>ë]"‘LLLd)—ËÕÛÛ«R©œNçòòr}}}SS^¥izcccddÐÐЀí?BÍf³Ïçc)FµŸ%>.@lt:]0|ýú5ŸÏßÚÚ2™L¥¥¥oß¾]^^>{ö,ö|øð!ÇÓëõƒƒƒ~¿ßÔ“'ONœ81??ïõzišÆÅ r­÷\tçóù‡ƒ)4"‰`Ý+++‘Ãââ" ¢U»Ý!DeË´wk&—²ÄϨûØØN …ÊËËÛû÷ï™W9£ÑXUUEDMMÍìì,„ðÔ©SV«9øý~÷ýûwxÀ}F¡Px<¦Üø0ƒùòå‹J¥B62VWWÑP( Rì_"KüŒ(•Jf¢@ pòäIdcF5Í£Gü~¿V«mll ‡Ã+++mmmè4¥T*‰Döt{’‹îçÏŸö쪀X,~÷î]ŠI’>ŸÙÈP(¿±ÏT²ÄGe˜¢ êÅÌËqéx½^<¯V«§¦¦}üøñÞÞÞx<þõëW…BñæÍTªÉd2‰0?­ÈE÷žžž@ @Ó´Ûí£££wïÞMñéèè¸ÿ¾Ëåòx libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - ~ -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__coll__graph.png0000644000175000017500000000652412234777146031146 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“ IDATxœíLSWÇÏ¥ ¿Šk d£´È¨lÂИ—ͬ¨Õ´þè‹,kQ Á3ã4²)[@…2£Ùˆ™¢qtÑðC¥ 6Ý‚sº—Îéd¸b”2Ú *0Ê}ÿ8óî®…ZõœOøã¹ç>}ÎsΗžsî¹m/A’$À ƒ‹³À8¬7Z`½ÑëXoÄ iœ9sÆÙé`¦™LF—ØÕÚ«þÜ››kQ2‚ÞqqqI3í(•J‹<£Ö-°ÞhõF ¬7ZØ©÷ƒ>üðC>ŸïîîÎçó7mÚ¤Óéà)‚ ÔjõÔeˆ‘˜Â*& £Ñ8¡˜SÞEãg„ë±1^½z5A¥¥¥!!!ÇŠŠjjjrwwŸò»»»¡Áf³kkkçÏŸðññ™òŠPÀ½Oœ8qçέVëíí ð÷÷?räȾ}û\]í‰6&,‹²™L&ýÐa0üüüžÑøØ3žmÛ¶ ŠMÁb± u844”žžÎçóýüüL&,'âôéÓ<ÏÇÇg×®]§Nâr¹3gÎLII¡ éÆhqéÒ¥   äääèèh‡ãééQRRB9TUUñx<‡søðaXX__/ ½¼¼‚ƒƒóóó©hׯ_·BÀßßßh4Žè9{ölpp0‹Å’Éd]]]T9I’û÷ïùå—9Ž\.§:Þ*þhÎcöØÄ°Þ?'Ç‚ÍfWVVŽvöé'Ÿ|"®^½ªÑh–-[K•J¥F£±´´°jÕ*ʾsçI’ÍÍÍtÃ"2ý0**ª®®.((hË–----ùùùîîîÐA"‘üùçŸeee®®®="I2$$$55U¯×—••¹¸¸tvv°¯¾úêhA I’6"##oܸqóæÍ7ß|sÕªUTªŸþùìÙ³¯\¹¢Õj¥R)µ•Mo߆³í³L&³Ø?·GoWW×Ë—/ÓûÒÝÝM5&44ôäɓС¡¡pÿþ}x¶¶¶–$I³ÙlaÓµk½•J%I’===CCC°P£ÑP=(//§âÃB‡“›› »»»‡††`XA aö‚$Ék×®îÝ»c†‡‡ÁS:ŽÁ`ôõõ‘£èmÃÙî³ÖÛžñœËå655Ñe¦çmmmÚÐhoo‡‡L&àââbaÛAPP §§'==]$q¹ÜÍ›7Ó-âçååí߿֬Yï¼óNcc#5Ù2¦ÃìÙ³¡1g΀^¯‡‡---‰‰‰ð‚"00Ðl6S` ç)ì1{^“——ÿÅ,ë矶ðáñxÍÍÍІ—˵/EÀf‹D¢æææƒÞ½{÷Ûo¿¥;À ’ÎÊ•+[[[•Je@@ÀÒ¥K©ÿTAÆtÐjµÐÐh4Aðù|xÈårU*|c www¿òÊ+£µeBÎvcÞz½^*•ªÕj½^öìÙ¬¬, Ÿ 6|üñÇõõõMMMÛ·o—J¥ã\W¶´´Ð1\°`Ahhè­[·’’’À“uDæÏŸŸ––ôú믓$éáá1fxAhÃ!--íæÍ› ï½÷ž\.§®“’’ÒÓÓÕjµV«Ý¼y³X,1%œÎ“…>¸sþ&Iò?þHHH`³Ù^^^R©¾ƒéó÷ãÇSSS9Îúõëáe=uYÛ€‚‚ºA¬æoxXYYìîîuîÜ9‰D2gÎëø0‡ .DDDxxx‚S§NQn£‰D&“ÉF-EEEl6;11Ñ¢ÒÒÒx<“É”H$ÔòŠž<Σ٣a=$mÁURR²nÝ:z æ™F.—ƒßÇûçhõF ¬7Z`½ÑëXo´@To½¾ÇÙ)8‡îXÓïô=¯äçkâãC¼½ÝœÈôÒÞÞÎãñþUDß|Aä›%..É^^¯9;G`k Nœ¸¼{wé‚!*ÕvgçâhPœ¿ËËÕÔê–®®‡ÎÎÅÑ §w[Û=µº•$‹ ¡R]sv:Ž9½«ª®3.³y¸´´ÞÙé8äô.)©7›‡$ tÍÍggäPÐÒ[£éljꤖ¨nnŒŠŠ_œ›’ƒAKïÊÊ_ÜÜþùÐôà ¹¤äNÌÇñ ¤7I’%%õƒƒfzak«é·ß,?lùƒÞ7n´étÝ…nn®åå­ÒÒ[¥ºFÌ!ƒƒCJe=:›N¨èm6—•©-sˆÁðP­¾ëðŒœ*z_½Úl2õxÊÍÎÆ *zõÕuˆ3\៛ƒ²Íf²²òxQþÜ3-ßà} ‰ˆܳg u¸oßWo½õŸðð¾òÒÓÓïëËtFjÅûc.wDZcbbæ;;GƒÊxŽ`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑbR¿çqåÊ•Ï>ûl ³q:‡óÈÓsÐÙ‰L¡P¸sçN»_>©ßëikk+--]²dÉd‚8…3 ½½ ·×ÙyLÆÆÆIF˜‚ßgÊÌÌœ|Ìx˜|Wãù-°ÞhõF ¬7Z`½ÑÂAz÷÷÷=z4..nùòåqqq0ð”X,Öh4SX×”| k´Gü^.I’©©©Adee˜L¦ªªªmÛ¶º¹=çOð|ÚpÄûû›o¾éèè8pà@XX‹Å|ðB¡`0,Ÿ6ð !‹ïß¿?þò§Gè]]]ëááA/d2™..ÿÔn6› E\\ÜÚµk³³³ýôÓ;vL¤Ï¦ GèÍb±>ìããóÑG%&&ž?Þú¾^||üâÅ‹322¶nÝÊf³SSSÇ<''§¡¡nvìØñß'ܾ}{çÎåååo¿ývnnîÊ•+ßxã={ö¼¼¼"##ýüüàrr´¶oß®P(âããçÎKÕ;oÞ¼M›6YKN•'$$…ÂŒŒŒwß}·««kïÞ½í·é`RŸo)))Y·n\”>£¤§§‡……%&&:;‘q‘™™éïïO]FÚºûç·nÝR«Õp0Gtõþé§ŸRRR’’’^|ñEgçâ8PyÞœ5"‘H$9; GƒîûM°ÞhõF ¬7Z`½Ñb Öçð¦/Æ1XÜgš(“Ú_kooÿñÇ'S=f¢ðù|¡Ph÷Ë}þ7²àù-°ÞhõF ¬7Züû† ÊÊEfIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_func_0x77.html0000644000175000017500000001066112234777147026043 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - w -

        glom-1.22.4/docs/libglom_reference/html/ftv2lastnode.png0000644000175000017500000000012612234777145024457 0ustar00murraycmurrayc00000000000000‰PNG  IHDRɪ|IDATxíݱðøScOx@ –¨y}IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1SystemPrefs__coll__graph.png0000644000175000017500000001714512234777145031336 0ustar00murraycmurrayc00000000000000‰PNG  IHDRßõ_¬·+bKGDÿÿÿ ½§“IDATxœíyXSWúÇO€jÂf؇Ali±þP еà¸t·V;S«u랊¢2ÕZ­»B—"K]ªÕÚªˆŒ(à4,¢UŒbA ÛýýqÚÛ4¹Ù ›Ëûyüãxrî9ï¹ùzϽ¹_ÏË"-11t P'@_@}uôÔ Ð3=ö““£Çø=¤‡èS¡   ¥K—ê·OcäÊ•+›7o6tFžÕÉçócbbôÛ§‘êì9pß ÐP'@_@}uôÔ Ð賩©é³Ï>suu8p ««ëÇ\WW‡?b±X%%%,«¾¾×àBï!?@  Î®®®I“&]½z5''çÑ£Gßÿ=›Í=z´L&#Û˜ššfffZYYõMH}< %zþ½SöíÛWSSS]]maarppؾ}ûÚµkÍÌþ†Åb}ðÁ½1:‹Å‹Åööö •½4Ð píŸokk»mÛ6„P{{û²eË]\\ÒÓÓÙlvIIIïž#C訨¨¨¨(ÍlllNœ8¡êS„Pqq1.ˆÅb\ ¼uëÖ;w‚‚‚&NœHDffæ½{÷ä d{ùò!CD"Qnn®‰‰É“'Oš=º  àåË—òÃEDD<}ú477×ÌÌìÕ«Wk×®õöö.---++ 555Ū!++K¿ç¶buš™™þÁïH¥RB…:/\¸€_¿~!ôüùsån)ÕikkûÕW_áJ©TÚÑÑ¡Ð,;;[á„Ðwß}GDgg'®ôöö>pànvûöm2B5€:õ‚VvWYYIþU*•’ìªðòòÂ…¡C‡"„D"‘–cíØ±#--ÍÝÝý£>*//W¸y@¹¹¹)åââ‚21ùíä<|øpÈ!¸ìíí­åÐ@Ï1€:§L™²cÇ|eBq¹ÜÒÒRõ‡TWWã‚P(d±X®®®”Í‚@=zôˆ¬™0aƒ²³³ÇŽ«üÏ€” <øö”ÄÙÙ¹¶¶—kjjÔ‡ è¨399Y$EFF–””ˆD¢¼¼¼””õ‡$&&Þ¹sçîÝ»‹-ŠŽŽ¶²²:xð V Yàr¹ÇojjZ»v-y`@@@bb¢››Ûˆ#‚`³Ù!©TªSÀsæÌIMM½~ýzEEŲeË’|ÞBw ZÞwñ믿Ξ=ÛÆÆÆÜÜ<22òÞ½{Hí}ç¡C‡\\\lllæÌ™C6ËÌÌ”/8pÀÉÉÉÎÎ?Âãcúé'6›íééyäÈ‚ BCCÙl¶D"‘Ka8…ÊW¯^-Z´ÈÆÆfðàÁØ^}ëÖ-õ„ûN½À"ôçßŽŽŽFeggë«CRVV6|øp±Xlgg§¦ÙÑ£Gg̘¡ÇsÛ?÷ìš6lØþóŸ/^ßÊÊ*))éÈ‘#<ÏÚÚçt£¤££C ¸ººÚÛÛÏž=["‘]á|Ú»wïÖ2cöÍ›7ÇokkËápüýýñÖ§2™,..ÎÉÉÉÁÁá믿Æ-)+åÍÈÈHKKm@ eÆlŸ… ÖÖÖ>yò$==}àÀ2™L ¸¹¹…Â1cÆ „Äb1e¥ü _|ñ…——ו+Wª««###ɤ{Ê9À•kT<å|W­ZCÄ¡C‡ÌÍÍ'OžLDnn®ŸŸA•E\˯C1†îFgtU'N¯³ÊÊ—UIÊÛÛ{ÿþý¸|÷î]„Pcc#!—O[ûŒÙ ¸, ± œ‘‘+oݺ¥¦R~P??¿C‡áuuu¦¦¦---UpåUgA9ߢ¢"GGG‚ ,XðÙgŸ 4¨££#66vÙ²eUqUç_= \ÙuÅÒÒýžlX¾¬Š‡zzzâ2.Yq>mí3f744‚ÐÐP·`Á\)‰þú×ß¶Æ% ”•òƒÖÖÖΙ3‡Åb±X,—ÎÎN•rpYÁµ™ïÛo¿ÝÙÙYVV–ŸŸ?þ|kkë7näççOœ8·TÈ"Þ=@:ÃçóqÚY„.ðx<üWüehŸ1;44ôÞ½{6l¸ÿþÙ³gÉþÉüõdêoÊJùAy<Þ±cÇð%§««K*•b+çט\›ùš˜˜„‡‡9r¤±±ÑÇÇ',,ìØ±cµµµ!!!¸¥^Ò0ÃÿTÔ™yóæ­Y³fèСƒ ú÷¿ÿÉåråàŒÙ~~~G}Æìööö‘#Gz{{WTT¬[·!ôüùó?üpõêÕ>>>ŽŽŽäÃe¥}:""bèС2™léÒ¥øñüÀ!±XLY)?h[[[bb"ŸÏ·´´Œˆˆ é”s€+×PB¦ W5ß§OŸ²X¬mÛ¶ñ믿"„vîÜIy&»}ßÉ@­üZfÌ(aà}§ËÿYéEšgΜaQ!Ô¨œ1»¸¸¸{]õ6ÝžcßÀÀk§Á¹{÷î’%K®]»FDppðÎ;ÉGx@'@}aàÊ0P'@_@£7uš ¨ / T'ø;{>¾´3PØß ÆMUÓd±Xyyyƒær¹111‰DÕÄ:”7}vuu¥¥¥yzzZXXª:”$‚rRŠtïÁo27U7‡ZTTT^^ìììlee¯ª«ööö•+Wòù|;;»Y³f‘ïB/^tuuݵkW||¼ƒƒÇÛ»wïÀU½ˆºqãÆ»ï¾kccÃf³‡ –••EÄ«W¯–,Yâèèhoo¿eË„X,¦¬”4==}ýúõ666QQQdT×®] âp8îîî{÷¡D¡© mÆíêêR®TèÁÎÎîôéÓA455!„ŠŠŠ´ø ‚Áo2•ë8>U8>Õø85Ž«Ê©)ßé'¼zõ*Þ~Vó·ˆ;Ѳ¡Fàø¤ŒMS㸪‚‘§§gBBe ”ô/u‚ã“5>N㪠F¾‡ÆÆÆ¤¤$>ŸðàAU1PÂÀ§"=ÒOŸ›©W£SóÁƒÇÿßÿþ7gÎ5§HP§:ðÖ•ÅÅÅ•••j¶ê¼~ýzEE…ö[uÎ;ÉmÕYXXXUU¥°U§B¥egþ7tºÒz\Ùû‰ãSS㸪‚!{pttTœª³­ ] †Ú¿ÓxŸ´…+{7öïÇ'=a൳/Çg¯êè Wv€1€:úêè ¨ / T'ø;Õ©S~öžcØBñQ ÉÐ)wÕ*¡åžš}‰–2ödPÛ(A• ÒKª1T-÷ÔìK@=Ô6JP%C§ô’j UË=5û®ì}3¼c’¡S¦}תª ïÔiôhÅ(Øö(½¤ÑvOÍ>ò³=fx§„2í»½½½ú£Tex7  NÐÜÜ<}úôÖÖÖððð­[·*4‰düøñ\.wÆ gÏž}í5\W»wïŽ]¹re`` @ hllœ:ujEE…ú£’’’Z[[§OŸÞÐМ››«óÄô ] ´ÊÏÞsú³m”÷úÊÏÞsúƒm´Wa൓€mêè Wv€1€:úê¤)°—'ut†ê§~Ñï^ž:Á@ujãï4¬)“ÎÙÛÕäd×8.AåUèA7 æŽê5´qÐ!ØËÓ@{yêDÿU'ìåI[ßìå©%ýW°—'%½½—§N0ð¾³—€½<5Ž«w‡(¨S[`/OãjÜËSgºq½¥9½´²Ã^žÇÕ¸—§ú/Eº@èàïìϦL=ÂÀ•½‡þÎþ`Ê4–½<xí4`ÊÔ; N€¾0pe¨ / NZnNJ@}a :ÁßiXôxÉg :•ýàæ¤ ¬««+--ÍÓÓÓÂÂ"((¨°°PýÄIÍ‘eå­CUùAY,Ö¦M›ðáEEEöööííZ챪ëË%ú£ü&›“Ê͹yófWW×üüüºº:@`gg×ÞÞ®fâò/oÉÀ¶Un‰#ß¹sç¨Q£på’%K>ùäm¾Êþ¢Nps*æë뛞žŽËØRÔÕÕ¥fâ”êTØ:T¹%޼¡¡Íf?zô¨³³“ÇãåççSž+¸²SbÀ-6)wÓ‰D¤»Œ,PVʪj‹Í;v¤¥¥¹»»ôÑGåå妦¦Ê5ÊÝ¿ßÇÇ—Y,—Ëe±Xj&N‰ÂÖ¡ÊàÈ 4~üøÜÜÜK—.™™™…„„¨é“¤¿¨SWúƒ›“Çã‘S@áÜÔj&ޝ… bÕ¸u#)ܘ˜˜œœœ¬¬¬™3gj»á£6Xã‚re×Õ/·fÍooïk×®áÛ¯ÈÈH…COiiiyyyDDB¨¤¤„²+ggç7J$’›7oÆÄÄ „„BaJJŠ»»ûåË—+++ÃÃÃBb±˜²R~Д”ÿââ⪪ªùóçà!<<<âââD"QNNŽ™™Y}}½rr`©©©C† )((‰D6l°°°xñâ…ª‰s¹Ü½{÷666.\¸P90âÏË}ee¥ònlläp8\.÷æÍ›j¿@¹/NËvF„^ÔÙÜœmmmÉÉÉnnnæææ#GŽÄ·ãª&~àÀ''';;»ƒªW'¥3eÊ”aÆ©øÞ(`  ¤ïýàæÔ’iÓ¦9rÅŠÚ ½É?ü@yZV®\©þ@??¿åË—755‰D¢éÓ§¿ûî»Ý¡C`---EEEçþýûÚÕßÕÙmîܹ3nÜ8KKK ‹ððpU¿›˜œœKKËõë×ëtWv€1À/J}uôÔI#À婨 / T'ø;é€^.ù T§ªý;ÁåIXo»<'OžÜg'¦w~Þ2$ªvªAàò4„Ësß¾}Ýpvþ6„öM5ê—§r`½íòìž³ÃÀ•] àòT¬·]žÝsvbú—:u\žÊ'twyvÇÙIÆ0Ô¬ìàòT¬\žÝpvþÖ›N­=ª\žzqyº;;1 tjÿNpyªAgg'FW93pyöÝsvb@=\žéž³ÃÀ•` ð‹@_@}uôÔ ÐªüŒêÔ&?{ßÓ w)¢²NRúD5öOPeN7ôüë Ð&a߃tw—TÖIJŸ¨ÆþUeN§9 Î>éî.%¨¬“”>Qý«²„Ò®ì´EWw)FÁ:IéÕØ¿*K(ÍuÒC$¥OT#zÏœÞ7€: ÊÜîR“9Θ:@7vïÞ»råÊÀÀ@@ÐØØ8uêÔŠŠ õG%%%µ¶¶NŸ>½¡¡!88877·o¢í! tÐ!?; ¸²÷0?{ßc,ÙÒû^;ÆÀÀk'À@}uôÔ ÐP'@_¨Nðw2ª“žþN 0PcuôÔ ÐP'@_@}uô…%ðw2ª` °²ôÔ ÐP'@_@}uôÔ ÐªüŒê'c` :ÆêèËŸÞdFGG0}áý|ìËòž:ž?jÔ(CGaHþ¤N‹åçççàà`À€L~~~VVΕÝoQÜ!1::zìØ±†ˆøƲÅf¯÷}uôÔ ÐP'@_@}éNVƒ—/_îß¿ÿÂ… R©ÔÆÆfĈÿüç?íííBaaa»víòññÑW|2™,33óüùóõõõC‡ýðÃýüüôÕ¿FäŸ-,,†ëìì¬Í±»wïþî»ï²³³­¬¬z-@&£³: ‚HHH`±X)))ÎÎΉääÉ“‹/>xðàk¯éÿ?šmݺµ¬¬,!!ÁÝݽ¹¹ùâÅ‹ñññyyyæææzK_}õ•——BH*•îÚµëóÏ?ß³g6æååmÙ²¤Ùmt^ÙÏœ9óøñã/¾øÂ××—ËåzzzÆÅÅedd˜ššöF|—.]Z´hÑo¼Áårù|þ|““Ãf³µ<<,,¬±±±‡1p8KKKKKKWW×øøøªª*±X¬ÍmmmZ^eJtVç¹sç¦M›¦ KKKù¤z111S§NMMMmjjÂõaaaçÏŸŽŽž4iÒÞ½{þù稨¨É“'ïØ±ƒlpîÜ9ù‚™™ÙÓ§O•ÇJLLÌÎÎÆ5åååS§Níèèøå—_/^}Z¹sùÑB ±ézÚû':«³ººÚÓÓS}›¬¬¬óçϧ¤¤lß¾ýùóç6l ?úé§Ÿ222>|îܹo¾ù&!!!;;[$!„V¬Xáïï/_˜1cÆæÍ›W­Zõã?Êçm ËÏÏÇåóçÏ3ÆÌÌlõêÕo¼ñÆáÇ/^üå—_æåå!„Ž;6hРcÇŽ>}:99y×®]mmm›6mÒ2$y¶oßÎçóÿò—¿àš½{÷ ‚¦¦&åÎ/\¸@ŽŽRˆM*•êzæû!:«óåË—øtcÂ~§¹ùÃï?ü0oÞ<___>Ÿ{ùòå—/_âbbb¬­­CBBB3gÎ$ËøzóÞ{ïá¥,̘1ã믿vttÌÊÊŠŽŽ^°`AII BèwÞ©ªªª¯¯'ââÅ‹ãÇG577ÛÚÚÚÚÚ†„„œ8qB>ÎãÇÿãÿðóóãñxË–-+((ÉdÚ„„Z¸p!žãûï¿ÿàÁƒU«V‘¹+£££‡~æÌU“¨‰ P…ÎOEvvv>6lþëÉ“'e2YTT”|›gÏžñx<\ƱXìîîŽâp8è÷̤òeU´´´øúúâá$Iff¦@ 8zô¨µµu``à¥K—† bjj:|øp„ÐÒ¥K·nÝšýæ›oþío#ƒD=yò$55555•¬‹Å|>_›È§¢ 0@þ#'''õ“¨‰ P…Îê >~üxxx8™iùöíÛ m?~Œ—f¼>ÚÙÙu/¾yóæÅÇÇ=w²`Á‚ãÇ755Y[[;öÔ©S<7nÖÓÈ‘#³²²jjj âââŽ9Böcgg÷é§Ÿ#„‚hiiÁ9¢µ?Q~„ÇÕ¦såØðop€t^ÙçÎ+‘H’’’„B¡D")((Ø¿¿B›ˆˆˆÌÌÌ_~ùåÑ£G[¶l5j”–R8wîV3Y3fÌŽ;Š‹‹%Éýû÷·oߎoBï¼óŽP(<þ<^ÖBóçÏß³g£££Aø:÷âÅ RFF†P(¬««ûòË/—.]ªëÄÕ Mç”±êÑùÚÉår·mÛ¶gÏžåË—·µµ½õÖ[«V­š={¶|›Y³fµ¶¶&''Ëd²·ß~;66VËÎ×­[·bÅ ggg²ðÉ'Ÿp8œM›6Õ××ÛØØ¬[·7677 |üø1ù”¶|ùòmÛ¶8qÂÞÞ~ÅŠÖÖÖ¯¿þúÇœ““3{öl™L–œœÜÜÜìïï¿zõj]'®m:WŽM0E÷ñçŸnDþN@àëë;gÎC¢ÂÂÂÀ}l¬ïÙe2YEEEII ¹¬ÌÃXÕyõêÕeË–Í;?5Œ¤;.:jè(€ÞÅX¯@Ô ÐP'@_@}uôEñ×x†(¿Æÿ饬¬,CÅ(ƒ½/ýÈWиïè ¨ / N€¾€:úòÿGo´¢*jðIEND®B`‚glom-1.22.4/docs/libglom_reference/html/inherit_graph_16.png0000644000175000017500000000441612234777146025204 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“ÃIDATxœíœ}HSßÇÏu‹MS™+ËæÝÔ|¤ üCÌP Êуù–HP©°þ°L¥þˆðÒ¨TÌÇÂDñ‰™X„2š9™kΙ¨4SÏïÃ÷þ®÷ιlÖ½¯¿ÎÎ=çì³ÏûÞsÎÎ{ ƒÆà`ïXl «7³`õf\ò •JÕÕÕe¯PX¬X,ŽˆˆøÿkH¢ººÚ~±X…ÄÄD²Ä\z vÇþÏ””D©a×ofÁêÍ,X½™«7³`õf¬ÞÌb‹zÏÏÏß¼yS,óx<±Xœ‘‘155….aÖ××g¹€aØÌÌÌß2,°wºÈlEïµµµ“'OöööÖÕÕ©Tª¦¦&>Ÿi0,ß?ÀöJý| nFYY™‡‡Ç¹R¯×¯¬¬ ³¹\¾é @«ÕÚxØ-¿©Ó•˜˜H9_ÛÊó]YY™••µsçNr¥@ àp8ÄË••™L&‹wïÞššªÓéP=†aoÞ¼ÁqÜÅÅ%//¯ªªJ$¹ººfgg ***ȹ\áäääíí]ZZŠšÕÕÕyxxìÚµëÑ£G€¸¸8¡Pèèè\SSCŒÖÞÞ.‘HÊÊÊŠ‹‹}||„BaRRŠÇ`0\¿~}ïÞ½îîî?&‚Ç0¬¡¡ÁÇÇG $''ët: ÃîîîhÂ'†}ñâ%9Z­Ö–éúmÈâ›ù|»¹¹566nt)TTTäëëÛÓÓ£P(Ž=zæÌâªT*™™©««œ8q‚(ŽŽBËËËÇÆÆÈ…ýû÷çää¨Õêúúz‡ééiÀÙ³gggg«««¹\îÏŸ?¯^½:>>>==]ZZÊãñ z»ÈÈÈŽŽŽû÷ïûùùuww+•J©TŠîz™L&‘H::: ELL øï õôô FEE>}®¾‰a—––ˆÞÑÑ‘’’dËt™†þ|oEo.—ÛÙÙIŽ¡×ë‰àïïÿêÕ+ÔàË—/€?~ «mmmÂÕÕUJy£iM(>|ø•Ñ4èïï':jµÚ¹¹94=B Y¹ÚÚZá*++Qƒ©©)‡³¸¸èããSVV†*?}úDîõòåKT?00€‚§è†….--=þ<$$$66¶ººzyyÙ¾é"c™ù\$ “ã&v›“““¾¾¾¨Œ *• ½tvv888PÊQRRR\\ìååuùòåÁÁA4 â8Nî877'“É¢££E"Qff&¹»D"Œ_¸pÃ0 Ã<==WWWU*•Z­@͈9f@`` 9xʰ­­­^^^Ÿ?®ªªjkkKNNÞ±c‡}Óeš­ôŸÞëׯ_aaaþþþCCCééé€ÙÙYrƒôôt™LÖ××§T*3339HKK»sçNggçÈÈeTPP —ˇ††²²²ˆàéŠ}úUšcºƒõwÅ2'"DÞS÷GÛÌ?Oýsè>7 ÎÏÏߺuëðáÃÂ'OžÐ­k¢½ ç›ræjÂcŽ×h4õõõÈM‡æ™îäwÆ,sDKK‹——WAAF£±EfIXÆÿ¶”‘Ãá´··Ã ¬køŸÞ&œoŠÞ&<æ·oßB’›Í3Ýáz½é–9ñÑ&&&òòòpOKKëííµ^)XÆÿ¶Ä~M£Ñäçç'$$,,,µ®‰.&œo &7 yºîîî111†n]í7r¾)vµV«5ÓcFõæ˜î”Ý2G444¤¦¦vww[-—ÂúßÖb{Zæ¬ÿÍtXÿÛ2ü-“"û|3 VofÁêÍ,X½™«7³0²?§ÿIË_JOOOxx8¹fÝó-‹m‹ _÷ç©`ËG‹À®ß̂՛Y°z3‹ÿG‹ˆ/9îA¤IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1View__Composite.html0000644000175000017500000007244512234777147031001 0ustar00murraycmurrayc00000000000000 libglom-1.22: GlomBakery::View_Composite< T_Document > Class Template Reference
        GlomBakery::View_Composite< T_Document > Class Template Reference

        This View delegates to sub-views. More...

        Inheritance diagram for GlomBakery::View_Composite< T_Document >:
        Collaboration diagram for GlomBakery::View_Composite< T_Document >:

        Public Types

        typedef View< T_Document > type_view
         
        - Public Types inherited from GlomBakery::View< T_Document >
        typedef View< T_Document > type_self
         

        Public Member Functions

         View_Composite ()
         
        virtual ~View_Composite ()
         
        virtual void add_view (type_view* pView)
         
        virtual void remove_view (type_view* pView)
         
        virtual void set_document (T_Document* pDocument)
         
        virtual void load_from_document ()
         
        virtual void save_to_document ()
         
        - Public Member Functions inherited from GlomBakery::View< T_Document >
         View ()
         
        virtual ~View ()
         
        virtual T_Document* get_document ()
         
        virtual const T_Document* get_document () const
         
        virtual void set_modified (bool val=true)
         Just a convenience, instead of get_docuement()->set_modified(). More...
         
        - Public Member Functions inherited from GlomBakery::ViewBase
         ViewBase ()
         
        virtual ~ViewBase ()
         
        virtual void clipboard_copy ()
         
        virtual void clipboard_paste ()
         
        virtual void clipboard_clear ()
         

        Protected Types

        typedef std::vector< type_view* > type_vec_views
         

        Protected Attributes

        type_vec_views m_vecViews
         
        - Protected Attributes inherited from GlomBakery::View< T_Document >
        T_Document* m_pDocument
         

        Additional Inherited Members

        - Protected Member Functions inherited from GlomBakery::View< T_Document >
        void on_document_forget ()
         

        Detailed Description

        template<class T_Document>
        class GlomBakery::View_Composite< T_Document >

        This View delegates to sub-views.

        It is very simplistic - maybe your View should be more intelligent.

        Member Typedef Documentation

        template <class T_Document >
        typedef std::vector<type_view*> GlomBakery::View_Composite< T_Document >::type_vec_views
        protected
        template <class T_Document >
        typedef View<T_Document> GlomBakery::View_Composite< T_Document >::type_view

        Constructor & Destructor Documentation

        template <class T_Document >
        GlomBakery::View_Composite< T_Document >::View_Composite ( )
        inline
        template <class T_Document >
        virtual GlomBakery::View_Composite< T_Document >::~View_Composite ( )
        inlinevirtual

        Member Function Documentation

        template <class T_Document >
        virtual void GlomBakery::View_Composite< T_Document >::add_view ( type_view pView)
        inlinevirtual
        template <class T_Document >
        virtual void GlomBakery::View_Composite< T_Document >::load_from_document ( )
        inlinevirtual

        Reimplemented from GlomBakery::ViewBase.

        template <class T_Document >
        virtual void GlomBakery::View_Composite< T_Document >::remove_view ( type_view pView)
        inlinevirtual
        template <class T_Document >
        virtual void GlomBakery::View_Composite< T_Document >::save_to_document ( )
        inlinevirtual

        Reimplemented from GlomBakery::ViewBase.

        template <class T_Document >
        virtual void GlomBakery::View_Composite< T_Document >::set_document ( T_Document *  pDocument)
        inlinevirtual

        Reimplemented from GlomBakery::View< T_Document >.

        Member Data Documentation

        template <class T_Document >
        type_vec_views GlomBakery::View_Composite< T_Document >::m_vecViews
        protected

        The documentation for this class was generated from the following file:
        • libglom/document/bakery/view/view_composite.h
        glom-1.22.4/docs/libglom_reference/html/functions_func_0x67.html0000644000175000017500000011776512234777147026057 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - g -

        glom-1.22.4/docs/libglom_reference/html/functions_vars.html0000644000175000017500000002356712234777147025307 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Variables
         

        - m -

        - s -

        glom-1.22.4/docs/libglom_reference/html/functions_func_0x74.html0000644000175000017500000001126312234777147026037 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - t -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Line__coll__graph.png0000644000175000017500000001222512234777146032247 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥ÃläFÊbKGDÿÿÿ ½§“JIDATxœíkPWûÀÏ(ƒ†¯%$Š"^:Nm™‚ŠÆAS5yG@„ë0j뀭è€:à•©SŽ‚¼) ÈMë¥XðRKlµRlh"×D@löÿáÔu  `"žó><{öäœg÷ÇîÙì&9EQƒ ,C'€Ñ+Ø7Z`ßh}£öƒÓ§O:Ì8ãííÍTl<°¶þÆpøða’A|ûúúê%Ì+';;[£ßh}£öØ7Z`ßh¡£ïÎÎÎ;vSSS@ÔØØW!•JÇ/C@ Æ8v1ÆÖ‚hmmU›ã¾‹FÎ ïdžE­V¯Y³† ˆœœœ™3g655%%%¹»»WWW›ššŽ{Šííí0°²²*))Y¸p!ÀÒÒrÜ;B]|Ÿ8q¢¦¦F.—Oš4 `kk¿oß>cc]Z‡CÇl6›¹¨‚P*•666´} t9Ÿgddlݺʦáp8FFFôbTT”@ °±±ñ÷÷okkƒåAdffòù|KKË]»v:uŠÇãMž<9,,Œ®žžÎ †‚ ˆ«W¯N›6-44ÔÓÓ“Ëåš››»¸¸deeÑ ù|>—Ë=zô(,¬¨¨pss³°°pppHNN¦[»}ûöÀF‚ØÚÚ¶¶¶Z’——çààÀáp¼½½>|H—S7cÆ .—ëããCïæ&ÐíUyØ=6:Þ?§†ÃÊʪ  `¨µpŸ8pÀÑѱ¼¼\&“­X±ÂËË‹^+‹[[[srr«W¯¦ãššŠ¢ÒÒÒ 3Ðh™¹èîî~ýúõiÓ¦mÙ²¥¶¶¶¥¥%99ÙÔÔT¥RÁ "‘èŸþÉÍÍ566~öìEQ3gÎ onnÎÍÍe±X---°Ù9sæ ÕˆR©¤(JK…E‹ݹsçîÝ»|ðÁêÕ«éT92kÖ¬²²2¹\.‹é[ÙÌ ¡Û×RYûÓ‚···Æýs]|—––2÷;¤½½Þ''§ÔÔTX¡²²ðøñc¸¶¤¤„¢(’$5b¦ËAè;;;›¢¨ŽŽŽþþ~X(“Éè=8sæ Ý>,är¹‡†•ÛÛÛûûûa³Z– p+(Šúí·ß=‚m:;;gddÀUFFFÝÝÝÔ¾µTÖy ô­ËùœÇãUWW35Óç4õõõŽŽŽ0†ACC\d³Ù‹¥ëÀ´iÓQQQ</88˜YÁÞÞ^£ý„„„¸¸¸éÓ§òÉ'UUUô¤¥‘a+Ìš5 sçÎ477ÃÅÚÚÚ€€ø†ÂÞÞž$Iz' DKåqÜcº¼L"‘$$$À1‡Ã¹uë–F>Ÿ¯P(` §[ŠZ€›íáá¡P(WWW''§{÷î‚çgÔAY¸paDDÄ´iÓÞ{ï=Š¢ÌÌ̆m¾!ÔR!""âîÝ»•••Ÿ}ö™ý^1000**J*•Êåòàà`¡P8hJ°ýV+Ì“ûÇoŠ¢Ðv Nœ(ŒÌqu™Ÿbè\ô Šã÷™3R‚RiíÇO ‹¾AÎw}ý#©´Ž¢‹Eäçÿfètô r¾ o±$©ÎÉ©0t:ú9ßYY$©P¨¬lT(”†ÎH¯ å[&k©®n¡/QMLŒÎžýݰ)é´|ünbòâCÓ}}dVÖ¯ÌGÿ 䛢¨¬¬Š¾>’YXW×ö矚¶|ƒAÈ÷;õí…&&ÆgÎ t•Žïüüߘ'sH__vv:7PñM’êÜ\©ÆÉ¢T>‘Jïë=#ÀŠïòrE[[÷ «LLŒÐ¹ñ‚Šïsçn@¼õ–1ü311¢c’¤ ~‡oÊßx^É7x_C\\ì¿új-½¸oß¹ÿþ÷]gç_yéèè±¶f"5½‚âó1÷ebâ&‰d¡¡Ñ7¨œÏ1ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-Æô{eee‡ÇlôFc£%—ûÌܼÏЉŒ77·íÛ·ëüò1ßõõõp¢ù ‡½ý“‰(»¼¼¼¬¬l,-ŒÃï31§#żRàü¯cßh}£öØ7Z`ßh¡'ß;v즦¦ ((¨±ñßY‚J¥ãØ×¸7øö¨3úð­V«×¬YsóæÍœœœ†††sçΙ™™¹»»«T*=ôŽa¢ßG>qâDMM\.Ÿ4iÀÖÖ6>>~ß¾}ÆÆø×™ ‚P*•666#,MÐÇñ‘‘±uëV(›†Ã὘]¢¿¿?**J ØØØøûû·µµÁr‚ 233ù|¾¥¥å®]»N:Åãñ&OžFWHOOg¹}û¶§§'—Ë577wqq ¯]»–¾\^^nccóôéÓ¡rhmmeÆAlmmérz-]NQT\\ÜŒ3¸\®ÏÈ·èÕB8Ÿð°Õ¬¬¬ †Z ¨¨¨8pà€££cyy¹L&[±b…——½V,·¶¶Â·«W¯¦ãššŠ¢ÒÒÒ 3€ 2»˜3gΖ-[jkk[ZZ’““MMMU*Õ‰'ÜÜÜ`…mÛ¶}úé§ZrP*•±F!Ý#]~äÈ‘Y³f•••Éår±XLÏÓ;ìiÁÛÛ[c¾ßÑ¢ßÆÆÆ¥¥¥/º|N{{;õ|g999¥¦¦Â •••€Çõ%%%E‘$©kHe¶¯±ª£££¿¿Æ2™ *éèè033khh I’Çã]½zUK:øvvvÎÈÈ€…FFFÝÝݺmÍØ}ëã|Îãñª««™šé‹sšúúzGGGà¡¡.²Ùl‹ÅÒˆGNGGGTT”‡‡Ç †…S¦LñôôÌÍͽvíš±±ñÒ¥Kµä µµµAaooO’ä8n‘Î裉D’ÿ…çÖ­[uø|¾B¡€1 x<'<<< ÅÁƒïß¿éÒ%ºÜ××7''çôéÓ~~~AhÉ—£ÒÏãñòóóáQ¥V«ÛÛÛgÏž=^[¤3úðÝÜÜ,‹¥Risss^^^ll¬FM›6íÙ³§¢¢¢ºº:$$D,s8œ‘4žžž^[[Ë ]]]Ï!I²¯¯ÏÕÕÕÉÉéÞ½{€GÖ­['•J333ýýýµäÀápΞ=ÛÙÙ¹oß>f×ííš³×1Ë£¢¢¤R©\. …£Ùg¯Œ± #¿)Šzðà¿¿¿•••………X,†Gsüîíí ···çr¹~~~C c@ZZšFÀ¤¢¢¢  ÀÁÁÁÔÔÔÝÝýüùó"‘hîܹ°‰D2þ|•Ã?ü0uêTkkkxýË=<<ÌÌÌÚÚÚ4£Ë{{{#""ø|>›Í‰DôµØ°[¤…±ßcú|KVVÖ† ÆÒ‚ÁñòòruuŒŒ4t"#>ÿËнÞÓÓsóæÍŸ~ú) Àйèt}_¸pÁÓÓó믿ž>}º¡sÑøŽæY¿~ýúõë …¾A÷øFì-°o´@Ô÷ £¢¾¿ýö"šÊÇáú>ôP°¦Ný¿˜˜ÏUª†ÎdÔx{{ååcº¿ÖÐÐpãÆ±toîÝëøßÿÚúûÏ2t.£F ¸¹¹éürçÿ IÏË»ennZUµ÷­·ÐºÜøÝÝ­*,¼CQàéÓÞŸ~úÓÐéèä|_¾\ÕßOX,V^žæcø7ä|çæJá&I’?ÿ\ÕÙùÌÐé´|··w_¹òIªá"Iª/^¼kØ”ô Z¾/\¸«V¿X$"7wb|/d¼@ËwNŽ€ïGHR]Zú·RùÄ€)é„|·´<¾yS¡V¿ôþ“ ˆsçî*%ýƒïÂÂÛ,–æ­@Š¢rr* ’A@Èwvv…š9zP«Õ·o×××?2HJúßµµÊÊÊÆÁî%ÆÆ¬‚‚ßõŸ’A@Å÷¹swü¹N_™“ƒÊU:*wåò‡sç¾M/ÖÔ(§NÌf›ÂEcc£‡Ÿüç?–ÊN ø¼Àã}™˜¸I"YhèDô *çs ûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF‹—~¿e‚þ~½ì;w~}ö¬zøªÍßÇgN& çżIhÌ/;Èï3•””è?-Ì« &&F£ßh}£öØ7Z`ßh}£…޾{zzŽ;æëë»råJ__ßo¾ù¦µµ® …2™lü2ÿ_‡vA’¤P(|üøñ+íW—ßG¦(*<<œ ˆØØX;;»¶¶¶Â­[·¦§§›˜˜Œ{ŠˆÀb±"##-,,^m/:¼æâÅ‹MMMß|óͼyó8Ž££ã_|‘’’bdd4îù顎-=s‚ V®\ùª]|yyy™™™1 Ùl6‹õ¢5’$SRR|}}×­[·wïÞÎÎNX. ‹‹‹}||Ö¬YsüøñŸþÙÛÛ{íÚµ t…¢¢"f0¹\&‘HD"ÑæÍ›¯\¹ˆˆˆÈÎΆªªªÖ­[§R©†ÊVc¡PðòòÒPË,§(êäÉ“7n”H$111#ߢ‘C'& oܸáãã#‘HΜ9ª÷Ñ¢‹o¹\îè訽ÎéÓ§‹‹‹cccããã=ztðàAzÕåË—SRR"""Nž>¾¯¯OKï£Bß===Ìý"|NWW]xáÂ…M›6Í›7Ï燆†þòË/===p•¯¯ïäÉ“—.] ðóó£cø?»råJ;;;f0cÇŽmÛ¶íí·ß¶²²Z°`A___ww÷’%KþþûïÖÖVŠ¢®\¹âéé©%8{öìæÍ›y<^XXØõë×U*ÕH¶H7$ ‡ÃY²d I’===Zzº\¯Y[[×××ÏŸ?.ªT*yÈ>|Èãñ` ¥R9}út€¹¹9x>K<39]]]'Ož¬¬¬llläóù°pÒ¤I‹-ºvíÚÌ™3ŒŒÞyç-9è@KKËÞ½{÷îÝK—(•JØûØ·h 666Ìv´ô>*tñ½xñâ³gÏ®Zµ Øl6û?þШckkÛÔÔOÈð´fmm­C_ƒêìì¼eË'''Š¢V­ZË—/_þã?ÖÕÕ­X±‚ -9ÀY<”JåÈ;µ¶¶þüóÏ/^ _ÞÝÝÍf³Çk‹¢ñ3^½ër> lkkÛµk—L&kkk»~ýzjjªF‘H”––ö×_544|÷Ýwnnn#̯¨¨º¡ÀÓ§O»ž£V«I’„g麺ºýû÷ž°ü£> Ò>àMò}óæÍ¸¸¸ÀÀÀ©S§:—quu}ÝN–oŽoCgñºƒŸ‡¢öØ7Z`ßh1ÈõÚÀ©c&(UUUË–-c–¼ä[ h<öÀLh–-[öÒ—ÇÿYðøØ7Z`ßh}£öÿ[/ÑÅU†qIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__WithFormatting.html0000644000175000017500000014735212234777147032031 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_WithFormatting Class Reference
        Glom::LayoutItem_WithFormatting Class Reference

        A base class for all layout items that may have formatting options. More...

        Inheritance diagram for Glom::LayoutItem_WithFormatting:
        Collaboration diagram for Glom::LayoutItem_WithFormatting:

        Public Member Functions

         LayoutItem_WithFormatting ()
         
         LayoutItem_WithFormatting (const LayoutItem_WithFormatting& src)
         
        LayoutItem_WithFormattingoperator= (const LayoutItem_WithFormatting& src)
         
        virtual ~LayoutItem_WithFormatting ()
         
        bool operator== (const LayoutItem_WithFormatting& src) const
         
        virtual const Formattingget_formatting_used () const
         Get the field formatting used by this layout item, which may be either custom field formatting or the default field formatting. More...
         
        virtual
        Formatting::HorizontalAlignment 
        get_formatting_used_horizontal_alignment (bool for_details_view=false) const
         Get the alignment for the formatting used (see get_formatting_used()), choosing an appropriate alignment if it is set to HORIZONTAL_ALIGNMENT_AUTO. More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        virtual LayoutItemclone () const =0
         Create a new copied instance. More...
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        virtual Glib::ustring get_part_type_name () const =0
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Public Attributes

        Formatting m_formatting
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        A base class for all layout items that may have formatting options.

        See get_formatting_used().

        Constructor & Destructor Documentation

        Glom::LayoutItem_WithFormatting::LayoutItem_WithFormatting ( )
        Glom::LayoutItem_WithFormatting::LayoutItem_WithFormatting ( const LayoutItem_WithFormatting src)
        virtual Glom::LayoutItem_WithFormatting::~LayoutItem_WithFormatting ( )
        virtual

        Member Function Documentation

        virtual const Formatting& Glom::LayoutItem_WithFormatting::get_formatting_used ( ) const
        virtual

        Get the field formatting used by this layout item, which may be either custom field formatting or the default field formatting.

        Reimplemented in Glom::LayoutItem_Field.

        virtual Formatting::HorizontalAlignment Glom::LayoutItem_WithFormatting::get_formatting_used_horizontal_alignment ( bool  for_details_view = false) const
        virtual

        Get the alignment for the formatting used (see get_formatting_used()), choosing an appropriate alignment if it is set to HORIZONTAL_ALIGNMENT_AUTO.

        Note that this never returns HORIZONTAL_ALIGNMENT_AUTO.

        Reimplemented in Glom::LayoutItem_Field.

        LayoutItem_WithFormatting& Glom::LayoutItem_WithFormatting::operator= ( const LayoutItem_WithFormatting src)
        bool Glom::LayoutItem_WithFormatting::operator== ( const LayoutItem_WithFormatting src) const

        Member Data Documentation

        Formatting Glom::LayoutItem_WithFormatting::m_formatting

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_withformatting.h
        glom-1.22.4/docs/libglom_reference/html/namespacemembers_type.html0000644000175000017500000000732012234777147026601 0ustar00murraycmurrayc00000000000000 libglom-1.22: Namespace Members
         
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1TranslatableItem.html0000644000175000017500000014460212234777147027776 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::TranslatableItem Class Reference

        TranslatableItem have a map of translation strings - one string for each locale. More...

        Inheritance diagram for Glom::TranslatableItem:

        Public Types

        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         

        Public Member Functions

         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Static Public Member Functions

        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         

        Protected Attributes

        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        TranslatableItem have a map of translation strings - one string for each locale.

        Member Typedef Documentation

        Member Enumeration Documentation

        Enumerator
        TRANSLATABLE_TYPE_INVALID 
        TRANSLATABLE_TYPE_FIELD 
        TRANSLATABLE_TYPE_RELATIONSHIP 
        TRANSLATABLE_TYPE_LAYOUT_ITEM 
        TRANSLATABLE_TYPE_CUSTOM_TITLE 
        TRANSLATABLE_TYPE_PRINT_LAYOUT 
        TRANSLATABLE_TYPE_REPORT 
        TRANSLATABLE_TYPE_TABLE 
        TRANSLATABLE_TYPE_BUTTON 
        TRANSLATABLE_TYPE_TEXTOBJECT 
        TRANSLATABLE_TYPE_IMAGEOBJECT 
        TRANSLATABLE_TYPE_CHOICEVALUE 
        TRANSLATABLE_TYPE_DATABASE_TITLE 

        Constructor & Destructor Documentation

        Glom::TranslatableItem::TranslatableItem ( )
        Glom::TranslatableItem::TranslatableItem ( const TranslatableItem src)
        virtual Glom::TranslatableItem::~TranslatableItem ( )
        virtual

        Member Function Documentation

        void Glom::TranslatableItem::clear_title_in_all_locales ( )

        Clear the original title and any translations of the title.

        bool Glom::TranslatableItem::get_has_translations ( ) const
        virtual Glib::ustring Glom::TranslatableItem::get_name ( ) const
        virtual

        Get the non-translated identifier name.

        Reimplemented in Glom::Field, and Glom::LayoutItem_Field.

        bool Glom::TranslatableItem::get_name_not_empty ( ) const
        virtual Glib::ustring Glom::TranslatableItem::get_title ( const Glib::ustring locale) const
        virtual

        Get the title's translation for the specified locale, falling back to the original text if there is no translation.

        See also get_title_translation() and get_title_original(), which (optionally) do not use fallbacks.

        Parameters
        localeThe locale whose title text should be returned. If this is empty then the original text will be returned.
        Returns
        The text of the title.

        Reimplemented in Glom::LayoutItem_Field, Glom::LayoutItem_FieldSummary, and Glom::LayoutItem_Portal.

        virtual Glib::ustring Glom::TranslatableItem::get_title_or_name ( const Glib::ustring locale) const
        virtual
        virtual Glib::ustring Glom::TranslatableItem::get_title_original ( ) const
        virtual

        Get the title's original (non-translated, usually English) text.

        Reimplemented in Glom::ChoiceValue.

        Glib::ustring Glom::TranslatableItem::get_title_translation ( const Glib::ustring locale,
        bool  fallback = true 
        ) const

        Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original.

        Calling this with the current locale is the same as calling get_title_original().

        enumTranslatableItemType Glom::TranslatableItem::get_translatable_item_type ( ) const
        static Glib::ustring Glom::TranslatableItem::get_translatable_type_name ( enumTranslatableItemType  item_type)
        static
        static Glib::ustring Glom::TranslatableItem::get_translatable_type_name_nontranslated ( enumTranslatableItemType  item_type)
        static

        The non-translated name is used for the context in gettext .po files.

        TranslatableItem& Glom::TranslatableItem::operator= ( const TranslatableItem src)
        bool Glom::TranslatableItem::operator== ( const TranslatableItem src) const
        virtual void Glom::TranslatableItem::set_name ( const Glib::ustring name)
        virtual

        Set the non-translated identifier name.

        Reimplemented in Glom::Field, and Glom::LayoutItem_Field.

        void Glom::TranslatableItem::set_title ( const Glib::ustring title,
        const Glib::ustring locale 
        )

        Set the title's translation for the specified locale.

        Parameters
        titleThe text of the title.
        localeThe locale whose title text should be set. If this is empty then the original text will be set.
        void Glom::TranslatableItem::set_title_original ( const Glib::ustring title)

        Set the title's original (non-translated, usually English) text.

        This is the same as calling set_title() with an empty locale parameter.

        Member Data Documentation

        enumTranslatableItemType Glom::TranslatableItem::m_translatable_item_type
        protected

        The documentation for this class was generated from the following file:
        • libglom/data_structure/translatable_item.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1HasTitleSingular.html0000644000175000017500000005237612234777147027773 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::HasTitleSingular Class Reference
        Glom::HasTitleSingular Class Reference

        HasTitleSingular instances may have a (translated) singular form of their title. More...

        Inheritance diagram for Glom::HasTitleSingular:
        Collaboration diagram for Glom::HasTitleSingular:

        Public Member Functions

         HasTitleSingular ()
         
         HasTitleSingular (const HasTitleSingular& src)
         
        virtual ~HasTitleSingular ()
         
        HasTitleSingularoperator= (const HasTitleSingular& src)
         
        bool operator== (const HasTitleSingular& src) const
         
        bool operator!= (const HasTitleSingular& src) const
         
        Glib::ustring get_title_singular (const Glib::ustring& locale) const
         Get the (translation of the) singular form of the title, in the current locale, if specified. More...
         
        Glib::ustring get_title_singular_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_singular_with_fallback (const Glib::ustring& locale) const
         Get the (translation of the) singular form of the title, in the current locale, if specified, falling back to the non-singular title, and then falling back to the table name. More...
         
        void set_title_singular (const Glib::ustring& title, const Glib::ustring& locale)
         Set the singular title's translation for the current locale. More...
         

        Public Attributes

        sharedptr< TranslatableItemm_title_singular
         For instance, "Customer" if the table is titled "Customers". More...
         

        Detailed Description

        HasTitleSingular instances may have a (translated) singular form of their title.

        For instance, "Album" instead of "Albums". This is useful in some generated UI strings.

        Constructor & Destructor Documentation

        Glom::HasTitleSingular::HasTitleSingular ( )
        Glom::HasTitleSingular::HasTitleSingular ( const HasTitleSingular src)
        virtual Glom::HasTitleSingular::~HasTitleSingular ( )
        virtual

        Member Function Documentation

        Glib::ustring Glom::HasTitleSingular::get_title_singular ( const Glib::ustring locale) const

        Get the (translation of the) singular form of the title, in the current locale, if specified.

        Glib::ustring Glom::HasTitleSingular::get_title_singular_original ( ) const

        Get the title's original (non-translated, usually English) text.

        Glib::ustring Glom::HasTitleSingular::get_title_singular_with_fallback ( const Glib::ustring locale) const

        Get the (translation of the) singular form of the title, in the current locale, if specified, falling back to the non-singular title, and then falling back to the table name.

        HasTitleSingular& Glom::HasTitleSingular::operator= ( const HasTitleSingular src)
        bool Glom::HasTitleSingular::operator== ( const HasTitleSingular src) const
        void Glom::HasTitleSingular::set_title_singular ( const Glib::ustring title,
        const Glib::ustring locale 
        )

        Set the singular title's translation for the current locale.

        Member Data Documentation

        sharedptr<TranslatableItem> Glom::HasTitleSingular::m_title_singular

        For instance, "Customer" if the table is titled "Customers".

        This is useful in some UI strings.


        The documentation for this class was generated from the following file:
        • libglom/data_structure/has_title_singular.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__WithFormatting__inherit__graph.png0000644000175000017500000003412312234777146035040 0ustar00murraycmurrayc00000000000000‰PNG  IHDR]%¬8bKGDÿÿÿ ½§“ IDATxœíÝiXçÞðg’  €@k*"î¨ÕJ *-jó"­€µZôÔ×¶j{¹aO­Z½êulßcµ‹ËA5,ŠxêÖÖµ0Ѻp¤ › "‚( dÞc§i€pÂ$pÿ.?<™ 3ÿYœ;yf2CÑ4Mž›€ï “@¢7(À $ p‰Üñ]t6Eñ]p W„‚(À½?üÐÛÛ›ï*€ééé_}õßU€Ù@¢÷¼½½CCCù®¸DÃá< p‰Ü@¢7(À $ p‰ü¨©©ùè£\]]---]]]çÏŸ_RR¼EQ”R©äp^TK8œÅsN¢¨ŠŠŠ6M“óUÀ \= <Ðh4Ó¦M£(*))iÀ€wïÞýþûï}||rss---9Ÿ]UUÓppp8sæÌèÑ£ !¶¶¶œÏ ‹C¢bbbòóóóòòzôèAqvvÞ¾}ûÆE"£ìööölÛÆÆFûe (ª¼¼ÜÉÉÉL§`8ôzâãã/^ÌÄ ËÞÞ^(²/U*Utt´«««““SXXXee%3œ¢¨ƒJ¥R[[ÛU«V8p@"‘ØÙÙ-_¾œ!..N»ÑŠ¢Î;×·oß÷ßßßß_,[[[1"!!áèÑ£R©T,ýõ×Ì@…Báííݽ{÷þýûïÚµ‹Ú•+WšO„¹'³³sEEE‹#0:Ô¿{{ûàààû÷ï³ÃišÞ¼y³›››X, aW‚ö"°Óomäg®1ÎМ"„Èårýã888¤¦¦ê™‚B¡Ø´i“»»{FFFNNÎäÉ“ƒ‚‚Øwe2YEEERR!dêÔ©l;??Ÿ¦éØØØ‚‚í†Î”µ_úøø\¸p¡oß¾‹-*,,¼wïÞ®]»,--˜ÊÊÊ’““E"Ñ“'Ohš0`ÀŠ+JKK“““Á½{÷˜É<¸µ‰”——Ó4­g„±cÇ^½zõúõ민òÊÔ©SÙR·mÛ6pàÀôôô¼¼<™LÜ|AØéëYÿÓC.—ã(†Ã¾3$QD"QZZšöŸ0ªªªè?—{÷îeFÈÊÊ"„<|øy÷Ì™34M«Õj¶vZ´V›N¢$&&Ò4]]]­R©˜999ì1šrøðavúÌ@±Xüå—_2#WUU©T*f²z&Â4ôŒÀ,MÓ—/_&„úÈÕÕÕÒÒÒÕÕuþüù%%%Ì[E)•JçÅùMpŽÆ€D3 Ñh¦M›–™™™””T\\üŸÿüÇÊÊÊÇǧ¡¡ïÒàO"¾ x¶˜˜˜üüü¼¼¼=zBœ·oß¾qãF‘ÈŒw`Š¢ÊËËœœ `úðÌ@||üâÅ‹™8aÙÛÛ …Bö¥J¥ŠŽŽvuuurr «¬¬d†SuðàA©Tjkk»jÕªH$;;»åË—³#ÄÅÅi7š»r势¿¿X,¶¶¶1bDBB!ä7ÞØºu+3BFF†““S}}}k5TTTh·)Š"„8;;³ÃÙwÙá4MoÞ¼ÙÍÍM,‡„„¾D¼¡xE‘ËåúÇqppHMMÕ3…B±iÓ&ww÷ŒŒŒœœœÉ“'±ïÊd²ŠŠŠ¤¤$BÈÔ©SÙv~~>MÓ±±±Ú f‚Ú³ø`áÂ…zj(//×ië dçÈß¶mÛÀÓÓÓóòòd2Ypp°K¤‡\.Çÿz0ì[À3CE$¥¥¥iÿ £ªªŠþãpìáá±wï^f„¬¬,BÈÇ™wÏœ9CÓ´Z­ÖiëĆöôuÞª®®V©TL;''‡9èWWW[YY«Õj‰DrîÜ9=5´#Q† Ï ,)) …µµµí["Œ ½^`$Inn.û²ªªŠ½Ð‹uçÎwww¦Í4Š‹‹™—666„@ Ó6\uuutt´¯¯¯D"‰ŠŠböìÙÓßß?99ùüùó"‘hâĉzjh‡ÂÂÂððpŠ¢(ŠrqqQ«Õ.€1`/3¸cÇæc8!ÄÞÞþÒ¥K:ãH¥Ò‚‚¦Í4$ WøúúlÙ²¥¨¨èäÉ“ìðÐÐФ¤$¹\>kÖ,Š¢ôÔ@Ó4icÀH$’””棟F£©ªª4hWK` H0k×®---•ÉdJ¥²´´ôСCëÖ­ÓgΜ9ëׯW(¹¹¹K–,‘Édööö†L<..®°°P»AyüøqõÔjuSS“———‡‡Gvvvdd$!äÁƒ„éÓ§+•ʃ†……é©ÁÞÞþÈ‘#5557nÔžuUUU‹%1Ã###£££•Je^^^TT”ŸŸ_[Öxís0è< MÓ·oß sppèÞ½»L&c¾hŸGill\±b…‹‹‹X,ž5kVk§(š· !±±±: m …"55µÿþ–––>>>ÇŽ 2d3ÀÀÀáÇ3íÖjØ·o_ïÞ½™kɘι¾VVV•••:…±ÃW®\)•JmllسîÏ\"=pŒ ÏGž™ûóQ‚‚‚¼¼¼V¯^Íw!ÁóQÀ¨ÐëÐNuuu™™™§N 结€Dh§ãÇûûûòÉ'ýúõ㻓`Æ7±à׌3f̘Áw&ßQ€Hà¸Dh†Öhp .À_ QÚã—_rÓÒnò]€iÁ/gÌAÌNÏžþ„‡â»öÀÿz0\= u꿵µ |W`*(msòd–J¥aÚ*•úĉëüÖ`:(m“œ¬žž§(*9YÉo=¦‰Ðù%W­~úE­Ö\¸póÁƒZ~«0H€68vì!º— ÿðÃU^Š05H€6HJRèÜ|E£¡“’pÅ!HÃW]ºtKçç4M+•·JK«ùª Àt Q uôè¡°…ÿ2B¡àÈ‘+_€©A¢*1Q¡V«›W«5ø©#A¢¨°°ü÷ßK[¼Å"MÓÙÙw‹Š*:¼(Ó‚ûzäÒ¥[ƹh4O¯.+«!„ôîmǼ—.õïïÄ[}&w³h… ÷B¾ûnß…˜ôz7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À ß@GKHHໄΠ®®œ`er$44”ï€MÓ|׊¢(¾Kø …: |GéŠþñ¼úê«|W@Ξ=»nÝ:¾«Îà< p‰Ü@¢7(À $ p‰Ü@¢@Ëêêê¾ùæ›ÐÐÐ×^{-44ô‹/¾¨¨¨`ÞòóóËÉÉáp^œO÷9Î;wÏž=ìËÕ«WôÑGìË„……©Õj??¿‡6¯­Å::xBZ+€…ߣ@ hš^±bEQëÖ­ëÓ§OeeåÑ£G/^gaaÁwuf`Ô¨Q7nÜ`Ú*•êÊ•+*•ª¡¡ÁÒÒ’’=jÔ(@°zõêîÝ»8Í/¿üràÀìKÃÿ+m-º |Gœ8qâîÝ»_|ñÅСCíííÝÝÝ?üðÃÝ»w …B¾Kk¿Ö>_ãs÷¨Q£~ÿýwæ§àYYYb±¸W¯^W®\aÞ½qãÆÈ‘#)Šzíµ×˜„6¤kkk-ÿój×öµ hZðã?YYYiÔ9Š©ÕêÝ»w‡††NŸ>}Æ 555Ìp??¿Ó§O‡„„L›6mçÎ?ÿüsppðo¼±cÇv„üQ»Ñ\^^ÞòåËæÍ›wöìYBÈÊ•+™nܸ1}úô†††ÖjÐ9 úùùB‚‚‚tÜÚÃišÞ¿ÿÛo¿øé§Ÿ¾DÍ5ª¶¶ööíÛ„…BñÒK/7îâÅ‹„ŠŠŠÊÊÊ‘#Gê©íܹso½õV```rr2;ÍúúúÇÐh4ú7ÁÕ«WgΜyüøqýÅ·¸žµëÑ©]±~~~¿þúkHHH``àáÇ !*•jÇŽo¾ùfppð?üðúë¯w|¿ð‰-ÈËËsww×?Ž\.?}úôºuë¶oßþàÁƒ-[¶°oýôÓO»wï^¹råþýûüñÇ={ö¬X±"11±´´”²zõê#Fh7šûì³Ï¤Ré÷ßðàÁÏ?ÿ\¥Rùùù;wŽáôéÓ“&MJNNn­gΜ!„¤¤¤ôìÙ³µá)))ÇŽ[»ví·ß~ÛØØ¸uëV—¨9GGG¦ã‹I///&Q²³³™wõÔ¦T*÷îÝ»lÙ²o¾ù¦©©‰¸téÒÿùÃÍ›7õo‚;wFGGOž‚0T !Gµ±±aÚÇŸ3gÎСC !ï¿ÿþ¼yóêêê˜NöÐÐP;;»‰'Bf͚ŶkjjúôéóÚk¯1S`Í}óÍ7ÖÖÖÌW¢‘#G655ÕÖÖN˜0aëÖ­ŽŽŽgÏžýä“O¶lÙÒZ ípäÈ‘yóæ 6Œ²|ùòÐÐPö̇þ%jqj#G޼qㆷ·waaá˜1cAYYYiiivv¶§§§þJfÏžmkk;iÒ¤uëÖ±ÛâÛo¿ó3N óA¢€ÙÈÌÌܼysdd¤ö…Lüòòòb~±ÿøÇ?¶mÛLÓôˆ#´ïc]̆¯¯¯¯¯/ßU@ËÜÜÜ´ ]ÎÌ7(À $ p‰Ðeeµeeµ|W`Zð{”.‡¢¨aÆ1wŽ2w4-P«4-T«PëŸ@­Bï c̺²òB(GÇ–ï=ü»/„…}ßÐФVëûRBQ”µµÅ•+ŸÙØX£ €6Áy0‰}@€§……¾' …//·üÈxqBIM½ba!´°¦¦^1Ò,¼¼œ8±ÌÉÉF$Ò÷ŸT$DDx#NÀD QÀœÌ›7¾©©Õ‡R5mÚÈýûõèaÄ#¬FCË囚ÔMMê„„‹ÏüÎÔnö:qbYÿþNzBE¥ÒÌ;ÁH´ÌÉøñR©¸•Û¤S‹½úí·‘ú¿Ä<¿ÌÌ‚ÊÊÇL»¼üÑŋƛWïÞ=ý`ÄW¡°……‰~~Cú÷w2^m‚DóP]]·}ûÏ'nzò¤Q øK¢P¡(ê³Ï‚Ö® ì€gr¤¤\‰žß-,„))—:»ž=»'%½7~¼»@ ä/߇T*ÍõëÅk×¾}»Ò¨5gæÁÔåçßß·ïW¹üb}}c@ÀˆqQQ1 O/²(Š¢¾úêí3^ê€bššÔÇG?~ü„bgguýúc1jjRÿïÿÆýðÃU¶“¢¨¾}Å3gzíÛ÷keåãiÓF.X0iìØv>€H0QOž4%%)ãâÒ¯]»Ó¯Ÿãüù¾¡¡ãìì¬ !Ë–É““MMj@`e%Љ™?aÂ Ž©ê§ŸnDFîúëw*6vÁßþfôK`išþôÓ”;/0s6¼5wîx†NK»¹k×ùŸ~º1`€óœ9ãÃÂ^éÞ½›±ëh‰&çÎûöý*—gVW×M:2"Â{üx힮˗oÉd_ …‚=,ãã£ÆŽíßaµ-^{ôèU•êÏ«D"a`à诿Žè€¹Ó4½qãvì8Ma.¶µµbß-((ÿ÷¿9p C$„„xEEMruw@U,$ ˜ µZsìØµ¸¸ô´´›=æÎîý =[ÙßKUU­\þÞÀ½:¬ÂººÆáÃ×°n,kk‹¬¬ ÖÖôµà›oÎlØptÞ¼ 6¼ÕüÝGžÈåwîÚ½<ø…ùó}Mÿ\£+' £¼üQBÂÅ={~©¨x4eŠç»ïú¾ôºÂº:$ ´Œ}ìÕÇõæu®ŽDa0]a;wžW* GŽt?bPÐc?#LþBû±W/¼ÐsÞ¼ ÁÁãz÷¶ã».“ƒDÑqíÚ]»Î9ò›ƒC÷¯ &vðÓkÀ Qà)ö±W·nUv¦p ¥E÷ï?JL¼¸{÷…ÊÊÇS¦xFE½:vl?¾‹‚ŽƒD?{emÝ-"¢³Ý€ËH(z0]aßîÒ¥"t…u)H”®Kû±WÆIæÎðæ›czô°ä».ó€D1Û&÷ˆˆðž7o¢Xl7ü‡öA¢tEìc¯;ÿ ¸Œ‰b¸û÷ÅÆ¦ÅĤ=zô$0pô¢E~ÆIø. Œ‰Ò…h?öÊÅÅ!2ÒgæÌ—œlø®Ë,!QÚª±QuòdÖ÷ߟ½téÓöæ›cE"œ¨ëT(]ûØ«ŠŠG]í\F‚Di7t…ubH”NŽ}ì•­­ÕÛo¿þJÿþN|Õ QžSYYM\ܯÿþ÷/7Žþûßý†EW˜ÙC¢tNÚ½êâ7à2$ 'UGŽüöÝwgoܸ;nœÛ‚¾S§ŽDW˜ùB¢t6ìc¯ÔjÍ[oÅYw#A¢p‹é KI¹ìèhñÊ;ïLtp@W˜ùA¢tÚ÷…4è… |_´³Ã ¸Œ‰b eeãâÒ÷ìù¥®®áþgôßÿ>yèÐ>|m€D1{ìc¯<¨:udD„÷„ …³îÆ…D1¦+ìÛoÏfg£+ÌÌ cÝ\i?öªW/»wßüî¤@·n¢q!!ã.^,ؽûÂâű..ÞááÞööÝù®ôÁwóÃ>öª°°bˆï)Szô¨T*‹Å_ýµþ2:vnwžêêjµZ­]Okób444|øá‡½{÷vvvþ׿þ¥.¼ÀÂÉÒ\‹³øöÛoÇŒ£R©!Ë–-›5kVkÕ¶a6,æþ+ϼ9ƒƒCjjªž[÷(ŠM›6¹»»gddäääLž<9((ˆ}W&“UTT$%%B¦NʶóóóišŽ-((Ðn0ÔžÅàÁƒ-ZTXXxïÞ½]»vYZZ644ÄÄÄx{{3#|ðÁ .ÔSCyy¹N[g ;Gvø¶mÛ˜žžž——'“É‚ƒƒ \¢ÖÖ’6@ðóÏ?^ÓÖ³€eeeÉÉÉ"‘èÉ“'­nKš¦ ÞîÏD‘ËåúÇÁÎÃùΣ3;=óR(ÑÑÑ}ûö½páBNNΤI“´+×{ˆyí!:«‹i·8 Fãçç·iÓ¦‹/º¸¸TVVêT«G‹{E{E$¥¥¥iͨªªb—ÁÃÃcïÞ½ÌYYY„‡2ïž9s†¦i惕v[g»¶¸RÕÕÕ*•Šiçää0Ë_]]meeU\\¬V«%ɹsçôÔÐŽM>lذøøxf`II‰P(¬­­mßéÌ¢¦¦æ½÷Þ“H$ÌBž(zððáÃlÏÜ9:òx‡ÛGgxyy¹žy) 77·Ý»w3ï^½zÕ{Èóï!-.]k³ÈÏÏwtt4hÐÑ£GuªÒ¯Å½¢=½^‰$77W{K³Wb°îܹãîîδ™Fqq1ó񮮠"tÚ†«®®ŽŽŽöõõ•H$QQQÌÀž={úûû'''Ÿ?^$Mœ8QO íPXXÎ\5áââ¢V«¹Z"[[Ûõë×ß½{W{­BϺ¸¸´µŒŽ‡Û§Mó"„”––2«„¶aR°‡iim ˜:ujSSÓ´iÓÚ]?«=•îØ±ƒí½µ··¿té’Î8R©´  €i3 ‰Dòuþ…¯¯oAAÁ–-[ŠŠŠNž<É MJJ’ËåLo ž˜nÓ ‘HRRR˜Öh4UUUþ‡dú1™ÝÅðòô, É>;ç;O›æ%•JÙãu^^ž‘jxØCŒ´‡´6 ¥RyöìYGGÇmÛ¶=ÿ\Ú“(k×®---•ÉdJ¥²´´ôСCëÖ­ÓgΜ9ëׯW(¹¹¹K–,‘ÉdÌ…ÏWXX¨Ý ÍÎC655yyyyxxdggGFFB}ºR©EQ^^Î|Ò°‡@s-oÊæ¿X®éùñÄ÷t(±ø-±øM¾«èPØC 9MLa3´UYÙÃ1cÖQ¹|y]¯^fÿ ^®à< @›;v]  (Š:vìßµ˜$ @›%$dÒ4­ÑÐry&ßµ˜$ @ÛU\½Z¬ÑÐ4­¹v­øöíÊgÿ @×€Dh›ÔÔ+BB!”H$8rä7ž 0H€¶9x0S¥zú„A•J“˜¨à·ÓDhƒììÒ¢¢ öIš¦óòîÿþ{)¯E˜ $ @¤¤\þ£Ëë©nÝ„))—ùªÀ¤ Q EÓtBÂŦ&µöÀÆFuR’¿ë HÃ]¾|«¬¬¦ùð»w«/_¾Ýñõ˜$ €¡Öíòb ã €D0ˆJ¥9tH©ÓåÅhlT:¤T«5_€IA¢$##¿ººÞÂBЭ›¨[7Q·nÂnÝ„LÛÂBPUU—‘QÀw<ë<Ï™0* áš52öå¡C—!o½5–"áótu¸÷0@{,\¸—òÝwsø.À„àSp‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü@¢7(À $ p‰Ü hšæ»àAzzúÖ­[ù®ÂŒ=x`M‹ëù.ÄŒ-[¶ÌÛÛ›ï*€KøŽÒEݹs'))‰ï*̘X\8yIIIwîÜá» à˜ˆï€O‰‰‰|—]EQ|—ÜÃwà¸Dn Q€Hàž¡¦¦æ£>ruuµ´´tuu?~II óEQJ¥’Ãyq>AS˜#ÕŒR©T©TEUTT´©0öOêëë׬YãîîneeÕ»wo™L–‘‘aÔ¥0®}4Í´iÓ(ŠJJJ0`ÀÝ»w¿ÿþ{ŸÜÜ\KKK¾«3gΜ=z4ûÒÖÖV ÄÆÆÚÚÚ¶o‚ï¿ÿ~zzúž={†úðáÄ„„É“'ß»wÏÎÎŽ£’Ú‰úÄÄÄäçççååõèуâìì¼}ûö7ŠDf¼çPU^^îäädàðçgcccoo¯30""¢ÝLNNÞ¿ÿ¤I“!½zõZ³fÍâÅ‹™mÀ#ôz>ñññÍUöööB¡}©R©¢££]]]œœÂÂÂ*++™áE•k·ubC{ú:oUWW«T*¦““Ã"«««­¬¬Š‹‹ÕjµD"9wÚ‘(Æ ‹g–””…ÂÚÚÚö-Q‹ ¥=;=óR(nnn»wïfÞ½zõªvåiiiK—.õôô¤(j̘1§NÒY EÖ_¹þZÜ Ì_%&&2›Ig‹´¶6´‰Òù × ô‘H$¹¹¹ì˪ª*öB/Ö;wÜÝÝ™6Ó(..f^ÚØØBNÛpÕÕÕÑÑѾ¾¾‰$**ŠسgOÿäääóçÏ‹D¢‰'ê©¡ ÃÃÙë²\\\Ôj5‡Kdø¼!¥¥¥ƒ bÚlƒòðá×_~yëÖ­×®]+))yå•W¦OŸ®Óc¦ã™•ë¡Å­ÀèÛ·/ii‹´w}€yC¢€>;vì`»þííí/]º¤3ŽT*-((`ÚLC"‘pU€¯¯oAAÁ–-[ŠŠŠNž<É MJJ’Ëå³fÍ¢(JO 4M“6ŒD"IIIa>si4šªª*í£9·ôÏK*•²‰ž——Ç:tè?üÀ´ûôé³iÓ¦úúú0CÚ±Èúµ¶ˆVêèl®f æ‰ú¬]»¶´´T&“)•ÊÒÒÒC‡­[·Ngœ9sæ¬_¿^¡Päææ.Y²D&“5¿®©Eqqq………Ú Òì$vSS“———‡‡Gvvvdd$!„9nNŸ>]©Tœi·Vþ}ûz÷îíèèÈ\KÆ ÷õõµ²²ª¬¬Ô)ŒÞØØ¸råJ©TjccÀžu浨µw™zôÏ«¡¡aéҥ̵^ûöíc¡¾¾~õêÕýû÷·°°J¥eeezÙm¡g„Ö¶‚΢io‘g"8ÒáŽ]TBBÂÌ™3Ízëyyy­^½šïBà©6mŠ¢äryhh¨±«‚Ž„^/0?uuu™™™§N ç»–§Nœ8Ñün+EEGGó]ZG0Á-¼0ã_>C—uüøñ¹sç~òÉ'ýúõã»–§¦L™bÖ_øž“ nàÌÏŒ3f̘Áwð'l` × ¸Dn Q€Hà¸k½º4Ü 8„ßÌwQÅÅÅ¿þú+ßU@—æãã#•Jù®¸„Dnà< p‰Ü@¢7(ÀÿÊYç/±ýµIEND®B`‚glom-1.22.4/docs/libglom_reference/html/inherit_graph_6.png0000644000175000017500000000300612234777146025115 0ustar00murraycmurrayc00000000000000‰PNG  IHDR}%à?qèbKGDÿÿÿ ½§“»IDAThíšoHÇ¿·-:lÊmŠäm·ÒyA)dÐõšOʸBp¢8È„ôHIƒù@*òYR„ :ÅÄ)!>T$¢RÜüV&ÎQ›Nr˜ð϶o¾?îwÝÖ´µ<°{=úÜ÷ó¾ï}÷¾ŸïÝ6 B$Ž™Ø øG‘|ÉwqPðÜn÷»wïÄZÊɆ¢¨¬¬¬ÿ!žžñvÂ1 |«Á é 'ê F¤þ.’ïâ ù.’ïâ ù.’ïâ¡ïß¿¯®®¦(êôéÓEUTT,..¢†a6›-z+‚ †q:ÏçÃ0lmm-øt~*êk‹˜H|7oÞ³Z­n·{ppÇñììì½½½¨¯122²,˲ccc2™¬¨¨H Ëå‹%666øÜ0)1 ~_…‡ÑÚÚzöìÙ­­-þ ˲>Ÿ½s:ÉÑL¸´´p¹\>Õ±a0ï«‘Ô{WWWeeå™3gøƒAÈårîÐçó™ÍfŠ¢ÊÊÊÖ××Ñ8†a/_¾Ôjµ±±±>ìîî&I2..®ªªŠtvvò …°¿¿4¯_¿Öétmmm¨™0 c6›‘ruuõÔ©SN§SЂ „ ÉÉÉjµº¸¸­íàà ªª*11Q£Ñ´´´à8n³ÙB*ÑÍËÊÊŠ‰‰9þ|KKKFRï*•j``àWY´¬§OŸêõúÑÑÑ/_¾äççrY†aÖÖÖ¬V+   €‹„Ðb±,,,ðÀ+Ò••£ÑHÓ´ßïG©ììì7oÞììì¼^oGGÇÅ‹‘¸©©)77ɼ^/7ÕóçÏSSSß¿???Ï0 ªÄ'OžÐ4m·Û?~ü˜““#—Ë¥„¦¤¤ÔÔÔx<ž¾¾>™L¶¼¼ü»õ‰ï …âíÛ·|£,ËrŸ¦éööv$˜™™lll ìÈÈ„Ðï÷ â_u~•`våÊ•©©).ÕÛÛËÅ^¯wccÇñÙÙYaNNN[[ òýÒ¥K]]]è¬ÅÅE¹\¾½½MÓtGGüðáC%„P­V?{ö s 6 Ñé3$IÎÍÍñíæf8\.—^¯G1 Ün7:T*•™L&ˆÃÀí«;;;—/_æR:ޝŒ‹‹+((èëë[ZZšœœ þB àt:F#z@Òh4~¿ßív»\®””$ i:ŒÐÜÜÜÐÐpîÜ9“ÉôéÓ'~ƒ="‘ø~ûöíææfT¤‚ ìv»@£ÕjPŒ’$#¸B©TAŽã‚Tð=+))éïï·Z­………è¾ IòÕ«W¨î˲.\HJJâOG%àÆ_¿~íííMJJÊËË .»C‰Ä÷ºº:ÇÃ0ŒÍfóx<ýýýõõõMyyù£GÆÇÇçææîß¿Ï0 AG™¼³³}~.ø]nݺ5;;ÛØØh2™B îܹc6›m6ÛüüüÝ»w¯]»0?ž˜˜øüù3Úä1 ©dddÔÖÖêtº«W¯Bƒ«ápøMçˆýBøíÛ·²²2•JÃ0 ªh~ßß߯©©Ñh4jµº´´µWøó&2X,A¦õógà®RRR¢Óé€ Å­­¶¶V«Õ*•Êëׯ£ý|ww÷Þ½{*•*99íóÓÓÓ!•¡¡¡ôôtÇõz}ww÷¡vEg_=ñÌÌÌ GÏhM}õD’––öàÁƒÍÍÍåå庺ºüüüøøø¿w9É÷ÿèéé±Ûí$I¦¦¦noo¿xñâ¯^.Äï«ÿ&éééÃÃÃÇv9©ÞÅAò]$ßÅAò]Bì«!¿ÓøFGG333ù#?Õ;EQƒáx—ôO™™ùÓŸ#À ô¯<1ú»8H¾‹ƒä»8üo³uGniIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1CustomTitle__inherit__graph.png0000644000175000017500000000656512234777145032043 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“ *IDATxœí}LSWÇÏ¥` k ,Ò†¼ åa›yfˆà v™Á—ޱB‚s:3G48$¼ 2q¸‘ef˜£‹„W^ ÝÔGc ™y¨#Û,©EÆKPË‹6*”ûüq¶»û(pié³óIÿøs÷w~÷|ï=ç¾´½I’ƒ NŽN³ª`½ÑëXo´Àz#IC.—;:ŒIHH Kì<׫þ¡¤¤Ä¢f½“’’V%ŒÝ©¯¯·¨Áó7Z`½ÑëXo´Àz£C½''';æççÇf³ýüüöïß?88¡V«m—! æÃ†M¬0AcccËŠió.Z:ó\-Êììì®]»‚hhh :þ|TTTOO›Í¶yŠF£<O¥RmÚ´ àááaó†P€‰Þ.\¸wïžV«]»v-ÀÇǧ´´ôäÉ“ÎÎL¢- —Ë¥l‡C/®AŒŽŽz{{ÿMã[Àd<¯©©IOO‡bSp¹\‹Egffòóóýüü¼½½SRR ¬'â›o¾‰D¹¹¹/^žžž™™™”Cuu5ÝX‚ ®]»æïïäÈ‘×^{Ï绹¹…‡‡×ÕÕQJ¥R$ñùüsçÎÁÊÎÎÎÈÈHww÷€€€ŠŠ *ZWW×Ü A|||ÆÆÆæu€455p¹Ü„„„‘‘ªž$Éâââõë×óùüÄÄDªè›@Å_ÈyÑ[s‹ÁãñZ[[Z ûô“O> ºqã†F£yõÕWããã©¥‰dll¬¡¡°sçNʾwïI’UUU:ŽnXD¦£¢¢®_¿îïïÿî»ïöööWTT°Ùì'Ož@‡ØØØßÿ½±±ÑÙÙùñãÇ$IfggëõúÆÆF''§ááa644t¡ £££$IZqxùå—oß¾}çÎ-[¶ìܹ“JõóÏ?þñǵZ­D"¡neÓ7„ŠoÅÙzY!!!Áâþ9½;::èý1ÔÆ„„„TVVB‡îînÀÄÄ\ªR©H’4›Í6]Ëy™«w}}=I’ããã333°R£ÑP=hnn¦âÃJ>Ÿ_RRFãÌÌ k%4¬8À­ IòÖ­[€À˜aaa555pÑàà ‹Åzôè¹€ÞVœ÷Ø\½™Œç §§‡.3urNÑßßmh À"‡Ã899YØ ð÷÷ŒçççÇÄÄ‚ƒÒ„B¡Eü²²²âââçž{î­·Þúå—_¨9ÈJE‚ƒƒ¡±aÀ^¯‡ÅÞÞÞÔÔTxA! Íf3Õ s±âlÃc²Z\\\YYÜÅ\.÷æÍ›>"‘H§ÓA€YŠV€›£ÓéN:uÿþýï¿ÿžî'H:;vìèë뫯¯÷õõݶmµ§Z ²¨ƒV«…†F£!ÂÏÏB¡€Öìì¬Ñh|þùçÚ–e93†‰Þz½^"‘¨Õj½^ßÔÔTXXhá³wïÞ>ú¨³³³§§çðáÉd‰çÕÕÕÕ½½½tcQ¦§§#""BBB~ýõ×´´4ðçˆ:/›6mÊÉÉñ÷÷ß¼y3I’®®®‹„VrrrîܹÓÝÝ}èСÄÄDêZ1---??_­VkµÚƒŠÅâyS‚ñ—è¼Rèƒûço’$ûí·””çîî.‘HàLŸ¿Ÿ>}š- ù|~rr2œ¢æN]sm@UUÝ sæoXlmm `³ÙQQQ—.]ŠÝ°aÃÜø0‡«W¯†‡‡»ºº]¼x‘r[(HLLŒ«««Á`°ÒJMMP(äñx©©©““#‰8Nll,uzEOŒŠ¿ç…ì…˜;$í„«®®nÏž=ôÌßšÄÄDð¿OÁñýs´Àz£Ö-°ÞhõF ¬7Z ª·^?îèëBz“$YW×9=m¦Wöõ~þÙòË–ÿ`ÒûöíþÁA£E¥‹‹ss3Bgéé­PÜ¢æéé™úúNtn:¡¢·Ù<ÛØ¨¶Ì!££SjõýUÏÈ1 ¢÷:ƒáѼ‹\\XèÜxAEïo¿í€X³Æ~\\X”m6“­­?Á‹òØMOžüöÍ7ÿö×O^ÆÇM^^G¤¶ª ø| -/ß·Éщ¬6¨ŒçÖ-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-þŸ|Qáß—ÁA>ÿ±›Û´£aÎûܵêMDXX˜ƒu1+çÚµkr¹<))i¹+2ÿ¦ÄÄÄmÛ¶1^³¿-ÏßhõF ¬7Z`½ÑëöýÿT“ÉTYY©R©ŒF#ÇÛ¼yóÛo¿ííí ‹Åååå¡¡¡6l®¯¯ï‹/¾èêêrwwߺuë¡C‡ÜÝÝmQæ=m.--MOOW(Ï<󌅳Í{`Qì¨7I’ÙÙÙAúúú ¥R™žž^]]íâbûwNMMeddìÞ½ûرcF£ñÌ™3gÏžÍÍ͵yCVP*•Ðxýõ×KJJ‚ƒƒnnnyyy«¼ç-„Çó+W® }úé§7när¹AAA2™ŒÅ²|É€M¨««[¿~ý¼½½CBB²²²ÚÛÛM&ÓÒ#ˆÅ≉‰•äÀù€››´Y,ÖöíÛá.¾ò&Vˆõnkk‹wuu¥Wr8'§¿5›Í2™,))é7Þ(**šœœ„õb±¸½½=11q×®]_}õÕ?ü°{÷î²²2Ê¡­­ntttl߾ШÜÜ [§÷2eß½{7==}ÇŽÉÉÉß}÷Šããã'&&gµ°QzÔ"’$kkk¥Ri\\ÜñãÇ©¶ì„õÖjµAAAÖ}äry{{{aaaiiéƒN:E-ºzõªL&ËÉÉ©­­mkkûú믳³³ëëëõz= ///<<œn ­[·ŽÜbß²àĉ/½ôRmmmzzúéÓ§›ššp–eœ•uT*ÕU©P(.]ºTPPP^^þôéÓ3gÎ,g%Øqþ6™Lô £Îe”J%ñ—/_Þ»wïÆGŽÙ·oŸÉd‚S]RR’§§gtt4 99™²'''}}}©C™2–û àáÇ|>ŸÏçGGG·¶¶ÒçWÆY-»hiiÙ·o_XX 333))éÉ“'l6›A¨¥`ÇãÛËË«¿¿Ÿ**•ʆ† Ÿ‘‘à— @ctô<º¹¹‚°°bݺuÃÃÃôš‡ÎÎ.ø–Š£GÖÖÖîÙ³§¸¸¸¯¯>Ø0«E.**‹Åb±8!!avv–jËØQï­[·¶´´P=Îáp4…ÏÐдáèååŬ¹-[¶\¹r…*Þ¿?..Ž:_ƒG?½+#""äryaa¡——WFFÆØØ˜=²Z//¯¢¢"•J¥R©ÚÛÛ•J¥H$²S[À®z§¥¥ †ÜÜ\Fc0®_¿^YYiáUu÷îݳgÏFFFRC½uÚÚÚ ”!•Ju:]yyùÈÈHoooIIÉ+¯¼£q8œŽŽ“ÉT]]ME8pàÀùóçŸ}öÙÐÐP’$׬Y˜ššZIVK6Aï™L¦ÑhOŸ>}ôèQ[54/vÔ›Ëåž;wÎÃÃ#+++55õòåËÇ·ð‘J¥ÑÑÑï½÷ÇËÎÎ^bð?þ¸»»›np¹ÜÏ>ûL«Õ¦¥¥eff …¬¬,è|øða™L&•J_xá*BVVÖÍ›7¥Ré—_~™——çééùâ‹/îß¿jjŠqV‹B5AÕ¤¤¤DFF¼óÎ;###'Nœ°U[óÂüû~ø!~þí(Äb1³ï;àûçhõF ¬7Z`½ÑëXo´Àz£Ö1HF8:k Ëå „cøŸ«DÇ«¬¬‰DK–,H¥R¸—‡‡Guuu}}ýâÅ‹ßyç¸n%»U(ĉWVV†‡‡{xxèî™1»ÇñTÇ2N¦Kå&&&W¯^ýïa~E.—ã¿~–nnngÏž… êêê=‚[+**pQ±µ)€Íf9rÚr¹|xxpóæMbG©TÚ××7<< ÛˆD"²^óòòpŸ?~VVlÐÑÑall<00àä䔞žWÞºu‹¼×™3gàúÚÚZ¼ŠÊ¡[Ç Å©S§¼¼¼rrrµõRùt0] ‡Ãihh ‹›`!hkksqq64ÚÛÛᢹ¹9ÀÈÈHÅÖFjjjJJŠƒƒÃÆëëëa^ÄårÉ;öõõ ‡CÞÇãš››###áø†ÝÈÈH{{»D"™7olFä˜îîîäàUÜ–——;88ܾ};;;»¢¢",,lÖ¬Y:Î1åL—ÊW­Z•šš ¯£‹uãÆ •6\.·©© ÚÐàp8“;ÜòåË[[[óòòlmmà7 &ÊþþþMMM‡jii)//'o‚߇STT¿ý£££r¹|Þ¼y\.—øºŠÅbò^иÿ¾Æà¡[.—ëããS^^^ZZJŒ¥ ôÉt©|Ïž=‰„Ïç×ÔÔH$’ÂÂÂÄÄD•66lØ·oŸP(lhhؾ};ŸÏçØBfffss3ÙðòòŠçñxÞÞÞ8Ž3™Lõ½†††|||ÜÜÜîÝ»èíí%7ˆŠŠ555b±8&&&00°~ýú½{÷^½zõþýûÄí/$))I(Þ»woÛ¶mDðê:^°`ÁÅ‹ËÊÊ:::.\}óæÍñœ&bʘhŠ3μÇñDDDXYY™™™ñù|xµ&ç僃ƒqqqvvvl6{íڵ䌖ÈM5Ú€ŒŒ ²qùòeOOO&“éââ’«ÝJ¥ÒââbGGGƒáççWZZ ï ·ƒƒƒñññ\.×ÜÜ<88Þé*•Ê]»vÁ1–sçÎR^~àÀWWWKKËwß}·»»Çq&“)“Ép-öÀÀÀÉ“'—,Y¢­Ó4— ŸàûXrssÃÃÃ'ºõÀ0L(z{{*€ÐÐP€ªÌǪcAP*?‰œVгº–#¨R9‚ú •#¨íT®±@|šªÆÏ ´S¹F222P17…Ac,ðÞ{ï:Ä4BÙk¹¶âu@aa¡££#‹Å éîîj ¬^4@Јé²*ÿÇ?þqþüùüüük×®uuu½ÿþûĦ“'OÿûßÿîèèØ¸q£ú¾ÕÕÕ®®®û÷ï‡ßÄŒg¢%ã¯c1,c¯ã8«¦`ÍQôimmMHHàr¹ëׯ¿~ýº~c¨ŽeüPöZ®£xÝÕÕ‰D¢¾;ÇKNN‹ÅË–-Û¼y³>‚FL”U¹Žâu¢L\$afoo¯Í‰H$ºvíZPPÐ4Ç‹˜F(;Æ‹×=<<^|ñE•âõøøøS§Na¶uëÖÐÐPõ1D¥R™——wâĉÁÁÁ¿ýíoŸþ9z»ÆŒ†²*‹‹{üøñš5kžûlÑ¢Ez 1] úržá=*Õ—ŸŸ—_ºtIãë×Á8=´´´fÏž=Q" ÊŒÏX–/_þ,ÿXššš<==7mÚdii9…Q!ž+f¼ÊŸggg…Baè(ÓËŒÏXˆ1A*GP¤rõ¡«Êû BLòî“x-ò ÅgäøMãèa á\3…öövø"HĘLRåáááS‡>1g‚® ÷«sª ʳbèf~öIšÏª €³”:„> e^Þò5H.£ìœ&ÐOåO»@çe£à*¡ôSy[ð½æ8hÎ0p0½@?•7e0 ø(èù7P¨Î 4Sù@ ]øè1cð`f‰"ÆÍTÞš ŒHƒ§£# ùœá¢Aè š©¼ù%¿hòZðKƒÖöJ@'•?º Ýà·Ï°Y 5Ç@!ôTÞšŒÔ~„¦³†ˆ¡?è£r4£ƒ¶ŸßÓÓ“ŸŸX±ba766â8ž‘‘ÑÔÔD6T<“ýüü*++y<Þ–-[š››;;;ÓÒÒ †R©„ ‚ƒƒ»ºº LLLž>}Šã¸³³s\\œD")((022êìì„nÝÝݵ9‘J¥8Žëhðúë¯ßºuëÎ;‹-Z±bêÑ£G]]]«ªªÄb1ŸÏ Q?Â¿ŽÆº{ RVVæàà””ÔÕÕ¥ûÓF*ÇqW(§Nòòò ÈÉÉTinbbrõêUb‘¸FÈårü×ÐÍÍíìÙ³°A]]àÑ£GpkEEŽã###*6YÁQWy^^Žãð2WŠD"B7€ .þáJ6›}äÈØX.—ÃëŸP(Ôá:À³ÀqüæÍ›€ÞÞ^èsþüùYYYpSGG‡±±ñÀÀ®Eå:³ÇZ[[¸\îúõë¯_¿®­éš±(//wpp¸}ûvvvvEEEXXجY³TÚp8œ††ÿ¾‚K.—,mmm...ІF{{;\477©Ø“€Çãúúú¿¿?‡Ã‰‰‰!7°³³SñŸššš’’âàà°qãÆúúz"ËÒádÌ®®®ÐðððH$¸ØÜÜ …ìììFFFˆNPGGãqöÇKNN‹ÅË–-Û¼y³Æ!•.—ëããS^^^ZZJ n¨°jÕªÔÔTx9°X¬7n¨ûijj‚648ΔG ?lÿ¦¦¦C‡µ´´”——“ÀÄ—ÌòåË[[[óòòlmmˆï§'c6‹ÅЉD†ÙÛÛÃE‡STT¯ £££r¹|Þ¼yÚÎeBu ‰®]»Ößߤ±R9X°`ÁÅ‹ËÊÊ:::.\ ÿ “Ù³gD"áóù555‰¤°°011Q¥Í† öíÛ' ¶oßÎçóÇ96’™™ÙÜÜL6ÆdhhÈÇÇÇÍÍíÞ½{QQQàלA#^^^ñññ<ÏÛÛÇq&“9¦øm×Ñ >>þÎ;uuu[·n %F9£¢¢AMMX,މ‰ Ôô?ÎÆÚP*•™™™‹/ŽŽŽ^´hQ}}}rr²æ¦ºóBÊ¢åîs``àäÉ“K–,QßôàÁƒˆˆ+++333>Ÿ¯Öä¼|pp0..ÎÎÎŽÍf¯]»¦ž¸ZJªn222ÈPËËábqq±££#ƒÁðóó+-- †wÌ@Sú{ùòeOOO&“éââ’M4ÓæÄßߟÉdÊd2GÉÊʲ³³³²²ŠŒŒT鄸øx.—knnLÜ,’#ü§±6Çñˆˆˆªª*Ÿ3„®•·¨¾œNÐUå:òrõA*GP¤rõA*GP¤rõA*GPºªü’7èüÎÐA ô]U®³¾A1èªr@*GP¤rõA*GP¤rõA*GPºVÞ¢úr:AW•#èÊXÔ©A}ÊÔ©A}ÊÔ©A}èªrT_N'èªrT_N'èªr@*GPŸß<ᯪª:|ø°£Ñ{ÿX z¥¾ÇÆÐL;¾¾¾~ø¡¡£00¿™ü©­­-???$$ÄPÑè}Wý ‚>¨®®6tϦ8ËËËÓˆé 44ÔÐ!< ¼A}ÊÔ©A}ÊÔ©A}&©òþþþÝ»wÛÛÛ3 {{ûèèhb~= Ãjjj¦.B `ÖÓÓ3SÜCwb2*]¹råõë×óóóÛÛÛ/^¼Èd2ýüü”Jå”ÇGPw ãåcræÌ™ÆÆF±Xü /lllŽ?¾ÿ~“Éx›)`&•JçÌ™3ÑéÙ]Ï“¹–geemÛ¶ ~f,‹˜ú0<<,ìííçÌ™!“Éàz ÃΟ?Ïår-,,²³³9Ž¥¥ell,Ñ 33“l…B___333GGÇ´´4Ø,??ÿå—_¶¶¶þâ‹/µµµAAAl6ÛÔÔÔÓÓ377—ðvåÊ—žžž’’âääÄf³CCCa}êîî¾eË–æææÎÎδ´4ƒ¡T*ááüüü*++<èêêZUU%‹ù|~HHŽã€ÇãUVVŠD¢%K–€_§xxxTWW×××/^¼øwÞÁI“Ä’Ý* âÄ+++ÃÃÃἯzë.Ý„„„À3¥9“Q¹‰‰ÉÕ«WÿëâWÈsøº¹¹={6¨««¡PØÐа}ûv>ŸÏb±Æã<33³¹¹™lxyyÅÇÇóx>>nnn÷îÝ‹ŠŠôöö’DEE ‚šš±XX¿~ýÞ½{¯^½zÿþ}•û¹¤¤$¡PxïÞ½mÛ¶Á«ëxÁ‚/^,++ëèèX¸pattôÍ›7õÙ]ˆqAN_Æ™—ã8þàÁƒˆˆ+++333>Ÿ/?äDspp0..ÎÎÎŽÍf¯]»–œÑ ¥F‘‘A6._¾ìééÉd2]\\²³³qµA©TZ\\ìèèÈ`0üüüJKKƒƒƒá] ávpp0>>žËåš››Ã[7¥R¹k×.8ÆrîÜ9@ÊË8àêêjiiùî»ïvwwã8îïïÏd2e2™Jä'Ož\²d‰>»K7(/‡üæ·B¹¹¹áááä5ôÃ0¡Pèíímè@žX_Ž~0€îcÔ=~ÓúoF1еA}ÊÔ©A}ô¡rLSXTýŒÞ4–•ëö‰ŠÂgú¸û$¦XYYUTTxyy,,,ôphèGåäÇxæææz~ª7éºðçÄ?âÙ™úŒE½@\GKX¥½cÇmÕá%%%\.—Íf;v ®ÔXn´”˜“ëµՠ Y,VHHHww7±Çqõªt•S ükk<ÎqXV9¡®FŒòƒÐñ?á×z8øísiðk•6ÇÓVÜÕÕUPPëÈq-åæB¡PG‰9|`®£Á믿~ëÖ­;wî,Z´hÅŠD¨GU¯JÇÕ¶Cÿ:§F¼¬¬ÌÁÁ!))©««ë?ô„2õ*×u05•Ã*mÕá.\ÀIu世rs¡P¨Ã 4t4€uÛ8ŽÃZ+Xé% 5V¥ãZT®£ñ8kÄ[[[¸\îúõë¯_¿þìŽT1ðH"¬ÒÖQngg~[Q­±Ü\·“1¸ººBÃÃà ‘Hà¢Æªtm碣ñ8kÄy<^rr²X,^¶lÙæÍ›}||ttbüXåðÃÖQ®RG´”›ëv2f¢¸\$afoo5V¥k;— 5ÖH$ºvíZPPÐ$vG¨3õ*W/“1«ÃÉh+7×áeêhçκºº­[·†††£œ«ÒÕþÇÙXJ¥233sñâÅÑÑÑ‹-ª¯¯ONNž„VÈéË”äå@­@œ¼I%/‡‹cV‡ã¤ôWc¹¹P(Ôæ„¨ ×q”¬¬,;;;++«ÈÈH•²oõªt•Àÿãi¬ÍÆq¼°°0""¢ªªêûŸ ÊË!¨¾œÊ úrªcAP¤rõA*GP¤rõA*GP¤rõ¡©ÊñQCG€Ð#4UyíÿëÄGÑcº áWê¥#Ã3:èyiÝ.¾èÕ÷R:ÌÄ=&¿yöÙÞÞ~íÚ5F£†[Lrìfÿ®ßty÷Ø­g8ööö¾¾¾†ŽÂÀ`4|ž%±µ¡X6ûãõÿzÕhÅÿq! óòaåhS¹0¨}põ‘¡ÃAèÚ©üA壑A`d Ä¥šß8Ž ´S¹¸´3€ÑaüÁ}CŠCG„˜vè¥òÁ_FÚ®öŽüçVdtoý%-Ô‡^*oþ¾Ÿaàþ·Z”„  ôRùýRþ;¦„€ŽŸ~yÒ‹Þ‚Bqh¤r…l¨óƀʳ} Û¿G÷ ‡F*oú?90V]9: î_DI Å¡‘Êï_ìÅGÔá »nà—‡ƒ†ˆ¡'è¢òG”=?+€¦ç¼F&XÓw(i¡2tQyó¿´êxt¿_Š’*C—Ù³úZžZ¹š‹OdC³Íÿù’c Ù™µêäâj@Çj-À©×oþOŠ“ó2+C‚ÐtÉXt©A}ÊÔ©A}ÊÔ©A}hªrŸívl7Ó±Û!(MÇË´‚¦×r­@*GP¤rõA*GP¤ò)`xxðžž•õ†ÕÔÔL‡çIðìÁÌ\ʧcc㌌ b–Ðá™VÐTå?íè½ÿäWY ÃÞ{ï=ƒA^9%=#& MU~ëLW_ËSbðóçÏs¹\ ‹„„„ììl‡cii«Í|ÿµ !ôžž••ÇSRRœœœØlvhh¨L&Ó˜P(ôõõ533sttLKK¿ý.•””p¹\6›}ìØ1ÀÐÐPllìK/½dgg—––Æd2aNBþ¦©|ëjkkƒ‚‚Øl¶©©©§§gnn.ÑìÊ•+<ïôéÓìË™€gÔ5 '£ñÿz‰EŸÏïééÉÏϬX±‚°‰)˜Õ¿N'M¶UV …£GºººVUU‰Åb>Ÿ¯{2egg縸8‰DRPP`ddÔÙÙIöÜÕÕUPP`bbòôéÓýû÷»¹¹Ý¸qãîÝ»þþþÆÆÆp2hm …Bww÷-[¶477wvv¦¥¥1 ¥R ·úùùUVV*Šgè×ç¤rÇq@EEŽã###*6yqÆ©òùóçgeeÁ5ÆÆÆÚ|²Ùì#GŽ@[.—“=_¸pL*•º¹¹;w6¾}û6­•÷õõ ÃM"‘ˆ¼5//oÜý7àiÆ¢Ž¹¹9ÀÈÈHÅ~vš››###1 Ã0ÌÎÎndd¤½½][ãÔÔÔ””‡7Ö××ÿæ 2vvväÀÚÚÚœ¡íææ6ž`úúú¿¿?‡Ã‰‰‰!oâñx:¯Rù´ÃápŠŠŠàEettT.—Ï›7O[ãåË—·¶¶æååÙÚÚttt·ªL†ckkÛÜÜ íÆÆFò&Çê_'ÿ¦¦¦C‡µ´´”——“7MÕ·ú9„²'¦är /ÀPY%jjjÄbqLLL`` ‡^^^ñññ<ÏÛÛÇq&“©£qdddRRÒÍ›7ïÝ»o”á×€Åb}óÍ7ýýýû÷ïWÙehhÈÇÇÇÍÍíÞ½{QQQ€Þ^¼¥Ãé’áPÏˉü[›­Ž¿¿?“É”Éd8)ýUY) ããã¹\®¹¹ypp°ŽÛYÇ/_¾ìééÉd2]\\²³³qµÄšL*•>}útëÖ­VVVNNNð^ùÖ­[8ŽŸ;wnîܹÖÖÖ™™™*»;::2 ??¿ÒÒÒàà`1Ït¦CÓÊÛ[gº^d9êºRÎ,îÞ½»páB©TjmmmèXž;hš±ünãÜqJüÒ¥K˜&Á¤>U>,XðñÇÿòË/{öìYºt)’¸Fhz-§uuu|ðÁO?ý„ãøâÅ‹Oœ8A ¹ È •#¨M3­@*GP¤rõA*GPšª|JêË3šª\¥¾Amhªr­@*GP¤rõA*GP¤rõA*GPšª½¿œV šDõ¡éµA+ÊÔ©A}ÊÔ©A}ÊÔ‡¦*Gõå´‚¦*Gõå´‚¦*GÐ ¤rõ1QY®ªªjkk3H(úc:Uýt­F>`è@¦°°0C‡`xTëXBCCáÛSÔÕ)õk9`É’%ÿûßõ bŠùᇠÅsÊËÔ©A}ÊÔ©A}ÊÔ©A}&HEa}IDAT¯r…Bqâĉ°°°eË–………|èС}ûöÁM—/_NOO¯­­ýôÓOÿøÇ?ž>}ÚkÖ¬±µµýä“O<==„صk—ú!öîÝûÚk¯}ôÑG £ªª*99ù7Þ011Ù»wo@@À¾}ûîÞ½ûé§ŸúùùYYYéµ¢¢BýZ^TTTZZºgÏ‹uìØ±Ã‡ÇðððÏ?ÿüÆ~~~¯¿þº¶)6‹ŠŠN:uçÎÄÄD>ŸŸ››[UUuðàÁÙ³g>|xddDwïé8;À©S§Á¼yóÆt‚“V¹B¡ ‚˜[¾¤¤„HÊÊÊ6lØðÊ+¯vìØ±iÓ&…BÓÖ°°0KKË7ß|°víZÂîïï·µµ%þï“€þóŸîîî*G 666,,L©T2ŒððpOOÏ+W®ää䤤¤¸ººÆÄÄx{{«ì¾jÕ*‹õÆoŒŒŒ(ŠK—.­_¿ÞÍÍ ðÁDGG€¶³„††.\¸p'EO&©rkkë¶¶¶ ÀÅ’’¥R©ruïîîæp8І†T*upp˜šš0 S±'ÊãÇ¿þú뺺ºŽŽ.—K¬ßµk×Ñ£Góòò^{íµ·ß~›ˆsBtvv&%%%%%k¤R)—Ëxå•W O™L–‘‘!rss---ɻϙ3‡|^äÞ ‡:‰³Ì;wgD[&™—/^¼ø›o¾…‹æææê#_666>„¶D"LùüÙ;vìxøðá–-[Ο?èÐ!b½ONNNbb¢µµõÎ;‰!Î amm””TQQQQQñý÷ß—””@©mذ¡ººšh£T*‰¬@å{kmm ;@t ÇJ¥Òqžºs„n&©ò¨¨(™L– ‰d2YeeåÙ³gUÚgddüüóÏííí_|ñ…¯¯/y Cß}÷ahcddä•W^ár¹­­­ÉÉÉ€_~ùðþûïŸýôS‘Hùäɓݻw:"1É‘DÄDqrr:|ø°¡£ )èZŽ >HåêƒTŽ >Håê£áî³¾¾—Sõ’Ú¢ªr___ƒÄ˜rlll`A%Í÷‰ >(/GP¤rõA*GP¤rõA*GPŸÿ9k®Rxë‹BIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__inherit__graph.png0000644000175000017500000015303412234777146031656 0ustar00murraycmurrayc00000000000000‰PNG  IHDRKýmeãbKGDÿÿÿ ½§“ IDATxœìÝw\÷ÿð;‚‚Ê¢!€¨¸W«¥‚GQiY,jµ8¨ëDµJµÚjÝuÔ¢€²\`]¨ˆ \u ÈR2Â&ã~\›òEGàõ|øèã“OŽÏçu§%¼¹»Ï‘E­‚Ó”´¨p õPg:È“™™yçΦS@s311±²²b:€JB…ТݹsÇÍÍéÐܜØN ’Pᨬ}Ú¦¸¸¸0@…á>h=Pá@ë ZT8Ðz Â€Ö´¨pZ ¡P¸|ùr “Ù³ggeeÑo‘$™ Ä¹”>`K˜‘|G3ï#(ž‡ÐH¥ÒI“&‘$Þ£GìììƒZ[['''khh0NeDGG:TöR[[›Á0Ð8¨pZÿÔÔÔ”””N:ahh¸wï^???uuþ¬'I2??ßÀÀ@Áþ§¥¥Åf³ýåM ‡«ÔZƒ   oooº¼‘a³Ù,KöR,ûúúš˜˜¸»»Òý$Is¹\mmíÕ«WŸ8q‚ÃáèèèøøøÈ6 ¬Ùx×£Gìììôõõ;tè0pàÀÐÐP‚ &Ož¼}ûvzƒ¸¸8ƒŠŠŠú2Ôl“$I„¡¡¡¬_ö®¬Ÿ¢¨-[¶˜››ëë뻸¸(¾Gõ)--üK"‘ÔwÐêìT0XLLŒ©©é‘#Gä'€Æ£  QäóZOO/""¢¾w ‚ˆß¼ysÏž=ãââ’’’ÆŽëèè({—Çㄇ‡1qâDY;55•¢¨€€€´´´š zÀšSôéÓgÞ¼yéééoß¾=|ø°††FUU•¿¿¿••½ÁâÅ‹çÎ+'C~~~­v­NÙŒ²þÝ»w÷êÕ+666%%…Çã9;;+¸Gõ¥šèéê Üà^È fmm}óæÍòòr9›ÎÎβ/€÷…  ES°ÂQWW¿}û¶ì¥ìÇt>ŸOý[XXX=z”ÞàéÓ§AÓïFGGSEŸµ¨Ù®UÆÔ¿Ö[@,Óí¤¤$úg}@ ©©™™™)‘H8NLLŒœ ¨pú÷ïDwfee±X¬²²²ÆíQ;EQTÜ 9ÁÂÂÂê ƒ àCà*5€Ö€Ãá$''Ë^òù|ÙBj2oÞ¼éÙ³'ݦ™™™ôK---‚ ÔÔÔjµ'|}}mmm9Ž——Ý©««kggwòäÉ7n¨««ÛØØÈÉÐéééôºgÆÆÆ‰D‰{D«3pƒ{!'˜©©i#b€âPá´ûöí£OSÁf³ïß¿_k.—›––F·é‡ÃQV[[Û´´´mÛ¶edd\ºtIÖïêê2mÚ4’$åd (ŠxÏ‚‡Ãáœ9s†þ­­T*åóù½{÷VÖÑê Üà‘”¬q…(ÿ´ëÖ­ËÉÉáñx 999§NÚ°aC­mf̘±qãÆøøøäää… òx<× LOO¯Ù Þ¹)_$YZZZXX$&&zzzQTTDÄÔ©S‚ƒƒÝÝÝåd`³ÙgÏž …~~~5§æóùuF¢û===}}}RRR¼¼¼ÆŒó>ÇL!u–s$›-Ô‹±ëã@ Þ‡CQÔëׯÝÝÝõôô:vìÈãñès 5ïé®®^¹r¥±±±¾¾þ´iÓê»ÅåÝ6Aµ5ÅÇÇGDDtïÞ]CCÃÚÚúüùóööö}ûö¥Çqpp0`Ý®/ñcÇŒŒŒ:wîL¯ÕF÷ÛÚÚjjjÖ &믮®^µj—ËÕÒÒ²··—­"ÐàÕ©Îwë \ß^¼W09pÀ‡ ©w¾I@Ëêææ¦ÒŸ×ŽŽŽ–––kÖ¬a:ˆÊpqq!",,Œé * W©@S)//¿{÷îåË—=<<˜Îò‹/’uñõõe:(‡ ?çZ¸ .Ìœ9sýúõfffLgùÇ„ Tú„44''''''¦S@Û‚«Ô õ@…­*h=Pá@ë•Tý€•–¶¯®VÓׯlº<ФâââFŒÁt U…  E311qvvVdËÊJõ¼¼**Ôuu+Qᨮ#FXYY1@U‘X@¥åç—DD<<}úÁƒ¯ ´>úòËaÜRž?ÐÌPá¨$±XzáÂß±·o¿d³;~ñŰ)S† n®¦F2 €I¨pTŒ@Pr/ àNZZþ°afÓ§[óxC:uÒ`:@‹€ @elß^ÝÉiØôéÖýûs˜в ÂhéÄbééÓ÷Œyþ<û³Ï,¦O·²·ؾ=– ¨*€–«ºZ|òdÂï¿_OMͳ·¸`ÁçÆa yPá´DBaE@ÀÇoðùåNNÃ,Ó³g¦C¨œàhY„Šݻ¯þùçMMÍv³f}6k–¾~'¦C¨ œÃh)D"I``ìΗËË«çÎýí·£ut4™ bp€yb±48øîŽ—KK+-²›9ó3¬þ Ð8¨pvófò?œIIÉss³\ºt|·nl¦¨0T8ŒÉÉlØp6"âÑ”)Cÿøã›îÝ ˜N òPá0 ªJ¼gÏ•½{¯õë×íÂ…eC†˜0 •@…ÐÜ¢¢ž­_º¤¤òçŸ]œœ†«©‘L'h=Pá4Ÿ×¯ ×­;}õêóY³l||ìÙìŽL'hmPá4ÙeiýûsΟ_:x0.Kh¨pšÜ•+ÏqY@ó@…Є‚ò~8–ðå—Ã|}§é0 •C…ÐTΟÿ{ÍšpMÍö¡¡ FŽìÅt€6€òeg V¬‰Iš7oÌòå44ð ÐLð @™(Š ŠÛ¸1¢[7öÙ³‹>þØŒéDm *¥IKË÷ñ ~ðàÕŠ½¼F·kÇb:@›ƒ @ $éï¿Gÿúë¥^½º\¸°¬NãÆqqqQn0hM–-[feeÅt €–Né*ïåË\GÇÝ[·^ðñ±ÿ믥.o‚ÏÌÌTb6h5ÂÃÃß¼yÃt €s8äøñ¸õëOs8ìS§¾6¬û‡¸téRWW×Z’Äc”‚  ‘Š‹ËW¬;wîñìÙ6k×NÁ‚i-¾4Ƶk‰K–o×NϺhQPἑHòãGŽÜœ2eèÖ­.::˜NÿA…ðÒÓó,xù2÷·ß¾rqù„é8PÖRPT``¬½ý¯‰ôâE”7-*€†—{yù¯Z6cÆgçÎ-éÕ« ³y„BáòåËMLL444LLLfÏž••E¿E’dBB‚çRú€-dF9ÇP‰Ètuu?ûì³ëׯ+}¨ @ž>ÍâñvÞ¾røð¬µkyíÛ3|·T*4iÒÝ»wé‡çœ;wNSSÓÚÚºªªŠÙ`*¤9att4ŸÏçóù=²²²rrr*++Sú, ƒ @ž  Ø)S~ëÚUçêÕï'LÄt‚ ÿÔÔÔ‹/~ú駆††C† Ù»wïãÇÕÕUøöZ’$ ïÿ@Íy µ´´Øl6›Í677_·n]QQÑëׯ•> Ƞ¨›PXùÍ7GÖ¬9¹ví”ÐÐ]»ê2èAAAÞÞÞ:uªÙÉf³Y,–ì¥X,öõõ511100pww/,,¤ûI’ ær¹ÚÚÚ«W¯>qâ‡ÃÑÑÑñññ‘mX³ñ®GÙÙÙéëëwèÐaàÀ¡¡¡ALžóæÍKOOûöíáÇ544ªªªüýý­¬¬è /^}¿W¯•..ûòóKšyjE~ŠUWW¿}ûvÍ/¡ñù|êßòÀÂÂâèÑ£ôOŸ>%¢¸¸˜~7::š¢(‰DR«]«Œ©9~­·X,¦ÛIIIôø@SS333S"‘p8œ˜˜9Qáôïß?((ˆîÌÊÊb±XeeeÛ#EŽaXXEQï» þþþtç£GèkÆ … ,àp8b±øÝÃU_Ôš!Qá(W©üG$’¬XúÝwóæ>~|®Ó‰êÀáp’““e/ù|þ»‹€½yó¦gÏžt›ndffÒ/µ´´‚PSS«ÕVœ@ ðõõµµµåp8^^^t§®®®ÝÉ“'oܸ¡®®ncc#'C#¤§§{xxЋ’K$’Ù£¡©©)!÷0ÖI¶qŸ>}ÞÝX[[{ãÆÙÙÙÉÉÉﮆ( À?^¿.œ2egdäã?ÿœíã3A]½…~J:88ìÛ·>MA›Í¾ÿ~­m¸\nZZݦGYlmmÓÒÒ¶mÛ–‘‘qéÒ%Y¿««kxxxHHÈ´iÓH’”“¢(â= ‡sæÌú´R©”Ïç÷îݻѻÐà1¤k¤÷Ý…ÔÔTºñòåK¢®c.‹‰˰Z‡«Ñûµ´ÐïÝÍ,:úÅĉ;X,2*jù¸q˜Ž#Ϻuërrrx<^BBBNNΩS§6lØPk›3flܸ1>>>99yáÂ…<Íf+2x```zzzÍQã^y@ ‘HD"‘¥¥¥……Ebb¢§§'AEEEAL:5!!!88ØÝÝ]N6›}öìY¡PèççWsj>Ÿ_g$ºßÓÓÓ××7!!!%%ÅËËk̘1ïsÌjSä6b6mÚŸ˜˜èíí-ÛXvô²²²V­Z5tèP.—ûîá¥aò9€@*•îÝ{ÕÄd™·w@YY³aÅîµxýúµ»»»žž^ÇŽy<}z¡æ}8ÕÕÕ+W®466Ö×ן6mZ}·¸¼Û&"  V£¦øøøˆˆˆîÝ»khhX[[Ÿ?ÞÞÞ¾oß¾ô8  Ûõe8v옑‘QçÎéµÚè~[[[MMÍÂÂÂZÁdýÕÕÕ«V­âr¹ZZZööö²UÜ£FÃ÷Ý‚ 6oÞÜ«W/''§¼¼¼ZG¯C‡ŸþùË—/ej®)øoHêï\mGe¥hÙ²àóçÿþñÇ/<=­™ŽC$âêêÊtFrtt´´´\³f ÓA@’d||üðáÃÿ’÷:\ªþo Ùà*5h»^¿.œT8ÐV$%½5늢ΜYÔ·o7¦ã@“ÀZjÐ&\¼ø„ÇûËÕ»paÊ€V ´~ÇŽÝñòòŸ¾xñIV¿gÏ.ŽŽñxCûôéÊt.&á>hUî¬]{rêÔ·oŸÖZÏ`dg NžL8{öáóçÙ]ºhOž²²êÉbáÙÿA…­X,]µ*,$äÞ† Žß|cÃte¢(êÖ­—±—/?USS›ýà›7E^C†˜0G9ÒýýoŸ;÷XW·Ã_|ìæfÙ¯‡éPª¨°ìlÁW_ý^^^}âļ^½º0çC åAA±ÇßÍÈ(øì3‹9sl?ÿ¼?®Fx/XK TUJJÞW_ý®££yîÜb##]¦ã|gϲ¸ùˆÅRûê«3gŽìÙSå 6Fਤû÷3¾þúP¯^FsTú¡7±±©ûö]½víE—.:žžÖÓ§[j3 @…¡ÂÕýâÛoÿüôÓ‡ÍêØ±=ÓqC*¥ÎŸÿ{ÿþk¾<Ødþü1“& n­ðhN¨p@ÅDD<\¸0hâÄÁ»w{¨bI V:p§¨¨ÌÑñão¿5h—éP­îÃUrèPÌ?œ3Çö‡¦ªÜ3=ß¾-Þ»÷Zhè=‰DúÕW#¾ýÖÖÔ´3Ó¡ZœÃ•ñûï×7nŒ˜7o´¯ïÕ*oòòJöï¿p§];uOOëo¾±12Òa:@ë„ TÃöí—~ùåâÚµ÷ðѾ=õhV¨p …ªª{yùß¹“rôèkë^LÇi@~~ÉîÝWŽ»c` õÝwvî¶`¾ù@KTY)š3çÏ„„ô  /KËLÇ‘'7Wøë¯CBîëíÞí1yò55UZç  •Á9hqJK«<=%'¿=qb^K~fqqùž=×þüó¦ŽN‡eËìÝÜ,q¿ ãPá@Ë"”»»ÈÉ) oaaÄtœº …•»w_ñ÷¿¥¥¥áã3¡‰j›ÐÐP777¥ *ÄÙÙ9,,Œé*W©@ RZZåéy8'GÜBË‘HrüxÜo¿EUTTÍ›7ÆËk”¶¶f“ÎÒ¤ãC‹µcǦ#¨$T8ÐR””TzxÌÌ,:uê;ssC¦ãÔFQÔùóoÞüWNNñ·ßÚΛ7†ÍîØ óººº6Ã,Ðáì @ã Â€Ï/ssÛ/VFF.66Öc:NmQQÏ~úé\zzÁ·ßŽZ°`Œž^'¦@ÝPáódåÍÉ“Þ-­¼yò$sÓ¦È[·^:9 ôjiñ T8À0>¿ÌÕuII‹+o22 6oþëܹÇÖÖ=ÏŸ_:dˆ Ó‰ a¨p€I-³¼)-­Ú»÷êÁƒ1]»ê80còäÁ$‰GܨT8À˜XÞH$Ò{[·ž‹¥¾¾S¦O·Â#nT‹Ó jåMdä£Q£¶¬]{ò믭ïÝ[?kÖgªRÞ…ÂåË—›˜˜hhh˜˜˜Ìž=;++‹~‹$É„„%Î¥ô[ÂŒïNñ“’$YPPðÁ¹ 1p V~ýõ¡ÂÂÒRÞ<{–µaÃÙÛ·Sœœ†……-èÖÍt¢÷ •J'MšD’dxxx=²³³2‹Œ\üñÇfÌæiÿÔÔÔ”””N:ahh¸wï^???uuþ”'I2??ßÀÀ@Á~\¥ͪ´´jÚ´ý™™üÓ§~¬§H$9pàú¨Q[®]KÜ´Ééôé…ªXÞäííM—72l6›Åúï;±Xìëëkbbb``àîî^XXH÷“$ÌårµµµW¯^}âÄ ‡£££ããã#Û 00°fã]=²³³Ó××ïСÃÀCCC ‚˜!!!Š|RëééEDDÔ÷.Añññ›7oîÙ³g\\\RRÒØ±ceïòx¼‚‚‚ððp‚ &Nœ(k§¦¦R––V³AXsŠ>}úÌ›7/==ýíÛ·‡ÖÐШªªò÷÷·²²¢7X¼xñܹsådÈÏϯծÕ)›QÖ¿{÷î^½zÅÆÆ¦¤¤ðxŸOý[XXX=z”ÞàéÓ§AÓïFGGS%‘Hjµk•15ǯõ–@ ‹Åt;))‰þá^ hjjfffJ$‡#'C#*œþýûÑYYY,«¬¬¬q{TçNÑ=uÎRçþš››ÿñÇtçãÇéN9!ÃÂÂê #ƒ  qp•4‘H2oÞÑÇß„†Îïׯ#Êʪ֭;mg·-/O:ÿÀÝ»·†Û98Nrr²ì%ŸÏ—-¤&óæÍ›ž={Òmº‘™™I¿ÔÒÒ"BMM­V[qÀ×××ÖÖ–ÃáxyyѺººvvv'Ož¼qㆺººœ žžîááA’$I’ÆÆÆ‰D‰{$–:÷7''§wïÞt[ÖÒÔÔ´‘{ A…MN,–.XpëÖËÀÀo 0f$CXX¼ÍæÐÐ{ëÖ9\¾¼ü³Ïz3£)888ìÛ·>MA›Í¾ÿ~­m¸\nZZݦGYlmmÓÒÒ¶mÛ–‘‘qéÒ%Y¿««kxxxHHÈ´iÓH’”“¢(â= ‡sæÌú÷µR©”ÏçËê %ªs–:÷—ËåÊêÌ”””C6ºè€áÿ.hZR)åã|åʳ?ÿüfذîÍ #£`ƌËÿäók×VÌ™c«*O¹Qкuërrrx<^BBBNNΩS§6lØPk›3flܸ1>>>99yáÂ…<ÍVhEìÀÀÀôôôš âoÊ—H$"‘ÈÒÒÒÂÂ"11ÑÓÓ“ ˆ¢¢"‚ ¦Nšìîî.'›Í>{ö¬P(ôóó«95ŸÏ¯3Ýïéééëë›’’âåå5f̘÷9fŠªs–:÷÷믿þñÇoß¾ýòåKÙªÍjcäÚ8h#¤RéÒ¥'ÌÌ–_¿þ¢ùg¯ªíØqÉÜüû±c¾uëeóø@ Þ‡CQÔëׯÝÝÝõôô:vìÈãñè3$5ïé®®^¹r¥±±±¾¾þ´iÓê»ÅåÝ6Aµ5ÅÇÇGDDtïÞ]CCÃÚÚúüùóööö}ûö¥Çqpp0`Ý®/Ãð¼Th IDAT±cÇŒŒŒ:wîL¯ÕF÷ÛÚÚjjjÖ &믮®^µj—ËÕÒÒ²··—­"ÐàÕéÝweÇíÝYêÜߪªª¥K—Òk©;vŒÞEBÊûp‡¤êY?àÃýüóùÝ»¯ìÞ=ý‹/>n橯^}¾ví©’’Ê~˜êä4\Mlæ.44ÔÍÍM¥?©---׬YÃt•äââBDXXÓAT ®R€¦²ô®]W¶msmæò&+‹?cÆá¯¿>dii½ÒÅåU,oT]yyùÝ»w/_¾ìááÁt–\¼x‘¬‹¯¯/ÓÑ@™TøiÇÐ’:³qcÄO?9õÕˆf›T"‘þþ{ôŽ—9vx¸·µu¯f›j¹páÂÌ™3ׯ_ofÖRž£:a•>! B…Êrï‡ÎúøL˜9sd³Mzÿþ«•+CSRò.üü»ïì44ðÇ$''''''¦S@[„ïþ dW®<_±"ÔËk”}óÌÈç—ýßÿ9yò¾MïÇgµŽ§Ü@ã ÂeŠ‹KõòòÿòËaë×;4ÃtE…‡'øùEJ¥Ôï¿{N™2´&€– (Í“'™3f;¶ß/¿¸‘d“ßÜÿòeîêÕáqq©³fÙ|ÿýM=#´|¨p@9RSóÜÝ `¼gÏt«i×ꬪÿòËѝ÷ïÏ9~éàÁ&M:¨T8 YY|7·ýûèÑ9ššíšt®ë×_¬Ys²  dÝ:‡™3?SWoåO> mÒñ%ª¼\¬­Ý´kЙ™™\.—éª|¨’’Ê™3ÿPWg;6G[[³é& +~ü1âĉ»66½ŸÛFVpsskŠa۵뢡aÚ¾½iûöœêêÌ¢¢3M1 | ggg¦#¨ ÃÀ‡¨®{xHJz±¸IKލ¨g+W†‰Å’üÂѱY!Új…•·o¿Œ‰y“ôêU¡¶¶æÈ‘£G÷5ª™Yg¦Ó(*h<±X:{ö‘{÷ÒOŸþ®oßnM4ËÛ·Å+W†]¹òÜÃc„¯¯ƒŽNž&j}ªªÄ÷î¥]¾üìÊ•g¯^¶kÇ1¢§­mo›ÞrÕÔš|A€f†«Ô ñV¯¿q#éøñyMWÞÆnÚÙ¹³Ö©Sß}úi&𥕡(êɓ̛7“oÜHŽO¯¬õîÝ•ÇjkÛ{ذî;¶g: @Â9h¤_½øÛoQ‡ϲ·Øãgg V¬‰Iš7o̲eã;tÀÏå ÈÍ-ŽŠz~ófr\\j~~‰ŽŽæ¨Q}mlzÛØôÆEhÐvà4Æ‘#7ýõÒæÍÎMQÞP·iS„‘‘îéÓß n®ô)Z ©”zò$óڵĘ˜¤2ÄbiïÞ]¿øâãQ£úZYõlêuíZ œÃ€÷ö×_çÍ;6þ˜5kxJ<#£`Ù²àû÷3-²ûî;; ü2®BaELLÒµk‰×®%æç—°Ùmm{Õgôè¾Ýº±™NÀ$T8ð~îÞM›6m¿£ãÇÛ·O#IeÞ§.•Rû÷_Û¾ýr¯^]vìøªŽo¤R*!!¾íéÓLK^3ÀÎn@Ÿ>]™NÐR Â€÷––ïà°³NPÐÜvíXJ955oÙ²àÇß|ÿý„¹sÇ´úçx*®¸¸üòågW®<¿}ûeQQY×®ºvvýé»kØìŽL§hqPဢ K§LÙÙ±cûÓ§*ñÉž‰ô÷ߣýõR¿~ݶoÿ §#ˆC‹ŠzõüÙ³,55§k„ RVVõå—{JJ*Ï[¢¯ßIYÃ&'¿õñ NLÌùáGw÷müñ,%%•ׯ¿ˆŠz“”Ÿ_bd¤3nܛޟ}f¡§§´cкáöMh˜X,;÷hv¶ 2r±²ÊŠ¢þüó–Ÿß¹¾}»ž;·¤éž¨Óòåä®\y~õjâ­[ÉååÕýúusqùdìØ~Ÿ|b®ÜKڜÀ†}ÿ}hxx|HÈ|KKåZv¶`Ù²àØØ”+&¶©Ó²³çÏÿõìÞ½4©”1¢ç¸qÆÐÖ <€f€ êŸîêºoútë¿øðÑc7mŠ06Ö߳ǣ_¿Öÿ¬Š¢âãÓ£¢žGE=KN~«££9~ü@zå¬ò ÐtPá@ÝÞ¼)âñ~8ÐøèÑo?ðdKn®pùòàèèóç]¾|‚†Fk¾Fº¼¼úêÕçQQÏ®_QPPÚ£‡áĉƒÇëÿñÇÝÛÎ9+¡Â€:””T:8ìl׎uêÔB--êÂ…'+W†jiiîÜéþÉ'æÊJØÒäæ £¢žEE=»y3¹ºZ¢q#<}šµhQЫW…¾¾SfÎI’*ÿ£¿PXyíÚó‹Ÿ\»–XVV=dˆÉ„ ƒìí‖ üãÑ£×_~¹gút«lÌÚÐR)uàÀõ-[þ4ˆ»k—G†JOØœRRòΞ}Pë›qã`¡g€Aää&MúmèP“?þø¦×\ed,\ø÷ß™ëÖ9Ìžm£¢§nè'ØDF>¾råÙ«W…††Úööÿ<ÁFS³]“NûæÍ›&ZWWW¦#´\¨p€¨®;9í--­<{v±ŽÎ{¯xvòdš5'»tÑÙ³gú!&M‘°I‰D’ë×_DE=»v-1;[ {‚ͰaÝY¬fz‚‹‹KxxxóÌ­~~+ ±bEhzzþùóKß·¼).._±"ìܹÇß|c³v-¯©Ot(WIIåÅ‹Od+ Þ}Ö¬Ï|‚³³sXX#Sƒ ussc:@‹†  ­Û³çê™3Ožô65íü^_x÷nÚÂ…ÕÕâÀ@¯1cú6Q<¥ËÍ-ŽŒ|õìÞ½4©”=ºïÚµ¼Ñ£ûr¹zLG%@…ЦEE=Û²å¯íÛ¿6¬»â_%I¶n½ðûïÑcÆôݾý+•XúåË܈ˆ‡ôÊ;¶Ÿ0aЮ]66½±r@+ƒ  ízñ"ÇÛ;`ÆŒÏ\]?Qü«22 ¼½^¼x»y³³‡Çˆ¾¨ÀË—¹çÏÿ}á“'O2µ´4ÆŒé·`Á˜1cúik¿÷íF Pá´QEEe3gþ1t¨é† ŽŠU``ìÆ¦¦/\XÚèG‚6ƒ'O2ÏŸÿûüù¿_¾ÌíÒEÛÞ~ЪU“FŽ´h׎Åt4hZ¨pÚ"±X:þ155òàÁ™êê -F/*ð×_çÏûý÷Ú·oqŸ ô’h‘‘®]K,**³°0rpÊã Å£9Ú”÷ùÍ`Ó¦ˆG^Ÿ;·DÁ»P?~³`A€PXqäÈ7ãÇlêx良¼úêÕçQQÏ®\y^\\1|x÷%KÆ7ÀÌìýN€Ö¡™–ù€–ãøñ¸Ã‡oìÚåaaaÔàÆE<ãà°Ó̬óÕ«+ZNySZZ?cÆáAƒÖÍŸìÕ«ÂeËìïÞ]wöì¢9sl[qy# —/_nbb¢¡¡abb2{ö쬬,ú-’$”8—Òl 3’$9}út%NJ’dAAS_ïÂ9€¶åîݴի×-³··o¸VÉÍ-þî»Àøø ??§éÓ­š!^ƒ K/\xõìÆ$z­ç-[œÇŽí×¹³ ¬çöá¤Ré¤I“H’ ïÑ£GvvöÁƒ­­­“““544˜N§2Nœ8±hÑ"KKK¦ƒ@“@…Ðj‰D’Z7ÖçäæÎõŸ8qðÒ¥ãüòèè‹éètˆŒ\$´X¸J  u¢(ÊÁagtô YOEEõŒ‡»veÿöÛWò—x‰$ëÖž>ýà¨Q}.]òa°¼ÉÈ(Ø»÷êÔ©»† ûaëÖóffù&1ÑïèÑ9..Ÿ´µò† ˆ   oooº¼‘a³Ù,Ö¥¬X,öõõ511100pww/,,¤ûI’ ær¹ÚÚÚ«W¯>qâ‡ÃÑÑÑñññ‘mX³ñ®GÙÙÙéëëwèÐaàÀ¡¡¡ALžóæÍKOOûöíáÇ544ªªªüýý­¬¬è /^ojês÷î??ö•—W±12òQ­¯:{öaŸ>«ÆŽÝúòen³G¦’’r~ùå¨Q[ºu[2dÈ:_ßSw力ŒæOÒü¬pÔÕÕoß¾-{)û}%ŸÏ§þýIÝÂÂâèÑ£ôOŸ>%¢¸¸˜~7::š¢(‰DR«]«Œ©9~­·X,¦ÛIIIôOç@SS333S"‘p8œ˜˜9Qáôïß?((ˆîÌÊÊb±XeeeÛ£šSØÚÚnÚ´I‘ã¦` Š¢sæHKËô?ýtîÕ«¢Å‹gdüsiPe¥hÑ¢ y󎺸Xž?¿´W¯.Í–6==Ïž«&l=úç?þ¸ùÑG¦ÇŽ}{ïÞú¿°´ìÁbá£ê?'99Yö’ÏçËR“yóæMÏž=é6ÝÈÌ̤_jii¡¦¦V«­8@àëëkkkËáp¼¼¼èN]]];;»“'OÞ¸qC]]ÝÆÆFN†FHOO÷ðð I’$Iccc‰D¢”=Ú±cÇÖ­[ß¾}K¿l0³œ½zõ¢}ûö%¢  àÝ¡äŒóæÍ &lÙ²å}Ž Ô ­P||zQQ™ì¥H$‰ÄGŽÜÜ»÷*A7n$9r‹ ¨êjÉôéËË«ÓÓóv^¾üìðáY7~¡¡Ñ˜ÛÖE"‰âSuï^Úºu§?ýtãÈ‘??gcÓûÌ™…OŸnÚ±ã+;»þ-ð‰¢-ƒƒÃ¾}ûèÓA°Ùìû÷ï×Ú†Ë妥¥ÑmºÁáp”ÀÖÖ6--mÛ¶m—.]’õ»ºº†‡‡‡„„L›6$I9(Š"Þ³àáp8gΜ¡5+•Jù|~ïÞ½?|_>þøã/¿ürÍš5ôË›œ)))t#))‰$I##£w‡’3~XXØþýûO:óáûøüh…""¶kǪYrˆÅR‚ 6oþëáÃ×÷ïg$AQ„D"yýºhæÌ?þþû±1;2r±"OȩӟÞº{7õ÷ßgÈߌ¢¨øøôÈÈÇ—.=ÉÌä››ºº~Âã íÓ§kãæmkÖ­[7lØ0·qãFccãØØØŸ~ú©Ö63fÌØ¸qcß¾}uuu.\ÈãñØl¶"ƒŽ9ÒÜÜ\Ö ¢´´Tvï»¶¶¶H$²´´´°°HLL¤§.**200˜:uêܹsŸë"'³"1V­ZuèÐ!’$çÏŸïââ2hРw‡’3¾¦¦¦ÁÚµk½½½>|Ø®];¥ì@ÛÅÐÕqÐT$逾ݺ-©ÿÏÒš/9œ¥Ó§¨¨¨nÜteeUsçúwë¶ÄÔÔ§¤¤²ÎmD"ÉI¾¾§† û¡[·%66?ýòË…/r>`/[ïá(êõë×îîîzzz;väñxôÙ€š÷áTWW¯\¹ÒØØX__Ú´iõÝâòn› ˆ€€€Zšâãã#""ºwﮡ¡amm}þüy{{û¾}ûÒã888 0€n×—áØ±cFFF;w¦×j£ûmmm555é›ìk“õWWW¯ZµŠËåjiiÙÛÛËVhpêTëÝüQþqS$FPP±±±žžž‡‡ŸÏ¯s(9/t»ªªªoß¾?ÿü³ü¸ A$õÎ÷/Pi±±©NN{ê|‹$Õ(JúN'©®®vîÜ’F¬ šš7cÆáW¯ %©š¹wï×S§~${W$’\¿þ"2òѵk‰EEe½{w2eÎØÔÉÅÅ… ˆ°°0¦ƒ4ž£££¥¥¥ì¢/h"¡¡¡nnnøù @܇ÐÚœ>ý@]½ö·wuuVÇŽíuu5ß½qŸ¢(©”š=ûˆPXù^ß;vëë×…‰” ’$OŸ~@„H$‰Šz¶hQÐСÿG×?K–Œõ½~}¥Ï”7­OyyùÝ»w/_¾ìááÁt–\¼x‘¬‹¯¯/ÓÑ Éá>€VE,–FD< ïº¡Ñ,7®¿‘‘n@Àº©E"‘fg V® Ý¿ßS‘Yª«Åkמ<~ü.EAɹvíùòå!W¯>ÏÍZXÍœ9ròä!ýû+í6wh™.\¸0sæÌõë×›™™1å&LÀY€6 @«rûöK¡°Jö²];–ŽN‡íÛ§hO™ò›TZ÷Ï|êêjb±4>>ýÅ‹œ¾}»ÉŸâõëÂY³þHNÎ}÷'H©TzãF’§çÈÉ“÷îs5m…“““““Ó)þ  U9sæA»vj"‘„ÅR“J)—OÖ¯whß^}Ô¨-$ù?[ª©‘jjj‰tð`®“Óðq㘙unpüèè󿫍¨®ó\Iª È]ºt¼²v§µ’J©üü’¼<á۷ʹÂÜÜâ7otLL„Lçh Pá´"‘äüù¿E"Iûö,6»Ó¶m®ãÆ bÓ¦ÈìlDB5 ›!CL¾øbØ„ ƒ¸\=E—J©Í›ÿÚ·ïñï#MÞE_¨VVVÕ©“†òvKUåç—äç—dg J²³ùù%99ÅyyœœâÂÂÙ•„:itë¦[ZÚžÙ´­*€ÖãÖ­—%%•$Iº»X½š§­­IÄß¿9p Z*¥Úµc‰ÅÒ!CL§L:iÒ SÓ†ÏØÈ…•ß}põêóom‰¤×¯¿˜IÖ™’",,¬8P¿S§ÆÃÏÈ(©®þ§’©¬”È–+‰¤"‘ôßÙ ÙY‹öí{ØØÌ”3àŽ;äÏøúuáþýÑÇÇI$”—×èw¿V‰Dš™Ùp C„¬n13ëlii^³†ÑÓëÔ¾½>Oãââp&”™™Ét€–´!\.×ÕÕ•éMhÚ4¦(FΙŠçϳwíŠ:wIß©RXXbd¤Ûè¹$iAA‰¬hyõª°¾FG§C×®u×0lv' ¦ýÄ´²²jÒñ¡Õàr¹ÎÎÎL§hÑPáó(Šºråùo¿E=|øJ]%•R²3E99Åò+©”ÊÏÖy&7·¸¨¨L$’Ð[êèhvíʦ‹–ÁƒMj]T¦©Ù®É÷³~Ë–-cpv€Ö0I,–ž>}÷î«))yêê$Ab±¤æ¹¹BŠ¢òòê­aøüòêê.ÓÒÒàpô躥wï®-ª†€æ ˜QY) ŒÝ¿?:7·˜ ‚ ÄâÚ7O««³V­ _¶,˜ÏÿoCCmmG·Ž]CCínÝt uºuÓ50Ðnº›v@% Â€æ&‘¹¹>ýtcaa)EÕût‚ ÔÔÈ= x¼!ݺ± µ9¶¶"K“@›… šU~~IJŠ^QQ©´„ÅR“¿è­D"577œ5˦Ù‪é|€Ú„BáòåËMLL444LLLfÏž••E¿E’dBB‚çRú€Š³ƒÍÀÐP»OŸ"+«¬ØXßÍ›¿üòc##‚ ÔÔHuõÚ'g$iV¿Ù²@+€s8ÿC*•Nš4‰$Éððð=zdgg}ºzzZ‘•Å‹K½w/ýæÍäW¯ ‹ŠJ™ ªW©ü   oooú§6›Íbýw•X,öõõ511100pww/,,¤ûI’ ær¹ÚÚÚ«W¯>qâ‡ÃÑÑÑñññ‘mX³ñ®GÙÙÙéëëwèÐaàÀ¡¡¡ALžŸÿî:coÞ¼éÙ³'ݦ™™™ôK---‚ ÔÔÔjµ'|}}mmm9Ž——Ý©««kggwòäÉ7n¨««ÛØØÈÉð;hjj*ë$Û¸OŸ>ЇP:T8ÿÃÁÁaß¾}ô‰‚ Ølöýû÷kmÃåré«Î‚ GYlmmÓÒÒ¶mÛ–‘‘qéÒ%Y?}¡ZHHÈ´iÓH’”“¢(¢þ£Á¤K²÷?55•n¼|ù’Pêx/¨pþǺuërrrx<^BBBNNΩS§6lØPk›3flܸ1>>>99yáÂ…<Íf+2x```zzzÍA¥¥¥‚I$‘Hdiiiaa‘˜˜èééIDQQAS§NMHHvww—“ÍfŸ={V(úc IDATùùÕœšÏç+¾ƒÓ¦Mñññ‰‰‰ÞÞÞŠ•EE=SÊPÐF¨ðâ§M¡K—.wîÜYµjÕøñ㫪ªÆŽÖ£GšÛ¬\¹²´´ô‹/¾¨¨¨?~üîÝ»ü믿077—5‚3fŒlƒøøø,Z´híڵÆ óõõ-..ž:ujbb¢ŽŽÎ¸qãRSSéuê˰k×®ï¿ÿ~ÕªU;wîüý÷ßéN[[ÛÁƒgeeéëë+²ƒï;>A³gÏvwwÏËË7nÜþýû?à蝹Z´¾~Ç'O6}ȀТlß¾=66–éТ………}È—“TÛLZ1⃿i2ËÑÑÑÒÒrÍš5L©$ÉøøøáÇ+¸}­¿ êß'~ÆÆ¦Þº•\XXJ’„š)‘PAXXÅĬj¢äÐü\\\âââFŒÁth‰233ãââ>°BÁ9P^^þäɓ˗/ïܹ“é,Ê!•’7o&߸‘›òìYVU•˜ÅR£(J*¥‚ (‚.o‚01Ñg4)(߈#Tú÷MÐtBCCÝÜÜ>pT8*àÂ… 3gÎ\¿~½™™ÓYêð^¿lËÏ/IJÒ/*êàæ¶ŸÅR“J)úË%黳Xj]»ê*-(´¨pT€“““““Ó)”ÃÐP»W/~nnuy¹Y~¾Pv5ZÔÕÕ23‹þøãF×®º]ºètíªkd¤Ó¾=>¼ ^ø€æÆbQNiHÈÿ]½úü—_.úè‡ – bò!ß«þyõª07WŸž›[œŸ_B/`MÔUÿ˜šv62Ò12ÒåpØM}ÿOxxøˆ#¸\n“Î-Axx¸‹‹ *©T:iÒ$’$ÃÃÃ{ôè‘}ðàAkkëääd &Ý Bø|þ¨Q£¾ýöÛC‡åææÎŸ?ßÛÛûرcLçjr¨p  ‰‹‹ûßUöÕ44¸=45{°X:EE§«ª^1N¥´oÏa³'²Xÿü"¢¤$IЫF“$AQ$I’ñ_¹˜‘sùòzÙK’d úÍÛ·H’¿Ð4I¦¦?°¼iœúG$’•ææ ÿýSL7Þ­tu;éüûG·f[YõÏÒ¥K]]]?|háH¿j!‚ð÷÷OMMMIIéÔ©A†††{÷îõóóSWWá_ë;ËÑDg?~ýõ×Aƒùùùall|èСáÇïÙ³GGG¡sãªKéÍ$,,Œ¢(Š¢D"É͛ɾ¾§>ùäÿôõ¿41éînwäÈ7|~2Š©ªÊJNÞ5a 55’$ ’T#5‚`‘$‹ X$©V³¼!âÆàš_.•Š<8¸wï×íÚ±ÔÕå}±X¬¯¾bòÁçíÚ±ŒŒt67nÀôéV>>¶nu=ztÎÅ‹Ë>Ü–¶õáÃ.^\vô蜵kyS¦ 13ë\\\qófòÞ½WçÍ;æè¸ÛÊj“™Ùò~ýÖŽý³›ÛþE‹‚üüÎ>|#2òѽ{i¯^Ê‚‚‚¼½½éòF†Íf³Xÿý¾@,ûúúš˜˜¸»»Òý$Is¹\mmíÕ«WŸ8q‚ÃáèèèøøøÈ6 ¬Ùx×£Gìììôõõ;tè0pà@ú€É“'oß¾Þ ..ÎÀÀ ¢¢¢¾ 5Ûtíjhh(ë—½+ë§(jË–-æææúúú...ŠïQΞ=ëáá!{9xð༼¼N:Õ¹k2r2DFFr¹\}}ý={öQUUµdÉ###CCÃ]»vÉ9nô—ÇÄĘšš9rDNf¥Pá"ཅ—.==wîñ­[/++EƒqÝÜ,y¼¡õ]¹òéêv¦••Õ~þ\YVVóùsennéÓ§ïËËk9=Fié>ø:?ýúéÄìˆ^MM‚‚çGÎe„F£áÓB/^ܲeˤI“BÇŽÓÓÓ«®®Æ‡`yzz*((,X°!´iÓ&N¹¢¢BSSsñâÅø8…æRRRdddð[FÆÆÆÕÕÕÖÖÖ«W¯.,,TQQ‰ˆˆ¸~ýúŠ+ZËЧOŸÞ¶mÛäÉ“BgÏžV¯^­¬¬lmmÍ`0jjj®]»öûï¿O:?ö1cÆðß¹»»;^YØ ‡è™JKk¢£_ÆÆ¾zþüC¿~’ææzG:™˜hËÊJ‹:ZO£©©çyôhüáÃ0 qžKÁÑé¬7žgf››ëÍž­;j™§·£  áêåþŒç½†rsKõõ·.^l¸téÔAƒZî*tSŠŠ2ŠŠ2#Gª4‰Íf—–Ö––VU•”|ûÿýûŒÎ €‘H¤¬¬,###üGV__O¤Æ‘ŸŸ?tèP¼Œ tttB222!111žrûUVVîÙ³'111;;[[[ß(++;sæÌ¨¨¨Ñ£G‹‹‹óÉÐyyy‹-âZVPP€·Þ#RWWÏËË355å>¨þýû·xhíÉ€ŸN»EEEœ·s |v>xðàöžˆ7¾=JCCSLÌ«Ÿ¾h`°= VQQæÔ©%/_n;vlÑüùc¡{#$„ß~›sýú*YÙ¾<ÔKI‰ÇÆn°°Ð»}ûµ…Å!==ÿuë®Åƾª­mä~û¡CŽ{öØbÜ¿°ÅÄÄ?ö^³Æ4*êù„ ÛN?x𶵯${ Ô•ûëêªÎœ©ãä4ÙÓÓ|ï^»úú·¢Î@§²´´—¾ÌNii)ÿ·ù‡öã=ŒÝ n÷zž/>Þ¼ù"6öeYYí„ VVã(”1JJÝõ‘ôžç￳W­ºRQQ÷òå6eåVÿ\¾~¥S©yññooß~U\\=dˆÂÌ™º&&ÚÁÁIIIÙoÞì””láyÑââªÓ§‚‚’dd$W¯6uv6êׯç/ÿ‡aXXXÿõp.^¼èëëËY?‡»'Ýt xî¹§¸[Òú!<UTTD"‘òóóÛ³Öj›‘ÚyÆZû³®¨¨‹}A}ùò“˜b2‘¼¼tzúÎ6ƒu5vvv!Îô\Ý‘µµµ¨ƒô@ááá?ØCQj€îäË—ª'þœ6m…räùókÖ˜Q©[nÝr[¶l*toº#£a{{xÌæÓ½AIIIkïØ±àùó­qq¶¶ž<Érq LMý ¯¯ŸÎý¸ÇÀ²[·Z¿zµmåÊiÇŽý1nÜïþþ7KJj„v4ݬòãë‡ðÀ—ljjâsÞð%>¸#ñ_lä{••Õ>¦PŽŒåïçwãåËOl6›Éd#_R‹@}}}JJJ||<÷ƒø¢‡µÄÏÏOÔÑDçï@' ÑêΟdn~PEeƒÁö'þ(,¤‰:–ÊΟdoJMÍCCc£½ý©óç}ùRÕbåòòÚ={îhk{î½wïÝÊʺNNÛiP;F©ÉÉÉÅÄÄðÙ•Jݽ{÷СC“““333ÍÌ̬­­9¯R(”²²²ÈÈH„М9s8e|ŒJPPPnn.w5s2|øðÕ«Wçåå}ùò%00PRR²±±ñò分†x…õëׯZµŠOîQFx™g#Ï 6›}üøñaÆ%%%eggS(Îð§6ˆÏYÂËÅÅÅ‹-ÒÒÒb2™|2=yò¤¾¾ž©ÅóÐâk-CXXXMÍ×ððg66'TUÝI$w2ÙCEeϺº¾mî­ jÿ(µ.(22RFFf÷îÝ¢ÒcÁ(5@Ï—‘ñùêÕ¿oÜxÞÐÐdj:ÒÑqÒÌ™:<³užª°†¯e”œœƒš0ðq`à11ì·ßÌ/6êyIÚ3JMBBâÑ£GœÙuyÖÁ‡H999ùùùáÿ¾}ûVOO¯ªªjÀ€†%$$LŸ>Åbîrk«š¹ªªªâ¬ƒ‘••5|øðÒÒR ‰Aƒegg«¨¨¨©©á뇴–{@^ns”š®®®¯¯/þÌ÷çÏŸ\]]---Ý#Bÿ?U†acÇŽ½téÒ˜1c´µµ[ËakkË©Åó€K›£Ô˜LV¿~êkÒÓ+ëë›ÄÄ0žYÔ¹ÉÊöõõÏgo]Ó•+'‰ÄÆn=J @F©Áz8€®¨±‘óòêÕ¿Ÿ?ÿ ®®èæ6ÓÎnâÀ\@ tSªªrË–/[f\]ý5!!#.îÍž=wüýoŒ¯>wîèyóF«©Éã5ee¥==-Ö¬1;}ú¯;bOžüËËk®­í„ÖVí©`ýܬ‚JHH;v,BHJJJJJ ßÈ'só%>ø/6‹žzõoYÙYÏž•p¶ð©Ï`07mú¡!p"¡  C$¶0A kÉÉ) ú;<œZW×8gΨM›ÖLªÕÛ>§HYY³²Çd²ž?ÿûúìÙ‡Û·Gã3ÌŸ?fâD ä¥ûxzZ89MÞ½ûΆ ׯ\IܶÍZ__]Ôñ;¾~È’%Kð»D"ñÉ“'##ƒ{ý3°;´~ÈÁƒ­¬¬ð·WUUµs¾àÖÈÈÈ4ߟÌÍ{M­‡6‰‰aË–Mýùgã#G.1ƒBBRŠŠ*%$Äéô–×{•””xÿ~oû­‹Àg@x`¦@—À`°bc_YY36Þ˜˜íãCyófç™3.ÆÆÚн‚˜æŽ ž?ÿýÖ-7 eìŸþcm}|òäþþ7Ÿ=Ëe³Ù**ÄcÇݹ³A\œ`iylÕª+……-¯>ÑóÀú!?¾~HkÚyÞðH?¾ˆŠŠ´§§>“Ê’%F²²}1 áKE®¯{­ªÔ3ýàs<ðƒêê/_~jl¼‹Dr_¼øì£GïX,–¨CîäÝ»¢îMºKEeƒ¾þÖÃâãÓét&“É M;ö÷#|BCSºûß+ÔŽ™ذ~ȯÒÚ«í9oœH?¸Hó?ëÆFz||º«kºúo$’»ªª;Ì4Е¡.°ªR÷3 º·ÂBÚ¥KO¯]K¦Óöö—/7:TYÔ¡@7–™ùåöíWü“––/'×oÆŒ‘óç50Ð0ð±¡á°}ûì‡ QuÌjÏL]¬Ò~|þ¬i´º˜˜W‘‘©/^|d³a=œ.ª+¬ªÔ}Áz8€îêíÛµkƒ wÆÄ¼ts›ñâÅÖ]»l¡{~Ððáƒ<=-ââ<’’üÜÝgüX¾té…É“w–•ÕnÙbI£Õ™™í»pá1|µ×É`ý’“ëçâ2%6v}JŠ¿Ï<=½¶?1‘ë «*õ60Ó ó0™¬7ž_¸ð$--__È… ?Ϙ¡#&Ù2DaÅ “+L hqqobc_EE=—””PS“Ûº5úÎ×ÇŽ-&“åD³·¸wïÞÒ¥K·lÙ2dÈQgùÆÂ¢»wtÉd¹µkg¬];CÔA@JJJ<<<´´´ÔÕÕ÷íÛ)''·fÍš+Vܼy¯æã㢯¯/--ßÙ:uª©©i```ß¾}oß¾íììlmmݧOÑNw=@g`2Y11¯NúëíÛ‰5®\Y1s¦L!„L–û:>”ݹóúÎ4‹ýìYÞ”)ÎÎSüýç÷é¿…ÎÆÆÆÆÆFÔ)èT'NÄ øªJbbb/^ܲeˤI“BÇŽÓÓÓ«®®0`BÈÝÝ}êÔ©Ü{HIIᬪdllÜØØX]]ÍgôàWv€p±ÙìÛ·_®ª*ga1ÊÁÁ@OOUÔ= ¾ªÒˆ#deeù¯ª¤¨¨È½ªÒ®]»B0J­`.5€€=xðvþü£«V]QS“]ö¬ to@×4dˆBtô:sóQ!!ÉsçŽ~øÐËÑÑ௿2fÏ>0}úÞƒã>}*uF@ÏáååõÓO?-X°ÀÐÐPYYùÒ¥KÍ똘˜Œ=º¢¢âìÙ³'Nœ ‘H¿þúëÒ¥KÍÍÍ­¬¬:?s7ëá&11{ïÞ»©©yS§joÚd1a‚†¨Ð.§O'ìÚu{Õªé~~óY,vrrÎÍ›/îÜy][ûuÚ´á¶¶-,FIJŠxÔCw_´_ÿ³îñëá€!õp`”@²²¾ìÞ}'>þ­®.éÊ•³féŠ:ßaÍÓaÔùårUUÃÞ½vFFÃŒŒ†íÚe“qãÆ‹ B¤¤úüô“¾££Á¨Q¢\~ÄÁÁÁÁÁA„ [€à‡TTÔ8p/88ISSùÜ9—¹sGÃڠ;š5K÷Â…e+V\ª«k2J z8€ïÆb±CB’º_SóuÆY?ÿlÜ·/¬² zˆ„„wË—_´¶èc‹êë›bc_]»–œššG" ìì&ª«ÃG´ôpð@RRr·n½•–V`c£ïãC4HVÔ‰$SÓ§O;/_~QCCÑÍmfó ÒÒ}  ²²¾\¿žrõêßGŽ<˜4IÓÁÁ€BÓ¯ŸdçgÀ f‹´×Çå.. —””¸sgñc‹ {z$ss½}ûì÷ì¹NåSM[{Ðï¿[½~½=4t5™,ç㥫ëçâûŠÁ`uZZ<à m M§O'œ:õWÿþR‡9ÚÛˆ‰‰ø‘›ððpÑ"Ñióç:9M~÷®hãÆ0IvêTm>5ÅÄ0ccmccí;mîß™ºzõUeåÊ'§É°t>xІˆj@@lC}ݺ™Ë—›HIIˆ:BÁ¬½SgþÎb0XÎÎçß¼)øãßüŽÛ•oÞ„…=»yóEUU½‘‘–­í„9sFõï/%¼¨t/ðàfWa!ÍÏïÆýûé³gëíØ±@MM^Ô‰þÓãWÄ<ò;ï{UW5k¿¦¦RHȪïíTÓéÌøøôðpêÇï±Ù³uúIßÔt$̽€]dd¤¨S€. f^c#ãÀ¸s窫+FFº u"D`À©sç–ZZ=}:á×_;뽄yóÆÌ›7†F«‹}}óæóeË.ÊÊö?¬¥å¸É“5 xôRøm„îáx=|øÎÇ'ª¤¤ÚÛ{ž‹Ë”®ù•3ÜÃémDrwøpü‘#ñwïºëêªþÈ~ i7o¾¸yóEFÆg ‹Qóæž2E«kþ€î z8€ÿUz{G>xðvÆŒ‘;wÚ ¢ êD­‚No#ƒÁ²¶>öõ+ýÞ=ôF>®¼{7íÁƒ·IIÙââccm eŒ…<«‚·È!Äd²›šîýçŸÏW®¬ ZÙ•»7t&qq±cÇeg—\½š(’HÄ+LÂÂÖ$&úzyÍ¥ÑêÝݯëëo]¹òrx8µ¢¢N ­@¯ÏáPfæoï*5ÏÙÙÈÛ{Þ€}E€®ESSé×_Íöî½;þ8eåþ‚Ú­ššüªUÓW­š^\\—þàÁ[/¯pƒ¥¯¯>{¶îÔÜqÀ IDAT¬YºZZÕô0J €^Ng;öDZcttH{öØ£&êDí£ÔzŽRÃ}ýJ71Ù=mÚˆýû…ø·ŽÁ`½xñ!6öu\Ü›ÂBš¢¢Ìôé#fÍÒ53Ù¯Ÿ¤ðÚ€žF©Ð{%&fO›¶çìÙ„€›»wÝ»Q÷¦ýª««ûí7555III55µåË—â/a–šš*À¶¾Ã®ÐbçT—%%%±qãœÐДŒŒ"áµ"..f` ¹cÇ*uKB‚תUÓ?~,_³æê¨Qþ§W ¯uè ‡@oT[Û¸iS¸½ý©áÃ=y²yñbù€&‹Åš;wnJJJdddAAÁíÛ·¥¤¤ŒŒŒE tK¶¶F&ïÙs§sš>|«ëŒèèu¯_o߻׎H”޷﮾þ6 ‹CÆ¥¥åÃ( h<‡@¯ŸîåÙÔÄ8sÆyþü±¢Ž#D—/_ÎÉÉÉÎÎîׯBHIIéäÉ“ââÝøÒ‡aXii©¢¢b;·Â0lÓ¦¹ žyñâãøñC:­];»‰vv¿~¥S©yñño¯]K>xð>™,‡a›6mxŸ>Ýøo5Üà¡ÑêV­º²té…‰Õ>ôêÙÝ„еk×\]]ñî ‘H$þ›ð—Á`øùù©©©)**:99•——ãÛ1 %“Éýû÷ß¼yóõë×I$Ò€<==9‚ƒƒ¹ ͽzõjæÌ™òòò}ûöÕÓÓ GÍ›7ïСCx…äädEEņ††Ö2”••q—ñ[mJJJœíœW9ÛÙlöž={444äååíììÚDm⿇–N§{zz*++«ªªJII¥¦¦¶–°[˜6møÄ‰‡ßIëRRÆÆÚø¶7ÖZZŽKJÊqq ?~ëÚµÁ‘‘©¥¥5" ] Ð;Äļ=ÚìØßããÓEEBaaaüëÈÉÉÅÄÄðÙ•Jݽ{÷СC“““333ÍÌ̬­­9¯R(”²²²ÈÈH„М9s8圜6›”››Ë]ÀwÈÝÄðáÃW¯^——÷åË—ÀÀ@IIÉÆÆÆË—/âÖ¯_¿jÕ*>JKKyÊ<9-r¶?~|ذaIIIÙÙÙ ÅÖÖ¶GÄç,µg-l@@€––ÖóçÏß¾}kbbB ¨Tjk ù ë"¿³°{÷í¤¤l:)êh ]â·@¨**j×® VQÙ°bÅ¥’’jQÇŒöôpÄÅŹ߂£Ñhì?»kii]¹r¯žžŽªªªÂ_MHH`³ÙL&“§ÌÓáÞ?ÏK••• /gffâÊÊJ))©‚‚&“I"‘=zÄ'Cz8:::×®]Ã7„ºººŽQó&øì¡ÅƒÕÒÒºzõ*¾1-- ¯ÙZBþºN‡Åb͘±ï—_.‰:/ƒùúõ§î™›$‘Ü546ÚÛŸ:qâׯ?‰:t*¥@wãÆsCÀääœàà•çÏ/URØR]‰DÊÊÊâüH£Ñ8©qäçç:/ã…‚‚üG„˜˜O¹ý*++ýüüLLLH$ÒÊ•+ñ²²²3gÎŒŠŠzüø±¸¸¸±±1Ÿ ——·hÑ" Ã0 SUUe2™<">{hñ`óóó555ñ²––V› » Ã\]gܽ›öñc×_G ˆ­æéiç‘–¶ýèQ§!C[X;v˺u×bc_UW7ˆ:&ôpè±êê7m ws»6}úˆøxO3³‘¢NÔÙ,--O:…ßd@‰ÄçÏŸóÔ!“ɹ¹¹x/H$A011ÉÍÍÝ¿ÿ‡îßÿïÉ {{ûÈÈȰ°0GGG Ãød`³Ùè;;<$éÖ­[ø—X,‹F£ikk êˆøhñ`UTTòòòðrNNŽh …2fà@Ù+WžŠ:H«dæÏ»oŸýóç[ãâ<~ùeZqqõÚµÁºº~‡n?{–ËbÁTl€ž z8ôLOŸfMŸ¾÷Áƒ‚‚~9sÆYN®_Ûïéqüýý‹ŠŠ(JjjjQQÑ7¶mÛÆSÇÅÅeÇŽT*5++ËÍÍB¡‰Äöì<88ÿìÎ) „jkk+ÿÅd2étº––VFF†³³3B¨¢¢!dee•ššêääÄ'‘HŒŽŽ®®®ànšF£µ ßîìììçç—ššš½råJSSÓï9g×âÁ.Z´hçÎ/^¼ÈÈÈÀ'$À0LT HB‚°d‰aHHJ]]WŸy\L =ZÍÕuFXØšÔÔß^8t¨RhhеõñI“vlÜ~÷nZ}}“¨c€@‰l|@8êê7n #‘Ü—/¿XVV#ê8‚Úñ›Íþôé““““œœœ´´4…BÁïp?‡ÓÔÔäå奪ª*//ïèèØÚ#.ÍË¡   ž7*•£®®.))iddt÷î]ssó#Fàû±´´ÔÕÕÅË­e¸zõêÀð¹Úðí&&&RRRååå<Á8Û›šš¼½½Éd²ŒŒŒ¹¹9g6¨µóÜæ»øìׯ_׬Y#''§¡¡ÏIðúõëÖò×užÃÁ•”Tò[pð߂ڡ­­­ðçÿ‡@•–%/o5hÐZA¦3›!¨¿xôHÖ  yý:ßÍ-¸¬¬vï^»ž=4†aaaaööö¢ÒAÖÖÖ>>>¢ÒyÞ¾};jÔ¨ÒÒR…¼=<<ÜÁÁ¡KýÎZ»6øýûâû÷Û;Ý6vvvîîîÙ[û}ýÊ”’"´]tIIIGŽéRÿèj`0z:¹oß½³g¦O¹VY¹Í(нÔ×׿yó&>>þèÑ£¢ÎòM\\Üœ9sšo÷õõݹsçìYWWwÞ¼yþþþuuuþþþfffëÞtMË–M?ÿèóçõõ³ú'™Lî¾vЙŽ9"êtiÐà'ÈÎ.Y·îÚû÷Å»vÙ.Z4_ÿtM÷îÝ[ºté–-[† ÌÇâgaa!¤ïƒÃÂÂÖ¯_O"‘Ølö”)SÎ;'ŒVDE__]OO58øoAõpôpèöÂé~~QJ·oo>|¨ã€6ØØØØØØˆ:E'ÑÓÓûóÏ?EBˆ.œp{Û¶H‰: €o`.5º±ê꯿þäáq}Ù2cèÞÐùll&bEuÿÝÕÇïŒw½zõ)6vÃæÍó$$àYa:Û€RvvΟ }@×=º:éïsÑ¢sÆÆÚ÷ï{Ž7Xԉ轖.úñcybâ{Qð ôpèf>|(³²:šräÈÂ'÷ï£ÿ%míA“&i^¹òw§µX]]ýÛo¿©©©IJJª©©-_¾¼°° ðÔÔT¶%ðv…|}}‡*%%5pà@ …’œœ,Ô f ;‰ŒLõñ‰ÔÐPŠ‹ó:TYÔqDìðáÃ?² «­•¨©‘$‘j`þ¹.®  @ÔZåâ2ÅÍ-¸¨¨RE…(ì¶X,Öܹs1 ‹ŒŒÔÔÔüüùó¹s猌Œ²²²$%%…Ýzϰnݺ¤¤¤‹/Ž9²ªª*<<ÜÌÌìË—/ u4€`@€î¡ººaãÆð;w^»»Ï^·n55RUUµµ}ØlL\œ­¨Ø )ÉlB Xd2¹ÃèÂ6wîè-[ú…„${zZ»­Ë—/çäädgg÷ë×!¤¤¤tòäÉ€€qñnü ðÒÒREEÅvnÿAQQQ!!!Ó¦MC)++ûúúºººâçÐC°]Þ?ÿ|61Ù­£ã{ï^š¨³t?L&ëõëOçÏ?Z¹òòر[TT6¨ªº››ôó»óòË—JQ=Áž=wÆŽÝÒÔÄèðlmmmmmÛ¬fff¶cÇŽÖ^EQ©T:îëëK&“.\XVVÆyõúõ몪ª222ÞÞÞ!!!***ýû÷÷ððàT â)P©Tî&^¾|9cÆ 999)))]]ݰ°06›=wî܃â’’’êëë[ËPZZÊ]æ| Á·sZäÞÎb±vïÞ­®®.''gkkÛþ#jÑÀÏœ9ÓÚ ä‰×ÎóƧB‹g ×ÇÕÔÔB|õêÕyyy_¾| ”””lll¼|ù²¡¡!^aýúõ«V­â“¡Å.÷FN‹œíÇ6lXRRRvv6…Bᜨ6¨Eû÷ï'¶¶¶W®\),,ä9-Æãß ÿ -ž1ü]FFFOž<9}ú4ÏÙk-9z8´ þ…ÐuÑhuK—ìyþü#‹%ê8]]~~Exø³æMÛC&{¨¨l˜8q››[pPÐßïÞÑéLQ=Ü’%çlmOtøííìላ‹'&&r~äÜè Ñhì»ZZZW®\Á+¤§§#„ªªªðWØl6“Éä)ótc¸÷ÏóRee%ƒñíVUff&Þ ¨¬¬”’’*((`2™$éÑ£G|2t ‡£££síÚ5|caa!@¨««ëØáÝÝÝG…aØøñããããyZä‰Ç¿þZ Y%¼V,--O:µdÉ€"‰Ož<á©C&“sss§L™‚ÊÍÍE‘H$A011™ä“H$FGGÛÛÛp7M£ÑZœ3 ßîìììç秪ªJ$÷îÝ›ššúòåËï=uvvvžžž’’’£G®¨¨8|øð¤I“´´´øÄû­1î:Z;cÕÔ|ŇŸhÀð3ÐüñÇ?..11ëôõÕ¿ëvvv¡\ÄV´¬­­ |||D¤[jÿÙ wpp€Ïoð£Ô½úú¦M›ÂoÝzáînîî>[L¬·ŒL«¨¨KL|Ï=üLQQÆÐpØÆs`øè¦fÎÔ13±ysd\œgïù·\__ÿæÍ›øøø£GŠ:Ë7qqqsæÌi¾Ý××wçΟ‡.xöèî ‡@')-­QT”iþ\MFFÑŠ—êê¾FFºöø9ÓØlvVV1>U•š÷ñc9>ûÙĉ®®f0ûè~ÿÝzÆŒ}QQ©vvE¥“Ü»woéÒ¥[¶l2dˆ¨³|caaÑ]îrtÁ³@w£Ôè l6ÛÆæä´iÃׯŸÅ½=,ìÙæÍ‘£F‘Ïžu4¨g~¸ojb¼zõ‰JÍÇŸ•–Öp?;vpÿþRmï€nÅË+⯿2ž<Ù,%%Ñηô€Qj sÀ(5Ú÷pè ááÔ””œ””]]Õ™3uBt:Ó×7*88ÉÕu†—×Ü6‹F«{úôý³gyiiùéé… Møð37·™0ü ô7Ή‰yµoßÝ-[¬Dzèá tÅÅU¾¾Ql6†Z¹òòÝ»î22R¿ür);»äÔ©%ÖÖãEP023¿p?Ã0lÔ(2g¥š!CZ]J€žGQQfï^Û5k‚LL†OŸ>BÔq wB·uk4ÎDˆb0˜‹Ÿc0XRR7oºéé©¶ùö.‹Ng¾|ù~öúõ§’’IIqM[Û 0ü KËqwï¾ñðMHØ$++-ê8Ћ@áú㢣ÿ[™ŽÁ`•”Ô¨©ÉÇÆ®“——I¤úú¦›7Ÿ/ZdØ÷VUÕ?{–÷ìYÞ³g¹oßÖ×7)(È [»†ŸÀk÷nSÓ½¿ÿ~ëÈ'Qg€^z8> ´˜Æbý÷H(ƒÁüø±ìܹGÞÞó:?ÒŸþãéJ£ÕÛØLhç3П>•§¤äâ÷jrrJX,¶–Ö@~@ääúج\yÅÌLÇÒrl›õ ÂÃÃ;!èÖ’’’D€®z8ѱcJKk¹»78‹}üøŸ::ªíùÐ#(%%5›7GÞ»÷/÷êÕ§Ö&§Æ‡Ÿ¥¥àÏÕWãÃÏæÏÃÏø.óæY½zúúõ×ÔÔäÇÌ¿rrr²ƒƒCç€ f‹@XrrJLM÷1ÌV^Çúö•¸ßsØ0ea'a2YgÎ$ìßÇb±ñ<sî©«««¿¦¤äàÃÏþùçs]]#>ü ŸÖ†ŸÐa,{Ù² iiù÷îyôÔIá KBÁf³,8ñòåG:½…NŸ>„¦&æ°aÊîîæ w.µ´´üõëCÞ¿/澕„a˜‰‰öþýIIÙ͇ŸMœ¨ÃÏ ÚÚF åHÿþRQQ®}úÀè .èá ÁÁIÞÞ<ãÓ$$t:sÈ…Å‹ ­¬Æ“ÉrBÍP_ß´k×Ë—Ÿˆ‰a ‹çUqq1&“-&†¡b` 1a‚††ªªp#Ðkef~™?ÿˆ¥å¸ýûí1 uèÉ ‡€àWM™²«¾žŽ?ñ‚wld'ÙÚN>|P'dxô(ÓÓ3´¤¤¦õarhï^» ôed$;! !áݲeœœ&Ø@'„î• x·ëë›ÄÅ L&KB‚`n>ÊÆf¼©éH B'´^^^ëíy÷n†¡æ“pà÷p {@§15qõê —À†úÁƒŽbbÐÉ¡ø¿{8III‡a p†††¢NñÍ¡C‡z×UURé銆de¿*)Õ+(|%xGˆ OYYßÜ\9:½íY1+«q'N,î„TÃÎÎNÔ€€EDDˆ:‚à=z”¹tià‚ú8@'„áÿîáäççGFFÚÚÚŠ* ¬äädQGø?III=ÒÑÑu!b³±ââÁÊÊ224qqB¨¢¢óZojêSSCèׯ‚N—`0ú44 1±¾øKbb˜¸8ALLŒÁ`âãÖ˜LVbbvç…¾ÈÈÈÉ“'“ÉdQPPPÐÕ®`‚2mÚð'¯Ysµo_‰;~‚N\ £Ôzäwf½SüJ[GGgëÖ­¢NÑ[˜šš†„„Ï.*ª,*ª,.®.,¤}ùRõéSÅçÏ•uÅÅUEE•**DQ'www{{{Q§ÞƒW†™7oÌÉ“KÖ® .)©9~|Q;×ÞÐNð=€‘Ér­MÚVZZ3`@ßNŽ@ÍŸ?VN®ßŠ—lmO^º´\I©¿¨@ÏKøÐ{))õ—”„¯9©SµnÝr+)©¶°8”––/ê8Ðs@#Tââ<‡dm}üÆç¢Ž=ôp‘‘—ï¼ÒÕÕlݺkîî×kkEº=èá¢$&†yzZÄÆnHIÉ>}ORRލ@÷ÖÁNuuõo¿ý¦¦¦&))©¦¦¶|ùòÂÂBü% ÃRSS—a-`?¸7 ÃÊÊʾkŸ?E?ŽF««©ù*êÿ©¯¯?}ú´½½ý¬Y³ìíí÷íÛÇ9ɦ¦¦™™™lKà;ì‚-¶éÓ§rQGè<|ùêäìÐbó& F‹WBð]Æ|ÿ¾§‘Ñ0[Û“þþ7ét¦¨@wÕ‘‹Åš;wnJJJdddAAÁíÛ·¥¤¤ŒŒŒ…roö/„PBB^7nœ0Úêmêë›nÞ|áì|~ìØß³³KDç6›íåå•‘‘±mÛ¶ˆˆˆÝ»w÷éÓÇÕÕ•N§‹:ZOóáCÙ‘#ñÆÆ»E¥“tòå«— AAAýûÃl`?ª©cÇíßoýz²µõ±ŒŒÏ¢NÝRG¦Qº|ùrNNNvvv¿~ýBJJJ'Ož ʤLDâ‹uÈÈÈpÿØ 0 +--UTTì¦ûoÎ|øð]TÔó¸¸7t:ÃÄX,Vgà/..îóçÏ×®]“’’B‰Ä 6¬X±‚@ ˆ:ZÇ™ššÞºuKVV¶Û…ª¸¸:&æeD5=½@c2YššJ@„:ùòÕ9Z»ŒtÚåðŋ »•ÞÃÉi²‘Ѱß~ ³°8´zµ©»ûlX0¾KGîá\»vÍÕÕÿ|ÀA$¹?€2 ???555EEE''§òòoc`0 %“Éýû÷ß¼yóõë×I$Ò€<==9‚ƒƒ¹ ­Á0ìÑ£Gƒ^·nÝÌ™3åååûöí«§§ΩK&“åååOœ8o¤R©†††ÒÒÒêêêÿ}oýêÕ«æ;Á0 !¤¤¤TVVÖbÜ7ÔÕÕ‰D¢­­mIÉwBØlöž={444äååíìì8'û8ûo­r›g¬ýètæƒoW®¼¬¥åµté…{÷Òššl6êRÝ„Ѓ¬­­ñî ‡ŒŒŒ˜Ø]™Læ… ìíí­¬¬vîÜY]]o755ý믿ìììæÎ{þüù?ÿüÓÖÖvÞ¼y§NâTxðàw¡¹ììlOOOKKKssóeË–=|ø!äííÍY ÷Ÿþ±²²jlll-CUUwÙÔÔ!dmmÍÙÎy•³Íf‡„„,\¸ÐÒÒrëÖ­í?¢ö+)© ||pwwwvvnjjÂ+œ>>zzzÜ…æ¶oßN&“Ï;jgg·k×.ƒajjúèÑ#¼Â_ý5mÚ´¨¨¨Ö2ðHHH@5¿W Þfx IDATýýÖ­[wïÞõ÷÷?sæLSSçón›GÔ¦êê¯ÁÁIÊ‘qã~ß¶-úÝ»Ï!ƒ…ÿõëmD~ùjñJboo‰W µµµ=zôhkxp_FZÛ.¼ËK‹x.¼m^ AkæÏûÇõõ‡¬XqÉÕ5èË—ª¶ß c£Ôjjj8?âß"„h4gÙÅ‹·lÙ2iÒ$„бcÇôôôª«« €òôôTPPX°`BhÓ¦MœrEE…¦¦&g¨C{Æ<¸»»O:5--MFFÿ ÖØØ¸±±±ººÿe¿zõjeeekkkƒQSS#))YYY9hРAƒýôÓOåååœã)))­í¤Í =z4BèÔ©SãÇÇB>}zÛ¶m“'OF={vðàÁõõõÒÒÒ- ŸÊüÏŸóÓÐ QV&=qâö¢¢J|0B¨µŽÍ½{oÞ¾-lóœÿˆª*©¶+!T__ÏÝÀot „bcceddðò½{÷\\\FމZ·nݲeË8§ËÞÞ~À€ÆÆÆ!GGGN¹ººZEEeÖ¬Yø8…æNŸ>Ý·o_ü–ÑèÑ£étz]]ÝÔ©S:TVV¦  ððáÃ-[¶ìß¿¿µ ½lÙ2„§§§½½}cc£¤¤d›GÔÚ –¤¤ÆÕ«ï½¼¶45Ñ1 c³ÙLf˽šÆFFppRÇ’w}úÚ¬#òËW‹WkkëÕ«Wª¨¨DDD\¿~}ÅŠ­eèa\^øà¹ð~וð8p@`à²Þþþû-cãÝëÖÍ\µjzŸ>ÝxP%t‚Ž\%I$RVV–‘‘þ#F«¯¯WUU宓ŸŸÏù/àŸÞð©øÇGîr <!TYY¹gÏžÄÄÄììlmmmî x*îýŸ:ujýúõ‡655]¹r%ç(øì¤Í Æ à #FŒ@q¾YÏËË[´hÑ¢E‹85 ZÜ9ÿÊ;cÏžåfgËUW÷A¨µc0Ò‰´¹Ï¤¨ØO^¾íj ùùùºººø±±±¶¶¶ÜuJJJH¤ogñBiié!CB}ûöEÿ~rå.·_mmmHHHzzzaa!™LÆ7öë×O__ÿñãÇšššaÔ¨Q|2tÀ—/_vîܹsçNΖÒÒR¼õ‹Å¾{7GVvÆ‹ßF.ñ¿cÓÐдiS8Ÿ ÝBß¾ÃÛ¬#òËW‹WYYÙ™3gFEE=Z\\ÜØØ˜O†øå…?ž ïw] A‹fÍÒ6møùóŽ}pýzʶmÖ³féŠ:t]éáXZZž:ujÉ’%ø×D"ñÉ“'NíÀù,(@øoP“É“'ïß¿ܸql6›ûùæ-,,>~üøúõë›7oNŸ>=//ßÎg'mVÈÎÎÆ?‰fffb¦¦¦†o'‘H´²²B±Ù쪪*>Ó$|Wåö00Ð5ª„Á³±Ùpýzò«Wùââ:‰PËŸtïÜq7nð´Ø&;;»ÒÒ¶«M™2%::zöìÙœO]iiiþŒ3û”Ü_Ìÿ uëÖéèè¬^½ZKK‹ÍfÏž=ß>}úô;wî|üøÑÌÌ Ã0>8„Úߨ‚‚¯¿þŠÿ“a³ÙuuuœV &†YZj>¼òÈ‘KµµŠ×¯'WTÔ‰‹Œ–ïà‰Òéé;[|©Á0 ¡6F@‰üòÕÚ•ÄÞÞþüùóŽŽŽ†ñÉ€ÿí*((h£¿¼ðÇsáíäÖ{ª>}Ä]]g,ZdxðàýåË/ŽEÞ¼yÞÔ©ÐQ€tä»:ÿ¢¢" …’ššZTTtãÆmÛ¶ñÔqqqÙ±c•JÍÊÊrss£P(íü•Œ÷:8…6Ñét--­ŒŒ ggg„PEEEk•ÇŽëíí=xðà &p¼à³|ÔŸ ÞÞÞoÞ¼IOO_³fg䛳³³ŸŸ_jjjvvöÊ•+9£­xàûogåï%.ÎZ¼ØðÎ÷”ÿM›,† ‘G‰‹wé•^ËËË7oÞœ™™Y^^þäÉ“+W®ðÔ177 z÷î]AAÁÑ£G ÛÙxðàÞáB µÿb±XL&säÈ‘d2ùãÇ»víBÕÔÔ „¦Nš™™ù×_Íœ9“O™ÄÄÄúúzžgÍñ4‡o777¿páBfffaaáÁƒÝÝݿ眵JEEÚ×—’–¶ãÖ-7ié>†„.ý@¨:ÿòU[[[ù/&“ÙÚ•ÄÊÊ*55544ÔÉɉO"‘]]]ÀÝ4gp,!]^xŠe!]Üz'"QzÇŽwïzÈÉõ³·?½té…wïÚõ<ô*¹‡£¬¬ü÷ß{{{Ïž=»±±ÑÌÌ,""‚gĶ——Wmmí‚ fÏž}üøñvî|É’%AAAœB›o9{öìºuë|}}õõõýüüªªª¬¬¬222Z¬¸aÆ3gΨªªq¾tom'&&&£G.,,äÓʺuëæÌ™S__?wî\Τm¡Í›7744,X° ²²rÊ”)QQQÍópößžÊ?‚L–suáê:#3óKddjhhJyy-Ÿ/õEˆH$ž8qâܹs7nljj?~üÖ­[ñ} .lhhð÷÷ollœ8qâºuëÚ¹ó]»vùøø¨¨¨p !îîÄ™3g<<<Ž?¨­­½dÉ’ºº:__ß+W®HKKëëëþü5ÔZ77·3gΜ;wÎÍÍ-&&ß8zôèåË—GFFò¬ÂÙîääÔØØèïï_[[«§§·}ûöŽž¿ˆ‰ašš;wþôøqfx85.î ~+€Åê]ó tþå‹û=•JmíJ2`À€Y³fåääà!´–áØ±c7nôöö>zôè™3gðœËˆüÿÞå…ç &L˜À§²°/n=XRRR~~~‹/YZõôtoßþ8cÆ>SS’¥eÇÇ‚îÂÞÞ^ÔèN0îÑùááá½s†¥ÉÎÎ!Ä™ã˜gIœû÷Ó±;k”ZéÖ­[…ÚŠPùùù9’û‰‚®ÌÔÔ4,,¬Åß‹%%511/##©iiaššŠOŸút~BÁÂ0¬µãí¬­­ ||ºý„@Àï#„g’½ÖHJªc˜Ø×¯Ÿût ½üßß æcé¥$$³féΚ¥[W×÷ææÍ]|èšÈ566æææ¦¦¦º¹¹‰:‹(+÷_±ÂdÅ “¼¼Ò7^ÀÒé¢U__ÿæÍ›øøø£GŠ:Ë7qqqsæÌi¾Ý××—{> l¶¶¶-~Kz¼·/êt3ÐÃéíúõ“´±™`cÃo @¥¤¤ìÙ³ÇÙÙyàÀ¢Î"HJžžæ¢NÑÛÝ»woéÒ¥[¶léð\|gaaß覠‡@»˜˜˜˜˜˜ˆ:è™llllllDè!`` ç€ ç€ ç€çpè]X,viiMQQeIIua!mÞ¼±ÊÊýÛ~@7=¬  ¦o_q…¾"Ì@§³**úôQ}þ¼¬¼<¡¨¨²°°²°VXH«¬¬g2Yx5³·7aN€@TWWoß¾=,,¬¤¤DYYyöìÙÛ·oWUUEaÖæª¬ßEà;y‹‹/njj çlyøð¡……Eii)ÏÍ|0 ‰ÒÒREEÅö7Ýù'€^¢…†aŸ‰­­­¨#üŸGq¯†Þ#‰‰õURZÂdÖ44d~ýúžÉ¬é´¦ Y"q¦¸¸’˜˜BHAÁ.88[B"ÍfÓé,„x'ÿ>\¥_?ÉN‹× `áÐÛ°X¬¹sçb©©©ùùóçsçÎeeeIJö¨àBâàà°pᆆ†¾}¿}3={öìöwoB!((è»Þžÿëá………‰* 555QGø‡‡‡¨St†çÏË‚‚ÞKH 0`ššZ¿ ÇŒ‘';ã£F]ãæÍ¼ÔÔ2 ÃØl6›Ínjb´X³O”)Z©ÓÀå ôN—/_ÎÉÉÉÎÎîׯBHIIéäÉ“ââÝx˜†a-Þimû077—¸wïÞO?ý„o‰ŽŽÞºuëwåÄ0lñâÅLø!l€,]H&{¨¨l ‘܇ ñTQÙ0eÊ®îåä”tBëÏžåN™ ¦æ¡¢²¡µÿH¤ wî¼î„0€Ž±µµµµµm³š™™ÙŽ;Z{!D¥Rétº¯¯/™LVPPX¸paYYçÕëׯ«ªªÊÈÈx{{‡„„¨¨¨ôïßßÃÃS!((ˆ§@¥R¹›xùòåŒ3ää䤤¤tuuÃÂÂØlöܹs<ˆWHJJRPP¨¯¯o-Cii)w™óßÎi‘{;‹ÅÚ½{·ºººœœœ­­mû¨EK—.]¸p!^~ýúuŸ>}h4Ÿ&>|Èý"'gii)“Éܽ{·¦¦¦´´ô¤I“ž>}ÚÚ)jñd6‡wÿ€Ì¥€PìÝk/%Õ!ŒÍf751Byy¥Çÿ1uꮩSw<——WÚæN:lâD„//¯¹bââ„ë°ÙèîÝ´ðpªP“„íåË—cÆŒá_çÀ¡¡¡‘‘‘ÿýwqqñŠ+8/]»víõë×—/_Þ³gOPPЛ7o.]ºtèСÜÜ\„PPPД)S¸ Í9::jii½xñâÇîîîÎÎÎMMMööö‘‘‘x…ÐÐP[[Û£G¶–ûßÞϽîí'Ož¼páÂõëשTêׯ_W¯^ÝÎ#j‘ƒƒÃíÛ·BÑÑÑ3fÌ ‰|šðññ ©¯¯ožóøñã§NºtéÒû÷ïgÍšeeeÅ`0Z)/¯^†¼¼Ò Ž·cäH_‡ÓZZ^**Föÿùç gÎ$¤¦~hjb/ ýÚyG\\<11‘ó#ç÷;Fcÿ{—@KKëÊ•+x…ôôt„PUUþjBB›Íf2™<åÖî-4©²²’ÁøvÝÈÌÌD•––VVVJII0™L‰ôèÑ#>xîá4ßÈi‘³]GGçÚµkøÆÂÂBPWW×±#b³Ùt:]AA!::šÍf?þÂ… ü›ˆˆˆàÉÃ)9200ßÂb±ð{A-ž¢Ofsp€€{8Ë’%†ãÇ!ZøWÆd2ÙlÖ‹‰çÌl& êêŠQQ®‡/ìß_JBâ¿›9ââb³g놆®ÎÊÚ“”äçç7_AAæúõKË£C‡nš>}ï¦MáÔÂBšð²‚D"eeeq~¤Ñh………}êC¡ŒAÿN–Èf# ¼Â! vv÷í³øÐëÕ«m.ünÜï«V] |œ––ÏbñÎÆ9KKËS§Ná·)BD"ñùóçÜ¿Ÿ³¨æèèˆaŸ l6}g‡‡D"ݺu ÿ²¿U¢­­ý#Gáàà9}útyyyþMðé2‘H¤¼¼<Ε••L&³µSèá Djjò^^sÅÄšÏÀÎÆ0´}û‚qãZý"P°””úŸ<¹äüù¥òòý1&“5a‚z‹ÕfÍÒõõ¥DG¯{ÿ~O\œ‡«ë „ÐáÃñ‡FŽôqp8}ð`Ü“'Y_¿Ò;'9€?ÿ¢¢" …’ššZTTtãÆmÛ¶ñÔqqqÙ±c•JÍÊÊrss£P(D"±=;Æ?¯s ¡ÚÚÚÊ1™L:n`` ¥¥•‘‘áì쌪¨¨@YYY¥¦¦†††:99ñÉ@$£££«««¸›¦ÑZ¾‡ŒowvvöóóKMMÍÎÎ^¹rå¯C0mÚ4IIÉ;wrVYhg<9—-[¶uëÖ§OŸ~ùòåÀd2¹¡¡¡µS‘ w`2YsæRSóäyççŸE’§ªªaÓ¦0_‹õ]oüð¡,<üÙÆaÓ¦íQQÙ ¦æan~ÐÏïFLÌ˲²!¥ 7kçs8l6ûÓ§ONNNrrrÒÒÒ ¿CÂýNSS“———ªªª¼¼¼££ck¸4/£–æRãF¥RcbbÔÕÕ%%%ŒŒîÞ½knn>bÄ|?–––ºººx¹µ W¯^8p ‚‚Bpp0ú÷))©òòrž`œíMMMÞÞÞd2YFFÆÜÜ<''§Gć««+@())án³ žœ¥¥¥MMMþþþƒ–––600Àjíµ'<‡@`ìfW+€`eg—˜™íc0¾!!Äì_^^·mÛgg#‘D*( ‘Ér~{IIÍëןž=Ë{ö,÷Õ«Ot:sÈ…‰5 4'NÔÐÖ ðãðÄ"""D¤ã¬­­ |||D¤ wpp€OkàíÝy\wþ?ðÏ@Â!HHAÀŠõ¨+Þ6^+ «¢nÛUWk­GWÔà·Š¬vµ®VѶUÁ*—w½º4ñ¬Ö9T@TŽ$áLòûcl~Ù1"0^χ|òÉdæ5“y3óù ¼–|;0€Ž¢G§%KFnÛö‹B¡¤(ÊÔ”•˜¸ð×_ÿˆŠ:|þüïÛ¶ýÕÎβ#½IyCqr²5ÊoÔ(?Bˆ\^{÷nP˜wíZ^LÌI™LnccÖ·¯›¿wOOSSüœètärùo¿ývîܹíÛ·3å¥3gÎŒ7®aÿš5k6lØÐöy õà@[¨©©>|ÓãÇeJ¥j÷îÙ“&õ'„ܼùøÿØ_W§Ø½;Âßß“éŒ-@¡Pfg? ó®]Ë ó=*511~ë-ÎÀÝýý»âmoßÖµ@ÇÕ¡Ïᤤ¤Ì;wÍš5‘‘‘LgéØp Pá´‘k×rÿò—sæ ‰‰™ªî”H*?ýô`jêý%KF-]:¦±9 :°gÏdwîàb6€æéдT8Í€  í8î¯5´J¥úþû´èèãƒyîÜáäÔº“G3¥²²æÞ½Búb¶«WsËË«œœ¬é‹ÙìÞ¯Ÿ[—.¸˜ à Â‚  YPá´ wîä/X°¿¢¢zÇŽYÆù2§ui^Ìvõjn~~™¹y—Þ½]ýý=邇Ͷ`:#óPáA…Ð,¨pÚ‹/ªÿùÏÄãÇo-\9ÞØ¸³Ü®êÙ3Ùµky×®å …ywïPåååÔ§—¾˜Í×·Ó˜a¨Nyyùúõëž?îää4zôèõë×»ºº2«B…Ð ¸, ½°¶6Û½{vHÈ[‘‘É7n<ܵ+ÂÙÙ–éPmÁÙÙv„~&ô#„TTÔܼùèÚµÜk×òþïÿŽVUÕ:;ÛôéãÏíôïï®ut,J¥rüøñE%''{zz>yòäÛo¿ ‹Å¦¦¦L§s8íŽXütþü}%%Û·Ï y‹é8Œ©¯Wþþ{áµkywîägdäJ,,ºøù½¼˜mÐ Os¦3´"ƒ<‡óÃ?¬Y³&;;ÛÒòÿϬ(•J­­­ñ÷‹Fà@3à@»ããÓíäÉO##“#"¾ûàƒ µk'vÎ,–QŸ>¼>}xôCõÅliiâÝ»¥/f£Ïí äéææÀlZÐÇ-Z¤YÞBØl6Ý (êÂ… àñãÇûöí«ªª=zôŽ;芋‹5ÛE¥¤¤,_¾\"‘Œ=z÷îÝôÂÐiá@û•”$\µ*Ù×·Ûîݳñ ^Ó‹Õ·n=¦/f óª«ëœmèq;þþÝ{÷æؼÛÐ9ä9{{û}ûöM˜0¡Ñg)Š üâ‹/~ùå—8pÀÎÎîÿø‡Í‘#GHÓNÏž=÷îÝkccó÷¿ÿÝÑÑñèÑ£mºW­ çpšçpÚ¯°°ýû»ÏŸ¿oôè-[¶Lçóû2¨½°¶6 ò ò!³ …yÛ·ÿRZZaiiúÎ;îþþÝûôá äeccÆt^xéÅ‹š'XÔ7Å’H$ô™œ¥K—:ôƒ>X»ví Aƒ!_}õUïÞ½ËËËmllšZmdd$½plll¿~ýt/ @»Ö£‡Ó±cŸDF&-X°ïãG¬X1ŽÅê,s¬éI}1ÛGB=*½v-W(Ì;qâöÖ­çŒ)OÏ—³ôàrí˜Î Щq8±XH?”H$r¹\s"5777BH~~¾——ÝC7 zõêÕÔjÕ ûúú¾ra0x¨pÚ;++Ó;g ê½fÍáË—ìÜ9ËÃÑéPí—»»ƒ»»CXØ@BHIIÅÍ›îÜÉ¿v-/)IXSS‹Ù˜5qâÄ]»vEDDÐó °Ùì´´4ÍŒŒŒ!\.777wÈ!„ÜÜ\B‡Ã¡ ¯×*((Ð|UNNÎСC !<Ð\:'T8Ãô郆õùøãøáÿX³f‡©¯î€¦8:Zå7j”!äÅ‹êë×Ò·Ý´ég¹¼ÖÙÙ–>·3p`w??WœhQQQ àóùÑÑÑ®®®ÿú׿.6gΜèèèž={ÚÚÚ.^¼˜ÏçÓ×°±ÙìcÇŽ…‡‡ÇÄÄh.¿aÆ^½zYYY-Z´H½0tZ¨p: .×.9yÑöíçÖ­;öë¯÷ÿóŸ¿:;Î…æm\°ÛJ¥œ¼<Α#®,–ý³gß)••mÚÆg·7NNNééé‘‘‘£G®©© IJJòôôÔZlåÊ•S¦LQÏ¥F÷õÕWŸ}öYddäöíÛ¿þúkõò~øáŒ3ž?>jԨݻw·Ýþ@»„¹Ô:žë×}üq\eeÍ—_N§OPŠ¢>ýôÓ€€€¶ßtYY½=n5hh222¶mÛÖ¡Çä\j­¢(¡Pøî»ï2¤U`.5€fÀ9€ŽgÀ÷sçV¬Z•ŽÝñãÇu¬A(nܸÑËË+333+++$$dòäÉêgù|~IIIrr2!dܸqê6ýý>...77W³Ñ°Âñõõ]°`A^^ÞÓ§O÷ìÙcjjZSS³wïÞ€€z%K–ÌŸ?_G­ §a§z‹êþ;vôèÑ####;;›Ï燆†ê¹G:ŽÝ~öìÙÌ™3½½½ …ú©F÷qÛøä IDAT¶m<ïâÅ‹………ÀÁÁ¡®®NG°)S¦”••%$$°X¬êêjD( 77·´´´¬¬¬aÆÑ;®cåiiir¹¼éOŠJ…  ÃO€NáÁƒg|þ¶îÝ?‹=__¯`:N#ô©pX,Ö•+W4_B“H$ª?¿.{{{ïÛ·^àîÝ»„™LF?›ššªR© …V[«ŒÑ\¿ÖSR©´¾¾žngeeÑßÅ¥R©™™YAAB¡àp8/^Ô‘¡N¯^½8@wWVV6o4!„¢¨þýûߺuKsëîã[o½µgϺS©TJ$¥R©#Ø7ÔaŠ‹‹u¡Pؽ{wõ ™Û·oÓ/ѱò¤¤¤¦öN*€N s©t =z8?þÉúõS¶m;7zô–Û·ó™NÔG,«J$õDjjùùù^^^t›n¨ÇéZYYBŒŒŒ´Úú“J¥ 88˜ÃáÌ›7î´µµ9rdJJÊ¥K—X,VPPŽ Í——7sæLzö3WWW…Bñ†{”šš*‘H$‰\.¿qãFß¾}_¹>ôõõ¥Ûô$lEéFêQ‡Ñ}@ŠŠŠ|||趺¡cånnnz<èŒPátEÍšpþü?­'LØs²¶¶žéP¯gâĉ»ví¢Ï BØlöõë×µ–ár¹¹¹¹t›np8œ– œ››»yóæ‡ž={VÝžœœœ0}útŠ¢tdP©Tä5 ‡sôèQúRôùuÐ<ôLl6ÛÌ̬á³î#‡ÃQO*M‘J¥ô «¦‚Q¥¹NÝo —ËU®ÙÙÙ¯Üë×­K ³Áï €Î…Ç³?thÁ¿þºoßå1c¾¼yó1Ó‰^CTTTQQŸÏ‰DEEE‡^·nÖ2sæÌ‰ŽŽ …b±xñâÅ|>Ÿž7ì•âããé/ñê!¤¢¢Bú'…BQWWçïïïíí}ÿþýÙ³gBÊÊÊ!“&M‰D‡š1c†Ž l6ûرcååå111š›–H$F¢ûgÏž-D"Qvvö¼yó†þ:Çìµ5ºûÛß>ÿüóË—/?}útË–-\.·ªªJÿ`ºß”ˆˆˆõë×_¹råÁƒË—/§;Ûx¯À 0rm0.?¿,<|—«ëÒÏ>K¨¬¬a:Ž^ãpT*ÕãÇg̘agggaaÁçóéšãpjkkW®\éêêjoo?}úô¦†¸4l“ÆæRÓ$ ?îááajjxêÔ©1cÆôìÙ“^ÏĉýüüèvSöïßïìììààOþflffVZZªLÝ_[[Éår­¬¬ÆŒ£žEà•{ÔÔqÖ=î¨Ñ}¬­­ŠŠrss³°°ð÷÷§Çüè¦5ÜH÷›RSS³téRggç®]»îß¿_ý’Wîµn‡ÐiQª¿Å “P©TÉÉ¢µkÚÙYlÙ2-0°ƒa(ŠJHHg0Û˜}zîܹk×®uwwg:ËKcǎŹ è´pˆ‘5gΫW£† óˆønΜ=……}‡†¦NúâÅ‹ÈÈH¦ƒ!¨p@ÍÖÖâßÿON^”—WNîø z9yòö短¨¨^±bÜܹCY¬>LQTË®€‚ßq*ÐW]bß¾+_|qªkWëèè)#Fôb:€6T8ðzŠŠ¤7þœœ,5Ê/:zŠ››Ó‰þ?T8З/‹W¯N)(,ZòñÇ#MM1¨ÚT8ÐLê‹Ö­V¯æO˜ÐéD¨pàÍäæ ‡/\øãý÷ûFEMÀEkÀ,T8ÐNºóùçGŸ?ñÑGÁŸ|2ÊÆÆŒéD†#,,ŒéÀŒeË–0 ãA…-£®N‘pmóæÓ55õ‹øè£aœÐ"(ŠöÊ•Õ!!o-[vˆÏßvíZ.Ó¡ A…-ÏÅ…ýï‡ÿ÷¿ŸÙÛ[Nž¼cΜ=•2 :T8ÐZ|}»ÅÅÍûÙÙÏGŒø÷—_ž©¬¬a:8T8кÞ¿ï… +W¯æÿøãåÁƒ7|ýõ…êê:¦C€ÁB…­ÎÄÄøƒ‚„µK–ŒÚ½û×ÖÅÆž¯ªªe: T8ÐFÌÍ»|ôQpzúš… ‡ïØqÞß?:6ö|MM=Ó¹ DyyùŠ+x<ž©©)Çûðà é§(ЉD-¸­_a{Ø"¥ÁÖÖvèС.\hÕ-@+A…mÊÒÒtÑ¢™™‚éÓmÝz.00fÏžKµµ¨sÞˆR©?~üÕ«W“““ Nžàµ8p`Ñ¢E–––šl6ÛØØXý°¾¾^ ðxßtY,Ö•+W4_B“H$ª?Ëooï}ûöÑ Ü½{—"“ÉègSSSU*•B¡Ðjk•1šë×zJ*•Ö××Óí¬¬,ú¿T*533+((P(çâÅ‹:24£ÂéÕ«×èÎÂÂBccãÊÊÊæí‘Ö&ÊËË.\ÈápèÒ¿ÂѱƒGŽQÇP¿PT8͆«Ô ±³³\¾|lzúê?ñË/¿þÅ?ÿ™˜“óœé\í‡Ã‹ÅꇉD=‘šZ~~¾——ݦôC+++Bˆ‘‘‘V[R©T s8œyóæÑ¶¶¶#GŽLII¹té‹Å Ò‘¡òòòfΜIÏ~æêêªP(Zj¬­­£££ŸûlÜùó÷‡ ÛôÁ?ˆDyLçh¿&Nœ¸k×.úü!„Íf_¿~]k.—›››K·é‡Ãi©ÁÁÁ¹¹¹›7o~øðáÙ³gÕýáááÉÉÉ Ó§O§(JG•JE^³àáp8G¥ÿd«T*% =l¦EÔ×ד?«#ýãéØAz¸´T8ÐNY[›-\"®ýñÇKK+&NüjäÈÍIIÂúz%ÓÑÚ¨¨¨¢¢">Ÿ/‰ŠŠŠ>¼nÝ:­eæÌ™- ÅbñâÅ‹ù|>›ÍÖgåñññyyyš ¢1(_*•*Šºº:ooïû÷ïÏž=›RVVF™4i’H$:tèÐŒ3td`³ÙÇŽ+//‰‰ÑÜ´D"i4Ý?{öl@ ‰²³³çÍ›7|øð×9fPïTaaaddd¿~ý¸\®žñèv³2´$&/‘ÐÛíÛ/Žçñ–ùû¯ß¹ó¿2YÓ‰ÚÑo<ÆãÇg̘agggaaÁçóéšãpjkkW®\éêêjoo?}úô¦†¸4lBâââ´š„BáñãÇ=<=wîܵk׺»»3奱cÇâꃇ«Ô Ã»qãÑž=—~þù¶ƒƒÕœ9CfÍ pp°b:@‹ÁÕJÞw€fÃUjÐá½óŽû®]¿ý½paH||Fß¾k§MÛ}âÄ-̺Ð ¡ÂaccþÑGÁW®¬Þ±cV]bþü}ÆmÚµë×’’ ¦£@ÛÁ80(]º°¦LygÊ”wž>•¥¤ˆ~ø!í_ÿ:9dˆ÷¬YãÆõa±ðg‡  S·n¶‹X°`xzzv||ÆÂ…qŽŽÖ¡¡ïΞÈãÙ3@—ššú‡Kè•téÂe:@G‚  ™±±QPOPOQ‘ô§Ÿ2÷í»²{÷¯8¥íGyyõÇÅ–>zT’—WòèQÉÇ¥OŸÊèy€­<<º™2 #Á\jЉÔÕ)Μù->>ãòåNNÖ¡¡#"ÜܘΆO¡PH?.ÍÊz*?}ô¨ôñãÒ¢"Ymm=!Äܼ‹··³»»ƒ››ƒ»»ÝàpØ&&Æ„Š¢˜ŽÌÀ\j̓ :£?þ(Š‹ËHIUUÕŽÝ{Ö¬€  ##|ì,®^ÍÍÌÌY²dTk¬¼ªªöÁƒgt óèQ)ÝxòDZW§ „X[›uïÞU]Ìøø8ûúv³µµÐ±ÂÄÄÄÖÈ í_`` —‹k^*è¼4OéØÚšóù}gÍ èÓ‡Çt.hEׯ?Ú¸ñçôôŽéékÞpm/^Tçå«‹™¬¬§bñ3™LN?«uN†nè.fà͡ üQ”˜xíðáëÏŸ¿0À#<|à¤IýmlÌ™Î-é·ß 6nH¶n=“”$"„(Ô6´.]ŒÇŒy;""ÀÝÝ‘ÃaãæH× @1€{zPËÔ´û‘#Ù?ÿ,zölJUËt"øFFfÖÖææ½)êÕÅgm­B¥R êÓÁ -¡Â€¶óé§Ÿ0¢TTÔYY c:4¢¼¼.?¿"?¿âñãŠG**+ë ¡X,J¡P6¼dáÁƒgLd€Ö… ÚN@@îÏ méÉéíÛù·n=¾uëñÍ›+*ª)Š˜ššÔÔÔ«Tªüü2¦@ËC…‹Ãas8ìqãÞ¦>|XrçNþíÛùgÏ^ÏÉ)•ËIYY¥½½%³! e¡Â€Î‚ž$mâÄþ¾¾ÕÓ¦M‹‹ÌÌL˜- tN*oog¦3@ËÃä˜`8Pá€á@…íKyyùŠ+x<ž©©)Çûðà é§(ЉD-¸­_!ã[ôóó‹ŠŠR?œ0a¨Q£Ô¿øâ //¯úúzŠ¢JJJfk´SK1BHS…q8ÐŽ(•ÊñãÇS•œœìééùäÉ“o¿ý600P,›šš2®ÎÌ̤۵µµ.\¨««“Ëå„«W¯ÇÅÅY[[ë¹ÎÔÔÔ~ýú©êÿ–òº “Ã9hGöîÝ›““sæÌ™AƒuíÚµoß¾±±±·oßf±:ðŸcš:ÿÐç%† & U*!$==½[·n<ïÂ… ô³t…CQÔ¬Y³èŠQŸ VVVl ÆÆÆ-›Y“fu[30À+¡Â€väÀ‹-²´üŸû“h}«®¯¯<ÏÑÑqÆŒ¥¥¥t?EQ‡âr¹ÖÖÖ«V­:xð ‡Ã±±±Y¾|¹zøøxÍFC·nÝ9r¤½½½¹¹yïÞ½ !ï¿ÿþÖ­[é233«ªªšÊ õ¢(BH×®]µ Í~•JµiÓ¦îÝ»ÛÛÛ‡……é¿G Ëd²û÷ïBΞ=;jÔ¨1cÆœ9s†RXXøäÉ“   Ù’““»uëæàà°}ûvõ:+**¤R(ºß‚‹/º¹¹ýðúÃ7zœ5óheÓ¬vNœ8ÁåríííwîÜI©««[¾|¹“““««ëž={ÌÌÌÚþ::h_Tm‚’ {;;»ãÇëXƒP(ܸq£——WfffVVVHHÈäÉ“ÕÏòùü’’’äädBȸqãÔ휜•J—››«Ù W¨¹ __ß äåå=}útÏž=¦¦¦555{÷î  X²dÉüùóud(..Öjkuª·¨îß±cG=222²³³ù|~hh¨ž{Ô¨=z|ÿý÷*•êwÞ9räȉ'|||T*UJJŠ‹‹‹îlS¦L)++KHH`±XÕÕÕt§&:¼ŽÝ LKK“ËåºÃ7zœ›:€ZÇŒóìÙ³””:dLLŒ··÷õë×ïÝ»G_ƒ§õž6*!!¿ ~¾@ѧÂa±XW®\Ñ| M"‘¨þ,¼½½÷íÛG/p÷î]BˆL&£ŸMMMU©TôyÍvS_y>%•JëëëévVVýÅZ*•š™™( ‡sñâEšQáôêÕëÀtgaa¡±±qeeeóöH¥R}ðÁÿûߟ?Þ¥K™LVQQajjš››»råÊððpÝÙnܸ¡Þ„z†ÛÒ±ûIIIêµéßèqnêj>räˆfHooïýû÷ӋݹsG÷ÁQC…`Àp•´#G,«J$õDjjùùù^^^t›nЭ¬¬!FFFZmýI¥R@ÌápæÍ›GwÚÚÚŽ92%%åÒ¥K,+((HG†fÈËË›9s&=S™«««B¡x“= ¾zõê/¿ü2pà@KKË¡C‡ž={–„£ûµ\.WŸMèØ}777õb:Â7zœõäêꪹªüü|OOOºíííýZ«ƒ„ Ú‘‰'îÚµ‹þó>žþ*¬nÃèëêêüýý½½½ïß¿?{ölBHYY!dÒ¤I"‘èСC3fÌБÍf;v¬¼¼<&&FsÓ‰¤ÑHtÿìÙ³H$ÊÎΞ7oÞðáÃ_ç˜ióððàp8GŽѬp~þùg‹Õ»wï¦2¼–f¿jMg­<úd›9sæ† nܸqÿþ}z=ë4}TVÖœ;w÷Ë/Ï´Ô ß\bbbÛÁ cú#ÖaaaL9èì´>“xV0Y³fÍ€L&›4iÒýû÷mllF•““Ó·o_¾úê«Ï>û,22rûöí_ý5ÝܧOŸÂÂB{{{Í<êþU«VUUUM™2E*•2$%%¥¹Çï¥aÆ7´T8¯0uêÔ©S§2×»wïóçÏ¿ÖK¬¬LÍÍYFF¦Õ,–Q}½BÇÂÆÆFwîäOºÓÆÆœÍ¶°±1·±1·µ}ùÏÆÆÜÖÖ‚nXY™¾Ù®@Ë@…‹‘åçgWVvôéSi||Æ÷ß§ÉdrŠ¢”ÊFN‹Q\®»»ƒTZU\ü";û¹L&//¯’ɪjjê5—d±Œèú‡.„þ¬‚^Ö?l¶¹FudakknbbÜV{ й Â€NÊÙÙvùò±‹<{öî7ß\¸qã‘úŠ55¥’ûΟÿ^£k¨®®“ÉäRi•L&—ɪ¤R¹LV¥îyö¬<+ëiMM=½Øóç/´®-45e±ÙtÁÃf[ÐÅ›mÞ°‡Í¶45ůl½àÇ%tj]º°&Lè7aB¿;wòãâ2’’„J¥J}éšR©´µ5oêµff&ff¶Îζúl¨¼¼Z}þG&«¢ååURéËÎÇËÊË éI.¯Õz9]ö(•ÕFFfúm®|ýúõ ÏŸ?wrr=zôúõë]]] !E …Âwß}WŸõè£ÅWضØpvu¡Pد_?“ââbGGGýƒQ¥ã%¯K*•ŸyòäÛo¿ ‹Å¦¦/¤¯ÔÔÔ~ýú©Z[[ÅÅÅY[[·}˜êêºsçî&%‰.\øC¡P^¼Ùá*|,[D‹,?ù䓌ŒŒ~øá­·Þ’Éd‰‰‰!!!OŸ>µ±é`0M¨p íddd0ZžB¡’Ëë++ëäòz¹\QYYWQQWYYOÿ{Ÿ>8ĉIDATñ¢¶²²^.¯¯®®Wþ9WÙøñ¼Ñ£¹ fÖñQtqa¯\9~éÒÑ'NÜúî»KwîäÛÚ20—š‰‰±ƒƒ•ƒƒ•V×®¥ññº¦F íÝ»7''';;ÛÒÒ’Òµk×ØØØ˜˜«ÿÞoêLHËž!ÑdeeÅf³µ:gÍšÕâÒA¡P¦¥‰““E§NÝ®©QPitÀX‡€e‹hñeJJÊO?ý4lØ0Bˆ““Óš5k-ZD¿G˜  M0ýÓZei9 [·]\>uqùÔÅeI·n‹»u[Ü­Û'öhÿ31éÆtfBôû x󿣧Oe­ý¿C ú$ ‰ŽŽnêYBˆP(¬««[³f —Ëuppøë_ÿZRR¢~öàÁƒ®®®VVV‘‘‘?ýô“‹‹‹µµõ²eËÔ ÄÅÅi5„B¡æ&nÞ¼9bÄ;;;333??¿„„•J5~üø/¿ü’^ ##ÃÁÁA.—7•¡¸¸X³­~×è~õ5û•JåÆ=<<ìììBCCõߣ¦ŽRjjªäOõõõšytlK(VWW/Y²ÄÉÉÉÑÑ‘¾–zwt ¥ÛõõŠsçî~üqœ—×?9œ¥nn˵þ‰ÅO_¹Â6£™\|,ÛçÇÒÙÙù믿njsZ»¬ç{¡cFßúU.\àñx„­w¤¶¶VÇ1iô§"*hüQ4räfOû{XÃ^^+ëëLçí¨ô¬pìììŽ?ÞÔ³ô×7zyyefffee…„„LžŸ¯þÎýÊ=jê(iÒÚœŽm …B@àææ––––••Eÿi\ÿ çêÕà°Ÿß—O6ºÂÁDz}~,7oÞlllºoß¾ÂÂB­Í5ºËº“ë^ Ñw~U```ZZÚîÝ»µÞ‘¦Ž­ÑŸŠTÃÐ J¥ê‡ÒÖ¯?Niê&3ÆÆFcÆôÞ³çomÍp$&&N›6í•¿»MLL.^¼H?TN–H$l6›vê¶V§z‹ê~??¿5kÖ̘1ƒòäÉ77·òòr ‹fìQ£;¥î/..6lXSÛ …áááàƒ> „ܹs§oß¾¯¼`éÙ3Ù”)Ÿ>n%—³X,£úúFî?«iÀ ‹.º—i3……×\\*’’’t/†e»ýX¦§§'''ÿ÷¿ÿ½{÷nÿþý7mÚ4jÔ(ò¿×Úiî²îäºðöönø.ЫMJJ •ÉdZïHpp°ŽÏU£?;ð…ЮQ}ì³hQÜ,+((HG†fÈËË›9sæÌ™3Õ=ôÖß|ôß!¤¨¨HÝV7t{ñ¢F©4V(´gÊjŠ™••¾W´¶¢¢WÔc4|,iííc)“É D¿/EEE6l˜4iR~~¾ƒƒCSzer 4ú.ÐÜÜÜHcïH3*hI>>ÝNŸ^þÍ7©›6¢(¢õ§h…ByçÎã™3311~÷]  Ÿ  ß~ýxÆÆoô{´Lœ8q×®]ôJÙlvZZšÖ2\.777wÈ!„ÜÜ\B‡Ãi©ÁÁÁƒÞ¼ysÿþýU*•™ÙËïâáááß}÷Ýýû÷§OŸNQ”Ž ô_d ôß(‡ÃùòË/'MšD¿\&“5ÝRto‹ËåŠÅâ¡C‡B²³³õYaN<žŒÇ“ÅÄì8qâÖ¡CÂÂÂ2's>ÿ|²··sKìJ  ;©ÏbøX¶Ïå[o½õõ×_Oœ8‘âââ²qãÆ]»v•••ÑN3vY·¦Þ¢Qi½#ÍØ ~£@ c±Œ-qîÜrOO'ë~Ѹ¸°¯_ÿüöíõ;wÎòòrŠÏ˜0a›·wä´i»ccÏß¹“ßqç‰jW¢¢¢ŠŠŠø|¾H$***:|øðºuë´–™3gNtt´P(‹Å‹/æóùz~ñŠÏËËÓlB***¤R(uuuþþþÞÞÞ÷ïß§¯ö)++#„Lš4I$:tˆ¾¦© l6ûرcååå111š›–H$F¢ûgÏž-D"Qvvö¼yó†þ:ÇìõèÞVDDÄúõë¯\¹òàÁƒåË—¿Öš}|º-_>V(ŒJM]9þpz>=˸%Ó3Ëöù± [¾|ùÙ³g‹ŠŠîÝ»·lÙ²Aƒy{{“¦wùM4õ.hÒzGšC÷Ø€f«­­ß¼ù”«ëR.w™‹Ë§nnËV¬HÐZæáÃ’¸¸ôyóöúú®rqùÔÏoͼy{ãâÒ=*a$s;§çL*•êñãÇ3f̰³³³°°àóùôŸ¢%‰êÏaǵµµ+W®tuuµ··Ÿ>}zS£¥¶Ic“Vi …Ç÷ðð055 Ï4'Uëˆ3 ¨ð±l—˪ªªÕ«W{xx˜˜˜p¹ÜY³f={öLÇ.ëó^èX ©wAk×4ßÝ0Ó0àòåŸ|r ¬¬¢¾^1iRÿFS(”÷‰/]_½š[[[ïîîää3t¨·]¿9C Ñs¦ölòäÉþþþ«W¯f:H»Fij¼~ee͹s÷RRD/fÑwülOW©éJÞ!àcÙÞèÿŽ4úSW©@ë:ÔûâÅÈ)SÞ¥ÛM-fllÔ§oÑ¢ ÿ¸?&!á|~¿;w ,ØÿöÛQcÇn‰9ùË/÷**jÚ0;´$¹\~õêÕsçÎiŽ„fÖ™3g¨Æ¦£i³´42åøøywî¬ÿâ‹0s¦|,Û›yG0Ó´:kk³ÿügzDD=¨à•ÌÍ»Ðgo!%%ÙiiâcÇnÄÆžg±Œzõr ò ö<ØËÄÄÆ't§OŸž;wîÚµkÝÝÝ™ÎòÒØ±c;Ü 1;;ˈˆ@¦S|,Û›yGp•t•¦¥‰é+Ùd2¹¥¥é;ï¸ûùôéÃc:][0€«Ô )÷Z¯Ž› »»ƒ»{À¬Yšƒv6o>sÒÙÙÆßß3(ÈgäÈ^ݺÙ2ƒ :zÐ=n§ªªV$zxé’8-MüóÏIJ¥J=EÁ{ïõ´¶n/wE€¶ :6ÍA;¥¥ééÙii⋳âã30h B…†ÃÁÁj„~&ô#ƒvȈ=¯9hçí·¹Í»O6´¨pÀ0©í(•ª»w èA;[¶œ‰‰9éäd=hWPψo¹¸èuÇôv%11‘éÐò ¸\.Ó)š©  K`DFFFÃNÌ¥HuuP˜GÚ¹{·@sÐΰa=mlÚû zÖ ¦S@k íˆ3’………%''3:5­ŠtRIååËè+Ù=*566òóà€yöLvíZ^Zšø—_~öLfaÑeÀ ÚèˆPáüõ©©÷+*j­zù ÞÓÕÕŽétð ¨pW_¯üý÷—÷ÍÌÌ©«Sh Úñµ±1g: 4À«UVÖܸñˆž¢àÎ|ÍA;ƒyv邹IÚ T8¯çùóW¯æ¤¥‰ÿûßߟ>•™›wy÷] Úh/Pá4ŸzÐÎÅ‹”—W;8Xö /cãñì™NСÂh:íù°ÙLè,Pá´0¹¼öúõ‡ô ß~+02¢Ôƒvüý=MM1h ¡ÂhEÅÅ/23sÒÒÄ¿þzÿÉ©™™ÉÀÝéA;½{sŒ0h …¡Âh#ƒv²ÊË«ìí-‡ ñ¦Ïí¸¹90À@ Âhk …òÞ½Æí êmggÉt@€ “´íPéÝ›KŸØ8°»™™ Ó:T8íEIIEFFvZšøÂ…? $,–Q¯^/§(èÁb1 @…Щí\º$–ÉäVV¦ýû»ÓSôéÃc:@û…  ]Ó´sõjnmm½³³¿¿gPÏÈ‘½ºu³e: @û‚  Ã¨ªª‰^Ú¹{·@©T©§(x~ÖÖfL`*€©´´"==›ž{:?¿LsÐÎàÁ^&&ÆL`*€O=h'-M,•Ê--Mßyçå ·ßæRî+ *áTªîÞ- í\»–[SSïäd=hWPψo¹¸°™ÐêPá¦êê:¡0¯ÑA;Æõ´±Á 0L¨p ŸDRyùòú2¶GJüü0h *€¦   ==½Ù//*’?x ËÊ’åä”WW+,-Y>>¶ÎÞÞ˜xš1</ €é@“˜˜8mÚ´–X“Q—.ݺtᙚºÉå÷ªª~o‰uBs„††&%%1À@°˜Í¿QŒ°°0¦##¦´T8`8Pá€á@…†T8`8Pá¬òòò+Vðx,,Lÿ=Ò_£›øúë¯ßyçúúzBȲe˦OŸÞTZhm¨p ÓÍ›7ûöí«{™-[¶:t(999==ýÙ³g}ô‘ú©ܾ}{ïÞ½›6mŠ‹‹ûí·ß~üñÇ­[·æææBââ↠¢ÙhhúôéÞÞÞ7nÜxøðáÒ¥KgÏž][[žœœL/pèСÐÐÐíÛ·7•A‹J¥"„4<+¢Ùûý÷ß›ÍÞ²e‹P(LLLܵkWSi Õ© CIHHÐç78‹ÅºråŠú¡úW¿D"¡ …Booï}ûöÑ Ü½{—"“ÉègSSSU*•B¡Ðj …ÂF7×ð)©TZ__O·³²²!ÅÅÅR©ÔÌ̬  @¡Pp8œ‹/êÈP\\¬^9ÝÖêToQÝß«W¯Ð………ÆÆÆ•••ÍÛ£¦ö®©Määä888øøøœ8qB+•n¡¡¡¡¡¡¯\ ô„s8†‰ÃáˆÅbõC‰D¢žHM-??ßËË‹nÓ‚‚ú¡••!ÄÈÈH«­?©T*‚ƒƒ9μyóèN[[Û‘#G¦¤¤\ºt‰ÅbéÈÐ yyy3gΤ'=suuU(-¸Gº7áéé9nܸºººñãÇ7;?¼9T8†iâĉ»ví¢OSBØlöõë×µ–ár¹êk´è‡Ãi©ÁÁÁ¹¹¹›7o~øðáÙ³gÕýô…j ô`T*yÍ‚‡Ãá=z”þ;®R©”H$>>>-µGº7!‰.\¸ààà°cÇŽ–Ý"¼T8†)**ª¨¨ˆÏç‹D¢¢¢¢Ã‡¯[·Nk™9sæDGG …B±X¼xñb>Ÿ¯çtañññyyyš BHEE…ôO …¢®®ÎßßßÛÛûþýû³gÏ&„”••B&Mš$‰:4cÆ Ølö±cÇÊËËcbb47­žÁY Ý?{öl@ ‰²³³çÍ›7|øð×9fzit555sæÌÙ¶mÛ?üðùçŸ?|øPwZh=¨p “““Szzº½½ýèÑ£{ôèñã?&%%i-³råÊ¿üå/S¦L prrúñÇõ\yDDÄ•+W4„áÇÛýéæÍ›ß|óÍÎ;9ÎÂ… çÎ;f̘I“&BlllFåêêJO„ÐT†¯¾úJ xzz:T½Ýààà>}úЕ’&uÿªU«ø|þ”)Sú÷ŸŸ’’òÚîUÝDTT”¯¯ïÔ©Sß~ûí… þýïבZ¥Òzí_bbâ´iÓ:ôoðÉ“'ûûû¯^½šé íBXX!¤aý ̓s8ÐvärùÕ«WÏ;7sæL¦³¼tæÌª1€éhÐø®ÆÐáœ>}zîܹk×®uwwg:ËKcÇŽíÐ'Ä@ *h;S§N:u*Ó)Àá*50¨pÀp Âà  fè蛨€ÈÌÌ< ûð€ì0KHH €’„„ܯ‰Žà„ŠÇB0{ölÜ!èdÐ#â¡GЫì3/}x@öàÙ€d}@¯!•JW®\iooodddoo¿hÑ¢òòrú!‚ rrrär9Aµµµôº =ÊÝ.€ìz’$§NzíÚµ¤¤¤²²²S§Nq8OOÏÖÖV¦›ÍŽ577×MH:î®ïë}@ïpðàÁ‚‚SSS„ÍÞ½{#"" þÃA|øá‡Úè ˆšškkk•ZêNOÀ¹èŽ9²lÙ2:õ0¸\.›ÍVÞ¢<:v옓“—Ëõ÷÷¯®®¦=|ø°J©Ï”³³³=<G½Vôw,^XÍÒÒòäÉ“í=ŠÊÎΦ 555taôèÑ7oÞ¼uëÖ¸qã¦L™BQTlllQQ‘r©¯\4hPHHHEEErr2‹Åª¬¬T©æééyåÊ•ææfåî|}}«ªª’““ ž>}áêêzýúõÛ·o{yy±Ùl:BÍBñññ/¬Ö7@ö˜u0ûddd02oŸ‰„j'û\ºt‰®|ãÆ „P}}}ÛfÕf·k×.z£D"‘Ëå*ÕUvA?~œ¢(…BAotuuýñÇéjÿûßÿ˜5Ó«ì3/Ð;ðùüüü|æO‰DÂ|àÕº0dÈ„PEEEûŠŽŽŽŒŒttt\°`Á;wT&w!‡¶{ÙÙÙ!„X¬?þ§JKK D—]]];ص^ìz‡iÓ¦EGGÓg!.—{ýúuͻЅ¼¼<‚ ìííÕV£( !TVVÆl™Gޱ³³³´´ bªÅÆÆ*~üñÇXYYÑÑûž?ÞÝÝÃá…£GRåååÅápêêê”ûRéNeãÓ§O—.]jiiéì윔”„ºyóæ éÓºAÁïy¬fϞݷÇáíÛ·_}õÕšš+++Í5 ‚ˆ×“»ÁÌ ­>|øêÕ«?~\YY¹víÚI“&½0õèÈ>hE||üõë×ù|¾‹‹KSSÓ÷ß;¢¾i€V¸»»_¸pw=œûð€ìÀ²È> „P«TÞ*UàŽB¿Àª3è°ÿ€gë-D¼2ªoz²è°ÿŠÞêÁ¢¶F.†^k@=‹›–‹ú{ª»™í+¸ÃѰî*¾(a±‹(¾Ð€;=Ù”¢ŽTP$Iå¨Ã‹ìô¤ð©¤è)BQHRÔòGhd ïŠÎJ؆Üy‡eHíÜ}|@—AöúBù©u ÙŸ½2*ÿd‚Obt²Ðk5wšžT=SÞò¤êYÍf\ñèÈ>@¯¤IX†ÏÝð”mHž©Ç^ìôER?ד²ç&Z uÿçzŠ„Ù—ÖAöúëQö“§RyÛíOåržè>}Ùè¯Â´z[ÍïL° ˆÂ4˜|id §ϨÂóR®f†EʨÂsÅ3˜|id §Ê2¥òf²½GåÍdY–T—ñè!ø–)ÐSõ÷[üuY3ý ·éýì׉Ãs1ƙހ;l=Ås5æ¹þ•\ŠÏ5 „ùXâ‹HïÀÌ €d}x@öàÙ€dp½!ÔR/Có q¢G ûð€™È>< ûð€ìÀ² +‚¨­­í`Íœœœ¶Û!ûð€ìBel)ÍØRŠ; ýÙ„zZ/Zÿ׿ ‚ˆ‹‹æææaaaGåóùÁÁÁíµ@’ddd¤P(4557n\FFÓ3CaÊA¤§§;888p€)ïß¿?22ÒÙÙ™ÇãÔÕÕ1{¥¦¦ Õ^_ï½÷ÞÎ;é]²²²¬­­e2™ÚP³³³=<}ª¶¯ƒzxxл|þùçÿøÇ?Ú;ØAƒ…„„TTT$''³X¬-[¶´Ýñ…ÏBhôèÑ7oÞ¼uëÖ¸qã¦L™²yóf¡P˜•••——7iÒ¤3f0ñggg· ²¥.û\ºt‰¢(…B¡RVûDQÔСCcbbè2I’‰„$Iªý쓘˜Èl¤ËÆ ;rä½±¼¼œÍf755ÑŽ?ÎPSS£¶¯††‡SVV¦P(ø|~zzz{ËãñvíÚE—%I]]]Û_ø 0)ŠºqãBÈÚÚúСCô–ÜÜ\„Pcc#Õ~ö™ê™™™!„X,–J¹=%%%nnnt™ .—Kj~®‡áàà R... "‚ ;;;…BQVVFW°³³S@m_ýúõóññINNþõ×_ &L˜Ð^×ÑÑÑ‘‘‘ŽŽŽ ,¸sçÇS»ã Ÿº0dÈ„Pmm­P(¤·Ð&~µ ûÐ=ø|~qq1ógCC}¦€¢ßÿUþ•ÿ“é2ŸÏOIIQ>£Ÿ¯awÈ>t… ®[·îêÕ«•••Û·o---!.—{âÄ ©T¡¹…yóæ‰Å✜œ‚‚‚Å‹{{{w¶¯éÓ§çääÄÅÅÍ™3GCG#GŽ upp3f EQ§ƒ;ª ½uëVnnîÒ¥KþïÿþoÆ ÙÙÙùùùŸ}ö™H$âr¹v‡ß´ {¬^½ºµµ5((¨¶¶ÖÝÝýÔ©Sôlå›o¾YµjUhhè×_ýí·ßjh!,,¬¥¥eæÌ™ ãÇONNîl_ï¼óNaaák¯½¦¡£˜˜˜+V|ûí·vvv±±±VVV¡Žì¨bùòåS¦Linnž:ujTT”©©é“'OfΜÙÒÒòî»ïîÙ³Góîp‡ êC÷÷™1cÆØ±c׬Y£³» f^ „1ϰƒ©'--PG,k;HÍš››¯]»vöìÙ   NÅ©²£ÎÀÌ €Î™}zÁ‚ÿú׿QgâTÙQg`æÀf^< ûð€ìÀ²È> ÷÷Á>q!„”oîtÎ}x@öàÙ€d}x@öàß2¡>tŸ^²˜yð€ìÀ²È>< ûð€ìÀ²Áý}p€ûû€Üß8÷àÙ€Çsß´ÈÌÌܹs'Æh€ö|ñÅ/ÓÂÎ;333»+žžÆ½F„ʵ9…;mñððøâ‹/pGñœçÎ}JKK“’’p…´'))©´ôe—T333³²²º%ž(׿TN=YYY=ðCͪsbb¢îãZED·´3nÜ8½Q@@îÔ€u}x@öàÙ€d]Ì>R©tåÊ•öööFFFööö‹-*//§""''§û"TÓàËwA(166öððÐÜ`{”ËåAÔÖÖ¾Lltw*tW˺¡ãáñᇪléÞ.”½ð… ÚÐ^0½]W²I’S§N½víZRRRYYÙ©S§8ާ§gkkk·Ç§=—.]’H$‰$??äÈ‘~~~rùË~Ó‡ÍfÇÆÆš››wK„ºi¹Ûé~x=zô?ÿù–WÑ‘‚Z´Q£Fé&¶^§+ÙçàÁƒ………iiio¼ñ†Ík¯½¶wïÞ›7oô¦ï¬š™™q¹\.—kooQZZZ\\ܵ¦˜7Cú}ØÈȨ[#EZm¹Ûé~x¬X±BK«èÈ Á -›ÍÖj<½åŒ¸­®dŸ#GŽ,[¶ÌÔÔTy£Ê³,—ËÅb±½½½µµõœ9sêêêèíAÄÅÅ ssó°°°£Gòù| ‹àà`¦ÂáÇ• dgg{xx˜˜˜899ÅÄÄPéììÌãñ˜NUªµm‡ŽÜÀÀ ½h¿ÿþ»Ç366vwwOHH@^ÈgccÃ$ ÚÚZ ‡Ÿšš*x<^TT”†ð’’’heeõõ×_3û2];vÌÙÙ™Ë媉î‡ÇòåË«««ãââT"QþÏT~ö4tÑÞ "==ÝÁÁáÀtS$IFFF …BSSÓqãÆedd0ý>yò¤áO …Bóñ*7«!°ŽŒ½Þ‡R¯²E-KKË“'O¶÷(B(;;{óæÍB¡0+++//oÒ¤I3fÌ`‰DµµµôW:¦L™Â” )ŠŠ-**R.Ð ¶í‚¢¨Aƒ…„„TTT$''³X,±Xìââ’™™YPP ‰üýýéú*Õ*++•Û”J¥«W¯~ã7(ŠÚ³gÚèúnnnK–,)..®¬¬Œ‰‰122jmm¥­©©ajÖÔÔh8|__ߪªªäädƒ§OŸ¶ÞÌ™3ëëëããã™jL/¡!C†deeݹsgüøñÓ§OáK†Ša5Íüýý™'D,Ã#99ÙÑѱ¥¥…Rm_—v¡axzz^¹r¥¹¹™nj÷îÝöööéééåååb±ØÊÊJ&“Qm~ŸŠŽDÃñ*7«!°ŽŒ½—ít¬+ÙÇÀÀ ##ã¯&þ$‘H¨?_{WW×C‡ÑrssBô£—.]¢(Š~OP.«¤åöÛË><o×®]ôF‰DâææväÈúÏòòr6›ÝÔÔÔ¶ZÛõ6›žžNQÔ°aÃÔ¶@÷ØÐÐ —ËéGóòò”´Ê(×pøÇg™ÞKmx7nÜP©¦\8xð ]ÿ÷ßg×@—Ù×ððòòÚ¸q#Õ죡  11Q¹©¡C‡Ò§ÛE‘$)‘HH’¤Ô WŠ¢4¯r³ëÈØÓ gfŸ®Ì¼ø|~~~¾ò¨b>Ñ`”–– …BºLÊÊÊè?ÍÌÌB,K¥Ü)ô9gtttdd¤££ã‚ îܹóðáà  úƒ;;;…BAwªRž0KƒUUUááá~~~Ož<)..VÛ­¡¡A,{yyñùüÅ‹kOÃáÛÙÙ©²Úð†g†iÜÍÍM¹ñž×ðصk×Ö­[é3GÍ4t¡a888(7RRRB?ù!‚ ¸\®†/Ói8^åf5Öñ±×‹t%ûL›6-::šÎÊ!.—{ýúu•: ¨¨ˆ.Ó>Ÿßµ•׃ïß¿rvvFMž<ùÁƒ‰‰‰¶¶¶'N¤(*%%…N«ôÛÑàÁƒÛV£ÿ˜¥Áþýû×ÕÕÝ¿ŸÏç«mæååUTT´mÛ¶’’’3gÎhˆYÃá·£jÃÓü½ÐÂÂBåg£ËÏ­6èxx0^ýu??¿5kÖ(o¤( u&;k*IÏç+Kf‰G- ÇÛÁÜÚñ±×‹t%û¬]»¶¢¢B$åääTTT;v,<<\¥Îüùó7lØŸŸÿÙgŸ‰D".—Û‘Æ>L¿¨LaáÂ…aaagÏž­¬¬ÌÊÊš7ožŸŸÇC9244ÔÁÁa̘1E-^¼X,çää,^¼ØÛÛ›nS¥‡ÃQé”ÃáQ__?oÞ<µ-Ðd2ÙØ±c]]]ïÞ½;oÞ<„P}}=ýD"éòá¿0¼¶6nܘ}÷îÝeË–uü¹Õ eÊ·ˆár¹'NœJ¥ ^óP¶páÂuëÖ]½zµ²²rûöí ¥¥¥½Ê]>^FÇÇ^o¢< ëàºEQ>œ3gŽ¥¥¥‰‰‰H$¢Ó¹òÄþÙ³g!!!vvv<ïƒ>Pž~3³bµe„Pll¬rA.—oß¾}È!ÆÆÆÎÎÎ+W®”J¥ô^çÏŸwwwçp8B¡ðèѣϞ= fff¾¾¾ô:eÛj”ºÉ¹Í[o½UUU¥¶ºþÉ“'œœŒŒŒ<==ùå__ß!C†PåååÅápêêê¨?çá<|z»ÚðÔ.X0…Í›7»¸¸XXXÌš5«ººú…¯ÒấÛá¡òR®_¿žÙòã?0ÀÊÊŠþtŒyö4tÑÞjûÂ={ölíÚµ&&&cÇŽ¥—iÚÆCëòñR{ôÌuŸçîm˜0{ölå- "";;{̘1Ú%>>>00ðeú¥ï÷÷ézækßóàÑ›®N489}œûð€ìÀ²È>< ûð€ì󜆆æ;ÎÀ‡J½© e?V<ƒ×±GSó‰{wýò\/Õ¿ÿ¢ ¶76^DˆÄK“””Ô“‡‡a8Ä|ìhË·Gõóþ­þTBÙÜõ þþþ¸CPõܵÎeee¿ýöÆhz‚}ûîݾ- ->þØÍظï\åééIo¾Ë233_þ瘵BAÈŠLdyf²|S$c!„ ¹ÅÇ‘!¼üÅÞÞÞÃÃwÏ!`–¡bÇŽ3»va±€·ÄÁÁ wD@½gO.7ž•”_{L)H‚Mr !DèýnF˜¾°€Wßyoï.¯½fO’ˆ$ɲ²ú·ßÞ~ðà¢ñã]pþÒR//óR5`€÷Ç;'IR š('IHÓ˜‘rêᯤœDHMê¡"IÊk­#¤žÞ²¯½f¯òÁÎÁƒW>þø‡––g˜"!4è]ËhïC7–áú¾•Ûýtè2È>jŒé`høÜû'IRçÏßž>ý›êêǸ¢¡¿-çÛ¸›lÕD°§ÛsåK}¨t ²îî™LõÌ^.'ïÝ«xûí­¹¹ª÷H:Ãb“" Œâù‘K‘æ\½d5†ç«]‹—ËI‰¤ÉÏ/êêÕû: „ÐãòÖóÁʼn(ê¯Ó€pö±t˜s®^²öö<335·v74d“$åá!,u(:+IþàË<6lô’ôúA WLXo†ÙãŽt\ï£A#FØgf0—#AhÐ ›Í›ýÇâ O‘2*cké½cµîôû¹ûbÔG+þó¸â¿Mˆ¢Æ 8\ɽœû¨7j”ƒÁ‹l6‹Ã1‰^»pa5¤Ý{üèÙÉò N×{G8y¬°_!B‹˜9ˆÃeÛ5,‚ëÑ{%xÇPoøp¾B¡04dÉ唿ÿ''›;ÓJJj ²ÁšÞ¹›TÓ*ULÛ?ØÊÍDy»1ÏàíBÓ†¸/ ®uV¯°°z„ͯ¾*ؼÙÿõ× òÝww–‡}Œ;4½£xF*Z©WÌá󬾲z$I;vÝÏo4‹õÇg+{cc?yûíaxc o€ìÓ ÿøÇ¡[·Ê._y嘱ð²`Õ¹¾újzuµ4&æWÜÐ@öé>Ÿ»té¤Ý»ÏVU5⎥"åÔ¾)¯/hÁÐÈ>³lÙ$ÏlóæŸqÒ×4UÉN-ο{¬¶¹F†; #}:‡Ã1\»öýÄÄœë×àŽ¥ï(¹Øp‡"‘ü0‡îp€ŽÀªsWÌ™ó]]ݓӧ¿`>]CÊ©k»Êsã«Ýgÿq3îÀ¹OW¬[7ýÞ½Šøøk¸éÝške¿|zÿ^J­÷ú¿.bú²OW } w,½?, žÙ祌í4kÖèðð­­rܱô\¤ŒÊØRš¾®w "—Ë ‚¨­­íÔ^«W¯611©¯¯×RT}dŸ—µví4‰¤):ú"î@z(iikÊü{…iõÎ>½ãv´l6;66ÖÜܼS{íÙ³çòåË<|x× °îÓ öî½°cÇ™_ ƒû=«(>ßðëúýœ8>[œÍl_ÁŽQSScmmÝ«»Ð18÷é‹O´³³Ü¸1w =)§2·•-ü¾Õû1®Ê©‡ ˆ¸¸8@`nnvôèQ>Ÿoaa¬¡A‚ RSSÇ‹ŠŠb62S$¦¬¹}Š¢"##y<^@@@]]³{zzºƒƒÃè¦H’ŒŒŒ …¦¦¦ãÆËÈÈÐBÈÆÆ¦¶¶V.—‹Åb{{{kkë9sæ´×¾†ÿýwgllìîîž ÒE×^‘žˆÝáܹ۶¶+22îã¤G·’?/Íß?îÆí„ê¶"„D"QmmmRRBhÊ”)L¹°°°½6B¾¾¾UUUÉÉÉOŸ>¥7ÖÔÔ0è²æö÷ìÙãââ’™™YPP ‰üýý™Ý===¯\¹ÒÜÜL7µ{÷n{{ûôôôòòr±Xlee%“É4„G÷¾yóf¡P˜•••——7iÒ¤3f¨m_C„nnnK–,)..®¬¬Œ‰‰122jmmU9ؾ²O·™;÷û‰#e2î@z„œ?ªÎmRûBèÒ¥KE) •rvvv{ "„Ž?ÎÔdÚ죡ýaÆ9r„Þ¥¼¼œÍf755Ñ{%&&*75tèИ˜z I’‰„$I áѽ»ºº:tˆÞ˜››‹jlllÛ¾†är9]3//OíÁö 0óê6ë×Ï,.®ý w =Âè%¶6ÃMÚ{ÔÌÌ !Äb±TÊšÙÙÙu°¦†ö‹‹‹ƒ‚‚‚ ÂÎÎN¡P”••Ñ988(7RRRâææF— ‚àr¹íý„¼²ÒÒR¡ð>¡ jÛ×aCCƒX,öòòâóù‹/~a½dŸnãädýÉ'omÝzº¾¾ w,}“Ú~Š¢Òø ñùü””ú½—>£Ÿ¯¶ýöxyymÛ¶­¤¤äÌ™3Ù¥—‚ìÓV¬x‡Ã1ܶí4î@ô—Ë=qâ„T*ˆˆèà.óæÍ‹Å999‹/ööön¯æÂ… ×­[wõêÕÊÊÊíÛ· ‚––©xþüù6lÈÎÎÎÏÏÿì³ÏD"—Ëíèñ „’ÉdcÇŽuuu½{÷î¼yóBÌeD‰¤SMõp}º“©©Ñ—_Šμ}»w,º#-kÅÕõ7ß|#‹ ôæ›ovp—°°0‘H4sæÌQ£F•––&''·WsõêÕAAAAAAB¡011ñÔ©SôI³??¿™3gzxxôïßÿ‡~èèÁüé»ï¾‹ŠŠâóùŸ~úé‚ |}}§OŸŽòòò1bD_º ®÷éfEùùE‘$•’òYG– z5Å3ò·­e¿ÔÏ>9ÜÄ~Õtœût3‚ 6lð»qãÁ‰ÿÅ‹vI Ÿûû½â >Ûœ»+õ¤¥¥êˆÅâniÿ%õððz8÷ÑŠU«.\¸såJ˜©©îX´¢è¬ä× ,…Æ>[œMô勘öÀ¹V„†Nmn~uw Ý”QW"^+v›f-ú~0¤Ðe}´ÂÊÊlåÊÉÑÑ‹‹kpÇÒÍ2·—Ý?UïµÖîÄ ^̼´E.'}}·;8XýðÃ"ܱt'iY«¬IaåÖî•„tœûh‹+<|æ™3¹/ÞÅKw²AêÝÎ}´ë“OæåU\¸°ÚÐ;z8÷Ñ®†‡:IDATððåå û÷_Á=díâó¹Ÿ~ê½sgZU•w,VšÑ(k†»1mì£uË–½miiù3î@:”SY;Ëά(|øk#îX@ŸÙGë8C±øý„„ì7àŽ¥C—·ž˜ŸWpº~ê¿]…“á^±@[`ÕYGö>~ÜúË/ÿd±zô52%Ò×=à:s|¶ÂEÌ@»àÜGG""fݽû(11w í¢ïÄ|nuÑ _KÑ>¸ˆhdºÓ¯ŸÉêÕSöï¿RPP;õ õ]‚s"IJ$ÚmnΉ_Š;0ƒsb±ˆõëg\½zÿÌ™\ܱ€d]3ÆyæÌ××­Kim•㊡0MrÿTß¹=0è¥ û` ¿_[ûäÛo/é¾kÅ3*cKéÅ/‹ë _üó hd ì·|¹Ï7ßœ/+Óé¤HK[O,¸W˜Vÿî.áŸÛé²kÚ‚ìƒÇ’%Þ¶¶ý6m:¥³‹ÎKŽÍ¹Ç2`ùêèÕOgýÐÈ>x²¿újzJÊÌÌBm÷E_Ä|!´ØmšÕû1®fá"fÐ#À'î8Íû}e¥4-í 6[‹oòVòÔ'÷Oã ó·Ñ^/tdœJJj'NÜ>cþüñZíˆ"§¹ ‡!‰“““õÇ{mÙòK}}“V;‚Ôz •˜­Xñ®‘‘áŽi¸@× p #™™™¥¥¥¸£PÏÛÛúÇ3 x< ûð€ìÀ²È>< ûðУOÜ;¨¹¹ùСC—.]’H$–––cÆŒù裬­­BÞÞÞß~û­››[wõåíí­²¥{Ûï…Báãã“’’Ò¯ÜvèdŸçPBDxx¸­­m]]]jjê²eË>lhh¨wíÚåââÂüib¢ëËY,Öš5ktß/0ózNZZÚ£G¶nÝ:tèP.—+ W¬X±ÿ~6›­¥Í”°XZ|E¼½½UÊA¼óÎ;ZÊ­hÙç9çΛ1c‡ÃQÞ¨’ Åþýû§OŸ¾qãF©TJo÷öö¾xñb@@ÀÔ©S÷íÛwáÂÿ÷Þ{/::š©pîÜ9åB¨¥¥åÉŸH’ÔÜþÍ›7gÏž}úôiÍ}O›6Í××wáÂ…—/_FÎòfÌ˜ÑØØ¨\FJ™ÈÛÛû·ß~ ˜6mÚñãÇBr¹<::zæÌ™þþþ?ÿüó»ï¾›——§¥'èÈ>Ï)(( …šëÄÇÇ_¼x1<<|ïÞ½õõõÛ¶mc:þüþýûCCCúé§sçÎ8p $$$11±¢¢!´fÍwwwåBèŸÿüçûºÿ¾æö÷íÛ'‹'M𤹝õë× ‚ï¿ÿ>... `Ó¦Mr¹üÒ¥K!z}G¹¬rt)))ûöí[µjÕÞ½{e2Y|||ffæÖ­[wìØqöìY…BñÒÏ1€uŸç477+ÿC2«Â©©©ffftùôéÓóçÏ:t(Bhùòå .lnn¦×M-,,&L˜€úàƒ˜²T*µµµ}çwè˜R·Ì¬¡ý€€€W_}•®¦¡¯ÿûßÆÆÆôùÚˆ#d2YSSS•§M›Æårß|óM…BÑÜÜœ––6wî\WWW„Ð矾hÑ¢Î=¡´²Ïs¬¬¬JKK‡Nÿ™ššÚÚÚêïï¯\§ººšÏçÓeºPSSãèèˆ266F¡Rî í0€©¦¡¯'OžüôÓO¹¹¹ååå S½ÓŸî1M)Ó٦Рf^Ï?~ü‰'èõ„™™YÛe›GÑezJeeeÕ1hh¿ƒ¹lùòå=Z²dI\\œòÄ­#Tº°²²¢c@1QÐ- û< ûð€ìÀCVïܹ×ûè@MM î@ï /ÙÇÃÃwúÂÆÆfذa¸£½€¾\ë èi`Ý€d}x@öàÙ€Çÿ€¾° º±§ÌIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Field-members.html0000644000175000017500000010633712234777147031534 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_Field Member List

        This is the complete list of members for Glom::LayoutItem_Field, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Fieldvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_editable_and_allowed() const Glom::LayoutItem_Field
        get_formatting_use_default() const Glom::LayoutItem_Field
        get_formatting_used() const Glom::LayoutItem_Fieldvirtual
        get_formatting_used_has_translatable_choices() const Glom::LayoutItem_Field
        get_formatting_used_horizontal_alignment(bool for_details_view=false) const Glom::LayoutItem_Fieldvirtual
        get_full_field_details() const Glom::LayoutItem_Field
        get_glom_type() const Glom::LayoutItem_Field
        get_has_related_relationship_name() const Glom::UsesRelationship
        get_has_relationship_name() const Glom::UsesRelationship
        get_has_translations() const Glom::TranslatableItem
        get_hidden() const Glom::LayoutItem_Field
        get_layout_display_name() const Glom::LayoutItem_Fieldvirtual
        get_name() const Glom::LayoutItem_Fieldvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Fieldvirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_related_relationship() const Glom::UsesRelationship
        get_related_relationship_name() const Glom::UsesRelationship
        get_relationship() const Glom::UsesRelationship
        get_relationship_display_name() const Glom::UsesRelationship
        get_relationship_name() const Glom::UsesRelationship
        get_relationship_name_used() const Glom::UsesRelationship
        get_relationship_used_allows_edit() const Glom::UsesRelationship
        get_report_part_id() const Glom::LayoutItem_Fieldvirtual
        get_sql_join_alias_name() const Glom::UsesRelationship
        get_sql_table_or_join_alias_name(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_table_used(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_title(const Glib::ustring& locale) const Glom::LayoutItem_Fieldvirtual
        get_title_custom() const Glom::LayoutItem_Field
        get_title_custom()Glom::LayoutItem_Field
        get_title_or_name(const Glib::ustring& locale) const Glom::LayoutItem_Fieldvirtual
        get_title_or_name_no_custom(const Glib::ustring& locale) const Glom::LayoutItem_Field
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_singular_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_title_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_to_field_used() const Glom::UsesRelationship
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        is_same_field(const sharedptr< const LayoutItem_Field >& field) const Glom::LayoutItem_Field
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Field()Glom::LayoutItem_Field
        LayoutItem_Field(const LayoutItem_Field& src)Glom::LayoutItem_Field
        LayoutItem_WithFormatting()Glom::LayoutItem_WithFormatting
        LayoutItem_WithFormatting(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        m_formattingGlom::LayoutItem_WithFormatting
        m_priv_editGlom::LayoutItem_Field
        m_priv_viewGlom::LayoutItem_Field
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Field& src)Glom::LayoutItem_Field
        Glom::LayoutItem_WithFormatting::operator=(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        Glom::UsesRelationship::operator=(const UsesRelationship& src)Glom::UsesRelationship
        operator==(const LayoutItem_Field& src) const Glom::LayoutItem_Field
        Glom::LayoutItem_WithFormatting::operator==(const LayoutItem_WithFormatting& src) const Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        Glom::UsesRelationship::operator==(const UsesRelationship& src) const Glom::UsesRelationship
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_formatting_use_default(bool use_default=true)Glom::LayoutItem_Field
        set_full_field_details(const sharedptr< const Field >& field)Glom::LayoutItem_Field
        set_hidden(bool val=true)Glom::LayoutItem_Field
        set_name(const Glib::ustring& name)Glom::LayoutItem_Fieldvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_related_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_custom(const sharedptr< CustomTitle >& title)Glom::LayoutItem_Field
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        UsesRelationship()Glom::UsesRelationship
        UsesRelationship(const UsesRelationship& src)Glom::UsesRelationship
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Field()Glom::LayoutItem_Fieldvirtual
        ~LayoutItem_WithFormatting()Glom::LayoutItem_WithFormattingvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        ~UsesRelationship()Glom::UsesRelationshipvirtual
        glom-1.22.4/docs/libglom_reference/html/functions_func_0x68.html0000644000175000017500000001130312234777147026035 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - h -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutGroup__coll__graph.png0000644000175000017500000004520712234777145031344 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÄc,$ìbKGDÿÿÿ ½§“ IDATxœíÝi\×Úð3d0l"îØÒ«¥(Á«‚- V6¡ •Öõjµ¶[´îrÕÖZ­­ .,dQ±/¨õ–"*ØP÷EÐ ²D¶¬ó~˜š¦!@€$“Lžÿ¯““sžð霙3g0Ç€ÁÑ"; H¦ L@ ™€@29Ð&; êëëßÒÒÒÔÔôðáÃÄ–-[¶8;;³X¬²²²?üÐÅÅÇñíÛ·9²   ¦¦fÏž=C‡}ùò%Žã¢H¶mÛ6jÔ¨ßÿ¸fêëëK´†b±X½€zë­·îܹC\3 ²²²Ú»woSSÓ­[·ˆ™°%%%ÝÚ5kºÇIxüøñ'Ÿ|bcc³dÉ’?þø£Ï# g¦* ’)‰ŒÉôÒ¥KÎÎÎzzzŽŽŽ)))8Ž{xxèéé555q8œuëÖwóDÉ!”˜˜(^èŪU«h4Z}}=ñ#—ËŽŽf0†††ÞÞÞ?&6nܸ‘Éd¸ººŠÂEÂår£¢¢lllLMMCBBDWdI¦ÉÉÉ666&&&aaal6;;;ÛÞÞ^WWwêÔ©999ÞÞÞÄM$‰ã 5NqíííGŽ™>}zŸG’©ÊÂp'霨b¥}OOO²Ñt÷ïßGÁJû*®™rþüyLš˜˜Š¨#Xi¨Ò‡JªPGpf rÉä’)È$S ¢¤Þ*..–Kã+V¬À0,;;[¢G¢}9v4$S ¢Ø¯ „òòòˆòo¼1ø–Aff¦]zzúà[€wóŠ¢Ó颲¡¡¡øƒô믿r¹Üƒ~ôÑGGWWW^-Mg¦@Í`–••åàà@§Óƒ‚‚zZ´iiiþþþsçÎåóù/^쩚ÔeO¥.–*ÒÒÒB,”4$S ~¾üòËÔÔÔÂÂÂçÏŸGFFöë»<ïôéÓÁÁÁúúú>>>¢åœ»Û»wojjjFFƵk×êêê>üðC„Ð:tüøñ²²²Y³fùùù‰gÏ¢¢"''§;vÔ××x"ùqV &d|6_Ð?™G8q‚(ߺu ½ZTF999¦¦¦ÄÊ¡‰‰‰ÆÆÆÄ‚Óâ©Ëžö´XªÈÓ§O7lØÀ`0ÂÃÃ{_Ðo`àÙ|•g¦@ý8::…1cÆ „ªªªdÿnZZZssó!C0 ommíi¤ÿìÙ3QGD¡ªªêÉ“'D§! Ãèt:ñB&“¹sçÎòòòY³f-[¶ÌÕÕµŸ;Ô$S ~?~LÊÊÊØj¤}âr¹gΜIHHM˜={vO÷ô¥.{Úçb©„’’’k×®µ¶¶Îœ9SæÝê ’)P?Û·og±X>\µj•¯¯/NOJJÏq=9þ<ŸÏ_°`ý•   ììl.—Û½ò¢E‹¶mÛÆb±JKKW¯^MtôÁlÞ¼ùÊ•+µµµ{÷îe0â/ æp8IIIîîî‘‘‘nnn<عs§<÷¨2²¯3õ R×LwíÚåäädll¼`ÁbmS$ÃZ¨8އ†††„„ˆoillÔÖÖÎÎÎÆ»]3•ºìiO‹¥²²²BCC å°Û=€k¦* Ö32QõL1 c±X“'O–ؘ‘‘±`Á²¢RXÏTeÁ0I^‹‡:::zxxȽYdO@2 `ñP©õ%ÞÐk’åƒ3SH¦ L@ ™€@2'à‘ 8¸›úAMCÂq|Û…m›|6Éþ•œ9¯Û¼n3ÌFqQ ,Àª² ™‚~xðàÙ! DqMññ¢ãïÙ¾§…É:k¬iœž>=jJ”;Ã]¡± €……Ù!)à (@}ž{<óKó‹cŠ'ÙM’ñ+¼Nú:WÀ]íµzoàÞ!ÚC! ¸f (îÆŸ7òKó1 »\zYöoéëèOuœŠ!ìÐo‡&ï˜\ÑP¡¸5@2·íÜ6m-m Ãþ÷ðýúâç9ÚZÚ¡àáó‡ã6Ž;rùˆ‚"ÔÉPYi]éÙÛgùB¾P(¼\zYˆ eÿîÌñ3‰9|!Ÿ+à.O\ÖÆiSX°@½A2T¶÷Â^m­¿î²¾ä¼¼W}OöïºØºÐ þ~%*ŽðtVúk[^»ýì¶œ£”ÉPVÍ‹š×Nˆf˜jÓ´óKóeÿº¦5kÜ,mÚß3^xÞ³¦goîxsÿÿöË9V þ ™Ê:ðëý=YÇñ~%S„Ь ³$¦»ð…|ž€÷IÚ'~ßûµt´È'P@ 05 PÓ‹Î6ŸÙ´sÚÅ7š˜4}Û$ñ ¼^W‡¦#±Q›¦í`îp-úZì‚ØA (’)  äëÉmHÚ¬ü’þ]69~&_øwR¦iÑ0„­ŸµþÎæ;n#Ý' x6P Žã»Ïï–ú‘@(È+ÉëWkÿûo aÄ,šÎã/9/=F{èëèË!V@!pf ¨&÷^î£ÚG†éjëv¡×¼¨yÚôTöÖètggâ}| ßZxgóŸ >‹/®©– hÅ»ù€jž5?»ÿü~mkm»ª®µîì­³]¼. aÍíÍÄ€=aIBø”pÙŒÎŒŽ¿¿(~ÞëóB--7Oœl?ùôÊÓŠÚ † ™Š›¾gúD›‰Câ8^×ZWÛZk¤gähá({ åõå&&f†f¢-ï_ôÙï“™úV¨Bj †ù€âêZë† Ga6bØ[—~eR„Óp'ñLŠš=aö÷%«~ZUÅ®’g¬@A2WßZ?Üx¸Ü›ý&è›aúÖœXc;@€d ¨ŒÃç´t¶X[ʽec}ãc‹]zx)þJ¼Üê’) ²†— 8ŽÃ|¹›1vƼþ³6míã†ÇŠh¨H¦€Êˆ LŠæbÄÚÐm[ܯ•R%A2TVßZ²4’ÿ0Ÿ`0Äàä’“……~=  .€º€d ¨¬®µNOGÏXßXq]¸tûÌû³èÌèûÏï+® ú ™*«Y¯  ¦â6ÏÛ<Úrô¢c‹D Q ÉPYýËzEÜÊ— «­{rÉÉ»Õw÷\أ辀ʂd ¨¬®µNqwŸÄ¹ØºÄ¼³åÜ–;Uw”ÐPAL•Õ·*ãÌ”°á .¶.Ç"¸|®rz*’) 2å\3%hkiŸ\r²´¶tëÏ[•Ó#P)L•‰ÌWޱ#ÆnŸ¿ý¿¹ÿ½^y]iÉPŽã /”sÍTdí̵îN-êäu*³_@:H¦€²Ølž€§´k¦-LëøÇŸ·<ÿòô—Êì’) ¬ºÖ:„2‡ùs‡Ý»÷_Úÿ[ÉoJî’) ,âÁ|%Ÿ™–y,óžàýÁñ^v½T~ï€Le5¶5b&±®³r`·(®µ«õÓôO•ß; $S@YMmMÆzÆÚZ伂ךnýmð·G.ɹ›CJ@É ™Êjno&å´T$|JxÀ¤€>jno&1  Le5·7›5%7†ÞÿA ¬IYCn@ ™ÊR…djnh~8üpòõäôâtr#ŠÉPVs{³ÙP2‡ù?¿÷ÝÞ_™¼’˜ª¨ ’) ,U83% =¨?DiÂR² ÉPVS{“Š$ÓaúÃâÅŸ»s.¡0ìX€¢@2”¥:g¦¡Yãg}4í£5)kþlþ“ìX€B@2”¥RÉ!ôMÐ7F‘'"q'; L5up;ºx]ªpJd¨îМÈ+É;|ù0Ù±ùƒd ¨‰˜'¯Rg¦!w'÷5ÿ^óiú§eõedÇä ’) ¦¦¶&¤zÉ!´ë½]öfö‹-dÇä ’) &âÌ”ÜÇI¥ÒÕÖMˆL`=a}{é[²còÉPSsG3†a&&d"Å¿˜ÿŠò‰úòô—÷ªï‘ H¦€ššÚš†é£iÑÈDº¯æ}ålãq,‚'à‘ H¦€šTm^”m-í„% kîÊÙEv,@> ™jbw°Uj^Twã­ÇoòÝ´íçmÅOŠÉŽÈ$S@MMmªò,i/¢æD¹t[t|Q¯‹ìXÀ`A2ÔÔÒÑB7 “E´0­Ãá‡+*bscÉŽ $S@M­]­ÆzÆ½× ÄÈ6ÁfB×Å®-[ÈD±•ó{'9¯Ç@Ñ^v½4Ò3곚››Ûºuë”&Û·oÙ!($S@M2&Sƒ¤„x4YzºF¼e†ù€šdL¦È $S@ML’A2ÔÉ($S@A¼N¾É($S@A/»^"„ ™eúG2=uêÙÓÑ€œiÂü¾îÈJ¦†566*¹S¹úÇS\ Ϲöƒ”©QiiiÊ(‚†ÌïëÎLû‹Íf“¼¼<„‘À~’LaÚehÈü¾îþJ¦ºŠÊ†544˜››+¨}åwG§ÿýè­¡¡¡ø@FpÍP|ÏLY,Ö”)S ìííãââ0 CYXX466r8œµk×ZZZZXX|÷Ýw¢¯`–””$*øúúÆÄÄÕ××ëèèTTTÄÆÆ:88˜šš655!„„Ball¬££ãСCÝÜÜ®^½J´ êŽÏçÇÄÄØÚÚš››‡††ß"êäçç3™ÌcÇŽIßÐÐ0˜}Ç0,++ËÁÁN§‰zÝA2ô²ë%M‹f0Ä@.­…„„LŸ>½¢¢â›o¾Y¶lYmm-Bˆ8Uܾ}ûéÓ§333¯^½š••%úJbb¢»»»¨,ú4##ÃÝÝ='''>>>%%…Åbuuu-_¾!tàÀC‡?~¼¬¬lÖ¬Y~~~|>Ÿx/4ÑÝÞ½{SSS322®]»VWW÷ᇊzüâ‹/~úé§… ж\¹r%$$ÄÃÃc»ÿå—_¦¦¦>þ<22r­Q.†¸ZŠª ; ½|ÔxµqŸÕd<>¦¦¦ûöí#Êl6›Ïç#„pwppˆ'>º}û¶h»„/^èéé=zôÇqcÇŽ?>99™ø´ººšF£µ··7...ŽØ( Ùl¶P(Ä_%SÇGuòäI¢Â½{÷B/^¼ *¤§§Û;::Ž=êâââéé™––ÆårûÜAq!‹%þã‰'ˆò­[·D=ö‹†ü™)  —]/åxÁôСC±±±vvv‹/~ðàö÷«PjjjFM”E…îŒçÌ™“™™ùüùó›7oVVV†……7ÍmllAUUÕ“'OÆŒC|Ã0:NŒñEž={æèèH”‰BUUñ#“ÉD]¸pÁÎÎîÎ;)))yyyAAA:::ƒÜ}QDl¢H¦€‚äûø“ÏÓ§OÓÓÓ­¬¬<==«««E1ŒÒÒR¢\^^ÞK#ÄH?##ÃßßßÐÐÐÚÚúÌ™3Ä q:zôhkkëÊÊJÑWZZZ‚¼šÁ`TTTe¢`mmMü¨¥¥ETpuu½páBNNŽèý =~ü˜(”••‰÷$ 0™¶¶¶~úé§¶¶¶ººº¶¶¶‘‘‘¢¿0¹OOSô ¸A¶&ujaïm >E{É‘g2uqq‰ŽŽf2™“'OÆq\OO½šK¾uëÖ«W¯–••­_¿^ô•¤¤$"-Š sçÎ}ôèÑÁƒ/^ŒŠˆˆˆ‰‰)...//_ºt©——Bèƒ>ؼyó•+Wjkk÷îÝË`0:;;‰‰î-Z´mÛ6‹UZZºzõj___‰Ûî&LøùçŸsss«««'NœyãÆAîþöíÛY,ÖÇW­ZEô(Ú)ðâc~¯™ ww÷·ß~»¨¨¨¾¾þÖ­[+W®d2™]]]x·k.ƒÇ~!”——G”‰ ór1È€‘´Ëd½·)÷CÔ ¹VÕݲÄe3öÎ賚ŒÇçÒ¥KÎÎÎzzzŽŽŽ)))8Ž{xxèéé555q8œuëÖwóD ¡ÄÄDñŽãÁÁÁL&“¸ Êår£££ †¡¡¡··÷ãlj7nd2™®®®yyyÄEÝq¹Ü¨¨(SSÓÑžÔ¿¨ööö#GŽLŸ>]–#&‚º]3ݵk—“““±±ñ‚ êëë%vJòw8d?bĈ¶¶6ñ¢§¸L¡ –ûL|Ro)ô^AödÚgûƒ¡!ÄÝ… õ;è×g5=>²“ú—ŒÊÈȽ 9Îæ'''¯ZµjèСâétºø…ù^&Ä¥¦¦2 ##£ 6¤¤¤X[[‹†Hôz C4·nÍš53gÎ455Õ××wvv>uꔨ¹sç †©©éÁƒ‰sE­Ýºu«{#âSü¤V deeÙÛÛÓéô€€€úúzÑvÇ»Ï%”ØQû=Uîóˆî`É(©ÎŸ?/õ¢™h¬Œ?㊂Ä3«Œg¦&&&ÙÙÙ=}Šb±X»vírtt,***))™1c†¿¿¿èS__ßÆÆÆŒŒ „М9sDeb¤“˜˜XQQ!^hYüÇ©S§0™ÌåË—WVVÖÖÖÆÅÅéêêr8¢‚··w]]]ff¦¶¶6qbäÈ‘QQQ555™™™ZZZÄœA‹5f̘ž!Î{©0iÒ¤Û·oß½{×ÍÍmΜ9¢P8àääTXXX^^îëë+úŸ3’vfÚKåÞX/4䌠;Ï=ž+’VôYMc’iÈqH2ÕÖÖ¾zõêßM¼Âf³ñW™¢— qÄ• â6¥x¹Ï!|÷dJÌ­kii]B-))Ab×­NŸ>-jŸØ(uÎ ‹ÅꥢÐKѵ-âbss3ѦԹ„xÉ´—Ê>bòGÜݤm“>Ïø¼Ïj{|”LCŽó@†ùÖÖÖ¢é DŸ,BèeBœ¡¡!z5“C¼<Äܺ–––˜˜kkë¥K—ŠW°±±‘h¿§9ƒ½4Òg'''¢0vìX„PMM ñ£Ô¹„=íK/•åxÄ4Dkg+ ó’ äßä¼yó:$šG§Óÿøã‰:½Lˆ“#"§xxxTTTìÙ³çÉ“'.\¯ 1çõ|>ßÂÂÂÎÎîý÷ßß.þïB9s“Au޳BÁB'T¦!Ä^t¼@¢Ü»¹}ÖTãsñâÅaÆ¥¥¥ÓNLÕÜÇTó’£~Ëì§¥¥ùûûÏ;—Ïç_¼x±§jR§oK]U„˜…¢ð°Ð  µ{g Ç;}útpp°¾¾¾øó ¤®g*uTÑWŠŠŠœœœvìØ!þ8 PH¦€jÚºÚB†º†d"«K—.!„fΜ‰š?~vv6‡Ã‘Zóرc›6mzë­·FýÝwß9s¦µµõðáÃ_}õ1ioëÖ­åååâÏ"úøø\¾|¹½½}Ò¤I¿ÿþ»rvJA2TÓÉëDÉk™}%HKKknn2d†aááá­­­=ô¥NßîsT&“¹sçÎòòòY³f-[¶ÌÕÕU‘{£¹ ™ªéàv „ô‡è“ˆL¸\î™3gD«£Íž=»§7!J¾Ýç*¨„’’’k×®µ¶¶§À@î ™ªéäv"„ôuÔ#™ž?žÏç/X°€þJPPPvv6—Ëí^Yêôí^VAEq8œ¤¤$ww÷ÈÈH77·ìܹS‰û§A¤¼êYÿüs‡ÖØØèììüóÏ?Ïrrrrss¿þúk777åì‘Æ’’L{¹™H?üðàý÷G öõ8*®ªªŠÁ`…²ur;Õå´!”œœ,±ÅÌÌŒÇãeüÕBB¢Blllll¬x}­[·nݺUjûóçÏŸ?¾<#=’Lƒƒƒ•‡2iiXZ~´fÍ;dÇ¢pd‡ lܼ`zþüù9sætßþå—_nß¾]ùñ¹ûG2 "+¥9z4ÿ«¯ÎLŸ¾8'gÙ±ùëä©â™©èìP’&Þ€ÊÌü!tûö³çÏ[ÈŽÈ_'·SæEÊиdZYÙpçÎ3„¦uú´äÊ€:y*8Ì”§qÉôìÙ›::4„@ xðüéÓ&ÑmÚÙ³7IÈ_·ÎLòiÖ¤ýÓ§o ¢Íåþµ¦'HOg}ö™O÷·›õÕ¯PUUU¤O¬ÖF]¯ ’oÑ )úïQCæ;Só—'Žãéé,Q&%TW³oÝzöÆL²¢r×Éë´0²±rQQ¹«'0Щ5¨¤îíqS ЄùΔL‹‹ŸÔ×·JlÔÑ¡9s’)•È>Ï´§õD”§ìGôÇÇHÈï÷¾g5ÉÁ€ÁÑ k¦gÎÜ2Dò<ž 3³X ’P„N®:Ü€â6£ËóPñJ$ä"„•7š Ú IDATÙÁÒ”dÊç ³²þ㚛ۋŠ*”Pn‡ªOÚžƒÎBÏÏ#âf¨-2‚×z«=MI¦W¯–½xÑ%õ#ÌÞ§•žg*ä ?Ö ß|çòBÓA6’«Cu¤)É4;ûBH[›Öý?>_øÿw›Ç“²ž.PGª;Ïôe):ÿ&*=„Žèïc|jДP£Åï2}þù©°°)¯¿n+ÚÒÖÖeb2”ŒÐ€œ©æB'¨d?ºù9B8Â%þ·MC–^ä„äJS’©Ÿßâ?~þù©iÓFÏ›çBV<@q:8*¶—Š"Qõ$eÕ( ™¿…tÔæEª š’L†Àq¼‹ß¥B7 Ø·PÁ{¨ã™´LŠ–6²–²È)PGšrÍhŸƒã¸ ó l‘É ©OÙ yhÄl¥Ç’) â=Ï*4Ì×5CÓ2ÑÛéH{Òêöšœ!&Èl2aùƒd (å¯÷<«Î™)Ávšû ›€Øù)FŒña]Š€d (å¯÷<«Î™©¿ ½,GÖï šÒ"îU‘•ÉQùd (…æ«Ð (‚‡®!º3š~yÿŽŒÇ „!G#f’H¦€Rþ:3Uµaþý¨µMMF˜6¢OD> ñŸ!úkHߊìÈ€Ü@2”¢r7 BM×ѽíèÝÈpä_[´t‘ËÑ¿ÿGjX@Î ™J!ÎLõ´õÈä~*\Œ¬f£QË%?Ò5##  (0iP ‡ÏAéé¨L2½»uÕ¢á®=åA2”Âás0 Ó¡u›ÑIÇH4b2°í»&PsL¥pù\šŽ ½ÔËx 2Cv@àš) Ÿ£«­Kv@A2”É’) .Ÿ;D{ÙQMÉP œ™²@2”ÂáqH>3­9¸l2$d (…+à’yfúâº<Uœ -@H¦€RÈæ ºÐ•@d>ù˜œ©`ž) 2o@Ýý uÖ ¯ ƒsM¿u@)¤™Ö磇{Ñ¿ö!ÆÀÀ0¬±±Q¾A)´Ùââb¹7«R=ö$S@)ɔ׊Š>@¶ ÐÈEÊî¨ H¦€R¸2†ù7>AüNôæ!e÷;h :o•—žÂSͰ!™J!çÌtÄ,ôÖQ¤kÞÓç [X,Ö”)S ìííãââˆ#FŒ033Û¿?BèÖ­[3gÎ455Õ××wvv>uêQ ðüü|&“ëàà`jjØÔÔ„âp8k×®µ´´´°°øî»ïD=b–••åàà@§Óƒ‚‚šššˆ ,,,ˆÄ$jöرc}ÆßÔhß}÷Ýo¾ù†¨PTTdnnÞÙÙckkknnJÄŒþ™‰²Dxâ;"ÚŽãx÷#@ÔIMMe0FFF6lHII±¶¶666^¿~½xS---|>¿—ê³Â?àÉÊjíÙ³7ÉŽÈŸïw¾áñádGñ·‚‚‚ààà±cÇJl9rdTTTMMMff¦––Vmm-BhþüùÍÍÍiiiÚÚÚ]]]cÆŒY¾|yeeemmm\\œ®®.‡ÃÁq!4uêÔ‚‚‚Ý»w;99–——ûúúà8Ãd2 JJJ¦OŸŽjhh ¾5vìØ¢¢¢¸»»ûùù‰OÅ›íèèè3~„‹Åß"5Ú'NL™2…¨ðñÇ/[¶l×®]ŽŽŽEEE%%%3fÌð÷÷5(‰(fñ¢EÛ8Ðý|}}322BsæÌ•?~,Š977×ÎÎnûöíuuuR}}VøÇ1é³%A2¥ªÙûfGžˆ$; ¼££ãèÑ£...žžžiii\.W¢‚©©é¾}ûˆ2›Í&Nnܸã¸@ ’qZDÔ)))O1ééé8Ž?>99™¨P]]M£ÑÚÛÛâã㉷oßÿÖ‰'ˆí·nÝB½xñB"[ÍÊ÷d*5Ú––==½ªª*@`mmŸŸ?jÔ¨“'OÕîÝ»G„4™J=D…¼¼<ÑÁ/K„ýôéÓ 60ŒðððëׯwÿUöYáïcÒËgÉ”ª¦ïž¾2i%¹1œ?ÞÂÂbõêÕ>ì©Njjª¥¥%“É\´hÑÕ«WqGÕ×ןÉâÉ“'ÑÑÑÓ¦M³²²’8Ç$þUëëK¾¥¤¤DOO¯  €h§³³Sü[Ûïß¿/‘­ˆfe‰¿{Vê)Z__ßýû÷çåå1™L¡P¨§§wåʉ0ð&S©G {e©eq]]] ...o¾ù¦Ôýí³ŽãpÍP ‡ÏÑÕ!ùÙ|ƒáêêzáÂ…œœ6[ú£¥>>>OŸ>MOO·²²òôô¬®®F¯®ŠxxxTTTìÙ³çÉ“'.\ÿHKK !dmm}æÌâ_²P(d³Ù£Gf0¥¥¥Dµòòrño=~ü˜(”••_—ˆŠhV–ø»ë)Ú   ŒŒŒ´´´ à FEEñQ…A$»ªª*{ìéÈþu‘’’’k×®µ¶¶Îœ)ý}±}V@p P —ÏB#yÕ¨ &üüóϹ¹¹ÕÕÕ'NŒŒŒ¼qã†D—èèh&“9yòdÇõô¤¼g…Ç㹺ºŽ5êáÇ¡ææfñ 111ÅÅÅåååK—.õòòB…‡‡oݺõêÕ«eee÷[¶oßÎb±>|¸jÕ*___:Žêž.e‰!ÔÖÖÖòŠ@ è)Z??¿âââÔÔÔÐÐP„ТE‹¶mÛÆb±JKKW¯^- ƒN§Ÿ={¶µµuÇŽâ½ô”͉íR€ì8NRR’»»{dd¤››ÛƒvîÜÙ¯ ÿÐÓ)+µÁ0Ÿª&lš°éì&…wÓTŒãBY*¶··9rdúôéÛ/]ºäì쬧§çè蘒’‚KçfggÛÛÛëêêN:5''ÇÛÛ›¸„^U¹\ntt4ƒÁ044ôöö&n­p8œuëÖwóØy×®]NNNÆÆÆ , .)xxxèéé555á= {Š_"°X¬ž¢Åq|Þ¼y&L Ê\.7**ÊÆÆÆÔÔ4$$D´Ë –––fffIII¢˜{ O´]êÀeægee…††öôë볂8¬ûqÑÖÖë~üqѼy.dälÔ—£O]üå»_*°öMtÁ MMBÌ@ö"o†±X¬É“'+¿kWW×/¾øBù]+ ó¥pù ^5Šß®.D#f!f€{¡ŠŽŽŽëׯ_¼x1,,ŒìX:”¢ðP·¢—ÜŽ©Ý«›Iƒæææ.^¼xÓ¦MvvvÊï]É ™Jáð9 ¼õ<•~<²ÞpEuA- ,X°`ÙQ( ó¥pù\E™r›Ñõ‘}bø+¤} æ ™JQàÔ(Ö*¤¥Þ<¨Æúƒd ¨Cˆ ùB¾BVÂ…HϹF:Ãäß8 ¸f ¨ƒ/à#„th:òoÓB“¾•³€BàÌPOÀC J¦ô’) "™jkÁx ’) 83$‚d ¨ƒ/ä#„t´!™@2Ô!ça~W|Úš’) yó ÑYÔü‡šš’) ¹Mâµ¢«¡hÄ¿‘é¿äÐ LuÈm˜ÿÇZ$èDoÅ«Ýj&€D0‰PÇ_ÃüAÞ€ú3UGg`5Ð/pf ¨ã¯»ùƒæwÕ"Ö ä¸1üäÐ LuÈáÔïËÐ4é;¹Å4$S@ƒ½fÊkEœ&äzi•gX@3À5S@ƒ½›¯cŒf]‘g@@“À™) xœ’) Ž¿†ù4o@2Ô!‡»ù $S@<Ã0X‚’) ž€×ïL*ä(& q ™êà øýK¦µÿCçÆ Î…E4$S@<¯Ï’vÕ¡k¡Èì-¤o¥È €¦€«Kšè›o¾),,$; ù«R­7D/00P–Ê.–uK]Ú6du¾Ø/S}rM™2å“O>!; ÐH¦š¨°°°¨¨ÈÍÍì@ä̆kcõ‘±ò­:Ë/ùðj08+**";Ð7H¦ÊÍÍ-==ì(€Ld<×äRƒÿ-€êƒd rÉä’)È$SƒAÝÍ/,,üæ›oäŠ2Z8°71Qý%TÍù††544˜››“Hÿ((l5=`ufúìÙ³ŒŒ y…¢L¯¿^G§«_&-**¢äd{(@óLaº¢Ò>ßPÉç\”<Å£äN×LA/X,Ö”)S ìííãââ0 CYXX466r8œµk×ZZZZXX|÷Ý߯ŸÃ0,))ITðõõ‰‰!>ª¯¯×ÑÑ©¨¨ˆupp055 ljjB …ÂØØXGGÇ¡C‡º¹¹]½z•hAԟω‰±µµ577 %¾EÔÉÏÏg2™ÇŽ“¾¡¡¡÷Ý!6fddŒ1ÂÌÌlÿþý¡[·nÍœ9ÓÔÔT__ßÙÙùÔ©SÅÇÇw¿—£‘••åàà@§Óƒ‚‚šššÄwª÷øúÁ!--m-€~ PZ;#GŽŒŠŠª©©ÉÌÌÔÒÒª­­E544à8Ãd2 JJJ¦OŸ.Úž˜˜XQQ!*$$$Œ7Žhíû￟>}úœœœ ËËË}}}‰0¾ýö[[[Ûüüüêêꘘ333‡ã¸¨Ù]»v9::•””̘1Ãßߟh!4uêÔ‚‚‚ŽŽQØÁÁÁcÇŽ•ewæÏŸßÜÜœ––¦­­ÝÕÕ5f̘åË—WVVÖÖÖÆÅÅéêêr8ñŽvïÞÝ=þžŽBhìØ±EEE_”âãã‰nß¾-ž ĽxñBOOïÑ£G8Ž{xx;vlüøñÉÉÉħÕÕÕ4­½½}ܸqqqqÄF¡PÈf³…B!.–wFuòäI¢Â½{÷B/^¼ *¤§§Û;::Ž=êâââéé™––ÆåreÙ7nà8.ˆ¾ZZZø|>Q§¤¤D<-I¿§£:qâ±ýÖ­[DØÉT/ ™ªæƒ:t(66ÖÎÎnñâÅ< Ñh¢jjjFM”E…îŒçÌ™“™™ùüùó›7oVVV†……a†a˜@ ¨ªªzòäɘ1cˆ¯`F§Ó‰á°È³gω2Q¨ªª"~d2™¡ .ØÙÙݹs'%%%///((HGGr->©»Ã`0BZZýChii‰‰‰ñðð°¶¶^ºt©ø×‰Ž¤ÆßËÑ…Mì (l‰f@2=òññyúôizzº•••§§guuµè#ƒQZZJ”ËËË{i$888+++##ÃßßßÐÐÐÚÚúÌ™3Äÿɉ“ÐÑ£G[[[WVVоÒÒÒBœ*ŠwWQQA”‰‚µµ5ñ#‘ †««ë… rrrØl¶ì»#‘µ=<<***öìÙóäÉ“ .ˆDt$5þ^ŽÆãljBYY™xØÍ PÒ/²µµõÓO?µµµÕÕÕµµµŒŒýËÄ0¬¸¸XŽ}ɽAìQ9\\\¢££™LæäÉ“q×ÓÓC©*<<|ëÖ­W¯^-++[¿~½è+IIIDZæÎûèÑ£ƒ.^¼!S\\\^^¾téR///„Ð|°yóæ+W®ÔÖÖîÝ»—Á`tvv Ý-Z´hÛ¶m,«´´tõêÕ¾¾¾t:]<Ô &üüóϹ¹¹ÕÕÕ'NŒŒŒ¼qã†,»#Ç㹺ºŽ5êáÇ¡ææfñ Rãïéh „¶oßÎb±>|¸jÕ*QØ=¥{ Þs@Æk¦ÀÝÝýí·ß.**ª¯¯¿uëÖÊ•+™LfWWŽã!‹5˜0$ȽAÕéQÉ×L/]ºäì쬧§çè蘒’‚㸇‡‡žž^SS‡ÃY·nqÿ:!!‰]%LLL/à8Ìd2‰Ë \.7::šÁ`z{{?~ü˜Ø¸qãF&“i``àêêš——G|QÔ—ËŠŠ²±±155 ¿æØýÈ···9rdúôé}îúç分†ììl{{{]]Ý©S§æääx{{7²DI¿—£±k×.'''ccã Ô×׋ïTOñø÷È¥Œd?bĈ¶¶6ñÄ\m“©Ä¿CQ¨‡[1r¡äd I^ŠðûR Êæ'''¯ZµjèСâétºø ^&¦¦¦2 ##£ 6¤¤¤X[[‹S¥ uòà»ï¾+z¶¨¨ÈÜܼ³³³§ˆY¢²ÄlAñí8ŽwŸ(ËÔ‘2’éÍ›7_ýõÞëìÝ»7555##ãÚµkuuu~ø¡è£äääÛ·oŸ8q"66611ñîÝ»Çÿæ›oˆ‰‰‰îîîâ…îBBBFuãÆ'Ož¬[·.""‚Ë剞…MMM Ø¿O1HÀ_J<Ç"¾ýûï¿OIIa±X]]]Ë—/—qeà8>yòd²£Ê2˜ÓZ‡ùÚÚÚW¯^ý(êšÍf㯆B½L$$® ·wÅË=  º$uò`KK‹žž^UU•@ °¶¶ÎÏÏï%‰+kÝ7væK8°=a¾f‚ß—ZPÆ™©µµµhâ‘CÅ'Ùz™Hhhhˆ^Í /ËNêäÁaÆ͜9333óòåËÚÚÚÓ¦Më%†:!Q^{P5Êø7|øñãÇel<<<œXdHT@yyy™¼róæÍÇ}útÆ #<<üúõëÝEŸ 晪Í=3ƒ'Ë*¢Ý©é´_&“¹sçÎòòòY³f-[¶ÌÕÕµ¿µA2'Ë*¢Ý©õ´ß’’’k×®µ¶¶Îœ9s`UA2'Ë*¢ˆÓ~9NRR’»»{dd¤››ÛƒvîÜÙ¯ €ús®™*™ ^3éiQ‰¿7‹ÕÓš¡8ŽÏ›7o„ D¹§5L,--ÍÌ̈Eˆí=-*¾"j÷uHñnX¥–qÏÊÊ -,,ìi÷û¬0pÍT-hú<Óž¼xÑÑÑÁµ²’é),¥QÇy¦ý¢^Ó~•Fe_@œöà›x‹e˜›¿Ïá-#ƒÅãý}rJ£i}ýupP,³¦(uwÚYÿ¸ë ÷(ÛñAdG@oàš©L–.Îç ‰2†aC†hÓé}¿¢ ŽnŸ¨;·¤´³E€ BÈj’!Ù1иf*“1cF¸¸ØÞ¾ý Ã0]]í“'?ª­mY³æ'ccý•+g¥pÛy+ÿ¼ü!á!4d(Íd¤>ÙqÐH¦²ZºÔsÅŠSSýÔÔ•ÎÎ6¡ÚÚ;vülj:4$ä-²££öã® ëÊÛkyýuõ ÓÂFLŠÔàVÐtLeõÿûßãöî ¶´FlYµêßMMmŸ}vŠN7ðñ™HnxPq‰¿é‰„b{1-d5IÊÔ4T ܀ꡗXèÇñO>I={öfjêrWבd¦î„|üú7Õ÷NÕ#iŒþ c,& UzPôÜ€ê‡îKFa¶{wÐÔ©N|p¬´T£çî §•~uùýté™”63c ô è7H¦ƒ¥£C;zt±£ãð«ªd}© ùøùÕ«‰ ¥}Œ!‹ CµTc%YzÉTôõ‡œ<ih¨ûþûGZZ:ÈGhics¾wrŽa£I&M-Ìæ-¸` Ô$Sù01š–¶¢­­+,ìpG—ìpÔÉCڔϾq£¬†hý3Ÿ ¹¸Õ¿`†)PLåÆÊŠžœ¼¬²²qùò“¢þ@F#\ ÿ½Ë~èˆ! ëµ´1 g¸õÔ$Sy3fDbâÒk×Ê×®ý ¦Iô‹çoýsSw^üh#†.qŠj:J_[þDz€¿T9›4Éî‡"²³oîÜùdÇ¢NnŸ¬{YÍ™ö%søÄ¡©ãÞøh„–6fý&\0jæ™*DFFñÇÿ´qã¼åË=ÉŽE °w~ÿ¡ëç…ÃÿÞXÑ%ä a^Pð”BL®®foÛ–mbb +Kõâ—·>57tBðpñí&#õÈ €€dª(<‹ÍnÿüóSF3fŒ#;Õu?­¡©´ã½”q\sê þ~諯üüýÿõÑG'Š‹+ÉŽEEñ»„7ÖN|ß’nç¡@½Á5SÅâñ‹ÅݾýììÙ5NNÃûþ‚æa?î2¶Bÿ_ê ’©Âµµq¾ohx™½ÆÆÆ„ìp ÉTš›Ûýü¾ÓÖÖ:}z5·§  [)ƒ©éÐää¥--ááGàaS( ’©’0™f?ý´¼¼¼aÅŠxØêdª<ãÆY;¶äòå’O>I«+P $S¥š2ÅñðáEgÎÜØ½;—ìXHóô·ü.87TCÛ¼y3Ù1hGÇáÆÛ·Ÿ32ÒŸ4Éžìp”­þn{îÊLFê›:Á G¥ÀP$xÿý)uu­[¶œ511 |“ìp”GÀþöÕæ´aŽ>0E P óɱ~½wdä´O?Mûí·GdÇ¢<7ŽÖv4ð§~n;Èv0 +..æóù†566 …Á|© ™’fófŸ‰‘‘Çÿøã Ù±(C㣎;'ëÞüµáˆ!riF£%&& d™¾Á|©`Ò>™xâS6›ÍçóLÇŸœœL|Z]]M£ÑÚÛÛe ²{ï> @}Á0_%ØÙ™¥¤,¿ÿù²e÷fSCCC„–––D¹_:kgg·xñâÐh´DRYY†a†a666 ªªJ– åÒ;PwLUŸqÖÇŽ-ùí·G_|‘Av,êÇÇÇçéÓ§éééVVVžžžÕÕ!¦U„ $IDATÕhÄÚÚúÌ™3ÄY†P(d³Ù£GVZï@ÝA2U!S§:ýøcDJÊõ¯¿>Ov,jÆÅÅ%::šÉdNž<Çq===„›Í–ñëD͈ˆˆ˜˜˜âââòòò¥K—zyy ¦w i ™ªŸ‰;v,øúë qq—ÉŽEÄÅÅ]ºtÉÁÁ!***11ÑÌÌÌÃÃãµ×^knnî󻢚6lðõõ?þo¼ñìÙ³ÌÌÌ÷>¸½j 晪¢={r÷ïÿå‡"æÎu!;–Â…^4 ü½«¢Ï>›³xñÛÿùOR~~ Ù± е=Ï®íy6˜Ο?I£äFœ™ª(@¸bEÂo¿=ÊÌüÏĉ ²ÃéŸêë/sV•ý{§ÃÈÙ°  ÐLU‡Ã_¸ðDz²º³g׌iAv8²âs„Y!MFêÏúz$Ù± <0ÌW]ººÚ'O~he5,,ìp}ýK²Ã‘ÕÃ5l¾{ô`—†@½@2UiFFz‰‰Kq-\øCkk'Ùáô­ñaÇݤz×ÿØXè JÉTÕYZ§¦.oll[²ä—Ë';œÞùxþ–§–¯·V`’©°·7OHøèÎgË—'ªû°é³k­/žv¹o`"ŒìPP:¸¥6®\){ÿý#!!®±±dÇÒ£r†1uÉŽÀ õÔ“iæà`û†M™âHv8Òé ƒ·Š úêÄÏï 6»ã‹/2† Ó_²dÙáþÉTÍ,^ì^SÓòÕWg†7öõ}ìpdª~¢£ßill[µ*qØ0ýiÓdZ# hpJ- ÂeËN”ffþÇÙÙ†ìp05J=ÑhZ¾?~¼uxø‘?ÿl"+ n›àÑéF\ÿ?’©ÚÒÓÓ9yò#33ÃÈyØô÷Õ7ŽÔð:Twê+JÉTë%'/„GÛÚ8Jî½úzëÃÌÆi1vC á•G@2Us––ÃÒÒVTW³—,‰WæÃ¦¼aÁö?|LmÝ•Ö)ª ’©Ú#6½yóÏ?þI¨¬Ë—7×ð»„S>S³…VPH¦TàâÂ<~|INΘY_[4 ÷;îþTï¶žÏ; É”"Þ~{ô·ß†&$\;pà’B;òñË[Ÿ2§;ù˜*´#Ô œYPÇüùÿji鈉É277\¸ÐMA½àBÜÞ“>z¼€€€dJ)|ðvu5ûóÏÓ‡ 3xç×ÑmˆÖ¤VŠhµO@Q Žãë×§9s#%eù[oÁ[˜PH¦$?úèĵkeYY«Ç·&;4$SjêêâÿðçŸÍÙÙklmáN É”²Øìöùór¹üììÍÍ ÉŠƒ©Q”eb245u9Ÿ/ˆˆ8ÚÞ>¨‡M¹myEUÁ™©œ:uŠìzôüyÇ÷ÆŽ¥/Z4ЕOqÔvÂVÏ­=ºM®¡)ÊÔ©S x4 ($S9À0•~ç! „„\îó· O3âްSŽQ)NZZZPPÙQóLå㫯¾òôô$; €¼¼¼Èh(¸f rÉä’)È$SH¦ L@`j”òtttœ>>::ú§Ÿ~úå—_Ž;•žž^SSƒúâ‹/œÅ Ýmݺ•Á`9r$55500pçÎ|>ßËË+??Ÿ¨ð믿NŸ>=33³§$äåå!„Dg¦}îàÑ£GcbbdlŸ·iÓ¦ï¿ÿ¾±±q÷îݽW€DL•¤££ƒH:¯WÚÚþ^Š)77wÑ¢EãÆc0kÖ¬¹råJGGñQPP±±ñ´iÓB!!!¢2q²6kÖ,+++ñBw?üðÃǸfª$fffÏž=›0añã¹sç8N@@€xúúzkë¿Þ2BìììBúúúèÕòTâeÙµµµýôÓO÷îÝ«®®­P7tèÐI“&]¾|yäÈ‘4mâĉ½Ä0È´´´ì}¥U¶µµ•=”ÎL•ÄÝÝýìÙ³B¡øÑÐतD¢Ž……Åóç-”GŒßÍÌäöFå5kÖ<þ|ùòå©©©âƒkOOÏüüü¼¼¼3f`ÖK Äj ÛA"û÷·}Q媪*$×€|A2U’ˆˆˆ¦¦¦ 6”””455œH¦JB§ÓŸ7ß|óË/¿DLš4ÉÜÜœ¸}ÔS «W¯Ž_¸páĉEý¾öÚk‘‘‘D>•eûÛ>BèwÞÙ¾}ûÊ•+étúçŸ.ã@ù`¥}9À0L­‡Ž‰‰7n\XXÙHÀs\^^^°Ò> œ™j4‡óðáÃââbbŒ0¸›¯Ñ®_¿AÜjW5ÄTVÔ$SæáááááAvP ó@ ™€@29€d r7 ä#==XÔ ™ ™ÊÄz%€DÄ’((<r×L@ ™€@29€d rÉäàÿùʼnZªqBIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Field__inherit__graph.png0000644000175000017500000000614012234777145030577 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“ IDATxœíL[UÇÏ-°BWf)ë--"°òÖ„L]„E´Æ­nëËXRºÁØ2³8—q‚¹éâ¢ÄÈL0#ÀæÚò³fjÀ%sËK›Ãi±ƒMZŠ@) °ñ£=ïG¯×ʆÐ[wÎ'üñœsž>ç¹çË=çÞÓ—‚6pØN€àSˆÞxAôÆ ¢7^½128wîÛéµZÍ”8ÐÓƒ¨þÀP\\ìV3‹ÞÆ'É–NçVCÖo¼ zãÑ/ˆÞxAôÆ‹ê=::úÚk¯Éd2.—+“ÉöîÝkµZQEQF£qñ2Ôl,bÿ0EQƒƒƒ÷sчèÞ™å~l^\.×–-[(ŠÒëõÑÑѽ½½§NJLLìììär¹‹ž¢Ãá@FXXXkkk||< 44tÑ;Â…è}úôé›7ošÍæåË—D"ÑÉ“';¸hó"h›Ïç3‹>€¢¨•+WþKã»±ù¼¦¦æÀHl@@gffòóóe2ÙÊ•+ÓÓÓív;ª§(êÓO?•J¥¡¡¡‡>{ö¬D"Y±bÅ¡C‡h‡êêj¦1E}ýõב‘‘YYYÏ?ÿ¼P( ‘ËåZ­–v0 R©T(–”” Êööö„„U^^NG»zõªgŠ¢"‘hpppVD]]]TT”@ P«Õýýýt=„ðøñã<òˆP(LMM¥ytü¹œç±ûÃsÿÎGXXXSSÓ\­hLßy瘘˜Ë—/›L¦çž{.%%…nU©Tƒƒƒz½°yófÚ¾yó&„°ªªª««‹i¸EfÛÚÚ"##_zé¥îîî¾¾¾òòr.—;99‰”Jåo¿ýV[[x÷î]atttNNŽÍf«­­åp8}}}(ìš5kæ 200!ôâðøã_»víúõëO=õÔæÍ›éT?üðÃØØØK—.™Íf•JEoe3„ŽïÅÙûˆyA­V»íŸ/DïÀÀÀ‹/2Çáp8èƒYµjUee%rèè茌Œ ÖÖÖV¡Óét³™ZΊ§Þ:B8<<<33ƒ*M&=‚€úúz:>ª …ÅÅÅÈÙápÌÌÌ °^‚ Ë: á•+WCCC(f\\\MM j²Z­ãããp½½8/xÄ<õ^È|.‘H:;;™2Óç4===111ÈF†ÅbAE>Ÿàp8nöˆŒŒ ççç'%%I$’}ûö1"""Üâ—––?~üá‡Þ½{÷7è5ÈKybcc‘±víZ€ÍfCÅîîî]»v¡Šˆˆ§ÓI‚'^œqÄò²äääÒÒRô/ß}÷›T*íêêB62$ÉÂRô:줤¤®®®'NܺuëË/¿d: ’É /¼pûömN'‹Ÿ}öYú?ÕKyÌf32L&EQ2™ %ICC:±\.—ÃáX½zõ\Çr_Î f!zØl6•Je4m6[]]]QQ‘›Offæ[o½ÕÞÞÞÙÙyðàA•Ju×ÕÕÕÕÝÝÝLc^¦§§×¯_¿jÕªŸ~ú)##ü9£ÎJ|||nnnddäO<! ž7º!ôâ››{ýúõŽŽŽýû÷§¦¦Ò÷ŠùùùF£Ñl6ïÛ·O¡PÌšŠÎÿæä~ë7„ð×_MOO ãñx*• ÁÌõ{jj*'''""B(îܹ-QžK—§ ¨ªªb4ÀcýFŦ¦¦¨¨(.—›˜˜xþüy¥R¹víZÏø(‡––¹\söìYÚm® IIIÁÁÁv»ÝK/555aaa»vír„ÜÜ\©TÊçó•J%}yÅLŒŽ/ÎsÙsá¹~SqÁ¥ÕjwìØÁ¬!ü«IMMœìŸãÑ/ˆÞxAôÆ ¢7^½ñS½m¶a¶S`‡YÞ±f¾Ó÷ R^nJK‹^¾<ˆíD–‹Å"•JÿVÅÜ|Áä›%N°XœÅãý‡íD|·ý5L8}úb^ž~ýú膆ƒlçâkp\¿ëëŒÆîþþßÙÎÅ×`§wOÏÑxBÀáP WØNÇ×`§·Áp5 €p:]z};ÛéøìôÖjÛNBÐÑaíê`;#Ÿ‚—Þ&S_gg}‰ÐØø=»)ù¼ônjú>(è¯MOO;µÚÿ±˜ïÁHo¡VÛ>=ídVÞ¾mÿñG÷[>À`¤÷µk=V«Ã­2((°¾£«tŒônh¸ÂœÌÓÓ3:];>›N¸èítºjkn“9b`àw£ñ–Ï3b\ô¾|¹ËnŸµ)((Ÿ\ôþ쳫PË–¢¿  Úv:aSÓ÷è¦ügI¾Áë‡Èåo¼±•.;öÙöíëââþúÊËððDx8ŸÔ| Žï$’ì²²Ìääx¶ñ5¸ÌçÑ/ˆÞxAôÆ ¢7^½ñ‚èDo¼ zãÑ/ˆÞxAôÆ ¢7^½ñ‚èDo¼ zãÑ/ˆÞxAôÆ ¢7^½ñ‚èDo¼ zãÑ/ˆÞxAôÆ ¢7^½ñ‚èDo¼ zãÑ/Xø=K—.½ÿþû>îÔ «5T(¼2Íb ¯¾úª;eá÷zzzzôzý3Ï<ãû®i–-cc¬%pãÆ Vúeí÷™ ÙêÚ`ëðÉúDo¼ zãÑ/ˆÞxá×zOLL|ôÑGfãÆæÝwßDM …Âd2-b_ L&“ÓéT(###^^噆÷—°‹ÿþ^.„0''‡¢¨¢¢"±Xl·Û ê««ƒ‚–也ÅÅű±±t‘ÇãQ•——Çãñ–¢;Vð_½¿øâ‹ÞÞÞšššàà`€@ xå•W^|ñÅ€÷g,!!!|¾ûO$oܸq‰ºcÿÏ›››SRRØ4|>ŸÃù+g§ÓYQQ¡Ñh¶mÛvôèÑÑÑQT¯P(.\¸ššºeË–?þø«¯¾R«Õ[·n---¥š››™àÎ;câr¹hÏ‘‘á™3gÒÒÒ’““ éŽÓÓÓ%%%Û·oOII©««[šñXüWo³ÙãÝçܹs.\(**:yòäÐÐЉ'視––ŠŠŠÜÜÜ3gÎ477òÉ'999:Îf³òòòär9Ódggÿ÷O~ùåfG çÏŸ/(((++›ššrÛÿ¯ªªjkk;räHIIÉ7ß|³(‡¿Døï|>11ñÐCÑE…B ƒÁ@ϺŸþyffæ£> ÈÊÊÚ³gÏÄÄZn5ÍŠ+ž~úiÀÎ;i{ttT,Ó³4sº.++[³fͬÉ466îÙ³'..pèÐ!F399ÉårQkKKËîÝ»{ì1”ÆÞ½{qÿ=¿ÃÃÃ{zzè¢Á`Ðëõn>ýýýÉÏ(@ÆÀÀχ Påf/Œ¾¾¾£G¢ëvµZír¹èŽv»~¬ºûóÕý ÿ=¿7lØÐØØ¸iÓ&´`óùü~øÁÍG$õöö¢ MÔáááK‘LxxøË/¿¼aÄp||œye'‰, :¿­V¿~zÿžßv»ýðáÃ&“Én··µµUVVºù(•ʪªªŸþÙb±|ðÁ žسÒÜÜŒþ?hÃ;J¥²¢¢Âd2Y­Ö÷Þ{/;;›ÙºiÓ¦ÊÊÊŽŽ‹ÅB_ú'þ{~ ‚’’’S§N½þúëSSSëÖ­+,,LOOgú¤¥¥Ý¹s§  `rròÉ'ŸÌÊʺÇào¿ýv^^žX,¦ ïþééé“““cccr¹üÈ‘#n­ccco¾ù&„pÿþýF£ñ¾ŽÔ—°ðù­V»cÇŽÖÖV÷ëWŠD"Nçã~ýw>',Do¼ zãÑ/ˆÞxAôÆ ¢7^½ñ‚µý5úý.lQ«Õ¾ï”…ý5‹Åòí·ßú¸S?D&“%$$ø¸SLŸÿ-dýÆ ¢7^½ñ‚èÿå²9ë¢ÏÛ~IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Portal__inherit__graph.png0000644000175000017500000003126612234777146033340 0ustar00murraycmurrayc00000000000000‰PNG  IHDROm˘bKGDÿÿÿ ½§“ IDATxœíÝyX×Þð3I”Ã&‚€Z¥Ö·¶*X©øÒ‹K.RYd©¨¥"jµu¹E-Z©E}j«Ï½îkU@¶ ^—Öj©¯h°b¥ZAd'ˆ‚IæýcÚ17„¶ áü>œLg~3™o23™‰I’€ÓtÒ. íàÒ. íàâ¿ÒžœœL€Åßߟ©m ô7œö“’’’t_è »wïfºШI{@@€îë}!%%…é@?ÇíàÒ. íàÒ. í࢛ioll\·n­­­­­mXXXyy9õA¹¹¹½W!Rû5r/΢‡£Q[[Û¥1{}  5ßÀuJ¡PÌž=› ±X|ØÍÍ­°°ÐÀÀ ×K”J¥TÃÌÌìÚµk&L@™˜˜ôúŒغ“ö'N>>~ÅŠTÔi|>ŸÍfÓe2YTT”­­­¥¥eppp]]5 ˆÄÄD¡Phbb²aÆ„„@`jjºvíZºC\\œr£#AdffÚÙÙ­ZµÊÓÓÓÜÜÜÐÐÐÅÅ%99™î‘‘! ÍÍÍ÷îÝKM”H$®®®FFFöööG¥GËËËk?A!++«ÚÚZµ(gΜ±··çóù~~~ÕÕÕôt’$wìØáàà`nnîïïO¯åE Çï¨s§k m‘J¨kfÉΘ™™¥§§wô,BH"‘lß¾ÝÑÑ1;;»  `ÆŒ>>>ô³"‘¨¶¶V,#„fÍšE·úÐ0H§œœœ¨Æ˜1cBÔÃ’’’êK¹\N¯„ö4tîÅ5pÖÆÛÛ{ÿþýÔÇ BˆÏçß¼yS¥P(,..¦ÚTC ô Nõ¨ÞÝݽ¸¸xçÎ>¼|ù²rêÀXÙÌ™3=z”’’2|øðéÓ§ÓïSé´CQQÕ((( ÂÖÖ–z(ÒÒÒ¨·U…B!•JGÕѲt©3ÝдoÚ´©¢¢B$åææVTTœ9s&::Z¥ÏÂ… ·nÝ*‘H W®\)‰´<—WRR¢ÜèT[[Û¤I“œïÝ»ŠþÚ—Vk„ ëׯ·³³{ë­·H’är¹B}¨¡Ãúõëïܹ“ŸŸ¿lÙ2úÛÁÐÐШ¨¨ÜÜÜ¢¢¢ððpµ%QãkÙ€îSÞ­×ò¸$ÉÇ›™™‰D"êÓ[ù¸½µµ522ÒÆÆÆÜÜ<00:4%Û²¶o#„bcc•4Ôî¸z˜žžnooo``àææváÂ//¯1cÆ´ŸªáÊ•+...\.×ÑÑ1!!îÖÑ îîî\.·®®NÃ\âããmllÌÌÌBBBTVÂúõë…B!Çóòò¢Oª)F¯MçŽÚãv Œ •N³%''ÏŸ?_y ÐkÔ×À]î€'{À¤\@ÚÀ¤\@ÚÀ¤\`šöŠŠ¦K@×ÔÜ‘®|/ç@uôhAPÐHcãALÒ·ÊÊÊ„B!ÓU€þBMÚçÏŸ¯û:t‰ÅâZ[‡üqRsóïL×Òçüüü˜.ô†WÎ8qcãFñ¤I#ÓÒV2] ºƒãqûÙ³¹rsKª«Ÿ1] ºƒ]ÚKKëss‘$b±ˆ´´_™.ÝÁ.íyl6 !$—+Äb Óå ;Ø¥=9Y"—+B$‰òóË‹‹k˜®Á+í•……•ô‰ÉAƒØçÎÝb¶$t¯´§§ß4èÕÏ`·µÉ““a°t £´“$™œ,ik“+O|ô¨î÷ßUB€ £´ß¾]Z^.U™8hçìY83°€QÚÓÒ~UÞ§´µÉRR$^b0„KÚårEjj®Ên<¥¦æYnîCW€®á’öìì⺺&µO ĆËlpIûùóyƒs¨ƒ±é¶\N¦§ß¢¾„`ë“ÿƒ¹rq±ùüó9ôؘóï¿ÿæØ±¯þûš††f ¥ #8Þ‡V<¸ÐÛ{Ó… ;¸ìÉ íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íàÒ. íà‚ I²Ûœ••µk×®^¬FgÊËMÌÍ_¶1]H—¹ºº®Y³†é*€^êÑg{ii©X,î­RtÉÆæ™>F=;;;++‹é*€¾âô|ˆ”””ž´áïïÏt @Áq;¸€´€ H;¸€´€ H;¸ÐQÚ×­[gkkk```kkV^^N=EDnnn/Ϋ×ì‡s t‘v…B1{ö윜±X\VVvþüy.—ëææÖÒÒ¢ƒ¹(½ð}{§Nœ8ñàÁƒ¢¢"ccc„••Õ¾}ûbbb8]̽QSScii©åt§‹Ïöøøø+VPQ§ñù|6›M?”ÉdQQQ¶¶¶–––ÁÁÁuuuÔt‚ …B¡‰‰É† ©©éÚµkéqqqÊöòòò<==ÍÍÍ ]\\’““BsæÌ¡/ûÍÎζ´´|ñâEG5ÔÖÖ*· ‚@YYYÑÓégéé$IîØ±ÃÁÁÁÜÜÜßß_û% ¯=””¤Ífffééé=‹’H$Û·owttÌÎÎ.((˜1c†ý¬H$ª­­¥.Ñ5kÝ~ðàI’±±±ÅÅÅÊ j@åYŒ=:""¢¤¤¤²²òèÑ£---'Nœpuu¥:|òÉ'K—.ÕPCMMJ[e"=Gzúž={œœœ²²²ŠŠŠD"‘ŸŸŸ–K¤ŸŸ=]¥‹´s8œ7n¼šå_¤R)ùWTœOž .ܺu«D"),,\¹r¥H$âóùÚ WRR¢Ü@=þ¼á/r¹¼­­mÒ¤IÎÎÎ÷îÝ EÕ××#„æÎ››››˜˜¬¡>ŸîÜ¹ÆÆÆ˜˜åYK¥Rµ%QÓCCC£¢¢rss‹ŠŠÂÃÃ=<<º²Îè=9 Ðò¸$ÉÇ›™™‰D"ê“Sù¸½µµ522ÒÆÆÆÜÜ<00°£Câöm„Pll¬JC™D"IOO···700pss»pá‚——ט1c¨q¼½½ÇGµ;ªáÔ©SÖÖÖÔ9jº»»;—Ë­««S)ŒžÞÚÚº~ýz¡PÈãñ¼¼¼è3p.‘pÜz¢G¿]“œœ<þüžŒÀ8ŸI“&mܸ‘éB´BÝß?(ºß“CÍÍÍ999ßÿ}HHÓµ  ø¦ýâÅ‹žžž›7o1bÓµ  z|íjùúúúúú2]ºƒïg;¸´€ H;¸À4ímmr¦K@×0Mû·ß^‚ÀÜôÂ9yê¦n½Â²¶^²eËò––ÇLWÒe~~~L—ôU®¥+++ûÏþÓ‹ÕèÆ½{ ‡Ý›4É*8؉éZºÌÖÖÖÕÕ•é*€^êQÚõÔÊ•qgÎÜ444¸{÷«Áƒñ½âà»ãö¦¦–ŒŒÛ$‰^¼hýþûß™.ÝÁ.íW®Ü•Éä!‹uæŒêmö `Ø¥=55—:­(—ËüñncãK¦+@GðJ»TÚôÓOÈå ê¡\®¸té³% 3x¥ýâÅ; Å«‡A¤¦ÂÿñpWÚÅâ\„^}!—+nܸ_SóŒÁ’ÐŒÒ^Yù4'§X¡ø¯o ‚8þ6S% K¥=##ÅR½ì$I±XÂH=èFiOI‘(”ÚB)м¼ÒÒÒzFJ@—pI{IIM~~¹ºë ‡•ž~K÷% c¸¤ýüùÛ©¿{§­M.Ùy0ðár•xQQõ˜1Ãè‡ÔX[›òxÔC‡]]ýlèP†ª@p¼+!$¬>xp¡·÷¦ @wpÙ“@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ¤\@ÚÀ§«œœÜu蘭-ïöí_^¾,dºžrss …=!++«´´´·êýJ@@À=&»ˆ¡²zIII]}Uøùù1½ ¯¨¼Ö]þlG%%%©¾g&Ñ+ãøùù¥¤¤ôÊP ŸHNNž?¾ÊD8nvpivpivpÑWioll\·n­­­­­mXXXyy9õA¹¹¹½8¯^Pp bö5íù,%†††®®®šÔrŽ2™Œ ˆÚÚÚžÔFÍNeÞ™Ö'iW(³gÏÎÉÉ‹ÅeeeçÏŸçr¹nnn---}1;Ýð ØÞÀXäk×®I¥R©TZXX8a„yóæÉd²ŽÉf³cccMLLz¥Â¾¹×ÒuzýÖ±cdž öüùså‰R©T&“Q#H$’®ÎWsI½;`Gs©©©¡ÚšPg´y-:åççççç×i7Æ_ÓžÏBe„ºº:„Paa¡ö5¨ùl_±b…±±±òD>ŸÏf³é‡2™,**ÊÖÖÖÒÒ288˜Zõ!‚ …B¡‰‰É† ©©éÚµkéqqqÊöòòò<==ÍÍÍ ]\\¨kûçÌ™³k×.ªCvv¶¥¥å‹/:ªÞ}¢ÚÔUkVVVÔtÍ HDff¦ÝáǵŸjœ9sÆÁÁÏçÐû Æ_SšD"quu522²··?zô(I’;vìppp077÷÷÷§gªÒ­ý8Tå§£(j·%•íz5,~FF†P(477ß»w¯†òÄbñ°aÃ,,,þùÏÒÛ››GWß3Ÿ'ffféééFH$Û·owttÌÎÎ.((˜1c†ý¬H$ª­­‹Å¡Y³fÑí$[\\¬Ü@íÞƒGQRRRYYyôèQƒ–––'N¸ººR>ùä“¥K—j¨~—¥ÛÊ;]@77·ëׯoÞ¼¹Kã3&;;ûîÝ»S§N;w®æ•Lêö³ñ×”ž2räÈÈÈÈŠŠŠÔÔT‹åä䔕•UTT$‰èeQéVYY©~ü8$$„:Óncc#—Ë©™ªt£öÛé³tUUUÑÑÑóæÍ{þüyII‰Ú(j·%µ4,¾Ê"«-ºy¹£5ÓóÍ£OÒîíí½ÿ~ê- !ÄçóoÞ¼©ÒG(Smª!z«ww÷âââ;w>|øðòåËôô€€±Xœ””H„†¨wÓŽVh§ H½`]ÿÁƒTãþýû¨WWHÏéø51bDII ýZ!¡™3g>zô(%%eøðáÓ§O'I2--úìR(R©tÔ¨Qí»QïM<Ïçóùü¡C‡®]»¶®®îþýû@í”޶¥ö4,~û»Õ–§ù¦Æ^Ø<4ì ¨…´Ø{¬ªª …3gΔH$Ož}jhhÈçóóòòH’ì¨>ŸäÈ‘§OŸFDD ¥])úü­6 Øñœœ~ùå—»wïN›6îÜÃ×¢SZîÉëø5ݲe‹££ãåË—+**²²²¦L™2oÞ<ê¯ìíí?ýôÓŠŠ ±XÌápV­Zåââ"‘Hîß¿ÿÑGM˜0Am7ê\—ÊÑAW®\‰ŽŽV;Õ¿£mIy{ ^D-Ÿz¹Õ–§áø±«›‡îŽÛI’|üøqpp°™™™‘‘‘H$¢Þê”·ŒÖÖÖÈÈHssóÀÀ@ååÔ¼e „bccUÊ$Izzº½½½››Û… ¼¼¼ÆŒCãíí=nÜ8ªÝQ §N²¶¶¶°° ÎSÓÝÝݹ\n]]– ØÕñBÛ·owrr255õõõ­®®î­×B3-ÓNêö5•Édß|ó͘1c Ö­[רØHýÕ•+W\\\¸\®££cBBBkkëúõë…B!Çóòò¢Nûµï¦2kŠ••Õ»ï¾[UU¥vÍÛ’òö@½ˆZ.>5]myšÓÞ¥ÍC§iï·æÎÃtj´ßµù]¦0¨«›‡îÎÒõOÍÍÍ999ßÿ}HHÓµÀ€îüR•žºxñâ¢E‹6oÞp[¼ø€Ïtu¸xù²M,Î=~üúT ÄjkS „ØlÖÊ•žŸ}6‹éêô¤]+K—ž¼xñŽLöêÐÃa‘$š5ëõ>rŸ4i$ƒµ x Çÿ_||Vcã „Bñj‹51áJ$_˜šr™«NŸ@ÚµòøqÝÔ©Ûär…Êtj÷~Ü8›… §úû¿m`€Ñµ‰: ‘”9’yñâ‚@2™êÊg±ˆ¨(éL”¦— íÚZ³&Q,–´ßæÐŸ™'mløgÏ® Ít_ÛÀC’ä²e±éé· b·µ©ù6„ ™O"Ùdh8X÷åé)ø¾][Ÿ}6«£Ÿ‘ÉA.XàQï-A,_îad4¸ýþÝaýúÙõ.´kkذ!Ë–y(ÿ 2 ˆ?ö\µÊS÷U `ãÇÛ&%-4ˆMUÆb#FXMf¤0ýiï‚åËÿ×ÈhÊD‹4yýúÙŒ”4°Mœ8âÈ‘ÅA ô_W(PTÔßÙlØz»ÖW˜šr?ùä=å6›åìýôô“' »wÁ5v½åܹ[«VÅÏ›7qçÎù«ªêé‘#™“'œ2Å‘éêôSÏ7­­²·ÞŠž8qKeå«ÿ¬ãúõgçÈ 77·0XÛ€qèÐOÁêèè4…BAMQ('¬¾uë³µé/ø¾½;~üñ®£ãP{{K剷n=^°à°½½elì33ãŽþt*&æü¾}?~þ¹hÅŠÿUž.“)NŸÎ ucª0}iïM……•AA‡LM¹ ÆÁ}]¦PQQ©§NýgÛ6?Hu¯ƒ´÷²ÒÒú  ƒ2™"!a©ƒƒÓåè“¶6ù'Ÿœ¾xñ·Bg΄Sî½ÒÞûjjž…„ª®nŒ_:nœ Óåè‡çÏ[>üðx^Þ£ï¾ûhêT'¦Ë˜ í}¢©©åÃß¾]zêÔGp‡\§êë›,8üøq}\\øoôô÷9@Gàûö>all»ÄÝ}T@À‹ï0]N¿VQÑ0oÞÞªªÆ3g>†¨÷)H{_<˜sà@¨Ÿß[áá's˜.§Ÿ*.®ññÙ#—+Î[åìlÍt9\]Ó‡ØlÖÎffÆk×&54¼€;±Uäç—‡„²³³ˆ]Âç1]ÎÀÇÞ²e Ó5 dA¸»2Ä0:úÜË—mî®¨¿¸~½08øÐoØÆÆ†›˜ÀÏè|¶ëÂG¹b¸vmâóç/cb|Û߉› ~[¾€kuÒ®#þþobqªººqÿþPœÓ*!!û³ÏR‚ƒ§lÛæ w­ê|§SYY/>:~¼íñãa<žÓå0`ÿþ«11ç7nœ£rU,ÐH»®Ý¹SrH(4‹ 77Çèrz’$·mû÷W¿üòý?œÆt98‚´3àÑ£º  ƒƒ±"0ùEz™L±n]âÙ³¿îÚèëûÓå` ÒÎŒªªÆààCÏž½HHˆptÊt9}«¥Eq23³àС…ï½7ŽérðigÌÓ§Í¡¡GïߝЋ óÍL—ÓWž={ùá‡ÇîÞ­ˆ]2€S/@Ú™ôâEë’%'rrŠ[ìî>šérz_]Ýó>8\UÕ˜1zô0¦ËÁ|ÿÁ$CÃÁß}æé964ôèùó·™.§—•—KßOcãË´´•õþÒΰAƒØû÷/X¼øeËNÅÇg1]N¯¹w¯B$ú§Á ³gWÚÙY0]@®®é‚øâ‹¹––¼Ï>Kihh_Dß¼ùpÁ‚#£G;yò#SSC¦Ë‚´÷+Vü¯±17**µ²²ñË/}ô÷ê33 ÂÂŽOŸ>fÿþƒÃÖÀ‹Ñ,Z4ÕÚÚtÙ²S/¾ý6Ãѿ㬌Œ¼?Žóõ}kçθ*¶¿sòýÎÿýßý?<æææ|ð`(—«úQõgqqY6ˆÃÃߊú»þî› `öþ(/ïñ3føwß…éËÝ ß~{i×®ïáøþ ÒÞOÝ¿_tÐÒÒ$..ÜÒ’Çt9š(ä_¤<ùß|ð6Óå€AÚû¯²2iPÐA™Lž¡ò?Uômmò5kÏŸÏ;xp¡—— ÓåM íýZCCó‚‡Ëʤ§OG¼öÚp¦ËQõòeÛÒ¥'³³?? ÝÿAÚû»¦¦–°°ïnß.ýè­·˜.ç•ÆÆ—‹½¿*>>|üxø­X=i×­­²?Ž»zõ'.†__IDATÞ‘#‹=<Æ0]BUU= :ôìÙË„„'§~߀߈êêǪßâ¢EGÓÓo1]zø°vîÜ=Οÿ¢®GàêýÀf³¾þÚØ0Ó+â^0ø?"Þ½û$8ø ­­E\Ü’!Càg¡õ ¤]o±víL>ßhãFqiiý矋t_ƒDRzôÍ7íŽYld4X÷€ž€´ë™°0w>ßhÍšÄææÖ­[ß×åU_½zoÉ’ï½7nÏžøYh}i×?¾¾o™š.]zòéÓæÝ»ƒt¼sçn­Z49&~Z_Á9y}•ý`Ñ¢£“';:´°¯/§?|83:ú\«ï ízì?*‚‚ÙØðcc—˜™õÕUÇÄœ?pàêÖ­ó/~§ftvÉôؘ1Ó“—UT<]´è˜BÑ'ïÚþtð൯¿€¨X¶Œ»2ÙlDz¥¥Dï×±¤¤¤€€¦«`îgéüüüƃ_8ø¢££™.y¸§}ܸqÓ§Ogº Ðç íŽÛÀ¤\@ÚÀ¤\@ÚÀ¤½sÍÍÍxï½÷¾þúëÚÚZê)‚‚‚^œW¯Øæè¡D$mذ¡¢¢¢×ñÓ_¸×)’$### ‚ˆŽŽ>|x]]]FFÆŠ+âââ Ò§{gÖîÝ»œœBR©ôàÁƒ_|ñÅáÇ™. ;ðÙÞ‰K—.=yòä믿~íµ×ø|¾££ã§Ÿ~zìØ16[oùôððxúô©öÓ{ÎÐÐÇãñx<[[Û5kÖÜ¿¿¦¦F›?ì»’0iïÄ?üàããÃåþ×áÀãñX¬W«N.—;v, `îܹ_}õUcc#5ÝÃÃãêÕ«þþþ³gÏ>räÈ?þèçç7gΜýû÷Ó~øáåF{EEEk×®õöööòòZ¼xñO?ý„Z¿~}JJ ÕáîÝ»sçÎmiié¨:-TÛÃÃ!äã㣒"åé$Iž>}:((ÈÛÛ{Ë–-Ú/‘6¨7J™L¦a½Ý¾}{þüùÊ%©] K í(**rttÔÜ'))éêÕ«ÑÑÑûöí«¯¯ß¹s'ýÔ•+WŽ;¶~ýúÓ§OÿðÃÇŒŒLII¡\7nÜèââ¢ÜhïË/¿ …‡NLLô÷÷ß¶m›L&óððÈÌ̤:\½zõÝwßMMMí¨×®]C¥¥¥ 2¤£éiii.\Ø´iÓÁƒ[[[wíÚ¥åuª¡¡aß¾}B¡pذaÖÛ‘#G¢¢¢.]ºD—¤v=h3G@ƒãöN477+§‚ú´Aeddðxþ./^\¸pák¯½†ZµjÕâÅ‹›››ŒŒB¦¦¦Ó¦MCÒíÆÆÆáÇ¿÷Þ{Ôt£½R»ãÇokkkjjzçwvíÚU[[kaañÓO?mÞ¼yçÎÕÐ çÎ[¼xñرcBk×® hii100èt‰:0""‚jáää´eË‚ 4¬7ÿ×_½Óõ ò†4ƒ´w¢´´”¾s&##£¥¥ÅÏÏO¹Ouuµ@  ÚT£¦¦fĈ!CCCô×ÍvÊmí=þüôéÓùùùåååB¡šhllK7xðàÁƒÿüA; 5[[[k³@—@Ú;1uêÔsçÎýío£>Ux<Þo¿ý¦ÒÇÊÊêÉ“'Ô®8µCkaaÑ[¬ZµjìØ±ÎÎÎ$Iþío£¦OŸ>ýßÿþ÷£Gf̘A„†¨›šµ<+F±°°X¾|ùÔ©S©?ojj¢wdº‡:K§2QCÍíßA:Z@{pÜÞ‰ÐÐкºº 6ÔÕÕ]¿~ýäÉ“*}¼¼¼bccÿøã²²²þóŸ®®®Zfã‡~ ¶rºzñâÅó¿( ¹\þÚk¯ …ÂGmÛ¶ !ôìÙ3„Ð;ï¼SPPpõêUOOO 5ðx¼7n477ÇÅÅ)Ïš¤=jº——×±cÇ ÊËË¿ýöÛÕ«WweiKËõF•ÔÑzÚƒ´w‚ÏçïÝ»×ÄÄäÿøGHHÈÅ‹·lÙ¢Ò'((hÚ´i›6mZ¾|¹™™Ydd¤–ƒoÛ¶-??_¹Z½zõßÿrÿþý5kÖœ={Ö××w÷îÝ3gÎ|ûí·?ÿüs„‘‘Ñĉ---©“ˆÕ°råÊcÇŽ)?>,,¬}ZèéÁÁÁ®®®›6mZ²dIuuõ—_~ÙÕõ¦ mÖ]RGëh÷ß®ùâ‹/ô÷þö¨¨¨×^{-$$„éBô€‡‡üv ·ë¥–––âââÜÜÜ•+W2]ËŸ~ùåµÎ|ðAXX˜îëíAÚõRNNÎŽ;BCCÛŸ»fʤI“¨oìA¿i×KîîîîîîLWô œ¥vpivì´µ)˜.0÷³t¿ÿþ;Ó%èZVÖËÉ“¹,xŸÇîW×0]‚®{èÐð††Kã?{긺ë´cèßÿ¾½dÉ ‘hÂáà ™®èìÏá%-íW„Е+¿77·2] Ð5H;F_|ÿýï¡ÖVÙÅ‹ª÷í‚ÒŽ‘‹ïPÿÍ;A©©¹L—t ÒŽ‘””\„H„\®¸~ý~}}Ó‚´ã¢ºúYvv‘\þê¤ìùó·¬è¤·X¬Wß8’$)K¬è¤))ê ¢P7o>*-­g°$ cv,¿ýöÛ×_=&&ÆÆÆæÍ7ßýôSkkk++«ýë_Öõç™™™vvvÇ×P3^ÈÎÏÏÏÏϯÓnfffééé=‹’H$Û·owttÌÎÎ.((˜1c†ý¬H$ª­­‹Å¡Y³fÑí$[\\¬Ü TžÅèÑ£#""JJJ*++=j``ÐÒÒrâÄ WWWªÃ'Ÿ|²téR 5ÔÔÔ¨´U&Òs¤§ïÙ³ÇÉÉ)++«¨¨H$Ñ+ªÓ%RËÐÐðêÕ«í§«]4º$ 5xyyUUU¥¦¦r8œ—/_FEEÙÙÙ]¿~½  àÝwߥ–BÃànnnׯ_onnî¨`’$“’’pHeà/§–içp87nÜ Òï†R©”ük»tvv>yò$Õ!??!ôôéSêÙk×®‘$)—ËUÚ*‘V_婆†™LFµ ¨M¹¡¡Ëå–••Éår@™™©¡†n¤}ìØ±ñññÔÄòòr6›ÝÔÔÔ½%"I’ËåªM»ÚE£KÒPÃÙ³géùÖÔÔ888;vŒêyûömzu4xJJJG¥Ò°J;ìÉÿI Ò¥R)}BžVZZêèèHµ©FYYõÇã!„X,–J[{ QQQîîî <<œš8dÈOOÏÔÔÔŸþ™ÃáL›6MC ÝPRRBA666r¹¼'Kdoo_RR¢²Pr¹\í¢iSƒò|+**FEµé††Áíì캴6ôèBèùóç ‘Ëåmmm“&Mrvv¾wï^hh(B¨¾¾!4wîÜÜÜÜÄÄÄàà` 5ðùüsçÎ566ÆÄÄ(ÏZ*•ª-‰š•››[TTîááÑ•u¦ê³Ï>ûí·ßþñ”––æçç/[¶ÌÇLJÏçw´híkX°`Á—_~yãÆû÷ïÓç 5þ cǺ¢åq;I’?633322‰DÔ'§òq{kkkdd¤¹¹y```G‡ÄíÛ¡ØØX•†2‰D’žžnooo``àææváÂ//¯1cÆPãx{{7ŽjwTéS§¬­­-,,¨sþÔtwww.—[WW§R=½µµuýúõB¡ÇãyyyÑgà:]¢ŽPgÈ ­­­/^Lͺ£E£×ª65ÔÔÔ´´´¬^½š:'êÔ)j¢æÁ;}ѱ:nÇâ×,žÿ8‰Ï¤I“6nÜÈt!uû€Oöäûµæææœœœï¿ÿ^ù{lf]ºt‰P'**ŠéÒ@'ôøB1\¼xqÑ¢E›7o1bÓµüiæÌ™˜|<ö~Í×××××—é*À{òàÒ. ízOùTŸÏ‰D*´õpp߇ú¤} ¸víšT*•J¥999, õZp–n àñxôu‡eeeB¡°Ó?$¢¦¦ÆÒÒ²ïk̃Ïö†úùÖÖV wãS7~+ßè®ùt00@Ú”êêêÕ«W;;;ÛÛÛóÍ7‰‰‰b±ø?ÿùOUUÕG}DwÛ¸qãéÓ§›››BÔg{`` ³³ó¯¿þúðáÃÕ«W‡††¶¶¶2· OÀžü@ðöÛoS ‚ &L˜’’Âb±Ž?¾yóæÉ“'#„þõ¯¹¸¸466ššš"„V¯^ýÎ;ï(““Ããñ¨ê™6mZKKKcc#ìá0öàÚµk&L@q¹\.—KMT{'üرc‘º¿vìØqãÆ¢¢¢žÜô ú3Ø“¨³t|>ŸŽ:Òx7~û¿5ß‚Hû€¥åÝøÔîp—8 íVddä¼yóÞÿ}WWסC‡~÷Ýwíû¸»»?¾¾¾þСC{÷îË—/_´h‘——×ܹsu_3èSp;ÀÜ߀ íàÒ. íàÒ. íàÒ. íà‹»bÄb±Êÿ(†þµtYYY¥¥¥LWúµ€€¦KÐ…ŸvŽÛÀ¤\@ÚÀ¤\ü?~5M%O%IEND®B`‚glom-1.22.4/docs/libglom_reference/html/dynsections.js0000644000175000017500000000564712234777145024253 0ustar00murraycmurrayc00000000000000function toggleVisibility(linkObj) { var base = $(linkObj).attr('id'); var summary = $('#'+base+'-summary'); var content = $('#'+base+'-content'); var trigger = $('#'+base+'-trigger'); var src=$(trigger).attr('src'); if (content.is(':visible')===true) { content.hide(); summary.show(); $(linkObj).addClass('closed').removeClass('opened'); $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); } else { content.show(); summary.hide(); $(linkObj).removeClass('closed').addClass('opened'); $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); } return false; } function updateStripes() { $('table.directory tr'). removeClass('even').filter(':visible:even').addClass('even'); } function toggleLevel(level) { $('table.directory tr').each(function(){ var l = this.id.split('_').length-1; var i = $('#img'+this.id.substring(3)); var a = $('#arr'+this.id.substring(3)); if (l libglom-1.22: Glom::AppState Class Reference
        Glom::AppState Class Reference

        There is one instance per document. More...

        Public Types

        enum  userlevels {
          USERLEVEL_OPERATOR,
          USERLEVEL_DEVELOPER
        }
         
        typedef sigc::signal< void,
        userlevels
        type_signal_userlevel_changed
         

        Public Member Functions

         AppState ()
         
        virtual ~AppState ()
         
        virtual userlevels get_userlevel () const
         Returns whether we are in developer mode. More...
         
        virtual void set_userlevel (userlevels value)
         This will cause the userlevel_changed signal to be emitted. More...
         
        virtual void emit_userlevel_changed ()
         Use this to set the initial UI state: More...
         
        type_signal_userlevel_changed signal_userlevel_changed ()
         The user interface should handle this signal and alter itself accordingly. More...
         

        Detailed Description

        There is one instance per document.

        This is for storing volatile application state. It is not for configuration that should be the same after the application is closed and restarted - use gconf for that.

        Member Typedef Documentation

        Member Enumeration Documentation

        Enumerator
        USERLEVEL_OPERATOR 
        USERLEVEL_DEVELOPER 

        Constructor & Destructor Documentation

        Glom::AppState::AppState ( )
        virtual Glom::AppState::~AppState ( )
        virtual

        Member Function Documentation

        virtual void Glom::AppState::emit_userlevel_changed ( )
        virtual

        Use this to set the initial UI state:

        virtual userlevels Glom::AppState::get_userlevel ( ) const
        virtual

        Returns whether we are in developer mode.

        Some functionality will be deactivated when not in developer mode.

        virtual void Glom::AppState::set_userlevel ( userlevels  value)
        virtual

        This will cause the userlevel_changed signal to be emitted.

        type_signal_userlevel_changed Glom::AppState::signal_userlevel_changed ( )

        The user interface should handle this signal and alter itself accordingly.


        The documentation for this class was generated from the following file:
        • libglom/appstate.h
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1Document-members.html0000644000175000017500000003611412234777147031105 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        GlomBakery::Document Member List

        This is the complete list of members for GlomBakery::Document, including all inherited members.

        Document()GlomBakery::Document
        get_contents() const GlomBakery::Document
        get_file_extension() const GlomBakery::Document
        get_file_uri() const GlomBakery::Document
        get_file_uri_with_extension(const Glib::ustring& uri)GlomBakery::Document
        get_is_new() const GlomBakery::Document
        get_modified() const GlomBakery::Document
        get_name() const GlomBakery::Documentvirtual
        get_read_only() const GlomBakery::Document
        get_view()GlomBakery::Document
        load(int& failure_code)GlomBakery::Document
        load_after(int& failure_code)GlomBakery::Documentprotectedvirtual
        LOAD_FAILURE_CODE_LAST enum valueGlomBakery::Document
        LOAD_FAILURE_CODE_NONE enum valueGlomBakery::Document
        LOAD_FAILURE_CODE_NOT_FOUND enum valueGlomBakery::Document
        load_from_data(const guchar* data, std::size_t length, int& failure_code)GlomBakery::Document
        LoadFailureCodes enum nameGlomBakery::Document
        m_bIsNewGlomBakery::Documentprotected
        m_bModifiedGlomBakery::Documentprotected
        m_bReadOnlyGlomBakery::Documentprotected
        m_file_extensionGlomBakery::Documentprotected
        m_file_uriGlomBakery::Documentprotected
        m_pViewGlomBakery::Documentprotected
        m_strContentsGlomBakery::Documentprotected
        read_from_disk(int& failure_code)GlomBakery::Documentprotected
        save()GlomBakery::Document
        save_before()GlomBakery::Documentprotectedvirtual
        set_file_extension(const Glib::ustring& strVal)GlomBakery::Document
        set_file_uri(const Glib::ustring& file_uri, bool bEnforceFileExtension=false)GlomBakery::Documentvirtual
        set_is_new(bool bVal)GlomBakery::Document
        set_modified(bool bVal=true)GlomBakery::Documentvirtual
        set_read_only(bool bVal)GlomBakery::Document
        set_view(ViewBase* pView)GlomBakery::Document
        signal_forget()GlomBakery::Document
        signal_forget_GlomBakery::Documentprotected
        signal_modified()GlomBakery::Document
        signal_modified_GlomBakery::Documentprotected
        type_signal_forget typedefGlomBakery::Document
        type_signal_modified typedefGlomBakery::Document
        util_file_uri_get_name(const Glib::ustring& file_uri, const Glib::ustring& file_extension)GlomBakery::Documentstatic
        write_to_disk()GlomBakery::Documentprotected
        ~Document()GlomBakery::Documentvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1sharedptr-members.html0000644000175000017500000002676212234777147030175 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::sharedptr< T_obj > Member List

        This is the complete list of members for Glom::sharedptr< T_obj >, including all inherited members.

        cast_const(const sharedptr< T_CastFrom >& src)Glom::sharedptr< T_obj >inlinestatic
        cast_const(const sharedptr< T_CastFrom >& src)Glom::sharedptr< T_obj >inline
        cast_dynamic(const sharedptr< T_CastFrom >& src)Glom::sharedptr< T_obj >inlinestatic
        cast_dynamic(const sharedptr< T_CastFrom >& src)Glom::sharedptr< T_obj >inline
        cast_static(const sharedptr< T_CastFrom >& src)Glom::sharedptr< T_obj >inlinestatic
        cast_static(const sharedptr< T_CastFrom >& src)Glom::sharedptr< T_obj >inline
        clear()Glom::sharedptr< T_obj >virtual
        create()Glom::sharedptr< T_obj >inlinestatic
        obj()Glom::sharedptr< T_obj >inline
        obj() const Glom::sharedptr< T_obj >inline
        object_type typedefGlom::sharedptr< T_obj >
        operator bool() const Glom::sharedptr< T_obj >inline
        operator!() const Glom::sharedptr< T_obj >inline
        operator!=(const sharedptr< T_obj >& src) const Glom::sharedptr< T_obj >inline
        operator*()Glom::sharedptr< T_obj >inline
        operator*() const Glom::sharedptr< T_obj >inline
        operator->() const Glom::sharedptr< T_obj >inline
        operator=(const sharedptr& src)Glom::sharedptr< T_obj >
        operator=(const sharedptr< T_CastFrom >& src)Glom::sharedptr< T_obj >inline
        operator==(const sharedptr< T_obj >& src) const Glom::sharedptr< T_obj >inline
        sharedptr()Glom::sharedptr< T_obj >
        sharedptr(T_obj* pobj)Glom::sharedptr< T_obj >explicit
        sharedptr(T_obj* pobj, size_type* refcount)Glom::sharedptr< T_obj >explicit
        sharedptr(const sharedptr& src)Glom::sharedptr< T_obj >
        sharedptr(const sharedptr< T_CastFrom >& src)Glom::sharedptr< T_obj >inline
        size_type typedefGlom::sharedptr< T_obj >
        swap(sharedptr< T_obj >& other)Glom::sharedptr< T_obj >inline
        ~sharedptr()Glom::sharedptr< T_obj >virtual
        glom-1.22.4/docs/libglom_reference/html/dir_434e757db745f7bb2046098563428a3c.html0000644000175000017500000001006512234777147027160 0ustar00murraycmurrayc00000000000000 libglom-1.22: libglom/data_structure/layout/report_parts Directory Reference
        report_parts Directory Reference

        Files

        file  layoutitem_fieldsummary.h
         
         
        file  layoutitem_groupby.h
         
        file  layoutitem_header.h
         
        file  layoutitem_summary.h
         
        file  layoutitem_verticalgroup.h
         
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__CalendarPortal-members.html0000644000175000017500000013222212234777147033374 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_CalendarPortal Member List

        This is the complete list of members for Glom::LayoutItem_CalendarPortal, including all inherited members.

        add_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        add_item(const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)Glom::LayoutGroup
        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutItem_CalendarPortalvirtual
        change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutItem_CalendarPortalvirtual
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_CalendarPortalvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_border_width() const Glom::LayoutGroup
        get_columns_count() const Glom::LayoutGroup
        get_date_field()Glom::LayoutItem_CalendarPortal
        get_date_field() const Glom::LayoutItem_CalendarPortal
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_from_table() const Glom::LayoutItem_Portal
        get_has_related_relationship_name() const Glom::UsesRelationship
        get_has_relationship_name() const Glom::UsesRelationship
        get_has_translations() const Glom::TranslatableItem
        get_items()Glom::LayoutGroup
        get_items() const Glom::LayoutGroup
        get_items_count() const Glom::LayoutGroup
        get_items_recursive() const Glom::LayoutGroup
        get_items_recursive()Glom::LayoutGroup
        get_items_recursive_with_groups() const Glom::LayoutGroup
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_navigation_relationship_specific()Glom::LayoutItem_Portal
        get_navigation_relationship_specific() const Glom::LayoutItem_Portal
        get_navigation_type() const Glom::LayoutItem_Portal
        get_part_type_name() const Glom::LayoutItem_CalendarPortalvirtual
        get_portal_navigation_relationship_automatic(const Document* document) const Glom::LayoutItem_Portal
        get_print_layout_column_line_width() const Glom::LayoutItem_Portal
        get_print_layout_line_color() const Glom::LayoutItem_Portal
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_row_height() const Glom::LayoutItem_Portal
        get_print_layout_row_line_width() const Glom::LayoutItem_Portal
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_related_relationship() const Glom::UsesRelationship
        get_related_relationship_name() const Glom::UsesRelationship
        get_relationship() const Glom::UsesRelationship
        get_relationship_display_name() const Glom::UsesRelationship
        get_relationship_name() const Glom::UsesRelationship
        get_relationship_name_used() const Glom::UsesRelationship
        get_relationship_used_allows_edit() const Glom::UsesRelationship
        get_report_part_id() const Glom::LayoutGroupvirtual
        get_rows_count(gulong& rows_count_min, gulong& rows_count_max) const Glom::LayoutItem_Portal
        get_sql_join_alias_name() const Glom::UsesRelationship
        get_sql_table_or_join_alias_name(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_suitable_table_to_view_details(Glib::ustring& table_name, sharedptr< const UsesRelationship >& relationship, const Document* document) const Glom::LayoutItem_Portal
        get_table_used(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_title(const Glib::ustring& locale) const Glom::LayoutItem_Portalvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::LayoutItem_Portalvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_singular_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_title_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_to_field_used() const Glom::UsesRelationship
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        has_any_fields() const Glom::LayoutGroup
        has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::LayoutGroup
        LayoutGroup()Glom::LayoutGroup
        LayoutGroup(const LayoutGroup& src)Glom::LayoutGroup
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_CalendarPortal()Glom::LayoutItem_CalendarPortal
        LayoutItem_CalendarPortal(const LayoutItem_CalendarPortal& src)Glom::LayoutItem_CalendarPortal
        LayoutItem_Portal()Glom::LayoutItem_Portal
        LayoutItem_Portal(const LayoutItem_Portal& src)Glom::LayoutItem_Portal
        m_list_itemsGlom::LayoutGroup
        m_translatable_item_typeGlom::TranslatableItemprotected
        NAVIGATION_AUTOMATIC enum valueGlom::LayoutItem_Portal
        NAVIGATION_NONE enum valueGlom::LayoutItem_Portal
        NAVIGATION_SPECIFIC enum valueGlom::LayoutItem_Portal
        navigation_type enum nameGlom::LayoutItem_Portal
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_CalendarPortal& src)Glom::LayoutItem_CalendarPortal
        Glom::LayoutItem_Portal::operator=(const LayoutItem_Portal& src)Glom::LayoutItem_Portal
        Glom::LayoutGroup::operator=(const LayoutGroup& src)Glom::LayoutGroup
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        Glom::UsesRelationship::operator=(const UsesRelationship& src)Glom::UsesRelationship
        Glom::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        Glom::UsesRelationship::operator==(const UsesRelationship& src) const Glom::UsesRelationship
        remove_all_items()Glom::LayoutGroup
        remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::LayoutGroup
        remove_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::LayoutGroupvirtual
        reset_navigation_relationship()Glom::LayoutItem_Portal
        set_border_width(double border_width)Glom::LayoutGroup
        set_columns_count(guint columns_count)Glom::LayoutGroup
        set_date_field(const sharedptr< Field >& field)Glom::LayoutItem_CalendarPortal
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_navigation_relationship_specific(const sharedptr< UsesRelationship >& relationship)Glom::LayoutItem_Portal
        set_navigation_type(navigation_type type)Glom::LayoutItem_Portal
        set_print_layout_column_line_width(double width)Glom::LayoutItem_Portal
        set_print_layout_line_color(const Glib::ustring& color)Glom::LayoutItem_Portal
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_row_height(double row_height)Glom::LayoutItem_Portal
        set_print_layout_row_line_width(double width)Glom::LayoutItem_Portal
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_related_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_rows_count(gulong rows_count_min, gulong rows_count_max)Glom::LayoutItem_Portal
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_list_const_items typedefGlom::LayoutGroup
        type_list_items typedefGlom::LayoutGroup
        type_map_locale_to_translations typedefGlom::TranslatableItem
        UsesRelationship()Glom::UsesRelationship
        UsesRelationship(const UsesRelationship& src)Glom::UsesRelationship
        ~LayoutGroup()Glom::LayoutGroupvirtual
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_CalendarPortal()Glom::LayoutItem_CalendarPortalvirtual
        ~LayoutItem_Portal()Glom::LayoutItem_Portalvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        ~UsesRelationship()Glom::UsesRelationshipvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1Document__coll__graph.png0000644000175000017500000024700112234777146031763 0ustar00murraycmurrayc00000000000000‰PNG  IHDRPkà‚Œ£bKGDÿÿÿ ½§“ IDATxœìÝw\Sçâð7„a$aï„%aãÄU·¶ÚÖA]·µ½µZ­ZÛzoÑÚVkµÞÞÖ^í´ýµEmq´×âÀU¢…e†ö 3 dýþ8-—*.„ñ|?ýôs89çäIpàsÞ¼/M«Õú ôt…/À0Â`˜0Ôwz4mKK{÷/e²Žd2Œé„ “Ê0R¡ð¡Z[ ­--ÍÍí--2Y»LÖ.“utû»V«•É:4MKKÕêjµš{u»ÏÌÌØÄ„annljjÌd2ÌÌŒÍÌŒ -,L¨ 6ÛÔÒÒ”Í6e³™Ž)‡cÊf3ÍÌŒuò†1šV«ÕwÐ1F+•Ê*+›kjšëë[ëêZä òúúV©´¥¡AÞÐЪP¨ºŸbllÈf3-,˜l6Ó„Íf²XLÆb1i4Âfÿ±m`@³°010 ±XÌ®si4ÒýËîÚÚ:•J5!D­Ö´´üÑËåŠöve[›¢µUÑÑ¡”Ë­­ …BÙÚªËʦ¦¶ææv¹\ÑýR êÙlSsGG¶…½=ËÎŽekkáàÀ¶¶6g0è:~+†¾C˜TÚRZÚPUÕTUÕTQÑX]-«ªjª¬lª­•Q5+!ÄÜÜØÆÆÂÚÚÌÊÊÜÊÊÌÚÚÜÖÖÂÊÊÌÊÊÌÊʼ«Þ52tŸûQ*ÕTóÛÜÜÖØØÖÜÜÖÜÜNmH¥-552©´¥ºº¹{/lccNµÀlKggK''Ž““¥‹‹¥‰ C¯`` ðärEiiCYY}iiCII}ii}YYCII}{{'u€…ƒ‡j9ÙlggK¶£#ÇØxÐ5¹ºÕÞÞYS#«­•ÕÖ¶ÔÖþÑWV6UV6UT4vt(©Ã¬¬ÌºÊ_''Ž‹‹gÍãÙ²X˜Y†¾ƒ‹R©.-­/(¨-,¬-*’I k¥ÒêQkks.×ÊÕÕÚÍ͚˵âr­¹\k''¦2¸—úúVªü-/o¨¨h¬¬l®¬l*+kJe–bmmN5¿<ž ŸoãæfÃçÛXY™é;8@o ðÐ'™¬#?¿:7·ª  ¶  ¦°PZ^Þ Ri!vvîîv@`+ØRõ..Ó•ÎNUiiƒD"•HêJJê$’ºâ⺮7ŸÅbRý¯··ƒ‡‡½——=Ÿo‹V?¾§­­S,®ÎË«‹«ss«Ä⚊ŠFBˆ‰ ÃÃÃN °sw·õð°lù|L5 J¥º¢¢‘*‹‹ë j jË˵Z-ƒAws³öòrðð°óövôð°óð°c2ôà/Pøô£²²†¬¬Š¬¬Ê¬¬Šììʲ²ª:ôð°óôtðñqôòrðñqtuµ¢Ó ôzÖÖÖYPP“Ÿ_#Sÿ¯.-­W©44+//ûQ£Gvöñqì ñ}}Bá  3J¥Z,®¦êݬ¬ŠÌÌ ™¬F£q¹V¾¾N>>NÞÞÞÞ˜`¨S*Õµùùô¿ÙÙ•ÅÅujµÆØØÐÛÛÑ×׉úvíÄá˜ê;,Œ,(|zO¥ÒäçW§§—¥¥•¦§—egW*•j ooG__G__g__ÇQ£œÌÍ1ñî0×ÞÞ™—W•U‘]•“S™])“µB9¾¾Ž>>N~~ÎB¡+g£ï¤0Ì¡ðx¶¨Hšž^šž^–ž^–™YÑÞÞÉf›º¸p}}¸\+¦ï¤ gee Tó›]™•UYRR§Ñh9Ó€€?~©¸:9qô†¾÷£ÑhóókD"IRRQFF¹D"U*Õ66æAAnB¡‹Pè*ºØÛ³õ;¥R]T$ÍÈ(ËÈ(ÏÈ(ËÈ(S(TææÆ>>NÔ¯"¡ÐÕËË·  PøÜ©¦¦™ÀKMÔÐÐ 766=Ú™•àêáa‡5Ö /Z[™™å]åoQ‘T£Ñ:9q\ƒƒÝ‚‚Ü\ÍÌ0<2¾¤£C™‘Q–œ\œœ\|ûviMM³¡¡··c@€k` 70ëíí€eÖ ÿtïSSKŠ‹ëèt//‡à`·à`nP›§§=î1ÀÃ@á #TeeSr²$9¹85µä÷ßË•J5—kÊ v p=ÚÙÄ„¡ïŒ0BÕÕµ¦¦§¤”¤¤§§—Éå ssã€×à`5þ×ÎÎBß`Bá #…R©ÎÈ(OI)NI)‰$ÕÕÍÆÆ†B¡kh(/4”ÂC‰ƒJ¥ÉË«¢îL¤¤I !ÎΖ!!¼ðpþ˜1‚Q£1øº ð€á¬¦F–’Rœœ,II)¡–Értä„…ñBBxÁÁ<¡Ð5ÀÐÒØ(OI)IM-IN.NM-nkëd±LÂÂøáá‚1c\##C}g}Bá ÃJG‡R$’$%ed”§¥•J¥-,–ɘ1îB¡Kx¸ 0kaa¢ïŒ:SRRŸ”T$I’’$bq5nàînΈð?ÞÃÚÚ\ß` ¡ð€!¯¥¥ƒš¥!1±èöíÒööN;;‹j¢·€®±1Æ<Âð'‘H“’$‰‰E"‘¤°°–N7=ÚyÌõÊ_€…/ IUUMII’¤$IRRQnn•V«õòr燅ñÃÂø\®µ¾èS]]kròåïï¿—«Õ__§I“¼'Mò `AB€a …/ V,®NL,JN.NL,,/o422 p „‡óÃÃùl¶©¾3 Fí퉉Eׯç]¿.ÎÉ©22¢‡… ¦Mó™5k4Ÿo«ït c(|`ðR(Tii¥Ô¥"Qqss‹Å¤†ñRòb®€G"•¶ÄÇ‹¯]Ë»|9»¡Aîîn7k–ßôé¾aa|:Ý@ßé@PøÀàÒØ(§V JJ’¤§—*•j''Θ1‚°0Á˜1ooš¾3 yjµ&%¥øÂ…¬ 2 j--ÍæÎ>ñDàøñh~†4¾ ÅÅuTÉ+Iòókh4âåå0fŒ ,Œ?fŒÀÙÙR߆3‰DzîÜï¿ü’–‘Qfmm>ožðñǃƎ ùŠPø€¨T𬬠‘HBM×PS#322 䆇óÃÃaa‹ÅÔwFT*M}}K]]kM¬®®µ©©­©©­±QÞØØÖÔÔÖÐðÇžÖVÅ'2™F,–‰¹¹ õB5½€™™±¡¡“idddhdD75ý£¥Ñh÷úU×ÞÞÙÙ©¢¶;:TÊÖÖ…B%—+ÚÛ; Uss»R©jjjojjëj)FF†¶¶lsGG¶…ƒÛÖÖÂɉãæfcnn¬Û·k**’>|óØ1Qk«bÞ<áêÕ!!<}‡€¿@á ½ÑÜÜöç0^Izz©B¡b³MÃÃùÔªk®˜wdÒjµµµ-••M••M••õõòÚZ™TÚRW×R_/ïúÁÃØØÃ1³²2¥Òr8f––¦VVf––¦Ž™…… ‹eÂb1Y,¦…… ƒA×ËËé줚_yss;UF×ÖÊjjdµµ-55ÍRiKuus[Û¥°µµ9gíæfÃãÙ¸¹Y ¶^^&zIÞ¯:;U§O§÷]‚H$ p}þùIO<ˆßòƒ _xX¥¥õ]s5ˆÅ5Z­–˵ ãSÃx½¼0!ï"—+ÊË»ŠÝŠŠÆòòj[©TBh4š…£#ÇÖÖÂÚÚœkccaoϲ¶6·³c±Xä mkë,/o(.®+.®/)©£6ÊË”J5Fsuµòõuòñqôñq=ÚÉÍÍf8ý6ÉÈ(ûúëøS§n³ÙÌ•+ǯZ5ÁÎÎBß¡F:¾pO …*)©ˆZu--­´¥¥ÃÄ„AÕ»áá‚  ·‘ðöN*m).®+/o¬¬l¬¨h¬¨h*/o¬¬ljnn£033vv¶tq±trâ89qœ-]\¬¨m} Ë ÔjMYYC^^u^^uvv¥X\]XX«TªÍÌŒ\ƒƒÝBBxAAnã•É:ŽKúê«kÕÕÍ ½üòcÞÞú0r¡ð€¿Ë·o—$&JD"Ijjqk«‚Åb††òBCyáá‚  îˆ]·jØkjj+*’J$Ò¢"iQ‘T"©“H¤--„:ÝÀÞžõg±kéäÄqqù£äe³Mõ|hP*Õ……µÙÙ•))%))ÅÙÙ*•ÆÕÕ*$„ÆŸ<Ù[ °ÕwÆ>Q*ÕÇ‹üµ´´~þü€õë=ÚYß¡F"¾#V«‹k¨‰D"III½ÍÏÏåÏ‘¼|{{¶¾3‚޵¶*$’?º]‰¤®¨¨¶¨¨®±QNa0è..V@`'Ø ¶<ž£#ÇÐÐ@ß©‡•ööÎŒŒò””â””âß~+jl”»¸XNžßV °áóm©z×ÅÅj$OÅ 6#£ìÚµ¼k×òRRŠÕjM@€ëܹÂyóx<}§ë¥¤¤¢ƒ½t)ÛÇÇqÍš)O>‚{…/ÀHÑÚªHK+MN–ܾ]šœ\ÜØ(g±˜aa¼Þ˜1«aÐjµÔÔ±bqunnu^^U~~B¡"„ØÛ³ÝÝmù|[>ÿz—Ï·122Ôwdø‹ÖVÅÍ›ù—/çœ=›Q_ßêçç<~àüùCt‡ädÉþsùÒ¥loo‡—_ž¶`A0j_€þ†Â`ØÒjµEERjÂÐääb±¸Z­Ö¶!!¼ÐP^XßËËÁÀµÚjjšóò¨n·:7·2?¿¦µUAqv¶ôô´÷ñqôô´÷övôô´Ç¨í¡E­ÖܺU›N5¿¾¾N‘‘c/Õã¤É¯¼òʹsçzq¢FÃR*ÝÕj+SÓ«„¨u tï“O>™3g޾S@/¡ðVZ[ii%"QñíÛ%))%rSS£€×ÐP~h(/$„ge5„ç…¦¦¶œœ*±¸:7·*/¯:7·ª©©âàÀöòr5ÊÁËËÁÛÛÑËËÞÂÂDßaA7¨æ÷§ŸRccÓT*õüùË—3F0ðã.^¼877722²w§«TZCCÜa¶mÛ³dÉ}€^Bá 0´Q³ñfd”S«®ÕÔȺ–\ ]ÂÃnnÖúν¤VkŠŠ¤YY™™™™yyUÔÜ»öö,//ooªÞuðöv`±˜ú ý®µUqêTê?$¦¦–¸»Û­Z5~Ù²±ff7p{ñâÅ„ãÇØ3‚^Ðh4¾C _€¡§®®õÖ­‚¤$IFFYVVE[['‡cJ-¹Æ÷õuƇ÷‡¨ööΜœ*ªáÍʪÈÉ©joïd2|}üý}|œ¨†—ÃÑÛ‡úa0ÈÍ­:zô·˜˜$CCúêÕ«WO´´ˆ‘û(|G¾C _€!àîa¼4ÍÓÓžjx…BW;:K! 1Z­V,®‹«ÅâꌌòŒŒ2j¯››µ——ƒPè"º ….ööl}'…ÁH.WüðCâ§ŸþZ_ߺ`AЦM3û{a7¾# _€¡ks Rõõ­ii¥iieÔl¼ÍÍm ](ty≠ÐP^h(ÏÑ‘£ïŒðÈJJê»ðffVTU5BìíÙþþÎÏ<3ÖÏÏÙßßÅÕÕJß1a033~á…IÏ<3æðá[Ÿ~õ—_Òž>bãÆ˜ß`„Ã_€Á¢¥¥##£<=½4-­4-­´¼¼‘boÏ q 凄¸ …®ÆÆ¸Q7ÄTU5ݾ]ššZ’–Vš™Y.“uÐh477k??g????g[[ }Ç„¡­³Sõý÷7?úè!dË–Y+WŽg0è:Œð!0Â`¨Cq 7òää⌌²îç§>Ëÿâ‹S„B' }Ç„GÓÚªHO/»}»$5µäöíÒššf&ØqgÍò£Þ‘ömU©T C*•ÚØØtßO£ÑîÞÙýÑ»wŠD¢ÐÐÐ~Iy_ƒ*ÌÝŒŒ _xaÒ’%aû÷_|÷Ý_¾ù&þ­·ž˜9ÓOß¹@Pø œööÎß§æá•t5¼66æAAn+VŒ ]…BW{{–¾c£Q©4bqujj 5Œ7?¿F­ÖØÛ³¸Ï>;!(ˆÈ៲§ÓéÑÑÑ6¹±±‘Ú°´´¼råJ`` !äQ/ò@žžž¬n LYYÙsÏ=—˜˜Èçó<ñ¨W`±˜Û·?ñ·¿Mxÿý3Ï=÷ÍãìÞ½ÈÊj Ös»{Õýƒç²4­¿»ûÞÝóè¾ýH¡P¥§—Rx32Ê kÕj ‡cÆÿ³áÅ’\CF£Íϯ¡ÐËÈ(/*ªU©4TqÿôÓ!aaüQ£œX¬‘5†÷þh4ÚŠ+õ,ç³T›››wÿRWJJJ¶nÝ:HÂlÚ´ÉÈÈ(++ëÓO?}ê©§$‰¹¹y/®ÃåZöÙª^˜´qãÑñãßÛ¶íñ+Æé<íÃë]Ý?ð—MNN »cOHHˆN.ÞOo@Pøè’F£ÍÌ,§ðfd”K$R¥RÍdùù9GDxmÙ2+<œ†w(jmU¤¥•R5¤¥•ÖÔÈ ú¨QŽãƹ¯];50ëéio`Ðçþ‡©TjkkÛõåüùówíÚE©­­uvvÎÎÎþî»ï¾ûî»ööö™3gþç?ÿ±¶¶&Žd´°°Øºuë?ü Ñh¶oß®«Tiii¯½öZjjj{{»»»û[o½EM?J£Ñ®^½ºråʨ¨(±XÍ`0Þyçõë×߸q#44”Çãé*CßÃ\»v-::šËåFEEíÝ»7++k̘1½ŽÂ;wîÕ·ß>õÆÇ’’Švî|’Í6ÕÝ«|½«ûþ²AAA]㸫««###…B¡®.ÞOo@ ô`È++k8{6cÏž3Ë—!nŸ=ûßo¿ýß´´R—·Þzâ—_^ÉÊÚuêÔ+;w>ùøãh{‡ŠŠÆÿþ75*ê§™3ÿåãóæ’%Ÿþøc’©©ÑË/?»Q,Þsþü–÷ß_´ti¸··Ã°o{oܸ9iÒ¤î;—.]úÓO?QÛ'Nœ˜0aÂÉ“'üñÇ'Nܼy³¦¦æ…^è~ü®]»~þùç“'O&$$tØw‘‘‘žžž©©©ÅÅÅ›7o^µjUgg'õЛo¾yôèÑòòòØØØ¸¸¸‹/FGG«T*êQ­V«óÕk{¦°°pæÌ™„œœGGÇ>&±°0ùðÃ¥ÑÑÏŸ9óÃß/ïã’H$7nœ©©)Ç;tè!„F£ÕÕÕ)•Ê-[¶ØÙÙ9;;:tÈÄÄ$99Y£ÑìÙ³ÇÝÝÝÌÌlìØ± ÔEh4ÚáÇ»o<Òe©Gccc]\\¬¬¬8@IKK›>}º••“Éôóó;vìX÷Øt:ó§}ûöíØ±ƒÁ`Üýê¤Ri÷/çÏŸ¿mÛ6j»¶¶–Á`äççoÛ¶ÍÕÕÕÆÆfÙ²eõõõ]¯¨®®N¡PlÚ´ÉÞÞÞÖÖö“O>ÑåûÐE B£ÑH$ÒS§nïÚ»dɧ>>o::nrtÜ4vìÎ_üöàÁË7näËdíúŽ ½¡TªÓÓKº¶fÍwÁÁo;:nâó_òÉÿìÞ}úÂ…ÌÆF¹¾êA[[ÛW_}8eÊ”˜˜˜ÎÎÎî677›˜˜äææjµÚI“&}óÍ7žžžß}÷õhff&!¤¹¹Y«ÕB¤R)ŸÏÿú믩GÓÓÓ©Ì@‰D÷9 ©©I¥RQÛyyy]—%„?~\«Õzzz~ÿý÷Ôw\ð×È0yyyîîî[·n}È<£¡¡õ™g>çñ^ûñÇľ\gÑ¢E‹-zàa`ëÖ­UUU'Ož400¨®®¦Þ„÷Þ{ÏÓÓ3%%%++kÒ¤It:]$}üñÇ®®®×®]«¨¨Ø¶m›µµµR©ÔjµÑÑÑEEEÝ7é²Z­–2kÖ¬ššš“'Ovttx{{¿ôÒK‰¤ººúСCÆÆÆ …B{×÷4;;[(Þýºâãã—.]:jÔ¨î;¿ÿþ{jûàÁƒ“'O~ÿý÷ÝÝÝûí·¼¼¼iÓ¦-\¸z”J»mÛ6.—Ÿ——7yòä‡ü-0À!111úN½‡)àŽyx©YŒŒ \…B×E‹B…BWÀ–Á ë;)ô†LÖ‘œ,II)NJ*º}»´­­ÓÞžÊ_³fJh(Ïßße$gÏŸ?¿råÊÈÈÈ~øaÔ¨QwÀb±æÌ™sòäÉgŸ}ööíÛgΜY·n»»;õ(µQ^^îëëKí©ªªòòò¢¶»6ú®©©iÏž= w\–ËåBÊÊʵÇÓÓSWÏ«Û02™lÏž=ÑÑÑ{öìY¾|¹#YZš>üâ‡ƽúêEEÒüc.ÖÒ›ššžzê©úúú®‰k¿ýöÛíÛ·B8@M˜ðÅ_ìØ±ƒ9þî»ïnÙ²…N§Bº&@èÚx¤ËR^zé%;;»… ªTª–––ÄÄDsssêú …B&“ݽ`Ú|°aÆ®/ÛÛÛ9rðàA‡³víÚèèèî/X°àÅ_ÌËËóööމ‰yöÙgßÿý·Þz‹šŽã“O>ñóó“Éd,Ö«q9rdÇŽ'N¤ èóû p'¾wêèPRÝn÷†×Ä„áïïáõòËÓÐði]ó,S«®ÕÔȨú><\ðâ‹S¸vvXXé...áááçÏŸçñxööö–––w³téÒ}ûö™››/\¸ÐÜÜÜÅÅ¥¨¨h„ „¢¢"Bˆ““S÷ ŠÅbªí*((ÐUÎI“&;vß¾}AAAZ­ÖÄä+æB% •ª°°PWÏ«Ã0%%%S§Ne2™7oÞtuuÕy*Úë¯Ï ]_zé»ŠŠÆ>z¦ÿþûôÓO7nÜøÑGM:õÅ_?~<µ¿Ç¦»¸¸ØÛÛ›Ú¦Ñh÷Y ï‘.Kqvv&¾íä¾]|—æææ“'Oîß¿Ÿúr¨Üóè…/ioïüý÷ò®†·¨¨V¥Òt­´F5¼îîv††˜÷|¨R©4ééeÔ0ÞädImm‹©©Qp°Û²ecCCù!!<ËäÁWyF}úô颢¢ƒúûûÏš5ëå—_¦†RvyüñÇŸþù|þùç„¿ýío;wî5j›ÍÞ°aÃüùó»Wx+W®|÷Ýw½½½íìì¶lÙÒµÿðáÃ&Làóù½Ë©T*ÃÃÃ===srrvïÞMihhè>rsùòå»víòõõe2™ÔóÞgˆ«^ÂüóŸÿ”H$Gޱ°°hjj"„XXXÐéô>†¹Ã¬Y~_½úÅ¿50 }üñ²~šxzöìÙ%%%ééé?ÿüó”)S$ µ¿Ç¦ÛÉÉI"‘P÷!MMMÔ ïãe)w|—ïÓÅw9uêÔ¸qãºä•{¡ç)%ôA­ÖˆÅÕÇŽ%EEœ?ÿ#ï5GÇM\î–™3ÿµeËß~{#5µ¤£C©ï˜Ð'ÍÍí.dîÚ;kÖ‡®®¯:9mžä¾<oÓ¦MUUU'Nœ044¬««#N_ëíí’’’=kÖ,BHrrò®]»A|||UUÕ¾}ûÌÌÌZZZ´=ÍáûH—Õþõ;Eéèèø¯ý«¾¾>--mÉ’%„¼¼¼;Ž\¶lÙÎ;ïxE………¯¾úª³³óêÕ«SRRîxT.—›™™yzz^¾|Y«ÕîܹÓÓÓ3))‰šÃwþüùÝ3¼óÎ;nnn7nÜ‹ÅÔ}Ôo®—9Ìá 0Ä¡ð€‘¢¼¼áôé´;Y´è€—×?¨†wÆŒ}¯½søðÍôôÒÎN•¾3B_µ·wÞ¸‘ÿ¯{úé|þ뎎›ÆÛõê«?;–TVÖ ïtpO„'N ÌseffÒh´ºº{–þ#!Ìùó¿s¹[>þøÂ#õ…ï¥K—üüüLLLÜÝÝøáíŸ]gMwggçöíÛ¹\®©©ixxø•+W¨‹t5Ý]tYmO…ï»x­VëêêÛãëÒã=†Â`¨£iµZÝ$òòª»¦âÍÉ©lmU …®B¡«Pè"ºzxØÑ阥aÈkl”߸‘/NJ’Öйáá‚I“¼‚‚ÜÌÍõÌÃÃãÖ­[¶¶¶÷?,..nΜ9wڵk×}N=zô¼yó¶oß.—Ë×­['“É.]º4œÂô‘#·ÞxãøçŸ¯züñÀ‡v¬ûرXu þ"33sãÆIIIZ­v„ Ÿ}öY×2_#9ÌÆGϟϼrå GÇ{.•Ö] ßGjºõ~ÙÖÍ~/ ðêPøÀ¦ÑhÅâj‘H’’Rœ–VVPP£Ñh-¹®Ô,Sß1A7š›Û‹nÝ*üí·ÂÌÌ ­Vëãã4nœû¸qcƬ¬Ìô`ˆioïœ>ý_\®ÕÑ£k]—>¾ýÔtž}Ø@á 0Ôê;À£ikë¼}»4)©(%¥89Y"“uXZš…†òžx"0 À5 €kcc®ïŒ 3--¿ýVxãF~BB~nnFó÷w7ÎýÕWg#@›ÐL¦ÑGE>õÔ˜˜¤ÈÈ1ýýt~~~—/_*—ºPøÀP[ÛòÛo"Q±H$ÉήP©4îîv¡¡¼;„†ò=<ìfl  …J$’ܸ!NHÈOO/Óh´þþ.S¦ŒzóÍùááÌÉ  Cáá‚åËÇíÝ{ö‰'‚LMôt…/ Rò[·  òÅâjj½µ‰=_}ufHÏÚÃx‡•J“ž^Jä‰$ …ÊÝÝ."ÂsíÚiãÇ{p8¦ú8rõx7E$…††"Ìà Ó¯¿>ç¿ÿMýâ‹«›7ÏÔwо0ˆTW7ÇÇ‹E"I|¼¸¤¤ÞÜÜxÜ8Å‹C#"¼Fv¦Ó±ÞÚ°¢Õjsrª¨’÷Ö­‚ÖV…½=;"ÂsïÞ%ž¹Šô·ÆÆFjÃÒÒòÊ•+„ ].‹wùòåÍ›7çç绹¹}ôÑGsæÌÑcŠL&óôô¿?ÜH$Ò7òoÜÈ¿y³ ¾¾•ÅbŽïñÏΛ8ÑËÓÓ^ßéàNÎÿšwssóî_êÊóÏ?ÿ·¿ýmíÚµGŒŒ¬®®f2{žyÂPvíÚU[[{ÿc LAAÁ±cÇf̘Aa0:¿~—gŸøé§¿þôSò3ÏŒÕáe¦ /((ðôô|`[:aÊÊÊž{î¹ÄÄD>ŸðàÁˆˆ=†yøû(0ü`¸èGc£ü¿ÿM}å•#oÍûQLL’ŸŸËW_=›™¹3.îÕmÛŸ6Ímï°Q]Ý|ü¸hÓ¦£¡¡ïL˜°û­·~nll{ñÅÉgÎlÎÊÚõÍ7«Ÿ{.mïP—––6}út+++&“éççwìØ1j?F»ví—Ëýâ‹/¶lÙbggçìì|èÐ!“äädBHzzú[o½åàà°víZ™L&‘Hô†RXXØÖÖÖ÷ }SPP  ÍÌÌ8Ž™™™#ÝÁÖÖâ‰'‚ŽùM·—åü‰üÙ‰s8:®Ã§())Ùºuë ³iÓ&##£¬¬¬¹sç>õÔS­­­z óüóÏ?ù䓉äÅ_ŒŒŒloo×áÅ`Cá G«Õ¦§—}üñ…Çß/¾µqãÑêjÙºu]»öÄÄíï¿¿höl6³µÍÍm±±i¯¼r$(hGpðÛ¯¿~¬ªªù¹ç&ÆÅ½ZP°÷رµ6L âb¦Ža#22ÒÓÓ355µ¸¸xóæÍ«V­êìì¤zóÍ7=Z^^wñâÅèèh•JE=Êf³étzMMÍ¡C‡œœœø|¾ÃB¾ú꫽{÷ö=CÃÈd2©TºjÕ*ccc@pãÆ FºÛâÅa©©%99•ýú,÷ÒëNœÇãýôÓOƒ$̵k×6lØÀår£¢¢êêê²²²ô¦?î£ÀP) ß)•ê«WsccÓ._Îil” …®^o¼1'<\ Ûù"Aï´ZmVVåõëyW¯æ%%uvªx<›Ù³ý'Mòž0ÁƒÅêùsú0<$&&š››S£#"" …L&³±±!„lÞ¼yâĉ«W¯Þ¾}{pp0!äÀB¡°ûécÇŽ-))ùþûïï5ŸÃÀ„IHHX¼x±n‡Óö.LAA!Äßß?..nï޽˖-+**24ì¯?3Çs·±1¿p!ËÇÇ©Ÿžâ>"##§NzèÐ!&“yúôéU«V-\¸ÐÈȈüÙ‰Ÿ?žêÄMLLÖ®]ÛUÐkµZr)q>Laa¡¹¹9!$''ÇÀÀÀÑÑQaØl6!¤¦¦æØ±cººCªè/jµæ·ßŠÎžM?{6£¦FæååðÜsçÎúúê¡M€~UZZáBÖÅ‹Y©©%r¹ÂÑ‘óØc>+WŽ7ÎÃÆÆ\ßé`€455íÙ³'!!¡  ÀËË«ûC\.—RVV&¨=žžžwœ^TTôÓO?­X±bþüù}Ÿ·×aZ[['L˜ÐÇg×I˜àà`ªÍ$„lݺuïÞ½‰äî÷MWètƒÇó½r%wãÆýô÷ÑÇ»ƒ$ Õ±ŠÅâeË–½þúëÔ7W_a(º½C _б¶¶Î3gÒ/]ʾv-¯¥¥#4”÷òËÍžíïâb©ïh K …*)©èÚµ¼«Wssrª ‚ƒÝÖ­›6y²w@€+&j&Mš4vìØ}ûöiµZ“®‡ !ŽŽŽ‰„ªS »mnn¦*­¹sçvttTUUõ½ðíu˜Ù³gwm‡……=p)°~ ÓÔÔÄb±¨c!¦¦ý;ãͤIÞ?ý”ÒÑ¡41éÇâzÔÇ»ƒ$ŒL&Û³gOttôž={–/_®ß0ÝÞG€¡…/èLZZé‰ÉÿýojCƒÜÏÏyݺióç¶úÎ:£Ñh““%/fÇÇ‹³²*´Z­ŸŸËÔ©>;v, ã|IƒŠR© ÷ôôÌÉÉÙ½{7!¤¡¡ŠHY¾|ù®]»|}}™Læ–-[ÈŸŸÄ [±bÅš5kŽ9bkkKµW‡ž0aB¯?‡Þë0Ô–––W®\ Òc˜ÐÐÐ… nذá£> uvvî{˜û å)•ꌌ²ðpÎ/~½îÄO˜’’’©S§2™Ì›7oºººê7 éŸû(0T ð€¾ªªj:y2åøqQ~~ Ÿoû “. æñl|&  òøxñÕ«¹×®åUW7[ZšEDx®Z5~Ò$o ܆._|ñÅ+¯¼²mÛ¶æææ ääät°mÛ¶úúúéÓ§s8œ}ûö?žÁ`B¾ùæ›õë׿ÿþûÇ766&„¬\¹2::º×µf¯Ãt/ź>J¯¯0ÑÑÑkÖ¬ùôÓOÃÂÂ~üñGêà>†¹KKK³ß/øÂ·×xôRÐÿóŸÿ”H$Gޱ°°hjj"„XXXÐét}Ý-èû(0dhz¥¾¾õ«¯®Íšõ¡£ã&¡pû®]±¹¹Uú:£R©““‹÷í;7gο7s¹[ž~úÀþýoß.Q«5úNC^ff&F«««»×„'N ̇yüñýQQ'ïõè¢E‹-ZÔ‹ËBD"Ñ}øå—_x<ž±±ñøñãÏž=;kÖ¬Q£Fu?±££cíÚµ–––|>ÿĉ„ôôô{]Ÿ=Àaìììîø›:X/a´Zm|||@@€‰‰‰ŸŸßÕ«Wæéž*&&æ‡À EÓþ¹ÀCºu«ðÇÏžÍP(”S¦ŒZ´(lÖ,?cc|b`8¨«k½r%ç×_s®_76Êy<›©SGMê3~¼‡©©‘¾ÓÁ 7gΜ»÷GEEíÚµë>'Ž=zÞ¼yÛ·o—ËåëÖ­“Éd—.]º×Á·nݲµ}Àœ0£[ëÖE·µu~ûíó=>ºxñbBÈñãÇûã©^VV–¿¿¿T*µ¶¶îñvâĉ§Ÿ~az†F£ÅÄÄ,Y²¤2À@@A«¥¥ãäɔᄏ‘—Wíããôúësž|2ØÖÖBß¹ ¯:;U×®å]¼˜/.)©g±L&OõöÛ ¦L…ï/ÜmöìÙ½»[³qãF'''­V;a„/¿üò> L_ÂôŽ««Õ¥KÙýw}tâÛ·oŸ6mÚ½:MBˆ»»û¤I“¦×a`¨Ã_x0‘HrèÐõóç3™L£+Æ-]îáqçgWaÈ)+k8>óâŬää⎥¿¿ËŒ¾3fŒ=Ú™N7Ðw:Ѓèè›ï½››û~êq„offæÆ“’’¨Nü³Ï>£&¥Õ‹a#|†:Œð€{joïûlÕ“Os8¦úÎp§ÈÈHOOÏÔÔÔâââÍ›7¯Zµª³óyÞ|óÍ£G–——ÇÆÆÆÅÅ]¼x1::º«ÍÉÉ9{ö¬©©©››[||¼~ÃtEJNN~òÉ'ïÿ,LMM=tèÐæÍ› Å}Žüí·ß<<<Þ{ï½¶–ýM­ÖB z‰Î^ß „¶µµ †0B¡ÐÌÌŒÃᘙ™é7LÜ)€¡…/ÀÈR\\·eKÌ„ ï]¾œýæ›ó““wüãóììõœ’@Ñjµe~7{ö¿CBÞ~ûíÿš˜0Þ~{aRÒö¸¸W·l™-º|Gðð8Àãñìíí#"" …L&£Ú¼yóĉcbb¶oßìëë{àÀµúA¦--- R©tÍš5Ë—/×ÉHØ^‡¡|ðÁ6lxà³¼ôÒKvvv .T©T---÷9röìÙׯ_—Ëå!!!«V­JJJêË«ë ­VK10èŸûRÁõÕW{÷îÕ{™L&•JW­Zell,nܸ¡Ç0¤î”t§Ñhóòªcb’rrªt~qè#Ìá 0Rdd”}øáùË—³}}zî±Ç|Ñ~jµ&9¹øâŬK—²ÅâjÇtêÔQk×N2Å›ÍÆ0^JšššöìÙ“PPPàååÕý!.—K)++ÔOOÏ®G™LæÆ9Îúõ룢¢$I÷G8 !¤¹¹ùäÉ“û÷ïà³8;;“‡.O¹\îîÝ»wìØqìØ±5kÖ0 ½Ô¾ Uøô߉‰‰æææÔœ]¼ ù³‚_½z5UÁB8Ð5{rBBÂâÅ‹u5œ¶/a !þþþqqq{÷î]¶lYQQ‘¡a_Òîõ;Óu§äÓO?]¾|¹NÂÔÔ4ß¾]ššZ’œ,ÉÈ(okë$„üüóƒo~ÀCá 0ü¥¥•~ôÑ…K—²ýý]þïÿžŸ>Ý·ÇõÁaðËW¯æR=oCƒÜÃÃnÆŒÑï¿¿(,ŒohˆOfÀ4iÒ¤±cÇîÛ·/((H«Õš˜˜t=DU¢ŽŽŽ‰d„ „®G5‚R©$„0™L=†!„œ:ujܸq,ëÏÒ‹?ióòònÞ¼)“É–.]ú¨çꄾ ß^Wð­­­Ô·Iïa‚ƒƒ©ñÑ„­[·îÝ»W¿7'tr§¤µU‘‘Q––V*I’“‹ëë[ !††*•¦[ «Þ½4è?(|†³ÔÔ’½{ÏÆÇ‹¹ß~‹ªw°«®n¾x1ëüùÌ„„|•JÎ_¿~úìÙ~<ž¾£ô•R© ÷ôôÌÉÉÙ½{7!¤¡¡¨HY¾|ù®]»|}}™Læ–-[ÈŸ…é‚ öîÝëãã³ÿþàà`BÈáÇ'L˜Àçó8 !äüùóݯÖÇ0„…BqüøñÏ>û¬³³sýúõü±±±q¯¯ÖT‘G§ô¥^Wð³gÏîÚ ‰D¡¡¡ú ÓÔÔÄb±ºÆt›šêàs|§D¥ÒäåU™šúÿðCáÇ¿WZZ¯ÑhétF«Õj ÑBëÞöÒííÙ}™ [(|†§„„‚>8+I‚ƒÝbbÖFDx=øÐF›œ,‰M¿t)«¤¤ÞÖÖbÖ,¿/¿|vâDO&ÓHßétæ‹/¾xå•W¢¢¢BBB¶mÛÖÜܼ`Á‚îkImÛ¶­¾¾~úôégß¾}çÏŸg0„üã¾¾¾ÁÁÁ?üðuðÊ•+£££{ݱö: !$>>þ™gžé~µ>†!„œ={öܹs~øáرc{}P©Ô„cÒLê ‰,ÈòÓ‘xoìïçíuߨØH`iiyåÊ•   ¢¿û¡¡¡ .ܰaÃG}JÍ顯0½»Sb`@“HêÌÌÿ·~ µ”!„;ï;8°0=À Dëúô ¹¹U{÷ž½p!Ë××éÕWgÍží‡Q½ƒ\®øõל‹³~ý5‡š´aÖ,ÿ3|CBx?¶`°ÉÊÊò÷÷—J¥ÖÖÖ=@£ÑNœ8ñôÓO´0ý¨µd¾'¯Êè¬Ï²4í „#a"Ns‰ßvêÅ‹BŽ?þ¨×¦Ñh÷{ûÊ+¯TUUQüþýûKJJrrrºNT(›7oþñÇ© ~Ñ¢Eééé]óÕÞñ4-::zÅŠæÖ­[kÖ¬)(( ûæ›oÜÝÝõF.—/[¶ìÂ… ÁÁÁÿ÷ÿGMqÿ0ÝSíÜùåõ벬¬ Z·Â÷NÞÞ^nnÖ\®µ››µ››±1F“è _€á£¬¬á_ÿŠ;y2ÙÛÛaëÖ¹3fŒFÕ;ØÔÔ4ÇÆ¦_¼˜%IT*õ¸q3fŒž1c´›[ÏEÀ7gΜ»÷GEEíÚµë>'Ž=zÞ¼yÛ·o—ËåëÖ­“Éd—.]º×Á·nݲµµBa-i+'RbÜÃòb’øBM»ÓþoË_ßùª¥[a:ÞqH¯ _ÝTü° C£Ñbbb–,Y/Þ¹3ö^µ/ƒaä¦TªKJêäÔ‰öö,7·?Ê_jƒËµ¶µµÐÉ €‡„Â`8(-­ï½ÓgΤ{{;¼ýöBLà0Ødd”]¼˜uñbvff9“i4mšÏôé¾=æke¥Ë•冴ÌÌÌ7&%%iµÚ &|öÙg]KQð0½¤Õy1iÎ&ÍÙD–Mš²ˆ,—¨Z‰±-yºö^'%$,^|03sW:õ½ðT<ÂÜKWáK}y¯Ú×ÈÈð7æ¬[7¢Tª++›JKëKJêKJê© ‰DÚÒÒAa0èNNœ?Gÿ1˜Ç³e±Lz }„Â`h“J[öí;“äèÈ‰Šš?o^fÓ<~ÿ½üܹßÏŸÏÌÉ©d±˜Ó¦ùÌží7eŠþ‰ ýNÝAŽ™­š˜8¶/aû¶ay Obêr¯“®]Ë{æ™Ïssw³X=¬ñ¥Ç¾ƒª‚öaî(|)w×¾4ùâ‹gçϸϥš›ÛºWÀÔFyy#u6Û´{Lm¸¸Xbj#€>Bá 0Tµ´t|òÉ¥o¿½Ád2ÞxcîÒ¥á ]ß¡€¨Õš¤$I\ÜïçÎe”—7º¸XΚå?kÖè1cÜñ ÝЪ‰¼˜4çY‘å’ÿCÓ« wbdõð¾t){Õª¯ öššö°hä ™Òú[…/!D£Ñž>¶o_œD"¥¾<{vs` ÷Q¯ßãpàâb©LvÏáÀ¹¹±N^ÀH€u†…BuèеÏ>»¢Tª7mšñì³ÍÌð¯ =ki鈋ûýôéô„„üöveh(ïŧ`r^Ð¥¼ý¤î‘åYQwBˆ‰=aû’Îúž _ë°G}jÜ%îNA hO<4~`llÚœ“H¤\noþŽc0èT™ñ—ýwŽß8°««>Øp7¾CÌ™3é{öœ-.®[¼8ìµ×f;9qôhD“J[Nº}ñbVRR‘F£2eÔÛo/œ6Íßн†T¢”‡éÄk=aûÖ¨G½û0”J5!¨‡û00 -XôøãgΤëv&z6ÛT(4 ]»ï¼{8p|¼8:úáÀFF†ŽŽì;†{xØ÷8D`ä@á 0d¤¥•¾óΩÄÄ¢¹s…ß|³ÚÓÓ^߉F®úúÖóç3ÏˈÏ×h4ãÆyìØ±pöl?¶¾£ÀP£n' )¤9›4g‘†Ò”IÆ~M\ŸîáÈqßõw•JM§ ¡!“4ZQE"QhhèÀ‡¹›J¥b0R©ÔÆÆ†F£ ž`}g`@{üñÀx¢‡k4Úêêæncërr*ãâ~¯«k¥Nquµú³¶qs³æñ‡Óè­ IDAT¬¹\k| F¾C@qqÝŽÿ½x1küx¸¸WïüF,®ŽM‹M‹«Y,“™3ý¾úêÙˆ/†¾£ÀTô¤àKÒô;Qɉƒ°¼ ÛŸ8Ï'l?}%b0èjµF£Ñ•η±±‘Ú°´´¼råJ`` !ÄÂÂBW×ONN »cOHHÈCžN§Ó£££u˜(4''Ž“gÜ8÷îûZZ\\'“µBŒ ÝÜl¼½0) {(|5™¬}ß¾¸ï¿OlcbÖFDxé;ш£ÕjE"Illú¥KY%%õöö¬ùó?ø`qHŸz€Ó(‰º0zþÏ`»IÄëeÂö'lb ÿ¡3! …’ÉÔ˜‡Ááüoþssóî_êDPPPW§\]]) þt¶bÅ ÝF‚ûèq8°V«­®n..®/)©“Hꊋë®]Ë-.®kmUB,-Íø|77k>ߖdzáómx<kks½½]@á 0H)•ê/¿¼zðெ†ï½÷ôÒ¥áXEg iµÚôô²3g2ΞÍH¤öö¬Ù³ýçÌñ7Î߸u;iL' )¤!™4¤Y¬&áŸ÷p¤ëSÄõ©Ïw?Ôç ÕP)|^ZZÚk¯½–ššÚÞÞîîîþÖ[o-Y²„B£Ñ®^½ºråʨ¨(±XÍ`0Þyçõë×߸q#44´«DÞ²eËŽ;Œ{~¤ƒF£ýòË/k×®mkk{÷Ýwׯ_Oí¤¦t¸ãদ&sssCCü(Þïh4š£#ÇÑñÎáÀ …ª¸¸N,®¦F‹D’“'“KK´Z-ƒAwrâtìååàînghˆ½04à§L€ÁˆZÿº¼¼á…&oØð‹ÅÔw¢‘B£Ñ&'K¨ž·¢¢ÑÍÍzÞ¼€9süƒ‚Üð‘Ox€º[D´Ž4e­ŠqˆeqxŒŒÚLlÆè;ÙÃ211$„(J}ѽÈÈÈ©S§:tˆÉdž>}zÕªU .422"„¼ùæ›G=þ|lll\\œ‰‰ÉÚµkU*U÷Ósrr’““¿þúëû?ËÁƒSSSoܸ±téÒ¿ÿýïÆÆ÷œ4ö·ß~{饗þþ÷¿ÿýï·³³ÓÉk„GbllèííàííÐ}gg§ªªªY,®‹«©y!âãÅee M-°››µ§§ýð»;à _€Á%;»òí·O%$ä?ýtÈ?¾äìl©ïD#‚J¥¹u«àìÙŒsç2jk[<=í/›;Wèçç¬ïh0øh:{ž~éLœç¿íÄ2ˆ˜ó<–˜˜BÚÛ‡aᛘ˜hnnN§Ó ! …B&“Qo7oÞ^\^Þ¨Vk!l¶©——½··CW ìîn‡â@¿Pø òÿûÂ÷ß'xy9Äļ4q"¦ëíw­­Šsç2NŸN¿q#_¡P†„ðÖ¯Ÿ>{¶¿‹ zvè¦9‹4g“æ,ÒBRN–õp˜—wx8]²µ5'„ÔÖÊx¼;§ êšššöìÙ“PPPàåõ—¿a¹\.!¤¬¬L P{<==»ÐÜÜ|òäÉýû÷?ðYœ !õÁ.—»{÷î;v;vlÍš5 #))é!_ ¤®¸ûÔÀw,ww Lâåeïåå@Ílaa¢·×# _ýS«5‡ßÚ»÷¬±1ブ,^†Ùú•LÖqþüï§O§_¿ž§Ñh§LµgÏ¢iÓ|°H ü…¦“$D’†T"/!„3.± %^ë‰u˜¾“õ[[–¡¡AUU³¾ƒèÞ¤I“ÆŽ»oß¾   ­Vkbò¿êêg%É„ !………ÝÏ=uêÔ¸qãX,ÖŸ…F{俾óòònÞ¼)“É–.]ú¨ç‚õ¸@Ü-pii}llzQÑE•ê/-p×¼^^ööþuð¨PøèYRRQTÔObqõK/Mݸq†©)f‚ë/RiË©S·ccÓRSK hS¦Œúàƒ%3fŒæpLõ %#Â`÷ÕÄ*”X…“á?ѪÍÎŽUYÙ¤ï º§T*ÃÃÃ===sþŸ½ûŽkâþÿþNØÈ–½dGY‚ ¥¢´*Š[¨µ¶V«?µ®Zm:ŠŠRêÞØª€Êt`U NP†‚LA {Ï„Üïk󥑸$¼Ÿ>ŽËås¯ ¹{ç“Ï'=}÷îÝPQQÑv.5sss™M›6A›êmLL̘¶U=€   '''CÞÜÑÜÜvüøñ–––5kÖ8p “ñ°èb866óÌfS xUõõëë«ôàÄB!.,ø"D™ÒÒÚ;®^¾üâóÏ'O~id¤Fu"ÑTUÕóêÏ?“ÿþ;“ ˆQ£Löì™;i’•ª*öçEh#8P eO ì1”=çPÆc3Ç?ú=Å´´‹‹E°‡ïÉ“'¿ûî;OOO;;;//¯êêê™3g¦§§s7ðòò*//wqqQRRòó󋉉‘ oŠýâ‹/Ú¶¶xñâÀÀÀÞ|oܸqóæMGGÇ7‚„Ï*ps3;7·4/¯,7·Œü?11ÿýû*‡UU95CCUUCCÕ!CTŒTñói„Bu ª3 4à¿cÇU99©;gMšdEu"TUÕý2**).î NsvfL:ÜÕÕ¯—ÐJã è”=†ògÀªñA 2;€Ùd@u8°|ùY NZÚñ&www ëïLý.55ÕÊʪ´´tðàÁ<7 ÑhááásæÌéç`ýƒF£…„„Ì›7ê QuuCF33³˜ì œŸ_ž•UÜÐÐ’’⪠†&·/ðСZjjòTGF!„ ¾õ·ÌLæ÷߇&'¿ýî;—5k\¤¤ð4ä§êê†èèWQQI±±™t:mìØa,œ0ÁBN¿*‹(¸ åOAÅLV€šÈhSHà«Åļ¢:EÏEGGOž<¹ãzOOOŸNîhaa1uêTooïúúzooïqãÆ}¨Ú ÆÆÆÎÎÎ|ˆ‹Ð)*Ê:898q×°X­¹¹¥YY%¹¹¥99¥ÏŸç‘ã®Ðé4eCC5cc5##5ccuCC5]]e1±.MˆB!†•&„ú‡Cœ>ý`ß¾›úú*‘‘kìì ¨N$:JJj¯]KŒŠJzþôÀ…'Z*(HüÎ!ÑÀªÒ‡ÿŒÒPþZª@| ÛÌ»à‹>ÆÜ\‡Íæ¼~]4|¸ÕYú•¥¥åÝ»w©NP—𸥅›[–™É䂯]K¬©i"·×ÖVÒ×lf¦É`hr爣ìB!Ôǰà‹PŸ#âÌ™ØÝ»¯©ÝºõýСZT'zeeuW®¼ˆŠJzñ"_ZZbòd«Ó§—Žc&--Au4„PÿbÞ†{“3{°ÚjN <hø§‡ŒÕTUå?Îh_„„¤¤8ƒ¡É`hr×p8Ä»w•¹¹¥ÙÙ¥ÙÙ%99¥w=×ÚÊ Er,rPccu}ýÁØ#!„ x9„Pß*.®Þ°áÒßg¬Z5îûï' é7dD}}óíÛ©×®%Ý»—Îá£G›þúëüI“,q6„.•‘ðÙUPuI%ª£ˆfggŸ³råçTgAõ NÓÓSÑÓSqvf´]_\\MÎ —Ÿ_ž™ÉŒÍ,,¬$«ÀŠŠ²ffd/`r8==:FÑ „B¨‡°ö„PŠŽ~¹ys¨¤¤ø¥K+G6£:ްjhh¹s'õÚµ¤¿þJg³[œLwïž3y²µ’Öyiì:(}%±Pöê²aF.Ð:ŒA)©ÚS©'ÊœÍöî½Ábµb_?„D’††¢††bÛá jjšrrJ²²J²³K²³Kž?Ï oia€²ò ccuuu##5SS ìŒB >,ø"Ô'êêšú)<<ýÔÄÍÍvÊk%%Yª£!„z§.Þÿ ﮃÎT0[KuD±úúæÏ?ßûÉ'FGŽ,¢: BõPuuYÿ%‡NK{_^^m¦ƒ33Ód04‡ ÓVU•£:,B!Ô[XðE¨«²³K–, hnf=û¥åÀ‰¾µ•÷æÊ•7o¾¬­m²·7˜9ÓvÚ4uuìî‡0#ØPúÞÿ ïþ„êT—õÏÁä[ÐAu2D½û÷_{xœ:|Øg(E‰ ²œ’RHN—–ö¾¾¾þ[¶¶Ö57ב““¢:,B!Ô=XðE¨KââÞ¬XqÖÀ@õ?¾˜ßi%".îMXXü­[©µµM£G›ÎkïâbŽC¡!$ *žÃ_.ÐRòf =´'ƒúg82/jË×÷Ï€€¿££7™˜¨S!„øÅjÍÉ)ÍÈ`¾~]”™ÉLO/zû¶¼µ•#.N74T#gc04‡ Ó20PÃJB 4,ø"ôq¿ÿ»}û7·~~óิyye‘‘Ï/_~‘]b` :gŽÝ¬YvFFjTçBñOk#d€ö3¦: P,VëÌ™‡X¬Ö«W¿“••¤:Bõ¹æfvf&“œ.#£(3³¸  ‚ ii CÓÂBÇÜ\{Ø0mss-EEÐ !„`Á‚/B!ÂÏ/úàÁÛk׎ÿá‡)tú𢭠 "4ôYTTrf&S_°»»ý´i6 †&Õ¹B=Ep "Tì€6à>¸B|Q\\3eÊ~C30p9önC @uuÍäø¿iiïÒÒŠ^¿~_SÓ::ÊææÚÆi™›ëXXhc`„B”Â/BÄbµ~ÿ}È•+/üüæÏ›7’ê8ý¤¶¶éêÕݰøçÏóeg϶›>}¸½½á€*v#$R8-À¼‘ðî:4ƒËß >†êLHX½|YèævxÉ’Q۶ͤ: BQ¯Ý@À))ÍÍlqqºŽŽ29°µµž™™æ!ƒ©NŠBh`Á‚/B¼UTÔùe@nné¹sߨÙP§Ïµ¶r=ÊŠˆH¸yóeCCËèѦ³gÛMžl“T $¬8,(¾ ù¡PxZª`°è¹ÎtP´ :naañë×_Ü·ÏÝÃãSª³ „`!&‚HI)LI)(.®CÓÚZÁÐ43Ó°¶Ö“–– :,B!Q†_„xÈË+[¸ð$›Ý´ÂÌL”1àNÅvûvZMM#9›««¥‚‚ ÕÑBm°ëA¼›$¾Ú )ÛaðHПúsaоI†¢£GïîÞýç_¸»”¯¿ „PÏp»§¤dfgd‘]€ŒÔ¹Å_ìŒBˆï°à‹P{))K–œÖÐP<~¹††ÕqúJvvÉ¥KÏ®\yñî]¥……ÎüùS¦Xkk+Q !ÔAÙ#x´¦$ƒ¸\7îÕÄ„Ö&dг}Òh?¿œ Iss-++]kk=++]33M úû‹BHðaÁ¡ÿ‰ˆHظñÒäÉV‡yHJŠÔ,öuuÍW®¼ §b“••ts1w®=Nņ`# éGHÛ tP SSÿwcý[È †¼ ¨}³Þ”Z… Ñh½¯uÒh´ÒÒRUUU~¥êØ~dóóó7n܉ߎX¬Öo¿=÷÷ßÁÁß~ò‰ÕqBHÔÕ5gd¥¦¾õªðåËÂôô¢–¶¤¤ø°aZdñ×ÊJwØ0-»TA!Äwtª $(þþî» _=æØ±%"óŠÃ!=ÊÚ´)ÄÞ~ÇÖ­a’’b¿þ:?!aû¾}óŒ°Ú‹àjm‚Øyî÷ïϨNƒŠh*ŒƒmW‡@Æ!Й“{_í---íÍÝi4ÚƒôõõÏœ9ãëëkhh¨¢¢âîî^^^ÿ¼ ¦¦VVVFþH.´]æ¶ðûï¿Óh´¨¨(]]]•#GŽôòÐHIII...***222–––¡¡¡í’Ÿ..nþüùuuuRR9̆:tèØ±c·lÙ"##sýúõÕ«W×ÔÔHJJr÷réÒ%iiéU«V=|øðÉ“'Üû®±hnf/]œ\´bÄœ!„úVqq59\Û!€54¬­õ¬­u­­õlm‡¨ªvgЄB¢ ¾h ãpˆŸ~ ¿páÉþý_Ì™#ôó¹¹¥.<½zõEaa¥‘‘Ú_|2sæ]]eªs!„º¬6þr…ÆwÀaµ¿‰. 6{ÀðKêí\ÞÁÁÁGURRZµjÕ¬Y³$$xOÓÅ‚oXXØÜ¹s-,,<==.\ïß¿××ׯ©©‘••íJÁ—l\yùòe777‡#&&Ö•± >²ººZNNŽÛ733“Á`´Û¯™™™··÷âÅ‹àåË—ÖÖÖmÄ‚oçX¬Öµkƒ¢£_?¾dòd+ªã „ÐR\\™Yœ‘Á$KÀoÞѶþ;|¸¾ºº<Õ1Bõ7ùÞ:B=ÃfsÖ­ ¾q#% ૉ-©ŽÓsµµMþ™‘ðøq¶œœôÔ©Ãç̱st4ÆA2%±ð÷t`7ð¨ö´‚¸|﫽111‹/^°`ÁÅ‹‡ÚËÖHúúú››ëáááááÁ]_XXhffÖõH:::@§óm੪ª*__߇feeµËCî·  ÀÈèŸQhMMMùµ_“——Ç(¯åË­kkkV®<·ÿ##•~†øÎÀÀ@I ¿Ô=IIITG@ý„œ#T@hh(jh(ŽóÏŸ¶ššÆ×¯‹È.ÀQQÉû÷ßâpþSÿµ¶ÖÓÐP 63B¡~€_4p57³W¬8ûøqVPзNN&TÇé ‡ˆÍ ‹¿yó%›Ý:~¼ùÉ“_º¸XHIá©Ê»—p€hå½AÀ›c`²¼—ûÑÕÕuppˆ‰‰100ÐÐÐPVæÃ—È⬶¶¶¿¿ÿÌ™3€ ˆêêjž5#òÛE………[ ‘Ãþò‘³³³£££ŸŸŸ­­-AÒÒÒíö«¥¥•››ëääÙÙÙüÝ»ÈØ¼ysxxø‡o§ÉÈ ›3ç7üö˜Ð ™7oÕ)„Œ­­-ÕP?äïÈ*(È8898üófiiíË—…ä¿°°ÿ2d09ù9 œŠÊ J##„êXBT}}óÒ¥iiE¡¡ÿgc£ÿñ;˜gÏrÂ⢒kjG6=pà‹ ,¤¥y#!$2Áóõ©”¨L‚ª— Ô«oÍ[XX\¿~=''çèÑ£VVV®®®«W¯1bDoÚ$-Y²ÄËËKGGGIIiïÞ½ ‰‰‰äM•••äÈ JJJW¯^7oÞ®]»ºÞrPP“““¡¡aÏ‚±X,SSÓôôôÝ»w@EEEÛ‘"<<<|||ÌÍÍedd6mÚ{F¨Mš4éàÁƒT§@}‹Á`PAX8p`òäÉT§@}èÊó IDATæÍ›ëׯ§:E7¨©É7lܸaä,VkNN)9øÃ;i¿ýÓÜÌVP>\ÏÁÁÐÚZÏÆF_M Ç@!Q€_454´|õÕïiiEAA+„«Ú[RRö,,,!3“ih¨¶f͸ٳíp*6ÑöêÕ«‹/Rõ!:˜¢yûS•òGAhdéWŒN§ÑˆV 8ÿÜ!ë4Øêý~ŒŒüýýùå—ààà7Þ¿¿÷mþøã³fͪªªrrrŠˆˆ ×;;;[[[¿{÷NEEåСC›7oÞºuëÁƒOœ8ÑÅ–/^ØãëÉ“'¿ûî;OOO;;;//¯êêê™3g¶§ÎËË«¼¼ÜÅÅEIIÉÏÏ/&&æCƒ÷>ŒP“““ëâ @ZZZx‚ˆ6a¸CBBŒÁÐd04ÝÝG@]]sj껤¤·ÉÉÏýýcètš‘‘š¾þðáz:Ø¡!„„NÚ†œººæE‹Nåç—]¼¸rèP-ªãtIccËõëÉáá ¾QR’5ËÎÝÝÞÚZê\¨?„††ÎŸ?ßÚÚšê ¨OÐh°bT±“a-«•Vß"Ö̦×4ÑY­´F½‘E/xWìî±ÜÎÞ$äALĤAB$ä@aÕÁûF Ÿ3gN?ì+55ÕÊʪ´´tð`ÞÃ%÷gâîîaaaTA}‹F£á=€Û@@¾+Õ+膆–W¯ ÉñÛÎÿæà`4r¤¡µµ®••®ŒŒ$Õ1Bu öðEKeeýüùÇkk›®__¯£Ã‡a+ûAqqoÂÂâoÝzÕØÈš4Éê?–}öCRÏÜ'99™êˆ4mÄ";c(DGGóüª²§§§O_ïÝØØØÙÙù£›õ8¤……ÅÔ©S½½½ëëë½½½Ç÷¡jo×à „BBDVV²íø¿µµMééïÉúoPÐãÌL¦¸8ÝÈHýßÉßtmlôñª!„¾@£¤¢¢~þüãõõÍá᫼ڛŸ_ùò‹œœRkk=/¯Ó¦ WR’¥:Bhàš4i…}š²²²º²YC†„„¬[·N[[› ''§S§Nõ> B!$¼äå¥ÛÖ‹‹kRR Èο‡Ý.+«“34Tsp09ÒÐÚZÏÔTƒNçóœ«!„z ¾h ¨¨¨Ÿ7ïXCCKxøjmmô¶¾¾ùòåaañϟ穪ʹ»;ÌkÏ`hR !„Dœ¥¥åÝ»w©NB ( … ,&L° ,.®æþ°mÛ•ªª99©aôÉοÖÖzffLŠB¨¯aÁ %%µîîGY¬VÁ¬ör8ÄÇo‚‚ß¾J§Ó¦L±þþûINN¦ø!9B!„BHÐhh(N˜ HÖY¬Öôô÷IIIIo=Ê:w.ŽÍæèè(®gc£oc£gm­¯  Mud„X°à‹D_qq»ûQ6›±ZKK°ª½¹¹¥.<Œ|ÎdVmºw¯»««¾B!$2Øl¶„„Dii©ªªª`6K£Ñâããííí{|÷Ž+{Ó 8DéìÀa “³¶Ö³¶Ö[²d°Ùœìì²óïíÛ©~~7Y¬V ²ó¯ƒƒ‘½½Nþ†B} ¾HÄUTÔ{xœlii  joee}DÄóðð„””Õ¯¿íæ6BÀ‡F‰º2Ç0¢MLL,00P^^^À›MHH9rd»5vvv½cee%¹ ¬¬|ïÞ=àûñ"‘$,gGWà‰€¸ÄÅé †&ƒ¡éî>jj“’Þ¾x‘Ÿ˜øöüùGþþ1RRâVVz¶¶ú¶¶ú66úüüÀ!„ ¾H”UW7,Xp¼¾¾9"B fic³97o¦„‡'s¦í¾}îÖÖzTçB"H”: }èîWbU®ëúáʼ  à«¯¾zúô©¡¡áÑ£GÇŒCa˜»wïnذáÍ›7C† Ù¿ÿäÉ“) Cª©©155ýóÏ?EþIK£Ñ-Z$øÍÚÚÚrûL&sÁ‚ÖÖÖ]¹£’Òÿ>N–““kûcÐh4¾¿t#%,gGWà‰€>DAAÆÙ™áìÌ ¬©iLN.xö,'%¥0<<¡²²~Ð )sóÿýä#}ýÁÔF!Ñ@§:B}¥²²~Μ£uuÍ—/¯¥¼Úûöm¹¿´“Ó®•+Ï×Ö6íÙ3'!aÛ¾}ó°Ú‹úˆ°tJHH ý×óçÏ»rÇÊÀ½{÷Èe[[[~yJÿ‚¯Ì•””ÄÄÄø¸‹õë×KJJ¦¦¦N™2eöìÙuuu†Y¶lÙ¬Y³rssW¬X±`Á‚ÆÆF Ã|||JJJøÞ¬ ˆÿôÓOeee €F£•••±X¬M›6©««ëèèHKK'$$p8___ccãAƒ9::>|øl„F£µ]èV³ä­QQQººº***GŽ€¤¤$KKËÐÐж±ÅÄĸ¿}??¿mÛ¶IHHt<ºÒÒÒÞ<84íÁƒúúúgΜñõõ544TQQqww///‡?ÊRSS+++ã ÷ŽÜ•d ¿ÿþ{ÇcDNHÏŽŽðD@=¦  3fŒÙ¦M“Îû&5Õ'1qûo¿-°¶ÖKI)øá‡PGG[Ûm_~àï}ûvjuuÕyBHh ¿ªªúŽk&LðstüåÝ»JJ"‘šCCŸÍ{D[{Ã'Ÿüòë¯ÑùùeæAÂ($$D$_« >>žÍfsK·éééÇoiiéA;½SZZÚËFú„„„ôõ.:ǯ¬¬,--maaÁÍ÷ïß×ÓÓ;qâÄÆÕÔÔ´µµOŸ>-%%E68xðà7nQSSOž<¡0LUU›Í&¢¡¡RSS) CDVVÖêÕ«ùòìíOsçÎ;wîG7322Ú²eKQQQDDNg2™ä)¶k×.SSÓçÏŸ§¦¦:;;‹‰‰ÅÇÇ8p@OOïÁƒïÞ½óòòZ»6è³Ï|µµ7èênüì3ßµkƒNŸ~ðôivK ›êŒ!$4ðÏzOždåSPPÁ]S[Û4mÚ‡……ܱï°Ù­·n½Z±â¬Á÷Æýä噜ü–’$HtñÒâÙ³gŽŽŽ222C† 9}ú4ñïEQKKKÇ’Skkëž={ŒŒŒdee?ù䓸¸8² l»Ð­fÉ[¯]»¦£££¬¬|øða¢Ó¢X» ¯¿þ:22’çÑ•””|èÀ»xaIàöìÙc`` ¬¬ÿüóN>”êâËQXXAæææÁÁÁäÊwïÞ‰‰‰Õ××]«s‘-ð<ÆÎ÷ÞEXðí™®|ìØ±   “ãÇÏœ9“ÉdŠ‹‹:99w¡[Í’Ž=úâÅ‹¸¸¸ùóç/_¾|Á‚cÇŽ ‘‘¹~ýú’%KÜÜÜ$%ÛOÍœžžž@–SÛŠ‹‹;räHrrrzzzoŸŸ~úéÂ… ?>sæÌÅ‹ÕÔÔÖ¯_¿råJòr±+c’-ØÙÙ-[¶¬Ý1JIIõ&›€{úô©œœ9¦Á˜1cš››kjjÈÇjÆ £Gþú믽½½GŒGŽá{ª¨¨™™™ .ܼy³¾¾>…aHŽŽŽùùùçÏŸ—‘‘¡0ÌÇÝÝÝ Ôû ‚騱cëÖ­Û¿ÿرcW¬X1jÔ(r}AA‘‘¹ljjJ.äåå1ÿ ìH£Ñ:÷³[Í’ttt€Nÿg³ªª*__߇fee™™™ñÜKuuuDDÄÁƒÉcbb/^¼`Á‚‹/:´{ÄçBnn®‡‡‡‡‡w}aaá‡RñlÔî‘€Ò³OD i#£Õ«¡µ•“™Yœ˜˜öWddÜï¿säåizzbŸ|Òþ]%ê»ví¢:Bè#°…„[^^Ù­[©PUÕ0uêogÏ.?|øÎÛ·‘‘«ûs¾×úúæË—_=NI)Ð×¼lÙ˜Y³ì´µ{5[BÝRUU¥©©©©©9{öìòòrî0»gÏžíXr:yòä¶mÛœ`çΛ6m"‹VÜ9^¸ Ýj–´råJuuu7776›][[ÛIQ¬­}ûö­]»–ûccccppðÑ£G•””V­ZØËLJ,À}ûí·;vìptt$}}ý††YYÙ®·ÀóE»àÛI€¼ØþPA¡¦¦Æ××700Ð××·íÅ<%aH999‘‘‘‹-š6mZ/'êM˜ºº:òQ5iÒ¤üüüäääË—/þùç¹¹¹äz--­ÜÜ\òس³³É•ÚÚÚ¹¹¹Ü“«ªªJ^^žç ÉÝj–ÔnvGgggGGG???[[[‚ ¤¥¥;îåêÕ«Ÿ~ú©‚‚ù£®®®ƒƒCLLŒ†††²2>H&kRÚÚÚþþþ3g΂ ª««y>' ‚€ÂÂÂŽ-xÎ`‰–žx" ʉ‰Ñ‡ Ó6Lëòeÿwïnëë±Ù ,–|~>QZZ@uº¥ºº:?? ¾ >,ø"áöÇqâât«•Ã!Ù_|qBUU.(h…¡¡Zošmhh‘•ýøgÅAÄŽ z|ûv*F›:ÕÚÓsš““)Žo:QÒNC$ìR'È:©Ï‚B~~þرcedd=z¤§Ç·Ù){ª««É¦L™ÒÔÔTTTÔû‚oÃLš4‰»b½‰øNHÏ<@™0aBXXÕ)®ÐÐÐùóçS!ôqâb‰ªÚÚ¦  G,V+ù#A­­DiiíË—…ß±sϟ绯®®¹“m *üý£ÇŒÙ3þq&³zçÎY‰‰;ò3Æ «½ˆdïž°°0--­Ï?ÿüÝ»wäz²äD.·ë4ĽoUU9ì]/›%uì4”““ãçç———Ãs/êRwãÆÊÊÊ.?áö$ºrå 9¤9"Ïj/ö$j«m`É’%PQQÑv² ðâÅ‹ôôtnAáÇÌÍÍõôô”——¯ªªâ>Ç‚‚‚Ú>÷ú' Œ9r×®]ÅÅÅÇWSS#?® * w¢B¸wïž­­mïÔ€€€;wînÙ²%00pðàÁäz//¯qãÆ¹¸¸L:uùòå !!ñÃ?Ç……]¿~]NN/^üðáö Ýj–g°“'O9rD[[ûÿþïÿ–.]êêêJö+l+66ÖÆÆ¦ÝJ###ÿÌÌLGGÇ7òåQúñǧM›6kÖ,[[Û‚‚‚ˆˆr½³³³µµ5ù\:tè———‘‘·gWp1$€„úìÀ!„&ý:b0B|uæÌßzzµ´Ö·û§­½áر¿zÖæÕ«/È6ƒ‚u¼µ¡¡94ôÙ¼yÇtt6XYyùøDedàt¨ouqzƒõë×…‡‡‹‹‹—••@ii©——ƒÁxþüyZZš««+$$$øøøÅÆÆùùù 4¨¶¶–à5ñw·š%þ;U ¹¥––Ö¯¿þZ^^ž””4oÞ<ÈÈÈh·åÂ… ùå—vG”½qãF¯¿þúùóç:pèÚä0ä6;vì°´´ŒóæÍ7ß|cccÃÝ 33“\VRR:}útuuõÊ•+לN±í#Æ_ “¶]»vÍÀÀ@JJjÔ¨Q7nÜpuu%'gçÞ±©©iÕªUÊÊʆ††áá᜜¬®®Þîýw¦ r>Àþ CDllìðáÃ¥¥¥---ïß¿ÏÝ%axî¢ó0¢‹“¶uÅ«W¯h49q"õQ³ÂÂÃÃ{ÙNÚÖüzÜðìà‹ÞŸ<‰Ò¤m, xÍqÇs¥ààã_"Ô3¢t $ÚðDEŠÃá|òÉ/ZZ:|µ´ÖkimØ¿?¦[ ¶¶r<=#ɵµ×·¯í­OŸfoÞÂ`lÕÓÛ¸bÅÙ[·^µ´°ùz@ñÖÅ7Uwîܱ´´”––666¾xñ"ñïûuž%§––ooo}}}YYY‡{÷î‘pKNÜ…n5Kð*†~´(F„žž^TTÏ㪯¯?uêÔgŸ}ö¡ïVÁ·¥¥eëÖ­ºººrrr®®®ÙÙÙäÎÎÎÒÒÒåååAœ?^CCcðàÁAAA]/øöQµNèÊ.-(ôÑ8†é½¼Ì677ß¼ysMMMQQѬY³ÆÏ—T}Ôloܼy“g7 OOÏ~Ø»±±qIIIoZºWÑ›ÇM$Ïa?x¥R‡Ã ljjj· ¾¨s¢t $ÚðDEÂ꯿Ò?TíÕÓÛ¤¥µ~Ö¬Ã%%5]l­¡¡ù«¯Îèèü§ÁW¯ KJj޹ãì¼GKký¸q{OŸ~ÀdV÷éq!ÔßTa§¡¾ÓGÕºþ,»ôøÊ¼[….^cÁÔËËì—/_Ž7NNNnРA'Nä~âÒK}Ôì@†ßžéÍã†g‡°¥.,ø¢Î „³!Ñ€“¶!auäÈ]11Zk+Ñv¥˜½µ•3b„¾·÷ ;;ƒ.6UZZ»hÑ©ôô"ç­IHˆýôSDJJL™bíã3gcCÂÈÂÂbêÔ©ÞÞÞõõõÞÞÞãÆãí'€ÍöFttôäÉ“;®÷ôôôññéë½;;;÷õ^úÔ¤I“‚øøv„„„¬[·N[[› ''§S§Nu²qVV†éM¡fiiy÷î]ai¡þ„gêÒÒR5µÿMX=mÚ4òÍOII‰ŽŽNZZÚ¹sçÎ;רØ8qâÄÇ“oÛh4Zii©¼¼ü–-[.^¼Èáp¼½½Û5^UU%'''.Žu„2øÂ„RzúûÇÿsmL§Ó ‚cf¦±}»Û˜1>ÞÞÞ¾Oƒ‘%~þ>!…_$”~ÿ=V\œÎfs€F£Ñh ­­äí=}êÔáÝê„{çNÚ·ßžmia·ë)Ljnf«ªÊaµ 5ì4„B!$Jƒƒƒ=ª¤¤´jÕªÀÀÀ¶·Îœ9sÅŠ #$$déÒ¥{öìùùçŸ?ùä8t襥eMM‚‚¹}ppð¶mÛFMÞ:|øð¶­Mš4éï¿ÿ>qâ„ÝØ±c׬YãààÐ_Ê7bbbòòòBÑlï l0„P¢S¡n«¬¬ ‹'«½bbt•A¾¾îþ4}ºM·ª½ü»ti@Sïj/éüù‡|HŒB <4^0Œ@…A”¨ç†.111C† III¹xñâ½{÷æÍ›'!!Ñv…É“'GDD¼ÿ>11ÑÝݽ  ÀØØ˜¼•\(,,än_TTdföÏ÷#¹ méëëïÞ½;++k„ ß~û­0|i4Ú¢E‹¤¤¤„¢ÙÞØ`¡þ„_$|.]zÖÒÒ*&F—‘‘øî;—‡=-úTBB¬ë-±gÏŸžž‘ÑÉwÀ9âÉ“œwï*ù‘!„ˆ@]Qc˜®c³Ù4­¬¬ *O•ÿ€{÷î‘˶¶¶üÝKVVVWŠ~SPPàââ"//ommKm˜»wïZ[[ËÈÈ :ôC" áÙAaa?;tuubbbnܸA>PÍŸ??222<<ÜÍÍMNNNWW7''‡¼‰\ÐÖÖnÛ`ff&¹ÜÉU=ª©©qqqáÛÁô™øøøO?ýTVVÖÀÀ È¿ž,kÓ¦Mêêê:::ÒÒÒ Ç××רØxРAŽŽŽþÓã‡F£µ]èV³ä­QQQººº***GŽ€¤¤$KKËÐÐÐΤ´´´íÓ¦Móòò"—KJJ$$$Þ¼yãå奧§§ªªºpáÂòòrnø²²²æææõë×khh¨©©:t¨]ãUUUl6»W4BH€á"ÎÓÓ“ê|FÖH£™™ØðáâUUq{÷Æu«…ÖVøûï–¼<6Ðhä?A4F#8ÿçKÄŠ{ll$:k`×®]=:„øFãÑσ‚aÑÀ½DTVV¾wïž ð÷«K–,á~Étêԩׯ_§0 ‡ÃY»ví¹sçtuuÿý÷Q£FQ&!!aäÈ‘íÖØÙÙuñîÂõ%M%%%œ\Ûù%??Ë–-fýúõ’’’©©©ÇŽ›={vnn®œœUa–-[öå—_®ZµêÂ… ,`2™228D•Á³Ï޳°°¸~ýzNNÎÑ£G­¬¬\]]W¯^=bĈ¶ÛLŸ>}Ù²eGŽ9qâ|ùå—¿üòËСC×®];mÚ´¶ìâÅ‹wîÜÉ`0ÔÕÕ7mÚÔnwÍÍÍaaaÇoiiY³fÍ„¢ßè‚ ÜÝÝ/_¾üèÑ#ww÷éÓ§“ëýüü¢¢¢¢££¥¥¥W­ZE–;>|ìØ±   “ãÇÏœ9“ÉdŠ‹‹:99w¡[Í’Ž=úâÅ‹¸¸¸ùóç/_¾|Á‚cÇŽ ‘‘¹~ýú’%KÜÜÜ$%%;ÐŒê%,øŠ¸Ý»w2DQQ‘ê |ÓÒ¢Æá(¨¨¼-+cõhQZ}½!‹¥ %E|ÙÞJÞJ£Üÿ94A£µæå± k?Ô\uuu~~>|‘àè‡Údee™šš~´ZÚa ¾úê«§OŸ=zt̘1†¹{÷î† Þ¼y3dÈýû÷Ož<™óW?\Qgee…††N˜0Ú}Û´ÿÃyòä¶mÛœ`çΛ6mî\îB·š%­\¹R]]ÝÍÍÍf×ÖÖ>}ú”|úÀ˜1cš››kjjÚ΢†4#„ø†@" BBB¨NÁO ÍTGø|šüì IDATø0weiiiÇ„•••,«ëØsçÎ;wnîøÑ“Á`¬\¹277—ÉdHII577“w5jTll¬———©©éóçÏSSSÅÄÄÚ6Èß—£‡!¿KÄÓ§Oétz~~>…aHL&óСCÚÚÚÝz9½wý£gžý†Ô³³ßùS®‹‰.]º¤¡¡¡¯¯ÿå—_>|øø÷¯§´´t\\¹Mcc#ù4“‘‘‰íÊÞ»Õ,yë³gÏÈõä–yyy[·n3fŒ––ÖgŸ}Öîoztt´ššÚÚµkÓÓÓ?”aÖ¬Y»víz÷î¼¼|mmmÇ]§¦¦¶ Æ=4òVrwí455?ÞÆÆfäÈ‘}ð,@HXà‰*âð-{_Ã?x¨¯õ]Á·Çå*îG†|¼†ìq˜Áƒ߸qƒ ˆššxòä …a¸´ Ü7ܽ!ßž]QWWW€ƒƒF344ìâuTß]Þ+**~ùå—âââúúúÿý7µaHiiiÖÖÖÍàêêZ\\!..ÞÔÔD|¸à{óæÍ!C†øøøwå{ ï ¾Üs‡ ˆŒŒŒ¶ÇF„©©éùóçÉ RRRÚ5Èß—£^†ÉÈÈ066Þ²e‹ „100 Ñh] Ó6¾{ì>*øâÙÑGazvvté]§•(ºEÄÍ#Òöu«qÔ]üKTUUÕÔÔôôéÓ­[·JHH“Ô•––ré¯^½"ŸÆÆÆÜ§ A•••ܧVoš%þû4&·Ô×ן7oÞ“'Oš›››ššÚýMõêÕÔ©SÍÌÌüýý+**xf¸té’ÝÁƒ/^L„‰‰ 7|jj*TVVrwgbbræÌòÖ—/_~¨à›œœ¼råJ##£üñ£-^ÿ"$,pH„ :Dì§Ÿ~ºpáBLL ÏñÈ‚€ ‰Ûÿa²³³ÉqÓÓÓétº––…aÈñsŠ‹‹CCCµµµ {†r|÷pÆ £Gþúë¯;~‘œõÅÊÊ*::zïÞ½ .ÌÉÉïí»Žž…€ÚÚÚŠŠŠÒÒÒcÇŽyxxP†´oß¾µk×~t/í¾ ÚÉȉBýÅ̪ª*__߇feeµ›#^__ ŒŒŒÈ5¦¦¦‚¦¦¦Æ××700Ð×××ÃÃÚ0¤œœœÈÈÈE‹µ² <;ø†Ô'gGý[ÈùÞœ€¦bÈõí¯C°ë€Ãq9 óÙ©(êßþ³MÛÿÍÖ€’íãæóöÞ±°åÞøîÙÆÆÆÍÍmË–-öööAHKK“ë=<<|||ÌÍÍeddÈ‹i4ÚW_}µ}ûvCCC“   íÛ·3™L99¹   '''CCCîB·šåŒÅb988˜šš¦§§ïÞ½***¸C:àÍ!>‚/B P½,W H²Æš™™¹páÂÍ›7“×xT…!9::æççŸ?^¸&ùž]Q1‚ø·3ø–-[öîÝ›››ÛûJD/ïeddÖ­[§¤¤´fÍOOOjÃ@uuuDDÄÁƒ?º Óé]‰¤¯¯¿{÷îmÛ¶…††~ûí·Ïž=ëâáPËÙÙÙÑÑÑÏÏÏÖÖ¶í%4ü{ìZZZ¹¹¹äœ9ÙÙÙ&??ìØ±222=ÒÓÓ£6 TWW“¯cS¦Lijj***‚¯Â³ƒ¿a /Îv=äCæ1¨JºpXt hmìU³”«L†¦b`UCk´6«Z›]†K@‘רÇϾæÿ”nIΗA×Çö¹ÁðþOtÉÿüϪæÇxhŽ:z¦+ÙÖ¯_âÄ ÀÀÀÁƒ“ë½¼¼ÊËË]\\”””üüübbb$$$~øá‡ææf²²2KKËëׯ“ /^hhhÈ]èV³<ƒ>ÞÞÞž’0ðû￯Y³fÏž=&&&aaaä“¡—a µ•óèQVdäó¨¨ä††f ,øö5<;øørv4—Böï}jßü¯Ko{h©‚º`×§å?ÿ«:‚,¯7-¡ô!íí‚Î4Û'{Bþ¥ÿ¬! ¬Ÿ æ]ð•Ñá]åY½Ç?ÀáHvùŒîL€™]ݘ"S§Nõöö®¯¯÷öö7n·—®6‹B½ÒÃ#*@÷§ {?ñͽ7øØ,t:‡C_„ïD·­g³[û4 I}7i›––Ö¯¿þZ^^ž””4oÞ<ÈÈÈh{G///ƒñüùó´´4WWWHHHøPû999ýæ‹/¾€àààÊ‘“lP† SSÓ;v0™L555rŠ­ÎÃt®¯áeψ–ªží¢óGãÚµkRRR£Fºqㆫ«ëСCÛÞ±©©iÕªUÊÊʆ††áá᜜LÄ£G¬¬¬dddœ³²²¸»ëd†œ¾ SWW7cÆ iiéQ£F‘¿M á§§ÕnwÃ@‡É^Ú-´M¹páÂÇw’¹—zÉË{Ñ Óc½/øÞ¼y“gÿOOÏÎïhnn¾yóæššš¢¢¢Y³f?¾“KJJ0LÃp_y8ÎÓ§Ù^^‘žZZôõ7‘u^î?,ø¶ÕË‚¯@=0 o¬Ú§—V_ÙÄ%)"˜N\”ì¬à ÄÝ DyQFÔfEDsÑÊç+¬H@>z顈ܡÀUÄõò­§`ê¼XSð­®n¼tééìÙ‡ut6èênÔÖ^ð ß‚!‘! oªª\5pÂ|ð5¼±ˆx}€¸aKqQüŸ ËšŒží…$@WÔFPQx™-P§D> :tÖÇ'ÊÖög-­õC†|߮΋_ž¨z×-òOH óÏ»2›(‰%¾#"4ˆ` .I àÛÙË>ê,øRN@®MB…cø"ˆÿî»ïȾr^^^ß|ó F+--UTTܺuk`` „„ÄŽ;Ö¬Y7bĈ}ûö>}šÉdZYYùûû“£XÒh´ÀÀÀE‹qºÕ¬½½=F»víÚªU«vîܹfÍš¤¤¤ï¿ÿþÅ‹ÆÆÆ?ÿü3ùÝꊌŒÜ½{wUU•‹‹Ë±cÇÞ¿ϳv —-[¶wïÞ“'OVWW?þĉ=z©¶¶éêÕÄK—ž&%½¥Ói­­A„¤¤XZC¨÷¢££¹3B´åéééããÓÉ»5™±±±³³3†éq˜.i*ü‹s*“€&€ÃþçÖÓ}tˤI“ˆµ²nÝ:mmm‚ œœœN:ÕÉÆYYY¦7a,KKKrPA ÂaX¬Ö ž Êûõ×_Éf;6bĈÜÜ\==½Ží´Kèèè¸cÇGGGò0õõõdee;ßA’’Ú?þ~ùòóÚÚ&11:›ÍùÐÆïßW¥¤|4?Bm•–6RµkÑ,äñC?…!8Ÿ {ÎIˆüصÿëÒû!¯ýA²CGci ºÇÆïáåëe´Ájõ ðbõ*ÖçÃÓox¬4> à±¾.âx}‡CÎF‡òX_ûîMâ±^ÞÆFóX_ónâ±^a(L|Äkû øÓ‚ÇzEs˜šÊc}].Dóê!¢hS_ñX_ŸMèÆöM%´•Çz…¡¼ ¾ìz`Þá±^΀WÁ—Fç±€ªO…44êë7nÜêììzýzrDÄó””:ÞÚÚñC&PV–]½z|ÿ‡LkÖ¼¥:¢”òpP–?C}>^…‚p`ÕR ¡~Âi%š*Ø-õ­JÒ}º#Æ-8ô©¦¦&###¾7K~é¹÷Ý“ê ,ø"8vìØºuëöïß?vìØ+VŒõÏ%qAA÷5ÎÔÔ”\ÈËËc0ä2FSRRâK³$ Óÿ¹ì¬ªªòõõ}øðaVV–™™Y×ÈÄÄ„\:t(¤§§Ÿ·OŽ(f°&M’ݸÑaãF‡²²šøøœˆˆ¥¥Õ""¤Ž¾ßCqñûϱ4ÉdΜ9“ø•ÍfKKKg‡S-¡Û;<[[Û   KKKÇ)”~[XTT¤¡¡/^¼À0ÌÃÃcþüù=ëé–PDDä·ß~[¶là8^WWǧ9› ¡!¿m›‰—×Þÿûäo¿e×Ö6‘É¢íí}u·s§“›}€Aüq+%EØ!¡P»ä{ˆúi¥J~‚wÞg?ß¹ Û[§Ô^õÕ Ù—Á6J¨=lå)*½7ÈöE\ L|Q¾¯⾈JõÞÝ—¾¸û‚‰ôÙÖ<ÔÖÖ òòòÉÉÉS§N€‘¸ “ÃáÞ¸qƒO“Ð(„ñòòb0ÄòâÅ‹¯_¿.Ä0;vì¸xñ¢††Æ… xß»¦¦Â¶mó¶nuÌÌdþö[öo¿å°ÙMbb¢|ÆöEú…®!†àÕѾ¾#D†'!!¡[·!d„Xˆ9š“çÈ‘T( #ò÷wÒ8¨¬Pßùô—Êμë{R ÃÔ¬ÿ$&”"qçuÅ ŒŠŠŠ•——÷ööÞ¸qc\\Q쫯¾úå—_{&9uêÔùóç» ÙµZŸ(é 5ø"0uêÔåË—ûøøØØØtmõðð011‘Ø·o`ö¯ýëàÁƒººº,//§R©öööººº¼…AUÛk°ööv:nhhXPPpôèQ¨©©È“ãÎ;‡a˜···››[jjj¯õtK¸yóf???uuu99¹ãÇgeeåääô{, ÃÚÚþ:rdåáÃ+²²˜ññyW¯fÖÕ5‹ŠŠp¹Ý;ÊÉËKike"8äC&+Ûÿ¸Õ]©®1(Ìðu`â åZnÐVo¯Cñ¨¼ $Qèlï^tx“¶!ˆÀuýÞ”J¥öû5êTVV =LQQQLLÌüùó€L& 7̉'ÒÓÓsss/_¾¼aÆ‚‚‚aVˆa®G§ë:´"5µ0.îÑEDú éº:„FàW2š>ýôSâkdtP^·HæIcíÿëà…&Š‘;Ú»¿íÄq\Íš*ðB(’páÂ…¯¿þzúôépòäI333‡###{öì™9sægŸ}Ö3ÉéÓ§‡0\$‚ŽLhͿ̟þiffF¡Pôõõ/_¾LìÅb±ZZZ¼½½åååuuuccc //¯­­Íßß_KKKRR’N§'''óÄ`0º. ªZbkff&¯6‹¯££#..>cÆŒ›7o.\¸pòäÉÝJöú###ÕÕÕååå=<Å0¬ªªjøUBµ£‰ÏÛ¾ººæ¨¨ôU«BÕÕ÷hhì¥Ñv£_d†üÑbàð†æ‹/¾àgÈ!³³³‹‰‰!Zo„æ?ÿùµµõË—/:D|±4Lý<‡W?³÷áWUÿnðÍþ„‘kð566Þ²e “É,//omm%vœ1cFjjªŸŸŸ¡¡á£GòóóDDDxúøø444ðéhhaêêê€N§c¦««›šš*Ü3#++»nÝ:QQQ--­»wï$L×Ty÷ø¡¡_tuüÌ çê@ ¾È«ì~]ÄÂÇç¦õÞæ{Î&;võ³¿²8ÜÖNÁ—Íf·´´¤§§8p€L&¿yó†h3ÕÕÕ%ú™á8þôéÓ® ¾Ýº‘iii­ZµêáÇ­­­---ƒmð500¸té±2??jkk»îÞk}}ýß~ûXÙÙÙIì‚£_dt¡û°>™ššîß¿¿¾¾¾¼¼ÜßßßÑÑ‘ž|,T›€õÆÏÏoø EF†âîNŽöÎÉùöÛo—OªÝ×à"¹¹¹NNN fff11ïGhÅ0ìÎ;ZZZaaaûöíSQQQWW§P(YYï§*..njj aŠŠŠ,,,¤¤¤ää䤤3XÞÃÄÄÄìß¿_[[Ûßß4nU°ËïÁå/pº†[@¤{W/ÒÓÓCBBtttTUUy·[›ˆû%£££‰û%MLLBBB::Þš”––æææ&¨k8aŠŠŠÀÜܼººzÕªUkÖ¬é:žà(‡€úúúšš‹õùçŸ{xx$ "èêl˜¸W—Ë%zÒt[ßëÊní†a¼7‡ÈĦa'ãþ›©…§ †©Ç >åm×7¿¼4'ïæÖ—¹?•W>iììÀhcS§N=pà€––V¯Efgg | H///¨©ÄD¸ëÖ­;|øpfffaaáŽ;–,YÒm¨™^“xyyùùùeeemÞ¼yîܹ¼ò¼‘Êd¤¡_¤OÑÑÑ=¢ÑhgÏž;Õ:;;÷ú F@@€@B –²²ôgŸÍºqc÷ºuöÂ΂ ÿ³zõjCCÃìììW¯^íÙ³ÇËË«­­ØDLAðæÍb ‚Û·o3Œ®ŸˆÎ;wüøq¡‡áp8,ËËËK\\\OOïÞ½{B 7oÞ”””ÔÖÖNMMH˜þa$Pq€i§AM`‚ŒWl6ÛÏÏÏÁÁF£mÞüéõ´´´ ¬¬LOïý´x]çêihh°¶¶ a¬¬¬p———÷ññ)++ãMW;úa@BBb×®]rrrÛ·oTD(ÐÕ!Ø00q¯ƒ1Sÿ!A”B¢ïP_zÞHj’8Iä­«øÇ§ ]cLè;ÕÉ"/Uü¾þcîã?}J†yÐððð?ÿüSWW×ÇLJÁ`ðúŠùùù9:::99-^¼xÓ¦MÐ÷øàaaa!!!4mëÖ­ëׯ_¸p!1Oûùøø¬X±ÂÅÅÅÎÎNEEå§Ÿ~êV ×$_~ùå’%K\\\,--ËÊÊ®^½Jvpp°°°T‹3‚ š´ é“™™YRRÒx©v\@s› c Ÿ øLA#Öihax†Ž?¾fÍš’’QÑá¾´ ùÌð: …††zxx$ ‚|lmmƒ‚‚,--»ö߉jjjL&ÓÞÞŠ‹‹y[yËÓ¦MÈ4ŒCÃf³eddˆ2 ¹Y†FOO¯µµÚÛÛ ç`‚Èx®‡™¨W†ak×®v dâSýˆêzeJöÙw/Vb"ÐÉÅ@T’¤h$‰‘@^ŸbºZïÄ«ž7¿Ëªoa·ý¼yóžÒPƒ/2ÒF®ÁWMMíû￯®®ÎÍÍ]µj{x;úùù?zôèÙ³g .€¬¬,¼GKÑFÆ`0JJJF?Œ¾¾þ¾}û^½zµk×.b2!†!ú—””ìÚµ‹è}Üoþ&üs¸|[lV¬X±hÑ¢ÒÒR%%¥úúú‘8Êhrƒ¯`=}ú”èÅÖWˆEa†fÂ?óŒ±pÞ&ä?ä˜ ÓË»²N.Î)ÄË~Çóãþ…ߴ£¥ðHxÿSqg ñšššÎ;7uêÔ9sæDGG·µý£å«®®ŽB¡<þÇq‡ .^¼x‘÷Р®®ÿûuSWW÷üùóÄÖ¼¼¼~_j“““‰åììlPRRêY9Ÿ#v{ ---ýòË/544<==ÓÓÓòð‘ñ®2¿‘ýªy°{µ6p_Ýaßÿ¾,ÖýÙYëGg­]q{ö:­n$"ȇ 5TMpcá­çĆ|‘‘6r ¾¨ÓÀà §ÓP_QÇÚsxeee×_/^ìëëK,WTTˆŠŠúúújhh(**~úé§¼O×ÄΖ––]»v©¨¨())8q¢ßO¡aaaÚÚÚ²²²+W®¬¨¨hooïYy¯+qÁ5øæääÌ›7O^^žB¡˜ššòþ"’’¢©©yæÌ™½{÷*++Óh´sçΉ‹‹***Þ¼yÇqbâø‡öfŒ~ƒï­[· 7¼ÿ¢¾˜˜˜|ñÅçÝ»w...óæÍãSX__¿Û?* 3¨0cð™g\æySÿ(L_b£.Yêþê<Ï¿»×Ç}ß¶{Yÿ…ô¿¦^â§µ¦ß:”••wìØQPPÐW—#G޼}ûVZZº¾¾žB¡Ü»wØÔÜÜ ùùùøß/µ %55µëVþ/µ¼’šššˆsÛ³r>Gìõ5´¥¥åÒ¥KS§N6mZ¿gAškÚ‹oפ-e=kv™8PCÕ‡Þ² VssÛÛ·µ¹¹¯“’žÅÄdœ9“¼vm¬ì|° ¾·²:¨¯¿ÿâÅ4aÇD&”1ò¥Â„ì§3öÃŒ©çðñ~Ÿ)Ÿ£ð/fll¼eË&“Y^^...ÞÚÚJì8cÆŒÔÔT???CCÃGåçç;88ˆˆˆCâ8žžžN"‘JKKû 3Æ ±‡ï˜º_r‡SÏ<㈰ÎÛ„ÿ‡CaÚ /Üv‰hÌ%ῈtoÞíösUu µ>}útñâÅFFFÁÁÁ55½7GEEY[[Ÿ8qÂÓÓÇqƒK—.›òóó ¶¶ÿû¥ÖÀÀ€×טíj€=|srr0 SUUíY9Ÿ#öúš——·eË==½/¿ür 'Aø+¹];„NÄòÃp¾S"ã†a“&M¢R©¬³£CÃH¤&Ö9fá8¹½}rg§\g'ÇÉÿœçÇÞ_@Æ[{ïÞWzzÊ£ž™°bbbÜÝ݇ó\À›Ž¶+__߀€>;ššš.^¼Øßß¿±±qëÖ­çÏ?ÿì«°Áƒ”•ûùçGaðèèhbX ainnŽŒŒ€ÇôÑG,KII©×Cc–œœˆó‹ ½éäâ—?mªj§ª‰iØÊhØÉ¨Ó¥Å¤E„ AÆ:Qa@Fÿ6‹AárñçÏ[?nf³;fÍ¢š›SUó×ÚŠß»×ðüy+†Á?ÛÜ0ǺVR’F­½ÈXãìì<´öâèèè]»vÑh4ÇíííÏž=˧pQQ 3œ0cSbb¢§§çêÕ«/_¾ ˆâèUUU=+/++ãsÄác³ÙiiiEEEÝ2kii@YY™žž±ÆÐз•Ãá2ŒÀÀ@AåAA„èù_s :2·Am6@¯ï%HbÀ­‡œƒÜG ÿÈL¹—bÓÓÓ >|øpddäÞ½{SRRºn•””\²dɃæÎ >>> ...ÍÍÍ ,øñÇ»>pà›Í^¹regggppðüA¬÷ôôd0Ý|`ç΋-jjjúøãCBB¤¤¤zVÎÿˆ<7oÞ¼uëVpp°­­-Ÿ‹ ƒBÅÖÜ2¯*hzó€óæ!§0¾ÇAÅ\RÛAî£õªÂN‡ cjðà|}}‡_IqqeXXÊo¿e‹ˆˆ¬];ÇËk†¦¦Âð«_22J¶ox÷®®££³¯2d²È¼ySF3‚Œ(33³¤¤$a§x… :ž˜˜¨£££ªª*//ß³Œ»»{PP•J]¾|9•JÕÐÐ())±··€’’ Ñh]+,,,œ9s& ¬)¼¨¨HCC^¼xa˜ŠŠJÏÊùqølmmƒ‚‚,--q§Pþ÷}'‰D555&“I(..&6•––Î;WBBâþýûššš̃ ‚Ÿâtp΄ױðh'´°ïè^ ³ Ää < ^üm@9³÷¿º^ ÖËë)HJJnÚ´iÓ¦M=7EEEñ–Édr```ÏGx_cÿç?ÿùÏþC,7 $$$zÝeÍš5]Wö¬¼ß#\\\\\\z}h2 ”M%•M%-7Njkìø+³þÍNÝëaçB1Ôä–šZ¸n]øìÙýõ²Ì̯}}—|€­½@§ëݹs`ýú™†‰ˆô~áp¹zzÊ|Z„AÆSSÓëׯߺuëíÛ·æææ6l ¦ðîjéҥϟ? Y¿~=¬[·îðáÙ™™………;vìX²d‰œœ¯°§§ç¡C‡ÒÒÒ^¾|¹oß>Þúˆˆ&“Ù3Àž@ííít:ÝÐа  €8¢¦¦¦k€€€ììì‚‚âAaöå—_2™L___iii6›Íf³;::†éëMVV–°s½Çår‰1¾`LCó—Ïx€–,-3? ‰Ö­+Sâpo„ÅOÁî"¨-„V<ÿpá|XÐ××wppÊ¡D€Ä¤DtæÈÍüRËákí^ ´r:¸-è#9‚ _¤7ííW®d.\ìî~º¥¥ý§Ÿ6ܹs`íZ;*õƒƒIBBìða—Ë—?WR’îµÍÇñãÇo˜˜øzy;}:9/¯ 5þ"2÷™ÚÚÚîÝ»·ÛVâ>ÓÖÖVÞ}¦+V¬pqq±³³SQQùé§Ÿº>pàÀŠ+V®\ioo¿víZÞzOOÏ´´´ž‡&î3uppÐ×× ëµrþGäSù…………„„Ðh´­[·®_¿~áÂ…Ë–-ëZÀÏÏÏÑÑÑÉÉiñâÅD·,2™Lô÷ððÿ[NNÎðà ÝÔþ ’““‰eKKKAÕŸ••Õ­9ìÑ£Gß]DD„Á`HKK *‚п|Æ QI0?Ÿƒ¶;ö¿f_’È`¢ k ګᣣ0û,{⊽ԃw@‚ ¤­gð× h|-ð¤EEEC›QAÆ—Ç+~ž•·öyÆoߦ×wv i«š´ ù6»éüù» ÆýÚÚ¦eË,7mšmn®!ìPcN}}ËáÃñ‘‘ED0.÷MºZZŠ×®ízø°85µ0#ƒYXX.!!ff¦N§ë98MŸ®'&†QAm°“¶aX÷¡¥` SW„1fà8Ù×è$ù@¦Â0,66våÊ•ã®ònòóóÍÍÍY,–¢boŸçG7ŒÀåIÛFè²íè訯¯'–ËËËW¯^™™ÙuÞÂ;O,ýúpžyküž·±ùŒý¼+«H†G» î)à²&°øé ªn¯‡§‡€ýØO ù€˜È™ƒ",¿@tù`4×pߦsÞ<à¼yPß\Ó.©LÖ°“Ѱ•Ñ´—£¢©Þêዼ÷òeÅþý1Ó¦:>ÕÓsFFÆ×'Oz ÖÞ^IKS¾ûnUdäfEEª¨èû× 11GÇÉÊÊÒK—Nýî»U))>¹¹‡þûßO'ݾïî~zÊ_w÷ÓÁÁ ©©…íí=ÆùBSvF: 2aŒè}¦¬öÀH ¿´Ü¡aÏöâJ êªŽüÊT$C²3Hiƒ¬ (Xƒ¬)Èš€ÌÀP.ùiuñÉ+Ä'¯Pâ6wŠˆ£«ù° ÿøWk+7"âÁ‚ÁëÖ…ÀO?mHI9°v­jí8©3gÖ……­“–¦€½½A_%UUeˆž¿øåäüá‡Oµµ¯\Érw?=eÊWîî§OJÊÈ(A=‘Ñ4 ý݆¦³³300P___JJÊÖÖ–ù´×•ðÏnt]gIŠŠŠÒÐЖ–þòË//_¾L£ÑdddxÓ…õºŸHÄ ÊÊÊUUU\.×ÏÏOSSSIIiÍš5ÕÕÕÝNà… ˆ5³ò733³¤¤¤úúú†††ÄÄD===a'Bz‘žž¢£££ªª:kÖ¬ÖÖV‡ClÚ³gÏÌ™3£££ýýý­¬¬LLLBBBˆIöx¾ûî»;vô{”-[¶¨¨¨,_¾œËåònf³óÝ»w­­­½¼¼222†óèdDÄå3Á/²4ÈðýL²&@?êK€Û…!poÜ0ƒ_'ÁãoFö¸2>‰Jzý6¤½©ãÚ†ÂÜ åÕ/šG=‚Œ,ÔÃ÷CTSÓøÓO©—.ÝçpšÝܦýðçffêÂ5Ž-]:ÕÎÎàüù»ŠŠÔ”WU•íÒó·.#ƒ™šZxéÒý#G®KI‰[Yi;8M›¦ki©zþ"#jtú» 'ÌéÓ§CCC#"" NŸ>½lÙ²òòòS§Nõ\)*ÚçËYddd^^^JJŠ««ë¢E‹žè èoü߯Íû °µ(-•@1…ÑI‡ ãE[}‡¤2ù1£"óÔ_RªbZ3e´fÉÒ¦I‹RPçHdÜC ¾–çÏß…†þ_||®””øgŸÍôô´WQA3G €’ÕÇçã!ìØµñ·´´:#£$3“yñbZׯßY³ŒÌÌ4H¤^&¿BáHOO§R©"""Àë°CŒT@tØùì³Ïˆ;Òmè†öwN˜°°°o¾ù†ðôСCûöíéu%Ÿš÷íÛ§¨¨èââû÷ïç-×ÔÔðoðås~.\øú믧OŸ'Ož433ãp8222ð÷ ä•$ú19sÆÚÚzîܹ۷o§ÓéC?Y‚ žƒƒƒ­­mPP¥¥%Žã …·‰hŸUSSc2™öööP\\ÜußßÿÝÎÎŽ¸ºùëu¦Jþ^¼xqÿþ}‡ãîî>Ø}dtŒèåƒ.Á  ÔöYàÙqxþ Ë‚œÙûñ¬A~*ˆ¨Ã ‚LTRªbóuñN¼âqcY§,Sðk•¨ÉÂKÕz‹š°Ó!Ȱ ß1PoHHRf&ÓÈhRPЪeË,ÅÄÐ_lÑÖVÔÖVts›]úéÞ‘#שTqKKÔø‹ØèôwN˜W¯^ˆC÷º’*• "íº<´H]•••éëëËÄ›7oLLLàïØÕøíÇÔkÖHÌçŽÂ #ª½½N§=zjjjº~…ãáá`bb"!!AŒúÂû'&&Κ5«kmöööºººCÎÓÚÚzåʕӧO·µµmß¾ý¿ÿý/ŸD¸{ùÐ%0ÚÌüAã¨ÍƒÚ\¨É‚’Ÿ¡³ Hd°»ÚŸ ;‚FÂ&M¥NšJ¶ÖTÕþæ>GRYcÖ!ˆp¡&¿ ®¹¹-2òáÏ?ßc2«œœL¢£½gÎ4B÷d”ñ;;ñgÏþº¿(-íå?&9r}Ò$Y{{Ã3ôíì ttдQÈÐN·á„¡ÑhL&“×U–ÍfKKK÷º’è‡K̸õæÍ›Aº¯½øœ‚††FII q~JJJˆÀĦ¾Ú”Çc?&Þ}òòòÉÉÉS§NiiAÞ’””´gÏž—/_jkkÿðË-b‡Ã144¼qãŸÖÛQãååÅ`0ˆåÅ‹_¿~]€•hÂÂÂvîÜéëëkmmíççWWW·lÙ²‚‚^??¿êêj'''b€òÄÄDÞå©©©Ÿ~úOOOƒ1œß›7oÞºu+88ØÖÖvÈ• ÈèìåC@—Àh“•Ù 2ûý¯íÀ)€Úç§¶¶VIIiݺu‡ž–.]ºtéRÞ¯¼ïx;Š‹‹‡†††††@~~>†aÄ€¼ðúõëžöü/íš·ÜsàââB /ƒ B7ú— K@èHd³9‹> äú@Í# ¨: g²æ oræ mؘhC¨¯¯/** vETTÔ»wï„Bø÷”4–·iØÉhÏ–Õœ)#.3&.éŽL8Ïž½Ý±#BKkŸ©©ï÷ßßb±ê…<.·#7÷uXXÊúõᦦ¾jj»§Lùjݺð3g’³³KÛÛ;„˜èèè¡=W@ff&Ÿñññ:::âââ3f̸yóæÂ… 'OžÜuÇ––oooyyy]]ÝØØXÈËË#öÕÔÔ¼víZ·Ã1 Á†ikkó÷÷×ÒÒ’””¤ÓéÉÉÉ8Ž÷ºÇñK—.©ªª***FDD‹ÅêvÜ^—ùìÕ×ùqpp P(ÕÕÕmmm>>>êêê «W¯&öíõÁþúë¯kÖ¬yðàŸ3Ð×y‹ŽŽì^#¤ß?bNNμyóäåå)Š©©)/9¤¤¤hjjž9sfïÞ½ÊÊÊ4íܹsâââD…l6›Ëåâ8ÞÔÔùùùB ƒãxQQѶmÛú=Ä(„QVV~þüy[[Û@bŒWWWWWWa§èÇ­[·z}ÇëëëËG“/¾ø‚Ãá¼{÷ÎÅÅeÞ¼y| ëëëWVV 4ø2¦žyÆ‘ pÞFçò׆ü®l\jz‹¿»?ÿ/~ß¿eGQðHÀ_ ;Ö{Ößb ïFA3»½ðZõŸûK~š™{ÖêÑ×ü¬3±ž5âÂN† = §È‰ƒËíˆÏùä“jj»çÎ=“ÑÚÚ.ìPÈ()/gÇÇç|ñEôìÙ4ÚMͽ \ûã§lv£°Ó!Ã2FÞÎ>}ú𪪪¾ @llìhFúŒ©æƒ~›5·lÙÂd2ËËËÃÃÃÅÅÅ[[[‰g̘‘ššêççghhøèÑ£üü|‘®–——ŸoÎå3FÞ• G{^•Ž÷Õ¬• ý+^_ÔgAû ÿÂ0±ß A[#·ävm²?óÒÜ<†S^gjñEÆÔÿ|"hjjûå—‡.¤––V;9™üöÛ:ßÔóÈÄ£ª*»téÔ¥K§‹UŸ›û:#ƒ™šZxúôÿa¦¯¯B§ëΚedoo¨  %ì°ÈhKHHèuPT___þ÷Á™šš.^¼Øßß¿±±ÑßßßÑÑQQ±Ï­ôõõF. 2ö¥§§S©Tb<åY³fµ¶¶r8bŒ={öÌœ9ó³Ï>ó÷÷·²²€ ‹ÜIjkk[ZZzéÒ¥¾Æs0iiinnnRR‚|ªZ˜¢¢"077OHH8~üøš5kJJJDEÑ;·‘bff–””$ì2.¡Ëçƒ *ŠôÞ7µÕBi4Ô=ƒÎ6¥‚¬éûñä>•þß"ÈxD–Ñu’Óu’Ã;qΛ6 M«ŽŒ=ècÃøö×_ìÓ§“¯\Éhkëðð°û׿fêé) ;"dÊÊÒóç›ÎŸo ­99¥wïfd”DGg´·whk+N›¦K§ëÍžm¬©© ì°ÈhpvvÆûž¯WÑÑÑ»ví¢Ñh8ŽÛÛÛŸ={–Oa¢qjä c›Í LKK+**222êºIKK ÊÊÊôôÞihhØm÷’’’_ýuíÚµ|FC…0 ÄD|4´0VVV¼‹ÅÇÇçøñãL&³çyCA!“‡E9ÍAÍ#¨{uùðò `¢ðqž°Ã!ÈÈÂH˜¬Vï“s°ž55U¶kÌë}>gQ¨Áw¼zô¨ôìÙ”„„'ŠŠÔ;œV¯ž®¨Hv(dÌ¡RÅgÍ2š5ËššÚž>}“™É¼{·ðë¯ãZZÚUUeèt½Y³Œ¦MÓ52RåÍÇ‚¾ýÚ IDAT… Ôa[[Û   KKKÇ) o‰D555&“I4§ó¶ÖÕÕ`?þøã–––wïÞ ¿ÁwÈaœyËÓ¦MËÌÌ´±±V6›-##C”IIÉa&AA$Au¨ÿ=Å_gkïÅØO!ÿèû^À²æ ¥5jd4•¥ÕeŸ}'J!iÚËêΓӴ—%K¢–_dô ßq†Ë팋{tþ|êãÇeS¦¨}ÿ½ûòåVd²ˆ°s!〤¤®G§ëmÛ6Ëí|öìmF33“yäÈõºº&eeé©Sµˆ‘ÌÌ4HèžA©½½N§=zjjjˆ &&&ûöíâ{¦iÓ¦­]»öóÏ?ŒŒTVV&úºFDDØÛÛëêêŽr˜ÚÚZ¢€¼¼|rr²¥¥¥ÃØØØ,_¾|ÇŽ?üðƒ 1ëý0à ‚ È(!õÞí:š µ žŸ€–r1¹÷-¿êmñhDeµIm²‹Ò«ö«$v²ï+’(¦n'­ë(¯3Wµü"£5øŽN3ƒq?"âÁë×5h ^d˜DEIšš7:tttUff2SS ÏœI9rä:•*ni©íà`4m𮥥6úFA Û¹s§¯¯¯µµµŸŸ_]]ݲeË xüüüª««œœäää‚‚‚Éd2\¸paûöíÇŽ300¸r劸¸8xzz2Œ!7k9L×Îżw…†Á`|þùç¡¡¡Ó¦M‹ŠŠ" 3 ‚ ‚™"ÿh­‚Ú<`?º§Pbr#ÝàËårÉd2‹Åêúµë˜ªÃ0Ü]Ä?†a? H¯$•È&®Ê&®ÊܖηõÌ?kï/£ÙH£_d ßqà͛ڰ°”èèôŽ|ÍÛ féè §fD`DDHÆÆ“Œ'­]k¥¥Õ%™™LãÁ‘#×%%ÅLMÕét=¢ý—B! ;/‚ ÂÑïàËK—.]ºt)ïWÞì|¼ÅÅÅCCCCCC ??Ã0¢ËêÌ™3sss{VÈgö¶‘ Ó×!„ÆÎÎîñãÇ=+ȼvCóôéS___aAƸ¨¨¨¼<4béDÖõ»:DÄ•`Ò<˜4¯ŸbÏŽÃëXP°¹@þ#ûÈÒC; ˆˆƒÁ–âî£\íðÙ` Q IÛAVÛA¶½©µö"£5øŽi™™Ì¤¤¤gªª²û÷¼j]F†Òÿn2 ÚÚŠÚÚŠnnÓ ¢¢.#ƒ™šZxûv~hèÿ‰ˆ`&&êÓ¦éÒéºF²²h4Iù%$$ðš,»òõõ à³£©©éâÅ‹ýýýýýýû*¬¯¯ïàÐÿÔÞ(ÌhÒÑÑ),,¼~ýºPŽŽŒ ‹á£ý²°°(..î: 72!YXX;‡GÁšÞBÝx}Új0 êÙu(‹ ¾Ñ ðµk× <àU;|c6؇¬¯ÖÞ¦ªö·éõÚsdŤÐýµˆ€àÈØÓÞÞ“±pa°šÚîÅ‹ˆÏikã ;ò¡+-­Š‰ÉØ»7ÊÞþˆšÚnmí/]zâðáøÄÄ'ÕÕ ÂN7‘EGG£çêDGG ;…ÀwîŽãÀb±ÚÚÚöîÝ«¬¬L£ÑÎ;'..ž™™ÙÑÑqìØ1===IIÉéÓ§ß»w¨ F×…AUKlWWW———ÿñÇqÏÉÉ™7ož¼¼<…B155å½ßb—n*++»þºxñb___b¹¢¢BTT´°°Ð××WCCCQQñÓO?­ªªâUÈb±ZZZvíÚ¥¢¢¢¤¤tâÄ bå N¼«««««ë vA…™T>=û¼mÎÿ..þ£¦½¹C؉qõð[Øì¦óçïFD<¨ªjøøc‹C‡–£z‘1BKKQKë}ÏßÊÊúôôâÌLfZÚ˳gS¸ÜNÝéÓõlltôõU„v244vdX0 öϯškÔÔÐFbÕ‹T5ˆÔ4а›Ej›ˆRu£Hm“HSÛD¾ÃËÌÌ,))IØ)ÞCaAdü‘TIuPsÎyªp³ßâ«W¯vss‹‹‹»ÿ¾››o„¥   k×®%$$P(ooo.— ?þøchhhDD„ÁéÓ§—-[V^^.**Ê`0ìí퀷0¨j §NÊÎξwïž»»û¦M›V¯^=wîÜððp ‰ëׯ{yy-_¾\LL¬çC¸wï^HHH^^^×EÜÝÝ;FÜ?kooõêÕ¨¨¨ØØXyyyooï7ÆÅÅñÊÄÅÅ]½zUEEeóæÍƒ>íÈÈÓq”[w磷éõE7j’ý_a¨O—Ñs’×qD3¼!C„áý <‡ŒŽ¢¢Ê³gSââ²qÿôS4P/2np¹Ïž½ÍÈ`ff2ïß/ª®n’71¡Ñéztºîôéz22Bkrb(((øõ×_…|âÍi2 H8NÀIX'ÿ{!îÀEZqJS‡d#—ú¢Ù4³ÎvÅŠS¦L^fAA1'&&ÆÝݽßÖ EEEÿÝ»w›Í–––e±X3fÌð÷÷÷ôô€'OžXXXdffzyyíÛ·oÆ €ãx]]¬¬,†aÃ¬ÖÆÆ𸸸åË—wvvŠˆˆ°X,2™Ì›¶°°ÐØØ˜˜E7i[sssddä©S§äää¼½½]\\ˆ ] GUU577רØxöìÙëׯ?v옟ŸŸ——äçç›™™ÕÕÕÉÈÈó³Ñét??¿Ï>û ?~üÑG vÒ6777¸råÊÀwA†¬¹¦½ä6»äÚò¼§@=]'4Î2¨‡¯ð¥¦†‡ßMJz¦¦&çãó±»;]Z Ô‹Œ¢¢$ M Íàï9ß?~“šZú$¦¯¯B§ëN›¦kgg ¡!/ì¼ãÏ”)SÐIˆ<þž&A'`=7‹`’X£$©Q‰ÌÒþøÌµ£AAdb ݵk×?ü0wîÜÍ›7Ϙ1ƒX_VV¦§÷þVZÞt¯^½266&–1 ã3šù ª%Ó±’Hï»j²ÙìÀÀÀ´´´¢¢"##£nõ'&&zzz®^½úòåË“'Oî@FFfÑ¢EW¯^]¿~}NNÎ7¶nݪ¯¯Ol%Þ¼ycbbB¬y÷îï(=‡Œ5 dSweSwåÆŠ6Š}km­sú´—³³9™ŒÆçFÆ·®s¾Õ×·äæ¾ÎÈ(ÉÈ`^¹’ÙÚÊUU•¡ÓõˆißÌÌ4H¤^¾0G Îâ[Pƒ¬­}uKÁH 3ÆCko¯Ý^ˆž)x˜ž¸\.™LîÖGØ¡Ad"svv.--ÍËË‹‹‹›3g“É$Ö«©©1™Lb|Þ\‹4ÉdΜ9“ø•èºKtÂNµ„nïRlmmƒ‚‚,--q§PþÑåKCCƒN§'&&êè訪ªÊË÷ÒiÆÝÝ=((ˆJ¥._¾œJ¥jhh”””‡.))!N× ‰‡VTT4ÐÓ‡›”j/£|àÐRǥȡ=„4ˆÔÖ6'LŸ~諯b'OVKHØ{íÚ®¥K§¢Ö^d‚‘–¦Ìše´oŸst´÷“'QQ[Ö®µc³›Ž¿éìü+«o6nü),,%+‹ÙÖÆí¿:™0 ·ÀŒ_H€õý*<åߣhèjÿÉÉÉIJ¥¥¥ÑÙÙ¹mÛ6*•:yòäû÷ï 1LVVöO=øî""" CZZZPyAáoêÔ©ÐÒÒ²±±éÚ®êáá]PP°oß>À0ì_ÿú×ÁƒïÝ»W^^þý÷ßkhh477@DDѤË[Tµ½koo§Ó醆†Ä8 555¼­¦¦¦×¯_¿uëÖÛ·oÍÍÍ7lØÝ­†¥K—>þ<$$dýúõ°nݺÇgffîØ±cÉ’%]{({zz:t(--íåË—D0ï!ãË»œ†ˆùã?+|þkU{S‡°ã cúB`T–‡„$ÅÇçR(dOÏk×Úik+ ;‚Œ*UÜÁÁØÁÁ¸Ü΂‚¿23™Ìsçî|û-[LLÔÜ\ÃÚZÛÆFׯFgÒ$YaçE¦½ÈÒpw@à=Þ¥‘å@g0b Z×ÏT*•ÏÍCvâĉôôôÜÜÜË—/oذ¡ëŒ%£ÆÒÒ’hM€òòòÕ«W[XX |w ÃÖ®]+ØH‚ ‚ð¾{÷î3gΨ««3 EÅ÷Ÿ¾ýüüª««œœäää‚‚‚Édòþýû[[[=<<ªªªÌÌÌ®_¿N¥RÀÓÓ“Á`èêêòUm¯ÁÂÂÂvîÜéëëkmmíççWWW·lÙ²norôôô‚ƒƒ>¹wïÞ”””®[%%%—,YòàÁƒ¹sç€OCCƒ‹‹Kssó‚ ~üñÇ®…8Àf³W®\ÙÙÙüÇëyhø§MJ“%çÖ)N¬Mû®,ýÄ[½ùòÆËUÌ¥„ [Фm£Çñ?ÿ|~÷Þ½—êêr›7ÏAõ"Oב²²^57·ÉÈP>úH‹N×¥Óõllt$$ú¸“Aƻʻò1t´Þ¥“;‰ ⪠.[@×È2ÂË7ýŽQ››ûïÿ;;;»¹¹Y__ÿ믿^µj±cJJЧ§§¯¯oaa!ƒÁ “Éß~ûíöíÛïÝ»gcccgg·gÏžns•+ ¯† 6,Y²ÄÅÅ…O†øøxoo簾¦C‡mß¾XÙël6›J¥ŠŠ¢¯áAd@8iÛ@äçç›››³X,^»­@ŒPµ‚…aXllìÊ•+û-‰&m›Z9̤Ú¿WW>i”×§ØûhªY£›É÷Ð#«¥¥="â“Ó÷ëÖ…·´´ÿüó†‡ý7nt@­½ÂÓuä‡/Ž%'ûøù}¢ª*såJ–»ûicã/çÌ9¾Ì•+™/^” ;,‚”Š8ݲ4þÙ”I9 ÈÞqêñ9Ôæ)Ÿ ­^½ÚÐÐ0;;ûÕ«W{öìñòòjkk#6}õÕW¿üòË›7o®]»–pûömƒÁå¾o/((¸y󦤤¤¶¶vjjªpÃð"eeeñií%œ:u*;;;<<|Ïž=­­­|J>|øÐÀÀàÈ‘#•••Ã|h‚ ‚ôËÔÔtÿþýõõõåååþþþŽŽŽi–¡jG޾¾¾ƒƒƒ°S C'.#2ÙEiÙÏÆ®WL4ìd$Ú=ù ¾$#¥¢¢.<<5::ÍnZ¾Üê‡V[Xh ;‚Œu¢¢$cãIÆÆ“Ö®µ€ŠŠºÇßdd032Jbb2ÛÚ¸**Ò}¤ea¡ALþF¡ —4dœS°†÷áÏ9ÐVí@5 ¾Ô—‚õ¡ø…¢³ d Æ;AûSaǺôôt*•JÌ|2kÖ¬ÖÖV‡£¤¤{öì™9sægŸ}æïïoee!!!¼ÑêëëkjjX,Vhh¨‡‡GIIÉð{Â9 á»ï¾Û±cG¿GÙ²e‹ŠŠÊòå˹\n}}½¸¸x_%ïÞ½{æÌkkë¹sçnß¾N§ó1"‚ Ò—èèè]»vÑh4ÇíííÏž=;–«9h· C^b»GCØ)±5ø ^AÁ»Ó§ÿ/>>WBBlíZ;/¯šš Â… ã’ªªìüù²ó盇Ӝ•õêÑ£W™™Ì3gR‚ƒ%%ŦNÕ²±Ñ±¶Ö±²ÒVT¤ ;/‚ ‰Ìd˜’¡¥:ÛÀxçûõâÊ`âS¾€ò?àåi¨H× ¾l6;000--­¨¨ÈÈȨë&---(++ÓÓÓ#Öò¶JHHìÚµKNNnûöí¾¾¾L&³ëÖQuuuW¯^=qâD¿GQWWi@wSiii=zô›o¾‰‰‰ùüóÏÉdrFFÆ‚ ‚ ƒbff–””4^ªý0q¹\2™LŒ…5̪úìkøõ³X,999^àƒ?~¼¥¥š››yÓúõ[ÉðlOm ¥)uz äDÄÐ-þÔà+0Ä@½!!I™™L}}•€€Ë—[Q©}vçAdPdd$§8:N!~--­ÎÈ(yüøMJÊ‹¤ÎN\UUÆÂB“èü‹FþEÆi#Xðþœj oùM ÔœAÍYHÉÆÁÁÁÖÖ6((ÈÒÒ²ë|Öðw“¨šš“É´··€ââbÞV===b<„öövbøý÷ßíììddú[¹¯‰¹ùxñâÅýû÷9Ž»»û`÷EA™0DDD †´ô¸‘¶kàï¾ûîöíÛÚÚÚ™™™bbBþXZžÛpçÛÒÁo —(LY©$§ƒÆýP ßþåæ¾–’74Tí«@ss[däß~ºÇd²fÍ2ºxqã¼y&$Ò ?æ!2pÚÚŠÚÚŠnnÓ ¢‚“]úèÑ«ììÒÓ§“ƒƒ)²¹¹†••6Ñù—F“v^é¤&,x %ƒÞ±6d§i¬ÃÑÞÞN§Ó Ž= 555]{1xxx˜˜˜HHHìÛ·þn0]¶lÙñãǧL™râÄ +++ ˆˆˆ°··ò¤ÒC‰‰‰³fÍêZÛ0Ã@kkë•+WNŸ>ÝÖÖ¶}ûöÿþ÷¿|Æ@A™ð0 [»v­°S B×ÀÍÍÍ“'OVRRÒÔþÀžZ3e=“,˜ÖæG³žþR©4ErÊ %ƒE ¢¨Ãï‡þÀý¸¿håÊÓ§“{ÝúîÛß?ÎÒò›Ã‡ã­­µ÷EG{ÏŸoŠZ{d4©ªÊ,Zdîç·ô×_·ðÀïøq7 ÍììÒmÛ66ß¹lÙÉ#G®ß¾_[Û(ì¼ÒŠ (Ùnœ ÿçq4ÈÚUG&–`„………„„Ðh´­[·®_¿~áÂ…Ë–-ëZÀÏÏÏÑÑÑÉÉiñâÅ›6m2™ ““311ÉÌ̼|ù2QØÓÓ3--môÃ@jjêÔ©S»f¸yóæ­[·‚ƒƒ333×­[‡Z{AdÁ0¬ªªj8»gee 0Ï8•™™igg'))©££ŸØööö}ûö©¨¨¨««‡‡‡S(âtavíÚ5 …ÈÍÍurrRPP033‹‰‰Èq1 ‹ŠŠÒÐЖ–þòË//_¾L£Ñdddˆ¯ü¹\®ŸŸŸ¦¦¦’’Òš5kª«« µµu÷îݪªªÊÊÊ'OžìZUUUÑK@YYÃ0b Žãººº nnnü+ â2"“W(­¸­|Š>OpŽãÂÎ0vݾ¿aÃ.·“L&egÛu„ÐììÒ°°”„„'RRâ6ÌZ»v†ªjÿww"2ÊššÚž>}óøñ›ÇËÒÓKÊÊj@[[qÚ4]büKKm2YDØ1dKÉ€WÀyÒF »tÖuè½MÇ‚üü|sss‹Õ×ÜÖ†ÅÆÆ®\¹òC ƒ ‚ ÄÄĸ»»‘ÖŒa޾:Ò#Ì „››\¹re䡯¯ïææ¶{÷îû÷ﻹ¹ýõ×_“&Mb±XgÏžýù矣¢¢(Š··wZZÚÇmll0 [¸pá¥K—îÝ»çîîÞÐÐðÑGÍ;×ÇÇGBBâúõëÛ¶mãp8bbbüÏ0†aK–,ùùçŸSRR\]]-ZÄ`0ˆåââ☘˜ðððÈÈHyyyooo™¸¸8ÿK—.EFFª¨¨lÞ¼ùÎ;Ä?ï?¡ÛBTTÔ‰' †²²òîÝ»)Ê•+WúªdäÎ0OsMûË5SV*“%QÐ Gúù@]}¶[Mm·–־ᄏ‰ã8—ÛŸóÉ''ÔÔvÏšu”Á¸ßÐÐ"줂 Ty9û?ž\û䓺º_¨©íÖ×ßÿÉ''üü~Ï©¬ä; ‚ CÕC!64´\[´Èâĉ5Ó¦ï[eII1;;};»÷¯ßoßÖÓ¾åä¼þý÷œ––vqqQ33 KK-¢ýWWWY¸d@Hb ¶°Ï­-• ®ØX¼{ËÌÌ,))IØ)ÞSaAdBjii¯ªj¨¨àTW×WVÖWVrª«‰†ÝªªúŠ Ncc+¯°´4EEEFI‰ª¬,mn®¡¤ÄÍËCïgΞ=O"‘6mÚ´~ýz‡¨¨¨ØØXb€7ÆÅÅ}ÿý÷=Wö¬êáÇ[¶lÙ´iÓ¦M›TTTFÿ±ðÑÙŽWæ7V4U4Uä5Ö¿mÃqœ$Šá8àïPHd’´úPf#pvv.--ÍËË‹‹‹›3g“É$Ö«©©1™L{{{(..îº oN]‚ƒƒƒ­­mPP¥¥%Žã e(òŸ444JJJˆ£—””FÓÐÐ(,,œ9s& ì‹LÌãx]]œœÜ`+E µY¡)M–4qSÖw–¥Œ¡« ,Ôàû¸¯ïUã~Ïþ@8Žkj*œ=»®Ûs ‚ ƒºº¼ººü'ŸX¿VTÔed032˜yye ÆýÖV®¤¤˜©©:1ò¯……¦±ñ$áF¡¸· j²@u.h¹ú' 6”þ‚ ‚ üuvâ,§¢‚SQÁa³›*+9å场º&bM]]SMMc{{QXT”¤®.¯¢"#''©ª*3yò$YYIUUUUYYÉI“dde%»ÕsáBǨ?¬>}ÿý÷jee•™™<}út8yò¤™™‡Ã¹páÂ×_Ým¥ŒL÷©€œïÞ½ûÿìÝw\S×Ûðç&„ ² Ì$€ì qàŠuþÄV”Šb-îV­ZÀ¢U«µèÛºg«¨(®:ÚªÔQÑZ u HEd…‘H!yÿ¸6¥, >ߜܜ{pòäÜçìܹ³gÏž¾¾¾óæÍóöönÿWT[Ñ#…]É~…øàÄjE A¡‚úŸ ¯Zõßì‰ZÃê·à*ݺuó÷÷_¶l™——WítmPPК5k\]]™L&¹‘Zc9™êêjooo‡”””uëÖ@qqñkVÅ:uê—_~éììÌãñæÏŸ?zôh>Ÿ?eʔիW;99™šš’!5-888,,L$ñùü 6$$$ܽ{÷UiÝg˜‹ûp’¢%7Ö?»ým¶ãÿnM[öŠt¾ÿR©Ô >{ö®ZÝÀíŸ de•\¿ž:hSûdžjgff¼1cºÓ T*õ“'ññþ™—úý÷qjµ†ËevíjéímãéiÙ³g##¼í½ ¼wBöYx~þ˜}0Dc@4˜ºŽ !„Bo FSP —J•ò¼úˆF£ýùçŸíð*chˬ¤–±««Ud’]£n<Ù®®iaÂwïÞ½‹-Ú¹s§H$ŠŠŠÒÖ» +**:t(ŸÏ߸qãÅ‹i4Zƒ#ìÚµkÁ‚¡¡¡={ö “ÉdcÇŽMIIiA0ZË–-+++7nœ¶,_¾\*•¾ÿþûjµ:22òÒ¥KM²bÅ ¥R9nÜ8©TêU½Fú IDATããsòäÉ ÒnLÜ |×ô^$zt¦èљ¤#’.Cxƒ¾°¦±°Úá†hYm»Î§²R5sæþß~{¤R©ëC¥Rúõ³?v,¤=Cu4¥¥))9‰‰Ùññ·o?)((33®··m¯^6äú_£áYBE¥žÿÏÏAîEШa|P™ºŽ !„BÂ+ås©Tбñ‹|®6ÛÖùܘ˜˜‰'vlAW¯^WDçˆè\±>GL×£·Bq€ääd‰DÒ`ùcÔê4jMæ5YÖMù€p+]Ç‚^&|**ªgÎüþúõ¦²½$‚ ââVØÚb)O„€F£IO—ܽûìîÝg÷îe&%=¯®®a±ô==-Éâ¿]»ZZYátu`5 }‚^ºŽ!„Bí¤N>W&SæçËóóe/ÍçòxÌ:‰]]­Ïíh ßÞ½{ïÙ³‡ ˆY³fYYYyxxÇ‚Îês„úl3} íÅ'¦cÇŽ-\¸P(j4ŸÝ»w· ìáÇw¯šðFY›ªRÝ* ·QùÏ _ò[2²Öø[ƒZZêTSàPª ¢ŠB©¦PTdƒ ª)²ñ’bð2™,33óÍúŸ‰jryEbb™ÿMLÌzú´ŒŒ ºvµôô´ôô´ìÚÕR(Ä]³PG•}î.ÒÇ@e‚é Žáà8è:,¤3±±±ÖÖÖºµ­ÄÄÄcÇŽM˜0A× „•Ÿ/kA>W»>—Çcš›óLM¹on>·C­ð}hWøÖ>Øàj_W–”sóGN-ÉM(+Í­,Í©*Ë©RUª€ €ß7vÖƒx­ùPkûqÊß ¸šÚ 7¤èá’¦§MÛîß¿ßþq¼ÑÈ_6ºŽ!Ôáp¹Œþýú÷‘ «®®IO—›¿ýò˃­[/×Ô¨Ùlº‹ ®ÿE’ø þ”e@Þ%Ƚ‰+ᯅÀ¶ƒž›A4F×Á!Ýðóó«óau>í~Žj7 æsµÚù\ …01áÔYŸÛ ò¹è@®öí2ˆÿèLѽ¹Ê"h4\«W+@aëghëg¨}¨(ª&kA˜¸5üO÷ÚOËr«8tŽHŸ-ÔçXÐ9B}3Ÿ¡Ú]¯ù¢¤Ã×"žÞÙ›ëhâô?nìÖ¡4ðE!Ôh4ª““¹““ùäÉ} ¼¼29ù9¹ø7..õûïãÔj ‡Ãpv¶ÐæÍðƒ7Ò1¶ ØöF…·!÷"àO„B¨åd2E^žüUó¹<ÓÑÑ󹨣¡Ð—ñÆNcŸ)¼»7#|­ŠÃ,% ™z4ÖÁÌ“M¥)JsªòËÊòªjª4@Ñ#ü: œ°Y»ysDÞœÒçU)§$íÌýóÛ[?~שæ†v ]‡†0á‹Bºb`@÷ö¶õö¶%bþut„˜ø€‰O£žì¶÷Á‚¿!„Þfr¹27Wöúù\>ŸidĦÑpÅzPh„ëxç±ÆŠ¢ê6½ËûÆÚ¶F ŠÂêҜʲœ*®eÉæ_?KÈÁ¡>Û‚ÎécåÙVÄé{ÏyN1{xB’S¨Vi†¬³ÑuP¾!ÔAÔÉÿ–%&fÝ¿Ÿ•˜˜õóωûö]ssž‡‡ØÝ]äá!vw‹Å†M‰P;ÒÔÀ£- M Œ½ÁÔÌcò!„Pç#—WäæJe2Y3·‰|.A¦¦EÖ[¨ŸÏ544Ð×Çä¨ó Ð¶¹~»]Ž €)ÍÀ”ÝícìÂ’>­ÈO,Oû¥XQø"Í4¢œt¥sñÛ”VÃàëõ˜iÑ5ؼªL¥ëXÐ øÛ!„:"ccö!.C†¸ J³<ÈNJÊ>q"aóæKÀç³ÜÝÅžžbww‘»»ØÆÆ˜JÅ/«‘ŽTy*ò ÿüÏŽCÒj ÐÁÌ|Ñup!„Psa>¡Î¤Û4sm[U©.Í®’gW–æV6˜íÕ¨áüìT3Y˜¬̶ЧêãM–ÍBÕ'˜F4]G^À_?!ô05å ê:t¨+ùÜÿ-11+11;>>cÿþ¸ŠŠj==Š­­)YüÁÓSìæ&20x­Z½2†9X‚u @E>üùºŽ !„úWiiENοùÜ:‰Ý&ò¹VVss®©)󹽡ôèC;FfkªÔGfiNUæuiiN•J© €gEŸpÊ­ýítÔÕšä‰Óÿú\UÝ~Zá÷“J¥¢Ñh‰ÄØØøå½ÛAÍ £ÁžAÄÇÇ{yyµY€!Ô:´û¿ô•JýäI™ÿMMÍÛ´é¢Tªr³f2ܽ»µ±1[×£· à ¬&4úláïðx÷c໓¿N«&Š­8l;Ì‹¶ùsW„P3µb>—Ï7 Ó1Ÿ‹Ð[DAé÷™¥öaE‰ª4§ª4·R¥P7Ø_QX}eEGDçˆõ¹b:WDçˆèL#ü¹QWñåݽ¹íÌu~Oà1ÉÔÀ¬ýê~¼ÍZá"•JŠŠâp8¯?B¡ÐÓ£ÔÎÿ@~¾ŒÜÿ-11ûàÁß%’R¨•ÿut4wt4wr2orT„Ú’JåOáÙq¨Q‚Þ`âÆ}Á¸Ðxºµ¦6š(¶ú° ½zõªs¤gÏž­28Ζj-ee•ÏŸ—4'Ÿ ffÜúù\>ÿÅÌçv÷îÝÓuo ™LÆã½u34†¡ÃPÏÄÕXM ðº0JŸWæÞ)+Ï«R×h€Æ¢Šzsü¾±mÇH;:cgVÐEÏôK%÷¾ÏK:R`éÃë6ÝÜÌÓ@×qur­ðŽ ˆÉ“'·Ê8¸Æ!„Z…™ÏÏçççjµ&#C’”ôüÁƒì¤¤çߣ¸¸ÄbC77‘««ÐÅEèî.²²P(X µó¡`> ,$7@rž‡«¡û×à²D×Á¡ÖÔZŶ¶{÷î%%%d;///00ÐÓÓ³µo£7¡Î§±|®Tª((çåÉ0Ÿ‹jëÞ½»®Cx‹Œ?^×!t8f´¡Vd[­Ò”åU•>¯”gWQi ª*~¬ükw.‡, ,ÔçŠôÙtë­Ø……ªO8Œ6²n˜[’x0ÿìôGâ>Ü~ŸYò¬°a[iɯÀøøø Ü¿ßÔÔ4,,læÌ™d®–Çã-_¾<**ŠF£­ZµjÞ¼y7nÜèÑ£Ç×_½gÏž¼¼<ÈÈH "**jòäÉdcÊ”)`bbBæ| ‚¸víÚ”)Süýý>|xçÎ¥Rigg·råÊ &¨ÕêÇÔ ûå—_._¾üôéÓ%K–Ô9ìsêÔ©uëÖI¥Ò¡C‡nß¾ÝÔÔ”<®Ñh6lذk×.™LöÎ;ïìܹS ¼Ö{ŒB:E¡vv¦vv¦cǾ˜?^’”ô<));99çäÉ¿ž=»tgg WW¡››ÈÕÕÂÙYÈfão_ÔöضÀ¶›`€òg@m¤ªšü0L@ߨ=CC-ÓÅÉ“'¿Ò°^^^Aœ={6$$D¡P¬^½zÞ¼y÷îÝklZT*•Ïç“íÅ‹ñÅ4Z»ŽH$íÃÑ£GwëÖmÍš5PPP ‰>|xàÀ(•ÊaÆmÙ²…œI’Ñr8œeË–EGG«Õêððð6ý‹@¨ª®®ÉÉ‘æçËš“ÏÕ&s1Ÿ‹ê9rä£GtÅÛïSiEàŠé\1]Ô»Ñ>j•† ÷¯²Ç9Ų?î|=ûáF}—ŠÛ)P¢èö#ŒìGeÿ!O:"¡cIß¶Ô’ß‘§OŸþý÷߯ŒC߸qã¹sç.\¸À`0BBBT*lÙ²eûö퇲··ß±cÇØ±cóòòôôô¢¢¢È =ÙÐh4uVø~þùçGŽ 9räÞ½{™Læùó烃ƒýýýwìØÑà˜ä‰«W¯>þü•+Wø|~`` ¯¯oÓõõõ`÷îÝgÏž¥P(³fÍúðÃþùgòômÛ¶íÛ·/::ÚÄÄdÑ¢EüññãÇ_ïMF¡ŽE$2‰ ß}×|¨Ý.55?55ï—_ Ë€Çc9:š‘U œœÌ-pgÔ¶ ¬}êV0ý L 0êùâÀfíj®¶˜(¾ê°¤m۶ݹsçÆ'Nœ5kVÓÂÚRRRöíÛWçø7¶nÝzÿþý””íÁ‰'~õÕWdÂ÷ĉ>>>'Ož}úäÉ“¦¦¦³gÏn¥·¡Žâ•ò¹\.ÓÜœ×X>—Çc1¸Õ;j›ÍvttÔu½cÖЯ_”z¨*¯)Ë©"k³M®i›}Kžz®ˆ#¢sEt®¥>GD70Õ'Zº 8)))::º…'·Ä}£ë:ÀÀÀÚGF£}3qâÄÚG$ÂÃÃ-ZR©”ÃáèééI$’~ýú…‡‡“ku}Úßß_­VS©T‰DB£Ñ›ÖÞ´mÚ´i>>>3gÎ$*•ÊÇoÛ¶Ï燄„Œ7®öÊ_¹\nffvïÞ=''§Aƒ}øá‡_}õUXXXpp0$''»»»Ëd2.—KNt½½½Ã¦OŸ‰‰‰]»ví€Í‚8vìXíåÏ‘´ù\™LIÖÌm2ŸË07çóxLr4Ìç"„Ыʾ%x\RšSU–SUU^Áê»M4u›hòÒÓë 3Wöööm)Ò±¼¼¼áÇי¥·d­ÖöíÛ.\¸yóf__ßÙ³g÷ë×<ž••ekûâË ²ñôéS'''²M„ö^¹—²²²©Tº~ýú›7o¦¥¥i¿Ákb̸¸¸áǯ_¿>**ª±ÓIÚåÎÎΛ›K>ÌÈÈ ÒöÌÎÎÆ/Bo33ž™oÀ€?ú´K€³SSó®\I!«›™qÉýß<=Åžž–öö¦Tê[Q‚ éËX–`9îÅò'P”%wÙÈÞƒê* àþ¿ºÑFÅW–$‰€Byñs©‰i¡–L&;yòä·ß~K>¼xñâ”)S£££Éc\.wĈ'OžüðÃïÞ½ûÓO?Í™3ÇÎÎŽ|–ldgg»ºº’Grssµ—Æé%êhZœÏõô´Ä|.Bµ:q_®¸/—lWÊUdæ·4§ÊЮáhé¿–äÝ)c õ9tŽPŸ-Ôgðê&ýöìÙÓ¶A#]ˆˆˆ¨°% ßáÇgffÞ¿ÿôéÓƒÎÈÈ [XXddd·Ý=yò„<( 322ú÷ïO>$Wdk+šFÎÎاOŸ7vïÞ]£Ñ0Œ¦Ç<~ü¸J¥rss›9sæ Aƒ<”––&‹àÑ£GAXZZjŽŒŒ;v,ü³Ò¤ùIj„ê”h4ª““¹““y@@/¨©Q§§KRRr’’ž§¤äüôÓý}û®Çruµpr2wv:;›;9™óxMÝP˱í€mÖ~¶²Nšü§þƒq ¿ò:Ô2m4Q|¥aIuV 71-Ô:sæLß¾}¹Ü®Äb±··÷Å‹»tébfffhhXÿ”‰'nܸ‘Ífûûû³Ùl±XœžžNÆ“žžN¾Fmg±XœššJ¾Þ´´´¦ßI„ZWý|®Tª$3¹õó¹ÃÂâß|.ŸÏ43ãi+êb>!„Ú«Gçê;7õñªJ^Sø·"ã²TQXM¡±¨¡~Ï,º Á¼Ö[§% ßnݺùûû/[¶ÌËË«öt9((hÍš5®®®L&sñâÅ@Ä´iÓ"""lllìíí:‘——Çf³:äããccc£m@III›Úª««½½½RRRÖ­[ÅÅÅ ÃØØ844tîܹwïÞmðtòË—/ß³gA!!!ÚäÁÁÁaaa"‘ˆÏçoذ!!!áîÝ»-~B¨ó¡R)ffÿûß‹]àJJÊ““Ÿ?|˜›’’s÷˜x…¢ ,,øŽŽf®®BGGsgg GG3&]¢¶G¡CŸ äß”HP•A®X¼ =6é:¸Î¯&Н4lƒ51-Ôºxñ‴ÝÜÜΟ?Ÿžž¾mÛ6wß}wîܹ=zô¨}ʘ1cf̘±uëÖ;wÀÔ©S¿üòKggg7þüÑ£G×^:0eʔիW;99™šš’Ñ’jχjÌç"„Ð[Îù=cç÷Œ ¦J]–[UšSE. 60Ãéo£–$|÷îÝ»hÑ¢;wŠD¢¨¨(rëa +**:t(ŸÏ߸qãÅ‹i4ÚgŸ}VYYTXXèîî~þüy23;eÊ”¨¨(mcàÀžžžÏŸ?72úwî]»v-X° 44´gÏžaaa2™lìØ±‰‰‰ Ž©µdÉ’¨¨¨Í›77x:¹ÕÆ‚ FŒ¡P(F޹uëVí¹+V¬P*•ãÆ“J¥äÎ-x‹Bè­bhhп¿cÿþÿÞž,“)=Ê# '$<=xð÷òòJ¨µœ““¹££™››ÈÀ€®»ÀQ'Eã€íT€©5”¦Bñ(¹TfÃýk” QƒžA{ÆØ‰µÑDñ•†m0°&¦…Zqqq|ðAmmm###¿üòËÇúé§×®]«ý,‹Å=zô­[·|}}`Ù²eeeeãÆS*•Æ Û²eKíÎË—/—J¥ï¿ÿ¾Z­ŽŒŒ¼téy\û2[ô–£·‚J¥~þ¼¤™ù\6›.ÖÏçòx/˜ÏE¡NŒªOáY3xÖ W~@o‰–lÚÖÉÉɉD;ïÄpÓ6„z©ÚÁ¥¦æ§¦æUTTà “ÛÁá§PÔÞž†[ÁÀ¶îÀ÷¾'ðÝmÐðBÑ·V37mkŽ6š(¾¹óO‚ Nœ8ñþûïë:Ü´MGšÈç’Gd2…¶sí|®©)ó¹!„^ŠÌ\]½zU× ÖabbÒ ›¶5ÆÍÍmÔ¨QáááåååáááC† yãfÛ!„ÚHà**ªSSó=Ê{ô(ïï¿s/\x@f0hŽŽæÎÎæŽŽæ..B''s¡ N¡6fæ ýŽ@É=&BÚ.Pdè±Áísp[¡ëà:6š(vŽù§ÝÀujC*•º¨¨”Üí¥ù\*òMM¹¸>!„B-Óš ßcÇŽ-\¸P(j4ŸÝ»w·âà!„:ƒæéiééi©=R]]“ž.IMÍKMÍKM͉‰OKËW«5äç^r°££®F­)ë‰ÿnWUÒ$%ϵáþÅAepÁÀªÝbìÚh¢Ø9柸ۛ®¦F]Xˆù\„z“DDDlذ¡¢¢”J%ƒÁ ">>ÞËË«µ.¡R©h4šD"©³g@§P(8põêÕ’’CCC//¯éÓ§“/Á××wçÎNNN-™¬Eb±X¶¶¶3fÌèÖ­[ýüñGײË5' …"‰‚ƒƒ‡ÚêWÑ­ÖLøº»»_¾|¹D!ôö Ñ¨NNæNNæÚ#……eÿûøqþãÇyii’'òóe@§ëÙÛ›ÙÛ›:9™ÛÛ›9:šÙؘÐhTÝÅŽ:}C0¦íðô<ú4jÐc×x.Àu®3˜öºI;ú†i£‰"Î?Q;¨Ï•Jò¼<ùKó¹|>ËÉÉÜÌŒ‹ù\„ꀾþúëØØXkkëøøx}ý6ÙYšJ¥FEEq8œ¶¼h4šeË–±jÕ* ‹¢¢¢sçÎÍ;÷СCm“ðJ6oÞloo¥¥¥gΜY¹reLLŒv3ÞöDF¢P(nݺõõ×_3Œþýû·m§5¾!„P+26f÷ïïп¿ƒö¹9¹ øÑ£¼ ’ÒÒ.+UðO-`kk££¹““¹³³…‰É›4µBo’›¡ûF(²d=Y2diôñÿtBè•a>!„ÞBJ¥ÒÙÙÙØØØÒÒòå½[„ ˆÉ“'·ÑàmäÂ… 999‡&“°|>Ñ¢E3gΤR[gy “É$wèe³ÙÁÁÁÇŽËÏÏ·¶¶n•Á[ ›Í;vlqqñ?üÐѾ¯¹À¾!„Þ4ÕÚZ`m-ðósÓÔn—šš—™Ytñb’DR <‹,AfÍ­¬Œ·áB­Ð¶-°mA4æÅ‘êR 6²6ä÷ ¨Ç8/þ°m€Ò& IBõ5˜Ï•ÉÚ Mçsy<–™W›ØÅ|.Bu4ADGG/Y²D&“Í›7ÏÓÓsñâÅeee³fÍŠŒŒlì01yqoVíª fÆ »ví’Édï¼óÎÎ;›Ø€ í¹Ú6A×®]›2eJDDÄŒ3Þ¬’±±±þþþu–Ü’)Z­ššš~øáâÅ‹•••½zõZ°`—Ë__ßððð;v”——7ÎÖÖvÇŽJ¥rÔ¨QsæÌ!ÏU*•eeeðÏ _[[[KKË´´´;v<~ü¸²²R(N:uðàÁµ¯¸oß¾Û·ooÚ´ÉÀÀ ::úܹsååå=zôøôÓOµ—þ¿ÿû¿uëÖÌ™3‡ÜjøáÇ+V¬8yò¤ŸŸßçŸîçççëëK6ê¼ê!C†ê,h¯(7îE Prž€J A+ l»v °ýÕþÔ²Ó›¨£×à—7­[w¯ù:T0íC¡¨:vì¶™oäHO]ÇjµF"‘· Ÿkm-ðö¶Á|.Bu‡¾ÿþµkׯ?bĈí¹sçÚÚÚÖï¯Ñhjçgk?µmÛ¶}ûöEGG›˜˜,Z´èã?>~üø«ÆóùçŸ9r¤gÏž3fÌhù«Ò…´´´ñãÇ7ÝçØ±cW®\Yµj‡ÃÙ´iÓÆ¿üòKò©_ýuß¾}÷îÝûâ‹/z÷î½ÿ~²=nÜ8 øä“O´ãI¡PV¯^ݽ{÷¥K—Òéô[·n­[·®ÿþzz/2–¼uëÖæÍ›ÙlöéÓ§þùçððp>Ÿ¿uëÖM›6EDDÝöìÙ–‘‘qéÒ%2á{åÊ•Aƒééé}þùçdŠVÛ¨ƒLýÞºu«þK;uêÔ™3gBCCE"Ù8uêTKž›xþøãÆâÿñÇ÷ìÙóàÁƒU«V=úêÕ«¸Â!„ú…BXY ¬¬C†¸h•¥¦æ§¥å§¥<~œåJJvvIMšF£ZZÙÚš)`c‘ÈBÁ…À¨õ8Îÿ·]%…²4(MƒÒÇÀ°h¸ÿý0  €ã{`Û…Þ>a¾YJJJȆ¡¡áÕ«WÉí>Z·F^VVÖ´iÓnß¾mcc³mÛ¶-ëÜÁ\¾|ù“O>yüø±µµõæÍ›GŒÑŠƒ¿’²ï¿Û»÷ziiÅ¢EÃÚ!áûJù\==ŠHdˆù\„zÃYÚ· IDATÛ,^¼X Œ7>ûì3m›\’ùJCíØ±cÕªU}úô€]»vYYY) ‹õJƒ|òÉ'­>@3)ŠÚFíæfçÎÓ®óýå—_¦Nêââ ,˜6mšö-š0a—Ë%gMÚ¶\.'¾Ú=ß ÅîÝ»×®]³cÇ&“I¡PÀÓÓ³ººº¼¼œ ãèÑ£Gýþûïəՙ3g¦M›æêê ‹/ž0aBee%N€€€[[ÛmÛ¶ ‚k×®­\¹´Kzë¯í­£Á—vîܹ©S§zzzÀ´iÓ&L˜@†Ú˜&Þ„&âÿßÿþÇçóû÷ï_SSSço¡e0áÛ **j¨TÎßç––VÈåʲ²J¹\)—+e2%ydÚ´þ^^6º!„Þ^»o_vß¾ÿYMIÖ‚ÈÌ,ÊÌ,zö¬èÚµGOžÔÔ¨¡VE`kk••ÀÚZàädA§ã/MôÚôù`äF/üÔÔ@Á5§þ³˜,+àØÇ¼¾7'|ÏçkÛl6»öÃÖ²hÑ"}}ýäääíÛ·¿÷Þ{uîglÏ`f̘1uêÔ#GŽæåå1™ÌV¿JÓ22$Û·_=vì6¨Tj*•BÖÏyMMçse2Eqqyuu Ù¹‰|.Ç27çòx¯ö!„Pç@þŽ&ÓpµÛ-‘‘¤=’íèèøJƒXYYµìê:'²²²ÜÜ^Ð;wî\eee5¿B¡l“ ‰DBÖá%ç'ä¢éÚíúX,ÖŒ3Μ9“••Å`0Ž9’””ôüùs±X\»[bb¢··÷‘#G>ÿüsÈËË[³fÍš5k´$ yŠ™™ôìÙóúõë¶¶¶T*ÕÃã9¯Z"‘€±±qƒ/-//O[è™ ˆÆ&„ZM¼ Mį- Òœ€›£Ï®õ"-†QUåVSÃÐ×hô¨`j:cȯÉT*•\VS£V«5áḅ Bu8ÿÔ‚ø÷¹)ܳgE™™EdQุÔgÏŠ5 ™e “¿Ú¢Àb±!•Š!P«"¨àw Z¥iPšöbEpÙ“†³½ê*x¼ l€Ý ºÛÎñ6íÔ©SëÖ­“J¥C‡ݾ}»‘‘QDDÄ”Jå°aölÙ"T*Uýƒ­ý{÷–,YrçÎ¥Rigg·råÊ &€¶¾^hhhjjjTTF[µjÕ¼yónܸáååõÛo¿EEEYYY…††nذ!99¹wïÞº æþýûl6›J¥†„„,^¼8##ƒ\Ò>bc“¿ý6öÎL==ŠJ¥&ÖÔ¨óòd/=—ÌçJ¥Jr´úùÜ’EU•Šì¬§GØäR\Ìç"„Ò ¡P9vìXÐh42™¬é¯r5 dgg×>Øât³Îùøøœ9sfذaÚìybbb>&&&999dm„ÜÜ\hÙä­¦¦˜Læüùó]]]?þøcF3lØ0mŸˆˆˆššš?üpÔ¨Q]»vsæÌñññFS^^®M¿jS¥ƒþé§Ÿ233‡ ÒÌüé•+W8Nƒ/M äææjsÇeee,‹|È¿}2_Ü͉¿µü'áëááQ;ÍŒ£P¨/_.}ö¬ºÁg5P©j´ííÍÌÍ_w%6B¡v Ý®v¸¸¸<=½àÉIzº$#CrçNæ‰ ÕÀá0´… ¬¬ŒÈR<Ì£V@ãQO0êù’n´öÅr`Ð7z‘ùå{€GD‡ør»wï>{ö,…B™5kÖ‡~8pàÀ£Gž8qÂÐÐ0$$dæÌ™§OŸþæ›oêlÅ}}}÷îÝËd2ÏŸ?ìïﯯ¯ÿÔ×»xñâ¹sç.\¸À`0BBBTªÉÇ'OžSð”” …BÞ‡¨«`ÈÛúòóócbb„B¡M{Ü:¦R©OŸþkÛ¶+©©ùd¹sm¶—”›+Õh4ÍÍçR©ccÌç"„êЂƒƒÃÂÂD"ŸÏß°aCBBÂÝ»wëÌçóÏœ93a„µk×¶gm'88xöìÙ+V¬˜>}º±±ñÇ:T§Ï»ï¾K~)Îf³¿ýöÛ¾}û¾tÑ«–vÓ¶ŠŠŠýû÷ÛÛÛ›˜˜ÔÔÔ¸¸¸ˆÅâÌÌLòr¥¥¥ääG__ŸÇãM™2åÿþïÿöìÙóî»ïîÛ·ÏØØ˜ÍfGGG?zôhÏž=u.Ñ¿ÿM›6¥§§ÿßÿýy$66ÖÝÝÝÂÂBÛÐF¢P(nݺMÖÒmð¥1â‡~°°°‰D±±±?üðéS§˜L&›Í¾y󦯯oý·¨1͉¿6íûÐÿIøº¸¸„††¶l ·ÍÚµpüxüòåÇ««ÕµÓ»uÐhz#F4k9B¡ŽÉÈÈÀÈȦveF“›+KO/HO/ÌÈF¨¡P€B¡Ô)ãP›J¥~~8¿E!Ôa]¸paĈõ‡††6¿¢i« ‚ÚGeeezzzBBÂüùóu‹ŽaÂ÷uééQæÎ}§_?‡?>˜›[R{N¬§GéÝÛ®kWË+WRNžü‹Á õëg7dˆ‹¯¯K—.Æ:Œ!„P{j0\TTöìYñ³g/²ÀÏžß¿Ÿ•“óâ÷“©/ …|¡ÐP(ä‹Å†"‘¡Pȉ étüÝ^•l;`Û5£«¨,&BîEú«&|—/_¾gÏ‚ BBB<<<¾üòKggg7þüÑ£Góùü©S§Ö?X{C‡ùøø´¸jmuuµ···ƒƒCJJʺuë ¸¸˜¬¢@ Z³f««+“É\¼x1±bÅŠŒŒŒÃ‡s8©T ‡J¥ê$èÕ«×äÉ“?úè£Ã‡›˜˜ØÚÚ¾þ;SA£Fu•J/íÚ5cÈ‘·n¥ýùgÆÍ›=ÊÐP©Ôú‹$9&|BuXÇýûÚ[eÔ>nß¾½~ýúàà`333]Ç¢cø¡±utïnuùòÒÕ«Ï:t‹B!È j5ŒÛíƒú¬X1J*UÄÅ¥ÆÅ¥nÙr94ô”‰ çŸe¿N\nÛVaC!Ô l€Ý½ûª‚VW×ääHŸ=+ÊÊ*ÎÉ‘fggeýñÇ“çÏK´»™˜p„B>™ü%³ÀB¡¡XÌ75å¶úÖ® 7øD“ÍcQ¯zö‚ FŒ¡P(F޹uëVƒ²²²qãÆ)•ÊaÆmÙ²–-[Vÿ`mS¦L‰ŠŠjqZs×®] , íÙ³gXX˜L&;vlJJжCXXXQQÑСCù|þÆ/^¼H£Ñ._¾ µï$K+è$Ø¿ÿ¼yó¾úê+{{ûãÇÓéô×gšflÌ3¦Û˜1ÝàÙ³¢[·žüþ{Úõë©ùù2 …ÐÓ£’?”$’R;;Ó¶!„BèU 8pàÀºŽ¢CÀ¾­ìäÉ„+NTUÕ“àøø•"QÝ{$=Êûõ×äë×Sÿøã‰Z­qsùù¹úù¹yxˆñ³:B¡UVªòòdÏžååÉÈêÀ™™Eùùòììb…¢ŠìCV‡ ·¼'KC˜™qÍÌx––F þ~A¯ëUkø¶‚ Nœ8ñþûï·Ãµ’““=<<$‰@ xkƒ!âØ±c&LhðÙÌÌ¢[·ÒnÞ||ýzªDRºk×T2)ŒB¡Žì­ªáû¶Á¾íáý÷½¼½mç̉ú믧¶¶&õ³½àädîäd>wî; EÕÍ›cc“££oGF^ØýúÙê:l˜næŽB¨6:]¬ð[ç8¹(˜\üüy ÙŽÏøñÇ;ee•d.—)òÍÍy&&2lbÂ57çššrÍ̸L&n²„:4;;»æ¬Ôhq}=77·Q£F…‡‡———‡‡‡2¤±ëLë"ö€§O õô¨íB!„z)Lø¶>KK£³gìÛWRRÞtOKßÏÏÍÏÏ 23‹bc“cc“—,9F.û0ÀÑÏÏÕËË—e!„j Fý'\·«\®|þœLKóò¤ùùr‰¤4))»°°¬°°L{‹›M'sÁææ<²Ð„©)‡ll޽Ý_BÿJKKkN·××;vìØÂ… …B¡F£ñññÙ½{w' ¦íà¦!„ÞP)))‹/þí·ß8ÎØ±c¿ù懣ë jM˜ðmAÌœ9¬äÛLÖÖ‚™3Μ9P¡¨ú믧—.%Ÿ9sgÛ¶ËFF>>8úù¹™™qÛ.f„B —Ëär™..õŸª®®)**ËË“I$¥ùùòü|yAÙ`aIzô†rww'+öv*„B¨S*))4hЬY³öìÙ“ŸŸ2wî܃ê:.„Z&|ÛPËVæ²Xú8àøå—ã23‹ââRcc“ÃÂN-_~ÜÝ]<`€ãÀŽ}ûÚëéQZ=`„Bo jnÎ37ç5Ö¡¢¢º¨¨¬  ´¨¨Œü#‘”•Èÿþ;W*U””(äreíS(¢v˜Çc¾È óxLm›Ïgòx,ƒÖö¯!„B½½‚H$ÆÆuïG‰ŒŒôððX»v-ˆD¢={öxyymݺ•Ë}…5v Þg!Ô˜ðíЬ­ÖÖ}'Oî«TV%$<½~=õâÅÛ¶]644èߟ\öëjfÖèÇu„B¨e šHdØ`%z-F#•*d2eI‰B&û·!•¾ø“—'Ó¶+*ªëŒOf„™L›Í`³éL¦>‹¥Ïå2™L}&“Æå2 èL&ÍÀ€Îf3˜L“©Ïç3™L}}}œ½ „BuZADGG/Y²D&“Í›7ÏÓÓsñâÅeee³fÍŠŒŒlì¬øøø Ü¿ßÔÔ4,,lÖ¬Y`bbB&X ‚¸víÚ”)S"""Μ9óÉ'ŸhOôôô,((000P©TP*•Æ Û²e YIŸ ˆ³gφ„„(ŠÕ«WÏ›7 íà`Æ »ví’Édï¼óÎÎ;›s–±±q€gΜÙÖo,·ÃU^•™^—îŒa¿–¯ÒT¿¼7ª§¨¨häÈ‘u-«/†tH»ì÷úõG••*GGs??·ûô±£Ñpß „BQe¥J*-—J•ÿd„•R©B&S(•Uee•¥¥JeµRY%“)•Ê*¥²ª´´²¼¼B¥R׊J¥ü“#¦±Xt.—I¦ƒ¹\»žr¹ …00`èéQX,}ÊdêÓéztºƒA£ÑôX,}== ›M' y"z©€€¨³ÿoÈO5uÄÇÇ{yyµfXLk#âØ±c&LÐu !„ÞRAŒ=ú‡~¸víÚøñãGŒE¶Ÿ‚ ß7XEEu||Æõ멱±É©©y|>‹¬ñÎ;.|]G‡B½®êê…¢R&S*•ÕÕr¹R¡¨ª•#®R*«e2™,.-­Ðh€,4!—+5MiiEMF¡¨¬®®yéµþ›)¦ëé½ø•Ì“mƒ¦-FA£QY,}²­§G10x‘5&àñþ-gÌå2Ìª*•RYÕt™LIÎûª«U Å‹Îee•55j¨©Q—–V•Êêª*Õ?g)ȆZneUÚü„¯T*%†††W¯^íÖ­p8*µ•¿Ÿ–Ëå?ýôS Óv&888**Šl5êüùó: F­VÏŸ?ÿÀb±xÿþýýúõkþ¹˜ðE!¤[A\½zuðàÁjµšJ¥Ön7ñý¨@ _´hH¥R‡£§§W;á{üøññãÇ“ÉüùçŸë'|ÃÂÂÈ5°ÉÉÉîîî2™ŒËåqúôi2í’a²áææ:iÒ$ÈÉɱ²²’Ëå,«é³ ¸ÕçH_ò1‰$¹ÜýSuæÈìüåîMû.ë:®ÎoŠ|ƒ142Ã:š\ö—ºzõ™Ï>‹Áe¿!„:Êã±ÈTìkR*«ªªTªŠŠj27Z]­V(*É,gƒ™bòD…¢ªºúEê³¢¢º²òE»¼¼R")%Û55ê²²ÛÜi4šÚÕµ9Ö¶F§S™Lý¦ûp8 …ÿÍV³Ù/²Û4ÕÚZ@¬]:ƒÏ‘¿þñÇG¯Ÿÿï×Ïl6»öÃÖµfÍš‚‚“––ãçç4ZSUªÛ!˜o¿ýööíÛ÷îÝ‹ŽŽž1cFJJJ«_!„j;l6ÈyKív¶oß¾páÂÍ›7ûúúΞ=»þ—VVVd£K—.µ¾d¾5++ËÎÎŽ“©Ïú÷¯áÚµm4ò½{÷–,YrçÎ¥Rigg·råJry©¶Ü^hhhjjjTTF[µjÕ¼yónܸA.ðyòä‰B¡èÁ¤¥¥yzz4ímŸ`bbb>ûì3kkëððððððÖŠ!„ê°†ž™™yÿþýÓ§O<8##£NmâuÔ¨Q˜>}:ù099ÙÓÓ³¨¨H,§§§ûøø@zz:…B²O7l …ÂÈÈȱcÇ€F£‘ÉdÚ¯r›¾Í«~Àd‚øíQ­Pßÿ!ïÁ¡:_ÏwMûáFÐ÷Ž-^ò zãÐézäšß >ýã°ˆƒöå—g½¼Võí»&<üt\\ªö&M„B! tpp¸sçÎÓ§O?ùä“ààપ'>ÿüó#GŽdggŸ;wîÂ… ±±±QQQ*Õ¿3™={ölذAçÁÈår‰DL§Ómmmoܸ¡Ã` %%åçŸf±XÖÖÖqqq­ B!Ô‘uëÖmùòåVVV^^^†Á`@IIIýžŸ}öYbbâÒ¥K³²²’’’BBBüýýù|þÔ©S¿üòËøøøÔÔÔùóç=ºé»pÈÁƒƒƒÃÂÂÒÒÒfÏž]¿RDƒg5p'¤ì[ò‹ Ÿ”æÔ->vÿ@^RtA·éæN¹ÚÀlo+þ™••`ò侓'÷U©Ôwî<}—ºƒAóòêâçç6|¸‡XÜÔì!„BmíöíÛl6›¬[7`À€ÊÊJ¹\N–·ûä“Oú÷ï?}úôððð=zÀÖ­[===ÉoÞ¼``` ó`ÒÒÒÀÃÃãÂ… 6l˜4iRzzºžÞëδ[üΔ––K$’íÛ·µJ0!„PG¶wïÞE‹íܹS$EEE ‚zzz>þÜÈȨvOSSÓk×®-Y²ÄÉɉËåŽ9ò›o¾€eË–•••7N©T6lË–-M\N;øŠ+”Jå¸qã¤R©ÏÉ“'›s–‘‘Qý€[å}è8ªêÇç‹’ŽJdÏ*,ûrUʺ»1{N6s 0a·Ú­Q¨6œù½ôô(ÞÞ¶ÞÞ¶PPPúÛoÿúëÃo¾ùeåÊÓÖÖ‚ýüÜ rÒVëC!„j7R©týúõ7oÞLKK#kÞi‘åö²²²´[r;88hŸ-++#ï»Ôy0=zôÐlÙ² 6dddÔµ=ƒ&“¹páB>Ÿ?oÞ¼ÐÐÐV !„jšZ 4Ö®ïwÞyðàAí#¿ýö[cçvíÚ566¶Î4mýúõëׯoN<µÿꫯ¾úê«W=«~À†<»òaŒäÑ™"Zã0Zðîf[žuë—õ9T}n:ÕV°¤Ã[ÇÔ”Ðk×®©ÉÉk/\øtüx¯ÄÄì?Üçâ:qâŽmÛ.§¥½dÛ„B¡V4pàÀôôô7>}úôâÅ‹µŸ"ËíYXXh+ñ=yòDûìðáà ‚ äõêÕ+!!A‡ÁH¥Rµúߥ+,V+l9Òâ`lmm+++ ºº˜LæëƒBéÜ… ˆ†„……é:4ôB~by̸äÌë²³-&ýâá³Ì²Ál/jk¸¢óíE¥R<=-==-/^XXvëVZllò–-—×®=O.û0ÀqȺ®#E!„PgV]]ííííàà’’²nÝ:(..& ‚‚‚Ö¬YãêêÊd2/^ ÿì‚¢­‚ghhxõêÕîÝ»À¡C‡|||lllÚ9///ÿùóçoÞ¼ÙËË‹ÜwEWÁŒ;vÆ ...ß~ûm=ÄbñëƒBéÜðáÛ^ç‹tÎÔÝ`ä‹‚ TßÝŸÇèõ˜i¡ëÐÞ.¸Â³ÇŒéöÝwAÉÉk´Ë~?þø ‡G8¹ì755O×1"„B¨sÚµk×Ö­[…Báœ9s>üðÃwß}—ÜêZ+,,lÈ!C‡5jÔ¬Y³€F£ÿ ­u;eÊ”›7o¶0QQQ—.]rqq¹{÷îÑ£GÉκ fùòå|>ßÕÕ5>>>::ºU‚A!„z)‚B/AªÒšø-9Çü“3¯I¹B\JØÞün5¦¨¨ì÷ßÓbc“ýõ¡TªÐ.ûõõua³ñÿ*B!ôv €ãÇë6Œääd‰DÒØÞ&Aœ8qâý÷ßÇ`Z AÇŽ›0aBĈB¡Î ,¯*õ|‘y7¶Ð‹SÿYU¥:ù¨äþùº~hæ:ÁDŽëMÛ–t@ØcÆt3¦[M:9ùy\\ê¥KÉGŽüA£Q½½mt0ÀÑÓÓR×a"„BèÍpáÂ…#FÔ?ºfÍš&Ntss5jTxxxyyyxxø!CšØÉÚÎÎnàÀL‹ƒA¡NiÁ‚¿üò‹®£è@?~¬ëЛ§Z¡~zEšz¾(÷¯R}¶WÜÀZÀ'Jn›]»X/K IDAT]®ö˜lêdªo€Û²é®ðE¯¦¸¸üæÍÇqq©±±Éùùr++™ù<Ø™ÃÁ:Ü!„P§¥Ã¾III .üóÏ?5ÏŽ;lmmÛ?Œ·$\á‹ê”þþûïÀÀ@]¢{IIIG}ÓsA6l¨¨¨¥RÉ`0‚ˆ÷òòÒuh S©T4M"‘Ô®Åÿ¦P«4O¯IŸ/~~[NP›wø£Â^/ªôÖ‘z¶¨$£¢ë‡f ®1Õ%Lø¢R«5IIÙqq©×¯§Þº•Ý»[æ6`€£‡‡˜Ü0!„BF)é€Ú&|BþÓŠ‰‰™8q⛞ b±X—.]²¶¶Ž÷÷÷§P(<á«Ñh>@§¿y2ËòªŽŽI2r`:ŽØ 7ba&÷ €I¨…(ÂÓÓÒÓÓrîÜwJJÊoÜx—ºwoÜÚµçML8ƒ9ùù¹ äÌåâ²_„B!„Bµ¥RéììlllliÙæu& ‚xý•¹ALž<¹µBjglsý §Ý,à€:,¬šŒZ¡¡Á˜1ݾþzÂÝ»W¯.›={P~¾|Þ¼Cnn¡Ã‡oŠŒ¼˜˜õ¦ˆB!„B¡ÖEÄÑ£GÅb1‡ÃY±bEtt´P(är¹‹/nâ011!‚ ˆÂÂBíSfýúõ666FFFEEE Ò`Ï;wöèÑC¥RÀ§Ÿ~¨½VaaacƒqîÜ9±Xldd´uëVò`|||ß¾}Y,V—.]öîÝKv+,,T©Taaa–––ÆÆÆ“&Mjzv¦ªPW+Ô >U'Û«QCzl‰ôiE»Ä…Z¾¨•99™Ïûαc!®Ý¿º§§øÈ‘ÛÇoêÚuåG8~<^&Sè:F„BuDCt× *•Jû)´C†Bu(‡¾ÿþ?ü°~ýú¨¨¨|ÿý÷›6mJOOo°?¹žL"‘Ô_X¶mÛ¶}ûöEGGÇÇÇWTT|üñÇ]´Áž}ôŸÏÿæ›oâããcbb¶oß®½–±±qƒoÛ¶íÎ;{÷îýä“O*++ 00pРAééé›6múè£òóóÉžß|óÍÑ£GOœ8ñûï¿çççÏœ9³‰AÚGµ¢æñùâ‹‹žô½ÿ0Fò’ÞÈøUzꃔ+Ÿgdß’·K€¨%°¤j+t??7??7xô(ï×_“¯_O]²ä˜Z­qs àèççÚ«— VûE!„PË””” CCëW¯vëÖ 8NkŸÐ«W¯:GzöìÙÌÓ©TjTTT+ƃBuJ‹/ãÆ€Ï>ûLÛ...~ÕÍHwìØ±jÕª>}úÀ®]»¬¬¬ ‹Åj~Ͻ{÷z{{ÿý÷;wî422jæàü±©©©¿¿¿J¥*--¥ÓéR©ÔÜÜÜÜÜü½÷Þ+**ÒÎöïß¿råÊÞ½{Àwß}çîî.—˹\nƒƒ¼ò[ù*ÔÕšçñ¥é—Jž^“V•Õ˜we÷^$¶Êo´&õLѽòÊóªÇ †m²ãˆôÛ4Bô:0á‹Úƒ““9¹òW¡¨ºyóqllòéÓmÛvY `÷ëg?t¨«ŸŸŸßÀ`„B¡Æðùÿ~&a³Ùµ¶ŠîÝ»ksÊyyyžžžÍ?ý®Ö‡Bµ6›  ¥N»222‚‚‚‚‚‚´G²³³›ßÓÖÖvĈ7oÞ9rdó‰DuÂÞ¾}ûÂ… 7oÞìëë;{öì~ýú‘dz²²ìììÈ6ÙÈÎÎvuump¶Sø·â§W•Õ˜¸±ºÏ4·ó340k<{«§¿IïìÊ-z¬ìâËiaäÀl‡ ÑëÀ’¨]±Xú~~n_=!!á‹[·Â.ô“JK—Æxx„¾iíÚóþ™®Vcµ_„Bµ¦{÷î :ÔÈȈÉdº»»ÇÄÄÇ ‚øí·ß¬¬¬víÚµxñbSSS‘H´wï^ƒ‘@¥Rùÿظqã_|A£Ñ»Dƒ¥÷êÔ’J¥d}@„B\._²d‰¥¥%N·´´œ1cÆóçÏɧÈúùùxvÂôô‹óço Xû쳟ïÛwîî]Œƒ€°xñb//¯‹/–••½üòË+V¬P«ÕìKo½õÖ*++¿ù曌ŒŒÌÌÌ”””6ÕØüüüÜÜ\ööÒNt}ôÞùóçGŒ±aÃ†ššš‡¼4èA4MÏš5ëÂ… ‡®¬¬<~ü¸P(œ:uªáŸêxbuËŠ+’’’rss‹ŠŠâããú©R©žzê©?üðÓO?ýÇ?þQVVƳwüt}sBH```BB‚««ëøñㆠ…ìúSO=µnݺœœœÂÂÂU«VÍž=»ÇoQÒ£uLmž‚Öiªãò9£:ܧÎk`æVÏàDW+iïN™€„‘`zææüà`ïà`ïuë”—×egffæ%%}•æççìâ=y²'Ç5u¦Ð/]¸pÁÒÒ’ËåB‚ƒƒU*Ucc£½½=!äå—_ž6mÚ_þò—µk׎;–²uëÖ6£Þ{ï½U«VÝ÷,]½}æÌ™;vŒ7.,,ì…^˜8qâÃ^$<´½{÷‰D"BˆƒƒÃ¶mÛ6lØ`fö¿âIïMì¡(Š}8X›E êº7ß|³µµuÁ‚r¹<((èÈ‘#ÝŠ\»v­OLL !ä¹çžûë_ÿš™™PUUÕõÍ !»wï~饗vìØ!•JSRRìììØõ7Þx£¹¹yÁ‚­­­QQQíûˆž¼TYu¡©òBcun³¦E7ûïaã,rO. £ý Ð'µ´¨Îœ)X¿þ›w‡ {iôèÄøø½))g««å¦N `0Š5uÆBrrr: (++KHH6lXhh(1x´÷… † …?ýôÜÚÚj¸¡\.·²²jhh¸o¿üò‹þX¿¿þÀh†J¥ò‹/¾ œ0aB·.¹÷BRSSM@ëâw±ðððuëÖuôªþsÃ?ÞwîÜéææfccs÷î]v1%%¥ÍoxüË/¿Lž<ÙÜÜÜÍÍm×®]ú*~çÓ§O»¸¸ìÙ³ÇpñرcR©T"‘lÙ²…aµZýÊ+¯888899íÚµK tþ ‘a˜ÔÔTÔ‚¤Êó §ÿ¯lô•OÆþúÙ´Kß­*ºœrçÞ–®ï jÖ¯ë½ áQB…ú(¶í71qvVV¹sIo¾ù'BÈ;ï¤ûéÓÿ½aÃñììBFgê4  )))Ù´iSYYÙ‰' _b2lذÒÒRv¥¸¸Ø0 ==}Ê”)ìã³;÷£÷ Ξ=ÛØØÑÝ÷@»téÒ˜1cºõ–O>ù䨱c?ýôSUUÕÊ•+ !)))AAA†F-^¼844´¤¤dóæÍÏ>ûì;w!†¾ìС%K–¾«Íø M›6u2’¨¿ËÈÈ ŒIJJzÄ›ô u­ÍÕêQ1s?õYqzLôÇžˆØùtiÞnË=Í/[ªκöóÆ[ÍwÔ½*<éý€›››Û”e˦(•šœœÒ3g ³³ ·mûA$L:"2Ò÷ñÇG Ö[So ¿Óh4'NôòòÊÏÏÿ׿þE©¯¯7¼göÉ'Ÿ\¿~ýèÑ£ÍÍÍ׬YC ª·'Nœ6Ümß¾}AAAœJ¥JKKÛ¾}»Z­~á…>üðÃNæ?À#ÓÔÔ¤¿õž|/Éd Z}ÿý÷ÙA@ÉÉÉcÇŽ•Édú bËåC‡:tèO ‹×ŸTÏÕÕµý»ØdØÛS!·nÝ>|8{ìååÕ•óvC“† ¥Ø]سÛB×14#/SÕ^WÔæµÔæ)ê [i ã&Ž|øÃo.+Væl«ªÈn9òÇ?ç4*ÆžgZÊÀ‚/ôWú¶_•JûË/%lÛïž=g,,øAA^‘‘¾aa#¥Ò.}£€~í¾;sæÌ™3gŽþË™3g¶y£@ HNNNNN&„äååQ¥ÿñ¾¢¢¢ý†ææmo4ÌAÜþ€µ`Á‚ tž3]?YHO_Õ5Ôf|;’ˆÑf$ÑkªRU]hª<ßTu¡Q(á-::ºG¶…î’+.¿¡UÑ|×~”…Ó«À•C|E¢!¼ÙŸÖ2ê&Ýãïw ³áp»=– ú8|¡ßÌôm¿·nÕgedg®_̰íwÒ¤á|>~· púb®¡ÄÄÄõë×wòF__ß?ýéOk×®U(k×® 7¼¥· OOÏHú˜µk׎7nöìÙëÖ­“J¥çÎcu"!!a×®]Eýýï‹‹³²²ÒOþшÅâôôô… nذAÿÆÀÀÀùóç¿ñÆãÇgF(Bd2™áÄ¡ûêd$Q·(eÚÛ9M•çšn•·ÜÓr¸C3 Cl\1q¨·¨›u 媆reK½&`™‘Q VÎüà·]ÅîB;o ªžÀeçc>{—wÏï }J`0 ¸¸Ø.[6eÙ²)Z-}ñbYfæõììÂO?Í yãÇ»GFúFGû;;£í``zà9}©©©/¾ø¢““Ã0AAAŸ|òI'ÁEEEš ôiŽŽŽgÏžMHHˆŠŠR©Táááiiiú™ F­^½zæÌ™---³fÍÚºu+1˜ü£?øøã_{íµ„„„>úhÇŽìwïÞýÒK/íØ±C*•¦¤¤ØÙÙ…„„TUUÙÚÚv1áNFÝ—ªQ[õKSÕ…¦ŠŸ[jÔl'­côÿ&„˜ÛõL3)Bš¹´çŽâ®¦¡B)/UµÖk!eã*ð_êHqÚVêÍœÑ]ýÐ5`fWt¤¶¶éôéß=+« ±±ÕÍÍ.8Ø;2Ò7$ÄG ÀßytI\\!$--ÍÔ‰@ï¢(*55uáÂ…¦N ' †ïbyyyþþþµµµÜ¤Bë˜Ôïßt,~Æ«5y-ŒŽá˜Q´Öx]ˆÃ%#fÙ…þí×R84-:E¦µN«¨Q·Ök}:pxFZ­ÓŸ*0·7³qZ»Ø,‡òÚ—z{ C“ÊsùGjÝÃÅÞ³;ü]ª]0ð98XÅÅMˆ‹› ÓÑyyU™™y™™×÷ï?/˜M˜àâåçåÕígY˜P·FB4 Z[) ±‹½{EAEé¨ÚK!ŽºYWôm=Ï’Ëqù–\¾%—oÅå[r{cÂ@trM±¼D©¨Ñh•4»Bq(s;3Ï {#ÍÑó>÷y4‰µÖk Òën|}¯©Jíè/9ðÍy¡ï@Á.—àà²fMô½{ÍçÎefæmÝúㆠÇÙ¶ßà`ïððQ"¦@_×­‘D„5W0I–°yÉ­óò+_Ü­¼ÐHq(F×aÍ·®¨¥â§ZÓ6`îg>CDíã¯Y«¨ÕðE\3!‡Ë§øÖ\.c&ä8øYðEܸÀ¡VèÑ(t ͨ›i†f$žB.ßHÑ:wûí¦JµºY§nÖ©:u³N£Ð©u ¿ö5:ÎØa”È~”…ÈongÆþÛÜ–gÂj8­cÊNÉo|uïvN“ÀÚÌg¾Ï<{ bœPð…AÊÞÞrΜÀ9sÙ¶ßìì“'ó8ÏçÿÞöì`üùª&ççç÷Ã?t÷] ¡¥“¬¤“¬Ê•y‡îÝøº–¦‰‘²/Í®:r¾½VE«›ušfš­„ªš´¡Ñï\n–—(Õ ZÛJë4´ºIÇ®?q`”yûøã-¬/jey"®~¸ÁŒ=%ÜâÇ·J*Tí×Ãÿåa´¬ydQ¾~C1‡FÙzÉG)Ój”:˜k%åó-¹<W`Åå[qÍ%Æ«g=3Ô躩h[è¬ÿ+·q%¸Ž˜)áY˜¬È&‡‚/ vú¶ß矼®®ùìÙ¢Ì̼mÛþ¿¶ßéÓGZYÿ~ÐÙ¸ §¾á<6~hAzÝÕýw•2-¡(†þ½òKë¡!ÄLÀ1pHfÀ†oðh³¢S3Z%Í·4Þõê»ÈQÕ¨eÙ>\VGVG‘å0#Ó xÆ÷ŸüгªIËq)Å·äPŠ'âr¸Ä¢ƒÓÞr5ºÞ_𭸱i£­œ0ÀPð0`gg¼í—á{Ì-*Êm¿0%fcVñ]âPôßú«ûîÊËU\G§¡ !›‡­qù—ßaŸ©G„¸[»ù-qìV¼t’U·âT{…‚/€†m¿õõŠŸ¾™]¸{÷™ Ž»¸Ø††ú{‡†Ž´¶FÛ/ "^^^¦Îzž™€3ò û‘ ì«~i¼òEMå…FÂáC|¡g)´EßÖßüoýÑÔ×ÑŽÂÿº÷ak+bÛ~iš¹v­2;»ðÌ™ÂÔÔ} ÃèÛ~ýý)Š2u¦½hÉ’%¦ÎS§&Bé$ké$ë†r嵵涨õ Mnç6ý·¾ôG9­eܦ۸‡u¯9Ša:|#tD&SüôÓÍììÂï¿¿~çNƒƒƒUh¨Od¤oh¨µµ‘Ñï`*qqq ï½÷ž©1½ÌÌÌ×_µ þB«¢/î¬.ʨWÜÕ yͶóŒ’ð­ð46¸|VAÁï¿Ï;s¦ðüùbšf|}¥‘‘£##}Ñö ÐÄÅÅ>|ØÔYô!¨õ ùïßn:ˆ¼gÛÚ¸aª$t ¾=F¡P=[”™™÷ãù·oËíí-§L1:*ÊׯÆÂÔÙ RÕÕÕMMM¦Î¢ñöö6u ЋPðèååu™™y™™yú¶ßà`ïÈÈÑãÇ{p8hûBi©Ó”~/·q8O±6u.0@ à лZZÔ¿þZvòd^FÆÕª*™åÔ©#‚ƒ½£¢ü­L˜€ªQ[ú£¼ä„ìvn³™?,`ùS' ¾Ž¾í÷Â…­Vçç猶_€ÁC«¤Ë~”ŸU^h¤(Êešµç ‰k°™€cêÔ`à@ÁÀZ[Õ¹¹e'OæÝyü½{÷øtY¶lÙÂ… WNŸ>- e2ÙŸ±»—ý ­cªm*ýAnôU+©Õ^$Pðèghšž5kÖ… >\YYyüøq¡P8uêT•JÕ#ûŸ:uJ&“Éd²ß~ûmÊ”)111 …¢GvîºE‹}ûí·­­­ú•ôôô¨¨(±Xœ’’beeõ`Ûö…K€žÕZ¯)<^÷Ã¥)áWŽÇßÌ?\kêŒL _€~fïÞ½ÅÅÅ“&Mrpp3f̶mÛ._¾lfÖ3Z,--Åb±X,öððX»vm}}}EEEìÜu3fÌàñxß}÷~%===66–¢¨eË– 8h©/\<ŒÞ¸ ú)ZËäl¹ýÕÒû¢®þ´á–¦U7áy§ÅÇüfm÷2uj&†‚/@?³ÿþçŸ^$.ŠÅb.—«ÿR«Õ&%%¹¸¸ØÛÛ/]º´®®Ž]§(êСCÎÎÎVVVo¾ùæÁƒœœ¬­­×¬Y£oss³\.—Ë奥¥ëÖ­ó÷÷÷ööþí·ß"""lmmÍÍÍýüü¾üòË6Y%%%7N.—3 ³qãF[[Û¸¸8ÃSgee¹ººRµyófvñüùóööö†¢¨}ûö±aûöíãóùóçÏ?|ø0våÊ•ªªª¹sç’?†H=ËäÉ“wìØA©ªª¢(êý÷ß'„Ü»wÃá”——w÷Òrrr¦L™baaáîî¾{÷ ¥^º ú#ŽU_Ôê4Þræ–+NDûìÛo¿ÝÑu=¤º‚Ö«ûkzj7€­—n€¾¬©J¥nÒ}iÆGž“_qvžbm&@ À}Clllllì}ÃÌÌÌ~þùgý—úÿ—e2ûeNNŽ——×çŸÎ\»vÒÐÐÀ¾zêÔ)†at:]›ãœœýÛÙ7666>÷ÜsNNNZ­V.—kµZv½  €R[[ËÆ¿öÚk„k×®±¯Ž=zÿþýìqUU—ËU(ldZZÃ0r¹\(VVVêt:''§¬¬,£—©ÑhìììÒÓÓ†;vìž={ô-üëÐ >IDAT×[[[kô,çÏŸwttd&>>þÕW_µ±±Ñjµ«W¯^³fÍ\š­­í|À®Ëd2£×Õ BHjjªÑ—h};·ñìû·öG_ùdì¯)QW:ß  ¿#„Ÿÿ—˜àêê:~üx†aâããï{]mØñT¹6é.<0ëÚù*k®·0 ÃЄ­ö2âbøº~›‘!ýMK>>>„ÊÊÊ^½ zCšªT%™² U]ÜUm4Ä5Ø&lƒûèX‰'ª½¾ýŒ££ãÙ³g¢¢¢T*UxxxZZZ›¾˜7Þx£¹¹yÁ‚­­­QQQ[¶léúþúR¦¹¹ùÔ©SÓÒÒ(ŠÚ¹sçêÕ«Ç—””ÔÐÐ0oÞ¼üü|ý»^}õÕ”””>øàÍ7ßlmm]°`\. :räHûSX[[GFFëŸ>·|ùò””ý!„Ë寯Æîرƒmÿ1ÔÑYf̘ÑÔÔ¤/ø644þ ×­KÛ½{÷K/½´cÇ©Tš’’óöÛow~]z:5›\ý/¿tå%i&„0:BHÛ:¯žR®ýáRžˆCq)¾—2#< .‡KyFK,‡yÂlC¹JÓ¢ãYp9f„gÁ¥¸OÄápñi âââiÓ¦BnÞ¼Iþ¸i©Wo€¤”kóÜ“—(åeJy¹RÛJsù;s— kS§0Q Óa ¥¸¸8BHZZš©yæÏŸ?qâÄ·ÞzËÔ‰ô"óæøÏ©B‡Ö{ZŽÕ¾±WÏJ*pe¡iÑÑ:F£ i£iÑÑZòøF‡Ñíã¿yºðÎoÍí×çìöú˜eûõ_wTËK•í Ê#fÚŠ†ðÚÇ·ÔjtjšPß’Káò)ô ÀC¢(*''güøñ}׈#8`iiùì³ÏÚØØ|óÍ7„N'•J5ͻᆱÁOQTmmmrrrZZÚgŸ}&‹ÿýïçææ^ºt‰’’’ò /DGG§¦¦~þùç/¾øbhhhzzú#º~€N§¦¹|#?5(eÚ£+nH†›ÛŽ0—x m=ÍÅÃ…èVèmèð€Gª¥¥åêÕ«'Ožüè£LKﺧ®×-Üòø½ü–ü#÷n~[GkÂP4ôùtcïcþø¿=º¾sø»´†V+hæÒ0[,§u !¤¥VÓ¦ ì<ÅÊhÁ÷û×Kî^Q´_Ÿû™ÏQûõœm·+T„CÚˆGÇ9íP®ÍkQ7ëØ®dô)@çž~úé¥K—ÖÔÔDFFnß¾]ìñÛ€ ë´­tÃ-Uc…ª¡RÙÈT¨Tº?ÿHµ+ù %f‹¿ñ3Ešƒ:|úŠAÒá{äÈ‘•+W&&&&$$˜:—ÞEQTjjêÂ… Ù/Õͺ’“²_×Õ^WP\vÈ!„Pâm¶ÎÝTy¶'/Uj•4Cu³Ž¢SÓZM‘N´XsÛÇçl¹ÝX©bæ÷xÃÆOÿ§»ÄX úèòµ×[Ú¯Ïÿb¤ƒ¯‘ŽæÓo—ÉJ”Ôÿ Êö1wV9Y; ÚÇ—’+eZÒ.ÞÁÏ‚/2’?ôY÷ÿ@/¡5Lk½VäÈ32E—!ŸMûM«¤9<Êʉoí,°’ ¬¥kgK°58útøÀ#cê,L€oÉù„ýÈ'ìï^V½W|¢^«a(ІbË‘}‡ØÃx§pG&¬rêVü¬^ŒŽh:†fÔÍ4C3j…ŽÑ±‡‘ê-!Ä~´……ѵâ÷´NÉB(ŽñO“×ÖÔßlÕÇë=q`¤‘‚òWKoÔ´”¹!dÆžO#¿—vßi¾«fù".õG Ùo±£…ƒ‘Žéšk ‚þ=Þ’£O[ì!Ĭ BHFF†ÑfÛÄÄÄGŸ À ôÛ§wšªÔÊ­ªQ«”ëZë5J™–òd†¿‘Ï·™ý‰·¹™È‘ß¾Ÿú|©!cDCƈ¦¼æ\rRž¸¶6¿¥¯|{Ûfk´YØ(¿ÅŽÝÚö'Þ†_êÔ´VÉBø–Æ'®vR7ëØ4!DûGAÙÜÖø·Èæ»ê¦*{̬ÙcŸyöFã³×WÔßlm¿sh”­—yûõ#‹óõñ†å9»}Œ ³7Tèóቸœ? Ê“^’Z32R£ðX]k½Öp…¦á!X¹äš« M Ý~ÝÑ_ij0òKÊ–ïÛ3,vŠŽŽîè¦Ãõë×?âdú öóC3¿^U2:5M‘x ŽÍ½òÅ]Å]F©Ó4Óêf¦•Ö¶êÔ úO;¼¬œŒ\ËoÑ4ëb3Éps ×\³pàYØ›ñ;øÄnô¶<èSPð0ž×g¾Ï|;Y‰R)Ó˜:ŒËçp|¬ýçÉÝ{@pp¢k·âçìñÖ@Ù¾föXäh<­I/Jõ½Éƒ‚²ÑöaBˆÈ`]cPlí¨á¢ø¤¬¡BÕ&BÈÐÇ,|Ϭ«)XÇ~9Jâi¤`ýÍ_ 닌¸SGÙŽ0Và^”ß­øc)”—‰Ÿ³ÇÇ葌ÕEò2Uûõ™[ libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - m -

        glom-1.22.4/docs/libglom_reference/html/inherit_graph_15.png0000644000175000017500000000456412234777146025207 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“ )IDATxœíœ}HSßÇÏUÃejs*Ú܃æ#ià2| µ0´jøÈL $* ÔXAe*EþQæ:R"šˆ‰:¹K,B™N͚̚:µfêýýq¾ßû»í)sóëîë¯Ï=÷Üs>;ïÝsŽç=D0 $ƒ•¹ 1)¤Þ–©·eaC¼Éd}}}æJ…d'`2™aaaÿ¿Æó%F²#$''%¶Ñ¬AîØ÷ )))j%äúmYz[¤Þ–©·eAêmYz[꽸¸xíÚ5&“ikkËd2srr¦§§á-AÄb±ñ2Ô‚ ³³³ÿ•f¹‡‹ˆ!zollœ>}z``@(Êd²¶¶6 …®R©Œžß`w —æùö7*++ÝÝÝ—––ˆ…J¥rmm žÕ (ú×F¶@¡P˜¸Yƒ;5ãp%''«¯ò~×ÕÕåçç8p€XH¥R­­­ñ˵µ5>ŸÏd2]\\x<ÞÜÜ,G¤¡¡Á`888Õ××ÓétGGÇ«W¯âjkk‰Š¢aaavvvžžž°šP(twwwvv~ôè`hh(&&†F£íß¿?((¨±±o­»»›ÅbUVV–••yyyÑh´””˜J¥º|ù²›››««ëãÇñäiiiñòò¢R©©©©sss‚\]]á„7ûüùsµÁQ(¦®-C“ï·““Skk«®»P¡ÒÒRooo‘H$‘HNœ8‘˜˜ˆßår¹³³³B¡pêÔ)<Ç0¬¦¦fbb‚>|¸  @.—777[YYÍÌÌΞ=;??/lll~ýúåïïáÂ…ÉÉÉ™™™ŠŠ [[[•J» ïéé¹wïžO¿T*år¹ð[ÏçóY,VOOD"‰ŠŠÿ¾Á€€€‘H4<<‘€ýù~ãÍ®¬¬à¼§§'--- À”Ã¥Í÷Û½mllz{{‰C”J%þ|}}_¼x+|úô ðãÇx·«« ðõõuµX×´F£Ñ>|c8 ñ Åœ1 “H$Dåššš0 ;räH]]¬0==mmm½¼¼ìååUYY ?|ø@|ªªª – ÁäÕô†Íb¶²²òìÙ³àààèèh@°ººjÞá"bœùœN§ŽŽóÆw›8_¿~õöö†1 d2¼´··XYY©Åº(///++c³ÙÙÙÙÃÃÃpd0Äø|~dd$NÏÍÍ%>Îb±“““‚ âáá±¾¾.“Éär¹ŸŸ¬†ÄœþþþÄäÕšíììd³Ù?~¬¯¯ïêêJMMÝ·oŸy‡K?†<_^^¿e*•úþý{µ: cbbÆ0 Ó醥755ÕÔÔtèСèèh8XpAʼnŒŒœ˜˜¸ÿþçÏŸ;;;‰·àèÐéô—/_ÂïøÆÆ†R©ôóóc0¸R©”øÔøø8 ÆÆÆ´&›e0§³³³½½]©TjÍßÄÃ¥Cô¾qã†\.çr¹b±X.—·´´ÜºuK­Îùóçïܹƒ¢èèèèÅ‹¹\.•JÝLãµµµ“““Ä 88¸°°Åb…„„`F¡P4Ÿúýû7‡ÃñõõÉÊÊÌÏÏ+deeñù|±X,•Jsss?ÈÌ̼}ûvooïØØ˜Ú¨¸¸EÑ‘‘‘üü|ŸoîÔ¶Å®8_ëèèÈÎξyó&›Í6w.ÿg®ynGÙz'%%%%%™; ‹`WÌç$&ƒÔÛ² õ¶,H½- -û5ÍÒFòE$…††Kþx¿™Lfrr²iS"ÙABCCÿøç© {ò¯L]ë·eAêmYz[ÿÓ-ˆ ûÝùIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1TableInfo.html0000644000175000017500000013204312234777147026402 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::TableInfo Class Reference
        Glom::TableInfo Class Reference
        Inheritance diagram for Glom::TableInfo:
        Collaboration diagram for Glom::TableInfo:

        Public Member Functions

         TableInfo ()
         
         TableInfo (const TableInfo& src)
         
        TableInfooperator= (const TableInfo& src)
         
        bool get_hidden () const
         Returns true if this table should not be shown in the list of tables when in operator mode. More...
         
        void set_hidden (bool val=true)
         See get_default(). More...
         
        bool get_default () const
         Returns true if this table should be shown when the system is opened. More...
         
        void set_default (bool val=true)
         See get_default(). More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         
        - Public Member Functions inherited from Glom::HasTitleSingular
         HasTitleSingular ()
         
         HasTitleSingular (const HasTitleSingular& src)
         
        virtual ~HasTitleSingular ()
         
        HasTitleSingularoperator= (const HasTitleSingular& src)
         
        bool operator== (const HasTitleSingular& src) const
         
        bool operator!= (const HasTitleSingular& src) const
         
        Glib::ustring get_title_singular (const Glib::ustring& locale) const
         Get the (translation of the) singular form of the title, in the current locale, if specified. More...
         
        Glib::ustring get_title_singular_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_singular_with_fallback (const Glib::ustring& locale) const
         Get the (translation of the) singular form of the title, in the current locale, if specified, falling back to the non-singular title, and then falling back to the table name. More...
         
        void set_title_singular (const Glib::ustring& title, const Glib::ustring& locale)
         Set the singular title's translation for the current locale. More...
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::HasTitleSingular
        sharedptr< TranslatableItemm_title_singular
         For instance, "Customer" if the table is titled "Customers". More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::TableInfo::TableInfo ( )
        Glom::TableInfo::TableInfo ( const TableInfo src)

        Member Function Documentation

        bool Glom::TableInfo::get_default ( ) const

        Returns true if this table should be shown when the system is opened.

        Only one table can be the default table.

        bool Glom::TableInfo::get_hidden ( ) const

        Returns true if this table should not be shown in the list of tables when in operator mode.

        TableInfo& Glom::TableInfo::operator= ( const TableInfo src)
        void Glom::TableInfo::set_default ( bool  val = true)
        void Glom::TableInfo::set_hidden ( bool  val = true)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/tableinfo.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__FieldSummary__inherit__graph.png0000644000175000017500000003263212234777146034476 0ustar00murraycmurrayc00000000000000‰PNG  IHDR›]ZKWbKGDÿÿÿ ½§“ IDATxœíÝy\wþ?ðÏ  €œZCð<±µ­µ+WÅ#¢U@ жþ¾Të¢õØ‚|ÔVª­­GUt]ìª@•SE׳õ\ 6ÑÕV¥ ‡ ÊD@$óûcÚ1 $&^χ|2ùø™÷y‘™d&MÓ€L¸.@ohÀH4à$ð ø£C-11‘~ñ÷÷ïÈ]@7aÇÏ2!!¡ãg íaóæÍ\—ð$Z@@@ÇÏÚCRR×%üΣ Ñ€?hÀH4à$ð‡&ZUUÕÊ•+ÍÌÌœ,XPTTÄ;¹\Î4lmmÏ;7|øpBˆ•••ÞgíÍmïÞ½¹¹¹999ݺu#„8::îØ±#**J(l—jmllض¥¥¥úÃ@QTii©ƒƒƒ‘Ž`P ñ¨3>>~ñâÅLœ±lllûP¡PDDD8;;;88–——3Ó)Š:xð X,¶²²ZµjÕD"‘µµõŠ+Øqqqê m(ŠºpáBïÞ½—,Y2nÜ8;;; ww÷ÄÄD¶ÃÑ£GÅb±ÝöíÛ™‰R©ÔÃãk×®}ûö‰‰aG»~ýzãA(Š"„8::–••5Ù‘ššÚ·o_??¿G±ÓišÞ°aC¿~ýìììüýýÙ• ¾ìøÚ:7»ÆŒ ݘ럚ífkk›––¦íYBˆT*]¿~½‹‹KFFFVVÖØ±c§OŸÎ>+‘HÊÊÊ’““ !“&MbÛ¹¹¹4MÇÆÆæåå©74FVèééyéÒ¥Þ½{/\¸0??¿¤¤$&&ÆÌ̬®®ŽéàããóðáÔ”¡PøìÙ3š¦û÷ïV\\œ’’bbbRRR ;pà@mƒ”––Ò4­£Ã믿~ãÆß~ûí­·Þš4i[ê¶mÛ\]]ÓÓÓsrr$‰ŸŸ_ãaÇ×ÑY÷ÓÁÏÏÀb¢ …ÂË—/³Ùð•ËåôŸ/W77·}ûö1nÞ¼Iyüø1óì¹sçhšV*•mõ´jRãDKJJ¢iº²²R¡P0³²²ØŒ „:tˆŸ™hgg·yóf¦³\.W(̰:a::0KAÓôµk×!̘C† ‰gž***555´–DÓѹÍk ‰†Æ:E"Qvv6ûP.—³t² \\\˜6Ó(,,dZZZBLLL4ÚmлwoBHeeeDD„———H$ Qïàää¤1~ttô† úôé3þüÛ·o³GÊ:i¶ƒ««+Ó4h!¤¸¸˜y˜ŸŸÄ|8ëää¤T*ٕИŽÎz\cÜ2Ä×××7::šy›@±±±¹zõªF±Xœ——Ç´™†H$Ò{%Ì ÛËË+//oãÆwïÞ=uê”zæD•º‰'Þ»w/))©W¯^ï¼ó›Å:i¶CNNÓÈÊÊ¢(ÊÙÙ™y(‰>ÌüiR©Tr¹|À€Ú–¥UŒ”!&Zdddqq±D"‘ÉdÅÅÅ©©©k×®Õè3oÞ¼/¾øB*•fgg‡††J$’~F—ŸŸ¯ÞhVCCÃÈ‘#ÝÜÜ233ƒƒƒÉŸÇ}M>|xxxxïÞ½GŒAÓ´¹¹y³ƒ0_ÑÑ!<<ü·ß~»yóæ¢E‹üýýÙo–GDDÈd²œœœooï&KbÆoagãÖ‘‡¸-ñÞ½ò[·4öÚ MonÜ((*’kL45:„O<:Mo¾¦~ÈÉhhP$%Iñ5f€ŽDÓ¥R•’"Ó8äd”–>‘ÉîvxEM?22òÊËkš|ÊÔT€¯Út $š~;vªK!óÏÔTÀ¶•J:-íÌ—Ô ]qpï ^rwwúôÓ)ìè¨cï¾ûÚ!Ïæ½²²ÖÞÞ’‹Ò:Ü{£]ˆDËvíšçë;œëB:u Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?(𦹮A«ôôôM›6q]E[YÙÙ=³°hàºVóððX¾|9×U´‘A¿G+((HNN溊¶przbŒq–‘‘‘žžÎum'亀æ%%%q]BgáïïÏu /Ġߣ´  ø‰üDþ@¢ð$ѪªªV®\éììlffæìì¼`Á‚¢¢"æ)Š¢d2™ç¥÷ pŽFЉ¦R©&Ož|åÊ•äääÂÂÂcÇŽ™››{zzÖÕÕq]t(#ø>Z³öîÝ››››““Ó­[7Bˆ££ãŽ;¢¢¢„B#^:Š¢JKKZ8?Þ£ÅÇÇ/^¼˜‰3–@ `*Šˆˆggg‡ÀÀÀòòrf:EQ‹ÅVVV«V­:pà€H$²¶¶^±bÛ!..N½ÑØõë×Çggggaaáî˜H™2e { WFF†ƒƒÃÓ§OµÕPVV¦Þ¦(ŠâèèÈNgŸe§Ó4½aÆ~ýúÙÙÙùûû·|‰øŒ6` -©ÐÖÖ6--MÛ³„©Tº~ýz—ŒŒŒ¬¬¬±cÇNŸ>}V"‘”••1—[Mš4‰mçææÒ4›——§Þ`TŸÅÀ.\˜ŸŸ_RRcffVWW·wï^¦ÃÒ¥K?üðC5”––j´5&²sd§oÛ¶ÍÕÕ5===''G"‘øùùµp‰tðóócÇ0F|H4¡Pxùòeö!Ör¹œþ3ÜÜÜöíÛÇt¸yó&!äñãÇ̳çΣiZ©Tj´5bK}|§*++ ÓÎÊÊbB§²²ÒÜܼ°°P©TŠD¢ .訡 ‰6dÈøøxfbQQ‘@ ¨©©iÛ±h`ìøpÔ)‰²³³Ù‡r¹œý “UPPàââ´™Faa!óÐÒÒ’bbb¢Ñn¹ÊÊʈˆ///‘HÂLìÞ½û¸qãRRR.^¼( G­£†6ÈÏÏ ¢(Š¢('''¥R©Ç%0R|ØÑ}}}£££™·!„›«W¯jô‹ÅyyyL›iˆD"}àåå•——·qãÆ»wïž:uŠœœœ0{ölŠ¢tÔ@Ó4ieÀ‰D¢Ã‡3—T*•\.0`€¾–ÀHñ!Ñ"##‹‹‹%‰L&+..NMM]»v­FŸyóæ}ñÅR©4;;;44T"‘ØØØ´d𸸸üü|õ!¤ºººòOJ¥²¡¡aäÈ‘nnn™™™ÁÁÁ„ŠŠ BÈ´iÓd2ÙÁƒuÔ`ccsäÈ‘ªªª¨¨(õYËåò&Kb¦GDDÈd²œœœooïÖ¬3žâô˜·->>ƒ bÆñõõ:t(ÓÖVÃþýû{öìiooÏ|–ÊL÷òò277///×(Œ^__.‹---}||سþÍ.‘8ÆÎ ïa›˜˜8kÖ,C®°YÓ§O9räêÕ«¹.¤E˜û£á†t`¼øpÔi˜jkk¯\¹rúôé   ®kè,híåĉãÆ[³fMŸ>}¸® ³0âë„ ÜÌ™3gΜÉu Þ£ Ñ€?hÀH´vÑР亀ΉÖ.¾ýö$B  ãÁgÌMÁŒŠIÏžÿ÷ÙgÕÕÝ纒Vóóó㺀¶3èk þùg®«hµÌÌÊþ3säHÇÀ@W®ki5ggg®«h#ƒN4#—šzÕÂÂìöíu]ºÁ»`ÞÀy4=«©©;zôM“§OëOŸ¾Åu9 MÏ~üñ¶B¡$„˜˜˜¤¦jÞ¦ ÚMÏRRdÌGJ¥ò§ŸnWU=ãº"€N‰¦OryÍùó¿+•*æ¡R©:yò7nKèThútâÄo*Õó‡E¥¤à·Ð:MŸ’“e„<ÿìX©T]¾|§´ô ‡%t*H4½))y|åJžJõ—oÃPuìØ ®JèlhzsôèuÍËhšNN–rR@'„DÓ›¤$©Jý,!„•JuýzAAA'%t6H4ýÈÏ/½y³¨©ë/(¡Ð$-í_@'„DÓcÇnÒôõ Êäd|â ÐpÕ¡~ää<4è%öanniÏžÖ––fÌC¡PðèÑ“=¬8ª ³À•êíB$Z¶k×<_ßá\йà¨ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰ü!TPXXøóÏ?sU Ÿ8;[Þ¸ñ˳gÙ\bôœ=<<^pôôô‚‚½Ô†& à/i5 UÐ4???ú…ùùùq½Ð^4¶µ°É_@cþþþúÊÏÏ/))I_£!HLLœ5k–ÆDœGþ@¢ Ñ€?hÀH4à$ðG­ªªjåÊ•ÎÎÎfffÎÎÎ ,(**bž¢(J&“é¯BýÈù‡É>œ:uêøñãÙ‡_}õ•‹‹‹B¡ (ª¬¬¬qmMNÔÐÁkŒ¢­`ãÂíŽýâ³Pß,,,<<|øŒ3 Å ŽÙ~Wï#·%ÑöîÝ›››{òäÉ7ß|ÓÑÑñ•W^Ù±cÇ7„Â&¾¯k,´ý¡h÷cÆŒ‘J¥Ì7™þùç—^zÉÙÙùüùó̳L¢Q5gÎ33³Ö`iii£F è·fuêõ°mõ‚?vlvOpvvŽŠŠ*((ÈÏÏoÛP°qõ>r[->>~ñâÅݺuSŸ¨ñ*R(ÎÎÎåååÌtŠ¢<(‹­¬¬V­ZuàÀ‘Hdmm½bÅ ¶C\\œz£±ëׯ7ÎÎÎÎÂÂÂÝÝ=11‘2eÊ”M›61222ž>}ª­$EQ„GGGàPŸNÓô† úõëgggçïïßò%jÌËËëñãÇ™™™„S§N?ÞÇÇçäÉ“„¢¢¢Œ=ZGmÉÉÉ/½ô’½½ýÖ­[Ù1«««+ÿ¤T*uo‚ .ôîÝûûï¿×]|“ëY½ÚÔ_G‹ÅvvvÛ·o'„444¬X±¢GNNN111æææ\Ü,Îwl–T*õððèÚµkß¾}cbb´í{ÝÃT. µÀhvC“?7®ŽÅרâÚÊk¼÷ªï6©©©ýúõ³±± Ð(²¥_×ÙìUr¶¶¶iiiÚže–dýúõ...YYYcÇŽ>}:û¬D")++KNN&„Lš4‰mçææÒ4›——§Þ`TŸÅÀ.\˜ŸŸ_RRcffVWW·wï^¦ÃÒ¥K?üðC5”––j´5&²sd§oÛ¶ÍÕÕ5===''G"‘°×6»DMruuݳgMÓ¯½öÚ¡C‡Ž=:`Àš¦SRRzõꥻ¶wß}·¢¢"!!A(>{öŒntÕS¼ŽÅ÷ôôdsußäzÖ¶5 öññyøðaJJ SdTT”››ÛÕ«WoݺÅSklÓ&ùùùéëºÎ–ŒÃùŽÍNéß¿XXXqqqJJЉ‰IDDD“ûžF·’’õ1«ªª>ùä“7ß|“Ö¹÷J¥Ò–oh‹¯±Åµ•×äÞËî6ƒ ÊÈȸ}ûö¨Q£¦M›¦{{5™WmI4¡PxùòeõÍÀËåì:rssÛ·oÓáæÍ›„Ç3Ïž;wަiæ}„z[Û.Þø©ÊÊJ…BÁ´³²²˜5RYYinn^XX¨T*E"Ñ… tÔІD2dH||<3±¨¨H ÔÔÔ´m‰hšþàƒþïÿþïÑ£G]ºtyüøquuµ™™Y^^^XXX@@€îÚ®]»ÆÎ‚íÐx^:?))‰MGñM®gm+P£àC‡©éææ¶ÿ~¦Û¯¿þª{å°:8Ñ8ß±Ù)vvv›7of&Êåò6¹ïitk|¾L \¸pÖ¹÷¶jCëX|-®­¼&÷^¶±wï^¦ÿõë×ÙÁµi2¯ÚrÔ)‰²³Ÿß'G.—³Ÿ± \\\˜6Ó(,,dZZZBLLL4Ú-WYYáåå%‰BBB˜‰Ý»w7n\JJÊÅ‹…BáèÑ£uÔÐùùùAAA̧HNNNJ¥òE–ÈËËëÊ•+gΜyã7¬­­»uëööÛoŸ:uŠ9‰¦ûÿŠÅâ–ÌBÇâ÷îÝ›í¦£ø&×s 999©UPPп¦íææÖª¡: ç;6ùóX/::zÆ }úô™?þíÛ·ïß¿ßä¾§Ñ9Æd?xøðáÚµkg̘Q]]­cï%­ÙÐ:_c‹k+O÷ÞË>pà@Ò¦l[Í××7::šIYBˆÍÕ«W5úˆÅâ¼¼<¦Í4D"QæÕ$//¯¼¼¼7Þ½{÷Ô©Sìô€€€äää„„„Ù³gS¥£æB«Ö—H$:|ø0ów@¥RÉåò´yÆŒsëÖ­ÔÔÔ &0S&Nœxüøñ«W¯6›hÌNß,‹ßÂWš¶õÜEöêÕ‹=?››Ûª¡:LïØ}úôQ?gçÎBH¿~ý!'N¼wï^RRR¯^½Þy皦›Ü÷4º1ùË~2УG+V”——ß¹sG÷ÞÛò ­cñï–M–§{ïe÷ fm´aݶ%Ñ"##‹‹‹%‰L&+..NMM]»v­FŸyóæ}ñÅR©4;;;44T"‘ØØØ´dð¸¸8f3³ Òè´wCCÃÈ‘#ÝÜÜ233ƒƒƒ !„iÓ¦Éd²ƒê¨ÁÆÆæÈ‘#UUUQQQê³–ËåM–ÄLŽˆˆÉd999!!!ÞÞÞ­Ygšúöí+‰:¤žhÿùÏ„B¡»»»¶Z¥Í›€¥m=kÔÓ’Ú‚‚‚Ö­[wíÚµÌÌLædy s¹#uðŽýþûï¯ZµêôéÓ%%%ÁÁÁ3f̰³³#„ ><<<¼wïÞ#FŒ i:$$¤É}O£›¹¹¹ÆLÍÍÍ)Šª¨¨Ð½÷¶pC·vñ›-¯±uëÖI¥ÒÌÌÌÅ‹·a%¤MŸ Ð4}ÿþýÀÀ@[[Û®]»J$&­ÕO7Ô×ׇ……999ÙÙÙÍž=[Û)ªÆmBHll¬FCT*MKKëÛ·¯™™™§§çñãÇ}|| ÄŒãëë;tèP¦­­†ýû÷÷ìÙÓÞÞžùȉ™îååenn^^^®Q;½¾¾><<\,[ZZúøø°gý›]"mæÌ™cccÞ¿ iZ,O:•}¨­¶&Ï[5žW›7ÛÖ¶žÕëi²6ÒèDä³gÏ-ZdkkÛ¯_?æ|ù7t¬FŸG£;vÇV(ß|óÍ Aƒ,,,úõë·råʪª*æýøãîîîæææ...жïit£›ÚÇŒóðáC{oK64³[¸øÌô&ËÓq ›²~ýzWWWkkë™3g>zôH÷Æj2¯(Z-2˜;¨ÑBĈLŸ>}äÈ‘«W¯æºÐêÖ­[Æ +--µ··×Ý“¹ãã‹ß©Q_ã@»¢(J*•Ž1¢…ý›Ì+þ\×Y[[{åʕӧOq]ËNž<Ùøú$Š¢"""¸.­£ :ô“O>yòäIIIIdd䨱c›3€60¦/Cëvâĉùóç¯Y³¦OŸ>\×ò‡‰'õ^=JHHXºt©H$¢izÔ¨Q»wïæº"08zy±ð'ÑfΜ9sæL®«€¦¹»»ÿôÓO\WüÇŸ£N$ð ø‰üÑÄ'züÙWh¹'OºZÙÙ=³µ}Ö¥‹’ër BFFÆ[o½¥¯¡ŒhÇnh0‘ËÍår GÇ;»g\—c š¼Šñ/‰æìììçç×QõÀ_XYÕ››+srl !–– ööOmmŸvëÖÀu]\zë­·<<<^|½ ÒjkM+*ÌËË»ÖÔ˜Ò4qp¨Eœé ‹ç…/LŽgÏþö·wï–Ñ4-  eϞݧLyeâÄ¡o¾ébjÚŽ·¥®Ô×+ÒÓsOºyüø¯U ¥RIQÄÁÁêâÅðîÝ»r] ‘A¢–[·Š&NܤTªØ)B¡@¥R &o¼ÑoâÄaS§¾Ò³gw+½xð òøñ_OœøM*ÍS©h…âù©*5õï#Göç°B#…D38ß|srëÖ3ê¡Æ01¡hšPyýõ¾É+“'¿ìädËI…Ðf‡]KK»ž™YDQsËU>ɼyo¯[÷.';$šÁihPNš´9;»X¡Ð µ?QB!uìØÇ/¿ìÜ¡•Á +,”{{U[[§íe'šˆÅvgÏ~bnnÚ±¥ñ¾½apLM11ó…B¶ˆQ½ví»ˆ3c$ÛîÚLˆ®{Ãýûß gm†D3D}û:DDLmòžˆ¦¦‚ Üßÿ펯 ôâo2oÞ( ‰—EQááS|©ã«â u(š¦gÏÞ•‘‘ÛÐðü„±PhÒ½»ÅåËŸZ[[pX¼ úzÅèÑë‹‹+ÕO,…‚×^듚úwƒ»»¯Á{4EQÔÖ­ff¦êïÔT*Z.¯Ù¹óœöSl`èêë_~y¬°°‚Š=ü¤(Ò¥‹`Û¶ ÄÙ B¢®—^ê¾nÝ BþxmbB-_î³k×üÿû¿É–»wõüKïÐnß~0~ü7II²={>ˆŠšAQÏ¢¢f:;ÛqX? Ñ š¿ÿˆwÞÔ¥‹ÐÔTðê«}–,/‘¼ræÌJSS“ ¾IMÕü¥"0X4MÇÄ\œ2e³½½å™3+'N6gŽÇرCLM¦¦‚wÞð×5òΣº‡«¼¼6Ð4}îÜ'ìДß}wfóæÓ3f¼¾aƒ×®]¸-t“Ëk–/?xölfd¤ïŒf-+*jÆŒÙÐР¸xquVÜÉH4#–ö?¡P0yòËÓ/^Ì ïÞÝb×®yC†èíçPA¿.\ÈZ²$¾k×.;vÌ}í5Í[Æÿ÷¿wžµuë™wÞ´yó{öö–\WMC¢uR5üÃùó¿ã’©f=|ø844þ—_ò#"¦âëf‰Öy1—L}ñEÚ›oºlÛÔ³§5×¢3gn-_~°{w‹;ƒ‡ s]4‰ÖÙݸQ°hÑþêêg[·y{âºÂ~ëåƒFú©¿¡ih@ª«ëÂÓº†K¦X¿ÿ^¼hÑþ’’ªo¾ ˜2å®Ë–B¢Á’’¤«V%øRttpŸ>ö\—Ã¥˜˜‹_~ylØ0ñŽsÅb[®ËV@¢Ás99.ÜWXXñõ×¾¾¯r]?®]¹2ñäÉß>þx<¾nfŒhðuuŠuëŽîÙsÑÏoÄW_ù[Xt¢K¦~ù%oñâ8¥RµmÛœQ£\¹.Ú‰M8qâ·+öèa½sgðàÁ½¸.§Ý1_<ÞºõÌØ±C6mšmg×늠hд¢"ùGÅþö[áêÕ~_2U\\ÿ¿ÿÝß°?qbôh •B¡ÚºõôæÍ§'O~ù›ofY[[p]‘þ¥¥]ÿä“D''Û;çð×åÀ‹B¢A3þûß;¡¡q]º££ç¾þz_®ËÑ›§OëÃÂ’’“e xEDL53ÃOœð šW^^½té/fñæ’©ÌÌ‹Å>zTõí·³ñ{æ|‚Dƒa/™òðpýî» =Œø—Abb.FE}õÕ>۷ωl¸.ô ‰­pýúý>Š­©©ûî;£üõ6¹¼fÅŠ„Ÿ~ºýÉ'“.ôðu3¾A¢Aë|-,,©woû;ƒ]]{p]´;$¼¨ãÇ]±"ᥗ¬wíš7p ¡|Iµ¶¶><<)%åêŒÆ×Í:$èAa¡ü£b33¬_ïçç7‚ërÈÍ›E}´¿ªêéÖ­Fù™,´ ôƒ½djÆŒ×ׯ÷ëÖÍŒ“2T*zçγ7žôôtݺ5ÐÑш¿7m€D}ºt){É’ønÝÌvíšçîîÔÁsôèÉ’%ñéé9‘‘¾ø‰“Î ‰zÆÜ´ãæÍ¢¨¨³g¿Ùaó½zõîÂ…ûU*zûö9.6_0(H4#`„ï5L¬¬ÞR©žÕÔ\ë°YvéâÔ­Û«ÿ¨R=ë°™ê^ƒz„D3E}üñÇ\z–žž¾e˼õi€€®«ýÛ²e ×%ð ®Ôþ@¢ Ñ€?hÀH4à$TUU­\¹ÒÙÙÙÌÌÌÙÙyÁ‚EEEÌSEÉd2=ÎKï©Fd2™B¡ (ª¬¬¬U…éþ/Ð~ðí žP©T“'O¦(*99¹ÿþ<ؽ{·§§gvv¶™7—X£sçÎ þü^oVVV&&&±±±VV¸>Ô8 ÑxbïÞ½¹¹¹999ݺu#„8::îØ±#**J(4âMLQTii©ƒƒC §¿8KKKÍßR™3gŽÞgíG<¿xñb&ÎX666ÁóßP(ÎÎÎåååÌtŠ¢<(‹­¬¬V­ZuàÀ‘Hdmm½bÅ ¶C\\œz£±ëׯ7ÎÎÎÎÂÂÂÝÝ=11‘2eÊ”M›61222ž>}ª­ö0i3×~9::j¾©O§izÆ ýúõ³³³ó÷÷oùiS]]]ù'¥R©^¶y1êêê>þøãž={:::~÷Ýwºç툃GIHHÐÝÇÖÖ6--MÇR©týúõ...YYYcÇŽ>}:û¬D")++KNN&„Lš4‰mçææÒ4›——§Þ`TŸÅÀ.\˜ŸŸ_RRcffVWW·wï^¦ÃÒ¥K?üðC5”––j´5&²sd§oÛ¶ÍÕÕ5===''G"‘øùùµp‰´­%u³Ó1/©TÑ»wïK—.eee3F½rðÔ/¬M#Ð’D …—/_Vÿ/ ¹\NÿùªsssÛ·oÓáæÍ›„Ç3Ïž;wަiæ]‰z[#¶ÔÇ×xª²²R¡P0í¬¬,æ%]YYinn^XX¨T*E"Ñ… tÔІD2dH||<3±¨¨H ÔÔÔ´m‰š\(õÙ阗T*íׯߞ={˜goܸDã Ž:yB$egg³år9ûA'«  ÀÅåÛì0ÂÂBæ¡¥¥%!ÄÄÄD£Ýr•••^^^"‘($$„™Ø½{÷qãÆ¥¤¤\¼xQ(Ž=ZG mŸŸÄ|.éää¤T*õ¸D-Ÿ!¤¸¸xÀ€L›m@ÇC¢ñ„¯¯ott4{êÇÆÆæêÕ«}Äbq^^Óf"‘H_xyyåååmܸñîÝ»§Nb§$'''$$Ìž=›¢(5Ð4MZp"‘èðáÃÌg•J%—ËÛ/MtÏK,³QrrrÚ©h'"##‹‹‹%‰L&+..NMM]»v­FŸyóæ}ñÅR©4;;;44T"‘4þ\¯Iqqqùùùê Òè$zCCÃÈ‘#ÝÜÜ233ƒƒƒ !„iÓ¦Éd²ƒê¨ÁÆÆæÈ‘#UUUQQQê³–ËåM–ÄLŽˆˆÉd999!!!ÞÞÞ­Yg­£{^sçÎýüóÏ/_¾|çÎf?€vÄÙñ.´iÁy4š¦ïß¿hkkÛµkW‰D¼R?V__æäädgg7{ölm§¨· !±±± uR©4--­oß¾fffžžžÇ÷ññ4h3ޝ¯ïСC™¶¶öïßß³gO{{{æ³Tfº———¹¹yyy¹Faìôúúúððp±XliiéããÞõov‰´­gçÑtÏ«®®nÙ²eÌgû÷ï'8ÆÜñÑP•`¼÷G›>}úÈ‘#W¯^Íu!'11qÖ¬Yx êŽ:¡ÕÖÖ^¹råôéÓAAA\×ò‡“'O6¾Ú‰¢¨ˆˆ®K=0â/”ƒá;qâÄüùó׬YÓ§O®kùÃĉñžˆÇhÐŽfΜ9sæL®«€NGÀH4à$ð Ë“'Ïž<1²ŸÃOŒCzz:×%t+WQ5r¤#×…t„γY; ¾ak˜;‚uvv3¡+*q]HÇÁkPðÍtž=þáÃǯ½¶–¢ÈÇU=zàFØÐj8äøñßLL(Š¢Žÿ•ëZÀ(!ÑÀ€$&^¡iZ¥¢®p] %$Š»wËnÜ(T©hšVýúkáýûåÍÿ€¿B¢¡HK»njÊüÎ %š9ò?Ž #„DCqðà…â{ð*ª¤$)·õ€1B¢AÈÌ,¾{·ŒýP—¦éœœG¿ÿ^ÌiQ`|h`¾öç!çºt>|«zÀH!Ñ€{4M'&þÒРTŸX_¯LN–užïâ^ Ñ€{×®Ý{ø°ªñô*¯]»ßñõ€ñB¢÷Ò<ädàÀZ ‰S(T©©2CNF}½25U¦Tª:¾*0RH4àXFFneåSSS“.]„]º»tté"`Ú¦¦&rymFF×5‚ÑÀ•êÀ1SSÁ§ŸJ؇©©W !3f¼ÎN ñwZ wÃòá‡û!ÿüç<® £„¿~ÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4àЦi®kà•ôôôM›6q]…«¨° „ØÙ=åº#¶|ùr®«à†ëø¦   99y̘1\bÜJK¹®Àh]¸pÁß߉úôÙgŸq]tRÞÞÞ\—À%œGþ@¢ Ñ€?hÀH4à$gjkkwîÜ0~üø€€€¯¿þº¬¬ŒyÊÛÛ;++KóÒû€†0GïF²²²”J¥··÷ãÇ[Uû_êêêbbb'L˜ðî»ï®ZµêöíÛíº _øö7hš £(jíÚµ½zõ*//?zôèâÅ‹ãââLMM¹®ÎhlÞ¼ÙÕÕ•}صkWŠ¢V¯^ݵk×¶ ¸mÛ¶[·n………õéÓ§ººúüùóË—/OMMmó€ÐÁð'Ož|ðàÁ×_=xð`—?þxÏž=€ëÒÚNÛ›#Ýoš^„………¥Š¢Æßæ¿ /^\´hÑ+¯¼bcc#‹çÌ™“œœlnn®ß²¡ý ѸqæÌ™éÓ§k¼T˜×$ûP©TîÙ³' `Ú´iëÖ­«ªªb¦{{{Ÿ={ÖßßòäÉÿú׿~úé'??¿)S¦DGG³Μ9£Þh,''gÅŠ¾¾¾>>>ï¿ÿþùóç !áááIIIL‡Û·oO›6­®®N[ lH1mæ‹Ó§O×/õé4MÿðÃï½÷ž¯¯ïgŸ}Öò%ÒæéÓ§ÕR©Têõh›£¡¡aûöíï¾ûîôéÓSSSÙéB¡ðáÇMn”Æ‹ÜÂm¡£C“[ù_7nܘ5k–···ÆQ(º×I'‡DãFNNŽ‹‹‹î> gÏž]»víŽ;***6nÜÈ>õã?îÙ³'<<ü‡~8sæÌ÷ß–””T\\LY½zµ»»»z£±Ï?ÿ\,ïÞ½ûàÁƒþþþ_~ù¥B¡ðöö¾páÓáìÙ³cÆŒIIIÑVƒ†sçÎB>ܽ{wmÓ>|üøñÈÈÈ]»vÕ×׫_«{‰´Y¶lÙÔ?ݹsGý)ó"„ÄÆÆ^ºtéóÏ?ß¾}ûÅ‹Ùé³fÍÚ²eËgŸ}vúôéòòr³nyå::4¹˜ÿõ¯ý+""bÙ²e[D(Ä™"]°v¸Q[[«þÊg¯\9zô¨¥¥%Ó>qâļyóLY²dÉûï¿_[[˜Р°¶¶=z4!döìÙl»ªªªW¯^ãÇgF`íܹÓ‚y÷ñòË/744ÔÔÔ¼ýöÛ›6m*++³··?þüš5k6nܨ­†68räÈûï¿?dÈBÈŠ+êêêÌÌÌš]"mîÚµkàÀ­!äÇœ?þ°aØåZ°`3}Ö¬Yîîî.\HHHذaƒ««kHHȈ#t,T³•ëèÐäV`v ÿaÆõïßÇŽê[¤«»SB¢qÃÞÞ¾  `èСÌãGÖÕÕùùù©÷yôè‘H$bÚL£´´´OŸ>„ BEQí–«®®þá‡nÞ¼YTT$‹™‰Ýºu{ýõ×/^¼Ø¿@0lØ05´AIIɺuëÖ­[ÇN)--eæþâKÔòyBÊËËÙ6Û „ÔÔÔ <˜Ù.ååå±±±‰‰‰ÖÖÖÚfÔlå::4¹={ö$Mm‘¶­Î‰ÆQ£F9rd„ ÌßgKKË_ýU£££ãƒ˜ÃFæÆÞÞ^_,Y²dÈ! .tss£iz„ ÌôwÞyç?ÿùϽ{÷ÆŽKQ”Ž˜ûP•¶æ.ööö}ôѨQ£˜ÿ^SSþ!Õ;Ýórtt,,,d¢¨¨ˆ>oÞ¼åË—{zz2#„„„9r¤ªªŠI´6,²nÚ¶QK=-¢¯YóΣq#88¸¼¼|ÕªUYYYååå—.]Ú·oŸFŸØØØßÿ½°°pëÖ­-|ýŸ9s†I¶ADW*•ƒ‹Å÷îÝûòË/ !OžkfƘé>>>{öìÉÊÊ***úöÛo—-[ÖšuÖ:ºç5a„}ûöݼy³°°Pýó‡1cÆDGGK¥Òòòò»wïîØ±ƒYKDû"¿m[AÆÝð666Û·oß½{÷?þñúúú×^{í³Ï> TïóÞ{ï=}ú422²®®î7ÞX²dI ÿòË/W¯^Ý«W/¶AQIïÚµkùòåÛ¶m‹‰‰0`Àܹskjj>ýôÓ}ûöuíÚõõ×_ðàóÁ…¶BCCwíÚµ{÷îÐÐд´4fâË/¿¼`Á‚ääd+++õzØéuuu‘‘‘ÕÕÕîîîŸþy[×_ótÏ+00°ººzÍš54M/Z´H&“1Ó?üðC æd¢­­íðá٠ѶÈ/HÛVPE@7ÜÃVÏgÍšÅ|Àg¤"""Äu!ð‡Vmooï„„„€€€ö®Ê0á=ôå¥:¯ÎouîÇœ{æü'çÞ‚Ñ4 x8ƒàºà9¯·àõàBV{zzz}}ýZB¹™hµÚsmú|XZZŠF)Šr:ƒPPP€l»ÝNÓ´^¯_^^f¬˜Íf3rµ»»ÛÙÙ©R©¦§§m6EQ(~8³©©)!!áË—/‹‹‹999ðïh¡­ÓéÔj5´kkkŸ={'¤¦¦šL&‹Å’••URRâoŤ¤¤ÆÆF‡Ãa4Á?ä~/a§ŽÕ¾¤B¡pjjŠyK—Ë…î099¹··Nøþý;àààŽNLLÐ4 s¦òÂŽÒÏLnZZZ__ìÙÜÜ ;>>FW)Š÷ïßÃÑ………ÀzìïïGDDlllx<‚ &''áN'ÌÏÏH’ô¹¢T*íèè€ý.—ËívÈ¡O=‚¬WAX­V¦ èp…X__W*•Ð†ÆÆÆlŠD"€@ `ÙÁ±²²RUUHñññ-p8÷î݃62üqûöíGÆÏŸ? …Âììlfü€””x#>Wìîînoo—ËåÕÕÕ‹…Y½/IY(..îîîFuÇñ¹¹9Ö’$———¡ ‚ ‚[.0A ÃçëììÌår1óN’$ztl6Û…Þ´Z­Á`¨¨¨À0 vÚívh,--îܹãsÅüüüÕÕÕÁÁÁ»wïæææz?£Ãú½\²^moo“$™ŸŸo6›·¶¶ŒFcff&8_¯ZZZ’““gffàþAQ”w}ðiûÜ?Ô«æææôôt³Ù¼´´ôôéÓŒŒ ¦Ãææf¹\þõëW«Õúøñc°^Ñ4}pppëÖ-ÇçççÑ•J533c±X²³³)Šò·bbbb]]Ãá0 B¡ž5üÊýƒ¦éµµµÊÊJ‰DIQü0õ8==mllŒ—J¥( êÐëõ,#€§§§/_¾$IR$åååÁCºêäääÅ‹ð|õáÇ õ iº¸¸øþýûÌ mmm*•*::Z£Ñìììø[q||<===""B©Tö÷÷N`ˆõøƒ)))immEMOÃ$”ûùŸÊÏŸ?¿}û666VUUu-ü®×éÿ)£££ÕÕÕ¯_¿–Ë娓¾Â¿ òzœC£Ñh4šk €¯W܂׃[ðzp ^nác?7™LåååWÊMƒù‘ ÁÖC­V_I0<€$IïçbWy¸æ¹~ÿà¼܂׃[ü8ž ±À=¼IEND®B`‚glom-1.22.4/docs/libglom_reference/html/open.png0000644000175000017500000000017312234777145023007 0ustar00murraycmurrayc00000000000000‰PNG  IHDR à‘BIDATxíÝÁ €0 Ð׬ՙ\Àº€39—b!©9{|ðI>$#Àß´ý8/¨ÄØzƒ/Ï>2À[ÎgiU,/¬~¼Ï\ Ä9Ù¸IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1DatabaseTitle__inherit__graph.png0000644000175000017500000000717012234777145032266 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“-IDATxœí}LSWÇÏ- ‹+å%¡-ÈxaĹéÜÀ‰Ã¨¨«È“f(Ó•Œ¡Ì2`ȈƑ…—S›PT ›Û‚ƒ-dÜíî®”Rkm÷ìœOüãwÏýú»¿{¾ôœÛsÛ^‚$I€A†¹ À˜ì7Z`¿ÑûØoÄ iÔÔÔ˜»Œ‘ §[l¹P]ÿ×——§Ñ¢ÅïÈÈH“ƒyêˆD"<£ö-°ßhýF ì7Zè÷ÄÄÄ»ï¾ëêêjmmíêêzðàA¹\w!‘HŒW! ´aÄCßÎÎîäÉ“ÕÕÕ\.wÅŠÉÉÉ” ¢¢‚,Aß~û­››[bbâÖ­[9“Éô÷÷¯­­¥b±˜Ïçs8œ‚‚ØØÞÞ`kkëîî^RRBe»uëÖÂ$AœœœFFF´ W®\qwwg³ÙáááCCCT;I’¹¹¹Ï>û,‡Ã‰ˆˆ :~ TþÅÄKöØã±pýœ\ {{ûÆÆÆÅöÂ>ýàƒ<==oܸ!•J·lÙFí###uuu€;wRqWWI’åååÝÝÝô@#3}300°µµÕÍÍíðáÃ===ƒƒƒ%%%ÖÖÖ*• BBB~ûí·Ë—/[ZZþþûï$Izxx…B…Bqùòeƒ188Óúøø,–dxx˜$I‚uëÖݾ}ûîÝ»¯¼òÊÎ;©Róóó½¼¼ÚÚÚd2™@  –²é'Bå×!ÖÝc:×X?7ÄoKKËï¾ûŽÞïÑÑQêd¼½½ËÊÊ  ££0>>÷¶´´$©V«5bº—ZYè·H$"Irlllnn6J¥RªW¯^¥òÃF‡“——Å£££sss0­Ž$0Ð!€gA’äÍ›7<€9ýüü*++á.¹\naa155E.â·±Á=¶ÐoCÆs.—ÛÙÙI·™º8§èëëóôô„1 úûûá&‹Å0 ØÜÜÜccciiiAAA\.7>>ž.àñxù‹ŠŠrssW®\yàÀ{÷îQsŽ$K ¼¼¼`°zõj€B¡€›===ûöíƒo(x<žZ­¦:a!:ÄFì1Cþ[hhhQQü°Ùì~øACÃçó»»»a .—kX‰:€§ÔÝÝ}öìÙ_~ù嫯¾¢ àIgÇŽ½½½"‘ÈÅÅåµ×^£þRu$YR “É` •J ‚puu…›\.·¾¾¾°æççGGGW­ZµØ¹<–Ø` ñ;==]¡P‰D¢P(®\¹’™™©¡Ù¿ÿûï¿ßÞÞÞÙÙùöÛo =¯«+**zzzèÁ’ÌÎÎnذÁÛÛû矎ލZY»vmJJŠ››ÛúõëI’´±±Y2 |C¨C’’r÷îÝŽŽŽ#GŽDDDPïcccÓÒÒ$‰L&‹ÖZ̯§øI¡îzÎß$Iþúë¯111ööö¶¶¶¾‚éó÷ÌÌŒP(äñx'** NQ §®…1 ¼¼œP€ó7Üllltww·¶¶ ¼víZHHÈêÕ«æ‡5\¿~ÝßßßÆÆÆÓÓ³ººš’-–$((ÈÆÆF©Tê8Jee%dz··ß·oŸF'¤¤¤ðù|‹B]^Ñ £òë#^,^Œ…ó7AÒ.¸jkk÷îÝKoÁü_þ~¯Ÿ£ö-°ßhýF ì7Z`¿ÑQ¿Š1s—`´Ü±¦ßéû·RR"ŽöX¾ÜÊÜ…<]úûûù|þßšè‹/ˆ|³„Á°qqI´µ}ÎÜ…˜]ëkˆpñâw©©u6xÔ׿mîZL Šó÷Õ«‚IÏÐÐCs×bjó»¯ïDÒK’€Á êëoš»Sƒœßbñ- @­ž¯«k7w9¦9¿kkÛÕêyI‚Žyw÷°¹+2)hù-•vvR—¨VV ?š·$ƒ–ß?ZYýõ¡éÙYumíÍXéAÈo’$kkÛggÕôÆÞ^åO?i~Øò_ B~ß¾Ý'—j4ZYY^½ŠÐU:B~××ߤæÙÙ9‘¨E'TüV«ç/_–h æáá‡É/&¯È< â÷ÝJå”Ö]VVè,¼ â÷gŸÝ€X¶Ìþ³²² bµšllü¾)ÿ×óT¾ÁûÄߟwêÔëÔæéÓŸýç?/úùýõ•—±±i–9J3)(Þp¹ÇΟߺÖÜ…˜TÆs ûØo´À~£ö-°ßhýF ì7Z`¿ÑûØo´À~£ö-°ßhýF ì7Z`¿ÑûØo´À~£ö-°ßhýF ì7Z`¿ÑûØo´À~£ö-°ßhýF ì7Z`¿ÑûzýžG[[Û‡~h‚jL†\nÇáüÎdΚ»£püøñ%ezý^O___]]ÝæÍ›Ÿ¸ª Ë– ON‚ÉIs×a$îÝ»§§ò1~Ÿ)##ÃZ0Oý­Áó7Z`¿ÑûØo´À~£…‘?uzzº¬¬¬¥¥ettÔÞÞ~ýúõo½õ–££# 88øüùó>>>Æ:Vpp0  Njݺuë&¬¯¯æ™gŒQÝ 6&$$,<ÑûG+Æô›$I¡PHDff¦‹‹‹R©‹Å VVOåIyyy^^^ÓÓÓmmmgΜ±±±yõÕWŸÆ C,Ã`÷îݰT“ÉLMMµµµ5KIÆÏ¿üòË3gÎøúú²ÙlOOϤ¤¤ÒÒR ͧ  &“Éb±œ÷ìÙ}ñâEâàààñññ§T‰VXþ,•ÅbYXXlÛ¶ ¾L_’1ýnjj ³±±¡7²X,㯣¨ÕêÒÒÒÈÈÈ={ödggOLLÀöàààæææˆˆˆ]»v}òÉ'_ýuxxøë¯¿^TTD šššè[¶léêêzøð¡L&KNN ‰‹‹ûæ›oÀŸCkXXØøø¸V¤µµ5**J ¼÷Þ{ccc‹)ïß¿Ÿ°cÇŽ¨¨¨Ï?ÿœ$ɪªªèèèÐÐÐŒŒ ê¤ÚL/‰Úõ¸©cú-“É<==ukjjjš››333 ýôS¡P(‰  55ÕßߟhàääÉÊÊâóùÅÅÅ—.]ŠˆˆÈÉÉ™››kiiÀYS«&‹Å999ùùù###¹¹¹‹)³²²žþùªªª„„„sçÎ]¸páÚµkéééçÏŸŸ™™Ñó^½$ª±¾¾Þ€TúcÌù{zzš^:uµ"‹á˜øâ‹/öïßïëë HLLŒ‹‹›žž†“YddäŠ+6mÚˆŠŠ¢â‰‰ —mÛ¶Á T°ü1“É„ƒÊš5kfgg§¦¦è…é9rÄÃÔ”_]]íìì¼P999Éáp8ΦM›=çççHNNŽŒŒT©TÖÖÖôaCCƒ±RiŘ~;88ôõõ=÷ÜÏÕ‹Å*•*<<œ®ârÿxª †‡‡W®\ `2™‚ 4b=8::NNNVUUuttÈårͧÐ!àñx0pssôööŠÅâ…ÊcÇŽåçç‹D¢^xa÷îÝCCCÙÙÙÙÙÙôb´zI•J+Æô{ãÆ Û·o‡/‹uçÎ ““ÓÀÀá@íàà`”£777{{{ÛÙÙ:tÈÏÏïðáÃÞÞÞ$Inß¾]C™˜˜¸˜@.—Ãy¡¯¯ ˆÓ§O¯[·n¡rÆ 555]]]­­­III #;;{ãÆ’$§¦¦¨ñìqqpp8zô¨QRiŘówll¬R©¿··7''ððáÏù†AqqqwwwOOO^^ÞæÍ›—-[¦UyèСââbggg’$Aii©T*•ËåçÎ;vì˜þFšêƒSéƒ1_ßl6»   ¸¸øÄ‰333/¾øbFFFLL ]ýèÑ£ôôt•JõÒK/%&&ê™<'''55ÕÅÅ… °;‚àóùB¡000püøñüüü’’’U«V½ùæ›SSS§N*++[³fÍÁƒëêêÞxã ¡P¨R©^~ùåwÞyçÎ;Z•'Nœ(((hlltttLMM ºpáBzzúä䤿¿VV–ž'E•dgg[bbbT*•©ôD¯Ï·ÔÖÖîÝ»^Obþddd899‰D¢%•xý-°ßhýF ì7Z`¿ÑûØo´À~£Åc¬¯iýtæ‚Æ}©ÅÐk}­¿¿ÿûï¿â’0OWW×€€€%eˆ>ÿYðüØo´À~£ö-þÎ<°üÏ4ö¥IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1Document.html0000644000175000017500000016454012234777147027462 0ustar00murraycmurrayc00000000000000 libglom-1.22: GlomBakery::Document Class Reference

        The Document is like the 'Model' in the Model-View-Controller framework. More...

        Inheritance diagram for GlomBakery::Document:
        Collaboration diagram for GlomBakery::Document:

        Public Types

        enum  LoadFailureCodes {
          LOAD_FAILURE_CODE_NONE = 0,
          LOAD_FAILURE_CODE_NOT_FOUND = 1,
          LOAD_FAILURE_CODE_LAST = 20
        }
         
        typedef sigc::signal< void, bool > type_signal_modified
         For instance, void on_document_modified(bool modified);. More...
         
        typedef sigc::signal< void > type_signal_forget
         

        Public Member Functions

         Document ()
         
        virtual ~Document ()
         
        bool save ()
         
        bool load (int& failure_code)
         
        bool load_from_data (const guchar* data, std::size_t length, int& failure_code)
         
        bool get_modified () const
         
        virtual void set_modified (bool bVal=true)
         
        bool get_is_new () const
         Whether this just a default document. More...
         
        void set_is_new (bool bVal)
         Called by AppWindow_WithDoc::init_create_document(). More...
         
        Glib::ustring get_contents () const
         
        Glib::ustring get_file_uri_with_extension (const Glib::ustring& uri)
         
        Glib::ustring get_file_uri () const
         
        virtual void set_file_uri (const Glib::ustring& file_uri, bool bEnforceFileExtension=false)
         
        virtual Glib::ustring get_name () const
         Gets filename part of file_uri, or 'untitled'. More...
         
        bool get_read_only () const
         
        void set_read_only (bool bVal)
         
        void set_view (ViewBase* pView)
         If you don't want to use a View, then don't use set_view(). More...
         
        ViewBaseget_view ()
         
        void set_file_extension (const Glib::ustring& strVal)
         
        Glib::ustring get_file_extension () const
         
        type_signal_modifiedsignal_modified ()
         This signal is emitted when the document has been modified. More...
         
        type_signal_forgetsignal_forget ()
         This signal is emitted when the view should forget the document. More...
         

        Static Public Member Functions

        static Glib::ustring util_file_uri_get_name (const Glib::ustring& file_uri, const Glib::ustring& file_extension)
         

        Protected Member Functions

        virtual bool load_after (int& failure_code)
         Allow app to update icons/title bar. More...
         
        virtual bool save_before ()
         overrideable. More...
         
        bool read_from_disk (int& failure_code)
         
        bool write_to_disk ()
         

        Protected Attributes

        Glib::ustring m_strContents
         
        Glib::ustring m_file_uri
         
        Glib::ustring m_file_extension
         
        ViewBasem_pView
         
        type_signal_modified signal_modified_
         
        type_signal_forget signal_forget_
         
        bool m_bModified
         
        bool m_bIsNew
         
        bool m_bReadOnly
         

        Detailed Description

        The Document is like the 'Model' in the Model-View-Controller framework.

        Each App should have a Document. Each View gets and sets data in its document.

        Member Typedef Documentation

        For instance, void on_document_modified(bool modified);.

        Member Enumeration Documentation

        Enumerator
        LOAD_FAILURE_CODE_NONE 
        LOAD_FAILURE_CODE_NOT_FOUND 
        LOAD_FAILURE_CODE_LAST 

        Constructor & Destructor Documentation

        GlomBakery::Document::Document ( )
        virtual GlomBakery::Document::~Document ( )
        virtual

        Reimplemented in Glom::Document.

        Member Function Documentation

        Glib::ustring GlomBakery::Document::get_contents ( ) const
        Glib::ustring GlomBakery::Document::get_file_extension ( ) const
        Glib::ustring GlomBakery::Document::get_file_uri ( ) const
        Glib::ustring GlomBakery::Document::get_file_uri_with_extension ( const Glib::ustring uri)
        bool GlomBakery::Document::get_is_new ( ) const

        Whether this just a default document.

        bool GlomBakery::Document::get_modified ( ) const
        virtual Glib::ustring GlomBakery::Document::get_name ( ) const
        virtual

        Gets filename part of file_uri, or 'untitled'.

        Reimplemented in Glom::Document.

        bool GlomBakery::Document::get_read_only ( ) const
        ViewBase* GlomBakery::Document::get_view ( )
        bool GlomBakery::Document::load ( int &  failure_code)
        virtual bool GlomBakery::Document::load_after ( int &  failure_code)
        protectedvirtual

        Allow app to update icons/title bar.

        overrideable. Does anything which should be done after the data has been loaded from disk, but before updating the View.

        Parameters
        failure_codeUsed to return a custom error code that is understood by your application. This must be greater than zero.

        Reimplemented in GlomBakery::Document_XML.

        bool GlomBakery::Document::load_from_data ( const guchar *  data,
        std::size_t  length,
        int &  failure_code 
        )
        bool GlomBakery::Document::read_from_disk ( int &  failure_code)
        protected
        bool GlomBakery::Document::save ( )
        virtual bool GlomBakery::Document::save_before ( )
        protectedvirtual

        overrideable.

        Does anything which should be done before the view has saved its data, before writing to disk..

        Reimplemented in GlomBakery::Document_XML.

        void GlomBakery::Document::set_file_extension ( const Glib::ustring strVal)
        virtual void GlomBakery::Document::set_file_uri ( const Glib::ustring file_uri,
        bool  bEnforceFileExtension = false 
        )
        virtual

        Reimplemented in Glom::Document.

        void GlomBakery::Document::set_is_new ( bool  bVal)

        Called by AppWindow_WithDoc::init_create_document().

        virtual void GlomBakery::Document::set_modified ( bool  bVal = true)
        virtual

        Reimplemented in Glom::Document.

        void GlomBakery::Document::set_read_only ( bool  bVal)
        void GlomBakery::Document::set_view ( ViewBase pView)

        If you don't want to use a View, then don't use set_view().

        type_signal_forget& GlomBakery::Document::signal_forget ( )

        This signal is emitted when the view should forget the document.

        This is used internally, and you should not need to use it yourself.

        type_signal_modified& GlomBakery::Document::signal_modified ( )

        This signal is emitted when the document has been modified.

        It allows the view to update itself to show the new information.

        static Glib::ustring GlomBakery::Document::util_file_uri_get_name ( const Glib::ustring file_uri,
        const Glib::ustring file_extension 
        )
        static
        bool GlomBakery::Document::write_to_disk ( )
        protected

        Member Data Documentation

        bool GlomBakery::Document::m_bIsNew
        protected
        bool GlomBakery::Document::m_bModified
        protected
        bool GlomBakery::Document::m_bReadOnly
        protected
        Glib::ustring GlomBakery::Document::m_file_extension
        protected
        Glib::ustring GlomBakery::Document::m_file_uri
        protected
        ViewBase* GlomBakery::Document::m_pView
        protected
        Glib::ustring GlomBakery::Document::m_strContents
        protected
        type_signal_forget GlomBakery::Document::signal_forget_
        protected
        type_signal_modified GlomBakery::Document::signal_modified_
        protected

        The documentation for this class was generated from the following file:
        • libglom/document/bakery/document.h
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_14.png0000644000175000017500000000465612234777146025210 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“ cIDATxœíœ{HSïÇŸ£ §™ÍêÜfæ¼FB"^ðRZ -Ô)Š&&H¨eA™)…Aþá%ÌKn:%D#u:3‹P¦óVó:çTÒÔÔóûãá{~§mÎû¦í¼þúì9ÏùœÏ>Ÿó<çÙó> AQh :š€@­õÖ.ˆzk$ü±XÜÚÚª©Pö:îééùÿÏ(.—«¹Àö…°°0|‰IŠ=ˆû?Cxx¸\ ñüÖ.ˆzkD½µ ¢ÞÚQo킨·v±ÃzÏÏÏß¹s‡N§ëééÑéôøøøÑÑQxAÎÎν‹P ‚LOO·@Ó鳓z¯¯¯_ºt©½½Çã‰ÅâÚÚZ2™ìååµ¼¼¼çñý¬t)›QXXhiiùë×/|£L&[]]…{5`S'» ‘HÔìvÇÕ`ºÂÂÂäö×v2¾ËÊÊ’’’Ž=Šo¤P(ºººØÇÕÕÕôôt:nff%•Ja;‚ ‡F£;v,--­¼¼œJ¥ݾ}ëPZZŠ7§§§Á‰' `7giiijjš““èîî011Ñ××wqq©¨¨À¼5551ŒÂÂÂììl[[[“ððpÏòòò­[·,,,ÌÍÍ_½z… Huuµ­­-…Ba³ÙR©A€¹¹9œð1·oÞ¼‘KŽD"Qgº¶ ¾ø[ßÆÆÆ555…ÊÊʲ³³ãóùB¡ðüùóW®\Á޲X¬ééi¸xñ"f  (ZRR288ˆ7Nž<™’’2>>^UU¥££311¸zõêÌÌ —Ë%‘HKKKŽŽŽ‰‰‰CCCzzzËËËðr^^^ÍÍÍOŸ>e2™mmm"‘ˆÅbÁ»>==Á`477 …B???ðß899ñùüžžooïôïñ¹]\\ľxsssDD„“““:Ó¥Åñ½“z“H¤––|Ä™L†}{{û·oßÂß¿ÌÍÍÁ£(Š®­­ÉÙMk&&&/_¾„6œ]]]؉‰dvvN(Š …B|å*++Q=uêTYYì0::ª««»°°`kk[XX¿~ýŠ?«¨¨¶wwwÃàåê Ý¢(º¸¸˜ŸŸïêêêïïÏårWVV4›.<{3ŸS©Ô¾¾>|ÜØjãçÏŸvvvІ†X,† :::röFäææfggÛØØÄÅÅõôôÀiF£áOœMOO÷õõ¥R© øÓ `hh(::AA¬­­×ÖÖÄbñøø¸ƒƒì†ø˜ŽŽŽøàåÜ644ØØØ|ûö­¼¼¼±±‘Íf9rD³éRÍNÎ ÎÍÍ…w€B¡|þüY®F„64¨TêÎB ©¬¬´²²ò÷÷‡É‚T __ßÁÁÁgÏž 744àÁìP©Ô÷ïßÃ{|}}]&“988Ðh4¬"‘ÖÀÀ4úûû•ÝÒh4ww÷†††ºº:™L¦4~5§K5;©÷ýû÷ÇÇÇY,VggçøøxuuõÇåú\»v-##C ôõõݼy“ÅbQ(”­8/--®®®©©© ÃÍÍ EQ2™¬xÖŸ?ÜÝÝííí{{{ccc333ø±±±ééé"‘(!!áܹs€˜˜˜Gµ´´ô÷÷Ë­€?~,z{{“’’°à+êìì\[[[__?::zúôéøøø®®.u¦kÛà'÷->¿QýñãGTT”±±±‹Å‚·$þ´²²’’’bmmmbb‰òa¥6 ¤¤o|üøÑÅÅ…L&ÛÙÙ•——£ K'‰DRSSsâÄ ===//¯ºººÀÀ@¸nÂÜ®¬¬¤¦¦Òh4CCÃÀÀ@¸ØY^^NNN†ëóââb€{~gee1™L##£ÐÐЩ©)E}}}Éd²T*E7øµ°°——ççç§Ît©Fñù ¸DEEEDD¾E;AD ¸¹¹i:Ýßw¨¬¬ÄZˆýsíBÉûLÿð GŒo킨·vAÔ[»8õV³ Q¡IÿÈz«Ÿƒ¥I«-ZŸ#"‘HÌÌÌEEE"‘Ê”æææ¯_¿ÎÌÌ$‘þñ„h`|+*ÜŠ(Õ³/_¾üâÅ ØÏç›™™ýþý{#Ù{3 Úr¶jM“·óòò¶è(SÍ1ÏP¾Û‹äí Ô»¤¤ÄÛÛo(iooßÕÕ5<<œœœ»²²Âf³¡ô àp8aaa999‡Çãµ¶¶NNN^¿~}£‹b;¯p|ùòåÌ™3*‚¼{÷î»wïFGG·èrïÞ=‡ÓÖÖ666µóù|&“™™™955¥Úþƒß\ÝúþùÞvƒ•êÙ³³³d2Y,¯­­Q©Ô¦¦&²±Ü»\㦚4”··ë_Q5Ç.122’––F£ÑbbbÚÛÛ÷*uªÙý[ (Õ³?PUUõéÓ'‰äãã£B6Vͦš4”··ë_…jÎ`0ž'Ø=D½µ ¢ÞÚQoíBÉzMñOÚ)|>ßÃÃßò×ø¦Óéaaaê ‰`ñððøëÏS@ůF‚½‚x~kD½µ ¢ÞÚÅÿLàI´à:8úIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutGroup__inherit__graph.png0000644000175000017500000007210512234777146032053 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÕej}\bKGDÿÿÿ ½§“ IDATxœìÝg@S×ßðs“°‡LG‚ˆµ¢ à¨ –)¶¨ÕªÕ:±u¡­ƒj´ÎZWq SëªbµUDËT±Z-ÈPYÊ& 2îóâúOy1$¾ŸW'''çþîM¸ùqrî=MÓä‚¥èÚäßòƒü@~8Š qqqÙÙÙŠŽäÍÁÁÁÔÔTÑQÈ…ë/@ÉyzzFEE): ·ððp///EG {ÿ€VÀÃÃ#22RÑQ€üP¥èZ æÈòoùAþ ?È¿äù7€ü ÿäßÐvðx¼+V˜™™©©©™™™Íž=;77—yŠ¢¨äädnKæ*é:ä¼íîÿ m„X,ž8q"EQQQQݺuËËË;x𠃃CZZšššš¢£k5®_¿nkk+y¨£££À`Ú$äßÐFgdd¤§§kiiBŒ÷íÛÈá´â/;Š¢ ŒŒšXÿþ´µµõôôšýò–  ÍÀüh#BBB.\È$ßzzzl6[òP(˜™™ùúú3õE………™ššêèè¬^½:44”ËåêêêúûûKœ$„”——3Ï^¿~¦ifÄ·f¹V’]³ÿZO••• …B¦œššÊd¢eeeêêê999"‘ˆËåÆÄÄH‰¡ùwŸ>}BBB˜ÊÜÜ\6›]QQѼ=ªw§hš®7àF÷BJ`‘‘‘ P3äßÐVaþ ´\.7--Mò°´´Tró‰ììl+++¦Ìrrr˜‡ÚÚÚ„‹U«ÜteeeNNN\.wîܹLe‡ÆŽ{úôé›7or8GGG)14CVVÖôéÓ™{•˜˜˜ˆD"î£Þ€Ý )™››7# €6ù7´S¦LÙ¿?3ÄKÑÓÓ»sçN­6¦¦¦™™™L™)p¹\Yàää”™™¹}ûö§OŸ^¹rERïååîããCQ””hš&s¹Ü³gÏ2ƒjb±¸´´´G²Ú#F½7z$¥Ö¼Ú ü@±nݺüü|—äääüüü3gÎlذ¡V›3flÚ´))))--mÑ¢E...M¼×ÇÉ“'³²²jHKµµõãÇýüü!%%%„WW×äää°°0___)1èéé;wŽÇãÖÜtiii½!1õ~~~ÉÉÉééésçÎ=zô»³&©7`)GRn´V ›ùÐ4MœÿMÓôóçÏ}}}õõõ555]\\˜qÙšó¿«««W®\ibbb``àããÓÐÔêºeBȉ'jjJJJ:þ¼………šššƒƒÃ¥K—œ{õêÅô3eÊ”¾}û2å†b8~üx§N ™û«0õNNNêêêÅÅŵ“ÔWWW¯ZµÊÔÔT[[ÛÙÙYrme£{T¯zŸ­7à†öâ“‚`þ7´]]ç  T<== !‘‘‘ФùÜÜÜìììÖ¬Y£è@Z Š¢ÂÃý¼¼€ìaþ @ ª¬¬LHHøý÷ß§OŸ®èXÞŠŽŽ®»Î5ª—Š [Ñq4ù7´2÷ïg>|óüù{ÚÚê¾¾ÃüüÌÌ @S!ÿ€ÖA$_¾üàðᛉ‰™½{sgÏvüøãÁêê*ŠŽ àÝ ÿeÇç OœøëàÁ……¯<=‡|ò‰}ÿþ¸2Z+Üÿ”—@ :}:y÷îk¹¹¥žžC¾üòC #Eð^€2Daa {÷þQPÀóõ¶`Á}E È¿@¹ˆÅô©SñAAWªªsæ8~ö™£¾¾–¢ƒäß D<ÈùöÛ³‰‰YÓ¦ ýúë‰FFÚŠŽ@Æ€Rxþ¼xݺ_¯^ýgܸ¾11«ºu3VtD-ù7(˜P(>xðÆ?ünh¨}èÐÌI“(:"€„üéÁƒÿ°ôô‚%KÆÍŸ?ZM _LÐÆá4Šñú5ãÆs!!ñNN=Žù kX@;ü :úÁêÕ§««…øMžl«èpäù7ÈUqñë5kN_¸2y²íæÍë(:"¹Bþ òsõê?_)÷ì™îîþ¢ÃPäß oÞ6nÐ6`üd€¦éýûÿüþûKÎÎý~øaš¶¶Úûô†1N¨+""ÂÛÛ[ÑQÈòox_<Þ›%KB®]{´jÕÄ Æà>'R ÿ€÷’šúbΜ_ÊË+þ>¼»¢ÃPv˜ÿ Íwûvº›Ûö¹s‹‘|4òoh¦ððD_ßööV/.µ´4Vt8­æŸÀ;‰Äß~{îèÑØåË?Z¾Ü¾šãßðn^½zãçwèäÉ¿~úéSÿñŠJ¾y<ÞŠ+ÌÌÌÔÔÔÌÌÌfÏž››Ë_Q!µ:ò<†×¯_/-----MII±··www¯¨¨ùVZ äßÐTÿ=iÒB¡èÂ…¥ƒ[(0’àààŒŒŒèèè¡C‡0`ß¾}÷ïßçpZñ¼JŠ¢ŠŠŠš^ÿžäy µµµõôôôôô,--×­[WRRòüùs™o µ@þ MrëÖ/¯ýæægÎ|Ùµ«¡bƒ Y¸p¡––VÍJ===6›-y( ÌÌÌŒŒŒ|}}‹‹‹™zŠ¢ÂÂÂLMMuttV¯^Êåruuuýýý% Nž>þÑ£GÇwuue*kb±XüñMÓuWCÁ0šøÙP~ø@#vì¸Ìå.Û±ã²X,ném51Çâp8·oß–<”äv¥¥¥ôÿ’WkkëcÇŽ1 >|H)//gž½~ý:MÓ"‘¨V¹V’]³ÿZO••• …B¦œššÊ$ eeeêêê999"‘ˆËåÆÄÄH‰¡ùwŸ>}BBB˜ÊÜÜ\6›]QQѼ=jÊ1ŒŒŒ¤iú]w!88˜©LIIa× ƒÇã-X°€Ëå …Âº‡«¡PÈ¿¡ÍÀühXL¯]{æ‡~ß¼yªouR—ËMKK“<,--­{ãŽììl+++¦Ìrrr˜‡ÚÚÚ„‹U«ÜteeeNNN\.wîܹLe‡ÆŽ{úôé›7or8GGG)14CVVÖôéÓ™‰˜˜˜ˆD¢÷Ù£F¡¹¹9‘zë%iܳgϺutt6mÚ”———––V÷p5vÚäßP¿7oŸþË©Sq‡Íš5K¹r£)S¦ìß¿Ÿâ%„èééݹs§VSSÓÌÌL¦Ì¸\®¬prrÊÌÌܾ}ûÓ§O¯\¹"©÷òòŠŠŠ ÷ññ¡(JJ 4M“wLǹ\îÙ³g™ñ3±X\ZZÚ£GfïB£ÇÉàßu222˜Â“'OH}Ç\(’ÿý“Pëp5{_ZäßPïÍ'Ÿ¼}ûÉÉ“ó&Lè§èpj[·n]~~¾‹‹Krrr~~þ™3g6lØP«ÍŒ36mÚ””””––¶hÑ"==½¦t~òäɬ¬¬šRã ²²2‘H$ìì쬭­?~ìççG)))!„¸ºº&''‡……ùúúJ‰AOOïܹs</00°æ¦KKKë ‰©÷óó HNNNOOŸ;wîèÑ£ßå˜ÕÖ”cØŒ]ؼysRRÒãÇ.\(i,9z¹¹¹«V­²µµ555­{¸Ú EN~¥TXøjüø}û®½s穜7Ýô9¾ÏŸ?÷õõÕ×××ÔÔtqqa†fkÎÿ®®®^¹r¥‰‰‰OCS«ë– !'Nœ¨U¨)))éüùójjj—.]rvvîÕ«ÓÏ”)SúöíË”Šáøñã:u244dî¯ÂÔ;99©««× LR_]]½jÕ*SSSmmmgggɵ•îQ³á»î!dË–-Ý»w×ÕÕuww/((¨uô444>üðÃ'OžHb¨y¸¤Ãüoh3(ºÎiÚ³/ʽ¼öóùÂS§æYYu”óÖ#""¼½½[õw“›››Ýš5kˆP•””ôÁ4ý%M?\mà³ÀÀüøÏÓ§E“'ïRQá\¼¸TþÉwkWYY™ðûï¿OŸ>]ѱ¼MÕ' @Ñ¡)ãáV¼NÈÖ¿ÿæûøüdb¢êÔ¼4Nësùòå™3g®_¿¾k×®ŠŽå­ñãÇËsÀø¶¥„‡ @>!„<~œçíý“……ñÉ“suuÕN«äîîîîî®è(Z .h·0ÿȽ{Ï?þx_¯^ܰ°ùH¾Zòo€öîΧӦý4p ù±c³55U@‡ù'íÚݻϦO?8x°Å‘#Ÿ©««(:€¶ãßí×ýûÙ¾¾† ³úå—ÙH¾äù7@;u÷î3/¯ý£Fõ>rd–ª*~œpÚ£””ç¾¾ìí»ïÙ3ÍVº±Š¢dØ™ª*W]ÝJ(,«¬ü[vÝ4òo€vçþýlŸC‡Z:4SE…­èpþf™ñ÷$ˆSSË<(ýçŸÒׯ;k::v>¼Óû÷ ðž°þ<@ûòøq¾§ç>[[ó£G?k{ÓNÊË+¯\ùçÊ•7n¤òù‚Aƒ,Æ·™0¡Ÿ¥¥±¢Cx ù7@;’šúÂÃc_¯^ÿ\C£íÜj° àÕùó÷.\H¹s穦¦êøñýÆëëäÔ«x€Bþ Ð^<^qâs¶¢Ã©­´´âàÁ˜#Gnª©©Ì›7jæÌ¸¼Ú'äßmAYY¥›Ûö™3_*ÛˆrIIÅÏ?ßøå—X--µùóGú©îä íæ´zhîÜcååU.,Qªä»¼¼rïÞ?íÒ¥C` »›Û %˜3äß­Þš5§SRž=»ØÔT_ѱ¼%ˆŽ¿½k×U±˜^½zÒŒÑy0´n»w_‹ˆH ß§WѱBˆP( K ºRYY½hчŸ}模Ù&ÿAþ Њ={÷ûï/íØáåàÐ]ѱ±˜>u*~Ïžk¼9sF.\8FOOSÑA(äß­Õݻϖ/›;wä´ià ¹p!å‡~òäå´iC—.ýˆËÕStDJ ÷?h•òòÊ&N 4ÈâðáY,–"oõ˜˜x1))kòd[ç=:+0å‡ü õ©¨àKî6¨®®¢¨0^¾,ÿî»ßNŸNîÙ³óš5.~ØGæ›ðôôŒŠŠ’y·ÐŠ„‡‡{yy): YÂü€V†¦iÿ°‚Þo¿-STò-ˆ¼±k×Ummõ  i´Üü°aÖ-[ÖBƒ’óööVt²‡ü •ùñÇ«ÑÑOŸþR!w¤i:**yëÖK¯^U}ýõD9ÜXÐÔÔßíòoh“´&çÎÝÛ¹3úçŸg ÜUþ[ü8oݺ_ãâ2Üݯ]ëÒ©SùÇÐÚ!ÿh5îßÏ^¶,ô‹/ÆLš4@Λ.)©Øºõ·°°„Ì.^\:p ¹œh3´……¯æÌùÅѱÇêÕ“ä¹]‘HüË/·‚‚®¨¨°wîôqwoÁ©Þíòo€V ºZ8{ö/ÚÚjûö}*Ïô7!!3 àÌ“'/?ÿ|ä¢EêêjÈmÓmòo€V`åÊÈ'O^þöÛRmm5ùl±¬¬20ðbhhüСÝ.]Z¦$‹Û´,E ŒLÚ½Û·[7c9lަéÈÈ$GÇ-×®=Ú¿ÿÓÓ§¿lÉ7Ç[±b…™™™ššš™™ÙìÙ³sss™§(ŠJNN–á¶dÞ¡2l±î&Þs£E½w\mÆ¿”ZJÊó5kN/_îÿü˜žžVPEµì5—.¤8:nùõ×;;wúœ;·¨u%ß„… 2É·„žž›ýßÚ@B¡0 ÀÌÌÌÈÈÈ××·¸¸˜©§(*,,ÌÔÔTGGgõêÕ¡¡¡\.WWW×ßß_ÒàäÉ“5 u¥¤¤Œ;ÖÀÀ@CCÃÆÆ&""‚2iÒ¤   ¦A||¼‘‘QUUUC1H¦j0eæ766®5…£f=MÓ[·nµ´´400ðôôlú5äõë×e50•õn¥ÞýåóùK—.íÔ©“±±ñîÝ»¥¼œ 2&&ÆÜÜüèÑ£Ò£hƒhPJëÖéÑcUzúËÝJvv‰Ÿß!.wÙW_…—–V´è¶šÁÃÃÃÃãÑfúúúçÏŸoèYBHRRÒ–-[¬¬¬âããSSSÇŒãææ&yÖÅÅ¥¨¨(**Š2aÂI9##ƒ¦é'NdffÖ,0ÖÜDÏž=çÏŸŸ••õâŋÇ«©©ñùüàà`{{{¦Á’%KæÍ›'%†ÂÂÂZåZ•’-Jê÷ìÙÓ½{÷¸¸¸ôôtÉjt:Ju%%%Õ»•z÷7 ÀÜÜ<66655uäÈ‘LœR‚tppˆ­¬¬”òÎBÂÃÃ¥4h(£ððD.wYtôƒ–ÛDuµpÇŽËݺ}íä´å¯¿Ò[nCù7‡Ã¹}û¶ä¡$},--¥ÿ—¼Z[[;vŒiððáCBHyy9óìõë×iš‰DµÊµ’ìšý×zª¬¬L(2åÔÔT&õ,++SWWÏÉɉD\.7&&FJ ÍÈ¿ûôéÂTæææ²ÙìŠŠŠæíQ½;ÅÔÔ»•z÷×ÒÒòÈ‘#Låýû÷™J)AFFF6LÍCÛƒù'JçÁƒœU«"¿øb´³³M mâñã|W×Ý»w_›5kDtôr{{«Ú|p¹Ü´´4ÉÃÒÒRÉÍO$²³³­¬Þî&SÈÉÉajkkBX,V­rÓ•••899q¹Ü¹sç2•:t;vìéÓ§oÞ¼Éáp¥ÄÐ YYYÓ§O§(Š¢(‘H$Ã=’¾•z÷7??¿GLYR¤¹9VQ…v ù7€r©¬¬þòË“ýû›­\9±%úD?üðûøñ;Y,*:Ú? `²††jKlHž¦L™²ÿ~fˆ—¢§§wçÎZmLMM333™2Sàrev_E''§ÌÌÌíÛ·?}úôÊ•+’z//¯¨¨¨ððpŠ¢¤Ä@Ó4yÇtœËåž={–N‹Å¥¥¥’¬W†êÝJ½ûkjj*ù/(==½Ñ ›ý/@k‡>€rY¶,”Ç«:|x–Š »ñÖïèÞ½çãÆíøé§?Ý/\XÒꮳlȺuëòóó]\\’““óóóÏœ9³aÆZmf̘±iÓ¦¤¤¤´´´E‹¹¸¸èéé5¥ó“'OfeeÕ,ÿ©¢H$vvvÖÖÖ?öóó#„”””B\]]“““ÃÂÂ|}}¥Ä §§wîÜ9XsÓ¥¥¥õ†ÄÔûùù$''§§§Ï;wôèÑïrÌšªÞ­Ô»¿Ÿ~úéÆoß¾ýäÉɵžò  •QȬ¨Wpð-SÓå·o?‘yÏ••ü¯¾ 71YæíýSvv‰Ìûo!MœÿMÓôóçÏ}}}õõõ555]\\˜Ñåšó¿«««W®\ibbb``àããÓÐÔêºeBȉ'jjJJJ:þ¼………šššƒƒÃ¥K—œ{õêÅô3eÊ”¾}û2å†b8~üx§N ™û«0õNNNêêêÅÅŵ“ÔWWW¯ZµÊÔÔT[[ÛÙÙYrme£{T¯ºÏJŽ[Ý­Ô»¿|>Ù²eÌýOŽ?ÎìHS‚”‚`þ7´EÝÀ%Ï gäLž¼kÑ¢ýýÇ˶縸 ÿ°²²Êï¿÷œ<ÙV¶·(OOOÁm0O IDATBHdd¤¢i>777;;»5kÖ(:V‰¢¨ððp///E K˜ x¼7óæ6ÌjÙ2gv[YYýõמžûz÷îrãÆªÖ•|·v••• ¿ÿþûôéÓË[ÑÑÑT}@;ÒŠhK¾ú*¼ªªzÏžé,–Ì–Ú¹};}ÅŠ°W¯Þüô“2où»|ùòÌ™3ׯ_ßµkWEÇòÖøñãñ»7€Â!ÿP¼cÇn_ºôwxøÆÆ:2é°ºZ¸cGô×GŽì¹m›W—.MºÐdËÝÝÝÝÝ]ÑQ€ÒAþ  `ä|óÍÙ%KÆ98t—I‡ÿü“»hQH~~ùÎ>žžCdÒ'È òoEb¦}ÚmùrLûDÛ¶]þùçë~Ø'"b‘‘öû÷ ²…ü@‘˜iß{÷~òþÓ¾ÿù'wñâìì {(3äß ÃLû {ßiß"‘øÀë;vDØ58xŽ™™¬"™Cþ  Ì´ïE‹Æþ^Ó¾Ÿ>-Z´(ä￳׭›òÙgŽ2¼}Š’ÈÉɉˆˆy·<ž@K‹Ãf·µÃÊù7€TVVùåÉþýÍ–-û¨ÙÐ4}äHì–-¿YZEGû·™Åäk‰÷öö–IW**UUMTU¹ªª\K«¤äW>ÿ™Lzh:¬  _}ñÛo÷¯^]ab¢ß¼JJ*V­Šüí·¿§OöÍ7®ZZj²°ÍÈÊ*LHÈŒ‹ËˆÏÈÎ.ÑÐP<¸ëСVööVƒuUWWQt€Ðî`ü@ÞΟ¿÷Ë/³›|_½úÏòåajjœððù#Fômx­@ ºwïYRRÖÍ›i÷î={ýšo` 5|¸õ¢Ec‡ ±ìÞ½#›µŸ@‘0þ W¹¹¥~¸}òdÛíÛ½šñr@ôý÷—¸þá‡}‚‚| q‡AB©®&$d&&f&&fݹ󴲲ÚÄDßÞÞÊή›£c®]  ÀÈXLO›v /¯ìÊMMÕw}ù£Gy œÈË+ tÇß¼0ƒÜ‰‰™æVUU››:9õ2ÄÒήrnPZ˜ ?‡ߌϸpaÉ»&ßÌ¥–ú÷7;qâóv{‡ÁòòÊ›7Ó³’’²=ʉhkëNvv–sæ8ÙÙYvêÔAÑ4ãßròøqÞ„ ?,]:néÒw»çÉË—¼¥KOݺõdéÒqK–|Äá´¯éË¥¥·n=‰MKLÌÊÈ(‹é~ýL‡ ±´³³:ÔªcÇ÷ºu:€ü!ÿ>_8~üN­ÈÈ…ït‹î?þx´lY¨––ÚÞ½Ÿܵå"T*yye·o?IJÊŠM{ö¬˜Å¢llL{ØÙYÔ³Þ UÃüyøþûßòòÊŽ›Óôä[(ïܽwïcÇöÙ¹ÓÇÀ@«E#T¸çÏ‹™ÉÜIIYÏž«¨°mmÍ]\lœz ØU[7X€6ù7€ŒefhééiJjnÝJ;x0懦™›7õ¢ÀÜÜÒ N<|˜ûÝwîŸ~êÐ2‘*MÓii/™AîÄÄÌ—/yjj;»nØÙu<Ø¢—¨(?äß2vêT|XXÂŽÞãÇ÷#„”•U.^|jòdۦ߱äìÙ»+WFZ[wºqce»ÔR,¦>Ìa. LHÈ((x¥®®2dˆåœ9NC†Xöïo†q ÍÃüo3fÛ¿ÿæB&O¶ÝºÕ㫯"îßÏþã¯tu5j6;{ö®›Û Z¯­ªª^¹2òôé;Ÿ}æ¸nÝdUÕ¶0JRsAœ””ç¯^½ÑÕÕ:´›¥£c>}LÚÛ¥Ðε…3;€ò()©HM}Á”/]úûÚµG**ìŸ~ò«•|_¹òpÁ‚¯_ó?ùÄ^R™šúbÞ¼c/_òŽ™ÅŒ·^5Ĺ{÷YE_OOÓѱÇW_M°³³ìÛ׋P@»…ü@–2%e‘HüæMuUuèÐÞ½»tîüöîÔ<^•¿8E‘5k¢úõ30ÀŒrútòªUQ½zu ™Ûìué«î‚8††ÚÝ¿ùÆuÈKkëNït〶 óOd) à̉q°f%‡ÃRSSùæWf´{á“/¦"‹20оtié¶m—Ïœ¹³lÙG­îöÞ<Þ›„„ŒÄÄ¬ØØ´Gr…B±©©þ°aXø AÈ¿dÉÑqKFFAÝzŠ¢hšöñêìÜwÖ¬£’z¶ŽŽº@ Ú¾ÝkÊ”rŒ”\¿þïèѽšñ²²Jf5œ¤¤¬þɉÄ]»::báw€&Áü™).~™YXïSËÜÜàÓOíýü³X”XüvìC ••Uùù9È3ùÎÍ-õ÷»uëÉÇ›kÞ'QŠââ×ý•ΤÝéé/iš0‹P.\8 ¿¼äß2sûöŠ"µ~V¤(ŠòÉ'ß|3% àLyy•$ùfˆÅâcÇn;9õÃ5—b1}ìØíM›Î "±˜$&f~ô‘MCsrJoÜøW² ³å¸q}×®u±µ576ÆÂïÍü@fnßNg±Xb±HRÃá°8öŽÞ<866-$$¾¡Y‹ºvmE‹NÞxð gñâSii/˜TUÙqqµòïÔÔ5Ä©¹¥­­¹ŽŽzË…ÐN`þ7€Ì ²)7·DòÃaYXÿòËgVVù|á¨Q[srJE"qC/8ÐüìÙÅ**l™V]-ܾ=úÀ넚ôéýzuŃoÄ‘äÜÆYÙÙYÚÙu4¨«–~%ŒÈF~~Y䛢(âéi÷ÝwîjjBÈŽ—srJD¢ÚC‹¦‰XLÔuÊÛªªj "S÷î=_²$$+«¨nêÿï¿ùC†lÌË+c³Y66&®®ºÛÙukâ¤phäß²qûv:sa%‡Ãb±XÛ·{IœONÎÚ¿ÿzÍß9–XL³XÔÈ‘½¦L±7®oK¤¼ü Î…„ijXT½ãîb1=x°Å¶mvC†Xbn €| ÿ¿þÊ „¨¨°u™Å¬ªCDË—‡1×eª¨°ÅbZ,¦ ²puµ8±ËÝ9äÖ­´¥KC x4M×wg¨¨°--ÆŒéÝB1@]ÿ/ÿÎÉÉù믿 ´333{{ûÆÛÉE\\\vv¶¢£h_LMMÅ[mþ }W,¦{÷Öýä“î©©q©©qLý•+Ùé鄊¢Ì͵4êßß@WW…ü˜˜ü–ˆ¤ºZ|ñâóØØ^á#ˆnÝzÒ14CDD„¢C€VC©¾ÝÞÕÿ»þ2""ÂÛÛ[Ñ€ÌyxxDFF*:Š·<==£¢¢Eûîåå¥è(ÞjÛg6[·cÇ™<Þ튊;5ë9##_àEUUÚ›7ébqeKGÂbièêŽRU5e³5 ‘¬÷.¦iš¢(Bj/®Éá°Ÿ<ÙÊLRW,æFM¡Tßn爵.îˆÒfxzz*:„ÚpÆ”'åÌf®_¿®èZÄÇ…jjlk멵ê32ÊŒ5uuUåMÓååÕ<¿¤¤ª¼œ_\\ÅãUU–”T½|É«¬Q‹"ŠîÝ{6l˜•ü#¬K©þc¥¥„ßnïDñm€q½õVVzrŽD‚¢(==5==5ssÝZOݸqcÆ Åů x/_ò:wÆê•òƒü 20Ð20ÐêÕ«‹¢h_jO€–ƒü@~ÈòoùifþÍãñV¬Xaff¦¦¦fff6{öìÜÜ\æ)Š¢’““e!¡ê#ÃM¼goE½SŸ2?D‚útò'Ÿ|ð GѱüGÎ09¿JõÈÎ.Ù½ûš¯ïÏŠäÿ©¬¬üé§Ÿ¼¼¼ÆçååµmÛ6É_ÙèÑ£SSSe¸-™wØRvP©<~œ·y󅯾R®eqp~xÿM|òÉ'2Üh½ßƒr{9@kÔœûŸˆÅâ‰'RÕ­[·¼¼¼ƒ:88¤¥¥©©©É<ÄÒÒR¦ ¯¯ýúu[[[BˆŽŽŽÌ7Ô®¢7þ=}úΕ+ù|!!´¿ÿxEõ–œ?`íSIIÅùó)QQI÷î=§ibd¤­èˆþCÓôÊ•+)ŠÚ°aC—.]Š‹‹/\¸°pá“'Oª¨¨(::PþÌÎ.9{önddrzúKB(''kEGôœd"44tñâÅvvvŠ jNþœ‘‘‘žž®¥¥E166Þ·o_`` ‡Ó"w3ÔÓûïî¹ÚÚÚ5ÊEQ………FFF­´ÿZ˜´;**ùÊ•‡B¡ˆÍf "ùlºéäü“†Þh9JJ*Μ¹söìÝ{÷ž³Ù”HD3ëm)Õª[ÑÑÑyyy!!!êêê„==½¥K—Ι3‡Íf+:´æ=zôÙ³g;tè@”x³³K""Ïž½—‘Q ªÊÄ„B”è³Ap~OOÏ¥K—þõ×_ï4[s柄„„,\¸9÷IèééÕüò …fffFFF¾¾¾ÅÅÅL=EQaaa¦¦¦:::«W¯ år¹ºººþþþ’'Ož¬YhEQ111æææ‹/;v¬†††MDD„¤Á… LMM öîÝËT&%%ÙÛÛkjjZXX>|XÒ[JJJÝN˜å‹ŠŠêmÀ8s挅……žžž‡‡GAA¤ž¦é­[·ZZZxzzJBÍ]ôßPãFXSÐ4˜˜ùõ×663f¹råauµP,¦•0ù&Jð«÷½ž4iRPPÓ >>ÞÈȨªªª¡$¿¥2åšotÍ ÉíPYY™äçwÈÖö› ÎÝ¿ŸMÓ´P(Vª´[âêÕ«nnnLn*¡­­Íbýw¾‰DGŽñòòruuݼy3ÇcêGýçŸzzzNœ8ñСCüñ‡‡‡Ç¤I“öïß/ipõêÕš…ºÒÓÓýýý§L™âìì¿¡ÊËËk–GMqsscê¥ïàèÑ£ïß¿ïíí}ñâÅ&öÏbcc§M›æââ²aÃIã¦()©8|ø¦‹ËÆmÞ½ûZff!!¤ºZ¤œœdr~X¼xqAAAXXXÍÊz[S u¾ëíª¡÷E" `ðàÁeeeÒƒhš“ß»woÀ€ÒÛìØ±#,,,**꯿þzùòåœ9s$O…„„Ü¿?88xëÖ­'NœxðàÁ/¿ü”™™I9qâÄðáÃk¤X³fÍ©S§Î;gmm}÷îݧOŸ.[¶ÌÏϯººši°oß¾»wï>|xÙ²e|>Ÿâãã3räÈÌÌÌ   yóæ½|ù’iéããS·æë‡ù¿¿ÞÌk¬þ)]´èdÿþË–…ÆÄ¤ …"‘H,‰{¡"¥§§[Y5²zxxøŸþ¹aÆ}ûö•””lß¾]òÔµk׎9²jÕªS§N]½zõèÑ£+W®ŒŒŒÌÏÏ'„¬Y³ÆÆÆ¦f¡®7ššš|xýúõûöí+**Ú¶m›ôÆ„ŠRùÿÿ•=§iZ PÒ´[癜TUU·mÛ¶jÕª7oÞH?nM £Ö÷`½]Iy_!7n¼xñâÕ«Wåü+7€B4ç»W¯^J2ÿBJKK%6G]¿~ýСC !»wï¶±±áñxººº„CCéS§B¾þúkI¹¤¤¤[·n’‹Bj]R¯eË–1âï¿ÿÖÖÖf?ù|>ÇcNdóçÏïØ±£›››P(|õꕚšZYYYçÎ;wîüñÇKæ‘'$$4ÔI£ vìØÑ¿BÈþýû $™°þÓO?mذaذa„ŸþÙÜܼ²²RSS³Þ}‘ÒXúkèà$&f>xБÇS½{÷æ-âó¥¥Ý“&ýÐèOFF†={Öð¨Ká°zßk77·ùóççæævéÒ%22244tΜ9 ÅÐ ²ýˆÅtpð­Žg:ôoÊîxýšÏå.k^äïD]½{£m*++™<•Á B.\¸ ­ývžúåË—g̘ѻwoBÈâÅ‹gÍš%9\^^^ºººŽŽŽ„I™ÇãuéÒeܸqL’B]?ýô“††3Ý¿@PQQ1bĈ   ¢¢"CCÃ7n¬_¿~ûöí Åðž;èééÙ¯_¿mÛ¶½Sÿ¾¾¾Lcf6‹”ÆÕÕ¢ÄÄ7;~¶dÉ)Š"æÛ‰‰YòùxèéMl´ Î2ù‚ „|üñÇ»víÚ¹sçÚµk=n†Që{0))içεº’Òÿ¶mÛ¶oßþðáCƒæ"€Ö¥9ù7—ËMKKspp`–––VVVš˜˜Ôl“-àa 999}úô!„0_0Ìw[Ír3˜››BÊÊʶnÝzûöíôôô=zÔlÀDU³ÿýû÷/Y²ä‡~=zôܹs%{!¥“Ftïþ6¥èÕ«!„f#„deeMŸ>}úôé’–999õv.½qóŽ˜]·îÝK‹Š4iÚ";»˜™Í)edkÕªI––-;½oß¾Fð ÿ€Õû^wèÐaìØ±§OŸîß¿?‡Ãqtt”C3ÈöÀbQ3f _°à“ñãç=zÄ«¨¨VQaUW7˜«««ìÞíۼț...nÛ¶6344ÌÎÎîÛ·/óðÂ… |>ßÃãf›‚‚.—Ë”™Baaa×®] !äiYÍrÓ½~ýúÔ©S>ÌÍÍ555e*µ´´|óæÍnݺ±Ùì~ýúI‰á=w°S§NÒ÷±^’ÆfffÒ«ª²V¿~ýO_ßU×®=‰ÄÒ/éÞ½ã¢Ecݯ÷çî>‘ÒÛàüÀxÏ/óU8{ölæa£1K £Ö÷`QQQÝ®¤ô;~üxf¿é‡ õjNþ=eÊ”ýû÷úé§Ì€žž^lll­6¦¦¦™™™Ìïw̯`’ïbÎ2NNNÆ Û¾}ûÀiš®9«²î÷îøñãŸ={vÿþý_ýuÔ¨QYYYL½”NmžžÎ|I§¦¦RÅ|ùB¸\îÎ;]]] !4M———KùYí7‘††À̬<22 -íÅ… )IÙÙ%**ìz¿h{ hþž[”îøñê¦4Sø¬¡÷ÚËËëСC?öññ¡(JJ Ìÿ999ïpKG™ØlŸÿÜ×·»»»Ç;O##“ýõNee5‡Ã k8Öäɶﳹ¦¨ªJ‰^7ÚløðáçÎûè£$)Åßÿ]«±±q^^3„ù·æ˜è{Z¼xqŸ>}æÏŸommMÓôG}ÄÔ5ê·ß~{öìÙ˜1c(Š’ƒä'ûæí dÆí;õŸ——ׯ_?ò¿žôÂf“7ož9òŸ/¼y35""):úXL³XTÝéIZrøxB‚üFÛàü «/BÈ Aƒ>þøã5kÖ0=nR¨õ=رcǺ]Ié?22R(öíÛwΜ9#GŽ|ÿ]PrÍx^·n]~~¾‹‹Krrr~~þ™3g6lØP«ÍŒ36mÚ””””––¶hÑ"—&ž,Nž<ÉäÄ’B£µµõãÇýüü!%%% 5¶µµ]µj•¹¹ù|PóÔ)¥f>‰”«V­zðàÁÇ¿øâ OOOÉœ??¿€€€äääôôô¹sçJ~e®…鿉›§GÎþþãÖ]¿¾rîÜQ††Ú„UU%½]€ü?`¯_¿.û‘HÔÐ{íêêšœœæëë+%==½sçÎñx¼ÀÀÀš›–LLª¥¥?l6ËήÛöí^ÿüxìØWW[55Š¢Øl%]~ËÏϯ¸¸xõêÕ©©©ÅÅű±±ÇޫկÙÙùĉÿþûoNNή]»ìíí%SS¤»zõ*“ËJ „ªªª×ÿ#‹E"QïÞ½MMMŸ={öÝwßB^½zE1bDjjêŸþ9vìX)1hkkß¾}»²²²Ö|L'MÜÁfôÏ4~öìÙ;55θq}šùÏ?›üqÚ¨Q½ØlŠÅ¢X¬wûÑ@np~íù!00P2s]Êqk4ŒZ߃_~ùeÝ®¤ô¯®®naa±víÚ…  Yí€ò¢k¯UÓçÏŸûúúêëëkjjº¸¸0ÿÈ–––2ÿÖ'%%UWW¯\¹ÒÄÄÄÀÀÀÇǧ°°y!ó¬”2!äĉ5 5Û×|xþüy 555‡K—.9;;÷êÕ«nÿL ×®]³±±QWW·²² •4k¨'''uuõââb)[ 111Ñ×ן>}z­ƒ°jÕ*SSSmmmgg猌Œº;"é¿)*7ÄÃÃÃÃãn}uµð÷ß~ñÅq ‹¯¸Ü¥ææþ]º,½{÷™ôÞÞ_CñÔ%ÏX­¿)š¦§L™Ò·o_¦ÜP ÇïÔ©“¡¡!“1õ’7š–ã€^·¾¨èÕ/¿Üš?¿ÌÉiKEE5EQEÑ4=xpשSMœ8 S'Ý F %%»î‘,µ|¹óòåÎ-ÞÓ§Eþþ¡ññ™„PEvìðöñZoË—/˳bcÓ³žÜ:$d‹E‘–'¯¬¬þ믵Ìôté _¥¤(55Ÿ¹ŠŠ ûÀ¿;¢ssK·móš2e "¢n¦Š þÝ»Ï3³2««…ÆÆ:¶¶æÌ”qSùŒè´.È¿dÌ×÷ÀÍ›OÄâ·#Ü,%Ó¾¾Ã¾ýÖM[[òàAÎĉA"ÍbQ6¸Ížíôæ 0ðâ‘#7=<>øþ{O U…îAsTUU?xÃ\»™””õæ@GGÝÖÖÜÉ©Ç!–vÅm È¿dìÈ‘›ß~{Ž™aÂá°55U¬¬:=»¨fºeËo{ö\›<ÙöçŸgH*£¢’W¯Ž25Õ?p`FÏžºŒ…âGr™k72y¼*--µAƒºÚÙYÚÙu:´›ª*GÑ1( òoKK{1jÔ÷„Š¢†·p™6íç©SmÞü±¤@ ò÷Û¾Ý[Míÿe¢óæ{ö¬xËäz ‰Äÿü“›˜˜•””uëÖ“ÒÒ UæÚÍ!C,ÕÕU#€\!ÿ½Ö—•U®_?å³Ï)ŠºtéïÏ?>zô3gg›F_Ëç 7o¾ÀÌEÙ²ÅCKKMËͳgÅÌr?·o§çç—1Ëý8:ö°³³:´›®®†¢hqÈ¿dïðá›#Gö´¶î$©Y¹2òüù”k×V4ñÎÙáá‰kמîÚÕpÿ~¿V=E Ér?11©ÙÙ%l6«oß·KoŽa­¯å~ mBþ |¾pâÄtuÕ£¢²Ù¬¦¼äÉ“—óçÏÊ*üæ×3†·t„ŠUs¹Ÿ´´„Ér?#FXw颧è¤ñôôTt Ôìíí—/_.yˆü@NRS_L˜ôå—6}K¡P¼k×ï?þxÕÁ¡ûîݾò¼A¸¼JHÈ`¦Œ?xÃ,½É,÷3rdO33EPEQÆ 355Ut  Œâã㇠)©Aþ ?ÇŽÝ^»ötXØ#FX7ýU·o§/^R]- ò7®oË…§„ŠŠ^ß»÷¬æÒ›5—ûi«3s Õ¡(*<<ÜËËKÑ€2b~Aþ  0óçOJʺvmÅ;Íoæñª¾þ:òÂ…”éÓ‡mØàÖoþþ^¿æß»÷¬æÒ›;ê jÅLï×ÏKo‚¢ ÿ)(W5vìö^½º;6ç]óÅÈȤի£ÌÌ öïÿ´won EØ*TVV?|øv¹ŸÄÄL>_hd¤=p`W,½ ü¤@þ  x ™û6nœ:kÖˆw}mzzÁ‚ÇŸþ lªÒÒÒ‘#G80--íÒ¥K))) .TtPÍip 3b„µ¿¿ó·ßž³±12IJyLžl;l˜ÕŠáÞÞ?MŸ>ìÛoÝ45ÛìÝ [ט(4ODD„···¢£½àààŒŒŒôôt---Bˆ±±ñ¾}û9œVœŒ54B,«‘ãZvîÜÙ¯_¿ÀÀ@Bˆ‰‰É¡C‡>øàƒ½{÷êêêÊvC- ãߊ´dɸ1czñÅñ’’Šfwbl¬sìØœœöë¯w'Lº?[†€L„„„,\¸I¾%ôôôØìÿîÏ# ÌÌÌŒŒŒ|}}‹‹‹™zŠ¢ÂÂÂLMMuttV¯^Êåruuuýýý% Nž_øo¥hjjMu¸{÷.AÕÕÕÔ»çÏŸ …@¬-Vd7_ì­ªªªÆÆ~-ÏÏϧŠËªª*&“Y^^.ØlvVV–„ í¨¿‡G¬¨¨`0¯^½jß …B&“ÙbýÝ⩉"IÈpìØ1ѼOž<0`@DDÕóÖ­[¢%jmðÄÄÄÖ¢6÷výûOè7b„áúõŽß}—qþüŸï9”š#8Ø.-mYUUí'Ÿì¿ÐÔ„}®èÇf³ D/ù|~EE…XŸ²²2ªM5ÊËË©—ZZZA¨¨¨ˆµ¥WUUÅãñ¬­­Ùl¶¿¿?u°gÏž666ÉÉÉ.\PUU4i’„ íPRRâååE’$I’†††à}Ψÿþ%%%b'%Z<5i2P›Ïˆæ­¬¬ Œ)+{þþ£k|îÜW_~9}óæÓ§ï¼{WüŸy3{{ûP—Z ‚`±X×®]ëcddT\\Lµ©›Í–Ukkëâââ;v”––fddˆŽ»¹¹%%%%$$xxx$)!uÑ·Må8›Í>~ü8uÑ·©©‰Ïç‹êÚv˜5kVtt´èå½{÷tuu_¼xÑÚ©½3ƒØ#„ŒŒD¿#R ƒ·õW ÿ}°}™Û¶ÍÕȨW@@tCƒàýGSUU ü$##˜ÉT›5ë»ÐГ2VñÕÔÔ¬X±‚Ãᨫ«s8???ÑUF’$óòòd8—ÌT„ÉfX,—Ë»âøžƒË6ÿƒÏd8Z‡Z»vmee%—ËÍËË«¬¬LIIÙ°aƒX__ßM›6åææ,]º”Ëå²X,i¥~L¢A/_¾¬ú—@ hhh033355½ÿ¾AÏŸ?'ÂÁÁ!///>>ÞÓÓSB‹•ššZSSCm?"Âçó[ŒD÷ññáñxyyy………þþþS¦LiËš‰[¹råíÛ·¿úꫲ²²»wï.^¼ØÑÑ‘Åbµvjé3Ì;wãÆÙÙÙýõ—è› ’o'in[ù(.~ "ÌHÄùóçù|>ŸÏÿóÏ?gÏž=nÜ8þÎüÒü¬ ÿÞ¹óŒ¹ù¦™3wË*Ûû ¤¸ÿ[(>xðÀÓÓ³W¯^\.—ººÜüþïúúúU«Vêèèxxx´vkõÛm‚ bbbÄÍåææ¦¥¥õïß_]]ÝÒÒòôéÓ¶¶¶C‡¥Æ±··1bÕn-ÃáÇ{÷î­««Kí¯B·¶¶f2™Ïž= &:^__¿zõj###---[[[Ñw+ßyF­¡v#éÞ½{ïÞ½çÏŸOMÝÚ©‰VUš Ož<©«« ¢ö?9|ø0uPòàïü¡ ñýKÅ—ž~‡ÍJJ’qUZúÔÅeŸ±q°’n"eýѧOŸ—/_6?Èçó©¯O)iýM¼ë+n2Ÿ®ùI=|ø ˆ²²²¶F•fðIøY?|È?pà?S¦lïÛw¹‘Ñ—}û.Ÿ>}‡4Á:š”õ·Ârpp ¥;E§…ï_(:[Û‘¾¾–!!É¥¥OßÝ[jýúé=º$4Ô9:ú’Ýî;wÚÿ…*E†-–ß‹e1ÔÓaêëë%¬µ róH’÷cn«¿ÿ®Þ¿ÿ×I“¶Ž¿aëÖSùù‚šÞgL ÔÖÖ^½zõìÙ³Í÷Õ¦Wzz:ÙGw4™Aý  pÖ¯w4¨÷‚‡^¾”僩I’ôö¶ÈÈÖÖfÚÛàÀ;[sãÆ1cÆHî³sçÎøøø¤¤¤Ë—/ÿý÷ß .½wëÖ­¨¨¨mÛ¶ÅÄÄܹs'22r÷îÝÔ}111'NlÞx›‡‡‡©©éõë×KKKƒ‚‚|||êëë©ï·Qâãã]\\¾ÿþûÖ2ˆþ{QYìQ‚Íïß¿?""âÈ‘#¹¹¹oÞ¼ òŒÞéñãÇAAA¦¦¦ýû÷—°nkÖ¬ùå—_jkkE‘Z\iflîÙ³—áá¸Ü=|°aÛ¶ÓÅÅO‚ ¶ÉoëPК3gÎØØØ¬[·®_¿~tgù‡]‹W‘7oÞLw4™QâGžtVݺ©FFú͘±{Ñ¢ÈØXC–×J ÐONþ<:úÒ–-§Ž»þí·nãÆµs -ôâÅ ]]]ÑKÑæ|>_ô=¶C‡­[·n„ A„……9²¦¦†z~upp°®®îœ9s‚X¹r¥¨ýüùóz{{S#ˆo»zõª––u¹}Ò¤Iuuu555ŽŽŽ}ûöMLLlëÖS<ÞlÙ®¢BΟ?iÖ¬±›7§q¹{œÇ󃮮–lg¡µÅ²¥¥%õ’Ïç×ÖÖR[üŠ´¸½ñðáà m±¼mÛ¶ìììÂÂBÑg¢-–G-a‹e*C;PÛ7¿ ¼¼œš½}gtþüù±cÇÁd2™L&uPBæ·wAnq¤ÑÐ ÈÌ,ïÙó““'o‘$A}QMBÿçÏ_­\ù^7·È„ºzº#€2Aý   FŒ0 óüì³èáÃÙNNãe>¾A°0/w÷ «Vµ²ÚÂõò2Û WéP[,Ï;—ºòÊb±.^¼(Ö‡ÚÞ˜º¤#¶X677ß±cµgˆ¨xussûùçŸïß¿ß|‹å3ÛµÅò®]»¨WWWK¹i]k´´´ÞABæ·kúÖÖáÔÔvvœÈÈ·n=HLÌKIÉ«ªªe0-ïžÉáèüñÇ éO­ƒ(ûÿq@Îpÿ7€âš5kÌçŸãƃšbâÄAçÎ}µpá¤d'§}Ô7Û”¶X~ÿ-–[#åºQ‘ÞËäÑ£9›6͹}{S|üb‡±L¦I’²½ ¤§\»Â+>üï@¡­\9óã‡.XñèQuMÁdªÛ¥§ ÂéÓw®]{¬¶¶Í_•S—/_ÖÑÑ™>}ú Aƒ"##Åú¬ZµÊÉÉiΜ9‘‘‘R>wîÜìììæ ‚ ¦L™Òë_7nÜ8xðà¾}ûØlö’%KæÍ›gkkK]–ÖÖÖž6mš¡¡!õõÐÖ2„……ñx¼6¿ÚÚÚzôèÑoׯ¢ã_ý5—Ë3gθqãÊÊÊ’““Û¼pRfÝD‘Z[‡¶b0T&M¼w¯÷„þø£ÏäÉC RE×›åM´+üÕ«WUTTp×øû ñ%b÷òe½ý÷ššêÉÉݺuà}ƒB¡0))oýúTmmæ–-.S¦ í¸¹ÚêèÑ£îîîJýo–£££™™Ùš5kè¢è$ÿ¬=ª>~üFbâï÷ïW9z4;=]!î?IHHpss£;HG!I277÷Ã?¤^VVV²Ùì²²2###i>ûö>ï|\]] ‚h~-׿––ztôÂ’’'_}Õ±ß3#IÒÕõ£ÌÌC‡öõöþ)(èÈóç¯:tÆ.[,ËPŸ>=&ÿúëʬ¬ÕË—O31éMw¢®Hv…Wj¨¿”‡£óã>ÇŽ] ¿ÐÑs±Ù¬ÈH¿£G—ä啚™mܵ+½¾¾±£'íܰÅrG05í½råŒýûçҤˡwWøÎûŸ(+«Áß|ã°~}êÀúS§ëèé&N”žþåž=™{÷þzêÔíçXY™vô¤¶X†N€Þ]á;\ÿP~~ÖŸ~:!00¶¤ä‰¦ÓÔT áæäðFŽ4twÿÁÝýeßÚMôýËÚÚÚëׯSß$nqWxêe‹»Âóx¼¯¯oxMÍùÌØ§Oϰ0¯¤¤À§O_R»£ÈmjPÔ®ð,«ùnîÔ®ðT[š]á‹‹‹wìØQZZš‘‘!—Ô õ7€2QScüø£ommýâÅÑA“Üæµ°0ÉÌ\±s§ûñã×-,6‡‡_çì ˜ä¼+|§ú@Éèë÷øé§y—/îÙsVžóª¨®®]¼øµ“Óø RgÎüî÷ß‹å -»ÂwØÿ@)¥¤\[º4.,ÌÓÙ™†Ms¯]ûïÚµ)·o—yxLXµj¦¾~Žž±ìÿ RRÆŸu§ßÿÞÇÛûcÿ¥ää4þáê/¿Œ××ïam=Dγßïôé ÌÌ{!!ɉ‰¹îîf+WÎÔÓÓêèy©½„”êoeõù矔•=_´(êøñ/† ë+ÿÓ¦0779xð·ƒ;sæÎ_ØøúNì 'tZZZ&$$tÄÈr†ûO”XCƒÀÛû§ÒÒ§'O.—ÃM ­©®®Ý·ï?45Õ&ûûOVScÐ@þpÿ H€çÏt*jjŒððùššêsçþ\[KÛ“äzöÔ á^¾2cƨíÛO[Ym‰½ÒÔ„ë;-@ý  Üzô`FEù=|Èÿâ‹8zKÞ>}z~û­[vvÈÇY½:ÑÆfGfæ=ó(&ÔßJÏØX÷Ç}33ïmß~šî,‡£óí·nçÎ}ejÚÛ×7ÜÝý‡[·Êè @Pt––ƒvíòØ·ï×ÈÈ‹tg!‚:´ïÁƒ¾‡/zúôå¬Yß}þylQÑcºC(ìÐI¸¸|øêUÝš5ÉššL7·èŽCac3|êÔaÇ_ÿ“'owp·|ùôAƒ èÎ@'ìЩlÚ”~!:záäÉCéÎò?B¡ðܹ?víʸs§ÜÆfxp°íèѺCÈ v¦É\\\šï‚ú S …AAGNŸ¾”¨h5nS“05õÆž=g‹‹Ÿp¹c?9ÒîP2pôèQº#€Bãp8¢—¨¿:›†ÏÏwî”§¥-8PŸî8âšš„'OÞüþûs÷ï?œ=éÎ ¨¿:¿ÌÌ{ Fz{[„†:Ó¥ òóEE]:vìÚ«WõS¦ ýôSs›á ~# À;¡þ莻¾tiìŠvË—O§;KÛ44~ûíϤ¤¼3gnkht³·çím¡h[›H±~ýzº3@‡6¬¯ŽŽÖÆiÚÚÝÇïOwœ6`0TLL fÏ;gÎønÝÔNœ¸õãç³² ŽN÷îÝèÐ6¸þ Ð…lÙrò‡Îïß?×Þ~,ÝYÚI hÊÊÊOHøýìÙ»A“•Õ`{û±3fŒêÙSƒîhRAý еP%xX˜×œ9Ðå½ÔÕ5^¸âÄÍôô;µµõãÇ÷Ÿ={¬ƒÃ8}}}Þõ7@—³yó‰ƒSê«àÍÕÔ¼ÉȸsâÄͬ¬|’$'O:cƨiÓFèèhÒ  ¨¿º¡P’—>Ú´tÇ‘™êêÚôô»§Nݺx± ±±ÉÌl€Ý(;»QŽÝÑþõ7@W$ W­JLHø=2ÒoêÔatÇ‘±W¯êΟÿ3#ãî¹sTW׎ahg7rÖ¬1C‡ö¥;êo€®ª©I¸lÙ/§Oߎ‰Ydi9ˆî8IvijH55}&s “9¸¾¾¼ºú?0ÐÀÅÅ%11‘î턇útQ**äîÝ/^¼Y°àÐÑ£‹aGíåË—[XXtÄÈB¡°¡AØ­Ûg18ÈÙwß}Gw€÷‚ëß]Z}}ãüùׯ?ˆ3†Îœ$É„„7773€Rpuu%׿Ay©ÐèÔ­›jTÔ‰9;ïËÎ.¤;@ç‡ú «SSc<è;cÆhŸŸ/]* ;@'‡úCeÏžO¹Ü1¾¾.äÓ 3Cý A †ÊîÝööc}|Â33ïÑ ÓBý ÿ Jp//ó… #32îÒ sBý ÿC’ä¦MNÎÎDÿúëtÇiAMMÍŠ+8Žºº:‡Ãñó󫨨 Þ"I2//O†sÉ|@E˜ñõë×!!!&&&L&³wïÞ\.7''§Cg1¨¿àÿQQ!wît÷ð˜°`Á¡ãǯÓçÿijjš9sæÕ«W“’’ÊËËOž<Éd2---ëêê莦4¾øâ‹ÔÔÔC‡=xðàÒ¥KS§N­©©¡;@‚çï€8rëV#£^±V-Y2•îDÿˆŠŠ****,,ÔÔÔ$B__ÿþý¡¡¡ªªJüÏI’Ož<ÑÓÓ“òø{JNNþå—_>þøc‚ BBB©õùÀõohY`à'¡¡Î[¶œ =© k‹‹‹{»Xd±X Cô²±±‘Çãq8===OOÏgÏžQÇI’Œ722êÑ£Ç×_}äÈ6›Ê@@ÖIDAT­­­,êÛ¼ñ¶›7oÚØØèèètïÞ}äÈ‘G%bÖ¬Y»wï¦:äääèéé½~ýºµ OŸ>mÞ&I’ }}}ÑqÑ»¢ãB¡pÛ¶m ÐÑÑquu•þŒZÔ­[·ÿþ÷¿-.àÛñ¤\7 Z\1êSYYYÆÆÆ$IŠ­^CCƒ„ü u))׌ƒ—-‹khtèDA$$$HîÓ«W¯´´4 #äæænݺÕÄÄ$'''??êÔ©ŽŽŽ¢w¹\îÓ§O“’’‚˜1c†¨]TT$ cbbŠ‹‹›7¨›O1dÈ€€€’’’G…‡‡«««×ÕÕEEEYXXP–-[öÙgŸIÈðäɱ¶ØAÑŒ¢ã{÷î4hЕ+W ¹\®‹‹‹”gÔ¢;v0 —èè芊 ±l1žäY$whqŨOYZZ^¼xñ‡~[½Ö’‹¸¸¸ˆ@¡þ€wÈ̼7`ÀWóçG¼yÓÐq³HS«ªªfgg7ÿ…Ïç ÿ-^MMM£££©wïÞ%¢ººšz÷üùóB¡P ˆµÅŠìæã‹½UUUÕØØHµóóó©"µªªŠÉd–—— 6›••%!C;êïáÇÇÅÅQ+** Æ«W¯ÚwF”ììì   Q£F‘$ùÁœ={VlF±x’g‘ܡţ>•˜˜H-©ØêIHNAý Ê÷ŸÀ;ØØ ÿå—Ï._þËÛûàË—t~Ó‘Ífüï |>_´ù‰HYY™‰‰ Õ¦åååÔK---‚ TTTÄÚÒ«ªªâñxÖÖÖl6Ûßߟ:سgO›äää .¨ªªNš4IB†v())ñòò"I’$ICCC@ð>gT]]=a„ݻwß¾}»¢¢ÂÜÜÜÁÁAtOK‹Þ9‹„-®ÅØØ˜hiõ¤\å…úÞÍÜÜ$..àî݇ÞÞ?UUÕÒÃÞÞþÀÔµU‚ X,Öµk×ÄúSmªÁf³eÀÚÚº¸¸xÇŽ¥¥¥¢ãnnnIII $IJÈ  ‰6–ãl6ûøñãÔe³¦¦&>Ÿ?xðàvŸÂ°aÃN:Eµûöí»uëÖׯ_?þ¼Ýñ$kmňf5ºØêÉjj……ú¤2~|¿cÇ>//îàVVöœ– k×®­¬¬är¹yyy•••)))6lëãëë»iÓ¦ÜÜÜ‚‚‚¥K—r¹\‹%Íà±±±%%%ÍA¼|ù²ê_ ¡¡ÁÌÌÌÔÔôþýû>>>AP•«ƒƒC^^^||¼§§§„ ,+55µ¦¦&44´ùÔ|>¿ÅHÔq———WXXèïï?eÊ”¶¬™8WW×àààŒŒŒÊÊÊ{÷î}ùå—&L055•ï}´¶b͉­@§‡ú¤5thßÌÌ={jØÚîúý÷bù000¸|ù²ŽŽÎôéÓ ™˜˜(ÖgÕªUNNNsæÌ±°°000ˆŒŒ”rð¹sçfgg7o1eÊ”^ÿºqãÆÁƒ÷íÛÇf³—,Y2oÞ<[[[‚ ´µµ§M›fhh8fÌ ÂÂÂx<ÞÀ­¬¬DóZ[[=úíªTtü믿ær¹sæÌ7n\YYYrrr›®™íÛ·»¹¹ôë×ÏÎή®®.--MB¼÷ÔÚŠ5'¶z)TŒ-¥@YÔÖÖ/^|øÂ…ü°0¯Ù³ÇÊjX’$ÜÜÜd5 œ9::š™™­Y³†î J©M«çêêJÄÛ¿z( \ÿ€¶ÑÐèvèЂO?°dILdä%ºãЯ¶¶öêÕ«gÏžõòò¢;Ë?ÒÓÓÉ–ðx<º£‰SÀÕèhJüÀ0  ƒ¡²e‹ËÀkצ?Ù°ÁQE¥ë~mîÌ™3óæÍ[·n]¿~ýèÎò;;;eùû¶®@GCý í´p¡µ†F·Õ«_½ªÛ¾ÝUMñîÏtFÎÎÎÎÎÎt§PVX=è‚P@ûyzš÷éÓsñâÃ%%O~þy¾žž݉îÿ€÷2uê°ŒŒ`>¿vڴׯÿ—î8Šõ7¼¯þýõNž\>f ÇÉi_BÂïtÇPh¨¿@´´Ô#"æ/ZôqPБµk Mt'PP¸ÿdƒÁP áŽÁþòËø¢¢Ç?þ裭ݽM#\¹r¥ƒ²AgR^^nddDw €öÃów@Æ®\)Z´(²wo툈ýûëIù)’ìº;B[¹¸¸àù; ¼P€ì=xðlþüCÏ¿ûÎsÆŒQtÇP ¨¿ CÔ×7nÚt""₋ˇ۷»vïÞîD õ7t ôô;Ë—16Öùé§yÒß‹Љaÿè@vv£Îœ  [Û]ii7éŽ@?\ÿ€WW׸y󉈈 ÞÞ¡¡Î]öIõêo›#GrBBRÆ3 ó24ìEwzàþ“O?5?ujù³g¯>ùdDZc×éŽ@\ÿ¹jh„…eîÙ“9}úˆ;Üut4éN W¨¿€yy%K—ƽzU·k—Ç´i#èŽ ?¨¿€55oBB’SR®yy™¯_﨡  K@ý tн²~ýñþýõöîõ6¬/Ýq:¾ tòö¶8{vE·nªvv»¾ýöL]]#݉:®ý„BaRRÞ7ß×Öî¾m›ËäÉCéNÐQP€¢xüøÅæÍiIIy³gݲÅYWW‹îD²‡úKZÚuëŽ …ÄÊ•3>ýÔ\E…¤;€,¡þ…SSóz÷îŒÈÈKƒ÷Ù¸qŽ…… ݉dõ7(¨Êʪ­[O%'_³²2ݰÁqèPìŽêoPh—.|óMjQÑc_߉K—Úèéá¦pPn¨¿@Ñ M‰‰¹;w¦WW¿öó›´xñ”ž=5èÐN¨¿@9ÔÕ5FGgïÝ{®¡A°xñ”… ­55ÕéÐf¨¿@™¼~]—–ùæMƒ»û„¥Km zÐ   P€òyþüÕÏ?gEF^$rÁ‚I‹Y÷ê¥Iw(© þuôèQÉ^¿\¼X™•UÙØ(œ4©—k,Ÿ` gÇ‚î2ƒúIJõä’TÓÐÅ`hÖÔ\ìèH@ —ÄÄDºSÈŒ*ÝZ•àææFw  “««+ÝdL…î]êoùAý ?¨¿äõ7€ü þÔß ÜjjjV¬XÁápÔÕÕ9ŽŸŸ_EEõI’yyy2œKæÒ>£···Ø¿ýö“É|ñâ…ôƒ466’$ùôéÓ6M-ÿÅP¨¿@‰555Íœ9óêÕ«IIIååå'Ožd2™–––uuutGSîîî§OŸ~ýúµèHjjêôéÓ{ôè!ý #&&¦MèÊP€‹ŠŠ***JOOŸ0a‚¾¾þ˜1cöïßëÖ-UU%~À\k×’ÛqùlmmÕÔÔΜ9#:’ššêââ"ÍgEyH’ôööVWW—m6€Î õ7(±¸¸¸ÀÀ@MMÍæY,ƒÁ½llläñxGOOÏÓÓóÙ³gÔq’$ãã㌌zôèñõ×_9r„Ífkkk‹:ÄÆÆ6o¼íæÍ›666:::Ý»w9räÑ£G ‚˜5kÖîÝ»©999zzz¯_¿n-ƒ¨¤¦Ú$I¡¯¯/Vj7?. ·mÛ6`ÀWWWéÏèmݺusttLJJ¢^Þ¾}»¢¢ÂÞÞ^ÂYYYÆÆÆb9©ðMMMÛ¶m311ÑÔÔ477ÏÎÎnm‰º4!€B""!!ArŸ^½z¥¥¥I!77wëÖ­&&&999ùùùS§Nutt½ËårŸ>}JUŸ3f̵‹ŠŠ„BaLLLqqqó5`ó)† PRRòèÑ£ððpuuõººº¨¨( ªÃ²eË>ûì3 žU†VUU1™Ìòòr@Àf³³²²$dhGý=|øð¸¸8ê`EEƒÁxõêUûÎH(644èêꦦ¦ …Â>ø ""Bò‰‰‰byDíaÆ…‡‡SGšššø|~SSS‹KÔâb¶õ7t>¸ÿ”›Í.((½äóù¢ÍODÊÊÊLLL¨6Õ(//§^jii¡¢¢"Ö–^UUdz¶¶f³ÙþþþÔÁž={ÚØØ$''_¸pAUUuÒ¤I2´CII‰——I’$I ‚÷9#UUUgg礤¤²²²;wî8::JžÂØØ¸µ¡JKK‡ BµI’d±X$I¶¸D]êoPbööö .ñÁb±®]»&ÖÇÈȨ¸¸˜jS 6›-«ÖÖÖÅÅÅ;vì(--ÍÈÈwssKJJJHHððð IRB¡PH´±g³Ùǧ.¤Q—™ü>gáîî~âĉ¤¤¤É“'ëèèHžBBAÏf³KJJD/«ªªAkKÐe¡þ%¶víÚÊÊJ.—›——WYY™’’²añ>¾¾¾›6mÊÍÍ-((Xºt)—Ëe±XÒ KU“¢A/_¾¬ú—@ hhh033355½ÿ¾AÏŸ?'ÂÁÁ!///>>ÞÓÓSB‹•ššZSSÚ|j>Ÿßb$ê¸ÇËËË+,,ô÷÷Ÿ2eJ[Ö¬ü±ººúæÍ›E;ŸH9…XÎùóç¯_¿þÒ¥K=Ú¹s§‘‘Ñëׯ[["€®‹¶;_$"¤¸ÿ[(>xðÀÓÓ³W¯^\.—ººÜüþïúúúU«Vêèèxxx´vkõÛm‚ bbbÄÍåææ¦¥¥õïß_]]ÝÒÒòôéÓ¶¶¶C‡¥Æ±··1bÕn-ÃáÇ{÷î­««Kí¯B·¶¶f2™Ïž= &:^__¿zõj###---[[[Ñw+ßyF2ŒÇ‹¿s ±œOž<©¯¯_»v­±±±†††™™uzkK$M*!îÿ†Îˆ¾õ_E@’dBB‚ØÓ•ˆ£££™™Ùš5kè¢Ü\]] ‚HLL¤;€Ìàþ«­­½zõêÙ³g½¼¼èÎòôôt²%<îh]Ž? @19sfÞ¼yëÖ­ëׯÝYþagg‡¿x(Ôß2æìììììLw PP¸ÿ@~PÈêoù©©©Y±b‡ÃQWWçp8~~~o?°:7ÔßrÒÔÔ4sæÌ«W¯&%%•——Ÿ libglom-1.22: Glom::Document Class Reference
        Inheritance diagram for Glom::Document:
        Collaboration diagram for Glom::Document:

        Public Types

        enum  HostingMode {
          HOSTING_MODE_POSTGRES_CENTRAL,
          HOSTING_MODE_POSTGRES_SELF,
          HOSTING_MODE_SQLITE,
          HOSTING_MODE_DEFAULT = HOSTING_MODE_POSTGRES_SELF
        }
         How the database is hosted. More...
         
        enum  userLevelReason {
          USER_LEVEL_REASON_UNKNOWN,
          USER_LEVEL_REASON_FILE_READ_ONLY,
          USER_LEVEL_REASON_DATABASE_ACCESS_LEVEL,
          USER_LEVEL_REASON_OPENED_FROM_BROWSE
        }
         
        enum  load_failure_codes { LOAD_FAILURE_CODE_FILE_VERSION_TOO_NEW = LOAD_FAILURE_CODE_LAST + 1 }
         Failure codes that could be returned by load_after() More...
         
        typedef std::vector< sharedptr
        < Relationship > > 
        type_vec_relationships
         
        typedef std::vector< sharedptr
        < Field > > 
        type_vec_fields
         
        typedef std::pair< sharedptr
        < LayoutItem_Field >
        , sharedptr< Relationship > > 
        type_pairFieldTrigger
         
        typedef std::vector
        < type_pairFieldTrigger
        type_list_lookups
         
        typedef std::vector< sharedptr
        < LayoutGroup > > 
        type_list_layout_groups
         
        typedef std::pair< sharedptr
        < TranslatableItem >
        , Glib::ustring
        pair_translatable_item_and_hint
         The translatable item and a hint about what it is. More...
         
        typedef std::vector
        < pair_translatable_item_and_hint
        type_list_translatables
         
        typedef std::vector< sharedptr
        < TableInfo > > 
        type_listTableInfo
         
        typedef std::vector
        < Gnome::Gda::Value > 
        type_row_data
         
        typedef std::vector
        < type_row_data
        type_example_rows
         
        typedef std::vector< GroupInfotype_list_groups
         These are only used when recreating a database from an example file. The actualy access-control is on the server, of course. More...
         
        typedef sigc::signal< void,
        AppState::userlevels
        type_signal_userlevel_changed
         
        typedef sigc::slot< void > SlotProgress
         This callback should show UI to indicate that work is still happening. More...
         

        Public Member Functions

         Document ()
         
        virtual ~Document ()
         
        virtual void set_modified (bool value=true)
         
        virtual void set_file_uri (const Glib::ustring& file_uri, bool bEnforceFileExtension=false)
         Set the file URI that will be used in future calls to load() and save(). More...
         
        bool load (int& failure_code)
         
        void set_opened_from_browse (bool val=true)
         Whether the document was opened from another networked glom instance, instead of via a URI. More...
         
        bool get_opened_from_browse () const
         
        void set_allow_autosave (bool value=true)
         The document usually saves itself when you call set_modified(). More...
         
        bool get_is_example_file () const
         
        void set_is_example_file (bool value=true)
         
        bool get_is_backup_file () const
         
        void set_is_backup_file (bool value=true)
         
        guint get_document_format_version ()
         
        void set_hosting_mode (HostingMode mode)
         Set the hosting mode of the database. More...
         
        HostingMode get_hosting_mode () const
         This returns how the database is hosted. More...
         
        void set_network_shared (bool shared=true)
         Whether the database (and document) is shared over the network. More...
         
        bool get_network_shared () const
         See set_network_shared(). More...
         
        void set_connection_server (const Glib::ustring& strVal)
         
        void set_connection_database (const Glib::ustring& strVal)
         
        void set_connection_port (unsigned int port_number)
         
        void set_connection_try_other_ports (bool val)
         
        void set_connection_user (const Glib::ustring& strVal)
         Temporarily set a username in the document. More...
         
        std::string get_connection_self_hosted_directory_uri () const
         If the database should be hosted, this provides the path to the directory that contains all the files needed to do that. More...
         
        Glib::ustring get_connection_server () const
         
        Glib::ustring get_connection_database () const
         
        unsigned int get_connection_port () const
         
        bool get_connection_try_other_ports () const
         
        Glib::ustring get_connection_user () const
         Retrieve a username previously set in the document. More...
         
        void set_translation_original_locale (const Glib::ustring& locale)
         Set the language/locale used by original titles. More...
         
        Glib::ustring get_translation_original_locale () const
         Get the language/locale used by original titles. More...
         
        std::vector< Glib::ustringget_translation_available_locales () const
         Get a list of locales for which at least one string is translated. More...
         
        type_vec_relationships get_relationships (const Glib::ustring& table_name, bool plus_system_prefs=false) const
         
        void set_relationships (const Glib::ustring& table_name, const type_vec_relationships& vecRelationships)
         
        sharedptr< Relationshipget_relationship (const Glib::ustring& table_name, const Glib::ustring& relationship_name) const
         
        void set_relationship (const Glib::ustring& table_name, const sharedptr< Relationship >& relationship)
         
        void remove_relationship (const sharedptr< const Relationship >& relationship)
         
        bool get_relationship_is_to_one (const Glib::ustring& table_name, const Glib::ustring& relationship_name) const
         Returns whether the relationship's to-field is a primary key or unique field, meaning that there can be only one related record for each value of the from-field. More...
         
        sharedptr< const Relationshipget_field_used_in_relationship_to_one (const Glib::ustring& table_name, const sharedptr< const LayoutItem_Field >& layout_field) const
         Returns whether the field is the from-field in a to-one relationship. More...
         
        type_vec_fields get_table_fields (const Glib::ustring& table_name) const
         
        void set_table_fields (const Glib::ustring& table_name, const type_vec_fields& vecFields)
         
        sharedptr< Fieldget_field (const Glib::ustring& table_name, const Glib::ustring& strFieldName) const
         
        sharedptr< Fieldget_field_primary_key (const Glib::ustring& table_name) const
         
        void remove_field (const Glib::ustring& table_name, const Glib::ustring& field_name)
         Use this after removing a field from a table, so that it is not used anymore in relationships, layouts, reports, etc. More...
         
        type_list_lookups get_lookup_fields (const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Get the fields whose values should be looked up when field_name changes, with the relationship used to lookup the value. More...
         
        type_list_layout_groups get_data_layout_groups (const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform=Glib::ustring()) const
         Get the layout groups for a layout. More...
         
        bool get_data_layout_groups_have_any_fields (const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform=Glib::ustring()) const
         Discover whether there are any fields in the layout. More...
         
        void set_data_layout_groups (const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform, const type_list_layout_groups& groups)
         Set the layout groups for a layout. More...
         
        type_list_layout_groups get_data_layout_groups_plus_new_fields (const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform=Glib::ustring()) const
         The layout_name, such as "details", "list". More...
         
        type_list_layout_groups get_data_layout_groups_default (const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform=Glib::ustring()) const
         
        type_list_translatables get_translatable_items ()
         
        void fill_layout_field_details (const Glib::ustring& parent_table_name, const sharedptr< LayoutGroup >& layout_group) const
         
        void fill_layout_field_details (const Glib::ustring& parent_table_name, type_list_layout_groups& groups) const
         
        void change_field_name (const Glib::ustring& table_name, const Glib::ustring& strFieldNameOld, const Glib::ustring& strFieldNameNew)
         When a field name is changed, change it in the relationships, layouts, reports, and fields data: More...
         
        void change_table_name (const Glib::ustring& table_name_old, const Glib::ustring& table_name_new)
         When a table name is changed, change it in the relationships and tables data: More...
         
        void change_relationship_name (const Glib::ustring& table_name, const Glib::ustring& name, const Glib::ustring& name_new)
         When a relationship name is changed, change it in layouts and reports: More...
         
        type_listTableInfo get_tables (bool plus_system_prefs=false) const
         
        std::vector< Glib::ustringget_table_names (bool plus_system_prefs=false) const
         
        void set_tables (const type_listTableInfo& tables)
         
        sharedptr< TableInfoget_table (const Glib::ustring& table_name) const
         
        void add_table (const sharedptr< TableInfo >& table_name)
         
        void remove_table (const Glib::ustring& table_name)
         Use this after DROPing the table. More...
         
        bool get_table_is_known (const Glib::ustring& table_name) const
         
        bool get_table_is_hidden (const Glib::ustring& table_name) const
         
        Glib::ustring get_table_title (const Glib::ustring& table_name, const Glib::ustring& locale) const
         
        Glib::ustring get_table_title_original (const Glib::ustring& table_name) const
         
        void set_table_title (const Glib::ustring& table_name, const Glib::ustring&value, const Glib::ustring& locale)
         
        Glib::ustring get_table_title_singular (const Glib::ustring& table_name, const Glib::ustring& locale) const
         
        Glib::ustring get_table_title_singular_original (const Glib::ustring& table_name) const
         
        void set_table_example_data (const Glib::ustring& table_name, const type_example_rows& rows)
         Save example data into the document, for use when creating the example database on the server. More...
         
        type_example_rows get_table_example_data (const Glib::ustring& table_name) const
         
        virtual Glib::ustring get_name () const
         Gets filename part of file_uri, or 'untitled'. More...
         
        Glib::ustring get_default_table () const
         
        Glib::ustring get_first_table () const
         
        Glib::ustring get_database_title_original () const
         
        Glib::ustring get_database_title (const Glib::ustring& locale) const
         
        void set_database_title_original (const Glib::ustring& title)
         
        std::vector< Glib::ustringget_library_module_names () const
         
        void set_library_module (const Glib::ustring& name, const Glib::ustring& script)
         
        Glib::ustring get_library_module (const Glib::ustring& name) const
         
        void remove_library_module (const Glib::ustring& name)
         
        Glib::ustring get_startup_script () const
         Get a Python script that should be run when the document is opened. More...
         
        void set_startup_script (const Glib::ustring& script)
         See get_startup_script(). More...
         
        type_list_groups get_groups () const
         
        void set_group (GroupInfo&group)
         This adds the group if necessary. More...
         
        void remove_group (const Glib::ustring& group_name)
         
        std::vector< Glib::ustringget_report_names (const Glib::ustring& table_name) const
         
        void set_report (const Glib::ustring& table_name, const sharedptr< Report >& report)
         
        sharedptr< Reportget_report (const Glib::ustring& table_name, const Glib::ustring& report_name) const
         
        void remove_report (const Glib::ustring& table_name, const Glib::ustring& report_name)
         
        std::vector< Glib::ustringget_print_layout_names (const Glib::ustring& table_name) const
         
        void set_print_layout (const Glib::ustring& table_name, const sharedptr< PrintLayout >& print_layout)
         
        sharedptr< PrintLayoutget_print_layout (const Glib::ustring& table_name, const Glib::ustring& print_layout_name) const
         
        void remove_print_layout (const Glib::ustring& table_name, const Glib::ustring& print_layout_name)
         
        void set_layout_record_viewed (const Glib::ustring& table_name, const Glib::ustring& layout_name, const Gnome::Gda::Value& primary_key_value)
         
        void forget_layout_record_viewed (const Glib::ustring& table_name)
         
        Gnome::Gda::Value get_layout_record_viewed (const Glib::ustring& table_name, const Glib::ustring& layout_name) const
         
        void set_layout_current (const Glib::ustring& table_name, const Glib::ustring& layout_name)
         Temporarily save (but not in the document) the last-viewed layout for the table, so we can show the same layout when navigating back to this table later. More...
         
        void set_criteria_current (const Glib::ustring& table_name, const FoundSet& found_set)
         Temporarily save (but not in the document) the last-viewed criteria for the table, so we can show the same criteria (sort order, where clause) when navigating back to this table later. More...
         
        Glib::ustring get_layout_current (const Glib::ustring& table_name) const
         
        FoundSet get_criteria_current (const Glib::ustring& table_name) const
         
        bool get_table_overview_position (const Glib::ustring& table_name, float& x, float& y) const
         Retrieve the x and y coordinates for the given table position in the relationship overview dialog. More...
         
        void set_table_overview_position (const Glib::ustring& utable_name, float x, float y)
         Set the position of a table in the relationship overview dialog. More...
         
        AppState::userlevels get_userlevel (userLevelReason& reason) const
         
        AppState::userlevels get_userlevel () const
         
        bool set_userlevel (AppState::userlevels userlevel)
         This is transitory information, not saved to disk. More...
         
        type_signal_userlevel_changed signal_userlevel_changed ()
         
        void emit_userlevel_changed ()
         
        Glib::ustring get_active_layout_platform () const
         This is transitory information, not saved to disk. More...
         
        void set_active_layout_platform (const Glib::ustring& layout_platform=Glib::ustring())
         This is transitory information, not saved to disk. More...
         
        Glib::ustring build_and_get_contents () const
         
        Glib::ustring save_backup_file (const Glib::ustring& uri, const SlotProgress& slot_progress)
         Save a copy of the document as a backup. More...
         
        - Public Member Functions inherited from GlomBakery::Document_XML
         Document_XML ()
         
        virtual ~Document_XML ()
         
        void set_dtd_name (const std::string& strVal)
         
        std::string get_dtd_name () const
         
        void set_dtd_root_node_name (const Glib::ustring& strVal, const Glib::ustring& xmlns=Glib::ustring())
         Set the root node name and (optionally) the xmlns ID to be written when writing the document. More...
         
        Glib::ustring get_dtd_root_node_name () const
         
        Glib::ustring get_xml () const
         
        - Public Member Functions inherited from GlomBakery::Document
         Document ()
         
        bool save ()
         
        bool load (int& failure_code)
         
        bool load_from_data (const guchar* data, std::size_t length, int& failure_code)
         
        bool get_modified () const
         
        bool get_is_new () const
         Whether this just a default document. More...
         
        void set_is_new (bool bVal)
         Called by AppWindow_WithDoc::init_create_document(). More...
         
        Glib::ustring get_contents () const
         
        Glib::ustring get_file_uri_with_extension (const Glib::ustring& uri)
         
        Glib::ustring get_file_uri () const
         
        bool get_read_only () const
         
        void set_read_only (bool bVal)
         
        void set_view (ViewBase* pView)
         If you don't want to use a View, then don't use set_view(). More...
         
        ViewBaseget_view ()
         
        void set_file_extension (const Glib::ustring& strVal)
         
        Glib::ustring get_file_extension () const
         
        type_signal_modifiedsignal_modified ()
         This signal is emitted when the document has been modified. More...
         
        type_signal_forgetsignal_forget ()
         This signal is emitted when the view should forget the document. More...
         

        Static Public Member Functions

        static guint get_latest_known_document_format_version ()
         
        static void fill_translatable_custom_choices (Formatting& formatting, type_list_translatables& the_list, const Glib::ustring& hint)
         
        static Glib::ustring restore_backup_file (const Glib::ustring& backup_uri, const SlotProgress& slot_progress)
         
        static sharedptr< TableInfocreate_table_system_preferences ()
         
        static sharedptr< TableInfocreate_table_system_preferences (type_vec_fields& fields)
         
        static sharedptr< Relationshipcreate_relationship_system_preferences (const Glib::ustring& table_name)
         
        static bool get_relationship_is_system_properties (const sharedptr< const Relationship >& relationship)
         

        Additional Inherited Members

        - Protected Types inherited from GlomBakery::Document_XML
        typedef GlomBakery::Document type_base
         
        - Protected Member Functions inherited from GlomBakery::Document_XML
        const xmlpp::Element* get_node_document () const
         
        xmlpp::Element* get_node_document ()
         
        void Util_DOM_Write (Glib::ustring& refstrXML) const
         
        void add_indenting_white_space_to_node (xmlpp::Node* node=0, const Glib::ustring& start_indent=Glib::ustring())
         Put each node on its own line and add white space for indenting, even if there are child text nodes. More...
         
        - Protected Attributes inherited from GlomBakery::Document_XML
        xmlpp::DomParser m_DOM_Parser
         
        xmlpp::Document* m_pDOM_Document
         
        std::string m_strDTD_Name
         
        Glib::ustring m_strRootNodeName
         
        Glib::ustring m_root_xmlns
         
        bool m_write_formatted
         

        Member Typedef Documentation

        The translatable item and a hint about what it is.

        This callback should show UI to indicate that work is still happening.

        For instance, a pulsing ProgressBar.

        These are only used when recreating a database from an example file. The actualy access-control is on the server, of course.

        typedef std::vector< Gnome::Gda::Value > Glom::Document::type_row_data

        Member Enumeration Documentation

        How the database is hosted.

        Enumerator
        HOSTING_MODE_POSTGRES_CENTRAL 

        The database is hosted on an external postgresql server.

        HOSTING_MODE_POSTGRES_SELF 

        A new postgres database process is spawned that hosts the data.

        HOSTING_MODE_SQLITE 

        A sqlite database file is used.

        HOSTING_MODE_DEFAULT 

        Failure codes that could be returned by load_after()

        Enumerator
        LOAD_FAILURE_CODE_FILE_VERSION_TOO_NEW 
        Enumerator
        USER_LEVEL_REASON_UNKNOWN 
        USER_LEVEL_REASON_FILE_READ_ONLY 
        USER_LEVEL_REASON_DATABASE_ACCESS_LEVEL 
        USER_LEVEL_REASON_OPENED_FROM_BROWSE 

        Constructor & Destructor Documentation

        Glom::Document::Document ( )
        virtual Glom::Document::~Document ( )
        virtual

        Reimplemented from GlomBakery::Document.

        Member Function Documentation

        void Glom::Document::add_table ( const sharedptr< TableInfo >&  table_name)
        Glib::ustring Glom::Document::build_and_get_contents ( ) const
        void Glom::Document::change_field_name ( const Glib::ustring table_name,
        const Glib::ustring strFieldNameOld,
        const Glib::ustring strFieldNameNew 
        )

        When a field name is changed, change it in the relationships, layouts, reports, and fields data:

        void Glom::Document::change_relationship_name ( const Glib::ustring table_name,
        const Glib::ustring name,
        const Glib::ustring name_new 
        )

        When a relationship name is changed, change it in layouts and reports:

        void Glom::Document::change_table_name ( const Glib::ustring table_name_old,
        const Glib::ustring table_name_new 
        )

        When a table name is changed, change it in the relationships and tables data:

        static sharedptr<Relationship> Glom::Document::create_relationship_system_preferences ( const Glib::ustring table_name)
        static
        static sharedptr<TableInfo> Glom::Document::create_table_system_preferences ( )
        static
        static sharedptr<TableInfo> Glom::Document::create_table_system_preferences ( type_vec_fields fields)
        static
        void Glom::Document::emit_userlevel_changed ( )
        void Glom::Document::fill_layout_field_details ( const Glib::ustring parent_table_name,
        const sharedptr< LayoutGroup >&  layout_group 
        ) const
        void Glom::Document::fill_layout_field_details ( const Glib::ustring parent_table_name,
        type_list_layout_groups groups 
        ) const
        static void Glom::Document::fill_translatable_custom_choices ( Formatting formatting,
        type_list_translatables the_list,
        const Glib::ustring hint 
        )
        static
        void Glom::Document::forget_layout_record_viewed ( const Glib::ustring table_name)
        Glib::ustring Glom::Document::get_active_layout_platform ( ) const

        This is transitory information, not saved to disk.

        Glib::ustring Glom::Document::get_connection_database ( ) const
        unsigned int Glom::Document::get_connection_port ( ) const
        std::string Glom::Document::get_connection_self_hosted_directory_uri ( ) const

        If the database should be hosted, this provides the path to the directory that contains all the files needed to do that.

        This is usually a specifically-named directory at the same level as the .glom file. If the database is a sqlite database, this specifies the directory in which the database file is in.

        Glib::ustring Glom::Document::get_connection_server ( ) const
        bool Glom::Document::get_connection_try_other_ports ( ) const
        Glib::ustring Glom::Document::get_connection_user ( ) const

        Retrieve a username previously set in the document.

        Note that this is not saved in the document's file.

        TODO: Remove this, and just store it in ConnectionPool?

        FoundSet Glom::Document::get_criteria_current ( const Glib::ustring table_name) const
        type_list_layout_groups Glom::Document::get_data_layout_groups ( const Glib::ustring layout_name,
        const Glib::ustring parent_table_name,
        const Glib::ustring layout_platform = Glib::ustring() 
        ) const

        Get the layout groups for a layout.

        Parameters
        layout_nameThe name of the layout, such as list or details.
        parent_table_nameThe name of the table for which this layout should appear.
        layout_platformThe platform for which this layout should be used. Possible values are an empty string (meaning normal platforms) or "maemo" meaning "normal".
        Returns
        A list of layout groups at the top-level of the requested layout.
        type_list_layout_groups Glom::Document::get_data_layout_groups_default ( const Glib::ustring layout_name,
        const Glib::ustring parent_table_name,
        const Glib::ustring layout_platform = Glib::ustring() 
        ) const
        bool Glom::Document::get_data_layout_groups_have_any_fields ( const Glib::ustring layout_name,
        const Glib::ustring parent_table_name,
        const Glib::ustring layout_platform = Glib::ustring() 
        ) const

        Discover whether there are any fields in the layout.

        Parameters
        layout_nameThe name of the layout, such as list or details.
        parent_table_nameThe name of the table for which this layout should appear.
        layout_platformThe platform for which this layout should be used. Possible values are an empty string (meaning normal platforms) or "maemo" meaning "normal".
        Returns
        true if there is at least one field in the layout group or its sub groups.
        type_list_layout_groups Glom::Document::get_data_layout_groups_plus_new_fields ( const Glib::ustring layout_name,
        const Glib::ustring parent_table_name,
        const Glib::ustring layout_platform = Glib::ustring() 
        ) const

        The layout_name, such as "details", "list".

        parent_table_name The name of the table on whose layout the layout appears.

        Parameters
        layout_platformThe platform for which this layout should be used. Possible values are an empty string (meaning normal platforms) or "maemo" meaning "normal".
        Glib::ustring Glom::Document::get_database_title ( const Glib::ustring locale) const
        Glib::ustring Glom::Document::get_database_title_original ( ) const
        Glib::ustring Glom::Document::get_default_table ( ) const
        guint Glom::Document::get_document_format_version ( )
        sharedptr<Field> Glom::Document::get_field ( const Glib::ustring table_name,
        const Glib::ustring strFieldName 
        ) const
        sharedptr<Field> Glom::Document::get_field_primary_key ( const Glib::ustring table_name) const
        sharedptr<const Relationship> Glom::Document::get_field_used_in_relationship_to_one ( const Glib::ustring table_name,
        const sharedptr< const LayoutItem_Field >&  layout_field 
        ) const

        Returns whether the field is the from-field in a to-one relationship.

        See Also
        get_relationship_is_to_one(). Ignores hidden tables.
        Glib::ustring Glom::Document::get_first_table ( ) const
        type_list_groups Glom::Document::get_groups ( ) const
        HostingMode Glom::Document::get_hosting_mode ( ) const

        This returns how the database is hosted.

        bool Glom::Document::get_is_backup_file ( ) const
        bool Glom::Document::get_is_example_file ( ) const
        static guint Glom::Document::get_latest_known_document_format_version ( )
        static
        Glib::ustring Glom::Document::get_layout_current ( const Glib::ustring table_name) const
        Gnome::Gda::Value Glom::Document::get_layout_record_viewed ( const Glib::ustring table_name,
        const Glib::ustring layout_name 
        ) const
        Glib::ustring Glom::Document::get_library_module ( const Glib::ustring name) const
        std::vector<Glib::ustring> Glom::Document::get_library_module_names ( ) const
        type_list_lookups Glom::Document::get_lookup_fields ( const Glib::ustring table_name,
        const Glib::ustring field_name 
        ) const

        Get the fields whose values should be looked up when field_name changes, with the relationship used to lookup the value.

        virtual Glib::ustring Glom::Document::get_name ( ) const
        virtual

        Gets filename part of file_uri, or 'untitled'.

        Reimplemented from GlomBakery::Document.

        bool Glom::Document::get_network_shared ( ) const

        See set_network_shared().

        Returns
        true if the database is (or should be) shared over the network.
        bool Glom::Document::get_opened_from_browse ( ) const
        sharedptr<PrintLayout> Glom::Document::get_print_layout ( const Glib::ustring table_name,
        const Glib::ustring print_layout_name 
        ) const
        std::vector<Glib::ustring> Glom::Document::get_print_layout_names ( const Glib::ustring table_name) const
        sharedptr<Relationship> Glom::Document::get_relationship ( const Glib::ustring table_name,
        const Glib::ustring relationship_name 
        ) const
        static bool Glom::Document::get_relationship_is_system_properties ( const sharedptr< const Relationship >&  relationship)
        static
        bool Glom::Document::get_relationship_is_to_one ( const Glib::ustring table_name,
        const Glib::ustring relationship_name 
        ) const

        Returns whether the relationship's to-field is a primary key or unique field, meaning that there can be only one related record for each value of the from-field.

        type_vec_relationships Glom::Document::get_relationships ( const Glib::ustring table_name,
        bool  plus_system_prefs = false 
        ) const
        sharedptr<Report> Glom::Document::get_report ( const Glib::ustring table_name,
        const Glib::ustring report_name 
        ) const
        std::vector<Glib::ustring> Glom::Document::get_report_names ( const Glib::ustring table_name) const
        Glib::ustring Glom::Document::get_startup_script ( ) const

        Get a Python script that should be run when the document is opened.

        sharedptr<TableInfo> Glom::Document::get_table ( const Glib::ustring table_name) const
        type_example_rows Glom::Document::get_table_example_data ( const Glib::ustring table_name) const
        type_vec_fields Glom::Document::get_table_fields ( const Glib::ustring table_name) const
        bool Glom::Document::get_table_is_hidden ( const Glib::ustring table_name) const
        bool Glom::Document::get_table_is_known ( const Glib::ustring table_name) const
        std::vector<Glib::ustring> Glom::Document::get_table_names ( bool  plus_system_prefs = false) const
        bool Glom::Document::get_table_overview_position ( const Glib::ustring table_name,
        float &  x,
        float &  y 
        ) const

        Retrieve the x and y coordinates for the given table position in the relationship overview dialog.

        Parameters
        table_nameThe name of the table to query.
        xThe x coordinate of the table position.
        yThe y coordinate of the table position.
        Returns
        false if the table does not have any position for this table.
        Glib::ustring Glom::Document::get_table_title ( const Glib::ustring table_name,
        const Glib::ustring locale 
        ) const
        Glib::ustring Glom::Document::get_table_title_original ( const Glib::ustring table_name) const
        Glib::ustring Glom::Document::get_table_title_singular ( const Glib::ustring table_name,
        const Glib::ustring locale 
        ) const
        Glib::ustring Glom::Document::get_table_title_singular_original ( const Glib::ustring table_name) const
        type_listTableInfo Glom::Document::get_tables ( bool  plus_system_prefs = false) const
        type_list_translatables Glom::Document::get_translatable_items ( )
        std::vector<Glib::ustring> Glom::Document::get_translation_available_locales ( ) const

        Get a list of locales for which at least one string is translated.

        The result will include the original, from get_translation_original_locale().

        Glib::ustring Glom::Document::get_translation_original_locale ( ) const

        Get the language/locale used by original titles.

        Title translations are translations of the text in this language.

        AppState::userlevels Glom::Document::get_userlevel ( userLevelReason reason) const
        Parameters
        reasonThe reason that the user is not a developer, if he is not.
        Returns
        Whether the user is a developer.
        AppState::userlevels Glom::Document::get_userlevel ( ) const
        bool Glom::Document::load ( int &  failure_code)
        void Glom::Document::remove_field ( const Glib::ustring table_name,
        const Glib::ustring field_name 
        )

        Use this after removing a field from a table, so that it is not used anymore in relationships, layouts, reports, etc.

        void Glom::Document::remove_group ( const Glib::ustring group_name)
        void Glom::Document::remove_library_module ( const Glib::ustring name)
        void Glom::Document::remove_print_layout ( const Glib::ustring table_name,
        const Glib::ustring print_layout_name 
        )
        void Glom::Document::remove_relationship ( const sharedptr< const Relationship >&  relationship)
        void Glom::Document::remove_report ( const Glib::ustring table_name,
        const Glib::ustring report_name 
        )
        void Glom::Document::remove_table ( const Glib::ustring table_name)

        Use this after DROPing the table.

        It removes information about the table, including fields and layouts, and any place that parts of the table are used.

        static Glib::ustring Glom::Document::restore_backup_file ( const Glib::ustring backup_uri,
        const SlotProgress slot_progress 
        )
        static
        Parameters
        backup_uri,:The URI of a .tar.gz backup file.
        Returns
        The URI of the restored .glom file.
        Glib::ustring Glom::Document::save_backup_file ( const Glib::ustring uri,
        const SlotProgress slot_progress 
        )

        Save a copy of the document as a backup.

        This document (and its URI) will not be changed.

        Parameters
        Thelocation at which to save the backup Glom file.
        Returns
        The URI of the .tar.gz tarball.
        void Glom::Document::set_active_layout_platform ( const Glib::ustring layout_platform = Glib::ustring())

        This is transitory information, not saved to disk.

        void Glom::Document::set_allow_autosave ( bool  value = true)

        The document usually saves itself when you call set_modified().

        Pass false to this function to prevent that temporarily. The document will be saved, if necessary, after you call this function with true.

        void Glom::Document::set_connection_database ( const Glib::ustring strVal)
        void Glom::Document::set_connection_port ( unsigned int  port_number)
        void Glom::Document::set_connection_server ( const Glib::ustring strVal)
        void Glom::Document::set_connection_try_other_ports ( bool  val)
        void Glom::Document::set_connection_user ( const Glib::ustring strVal)

        Temporarily set a username in the document.

        Note that this is not saved in the document's file.

        TODO: Remove this, and just store it in ConnectionPool?

        void Glom::Document::set_criteria_current ( const Glib::ustring table_name,
        const FoundSet found_set 
        )

        Temporarily save (but not in the document) the last-viewed criteria for the table, so we can show the same criteria (sort order, where clause) when navigating back to this table later.

        Parameters
        table_nameThe table.
        found_setAdditional information about the last use of that layout, such as the sort order or where clause.
        void Glom::Document::set_data_layout_groups ( const Glib::ustring layout_name,
        const Glib::ustring parent_table_name,
        const Glib::ustring layout_platform,
        const type_list_layout_groups groups 
        )

        Set the layout groups for a layout.

        Parameters
        layout_nameThe name of the layout, such as list or details.
        parent_table_nameThe name of the table for which this layout should appear.
        layout_platformThe platform for which this layout should be used. Possible values are an empty string (meaning normal platforms) or "maemo" meaning "normal".
        groupsA list of layout groups at the top-level of the requested layout.
        void Glom::Document::set_database_title_original ( const Glib::ustring title)
        virtual void Glom::Document::set_file_uri ( const Glib::ustring file_uri,
        bool  bEnforceFileExtension = false 
        )
        virtual

        Set the file URI that will be used in future calls to load() and save().

        Note that the document will not be saved immediately to the new URI. It will be saved either after the next change (if using autosave) or when calling save() explicitly. Likewise, the document at the URI will not be loaded until load() is called explicitly. That is unlike in the base class's implementation.

        Reimplemented from GlomBakery::Document.

        void Glom::Document::set_group ( GroupInfo group)

        This adds the group if necessary.

        void Glom::Document::set_hosting_mode ( HostingMode  mode)

        Set the hosting mode of the database.

        void Glom::Document::set_is_backup_file ( bool  value = true)
        void Glom::Document::set_is_example_file ( bool  value = true)
        void Glom::Document::set_layout_current ( const Glib::ustring table_name,
        const Glib::ustring layout_name 
        )

        Temporarily save (but not in the document) the last-viewed layout for the table, so we can show the same layout when navigating back to this table later.

        Parameters
        table_nameThe table.
        layout_nameThe layout name, such as "list" or "details".
        void Glom::Document::set_layout_record_viewed ( const Glib::ustring table_name,
        const Glib::ustring layout_name,
        const Gnome::Gda::Value &  primary_key_value 
        )
        void Glom::Document::set_library_module ( const Glib::ustring name,
        const Glib::ustring script 
        )
        virtual void Glom::Document::set_modified ( bool  value = true)
        virtual

        Reimplemented from GlomBakery::Document.

        void Glom::Document::set_network_shared ( bool  shared = true)

        Whether the database (and document) is shared over the network.

        This setting is saved in the file, allowing the database to be shared immediately after opening the document.

        Parameters
        sharedtrue if the database should be shared.
        void Glom::Document::set_opened_from_browse ( bool  val = true)

        Whether the document was opened from another networked glom instance, instead of via a URI.

        void Glom::Document::set_print_layout ( const Glib::ustring table_name,
        const sharedptr< PrintLayout >&  print_layout 
        )
        void Glom::Document::set_relationship ( const Glib::ustring table_name,
        const sharedptr< Relationship >&  relationship 
        )
        void Glom::Document::set_relationships ( const Glib::ustring table_name,
        const type_vec_relationships vecRelationships 
        )
        void Glom::Document::set_report ( const Glib::ustring table_name,
        const sharedptr< Report >&  report 
        )
        void Glom::Document::set_startup_script ( const Glib::ustring script)
        void Glom::Document::set_table_example_data ( const Glib::ustring table_name,
        const type_example_rows rows 
        )

        Save example data into the document, for use when creating the example database on the server.

        Don't use this for large amounts of data.

        Parameters
        table_nameThe table that should contain this example data.
        rowsEach row is separated by a newline. Each line has comma-separated field values, in SQL format.
        void Glom::Document::set_table_fields ( const Glib::ustring table_name,
        const type_vec_fields vecFields 
        )
        void Glom::Document::set_table_overview_position ( const Glib::ustring utable_name,
        float  x,
        float  y 
        )

        Set the position of a table in the relationship overview dialog.

        Parameters
        table_nameThe name of the table to modify.
        xThe x coordinate of the table position.
        yThe y coordinate of the table position.
        void Glom::Document::set_table_title ( const Glib::ustring table_name,
        const Glib::ustring value,
        const Glib::ustring locale 
        )
        void Glom::Document::set_tables ( const type_listTableInfo tables)
        void Glom::Document::set_translation_original_locale ( const Glib::ustring locale)

        Set the language/locale used by original titles.

        Title translations are translations of the text in this language.

        Parameters
        locale,:For instance, "en_US.UTF-8".
        bool Glom::Document::set_userlevel ( AppState::userlevels  userlevel)

        This is transitory information, not saved to disk.

        type_signal_userlevel_changed Glom::Document::signal_userlevel_changed ( )

        The documentation for this class was generated from the following file:
        • libglom/document/document.h
        glom-1.22.4/docs/libglom_reference/html/functions_func_0x64.html0000644000175000017500000001146312234777147026040 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - d -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Footer__inherit__graph.png0000644000175000017500000001570512234777146033335 0ustar00murraycmurrayc00000000000000‰PNG  IHDR°Ÿ¾iSbKGDÿÿÿ ½§“zIDATxœíÝ{PSgÞðç`C€u ¢€WìtªëÖ¬8´xÉ‹L–Â.Öõu×Ѷ«; E·TQgݵ»cµÖËP€ˆ-ÔËŠhÁ_T¼¹)7•KHrÞ?=›'$æ€ù}þzòœ‡'¿sΗsNîMÓ€WìØ.Œ,@€@ €À5½˜¢(ëÔ¬ÆôãÊAúì³Ï,W`Íõë×ÿùÏš3x "##-T`Ù €k@€@ €Ë¢³³sË–-b±˜Çã‰Åâ5kÖ444àEE) ‹Ü 3a¼‹aÎFQTKKËæ´ø&ŽÁvJ§Ó-[¶Œ¢(™L6eÊ”ÆÆÆ#GŽVTTðx¼áÏo@¥Rᆫ«kaaá»ï¾‹7nœÅïÈ6Y ÉÉÉUUU•••cÇŽEyxx‡Ãanj4š„„±XìîîÝÚÚŠû)ŠÊÈȉDãÆÛºuëÉ“'…B¡‹‹ËæÍ›™iiiú c(Š***òòòÚ´iSpp°@ pttô÷÷?uê3àìÙ³"‘H |óÍ7¸S.—899y{{;vŒ™­¬¬¬ÿ$ø‰|–––`999ÞÞÞ|>?<<üÙ³gL?MÓ{÷î}:B¨©© ߬©©‰‰‰Á‹<==µZ-³ú31Ø‚[¬? LzèÐ!R„ŸÏ/--5#‰ª««q7„BáðïÚÞ.‰¤ººzß¾}µµµçÎÓÐÿÕü%K–>þÎ;åååüã#""˜‡Ä±±± …¢²²ríÚµAAA–„ç7s°å™>£ 3®!hš~üøqtt´«««“““T*ÅÇýkˆÞÞÞ¸¸8OOO@…O“t¿Ógÿ6B(55U¿¡_›Á5¾™——çííÍãñóóóCBB¦OŸÞ~\ÃÅ‹ýýý|||Nž<É 36‰D"qpphmm5q/éééžžž®®®111!>>^$9;;‡„„0×€ú…1ó›3ØXÛ+]T‚ÑÂJ•àm @ @€@ „Ðóç¿<þ ÛUŒƒ¿eáúõëV¨ƒ]%%Ï(Šš7σíBÞ,sv%E›ü`—|”O ø!º­í4Û…Xƒé=>ÈÂô¿ž>íxï½DŠBOŸvþêW¶þV<¸†@ùùwìì(Š¢òóo³] û èÔ©š¦u::3³„íZØg먭m¹u«^§£iZwûvýãdžïs´5¶ˆ¼¼2{{ü.)ŠËµ;sæÿX.ˆm¶ˆŒŒæå{½4]V–œÝzXgÓ¸¿©¶¶…y EÓte峚X-Še6ˆÜÜ›¯Î/ÃÉͽÉV=#킦éS§nôõiõ;{{µ2™Âž}1Ævq󿣧O;û÷76¶ß¼ùØúõŒ¶ˆÓ§ ϘŸ5l4.'Gap¾Àz{µ99 ­VgýªF DqqU{{½½Ý˜1Ü1c¸cÆpÆŒáà¶½½JÕ]\\Ívìx#ŸØùìí9_|!enæä”"„>úhÓÃåÚè¿Ê /ÛˆuëRBß}·ŠíBØg£ÿÀ @ @€@ € @ @€@ € @ @€@ € @ @€@ € Xø+…""",8›Õ´µ9"„‚¶ yYYYœÍ (jþüù"‘È‚scêëë‹‹‹-ü-a–ý¹q?oEæü¸ûPÁ5 @ @€@;èììܲe‹X,æñxb±xÍš5 xEQ …‚÷eñ Gà=Z ÐétË–-+))‘Édõõõ?üðƒƒƒC`` Z­¶~1À ߆Ÿœœ\UUUYY9vìX„‡‡ÇÁƒ“’’¸ÜQüÕüE577»»»›Ù?b±p„HOOß°aNƒÏçs8ÿý}F“ ‹ÝÝÝ£££[[_þ¾*EQ"‘hܸq[·n=yò¤P(tqqÙ¼y33 --M¿Ñ_YYYpp°@ pttô÷÷?uêBhùòåû÷ïÇŠ‹‹ÝÝÝ{zzŒÕÐÒҢߦ( !äááÁô3K™~š¦÷îÝ;yòd@aþY›eŸçBfßœÉÓÒÒjjjô¡/^´¿¢ÕjûúúæÍ›çççwÿþýØØX„P[[BhÅŠ …"###::ÚD |>ÿÌ™3IIIúw­R©, ÷ÇÆÆ&$$(ŠÊÊʵk× e›Y‘eÏ@ȼ—¿?~íêêêää$•JñÿŸþ5Dooo\\œ§§§@ ˆŠŠ2vzîßF¥¦¦4ôÉåò¼¼˜Åv9,ƒk”•¥àr).×.+KÎv-ì³õ@<þËùóåN£Ñž?·«ËÖßùmë8w®\£Ñá¶F£ýé§;ìÖÃ:[Dv¶ÂÎîå…$EQÙÙ£õ6–bÓhiyñóÏZíË#„V«»zõa[[»U±Ë¦‘Ÿ!ÃÇ™?þx‹•bF›„L&7xÆZ§£e2›~¬a»¨¯W•–>2xš¦i…âQSS;[U±Îvqöl‡3Àês8vgΔY¿žÂv‘•%g>¢O«ÕÙò3T6ˆššæš|Uˆ¦éû÷kk[Xflô=•¥¥fÎôÔé^>à|ú´!4a‚ ¾iggWZZëí=j>ÃoA~ù{”Z·.!ôÝw«Ø.„}6zÊÆ@ @€@ € @ @€@ € @ @€@ € @ @€@ € @ a¸ß1uýúõºº:‹”¢îîf„ЩS§Ø.d¸Äbq@@À°¦æOE‡‡‡[h]€„‡‡s‡Zà[èÂÃ󲲆?¦ˆˆˆáO×€ @ @°^ :;;·lÙ"‹y<žX,^³fMCC^DQ”BaÉ_?³ø„æ0±‚£ˆ•¡Óé–-[VRR"“Éêëëøá‡ÀÀ@µú-ùÌ·f­ôóÉÉÉUUU•••cÇŽEyxx?22’üf ÿµ sž?wuuÍËË3¶!$—Ë÷ìÙãããS\\¬T*/^Æ,•J¥---2™ !´téR¦]UUEÓtjjjuuµ~O¨Ó¦M[¿~}MMÍ“'OŽ;ÆãñÔjurrr@@ðé§Ÿ®[·ÎD ÍÍÍmýÎAW000ðêÕ«;vìÒüÓ§O/..¾wïÞ‚ V¬Xaz#›¹/L³R ¸\îµk×þ{¯¯¨T*úÕþóóóKIIÁÊËËBxiaa!MÓø'²ôÛ{]~ƒEííí·•J%ÞèíííõõõZ­V(™¨Át ]Á¬¬,š¦‡:rr2î,++cc‘@Xé”! +**ô7Sÿ+ðºº:ÜÆúúz|ÓÙÙ!dgggÐ6_{{{BB‚D" …k×®ÅãÇÎÎξrå —Ë]¸p¡‰†¹‚^^^¦×q@ÌàiÓ¦™_ÌpX)¡¡¡‡b~Ïç—––Œ‰DÕÕÕ¸B¡ÐRH$’êêê}ûöÕÖÖž;wŽéŒŒ”Éd™™™QQQE™¨ÿËÛ%ƒ® NðP篪ªÂ‡"‹n£†y„1ó0õôéS‘H´dɹ\ÞØØ˜=gÎDž2vîÜéççwãÆ |~•J¥øo‘ÞñÀö€×………ªW4Íĉÿþ÷¿·¶¶–••EFF"„”J%MÓŽŽŽ|>¿¬¬Œ¦ic5ðùü£Gvtt¬_¿éÒ+**Ì_Áטß××÷Æ÷îÝ[¸p!3x˜ûÂ4+‚¦éÇGGG»ºº:99I¥Rüÿ¡¿½z{{ãââ<==ATT”þ9Õt B©©© }r¹Ï:kÖ,Ü6VÃ÷ß?aÂ777ü(÷K$‡ÖÖV3Wp¨ó#„öìÙãëëëââ²råÊgÏžYj_˜0Ü_åÃoÊÕo ›7oÞ¶mÛØ.ÄEQr¹|îܹfŽ·È¾°é×2º»»KJJΟ?Ãv-#Å({Ͳ >ùä“;vLš4‰íZ0̃÷ë±é@¬\¹råÊ•lW1²Øô)ô @ B¨¶¶¥¶¶…í*F \T[ä#",ª«s¡iäåÕÉv!ÃR\\<þüaN2Ü@ ÷“„#ógN5ê1þüáïŽá>Sù¸}»nÉ’ý¡sç6Ïž-b»–Á5ÊË+³·çØÛsòòÊØ®…}¶ŽÎ̼Ñ×§íëÓž:uC§³õ㥭¢¤¤ºµõn77?¿q£šÝzXgëÈͽÉå¾|£¯½='7÷&»õ°Î¦Ñ×§=}ú¦F£enææÞìëÓ²[»l:EEÊ/ˆÒtvª¯\Q²UÏH`Ó8}º”Ë%¶—kwú´MŸ5l7Ýݽùù·™ó¦Ñh n÷ôô²Uël7/ÞðrA­Ö\¸pÏúõŒ¶ˆìlþ8ž;;*;ÛÚŸ9l4¿\¾ü@«Õõ_¤Ñè._~ðüù/Ö¯j$°Ñ@Üîë X_Ÿ¶ àŽ5ë9lôÅ­¶¶.ýcÀ_ä „’’>bz\\\]Çð—o;}“­@0V øïþ;v BhÒ$7ö*)lô”Œ@ € @ @€@ € @ @€@ € @ @€@ € @ @€@ñS~MŸ-°³sBétÝlÂý ~ÇTxxø¬Y³¬[`ÍÝ»we2™~a fÍšµhÑ"ëUØf¸† @ @x¯6îîîNII),,T©T®®®sçÎýÃþàîîŽ :|øð´iÓ,UŸÅ' ÷dÐcåu4aÈ i:..Ž¢¨ÄÄĉ'¶¶¶ž={vÆ iiiöööo¢Ä·Ò×_íëëËÜtrrb±}C>eüôÓOûÛßf̘Áçó}||>ûì³ãÇs8œ7QŸuutt˜ß?|ŽŽŽÎzì솶#Þ\aCÄ… ÂÂÂô; VI«Õ?~<22rÅŠ»víêì|ù#ëAAA—.]ŠˆˆX¶lÙÑ£GÿóŸÿ„‡‡/_¾üСCÌ€ .è7ú«¬¬Ü¼yshhhHHÈêÕ«/_¾ŒŠÏÊÊÂîÝ»·bÅ µZm¬fSâ6>€‡……lbý~š¦Oœ8ññLJ††~ùå—æ¯‘1===/^ÑétÆ6Ú€fvëÖ­ßþö·¦+10ä@TVVúøø˜“™™yéÒ¥ÄÄă¶µµíÛ·YtñâÅãÇÇÇÇŸ8qâÂ… ÿþ÷¿ãââ²²²šššBÛ¶mó÷÷×oô÷ÕW_‰D¢#GŽdddDDDìÞ½[£Ñá—.]úÍo~“m¬………¡ÜÜÜñãÇëÏÍÍÍÏÏß¾}ûáÇ{{{÷ïßoæóùçŸÿÏ+>4¶Ñì4³°£G&$$,^¼ØDý ù¢»»[Ã1×GgÏžuvvÆí‚‚‚U«V͘1!´iÓ¦Õ«WwwwãÓddd¤‹‹ËÂ… BQQQL»³³sâĉ|ðžiô÷í·ß:::âÒ;ï¼Ó×××ÕÕõþûïïß¿¿¥¥ÅÍÍíòåË;vìØ·oŸ±^Ù3gV¯^=sæL„ÐæÍ›###Õj5ÇtŒMØÿ*rÀfbKZXDDÄìÙ³‡º¦C„››[]]óØÙ³gÕjuxx¸þ˜gÏž …BÜÆæææI“&!„Ñ«—UõÛæ{ñâʼn'ÊËËD"î;vìœ9s®\¹2eʇ3{öl5¼†'OžìÚµk×®]LOss3¾÷á¯6`Áƒ®…‰Â&L˜ðe 9 ,8sæÌ‡~ˆÿGoß¾m0ÆÃã±±óñ‘ÓÍÍb?V³iÓ¦™3g®_¿ÞÏϦé?ü÷/Z´èÇ|ôèÑâÅ‹)Š2Q~µ·¹¹Ùü;ussûÓŸþ´`Áüç]]]ÌáÐR,xÐ-i¢°×Ëå¯!bcc[[[·nݪT*[[[¯^½š’’b0&$$$55õÁƒõõõÿú׿ÌÜ|.\À«Í4P¿ë/­V;cÆ ‘Hôèѣݻw#„ž?Žzÿý÷•Jå¥K—‚ƒƒMÔàìì|íÚµîîî´´4ý»Æ“ô‡ûCBBŽ?®T*þñ|þùçCÙff°`[ò 6ä#ŸÏÿæ›oŽ9ò—¿ü¥··÷½÷ÞûòË/£££õÇ|üñÇ===Û·oW«Õ¿þõ¯7mÚdæä»wïÞ¶mÛĉ™BH%>üç?ÿùÀÇŽ›:uêïÿû®®®/¾ø"%%ÅÉÉiΜ9øš×X 7n<|øð‘#G6nܘ——‡;ßyç5kÖÈd²qãÆé×ÃôGGG«ÕêíÛ·¿xñÂßßÿ«¯¾êvÔ€[‹7W˜á;¦þú׿ŽÞ÷C$$$̘1#&&†íBFË—/'&&šzÇÔ(¥V«««« ÅÆÙ®å¥7nÄÅÅõïÿÝï~·fÍë×c¦·$%%%{÷î}½Kë7aÞ¼yø ƒÑå- „D"‘H$lWñ6€—¿@€@‚áEåÝ»wY©°¢ÿî†òâ£|D €k@€@ €„ÿŠœ¼çÄ,…IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Image__inherit__graph.png0000644000175000017500000001247312234777146033120 0ustar00murraycmurrayc00000000000000‰PNG  IHDR°Ã­c fbKGDÿÿÿ ½§“ðIDATxœíÝ{P×Ûð³$Êň!ÀÏ1E/H;¶¶N¡•ŠƒRmmÆBÅZßQ[{Áh¡–zÚv¬h-v¤€r/—Š×z­4Á× ¯n DM ˆ‚“ìûÇÑýåWÍóùëääpöÙÍ7›ÝMH(š¦OØq]\ € @ oùnŠ¢¦0`,ŸWö„ÐçŸîïïÏ^=€3¥¥¥?þø£å1½Âßß?""‚¥’Çz C € °ˆ¶¶¶5kÖxzzÚÛÛ{zz.[¶¬±±ßEQ”\.ge)Ì„]±¸ˆ§œ¢(FÓ§9YßDO£÷ÓÎ^ÆyóæQ•››;nܸ¦¦¦½{÷TUUÙÛÛ?ýüf´Z-n¸¸¸œ:ujêÔ©¡ádz¾ ÛÄB öïß_]]­T*‡ †rwwßµkצM›ø|&ïJ(2m@`zsP¥V«ÝÜÜžÓù{ÅÂKFFFƪU«pB¡Çã17õz}BB‚§§§››[dddss3î§(*33S"‘ >|íÚµ‹ÅÎÎα±±Ì€ôôtÓFO(Š:sæÌèÑ£W¯^,‰ýüü²³³™ÅÅʼnD$ýüóϸS&“ùûû;99yyy¥¤¤0³]¼x±ë$øB¾»»»F£év–ŸŸïåå% ÃÂÂîܹÃôÓ4½uëÖ±cÇŠD¢ððpf#˜®3Oƒ{ÝbO‹¶!”••eyŒ‹‹KQQ‘…d2Ù–-[¼½½ËÊÊ ŬY³,XÀÜ+•J5Mnn.BhîܹL»ººš¦é´´´ššÓ†Ù̦7Î;7zôè•+WÖÖÖÞºu+%%ÅÞÞ^§Óá!!!·oßÎËËãóù>¤izܸqqqq*•*//ÏÎÎîÖ­[xÚ‰'ö4‰Z­¦iÚ€iÓ¦]ºtéÊ•+o¼ñÆÜ¹s™RwîÜ9~üøÒÒR¥R)•Jú®3¿…Á–·˜YYY½?â½ÜmE ø|þùóçMÿÓjµô“µõññIMMÅ*++BwïÞÅ÷ž:uЦiƒÁ`Ö6}°{ªÍ,9994M·¶¶êõzÜ©P(˜MŒúã?˜ùq§H$úá‡ð`­V«×ëñ´&Á ðZÐ4}á„PKK žÓ××7##ßÕØØÈãñÚÛÛéaap¿·˜5`á%C,WUU™æ€9Å`ܼyÓÛÛ·q£¡¡ß!;;;³v?Œ=!ÔÚÚš(‹—/_n:ÀÃÃÃlþäää­[·Ž3æ£>ºzõ*ó2ga’^Œ?7&Mš„R©TøfmmmTT>-òðð0 ÌFèÊÂ`·XW,LšœœŒCŠ …fc$IMM nã†X,~úE›ÁÛ%00°¦¦fûöíuuuG5ÐõÝüwÞy§¾¾>''gÔ¨Q3gÎd¢la’^(•JÜP(Eyzzâ›b±¸  ?F£V«0aBOëÒ§Á,b!‰‰‰*•J*•Êår•J•ŸŸŸ””d6fÉ’%6lÉdUUU111R©ÔʳƒôôôÚÚZÓF¯=z4}útŸk×®EGG£';ínM:5>>~ôèѯ½öMÓ½N‚Ï{- ˆ¿råJeeå'Ÿ|ΜGGG'$$Èår¥R¹|ùò   nKÂó[9˜}–_QÇ4M߸q#22ÒÅÅÅÉÉI*•â}€é1Dggg\\œ‡‡‡H$Z´h~™¤»¼|vm#„ÒÒÒL¦µ™Cà›EEE^^^ööö%%%!!!“&Mê:?®áĉ~~~ÞÞÞd†õ4I`` ƒƒCss³…¥dddxxx¸¸¸DEE™m„øøx‰D"BBB˜c@Ó˜ù­ÜS»'tP žtP ^$@€@ €BÝ»÷ðÞ½‡\W1(ôþ‘…ÒÒÒ¨ƒ[ååw(Šš>ÝëBž-kJжø]6ò¯|"ÑûÑ--p]È@°üˆ÷²‡°üÇ/†Û·ï¾újE¡Û·Ûþó[ÿ(C ’’+vvEQ%%—¹®…{”]NÓ´ÑHge•s] ÷l=uušK—ŒFš¦—/7ܸaþ9G[cë(*º8dþ”ÅçÛþ/ÇqÍÖ‘™Y®×?þ¬—^oÌÉ‘q[çl:×®©êê4̉MÓJåë×UœÅ1›DAÁ…'¯ Ê+(¸ÀU=ƒí‚¦éìì=2˜vvvrså¶põ¥'¶ˆ êoßnëÚßÔÔzá¯g°Ý@üñ‡ùëfã¯6½Þ˜Ÿ/7{½À:; ùùrƒÁ8ðU 6ˆ²²êÖÖC†Ø Ê:”?t(oèPnb§Õv”•Õp]#7žÉì~C†ð¾þZÊÜÌϯ@½ÿþ4¦‡Ï·Ñ§J/oÛˆ+RB¿ü²„ëB¸g£ÏÐ @ @€@ € @ @€@ € @ @€@ € @ @€@ € °ü•Bááá,Î6`ZZB"Ñ® 霜gc9E½ñƉ„Å9AOÊÊÊXþ–0vnÁÇ k~ܽ¯à € @ ›@´µµ­Y³ÆÓÓÓÞÞÞÓÓsÙ²eø.Š¢är9‹Ëb}ÂA¸Dq£Ñ8oÞ¼òòòÜÜ܆††?ÿüÓÁÁ! @§Ó |1À ߆¿ÿþêêj¥R9lØ0„»»û®]»6mÚÄç?Ç_ÍOQ”Z­vss³²Ðâ`‘‘‘±jÕ*œ†P(äñþûû6z½>!!ÁÓÓÓÍÍ-22²¹ùñï«R•™™)‘H†¾víÚƒŠÅbggçØØXf@zzºi£«‹/‹D"GGG??¿ììl„лᄏcÇ< ¬¬ÌÍÍíÁƒ=Õ ÑhLÛE!„ÜÝÝ™~æ^¦Ÿ¦é­[·Ž;V$…‡‡[¿FÝë\ÈŠ+•...EEEfÉd[¶lñöö.++S(³fÍZ°`s¯T*Õh4¹¹¹¡¹sç2íêêjš¦ÓÒÒjjjLxBÓELœ8qåÊ•µµµ·nÝJII±··×étû÷ï÷÷÷Ç>ûì³+VX¨A­V›µÍ:™%2ý;wî?~|ii©R©”J¥aaaV®‘ÏâJ%àóùçÏŸ7ýL«ÕÒO¶¦Ojj*PYY‰º{÷.¾÷Ô©S4M ³¶Ù£n:¿Ù]­­­z½· ~ÌZ[[ ƒX,>s挅ú__ߌŒ ÜÙØØÈãñÚÛÛû·FŒäÒµX,®ªªbnjµZæƒqóæMoooÜÆ††|S  „ìììÌÚÖkmmMHH ‹ÅË—/Ç#FŒÎËË;{ö,ŸÏŸ1c†…ú¡¶¶6**Š¢(Š¢<<< ‹kÄ"šœœŒŸ!¡PXQQa6F"‘ÔÔ<þÕ+Ü‹ÅlXSS³}ûöººº£G2ý¹¹¹YYY‹-¢(ÊB ø™Ý§|ˆÅâ‚‚ü,4Z­v„ l­‹8Dbb¢J¥’J¥r¹\¥Råçç'%%™Y²dɆ d2YUUULLŒT* …ÖLžžž^[[kÚ@Ý¿¿õ ƒÁðèÑ£éÓ§ûøø\»v-::!ÔÒÒ‚š?¾\.ÏÌÌŒŒŒ´PƒP(,,,lkkÛ´i“颵Zm·%áþèèè„„¹\®T*—/_Ô—m6€Ø}BÖ½ý}ãÆÈÈH'''©TŠŸ¦Çqqq"‘hÑ¢E=½ÅçÛåäȸ®…{¶ˆ{÷;V©×õzñcÿ×ÞnëŸü¶õ@=Z©×q[¯79r…Ûz8gëÈË“ÛÙ=>¤(*/ïyý¶Øt 4šûÿ]e0<ÞC Æsçþmiiç¶*nÙt JJ.#d~žyèÐ%NŠ$l:¹¹2³+ÖF#›kÓ綈†mEE½Ùe>š¦åòz•ª•«ª8g»(.¾Èãu³ú<ž]aáůg°Ý@ääȘÿ 1e0mù •¢¶V}ýºªÛw…hš¾v­©®NÓÍ}6ÀF?SYQQïëëa4>>á¼}» !4r¤3¾iggWQQçåõÜü?‹X~ûû9µbE*Bè—_–p]÷lô%ô@€@ € @ @€@ € @ @€@ € @ @€@ € @ ÄwLeggsU·::ÔȆWßôWNˆï˜zN <%Ó ˜ ÝúõëgΜ9 åîœ>}:))É´Ž!@€@ €ÐŸ@tttìÞ½;""böìÙÛ¶mÓhw|PPB¡`±>Ö' Kø•²^Ÿ¿ Ÿ¦é¸¸8Š¢’’’FÕÜÜ\\\¼jÕªôôô!C†<‹Á@êóâÈ‘#MMMÛ¶m›øàƒÐÐÐo¿ýÖú5ê•åº]Y½^ŸœœüÞ{ï………:thΜ9 …¢§ ûªÏP*•ÞÞÞ–Çdee¼dÉ’É“'#„V¯^½téÒŽŽ'''„PDD„³³óŒ3B‹-bÚmmm£Fš={6žitµ{÷nGGG¼Czùå—=zÔÞÞþÖ[oíØ±C£Ñ¸ººž>}ú›o¾Ù¾}{O5ôCaaáÒ¥K}}}B±±±:ÎÞÞ¾×5²fr 3t»²GŽY¼x±Bè³Ï>[¶l™å û¤Ïpuu½yóæ”)SðÍââbNf:æÎ;b±·qC­V3!äè舞¼­jÚ¶Þýû÷8PYYÙØØ(‘Hpç°aæM›vöìÙqãÆñx¼—^zÉB ýpëÖ­7nܸ‘éQ«ÕxéO¿FfèveMWé´PaŸô9o¾ùfaaáœ9splÁåË—ÍÆ¸»»755á}>ÞsºººöuA=Y½zµ¯¯ïÊ•+}||hšž3gîŸ9sæ¡C‡êëëgÍšEQ”…ð»½jµÚú…ººº~úé§o¾ù&þóöövfwøLu»²®®®*• ¯ZSS»öù"::º¹¹yíÚµ …¢¹¹ùܹs©©©fcBBBÒÒÒ®_¿ÞÐÐðÓO?ùûû[YÜñãÇñƒÇ4B<¸ÿ„Ñh4 “'O–H$õõõ›7oFÝ»w!ôÖ[o)Š“'O[¨A œ?¾££#==ÝtÑx’®pHHȾ}û Eccã÷ßÿÅ_ôe›õ_·+œ––öï¿ÿÖ××ãcOŠ¢Øª°Ï{¡PøóÏ?ïÝ»÷«¯¾êìì|õÕW¿ýöÛÈÈHÓ1|ðÁƒu:Ý믿¾zõj+'ß¼yóºuëFÅ4B¦ë¶gÏž/¿ürçÎ)))&LX¼xq{{û×_ššêää4mÚ´¦¦&|ÌÛS 111{öìÙ»woLLLQQî|ùå——-[–››;|øpÓz˜þÈÈHN—˜˜xÿþ}??¿ï¾û®¯Û­º]Ù”””¶¶¶ØØX@°råJ™LÆçóÙªÐüSÏõd&OžÅu!§®®îã?.((pvvîÇŸãÈXúÄÔsJ§ÓÕÔÔÈåò˜˜®kyìŸþ‰‹‹ëÚÿá‡âó‚~ûè£üýý/^üðáÃß~ûí•W^é_ºõ‚¢¼¼|ëÖ­ÑÑÑ#GŽäº–ǦOŸŽ¯d°nýúõ;wî £iÚÏÏoÍš5,Nþ‚"00000ë*ÈØ±cû}Ý©Wðö7 @ @0¿áëëëîîÎaA` ©Õê«W¯öxÂì=*ðÂswwÇo2ˆ=p @€@ €ðÿß/äÍÈÙIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1TableInfo__coll__graph.png0000644000175000017500000003470312234777145030714 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¨Sã…MbKGDÿÿÿ ½§“ IDATxœíÝ}\Teþ?þëp# €Ã(Ã0Ü+*î-#ÀÅÅP›Ô6@EûÙ’®åÖ¢…[¦(‰eÞVˆ~T äVSWcµÐ%ÅvÐÅ›4pp€t`à|ÿ8u›༞þ¸Î9×\ó>7óæÜ^‡¢išp‰ž®Ð6$>à$>à$>à$>à]ÃEQº~…û4z‰úÇ{ï½çéé©ë(8-77÷‹/¾ÐuCôOOÏÀÀ@]GÁuH|=„s|À9H|À9H|À9H|À9H|À9H| =kÖ¬±±±122²±±Y¾|yEE3‰¢¨¼¼¼ývŠ¢jjj†P³ ô"âÜÎZÒÞÞ>wî\Š¢ÒÓÓîÝ»çååUXXhdd¤ëè¹\Î,,,²³³ÝÜÜ!fff: jø@â-9xð`QQ‘T*5j!ÄÒÒrÏž=ÑÑÑÃy#¤(J&“;öi?Èãñز©©©ê ôuAK’’’V­ZÅd=ÇÓ××g•JeTT”ÍØ±cƒ‚‚jkk™ñE9rD(š™™EFF&'' ssó°°0¶Bbb¢jA"‘xzzŽ9ÒÎÎ.>>ž©–žžþì³ÏŽ3fÇŽ„üü|___>ŸobbâêêšššÊ¶vþüy‘H´ÿþ˜˜{{{>ŸÀÄ£P(Þ{ï½qãÆYZZîܹ“ ž¢¨ÌÌL{{{X[[Ë<ÉgiiÉ ³Í8p@máÈd²~ZÌÐ34@ŸBRRR4×±°°8~ü¸†$É–-[/]ºTPP0sæÌ °SÅbqMMMzz:!dΜ9l¹¨¨ˆ¦é„„„ââbÕ‚ƒƒCxxxeeeFF†žž^UU!äµ×^«««KII100xüøñ„ V¬XQRRRUUodd¤P(˜¯óòòÊÉÉÙºu«““Snn®T*‹Åþþþ4MGEE‰D¢œœœ‚‚‚éÓ§Bd2ó)—K—.ݼysÚ´ióçÏgF2SU›mnnfg<''gáÂ…...š—LOÖBJJ ~Ñ=„Åý '‰ÏÀÀàÂ… ªaÈårú·Ÿ·³³ó¡C‡˜ 7nÜ „4440S³³³išnkkS+w•ø|þöíÛ™²\.W*•„+W®°”ÉdõõõJ¥’©SPP šÂÒÒÒhšž4iRRRS¡¢¢B__¿©©ÉÞÞ~ÿþýÌÈ«W¯ª~êàÁƒÌøüü|&xµÄÇ4KÓtssó¾}ûÜÜÜf̘‘’’ÒÒÒ¢aÙ"ñõ;ê‚–‚ÂÂBvP.—³—tYeeeŽŽŽL™)”——3ƒ¦¦¦„===µrWöîÝckk»lÙ²›7o2ÔB¡PõƒõõõQQQÞÞÞ 44Tõã"‘ˆRRRÌ\Qµ¶¶nkk+//¯¬¬?~ËÛÛ»¸¸866öÎ;YYYª“˜ä(Ž;Æì#´··ËåòñãÇ …B6ƒK¥RÕO1…Û·ow<Ó¬P(twwÏÊÊ:uê{õ´ ‰´dýúõ•••b±8//¯²²233sÆ ju–.]ºqãF‰DRXXøî»ïŠÅâ^ÍLLL,))Q-¸¹¹EDDˆD¢©S§Ò4mllÜñS­­­îîîÎÎηnÝ !„ÔÕÕ©V ‰ŠŠÊËË“J¥¡¡¡>>>„%K–|òÉ'.\¸}û6{u…±iÓ&‰DrëÖ­U«V±ÁwLm“'O>yòäéÓ§+**¦L™²|ùò+W®ôd6¡ßèô@† Òƒs|4Mß½{7((ÈÂÂbäÈ‘b±˜Ù§S=Ç×ÒÒnmmÍçó-Z¤zvŒ=ÏÕi™’ Z8{ö¬«««±±±££crr2Ýá:ƒL&;~ü¸‘‘‘——שS§üüü˜‹ l³---B¡ÐÔÔÔÏϹ¢P(Þÿ}æªîáljÊ9¾-[¶899™››¿þúë÷ïß§iÚÛÛÛØØ¸¶¶–îâl]SSS\\ÜôéÓ5,[œãëwþZ¡Ï(ŠJIIáx|EI$’©S§ê*€ÔÔÔ… âÝ8ÔÎÎ7Íhvµ†ìñç ñç ñç ñ×uÚ¡Þõ²ƒ@'ÐùÝ0†«ºX¼x±®C€„=>àŠ®:û#„dffÚÙÙñx<ÿû÷ºL?.:pŶmÛŽ9’žž~ñâÅêêê·Þz‹wüøñü±¢¢bÙ²e?{éÒ%''§èèh&-§ãGæ`X ={VW·ºíì¦i¦³¦«öÁ^Fiiidd¤P(\²dÉO?ý¤ÝØ{Ïêööø€+4töçääÄ\\\!•••?.‰6oÞ,•JgÍšõöÛo»»»k#hH|À:ûc»Õ+(( (ÊÆÆ¦«F .^¼ØØØèëë;ÀñÂÂU]à ¦³?—Ñ£G«uö±oß>Š¢V®\ÐñF…B‘––öå—_¶´´¼óÎ;_|ñ^‰9¤!ñW„‡‡?|øðµ×^{ôèÑË/¿¼k×.vÒêÕ«çÌ™ÓÜÜýÙgŸyxxh1d(èúÁðë¯×ïÃÕ!ôÇ×s8ÇÃÍwß}Gu&**ª‡-ܹs‡2bĈŒt ‡º0ÜÌž=»/{=ÅÅÅ®®®o¾ù¦¹¹y?Fƒ Àš››u ,êç ñç ñç ñBi{LÚë:Ð\Ü€þ‘››«ëúĆÎ%„*£†ðýÉC}hn`†~@Q”®Cè«Ì÷MÈë_è:Ž>Ã/º'°Çý`ÈÿØZêHÆ8B(ZqŸŒàé:p8Ç@HùqBÚ i#åßê:Ð$>BJBB‘’Cº´‰8ïÑ=rÿ<¡ÛÝFîŸ'«t 8$>༻é„èÿ6 Gî¦é2Ð $>༒Änûm Öe0 H|Àm¤¤î2!¿]•¦iRw™<,ÑiL0àø€Ûî¦=Ã'ÆèÒ#:Š´‰¸­èÿH{ëcÚ[qmwØCâ«¿NJ;ßX@êoh=Ð$>à°Òd¢×Yÿòz#Hi²Ö£íAâ΢Iñ!ÒÞÒÉ”öRrø÷+0ì ñWÕJÈ£{„Ò#”~‡?=Ò\Njót" tR\¥§ÐßkÿK!cÜU*Ü×vH -è– €BÈ„òRª®ãmÀ¡.ppppppng „ò°˜BLthpu€sø€sø€sø€søz©±±qÍš5666FFF666Ë—/¯¨¨`&Q•—ן½ZQéǯèckEÕÔÔ÷îÝÌH‰Dâéé9räH;;»øøx¶µüüüŽPE±´´¬©©é´#33ÓÎÎŽÇãùûûß¿ÿ{®4MÇÄÄØÛÛóùü€€v!¨ÎÛ~W•»]bŒúúz¥R©aqýŽš¦s蜀NFçä,\¸ÐÅÅEm¼……ÅñãÇ»jŒI.[¶lqtt¼téRAAÁÌ™3,XÀN‹Å555ééé„9sæ°å¢¢"š¦Š‹‹U j-«zyyåääˆD¢+V”””TUUÅÇÇ) ¦‚ŸŸ_uuuFF†ÁãÇišvpp¯¬¬ÌÈÈÐÓÓ«ªªbš0aBWÈd2š¦5Txþùç¯^½zýúu9sæ°¡îÚµËÉÉ)77W*•ŠÅbÿŽ3¶¯¡²æ%Æ8}ú´­­í¦M›ª««5¯m$>š¦Õ_ssó¾}ûÜÜÜf̘‘’’ÒÒÒ¢VÝÀÀàÂ… ì »'!—Ëéß~ÕÎηb*ܸqƒÒÐÐÀLÍÎΦiº­­M­¬šÔ:Õ1ñ¥¥¥Ñ4Íìì0# ØTB9zô(Û>3’Ïçoß¾©,—Ë™½$‰D¢¡¦ ¡34M_¹r…RWWÇ´9iÒ¤¤¤$fREE…¾¾~SSÝEâÓP¹‡K¬´´422R(.Y²ä§Ÿ~êj1âP@]VV–­­íµk×’““³³³ Õê‚ÂÂBvP.—³—tYeeeŽŽŽL™)”——3ƒ¦¦¦„===µr/ˆD"BH}}}TT”···@  U­`mm­ÖþÞ½{cbblmm—-[vóæMöð\C#ÝVprrb ...„ÊÊJf°¤¤$88˜¹ mmmÝÖÖÆ.„Ž4Tîá‰D›7o–J¥³fÍzûí·ÝÝÝ;Ö!8ÇБP(twwÏÊÊ:uê{9UͼyóöîÝËìtBx<ÞåË—;¶S\üëyC¦ ú=Zæ÷ïíí]\\{çά¬,Õ ÌI4U³gÏ.--MKK³²²š1c›²54Òm©ô×W³Peccà ‚cÇŽ1ûYííír¹|üøñ]ÍËSUÖ   àâÅ‹¾¾¾V@âP7yòä“'Ož>}º¢¢bÊ”)Ë—/gßT­_¿¾²²R,çååUVVfffnذA­ÎÒ¥K7nÜ(‘H ß}÷]±XÜ뱉‰‰%%%ª…nµ¶¶º»»;;;ߺu+$$„üv°Ù)77·ˆˆ‘H4uêTš¦»m„ù ¡BDDÄõë×oܸ±råÊ€€öV›¨¨¨¼¼<©TêããÓiHLû=¬Ü…B‘˜˜8mÚ´åË—{xxܼysóæÍWÕ|B€+º¸¸ÑÔÔ7}úôŽ“îÞ½daa1räH±XÌìÓ©žãkii ·¶¶æóù‹-bNcÑNou,BT ,Òá3xüøq;;;###//¯S§Nùùù1dHg§ÒΞ=ëêêjllìè蘜œÌVëªoooccãÚÚZ ß’””dmmmaa¬¶"""„B¡©©©ŸŸ{-B50¶ýžTîªLÓtfffPPPnn®†õÌ@·T„ôÇÇ-H|À98ÇœƒÄœƒÄœƒÄœƒÄœƒÄœƒÄ@!$?â×.ù€Ð)!„h茆ìñç ñç ñç ñç ñç ñç [*Búãã$>àêç ñç ñç ñç ñç ñç ñBз ?>Búããìñç ñçà‘5èF@@€®CЗ[„ô_&ê:mHKKÓu:†ÄÝ (ÊÃÃC(ê:èååå—.]¯‰ºAQTJJJ`` ®~ššºpáBüêqŽ8‰8‰8‰8‰8‰úGccãš5klllŒŒŒlll–/_^QQÁL¢(*//o@¿¢¨ššš¡Ò,Ñõâ$>èííísçÎýé§ŸÒÓÓËËËOž;f̘;vBòóó}}}ù|¾‰‰‰««kjj*ÛÚùóçE"Ñþýûcbbìííù|~@@B¡xï½÷Ægii¹sçN6xŠ¢233íííy<^```mm-EQ„KKKæX˜möÀj G&“isqAÐBRRR4×±°°8~ü¸†$É–-[/]ºTPP0sæÌ °SÅbqMMMzz:!dΜ9l¹¨¨ˆ¦é„„„ââbÕ‚ƒƒCxxxeeeFF†žž^UU!äµ×^«««KII100xüøñ„ V¬XQRRRUUodd¤P(˜¯óòòÊÉÉÙºu«““Snn®T*‹Åþþþ4MGEE‰D¢œœœ‚‚‚éÓ§Bd2ó)—K—.ݼysÚ´ióçÏgF2SU›mnnfg<''gáÂ…...Ú\\𥤤àWOÓ4t£'‰ÏÀÀàÂ… ªaÈårú·_²³³ó¡C‡˜ 7nÜ „4440S³³³išnkkS+K$’N¿ŽÏçoß¾)Ëår¥RI¹rå ûA™LV__¯T*™:ª),--¦éI“&%%%1***ôõõ›ššìíí÷ïßÏŒ¼zõªê§<ÈŒÏÏÏg‚WK|L³4M777ïÛ·ÏÍÍmÆŒ)))---º]\ªø8Ô…~  ÙA¹\Î^£d•••9::2e¦P^^Î šššBôôôÔÊ]Ù»woLLŒ­­í²eËnÞ¼É!2Ý(°¬¯¯ŠŠòöö¡¡¡ª‰D„’’’àà`Š¢(в¶¶nkk+//¯¬¬?~~üx¡PȦ$©Tªú©¢¢"¦pûöíNƒgš …îîîYYY§N’Ë寝åÅ!ñA?X¿~}ee¥X,ÎËË«¬¬ÌÌÌܰaƒZ¥K—nܸQ"‘¾ûî»b±˜Çãõ¤ñÄÄÄ’’Õ‚››[DD„H$š:u*MÓÆÆÆ?ÕÚÚêîîîìì|ëÖ­BH]]j…¨¨¨¼¼<©TêããCY²dÉ'Ÿ|ráÂ…Û·o«].Ø´i“D"¹uëÖªU«Øà;¦¶É“'Ÿš¦ïÞ½daa1räH±XÌ줨ž´jii ·¶¶æóù‹-R=;Æžœê´LIHHP-œ={ÖÕÕÕØØØÑÑ199™îpA&“?~ÜÎÎÎÈÈÈËËëÔ©S~~~ÌE¶Ù–––ˆˆ¡PhjjêççÇ\P(ï¿ÿ>sU÷ðáÃDåß–-[œœœÌÍÍ_ýõû÷ïÓ4ííímll\[[«9«©©)..núôéÚ\\šáýñA7Ð!„¢(‰D2uêT]ÒWèC]àÜ)Ð=ì" 3ØãÎAâÎAâÎAâ :ÓÐõ±µN»áÓÜ&:ÑZpqt€½ï×ÂÂ";;ÛÍÍbff¦Ó €Cø@TB055Õò3 ½îGo´}‡C]p;ÔÓP“éÕnõêÕ]õ¦wâÄ ¡PÈçówïÞÍŒì´{>ÒE—|ªýèuÕg!$33ÓÎÎŽÇãùûûß¿ŸOÓtÇ^üÔfm¿«Ê=ìSé`æ©5ô”NŸ!€ôì‘5 :v¨§Ú¸êƒVä·^íD"QW½éùùùUWWgdd0ýîÑ]tÏ'‘H4tÉÇ<¦¡ÂóÏ?õêÕëׯ{xxÌ™3‡ u×®]{ñ£;<=Æ´¯¡rOúÔ;}ú´­­í¦M›ª««û²üUá‘5t£ï‰Osãj‰éÕNCozG¥UúÝ£»èžO"‘hh„)h¨ÀôsGÓ4ÓÅÓÁD"é´?º‹Ä§¡rûÔ+--ŒŒ …K–,ùé§Ÿú¾À‘ø8Ô…Á…éÕNCozÖÖÖäÉè:ížOs#ÝVprrb ...„ÊÊJf°Ó^üºš •{اžH$Ú¼y³T*5kÖÛo¿íîî®aÑAÏ!ñÁàÂüþ5ô¦§Öïé¢{>Ít[팯  €¢(f°Ó^üºš—§ª¬AAAÁÅ‹}}}{ñqè‰\ÇõºÕmozªºêžOC#Ìý4*DDD\¿~ýÆ+W® `oµé´¿Ž˜ö{X¹+ …"11qÚ´iË—/÷ðð¸yóææÍ›Ÿªè’βaˆ }>ÇG:t¨§:Ií3Ømoz´Ê©´N»ç“H$]5Âö£§á[’’’¬­­-,,‚ƒƒÕºÉëØ‹ŸZ`lû=©ÜU™¦éÌÌÌ   ÜÜܾ,|58ÇÇ@|Ð ôÇ7œ ?>u€sø€sø€sø€sø€sø€sø!„ЄpýAâ „Ê++ÿ÷P×Q€–àfèFÇgc‡¥ ›šÐÉeŸê:mÀ¯=0C7˜‡œ†¹vªq§=¡Èü­ÏQ8 âìñ² ßý]J™½ÓÉÆË\×áÀ€Ã7rûdž>ÑÓ§nŸì²Nø€ëZ›Û·+I»’¾“-omn×uD0àø€ëîþ§¡Mùë Ÿ6%}7§A·ñ€ ñמª¥È¯W®)BIO©¿8 †$>à´Ç ÊŠKèö_÷øèvº,÷Áã¼Ôq˜CâN»ó}=õä¡ïüP¯«x@;ø€Ó OÖµ?yCM\Ûöø€»šª[ï_{H?y—n'ÕW6U·ê((Ð$>஢3u”~'OäQúTñ¹mAâîº}¢®½­“'—ÚÛèÛÿµÝá ‰8ª±LQ'}Ôù›4©½ý¨±\¡í˜@[ÐIpTõµ&¾³ ›øZ( !#Ì~ýEP¹­É\h¤«ð`@¡“Bù>¼„òçOíuhu€sø€sø€sø€sø€sø€sp!„8Íáë:ÐÜÇœƒC]à$>à$>à$>à$>€þ§T*)Šª©©QOQT^^Þ@´Ü }fèBâèúúú fffC¨eNAâ „éé:éé¾¾cˆÝ£(jñâÅFFFª#û…jËÐkH|„Rz®¡ô\;HQÔ‘#G„B¡™™Ydddrr²@ 077 몊¢!–––lî«©©QÉ i:&&ÆÞÞžÏçÔÖjêæ^"‘xzzŽ9ÒÎÎ.>>ž<™^Oœ8! ù|þîÝ» !­­­aaaÏ<󌵵u||¼±±1s0«š|Õq~~¾¯¯/ŸÏ711quuMMMe«?^$8pà)—åP@MŸ]W|v]1;H‹Å555ééé„9sæ°å¢¢¢®!„Èd2µ²ÚH‰D²k×.''§ÜÜ\©T*‹ýýý5æàà^YY™‘‘¡§§WUU¥Ú²ŸŸ_uuuFF†ÁãÇ£££/_¾üóÏ?{{{ëëëK$ I$’ &¬X±¢¤¤¤ªª*>>ÞÈÈH¡P0S½¼¼rrrš››û°\)$>šî,ñeggÓ4ÝÖÖ¦VfRI§z˜ø&Mš”””ÄŒ©¨¨Ð××ojjêªM>Ÿ¿}ûv¦,—Ë•J¥jËGe“ÉdÎηf*_»vVC⫯¯W*•̤‚‚Õ©iii=^~C u:gjjJÑÓÓS+÷]IIIpp0EQEY[[·µµ•——wUyïÞ½111¶¶¶Ë–-»y󦾾¾êTkkkÕÀÊÊʘ²³³sO‚©¯¯ŠŠòöö¡¡¡ª“D"ÑSÍׂĠmàØ±cÌ®G{{»\.?~|W•gÏž]ZZš––fee5cÆŒŠŠ Õ©Ô“¯¶²²*))aÊEEEª“hš&„t̰ÞÞÞÅÅű±±wîÜÉÊÊRÔ_‰~¶3 ry'o"W•——'•JCCC}||44èææ!‰¦NJÓ´±±±†ÊÁÁÁ›6mºråÊ­[·˜ë0Lfäñxß~ûmccctt´ÚGZ[[ÝÝÝoݺB©«ëëÕíÁ‰ ßx{{ÿáPKGFFFŠÅâ×^{íücYYYFF††6ãããÏž=koož0fÌ •£¢¢fΜéëëûÊ+¯üõ¯%„BvîÜåààðÒK/©}ä믿޽{·@ øÛßþ¶lÙ2??¿ùóç?íŒ9è– €B˜{YlgŒÖu ýæçŸž2eŠL&Óœ+¹ {|„b;ctäF÷lIDAT³Þwß}Gu&**ª×ßÞ_mNž€áãÆÿûßÿûßÿÒ4=mÚ´/¿ü’½È ªø€sp¨ œƒÄœƒÄœƒÄœƒÄ@H?õÇC!úãƒá ‰8‰8‰8‰8‰8‰8Ç@× Nsøº´½³çàP8‰8‰8‰8‰8‰8‰€ôÇÇ1H|„ ?>ŽAâÎAâÎy⑵òòò‹/ê0èw666žžž}i#[Å£Sã!&s«uÈ€óòò …ºŽB×h)))ºú™¿¿?Ý7Ø*†™”””>nÃ@'½³Ðè¶`¸详°U Eé:„Açø€sø€sø€sø€sø€sø€sz™ø׬Yccccdddcc³|ùòŠŠ fEQyyyý!¡:Ó_ÑÇÖ(Šª©©yª6û} ZÞ*Ô|Ú¯èt»ºtéR/Vè£G>üðCGGGccãqãÆ‰ÅâK—.B”Je§­õÂpÝft¥7oYkooŸ;w.EQééé÷îÝ‹‹‹óòò*,,422ê÷år9S°°°ÈÎÎvss#„˜™™õûA_hy«è»N·+SSÓ„„„§ÝºV¯^››{àÀ‰'644¤¦¦Îœ9³ªªÊÌ̬­ô&ñ>žm-??¿c#Ìmî–––555V`dffÚÙÙñx<ÿû÷ï³ãišŽ‰‰±··çóùìBP¶ý®*w»Ä ío>¬WÁŒìj5uµÞ;bNUW ;©«u4bĈÒÒÒNgœ=Ôí¸5¶¶¶†……=óÌ3ÖÖÖñññÆÆÆÌÁ¬êѱڑrWsÇþ8 aÖàwªÏ¯1Oevû˜›……ÅñãÇ»šJ‘H$[¶lqtt¼téRAAÁÌ™3,XÀN‹Å555ééé„9sæ°å¢¢"š¦Š‹‹U j-«zyyåääˆD¢+V”””TUUÅÇÇ) ¦‚ŸŸ_uuuFF†ÁãÇišvpp¯¬¬ÌÈÈÐÓÓ«ªªbš0aBWÈd2š¦5Txþùç¯^½zýúu9sæ°¡îÚµËÉÉ)77W*•ŠÅbö±YÕaÛ×PYóÓÀßß¿¿žÕí¶š–·ŠN7f ë±ãzW‹MuY#lîn…ÆÆÆêëëûûû:t¨¢¢BmÆÙÖÔ¶ÆèèhggçË—/ÿüóÏÞÞÞúúúLjßË~\óVÊüš››5¯&‚guiš¦éÞ$>ƒ .üÞÄoär9ýÛrvv>tèSáÆ„††fjvv6MÓmmmjeÕ¯óX;l iii4M×××+•JfdAAê¶rôèQ¶}f$ŸÏß¾};SY.—+•J¦Y 0 ˜¹ iúÊ•+„ºº:¦ÍI“&%%%1“***ôõõ›ššè.Ÿ†Ê½^bÚL|ZÞ*:NÒ¼;®÷®šÒøºZG4M_¸páý÷ߟ2e EQÏ=÷Ü¿ÿý©mÎηfª]»v CCâÓ°2¿…n!ñ1zs¨+ U·lö⫬¬ÌÑÑ‘)3…òòrfÐÔÔ”¢§§§Vî‘HD©¯¯ŠŠòöö¡¡¡ª¬­­ÕÚß»woLLŒ­­í²eËn޼Ɉih¤Û NNNLÁÅÅ…RYYÉ –””3— ­­­ÛÚÚØ…Б†Êý¸ÄÎ Ù*ºZM]­÷§ÒÕ:jhhxñÅ?ÿüók×®UTTxxxÌŸ?¿ã™ µ­±¬¬ÌÁÁ);;;÷eîÈo¿è¡Þl[óæÍÛ»w/ó‹Âãñ._¾¬VG(3e¦ úgç˜mÈÛÛ»¸¸866öÎ;YYYª:öE1{öìÒÒÒ´´4++«3f°?N t[A*•2…‚‚Š¢lll˜A@pìØ1æ?L{{»\.?~|WóòT•¡A²UtµšºZïO¥«u4qâÄýë_L++«-[¶Z»[EÇÙ×¼;®wµª2±«†în…>zôèƒ>°³³344 …‹/®®®Vk­ãÖøøñã•+WZXXØÛÛ3Wr®^½JÓôáÇÇ7fÌæúµêÇ{²©kFpަiš~¢ëùÔÔÔ… ªŽ!éˆ4--­/`«Ð‚ŸþyÊ”)2™l̘1úEE¥¤¤è· ~8/ “'O^·n݃ªªªÖ¯_?sæÌÎzÀBâД””Ë—/ ''§¦¦¦¸¸8]GÄ!ƒôq"€aÏÕÕõûï¿×u…=>à$>à$>à$¾'TW7ê:p\ÜèÇ·P9ÕÕ#åzzÃá¶µK—.yxxôKSƒ|«xôÈ ±qDSÓ¡ðÁˆmº»'Ÿ¿¿¿®B ÌÍR)¿¹ÙÐÅ¥ÆÈhÈÿ~<<<<==ûØÈàÜ*hšzøÐðÁ£ÆÆ FJ¥!ÄÉ©YO3öYr.£pG¾š)SÖ×Ö>433þúë¥3f¸è:øÝÇŠË—ïH$%.ÜÎÏ¿«P(õõõÚÛÛ™M88Ø36–ë$@!ñ©[µ*áøñüövšòæ›úè£y††½éÂúަéÂÂj‰¤ä¿ÿ-¾xQzï^=ECCƒ–¥j5}77QFÆ*¬)è!$>u‰‰¹‘‘émmí„}}½çž³‹[6nœ¹®ãâ¢övzþü—/ß122P(”ÖÑÓÓ377:{v@ Õ—±À†«ºê<=™¬GikkÏÏ¿ëãóé?jþ ==jÛ¶…úúz]e=BEÑûöýÿÈzðTøÔ9:>Ã盲ƒ­­mÞxã«Ï>ûŽ9þmš0áÙ°0?==õeE>þxÁ´iNZŽ †:$¾Nxy9êëÿ¾dÚÛé¶6úóÏÿ½ti|CC³ã¦wÞñur§ºFzþþ/,_î­“¨`HCâë„§§S‡.ë MÓçÏÌšµíæÍ{ºŠ»JKkœœžQ;m` ïì<îÓOõÝ…0h!ñuâÅ”ÊöŽã•ʶÊʆW_ýâäɫڊƒZ[Û¾øâß¾¾±¥¥µþþ/°;}zz”‰Éˆƒß266Ôm„0D¡[ªN¸¸XeÜÔôXmwÙ²— pÚ´[ÛÓÙº5°ªªa×®³ºd{øP±n]ê¼y;ž}vô÷߯}ë-od=Ð2ìñ=µýûÿ³a÷§Ný·1÷ÂéÓ×?ø C©lÛ¼ùuµ»U´‰ï©µ·ÓùËîæfÅ¿þõ>z¾ì¹ªª†ðð´3g~^¼ØóÃÅ£GÔuDÀ]8ÄxjzzÔgŸ-¼}»zß¾óºŽeh i:11wÆŒOù¥2)éí­[‘õ@·°Ç×K;wžýâ‹ÿýZ{{K]Ç2¨Ý_»6U")Y±ÂçÿxÙÄd„®#@âë-¥²],þbÔ¨é髨ŽX!­­m;wžÙ³ç‡ žÝ¶máäÉ8% ƒ_ïݼyoΜÏ7nüKHˆ—®ctòó¥”–ÖDD¼‚»U`°ÁæØ{“& V¬ð‰Ž>qï^½®cDššë×7oÇØ±¦ß¿w«À „=¾>iiQ¾üòg66 ¡ºŽeP8¾ <<íáÃÇ}4ßß*NÀà„Å}2b„ÁgŸ-:w® 3ó²®cѱºº¦·ß>ôÆ_¹»Ûgg‡¼€¬ƒöøúATTæÑ£WÎ çlo}ii’ÆÄøÿùÏ“t@7øúÁ£G-3gnus}ùeˆ®cѶòryDDÚùó¸[†êö“±± Ïÿî»ëºŽE{ÚÚÚ÷ìù~úô˜Š ù±cï~ø¡Y† ìñõ›÷ßO>wî—sç¹ðXÂõëåaaGnß®^³fvhè <ºC öøú͆ ¯QµiÓI]2° etôÉW^ÙÎãÌÎ_µêÏÈz0ä`¯?9óó²eû““ß®ïûñÇÛëÖ¥Ö×7oذw«ÀÐ…Ä×ÏÞ~ûP~þÝá÷jŽúúæþóhFÆe±øÿÛ¸ñ/Ï<ÃÑë×0< ñõ³ºº¦éÓcüý§~ôÑ|]ÇÒoNœÈ_¿>ÓÀ@ËÿY³&ë:€¾Â9¾~Æçúè£ùûöÏË+Ñu,ýàÞ½ú¥KãW®<üê«üá‡pd=°Ç7 –-Û_\|H¿šƒ}åã³Ïòbcñ~%NøDUUÃŒŸþõ¯Þaa³uKoܾ]½fMÊÕ«ek×ân†p¨; ž}vtdä+;vœ¹q£B×±<–etôI_ßXCCýììu¸[†%ìñ š¦.üêáÃÇ'Nü]_hüƒa^ùXQ!_¿~^p°îVájhü ‡"Š¢>ýÔÿ—_*ãâ†À«9˜W>Ο¿ÃÁÁò?ÿ‰\¼ØY†1ìñ ¬½{ضí»Aþjæ•E>ý4×m øV[[û«¯î011œ¯æ¨©yøá‡ÿú×Õ7ßüÓÚµ³ÍÍMt€6àPw`éëë}öÙ¢¼¼;‰‰¹ºŽå Ì+_zió­[÷22ÞÙ¸ñ5d=àìñiömßíÛw>;;\ àé:B).–­Y“rùòÕ«}ßyÇwèÞlÐ;H|ÚÐÚÚæç÷™µ5Oç¯æ`_ù8i’ 6váĉVº@'ø´äÿ»;oÞŽ;ƒ_{í9]ÅŸwÍš”»wkÿùÏùAAzzƒîœ#€vàŸ–üñ¢·ÞòŽŠÊ¬©y¨ýog_ù8nœù÷߯[¼ØY¸ {|ÚóèQËŸÿëæ&Ú»w‰6¿÷?ÿ)OkjRDG¿þê«nÚüj€Á {|Úcb2bÛ¶…ß~û?­½šã·W>~ý§?ÏɉDÖ``OÛÖ­K=sæg-¼š#-M²iÓ 33ãØØ…žžŽú]C Ÿ¶=xðØÇçÓ™3'nÝ8@_Q^.ŒL;¾àí·}ÂÂüŒ 苆(®$¾ÜÜܲ²2]Gñ«k×êþïÿ Þ}w²ƒƒy¿7þ¿ÿÕ¦¦m¸h‘£Ý€w8Pé`àp%ñ¤§§ë:ŠßéúøñíövE¿·}úǬë(†sçÎmذA×Qô®êç ñç ñç ñç ñç ñç ñ©knnþòË/gÍš¸uëÖššf’OAAA?~—Ogºú Ÿ†††Ž#5„ÔmÀ_ýõìÙ³ÿüóN[>vìØ¾}ûÖ®]»gÏžÖÖÖììlfäèÑ£5ÌÀðƒCÝ'477=šdö‰!'Nœ`COŸ>½téÒ‰'BV¯^ýæ›o6773'æÍÍÍÿô§?B-ZÄ–­¬¬f͚ŴÀ:õå—_š˜˜0û˜øÃZ[[›šš˜¨V®\éàà@yï½÷BCCÙ‹ß~ûí›o¾9iÒ$BHXXX`` B¡022RkyÞ¼y<綾^jkkS›S 30ü ñ=a̘1eee“'OfOœ8¡P(üýýUëÜ¿_ 0e¦ “Élmm !&&&„æÅáªå§òðáÃo¾ùæÆB¡Pu’µµ5S‰D„ºº:f°ªªjÓ¦M›6mbkÊd2µÏBÆŽÛUHf `øAâ{´iÓ¾ýöÛ—_~™Ùá255½víšZKKË{÷î1ǪÌ1ì˜1cú1†Õ«WOš4iÅŠÎÎÎ4M¿üòËì¤ŠŠ KKKBHYYEQL™ àoûÛ´iÓ!4M755uzDCè™TpŽï !!!µµµ‘‘‘µµµ999‡R«ãçç—ðË/¿”——ïØ±ÃÓÓ³‡WcÏœ9Ãä¶Ð©¶¶¶‰' …ÂÒÒÒÍ›7BØCÚ¸¸¸âââ’’’íÛ·OŸ>=õóóÛ¿AAAEEÅgŸ}öþûï?íŒ÷z¦†"ìñ=ÇãíÞ½;..níÚµ---Ï=÷ÜǤZç7ÞxôèÑúõë Å /¼°zõê6¾yóæ>øÀÊÊŠ-tZíÿøÇ®]»âããÇ¿dÉ’¦¦¦?üÉ¿¯¿þzxx¸B¡xñÅÿþ÷¿³ R(ëׯøð¡««ë'Ÿ|ò´3Þ뙊8Ô³L&CG¤ýˆéˆ”#Û 38ÔÎAâÎAâÎAâÎAâÎAâÎAâÎáÐ Ì7oÞÄ}|ýH&“é:€^âJâóôôÔuÃ¥¥%Ó ÀÕ'7X8ÇœƒÄœƒÄœƒÄœƒÄœóÿQCHC™CIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Placeholder__coll__graph.png0000644000175000017500000001330212234777146033577 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÐÃ|„bKGDÿÿÿ ½§“wIDATxœíÝ{PSgÞðç$‘›AC€u ‰¢€U¤N§vB[*Jµ¤-D¶PÇwÔÖÁíjw@+ÖÛԩݯ¥²# (áV.-ÖËz­#”àë…W Ê%€€ $9ïžÍˆ Ï!úûüõäÉÃs~ç䛓sN@Ñ4 …ÃvàÅDAàQ8@ÅsìtE9vBÀ:Ç^ÇppàBŸ}öYhh¨Ã§ä]ºtéïÿ»cçt|àBCCe2™Ã§¬pxààDAàQ8@ÅNົ»?ÿüs‰Dâêê*‘H–/_ÞÔÔ„Ÿ¢(J©T:pYÔP¸ˆß9EQmmmvÍéðMD’ã/‹<•ÉdZ´hEQ………S§NmnnÎÈÈ «««suuuøât:nxyy9sæ•W^Ayzz:|AÀ,îðá÷oßV«ÕcÇŽEùúúîÛ·oÛ¶m<Þ3)F 0m>ŸoþŠ¢Z[[}||œt~‡cá#577wõêÕ8m @Àår™‡ƒ!55U"‘øøøÈåòöövÜOQT^^žX,öôô\¿~ýÑ£GE"ѸqãÖ­[Ç ÈÉÉ1o ‡¢¨sçÎMš4iÍš5‘‘‘B¡ÐÝÝ=$$$??ŸP^^.‹…BáÞ½{qguuuhh¨‡‡‡¿¿ÿ¡C‡˜Ù®\¹2xüEŸ¯¯o[[Û°ââb@ûàÁ¦Ÿ¦é;wN™2E(ÆÅÅ1Á|˜ù‡üÔ-FíP!…Ba}Œ——WYY™•ª««wìØPYY©R©æÍ›Ã<+•JÛÚÚ B .dÚ·oߦi:;;»¾¾Þ¼a1³ùð°° .Lš4iÕªU ---‡ruuÕëõx@TTÔýû÷‹ŠŠx<Þo¿ýFÓôÔ©S“““µZmQQ‡ÃiiiÁÓ¾ôÒKÃMÒÚÚJÓ´•³gϾzõêõë×_ýõ… 2¥îÙ³'00ðÒ¥KjµZ*•ÆÆÆ^f~+ƒ­o1+ …ãâàélÇ»xñ¢ù`:Ž~²5ƒ‚‚²²²ð€ÚÚZ„PWW~öÌ™34MF‹¶y˜†«Í"p4Mwvv Ü©R©˜—!ôý÷ß3óãN¡PøÍ7ßàÁ:Î`0ài­L‚VൠiúòåË¡ŽŽRE"Q]]óP§Ó1§¨Œ{÷îà6nh4üÏç#„8ŽE{&Mš„êììLMM ‰D+V¬0àççg1ÿþýûwîÜ9yòä?þøÆÌa€•Iž: 007¦OŸŽÒjµøaCCC||<>­öóó3ÌFÌÊ`n±ß…GGGïß¿¿ÉB ¦¦ÆbŒX,®¯¯Çm܉D¯o÷ðððúúú]»vݹsçøñãæßmõÎ;ï466Lœ8qîܹÌ[ÅÊ$O V«qC¥RQ%‘HðC‘HTRR‚w &“I§ÓM›6m¸u±k0‹X\ZZšV«•J¥J¥R«Õ§§§[ŒILLüòË/«««ëêê’’’¤R©g—999 様3gNPPÐÍ›7Гµ!½òÊ+)))“&Mzíµ×hšvss{ê$øºŒ•)))ׯ_¯­­ýä“Oâââ˜K6 ©©©J¥R­V¯X±"""bÈ’ðü6fŸc?¡‘ Çp4Mß½{W.—{yyyxxH¥R¼3?†ëïïONNöóó …K—.Ň)ô Ã—Ám„Pvv¶yü6‹c8ü°¬¬ÌßßßÕÕ5,,¬¢¢"**júôéƒçÇ5œ:u*$$ÄÍÍ- àèѣ̰á& wsskoo·²”ÜÜ\???//¯øøx‹’’"‹ù|~TTsŒo^3¿-ƒ‡kçYÃQ´Cïç¤(J¡PÀýpχüüü%K–86!ð]* ˆ‚À¢ p€( ˆ‚ÀÄÇ¿=|øÛU8%Çß‚véÒ%‡Ï9ÚTU= (jÎ_¶ y¶žÅKéø ¿œmÔ ßGˆîèøžíBHplB¼‡slq£Óýû]¯¾šNQèþýî?ünU·ÃÙ­¢â:‡CQUQqíZœÎnùùU4M›L´BQÅv-ÎgŸ;wÚ®^Õ˜L4M›®]Óܽkù{À:œ}ÊÊ®Œƒïò¥xUí³‰Á`*.VZ|žbýýÆâb¥Ñh"_•3‚ÀÙ¤²òvgç£1c8..<ž‹ ×Å…‹ÛcÆptº¾ÊÊz¶kt,ü¹.g4f wãF)󰸸!ôþû³™Þº6qðíI/ˆ•+³Bß~›Èv!ÎÞ—€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( Šå?¹ÇâÒG¬£Ã!$>b»‘(((`qé,Ž¢¨×_],³XËC£ÑTVV²üг8…B!“ÉX¬áÅ‘ŸŸ¿dÉv_q8†DAàQ8@D9Gົ»?ÿüs‰Dâêê*‘H–/_ÞÔÔ„Ÿ¢(J©T:pYŸp.‘EN8“É´hÑ¢ªªªÂÂBFóÃ?¸¹¹………éõz¶Kvs‚ÿ&xøðáÛ·o«Õê±cÇ"„|}}÷íÛ·mÛ6Ï ŠEQ­­­>>>6ö?7œ`—››»zõjœ6†@ àrÿóÿ™ CjjªD"ñññ‘Ëåííí¸Ÿ¢¨¼¼<±Xìéé¹~ýú£GŠD¢qãÆ­[·Ž““cÞìÊ•+‘‘‘B¡ÐÝÝ=$$$??!ôî»ïîÞ½¨¬¬ôññyôèÑp5´µµ™·)ŠBùúú2ý̳L?MÓ;wîœ2eŠP(Œ‹‹³}F;šU!…Ba}Œ——WYY™•ª««wìØPYY©R©æÍ›Ã<+•JÛÚÚ B .dÚ·oߦi:;;»¾¾Þ¼'4_ÄK/½´jÕª†††–––C‡¹ººêõúLJ††âùË_V®\i¥†ÖÖV‹¶E'³D¦Ïž=—.]R«ÕR©466ÖÆ5²B¡P°ÿг¼xÇãñ.^¼hþ#˜N§£Ÿ¼ZAAAYYYx@mm-B¨«« ?{æÌš¦F£EÛ"Uæó[<ÕÙÙi0p[¥RáLtvvº¹¹i4£Ñ(‰Î;g¥†.88877w655q¹ÜÞÞÞ‘­c4Î >RE"Q]]óP§Ó1§¨Œ{÷îà6nh4üÏç#„8ŽEÛv©©©ááá"‘hÅŠ¸süøñ‘‘‘EEEçÏŸçñxo½õ–•F ¡¡!>>ž¢(Š¢üüüŒF£׈ENPhttôþýûñ›!$jjj,ƈÅâúúÇÿu7D"‘£ ¯¯¯ßµk×;wŽ?ÎôËd²ÂÂB…B±téRŠ¢¬Ô@Ó4²3"‘¨¤¤ïL&“N§›6mš£ÖˆEN¸´´4­V+•J•J¥V«-..NOO·“˜˜øå—_VWW×ÕÕ%%%I¥R@`Ëä999 æ „POOOçF£q```Μ9AAA7oÞLHH@utt „/^¬T*óòòär¹•Aiiiww÷¶mÛÌ­Óé†, ÷'$$¤¦¦*•JµZ½bÅŠˆˆ{¶Ù(ÆêºMÇp4Mß½{W.—{yyyxxH¥R¼ÿ0?†ëïïONNöóó …K—.îðhp!”mÑ0W]]]VVæïïïêêVQQ5}út>!óçÏd»'Çpv+(PòxÇ)(¨f»ç³ÏÇ¿8Qk0˜ ã‰ÿ×Û ¿9fœ}ޝ5L¸m0úé:»õ8œ}ŠŠ”ÎãŠ¢ŠŠ^”_`vœÚÚz~þ¹Îh|¼‡3M.üÚÑÑËnUÎg‡ŠŠkY^ùñÇ«¬㤠pv(,¬¶øFËd¢ á\Õ8[i4ºššF‹Ëô4M+•Zm'[U9œ­Ê˯p¹Cl..—SZz…|=N g«‚‚jæwcÍ&¸l;œMZoÝÒù­7MÓ7o6ß¹Ó6Äs`ø›ÔÔ4û™L/ˆÜ¿ßš0a~Èápjjîøû?·cËX¾=ÉI­\™…úöÛD¶ q>ð‘ ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢ p€( ˆ‚À¢þëoüæçç³U‡séëkE°¹lfþ_qÿëoü:é?£œyÆ,ÿŠù_|1wî\¢å€ç×Ù³gÓÓÓÍ{àDAàQ8@D$p}}}ÉdóçÏ—Éd_}õU[Ûãÿ¥¡R©XŸÃ' KŒ0#•Jׯ_¯Õj»ôˆˆˆ®®.G^¢í?n/»ÿ› MÓÉÉÉE¥§§Oœ8±½½½¼¼|õêÕ999cÆŒy%>—¾ùæ›ÀÀ@„N§;xðà_|‘‘‘ÁvQ$ؽ‡ûé§Ÿš››¿úê«3f‚€€€Ï>û,33“Ëå>‹úÈî ýìÞèîîî|>ŸÏçK$’µk×þú믭­­ÏbA£Ý;yòdLLŒ›››y'ŸÏçpþ3•ÑhÌÌÌ”Éd‹/Þºukww78}út\\Ü¢E‹¾ûî»ÿûß±±±ï¾ûîþýû™'Ož4o ¦V«×­[µlÙ²³gÏ"„RRR ð€7n,^¼X¯×W“!ÜŽˆˆ@ÅÄÄXd˼Ÿ¦é#GŽ|øá‡ÑÑÑ›7o¶}lß«ƒÁú:âärù;ï¼óé§ŸÖÖÖ2ƒ C;wîý÷ߎŽ.**²ò¢`{÷î}ï½÷bbbŠ‹‹q§•µ¾zõê’%KŽ;fûjbvN­VX£P(NŸ>žž¾oß¾ŽŽŽ]»v1O:u*333%%åÈ‘#'Ožüç?ÿ™œœ\PP€b6lØbÞlË–-b±8###///..nûöíƒ!""âܹsxÀéÓ§ß~ûí¢¢¢áj°pæÌ„PIIÉøñã‡ë/))©¨¨HKK;xð`ÿîÝ»m\£§êììÜ·oŸX,þãÿh}‹‹‹KKKSRRrss_{íµ7F+…)•ʬ¬¬µk×8p```ÀÊ‹‚ÊÎξpá–-[öîÝ{þüyÜieòï¾û.55uÞ¼y¶¬£9»áúúúÌ_¼@•——óù|Ü>vìXbbâŒ3BkÖ¬Y¶lY__Ÿ‡‡BH&“7î­·ÞB-]º”iwwwOœ8qþüùx¦1ØÜÝÝñuÖ¬Y½½½o¾ùæîÝ»ÛÚÚ¼½½Ïž=»iÓ¦]»v WÔ––.[¶,88!´nÝ:™L¦×ë]]]ŸºFÃM¸jÕ*Ü (*00póæÍæwN ¹Žåå剉‰³fÍB-[¶L&“q8+…}ôÑGžžžo¿ývzzz__Ÿ•!têÔ©?þøå—_ÆÏ._¾ÜúZÇÅÅáÁö²;pÞÞÞ÷îÝ›9s&~X^^®×ëcccÍdžKHHhoo_¿~½J¥joo¿páBVV–ب¨¨ììì[·ni4šüã¡¡¡6¾<'OžÄÛ‚i „=zÔó„Éd23fÌ‹ÅÛ·oG=|ø!ôæ›oªTªÓ§OGFFZ©Ïç_¼x±¯¯/''Ç|Ñx’ÁpTTTff¦J¥jjjúúë¯ÿú׿ڳÍì6ä:.\¸ððáÃׯ_ïèèP(qqqz½Þö¬¿( ,ÈÊʪ­­Õh4ÌϳXk»÷p`ïÞ½ûÛßúûû_}õÕÍ›7Ëåró1~øá£GÒÒÒôzýŸþô§5kÖØ8ùöíÛ7lØ0qâD¦2_σ®]»vÏž=‡š6mÚG}ÔÛÛ»qãÆ¬¬,Ù³g777ãsšájHJJ:xð`FFFRRRYYîœ5kÖòåË ===Íëaúår¹^¯OKKëéé Ù²e‹½ÛÍ.C®cffæÀÀÀÖ­[»ºº¦L™²cÇwwwÛ ³þ¢ÈåòžžžM›6Ñ4ýÉ'Ÿ(•JÜéðµ¶¼ãשoÀLMM1cF||<Û…€Çð ˜ÖîøuRz½¾¾¾^©T&%%±]Ëc¿üòKrròàþ?ÿùÏøðÅôœ®ªªjçÎ #>{r¸9sæà+yÀÜs¸ðððððp¶«O·'¢ p€( ˆ²¼Œ¿ƒà÷kmm½qãÆ°×á,¾ƒàwòõõÅ7›0þkÀ³Çp€( ˆ‚À¢ p€¨ÿmj³Æ libglom-1.22: Namespace List
        Namespace List
        Here is a list of all namespaces with brief descriptions:
        [detail level 12]
        oN__gnu_cxx
        oNGio
        |\NDBus
        oNGlib
        oNGlom
        |oNConversions
        |oNDbUtils
        |\NUtils
        oNGlomBakery
        oNGtk
        \Nstd
         oNtr1
         \Ntr2
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_24.png0000644000175000017500000001465112234777146025205 0ustar00murraycmurrayc00000000000000‰PNG  IHDRó5CIóbKGDÿÿÿ ½§“^IDATxœíyXSWÞÇÏ…°/†¥ÅpA¨¸€ ‹RGeD´•¥<ê¸ NË[‹¢Sƒ¯k¥v:ÓZmÅv¬È`dÔÁ2ÓC©Š+â€(•E„€IPÉ}ÿ8¯·1$!$„øû<üqïåܳüÎ/÷žõ{ ’$€Q`¢ï è hÙ`<@Ëã¦ï 0þ8w³Œ77·ÀÀ@}çâWÀ‹]+{JÀ bF AúÎ0b¢££srrô‹_/t…\KÆlÐ.—+×O ™˜˜}gAàE€–œ;w...Nî"¬³Àx€– Æ´l0 e€ñ-Œ‡—öFµ´´\½zU_YïÎ ¨GãÃДH R.—«ïìŒcHƒêÑøˆŽŽÖ·[½BˆËåL$¥¤¤°X,sss‹µaÆ––*§M(ìí탃ƒKJJT‡çóù'§Œ„„„˜˜Ù+%%%Ož<¥I% dÃ3::¼hh^5/ª­­ˆˆ°¶¶vqqILLìîîÖaäê#‹uU4ü¾“»¨`6Jû”^5 ³%¡o«:#::ZßÞ¤ R©ô·¿ýíõë×sss[ZZ.]ºdiiÔß߯“øKJJ@ ¨¬¬ \½zuoo¯NbVŸ¸¸¸¢¢¢gÏžQW —,YB§Ó333íììF#QÁ ŒüüüF#-½^¤C/¡¡¡~~~õõõEEE•••IIIºŠ|D˜ššŽÞ!Ec6úz|_ Ín†–@KÆioû믿ž8qbOOìE@088Hꢷ-{»H$BÕÖÖª?½íþþ~:ž——G]™4iÒ·ß~«ó„2"‚)ÌÀ+åE»ví §N«ªªÌÌÌD"‘ÎZZUÝ1íÉÊÊJJJ²±±‘½H§ÓMMM©ÓÁÁA‡ãæææììßÕÕ…¯qöìY‹egg·sçÎììlWWW{{û””êÞžž¡P( ÷ïß?sæÌiÓ¦UVV.^¼ØÑÑÑÊÊjÆŒC¿LÄápæÎ+ I’LOOŸ4i’££cLLŒlÒ¥¥¥l6› ˆ?ÿùÏøbyy¹³³³X,&âÌ™38Ø™3gÌÍÍW­Z•››‹ƒÝ¾}»µµ5** èììT˜J@@À—_~‰jmm%âÈ‘#¡ÎÎN“‡Êe˜ÏçkQ ãð"x¦°°0!!:5kVGG‡Æ$"??Ò¤It:=66¶««KYT</00ÐÚÚÚÃÃãäÉ“TÑð6^{í5eÅÔaÛ>À°šÝ -?€–ŒÓÞ¶ƒƒÃ… TÄÀãñ:4eÊ”òòòºººðððU«VQÿŒŒìììÄûˆˆêøþýûäµ&&&&?üðI’^^^øÃ?~|òäI ‹þþ~òE¿pïÞ½³gÏîêê"IòóÏ?Ÿ:uêµk×"##) #„‚‚‚ÊÊÊŽ?ˆ/~ðÁ›7o&I233óÁƒ²—/_¶³³{þü9I’ûö틈ˆ âáóù SÙ³gOll,I’YYYÖÖÖË—/'I2//oúôé²&*++‹‹‹óööVmCÕµ@^ôjz‘,VVVÿþ÷¿‡^ׯ€ÞÞÞåååµµµÁÁÁ+W®TÕäÉ“?üðö¶¶¼¼<“Ç£C5Ô2cªFáûZ6:ÀÐìfhù´dœ¾“h4Ú•+WdoÁòÅ;ÉÓÓ“u¯©©Aá±q„^Ë)‘HäŽñ»\ö¥ÞÝÝýÞ{ﹺº …B|ø—_~)..– “““süøñüüüÒÒRœPAAîáI¥R@0mÚ4’zvÇÆÆææær¹ÜwÞy/PH\\ÜÅ‹sssÃÂÂeÿ¥0“%K–dgg‹D"//¯E‹466.\¸ÅbùûûáÝO¯8àEÊRQáEÊ’X¾|ù·ß~KÞ¹sÇÉÉééÓ§ÚðþýûøàÞ½{!ggg…Q-[¶ìáÇ999 #,,lhóTY1Õ̆<ÃŽê ‹7¦k‰úÙPiºÌ^»I¥Ò7ìÜ™säÈe ’Ðy~0 ¡Aœ#-šö¨3ÐÙùô›oÊV¬økooÿ¨fƒÔ˜Ghoog±XË–-ãñx=ÊËË›;w.zyaÿþýžžž7nÜÀ³ò‘‘‘Tü”û)œì;i``àÃ?d2™ŽŽŽï¼óåêÊÈøO{{7BH,¹™GŠÐX(bDE“û½hã`ƒƒÒýëÎû93mëÖìÒÒºÁA‰D"•H¤!„äw±ÚÐ××wýúõþóŸ² FI’eeõ[¶dMŸÎÙ¼ùô?Ö‹Å©”‹%úΚ2ö^ôÝwߊàp8c“ƒ`ضÏP”mL?xð §§çÍ›7ïܹbjjÊãñþò—¿¸¹¹•––¶¶¶r8'''±XL*šhD2½vôB €ÍfÕP'"6 B–`îܹUUUÕÕÕX<!Äãñ4ØRÏår Â<3óêò基ºne³S\]·R½Ù?ƒ³¡Í„"FZ4¹ß ‡Ã©ƒEGG/Y¿cwÚ´T㥾õËÀ˜ÉÍ͵µµ=tè¾3¢¢££#"â9œüÙ³ÓŒdw÷íJ¼Ælt‰‘y‘¢ð}G2OêsçÎÅÅÅ‘CžÝr899¥¥¥%''#„„B¡FãóùAAAiiikÖ¬AUWWÏš5‹Çã­]»6%%eãÆ8m‘H4aÂ…ëà ‚àóùÎÎÎø8'''::Z$ÙÚÚâQ„úúz///>Ÿ¢0N‚ vìØqøðášš„ÂÛ ‚()) CݺukΜ9Ož>žÃá¬]»!tçÎ3fˆD"{{{Ê€R©ÔÔÔTö˜ÇãÍ›7ß>oÞ<„ÐÓ§OSSS šššzzz”Õˆ\Ýùøø(¬Yߘ8qbCCƒÁpssËÎÎ ZÌÁÁÁ‰'~óÍ7QQQsçÎMJJÚ°azáo¡¡¡CS©®®ŽŠŠjooß¼y³½½}FFFWW×¶mÛÌÌÌŽ92Ò¢Éý^vïÞ­¾ƒ]¼X¹uëɾ>u¶þ’)Ýy¡[D¢ïÿö·4Ãù¾= š¬ûýï?{úÔ\ßy‰¾¾ê'Á‹mPØn¡iѱcÇ>øàƒO?ýtÑ¢E‰‰‰Ô«±¹¹yòäÉøØÓÓüòË/x›;Bˆ :®f*X @(¦§§_¹r¥¡¡Ú¦"NJl 33SÙ혩S§âooo„P[[>Å[êeG[ZZTì=£Ó­£¢Ü/_Î\±â®\¹gbbBhpPª,¼¯/{Ïž9jA3®]»–žÞ3l0,AUŸ@ èëëc2™²aêLŸ>\(âØ±cõõõÖÖÖÊjD®îTT„œPĬY³ÔŠðóóS&!—ЬPDaa!—ËÅBŸ|ò‰E“û½455ÈÁV¬ðýâ Ag§uÿÄ®®ssÚÀ€ªÉÍÏ>‹·°u”·ÞúÛh'诩S|¾µTêöè‘ЂÖ߯ʋöí{ËÅÅ~´sµzõÒÑNx5Ѥeƒ7¦WUU?>,,ŒRþa0ÁÁÁHf»««kccã‚ ð)ãQ¨Ò#~M†„„>|ØÏÏ$IKKKÕqæää úøølÚ´)44Tá혆†‹…ª««#ÂÍÍÊð'Ÿ|²råJôb@hØÖ˜••é³gµ\î»ÝÝÏŠ‹k.\¨üÏîâ¤T*?„3qâ„+|‡-¾6<{VO’ÃÃBkÖ¬Á¦£Óéeeera°Î®SE,X°@YÈÕŠŠŠÈÈȸ{÷î°B«W¯öóóS(¡0õ…"†-šÜïÅÔÔ´  `Dfg7`g7““qûvsNNÅùó7Ÿ<é53£)\¿1ËÆÆBu„Ú#‘Œú¸# [¬­Åîœ“uu/]ªÌξþè‘F3QØ còä×F;KbqÇð`äh²‚Ø××755•ÍfÏ›7Oö žpàÀŸþùîÝ»x%)Aëׯ߳gÏO?ýôøñã#GްX,ü­ö3gÎà&u€ªL%‹ýýý===ïÞ½‹çDž}ž›ËKHøÊÍm“ùÿ{¿_‘Äè…ªPSSÓ_|aaaqþüy=æÇðQæEÏŸ‹/]ªÜ°á›{¿·Á bÕ^€d¤­¨ïLÉŽ:ÚŒ©žMMM µ«ÖèÖnR©´¢¢q×®<Ÿ]Õ²1ŒU(B–aÕc»ºzNú)*ê¯LæÖW§e#ÛÀݽ{÷ìÙ³õ˜… ÃgÇ ëE"Ñ3.÷F\Üqk´lÔ©¡æŽ:ÚŒú1}||þøÇ?>}úôñãÇiiiáááNNN:ŒüBÄܹ¼]Uµ/)éM}gÇH0V¹ pt´Y·.¸°pË»--_Å(ÆÅÅUUUá®óP&ªZX@KöXµV©\féâÅ‹,ËÑÑñèÑ£èÅfCJ£ ƒ?"=vv öö–±±óÏžýí[{Œ úÎŽ¡Àçóu8ê1lÛG}ª««ÃÃÃmmmmll–,Y¢¦4²`hc$†–ŸQâÕŠPç‹?c Òwo½ÜîîîFUWW+T`R­€EEH}ÅF…V“ ™¥¥K—¶··çååÑh4ê%r]áË—/»»»8p ½½}Lìô+àE#¥¬¬,..Ï)+|ÌUçúׯ/†f7CË %ðNR˜…/ OOOêë555!‘HôÆo`õgòÅ7„¥R)©ü…—îáïKËóx¼éÓ§geeá[Z[[MMM{{{ñ]xýIE5tÿáÇ;wîd±XkÖ¬¹~ýú¨XGàEjÒ××—‘‘áëëÆår”…Ô¦eŽª+F}6 @/477#„˜L¦B¦¡ X*4J­&,€„w»0™L‰DÒÒÒ‚ÿ…µ ”©:Q°Ùì>ú¨¡¡á7¿ùÍæÍ›ýýý5,30 »»»ß¾};;;»¤¤$66ÖÌL—Ó»à¨c´l÷p¹\???¬À„/R LX‹ , q‡!D’$Bˆzè‹««kAAîâ^5¥²¨ú%$G]]ÝÕ«W»»»/^¬þ]ÀhÃb±üýý‹‹‹‹ŠŠ†ªh8êØ-Æ%XU¨¹¹ùøñãü1VcR¨À¤L‹N§vww>>—.]º|ùrkkëÌ™37nÜøóÏ?k'8ªv¾ C³›¡åÐX!¡0//¯¿ÿýïøºB&e X§OŸvqqqrrÂ߇§Ö¨ÐjRGf‰ŠJV£ “ŸŸíÚµQ6À‹FJooï‰'BCC•@ê­³GUÔý"æPV@5---ååå²–Ô/PFFyyy@@@NN޾3ò+Ap¹\ø–á8"&&!^ ¿ˆùÒl”››¼5€Åb”Ý Œ€€€ÀÀ@}çB|÷Ýw •ì9޾³¿Žjh¼ô­ÀÀ@ƒjÑšõË–-3œ¡PP8ª¡+ˆ0 e€ñ-ŒhÙ`<@Ëã€ÝŒ‚ X,–¾3¨‹aª"Z¢POަ,4€2@0iÜa€ªHàE€ö(Ô“ƒ1ŒXg€ñ-ŒhÙ`<üþ—Ï·mÐ+ßIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_0x64.html0000644000175000017500000001155712234777147025031 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - d -

        glom-1.22.4/docs/libglom_reference/html/functions_0x6f.html0000644000175000017500000003274212234777147025112 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - o -

        glom-1.22.4/docs/libglom_reference/html/namespacemembers_func.html0000644000175000017500000004356012234777147026561 0ustar00murraycmurrayc00000000000000 libglom-1.22: Namespace Members
         

        - a -

        - b -

        - c -

        - d -

        - e -

        - f -

        - g -

        - i -

        - l -

        - p -

        - q -

        - r -

        - s -

        - t -

        - v -

        - w -

        • write_pot_file() : Glom
        • write_translations_to_po_file() : Glom
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1DatabaseTitle__coll__graph.png0000644000175000017500000000717012234777145031555 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“-IDATxœí}LSWÇÏ- ‹+å%¡-ÈxaĹéÜÀ‰Ã¨¨«È“f(Ó•Œ¡Ì2`ȈƑ…—S›PT ›Û‚ƒ-dÜíî®”Rkm÷ìœOüãwÏýú»¿{¾ôœÛsÛ^‚$I€A†¹ À˜ì7Z`¿ÑûØoÄ iÔÔÔ˜»Œ‘ §[l¹P]ÿ×——§Ñ¢ÅïÈÈH“ƒyêˆD"<£ö-°ßhýF ì7Zè÷ÄÄÄ»ï¾ëêêjmmíêêzðàA¹\w!‘HŒW! ´aÄCßÎÎîäÉ“ÕÕÕ\.wÅŠÉÉÉ” ¢¢‚,Aß~û­››[bbâÖ­[9“Éô÷÷¯­­¥b±˜Ïçs8œ‚‚ØØÞÞ`kkëîî^RRBe»uëÖÂ$AœœœFFF´ W®\qwwg³ÙáááCCCT;I’¹¹¹Ï>û,‡Ã‰ˆˆ :~ TþÅÄKöØã±pýœ\ {{ûÆÆÆÅöÂ>ýàƒ<==oܸ!•J·lÙFí###uuu€;wRqWWI’åååÝÝÝô@#3}300°µµÕÍÍíðáÃ===ƒƒƒ%%%ÖÖÖ*• BBB~ûí·Ë—/[ZZþþûï$Izxx…B…Bqùòeƒ188Óúøø,–dxx˜$I‚uëÖݾ}ûîÝ»¯¼òÊÎ;©Róóó½¼¼ÚÚÚd2™@  –²é'Bå×!ÖÝc:×X?7ÄoKKËï¾ûŽÞïÑÑQêd¼½½ËÊÊ  ££0>>÷¶´´$©V«5bº—ZYè·H$"Irlllnn6J¥RªW¯^¥òÃF‡“——Å£££sss0­Ž$0Ð!€gA’äÍ›7<€9ýüü*++á.¹\naa155E.â·±Á=¶ÐoCÆs.—ÛÙÙI·™º8§èëëóôô„1 úûûá&‹Å0 ØÜÜÜccciiiAAA\.7>>ž.àñxù‹ŠŠrssW®\yàÀ{÷îQsŽ$K ¼¼¼`°zõj€B¡€›===ûöíƒo(x<žZ­¦:a!:ÄFì1Cþ[hhhQQü°Ùì~øACÃçó»»»a .—kX‰:€§ÔÝÝ}öìÙ_~ù嫯¾¢ àIgÇŽ½½½"‘ÈÅÅåµ×^£þRu$YR “É` •J ‚puu…›\.·¾¾¾°æççGGGW­ZµØ¹<–Ø` ñ;==]¡P‰D¢P(®\¹’™™©¡Ù¿ÿûï¿ßÞÞÞÙÙùöÛo =¯«+**zzzèÁ’ÌÎÎnذÁÛÛû矎ލZY»vmJJŠ››ÛúõëI’´±±Y2 |C¨C’’r÷îÝŽŽŽ#GŽDDDPïcccÓÒÒ$‰L&‹ÖZ̯§øI¡îzÎß$Iþúë¯111ööö¶¶¶¾‚éó÷ÌÌŒP(äñx'** NQ §®…1 ¼¼œP€ó7Üllltww·¶¶ ¼víZHHÈêÕ«æ‡5\¿~ÝßßßÆÆÆÓÓ³ººš’-–$((ÈÆÆF©Tê8Jee%dz··ß·oŸF'¤¤¤ðù|‹B]^Ñ £òë#^,^Œ…ó7AÒ.¸jkk÷îÝKoÁü_þ~¯Ÿ£ö-°ßhýF ì7Z`¿ÑQ¿Š1s—`´Ü±¦ßéû·RR"ŽöX¾ÜÊÜ…<]úûûù|þßšè‹/ˆ|³„Á°qqI´µ}ÎÜ…˜]ëkˆpñâw©©u6xÔ׿mîZL Šó÷Õ«‚IÏÐÐCs×bjó»¯ïDÒK’€Á êëoš»Sƒœßbñ- @­ž¯«k7w9¦9¿kkÛÕêyI‚Žyw÷°¹+2)hù-•vvR—¨VV ?š·$ƒ–ß?ZYýõ¡éÙYumíÍXéAÈo’$kkÛggÕôÆÞ^åO?i~Øò_ B~ß¾Ý'—j4ZYY^½ŠÐU:B~××ߤæÙÙ9‘¨E'TüV«ç/_–h æáá‡É/&¯È< â÷ÝJå”Ö]VVè,¼ â÷gŸÝ€X¶Ìþ³²² bµšllü¾)ÿ×óT¾ÁûÄߟwêÔëÔæéÓŸýç?/úùýõ•—±±i–9J3)(Þp¹ÇΟߺÖÜ…˜TÆs ûØo´À~£ö-°ßhýF ì7Z`¿ÑûØo´À~£ö-°ßhýF ì7Z`¿ÑûØo´À~£ö-°ßhýF ì7Z`¿ÑûØo´À~£ö-°ßhýF ì7Z`¿ÑûzýžG[[Û‡~h‚jL†\nÇáüÎdΚ»£püøñ%ezý^O___]]ÝæÍ›Ÿ¸ª Ë– ON‚ÉIs×a$îÝ»§§ò1~Ÿ)##ÃZ0Oý­Áó7Z`¿ÑûØo´À~£…‘?uzzº¬¬¬¥¥ettÔÞÞ~ýúõo½õ–££# 88øüùó>>>Æ:Vpp0  Njݺuë&¬¯¯æ™gŒQÝ 6&$$,<ÑûG+Æô›$I¡PHDff¦‹‹‹R©‹Å VVOåIyyy^^^ÓÓÓmmmgΜ±±±yõÕWŸÆ C,Ã`÷îݰT“ÉLMMµµµ5KIÆÏ¿üòË3gÎøúú²ÙlOOϤ¤¤ÒÒR ͧ  &“Éb±œ÷ìÙ}ñâEâàààñññ§T‰VXþ,•ÅbYXXlÛ¶ ¾L_’1ýnjj ³±±¡7²X,㯣¨ÕêÒÒÒÈÈÈ={ödggOLLÀöàààæææˆˆˆ]»v}òÉ'_ýuxxøë¯¿^TTD šššè[¶léêêzøð¡L&KNN ‰‹‹ûæ›oÀŸCkXXØøø¸V¤µµ5**J ¼÷Þ{ccc‹)ïß¿Ÿ°cÇŽ¨¨¨Ï?ÿœ$ɪªªèèèÐÐÐŒŒ ê¤ÚL/‰Úõ¸©cú-“É<==ukjjjš››333 ýôS¡P(‰  55ÕßߟhàääÉÊÊâóùÅÅÅ—.]ŠˆˆÈÉÉ™››kiiÀYS«&‹Å999ùùù###¹¹¹‹)³²²žþùªªª„„„sçÎ]¸páÚµkéééçÏŸŸ™™Ñó^½$ª±¾¾Þ€TúcÌù{zzš^:uµ"‹á˜øâ‹/öïßïëë HLLŒ‹‹›žž†“YddäŠ+6mÚˆŠŠ¢â‰‰ —mÛ¶Á T°ü1“É„ƒÊš5kfgg§¦¦è…é9rÄÃÔ”_]]íìì¼P999Éáp8ΦM›=çççHNNŽŒŒT©TÖÖÖôaCCƒ±RiŘ~;88ôõõ=÷ÜÏÕ‹Å*•*<<œ®ârÿxª †‡‡W®\ `2™‚ 4b=8::NNNVUUuttÈårͧÐ!àñx0pssôööŠÅâ…ÊcÇŽåçç‹D¢^xa÷îÝCCCÙÙÙÙÙÙôb´zI•J+Æô{ãÆ Û·o‡/‹uçÎ ““ÓÀÀá@íàà`”£777{{{ÛÙÙ:tÈÏÏïðáÃÞÞÞ$Inß¾]C™˜˜¸˜@.—Ãy¡¯¯ ˆÓ§O¯[·n¡rÆ 555]]]­­­III #;;{ãÆ’$§¦¦¨ñìqqpp8zô¨QRiŘówll¬R©¿··7''ððáÏù†AqqqwwwOOO^^ÞæÍ›—-[¦UyèСââbggg’$Aii©T*•ËåçÎ;vì˜þFšêƒSéƒ1_ßl6»   ¸¸øÄ‰333/¾øbFFFLL ]ýèÑ£ôôt•JõÒK/%&&ê™<'''55ÕÅÅ… °;‚àóùB¡000püøñüüü’’’U«V½ùæ›SSS§N*++[³fÍÁƒëêêÞxã ¡P¨R©^~ùåwÞyçÎ;Z•'Nœ(((hlltttLMM ºpáBzzúä䤿¿VV–ž'E•dgg[bbbT*•©ôD¯Ï·ÔÖÖîÝ»^Obþddd899‰D¢%•xý-°ßhýF ì7Z`¿ÑûØo´À~£Åc¬¯iýtæ‚Æ}©ÅÐk}­¿¿ÿûï¿â’0OWW×€€€%eˆ>ÿYðüØo´À~£ö-þÎ<°üÏ4ö¥IEND®B`‚glom-1.22.4/docs/libglom_reference/html/ftv2mnode.png0000644000175000017500000000036612234777145023756 0ustar00murraycmurrayc00000000000000‰PNG  IHDRɪ|½IDATxíÝ!NAÅñ¤‡à\ ÷à Um@`Ô5iÒ`ëh ‚ÅW7] b§ÝˆŠ&oföÍd¾YÔ4 üšcø ‡€´‹Åòù3v=¼]†§µ\B… I¿‹=B·™B¡®;¸k´µ W°ÍN@vyÍÑÖ4ãß÷]ÈâYìã§|M}]ÔÚx6a }ôdׇØYüú¨>¤||5?Ó>|žB"¡î'¡IEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_0x72.html0000644000175000017500000001575412234777147025033 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - r -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Image__coll__graph.png0000644000175000017500000001247312234777146032407 0ustar00murraycmurrayc00000000000000‰PNG  IHDR°Ã­c fbKGDÿÿÿ ½§“ðIDATxœíÝ{P×Ûð³$Êň!ÀÏ1E/H;¶¶N¡•ŠƒRmmÆBÅZßQ[{Áh¡–zÚv¬h-v¤€r/—Š×z­4Á× ¯n DM ˆ‚“ìûÇÑýåWÍóùëääpöÙÍ7›ÝMH(š¦OØq]\ € @ oùnŠ¢¦0`,ŸWö„ÐçŸîïïÏ^=€3¥¥¥?þø£å1½Âßß?""‚¥’Çz C € °ˆ¶¶¶5kÖxzzÚÛÛ{zz.[¶¬±±ßEQ”\.ge)Ì„]±¸ˆ§œ¢(FÓ§9YßDO£÷ÓÎ^ÆyóæQ•››;nܸ¦¦¦½{÷TUUÙÛÛ?ýüf´Z-n¸¸¸œ:ujêÔ©¡ádz¾ ÛÄB öïß_]]­T*‡ †rwwßµkצM›ø|&ïJ(2m@`zsP¥V«ÝÜÜžÓù{ÅÂKFFFƪU«pB¡Çã17õz}BB‚§§§››[dddss3î§(*33S"‘ >|íÚµ‹ÅÎÎα±±Ì€ôôtÓFO(Š:sæÌèÑ£W¯^,‰ýüü²³³™ÅÅʼnD$ýüóϸS&“ùûû;99yyy¥¤¤0³]¼x±ë$øB¾»»»F£év–ŸŸïåå% ÃÂÂîܹÃôÓ4½uëÖ±cÇŠD¢ððpf#˜®3Oƒ{ÝbO‹¶!”••eyŒ‹‹KQQ‘…d2Ù–-[¼½½ËÊÊ ŬY³,XÀÜ+•J5Mnn.BhîܹL»ººš¦é´´´ššÓ†Ù̦7Î;7zôè•+WÖÖÖÞºu+%%ÅÞÞ^§Óá!!!·oßÎËËãóù>¤izܸqqqq*•*//ÏÎÎîÖ­[xÚ‰'ö4‰Z­¦iÚ€iÓ¦]ºtéÊ•+o¼ñÆÜ¹s™RwîÜ9~üøÒÒR¥R)•Jú®3¿…Á–·˜YYY½?â½ÜmE ø|þùóçMÿÓjµô“µõññIMMÅ*++BwïÞÅ÷ž:uЦiƒÁ`Ö6}°{ªÍ,9994M·¶¶êõzÜ©P(˜MŒúã?˜ùq§H$úá‡ð`­V«×ëñ´&Á ðZÐ4}á„PKK žÓ××7##ßÕØØÈãñÚÛÛéaap¿·˜5`á%C,WUU™æ€9Å`ܼyÓÛÛ·q£¡¡ß!;;;³v?Œ=!ÔÚÚš(‹—/_n:ÀÃÃÃlþäää­[·Ž3æ£>ºzõ*ó2ga’^Œ?7&Mš„R©TøfmmmTT>-òðð0 ÌFèÊÂ`·XW,LšœœŒCŠ …fc$IMM nã†X,~úE›ÁÛ%00°¦¦fûöíuuuG5ÐõÝüwÞy§¾¾>''gÔ¨Q3gÎd¢la’^(•JÜP(Eyzzâ›b±¸  ?F£V«0aBOëÒ§Á,b!‰‰‰*•J*•Êår•J•ŸŸŸ””d6fÉ’%6lÉdUUU111R©ÔʳƒôôôÚÚZÓF¯=z4}útŸk×®EGG£';ínM:5>>~ôèѯ½öMÓ½N‚Ï{- ˆ¿råJeeå'Ÿ|ΜGGG'$$Èår¥R¹|ùò   nKÂó[9˜}–_QÇ4M߸q#22ÒÅÅÅÉÉI*•â}€é1Dggg\\œ‡‡‡H$Z´h~™¤»¼|vm#„ÒÒÒL¦µ™Cà›EEE^^^ööö%%%!!!“&Mê:?®áĉ~~~ÞÞÞd†õ4I`` ƒƒCss³…¥dddxxx¸¸¸DEE™m„øøx‰D"BBB˜c@Ó˜ù­ÜS»'tP žtP ^$@€@ €BÝ»÷ðÞ½‡\W1(ôþ‘…ÒÒÒ¨ƒ[ååw(Šš>ÝëBž-kJжø]6ò¯|"ÑûÑ--p]È@°üˆ÷²‡°üÇ/†Û·ï¾újE¡Û·Ûþó[ÿ(C ’’+vvEQ%%—¹®…{”]NÓ´ÑHge•s] ÷l=uušK—ŒFš¦—/7ܸaþ9G[cë(*º8dþ”ÅçÛþ/ÇqÍÖ‘™Y®×?þ¬—^oÌÉ‘q[çl:×®©êê4̉MÓJåë×UœÅ1›DAÁ…'¯ Ê+(¸ÀU=ƒí‚¦éìì=2˜vvvrså¶põ¥'¶ˆ êoßnëÚßÔÔzá¯g°Ý@üñ‡ùëfã¯6½Þ˜Ÿ/7{½À:; ùùrƒÁ8ðU 6ˆ²²êÖÖC†Ø Ê:”?t(oèPnb§Õv”•Õp]#7žÉì~C†ð¾þZÊÜÌϯ@½ÿþ4¦‡Ï·Ñ§J/oÛˆ+RB¿ü²„ëB¸g£ÏÐ @ @€@ € @ @€@ € @ @€@ € @ @€@ € °ü•Bááá,Î6`ZZB"Ñ® 霜gc9E½ñƉ„Å9AOÊÊÊXþ–0vnÁÇ k~ܽ¯à € @ ›@´µµ­Y³ÆÓÓÓÞÞÞÓÓsÙ²eø.Š¢är9‹Ëb}ÂA¸Dq£Ñ8oÞ¼òòòÜÜ܆††?ÿüÓÁÁ! @§Ó |1À ߆¿ÿþêêj¥R9lØ0„»»û®]»6mÚÄç?Ç_ÍOQ”Z­vss³²Ðâ`‘‘‘±jÕ*œ†P(äñþûû6z½>!!ÁÓÓÓÍÍ-22²¹ùñï«R•™™)‘H†¾víÚƒŠÅbggçØØXf@zzºi£«‹/‹D"GGG??¿ììl„лᄏcÇ< ¬¬ÌÍÍíÁƒ=Õ ÑhLÛE!„ÜÝÝ™~æ^¦Ÿ¦é­[·Ž;V$…‡‡[¿FÝë\ÈŠ+•...EEEfÉd[¶lñöö.++S(³fÍZ°`s¯T*Õh4¹¹¹¡¹sç2íêêjš¦ÓÒÒjjjLxBÓELœ8qåÊ•µµµ·nÝJII±··×étû÷ï÷÷÷Ç>ûì³+VX¨A­V›µÍ:™%2ý;wî?~|ii©R©”J¥aaaV®‘ÏâJ%àóùçÏŸ7ýL«ÕÒO¶¦Ojj*PYY‰º{÷.¾÷Ô©S4M ³¶Ù£n:¿Ù]­­­z½· ~ÌZ[[ ƒX,>s挅ú__ߌŒ ÜÙØØÈãñÚÛÛû·FŒäÒµX,®ªªbnjµZæƒqóæMoooÜÆ††|S  „ìììÌÚÖkmmMHH ‹ÅË—/Ç#FŒÎËË;{ö,ŸÏŸ1c†…ú¡¶¶6**Š¢(Š¢<<< ‹kÄ"šœœŒŸ!¡PXQQa6F"‘ÔÔ<þÕ+Ü‹ÅlXSS³}ûöººº£G2ý¹¹¹YYY‹-¢(ÊB ø™Ý§|ˆÅâ‚‚ü,4Z­v„ l­‹8Dbb¢J¥’J¥r¹\¥Råçç'%%™Y²dɆ d2YUUULLŒT* …ÖLžžž^[[kÚ@Ý¿¿õ ƒÁðèÑ£éÓ§ûøø\»v-::!ÔÒÒ‚š?¾\.ÏÌÌŒŒŒ´PƒP(,,,lkkÛ´i“颵Zm·%áþèèè„„¹\®T*—/_Ô—m6€Ø}BÖ½ý}ãÆÈÈH'''©TŠŸ¦Çqqq"‘hÑ¢E=½ÅçÛåäȸ®…{¶ˆ{÷;V©×õzñcÿ×ÞnëŸü¶õ@=Z©×q[¯79r…Ûz8gëÈË“ÛÙ=>¤(*/ïyý¶Øt 4šûÿ]e0<ÞC Æsçþmiiç¶*nÙt JJ.#d~žyèÐ%NŠ$l:¹¹2³+ÖF#›kÓ綈†mEE½Ùe>š¦åòz•ª•«ª8g»(.¾Èãu³ú<ž]aáůg°Ý@ääȘÿ 1e0mù •¢¶V}ýºªÛw…hš¾v­©®NÓÍ}6ÀF?SYQQïëëa4>>á¼}» !4r¤3¾iggWQQçåõÜü?‹X~ûû9µbE*Bè—_–p]÷lô%ô@€@ € @ @€@ € @ @€@ € @ @€@ € @ ÄwLeggsU·::ÔȆWßôWNˆï˜zN <%Ó ˜ ÝúõëgΜ9 åîœ>}:))É´Ž!@€@ €ÐŸ@tttìÞ½;""böìÙÛ¶mÓhw|PPB¡`±>Ö' Kø•²^Ÿ¿ Ÿ¦é¸¸8Š¢’’’FÕÜÜ\\\¼jÕªôôô!C†<‹Á@êóâÈ‘#MMMÛ¶m›øàƒÐÐÐo¿ýÖú5ê•åº]Y½^ŸœœüÞ{ï………:thΜ9 …¢§ ûªÏP*•ÞÞÞ–Çdee¼dÉ’É“'#„V¯^½téÒŽŽ'''„PDD„³³óŒ3B‹-bÚmmm£Fš={6žitµ{÷nGGG¼Czùå—=zÔÞÞþÖ[oíØ±C£Ñ¸ººž>}ú›o¾Ù¾}{O5ôCaaáÒ¥K}}}B±±±:ÎÞÞ¾×5²fr 3t»²GŽY¼x±Bè³Ï>[¶l™å û¤Ïpuu½yóæ”)SðÍââbNf:æÎ;b±·qC­V3!äè舞¼­jÚ¶Þýû÷8PYYÙØØ(‘Hpç°aæM›vöìÙqãÆñx¼—^zÉB ýpëÖ­7nܸ‘éQ«ÕxéO¿FfèveMWé´PaŸô9o¾ùfaaáœ9splÁåË—ÍÆ¸»»755á}>ÞsºººöuA=Y½zµ¯¯ïÊ•+}||hšž3gîŸ9sæ¡C‡êëëgÍšEQ”…ð»½jµÚú…ººº~úé§o¾ù&þóöövfwøLu»²®®®*• ¯ZSS»öù"::º¹¹yíÚµ …¢¹¹ùܹs©©©fcBBBÒÒÒ®_¿ÞÐÐðÓO?ùûû[YÜñãÇñƒÇ4B<¸ÿ„Ñh4 “'O–H$õõõ›7oFÝ»w!ôÖ[o)Š“'O[¨A œ?¾££#==ÝtÑx’®pHHȾ}û Eccã÷ßÿÅ_ôe›õ_·+œ––öï¿ÿÖ××ãcOŠ¢Øª°Ï{¡PøóÏ?ïÝ»÷«¯¾êìì|õÕW¿ýöÛÈÈHÓ1|ðÁƒu:Ý믿¾zõj+'ß¼yóºuëFÅ4B¦ë¶gÏž/¿ürçÎ)))&LX¼xq{{û×_ššêää4mÚ´¦¦&|ÌÛS 111{öìÙ»woLLLQQî|ùå——-[–››;|øpÓz˜þÈÈHN—˜˜xÿþ}??¿ï¾û®¯Û­º]Ù”””¶¶¶ØØX@°råJ™LÆçóÙªÐüSÏõd&OžÅu!§®®îã?.((pvvîÇŸãÈXúÄÔsJ§ÓÕÔÔÈåò˜˜®kyìŸþ‰‹‹ëÚÿá‡âó‚~ûè£üýý/^üðáÃß~ûí•W^é_ºõ‚¢¼¼|ëÖ­ÑÑÑ#GŽäº–ǦOŸŽ¯d°nýúõ;wî £iÚÏÏoÍš5,Nþ‚"00000ë*ÈØ±cû}Ý©Wðö7 @ @0¿áëëëîîÎaA` ©Õê«W¯öxÂì=*ðÂswwÇo2ˆ=p @€@ €ðÿß/äÍÈÙIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Line-members.html0000644000175000017500000005534112234777147031376 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_Line Member List

        This is the complete list of members for Glom::LayoutItem_Line, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Linevirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_coordinates(double& start_x, double& start_y, double& end_x, double& end_y) const Glom::LayoutItem_Line
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_line_color() const Glom::LayoutItem_Line
        get_line_width() const Glom::LayoutItem_Line
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Linevirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItem_Linevirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Line()Glom::LayoutItem_Line
        LayoutItem_Line(const LayoutItem_Line& src)Glom::LayoutItem_Line
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Line& src)Glom::LayoutItem_Line
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem_Line& src) const Glom::LayoutItem_Line
        Glom::LayoutItem::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_coordinates(double start_x, double start_y, double end_x, double end_y)Glom::LayoutItem_Line
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_line_color(const Glib::ustring& color)Glom::LayoutItem_Line
        set_line_width(double line_width)Glom::LayoutItem_Line
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Line()Glom::LayoutItem_Linevirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/namespaceGlomBakery.html0000644000175000017500000001172612234777147026147 0ustar00murraycmurrayc00000000000000 libglom-1.22: GlomBakery Namespace Reference
        GlomBakery Namespace Reference

        Classes

        class  Document
         The Document is like the 'Model' in the Model-View-Controller framework. More...
         
        class  Document_XML
         
        class  View
         This is a base class which should be multiple-inherited with gtkmm widgets. More...
         
        class  View_Composite
         This View delegates to sub-views. More...
         
        class  ViewBase
         This is a base class for View. More...
         
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1AppState-members.html0000644000175000017500000001260412234777147027710 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::AppState Member List
        glom-1.22.4/docs/libglom_reference/html/bdwn.png0000644000175000017500000000022312234777145022774 0ustar00murraycmurrayc00000000000000‰PNG  IHDR5åZIDATxíË € DŸP–1ñlžmÀ r±j².e è†D[ØÉ¾ÙÏÔ¼µ¦ã´Þ|陣6€Všë3´Å?Ls'(}¬>+ žKó÷¥¿ch`‚ ^׃ÞnIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1NumericFormat__coll__graph.png0000644000175000017500000001043412234777145031617 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÉ…~>KEbKGDÿÿÿ ½§“ÑIDATxœí{PSGßÇ÷@C êTVß·ÖŠŽaŠxá¡Ì@"‚SËh§^Z+Ò¼0 juZ팷ApTD 7¥ôŸQ©ÃH‹øVÀV$x©`(!DnQÉyÿØ×ãñäh7 9ûùë—ÍîÙßn¾9»É9É— I`0p²u‡k ƒ ¬- *°¶0¨ÀÚ ‚c…>¤Riaa¡:-°ä³¹5´˜;wnRR’uú²gnܸqàÀ[ga%¬¤-‘H$“ɬӗÃmáýX[T`maPµ…AÖö¥­îîî/¿üR,;V,¯^½ºµµ>EÄÍ›7 ‚èèè€%0@½;ÌH±#m †¥K—þú믅……---?ÿü3—Ë7o^?UÇÙÙ977×ÍÍÍ:)Y¹;ÃJßo ‡'N477+ŠqãÆ¼¼¼:”™™Éá¼L’ ˆ•+W¢è •JåééÉ(DÔ°£óV^^Þ†  °(ø|¾³³3½„¾HOž<™ÏçÇÆÆ¶··ÃgOŸ>ͨúT\SSÂãñ&OžœMÀËË‹Zm+++}}}?N_‚KKKE"‘‡‡ÇÁƒ:.99ù­·ÞòññÉÎÎær¹7oÞD;G£ =±±±±±±CVswwÿé§ŸÌ= ¨©©J¥‚Á»ï¾{ûöíúúú¹sç.Y²„$ÉÜÜÜû÷ïÓª>=öóóKIIQ*•EEENNNmmmŒjóæÍ»~ýºV«¥wñ÷ßq8œçÏŸgffÔÖÖÞ¹sgáÂ…ÎÎÎ0C Èårë̹=`GÚâp8UUUÔCJý†4£­«W¯ÂÊ·nÝtvvÖ¤¶<<<öïß 5Íàà £ZAA£ àüùó$IêõzXpêÔ)X­®®ŽÊЬҖ­‰B¡ðÞ½{ÔCFC}H4ÇÔ©Sa0mÚ4€R©f_‡Þ³gϤI“>þøã?þøƒ±ì|}}[ùøøœœþÒ?~ìçç €avÍìH[QQQ‡†gŸÏ¯­­µÜD¡PÀ ±±‘ ±Xl²I’€––ªdñâÅ=*((ðöö 51% :p[FáííýàÁ777[N•…Ø‘¶ÒÒÒ”JeddäÍ›7•Jeqqqzzºå&©©©õõõ ëÖ­“J¥nnn§OŸ†¯7ðùü’’’îîîÌÌLªá¬Y³RSS}}}gÏžM’$—Ëh4š%œ‘‘qëÖ­?ÿü399‰íXaÝæ~‹$É¿þú+>>ÞÝÝÇãEFFÞ¿XÜoåååùøø¸»»'$$PÕrsséÁ©S§&Nœ(àÇFØöòåËÁÁÁ\.×ßßÿìÙ³$I.\¸ËåªÕjz_Œî…ÏŸ?_·n»»û”)SàÍ·oß¶<@Ví·ý=R©PPP€º#rçÎ3f¨T*@`¡Z~~þòåË­0çö€­‰£ŽéÓ§ýõ×===mmmiiiaaa–…Å6°¶^¹\^[[+ §NÚ××—••eëŒì ;ºæ3ꮨ¨°uö >oaPµ…AÖ,ÒVwKÿЕ0ÿVÚË·´´äçç[§/sôÉ}xÿj#xzæpãÆ önm¬ðýlll¬­G Æý¯šP/©­/ï`ÔçµWÿÐâÄ‹Îfë\Ø[ö[Š‹ÕŸÚÞ¶[çÂX¡­®Gýwµ'gBQÖiëtØ+´ÕüŸNç1À '›J±¶¬+´ÕTکב@‚§žw*žÙ:#VàøÚ긫ín}ùÍ–Ó¢ùÒÈîļޝ­æK§1/o5èÈ{?«+>Û×iM; ºW¤¤Uéþ®ë³UJìÁÁµÕö¿½ÏÔ:F¡‡hþ7ÞÑ#ÇÁµÕ|©Ó‰Ãü}„alºØiÐãu-ެ-ƒŽTü»Ó0hBC½ú'5=ÖO‰U8²¶Zª»µ“O99Š2üi-ެ­ûåsK ƒäëOõxYDˆ#_«~\Õ¥{öò¼UõÝãiÑÁ;<ªÄgÎø±ã™¿ÖÇüS8òo1Äó'ÐV¤<¼ÍóûÀÝVù° G^1¶k ƒ ¬- *°¶0¨ÀÚ k ƒ Gþ~‹AOk¿‹ÇŽ ~;Y i ce𛃠¬- *°¶0¨ÀÚ k c–áûûABF!Ö,ÒÖ¹¨;«ºl‹`‘¶zZûu´[œ ‚8wîœH$rssÛ²eËÙ³g…Báøñã¡Ã…I Þ={üýýÇ7wîܪª*êPÆ6z £<çääìÙ³gÊ”)R©T­VS­z&ûZ¶lÙ?ü›TWW{zzêtÌ_1A&~&g.‚ƒƒƒÛ·o‹ÅžžžñññTþ¦±í_4Y“¬ÿ®mþÏK£2@dddGG´´X²d 777›<ÂÄbqeeekkëöíÛN§#ÍXWò`¼wïÞ©S§Þ¸qC¡PDFFRv!ÀÈ@Ïd_'Nœ M¾øâ‹O?ýÔÜ`&~ß}÷qÃ!g¹îÞ½Ûßß¿ººº±±1,,,::šÊߨƒÕÚ‚yЊ›³ª ÌÎΆ±Á`Ðh4ƒ4¯-ºQŒƒ‚‚òòò`akk«³³s__iÊ@Ïd_OŸ>år¹---z½^(VVVš,ÃÄO­V7r€‘‹ §§çÉ“'aICC ««‹4£-­‰Æ¸ºº‚–côØ>|çw`LŸÏ·lE7ʃñƒ‚ ÂÇÇG¯×Sîh =“}M˜0áƒ>(**úå—_8΂ ÌuÍ0ñóðð0ÙpÈ`¸vttøûûÃÐÝݰZ[#E(R¦v€§OŸRŽ|¤‘xõu‚±P(¼páýlôöÛoà ™šëK&“Êåò¸¸8 Ê66ñfC Á‰'B/ „B¡ÙÆæNªŽ‡ñšH÷33ÈÈÈðóó»~ýºR©Ü·o߸qãzzzH’äóùÇŽëêêZ»v-0ã[ãôôôàààššš¦¦¦5kÖÌš5Ëd*•Ê\_]]]...|>ÿ÷ß·0ØÉ“'oÚ´I©Tr8œŽŽã†CÎàý÷߯««ƒû-™Löí·ßüöÛop¿iaÒ°¶,Å ÒÒÒ|}}y<Þœ9s¨½ˆI=“ÇHMM‰D®®®Ô‡cm™ë‹$ɨ¨¨éÓ§[¬±‰ŸqÃáh‹á"800’’âãããááGßeO‹î±q˜û·¢££çÌ™³uëV«5|M,ËŸ”••™œ«mÛ¶Ù6±¾¾¾êêj—‡Ž(OFC뀵5š(,,tuuݽ{·Õ¾ ,Z1VfÔo>0v ÖX[T`maPÁ"máû·¬ ‹´Å¸ ƒi ce°¶0¨ÀÚ k ƒ ¬- *°¶0¨`ѵj‡¹k´À"ma¬ ~cPµ…AÖX[T`maPµ…A‹´…ïß²2,Ò¾ËʰH[+ƒµ…AÅ+×|¤R© SAMØ£¤¯ÿiçݳu"¨Ø¼ysHHˆ­³xÉ+Ú""((ÈËˈ a^ÊÊJ¹\.“ÉlÈK˜^èR©444Ô™`Þ‰Dbë˜àýX[T`maPµ…AÖ¯£-­V{äÈ™L.“ÉöîÝK9ŽH$’ÆÆÆ0?‰D’™™É(ùg» £×ë%IW—ÙËŽ#Ð%3Úa~1$$I¦¤¤‘žžîíí­V«KKK7lØpúôé1cÆ H±¢¢"&&þw>jœœœ¶nÝÊãñ,ÔÙ¿?õþË•Ù̈Ï[—.]zòäÉÞ½{ù|¾¿¿ÿ¦M›rrrœQä …öIV€ ˆððpËoW–­4ÞË'Q;gÄóR^^Íåré…Œ)Öëõ9992™ìÃ?ÌÈÈèîî†å‰äÊ•+R©téҥǎ«¨¨ˆ]¶lÙáÇ© åååô£Ñh®\¹ÂÈ„>ïTl¹ ’$Ïœ9³bÅŠ¨¨¨;vл}ûöòåËËÊÊà¡`ÍøøøÅ‹¯_¿z×@ž={ÖûƒÁ`y¼ôÃZHL¡P$''GEEEDD$&&^»v ¼ø:4::z”ÊkÄÚR(”£‹9ärù•+WÒÓÓ:ÔÙÙ¹oß>ê©Ë—/çä䤦¦ž9s¦¼¼üøñã)))J¥°uëÖàà`zàp8k×®ÍÊÊN†º¸páÂÅ‹ÓÒÒŽ=:00@Ù¾Ž;¶}ûö°°0ø°¸¸¸¤¤$555//oöìÙÛ¶m£ìU’’’þõ‚¦¦&Ëã¥ÖBb;wî‰DYYYçΓJ¥»ví¼zõ*àÂ… &LÎÀíï·´Z-}¨Ô¥†ÒÒRh6(++[µjU`` `ãÆ‰‰‰Z­îKd2Ùøñã¡WQ\\www{{{‡‡‡Ã#PdÁ‚………ùùù+W®2C ]”””$&&’““e2YÿرcR©tÆŒÔAJKKW­Z5sæL@bb¢L&£NÌG¥\œ†/ý°;r䈋‹ ìbæÌ™:®¯¯o”JŠbÄÚ?ž>}:|XZZÚßßK¯ÓÞÞNYÁ@¥RMš4 àââ^ø"Ñã!ùì³Ï6mÚ´téÒ!kZ袭­-#####ƒª¬R©D"`âĉôƒ´µµ‰ÅbA½mLba¼ôÃZH¬··÷Ì™3 ­­­0`ÄÚš?~IIÉ¢E‹(c´ºº:F//¯'OžÀE .và  X¸pavv6½|á~3̃‚õë×ÏŸ?¶íëë£Dø@ P*•Ô)§··—Çã™Û¶[ï0ß97n Z»vm@@I’‹-æˆì™ï·>úè#µZ½eË–ÆÆFµZ}ýúõ“'O2êDDDäææÞ½{·¥¥åÇ ±ü¾§(//‡¯ ÐY³fMee%õÐÕÕµªªJ«ÕB‡¦á‘““ÓØØØÚÚúý÷ß'%%™«¹dÉ’'NÔ××wvvÊår©TÚßßoá°¯7^ ½^(‰=z´k×.@OO|Š F#ÖŸÏ?xð ››ÛW_}•PVV¶cÇF+V,X° --mýúõîîî)))Ã<ø®]»à'2* #–/_N=üüóÏsrrV¬XAß'Y&>>>$$$--í“O>iooß¹s§¹šqqqáááñññ×®]Û½{7\ÅLòÚã¥Ø¼yóùóçcbböïß¿xñâ÷Þ{oÛ¶m€™3g®^½z”Ê‹yoà7ß|ƒïßH${»7_OÄ k ƒ ¬- *°¶0¨ÀÚ k ƒ ¬- *°¶0È ›WÛ:Ì!—Ë­iu>$Fr¶šÌ›3oÞ<[§ð øÿå1¨Àû- *°¶0¨ÀÚ k ƒŠÿ9@§Ay<4IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Text__inherit__graph.png0000644000175000017500000001770312234777146033023 0ustar00murraycmurrayc00000000000000‰PNG  IHDRåÀƒ$_bKGDÿÿÿ ½§“xIDATxœíÝ}TWúð;$4€A“UB‚Ê‹Z¤]϶¥Bk*Z|‰H‚/Ѓm=¥¶®ºÖ¶ …®VQwÝÖÓSu]W{°@•wëK±¢u­P‚ÕŠÒP* Ô€ò2¿?¦N³„€C&7}>Ç?îÜ\ç>3| 7™$I"0áÄv äàò py8¼¬6”Íöá†ÅÄÄØ2B\Û!¤Öaìܹӯ3²×E‹Ù~R0rssm<#¬_N ¯'W€È+À äàÄNóÚÕÕõÞ{ïI¥R'•J—/_ÞÜÜL=D„B¡`p.b Nñˆ{#¢­­mHûdüÙÞÏ”Á`˜;w.Ayyy~~~·nÝÚ·o_XXXmm-Çc|:FC5„BaYYÙ´iÓBîîîŒO=æ5==½¾¾¾®®nÔ¨Q!//¯Ý»w§¥¥q¹#R­@  Û|>ßxÓ‚P«Õžžž˜î߯ìq=••µråJ*¬4@ÀápèMN—’’"•J===ãââÚÛÛ©~‚ >,‘HÜÝÝׯ_èÐ!±XzÿæzÆì‹-/þRWb& ‹‹‹Í=Šª¬¬Ü¶m›¿¿yy¹R©œ5kVtt4ý¨\.okkËËËCÍ™3‡n××ד$™‘‘¡R©Œ&{6Þ ;w¯ïŠ+Z[[÷ïßÏãñz{{©‘‘‘¿þúk~~>—Ë}ðàI’~~~III---ùùùNNN­­­Ôn'Ožln'jµš$I ž~úéË—/_¹reúôésæÌ¡KýüóÏ.\¸PWW'—ËéKùÆBïßÂ`ËgÌ‚˜˜ß?`yår¹çÏŸ§7éo-FC>übü]&A^™”—§@è÷÷[ôzÃùó¿¨ÕwY,ÉÁ@^ÓÚÚYQ¡2þçýA‚ ޽ÌVIŽòʘ’’KNN¦—âH’ÌË«d¥‡yeLnn¥ÁxõŠBÈ`0\ºÔØØx‡•’ä• êêêæ®\®Sqñ¶/É!A^™qôèe„¾/G«ÕçåÁ»Ì€«Ų̂«»=eÊ8z³¾^=vìh>ŸGmr¹œÛ·ï>þ¸;KÕ9¸ßeDˆÅk÷î]5íB ¬N ¯'W€È+À äàò py8¼œ@^N ¯'W€È+À äàò py8¼œ@^N ¯'W€È+À äàò py8¼œ@^N ¯'W€È+À äàò py8¼œ@^N ¯'ÿóùMMMßÿ=[¥8©”ùòÔ²]ö¤RihhèïÛ¤‘ììlö `111Æàóaà8€ˆ5éõ+À äàò py8¼œ@^N†™×®®®÷Þ{O*•òx<©Tº|ùòææfê!‚  &?Žšñ²>ãÔ©SSSSéÍùóç¿ôÒKôæßÿþwNGD[[[ÿÚì4aã3†2W0³†óù܃aîܹAäååùùùݺukß¾}aaaµµµ<ñL&+//§Ú}}}gΜÑjµ===nnn¡ŠŠ ™LÆáp222ÜÝ­ýHï²²²iÓ~ÿxeëÿ#S†Zðð çù5==½¾¾þĉÏ=÷œ——ןþô§Ý»w_¾|™ËÅøÓéÍ=7ŒÄsÆ‹/¾XYYI]—ùþûïÇ'•JÏœ9C=Jå• ˆW_}•úþ·¦>Ÿ/0Âáp˜­Ù˜q=tÛ¸à‘3œ¼fee­\¹rÔ¨QÆ&çH§Ó¥¤¤H¥ROOϸ¸¸öövªŸ ˆÃ‡K$ww÷õë×:tH,=zݺuô€ÌÌLãF—.]Šˆˆ‰D®®®ÁÁÁ999¡yóæ}úé§Ô€òòrOOÏû÷Áätòòò2‰…q?I’Û·oŸ8q¢H$еþˆú“Éd555¡“'O¾ôÒK‘‘‘'Nœ@577ߺukÆŒjËËË7nœ‡‡ÇgŸ}FïóÞ½{éõzË_‚³gÏúúú~ñÅ–‹ð<×cR›qvKJJ$‰H$ÚµkBH«Õ®[·îñÇ÷ññÙ¿¿‹‹Ë0W,ýï # ‹‹‹Í=Šª¬¬Ü¶m›¿¿yy¹R©œ5kVtt4ý¨\.okkËËËCÍ™3‡n××ד$™‘‘¡R©ŒÔ§˜{ö¬…†‘×   ¬¬,ª³¹¹™ÃátwwïˆH’|ã7Þ|óÍÛ·o?öØc÷îÝãñx*•*))iÑ¢E–k»xñ"== ÿ\?77—Þ›…â<ÏæN IÁ………ÆE~ùå—Ô°Ÿ~úÉòÉ¡õÏëpÖb±¸¶ö÷;å4 ýæ­±±ÑßߟjS¦¦&j“Ïç#„œœœLÚÖëèèHII‘Édb±811‘ê3fLDDD~~þwß}Çårg̘a¡†ahhhˆ§^}ûøøèõúG9"™LVQQQZZúì³ÏŽ=zÔ¨Q/¼ðÂÉ“'©Å«åÿ+‘H¬™ÂÂáûúúÒÃ,?ày¶’ñ®ýüü¨v``àvel8yŠŠÚ³gõ­ƒUUU&c$‰J¥¢ÚTC,»J2™L¥RíØ±ãúõë'Ož¤û-Z”———½dÉ‚ ,Ô@= )¾b±¸¨¨ˆú.7 fÒ¤IÃ>„_|ñêÕ«/¿ü2Õ3{öìcÇŽUUU šWjÕ8( ‡o儹ól “"½½½¨v}}ývel8yMMMmii‘Ëå …¢¥¥¥  `Ó¦M&c–-[¶yóæÊÊÊÚÚÚU«VÉår@`ÍÎ333©£¨ß‹ ­VXSS“€ºsçBhÁ‚ …âðáÃqqqjGŽéêêJKK3žZ£Ñ XÕŸ’’¢P(êêêÃÃÇrÎLM˜0A,çõ믿ær¹ÁÁÁæj’a hæÎ³I=ÖÔ¿eË–‹/ÖÔÔP/æ¬ü®3e¼8°rýJ’äÍ›7ãââ„B¡›››\.§¾}ׯ}}}III>>>"‘hÉ’%æ–†ýÛ¡ŒŒ “†±ÊÊÊâââ &ðx¼°°°cÇŽEFFN™2…ÚOTTÔÔ©S©¶¹¾üò˱cÇzxxPï?Pý2™ÌÅÅ¥½½Ý¤0º¿¯¯/99Y"‘ðùüÈÈHúµÔ GdΫ¯¾*è"I’‰dþüùô¦¹Ú\/öŸkØ_ºmî<×3`m¨ß €¼ýöÛB¡pâĉÔë¹Ë—/[89”þëW‚4 DNNÎâÅ‹É~ÁHtttHHȆ Ø.˜uõêÕ'Ÿ|R­V{xxXIݯ››K÷8Îý===ß|óM||<ÛµüæÄ‰ý¯”‘’’Âvi¶6uêÔ>øàîÝ»­­­©©©³fÍ4¬ÂøŠ”‰ãÇ¿öÚk}ôÑøñãÙ®å7³gÏÆú‡ƒ²³³×¬Y#‹I’|þùç÷íÛ7¼ý8N^.\¸páB¶« þöÛo}?޳W€È+À äuD”•ýÌv Ži€×[ýÿHª‹ÇN™rÇÍMËv!x+//Ÿ>}ºqÏÿ<¿J¥Ò˜˜Û–ä€zzœïßwnowe»ìMŸ>ýþxB¼Aȸ­[îÚõ­ð‡R‡y•˜ëW†‘$YPP…jnÖ\¹2üÛÁ€ ¯ «ªº~ëVBÈÙ™“Ÿoz›%xDW†þøØc„V«/(Pèõ¶+r(W&ét†‚‚ª¾¾ßîdooï¾paø÷&ƒþ ¯L:þ—ÎÎûô¦³3§°ð"‹õ8È+“ «œ?¥Z­¾¸øR_ŸŽÅ’ ä•1h½¬Õê;{zœ=«d«$ÇyeÌéÓ5÷ï›^Ðâpà]&A^SPPÕÿ÷Nu:ý‰Wº»{Y)Éñ@^™ÑÕõ ´ô*ý;îÆt:}iéUÛ—ä ¯Ì8uêªVkö­Vx—€)Wf]Dhà;1 òÌeW×ýC÷»0£©Ic|)+4tËæÍÿD÷Œ7†Çsœß–c œAfH$B“//÷ñã‡ó+ËÀXœ@^N ¯'W€È+À äàò py8¼œ@^N ¯'W€È+À äàò py8¼œ@^N ¯'W€È+À äàò py8¼œ@^N ¯'W€È+À äàò py8¼œ@^VHÊÎÎfûpm„ÃCÎlWa 111¶Œ Ÿ_ð·¿ýÍö“‚‘››kãYÈëÌ™3m?) gΜ±ñŒ°~8¼œ@^N ¯'W€;ý<Ξžžƒ–••i4¡PøÌ3ϼñÆžžž¡ððð½{÷Nž<™©¹ß¡=ÌÞ¿ÓÆ‡9ì1¯$I&%%±iÓ&ooïööö’’’•+Wfff:;ÿ!Þ„t%%%Tcþüù;wî @¹¹¹±Zìq=pâĉ[·nýãÿxâ‰'¿¿ÿ_ÿú×p8¶K¾ðððÎÎNëûÿ!„««+Õvr²öË=BU=:{Ìkiiitt´‹‹‹q§ÉéÖëõX´hÑ‚ ¶lÙÒÕÕEõ‡‡‡Ÿ>}:66vîܹÿùϾýöÛ˜˜˜yóæíÙ³‡PZZjÜ诮®nݺuQQQ‘‘‘¯¿þ:õ®xrr2}9çÚµk ,èíí5WýŦÚÔOçèèh“÷“$ùÕW_-]º4**jãÆÖ‘õœ¢¸¸811Q¯×#„öìÙóñÇ›«ÖØc^ëêêüýý-ÉÎÎ>}úô¦M›vïÞ}çÎ;vÐ:uêÀÉÉÉ_}õUiié_|‘”””››ÛÒÒ‚Ú°aCpp°q£¿?þX"‘ìÛ·ïðáñ±±[·nÕétááágÏž¥œ>}úÅ_ÌÏÏ7Wƒ‰²²2„PQQј1cÌõ;v,55uïÞ½}}}Ÿ~ú©•Gd½§˜?>ŸÏÏÎÎþùçŸËÊÊÖ®]k®Z{`yíéé1>SáÝ»wî<~üø²eËžxâ ‰D²zõêÿþ÷¿===ÔC‹-=zôŒ3BK–,¡ÛÔÓÉK/½äíímÜèï_ÿúך5kÆ' Ÿzê)­VÛÝÝý /üòË/mmm$Iž9s&""ÂB ÃpäÈ‘×_=((H,¯[·îܹs½½½ÖÑ#NAÄû￟––öî»ïº»»ûlÀ_oyxx466N:•Ú,))éí퉉1sûöm±XLµ©†Z­?~ù¤…†¡µµuË–-[¶l¡{Ôj55û£‘å)¼½½Ÿ{î¹êêêéÓ§¯x›±Ç¼>ÿüóGŽyùå—©+ŸÏÿé§ŸLÆxyyݺu‹úNýXôðð`ª€Õ«W­X±"00$É—_~™êŸ9sæ×_}ãÆY³fa¡’$BjµÚúI=<<Þyç矞úïÝÝÝÔ«%™›B©T^ºtI$,\¸ÙI™eë„„„öööõë×+•ÊööösçÎa¡>ŸþüùžžžÌÌLã©©ôGõGFF8p@©T677òÉ'k×®Ê9³Ê€ShµÚmÛ¶ýå/ùàƒÒÓÓ[[[-WË.{Ì«@ صk—»»ûûï¿üøñ7šŒYºtéŒ3RSSßyç¡P˜””dåηnÝZ]]mÜ@­]»vþC¿üòË»ï¾[XX¸páÂ;wΞ=ûÙgŸýðÃBnnnO?ý´§§'õrÐ\ «V­:pàÀÒ¥KŸ|òIzÞ§žzjùòåýC@÷ÇÅÅ…††¦¦¦¾ùæ›·oßþøã‡zÞ5à_|ñ…¯¯¯L&óóó[°`Á?ÿùO ղޠ~rÙFNNÎâÅ‹©—Ÿ˜JIIyâ‰'âããÙ.Ä.lܸÑËËË–wmÛãúÕ>õööªT*…B±jÕ*¶kùÍ?ü0à–W_}uùò嶯Ç ¯Öª¨¨Ø¾}{BBÂØ±cÙ®å7!!!Xÿ°È«µd2™L&c»Š?:{|½€9W€È+À äà„…×[¶ÿ¥u0BÔjµ———-gd!¯›6m²ý¤`„Ùr:›^ßàÁúàò py8¼œ@^Nþâ»¶DºfIEND®B`‚glom-1.22.4/docs/libglom_reference/html/hierarchy.html0000644000175000017500000007210612234777147024213 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Hierarchy
        Class Hierarchy

        Go to the graphical class hierarchy

        This inheritance list is sorted roughly, but not completely, alphabetically:
        [detail level 12345]
        oCGlom::AppStateThere is one instance per document
        oCGlom::FieldTypes
        oCGlom::FoundSetA grouping of information about a view of a table, including what records are viewed (the where clause), how the are sorted (the sort clause)
        oCGlom::HasTitleSingularHasTitleSingular instances may have a (translated) singular form of their title
        |oCGlom::Relationship
        |\CGlom::TableInfo
        oCGlom::NumericFormat
        oCGlom::predicate_FieldHasName< T_Element >A predicate for use with std::find_if() to find a Field or LayoutItem which refers to the same field, looking at just the name
        oCGlom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element >A predicate for use with std::find_if() to find a LayoutItem_Field which refers to the same field, without comparing irrelevant stuff such as formatting
        oCGlom::Privileges
        oCGlom::ReportBuilder
        oCGlom::sharedptr< T_obj >A ref-counting smart-pointer for the underlying C++ object
        oCGlom::SystemPrefs
        oCGlom::TranslatableItemTranslatableItem have a map of translation strings - one string for each locale
        |oCGlom::ChoiceValueA value of a custom choice, for a field or a layout item
        |oCGlom::CustomTitle
        |oCGlom::DatabaseTitleThis is a separate class, instead of just deriving Document from TranslatableItem, to avoid the need to use Document via sharedptr
        |oCGlom::Field
        |oCGlom::GroupInfo
        |oCGlom::LayoutItem
        ||oCGlom::LayoutGroup
        |||oCGlom::LayoutItem_Footer
        |||oCGlom::LayoutItem_GroupByThe child items are fields to be shown for each record in the group
        |||oCGlom::LayoutItem_Header
        |||oCGlom::LayoutItem_NotebookThe child items are LayoutGroups, each of which will be shown on its own tab
        |||oCGlom::LayoutItem_PortalGet_title() returns either the title of the Field or the CustomTitle
        ||||\CGlom::LayoutItem_CalendarPortal
        |||oCGlom::LayoutItem_Summary
        |||\CGlom::LayoutItem_VerticalGroupThe child items are arranged vertically in a row on a report
        ||oCGlom::LayoutItem_Image
        ||oCGlom::LayoutItem_LineThis is only used on print layouts
        ||oCGlom::LayoutItem_Placeholder
        ||\CGlom::LayoutItem_WithFormattingA base class for all layout items that may have formatting options
        || oCGlom::LayoutItem_Button
        || oCGlom::LayoutItem_FieldA LayoutItem that shows the data from a table field
        || |\CGlom::LayoutItem_FieldSummary
        || \CGlom::LayoutItem_Text
        |oCGlom::PrintLayout
        |oCGlom::Relationship
        |oCGlom::Report
        |\CGlom::TableInfo
        oCGlom::UsesRelationship
        |oCGlom::FormattingThis specifies how to display data for fields or static text items
        |oCGlom::LayoutItem_FieldA LayoutItem that shows the data from a table field
        |\CGlom::LayoutItem_PortalGet_title() returns either the title of the Field or the CustomTitle
        oCGlomBakery::DocumentThe Document is like the 'Model' in the Model-View-Controller framework
        |\CGlomBakery::Document_XML
        | \CGlom::Document
        oCGlom::sharedptr< const Glom::Field >
        oCGlom::sharedptr< const Glom::Relationship >
        oCGlom::sharedptr< const T_ElementField >
        oCGlom::sharedptr< Glom::CustomTitle >
        oCGlom::sharedptr< Glom::DatabaseTitle >
        oCGlom::sharedptr< Glom::Field >
        oCGlom::sharedptr< Glom::LayoutGroup >
        oCGlom::sharedptr< Glom::LayoutItem_Field >
        oCGlom::sharedptr< Glom::Relationship >
        oCGlom::sharedptr< Glom::TableInfo >
        oCGlom::sharedptr< Glom::TranslatableItem >
        oCGlom::sharedptr< Glom::UsesRelationship >
        \Csigc::trackable [external]
         \CGlomBakery::ViewBaseThis is a base class for View
          \CGlomBakery::View< T_Document >This is a base class which should be multiple-inherited with gtkmm widgets
           \CGlomBakery::View_Composite< T_Document >This View delegates to sub-views
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1CustomTitle__coll__graph.png0000644000175000017500000000656512234777145031332 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“ *IDATxœí}LSWÇÏ¥` k ,Ò†¼ åa›yfˆà v™Á—ޱB‚s:3G48$¼ 2q¸‘ef˜£‹„W^ ÝÔGc ™y¨#Û,©EÆKPË‹6*”ûüq¶»û(pié³óIÿøs÷w~÷|ï=ç¾´½I’ƒ NŽN³ª`½ÑëXo´Àz#IC.—;:ŒIHH Kì<׫þ¡¤¤Ä¢f½“’’V%ŒÝ©¯¯·¨Áó7Z`½ÑëXo´Àz£C½''';æççÇf³ýüüöïß?88¡V«m—! æÃ†M¬0AcccËŠió.Z:ó\-Êììì®]»‚hhh :þ|TTTOO›Í¶yŠF£<O¥RmÚ´ àááaó†P€‰Þ.\¸wïžV«]»v-ÀÇǧ´´ôäÉ“ÎÎL¢- —Ë¥l‡C/®AŒŽŽz{{ÿMã[Àd<¯©©IOO‡bSp¹\‹Egffòóóýüü¼½½SRR ¬'â›o¾‰D¹¹¹/^žžž™™™”Cuu5ÝX‚ ®]»æïïäÈ‘×^{Ï绹¹…‡‡×ÕÕQJ¥R$ñùüsçÎÁÊÎÎÎÈÈHww÷€€€ŠŠ *ZWW×Ü A|||ÆÆÆæu€455p¹Ü„„„‘‘ªž$Éâââõë×óùüÄÄDªè›@Å_ÈyÑ[s‹ÁãñZ[[Z ûô“O> ºqã†F£yõÕWããã©¥‰dll¬¡¡°sçNʾwïI’UUU:ŽnXD¦£¢¢®_¿îïïÿî»ïöööWTT°Ùì'Ož@‡ØØØßÿ½±±ÑÙÙùñãÇ$IfggëõúÆÆF''§ááa644t¡ £££$IZqxùå—oß¾}çÎ-[¶ìܹ“JõóÏ?þñǵZ­D"¡neÓ7„ŠoÅÙzY!!!Áâþ9½;::èý1ÔÆ„„„TVVB‡îînÀÄÄ\ªR©H’4›Í6]Ëy™«w}}=I’ããã333°R£ÑP=hnn¦âÃJ>Ÿ_RRFãÌÌ k%4¬8À­ IòÖ­[€À˜aaa555pÑàà ‹Åzôè¹€ÞVœ÷Ø\½™Œç §§‡.3urNÑßßmh À"‡Ã899YØ ð÷÷ŒçççÇÄÄ‚ƒÒ„B¡Eü²²²âââçž{î­·Þúå—_¨9ÈJE‚ƒƒ¡±aÀ^¯‡ÅÞÞÞÔÔTxA! Íf3Õ s±âlÃc²Z\\\YYÜÅ\.÷æÍ›>"‘H§ÓA€YŠV€›£ÓéN:uÿþýï¿ÿžî'H:;vìèë뫯¯÷õõݶmµ§Z ²¨ƒV«…†F£!ÂÏÏB¡€Öìì¬Ñh|þùçÚ–e93†‰Þz½^"‘¨Õj½^ßÔÔTXXhá³wïÞ>ú¨³³³§§çðáÉd‰çÕÕÕÕ½½½tcQ¦§§#""BBB~ýõ×´´4ðçˆ:/›6mÊÉÉñ÷÷ß¼y3I’®®®‹„VrrrîܹÓÝÝ}èСÄÄDêZ1---??_­VkµÚƒŠÅâyS‚ñ—è¼Rèƒûço’$ûí·””çîî.‘HàLŸ¿Ÿ>}š- ù|~rr2œ¢æN]sm@UUÝ sæoXlmm `³ÙQQQ—.]ŠÝ°aÃÜø0‡«W¯†‡‡»ºº]¼x‘r[(HLLŒ«««Á`°ÒJMMP(äñx©©©““#‰8Nll,uzEOŒŠ¿ç…ì…˜;$í„«®®nÏž=ôÌßšÄÄDð¿OÁñýs´Àz£Ö-°ÞhõF ¬7Z ª·^?îèëBz“$YW×9=m¦Wöõ~þÙòË–ÿ`ÒûöíþÁA£E¥‹‹ss3Bgéé­PÜ¢æéé™úúNtn:¡¢·Ù<ÛØ¨¶Ì!££SjõýUÏÈ1 ¢÷:ƒáѼ‹\\XèÜxAEïo¿í€X³Æ~\\X”m6“­­?Á‹òØMOžüöÍ7ÿö×O^ÆÇM^^G¤¶ª ø| -/ß·Éщ¬6¨ŒçÖ-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-þŸ|Qáß—ÁA>ÿ±›Û´£aÎûܵêMDXX˜ƒu1+çÚµkr¹<))i¹+2ÿ¦ÄÄÄmÛ¶1^³¿-ÏßhõF ¬7Z`½ÑëöýÿT“ÉTYY©R©ŒF#ÇÛ¼yóÛo¿ííí ‹Åååå¡¡¡6l®¯¯ï‹/¾èêêrwwߺuë¡C‡ÜÝÝmQæ=m.--MOOW(Ï<󌅳Í{`Qì¨7I’ÙÙÙAúúú ¥R™žž^]]íâbûwNMMeddìÞ½ûرcF£ñÌ™3gÏžÍÍ͵yCVP*•Ðxýõ×KJJ‚ƒƒnnnyyy«¼ç-„Çó+W® }úé§7när¹AAA2™ŒÅ²|É€M¨««[¿~ý¼½½CBB²²²ÚÛÛM&ÓÒ#ˆÅ≉‰•äÀù€››´Y,ÖöíÛá.¾ò&Vˆõnkk‹wuu¥Wr8'§¿5›Í2™,))é7Þ(**šœœ„õb±¸½½=11q×®]_}õÕ?ü°{÷î²²2Ê¡­­ntttl߾ШÜÜ [§÷2eß½{7==}ÇŽÉÉÉß}÷Šããã'&&gµ°QzÔ"’$kkk¥Ri\\ÜñãÇ©¶ì„õÖjµAAAÖ}äry{{{aaaiiéƒN:E-ºzõªL&ËÉÉ©­­mkkûú믳³³ëëëõz= ///<<œn ­[·ŽÜbß²àĉ/½ôRmmmzzúéÓ§›ššp–eœ•uT*ÕU©P(.]ºTPPP^^þôéÓ3gÎ,g%Øqþ6™Lô £Îe”J%ñ—/_Þ»wïÆGŽÙ·oŸÉd‚S]RR’§§gtt4 99™²'''}}}©C™2–û àáÇ|>ŸÏçGGG·¶¶ÒçWÆY-»hiiÙ·o_XX 333))éÉ“'l6›A¨¥`ÇãÛËË«¿¿Ÿ**•ʆ† Ÿ‘‘à— @ctô<º¹¹‚°°bݺuÃÃÃôš‡ÎÎ.ø–Š£GÖÖÖîÙ³§¸¸¸¯¯>Ø0«E.**‹Åb±8!!avv–jËØQï­[·¶´´P=Îáp4…ÏÐдáèååŬ¹-[¶\¹r…*Þ¿?..Ž:_ƒG?½+#""äryaa¡——WFFÆØØ˜=²Z//¯¢¢"•J¥R©ÚÛÛ•J¥H$²S[À®z§¥¥ †ÜÜ\Fc0®_¿^YYiáUu÷îݳgÏFFFRC½uÚÚÚ ”!•Ju:]yyùÈÈHoooIIÉ+¯¼£q8œŽŽ“ÉT]]ME8pàÀùóçŸ}öÙÐÐP’$׬Y˜ššZIVK6Aï™L¦ÑhOŸ>}ôèQ[54/vÔ›Ëåž;wÎÃÃ#+++55õòåËÇ·ð‘J¥ÑÑÑï½÷ÇËÎÎ^bð?þ¸»»›np¹ÜÏ>ûL«Õ¦¥¥eff …¬¬,è|øða™L&•J_xá*BVVÖÍ›7¥Ré—_~™——çééùâ‹/îß¿jjŠqV‹B5AÕ¤¤¤DFF¼óÎ;###'Nœ°U[óÂüû~ø!~þí(Äb1³ï;àûçhõF ¬7Z`½ÑëXo´Àz£Ö1HF8:k Ëå „cøác’"ŠIˆ:™‰‰)Ó©™“™Sg+¥™z~¾÷wÝf_›sóÛ½¯¿Î=÷Üs?û¼wÏ9;ïË0! ¡ f¦€Æ¨ÐzS ZojÁ Èd²®®.S…B³ðx¼àààÿC555¦ ŒfGˆ%KÌÐnA¯Øÿâââ4jèù›ZÐzS ZojAëM-h½©­7µÐSo•JuëÖ-Çd2y<^jjêôô4:…aXoo¯á"Ô†asssÿ•n©ÓEF½×××£££{zzêëëe2Yss3‹Å Q«Õï/`w¥K{ þ%%%NNN?~ü W*•ÊÕÕU´W#‹ÿµ“íP(FîV0]±±±ûkú<ß•••VVVäJ6›mnnN®®® …B·wïÞÄÄÄùùyTaXuu5Žã666ÙÙÙUUU\.×ÖÖöæÍ›DƒŠŠ rA,[ZZººº£fõõõNNNöööOŸ>ô÷÷GFFr8 __ßÚÚZ¢·÷ïßóùü’’’‚‚777‡‡âQ«Õׯ_wtttppxöì<†a nnnl6;>>~~~Ã0€ƒƒð‰n_¾|©‘…BaÌtý1dñ·ø|ÛÙÙ555mv)”ŸŸïîî.‰$ɱcÇbbbˆ³`nn®¾¾pòäI¢<66!,//'öïߟ™™)—Ë_¿~mff6338{öìÂÂBMM ƒÁøùó§··÷•+W&&&fffŠ‹‹™L¦Z­F· éèèxøð¡‡‡Gww·T*è[/ ù|~GG‡D" ÿ<Á‘H444zæÌ¸ñù&º]^^&>xGGGBB‚1Óõ{´Ÿo}ôf0äˆJ¥’øžžž¥¥¥¨Áàà àÛ·oèl{{;„pmmM£¼Ù°Æápžh´Áq|||•QËåêâ‰'&''ëêêöíÛ’…&T‚°°°ñññG}þü¹­­| e‡Ëå¾yó}Ç××וJ¥——Žã„R©”|ÕØØ*ŒŽŽê u‹ãx```[[[KK‹R©Ô¿‘Óõ{ôÑûîÝ»r¹\ ôööÊåò†††{÷îi´¹xñâƒÄbñÈÈȵk×›ÍÞJçä‚¿¿VVŸÏ€²X,í«~ýúèéé9<<œ’’XXX 7HII …½½½R©4--íèÑ£€äääû÷ïwvvŽŽŽj¬€rrrÄbñððpFF¼¶¢lnnnmmžžöóóKMMíëë3fºþòà¾ÅùBøåË—ÄÄD;;;KKK@€¾’ä iee%33ÓÙÙ™Ãáœ?ž<óÎ2 ¼¼œ\xûö­¯¯/‹Årww¯ªª‚ZK'…BÑÔÔäêêÊd2CBBZZZ¢¢¢Ðº‰èvee%++ Çqkk먨(´ØQ«Õ7nÜ@ëó²²2@š¿óóó=<|xdd¤¥¥¥¿¿?##Ãø1 ííí¨P^^ncccä`v‚]¤÷ãÇýüürss9RTTT]]­R©¶ÞÃö_PaÿÀÚÚ• Æ… ˜L¦AnaZL¦·¶ÏÝØØ˜””D48tèÐìì,²ÉY&ʾ8Ù¢6¸Œnªá‚# „ÚÎ:2î¶›,BÞlÛú~êöÑö¹-,,Þ½{§³1ÐÚ@…›øâèÔöíd°qöZ56;Ÿ?®í¬´¶¶º¸¸äää|ýúÕYûC ãï,ëôÖé‹£SÛ·“·®·NgÜÕäädvv6ŽãÉÉÉ===ú¦G ãï®®®È#X\\$lDmtúâ£ÙÉ`gÜ€ÏççååI¥Òãǧ§§nçvÛdé}êÔ©ÒÒRâðÓ§OöööÄO2!ØøÞN_a4;lâ¬k7“H$]]]*•*22r‡"Ù &Ó[Ûç¾sçÎÀÀÀíÛ·§¦¦¯^½ƒ–Êl6»±±Q¥Råææ=èôÅÑO©µ“5\pÎ:Z­®¨¨ MMM ÊËË3T$ú@Ü9-ŸBˆ^3µ°°ptt¼|ù22›!„eeeŽŽŽöööh%fPm_œ°¨·o'ƒMæom\§³NÐÐИ˜ØÝÝmØìmÚÿ¦´ÿMuh½©­7µ õ¦´ÞÔ‚Ö›ZÐzS ï§jÿIÍ‘HD®Ùð|óx¼ØØXã†D³ƒmøóT0z7RÐó7µ õ¦´ÞÔâä£äÊ„àIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1ReportBuilder.html0000644000175000017500000003172112234777147027322 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::ReportBuilder Class Reference

        Public Member Functions

         ReportBuilder (const Glib::ustring& locale)
         
        virtual ~ReportBuilder ()
         
        void set_document (Document* document)
         
        Glib::ustring report_build (const FoundSet& found_set, const sharedptr< const Report >& report)
         
        std::string report_build_and_save (const FoundSet& found_set, const sharedptr< const Report >& report)
         

        Static Public Member Functions

        static sharedptr< Reportcreate_standard_list_report (const Document* document, const Glib::ustring& table_name)
         

        Constructor & Destructor Documentation

        Glom::ReportBuilder::ReportBuilder ( const Glib::ustring locale)
        explicit
        virtual Glom::ReportBuilder::~ReportBuilder ( )
        virtual

        Member Function Documentation

        static sharedptr<Report> Glom::ReportBuilder::create_standard_list_report ( const Document document,
        const Glib::ustring table_name 
        )
        static
        Glib::ustring Glom::ReportBuilder::report_build ( const FoundSet found_set,
        const sharedptr< const Report >&  report 
        )
        Returns
        The HTML of the generated report.
        std::string Glom::ReportBuilder::report_build_and_save ( const FoundSet found_set,
        const sharedptr< const Report >&  report 
        )
        Returns
        The filepath of a temporary file containing the generated HTML file.
        void Glom::ReportBuilder::set_document ( Document document)

        The documentation for this class was generated from the following file:
        • libglom/report_builder.h
        glom-1.22.4/docs/libglom_reference/html/functions_func_0x6e.html0000644000175000017500000001065712234777147026125 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - n -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Image.html0000644000175000017500000014606012234777147030100 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Image Class Reference
        Glom::LayoutItem_Image Class Reference
        Inheritance diagram for Glom::LayoutItem_Image:
        Collaboration diagram for Glom::LayoutItem_Image:

        Public Member Functions

         LayoutItem_Image ()
         
         LayoutItem_Image (const LayoutItem_Image& src)
         
        LayoutItem_Imageoperator= (const LayoutItem_Image& src)
         
        virtual ~LayoutItem_Image ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        bool operator== (const LayoutItem_Image& src) const
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        Gnome::Gda::Value get_image () const
         Get the image that will be shown on each record. More...
         
        void set_image (const Gnome::Gda::Value& image)
         Set the image that will be shown on each record. More...
         
        Glib::ustring create_local_image_uri () const
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Public Attributes

        Gnome::Gda::Value m_image
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::LayoutItem_Image::LayoutItem_Image ( )
        Glom::LayoutItem_Image::LayoutItem_Image ( const LayoutItem_Image src)
        virtual Glom::LayoutItem_Image::~LayoutItem_Image ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Image::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Implements Glom::LayoutItem.

        Glib::ustring Glom::LayoutItem_Image::create_local_image_uri ( ) const
        Gnome::Gda::Value Glom::LayoutItem_Image::get_image ( ) const

        Get the image that will be shown on each record.

        virtual Glib::ustring Glom::LayoutItem_Image::get_part_type_name ( ) const
        virtual

        Implements Glom::LayoutItem.

        virtual Glib::ustring Glom::LayoutItem_Image::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutItem.

        LayoutItem_Image& Glom::LayoutItem_Image::operator= ( const LayoutItem_Image src)
        bool Glom::LayoutItem_Image::operator== ( const LayoutItem_Image src) const
        void Glom::LayoutItem_Image::set_image ( const Gnome::Gda::Value &  image)

        Set the image that will be shown on each record.

        Member Data Documentation

        Gnome::Gda::Value Glom::LayoutItem_Image::m_image

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_image.h
        glom-1.22.4/docs/libglom_reference/html/functions_func_0x73.html0000644000175000017500000005671512234777147026051 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - s -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Report__coll__graph.png0000644000175000017500000000637112234777145030324 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“ ®IDATxœíLSWÇÏmi lii‘QœÂØb3“ed]¶tbÃXÖVÁç4†ÅH4nØêf4“,B?T~h¡Æ¹àè1˜—ÎIdl%dÊ(µXµ³@¹ïÇÝÝ(ˆÐvžó‰<÷ÜÇçyîùÒsî=·½— I`áí0ëXo´Àz£Ö1HçÎóv9˜%F.—Ó%ö›éUj(..vi™Eo¥Ré‘b0ËN}}½K ž¿ÑëXo´Àz£Ö-©·ÍfûøãE"‹Å‰D;wî‚»‚ÐétKW! fc SyòdRRRoo/‹ÅZò­V+4¸\®V«]·n $$dÉ¡Àbô>}úô­[· Ê+%%%‡öó[L´yáp8”Íf³é›€ ³ÙþïÂbÆóššš={ö@±)8“ɤ6§¦¦òóóE"QxxxFF†ÅbíAœ={V(†„„ýòË/Åbñµk×ôzý›o¾™––Fí•Édccc €M›6Qö­[·H’¬ªªêëë£.‘é›IIIíííQQQYYYýýý###ååå,Ëáp@©TúçŸ666úùù=|ø$ɘ˜˜œœ“ÉÔØØÈ`0FFF`Ø5kÖÌÄl6“$éÆáå—_îêêºy󿫝¾ºiÓ&ªÔo¾ù&66¶££Ã`0Èd2j)›~ T|7Îî{Ì r¹Üeý|1zûùù]½z•Þï«ÕJÌêÕ«+++¡Cww7àîÝ»p¯V«%IÒétºØt-ge¦Þõõõ$IŽOMMÁF½^Oõ àÂ… T|ØÈãñŠ‹‹¡³Õjšš‚a݆x$I^¿~pçÎ3>>¾¦¦îb2™< çÐÛó¢{l¦Þ‹ÏAoo/]fêäœbppP,CF£n²ÙlƒÁp±ATT`||hCC ,®D7ÀÃNNNîëë;vìØíÛ·øáºœ é¼óÎ;õõõ|>ÿ7Þ þRÝ™×Á`0@C¯×!‰à¦@ P«Õðƒ5==mµZŸþù¹Žå±œÍbô.((0™L2™L§Ó™L¦óçϹølß¾ýóÏ?ïìììííÝ»w¯L&[àyuuuu?ݘ—ÉÉÉ 6¬^½ú·ß~ËĮ̀³²nݺÜÜܨ¨¨ÄÄD’$ç /Ý8äææÞ¼y³»»û£>R(Ôµbfff~~¾N§3 »wï–H$³–ã/ÐùI¡î œ¿I’üã?222¸\npp°L&ƒŸ`úü=11‘““Éãñ¶nÝ §¨™S×LPUUE7(ÀŒùn677GGG³X¬¤¤¤K—.I¥Òµk×ÎŒk¸råJBBB`` X,>sæ å6WäääÀÀ@‹Åâ&KMMMdd$—Ëݶm›K'äææ …B6›-•J©Ó+zaTü…8ÏeÏÅÌù› i'\uuu[¶l¡·`þÓ( ðï»àxý-°ÞhõF ¬7Z`½Ñëˆêm2{»ï0Ëkú¾§•òr}zzÌŠþÞ.dy1B¡ð_MôÅD~YÂ`òùÙÁÁ/x»Oàn} NŸ¾š—×°aCŒZ½×Ûµxçï ttºþÑÑ{Þ®ÅÓ §÷ààn€$ƒA¨Õ×½]ާANoæ“É8Ó Þ.ÇÓ §w]]§Ó9 IÐÝ=Ô×gövE-½õú‘ÞÞêÕߟÙÔô‹wKò0héÝÜü‹¿ÿ?_šžœtÖÕýÏ‹õx„ô&I²®®srÒIo°üú«ë—-ŸbÒ»«kphÈêÒèïïwáBgéé­V_§æÉÉ©úúNtPÑÛéœnlÔ¹ æ³ùžNwÛãyTô¾v­Ïby0ë.&: /¨è}ñâ ˆ€?øÏߟIÙN'ÙÜü ¼(êY–_ðú ‘Ÿ~º™Ú<|øâ{ï­ÿç'/ããö°0¶7Jó((ÞûËʶ§¦®óv!ž•ñÁz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£…'žçqüøñŽŽŽåÎòX …ðxƒ‚&½]È¿ ¿øq™ðÄóz:::ÚÚÚâãã=k˜ïß÷ï{»Ž¿1›Í===Hä¡ç3ÅÇÇz&בŸ~úiæ;µ—<£Ö-°ÞhõF ¬7ZøÖóSív{ee¥V«µZ­\.711ñÃ? H$’²²²5kÖ,U.‰DBÙ±±±ÙÙÙKß7ñ!½I’ÌÉÉ!¢¨¨ˆÏç[,F³gÏžêêjÿeyÑgqqqll,Àn·×ÔÔ:t¨¶¶–Ét}&þÓ„ç—/_>zôh\\‡Ã‹Åûöí«¨¨X>‚‚‚Øl6›Í~æ™gvíÚ5::j2™–6…D"¹{÷îÒÆ||Hï–––´´´ÀÀ@z#›Íf0þ)ÒétVTT(•Êwß}W¥RÙl6Ø.‘HZ[[ EJJÊ©S§~üñG¹\¾yóæÒÒRÊ¡¥¥…n¸³0™L’$kkkÓÓÓSSS é)ÚÛÛÓÓÓe2YQQ‘ÍfsSLWW×–-[à”‘––æ;’ûÞƒA,»÷9wî\kkkQQQIIÉ;wŽ;FíºråJEEEnnnmmmKKË·ß~›““S__?²yyy tƒŽÝn¯®®Ž‹‹ãóùjµúÒ¥KeeeǧÜÊËË:TRR266vôèQ7Åœ:u*??ÿòå˵ZúÄݳ4øÐüm·ÛéýBOi46ûÑ“è¿ÿþûíÛ·ÇÅŲ³³wìØa·ÛƒƒƒJ¥råÊ•¯¿þ:`ëÖ­”m³Ùø|þÛo¿ #P ++‹² Fqq1 ©©iÇŽpµÿÀJ¥Òáp°X,@FFL½oß¾]»võôôdeeÍZŒB¡xñÅ—©£žÒ;,,lppð…½–[£Ñ8¹\N÷½”f³yÕªU€   A.¶¨óµ©©©‹/œ={vddD¥R©T*ÊÍl6÷¦S©E"ÀjµÎU̳Ï>û=±ŒøÐxþÚk¯555MO?z›ÍÖëõ.>ÃÃÃІuXXØ¢3RçkG©TÚl6£Ñ¦R©´Z­V«mmmÕh4Pl•Úh4BCCç*fÞ?5oáCzgffZ,–ƒêõz‹ÅÒÞÞ^YYéâ#•J«ªª~ÿýw£Ñøõ×_oܸ‘êÝÓÒÒ%¡ ‚¸wïžT*­¨¨ÐëõCCC_}õÕþýû)˜z``¦~ÿý÷R̽{>ô–qÏ9Ή'Nž<ùÉ'ŸLLL¬_¿¾°°0##ƒî“žžþ×_8ŽW^y%;;{Á¿øâ‹¼¼<>ŸO3}BCC¿ûî»ÂÂB‡ÃQPPpÿþý„„„Ï>ûŒrHIIQ©TV«511qÿþýl6{Þb^zé¥;w644„„„4žc<€ç>ŽV«õv Kþ|£Ö-°ÞhõF ¬7Z`½ÑÂC×cmmmôïa¼…'Ö×:::—;ËS€R©\ÿYðüXo´Àz£Ö-þ@$ > ¢F~IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1Document__XML.html0000644000175000017500000017470612234777147030346 0ustar00murraycmurrayc00000000000000 libglom-1.22: GlomBakery::Document_XML Class Reference
        Inheritance diagram for GlomBakery::Document_XML:
        Collaboration diagram for GlomBakery::Document_XML:

        Public Member Functions

         Document_XML ()
         
        virtual ~Document_XML ()
         
        virtual bool load_after (int& failure_code)
         Allow app to update icons/title bar. More...
         
        virtual bool save_before ()
         overrideable. More...
         
        void set_dtd_name (const std::string& strVal)
         
        std::string get_dtd_name () const
         
        void set_dtd_root_node_name (const Glib::ustring& strVal, const Glib::ustring& xmlns=Glib::ustring())
         Set the root node name and (optionally) the xmlns ID to be written when writing the document. More...
         
        Glib::ustring get_dtd_root_node_name () const
         
        Glib::ustring get_xml () const
         
        - Public Member Functions inherited from GlomBakery::Document
         Document ()
         
        virtual ~Document ()
         
        bool save ()
         
        bool load (int& failure_code)
         
        bool load_from_data (const guchar* data, std::size_t length, int& failure_code)
         
        bool get_modified () const
         
        virtual void set_modified (bool bVal=true)
         
        bool get_is_new () const
         Whether this just a default document. More...
         
        void set_is_new (bool bVal)
         Called by AppWindow_WithDoc::init_create_document(). More...
         
        Glib::ustring get_contents () const
         
        Glib::ustring get_file_uri_with_extension (const Glib::ustring& uri)
         
        Glib::ustring get_file_uri () const
         
        virtual void set_file_uri (const Glib::ustring& file_uri, bool bEnforceFileExtension=false)
         
        virtual Glib::ustring get_name () const
         Gets filename part of file_uri, or 'untitled'. More...
         
        bool get_read_only () const
         
        void set_read_only (bool bVal)
         
        void set_view (ViewBase* pView)
         If you don't want to use a View, then don't use set_view(). More...
         
        ViewBaseget_view ()
         
        void set_file_extension (const Glib::ustring& strVal)
         
        Glib::ustring get_file_extension () const
         
        type_signal_modifiedsignal_modified ()
         This signal is emitted when the document has been modified. More...
         
        type_signal_forgetsignal_forget ()
         This signal is emitted when the view should forget the document. More...
         

        Protected Types

        typedef GlomBakery::Document type_base
         

        Protected Member Functions

        const xmlpp::Element* get_node_document () const
         
        xmlpp::Element* get_node_document ()
         
        void Util_DOM_Write (Glib::ustring& refstrXML) const
         
        void add_indenting_white_space_to_node (xmlpp::Node* node=0, const Glib::ustring& start_indent=Glib::ustring())
         Put each node on its own line and add white space for indenting, even if there are child text nodes. More...
         
        - Protected Member Functions inherited from GlomBakery::Document
        bool read_from_disk (int& failure_code)
         
        bool write_to_disk ()
         

        Protected Attributes

        xmlpp::DomParser m_DOM_Parser
         
        xmlpp::Document* m_pDOM_Document
         
        std::string m_strDTD_Name
         
        Glib::ustring m_strRootNodeName
         
        Glib::ustring m_root_xmlns
         
        bool m_write_formatted
         
        - Protected Attributes inherited from GlomBakery::Document
        Glib::ustring m_strContents
         
        Glib::ustring m_file_uri
         
        Glib::ustring m_file_extension
         
        ViewBasem_pView
         
        type_signal_modified signal_modified_
         
        type_signal_forget signal_forget_
         
        bool m_bModified
         
        bool m_bIsNew
         
        bool m_bReadOnly
         

        Additional Inherited Members

        - Public Types inherited from GlomBakery::Document
        enum  LoadFailureCodes {
          LOAD_FAILURE_CODE_NONE = 0,
          LOAD_FAILURE_CODE_NOT_FOUND = 1,
          LOAD_FAILURE_CODE_LAST = 20
        }
         
        typedef sigc::signal< void, bool > type_signal_modified
         For instance, void on_document_modified(bool modified);. More...
         
        typedef sigc::signal< void > type_signal_forget
         
        - Static Public Member Functions inherited from GlomBakery::Document
        static Glib::ustring util_file_uri_get_name (const Glib::ustring& file_uri, const Glib::ustring& file_extension)
         

        Member Typedef Documentation

        Constructor & Destructor Documentation

        GlomBakery::Document_XML::Document_XML ( )
        virtual GlomBakery::Document_XML::~Document_XML ( )
        virtual

        Member Function Documentation

        void GlomBakery::Document_XML::add_indenting_white_space_to_node ( xmlpp::Node *  node = 0,
        const Glib::ustring start_indent = Glib::ustring() 
        )
        protected

        Put each node on its own line and add white space for indenting, even if there are child text nodes.

        set_write_formatted() does not cause nodes to be indented if there are child text nodes, because it assumes that the white space is then significant.

        std::string GlomBakery::Document_XML::get_dtd_name ( ) const
        Glib::ustring GlomBakery::Document_XML::get_dtd_root_node_name ( ) const
        const xmlpp::Element* GlomBakery::Document_XML::get_node_document ( ) const
        protected
        xmlpp::Element* GlomBakery::Document_XML::get_node_document ( )
        protected
        Glib::ustring GlomBakery::Document_XML::get_xml ( ) const
        virtual bool GlomBakery::Document_XML::load_after ( int &  failure_code)
        virtual

        Allow app to update icons/title bar.

        overrideable. Does anything which should be done after the data has been loaded from disk, but before updating the View.

        Parameters
        failure_codeUsed to return a custom error code that is understood by your application. This must be greater than zero.

        Reimplemented from GlomBakery::Document.

        virtual bool GlomBakery::Document_XML::save_before ( )
        virtual

        overrideable.

        Does anything which should be done before the view has saved its data, before writing to disk..

        Reimplemented from GlomBakery::Document.

        void GlomBakery::Document_XML::set_dtd_name ( const std::string strVal)
        void GlomBakery::Document_XML::set_dtd_root_node_name ( const Glib::ustring strVal,
        const Glib::ustring xmlns = Glib::ustring() 
        )

        Set the root node name and (optionally) the xmlns ID to be written when writing the document.

        The root node name is also used when reading documents.

        void GlomBakery::Document_XML::Util_DOM_Write ( Glib::ustring refstrXML) const
        protected

        Member Data Documentation

        xmlpp::DomParser GlomBakery::Document_XML::m_DOM_Parser
        protected
        xmlpp::Document* GlomBakery::Document_XML::m_pDOM_Document
        protected
        Glib::ustring GlomBakery::Document_XML::m_root_xmlns
        protected
        std::string GlomBakery::Document_XML::m_strDTD_Name
        protected
        Glib::ustring GlomBakery::Document_XML::m_strRootNodeName
        protected
        bool GlomBakery::Document_XML::m_write_formatted
        protected

        The documentation for this class was generated from the following file:
        • libglom/document/bakery/document_xml.h
        glom-1.22.4/docs/libglom_reference/html/namespaceGlom_1_1Utils.html0000644000175000017500000034510612234777147026474 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::Utils Namespace Reference
        Glom::Utils Namespace Reference

        Typedefs

        typedef std::vector< sharedptr
        < LayoutItem_Field > > 
        type_vecLayoutFields
         
        typedef std::vector< sharedptr
        < const LayoutItem_Field > > 
        type_vecConstLayoutFields
         
        typedef std::vector
        < Gnome::Gda::Value > 
        type_list_values
         
        typedef std::vector< std::pair
        < Gnome::Gda::Value,
        type_list_values > > 
        type_list_values_with_second
         
        typedef std::vector
        < Glib::ustring
        type_vec_strings
         

        Functions

        Glib::ustring trim_whitespace (const Glib::ustring& text)
         
        Glib::ustring string_replace (const Glib::ustring& src, const Glib::ustring& search_for, const Glib::ustring& replace_with)
         
        Glib::ustring string_clean_for_xml (const Glib::ustring& src)
         Remove any characters that may not be in XML even when escaped. More...
         
        Gnome::Gda::SqlExpr build_simple_where_expression (const Glib::ustring& table_name, const sharedptr< const Field >& key_field, const Gnome::Gda::Value& key_value)
         
        Gnome::Gda::SqlExpr build_combined_where_expression (const Gnome::Gda::SqlExpr& a, const Gnome::Gda::SqlExpr& b, Gnome::Gda::SqlOperatorType op)
         
        void build_sql_select_add_fields_to_get (const Glib::RefPtr< Gnome::Gda::SqlBuilder >& builder, const Glib::ustring& table_name, const type_vecConstLayoutFields& fieldsToGet, const type_sort_clause& sort_clause, bool extra_join)
         Generate a SQL statement to SELECT field values, even if the fields are in related (or doubly related) records. More...
         
        Glib::RefPtr
        < Gnome::Gda::SqlBuilder > 
        build_sql_select_with_where_clause (const Glib::ustring& table_name, const type_vecLayoutFields& fieldsToGet, const Gnome::Gda::SqlExpr& where_clause=Gnome::Gda::SqlExpr(), const sharedptr< const Relationship >& extra_join=sharedptr< const Relationship >(), const type_sort_clause& sort_clause=type_sort_clause(), guint limit=0)
         Generate a SQL statement to SELECT field values, even if the fields are in related (or doubly related) records, narrowing the records down with a WHERE clause. More...
         
        Glib::RefPtr
        < Gnome::Gda::SqlBuilder > 
        build_sql_select_with_where_clause (const Glib::ustring& table_name, const type_vecConstLayoutFields& fieldsToGet, const Gnome::Gda::SqlExpr& where_clause=Gnome::Gda::SqlExpr(), const sharedptr< const Relationship >& extra_join=sharedptr< const Relationship >(), const type_sort_clause& sort_clause=type_sort_clause(), guint limit=0)
         Just a version of build_sql_select_with_where_clause() that takes a list of const fields. More...
         
        Glib::RefPtr
        < Gnome::Gda::SqlBuilder > 
        build_sql_select_with_key (const Glib::ustring& table_name, const type_vecLayoutFields& fieldsToGet, const sharedptr< const Field >& key_field, const Gnome::Gda::Value& key_value, const type_sort_clause& sort_clause=type_sort_clause(), guint limit=0)
         
        Glib::RefPtr
        < Gnome::Gda::SqlBuilder > 
        build_sql_select_with_key (const Glib::ustring& table_name, const type_vecConstLayoutFields& fieldsToGet, const sharedptr< const Field >& key_field, const Gnome::Gda::Value& key_value, const type_sort_clause& sort_clause=type_sort_clause(), guint limit=0)
         Just a version of build_sql_select_with_key() that takes a list of const fields. More...
         
        Glib::RefPtr
        < Gnome::Gda::SqlBuilder > 
        build_sql_select_count_rows (const Glib::RefPtr< const Gnome::Gda::SqlBuilder >& sql_query)
         Build a SQL query to discover how many rows a SQL query would return if it was run. More...
         
        Gnome::Gda::SqlExpr get_find_where_clause_quick (const Document* document, const Glib::ustring& table_name, const Gnome::Gda::Value& quick_search)
         
        Glib::RefPtr
        < Gnome::Gda::SqlBuilder > 
        build_sql_update_with_where_clause (const Glib::ustring& table_name, const sharedptr< const Field >& field, const Gnome::Gda::Value&value, const Gnome::Gda::SqlExpr& where_clause)
         Generate a SQL statement to UPDATE field values,. More...
         
        type_list_values_with_second get_choice_values_all (const Document* document, const sharedptr< const LayoutItem_Field >& field)
         
        type_list_values_with_second get_choice_values (const Document* document, const sharedptr< const LayoutItem_Field >& field, const Gnome::Gda::Value& foreign_key_value)
         
        std::string sqlbuilder_get_full_query (const Glib::RefPtr< const Gnome::Gda::SqlBuilder >& builder)
         Get the full query string suitable for use with std::cout. More...
         
        Glib::ustring create_name_from_title (const Glib::ustring& title)
         Guess an appropriate identifier name based on a human-readable title. More...
         
        Glib::ustring string_escape_underscores (const Glib::ustring& text)
         
        Glib::ustring locale_simplify (const Glib::ustring& locale_id)
         Get just the first part of a locale, such as de_DE, ignoring, for instance, .UTF-8 or @euro at the end. More...
         
        Glib::ustring locale_language_id (const Glib::ustring& locale_id)
         Get just the language ID part of a locale, such as de from "de_DE",. More...
         
        Glib::ustring create_local_image_uri (const Gnome::Gda::Value&value)
         
        Glib::ustring string_from_decimal (guint decimal)
         Get a decimal text representation of the number, in the current locale. More...
         
        Glib::ustring title_from_string (const Glib::ustring& text)
         Create an appropriate title for an ID string. More...
         
        type_vec_strings string_separate (const Glib::ustring& str, const Glib::ustring& separator, bool ignore_quoted_separator=false)
         
        Glib::ustring string_trim (const Glib::ustring& str, const Glib::ustring& to_remove)
         
        Glib::ustring string_remove_suffix (const Glib::ustring& str, const Glib::ustring& suffix, bool case_sensitive=true)
         
        bool file_exists (const Glib::ustring& uri)
         
        bool file_exists (const Glib::RefPtr< Gio::File >& file)
         
        bool delete_directory (const Glib::RefPtr< Gio::File >& directory)
         Delete a directory, if it exists, and its contents. More...
         
        bool delete_directory (const std::string& uri)
         Delete a directory, if it exists, and its contents. More...
         
        Glib::ustring get_directory_child_with_suffix (const Glib::ustring& uri_directory, const std::string& suffix, bool recursive)
         For instance, to find the first file in the directory with a .glom extension. More...
         
        Glib::ustring get_file_uri_without_extension (const Glib::ustring& uri)
         Get a URI with the extension (any extension, not just .glom) removed. More...
         
        std::string get_file_path_without_extension (const std::string& filepath)
         Get a filepath with the extension (any extension, not just .glom) removed. More...
         
        Glib::ustring get_list_of_layout_items_for_display (const LayoutGroup::type_list_items& list_layout_fields)
         Get a string to display to the user, as a representation of a list of layout items. More...
         
        Glib::ustring get_list_of_layout_items_for_display (const sharedptr< const LayoutGroup >& layout_group)
         Get a string to display to the user, as a representation of a list of layout items. More...
         
        Glib::ustring get_list_of_sort_fields_for_display (const Formatting::type_list_sort_fields& sort_fields)
         Get a string to display to the user, as a representation of a sort order. More...
         
        LayoutGroup::type_list_const_items get_layout_items_plus_primary_key (const LayoutGroup::type_list_const_items& items, const Document* document, const Glib::ustring& table_name)
         This returns the provided list of layout items, plus the primary key, if the primary key is not already present in the list. More...
         
        LayoutGroup::type_list_items get_layout_items_plus_primary_key (const LayoutGroup::type_list_items& items, const Document* document, const Glib::ustring& table_name)
         This returns the provided list of layout items, plus the primary key, if the primary key is not already present in the list. More...
         
        std::string get_temp_file_path (const std::string& prefix=std::string(), const std::string& extension=std::string())
         
        Glib::ustring get_temp_file_uri (const std::string& prefix=std::string(), const std::string& extension=std::string())
         
        std::string get_temp_directory_path (const std::string& prefix=std::string())
         This actually creates the directory. More...
         
        Glib::ustring get_temp_directory_uri (const std::string& prefix=std::string())
         This actually creates the directory. More...
         
        bool script_check_for_pygtk2 (const Glib::ustring& script)
         

        Typedef Documentation

        typedef std::vector<Gnome::Gda::Value> Glom::Utils::type_list_values

        Function Documentation

        Gnome::Gda::SqlExpr Glom::Utils::build_combined_where_expression ( const Gnome::Gda::SqlExpr &  a,
        const Gnome::Gda::SqlExpr &  b,
        Gnome::Gda::SqlOperatorType  op 
        )
        Gnome::Gda::SqlExpr Glom::Utils::build_simple_where_expression ( const Glib::ustring table_name,
        const sharedptr< const Field > &  key_field,
        const Gnome::Gda::Value &  key_value 
        )
        void Glom::Utils::build_sql_select_add_fields_to_get ( const Glib::RefPtr< Gnome::Gda::SqlBuilder > &  builder,
        const Glib::ustring table_name,
        const type_vecConstLayoutFields &  fieldsToGet,
        const type_sort_clause &  sort_clause,
        bool  extra_join 
        )

        Generate a SQL statement to SELECT field values, even if the fields are in related (or doubly related) records.

        Glib::RefPtr<Gnome::Gda::SqlBuilder> Glom::Utils::build_sql_select_count_rows ( const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &  sql_query)

        Build a SQL query to discover how many rows a SQL query would return if it was run.

        This uses a COUNT * on a the sql_query as a sub-statement. Be careful not to include ORDER BY clauses in the supplied SQL query, because that would make it unnecessarily slow.

        A SQL query.

        Returns
        The number of rows.
        Glib::RefPtr<Gnome::Gda::SqlBuilder> Glom::Utils::build_sql_select_with_key ( const Glib::ustring table_name,
        const type_vecLayoutFields &  fieldsToGet,
        const sharedptr< const Field > &  key_field,
        const Gnome::Gda::Value &  key_value,
        const type_sort_clause &  sort_clause = type_sort_clause(),
        guint  limit = 0 
        )
        Parameters
        key_valueIf this is empty then all records in the tables will be retrieved.
        Glib::RefPtr<Gnome::Gda::SqlBuilder> Glom::Utils::build_sql_select_with_key ( const Glib::ustring table_name,
        const type_vecConstLayoutFields &  fieldsToGet,
        const sharedptr< const Field > &  key_field,
        const Gnome::Gda::Value &  key_value,
        const type_sort_clause &  sort_clause = type_sort_clause(),
        guint  limit = 0 
        )

        Just a version of build_sql_select_with_key() that takes a list of const fields.

        Glib::RefPtr<Gnome::Gda::SqlBuilder> Glom::Utils::build_sql_select_with_where_clause ( const Glib::ustring table_name,
        const type_vecLayoutFields &  fieldsToGet,
        const Gnome::Gda::SqlExpr &  where_clause = Gnome::Gda::SqlExpr(),
        const sharedptr< const Relationship > &  extra_join = sharedptr< const Relationship >(),
        const type_sort_clause &  sort_clause = type_sort_clause(),
        guint  limit = 0 
        )

        Generate a SQL statement to SELECT field values, even if the fields are in related (or doubly related) records, narrowing the records down with a WHERE clause.

        Glib::RefPtr<Gnome::Gda::SqlBuilder> Glom::Utils::build_sql_select_with_where_clause ( const Glib::ustring table_name,
        const type_vecConstLayoutFields &  fieldsToGet,
        const Gnome::Gda::SqlExpr &  where_clause = Gnome::Gda::SqlExpr(),
        const sharedptr< const Relationship > &  extra_join = sharedptr< const Relationship >(),
        const type_sort_clause &  sort_clause = type_sort_clause(),
        guint  limit = 0 
        )

        Just a version of build_sql_select_with_where_clause() that takes a list of const fields.

        Glib::RefPtr<Gnome::Gda::SqlBuilder> Glom::Utils::build_sql_update_with_where_clause ( const Glib::ustring table_name,
        const sharedptr< const Field > &  field,
        const Gnome::Gda::Value &  value,
        const Gnome::Gda::SqlExpr &  where_clause 
        )

        Generate a SQL statement to UPDATE field values,.

        Glib::ustring Glom::Utils::create_local_image_uri ( const Gnome::Gda::Value &  value)
        Glib::ustring Glom::Utils::create_name_from_title ( const Glib::ustring title)

        Guess an appropriate identifier name based on a human-readable title.

        bool Glom::Utils::delete_directory ( const Glib::RefPtr< Gio::File > &  directory)

        Delete a directory, if it exists, and its contents.

        Unlike g_file_delete(), this does not fail if the directory is not empty.

        bool Glom::Utils::delete_directory ( const std::string uri)

        Delete a directory, if it exists, and its contents.

        Unlike g_file_delete(), this does not fail if the directory is not empty.

        bool Glom::Utils::file_exists ( const Glib::ustring uri)
        bool Glom::Utils::file_exists ( const Glib::RefPtr< Gio::File > &  file)
        type_list_values_with_second Glom::Utils::get_choice_values ( const Document *  document,
        const sharedptr< const LayoutItem_Field > &  field,
        const Gnome::Gda::Value &  foreign_key_value 
        )
        type_list_values_with_second Glom::Utils::get_choice_values_all ( const Document *  document,
        const sharedptr< const LayoutItem_Field > &  field 
        )
        Glib::ustring Glom::Utils::get_directory_child_with_suffix ( const Glib::ustring uri_directory,
        const std::string suffix,
        bool  recursive 
        )

        For instance, to find the first file in the directory with a .glom extension.

        std::string Glom::Utils::get_file_path_without_extension ( const std::string filepath)

        Get a filepath with the extension (any extension, not just .glom) removed.

        Glib::ustring Glom::Utils::get_file_uri_without_extension ( const Glib::ustring uri)

        Get a URI with the extension (any extension, not just .glom) removed.

        Gnome::Gda::SqlExpr Glom::Utils::get_find_where_clause_quick ( const Document *  document,
        const Glib::ustring table_name,
        const Gnome::Gda::Value &  quick_search 
        )
        LayoutGroup::type_list_const_items Glom::Utils::get_layout_items_plus_primary_key ( const LayoutGroup::type_list_const_items &  items,
        const Document *  document,
        const Glib::ustring table_name 
        )

        This returns the provided list of layout items, plus the primary key, if the primary key is not already present in the list.

        LayoutGroup::type_list_items Glom::Utils::get_layout_items_plus_primary_key ( const LayoutGroup::type_list_items &  items,
        const Document *  document,
        const Glib::ustring table_name 
        )

        This returns the provided list of layout items, plus the primary key, if the primary key is not already present in the list.

        Glib::ustring Glom::Utils::get_list_of_layout_items_for_display ( const LayoutGroup::type_list_items &  list_layout_fields)

        Get a string to display to the user, as a representation of a list of layout items.

        Glib::ustring Glom::Utils::get_list_of_layout_items_for_display ( const sharedptr< const LayoutGroup > &  layout_group)

        Get a string to display to the user, as a representation of a list of layout items.

        Glib::ustring Glom::Utils::get_list_of_sort_fields_for_display ( const Formatting::type_list_sort_fields &  sort_fields)

        Get a string to display to the user, as a representation of a sort order.

        std::string Glom::Utils::get_temp_directory_path ( const std::string prefix = std::string())

        This actually creates the directory.

        Glib::ustring Glom::Utils::get_temp_directory_uri ( const std::string prefix = std::string())

        This actually creates the directory.

        std::string Glom::Utils::get_temp_file_path ( const std::string prefix = std::string(),
        const std::string extension = std::string() 
        )
        Glib::ustring Glom::Utils::get_temp_file_uri ( const std::string prefix = std::string(),
        const std::string extension = std::string() 
        )
        Glib::ustring Glom::Utils::locale_language_id ( const Glib::ustring locale_id)

        Get just the language ID part of a locale, such as de from "de_DE",.

        Glib::ustring Glom::Utils::locale_simplify ( const Glib::ustring locale_id)

        Get just the first part of a locale, such as de_DE, ignoring, for instance, .UTF-8 or @euro at the end.

        bool Glom::Utils::script_check_for_pygtk2 ( const Glib::ustring script)
        Returns
        true if the script is OK, or false if the script uses pygtk2, which would cause a crash, because Glom itself uses GTK+ 3.
        std::string Glom::Utils::sqlbuilder_get_full_query ( const Glib::RefPtr< const Gnome::Gda::SqlBuilder > &  builder)

        Get the full query string suitable for use with std::cout.

        Glib::ustring Glom::Utils::string_clean_for_xml ( const Glib::ustring src)

        Remove any characters that may not be in XML even when escaped.

        Glib::ustring Glom::Utils::string_escape_underscores ( const Glib::ustring text)
        Glib::ustring Glom::Utils::string_from_decimal ( guint  decimal)

        Get a decimal text representation of the number, in the current locale.

        Glib::ustring Glom::Utils::string_remove_suffix ( const Glib::ustring str,
        const Glib::ustring suffix,
        bool  case_sensitive = true 
        )
        Glib::ustring Glom::Utils::string_replace ( const Glib::ustring src,
        const Glib::ustring search_for,
        const Glib::ustring replace_with 
        )
        type_vec_strings Glom::Utils::string_separate ( const Glib::ustring str,
        const Glib::ustring separator,
        bool  ignore_quoted_separator = false 
        )
        Glib::ustring Glom::Utils::string_trim ( const Glib::ustring str,
        const Glib::ustring to_remove 
        )
        Glib::ustring Glom::Utils::title_from_string ( const Glib::ustring text)

        Create an appropriate title for an ID string.

        For instance, date_of_birth would become Date Of Birth.

        Glib::ustring Glom::Utils::trim_whitespace ( const Glib::ustring text)
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Button-members.html0000644000175000017500000006113212234777147031755 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutItem_Button Member List

        This is the complete list of members for Glom::LayoutItem_Button, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Buttonvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_formatting_used() const Glom::LayoutItem_WithFormattingvirtual
        get_formatting_used_horizontal_alignment(bool for_details_view=false) const Glom::LayoutItem_WithFormattingvirtual
        get_has_script() const Glom::LayoutItem_Button
        get_has_translations() const Glom::TranslatableItem
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Buttonvirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutItemvirtual
        get_script() const Glom::LayoutItem_Button
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Button()Glom::LayoutItem_Button
        LayoutItem_Button(const LayoutItem_Button& src)Glom::LayoutItem_Button
        LayoutItem_WithFormatting()Glom::LayoutItem_WithFormatting
        LayoutItem_WithFormatting(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        m_formattingGlom::LayoutItem_WithFormatting
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Button& src)Glom::LayoutItem_Button
        Glom::LayoutItem_WithFormatting::operator=(const LayoutItem_WithFormatting& src)Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem_Button& src) const Glom::LayoutItem_Button
        Glom::LayoutItem_WithFormatting::operator==(const LayoutItem_WithFormatting& src) const Glom::LayoutItem_WithFormatting
        Glom::LayoutItem::operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_script(const Glib::ustring& script)Glom::LayoutItem_Button
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Button()Glom::LayoutItem_Buttonvirtual
        ~LayoutItem_WithFormatting()Glom::LayoutItem_WithFormattingvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutGroup-members.html0000644000175000017500000006647512234777147030500 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::LayoutGroup Member List

        This is the complete list of members for Glom::LayoutGroup, including all inherited members.

        add_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        add_item(const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)Glom::LayoutGroup
        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutGroupvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_border_width() const Glom::LayoutGroup
        get_columns_count() const Glom::LayoutGroup
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_items()Glom::LayoutGroup
        get_items() const Glom::LayoutGroup
        get_items_count() const Glom::LayoutGroup
        get_items_recursive() const Glom::LayoutGroup
        get_items_recursive()Glom::LayoutGroup
        get_items_recursive_with_groups() const Glom::LayoutGroup
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutGroupvirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutGroupvirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        has_any_fields() const Glom::LayoutGroup
        has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::LayoutGroup
        LayoutGroup()Glom::LayoutGroup
        LayoutGroup(const LayoutGroup& src)Glom::LayoutGroup
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        m_list_itemsGlom::LayoutGroup
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutGroup& src)Glom::LayoutGroup
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        remove_all_items()Glom::LayoutGroup
        remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::LayoutGroup
        remove_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::LayoutGroupvirtual
        set_border_width(double border_width)Glom::LayoutGroup
        set_columns_count(guint columns_count)Glom::LayoutGroup
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_list_const_items typedefGlom::LayoutGroup
        type_list_items typedefGlom::LayoutGroup
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutGroup()Glom::LayoutGroupvirtual
        ~LayoutItem()Glom::LayoutItemvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/ftv2mlastnode.png0000644000175000017500000000036612234777145024642 0ustar00murraycmurrayc00000000000000‰PNG  IHDRɪ|½IDATxíÝ!NAÅñ¤‡à\ ÷à Um@`Ô5iÒ`ëh ‚ÅW7] b§ÝˆŠ&oföÍd¾YÔ4 üšcø ‡€´‹Åòù3v=¼]†§µ\B… I¿‹=B·™B¡®;¸k´µ W°ÍN@vyÍÑÖ4ãß÷]ÈâYìã§|M}]ÔÚx6a }ôdׇØYüú¨>¤||5?Ó>|žB"¡î'¡IEND®B`‚glom-1.22.4/docs/libglom_reference/html/dir_afe145b47a4ac6593d2f41db8bc076f3.html0000644000175000017500000000626512234777147027612 0ustar00murraycmurrayc00000000000000 libglom-1.22: libglom/document/bakery/view Directory Reference
        view Directory Reference

        Files

        file  view.h
         
        file  view_composite.h
         
        file  viewbase.h
         
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Formatting.html0000644000175000017500000026263612234777147026665 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::Formatting Class Reference

        This specifies how to display data for fields or static text items. More...

        Inheritance diagram for Glom::Formatting:
        Collaboration diagram for Glom::Formatting:

        Public Types

        enum  HorizontalAlignment {
          HORIZONTAL_ALIGNMENT_AUTO,
          HORIZONTAL_ALIGNMENT_LEFT,
          HORIZONTAL_ALIGNMENT_RIGHT
        }
         
        typedef std::vector< sharedptr
        < ChoiceValue > > 
        type_list_values
         
        typedef std::pair< sharedptr
        < const LayoutItem_Field >
        , bool > 
        type_pair_sort_field
         
        typedef std::vector
        < type_pair_sort_field
        type_list_sort_fields
         

        Public Member Functions

         Formatting ()
         
         Formatting (const Formatting& src)
         
        Formattingoperator= (const Formatting& src)
         
        virtual ~Formatting ()
         
        bool operator== (const Formatting& src) const
         
        bool get_has_choices () const
         
        bool get_has_related_choices () const
         
        bool get_has_related_choices (bool& show_all, bool& with_second) const
         
        void set_has_related_choices (bool val=true)
         
        bool get_has_custom_choices () const
         
        void set_has_custom_choices (bool val=true)
         
        virtual type_list_values get_choices_custom () const
         
        virtual void set_choices_custom (const type_list_values& choices)
         
        Glib::ustring get_custom_choice_original_for_translated_text (const Glib::ustring& text, const Glib::ustring& locale=Glib::ustring()) const
         Get the original text that corresponds to the translated choice for the current locale. More...
         
        Glib::ustring get_custom_choice_translated (const Glib::ustring& original_text, const Glib::ustring& locale=Glib::ustring()) const
         Get the translated choice text, for the current locale, that corresponds to the original text . More...
         
        bool get_choices_restricted (bool& as_radio_buttons) const
         Discover whether the entered data should only be one of the available choices. More...
         
        void set_choices_restricted (bool val=true, bool as_radio_buttons=false)
         See get_choices_restricted(). More...
         
        void get_choices_related (sharedptr< const Relationship >& relationship, sharedptr< LayoutItem_Field >& field, sharedptr< LayoutGroup >& extra_layout, type_list_sort_fields& sort_fields, bool& show_all)
         
        void get_choices_related (sharedptr< const Relationship >& relationship, sharedptr< const LayoutItem_Field >& field, sharedptr< const LayoutGroup >& extra_layout, type_list_sort_fields& sort_fields, bool& show_all) const
         
        void set_choices_related (const sharedptr< const Relationship >& relationship_name, const sharedptr< LayoutItem_Field >& field, const sharedptr< LayoutGroup >& extra_layout, const type_list_sort_fields& sort_fields, bool show_all)
         
        sharedptr< const Relationshipget_choices_related_relationship (bool& show_all) const
         
        bool get_text_format_multiline () const
         Get whether the text should be displayed with multiple lines in the details view. More...
         
        void set_text_format_multiline (bool value=true)
         Set whether the text should be displayed with multiple lines in the details view. More...
         
        guint get_text_format_multiline_height_lines () const
         Get the number of lines of text that should be displayed. More...
         
        void set_text_format_multiline_height_lines (guint value)
         Get the number of lines of text that should be displayed. More...
         
        void set_text_format_font (const Glib::ustring& font_desc)
         Set the font description, as returned from Gtk::FontButton::get_font_name(), which may include the size and style. More...
         
        Glib::ustring get_text_format_font () const
         Get the font description, as returned from Gtk::FontButton::get_font_name(), which may include the size and style. More...
         
        void set_text_format_color_foreground (const Glib::ustring& color)
         Set the foreground color to use for text when displaying a field value. More...
         
        Glib::ustring get_text_format_color_foreground_to_use (const Gnome::Gda::Value&value) const
         Get the foreground color to use for text for the specified value, taking the negative-color into account, if specified. More...
         
        Glib::ustring get_text_format_color_foreground () const
         Get the foreground color to use for text when displaying a field value. More...
         
        void set_text_format_color_background (const Glib::ustring& color)
         Set the background color to use for text when displaying a field value. More...
         
        Glib::ustring get_text_format_color_background () const
         Get the background color to use for text when displaying a field value. More...
         
        void set_horizontal_alignment (HorizontalAlignment alignment)
         
        HorizontalAlignment get_horizontal_alignment () const
         
        bool change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name_old, const Glib::ustring& field_name_new)
         Adapt to a change of field name, so this Formatting does not refer to any field that no longer exists. More...
         
        - Public Member Functions inherited from Glom::UsesRelationship
         UsesRelationship ()
         
         UsesRelationship (const UsesRelationship& src)
         
        UsesRelationshipoperator= (const UsesRelationship& src)
         
        virtual ~UsesRelationship ()
         
        bool operator== (const UsesRelationship& src) const
         
        bool get_has_relationship_name () const
         
        bool get_has_related_relationship_name () const
         
        Glib::ustring get_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        Glib::ustring get_related_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        sharedptr< const Relationshipget_relationship () const
         Return the relationship used by this item, if any, or a null sharedptr. More...
         
        void set_relationship (const sharedptr< const Relationship >& relationship)
         
        sharedptr< const Relationshipget_related_relationship () const
         Return the related relationship used by this item, if any, or a null sharedptr. More...
         
        void set_related_relationship (const sharedptr< const Relationship >& relationship)
         
        Glib::ustring get_table_used (const Glib::ustring& parent_table) const
         Returns either the parent_table, related to table, or doubly-related to-table. More...
         
        Glib::ustring get_title_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the title of the relationship that is actually used, falling back to the relationship's name. More...
         
        Glib::ustring get_title_singular_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the singular title of the relationship that is actually used, falling back to the regular (plural) title, and then to the relationship's name. More...
         
        Glib::ustring get_to_field_used () const
         
        Glib::ustring get_relationship_name_used () const
         Get the name of the related relationship used, if any, or the relationship if there is no related relationship, or an empty string if neither are used by this item. More...
         
        bool get_relationship_used_allows_edit () const
         Discover whether the relationship used allows the user to edit values in its to table. More...
         
        Glib::ustring get_sql_join_alias_name () const
         Get a name to use as an alias in SQL statements. More...
         
        Glib::ustring get_sql_table_or_join_alias_name (const Glib::ustring& parent_table) const
         Get the item's alias name, if it uses a relationship, or just get its table name. More...
         
        Glib::ustring get_relationship_display_name () const
         Get a human-readable representation of th relationship. More...
         

        Public Attributes

        NumericFormat m_numeric_format
         

        Detailed Description

        This specifies how to display data for fields or static text items.

        Member Typedef Documentation

        Member Enumeration Documentation

        Enumerator
        HORIZONTAL_ALIGNMENT_AUTO 
        HORIZONTAL_ALIGNMENT_LEFT 
        HORIZONTAL_ALIGNMENT_RIGHT 

        Constructor & Destructor Documentation

        Glom::Formatting::Formatting ( )
        Glom::Formatting::Formatting ( const Formatting src)
        virtual Glom::Formatting::~Formatting ( )
        virtual

        Member Function Documentation

        bool Glom::Formatting::change_field_item_name ( const Glib::ustring table_name,
        const Glib::ustring field_name_old,
        const Glib::ustring field_name_new 
        )

        Adapt to a change of field name, so this Formatting does not refer to any field that no longer exists.

        Returns
        true if something was changed.
        virtual type_list_values Glom::Formatting::get_choices_custom ( ) const
        virtual
        void Glom::Formatting::get_choices_related ( sharedptr< const Relationship >&  relationship,
        sharedptr< LayoutItem_Field >&  field,
        sharedptr< LayoutGroup >&  extra_layout,
        type_list_sort_fields sort_fields,
        bool &  show_all 
        )
        void Glom::Formatting::get_choices_related ( sharedptr< const Relationship >&  relationship,
        sharedptr< const LayoutItem_Field >&  field,
        sharedptr< const LayoutGroup >&  extra_layout,
        type_list_sort_fields sort_fields,
        bool &  show_all 
        ) const
        sharedptr<const Relationship> Glom::Formatting::get_choices_related_relationship ( bool &  show_all) const
        bool Glom::Formatting::get_choices_restricted ( bool &  as_radio_buttons) const

        Discover whether the entered data should only be one of the available choices.

        Parameters
        [out]as_radio_buttons,:Whether the choices should be displayed as radio buttons instead of a combo box.
        Glib::ustring Glom::Formatting::get_custom_choice_original_for_translated_text ( const Glib::ustring text,
        const Glib::ustring locale = Glib::ustring() 
        ) const

        Get the original text that corresponds to the translated choice for the current locale.

        Glib::ustring Glom::Formatting::get_custom_choice_translated ( const Glib::ustring original_text,
        const Glib::ustring locale = Glib::ustring() 
        ) const

        Get the translated choice text, for the current locale, that corresponds to the original text .

        bool Glom::Formatting::get_has_choices ( ) const
        bool Glom::Formatting::get_has_custom_choices ( ) const
        bool Glom::Formatting::get_has_related_choices ( ) const
        bool Glom::Formatting::get_has_related_choices ( bool &  show_all,
        bool &  with_second 
        ) const
        HorizontalAlignment Glom::Formatting::get_horizontal_alignment ( ) const
        Glib::ustring Glom::Formatting::get_text_format_color_background ( ) const

        Get the background color to use for text when displaying a field value.

        Returns
        the text background color, in a format recognised by XParseColor
        Glib::ustring Glom::Formatting::get_text_format_color_foreground ( ) const

        Get the foreground color to use for text when displaying a field value.

        This should be overriden by m_numeric_formatting.m_foreground_color_for_negatives if that is active.

        Returns
        the text foreground color, in a format recognised by XParseColor
        Glib::ustring Glom::Formatting::get_text_format_color_foreground_to_use ( const Gnome::Gda::Value &  value) const

        Get the foreground color to use for text for the specified value, taking the negative-color into account, if specified.

        Returns
        the text foreground color, in a format recognised by XParseColor
        Glib::ustring Glom::Formatting::get_text_format_font ( ) const

        Get the font description, as returned from Gtk::FontButton::get_font_name(), which may include the size and style.

        Returns
        a Pango font description string
        bool Glom::Formatting::get_text_format_multiline ( ) const

        Get whether the text should be displayed with multiple lines in the details view.

        Text is displayed with a single line in the list view.

        Returns
        whether the text should be displayed with multiple lines
        guint Glom::Formatting::get_text_format_multiline_height_lines ( ) const

        Get the number of lines of text that should be displayed.

        See Also
        get_text_format_multiline()
        Returns
        the number of lines of text
        Formatting& Glom::Formatting::operator= ( const Formatting src)
        bool Glom::Formatting::operator== ( const Formatting src) const
        virtual void Glom::Formatting::set_choices_custom ( const type_list_values choices)
        virtual
        void Glom::Formatting::set_choices_related ( const sharedptr< const Relationship >&  relationship_name,
        const sharedptr< LayoutItem_Field >&  field,
        const sharedptr< LayoutGroup >&  extra_layout,
        const type_list_sort_fields sort_fields,
        bool  show_all 
        )
        void Glom::Formatting::set_choices_restricted ( bool  val = true,
        bool  as_radio_buttons = false 
        )
        void Glom::Formatting::set_has_custom_choices ( bool  val = true)
        void Glom::Formatting::set_has_related_choices ( bool  val = true)
        void Glom::Formatting::set_horizontal_alignment ( HorizontalAlignment  alignment)
        void Glom::Formatting::set_text_format_color_background ( const Glib::ustring color)

        Set the background color to use for text when displaying a field value.

        Parameters
        [in]colora text background color, in a format recognised by XParseColor
        void Glom::Formatting::set_text_format_color_foreground ( const Glib::ustring color)

        Set the foreground color to use for text when displaying a field value.

        Parameters
        [in]colorthe text foreground color, in a format recognised by XParseColor
        void Glom::Formatting::set_text_format_font ( const Glib::ustring font_desc)

        Set the font description, as returned from Gtk::FontButton::get_font_name(), which may include the size and style.

        Parameters
        font_desca Pango font description string
        void Glom::Formatting::set_text_format_multiline ( bool  value = true)

        Set whether the text should be displayed with multiple lines in the details view.

        Text is displayed with a single line in the list view.

        Parameters
        [in]valuewhether the text should be displayed with multiple lines
        void Glom::Formatting::set_text_format_multiline_height_lines ( guint  value)

        Get the number of lines of text that should be displayed.

        Returns
        the number of lines of text

        Member Data Documentation

        NumericFormat Glom::Formatting::m_numeric_format

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/formatting.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1ChoiceValue.html0000644000175000017500000011463212234777147026732 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::ChoiceValue Class Reference
        Glom::ChoiceValue Class Reference

        A value of a custom choice, for a field or a layout item. More...

        Inheritance diagram for Glom::ChoiceValue:
        Collaboration diagram for Glom::ChoiceValue:

        Public Member Functions

         ChoiceValue ()
         
         ChoiceValue (const ChoiceValue& src)
         
         ~ChoiceValue ()
         
        ChoiceValueoperator= (const ChoiceValue& src)
         
        bool operator== (const ChoiceValue& src) const
         
        bool operator!= (const ChoiceValue& src) const
         
        ChoiceValueclone () const
         
        void set_value (const Gnome::Gda::Value&value)
         
        Gnome::Gda::Value get_value () const
         
        virtual Glib::ustring get_title_original () const
         This override makes sure that we can generically use ChoiceValue like any other TranslatableItem, assuming that the value is a title, if it is a text value. More...
         
        bool is_translatable () const
         Whether the value is of a type that can be translated. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        A value of a custom choice, for a field or a layout item.

        This is translatable, but that only make sense for text fields.

        Text-specific methods such as get/set_title() should be ignored.

        Constructor & Destructor Documentation

        Glom::ChoiceValue::ChoiceValue ( )
        Glom::ChoiceValue::ChoiceValue ( const ChoiceValue src)
        Glom::ChoiceValue::~ChoiceValue ( )

        Member Function Documentation

        ChoiceValue* Glom::ChoiceValue::clone ( ) const
        virtual Glib::ustring Glom::ChoiceValue::get_title_original ( ) const
        virtual

        This override makes sure that we can generically use ChoiceValue like any other TranslatableItem, assuming that the value is a title, if it is a text value.

        Reimplemented from Glom::TranslatableItem.

        Gnome::Gda::Value Glom::ChoiceValue::get_value ( ) const
        bool Glom::ChoiceValue::is_translatable ( ) const

        Whether the value is of a type that can be translated.

        This means that it must be a text type.

        bool Glom::ChoiceValue::operator!= ( const ChoiceValue src) const
        ChoiceValue& Glom::ChoiceValue::operator= ( const ChoiceValue src)
        bool Glom::ChoiceValue::operator== ( const ChoiceValue src) const
        void Glom::ChoiceValue::set_value ( const Gnome::Gda::Value &  value)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/choicevalue.h
        glom-1.22.4/docs/libglom_reference/html/functions_func_0x76.html0000644000175000017500000001135312234777147026041 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__GroupBy__coll__graph.png0000644000175000017500000005201512234777146032750 0ustar00murraycmurrayc00000000000000‰PNG  IHDRij>ð1bKGDÿÿÿ ½§“ IDATxœìÝy\gþðgG@Äp‰„Að¦-]]ŠPñXÜ¢àÊU¬G¥õ¨«µµ[ÐRë-[­¶Õº[Žr¨´?P×–"*ØP‹G±Ü 7ᆜóûcjš†&™dò}¿úÇ0yòÌwütŽ'O0Ç€á1 º S „)ÂHa $0¤º êëë‹ŠŠ¨® „­­íÔ©S©®(‚0ƒ0eʪKÐwUUUT—”ƒ0ƒ0zôhªKÐw T—”ƒ{¦@S „)ÂHa $€0ÔÀ0¬±±QÅÆo¼ñFpp°üšü‘Éd¶··«¡´> ªf o L ÉÌÌìîî–­¹téÒ‚ FŽIaUȃ0êEÊÙÜÂ… ŒŒ²²²dk.]º¨ùJè „) Ç›1c†™™™““Ó©S§0 CÙÚÚ666 ‚-[¶ØÙÙÙÚÚ~ùå—²·`/¿Ð›±±q@@@jj*ñã½{÷ª««—,Y‚ãxtt´³³³••UPPPSSBH*•FGG»¸¸Œ1ÂÓÓóæÍ›Dç²JÄbqTT”£££MXXñ.¢MNN—Ë=}út_;˜žžîääÄb±ëëë çÍ›geeejjêæævþüy¥ÇAi½Á€|݆ ‚ºººììì›7.""¢¦¦&--ÍÀÀ ¶¶!ÔÐЀãxTT—ËÍÍÍ-..ž5k–l}\\\EE…ü‚RYYY#GŽìééÁq|÷îÝ‹-ÂqüèÑ£®®®yyyeee~~~8Žþù玎Ž999ÕÕÕQQQÖÖÖ"‘ÇqÙ8àââ’ŸŸ_\\_,Ë"ÌÙÙ9&&†xéîÝ»²õ*‰DÖÖÖ—.]Âqü/ù ÑÕ”)SˆÕÕÕ £³³sòäÉÄÉ ŽãR©”ÏçK¥R\.LÇîÜ9¢ÁƒB­­­Dƒ”””~j@ÉÂ;wB•••b±˜XS\\,Û„Âq˜8qbï:qïêê:yò¤»»ûìÙ³“““…Bá€ÇÂTkA˜•¨¦IIIvvv\.wÕªU7oÞÄå"ŒÉdæææ͈GIƒ SÇ×®]»bÅŠ'Ož555á8njjªp¥U\\ljj*Û<ùJnܸ!_ɯ¿þJ4¸}ûv? „ž>}J,wuu!„233###gΜioo/º­p”Öyùòe[[ÛM›6=|øPõƒaªµàž) “¯¯ïãÇSRRìíígÏž]]]-{‰Ãá”””ËeeeCè<$$äÛo¿MMM={¶••BˆÍf_¼x‘øS&NB'L˜Àf³+++eïjii‘H$òýp8œŠŠ b™X`³ÙÄü‹U^\\ŒaØòåË+**<øèÑ£+W®ôupï]'‡Ãñðð¸råJff&ŸÏÂÚ…²:EÅ3S''§-[¶ÔÔÔ¤¦¦OÏKJJpßµkר±coܸQRR²`Á4È{¦8Ž‹Åb;;;++«¯¿þšX³k×.777WZZúÖ[o¹»»ã8¾wïÞqãÆåææÖÔÔÐ"¾¾¾”_*iC @Á™)ÂHa $€0ZJéS ‚‚R:ß°a†a [$ú'qC@@˜-Å!”M,¿üòËÃïY"‘¤¥¥;6%%eø½@€§ù@K±X,Ù²¹¹¹üÃôÃ?…ÂcÇŽ½ýöÛÀÄÄ„¬ž>ƒ3S c0 KOOwvvf±XÁÁÁ}Í Úää䀀€Å‹‹Åâ«W¯öÕLé´§J'K•iii!&ÊzÂèž>ú()))//ïÙ³gáááƒz¯H$ºpáBHHˆ©©©¯¯¯l:çÞ:””””ššzëÖ­ººº·Þz !tôèÑãÇŸ9s¦´´tþüùþþþò陟Ÿïêêºoß¾úúú!ïÐUœè?›¯èÏ™G={–X.,,DÏg#UQff¦••1sh\\œ……1á´ü†ˆ¥Óžö5YªÌãÇ·mÛÆápV¬XÑÿ„~CŸÍ×Zpf t‹‹ ±0qâD„PUU•êïMNNnnn666Æ0lÅŠmmm}]é?}úT¶!b¡ªªêÑ£GÄFB†±X,â Qd¸\îþýûËÊÊæÏŸ¿nÝ:AîÐU¦@÷”—— ¥¥¥Hn6Ò …‹/ÆÆÆÊ† ,X° ¯gúJ§=p²TBqqñ­[·ÚÚÚæÍ›§ònÝa tÏÞ½{y<ÞÇ7nÜèççÇb±âããå3®/—/_‹ÅË–-c=œ‘‘! {7^µjÕž={x<^IIɦM›ˆ ½ùæ›;wî¼qãFmmí¡C‡8ŽüP ‚øøxooïððpOOÏ¢¢¢ýû÷“¹ç@›Q}Ÿè­ºgzàÀWWW ‹eË–s›"æBÅq<,,,44T~Mcc£¡¡aFFÞëž©ÒiOûš,•žž–——GÂn÷î™j-˜Ï¨D{æ3Å0ŒÇãMŸ>]aejjê²e˨ªJc`>S­—ù€JdMêâââããCz·¨>¨4„ÉC•¶Wø†>˜“hœ™ L€¦@S „)Ð "‰ˆêÍÁÓ|0::Žã{®ìÙá»Cõ·de¾äð’Ã(õU540«Ö‚0ƒPTTDu CQPSp&ÿÌ?ÿa€©z)ÖXÓ8+eVÄŒoŽ·Zk[[[ªKJÀ' ýÍ>8;§$§ ª`ÚØi*¾¥[ÔÍÚÌJ„›æl:tÈØÐX­€{¦€æî<¹“S’ƒaØõ’몿ËÔÈÔËÅ CØñOß7½¢¡B}z€04·çÛ=†††}ÿðûA½q‘Û"CC‰TòðÙÃÉO>qý„š*ôa 謤®äÒÝKb©X*•^/¹.Å¥ª¿wÞ”yıT,”×Ç­_³¼CС¶bnƒ0tvèÊ!CƒßŸ²¶ ÚT?Pý½îŽî,³?¾Gx /åÅ]/Þ}z—ä*-@˜Úªi­9{ë¬l„©!Ã0§$Gõ·`ó'Ï7dü1âE$=mzú×}ýâû/H®è>S@[G8Š£?«à8>¨0EÍŸ:_a¸‹X*IDï'¿ïÿ•KW 9…Z€¡Q€žZ»[þåÐ)è”_iifÙôy“ÂWàõ£¼¡Üu»«Ò— †\+Ü܆[+ 83ôtòúIH °’ßÅ/®+V½[–òAá8^ÙXŸ?ô½@˜Š…¯ãb…õ Æ F›"„¿´Øˆa¤°Òaèlã|+òVô²èa hÂÐPÂí„ÆŽF¤ìVNñàn›Î›2O,ý#” a[ço½·óžç8ÏaÖ è>›èÇñO/ªô%‰T’]œ=¨Þþ6éoˆYF £1cÚí>|LLI¨Ðœ™ºÉzõ[ío†™šô¾B¯i­yÜôXõÞXf,77âûø^åõ{;ïùNõ]}fu}»NN ÔžæºyÚüô×g¿Ö¶ÕVñ«êÚê.^êõ`kîl&.Øc×Ä®˜±Bõ#Ó"cnÆÄ¬ŠYòÒ„PKWË ;_˜î4ýÂ;Ôµ@A˜š›upÖ / ;†ãx][]m[íHæH[Õ{(«/³4³´6·–­¹úëUß/|ãÃãÃ^ SCÉ@'Áe> ¹º¶ºÑ#G#„0 3jŒ»£û ’!ä:ÚU>IB ¦.Xã½fã7«øUdÖ t„) ¹ú¶úÑ£IïöpðáQ¦£Öœ]×v€a èL ´t·ØYؑ޳…©ÅéÕ§¯=¼s#†ôÎ.‚0tÖÐÞ€ã8q™Oº¹“æþsÎ?·$o)o(WGÿ@·@˜:#0©ã2Ÿ½,Úå°úôêAÍ” h ÂÐY}[=BÈn$ù—ù3c³skÎåUäýᨚ6t„) ³º¶:¦ÓÂÔB}›ðçù¯…ÿŠL‹üõÙ¯êÛ Ð~¦€ÎêÛëÕtÃTÞÎ%;'ØMXuz•l"j ‡ Lշ׫ãQ¾C“skÎݯ¾ðÊAuo h-S@gumuê{ú$ÏÝÑ=굨]ßîºWuO›ZÂÐY}›&ÎL Ûþ¾ÍÝÑ}åé•B±P3[ZÂЙfî™ Ï­9WR[²û»ÝšÙ"Ð*¦€ÎdÌ׌Ic&í]º÷ßYÿ¾]y[cZÂÐŽã í š¹g*³eÞoWïU§Wu‹º5¹]@9S@[ü.¾H"ÒØ=S‚fpæÍ3ÏZž}tá#MnPÂÐV][BH“—ùgçO?ýâÚ?ÿ¨áM A˜Ú">˜¯á3SÂ:Ÿu §.|óÌ›í=íšß: „) ­ÆŽF ÃæuÖ ÃN­:ÕÖÓöAÊšß: „) ­¦Ž& ¦…¡5_ÁËf±?ùüÄõ™÷3))h„) ­æÎfJNKeVÌX8-ðíØ·›;›),h„) ­æÎf«VÔÖðŸ7þ#‘J6'n¦¶  ¦€¶´!LmÌm¾^ñuÂí„”‚j+êa h«¹³Ùz•—ùwÿ7<ßx'áb¨ +S@[ÚpfJ8vÌÔØtmìZª ja h«©³IKÂt”騘U1ßÞû66/–êZ€º@˜ÚÒž3S„Ðü)óßžùöæÄÍOšŸP] P S@[Z¦¡ÃÁ‡mGÚ†Ÿ ÇqœêZù L=u »zD=ÚðJf„Ɉ³ožÍ.Îþúú×T×Èa è‰'¯Ug¦!oWïÍÛüAÊ¥õ¥T×Ha è©©£ i_˜"„ü〓µÓêÓ«%R Õµ2A˜z"ÎL©ý8©R&†&±á±¼G¼Ï¯}Nu-€L¦€žš»š1 ³4³¤º%þÂýK„oÄG>zPý€êZi L=5u42Å0`P]ˆrŸ,ùÄÍÁmåé•"‰ˆêZ9 L=iÛ¸(††±kbÖ<ŸX°´´ÌÎÎvwwG p”„) »£ =ß×Ûïaj¢®,À0¬¡¡ÁÆÆFMýk~s,Ö½577—ÿ¨î™"÷Ì”Çã͘1ÃÌÌÌÉÉéÔ©S†!„lmmÁ–-[ìììlmm¿üòKÙ[0 ‹—-øùùEEE/Õ××UTTDGG;;;[YY555!„¤Ritt´‹‹Ëˆ#<==oÞ¼Iô ÛœX,ŽŠŠrtt´±± #ÞE´ÉÉÉár¹§OŸV(¾¡¡a8ûŽaXzzº³³3‹Å –môa h¨½§aÀ036#¥·ÐÐÐY³fUTT>|xݺuµµµ!âTqïÞ½.\HKK»yófzzºì-qqqÞÞÞ²…Ù«©©©ÞÞÞ™™™111‰‰‰<¯§§gýúõ¡£G?~üÌ™3¥¥¥óçÏ÷÷÷‹ÅÄ÷B›;tèPRRRjjê­[·êêêÞzë-Ù·oßþÍ7ß¼þúë²57nÜ õññæîôÑGIIIyyyÏž= fot†Ë!î–â€.©®‚'¯Ÿ´Ød1`3••Õ‘#Gˆe>Ÿ/‹B 8Ž;;;ÇÄÄ/ݽ{W¶^Akk+“Éüí·ßp÷ññ9}úô”)SˆW««« FggçäÉ“O:E¬”J¥|>_*•âÏÃÇññãÇŸ;wŽhðàÁ„Pkk+Ñ %%…XßÕÕuòäIww÷Ù³g''' …ÂwPBˆÇãÉÿxöìYb¹°°P¶ÅAÑ“¿C834ÔÞÓNâ ÓãÇGGG;võêÕEEE Æ_…RSS3aÂbY¶Ð›……Å¢E‹ÒÒÒž={öË/¿UVV._¾œxhîàà ‘Hªªª=z4qâDâ-†±X,â_æéÓ§...Ä2±PUUEüÈårBW®\;vì½{÷³³³ƒƒƒŒŒ†¹û²-µÉ¶@˜"÷ãO¾¾¾?NII±··Ÿ={vuuµì%‡SRRB,—••õÓ q¥Ÿšš`nnÎf³/^¼HœÑ'¡&L`³Ù•••²·´´´H$ú:h‡SQQA, l6›øÑÀÀ€hàááqåÊ•ÌÌLÙúa*//'JKKå· 1LÛÚÚ>øàGGGGGÇððpÙ_éÃÓÔ=n˜½)ZØŸ0‚OÝÚd†©»»{dd$—Ë>}:ŽãL&=K´bÅŠÝ»wß¼y³´´tëÖ­²·ÄÇDZ([X¼xño¿ývìØ±Õ«W#„V®\UPPPVV¶víÚ9sæ „Þ|óÍ;wÞ¸q£¶¶öСC§»»›èØÜªU«öìÙÃãñJJJ6mÚäçç§ðØ}êÔ©ß}÷]VVVuuõ /¼~çÎaîþÞ½{y<ÞÇ7nÜHlQ¶SàOä¯ùU¼g*‘H¼½½_}õÕüüüúúúÂÂÂwÞy‡Ëåöôôà½î¹ ÿ9„Pvv6±Lܘ'Å0 FÊn“õß'釨/zr¯ª·uqëæš;`3ϵk×ÜÜܘL¦‹‹Kbb"Žã>>>L&³©©I ¼÷Þ{ÄÓüØØXÙB(..N~Çñ.—KÜ …‘‘‘ÇÜÜ|áÂ…åååÄÊ?þ˜Ëåš™™yxxdggo”mN(FDD888XYY…††Êþð”þEuvvž8qbÖ¬Yª1Ôëžé\]]-,,–-[V__¯°SªÐ“¿Ã¡„iLL̘1c:::äWÊN}I¡¦ž >¥úo z˜ØÿpèÉqoa'ÃüùØLoê”þ%#„RSSUïDOŽóP.ó6nÜ8bÄù•,KþÆ|?â’’’8ÎÈ‘#·mÛ–˜˜Èf³-,,d—H ôú)C6¶nóæÍóæÍ³²²255uss;þ¼¬Á·ß~Ëáp¬¬¬Ž;F¬T3(ë­°°°w'òCü”6 ¤§§;99±X¬ÀÀÀúúzÙzÇ{%TØYÿ}5ðˆÞ`Ê(¥._¾¬ô¦™l ¬Š\\\†?⊆ä“UÅ3SKKËŒŒŒ¾^Eñx¼¸¸¸äççÏ;7 @öªŸŸ_cccjj*BhÑ¢E²eâJ'..®¢¢B~A¡gù½¼¼rss¹\îúõë+++kkkO:ebb"ˆ .¬««KKK344$îBŒ7.""¢¦¦&--ÍÀÀ€3Èãñ&NœØW'Ä™c? ¦M›v÷îÝû÷ï{zz.Z´HVêÑ£G]]]óòòÊÊÊüüüdÿsFÊÎLûiÜÿ뇞œô6ûàì ñl¦·ÇGÃôä8%L oÞ¼ùGÏñù|üyRô3 ޏD<¦”_ð¾w˜cëZZZd·P‹‹‹‘Ü}« .Èú'V*3Èãñúé„Xè§ìÞq³¿¹¹™èSéXB¼0í§ñ˜žü÷6mÏ´S?°™Þ Ó“ã<”Ë|6›-Bd¨ü`B?âÌÍÍÑó‘òËC@Œ­kii‰ŠŠòñña³Ùk×®•oààà Ð_cûédÀ®®®Ä¤I“B555ÄJÇöµ/ý4&ñˆé‰¶î6¸Ì6”“K–,9~ü¸l‹ÅúùçŸÚô3 ŽDD¦øøøTTTS¥³ ÊÞ’ŸŸïêêºoß>ù“u€0tÓÑÓ271§ºU]»v !4oÞ<„ÐÒ¥K322Ò–§OŸÞ±cÇ+¯¼2a„/¿üòâÅ‹mmm_ýõ'Ÿ|B ÚÛ½{wYY™üg}}}¯_¿ÞÙÙ9mÚ´•+WþôÓOšÙ)=a è¦[Ô"kš} HNNnnn666Æ0lÅŠmmm}]é+¾=à,¨\.wÿþýeeeóçÏ_·n‡‡‡:÷FA˜ºév!„LM©.D%B¡ðâÅ‹±±±²ÙÑ,XÐ×7!*¾=à,¨„âââ[·nµµµ§À€t¦€nº…Ý!S#ÝÓË—/‹ÅâeË–±ž ÎÈÈ …½+¾ÝÏ,¨!@ïííîééYTT´ÿ~ îŸQòUÏúàÑ£F'' }O/аnQ7ÀalhLu!*INN^¼x±™Ù7%Ö¯_åʕŋ+4ŽˆˆèèèXºtiww÷‚ Ž=ŠúðÃÁòåËÝÜܾûî;â3Ç„ÌÌ̬¬¬Ï>ûÌÓÓS3{¤·”„i?iã?ÿ)zãñ#G÷ëq´\UU‡Ã¡º MëvëÊi)B(!!AaµµµH$"–ñç É¢£££££åÛíÞ½{÷îÝJû_ºtéÒ¥KɬôAI˜†„„h¾M200³³{{óæO»ºîQ]‹ÚR]‚¦u »´ð†éåË—-ZÔ{ýG}´wï^Í×H÷§0 ¦ª9y2ç“O.Κµ:3ó=ªkäëi㙩¯¯¯ììÐ’>>€JKû!t÷îÓgÏZ¨®¯[Ø­Cã¢mè]˜VV6Ü»÷!Ä`\¸ 8s  nQ·^æÚÓ»0½té##BH"‘ž?Ï£º@>ÝzhCïÂ49ù'±X‚Âq¼´´®¸¸–êŠÉàÌPB¿Â´¨èÙãÇM²ÇFFŒK—~¡´"@¾.aœ™ÍÓ¯Aû.Ü166 ŸSG$’¤¤ðþõ/ßÞßnt× @UUUQ>°Úõ¼(I(d¬’ÒôߣžŒw¦ç/O)ÇSRx²$%TWó Ÿ¾ü2—ªªéºEݶ#mUlœŸŸOíÀê©t~3*®GA‡úœÆ”ôa¼³…iAÁ£úú6…•FFŒ‹ï@˜Ò‰êãLûšODsJÿ‹~~I…Sü¿Än¢¸0㥗ek::z,-GPQ ™vNt‚Š¿@¿|ˆŽp…ÿm3ÝjJ¤Ò—0õ÷YþÇ?}zÀú{SZík¯½vøða¢A~~¾MwwwTT”£££MXXQ3ús>Ë åÉïˆl=Žã½Ñ&))‰ÃáŒ9rÛ¶m‰‰‰l6ÛÂÂbëÖ­ò]µ´´ˆÅâ~vjÀ‚ë%{û-—.ýBu€|~_ú­ˆYAuÈÍÍ ™4i’ÂúqãÆEDDÔÔÔ¤¥¥ÔÖÖ"„–.]ÚÜÜœœœlhhØÓÓ3qâÄõë×WVVÖÖÖž:uÊÄÄD à8ŽòòòÊÍÍýôÓO]]]óòòÊÊÊüüüqŠŠâr¹¹¹¹ÅÅųfÍB544ïš4iR~~~QQ‘···¿¿?±’xU¾Û®®®ëGñx<ù5J«={öìŒ3ˆï¾ûîºuë8àââ’ŸŸ_\\ŸOœþܹsÇq‰DB„qZD´)..–˜””ǧL™’@4¨®®f0ÎÎÎ111ÄÊ»wïÊ¿ëìÙ³ÄúÂÂB„Pkk«BZݪRï0UZmKK “ɬªª’H$l6;''güøñçÎ#š=xð€(j˜*=DƒììlÙÁ”_V(ûñãÇÛ¶mãp8+V¬¸}ûvï_å€ þ8&ý¼Fc¦t5ëÓYïÄ¿Cm —/_¶µµÝ´iÓÇûj“””dggÇårW­ZuóæMÇBõõõÄ«DX_ùGK}}}?~œ’’boo?{öìêêjôün ŒOEEÅÁƒ=ztåÊù— Bl6ûâŋĿd©TÊçó'L˜ÀápJJJˆfeeeòï*//'JKK‰·+TEt«Jý½õUmpppjjjrrrhh(†a§¢¢‚x‰X•A„]UU•Š[ìë¨þv™âââ[·nµµµÍ›§üûbl€à ¡XhÌ xÖ¨©S§~÷ÝwYYYÕÕÕ/¼ðBxxø;wÚ¸»»GFFr¹ÜéÓ§ã8Îd*ùž‘Häáá1~üø‡®\¹!ÔÜÜ,ß`åÊ•QQQeeek×®3gBhÅŠ»wï¾yófii©Âó–½{÷òx¼‡nܸÑÏÏÅb!„zÇ¥*õ#„:::Zž“H$}Uëïï_PP””†ZµjÕž={x<^IIɦM›de°X¬K—.µµµíÛ·O~+}¥9±^éP@ ˆ÷öö÷ôô,**Ú¿ÿ üI_§¬ô—ùt5uÇÔ—v¨}3M8.U¥aggç‰'fÍš¥°þÚµknnnL&ÓÅÅ%11Wv›‘‘áäädbbâåå•™™¹páBâAz~­* ###9޹¹ùÂ… ‰G+à½÷Þ#žæÇÆÆ"¹K渺ºZXX,[¶Œ¸¥àããÃd2›ššð>.ûª_!Fx<^_Õâ8¾dÉ’©S§ËB¡0""ÂÁÁÁÊÊ*44T¶Ë±±±vvvÖÖÖñññ²šû*O¶^éÀU¾ÌOOO ËËËëë×7`yXïã¢Øì÷þûßUK–¸S] ÙøÆ¯öZýÑk©qü_ÐOä¸AjÜ Ù0 ãñxÓ§O×ü¦<<<¶oß®ùMk\æZŠÕS@R\*–ŠÕ2k.EL;äñ52E~ç€àž) ±DŒ2b‘ß5f€¦}N~·€FàÌЇH"Bj Sa èƒSC¸Þ€0ôg¦€B¦€>ÄR1BÈÈÂPÂÐÉ—ù=uäôô„) 2/óóÐ%gÔü3 ]ýa 胴¡Q¢6t3 ù²ú eýa 胴ËüŸ· I7z%Fçf3‚A$€>~¿Ìæ¨'©¨â ò¹³™€A3S@¿?ÍÎe~O-âm@.kÇŸ´²€~€0ôA¨ŸÖ!cK4íKÒjzÂÐÇpڠ yœ@†#È, è¸g èc¸Oó,Ðüdô œ™ú€“ A˜úøý2Ÿ×[€¦€>HxšÀPA˜úID†Á|€¦€>DÑ “T*PO-@ï@˜úKă ÓÚïÑ·QwÚ*zÂЇH"ÄgI{êЭ0dý 2µWgQ@_ÀÝ%}tøðá¼¼<ª« _µq5Ó˜¤Jcw»ºµîÛÒ»[¿P©=µf̘ñþûïS]è„©>ÊËËËÏÏ÷ôô¤º’9„*6.¬³{÷š¯H¢gùùùT—aª§<==SRR¨®¨DÅsm@-øß2h?S „)ÂHa $ÖÓü¼¼¼Ã‡“UŠ&™›Û=z(.N÷>J¨ã 1 khh°±±¡ºÁQSÙ:z4À0 ëÌôéÓ§©©©d•¢I/½TÇbé^’æççÓr°=4@Â8S®¨1”7Ôð9-Oñh¹SÁ=SÐ7cÆ 333''§S§Na†²µµmll[¶l±³³³µµýòË?¾~ðøøxÙ‚ŸŸ_TTñR}}½‘‘QEEEtt´³³³••UPPPSSBH*•FGG»¸¸Œ1ÂÓÓóæÍ›D²Í‰Å⨨(GGG›°°0â]D›œœ.—{úôi…âúßbejjê˜1c¬­­¿øâ „Paaá¼y󬬬LMMÝÜÜΟ?¯°¡˜˜˜Þõ÷s4ÒÓÓY,VpppSS“üNõ_?Ð=ø0$''³0(ëgܸq555iiiµµµ¡††Ç£¢¢¸\nnnnqqñ¬Y³dëãââ***d ±±±“'O&zûꫯfÍšuôèQWW×¼¼¼²²2???¢ŒÏ?ÿÜÑÑ1''§ºº:**ÊÚÚZ$á8.ëöÀ...ùùùÅÅÅsçÎ  úDyyyåæævuuÉÊÎÍÍ ™4i’*»³téÒæææäädCCÞžž‰'®_¿¾²²²¶¶öÔ©S&&&@~CŸ~úiïúû:¡I“&åççy{{ûûûËïT_õù÷¨aªK4¦VVVGŽ!–ù|¾X,–³³sLL ñÒÝ»wåB^kk+“Éüí·ßp÷ññ9}úô”)SˆW««« FggçäÉ“O:E¬”J¥|>_*•âr¹3~üøsçÎ {öìääd¡P¨ÊîܹsÇq‰DBl«¥¥E,mŠ‹‹åc‘ØÒúû:¡³gÏë ‰²ÂTV? Lu\æƒ>?~<::zìØ±«W¯.**b0²—jjj&L˜@,Ëz³°°X´hQZZÚ³gÏ~ùå—   ÊÊÊåË—c†a˜ƒƒƒD"©ªªzôèÑĉ‰·`Æb±ˆËa™§OŸº¸¸ËÄBUUñ#—ËE]¹reìØ±÷îÝKLLÌÎÎ62Rœ‹Oéîp8„ÁïÿZZZ¢¢¢|||ØlöÚµkåßNlHiýý YÙÄÊÊVèЄ)蓯¯ïãÇSRRìíígÏž]]]-{‰Ãá”””Ëeeeýt’žžžšš`nnÎf³/^¼HüŸœ8 0a›Í®¬¬”½¥¥¥…8U”ß\EE±L,°ÙlâG"9އ‡Ç•+W233ù|¾ê»£Ú>>>|ôèÑ•+Wä_"6¤´þ~ŽFyy9±PZZ*_¶B·€4ô‹lkkûàƒMLLÃÃÃeÿ21 +(( q[¤w¨…[Ô ww÷ÈÈH.—;}útÇ™L&Bˆˆª+VìÞ½ûæÍ›¥¥¥[·n•½%>>žˆEÙÂâÅ‹ûí·cÇŽ­^½!´råʨ¨¨‚‚‚²²²µk×Ι3!ôæ›oîܹ󯵵µ‡âp8ÝÝÝD‡ÄæV­ZµgÏWRR²iÓ&???‹%_êÔ©S¿û¬¬êêê^x!<<üÎ;ªìŽ‘Häáá1~üø‡®\¹!ÔÜÜ,ß@iý} „ÐÞ½{y<ÞÇ7nÜ(+»¯¸ºm8÷T¼g*‘H¼½½_}õÕüüüúúúÂÂÂwÞy‡Ëåöôôà8ŽâñxÃ)CéjÏ5|ÏôÚµknnnL&ÓÅÅ%11Çq&“ÙÔÔ$Þ{ï=âùull,’»K'¿€ãxHH—Ë%nƒ …ÂÈÈH‡cnn¾páÂòòrbåÇÌårÍÌÌ<<<²³³‰7Ê6' #""¬¬¬BCCåï9ö>ò'Nœ˜5kÖ€»ƒþ|û²¡¡!##ÃÉÉÉÄÄÄËË+33sá…ă,Ù†”ÖßÏÑ8pà€«««……ŲeËêëëåwª¯ú‡üûÔÒD˜ÆÄÄŒ3¦££C~%ñ×Ù0Uøw(Û"êãQ )4¦`˜ÈúS„ß—NÐÄe~BBÂÆGŒ!¿’ÅbÉ?Ðèg aRR‡Ã9rä¶mÛÙl¶………ìbJa`£Ò”|íµ×dŸ…ÍÏÏ·±±éîîî«bT lYa´ ŒüzÇ{HTeºHaúË/¿¼ôÒKý·9tèPRRRjjê­[·êêêÞzë-ÙK wïÞ={ölttt\\Üýû÷Ïœ9søðaâAD\\œ···üBo¡¡¡ãÇ¿sçΣGÞ{u+W …Âàà`Ùga“’’¿øâ‹¾jP€??Uø‹üú¯¾ú*&&&11‘Çãõôô¬_¿^Å=´ãøôéÓ©®hÊpNkU¼Ì744¼yó¦ìGÙ¦ù|>þüR¨Ÿ„Ä4âñ®ür_P½_R:x°¥¥…ÉdVUUI$6›““ÓO wÖz¯ì}™¯t@âÐöH.óõü¾t‚&ÎLÙl¶là‘¡òƒlý $477GÏGÈ/«NéàÁQ£FÍ›7/--íúõ놆†3gÎ짆!P: ‘¬=hMü^²dÉñãÇe#Y,ÖÏ?ÿ¬Ð¦Ÿ„Ã××àAâJ?99944ð~jÀq 2[•H$kÚFaúñÇ×ÔÔøùùÔÔÔ¤§§ïÚµK¡Í€ ûÒ{`#B¨£££å9‰DÒ×àAÿ‚‚‚¤¤¤°°°~j`±X—.]jkkÛ·oŸü¦û-H¬W: QÁ°_ '4¦£G¾uë–••Õ‚ \]]Ïœ9Ó{Ö¾ˆˆˆüãK—.1cÆèѣϜ9£bç+V¬ &’- „æÌ™cùÜ/¿üòõ×_;vŒÍf¿óÎ;«W¯^¸p¡¿¿?BÈÂÂbþüùÄó±¾jøòË/£¢¢Æ÷ꫯʶëããóâ‹/*Œè–_¿mÛ6??¿¥K—¾üòËOŸ>MKKôè —{"4XçÏŸ N” ðððؾ};Õ…¨„˜ÏtøÈ’Õ*0 ãñxê~¨-?I¨üé1y¨&_`Èô÷¹GWW×íÛ·¯^½º|ùrªk¡Þ³ˆö¦‹Ã~‰!ýìÔ€ íéo˜feeÍ›7oÇŽcÇŽ¥º:¸qãFhh¨Ï€-uqØo~~¾««ë¾}ûêëë•Ö0`@ÃWó™j˜Ž3pQD—a¿?Þ¶m‡ÃY±bÅíÛ·{Š Œ3Õ ú{f †O•YD{ÓÑa¿\.wÿþýeeeóçÏ_·n‡‡Ç`zƒ0C§Ê,¢½éô°ßâââ[·nµµµÍ›7oh ]A˜‚¡SeQD‹a¿ >>ÞÛÛ;<<ÜÓÓ³¨¨hÿþýƒjèo8÷àž©†iá=S™¾fUø{ãñx}ÍŠãø’%K¦NJ,÷5‡ill¬µµ51I±¾¯IBågDí=)Þë«ÒeÇÓÓÓÃÂÂòòòúÚý Ü3Õ ú>δ/­­]]]B{{•>…¥1º8ÎtPtkدÆhíï È3~ ߢC66o:;yR©€êZþHu jÑÕÕuÿþý«W¯ß_€ÎV˜zyyWú´”“Ssá‚Í+ p||ì µâÿŽŽŽT— YYY«W¯†a¿@w ë2ŸÞÚÚzÜÝwôôˆ ÌÚzäöí~Ó ´"R‡ .u ü¾t<Íï“…3,ÌÓÐ!‘à í￟èí½ïÛo á?€Þ Lû>“ø0 ŽãR)^]Íß°!Ö×÷ðÍ›ý}S<@A˜öÇÙÙÖËk<ƒñûQ‹¥R)^\\ôUPÐñ_Uü¾€Þ‚0ÀÚµ³$’?]× …b„ÐO?U,XðÙÚµçž\ýà|=RöÇ;ÑvêÀàÀ¨Aè=e†aŸ~ìååúæ›§KJôzìÎ ÚÄ—7•ýš¢[PPIu-ZJÜ#ýådí oرœà<è6¸gª^"‘dÕªSwï>½ti³«ëèß øå=ŽÆ cøÿ:Ðm¦j×Ñ! üª¡¡=#c³ƒƒ%ÕåÔÂTš›;ýý¿444¸pa‹§ !¸¶Ò+« k[ZºV¬86€– L5„˵þæ›õee 6ćM SÍ™<Ùþôé5ׯ¿ÿ~"Ü]€f L5jÆ —¯¿^uñâO?Í¢ºÊ<þ±UÜçæ€n;wýââ2ÚÖÖbïÞoGŽ46͉êr4­þ~gÖ?K-Ç™Z¹ÂŽZO@Qà7fÔÕµíÚuÉÒÒ,(è¯T—£9¡ôÇOqgŽrñ…!b€nà2Ÿ[·. ŸùÁÉ?þøÕµhΓµ] b¯‡Ù†ab±Ã°ÆÆÆ!ô0œ÷ „)evî ðõ}!<üÌÏ??¢ºMhü­ëÞ¹º¿þ“m>Ƙ” F\\ÜÈ‘C™¦o8ï@)´O%‘H²bÅɪ.]ÚìâBç›JÅøÅ•¿™2üNNþ„&†ñx¼éÓ§÷ߦ¡¡ÁÆÆF•ÞTl @?àÌ”JÄ7›:8X._~¢®®êrÔèAb}K¥ÀgW!I1 KJJâp8#GŽÜ¶m[bb"›Í¶°°Øºu«*ÝÊ.Õy<ÞŒ3ÌÌÌœœœN:…aBÈÖÖ¶Ÿ yâ½ò-qŽŽvvv¶²² jjjR±H…­åÀÕÛ½½÷Í™óï––NªkQ—âŒÆÂ3µ½×#„üüüSSSB‹-’-———÷ÕBˆÇã 8Ž7.""¢¦¦&--ÍÀÀ ¶¶VöR? d GuuuÍËË+++óóó T±ÈÞ[ú‘: ÂT+Ÿ?aÂmè:S-âååúßÿ®LL¼ýÙg—©®EǸ»»GFFr¹ÜéÓ§ã8Îd2B|>_Å·-W®\UPPPVV¶víÚ9sæ gë@ß@˜j_ßöí[öÙgWNºNu-ºäÔ©S×®]svvŽˆˆˆ‹‹³¶¶öññyñÅ›››|¯¬å¶mÛüüü–.]úòË/?}ú4--mÈ[ÞÞãLµÑÁƒY_|ñ¿ÿügåâÅîT×2D¸Áä½ïÚè_ÿZ´zõ«ÿüg|NN1Õµ Ñ­ƒOo|:œ._¾Œ)¥áNPœ™j)‰DºaCì?þ––öÏ^àP]ÎàTßnÏÜXú·ýÎãÀ„&@_@˜j/@üúëÿ--­»tió¸q¶T—£*±@šúÐrœéüÏÆQ] š—ùÚËÄÄðܹ·ìíG-_þu}};Õå¨êÎ×5Ý|±wäp§†@·@˜jµ‘#™qqkq½þúÚÚº©.g`»îÇ×{üÓÁÌÖˆêZÐ(Smggg‘”´¾±±cÍšÓB¡˜êrú#ã9»Û½4bò2˜ èSàädûö½{Oׯ•H´÷æOoµµ>îñÞÆEÕ¥ qðJgܸQúÆ'BC=¢£ƒ¨®¥O­O£¸&TWà õt—kíìlý†Í˜áBu9Ê1GÁ·Š=úºÄßÿe>¿kûöÔQ£L׬™Iu9€?@˜ê˜Õ«½kjZ>ùäâèÑ~~/Q]àw¦º'2òï7Æe:s¦JsÄÔ @é$‰DºnݹÜÜ’´´º¹9P]†Fé&ÃàØ±7¦La¯XqâÉ“&ªÊvH~»ÐˆKáÿÇ@˜ê,&Óèܹ·­­ÍCCÿÛÐ@͇M:Z}çD¨K{‡¾ 1¦:Ì‚™°V"‘®\y²£C á­Wßn{˜Ö83j¬±9|å¦:ÎÎnTrò†êjþš51šü°©¨Kš»÷‰«¯•£·…Æ6 €6ƒ0ÕyćMùåÉ»ï~#ÕÔíË;_׈{¤3þ¥c­ >¦tàîÎ=sfMf潨(U¿¶h8~íºÿM½çV|Þ SšxõÕ Ÿ{ëèÑkjÝTŒ_ßý˜;ÓÂÕ×J­@·À™},]ú—––®¨¨tó×_÷TÓVp)î4›5a |'aJ+o¾ùju5ÿÃSF2ûûß_TÇ&ÆÓ6Ø«£gt|Šnpߺ5ùâÅ;‰‰ë_y¾… 0¥!‰DúöÛgoÝ*MOß4e ›êrÐ ¦ôÔÓ# ùÏ“'Í›áIjaJ[|~çҥDŽBqFÆ»66æT—ÍÁÐ(Ú²´‘”´^,–¬\y²³sX6vHȪ º‚3Sœ?žêúôìY×Ñ£&Mb­Z5Ô™OqÔqÖ‘éÍ7œÐAjiêâååÅáÀG³€¦A˜’ôúÛ89I…ÂgCîÁ”a.Å%i7‰U©Orrrpp0ÕU½ãLÉÿ€µ„–ÿ ÐÜ3@˜ L€¦@S „)ÂTsÚÚÚ>øàGGGGGÇðððêêjâ% à HÜ骢Ÿ€ö L5D*•þýï¿}ûvjjjUUÕwß}Çd2½¼¼M«¨šÐ~è Ú׳gÏ–———••1!dkkûÕW_íÛ·ÏÐP‡†544ØØØ šî ªƒ3S IHHظq#42,‹ÁøãKçÅbqTT”£££MXXXSS±ð¤¤$‡3räÈmÛ¶%&&²Ùl ‹­[·ÊÄÇÇË/ôVXX8oÞ<+++SSS777b>×^{íðáÃDƒüü|›îîî¾jhll”_&>kdkkK¬ï1 ËÉÉár¹'NœP±b!==ÝÙÙ™ÅbË p0l¡äääþÛXZZfddôÓÇ;pà€‹‹K~~~qqñܹsd¯úùù566¦¦¦"„-Z$[.//Çq<..®¢¢B~èP~'N\¿~}eeemmí©S§LLLÁÙ³gg̘A4x÷Ýw×­[×O Ëò+ÜA//¯ÜÜÜ;v ªÿI“&åççy{{ûûû÷qÕ~¨„) TùlhhxóæMù·ø|>þ<ûÆîÜ9¢ÁƒB­­­Ä«ÙÙÙ8ŽK$…e…Ä”ï_ᥖ–±XL,ÕÒÒÂd2«ªª$ ›ÍÎÉÉ駆þÃtÀLIIÁq|°ýŸ={–XYXX(kÜS@¸Ì×6›]RR"û‘Ïç÷~ÒýôéSb™X¨ªª"~477G(,«®¥¥%**ÊÇLJÍf¯]»–X9jÔ¨y󿥥¥]¿~ÝÐÐpæÌ™ýÔ0Ìär¹ýï£R²Æ'NT½4ÂTC–,Yrüøqât!Äb±~þùg…6§¢¢‚X&ØlÒ¾ÁÉÇǧ¢¢âàÁƒ=ºråŠl}pppjjjrrrhh(†aýÔ€ã8ê;ÎÜA"ýÛyy9±PZZŠH= ŒêSc:@*\ZÖÕÕq8___÷ìÙ³´´´iÓ¦¡?_æïÙ³güøñ?ýôq?ÑÏÏOÖ¿ìš]é²Ò{¦ÙÙÙüçÄb±½½ý¡C‡ššš ‰Ù‹‹‹qomm555e±X………8Ž÷U‹Å:yòdkkëúõë‘ÜexII‰ê;8„þ]]]úé§¢¢¢™3gÊów€:@˜’@ÅÀOž< ³´´433óóó#ÎËä³F(FDD888XYY…††ÊßCì?LBqqq òx<^FF†“““‰‰‰——WffæÂ… 'MšDô³dÉ’©S§Ë}ÕkgggmmMŒ Öûøø0™Ì¦¦&wp°ý#„8àêêjaa±lÙ²úúz²~fÚ'†a:=9t@@€‡‡ÇöíÛ©.D†a<oúôéƒz‹Nÿ.€î‚{¦z­««ëöíÛW¯^]¾|9Õµ ÛàÓ)z-++kõêÕ;vì;v,Õµ(—M@‡@˜êµeË–-[¶Œê* ¸Ì@˜ L€¦àwwï>¥ºt<€"Ç‘#GRRR¨®bXîÝ=aB“)¡ºt„) ©.a¸zz ÛÛM9œªk–ÀÀ@GGGª«ú>BèÈ‘«f¹ºÚ]¿Iu-è$¸g B(-­!TVVWZZGu-è$S€<¨®¨h@© ,S€.^¼cdÄ@ …âÔÔ¸óÀ@˜ê;©OIá‰D¿?Äö¬åÎÇÔ–€.‚0Õw?ýTÑÐÐ.ûÑØØðÂ…;րނ0Õw.ü~O Åééb±”Â’ÐE¦zM$’\ºtGvOhié¹u«”ª’ÐQ¦z-'§¸½½Ga¥‘––¦øe€þA˜êµôôŸ †ÂJ‘Húÿw·§GDIIè(SýÕÕ%Ìʺ'+ù0~Oè‡j¾$t„©þúþû"@ù´&†à™>ƒaª¿.^¼ƒòñù þý÷E —€î‚‰Nô×ÇÏäŸãûúÞ¾ÝÏÇg‚l««™™1¥ {` >ý5y2[a —kýâ‹0C—ù@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂH`HuT:þ<Õ%h—¼¼¼žžª«Ð^^^‡ê*€ÎÀp§ºÊ`Fu ZÄÄ„+5J¥]T¢-’““ƒƒƒ©®è ½>3E}òÉ'³gϦº  uæÌ™Cu @ÇÀ=S „)ÂHa $€0@˜ ô}h”*ºººÎ;—Íçó---§OŸ¾fÍ„М9sþûßÿNœ8‘¬m‘Þ¡–l±ŸcH"ùñLfffãÆ www'w+(a:Ç#""0 Ûµk—½½}SSÓ·ß~»qãÆøøx###ª«Ó š<†GŽquuEµ··_ºtiÇŽçÏŸg2™än€Þà2—/_~öìÙ§Ÿ~:yòd‹åââ²eË–˜˜ƒAuiC7gΜÖÖVÕד&¡©©©¹¹¹¹¹¹½½ýÊ•+ÛÛÛëêêHß ½A˜àÿû_@@€Â©¹¹¹Á‡N"‘ÄÄÄûûûïÝ»·­­X?gΜ~ø!((èïÿûÉ“'¿ÿþûÀÀÀ×^{íøñã²ÿûßÿäz+++Ûºuë’%K.\øæ›oþøã¡ÈÈÈ””¢AQQ‘¿¿¿@ è«Y>Ëĵp@@€BnʯÇqü›o¾yýõ×—,Y²sçNÕ÷hÇpΜ9wïÞ ùî»ïTÜb!77÷õ×_÷óóÛµk—¬qwwwGGGGGGMMMllì¸qã{.±XÜOÁ „éÊÊÊ\\\úo“œœüÃ?ìڵ뫯¾jnn>xð ì¥k×®ÅÄÄDFF~óÍ7ÿûßÿNŸ>‘’’RSSƒÚ¾}»›››üBo»wïæp8'NœHJJ Ú¿¿X,ž3gNNNÎÿ·so¡ì¿qÀ?¿æÔ’C´js¸p*mŽa¥æjÄ0i7’Í) ›–FR”5\,ráPF¸P›.È•\XJ-,ÙäÂFßió¿x~Öš;ü¿9ü|^WÇc{ž÷ÅÇ÷ù~·P«ÕyyyËËËoÍÁ‰F£A­¬¬„„„¼Õ¿²²²±±!‘Här¹ÅbqsEÞe855%‹ ƒ›KÀ¦§§{{{'&&ŒFãÐÐîlmmåp8‡Çã-,,455ýúõëu\¿à .@2(¦.<<<8‚&“ÉÞ¹¹¹YWWG§ÓcbbD"ÑÞÞÞÃßãB***‚ƒƒsrrB•••ö6¾’*..ŽŠŠrl¼699ÙÜÜ–ššúôôd6›Y,ÖÙÙ™Ñh|~~ÞÞÞ.**zg^P©Tõõõ #::º½½}ww— wVä]†ååå)))jµÚ£%ðx<:N£ÑZZZö÷÷ñ`¹\®Ñh4ÍúúzYYY¿Íf{—×Éðøÿì•J½¸¸HJJÂ?®­­ÁårÇÜÜÜDGGã6n †ò÷÷G/ÇS9¶Ýg2™æççONN®®®ì'¦§§ïììÄÅÅùúú¦¤¤¼3/\__Ëd2™Lfï1 øÝ½X‘Ë #""л1þ•}pll,ìøÛ€€@ R©...h4šS\n¥€' ˜ºÀd2U*UII ¾ÁG¡PŽÆ„‡‡ëõz¼OÇ»]*•JÖD"ƒÁhhhHHHx~~.))Áýùùùëëë:®°°ÐÇÇç9àSjÍû¨Tjcc#“ÉÄn6›)Š×Kp™!.Çž.A¯×ã²xyy‰þ–¹ÕjE/ß).¯×À[`›ïŸÏ¿½½íêêÒjµ···»»»J¥Òi ›Íž===½¼¼ÍÎÎv³ôlmmáªao ‡G(&“Éf³Y­V¼óÕét¡ûû{„‹ÅÒjµjµoZßš…BÁ[๹9Ç·Æ/òîg³Ù333Z­öêêjxx¸µµÕ“Ìœ¹“¡KÀƒu:ã`{zF£Q¡PÄÇLJ‡‡¿Ž ÒÁ•© ¡¡¡ããã …¢££Ãb±¤¥¥I¥Rç8¦ªªêññQ"‘‘™™)‰Ü|ñîî({!äX¹äry[[ÛØØØôôtbbbmm­ÙlîééQ*•éééz½?ÛykB¡P.—+ ¡P¸ººŠ;SSSÁÒÒRPPã|ìý< ‰Db2™’““ûúú¼Í!÷2ôt ¡ÒÒR™Lvww—‘‘aÍÞðóóKJJ’J¥ø:Ô).H÷ÓOÚÿÖ‡C‹Åb:^]]ýÙù^|qË£¸ à¤}à¸2ý–‚8???:: …Ÿ=—?;;;_÷×ÔÔ‚Ÿ£/ø÷@1ý–ù|>~þdeeáOª~ Þë Æþ=PL¿¥ÜÜÜÜÜÜϞŷqOó€PL€PL€PL€?ýÔââ">Ôþ]LÎ+ÀŽËåâóSpÓþî™  ˜  ˜  ˜  ˜ þŸDü³öéšIEND®B`‚glom-1.22.4/docs/libglom_reference/html/tab_s.png0000644000175000017500000000027012234777145023134 0ustar00murraycmurrayc00000000000000‰PNG  IHDR$ÇÇ[IDATxíÝ ‚@@Ñ£?Q…¤"š¢%¦I‘—Šf–6[´HÃäQƒ<Þâõþ]ždr Í’s?ˆO=Ñññw'ÌF‡Ž íðö-~rÃ[œèŠ­ì¬mƒÖ¬ƒݯнŠÕF)Yº% §`nÌ,9B ™’©!ÑŒ\ý<Å#üîî•IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Summary__coll__graph.png0000644000175000017500000005174012234777146033022 0ustar00murraycmurrayc00000000000000‰PNG  IHDRij>ð1bKGDÿÿÿ ½§“ IDATxœìÝy\gþðgG@Äp‰„Að¦-]]ŠPñXÜ¢àÊU<+­G]­­Ý‚–ZoYuµ­Ön<8 È¡Òþ@][DT°¡/,·È}Ê•s~LMÓ À$“L¾ïWÿ&Ožù΀ŸÎñä †ã804zTta $€0@˜ L€úT´C]]]aa!ÕU„²¶¶ž|8…U ¨)gsóçÏ700ÈÌÌ”®¹xñ¢¿¿¿ú+ 7¦€L<oÚ´i&&&QQQ†!„¬­­ø|þæÍ›mll¬­­¿úê+é[0 ‹‹‹“]èÉÐÐÐÏÏ/%%…øñÞ½{UUU‹-Âq<22ÒÑÑÑÂÂ"  ±±!$‘H"##œœ† æîî~óæM¢si%"‘(""ÂÞÞÞÊÊ*$$„xÑ&;;›Ëåž:uª·LKKspp`±XþþþuuusæÌ±°°066vqq9wîœÂ㠰Ξ`@¾vÃPBmmmVVV¿ÍÆŒV]]ššª§§WSSƒª¯¯Çq<""‚Ëåæää͘1Cº>66¶¼¼\vA¡ÌÌÌáÇwwwã8¾k×® à8~ôèQggçÜÜÜÒÒRÇ¿øâ {{ûìì쪪ªˆˆKKK¡Pˆã¸t‹û÷ïwrrÊËË+**š={¶ŸŸ± „‡‡GNNNgg§ÂBS¦L¹{÷îýû÷ÝÝÝ,X0~üøuëÖUTTÔÔÔDEEñùüžÇ!""¢g²rrr‚‚‚&L˜Ðï~ðàÁƒúmÔÂ(EÉ0µ°°8rä±ÜÜÜ,‰¤æèèM¼t÷î]éz% …BKKË‹/â8þ—¿ü…èjÒ¤IñññDƒªª*ƒÑÑÑ1qâDâdÇq‰DÒÜÜ,‘Hp™0;vìÙ³g‰<@µ¶¶ ’““û¨!$=wîÜAUTTˆD"bMQQ‘trÇaüøñ=ëÄq¼³³óäÉ“®®®3gÎLJJýSa ”¢d˜&&&ÚØØp¹Ü•+WÞ¼y—‰0&“™““C4#% (Lq_³fÍòåËŸ>}j``ÐØØˆã¸±±±Ü•VQQ‘±±±tC²d+¹qã†l%>$ܾ}»BÏž=#–;;;BáááÓ§O·µµ•=Ý–; ë¼té’µµõÆ=z¤üA€0ÕXpÏÉÛÛûÉ“'ÉÉɶ¶¶3gάªª’¾ÄápŠ‹‹‰åÒÒÒAtôý÷ß§¤¤Ìœ9ÓÂÂ!Äf³/\¸@ü)'¡ãÆc³ÙÒwµ´´ˆÅbÙ~8Nyy9±L,°ÙlâG=½~þEH+/**Â0léÒ¥ååå|üøñåË—{;8Ž÷¬“Ãḹ¹]¾|9##£¹¹yhÊbh%ÏL6oÞ\]]’’¢¯¯O<=/..Æq|çΣG¾qãFqqñ¼yóÐï™â8.‰lll,,,¾ýö[bÍÎ;]\\x<^IIÉ»ï¾ëêêŠãøž={ÆŒ“““S]]}ðàÁaƽxñÇqi%»wï;vìÏ?ÿLÜ3õññ!zCñx¼> @½ñÆ÷îÝ#î™ÚÚÚ:t¨±±±  € [TTÔó8lÚ´©g„²²²>úÈÎÎnõêÕ¿üòK¿GÎL5„)PŠ’azõêU&“éä䔀㸗—“Éllläóù~ø!ñ4?&&F¦¡ØØXÙ…>lذÁ`ÔÕÕ? ‚ððp‡cjj:þü²²2bågŸ}ÆårMLLÜÜܤeK+aaavvvÁÁÁÒ» Ê„i||¼¹¹ùÒ¥K›››ÓÓÓŒŒŒ<<<222æÏŸOÐP,Kºljj*ûãýôÓOàØ±cï½÷ŸÏ722"«g ËàÌh ÃÒÒÒY,V```osƒö!))ÉÏÏoáÂ…"‘èÊ•+½5S8í©ÂÉR¥ZZZˆ‰²€‚0ÚçÓO?MLLÌÍÍ}þüyhhè€Þ+ ÏŸ?dllìíí-ι§C‡%&&¦¤¤Üºu«¶¶öÝwßE=zôøñã§OŸ.))™;w®¯¯¯lzæåå9;;ïÝ»·®®nÐ{´ÅgZBÉÏæ«úóGæBgΜ!– ÐËÙH•”‘‘aaaAÌkffFL8-»!bAá´§½M–*õäÉ“­[·r8œåË—÷=¡ßàÀgó5œ™íãääD,Œ?!TYY©ü{“’’ššš 1 [¾|y[[[oWúÏž=“nˆX¨¬¬|üø1±Q„†a,‹øB).—»oß¾ÒÒÒ¹sç®]»ÖÍÍm€;´„)Ð>eeeÄBII ’™´_àÂ… 111Ò¡óæÍë홾ÂiOû,•PTTtëÖ­¶¶¶9sæ(½[@»A˜í³gÏ÷èÑ£ 6øøø°X¬¸¸8ÙŒëÍ¥K—D"Ñ’%KX/¦§§ ‚žW®\¹{÷nW\\¼qãFbCï¼óÎŽ;nܸQSSsèÐ!‡#ûÔ|>?..ÎÓÓ344ÔÝݽ°°pß¾}dî9ÐdTßgÚA£î™îß¿ßÙÙÙÌÌlÉ’%ÄܦH‰¹Pq –]ÓÐР¯¯ŸžžŽ÷¸gªpÚÓÞ&K%¤¥¥…„„äææ’°Û½€{¦ æ3JÑœùL1 ãñxS§N•[™’’²dɪªR˜ÏTcÁe> Y“‡:99yyy‘Þ-ʃO@* bòP…í御æ$êg¦@S „)ÂHa t‚P,¤º@sð4 €–N†„ãøîË»·{oWþ-…¯Ù½f7ÂNuU LÀª± LÁR]Â`äWçŸÎ;ýûèaÊ^Š5T7ÌHž6-Ì“ã©ÒÚÁÚÚšê€ð (@3ÎÌ.ÎÎÈŸ2zŠ’oév±6±bÁÆY2Ô7Ti…€àž) ¹;Oïdgcv½øºòï260öpòÀvüÚñ©{§–×—«®B@¦€æv¿[_Oðý8 7.pY ¯§/–ˆ=4ñ³‰'®ŸPQ…€ L×_¼{Q$I$’ëÅ×%¸Dù÷Ι4‡ ’ˆbÁºØuK£—¶óÛUV,Ðn¦€Î]>¤¯÷ûSÖüª(ÿ^W{W–É_‰Š#<™—üêÎWï>»Kr•€ LmU·VŸ¹uF:ÂTŸ¡Ÿ]œ­üÛõ0½¹çê3þñ" Ÿ5>ûëÞ¿~ùã—$× ´„) ­£?ÅуUpP˜"„æNž+7ÜE$ ÅÂ’>òýÚ·¥³…œB-ÀÐ(@O­]­vÿ²ëàwÈ®471oü¢Qî+ðúPV_æ¼ÍYáKú }®÷↋.v.C­Ðœ™z:yý$_È—[ÙÜÙ\T[¤|'NÖNv,Å‚Âq¼¢¡"./nð%z04$ ^>(ÂErëzŒ6E-|m¡Ã@n¥>CßÑÊñVø­È%‘C*Є) ¡øÛñ í HѬì¢Ý63iŽHòG(3ô¶ÌÝroÇ=÷1îC¬Ð |6Ð Žã.Pø’X"Î*ÊPo›ð7 aă,†Á(³Q/ø/¼Æy“P+ 83t“ù ó·šß0 3Ò7êy…^ÝZý¤ñ‰ò½±LX.v.Ä÷ñ½ýÆÛ÷vÜóžì½êôªºZ9PxšèæYÓ³‡ÏÖ´ÕT6WÖ¶Õ^,¸Ø-ìÆÖÔÑD\°Ç¬ŽY>m¹ò†§†GߌŽ^½èµE¡–ΖWv¼2Õaêù÷Ï«j€‚047ãàŒWì^9r ÇñÚ¶Úš¶šáÌáNÖNÊ÷PZWjnbnij)]såáï/½ãBãBÞQAÉ@+Áe> ¹Ú¶Ú‘ÃG"„0 5b”«½ë€’!ä<ÒY6IBó&Ï[í¹zÃw*›+ɬh3S@sumu#ÍF’ÞíáÀÃ#ŒG¬>³®íÂÐ_Äoéj±1³!½g3c³S«N]}t5úF4éma è¬þE=ŽãÄe>éfO˜ýÏYÿÜœ´¹¬¾Lýía èŒÀ¤ŠË|Bä’H;–ݪS«4S* %S@gumu!›áä_æL Mή>›[ž{ô§£*ÚЦ€ÎjÛj™L3c3ÕmÂ}Œû¿æÿ+<5üáó‡ªÛ Ð|¦€Îê^ԩ膩¬‹vŒ³·òÔJéDÔ@A˜:«{Q§ŠGùrŒôή>{¿êþÁËU½- ± LÕ¶Õªîé“,W{׈·"v~¿ó^å=5lh S@gumê83%lýûVW{×§VDõlhS@gê¹gJÐ×Ó?»úlqMñ®v©g‹@£@˜:“~0_=&Œš°gñžgþûvÅmµmhS@[8Ž×¿¨WÏ=S©Ís6{:{®<µ²KØ¥ÎíÊA˜ÚjîlŠ…j»gJÐÃôN¿súyËóOϪÎíÊA˜Úªm«E©ó2ŸàhåxÀÿÀ—W¿¼VtMÍ›‚0´E|0_Íg¦„µ^kçOžÿÎéw^t¿PÿÖ% Lm5´7`&7¯³z`µ2ª­»íãäÕ¿u@ S@[ífL3}=j¾‚—Íbôʼnë'2îgPRP3S@[MM”œ–J-Ÿ¶ÜŠÿ{1ï5u4QXPS@[MMÃ,¨­á›e߈%âM ›¨-¨„) -MS+S«o—;>9?™ÚJ€ªA˜Újêh²Fåe>Á×Õw™û²÷ãß'†jº‚0´¥ g¦„c!ÇŒ ×Ĭ¡º B¦€¶;5$LGˆ^ýý½ïcrc¨®¨ „) -Í93EÍ4÷½éïmJØô´é)Õµ•€0´¥QaŠ:xØz¸uè™PÇ©®ÂÐS§ ³[Ø­  ¤† ;óΙ¬¢¬o¯Ku-€|¦€žˆqòufŠòtöÜô·M'\RWBu-€d¦€žÛ‘æ…)Bhÿ?ö;X:¬:µJ,S] „) 'â̔ړ*d¤oÃ{ÌûâêT×Èa è©©³ Ã0ssª Qà/Ü¿„y‡}zþÓU¨®ÂÐSc{ãã =Õ…(öù¢Ï]ì\VœZ! ©®ÂГ¦‹’£¯§³:æQõ£ýû©®ÂÐSsg³F‹êi{ÒvŸí»Øÿ8ŸêZ L=5¶kÊgIû¶ Ì}ŒûÊÓ+»…ÝT׆ ÂÐSKg Ë„EuýÐÃô¾]þmy}ydf$Õµ€¡‚0ôÔÖÝfÆ4ë»M@@FµÉv“»¯tï\±“êBT+ @=¿w Qóõ8¨Ú‹îÙÃûmæîîþᇪ¡]väȪKPS@OJ†)‡Ã TC=º,9Y'¾e.ó=)¦ÂЄ)P3S@O¦@Í L u »D„)P'S@C/º_ „ L:ý)LÏ;Gõp4@2]ß×UaŠaXCCƒš7J …<ùùð9×P04*))IýuUБñ}=Á™é@577 æææYYY®®®¡áÃဂ0…aw´¡#ãûzú=LT•†Õ××[YY©¨õoŽÅú㣷¦¦¦²?%Á=S@Cäž™òx¼iÓ¦™˜˜888DEEa†²¶¶nhhàóù›7o¶±±±¶¶þꫯ¤oÁ0,..NºàããA¼TWWg``P^^éèèhaaÐØØˆ’H$‘‘‘NNNÆ sww¿yó&уts"‘(""ÂÞÞÞÊÊ*$$„xÑ&;;›Ëåž:uJ®øúúú¡ì;†aiiiŽŽŽ,+00PºEЄ) ¡Ý/z CRz ž1cFyyùáÇ׮][SSƒ"N÷ìÙsþüùÔÔÔ›7o¦¥¥Ißëéé)] ’¾š’’âé陑‘Àãñº»»×­[‡:zôèñãÇOŸ>]RR2wî\___‘HD|/4±¹C‡%&&¦¤¤Üºu«¶¶öÝwß•nqÛ¶mß}÷ÝÛo¿-]sãÆàà`//¯!îþ§Ÿ~š˜˜˜››ûüùóÐÐÐ!öFg¸ ân)èÂßßßßߟê*(pòúI³fý6SòøXXX9r„Xnnn‰D¡úúzÇ£££‰—îÞ½+]/§µµ•ÉdþöÛo8Ž{yy:ujÒ¤IñññÄ«UUU £££câĉQQQÄJ‰DÒÜÜ,‘Hð—aŠãøØ±cÏž=K4xðàB¨µµ•hœœL¬ïììþü×_ ¨¨¨Xºt)ñÐÜÎÎN,WVV>~üxüøñÄ[0 c±XÄ5¾Ô³gÏœœœˆeb¡²²’ø‘Ëå"„._¾aŸª½à“¦®®®ááá\.wêÔ©8Ž3™Lôr,ÑòåËwíÚuóæÍ’’’-[¶HßGÄ¢taáÂ…¿ýöÛ±cÇV­Z…Z±bEDDD~~~iiéš5kfÍš…zçwvìØqãÆšššC‡q8œ®®.¢Cbs+W®Ü½{7Ç+..Þ¸q£Üc÷É“'ÿðÙ™™UUU¯¼òJhhè;w†¸û{öìáñx=Ú°a±EéN?‘½æWòž©X,öôô|óÍ7óòòêêê Þÿ}.—ÛÝÝ÷¸ç2tÍ/!„²²²ˆeâÆ<)†X0Rt›¬ï>I?D½Ñ‘{U=­];ûÐì~›)y|®^½êââÂd2œœp÷òòb2™|>ÿÃ?$žæÇÄÄHÿB±±±² 8Žq¹\â6¨@ çp8¦¦¦óçÏ/++#V~öÙg\.×ÄÄÄÍÍ-++‹x£ts ,,ÌÎÎÎÂÂ"88Xú‡§ð/ª££ãĉ3fÌPæˆI¡÷L÷ïßïììlff¶dÉ’ºº:¹R†Žü&L£££GÕÞÞ.»RpªK õÜoð)|¤Ðwåôßþ‡BGþˆ{ 9â{Ì·ßf:{|”§ð/!”’’¢|':rœs™¿aÆaÆɮd±X²7æû—˜˜Èáp†¾uëÖ„„6›mff&½D’ ×GÒ±u›6mš3gŽ………±±±‹‹Ë¹sç¤ ¾ÿþ{‡caaqìØ1b¥Ü˜Aio=;‘â§°!--ÍÁÁÅbùûû×ÕÕI×ã8Þs,¡Ü.Hûï­q¿G ôSF)téÒ%…7ͤc`•äää4ôW4$›¬Jž™š››§§§÷ö*BˆÇãíß¿ßÉÉ)//¯¨¨höìÙ~~~ÒW}||RRRB ,.W:±±±ååå² r=Ëþèáá‘““Ãår×­[WQQQSSeddÄçó‰óçϯ­­MMMÕ××'îBŒ3&,,¬ºº:55UOO3ÈãñÆß['Ä™c ¦L™r÷îÝû÷ï»»»/X°@ZêÑ£GsssKKK}||¤ÿsFŠÎLûhÜ÷냎œô4óàÌõqëûm¦³ÇGÍtä8&LõõõoÞ¼ùG/577ã/“¢qÄ â1¥ìr¿—ð=Ô[×ÒÒ"½…ZTT„dî[?^Ú?±Rá˜A×G'ÄB ¤÷¶ˆ›ýMMMDŸ Ç⽄i}Ät丧)»§|’òI¿Ítöø¨™ŽçÁ\æ³Ùlép"Ce‹úgjjŠ^Žä]bl]KKKDD„——›Í^³fl;;;¹þ{3ØG'ý6pvv&&L˜€ª®®&~T8–°·}é£1‰GLG´uµÁe>P³Áü›\´hÑñãÇ¥#àX,Ö/¿ü"צq$"2ÅËË«¼¼üàÁƒ?¾|ù²l¹1Ϩ÷1ƒ}tÒoéâ¢" Ãìí퉎%ìm_ÔôÜ¡Q(c0aúÙgŸUWWûøøäççWWW§¥¥íܹS®M¿âzÓs€^¿„B¡››Ûرc=z´bÅ ôòB[!…cûî„•ÕGƒðððû÷ï?xð`ýúõ҉ˎ%ì‰è_ÉÆ@ä~J=Ö¯_aXzzºìJéd›¬d¯ù•ÿlþÓ§OCBBÌÍÍMLL|||ˆsOÙ{¦Ê ˆS¸Œ ÐëÙ^öÇôôt###ŒŒŒùóçO˜0¡gÿD =Ç ÍzëD:į­ÄÇÇÛÙÙ™››/]ºTî ôK(W˜ìÂ~÷¶Ü¹W%G$aïaçxçúm©9ÇG$Y[[=zÙ²e²ëeÿ]¨gl²*hÎqV)˜è„ÎtäXNkg+zeÞÏì·¥æŸ+W®Œ1"))ÉÌÌŒvB€0Õ"ðÐÍ ¾öM³Ÿ””äçç·páB‘Htåʕޚ)¾­pT)bŠÊwÀD'€~´î;K„Báùó烂‚Œ½½½e?"Gá|¦ gA•¾%//ÏÙÙyïÞ½²'ªa 覽»!djdJu!ʺzõ*BhΜ9¡Å‹§§§óù|…-O:µ}ûö7Þxcܸq_}õÕ… ÚÚÚ¾ýöÛÏ?ÿœ´·k×®ÒÒRÙÏ"z{{_¿~½££cÊ”)+V¬øùçŸÕ³S:ÂÐM—° !DÖ4ûj””ÔÔÔdhhˆaØòåËÛÚÚz»ÒW8|»ßYP¹\î¾}ûJKKçλvíZ777Uîî‚0tÓ)èDS]ˆRÁ… bbb¤³£Í›7¯·oBT8|»ßYP EEE·nÝjkk#Né LÝt ºBÆÚ¦—.]‰DK–,a½˜žž.z6V8|»YPB|>?..ÎÓÓ344ÔÝݽ°°pß¾}jÜ?¢à«žuÁãÇ júž^ f]Â.†ÃPßêB”’””´páB“?nJøùù­[·îòåË .”kÖÞÞ¾xñâ®®®yóæ=z!ôÉ'Ÿðùü¥K—644¸¸¸üðÃÄgŽ ™™™ÿùÏÜÝÝÕ³G:KA˜öñ0‘6¾ù¦pÙ²±Ã‡õëq4\ee%‡Ã¡º uëtiËi)B(>>^n¥¥¥P($–ñ— I"#####eÛìÚµk×®] û_¼xñâŋɬôBA˜©¿uÒÓ3±±yoÓ¦÷¨®Eåüýý©.AÝ:xÃôÒ¥K ,è¹þÓO?ݳgúë¤ûS˜RUŠÚœ<™ýùçfÌX•‘ñ!Õµòu 5ñÌÔÛÛ[zv hI@¥¦þ‚º{÷Ùóç-T×È×%èÒ¢qQ€6t.L+*êïÝ{†b0ôΟ—Ÿ9Ð@—°K/óíé\˜^¼ø«!$KÎãQ] Ÿv=€´¡saš”ô³H$Fá8^RR[TTCuE€dpf (¡[aZXøüÉ“FécÆÅ‹¿RZ _§ ÎLúéÖ ýóçïê ¿Ï©#Š““yÿú—wÏo7Úk@ *++)X­º_Ç0VJhúïQGÆ;Óó—§ŽãÉÉ£ç"‘äÿþï®P¨`>] 4wœé‹bt鯨ø8B8BÒ¿7\ãÓƒ®<€òò'û”é“OÎ-]:íµ×ì¥kÚÛ»Í͇QQ ™fNt‚оD¿~‚Žp¹ÿm3Í,jJ¤Ò•0õõ}]öÇO>97}ú¸E‹\©ª¨N'_æà4£¼PTu)˜5 CVo ­ù"UÐ] S #pïukШæ”óÔùLQ’"¤§Ø &9ÚHWî™Áñq× Ë|{dþ:ÂÅHá§ì$B4jžÚk*a h…øžg ºÌ7²DÓSÑ›ÉHÒëñ59†æÈr*eòA˜Zùý{ž5çÌ”`¿-ü ˜ŒÌù)F\ãü4a hå÷ïyÖœ3S)Q;zQŠØG &Ò#žUH­7ÅUò@˜Z!.ó5èA"D7Ë͸€æÿŒÌÆ#„!G£æP] „) •ßÏL5í2ÿá>ÔVŒ<â¦X¯ ï_Ф!Ö«ÈØ–êÊi L­hÜ(„Pãmô`zý2óû=#äúoô·)- ÂÐ qfÊÔgR]ÈK¢N”» ÙÎCc×É¿ddIEA@U`Ð> ¾ˆbhL˜ÞߺkÐì+ðÔžö L­ðE| à =FtRÅ)šLìûo ´„) H`À0Р/õ2ÌÆS]P¸g h…/âéQ]ÐE¦€V LU L­DC}Cª«ºÂÐ œ™ª@˜Zá ùŸ™V_B‚f* 0´" ¨<3m-D×£ò3”¨a h…ÊË|q7º€¬¦¡ñPS Œ3´Bå¨ûŸ£®j4ë2ÂàEÁoÐ eg¦uÙèÑ!ô—#È„3¸0 khh ·(•v›ŸŸOz·µÅ‚0´ÂR¦Â6”÷²_‚ƬT÷¦Æ€0´"Sq™ç#$êB=®î홊Î[ÉÒ[yšY6„) jÎLGÍEoœDFV½½^__/·†ÇãM›6ÍÄÄÄÁÁ!**ŠX™’’2jÔ(KKË/¿ü!TPP0gÎ ccc—sçÎÍ0 ËÎÎær¹ÑÑÑ‘‘‘ŽŽŽ!>Ÿ¿yófkk믾úJºE ÃÒÒÒY,V```cc#1ƒµµ5LÒnO:Õoý=)¬ö­·Þ:|ø0Ñ //ÏÊʪ««+""ÂÞÞÞÊÊ*$$„¨ý9‰e¹òdwDºÇñžG€h“˜˜Èáp†¾uëÖ„„6›mff¶eËÙ®ZZZD"Q;Õoƒ?Áu’­íæ‹¥º @>Ÿ¯|–G/§ºŠ?äääM˜0Aný˜1cª««SSSõôôjjjB‹/njjJJJÒ××ïîî?~üºuë***jjj¢¢¢ŒŒŒø|>Žã!œœœ8;;çææ–––úøøøûûã8ÁårsrrŠŠŠf̘ª¯¯'Þ5a„¼¼¼ÂÂBOOO___b%ñªl·ýÖâñx²kV{æÌ™iÓ¦ >øàƒµk×îß¿ßÉÉ)//¯¨¨höìÙ~~~Òe+‘Ö,»RºEéú£Gö<DŸ†††””„Ђ ¤ËeeeÒš333G½gÏžÚÚZ…¿¾~üé˜ôÛ‚– LéjÞ‘y¡gB©®ïììñh…Ïçøá‡ÄÓü˜˜$sɼÿ~ggg33³%K–·¼¼¼˜Lfcc#ÞË%poõËÅÇë­ZÇ-Z4yòdbY „……ÙÙÙYXXKw9&&ÆÆÆÆÒÒ2..NZsoåI×+<¸Ò—ùiii!!!¹¹¹½ýúúm ëy\t›ýáÿ»rÑ"Wª $ûéØU«>}ëSn£ùWtÙyÄ!n€ ·B6 Ãx<ÞÔ©SÕ¿i???77·mÛ¶©Óê—ù€V"Ï%êD7ßF£æ"®¿ ·B·oß¾råÊÒ¥K©®Eå`¢@+*U†ÍÈý”Ö}u3%× ™™™«V­Ú¾}ûèÑ£Õ¿u5ƒ0´ÂñUøêy&*þy¥!æHUm‚^–,Y²dɪ«P¸Ì´" Tuf*hB·ßEKÇO%ý-a hE…C£xž>úë1•t´„)  .ID*™5 — ¦ rûŒ ¿s@ pÏЇH,B0 ÈïÓCS¾ ¿[@#pf èC("…)ý0ôA„©¾\o @˜ú€3S@!S@"‰!d a (a èƒäËüîZrúºÂЙ—ù ¹è¢#jú…„®€n€0ôAÚÐ(aº‚Fý Yü…„²€n€0ôAÚeþ/›‘¸ ½­u³™ Á @¿_æñÔÓT~y]€ÙLÀ€À™) ßŸæå2¿»ñÖ#§ÕˆãKZY@7@˜ú áÔÏk‘¡9šòi5a èc¨÷L…mˆßˆÜN ýad–tÜ3ô1Ô§ùfhî 2 ºÎL}ÀÇI… L}ü~™Ï€ë-@S@$<Í`° L}ÅB Ã` >@ S@B±pÀI*᫦ s L}ˆÄ¢…iÍèûñ¨«Zea èC(೤ݵèV²|Ûª²( +àî’.:|øpnn.ÕU¯Ê°ŠiÈ P¦±«Mí×ö­i]­_*ÕžZÓ¦Mû裨®ôÂTåæææåå¹»»S]Éìvv;%ÔÚ|pÕ[(Ö‚‹³¼¼<ªKýƒ0ÕQîîîÉÉÉTW”¢ä¹6 –üo4„)ÂHa $€0 éi~nnîáÇÉ*ELMmŽ=«}%ÔÌñ††Õ××[YYQ]ÈÀ¨¨l-=`ˆ†tfúìÙ³””²JQ§×^«e±´/Ióòòh9Ø aœ) WTÊǪùœ‹–§x´Ü)€àž)èÇ›6mš‰‰‰ƒƒCTT†a!kk놆>Ÿ¿yófkk믾úãëç0 ‹‹‹“.øøøDDD/ÕÕÕ”——GFF:::ZXX466"„$Idd¤““Ó°aÃÜÝÝoÞ¼Iô ÝœH$Šˆˆ°···²² !ÞE´ÉÎÎær¹§N’+¾¾¾¾ïÝ!V¦¤¤Œ5ÊÒÒòË/¿DÌ™3ÇÂÂÂØØØÅÅåܹsrŠŽŽîYG#--ÍÑÑ‘Åb666ÊîTßõíƒARRÒ{âïïïïﯶ~ÆŒV]]ššª§§WSSƒª¯¯Çq<""‚Ëåæää͘1Cº>66¶¼¼\º3qâD¢·¯¿þzÆŒGuvvÎÍÍ---õññ!Êøâ‹/ìíí³³³«ªª""",--…B!ŽãÒn÷ïßïää”——WTT4{öl???¢O„‡‡GNNNgg§´ìœœœ    &(³;‹/njjJJJÒ××ïîî?~üºuë***jjj¢¢¢ŒŒŒø|¾ì†8гþÞŽBh„ yyy………žžž¾¾¾²;Õ[ýƒþ}jA˜j5‡©……Å‘#Gˆåææf‘H$ GGÇèèh⥻wïÊ„¬ÖÖV&“ùÛo¿á8îååuêÔ©I“&ÅÇǯVUU1ŒŽŽŽ‰'FEE+%Iss³D"ÁergìØ±gÏž%@˜j¸Ì½:~üxddäèÑ£W­ZUXXÈ`0¤/UWW7ŽX–.ôdff¶`Á‚ÔÔÔçÏŸÿúë¯K—.Å0 Ã0;;;±X\YYùøñãñãÇoÁ0ŒÅb—ÃRÏž=srr"–‰…ÊÊJâG.—‹º|ùòèÑ£ïÝ»—••h` ?ŸÂÝáp8!=½ßÿ!´´´DDDxyy±Ùì5kÖȾØÂúû8Ò²‰”–-×- SÐ+ooï'Ož$''ÛÚÚΜ9³ªªJú‡Ã)..&–KKKûè$(((---%%ÅÏÏÏÔÔ”Íf_¸pø?9q:nÜ86›]QQ!}KKK qª(»¹òòrb™X`³ÙÄDr877·Ë—/gdd477+¿;r©íååU^^~ðàÁÇ_¾|Yö%bC ëïãh”•• %%%²eËu h@M¿È¶¶¶?þØÞÞÞÈÈÈÞÞ>44Tú/ðüü|·Ez‡¸Eõpuu çr¹S§NÅqœÉd"„ˆ¨Z¾|ù®]»nÞ¼YRR²eËé[âââˆX”.,\¸ð·ß~;vìØªU«B+V¬ˆˆˆÈÏÏ/--]³fͬY³Bï¼óÎŽ;nܸQSSsèÐ!‡ÓÕÕEtHlnåÊ•»wïæñxÅÅÅ7nôñña±X²¥Nž<ù‡~ÈÌ̬ªªzå•WBCCïܹ£ÌîÈ …nnncÇŽ}ôèÑŠ+BMMM² ÖßÛÑ@íÙ³‡Çã=zôhÆ Ò²{‹{ Ý†r@É{¦b±ØÓÓóÍ7ßÌËË«««+((xÿý÷¹\nww7Žã!7”2äÞ¡ælQÍ÷L¯^½êââÂd2œœp÷òòb2™|>ÿÃ?$ž_ÇÄÄ ™»„±±±² 8Žq¹\â6¨@ çp8¦¦¦óçÏ/++#V~öÙg\.×ÄÄÄÍÍ-++‹x£ts ,,ÌÎÎÎÂÂ"88XöžcÏ#ßÑÑqâĉ3fô»;èÏ·/ëëëÓÓÓŒŒŒ<<<222æÏŸO<È’nHaý}ýû÷;;;›™™-Y²¤®®Nv§z«п/@-u„ittô¨Q£ÚÛÛeWOp­ S¹‡Ò-¢^ÅBÍa †ˆ¬?Eø}iu\æÇÇÇoذaذa²+Y,–ì>&&&r8œáÇoݺ5!!Íf›™™I/¦ä6*,@áàÁ·ÞzKúYؼ¼<++«®®®Þj FJ—åF JÉ®Çq¼ç€Deö Ô¦¿þúëk¯½Öw›C‡%&&¦¤¤Üºu«¶¶öÝwß•¾÷îÝ3gÎDFFÆÆÆÞ¿ÿôéÓ‡&DÄÆÆzzzÊ.ôššš¢—#Hd—•§pðàˆ#æÌ™“ššzýúu}}ýéÓ§÷Qà (HÖ4:þ /Z´èøñãÒ‘ƒ,ë—_~‘kÓÇ@¡ëmð q¥Ÿ””ŒaX5à8Ž˜­ $’µGM£Ž0ýì³Ïª««}||òóó«««ÓÒÒvîÜ)צ߄½é9°!ÔÞÞÞò’X,îm𠯯o~~~bbbHHH5°X¬‹/¶µµíÝ»WvÓ½$Ö+¨ƒ`Ø/ÐêÓ‘#GÞºuËÂÂbÞ¼yÎÎΧOŸî9k_XXØ?þñÅ‹O›6mäÈ‘§OŸV²óåË—“ IB³fÍ2é×_ýöÛo;Æf³ßÿýU«VÍŸ?ß××!dff6wî\;;;âùXo5|õÕWcÆŒyóÍ7¥ÛõòòzõÕWåFtˮߺu«ÏâÅ‹_ýõgÏž¥¦¦øÀ´†Ë<¨sçÎ ¥Êùùù¹¹¹mÛ¶êB”BÌg:ô dÉêG†ñxvªß€öt7L333çÌ™³}ûöÑ£GS] ܸq#88ØË˫ߖÚ8ì7//ÏÙÙyïÞ½uuu kè· ¿¡Œ«‚ùLÕLÇ™ö;‹(¢Ë°ß'Ožlݺ•Ãá,_¾üöíÛ=E¿  Æ™jÝ=3C§Ì,¢=ié°_.—»oß¾ÒÒÒ¹sç®]»ÖÍÍm  ½A˜‚ÁSfÑž´zØoQQÑ­[·ÚÚÚæÌ™3¸€® LÁà)3‹(¢Å°_>Ÿçééêîî^XX¸oß¾5ô7”{pÏTÍ4ðž©To³ˆÊý½ñx¼Þæ Åq|Ñ¢E“'O&–{›Ã4&&ÆÆÆÆÒÒ’˜$ŒXßÛ$¡²3¢öœ‡ïqƒUá2Žãiii!!!¹¹¹½í~¿ †î™j]gÚ›ÖÖÎÎN­­RŸÂRmg: Ú5ìWm4ö÷dé½ ¹oÑ¡ +«e|þ㎞D§º–?øûûS]‚JtvvÞ¿ÿÊ•+Ä÷× u†¦Ä•>-egWŸ?oeeõƼy//[}}ø†½½=Õ%¨DffæªU«`Ø/Ð^CºÌ§·¶¶nW×íÝÝB³´¾m›¿ÿT==ˆÔ!‚ËFí¿/­Oó{efÆ q××gˆÅx}ý‹>JðôÜûý÷ð¿@O¦} N|Çq‰¯ªj^¿>ÆÛûðÍ›}}S<@A˜öÅÑÑÚÃc,ƒñûQ‰$ ^TTðu@Àñ‡å¿/ ³ Lû±fÍ ±øO×õ!ôóÏåóæýgÍš³OŸ6RT@ƒ@˜öcöì‰66Ã{® Å8Ž_ºtÖ¬YY¿©¿0RñcKg£ê*è ãLéÁÐ{÷]¯ÿ;S$÷|U"‘,Yâæå¥}_î”’’¢„õ0Æ?ØÝ,¼?¹ïMu-T¢ëøb:¡Qýkkëzíµí|¾üÔ¿†íØáûÞ{3(©j(rssŸ={Fuý“t0:ÏÛŠ«˜úÚ‡ùÖP]•ìíí§M›Fu /¦JÙ²%)%…'þqrÊ`èýç?A0ÍšªÔÞëøß–²îV.Fžaö“­©®€¾À=S¥¬Y3C$’ˆê³X&ååýE Ý=Sûýêâ®1.F!Û)¦T×@?àž©RÆåêj÷î3 ÃŒŒôÏž}¯¦¦eÓ¦ïÌÌŒß6ÕÕÑŠ ]œõYÅÓë/ÂŽB†ÃæcŒ©® €~@˜*kÍš™ë×ÇXX'&¾ïâb‡ª©iÝ»÷ ‹aÁÁoP]M4—u_þ°´£FˆÐïwŸ0=lÔ”aH •]aª¬·Þzío›xèPÍb͆ kllÿ׿αX&ÞÞ¯P[ ”_mÎÞþX"B™½˜²¢`hš@ €D‚ËMt‚ãøG%^¼økbâ:7·1T¦í$"üöáªçê¢?F¿˜ñÖ“‡©½(@ @Ï)£0 ;p ÐÃÃùwNëôØAã·‰.m,}˜¬8I†˜åxµÀ€A˜•ãäÉUNN#ƒƒÿ[Y©ì—Ê‚D„_ÚXVõó \¢èe YO¦§3ÉÐ7Sž=jjj´lÙ‰––NªËÑ&zúØ‚¯]‚FbÂò¡©g€Ù½7Lv€0%‡¹ù°¤¤õííÝK—~ÛÙ) ºmbhʘö Ç'jÜp[C½?ç©D€ÛþF˜íaJ[[V|üÚŠŠ†uëÎJGø%r5ýÛ~‡a£ 1&½®×ÓǬ]àÑЦd?~Tlìš[·J7oþ†I ˆD„gïz:‚k´(zÜpŽqŠj1ÖXßþDv€¿T’M™2ú›oV¤§ÿºoßÿQ]‹6¹{¶öEú§Ü‘¯ óOœøú{£ôô1ö_á†)Ð0ÎT%RRò?øà»Ï>[´nÝLªkÑÍeÝç—=rÛdçòöÈ?V–wK„´|J%üý§VU5ïÞnnn3Kõ—à×w=±š8lrÐHÙõæc˜T•À @˜ªÊÌmnîøä“sÖÖÃgÏžHu9šëaR}cqç?&bpÏ h3øûU¡Ï?÷õóûË{ïÉϯ º %ê–üz²æ•e6,8Ú î™ª–P(^¹2êîÝg/nrvÙÿtOsY·™½!Ãþ¿´„©Êµ·óýý¿®¯‘ž¾ÉÎΜêr*aªMM¾¾_éëë?¿‘Å‚ÇÓÐ\[©ƒ…Űøø5--Ë—Ÿ€›@K¦jÂåZ~÷ݺÒÒúõëcàæÐ„©úLœh{êÔêë׋>ú(î®@3¦j5mšÓ·ß®¼páΙT×B™'×ZEÝpn膱cǪkÐ-NN#­­Íöìù~øpã)S¨.GÝêîwdþ³Ä|Œ±…3|á( ø–-›V[Û¶sçEss“€€¿R]Žúˆ’kŸ?æNáä CÄÝÀe>5¶l™:ýã“®]ûêZÔçÎÉšÎz‘Ç'öCìðüü|‘H„aXCCà zÊ{P”2;vøy{¿zú—_S]‹:4üÖyïlí_ÿÉ6eHJ‡ #66vøðÁLÓ7”÷  Ú§’P(^¾ü䃕/nrr¢ó‡M%"üÂŠß Œ>'Ç }B Ãx<ÞÔ©SûnS__oee¥LoJ¶ pfJ%â›MíìÌ—.=Q[ÛFu9*ô ¡®¥‚ïµ+—¤†%&&r8œáÇoݺ5!!Íf›™™mÙ²E™n¥—ê<oÚ´i&&&QQQ†!„¬­­û¸'Þ+ÛÇñÈÈHGGG ‹€€€ÆÆF%‹”Ûú` P­¡á…§çÞY³þÝÒÒAu-ªR”ÞPpº¦çz„OCCCJJ BhÁ‚Òå²²²ÞzCñx>>þþþJÙsëƒ?R@kA˜j„Ç^{í³üãhw·êZÔ !”••…ã¸X,–[&â²·wÉ…©……Å‘#GˆW›››E"Ñ ÂtÒ¤IñññÄ«UUU £££C™"{n}Ðh/¸Ì×£G[&$¬{øðùÚµ:÷ͦ¦¦¦!===¹å9~üxddäèÑ£W­ZUXXÈ`0QIEEÅÒ¥K1 Ã0ÌÎÎN,WVV*S$)[ÚÂTSLœÈ>ujõµk¿mÛ–Bu-ÚÇÛÛûÉ“'ÉÉɶ¶¶3gÎ;A?}IDAT¬ªªD'l6ûÂ… ÄY†D"inn7nœÚ¶´„©ñðpþïW$$ÜþÏ.Q]‹–quu çr¹S§NÅqœÉd"„š››•|;ÑrÅŠùùù¥¥¥kÖ¬™5kÖP¶t „©fñö~eïÞ%ÿùÏ娨ëT×¢M¢¢¢®^½êèèkiiéååõꫯ655õû^iË­[·úøø,^¼øõ×_öìYjjê ·>´½Z Æ™j¢ƒ3¿üòß|³báBWªk$\‚à ò€N¿wMô¯-XµêÍþ3.;»ˆêZéÖÁg·>J—.]‰ˆˆPs'(ÎL5”X,Y¿>æÚµßRSÿùÊ+ªË˜ªÛ/26”ümŸã˜y0¡ Цš‹Ï½ýöKJj/^Ü4fŒ5Õå(KÄ—¤?2c<÷?c¨®õË|Íed¤öì»¶¶#–.ý¶®îÕå(ëηÕ]Í"Ïð¡N €v0ÕhÇ3cc×à8zûíoÚÚº¨.§ :ïÇÕ¹ýÓÎÄÚ€êZP+SMgcc–˜¸®¡¡}õêSˆêrú"áÙ;ŸØ¼6l☠èS-àà`óÞ½{ÏÖ­‹‹5÷æÏnµµ>éöÜÊEÕ¥ vðJkܸQ²lÙ‰à`·ÈȪkéUëSþ®ÕU@øB=­ÁåZ::ZGFþ†aÓ¦9Q]ŽbÌð­b@GÁŸ¾6ñõ}½¹¹sÛ¶”#ŒW¯žNu9€?@˜j™U«<««[>ÿüÂÈ‘f>>¯Q]àw¦Ú'<üï í6ÄŽa<}ºRsÄT @i%±X²víÙœœâÔÔº¸ØQ]†Fi'CïØ±e“&±—/?ñôi#UeÚÅ¿oÀ%ðÿc Lµ“ipöì{––¦ÁÁÿ­¯§æÃ¦?­ºs¢ZØ©¹C_PS-ffÆŒ_#KV¬8ÙÞÎWóÖ«n·=Jm˜1ÚоòS-gc3")i}UUóêÕÑêü°©°S’³ç©³·…½§™Ú6 €&ƒ0ÕzćMýõé|'Q×íË;ßV‹º%Óþ¥e­ :¦tàêÊ=}zuFƽˆe¿¶h(êvÞÿ®Î} >)M¼ùæ¸/¾‰‰¹uôèU•nH"¯ïzÂnæìm¡Ò  ]àÌ‚>/þKKKgDDš••éÛo»«h+¸w˜É·¾€€?0¥•wÞy³ªªù“O’GŒ0ùûß_UÅ&†zSÖÛª¢g´|Šnpß²%éÂ…; ëÞx¾… 50¥!±XòÞ{gnÝ*IKÛ8i›êrÐ ¦ôÔÝ- úæéÓ¦ôôMöö𤕃0¥­ææŽÅ‹ ¢ôô¬¬L©.šƒ¡Q´en>,1qH$^±âdGÇ>l*h“Utg¦$8wîÕ%ôêùóΣGL˜ÀZ¹r°3Ÿâ¨ýŒ=Ó³Y\;©¥©Š‡‡‡ÍêaJ Óèoã44ä $žºc†©ó%]$V¥:IIITWtŒ3%üÖþ?6@cpÏHa $€0@˜ L€¦@Sõikkûøãíí파ìííCCC«ªªˆ—0 ËÏÏ'q[¤w¨Œ>vÚƒ0U‰Dò÷¿ÿýöíÛ)))•••?üð“ÉôððàóÕý­¢*Bû o0h_MΜ9SVVVZZ:lØ0„µµõ×_½wï^}}-þ`V__oee…hºƒ(ÎLÕ$>>~Æ DÐH±X,ã/‰DöööVVV!!!Äz Ã9Îðá÷nÝšÀf³ÍÌ̶lÙ"m'»ÐSAAÁœ9s,,,Œ]\\ˆùÞzë­Ã‡ òòò¬¬¬ºººz«¡¡¡Av™ø¬‘µµ5±¾ïÄ0,;;›Ëåž8qBÉþ‰…´´4GGG‹(m €&ÂÁ!„’’’úncnnžžžÞG<oÿþýNNNyyyEEE³gÏöóó“¾êããÓÐÐ’’‚Z°`t¹¬¬ ÇñØØØòòrÙ¢CÙMŒ?~ݺu555QQQFFF|>ÿÌ™3Ó¦M#|ðÁk×®í£†úúz¹eÙ•ýî ‡‡GNNÎöíÛÔÿ„ òòò ===}}}û>ȸr¿ T”ÊüÖ×׿yó¦ì[ÍÍÍøËì;vìÙ³g‰<@µ¶¶¯feeá8.‹å–åS¶¹—ZZZD"±\TTDVKK “ɬ¬¬‹Ål6;;;»úÓ~w099ÇñöæÌbeAA´q LUà2_MØlvqq±ôÇæææžOºŸ={æääD, •••Ħ¦¦!===¹eåµ´´DDDxyy±Ùì5kÖ+GŒ1gΜÔÔÔëׯëëëOŸ>½†¸ƒ\.·ï}THÚxüøñÊ€úA˜ªÉ¢E‹Ž?NœN"„X,Ö/¿ü"׆Ãá”——ËÄ›MÚ78yyy•——BèÈ‘+f:;Û\¿Nu-h%¸g B(55!TZZ[RRKu-h%S€<¨*/¯Gê© (S€.\¸c`À@ ¢””|¸óÀ @˜ê:‰ONæ …¿?Äþ¼åÎ'Ô–€6‚0Õu?ÿ\^_ÿBú£¡¡þùów(¬-aªëΟÿýŸ ˆÒÒòE" …%  LušP(¾xñŽôŸÐÒÒ}ëV U% ¥ LuZvvÑ‹Ýr+ °ÔTù/ûô ÂT§¥¥ýÂ`0äV …’ÿû¿»ÝÝBJJ@KA˜ê®ÎNAfæ=‘HÁ‡ñ»»…?ýôHý% ½ Lu×?òùЧ5Á0ÏôSÝuá„ϋñ,lo竹$´Lt¢»=z.ûßÛûð¶m>^^ã¤kœmLL ©( íSð鮉Ùrk¸\ËW_…ùë ¸Ì@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@}ª  @nnî³gϨ®BåæævwS]…Æ ¤º 0Ç©®AÝRRR¨®Bãq…‰¤“êB4Žþƒ ‹g¦¡3fìØ±ƒê*€¦»víÚÎ;©®h¸g $€0@˜ L€¦@S „i_:;;¿ùæ›ÀÀÀ¹sç8p ¡¡xiÖ¬YEEE$n‹ô5a‹|>?***$$dÞ¼y‹/Þºukaa¡J·Uttœ©2p Ã0lçζ¶¶ßÿý† âââ ¨®N;=zôáÇaaa£Gnoo¿víÚG}”––fbbBui ÎL{uéÒ¥çÏŸ8p`âĉ,ËÉÉióæÍÑÑÑ ƒêÒoÖ¬Y­­­Ê¯¢ëׯ¯_¿þµ×^c±XgÙ²e)))L&“ô @9Ó^ýïÿóóó“û—ojjª§÷ÇA‹ÅÑÑѾ¾¾{öìikk#ÖÏš5ë§Ÿ~ øûßÿ~òäÉüÑßßÿ­·Þ:~ü¸´Áÿþ÷?Ù…žJKK·lÙ²hÑ¢ùóç¿óÎ;×®]C…‡‡''' }}}ù|~o5Hó‘Xž5kBÈÏÏO.7e×ã8þÝwß½ýöÛ‹-Ú±c‡ò{¤¾¾~mm­Âس<%[ 1â]wïÞ š5k–ÜщD}Ô€ò L{UZZêääÔw›¤¤¤Ÿ~úiçÎ_ýuSSÓÁƒ¥/]½z5:::<<ü»ï¾ûßÿþwêÔ©°°°äääêêj„жmÛ\\\dzÚµk‡Ã9qâDbbb@@À¾}ûD"ѬY³²³³‰?ýôÓŒ3RSS{«ANVVBèÂ…ÿoç^BRÛ¯èL*{aö hèD ÌÞÞ“;*{JH ‹ŠH!B¤IOzA4#¨IITP‘5¨…D"DQFd{RjXTw°N!æöx<ûž²þo´\¬½×¿ð×µ·®¥èèh²þ¥¥¥ÕÕUµZ=99ùðð000àçyUYY944ÔÓÓ³¾¾N„ïdú9‹^3†šššR©TJ¥Ò#{?~À.@ (¦¤œN§{Ñùç•Ýnë\[[“J¥,+99Y¡Pììì8?7 ©¨¨ˆŠŠÊÉÉAUUU½µñw½¢¢¢¤¤$÷Æ{---‰‰‰±±±\.÷ññÑápdgg[,–›››———­­­ÂÂB1@¯××ÕÕ±Ùl&“ÙÖÖf0\.—?WäUeeåÈÈH||üüü¼H$jhh0¾øå,>xÍ>J$q8œ‚‚ìœ(<ÀÇ2):~~~žžžŽ_.//»\®òòr÷1×××L&·qÃf³¥¤¤ „ÂÂÂB!!!mÿÙíö¹¹9“ÉdµZ“““qgDDÇÛÞÞNMM åp8>bÀÕÕ•F£Ñh4o=6› ÏÀ9‹…sH„N§S©T QQQd‡ür¼f KHH@Þ²çWRðSR@¯×ã{|4íððÐc ƒÁ¸¼¼Äët¼¥ÓéT P(ØlvSSSZZÚËËKqq1î …+++gggùùù!!!>bÀ{ÇÙl6ÿ'¥ÓéÍÍÍîp8h4ZÀ— •J[[[³²²ð™ôzýíí-.¦„çYÆ[ÁõÈUSË|R‰„ ˆ®®.³ÙL„Á`˜™™ñSRR¢ÓéŽ/..†‡‡ù|¾Ÿ¥gcc¾·BèþþÞþêùùùéé /ÞÏÎδZ-Bèîî!”m6›777ñ*•,¶»»ët:gggݧÆ'y÷—””LOO›Íf«ÕÚß߯T*'gžòòòÆÇÇ‚8==ÃWä#¼?A–1wÙ€*PLIÅÄÄŒŽŽFFF¶··‹Åâµµµ÷[ VWWçää¨ÕêæææØØØÎÎN?O®ÕjM&“{!¤T*ÿ}e±XZ[[ËÊÊKKK322º»»Bááá</..?#‹A.—OOOWWW»/f¹\®L&{_bÞúkjjø|¾Z­®¯¯¿¾¾îííýݼ¹kll …UUU¸Æ‘…÷‡È2æÎ#{På›î´o³Ù‚zsh•JÅb±ÄbñG”üÏÞú¾G@àžiq¹\'''F£Q.—t,?íïï{ýJ^[[+“Éþ~<>|Âì/ŠiÙÛÛëëë“H$øñôg™™‰©úù}Âì/ŠiÉÍÍÍÍÍýè(‚düàPŠ)PŠ)PŠ)Pà›>€::: êß™‚¿ƒÂ¿º‚/ï;S>ŸÿÑ!€àÀ`0ØlöGG‚ÃwüPî™ ˜ ˜ ˜ ˜þ,i¼² §QIEND®B`‚glom-1.22.4/docs/libglom_reference/html/dir_f071f38b98068934095ce7ce9f5ceda3.html0000644000175000017500000001525312234777147027503 0ustar00murraycmurrayc00000000000000 libglom-1.22: libglom/data_structure Directory Reference
        data_structure Directory Reference

        Directories

        directory  layout
         

        Files

        file  choicevalue.h
         
        file  database_title.h
         
        file  field.h
         
        file  fieldtypes.h
         
        file  foundset.h
         
        file  glomconversions.h
         
        file  groupinfo.h
         
        file  has_title_singular.h
         
        file  numeric_format.h
         
        file  print_layout.h
         
        file  privileges.h
         
        file  relationship.h
         
        file  report.h
         
        file  system_prefs.h
         
        file  tableinfo.h
         
        file  translatable_item.h
         
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__VerticalGroup.html0000644000175000017500000020141012234777147031633 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_VerticalGroup Class Reference
        Glom::LayoutItem_VerticalGroup Class Reference

        The child items are arranged vertically in a row on a report. More...

        Inheritance diagram for Glom::LayoutItem_VerticalGroup:
        Collaboration diagram for Glom::LayoutItem_VerticalGroup:

        Public Member Functions

         LayoutItem_VerticalGroup ()
         
         LayoutItem_VerticalGroup (const LayoutItem_VerticalGroup& src)
         
        LayoutItem_VerticalGroupoperator= (const LayoutItem_VerticalGroup& src)
         
        virtual ~LayoutItem_VerticalGroup ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        - Public Member Functions inherited from Glom::LayoutGroup
         LayoutGroup ()
         
         LayoutGroup (const LayoutGroup& src)
         
        LayoutGroupoperator= (const LayoutGroup& src)
         
        virtual ~LayoutGroup ()
         
        bool has_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Discover whether the layout group contains the specified field (from the current table). More...
         
        bool has_any_fields () const
         Discover whether the layout group contains any fields. More...
         
        void add_item (const sharedptr< LayoutItem >& item)
         Add the item to the end of the list. More...
         
        void add_item (const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)
         Add the item after the specified existing item. More...
         
        void remove_item (const sharedptr< LayoutItem >& item)
         Remove a layout item from the group. More...
         
        void remove_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Remove any instance of the field from the layout. More...
         
        virtual void change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void change_related_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void remove_relationship (const sharedptr< const Relationship >& relationship)
         Remove any use of the relationship from the layout. More...
         
        void remove_all_items ()
         
        double get_border_width () const
         
        void set_border_width (double border_width)
         
        guint get_items_count () const
         
        guint get_columns_count () const
         
        void set_columns_count (guint columns_count)
         
        type_list_items get_items ()
         
        type_list_const_items get_items () const
         
        type_list_const_items get_items_recursive () const
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_items get_items_recursive ()
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_const_items get_items_recursive_with_groups () const
         Get the items recursively, depth-first, also returning the groups. More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::LayoutGroup
        typedef std::vector< sharedptr
        < LayoutItem > > 
        type_list_items
         
        typedef std::vector< sharedptr
        < const LayoutItem > > 
        type_list_const_items
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::LayoutGroup
        type_list_items m_list_items
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        The child items are arranged vertically in a row on a report.

        Constructor & Destructor Documentation

        Glom::LayoutItem_VerticalGroup::LayoutItem_VerticalGroup ( )
        Glom::LayoutItem_VerticalGroup::LayoutItem_VerticalGroup ( const LayoutItem_VerticalGroup src)
        virtual Glom::LayoutItem_VerticalGroup::~LayoutItem_VerticalGroup ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_VerticalGroup::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_VerticalGroup::get_part_type_name ( ) const
        virtual

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_VerticalGroup::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutGroup.

        LayoutItem_VerticalGroup& Glom::LayoutItem_VerticalGroup::operator= ( const LayoutItem_VerticalGroup src)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Field-members.html0000644000175000017500000007622512234777147027223 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::Field Member List

        This is the complete list of members for Glom::Field, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::Field
        enumTranslatableItemType enum nameGlom::TranslatableItem
        Field()Glom::Field
        Field(const Field& src)Glom::Field
        field_info_from_database_is_equal(const Glib::RefPtr< const Gnome::Gda::Column >& field)Glom::Field
        from_file_format(const Glib::ustring& str, bool& success) const Glom::Field
        from_file_format(const Glib::ustring& str, glom_field_type glom_type, bool& success)Glom::Fieldstatic
        get_auto_increment() const Glom::Field
        get_calculation() const Glom::Field
        get_calculation_relationships() const Glom::Field
        get_conversion_possible(glom_field_type field_type_src, glom_field_type field_type_dest)Glom::Fieldstatic
        get_default_value() const Glom::Field
        get_field_info()Glom::Field
        get_field_info() const Glom::Field
        get_gda_type_for_glom_type(Field::glom_field_type glom_type)Glom::Fieldstatic
        get_gda_type_name() const Glom::Field
        get_glom_type() const Glom::Field
        get_glom_type_for_gda_type(GType gda_type)Glom::Fieldstatic
        get_has_calculation() const Glom::Field
        get_has_translations() const Glom::TranslatableItem
        get_is_lookup() const Glom::Field
        get_lookup_field() const Glom::Field
        get_lookup_relationship() const Glom::Field
        get_name() const Glom::Fieldvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_primary_key() const Glom::Field
        get_sql_type() const Glom::Field
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_type_for_ui_name(const Glib::ustring& glom_type)Glom::Fieldstatic
        get_type_name_ui(glom_field_type glom_type)Glom::Fieldstatic
        get_type_names()Glom::Fieldstatic
        get_type_names_ui()Glom::Fieldstatic
        get_unique_key() const Glom::Field
        get_usable_type_names()Glom::Fieldstatic
        get_visible() const Glom::Field
        glom_field_type enum nameGlom::Field
        m_default_formattingGlom::Field
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const Field& src) const Glom::Field
        Glom::TranslatableItem::operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const Field& src)Glom::Field
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const Field& src) const Glom::Field
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_auto_increment(bool val=true)Glom::Field
        set_calculation(const Glib::ustring& calculation)Glom::Field
        set_default_value(const Gnome::Gda::Value& value)Glom::Field
        set_field_info(const Glib::RefPtr< Gnome::Gda::Column >& fieldInfo)Glom::Field
        set_glom_type(glom_field_type fieldtype)Glom::Field
        set_lookup_field(const Glib::ustring& strField)Glom::Field
        set_lookup_relationship(const sharedptr< Relationship >& strRelationship)Glom::Field
        set_name(const Glib::ustring& value)Glom::Fieldvirtual
        set_primary_key(bool val=true)Glom::Field
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        set_unique_key(bool val=true)Glom::Field
        set_visible(bool val=true)Glom::Field
        sql(const Gnome::Gda::Value& value, const Glib::RefPtr< Gnome::Gda::Connection >& connection) const Glom::Field
        sql_find(const Gnome::Gda::Value& value, const Glib::RefPtr< Gnome::Gda::Connection >& connection) const Glom::Field
        sql_find_operator() const Glom::Field
        sql_format enum nameGlom::Field
        SQL_FORMAT_POSTGRES enum valueGlom::Field
        SQL_FORMAT_SQLITE enum valueGlom::Field
        to_file_format(const Gnome::Gda::Value& value) const Glom::Field
        to_file_format(const Gnome::Gda::Value& value, glom_field_type glom_type)Glom::Fieldstatic
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        TYPE_BOOLEAN enum valueGlom::Field
        TYPE_DATE enum valueGlom::Field
        TYPE_IMAGE enum valueGlom::Field
        TYPE_INVALID enum valueGlom::Field
        type_list_strings typedefGlom::Field
        type_map_locale_to_translations typedefGlom::TranslatableItem
        type_map_type_names typedefGlom::Field
        TYPE_NUMERIC enum valueGlom::Field
        TYPE_TEXT enum valueGlom::Field
        TYPE_TIME enum valueGlom::Field
        ~Field()Glom::Field
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Privileges.html0000644000175000017500000002503512234777147026652 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::Privileges Class Reference
        Glom::Privileges Class Reference

        Public Member Functions

         Privileges ()
         
         Privileges (const Privileges& src)
         
        virtual ~Privileges ()
         
        Privilegesoperator= (const Privileges& src)
         
        bool operator== (const Privileges& src) const
         

        Public Attributes

        bool m_view
         
        bool m_edit
         
        bool m_create
         
        bool m_delete
         

        Constructor & Destructor Documentation

        Glom::Privileges::Privileges ( )
        Glom::Privileges::Privileges ( const Privileges src)
        virtual Glom::Privileges::~Privileges ( )
        virtual

        Member Function Documentation

        Privileges& Glom::Privileges::operator= ( const Privileges src)
        bool Glom::Privileges::operator== ( const Privileges src) const

        Member Data Documentation

        bool Glom::Privileges::m_create
        bool Glom::Privileges::m_delete
        bool Glom::Privileges::m_edit
        bool Glom::Privileges::m_view

        The documentation for this class was generated from the following file:
        • libglom/data_structure/privileges.h
        glom-1.22.4/docs/libglom_reference/html/dir_4257d9b4f9ac811b1e2ea282aa1cf0e7.html0000644000175000017500000000627012234777147027577 0ustar00murraycmurrayc00000000000000 libglom-1.22: libglom/document Directory Reference
        document Directory Reference

        Directories

        directory  bakery
         

        Files

        file  document.h
         
        file  view.h
         
        glom-1.22.4/docs/libglom_reference/html/functions_0x70.html0000644000175000017500000001225612234777147025023 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - p -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__VerticalGroup__coll__graph.png0000644000175000017500000005264212234777146034155 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÄÃ58ýðbKGDÿÿÿ ½§“ IDATxœìÝy\gþðgG@Äp‰„Að¦[ºZŠPA]Ü¢àÊU¬G¥õ¨«µµ[Тõ–UWÛjm«âR@‘ö꺥ˆ6Ôâ…‚ 7äÊ9¿?¦¦i`È$“ïûÕ?†É“g¾3à§sÕíPWWWTTDu!„¬­­'OžLu@„)è‡I“&Q]‚®«¬¬¤º „)臑#GR]‚®«¯¯§º Ü3@˜ L€¦@S „) †a *6~çw‚‚‚ä×üüóÏL&óÅ‹CPZúU3Ð5¦@ gddtvvÊÖ\¼xqîܹǧ°*äA˜‚¡EÊÙܼyó 233ek.^¼ þJè „) Ç›6mš‰‰‰ƒƒÃÉ“'1 CY[[744‚7ÚØØX[[õÕW²·`vîÜ9ù…î ýýý“““‰ïܹSUUµpáBÇ£¢¢-,,BR©4**ÊÉÉiذaîîî¹¹¹Dç²JÄbqdd¤½½½••Uhh(ñ.¢Mvv6—Ë=uêTO;˜ššêààÀb±êêê gÏžmaaallìâârþüy¥ÇAiÝÁ€|토‚ÚÚÚ¬¬¬>›3&<<¼ºº:%%EOO¯¦¦!T__ãxdd$—ËÍÉÉ)..ööö–­-//—_P*33søðá]]]8Žïܹsþüù8Ž9rÄÙÙ9//¯´´Ô××7 Çñ/¾øÂÞÞ>;;»ªª*22ÒÒÒR$á8.Ûâ¾}ûœœœòóó‹‹‹gÍšåïïOl!äáá‘““ÓÑÑ¡´„Д)Snß¾}÷î]ww÷ùóç?~Íš5555'Ož422ÝCddd÷:ååääO˜0¡Ï#|ïÞ½{÷îõÙ ¨„)P‰Šajaaqøðab™Ïç‹ÅbY„9::FGG/ݾ}[¶^E"‘ÈÒÒòâÅ‹8Žÿõ¯%ºš4iR\\Ñ ªªŠÁ`´··Oœ8‘8Äq\*•òù|©TŠË…騱cÏž=K4¸wïB¨¥¥…h””ÔK !ÙA¸uëB¨¢¢B,kŠ‹‹e›P8ãÇï^'Žã'Nœpuu1cFbb¢P(ìó8@˜j,S Ã4!!ÁÆÆ†Ëå._¾<77—‹0&“™““C4#%õ+Lq_µjÕÒ¥KŸ>}j``ÐØØˆã¸±±±Â•Vqq±±±±lCòä+¹~ýº|%÷ïß'ܼy³—BÏž=#–;::BÓ§O·µµ•?ÝV8Jë¼té’µµõúõëñô¼¤¤Çñ;vŒ=úúõë%%%sçÎEý¼gŠã¸X,¶±±±°°øî»ïˆ5;vìpqqáñx=zï½÷\]]qß½{÷˜1crrrª««80lذ/^à8.«d×®]cÇŽýå—_ˆ{¦¾¾¾Do!×K¡7ÞxãÎ;Ä=Ó   [[Ûƒ666#a‹‹‹»‡ 6t¯“PVVöñÇÛÙÙ­\¹ò×_íóÙ©Æ‚0*Q1L¯^½êââÂd2œœâããq÷òòb2™à£>"žæÇÄÄÈÂ!+¿Ð‹uëÖ1Œºº:âG¡PÁápLMMçÍ›WVVF¬Üºu+—Ë511qss“•-«D(†‡‡ÛÙÙYXX„„„Èî6¨¦qqqvvvæææK–,áóùéééFFFóæÍ#")¥uÊkoo?~ü¸··wŸGÂTca8ŽStN ´ 1ÓþŒ3¨.D×Ý¿!3ík ¸g 4È¥K—0e"##uª `¦} A|||(¿TÒ„€6‚3S „)ÂHa 4”Ò§@¤t¾víZ ÃÒÓÓ¶HôOↀî€0ŠÿB(++‹X~íµ×ß³D"III=ztRRÒà{€Oó†b±X²eSSSùé§Ÿ~ …G}ÿý÷‘‘Y=]g¦@Ë`–ššêèèÈb±‚‚‚z𴉉‰þþþ ,‹ÅW®\é©™ÒiO•N–*ÓÜÜLL”t„)Ð>Ÿ}öYBBB^^ÞóçÏÃÂÂúõ^‘HtáÂ…àà`cccÙtÎÝ~ü˜Ø(BÃ0‹E|!Š —ËÝ»woiiéœ9sV¯^íææÖÏÚ ÂhŸ²²2báÑ£GHn6Ò> …´´´˜˜ÙP¹sçöôL_é´§}N–J(..¾qãFkkëìÙ³UÞ- Ý LöÙ½{7Ç{ðàÁºuë|}}Y,Ö¹sçä3®'—.]‹Å‹/f½”žž. »7^¾|ù®]»x<^IIÉúõë‰ ½ûî»Û·o¿~ýzMMÍÁƒ9ŽüP ‚sçÎyzz†……¹»»íÝ»—Ì=šŒêû @;hÔ=Ó}ûö9;;›™™-^¼˜˜Û©0*Žã¡¡¡!!!òkôõõÓÓÓñn÷L•N{ÚÓd©„ÔÔÔÐÐм¼<v»pÏTcÁ|¦@%š3Ÿ)†a<oêÔ© +“““/^LUUjó™j,¸ÌT"kòP'''///Ò»@uð (@¥Lª´½Â7ôÁœ¤@ýàÌHa $€0@˜ LNIDT—hžæƒ~ÐÒÉpßuy×6Ÿmª¿%£(ãU»WíFØ ]U°j,SÐEEET—0Õ§óOÿÃþz˜ª—b Õ ÞIÞáÓÂ=9žCZÛX[[S]P>èoÆÙ%Ù‘SFOQñ-¢NÖ–P"\?sýÁÀƒ†ú†CZ! ¸g hîÖÓ[Ù%Ù†]+¹¦ú»Œ Œ=œ<0„ûùØÔ=SË롮B@¦€ævý°K_Oðÿ=ø_¿Þ8ße¾¾ž¾D*yðüÁÄ­_;>Dz€0tVR[rñöE±T,•J¯•\“âRÕß;{Òlb €X*J„kb×,‰^Ò&h²bvƒ0tvðòA}½ßŸ²¾¼¸WuOõ÷ºÚ»²LþøJTáI¼¤¿ìøËíg·I®Ð„) ­ê–ê37ÎÈF˜ê3ô³K²U»¦7gâ}Æ#^DѳÆg¯ïyýËÿ}Ir­@ûA˜Ú:òÓý1XÇñ~…)BhÎä9 Ã]ÄR±H"ú8ñc¿¯ýš;šÉ)Ð ôÔÒÙb÷/»vA»üJsóÆ/¾¯eõeÎ[œ•¾¤ÏÐçZp/®»èbç2ØZ-À™) §×ND…•ü~qm±ê8Y;Ù±” ÇñІŠsùç^" S@CB±ðÀåb\¬°ž¡Çè×hS„ЂW0 Vê3ô­oD܈Z5¨B@˜Š»×ÐÖ€”ÝÁÊ.îßmÓÙ“f‹¥„2C!lÓœMw¶ßqã>È:ÀgóÝà8¾ÿÒ~¥/I¤’¬â¬~õö· ÃF<È2`Œ2õBðÂkœ—±1 µ3S@7™÷2Ö<Ä0ÌHߨûzuKõ“Æ'ª÷Æ2a¹Ø¹ßÇ÷öoßÙ~Çg²ÏŠÓ+ê^håZ`èÀÓ|@7ÏšžÝ~¿¦µ¦’_YÛZ{±ðb—¨ CXS{qÁ³2fé´¥ªw‘½!„aب£\í]û•¤!ç‘ÎòIŠš;yîJÏ•ë¾_Wɯ$³V Í LÍÕµÖ4Iz·‡‚0±òÌJ¸¶S@g± ¹³ÙÆÌ†ôžÍŒÍN­8uõÁÕèëѤw´„) ³úõ8Ž—ù¤›5aÖ?gþscâÆ²ú²¡èhS@gĦ¡¸Ì'D-޲cÙ­8µ¢_3¥Z‚0tV×Z‡²Nþe>ÁÄÐäìʳyåyG~:2D›ÚÂÐYmk-Ó€ifl6t›pãþ¯yÿŠH‰¸ÿüþÐmh>S@gu/ê†è†©¼í ·³·üÔrÙDÔ@A˜:«{Q7òé]yönÕÝ— õ¶€Æ‚0tVÛZ;tOŸä¹Ú»F¾¹ã‡w*ï¨as@A˜:«kUÇ™)aóß7»Ú».;µL(ªg‹@£@˜:SÏ=S‚¾žþÙ•gKjJvþ¸S=[ÂЙìƒùê1aÔ„Ý‹vÿ;óß7+nªm£@C@˜ÚÂq¼þE½zî™Êlœ½ÑÓÙsù©å¢NunPÂпƒ/’ˆÔvÏ” ‡é~÷ôóæçŸ]øLÛ”ƒ0´UÛZ‹Rçe>ÁÑÊqÀþ/¯~ùsñÏjÞ4 „) -âƒùj>3%¬öZ=oò¼wO¿û¢ë…ú·(a h«¡­Ã0…yÕð“ËO¶vµ~’ô‰ú·(a h«±­ÑŒi¦¯GÍWð²Yì/‚¿8~íxÆÝ J ja h«©½‰’ÓR™¥Ó–L x?æý¦ö& Ëêa h«©½Éb˜µ5|óÎ7©dCüjËja hKÂÔÊÔ껥ßÅÝŒK*H¢¶0Ô Lm5µ7Y£ò2Ÿàçê÷Žû;Ä}@ Õta hKÎL GC¯ŠYEu!`A˜ÚjloÔ0a<"zyôw~ˆÉ‹¡º0T LmiΙ)BhΤ9ïOCü†§MO©® S@[¦¡CA‡¬‡[‡ ÃqœêZù L=u;ºD]šðJf˜Ñ°3ïžÉ*ÎúîÚwT×Èa è‰'¯Qg¦!OgÏ ÛðIÒ'êQ] „) §Æ¶F¤yaŠÚ÷}–+N­H%T×Èa è‰83¥öã¤JéÅ„Åðó¾¸úÕµ2A˜zjêhÂ0ÌÜÄœêB”ø+÷¯á>áŸ]øì^Õ=ªk¤0ôÔØÖ8ÂxCAu!Ê}¾ðs;—e§–‰$"ªkä€0ô¤iã¢èëéǬŒyPý`_Æ>ªkä€0ôÄïàkÔ¸¨î&±'móݶëÇ] ¨®ÂÐSc›¦|–´áóÃÝǸ/?½¼KÔEu-`° L=5w4³LXTWÑ=LﻥߕחGeFQ] ,S@O­]­fL³ÞÛbT›l7¹ëJ׎e;¨.dhªç÷N!j¾€¡ö¢ëÅpæð>›¹»»ôÑGj¨G—>|˜êÔÂГŠaÊáp‚‚‚ÔP.KJÒ‰o€Ë|@O*†)d0ôa Ô ÂЄ)P3S@C¢N±T a Ô ÂÐЋ®!S N ÓóçÏS= LÆ÷uGU˜bÖÐРæ’BéOA|ε” JLLT`(èÈø¾îàÌ´¿ø|>±`nnž••åêêŠ>`?( SvG:2¾¯»ßÃÔh¨²Ã°úúz++«!ê_ý›c±þøè­©©©ü@EpÏйg¦<oÚ´i&&&'OžÄ0 !dmmÝÐÐ 6nÜhcccmmýÕW_ÉÞ‚aعsçd ¾¾¾‘‘‘ÄKuuuåååQQQŽŽŽ!©Tåää4lØ0ww÷ÜÜ\¢ÙæÄbqdd¤½½½••Uhh(ñ.¢Mvv6—Ë=uê”BñõõõƒÙw ÃRSSY,VPPl‹ ;S@C/º^0ô&†&¤ôâíí]^^~èСիW×ÔÔ „ˆSÅÝ»w_¸p!%%%77755Uö–ØØXOOOÙBpp°ìÕäädOOÏŒŒŒèèèøøx×ÕÕµfÍ„Б#GŽ;vúôéGÍ™3ÇÏÏO,ß MlîàÁƒ ÉÉÉ7nܨ­­}ï½÷d[ܲeË÷ßÿöÛoËÖ\¿~=$$ÄËËk»ÿÙgŸ%$$äåå=þ<,,l½Ñ.‡¸[Šº º œ¸vÂl½YŸÍT<>‡&–ù|¾X,FÕ××ã8îèèM¼tûömÙz---L&óáÇ8Ž{yy:ujÒ¤IqqqÄ«UUU £½½}âĉ'Ož$VJ¥R>Ÿ/•Jñ—aŠãøØ±cÏž=K4¸wïB¨¥¥…h””D¬ïèè8qâ„««ëŒ3…BaŸ;(!Äãñä~üxüøñÄ[0 c±XÄ5¾Ì³gÏœœœˆeb¡²²’ø‘Ëå"„._¾ggg33³Å‹×ÕÕ)ì”*täïp a=jÔ¨¶¶6ù•²€º¤¢žû >¥zo z˜öÙÿ`èÈqw¡'BýŽúõÙLgê”þ%#„’““UïDGŽó@.óãââÖ­[7lØ0ù•,KþÆ|/â8ÎðáÃ7oÞÏf³ÍÌÌd—H ôz)C6¶nÆ ³g϶°°066vqq9þ¼¬Á?üÀáp,,,Ž=J¬T3(ë­°°°{'òCü”6 ¤¦¦:88°X¬€€€ºº:ÙzÇ»%TØYÿ=5îóˆî`Ê(¥.]º¤ô¦™l ¬Šœœœ?⊆ä“UÅ3Sssóôôôž^Eñx¼}ûö999åççÏš5Ëßß_öª¯¯oCCCrr2Bhþüù²eâJ'66¶¼¼\~A¡gù=<™½ ˆ#î)å—û¼„ï¦ÄغææfÙ-Ôââb$wßêÂ… ²þ‰•JÇ òx¼^:!zi »·EÜìojj"úT:–ï!L{i<à#¦#ÄÝMÙ5åÓäOûl¦³ÇGÍtä8ä2ŸÍfˆƒ*?X„ÐË€8SSSôr$‡üòcëš››###½¼¼ØlöªU«äØÙÙ)ôßÓ˜Á^:é³³³3±0a„Puu5ñ£Ò±„=íK/IÈcfooOü¨t,aOûүƠwä@ Ó­[·VWWûúúTWW§¦¦îرC¡MŸâzÒ}€^ŸD"‘››Ûرc÷´Ü¹W¥@,cïcçyçûl©9ÇG,[[[=úwÞ‘_/ÿïB=c“‡‚æç!ЙŽü+héhAï¡Ì»™}¶ÔœãsåÊ•#F$&&š™™ÃN¦Zžcºy!оiöýýý,X ‹¯\¹ÒS3¥Ã·•΂*CŒBò0Ñ  ­ûΑHtáÂ…àà`cccùσ(P:Ÿ©ÒYPeoÉÏÏwvvÞ³güÇIÀP€0tÓÖÕ†252¥ºU]½z!4{öl„ТE‹ÒÓÓÒ–§NÚ¶mÛo¼1nܸ¯¾ú*--­µµõ»ï¾ûüóωA{;wî,--•ÿ,¢Ïµk×ÚÛÛ§L™²lÙ²_~ùE=;¥ƒ LÝtŠ:BdM³¯‰‰‰MMM††††-]º´µµµ§+}¥Ã·ûœ•ËåîÝ»·´´tΜ9«W¯vssʽÑ]¦€n:„!cCcª Q‰P(LKK‹‰‰‘ÍŽ6wîÜž¾ Qéðí>gA%߸q£µµ•8¤ƒ0tÓ)ìDhG˜^ºtI,/^¼˜õRPPPzzºP(ìÞXéðí^fAE ‚sçÎyzz†……¹»»íÝ»Wû§C”|Õ³.xü¸ÁÁAMßÓ Ô¬SÔÉÐcêR]ˆJ,X`bòÇM ÿ5kÖ\¾|yÁ‚ ÃÃÃÛÚÚ-ZÔÙÙ9wîÜ#GŽ „>ýôS@°dÉ’††—ü‘øÌ1!###33ó?ÿù»»»zöHg) Ó^&ÒÆ7ß½óÎØáÃûõ8®²²’ÃáP]…ºu ;µå´!§°ÆÒÒR$ËøË‰„d QQQQQQòí vîܹsçN¥ý/Z´hÑ¢EdV z $LƒƒƒÕ_‡:éé™ØØ¼¿aÃþŽŽ;T×2ä¨.AÝ:„xÃôÒ¥KóçÏï¾þ³Ï>Û½{·úë¤ûS˜QUŠÚœ8‘ýùçiÞÞ+22>¢º@¾N‘&ž™úøøÈÎ.-é⨔”_B·o?{þ¼™êZù:…Z4. І΅iEEý;ÏB †Þ… Š3èujàe> = Ó‹30` „$éùó<ªËäÓ®P€6t.L‹%!Ç=ª-.®¡º"@283”Э0-*zþäI£ì1€ãâÅß(­¯CØg¦@ýtkÐþ… · õ…ÂßçÔ‰$II¼ý˧û·›íÕ¯P•••”¬ÖG]‘Ä2–KiúïQGÆ;Óó—§ŽãIIhÿyúa,z~ CMìÑpøZo­§+aš›û¨¥¥KéK ½O'=ÎT*@¿n@?û"A ’ŠB3@vгCm¤+ašž^ˆÒ×gtÿO,–þßÿ݉”̧ ´‘æŽ3}Q‚.½ŽJŽ!„#$û{Ã5>=èÊ(/¯qòO™>ýôü’%Ó^}Õ^¶¦­­ËÜ|¥’iæD'¨øKôÛ§áWøß6Ṳ̀¦$@*] S?¿×äüôÓóÓ§[¸Ð•ªzÀÐéhØ|B>ÊCUiHɬQ²zhÍ©‚^èJ˜ãx—¸Kƒ@ñ QÎ?PÇ3eIŠž>b+™äh#]¹g t„@,Àq\ƒ.óMì‘ùk— ¥Ÿ²“ŠÐ¨¹j¯ S@+Ä÷WÈa h…¸Ì× P©]B,䆿ý‚ÌÆ#„!G£fS] „) •ßÏL5í2ÿþ^ÔZ‚<â¦X¯ Ÿ_Ѥ!Ö_±-Õ•Ò@˜ZѸP¡Æ›èÞnôÚ~d:æ÷5zFÈõßèoÿ£´,@2S@+Ä™)SŸIu!/‰;PÞ d;]£ø’‘%¡ƒö­Ä„Ó@cÂôîvÔUƒf]§ö´a hE `fÀè6¢“*NahÔ,dbßwK å L­ÅB†}©—Ùxd6žê"€:À=S@+±ÀH߈ê*€.‚0´a ¨a hE(êR]ÐE¦€VàÌPÂЊ@$ øÌ´úò©,PÂЊP"¤òÌ´¥][„ÊÏPV „) */ó%]èz ²š†ÆHM€R0ÎÐ • î~Ž:«ÑÌ˃s]¿u@+”™Öe£Ñ_#ÎÀ:À0¬¡¡Ü¢†´Û‚‚Ò»Õ¨-ö„) ˆŠ0µ¢üw‘ýb4f¹º7 4„) ¡„ŠËü[#q'zý˜º·;hCtÞJ–žÊÓ̲!L­Psf:jzã2²êéõúúz…5<oÚ´i&&&'Ož$V&''5ÊÒÒòË/¿DΞ=ÛÂÂÂØØØÅÅåüùóD3 ò³³¹\ntttTT”£££……E```cc#BH lÜ¸ÑÆÆÆÚÚú«¯¾’mðÔÔTGGG‹ÔØØHÌ``mmM“¬ÛS§NõYwJ«}ë­·:D4ÈÏÏ·²²êì쌌Œ´···²² %jFÎGbY¡<ù‘­Çq¼û Ú$$$p8œáÇoÞ¼9>>žÍf›™™mÚ´I¾«ææf±XÜËNõÙàOpdk»ñâÅߨ®Ï÷+ߥÑK©®â999ÁÁÁ&LPX?f̘ðððêêê””==½šš„ТE‹šššõõõ»ººÆ¿fÍšŠŠŠššš“'O ÇB999û÷ïwvvÎËË+--õõõ Àq<22’Ëåæää{{{#„êëë‰wM˜0!??¿¨¨ÈÓÓÓÏÏXI¼*ßmGGGŸõ#„x<žü¥Õž9sfÚ´iDƒ?üpõêÕûöísrrÊÏÏ/..ž5k–¿¿¿¬CùJd5˯”mQ¶þÈ‘#ÝÑÀ××·¡¡!99!4þ|ÙrYY™¬æÌÌÌÑ£GïÞ½»¶¶V鯯Ï:&}¶ %Sºš{xnØ™0ª«À;::Nœ8áêê:cÆŒÄÄD¡P¨ÐÀÂÂâðáÃÄ2ŸÏ'Nnݺ…ã¸D"!‚8-"ÚËGLRRŽã“&MŠ‹‹#TUU1ŒöövGGÇèèhbåíÛ·åßuæÌb}aa!B¨¥¥E!­ˆnU©¿{˜*­¶¹¹™ÉdVVVJ$6›=vìØ³gÏÍîÝ»G”4L•¢AVV–ì`Ê/+”ýäɓ͛7s8œ¥K—Þ¼y³û¯²Ï“^^£1SºòÞïýÁ¹¨­áÒ¥KÖÖÖëׯðàAOmlll¸\îòåËsssqGÕÕÕ¯añøñ㈈ˆéÓ§ÛÚÚ*œcÿª¿¥¸¸˜ÉdæääýtvvÊ¿Kaýýû÷ÒŠèV•ú»§ROÕúúú~ùå—YYY\.W*•2™Ìëׯ+”4L•î•.Ëëêꊉ‰quu}ýõוîoŸ p‡{¦€Vb‘ÅŸÍçp8nnn—/_ÎÈÈàó•´ÔÇÇçÉ“'III¶¶¶3f̨ªªB/ïÊxyy•——8pàñãÇ—/_–IOO!Äf³ÓÒÒˆÉR©”Ïç7ŽÃá”””ÍJKKåßUVVF,ggg33³Å‹·¼¼¼˜Lfcc#ÞÃ%pOõ+ÄÇë©ZÇ.\8yòdbY(†‡‡ÛÙÙYXX„„„Èv9&&ÆÆÆÆÒÒòܹs²š{*O¶^éÀU¾ÌOMM ÍËËëé××gyX÷㢠Øì¾ývùÂ…®TH6ö³±+€zž‰J¾F^©ˆ9r¨6A/‹/^¼x1ÕU¨ \æZŠ…Cuf*lB7ßCKÇHúZÂÐÊâ­Czúèõ£CÒ9Ð~¦€>¤¸T,ɬQ¸1mÛwÈ`ùZ€{¦€>Ä1BÈ€a@~טšòùÝ3S@"‰ Q˜ÐS@D˜êëÁõ „) 83‚0ô!–ŠBú¦€¦€>H¾Ìïª%§  L}y™ß‡.:¢¦_Iè èS@¤ µ¢ÜP4êoÈâ¯$”t„) Ò.ó݈$èh­›ÍP‘úøý2 ž&£òÓÈ+ f3ýg¦€>~š?˜Ëü®Ä[‹œV"ŽieÝa 胄P¿¬F†æhÊW¤Õt„) ÁÞ3µ"A#r;Žô‡‘YÐ pÏÐÇ`Ÿæ˜¡9×É,è83ô'‚0ôñûe>®· L}ð4€‚0ô!’ˆ0 ƒ)ø% L}ˆ$¢~'©T04µa èC,÷/Lkþ‡~:«‡¬" C L}ˆ$¢~|–´«ÝE–o cÛ¡, è ¸»¤‹:”——Guä«2¬b2UiìjS»ÊµmsjgË—*µ§Ö´iÓ>þøcª«½0ÕEyyyùùùîîîTB2;¡ÐNÅÆ…µ6^õI´àâ,??Ÿê@ß Lu”»»{RRÕU•¨x® ¨¥ÿ[Ía $€0@˜ L€ƒzšŸ——wèÐ!²JQ'SS›#GÆÆjßG 5s¼!†aõõõVVVTÒ?CT¶– 0Hƒ:3}öìYrr2Y¥¨Ó«¯Ö²XÚ—¤ùùù´l 0Ά+ª åã Õ|ÎEËS‰‰‰ƒìôK@@@@@€Úú3fLxxxuuuJJŠžž^MM B¨¾¾ÇñÈÈH.—›““S\\ìíí-[[^^.[ˆ‰‰™8q"ÑÛ×_ííí}äÈggç¼¼¼ÒÒR___¢Œ/¾øÂÞÞ>;;»ªª*22ÒÒÒR$á8.ëvß¾}NNNùùùÅÅųfÍò÷÷'úDyxxääätttÈÊÎÉÉ ž0a‚*»³hÑ¢¦¦¦ÄÄD}}ý®®®ñãǯY³¦¢¢¢¦¦æäÉ“FFF@~Cû÷ïï^OG!4a„üüü¢¢"OOO???ùê©þÿ¾µ Lµ‰šÃÔÂÂâðáÃÄ2ŸÏ‹Å² pttŒŽŽ&^º}û¶|@Èkiia2™>ÄqÜËËëÔ©S“&MŠ‹‹#^­ªªb0ííí'N>>+++((ÈÀ@q.>¥»ÃápBzz¿ÿChnnŽŒŒôòòb³Ù«V­’;±!¥õ÷r4de;(+[¡[@¦ G>>>Ož_õÝQHm//¯òòò<~üøòåËò/RZ/G£¬¬ŒXxôè‘|Ù ÝPÓ/²µµõ“O>±··722²·· “ýËÄ0¬  €Äm‘Þ¡nQ=\]]#""¸\îÔ©Sqg2™!"ª–.]ºsçÎÜÜÜGmÚ´Iö–sçα([X°`ÁÇ=ºbÅ „вeË"## JKKW­Z5sæL„лᄏ}ûöëׯ×ÔÔ>žÍf›™™É.¦6*-@éàÁ·ÞzKöYØüü|++«ÎÎΞj FÊ–F ÊȯÇq¼û€DUö Ô¦¿ýöÛ«¯¾Ú{›ƒ&$$$''߸q£¶¶ö½÷Þ“½wûöí3gÎDEEÅÆÆÞ½{÷ôéÓ‡"DÄÆÆzzzÊ/t2vìØ[·n=~üø£>Z¶l™P( ’}6!!! àË/¿ì©øË3P…ϱȯÿú믣££ãããy<^WWך5kTÜ#@8ŽO:•ê*€º æ´VÅË|}}ýÜÜ\Ù²Móù|üå¥P/ ‰;hÄã]ùåž. º¿¤tð`ss3“ɬ¬¬”H$l6;;;»—î¬u_Ùý2_é€Äí‘ \æë&ø}iuœ™²ÙlÙÀ"CåÙzHhjjŠ^Ž ‘_VÒÁƒ#FŒ˜={vJJʵk×ôõõ§OŸÞK  t@"Y{Ð4êø7¼páÂcÇŽÉF²X¬_ýU¡M/ ¯§ÁƒÄ•~bbbHH†a½Ô€ã8êg¶*HÖ4:ÂtëÖ­ÕÕÕ¾¾¾ÕÕÕ©©©;vìPhÓç@žt؈jkkk~I"‘ô4xÐÏϯ   !!!44´—X,ÖÅ‹[[[÷ìÙ#¿éžF ë•HÔA0ìèu„éÈ‘#oܸaaa1wî\ggçÓ§OwŸµ/<<üÿøÇ¢E‹¦M›6räÈÓ§O«ØùÒ¥K‰I†d ¡™3gš¿ôÛo¿}÷ÝwGe³Ù|ðÁŠ+æÍ›ççç‡233›3gŽñ|¬§¾úê«ÈÈÈ1cƼù曲ízyyýå/QÑ-¿~óæÍ¾¾¾‹-zíµ×ž={–’’ÒïÐ.÷D¨¿ÎŸ?<˜(çïïïææ¶e˪ Q 1Ÿéà'%«U`Æãñ†ú¡¶ü$¡ò[¤Çä¡êü}ÓÝç7oÞ¼råÊ’%K¨®…>ºÏ"Ú6û%„ô²S}6´§»aš™™9{öìmÛ¶=šêZèàúõë!!!^^^}¶ÔÆa¿ùùùÎÎÎ{öì©««SZCŸ ý f\Ìgªf8δÏYD]†ý>yòdóæÍgéÒ¥7oÞì~(úl0`0ÎT+èî™)-egW_¸`eeõÆÜ¹//[}}ø†½½=Õ% ‰ÌÌÌ+VÀ°_ ½u™Oo­­]®®ÛººD fi9|Ë߀€©zz©ƒ—Ú~_Zžæ÷ÈÌŒꮯÏHðúúïé¹ç‡ á?€î L{6ø0 ŽãR)^UÅ_»6ÆÇçPnnoßÐA¦½qt´öðË`ü~”Äb©TŠ×~xìþ}Åï è,Ó>¬Zå-‘üéº^(#„~ù¥|îÜÿ¬ZuöéÓFŠJhÓ>Ìš5ÑÆfx÷õ"‘ÇñK—îΜ¹?+ë¡ú Ó)ÿkîhQ]½!aœ)½1zï½çõïgŠÅ’î¯J¥Òŋݼ¼´ïË’““µb€°Æø{½›…ϧw}¨®…Jt_L'04ªo­­¯¾ºM PœúðíÛýÞß›’ª#//ïÙ³gTWÑ7i;£ã‚­¤Š©?¡m˜_ ÕåPÉÞÞ~Ú´iTWzaª’M›““y"Ñ'§ †ÞþÓ¬ •Ú;íÿÝTÖÕ"Æ%È3Ü~R5Õиgª’U«¼Åb)±Œa˜¡¡>‹eR^Þ÷Wt€ÀÑí3µ?¬,él–à„²bJuMôdüøQ®®ö·o?Ã0ÌÈHÿìÙ÷kjš7løÞÌÌøƒfQ]­Û$Y[+ž^{Žp„2Æ0cLu]ôÂTU«VÍX»6ÆÂÂ8!á;„PMMËž=?ZX yƒêêh‚_Öuù£ÒöB¿ß}Âô°QS†!-xTt„©ªÞzëÕ¿ýmâÁƒÁ66#ˆ5ëÖý­±±í_ÿ:Ïb™øø¼Bmy4P~•Ÿ½í±TŒ¤r{1=d;EÉÐ44 <€ê©W˜èÇñ?N¸xñ·„„5nnc¨*LÛIÅøÍCU÷Î×!eŒþ1ã­'S{Qô<€ê‡îSFa¶‡‡ó»ïž*)Ñé±;&h_Z_z?Iy’2 1Ëñ&j/ €~ƒ0,Ɖ+œœF†„|[Y©ê—Ê‚TŒ_Z_VõË \ªìe YO¦§3ÉÐ;Sž=fjjôÎ;Ç››;¨.G›èécó¿vv ‰ac(†¦žf÷Ü0Ú”ææÃ×¶µu-Yò]G‡êr´‰¡)cÚ§ß“ã†Ûêý9O¥BÜö¯0ÂhSÒØÚ²ââVWT4¬YsV6¨h”«éßö9 eˆ10Ùu½ž>f힀v€0%Óøñ£bcWݸQºqã÷0L¢_¤b<{çÓ\£…Ñã†sŒˆST‹±ÆúFð' ´ü¥’lÊ”Ñß|³,=ý·½{ÿêZ´Éí³µ/ªÓ?ãŽ|eX@ÂÄ×Þ¥§±_‡¦@kÀ8Ó!‘œ\ðá‡ßoݺpÍšT×¢øe]Þyà¶ÁÎå푬,ï’Š¤0. h øÔ˜ZUÅßµ+ÝÜÜ$8f–ê .ůí|b5qØäà‘òëÍÇ0©* €€0*~8‡ÏoÿôÓóÖÖÃgÍšHu9šë~b}cIÇ?â'bpÏ h3øûBŸîçïÿ×÷ß?SPPAu-JÜ%ýíDÍ+ïØ°à<h7¸g:´D"Éòå'oß~vñâgç‘}¿A÷ð˺Ìì †ðÿu Ý L‡\[› àëúúééììÌ©.0$ LÕ¡©©ÝÏï+}}½ Ö³Xðx‚k+u°°·ª¹¹céÒãðaSh ÂTM¸\Ëï¿_SZZ¿vm |Øú0UŸ‰mOZyíZñÇÇÃÝhÂT­¦Msúî»åii·öïϤºÊ<ù¹EÜçæ€nÛ·o§ºÝâä4ÒÚÚl÷î†7ž2ÅêrÔ­în{æ?™1¶p†/´Ÿ€¢À;ïL«­mݱ㢹¹I`àëT—£>¡ôçÏs§pò!b€nà2Ÿ›6Í ›þÉ'‰?ÿüêZÔçÖ‰šŽz±Ç§öƒìð‚‚±XŒaXCCÃzÌ{P ”2Û·ûûø¼vú×_S]‹:4<ì¸s¶öõ²MG’Ò!ƒÁˆ>| Óô æ½(ƒö©$I–.=qï^åÅ‹œœèüaS©O[öÐÀ˜á{bÜà'4Á0ŒÇãM:µ÷6õõõVVVªô¦bKzg¦T"¾ÙÔÎÎ|É’ãµµ­T—3„îÅ×5W¼¶q’ð„„‡3|øðÍ›7ÇÇdzÙl33³M›6©Ò­ìRÇãM›6ÍÄÄÄÁÁáäÉ“†!„¬­­{¹'Þ+ßÇñ¨¨(GGG ‹ÀÀÀÆÆF‹TØú@ P­¡á…§çž™3ÿÝÜÜNu-C¥8½¡ðtM÷õ!__߆††ääd„ÐüùóeËeee=õ†âñxÄB}}=ŽãcÆŒ ¯®®NIIÑÓÓ«©©‘½ÔK'DÙ‘#GœóòòJKK}}}T,²ûÖ~¤€Ö‚0Õ7¼úêÖüãHW—ˆêZÔ !”••…ã¸D"QX&â²§w)„©……ÅáljWù|¾X,@˜Nš4)..ŽxµªªŠÁ`´··«Rd÷­ø€í—ùaôhËøø5÷ï?_½Zç¾ÙÔÔÔ!¤§§§°Ü/ÇŽ‹ŠŠ=zôŠ+ŠŠŠ Æ*©¨¨X²d †a†ÙÙÙI$’ÊÊJUŠ$eë@ÛA˜jЉÙ§N­üùç‡[¶$S]‹öñññyòäIRR’­­íŒAâ)?IDAT3ªªªÐ ›ÍNKK#Î2¤R)ŸÏ7nœÚ¶´„©ñðpþöÛeññ7ÿóŸKT×¢e\]]#""¸\îÔ©Sqg2™!>Ÿ¯âÛ‰–Ë–-‹ŒŒ,(((--]µjÕÌ™3³u k L5‹Ï+{ö,þÏ.Ÿ¿cË–ä#ŒW®œNu9€?@˜j™+<««›?ÿ]¥9âC @i%‰DºzõÙœœ’””º¸ØQ]†Fi'CïèÑw&Mb/]züéÓFªÊ¶I^hÀ¥ðÿc Lµ“ipöìû––¦!!ßÖ×SóaÓ_ŽTÝ:^-êÐÜ¡¯¨ „©33cÆÅ­’H¤Ë–hk¨yëU7[¤4Lmh _y„©–³±‘˜¸¶ªŠ¿re´:?l*êæì~êìcaïi¦¶ É LµñaÓß~{úá‡ßKÕuûòÖwÕâ.é´iÙD« S:puåž>½2#ãNd¤ª_[4õ÷;î~_羉Ÿw@”&Þ|sÜ_„ÆÄÜ8räênH*Ưí|Ânæìc1¤@»À™},Zô׿æŽÈÈT++Ó·ßv¢­àRÜakÜBøNþ”VÞ}÷ͪ*þ§Ÿ&aò÷¿ÿe(6Á0Ô›²Öv(z@«Á' èÇñM›ÓÒnÅǯyã ø&Ô”†$éûqãQjêúI“ØT—€N€0¥§®.Qpð7OŸ6¥§o°·‡'E 9SÚâóÛ-:*ŠÓÓ?´²2¥ºh†FÑ–¹ù°„„5b±dÙ²ííƒú°©°MBVUМ™’àüùóT—УçÏ;޹7akùòÎ|Š£¶3öLO¾þ¸6RK*|4 ¨„) 0L£¿ÓЃT(|>àŒ¦R\"v’XÕÐILL ¢º  s`œ)9à°†Ððÿ±ƒ{¦@S „)ÂHa $€0@˜ªOkkë'Ÿ|booodddooVUUE¼„aXAA‰Û"½CUô²ƒÐ„©šH¥Ò¿ÿýï7oÞLNN®¬¬üñÇ™L¦‡‡‡@ îo"´ßAzƒöÕäÌ™3eee¥¥¥Ã† CY[[ýõ×{öìÑ××â_†aõõõVVVˆ¦;€êàÌTMâââÖ­[G ‹Åb0þøÒy±XioooeeÚØØH¬Ç0,!!Ãá >|óæÍñññl6ÛÌÌlÓ¦M²çΓ_è®°°pöìÙÆÆÆ...Ä|o½õÖ¡C‡ˆùùùVVV=ÕÐÐÐ ¿L|ÖÈÚÚšXßûb–Íår?®bÿÄBjjª££#‹Å ’5@á`ÐB‰‰‰½·177OOO亮oß>''§üüüâââY³fùûûË^õõõmhhHNNFÍŸ?_¶\VV†ãxlllyy¹üÑ¡ü&Æ¿fÍšŠŠŠššš“'O ‚3gÎL›6hðᇮ^½º—êëë–åWö¹ƒ999Û¶mëWÿ&LÈÏÏ/**òôôôóóëý ãªý. ¦$På°¾¾~nn®ü[|>™}cÇŽ={ö,ÑàÞ½{¡––âÕ¬¬,Ç%‰Â²BbÊ÷¯ðRss³X,&–‹‹‹‰Àjnnf2™•••‰„Ífggg÷RCïaÚç&%%á8ÞßþÏœ9C¬,,,”5î„)  \æ« ›Í.))‘ýÈçó»?é~ö왓“±L,TVV?ššš"„ôôô–U×ÜÜéååÅf³W­ZE¬1bÄìÙ³SRR®]»¦¯¯?}úô^jär¹ÜÞ÷Q)YãñãÇ«^ êaª& .(((999111$$ð^jÀqõg}î ‘þýí¿¬¬ŒXxôè"õ€@2ªOé©piY[[Ëáp|||x<ÞóçÏSRR¦L™‚þ|™¿k×®±cÇþòË/ÄýD___Yÿ²kv¥ËJï™feeñ_‹Å¶¶¶lll,,,$f ,..Æq¼¥¥ÅØØ˜Åbâ8ÞS ,ëĉ---kÖ¬Ar—á%%%ªïàúwvvþå—_ŠŠŠ¦OŸ.k<ÈßC”*þ~úôihh¨¹¹¹‰‰‰¯¯/q^&Ÿ5B¡0<<ÜÎÎÎÂÂ"$$DþbïaŠŠUXÇãñÒÓÓŒŒŒ<<<222æÍ›7a¢Ÿ… Nž<™X˜˜KKKb´±ÞËË‹Éd666ª¸ƒýí!´oß>ggg33³Å‹×ÕÕ‘õ»€t0Ó> 0 ÓêÉ¡ýýýÝÜܶlÙBu!Š0 ãñxS§Ní×[´úw´Ü3Õi7oÞ¼råÊ’%K¨®íŸNÑi™™™+V¬Ø¶mÛèÑ£©®E ¸lZÂT§-^¼xñâÅTWÀe>ÂHa $€0¿û¿ÿ»Mu h1xEŽÃ‡'%%Q]Šܺeûõׯ ©.­aJ‚€€ªK¬¶6ƒÎNFCƒ±¶‡i@@€½½=ÕU]Ÿ€!´sçÅo¿ýÙÆfÄ­[Ÿ³>úî™$‘HÏŸç!„jk[nÞ,§º´„)@yy¥MM!Æ… ·¨.­a Pjê-=„H$¹xñ–H$¡º"´„©® Åéé…²}ñ¢+;»˜Ú’ÐF¦ºî§ŸtvþñŸÁÐKMUü @Ÿ Lu]jê¯ò_'%K33ïtth÷)ÔÂT§µµ ®\¹/ûâ&‚H$¹zõ>U% ¥ LuÚ¥KwÅbÅÇMzzXrr%õ ½ LuZJJA÷!úb±4+ë!ŸßNIIh)SÝÕÐÐvýz‰D"Uújfæ]5×€Vƒ0Õ]™™w$=Œ(•Hpx¦@¿@˜ê®´´[õ43~ófy]Ý µ€6ƒ‰NÀïØì¾ývùÂ…®T€V‚3S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0èS]€FÈËË{öìÕUP///¯««„ê*(Du @+a8ŽS]õ“““©®‚bFF\‘¨A*í ºŠÁ¿00pfú;ooïíÛ·S] ÒÏ?ÿ¼cǪ«Ú î™ L€¦@S „)ÂHaÚ?ß|óMPPМ9s‚‚‚öïßßÐÐ@¼4sæÌââb·Ez‡”oqÏž= c çÎÛÑÑÁ­‰dæÌ™---ýÚ´ú&Ð5¦ý€ãxxxøƒvìØ‘””´oß>CCÃuëÖ‰D"ªKÓ3gÎÌÏϲ5¹¹¹¯¿þº‰‰‰êèéémÙ²¥_o@ LûáÒ¥KÏŸ?ß¿ÿĉY,–““ÓÆ£££ Õ¥ \Ogy8ûë“›››¾¾þ/¿ü"[“››ëíí­Ê{eõ`6gÎrk` Lûá¿ÿý¯¿¿?“É”_ijjª§÷Ça”H$ÑÑÑAAA~~~»wïnmm%ÖÏœ9ó§Ÿ~ üûßÿ~âĉÿýïo½õÖ±cÇd þûßÿÊ/tWZZºiÓ¦… Λ7ïÝwßýùçŸBIIIDƒ¢¢"???@ÐS ²|$–gΜ‰ò÷÷WÈMùõ8Žÿý÷o¿ýöÂ… ·oß®úu§¯¯ÿæ›ofgg?–——×××{xxô²‰Û·o+ÔIO¼+44ÔÇÇçƒ>¸wï^O‡5€0í‡ÒÒR''§ÞÛ$&&þôÓO;vìøú믛šš8 {éêÕ«ÑÑÑßÿýÿûßS§N…‡‡'%%UWW#„¶lÙâââ"¿ÐÝÎ;9ÎñãÇ÷îÝ+‹gΜ)‹§Ÿ~úÉÛÛ;%%¥§dee!„ÒÒÒFŒÑÓú´´´ŒŒŒ­[·~ûí·B¡ðÐÿ·wÿ!M¼qÀŸi³3&§„±ˆ-\Á,XΕ’ZÑ÷¨ 7CYÄ¡E¿Pư(2‚¢ „D ‚(Æ Y.¢ô¯ŠhÅH+w°·»Ý{ îQLeee?¦F¼^¯^¯gFdŠ+W®´´´ô÷÷G×yëÖ-ÇsìØ±ÞÞÞâââæææ©©©˜‡(^1³ùI…B3ßÌôt‰ÂqÃ0tÜ××WWW§Ñh!N§Ón·‡B!zÏb±,Y²¤´´”R]]-Œ¿|ù’ŸŸ_QQA· ¢]ºtI©TÒaN÷ýû÷ÉÉI£ÑØÑÑ111Á²ìàà Ëå:sæL¼fÁãñØív­VK9tèÅb ‡Ã‹-úãÅÜš^¯_°`Áððð† ¼^ïŽ;ħ0›ÍEEE17Åq\]]N§#„Øív‹Å’‘‘óEü«˜ h¦I`YöÝ»w«W¯¦/9Ž ‡Ã»víš¹Îøøø²eËè˜xž/(( „(•JBˆB¡ˆ'. ^¿~ýÅ‹cccjµš.\¼x±^¯øðáŠ+233‹ŠŠDj˜…?ºÝn·Û-,áyžÎ>‹=ÊÌÌ4™L<(,,|ûö­ÑhŸbéÒ¥"…-_¾œŽ ýóÌ4Ó$”””x<žÊÊJzâÃ0̳gÏ"ÖÉËË{ÿþ=ýœN?í²,+UN§S«Õîß¿åÊ•?~ü¨¬¬¤Ë7mÚt÷î]¿ß_^^®P(Dj ùr<Ï'>)˲‡£¤¤„þùää¤p>;ååå.—«°°píÚµÙÙÙâSˆtg–e?|ø œ·ƒÁ¬¬¬x‡`®ášijkkÀñãÇ}>_ êêêŠX§ªªª»»ûÕ«W£££çÏŸ7 ¶ž{÷îÑÆ' !ß¾} þ6===55¥ÑhÔjµßïooo'„|ýú•b4}>ßÀÀÀæÍ›Ej`æÑ£G¡P¨§§gæÔt#ÑèòªªªÎÎNŸÏ766vöìÙ¦¦¦dŽY kÖ¬Y¸paww·p?Á)"êܺuëµkמ?þéÓ§7n˜Íæp8ïÌ54Ó$¨Tª .dgg>|¸¦¦¦¯¯/:Õjµ–––¶¶¶:Žœœœ£G&¸ñöövz?ZBšššþûíõë×¼}ûöÎ;Ï;·eË–uëÖ577B²²²ôz}nn.½?¯††††ÎÎN«Õ:ó*¤N§«¯¯î8Âr›Íf0Z[[÷íÛ7>>~âĉd[„ŒŒŒ7Ò«½tI"SD×Y]]]QQáv»m6ÛàààÉ“'•Je¼C0×´O!f³™çù´‡niiÑh4555©.$Ñph¼#`vpÍ4í…Ãá7oÞŒŒŒ444¤º–_ž>}ó”|÷îÝõõõó_À<@3M{Ož<9uêTmm­Èïy¶~ýzúMU€šiÚ3™L&“)ÕUüëp @h¦ÀÇ|9 …B]]]÷ïßÿüùsNNNqqñž={rssS]€ ¡™ÊM_U(mmmùùù@€ã¸ôôô ¿@rh¦²EÓW{{{if J¥jllÜ»woZ§¯üoáš©l‰§¯ Q¡wîÜI0ü”†††¬VëöíÛÛÚÚ„•ÍT¶þ˜¾J£ByžO0ü”ºzõªËåºxñâÄÄÄéÓ§%- ¡™ÊVtú* é:00@ÃOÕjµÓéôz½â?og³Ù4MAAAcc#M™ÛÝHh¦²EÓW…—Çݼysæ ô‰©˜á§"›V¦Y¢I¥ùÈš©lÑôÕééiú’a˜ˆß:¦Q¡4ü”.I$üTXytt”HšÖ ÖÐLe+‘ôU’|ø)]Ùï÷'•Ö {h¦²•Hú*I2ü”²mÛ6·Ûíp8T*Õ‘#GæaGÒòL ‘Ežéü(++»|ùòªU«R]Èœ@ž)ü œ™HO@AR ÎL$€f 4S  ™HÍ@¸›ÿËË—/ñ=Órào ™BˆÁ`Hu zyyyZ­6ÕU@ºÂPÀ5S  ™HÍ@h¦@3ÀO>:‹E걩IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Field__coll__graph.png0000644000175000017500000005421512234777146032410 0ustar00murraycmurrayc00000000000000‰PNG  IHDR±½„7bKGDÿÿÿ ½§“ IDATxœìÝy@gÚðw’`ÂÂ!„„ûR©ÚÖµ‚J+µE+Þ ,µíWZ«]]Ô6vu•ÕV{ŠçR«"U¼°=–R° µJÂ!—B8ä÷•c¾?ÆÆB¸2 y~½™Ì¼óÌ‘y23#á8Ž=ÕÐ  ùò„  0¨/ èA„……%%%Q0j•Ö­[@uÔûòË/©È€R‹-¢: êÁ™ÐpÿB @òäA>ú¯©©iÆ |>ŸÉdòùüwÞyG,_a–-“É0 «­­%†…¡£<;†È@¯)Š×^{íÖ­[ÉÉÉååå/^d±Xä8t:=>>ÞÒÒR7!éxvè <ôÚÑ£G‹ŠŠ ÍÍÍBöööûö틉‰a0þÚu1 [ºtéPÌðšš;;;•C4;¨ç@¯%$$¬^½šH$6›M§Ó•‡(_À9s挛››Í {üø1ñí‰'T äød9+++ ÀÌÌÌÍÍ-..ŽèNÃÞÞž¼•žžîââräÈåËS©©©<ÃáÄÆÆ"„¤RéúõëœãââX,VvvöЮ# ä ×þøãqãÆõi’Ç_¸páúõëb±xÙ²e¡øøøÉ“'+ÔZ²dÉ‹/¾X\\üÅ_¬X±¢ªª !¤|~ðÑG}ÿý÷¯¿þºòTûöí»sçN\\܇~ØÙÙ¹{÷îÔÔÔ+W®üôÓOñññ2™¬K eàzÐkÍÍͶ¶¶äG² <‰DÂf³ÕN²gÏž±cÇ"„öïßÿÜsÏI$òòŽæë< ŽŽŽŽŽŽ ,¨««ë~‡àÃ?œ2eŠÊÀ•+W:88Ì›7O&“577=ztË–-Ï=÷B(66–ˆƒç@¯q¹Ü‚‚ò£D"!õÄËË‹(øùù!„*++µœ×þýûwíÚåêêºlÙ2‘H¤rI !äââÒ}*ggg„öä§TVVæááA”½½½µœ5úòÐksæÌÙ¿¿\.'>²ÙìÛ·okž¤°°(äççcÆçóÕŽ†ã8B¨¼¼œ2cÆŒ‡&%%999½ôÒKÝyÐW¦Òk·““SII Q.**Ò*zòÐk[¶l©¬¬ ÍÎή¬¬zÍÁÁáæÍ›çÕW_õòòúî»ïzíúƒ>˜9sfPP§§ç¡C‡Bo¼ñÆ7” ß|ó@ ðððP¾÷óÏ?»»»oܸ1>>ÞÖÖ6((hìØ±õõõÚ,‚ƒƒ§OŸ>kÖ¬wß}!dbbÒ@÷0â¬ÝÃ0,11q¿ÿ@(>óÌ3555Ê·ÄÕ Gð@58?`03&::º¹¹¹ªªjË–-ÁÁÁ½&ôäSbbâíÛ·¹\®——WkkëáÇ©ŽmÁó &ÿ_~ù…ê(è8?€äÈ‚|@Sygï#`à~2 RFFµ(ZéíGš/® 6ŒòòrGm Àóh€2úБÃ4ûE‹yÿˆÎ i’öá!ä¡Ï£jÁù Œ>ü9÷F^¨íÆÑ\ÿªc€bpÿ¯–Ê®šÜ6„Pá%ŠOЀñ*¼\O§c¡šÜ¶Æ‡pW;ÈÀxå_¨“Ëq„Ý+ú N€±ƒ|ŒTýƒö¦²N„#„\Š?¸ù;ÈÀH]‘ÐíÿMâκü6 ã€r€QÂQÁÅ:…LA ™`…Wúö*4†ÈÀUßkm«•*QHñ?Ô㊞¦`øƒ|ŒQÑÕzCõi¸ö:iÕÝJâ@@>FG!Ç\ªWÈTŸ†£1hEWà®20^€Ñ©ø½¹«EÞ}¸B¦(¼"QH©jJ@>F§ð²„FWßu’¬M^~«IÇñ ' ã"ïR”þÚÐýbÇQñOÐÊ)èß—Î&¹ø÷¿ÎêòÛòÎÕMÞÈ'‡˜˜Òø“­© ŠAÿ¦À¸0­èÓmþúŒ£Žú꧆`¬àz„  @>€äÈ‚|€Ï£&kW´×K-™Tõ @® @>€äÈ‚|è Ãjkkµ3;;{¨ãƒò„ #Wv£ñÔ!ÕQ  £&mS4‹;Ɇ:uŠÇãYZZnÞ¼ùäÉ“\.×ÊÊjýúõ=Õ P(víÚåééinn>iÒ¤7nU‘×UÈ2†aééé...GŽ!Ëß~ûí®]»ÜÝÝ9Nxxx]]9Ujj*Çãp8±±±=ÍkÖ¬Y_|ñ1Iff¦T*UjVVV@@€™™™››[\\œÚ µYgΜqssc³Ùaaa?–Éd€ÏçÛÙÙEDDñÃ`ÄŠ~¬?üÜmò#B(44´¶¶699!4sæL²\TT¤¶†¯¾úŠÏç§§§‹Åb@`kk+•J‰ªjjjÈj‰2B(00ðÚµkmmmdù³Ï>óòòÊÈÈ(,, #§ ©®®NIIa0jçuôèÑ€€b’µk×®X±¢§…õððظqceeeJJ FûôÓO»OØë@=ÿüóþùçýû÷'Mš4sæÌ;wzzzfffæççÏ›7Œ?++«ÿÛèä`Ժ烴´4Çår¹J¹§CÛ¨Q£ââ∲B¡H$ …ï9$%%‘‰òèÑ£ˆb±˜N§·¶¶#œ={–  ¦¦Fí¼X,Vyy¹\.çr¹ééé=-,‡ÃùòË/‰²D"©««ë>a¯k€ˆãø;wBvvvÇŽ#†äää „qÈ®ð „FS)÷¤´´Ô××—(cÆf³1 Ó0¾‹‹‹J¹¤¤$22Ã0 Üåryyy91‚³³³rjçemm=}úô”””ß~ûÁ`L:µ§Yï߿׮]®®®Ë–-‰DG턽®///¢àç燪­­õôô$†2~`X 0 \.·¤¤„üØÐÐ@ü›Fá8Žº•­D™Ëåž;wŽøƒFüë÷ññ!FPI-=ÍkÑ¢EÉÉɉ‰‰K–,Ñf̘ñðáä¤$''§—^zI,k9¡ŠÂÂB¢ŸŸaØÈ‘#‹‹‹‰!DËåjYÐ+·Þzkë֭ׯ_¯ªªÚ³gÇkooG±ÙìóçÏ755ÅÄÄh®!**J dgg._¾|Ú´i}×ܹs³³³O:¡aFãÇß´i“‹‹Ë„ pg±XZN¨bÓ¦M÷ïßÏÉÉYµjUxxøûï¿¿}ûö¬¬¬‚‚‚5kÖ„††²ÙlíkúƒAu¶èèèÎÎÎÈÈÈÚÚZÿ‹/×X¾ùæ›üã›6múúë¯<¨¡†Í›7···ÏŸ?¿¡¡aòäÉ)))}—••Õ+¯¼RTT4nÜ8 3Š‹‹[·nÝÁƒãããmmmBÚL¨âƒ>˜9sf[[Ûk¯½knnÞÒÒ2þüöööW_}uïÞ½ÚWô ôw ŒÚ°yÿÁ¼yó&NœøÑGélB0üÀõ"`Ô¦4-“Á•+W0uÁP©Y[[Û­[·~üñÇÈÈÈ>Å©2!p½­Ì˜1C?O¦/_¾¼lÙ²O>ùÄÕÕõ%N• €ëE‚ëE ùò„ #ï?€ù5•÷`Ì @òäA>@€|!ÈП0jÃæý äÁõ"È‚|€ùB @ò0rðþH€Qƒ÷@‚|!ÈOõW‘‘‘ñÅ_P tÿûßRÃðÞ+Ú|ükfý×õKªBIII¬!<<|P"úFåøðÔùAYYYrr²ÎCC%333##c€• ï½â±YÁ0Nåå僲풓“ËËË^Ð+ÝŒî# üßЃø·ö CtúôéÅ‹JU~øá¢E‹¥* 'ºàþ„  @>€äÈêw>hjjÚ°aŸÏg2™|>ÿwÞ‹ÅÄW†egg^„Sgg1ÀÚ0 «­­íSƒ¾Šô„Ž÷Š¥K—ª ºµ*“ÉÔnhå¹Ý.j(t¼¨T8ðY(o>SSÓ€€Íj9Ç^wíÃS©d°j&õ'(Š×^{íÖ­[D«ä‹/²X¬ÀÀÀÎÎ!éFò?¡´´4¢üì³Ïż@¿éx¯@ø`úôéÇÔÔÔßßÿôéÓä©©©<ÃáÄÆÆ³²²ÌÌÌÜÜÜâââÈÚîÞ½Û½ ÃBöööµµµjG œ9sÆÍÍÍf‡……=~ü˜Žãø®]»ÜÝÝ9Nxx8¹”¬¿§‘{]czB÷{Å|ðøñãS§N©D¢|M–5ÏBÃÊ'ö±#GŽU)Š]»vyzzš››Oš4éÆä|[ZZþG.—k^^åj5Öën9°6˜ôä°€ºýÆ{Ú¸= HDä CóY›mDì<_Ë#Urr²£££­­í×_MNKÎâÌ™3îîîl6{Ñ¢EÝ6ZÁ•$&&ª QËÆÆæÂ… =}K,ÉÎ;===333óó󃃃çÍ›G~Z[[KÖÖÖFTõÕW_ñùüôôt±X,lmm¥R)®Ô ùcÆq\Ãò*W«!°^wËAÙv½B%&&j‡’ û,ðn¿q@ vãöt( ¾mjjŠŽŽ~á…p¿MmdYÃâky¤š?~}}}bb"9šòîçç—™™)‰&OžFV5jÔ(â/'Žã …B"‘( \Ýá Çq Ë«\­†ÀzÝ-5Óe> jè>Då7îëë«vãª=(£Óééé鏯ߦ–Ûˆ(kX|-TwîÜQM¹pôèQbü»wï’•kÐýøÐŸëE\.·  @y{“­HeeežžžD™(ýaYXX „h4šJ¹\\\B  ((ˆËå._¾\yggg•ú÷ïß¿k×.WW×eË–‰D"òdVC%½ŽàååEüüüB•••ÄÇ’’’ÈÈH¢¹‚³³³\.×Ð)˜†‘q ªöŠ/¿üò³Ï>#þ=i¦aV>±‘JKK}}}‰2†al6›¸2 –†åU®VC`½î–úC ĶPù?zôHíÆU{( ï'WWWoÛ¶mÁ‚---šÈÚo# ‹¯å‘ŠÇãiX3dåÄ.Ú.ûsX™3gÎþýû‰…b³Ù·oßV‡Çãe¢Àårû1/͈õT\\¼{÷îÒÒÒ«W¯*Ðý·:cÆŒ‡&%%999½ôÒKä.«¡’^G(,,$ ùùù†ñù|â#—Ë=wî‘x‰ÿ’>>>=-KŸFÖCTíÏ=÷Ü‚ >úè#åÄß%íV¾ÊoËå–””É[jiX^-v½î–úCÇ;€«««ò†xðàBÈÝÝuûã8®vãª=÷“Ùl¶ƒƒÃúõëëêêxиoŸhêTÇ… Ý) **Çl8%ÿ>éì”yzF+ø”)>§O¯¢:@¥”%¹õÚÙn¬°¤Ñ˜Q_C†?nÞ½ûòÉ“™a …âðáe¡¡OÈ劗^ÚUTT3i’ç™3ïS§>0Þ}¿  J¡ÀB7n<øùgÕáÊÈ»pIqB¨ñagáå{Ƨ©©}Ë–³Ï?¿599K¡À ÅÈ‘V3g>£2Ú±c7JKëBTS¦1Þ|Ÿ_E£a! CŸ|rF&ƒ&&FJRÔŽËq„Žð¬X±Bj¤gÌÃIW—lß¾_&Lø×ñã7ärÑ’N§/[6…Nê '‘´îÜùƒ\®@ÕÕµ47wP±~0ê|À`ÐB þèQýÉ“™TG¨Q›×†Ñ1„ÂQk­´ µ_/"úÇñÔÔ»S¦ìüôÓK­­Ré_o+Â0´t©ê½´Ý»¯(·;/.®ÑQ zÉxóA^^eWד}E¡Àwî¼hä ŒVm^Û_oÂQÖþ Y'œ,¤[·ŠgÌø|Õªã 2™BùÞ(ƒA›5k¬­­…òøyy•ññ7d²'Ç +,4êKFÆ›„ å--¦Q  Ðã{m ÙÿŽ8êl”ç¥ÔRè³úúÖ÷ß?±`Al^^5q«@e™L5YeàÖ­ç”ß@É`ЋŠàüÀø´µuUW7*‘ɱ±¿TT4P „Böäf2 Wà·UJÛz|+2ÐCÖÖ¦L„Tª¦Ó ü¼<•þ÷¿¹×®=P¾q(“É ª†:T}f¤ù   JmCÛÏ>»¬û`…$ÅŠnM ¤m á)£þŸhpètÚ®]áÛ¶ÍÃ05ïœÇ0´|ùKÊC¤Rùǧ¨Œ©Pàyy•C¨~3Ò|@6.R&•Ê“’²rrÄ”„(Q—׆uÛpþÇwUMн•ù¿ÿ :|øM:¦òë65e.\ø¼òãÇo”—KˆçÊ=ª'Ú'#ÍU ½ûp:ö¯]Ð}<€*µym˜šÉ;ñû u(SÓ h=ˆ21¡¿þúDSÓä8õõ­»v]R{Ü—ÉäeeÆû Š‘æƒ¼¼Ê®.5ÿþd2ùõëЭ•ñxœÓ¦ö\Žß?ñ¸£N ɽ{eóçï7Îåܹµl¶™‰ !$“)Þ~{ªòh_}õc[[WO•s“S#Í"Ñ_‹ “É ®$2™Œ1cœïß/§,2 C¸I Û”‡`Fñä´¬î"’ÜÜʈˆCÏ<ã|ìØ;ãÇóÏûÀÞÞ !ì…ÜÝÜìÈÑšš:nÞ,¤ÑBˆFC#FýŸŸ{׉ƀÿ†¤  jÑ¢ý®®¶GþŸò}Ë3gÖ°X&Ý'a2cÇòÇŽå …â††ÖË—ÿ^UÕ(UäæVÐhFzÕg>°¶6SîÓÊËËÁÄ„žŸ_åççDaT@÷¬øL+>“üÈve)dx³¸ËÚ•©a* W<¨ßÏãq¾ÿ~¥¥%Kå[â¡ D¢ŠÑ£BŽŽÖŽŽÖÁÁ£†*PC`¼™dbB÷ð°ÏÏ7êçPBÈÚ•‰0Ôðº-1¥¥µK–ärÙ§N­´²RM½Âq<'G§š†+È!äçç¨PàFÞÕ-@±]Y p~ ß„Bñ¢Eû]\lOZÉfèÍç"Q\,Rù!„\]íX,“¼<¸¥lìÜ_f¿ü©q½Qݰ…â%Kº¹Ù&$,ïß=•Úàf²2cloÚ†y{4ò®nBÈ|äó‘#zP!3³hÙ²oÇŒá;ön¯ I{ÕÜÜñðaÜyò$—˵²²Z¿~½†ª0 KMMåñx'66–H"ɲæúqßµk—»»;‡Ã ¯««#'OOOwqq9räQ•B¡Øµk—§§§¹¹ù¤I“nܸ¡!6„½½}mm­L&|>ßÎÎ.""¢§ú5Dx÷îÝéÓ§s8SSSÿÓ§O«ÌBûõâDÆÂ…û&Nô8{öýôE¡™PXááá öÕF ÿsíZ¾“Óºššfª;÷fÞÏ)A…††ÖÖÖ&''#„fΜI–‹ŠŠzª!R]]’’Â`0:::ˆ555äDYsý{÷îõòòÊÈÈ(,, #' ¼víZ[[QÕW_}ÅçóÓÓÓÅb±@ °µµ•J¥Â#æ¾sçNOOÏÌÌÌüüüàààyóæ©­_C„¾¾¾+W®,))©ªªŠ‹‹c2™* Û«ÖÖÎU«Ž»¸¬¿©å$ý¶té¡U«Žõ\ 䃿<~Üää´îÚµªûõ“ÒK«(A¥¥¥á8.—ËUÊYYY=Õƒ:{ö,9&yèW›4Ô?zôè„„b±XL§Ó[[[‰©’’’”«5jT\\1D¡PH$…B¡!xŠŸ41ÈÚ•ÕRÕ%ïR ¼*µ‡cÇ‘Ò1·W\.÷ܹsÄ?8â_¿ñ•J¦ár¹%%%ädž†â/¼f<¯¸¸˜(.—«¶þžïÞ½»´´ôêÕ«ÚLBÉŸ~z)"âД)>©©kÝÜì´Ÿ¶ßrs+BcÆ@>Pùà)¾¾NÐË)°veâ ÔT6$_³ÙìóçÏ755ÅÄÄh9ITT”@ ÈÎÎ.,,\¾|ù´iÓzó­·ÞÚºuëõë׫ªªöìÙÃãñÚÛÛ{™ôæ›onß¾=++«  `Íš5¡¡¡l6[ÛåA!$•J'Nœèíí››…"kH$=MUZZ;{öWqq¿}ùåëF™›ëèµÕBa…½½¥ƒC?ߢ3ŒA>xН¯cAA%ñ÷ -+>£¡!zÂ7ß|#<<<¦L™¢å$›7o ?þ³Ï>[VV–’’ÒÓ˜ÑÑÑ‘‘‘‘‘‘žžžIII/^$.ìh¶qãÆ ÌŸ?? ÀÁÁá»ï¾ÓvaþçСC±±±\.÷½÷Þ[¶lYHHÈܹsBAAAcÇŽUûÈÛ… „„|.—+®^]þ·¾Îq D"1eYY%sç~“ýO.·oÿÀ0Óø°Ã‰IÛ ¾¶¶®˜˜‹G^_²ä…;曚꺃ñ—_Þ=mšŸ@0[ÇóÕp~ð__' Ãà)`íÊÒ2\¹rSG  uÚзðnÞ,|ùåÏΟ¿sð`ÔçŸ/Ö}2èê’VÃùZÐ_ÅS¬¬XŽŽÖyy•ÁÁ£¨Ž†3fèóI¶þ„×ÐжqcRjêÝ¥K‚ÙTu$üàAµT*‡| äU~~Žð¢4WZZÞæÍÉÍÍû÷¿1oÞsF’“#f2^^#)ŒAoA>PåççtãF!ÕQ0LPåã3’FÃòò*!y—‚>B_d†"7·rÇŽ iiy3g>³mÛ|φêˆþRQÑÐÐÐ=UôöuU¦¦#\\l¡É)Èü²üÒ*¸“Ô ~xò•Wv‹Å 'N,ÿöÛ·õ* „„B1†aðZ´žÀù¾¾Ð‹@Ö|Vþ¹:„#¥õ¦¦¦y÷îˉ‰¿;;Û8:N?ßS/ŠÙT5uÕÔðósºz5‡ê(ÅlPÃ××qÿþÿJ¥r:Õ±ÊØxš"„$ÅíÔjoï:räÚiR©üƒ¦/[6EgÒõ›PX1>•O?è9Èjøú:I¥ò¢¢ÇðzUcÆ´¢›ÙšÔµó¬¨ŽE¿tuÉ2cc©«kyýõÞÿeggýºO VkkçÇµÐØTÈjxy9˜˜Ðóó« 9O–¤HõÅ8Ƭ¹¹ãðá_¿ûîºT*_¾üÅe˦ØÚöÞªžÈË«T(pÈ@>PÃÄ„îáa·”‡iõýVª£Ð mm]'OfîߟV_ßðþûÁNNÖpNŽØÒ’åêjKu ú òz¾¾NðâLÀö`UÜn¦: ŠÕ×·~÷ݵ#G®wvJ_}ÒêÕÁŽŽÖTÕ"QŨQ\ýlø¤' ¨çë똜œMu€b£ÚZh¼%TÅÆþrþüvv–~øê’%/XXèûc D"ñر|ª£ÐkÔóõu|ø°¶½½K÷ý³@¹{÷ÊüõâÅ»ÎÎ6Û¶Í_¼øo†þCP(ðÜÜÊ%K^ :½ù@=??'…ð þPãÑÕ%»xñÏï¾»vûöñcù±±oÌš5vxtìXZZÛÖÖ=Uhù@=WW[Ë$/¯ ò0Tÿç?é.üÑÕ% ›°sg¸¿ÿ°:tæäˆétÚ¨QÐbPÈêÑé4oï‘ðb0¼á8~ãFá±c7®^½ommöÖ[Sß|s²Þ.ÖL$»»Ûéó³ÓúòAüüœ W;0\Õ×·ž>uâÄÍââš±cù{ö,™7ïÙ#†ízªÐưÝüçëëxäÈ5ª£`0ÉåŠK—î8‘qóf!›m¶dÉ ‹Oôòr :®!'V¼õÖª£ÐwzäëëXYÙØÔÔ½!9IQ;“Í0³5ìK µµ-gÎÜNHÈxð zÂ÷={Ïž=ÞḬ̀[ i©¾¾µ²²žLîäƒùù9á8^PP5a‚;Õ±*]]Wä·Ðnü2GªéÎNÙ?æ$'g§¥åZ[›-\øüþ³ÌÇÇ —¥ßD¢ „¼ö WzÄå²--YyyŒ‡©Áõb$“)ÒÒr““³úIˆaجYcVLžìM£ãÓ¹B¡ØÎÎbäÈaxŸ|pA>è†a>>ðb€l¼XåMTG¡­‚‚ªsçþ8wîNiií¨QN›6Íš?ÿ9{{Kªã¢’HTOhò&~~Ћ@6¦9ß×à Óã?×Õ?ÿǹsäæVŒi={ö¸°° ðô A(¿ø¢/ÕQæƒòòò›7oêrŽÔÖVùçŸâÓ§OSHÿñùü€€ª£PeX{‚¼Š)ïâŸ:|ŽÎ‘R‹¥¥ÍçΕ>|ØjfÆ7޳zõ//+ “æåeäåeãòx“Éäóùï¼óŽX,&¾Â0,;{0ßt?èêá —Ž÷ºßL2™ ðÚÚZÏw¸‚›É}¢ù@¡P¼öÚk·nÝJNN.//¿xñ"‹Å ììì¤:4 SºßÒÒÒ$Jž}öÙ!šQOètz||¼¥¥Qw74ˆ„B1tkª=}ì¿èèÑ£EEE………æææ!{{û}ûöÅÄÄ0ú­–0 «©©±³³Ór8@Tì l6{ˆ*W¡¼éÉ2†aK—.ÕMÃ^kkgii-ÜLÖž>ž$$$¬^½š8Øl6N'?Êd2@Àçóíìì"""êêêˆá†:uŠÇãYZZnÞ¼ùäÉ“\.×ÊÊjýúõä'NœP.tw÷îÝéÓ§s8SSS¢ÿ¢Y³f}ñÅÄ™™™vvvííí=Å@žïeâQ{{{•ëÊÃqßµk—»»;‡Ã ×~‰†1Ýï --- ÿ#—Ë5ןžžîââräÈÍóR»;)oz•݃Ü0 KMMåñx'66!$•Jׯ_ïàààììÇb±à£yyU ׋ú@—c½Öô:šÍ… zú!”••µsçNOOÏÌÌÌüüüàààyóæ‘߆††ÖÖÖ&''#„fΜI–‹ŠŠp/..V.*ÏÂ××wåÊ•%%%UUUqqqL&³³³óèÑ£Äk×®]±b…†jjjTÊ*É9’Ã÷îÝëåå•‘‘QXXJö;Ôëi¦Ïýõ:šî÷eÄ6ÒP``àµk×ÚÚÚ4ÏKíî„÷°ŸàOï3!!!ÕÕÕ))) £££#&&ÆÛÛûöíÛB¡0((ˆN§«ìº=­(ãì¿èر>>› Õ }Ì ãÆäGò÷)‘Hðÿ¼½½;FŒ““ƒjll$¾MKKÃqœøs§\îé—Óý«††™LF”óóó‰ßgCC‹Å*//—Ëå\.7==]C ýÈ£GNHH ŠÅb:ÞÚÚÚ¿%"z> |OÀq\CýIII䄿¥vwµËgÏž%«ª©©ñöö>~ü81Ú½{÷´Ùp#Î7žž=ûkª£0$úx½ˆËå% Ù¤„TVVæééI”‰Byy9ñÑÂÂ!D£ÑTÊÚkhhAAA\.wùòåÄ@kkëéÓ§§¤¤üöÛo cêÔ©b臒’’ÈÈH¢Y‹³³³\.Ä%2P”ï šëwqq!GÓ0/µ»“–œ•«*++óðð ÊÞÞÞ}]c#VøûÃ̓>ÐÇÃÊœ9söïßOü'B±ÙìÛ·o«ŒÃãñŠ‹‹‰2QàrmÃïÞ½»´´ôêÕ«äðE‹%'''&&.Y²Ã0 1à8Žú˜¸\î¹sçˆ,­P($‰Ï`-‘¢|OÐ\¿–Ù¥§ÝI*]“:99•””墢¢>Uel <7^‹Ö7ú˜¶lÙRYYš]YYyæÌ™mÛ¶©Œóæ›onß¾=++«  `Íš5¡¡¡Z6 9qâñ‹" ¨Û]D©T:qâDooïÜÜܨ¨(„P}}=BhîܹÙÙÙ§NŠˆˆÐ›Í>þ|SSSLLŒò¬%‰ÚˆáQQQ ;;»°°pùòåÓ¦Áë;(غëwý¤žv'ôô.ÑÓî¡,22rÇŽwîÜÉÍÍ%nVy_Ö<|XÛÖÖ‹úF—§´¼jŒãø£G"""lllÌÌÌBCC‰ÿeÊW»ºº6nÜèììÌáp–,YÒÓ¥ùîe„P||¼JAYVVÖ… ÜÜܘLf``à¥K—BBBüüüˆzæÌ™3fÌ¢ÜS Ç9r¤­­-Ñj…Äb±êêêT#‡wuumÚ´‰ÇãYXX„„„÷Š{]" ýþ®ó=¡û*íwýd¹§ÝIy—PÙ=Èû*÷™:::V­ZeccãîîNܯþóÏ?{]‡È(臘ÞåñþÞÚÚIu †ÃuøN’Ó§O/^¼X—stóæÍ›8qâG}Du Z!Þ‡“””Du ª†Áž@9¡PøÌ3ÏÔÔÔØÚÚjðÄÄÄE‹é&0=ñÙg—SSï^»¶™ê@ ‰>^/ÒOmmm·nÝúñÇ###©Ž©1cÆDGG777WUUmÙ²%88¸×d`´„B1ƒ|€¶$Å %TGz=Uô÷“‰FñFH¡ÀŠŠØ!SS©™™ÌÔTÊbɇôñÒÌÌÌI“& á Æàöïú—p„rÒ©h"•Ê ªV¬x‰ê@ NóŸÏ Óåõ †»¸4Ý»çðøñ“ý1 1™2 "=t™šÊLMe4Ú =¥5iÒ¤€€€Áªm➀!Ì©e B¨ˆóŽ éIº°°0>ŸOuºSXX-•Ê¡±i?èôùd€zð zöì¯[[;år9FȾÇ1 ÙÛ[zy9Œëâååð⋾ÎÎ6F HsZÏ¿™šwÜ×~Œy¯ãª$'goØøàÁ.zïc%pÿ@×¼½G&$¬`0hÊ=‘oì@á8þøqóÍ›E‡ÿúÑGÉÔ… T^ª§10{p©žêX€&"‘ØÛ{$$ƒ~€|@çŸw%RÖýîÁ“!t:mùò—àä@O(äøƒKõ ®á~¨WÈá¬ZåäTøûÓýù€^‡/ëéf2†a,Öˆ÷ßY·AUüÞÜÕòä5 ]-òЬfjãˆDbx2¹ P&$ÄçNõ l0 [·î++S‡zRxYB£?ÉÞ4:Vx¹÷wJTU5Ö×·Âkpúò•–. ذa†ÊY†™›3/]º÷ûïÅÅž"ëT”ü,QÈž\#RÈð’Ÿ%²N…æ©%„B1BõäŠýýï!ï¼ó¢òGï¼3•N§-XûÁ ååðW”beךä]OÝ0wâe×›¨Šh Vp¹l6ÛŒê@ äêmÛ6wþüç BˆN§y{ܰaƹskNž\YPP¸#:útu5}(óàröô£¡ÂËu…4‰àµýù€z†íÙ³øùçÝ šBoÚôqº0uªÏåËîÛ÷Æõëcbb.65µS¬Ñéj–—]oRiP¤ã®5u5Ë©Š ôD(¬€|Ðoô“É8vì]OO‡±cù3fŠŒ+ð⟠õ—‰Ä~~NêûZþì X^^åÎ?üô“pêTŸ­[çåDuDÃÜ/KB/êNu @½9s¾=Úi×.ëG]Àùóós:vìÿW56¶‡„쉎>]]ÝHuPPC¡Àóò*àÉä€|`ðžn–úoh– ŒÓ£Gu--ÐØt  Ð,¡PL£apÕt  Ð,3‘¨ÂÍÍÎÌlÕ0Èà 4KÆ)'zª(ÈÓJ³ÔÙ³¿†f©`x‰*àÉä‚|0œñx6Ÿ}¶è‡>451þÞÅ‹äæVR”³ä°äÁå}ÔÐÐ&Kàü`€àùcqíZÁŽ©B¡xÁ‚ç?þ8täHkª#`ÐܼY¶ïöí:9±©ŽÅ€Áù±˜:ÕçÊ•¿8•] ÍRÁ0#Up8æ òf©`¸ áɃòÑQi–ÍRÁƒ|0( )²Yê‚Ï g‚ƒ?ƒf©À@I¥ò‚‚jè©bà 5²Yê /x¬Zu|öì¯23‹¨j˜‹ŽŽ633«¯×õ»d2†aµµµ:ž¯>îê’ùûC>(È@¹Y*sÁ‚ØÅ‹äæVPÔ°µwïÞ_ý•Ãáèx¾t:=>>ÞÒÒRÇóÕ‘HlbB÷öIu òxbÜ8þéÓ«W54´½òÊž+Ž••Áû¿žÒ,îlw°’ŽŽA‰§'Êçdð¥K—2™Ì!5%D¢ oï‘&&tª1xÀSÈf©÷ï—¿ôÒ§Ð,UÙïßTüþÍ_gN†:uŠÇãYZZnÞ¼ùäÉ“\.×ÊÊjýúõ=Õ€aBÈÞÞ¾¶¶V&“ >ŸoggQWWGŽ“žžîââräÈͳ¸{÷îôéÓ9Ž©©©¿¿ÿéÓ§Uf¡\FOç†ÔÔTÇápbccBR©týúõÎÎÎqqq,+;;{ÈVä ƒž* €:]]²øø›cÇn5ê£ØØŸÛÛ»¨Žˆz?Gÿ]L~D…††ÖÖÖ&''#„fΜI–‹ŠŠzª!TSSƒãøÎ;===333óó󃃃çÍ›GŽxíÚµ¶¶6ͳðõõ]¹reIIIUUU\\“ÉìììTžEOe„PHHHuuuJJ ƒÁèè舉‰ñöö¾}û¶P( ¢ÓéYYYC³Ÿ¿¿ààÁ4ª£ MZ[;ccöñÙôÜs[ããoÊdrª#¢R÷|––†ã¸\.W)k8˜’eooïcÇŽsrrBÄIIIÚÌ¢¡¡A&“cæçç+î{ÍgÏž%«ª©©ñöö>~ü81Ú½{÷4/‚^©ªjprZwíZÕ p½hÍR5³°°@Ñh4•²6ÊÊÊ<==‰2Q(//'>º¸¸h3‹††@Äår—/_Þ§È•«*++#ïjx{{÷©*j …¡1càáƒAùôŽl–:nåJh–:8x<^qñ“Ng‰—ûä ¦eR *..Þ½{wiiéÕ«Wû4wâÖÉÉÉ©¤¤„(ÒÆ‰*œœØ66æT2@>Úâñl¾ù&òÒ¥MMG@³Ô{óÍ7·oßž••UPP°fÍšÐÐP6»oÝïH¥Ò‰'z{{çææFEE!„ÈÇ$ 9šr¹'‘‘‘;vì¸sçNnn.q³Z%aè-¡P 'ƒòè›qãø§O¿ÍRnãÆ ,˜?~@@€ƒƒÃwß}××:Ëårß{ï½eË–…„„Ì;!4vìX"7(—5ÁÁÁÓ§OŸ5kֻヒ211é×béôT1ˆ ¿kÐO8Ž_¼øçÎ?ˆÅ’¨¨É6„X[›QÔÐú}¯!4qÍ0oÚ( Ÿy晚š[[[ªcéE{{—Ïæ}ûÞ˜3g<Õ± p~ú‰ì-5&fá… Lš³oß/RªãB×8k™ ®\¹‚©#†:Èþ3fLtttsssUUÕ–-[‚ƒƒõ? „òòªärôT1Xàü ‚ÖÖΣG¯óÍϬ?|uÉ’ ø«aHrrrÖ®]ûûï¿ã8>yòä õCÔƒ"!!cëÖóùù;i4øۡç €AS_ßzà@Úþ“îâÂùÇ?f††Ž3”{’À@}üqʽ{e©©ë¨d˜€?q`ÐÍRÿûßèQ£¸+WŸ3çëŒ Cj¹ NNŽº¹DÀ óð°?tèÍ~Xgj:báÂØÅ‹ˆDÐ, >Çss+ qÑ ‚|†Äøñ.D³T‰¤õÕW÷¬XqìÑ£:ªƒÃÊÇu--p3yA>ChêTŸ«W×½¥Nº3:út]] ÕAaB$ª Ñ°Q£àü`Ð@>CK¹YêÕ«9S¦ì4Üf©ƒòþ0XD¢ WW;3³T2|@>º`bB_º4àæÍß?øë¯ Œ9q"C&SPWߨ¼ÿP zªt€î˜›3‰ÞR.œðñÇ)ÁÁŸ¦¦Þ…Ï  §ŠAùèš­­ÅLJ¦¥m$š¥Îž ÍRAŸ56¶‰Å ðZ´ÁùPƒl–jfÍRAŸ‰D•8ŽC>\• Y*è‘HÌá˜s¹}ë!hùPoêTŸ+WÖ8uï^Ñ,µ¶š¥M„ŠQ£œ¨Žb¸|ôMö w*IDAT†Íž=þ·ß6ÍRw|þùm– t@(„ž*ä GÈf©k×¾rèЯúÖ,Õ’7Â’­Ý©'•Êóó« qÑ ƒþMžª«kù꫟Ž»îêj ½¥‚¿äåUöÓOà~òà‚ó §lm-¶oŸÿ믛F~Ò,õæÍBªƒzA$ª01¡ûø8RÈpùè5¥ÞRMÂÂö-^|@(S ˜HTáå5ÒÄ„Nu à ä`ÆwIJZM4K ù|ÅŠcB³Tã=U ÈÀ`(7K ‚f©Æ ^ƒ3D C¢Ü,õÊ•û;bb.¶´@Ÿ£Fäñãæºº8? €á!š¥fdÖ­{娱ëAA;õªY*RÄ $hY4 CEö–:kÖ¸>Jž6mÈ{K…÷è‘HìèhÍá˜SÈ0ù6¢YjZÚF¢YjhèW7n U³Txÿ> +àbÑ|†OO‡C‡Þ¼xq™Ùˆðph–:œAOCò>ž}öI³Ôúzh–:<µ·w×ÀùÁ|†›©S}®^…f©ÃS~~•\®€›ÉC„Au@Œ³ç 3176>¾ý›o6vv–¼Â »¡éŸxU wþE¢ SÓnnvƒ@ŒÇºu먎‚íí2SÓ±ÂÕhñ Öf„222¾úê«þMK¼ö€N‡ Cò±X´hÕQ€BýÎ"‘º¹:f†Çq‘¨ ÈÃPVVßÜÜ‹†ä€a +h4lÔ(ÈCòÀ0ˆDb[ &Õ [†A(¬€'†ä𗦦¦ 6ðù|&“Éçóßyç±øI¯†eggâ¼½BÊç8f̘-[¶gÏžýÊ+¯?ýôSOOO™L†aXmmm÷ØÔT¡ã5†ê)`J…иhhA{Sð„B¡xíµ×0 KNNöð𨨨8|øp```AA“ gè½ ÊÌÌ$Ê]]]¿þú«T*mkk333Cݺu+((ˆN§ÇÇÇ[ZZjYgZZÚøñãÉÚO8XúðÐijj//—ÀÍä!çà‰£G]¹rå…^°··7nܾ}ûþüóOÀÿ4ôôßv(þó¾øâ‹YYYÄc·7oÞtttäóù¿þú+ñ-‘0 [ºt)‘_µ‰Á‚­„NÂ7+ÇC–•¦–HTã8\/RÀ «W¯67ª[y•cL&|>ßÎÎ.""¢®îIoq†:uŠÇãYZZnÞ¼ùäÉ“\.×ÊÊjýúõä'NœP.tw÷îÝéÓ§s8SSSÿÓ§O#„fÍšõÅ_#dffÚÙÙµ··÷ƒÊáŒè¥ÃÞÞ^å°«<Çñ]»v¹»»s8œððpí—¨»   ÆÆÆÜÜ\„ÐÕ«W_yå•+W® „ÄbqEEÅÔ©S5Ä–œœìèèhkkûõ×_“u¶´´4ü\.×¼ ÒÓÓ]\\Ž9¢9xµëY9•Ø”sCjj*Çãp8±±±!©Tº~ýzgg縸8‹5tW´D¢ kk3gg›!ª „ŒB(11Qó8666.\ÐPCVVÖÎ;===333óó󃃃çÍ›G~Z[[›œœŒš9s&Y.**Âq<>>¾¸¸X¹@T¨< __ß•+W–””TUUÅÅÅ1™ÌÎÎΣG#¬]»vÅŠb¨©©Q)« $çHß»w¯——WFFFaaahhhXX˜–K¤–——×·ß~‹ãøsÏ=wöìÙÔÔTÇSRRœœœ4Ç6þüúúúÄÄDƒÑÑÑwëÞ‡^Ãâ^»v­­­Msðj×sO+P%àêêê””"Ș˜ooïÛ·o …Bâj˜Ê6U+11±Gž¿ÿýÔÂ…±} ô 䣠M>`07nÜPž„ ‘HðÿL½½½;FŒ““ƒjll$¾MKKÃqœø«\îéÑý«††™LF”óóó‰ÃPCC‹Å*//—Ëå\.7==]C ýÈ£GNHH ŠÅb:ÞÚÚÚ¿%Âqüí·ß~÷Ýw?~eÊ”«W¯74OËãñ´™…†Åwqq!GÓ¼Úõ¬%gggåªÊÊÊ<<<ˆ²··wŸªê™L‘›[ 7†äðÄœ9söïßOüõC±ÙìÛ·o«ŒÃãñŠ‹‹‰2Qàr­½GPPPqqñîÝ»KKK¯^½J_´hQrrrbbâ’%K0 ÓŽã¨éËåž;wŽøs¤P($‰O¿áÅ_ …gΜyõÕW‰!3f̸téÒíÛ·{ÍZöI®añµLÀ=­gm¨éääTRRB”‹ŠŠúTUŸ?îê’AcÓ¡ù<±eË–ÊÊÊÐÐÐìììÊÊÊ3gÎlÛ¶Meœ7ß|sûöíYYYkÖ¬ e³ÙÚT~âÄ âÀAP·›¥R©tâĉÞÞÞ¹¹¹QQQ¡úúz„Ðܹs³³³O:¡!6›}þüù¦¦¦˜˜åYK$µ!㢢Avvvaaáòå˧M›Ö—u¦ÊÍÍËåž={V9üðà Ãßß¿§ú¤ß›€ÔÓzV‰G›Ø"##wìØqçÎÜÜ\âfõ½iC(¬01¡ûú:Eåà/”^­:‚´¸€ãø£G"""lllÌÌÌBCC‰¿ŸÊ÷ººº6nÜèììÌáp–,YÒÓ¥ùîe„P||¼JAYVVÖ… ÜÜܘLf``à¥K—BBBüüüˆzæÌ™3fÌ¢ÜS Ç9r¤­­-Ñ~‰Äb±êêêT#‡wuumÚ´‰ÇãYXX„„„÷Š{]¢ž,]º”Íf“èqçñx³gÏVÞjcS{½¾û¼ú½ ÈrOëY9µ±¡n7`:::V­ZeccãîîNܯþóÏ?5¬B?îlß~!8øÓ>MúÃûõ–"`X0 KLL4Ü÷Ì›7oâĉ}ôÕ€ …Âgžy¦¦¦ÆÖÖVó˜§OŸ^¼xqŸŽ<‡lm-öîXŒ p½èµ¶¶¶[·nýøã‘‘úr,¸råJ÷ž$0 T‡¦kcÆŒ‰ŽŽnnn®ªªÚ²eKppp¯É  § Ý0àGO1¸|ùò²eË>ùäWWWªcybÆŒpVMHLL\»v-—ËÅq|òäɇйÔÔ4×Ô4CO:ùèµ… .\¸ê(€zþþþ¿üòËPÏE(#„ ±©Àõ"€^‰*FŽ´²µµ :áò@¯ …b89РȽ&UÀÍdÝ€|Ð_²¢¢Çp~ p?ÙXdddP‚‘zô¨¥¹Yêãcmb¿ê㮘Ÿ_)“)àü@7ày4£0D½m`ÝÎîu:ݦ««¬££¸³³D.o¦:(êiyä9y2S 8[P°“N‡l:äàüÀ(@Ö§VnneHÈçæÆb¹ã8îîn7kÖ¸éÓG?ÿ¼æ4 +üüa-霠 ß}wmË–³ Å“ŸÛˆŒ®.ÙˆŒÉ“½gÎ|fúôÑŽŽÖÔF¨Ÿ,ˆõôtؽÛP»Z1,ÐÇ—.=|ýú©T®<œøç+—+ÜÜìfÍ÷Ê+£'Lp§ÑàúBá8>jÔG7Îzë­)TÇbà, ]À0lÏžÅ#F˜¨¼¤@.WÈå „ÐÇu¦Í›·÷ܹ;Ô„¨ÊË%MMÐS…Î@>@GœœØ{ö,Âqõÿýq§Ó±—_=þs:Lo …b ÃF†Æ¦:ùÝ™;÷Ùðð¿1j~w ÍÆÆbß¾¥ÐŒ$V¸¸p,,˜Tb,  Sÿþ÷BGGv÷3 ~àÀVV¦”D¥ŸD"è©B§  Sff#öï_ªÒŽƒFÃØl³ªªFª¢ÒOÐS…ŽA>@×&Lp_»öòÁÄ„>f ÷•WüW¯>ññÇ)RjÃÓMMÕÃù.A>€ëÖ½êí=ÒÄ„A¼[mïÞ¥_~¹äûïW\ºt綾>ÍÎ.¡:@êååUà8çºù ˜˜ÐˆÂ0„ãøÖ­ó||B/¾èûÓOÿðõu\° öóϯíP–P(¶¶6ãñl¨ĈзnÝJu #;; KKNߺu.Ù¦ÈÌlļyÏ:8XíÞ}åÆS§úXZ²¨“* ™&&´Å‹_ :#çPæí·§ÆÆª60Å0léҀ˗?”HÚ¦MûÔhO‰*àɃ|e0 ³²Rÿ÷ßÇÇñ‡> Ÿ¸zõ‰>HhmíÔqlÔ’Éyy•ðd²ŽA>@O1™ŒíÛçÿýŠk× ^~y·QÝd.)©éèÂÍdƒ|€^3ΛÌB¡ØÄ„îççDu ÆòúÎÎÎâèÑwþýï°ýûÓ/>PYÙ@uDCN(¬ðð°1^ТS0äM憆¶iÓ>={v˜ßd†ž*(ùƒAÜd~ãÿÛ»Û˜&ò<àÿ=-‚’í‚Û ÆD¶<½hbÀJ]‹{˜…FPQÂ9¢ B œOÔ­ c5 Y’bEˆ/Tîi‹]‰VZ æ„R(Pæ^Œöº åÁÂÌ”ïçÕ0æÿHæÛéoúŸ}.ÞdÆL¬@ðɲeKNžü›k7™{{Þ½ëÇõÁÂCðDâÊMæÎN!y°ð¼dßdNH¸ðÇF¶+rµZïëëõí·žl²è øÊÖd‰‰ù§Ë4™µZ.X<à7×k2c¦ ¶ xϾɼ}{¯›ÌËXW×;ÌTÁ 䀋H[ZŽÿðƒˆ×Mæß~{;66Ž›MY<pB!ï›Ì^ ø‹¿¿/Û…,FÈ—Â÷&³FcXm{˜(,$üÑ\›Ì˜©‚EÈ×4¡ÉüìšÌ4Mk44“Ù‚<pe¶&óÏ?ó É¬×ÿ·¿7›²yàâ&4™»»¹ÛdÖjõEáæ"¶ \Ÿ­É<<<ËÝ&³Z­_³æ/¯/?Cæò`±øî×_r¹ÉŒi®Ù…<XD8ÞdÖjÑLfò`Ñáf“y``¸»Ûˆ›MY„<XŒ8Ød~ñâ MÓø¼ˆEÈ€EjB“ùÖ­ÿ°[Z­_¹R°fÍ7ì–±˜!5[“93óßì6™µZƒX,¢(Š­y°Øq¤ÉŒ™*X‡<BØn2[­ãops»ð ‹MæßïÅLìBÀÿ±ÕdÖjõK–¸~·0ÃÁ!`¢ Mf“iÞ›ÌaÝ:ßåË—Î÷@àò¾À®ÉüòÇç½É¬ÑèñÍÖ!`JI`KË? ÉŒÇpòùs“ù_óÑdîë3½{÷7›²yÓ`šÌ÷ï›&sg§‚›‹X‡<€Ù°aõ<5™Õj½—¯¯—³vsƒ<€™bšÌ¿ürйMf<ö€#0;[·8·ÉŒ™*8y³æÄ&ó訵«ë½X,rby07MÓlןðnvÏ¥K}½½ÿj2=êœóNÜÜh˜ŽF£ihhàøùv ÛÀŸGEE±]8_CCÛ%L±„ €<BÀ@!È>2›Í—/_–ÉdÑÑÑ2™¬¬¬¬¯¯yI*•êt:'ŽåôraDé$:ÎjµJ¥Ò?Ϊ0Ç¿Â/¸ß€ghšÎÉÉ¡(ª¨¨H$Ææææ#GŽÔÖÖ.]Šç‹ÍÔ¹sçÖ¯_oûÑÃ⨼¼<«b®xæþýûƒ¡¬¬L,{{{ûûû=zT¡P¸»»³]ÚÜMõ.{þÞ} O;nnnEEGG/æLEðŒR©LHHX¾|¹ýJæŒfûÑjµ* ™L_RRÒßßϬ—J¥*•*))içÎW®\yðàAbbâO?ýtéÒ%ÛJ¥Ò~a²®®®ìì츸¸ØØØ´´´ÖÖVBHnnn}}=³V«·X,SÕ`;Å3ËR©”’0áÔo¿ž¦éºººää丸¸Â™ÑT†††LŸÛ×3ÕXŒÑÑÑÊÊÊ]»v%$$ܺuËñ(ü‚<à™®®.ÇÛܸqC¥R]¼xñÇååå¶—ZZZ Ennn]]R©¼víZNNN}}ý›7o!yyy!!!ö “ûùùUUU]¿~=))©´´tllL*•>zôˆÙ@¥RmÛ¶íæÍ›SÕ0ÁÇ !«V­šj}ccãÝ»wóóóårùÈÈHEEÅ h*YYYÿìåË—ö/9‹RSSÓÞÞ^\\\YYÙÖÖæ`ÞAÿ€gÌf³ýy“yMinnöôôd–ïÝ»·ÿ~±XLÉÌÌLKK3›ÍÌ'ã2™låÊ•[·n%„ìÞ½Û¶Üßß/‰¢££™=Ø&»|ù²@ `.GÂÂÂFGG###+**úúú„BakkkAAAyyùT5ÌASSSZZZPP!$;;[&“Y,–eË–M{DSíP.—Îv,BHKKËBCC™ãJOOŸÛqò€g„BáëׯmsÞ577[,–ÄÄDûmÞ¿ÿý÷Ÿž0Ã,ôöö®]»–"Èç‰Tí—gÎd2ÕÕÕ©Õj½^ïççǬ\±bExxx[[ÛºuëÜÝÝCCCÔ0oß¾-)))))±­éííeFÿú#šùX„£Ñh[¶-¸äÏDDD455ÅÄÄ0ïÐ===Ÿ?>aƒÁÀ|àÃ|l" U@fffPPÐÁƒ7lØ@ÓtLL ³>**êÎ;ÝÝÝÛ·o§(ÊA Ì4Ÿ½½½3T(>|8""‚ùõÁÁAÛÅÓ9ËÇǧ§§‡¹>ÐëõóT+Ð?à™ÔÔT£ÑxâÄ Ng4ÛÛÛ«««'lSóâÅ‹žžžóçÏoÙ²e†gO¥RÉœ»m dRëÕjµŠÅb??¿îîîÒÒRBÈÀÀ!$22R§Ó©Tª;v8¨ÁÓÓóñãÇf³¹¶¶Ö~hf'“1ëccc …N§ÓëõgÏžÍÊÊšÍßlvS]]­V«{zz¦íZó ®xÆÛÛ»²²²ªªêøñã###7n,,,LII±ß&99yhh(??ßb±lÚ´)33s†;/--ÍËˉD¶Bˆý Q.—;vìÂ… W¯^ Ø·oßàààÉ“'«««=<<ÂÃà Ó†ŒŒ ¹\^UU•‘‘qûömfeXXXzzzCCƒ———}=¶õ)))‹%??ßd2…„„Ïõï7=Çc¥¤¤˜L¦‚‚š¦:ÔÑÑ1•,0<€C(Š:}ú4ŸpêÔ)±X¼g϶ áœÖÖÖ¢¢"ŽŸoq}N`±X^½zÕÑÑ‘‘‘Áv-Ÿ<}ú4''gòú½{÷ºÒMAN„<'xòäÉ™3gRSSW¯^Ív-ŸlÞ¼™ùÌòœ@"‘H$¶«€¯‚û‹€ä0@òè'p‹F£a»p>^ü[ñ}4ùʉ؀ã8~¾E!èy„ €<BÀøYúžmÊËIEND®B`‚glom-1.22.4/docs/libglom_reference/html/ftv2blank.png0000644000175000017500000000012612234777145023735 0ustar00murraycmurrayc00000000000000‰PNG  IHDRɪ|IDATxíݱðøScOx@ –¨y}IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__FieldSummary.html0000644000175000017500000030535512234777147031463 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_FieldSummary Class Reference
        Glom::LayoutItem_FieldSummary Class Reference
        Inheritance diagram for Glom::LayoutItem_FieldSummary:
        Collaboration diagram for Glom::LayoutItem_FieldSummary:

        Public Types

        enum  summaryType {
          TYPE_INVALID,
          TYPE_SUM,
          TYPE_AVERAGE,
          TYPE_COUNT
        }
         

        Public Member Functions

         LayoutItem_FieldSummary ()
         
         LayoutItem_FieldSummary (const LayoutItem_FieldSummary& src)
         
        LayoutItem_FieldSummaryoperator= (const LayoutItem_FieldSummary& src)
         
        virtual ~LayoutItem_FieldSummary ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        bool operator== (const LayoutItem_FieldSummary& src) const
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        summaryType get_summary_type () const
         
        void set_summary_type (summaryType summary_type)
         
        Glib::ustring get_summary_type_sql () const
         Get the SQL command to use for this summary. More...
         
        void set_summary_type_from_sql (const Glib::ustring& summary_type)
         This is used when loading the XML document, because we use get_summary_type_sql() when writing it. More...
         
        void set_field (const sharedptr< LayoutItem_Field >& field)
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the user-visible title for the field, in the user's current locale. More...
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         Get the user-visible title for the field, in the user's current locale. More...
         
        virtual Glib::ustring get_layout_display_name () const
         Get a text representation for the field, such as Relationship::FieldName. More...
         
        Glib::ustring get_layout_display_name_field () const
         
        - Public Member Functions inherited from Glom::LayoutItem_Field
         LayoutItem_Field ()
         
         LayoutItem_Field (const LayoutItem_Field& src)
         
        LayoutItem_Fieldoperator= (const LayoutItem_Field& src)
         
        virtual ~LayoutItem_Field ()
         
        bool operator== (const LayoutItem_Field& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-user-visible name of the field. More...
         
        virtual Glib::ustring get_name () const
         Get the non-user-visible name of the field. More...
         
        Glib::ustring get_title_or_name_no_custom (const Glib::ustring& locale) const
         
        sharedptr< const CustomTitleget_title_custom () const
         
        sharedptr< CustomTitleget_title_custom ()
         
        void set_title_custom (const sharedptr< CustomTitle >& title)
         
        void set_full_field_details (const sharedptr< const Field >& field)
         
        sharedptr< const Fieldget_full_field_details () const
         
        Field::glom_field_type get_glom_type () const
         Convenience function, to avoid use of get_full_field_details(). More...
         
        bool get_editable_and_allowed () const
         
        bool get_hidden () const
         For extra fields, needed for SQL queries. The user should never be able to make an item hidden - he can just remove it. More...
         
        void set_hidden (bool val=true)
         
        bool get_formatting_use_default () const
         Discover whether to use the default formatting for this field, instead of some custom per-layout-item field formatting. More...
         
        void set_formatting_use_default (bool use_default=true)
         Specify whether to use the default formatting for this field, instead of some custom per-layout-item field formatting. More...
         
        virtual const Formattingget_formatting_used () const
         Get the field formatting used by this layout item, which may be either custom field formatting or the default field formatting. More...
         
        virtual
        Formatting::HorizontalAlignment 
        get_formatting_used_horizontal_alignment (bool for_details_view=false) const
         Get the alignment for the formatting used (see get_formatting_used()), choosing an appropriate alignment if it is set to HORIZONTAL_ALIGNMENT_AUTO. More...
         
        bool get_formatting_used_has_translatable_choices () const
         A convenience method to discover whether the formatting that is used has custom choices with the values restricted to those choices, meaning that those choices could be translated. More...
         
        bool is_same_field (const sharedptr< const LayoutItem_Field >& field) const
         Compare the name, relationship, and related_relationship. More...
         
        - Public Member Functions inherited from Glom::LayoutItem_WithFormatting
         LayoutItem_WithFormatting ()
         
         LayoutItem_WithFormatting (const LayoutItem_WithFormatting& src)
         
        LayoutItem_WithFormattingoperator= (const LayoutItem_WithFormatting& src)
         
        virtual ~LayoutItem_WithFormatting ()
         
        bool operator== (const LayoutItem_WithFormatting& src) const
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         
        - Public Member Functions inherited from Glom::UsesRelationship
         UsesRelationship ()
         
         UsesRelationship (const UsesRelationship& src)
         
        UsesRelationshipoperator= (const UsesRelationship& src)
         
        virtual ~UsesRelationship ()
         
        bool operator== (const UsesRelationship& src) const
         
        bool get_has_relationship_name () const
         
        bool get_has_related_relationship_name () const
         
        Glib::ustring get_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        Glib::ustring get_related_relationship_name () const
         Convenience function, equivalent to get_relationship()->get_name(). More...
         
        sharedptr< const Relationshipget_relationship () const
         Return the relationship used by this item, if any, or a null sharedptr. More...
         
        void set_relationship (const sharedptr< const Relationship >& relationship)
         
        sharedptr< const Relationshipget_related_relationship () const
         Return the related relationship used by this item, if any, or a null sharedptr. More...
         
        void set_related_relationship (const sharedptr< const Relationship >& relationship)
         
        Glib::ustring get_table_used (const Glib::ustring& parent_table) const
         Returns either the parent_table, related to table, or doubly-related to-table. More...
         
        Glib::ustring get_title_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the title of the relationship that is actually used, falling back to the relationship's name. More...
         
        Glib::ustring get_title_singular_used (const Glib::ustring& parent_table_title, const Glib::ustring& locale) const
         Get the singular title of the relationship that is actually used, falling back to the regular (plural) title, and then to the relationship's name. More...
         
        Glib::ustring get_to_field_used () const
         
        Glib::ustring get_relationship_name_used () const
         Get the name of the related relationship used, if any, or the relationship if there is no related relationship, or an empty string if neither are used by this item. More...
         
        bool get_relationship_used_allows_edit () const
         Discover whether the relationship used allows the user to edit values in its to table. More...
         
        Glib::ustring get_sql_join_alias_name () const
         Get a name to use as an alias in SQL statements. More...
         
        Glib::ustring get_sql_table_or_join_alias_name (const Glib::ustring& parent_table) const
         Get the item's alias name, if it uses a relationship, or just get its table name. More...
         
        Glib::ustring get_relationship_display_name () const
         Get a human-readable representation of th relationship. More...
         

        Static Public Member Functions

        static Glib::ustring get_summary_type_name (summaryType summary_type)
         

        Additional Inherited Members

        - Public Attributes inherited from Glom::LayoutItem_Field
        bool m_priv_view
         
        bool m_priv_edit
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Member Enumeration Documentation

        Enumerator
        TYPE_INVALID 
        TYPE_SUM 
        TYPE_AVERAGE 
        TYPE_COUNT 

        Constructor & Destructor Documentation

        Glom::LayoutItem_FieldSummary::LayoutItem_FieldSummary ( )
        Glom::LayoutItem_FieldSummary::LayoutItem_FieldSummary ( const LayoutItem_FieldSummary src)
        virtual Glom::LayoutItem_FieldSummary::~LayoutItem_FieldSummary ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_FieldSummary::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Reimplemented from Glom::LayoutItem_Field.

        virtual Glib::ustring Glom::LayoutItem_FieldSummary::get_layout_display_name ( ) const
        virtual

        Get a text representation for the field, such as Relationship::FieldName.

        Reimplemented from Glom::LayoutItem_Field.

        Glib::ustring Glom::LayoutItem_FieldSummary::get_layout_display_name_field ( ) const
        virtual Glib::ustring Glom::LayoutItem_FieldSummary::get_part_type_name ( ) const
        virtual

        Reimplemented from Glom::LayoutItem_Field.

        virtual Glib::ustring Glom::LayoutItem_FieldSummary::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutItem_Field.

        summaryType Glom::LayoutItem_FieldSummary::get_summary_type ( ) const
        static Glib::ustring Glom::LayoutItem_FieldSummary::get_summary_type_name ( summaryType  summary_type)
        static
        Glib::ustring Glom::LayoutItem_FieldSummary::get_summary_type_sql ( ) const

        Get the SQL command to use for this summary.

        virtual Glib::ustring Glom::LayoutItem_FieldSummary::get_title ( const Glib::ustring locale) const
        virtual

        Get the user-visible title for the field, in the user's current locale.

        This returns the name if no title is set.

        Reimplemented from Glom::LayoutItem_Field.

        virtual Glib::ustring Glom::LayoutItem_FieldSummary::get_title_or_name ( const Glib::ustring locale) const
        virtual

        Get the user-visible title for the field, in the user's current locale.

        Reimplemented from Glom::LayoutItem_Field.

        LayoutItem_FieldSummary& Glom::LayoutItem_FieldSummary::operator= ( const LayoutItem_FieldSummary src)
        bool Glom::LayoutItem_FieldSummary::operator== ( const LayoutItem_FieldSummary src) const
        void Glom::LayoutItem_FieldSummary::set_field ( const sharedptr< LayoutItem_Field >&  field)
        void Glom::LayoutItem_FieldSummary::set_summary_type ( summaryType  summary_type)
        void Glom::LayoutItem_FieldSummary::set_summary_type_from_sql ( const Glib::ustring summary_type)

        This is used when loading the XML document, because we use get_summary_type_sql() when writing it.


        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.h
        glom-1.22.4/docs/libglom_reference/html/ftv2ns.png0000644000175000017500000000060412234777145023267 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÚ}\ˆKIDATxíÝ1K1Àñ­ž ØG•â‚n‚Šà ‚âælÁE¿€‹“ (nºêââêäࢋƒÐMAá@°‹ µât¾ÄK¡à%Ü•Û ý]BIïå%áuÍ…a™€,e × v¯ç¥«ˆi‹º¨Õö–î\tòòuénÄ0ã æÜÉoV\Ì$G.&@Y=ÆË%$um·¢ûÛ6–'Úß«9Qó\bÙ)²º0Ðë-Zœ¥TèHÍ`pÀcsm µö5:>Áë‡Þ¦I µØ ‚F‹Çà]» ›jg—ìoÏáõ©[ œõ š­onë €Ô¬¨vqõ„?\Ðç”  6»øüÒTe ÃÉéŸeç ÀÅlQ ¡c”€ª¬ü3*d€ÅWTMÏ\rÿÿh6™ø1±F ‹°fžIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1Document__XML__inherit__graph.png0000644000175000017500000001474612234777146033363 0ustar00murraycmurrayc00000000000000‰PNG  IHDRËãÊr bKGDÿÿÿ ½§“›IDATxœíÝyTSgúð÷†([а; ˆh;:E‹¢¶¸Pä(N±z¬£EDZ\Àu£j­< 3n ¨,¶Î¸ è "èÁeüDPÃZˆ !€åþþx§wbÀ—}>Ç?Þ{óæ¾Ï½ùæ.É5P4M#ˆa™ºðŽƒ„² a€,H £ûF(šz A"‘¨ a÷½ˆ)S¦¬Y³¦ïËo›ððð¾/¤ÆçóÃÂÂú¾ð¶é—„Áy È‚„² a€,H kà¦P(¾ùæ@`ii)¢££kjjðCE•””ôzɔޡC‡NŸ>ýÚµk†û755õz8c*a³Ùžžžiii$F1/”0­V;þü¢¢"±X\]]}þüy+++__ßŽŽŽ~YþÕ«We2™L&+--:ujHHHkkk¿,¹w•TUU­Zµ*:::++Ë$e¼Eúþ™¾P(ì±[jjêðáÕJ¥îL™L¦V«išF÷º½§777#„=zd ccc¯‡3¾’Í›7O˜0Ä@}aüê£þøL€öaiii+W®´µµÕÉår-,,˜IµZ'œœœ"""¤R)žOQÔéÓ§ù|¾Ý† N:Åãñ† ²víZæ¹J¥R.—Ëåòªªª-[¶øøøŒ3¦´´tΜ9ÖÖÖãÆËÈÈЫ*..nâĉr¹œ¦é¤¤¤‘#G:88„††êŸŸ?bÄŠ¢öìÙƒgÞºuËÉÉI¥RQuòäIÜ 7ô„‡‡ß»w¿‘º®šV«MJJrss³µµ2eJAA3(sgÚ†7‚ússsù|¾ƒƒÃþýûñ„³³3¡ó„nô1¡FîÃìíísrr^÷(B¨¸¸xÇŽnnn·nÝ*++›5kVpp0óh```SS“X,FÍ›7i?yò„îr.‹Åºrå MÓË—/¯ªªª¯¯OII±´´ìèè {'&&N˜0A*•Ò4½oß>ww÷ÂÂÂŠŠŠÀÀ@fB¾¾¾7nÜHNNž:u*ž¹zõ꯾úЦé'NTVVê6Ыû0…BzðàA·«¶wï^@ŸŸ_SSçèè¨R©èW÷1LÛðF0P@@@CCÙ3gØlöË—/é߇ PÂØlvAAÁÿFýL&£{aF}ìØ1ÜááÇ¡ææfüèÕ«WišÖh4zmürê¾® …bÅŠ<O­VËår|¦iº¬¬L÷ÕZ·nBèáÇøÑ±cǦ¥¥ávMM……Ekk+î™™™IÓ´\.·²²ª®®Öh4</??¿ÛÕ|]º]5//¯””a6‚úÏ;Çôdõ%y<^yy93)“ɘ I†D"qssÃmܨ®®Æ“!Äb±ôÚ]ÙÙÙmÙ²¥¶¶¶¼¼\.—ÇÅÅùùùñx¼eË–év»qãÆÜ¹s“’’ðdUUÕ’%Kðe «««F£a†1bBhèСsæÌ9sæÌõë×ÙlöÇlÌZK$„««k·«öôéS<“¢(.—‹a¯c`#¨ßÕÕÕÀæ4pPPÐÁƒñ; !Äårïܹ£×‡ÏçWVVâ6nðx¼^Œ¥V«BÇÏϯ²²r×®]OŸ>ý׿þ¥Û'33399ùìÙ³ùùùx ¬¬,ÝÝɘ1cpOæµ ‹Å"‘hÑ¢E†£À‰D}ô‘½½}·«Æãñªªª˜Îr¹œÙ>xÿÁ¤¤Gê7²T‚ú¸4ò(ÙÐÐÀçóçÎ[\\\[[{æÌ™‰'¢W’[¶l=zôíÛ·ñÉJ`` ~.Ò9ôtÛF:ŸVTWWGEE}øá‡Z­ÖÅÅe÷îÝR©´´´ßýQVVFë&¶mÛæííÝÙÙ™˜˜8nܸâââÇùå—~øa×áš››­­­¹\nii)žÓíy®äùóç´´´ÄgŸÝ®ÚÖ­[GuãÆººº]»vÙÚÚ¶´´Ð4Íår9ÒÜܼ|ùr¤sh3°Œ©_wQåå导¸ÈŒÎÃhš~þüyDD„½½½M`` ~+ë&¬³³366ÖÕÕÕÁÁaÑ¢Eºç"=&Œamm={öìÇÓ4““óûßÿÞÒÒÒ××÷çŸðôô¤u¶uGG‡§§çwß}×ÙÙ¹~ýz>ŸÏápðÝå¼*((ÈÛÛ›™D8qB¯±X,ôôtܳÛUëììŒ1b„ÍäÉ“ñ©MÓÇ6l˜££#¾>5&aÆÔÏ,ÊÏÏÏÊÊ _âÖ/ £èW_¡7ŠÊÌÌìËBÌEppðäÉ“7nÜhêBEQ"‘¨7ÿÁ÷’Fikk+**ºxñâ’%KL]‹™„åÂ… sæÌÙ¼yó|`êZÌL?ÜEý> 1uf öa€,H È‚„½™º:¹©K03ýp¦_]]ÝõƘwRk«êÔ©Ê/¿ô0u!f¥ŸØ¾W¿*`c3nøðËÊÔ… Ó¦ÿ^ þÛíÛU;v—.fêZÌœ‡«¡AQRò”¢Ð¹súw… aÆÊʺKQM£ââ§É S—c6 aÆ‹‹µZ!daÁÊÍ-5u9ff”ÊÊÆÿü§Ÿ³j4ÚÌÌbSWd6 aFÉʺ;hзMÓeeõååõ¦-É\@ÂŒ’™Y¬Ri™ÉAƒ,rrà@iHXÏ>¬yöLª;G¥ÒˆD·MUy„õ,+ëî Az3kjd÷îILRy„õ@«¥33‹U*ÞüAƒ,²²îš¤$ó ëAIIUccK×ù*•F,.Ñh´]º a=ÈʺËfë"1©TYTT9Àõ˜H˜!6'§T«¥fãƒY0m„¨óçኲpŸ¾!ryÛŸÿìÏL>zT{îÜÝM›™9öö¶Ý=üÜ[ñrrJ—/?V[ûƒ© 1'p”dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY¯üÊfaaáž={LXÍ[®½}ЋV®®Ýüø9`dffêN¾òKÁ‰D,Ϙ1c`K2'ƒ£ÆFSñ¶jll|ôè‘ÞÌn~‹:!!a Êïœk×®%&&êÍ„ó0@$  dAÂY0@V/ÖÖÖ–œœöÉ'Ÿ„……íܹ³©© ?äïï_VVÖë‚üu,X° &&¦´ÔÐ_§ò÷÷onnîõpÆT2{öìÈÈÈË—/“…¨’’’Ù³g?~ü˜™³ÿþ¨¨(µZò÷÷ Ñû³Cëׯg^Á>¾”XoþrMÓ±±±E%&&º¸¸H¥ÒÜÜÜ•+Wž}àËèµI“&Í™3gÏž=¤(ª¼¼<;;{ß¾}lö_w…BñàÁƒñãÇãÉÖÖÖû÷ï÷o ½Ù‡ýóŸÿ¬­­Ý¹s§———ËussûË_þ’ššjaÑýßa|SÖÖÖ‡ÃḸ¸DFF¶´´444ôË’{WÉï~÷»… .^¼øèÑ£&)Àwá_ýu}}}vv¶V«Ý½{wHHˆ§§'óèĉ¯]»ÆLÞ¼y“I[éMÂ.]º¬·Sáp8,Öÿ–¦ÑhRSSÃÂÂ.\¸uëV…Bçûûûçåå…††ÎŸ?ÿÈ‘#W®\ … ,8xð óÜööv¥R©T*ëêêŽ?>jÔ(@PQQ±víÚ   €€€¨¨(Ýí‚¥¦¦.[¶L©TÒ4žž¾xñâ   „„Ý¡ïÝ»îïïÏ|³ñèÑ£… ªÕjÿK—.án¸¡gÖ¬YOž:cÆŒëׯ3Êëׯûùù½nQ½Ó›„UTT¸¹¹î#‰òòò8ðâÅ‹]»v1]¾|955uýúõééé—.]úûßÿ›™™YWW‡;¬Y³æ³Ï>ûì³Ï"""222¾þúk‹õí·ßòùüÇŸ>}:44tûöíød;~üxaaá÷ßÏáp²²²~þùçøøøC‡uvvê~ÓzäÈ‘¸¸¸5kÖäççã9yyy3fÌ`³Ù7n7nBˆièqvvF555u»jgÏžÍÎÎ^¿~}ZZÚ¤I“6mÚ¤Ñèÿip]6‚ú³²²Ž9²nݺ¨Tª«W¯â™C‡50–¿¿¿Ï©S§Ö­[gii©ûШQ£¬­­ñûáåË—wïÞí÷Ó€Þœ‡µµµé®~'!„rss9n_¸paéÒ¥^^^¡U«VEEEµµµÙØØ „† òñÇ#„-ZÄ´ …‹‹ BèСCx Ã‡oÛ¶-###99ÙÚÚï&ǯR©Z[[q§OŸ>}úô?þñ;;;„PvvvTTÔØ±cBk×® ëèèÀ[644ÔÇÇgÔ¨Qhjjrtt¼víÚæÍ›BŸ|ò ®œi¼N·«–››»téR|ˆ‰ŠŠ ÓÝ£we`#¨?((ˆËåNŸ>]£Ñè½ ¨Tªºº: ‰DÒõ 8cÆŒüü|Ÿ[·nyyy 2Ęe¯7û0GGG‰DÂLæææŠÅb½>¿þú+ÇÃmÜhüíckkk„EQzí®lll¢££¥R©D"Q*•©©©«W¯ …»wïÖívÿþýÉ“'§§§ãÉúúú­[·âË@¡P¨Õj™¡‡ †²µµ8qâõë×ïÝ»gaaáããcÌZã…899u»jõõõϤ(ŠÃá¼n¥zÜêwrr2°¹^çØ±c,kÓ¦MÉÉÉÌ%?cæÌ™ø@™ŸŸßï‡HÔ»}Ø´iÓ²³³?ýôSü6åp8]/@œkkkñáþ{1>ÖX[[ÇÄÄŒ;vùòå£G¦iúÓO?eú$$$h4š/¾øbÁ‚&Lptt\±bÅ´iÓB4M·¶¶2{Væµ™9sæO?ýôìÙ³Y³fù‚ååå=ÚÎήÛUstt¬««cªT*mllðöÁg9Fß’aLýÆ{üø±H$Ú»w¯··÷Å‹÷ìÙ³}ûvÝîîîƒ.--½}ûöªU«Þtù=êÍ>,22R*•nذ¡¬¬L*•Þ¸qãØ±cz}Nœ8ñË/¿TWWÿøãS§Ne6S˜3ý¦¦¦Ã‡»»»;;;k4///>ŸÿìÙ3¼ZZþ{ŸÖàÁƒ‡þùçŸïÝ»W­V¤¦¦–••ÕÔÔ|ÿý÷kÖ¬é:ÄôéÓËÊÊòòòæÌ™ƒç\ºt Ç…i0•üúë¯ÙÙÙ§Núâ‹/^·jóæÍ;zôèƒ^¼x!‰BCC;::B§   ­­íäÉ“F®¾1õëb¶CWfçÎóæÍóööF­^½úîÝ»]¯cf̘ñã?º»»ÛÛÛë=ļJ¥R«Õ¹ ºz³ãr¹û÷ï?|øðºuë:;;ÿð‡?$$$DDDèöY¼xq{{{|||GGÇÿøÇ7zs0ÛÔÒÒÒÛÛ;!!¢¨¿þõ¯ûöíKII3fÌçŸÞÚÚºiÓ&Ýd‡‡‡_¼xQ,GDDtttÄÇÇ+•ÊqãÆ}ûí·]‡°±±™8qbmm-sɲ}ûö7º¸¸0 ¦Š¢ø|~ll¬¯¯ïëVmÑ¢E*•jëÖ­ÍÍÍ#GŽÜ±c>öÅÄÄ:tèðáÃ111999Ƭ¾1õ3Æ-‹ñ9¨žôôô/^,[¶ O>|éÒ¥û÷ïŸ4i’n˜fΜ™žžÓu ºùfÎßÈ+÷¸fdd„‡‡ã+”w^\\œ——×’%KL]Ȼߦ÷%Aoöa殣££²²²¤¤¤Ûw­9º}ûvlll×ùúÓŸ¢££¾]ïcÂŠŠŠ’’’"##ñ¥å;`òäÉoí‘ç}L˜ŸŸ‰ËrÐ-¸{ dAÂY°7£V÷æSÇ÷$ì ¨ÕÚ³gûzÏç{‡Ö!‰L]Î[ÍÒòƒaþ‚·¥aô«^ùL¿ººúæÍ›&,î-—ž^qûvãW_yyyqM]ËÛ+,,Lw’ÒûŒ¼NG‡ÚÛ{S{{gHȤ¿ý ¾k2ìðuñâÃövM£ÜÜÒ¶¶NS—c6 aÆ:{ö‹E!„T*ÍåËÿ1u9ff…¢ýÊ•ÿÓh´!‹:s¦ÄÔ™ H˜Q.\xÀܧVkóò~‘ËÛL[’¹€„E,Ößi]¸ÐÏÿsõ] ëYccKaa…V«{ÑMgfÞ1YAfÖ³óçKñ9>C£¡‹ŠžÔ×ù½Œw $¬g%¯îÀBÈ‚:þžIê1/°<.½_Ò5aZ-™Yl’’Ì $¬99¥lv7[I«¥<¨®ª‚¦î$¬bq‰Jõº_  ~ú ®({ð>Þ§o¼†ÅàÁlOO<©Tv44(ÜÜœ™¦ùÙ)3ß|¿œœÒåËÕÖþ`êBÌ %Y0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@$  dAÂY0@–)ǵ°°P"‘˜°€7UV&8¦.äÍøúúòù|“ O›ŽP(4Ùj¿OD"‘ _eÿµP(ÌÌÌ4m ï6Š¢zîDœ‡² a€,H È‚„² a€,óH˜B¡øæ›o¥¥¥@ ˆŽŽ®©©ÁQUR¢ÿG¸û‚ú ›ÍöôôLKKëÇ…¿‡Ì aZ­vþüùEEEb±¸ººúüùóVVV¾¾¾„F¼zõªL&«ªªZµjUtttVV¡Þfð×ÿŽ=úäÉ“ŠŠ [[[„³³ó¶mÛÆf“*žÃáp¹\.—»bÅŠ†††„„„àà`BcõEQNNN¦.¤gf°KKK[¹r%ŽƒËåZXX0“jµ:..N 899EDDH¥R<Ÿ¢¨Ó§Oóù|;;» 6œ:uŠÇã 2díÚµL‡“'Oê6ô„‡‡ß»wO&“u;„V«MJJrss³µµ2eJAA³Ø¦¦&½¶ábhšNJJ9r¤ƒƒChh¨î*äææòù|‡ýû÷£ß>¦wvvf†x«™ð+¡P( {ìfooŸ““óºGBÅÅÅ;vìpss»uëVYYÙ¬Y³‚ƒƒ™G›ššÄb1BhÞ¼yLûÉ“'4MŸ8q¢²²R·È,_¡P „ww÷ÂÂÂŠŠŠÀÀ@fË „Μ9Ãf³_¾|©·|é¿—4ƒ„±Ùì‚‚f’yoÈd2ú·@Œ=úرc¸ÃÇBÍÍÍøÑ«W¯Ò4­ÑhôÚº1Òõº„u;„——WJJ ž©Õje2™V«¥_Ÿ0ÅŒ;6-- ?¥¦¦ÆÂ¢µµ?ëܹsLOfQæ’038Jòx¼òòrfR&“1’ ‰Dâææ†Û¸Q]]'9BˆÅb鵄ï/ruuívˆ§OŸzxxà™Eq¹\Ãß4(¦ªªjÉ’%ø2ÖÕÕU£Ñ0«àêêú¦e¿=Ì è   ƒâw0BˆËåÞ¹sG¯ŸÏ¯¬¬ÄmÜàñxý2ºH$úè£ìíí»‚ÇãUUU1år9S'Þ0)éÇËÊÊÂï{¼;3f ~Èä÷Gô…$,>>¾®®.00°¤¤¤®®îìÙ³‰‰‰z}–.]ºeË–âââòòò˜˜˜ÀÀ@.—kÌÂOž<‰#Â4BJ¥R.—K$’äääï¾û×íQQQ ÿþ÷¿ëëëwïÞÍçóÛÛÛB\.7;;[¡PlÛ¶ÍÈÕŒŒŒŒ‹‹+))©¨¨X¶l™¿¿¿áþ2™ÌÈ%›˜ ÐFž‡Ñ4ýüùóˆˆ{{{›ÀÀ@¼ Ñ=ëììŒuuuuppX´h‘î9sRÕm!tâÄ ½Æb±<<<ÒÓÓñSº¢³³3>>~Ĉ666“'OƧV4M?~|ذaŽŽŽøú”9y2PLggçúõëù|>‡Ã À"]{âEùùùYYYI¥Ò72õyEëlÓŠ‚;‰¢(J$………™ª38J³ dAÂY0@$  dAÂY&¾?ìÖ­[øS1ð®2e¦NjÂÑßB¡P ˜°S~¦ÞpÈ‚„² a€,H Èú3¦ÂW„n^IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Report-members.html0000644000175000017500000003753012234777147027447 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::Report Member List

        This is the complete list of members for Glom::Report, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_has_translations() const Glom::TranslatableItem
        get_layout_group()Glom::Report
        get_layout_group() const Glom::Report
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_show_table_title() const Glom::Report
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const Report& src)Glom::Report
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const TranslatableItem& src) const Glom::TranslatableItem
        Report()Glom::Report
        Report(const Report& src)Glom::Report
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_show_table_title(bool show_table_title=true)Glom::Report
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/inherit_graph_0.png0000644000175000017500000000306312234777146025112 0ustar00murraycmurrayc00000000000000‰PNG  IHDR}%à?qèbKGDÿÿÿ ½§“èIDAThíšML[Ç聾VÁÒN0Ê0– $FÆ.ˆ!ƒ,„\aŒÆ„„`âã¢&7&®À•h 4Z´7*Õ¤1„¤ E–Bƒ©LZ®‹›7oœž†ñáüVgΜ¹çÌ¿wÎÜé D‘m'AèþRDÝ…AÔ]¤¼í‘‘‘ÙÙYAJÙÙÔÕÕý°~D¯× T؇§s”>£×ë‘Hü0›Í‘"‹ý]DÝ…AÔ]DÝ…AÔ]DÝ…!vÝÀåË—ÕjµL&S«ÕMMM{÷.NþËÅ‹!„‹%¶ÃƒÁà74\.ß·oMÓv»=¾nußØØ¨¨¨xûöm__ßÜÜÜóçÏåryIIÉúúz|ëc ‡Ãýýýxúôil#477>xð`ffæÍ›7ÅÅÅ¥¥¥@ ¾unÞ"_¯×o幩³³sÿþýkkk\§ßï…B!€Ãáˆã£BÈf³¥¦¦šÍf…BñíÛ·FP©TCCC\·à¥¥¥ŸûË€Ÿ€Ÿ›xÎç{ooï¥K—’““¹N¥R)‘HØÍP(ÔÖÖ¦V«ÓÒÒ ƒÏçÃ~áãÇ)ŠÚ³gϵk×=zD’¤B¡hmme>|È5f³¹ººº²²2 Ùl66 „ðÙ³gYYYJ¥²®®g‰êLJJúüùsdÁBÀÞ½{½^¯Óé@yy9kOMM!„L&“Ûíæ ÃaµZB555Ü\yyyv»}||üرcUUU›9ÛÛÛ%‰^¯ïîîöx<¼‚ñtÎÍͽpáÂôôô—/_:::d2Ùúú:7àÞ½{Z­vddäãÇ4MoE«¨ó=FÝ¥Réðð0·nŒßïguÏÎÎîîîÆccc€ÕÕU¼÷õëסp8̳7ëNV«• †aB&“‰Ûj]]]Øv:8KT'Bhxx¸¥¥¥°°Bxøða›ÍÆ‚e]YYÁ!är¹X?käçç÷ööâÇ#‘H¾~ýús­âÙgH’œ˜˜àÊÍ.fXfgg5 ¶±177‡7SRR <{3ÌfóòòrRR„ðìÙ³@€ÛjØ,¹¹¹l–HçêêjQQÑÝ»w?|øàñxŽ=ZUUÅk+++mmm:Ž$ÉóçÏGV2==ÝÐÐ!„fdd„Ãaö¤~‹u?}úôýû÷ñ$(•Ê÷ïßób(Šr»ÝØÆI’1äbf`` §§Çÿ'Ožä®j¦¦¦°199Éf‰t}zõêUd1$I à9»±±á÷ûsrrb8©ûÌÂÂEQ§Nr8óóóýýýGŽ?ö™[·neggŽŽâþNÓ4{Q³ý$ªÍëƒÉÉÉÜ˹££#55•í¼Z­vttt||üøñã8KTgss³V«}ùòåüüüØØXSSSQQ›zbb!”žž~çΟÏçt:ñ› —ËÅ ¸yófAAÃᘜœŸÏb±dffÊd²’’«ÕZVV–——Ç `æêÕ«E¥¤¤”••á…À¶êþ‡¢Ý£:…"ž÷U‘ÿÿ½öÿí»«¨Î? q¾ ƒ¨»0ˆº ƒ¨»0ˆº C”õŒÝn¯­­ÝþRv*QÿÀáë^\\¼-ÅüEPùõ#üó—º;±¿ ƒ¨»0ˆº ÃwA”k_âQÜIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1FieldTypes.html0000644000175000017500000002044612234777147026612 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::FieldTypes Class Reference
        Glom::FieldTypes Class Reference

        Public Member Functions

         FieldTypes (const Glib::RefPtr< Gnome::Gda::Connection >& gda_connection)
         
        virtual ~FieldTypes ()
         
        Glib::ustring get_string_name_for_gdavaluetype (GType field_type) const
         
        GType get_fallback_type_for_gdavaluetype (GType field_type) const
         
        guint get_types_count () const
         

        Constructor & Destructor Documentation

        Glom::FieldTypes::FieldTypes ( const Glib::RefPtr< Gnome::Gda::Connection > &  gda_connection)
        virtual Glom::FieldTypes::~FieldTypes ( )
        virtual

        Member Function Documentation

        GType Glom::FieldTypes::get_fallback_type_for_gdavaluetype ( GType  field_type) const
        Glib::ustring Glom::FieldTypes::get_string_name_for_gdavaluetype ( GType  field_type) const
        guint Glom::FieldTypes::get_types_count ( ) const

        The documentation for this class was generated from the following file:
        • libglom/data_structure/fieldtypes.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Summary.html0000644000175000017500000020023512234777147030506 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Summary Class Reference
        Glom::LayoutItem_Summary Class Reference
        Inheritance diagram for Glom::LayoutItem_Summary:
        Collaboration diagram for Glom::LayoutItem_Summary:

        Public Member Functions

         LayoutItem_Summary ()
         
         LayoutItem_Summary (const LayoutItem_Summary& src)
         
        LayoutItem_Summaryoperator= (const LayoutItem_Summary& src)
         
        virtual ~LayoutItem_Summary ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        - Public Member Functions inherited from Glom::LayoutGroup
         LayoutGroup ()
         
         LayoutGroup (const LayoutGroup& src)
         
        LayoutGroupoperator= (const LayoutGroup& src)
         
        virtual ~LayoutGroup ()
         
        bool has_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Discover whether the layout group contains the specified field (from the current table). More...
         
        bool has_any_fields () const
         Discover whether the layout group contains any fields. More...
         
        void add_item (const sharedptr< LayoutItem >& item)
         Add the item to the end of the list. More...
         
        void add_item (const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)
         Add the item after the specified existing item. More...
         
        void remove_item (const sharedptr< LayoutItem >& item)
         Remove a layout item from the group. More...
         
        void remove_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Remove any instance of the field from the layout. More...
         
        virtual void change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void change_related_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void remove_relationship (const sharedptr< const Relationship >& relationship)
         Remove any use of the relationship from the layout. More...
         
        void remove_all_items ()
         
        double get_border_width () const
         
        void set_border_width (double border_width)
         
        guint get_items_count () const
         
        guint get_columns_count () const
         
        void set_columns_count (guint columns_count)
         
        type_list_items get_items ()
         
        type_list_const_items get_items () const
         
        type_list_const_items get_items_recursive () const
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_items get_items_recursive ()
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_const_items get_items_recursive_with_groups () const
         Get the items recursively, depth-first, also returning the groups. More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::LayoutGroup
        typedef std::vector< sharedptr
        < LayoutItem > > 
        type_list_items
         
        typedef std::vector< sharedptr
        < const LayoutItem > > 
        type_list_const_items
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::LayoutGroup
        type_list_items m_list_items
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::LayoutItem_Summary::LayoutItem_Summary ( )
        Glom::LayoutItem_Summary::LayoutItem_Summary ( const LayoutItem_Summary src)
        virtual Glom::LayoutItem_Summary::~LayoutItem_Summary ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Summary::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_Summary::get_part_type_name ( ) const
        virtual

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_Summary::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutGroup.

        LayoutItem_Summary& Glom::LayoutItem_Summary::operator= ( const LayoutItem_Summary src)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/report_parts/layoutitem_summary.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1PrintLayout-members.html0000644000175000017500000005014412234777147030462 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::PrintLayout Member List

        This is the complete list of members for Glom::PrintLayout, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_has_translations() const Glom::TranslatableItem
        get_horizontal_rules() const Glom::PrintLayout
        get_layout_group()Glom::PrintLayout
        get_layout_group() const Glom::PrintLayout
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_page_count() const Glom::PrintLayout
        get_page_setup() const Glom::PrintLayout
        get_show_grid() const Glom::PrintLayout
        get_show_outlines() const Glom::PrintLayout
        get_show_rules() const Glom::PrintLayout
        get_show_table_title() const Glom::PrintLayout
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_vertical_rules() const Glom::PrintLayout
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const PrintLayout& src)Glom::PrintLayout
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const TranslatableItem& src) const Glom::TranslatableItem
        PrintLayout()Glom::PrintLayout
        PrintLayout(const PrintLayout& src)Glom::PrintLayout
        set_horizontal_rules(const type_vec_doubles& rules)Glom::PrintLayout
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_page_count(guint count)Glom::PrintLayout
        set_page_setup(const std::string& page_setup)Glom::PrintLayout
        set_show_grid(bool show_grid=true)Glom::PrintLayout
        set_show_outlines(bool show_outlines=true)Glom::PrintLayout
        set_show_rules(bool show_rules=true)Glom::PrintLayout
        set_show_table_title(bool show_table_title=true)Glom::PrintLayout
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        set_vertical_rules(const type_vec_doubles& rules)Glom::PrintLayout
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        type_vec_doubles typedefGlom::PrintLayout
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/graph_legend.html0000644000175000017500000001374512234777147024660 0ustar00murraycmurrayc00000000000000 libglom-1.22: Graph Legend
        Graph Legend

        This page explains how to interpret the graphs that are generated by doxygen.

        Consider the following example:

        /*! Invisible class because of truncation */
        class Invisible { };
        /*! Truncated class, inheritance relation is hidden */
        class Truncated : public Invisible { };
        /* Class not documented with doxygen comments */
        class Undocumented { };
        /*! Class that is inherited using public inheritance */
        class PublicBase : public Truncated { };
        /*! A template class */
        template<class T> class Templ { };
        /*! Class that is inherited using protected inheritance */
        class ProtectedBase { };
        /*! Class that is inherited using private inheritance */
        class PrivateBase { };
        /*! Class that is used by the Inherited class */
        class Used { };
        /*! Super class that inherits a number of other classes */
        class Inherited : public PublicBase,
        protected ProtectedBase,
        private PrivateBase,
        public Undocumented,
        public Templ<int>
        {
        private:
        Used *m_usedClass;
        };

        This will result in the following graph:

        The boxes in the above graph have the following meaning:

        • A filled gray box represents the struct or class for which the graph is generated.
        • A box with a black border denotes a documented struct or class.
        • A box with a grey border denotes an undocumented struct or class.
        • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.

        The arrows have the following meaning:

        • A dark blue arrow is used to visualize a public inheritance relation between two classes.
        • A dark green arrow is used for protected inheritance.
        • A dark red arrow is used for private inheritance.
        • A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__WithFormatting__coll__graph.png0000644000175000017500000004221512234777146034330 0ustar00murraycmurrayc00000000000000‰PNG  IHDR1@›ºZbKGDÿÿÿ ½§“ IDATxœíÝy@åÿðgv¹q]uwAðÔ4#Ñ$åg¢FxZâùí›i~µŒò KKÒ²´ò¨ Mà ¬Ô¬ŒÔÀ@ó@äP99÷˜ßSëºì. ÂÎ,û~ýõìì3Ï|fæÙùìÜMÓ€xlðä$à ä$à ä$à ä$à ÛhÏvb&×H#'G >|éÒ¥lGÁ¾¤¤¤O?ý”í(Œ9 8J*•N›6í(8Á|rÎ'W 'W 'W 'W 'W '€i«®®~óÍ7]]]---]]]_zé¥ÂÂBæ+Š¢RSSår9EQeee̦ÐqÔ'­…œ&L©TNœ8ñÂ… ñññßÿ½••Õˆ#Uuø|~LLŒ½½½qB2òä:ÜŸ&l÷îÝ999ÙÙÙ¶¶¶„ggçmÛ¶EEE 6nEÍœ9³#¦NQTii©“““ÆÀšœ9À~˜°}ûö-Z´ˆIH*B¡Ïç«Q?˜vøðáÞ½{ …ÂÐÐлwï2ßîÝ»W£ ª¯*§¤¤øûûÛØØôîÝ;::š¢(Bˆ³³³ê¨`bb¢››Û®]»Ô?~\*•ŠD¢­[·Bd2YDD„‹‹‹D"‰ŽŽ¶²²JMMíØedR“À„ýõ×_ƒnÕ(;vìøî»ïÎ;WXX8wî\BHLLÌÈ‘#Õ Z½ð O?ýtnnî¦M›^yå•ââbBˆú~ÒªU«öïßÿâ‹/ªµmÛ¶K—.EGG/]º´±±qãÆÇ?yòäéÓ§cbbäry+縓ñ;0a555ŽŽŽªÌ¾ !¤²²R(jåã?4h!dûöíC‡­¬¬TjÓÌ­ªªªG=zô˜:ujyyyó3FK—.}ê©§4.X°ÀÅÅeòäÉr¹¼¦¦f÷îÝ«W¯:t(!dëÖ­L$ ‚ý$0ab±8++Kõ±²²RuÑ.žžžL¡ÿþ„¢¢"§µ}ûö 6ôêÕkîܹééé‡ !nnnÍÇ’H$„ïŸm~~~Ÿ>}˜²———“6ÈI`ÂBBB¶oß®P(˜B¡ðâÅ‹úGÉÎÎf ™™™E¹ººj­Æ¼¢  @5düøñ·nÝŠ‹‹ëÙ³çèÑ£›'?UâQ§ÚucôìÙ3//)çääèÕ !'€ [½zuQQQpppjjjQQÑáÇ׮]«”+V\»v---máÂ…aaaööö{÷îeò„ª  ;V]]¥ñ±Ç[±b…››Û°aÃhš¶²²"„TVV¶*àðððuëÖ]ºt)###""‚4KZf9 L˜‹‹Ëü!‰ÆçééùÍ7ßÄÅÅéeÉ’%&Lðððøê«¯!³fÍ:þ¼záóÏ?ŒŒìÓ§úù¡èèèŸþÙÝÝ}ùòå111ŽŽŽƒ ª¨¨0<àÈÈÈÀÀÀ±cÇ>ûì³/¿ü2!Ä¢ 3ÞYQfòîB0-aaa„ŒI»~ýúÀKKKÕ/ÓhîСCÓ§O7“m5ö“ŒÇÇÇgÙ²e555ÅÅÅ«W¯ ÔŸÌ r€ñÄÆÆ^¼xQ,{zzÖÖÖîØ±ƒíˆ¸÷'¯¯ï/¿üÂvÜ…ý$à ä$à ä$à ä$ª [®í×8G:tˆÝjc%6ÏS6 cHJJbqêF†œ•œœ<}útp°püÈ÷ä·Ëb+íÌ·îr žã Ýµ}w“78{ÛLŽéÏv,æç“´Ëþ±‚RšQw¿¸‰íXÌr€÷n5–ý]Gáñ©ì­xÊ*< ä$-r~ªà[P„¥‚¾q9ÉH“´¸q¼B!£ !„&U·*²ëÙŽÈ, 'h*û»®ºðÁI< *çdëÞÝmƒœ )çd%ÏâÁë_•2:ëûr‚‹”;rÀCh%¹ñc…RöP ª+••\­e+$óœðâ¿î×—Ë4òTÎ)\éÐá“’s²‚' 4*åô+” ¿ëXÈI(etö© ¥\Kîiº¯¸“RcüÌ rÀÉÕò:¥Ö¯x|*û®¾ëXÈIäž®ÔõP¥œ¾y¦JÑ„ÃwÏ`x ÿü=Yýƒý¤óæ÷ŸìèØÏF5Dâç`éÀg#4³€wU<à:²«úÇ_–ç9öµé3¶[ñ˜»®@N®@N®@N®@N®@N®ÀýI:Õ6Z‹,Öøûn$ÈIÀHþÀÈIÀÈIÀÈIÀÈIÐn(Š*++3°fjjªÆ@ä$à ä$†\Ï?í(Ìr€N5…2µW¡SuðàA©Tjoo¿råʈÅb‡ˆˆ]-(•Ê 6xxxØÚÚ>üüùóª¦TǸTeŠ¢ÝÜÜvíÚ¥*ïܹsÆ îîî"‘(,,¬¼¼\5ÖñãÇ¥R©H$Úºu«®i=ûì³›6mbFINNvrr’ÉdZCMIIñ÷÷·±±éÝ»wtt´Ö Y‡îÝ»·P( ½{÷®\.ŒŒtuuurrš1c†*~íhÐaÇЋ9?U¨>B‚ƒƒËÊÊâãã !&LP•srr´¶ðé§Ÿººº&&&FFF:::Êd2¦©ÒÒRU³L™2bĈ³gÏÖÕÕ©Ê}ô‘§§gRRRvvvppphh¨j¬   ’’’„„@ÐÐРuZ»wïö÷÷gFyíµ×^yå]3Û§OŸåË—%$$ðx¼?ü°ùˆ-.BÈã?~åÊ•k×® >|„ ëׯ÷ððHNNÎÌÌ œf`aa!ŸÏ¯­­e*9rD@ii©ÖiUUUYYY( ±Xœ˜˜¨kfE"ÑæÍ›™reeeyyyó[\ª4M_ºt‰âää´gÏfHZZ!äÞ½{´Žœ„cw­`ggGáñxe]nÞ¼Ù¯_?¦LQ”P(¤(JO}777r^^^xx8EQEI$…BQPPÀTH$êhV×®]ÇŽ›ðûï¿ ‚Q£FéšôöíÛ7lØÐ«W¯¹s禧§‹D"­#¶¸<==™Bÿþý !eee̦ Š¿9ä$€$‹óòòT«ªª˜½ B³¯ ±Vß¾3e±X|ôèQõ½Ÿ¾}û24Ò›®iM›6->>>66ö…^ГÇëÖ­¸¸¸ž={Ž=º°°ÐÀ5dgg3…ÌÌLŠ¢ºwïž››Ë a b±X׸ÈIhÞ¼ykÖ¬9wî\qqñÇ,•Jëëë !B¡ðرcÕÕÕQQQú[˜={vdddjjjvvöüùóÇŒÓÚiMš4)55õàÁƒ3fÌÐ3¡Ç{lÅŠnnnÆ £iÚÊÊÊÀ5¬X±âÚµkiii . ûßÿþ÷þû理¤dee-^¼888X(êW`ød µ–-[ÖØØ^VVæëëûý÷ß3Ç»>ÿüó·ÞzkÅŠŸ}öÙ—_~©§…•+WÖ××O™2¥ªªjäÈ‘ ­–ƒƒÃ3Ï<“““3xð`=ŠŽŽ~ýõ׿üòK‰DãèèH1dD K–,™0aB]]Ýĉ·nÝjkk{ÿþý)S¦Ô××7nË–-zÆÅ»*tê4ïOš£“9tèÐôéÓÛ¥©¥K—N›6­]šc¢(Ší4á|prprprprpEsRuuõ›o¾éêêjiiéêêúÒK/2_Q•ššÚ~J›vœÄ#¶FQTYYY«Úl÷EÄFî >ú$Ôû˜µµµ¿¿¿þ œ¢\.×ÚOÚžF#íÕ²¹oÌœ9ScHÇýèZ\ ºëdÚ’“”Jåĉ/\¸ÀÜ—ðý÷ß[YY1¢±±±Ýã#„Tþ‹ræÌ¦|ØÝÝ](N›6­yc‘ñûÆ’%KîÞ½{ðàAHÔ²©/:=“ÐóÛd6A»víbšR*•6lððð°µµ>|øùóçUÓ½ÿ~Õ¿ …þùUoVO`†t<ÓC«‰Õ¢U·nݾûî;]ßBRRRÖ¯_ïáᑜœœ™™8yòdÕ·ÁÁÁeeeÌCM&L˜ *çääÐ4“››«^ÐhYýãˆ#Ξ=ëææ¶`Á‚¼¼¼âââèèhKKËÆÆF¦BPPPIIIBB‚@ hhh iºOŸ>Ë—//**JHHàñxÅÅÅL³ýúõÓÕHii)MÓz*<þøãW®\¹víÚðáÃ'L˜  uË–-žžžIIIÙÙÙÁÁÁ¡¡¡ÍgDÕ¾žÊú—˜¡¡¡ªv…í¹chôõ!k922Rë²ÕÕ˜o«««—-[öä“OÒz׎!GUÖ3ûöÕ)S¦TTTÄÆÆªª©¦Béß¿rrrzzúÈ‘#'Mš¤}ø{o!$66VVúFBBB¯^½êëëiµ¾Ñ|¥´8 =kŸÙÕÕÕ1M}úé§®®®‰‰‰………‘‘‘ŽŽŽ2™ŒV{¦(ƒ‰DÏüª7«'0C:Þ£¯;#kKNçÏŸÐÄ¿*++é×½——מ={˜ iii„{÷î1ßž9s†¦i柂zYcû¢%Öf9)..Ž¦éªª*¹\Î ÌÌÌTïgGŽQµÏ ‰D›7of*WVV2§ RRRô4ÂôT`悦éK—.B***˜6½½½÷íÛÇ|UXXÈçókkk5fDÕŽžÊm^bFÎIFîzr’ÆZîׯŸÖe«µ3¨ãóù‰‰‰´ÞµcHçQ•õ̾}õÒ¥KÕÔ »wïfê_¾|YÕ¸.ÆÌIlõ€€€uëÖ©Ñ•“ôLBÏÚg6Aª¦ Àì—Ó4­T*+++•J%­­¯Ò4­g~Õ›Õ˜!O?椶»‹ÅYYJXYY©º~F%??ßÃÃ)3ÕSíìì!<O£Ünnn„ªªªÈÈÈ€€±X<þ|õ ‰D£ýíÛ·oذ¡W¯^sçÎMOOW:ÐÓH‹<==™Bÿþý !EEEÌǼ¼¼ððpæ2‰D¢P(ô<ªROåv\bŠ ƒ9p¡±–oß¾­uÙjí ªsÑ%%%k×®:uêýû÷õ¯Ê;!³o`_•J¥z–Œªñ~ýú©7Î:¶úÆæÍ›?úè#fS?=“гö™MÊÍ›7™%O¡(J(êy œžùUoVO`†w<Ò–M[HHÈöíÛ™\M …/^Ô¨#•Jsss™2S‹Å§v̺ ÈÍÍݸqãÍ›7O:¥^¡y‡?~ü­[·âââzöì9zôhÕCO#-VÈÎÎf ™™™E¹ºº2ÅbñÑ£G™äÏüiêÛ·¯®yiUen2rÇèÕ«W^^žêã7!îîî¤ÙZ¦iZë²ÕÚ˜sÑB¡ÐÅÅ%""¢¼¼üÆú×N‹ÇÙ7°¯êhfNNŽúÒèˆ]Û°µÑ:tèÔ©SW­Z¥>¦iÒš„­gík¤F±X¬Þ'U§Ž´Ò3¿f\Ã;ž iKNZ½zuQQQpppjjjQQÑáÇ׮]«QgΜ9ï¿ÿ~JJJVVÖâÅ‹ƒƒƒ ¼ædïÞ½ÌJUZ$“Éüüü¼¼¼222fÏžMþ=z¦Õc=¶bÅ 77·aÆÑ4meeÕb#Ìeèz*¬X±âÚµkiii . S]:{öìÈÈÈÔÔÔìììùóç3FkHLûVæ2#wŒyóæ­\¹ò§Ÿ~*..NNNž={öÔ©SE"i¶–çÏŸ¯uÙêê *VVVEUTTè_;-vž¶Í~‹á5·nݺ”””ŒŒŒE‹¾l€ÅFTT”ú+9„Bá±cǪ««£¢¢ Þðßæ¼yóÖ¬Ysîܹâââ?þX*•Ö××ëªÜæùU1¼ã™õy†_¾}ûöŒ3ºuëfccÌ$yõCÃMMMË—/—H$"‘è…^P?€«~*¥y™£^P!ÍÎ'1¿ûî»Þ½{[ZZŽ1âÇ êß¿óö™~þùg___+++¨ªéj$ ÀÊʪ¼¼\ÏTöíÛ'‘Hºuë®±V¬X!•Jíìì‚‚‚T—$¨¦jßʺʺù|mÜŽ!—Ë?þøãþýû[[[»»»¿ùæ›ÕÕÕÌXkYײÕÕÔçÈÙÙùé§Ÿ.))ѳvZì<ô¿=ÐÀÙ×ÓWµž QÖ¯_ïéééààðüóÏß½{WÿÊ2æù$Ú¸}Cc=¾÷Þ{ª!ß~ûm÷îÝ™+ôT‹NÏ$ üm2ëwõêÕnnn666~~~ª3ÍZ­mž_º5O?×1=ôžYæ}*êCÀ¤1ïOj¯‰âýIGQTJJʰaà ¬ß^¿wŠ¢bccñþ$SÄÁuÇÅSå`žLé{ÐG8 À~prprprp…Yç¤ÆÆG}/t>è,2ëœôãWÿ=“í(€[>øàû¦&¤%ÓF+IÍ&¥ "š-ׂë Vgbo?ÜÒÒ£¬l?!¶ï†††¶K;ñññæÐ1(Šïâ2ÿÃßhl4è¹VÀ˜>}úôéÓÙšº ß¡»•[ËÞÝ­zõ°ê%¶òtìÒó·²Cq›Ù Úì¡ç8経±gOÖ_•ϘáéççÌv,ÅÕÕÕßßÿIJJÊÏÏo—x8îÊ•òo¾É<ØqÞ<{n›=ú=üêï·ìp JQ%PVtQVtQVX(îZ*+-èF!„P„P4QR„.¾5ÖKHçÿÕFŒÁ%iÿÌÇ<>2’I2ßóIJ%}óf9!¤ººaóæNò˜wxÕÕõ?ýtÒÔ$?qâ*ÛáÀCz>n§h¢‰òŸ$¤”ÓZ’€ç2Èvì‡}L—ùæ¤;wª˜SÙr¹bÇŽÄÜÜR¶#–8qM©¤ !E%$¤²<„ß…ç·XBë>©ÉPNý­'lõäw1ßÍZ'`¾+/'箪ÌãQkÖe1à‚¸¸Tæj…Byö슊Z¶#‚‡xNus·¤´m´xªk/Ë Û<Væ»MëÌwýeg—ÿ¼ø\&Süüszb"® 7_wïÖ$'g+Ô}ÿýãæ(éâD+5‡ó”µ£`â6¯.v|6â‚öd¾9)'ç®úa>Ÿzûí¹¼Yópüø_<ÞƒAÓt|| ‹ñ€†ª› ?/ËMþ¬ÀÒÏSK=ŸêbÇÞÑ×ÆÙ‚½è Ý˜oNúûï™L¡ú¨PÐ7o–íߟÌbHÀ¢¸¸¥òÁN’RI_¼x+?¿‚Å€qïvã/ËóâBÓk ›&nó·ÉCùï—âõìW^R\7ÛI˜oNºq£XcˆRIGE¯ªªc%`Ñ­[å×®ªç$BŸÏ;~ü2[!!¤®Tv6êv|XzyVÝÿmpŸ²·¿äIûCìzµã (Š¢(õÌÇ"Ok¶#…vc¦9©¶¶Qëìúú¦Ï>;müx€]G^4 …".‡ïØtý`éÍ3U~K$ÏÇè3¶›êØ'_—0‚ÿßzw‰Ÿ=›!B{3Ó{f¯^Í?~“Ö¯ø|Þo¿-÷ðp1rHÀ¢#¢nÞ,ÓúÕ™3Ëûõëaäx€ÑT« (ba£åÊ…Ó¹n£ºö›ìhü¨ C™é~Rnn©ú muJ%½nÝq#Ç,Êȸ£+!YXð¿ûî/#Ç*]lùZ!dLTo$¤NÉLsRNÎ]>ÿŸyçñ(++ 棶¶]žx¢·T*ª­md5@0žï¾»Lt<M&SÄÇãæYc •­;`ƒû:+-Ï7ÙÙw™‹î\\ìt=þÆÜ¹#_ye´›þy™™LñÜsƒU32Š$¡ƒÃƒÓæwïÖ¸¸à¤EG¹“R“²õŽx˜ý‹ÅlÇì3ÓóI?þxµkW__q×®6„çžûlð`×u릲°O,^úå—sBBc;ί2·!uû›¿UIž°b±ÄÙۆ툀}fºŸ4qâ õ¾¾’ë× Ù ÀÜܻ՘ºýNî/•=‡ØMú¦ŸË@[¶#®0Óœ¤ÁÛ[|øðEš¦Íáµu캴£è¯]Ŷ.]×¹{uÃ[Ž@r!„x{Kjjnß®èÕ ç“:–]Ï.×JLuâY &ä$B0 'ŸÏKO¿ƒœÐÑú>‡_è„ë) !ÄÆ¦KïÞNéé8¥À&䤸øHÒÒ“Ú MrNUÖâ>?h䤸øˆqé@»È?_}8<ã×·óòÏW³ ˜œOú‡··¸°°êÞ½:æŽ%hƒÂ 5)Û KÓëúü_·ÀÜ…½­ØŽL rÒ?|}%4M§§ùû{° €é)þëþŸ[î”\¹/yÒ~òžþÎ>øomœôîÝ»:9Ù]¿^ˆœÐIŸ(åtЧn£º² ˜0ä¤ À)%€6 úÔÃZdAá 5<ô ð„!€6³qBB‚v€Nô€··8+«„y^8hÕÚ—J°N.—SUV¦ýYº,[¶ÌÆÆ¦¢¢¢ƒ¢]“ðö–45ɳ³ï²)ô߇˧^0¥+¼ù|~LLŒ½}ëÞ6²eË–ß~ûM$uPT  rÒ^^Ý--8|ÐÜí³÷Ž„ÿ}þÃ|·Q]»yX·<gP5sæLKKËVÕÐÐЧOŸ ‰Ñ†½7s€œô€@ÀëÛ·ž0 .÷çÊ„é?½‘ë2Ðö…ï|žZéfãd¡^¢¨ƒJ¥R{{û•+W8p@,;88DDDèi–¢¨ãÇK¥R‘H´uëVÕ@ÕfZUÖß>MÓ6lpww‰DaaaåååªÑÝÜÜvíÚÅ4¥T*7lØàááakk;|øðóçÏë‰âìì\VV&—Ë###]]]œœf̘¡«}=^¾|yìØ±"‘ÈÚÚÚ××÷СC“hÃJéÌhPóúëû§MÛÎvÀ¦ž=_?vì/¶£ày£âÄâìC/~ÿJÖÝ´Z]Õ!ÁÁÁeeeñññ„ &¨Ê999zÆ *))IHH ÌÀÒÒRU¦¬¿ý-[¶xzz&%%egg‡††ªF1bÄÙ³gëê꘦>ýôSWW×ÄÄÄÂÂÂÈÈHGGG™L¦'>’ÊÊÚââ{lÀ O¾.‘ú;´XÍÎÎŽÂãñ4ÊúI$kêi?///<<œ¢(Š¢$‰B¡(((`¾rssSoäæÍ›ýúõcÊE …BCÞᙟŸïáñÏ}ôLAkûz"¬ªªŠŒŒ ‹ÅóçÏoqŠf9é!>>bŠ¢ð€p#Кhš&jÛý‰Åâ£G2±™½Ÿ¾}û2_id;±Xœ——§úXUUÅìÊè'•Jsss™2S‹ÅZÛ×% 77wãÆ7oÞO=õ”£¬\¹288xÊ”)C† ÉÏÏOHHÐUsÙ²eááááááqqqßÿ=sM¿åË—O:uÊ”)þþþ...ß|ó¡3󯯾újëÖ­b±øÕW_;wnPPФI“!ƒ Âm¹(fOT>ùää‘#—Î[Åv À±xé—_Î yŒí@:–¢‰NÛ÷êÞy½ÒççÁsº[:àé—À>ì'iòö–ܼYV[‹÷cBçD+é¿—šzýâWwúMr|ñ{_¿Å’JH'Ož¤´‰ŒŒìˆÉµÇÃ3Oøg¤ÉÛ[¬TÒÿ]ôøã½ÙŽ ýÕ—ËÿØXà:ÒaØ«ân}:ö{ãÇçò‘އgž“4¹¹‰¬®_¿ƒœ’³Åôc>¶.-W0:»ÓDQÔ€¸Ì:3$$à,ä$-¼½ñ"%è MJ¶Chä$-||ÄEJÜ®Ð6ue²³Q·÷OHk¬–³ @+à|’>>’ºº¦¼¼R¶chyƒ2mÿÝ+{JxÔ—z¬ølGÐ ÈIZôë×C à]¿~9 Lˆ¢I™¶¿ôê·%Ÿ<ùš¤ïsŽ<‹–ŸçÀ)ÈIZXYYôéã’ž^Øéoœ„N£2§áô[¹÷‹š¼§9=6¯‡•?m0Iè¸Úùøˆq™˜»ž]\G: šÙݶ;®©†k´óñ‘¤¥áI¬`2,lxþR$$0uÈIÚy{‹KJî••Ýg;3‚œ¤¯¯”’‘]%à–š;MÙ'ð$iè´“´sr²sq±ÇËý€;ê+dlÌ?4õú¥¯‹”2Ü<®qÐÉÇG‚—ûÔWÈR¿(Ê:^nëb1f]o÷ÀnþLB'…œ¤“··ä×_ÓÙŽÌZÓ}ÅåoŠÓ• ¬ø#—¹â–#èôðwK'ñ%x4 °¦àêëJ„:‡Æè?Õ :=ì'éäã#‘Ë•YYÅJÙŽÌ”ûØn=†ÚÙ8á o0ØOÒ©Ogkë.¸sXDñ˜ä$ø|^¿~=®_Çe` x¯Á±;ý||$x¹t´²Œº?·B&n÷b;–a?Iooñõëwh÷‚@‡¸_Ü”¸æÖÑÙ™ •rßx=ö“ôòñWW×TººŠØŽ:•º2Ùŝв¾+ïÖÇjÂVOÉ“ölGÀ ÈIúx{K(Šº~½9 ÚQÎÉÊsn ¬x#Þrí7Ù‘'ÀÞÿ@NÒÇÎβW/Çë×ïŒ?íX ó°—vyl^ŸéÎ+<xrR ¼½Å¸ÌÚ—‹¯­‹¯-ÛQpþ¦µ€¹Ìí(Ì ûI‡2þDÛ¬ªª"?¿bÏžýÖÖ&¼O9mÚ4ãO4)))??ßøÓ}tIII YÞŽ¢´ ]ϸÕ?zS†`e-´/Êø:S”)Ñåñ¬ºt76Þ¦i~ð+—³‡……ÅÇǺÈÒÒM&+S*뽩®Nc] ?{ô¦ › `''ÅÆÆâ?q:thúôélå$BH\\œñ'mnX\Ëí ç“€+“€+“€+“€+“€+“€+¸›“ª««ß|óMWWWKKKWW×—^z©°ðŸgüP•ššÚŽÓj÷98E.3òºÖ`ü!—Ë)Š*++3òt¸£9I©TNœ8ñÂ… ñññßÿ½••Õˆ#Ù Ú™ñ×õ™3g*Õ 2¤ƒ&¤ ŸÏ‰‰±·Çû)4qôy9»wïÎÉÉÉÎζµµ%„8;;oÛ¶-**J àhÀ† (ª´´ÔÉÉÉÀáfÂøëÚÎÎN(vPãÔW®ªLQÔÌ™3€iáè~Ò¾}û-ZÄl¤T„B!ŸÏW}”Ëå‘‘‘®®®NNN3fÌ(//g†SuðàA©Tjoo¿råʈÅb‡ˆˆU…½{÷ªš»|ùòرcE"‘µµµ¯¯/óŒ¾gŸ}vÓ¦ML…ääd''§úúz]1¨ŽÌ0eæ‰JÎÎÎGlÔ‡Ó4½aÃwww‘Hfø™4ã¯ëû÷ïWýK¡Pèo?11ÑÍÍm×®]ú§¥µÃ¨¯\ ê!E?~\*•ŠD¢­[·Bd2YDD„‹‹‹D"‰ŽŽ¶²²Âa^0#´ÑBbccõ×éÖ­Ûwß}§§…”””õë×{xx$''gffNžLÙËË«µó`Ò8º] Ù¾};óÏ‘" /^¼¨QG*•æææ2e¦ ‹Û+€€€€ÜÜÜ7Þ¼yóÔ©SªáÓ¦M‹}á…(ŠÒMÓ¤•)J,=z”ù³ T*+++ûöíÛ^sÄY¬¯kýí˜átuCh¼½¥gÏžyyyL9''§UM˜:Žæ¤Õ«W§¦¦>|xíÚµuæÌ™óþû理¤dee-^¼888ØÀ‹©öîÝËüæUÒì¼·L&óóóóòòÊÈȘ={6!¤¢¢‚2iÒ¤ÔÔÔƒΘ1CO B¡ðرcÕÕÕQQQê“®¬¬Ô3|öìÙ‘‘‘©©©ÙÙÙóçÏ3fLk–™©2þºn®Íí«èê0äá•®«¨ _·nÝ¥K—222˜ (Lë•cÄø‡ ‰ç“hš¾}ûöŒ3ºuëfccÌü{U?ÇÐÔÔ´|ùr‰D"‰^xá]§jš— !111u)))ß}÷]ïÞ½---GŒñã?õïߟi'$$ÄÇLJ)ëŠáÛo¿íÞ½»££#s­3< ÀÊʪ¼¼\#0Õ𦦦+VH¥R;;»   Õõ -ΑÜ?ŸD}]7_hmn_UÖÕaÔWºFPOÒ8³ØÐаpáÂnݺ¹»»3×P\¹rEÿÄù$è4ðN¿V›p`ÁÁƒ Ÿ|²Ohè¶sçn°]çE‘®½¬,… Õ JÝk4N&prR‡[° ¢(77QBÂÿíºtDGÏ5ªïœ9ÑçÎe±]çt¿¸éÌÛyÒáöÏÐk´P!Ä^ÜÅAjÉvh žãÐálm-»vµ^½z’³ó?÷iòù¼gŸ|íZÁ§Ÿž2Ä­W/'v#ìdh%}ú\š¦‚6{XØòû<ÓÍÖÅ¢0¹ºo°“Ô8pžãÀ™L±pá·?ÿœþõ×sŸyƇíp:¿¢‹ÿÚYòM?§þ.µ¯ÊkP*h‘'ž» Ài8vÇ þW_ÍyöÙAÿýï7?ý”Æv8DÉ•û—v=±H¢ž!Bw+$$îCNbŸÏûüóð!/¿¼ûÔ)¤¥GÕX-ÿeåMéH‡á.lÇmœÄ2>Ÿ÷é§/NžŸ·iÓ‹S§>þÊ+{޹Äv8& À¤á9+\ÁãQ›6½`mm±dÉ>¥RùüóÃØŽÀØ“8„¢¨¨¨ç)Š÷úëhš„†"-€yAN⊢֭›ÂãQK—P*éiÓž`;"ãAN⊢Þ{o2G½ñÆš¦§O÷c;"î’Õ),¬ù¸Ê Ó@Nâ"Š¢Ö®lmmñÆëëesçŽd;".¢•ätDn×^V#W¸² ´ä$îZ±âY÷öÛ 4MÏ›÷ÛápÎ¥¯‹J®Ôú¿)e;h7ÈIœ¶lÙŠŒ}ú´WTZQUZZêää¤^¦(jæÌ™:]Ó…cw&ãÕWW¯Ù°á‡O?ý‰íXØTW&4Ë¥çP;ÕŠ¢<(•JíííW®\yàÀ±Xìàà¡«Š¢!ÎÎÎeeer¹<22ÒÕÕÕÉÉiÆŒåååª:‰‰‰nnn»víÒ?‰Ë—/;V$Y[[ûúú:tHcêeæ+UáøñãR©T$mݺ•"“É"""\\\$Itt´••Ujjj‡-Kî¡Á¤|ù噞=_ÿä““lÂ!„ààಲ²øøxBÈ„ T圜=c•––Ò4½~ýzäääÌÌÌÀÀÀÉ“'«*Œ1âìÙ³uuuú'ѯ_¿ äååGGG[ZZ666ªOBW™TRR’ ¢¢¢¼¼¼.^¼xýúõ€€>ŸŸ’’Ò¡K€S“LÏž=çÅâ¥|‚í@¸‚ræÌ𦠅FYÏ]•¼¼¼öìÙà LKK#„Ü»w©gÈ$ªªªär9S333S=å´˜“Ž9¢jª´´ÔËËëÛo¿eª]½zUÿ,t>8ŸdzfÏÁãQ+VÄ54Èß~;˜íp8ÁÎÎŽÂãñ4ʆÈÏÏ÷ðð`ÊL¡  ÀÛÛ›âææfÈ$ªªª6lØpþüùììì¾}û¶*r‰D¢ÞT~~¾ê,———W«šèp>É$Íœéÿá‡a_|ñëºuÇÙŽÅäI¥ÒÜÜ\¦ÌÄb1óÑÀÄ››»qãÆ›7ož:uªUSgN5©ôìÙ3//)çää´ª)€NûI¦*<ÜŸÇ£ÞzëMÓ«W‡°Ž ›3gÎûï¿ß¿ÿ®]».^¼888X(¶ª™Læçççåå•‘‘ñÁB***˜Ëí*++™‚FY—ðððuëÖy{{[[[3Ph$-€Î 9É„½øâp+«.K–ìS*éwßÄv8¥®\fãhÑqí/_¾üþýûS¦L©¯¯7nÜ–-[ZÛÂW_}µdÉ’·ß~ûñÇŒŒ¼wïÞ¤I“222 TXX(‰ÔËzšŠŒŒ,//;v¬P(ܸqã©S§,,:pÞ¸ï>7yÇŽýµxñÞ3†¯_ÚùþS—\¹ÿÂìçvöuö¶a;c»~ýúÀKKKÙŽÀHp>ÉäMš4dëÖ™û÷'¯XßÉþa4TÉY‘ç:Â¡Í éäÉ“”6‘‘‘íj{ñññY¶lYMMMqqñêÕ«‘À¬àØ]g2„¢¨ÿýo¯RIøa×)ö–hòÛ;7)>ðn¯6·1~üxÓÊÓ±±±¯½öšX,¦izäÈ‘;vì`;"£BNê$ž{î1Š¢-Š¡iú£¦u‚´t=¶´ ©&xÇ£>CÈ´øúúþòË/lGÀä¤Î#8x°••ÅÿûRIüñt“NKå™u>+òRCìZ® ®qèl~ù%ý¿ÿýf„A[¶„óù&y¾PV§8þ·­K—‰_xQ&9ÐFøÅw6ÿ÷Þ»v½tâÄÕÿýo¯\®d;œ¶Õ+¤–ïôBB07ØOêœ~ûíïÿüg׸q>[·Î°iÓ€œÔi%%åÌžýu`à€­[gZX˜Ñe`º“:³ääœY³¾3¦ÿ¶m³–€û“:¹ rgÍÚ1|¸Gtô¼.]p™%prRç—’’þÕ“Oö‰Žþ¥%ÒpÎ~w~O<á¾ÿ+þ™÷ÒK»ål‡£Ecµ¢±š‹€‘!'™…aÃÜãâ^½téÖ¼y;dl‡£é÷µ·N½†wr’Ù4È56vá•+ù\KK×öݽ}öžßk¶ö!'™‘¥±± ¯^-˜1ã«ÚÚF¶Ã!„²¿ëR¶y¹GÇð !À5æçúõÂéÓ¿ðòê¾wï|[[K#‘Õ)ÏøÛ®G—‰Ûñ ! ûIfÈÇGräÈâ¼¼Òðð÷ï³¹·ôLJM5ŠÑïõFB6æÈË«{|üÿnÝ* ÿª¦¦•²¬Èú¡|ô{½l]ðnoør’™òôt‰_tûvExøVÒ’eWþàÙÝ]Gv5þ¤€³p>ɬ忖††nsqq8xpPØÆ÷‹´ä$s——WºÝÉÉîàÁݺٲ˜5ä$ ùùaaÛ¬bc"-‹p> ˆ««(>~QMMôi_TTÔ²˜/ì'Á? +ÃÂ¶ÛØt‰]èèˆ;X€ØO‚H$ÝâãÕÕ5M™²¥¤¤ºÝÛ/Ϭ'øÿz!'Áb±ðèÑ%</,l[Iɽvl¹<«þØÜÌ?T´c›Ðù 'ÁC\\ìãâ^åóy¡¡ÛÛ+-5Õ*~~+·Ç[ω¢vi:+ä$ÐäìlèЫüçŸßV\Üiéìû·euÊ1ëð !hY_ãpèСéÓ§³Gñù¶ÝºM©©IllÌ”v”ÅÂ>Ÿœ+?òWÕ™öŠ­ ‹‹c; ÖàMØäÝwße;Ž¢iBQíÑRy !íÑTg†l€œDFÍv„òÛo¿±Ëp€¸9 ¸9 ¸9 ¸9 ¸9É uuu_|ñÅ´iÓžyæ™iÓ¦}ôÑGeeeÌWcÆŒÉÌÌlÇiµ{ƒ¬Oqîܹ»víR}\µjÕ›o¾©úxàÀ3f(Š1cÆÜ»§y‹®®Œ¼Ä!º€GkÁ[FÓôòåË)ŠZ»vmÏž=ËËË?¾hÑ¢½{÷ZXX° >b{imÀ`ì'µìäÉ“wîÜùè£   =<<^ýõ;wòù|¶Ck;]ÿñ;â¿ÿàÁƒÿþûoæ‰!iii"‘ÈÅÅåòåËÌ·éééƒ ¢(ê™gžar¼!1X[[Û©áñ:°'«Ç£*« í9©e§OŸžúè£O>ùä§Ÿ~R(ºÖ¨Ãù¤–ÕÕÕ©oƒ˜?Ë„ãÇÛÙýó>Ö'NÌ™3gÀ€„%K–Ì›7¯®®Ž9Ù0mÚ4‡Q£FB^xáU¹ºººgÏžÏ<ó Ó‚ªÐÜ_|ammÍì– 4H&“ÕÖÖ>õÔS›6m*++sttüí·ßÞyç7ꊡ Ž;6oÞõÔS …¢®®îäÉ“³fÍòòò"„¼öÚk/½Îþ•ž*IDATô’!rRËóóó}||˜Çoll U¯s÷î]±XÌ”™Biii¯^½!ÖÖÖ„Š¢4ʆ»ÿþþýûÓÒÒ ¥R)3ÐÖÖöñÇÿý÷ßûôéÃçó¨'†6(..^·nݺuëTCJKK™©·aŽ|èС‹/öïߟÉLIIÉÈÈxúé§õëììlÈ$ôÌ~÷îÝUÕô¯u9ÈÉÉI½)õ`ZÛ€9CNjÙÈ‘#;6nÜ8æ´ÝÕ«W5ê8;;ß¹s‡9øÆÂrttl¯–,Yâíí½`Á///š¦ÇÇ =zô?üpëÖ­ÀÀ@Š¢ôÄÀ\_PZZjøD_}õÕ‘#G2£×ÖÖªv Û`ðàÁ}ôÑï¿ÿþÄO0Cüüü.\¸••µxñbýã˜Âõ̾-èZΆИ„££cQQÌ;w oÀÌá|RËfÏž]^^¾råÊÌÌÌòòò³gÏîÙ³G£NPPPLLÌßÿ]PPðÙgŸùûû¸?}ú4³UH³ø …bÀ€R©ôÖ­[|ð!¤¦¦†òÔSOeffþúë¯cÇŽÕƒÝùóçëêêöîÝ«>i¦‘æ˜áAAA;wîÌÌÌ,,,üä“O–.]Úše¦©GNNNgÏž6l3ÄÏÏ/))‰Ïç»»»ëŠ¡UÚ¼ Tt-gx ‰mìØ±1117nܸuësEkwŽÌrRË„BáÖ­[íííßzë­ððð'N¬Y³F£Î‹/¾8jÔ¨Õ«W¿úê«Ýºu[¾|¹ðÁiiiêÒìþo¼qäÈ‘çŸ~óæÍãÇâ‰'Þ~ûmBˆÍã?îääÄ\‚¡+†Å‹ïܹóÅ_T?s3hР—^z©ùæU5|ÆŒþþþ«W¯~ùå—ïÞ½ûÞ{ïµv¹igÎzFIEND®B`‚glom-1.22.4/docs/libglom_reference/html/annotated.html0000644000175000017500000006102712234777147024212 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class List
        Class List
        Here are the classes, structs, unions and interfaces with brief descriptions:
        [detail level 12]
        oN__gnu_cxx
        oNGio
        |\NDBus
        oNGlib
        oNGlom
        |oNConversions
        |oNDbUtils
        |oNUtils
        |oCAppStateThere is one instance per document
        |oCsharedptrA ref-counting smart-pointer for the underlying C++ object
        |oCReportBuilder
        |oCDatabaseTitleThis is a separate class, instead of just deriving Document from TranslatableItem, to avoid the need to use Document via sharedptr
        |oCChoiceValueA value of a custom choice, for a field or a layout item
        |oCpredicate_FieldHasNameA predicate for use with std::find_if() to find a Field or LayoutItem which refers to the same field, looking at just the name
        |oCField
        |oCFieldTypes
        |oCFoundSetA grouping of information about a view of a table, including what records are viewed (the where clause), how the are sorted (the sort clause)
        |oCHasTitleSingularHasTitleSingular instances may have a (translated) singular form of their title
        |oCGroupInfo
        |oCNumericFormat
        |oCPrintLayout
        |oCPrivileges
        |oCRelationship
        |oCReport
        |oCSystemPrefs
        |oCTableInfo
        |oCTranslatableItemTranslatableItem have a map of translation strings - one string for each locale
        |oCCustomTitle
        |oCFormattingThis specifies how to display data for fields or static text items
        |oCLayoutGroup
        |oCLayoutItem
        |oCLayoutItem_Button
        |oCLayoutItem_CalendarPortal
        |oCpredicate_LayoutItem_Field_IsSameFieldA predicate for use with std::find_if() to find a LayoutItem_Field which refers to the same field, without comparing irrelevant stuff such as formatting
        |oCLayoutItem_FieldA LayoutItem that shows the data from a table field
        |oCLayoutItem_Image
        |oCLayoutItem_LineThis is only used on print layouts
        |oCLayoutItem_NotebookThe child items are LayoutGroups, each of which will be shown on its own tab
        |oCLayoutItem_Placeholder
        |oCLayoutItem_PortalGet_title() returns either the title of the Field or the CustomTitle
        |oCLayoutItem_Text
        |oCLayoutItem_WithFormattingA base class for all layout items that may have formatting options
        |oCUsesRelationship
        |oCLayoutItem_FieldSummary
        |oCLayoutItem_Footer
        |oCLayoutItem_GroupByThe child items are fields to be shown for each record in the group
        |oCLayoutItem_Header
        |oCLayoutItem_Summary
        |oCLayoutItem_VerticalGroupThe child items are arranged vertically in a row on a report
        |\CDocument
        oNGlomBakery
        |oCDocumentThe Document is like the 'Model' in the Model-View-Controller framework
        |oCDocument_XML
        |oCViewThis is a base class which should be multiple-inherited with gtkmm widgets
        |oCView_CompositeThis View delegates to sub-views
        |\CViewBaseThis is a base class for View
        oNGtk
        \Nstd
         oNtr1
         \Ntr2
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1View__inherit__graph.png0000644000175000017500000002546012234777146031633 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÍ0›¥bMbKGDÿÿÿ ½§“ IDATxœí{\SGÚÇç$¡„›„‹BˆÈEQi©¬PEa­`¥H—›‚Õ²ô¥]\­]t± .¨(mmín«¸ [¹ b¥Ö °Jƒ±(‚È%`ÂUC.çýcÖÓ NÎ÷Ó9sžyfòËÌœ9Ïá`8Žbœ¡¨ÚÄ+Ò‚ Îd€t† ¤3ÐTí€l0 Sµ êJzzz@@€ª½ÊÕ`Ë–-ÎÎΪöBÍ Tµ ²™¸:svvž€¿Ë ΄ÕZŸ!Èé AHg2@:CÒ‚ &ÎD"†aªv(î†Ì’†UTTŒƒ_ªdòèŒJ¥&''ëéé©Ú„ &Î0 [·n¦¦æËÛ™ƒâ$CuÆápœµµµÍÍÍÁs‰…ˆˆˆiÓ¦™šš&&&ÒéôŠŠ ‰Doii©££³hÑ¢’’hð””"ïwM:J ðââb6›½yóæåË—jiiÙÛÛgddäÙ$ˆŠŠrttäóù•••ÃO‡ää䘛›3 ??¿ŽŽ"ÇñøøøY³fúûûwuuooŽ7ø„žž>r ‹ÈÈÈÖÖÖììl …ÒÖÖàr¹qqqÖÖÖ7nܸs玫«+•Jåp8ß|ó™™YqqqKKKTT”‘‘‘P(Äq<99¹¾¾^:n¸¸¸\½z•ÍfüñÇ mmm‰‰‰ššš@žMh!66vÁ‚]]]8ŽÛØØ ?–ttt¬ªªº}ûö¢E‹V®\ 39ηß~keeUZZZWWçåååç秬~S j¬3CCÃÂ4ljDð ¶¶¶>yò$Ì¿uëüÚæÌ™“˜˜3% Ç“H$òª–ÖYff&Žã|>_$ÁÌÚÚZXFžMÀ¶mÛÕÕÕð¨ÌÓaÉÂÂB˜óæMÀ“'O Ãvvv©©©ðPKK •JíïïWJ¿©5ž7>?sæÌ>ø ¦¦†J¥Âü¦¦& ˜¶¶¶†‰‡ÚØØÀ4†a CÁ6› àóùQQQ®®®L&3,,ì…6¯^½êéé?Ê<bee¶¶¶€ÖÖVø±¡¡!88Ã0 ÃLMMÅbqssóhºgb¡Æ:óôôlllÌÌÌ411Y¶lYKK Ì711ihh€éÀ“É$2|>_,+R …B¸ººÖ××ùå—>¼pá mfff&$$äääË;RWWµµµ†™™™Æsssá`ËÙ³g+Þ9 5Ö™ƒƒÃöíÛÙlö›o¾‰ã8N‡ùÁÁÁ{÷î½yóæÝ»w#""†…„„ÄÄÄ\»v­­­íÀ,ëéÓ§€””¨"àñxCê …NNNÖÖÖwïÞ]¿~=àÉ“'òlètº¹¹ùÎ;7nÜ( ežKnß¾ýöíÛÕÕÕùË_üýý‰}™õë×GEEUTTÔÕÕ………¹¹¹g_Ž?*µåXg\ºtÉÞÞžN§[ZZ¦¥¥áÏ—VÏž=ûË_þb``0kÖ¬¬¬,@UUÕàà`tt4›ÍÖÖÖvrr"VE€äädé„««+N‡ëw‡ÃÁqüìÙ³æææššš...çÏŸ÷ðð°µµÁ&\~ [[ÛÏ?ÿ\æé°djjª©©©App0Ç#*ܾ};‹ÅÒÕÕõððxðà²úM%¨±Î¡ººnv¼¼)µ`ÂêLçMyÌ;÷ïÿ{ooo[[[tt´»»»‘‘‘ªzÕ™„:KOO¿qã“É´²²êïï?zô¨ª=BLà¸í1cooùòeU{ø“pwîNwqqJ±_XXÈãñx<^ee¥³³³¯¯o¿ìWŽçÏŸúô)‘“——·bÅ ƒ‘œœ¬§§76³¡icWéééŠXKJJš1cF__Ÿt&ljDð·óCNïîîÔÔÔŒPžË厹:yƒ‘MäÌš5ëĉ/cs´M{yüüüüüü”eìñ,55uãÆ:::Ò™ ƒJýí­Ð"‘(**ÊÌÌÌØØ8((¨«« æcvúôi‹¥§§÷ÙgŸ¥¥¥1™Ì)S¦DDDçöõõñù|>ŸßÐаgÏžyóæÍž=»²²rùò円†ZZZöööC¼ŠŠŠrttäóù8ŽÇÇÇÏš5ËÐÐÐßß_ºêââb6›aq{­¬¬ÌØØX(b–’’‹¥¤¤¼öÚk>>>ÄÝ‘[·nµ´´x{{ƒç3µÌZ-ZtäÈ@KK †atvvR(”ÆÆÆÑ6Ãá8;;kkk›››'&&Êky(K° ŽggÏž•wvÐþýû---ËÊÊjkkÝÝÝ}||ˆ£^^^ð+\¹r%‘~ðà>ìF-…B¹|ù2Žã666üqCCC[[[bb¢¦¦¦@ ÀŸg±±± ,èêêÂqüÛo¿µ²²*--­««óòò"~З«W¯&$$8;;ÃÌO>ùä£>Âq<99¹¾¾^:QPP §§÷ìÙ3ÇwïÞ½råJ—˕YKLLL@@Žã©©©ÚÚÚ«V­Âq<;;ÛÎÎn M³°°ˆŒŒlmmÍÎΦP(QQQ2Û5ÊÏÈÖF+))ù­úçðx<ü¹Î¬­­‰Y¦ººÐÝÝ â8.‹‡¤áœ¤&—žžžððp&“)‰ø|>œ—q¯­­ϧKÀ¶mÛÕÕÕð¨]jj*L·´´P©Ôþþ~X233Çq>ŸO§Ó›››Åb1“É,..–ÙL¡Phdd”——‡ãøo¼‘””D´—Ëåʬ¥¬¬lÚ´i8އ……mݺU___$mÞ¼9""b M344 Å—.ÝQ•KêÒ™Büøãm‘h誟BÁ²²Æþ_g^)Î";»bø®¬H$),ü•ÇSŸ¦¢:Î^Lggßµk÷Äb‰Ì£·IöGA:{1·ÄrvÊÄb]u*ÒÙ‹Éͽ €¼»Àxyy}GG/©©!è>ú¨a2?=rdƒ··ƒªQ'Ðx† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3 !Èé AHg2@:CÒ‚ Îd€t† ¤3(ù}Â¥¥¥MMMãd\å”––>{vOÕ^Œ ãb”øÊ㉆¦&›BÑVµãÅ8éa¼Æ3ÀÒ¥KcbbÆÏ>B¹ÅÆÆŽ“q´>CÒ‚ Îd€t† ¤3 !È`÷5d``àĉ………<ÏÀÀàÍ7ßüóŸÿlll pss;räˆÍØ,»¹¹immm ‹ÐÐP¹ïerssËÍÍÕ××[uòˆ‹‹‰DÿøÇ?ˆœÊÊÊ¿ÿýïÙÙÙÞÞÞãQ#ø}Û ^¦3_ë ÇñÈÈH ÃbccMLLºººòóó7nܘ’’¢¡¡ñòöü§ÂçóÇþ‚ŠuVWWgii9r™ôôô+W®ÄÆÆ:tèÉ“'_~ù%qèÒ¥KIIIÛ·o?uêÔÅ‹ÿóŸÿDFFfff¶¶¶ÂŸ~úé»ï¾ûî»ïeddüõ¯¥P(»wïf±XG=}ú´¿¿ÿ¾}ûD"aóäÉ“¥¥¥_}õ•®®nnnîùó磣£9288øõ×_ÅŽ;õé§ŸºråÊÒ¥Ki4ÚŽ;ìííDÂÍÍ­´´T(®]»æèèGˆÌZþð‡?üòË/€ªª*MMÍÊÊJÀ­[·ØlöôéÓ‰soß¾½{÷îO>ùdLÝO*^Ÿ H¯‚‰Õk~~>ñMlذaΜ9€Í›7‡„„ À¥F@@À”)S–,YX³f ‘îéé111R+ߣGÆÅÅedd$$$hiiÁ!sþüùB¡°¿¿ºqúôéÓ§Oÿý÷zzz€¼¼¼;;;@DDD@@±Ìò÷÷Ÿ7ož……Å¡C‡:;;ŒŒŠŠŠvíÚxûí·¡çDÂÑÑ‘F£q8—k×®½÷Þ{Ò ³''§ÜÜ\@ee¥Ï¹sç$Ieeåþð€@ ¸téRnn®®®îêÕ«wìØ¡üïF©¨XgFFFMMMsçÎ…óóóÁXŽŽ&“ Ó0ÁårgΜ ÐÒÒ`6$=mmíÐÐм¼¼¦¦&:~êÔ©êêê––‹%]ìÖ­[NNN§N‚ß\[[ÛÞ½{÷îÝKàr¹ð8¨èèè8::þ÷¿ÿµ°° R©óæÍ“Y;•Juuu-..¶²²jhhX¼x±ôQ™µØÚÚJ$’‡VUUÅÅÅÞ¿¿ªª*<<œÃáìÛ·ÏÝÝ=::šÍf¿¨'*ÖÙ[o½•——·bÅ 8ºèêêÞºukH™©S§>~üN@pB422C]b± ¥¥µiÓ&;;»?þØÚÚÇñ+VebbbÄbñ|°jÕª …‡‡¿õÖ[Çûûû‰Q–ô²eË~øá‡ÆÆFwwwy*¸»»ïÚµËÊÊÊÁÁ–òjY¸páåË—ûûûÍÌÌ®]»ÖÚÚ:þüææf[[ÛëׯϘ1ÃÀÀ`ˆµ‰‰Š×gëׯïêêúì³Ïjkk»ºº®^½zâĉ!e<<<’““ýõ׿ææþóŸÎÎÎÒ‹›‘!®:;;=jee5uêT±X@oo/,ÿÚk¯Í˜1ãý÷ßÿæ›oD"‘‡‡GRRRmmmKKËW_}õé§Ÿ¯bñâŵµµW®\Y¾|9̹xñ"ü= À‚ 444’““—.]:¼2kqrrÊÉÉ™?>à7Þ8s挃ƒF377ß¿ÿ_|Áårÿüç?ñÅ÷ïßW°CT…ŠuÆ`0¾ûî;==½mÛ¶ Y[»ví’%K¢££ÃÃà "##·O\¬[·®½½=&&ð¿ýíogΜñõõ=xð §§çÂ… wîÜ)}V`` D"ÉÊÊ rvvŽŽŽþ¿ÿû¿ŽŽŽÝ»w¯B[[ÛÑÑÑØØ˜¸ Ù·o_uuµt@¡P–.]Úßß?dÒÈ«ÅÉÉééÓ§ ,¼þúëýýýpq111 OII±³³;tèâ}¢0ÇÇî¿¿?—Ë}E⣢¢æÌ™¬jG^ ç8Nz@÷7_ @p÷îÝŠŠ bÒDÈéì¥(//ˆˆX¿~½ôžb8ª¿®Ö¸ºººººªÚ 5g2@:CÁ¤7‰[X ÅÔÔtýúõh©®B&­ÎÀóà³ÒÒÒ/¾ø‚N§ß»BÃdž7aÜÕ´iÓV¯^½víÚãǫڣ¡À¸ U{A“YgÒ¸»»?xð ··Wf4Œ òôô '6ñ¥u@¤GŽ{!díçŸö÷÷÷öö>sæ x>³ûøøHK­¯¯Þ‡d¼*:›:u* ³³Sf4[NNN^^ÞöíÛSSSß|óÍ;wŽüe÷6BÈZnnî±cǶmÛvèÐ!¡PXXX3¥#£jjj‚ƒƒSRR&~èâ¨xUtF@D³±X¬Í›7_»vm`` ??Æ óçÏ722 IMM9Äy„¸7"˜ŒÉdFDD\½zU À³¼½½ ÆâÅ‹ÅbñÀÀ€LËNNNÿú׿ž={¶ÿþ_ýUÙ &óu€4\.`ll,3š­­­ÍÌÌ fböÂxâÞFYƒq;™6mÚ‡~¸aÆÂ¯¾úŠF£%$$Œ¶½WEgW®\±¶¶ÖÓÓ“ÍfddÔÚÚJD)öõõikkÃ! ÞW†2UEBÖ¡©©éÎ;ýýýîî5a™Ì:ƒÁgp_#-- Àh66›­««KD³­\¹òøñã&&&¦¦¦/^<~üxNN¼\-))qssKIIQ°RLfll¬««›––V[[{ìØ±Ê÷ööJ¯Ï„BaQQQ^^žH$zï½÷þú׿ŽÓQ$3™u1 c±X‘‘‘ð£µk×>}ú4::Z ,\¸póæÍ€5kÖ…½{÷vwwÏš5kÿþýp6Ü´iÓ‘#GŽ=ºiÓ&øôÑ ÑÑÑ}}}ööö2CÖæÏŸš••EÄÄ–•••——‡‡‡ÃÇ& (þ ñ?Æ5þL½Ç³ë×¯Ë ¯]·n]hh(ùþ ä¡Þ:srr‚»Pˆ Î+·†P Hg2@:CÒ‚ ÎFMss¯ª]P?Æñz³¦¦fRîŸ55Y›˜<¤Ñ„ªvDÉ(~om Œ—ΜÇɲj¨Ïžéâ8kêÔ>Uû¢d¦N:~7!Æë~ÀdåСËqqçì옗.mSµ/êZŸŽ¬¬ ÀÝ»­vªÚuélüúkkmm€F£dgßPµ;êÒÙ(ÈËûECƒ  Å™™U»£N ) Žã™™¡ðÏ úè£ÞÞ^%W‘H4N Ʀ3‰DòÎ;ï”——gee577Ÿ;wŽN§»¸¸¥øTXXÈãñx<^ee¥³³³¯¯o¿R,+N``àùóçŸ>}Jääåå­X±‚Á`$''ëéé)«"·téÒ×_ýÞ½{çÏŸ¯¬¬Ü¸q£²Œ *•ªÜ¦ýŽá÷ð‘””4cÆŒ¾¾>éL'‰àÛï8Î ÈcÈéÝÝÝ€šššÊs¹Ü1W'@À`0²³³‰œY³f8qBéíܹÓÝÝøXUU¥¡¡ÑÝÝ­ôz†a§OŸf±XzzzŸ}öYZZ“Éœ2eJDDqn__ŸÏçóù {öì™7oÞìÙ³+++—/_nhh¨¥¥eooŸ‘‘1Ä«¨¨(GGG>Ÿãx||ü¬Y³ ýýý¥«...f³Ù†}ýõ×0³¬¬ÌØØX(b–’’‹¥¤¤¼öÚk>>>YYY°Ø­[·ZZZ¼½½Áó™Zf-‹-:rä ¥¥ð:;;)Jcc£ÌÎÌËË &>Ο?¿££CGGg̈aXNNάY³ F@@@WW—ùä£>Âq<99¹¾¾^:QPP §§÷ìÙ3ÇwïÞ½råJ—˕YKLLL@@Žã©©©ÚÚÚ«V­Âq<;;ÛÎÎN^wiii]¹rexþËt ­­mYYYMMÍ[o½µzõjy¦,,,"##[[[³³³)J[[x>Œ y92Ãdz±èŒF£•””üfâ9<®3kkkb–©®®À¹PXXˆã¸X,’†Ó%š7{zzÂÃÙL¦H$âóùp^Æq¼¶¶VºG¶mÛ¨®®†GíììRSSaº¥¥…J¥ö÷÷Ã’™™™8Žóù|:ÞÜÜ,‹™Lfqq±Ìf …B##£¼¼<Çßx㤤$¢½\.Wf-eeeÓ¦MÃq<,,lëÖ­úúú"‘hóæÍò:“N§ËÔÙËtàñãÇቕ••€éÓ§Ë4ehhxðàA˜—=Ãu&¯3GF9ó&“ɼwïž´¼ˆ‹M‚¦¦&KËÿ½q&š››áG]]]8P IGOOoÏž=?¾wïŸÏŠŠruue2™aaaÒÅ®^½êéé?644Ã+VSSS±XLTÍf³úúúË—/ÏÎÎþïÿK£Ñ–,Y"³væë뛕•ÕÔÔtûömé£2kY¸p¡X,¾sçNqqñ‡~8eÊ”_~ù¥¸¸xåÊ•ò:ÓÜܼ¡¡A:‡Ïç‹Åâ—é@âD@{{»LS‡ŽŸ9sæ|PSS#½ì¹™òÚ2cÑ™··÷áÇáoÀ`0nܸ1¤ ‹Åª¯¯‡i˜`2™c¨ þÈtuu]]]ëëë¿üòˇ^¸pAºLfffBBBNNNqq1¬(77þŒ$ Ç›=ûïþ%¾€€€¬¬¬ôôô5kÖÀåˆLóóó³²²–-[fhø»X ™µP(”+V¤¥¥uwwÛØØ¸¹¹åææ644È“2`ÕªU'Nœ >Þ¹sÇÈȨ··÷e:ðÁƒ0qÿþ}€±±±LSžžž™™™&&&Ë–->XÈk¦‚nüéÁMÁy³½½Åbyzzr8œÇggg;::‚ßÏ›{öì±¶¶¾~ý:\xyyÁsÔ´(3 ¤ö5š››CBB$‰‰‰Éººº*++áÎVmm­ô7wîÜÁÁÁØØX{{{‡sÿþý?üÐÁÁaxuÝÝÝZZZ £²²æ _Ÿá8.‰¦OŸnhhøïÿ›h>x¾"”YËÉ“'§L™WiÇ×××÷öö¹3 ÆÖ­[=ztûöí%K–üéOÂqüe:ÐÊÊêúõë555K–,ñòò’gÊÜÜ|Ë–-­­­YYY4 îœóæ½{÷p—×Ì‘QÎú ÇñGhkk{yyÁ_‰´Î###MMM ׬YC\$+ÒMZZZüãïß¿ãøÙ³gÍÍÍ555]\\Ο?ïááakk‹KéL ØÚÚ~þù烃ƒÛ·og±Xºººpu<¤:ǽ½½çÎû[Gœœ,€lܸ‘J¥vttH—är¹òjiooÇ0ì»ï¾ƒ½HHH¹3ᥴ––ÖôéÓCBBàÕÌËtàþýû­¬¬¦L™âëëÛÑÑ!ÏÔ¥K—ìííétº¥¥eZZštgºººÒéô®®.yÍ¥él°zõ길8U{¡|ÀËí_*å\¨;ååå?ýô“ôÆÕ¸òã?b²ˆŠŠ"Ç•##žvÒSPPðÁìÚµkæÌ™äÔèéé‰Û'H«hT¼Š:óõõõõõUµ¯¯â¼‰ ¤3LÉ\eË ƒ# Ðh4[[ÛÔÔT’½}™$ë3………€B©`™ÞÞÞüüüÐÐP!·•Êe’èŒÁ`i]]]é2e Fxxx{{{LLÌDÓ†a\.רØXÕŽ(µœ7¹\®­VUUÁ€…áqZ‰$>>ÞÒÒRGGgÑ¢E%%%ð,ég"=rp.?0.??ŸÅb~÷Ýw0<#ü„+Jl8©HoÚNüûW¯^ „wœdØ R¦§§pûöm™qZß|ó™™YqqqKKKTT”‘‘‘P(Äq ¤n Ž6B`œ‡‡G{{{vv6Fƒo`XDkAAÁÌ™3÷îÝÛÞÞ>†®#u½ï400pìØ1‡eË–¥§§Ê+ù2:“ò5gΜÄÄD˜ $ ._g#‡wæÌ¢ä0i?ûì3‹õþûï———+ÐsªA-ï;]¸paæÌ™·nÝJKK+,, ÐÐÐP¢ý¦¦&€©©©Ì¯‡Â(.†a c„8"0bpر\¦¦¦@~›ÍÞ·o_]]ÝÛo¿ýÑG999±Í¤£:c±XNNN.\8þ libglom-1.22: Member List
        Glom::LayoutItem_Notebook Member List

        This is the complete list of members for Glom::LayoutItem_Notebook, including all inherited members.

        add_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        add_item(const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)Glom::LayoutGroup
        change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)Glom::LayoutGroupvirtual
        clear_title_in_all_locales()Glom::TranslatableItem
        clone() const Glom::LayoutItem_Notebookvirtual
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_border_width() const Glom::LayoutGroup
        get_columns_count() const Glom::LayoutGroup
        get_display_width() const Glom::LayoutItem
        get_editable() const Glom::LayoutItemvirtual
        get_has_translations() const Glom::TranslatableItem
        get_items()Glom::LayoutGroup
        get_items() const Glom::LayoutGroup
        get_items_count() const Glom::LayoutGroup
        get_items_recursive() const Glom::LayoutGroup
        get_items_recursive()Glom::LayoutGroup
        get_items_recursive_with_groups() const Glom::LayoutGroup
        get_layout_display_name() const Glom::LayoutItemvirtual
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_part_type_name() const Glom::LayoutItem_Notebookvirtual
        get_print_layout_position(double& x, double& y, double& width, double& height) const Glom::LayoutItem
        get_print_layout_split_across_pages() const Glom::LayoutItem
        get_report_part_id() const Glom::LayoutGroupvirtual
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        has_any_fields() const Glom::LayoutGroup
        has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const Glom::LayoutGroup
        LayoutGroup()Glom::LayoutGroup
        LayoutGroup(const LayoutGroup& src)Glom::LayoutGroup
        LayoutItem()Glom::LayoutItem
        LayoutItem(const LayoutItem& src)Glom::LayoutItem
        LayoutItem_Notebook()Glom::LayoutItem_Notebook
        LayoutItem_Notebook(const LayoutItem_Notebook& src)Glom::LayoutItem_Notebook
        m_list_itemsGlom::LayoutGroup
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const LayoutItem_Notebook& src)Glom::LayoutItem_Notebook
        Glom::LayoutGroup::operator=(const LayoutGroup& src)Glom::LayoutGroup
        Glom::LayoutItem::operator=(const LayoutItem& src)Glom::LayoutItem
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const LayoutItem& src) const Glom::LayoutItem
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        remove_all_items()Glom::LayoutGroup
        remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)Glom::LayoutGroup
        remove_item(const sharedptr< LayoutItem >& item)Glom::LayoutGroup
        remove_relationship(const sharedptr< const Relationship >& relationship)Glom::LayoutGroupvirtual
        set_border_width(double border_width)Glom::LayoutGroup
        set_columns_count(guint columns_count)Glom::LayoutGroup
        set_display_width(guint value)Glom::LayoutItem
        set_editable(bool val=true)Glom::LayoutItemvirtual
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_print_layout_position(double x, double y, double width, double height)Glom::LayoutItem
        set_print_layout_position_y(double y)Glom::LayoutItem
        set_print_layout_split_across_pages(bool split=true)Glom::LayoutItem
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_list_const_items typedefGlom::LayoutGroup
        type_list_items typedefGlom::LayoutGroup
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~LayoutGroup()Glom::LayoutGroupvirtual
        ~LayoutItem()Glom::LayoutItemvirtual
        ~LayoutItem_Notebook()Glom::LayoutItem_Notebookvirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/namespaceGtk.html0000644000175000017500000000413712234777147024636 0ustar00murraycmurrayc00000000000000 libglom-1.22: Gtk Namespace Reference
        Gtk Namespace Reference
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1CustomTitle-members.html0000644000175000017500000004007112234777147030442 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::CustomTitle Member List

        This is the complete list of members for Glom::CustomTitle, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        CustomTitle()Glom::CustomTitle
        CustomTitle(const CustomTitle& src)Glom::CustomTitle
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_has_translations() const Glom::TranslatableItem
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_use_custom_title() const Glom::CustomTitle
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const CustomTitle& src)Glom::CustomTitle
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const CustomTitle& src) const Glom::CustomTitle
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        set_use_custom_title(bool use_custom_title=true)Glom::CustomTitle
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        ~CustomTitle()Glom::CustomTitlevirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1Document__XML__coll__graph.png0000644000175000017500000026475712234777146032663 0ustar00murraycmurrayc00000000000000‰PNG  IHDRCu†?!ebKGDÿÿÿ ½§“ IDATxœìÝyTS×ú7ð}2’¦0atœ¢J[«XE¹ŠhÕ«¥¶¶Ö¶Ú‚ÖªoK¯Úþzª•Ú¬NWÛj‡«8Vñ:!RˆL2’02½›RˆTÈ÷³\];;ûìóœÔe’ódï‡Òëõ [b˜:€‡B&º/d2 ûB&º/d2 ûB&º/d2 gˆ‰‰™1cFóžÓ§Os¹ÜêêjŠ¢*++Mt*d2 g˜9sæ?üÐÐÐ`è9zôè¸qãD"Qrr²@ 0alÐyÉ€žaüøñl6ûÇ4ô=ztúôéEÅÄÄp8Æ™ è\EíÝ»×ÅÅE ¼ûî»{öìqrr …Ë—/oû¨C‡I$‘H4cÆ ™Lfff™ššJ¸yófqqñäÉ“éÁ•••z½>11Q"‘X[[GEEÉd2BHHHÈöíÛ !ÅÅÅEmܸ‘RYYÉ`0òóó;ýâà‰!“n÷îÝ7nÜøú믓““322¾úê«O>ù$//¯£âãã÷îÝ{ñâÅû÷ï/X°€2sæÌãÇ766BŽ=:zôh‘Hd¿uëÖ/¿ürÏž=ééé*•êå—_&„Lœ8ñÔ©S„´´4ssóÓ§OBΜ9Ó·o_ww÷μhè”^¯7u ð4£(êÔ©S£FÒétL&³y;===((èaG}ýõ×sçÎ%„ܸqcàÀ …ÂÜÜÜÁÁa×®]“'O2dÈ’%KæÏŸO®¨¨9rd||ü¬Y³!÷ïßwssS*•“'O.++[¼x±P(ܹs§L&{óÍ7Ùl6½>º9¬É€NÇçó ! £E»m^^^tÃÏÏRTTÄb±¦M›–ššZXX˜‘‘Ù|¼T*={6EQE9;;kµÚ¢¢¢¡C‡jµÚÌÌÌ´´´…  …Âk×®¥¥¥Mœ8±Ã/:2ÐMåææÒ»wïBœœœ!3gÎ_=ìóÏ­ïÊu=WÄâˆX\Ë܆máÀf0‘ó€Þ¿º‹¨¨(Bêd<5(Šj«â·ž”\«½s¸2ïgyßé¶ÃÞréÚèàOtæ@¯Ó7Õê!Ú&¦QGþÿ«;KêÊÕt[Ý,ÓðÌÎ|G³Öãÿ3?[.}ðͶ©VgÈ4LÛÛ×ÚÇÈ7Õƒ3³Œ~~ØøKså÷|6ã3(ƃï´Ï~(±t3’™hÿƒ£Ì™‹øÏ›ÛÉ|´ï7†­ãyrY#™˜æÙš¿DÕìX€§ ýùG¯Ó«ë´„J¯mÒB¬¼¸L3#Ÿ—N¾‘[u·A%×hT>e1XßÑìùÏ}Œ~þx*aM@—j¨Rß=^•¹¿¢¶¤‰Á¤ôz½¦ÑÈÖ:½ý-ŽÞƒÈÜÎŒifäεôWy£B£ÓéÕÍ4øG‹ÍíŒÜy?Ož¯jž™ —8LÚéktíË©©ìŽ‘ÌÁÔÝ}lû˜·î¯¯T×7Òm¶“ñÇÝvýCþ7Ì7*4†ñÔɾƒñ¯þí­ÓèþÿÇüf|#_k !þíeüÄ1øŸŽ5^2FôXãÅ5žÞT ÷0|þáŠéžÌøÿ{ðyO£Ò©äšº2uMq£²¸‘kmüðSñ÷øŽfV^\+O®Hb<;Ðã “Ðtý½Óò¬%ÿ«¥˜”N£'„è´zŠAi»Y&ãÁoÄôzu­–¢iÔÓŠ$\×È· Ì½uMz¡«h›tZ•ž¼ÔIàldMÀ÷‹ïʲ뛯N E&÷±ëg$spû@…ìN=EQl>“ÂâPLƒâó¼ÑL†8ÐÂÂMQ½¢‚É¡è¥FBÆÿŸ·N­#­Æ?̈wÝÚx¶5ÉèÇËXØz9—Áw0ã;˜ÙxøoGô„Åe_VÞÚ[®iÐQ JàLg5xAqN’Ðc!“Ðó(•ʵk×îÛ·¯¼¼\,7níÚµÎÎ΄Š¢ÒÓÓƒ‚‚Ú73Eýù‹x¡P°~ýúQ£Fµ1¾¢¢ÂÖÖ¶}§{˜˜˜˜¦¦¦ýû÷zNŸ>=a„’’kkëöñq/­Uç6ü~Hv÷‡ª¦ ¡(žPš?ïàëuí\“¡®×ê4D]¯ÕkõMu:½V/òà­£p{EmY] A]¯Õkˆº^«Óꇿíj´ÎÁKrÊ3êZ÷OùÚÏèÏí+¯¯Êi äA&€Í :c[BúÿÃNU¥a›3)a›3LŠmÁ`0)‘‡‘`!Ïo÷yè«`tþ™v5ÞBŒÌ<-(¶Ê¢×‘šâƪ» U¹ Õ9ªòŒ:¤1 GC& ‡ÑétÏ=÷EQ©©©žžž÷ïßÿâ‹/†žÍáùýûã:uêÔÀ !ÕÕÕÛ¶m›6mZAA…Åãmó„fΜùü£¡¡Ç{°ÐÑ£GÇ'‰’““Aû¦íâKã0xM×…fUå40XDGo/¤×·Þ>Iž×xysqë5 CâÞÜÿÏüì²µ­û_øÒ×a ¿uåzÙ¶9“ñGæÀÜŽM1)Ëx‚áï¸6ÕhÿÌL˜QtfÂèBÈÈ5îÆ_‚‡ðõxkàqQ "tå]9϶õñ[QÐøÛ¦"»s±¿…¸¿…™;@7…ŠßÝÅ#VüÞµkW|||NNNó[ðr¹\ 0™Ì'_“Ñüp¥Riiiyûöí¾}û>l|g¬Éhjj²··ÿòË/_|ñEºÇÓÓsÍš5±±±ížóq/íIh›t×w•Þv[ȶz”ñ<[¶…›¢ýµÁ°¦að"G+/#™Œ’ÿÕ4Tkš¯f ³<[vÛÛ"4§ÈW]ÛUZ~³NQÐH("òàŠû[ؘ;ZºwÀOå: îyô0»wï^²dI‹•"‘ˆÉüó·3&!!ÁÕÕÕÖÖvÖ¬Y2™Œî§(jïÞ½...àÝwßݳg“““P(\¾|¹áØÚÚZ¹\.—Ë¥Réºuë|}}¯_¿>fÌkkkçïïß|ß'ZBBÂ!Cär¹^¯OLL”H$ÖÖÖQQQÍO––æææFQÔ'Ÿ|BwþöÛo¶¶¶jµš¢¨””zXJJŠ™™Ydddjj*=ìæÍ›ÅÅÅ“'O¦TVV=KHHÈöíÛ !ÅÅÅEmܸ‘RYYÉ`0òóó÷ÒÒÓÓ‡ fnnîáá‘””ô°ë2ŠiÆ0×~wáÿ3 ¨áY„—Ñ|{«øvì©)}"“û<·Íç¹m>ã?óý±dôÇ£i Bˆãç+×áBçgb Û¾æ–î3i x,–îÜQxÌ8ÜÎ/ã6y¹´T7^ú¤8cw™©Cø Üöèa®]»6`À€¶ÇlܸqïÞ½©©©.\(++[¸p¡á©Ý»w߸qã믿NLLLNNÎÈÈøê«¯>ù䓼¼Íf'''‡††B ™3g?~¼±±‘rôèÑÑ£G‹D®‰6z–‰'ž:uŠ’––fnn~úôiBÈ™3gúöíëîîþ¸—=räȼ¼¼O>ùdñâÅ«W¯~ØuÅâ1®ÉOñž+‹=8}¿ÀX{+.¡Ť(fË”†º›Uü€Þ†kÅriüšó I¾±§ƒ^q2uDÝ¥º‹GÜ]ŠÍf§¥¥ >œ~hø¥uuµH$¢÷Pš5kVBB½Sff¦¿¿¿B¡ …E:ujÔ¨Q:ŽÉd6oÓ;/5ß‚©¦¦fåÊ•GŽ)((¨­­åóùô²ììl???zS)Š¢Þ~ûí 6ܺu«ÿþ„þýûÇÇÇÏš5‹rÿþ}777¥RinnNQÔ¦OŸ®P(rrr]]]÷ìÙÞú25ƒƒÃ®]»&OžììÙ³&LHLL¤J¥ÒÙ³gSEQ”³³³V«5œÚÍÍbii9f̘ƒž9s†Åb………=;‹Åš6mZjjjaaaFFFdddógžeèСZ­6333--máÂ…B¡ðÚµkiii'NlÇ¥mÛ¶-11ÑÝÝ}Þ¼y·oß.((xØu=:+/îÀ—"“ýfý0b…«ãƒÅ „hÕX“=€÷+Û>æy?W‰½³{|FÚš|é/ò¦:­©ã€§ËÔÀã™ø Å˜¹sç®[·.===;;ûµ×^›4iÒ£ßv7”Å...^¹råÀ]\\Ôjupp°OVV½iUUU=žËåzxxÄÇÇ/Y²D­VÇÆÆ&$$\¹r%''gÑ¢E­O1eÊ”+W®ìÝ»—Þ¬‰’’’"•J›7!#GŽäp8ëׯŸ>}z‹v–‰'nÞ¼™Þ®êÙgŸÝ²e˨Q£ÌÌÌÚqi\¹r¥››[PP^¯_´hÑß^W;°Í’1¢ao¹tÈl]ÃÊ‹;`®ý¤/|c~ »É i èlÈdô0b±øÂ… ÖÖÖãÆóööþꫯZ—ÖX±bÅ‹/¾8uêÔaƉÅ⯾úêÑç7”Åöññ)((8pàEQ;vìØ²e‹““Ó+¯¼2oÞ¼ñãÇÓ« Þzë-­Vûé§Ÿ¾û&Mš:uê Aƒ <ØúB¡pìØ±ÎÎΆÒåsæÌ9þ|ó!„ÉdÒu5¦NÚb†‡eüøñ555†L†B¡h¾µÔc]ZRRÒ/¿ü"‘HV¬X‘œœ¼qãÆ¿½.€Þ†#dº}ª^¦®È¬ïâxài…ŠßÝÅ#Vü~:DFF¿÷Þ{¦¤µ®ø Ð{dî­¸°¡PèÂñgå5ÞÊÚ›gꈠC èRõõõ?ýôÓgŸ}fêX ³ô¶s*Èû¥:÷dõõ]¥|3Q"ÉX‘Ã@¾©C€ž»K@—úñÇÇŒ³zõjwwwSÇÈÊ‹;d±cTj¿¾ôu ·Ìý©úØ‚ìûWjLô{6;?_Æá°‚ƒ=ÃÃ}ÃÂ|û÷wf2ñzÛ…»:2m)-UüòËmîxºéuzŠ…Ý2-)•ª´´ßQ¸ ÷øï{RŠ¢†Ä9 ]°k4@·ƒL!­ wëõzÿ¥/P¸à©—÷Suú¶ûµ%M}^´üOGž5ËÔÀŸÉ€Þ«Eá¦À@W:{1h;ŸŸ`ô":>ë`嵤J+˜mÏ6ÇÆ Ý2ÐëäçËè£.\È‘ÉjQ¸ ÔõڛߔßÜ]ffÎ ]éêñ¬ÈÔ2Ð;´(Ü-òFŽôCán0ª¾R}õ‹Éh‘ó3BSÇÈdÀÓ«Eán33Ö3Ï p7@ƒLÈdÀ_UÓ›G5/Ü=}zPp°'J_Àãb2™ÉÉÉ ›O{åÊ•¡C‡¶è2dH‡LÞI/@ïL¹¼ž®ÚÂÝб(ŠŠ‰‰éþÓ4¨ººšn—––FGGvÔäô"ÀS£¦¸ñ~z­ß‚ú̽Tmmã±c×W­:lØ0sss¤¤$BEQ•••jµzùòåb±ØÙÙ9))‰Ëå^¹rE§Ó%&&zyyYXX„„„œ?žž„¢¨”””æÇš–~öرc...ÖÖÖ[¶l!„\¿~}̘1ÖÖÖ<ÏßßÿþýÍÃf2™¢?lذáý÷ßg³Ù­¯®¢¢¢ùÃI“&%$$Ðíòòr6›}÷îÝ„„WWW[[ÛY³fÉd2ÃUVV666¾ñÆööövvvÿþ÷¿;òu€ž¬øRÍÙÿ—biN]™ÚÔ±tSX“Ñ‹´(Ü­Õê\ÂÂ|ãã' âanŽÂÝðØt:}MMCS“¶¾¾©¾¾I­Ö(•*F[S£jlÔ¨T꺺FF+—7hµÚÚÚF•JÝØ¨©©Qiµ:BHm­J«ÕB”ʽ^OQ(ôzÒ¼ÇTÌÍÍØl!„Åbðùº“Ïç²ÙL€Ëá°x<3ss36›iiiÎf3-,Ìx<333–PÈe±ŒárÙ|>—ÅbXZòØlVox·ŽŽv\i IDATŽŠŠ:|øð… ¢¢¢^xáºÆ ÇŽ;qâ—Ë‹‹Óh4„Í›7oÛ¶-%%ÅÛÛûóÏ?Ÿ2eJii)‹ÅJNN %„5-mëÖ­W¯^=wîÜÌ™3ÿùÏFGGGDD$%%ñx¼ãÇÇÆÆFFFš™µü?’••uåÊ•/¿ü²Eÿ¹sç¶lÙrãÆ¬¬,CçÌ™3?úè£õë×BRSSCCC<¸wïÞÔÔT++«¸¸¸… >|Ø0~ýúõ‡>xð X,^´hQ½äÐãõyÑÖÎßâÌùû§f^äkOá·ÇE™öt¶æ…»¯^ͯ«k¤ w‡…ù¢p74§R©•JUm­ª¦F¥T6( µµ*¥RUS£¢µµ*¹¼¾¦æAJ¥©­}0ÊÌìÁ½~33¦PÈc³™.—Íå²-,8,ƒ"pŒ &“"„<ƒ"„…<Š"„‘ÈœžÐÒ’G¡(J(äuÈ%+õ†kolÔBt:½RÙ@wÖ×7©ÕZBˆZ­­¯o¤;kjTjõŸyšÚZ•Z­S*Ôj ËijÒ¶‘ƒa³™B!O(ä …\¡'™ …ŸÏd2 !ÙÙÙ~~~tµí¿_zé¥ÐÐÐ… ÒvïÞ½uëV‘H7uêÔæk5”J¥½½ýõë×ýüüFŽ9oÞ¼>ú(!!!66–’™™éïï¯P(„B!]Ü;888!!aþüù„›7o0 Vü¦(jß¾}3fÌ0u ½ŽN£ÏH)¿²ý¾¸¿Eøûî–nSGÐ`MÆÓÉP¸û·ßr+*jìí-ÃÂ|Þ J_ô*uury½\^_]Mÿ·®ùÃšš†ššF…âAr‚¾kßœ…‡Ïç …\€+p…Bž››PÈåó¹—Ëeóù‹iiÉc±þ²"Éd …\“\òcê¬÷DFWW§R©Ôt¾Çü SDJeݨ©QÈšwj4É ±X :Éaiɳ±áÛÚòmmb±ÐÆÆÂÎN`g'¤;éÜO7±mÛ¶×_ýÓO?ˆˆX´hÑðáÃéþÂÂBOOOºíããC7îÝ»çççG·)ЉD2-ÍÙÙ™B§Ê!r¹<11ñüùó999¾¾¾FÏ¢P(<øÙgŸÑOž<9gΜèèè={öôéÓ§õx¡P8qâăΛ7ïÚµkßÿý+¯¼âååE?K7ŠŠŠúõëG÷”””Ný° ×b°¨óì†òÓ>È?ûûÈ÷Ý="úé ·A&ãéÑ¢p·@À5ªÏÛoODöà)£Ñèd²Z™¬¶²²Æ–hž¢ËëåòºêêúÉ ¡geenee!™‹Dævvú9ŸÏ8B!Î[ðù\‘ˆgXíÀb1,-Í--ûÀººF¥²A©TÒ†$‡LV[UU—]V^®”ÉjéE$„ƒj‘ä‹…¶¶ºag'°±á³Ù̾‡›0aB~~þ7>?22’Ï绸¸äååÑñäååÑ×hìââ’M_oNNNÛ¯$ôNvý-¦¦ô½–T³1Rµ  ×B&£gS©ÔééRºôÅ­[EL&#$Ä+&fXX˜o¿~ÎôÆг¨ÕÚªªÚŠŠÚ²2…LVWQ¡,/¯‘ÉjËËk*+k*+kd²ºæ›Ñi këù +++sº-™‹D†‡ÈLt Ž£ã߬­m¬¨PÊdµ2Y]EEMEE ߺu«X&»C÷þžØÚò,E..ÖŽŽ–ŽŽ–..Ö–ŽŽ–ffüipàÀ‘‘‘+V¬ jž0˜={öúõëûõëÇãñ–/_N¡(꥗^Z³fD"ñööNIIY³fMii)ŸÏOII •H$†ÆcMk40µZìãã“••õá‡BªªªZììtòäɰ°0ÃÃþýû?~}zΜ9ñññÙÙÙÉÉÉl6ûƒ>xõÕWÏ;”–––œœìææÿñÇgff>óÌ3ôZ¾/Ø8 äÿ7^z8æ÷åÎý¦w‹j[ ™Œ–—W±dIJFF¡N÷—Rê.9ùâwß]’J+,,8!!žo¿=1,̧OG£[uÀ#ª©QÝ»Wyï^%« —YV55i!l6ÓÙÙÊÕÕZ"± ÷ss³vuµqs³Æ–Pëܹs[¶l¹qãFVV–¡sæÌ™}ôÉHMM =xðàÞ½{SSS­¬¬âââ.\xøðaÃøõë×>|øàÁƒb±xÑ¢E{Ò/¾øâ?ÿùƒÁøç?ÿ9oÞ¼ðððÖ“oܸ±3>¹èè興ˆ¤¤$wüøñØØØÈÈH333BÈ{ï½÷ÝwßûÆ !Û¶mxs÷ññ1<«T*“““gÏžÝQñ­[U:é‚`,X0wîܸ¸¸ï¾û.::º´´”ÇãuøYº-†©x9ruÔ¨/_–¶‘Æ „˜™±.\¸ÛeQôMMšß/ùþû[¶üúæ›{_|qË Aïûø¬;vãË/ûí·ŠŠª||ì/ŽØµkþ©S+òòþuùòêýûã>þ8êå—Gïïëë€4Fgpqq >yòä?ü`øÕy 3gÎgΜµk×úùù‰ÅâåË—úSRRBCC%I‹V®\¹sçNŠ¢ââ⢢¢ZOÞöÛ˜ü©Õêàà`Ÿ¬¬¬?üRUUÕ¼öÃìٳׯ_߯_?G_EQï¾û®T*ݽ{·@ Ëå„@Àd2Ÿ0˜•N:*z³²²²²ýû÷;99õž¿BÐ>•¿×ÛöÁF»ðT1r{hß¾}]GUW§Q(š._¾qäÈ[¶ì¬®®«ªª“ÉêÊÊ••5ÕÕ E=}{Ž–™YT[ÛÈçsL3@—¡«YäçËîÜ)ÍÎ.-(Ý¿/W«µ„wwº”EDD_??77''juOžžž›6mZ·nÝîÝ»ß|óÍÓ§O7ÖÜÜ|Ò¤I/^Œˆˆ „¬X±¢¶¶vêÔ© ãÆÛ¼ysóÁ+W®”ËåÓ¦MÓét›6múé§Ÿèþ9sæ$''·¾9»téÒ‰'Ö××?÷Üs[¶l±°°h=yÛglcòG´cÇŽ¥K—ÆÇÇ2$!!A¡PL™2¥yÙó„„™L6fÌ‘H´aÆ“'O²Ùì_ý•Ò|5]ÿù ƒéqP餣‚¡…„„äççûí·ØZ ÚP«:2çwßl†¿íÊâa;xJPÍWÐk2ÚÞ" Zkûu«­m¬¬¬©ªª£ÿ<ûl_[[ã›,ôh¥¥ŠììÒì천œ²¼¼ŠÜÜŠ’9!„Éd¸ºZ{zÚy{‹==ÅtÃÁÁÒÔñB7BQTjjê´iÓzÜä-dffTTTØØØ˜<˜E9pàÀ#ާ(ª°°ÐÅÅ…ÒÐÐ`nnN9wî\hh(!D¥Rñx¼ÌÌÌ!C†üòË/-:ûõëGQþùÛ³´=,??ûöí†J'iii¶¶¶E]ºt)88˜Çãµ€ž°•N:/úp½^èС˜˜˜’’’ΨÆa¸Š}ûö͘1£“æ€.pÿJÍ©„{ õì‡û@ S‡Ð°eG§ãó9|>ÇÃÃöï‡ôeeÊììÒììÒ;wüQ*!"‘¹——ØÛ[îçéiçå%–HP‹þ†——Wxx¸i'?qâÄĉFv€Œ_¿~}öïßÿùçŸ_µjU]]ݪU«ž}öÙ‡¥1=˜§FNNÉ +ˆÅâ¼¼<ú6}‹J'-:;0†ððð 6 4H¯×s¹\ÃSÍ+Ð4¯tÁãñ.\¸àêêjÚ`! …‚^ÌñÜsÏ©TªNÍdÀSÀ)H0mOßÓïç_˜=pÃà:RX›=n-ÀßÐéôwï–Ñy‹ìì²;wJ¥Ò µZË`PÞÞö~~ÁÁž11Ãüü<<ì„BîßÏðWRý»³'Ÿ0aBû–¥îÛ·ïõ×_wrrÒëõ¡¡¡_|ñÅ“óÔ@¥“ †2tèИ˜˜Å‹ïÞ½ÛÎÎÎÓÓóÉ_xºq­X>󺵷üÒgÅe7jG­ó0·a›:(€öC&ZªªªËÊ*ÉÎ.½s§äîݲß/­®®#„ØÛ }|FŒð™??ÌÇÇÞÏÏÁÚ딡·ó÷÷§«b@k¨tÒ!ÁBvíÚõꫯ~ôÑGÞÞÞàp8OþÊÀÓ"þÿÛø™ŸJ^ý¢dÄ»P÷ ÀTP'£àu€­¼¼æÆzŸ¨ìì2©´¢¦FÅd2¼¼Ä~~¾¾ö¾¾¾¾žžv¨È Л=nŒŽÒk+˜*Ôɀ¨èÂ… ¦Ž¢wquu6l˜©£€öS)4 e&À:èÁ°& wQ«µ¹¹åÙÙ¥·oß¿s§ô÷ßK ªôz½¥¥yß¾ŽC†¸ÏžÒ¯Ÿ“¯¯ƒ@€}¢Àôzb¥“nLç)+S…<ÏÌ„1@ïtáÂ…™3gš:ŠÞeúôé]ÿkè@\KÜ€¯þ!Óh4l6»¢¢¢ù&¿&AQÔ#†at$EQô¾ @WkjÒüþ{ ½Ø";»ôæÍ²2%!Ä‚ӯŸS` ëèÑý|}íûôq y¦º#zþLõv‰`z§žXé¤[ÓáîÞ-;yòÖ±c×nݺùò*ggd2À4°/B—¡×e˜Vd2˜Lfrr²@ xò©à 544ee•ܾ}ÿÖ­¢ÌÌûwî”ÔÖ6Bœ­úôqˆŠÚ·¯SŸ>ŽÞÞbl¢ººšnXYY:ujàÀ„Ž}Óÿõ×_—-[v÷î]ww÷O?ýÔè/Ù»,šR©ôññùþûïÛHKtA0±±±ÉÉÉtûùçŸ?~üxNݪÒI· ¦9NíZÁ‰G^+*ªb2™Z­–Âá p(t…ÈdPÓ!ót‡…=KEE ·¸u«øöíûyyZ­ŽËe÷íëØ¿¿ó´iA}û:öí‹%ÐN"‘ÈÐæóùÍv” Ì;7..î»ï¾‹ŽŽ.--åñŒÿuí‚`hëׯ///o{L“““³ÿþ±cÇBè²Ï]¬¶¶ñÇoþüsæ©S¿×Õ5™™1›š4„:Aáñð7 §R4^K*þ¶+êg@ÀhÇ1éééÆ 377÷ððHJJ"„PUYY©V«—/_.‹“’’¸\î•+Wt:]bb¢———……EHHÈùóçéI(ŠJII14è-ììì*++éδ´477·¥K—Ž3ÆÚÚšÇãùûûïß¿Ÿò°9 † "—˯_¿ÞúpÚ¡C‡<<œöÅ_üç?ÿ9wî\qqñ¼yó ‡oݺõË/¿Ü³gOzzºJ¥zùå—Ûñt”ÆF͵k))W®<ð Ÿõï¹yÍš#.ä88X¾úêè””EW¯¾úôŠÿ{ö’%£ÇŽíoooiꨡ7jã=—~O/**jý9biiÉd2ËÊÊ’’’œœœ$‰ ƒ!„ìܹóã?~òž0¥RYQQËáp<==Ï;×!u ÊCÆÁt“`šÓëõGŽ\µ¶žºfÍÿV¯>|ùržZ­ÓéŒ$0h õã7ùåöÙ³Ùÿûß½›7 ssËóóeUUu E½N‡ýëº5û@‹©ßõáX‡çü^pNaêpþF{v—’Ëå/¾ø¢L&3l ýõ×_¯ZµjðàÁ„-[¶BvìØñþû‡BÖ®]»|ùr&“I1lHõ°©–-[6bĈ›7oòù|ú°°°ÆÆF¥Rù°9 !ÿú׿6lØpëÖ-kkkBÈ¥K—ZN'K6nÜHG¸mÛ¶Áƒv»þüóÏ?øàƒ:x77·úúzssóv¼PíPQQsýzÁÍ›…7o t[[[ ââ;<0ÐÕÓÓU. »iã=—~OŸ?~ëÏ !!!ùùùß~ûíö–êš`Ο?Õ± Ú ]Ì9 àĉüñ¬Y³òòòX¬Ø´Ë ®‰ ƒÑét¯½öÚ7ß|ãââ²k×®áÇ?ÊQEïßÐð{Ÿ>þ÷îÕ-k߃A-^üMÛc„BEQ"¢(¡Ç`P—Éd\‹aaÁa³Yææf‹Çcs8l.—Íå²9gÆá°ÌÍÍØl&Ÿÿà&“x ÆßÈ܆=i§OúÖû'ßÈ0×~è' ï³Ð]µçûð¶mÛ^ýõO?ý4""bÑ¢E†¯F………žžžtÛÇLJnÜ»wÏÏÏnSõè»H»¹¹.‰i IDATBärybbâùóçsrr|}}ÿvγgÏN˜0!11‘þ&iôpš··7ÝèÓ§!¤¤¤„~(•JgÏž={ölÃÈ¢¢¢Çt …¢>#£èæÍ¢ŒŒ¢[·Š¥Ò N/pû÷wžvìºV«Óë‰!ÁFápþü*Aç,;ú½«} ’ÆFBÑPV¦D‚šÓh4l6»ù¦ÖÝmZŠ¢:ä³GÛQÕá/<<ÇY Ý8§âïÕ–6!“ÝS{þm8p`ddäŠ+‚‚‚š!Ÿ={öúõëûõëÇãñ–/_N¡(꥗^Z³fD"ñööNIIY³fMii)ŸÏOII •H$†!¤ºººÅ»©Z­öññÉÊÊúðà !UUU›“Âårmmmããã—,YríÚ5£‡Ó§X¹råÎ;)ŠŠ‹‹‹ŠŠ2¬èMHHpvv‰Düñ•+W®]»Öî×€RYY{ãFÁõë…t£¬LA±·¸ÌŸ?Âßß% ÀÅÅÅÊÔa<‘6ÞsiF?'B†³xñâÝ»wÛÙÙÑ«š<èÊ`Zlû3hÐ ùÚk¯}úé§AAAÎÎÎOL÷‘””ÄãñŽ?iffFþ(%ròäIº”—Ë‹‹k]×dëÖ­¦ ÆP×$==ÝÃÃãÛo¿5üæ¦ëƒ!„deeýðógÏvrrJII k_ ææ»jÕ û÷§§¤üVX(c³™jµ–tI¹ï®Lˆ Að´b2™ÉÉɾÏa'Mûäºm`ÐmÙö1Ÿ~ …½ »jO&#))é7ÞØ¾}»³³srr² ÝŸ “ÉÆŒ#‰6lØpòäI6›ýÎ;ï466Ξ=»²²ÒßßÿøñãtÊaΜ9ÉÉɉÄÐ ,..¦K\ÐvìØ±téÒøøø!C†$$$(Š)S¦Ü¼yÓèœo½õVrrò§Ÿ~jôpz}ýÒ¥K'NœX__ÿÜsÏmÙ²Åpì»ï¾ÛÐÐ0uêT¹\zðàÁv¼DÐËÕÔ¨nÞ,ºq£àúõ‚ë× ŠŠª !ŽŽ¢\çÎàà*ãKMLrròâÅ‹·mÛöÿÙ»ï¸&î÷àÏ ÈPQDpá¬-ÎÖYwiÕVPë¨ÔÕ¯ ®EµŽVqü€EE+" €‚¬0³s¿?Φ”%;Œçýâåë¸\>÷\p¹ç>Ï3hРS§NQ73˜ö ûš´l0PVVVTT”ŸŸäëëÛü`ôô4–.u[²dÔýûéaa÷.^|,IŒVÏd´L`‚uMAÔÕ§³Û|í60Ôža!ÔžUgˆGFFz{{W]Ód)))666ùùù²yž@DTTÔ”)S09S——œ>}º±Oüd­Œ7oÞ}šŸ!K]hk³ú÷7ž>ÝÉÖÖÐÖÖPOO]Þa"Ôò®\¹2~üøšë×®]K}¢®K£ÎÌÍÍ]]]1˜&Ó±`_“ÆÌÌL €H$&“Ùü`ªRWgÌšåܲc¢ºt”$ee<©´¾Ëʘ AmÏÇÇÇËËëܹswïÞõòòrww§Öoß¾½fi¾½{÷…††ZXX8pÀÃÃ#77WQQ1$$„z›•-4jXÊþýû“’’bcc½½½çÍ›WOñÀjbcc÷íÛ—œœ\u6§··÷Ö­[©³‹¨¨(ª˜Ä©S§¢¢¢455-Z4wîÜsçÎɶ߼yó¹sçΜ9£««;þüB¡¶Ñ’g~Ë—/×××'IÒÙÙùðáÃ-88BÉ]vvqRRæ£Go“’Þ<}šÍç‹””­­ &LèׯŸ¡¡……ž‚!ï0j]ãÆkÚ4ÄF'Pµz0˜&Ó±`_“ÆÃÃã—_~éÓ§ÏîÝ»ííí9NóƒA &H0AÒp¹ÜîÝ»wïÞ}òäÉ………²Ž'Nœ¨YšïСCëׯ§nظq£ŸŸUÜOV I¶Ð¨a) .ÔÕÕõôô‹Åeeeõ¤ðx¼°°°ýû÷³ÙìE‹…„„T=.ùóç¿|ù²wïÞ³gÏÞºuëºuë {öì±¶¶.--UWÿx[UXXØúõë©N{öìéׯ_˾Ψӻ¿+›mʰœ„]âBrÖ’§hÖÖÖ7nÜhÁBH¾ÊÊøÉÉYIIo’’Þ<~üæÃ‡2ÂÜ\×ÞÞxÊ”vv†}úèÓé4y‡‰PÇЮÎ0˜vûš´x0kÖ¬yò䉕••½½}xxx‹ƒPC`‚$íJPPÐòåËýõ×#FÌŸ?È!Ôú¬¬,333jYV|/33³wïÞÔ2AUÿÄ4gX •Þ–ÍÛãr¹²âÕÆŽŽž1c†Oxx¸¥¥eÍÔÕÕÇæÌ™Ù³g?zôèÏ?ÿüæ›oÌÍÍ©G©…ììl+++jÍû÷ïe{©¹;„>:³åm~JåU†4%¼u!$7x.…BÿâóEOždU«Eµ»X²ÄÍÁÁS!ÔXŸœªâîî.+Ͳ"]²'*++@JJ AÔ%¡ºvQO1¥Ö ÆÉÉéÉ“'5”K0ªªªçÏŸoT0µgm“ ))©¬§¿&H:¢qãÆ½yó&99ùܹsÇÏÈÈ Ö×ZšO__?##ƒš¸\.WMMÊ‘7gX 5aN¦žâÀáp¢££MLLôôô455kÆàíí½}ûv‹åééÉb±8Nzz:µëôôtêpª˜ššJZ§œÜ‰ZK tú¨Þþ)³èÏm›™ª]Þ1!„º(<éAuuyy%IIo>Ì|ôèÍ“'Ù%%Eww;{{ãþý±åBµ€vÕJƒAa‚¤æ6l6“Á 3J#Abggçéé¹zõêVMÔZšoΜ96l055µ°° ݰaCnn.‹Å’•æ“-4jØZ«¿x`ß¾}/]º”žž¾ÿ~›±cÇ.^¼˜*Z%ãîîþõ×_ïÛ·ïàÁƒ0kÖ¬M›6YZZjhh,]ºtâĉUç”̘1cãÆ½{÷ÖÕÕ¥£`ÕAÔp¦nl¶©åU¿×Ìú{Ì.s«è†BÕÎNB¨Qø|QBBF||ú“'Ù¿ÍÏ/£Ñúö54ÈÔÇg°­­¡…….¦ ï0êjý|Þ"]—;z05‰Åb:žŸŸ¯­­MDû ¬-µ«V" B¨•`‚¤ý$H‚ƒƒW¬XqðàAƒY®·ÖÒ|«V­¾¾¾ÖÖÖ—.]b±XP¥4Ÿl¡QÃÖØ'‹€™™ÙÎ;7mÚöí·ßÞºu«ê£***'N¼wïÞˆ#`õêÕååå“&MâñxcƌٻwoÕ׬YÃår§L™"•JwîÜyõêUj=VD¢iΘü»å̀̋_¿tYkÜs¢–¼#Bu9DÕOM‘‘‘ÞÞÞMûÕ•áë†PûWTTñðaæÃ‡™ ÉÉY••BKÙÎÎxà@{{c{{c--UyLjPÇÃår©ªß²ÔUŠ¡i¤RéÒ¥KOž<ÉápŽ;&+EÝöÁ$&&4¨Úš4ðé$I†……yyy)++wÐL†——œ>}ZÞ ÖEDDDÄ´iÓäB¨u•— $IY™@"‘––òH’,)ù÷ßÒR¾D"-/ç‹ÅÒòrX,©¨…bOT5}Âã …Bqe¥P(”TV D"I={$B]I£jj MÅbÐé **ÊJJ4e%%E&S–¡3Š**Jtº¢ªª²¢¢‹Å þ¥Ñuuæ_ýµxñ¬ù ž’’bcc“ŸŸ_Ïœ¶ö3lË""**jÊ”)ŸÜÏŒTB>Ø•ÃçŠGl1‘w,¡.§–""##Û>ùâó%©©% ɤ1™ŠL&ÁP¤ÑÚÅèÞ½{­B¨ „BñãÇo«v¼ ÓivvF¶¶†³gup0ÕÓké;åêzªõ[®§7f“íÞ½ûÁƒ?ÿú믫ݮؖÁôïß¿¸¸˜ZÎÍÍõññ±µµmøÓ ‚˜>}zˆ„B5‹¥ ­R"¦i3HJJx|~i­ÛÔ6ƒ¤éS¨UšOîö¬:ˆš@F8}Ï!¥òŽ!Ô%Õ’Éðöönû8äNUµ¿ºº+À¿Ù ’”¤P*¤P*åý³, Ö…ïD¢r !TSE… )éM||FRRæÃ‡™¥¥|55†Ñ—_:ÚÛ`Âfc5O„äãñãÇß}÷]RRÇ377_·nuÇ7A·nÝš1cÆÚµkSSSCBBètúO?ý´dÉ’ØØØFFF®ZµÊØØ8 @¾ÁȲ#~~~ëׯ¯«d5Ô… -ZTYY¹qãÆ%K–P+©êRÕ6ær¹,KQk~"„ê$Z¼ÄVY_*•––ò¥R²´”wõêÕï¾kú•ÔF•æ“û°­«¢&#°3BHþó™yÚ´i]y"ù$-]&•’ÔU‚ SAI=J£)P³4$H$×®}×·¯<ÃE@~~YBBƃéññé))9 ia¡kooðù€&½zuWPhèü*„Pëñññ1bDpp0“ɼtéÒÌ™3===•””àÇüý÷ߣ££/^¼xåʃ±hÑ"±XL=ñÅ‹ýõ—¯¯¯¾¾~hh¨‹‹‹ƒ‘…”˜˜xôèÑú÷²ÿþ¤¤¤ØØXooïyóæ)++×µåýû÷.\8oÞ¼yóæéêê6ÿ»lŽ‚B]„šªÌ yñ‚՜Ѭ­­oܸÑaµÉ°!„¢àÝÿòô´74ìöå—y<¡X\ýþ‰D*‘ÐhÄÀ&˜Æ@H^¤RòÙ³ìøø ªkw^^©º:cð`ó‰ûýô“§µ5GEEIÞ1"„ª{ðà‹Å¢ZV¸¸¸‚ÒÒRjvÂÊ•+‡úÕW_ØÛÛÀ¾}ûd…›ÊÊÊŠŠŠòó󃂂|}}ÓÓÓ›?w¡ÉÁP¶mÛ¶téÒOîeáÂ…ºººžžžb±¸¬¬¬žLƸqãîܹsðàÁŒ1bÉ’%Í<Æ–'*c*Šyâöuê(«÷U­9JKßÌæ(4-$$¤ãA!„B¡.«}}•»Œ/\X>mZ—[YW³2’„¹s±”$BmJ ÇǧÇǧÇÇg22rÁ‚t:=>>¾‡ÓŠH1äÝ‚Üë{Š 7¶½üÚBÞ1ý6GA!„j¸™ü¬¸R_œ^ŒjExí¯ºÞ½»ÿùçJ}}6N«u6[uüøF|ˆE5 —[yñâ sãÆíêÙsµ·÷‹“»mÙ2åÞ=ÿ§O7:4kî\W[[CLc Ôþ¹ºº¦§§oß¾=333::ºêCÔµþ=zdddPk^¿~-{ÔÌÌL €H$&“)Ç`àüùóNNNêêêŸÜK­…ê÷òåË»wï–––º¹¹5ö¹­"qüßhx}Ô,Àáðýœ<<œÚxÆŒ!!!MN49ˆ‰‰ùâ‹/ªŽÖÌ`௿þº|ùòÎ;›k£]Ë—Ëõ÷÷wuuÕ×ן?~Õ‡ØeÚ´iŸÜK𣤥¥=zÁ‚˜É@¡ŽëìÙ³&&&l6{êÔ©>|‹Åþþþ†††ÚÚÚ_~ùeaa!Ôº²¦.[~0!!ÁÉÉIEEÅÄÄ$88þ)¸$‰j–„ÚŠ:ÖUI²~Aœ:uŠÃᨩ©ýðÃáááúúúêêêÔ¬ÜZj`ÅŠzzz:::{öì©:TAAuIGG‡ª.UPP@’d`` ©©©–––——Wýƒttl†ÇÉÞ,=ú…¯^¾K,“w8¡Î3õ¡Ñvìðž3g(õ§H,–Ìž=X,åéÓnÜXõÇKML´×®=co¿~ÕªÈW¯òä2Bí”X,}ø0sß¾3f¶µ ðö>pâDœªª²Ÿß¸?ÿ\™œ¼›^ Ô9\¹r…¨¿¿ýOìÛ·ïªU«ÊÊÊrssFŽÙ­[·º6677wuuíXÁ´ âr¸1¢ºÁIPÆ>0:¦À ýòެÕas„B­çðáÃ.\ˆÍÉÉ™={öŽ;N:u÷îݼ¼¼¹sç@­+kºÿ¾……Å–-[>|øÐ¶Ñ,bž4?¥âïsw·eÝ\›Ù„|||† –žž¾k×® äå}¼º²}ûvªüãµk×BBBª¦y¨¢ŽÁÁÁ+W®>>>={öLJJÊÌÌ\¹råÌ™3…ÂÝr–œœ|âĉÀÀÀ§OŸ?~|×®]éééµþÔ6oÞ|îܹ3gÎÄÅÅ={¶Úh$I@~~>µ@ÅyôèÑððð„„>Ÿ¿páÂOÒ¡14ÇïïÉqR¿æ—.(•È;„P§‚Õ¥>AAؼy²®®ú/¿üe` éêÚ«ê£ffyy¥QQ ÇŽÅþþû}gçžÓ§;M˜`K£áÕXÔÕ‰ÅÒ'O²îÝK»{7->>£¢BÀáh:9Y¬[çáà`faeÁê„Æ'ûØÖ(Ë—/×××'IÒÙÙùðáÃõlœ––Öá‚iYÐÍ,Bw7P®37Ó)as„B­gÇŽTY   {{û„„„;w<öìÙcmm]ZZzìØ±uëÖU[Y3MÞ1Ê’Pš#(zÅ£¾ò_TVä Ih)…šÒR”ËåvïÞ½{÷î“'O.,,”uÈ8qâD]å«u¬§’dýüüüºuë6iÒ$Xµj•l¹¨¨¨ÖŸZXXØúõë‡J­ìׯ_ýã8pà§Ÿ~¢fß:tÈÈȨ²²²±ƒt,4%bÔϦEiÝé‹/µ´TÛ>Z„äH Çǧ߹““úüyŽX,µµ54ÈÔÇg°££¹ŽN‡é؆jcÖÖÖ7nÜwµ«`š¢8T@I³–‡ì~ióhÚlŽ‚B¨õXXXP –––PPP`nnN­¡²³³³²²j®´²²ª9U~pýúõ‘‘‘ , Óéñññmpõ K,¡ÎóÓù…©¼O+JÞò% ©„„î‘JH:¡eQg Ðz-_¾ü×_1bÄüùó‡ B­¯§ücµ¢Ž\.7000...--­jIÒOb±X²qª.S{¯ùS{ÿþ½lü†ì(##Ã×××××W¶¦ ƒt<hõlÊÿ„ªf2ê³Ï>‘!§Óiîîvîîv¯^åýöÛÝ_½º}û•±c­çÎu4¨étjÿ„Bñƒéwî¤ÆÇ§?}šÍ狌»¹¸ôZ¼xäàÁ溺˜½@¡Ö'*…Ükðî ¼¿ •9àx ÌæÈ;¦¶óÉÉ7îîîîîî²oÇ_í‰Ts”   HII©Ö¥æ€µ6G©¹\s2iÒ$ê~O„B@ZZ‡Ã€—/_¡««›žžîìì ééé ¯¯Ïápj®¬gLYùAooï¶8†ºå§T:¼›¡*ÔŽ ÌR RÉ¿Ѥ⥠aÚ”Y†ãÆ{óæMrrò¹sç†.+ùH•¤^·jå«Ýiêêêêèè¸}ûöþýû“$É`´@»éZj'55•šNѹ¹úúú;wîôðð’$KJJØlvcA!˜Éh ={êmÚ4iÕªñçÏ? ¾ãá±ÇÖÖpút§)S0™JòŽ¡–Q5{ñìY'44Ô6¬÷ܹ®¦zzò!„º†ò x ï¯@~$è8AÏÅ ?4íä™|\¹rE–¥¨jíÚµ›7o®ç‰}ûöýì³Ï***:Us„B­oÍš5GŽ!bÑ¢E^^^66ø‘×B IDAT6›6m²´´ÔÐÐXºtéĉÙlö¬Y³j®¬9T;,?¨ÓWå.'X¿Ôv ù¹ äÝÈ¥RÓ´));;;OOÏÕ«W8°j¢žòÕ|²’dÔúS›1cÆÆ{÷î­««K…T¿™3gúûû°Ùì_~ù%11ñÑ£G!„`&£õ¨©1¦OwòõuŒ}zïÇ£6o¾èå5hÞ>=>>#11“ÇhŽa9}º“ƒƒ™±1þÇF¡6W”é'€ã}ׂŽ3кú,~lŽ‚B¨í-[¶lüøñ•••&LØ·oŸªªjyyù¤I“x<Þ˜1cöîÝ «W¯®¹²¦öY~2G=yWøÚÔ …ñ{߉*ÅÒº3×üÒÕ8Êšf M3¦GIÓ”É6eŸj$¼bÅŠƒ„„„Èî'¨§üc5Ÿ¬$ÙµþÔÖ¬YÃår§L™"•JwîÜyõêÕúùá‡x<Þ¤I“¸\®³³ó™3gš0H§Á+1µjÿ "„Ð'Mû°‡+/¯$4ôÞ‰qÅÅØu "‘äþý×U³Ý»k ÚÓÁÁÌÅ¥f/BHÎH  µßœØ²¼¼¼àôéÓm°/$GADDDL›6MÞ „P"##½½½ñjF›©z ª”>Ìtä½D,­™Ï 3ì¾î^œÎçfð¹™|1O ÊêŠCVq,Æk53Œ””›üüüzæM¢ö,ýZqÌ–·£·›éÂÔ¡¦À9mDOOÃÏoÜÒ¥nÑÑϨ®à&&Ú¾¾Ž_~騩‰]ÁQûR5{ñðafe¥PSSuèО?ýä‰Ù „jS>|¸ 9— (ÆÜ­%cAÐäB!„º(ºŠB¿Ùz½=»=ù-ïIè‚øO· Ms¦Ýœî¿!¡|{Ö¬`33/¾<}º“††Š¼£CÒ“'YT娤¤7‚=Ø£FõY¼xäàÁ溺8÷!„Ú\I ä\„ì Pø8àrVÞ5Îýû÷½½½åBuN±±±ûöíKNN~ñâ…l¥··÷Ö­[©LFTT”³³ó™3gN:¥©©¹hÑ¢¹sçž;wN¶ýæÍ›Ï;wæÌ]]Ýùóçr§‡¾pá‚‚‚¼yófÏžíêêZsð;vÔ³G™û÷ï/\¸pÞ¼yóæÍÓÕÕmWD*‚ü8xÞ]îPdA÷Q ®l‘QëPP$jíÚÝ‚¬¿ü÷¿–°BRòFPò–_ž+¬5!•׸lSe c†"óíŽ^?Õ1»ÌåB¨#!:}C¡Ž‹ê •H£)Lšd?gÎÐ>}ôåêrsK®_“úàÁëÊÔÕÆYRó~Œk¹y !„Pë"Åð!æc£ü50ºÇ Ü¡»ИŸ~:B¡NÇã………íß¿ŸÍf/Z´hÒ¤Itú¿­KKKõôô?~Ü»wïaÆ͞={ëÖ­þþþ3g΀””kkë’’uuujN†ƒƒƒ¿¿ÿW_}Ož<éׯ_ý¿oÞ¼9|øpxô葽½½¶¶öÎ;« >pàÀºöX­ã÷Û·o<2bĈ%K–8884ýuIÝÉ?‚¨4¬@<ôº. ð±ŽPdd¤··7^Íh3^^^púôiyÒ8eï„g}^+$„°z(±Mš¦L Se- ¦®µª¼£C!Ôh˜Éhï Ê#"üöÛݬ¬"[[ï¿vñô´Ç>̨šòrÁÍ›/ªµ¾puíåâÒ«o_ o?A!ùÃÙîÐm¸ƒÁDÐè+ï€BµÑÑÑ3fÌðññùæ›o,--kÝfòäÉœ={¶¥¥å»wïttt®_¿îìì |>ŸÉd¦¤¤XYYQ™ CCÃk×® :Töhý™Œ¬¬,‡<OEEbcc« >`À€ºöX-“A‘‘‘»ví¢ÓéñññM|iòã äôªÆ5¤2S§Nmâ਑îß¿ïèèØá2a™¤4[Püš_œÁ+˧ó”Ô??ÖKÞq!„j4¬.ÕÞik³/µhÑȸ¸WÁÁwV¬߲増—Ü9CõõÙòŽÉYZÚ‡[·þ¾sçå½{¯+*&&Ú®®½‡í9thOMM¼Ç!„Ú%MðÈfyÇB¨Ýáp8ÑÑÑ&&&zzzššš5·ñööÞ¾};‹Åòôôd±X'==Ê+¤§§€¾¾~ÕSSS©LFZZÚ'HKK£2/_¾$BWW·æàõﱦ—/_Þ½{·´´ôÓ ¹Ï " &ÖòŽ3è8×õ*Ú}þ-Ù-Ö~GoN|YÜÖ·lSÕQ\ÓŒ¡aÂPRÅIB¨½À9LFFþï¿? »WVÆ9²Ïܹ®C‡öÄ®à]Ji)?66õÖ­¿oÝú;;»XKKuèÐ^Ôô CC-yG‡B]÷d#/а’w(!„:˜ôôôýû÷GDDŒ;vñâÅöööU­¬¬ÔÕÕÕ××?xðàÈ‘#7oÞüÛo¿………ihh,Z´HEEåâÅ‹ðOÇï   cÇŽ………éêê.Y²äêÕ«ÔœŒÐÐPgggSSÓª#1xðà#GŽ1oÞ<###›šƒ×³Çªs2ÁéÓ§8  —,Yâã㣬¬\ËÑŠÊ ÷úÇî•YÀ¶† O[é…E¨QJÞð_ýYÄ}Ãç¦óK²R ªztËÉÚösñ–”6Â/¥òôa_O„P-0“Ñ! â :tëùówææº³f9ñÅ`UÕÚNQ§ Iîß}çNêµk)©©¹JJŠÃ†õ=º/¶¾@!9+J„·g ë,”¥‚Š :Xû¥!„ЧTVV†……………ݺu«ÚC>>>÷îÝËÌÌ$B$„††òx¼1cÆìÝ»—*Ee2ÔÕÕ׬Yóûï¿K¥Rªã•É "$$dúôéU‡%",,lÕªU•••&LØ·oŸªªjÍÁëÙcÕLƹs碢¢–.]êèèXËá‘Rø{'¼» ù±@JAÛñc÷ ­þxgjw¤²,[PœÎçfòÙ& “µ”Ä(JãU䉨& V%+:·'!y ûÞ¹õšˆ×:BÕa&£c{ò$+8øÎùó º‡Gÿ¯¾r±´Ä;:¬¬¢èèg×®¥<|˜YY)ìÙSoÌkW×^š0™JòŽ!„º°Ò—v²ÎBÅ`™‚á0œ Ý~ŠE!Ô.5eÊyñn búã¡ûhPª¥ŽBKÂþwå€"CAØÁ6UÖ4c²zýTUtèòŽ®K<ðîÑÑÜÁË lgèÉ;„Pû‚™ŒÎ ?¿,22þĉ¸œœâAƒLçÎu?ÞVQ/¦tHeeü[·þ–õîf±”GŒèãâÒ §_ „P;’w žøƒ‘¸ËLÞÑ „BŸ`aaqïÞ=Vß)©hÌVßBí€DH–f Š3xůùÜt~iŽ ø5ßyµaoOüðÞ,O~Ë{°'gÀüöóñn]„п0“ÑyH¥äσƒïÄÆ¾ÒÕU›:uÐ×_»tï®!ï¸Ð§‘$ùôivLLêÕ«)½‘HHŽ‹K/W×^fÊÊŠò!„B!„êVú²/@îuȃ~[Àr¥¼BH>Ä<) È¨åÖÒ»Û³J2l3†¦)CÄ¡iÆ`°ñÃ~Ò®Ý^ÿ¦·g7çÕF8í!DÁLF'”žžþ 4ô^e¥`Ü8›éÓ\\zÉ;(T .·òÚµ”ëן߿ÿ:?¿L]9lXo77«aÃ,uu±½BÉ?²/À»Ëà4†¼£A!„ÚR ùw?öî.NEÐúãÁÀT åBíÎß¼O(çfò¹™|1_ ¶"Û”1ôG#M3<Û¬Åëèâ[ë2-'k;¯Æ·„f2:±òrÁ$?óâÅ{kkƒ™3'O ¢‚Íäïï¿ßÿßÿ½¸yóE||†H$17×9²Ïˆ–ŽŽæ ÓD!¹*Ï€¬(Èú ï=ÆÁ€= b ï°B¡ö'ë ÄLuKÐúãA×”åB eï…ÜL~q:¯$S0`Q•nµ\ xÿ°ŒÙ®ÎQVP$Ú>ÆvâmlIù{¡•WëWÆCu˜ÉèüâãÓ¹rå)“IÿüóþsçºöêÕ]ÞAu9|¾(.îÕõëÏoÜxž]¬ªªìâÒkøpË#, µäB!€7áð÷¯P˜ÊÝÀÀ8žÐc –ùF!„ê$®~°LåBÓÉáÉÂ2‰‚"¡n¨¬iÆ`›0Øf ¶ £[/&¡Ðus¡® 3]E^^iTT±c±yy%ÎÎ=§Ow®àM–ö!&æåœ9. ÜþÉ“,ªûERÒ©”´±áŒm5zt_kkŽžy „P»òê ƃ±7tÖ,F!„JžÃ»Ë .Q@Ðä B]‹TLVä ‹^ó¹éüât^q:Ÿ›É—ŠÉ9qv 4¼ž€êŠ0“ѵˆD’+Wž††Þ‹‰IíÞ]Ã××qÎ--UyÇÕ1DDįYsZM™œüAÔyÞ Šoß~yíZJLLê›7…êêŒaÃ,ÝܬFŒè£­ÍjË€B!„B¨qÄå{ãc÷‹Š7ÀÐ…caÀnPÒ”wduuRYö^¨aTK7a¹äê·élSe¶)CÓ”Á6a¨êauq„Pgƒ™Œ.*-íÃÉ“qáá÷Åb騱Ös纄“‚ëTVÆÿK—’©ß—èh?NµmÞ¿çþùç“k×R3y<¡­­¡‹K¯Ñ£­ìíMpî Bµ •Yð6 J_‚ÃAy‡‚BµK ‹àõq ÅÐÍác÷ M{ ðã Bí]e¡(1è7ÏÍä J%@W¡±M•{ôW¼ÒîÝ»·k×.y‡‰Z‹““Ó·ß~+ï(ju˜ÉèÒÊÊøçÏ?:zôÎË—¹¶¶†Ó§;M™2€ÉļýÜ¿ÿzþü“%%•"‘””/ùý÷ã@*%3®]{~íZJjj®²²¢«kïÑ£ûººö22ê&ïÀBÀ? Œ·§¡à>(iÇÁúQ!„P-ÞF)îc@?Î ÔQUЏé|î~ñk¾’ mÐR}ˆŒŒôööž:uª¼£C-ïþýûŽŽŽ§OŸ–w µ:Ìd I26öUhè½Ë—Ÿ¨¨({y š7Ï/Ä€H$Ù¶íòÿRé¿¿)ææºË–¹]¿þ<.îUQQ…æ¸q6cÆô4È”Á Ë/^„Bÿ•vÒƒ‚{ ¤Ÿƒ‘ô µÌÇG!„º R÷ @{ˆ¼CAµ*“×;%///ÀLê ð†DA¸¸ôrqé•—Wzïĉ¸ãÇc¨®à&ØÒh]t*ñÛ·… œ|ö,§jƒòúõ‡•+Ãmm çÌ:j”•­­!¶ïF¡ö¨ø1¨™Cß0B¨«ãçÁ»Ëðþ ¼¿ Âb0›™ „Bu,˜É@ÿÒÓÓðó·lÙhª+ø‚'ML´}}¿üÒQS³ku¿pᑟß)@"‘Hk>J£)¬Z5aéÒQmB¡Ft@Þ „Br%(„¿…÷—¡è(2Aw8ØnýñÀ2—wd!„Bƒ™ TNsw·sw·{ú4;$äî®]W·o¿òùçvóç·¶6wt­ŽÇ~ÿ}äÙ³ ¢ÎÚk$IÆÄ¼ÄLBÉŸ ÞD)ÞËä B!Ôþ(Ð!ûèîý~]W 1åB!„Pa&ÕÉÆ†³mÛ´ï¾v/$äî™3{Îží „P£`&!„B팰… Ö³–‡0!?»víŠŠŠ’w¨-DDDày„Ú/ËÐÇ”[þ&e„:qâÄëׯÓÒҨ삎ŽÎþýû·lÙ¢¨Ø2×Y,›Í6›°cÇŽ·oßöéÓ§EoB$l6û›o¾ÉËËÛ°aC{Ëd´Þ”„:.¼w!„B탄o#áŽ'œíIßÊ;T‹©S§’¨³“÷ÿ2„º=~üø®]»ÒÓÓ© FŒ¡©©©©©iff¶k×®ÿýï4ÍÇǧgÏžIII™™™+W®œ9s¦PøïéÆ/]ºtíÚ56›½ÿþ£G†‡‡'$$ðùü… Ê6ûñÇÿý÷ÈæŸ:ujêÔ©t:=$$ÄÙÙd Õ@NNN­‡¶wïÞ   ãÇ¿zõjôèÑb±¸ž×§ž¡žø÷ïߟ””¼råJ@@Ý\‚s2ªNÎ7}¡VòŽ¢3‹ˆˆÀß#„j: Ÿ­õÐúôéL­”J¥ÅÅÅR©”ü'Ó Ps=/B=ñŸ;wN¶¥l(ÙøõótÔuàœ „BÉ‚2Øm÷—06,W³‡¼B!„šDP·?‡_Çàç6≄M×?`j!Œú?°ZšýˆV ¡ŽŠ ˆéÓ§·Hßéúñù|33³¶¥&”´*}}ýÔÔTÙ·ÅÅÅ999Õ¶ÉÊÊ277§–©…ììlê[‹ Õ–kRSSÛ´iÓ»wïRSS¹\®¿¿¿«««¾¾þüùó«n3nܸÀÀ@êÛŒŒ ___‚ ‚000H$²]€†††››Û™3gîܹ£¨¨èââÒ£ÎÊʃZ-33³wïÞÔJ‚ Øl6Uú©.õ¼õÄo``PÏË…¢àoª®'l¶Ò°õÏí'!„þeâ j½äBµµŽ~Ö]mËšøÜN"ë\°€÷WàÝåêˆ+áÝe({UûÓ{/wPdµnu4 NNN***&&&ÁÁÁðÏç}‘Häçç§««k``Ì`0¨7œšÍ>Ù€¡¦ªý êiAue8tèPÍHÈÚz!t”¶ŸþyPP53ØlöÇ«mÃápdÕ¢¨}}ý&싪ÑÄb±\]]ÓÓÓ·oßž™™]u›Ó§O8pàìÙ³·oߦvôÇP·fSÓ#zõúø9B–˜6mZTTTDD„Oý)™ˆˆˆþýûkjjÖzhúúú²¹\®ìõ!Iª$r>©žø*B]f2Pu4-$$DMM­C Û¤¤ä<þNÞQ „P›#¥ðþ*Üõ…g›ä Bµ#鬻øpóæMj¹ÿþmƒÜˆÊàîtˆ™ âRŠHø7“Qö ^î›ãáŒ6ÜšÙçå)BŽÏ°aÃÒÓÓwíÚµ`Á‚¼¼}š ˆC‡-[¶líÚµ ð÷÷/))ñððxñâ…ìYß}÷]HHȯ¿þúÃ?ðx¼I“&q¹\ggç3gÎÔÜ…ººúèÑ£_¿~-k]>cÆŒSSSÙ‚,…ž={?~ÜÝݽ®C[µj•@ ðõõ-((°¶¶¾téU3jÏž=ßÿýš5kvïÞ}ðàÁ†~Câ—quuµµµÍÉÉÑÒÒjÈàu òiÏÚ 4 ÷`||¼££#“É466>räùÏB¡ðÛo¿ÕÑÑÑ××?r䈲²rBB‚D"Ùºu«™™™ŠŠÊàÁƒccce; ©ºÐ¨a©G/\¸``` ©©¹wï^’$=z4jÔ(MMMƒÑ·o_Ù@½½¹àСCÆÆÆS¦LÉËË«kœjJ¥Ò­[·š˜˜hjjN:µ   !¯p]]³?~»yóÅþý×õè±ÂÐЯGÎÊ“'ãjn‰BD@¾:HF;‘a@žíA&}OrŸÉ;&ÔšÖKP$AƒÛÊeØúÏ+òôšš3 Ü5äìÕԥκ?|øPÏëðÉÿÿpëÖ-CCÃàààš§ß²ß£šýN«®¤F8zôhÍÃi=ÿ9ó—ÈG«ÉßÈßidÔòuÑ’|ü#™w‹”[5*„:±S§NéééÍš5‹jCM½0 Ù»"uw¼ìý->>žZOm™™™¹fÍ—=z 6¬êÛHýW¨Íjî(%%…Ú€j ^k$L&³Ú‰ÁË—/Éÿ¾¡µ½vüî<<<¶lÙ"ï(ÚvüF]V—B›°¹wïÞ   ãÇ¿zõjôèÑÔúggçª r™J9|øð… bccsrrfÏž]×8Õ"\·n]Í "K¯]KY¶,ÌÒò‡ñãw9r;7·Äb A§ãoB¨ P Cj°m`t xfCÿm ÑWÞ1!¹é(õs«•ø¯YºV]º¨j¤NpÖëãããêêÚÌ—‚ªÊRTTÔä,Ô_|ñEÍÃifl Rú®8À‹@J”Ô²‚{C¿- ; èmBѸqãÞ¼ysúôé=z >\ÖzºG²A¯_¿®ú”jÍêiÀÐõ4„ º2ÔI=½Pk«¬¬|ðàÁÕ«W}}}å B¨åau)Ô¸ ›‡Z¿~=õéeãÆ~~~Ô##ÃÐаæ8Õ"tttlê P…k×R.\xtõjJY_IIQ(õ¯ŒTJR1 „PgGÀø$ ðtœú9ýû÷—U"ÎÍÍõññ©zŠR®[T5^Ç=ëæñxaaaû÷ïg³Ù‹- iæKAUeY°`A“ °P#Ôz8ÊÊÊÍ ¯ðr7ûì³yóæ@]ïK‡Ú·oŸ¾¾þ7ß|3{öì±cÇzxx4<€Õ«WOžy[¥©©Ž••æåËo55m…B1®(Õ™ÆJ!55÷ýûH¤åå|j½@ æñ>~ª¬4?'¡®Î  ÐÐøX SQ‘¦ªúñö4ƒ®¬üñw_UU™N§€²²"ƒAMÅúøih0©Ÿ‰ŠÊÇÍ””™Ì›©©}ÜLM¡ @TÝLYùãf¡ ®ÞÐB¨Ã(N†WAð6 t]Áõœ¼£Aí‹——×¹sçîÞ½ëååEµO„*…n Æ¢E‹ªÖÏ µ°°8pà€‡‡Gnn®¢¢b­õs>,…*8ëíí=oÞ<Ÿ#F3™ÌK—.Íœ9ÓÓÓSII©Zü/^¼HLL¤ŠïW»oß¾äääªý'›€*‰sïÞ=ª¨ŽŽŽÎŠ+.\xúôi’$2'ƒaÀ€_ýuµclÕ[ÑQóuгn‡ãààmbb¢§§§©©Ùü—‚Ê:èëëïܹó“§ßT½©jIŽªy‹ºr<-LÂë%ýë%  ãÂ"qAXâ €ÿöË!€  Bîu0šÖ±!ÔI5êéÓ§U×ÿtÓ €””*ZõQÙ²»»»ìœÆ_mœZÉ¥Óéum ¬¬\3:¾uëÖ­[·V{ÖíÛ·pÐ-#ÿyeþ³ŠÊBQEž¨²@TñATVŒsBf2Pã&lΙ3gÆ ¦¦¦¡¡¡6lÈÍÍe±X¡¡¡ÎÎΦ¦¦²9Î]³fÍ‘#G‚X´h‘——WLLL­ãT‹pþüùuÍ­‹‚Ñ«———wéöí—‘‘ ÑÑOIH’”Jkž‘k׺O˜Ð RPVÆ—J¥@’PR£VVKðùS ÿ¦@ÊÊøÔÞ¥R²¬ìãE"IEÅÇzÇ|¾H øøÄòrD"€’^^^é?»øX_¸´”G¢UTD")"ÙNK–ba2?¦RètšŠŠ2((Uó"4ÚÇÍ””þ³™,7£ ð1B§ÓTT”àcîD ªäidiKYQQÔÔ˜TÆ!ÔD>¼= éÇ ï6(kƒÙL0ûJÞ1¡v§ãÖÏ¡lÛ¶méÒ¥²o±¨jAô¬»oß¾—.]JOOß¿¿Íرc/^LýÒ5SC °°ÙìóçÏO›6mË–- Yöâ4?ÈјO¼½=KîºóŸõ¢rAÈ÷? "nKî!TEß¾}?ûì³€€€ŠŠŠ€€€‘#Gʦk4Ü•+Wd‰ªÖ®]»yóæÖ‹¤ùûó¥•ùóšæ -‹ê Æ ýjñËó…*:Šª:J*Út+•¿ß¾…ë !„Ú/Ìd ^±bÅÁƒ ªMØ,,,tss£Ê,DGGÓéôU«V __ß‚‚kkëK—.±X,˜1cFHHˆ©©©l¡QÃÖØ¡C‡–-[¶víÚøûû—””xxx4äFÈeË–?¾²²r„ ûö틉‰©uœjN™2eݺu“&Mâr¹ÎÎβ  ¡¤¤8ztßÑ£ûr¹•—.%ÿþûýÇß**Ò¨^ß2Ôõô’]Ù6»A—6ÚRÕœJI º%¥²RHÍJ ?N4‘H¤TÑ-¨’b©²™¤²R$I––~Lº”–ò©ôIQQ…@ ‘¨úf‰´¬L"‘˜z¨Q44T@A æ‹È¦¡Èò" š¡"˦¨ª*+*Òàc¢…¨:õ“RT¤±XÊðŸäŠl%eeTI® ÔñRH^ ¯ƒAX úãÁ% &‚Bõ›Ù€   åË—ÿúë¯#FŒ˜?þ!C¨õ ¬ŸÓ"ÃRjÖÏ Œ‹‹KKK««ñfIIÉ™3gvïÞM}=cÆ ŸððpªdeóU-ªSµevvvÛÊ¥¨jú¬ÛÌÌlçΛ6m ûöÛooݺÕüä‡~àñx5O¿©,999ZZZ{öìùþûï׬Y³{÷îƒ6pdÙ‹Óü ?®t PÅ›j;Ë—/×××'IÒÙÙùðáÃMdܸqõÏÌh¥Hš¶ßô«Å/Îð EDÂò×ø~­™ŒÁ+ ¯0øÏ‘±Ý)Bµ7Dó߸Q{FDDDÄ´iÍÔœ’’bcc“ŸŸß„;Ú~ضéíí]ó÷()éÍ™3‰gÎ<,+ã+**P&BBæe%0;?@Ìç €ÇQùY©®²25»¥¤„G’$I‚,B%cdV„B1'„ÓV>"JþŸ½3«)ÿÿøçÜýÞn·M¥}“,•öÉ–)ŒŒ"£d¤0Ö33„Œ±+úÊü†Ä´a0£,C$ZH‘D‹”i¥î­»/ç÷ÇáÎ6©[·åó|xxœ{Îç|Îëœî=÷sÏûó~½›Í‰$@&O¥±‘ @Q ‹ÅûTµÊÊG"½yÐé<' 0T‘y1TA¤†]Ò—X˜‹rI_bñ …H¡a0ÚÔB ]$s)P2¦‹Mïã!@bbbÇ͘L&…BÁŒnöíÛWVV¦¯¯_WWçää´}ûv,Ç¢  ÀÒÒ2;;{Þ¼yÛ¶mó÷÷ÇöíÀ?瓺upp@[ÊhÛÛÛ;;;¯_¿^ꟃù8ɶ<}út\\\jj*vЂ‚‚ààà—/_®X±bñâÅ›êÈöóÑ6Æ kÓTGÖ] AÚÚZMMÍÊÊJƒÖj[Ÿ£\ŠˆÊkô8Ø€£î>‚ IIIsæÌ‘o·íü!¤ šÄì:!§^È‘þ_'ÔsV1»oó×éÌW·•4IÔ!ïÓ,hšDª‡ï¬ë¼ƒ `:9J‡@0'Ò.rIØì¡nå’Ú£ØÙÙÙýø£×Ï~ÿ=óï¿ Åb œßsÉÌTJEE1D" ›•|ŸA"uââr…Xx© Xs3O,F¥ %,O"A¥q,+¥©‰W[Ëïc'ÿö†EPx<ké T*‰D"H½¹°—Òl­åK"‘€ÇK_’‰D<€Ãê¬Ðé‡Çã°i FIéߌQö²²²2##CÑ*º…°Î¹<”:½†dÕ¤h-ÿáÕ«æ' Ùìvƒò>†„¢¨‘‘òÚµ–r×```0vìX¹w ô5à´VtÌT 0d½çŽÂdrMMüŸ/âñ„B¡˜ÍæK$臸ÖŒ'£²Íx<áÛ·Í(Šb%L°Ò&š½7øêÌ€‹LÆxP|xPq8DE…ŠEJ0.¯¤DÆJ›`©$XÈóæ¢ÓÉNY™ŠÃõÕ P5ƒ¢#àÍe@ÖfKÀ°åŠ˜ Hÿœ6¦:ôw˜å¼Gÿ«n®°ëœ:¡Xð>„©÷™r›‘ ƒñŒÅ÷lzWã§¡¯¯ßßÃí¨­™Åj#ŸO¹³p!kᘂ‚J±¸h7Š, Ž È÷ß{ÌëÔë!Œd@ ¤oùtõœ[VË,AQ«Õ#inæ‹Db¬´ –/‚„—m&‘ ååo±H‰H$f³ùXN‰´ÒIÈBpÊʬ ‰„§ÑÈRO-2™H£‘H$<– ¢¬L‘ÆNŒw¤ÓÉD"«ßu^Ï~OÀq`ìi`8àÈÝêiŸéŸÓ&ÐT@ ¾ ÷S'l®²kœ:as€HÃ6hÝG@±º9Uƒ®MRÒ&Ò4‰ô¡¤6‹^@z‡ µéÁuÝA[›qéÒwAAñçÏ?ì`H&<<Æô¦0d€#HïÁå ‘«)@  S¾ç2Kdë‹ÈV"‘Ö i¯lÙ6XJÇ'Õ¢0‰44¢¢Bm³$ ™L°AnÓpÃk‡nÒ­),"ùeƒ´ ƒAíï.º¾†¥¥åÍ›7ûK·HÒæ 6;;ÛÁÁŠé;b6"‘ˆH$ÖÕÕ 2Dv=‚ ­Wö|||’’’­>°¯}Ê.½Þà¼N¿wôÈÒ^…mV%?Éç™4µ‚¤ŒWÒ"ÒµITµ¶kT(ë‘§0ëA¡‰D8rÄõmÛ.‚¶>&D"ÞÝÝJI Nƒ@ºŒd@ ò‡Åâ½yó®²²áõë·••  ¯^Õ½yÓÀdrœ?w®£¢B žåCAn2™‰e±xX5¡PÂáðù|—+ÀbX ”Ãb6›'IX,Š¢L&·ºšÅbqÅbIs3O$’47ó…BVÚe”H ­Å ‰DPR"cù"ÊÊ줔•)d2F#+)‘H$ƒ…I**T‰@£‘0£-ƒk³C H{444` jjj·nݲ±±(++Ë÷(ÅÅÅæææ ô‚˜ŠŠŠÅ‹gffš˜˜DFFNœ8QbnÞ¼¹nݺ—/_8p M/¸Á•û»®pvv^·n¢U ^îß¿ðàÁ¼Élzt¢ª:·™HÁõh$C,@ßd²škœ:¡´¼vsµ€HÅ-¸nݺ½’qbˆM‹¨„¥VPaj¤GXºÔÅÄdÈòå§‘X,‘Ý$Н]{úÝwq>>Ž&˜ÃycH€>÷ïßW´„¤¹Yøúuóð᪂¾„BÉõë™ʰèèÛ•• ÅÅ5着˜R‡‡¢@öÛËÞÞ¨÷uB þ–Ë¥¦¦ÔÅýÅ\€§¶X‡¹la9X¡‘æf¾X,ÁJ²³X\,4ÒÜÌDMM<,S¤²²áÃzž@ jjâcA”öŽÌ`PÉä÷2™@§¿ˆ0ï#t:™D"(+S°â"ÒˆN!‘ÊÊd¬lIO@ú$ªªªÒe:.ûR^”——÷1k×®%‘HQQQ_}õUYYÞvZd/ˆY²dÉÂ… Ïž=;oÞ¼êêj*µåWä`A (ZEW^ÿý6#¨”§5>Œ®z÷’‹à@È“9b" ßµ£šÅì!»VÀk ûR½­&h꺒^I›¨¤E¢ë´mèJZD%­¶ÍWñ$œ¹G›ý@ rfòäQW®|¿`ÁÿêêšE¢Ë4ª«+-Z4!99'))gäH§Ù³í´µÛ(»@Ú>ø¿œÇ+æóË$~/¡Ñ¬UT¦þôÓ‚´N‰þ§Óɦ¦š½( zꀂ æ˜UÈÿ)ƒŒ¹lÉ1qDj‡ÕØÈŰ|‘ÆF¶Àdr07-&“Ãb½÷ÚÂlµ>ìÈáóÛ ŠH´TThmÚg©ª¾_ÀÖ|¨;ò¾=…BPUU‚i"½IŸr‰b ý”ÇoذáÑ£G\.×ÌÌlëÖ­Ø3\Anß¾íïïòâÅ‹ØØX"‘øÓO?­^½:==ÝÁÁÁØØ¸ïˆIKK‹544 Ù³gOAAÁgŸ}¦(1yyyt:Ç•••5JWGqÔÕÕijþûÃÃÃÃÆÆ&<<P[[«§§÷ìÙ³S§N:uŠËå~ñÅGŽÑÐÐŒ¤”••ƒƒƒÏ;'‘HÂÂÂZtÞØØH§Ó øí i_òü|}Þ©n½ (ýð#˜]#T5ét$iÛËÙ5v­]#rÞ÷B ãL¦¨âI-S(ð$ÜâtXµb ò¶ˆsgÇëÉ& ý~éÅ4r¤îõë-:™›[ŽÍm%ñóç;oØà¾aƒ{QQuRRNTÔÍððKööÆ>>Ž^^vtz¿VeÉäbH°$6[Àáð…Bq{ý«¨ÐÈd<•J¢Ó)d2fŸE¢RIt:™N'S©$„YfQ©$*F¢Pˆt:EºµË§6þ9 ýs óæÍsuu‰‰¡R©W®\ ðòò"‘H€-[¶œ={655õòåË))) %00P$zÆ~ÈwäÙe1%%%XFaa!‡ÓÑÑQ @MMMBB‚®®®‰‰I÷Å(Šôôô£GæååJWúúúîÞ½‹d$%%?>99ù÷ßOJJRSS \ºté… ¤íÃÃÃ/\¸œœ¬¥¥µ|ùò‡xðàÁÊ•+—-[¶lÙ2--­Þ9/HAÐ$~r¶¶à÷Z[Œ¶5øb× iZD,µ‚S+l®°k…œZ¡Ûnã6r5 æK”´IÚÖt%-"M‹HJ¢i)*í>¶‚aŒJÅ=æÍÍeZVtŠZ?~h©®®¿òûïÏþùg>Š¢B¡ø«¯ì±MCCB<6mš~ûö󤤜䰰ó_|aéííàê:’@€ol¤]úñMÁPSSŠŠòÿúëh‰ÍÌ,}øðÕ–-IÆÆCfÌ3uꨞލ¨ÐÂÃgÏœ9fÆ„ÒÒZ‰¤íè€WW§74°»î@ EÄ%1 èh.z3ÀÔ;@s‚¢5}˜V7AQ”ÅâbùMM<>_ÄáðÙl¾@ b±xXD„Åâ "6›Ïfó¹\áÛ·ÍÍÍ<.WÈå ¹<ž ½ìƒB¥’¨TƒA¥R‰T*IY™¢¤D¦R‰4ÛŠeŠ`Í”•ÉJJd*•¤¤DRV¦âpƒ(ž ýs ¤ûdffb €‰'òù|‹…Uc^·nݑńó IDAT„ ¾ùæ›°°0;;;ÀÑ£G­­Ûp‡W¸,xðâÅ‹ùóçoܸÑÐÐPb0œËËËOŸ>Ý?\.7...22RUU500066Vvë¬Y³–/_^TTdaa¿hѢݻwoݺ˃9|ø°¥¥%‹Åb0Þû™ÄÅÅmÛ¶m„ ØÖ1cÆÈöæîî~çÎãÇÛÛÛ»ºº®^½ÚÉÉ©·NÒwáÔ óþ¯æùÅz‰•ˆÛþý‹ È­­¯¸õBì%ŒSÒ&Ò4‰ô¡$1%¶5âsÛÕ#‹yñ0ºêщªÑs5ÇnÐGúùÈ™J%EG/Ü¿?uÿþkCGŒøO ŸHÄO:zêÔÑL&çòå¼ÄÄì… c†U™1cÌüùŸ©«(ÙH_F2  __§¤¤‘HŒÅº¯^ÕGGߎŒ¼©©©F¢ÑHmû }”¦¦÷9,« ‚å|`µC8“ÉÁ|±ÊËßb9~S¿¹™'ýê‘Â`P в2•Á `Á,ì¡¢Be0¨²k°ÿ••{¼°Š,Ð?Gîb0úµC(:99™››îÚµ ðîÝ;ì=€áçç>jÔ(*•:Œí9sfüøñ]ŽluMÌ?üPVV§¬¬ÜØØPVVÆãñ ptt\°`ÁŠ+âââ455±¼nŠi ê3»Éÿ¡ÿèÑ£¯\¹RZZiee5mÚ´U«Va7)žžžK–,9zôèñãÇ .ܱcLj#TTTÖ¬YÓ" ÅßßûöíZZZØ…’…Ïç'&&;vL ¬^½úàÁƒdr_Ž·F$‰Äºº:ÙwHŸêA|ê¾0¬Æ{wÔÒ4‰4ÏšÅg|Ùu‚ºgœš¼æ²›ëŸsP1Š#"¨è?u:Åb”]-ìúi@¬ AC)×ýð0û.ž 82qâð‰‡‡‡ÏIM}’””³råiª‡Ç˜ ÆJ(A ƒÉ€ ÜÜFúû;{ö~{e·[hd¤Ñ;b¦N}û¶ÉÎWââàñŠ''Óm 5 5f϶¢'O*=*ÏÍ}›~™@À >ÔÎÎÈÎÎÈÖÖÈÜ\{P¹«C ИJ€n¦hž¢;á¬4‹Åc³ùÒÌ‹‹ýßÔÄc2¹oÞ40™ï—±‰l‚|~P¤Žþ¡ëê6ËãäZýsä.£ÿúç@¤DGG÷Ýw!!!ööö¡¡¡L&sÖ¬Y²åCCCß¾};eÊUUÕ½{÷¦¦¦‰Äözó÷÷íòóú®‰¹yó&@öC=±UˆÀ¯¿þºzõêÝ»w6,11{.ßM1ÿÂ*¯Î‚Òß§úôD$ÃÔÔtß¾};v숋‹[¿~ýíÛ·e·Òh4û÷ﻺº‚ƒƒ›››gÏžÍår¿øâ‹#GŽÈ6Þ¼ysccãœ9s$ɾ}û®]»&»õ¯¿þºzõê¾}ûœ{è\z<«¬¬Ü/ºí>½ Œ6„hä¢bä¢à5ˆªóškrÙU¹ÍoŸs$bOD$ƒ¦jAÏi€ 04,¨¾-ñ$øÐã_ Š£ã›7 />Š‹{pæÌýáÇúø8øø8iiõ¹›Ò ÀHd@±uëÌ¿ÿ~VUÅl1‡C–.u™2¥W¢UTh?ÿD}¸åR·LúØìî¹C!m‘““ÓsGìýBdÇ©©)±¶6˜0aøŒc¾þÚyÅŠÏ7nœþÕáÃ~¿ý¶ÄÐÕCG—u‰ ¼{÷N¶æóèÑ£ÂÂÂ뿍ӥ•õ²Ì?'$$óÏill‹ÅŠpttܹsgMMͱcÇdýsº#Àá’“sæÎ²·ÿñ§Ÿþxò¤¢;½AdIIIióžÚñŽ£GÞ´iSSSSuuuXX˜›››†F»)Èfff...PL—Å´„W žíW,ÀE}ðx3`=ôZÒÙÙÙcÇŽ¥ÑhÆÆÆ111Aêëë…BaPP–––žž^LL …BÉÉÉ‘H$fffJJJÎÎÎ÷îÝÃ:AäÌ™3² ŸÔ-¶õòåËúúúêêêG<~üxÊ”)êêêT*ÕÒÒ2!!¡ã©««“}éáá!}ç×Ö։ė/_††† 2dþüùoß¾•Н¯¯çóùk×®ÕÖÖÖÔÔ<|øp‹Î¥Õ•ä‚Ó±W¶]:tz”ù»c¾Œ&ßþ!Á ‡89™þüóÜ'O£¢ü)bPÐï¶¶Û¾û.îîÝ PdÀvÞÀ`½ŽÎZµzzëÌÍ7ùåaÂÏ{ hir@(?^•µqcü¤IzzëttÖ:;ïX³æÌ‰i™™%|¾PÑ!ˆ¼©MGoNEãš:ý'µØðÀ­[·°e‘HÔ ‡î<½#òåË—€ììlùvÛñöööööîÂŽ½€—.]266&“ÉãÆû믿¦M›6bÄÙy<^`` ššš‰‰IRR //¯½þ±±±½,FKK«Åk¬1(ŠÞ½{w̘1 ÅÒÒòöíÛ¹2²ªâããe×¢K—rýü¢ ‚ôôÖëê®ÃFY3føhoƒ‡Ö×­wxò䉛›NWRRúâ‹/JJJz_Ãà@,ôe4šêŒžÅ¡gñh‚Æ6þÝõéþ!-èä7‘©©ipppUUUrr2‡«®®ÔÕÕíܹÓÜÜüáÇ...x<>;;ûàÁƒiiioÞ¼ ÕÐÐ …(ŠÆÆÆ–––Ê.|R·(ЦM›VSS“œœL x<ž……ÅÊ•+ËÊʪ««cbbÈd2ŸÏGÛú:¸{÷®¯¯/vÏ—rúôé‘#GbË‘‘‘“&MÚ½{·™™ÙƒŠŠŠÜÜܼ¼¼°­˜°ÐÐPCCûwïMš4 [)ííêÕ«FFFááá555ÿ¼ÿ ¶mÛ&Mvär¹h'¾—?¡PØâ²C r¤ªªñĉ47·ŸutÖN˜°ë—_®¾zU¯hQHÏ‚ 0jpp¹Wןÿù§Q$#òÛoK\]GFGßúùç«ãÆ ;xp¾¶6CÑåFs3ÿÙ³÷>T”ÔÕA*dà‚G€§«­`èÔ^>¶\JPv¿ÂäGû—cLYÊËËׯ_þüùê¿áããHLLT¬Œ‚‚++«ºººö¦W#’””4gÎ(¦kb‰Ÿ;w.Š¢ÙÙe Ù/ær8´H{µ±1üë¯ur;~Žôº)Z¤Ç@Åi ÛÊÓvL¢1€¶‹ó½GÕPZÆ8`Ô¦¶¿ÍŸý ª¯Ãö·OËzyô¡ãG¿‰444ÂÂÂÖ®] hllTVV&uuuãÆ Ã´ž„L@dð)ÉR=ÆHOO?zôh^^^aaawúÙ²eËÙ³gïß¿òäÉsçÎijj®]»våÊ•‰‰‰(Šv&'ëÁÞÞ~É’%‘‘‘=JOO÷õõ]¶lY÷g±Í›7ÏÕÕ5&&†J¥^¹r% ÀËË‹D"I›ššzùòå”” …(µÆ¦ÂÌ6yáîîÞµYœñññßÿ½®®.Š¢ãÇÿßÿþ×Aãââb(¦kb„BñÅ‹ÔÕçìÜù|xÿcaŒ6)*ªÑÕULN‡(+·¬ÏŒÇ#ÊÊ”V-q­W¸Ö‰D|ë•JJdMMåV- ­Çii é¯à©ˆ³ï>€ŠX ú:(ý T^¨ h½åa`ÂGª ü‡á«ÁðO ÞÊö'ùt¦­»»{yyy^^Þ… >ÿüsi‰ ²²²ñãÇJJJ°•ºººeee&LÀ^bÉXÚDwºÅh1„pqqqvvÞ»w¯­­-Š¢Rk# }}}''§ÔÔTcccmmm5µ6†¾¾¾{÷î¥Óé^^^t:]__¿´´;tii)v:²¾xñ;µ¾ŠŠŠ222X,–¯¯o{mú8‚œ;wnÆ L&sõêÕÖÖÖAAAÍÍÍË–-Û·o_{»¤SydGª(ŠîÙ³§ÅÔœýÑ9:=ššÜ¿x“Ùtss™º9åËHsŠ| )gH$ÂÔ©£§NÝØÈ¹r%/11{áÂÕ¯¾²Ÿ?ÿ3“®O\ƒ@úðưüðÃŒo¾™H¡ü'ȯ¬L9|ØoêÔÑ›6%>~¼/2ÒßÊJ_Q {ga1ÔÂb¨# ©‰WXøOvvYVVÙáÃ×ëë›i4ÒèÑzXTÃÚÚÀÂb¨¢%C ƒÜrߣymle>*£zAE ï‚ØØØnv¸nݺ &¬X±â§Ÿ~rvvDGGr8­S©`XØòÊ•+µ´´¼¼¼D"QSSS÷#™™™R3‡‰'òù|‹…ý¤ÄŽûÍ7ß„……ÙÙÙŽ=jmmÝÍ#Bä‹¥¥åÍ›7­â=X ‘ˆwp0*ŒŒ,ª«9$A,‹Åí†X´´¡¡ž-V2T®eðÁ ¶ª¨´qsPUmŸ@„Áh¹²ÒúRt@›ñQE¹ØA1Ÿ žô<ž'4‚7—À«³ ê@P€¢ Ë€——Wpp°ƒƒƒlÀÀÏÏ/<<|Ô¨QT*5((€ ÈâÅ‹üñG“aÆ9sæÇ¬®®¦ÓégΜ?~¼‰‰‰tᓺmS˜P(trr277/,,ܵkàÝ»wÒgÜ£G¾råJiiidd¤••Õ´iÓV­Z… N¤xzz.Y²äèÑ£Ç,\¸pÇŽ#FŒPQQY³f‡‡‡lN‰¿¿ÿöíÛ-,,´´´0a²ðùüÄÄÄcÇŽ ‚Õ«Wí;·ÝZÇM¥èÓèåh@Ï‘`Å“ßD7nܰ´´¤P(fffçÎC?Œ(x<^`` ššš‰‰IRR //O „……Òh4''§[·nabcce>©[ô¿ã¬å¥K—ŒÉdò¸qãþúë¯iÓ¦a5½[4Ølöÿþ÷¿I“&µ>;___CCC‰D‚¢¨@ ÖÓÓSWWŸ7o^‹!ŸÏ_·n¶¶¶¦¦æéÓ§[ «ÎŸ??þüû÷ïÒŸ oVüÆî(ŠŠÅâËÜe„Ò…ìììQ£FÅÅÅamÞ¼yƒÇãÙìv·7²Åò’ÑNf6bäÎöò§G…ɃýR(‘H|çNÑš5gLM7m8qéR®@ ÿQÒ Àœ È EOO-1ñÛãÇoýüóÕÌÌÒC‡æëè´ëˆ: iíC•]–•UzùrÞþý×p8ÄÌL ËÕ€>Tˆ|@% ÃÔþ ¼*ðâ(±rAî&P}h8·k`ȸžÒï‚O3€ÖÕÕÝ·o߬Y³À‡š™mšM£( ¨¬¬l݆ÜÝœ:0sÀŽÛ/28ÑÕU]ºÔeéR—7o®^}rá£Ç_x±X,­ûÝAº¤cdït:½_þn^[[«p1ÅÅÅ S§NÈ–/Vˆ˜C‡eff>~üøÜ¹sK–,馹â{è&`ô0z h|ÊÏÒS€ûº…t•É“'?yòDv úÁÁ/***** PPP€ ˆžž‘Hܾ}ûöíÛ[t"ÝEºðIÝÊn•.{zzzzþ›¿%­$ÛƒF£-[¶lÙ²e­Ïî÷ß—.‰ÄˆˆˆˆˆˆöÄïß¿ÿþýزlL0{öìÙ³gƒNÆu²Ë] ¬¬ÌÏÏÏÏÏOº¦²²²ÍB#`hhص£HòN×”\k˜²×ÔÈEEÑZ#xT Œ=|ØïöíàçÏw%'¯òñq`2¹‡]÷ò:2rä–Y³‡…]HLÌ./«h½Hÿ$gx $"ˆAþàmHŸ ®Úþ[àvLËC§ô‚Ì»àêÕ«oÞ¼±²²Z²dÉ£Gò¹„††æää/_¾ÜÕÕUº ›` PUUýã?X,ÖÎ;;ßó™3g¤nÔ]@ÖÌ! ðîÝ;Ù˜/Ä£G ;ö…辘ÁÒ999PLŸóQôôÔ–.uùóϵÿ½iÍšÉÆÆC˜{gëGo¹óøñã)S¦¨««S©TKKË„„÷uIKK344ŒŽŽ ÒÒÒÒÓÓ‹‰‰¡P(Ò÷RII ‡Ó²¬ºBÄ[[[+))©ªª*)ÉÇÔ¢Ëb6mÚddd&Ÿ0†,ªV`Ì.0»|q|%çÎ!ÝfôèÑ›6mjjjª®® sssë þ»…( ]]Ý‹/b“%ICCCÇaŒÎÑXùiyÅZÀ0†Âa0(>>Žññwïþ°`ÁØ7 ¦MÛ÷ùç{"#oÖÕ5)ZÒ)à½2رµ5¼zuÝçŸX½úÌæÍ‰l6_ÑŠ²2ÅÉÉtժɧN-}òdGnî|mmmŸ_±iSÂØ±á¶¶Û.ŒÙ·/åúõ&Sž¿!KÁNP €LEP \Þfç“À½—b²˜ššîÛ·ïÅ‹ÎÎÎëׯ—KŸ?üðƒ‡‡ÇìÙ³mmm+**’““±õ...ÖÖÖXðàðáá¡¡¦¦¦ÒªÁßßÿÞ½{]}ôèQ]]Ýo¿ý/¦N„ IDATvÑ¢EÓ¦MÃG¤„††º¹¹M™2eÆŒØüÇf wSÌà¡M—[[[¹ˆÅbikkw è1Ò°„‡‡‡bÅH$’U«VÑéô#FdddÈ¥O ‹¡6¸§§o¹ysÓÊ•®††rOŸ‚´fÞ¼yæææ=zõêÕºuë¶ 3a¯¬¬¼|ùrJJÊõë×cccE"‘tß'NìÙ³GábX,V]]]@@™L655MOOW @aaá_ýE£ÑŒŒŒîÞ½+1­@ÀqmÄ‚(”øøø‡êêê6 ³oêËÝBESsZÓµ9:ƒ §jLùx;Hoajªä~ï^ÈÅ‹kœœLºng÷£¯ï±ÄÄlO¨huH‡ôºŸÒG‰Ï²°ØüÙg;ÒÓ_*ZKßE =^›±fÍ™I“"tu×é믟4)bÍš3'N¤å彉ĊÖô=^þCÞ»fËþ;G@YÅŠ×?$%%õαž>}Š H}}}_Ó§èr ÐÃ…F6nÜØùCôœ˜±cÇ&$$`a‰ææfÅŠÙ¿¿½½ýË—/·oߎ™°wÐéz¯^µû1„tþºµØ«ã÷@cc£´JDQQheÂnnn~úôi¬A~~¾´ÃôôôœœœÎ¢§Å<|ø°dÉ’wïÞ…BE‰AQ‡Ãyzz644ìܹ³“b¤ôÍ ƒ X±IáôÍOøoI’6—ÛÜ«Í:`óæÍúúút:}Ú´i%%%úôéÓÚÚÚgΜiÑO‹£@ }.WpéRn@À }ýõ?lÜŸ™Y‚ã@ú0'yÏܹŽéé!––z>>‘+Vœ‚©mB$âe}¨ w=»ÂÓs “É=xðš»ûþ#þõ¡zýúPA T$ƒì•´åÁ‚"àéŽ^ÔERRRÚ´Ä í…£›™™¹¸¸ôœÈOò…è¤Hçþ9rÓ³þ902‚ö)=Nccchh¨‹‹‹®®îòåËe7a&즦¦ØssséÖææf{{û¾ ÆÎÎEј˜55µàààŠŠ ¹ôuùÊP©Ôï¿ÿ^UUuõêÕò@ Š¢/·¹×!CZ,888‰ÄÝ»wWTT455¥¤¤Hï$mâïï_]]]__ïçç×¢ŸG@ú, ÑÓÓæÔ©¥YYakÖLÎÈ(öò:2iRľ})𩤯#È¿ B‰Y½ðÞ½—Ÿ¾çúõE+êë0”‰‡¹Ÿ:µôéÓðÜÜ÷ùPmܘàìü¯ÕÝ»/¸\¢õB ½NípïkО•<*¯bAãÓÞÕÔEÜÝÝÛœÞ G/..ÖÔÔì9‘Ÿä ÑI1Îýsä+ô’¤7pqq)--Ý»wï«W¯RSSe7a&ì:::Ògñ%%%Ò­îîîX(àèè(—B,]ÓØØ(‘üë¯H£Ñ(ÆÔÔ”Ïç„B!€J¥v_ é³Èe.Žb'ôô/*ﳘ¯¡ewEGGuÕªÉéé[RRÖOš4âÿþ/}ܸ³f>sæ>tb‡ôŠô9<=mœÍ6oN\¸0ÆÛÛa×.o:¬hQýmmOOOO€P(.,ü'+«,?¿âòå¼ýû¯ápˆ™™–µµ¾µµ““‰¥¥>ýµ!V!Hó¨¸í„ Ÿ_îEY6°´´¼yó¦¢U ^233ét:Lœ8‘Ïç³X,lãºuë&L˜ðÍ7ß„……ÙÙÙŽ=jmmíxïÞ=y%@tGLqq1ÀÊÊ*%%eÏž=óçÏ/--%º;Òîò•ijjz÷î]]]]TT”ŸŸŸ\Ä@‚P(trr277/,,ܵkàÝ»w²Ó{ýüüÂÃÃGE¥Rƒ‚‚Xô+ÄPSS»uëVˆåÌ™3ãÇ711ée1^^^kÖ¬9pà€ƒƒƒžžžÅÌš5kÏž=#GŽ 6Í¥/t2à‘ˆÑ‡Ç«ò~«¶Y<Ôá[]EËt kkkkƒ°0Ï´´¢¤¤œä­[/L:zÁ‚±&˜ÃJiÒ@ m ©©|òä7—/?Þ¼9ÉÍmϾ}ó&N®hQý "}ùa/Y,n^^EVVi~~åרJJäQ£t±¨†³³™¦¦²bC r†S n¸ ’ÿ¬GðÁ‰àý2Íà €ÿ¡I dðÒØØqïÞ½âââáÃÿó…ûQÿœñãÇ÷1˜¶¼gÏž²²2Y©½)ü×?'$$D.b !::ú»ï¾ ±·· e2™³fÍ’u }ûöí”)STUU÷îÝ›ššJ$ªªªÒ6Òx˜¿¿lll—Ÿ×wYLllìŠ+¢¢¢ÿýw¬±¢ÄlÞ¼9??Ô¨QvvvçΓ‹äpê„o)«+àL1áÝ´$aêÔÑS§Žnlä\¹’›áë{LWWuöl{??gccø‡†(É€@ÚKÎNœ7︟ŸóÖ­³`rF—a0¨'—„ÊËßbQüüŠØØ @¤­Í°¶6°¶Öwr2up0¦RIŠÜw¨¬¬ÌÈÈP´ ȧAÍSÄ!t´Zq@R¢ÃB ˜@¯ ¯ÇzÍÈP Ÿªø£Ýl€qãÆaÓE!Œ‹‹‹³³óÞ½{mmmQ¥P(ÒM².1XТ…ŽtÙÑÑ1;;»;ìžÓØØÈ`0°6@~þ9]ýsú äëééééé)}9}úô;’É䨨¨¨¨(@AA‚ XÆC{‡èàÍÐsbÆŽ‹ÕÜnBÄ())ýñÇŸ$Ò§¨¬¬” ê@Âb † ¡|´%䓸ÿ¾¢%@úe7ïì(§ë¾:7BÅ~è ªª´ Æ.X0¶¨¨:))'!!+2ò¦µµ··Ãœ9öjjòL†@:F2 ŽÐÔTþõ×÷ÉiiEûöÍ›0Ni”FFFF>>Ž‹÷øqù£Gå¹¹¯Oº·o_*…B´²Ò·³3²µ5²³3Ò×WS´^E’‘‘áëë«hO€F7¶¡.xPò_‹žÿž½Ïÿ¯ß P´€òOê->>~îܹrÙfF°\žC1.ýsä.úçô;RRR¤Ïâe é¸ÒÏèÑ£g̘Æf³ÃÂÂÜÜÜ44ÚMò333sqqbº,ÒxðàA{cc!‘ÉF$’‰¤K$j Õo߯÷²<dP!¢™ß<¯µôÕrú^O‚µx8CCB<6oþ2#£811{÷î?wî¼üÅ–ÞÞ®®# ø€ô}ZѺú%¶˜¤„W´ ˆ‚).®ýãG‰‰9¯_¿>|¨ƒ¯ïgC†|ä×Ò`âÒYY´hüÍ›55é³f »Àfó-j€C$âÇŒ1X´hüÁƒóÓÒ6—•íMIY¿xñ‰½?sæa“cdž÷]\L̬¬R>_¤hÉÈ@ãñãÇS¦LQWW§R©–––RgjAÒÒÒ £££ƒ‚‚´´´ôôôbbb(JNN --mÍš5†††!!!õõõ “——·uëÖ¡C‡²X¬²²2Š”””p8œîkèw¤¤¤ mÚñŽ£GÞ´iSSSSuuµ-k éGäçWDFÞ\¸0ÆÚ:ÌÝ}ÿ‘#7TUi?ýäuÿ~hnî‡û-X0†1 ² R__ßzý¾}û¬¬¬vîÜ©§§gggwâĉßÿÅbÉ¥óžØ«/ÃÀ°aZAAî!/®qr29xðº­í6_ßc—/? ÅŠVX(6%é§\º”ke:fLØ¥K¹ŠÖ2xa2¹™™%GÞ8aeª£³ÖÐ0hÒ¤ˆã²ž?¯’H$ŠÖ( Á`ô¼W ø˜¹……ÅÊ•+ËÊʪ««cbbÈd2ŸÏÇv7nÜÝ»wCCCÍÍÍ>|XPPàââ‚Çã±1S¦ÌÌLW^^®@1ÕÕÕ‡ÖÕÕåp8ŠÜÜÜüÑCô5ºì.Õ}¼eMŸÓ wž ¼nƒ8*ë}*+ßÅÆf,_þÛ˜1a::k7Ìuôè¼¼×"‘XÑê =àܹszzzt:}óæÍgÏžÕÑÑQVV^¿~}{eee9;;S©T##£'NHŸzÕÕÕa}Þ¾}ÛÀÀàäÉ“–––'Ož”Ýs …!!!úúú_ýu}}½TÏ¥K—ôôôÔÔÔŽ9‚Ê$fÕÕÕI$’Ý»w«©©y{{wr¯Ö‚{àBB ŠË\º”;wn”®îº#¶lÜŸ™©È3d ÇaHildoܯ«». àÄ›7 Š–A««¯]{~yæÌC¦¦›ttÖ¾+°qéRnmmu>…¿™3}!’! H (ZTT$ûk011EQssóÓ§Oc òóó[tXTTdffÜÄ#Ò™:=*&===''§3‡èk(0’éMàù®Ñï®[›³Üú×M©÷£²ÞáÝ»æK—r7nŒwvÞÍUš9óPxøå;wЏ\¢ÕAz€‡‡G}}=VjúôéÒåbö¦¦¦ÁÁÁUUUÉÉÉ8®ººZ:„|ÿüÓpôèqãvêè¬uqÙýË/W_¿~«hQþÍ÷—‡@zÚÏ?Ï=Û~ãÆx7·=6Lÿ曉8¢h]ƒmm•©SU¦N ‰$%%µùùùù•ÙÙeÿ÷w%T[›amm`m­ommðÙg¦ ÆG\ò! ±±1""âÞ½{ÅÅÅÇ—Ýdhh¨¨¨055ÅÖ˜››K·²X¬ˆˆˆØØØˆˆ???ÅŠÁ(--=þü‚ <<liiÉb± `åÊ•ZZZ^^^"‘¨©©‰Lþ÷=yìØ±Ÿ~úÉÙÙmhhÈáph4ZÇ{uFpßámçö¶r]{å±õ­ÒŸÐÑQ]µjòªU“óó+s~ý5ýÀkãÇ›{{;̘1†F#)Z ¤ÿ#H·;Ö,%%h÷î?üñâõë»vÍ13ÓR´( pC-,†úø8Øl~AÁ›üüÊüüФ¤œ}ûRñxœ™™Õ°¶Ö·µ5"¡¿'Ò...ÎÎÎ{÷îµµµEQ”B¡H7áp8€ŽŽNYYöh¾¤¤ÛT^^îêêJ¥R322 +Àd2ét:ÿòË/y<^UUU÷#]ãîî.]vttì_E¿!È€Aö6H§Ó»Wl­­­4XR]]=oÞ~+½gö)aÈ'ñøñã)S¦¨««S©TKKË„„l=‚ iii†††ÑÑÑAAAZZZzzz111 %''Ç«~`ïÞ½Û¶m#‰Ò>1ƒ>DÁUÿúëÝ%K~3f›¯ï±Ó§ïik3¶nuóæ¦Bþy®§§ c@º€»»{yyybb¢ŽŽÎçŸþæÍ› ¤…3fœ:uJº¾  @CC£©©I__¿´´[‰-èêêb/;xÒª««{ñâEÌöD"‘444H³u;~>ûQÁ §:·9Ù·°ìFƒÛn“©ûL©êÄï´™Lðô´9ujivö¶§?^åë{ÌÑqûÎW^½’ó³ È@æd@ òÁÞÞ855())gÇŽK Y!!žÞÞ0°Ü7‘õ¡”—¿ÍÊ*Å26bc3ƒA±°Ðqr2ur2±µ52„®XÁ]ÇÇÆÆÊ=CYîÝvÙz¢§=1 R¢££¿ûî»{{ûÐÐP&“9kÖ¬ÂÂBiƒÐÐзoßN™2{V•ššJ$oÞ¼ ›†eøûûÇÆÆš˜˜ô¦À¯¿þºzõêÝ»w6,11KíW”˜ó ñx|÷Å Zú¸=NÝŠ!^fÞ¼y®®®111T*õÊ•+^^^$ °eË–³gϦ¦¦^¾|9%%…B¡¶Qæääœ*F±ôëHF÷"ìÓ}üøñ6okR:¸GI»j}s½ÈvØÐÐ  »v²=Mÿ}"¯XúïuûèÇçÕ«W›7ož8q¢ŽŽÎ¤I“dßÕX‚B¡HÇ\.W¶CÌzžÉd¶×9Ç;}ú´£££ÜN©Ç€‘ŒòúõÛØØŒåË3&LGg­±ñ†¹s£Ž½‘—÷>“‚@úìÚ.ÎÞ€@ºLc#;66cæÌC::kml¶…†ž/(x£hQ¾‡A =…H$>yòΈ[lm·%&fK$E+‚t—êêÆkמþòËÕ¹s£LM7éè¬6,xæÌC¡¡ç²ž?¯ê‰ƒvò7³©©ipppUUUrr2‡«®®Æ4ìܹÓÜÜüáÇ...x<>;;ûàÁƒiiioÞ¼ ÕÐÐÀ¨ÅÆÆ–––þ?{÷ÅÕ5üÌ.Û`é‚Ò{Q`Eš¢ÆÀ¨X"úÚŒ€ÑˆŠ]£¢±$*"‚(Q’X£X°A"+" ¢”¥lßùþ³e) xOž<ÃìÌ3‹;Ìν÷œº -jÇq1bDIIɹsç”””x<žÍüùóÙlvqqñÑ£Gi4ŸÏÇ<7yþü¹££cÃóºsçN@@€­­mc'ÞÌž ww÷;wîlÛ¶ÍÒÒ2%%%77w̘1Òg²2{/ðÿ>‚$Z¨­­mxŽMþvZ­K<{öìÙ!C˜L¦ŠŠÊðáÃ¥ÃÐP0*˜6Ñ¥{2ä\‹ˆOwXX˜ÌË¡±kT½^ëɸté’‰‰IDDDIIÉçœx{èWžN¨ë¾oM~|ŒýýýT):(¤S@÷aÒ¾*+k#"’LLVy{oùë¯çŠi3B¡øŸÞÅǧ……1b§¡áJ=½å}û†Ï˜qdÇŽKW¯þýñcu›¨™ß™µ´´vïÞM,———)ªKKKe&|èÝ»÷Ñ£G‰•DUºÆzÚZÔ,Žã˜˜ˆã8QÞ¹´´TNJ 9©'jkk9âää4xðุ89é\šÙ“A¤¿°³³‹‰‰!V‘Éäšš¼y=D 2ÏQþÑ?G×}.†tK]º'£ÒãÔ‹¡áÅ¡±‹Þ‰Së +OëtÝ÷­ÉžžÞŽ;>~üøôéSxñâEÝÃÂÂlll=zôüùó#FÀlj}§NºqãÆ†mòx¼èèhwww—ãÇ·ë°€6„z2¤ÊËk.^|²zuÑ{alìïµcÇ¥Û·_t|.VA¤[‹%©©y«WÇYX|gl>>óæÍsww'Öš››ËVVVÄ«W¯ŸG»­ IDATlllˆe Ãä²kQ³ ‘>Un¬¨¨ˆŒŒ¼wï^nn®µµµÌ£TVVž;wnïÞ½ÄW®\ œ2eJll¬­­mËÞˆF›Íž6mZÝ2ÔoÞ¼i,*™-ê#‚ Ÿœkñé–sY«w’£EccãÍ›7ÿðÃñññÿûßÿ(JZZZ3OA:ÒÏ?ÿ¼téÒÐÐPggç°°°ÊÊÊñãÇgggK7 ûøñã°aÃ444¶oß~åÊ åÓ=Ï;w¾ù曆mþù矗.]Ú¹s§››[òÙ8Þ­[ÿܹ““–ÆÎÍ-{{Ã1cœ¼½­M••©ŠA“qö ‹šŠAd ‘0ËœÅ2wùò³„„‡óçŸTScŒÛwòdË\Ñ" €z2¤#˜›ëœ8ôûï7^:tû‚> A·ûÝ‰Š øKüXRÂÉÌ,ÌÌ,ÌÌ|³{÷Õòò%%’¹¹®££!Ñ·aeÕ“DÂÚ0€‘#Gddd$&&<˜ÍfëõôôØl¶‡‡äåå+õõõÙl¶§§'ñ#‘ÚL&f³ ûÏyy{{»¹¹mß¾½_¿~8ŽÓéô†G¹páÂÀÕÔÔˆ Y,Ö•+WLMM{öì©©Ù7ÖăE}}ý;wŽ?p¯¬¬”Ù‹ƒã8¼yó¦a „zçˆ Hç'çZD|ºå\Öê]£ähÅÅáÅ‹÷ïßçp8-ÝAÚ^§d”LcÇŽ;v¬ôÇQ£FÕÛ‘F£EEEEEE@VV†aD¯¼~ýZf›&L˜0aÂgFŽt>_”––ûvÎ;9YYE îà`øÕW}6nœÐ¯Ÿ “ISt€‚´^á}NÊŽ75Åm††©Œ¯iÒI¨ªÒýü\ýü\ß¾­HL|óàÔ©kë^~~.~~,]]UEˆt4žA:Θ1}oÝZ³dÉÐC‡nzxlŠŽ¾/IÒ.zöTûê«>ÁÁ#OœÊÊŠHI Û¹sŠ——uAÁÇððó>>[mm¿?þ§ððijgÓ_¿þøùGtrrZ³f±±±‹‹K݇tÓ¦M‹ˆˆxüøqvvvpp0`6{öìõë×ß½{·¸¸xÇŽ†††D}ÎS§N}Ò…5+30¡PÈb±¬¬¬²³³g̘eeeõ¶¹r劗——ôÇ>}úüþûï—.]***rpp˜3gÎãÇ?ÿ-€3f„……=|ø077wÞ¼y>>>Ò—ÊËˉ .p8œM›65¿eé;ÖU`²<|øÓ©‚iH$aöáÃèTu~M^‹ä\Öê]£ ->ò|>ÿÔ©SsæÌqss{þüùæÍ›?§Aù|—/_–y “¿cŸ>}¾ûªªâââððð!C†hkkwLÌH{ ÅwîälÚôûøñ?õî½vÊ”Cwî为šEEfdüxùòÊÐÐ1^^Ö¨Aº®ò<îó_^^š«k¯p±êÆ@º }}E‹†Þ¿zùòJËì§Ÿ®÷ïÿC@ÀÁ³gÓkkŠŽéŠKl… _®²²êˆˆ$SÓU..¢£ï‹Å¨øD ýóÏ;¢.â A‘úú+ôô–;9­“Ø(/¯©»}332_¿~ÝÞÞžN§[XXÄÆÆâÿ&gçñx ,ÐÔÔ433KHH€ŒŒ @nll¬¬¬Ìb±nÞ¼I4DÅNéB‹šÅÿ›k›ØòâÅ‹¦¦¦4ÍÝÝýÏ?ÿ1bQ¾»î–FFFIII2Ï«¦¦æðáà jìÄ¡yu2ˆmÁš5k ™Læˆ#¤˜½½½étúÇq?yòdÏž=µµµO:²Ü7<ǺïXÛ‚v˺^þ/¸yó&±,­"Ð&¥7£GVl0b±xáÂ…***666÷îÝS`0éééõîĤÙä›C"‘DGGKKI7ù¿mué:M^‹»¬á²®Q2?ò]dÖÉ8þüÔ©SSRR>óÄÛCû]yº·/ù}{öìÙ!C˜L¦ŠŠÊðáÃ¥^»Ÿn\'C"‘<þöرÛAA¿ÚÙ…êé-wt Ÿ?ÿDtôýüü÷ŠŽAdøá‡¤£¬¸\.®ˆ[£ …ÐÎ5öšCP#N?PtÌíÉ™ñ¿¾[©Ø`ä3ñx‹ŸÌ˜qÄÈh¥Íš%KNݾý¢±" H÷€áMÍ&F¤¼}[±gÏÕØØT{{ƒÐбžžVMïƒt;UU¼ìì·™™oÒÓÙä•–V€‰‰¶««™££‘££annú´iSÚäZ••åààPZZÚ¶#%Û©Ù®ð„„„I“&µy³qqqDyÕv‚aXzzº‹‹K›·ìîî¾bÅŠ¯¾ú (ŠŠŠŠƒÙ½{wLLÌ™3gbccOŸ>]7½{#‹«ªªˆåâââ)S¦¤§§KÊ·Hû½]ñóó€³gÏvØ¥ÉËZ;}ä;‰¸òtKè}ûÄÇÇt›oÐ þÏ?ïîßÏMIÉ}ð ¿¼¼F[›éæfáînááaemÝKÑ"ˆ<ÊÊÊW¯^511IOO÷õõ%‘HkÔ"8ŽÇÄÄøùùÑh ›Ï$¬Ÿô\P-î;³—㌞d*J™‹t%%•IIgΤ>þÖÀ@Ó×·ÿôéML¾ÜÝÊ.… £¯¯±m›ÿ,WWW88wîñ¼¼÷Š éhªªtË<(ÈûçŸg>y²!99d÷îo||lsrJ6n¼èë»oݺ‡Ÿs­n§„0D«sb´ ooï8PÇ{úôé°aô´´ †½½}||<±ð[·nÿüóÏÁÁÁºººG¥ÓéDÊ£ÜÜ\GGG ætc´k0ñññß}÷‰‰Ixxxsº1Ú/2™¬ñ¯íÛ·ÿðÃrº10 KJJ244ÔÒÒÚ¿¿t%‘]ªžŠŠ ‘HÔ&§Ö¥uLzœnü‘G¤{DwîäìÜy9 à µõšaö=z[[›9ùÉ“õÏžm}ZOOOUUuåÊ•rv©«î­‘D"Ù²e‹©©©¦¦æäÉ“?|øÐX#2·zôæÌ™SVVbddD|!TH08Ž“H¤±cÇ–——oÚ´IáÁfÍšE|§•Cbb"Žãb±šª»€ãxAAÁ÷ßohh˜ššÚä9¶T÷îÉ@¤ÐùÖAïÛ—  Ý•ñxrz/Pf|¤s€1cÆ|øð¨S5jÔ(鲜ÝíÛ·ÏÒÒ2%%%77w̘1rn]dn)‘H|||¶lÙ’––f``@Ò“¢±ÆeŽ>177 y÷îݹsçH$Rqq1ÑΖ-[,,, A¾(·o¿9r'ÑŸ‘—‡*ì}éºÐwf¤Íu†žŒW¯^­Y³ÆËËKOOoРAu¿+ÏÊétúÝ»w‰¹\nÃËÊÊ ''GÁ¨¨¨\¿~Çqb²ˆbƒÁq¼¢¢BUUµ²²‰gI––&]n²'ƒÀãñNž<éäääêêÚäi¶êÉøB 'ò­ƒÞ·/A'¿+“ö^Œ±ÓØ8X_ê½@º¸yó&þïкËrnÆ»5²³³‹‰‰!¶)**"“É5552[hl˼¼³~;L›6­Þšf¶)ÿýÿœ–EyñâÝŽ—\]7èé-1bç‘#·>~¬VtPHk(‚ Œ——õ¥K+ïÜɉˆHòöÞ2ztß5k¾63ÓQt\‚|‰¼½½ÝÜܶoßÞ¯_?Çétºô%"%±žž›Íöðð€¼¼<é«jjjÒ´ÅÊÊÊ ÆÜÜœÏç€P(ƒ¡À`àÂ… TSSkò(ÖâÆ/^¼¸ÿ>‡Ã©›A’’¢èöÕ Å<ž0=}ûvÎ;9ÏŸ‰Å¸ƒƒ¡««Ù¢EC °ÐÕUUt€Ò,L&þ½ƒª»Ü l6{Ú´iÓ¦M“®yóæµµuó·4775jÔ½{÷¾þúëæ7n``P/쨨¨eË–íÞ½ÛÇÇgÞ¼yîîîÄúÂÂB b™XxóæÌFZª<Ÿ÷䨻ü«ÚÖŒÚRª"Ër´ÔÍ›7œœ ªªjóæÍ'NÌÏÏWRjýsËØØØ¥K—²X¬¶‹±Ý[FÚ‰µu¯àà‘+VŒ¸wïåٳ鑑DD$ d3y²ËÈ‘ YÑ"Í…z2¤“òò²¾|yåõëÏ·m»4xðÖñãû­\9ÂÔ´‡¢ãB:;™Ï=ÓÓÓ]\\P0'˜.D(²X,++«ìììÍ›7@YYYÿ-š6mZDD„ƒÁ†ßj__ß%K–ìÞ½ÛÅÅ…øbvêÔ)33³füøñ[·níÝ»÷Þ½{û÷ïohh¨À`àÊ•+^^^u[ûÌ`€ÏçŸ={öàÁƒ`ñâÅ{öìù¬’’¸0t—ˆ -³gÏž={ö(: ¤û«ªâ=x—–ÆnØ{áæf¡£ƒz//š¾¾þÎ;Ç8ŽWVVjhh´hˇ&''÷êÕkß¾}Ë–-kfã ¿kŒ9²   ###11qðàÁl6›Xohh˜ŸŸO vÉÏÏ'šm¬‘æ+{É}r´˜}£\Ë’1l»™é è”%½1 +--­{Ï,Åd2‰÷SCCcÓ¦M‡b³ÙVVV­nÜÏÏoùòå÷ïßo“Èëj¿–‘vE"a^^Ö^^Ö“®\y–ðpþü“êêŒ1cúNŸ>ÐÑÑHÑ"Í È !‚4ƒX,¹xñ‰§çfcãà%KN½zÕhÉ2¤[jiƒòÀÍ›7‰ei6ÿ¶òòåKhÆÚæõë×C‡e2™ò+9w@0ׯ_wpp Óé666þùçç7 »ÔÅ‹MMMi4š»»ûŸþ9bÄ[[Ûº;òx¼ hjjš™™322p¿ÿ¾ƒƒƒÁðööÎÍÍ•.::ºãƒ©®®7nNwwwñâ…bƒÁqÜÈÈHš¯@N0uc€¦²K?~êÔ©)))rbn‚˜¿»†? Á/9ã‰F _GÙ¥¾påA¤¥*+¹W¯þMdŽ22Z©¯¿bĈIW¯þ]ZZ¥èèä³Ô»á‘¹,s/™·F6l°··OOOùòePP““Sc-ÈÜ’ÇãÙÙÙ%$$dffjhh°Ùl¢e"7ic˼g355]¾|ù»wï”””>|ø@¼´qãF++«´´4¢NƘ1cä4Ò•…¼KK^v~tnÊóüëåxû䔂–fÇ”=—>Š”þÊ’““ŒŒŽ;Vï×]QQùùù2 ¤Ë\Ù°ñ{÷îYXXÄÆÆJO!==]æ¾<oÙ²eººº=zôØ»w/4Uà]fËOž<:t¨¦¦&NïÓ§ônJþ[×üõH{xó¦lÿþëF¥öï¿^RÂQtPˆ}zÊ”)ÅÅÅm’Ũ]áÿMJÛÐØ±cÇŽ+ýqÔ¨Qõv¤ÑhQQQQQQ••…a1ýbàÀD™ëzä¼'팊ŠÊ… :I0ðúõëæS7érÄ &L˜ ?fÙ8/àýmx Нï=Ðt ×P°Z sZƃüüüZsA¤…ø|Ñ“'÷ïç>xÿèÑ+.W`jÚÃÍÍbÎ/wwKMEˆ Ñ÷ßÏår'L˜PQQáááqîܹmncc3iÒ$X¸páܹs¯]»æíííèèXTTÔüÆàèѣ˗/?tèAtt´¶¶6±>$$¤ººz„ \.wøðáûöíûÌS¦ª’°Qû- ÝšÎ\ú9bbb222’““'Ož(+Óß¿çnÙònË–$—b E¬è Oê}"°&¿¨#ÒyH$ødlÙòGQQy@+8xDÏž¨?£›‹hŵÃ0ù©“ž>}ºjÕªÇs¹\ ‹uëÖùûû;&''†††æääDGGS(” 6,^¼øîÝ»...ÒYÏÍOÍÔ~ÁôèÑ#::zÔ¨QUUUjjj<0`€¢‚©¬¬d2™d2™Ëå*++geeo[ ð¸¸8âèííòåËÒgñu…††FDDÈÙ±OŸ>£G¯©©Y¸p!‡Ã¹~ýzcZ¦¤¤èè4QøÓ¡’¬[Z.`0z}š}¡‘d»víê„9â‘ö°råÊ*: ùUUñÒÓÙ©©ù©©ùOŸ¾Dff:Z háîn©§×öã0Ašð›7o|xhh(±fêÔ© ÷urr ûöÛo 33³oß¾¥¥¥ƒ :u*¼}ûÖØØ˜Ãá(++7Ö²••ñerrrlllˆ`ä¿u3gΔy”öûUv$âiÆ AƒHsI$äÚZU&³BÑ ¥¥¥ÏŸ?¯÷4 ÍÉ@®„˜Ÿ1r¤Ão¿=ÞµëJ||º¿¿kpðÈž=ÛwðÒ-É3B ¹råJRRÒåË—étú‚ D"±#ñ‡äs²¸¶a0yyyÄ$Œììl‰¤§§§À`ÔÕÕ ¤¤$>>^__ÿsjt¼‘#G¶npC\\ܲeËôõõq÷ðð8|ø°œsssQ0ŸLëÕE¨Z2^ú0ôšScåÊ•m‚ ÈïÅ‹âôtvZZ~z:» à#•ª4`€¹——Upðˆ~ýL˜Ì®T°AÚV«”´y#"D‰ÖúzàŸ©…Ù+{.ell,]–VüGŽ™8qâ«W¯dH—S5½!âèÒ92÷}÷î´,¼t¡ÉêñõZ®¨¨ˆŒŒ¼wï^nnn½"órÞºæ×¨ïºÖ¯_¯è.)99yÆ õV¢ž éz(²ŸŸ«¯oÿ¸¸´]»®œ;÷hêT·%K†éê¢ú~H ¤¦¦JÇŒxyyñù|‡C `Y±b…§§ç·ß~Þ¿Ø¿¿££c' †è<ÈÉÉ™:uêêÕ«ëÞ w|077·‚‚‚“'OvþÔRmÂÞÞþ¯¿þRtŸ `>ÁÅPõÊ3 ü)Td@yp߀#`$cceTÚA¤Cá8þìÙ›´46ÑQRÂQS£`1}ú@WW3Cƒªè¤Shõ€’6oD±ªß ž'”æþYf>\Óm…¡¢ÃiÆÊžKÕí ©›8888,,ìåË—2 ¤Ë©šÞPÿþý'Nœ¸víZâÇÆÌÉÉñôô„:Œš¬_¯eooo77·íÛ·÷ë×ÇqiÖ)ùš_£A@=ÒuQ(äéÓ°ââÒvî¼ûà›oÜ–.¦£ƒú3f‘3f„è(,,”&<µ²²êœÁp8œÈÈÈèèèÈÈȺ#Y !??ÿüùóÓ§O3f º E {'<[¢Z Q@½hõýÑ Õ4ú*:2A/—P(~ò¤ =}ûvÎÓ§¯«ªxšš*žžV‹ e±Ììì ””6ÎAÎI"Ä S8¹”½ºUA¦`õ,GÉš_Û‰999ùúú†„„¸¸¸Hî———KKY4†N§cVVV6sæÌ7ÚÚÚª««/Y²„ø†%s%±£ÌÆ7mÚdkkK,ËÜ700ðÇ´±±ÑÕÕ &¶œ1cFXX˜††ÆÖ­[>|øäÉ9- …B‹eee•½yóf(++kòL›sA¤PO‚tmDƤIÎ11öï¿~æLê¬Yž‹QWï&y‘ö#gÌ14FOOÍfÃUòòò:a0>>> ãþýûFFm6®¼ÕNÆ×_ÍãñÞ½{‡z2v!ªÎ?@¢†ƒŒWuÜ¡ÿÐêö@B9IA†Ç]iiùYYEµµCCM77‹ððq^^Ö&&ÚŠANJX+~°«ˆýW¿JÔÓ‘éñ‘ÅHMŠ2YÑqµXòçÒòéZZMôÊôèÑcãÆñññ ¤7V5½±ÆõõõW¯^½nݺÆö]³fMEEŤI“$ÉÎ;¯^½ Í«_·åŸþyéÒ¥¡¡¡ÎÎÎaaa•••ãÇÏÎΖš-*# êÉ@î€Á yûû»þüsòÑ£·cc,\8dÖ,Oee43iT“cF¦M›aggÇ`0ˆ‘)rjcœ:uÊÃãՕ!ZÌ÷ßÏf³cbbTUU+**@UU•L&+$puu>}úÿþ÷¿˜˜bÞÆgƒ ª†²'ÀÉN6Tfç¨y €ƒ±?xÆÉؾÇ@èj5#‚(FEEí;9Dæ¨çÏ‹ÄbÜʪ'‹eäÍb™õì©®èé( rm©°ïÌž#4™zâK}Ý ]-74tèÐgÏžÕ]sëÖ­f¶óþý{b!22222²îK ¥áJ9@xxxxxxc R©Ô]»víÚµ‹ø100XزeË–-[êENËcÇŽ•®—Vgiò­“yAdB=Ò}¨©1V¯µpáãÇïîÛ÷מ=W úHcš3öñãÇaÆihhlß¾ýÊ•+ ¥±Ö£££[ý¼¾uÁEê&•JOOwqqQH0ðË/¿,^¼xË–-–––gÏž¥ÑhŸÿÎ |x7¾zOÐp¦9èõ> nŒFÓ#‚ éíÛŠ{÷^¦§³ÓÒØyyïq··7ôò²áädŒR¿v~~~ ŠŽ¢éê¥#º9 FìµPtÍÕ}jª#Òéa诂tK?V9rëøñ»0{¶×ܹƒ´´TÒñññ ¿Vgee988”––jkË΄€aXBB¤I“P0m †aqqqþþþŸ#Ò)‰¹P͆š¨ÎNT½Š*xž•½%·TLC)ÔA:‹/ЉzÝééì‚‚4š‹eÎb™±Xæýû›¨¨ ä~ŽŸŸß›7oV¬X¡è@/%%eÏž= ÿ~ñ…ãsÄ…w+_ݪ0ÿJÓ|˜¦¢ÃAvA<͸yóf“[ÖÖÖž8qâæÍ›åååššš...ß~û-‘ÁÇÇçСC666­‹ÁÇÇGº¬¬¬lnn>gÎ'''9ÛÿöÛoêêm?‡R ‰D200˜1cưaÃÚü(íêáÇ!!!‡’– Ý¿ÿ£GŽ9¢¤¤äã㣥¥•P7™Çš5kRSS‰ß`K•ÉÉÉ6l¨÷× ÍÉ@îI[›¹fÍè¥K¿:}úATÔ¨¨ãÇ÷[±b¸™™Ž¢CC:Z«DX IDATÇÈôéÓgôèÑááá555áááC† iìa=XXXx{{£`Z ò©y W\÷#ƒ²!0Í@ÅLvÑ 3€‰æô ‚(›]š–Æ~ð /-Íf—R©JNNÆãÆõ0ÀÜÕÕLU•ÞtˆB¢"„={ö(:„/Te¯ð>§àVeñãjŒ ú.ªTf׫~ m Çñ Ã6lØ §§÷ñãǤ¤¤E‹:uJNZˆæÛ½{·¥¥%TUU]¸paݺuñññuËav"’ÚÚÚ”””mÛ¶ÑétOOÏŽ£Õ\\\† ¶k×®¨¨( Ãrrr.\¸°oß>%¥Oý çÙ³gŽŽŽÄ555™™™mêÉ@îLY™ä=s¦Ço¿=Þ³çÚàÁ[Çï·dÉ0+«žŠ é8#GŽlÝ«¸¸¸eË–éëëã8îááqøða9çææ¢`>'¤kó€[µEPûjß·j^ƒ¨†\•±1£؇ÓT-@ÅH"÷1‚ Ò@ ÊÌ,LO•žÎ~øýáC5“Isq1óósqs³è×Ï„FC_¨i–’Œêk_U èêJ†Õ|6™y¨uÅ"ÞÒæ._¾üöíÛ˜˜¢wACCcùòåAAAdrÛ|@ “É&“9cÆŒ¸¸¸’’“6i¼‘0™ÌñãÇ—••?~¼³õd49%eñâÅ3f̸pá¸qãvìØ1iÒ$[[[é«ÎÎÎÉÉÉÒžŒû÷ï;::¦¦¦¶a„èÆ Aº? …ìççêëÛÿ·ßïßÿ—ÏÖ¡CíV®Ñ·¯‘¢CC:5{{{¢Eg€‚i”¨Þ]†iàT¿äÒ–$à•€²¬Ë¦Dñ*€K0%`ôecP6>€Kd¤„"QÁzI»Œ ‚´JAÁG"gQôB"Á ]]ÍFr`±ÌML…‰ "‡š­÷¤ÔzôVFC¤®k×®ùúúÖ›$Aô=H‰ÅâãÇ_¹r…Ï绺º.]ºTMM |||ÂÃ߯¯¯?sæÌÁƒ×=â±cÇRSSwíÚ¥¢¢›””TSSÓ¿ÿ•+WJ½gϞ͛7¿ÿ~áÂ…~~~ðüùóï¿ÿþܹs_}õÕÚµk¿úê+b¡ÞY2ääÉ“UUUÊÊÊ O ÇñØØØßÿ½¬¬ÌÜÜ|áÂ…öööðßžé²ü7hJfü›6mÚ½{7ŸÏŸ={ö„ ˆüW¾¾¾r:3TUU—.]ºsçÎ÷ïßs¹ÜÙ³g×}uРAÇŽ[²d ‘`êöíÛÞÞÞ¨'AÖög$&>Þ¿ÿúèѻnjé»xñ0{{E‡† Hˉª¡èxoÿ1T-QOF[z5¯ûxÅÀ} Üà—øUE­þÆ$ º´ lô^¨š‚ H×"ŠŸ<) º.23 KJ8t:ÅÕÕlìØ¾,–¹““1J… Hsð9¢â'5²kçë5|•¡Eqú¶WÇG…|> ÃÒÓÓ]\\H·•››;yòdùÛÄÅÅݸqcÆ ªªª»víÚ¾}ûƉ—®_¿~ìØ±§OŸþðà øå—_ˆå &èéé@Ý I†íܹ“D"ýøãýúõ[½z5FKIIÙ¼y³§§§4KÒÉ“'SRRvïÞÍd2ÿüóÏððp ýû÷ïÚµkýúõÄfGŽ c³ÙW¯^%z2nܸ1hÐ %%¥µk×}Ò…ztttàÇ))) Oíüùó.\ 500 Ο?/g’Šœ7áÁƒÅÿÛo¿9räÙ³g6l3fÌÍ›7›S&ÄÇÇçêÕ«±±±{÷î¥ÑþSÌÜÜœÁ`üý÷ß<ïñãÇ«W¯Þ¾}»¼_m ¡ž ù²P(d×É“]þø#cß¾ëÇïðñ±]²d˜››…¢CC¤P”qP|p1¸€„þ ËU‘ ¼à—  øÿáÓÿ=NUV‰ÅÜ#€K@Ùú Íº.0 €Ñ È<ÌÒÝ®á#‚ m«¢¢–èºHKËÏÊ*ª­hh±hÑPËÌÎÎ@I uK#Ò´êw‚’Œšâ§ÕïW—çs5CZŸ):t tsŽ ÍU[[[÷ѹ´2vRR’tfÆ¥K—fΜٻwoXºtéìÙ³kkk•••Àßß_MMÍËË ¦L™"]æp8DO†´ÊtmmíáÇ7mÚðàAƒA"‘ÀÑÑQ(ÖÔÔaœ9sæÌ™3¿þú«ªª*\¸paöìÙvvvìïïÏçó‰'ø~~~æææøðჶ¶vrròºuë@: £álŒzdžZRRÒÌ™3‰4M³gÏö÷÷'BmŒœ7ANüãÆÓÐÐðôô‹Åõ~ r…ÂwïÞ‘ÉäÂÂBi")©AƒݺuËÁÁáÁƒ½{÷&æ´!tmE/‰„ë4v¬SZZþ7&M:`k«7þà œÑ×¶®Ž˜ÄW¢† `ÚLm&@Áø˜ püS†Ô—Vk¡ôÊ@T Â*V‚¨æÓrß éÈØþö¨ÎÀ€¦T- õš60zD(»ýQOÚ5|A¤ƒá8ž“S’žÎNKËÏÌ|“›[öö†®®fAAÞ,–YÏžÍúöŽ "uñÛœ’ŒjŒšæ =gfÿ ^½ú1•uÚ @1Òj†•––öèÑCÑ - ­­]XXاOâǤ¤$>Ÿ_o–Æû÷ïõõõ‰eb¡´´”¨uÁ`0àßïûu—RVVž3gÎ…  étúéÓ§ÿþû"CCú›eff²X¬Ó§O¯]»Š‹‹#"""""¤”––»ôìÙTTTœoß¾mnnN&“šsÖ¥¥¥Ð£G™§V\\ldô)³1†aõrm5$çM?ñIiìíj̉'H$RhhèÎ; Pïã6xðàµk×.Z´èÖ­[ÞÞÞ-j¹9PO‚|ÑX,sË<;ûíÁƒ7ƒƒÏìÚueÎïÀ@wT½°ë*//'455oÞ¼éääÄP‚¶Åáp¬¬¬þøã9=ÌŒ3¢££‰åÑ£Gÿþûï F"‘,Y²äĉ†††¿üò‹»»ûg6ØS,ðëpý¼¿ $ $8¸HƦX'ëÉr.!@Ì1@ÝÈ Ûÿ³x%‚rUƒ¨„Õ ¬¯P1•±}Ú<¨| (ê@Q%PbE Dµ@“±9 »dдZv—† ‚t]èéÓ×ÄÜ‹ŒŒ×ïßW©©Ñ ° ÒFõëgÂdÊü›|é8Î?þ÷þý{]]ÝáÇÿøãðo’''' …B<-í€Ç¦"‘Hz¸ö; Òn™ˆLŨLI]œf÷$Sõt씩ª¨p·<†ÅÆÆ®Zµª²²rñâÅŽŽŽÁÁÁÕÕÕsçÎݹs§œ½’““ÃÂÂ^¿~}âÄ .—;|øð}ûöikk‹D¢õë××[I<ÕÑÑiìórèСǧ¥¥)))­\¹òíÛ·gΜi~x†]¼xqÁ‚µµµ?þøãâÅ‹ ==}éÒ¥ºººaaaAAAmýþu.\>|81í€ÉdfffÖÛFGGçíÛ·Dš¦wïÞ€¶vk*W‰Åb`0K–,±³³›?¾••ŽãÇ—n³~ýz±XMKK[ºtiKÛozX‰ ôî­ÿÓOÓV­yäÈí͛߷ïúŒîsçVSCI» é2“ɬûcÛŠˆˆxÿþ½ÂƒÉÍÍ'&lR(ò@u@0{÷îMMM}úôillìœ9s²³³[ß–˜™ëŠöY|ˆ·Y"wûš¸,«KÉ=Ôld¬O_U¹2Ö³SV®¹{S¡*GÆzÓ j-cýuo(ϱ~ÔSÐì+cýÇôOíSÔ¢ Jª@תF£sM†§‰"»SD&eæ·AAº¾²²š{÷^¦¥±ÓÓÙÙÙo…B±±±6‹e¶jÕ(WW3KK]2Í?Fä‘H$_ý5†a æææoß¾=|ø°»»{NNŽ48™LŽŽŽn¡B2uðá¾pb^ú¼¦"ŸWžÇ+Í®-Ïã ªÅkŒìüdÌú5öBs¹š+&&&###99yòäÉ£Fzöì±¼hÑ"ssóÆöZ»víéÓ§¯]»væÌ™„„MMÍ %&&îØ±£áJÇåw.þïÿ‹ß±cÇСCããã¥Ë›Þ?~|÷îÝ€€€¹sçÒh´)S¦øùù%&&Þ¿ßÏÏoìØ±Ä8}¤ùf̘1oÞ¼ï¿ÿþÛo¿íÑ£ÇóçÏO:Uo›#FDGG3™Ì½{÷8°Éi RÒŠß<ï—_~±´´ÔÑыŽ{÷644,(( WUUE¤W¢R©êêê{öì9räȈ#Ž;Ö£G&“ûâÅ‹#GŽÔ;„§§ç®]»òóó÷ìÙC¬¹víš½½½žžžtAImmmJJJll,Q¯Bæ©5êøñãzzz×®];~üøùóç “ɼwïžO÷¨1͉¿.éûÐX,Þ¶mÛ¨Q£ˆ 4Ë–-›5kÖµk×êeÐ4hÐÞ½{---55ëgr–þ.@Ú7Ó"¨'AOŒµ7nœ0oÞ C‡n8p#:ú~PРÀÀêêÊŠ iOŸ>]µjÕãǹ\®……źuëüýý¡Îà—ÐÐМœœèèh …²aÆŋß½{—˜‘——W[[Û‚ÉÍÍuttTQQ‘ßÑ1ÁÄÇÇ÷Ýw&&&ááááá៙ý¶9ŽÝ~nÇ8[Êà¿¥ÑTH@Õ€^Ãd¬§4ò¥—a¸¬¾¬‘·±‡¨ËX¯ÔÈí#ë09ŸæL™þ©×AÙ@öö§e¯oLòÛ‚ È—êÕ«½zü¸àáÃWÙÙoÅbÜÂBÇÅÅlÖ,3 V 9D¾XÇÏËËËÍÍUQQlÚ´IZ0 ›>}z{]æCØö;RÏßgÞ?<ðNX+&)aft-K†É u-+†ŽúFü¹‚ƒƒµµµ'L˜ß}÷t¹¬¬LNOÆŠ+<==¿ýöÛuëÖ 0~úé'{{{‡óË/¿4\ÙdF~ ÃŽ=Êb±~ýõ×C‡iiiµ4¼ùóçëêêúúúŠD¢ªª*VQQÑ«W¯^½zMœ8ñãǨӱˆJÔ‡^½zµ@ èß¿ÿúõë§NZw›o¾ù†Ë冇‡óù|WW× ö—Vü¦Ñh}úôY¿~=†a+W®Ü·oßÑ£G­­­kjjBCCOœ8!Ý+ àêÕ« S§NåóùáááÕÕÕööö?þøcÃC(++;;;¿}ûÖÂâÓ¸ÀÍ›7¯]»VOOOº Ã0CCÃ"‹ƒÌS›2eŠP(Œˆˆ¨¬¬433Û²e ‘3jÉ’%ÄÔ¢%K–\¼x±9§ßœø¥çÌ™“ ó_òéÓ§ËÊÊæÍ›GüØ«W¯™3gîß¿ßÅÅ¥n§ÅàÁƒOŸ>½dÉ’†-Ô­¾.­_Ò"1'A¤®ª¹uòä}‘HÀ ò65Es™#>>>  ×jbò»œÔO¶¶¶>>>!!! ã÷ß_´h‡Ã¡R©†¹»»oݺõÊ•+qqqgΜ¡Óé ,¸wïÞƒˆ׬YÎd2›Yg¢‚±¶¶VWWg±Xéé馦¦'OžôôôTà;£¡¡áë룯¯êÔ)¢ÄÖçÀ0,..ÎßßÊAîÏð*D\À0z#ÀçògAAº.W‘QøèÑ«‡_=~\PZZÅ`Pûö5rq1uu5sv6ÕÒRQtŒH§ãççgÏž•¿ÙСC}||ÂÂÂd¾*½”v9`öóÏ?oÞ¼¹¢¢bذaQQQººº†EGGOŸ>½î‚´‹Bº\/)Íܹs‰£H[&ÆÐ¬_¿~Μ9Ò•õ’Û…Â5kÖÈ{Ô˜f~¿T‹ ’+éšd#î0ó@,À«Þò9oøUoL}ª‰·Œ“úðOmY·Goe 3:I õ€¶™ºß¿[–¹Wjj*‹Åb0ׯ_'rãðx<ƒ‘••åììÜp¥]s¾Þ»w/77—ÞdxuÒÒÒ\]]¡Î9..nÙ²e4ÍÇÇgÞ¼yŸŸa¸;!®67oÞTt !,,¬wïÞÓ¦MSt ÝGrrò† êýµBs2‘¡Gæ÷ß^µjäo¿=>xðæ/¿Üqu5[¼xè°avhP[·‘ššÊd2Éd2xyyñù|‡CÜóI¿„‡‡÷ïßöïßïèèHìxïÞ=???bœšbƒÉÍ͇˗/oݺuêÔ©ùùùuGÌud0PUUUVVVZZ5mÚ´6 æ-g`矠( òŽAñ5ÀH ©S0ƒ„2}#‚ Ý–D‚ÿý÷›´4vffaz:» à#‰„õº¿þÚ‘Å271iM²lièÉ“'Ë—/oÑ.‡¾xñ"‰Dš;wî¬Y³þüóÏèèhâ«tA¦zIiŠ‹‹{õêU÷!,‘ZÇÙÙyΜ9Ò½ê%·Ù¹sgRRÒåË—‰6"‘¬‚j-!¬•¼¾]™w¥¬ð>G"ÂYK ºnOƇj³âJ«Þð9Eüš÷BÀhjJ6¾Ú2{2zØ*÷°EÓ/:¢§ÁÐÐ0??Ÿø(åç瀾¾¾Ì•ÍióáÇÉÉɽzõÚ·oß²eËZRÃç!#GŽ,((ÈÈÈHLLŸŸŸŸÿðáC™³º¢´´´†ë§OŸ^÷ï‘B ž AE¡ýü\ýü\ÓÒò¸1kÖ1[[½Ù³=ýü\QIðn ¢¢"22’bmýŸRÆÆÆPXX(Kkee%}µººZÎW²Ž ¦ÿþÒþù­[·²Ù캡vd0À`0–-[¦¡¡±xñâÐÐÐ6 æ?Èt0öc?¨Êü“w xÅ@¦‚XdÔ“ ‚t+åå5¾JKc§¥ågg¿­®æ«©1 0Ÿ<Ù…Å2wr2VUEݶWUUU·Š¬ô©eyyycUÖvìØAŒk‰ŠŠêß¿yy¹4”ü¬PM&¥!ÆÐÔ[Y/¹ÍñãÇeްi)_Rx—“{©¬ðn¥X Ç%@"cX§,e-âJªKÜ¢š÷‚ÚBºº’õXÝ™!^S,P7¡y¨«RÕ hj†4T»Ë™9sæÆmmmÕÕÕ—,Y2fÌ ™+‰íËËË›“ÁçógΜ¹gÏkkkooïñãÇ›šš~fxNNN¾¾¾!!!...8ŽÓéèoÓ'55522rÆŒݦD ‹Åê´3iгHAšÆb™³XæÙÙoýõîºu‰Û·_š1ÃýÛo½45ÑÌý.ÌÛÛÛÍÍmûöíýúõ«wËE ~ÑÓÓc³ÙD§E^^žôÕ‘#GJ—]]]›™`ª‚©¨¨PSS“Ö‰RVnƒQT­ÆÜÜœÏç€P("‘e»Pµ†¾àø#”Ü€¼_áÍ9 µY™AQˆ†/0 ³²êÉb™MŸ>ÐÑÑÕëF:€¾¾~NNŽ4?Lyyymm­üÖ–––Ä‚­­-¼{÷®aS™¢¢¢–-[¶{÷îÆ’Òchê!‚‘Þý66¦™„µâW7*󮔥UáÃ%8À¿©L1(ɨi5-_"ƱD„+ëȸ¹ýðOíÍÐW5ïÂÚO©VIdŒ¡­dÀR“Ù“¡ë òõÁ6W„(BHHHuuõ„ ¸\îðáÃ÷íÛרJðöövtt,**’ÖÀ¨+<<ÜÆÆfÒ¤I°pá¹sç^»ví3Ã;zôèòåË:d``]·+ôK àü*‘€#æsÄÄSÚ«_skqwÞÞÞÞÞÞŠŽâKz2i®Þ½õ·mó_ºô«cÇn>|ëðá[~~®³fyZZê*:4¤5„B!‹Å²²²ÊÎÎÞ¼y3”••Õ½2mÚ´ˆˆ;;;ƒ ÿŽJ+//'6ÐÔÔ¼yóf¿~ýàÔ©SfffŒ‹‹‹¯¯ï’%KvïÞíââB|µST0ãÇߺukïÞ½÷îÝÛ¿CCÃÏFŒ½†A¯a <U/Û¾}Aigµééìº/ètŠ««ÙäÉ.ŽŽFNNÆ::¨t*Ò¡ÆH$ÕÐиsçŽü]rss‰»¾/^`fdd$s3b&ñ›7o¤k&¥©·‹´»¢®zÉma#Äxù{Yà €ÿ¤#—ˆðÂ;œ–vcˆx±T‰Ä\Ä“kÅdI×^Ƹª"þƒÝE|ŽXP%âsÄ|ŽXX+m剧mn¯Üƒb>\SE‡¢Lü׃ÂТ`¨³Ó«›æ¾±e9{Q(”ÈÈÈÈÈȺ¯Ê\ ·nÝ’Óæ¶mۤ˛6mjfx ê.:ôÙ³grÚµH„8ÿßÏ£ Jį«ô¤è9Ëø[œw¹üöÆï?IÌz¬ö—Ö“t$Ô“ HËjþðÃø•+GÄÅ¥ýúëÝ_½ëéi5k–çðá}Ð(¹®åçŸ^ºtihh¨³³sXXXeeåøñã³³³¥„……}üøqذaÛ·o¿rå …B€º3ë¥õ$£££[ý¼¾ÕÁDGGÿïÿ‹ŠŠruu=sæ ±±¢‚Y³fMff¦]ÿþýcccÛ$˜f¡¨–s;¶ ‚ mD"Á_¾,IOg§¥å/ÀÄDÛÕÕÌÏÏÕÕÕÌÂBWI ÝR" îììÑÕÕ½ÿþš5k†Îçó‡ röìYiú&™–.]:jÔ¨ÚÚÚ¯¿þzÿþýPg ‹tá§Ÿ~Z½zõš5köîÝ{èÐ!bdžIiä'Æ‘©±6Q5 R]*n_½ákÄ«ÕéÌ 7|èI×”ý(‰©GºÕL‰F"SITU2™ŠQ$Š2™D‘ݹ¢¬Cº¥=‡û ÞÈ‘#›üvÖyšU,ORó^(¬ó9Ÿz&„5bAµ˜©Oµ##¥UAråÕàúó´ÈTÌÔGCfOFÞÊßÕí™ SU•(ÊöL¨ÐT P±F¤£aÝï³ HÇ+)áœ:uÿøñ{åå5C‡Úy{zZÉ „4S|||@@Àç\«[= ¥OŸ>£G¯©©Y¸p!‡Ã¹~ýzcZ¦¤¤èè4ñ$Ó"†ÅÅÅùûû·bßNÇñ˜˜???í?7»ò{2***ˆ"™““¨ªªÓ€ÚJnn®••U“}LaaáìÙ³SSSÍÌÌ8àååÕV-#‚t0ÇóóK?.xò¤àÑ£‚ìì·"‘DMáìlBt]ôëg‚êu#ÌÏÏΞ=«è@ÚQVV–ƒƒCii©œLý‚*qìª[E÷ªuh†$†ÈïÉвaL:Ý»‚E/¯Rô!»–˜3!¬‘ˆøa­XX#Q7¡Ù##ƒ÷›œK‹r¥?*1HT&™Ê$ë;«z|/#©·LXü¤†Ê$ÓÔÈ2•I¦2Idj‡Î™ žftÚÚÑH'—œœ¼aÆzOÃМ AÚ@ÏžjÁÁ#,rîÜÃ_½pÐÞÞ`út÷‰™LÔK¯`­·lÙ2}}}Ç=<<>,gãÜÜ\9¯¢`¾p†MŸ>½¥{ÕËcV÷ǶRPPÒI‚Y¾|9•JÍÊÊŠŠŠš8q"›Íf2Q†YAºŒ×¯?¦¦ægf¾ÉÌ,ÌÊ*ª­ÐéCoo›U1Ùhx IDAT«F::ö쩮褪;Â&<<|È!ò SUÉôå’®N¶](¨–€o¼¤7·Tx/²®®DÓ ÓÕ•hêJt 2]ƒ¢j@mû“ANL,ˆx¸ ZL¦bÊ=dÌ|ª*âgŸÿ ¨ ¹Q­DÈËÚ6Œ!›dÌ=*Ïå=T2…ItK(Q™dº†ìGµ=™OÛR™dª*™Ê$c¤&FŽ2´(fCÛþ; ‚(êÉ@¤Í(+SÝÝïÝË=uêþºu‰7^œ0¡ÿôée¾C:3{{û¿þúKÑQ|‚‚é$JKKëÎ/3fŒ““1…åýû÷ÏŸ??qâĉ'¸\îðáÃ÷íÛG|&¦_¨ªª†„„ÄÆÆJ$’ððð¶ŠêéÓ§«V­züø1—˵°°X·n1‘ðäääÀÀÀÐÐМœœèèh …²aÆŋß½{×ÅÅÅÔÔ´­bøü`nݺmllºuëÖ¬¬¬´yx‚ m…Ë<|ø*-íSïEI Ã0+«žŽŽ†¨â‚t˜°!`Êâ¤w‡{}èUrÅÓ_Š?¾à’ȘDŒË|,Š‘°ò<.¯Rįó*EÊ=(Ó®84ÜXX+y_JcÆ ___*• k×®=}úô•+W’’’._¾L§Ó,X ‰ˆ‰I9m› ¯ÕÁäåå“0²³³I$’ž*h‰ Hç‚ãxNΧbÝ™™oòóß‹DMMÓéÓ²Xæ}û«©¡œQÒ¡Z=†¤„™Ó4¦Yü´úé±â‰ŒuT´ÞTú£ F̯‹xb…ÏeŸÿ ¬ k%bÁÿ× V5 N¹hßp{^¹(=ê­D¦aTU2™B¢0HJÊ$š*ÙÈÍâúâˆxm©@"a­X"Æ…5‰ÖŠiªJ2ë:p ùéûßÛ{áb\P#Ѷb|µSVEz6ï·Àÿ/_O¦bJtE™¬mÃÙ“¡¬Ké=±‡D¦bT52™BR¢“(*$ªŠì¾-KÆ„S¶Í?_k~7Fåîî§è(nõd Ò^TUéÓ§œ>}`z:;&&e×®«?ýt}„þî}ú4½?‚ —ˉ‰9pà€††Æ‚ ¢££ë¾:~üøyóæ½xñÂÆÆ&..nÖ¬Y[¶lY·n1™à§Ÿ~²··çp8jjjÄö111?üðƒ§§'ñjß¾}Û$ÈÔÔT&“I”¬ðòòâóù‡(¿±bÅ OOÏo¿ý6<<¼ÿþ°ÿ~GGÇ69nÛ£®®999S§N]½zµ±±qû‰ ÒLee5½JKc§¥åÿóÏ»ª*…Bvr2öò²^´h‹enb"/ ‚ _/'æÈ}–e/¹Yq¥9Ie€ãñ¿ýhYþg 8U…ÜØc\`ö¢N¹Ø‡XÆ%¸ ZBôj4¶½X ©*â‹x±çsÄ‘DÄ•k$jF4™=•¼ø‰Ïëö|(1H ªO¶MÆ“k^¹(óT ©$% (L‰„QUÉæ_i6Ü^"ÂkJŸN„Qþ=SŒ rκë"~GÄ2ñæË$%’JOÙ“x•¢W}*'‘àÂ÷eh)Y“ñ·€ó†wókñp¢gKP-Æ% iF±×¢áölÞù©Ù ×kY1&‘Q¬#c@¦btM‰„Q˜$Œ„QUÈ -Ù:µ­S.ö!ÓId ‰¦Öô/TY›ÒwVÏ&7Cä044ìE‘Nõd Òî\]Í\]Ͷnõ¿zõïS§R†ßin®ãëÛÏÏÏÕØ}ûmc2G—7YÍøK¦ù0 ëüAvŒ+W®N™2%66ÖÖVÆ#55µQ£F;wnÖ¬YOž<ùã?.\hañé› ±ðæÍ;;;bÍ»wשּׂ­‰eéÂ竨¨ˆŒŒ¼wï^nnn½f‰þ€ÂÂBsóOßo­¬¬Úê¸m ‡Ã‰ŒŒŒŽŽŽŒŒœ6mZ»‰ Ò@ôôéëÌÌ7ÄÜ‹’k³XfcÇ:9:ÚÛ*+£üøÒÝhY1¼ÂŒf÷úûôû~+•ˆ@"‡½[™Í#a45²üçÅ*=©_GµàÆŒ¡MºÕLÄ“H8Ÿ# %"ž”µe/iŽÌxã~‘qã]žÏ; «çÀ’1)NÆùr?ŠÒöËu{z4Lh2{2ÈÔO‰•”¨$2ª #aÕP7¥Mø¿öî=.ª:ÿø{€af`†ûEî×AP.…¢éª+®¢nˆ¶Y¹n^2*K Ú$ÓX·ÜÔ2Ù¾)hš¿ÒUÈZ/ä P‘DQãÎÌpf˜ùýqjb H¹ —×óѣǙÏùœs^3(ÂyŸÏç“æÉÒaéóu˜ó÷^CØêOßÖÍçÖ6«§‰ž`¤@%†‡£7ožï¼y¾?üp7==çÓO¿ß±ãTDÄ„èèÀ™3½õõñíh`4662¦¦¦§OŸöõõ%" ›Ñ¸}“——ø@ËäÉ“µ›½½}PPPVV–³³³µµµ©i7¿ò-Y²$99™ÏçGEEñù|{{ûòòò"*//'"[[Û®',))aÆd àZèáááÁÁÁÉÉÉ~~~jµšËýun"²±±‹ÅLª²²n~!@} SQQÁãñ.\¸àà€……`HUTÔ3FåæŠ‹Šî+<ž>3g”Hä€ÅºÆþ”WìýWÙ©ý!­¦]¢ìéñv­ÐçëºFvóãhOŒì94ÛÀ^_Ó¿ëx¶A÷KþpÍô‚Öv3ÙǨûM§Óí,I<³î+1c½ ²èæº=T ,ØÝæÑddÇÑT’tØ,6ïç·©«ßýû5uå.?ý#ª ­Øañ0ÈX£ÓçÊŒÃèß$#||ì}|ìß~{Áùó·Ê]¿þ Z­ž1Ã{Ñ¢€iÓ&èêbeÈ~111Ñlóùü®/„ŸŸŸ¦>QUUµtéÒ^&êì0ZÁ¬\ÍL4êy{{?~¼¼¼|×®]>>>O>ùä /¼ÀL‹¤1oÞ¼•+Wîܹóã?&¢+VlÞ¼ÙÓÓÓØØxíÚµsçÎíúu}ûí·Çoee§iOKK qqy„‡ªºR(AAAB¡°¨¨hË–-DÔÐÐÐõk“””äååÅãñ˜ëö²6†V¼þúëb±øÀ@"‘‘@ ÐÕÕíg€nõ´XwPËÊ•a"‘ëË8Fº¾çc]–Ù``ÕýMöQéQï¤sõ<»«4ôÄÀ¼ûJCç7Ñ{¤Ù8Fº”§§Ê À°…Jh‡Ž+,Ì#,Ì#!áGŽäedä¬X‘âæfõ§?M^°ÀßÙyLÜ&Ö®üüü—_~ùêÕ«mmmnnno¼ñ3…%‹Å:sæLlll|||IIIjj*›Íþûßÿ¾fÍšï¿ÿ> @sc:..îÍ7ßd³à×›nèTª÷Þ{oïÞ½UUU>>>Û·o é¶‘þ·À Ùf±XŸþùË/¿,•J׬Y#‰âââš››Ÿ{î¹íÛ·÷tT/‘˜Ûß–––µµµ&&&o½õÖ¾}ûÚÚÚfΜùᇚ››wýßzë­gžy†ˆ$ ŸÏ×Ó©ÿ溺ºnß¾}óæÍx饗Μ9Óu¯Áܹs/^¼AD7nlnn^°`æcéÚùµ×^“H$ .T©TÛ·oÿæ›o˜öØØØÔÔÔ>߯߳gϺuëâãã'Ožœ •JçÏŸßueò„„„úúúÈÈH“ää䬬¬^þÜj% ³Vg×I¥˜)Îú€¡R©oÝúu±î²²šÎN•™™áäÉÎÏ>è2a‚­@€Åºa”»{÷nFF†¶ShßÅ‹¦›®>«Û)ƒ´F 0<\»V±iÓaoïx›çÎ}ÿßÿ>WS#Óv(íKOOïÛ÷j"ÊÍÍí¥Ãøñãÿú׿ŠÅ⪪ª””‡#—Ë™§Nš  ¯\¹RXX®««Ûõ„7oÞ‰Dƒæƒ>ppp8{öì½{÷ÌÍÍ E·Ì%jkk5—c¶‰hîܹuuu‡&¢Ù³gk¶ËÊÊz9*77·—χéöî»ïº¹¹]ºt©¸¸xÚ´iQQQšó0`kk+ÓròäI''§¤¤¤êêê‡üÄ4§JOO¤CF(":|øðÐ\ëÆ,«®®a`t««kúæ›IIÇþøÇBáF›œ^þãw$$|ùõ×תª$Ú0¤-Z4Ôw[†7mAþõ€á¥³SuùrYB—'&ØÙmøãwìÝ{¶¶¶IÛ¹´fð*‰D©T2ÛÅÅÅÔå>þ¡C‡ÔjµP(Ü¿?Ó¡  à>ýôÓ{÷îÔ0&LHIIaU*Ucc£J¥ê¶QÝsMâôéÓjµº³³óm&OOGåææöòù0B¡pß¾}L‡7n‘T*íúvUQQñúë¯ÛÛÛÇÆÆ^¾|ùá?·1RÉpss«©©ùÝn'OžìöWñøøøÞôòòzå•Wd2ÙO?ý´`Á‚éÓ§²0jµZ.W\¾\¶wïÙçŸÿÌ×÷ ›ml^ Þ¼vmÚÞ½g¯_¿ÓÑ¡ÔvF€>©3]Àh¥£Ã r rÝ´iNVÖ£G¯nÞüõ–-ÇgÎôŽŠòˆ˜Àáà×ÀH$[·n=þ|ii©‡‡G×]ŽŽŽDTYYéêêÊ´…®¤Ré‘#GvìØ1¨anß¾=~üxf›Åb1³ZuÛØ >ŸO¿¬´Üu»o‘ºª¬¬tssc¶™»wïzyyÑ/`WŽŽŽ[¶lyóÍ7322V­ZÅf³srr&Æñ«Ïš5K­V÷áüéééëׯ·µµU«Õ!!!Ÿ|òÉ( cVqqUAA%ë€Q7`˜âñô£¢ü£¢ü[Ž¿~ôèÕgŸý?Oúô øÃ¤éÓ'r´qd NNNöóóS«Õ\c3÷úmllÄb1³ EYYY×c¿úê«)S¦ j[[[±XÊô‘H$ ÛF]]]"bn+ß½{÷‘.ÝÓQ½|> {{ûòòræó)//g3»z*–_¸pA&“-Y²ä‘BB?Mœ8‘Yˆb8Va`Ä‘ÉÚ._.gªÌbÝ::,w÷_ëvw·ÒÕÅbÝ0Ú ’é©alìÔØØ©Ië©S…Ç__·î@g§ÊßßiÞ<ßyó|­­ì~ú˜¢P(‚‚‚„BaQQÑ–-[ˆ¨¡¡A³Þ5ÅÄÄ$%%yyyñx¼¸¸8"bÖ»&¢¬¬¬°°°®gKKK éóºÄ݆ùË_þòÖ[o¹¸¸¸»»§¥¥½õÖ[UUUÝ6òù|“¯¾újñâÅï¼óÎÃ_·—£zù|-,,V¬X±yófOOOccãµk×Î;·§"r¹üСC}ôQGGÇš5k>øàu8x(*•úÆ»99b¦zÁ,ÖmnÎ÷÷wbëöò²ãóñÏ Œr¨dÀˆabbØÐÐ’•õÉ›7½yó×!!Â9sDO>écaÁ×vÆ‘dÏž=ëÖ­‹ŸW2º SPP —Ëcbbêêê&Nœxüøq>Ÿÿꫯþ¶‘ˆþõ¯½òÊ+¯½öÚŽ;>þøã‡¼n/Gõôù„‡‡‹D¢{÷îmܸ±¹¹yÁ‚mmm3gÎüðÃ{ºÊ‰'Nž<¹}ûöààà¾}>0¦H$­×®ÝÉÏÿù¿ÚÚ&–PhíïïôÜsáþþNã0ðÆVߦxÚÛÙÙ%ÇŽåóÍ ™¬ÝÃcÜŒÞ3fxºhFŒtK–,Ñú÷êÂÂBŸÚÚZssón;°X¬Ã‡/\¸pˆƒn,+==}ñâÅÚÍðÛÆÜÜÜ€€„>a`¤“Ë•7nÜeª×®Ý‹k‰ÈÚÚØ××Á××ÑßßÉ××Q xpžC€±c2`ãrÙ3fxϘáÝÖÖqölqVÖÏ?¿´k×wãž|râ¬Y>¾¾£¦¤Ñg™™™³gÏþm{|||RRR/z{{Ï™3'11±¥¥%11qÚ´i=•1ˆÈÍÍ-<<|ð€¶4662¦¦¦§OŸöõõ%"@0€—øî»ï6lØpëÖ-''§÷ß¿Û?!C†!“É„BáþóŸ^ÊCfùòå©©©Ìöœ9sŽ?>€'í’˕ׯßaÖºÈÍWTÔ‘¥¥À××ñ©§ tñô´52Béàg¨dÀhÀãéÏšå3k–Og§*7Wœ•uãØ±ü?üÖÚÚxæLïY³|BBÜõõÇèw¼Y³fõmHGzzúúõëmmmÕjuHHÈ'Ÿ|ÒKçÒÒÒA ÚÒuñf=’¿ÄÊ•+W¬X±zõêƒ.]º´ªªŠÇãi+ #))©¦¦¦÷>C¦´´4##cÆŒD¤™Û F(•J}ëV5S·Èɋŵ E§±±APË¢E"‘ƒHdomm¬í˜Ã&W€QEWW'8ØíÍ7ç_¸ùrâ /L»}»îé§SÆ}É’víú®´ôwîN‚ÆÄ‰¿û¦¦æææ¬¬,WWWm'‚a-???22ÒÌÌŒÇãMœ81##ƒig±XgÏžuttܳgO\\œ•••]JJ —ËÍËË#¢ëׯ¿ñÆãÆ[½zµL&‹ÅZ CDeee­­­ýÏÐÿ0¥¥¥"‘ÈÐÐÐÄÄÄÐÐp#ÀШ©i:v,?1ñèüùÿš0aSDĶW^É(.® óøÇ?–œ>½ñÆÍûö=7kÆ o”1z1FŸP€±ÀÁÁìÙgß}6¼ªJzêTáwß½ÿþ7[¶ügâD»ÈH¯éÓ½|}utÆúÜSeéÒ¥)))<ïøñãË—/ŠŠÒ××'¢M›68Åã±CB„Ì"áx Ÿ._¾Ìçóuuu‰(,,L.—Ëd2 "Ú°aChhè3Ï<“˜˜èïïOD;wî‰D]®¨¨Ø¿OSK M˜óçÏGGG숾…aflóññÉÌÌܶmÛSO=U^^®§§ÍŸÜ.^¼XYY©Å0d¦Njoo¯í#CG‡2?ÿçå. î–•Õtvª¬¬=æö ÓE"û l±R7@ÿ¡’cˆ®®ŽHä 9ÄÅͺu«úÛooþ÷¿7ããlÚt80Ðå‰'<ŸxÂsâD;,ЉdëÖ­çÏŸ/--õððèºËÑÑ‘ˆ*++5s” …Â///ÿòË/—-[6wîÜþ¯9Ñç0ÍÍÍ!!!ý¼ú€„ñ÷÷×,*³qãÆmÛ¶‰Åâß~nCéŸÿüçáǵ†LzzúâÅ‹µb˜R«Õ%%ÕLÝ"7W\Tt_¡è411 t™7o–»$¨dÀ%Z …Ö«WGÈdíçΟ>ýãÿýß÷ï¾ûKKÁ㈘îanÎ×vL€#<<<88899ÙÏÏO­Vs¹¿>ƒ¬££CD666b±˜©”••iöJ¥RfÈÂþð‡öööŸ~ú©ÿ•Œ>‡™5k–f;000777 @[a$‰‘‘Ó‡ˆ ú™¤ÿ-ZtèÐ!m§€Á…rþoÕÕ5_»V‘“#ÎÉ)/.þI&kçpôD"‡À@—•+‚\œÌµ`”C%Æ:##îܹ“æÎDDõÙÙ%ÙÙ%¯½v¨©©ÝÉÉ<,ÌcÆ ïððñŽ6¿aFGGkñêð0X,šéRÆ"ªj1¬n1¬m5Tªt´jH)Š   ¡PXTT´eË"jhh`æPbÄÄÄ$%%yyyñx¼¸¸8úå†i``à²eËV­ZuàÀKKKftBZZZHHHŸ×Ìès˜ÆÆF¦ƒ©©ééÓ§ýüü´& **jíÚµï¿ÿ~@@€]ÿÃÀÃhkëÈË»“SŽå.† T2~åädîä4eÙ²)J¥êêÕÛ§NÝÌÎ.9pà‡£èîæ!9 e$‡E‹ å¡oÔjºZ5nsøs^©Õ,‰œSÕ¿ß$¨n1¬n1¬nåW·6wè?ü9-Zäà0¤ÞúcÏž=ëÖ­‹Ÿ|xáÂ…£Å0`‡av©QÅb…u2º.wQPPYXx¯µµÃÔÔ0 ÀY$²Çrà Ædü þ¼y¾óæùvvª ïeg—œ;W’žž¦V«ýüœfÎô óðñ±ÇÄâ@D$ð ÈÓt*””ͤî$""U—ª‘²…dE$û‘HMÖk)e¿dffΞ=û·íñññIII½èíí=gΜÄÄÄ–––ÄÄÄiÓ¦õt³žˆÜÜÜÂÃæÏaà·ê뛯^­((¨ÌÉ_¿^)“µ1Ë]ˆDÏ>ä‚ÒÀ°…1}Q]-=s¦øôéÏ+fjDDx>ñ„çÔ©BÌ>$ù¾ #…¦˜ñ:zdþÍø~hciÙ7Ö¯_Ÿ““£V«CBB>úè#fI „Vaz1cÄh“¡PtÝ¿~½2?¿2?¿¢¤¤º³Såà`æççèëëäëëàãcohˆµFT2ú«¢¢þÔ©ÂS§ /_.W*;'N´ ó÷xì1W}} }«óéT8u¶öX̘‘M–¡C›  _PÉ#Ft%C©TݺU]PPyýúë×+ ïwt(ÍÍù“&9øù9NšäèëëhaÁ×vLxd¨d ‰¤õûïo;W|î\É;õFF¼ÐPaxøøðpgg m§ƒ!Ww‘¾›N*ùÿÌ.ED,=²¦ÙZŠÐG}«d(•J6›][[ka1ßð´,+777 `@‚u«§´,kÀ?™þY•ŒŽe~þÍJÝåå5J¥ÊÊJ0i’£Hdä:i’ƒ‘OÛ1 ¿ð°0À€111˜;wÒܹ“ˆ¨¶¶éÒ¥²ìì’>øæµ×YXð§Lq ó˜>}‚‰¶“°˜BO§Ó³HMD]Šj%5æÓµ—iü‹d`¯µxCBWW755U  óÓæåå>Ð2yòä9ù }c“BÑyíZ…¦t!×*ff†“';Ï›7 +uŒV“0è**ê³³KN*ßÓÓóÂ… Zžšd IDAT “——Çú_W®\yøÃÇÎSù¹¹¹S¦L100pvvNII!"‹UWW§P(ââ⬬¬ìììRRR¸\n^^žJ¥Úºu«›››¡¡appðùó癓°X¬´´´®tZfï±cÇìííÍÌÌvîÜIDùùù‘‘‘fff<oâĉ]cëêêšü"99ùÍ7ßì¶ŒQ[[Ûõåܹs˜íšš6›}ëÖ­„„ ‹§žzª¾¾^óŽêêêärù‹/¾hmmmiiù¯ýk ?÷QD­VW:”›˜xtþüyz¾±mãÆC•"‘ûï.:}zã›÷í{6.nÖŒÞ(cŒ˜] `èp¹lf4Õ×7_¸Pš]òÙgçßy縙™aHˆ0,Ìã‰'<ííMµ”à ú˜rV‹EV“Å""–ÙÍ#Û9t÷(n¥³¤Èsd¦í¬ÆÄä×©Òø|~×—eÇŽ—/_ÎÏÏÿüóÏW®\YTT¤­0~~~L™„~yf_$=üá,kÙ²eixZºtittôÑ£G/\¸=oÞ<¦=99ùرc™™™\.wõêÕJ¥’ˆ>üðÃÝ»w§¥¥¹»»ôÑGóçϯªªÒÓÓKMM !"ÍÆ#–±k×®«W¯~ÿý÷K–,yî¹ç–.]‘’’ÂãñŽ?¾|ùò¨¨(}}ýòåååýûßÿ~ ýûï¿ß¹sçõë×»þ!\²dɻロ””DD‡ 9räÈ_|qøðaSSÓÕ«W?ûì³GÕôOJJ:zôè‘#G¬¬¬žþùúÈGƒââ*ͨ‹ââŸd²v}}½I“D"‡e˦ˆDnnVzzx ` S€¶Ý¾]—šzáùç??þ5›ƒƒ7¿òJú×__“JÛ´ Ψºö|÷{k²ÕjÕÐHD”››ÛK‡k×®MŸ>ÝÔÔ”Ëåz{{§§§k„ &¤¤¤0*•ª±±Q¥êþ/Â#V­VÑÑ£GÕjugg'ÓS"‘(•J¦gqqqO_ާŸ~zïÞ½š—­­­{÷îõõõ}â‰'~ûGQ*•r¹ÜüQ­V‡‡‡úé§B¡pß¾}ÌÞ7n‘T*UÿòÕwqqù÷¿ÿÍì½~ýº&ðBDš¿=9þÖ7ßÜèÏUª«eß|sãÿ8¹xñnOÏM66/ÚÙmxüñ­¯¼’ž‘‘óã?ut(ûs~eðd€ö1ÓOíÙ³âÚµ¿8°jÖ,Ÿ+Wnÿõ¯û}}ßøóŸ?Þ½û¿7nÜÃôS#ÞøõôÄq²˜Úý^ËÐ_g –.]* ¯^½zûöí 6,_¾¼££ƒÙµiÓ¦ƒÞ½{—y²þÔ©S©©©š'닊ŠNœ8a``àää”­Ý0šHyyy ,èý*Ì€€””” 6Èåò^z^ºtÉÝÝýwÞ©©©éç[vïÞ½uëV''§§Ÿ~úæÍ›ºººL{ee¥««+³- ™Û·o?žÙf±X&&&Ý®wò¨§eØÙÙ‘ŽÎÏ?îJ$’„„„ððp[[ÛžÆCH¥Ò#GŽh–ˆÈÊÊrrr*((øüóÏOŸ>½xñ⦜222š={ö‘#Gîß¿íÚµèèèÊÊJ777f/³q÷î]MÿŸ~úÉÃÃÙÖlŒ,UUÒU«ö-Z´ëĉ‚G:°¾¾ùÔ©ÂíÛ3W¬Hñó{Ó×÷§Ÿþ÷±c×­­ââžüÿomqñ»gÎl|ï½ÅÑÑãÇc³ué-ÀH„Ù¥†O?"Â3"“ˆjjšÎ+>w®xïÞsIIÇ4ÓO…† ‡×ò°ð°lç<ò!µç©½ŠìþH:ƒ»òð`»|ù2ŸÏgî>‡……Éår™LÆ,t¼aÆÐÐÐgžy&11ÑßߟˆvîÜ©™¸©©©©¡¡¡¶¶v÷îÝ111åååzzýýé¥Ïaï½÷ÞÚµk÷*ýë_­¬¬¢¢¢”JeSS‡Ãé©ç¬Y³Î;÷ñÇOž<9""bÍš5AAAý|Z4kÖ¬ŠŠŠëׯ=zô‰'ž‹ÅL»X,f¦Š*++cmmmÅbqhh(óR"‘M•¢Ï§eŸooo_^^Îä)//gÞ£¦³½½}II ó~KKK{ÿ$‡…¢ó“OÎüãY E'åæŠ{ï/‘´ææŠ5sFUWˈÈÃcœHdÿ ÓE"û l‚n¾ ¿…JÀ0ee%X´(`Ñ¢"ª®–åä”gg—üóŸY¯¾šaaÁŸ2Å‹jŒ է釿×’ÜV’Ûsdè¨í@}$‘H¶nÝzþüùÒÒÒEwtt¤žŸ¬çñxëׯ711Y³fM||¼X,~à¹û¡ C¿<³¿cÇŽß½Êzçèè¸eË–7ß|3##cÕªUl6;''ç!ßÎpãëëµqãÆ€€€®ƒ˜˜˜¤¤$///GD,ë/ùË[o½åâââîîž––öÖ[oUUUñùü´´´ÍÆ#¶Û` …"((H(mÙ²…ˆ˜ –FVVVXدËÕx{{?~¼¼¼|×®]>>>O>ùä /¼À”¸4æÍ›·råÊ;w~üñÇD´bÅŠÍ›7{zz¯]»vîܹ]—l‰}ûí·ÇoeeŤehÞfß?÷AvèPnRÒ±††–ÎNÓ"×57Ëùü_Ktmm?üp77Wœ“#Ö”.,-¾¾ŽÌZ"‘ƒµµ‘vÞŒp¨dŒÖÖFóæùΛçKDõÙÙ%ÙÙ%II_¿új†““9³ŠxX˜‡‰‰¶“Â@›˜@®+èÖÇTú ¾K¶³Éõi²›G:.S<Ìõò8Û±cGvvö•+Wè÷`¼0D3a„„„ÍÙº Ó5‹Åª­­µ°°èºÑ5¡\.?tèÐG}ÔÑѱfÍš¥K—ö2•EGGÑ¡C‡úªÂÂBŸÚÚZMAb@ Òi‡‹Å:|øðÂ… µ„ˆˆÅb¥§§/^¼¸¹Y¾mÛ‰Ï>ûžÅ"¥Rõ@76[‡HG¡P²Ùº&ØNšäàëë0i’£‡Ç8==,Å ÷¹F*==f²Ž^˜ÞÚÚqåÊísçJ²³Kvïþ/‡£çãcäîì†uSG9Çs µWSÝ¥aUÆx¿û8|OOÖ¿öÚk^^^þþþŸþ9Ó¹Ÿ°÷9 u÷Ì~ÿŸ¦?qâÄÉ“'·oßÜç“ ÞÞÞsæÌILLliiILLœ6mÚ€Ôé´CÌÍÍ-<<\Û)~¥V«Ê}ûí¯%’VÍtRP©H$²KJú“··­¾>~§€Á…1£M]]óÅ‹¥ÙÙ%gÏWV6rüýÂÃ=ÂÂÀ>¬ÂhW?Çdܸqcýúõ999jµ:$$ä£>Ò,FÒƒtÚ±ŒÍ6 Y_R"e±~ç7''ó‹zé0PPɵÔjuQÑOÌ¢—.•µ¶v¸ºZ†‡{„†zLêŽE5F¡ë t÷(ÙÍ#»¹dBôÈë4ô_ffæìÙ³ÛŸ””ÔË]Ÿ¬ÿÛßþ&“ɾýöÛž:»»»_¼xÑÒÒr…pv)žŠÎ>øæŸÿ<Ébéêè°ôôt e/¿+°X¬’’w ‡ãdh0Ê ’0&¨Tê7î2‹jää”ËåJ''óÀ@—  ×'žð´·7Õv@5gIœF÷ŽQ{5ñÝÈ~>ÙÍ#«Pb€‰_†Õ“õÃ*ÌðJÆX Tª¸\³7ÞxÏÑÑ»¢¢N,®+/¯¹s§¾££“ˆttXúúzJ¥J©ìdúùåšà`7­F€1• €1§¹Y~ùrÙÅ‹e—.•TªTêñãm¦NuŸ:Õ=8ØÕÔt„-ÀR«¨>‡î}Mw¿&i!é›ÑÌ d4^Û±`ÄC%cŒÐ¬ø­iQ«ÕUUR±¸®¢¢îöíz±¸®´´úÎúÖÖŽ·ÞŠzþùǵ˜ƈð& ,>Ÿ3}º×ôé^D¤Tªn޼njÕ8pàb{»c5F<–Y“E0MÚBÍetÿ ܵ Æ"«›ùÍrssfø„y,ËÆÆÄÆÆdêÔÿùfR_߬Ptj+Œ):ÚÚ¤§§#9¼ðÂôôôÕ%%[33_Z¶lJuµì7޽=eJÒºuÒÒ.VV6h;)ô ß<ÖK·›]Š&úá-ªýžTŠ!cBã/ˆèôéÓ̶ŸŸßÀ^¥´´”Åbåååi=Leeedd¤@ ‰DÙÙÙÚ óÝw߉D"çééyòäÉ_[aV®\¹bÅŠÕ«W_WW—ˆÂÂÂär¹L&³°° ¢ 6„††>óÌ3‰‰‰þþþD´sçN‘H4 Ã0Ń’’’§žzê•W^qttÔbFpppEEÅþýû1µŒt¨d@ñxú¡¡¡¡ÌËŠŠúœœòÜ\ñ¾}âã¿d³u'L° t r ššj7-ô—ÀƒóéÖj{“ˆÈЉÌ&“Y¹,#m‡ƒ‘M"‘lݺõüùó¥¥¥]w1õ€ÊÊJWWW¦E(Ï02™lëÖ­©©©[·n‰‰ÑnFyyù—_~¹lÙ²¹sçÆjC• NNæNNæÑÑDT]-+(¨ÌÉçä”ïß^¡ètr2 t r t?~œ¶Ã£s\DŽ‹ˆˆ2’PÃj¸B·ÓÈv*ÐOáááÁÁÁÉÉÉ~~~jµšËåjvéèè‘X, !¢²²²a¦¢¢"""‚Çã]¸pÁÁaÀþFôù“‘J¥Ì`Ž?üáííí?ýô*0¢¡’ÏÚÚhÆ ï3¼‰¨¥E^Xx/7Wœ“#NJúZ&k·¶6‰‚‚\]üüœØl]mç…GÁ6"ËP² ýn—Ÿ%}32ö"co2ö"= Ê)Š   ¡PXTT´eË"jhh`æPbÄÄÄ$%%yyyñx¼¸¸8êumŒ´´´>¯ Ñ·0¯¿þºX,>pà€@ H$D$tuuµ†ˆ—-[¶jÕªXZZ2ã6ú@‹PÉ€ÁehÈ r r}ájoWäçß¹|¹ýôÓ5kÖ¼ûî»îîî‡âp8ýÿd´ˆ¥V«µƨêjiNŽ8'Gœ›+þᇻ::,77+‘È^$r‰ì1\c4P)¨éI þ¯í'šñ}7ÝÔ*ê¨Ç*âÃ\tt4:tH»1 }||jkkÍÍÍ»íÀb±>¼páB„é[‹•žž¾xñâAÈÐG“Zcmm‡†0&†£êjiAÁ]fÍð7îµµuq'Mrd&¡ò÷w27çk;# e Õž§¦b’þHM%ÔTB-•Dj2ó§YW´~¦Å17nÜX¿~}NNŽZ­ ù裘…´bÔ‡Á˜ †PÉ€áN©T••ÕTÜÍÍÞëìTu]6\$ràr±ôÂè¢l¥¦êl'‹ànöÖœ¥‹+ÈЙøÎdèL†.dèH¼qij'6Æî –a2» 6T2`ÂìR0ÜéééŒ?nüøqÑÑDÔÐÐríZE~~e~~ÅG~çã<ž¾½¯¯ƒ¯¯£——­««•žžŽ¶SCÿè©o{ ìÉýyj¹M-T{‘Z*H%'"r\D¡ÝÝgW¶²™¸VD¬Á ƒ• aÌÌ §O÷š>Ý‹yYQQϬ®qíÚ´´‹­­Žž§§——··í„ ¶ÞÞ¶FF<íf†Æw#ïM]^«©½šÚªH—Ó}ÿŠ/èò³ÄÒ#®q­ˆgC\+âZ“Õãdû‡!I }‡JŒlNNæNNæóçû1/™6JJªŠ‹«öï¿PZZ­R© <<¬E"‡ñãÇyxXOšäÈáà_ÀÑ„EÜqÄ×ã~»¹4ý¿ÔvŸÚk¨½ŠÚ«©½†¯“ž ûJFå—Tþq̉cNúæÄ±øy›ïJƒ÷6F«›0¹¹¹3|ÂŒ¸£ŠµµñŒÆ3fx3/››å7oÞ+)©..®*(¨>>™™™Û¶m{ê©§ÊËËõôúû“vŸ?™¦¦¦†††ÚÚÚÝ»wÇÄÄ H-¯4½ÑÕÕaÆmÌœùkcuµìÖ­ê²²š’’êÒÒêóçoÝ¿/avYY œœ,œ-ÍÍ™ ¬(ÜBÑ)‘´66¶H$­Ikcckcc«DÒÒØØÚØØÒØØÒØØZ_oæîÞ0W—H$[·n=þ|ii©‡‡G×]ŽŽŽDTYYéêúój7B¡P³·¹¹9$$d8„ñ÷÷W«ÕÌöÆ·mÛ&‹»FÊ0DÄãñÖ¯_obb²fÍšøøø  E¨d<2kk#kk£ÐÐ_ï ¶´È+*ê+*êoß®»s§þöíºÜ\ñ½{ E'èÛÛ›ÙÚšØÙ™ÚÚšØÛ›2¶¶&XZ\s³¼­­£µµ£©©½­­£­­C*m“ÉÚ˜ÿk6¤Òö¦¦Ÿ·[[;ºžÇÓ711055055011tuµ211Èʺ1HÃÃÓ““ýüüÔj5—ËÕìÒÑÑ!"±XÌ-ÊÊÊ4{gÍš¥Ù ÌÍÍeÏÐJ‰DbddÄô!"ƒ~&éOWWW¹\ND …‚ˆx<,ó#îž CCŽ——­——m×FͪwîÔß»'¹w¯Q,®=þ–¦ÂÁb±¬¬¶¶&––Fvv&––[[Skk£qãŒÇ326€;¡0â(­­r™¬½­­£½]!•¶12Y{K‹¼­­£¥¥£¹™)QtÝÛÖÚÚÑÖÖÑÜ,ÿí9ŒxW àòù\€#pmlLÆçñù€+ðø|Ž©©á/Õ C§›¯^ýlÐÞ²"((H(mÙ²…ˆ˜9”111III^^^</..ŽˆX,5662LMMOŸ>íççGDiii!!!...C& **jíÚµï¿ÿ~@@€ÃÌŸ?Û¶m&Lرc‡¿¿¿½½}ÿÃh*ƒE³êÆíjµº¦¦éÞ½Æû÷%÷ïKîÝk¬®–Þ¯®–VUIåòŸ»@šó IDAT×ìårÙ66&–– ¾µµ‘¹9ßÒR`eednnhiide%ÀšÃSSS{[›¢­­C*mmoW´µiÊ Š––ö¦¦öövEkk‡LÖÖÖ¦Ù+ooW45É[ZÚ•JÕoÏidÄ30Ðçñô.ŸÏáñØ##Þ¸qÆ<[ àry<¶¾±ñÏ=ù|¦§¾Ápÿs²gÏžuëÖÅÇÇOž<9!!A*•Ο?¿¨¨HÓ!!!¡¾¾>22ÒÄÄ$999++‹Íf‘‰‰‰¦f=‰ØØØÔÔÔ>߯ïs˜ÔÔÔU«VíÞ½;00ð‹/¾`:k+Ìk¯½VPPàåååïïÿùçŸH-bi¦ô€á ±±¥ºZvÿ¾¤¶¶é޽Ɔ†–††–ÚZYCCK}}sCC‹æN·¾‘ÏØ˜'ðŒ¹]¶yÌ6³ÁüglÌc³uµûÖ†9¹\ÙÞÞÑÔ$W(”L½A.WÊdm E'3_SG‡R*mS(:[Zä­­ÌÚLÑ¢¹™0¡hiéfHõ\Š00Ð)¥ˆèèh":tèvcúøøÔÖÖš›?X#d°X¬Ã‡/\¸aú†Åb¥§§/^¼x2ôÆd /¦¦†¦¦†žž6=uhll©¯oihh®¯o‘ÉÚ$’V©´M*m•JÛ*+$f „V‰¤­£CÙõ@OßȈË6 ôõõu 8úúz<[__ÇÓçrõ¸\6‡ÃærÙ\.›ÃÑc64ôõõ˜ˆÄçsuuuöshjjW©ÐÚÚÑÑÑ©V«e²6"jkS0ïQ"i¥ŸK "’ÉÚÔjuGG'³üCss{g§J¡øùeK‹¼££S&këèP2Ó1)J™¬½§$zz:††\.—Íåê \GÏÀ€Ããés8zŽŽæ#¨¡u™™™³gÏþm{|||RRR/z{{Ï™3'11±¥¥%11qÚ´i=ݬ'"77·ððp„és€a• €†)uYýnÏövSÒ`êš‚³¸BG‡’™Ú¨¦FÆÔÚÛr¹¢½]ÑÞ®d:ô'çïó!•¶öçBL¹…ˆŒŒ¸::,6[×À€CD|>GWWGOO‡Ïç‘¥¥@__ÏȈÇáè1c#8=€©U° 9ŽŸÏeê:ƒQ¤³fÍšÕ·ÑÀéééëׯ·µµU«Õ!!!Ÿ|òI/KKK¦?a†!Ì.=Ò<ärekk‡BÁü¿ónMM펟JÛò*ÆÆ¼ß6 Ý” ôÙl]‹edÄ#"fœ=JÕúl˜Ì.ƒ ³KÀ0„1Ð#OŸÇÓ76ÖvÃ0[ _¨dÀˆÄêN^^ž¶sýL©T²X¬ºº:"VÁFT2`Djü>}šÙöóó¨óçåå=P&¹råÊî««›šš**À˜…u2`D211Ñlóùü®/„ŸŸS&!¢ªªª¥K—ŠD¢‡?œÅb-[¶l`#ŒM“£\~~~dd¤™™Ç›8qbFFÓÎb±Îž=ëèè¸gÏž¸¸8+++;;»””.—›——§««kò‹äää7ß|“Íf÷t ‹uìØ1{{{33³;wj™Ù¥ ‘H”Jå`¼S€Q • å–.]* ¯^½zûöí 6,_¾¼££ƒÙµiÓ¦ƒÞ½{÷رc™™™§NJMM} ÌPTT”——·`Á‚Þ¯²k×®«W¯¦¤¤lذA.—÷ÒóÒ¥Kîîîï¼óNMMM?ßÀX€JŒr—/_Þ¹s§³³³µµuXX˜\.—ÉdÌ® 6„††¦§§'&&úûû{yyíܹ³³³³ëáï½÷ÞÚµk÷*ýë_­¬¬¢¢¢”JeSSS/=gÍšuîܹ–––É“'/_¾<''§?ï`ÔC%F9‰D’nkkûüóÏwÝåèèHD•••®®®L‹P(ìÚA*•9rdñâÅ¿{;;;"ÒÑy¨°·lÙRZZ:cÆŒU«V=ä{ƒPÉ€Q.<<¼¼¼<99ùöíÛYYY]w1…±XÌ´”••uíðÕW_M™2ÅÈÈèw¯Âb±5Xqqñ… d2Yddä£ 0v ’£œB¡  …EEEË—/'¢†††®bbb’’’®^½ZTTG]ÊYYYaaa];§¥¥iÊ}#—ËÓÒÒBBBV®\|óæÍ-[¶ôç„£*0ÊíÙ³gçζ¶¶ûÛßž~úé'Ÿ|rþüù];$$$L›6-22rΜ9Ï=÷±ÙlfWvv¶¯¯o×α±±çÏŸïOž'NœŸàÀ#F <ØÞÞþáÇ¡—/_zxxhii)++ÛØØ\»v Ÿ!¤££S]]aØLLL´´´üüüjjjB,kýúõººº:::Çï‹ Y"ôXŠ"‘HW®\¡R©jjjÛ¶m ÑÓÓSWWß´i“`‚7n˜˜˜P(”¹sç fŠN§w+*ƒÁår{¶ES_Ý÷ý÷ßÿõ×__|ñEgœÁöíÛ¯\¹òøñã÷ï߯X±BèòSRRæÏŸïââÒ­¨RSSÍÌÌöíÛWUUÕãMX:{1.Ö÷#„ÒÒÒÚþ*¦Óéí†B7oÞÄ0ŒÇãá#GŒOÆçóëêêø|>þ ™——×vv|ÀÊÊêòåËøååårrrMMM&&&gΜÁG¾zõªm"^Ü­íiãëëÛ­÷º·=n =–âÓÄÇÇcÿ«Ûãó"„Î;‡ÏøòåK„P}}½àÓæææÓ§O3fòäÉW¯^ÅOÉ>L[%%%Û¶m£R©‹/~òäIW¶«»å KúêÝÐÐPôúúú!2ù‹---ña‰D¡PH$ƒÁpqqÑÓÓ[¹reÇ…-\¸¿=R__ŸÇã•••}øðÁŸ@0 3B¥øGªªªèŸcuÛa#Fàø1\0ヌŒŒ222BBBâããçΫ  ÐÝÀ üñÇÂÂBöõ×_ÛÙÙõ|#€¾Êèmw9†a¨ÍnÆá—ÃôôôŠŠŠÿ2 çââòöíÛC‡?xð ãZôôônݺ…ÿ6ÁÏì-,,¨Tj~~>>Aaa¡7 d’Ðciç}óæ >PPP€/ ÿ—J¥ÚÙÙ=xð ""BpO{Ïäåå=zôˆÉdzxxôf92¯Ïß0C¡Pnß¾Íd2÷íÛ'b²åË—ïÚµ+%%¥¢¢âðáÃT*µ¥¥…ÃáØÙÙ™››çææ.Y²!T[[‹O×%K–¤§§®\¹ÒÍÍ !´xñâ={ö<|ø°  @pû€Î=–vQ```ZZZnnîÚµk}||÷«[[[‡‡‡GFF–——ÛÚÚ®X±âùóçÝŠŠÅb]ºtÉÑÑqÅŠööö999?þøc·–0ÐôyF?~üx@@€©©©“““ˆÉ¶lÙ²páÂ… Ž1"444<<\UUõ?þ ÒÓÓ[³fͲe˼¼¼fΜ‰rqq=ztmmí¶mÛ|||>ÿüó±cÇ–––^¿~!äïï?{öì9sæ8::.Z´¨¯7ú;¡ÇÒ.Z±bÅ‚ ìíí‡zöìÙvŸššš9r$??ßÞÞ~ãÆÝŠ*"""22òÈ‘#iiiK—.UTTìÖì ooÏÏ!„BC% aÚödŽŸŸB(T²Ç1‰”––6aÂI®T4BÊAJÀ{ÝYЫwÆÈ„·ò‚À9: £²2: £²@º2z~~EAA%ÑQè‘úÄÌ%:ˆ«ó{ÝSSÿ~J[‚®—hæoÄ”ðzQj*²·—ôJ@¬RSSý$~Ünku†¡cHMMµ¨ÇóN2ºƒƒdÃ@! ¡t„ÐV#&é£S‹—½=!› ââ@ôAŒDBÎÔw¡+¹6>ÔfooOxQ¥“wÆáùóŸc¡{÷6Œû‘®ÛH—š'è=By=AC “4HÑuôëן)(È)(È]¿žNt,º©è"+ ²*ºDt(”´dt.—ãF:‡Ããpxׯ§s¹|¢#Ðe]B|âsPÑE„q‰h ’–Œž’’__ߊ××·>|X@l<º¡"qs¨"ŽÐh(iÉè7o>“—ÿ;yyòψ@7”ü…H “PÉeB£ ¤"£·¶rÂÃ_q¹<ü_.—wïÞ«ÖV±Qè^ zаÚ½ C¼Bcˆ¤"£ÇÄä°XÿºèÒÚʉÍ!*ÝP~q[ÿ5†ÛŠÞGÍÀ%ýúõt2ù_ “H¤ëסáúƒâKˆ$÷¯1d2Üñ.yÄgt&³%66·ÝÍí<?66‡É„Fnl*hs;Ÿ‹ÞßClF'ó€>A|FŒÌäó…¼å†ÏÇ"#3%€n(»‰°ç1>*»%ñh4â3zhh:‰$$£c ƒWÍ€t{{±ÓŠ;ÿô‚3zuuã“'…<žÐst~jjaMM£ä£Ð%­U¨*a!¤££Ó6©3 .—Û·‘ËÈèÄä¥?zé/ø/%%eþüù..."æ8yòäóçσƒƒ7lØÀb±0 CÑétmmmÁ4©©©fffûöí«ªªê»ØedtâÔÒÒúã¥D ûRæ"„Ó5¢ã  7Ubý£ 2:1þÑ ×ÑYÑYÑYш‰°þÑÄÀóèÄïÞG8Gddt@@Fddt@@Fddt@ÀÓkÄúG'dtbý£ ZÝYÑYÑYш ôN(x€˜@ÿè„"a&øçñãÇ?ÿü3Ѽ}KA™š2ŒaãÆ½\ˆŸŸŸX‚ÈBCC{¹Âë³rppظqc/RZZÊd2۶¶î太ž¯øäBèÌ«±Dò7™?ž·;Nþ«Õ½´´4,,L²ñü‹©)ƒØtVZZ*–唕•õ~9SYY™Xê!áõYÚ¤¦¦>~ü¸÷Ëa2™Ñ{ÅbÑéôÞ/Gªêù™Wc¥'Ëöñ\èqRH«{ïÏú/‰$®EmذaîܹâZÚ€ríÚµyóæ‰ki¹>·#ÆS uuõÞŸ\pUUU999âZÔóŽdûx.ô8 wƲ2: £²2: £² ÛÔ…Bñññ)**=}uuuÇ‘ééé\.Wè§B×¥¡¡áää”ÐÝ€¥VwKR»F¶÷êÚŽøh]íåzeµ`ÓÓÓE1¯xK[¤-~’0]Ü]_EWØ_%iЛÚ.ti=+¢žœ£ÇÇÇ×ÕÕÕÕÕ=yò„L&Ï™3§ AÉÉÉ]¼xQMM­+ëzùò¥ƒƒÃœ9sšššz¶:)$®’ìk²½PvDWêjoÖ+« ¤DÝ?P›Z7v,Ž÷ÑW àz’ÑUUU) …B±´´üã?^¼xѳ§ïI$Ò¢E‹»².“;vÔÖÖ¾{÷®ë’N=.Éžý‚ëñï>ÙÞ ¨ ;¢+uµ®”¶Ì¬,é×g–” 6µNNNNò‘|ô«Ô¯Ë™p½½Ž.//b³Ùèß{¢íð7Œ)Н¯oUUUÛÙñÉø|þFŒ1xð`{{û‡ &hlld0 £¨¨hïÞ½¶¶¶/_¾ôððÐÒÒRVV¶±±¹víïw§¥¥988¨¨¨cvàÀ---??¿ššš^nlŸjW’‰‰‰†††§N 000ÐÖÖ^°`¾ øktttª««…n£Ðòüè\,kýúõººº:::ÇoÛÀÙ ¨“qöìY¼®úøøàSVUU)((ܼy³c9|´´qª`Û"‘HwïÞ¥R©ZZZAAA¨“êÇår;ÖÿÎB?$éÊ•+T*UMMmÛ¶m!!!zzzêêê›6mBuV†ÃëÍ×Gj‰Ø|…†OpãÆ  …2wî\Ñu¯ã{ñÚîå,˜žÁ`p¹\ñm·¤uå›+¶úƒµqõêÕvc:ÂãÇ+++.\hnnÎãñðètº`2|!4~üøW¯^effÚÛÛ{{{·]>Ù±cÇ Ëˈ ÂápÚ¾pG&“ccc1 ³´´\µjUQQQEEEpp°¢¢"‹ÅÂ0ÌÔÔtëÖ­>|¸~ý:™L033{üøqaa¡¯¯¯èMÃ×xõêÕN&–åˆ.ÉI“&%''ïܹsĈ©©©yyyîîî³fÍÌ‹ï‰':n£ˆò1W@@€¡¡arrr^^ž««kÛ=(á½Ð•zØ]\NWvDss3^ .\5j>ñÉ“']]];+Ñ¥Q°¾¾¾]™ì£²²²²²²>:YÛ‚m7!äååUYYyýúuyyùÖÖV¡ÕoÿþýëÿG«7öïãOuu5þ¾LoooÁð›7oDìšváa=ýúˆPYYß­’ª[ß—¶;EÄæ‹(4|‚‘#G¦¦¦æää8::Μ9¶»“““çÍ›7räÈŽ1öŽˆrˆŒŒ422 ¬¬¬ìVÉu¼íÏ™+W®èêê.]ºôáÇÊÊÊèßòòò>ºu’¬"J¯µJJJ)))øÈ––¼ô°6Å+tE”§ˆ¹”””sáëê˜Ñ1‰ìÉgôî¬Mé}þùçûöí+//WSSkhhè¬D—6FDÁJCFOOOÇž>}*I§Ó…V?¡õÿ£Õû÷ñGCÇa»¦]xXO¿>"žÑ»R3…#„Úm¬à¨~ÿþ}o¾ù&77WD ‚"Qε¶¶^¸pa̘1'NìâÆ›ÑñÚÞ•onêÐýÞ«;ã”””Ú}„oF»»Š q“H$ƒvséééµ}^ˆÁ`à?ÙÚÁ/¥¨ªªº¸¸¼}ûöСCÅÅÅ<L0uêÔ’’’ÐÐÐáÇOž<ð[·náÛ‰ÿ–·°°èÁöö%I&“BT*õíÛ·ø|@OO¯ídzzz·ñ£å)t.*•šŸŸO ØeÉÞ^@]ØmÍ›7ïÆaaa³fÍQBK»ãd²W°FFFmëaAABÈÄÄÿ·]/B«ŸÐú/¢z =þˆ b׈èä£7_©ÒÅš)Ô›7oð|· ŽKT*ÕÎÎîÁƒø­õ¢u«3•¼¼¼G1™L®Ï%"j{W¾¹âª?â|à …B¹}û6“ÉÜ·o_Ûñþþþ™™™YYY«W¯öóóëøÜÂòåËwíÚ•’’RQQqøða*•ŠÿHAmn*//÷÷÷3f •Jåp8vvvæææ¹¹¹K–,Aÿ´ä3ÆßßßÐÐp„ †­\¹2 ==½°°påÊ•nnnbÜXÉXºtéÞ½{ÓÒÒòóó¿ùæünU„þmY²dIÇmQž"æZ¼xñž={>|XPP ¸7À÷B;Ó§OýúuPPвeËB•YÚ8Ù.ØåË—oÛ¶-**ª¢¢"55uÉ’%³gÏÖÒÒ:±Ðê'´þwV½;;þˆ b×Õ³¯Ôêîæ·˜–––››»víÚ¶Ç%kkëðððÈÈÈòòr[[Û+Và[»¥ÝO‹uéÒ%GGÇ+VØÛÛçääüøãÝ]f_QÛ»òÍ[ýùèY|;¨CÛ‚À… tuu‡ réÒ%Ô¦ åòåËúúúššš .¬««ÃþÝzC§ÓÙlöŽ; UTTììì-QmãTVVž2eJAA†awîÜ166VTTœ4iRDD„——~óELLŒ’’Òˆ#BBBØl¶¿¿?•JUUUõòòÂïéøèÖØJÓñ#6›½uëV}}}--­ùóç Úa\\\”””jjj„ncgå)z.‹µaÃüfË .´ÝƒÞ Þ'â#Ô¦lÞ¼y†††øåÛÎÊAticD¬„[ݹ\îáÇGŽ©¬¬lbb²yóf&“‰Ô±`…V?¡õ¿³êÝÙñGD²ˆ]Óq¿÷ìë#á­î]Ü|¡­îû÷ï733SWWŸ3gNUU&ì{ÔÔÔtêÔ)WW׎1Ý;íÊY0ý7,Xðøñã.ncÛIìx.¢¶wå›Ûƒú#žëè²M’5tFÂ}àpF¢’ÑÅBÄ`©"ÛÇs±]G€´‘':ý öïkF@zÀ9: àÀÀÒPÎb1ÿ~èQnY^éï‡èHr$•ÿ¿î^Q€Wß÷dt˛躴ï»8ñ©qÏš#˜Ü™|yEioÕ–öøñ2õÐìÊd$‰,O¾ðn¯Ê´*éOç2zwq8¼úúæÒÒÚüüŠÜÜD‡ ÛÔ©ŠC,•E¿°Ž,GR74çêÈ”ê[’Š«· Õýÿnß~¡¦æpçNIzúµÆFVCCKc#›Élnnæ´¶²Y,‡Ëå ¦wwuéÒJ–uÍu*ƒTå»Ñw8À}xñ¢µ®ÎÄÝè@ú«—/ßÑé 4š5ÑôW†UU5èêª̦j¥½yq;¹oŸ„ 'kLÞeÔö²ºô’Ñ»õ¢]YB&+jhxÄŽGèã×WH$’‡‡¨ãȼyóæÍ›'¾è¤˜BŸ!$PBõ5 ÔˆPã?D÷k,ÍõY‘DÚ=lXrSÓý†žDžòõõËrètzBB‚XÕ3†…‡††¾Þ¿rBBû¸ ÑõœLV’“S%“ÕääÔåäTåäÔää(òòj$’“™ÔÜüJbqJ‰–Zƒøöwc†²¼ò¥!ºJºÃ×VÒªW;6¹¤ÄsÔ(íåËå5»tm¯7:ö“Ô³…èèèô~9=VSÓäï+-í–Ö`íS#‘íêyIIcEEs]»¶–U]ÝÂ`°™L6÷Ÿ3Q2™„âóñIsæ;;;´¤Lš4©í¿M•ì¢xFq,£âe£Ü ²†"³”Õö·4Iž¤¨&çqÐtø8UÁHé?Œà]••Õ­ZuþåËwÿÔûöH$da1,>~«„“fUNœêšê8|ŽÐ É B±ylm“¼À<9É(¥>œúË/$2Y^QqÚ‰f^^DG$í^¯Ys±±‘…a|_߉G~AtDÒ%88içΛ r|>Æãñ;›ŒD"Î^¾\–Ó¹@cûmT]Q,£*»iŠœ¡³†É u’zÎ5úÓ ÷Ø?gê$2Ò±L;dª¢Ó_NpgœTªæ­[ë6lð$“IrrBŠH^^nÈÕ/:MùùPóä­É”Á”ÎR5›ÇfóØdDÞþÙvHçÆ®®ŸÏçrÙÍÍ·V¬ˆX·ŽóOGy –ö7ß\Z°à&³…ËåarsEtPRgÉ’IC†¨r¹<ÑéüÈ‘y$#„ÊR™™U µ<=ØbIÂh·}ÆÆîy%²‰‡&ÆÇB$2B^¢;ýŒEÿMçÎÑE{ô¨põê FsÇøaÃ4**êutÔ¦L±òð°ruµ<n C…U…Nœj›k9—{|Ô(ns3þ/Y^^ÃÀ`fp°öÈ‘Ä&mrs?|õÕ¹wïj¸Ü¿¿Œd2);;PCC…ØÀ¤Ðï¿'ìÛw·³ŒŽ§óùóÐÕ #É!²œ[ ®‘[›ß*§@rÚn`1}ˆäc/8GeÒ$³ääm^^¶íî:ÑÒR}öì‡'Ov|÷wMMãš5GŽü~êÔŸ¹Ÿ‘QJT´ÒÀl¨Y²2E…"/'ì29 íðÙé¼-²¼¼á§Ÿ’Èù\n}iéEoïŒË—‰ Lª'y{y÷®ZÎI$dm­é\¨%K&©ª =Á Ép:o(g½¾Q-ô#¹A$¡é!d楥¦§0ó¼¥ ¤sO¯}”ººò©SKCCÓ¶l¹Æãñ¹\¾‚ÙÓÓ†D"h-Zä°h‘CK ;%¥ ::ûÒ¥Ô#Gqq± Ñ¬]]- p%l>Ô½lڴѧá󱬬²èèìèèœÌÌ2%%''sÍšF³hO|æUä9ýäÄha’:™Dž1fFTv”º²úfÏÍ«\W VLlR¢úõësS¦tO–—W§Rg댠W‹ÓÒŠV®<_SÓ(85oëæÍo>ýÔTòQI­æföÅ‹~ÿ=žÁhž3gÂÍ›Ï[ZØøG$BH¦ÎÎÛ&rmc7ŠÉÊðñª$²ô>­*Ñ»¡¹™ýý÷×oÞ|–½¯“F­ÿ£Ó^Ç—Î IDATÄäÄÅå¶´°ml¨4šfmkK•æ'¤ÅèuÅk§Ÿœê›ë¹|. ‘ô5õßîÛÂnù-ñ·Ÿ"âò¹k&¯Ùê½US¥ÏÙ’vdcÓÊ`tü„$''7h×Áƒ£fÏ–|\Â0,88iïÞ»Æç {hXYYáõëý 2rjÕKUU 'NÄ\½úDNNî?ÿqþòKgMÍÁFÅâ?†d¯±=eÿ»ÏMiš¦šš#”ˆGZ@Fï¶—/ßcØõé[[9iiEQQÙ>0¨TÍÉ“GÒhÖ..–ŠŠ2Þ&Ÿ^œîvÄ­•ÝŠaØñÇ×L^ƒohmø5á׃÷²¹ì/¾ü~Ú÷ºêºÄ†J¬»«WÜ»Ççu8%‘†š=ÛëðayÅtë%Ç Š=|ø>>ÜîS2™äæ6òâExc#ª¨¨?y2.$$UMMiíÚ)óç*8Ù¨®nœ0a7›Í•ÉÕ¸-|y%2'GÝ]¢òò*bb²£¢²ÓÓ‹å'N4¡Ñ¬}|>6LƒèÐúÊÓ¢§îGÜUUK~*i÷¦ØFVã™”3û#ö7±š¾túr›÷¶aÃˆŠ“X™W®D}÷ÆÿWê"ËË+kjzÿò‹±«+Q+?¿bõê ùù•í’º¼}•™ñþ=C[[o“wsõÑKõ²Ïëï¬i¬Y:iéÎé;õ)úD%Q§ìì˜åå!²¼¼¢†ŸÅš¸v­ýºuDÇE¼î]¼øXEePEE=žÔõô(éé?22Jy›3bÄÐÿþwŠˆ\Þ½Ok(Ša'0š«9%“)wÊËý¬GwAF—"‚6ùgÏŠ ú»M~Ú´Ñzz¢C“—uþÑù=w÷ÐéË&-Û᳃ªI%:( ‰Úº5󯿆™Òh^æGDÄíܹàöíacÆ‘>,œ7ï×cÇxzZûû‡ÝºõœL&}ñ…ý¡Cs‰M¢ž=+9x0"99ÿ“O 6nôš2ÅŠ,s7uß^šG’#™Ò(Æ“)ªÃÛ_A]]ÕÖ6=|X•Åd¶ Úä'L0‘½¯qGl.ûÜ£s÷+™•ó&Îûaú#tFTŸË Ú¼yʾ}Vsæ „†…-ZÔP^¾øÁƒuO\[õõÍîî‡&N4þý÷¥ø˜;w^lÝzèÐ<ŸOˆMb¢£³ƒ‚bÓÒŠÆ7Ú²eš³³ÑõN3_A^zÖ+Ñ¥—Ëþ¼8::çþýÌ7oª´´»»¢Ñ¬'O©¦&ãl°¹ì+iWö†ï-©)™o7‡Ïó¡æDÕ‡X œæfUÝÿßóßXQñ§›Û'‹¹lßN``Ú°!$!áulì-­ÿ¿º ¢¢~ð`E™¯ÿ†ÅÄä๜F³^»ÖÝήß?|Ïiæ½KfR%8Êì½ÀÄ‚ŒÞo””ÔDGgGGg§¦¾!“Ivv¦..ÞÞ£MM‰ìײ¯qxœ§!áÅ5Åóíæ|`¡+³ç(e†„DmÙ2/,Œú©ì Nzÿ¾nÖ¬qk×N±´ì÷ïfà±ùWgåèMP5ñÐ¤Ú«É ’Íó ©]F´m“çó±qãŒ<=­==mÌÍeí]l|Œ/ãÞw~xUújší´Ý3w3GtP}+çúõÈõëç^»fàà@t,’’ºeKè­[ߌoLt,}®µ•séÒã?þH¨®nX´hÒW_¹ÊB'`8>ë¬Ó3Ð £Ëšúú椤üääü²èôA›¼½ýYztÏë»ïî~þîùg¶Ÿý0ý‡ ƈªÝY¹²2#ciLÌ UU¢cé[ÅÅÕ‡¾üÒùûï}ˆŽ¥o1™­§O'œ;÷°¹™½`ýªU“õõûßËÑÅ­Åq ê$uí‘ðà8ñ £Ë,Ÿ]Žw—‘QJ¡¨8;[xxXyzZËL¯Ò†…g„ï ß›Vœæ1ÊcßçûìLì>>[?ÔR[û§»»™——çO?Kâñø³g±ÙÜ;w¾•¥ í0ÍgÎ$=›Âãñ¾úÊuÙ2§!CúÙµš¼–â8FQ\]ÝÛVe-…I[¨¦´þ÷sDö@FÞ½«IJÊŽÎNLÌãñøÖÖúxGp£GšxÄäÆl¿¹ýiÑSQ{gíµ7µ':"ñ+|ðàÖŠs.\0qw':–¾òë¯q‡E>x°É¢ß_Eª²’{åʹµkÝ—,qì_á5”³s¯Ó‹bÌ2Ö`ÝA&îcwʰ1ª$¸D. £,--lü>ùèèìÊJ¦‘Ñgg üw8%ŠÉÙqkGêÛTG3Ç=3÷¸”µÌ¾fMYjê²øx% |œ7'çý´iG·n¶zµѱˆß‡Œ£G£®]KÓÔTY»vÊ_|:xpÿ{qPõëæGËŒ\4 5 S)}€â󱬬2¼M>3³LYYÁÑÑœF³öô´:´w ’R˜òÃíâ^Ç9š9îž±{ʨ)DG$6-uuçÜÝ]\¼ù…èXÄŒÅâzyÑÖV½vmŒ½±¨ˆ~ôhÞIÚ† žsçN4ß}2:@eeu ¯ñ6y.—gcCÅÛämm©ý·#¸””ÝwvÇäÆ8š9nºuú'Ó‰ŽH<ÞÄÄÜ\ºtæéÓæÓ¦‹8Þ½xñQLÌwZDÇ"6•‡ß¿w±ö·ßŠê$Mz´2¸%‰õï’ê]w R“öhA;ÑÁÿµ´°ÓÓ‹£¢²ïÝ{UQQo` åêjI£Y»ºZöÓ³Š”Â”Ÿ" ÏŸ4b’¿·¿läõÈõë‹ââ–ÅÅ©hËHw¢ÎûëáÃóæÏ—‘Wã½|ùîèÑ¨ØØ33ÝM›¼>ûì)oxhxÏ.I`'0*^4‘åIúöj›¨êÔþw]`€ƒŒ„t—ž^¬¤¤àädŽ÷£«Ûÿ®à>zóhÄþ{™÷>¡~òý´ï}Çûöß¶„«¡áü”)ÃÇ›þûïDÇ" ­‡F68}zѱˆÁ³gÅF&'çc¸aƒ§ôw’öæ~Ý« •5y̓Ôä 4Œ'S Õå•¥èV7‰D§ÓµµµB¹¹¹›6mJLLTSS›9sæáÇÕÔÔðiÒÒÒ&LåGX»2:øˆêêÆøøÜ˜˜œøøÜæf¶ ÕÙÙ‚F³š8ѤåÅ—¥/Œø1ìYØhêèíÓ¶÷ë¼^’œúÅÓûÍrz¿ouظñJllN\Ü–~÷W;m:I3޲Ż¿t’ö6ºîCz£±»ÆðñjdyiüF2z]]¥¥åW_}µfÍšÊÊÊÕ«W[ZZ^¸pAFÿdtÐU­­œ´´¢¨¨ìÈÈŒ÷ïÚÚª“'¤Ñ¬ÝÝGõ£»v3Ê2ï†= ³Ñ³Ùìµy‘ý"rÿ|ò&zëÖü{÷–ÅÅ :”èXzîÞ½W_}uîܹžž6DÇÒCx'i'NĦ§ËN'iREÑ?~‹ÏÈȘ0aBuuµºº:dô¿atßëׂ‚bfÌøE_ƒ‰Éwsçþzútâû÷uDÇÕUe‹Ï,–[)góƒÍùGç¹<.Ñu»©éô¤I7–.%:ž«ªbÚØ¬_ÿÑô—Ë»ví©»ûA=½ +WžËÌ,#:"!xl~é£úä}%÷Vç÷x!¡}}}UUUÿ¿þúkøðájjj7n=No7üôéS{{{eee##£Ó§Oóùüýû÷kjjúúúVWWcÖÚÚúí·ß:T[[û—_~ÌkccsæÌ™¶«¨««ãr¹øòÓÒÒ^¼x1eÊMMM%%%kkë«W¯â“µ[©Ð1²2:è•êê†kמ®\yÎÂÂøðõ®®ï>yò†ÏçÚÇe•gáyÝj§UÌëeOŸ¦R³BC‰¤‡–. vplll%:nãpx/>rp¤R7~óÍ¥œœr¢#jÝÄ}UûýÛs./Ovcaîóàÿ>½ááÁw—½3N{vefÖ“ãeôÜ&ɬ½gýÂ… ºººC† ¹té’ +ÇÄÄØØØ())1"$$„ÍfûûûS©TUUU///ü>;‹µaÃ]]]üqsAëýË—/=<<”••uuu—/_^SSÓ6’;wî+**Nš4)""ÂËËkäÈ‘W*tŒl€çÑaŒæää|¼·˜úúf#£!ÖžžÖöö#¤çõוÌÊ£ÑGÇWSRÛè¹ñ÷oTIcïòUYY—>ûlòÎãV¬ :–N±XÜ©Shj [+µoR{ÿžqìÞIÚàµkÝ¥¡“4“:'»¥–«9BÙd ÅÄ¢eÞþò3Þ0¤Çö¬8::'99?#£”BQqv¶ðð°òò²QW—Š#WUCÕÏQ?Ÿˆ;1XqðšÉk6Ò6ª+«T{)>;ujIT”¦©”¾ádß¾ðóçSbb¾34Bt,B¼}K?v,êöí::jë×KW'i¯oV§¦a$u¯rºÿ¾··wÇñÛ·o ”|<dt ]JJjð÷„„×|>6nœ‘§§5fma1Œèн~2þäј£ƒä­u[»¶ACYŠÞrÏçr/OŸ.§ ðÅÍ›$9iiäxüøŸßÉü-r :–öòó+ŽypïÞ+uë<ˆê$­¹š#¯H†Ï@AFRª¹™ýðaAttvTTVUUƒô´ÉW7VÅ‹9&/'ÿ_·ÿ®÷XOQ¡O[ôÜÜKÞÞŽ[¶Ø­YCt,ÿÒØÈòð8di9ìüùÿË¿à¤ÅÄ䨨èoÞ<•ŽUj [JëKëé9M›©6óûñk}± £iÇçcYYeøåöÌÌ2eeGGsÍÚÓÓfèP5¢¢ªi¬9wâ—Ø_x|ÞšÉk¶zoÕTÑ$*˜¶R|ôèâÈHí‘#‰Žåÿ6o¾•·U[[ZºcII)8t(2-­hìXÃõë==<¬$Ùs§™_ú¨þ]R}é#fkWÃHÉØMÃÐYCwô`’´Þa¤dtП”–Ö&&æEGg'&æñx|kk}ÍŠF³=Ú€xZ~Møõ§ÈŸ¸|îšÉk¶LÝ¢5X‹Hø\nÈÌ™<.wѽ{dy©¸ ½lÙ™3g–OjKt,µé$ÍÉÉbóf/B:V)ŽgDo~«e®lä¢a䪡c5A½ôK--ì””üĽ²²ÞÐpˆ‹‹fíêj)ù»™YgRÎìØßÄjúÒéËmÞÛ†iyÕ¿¶°ð‚—×§ÿý¯Ã† †£ÓÜÝNž<òĉ…ÄF‚aXxø«'b²²Ê ï$Çæ7Ó¹júƒˆ È$Èè k×&¯¤¤àädN£YÓhÖºº½Ïë"4´6¬pZáïí?\c¸$h+í÷ß“÷ï_pçΰO>!*Üòåg²²Êcc·¨«+Ç¿qãÙï¿Ç¿~]áãóɺuÖÖúX/³”Uúi5W§vØ úÈè@vÐé ¯cbrââr[ZØ66T¼MÞÖ–*±K¤M¬¦à”àƒ÷2šÿqþÏ–©[ô)’Hí`|þU?¿–ÚÚÅ÷ïË+öÈÓµki7†\¹²ÚÉÉœ8ÞÕ«OOžŒ-+«ûüóq«W»Õ·?³0>ªÊjz—X_’Ĩ{Ûª¨.?󼥆¡Ô=uddt ƒZ[9iiEQQÙ>0¨TÍÉ“G:;[L™b¥¢"‰vN—uþÑù=w÷ÐéË&-Û᳃ªI•ÀzÛª/)9G£ûòKg ¯WVV7eÊÁyóìöìù\òkomå\ºôøÔ©„ÊJæ¼yvk×N12êÛ‡à?{6ùԩƆօ ¾þz2•*‰Ç^ž­¨Ìh2rÑзWWÓƒ ä€ÑÁ@QSÓ—“ŸÛØÈ²°F£YÓhV'šôi›<›Ë¾’veÏÝ=ïjßÍ·›¿Óg§ÙP³¾[Ý¿`XØÂ…̲²%QQòJ½Œýûï û÷‡ß»·ÁÆFr˜Ì–Ó§ÿü3…Ãá­\éºt©“ô<,€@F‹Å}úômTTöýû™ååuÚÚª“'¤Ñ¬ÝÜF©ªöÕõNò4$0<°¸¦x¾Ýü€Ï,t-úh]mÕ—–ž§ÑlçÏwÛµK«Ãåæ¾÷ö>ºnÇÆ^’YcUUÉ1W¯>‘““ûÏœ—/wÖÒ,öµÔäµ”$1Xõ<‡Í’¾†@W@FÞ&Ÿ””ÿøq¡œÙÎΔF³ž6m´ž^Ÿ¼Ïëûîí+¬*œ3~ÎÞ™{-‡YöÅŠÚʸ|9Úßîµk’xý*‡Ã›6í¨¢¢ü­[ëäåûü&ú“'ãBBRUUÿû_ùó?ïÏ2>ûð¼¡$±¾$©¾ñ{°®‚‰›¦ÃwÑ4‚ŒBÕÖ6 ^:Ëd¶ Úä'L0ûkAùÿú³ë;oï̯̟3~Îî»G %ÞU´s}ñâÚÂÂ¥ÑуTû¼zÿþ{gÏ&GGo66ÖîÓWÿüóƒÛ·_ ¢ºfû‚öb¿í1agqIb=»‘7ÄRÙÈ…b䪡=R^¤dtþ…Ëå?^óàAfaa•–Ö`w÷Q4šõäÉ#ÕÔÄy)Ïë?Üù!¯"oší´Ý3w3'Æå·ÕXYyÎÍmäÌ™û÷÷Ñ*p©©o|}OîÝ;{ùr§¾[Ë›7U¿ü}ûö }}Í <û®c•ôßÞ+k)¹j¨ƒ;Ý@?€N•”ÔDGgGGg§¦¾Á0lìX#OOë©SmGŒ[_|Œ/ãÞ®;»^”¾øÌö³]3v7/®…·•¹~ýœ‹MÜÜúbùèŸîXÌ̆^¼øUÝl˜™YvøðýØØSSo¾['i|.F–‡SoÐïAFàãŒf¼×¨¨l&³EМƒƒ™X.cž¾'|ϳ’gŸÙ~¶súΉÆ{¿ØvnõÕ‡çÏ—ÅÅ)iôÉ“{[¶\ ¿EWWüËþ¼ä—_¢cbrlm©›6yõ¾“4>ûð¬ñ]b}I2c„—Öĵzâ ¢@F x<þ³gÅÑÑ9ÑÑÙùùššƒœÌ=<¬¼¼lÔÕ•{¿ü˜Ü˜í7·?-zê1Ê#ðóÀOM>íý2škjι»›N™2õçŸÅ¸X\ttöÒ¥Á¿ý¶dæL1?ûž’’èÐý´´¢q㌾ý–ÖËNÒ8Íü²GÌâDFiJ=‹ÉSÓdè¬a>MKÇZü÷Æ aÑè¡¶mò|>6nœ‘§§µ§§¹¹n/—“³ãÖŽÔ·©ŽfŽ{gîu)¶vò×w^=38ØÜÛ[\ËDUW7º»ÿäèhþÛoKĵL ÃbbrðNÒœ-6mC'iuoZo.zÍçbCmU ]4Œœ54GˆáwR2:½ÕÜÌÜ'_UÕ h“··Ñ›«¼)…);oïŒïhæ¸{Æî)£¦ˆ%Ú»«V•=y²<>^‰"¶'ô¾üòlFFi\ܱ4Tà¤?““óÞÃÃJŒ¤a|ìÍý:ªƒº’¦Tô3 €xAF@lx<~vv9Þ\FF©††Š‹‹…³³…——ŽŽZÏ–™R˜²ëήØÜXG3Ç­S·Nÿdz/ƒl©­=7eŠ¡£ãgAA½\.,,ýÛoÿ ùÚÅ¥·ÏÖs¹ü›7Ÿýö[|~~ÅìÙãW­r³²êöåmü rÝѪòÊÐåX £Ð'Þ½«IJÊŽÎNLÌãñøÖÖúxGp£Gô`i)…)?Eþž.–¼þ&*êæòåÓÿøÃÒǧ7ËA••Õyxœ={ü?úöf9l6÷Â…GgÎ$•—×Íš5nÍ÷‘#»×I‹É+}X_’X_ö˜ÉnäyŸ4£ÚK´;]€¾ÕÒÂNI)À¯¸WV2 ‡¸¸Xà¸w·MþÑ›Gû#ö‡g„;ŒpØæ½Íg´Oï‹øöÛ¢¸¸åqq*::=[BˆÏÇæÌ ª®nŒŠÚ¤¬ÜÃ'¶¤UU5,^<髯\ »ÑIZãvQã]R}Å‹FDFzãÕŒ\5 ]à r0AF@Bø|,+« o“ÏÌ,SVVpt4§Ñ¬i4k]ÝnœM¦¾MÝwoß½Ì{£©£·OÛî;Þ·yÕÐpÎÝ]×ÖvÖÙ³ÝWàÔ©Ä}ûîÞ½ûmϘÌÖÓ§ΟØØÈZ¸ÐaÕªÉúúÝî$-û*ýÕ¹ wMCacË ‚–v0pAF€eeu ¯““óccsZ[966T¼MÞÖ–ÚÅôüªôÕ¾ˆ}aÏÂlõm> èA^/IJ ]°à³ãÇG݃͞M؂ü1IDATÈÍýàíýóÚµîß}×íÛæë뛃ƒ“ΞMáñx_}Õ«NÒ¸,>YžD–ƒ÷ÃBµ¶rÒÒŠ¢¢²ïÝ{UQQO¥jâÁ¹ºZv¥[ñÇoï ßs?ëþ§&ŸîðÙ1ÍvZ·òúƒï¾Ë_§6¼{­9ÞgŸ•——»sçÛn½c‡Él={6)88‰Åâ.^ìðõ×nmŸh®á¼K®¯+l…Ï 2:Òï.**;=½XIIÁÉÉœF³öð°6ìÿ¯`óóó k?§&BŸ ¤‚PD÷Ö¨L&/ÔÔ¼U__ÍåvkFI‘Bñjl|ÄáTwkFyy--­ÙMMÏš›³1ŒÝö#__ßÐÐPÁ¿uoZJ’êKêé9MrƒÈT{u÷ý&rƒà\€NAF@êTW7ÆÇçÆÄäÄÇç66²ÁMœh2wîÜœœ??¿ŽsqWõƒÇ¬y<$×áŽÀÐÐP+++<£?ûãCÁ½Ú†r–ж‚¡³†‘«†žš¼"\ à# £ ½Zóbb²ccskjµÙì¢ÁƒßîÞ½“èÐÄl×®]:::gôß?`|ÌÈUC{Ô`äqº¬ü¢`ÀRSSòñùÄÇç>{ñ¢$**ûÒ¥2UU>Ñqõ­ñ«ºwQ€ƒŒ@?@&“Æ7?Þøùóst:ÑѤ4i²2: £²2:2ÈÍÍ-//OôõõõÝZ&ÇëÁ\=[  £º„L&ÿý÷***D2: KH$FSPP@pÚ €T‚Œ€Œsss{ô葟ŸßŒ3nÞ¼)Ÿ˜˜8{öì3f\¿~!„aØ_ýõÅ_̘1c×®]L&S0û«W¯æÍ›‰'r777„ЬY³êëë…ÎÅáp‚‚‚>ÿüóY³fݸqƒˆ` ‚Œ€ì»uëÖéÓ§¿û'Or8|dzzúùóç7nÜøÛo¿q8œ[·nEDDìØ±ã÷ßg³Ù?ÿü³`öÓ§O¸»»ãÿÆÇÇãËÔÐÐ:×Å‹“““÷ìÙ”””$ñÍ`€‚Œ€ì›1c…BqrrâñxÍÍÍøÈÅ‹«©©¹ººâ#oß¾½|ùr+++==½M›6%''³X,|J???[[[EEÅŽK:WLL̲eËlmm©Têºuë$· lðÎ8dŸ¶¶6B¨]G«:::mGVTT & ÓéT*!¤««ÛÙ’…ÎUSSƒÏˆ údtdŸÐNÓÛ2dÈš5kB†555©ªªŠ˜]Ä\:::eee¶¶¶¡òòr1n@Èè„òòò:s挶¶¶ªªjHHH^^ÞéÓ§ELßÐР¡¡!t.OOÏóçÏP(”_ýUb›À€B ,`±X;vìhll´±±Ù³gˆ‰G½bÅŠ°°0¡s-X° ±±qçΆ­^½:==]RÀ€ý£ПøùùÑéô]»vˆ˜µíÐ3p¯; £²2: £²2: £²2: à 3ô3t:=!!è(ÄŒN§ãï™ôdtú™œœœÝ»w…øYYYý¼3pÑYÑYð? {J›ì˜‘!IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__GroupBy.html0000644000175000017500000024042512234777147030445 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_GroupBy Class Reference
        Glom::LayoutItem_GroupBy Class Reference

        The child items are fields to be shown for each record in the group. More...

        Inheritance diagram for Glom::LayoutItem_GroupBy:
        Collaboration diagram for Glom::LayoutItem_GroupBy:

        Public Types

        typedef
        Formatting::type_pair_sort_field 
        type_pair_sort_field
         
        typedef
        Formatting::type_list_sort_fields 
        type_list_sort_fields
         
        - Public Types inherited from Glom::LayoutGroup
        typedef std::vector< sharedptr
        < LayoutItem > > 
        type_list_items
         
        typedef std::vector< sharedptr
        < const LayoutItem > > 
        type_list_const_items
         

        Public Member Functions

         LayoutItem_GroupBy ()
         
         LayoutItem_GroupBy (const LayoutItem_GroupBy& src)
         
        LayoutItem_GroupByoperator= (const LayoutItem_GroupBy& src)
         
        virtual ~LayoutItem_GroupBy ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        sharedptr< LayoutItem_Fieldget_field_group_by ()
         
        sharedptr< const LayoutItem_Fieldget_field_group_by () const
         
        bool get_has_field_group_by () const
         
        void set_field_group_by (const sharedptr< LayoutItem_Field >& field)
         
        type_list_sort_fields get_fields_sort_by ()
         
        type_list_sort_fields get_fields_sort_by () const
         
        bool get_has_fields_sort_by () const
         
        void set_fields_sort_by (const type_list_sort_fields& field)
         
        virtual Glib::ustring get_layout_display_name () const
         Get a text representation for the a layout. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        sharedptr< LayoutGroupget_secondary_fields ()
         
        sharedptr< const LayoutGroupget_secondary_fields () const
         
        type_list_sort_fields get_sort_by () const
         
        void set_sort_by (const type_list_sort_fields& sort_by)
         
        - Public Member Functions inherited from Glom::LayoutGroup
         LayoutGroup ()
         
         LayoutGroup (const LayoutGroup& src)
         
        LayoutGroupoperator= (const LayoutGroup& src)
         
        virtual ~LayoutGroup ()
         
        bool has_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Discover whether the layout group contains the specified field (from the current table). More...
         
        bool has_any_fields () const
         Discover whether the layout group contains any fields. More...
         
        void add_item (const sharedptr< LayoutItem >& item)
         Add the item to the end of the list. More...
         
        void add_item (const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)
         Add the item after the specified existing item. More...
         
        void remove_item (const sharedptr< LayoutItem >& item)
         Remove a layout item from the group. More...
         
        void remove_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Remove any instance of the field from the layout. More...
         
        virtual void change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void change_related_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void remove_relationship (const sharedptr< const Relationship >& relationship)
         Remove any use of the relationship from the layout. More...
         
        void remove_all_items ()
         
        double get_border_width () const
         
        void set_border_width (double border_width)
         
        guint get_items_count () const
         
        guint get_columns_count () const
         
        void set_columns_count (guint columns_count)
         
        type_list_items get_items ()
         
        type_list_const_items get_items () const
         
        type_list_const_items get_items_recursive () const
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_items get_items_recursive ()
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_const_items get_items_recursive_with_groups () const
         Get the items recursively, depth-first, also returning the groups. More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::LayoutGroup
        type_list_items m_list_items
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        The child items are fields to be shown for each record in the group.

        The records are grouped by a specified field and there may be. secondary fields that are also shown for each group.

        Member Typedef Documentation

        Constructor & Destructor Documentation

        Glom::LayoutItem_GroupBy::LayoutItem_GroupBy ( )
        Glom::LayoutItem_GroupBy::LayoutItem_GroupBy ( const LayoutItem_GroupBy src)
        virtual Glom::LayoutItem_GroupBy::~LayoutItem_GroupBy ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_GroupBy::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Reimplemented from Glom::LayoutGroup.

        sharedptr<LayoutItem_Field> Glom::LayoutItem_GroupBy::get_field_group_by ( )
        sharedptr<const LayoutItem_Field> Glom::LayoutItem_GroupBy::get_field_group_by ( ) const
        type_list_sort_fields Glom::LayoutItem_GroupBy::get_fields_sort_by ( )
        type_list_sort_fields Glom::LayoutItem_GroupBy::get_fields_sort_by ( ) const
        bool Glom::LayoutItem_GroupBy::get_has_field_group_by ( ) const
        bool Glom::LayoutItem_GroupBy::get_has_fields_sort_by ( ) const
        virtual Glib::ustring Glom::LayoutItem_GroupBy::get_layout_display_name ( ) const
        virtual

        Get a text representation for the a layout.

        Reimplemented from Glom::LayoutItem.

        virtual Glib::ustring Glom::LayoutItem_GroupBy::get_part_type_name ( ) const
        virtual

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_GroupBy::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutGroup.

        sharedptr<LayoutGroup> Glom::LayoutItem_GroupBy::get_secondary_fields ( )
        sharedptr<const LayoutGroup> Glom::LayoutItem_GroupBy::get_secondary_fields ( ) const
        type_list_sort_fields Glom::LayoutItem_GroupBy::get_sort_by ( ) const
        LayoutItem_GroupBy& Glom::LayoutItem_GroupBy::operator= ( const LayoutItem_GroupBy src)
        void Glom::LayoutItem_GroupBy::set_field_group_by ( const sharedptr< LayoutItem_Field >&  field)
        void Glom::LayoutItem_GroupBy::set_fields_sort_by ( const type_list_sort_fields field)
        void Glom::LayoutItem_GroupBy::set_sort_by ( const type_list_sort_fields sort_by)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/report_parts/layoutitem_groupby.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Report__inherit__graph.png0000644000175000017500000000637112234777145031035 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“ ®IDATxœíLSWÇÏmi lii‘QœÂØb3“ed]¶tbÃXÖVÁç4†ÅH4nØêf4“,B?T~h¡Æ¹àè1˜—ÎIdl%dÊ(µXµ³@¹ïÇÝÝ(ˆÐvžó‰<÷ÜÇçyîùÒsî=·½— I`áí0ëXo´Àz£Ö1HçÎóv9˜%F.—Ó%ö›éUj(..vi™Eo¥Ré‘b0ËN}}½K ž¿ÑëXo´Àz£Ö-©·ÍfûøãE"‹Å‰D;wî‚»‚ÐétKW! fc SyòdRRRoo/‹ÅZò­V+4¸\®V«]·n $$dÉ¡Àbô>}úô­[· Ê+%%%‡öó[L´yáp8”Íf³é›€ ³ÙþïÂbÆóššš={ö@±)8“ɤ6§¦¦òóóE"QxxxFF†ÅbíAœ={V(†„„ýòË/Åbñµk×ôzý›o¾™––Fí•Édccc €M›6Qö­[·H’¬ªªêëë£.‘é›IIIíííQQQYYYýýý###ååå,Ëáp@©TúçŸ666úùù=|ø$ɘ˜˜œœ“ÉÔØØÈ`0FFF`Ø5kÖÌÄl6“$éÆáå—_îêêºy󿫝¾ºiÓ&ªÔo¾ù&66¶££Ã`0Èd2j)›~ T|7Îî{Ì r¹Üeý|1zûùù]½z•Þï«ÕJÌêÕ«+++¡Cww7àîÝ»p¯V«%IÒétºØt-ge¦Þõõõ$IŽOMMÁF½^Oõ àÂ… T|ØÈãñŠ‹‹¡³Õjšš‚a݆x$I^¿~pçÎ3>>¾¦¦îb2™< çÐÛó¢{l¦Þ‹ÏAoo/]fêäœbppP,CF£n²ÙlƒÁp±ATT`||hCC ,®D7ÀÃNNNîëë;vìØíÛ·øáºœ é¼óÎ;õõõ|>ÿ7Þ þRÝ™×Á`0@C¯×!‰à¦@ P«Õðƒ5==mµZŸþù¹Žå±œÍbô.((0™L2™L§Ó™L¦óçϹølß¾ýóÏ?ïìììííÝ»w¯L&[àyuuuu?ݘ—ÉÉÉ 6¬^½ú·ß~ËĮ̀³²nݺÜÜܨ¨¨ÄÄD’$ç /Ý8äææÞ¼y³»»û£>R(Ôµbfff~~¾N§3 »wï–H$³–ã/ÐùI¡î œ¿I’üã?222¸\npp°L&ƒŸ`úü=11‘““Éãñ¶nÝ §¨™S×LPUUE7(ÀŒùn677GGG³X¬¤¤¤K—.I¥Òµk×ÎŒk¸råJBBB`` X,>sæ å6WäääÀÀ@‹Åâ&KMMMdd$—Ëݶm›K'äææ …B6›-•J©Ó+zaTü…8ÏeÏÅÌù› i'\uuu[¶l¡·`þÓ( ðï»àxý-°ÞhõF ¬7Z`½Ñëˆêm2{»ï0Ëkú¾§•òr}zzÌŠþÞ.dy1B¡ð_MôÅD~YÂ`òùÙÁÁ/x»Oàn} NŸ¾š—×°aCŒZ½×Ûµxçï ttºþÑÑ{Þ®ÅÓ §÷ààn€$ƒA¨Õ×½]ާANoæ“É8Ó Þ.ÇÓ §w]]§Ó9 IÐÝ=Ô×gövE-½õú‘ÞÞêÕߟÙÔô‹wKò0héÝÜü‹¿ÿ?_šžœtÖÕýÏ‹õx„ô&I²®®srÒIo°üú«ë—-ŸbÒ»«kphÈêÒèïïwáBgéé­V_§æÉÉ©úúNtPÑÛéœnlÔ¹ æ³ùžNwÛãyTô¾v­Ïby0ë.&: /¨è}ñâ ˆ€?øÏߟIÙN'ÙÜü ¼(êY–_ðú ‘Ÿ~º™Ú<|øâ{ï­ÿç'/ããö°0¶7Jó((ÞûËʶ§¦®óv!ž•ñÁz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£Ö-°ÞhõF ¬7Z`½ÑëXo´Àz£…'žçqüøñŽŽŽåÎòX …ðxƒ‚&½]È¿ ¿øq™ðÄóz:::ÚÚÚâãã=k˜ïß÷ï{»Ž¿1›Í===Hä¡ç3ÅÇÇz&בŸ~úiæ;µ—<£Ö-°ÞhõF ¬7ZøÖóSív{ee¥V«µZ­\.711ñÃ? H$’²²²5kÖ,U.‰DBÙ±±±ÙÙÙKß7ñ!½I’ÌÉÉ!¢¨¨ˆÏç[,F³gÏžêêjÿeyÑgqqqll,Àn·×ÔÔ:t¨¶¶–Ét}&þÓ„ç—/_>zôh\\‡Ã‹Åûöí«¨¨X>‚‚‚Øl6›Í~æ™gvíÚ5::j2™–6…D"¹{÷îÒÆ||Hï–––´´´ÀÀ@z#›Íf0þ)ÒétVTT(•Êwß}W¥RÙl6Ø.‘HZ[[ EJJÊ©S§~üñG¹\¾yóæÒÒRÊ¡¥¥…n¸³0™L’$kkkÓÓÓSSS é)ÚÛÛÓÓÓe2YQQ‘ÍfsSLWW×–-[à”‘––æ;’ûÞƒA,»÷9wî\kkkQQQIIÉ;wŽ;FíºråJEEEnnnmmmKKË·ß~›““S__?²yyy tƒŽÝn¯®®Ž‹‹ãóùjµúÒ¥KeeeǧÜÊËË:TRR266vôèQ7Åœ:u*??ÿòå˵ZúÄݳ4øÐüm·ÛéýBOi46ûÑ“è¿ÿþûíÛ·ÇÅŲ³³wìØa·ÛƒƒƒJ¥råÊ•¯¿þ:`ëÖ­”m³Ùø|þÛo¿ #P ++‹² Fqq1 ©©iÇŽpµÿÀJ¥Òáp°X,@FFL½oß¾]»võôôdeeÍZŒB¡xñÅ—©£žÒ;,,lppð…½–[£Ñ8¹\N÷½”f³yÕªU€   A.¶¨óµ©©©‹/œ={vddD¥R©T*ÊÍl6÷¦S©E"ÀjµÎU̳Ï>û=±ŒøÐxþÚk¯555MO?z›ÍÖëõ.>ÃÃÃІuXXØ¢3RçkG©TÚl6£Ñ¦R©´Z­V«mmmÕh4Pl•Úh4BCCç*fÞ?5oáCzgffZ,–ƒêõz‹ÅÒÞÞ^YYéâ#•J«ªª~ÿýw£Ñøõ×_oܸ‘êÝÓÒÒ%¡ ‚¸wïžT*­¨¨ÐëõCCC_}õÕþýû)˜z``¦~ÿý÷R̽{>ô–qÏ9Ή'Nž<ùÉ'ŸLLL¬_¿¾°°0##ƒî“žžþ×_8ŽW^y%;;{Á¿øâ‹¼¼<>ŸO3}BCC¿ûî»ÂÂB‡ÃQPPpÿþý„„„Ï>ûŒrHIIQ©TV«511qÿþýl6{Þb^zé¥;w644„„„4žc<€ç>ŽV«õv Kþ|£Ö-°ÞhõF ¬7Z`½ÑÂC×cmmmôïa¼…'Ö×:::—;ËS€R©\ÿYðüXo´Àz£Ö-þ@$ > ¢F~IEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_0x62.html0000644000175000017500000001075212234777147025023 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - b -

        glom-1.22.4/docs/libglom_reference/html/ftv2cl.png0000644000175000017500000000070512234777145023247 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÚ}\ˆŒIDATxíÝ;H#AÇño4Љႇ œ„K‰‡‚á ’ê,m„ØØ vÚžJ°²¹ÚÎþî‚§ XY ÅB|dr³cvo—˜Ä°Ý ù0Ã’™3ÿͤõ”Ëe×´¸Éõ¯1XÞ8Œ‰nQˆ88ööÖ§3*rbñ¯¢û-$¨‚þ´˜“P1Žè@Z…-# Ïú01ÑÏÎêÄ1HkKŸ w¶O@¥ªÈóñ!f§ñu˜åác÷;’sá×Bý[E´Añ±—Í\ß>°ùý¿ÏËÊÂ]–P€zØf| Íñ¯“+Ù´gð5…b  i5ümM³œ_æÍq,ÒcŽõèoÓd´ !¶äò©ô•,ôðÀ{¹¨µYß,€zTÍ8H]𤕘ï7¼»/òó8ËQæ !F€~6ãá?Y ÀA@ŨÁ.@ƒ¶TäÄYïŠËë±r‘µ8Ð*·é>€Šçÿ?€×þŸe[6«xÂIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1UsesRelationship-members.html0000644000175000017500000002260312234777147031470 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::UsesRelationship Member List

        This is the complete list of members for Glom::UsesRelationship, including all inherited members.

        get_has_related_relationship_name() const Glom::UsesRelationship
        get_has_relationship_name() const Glom::UsesRelationship
        get_related_relationship() const Glom::UsesRelationship
        get_related_relationship_name() const Glom::UsesRelationship
        get_relationship() const Glom::UsesRelationship
        get_relationship_display_name() const Glom::UsesRelationship
        get_relationship_name() const Glom::UsesRelationship
        get_relationship_name_used() const Glom::UsesRelationship
        get_relationship_used_allows_edit() const Glom::UsesRelationship
        get_sql_join_alias_name() const Glom::UsesRelationship
        get_sql_table_or_join_alias_name(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_table_used(const Glib::ustring& parent_table) const Glom::UsesRelationship
        get_title_singular_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_title_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const Glom::UsesRelationship
        get_to_field_used() const Glom::UsesRelationship
        operator=(const UsesRelationship& src)Glom::UsesRelationship
        operator==(const UsesRelationship& src) const Glom::UsesRelationship
        set_related_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        set_relationship(const sharedptr< const Relationship >& relationship)Glom::UsesRelationship
        UsesRelationship()Glom::UsesRelationship
        UsesRelationship(const UsesRelationship& src)Glom::UsesRelationship
        ~UsesRelationship()Glom::UsesRelationshipvirtual
        glom-1.22.4/docs/libglom_reference/html/functions_0x77.html0000644000175000017500000001075512234777147025034 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - w -

        glom-1.22.4/docs/libglom_reference/html/tab_b.png0000644000175000017500000000025112234777145023112 0ustar00murraycmurrayc00000000000000‰PNG  IHDR$ÇÇ[pIDATxíÝMƒ EáÇ»ÐÔ¸¸u`âÀ´V0РÆ}:t]DÁ²s¿ä®‚¶ýËu¥ø|’xùî½À>ÿ1»& mÄ8ÜSÙÑxÜLÀUûšÞ²ÄiE–ŠåOs„¢’nxàÒêÓKN²~jIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1sharedptr__inherit__graph.png0000644000175000017500000017707312234777145031566 0ustar00murraycmurrayc00000000000000‰PNG  IHDRþz:bKGDÿÿÿ ½§“ IDATxœìÝyXSgú7ðï”CA› P·bK)BÔÁ¢–qÅe°Ú…ÚqúNmÕß‹ó[·ÖÚN[uÞqé¨à ‚¸VÔ¶2–*Ð ¢U,È"e'€‚çýã´™4 aKrÜŸËËëää9ϹsΓ<+ò,!„ =F|@!„TBÈE!„ QTBÈE!„ QTBÈEQ¯©©iýúõ...¦¦¦...QQQåååÜS Ãdeeiñ\ªöÿŒssó©S§jΰ‡g”Éd ÃÔÖÖö'6îtJ™h+gBz΄ïˆ!êììœ3gÃ0IIIcÆŒùé§ŸöïߘŸŸojjÊwt=•ššêëë àÑ£GÛ·o_¸paQQ‘‰I¿>óÆÆÆ±±±ÖÖÖZŠQ9÷Yzzzii)ßQm ‰Dÿ}Ì¢âСCŽŽŽ?VÜ)‘Hd2˲Äb±O§šaÿO¡”C]]€üüüžÇ ôlMMMâÑu†º¡ÿ;Ñ©„„Å·˜ª€jjj”ö;vlÍš5–––Š;±±±ü¡L&‹‰‰qqq9rddd$w‡À0ÌñãÇE"‘µµõ¦M›âã㜜lllÖ­['O§¸¡X,ž:uª………»»ûÁƒY–ݹs§‡‡‡P(\¼x±ü¤JÉTóá"711é*NNNNhh¨P(477Ÿ8qâ‰'¸8ØÛÛsõ3\E†—îÜ9‘H$ ÷ìÙ£!¼¤¤$GGG;;»O?ýT~¬üÉÉÉ`É’%ŠA644Èd2ÍM‹"""ø)|ˆ¨yƒù‰ð)--méÒ¥>>>JûmmmÏž=ÛÕQÄbñŽ;<==322òòòf̘1þ|ù³áááµµµIIIfÏž-ß.,,dY666¶¨¨Hq]ÿ3f̆ ***Nž|˜KŸ““#ÏœSRR²iÓ&‘H´bÅŠÌÌLµ—T+¨dT ªr.]ºäæævûöíøøøÔÔÔ%K– 6L)““S~~¾ü¡D"‘w’+--õôôä¶¹²²2î¡••###¥í^á*^öíÛ·sçN77·W_}577÷áÇ˗/çúö8;;wttp'UJÆUø¤¦¦J$‰DRUUµeË–… >~ü¸¸¸Xmœ†††˜˜˜àà`''§èèh áixùÎÎÎJ/Ymx\[\WWFž¹···bæ\]]·oß^PP0sæÌU«Vùûû÷êÂ"GÀ#‰üýý/]ºtá‰D¢6Íܹs÷íÛÇ}9 nܸ¡šOQQ·Ím899õ-$77·ââbùÃû÷ïððð0kÖ¬’’’ÄÄÄÑ£GO›6eÙÓ§Os_^:;;%ɸqãT“qÅ••••@ £FZ·n]]]Ýýû÷œœÔæÀ .**Úµk׃.]º¤!f /Ÿ+º© O5™¢ÂÂBÅ«¡zmóòò®_¿ÞÔÔª!B4 `È™0aÂùóçSRRÊËË'Mš•­”fóæÍáááYYYÉÉÉ[¶lQJóÊ+¯¼ÿþûb±8??ÿ­·Þ = ..Ž»ÝË7^{íµM›6]¾|¹²²2##cåÊ• . …|}}7nÜèêêêççDzltttLLLVVVAAAttôôéÓ¹<•’™™™)ÔÌÌŒa˜úúú•+WªÍÓÞÞîïï?vìØ{÷î­\¹@}}=÷”RaÙ«—ßmxª¶nÝ*‹ïÝ»·fÍÅÌ¥Ri\\\PPPTTT@@@nnîöíÛ»ÍõôYE MssóþýûCBBTŸzøðadd¤­­­……Exx8÷%W±  ­­mÆ ÎÎÎB¡pÙ²eŠUäò }µÛbcc7d2ÙG}äããcnnîáá±~ýú¦¦&¿þzâĉfffžžžñññmmm7n‰DVVVaaa\«²j2V]»‚½½}HHHUU•Ú¸ôgÏžuww755 ¼páBXX×BlffVWWÇþRSß×ÏíWžR£‚ÒÆŽ;¼¼¼lll-ZT]]-ÉÉÉ‘‘‘ééé½~³{ÚP#0!†OµôâEÏ €ÆÆÆuëÖ‰D¢áÇ‹D¢×_½¬¬Œ{J¯ºT¡£lYþ.—j@U@„~áÆgff&%%•••?ÞÌÌ,00P*•òš!2¨ËESAbpØ^-ÔÊv ½Iy§ì1X¸h-¦®>|¸°°°  €9hoo¿wïÞmÛ¶õsÖ Ç0LMMÍÈ‘#{{ A].ú@ˆi­Ä÷«p}¾[‚+/âë\ôÃ9o\™©>ýãB$ •ÿvÅ7¿UŸþÑ}ü›Á¿$ $ÄÙ18ë…‹~øvAßâÕó¸ñž «V;¢›ËäêÕ«®®®‡R.•Jß~ûm{{ûÏ>ûL¼êÀlÕÁá\¶_|ñ…ÒÅÑó0û^ÓQe!ägÒzöÖ_ÙÌh6m1ûÍoÙ”gØÓîì‰ì™1êÓ?©`¿ e¯¼È¦-f¿[ÊfF³ß¯fon`ïîTŸ¾½™­øJù_M:ÛpG}ú¶&¶ä[r‚½¿Ÿ½ÿOöîNöÎvöæöÞÇJ {Ø çqã=V­aDw```ZZÚ‡~¨: <&&ÆÕÕ5---///$$fã×Íø\¶---òÎË0{Í@À„h“TÂÖg³egÙü½]Þ ¥öÜSì×ÓÙo±™`o¾ËÞÝÉÞßÏ–žÑo¬½ÖÃ@ÏãÆ{2¬ZÈîÄÄD¶‹á‡âvÞºu f+\¶¬á ³W¤Z æJ:Bt¢SŠŒ×ñ¨ ýeš¶áXz`ü»€Êð®á„çê9F}âÆr%IKK 7ZNíÀéñãÇ£÷ãÆ÷íÛ÷ç?ÿù“O>™>}ztt4w^¥aÕ ;wî¼víZAAâ@?®®®¸áË—/—ï/++«¨¨'V:JÃÀlÅl/]º´bÅŠeË–ÅÇÇûøøÂåÒŒÚQÑÑŠú(> ¶CͳF¦èlǨðôv„þs ±ä1"$˜­æî?èyÜxO†UkÑÍÝ.Õ‰DòP êv`6—­³×Œ B€–rü”‚ܸö{|9'¬qÑ™@‹ò H?{á¦|¯hŒ Õ˜XªO64èyÜxO†UkÑÍQ; |ÅŠï½÷Þµk×îß¿¯Ô¬ªv`¶ê-ž÷aö½Ömµ!ƒ_Šûo#öüx6m1{ûÙ²³lK9ß1ñ¯çÁô9n¼'ê»Ñ-ÏVír©TºvíZ®ÐÑ£G¡q`¶ÒàpÕ*x^†Ùk•6†íUcB¨æ‡¨M‡Ýs°£æÙÆ\˜ÚÁÌAïa´Å‹HLLä;ž1 #‹ýüüø¤¿†IHHX²d‰|5“AŠ•¡þ&jÒP†ºL<©cÿê €ãõ!ü£€ F…‘ý´?Â0kŒ ÂØÕ° ÀÈç1lß‘‘gW“P@#ÁÓ˜´£~Û)`Œ»OOÈD˜Ú›PqÒŒ}SͳvÏÁî9½ÇDÈCP¡üÊÏ£ú[°ý¢ú€Ò4€ ,r6áË 8뉶ÀÔScQ5¦}Éw`¤†ÉÊÊÒ¼§yÊ™››O:Us†=<£L&c†›ë­Ÿá)e¢­œµ‚ 2 0h)ƒÓ„þ‹ªôo¸ýÃmùŽŠ„ÔÔT‰D"‘Hòóó}}}.\ÈMÔÆÆÆ±±±ÖÖÖZ‰P?9÷d€ŒÅ”]†ê-ɯXYY @àââ²mÛ¶ÒÒRnÌpÈ¿›3 óòË/›ššj5Rè4ç> €Œ†;ÈÙ„ÂC|ÇA´Cu* ”fùgYVu¾~Õdªùp³ê›˜˜t•G킪³ü×ÖÖj˜šÿܹs"‘H(îÙ³GCxJkà×ÅŒÒJò¹ M{q¹û¦ÛÑÄèVËOlî.öÂÓì1°§DlÞç|D~ÖÏEáU§ò‡ÊŒò=J³üÇÄĨÎׯšŒ[ @žgSSÓ»ï¾ûüóϳ,ûù矫ÍK¯aÁ¥Y%4LÍVUUuòäIn‚®ÂSZ«@ñ,P·Ò'%%ÅÍÍmëÖ­UUU}~ ”€Ö †¢SÆ–c¯ÎcÿmÂ& ÙŒ×ÙÊ+lgßa‘ÿêg JC 4Ë¿···ê|ýªÉT¿#_½z•íbÆù5, Th˜šÿÔ©S¬Â"]…§´Vûë@u¥ùÅ)))Ù´i“H$Z±bEff¦V®?- O Û¬?a˜ ¦§`Q ž?‡é`è9äp/ûöíÛ¹s§››Û«¯¾š››ûðáÃåË—s}{œ;::¸)ø•’q>òFપª-[¶,\¸ðñãÇÜŒÿª9pbbb‚ƒƒœœ¢££5„§vj~î!7‰¿âtüjÃSZ«@‰†•\]]·oß^PP0sæÌU«Vùûû÷êÂöý½ž ÇK¹˜zŽ¡tß"ÜÜÜ›g¹¹õ=<< 2Ë?˲ªóõ«&ã75jݺuuuu÷ïßW;ã¿üÔ P¢aj~¥Eº O5™¢nWÈËË»~ýzSSShh¨†|ú†þðL,øŽ€èêTþ¯½öÚ¦M›._¾\YY™‘‘±råÊ…  …B¨Ìò­:_¿j2ÕÅÌÌ̆©¯¯W;㿜†”fùïÕÔü=Y«@‰Ú•H¥Ò¸¸¸   ¨¨¨€€€ÜÜÜíÛ·w›[¯õ¿^‰.In±o°â·øŽƒôE?Û 2•¿L&ûè£|||ÌÍÍ=<<Ö¯_ßÔÔÄ%Všå_í|ýªÉXuí ööö!!!UUUjsàÒwµ`€Ò,ÿ555=œšŸÛß“µ ”6TWà$''GFF¦§§÷ùú«}Gh=¢Õß"÷ü”+<õÆ®æ; Òk´€®éy¥Z€è+ÃãÞn4܆s8f\†ão‡æJ¹„>*ˆV]û=ž„Ó<û)¦ñ !÷ *ˆV=µ“¶Ð[„ T­²{žï!=EÝ@ !dˆ¢€ô^Ó=\‹šk|ÇAé*Ho´VCüG|9‹Àvò !¤_¨ €ôLgîíFîN ç÷Ãc%-¶>dddp£È Déª+¯AK)&ÆÀûÏ06ç; ¢S§Nå;¢M...Š{h$0é«sad‚gþKW¾C!„h ¤:ZaÜý´V„… B¢¨!„ QTuߣì,ßABô„ `e¸õq9bù…¢'Ô ”‹p}9îà¹=ðÒ´>*!d0¡_C^Þ§ør"¼t^«hî~B†ú0„µ?BÖŸP‹§þ‚§·Ãh8ßBôŠ €!ŒaÐR†ß^¡•[šh!„ QÔ@!C„2DQ@!CCCi2®„¢ã ßqB ƒÛ‰œH‹€ý 4£'!DuÔ:ž ý”Áóáù:ßÑB ƒW{®Î…$!g1:Œïh!‡ €AJZ‹ÔÙhyˆÐÿÀÖ—ïh!†ˆ €AªôZ«ú-l¼ù…b h$ðàÕþìù‚b¸¨ „!Šª€!ê}üñÇééé|GA´é/ùËÔ©Såi!D½ôôôŒŒ ¾£ Z“””TZZª¸‡~Bº˜˜ÈwD;Fy¹'ú0(<ÊGÕÏßÔÔ´~ýzSSS—¨¨¨òòrî)†a²²²´{º{÷îÍ™3ÇÒÒÒÑÑqÕªU=ÒnþÝbÔÉÈÈ`¦¶¶V5±Ö¯!ZAÀÀ×ÑŠ´ÜŠøiÏïììœ3gNfffRRRYYÙùóçÍÌÌ¥R©.N'‘HBBB¦L™’ŸŸáÂ…œœœ5kÖèâDšcàHMMå¶ýüübcc­­©ç0¨ hàË^‹ÖjÌùš¯å|>\XXXPP`ii ÀÞÞ~ïÞ½Û¶m31Ñɧk÷îÝ“&MÚ¶mggçøùùíÙ³ÇÆÆ¦‡90 SSS3räÈ>Ç äÛVVVò‡/¿ü²¶NAˆÐ/€®ì îÿþÿ„Ù(ýœ°¦¦FiϱcÇÖ¬YÃÝýå±±±ü¡L&‹‰‰qqq9rdddd]]·Ÿa˜ãÇ‹D"kkëM›6ÅÇÇ;99ÙØØ¬[·Nž ..NqãÌ™3Ë—/—ç>>JûmmmÏž=ÛÕQÄbñŽ;<==322òòòf̘1þ|ù³áááµµµIIIfÏž-ß.,,dY666¶¨¨HqÃÜÜüÊ•+]«¦¦Fi{̘16l¨¨¨8yò¤‘‘Qee¥ü©>G¥ôêTPŠD,þùç^^^éééáááŠù¤¤¤¸¹¹mݺµªªJÃ[ gJq’ @BB¯öð é¯Îö«öì8¶ý±NÏÓÒÒràÀ__ßiÓ¦%$$´µµ)%011¹víšü¡ü»…D"a¹ý;öÈ‘#\‚;wîhlläžMMMeY¶££Ci[ñƪÈÌ̬W€P(üä“O¸‰„û¢Í=Õÿ¨z^Œ?þرcÜžòòrccãææfŬJJJ6mÚ$‰V¬X‘™™©öêYÏ €ÆÆÆuëÖ‰D¢áÇ‹D¢×_½¬¬Œ{JÃ[©-ŠWÛð³eù»\ªU XÿDÍwø&–Ý'î«K—.¹¹¹Ý¾};>>>55uÉ’%Æ SJãä䔟Ÿ/(‘Hä]€äJKK===¹mn£¬¬Œ{heeÀÈÈHi»+îîîÅÅÅŠ{¸»³ZûöíÛ¹s§››Û«¯¾š››«X1¥Å¨ºU\\¼|ùr®¿³³sGG‡ü\WW×íÛ·Ìœ9sÕªUþþþý9>é¹À@gP—‹ €Ëe!ã`¤Ó“ˆD"ÿK—.]¸pëô¢jîܹûöí“ß‚Á7Tó)**â¶¹ ''§¾…ôÒK/9rDþðîÝ»vvvòž Ü×Å{ë¬Y³JJJG=mÚ4ÅÂI‹QuËÉÉéôéÓÜ×®ÎÎN‰D2nÜ8Õdyyyׯ_ojj ÕQ$ZÇõ¸xñâóÏ?oooÿôÓOïÝ»÷Ö­[:ê` Ôvùí ƒº\T Xfp[¦ë“L˜0áüùó)))ååå“&MŠŠŠÊÎÎVJ³yóæŠŠŠððð¬¬¬ŠŠŠäää-[¶(¥yå•WÞÿ}±XœŸŸÿÖ[o…‡‡+v¤Ñ ..Žû¾/ßx÷Ýwoß¾ýÎ;ï”––Þ¹sçÍ7ßœ?>—›@ 8sæLSS×Gˆãëë»qãFWWW???–eÍÌÌp…YŸ£ê ¥òråÊ•111YYYÑÑÑÓ§OW|V*•ÆÅÅEEEäæænß¾][‘èšž{(µêsÉ’’’íìì>ýôS999¡¡¡B¡ÐÜÜ|âĉ'NœçvõêUWW×C‡©¶ÉK¥Ò·ß~ÛÁÁÁÞÞþ³Ï>“Ï0Lrr²‡‡‡@ X²dI]]R;¿<Û/¾øBéâè¹ÓD¯é¨²‰ >ÍÍÍû÷ï Q}êáÇ‘‘‘¶¶¶áááÜ·iÅ6€¶¶¶ 68;; …ÂeË–)ÕkØ«¸Á²,÷çmnnîààðÚk¯ÕÕÕqû=êàà`ggÇÝ)¸³|ýõ×'N433óôôŒgY688ØÌ̬®®®ÏQÉ¡‹6ù)¯ÀÆE"‘••UXX˜Rcrrrrdddzzz/ßÝêa€ž{¨mÕ_°`A}}}BB‚‰‰Ikk«··÷êÕ«‹‹‹+++B[ýÏÛ&02ýyÛÚK}úÀ8ÈZ”ö%¯ýkO^ÄæÍ›Ÿ}öÙððð÷ßßÙÙ9==]µ›ko÷ññ1bDo{yxxÈ7|}}çÏŸ¿aÃÅV}%íííþþþcÇŽ½wïL}}½âÌ\›¼³³³@ øàƒ²²²nÞ¼¹bÅŠ÷Þ{ÏÛÛ{Ô¨QJͪ[·n?~¼••Õš5käÁK$¥Ù>¸NEEE{÷î4iRXXØš5kžyæW%®N/W¯u[mD Ee*{†}\ÌwD¾[Ê7gáçñ¦ìi7öR [S}ú–ŸØÖZý†Ø‹`úì Úª•€gÏžuww755 ¼páBXX×+ÏVm›¼T*]»v-× èèÑ£Phرc‡———Í¢E‹ª««YuíüJׄ—NšA¥ €–„ ØN\|fŽ˜~‘ïPˆ:lZÊÑüÍð¸ø—xnœf«I_šŒö&˜9ÀBsG˜Úë=âî-^¼­À0ŒX,öóóã;þb&!!aÉ’%ò=T4@”ü ?`öQ¾ã ]Èx ű`4–®°t‡•Caå¡>½ËB}FGˆZT RÜŠûËLæ;”!Iö¹h¸ƒ¦\8L‡ÓKjÒø¬ƒW4,Ýaî†:× *ƒ¸š„ € o¤5xzÀ  n£ä$7ј‹æ€…‰¬½1b‚úô¶Oë7>B´€ ƒ×þ¹;áµ Î|‡2”4ÞÃO`÷C1â)ØøÀÒ¯%wÑ* ^áA°2LŒá;ŽÁEZ‹ÚŒŸ;VNú›šnKá¶TßQ¢_TYiðÆ­ÁôË.ä;ŽïqŠ"ó œ÷ÁI{|;ÑÞÈwX¤K÷îÝ›3gŽ¥¥¥££ãªU«äs¾ê £NFF†Ú©@†ÉÊÊÒs„ýD€Á3»çøbà“Öà¬2ÿ€¦<¸.ÁŒ¯!Aøxæ¾##êI$’)S¦äçç_¸p!''gÍš5ú 55•Ûöóó‹µ¶¶Ös0º@U@dh0µGèUŸÑéú9D‹vïÞ=iÒ$nfoggçøùùíÙ³ÇÆÆ¦‡90 SSS£4X·WÇßZYYɾüòËÚ:¿èZ«Pt×–!É wÔ§õºû,ÕyÿÏœ9³|ùry‚É“'WWWsÓè+ÖÀÈ·•Ö Pœ²_ëÓës'UZ€Ã²¬êJrÜ4¥ý½XÚC°ØNÔ¦ãöf\|§œùZÊáó6LíøŽŒôZll,7÷™|£°°ÐÃãWÃè”VMQ²lÙ²¢¢¢?þxÕªUÜ:Ü×ó>úèøñãIIIׯ_¯ªªzã7äG;vìÖ­[‡Þ¹sgllì?üð¯ýëã?–/§|æ Å_{÷î=tèP||¼X,nmm]½zµâ!^^^Û¶m«®®îá•Ñ­n§ Ä@e¯c=3†ý~5û0™mkä; Á¦çsé‚™™Ù•+WÔ>•ÉØ.Ö àžêÿôúèbå¥HÄb±Ú•³*))Ù´i9[C{ IDAT“H$Z±bEfff_/O_€Ö ƒ‡×*„çbn!žû\`XO«†É€àîîÎMõ,×ÐÐ _zZ•Úu8z›^]¬4 ˜ÀÕÕuûöí3gÎ\µj•¿¿N×OT¤²Óø>l'ßq€¶zT«þ)ë±°yJ¿Ñýy饗Ž9"x÷î];;;yOPîû¬â½•[' 11qôèÑÓ¦MS\e…›^ŸÛÖéôú\ΧOŸæ¾_wvvJ$¥µe8yyyׯ_ojj ÕQ$=A€Aº³mCzJi !u6’ñÝâ.×±"ƒE\\÷}_¾ñî»ïÞ¾}ûwÞ)--½sçΛo¾9þ|®Ž@ 8sæLSS×Gˆãëë»qãFWWWÅu¸œÜôúb±8??_ëÓës§ãVÈÊÊ*((ˆŽŽž>}ºâ³R©”[Ø *** 77Wu1½Òg 鑪«ì1°uÝÏî=ÉZØ’öê\6~8{ÜŒ½:-Ž£Ê}¾è³ *óþ³,›““jnnîààðÚk¯q“ï³,{ôèQ;;;®¿W ¯ºN€|ÊþþO¯.ÚTWP»Ò€\rrrdddzzºv¯^Ö¾i=f*¯7$|3ÕßÂa:Ü—Ãe!Uëó‹Ödh=ƒ×teçœÌw_ñ„¶uˆï8!ú@!„ QÔL!C„2DQ wl':ZyŽ¡)7ÞÛÉs„^Q wU©85­Õ¼ð ýP{mÞb „êªwbaå³Q<œº­™Q(;‰›1q3MãLÈG€~u çßñ!ÄÀP _åç!kÛ2}Ÿ·ö:Ò"`6 ³²`é®ï³B úUvö/À|´ÞÏ{ö¿AÀ´„ !DŽ‚éQÇœ…)bì›ú>5Û †}Ÿ—bÀ¨ýtOಇS3Ft÷'½µxñb† .'NœP|‹© HŒ‡Ã+f|ÇAHO¬]»–ï(ˆv,]ºTizäôœ^â;BzA$-YbxKV>Q-¨ hÐi)C}ßABú0¸´5à?³adŠYbªô'„hF¿Y3RÃÐþÁgèîOéý,ؤ¿‚G÷ú-,œùކ2P0XÜþ+ÊÏá·ß@0‘ïP!U Oàîøíý |‡Ò/j{.ge©oÓî*¥†CtGm02™Œa˜ÚÚZ G©†ªùÃÔÔÔ´~ýzSSS—¨¨¨òòrî)=¼:ºbñè-ú {5ßáæ;˜~QWˬw¶ãæ»p_¯?è$=’H~ž¡ÚÖÖ655Õ××€µµuWéåi8Rêj0FFF±±±üF¥sæÌa&))i̘1?ýôÓþýûóóóMMMùŽŽhB€î•&£­QWwFÃ0ã+˜°z†ajjjFŽ©¸S È·­¬¬ªÕ“4º£ôÔóòË/ë=.};|øpaaaAA¥¥%{{û½{÷nÛ¶ÍÄd0ß^Ô~€\$T¤{eg š§ÛSX…‰…ó«©©Q|ØÙÙ¹sçNOOOKKË€€€k×®Éd111...#GŽŒŒŒ¬««ã3 sîÜ9‘H$ ÷ìÙÃí‹ÅS§Nµ°°pww?xð Ã0ìííûùûñãÇ :::äO±,»sçN¡P¸xñbÅðŽ?.‰¬­­7mÚïäädcc³nÝ:ÍG)½(Õ— Œ<®¡«l9R©ôí·ßvpp°··ÿì³Ï”^cCCƒL&ëÏUÒµcÇŽ­Y³†»ûË cãÿ.8¡áÓ¢áíàÄÅÅ)n(}–¸dIIIŽŽŽvvvŸ~ú)€œœœÐÐP¡Phnn>qâDùü Ã\½zÕÕÕõСCªïHWoÃ0ÉÉÉ`É’%uuuJï¾<Û/¾øBéâúŸKtJò{ lM:ßqôTZZÚÒ¥K}||wþýïwqq¹zõjyyyLLŒ]{{ûŽ;<==322òòòf̘1þ|.1€°°°ªªª“'Oš˜˜´¶¶²,;f̘ 6TTTœ-Þ–eccc‹ŠŠ7Ô~–,XP__ŸÀ½;ÞÞÞ«W¯...®¬¬>>55uÉ’%Æ SLðàÁooon›a@À0Lii©§§'·“Û(++ã:;;02úï«Þ·oßÎ;ÝÜÜ^}õÕÜÜ\ÅÊ)..^¾|9×!ÇÙÙ¹££Cž•••<<ÅmÍG©¾(­ ¢¢bܸqܶ|C‘««ëöíÛ fΜ¹jÕ*ÿ>Ä ;NNNùùùò‡‰DÞHNçEÃÛ¡–ÚÏ’H$R<°¡¡!&&&88ØÉÉ)::ZñpWWWtñŽhx#äÁsŠoŸb¶îOÉ oL^Kê²tÞÐo"‘ÈßßÿÒ¥K.\÷ÃQäääT\\,ÈÕq‹D¢¢¢"n·áääÄ=äê%Íš5«¤¤$11qôèÑÓ¦MS½Ah““ÓéÓ§¿j©½·öü(Õ¥­`D"‘üZPPÐU&yyyׯ_ojj ís$º0wîÜ}ûöÉ›=Á7”Òhø´ô–ÚÏ’Ò»\TT´k×®\ºtIñ)îfªöÑðFr÷ïßW<—í€ûS¢@—ïÂÔ3´œ­´߯F[½¶ò›0aÂùóçSRRÊËË'Mš•­˜àµ×^ûÛßþöÝwßUVV~ôÑG"‘èÉ“'¯¼òÊûï¿/‹óóóßzë­ððp r|}}7nÜèêêêççDz¬™™:}ö™†Fà•+WÆÄÄdeeDGGOŸ>½'öö¨¾ÍÙ®X±â½÷Þ»víÚýû÷åŸrR©4...(((*** 77wûöí=9©ÞlÞ¼¹¢¢"<<<++«¢¢"99yËåU¯{õiQÇÝ1åj?KJÚÛÛýýýÇŽ{ïÞ½•+W¨¯ÿÕß‹ÚwDñuëV±X|ïÞ½5kÖȃW}÷ÞŸROjŽHßu¶k?ÏkËÙS"¶­Iû9³lssóþýûCBBw¶µµmÞ¼ÙÕÕÕÂÂÂßߟ«¨mkkÛ°aƒ³³³P(\¶l™ÚÚpüR;ùõ×_Oœ8ÑÌÌÌÓÓ3>>žeÙàà`33³ºº:µa ßÀmmm7n‰DVVVaaa\‹¢jxJÛ=<Š{QŠ/¡«€¹Äš³•J¥k×®å:Ÿ=z¿®ÒMNNŽŒŒLOç¡AÛX–}øðadd¤­­­……Exx8÷5V±  ‡ŸÕm±±±ŠªŸ%üº:¾¦¦æìÙ³îî¦.\ ãcåÙª}Gºz#ìØ±ÃËËËÆÆfÑ¢EÕÕÕlÞ}ùSR•6Zr ©ü W^ÄoNò³²J/^ 11‘ï@xÆ0ŒX,öóóã;þb&!!AqªPdÍÈŒ†hÞйû_¼xQíü111|‡6а2Hkð(u™¨¸ˆÊoÔ'kº‡‹~8ë…dÇ??÷½~C$ú6˜‡ê B÷vAZg>á;ý™5kýHížì1ÚÕÏÛô#RÃÐ&Aû£_í1/ÝU“~¸Ž¡6ìÒRO¨I0ô âO GóCä~ˆÉ[`åÁw(„?mõøñS<)Ck ¤5xRÖjt<ÕÌ-T“ÞÌãþ„á¶Êÿºš›Ä̾;¹ÍìÊouö2ˆA `ูVcàC+t^íxTˆ–2´<„¬ã7¨KÄ 4 æN0s€µ'Ì`æ3{˜VŸçpžzG—A“Œ €cÌ«02CoÙàÒÙ†Œ×ð¨ !ýe:—áBXºaü»jVvn«¾ê†Þ£F`ÝÈû w´œ§ÓKp4¬@¤Gd-¨ÏƃƒíTó¬Ñpt¶Áî9Lø¿9‹ð\,mADfgâu=iáÆzôuR¤uÈþ ‚âiq®!ª6 ?àQî¢éG4—,Ø¿KW5é_rý,iáA€T^cŒÑa|ÇAx’õZB0Vcà4 #&`Äx˜÷qæƒA‰~0T¤å`„a6|ÇAt€•¡áŠâÆÛh¸­>Íô‹XP_ÁÿŸðþ3CéîßO´ðƒ®t;z˜ôR'{r{÷¾Ã ÚÓ”Ç`¿“½ø<{Üœ=ö„ ûU[õ¾#Ó­žOÑg …~¡‡…@ëè\˜=Vr›ï8ˆöÜÚÌžÏ^_ÁÞÝÉ–e[ÊùHO § …´Bµ * m«¸ s'í4ÿJkpu.šh!+¢ÛI꺘ù`b ^º‹©G1~œGõ9…~è*´­â2FÏÔN¾;ÛP÷=LíµQÕ)EÍw¸»ÿy IvH™‚”'1þ™ÑpýFFz~èê¤mÏ| cS-äÓZ‰‚ý˜² &–Ý'&½ò¸¯ NŒŽVX¸À>“߃}lŸæ;2¢×î*hmm-_ ‹›ÙßÙÙY |ðÁYYY7oÞì6ÃÞ%‘Hä½€úœ-·Þ€··÷¨Q£Ô.ü˜˜øü£­­íOúÓßÿþwSSmÜI4¢@Û„Ïh'Ÿ»;`î¯èîS’Þ2w„¥;¼VaT,D|GCº§´„ŽâäÌ›6mzòäÉ‚ ‚‚‚Nž<Ù“ {uTppðäÉ“ËËË…Ba²Ý¸qcCCâE‹:;;wïÞ}ùòeÅg/\¸’’²{÷€ž¼­ õ RK9Îyá™O0v5ß¡ X-å¨únKa¤ó¯Qƒ­0ÈÐzÄ»a:ž¯ñÇ@Ãv ê ²þÎ?…Ó"d¼I]õ‰¡…xAU@†çÉO¸ÿø~@_]{¡: EÿBùYHë`é§9xz;¦c8oÃGI¯Ð¼ Àðt¶Ãu <£øŽc@©Ë„´Oo‡ãLZ/¢ÀðXºa꾃hžZ§Öó! µh ‹¶†îS‘>{\ˆ;[‘Aí"„h Z"¹…$!åóÇ ÓZ‰¼Ïp)g½÷)†ÙTSLˆvP–T~ 3Xå;ŽAäÁ1FU*ŒÍ!šI…ãL ã;,B*´¤*ÓñN<¨¾ óј~ÓÁóÍUVVvâÄ ¾£ ºB€6t¶£ú[<ó1ßq .þûùŽ€ ##céÒ¥|GAt…FkCm:.âw÷aíÕ÷LÊÎÀiö›w¬­òa§óY !ª¨Xª®ÀÒµ_wÿškøv>ê³µ“cQý-ÒWâ”®ýžÚu áUiCU*F…ô+‡wÃ>#õ7 odÍ(>мOÑ”ÁDøî€Ç j;!„Thƒ©=œf÷ýðÇE(;‹ xíd¨r?Dî5Ãm)‰Fm {ÊNáw÷_—ü½ho‚×´Ê !†€ ¾µ7á´7ã©wø…2´P#0ߊƒeáù¾ãЪŽ'|G@é|+Ø÷ÈÁ3kqóˆ× y4šKø…Ò jæÛŒËݧ wŠca›aÚýª„~Qé·ú,ü°å_B8“þ§—ÀÐ/KBú@ú§æ;|ko…ÛïG&BúÐíM¸ƒñ`áÌw(üa;ñÓ—ô­Ÿˆþhû¡ú*îï…±ßqðŠ1‚óïèîOÈ@D·ýP•ŠajÇw„ÒTôCU*gð„^°(> ñùŽƒ¢MTô•´’[5½/ǶVâö_ÑÞ¨í˜t£òk\|™o€1+ã;BˆÖPÐW5ßa0ê…¾[°…al¡í˜´­1©³qåEX{á¥\ø}†º2xÐßs_U Ád öú@¶0æUƒ^Þ¶½ ?lAþç<¯aäT¾"„h}Us ö}úúÿÓ<ùÉÐ'ÿiøE_à™1öMêÚOÈ`Eãúªá6L,aåÙëÿ¶ÓSt“Vµ7bؾƒ „èýè+Áä¾Õ\‚Šü椶£Ñºû2ØQ#°~‚ùh8‡ó!„Ð/=«º•Ô—Föù{ñÔ: ‰ŒôôôÒÒR¾£ Ú(‰ä© @¿ØNtJalÎw€Ê¯‘ùÈšñÛ+Lä;bp/^œ””ÄwD›–,Y"Hßûô‹12ˆ»¿¬7ßÅýÀ=~Ÿõ¥3+"""ùŽ‚hÃ0J{¨z*¿Aæëè”aúŒžÅw4„ÞP#pïu¶ñA?ÜÞŒÔ0Ø<…Ybºû2ÄQÐ{çÆ!/ßAô•éHø}†é)0wâ;BϨ ¨—𠹤ƒ ÷ŸùŽ€b(è@/Õ|c3Œôç;Bé/*z©ú;Ÿ…‘iïŽÊz ·u!„ô½TóìƒzyÈ5äïÛ¡›€º&ÉÑ÷ÉPÕÔÔ´~ýzSSS—¨¨¨òòrî)†a²²²tzv†ajkkJ¶àûr)¢ 7¤uhÌÅÈ^ÅG!˜ Û)º‰I¶7ßEÊ3ÜÔßIÉPÕÙÙ9gΜÌÌ̤¤¤²²²óçÏ›™™J¥R¾C3Du¹¨¸7j¯èÝ/€Ž'(IÀÄE¤FkÒ"Ðð‚OëµÔ!CÕáÇ ,--ØÛÛïÝ»wÛ¶m&&ƒùöÂ0LMMÍÈ‘#{{ A].úвÇpéÝ*ðåç { ÷å:‹éךîá«ÐR†ÐTˆæêé¤dh;vìØš5k¸Û™œ@ 06þïJ2™,&&ÆÅÅeäÈ‘‘‘‘uuuÜ~†aŽ?.‰¬­­7mÚïäädcc³nÝ:y‚¸¸8Å ±XýôS999¡¡¡B¡ÐÜÜ|âĉ'NœçvõêUWW×C‡íܹÓÃÃC(.^¼˜‹G*•¾ýöÛöööŸ}ö™!!ÁÄĤµµÕÛÛ{õêÕÅÅÅ•••455•J¥ÜéÓÒÒ>üðC//¯ôôô‚‚‚ððpîeÆÄĸºº¦¥¥ååå…„„p·oî(ŸŒŒŒÜÜÜ   yóæq;¹g³mii‘¿ð´´´¥K—úøøèóri !!áW{º=†ôÝ“ öß&ìƒëã\å_²ñÃÙï~ÏÊžèãtdèa`bbríÚ5ùCù—K‰DÂþrG;vì‘#G¸wîÜÐØØÈ=›ššÊ²lGG‡Ò¶X,V{:¡PøÉ'ŸpÛ‰D&“ÈÎΖXSSÓÐÐ “ɸ4yyyŠ·òÄÄD–eÇìØ1.Ayy¹±±qss³‡‡Ç¡C‡¸·nÝR<êðáÃÜþœœ.x¥€Ë–eÙ–––øúúN›6-!!¡­­ßË¥Hµ * ]ªº  8ë¥*fd ¦ìBÐ1›éãt„üÂÉÉ)??_þP"‘Èû´È•––zzþ¼|·QVVÆ=´²²`dd¤´Ý•}ûöíܹÓÍÍíÕW_ÍÍÍåjN¸)Žå644ÄÄÄ;99EGG+îêê  ¸¸xùòå Ã0 ãììÜÑÑQVVVQQ1nÜ8.™|C1fÞÞÞŠÁ+e{éÒ%77·Û·oÇÇǧ¦¦.Y²dØ0奿õ|¹4£@—Ü–bA9L,»OÙÃðþ?€òl„èÚܹs÷íÛÇ} nܸ¡”F$qÛ܆“S'#™5kVIIIbbâèÑ£§M›ÆÝ=•æ¹ .**Úµk׃.]º¤øw»trr:}ú4÷-¸³³S"‘Œ7N$ÉoÍŠGr÷ïßW<—­H$ò÷÷¿téÒ… $‰Úøõ|¹4£@ÇL¬øŽ€7úìį̀ÓÕ)ÔöïÖR·¿ûî»õõõ}~ Û¼ysEEExxxVVVEEErrò–-[”Ò¼òÊ+ï¿ÿ¾X,ÎÏÏë­·ÂÃÃAO2‹‹+..VÜðõõݸq£«««ŸŸ˲ffj~ò¶··ûûû;öÞ½{+W® ôÖ¬\¹2&&&++«   ::zúôéV¬XñÞ{ï]»víþýûJͪ[·n‹Å÷îÝ[³fiÒ¤¨¨¨ììl}^®^ë¶Úˆ>èèè zá…222ª««srrþøÇ?ººº¶¶¶²¿Ttjñt’_HMMå¶åµÀJ P{«¸SCHÝlff–™™Ù‡È YÛX–}øðadd¤­­­……Exx8÷¥U±R»­­mÆ ÎÎÎB¡pÙ²eеçò «v@ll¬âÆ×_=qâD333OOÏøøxV¥=¶¦¦æìÙ³îî¦.\ ãcåÙ¶µµmܸQ$YYY………q-¨R©tíÚµ\/ £GB¡ `ÇŽ^^^666‹-ª®®fY688ØÌ̬®®ŽíâãÑÜܼÿþ}^.Í@ÀD?:äèèøøñcÅò›²Ö ¹žä¬‹@mž]Ï €ÁMwW=S-¨ ¨g~@éI¾ƒøE[ÄkÐÞÄwÿ¥çÎΪ}ÃÕêª38€äädwww@Q]]-ßϲ¬j÷p% Ü;wN$ …Â={öà— h®WxW/ŠÃõNÑp% Ñ+žŠ¢&ûöËI|Á²,ËJ%ìÅçØSÎì£î»ýê/Uû†+åÌmkè þì³ÏÞºuë‡~˜={¶üÀÏ?ÿ\µ{8«òs;,,¬ªªêäÉ“\¯sVá@W/Š“’’âææ¶uëÖªªª>]o½¢_ƒ ¨ ¨¾ f3Þà;–m­f¿œÌžñ`—ðˆÁvvVL£¡38—'˲\×B(‹ÕvgU €S§N± ½ÎY… «%WRR²iÓ&‘H´bÅ o6 `Q-¨ ¨Xê³0òùž¦oÊÃÝíèx¢Ÿ‘– IDATå0Ú›: ÒLK¥«–3ïÒÙYCgp///nÃÇÇ@EE÷Pm÷pÕœ» IË⸺ºnß¾½  `æÌ™«V­ò÷§µ%o¨è†»µÀ. §é‹ `¿–du<Á·óð¤¿ý6ÞÚ̹÷Jgg Áå½¼óòò†qqqáªí®š³R¯sE=|Qyyyׯ_ojj íÓ‹#D ¨èº ³Áˆñ=KÍ¢$.‹´9&‹í@Úb4ü€_Áæ)­eÛW¼wvVí®–†Îà7nüá‡îܹóæ›o.^¼ØÚÚšÛ¯¶{x¯h~QR©4...(((*** 77wûöí½=ÅPF>´Œš¨&ý5öëé=M\'f­ÕvÝîÝØšt-ç© ¼tv†Jßp9Åô:ƒ;vÌÙÙÙÖÖvùòåJ!©v×’R@W/Š“œœ™žnˆo¥*l ý•6†Uh #ê}9ÎsợG‰o¾ƒ²ÓøÝ}ÇDH¿µ”£ùZÊÐR†–RLØ3Åç/^ 11‘§ø4aF,ûùùiN£:e¿æ»Í¶Ïˆa–,Y"ßCU@=à³®=KÊ¢$®KºOH_²ÿ‚ Oã„%N‹ðÕ ¸‰?Fm¤j=ð‹|è=àù„Ïö(emZJá¶TÇÒ…Îv4å¡ì,îí£.~†š9Âižù;~{ó`i+”#,£Ç­\ú¤¸¡Ö²eËÆŽ›ýàÁƒµk×®\¹²­­{jÿþýgÏžýî»ïÊËË_}õUù!{÷î=tèP||¼X,nmm]½zµÚœ÷îÝ›}ðàÁµk×Ê‘p¿>úè£ãÇ'%%]¿~½ªªê7ÞP<0##ÃËËkÛ¶mŠ¥Ž!â¥*jкù.{vßA!æ§6{=ûŸß±gDZñÃØc`=éÀ–ŸïgÆØ ðÑ{ qº5y+¦§h!¶S ™A¦³‹Eë¿EåW06‡Û|°ï±¸ +áô’~ãã øè³Á¼j3Œ†ÁjL3i­Â73ðÜÿèßh#&2u´¢ñ.ï¢1÷çÿ[J1á0éoj?½O龤ÁÁÁ»víš2e ûë ¢ ¸µbT|ìÞ½{Þ¼yX–mllTÛ¹Û\ÅTO|,]jˆ5ÃTY þ32&ò áɃcø~dÍ`6 #&`ô,&À~È}!àÆLxxxÈ7Ô&SðÁ«¨¯¯ç:êlܸñÀ èðáìì,>øàƒ¬¬¬›7oö*6nÀ‡Ïˆ#ÔøHLLüÇ?þÑÖÖö§?ýéïÿ»©©i¯‚NñSEÔëdÓ"ØDÛø#ß‘{RÁ6檪á.›ÿ¶ê*ÛZ«ß˜”ñÞð¡U qíîÜþ+¦}‰Ñ/ò Ѷæ¨ÍD½’HnCZ»ç–ÁwXšò8Ҫ㨠H£ô•pø-Ƽ¢sU¥âöfL~ŸîþƒMóC\ôƒ´Œ¬ÇAø,žz¶OC0‰ïÈÈPG@×:Ûð0£Bôq®–R\[—˜°Q§#ºÐ)…‘ºz^ g<µB?Øùaؽ‡EH—¨èZã]t´Âî¹îS¶”£éG8LÓ×nµ²ýðü!mN!Gô ùj®£6µ×Ñp *`j§œ†1Æø |GH7¨èZ}6†YcÄ„îS>ˆEî.,¬ì{`ãi_öñX¢…‡ðS j¯ãIŒ†Aè‡é˜¸Ææ|GFH/Pе:1lŸcÜ}ÊÒSýFÊ‹¢A«æ:Z0n ì»çè¾O(*ºV£GC±ZJQ'Æ„ÿÑ}@DdQ g&«y6à ½DˆöQÐ…N)nÃçíîS–…‰uÝ :ZQ›ª+¨º‚ºïÑÙŽ ›Ô„ Tt¡ñ:Û`ëÛ}ʲSpšM•[}r6¢æ::žÀÊ£Bàù8Lƒ¥ß‘ñ,##ƒ @%*º`ë‹yŰèníui-ª®bê‘^çßxÖ^ê{ ý6®ð_‰QÓ`ÙÝ›>dL:•ïˆ6EDDÈgCâÐHàþ):ñj,¬Æ0ë^õ¤)¾ðŒâsxé[G+$ÙÈw„ úÐ?öðÿgïîþ`‘ùŒ-0žÆ|éEã]T\FÅ%T‹ŽV,ª‚©=ß1bè€ÞåŽk13 #é÷µ.•EÙiT^FK9ÌFÁ1Ž/bô‹0Íwd„ ú _MyÈÙˆ§Þ¡»¿Î•Fs1Æý Ž/ÂÖ·ïcô¼è€u¶ãòT°2„}£á|GCêè€Ý߇†Ûx1ƒîþÚÀ¢. e§`bE£ðé*Ôi“`¸­ö³5±ÆÓÛ |Fû9lª¿EéI”AK¬<àÅwL„ TT¤‚•á„ ž?÷H¾C! :Zqs=žDk%“á²¢ù°}šï°À耊†Ðñ¤û;K{†Ùè% 06CK9ƽ ×%°ñá;B*TÔ߀‰e7·˜–RœñÀ‹×`÷¼¾Â"@ð)¾# dP¡¾q*êoÀvJ7³@—Á0ŸÕWLCÆ£û¸ó>ÊÎð!CýPQ£ûÙÊÏcô,0tõ´¤ý&¢è_¨¹³Q˜ôW¾"dH [دu¶Ar ãÞÒ”¦ýªþƒ©ÿê>7¶“ÆiÄ¢ú;}‡I`epž‹iç0:ŒJVBôƒþÒ~­á:Û`ç§)MåW`;0zV÷¹ÝúHkðü!mE7Ø´IÛ)xæ#¸.Åpß2´Pðk²Ç°{Öã4¥)?û î 4ÜÁãÙÏ´Ý`3\ˆù%45!|¡q½Äv y4ÆoÀSëºIùõ4tJ1óÕÛÑ£Õ• !zD÷¦^jk€}œÃ»IVš4<·o¨ßýeÍ(Ø”gps=ß¡B”Ñ/5ã¼F¿8¤kÿ›KPðOB›.‹àýgŒ à;&BȯP€ÜÛ…öGxzßqð‚EÅeÜ߇ò/aj¯Õ»š¦à'Ä0Q mmõ¸·6Âlß¡ðäÆŸa=Ó/ÂaÆP¯#İQT¥bdŒÍùŽƒ'Ò:˜Úñ!¤{TBÈEU@ aô‹°pá;Ž òÔ¤aÒßøŽƒèÐÇœžžÎwD›þò—¿Lúßõh©Šö­UÈ|÷øŽÃ°±(=‰‹ÏáJ(jÓÑÙÆw@D‡ÒÓÓ322øŽ‚hMRRRii©âúð É-Né2Á½Ý`e¿AoY àÇOðä'¸-CÀ¿ ˜ÈwLDçùŽ‚hÃ0J{¨øEÃ-˜Ö4-Aáˆæë1 Cò0 Ùo£µ+0þ]Xå; BˆPð É-º^ìq!šòà4[ý³R0Ãs—GS;¸ý>kaîÄw(„­¼÷¬Þ’äÀÖ·Ëgºˆa#`¤þÙ»;ñÍ4`ðö§r˜Ž)»èîOÈ C £MyšÖþ)Ž3ÔÏSßZ{Áùw€rý!„2*wÀʺ,:ž ê FwQÿsïC ÑÍ2B§ù{PùßqBô„ Àp!Æoè²m³ú[t\XXXPP`ii ÀÞÞ~ïÞ½Û¶m31Ì·†ajjjFŽÙÛ êrÑ/€ž1sT³óîX¸Âc…ޣђ¢a¸-æÜÂÔ#t÷'}vìØ±5kÖp·39@`lüß5àd2YLLŒ‹‹ËÈ‘####ëêê¸ý Ã?~\$Y[[oÚ´)>>ÞÉÉÉÆÆfݺuòqqqŠb±xêÔ©îîîä’%%%9::ÚÙÙ}úé§rrrBCC…B¡¹¹ùĉOœ8!ÏíêÕÿÏÞy‡Equü;Ô—¥ÃR!–ˆQ!‚%$v4K^óªÑ7¶äšX¢&¶¼±Å5€HD4ê«!ÑE]4"  ½.EÊÒîïÁuÙ]–¾K¹Ÿ‡ÇçÎÌ™sÏ̬÷ÌÜrÎu›£GnÛ¶ÍÞÞžÇãM:•µG$-[¶ÌÌÌÌÄÄä‡^'se&44ÔÞÞžËåúúúæåå±+ªLLLØ>"±ÚŸ~úIêæäää(óv5Bi6…q$놪hUeª¶€Ò®™2eÊ”)S344<þ|}GÙ&{ëÖ­=zôˆŒŒŒ1bÄ„ ÄG}||rssCBBŒ;V\NJJ"„øûû'''KV®\™‘‘qæÌ55µÌÌL'NÌÏÏÖÐÐ(//wvv^¸páÓ§O3339¢­­-‰Øê<<<ÂÃÿûî;GGLjˆˆÄÄDö2ýüülllÂÃÃããã½½½Ùæ›=ËÅÅ%22266ÖÓÓsüøñìNö¨¤ÚÒÒRñ…‡‡‡O›6ÍÅÅE™·K1‚ƒƒëìið …Ò5i¤ÐÐиuë–xSür) É«ÍÉÉéĉ¬À£G²G¯]»F©®®–* ¹Õñx¼Ý»w³e¡PXUUàþýûâsrr ªªªX™øøxɦüôéÓ„^½z²iiiêêê%%%öööGewFGGKžuüøqvÿƒX㥫–RZZzøðaWW×aÆWTT¨övI"ëh…Bi––– âM¡P(žÓ"&%%¥Gl™-¤¦¦²›zzzÔÔÔ¤Êõ±ÿþmÛ¶ÙÚÚÎ;766–í9áóù’'øùùyyyYZZΟ_gކ €§OŸÎœ9“a†a¬¬¬ª««SSS322zöìÉŠ‰ ’6pvv–4^JmXX˜­­íǃ‚‚®]»æëë«©©©ÚÛ¥ê:;EÿàÏQˆÛ¡j;(–>ø`ÿþýì{(.—{ïÞ=)>ŸŸœœÌ–Ù‚¥e3–3æùóç§OŸ¶°°6lÛzJ…9óòòJNNÞ¾}û³gÏÂÂÂ$±Í¥¥¥å¹sçØ·àšš¡PسgO>Ÿ/nš%ÏJJJb Ož<‘k<«–Ï绹¹………]ºtI(ʵ_É·K1Ô÷W 뚪hj*» ¿ DiŠ¢(JËX·n]FF†OTTTFFFhhè† ¤dæÌ™³iÓ&@ðÙgŸùøøp¹ÜÆ(xúô©dÁÕÕuÕªU666$„p8r–àTVVº¹¹999ÅÅÅÍž=@~~¾¤ÀìÙ³ýüü¢¢¢çÏŸ?|øp³fÍÚ¸qã­[·ž§GAAADf<6''çüùóvvvÚÚÚ—.]=z4;+V[QQ±jÕ*>Ÿ¯§§7zôhvU$-_¾œôóÏ?Cb `ëÖ­ŽŽŽ“'OÎÎÎ&„xyyq8œ¼¼<)ËÅ”””:tÈÛÛ[™·K1èò)!óïã·x?ú=¥‰rjŽ¡¡àW…eÍ¥²Äðžˆ{h7J³™:u*š€a@0pà@UÒR† öõõïéÌ+5EA 4t¡×CΡ¬k`Ôa6¢ÎÎ'?BM=æ)Ǻæø#RB1ä8ìgÑøt E]ÞÆÀà 0êreü#7hê¿ÞSYŒèµòW·œ—Âách7y"…B‘K'î&éòƒÀ1àö•(ów˜ª³'ñ j*à¼L v55-ÚúS(”Æ@@= 8%/`!áHâ€ÃÇÐ6Ršu …Òvtm ÊEY†|ñ;4»ÃÈíõž”s(K‡K{zý¯¡Ñ)JóéÚ@£Fü£Áreþ³áuDÿ³ ü í(hZæœï¼;mZ‰2—3òhÅ*Z¨MntxÅ:•Û½£@tû¡k«ëH÷ò‹±žŽéëͼ;ÈÀÈʱ«j*ñ÷ˆßƒó%²oy=55ãÆc&$$ÄÁÁ!==ýСC ÚÚÚ­^xY¡¡áµk×\]]èëë+<‰Òñ ºý判‚<'Át(L‡ªÈ Ê2pk:ò£0ä8ìg·iUJ\.¹ÖQOO¯­–>ÖC³Ã»·ýú Û]» ¨ñØÍh¯ÿù÷6%Ï0âj«·þJ\.ç½>ÄÁÖ—,YR_÷ .ðù|·wï^v§Ü¨ñ¨'R¼dx÷úBÉ µ³³ãr¹S¦LÉÎÎï'„È——º±þú„ês©àvµ7èƒn׺ÁÕÔöBúo$¸ùs4)Ïm]Å* \.ç]J³ä&lÝÆÆ¦¾ ï£GÎÊÊ:sæ žÔ5^ (ˆÏ.¸W 0`À€èè蘘ww÷±cÇŠMݳglpy"³XŸÕ¯@¸1¡Þ/_¾lkk»y󿬬¬¦=æ¦ÓøP  ºý¡Z–6}Ð]ØÜ{KUm„ÊPyàrÙ8ï Ò`wIꋯ@ ë¬Zµ*&&æÑ£GŸ~úéÔ©SÅ3å——…ÕßHáú‰DžžžóæÍswwݲeK“4(ú Ûõƒny¿RGåboò`ôβ rÁ…<®Ý¬*•茨$p9d⼋L×0»Ù`w"Ñ+7j¼@ ¨O‰8¼»‚Z­¬¬ gΜ)udƒËK&ÖßáúÊ„ÐÐÐ3fDDD4á7@ )N&Ue²Ze €>èvó i>15øECNÀöÃ:ûŸ òLɇ†.ʳq¡'¼/¨`úÿó`<ý^g¡¦¥ìª)R¢P‹ÂÇÈ¿‡ÂX”¦ ¦#®Àü)Yš “Aó¼¢(5•èÞ[zæU»CC’Ž€Q‡‘Ò³@Ä|˜è»jÒ£²JK¹=σÁ¨CÏÜ>°ýÜ>èÞ .ª¶Œ¢ºª(|FCÎ>ó*?Rƒ¤#°Ÿu%šEð÷—ˆÛ ×mèõ¥ë¥t* PƒÂGà½%?ÈUï5èµo@]N*]JW£Ë:€8è;Jw°'¢4fï@æ¼|§…Ê3‰Ô j1Ãýæ(¯^J‡¦497!Œ®m÷Kž€†úm–ï¸o*Ù@J{¦Ë:€Xtï%½3ë*4 `<’Ãômå}×T"bRÏÃû<,Ç)©RJ' ý2î-ï-tï ‹Qà @÷ÞÐ2TµY”ŽAWu/“ä´³™Waò6 ”g!õ<Ü*Ïž”¤]€×YXŒV^¥”öOÉ  à4¹p^"GÀn&ìfÖŽZQ(M¤«:€1T•Iï,N„݇|šÝa3UyöØ~#7ù¹é)]Š !REA4„Ñ>@…` g+ùò´é§´€®ê:ÙÞYÆÞGM%è;¢ÔZ?ä½"hëOPY„» aè £A°›î›èÞ zª6‹Ò9骠>Ø™—Ö“Um¥“R#‚0ùQ(xŒAûät³…o1LQÔP(mŒðòÈB~ bPS M}º¢²šÝåÈ·§Ö?$$D6ü¥ÓÐUWS(Jã}P]†î½ÀPû§ÓúñòÚ‚ˆˆˆ””U[AiM<<<ø|¾x“:¥Cª!X ÇùཥjS(­Dq"òîÂämt³‘s´"Z<¥ÛD¡4 íR2wþ”ÚéF”Š(yww·öO”nò³|@[J{¥ë}ÔˆPU-¥æ¡~`žþŒW`ì®(-çÑ&<\FÝ߀‘ŒÃh0¸½ÁÐ×)J£ë9€Ôó¸1¾ÅÐx•뼦Ï‚ÀR m“6¬:z-âvbØE˜wž ‚Ê"ùƒ´Eÿ ,¼rfS(Š®—¦ðôì^·þr#9y¸2 1_·U½±ß!ö[xÑÖ¿½BPøOƽ¥øm Ni#b¶|A˜ £­?¥Ðõ>Z caP7 Pö_èfQ caù^›Tú,Ñ«1à{XOlý”–Pš†G†’ÐÍFn°›“·Um…Ò¶tI õžu&^xvú=a4¨M*íf‡~[Ðó³6QNi!ÝðòìgÃh0ŒÜÀ1UµAŠ’èb€T£(Î q¹ð=®‡Ó§mU¯ÉÛôuR•T"çrnãͯå Õjq1âwU˜E¡¨˜.æ^>Euy@йwQ]5-”gÁþ#ÕYFimʳŽœpdß@A H5ôìáøot³UµeJ{¡‹9€¢8€©åŸȹ ÞŽ­ópÓ/NƒÑ€¡+L½Ñ{ L<;Êú[ Eit1PS Ó¡uæöe_‡±'RBÑ{µêÌ¢´6Žóá´FƒëL÷¢P(uézë¤H>-C¤ÿ†Þ«ÐÍNÕÖPAM%òî"ëOd]<œ—ªÚ ¥£Òå@[½ è·EÕvt"H5„jýìpT½Ç ¦^p˜K3hR(ͦ‹u)'?âñV¼¬j;:¿ã¯qà˜ÃÌý¿ƒ©·œ”Î ¥‰Ð/€V%ó*þ‹>ëÑÇOÕ¦t.ªËQò¬Îè=…Bi1Ô´%Ïð›ÌGÂ3 94š‚(™"ó òî`̽v•…BéÄÐ. V¢ª7&¡›-Ü¢­£¨.CÎMd^AÆ(ˆ£ØNCˆ: E9Ð/€VàÆ$ä 0& sUÓA¸â…ì›àö…ùH˜„©²I¡(™®ôŽi›¬öªAMChëßîÇ3UÛA¡t]ºÒÀ¥¾°z¿vv&©ÁeWT1p/øãUmYg„T!'aèþìfªÚ …"‡.ó@ªQô.ε›Q€Î&leJž## aȼŠÊBè÷„óUÛD¡PäÓe@i jD0èY»™5mè÷€¾“JÍêDÅáÆ$ýM}˜½×m° ={U›E¡Pê¥Ë8€¢x0xõ}Œø4=KëÑÍü`ù#Œ=è4žÎÁÔ©SCBBTm¥5 öõõov% m -^ífæUT—Áz‚JmêˆäEÁ°Ô´¤¨ëÀõ[U˜DiCÜÝÝ—/_®j+(­Ã´iÓ¤ötPœðúõÿe*òÀ1o@3µåÝÇ´ «!óO¤þŠ´ (KÇ;Wa6BÕ6Q”ŸÏ—|a¤thº°(Їþ«€ÚþŸ Í\±U–Ž¿|`=n‡ZÑÀöHÕK¤_FJ(Òÿ‡Ê—0쇹°zFƒUm…BiºŒ0ìÃ7kË ® ëIÍÑSS‰“À1Á[ß·¢u픸xô ̼Ño+ø k¥jƒ(JkÒe@ÿï^—ßÚ¾ iÐ=1_£0£ïBC·µLk¿ôüz~m#UÛA¡PÚ5U "š×úgþØmxk7º÷nmƒTAn’~’PÛ˜¶þJ'¦Ë|´œ² Üþ¶Óá8_Õ¦´‚ܼ8!(M…~OØ$gb…BéÔtÕ/€f XuîUµ-#7÷—㜠~÷Dúe8ÌŸh¼O[JK(**úâ‹/¬­­µµµ­­­çÍ›—––Æb&**ªMkg&77·£¨…ªo—$ô  ÑôY R-CUÛÑ2âv <o|þø.4•Ò–ÔÔÔŒ7Ža˜‡ôôôC‡yxx$$$hkk«ÚºvG»º]Ô4Þ@U[Ð 9A£.SZ—ãÇ'%%%&&vëÖ €‰‰É¾}û¾ùæ Îܼ0 “““cllÜÔÛÕí¢]@bLš IDAT‘’çÈúSþ!ÚúSZ›ÀÀÀÅ‹³Í™.—«®®.Þ¬ªªòóó³¶¶666ž1cF^^»Ÿa˜S§Nñù|}}ýÕ«WYZZ|þùçb€€É‚@ 2dˆ®®®Ý‘#GX±sss##£ÿþ÷¿>ÞÛÛ›m¾Ù³\\\"##ccc===ÇÏîdJª---_xxxø´iÓ\\\”y» 88¸ÎžÏéðd^% e™„bL~µU±=­Nuyþ ùˇi“_ôÉù$;œÔT«Ú,J‡§‘@CCãÖ­[âMñË¥P($¯Z4''§'N°=PXXȽví!¤ººZª,äVÇãñvïÞÍ–…BaUU€û÷ï‹OÌÉÉ)((¨ªªbeâãã%›òÓ§OBzõêÈ ¤¥¥©««—””ØÛÛ=z”Ý-yÖñãÇÙý<`—r¬ZBHiiéáÇ]]]‡ \QQ¡ÚÛ%‰¬è]@EñÐâ‚c†ªTäÂÄ[Õµ6W‡ãæ4T`àÿnaò6˜.ðd)íKKË„„ñ¦P(Ïi“’’Ò£Gm2>¶ššÊnêééPSS“*×Çþýû·mÛfkk;wîÜØØX¶ç„ÏçKžXPPàçççååeii9~yÛ666ž>}:sæL†a†±²²ª®®NMMÍÈÈèÙ³6`Œ¸ i3gggIã¥Ô†……ÙÚÚ>|ø0((èÚµk¾¾¾ššÒ‘q•|»Óš‰â„Ú(@Ï@‡9; ñªËÛÒ²VâÍø £Âá8¿ÃOR¢t@>øàƒýû÷³ï¡¸\î½{÷¤dø|~rr2[f –––Í«n̘1ÏŸ??}ú´……ŰaÃØÖ“í”ãå啜œ¼}ûögÏž………Ib›KKKËsçαoÁ555B¡°gÏž|>_Ü4'&&Jž•””ÄžÀ¬Y³6nÜxëÖ­'OžH «nÞ¼Y ÄÅÅ-^¼Xl¼lß»wï‹/^¾|9--­oß¾óæÍ»ÿ¾2oW“i°Û¨Ãó«‰ÙD!§ ɯ:Eøi“ÇÛÚÔ®¦‘uü󽪠t-9@yñâÅŒ3 uuu}||Ø—VÉNíŠŠŠ•+WZYYñx¼éÓ§Köž‹;¯å–øûûK®\¹Ò§O‡Ó£G   "3›““sþüy;;;mmmK—.=šŒ«­¨¨XµjŸÏ×ÓÓ=z4;‚*‰–/_ÎÎúùçŸ!1°uëVGGGƒÉ“'gggB¼¼¼8N^^ž”åbJJJ:äíí­ÌۥȌtÞ¤ð•ŨÈÇ¿tƒç)˜Dýž¸7bj*æM¼ó§ê{Ò«ËðÔ {QcwŒ Ó™çVSÚS§NpúôiU¢b†vø•@ ÃHeSu×êT—ãÏ‘¸»ýð«=B¸ 5ȹø`?[Z>ý2^üRgÏ£Íx™÷c*nýË3ñp=ÎÙàÞ2{`ì}¼Ñ~Ze®eg^¡¡¡áââØr…­»ÄŸ‘Gdd¤ÜŠ”¼ÖŸBQ@{iPZ uŠ“ùêå½Zñl·?„ÑôY Þ[µÙ`ÒÎãɰúƒB× ywðx+íSq6óØoñð+hóà² Ž  ÝäÕ†mŠòײ_»vÍÕÕµ¸¸øÂ… óæÍëÖ­Û„ í(§¸/ØÐÐ5€žžž¿¿¿¾¾¾JM£´¶›¤:Æî(M©–9@P–‰Ô³H= F=æÂí2¯@F.ô„ë6$þ³ápü·²m–‚7na÷aûŒÑ¦üµìzzz\.—Ëå.Z´(++ë믿Vàš½F¿ÙHб¦²å>úHU&Q(¡Óu0Ôpï ©†ýÇ(ÏFqÔT¡º÷W ¢.Ë›™*²>JžÉóF 1sÚIë¯äµì²Kÿ¥˜6mZtt´P(”»Ü_r~}ñ„††ÚÙÙq¹Ü)S¦dgg×')u€"?@lTØŪØuLŠ•S(-§3:ÞÔT6 c7&žÈ¹Yg'©By6þòÁƒU­¶ ä~σä­?S¸póæÍéÓ§{yyIíÿûï¿ûõë§øÜ;vœ:u*$$äöíÛYYYŸ|ò‰øP```ttôñãÇ·mÛæïïsìØ±]»v±s!üýý===% RX[[HKK›>}º““Óýû÷Ÿ={¶|ùòÙ³g³«.°¯ÛrX%‡:þüÍ›7ÓÒÒæÎ[ŸäôéÓ½½½“““wíÚµ`Á‚õë×=z4((H ”——/\¸°1·QÒ$ñÎ}ûö)PéèèøÍ7ßdgg7¦ ¥™48s¨ãQQHN2$õþw#U¥„ro9¥%Gà¤:¹øÉkxZU”¤³V$䜩©ªs¨4Ü[A‚»‘Œ?ZZKkÓÞÖ²K***£`¹?[P ÀÖKa§i?}úT®¤TÔgggÙø L•5I,#7¤ªçÏŸ¯^½šÏçÏš5ëÎ;rïL[Óøi ­‚ø‡¤®®îììÐr…âÛÞ*ÈmB#""äV¤à'­*Ð%BAh@×F‘À¨ë@ÖŸ¨®#@ªQ‡èµ I( äÂÜP–%ÏñôçÚýEq¸é‹sÖH»€Aûa*ý~­ZÚÿZö””VVV –û³(pttd ...âââäJJExñâ…lü€Æ[.‰ÜP’666[¶lILL5jÔ‚ ÜÜÜšWQÇâÚµkB¡ðéÓ§K–,™7oÞ¹sçTmQ„¯À+S…BáÀ;îhgtŒ‡€Q—Èd(¬'@e! Ê`ÔÀ¨Áu†ÿ5鶯±”¥ãÊ0ˆrAª€~…œ\ÿëƒÂÇð<Ÿ`?»tô‹iÿkÙƒƒƒû÷ïohh¨`¹?‹ñBÿøøx†afΜ)WR*ê!D6~@ó®Bn(Y±øøøÛ·o9²yu,Ø!tkkëE‹­\¹ò믿V Üv»êƒû HLLÐÐÐøè£ØùoÊ7©…tRÀ(XMC_­jÉ©‘Є&#® ×Êæ—gâ¡(KýAJSñ‡'^>ÅŸ1.6SU¿ÊL*_Ë.»ôÀË—/ RRR8ðí·ß²Õ)XîϺ.«V­Š‰‰yôèѧŸ~:uêT‡#WR*êÀüùóeã4)o*7‘Hàéé9oÞvìØú$¥r øùùÉf ¤¾ ™Áž={ö(Puùòe[[ÛÍ›7geeµþ-–]%@E! ”þµG(ùaîÒQÿ!Õå-ªW”O.ö–×ú¿ò‰GZxeJ«Q–A~Mî~J®'aäW¬KA.õg+˜Žö7ÿö5YЂÐ4@7k”¼x½‡aàýëë^—êrä½ê¶f4 ¦ŽÁG`÷Q‹*­,ÆŸ£P”RÿÐñÃõ°ŸÕÞúý)‡ʳQ–Žòl”g¡,åÙPÓÀ[»åW‹ðü8¦Ð±€Ñ@pL¡c Ž)t­•n·$Gû·mÛvëÖ­ÄÄD¹#% dGû<(+¹ÿþ¥K—îÞ½{øðáóçÏgGûgΜ)HMMmÞx;Ú¯@;ÚÿÕW_ýòË/ ,ÐÔÔ¼{÷n3*jÔ0ŒÒÔ×½üóн÷ë£y‚ÚfZM xŸ‡aÛ º7ÆC];ê+‚²t<; ‡¹-ª‹Òe©©Dy6* êü˜Å”¦áÿõ¦†t,À1ƒ¾£|mÝlá×&v¶âÑ~WWWww÷íÛ·÷ïߟȋÿìååUŸ@bb"›+F<Ú?jÔ(YIv´?::úìٳÆ SWW?wîÜøñãB ›ÙÒÒrçÎ ªöO›6­y5NìáÅi€´xøC£¹·€Q‡ÉP¼ÜÒ`;5ŸˆìëuF•50š UµË€5pLÑÍ¥/êSC¡Ô¡ºÑkPž² ”g¡<¢ÐÔÇÔ"9ò:fð: Ž)8æà˜CCWÉö6 v”ÛÞÞ^\À«Ñþâââ‹/~ûí·l RÉÁ|v0/gÖ™šr#¡m ={˜x‚cŽtÌ¡m"_9£~;Š‘§˜Y³fùûûÛÛÛ‹ ØÙPjjjNNNÇŽ{ÿý÷Bµ:ཎÙë‰4Z<ùúMä„·£PTEgvŠ4•ŵ-;¯?4ôä\ñBÁ#`Ô mZ;E’cVoT¨¡¡mh-…ÒÆP@éÔ<ÞŠ¼;¯'Ò°ýïF…Ãäm9òîÇ ¦Ž)´MÛg¬ ¥¡€Ò¡(Ë@ÉóÚΙò ”ç ,åYxkŒäÅˬ*†ºŒÜ^uÎ44‘†×áS(‡:J{¢<«v~$·t­äD-FÊYÐЃ®UíDÃþµñ½eé×Ùb¨Q(­H3@iié‰'؈؆††ü׿þÅ.>|ø?þèììܪvÖaøðáçÎëÞ½{GQ+»³­oQ‡!é(Ò.¼ž/îjw?&½ô[»Ð'tÌëmñ)J£iŽ „¬\¹’a˜ 6XXXäåå]¸pañâŲÉC(.\` ï¿ÿþîÝ»Ùà$ºº­±J3ÿ>* `6¢Tµ¢\”<«]¶*9‘Æy)¬'É‘¯.…:Fƒa= :б„Žt¬ YÏ4­nvmi=EšÔÔTÉèÊ”NFsÀo¿ý–žžÈFÒàr¹Ë–-ûä“O$s‚w>šý}À&½bÑÑÑ‘Ül.¿#v+²®Ãe™ò©FyvmË®ßúòbcÅ~‹¸ ¡[€cŠî½¡]Ïš»žŸ¡çgmh3¥eDFF*9: E™4ÇüñÇ&L É$Õ®UWW?~<,,L$ 4hÉ’%†¾nݺ”””Lœ8ÑÁÁáÀeeeï½÷Þ¢E‹X5kÖŒ5J\øçŸöìÙ“””ÄårgÍšõÞ{ï¸~ýúñãÇ«ªªæÌ™3yòäÄÄÄ|øÆ÷ïß_\\Ä…76lÓ¦M?þꫯ<<<DEE8qâÞ½{›7oþàƒ6nÜØ¿ÿÿû¿ÿÓÖÖŽˆˆØ²eËÛo¿­¡¡àðáÃ~~~?¾téÒºuë¸\îÞ½{wíÚõõ×_ûûû‡‡‡oܸÑÐÐpÇŽ’ö9rdýúõººº;vìøî»ï®]»&õÀª• ësöìÙ¤¤¤'N4ã®6€( {ÿ*‹6ä\ €&‡–+ÏBaÜëÎñD_ô^-G^£t¬À(±ÊÉ hÕãät,‹¦™D¡PTDs@ii©dOˆxóÂ… âï€Ë—/Ï™3ç7Þ°dÉ’?þ¸´´”íøöõõ500:t(€éÓ§‹ËEEE£Fb5ˆ /_¾äñx<oèСçÏŸg•Ìš5K__ßÛÛ{Æ ¥¥¥ÐÑÑas‹¿ù曕••%%%¬‘S§NíÛ·ïÎ;?þøã^½zøüóÏ}}}E"Ñ•+WæÎÛ·o_ÖÈyóæ‰/jÆŒ¬ñlïVii©ÔM`Õ`õœ;wNOOoüøñkÖ¬iÆ-UDqâvàéÏ Õ¨‘‰5]–ñº\YT <:–òç¹§žÃÝ…`ÔÁ1…¶IíDnðú˯Ýò=X¾×JWB¡PÚÍqFFF)))½{×F$¿pá‚H$’ú&ÈÎÎ'g 999¶¶¶tttð*¥§d¹>–/_¾gÏžÓ§O÷ïßÿý÷ßgë511‘<ñåË—'Ož|ôèQZZþ[Œ™™€ÌÌÌÍ›7oÞ¼Y¼?'''//O,,u–ØxkkkVXÊ*V­@ زeˈ#Ö­[gcc£à*šCÞÄl@Æo`4ê]‰Z–ß=jçÂW—¿ÚË Ç<ùÀn&øãé*' …‚æ9OOÏ_ýõÝwße߸õôô>|(%cbb’žžÎöáddd02jfèM77·ààत¤ðððeË–AÆg,Y²¤W¯^ .trr"„¼ûî»âC¬¤‘‘Ñ¢E‹<==BJJJôôôLLLRSSÙù´´4I…éééìþÔÔT¹Æ‹@»¸¸Ü½{×ÜÜÜÐÐP__¿y×(E?‹Â þa!PÓ!ŠRŒU—ƒ7ºÔ·²q 8¦`êy²z´wžB¡°4ÇÌž={þüù«W¯fçþÇÆÆHÉŒ=Úßß߯ÆFOOï¿ÿýï!C9ûå?þèÓ§………¸ðÉ'Ÿ¼ýöÛ~ø¡³³3!DKKN>Åêêê7ÞxƒÏç?þœ5¦¸¸X²ŸjôèÑG566ÖÓÓ Š?|øð»ï¾{âÄ kkk.—»ÿ~I…þþþ¶¶¶:::’ÆKé`gg·uëÖŒŒŒ³gÏþë_ÿ4hÐĉœœw#åcZvmñD'£`Ô)Æôú²äð£P(‹æô°ã¨úúúÿ÷ÿ7sæÌË—/ˆ/þðǺnݺE‹®\¹²‘Ê·lÙòèÑ#ÉÂÿýßÿÝ»wïÃ?²o ë/dþŽ¢@Ê3Um…BéP ‡vý ¤ÅBmêWQ²oÐÜR ¥yPБÑ6‚õDUA¡P:*t28¥¥}ñÅÖÖÖÚÚÚÖÖÖóæÍÏ©e&**ªëb$ÐÑÑ2dˆbý4 ªªŠa˜ÜÜÜ–›'¥¤µ4S(mu”QSS3nܸ;wî„„„¤¦¦^¼x‘ÃáxxxˆD¢6ª‘ B. \]]'MšTU¥x¦lè««ûûû·Ö2åh¦PZN§rÇ/,,lÌNJkqüøñ¤¤¤ß~ûmðàÁ&&&ýúõÛ·o_tt4ˆ©-ÐÓÓãr¹\.×ÚÚú›o¾IIIyúôióT‰ß͆ù裴µë™hÛÚN3…Òr:•Ëš5kZ'ø>E^HŒÀÀÀÅ‹wëÖMr'—Ë•Œ ^UUåççgmmmllqA ¶ BȶmÛìííy<ÞÔ©SÅU°l€{ñZn±ÈÍÍU`ê… ø|>ÇÛ»w/»S  2DWW×ÎÎîÈ‘#ìÎsss##£ÿþ÷¿âsÅU„††ÚÛÛs¹\___I# ZþC¡4•ÎïFEÓÔ´œ›7oNŸ>ÝËËKjÿßÿݯ_?ÅçîØ±ãÔ©S!!!·oßÎÊÊúä“O㣣£?¾mÛ6ÿ˜˜˜cÇŽíÚµ+99€¿¿?½C\¤¸¸xË–-ƒ¶··ß·oßÑ£Gƒ‚‚AyyùÂ… %%§OŸîäätÿþýgÏž-_¾|öìÙì ˜œœ6“]ƒ¦îÛ·ïþýûGŽY¾|9ÛÁ5}útooïäää]»v-X° ++ Àï¿ÿwàÀ/¾øB¶líÚµ§NŠˆˆHOO— >éèèøÍ7ßdgg+¾™J+Ò!gÕ—l@xxx@@ÀË—/ °|ùr.—+ÆùåË—:::;wM+RVV¸oß>.—ûé§ŸúûûK KJÇh …â¼?ýôÓúõë à‡~èÓ§OQQûÈ>ÿüs##£‰'øòË/Ååüü|‡>úˆÕ .4h¸¬®®þçŸ8pàÀ† ÜÝÝtèP‘HTTT$Ùî‹Q`êÂ… MMM'L˜PUUU\\¬­­]PP`nnnnn>iÒ¤¼¼<¶£ݺu†††S¦L™6m+&©ÕªU¬ò}ûö¹ººŠ•3æÆ?þøã€†þŸÿüÇÍM^Ž{ ¥Ué_âdûöíËÏÏß¾}»øÐ… ¶lÙ²gÏžÜÜÜmÛ¶Éž;sæÌ€€€‚‚%šÜ! ³µµ}øðaPPеk×|}}e¿¥,--Ä›B¡P*¬€”””=z°e¶À†ØÃ«}:sæLvv••Uuuµ¸ ~~~^^^–––óçÏW \©VVVRæí߿۶m¶¶¶sçÎe V¶¾«+g×™Kicc³eË–ÄÄÄQ£F-X°€:Šè@œl€Ïç/Y²äæÍ›âxýŸ~ú©ƒƒƒ½½ý²eËîܹ#ºÇÍÍí‡~(//Ÿ?þÖ­[ÿù祛߈r~ 1pmÎYT·E%|>ßÍÍ-,,ìÒ¥KóÓÑ– IDATB¡P®Ì|°ÿþêêZ¸\î½{÷dõ°]:Ø‚8Úv3›šš~þùçyyyOž<±´´Seƒ–3æùóç§OŸ¶°°6lëùÇ6OJJb Ož<¼ûûöí¢¢¢‘#G6t'(”–Ò!€Üdì&ûš€ÎŸŸŸ/{º©©é'Ÿ|8`À€;w~úé§Ê0º…T½DöuÄí@ø„ZàŒ)þz6!ã2u0mÒ£Õ»wï‹/^¾|9--­oß¾óæÍ»ÿ¾”̺uë222|||¢¢¢222BCC7lØ %3gΜM›6 ‚„„„Ï>ûÌÇǧ‘Y3Ø>₇a˜üüüÙ³gûùùEEE%&&Ο?_œ¤ˆ¥²²ÒÍÍÍÉÉ)..ŽÍý)þaH9¶&™êêêºjÕ*›B¤’¤ÊeóæÍ ..nñâÅ’ÊE"Q@@€§§ç¼yóÜÝÝccc·lÙÒ 6 ¥…tHÀ&`ËRÉÄý))) ðycä’’’òøñã’’’´±½ÍA[½ ™Wó5þzgŒñ‹>® Cô¤†¾þþøë·(útƒ888ìܹ3!!ÁÝÝ}ÅŠRGMMMoß¾ÍãñÞ}÷]GGÇcÇŽÉ&’]¹rå¤I“&Nœ8dÈSSÓcÇŽ5²êY³fݺuK² ‹±±ñ¦M›.\èãã3qâÄþýû§¤¤œ9sFRæàÁƒ{÷îµ´´\´hÑܹsGÍ&yöòòzóÍ7%ßšdê‘#G®\¹boo¿råJÿÆd¼˜7oÞŒ3ÜÝÝMMMúé'ñþK—.]¾|yçÎ`Μ9tÚ(E9tÈh þþþ¿ÿþûÚµkõôôvíÚÅápØ×¥áÇ¿ñÆ_|ñÃ0;vì055ýꫯ¤+++ÿúë¯_ýµªªjâĉ#FŒhos„´«s øt_¨¡VF`@êŸ ¨¦ ‡ávP‰Rš Ã0`àÀª6„B©¥CÎúðÃËÊÊÖ­['ž$>4yòä•+WŠD¢Áƒ/]ºTöÜÈÈÈ;wî,Z´ˆÍÜ©›|{õÜ göOAUI½É ka -g6 …Òr"""RRRTm¥5ñððLÛ!¿š„Ô@‡ 6@p’O z-* êÿ`5mt³†®5ºÙ@×Ýl`à,?'0…Òh¦N¢j+(­Ipp°¯¯¯x³]ܽ{Wn*±>úHr233´·NžÆ¢¦ Çù°ûI‡³ •…òÜG 4ôPú%/Pš‚Ì+(y†îo`Ä9:E9Ƚ]+èXÐÔð”™2eŠì ¥ƒ";E­];77·–|Žddd|üñÇcÇŽíØ¡ 4tá¼=>AÒÄlDU!jêNú´-^cµåÜÆ µeF:fб‚Ž9ÌG¢çg­i6…Bi÷´kÐB,,,~ûí7U[ÑJhtƒóRô˜‡„}x¼Õ%µn@£[Züñð-Fi*Ê2Q–в,”¥¢,U¥òåsn!ù8tùèf Ž)t,Á1ÇLgþåP(]ú߸C¡¡‡^+Ñãü³ÿ|ê2t³nޏ4J¸ê%^&#ûJ_ ºüÕ^.ËðÖ.9ò•E¨© ãÒJ‡€:€ˆ¶úmËrÄnGYzÛÖe1£kË•…(Ë@y6Ê2 g'_>ñ þþjÚÐ1¯í\Ò±‚ŽÌ†ÃؽmM¥P(M„:€‹¶ úR£¼5»C³{Ÿv3a芲 ”¥£,¥iÞGZÔ4å;€´‹Èþ :–à˜‚cŽ98&à˜Š*P(”V¡S;R†éäMI{›Æ£c ¦Äù)MEÖ_(ÏDyöëŒÞÚ ç%òåk* cuV°–BéÚ´³æ£õЮÉv(>lýòFfꤑèN³ÕjRêt€4,Ji N 1& R1½“³ñÞ#¼sCŽÃb”|ùG›q¾‚uqš‹‹½punÍ@ÔäF*×nJ”™Z–6ʺÜvÉœU{»$‘ó H«ƒ²hv„;I8ñã¾?꺱Wâ›_AšÞŒ3 Á§?¥ânî?ÃçˆMCUk‡ãœ2eJ+klÿh›@ÛÝ{+’ys#z|Œ²,”¥£<e(Ï‚ð>,ÇÊ—ørÂÁ1ƒ¶ 8ÆÐ6ÇÚÆèÞ Ú ‡î¡46/4Ã0!!!ééé‡òððHHH AdiW·«ŽðððV²m„GÍ.­š;ΚC\ÔFÍÛ#b^¯6¯9±ÉùÒ¿}ߨ/¬F“׈©£²¢zç'îN ¤êŰÌSë)„]c_›j¦¥ÒÚºéÓ{ºSpL› ¯ïQD¹(|„ìŸoddôá‡æææŠYYYééé­ZµêäÉ“úúú+V¬ øûûKîÞ½ëî£ckk{øðaöÐÌÌÌx<Þ÷ßOùûï¿ßyçCCC‡Ó»wïàà`±¶¿þúËÚÚúÈ‘#[·nµ³³cÓ·±ö”——/]ºÔÔÔÔØØ˜M霓“ÞuæÌ;;»îÝ»O:U²_H,Àª=zô¨Ôåggg+óv)€øVÔîiÌirR£NÓœùç냅ÿÔîÒ"gLIž 95þC~1 'Õ¥[ ñßIurRœ6""ak]EyÔT’²,RK²ÃIÊ9Rž#_ì÷·ë<ô -jAþ×§ÞUi:)Ï&5•mgx+ÒH`hhxþüùú޲-ÚÖ­[{ôè?bĈ &ˆúøøäææ²A‡ÆŽ+.'%%Büýý“““% +W®ÌÈÈ8s挚šîeâĉùùùÁÁÁåååÎÎÎ .|úôiffæ‘#G´µµE"[‡‡Gxxøwß}çè葘˜èããÃ^¦ŸŸŸMxxx||¼···dûîââëéé9~üxò*¡´ø*Xµ¥¥¥â Ÿ6mš‹‹‹2o—bºŒ(z"ÝŸwzýÒWSM‚u_ýÕ$AZäÙÉæÔ’{—œÒ&L½> !IÇZïª(í‘=!¹‘$í$ùg·›Dû‘’ù¿ ªýmü¢OÎÙKýÈ•aäÆDRôD¹F7ŠF: [·n‰7ÅoÇB¡¼jÑœœœNœ8Á }zPP‹‹ü3J¾]Šé¤ C&&©FÌ:ØN‡®˜ A~j*5ðhŠþû±¦M0·™Šâ<\/oAV5ÜvòU”¦Ò½wÓœ¤pýeéCˆÒ<„³œ\ðÛ@ˆrë¸ öÏéSh¶ÊÈÂæ…ž5k–ºº:.—.%Ã&[öôôD‹óB³©˜£££Ïž=;lØ06W¨TœK///ww÷íÛ·÷ïߟÔÍÖÉ6—–––;wîdÃB ¹\.ŸÏOHHxûí·$&&J*LJJb÷×—Ì™U+N£mgggfffh(çž+ùv)¦“:öí^Šš*Ü_·ƒ€7@:´2©Aʼ| ï M›gÒ{-Jž#éX…jšÐâ"ó*º÷¢K–(ÍÇr\Óä]–¡TÂa”¼€0Bô¨'|úz ­îÐ0€Vwhv‡¦´ á´šú¬sݺu ðññÙ´i“••UDD„lBc6Ù²‹‹K÷îÝ›šÚÓÓÓÞÞ^\puu0aÂÊ•+¤b–ÌÍ“ŸŸ/9c‡M"meeÅår¿ýöÛ¨¨¨¿ÿþ{Ö¬Y7ntvv655ýüóÏ%nÞ¼¹W¯^zzz’Éœ…B¡Ô, 6vrrò¾}ûúöí;zôèÅ‹¿õÖ[J»]M¦Án£ŽGM% Ò¨·S>ó*!„%È8¥MÎZ“‚GM«±º‚\VgRPp7½–œæ’³|’x”ÔTµÅ…R(-%é8yü-ù{¹³€„û’«£Èåäפ¢€4z €òâÅ‹3fêêêúøø°/­’Ú+W®´²²âñxÓ§O—ì=w^Ë-CfЕ+WúôéÃápzôèDdÆcsrrΟ?ogg§­­íááqéҥѣG³ƒ±bµ«V­âóùzzz£GfGPE"ÑòåËÍÌÌLLL~þùgHŒlݺÕÑÑÑÀÀ`òäÉìÄ///‡“——'e¹˜’’’C‡y{{+óv)2cu2‚u âR?ù‡uè9à½Ç`ÔqZ_~ dFêºð>³¦,ˆ«,BØ ?©£Ž~[ÐëKT½DÂ><þZ<¼¹ö³h¥1uêT4!L§IæÌ0ŒTF°Î "OPï¡ÚÑàïÁ¨Á°=B P…‚˜¦Uªiï ÐÐèXÖÆ±a£7‹©7"?ÆoÅ5M-…B¡´Ñ( Cªñp=JÓ`ìu­:‡ 0jè¹RäG"SŒ~OxŸ‡šþPgRG7[ 9±CËíW¥P(íBH'xý—Kgξހ@u9þþüP-?É€:æðú¼·ž¬So¼s &žrqß„×Ùæk¦P(”Ö¦Ó}Ôˆð2¹n?hóÐýÚ žjÚÐЇÓ”¦¢4¥¥Èmý) ¥ýÑ龄@d"s2ê@ ôa÷lgBŸ]aA ¡‡êØÏ€ë·Ð6A…‚E0Íî2zÛ’Œßн7tiô7 …¢T:Ý€ü`þ̆Ãa.zü Œ:œ>…©7L†¢ÏúW­?N ñnÿm¸5ˆöS®ÅVã¼¢þƒRéå…íeF6Wr¨tHi; ttt† ¢øÑ7ò·QUUÕ*Qþe•´–f%Ó逾¼~ň+xçO¸ƒÝLjäFÂÈ]Îàpÿí0üzSÛý¿Ã“ýȹ©D‹Œ¹düŽóˆ˜âĆOj°‘Íïܹ’ššzñâE‡ãáá!‰TmZëÐé/°=síÚ5¡P( \]]'MšÄ†ýi êêêþþþúú­?£í4·- ®èØ”¼ §8äE dˆ(¿áS®Ž"œIuyÛW—ê ’|‚œw"Ašäö¬öLŠ£Gš››¿|Y'Þ5Ÿ‹4zqJãiu…õÕ"^w£ø;=_ÖêH=ë¼¼< ”—=*~¦­e^ë*TYÖ龤ÐåCMÕåÐâDÑ1ƒö¢ä9âv¶½quQÓ„ýlŒ{ˆ·v"ó*RÎ(Û€†ÈÉɑڸxñb6¯….—Ë9a©ªªòóó³¶¶666ž1cû?Ã0§Nâóùúúú«W¯ ²´´400/Ág& @² ˃FŽÉãñtttúôéóË/¿xï½÷víÚÅ DFF—••Õgƒø›-³!eLLLØýŠ/a˜ë×¯ÛØØ:t¨‘úÙBhh¨½½=—Ëõõõ `cX*~ ’Ÿ5{Ã544!Û¶m³··çñxS§N•¼{¨ç÷ õLÙ¡àgyáÂ>ŸÏãñöîÝËîC† ÑÕÕµ³³;rä»3$$ÄÜÜÜÈȈÍ€úˆU䊔Èÿz“ ’tœœ³%1uÊS"Œic³RUFªJS*‰l.2oyrþ?~|È!¬ÀÒ¥K,X À©R;¼@6 üúõ뛤_6¸<ËåË—mmm7oÞœ•Õ¬InL"!<µ„„û’kcUmMG¢½E6—=$7ì{AA‡ÃIMM­®®¶´´¼~ýº;€/ßTý²ÁåÅU<þ|õêÕ|>Ö¬YwîÜ©çÉ( ÕvI¢®®~ýúuROòê·¡ €ÔƒPðÈΞ=K$R Æe áË:€ÎÞ@ß `æ#¡Ó&!U•GÉs$ý„eŒ@†……ÙÚÚ>|ø0((èÚµk¾¾¾ššÒù“ÙÈæâM¡P(;CFndsv³å‘Í üüü¼¼¼,--çÏŸÏîìÞ½ûÈ‘#Ïœ9sãÆ ¡C‡*°A1 ^ ¾©ú—·±±Ù²eKbbâ¨Q£,XàææÖ;;%âAବ¬ 6Lš4éåË—lvv••UuuµäÝ“û{‹‚GƆæ—ü)î߿۶m¶¶¶sçÎeû£¤2HÑQqpv3Ñó3»Ãñß|DÕÖ´ŒÜáœoE…°M«G6¿té’P(¿.6²9û€ËåÞ»wOVìmÙÜËË+99yûöíÏž= ï÷õõ ž>}:Ã0 l`_‹êk¯¼@qø&éOJJb õ—¿}ûvQQÑÈ‘#}3:zzz\.—Ëå²Á™óòòž}ÚÂÂbذaìK€¬˜$æ+ó„Ò ”ekÉi Ö#QKHQ|›Ö–””´bÅ ++«ýë_÷îÝ“:š••ÅçóÇŒ#ÒÓÓÏœ93`ÀÔíÚ´i“““ÓÝ»wÙÎVö\4ØVn¿°ø­ý·°°Ø±cG^^ރ؇ñññ„ÂÂB.—ûàÁBH}6p¹ÜÇ.\¸ßïâÙ&¹Àfèwtt¼{÷nllìСCÅ„òòr?~œíYV!íd €…a˜+W®lذ¡OŸ>àÉ“'Ÿ|ò‰««+{”•¯ï÷ ùLÙÑÈŸ%ûÈììì–-[–‘‘¢¡¡ÁŽô*豬èŒùZªRTksI¶/2ÿDê9 ø/˜.Л×&L˜àææ¶fÍU"M .Oó4vûˆeótºX@mAä\”¦`T8˜öv»˜¿ówTmFû¢´´4&&æ÷ßOЦP(r¡¯Àu áÑfUÛÑDòî ë¯Úˆ§]‰Ë—/9rýúõ¶¶¶ª¶E¤ó—§°t GÜÞ^iÛ%zèÿ-¢–ÂrlØA휧HØ ={ØN‡ítpßTµAJbòäÉ“'OVµJ ë}dß@â¡&Ÿåô),F!b.ªËÚÀ¦¶aàŒ½ëIx€Kýð¿Þx´ Å ŸH¡Pº]Ã?ÁÕáx„¸È¹…‡_5]ƒÁGPžýÿìÝy\çÚ7ðß@°‡¢!TTl-²T\Šu)u©ŠV«µõíy<}»ØsÔì©uí^ÛêóÔ¥‡º”" V=Z[[¤HAÅ¥(È¢²P5óþ16! [’ p}?ýc2sÏÌ•©Ì•™{溑±VÿáŽãhŒþ3obr"\'"ûK††nV±–b ½#XØ¡ô JEæûpD} joux#VŒùYŸ£X× &¦ˆ1ƒË“ó%fßÁ”X:ó!Ä$ôŽ ì ;XØ£¡ Bg0‚6Ž×Æs!,AS¾ã3Æb-}S te@HoÓk:m‚m‚YT]È©ð˜ß™íDê90‘ó¸üoôÙHguû¢IDORRR¸·HÔk€Ý Üχ“?JÏÀ9å©|db†¾§±(:†+ë‘¶à ›Y8†ñáM`` ß!}š;w®»û#c÷š7/E ð¤3QpÃV#ío˜W ³>|‡ezZêQü# ¡ð(åý}Çñ!Ä zÕ@.\žÄï[`7-õ_‚Ó|‡ez̅΀tM(‡s÷yïÒA½£€ý ´ÔÃÆŒêŠàÿlÜÛ^«73³@ÿ§5_$)pó[4V=&Bˆ>õš[@Íu¨É„hJ~†ÓXX:émË÷saë­·­u iøiØf¸Ã- nÏÂÞ‡ï˜!Ök€AÒóx:Ž~|‡b\M÷Pò#ŠŽãÎ Ôß…Ý@¸…Ác!ÝU#¤¡Ð5¬g¦¡æ:¦]D1ßÑðU "EÇQtžÏcؾ"„´%€.«¿‹“£!~ã¿t×{±Í¦WI›Ò{: GØÿÁÿâÆW|‡bª~ ‡#c JNCÑÄw4„‡è @O.¿ƒÌ­x*.Á|‡bzn~‹;'QòêK!ì‡þ“á: ®“`#ã;2Bz5JzÂ*ðë,TžÇ´óöã;ÓÄB~ %§Qú îþ Æs+èÖ!<ê­ €U ®ñÓø½ñÒTƒÌ­µ~6؃)špïÕ™ „_æï¾û.ß1Ñ©0 ÄáÌ4T]Aõïºêí¦¹%ú=3 ýl­gcÌ!tѼ¨øG$/F] €Ð•Ž'!†ÓË.ÀÙTg€s ò¾†s Ê“øŽ‰<ÊÒ "_ÜúWÖÃÌâ1è;}CàŒ>"¾ƒ#¤GéeOÙû æôŸŒÚÛ°Œ²ßzá°é&Mü8üw"ì:æÕ` ô AÉÏH˜¼¯ùŽŒž¦—]8ø w8ùÊ&4”£&‹*˜" ;ô E¿P¨+‚¹–Ò­MÕ°p0f\„ô½,ØEí-4×A` ׉¨¹-Ê’(˜:k7­‹NOÄý8…K0\ž„K0Ì­Œ!ÝXï»Ä*p/úOF鈟@™ÁºªGÊKôê“a=ö|Þ\ÿ¿LFœ3~žˆËëÐ\Ëwd„˜º^v`7Œ5×áè‡~“Ñ´¶2Ô\7Ôî3Ø;¤)àÞ)À¶ ê2Ê΢ì7ƈõ|GFˆ©ëe À¬l½P{ ì¡ßdÈæBf¨ÝÙEÐ~$Ì„ýP [m¨½cÇÑpÁ¯jmÓP¬mp€s@/-ÞGˆŠÞ÷"XK=Ì…FÝãµqq5#áµÄ¨û%­U^@âs¨½0°ò08Âa8s¾ƒ#ÄØz_àÅÅàú§ é,¾C!@})*Ρ<çPqMÕðX€à(¾Ã"ÄØ(‹äq;Oý ç@¾ƒ!ªXÔdUh®Kq/Í÷ààK/$“©—õð†ÿW¨/EÓ=¾#!j]çü®} ³>€ø18>ñhˆFö’'M?ùä“ääd¾£ úôæ›oþù”®Ñé~.*ÒQÉýwM5`þ²y|GfpóæÍKII à;¢±±±ÑÑÑáááÊ9t@ˆN¶Þ°õ†Ç|_"©L‡³–sbÍ5X»C`kÌ * &&†ï(ˆ~0Œú…”õw!¿ˆþSøŽƒ˜6Æ ö>ºn%ÌÄý\Ø€ƒ/†Aä ûap 3-u,áUïL,êË ìûðSE*.þ婘Weì'DIóÔϨÎDÕeÈ/ãÎqí#(Áð\1,ùŽu½2\ÿ×>Âì;?2æ¸û+TœCßã"Ýžµ;¬Ýÿ¼”T4¡æ:j®i9û³¸ñpÑHªtMxÑ+€ýP<(F£}@ü8¬$h®ÅÝ_²¶¡ê üw‚éeE™z 3 ˆF@4BóÒÅÈXƒ¦°‘ÁÁ¢‘p ÑH8 7f˜¤×ê Àj®ÿñH>É4~²DcGb7W ÐYI0¯rTÿŽêLTÿŽÊtäý½2† IDATVL»Àwp¤Wè•'¬©'™ŽÆJ”%m6j$’é˜ônE#éycˆ>Žpy—ãñm˜ôfßÁ¤Ÿ4·¬8‡_žFúß‘ý%J~Bí-Ó˨¦¦æ­·Þrww·´´tww_¶lYQQ·ˆa˜ôôtƒîa˜òòòî²Yð}¸TõÊÀ˜Ánj²þœ#™sk4×¢ò¢±ƒé;O¢ø$’ž§ÂÑŒ,4/ØÀ~0j®ã÷-øåi|ï‰hœôCæÆ QB¡˜>}zjjjlllaaáñãÇ…BaPPPCC¿™&“:\½ò¸±!U®Ì…ÎÄ­ƒ¸û+œž0v0.ObÂIœ™†¤çEUˆfÃ1æË‡ÓMÕ¨¹ŽêLÔ\‡ÐUsûû¹¸ŸÛ°qcÀ¿ôÈÈÈÜÜÜœœ...Û·oß´i“@ГO/ Ô••9;wøá.“:\½ò €ÃpT]}dŽûs [/~âq FÈŸDæ~ Ý‹…œÆbÀKð{^ÔÜ&~yG ÚÇ#~ÒÿŽëŸªÿËﲬ\¹’;)‰D"só? ¬677GDD¸»»;;;/\¸°¢¢‚›Ï0Ìwß}'•JíììÖ®]%‘HìííW­Z¥l°ÿ~Õ‰´´´ÀÀ@kkkOOÏÝ»wsÍbccûõëçää´mÛ6¡¡¡b±ØÊÊÊ××÷àÁƒÊ­%$$Èd²={ölݺÕËËK,Ï›7‹§¡¡áõ×_wuuuqqùüóÏ•Á3 sèÐ!///‘H^QQÁ½QåââÂÝ#Rnöë¯ÕG®.++3æáê0¶w*8Ìž|ŒU4ÿ9§¥m¨à/ –eYön"ÿ1žäA [–Äæíe/½Ã&-bO°±.lövÍ*Ø–zÕsçÎ;wn›;qtt}Ú××W(z{{GEE±­úcËÊÊŽ=êééiiitâĉ)S¦p±ÊÍ666®Y³F*•ÚÚÚN™2…ëAmhhxã7¸§€öîÝ •>€-[¶ 8ÐÞÞ~Μ9wïÞeY6$$D(VTT¨E®T[[»sçÎñãÇópé†V}4 Œic[pé_Èü#ÞÁˆwùކô.óæÍ@ã0 “––6f̾é*†aÔ„¡[@­\úNOä;ˆ?0æðÛ ÿ¯ðûf¤¼ E#ßé1߆gTXYYêÞ~;hnnÖKµ€ÖÑ×– Ñ­w'€òÜÏUŸÙP†»gyO˜wÿŠ'âöAü:ûañÈnÎøoÃÇÇÇËår¹\žíçç÷ÜsÏqv…¹¹ù¾}ûìììô¡q¶L:eÙðó_£ÞÒ^AÎnõ™WÀõÏŒŽ.ÒY=ƒÊtœ À½ì¶Û› ¿d¹·áøá‡±cǺ¸¸Œ5jûöí—.]2ÜÛð¶¶¶"‘H$¹»»oÚ´©  €ëQìå7bæ…^°´´Ôk¤0è– QÕ»€ÃpTÿ®>Óq4Ì­PVÁGLÚ‰Ç`êXŠQš ¯Mª½§®P(¶nÝêíímcc””o¥;vL*•ŠÅâ/¿|X£Fí5}µ7敌\<@ ·@À²lëzJË ´®P^^Þ•CÄÍT«d€GÓŒZe„ÜëNšþÇÒ>mv÷dW7±ßÐ0ÿôSì°¥gŒP;(Zô²ï©öÙgîîî EEENNNMMM:ÞJŸ2eJiii\\÷þ=«å5}å3 JF.•g$jjjþùÏŽ;–eÙ/¾ø¢u=e{åÔž9éú!R«d ºhªCÀ9yò¤‡‡ÇÆKKK;ô¿Úÿé@¥ Qp˜ýÖŒmº¯>ÿú6ö[s6ù%>b2,Ýï©:t÷îÝÜ4÷vŒB¡ÐñVúáÇY•÷ïY-¯é·NF~^íG¹¹yBB«¥€2åÔ@בZ%öÑкò«ÝºukíÚµR©tñâÅ©©©¿~§ñ•tü¯4œêêêU«VI¥Ò>}úH¥Ò—_~¹°°ÐÈ1ZëÐëo± ý½®Á¶àöA4×ñ–¡´ùžúÍ›7¹7Ý0 #‰†ÑñVº››}]ãkú­ÿmxe'piiéúõëŸ{î¹û÷ïk¬ \EG9ö‡ÚÎC¤VÉ@Ž:2™lóæÍ999“'O^±b…¿¿¿îã@42©ýÆÔ»€í˜[ièpŽ>b4?À|„Õ)íè±hó=u‰D¢Ú5ZUUÕÒÒ¢ã­tµ÷ï¡å5ýÖŒÿ6¼²¸oß¾«V­ª¨¨¸qã†ÆzÊUt”h¨íž`ü§LDïNŒ9ì‡hHŒfä`jÜŸã#¬Ž»…ƒ4<Òú¨6ßS饗Þ}÷ݳgÏ–””|ôÑGR©ôÁƒz+]ãkú­“‘‹¨ … ÃTVVj¬ ¤£œ€Ú7êú!ÒMc û÷ï^¶lY@@@ffææÍ›ÛÜš©i³ÓZ:äŸyæ™O>ù„k’’âììüàÁm½ñÊs=7­Ö™¯û©e¹ÿ;w¶sûè.½÷Æ¿eZ®}Êæ}Ãw]V“Åž|œ=hÇæímçßSoll\·nL&³¶¶ö÷÷çn¯·ó­tn~ë×ôUߘWeÌâhuOÙÅÅeüøñ¥¥¥­ë(Ûk+' V ¬¬¬‹‡­:Ô&Z×!à:tháÂ…ÉÉÉíüŸÞQÆéÐÝiÏÑØ!È5xíµ×V¬X¡£7^ÇfÛñTWîÿwÞéÐöùê½×ñE¨¸‡ji`/üƒýÖœM˜ÉÖñ Ñ›ÖgC£1N`òUUUB¡°°°°¥¥E"‘$$$èè×Ú|*+÷ßÑíóÕ{¯Mëлoõ$f}0úL»€º„Ì÷Á¶ð!ú¡±CÞÁÁ!444..î×_ãÆÓѯ[›O%påþ;º}Óï½§гˆFbr¿ŠKÿÂõOùކèÛsë´Ÿ¶ùðððØØØèèè 0 ££7žûý«í|ÝæS ÊrÿÚ~7è½7Î¥1¶òslcßAîÇ>åc»Ü«ýû÷ÿè£***222¸b–YYY,ËVWW[YY‰D¢ŒŒ –e7lØ0hРsçÎq÷èø]ˆD¢]»vUWW¿òÊ+P¹E“Í5(--•J¥S§NMKK»sçN\\Üã?ŽG;¥:±ýž;w.33sܸqÊÆ,ËÖ××ïÛ·/((h̘1‘‘‘Ü«Fê „´“q4uÚ«ÒÑ!ϲìŒ3†ÎMkëß»w¯«««““÷”7_íñ„6ŸJèèöÁ_ï½6­ Óƒ;h¨DÝm4݃Ç|¾£!ĨºÅx³fÍò÷÷ûí·ùD Ž"@ãtÐ¥¤¯DÉϸøXÓxn·‹î& åßA¢uuu©©©?þøã¢E‹øŽ¥»¢4”áò:4”iXÔ/å)ð^ŠwPxÌØé]Ëœ]€ã>¸y +?Ò½wþËw@„tÞœ9sîÝ»·f;éÆ(}İ’ ê²†E¾@Éi úJNw¯‘X4ØbÄ»˜vvq& ‰spïß1BøA ‰ª+šõ EÉi¸= n|eܰ ÆÞã⩟q?LJá®ÞF˜!„t#”Ž:@ÕUÔß…÷_÷u*í: SÓ´ÎA|‡Bá%€hj®AѨaQßñ0ëƒÒ_àý2š "ÅèÁcù0³h»%!¤ÇéáÕ®ÛK4Š&Ô\‡h¤ú"5|߆µ VÌ.‚¥ñBˆþQØûÀ¬ª®hH|ßy8Ñ«Îþ© C^ƒ…ß¡ÞÄÆÆê¬†tkô&ðò÷Á%¶øŽÃD°¸ò® Æ >o`Èÿ£4Ð %''ðѧ   nüQ%¢]£×?CÖ6€ÅÀðyV”‘bj(¶4Õ g'²>C}FmÆÐU|DÑJ¤}¸ù-l½Ñwß¡Bôƒ!„ôRô@§T¦ã¸+ùŽÃD°Ta”îˆ@»å}ƒßþ¨:k? •¸¾×€LFñ)–⪞P+‰Þ„@» ¬q+ §ÿ²¿Dó}¾Ã2â1¾…ßã˜~~ ·j~§šbb(¨(=ƒS`š—ö› 0(9ýðãàW¡h@În£Egº,1ô-<›‰' °AÒB‘áÒÛ¨/å;2Bˆ.”T˜ Q‘Šû¹š—öÁ9Å?<ühéÏýy)¬ë3ôŸŠñG1»>oàV4]bâ(¨pF€ÊóZH¦áÎŽ¥5l5ê ‘¿ß8ÑuÂ~¶ÏfÃÚïP!ºPPanÈ/jm ™†úÈ/=ühëïe¸òoú©«c®y~K=Øã†BÑŒÀ£G£R{pôƒ•äÏ»@†þž/@AwÚ-ë3ĹàÜ ”¥q‰ áU}”ãhÜÙ¤}1ƒ~O¡úÚŸ3l½0JG{ÒŠçb€AÞ7ÈÙ ÑHx-†çB*1D/èMàG•žÁÏ1ë¶Öû׊&>E?*Î!ïÜúMÕè÷üwÁFÆwL„ô.t èQŽ£æÏ»ü­ÑÙ__œüñÄv¬! éL¨½‰z‡ ó¤Rixx8ßQýhè&¶^è#ÒU€ø1XKQxTóê¾ÿ‚°Ÿ¢#`ã û!še¾sË‘¿µ·Œ!¦‚®4b ¥k`®d:ŠŽÁ7BÃBßu† ŒèÀòKÈýl ldp Aßô{¾##ÄHè @ ñc¨¼ÐF·gQ™ŽÅF ˆèÛà¿cJ*æÊ1éG xõ¥¸¸ LJ¢æZÛëÒ#Ð€Ž£‘½ŠF˜õÑÚÆu"‚£ÐGd݈¾YØ¡ßdô› l ª®h½h”££1C#ÄÐ(há8ŠFTgÂÑOk dÔ?Öƒ0æZÿw×áˆVý!~üá.OR> ÝÝÒÂ~ì¡¡‚ï8ˆi°tÂS¿`Èk0³@în$ÌÀ!WœòÇÕ÷øŽÌ$ÔÔÔ¼õÖ[îîî–––îîîË–-+**â1 “žžnн3 S^^Þ]6kRè @ 3 <›ÍwÄd˜ á:®~¬+BÅ9Tœ£ŸP ÅôéÓ†‰0`À;wvîÜ”miiÉwtDJ†§hDÂL Zé,¾C!zbíëÙpŸ­µÁÍýÈüŽ~pÑ(ˆG£ØˆñUdddnnnNNŽ —íÛ·oÚ´I èɧ†aÊÊÊœù¤K‘ÐïÃ3ëk7œû[å%HO" Ù\4ßGövü2±N8"C³¸ó_¾#Ó¿¬\¹’;û+‰D"sssåÇæææˆˆwwwggç… VT<¼¹Ê0Ìwß}'•JíììÖ®]%‘HìííW­Z¥l°ÿ~Õ‰´´´ÀÀ@kkkOOÏÝ»wsÍbccûõëçää´mÛ6¡¡¡b±ØÊÊÊ××WYÿ€a˜„„™L¶gÏž­[·zyy‰Åâyóæqñ444¼þúë®®®...ŸþçKþ Ã:tÈËËK$…‡‡WTT0 ÀÅÅ…»G¤Üì×_­vpÊÊÊT?*Š­[·z{{ÛØØ$%%é>8ÇŽ“J¥b±øË/ÖVûúj‘tKŒ ±Š=ìÆ¦,ã;‡Æj¶ôW6ë 6e[xLs›º"¶±Ú¸aµmîܹsçÎm³™££ãÑ£Gµ-åÎY[¶lñööNIIÉÊÊš4iÒ¬Y³”KÃÂÂÊËËcccL›6M9››Ë²ì¾}ûòòòT' °zõêââ⸸833³’’³gÏ®¬¬ŒŽŽõõõC† yå•WòóóKJJvïÞmiiÙÐÐÀí.(((11ñƒ>8p`rrrNNNXX÷5#""d2YbbbVVÖøñã¹Ó7·–OJJJfffppðÌ™3¹™ÜRÕÍÖÕÕ)¿xbbâüùó}||TÆgŸ}æîîžPTTáääÔÔÔ¤ãàL™2¥´´4..Žû^Ú¾¾2ÝDGG?2§=«‘¶(Ø%m4É?À~kÆ–þj”xHw“8—=öˆ'ÿ {q5›É–%±Jù ª @ $%%)?*\Êårö0hРo¾ù†kpõêUÕÕÕÜÒøøx–e[ZZÔ¦ÓÒÒ4îN,úé§Ü´\.onnpáÂåŠeeeUUUÍÍÍ\›¬¬,ÕSyLL ˲Æ ;pà× ¨¨ÈÜܼ¶¶ÖËËkÏž=ÜÌK—.©®ÉÍÏÈÈà‚WKÜfY–­««Ûµk—ŸŸß„ ¢££Uƒ:tèîÝ»¹i…B!—Ë …ŽƒsøðaÕï¥íëw:Ð- }¸øOœy¦6ž !™ŽÔ—Ñ\k”˜H·2úCŒ‹ƒ÷ËX£èÎ-ÇÁ8äŠâS|GÖ6‰D’ýçr¹\ùRAA··77ÍMrmmm˜™™©Mk³cÇŽ­[·zxx,]º433“»Ñ$•JUW¬ªªŠˆˆ ‘H$Ë—/W]]&“ÈÏÏ_´hW ÓÍÍ­¥¥¥°°°¸¸xðàÁ\3å„j̆ ¢¼ÚfO:åááqùò娨¨øøøððp ‹G*BÞ¼y“Û†aD"Ã0:Ž›››ÚÑøõ;€>ô EåyÔÞl£YÀÐtŸF ØxÂý9ø®Ã“ñÌï˜_‡y˜x Nc5·O]†ä%¸œ](>…škhy`܈ÿ4cÆŒ;vp¿RˆD¢óçÏ«µ‘J¥yyyÜ47!‘H:·»©S§Þºu+&&¦ÿþ&Là’ w+\)$$$//ïÃ?¼yóæ©S$Qîd*‘HŽ9¢úK|ðàÁR©T™ÉrrrT×ÊÍÍå&nܸ¡1xn³R©ÔßßÿÔ©S'NœË5ôùI$’üü|åǪªª––Gí{iûúF @§Æ*äîiû7»ëXØ¡¨­þ=Kg<±ù{Q“¥¯IÏĘÃÖ ýŸÖúž¹'M(9ˈŸŠãÃmC®¼Œ„³nݺâââ°°°ôôôâââC‡­_¿^­Í‹/¾¸aÆ´´´ìììW_}5,,L$j×+ôû÷ïçÎ˜Ê ??¿5kÖÈd²1cư,+ [¯ÕÔÔäïï?hРk×®-Y²@ee¥jƒ%K–DDD¤§§çää,_¾|âĉ/^üÞ{ï%%%ݸqCÙ ÍÙ¸qcZZÚµk×V®\© ¾õ)~øðáÇ?yòdQQш#–-[váÂ#e^zé¥wß}÷ìÙ³%%%}ô‘T*}ðàA‡ŽÆ¯¯1Ù´K{îõ^uEì°%¿´Ýò×9ì/Sڵ͚ì.EÈ#šî³ò+láQöú6¶¥As›üÙÓØß³o³ÙÛÙ£låEöA)Ë*tl¸},ËÞ¾}{áÂ…ŽŽŽÖÖÖaaaÜÏXÕ>€ÆÆÆÕ«W»¹¹‰Åâ ¨Þ=WÞë×8 `ß¾}ª§OŸöõõ …ÞÞÞQQQl«þز²²£GzzzZZZ8qbÊ”)\g¬r³kÖ¬‘J¥¶¶¶S¦Lá:œÞxã î) ½{÷B¥`Ë–-´··Ÿ3gÎÝ»wY–  …j‘+ÕÖÖîܹsüøñª3×­['“ɬ­­ýýý¹>vn~믯‰nhÕ@c·å°†ü? [ÝF³¼ÿ íðÜ]XØ%,BÚÅÕ ¨+D]ên£®UÀ˜a~½æa‹äÑG¼ä/¯?hÄÄÄ9\SÃ0LZZÚ˜1cø¤«†‰ŽŽVà¡'¿©¡NO "­ífÒÙ8÷ ŠŽÂs‘ác"¤Cø¾óÈŒæZÔÝF}™æ³ó}œ| Àþý6ÿö¤Q"$ü >€¶8=Êv$€>"¸N@Aœá"¤Ë6°о!š—š[ã¹bLËØu„qÃ2Q,Ëö€ŸÿQh‹ø ÔÞnWÑÿK5 IH·Ã˜AØŽ£n×8ð 1,ºÔ§1ƒÊt¸=ÛFKç!„è]´¥¶ÚÕ Ð,®¼‹Û±†Ù8!„èB  †¯…ë$ÃlšAý]œû+îÝ0Ìö á™1‡ `TXYYêÞ~;hnnÖËØ­7¢¯-w%€vð^× †Úø˜Ï!…3ahª6Ô.øcä?~C<Âû»n¨€ÔÔÔØØØÂÂÂãÇ …   ††í1>>^.—Ëåòììl??¿çž{Ž«–Óæææûöí³³ÓÿÞ†Ûr;Qà#À“Ñh©Eò‹@z'ÃøüÄÔpCüðÃcÇŽuqq5jÔöíÛ/]ºd¸¡lmmE"‘H$rwwß´iSAAjé…Qþ6gæ…^0Äà6†Ûr;Q0BW<‹;?à÷­|‡¢OÆÿã7mì½aøÀN0òPj¸½–e[WÿWÒ8x@ëŠÿååå])ÜÏÍT·¦µQ”rÅM;~øÛ¡Í·‡‰‘\û„ýVÀ–ÄóG'qïÇ«š4iÒ† ´µçþBšÁ÷} IDATššþõ¯I¥R''§çŸ¾¼¼\¹4**ÊÍÍÍÖÖvÍš5ß~ûmÿþýíììÞ|óMeµ hõ:þÅ‹Ÿzê)GGG¡P8|øpî%øéÓ§üñÇ\ƒääd''§ºº:m1¨PþÕ(+(Ë(ç+Š-[¶xzz:::Î;·ýßȵ¿„6F*@õß@MMÍ?ÿùϱcDz,ûÅ_´®þ¯l¯cðµ]/ܯ6nê^ iÔÎÉ“'=<<6nÜXZÚ¥ á ñŒáâöÂ?:³âÙùìÙçõÁiø‚åõŸ£ñ;22200kðÚk¯­X±BG jÿ­g¶.Õ¢ã\£û™ ®'# öëÖÜÜþ¼ÚÒÒÒR©T:uêÔ´´´;wîÄÅÅ=þøãxôòÆ ƒ :wîwÿ=,,Œ[m]þkìP^þs·\û÷ïÿÑGUTTdddp%p¹ ÿêêj+++‘H”‘‘Á²¬¶D"Ñ®]»ª««_yå¨\§gggk Œ›¿~ýz__ß´´´7nüå/ñóókç72A]¿Äw¨€ÖÓÅÅeüøñ¥¥¥­«ÿ+Ûk<@­âYYY ÷CçMEhu€sèС… &''wñÿ¨ ó.½ÃÜÞÆUWÙ`Ë’ÚnÙýiø‚cä?~U:þ°Y–1cÆðáùim1ìÝ»×ÕÕÕÉɉ{Ä›¯må|#´ç™ ½$ÒNFø—Ð:Ѐ0íV| ñÓ0§–.íjl0ÜžÅcwi§µ·QsýŸîÒFH+³fÍò÷÷ûí·ùĤ͛7 cFv¦õ€0ÔÐnÎ`ÌP–ÜÞöÏ£¡¬ífºe_gánbW·CþPWW—ššúã?.ZDC÷Âò1ê%€v³°‡Ã0”·;Œ\À½]Ý©ßûp CÂ3¨Tï>%sòäÉÐÐÐwÞyÇÃÃïXá%€ŽpBùoFÝ#c†Ào ‰„¸ŸkÔ]÷PsæÌ¹wïÞš5kø„þQè籨L‡¢É¨;5·Âøã°vÃ鉸ßɲV„Ò%€ŽÍÃŒ|ÍãhTžŠ‡­~ DÍ5cïÒCQè-„}yÚµ BÃF†š,~0 L+ééémŽª¡±p?Õï$¤{ ÐGŒ§SÀôöœïçç§ühgggffÆï¨=Xaa!W™ôH”º•^öÇÅ^Ôf¾ð ¼Ó㥤¤ÌŸ?Ÿï(ˆ¡Ð ÅðnÇ"åe¾ƒè9îß¿_õe¡!î~«s܆††×_ÝÕÕÕÅÅåóÏ?WÛ¬ÇÜè¶bbb úb*1>Õ·À@ ÀÌÈ‹DíM¾ãè!&Nœèø‡‹/ª.Ú¾}ûž={¢¢¢ÒÒÒêëë¹>J7n<|øp\\\RRÒ¡C‡Ô6›’’2pàÀM›6ݽ{×àßÁwBêZØ1ûûû†Úþ½ÍuXÅóyÈ3Pý»þƒqÄèö?Hý«±ßP3=ºkñK¥Rå5999Ú6¢÷171Y”:Î%Š&T¤t`•¾`í†[ß$ž!¯áÉXÜúg¦¡QóØ,½„îq?/^üÞ{ï%%%ݸqcÕªUjëpÌ BL=ÚqVØx¢ì7¸Njï*Œdóqó[Œ|Ð5&\'¹Ï†ð~Óã1þlzi™³µk×>xð`öìÙUUUÁÁÁqq ʶfÍšªªª9sæ(Š?þøÇT]zâĉ“'O~üñÇÆšÞÐxòÛ"4VaÂ;°JÅ9$ÌÄÔtX»*ª{98ó šª1á¿?n¨½Bz ºÔ)Î(ÿ ¬¢«8ùcv¡Ïþìbê9¸?[/îÅð~øá‡Ö%†‰ˆˆà;4Bzºè”Êóøa žùÃø…B:‰®:ÅÑ}D(ý™ï8!¤ó(t cŽ/ÁB½" !„t#t ¨w¨+€™%oµ¬ !&‰®z‡‹«qbŠOñ!Ä„Pèü¿Bÿ§? éGS ßÑBL%£cH^‚£FÝ©…¿Að·¸õþëK—„Pàc†¦jdÉî=àÙH¦!~*Ά£¡Œ‡!&ƒ,CéÏüŒÐGÿ¯ðd4Ê΢ö6BL=ĶG<àýŒ\Ï[ Š˜Yò¶wBˆ  +€®):ެm^‹`À‹Èûl‹bj:ûÒëQèšêßquÐñ«(ï¿ ®Å?¶Ý’B ƒ@׸N@Cª3;¼¢í¸ŽGîÄÔŠœ†/&¤— ñºFü8,ìQzÃ;¼®×Ò‡wsDÖ)µ(ý9;1ä5 ö|Dø”œœ\PPÀwDŸ‚‚‚¤R©ò#uwÙ™g °Á“ùŽC_XÜŽÅÅ¢©ÃVÃçuê-èµæÍ›ËwDŸ¢££ÃÃÕéP—õÒ3é0Q dó0ý½‚+ïâÄhäïëØÈ¤™;w.KzŠÖÿ)tY§»L™…=FmFØu8=󯡩Šï€!úG}]&~¬óÝ&ÎÆß ± }¨ð5!=%€.c˜x CùŽÃ`èìOHE·€ôÁ9|atå)P4ñ!¤ó(˜ ß î„æZÄOűAÈÞŽ–z¾£!„t%SÀâôøÎ””à‘ÀÏ\Û \ü¾÷Ä•õ¨¿ËwL„Ž¡` 8=ëŸ@ÑÈw$aíŽ1ŸcæM únü/¾÷@ê_zÚÓP¤}jjjÞzë-wwwKKKww÷eË–q‹†IOO7èÞ†)//ï.›߇K%Ó0äuÔßÅí¾ãè8a_Œø7fßÁ“Qså)|DŒM¡PLŸ>=55566¶°°ðøñãB¡0((¨¡¡ïÐL‘I.z È4XKá>™Às!ÀðMÇ1fp{nÏv³ž ¢‘‘‘¹¹¹999666\\\¶oß¾iÓ& 'Ÿ^†)++svvîèŠ&u¸è @ØfÔ—t~õ¡«Pu¥ñú ˆÚêÑóB=×V®\ÉΔD"‘¹ùŸÿš››#""ÜÝÝ.\XQQÁÍgæ»ï¾“J¥vvvk×®ŠŠ’H$ööö«V­R6Ø¿¿êDZZZ`` µµµ§§çîÝ»¹f±±±ýúõsrrÚ¶m€ŒŒŒÐÐP±Xleeåëë{ðàAåÖd2Ùž={¶nÝêåå%‹çÍ›ÇÅÓÐÐðú믻ººº¸¸|þùçÊà†9tè———H$ ¯¨¨`€‹‹ wH¹Ù¯¿þZíà”•©»gÐÃÕa|¿œÜƒ$/eíÒ~ÏÆO×S4¦¤â<ëĦ­dË’ù…tÀܹsÛS ÂÑÑñèÑ£Ú–r§ì-[¶x{{§¤¤deeMš4iÖ¬YÊ¥aaaååå\Ñ¡iÓ¦)§sssY–Ý·o_^^žêÄ€V¯^]\\gffVRR`öìÙ•••ÑÑÑ ¾¾~È!¯¼òJ~~~IIÉîÝ»---¸Ý%&&~ðÁLNNÎÉÉ ã¾fDD„L&KLLÌÊÊ?~ÎĸX¸ó уuëÖ‡……¥§§:thýúõjm^|ñÅ 6¤¥¥egg¿úê«aaa"Q»jLíß¿???_uÂÏÏoÍš52™l̘1,Ë …ÂÖk555ùûû4èÚµkK–,PYY©Ú`É’%ééé999Ë—/Ÿ8q"€Å‹¿÷Þ{III7nÜPëVݸqcZZÚµk×V®\© ¾õ)~øðáÇ?yòdQQш#–-[váÂc®kó¶逢솭»ÃwÝYS-ûSûû¶:“ïPz»vö°,{ûöí… :::Z[[‡……q?ZUoj766®^½ÚÍÍM,/X°@õî¹òæµÆiûöíS8}ú´¯¯¯P(ôööŽŠŠb[õÇ–••=zÔÓÓÓÒÒ2((èĉS¦Lá:c•›mll\³fT*µµµ2e ׃ÚÐÐðÆopOíÝ»*}[¶l8p ½½ýœ9sî޽˲lHHˆP(¬¨¨P‹\©¶¶vçÎãÇ7æáÒ ­úhD0½j®C¬»áùß¡t[õ¥¸¼…GQ_ »AL‡dú†ÀÜŠïÈzyóæˆ‰é†ï'êÃ0iiicÆŒá;®b†F3$5¼_†™†kRÒ^BWøïÄì;x: ²y(KDü4Ä:áÒÛ|GFHOÓ“_ÕãÇ;øŽ G`Ìàç ŒÚ„úRÜù–N|ÇDz©|›„€©R4"/îsèÄ¡+¼¨uiþ^Ô—¢oă¡Ï„týÁ˜*V«P“…Ç>æ;ÓVu9_¡©[¸£ï8ô'˜õá;2BLõ˜*s!†¯Å¨+à;Ó6úÌ­ÄÔó¹æB\ÿ?ÃA{Ô\ç;2BL%æýWXIpußq˜<ÆâÇàó:BŽà¹»˜~ÿ­·æÆò‹4„_Œ\ìÞ8{dZIOOonnÖ=œ€ÆÀ 76t È„™YÀwÎ-ǰh=5ŒD¾ùj^ÚTƒÆ€1‡ƒ/œÆÀa8ì}`?Ö20ôcˆtR||¼ŸŸŸò£™™Ù¾}ûìììxŒª=(˜6¯ðûf\YÀ½|‡Ò#l0ý2*ÒQ™ŽÊ ¸‹F9ØÀŒ\¾ƒ#ú¡­R§+ø·ÉÖÖ¶õ›º/¼Ð ^¢_=†Q‘†³ó€.?=Æ0j3ò÷£âœ>Âêõs8 Ç€1æ <„¹•˜s¡ ó¹æöu¸ødoÇÿ¢úw4×7Üî­u)ÿÖ4îæ™g>ùä®AJJг³óƒ´ÕÇWÞ3á¦Õ*õ«£œÏ²lëÁÐ…jû÷ï߯úƒ²È¶}q´@ÀájšêÞuWµùö0éŒÊ öØŠ¶_ÎnûËT6¿>6E:¨<…=áÇÆˆØxø_¬ ûÃì¥u|Gf í/¡QëRþhU±@cáþÈÈÈÀÀ@®Ák¯½¶bÅ õñÕŠ@´ž©Z/›ÿÅ_´ €ílµ}µ3ªÚîtì+--MÛœ“'Ozxxlܸ±´´´“ÿZ…J㇂=,e¯¼ÇwDOäle[p„½þ›þ{}›æf¥ l 6õ¯ì¥wج/ØÛqìÝD¶&»K£Dð§‹  µÖ @cáþªª*¡PXXXØÒÒ"‘HtÔÇïDÐ8ÛÙjûÚ–r»Ó±¯´´4m#(ݺukíÚµR©tñâÅ©©©mß¶´NÔ` úMFñð]Çw$DúˆÐGÇQm4cÌ!°GímTœCC9êË h€Kð í+ÓQø=ú8ÂBôpÜ„…,]ôÿ-ÚT{ ÷n éØ&4Vù¹–f”ºt‡UUU[·nMJJÊÉÉQ–àwpp ‹‹9r¤@ 7nœÆúøÃ† ëÜN¹Á-Z¤œSXXÈí]¿Õöuï €Ž82™lóæÍÿþ÷¿<¸bÅ ‹sçôy7˜€Á¸=‹³sQ_a?¾C!Æâ¬^㺩õ¥Z+ÙÝÏCá4V¡± Í÷ÿœ?èoškŠÜ<€ËÃ#-ÉæaØj íoEãÚ‡Ðtl3Xšª`à_á÷¾†öEÇþêÃé>ŽOyX:„„„|øá‡£GfUj;‡‡‡ïÚµëÚµk ,`†«ŒVõñ¹¶­GhÑA"‘|üñÇ3gÎäV¯®®6T±å¶öÅ@ðä“O¢Õª²²²~ûí·šššùóçë7³´Ô÷p]¼©Dt‰†M˜Éw„tRûЪ”¿ÚÉ'--M[á~–eg̘1|øpnZ[}ü½{÷ººº:99qOqóµUêWÎ×8۪àÕöµ-åâѽ/m#p:´páÂäääzí¡ÒxFtãÿp9Ï•P‘2Òñ;À¬Y³üýýß~›Ê€ë `\^/`æM=Ÿý«±†H'=X]]]jjê?þ¨Úwʯ~ø¡uɆa"""ø­Kè—©! lõ¿MEr¾‚¢‰ª„’žêäÉ“K—.}çw<<<øŽå¡©S§öÈ›%tÐÝ]1â]dª«|‡BˆAÌ™3çÞ½{kÖ¬á;ž@74øïpòGÊ‹P4ñ !¤£Ð 1æþ÷óq¹{ß$„ð‹@÷d-ÅãŸáÚG(=Ãw(<¨©©yë­·ÜÝÝ---ÝÝÝ—-[VTTÄ-Ò{ý÷n]íÝ(t[^K yçþŠ–|‡bT …búôé©©©±±±………Ç …AAA Úc||¼\ÅèÑ£ÍÍÍ»EµwBt£§€ŒBžæZõ"]7vJãµ–èþ4pŒŒÌÍÍÍÉɱ±±àââ²}ûöM›6 †úÇÜ}«½w]JJʼ®½LL]Eö—¸ÐFIñκÂcþ7Û>eeeª ÅÖ­[½½½mll’’’477k+ã~ìØ1©T*‹¿üòKnfZZZ`` µµµ§§çîÝ»µv?pàÀÊ•+¹³¿’H$277W~Ô±_Ýß5–°ïÆÕÞ»&000 €ï(ˆÞÌ;×ÝÝý‘YúzɘèRt‚=À°÷oñ‡~$&&Ο?_ùÊ>ç³Ï>swwOHH(**ŠˆˆprrjjjÒQÆ}Ê”)¥¥¥qqq ¾¾žeÙ¬^½º¸¸8..ÎÌ̬¤¤­ªã²,ëèèxôèQm±HKKÓ±_Ýß5–°WeÊÕÞ é(JFÑÒÈÆ8j-"ßMÔÕÕíÚµËÏÏo„ ÑÑѪK‡º{÷nnZ¡PÈår…B¡£ŒûáÇÙ?Š­s§E±Xüé§Ÿrår9÷ë¸uIIIÊÊS³\.gÿ8óêØoG ¾k[Ó«öNHGÑ- £0³€äÄñGç:uÊÃÃãòåËQQQñññáá᪠nÞ¼9dÈnša‘HÄ0ŒÆ2îÜG777|øñãÇOž’J¥<àʸ§¥¥egg«–q×ÈÏÏoÍš52™l̘1ìcƒ´N6ëÖ­+.. KOO/..>tèÐúõëÕÚth¿ªöïßÏ¥1å„n\µ÷ôôôœœœåË—Oœ8Qu)Wí=))鯫½s…ò—-[™™ÉÄ'Äxx½ÕË$ÎcžlØ]”üÌFY²i+ º“ÚÚÚ;wŽ?^ufccãºuëd2™µµµ¿¿?w{][wh©õôéÓ¾¾¾B¡ÐÛÛ;**Š}´°»ªÛ·o/\¸ÐÑÑÑÚÚ:,,Œû¯ÚÐÎý¶ž†¦öÝ¥Ú;!EãQå(àhؽäE"åeŒø7FüÛ°;"„tsô"˜‰3Æ^,…™)/£¾c¾£¹+•Bè  ‡*ǯ³à4ãâ`A !P'på:þ‹Ê4\ZËw(„EW=ZÍuì`íÆw„SD €Bz)ºD!½%>4ס:“ï !½%>düIóyÛ{C9²·âmaBH÷B €²pT]EÕe~ö^rç_ÙgP—Ÿ!¦\ž„nàgï ðÔ/¨þ'ýPršŸ!&€3 XмoÀò4 TßL»„¾!ˆŸ‚ó¯¡¹ŽŸ0!¼¢À“KQÅ?ò@‚¿Ãد‘¿'F¢,‰·H!<¡ÀOô}yßðÆ€– ñãhªæ9BˆÑÑ‹`üÉ݃ô¿cöôqä;BHoDÕ@ùã>UT­“º „höÉ'Ÿ$''óѧ7ß|30ðÏ!I¨€hÁ*ü"ŠOñáMrrrJJ ßQ½‰-((PC·€ˆÍ÷ÐX‰ø©è7}ÑH¾"<ˆ‰‰á; ¢ è͡+¢……ÆÔ4×â„Άã~Ûƒ¤BºJD'§±˜ü+ü¿ÂÝDœ‰ß7¡¥žï˜!úA €´…1ÇÀ¿âÙl y ™ ößBôƒ€i¸—wøB' ;ŒÚˆÙŰÂw(„ý `X~ÅõOùŽ£Ö|G@ÑJ&€1àÈÝÝ‹²U^@s-ßAÞÔÔÔ¼õÖ[îîî–––îîîË–-+**â1 “žžnн3 S^^Þ]6kR(˜ïeh®CAßqt‹¤çª«&âœIDATñ½'®nDcßÁcS(Ó§OOMM-,,<~ü¸P( jhhà;4ÒJ¦AØÒYÈùŠï8:‡ÁÓIô7\ÿß{ c-êŠø‰Odddnnî?ü0vìX—Q£Fmß¾ýÒ¥KAO~ÍÈt®º %“1ð¯(KBÍ5¾ãèKgŒ|3obøÛ¸¹G½´çø‹ÃV®\icc£:S$™›ÿY窹¹9""ÂÝÝÝÙÙyáÂ…Ü|†a¾ûî;©Tjgg·víÚ¨¨(‰Dboo¿jÕ*eƒýû÷«N¤¥¥Z[[{zzîÞ½›kÛ¯_?''§mÛ¶ÈÈÈ ‹ÅVVV¾¾¾Tn-!!A&“íÙ³gëÖ­^^^b±xÞ¼y\< ¯¿þº«««‹‹Ë矮 ža˜C‡yyy‰D¢ðððŠŠ î*îÌ«Üì×_­vpÊÊÊT?*Š­[·z{{ÛØØ$%%é>8ÇŽ“J¥b±øË/¿äfª}}µH:Œ%¦BÁÈžû¾Ãè2E [ü{&Œ½üo¾C!]2wîܹsç¶ÙÌÑÑñèÑ£Ú–rç¬-[¶x{{§¤¤deeMš4iÖ¬YÊ¥aaaååå±±±¦M›¦œÎÍÍeYvß¾}yyyª X½zuqqq\\œ™™YII €Ù³gWVVFGG ‚úúú!C†¼òÊ+ùùù%%%»wï¶´´lhhàv”˜˜øÁ 80999''',,Œûš2™,111++küøñÜé›[ËÇÇ'%%%33388xæÌ™ÜLn©êfëêê”_<11qþüù>>>ªGã³Ï>swwOHH(**ŠˆˆprrjjjÒqp¦L™RZZÇ}/m__‰n¢££™ÓžÕˆ‘d}ÎFÛ° |Ç¡'Šf¾# ]ÒÎ ’’’”•?.år9ûG4hÐ7ß|Ã5¸zõ*€êêjni||<˲---jÓiiiw'‹?ýôSnZ.—777¸pá‚rŲ²²ªªªææ‡ÿü²²²TOå111,Ë6ìÀ\ƒ¢¢"ssóÚÚZ//¯={öp3/]º¤ºVdd$7?##ƒ ^-p›eY¶®®n×®]~~~&LˆŽŽnllT ~èС»wïæ¦ …\.W(:ÎáÇU¿—¶¯ßé@·€LÉ€—ðdLÏ@[¥k¾Â$†!‘H²³³•år¹ò ¥‚‚ooonš›(,,ä>ÚÚÚ033S›ÖfÇŽ[·nõððXºtiff&w£I*•ª®XUU"‘H–/_®ººL&ŸŸ¿hÑ"†a†qsskii),,,..üÿÛ»÷¸&Îtà¿p1ˆá*¨AP¨—-­.Uh¹ø±¢mª²*º¶ØíêªçØ~Zm϶xZ¯ØUÚÚ~´{¼´Öh)W­u¡¸ö°.¢ØD¼ Q¢Q. !sþ›Æ2!<ßú2óÎäÉÔÏ<ÉûNÞg̶›¾a3€ÀÀ@ÃàN›——7räÈ .¤¦¦æççÇÆÆÚÛÛv»rå {<ÏÕÕ•Çãuqq„B¡Ñ1ùö%Kb'€÷LÀxÁ&«ÒzÙ^8½õÿh)rk0kÖ¬;v°ŸR¸ººž9sƨH$ª¬¬dÛlÃÛÛûñ^nÆŒÕÕÕ^^^‘‘‘l²1Zæ,<<¼²²rË–-W®\ÉË{hE[öfêíí}èÐ!ÃOâcÆŒ‰DúL¦P( ª¨¨`—/_6<{Z‘H’———““£R©:ïíí]UõÛšZ ííí]\œŽË·™|û1/Û!—ˆÛ?áX¾óÃù$4þÂuL䉬Y³¦®®N"‘Èåòºººìììµk×õyýõ×ׯ_/“ÉÊËËßzë-‰DâêêÚ“ïß¿Ÿ½cêÁÁÁ b±xÒ¤I Ã888t<ª­­-$$dôèÑ¥¥¥‹/pçÎË/NJJ’Ëå …bÙ²eQQQâââÖ­[WXXxùòeý,4kÆ 2™¬´´tåÊ•úà;ÞâÇwäÈ‘ÜÜÜÚÚÚ &,Y²¤¸¸Ø°Ão¼ñᇞ8qâÆ[·n‰D---=º8&ß¾ÉdÓ-Ý9"¤÷Ý9Ç¿Ëd{3Àüð{¦æ{®"ƺ9À0ÌÕ«W-Zäæææèè(‘Hر†s&>>^(º»»/\¸Ðpô\?Öo² @*•6Ž;6~üxÿÔÔT¦Ã|¬R©<|ø°¯¯/ŸÏ ÍÉÉ‰ŽŽf'cõ§Õh4 "‘H DGG³ÎjµzÕªUìS@ûöíƒÁ@rrr@@€³³óܹsëëë† wpp¸}û¶QäzMMM;wˆ0ܨÑhÖ¬Y#‹CBBØ9n^v{Ç·oI×Ða€*‚N1í¸ñ#®ì‡ðˆçs yÈüùóP='“É&MšÄu OŠÇ㥥¥ÅÆÆê·Xó/5H?À³…×txMç:B"JIJ ƒ[0D³0<6|®£!‘“Ð$°¥ª?ŽŸ7r×Ú[à97ÿù3剱¨üÊÒ×Í&¤ÿ `©Úq~ .r§lã™­”bVžN†¶ò·pP„ã³¸ŽŒk@C@–Jø ÜŸÅÏÉû†ëP,€`ƬĘ•ЩQ_€¶{\Dˆ5 ol\"®¦Ócò±ácÄ4øÄ˜Þ{í ÎÅãz.Ô·Íéæ,3Àë@.—kµÚ®×Ú4†å,úHô À‚ùü.cqi#B¥\‡ÒOhn£ö(Ý F§¸ÿC¡!p{†j™õ;l™—™™9jÔ¨ëׯïܹ344´¼¼œÏï“Çòó󃃃õ:99ÙØØH¥R''§¾x9K@ À’ñ0.'ã0>‰*ñv‹ÿRø/…® ÷Ê¡,„ò*vãì{x>>s¹Žô [f@¡P° M{zznß¾}ãÆ}Wf@ tü îk¯½ÖG/g hȲ‰çcˆ/J·pG¿bc—qX†)ûðòψ©…×LÓ=«ÓPû=î)À´›7Dòhf.3àþýû ¿Ò/mÄŽç0 Ó±~€^g…XìÒ¤½v]z%ËÆ³ÃÓëÑÞ FÇu(ý–ÈNÇJ’q|¾´!È Æ‰¸¸WÓûqqf+röìÙ§Ÿ~ºë>[·nýöÛo333OžýW剠ÃZ@4@¶Anð…Gèo[tjÓ?9Ö©‘.À ¡øbˆ/†ø>hüàü”Ùâ8Ø2¡¡þרTªææfv}|=“+é;=/3Ð5¶~À«¯¾ªßRSS£¯ÐE!–X,Þ´iÓ|žž¾|ùr{{ûŸ~²ˆ‚©4DÈúXpâ…lŒ¡Ðipã(ÎýÿzÿŒ0ÝY§Æµƒ¨/@c)ÔJ*~ÐSf.3Ð5“õ Ã謀¡²²²“'O666N›6­/‚| ô €î±áC4Ûx£FµÒTo é þðÛŸ< rà 7¸ŒEøw&úk›pã<d þƒ© {8úôBü: šk4´M m†¶ñÁO+:jüå/ÁÅ»Î=Û /ýXÖ¬Y3qâD‰D²~ýz¡PxêÔ©M›6õaWÒ rqqéi™°°0???}£ëþlý¡PèêêúÑGÉårÃI¶@``à°aÃŒ P«Õ_|ñ…F£yóÍ7?ýôÓ>zŒõ1P ä °÷t“œ°P õ-¨o¡U u=4 Ш`;Øtÿ¦+ø÷Û]ÆâåŸMl¿[‚ŒëAÿÆräLèAÿAîW]L‡jÆ ;yòdBBÂôéÓÕjõÔ©S322FeØ'>>þþýû111---Ó§OÿüóÏ»yò¸¸8©Têçç§otÝ?11±¥¥%&&¦¡¡!,,,++ËpoBBBCCÃܹsu:]JJÊÑ£G ÷æäääææ¦¤¤Lž<¹›á™ Õ ÄbèÔhUB§yÐfF² —±&:·5¢.ÏÄv{gxE›ØÞÞŠ»?€Í Ø ypf{çmS¨€•¡zý£ƒâïΆ£ðÑI¿cÇ£¨»í{VBÇÖî#(bÅh¸_ioEéV¿Ãu„k@  _±sÄs_âjjLÍ"BHOPèo†GÂ÷UÈß‚ö>סBú7JýÐÄOÐÞ‚‹ë¸ŽƒÒ¿Qè‡øøÝZ”mCÃ%®C!„ôc”ú§€pŸˆSq$„ž£Ð?ñlº>1ëPz~"„ô;€~K0 ãÿ‡ë z~²d™™™<ž5|È &Q £ÂOkõêÕì‰ÕЯ®ú‹R“¬¾¾ÞhËÔ©Sׯ_ßY2™¬­­íý÷߉DC‡ýãÿÈVhb÷¦¦¦ …B@ðÍ7ßxyy999­^½ZßA*•5òóóU¿ÒjµúžJ¥R§Ó%''ûúúº¹¹Í›7Ïð…ØJ o¿ýö°aÃ<<<¶mÛ†‡—}W©Tmmm½s™1 JÄL ,Xd´ÝÍÍíðáÃÅÞy“““ýýý‹ŠŠÊÊʦN:gÎý^‰DrëÖ­ÌÌL3gÎÔ·+**†‘J¥•••† £Dú ìÝüóÏ?8uê”B¡H$úr(lϤ¤$±X\PPPVVa”rssG޹aÆ›7oöÚU#¤/Q }«¹¹y×®]ÁÁÁ‘‘‘iiiƨ~"„+ô©?ŽÆ_¸â!yyy#G޼páBjjj~~~ll¬½½½Q¶ð“þO•J¥HÏdá'öϾ(üÄ>$ ÛÛÛõ/„n~R(/¾øâòåËCBB;BÌ€€Õ`páp|4w¸Žä7"‘($$$///''G¥R™ìC…Ÿá %«ÁCøA€‡ã³ SsÌãÆ;räHnnnmmí„ –,YR\\lÔgÍš5uuu‰D.—×ÕÕegg¯]»Ö¨[øI&“•——÷´ðSUU•a£klá'¹\®P(–-[e¸—-üTXXxùòe“…ŸØòRK–,™<<½hÑ¢S§NõÎõ"¤ïQE0«s3Ç%ýS¾¾áB:E7«3< á‡p-§ÿ ¦ëh!–‹€5ñ"^ÈÂÍ¡å:סB, Y/6}²–!Ä:P „І€!d€¢@!%€„iGéh›¹Žƒb( $÷Êñófä…àn סB¸G ` q~ ’R öÆQ¶ëh!£§€¦—ÖãÒzˆæ`ò—°wá: B7( T5ß¡è 8 1E ·àG÷'„X¨D³ýlq=—ëP!Ü o£xàÙr!„”!d€¢! BˆióçÏçë’žžnø¿ØŽ«[Ä¢ÝøÃ#ihˆLž_‚Ñq!¤—Q àÙÀ ^)‡ï"ÈVàèdh¸Ž‰Ò›(.Ù»àÙ1ó¼f`+×ÑBz%Ò .cñ»u\Aée”!Oª±±ñ½÷Þóññáóù>>>K–,©­­ewñx<¹\Þ§¯ÎãñnݺÕ_N ®/—!JäI0¨ÚGf8N÷ÒK/>}:33³¦¦æÈ‘#¡¡¡jµšëÐ,‘E].úywK!ûœý/­Âèÿ„½3×ìÝ»·¢¢B¡P 2€§§çöíÛ7nÜhggÍ·§T*=<>>‹-º}û6»Çã}ûí·"‘ÈÉÉ)11155ÕÛÛÛÙÙùÝwßÕwØ¿¿aC&“M™2ÅÑÑÑ××w÷îÝl·ÌÌÌ#F :tÛ¶mÎ;7mÚ4ww÷Áƒ?^¿þÇ;~ü¸X,Þ³gÏæÍ›ýüüÜÝÝçÏŸÏÆ£V«ßyçáÇ{zz~öÙgúày<^vv¶ŸŸŸ««kllìíÛ·y<OOOvŒHÚ/¿üÒèâ(•Js^®cyrê;ÌŵLæP&MÀœy‡i®å: Ò æÍ›7oÞ¼Gvsss;|øpg{Ù[vrr²¿¿QQQYYÙÔ©SçÌ™£ß+‘Hnݺ•™™ `æÌ™úvEEÃ0R©´²²Ò°1jÔ¨øøøººº¬¬,›7nˆ‰‰¹sçNZZš]kkk``àŠ+ªªªnܸ±{÷n>Ÿ¯V«Ù— -((øÛßþpêÔ)…B!‘HØ·™””$‹ ÊÊÊ"""ØÛ7{TPPPQQQIIIXXØìÙ³Ùì^ÃÓ677ëßxAAÁ‚ ‚‚‚Ìy¹º --í¡-<†îj»Ç”¦0}˜{ ®C!½ › ÀÎή°°Pÿ§þÃ¥J¥b~½£=ú믿f;\ºt ÀÝ»wÙ½ùùù ô··µe2™É—swwÿä“OضJ¥ÒjµŠ‹‹õ*•ʆ†­VËö)++3¼•gdd0 3vìØ°jkkmmm›ššüüüöìÙÃn<þ¼áQ{÷îe·Ÿ;wŽ Þ(°§e¦¹¹y×®]ÁÁÁ‘‘‘iii†ÛËe¨c ! Ò{ìZÙUøs 1ooïòòrýŸ*•JÿL‹Þµk×üýü«`555쟀Q»3;vìØ¼yóÈ‘#ÿô§?•””°#'"‘ÈðÀ†††¤¤¤ððpooïeË–.‹TUU½úê«ì™B¡°½½½¦¦¦®®n̘1l7}Ã0f†Á6//oäÈ‘.\HMMÍÏϵ··çöruém´†è3kÖ¬;v°ŸC¸ººž9sƨH$ª¬¬dÛlÃÛÛûñ^nÆŒÕÕÕ^^^‘‘‘ìÝ“”× ¯¬¬Ü²eË•+Wòòò w±·KooïC‡±Ÿ‚u:J¥3fŒH$Òßš …áQlãòåË&ƒgO+‰BBBòòòrrrT*•ÉøÍ|¹ºF €˜KÙg(˜‡ë¹`Ú¹…ô¦5kÖÔÕÕI$¹\^WW—½víZ£>¯¿þúúõëe2Yyyù[o½%‘H\]»õÃòýû÷WUU6‚ƒƒÄbñ¤I“†qppèxT[[[HHÈèÑ£KKK/^ àÎ;†/^œ””$—Ë ŲeË¢¢¢ÄÅÅ­[·®°°ðòåËFÓª6lÉd¥¥¥+W®Ôßñ?nܸ#GŽäææÖÖÖN˜0aÉ’%ÅÅÅæ¼\=öÈa#BzGms,’9ÀcŠ˜seî–ry„nÎ0 sõêÕE‹¹¹¹9::J$öC«á ¶F£‰ …îîî .4=×^›lJ¥†cÇŽ?ÞÁÁÁßß?55•é0«T*>ìëëËçóCCCsrr¢££ÙÉXýi5MBB‚H$ÑÑÑì ªZ­^µjûо}û`0œœàììá:2b&˸ÿ~ïôkï°ã9 Ãt¬ ×Ya»Ôhß¿'s @ú?ž<¦`Ü_1õæßÅÌsxöcü¡6®ÅA¬•T* 3lˆŠŠrûÕÙ³g ûoß¾}Ïž=©©©2™¬µµuÅŠ†{7lØpðàÁ¬¬¬ÂÂÂììl£×*** ظqc}}}_¾'³xäò„X›êtæŸ/0EK™’­Ìõ\æ~Ã踎Éu- „N–Ç T*MÖÐÕYa½êêêÄÄD‘Hwúôé>~+½T€ð=áüî•£d3ògâ;?¤ ðÃD\9ÀudÄLLÖÐïí¢0K,oÚ´I¡P¼øâ‹Ë—/ 1Sܽ&ÊÈÀ3<Ã#´Õ·p·¿ ±üN |ß:‰V%†ˆáèÓiÒ¯x{{§¤¤Ìž=Ã0wïÞ5œ.f <ÿüóèPÀPYYÙÉ“',X`†˜û%2°ñ=0,ûêSñ%*ö’Ë冓la€ÀÀÀaÆu¬·®V«322¾øâ Fóæ›o~úé§|>¿÷ß’YP äQžÛ‰Ÿ¡¹MWÑ| M×Ðt÷ж˜îáܽ¾øžàÅ ¡à(\ÆÂÞż¡wB§†¶öN¦–=—ˆ†óhkœÔùËSfîqÄÅÅI¥R???}£ëþ‰‰‰---111 aaaYYY†{æÎ«ÓéRRRŽ=j¸7'''777%%eòäɽÿNÌ‹êÒÛ»pû4ÔJ´*ÑZÖ›ÐÞ€©ÿĈi&úËV¢á<ìaç„AÏ­­‚séó߯0±=`£Ll?½wΠ­ÚfèÔÐüZÇjÚqÓ_}.~ˆ¦+°wÙ¶¿èD˜êXŽõè!½-à/øËC[Ú[ ¾¾§éþn¿ƒÚÑv÷+ ŽR›îGŽ;ÆUd@<0•<&Ãaì]`;¶ä >ì†Àu¼éóOøýï‰ÍóMw Ö‚!}Ïv0}:ݰ¼gg ùßžõ÷_Ú³þdÀ Ç@ !d€¢@!%B (BÈE €B(z ˆÒ©šššôôt®£ }…!¤SEEEýw¡òHôK`B h€B(J„2@Q „Š!„ Pÿ¢Â ñ¼ÿ•ëIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1HasTitleSingular__inherit__graph.png0000644000175000017500000001421312234777145032776 0ustar00murraycmurrayc00000000000000‰PNG  IHDRuâ’bKGDÿÿÿ ½§“@IDATxœíyXÇÿÇg“( —‚J­(*(*´*È¡!\UDQÄ P(¢x<òµ BÁ£r(^}<Ðö±âm± Ê¡x w@Ðh’ýý±í6 !$,!óúk²ÇÌ{ö“wvfvv‚ ( H!-‘K s I€Î@$:‘èD(D è-‚-"5˜Læ¹sçˆVÑ-äÞ9&“9fÌ¢U@z‹¼xc 8g̘1vvvD«€ô–Û·o-¡À~" Ð9ˆ$@ç@ ’Ht" Šâœööö#GްX¬Y³f±X¬}ûö544`»ìííKJJ¤XVÇ {Z„}gÛÛÛ777±8a¸\nJJŠ——×ìÙ³]]]Ê‹‹|>¿ÓÜ$@êP.£Ò_EÑA¢¢¢ttt8Nnnn```ZZÚ AƒˆV× ¹¹¹XbÁ‚066(++oݺUEE¥GYÅÅÅ…„„´¶¶Þ¾}{ãÆYYY’åÁQç\»v­ªªêôéÓT*@§Óׯ_¿|ùr2™L´´Î¡ÑhxZYYÿ8kÖ,,aooŸ““óÕW_}1«_ý5<<üÛo¿Ðéô~øÁÅÅ…J¥"‚ç‘…h­]¿~ûºo¤Ñh$Ò¿ÕçóùGe±XÎÎÎÑÑÑ---Øv{{û[·n¹¹¹Í›7/99ùæÍ›L&sþüù øׯ_N>|øÐ*¶±¼¼<88ØÉÉÉÁÁÁ××ð÷ìÙ³ÀÀÀ9sæxxx\¾|YLE°ö•½½=ÀÅÅE¸­…¢hzzº§§§““ÓöíÛqý ¥¶¶¶ÓŠã­5{{ûßÿÝÍÍÍÉÉ);;Àãñ\]]™LæåË—gÏžµÇ„x"½®jgooÿèÑ#ww÷«W¯Š©šÜ¡÷œòòr&“)þ6›}ëÖ­¨¨(UUÕØØØ˜˜˜;wb»nܸqôèÑÂÂÂÈÈÈÉ“';v K»ººêèèlݺÕ€'6lèXÄŽ;,--7oÞ¬¤¤tï޽ݻwÛÚÚR(”;vØÙÙíܹ³¨¨(22rÊ”)êêêb¤æååu¼çäää\¹r%""‚N§ÇÇÇÇÆÆnß¾àîî~ðàÁ‡N™2e„ šššæ™“““œœüøñ㨨(GGdzgÏÞ»woß¾}ƒŽåóù⯞˜Ú’““ÃÃÃGõÅLä…pN{{»ð— ûÍäææâ ¡«W¯úøø˜››Ö®]ëëëÛÞÞŽuX,–ššÚ´iÓxº¥¥EGGoó7~MMMEJ¿½½ýÚµk‹/611¬[·ÎÏÏªÀÍÍí›o¾‘ Rý…pަ¦æ›7oðY¡¹¹¹\.Wä.TWW§««‹¥±D}}½@YYü3)[8ÝSZ[[ÓÓÓŸ]KKK¸^ÂWCXªµ 6L‚õs¢Ÿ3uêÔ .ì#Fë8Šª­­]UU…¥«««]5l$fíÚµUUUgΜ‰‰‰Á·Oš4‰ÍfGEEijj®_¿.ïšššÑÑÑyyyyyy·nÝÊÍÍž¾>>>ùùùø1þþþ\.ïáˆühjjb€_ lÉ—úúúnÖ®cæ…pÎ’%K8NXXXII ‡Ãùí·ßNž<)rŒƒƒCjjê³gÏ*++:dcc#<À%†ëׯc_2<Ñ|>ßÜÜœÁ`¼zõj÷îÝ€÷ïß–/_þóÏ?:ÔÔÔEÑÁƒw§\ì\aýG-))yûöíþýûñŽÖŒ3 8ÎË—/>ŒiŸùÌ™3SSSËÊÊ^½z……`ß~v÷îÝööö´´´nÖn ¢ÎÁ:ͪªª›7oööö¾zõ*Ö{ÆÓÓsÚ´i«W¯VWW éfæ»wï~òä‰p¢+6nܘ½hѢ̙3gâĉ۶mlÞ¼ùáÇžžžIII[·niGuÊØ±cýüü„¿š^^^666+V¬¨««Û±c¶}åÊ•vvv±±±[¶lùüù3öµÏâÅ‹ÇæèèÀúúAAAGõôôìØoéªvDÞ×[C$22¾Ÿ#;^¾|¹lÙ²œœœîXº7lß¾][[[^ÞoSˆ{¤§,]º4))©½½½±±ñرc–––²¶Üé„ÈÈÈ’’&“éííýáÇM›6­¨ß¡£Òž2bÄˆØØX¢Uôkà=‘èD s I€Î@$a Œ-ArøEEŸ¦MS&õîG¬®Ž_RòÉÊŠª¬,¯S]êëëµµµ‰VÑ]“P¢%H™¬¦ªj­¬lþþýýÖÖüÞg¨­½˜DÒÚúíí¡(¯÷ö=r´:®Ü;Gihh=xðú©Swy<…Bzø0R[[µ÷Ù¦§çoÚÄÑÒ¢…†Îc±&Q(°5.+ sú”úú÷11W32î“ɤOŸxd2ÉÍmbl¬‡T2ÿô‰giÙÔÔŽ ‰„hi©;xzN&“¡¤tNñþýÇŸ~ºqôè¯|¾àóç¿_±DäÖ­-¦¦_K«”ýû¯:tÇH$`` :ÏÑñ[ùmÖöO sd—ËKI¹w³­Ëç ðíd2iÒ¤‘™™R,«¡¡uüøHÌ9$‚¢¨……^D„“­í€zŸ™Xà}\†ðx‚´´{“&íØ³çrKËaÛø|4 ÀNº%jiÑœÇôïš>Š¢àéÓëÈ¢E‡=z#ÝxÏ‘wî”DFf—•Õýóå@ «KÏÏz'äÏ?_ÏŸ Ó]d2I ¸¸ŒßºÕQOOÜ"!/ï9²‚L&½~݈ H§?M$ÉßßN}wKËáß~;œÔÙã!>_€ ¤ÒÒZeån½v tެ°µ5¹reƒººJ§CÃJJƒ¼¼¬eTtPÐ÷(*è¸L&ÙÚ_¼¸VCcˆŒŠV sdˆ™™Î¥Kë‡U1…B^²ÄfÈ%•ëà`¡£CK#‘¹s¿IMõ‡7©#[ 4]\Æ€›G ,[6]v…’ɤåËg7Ø4ˆøðà¤7@çÈ–#Gòn…†Î76J¡ yöl C¶tooëÁƒÿž”ˆ ˆ¿ÿ [[#w÷#EEoeZ®â#C22ò££sÃÂæ¯^mŸ•4z´…Bâñø~~2¼á`¨ªRÝܬ°‡¡AAßGF:''/37×õôL|ñBt©4ˆ$ ÙpñâŸ ÆÆ;/â[Z[?.\7}úÞ¾PZZ£§·!!á¾¥¹ùÃìÙÿ³¶ÞYSó®o4 `àó™pûö3ŸkÒ¾}nÂÓ^¸\^qq•¥åð¾‘qÿþ‹É“G oápZ]\â "ge­¡ÓáŸçHtŽô)(¨ððHœ5kôáËûál˪ªwÎÎ? ªzöìjÙï x s¤LqqÕÂ…ñVV†ÇûõÛ¬/ê]\~23ÓIMõWRo7ö=ýîQ®yýšãíý³™™NròÒ~kÀȑڧN­(,|pRxz(¤û@çHÚÚDmmÚ©S+úÿÓÆqã†?¾üöígÁÁg`»C s¤Ã»wížž‰d2)==@MúåúS§'%ùdg?ŒˆÈ&Z‹üA?¤§´µq½¼’Û23× &Oë/ >\sïÞËd2ÉÚÚˆh9òìö–OŸx¾¾Ç**²²ÖèêÒ‰–Óc-²jiù¸m[¦ŠÊà+f-Gn€Îé<ž àTaá+6{µ_Šîc|}m[£¢.hk«º¸Œ'ZŽ|#9(ŠnÚt&/ïijªŸ=Ü”ÁÁsZ[¹ëÖ¥ÓhÔ™3G-G€#’óã9YY“’|lmMˆÖ"~üÑiÑ"+ÿùùωÖ"@çHH|üÍãÇ‹õœ=Û‚h-ÒA˜Ö÷ßöñIùë/¸\Á€Î‘„ÔÔß÷ì¹¼s§+“iE´iB&“oàíýsyyÑrú5Ð9=æÂ…?ÃÂί_?Ë×wÑZ¤Ï Aääd_CÝÝýHeeÑrú/pÞZϸy³xÙ²c¾¾¶Û·»­E†46¶-\ÿù3?''H*+÷< sz@~þs/¯$ggËØX¿dfMM³³óOªªÔ¬¬5jjÊDËéw@çt—Ç+™ÌÃÖÖF))¾ýy6§yù²ÁÅå§áõΜ PQéï3ñúØÏéååu^^IzII> b€¡¡VFƪ²²ÚU«NákaC0 s¾Lee“‡Ç==õ'–S©ƒˆ–Ó§˜›ë¤¥ùß½[¶~}º@›'ÿóêëß»»2D)=}¥ªª|L‚–.&?îwùò_áá™DkéG@爣¥åƒ§g"Çg³W)òº˜Ó¦JHXœšz/&æ*ÑZú ð-ƒ.áry>>)••™™k ¢åŒ‰É0--Õèè\¥‰G-‡xàŒÏÎáñþþ'ŠŠª²² µˆ–Ó/X²dJss{tt.®ìé)«E±åèœNÐõëÓïÞ-c³W™›ë-§4³¹ùÖ-çh4ê‚㈖C$Ð9žyéÒ£S§–O˜`H´–~ǶmŽÍÍÖ¬ISU¥ÚÙ™-‡0à(û÷_;uê÷ƒ=§O7%ZKA½{™sçŽõó;^PPA´€Îù‰‰·÷ïÿe×®EðÕH1ɤ¸8o£Å‹“‹‹«ˆ–C pöÍ¿ddäoÚtvË–¹ëÖÍ"Z‹ðáÃ'OϤW¯8. ®I´œ¾:ço.]z´jÕ©•+íÂíEnhiùÈdÆ·¶r³³ƒäkÑŸÞÀ? ¨»¹MŒ‰a øIÐÒ¥¡¡ÕÕU—x‡ÎT¸»÷ßÔû?ØïÆ©±Ù«g‰wEwNii«kü¸qú'N,WœIÐR§¤¤fáÂø1côÒÒVàÿ7°QèŸØ×¯9‰&&Ãç•ajúuZšaá«€€S ²Ä»â:[@]SS>PïÿXZ?vÌ//ïé¦M ±Ä»‚:çÝ»v/¯D ÉÈ›Ôû?¶¶&II>YYü1‡h-2GÓÖÆ]¼øçÆÆöÓ§Wjiш–3 ˜=Û"6Öóøñßâão­E¶üg„ÀÍÍ@)}Ÿ”•ièë¿2äÑZ:ÁÆÆfãÆ½Éð8VVª"ÐÓ{O¬ é"—ÿ ƒœ?ÞÚÚšÁ`ô¹ª>…LFÍÌ8D«èœüüüÞgBxŒåÐY\D7lØÀb±úJDiÝ.`¥KǸ(b?é=Ð9ˆ$@ç@ ’Ht" ’8§¥¥eÓ¦MúúúJJJúúú~~~oß¾Åv!òàÁ)êC„PVV¶±±Ÿ7ðx<Az/O$iåÜGœ®ŠèôŠ—ôEÁ[¶lQQQill”@|§ôØ9`Þ¼y÷ïß?þ|eeå¥K—¨Tê”)S¸\®´4‰——×ÔÔÔÔÔTZZ:nܸ… òx¼^æI&“SSSUU¥ÿÿ²ËYºôq›þÔÒÒReuJ\\ÜíÛ·54¤¶n^'„Ÿ8qâùóçåååC† hkk>|x×®]Ьæ–Óh4: Óé»víJLL¬¨¨01‘ä¯9©¯¯×ÒÒBä‡~¶Ò¿‹QÎÒ¥ãˆEh_òñãÇ‘#GJ1ÃßsNŸ>ˆ]n:N&ÿ;KŸÇã…‡‡ëëëkiiyyyq8?°GäÌ™3 CUU5,,,##CWWWMM-88? --M8!V …BAQtïÞ½#FŒÐÐÐpssËÀ(,,œ9s¦†††²²²……ÅÙ³g±<ÚÚÚXKkˆ‘š››Ë`0444âãã±666***†††)))ØÆóçÏýõךšš‡ÂÏÅ‹ÈÊÊ1bNg±X""‰…Ø8bt&Œ¬¬,CCC:Îd2ëêþýßEñqÇK‰p軪TA…°ÙlT,êêê/^ìj/   `Ïž=FFFùùù%%%ß}÷‹‹ ¾×Ñѱ¡¡áüùó€¹sçâéçÏŸ£(šššúâÅ á–!vzKKË–-[&OžŒ¢h\\œ±±ñ½{÷ÊËË™L¦°SSÓ€€€ŠŠŠššš””%%%.—‹í­¯¯Ç¬¯¯#ÕÁÁ¡¶¶633“B¡|üøEÑ‘#G†„„TWWgff’H¤šš€««kcc#›ÍÆÃK˜™™åççO:ÕÙÙYüµEQ”Édâu‘˜~G‘œ±´˜0M˜0áÑ£G?¶¶¶ž;w.~¢ø¸ã鎱ÃÒU¥ÄÓ1.=v…B¹{÷®ð)MMMxLLLNž<‰ðäÉ@ss3¶7//EQ>Ÿ/’Æ«-‚ˆÏÉdò;wP=zôéÓ§±cÞ¾}K&“ÛÚÚpïÞ½ãñxØÞ’’᯲ˆsÄHÍÎÎÆåagihh8p;¸©© ënýñÇ"‡ 'Nœ8_XXˆg.†>sNÇQ¸ ü1aÂòDQô?þ`=û‚‚ñqÇ‹è;<ÑU¥ÄÓ1.=n­éêê––– _h|@çÍ›7FFFXKTVVbi4€D"‰¤Å€w(kkk£¢¢.\ØÚÚZQQáíí Ñèééñù|¼À»wïÂÃçOŸ®««ëïï/&s1RõôôDä%$$ìÝ»×ÀÀ`éÒ¥ÅÅÅXÛXÙU-ðÌMMM…3'œ¾cGĄɨØK˜™™ª««±âãŽÓ1vÝ©Tèqmœœ07ètúÇEŽa0/^¼ÀÒXBWWòÕ™±%N:thpp0‡Ã)++ÓÕÕÍÉÉÁÜ/šššF…Ÿ2}úô/^ÄÄļ|ùò—_~“¹©Á™3gΫW¯Î;§££cgg‡}Õį•óüùs,QVVzw¤KßDZ#bÂT^^Ž%JJJÑ××Ç>Š;Ž˜ H«R=vNDDDuuµ££ãƒª««³²²¢¢¢DŽñññÙ¹sgAAAiiiPP££c7ÇRÒÒÒ***„"P©TA—,YþàÁƒòòr{{{áÃ>þ libglom-1.22: Namespace Members
         
        • GLOM_IMAGE_FORMAT : Glom
        • GLOM_IMAGE_FORMAT_MIME_TYPE : Glom
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutGroup.html0000644000175000017500000024432512234777147027040 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutGroup Class Reference
        Inheritance diagram for Glom::LayoutGroup:
        Collaboration diagram for Glom::LayoutGroup:

        Public Types

        typedef std::vector< sharedptr
        < LayoutItem > > 
        type_list_items
         
        typedef std::vector< sharedptr
        < const LayoutItem > > 
        type_list_const_items
         

        Public Member Functions

         LayoutGroup ()
         
         LayoutGroup (const LayoutGroup& src)
         
        LayoutGroupoperator= (const LayoutGroup& src)
         
        virtual ~LayoutGroup ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        bool has_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Discover whether the layout group contains the specified field (from the current table). More...
         
        bool has_any_fields () const
         Discover whether the layout group contains any fields. More...
         
        void add_item (const sharedptr< LayoutItem >& item)
         Add the item to the end of the list. More...
         
        void add_item (const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)
         Add the item after the specified existing item. More...
         
        void remove_item (const sharedptr< LayoutItem >& item)
         Remove a layout item from the group. More...
         
        void remove_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Remove any instance of the field from the layout. More...
         
        virtual void change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void change_related_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void remove_relationship (const sharedptr< const Relationship >& relationship)
         Remove any use of the relationship from the layout. More...
         
        void remove_all_items ()
         
        double get_border_width () const
         
        void set_border_width (double border_width)
         
        guint get_items_count () const
         
        guint get_columns_count () const
         
        void set_columns_count (guint columns_count)
         
        type_list_items get_items ()
         
        type_list_const_items get_items () const
         
        type_list_const_items get_items_recursive () const
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_items get_items_recursive ()
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_const_items get_items_recursive_with_groups () const
         Get the items recursively, depth-first, also returning the groups. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Public Attributes

        type_list_items m_list_items
         

        Additional Inherited Members

        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Member Typedef Documentation

        Constructor & Destructor Documentation

        Glom::LayoutGroup::LayoutGroup ( )
        Glom::LayoutGroup::LayoutGroup ( const LayoutGroup src)
        virtual Glom::LayoutGroup::~LayoutGroup ( )
        virtual

        Member Function Documentation

        void Glom::LayoutGroup::add_item ( const sharedptr< LayoutItem >&  item)

        Add the item to the end of the list.

        Parameters
        itemThe item to add.
        void Glom::LayoutGroup::add_item ( const sharedptr< LayoutItem >&  item,
        const sharedptr< const LayoutItem >&  position 
        )

        Add the item after the specified existing item.

        Parameters
        itemThe item to add.
        positionThe item after which the item should be added.
        virtual void Glom::LayoutGroup::change_field_item_name ( const Glib::ustring table_name,
        const Glib::ustring field_name,
        const Glib::ustring field_name_new 
        )
        virtual
        virtual void Glom::LayoutGroup::change_related_field_item_name ( const Glib::ustring table_name,
        const Glib::ustring field_name,
        const Glib::ustring field_name_new 
        )
        virtual
        virtual LayoutItem* Glom::LayoutGroup::clone ( ) const
        virtual
        double Glom::LayoutGroup::get_border_width ( ) const
        guint Glom::LayoutGroup::get_columns_count ( ) const
        type_list_items Glom::LayoutGroup::get_items ( )
        type_list_const_items Glom::LayoutGroup::get_items ( ) const
        guint Glom::LayoutGroup::get_items_count ( ) const
        type_list_const_items Glom::LayoutGroup::get_items_recursive ( ) const

        Get the items recursively, depth-first, not returning any groups.

        type_list_items Glom::LayoutGroup::get_items_recursive ( )

        Get the items recursively, depth-first, not returning any groups.

        type_list_const_items Glom::LayoutGroup::get_items_recursive_with_groups ( ) const

        Get the items recursively, depth-first, also returning the groups.

        This is only used by the tests so far.

        virtual Glib::ustring Glom::LayoutGroup::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutItem.

        Reimplemented in Glom::LayoutItem_GroupBy, Glom::LayoutItem_Footer, Glom::LayoutItem_Header, Glom::LayoutItem_VerticalGroup, and Glom::LayoutItem_Summary.

        bool Glom::LayoutGroup::has_any_fields ( ) const

        Discover whether the layout group contains any fields.

        Returns
        True if the field is in the layout group (or its child groups).
        bool Glom::LayoutGroup::has_field ( const Glib::ustring parent_table_name,
        const Glib::ustring table_name,
        const Glib::ustring field_name 
        ) const

        Discover whether the layout group contains the specified field (from the current table).

        Parameters
        parent_table_nameThe table to which this layout belongs.
        table_nameThe table to which the field, specified by field_name, belongs.
        field_nameThe name of the field to search for.
        Returns
        True if the field is in the layout group (or its child groups).
        LayoutGroup& Glom::LayoutGroup::operator= ( const LayoutGroup src)
        void Glom::LayoutGroup::remove_all_items ( )
        void Glom::LayoutGroup::remove_field ( const Glib::ustring parent_table_name,
        const Glib::ustring table_name,
        const Glib::ustring field_name 
        )

        Remove any instance of the field from the layout.

        Parameters
        parent_table_nameThe table to which this layout belongs.
        table_nameThe table to which the field, specified by field_name, belongs.
        field_nameThe name of the field to remove.
        void Glom::LayoutGroup::remove_item ( const sharedptr< LayoutItem >&  item)

        Remove a layout item from the group.

        Parameters
        itemThe item to remove.
        virtual void Glom::LayoutGroup::remove_relationship ( const sharedptr< const Relationship >&  relationship)
        virtual

        Remove any use of the relationship from the layout.

        void Glom::LayoutGroup::set_border_width ( double  border_width)
        void Glom::LayoutGroup::set_columns_count ( guint  columns_count)

        Member Data Documentation

        type_list_items Glom::LayoutGroup::m_list_items

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutgroup.h
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1Document__XML-members.html0000644000175000017500000005145412234777147031770 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        GlomBakery::Document_XML Member List

        This is the complete list of members for GlomBakery::Document_XML, including all inherited members.

        add_indenting_white_space_to_node(xmlpp::Node* node=0, const Glib::ustring& start_indent=Glib::ustring())GlomBakery::Document_XMLprotected
        Document()GlomBakery::Document
        Document_XML()GlomBakery::Document_XML
        get_contents() const GlomBakery::Document
        get_dtd_name() const GlomBakery::Document_XML
        get_dtd_root_node_name() const GlomBakery::Document_XML
        get_file_extension() const GlomBakery::Document
        get_file_uri() const GlomBakery::Document
        get_file_uri_with_extension(const Glib::ustring& uri)GlomBakery::Document
        get_is_new() const GlomBakery::Document
        get_modified() const GlomBakery::Document
        get_name() const GlomBakery::Documentvirtual
        get_node_document() const GlomBakery::Document_XMLprotected
        get_node_document()GlomBakery::Document_XMLprotected
        get_read_only() const GlomBakery::Document
        get_view()GlomBakery::Document
        get_xml() const GlomBakery::Document_XML
        load(int& failure_code)GlomBakery::Document
        load_after(int& failure_code)GlomBakery::Document_XMLvirtual
        LOAD_FAILURE_CODE_LAST enum valueGlomBakery::Document
        LOAD_FAILURE_CODE_NONE enum valueGlomBakery::Document
        LOAD_FAILURE_CODE_NOT_FOUND enum valueGlomBakery::Document
        load_from_data(const guchar* data, std::size_t length, int& failure_code)GlomBakery::Document
        LoadFailureCodes enum nameGlomBakery::Document
        m_bIsNewGlomBakery::Documentprotected
        m_bModifiedGlomBakery::Documentprotected
        m_bReadOnlyGlomBakery::Documentprotected
        m_DOM_ParserGlomBakery::Document_XMLprotected
        m_file_extensionGlomBakery::Documentprotected
        m_file_uriGlomBakery::Documentprotected
        m_pDOM_DocumentGlomBakery::Document_XMLprotected
        m_pViewGlomBakery::Documentprotected
        m_root_xmlnsGlomBakery::Document_XMLprotected
        m_strContentsGlomBakery::Documentprotected
        m_strDTD_NameGlomBakery::Document_XMLprotected
        m_strRootNodeNameGlomBakery::Document_XMLprotected
        m_write_formattedGlomBakery::Document_XMLprotected
        read_from_disk(int& failure_code)GlomBakery::Documentprotected
        save()GlomBakery::Document
        save_before()GlomBakery::Document_XMLvirtual
        set_dtd_name(const std::string& strVal)GlomBakery::Document_XML
        set_dtd_root_node_name(const Glib::ustring& strVal, const Glib::ustring& xmlns=Glib::ustring())GlomBakery::Document_XML
        set_file_extension(const Glib::ustring& strVal)GlomBakery::Document
        set_file_uri(const Glib::ustring& file_uri, bool bEnforceFileExtension=false)GlomBakery::Documentvirtual
        set_is_new(bool bVal)GlomBakery::Document
        set_modified(bool bVal=true)GlomBakery::Documentvirtual
        set_read_only(bool bVal)GlomBakery::Document
        set_view(ViewBase* pView)GlomBakery::Document
        signal_forget()GlomBakery::Document
        signal_forget_GlomBakery::Documentprotected
        signal_modified()GlomBakery::Document
        signal_modified_GlomBakery::Documentprotected
        type_base typedefGlomBakery::Document_XMLprotected
        type_signal_forget typedefGlomBakery::Document
        type_signal_modified typedefGlomBakery::Document
        Util_DOM_Write(Glib::ustring& refstrXML) const GlomBakery::Document_XMLprotected
        util_file_uri_get_name(const Glib::ustring& file_uri, const Glib::ustring& file_extension)GlomBakery::Documentstatic
        write_to_disk()GlomBakery::Documentprotected
        ~Document()GlomBakery::Documentvirtual
        ~Document_XML()GlomBakery::Document_XMLvirtual
        glom-1.22.4/docs/libglom_reference/html/namespacemembers.html0000644000175000017500000004703212234777147025544 0ustar00murraycmurrayc00000000000000 libglom-1.22: Namespace Members
        Here is a list of all namespace members with links to the namespace documentation for each member:

        - a -

        - b -

        - c -

        - d -

        - e -

        - f -

        - g -

        - i -

        - l -

        - p -

        - q -

        - r -

        - s -

        - t -

        - v -

        - w -

        • write_pot_file() : Glom
        • write_translations_to_po_file() : Glom
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Footer__coll__graph.png0000644000175000017500000005143312234777146032622 0ustar00murraycmurrayc00000000000000‰PNG  IHDRij>ð1bKGDÿÿÿ ½§“ IDATxœìÝy\gþðgG@Äp‰„Að¦-]]ŠPñXÜ¢àÊU¬G¥õ¨«ÕÚ-hÑzËVWÛjÝVŃ£€"íÔµ¥x µxËír@®œóûcjš†&™dò}¿úÇ0yòÌwütŽ'O0Ç€¡1 º S „)ÂHa $0¤º êëë‹ŠŠ¨® „­­íäÉ“©®(‚00iÒ$ªKÐwUUUT—”ƒ00räHªKÐw T—”ƒ{¦@S „)ÂHa $€0ÔÀ0¬±±QÅÆo½õVpp°üšü‘Éd>þ\ ¥õj@5}a t@HHHVVVWW—lÍÅ‹çÍ›7|øp «@„)P/RÎææÏŸodd”-[sñâÅÀÀ@ÍW@o L™x<Þ´iÓÌÌÌœœœN:…aBÈÖÖ¶±±Q lÚ´ÉÎÎÎÖÖö‹/¾½ðøøxù…žŒRSS‰ïÝ»W]]½hÑ"Ç£££­¬¬‚‚‚šššBR©4::ÚÅÅeذažžž7oÞ$:—U"‹£¢¢mllˆwmrss¹\îéÓ§{ÛÁôôt'''‹X___XX8gÎ+++SSS77·óçÏ+=Jëì äë6ÔÕÕåääôÛl̘1555iiiµµµ¡††Ç£¢¢¸\îõë׋‹‹g̘![WQQ!¿ Tvvöðáû»»qß½{÷‚ p?zô¨««k^^^YY™ŸŸ_`` ŽãŸ}ö™££cnnnuuuTT”µµµH$Âq\¶Å¸¸¸äççÏž=; €ØBÈËËëúõëJk@M™2åîÝ»÷ïß÷ôô\°`Áøñã×®][YYY[[{êÔ)@Ðó8DEEõ¬SÞõë×CBB&L˜Ðï~ðàÁƒúm4¨DÅ0µ²²:rä±ÌçóÅb±,œcbbˆ—îÞ½+[¯"‘Hdmm}ñâEÇÿò—¿]Mš4)!!hP]]Í`0:::&NœHœ â8.•Jù|¾T*ÅåÂtìØ±çÎ#%–;;;BYYY‘‘‘Ó§O···—?ÝV8Jë¼té’­­í† >|¨úA€0ÕZpÏÉ××÷ñãÇ)))ööö3gά®®–½ÄápJJJˆå²²²Atòí·ß¦¦¦Îœ9ÓÊÊ !Äf³322ˆ?eâ$tܸql6»²²Rö®––‰D"߇騨 –‰6›Müh`ÐÏ¿YåÅÅņ-]º´¢¢âàÁƒ=º|ùroÇÇñžur8Ë—/geeñùüA ](‹q ST<3urrÚ´iSMMMjjª¡¡!ñô¼¤¤Çñ]»v=úÆ%%%óæÍC¼gŠã¸X,¶³³³²²úú믉5»vírssãñx¥¥¥ï¼óŽ»»;Žã{÷î3fÌõë×kjj<8lذçÏŸã8.«dÏž=cÇŽýé§Ÿˆ{¦~~~Do!×G¡×^{íÞ½{Ä=Óàà`{{ûC‡555#a‹‹‹{‡7ö¬“P^^þÁ888¬ZµêçŸî÷Ù©Ö‚0*Q1L¯^½êææÆd2]\\q÷ñña2™MMM`óæÍÄÓüØØXY˜"„âââäú°~ýzƒQ__Oü( ###9޹¹ùüùóËËˉ•Û·oçr¹fff²²e•…ˆˆ++«ÐÐPÙÝUÂ4!!ÁÁÁÁÒÒréÒ¥|>?33ÓÉÉÉÄÄÄËË+++kþüùÄC$…ã ´Ny'Nœ˜1cF¿GÂTka8ŽStN t 1ÓþÌ™3©.Dßýúë¯!˜i_ Á=S E.]º„)¥W5]3í-âëëKù¥’6Ôtœ™ L€¦@S ¥”>*(( ¥óuëÖa–™™©°E¢7ô„)ÐRüB999Äò«¯¾:ôž%IZZÚèÑ£SRR†Þxš´‹Å’-›››Ëÿ8D?üðƒP( ÷ŠD¢ .„„„˜ššúúúʦsîéСCIII©©©·nݪ««{çwBG=~üø™3gJKKçÎëïï/Ÿžùùù®®®ûöí«¯¯ôÞ]EñÇYŽPñ³ùê€þü‘y„ÐÙ³g‰åÂÂBôb6ReeeYYY3‡ÆÅÅYXXNËoˆXP:íio“¥Ê<~üxëÖ­gÙ²e}Oè78ðÙ|­g¦@÷¸¸¸ ãÇGUUU©þÞäääææfccc Ö-[ÖÖÖÖÛ•þÓ§Oe"ªªª=zDl!„a‹Å"¾E†Ëåîß¿¿¬¬lîܹkÖ¬ñððàÎ]a tOyy9±PZZŠäf#í—P(ÌÈȈ• ˜7o^oÏô•N{Úïd©„âââ[·nµµµÍ™3Gåݺ Âèž½{÷òx¼‡®_¿ÞÏÏÅbÅÇÇËg\o.]º$‹—,YÂz!88833S(öl¼bÅŠ={öðx¼’’’ 6zûí·wîÜyãÆÚÚÚC‡q8ù/ ñññÞÞÞááážžžEEEû÷ï'sÏ6£ú>Ð ZuÏôÀ®®®K–,!æ6E*Ì…ŠãxXXXhh¨üšÆÆFCCÃÌÌL¼Ç=S¥Óžö6Y*!===,,,//„ÝîÜ3ÕZ0Ÿ)P‰öÌgŠaÇ›:uªÂÊÔÔÔ%K–PU•ÆÀ|¦Z .ó•Èš<ÔÅÅÅÇLJônP| Pi“‡*m¯ð }0')Ð<83@˜ L€¦@S DÕ%šƒ§ù`tt2$Ç÷\Þ³Ãw‡êoÉ*ÊzÅá‡ê«jp`V­a  ¨¨ˆê£ ¦àLþ™8þÃSõR¬±¦qFÊŒˆiÞoµÖ6¶¶¶T—”€O@ú›ypfnInATÁ”ÑST|K—¨‹µ‘%”7ÌÚp(象±Z+4÷LÍÝyr'·$ðk%×T—©‘©—‹†°ã?ŸºojEC…ú*ôa hnÏ·{ 1 ûþá÷zã·††©ä᳇·O<Pý@õ÷º;º³ÌþøJTá)¼”—w½|÷é]’«´a h«¦µæì­³²¦† ÃÜ’\Õßn€Ì8×ñLj‘Dô´éé_÷ýõóï?'¹V û Lmýá(Žþ¬‚ãø€Â!4wò\…á.b©X$}üÿ—þ--ä h†Fzjíjuø—C‡ C~¥¥™eÓgM _ׇò†r×m®J_2dr­¸×_tspj­€àÌÐÓÉk'"ÂJ~'¿¸®XõN\l]XÊ?…ãxece|~üàKôa hH(¼|PŒ‹Ö3 mŠZøÊB#†‘ÂJC†¡³ó­È[ÑK¢‡T( S@C ·Û‘²;X¹Å»m:gÒ±ôPf00„m™»åÞÎ{žc<‡X' øl> Ç?½ô©Ò—$RINq΀zûÛ„¿a#d1ŒFYŒz.xî3ÎÇÔÈ”„ZÀ™) ›ìÙ¿Õþ†a˜‰¡IÏ+ôšÖšÇMUïeÆrsp#¾ïÍ×Þ¼·óžïdß•gVÖ?×É ´€úÀÓ|@7O›Ÿþúì×Ú¶Ú*~U][ÝÅ‹ݢn aÍÍÄ{ìªØeÓ–©ÞadZdÌ͘˜1‹^Y„jélyiçKS¦^xöè S@s3ÎxÉá¥caÇp¯k««m«Îîbë¢zeõe–f–ÖæÖ²5W~½âû¹o|x|Økaj(è$¸Ì4W×V7røH„†a£FŒrwtP’"„\GºÊ')BhÞäy«¼W­ÿf}¿ŠÌZ.ƒ04WßV?Òb$éÝ><Âtγ«àÚ L Ä‚–®; ;Ò{¶0µ8½òôÕ‡WcnÄÞ9ÐE¦€Îž7à8N\æ“nö„ÙÿœõÏMÉ›ÊÊÕÑ?Ð-¦€ÎˆLê¸Ì'D/‰v`9¬<½r@3¥Z‚0tVßV²Nþe>ÁÌØìܪsyyG8ª¦M]a 謮­ŽiÄ´0µPß&<Çxþkþ¿"Ó"}ö«ú¶´„) ³úçõjºa*oç¢ãìÆ­8½B65ÐC¦€ÎêŸ×«ãQ¾C“s«Îݯ¾ðòAuo h-S@gumuê{ú$ÏÝÑ=ê¨]ßîºWuO›ZÂÐY}›&ÎL [ÿ¾ÕÝÑ}ùéåB±P3[ZÂЙfî™ Ï­:WR[²û»ÝšÙ"Ð*¦€ÎdÌ׌ £&ì]¼÷ßÙÿ¾]y[cZÂÐŽã Ï4sÏTfÓœMÞ®Þ+N¯èuir»€r¦€¶ø|‘D¤±{¦ÌàÌÛgžµ<ûøÂÇšÜ. „) ­º¶:„&/ó Î6Ο~úùÕÏ,þQÛ‚0´E|0_Ãg¦„5>kæOžÿö™·Ÿw?×üÖ% Lm5¶7b¦0¯³f`vjÅ©¶î¶S>ÔüÖ% Lm5µ7Y0- ¨ù ^6‹ýYÈg'®ÈºŸEI@à Lm5w4SrZ*³lÚ²À)ïÆ¾ÛÜÑLa@3 Lm5w4[ ³¢¶†ÿ¾õ_‰T²1q#µe €0´¥ ajcnóõ²¯n'¤¤P[ P7S@[ÍÍÖè¼Ì'ø»û¿åùÖ{ ïCµ]A˜ÚÒ†3S±°c¦Æ¦«cWS]P#S@[MMZ¦#LGĬˆùöÞ·±y±T×ÔÂЖöœ™"„æNšûîôw7&n|Òü„êZ€Z@˜ÚÒª0E>l;Ü6ül8ŽãT×Èa è©SØÙ-êÖ†P2ÃL†}ûlNqÎ××¾¦º@>S@OÄ8y­:3Ey»zoüÛÆS>,­/¥º@2S@OMíMHûÂ!tàœ¬Vž^)‘J¨® ÂÐqfJíÇI•214‰ å=â}võ3ªkd‚0ôÔÜÙŒa˜¥™%Õ…(ñî_"|#>¾ðñƒêT×Ha è©©½i„醃êB”ûdÑ'nnËO/IDT×Èa èIÛÆE)040Œ]û°æá¬T×Èa è‰ßÉתqQ=MbOÚá·cÏw{ P] „) §¦vmù,i"DxŽñ\qfE·¨›êZÀPA˜zjéla™±¨®¢˜Á×˾®h¨ˆÎަº0T¦€žÚºÛ,˜}· ¨6Ùar÷•î]ËwQ]ˆziæ÷N!j¾u{Þý|8sx¿Í<==7oÞ¬zôÙ‘#G¨.A L=©¦'88Xõè³”½ø–¸Ìô¤b˜@S@O¦@à L=A˜ ƒ04Ô%êKŦ@“ L =ï~Ž‚0šô§0=þ<ÕÃÑÉôa|_OT…)†aÞ()”þñÀç\@ÉШäädÍ×ÔAOÆ÷õg¦Åçó‰KKËœœwww„Ððáp@I˜Â°;ÚГñ}=ý¦&êÊ ÃlllÔÔ¿æ7ÇbýñÑ[sssùŠàž) !rÏLy<Þ´iÓÌÌÌœœœN:…aBÈÖÖ¶±±Q lÚ´ÉÎÎÎÖÖö‹/¾½ðøøxÙ‚ŸŸ_TTñR}}½‘‘QEEEtt´³³³••UPPPSSBH*•FGG»¸¸ 6ÌÓÓóæÍ›D²Í‰Å⨨(GGG›°°0â]D›ÜÜ\.—{úôi…↲§§;;;³X¬àà`ÙAO¦€†žw?g0ÌŒÍHé-44tÆŒ‡^³fMmm-Bˆ8UÜ»wï… ÒÒÒnÞ¼™žž.{K\\œ···l!$$Döjjjª··wVVVLLLbb"Çëîî^»v-BèèÑ£Ç?sæLiiéܹsýýýÅb1ñ½ÐÄæ:””””ššzëÖ­ºººwÞyG¶ÅmÛ¶}óÍ7o¾ù¦lÍ7BCC}||†¸ûüqRRR^^Þ³gÏÂÃÇØárˆ»¥8 ‹ÀÀÀÀÀ@ª« ÀÉk'-6XôÛLÅãceeuäÈb™Ïç‹Åb„PCCŽãÎÎÎ111ÄKwïÞ•­WÐÚÚÊd2ûí7Ç}||NŸ>=iÒ¤„„âÕêêjƒÑÑÑ1qâÄS§N+¥R)ŸÏ—J¥ø‹0Åq|ìØ±çÎ#¥ún z˜öÛÿPèÉqOa'Ãüù÷ÛLoê”þ%#„RSSUïDOŽó`.óÖ¯_?lØ0ù•,KþÆ|â’’’8Îðá÷nÝš˜˜Èf³-,,d—H ôú(C6¶nãÆsæÌ±²²255uss;þ¼¬Á·ß~Ëáp¬¬¬Ž;F¬T3(ë­°°°g'òCü”6 ¤§§;99±X¬ÀÀÀúúzÙzÇ{Ž%TØYÿ½5î÷ˆž`Ê(¥.]º¤ô¦™l ¬Š\\\†>⊆ä“UÅ3SKKËÌÌÌÞ^Eñx¼¸¸¸äççÏž=; @öªŸŸ_cccjj*BhÁ‚²eâJ'..®¢¢B~A¡gù½¼¼®_¿Îår×®][YYY[[{êÔ)@@4˜?~]]]ZZš¡¡!qb̘1555iiiĘA7~üøÞ:!Îûh0eÊ”»wïÞ¿ßÓÓsÁ‚²R=êêêš——WVVæçç'ûŸ3RvfÚGã¾Xô䌠§™g®‹_×o3½=>¦'Çy0ajhhxóæÍ?ºxÏçã/’¢qÄ â1¥ür¿—ð=Ô[×ÒÒ"»…Z\\Œäî[]¸pAÖ?±Ré˜A×G'ÄB d÷¶ˆ›ýÍÍÍDŸJÇ⽄i}Äô丧){¦|”úQ¿Íôöøh˜žçÁ\æ³ÙlÙp"Cå‹úgnnŽ^Œä_bl]KKKTT”›Í^½zµ|…þ{3ØG'ý6puu%&L˜€ª©©!~T:–°·}é£1‰GLO´uµÁe>аÁü›\´hÑñãÇe#àX,ÖÏ?ÿ¬Ð¦q$"2ÅÇǧ¢¢âàÁƒ=º|ù²|…1Ϩ÷1ƒ}tÒoÙÃââb É•Ž%ìm_ÔôÜ¡Q¨b0aº}ûöšš??¿‚‚‚šššôôô]»v)´éw@\ozÐë—H$òðð;vìÇ—/_Ž^\h+¥tÌ`ߣ²úhyÿþý¬[·.((H6q™Ò±„=ý«Ø¨‚ÜO@iƺuë0 ËÌÌ”_)’ c“u€ü5¿êŸÍòäIXX˜¥¥¥™™™ŸŸqî)ÏT•qJ—‘²z=ÛËÿ˜™™éäädbbâåå•••5þü &ô쟨¡ç˜A¢YoȆøõ±•„„KKË¥K—*„žc  “BØoãÞ–{£'÷ªˆ%bì]ì<ï|¿-µçøˆÅb[[ÛÑ£G¿õÖ[òëåÿ]hfl²:hÏqV+˜è„ÎôäXAkg+zeßÏî·¥öŸ+W®Œ1"99Ù‚vB€0Õ!ðÐÍsîM³Ÿœœ°páB±X|åʕޚ)¾­tTbŠÚwÀD'€~tî;KD"Ñ… BBBLMM}}}å?¢@é|¦JgA•½%??ßÕÕuß¾}ò'êa 覽»!dnbNu!ªºzõ*BhΜ9¡Å‹gff ¥-OŸ>½cÇŽ×^{mܸq_|ñEFFF[[Û×_ýÉ'ŸƒövïÞ]VV&ÿYD__ßk×®uttL™2eùòå?ýô“fvJA˜ºéu!„Èšf_’““›››1 [¶lY[[[oWúJ‡o÷; *—ËÝ¿YYÙܹs׬Yãáá¡Î½Ñ_¦€n:…!ScSª Q‰P(ÌÈȈ•ÍŽ6oÞ¼Þ¾ Qéðí~gA%ߺu«­­8¤ƒ0tÓ%ìB™éF˜^ºtI,/Y²„õBpppff¦P(ìÙXéðí>fAE ‚øøxooïððpOOÏ¢¢¢ýû÷kpÿôˆ’¯zÖ5:9iè{z†u‰º cCcª QIrròÂ… ÍÌþ¸)°víÚË—//\¸P¡qDDD{{ûâÅ‹»ººæÍ›wôèQ„ÐG}$–.]ÚØØèææöÝwߟ9&deeeggÿç?ÿñôôÔÌé-%aÚÇÃDÚøï‹ÞzkìðáCýz-WUUÅáp¨®BÓº„]ºrZŠJHHPXcmm-‰ˆeüÅDB²…èèèèèhùöFFF»wïÞ½{·Òþ/^¼xñb2+½P¦!!!š¯C“ ÌììÞݸñÓÎÎ{T×¢vT— iÂN-¼azéÒ¥ ô\ÿñÇïÝ»WóõÒý)Lƒƒƒƒƒƒ©*EcNžÌý䓌3Vfem¦º@¾.‘6ž™úúúÊÎ.-é㨴´ŸBwï>}ö¬…êZùº„]:4. Іޅieeý{OB †Á… Š3èuiáe> =½ Ó‹12b „$éùó<ªËäÓ­P€6ô.L““‹%!ÇKK늋k©® ÎL%ô+L‹Šž=~Ü${ `dĸxñJ+äëv™)Ð<ý´áÂccC¡ð÷9uD"IJ ï_ÿòíùí&@w èTUUå« Q÷Ë’„BÆ )Mÿ=êÉxgzþò”Âq<%…'KRBu5¿°ð髯r©ª ®KÔe;ÜVÅÆùùùÔ¬žÌAç7¢âzt¨×iLi@Æ;ëQ˜<ª¯oSXidÄÈȸaJ'ª3ím>Í)ý ýü>’ 'ùÜ@q1`hôèžiFÆccÅÿyˆD’´´‰DJII@º„ºðJØŒ®-Bï!©!„ìçS¾~† IDAT]*} S±Xšžþ³Â5>¡¹¹#?¿Bó%5évjû ýgYèÛ±èÙ%D< 5sDÃák½už¾„éÍ›¥­­ÝJ_22bÀè}:Ñêq¦Rúy#úÑ Z‘T„B˜rPœ è"} ÓÌÌB„¡!£çb±ôÿþï®H¤d>] ‹´wœéót鯨ä8B8B²¿71\ãÓƒ¾<€òñ'ÿ”é£Î/]:í•WekÚÛ»--‡QQ ™vNt‚Š?G¿|„Žp…ÿm3Ý,jJ¤Ò—0õ÷UþÇ>:?}ú¸E‹Ü©ª¨O§@˦àòQ~8ªÎ@JfÂÍkÈHg¾HôA_Âè Ç»ÅÝZôŠ_ˆ®ÿu>U–¤"¶’IN.Ò—{¦@OÄǵè2ßÌY¾Šp Rú);©š§ñš€Z@˜Z!¾çY‹.óM¬Ñô4ôz 2 z|Mޱ%²žJEY€|¦€V~ÿžgí93%8.A C#&#$w~Š×ø0/M@˜Zùý{žµçÌTFÜŽž—!ö߃‰ ˆgRdïKqU€<¦€VˆË|-zEŠÐ`ÄrC32ÐüŸÅx„0„ãhÔª+¤0´òû™©¶]æÿºµ• ¯„"ÖKÈ÷g4é_ˆõ22µ§º2@S@+Z÷ !Ôt=Ø‹^ý™ù} rÿ7úÛ÷”–Ha h…83e2©.äq'Ê[‰ì硱k_2±¦¢  .0hЊ@,@1´&LïïDݵhöxjO{¦€Vb†aFŒ#:©âŽFÍFfŽý·:ÂЊP,4biÑ—zYŒGã©.hÜ3´" L M¨®è#S@+¦€*¦€V„b¡±¡1ÕU}a hÎLU L­DŠÏLk.!!ŸÊE L­%B*ÏL[‹ÐµÅ¨â,eê@˜Z¡ò2_Òn!›ihüûÔ(ãL­Pùêþ'¨«ͺŒ08GÑGð[´BÙ™i}.zxýå2ã ® ÃÉ-J­ÝÞ­Vmq  L­DT„©¨ å¿— 1+4½i 5 L­%T\æßù‰»Ð_kz»C¦¦óV²ôVžv– a h…š3ÓQsÑk'‘‰Mo¯744(¬áñxÓ¦M333srr:uê±255uÔ¨QÖÖÖŸþ9B¨°°pΜ9VVV¦¦¦nnnçÏŸ'ša–››Ëårcbb¢££­¬¬‚‚‚šššB`Ó¦Mvvv¶¶¶_|ñ…l‹†¥§§;;;³X¬ààদ&b[[["˜dÝž>}ºßú{RZío¼qøða¢A~~¾MWWWTT”£££MXXQ3ús>Ë åÉïˆl=Žã=Ñ&))‰Ãá >|ëÖ­‰‰‰l6ÛÂÂbË–-ò]µ´´ˆÅâ>vªß‚ë%{ûM/þBu€|~_ø-‹YFu¸~ýzHHÈ„ Ö3&""¢¦¦&--ÍÀÀ ¶¶!´xñâæææäädCCÃîîîñãǯ]»¶²²²¶¶öÔ©S&&&Çq„——×õë×?ýôSWW×¼¼¼²²2??¿ÀÀ@Ç£¢¢¸\îõë׋‹‹g̘jhh Þ5a„üüü¢¢"ooob%ñª|·ýÖâñxòk”V{öìÙiÓ¦ Þÿý5kÖ8pÀÅÅ%??¿¸¸xöìÙ²å+‘Õ,¿R¶EÙú£Gö<D??¿ÆÆÆÔÔT„Ђ dËåå岚³³³G½wïÞºº:¥¿¾~üé˜ôÛ‚– LéjÞ‘yágé®ïììŸ8ý¹sçŽã‰„ â´ˆhS\\,1)))8ŽOš4)!!hP]]Í`0:::œcbbˆ•wïÞ•×Ù³g‰õ………¡ÖÖV…´"ºU¥þžaª´Ú––&“YUU%‘HØlvnnîØ±cÏ;G4{ðàQ>Ø0Uzˆ999²ƒ)¿¬PöãÇ·nÝÊáp–-[vûöíž¿Ê~üqLúxÆ LéjƧ3Þ‹Ú.]ºdkk»aƇöÖ&))ÉÎÎŽËå®X±âæÍ›8Ž#„êëë‰W‰°xôèQddäôéÓíííÎ1‰Õ¦¦ŠßÎR\\Ìd2¯_¿NôÓÕÕ%ÿ.…õ¿þú«BZݪRÏTê­Z??¿Ï?ÿ<''‡ËåJ¥R&“yãÆ …2ðÁ†©Ò#г±ÒeyÝÝݱ±±îîîýë_•îo¿ p‡{¦€Vb‰ÅŸÍçp8—/_ÎÊÊâó•´Ô××÷ñãÇ)))ööö3gά®®F/îÊøøøTTT\¾|9B¨¹¹Y¾ÁòåË£¢¢ ÊÊÊV¯^=kÖ,„вeËvïÞ}óæÍÒÒR…ç-{÷îåñx>\¿~½ŸŸ‹ÅBõŒKUêGµ···¼ ‘Hz«Ößß¿   ))),, !´bÅŠ={öðx¼’’’ 6ÈÊ`±X/^lkkÛ·oŸüVzKsb½Ò# :@ïííîééYTT´ÿþ5ø“ÞNYé .óéjòŽÉ;.îPûfš p\ªJÃŽŽŽ'N̘1CaýÕ«WÝÜܘL¦‹‹Kbb"®ì:733ÓÉÉÉÄÄÄËË+++kþüùă ôâZU(FFFr8ssóùóçVÁæÍ›‰§ù±±±Hî’ùÀ®®®K–,!n)øøø0™Ì¦¦&¼—KàÞêWˆ×[µ8Ž/Z´hòäÉIJP(Œˆˆppp°²² •írll¬µµu||¼¬æÞÊ“­Wzp•/óÓÓÓÃÂÂòòòzûõõÛ@Öó¸è6{óW_­X´ÈêBÉÆ~DRS˜ÐS@D˜Àõ „) 83‚0ô!–ŠBF†¦€¦€>H¾Ìï®#§  L}y™ß˜‡.:£æŸIè èS@¤ µ¡›ahÔßÕ_H( èS@¤]æÿ¼ IºÐk1:7›   "ôñûeþ@=IEgOÌfÎL}üþ4(—ùݵˆ·¹¬BÒÊúÂÐ  ~ZƒŒ-Ñ”/H« è S@C½g*jC‚&äq#³, àž) ¡>Í7²@soYÐ'pf è>N (a èã÷Ë|\o @˜ú ái>ƒa èC$aSðJ@˜úIDNR©@=µ½a èC,,Lk¿GߎG]5j«èS@"‰hŸ%í®C·ÂõkÈÔ^E}w—ôÑáÇóòò¨®‚|ÕÆÕLcfPP*ÝíêV»·oMïjý\¥öÔš6mÚ|@u /¦ú(///??ßÓÓ“êBHæ tp:¨Ø¸°Îîý«¾"‰\œåççS]è„©žòôôLII¡º  ϵµtàË ý L€¦@S „)`HOóóòò>LV)šdnnwô衸8Ýû(¡vŽ7Ä0¬¡¡ÁÆÆ†êBFMeëèÑC4¤3Ó§OŸ¦¦¦’UŠ&½òJ‹¥{IšŸŸOËÁöÐ ãLa¸¢ÆP>ÞPÃç\´<Å£åN÷LAx<Þ´iÓÌÌÌœœœN:…aBÈÖÖ¶±±Q lÚ´ÉÎÎÎÖÖö‹/þøú9 Ãâããe ~~~QQQÄKõõõFFFÑÑÑÎÎÎVVVAAAMMM!©Tíââ2lØ0OOÏ›7o=È6'‹£¢¢mllˆwmrss¹\îéÓ§Šohhè{wˆ•©©©£F²¶¶þüóÏB………sæÌ±²²255uss;þ¼Â†bbbzÖßÇÑHOOwvvf±XÁÁÁMMMò;Õwý@÷àCœœ<ÄÀ€j¬Ÿ1cÆDDDÔÔÔ¤¥¥ÔÖÖ"„pŠŠâr¹×¯_/..ž1c†l}\\\EE…l!66vâĉDo_~ùåŒ3Ž=êêêš——WVVæççG”ñÙgŸ9::æææVWWGEEY[[‹D"ÇeÝ8pÀÅÅ%??¿¸¸xöìÙDŸ!//¯ëׯwvvÊʾ~ýzHHÈ„ TÙÅ‹777'''vww?~íÚµ•••µµµ§N211òúôÓO{ÖßÛÑ@M˜0!??¿¨¨ÈÛÛÛßß_~§z«п/@-S]¢á0µ²²:rä±ÌçóÅb±,œcbbˆ—îÞ½+òZ[[™Læo¿ý†ã¸ÏéÓ§'Mš”@¼Z]]Í`0:::&NœxêÔ)b¥T*åóùR©—˱cÇž;wŽhðàÁ„Pkk+Ñ %%…XßÙÙyòäIww÷™3g&'' …BUvçÎ;8ŽK$b[---b±˜hS\\,‹Ä†”ÖßÛÑ@={–X_XXH”­¦²úûaªà2ôêøñãÑÑÑ£G^¹reQQƒÁ½TSS3nÜ8bY¶Ð“……Å‚ ÒÒÒž={öË/¿UVV.]ºÃ0 Ã$IUUÕ£GÆO¼Ã0‹E\Ë<}úÔÅÅ…X&ªªªˆ¹\.BèòåË£G¾wï^bbbNNNpp°‘‘â\|Jw‡Ãá „ ~ÿ‡ÐÒÒåããÃf³W¯^-ÿvbCJëïãhÈÊ&vPV¶B·€ LA¯|}}?~œ’’boo?sæÌêêjÙK§¤¤„X.++룓ôôôÔÔÔ€€sss6›‘‘AüŸœ8 7n›Í®¬¬”½¥¥¥…8U”ß\EE±L,°ÙlâG"9އ‡ÇåË—³²²ø|¾ê»£Ú>>>|ôèÑåË—å_"6¤´þ>ŽFyy9±PZZ*_¶B·€4ô‹lkkûðÃMLLÃÃÃeÿ21 +(( q[¤w¨…[Ô ww÷ÈÈH.—;uêTÇ™L&BˆˆªeË–íÞ½ûæÍ›¥¥¥[¶l‘½%>>žˆEÙÂÂ… ûí·cÇŽ­\¹!´|ùò¨¨¨‚‚‚²²²Õ«WÏš5 !ôöÛoïܹ󯵵µ‡âp8]]]D‡ÄæV¬X±gÏWRR²aÃ???‹%_êäÉ“¿ûî»ìììêêê—^z)<<üÎ;ªìŽ‘Häáá1vìØ‡._¾!ÔÜÜ,ß@iý½ „ÐÞ½{y<ÞÇׯ_/+»·¸ºm(÷T¼g*‘H¼½½_ýõüüüúúúÂÂÂ÷Þ{Ëåvwwã8ŽâñxC)CéjÏ5|ÏôêÕ«nnnL&ÓÅÅ%11Çq&“ÙÔÔ$6oÞL<¿ŽErw ãââäp ár¹ÄmP¡PÉápÌÍÍçÏŸ_^^N¬Ü¾};—Ë533óððÈÉÉ!Þ(ÛœP(Œˆˆppp°²² •¿çØóÈwttœ8qbÆŒýîúó툆†ÌÌL'''//¯¬¬¬ùóç²dRZGãÀ®®®K–,©¯¯—ß©Þêôï PKa3jÔ¨öövù•Ä\gÃTáß¡l‹¨—G1¤Ðp˜‚!"ëO~_:A—ù ëׯ6l˜üJ‹%ÿ@£„IIIgøðá[·nMLLd³Ù²‹)…J P:xð7Þ}6??ßÆÆ¦«««·ˆQ²e…Ñ‚2òëqï9 Q•=è"M„é/¿üòÊ+¯ôÝæÐ¡CIII©©©·nݪ««{çwd/%$$ܽ{÷ìÙ³ÑÑÑqqq÷ïß?sæÌáljqqqÞÞÞò =…††Ž;öÎ;=Ú¼yóòåË…Bapp°ì³°IIIŸþyo5(À_œ*|ŽE~ý—_~“˜˜Èãñº»»×®]«âÚÀq|êÔ©TW4e(§µ*^æÞ¼ySö£lÓ|>q)ÔÇ@BâñxW~¹· ¨ž/)<ØÒÒÂd2«ªª$ ›ÍÎÍÍí£…;k=Wö¼ÌW: qp{$—ùú ~_:Ag¦l6[6p„ÈPùA6„>𛛣#Hä—U§tðàˆ#æÌ™“––víÚ5CCÃéÓ§÷Qà (HÖ´&þ /Z´èøñ㲑ƒ,ëçŸVhÓÇ@¡ëmð q¥ŸœœŠaX5à8Ž˜­J$’µGm£‰0ݾ}{MMŸŸ_AAAMMMzzú®]»Úô;°7=6"„ÚÛÛ[^H$½ ô÷÷/((HJJ 룋uñâŶ¶¶}ûöÉoº·Ñ‚Äz¥õ ûzBa:räÈ[·nYYYÍ›7ÏÕÕõÌ™3=g틈ˆøÇ?þ±xñâiÓ¦9òÌ™3*v¾lÙ2b’!ÙBhÖ¬Y–/üòË/_ýõ±cÇØlö{ï½·råÊùóçûûû#„,,,æÎëàà@<ë­†/¾ø"**j̘1¯¿þºl»>>>/¿ü²Âˆnùõ[·nõóó[¼xñ«¯¾úôéÓ´´´8€îÀp¹'Buþüù¡ô@¹€€mÛ¶Q]ˆJˆùL‡>,Yý¨Ã0§î‡Úò“„Êo‘“‡jò÷MŸ{tvvÞ¾}ûÊ•+K—.¥ºúè9‹hOº8ì—ÒÇNõÛОþ†ivvöœ9svìØ1zôhªk¡ƒ7n„††úøøôÛR‡ýæç绺ºîÛ·¯¾¾^i ý6ô7”qU0Ÿ©†iá8Ó~gEtöûøñã­[·r8œe˖ݾ}»ç¡è·Á Á8S ¿g¦`èT™E´'öËår÷ïß_VV6wîÜ5kÖxxx ´ 7S0xªÌ"Ú“Nû-..¾uëV[[Ûœ9s×Є)}Juý“v0:/ØKª™†Ú‡ù×R]•§M›Fu /¦*Ù²%95•'ýqrÊ`üç?!ÁÁ0ÍšºÔÝëøß–òîV1.AÞŽ“‚m©®€¾À=S•¬^=C,–ˆ²XfýE Ý=[÷íª’® .A!û)æT×@?àž©JÆåîîx÷îS ÃLL Ï{·¶¶eãÆo,,Lß{o6ÕÕÑŠ°]’³½òɵçáG!ãa Ë1¦T×@? LUµzõÌuëb­¬L“’Þsss@ÕÖ¶îÛ÷•Õ°ÐÐר®Ž&øåÝ—7—uÔŠúýîf€š2 éÀ£2 ï LUõƯüío ±³A¬Y¿þoMMíÿú×yËÌ×÷%jË£Š«üܤb$•Ø‹ û)J†¦ màÔH¥¸ÂD'8ŽðAÒÅ‹¿$%­õðCUaºN*Æo®~p¾)ûc ˆo;y˜Æ‹``àÔôœ2 ðO? öòr}ûíÓ%%z=vgÐmâKÊ~MQž¤ cÌz¼™Æ‹`À L‡ÊȈqòäJ—‘¡¡_UU©ú¥r€ ã—6”Wÿô—*{C¶“‡hÇL²ô ”¦¦ÆçÎ…›››¼õÖ‰––NªËÑ%†Ø‚/]ÝBFbŠ¡i`„9¼7Ln€0%‡¥å°ääuííÝK—~ÝÙ)¤º]blΘöÇïÔ¸áöÆÎS©·ÿ Œ0º”4öö¬„„5••kמ“ð*ånþ·NÃFc Lv]o`ˆÙºÁ£'  LÉ4~ü¨¸¸Õ·n•mÚô “©ÏÝýd×dQ̸áâÕj¬©¡ ü‰Ý©$›2eôÿ»<3ó—ýûÿêZtÉÝsuÏ«Ó?æŽ|iX`ÒÄWße`ˆ±ÿ 7L΀q¦j‘šZðþûßlß¾híÚ™T×¢øåÝÞzè±ÑÁíÍ‘¬¬è–Ф0. è ø”ZN­®æïÙ“iii3Kõ—â×v?¶™8lrÈHùõ–c˜T•À @˜ªËûïÏåó;>úè¼­íðÙ³'R]Žöú5¹¡©¤ó‰1¸çtüýªÑ'ŸøüåÝwÏTR]‹–wK9YûÒ[v,'8º —H$Y±âÔÝ»O/^Üèê:²ÿ7è~y·…£1Ãþ¿t„©Úµ· ¿lhxž™¹ÑÁÁ’êrjaª ÍÍþþ_\¸°Å‚ÇÓÐ\[i‚•Õ°„„Õ--Ë–€›@K¦ÂåZóÍÚ²²†uëbáæÐ„©æLœhúôªk׊?ø î®@3¦5mšË×_¯Èȸóé§ÙT×B™Ç?¶Š»áÜÐ cçÎT× _\\FÚÚZìÝûíðá¦S¦8Q]ަÕßïÈþg©åS+WøÂQ@+ð ( ¼õÖ´ºº¶]».ZZšý•êr4G"”þøÉ#îô.¾0D Ð \æScË–ùááÓ?ü0ùÇ£º͹s²¶³Aìõ‘ãûÁ0¬  @,cÖØØ8ˆ†ò^”‚0¥Ìξ¾/…‡ŸùùçGT×¢ ¿uÞ;W÷ײÍG“Ò!ƒÁˆ‹‹>|0Óô å½(ƒö©$I–-;ùàAÕÅ‹]\èüaS©ÏXþ›‘)Ãï両Oh‚aÇ›:ujßmlllTéMÅ–ôÎL©D|³©ƒƒåÒ¥'êêÚ¨.G$Ö·T |vp’ð¤¤$‡3|øð­[·&&&²Ùl ‹-[¶¨Ò­ìRÇãM›6ÍÌÌÌÉÉéÔ©S†!„lmmû¸'Þ+ßÇñèèhggg++«   ¦¦&‹TØú` P­±ñ¹·÷¾Y³þÝÒÒAu-êRœÙXx¦¶çz„ŸŸ_cccjj*BhÁ‚²åòòòÞzCñx_,"L'Mš”@¼Z]]Í`0:::T)²çÖ}@€î‚Ë|­0z´ubâÚ_}¶fÞ}³©¹¹9BÈÀÀ@ay@Ž?=zôè•+W1ŒATRYY¹téR Ã0 sppH$UUUªIÊÖ®ƒ0Õ'²OŸ^õã¿mÛ–Ju-ºÇ××÷ñãÇ)))ööö3R嬺¸IDATgά®®D'l6;##ƒ8ËJ¥|>ܸqÛ:Ðu¦ZÄËËõ«¯–'&ÞþÏ.Q]‹ŽqwwŒŒär¹S§NÅqœÉd"„ø|¾Šo'Z._¾<**ª   ¬¬lõêÕ³fÍÊÖ¾0Õ.¾¾/íÛ·ä?ÿ¹|êÔ5ªkÑ%§Nºzõª³³sDDD\\œµµµÏË/¿ÜÜÜÜï{e-·nÝêçç·xñâW_}õéÓ§iiiƒÞúÐöè$gªÌþüóÿý÷¿Ë.t§º–AÂ¥¾ èø{×Fÿúׂ•+_ÿç?ãss‹©®en|zëàÓ¡ôpéÒ%L™¨¨( w€*àÌTKI$Òuëbüñ·´´¾ô‡êr¦úöó¬õ¥ÛïyÒœ™¹ÑÑž v¦´Åçw,^|L(gf¾occNu9Ð ¢-KËaIIkÅbÉòå';:†ôaSa»„¬ª +83%Áùóç©.¡WÏžu=ú`ÂÖŠƒùGíg™Þ|Ãqí¤–¦.^^^|4 h„) 0L«¿ÓؘƒT(|6èLæR\"v‘X•ú$''S]Ð;0ΔðXKhùÿØÁ=S „)ÂHa $€0@˜ L5§­­íÃ?ttt411qtt ¯®®&^Â0¬  €Äm‘Þ¡*úØAhÂTC¤Réßÿþ÷Û·o§¦¦VUU}÷ÝwL&ÓËËK Ðô·Šª íw€¾Á } 9{ölyyyYYÙ°aÃB¶¶¶_~ùå¾}û uøW€aXCCƒ ¢é :83Õ„„„õë×A#Ãb±Œ?¾t^,GEE9::ÚØØ„……555ë1 KJJâp8Çߺukbb"›Í¶°°Ø²e‹¬A||¼üBO………sæÌ±²²255uss#æxã7>L4ÈÏÏ·±±éêêê­†ÆÆFùeâ³F¶¶¶Äú¾wðÜÜ\.—{âÄ û'ÒÓÓY,Vpp°¬1ÚC†JNN¥efff=ðx¼¸¸¸äççÏž=; @öªŸŸ_cccjj*BhÁ‚²åòòrÇãââ***äˆå71~üøµk×VVVÖÖÖž:uÊÄÄD œ={vÚ´iDƒ÷ßÍš5}ÔÐÐР°,¿²ßôòòº~ýúŽ;Ôÿ„ òóó‹ŠŠ¼½½ýýýû>ȸj¿ Ô”ªü644¼yó¦ü[|>‘}cÇŽ=wîÑàÁƒ¡ÖÖVâÕœœÇ%‰Â²BbÊ÷¯ðRKK‹X,&–‹‹‹‰Àjiia2™UUU‰„ÍfçææöQCßaÚ捻¤à8>ÐþÏž=K¬,,,”5î„)  \æk›Í.))‘ýÈçó{>é~úô©‹‹ ±L,TUU?š››#„ –U×ÒÒåããÃf³W¯^M¬1bÄœ9sÒÒÒ®]»fhh8}úô>jâr¹Ü¾÷Q)YãñãÇ«^ šaª!‹-:~ü8q:‰b±X?ÿü³B‡SQQA, l6ißàäããSQQqðàÁG]¾|Y¶>88855599944ð>jÀqõgýî ‘þí¿¼¼œX(--E¤HFõ©1 .-ëêê8ޝ¯/Ç{öìYZZÚ”)SП/ó÷ìÙ3vìØŸ~ú‰¸Ÿèçç'ë_vÍ®tYé=Óœœþ b±ØÞÞþСCMMM………ÄlÅÅÅ8Ž·¶¶ššš²X¬ÂÂBÇ{«Åbý5q"[a —kýòË0ƒ—ù@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂHa $€0@˜ L€¦@S „)ÂH`HuÚ¥ªªêÖ­[TWA™¼¼¼î €££ã´iÓ¨®è6 ÇqªkÐ"çÏŸ ¡º j˜˜pE¢F©´“êB(˜’’Bu@·Á™©999T—4gçÎT—èî™ L€¦@S „)ÂHC£©³³óܹs999|>ßÒÒrêÔ©«V­²±±AÍš5뫯¾?~«ãaœyÎY|9ÎÁ#`Ú;;;½½½‰„b³ÙÌfs<g^  †âââÆÆFBHGGG¢ýðð ‰Z[[™;$Ÿ---ñù|f!,—Ë_^^b±˜Z­ž››»¿¿§(jrrrffæ« ,ø|>³Ù,•J !CCCƒ¦éüüü´#úꆟwœ’NZŠ™L¬½½]&“±/ÀA1eƒ¢¨ëëëššæãÖÖMÓmmmﯹ»»+++cÚL#WTTBø|>!„Çã}hg.®¯¯ŸŸŸƒA±XÌt*ŠƒƒƒÊÊʼ¼<™L–" ···N§Óét&zÂá0óô¿#ià´£H¬´´”E PLÙP©T>ŸO§Ó1kC@pvvöá¡P …˜ßé̯]Š¢¸ `³Ù¤Ri___UUÕÛÛ›N§cú›šš¶··@ss3ÇK‘9z1gþPŠ¢úûûU*óõX,–X†s%ià´3™"»šÀÞ™²a2™"‘Èèè¨ßïD"‡‡‡^¯÷Ã5z½~uuõòòòææf~~^©TfXzvww™’‘hO{5¯¯¯‰D,—ËEy||$„¨Õj¿ß¿··×ÒÒ’"ƒ@ 8::ŠÇãkkkïÍÜä3¦_¯×¯¬¬øýþ`08;;;00ð's–‘¤SÌä·H +S6JJJ=Ïðððóós]]Ãá0ï¯éìì|zz²Ûí4M×××Ûl¶ oîr¹ÆÆÆD"Q¢Ay_ Ün÷àààÂÂÂòòruuuOOO,÷z½ …" 1ûc_e°Z­n·ÛãñX­ÖÍÍM¦S.—[,–¢¢¢÷yýF£‘¦i»ÝFkkk§¦¦ØÎß—’þjß -œ´ÿæ¤ýœ>zbbB"‘tuue;HÎp8B¡'íÃ_ÂÊôç iúêêêôôÔjµf;Ë?NNNFFF>÷www[,–ïÏðïA1ý9ާ§§M&Óg »¡¡!§—ù™C1ý94F£Év €ÿ)ìæpÅ€(¦@1à6 ’p8ÙŽßçââB«Õf;ä<Óß”——8¯~<­V«T*³rþÀ¼3àŠ)PL8€b ÀSüa kM¦¯ÔIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_0x6c.html0000644000175000017500000002173312234777147025105 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - l -

        classGlom_1_1predicate__LayoutItem__Field__IsSameField-members.html0000644000175000017500000000743512234777147036177 0ustar00murraycmurrayc00000000000000glom-1.22.4/docs/libglom_reference/html libglom-1.22: Member List
        Glom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element > Member List

        This is the complete list of members for Glom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element >, including all inherited members.

        operator()(const sharedptr< const T_Element >& element)Glom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element >inline
        predicate_LayoutItem_Field_IsSameField(const sharedptr< const T_ElementField >& layout_item)Glom::predicate_LayoutItem_Field_IsSameField< T_ElementField, T_Element >inline
        glom-1.22.4/docs/libglom_reference/html/tab_a.png0000644000175000017500000000021612234777145023112 0ustar00murraycmurrayc00000000000000‰PNG  IHDR$ÇÇ[UIDATxíK €0C'o¤(Šˆ[Žà%Üxÿ#Ù©­ç ùÁöó¦W¦e# 3t I 3+¼øEã~\D½9¯Ûàè’wM·¿öÿ}Yõ_êA4Yžã}IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1FieldTypes-members.html0000644000175000017500000001012512234777147030233 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::FieldTypes Member List

        This is the complete list of members for Glom::FieldTypes, including all inherited members.

        FieldTypes(const Glib::RefPtr< Gnome::Gda::Connection >& gda_connection)Glom::FieldTypes
        get_fallback_type_for_gdavaluetype(GType field_type) const Glom::FieldTypes
        get_string_name_for_gdavaluetype(GType field_type) const Glom::FieldTypes
        get_types_count() const Glom::FieldTypes
        ~FieldTypes()Glom::FieldTypesvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlomBakery_1_1ViewBase__coll__graph.png0000644000175000017500000000777712234777146031730 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“´IDATxœíkPW€ßM@BŒ-± 71¹ˆ‚¢QPƒaTlUÔ.*•Jí8 -#2*E°Ñ‚Ck­v¼B­¢TTj/(Hòµ‰J/|E.ƒÊ]!Єý~l¿-E¨˜B=û ?Ξœ=ç=ûìž³Ù,»Žã@ 4c@1¢P¾Ñ‚ò”o´ |#n0ŒÝ³1™™™’bbи·nÝêíímÐ&^=BBB W¹a}{{{´‰Wƒú¦æo´ |£å-(ßhAùF‹Ñå[«ÕbÖÒÒbì@`øa ZÃ0¹\n€¸þ)£Ë7NOOO7nœ±ye]¾1 {çwÌÌÌþy=£a…Ù·L&óööf2™©©©ðU&&&fâĉ666©©© C.—÷õõ%'';::Ž;vîܹ%%%D%†={–L`VVV„r à ííí£¢¢-Zdiiinnîîî.‹`¨:Iâãã½¼¼:::ÊÊÊž]àâÅ‹MMMd>ŽãÉÉÉ“'O¶´´ jmm5ìÖºN‹ã8 ã:0—ËݹsgCCÃ… h4Zcc#477'%%999ݼyóîÝ»€N§Ëd²C‡ÙÙÙ*•Êøøx6›­ÑhpOOO¯®®îŸ *!Ãðññ)**²··ß¼ysMMMcccjjª™™™Z­ªN¢†={öxxx´¶¶â8îììüìêDI///…Bqçιsç¾õÖ[D¦L&;|ø0Ç+--­ªªZ¾|y``àËÚnzcdß–––$ÒíííZ­–ØÐNNNgΜ!òËËˉÍçêêšššJdöõõµ··÷õõ Õt߉ÇñŽŽ­VKdVVVe†ª¶oßħƒ®N”,(( òoݺmmmDÀnnnçÎ#>R*•t:]¥R½”í¦7FÏ;–œœ>>W¯^õ÷÷wqqù›:‰éY­V»¸¸|ú駃®N”ùD­V›™™9%%%³gÏf±XqqqL&S¿jÞ5}Æóï¾ûîñãÇŸ}ö™«««………££ãÖ­[ÓÒÒèôoÐsss‹Åb±8NXXXggço¿ýöRj>|>ßÄÄä—_þ|›MII‰¯¯/†a‹/Ö{·6z×ôñ——·jÕª{%‹Å¢Ñþ¬M§Ó¥¥¥¯\¹211ñéÓ§D¾P(ÌÏÏ zûí·OžúÌßÝÝÝýÏVÈÓÜÜ\r‹|ûí·ï¾û®««+DEE…‡‡wwwÓ^ppðk¯½¶`ÁX³f ™~úô)‡Ãòt¯»»;%%%))I,?~ÜÜÜœB¦OŸ®ÑhT*ÆùóçÏŸ?êÔ©qãÆ@NNNxx¸››ÄÄÄ“ÓpPPдiÓ¸\îÑ£G[ZZØlö7vïÞ ‹/&"'^^^&&&2™ÌÇǧ¸¸xõêÕý7 ­ðùüììl(++[µjÕåË—ûúúÊÊÊæÌ™C¬õB]ëêê²´´´´´\°`T*ˆˆª_ÃGßl6»¾¾~êÔ?ÞŸ››«V«û—ijj²¶þãíD¢¹¹yÒ¤I`nn† H? “ÉܸqcNNN}}=ƒÁÈÈȨ¨¨P*•¶¶¶ý‹•——óùüŒŒŒ¸¸8hllLLLLLL$ 477«Ùرc½¼¼~üñG.—K§Ó§M›6hët:] òx¼šššùóç÷ÿtÐV\\\úúújkk ERRRAAÁ¯¿þªP("""ôèZttôáÇ%ÉŒ3V¬XÑÔÔ4T¿†>¾çÍ›—““³dÉb—d±XåååÊXYY=~ü˜‰šÍfëÑ–N§ssó?üÐÍÍmóæÍNNN8Ž/Y²„,#‰t:݆ –-[æááÁf³#""æÍ›8Ž«T*rÔ!w¬… ^¹r¥®®ÎÏÏo¨½ üüüvïÞÍãñ<==‰Áƒd¨VfÏž}ýúu•JeggçééY\\ÜÐÐ0}út=ºÆçó333>|XTT´uëV–˜˜8h¿†>ówXXXkkëG}TYYÙÚÚZTTtúôéeüýýÓÓÓŸñâEBðÌ™3/]ºäééibb¢G×Þÿý”””‰':;;ã8¾|ùòçöë¹ès|[XX9r$%%eûöí½½½3gΉDëÖ­ë_fíÚµ=== jµzöìÙQQQïŸì‰™™ÙÔ©SE"†aÛ¶m;|øpjjê”)SÖ¯_¯R©víÚÕ? ùᇲ²²Ö­[§V«ºººÜÝÝ÷îÝûlL&ÓËËëñãÇä‰ç¾}ûâââ8™æëë+•J æ0T+|>¿§§ÇÃÃf̘¡R©ÈÉûE»¶}ûö#GŽH¥Ò &ÄÅÅ ‚S§Ný}¿žË_îo‹Å!!!zTô¯#>>ÞÕÕ544ÔØ‘HdeeE~ù4¯Ÿ«Õêû÷ïËårr0G}ÿüóÏ111aaaÄé:R ò¾¹þ@`ì(ŒŠÇ7ÊP¾Ñ‚ò”o´ |£Å ççýo»¡ø·3àw¬¿\_{ôèÑO?ý4â!Q;;;ooorÑ÷# 5£å-(ßhAùF‹ÿ&£©–7ËIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Relationship.html0000644000175000017500000016537312234777147027214 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::Relationship Class Reference
        Glom::Relationship Class Reference
        Inheritance diagram for Glom::Relationship:
        Collaboration diagram for Glom::Relationship:

        Public Member Functions

         Relationship ()
         
         Relationship (const Relationship& src)
         
         ~Relationship ()
         
        Relationshipoperator= (const Relationship& src)
         
        bool operator== (const Relationship& src) const
         
        Relationshipclone () const
         
        Glib::ustring get_from_table () const
         
        Glib::ustring get_from_field () const
         
        Glib::ustring get_to_table () const
         
        Glib::ustring get_to_field () const
         
        void set_from_table (const Glib::ustring& strVal)
         
        void set_from_field (const Glib::ustring& strVal)
         
        void set_to_table (const Glib::ustring& strVal)
         
        void set_to_field (const Glib::ustring& strVal)
         
        bool get_auto_create () const
         Whether related records will be created automatically. More...
         
        void set_auto_create (bool val=true)
         
        bool get_allow_edit () const
         Whether related records may be edited through this relationship. More...
         
        void set_allow_edit (bool val=true)
         
        bool get_has_fields () const
         Whether the relationship specifies from and to fields. More...
         
        bool get_has_to_table () const
         Whether the relationship specifies a related table. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         
        - Public Member Functions inherited from Glom::HasTitleSingular
         HasTitleSingular ()
         
         HasTitleSingular (const HasTitleSingular& src)
         
        virtual ~HasTitleSingular ()
         
        HasTitleSingularoperator= (const HasTitleSingular& src)
         
        bool operator== (const HasTitleSingular& src) const
         
        bool operator!= (const HasTitleSingular& src) const
         
        Glib::ustring get_title_singular (const Glib::ustring& locale) const
         Get the (translation of the) singular form of the title, in the current locale, if specified. More...
         
        Glib::ustring get_title_singular_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_singular_with_fallback (const Glib::ustring& locale) const
         Get the (translation of the) singular form of the title, in the current locale, if specified, falling back to the non-singular title, and then falling back to the table name. More...
         
        void set_title_singular (const Glib::ustring& title, const Glib::ustring& locale)
         Set the singular title's translation for the current locale. More...
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::HasTitleSingular
        sharedptr< TranslatableItemm_title_singular
         For instance, "Customer" if the table is titled "Customers". More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::Relationship::Relationship ( )
        Glom::Relationship::Relationship ( const Relationship src)
        Glom::Relationship::~Relationship ( )

        Member Function Documentation

        Relationship* Glom::Relationship::clone ( ) const
        bool Glom::Relationship::get_allow_edit ( ) const

        Whether related records may be edited through this relationship.

        bool Glom::Relationship::get_auto_create ( ) const

        Whether related records will be created automatically.

        Glib::ustring Glom::Relationship::get_from_field ( ) const
        Glib::ustring Glom::Relationship::get_from_table ( ) const
        bool Glom::Relationship::get_has_fields ( ) const

        Whether the relationship specifies from and to fields.

        If not, then it specifies all records in the to table.

        bool Glom::Relationship::get_has_to_table ( ) const

        Whether the relationship specifies a related table.

        Glib::ustring Glom::Relationship::get_to_field ( ) const
        Glib::ustring Glom::Relationship::get_to_table ( ) const
        Relationship& Glom::Relationship::operator= ( const Relationship src)
        bool Glom::Relationship::operator== ( const Relationship src) const
        void Glom::Relationship::set_allow_edit ( bool  val = true)
        void Glom::Relationship::set_auto_create ( bool  val = true)
        void Glom::Relationship::set_from_field ( const Glib::ustring strVal)
        void Glom::Relationship::set_from_table ( const Glib::ustring strVal)
        void Glom::Relationship::set_to_field ( const Glib::ustring strVal)
        void Glom::Relationship::set_to_table ( const Glib::ustring strVal)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/relationship.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Header.html0000644000175000017500000020015512234777147030242 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Header Class Reference
        Glom::LayoutItem_Header Class Reference
        Inheritance diagram for Glom::LayoutItem_Header:
        Collaboration diagram for Glom::LayoutItem_Header:

        Public Member Functions

         LayoutItem_Header ()
         
         LayoutItem_Header (const LayoutItem_Header& src)
         
        LayoutItem_Headeroperator= (const LayoutItem_Header& src)
         
        virtual ~LayoutItem_Header ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        - Public Member Functions inherited from Glom::LayoutGroup
         LayoutGroup ()
         
         LayoutGroup (const LayoutGroup& src)
         
        LayoutGroupoperator= (const LayoutGroup& src)
         
        virtual ~LayoutGroup ()
         
        bool has_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const
         Discover whether the layout group contains the specified field (from the current table). More...
         
        bool has_any_fields () const
         Discover whether the layout group contains any fields. More...
         
        void add_item (const sharedptr< LayoutItem >& item)
         Add the item to the end of the list. More...
         
        void add_item (const sharedptr< LayoutItem >& item, const sharedptr< const LayoutItem >& position)
         Add the item after the specified existing item. More...
         
        void remove_item (const sharedptr< LayoutItem >& item)
         Remove a layout item from the group. More...
         
        void remove_field (const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name)
         Remove any instance of the field from the layout. More...
         
        virtual void change_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void change_related_field_item_name (const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new)
         
        virtual void remove_relationship (const sharedptr< const Relationship >& relationship)
         Remove any use of the relationship from the layout. More...
         
        void remove_all_items ()
         
        double get_border_width () const
         
        void set_border_width (double border_width)
         
        guint get_items_count () const
         
        guint get_columns_count () const
         
        void set_columns_count (guint columns_count)
         
        type_list_items get_items ()
         
        type_list_const_items get_items () const
         
        type_list_const_items get_items_recursive () const
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_items get_items_recursive ()
         Get the items recursively, depth-first, not returning any groups. More...
         
        type_list_const_items get_items_recursive_with_groups () const
         Get the items recursively, depth-first, also returning the groups. More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::LayoutGroup
        typedef std::vector< sharedptr
        < LayoutItem > > 
        type_list_items
         
        typedef std::vector< sharedptr
        < const LayoutItem > > 
        type_list_const_items
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::LayoutGroup
        type_list_items m_list_items
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::LayoutItem_Header::LayoutItem_Header ( )
        Glom::LayoutItem_Header::LayoutItem_Header ( const LayoutItem_Header src)
        virtual Glom::LayoutItem_Header::~LayoutItem_Header ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Header::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_Header::get_part_type_name ( ) const
        virtual

        Reimplemented from Glom::LayoutGroup.

        virtual Glib::ustring Glom::LayoutItem_Header::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutGroup.

        LayoutItem_Header& Glom::LayoutItem_Header::operator= ( const LayoutItem_Header src)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/report_parts/layoutitem_header.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1ChoiceValue__coll__graph.png0000644000175000017500000000730312234777145031234 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥u w¶¢bKGDÿÿÿ ½§“xIDATxœí{P×Çφ ƒ ¯ ò´J©eŠ:€§¼,C½AÀJÛq| ÔB"B,‚Õ±ÔQ¡Ð‘á¡$>NæææMMM33³5otÑûÆOž<‘J¥›7oX[[_¿~ýüùótº.Ñ–…Éd’6ƒÁ n®†) ++«ÿÓøjè2ž—••PØÙÙ©T*²£Åy {L—jaaa¹¹¹Ä)`2™?üðƒš›Í–Éd„M,K·µ@¶ŸŸŸL&»téÒÓ§O¿þúkª1AR îíí …¶¶¶¯¿þ:y¦j ²¬ƒT*% ‰D‚a‡Ã!6Y,Vmm-qa-,,ŒoÛ¶MÓ±¬ÊYgtÑ;--M.—‡††ŠÅb¹\^]]‘‘¡æûñÇwtttwwÇÇLJ††®ð¾º´´´§§‡j,‹R©Ü³g««ëãÇcbbÀÿFÔ%ñððàóùööö»víÂqÜØØxÙ ÄB-|>¿³³³««ëøñã<ü¬“šš*‹¥RéÑ£G¹\î’)ñWèüW¡î+œ¿qÿå—_¢££ÍÍÍMMMCCC‰+˜:ÏÍÍ%''ÛÙÙYXXDFFSÔâ©k± ())¡$`ÑüMlŠD"###ŸÛ·omß¾}q|"‡»wﺻ»;;;ß¼y“tÓÄÏÏÏØØxttTK+eeevvvæææ‡Vë>ŸÏf³ FPPy{EMŒŒ¿gM¶&ÏßN¹á‡¢– þ¯áñxàÏOÁÑú9\ ½áé Ho¸@zÃÒ. Õ[.ŸØè6†%žXSŸôýS),”DE9mÞl¸Ñ‰è—þþ~6›ý§"êâ $¿,¡ÑŒmmLM_ÚèDÖmëkpãF[JJåž=NµµñËzãü]S#Æ0 ÷ ?ßè\Öèôîë‹{qÐhXmíýNg½Nïúú4€JµPYÙ±Ñé¬7Ðé-t¨T ]]2™b£3ZWàÒ["êî"oQ êê~ÜØ”Ö¸ô‰~44üãKÓJ¥J ø~óY ÒÇq C©TQ {{Gÿýoõ/[þƒHï‡ûÆÕ é55Ý¥C¤wmí}ê`N TÎ …ð,:Á¢·JµPU%VÌ ŠçbñÓuÏhc€Eï{÷d££ÓKî244€g὿üòئMtâÏÐЀ´U*\$ú‘øPþG/¿àýâînwöì›äæùó_þë_¯º¹ýñ“—‰‰KKÆF¤¶®Àø| Àb}Ÿæ±Ñ‰¬7°Œç¤7\ ½áé Ho¸@zÃÒ.Þpô† ¤7\ ½áé Ho¸@zÃÒ.Þpô† ¤7\ ½áé Ho¸@zÃÒ.Þpô† ¤7\ ½áé Ho¸@zÃÒ.Þpô† ¤7\¬úÿy´··úé§zÊfÝ0³°øÝÄD¹Ñ‰ü%¼½½WUeÕÿ¯§¯¯¯²²ÒßßµÿVlÚ¤˜šSSÇ_àÑ£G:ÔÒñÿ3¥§§ëV±Vè&š¿áé Ho¸@zÃÒ.ô¨÷ÌÌL^^^DDD@@@DDÄÅ‹GFFˆ]\.W"‘¬ms½½½|>?88øàÁƒ—/_ž™™!Ûšœœ\¶ºJ¥Z¡'Éùóç322¨%< $›VCG½Zô¥7ŽãÉÉÉ?ÎÈÈ …ÙÙÙ›6m:yò¤R©—%ŽçÏŸŸ:uÊÅÅ¥´´ô“O>‘J¥W®\YU–’’bjjºò*\.÷Þ½{³³³dI[[ÛîÝ»WdÑ—ÞwîܼxñâŽ;˜L¦³³ó©S§ŠŠŠ Ôß0°&GGÇ÷Þ{ÏÊÊÊÕÕõôéÓš®³%Á0, ÀÐpoݳgNÿþû?ÞxÓÖÖö7_‰Ò—Þ 066¦2 íU*UQQQDDÄ[o½•™™ùìÙ3¢œËå666òx¼ýû÷þùçß|óMxxø›o¾™››K:444P¶¶¶€€2²““SMM ÙzssóÁƒꪪ´·;99‰ãxyyytttppð‰'ºººDaTTTXXXzz:Q…N§ûúú677Õe2™B¡ðññ‘J¥IIIaaaAAAqqqß~û­ZçP'j£jñõ¾ô–J¥ÎÎÎÚ}***322®_¿>66véÒ%r×Ý»w‹ŠŠø|~yyyCCÃ_|‘œœ, år9 %%ÅÝÝj ÚØØPƒSÏ-±X\\\œ˜˜˜——§T*µ´ ¨®®®««ãóùeee»ví:{ö¬J¥ª­­½}ûvZZZ~~þÜÜùËå¶··“Tkk«§§'ƒÁ8wî›Í.((¸uëÇËÊÊšŸŸ×Þšâ¯9úÒ{ffæ…^ 7¹ÿcвfýÕW_ÅÆÆîرƒÍf'$$´¶¶’#pDDÄ–-[^{í5@dd$i'~@@€­­-ÕÐþÔçÈ‘#fffþþþ*•jffFK»€úúúØØØ;wZZZÆÅÅ•••Ñh´ººº¸¸8777‹•””ÔÒÒBLÛžžžt:½££ÐÚÚJ æyyyï¿ÿ¾¹¹ùÎ;•JåôôÒ¯Ò ÑÍÑ×û ,--ûúú^zé¿ïØ®¯¯Ÿ §ú ³Xÿ}Ãa(Š­[·LLL†©Ùš°±±¢–LMM™šš—¸µµ55‚–vCCC‡°1 c0Dafffff&_¡P°Ùl??¿ææf—žž___¢éòòò®®®õ×­k@Sü•Ô]úÒ{ïÞ½uuuD3ŒŸ~úIÍÇÚÚzpp‰ÚÒÒR·æ¼¼¼îܹBl>}úôwÞ‰D„ZjçŠöv---årùË/¿Ll祥å‰'öîÝ Àq|zzšˆ Ø·oßG}äâââááaffHHHpss;v옫«+Žã‹&$…BA6ª)þÚ¢¯ñ<&&fttôÌ™3‰dtt´¥¥¥¸¸XÍ'((¨¤¤äçŸîïï¿r劷·÷ ²¡¡Ð‰4¢¢¢d2Y~~þððpOOONNޝ¯¯¦hÚÛ ¹qãFggçØØXEEÇ› ***’H$—/_þàƒHÿW^yÅÐत„¼3W©TÄdÑÛÛ›••xþüO/g0mmm333¥¥¥dJšâ¯-úº¾™Læµk× NŸ>=77÷ꫯ¦§§GGGS}¢¢¢~ûí·´´´ÙÙÙÝ»w'$$¬0xVVVJJŠ­­-i0™ÌÏ>û,///&&ÆÔÔÔËËëøñ㚪ko722R©TfffNNN:::fgg›˜˜DGGÏÎΦ¥¥MMM¹»»Ÿ;wŽô§Ñhþþþ"‘ˆÌ‰‰‰W¯^-,,ܶmÛ‘#G¦§§Ïž=K=Ýãããóóó âããE"@KüµeÕßo‡jjjÒSBˆ’žžnmm- WU ­ŸÃÒ.Þpô† ¤7\ ½áé Ho¸Ðq}Ëå®mP{þ´V½¾ÖßßÿÝwß­¶„>àp8ÞÞÞ«ªéû¿¡Íßpô† ¤7\ ½áâ?С±×[ßIEND®B`‚glom-1.22.4/docs/libglom_reference/html/inherit_graph_12.png0000644000175000017500000000456712234777146025207 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥5¯/¼ÎbKGDÿÿÿ ½§“ ,IDATxœíœ}HSíÇS§lKQç65_&e°Èd*©…`=Œ2šš ¤’ (p‚^$­þˆ J£|I§6ÂD Q'3Ñ4e¾Ms2uêÌTœ©ç÷ÇÍs~§³¹|–nÏÓ9Ÿ¿®Ýç:×®]×Î}ßÞß!‚¢(  öN€Â¦Pý&T¿É…þ…V«mkk³W*»—ËŠŠúÿk‡\.·_b»‚X,Æ·ØÉÔƒÚ±ÿ1$''F¨õ›\Pý&T¿ÉÕorAõ›\Pý&Vö{qqñÆ\.×ÙÙ™ËåJ$’ÉÉIx AÎÎÎËÐ ‚ÌÎÎþWÂ{— 5ýÞÜÜü믿:::jkkµZm}}=F‹ŽŽ6;žßÀ¿«\¦çkè¯())ñññYZZ †õõuxV£R©~äwèõz‡µúMíX.±XL8_³æù®¨¨ÈÉÉqssÃ2 GGGìåúúºL&ãr¹žžžiiissspAªª*‡ãîîž——WYYÉf³=<<®_¿Ž9”——ã •JåêêP\\ Ýjkk}||öîÝûøñc@wwwBB‹Årqq ¯®®Æ¢}üø‘Çã•””²X¬ääd˜Ñh¼zõª···——ד'O°äQ( #%%ennA€——œð±°/_¾$G¯×Û²\ÿ|ó·ù|3™Ìººº­®Â)•JµZ}üøñ¤¤$ìªH$š­­­œþü|caWVV°ÞÒÒ’ššfËrYÆôù¶¦ßNNN­­­øŒ!ƒû!!!¯_¿†}}}€oß¾Á«ÍÍÍ(Šnllì­¦5‹õèÑ#hÃiÐÕՅݨ×ëàôˆ¢¨Z­Æw®¦¦EÑýû÷WTT@‡ÉÉIGGÇåååÀÀÀ’’8ØÓÓƒ¿ëÕ«Wp¼»»&Oè7 ‹¢èÊÊÊ‹/A||¼\._[[³o¹ðìÌ|Îf³ñyc»MŒ‰‰‰   hCC«Õ—t:ààà@°·¢¨¨¨°°ÐßßÿÂ… ýýýpäp8ød2Yll,›ÍÎÎÎÆßÎãñ&==AAüüü666´Z­N§ …n˜ÏÀçóñÉÂ655ùûûþü¹²²²¹¹9%%eÏž=ö-—e¬¹óÔ©SEEEð[`0Ÿ>}"øp8œÑÑQhCƒÍf[—â‰'ÆÇÇkjj|}}ãããa±à‚Š;::úðáñ±±¦¦&ü%X6›ýîÝ;øßÜÜ4 ¡¡¡ëÄðð0þ®‘‘h ™M†åp8‘‘‘MMM ƒÁlþ6.—e¬é÷Í›7u:H$êììÔét …âöíÛŸ¬¬¬»wïªTªÁÁÁ+W®ˆD"ƒ±àåååo©TÊãñ"""P¥Ñh¦wýøñ#222$$d`` 330??wÈÌÌ”ÉdÃÃÃÙÙÙÇŽdddܹs§µµuhhˆ°ÊÏÏW©T999Xò¦=pà@}}}ccãäääÁƒ%IWW—-ËõÁOîÛ\¿QýúõkZZ“Étuu‰Dð+‰_ÖÖÖrssýüüX,Ö¹sçð+¶ð˜µeeexãÇááá4-((¨²²5Ù:éõúººº€€ggçèè膆†ÄÄD¸o®­­I¥R‡C§ÓáfÇh4^»v îÏKKKný.((öðð8{öìÌÌ Š¢±±±4mnnÝâ¨åååçÏŸÇÅÅÙ²\–1]¿·ƒ¨®®NMMÅAT*UDD„½ù]àïjjj°êüœ\˜ù=Å<ÃQÏ7¹ úM.¨~“ {öù''§°°°ŠŠŠß¸³6b¥Riöl¬d[‡÷kÍÍÍàû÷ïïß¿—H$nnnIIIöM vÀÂd2aª:^VVæîîn×Ô¬ÄÎý¦Óé ƒÁ`\¾|yzzúÖ­[ú ˆ^¯÷ôô´YzøC.˜*´ÏŸ?o¯”~ÛÍç¦Â6ÔÔÔžžƒÁ`VÌÆ+Ð[©Ý…BÀ`0ÄbñÌÌÌVžMEQSuÜòg™%ˆâË¡ Žg]wüaÛöÏS­ÀTØ? ...z{{-ˆÙð Ñ‚ÃáÇ{zzz{{…BáÉ“'·ò$hê2™ÌTÇCHàN^ gŸOŸ>µª±±Ñßß???zzzçKlÂÎèß;ÅVý¶ fCÂTˆQ…º…F£1ëIÐÔù|¾©:n!U ý6+´ãCçååq8œŒŒŒŽŽëË· þÕýþòå `~~~llL*•=zÔ××—ð³hXp˜˜˜€ÑVVV f=«ªª¼½½y<^VVVkk«‹‹ aÚS«ÕRµÐï_†‚¬®®––– ‚#GŽìhQbg~ï°KÈåòC‡1™L b6Ä‚&c«ÕjAÒÓÓÍz4uEMÕqë>…Y¡ÝÔM­V·µµ-..&$$X÷FÖa»~› Û€¥¥¥………‰‰‰gϞݿ ÃÄlø’©TÚÛÛÛ××wéÒ¥äädfÖ“ ©ggg›ªãÛ„ Š›Ú1ŒFcyyyLLŒD" …ýýý÷îݳ¢˜ÖƒØwu>&Â6–ƒƒƒŸÏóæ ôÜJÌÆh jwEE…ŸŸ“ÉLOO7 [y4u³ê8!y³ó¹©(n9”B¡HKKkooߥ" ôorAéßd‡ê7¹ úM.¨~“ ªßä‚ê7¹ úM.Ìèߦÿ¤â?ŠR© …ø‘Ÿžo.—+‹m›Å." úç© Ôi© ÖorAõ›\Pý&ÿßqá%cóIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1CustomTitle.html0000644000175000017500000010226712234777147027020 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::CustomTitle Class Reference
        Glom::CustomTitle Class Reference
        Inheritance diagram for Glom::CustomTitle:
        Collaboration diagram for Glom::CustomTitle:

        Public Member Functions

         CustomTitle ()
         
         CustomTitle (const CustomTitle& src)
         
        CustomTitleoperator= (const CustomTitle& src)
         
        virtual ~CustomTitle ()
         
        bool operator== (const CustomTitle& src) const
         
        bool get_use_custom_title () const
         
        void set_use_custom_title (bool use_custom_title=true)
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::CustomTitle::CustomTitle ( )
        Glom::CustomTitle::CustomTitle ( const CustomTitle src)
        virtual Glom::CustomTitle::~CustomTitle ( )
        virtual

        Member Function Documentation

        bool Glom::CustomTitle::get_use_custom_title ( ) const
        CustomTitle& Glom::CustomTitle::operator= ( const CustomTitle src)
        bool Glom::CustomTitle::operator== ( const CustomTitle src) const
        void Glom::CustomTitle::set_use_custom_title ( bool  use_custom_title = true)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/custom_title.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Field__inherit__graph.png0000644000175000017500000003264412234777146033123 0ustar00murraycmurrayc00000000000000‰PNG  IHDR›]ZKWbKGDÿÿÿ ½§“ IDATxœíÝy\wþ?ðÏp)(§Ö<±km«+«âÑ* E[kµ.Z-¨ÐïÚJµµÕZ]»*P*ZÏÖs-X¢«­JA”#€Iæ÷Ç´Ó4€˜dx=þñÉdüÌ{޼˜™ÌL(š¦ /˜p]€Þ Ñ€?hÀH4à$ðG‡&Zbb"üБ›€nÂŽŸdBBBÇOÚÃÖ­[¹.àO8H´ÀÀÀŽŸ(´‡¤¤$®KøœGþ@¢ Ñ€?hÀH4àM´êêêÕ«W;;;›››;;;/\¸°¨¨ˆy‹¢(™L¦Çi5{™•'ñ‚½QUVVö\}ê} ®Þh‘J¥š2e EQR©´oß¾>ܳg··wvv¶¹¹¹Þ''—Ë™†­­íùóç‡J±¶¶Öû„ ½b¢íÛ·/777''§k×®„GGÇ;wFEE …íR­ Û¶²²RÙ(Š*--upp0Òþ Š!uÆÇÇ/]º”‰3–@ `_*Šˆˆggg‡   òòrf8EQ‡‹ÅÖÖÖkÖ¬9xð H$êÖ­ÛªU«ØâââÔÚPuñâE—eË–?ÞÎÎÎÒÒÒÓÓ311‘áØ±cb±ØÎÎnÇŽÌÀŒŒ //¯.]º¸ººÆÄİ½Ý¸q£i'EBËÊÊš‘’’âêêjccãïïÿøñcv8MÓ›6mêÓ§]@@»Ôgí_ÛÈ-.1cBw æþ§G³µµMMMÕö.!$##cãÆnnnéééYYYãÆ›1cû®D")++“J¥„É“'³íÜÜ\š¦cccóòòÔ=«¿ôöö¾|ù²‹‹ËâÅ‹óóóKJJbbbÌÍÍëëë™|}}=z”œœ, Ÿ={FÓtß¾}Ê‹‹“““MLLJJJ˜nû÷ﯭ“ÒÒRš¦uŒðꫯ޼yó—_~yã7&OžÌ–º}ûvww÷´´´œœ‰DâïïßtFØþuŒ¬{‰éàïïÏö` 1Ñ„Bá•+WØ—løÊårú÷«‡‡Çþýû™nݺE©ªªbÞ=þØ>>>yyy›7o¾wïÞéÓ§ÕG`NT©›4iÒýû÷“’’zõê5fÌ6‹utÒâ999L#++‹¢(gggæ¥H$:räó§I¥RÉåò~ýúi›—çÀHb¢EFFK$™LV\\œ’’²~ýzqæÏŸÿÉ'Ÿddddgg‡††J$’V~G—ŸŸ¯ÞhQccãðáÃ=<<233CBBÈïÇ}Í:thxx¸‹‹Ëk¯½FÓ´……E‹0—è!<<ü—_~¹uëÖ’%KØ+KBBB"""d2YNN΢E‹ÆŽÛlILÿ­À¸uä!n+Ï£Ñ4ýàÁƒ   [[Û.]ºH$f/Lýqℯ¯ï€šöÏÔðý÷ß{zzZXX¸¹¹>>ååå:¦ïäädkk¬±ÂÃÃÅb±•••¯¯/{"_½0¶ÿÖŒ¬­­ Σ¡¡èü½ÎÄÄÄÙ³gwä¡]1°ÅSÒÀpâQ'@Û Ñ€?hÀH4à$ð ø‰Ö.Š‹+¹. 3âàùhêÏÉ᫘˜¬·ßîÛµ«)×…´¯ÂÂB±XÌuà ÑfÏžÝñíH&&={.úûßjkos]K»ó÷÷纀?tè=ľ}WÖ®•Þ÷È‘P®kè\pMÿ–Q‘Éò?~Âu- MÏ *d²û4MLL¨#G®s]@ç‚DÓ³cÇn&„¥R%•fp]@ç‚DÓ³ÄÄ ¥RE¡irëVQ^^)×t"H4}ÊÊ*ÉÎ.a¿l15=ú?nKèThú”šú?SÓ?~‚¯±Q™˜ø‡õt6H4½¡i:11£±Q©>ðþýòÛ·5öÚ MonÞ,(*’k 45>Œo<:Mo޹®~ÈÉhlT$%eà2f€ŽDÓ¥R•œ,Ó8äd”–>‘ÉîuxEM?ÒÓóÊËkš}ËÔT€Km:M?Ž¿Aef&dþ™š ضRI§¦þ¹H ÚÏÞà%OO§u릲/£¢Ž¿õÖ°Aƒþø™÷ÊÊZ{{+.JèDðìv!­Ø½{¾ŸßP® è\pÔ üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ hšæº­ÒÒÒ¶lÙÂumQTdmg÷ÌÒ²‘ëBž›——×Ê•+¹®  z­  @*•r]E[89=1Æ8KOOOKK㺠€¶r]@Ë’’’¸.¡³àº€bÐûhωüDþ@¢ Ñ€?x’hÕÕÕ«W¯vvv677wvv^¸paQQóEQ2™LÓÒ{‡8E#ŇDS©TS¦L¹zõªT*-,,<~ü¸………··w}}=×¥@‡2‚ëÑZ´oß¾ÜÜÜœœœ®]»BwîÜ%ñÜQUZZêààÐÊá@ø±¿téR&ÎX666€}©P("""œ‚‚‚ÊËË™áE:tH,[[[¯Y³æàÁƒ"‘¨[·n«V­bGˆ‹‹So4uãÆñãÇÛÙÙYZZzzz&&&B¦NÊÞ•žžîààPWW§­†²²2õ6EQ„GGGv8û.;œ¦éM›6õéÓÇÎÎ.  õsÀg´KHHhM…¶¶¶©©©ÚÞ%„dddlܸÑÍÍ-===++kܸq3fÌ`ß•H$eeeÌíV“'OfÛ¹¹¹4MÇÆÆæåå©7˜Õ'Ñ¿ÿÅ‹ççç—””ÄÄĘ››×××ïÛ·ÏËË‹aùòåï½÷žŽJKK5ÚÙ)²Ã·oßîîîž–––““#‘Hüýý[9G:øûû³ý#>$šP(¼rå û’ k¹\Nÿû÷ïgF¸uë!¤ªªŠy÷üùó4M+•J¶Fl©÷¯ñVee¥B¡`ÚYYYLèTVVZXX*•J‘HtñâE5´!Ñ Ï ,**555m›# ŒŽ:E"Qvv6ûR.—³_t² ÜÜܘ6Ó(,,d^ZYYBLLL4Ú­WYYáãã#‰-ZÄ ìÞ½ûøñã“““/]º$ G¥£†6ÈÏϦ(Š¢('''¥R©Ç90R|ØÐýüü¢££™ÝBˆÍµk×4Æ‹ÅyyyL›iˆD"}àãã“——·yóæ{÷î>}š(•JæÌ™CQ”Žhš&Ïp"‘èÈ‘#Ìß%•J%—Ëûõ맯90R|H´ÈÈÈââb‰D"“ÉŠ‹‹SRRÖ¯_¯1Îüùó?ù䓌ŒŒìììÐÐP‰DbccÓšÎãââòóóÕ„§OŸVþN©T666>ÜÃÃ#333$$„RQQA™>}ºL&;tèPPPŽlllŽ=Z]]¥>i¹\ÞlIÌðˆˆ™L–““³hÑ¢±cÇ>Ï2à)Ny[ÐÊóh4M?xð ((ÈÖÖ¶K—.‰„ÙR?ÖÐÐæäädgg7gÎm§¨š¶ !±±± u©©©®®®æææÞÞÞ'Nœðõõ0`ÓŸŸßàÁƒ™¶¶8гgO{{{æ»Tf¸……Eyy¹Faìð†††ððp±XleeåëëËžõoqŽtÀy40vý ÛÄÄÄÙ³gr…-š1cÆðáÃ×®]Ëu!­Â< ¤ãŇ£NÃT[[{õêÕ3gÎs] @gDk/'Ož?~üG}Ô»wo®kè,Œø>!7kÖ¬Y³fq]@ç‚}4à$ð ø‰Ö.•\—Ð!ÑÚÅ—_žB¨t<#ø®“y(˜Q1éÙóoÿüçûõõ¸®ä¹ùûûs]@Ûô=………?þø#×U<·ÌÌÊý+søpÇ  w®kynÎÎÎ^^^\WÐFhF*44.%嚥¥ù;ÌÌŒ`/€7pMÏjjê»IÓ¤®®áÌ™Û\—й Ñôìûïï(JBˆ‰‰IJŠæcÚ ]!Ñô,9YÆ|•¡T*øáNuõ3®+èDhú$—×\¸ð«R©b^*•ªS§~á¶$€N‰¦O'Oþ¢Rýñ’¢¨ädü:@ÇA¢é“T*#äJÕ•+wKKŸpX@§‚DÓ›’’ª«WóTª?] CQÔñã7¹*  ³A¢éͱc7LL4oo iZ*ÍऀN‰¦7II*õ³h„BT*Õœ”ÐÙ Ñô#?¿ôÖ­¢æî¿ „B“ÔÔÿu|IM?Ž¿IHówÔ76*¥R|ã Ðpס~ää<0à%öenniϞݬ¬Ì™—B¡àñã'=zXsT@g;ÕÛ…H´b÷îù~~C¹. sÁQ'ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð øC¨þ¢°°ðÇäª>qv¶ºyó§gϲ¹.Äè9;;{yy½`'iiiz© M``àŸ^Ój8ª  yþþþô ó÷÷çz> ½h¬ka³ct|YMè«+ÿ¤¤$}õ† 11qöìÙq ø‰üDþ@¢ Ñ€?hÀmL´êêêÕ«W;;;›››;;;/\¸°¨¨ˆy‹¢(™L¦¿ õß!çS>> 66ÖÚÚº•}ž?^®æ•W^i—Òµ{Þ‚ ?6lvKÈÎÎ:tèÌ™3 Å öÙ~+Wï=·%ÑöíÛ—››{êÔ©#F8::þå/Ù¹sçÍ›7…Âf®×5ÚþP´Ç~ÇèÑ£322˜+™üñÇ—^zÉÙÙùÂ… Ì»L¢Q5wî\ssóVÖ`eee£F è·fuêõ°mõ‚?6lvKpvvŽŠŠ*((ÈÏÏo[W°rõÞs[->>~éÒ¥]»vU¨ñ)R(ÎÎÎAAAåååÌpŠ¢:$‹­­­×¬YsðàA‘HÔ­[·U«V±#ÄÅÅ©7šºqãÆøñãíìì,--=== !S§Nݲe 3BzzºƒƒC]]¶4>EB5‚C}8MÓ›6mêÓ§]@@@ëç¨)ŸªªªÌÌLBÈéÓ§'L˜àëë{êÔ)BHQQÑÇG¥£6©TúÒK/ÙÛÛoÛ¶íóéÓ§•¿S*•ºWÁÅ‹]\\¾ùæÝÅ7»œÕëѨMýpìØ1±Xlgg·cÇBHccãªU«zôèáääcaaÑñÇÅ-â|ÃfeddxyyuéÒÅÕÕ5&&FÛ¶§1ZÓ~˜Ê…B¡¶-®hòûÊÕ1ûk\[yM·^õÍ&%%¥OŸ>666E¶VÓû:[¼KÎÖÖ655Uۻ̜lܸÑÍÍ-===++kܸq3fÌ`ß•H$eeeR©”2yòd¶››KÓtlll^^žzƒéP}ýû÷_¼xq~~~IIILLŒ¹¹y}}ý¾}û¼¼¼˜–/_þÞ{ï騡´´T£­1";|ûöíîîîiii999‰„½ß°Å9j–»»ûÞ½{iš6lØáÇ;Ö¯_?𦓓“{õꥻ¶·Þz«¢¢"!!A(>{öŒnr×S¼ŽÙ÷ööfsußìrÖ¶5 öõõ}ôèQrr2SdTT”‡‡Çµk×nß¾ÍSk¬Ófùûûëë¾ÎÖôÃù†ÍéÛ·oXXXqqqrr²‰‰IDDD³ÛžÆh%%%ê}VWWøá‡#FŒ un½­_Ñ:f_ck+¯Ù­—Ýl žž~çΑ#GNŸ>]÷új6¯Ú’hB¡ðÊ•+ê«!—ËÙeäáá±ÿ~f„[·nBªªª˜wÏŸ?OÓ4³¡ÞÖ¶‰7}«²²R¡P0í¬¬,f‰TVVZXX*•J‘HtñâE5´!Ñ Ï ,**555m›#š¦ß}÷Ý¿ýío?633«ªªzúô©¹¹y^^^XXX`` îÚ®_¿ÎN‚¡é´tÌ~RRÛ›Žâ›]ÎÚ FÁ‡V/ÒÃÃãÀÌh?ÿü³î…ÃêàDã|Ãf‡ØÙÙmݺ•(—Ëû÷ïßì¶§1ZÓóeàâÅ‹´Î­÷¹V´ŽÙ×XãÚÊkvëeûöícÆ¿qãÛ¹6ÍæU[Ž:E"QvöÏÉ‘Ëåì÷A¬‚‚777¦Í4 ™—VVV„vëUVVFDDøøøˆD¢E‹1»wï>~üøäääK—. …ÂQ£F騡 òó󃃃™o‘œœœ”Jå‹Ì‘ÏÕ«WÏž=ûúë¯wëÖ­k×®o¾ùæéÓ§™“hºÿ¯X,nÍ$t̾‹‹ ;šŽâ›]έäää¤ÞUAAAß¾}™¶‡‡ÇsuÕa8ß°ÉïÇzÑÑÑ›6mêÝ»÷‚ îܹóàÁƒf·=јcLö›G­_¿~æÌ™OŸ>Õ±õ’çYÑ:f_ck+O÷ÖËvÞ¿Ò¦l[ÍÏÏ/::šIYBˆÍµk×4Æ‹ÅyyyL›iˆD¢6L«Y>>>yyy›7o¾wïÞéÓ§ÙáR©4!!aΜ9Eé¨ùƒð\ËK$9r„ù; R©äry¿~ýÚ< £G¾}ûvJJÊĉ™!“&M:qâĵk×ZL4f£o‘ŽÙoå'MÛrn "{õêÅžŸÎÍÍ}®®:Loؽ{÷V?g÷î]BHŸ>}!“&Mºÿ~RRR¯^½ÆŒCÓt³ÛžÆhLþ²ß ôèÑcÕªUåååwïÞÕ½õ¶~Eë˜ý¦›e³åéÞzÙmƒYmX¶mI´ÈÈÈââb‰D"“ÉŠ‹‹SRRÖ¯_¯1Îüùó?ù䓌ŒŒìììÐÐP‰DbccÓšÎãââ˜ÕÌ6H“ÓÞÇ÷ððÈÌÌ !„TTTB¦OŸ.“É:¤£›£GVWWGEE©OZ.—7[3<$$$""B&“åää,Z´hìØ±Ï³Ì4¹ººŠD¢Ã‡«'Úwß}' ===µÕð\Ú¼ XÚ–³F=­©-88xÆ ׯ_ÏÌÌdN–·2—;RoØï¼óΚ5kΜ9SRR’žž2sæL;;;BÈСCÃÃÃ]\\^{í5š¦-ZÔì¶§1š………ÆD-,,(Šª¨¨Ð½õ¶rE?ïì·X^S6lÈÈÈÈÌÌ\ºti¶XBÚôÍMÓ< ²µµíÒ¥‹D"aÒZýtCCCCXX˜“““Ýœ9s´¢jÚ&„ÄÆÆj4Ôedd¤¦¦ºººš››{{{Ÿ8qÂ××wÀ€L?~~~ƒfÚÚj8pà@Ïž=íí홯œ˜á>>>ååå…±ÃÂÃÃÅb±•••¯¯/{Ö¿Å9Òfîܹ666ìù š¦Åbñ´iÓØ—Újkö¼UÓiµy°mmËY½žfk#MND>{ölÉ’%¶¶¶}úôaΗ߼ySÇÂatðy4ºc7l…BñÅ_ 0ÀÒÒ²OŸ>«W¯®®®fþ×÷ßïééiaaáæævðàAmÛžÆhts[‚££ãèÑ£=z¤cëmÍŠfÖc+gŸÞly:NaB6nÜèîîÞ­[·Y³f=~üX÷Êj6¯(Z-2˜'¨ÑMBĈ̘1cøðák×®åºÐêöíÛC† )--µ··×=&óÄÇR£¾úvEQTFFÆk¯½ÖÊñ›Í+þÜ×Y[[{õêÕ3gÎs]ËoN:Õôþ$Š¢"""¸.­£ <øÃ?|òäIIIIddä¸qãZŒ3€60¦‹¡u;yòä‚ >úè£Þ½{s]Ëo&MšdÔ;¼z”°|ùr‘HDÓôÈ‘#÷ìÙÃuE`pôòaáO¢Íš5kÖ¬Y\WÍóôôüᇸ®ø?GH4à$ð ø£™oôø³¯ÐzOž˜ZÛÙ=³µ}ff¦äºƒžžþÆoè«+#Ú°Mär ¹ÜÒѱÆÎî×å¨fïbüS¢9;;ûûûwT=ð'ÖÖ Êœ[Bˆ•U£½}­m]×®\×Å¥7ÞxÃËËëÅûÑK' ¶Ö´¢Â¢¼¼KM)M‡ZÄ™b±¸i^Q¸`Êp<{Öø×¿n¾w¯Œ¦i¡P P({öì>uê_&M–¸ÒРHKË=}úÖ‰??~\-”J%EëK—»wïÂuF‰fXnß.š4i‹R©b‡…•J%˜¼þzŸI“†L›ö—ž=»sX!èÅÇ•'Nü|òä/y*mbb¢PüqªÁÄ„JIùûðá}9¬ÐH!Ñ Î_œÚ¶í¬z¨1LL(š&E^}ÕU"ùË”)/;9ÙrR!´YAAÅáÃ×SSodfQÅ>›hš>þCö´ÆFå×_ŸÝºõÌÌ™¯nÚÐ¥‹·E‚nryÍÊ•‡ÎËŒŒô{÷ÝQì¡eEEÍèÑ›—.­íÑÚÛ"ù‰fRSÿ' ¦LyYcø¥KY¡¡ñÝ»[îÞ=Ð ½ý*è×Å‹YË–Åwéb¶sç¼aÃ4ÿßÿÞ}òäÙäÉC8©hÆ­´ôIhhüÕ«¹ëÖMûÿ¯…Ÿ.†ÖبüøãÔo¾¹<}ú+Ÿ}`mÝòV B¢=¥RõÕWg¾úêì„ ƒ·l™ccƒ{› ½{eK—Æfe•lÜè€sd‰Æii¹K—Æš˜PÑÑóp‡3羞äâb¿kWˆ»{®ËéDhüQQQ³bÅÁóç3—/Ÿ°b…/®lâDMMýš5Òääkï¾;*2rš™~nÍ( Ñx…¦é½{/oØpìõ×]w옋çu°[·Š–,9ðäIݶmÁ£G÷纜ΉÆC¿üR¸xñê꺯¾zû¯Äu9‚JEïÚunóæS#GºõU£#.ÅàŸž>­_³Fš’ríÝwG}ô‘žÛ®=ª^¾üÛ´´œÈH¿… G5ûˆèH4>KJµŸªMIDATÊX»6ÙݽǮ]!®®\—ÃOçÎe~ðÁ·VVÑÑó†uẜÎwAñY@Àë§N­T(T¾¾_9rërø¦±QyxÞ¼=à̙Ո3C€}4þkhP|òɱo¾¹ýôø!â;ç‰Å¶\—ωÈÉy¼xñþŠÏ?ôó{…ër8PUU»zuâ©S¿|ðÁ\nfŒhð'õõŠ ŽíÝ{ÉßÿµÏ> °´ìD·LýôSÞÒ¥qJ¥jûö¹#Gºs]´ šqòä/«VêÑ£Û®]!ö⺜vÇ\x¼mÛÙqãmÙ2Çή+×A!Ñ yEEò÷ßýå—µk%ü¾eª¸¸244þÿ{°i~âÄè!Ñ@+…BµmÛ™­[ÏL™òò_ÌîÖÍ’ëŠô/5õƇ&:9ÙîÚ5¯_¿—¸.^ ZðßÿÞ 33FGÏ{õUW®ËÑ›ºº†°°$©T¶p¡ODÄ4ssüÄ  Ñ eååO—/ÿöÒ¥,ÞÜ2•™ùpÉ’ØÇ«¿ür~ÏœOhÐ*ì-S^^î_Ü£‡ÿ2HLÌ¥¨¨c¯¼Ò{ÇŽ¹"‘ ×å€>!Ñà9ܸñàý÷ckjê¿þÚ(½M.¯Yµ*á‡î|øáäÅ‹Ç ¸ÜŒohð|žÜ¸Ñßßÿ5®Ë!·n½ÿþêêºmÛŒò;Yh3$è{ËÔÌ™¯nÜèßµ«9'e¨Tô®]ç6o>åíí¾m[££_7m€D}º|9{Ù²ø®]ÍwïžïééÔÁSüøÉ²eñii9‘‘~ø‰“Î ‰zÆ<´ãÖ­¢¨¨™sæŒè°é^»voñâ*½cÇ\//·›.$š0Â} kë7Tªg55×;l’ffN]»¾RUõ½Jõ¬Ã&ªø êÍPåïï?xð`® =»}û¶T*ÅgPð•¶q}z}}½¶ØbÚcÇŽ%„̘1C#¼Ô‡Ó4ýí·ß¾ýöÛ~~~ÿüç?[?GÚÔÕÕ=ýJ¥R¯GÛ´;vìxë­·f̘‘’’¢{*Ð~h<‘““ãæÖÂíÙ çÎ[¿~ýÎ;+**6oÞ̾õý÷ßïÝ»7<<üÛo¿={öì7ß|–””T\\LY»v­§§§z£©?þX,ïÙ³çСCŸ~ú©B¡;vìÅ‹™Î;7zôèäädm5h8þÔÛ­÷ôéÓo¿ýöÖ­[EEEb±˜صk×W_}õÒ¥K}ûöC† ÑQC”””lذaÆ ìÒÒRfê/>G­Ÿ!¤¼¼œm³ èxH4ž9räÑ£G'NœÈì%YYYýüóÏã8::>|ø9ld¾ìíõöÃtË–-4hÐâÅ‹=<lƒ49‰®T*(‹ïß¿ÿé§ŸBž|øùâB[ ¡¡¡»wïÞ³gOhhhjj*3ðå—_^¸p¡T*µ¶þÓϰ‚êëë###Ÿ>}êééùñÇ·uùµL÷´‚‚‚ž>}úÑGÑ4½dÉ™LÖ~•€x⣠(êÿþïÿŒ÷ùh 溃sáÂ…õë×ã3¨GØGƒvT__Ÿ——'“ÉBCC¹®å7?ýôSXXXÓásçÎÅ”<€DƒvtõêÕM›6…„„ôìÙ“ëZ~3|øpæŠ6à%$´#®«€Nßu Ñ€?hÀH40,uuŠº:×U€±Â7ÆáöíÛ\—ÐA²²(ŠêׯS<¬ó¬Öƒ+lÀ Þbm\ììfBWT溎ƒÏ aÍtž-þÑ£ªaÃÖSyô¨ºGë–ÿÀŸá<'~11¡(Š:qBóÁ!­D’˜x•¦i•ŠNH¸Êu-`”h`(îÝ+»y³P¥¢iZõóÏ…”s]$ŠÔÔ¦¦Ì/WQB¡ÉÑ£ÿ㸠0BH40‡]U(”L[¡P%%ep[#$„ÌÌâ{÷ÊØ/uišÎÉyü믺~·  )$„#G®ÿ~Èù33Á‘#×¹ªŒ ¸GÓtbâOJõ J©TÖy®Å½@¢÷®_¿ÿèQuÓáV^¿þ ãëã…Dî>¬yÈÉÀ'×…€QÂ_?à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ð ø‰üDþ@¢ Ñ€?hÀH4à$ðEÓ4×5ðJZZÚ–-[¸®ÂˆUTXBììê¸.Ĉ­\¹ÒËË‹ë*¸}4=+((J¥\WaÄììêg/B*•p]g„\ÀOIII\—EQ\—À%ì£ Ñ€?hÀH4à$ð3ÕÕÕ«W¯vvv677wvv^¸paQQóEQ2™LÓÒ{‡†0Eª ™L¦P((Š*++{®ÂØÿRWW·nÝ:777 ‹ž={J$’ôôôv Ð/\½Á •J5eÊŠ¢¤Riß¾}>|¸gÏooïììlsss®«3çÏŸ:t(ûÒÚÚÚÄÄ$66ÖÚÚºm.[¶,--í›o¾8p`UUUbbâ¸qãJJJºu릧’¡}!Ѹ±oß¾ÜÜÜœœœ®]»BwîÜ%ñ¡(ª´´ÔÁÁ¡•Ã_œ•••ÆÀ¹sç¶¹Ãäääo¿ývôèÑ„=z¬[·néÒ¥Ì:£€£NnÄÇÇ7ý¨ØØØö¥B¡ˆˆˆpvvvpp *//g†SuèÐ!±Xlmm½fÍšƒŠD¢nݺ­ZµŠ!..N½ÑÔ7Æogggiiéé陘˜H™:u*{ WzzºƒƒC]]¶Ø#;¦Í\Øéèè¨qħ>œ¦éM›6õéÓÇÎÎ.  õs¤ÍÓ§O+§T*ÕëÑ6-F}}ý|гgOGGǯ¿þšnffvÿþýfWJÓYnåºÐ1B³kù_/^tqq¡(Jc466ê^& z•К¥jkk›ššªí]BHFFÆÆÝÜÜÒÓÓ³²²Æ7cÆ ö]‰DRVVÆÜn5yòd¶››KÓtlll^^žzƒéP}ýû÷_¼xq~~~IIILLŒ¹¹y}}ý¾}û¼¼¼˜–/_þÞ{ï騡´´T£­1";|ûöíîîîiii999‰Äßß¿•s¤m)©Ó˜œŽieddDDD¸¸¸\¾|9++‹Ù#c*ܼy³@ ð÷÷ß¿QQ‘ÆäšeÝ•ë¡ÙµÀü/ooïË—/ïÚµKch[êu&$$´8_!Ñô¬•‰& ¯\¹Â¾d?–r¹œþýSçáá±ÿ~f„[·nBªªª˜wÏŸ?OÓ4³W¢ÞÖˆ-õþ5Þª¬¬T(L;++‹ùˆVVVZXX*•J‘HtñâE5´!Ñ Ï ,**555m›£fgJ}r:¦•‘‘ѧOŸ½{÷2ïÞ¼yS½ò+W®¬X±bÈ!E 6ìÌ™3s¡1˺+×=B³kù_IIIÌjÒX#Ú–†úìwæDÃQ'7D"Qvv6ûR.—³_t² ÜÜܘ6Ó(,,d^ZYYBLLL4Ú­WYYáãã#‰-ZÄ ìÞ½ûøñã“““/]º$ G¥£†6ÈÏÏf¾—trrR*•zœ£ÖO‹R\\ܯ_?¦Í6!UUU#FŒØ²eËÏ?ÿ\TTôÆoLŸ>]ãˆUC‹•ë¡ÙµÀpqq!Í­‘¶.Î‰Æ ??¿èèhöÔ͵k×4Æ‹ÅyyyL›iˆD"}àãã“——·yóæ{÷î>}š(•JæÌ™CQ”Žhš&Ïp"‘èÈ‘#ÌßR•J%—ËÕÓD¿tOK,³QrrrØáüî»ï˜v¯^½6nÜXWWWQQÁ iÃ,ë¦m-µÔÓX#úš4_!ѸY\\,‘Hd2YqqqJJÊúõë5Æ™?þ'Ÿ|’‘‘‘*‘Hš~¯×¬¸¸¸üü|õir½±±qøðá™™™!!!„æs;}út™LvèС   5ØØØ=z´ºº:**J}Òr¹¼Ù’˜á!!!2™,''gÑ¢EcÇŽ}žeö|tOkÞ¼yüñ•+WîÞ½«þýC@@ÀªU«NŸ>]\\|ûöí•+WŽ1ÂÃÃhŸå¡m-¨ÓX#Юwùª•çÑhš~ðàAPP­­m—.]$ ³¤~­¡¡!,,ÌÉÉÉÎÎnΜ9ÚNQ5mBbcc5ê222RSS]]]ÍÍͽ½½Oœ8áëë;`À¦??¿Áƒ3mm58p gÏžöööÌw©Ìp ‹òòrÂØá áááb±ØÊÊÊ××—=ëßâ5KÛ»L=º§U__¿bÅ æ»Î°³PWW·víZWWWSSS±Xúè£Þ½{s]Ëo&MšdÔ;¼/È׈C¢ÁfÍš5kÖ,®«€?`1W *½·°PGŽzÿ¨/Eg{ ŸÇâaoŠÁVú:è¿™¤1$ôR§W,–ªà¨@ŠË56¾ÀÔÜ-¾,mê¸Î/æè¹– òr5¥T*S(Vf8ö9u’ Õ£w›ùóa=Í<{Ò¡UŒ÷r¯+ÉådDÏF$è°…£é¿`zþ»ÎúöN‘µÜ®0Q3£~_^Ëóâ¯N=ˆvpTà±LžT}ˆîkq†Òm<¼ÎÓ?Zh¿X£ï_þÝ¥[)ƒ `gêÃa_Ô*äÔ2`'=õ´Fÿ2EâÁPú ÷»›l=8‹Wv°%THqÉ¿<"¤ïG¾ÆxH{#ÆÖ«aÔJÕÞ‡—m‹„ çñKsÿàñVŠØ¡°·MâÒ^ TÁ– Ý›r¥ß½ømüÿ_™?ªWİ÷#uIEND®B`‚glom-1.22.4/docs/libglom_reference/html/ftv2mo.png0000644000175000017500000000062312234777145023263 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÚ}\ˆZIDATxí1Kû@ÆiƒØB…Ò¡(h¬"EÄI'ÁoàªèÚ©ßÀáâä 8ùçR-‚â B«TPˆï]z¥B’3 _Þã’»ç}ŸË]VÇ÷}€ÌÈdIæ®i쟯JØ–b¸šÍÃõ+º™|KÂ…°,[Pï\ʘMÆ¢#€ä…F`JݤìÛk³úA±àþè?ØY4ck6"¹Z)ê¸0SHM¨@ï㋺WÖmo¼4èHJ¨Àÿö+…QobŒút ¤ú’*Ð~êè8_+3Y-ñðÜå½÷ ˜PwA¶+^ý}ºì£+xìhÏ•MAE]€TD~EÞߴ^R)`ÖAùŸÏ9©pÔq-Û¾õÛ3tÝÊÆ›ˆÃTÐHÈ)€ ½Š’ICªxëd#1ôú§é€ m@Vüý?Zæßgo_½3-³\IEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_func_0x69.html0000644000175000017500000001107712234777147026046 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - i -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1predicate__FieldHasName-members.html0000644000175000017500000001121212234777147032620 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::predicate_FieldHasName< T_Element > Member List

        This is the complete list of members for Glom::predicate_FieldHasName< T_Element >, including all inherited members.

        operator()(const T_Element& element)Glom::predicate_FieldHasName< T_Element >inline
        operator()(const sharedptr< T_Element >& element)Glom::predicate_FieldHasName< T_Element >inline
        operator()(const sharedptr< const T_Element >& element)Glom::predicate_FieldHasName< T_Element >inline
        predicate_FieldHasName(const Glib::ustring& strName)Glom::predicate_FieldHasName< T_Element >inline
        ~predicate_FieldHasName()Glom::predicate_FieldHasName< T_Element >inlinevirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1GroupInfo-members.html0000644000175000017500000004102012234777147030071 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::GroupInfo Member List

        This is the complete list of members for Glom::GroupInfo, including all inherited members.

        clear_title_in_all_locales()Glom::TranslatableItem
        enumTranslatableItemType enum nameGlom::TranslatableItem
        get_has_translations() const Glom::TranslatableItem
        get_name() const Glom::TranslatableItemvirtual
        get_name_not_empty() const Glom::TranslatableItem
        get_title(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_or_name(const Glib::ustring& locale) const Glom::TranslatableItemvirtual
        get_title_original() const Glom::TranslatableItemvirtual
        get_title_translation(const Glib::ustring& locale, bool fallback=true) const Glom::TranslatableItem
        get_translatable_item_type() const Glom::TranslatableItem
        get_translatable_type_name(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        get_translatable_type_name_nontranslated(enumTranslatableItemType item_type)Glom::TranslatableItemstatic
        GroupInfo()Glom::GroupInfo
        GroupInfo(const GroupInfo& src)Glom::GroupInfo
        m_developerGlom::GroupInfo
        m_map_privilegesGlom::GroupInfo
        m_translatable_item_typeGlom::TranslatableItemprotected
        operator!=(const GroupInfo& src) const Glom::GroupInfo
        Glom::TranslatableItem::operator!=(const TranslatableItem& src) const Glom::TranslatableItem
        operator=(const GroupInfo& src)Glom::GroupInfo
        Glom::TranslatableItem::operator=(const TranslatableItem& src)Glom::TranslatableItem
        operator==(const GroupInfo& src) const Glom::GroupInfo
        Glom::TranslatableItem::operator==(const TranslatableItem& src) const Glom::TranslatableItem
        set_name(const Glib::ustring& name)Glom::TranslatableItemvirtual
        set_title(const Glib::ustring& title, const Glib::ustring& locale)Glom::TranslatableItem
        set_title_original(const Glib::ustring& title)Glom::TranslatableItem
        TRANSLATABLE_TYPE_BUTTON enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CHOICEVALUE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_CUSTOM_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_DATABASE_TITLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_FIELD enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_IMAGEOBJECT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_INVALID enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_LAYOUT_ITEM enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_PRINT_LAYOUT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_RELATIONSHIP enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_REPORT enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TABLE enum valueGlom::TranslatableItem
        TRANSLATABLE_TYPE_TEXTOBJECT enum valueGlom::TranslatableItem
        TranslatableItem()Glom::TranslatableItem
        TranslatableItem(const TranslatableItem& src)Glom::TranslatableItem
        type_map_locale_to_translations typedefGlom::TranslatableItem
        type_map_table_privileges typedefGlom::GroupInfo
        ~GroupInfo()Glom::GroupInfovirtual
        ~TranslatableItem()Glom::TranslatableItemvirtual
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1NumericFormat.html0000644000175000017500000004662612234777147027325 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::NumericFormat Class Reference
        Collaboration diagram for Glom::NumericFormat:

        Public Member Functions

         NumericFormat ()
         
         NumericFormat (const NumericFormat& src)
         
         ~NumericFormat ()
         
        NumericFormatoperator= (const NumericFormat& src)
         
        bool operator== (const NumericFormat& src) const
         
        bool operator!= (const NumericFormat& src) const
         

        Static Public Member Functions

        static Glib::ustring get_alternative_color_for_negatives ()
         The foreground color to use for negative values, if m_alt_foreground_color_for_negatives is true. More...
         
        static guint get_default_precision ()
         Get the number of significant figures we should allow to be shown until we show the awkward e syntax. More...
         

        Public Attributes

        Glib::ustring m_currency_symbol
         String to use as the currency symbol. More...
         
        bool m_use_thousands_separator
         Setting this to false would override the locale, if it used a 1000s separator. More...
         
        bool m_decimal_places_restricted
         Whether to restrict numeric precision. More...
         
        guint m_decimal_places
         The number of decimal places to show, although it is only used if m_decimal_places_restricted is false. More...
         
        bool m_alt_foreground_color_for_negatives
         Whether to use an alternative foreground color for negative values. More...
         

        Constructor & Destructor Documentation

        Glom::NumericFormat::NumericFormat ( )
        Glom::NumericFormat::NumericFormat ( const NumericFormat src)
        Glom::NumericFormat::~NumericFormat ( )

        Member Function Documentation

        static Glib::ustring Glom::NumericFormat::get_alternative_color_for_negatives ( )
        static

        The foreground color to use for negative values, if m_alt_foreground_color_for_negatives is true.

        Returns
        the foreground color, in a format recognised by XParseColor
        static guint Glom::NumericFormat::get_default_precision ( )
        static

        Get the number of significant figures we should allow to be shown until we show the awkward e syntax.

        This should not be used if m_decimal_places_restricted is true.

        Returns
        the number of significant figures to show
        bool Glom::NumericFormat::operator!= ( const NumericFormat src) const
        NumericFormat& Glom::NumericFormat::operator= ( const NumericFormat src)
        bool Glom::NumericFormat::operator== ( const NumericFormat src) const

        Member Data Documentation

        bool Glom::NumericFormat::m_alt_foreground_color_for_negatives

        Whether to use an alternative foreground color for negative values.

        Glib::ustring Glom::NumericFormat::m_currency_symbol

        String to use as the currency symbol.

        When the symbol is shown in the UI, a space is appended to the string, and the result is prepended to the data from the database. Be aware that the string supplied by the Glom document might have no representation in the current user's locale.

        guint Glom::NumericFormat::m_decimal_places

        The number of decimal places to show, although it is only used if m_decimal_places_restricted is false.

        bool Glom::NumericFormat::m_decimal_places_restricted

        Whether to restrict numeric precision.

        If true, a fixed precision is set according to m_decimal_places. If false, the maximum precision is used. However, the chosen fixed precision might exceed the maximum precision.

        bool Glom::NumericFormat::m_use_thousands_separator

        Setting this to false would override the locale, if it used a 1000s separator.


        The documentation for this class was generated from the following file:
        • libglom/data_structure/numeric_format.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Formatting__inherit__graph.png0000644000175000017500000000700112234777145031663 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¨uU‰=bKGDÿÿÿ ½§“ ¶IDATxœíP×Çï& 4±B‘ZêXŸµVl,Öæ!"+#ŠÌP§Lm+X@qZZ­eœ*­Eœ2 @@hÅŠ•: <§}ŒÈùý’bH²ï[w¶IŒ1„¤í½Ÿ¿Îîžœsî~ïÞ{³YX‚$I€A†¥ ÀX,<¢`á (XxT!iH$K—ƒ™/$ ]k–Nó—…™W¢¢¢4öè>22Ò,Å`̇¶ðxŽG,<¢`á (XxD1RøÉÉɤ¤$77777·¸¸¸þþ~xˆ ˆ††ÓU¨#àÜS48N@@€þ€fT*•AŒÍ¥6˜N#ˆ©"S#¼Z­^¿~}]]]qqq__ß?üÀf³§§§MU–¨®®–Ëår¹¼µµuéÒ¥áááJ¥rŽ1™Lf^^ž½½½I*œßÈÚwîÈ'‘““³hÑ¢©©)úN¹\®T*á¯ûõõõO b8ÚçžB#‚T*´¶¶^ƒÆÑÑÑѹÔc†€wâÏœ9“ðÌ3ÏÐwr¹\&“Im*•Ê´´477· lÙ²žYAÀÞÞ>55õܹs|>ßÁÁ!11‘rÈÏϧz¨¯¯°µµ]¼xñ©S§H’|ø¸ò6nÜ(“É$ åFeøúúÖÖÖÞ¾}{åÊ•6lx¢d@ëŠ7Fx‹õÛo¿ÑƒBär9u޼½½sss¡CSS`bb­®®&IR¥RiØKõÏãñ233áN¹\îããsæÌ¸ÙßßÏd2ïß¿¯í¦=—3™Ìk×®‘$ùÒK/éŒ3ŽÃéŒ$É––ºÂëi~ii)Õdø)å566j¸Ñï¿ÿúß¼y“ ®máêù|~kk+]ojIOÑÛÛëéé mhôõõÁM;;;ƒÁаŸ 8Àfee:tÈÝÝ}ûöí·oßîéé‰ŽŽ†kuWWW•J“j¸ÁZÜ §§§‡‡‡OMMuvvêŒOKK âóùñññzÊÓÓ|WWW&ë,O è93TpzpÃ1FøÐÐЬ¬,Ø\.÷Æ> ££ÚÐàóùF主»wvvR›mmmÀºu뺻»‹ŠŠ\\\Þ|óM’$ËÊÊ`V«Õr¹üÅ_ÔvƒÝÔÎÎŽËår¹Ü… &&&J¥Ò¶¶6>Ÿ¯3$((¨££ãÈ‘#]]]?ýô“žšõ4vY::ËÓv£s÷î]úÙ0âÜ#üþýûE"QCCÃàà`IIIzzº†Ï¶mÛ¾øâ‹úúúÖÖÖ>ø@$q¹\C‚çççC™)#66655õòåËCCCµµµ111ááá<°téÒ”””çŸ~ùòå$IÆÇǧ¥¥544´··ÇÇÇ …BSÃÍfk$e³ÙAÈd²˜˜ ³³³+V¬ðöönnnމ‰Èd2xH.—Ýü'–§Íêëë››› ?·‚>î8Ç“$ÙÓÓ³eËGGG[[[‘H;5}ŽŸ™™INNvuuåñx›7o¦OÔ„­ÓäååÑ ¥Rùå—_úúúr8¤¤¤ÉÉIø©+W®øûû³ÙlOOÏsçÎÍÌ̤¤¤;;»¸ZÔv#u­œW¯^=<<¬3ô///_¼x±M``àÅ‹CBB|}}I’ b³ÙR©”|4Ø|¸_gy‹ ãàÁƒ^^^›6my¢^À$‹;ŒeÑ|Ä‹;Ì?Oà`þâ¦øã'|Å# Q°ðˆ‚…Gt…¿wïá½{-]…Åбª‡¿6þã©«!bÅ gKbt¯ýðý?/òèÑRKb“|)üÛ1<<±lY:A€ÆÆô… Mÿ¤Ô_Dçø‹ÿÇ`A\¼ø»¥k± ˆ _XXG’¤ZMJ$u–®Å2 (|Wר­[}j5I’êßïëé1ꙵ¿9( _^~ÓÊ >J°XŒ þká‚,ŠÂÔ)•<>¤Tª‹Šê-[E@NøææÁ®®1ê« I’íí#wî Z´( €œðeeÆù?°¶f–•5ZªK–ð$IþgvVEß93£*.n@í~ZÂ76vOjïolì1=-áKK5Çy‚£=BÂ+•ê’’q23£*)iP©Ôæ¯ÊR $|míÝññVV kk–µ5ËÚšimÍ„¶•C.WÔÖvXºFóÐÖVVÌ}ûDÔfIÉ @xø¿¨=,B—¢¿ÎÞ{/pòä6Kbêã:XxDÁÂ# Q°ðˆ‚…G,<¢`á (XxDÁÂ# Q°ðˆ‚…G,<¢`á (XxDÁÂ# Q°ðˆ‚…G,<¢`á (XxDÁÂ# Q°ðˆ‚…G,<¢`á (XxD1Á¿B©©©ùꫯLR9‘É8ï¥ yjvïÞ0Ç &øçG½½½ÅÅÅ«W¯ž{(ó3:jé ž’k×®‰Åâ¿„ðÏ>ûÌT¡0zÐx³¹Ñà9Q°ðˆ‚…G,<¢`áŬÿËV¡PäææVWWËårGGÇåË—ïØ±cÁ‚¡Pøí·ßúøø˜*—öê×´ñ A¥R—••=ûì³æÌkæž$Éääd‚ ÒÓÓ]\\¤RiEEEBBB~~¾••Õ|dÌÌÌôòò¢6mmmç#‹ ÆÞ½{ÍŸ×Ì7Ô_ºti``àðáÃ~~~\.×ÓÓó£>ÊÉÉa2u¼9À$p8; Æ<6V(NLLhØA¬]»vžºõ1ŸðUUUaaal6›¾SC•J•““¹aÆLNþñ¡PxõêU±X¼~ýúìììŸþ9""âwÞÉÊÊ¢ªªªèàÁƒSP«Õúãߺu+**ª²²R®öööÄÄÄÐÐÐØØØ_~ù<šVÂÂÂ&&&è6 u¡Pxýúu±XZZZ P*•YYY7nŒˆˆøñÇßzë­–––y:ùÚ˜OøöövOOOý>‰äêÕ«ééé'NœÉdGŽ¡]¹r%'''%%åìÙ³UUU§OŸNNN.**ìÝ»×ßߟn>þøã?¢­­Müììì´´´5kÖèÏõùçŸ ‚ï¾û®  @,gdd(•ÊêêjœËé¶FëÊÊʲ³³÷ìÙsâĉÙÙY‰DRSSsøðá£G^¾|Y¥ÒñêŒùÃ|s¼B¡ Ÿ jñUQQaggíÊÊÊmÛ¶ùùùvíÚ«P(àéàà°jÕ*ÀæÍ›){rrÒÅÅeíÚµ0e]«9=ñÅbñ+¯¼Ýôäúæ›o8¥–,Y2;;{ÿþ}×n¡¡¡\.÷7ÞP©T …âÒ¥K[·nõöö|øá‡qqqOwBç†ù„wrrêíí}ùå—áfEEÅôôtDDÝgdd„ÏçC£££îîî‡ BÃ~*ôÄî¹ç(7=¹¦¦¦Îž=ÛÔÔÔßß/ž*;üþB…¢ó´¡æŽù†ú•+W^¸pε;;;í)ÍÙÙy``Úp wrr2a zâØvíÚ500°sç΂‚úLa)œœœ` ª*³a>ácbb¤RijjjKK‹T*ýõ×_sss5|BBBòòòîܹÓ××wìØ±€€jÐOUU<‰”¡£ãS¨T*???@ÐÝÝ‘‘¸wïÀ’%Kâââ Þt[[·n]¶lYbbbjjªH$°Xæ›yMðNaaaTT\ÍbŒ£««kÇŽeeeú=…B¡D"‰ŒŒœcF|¯Þblß¾ýäÉ“ …B&“>}úÕW_}¢ê& o1>ýôÓ–––ˆˆˆèèè$%%™3;B/ü«áááaÁ‡Tñ(XxDÁÂ# Q°ðˆb²U½©ôǘܹëëë»~ýºIªÁB``àÜÍC÷ýñˆƒçxDÁÂ# Q°ðˆò»Ó’L´y‘IEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Button.html0000644000175000017500000016250712234777147030335 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Button Class Reference
        Glom::LayoutItem_Button Class Reference
        Inheritance diagram for Glom::LayoutItem_Button:
        Collaboration diagram for Glom::LayoutItem_Button:

        Public Member Functions

         LayoutItem_Button ()
         
         LayoutItem_Button (const LayoutItem_Button& src)
         
        LayoutItem_Buttonoperator= (const LayoutItem_Button& src)
         
        virtual ~LayoutItem_Button ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        bool operator== (const LayoutItem_Button& src) const
         
        virtual Glib::ustring get_part_type_name () const
         
        Glib::ustring get_script () const
         Set the python code that will be executed when the button is pressed. More...
         
        bool get_has_script () const
         
        void set_script (const Glib::ustring& script)
         Get the python code that will be executed when the button is pressed. More...
         
        - Public Member Functions inherited from Glom::LayoutItem_WithFormatting
         LayoutItem_WithFormatting ()
         
         LayoutItem_WithFormatting (const LayoutItem_WithFormatting& src)
         
        LayoutItem_WithFormattingoperator= (const LayoutItem_WithFormatting& src)
         
        virtual ~LayoutItem_WithFormatting ()
         
        bool operator== (const LayoutItem_WithFormatting& src) const
         
        virtual const Formattingget_formatting_used () const
         Get the field formatting used by this layout item, which may be either custom field formatting or the default field formatting. More...
         
        virtual
        Formatting::HorizontalAlignment 
        get_formatting_used_horizontal_alignment (bool for_details_view=false) const
         Get the alignment for the formatting used (see get_formatting_used()), choosing an appropriate alignment if it is set to HORIZONTAL_ALIGNMENT_AUTO. More...
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Public Attributes inherited from Glom::LayoutItem_WithFormatting
        Formatting m_formatting
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Constructor & Destructor Documentation

        Glom::LayoutItem_Button::LayoutItem_Button ( )
        Glom::LayoutItem_Button::LayoutItem_Button ( const LayoutItem_Button src)
        virtual Glom::LayoutItem_Button::~LayoutItem_Button ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Button::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Implements Glom::LayoutItem.

        bool Glom::LayoutItem_Button::get_has_script ( ) const
        virtual Glib::ustring Glom::LayoutItem_Button::get_part_type_name ( ) const
        virtual

        Implements Glom::LayoutItem.

        Glib::ustring Glom::LayoutItem_Button::get_script ( ) const

        Set the python code that will be executed when the button is pressed.

        LayoutItem_Button& Glom::LayoutItem_Button::operator= ( const LayoutItem_Button src)
        bool Glom::LayoutItem_Button::operator== ( const LayoutItem_Button src) const
        void Glom::LayoutItem_Button::set_script ( const Glib::ustring script)

        Get the python code that will be executed when the button is pressed.


        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_button.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Line__inherit__graph.png0000644000175000017500000001222512234777146032760 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¥ÃläFÊbKGDÿÿÿ ½§“JIDATxœíkPWûÀÏ(ƒ†¯%$Š"^:Nm™‚ŠÆAS5yG@„ë0j뀭è€:à•©SŽ‚¼) ÈMë¥XðRKlµRlh"×D@löÿáÔu  `"žó><{öäœg÷ÇîÙì&9EQƒ ,C'€Ñ+Ø7Z`ßh}£öƒÓ§O:Ì8ãííÍTl<°¶þÆpøða’A|ûúúê%Ì+';;[£ßh}£öØ7Z`ßh¡£ïÎÎÎ;vSSS@ÔØØW!•JÇ/C@ Æ8v1ÆÖ‚hmmU›ã¾‹FÎ ïdžE­V¯Y³† ˆœœœ™3g655%%%¹»»WWW›ššŽ{Šííí0°²²*))Y¸p!ÀÒÒrÜ;B]|Ÿ8q¢¦¦F.—Oš4 `kk¿oß>cc]Z‡CÇl6›¹¨‚P*•666´} t9Ÿgddlݺʦáp8FFFôbTT”@ °±±ñ÷÷okkƒåAdffòù|KKË]»v:uŠÇãMž<9,,Œ®žžÎ †‚ ˆ«W¯N›6-44ÔÓÓ“Ëåš››»¸¸deeÑ ù|>—Ë=zô(,¬¨¨pss³°°pppHNN¦[»}ûöÀF‚ØÚÚ¶¶¶Z’——çààÀáp¼½½>|H—S7cÆ .—ëããCïæ&ÐíUyØ=6:Þ?§†ÃÊʪ  `¨µpŸ8pÀÑѱ¼¼\&“­X±ÂËË‹^+‹[[[srr«W¯¦ãššŠ¢ÒÒÒ 3Ðh™¹èîî~ýúõiÓ¦mÙ²¥¶¶¶¥¥%99ÙÔÔT¥RÁ "‘èŸþÉÍÍ566~öìEQ3gÎ onnÎÍÍe±X---°Ù9sæ ÕˆR©¤(JK…E‹ݹsçîÝ»|ðÁêÕ«éT92kÖ¬²²2¹\.‹é[ÙÌ ¡Û×RYûÓ‚···Æýs]|—––2÷;¤½½Þ''§ÔÔTX¡²²ðøñc¸¶¤¤„¢(’$5b¦ËAè;;;›¢¨ŽŽŽþþ~X(“Éè=8sæ Ý>,är¹‡†•ÛÛÛûûûa³Z– p+(Šúí·ß=‚m:;;gddÀUFFFÝÝÝÔ¾µTÖy ô­ËùœÇãUWW35Óç4õõõŽŽŽ0†ACC\d³Ù‹¥ëÀ´iÓQQQ</88˜YÁÞÞ^£ý„„„¸¸¸éÓ§òÉ'UUUô¤¥‘a+Ìš5 sçÎ477ÃÅÚÚÚ€€ø†ÂÞÞž$Iz' DKåqÜcº¼L"‘$$$À1‡Ã¹uë–F>Ÿ¯P(` §[ŠZ€›íáá¡P(WWW''§{÷î‚çgÔAY¸paDDÄ´iÓÞ{ï=Š¢ÌÌ̆m¾!ÔR!""âîÝ»•••Ÿ}ö™ý^1000**J*•Êåòàà`¡P8hJ°ýV+Ì“ûÇoŠ¢Ðv Nœ(ŒÌqu™Ÿbè\ô Šã÷™3R‚RiíÇO ‹¾AÎw}ý#©´Ž¢‹Eäçÿfètô r¾ o±$©ÎÉ©0t:ú9ßYY$©P¨¬lT(”†ÎH¯ å[&k©®n¡/QMLŒÎžýݰ)é´|ünbòâCÓ}}dVÖ¯ÌGÿ 䛢¨¬¬Š¾>’YXW×ö矚¶|ƒAÈ÷;õí…&&ÆgÎ t•Žïüüߘ'sH__vv:7PñM’êÜ\©ÆÉ¢T>‘Jïë=#ÀŠïòrE[[÷ «LLŒÐ¹ñ‚Šïsçn@¼õ–1ü311¢c’¤ ~‡oÊßx^É7x_C\\ì¿új-½¸oß¹ÿþ÷]gç_yéèè±¶f"5½‚âó1÷ebâ&‰d¡¡Ñ7¨œÏ1ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-Æô{eee‡ÇlôFc£%—ûÌܼÏЉŒ77·íÛ·ëüò1ßõõõp¢ù ‡½ý“‰(»¼¼¼¬¬l,-ŒÃï31§#żRàü¯cßh}£öØ7Z`ßh¡'ß;v즦¦ ((¨±ñßY‚J¥ãØ×¸7øö¨3úð­V«×¬YsóæÍœœœ†††sçΙ™™¹»»«T*=ôŽa¢ßG>qâDMM\.Ÿ4iÀÖÖ6>>~ß¾}ÆÆø×™ ‚P*•666#,MÐÇñ‘‘±uëV(›†Ã὘]¢¿¿?**J ØØØøûû·µµÁr‚ 233ù|¾¥¥å®]»N:Åãñ&OžFWHOOg¹}û¶§§'—Ë577wqq ¯]»–¾\^^nccóôéÓ¡rhmmeÆAlmmérz-]NQT\\ÜŒ3¸\®ÏÈ·èÕB8Ÿð°Õ¬¬¬ †Z ¨¨¨8pà€££cyy¹L&[±b…——½V,·¶¶Â·«W¯¦ãššŠ¢ÒÒÒ 3€ 2»˜3gΖ-[jkk[ZZ’““MMMU*Õ‰'ÜÜÜ`…mÛ¶}úé§ZrP*•±F!Ý#]~äÈ‘Y³f•••Éår±XLÏÓ;ìiÁÛÛ[c¾ßÑ¢ßÆÆÆ¥¥¥/º|N{{;õ|g999¥¦¦Â •••€Çõ%%%E‘$©kHe¶¯±ª£££¿¿Æ2™ *éèè033khh I’Çã]½zUK:øvvvÎÈÈ€…FFFÝÝݺmÍØ}ëã|Îãñª««™šé‹sšúúzGGGà¡¡.²Ùl‹ÅÒˆGNGGGTT”‡‡Ç †…S¦LñôôÌÍͽvíš±±ñÒ¥Kµä µµµAaooO’ä8n‘Î裉D’ÿ…çÖ­[uø|¾B¡€1 x<'<<< ÅÁƒïß¿éÒ%ºÜ××7''çôéÓ~~~AhÉ—£ÒÏãñòóóáQ¥V«ÛÛÛgÏž=^[¤3úðÝÜÜ,‹¥Risss^^^ll¬FM›6íÙ³§¢¢¢ºº:$$D,s8œ‘4žžž^[[Ë ]]]Ï!I²¯¯ÏÕÕÕÉÉéÞ½{€GÖ­['•J333ýýýµäÀápΞ=ÛÙÙ¹oß>f×ííš³×1Ë£¢¢¤R©\. …£Ùg¯Œ± #¿)Šzðà¿¿¿•••………X,†Gsüîíí ···çr¹~~~C c@ZZšFÀ¤¢¢¢  ÀÁÁÁÔÔÔÝÝýüùó"‘hîܹ°‰D2þ|•Ã?ü0uêTkkkxýË=<<ÌÌÌÚÚÚ4£Ë{{{#""ø|>›Í‰DôµØ°[¤…±ßcú|KVVÖ† ÆÒ‚ÁñòòruuŒŒ4t"#>ÿËнÞÓÓsóæÍŸ~ú) Àйèt}_¸pÁÓÓó믿ž>}º¡sÑøŽæY¿~ýúõë …¾A÷øFì-°o´@Ô÷ £¢¾¿ýö"šÊÇáú>ôP°¦Ný¿˜˜ÏUª†ÎdÔx{{ååcº¿ÖÐÐpãÆ±toîÝëøßÿÚúûÏ2t.£F ¸¹¹éürçÿ IÏË»ennZUµ÷­·ÐºÜøÝÝ­*,¼CQàéÓÞŸ~úÓÐéèä|_¾\ÕßOX,V^žæcø7ä|çæJá&I’?ÿ\ÕÙùÌÐé´|··w_¹òIªá"Iª/^¼kØ”ô Z¾/\¸«V¿X$"7wb|/d¼@ËwNŽ€ïGHR]Zú·RùÄ€)é„|·´<¾yS¡V¿ôþ“ ˆsçî*%ýƒïÂÂÛ,–æ­@Š¢rr* ’A@Èwvv…š9zP«Õ·o×××?2HJúßµµÊÊÊÆÁî%ÆÆ¬‚‚ßõŸ’A@Å÷¹swü¹N_™“ƒÊU:*wåò‡sç¾M/ÖÔ(§NÌf›ÂEcc£‡Ÿüç?–ÊN ø¼Àã}™˜¸I"YhèDô *çs ûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF ì-°o´À¾ÑûF‹—~¿e‚þ~½ì;w~}ö¬zøªÍßÇgN& çżIhÌ/;Èï3•””è?-Ì« &&F£ßh}£öØ7Z`ßh}£…޾{zzŽ;æëë»råJ__ßo¾ù¦µµ® …2™lü2ÿ_‡vA’¤P(|üøñ+íW—ßG¦(*<<œ ˆØØX;;»¶¶¶Â­[·¦§§›˜˜Œ{ŠˆÀb±"##-,,^m/:¼æâÅ‹MMMß|óͼyó8Ž££ã_|‘’’bdd4îù顎-=s‚ V®\ùª]|yyy™™™1 Ùl6‹õ¢5’$SRR|}}×­[·wïÞÎÎNX. ‹‹‹}||Ö¬YsüøñŸþÙÛÛ{íÚµ t…¢¢"f0¹\&‘HD"ÑæÍ›¯\¹ˆˆˆÈÎΆªªªÖ­[§R©†ÊVc¡PðòòÒPË,§(êäÉ“7n”H$111#ߢ‘C'& oܸáãã#‘HΜ9ª÷Ñ¢‹o¹\îè訽ÎéÓ§‹‹‹cccããã=ztðàAzÕåË—SRR"""Nž>¾¯¯OKï£Bß===Ìý"|NWW]xáÂ…M›6Í›7Ï燆†þòË/===p•¯¯ïäÉ“—.] ðóó£cø?»råJ;;;f0cÇŽmÛ¶íí·ß¶²²Z°`A___ww÷’%KþþûïÖÖVŠ¢®\¹âéé©%8{öìæÍ›y<^XXØõë×U*ÕH¶H7$ ‡ÃY²d I’===Zzº\¯Y[[×××ÏŸ?.ªT*yÈ>|Èãñ` ¥R9}út€¹¹9x>K<39]]]'Ož¬¬¬llläóù°pÒ¤I‹-ºvíÚÌ™3ŒŒÞyç-9è@KKËÞ½{÷îÝK—(•JØûØ·h 666Ìv´ô>*tñ½xñâ³gÏ®Zµ Øl6û?þШckkÛÔÔOÈð´fmm­C_ƒêìì¼eË'''Š¢V­ZË—/_þã?ÖÕÕ­X±‚ -9ÀY<”JåÈ;µ¶¶þüóÏ/^ _ÞÝÝÍf³Çk‹¢ñ3^½ër> lkkÛµk—L&kkk»~ýzjjªF‘H”––ö×_544|÷Ýwnnn#̯¨¨º¡ÀÓ§O»ž£V«I’„g麺ºýû÷ž°ü£> Ò>àMò}óæÍ¸¸¸ÀÀÀ©S§:—quu}ÝN–oŽoCgñºƒŸ‡¢öØ7Z`ßh1ÈõÚÀ©c&(UUUË–-c–¼ä[ h<öÀLh–-[öÒ—ÇÿYðøØ7Z`ßh}£öÿ[/ÑÅU†qIEND®B`‚glom-1.22.4/docs/libglom_reference/html/functions_func_0x70.html0000644000175000017500000001174112234777147026034 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - p -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1SystemPrefs-members.html0000644000175000017500000001453012234777147030453 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::SystemPrefs Member List
        glom-1.22.4/docs/libglom_reference/html/ftv2splitbar.png0000644000175000017500000000047212234777145024472 0ustar00murraycmurrayc00000000000000‰PNG  IHDRM¸¿IDATxíÝ¡JCa‡ñç(˜ ëƒ%±Ø4 b±È˜Í¶3˜v^Á±˜…ãó–ŽELƒõ…¥•³ ,ÿb;íç{Ã/¼ðÞÀaYÕ¯åóøq:¼º¹›\òIIIIIIIIIIIIIIIIII-Òçl¹›«õ抢è_t/Ï»ã£ÑíYQVõðêäíã÷´×ùY¬Úÿµ§¦ivók¾_íåýÛ£I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$ýC[Vì=ü[„fÆIEND®B`‚glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__Line.html0000644000175000017500000015502312234777147027744 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::LayoutItem_Line Class Reference
        Glom::LayoutItem_Line Class Reference

        This is only used on print layouts. More...

        Inheritance diagram for Glom::LayoutItem_Line:
        Collaboration diagram for Glom::LayoutItem_Line:

        Public Member Functions

         LayoutItem_Line ()
         
         LayoutItem_Line (const LayoutItem_Line& src)
         
        LayoutItem_Lineoperator= (const LayoutItem_Line& src)
         
        virtual ~LayoutItem_Line ()
         
        virtual LayoutItemclone () const
         Create a new copied instance. More...
         
        bool operator== (const LayoutItem_Line& src) const
         
        virtual Glib::ustring get_part_type_name () const
         
        virtual Glib::ustring get_report_part_id () const
         Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML). More...
         
        void get_coordinates (double& start_x, double& start_y, double& end_x, double& end_y) const
         Get the coordinates. More...
         
        void set_coordinates (double start_x, double start_y, double end_x, double end_y)
         Set the coordinates. More...
         
        double get_line_width () const
         
        void set_line_width (double line_width)
         
        Glib::ustring get_line_color () const
         
        void set_line_color (const Glib::ustring& color)
         
        - Public Member Functions inherited from Glom::LayoutItem
         LayoutItem ()
         
         LayoutItem (const LayoutItem& src)
         
        LayoutItemoperator= (const LayoutItem& src)
         
        virtual ~LayoutItem ()
         
        bool operator== (const LayoutItem& src) const
         
        virtual bool get_editable () const
         
        virtual void set_editable (bool val=true)
         
        virtual Glib::ustring get_layout_display_name () const
         
        guint get_display_width () const
         
        void set_display_width (guint value)
         
        void get_print_layout_position (double& x, double& y, double& width, double& height) const
         This is used only for the print layouts. More...
         
        void set_print_layout_position (double x, double y, double width, double height)
         This is used only for the print layouts. More...
         
        void set_print_layout_position_y (double y)
         This is used only for the print layouts. More...
         
        void set_print_layout_split_across_pages (bool split=true)
         This is used only for the print layouts. More...
         
        bool get_print_layout_split_across_pages () const
         This is used only for the print layouts. More...
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        virtual void set_name (const Glib::ustring& name)
         Set the non-translated identifier name. More...
         
        virtual Glib::ustring get_name () const
         Get the non-translated identifier name. More...
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Additional Inherited Members

        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         
        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Detailed Description

        This is only used on print layouts.

        Constructor & Destructor Documentation

        Glom::LayoutItem_Line::LayoutItem_Line ( )
        Glom::LayoutItem_Line::LayoutItem_Line ( const LayoutItem_Line src)
        virtual Glom::LayoutItem_Line::~LayoutItem_Line ( )
        virtual

        Member Function Documentation

        virtual LayoutItem* Glom::LayoutItem_Line::clone ( ) const
        virtual

        Create a new copied instance.

        This allows us to deep-copy a list of LayoutItems.

        Implements Glom::LayoutItem.

        void Glom::LayoutItem_Line::get_coordinates ( double &  start_x,
        double &  start_y,
        double &  end_x,
        double &  end_y 
        ) const

        Get the coordinates.

        Glib::ustring Glom::LayoutItem_Line::get_line_color ( ) const
        double Glom::LayoutItem_Line::get_line_width ( ) const
        virtual Glib::ustring Glom::LayoutItem_Line::get_part_type_name ( ) const
        virtual

        Implements Glom::LayoutItem.

        virtual Glib::ustring Glom::LayoutItem_Line::get_report_part_id ( ) const
        virtual

        Gets the node name to use for the intermediate XML, (and usually, the CSS style class to use for the resulting HTML).

        Reimplemented from Glom::LayoutItem.

        LayoutItem_Line& Glom::LayoutItem_Line::operator= ( const LayoutItem_Line src)
        bool Glom::LayoutItem_Line::operator== ( const LayoutItem_Line src) const
        void Glom::LayoutItem_Line::set_coordinates ( double  start_x,
        double  start_y,
        double  end_x,
        double  end_y 
        )

        Set the coordinates.

        void Glom::LayoutItem_Line::set_line_color ( const Glib::ustring color)
        void Glom::LayoutItem_Line::set_line_width ( double  line_width)

        The documentation for this class was generated from the following file:
        • libglom/data_structure/layout/layoutitem_line.h
        glom-1.22.4/docs/libglom_reference/html/functions_0x69.html0000644000175000017500000001117312234777147025030 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members
        Here is a list of all class members with links to the classes they belong to:

        - i -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Privileges-members.html0000644000175000017500000001175212234777147030303 0ustar00murraycmurrayc00000000000000 libglom-1.22: Member List
        Glom::Privileges Member List

        This is the complete list of members for Glom::Privileges, including all inherited members.

        m_createGlom::Privileges
        m_deleteGlom::Privileges
        m_editGlom::Privileges
        m_viewGlom::Privileges
        operator=(const Privileges& src)Glom::Privileges
        operator==(const Privileges& src) const Glom::Privileges
        Privileges()Glom::Privileges
        Privileges(const Privileges& src)Glom::Privileges
        ~Privileges()Glom::Privilegesvirtual
        glom-1.22.4/docs/libglom_reference/html/classes.html0000644000175000017500000003437612234777147023701 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Index
        Class Index
        A | C | D | F | G | H | L | N | P | R | S | T | U | V
          A  
        FieldTypes (Glom)   LayoutItem_Field (Glom)   
          P  
          T  
        Formatting (Glom)   LayoutItem_FieldSummary (Glom)   
        AppState (Glom)   FoundSet (Glom)   LayoutItem_Footer (Glom)   predicate_FieldHasName (Glom)   TableInfo (Glom)   
          C  
          G  
        LayoutItem_GroupBy (Glom)   predicate_LayoutItem_Field_IsSameField (Glom)   TranslatableItem (Glom)   
        LayoutItem_Header (Glom)   PrintLayout (Glom)   
          U  
        ChoiceValue (Glom)   GroupInfo (Glom)   LayoutItem_Image (Glom)   Privileges (Glom)   
        CustomTitle (Glom)   
          H  
        LayoutItem_Line (Glom)   
          R  
        UsesRelationship (Glom)   
          D  
        LayoutItem_Notebook (Glom)   
          V  
        HasTitleSingular (Glom)   LayoutItem_Placeholder (Glom)   Relationship (Glom)   
        DatabaseTitle (Glom)   
          L  
        LayoutItem_Portal (Glom)   Report (Glom)   View (GlomBakery)   
        Document (GlomBakery)   LayoutItem_Summary (Glom)   ReportBuilder (Glom)   View_Composite (GlomBakery)   
        Document (Glom)   LayoutGroup (Glom)   LayoutItem_Text (Glom)   
          S  
        ViewBase (GlomBakery)   
        Document_XML (GlomBakery)   LayoutItem (Glom)   LayoutItem_VerticalGroup (Glom)   
          F  
        LayoutItem_Button (Glom)   LayoutItem_WithFormatting (Glom)   sharedptr (Glom)   
        LayoutItem_CalendarPortal (Glom)   
          N  
        SystemPrefs (Glom)   
        Field (Glom)   
        NumericFormat (Glom)   
        A | C | D | F | G | H | L | N | P | R | S | T | U | V
        glom-1.22.4/docs/libglom_reference/html/functions_func_0x65.html0000644000175000017500000001102512234777147026033 0ustar00murraycmurrayc00000000000000 libglom-1.22: Class Members - Functions
         

        - e -

        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1Field.html0000644000175000017500000031753412234777147025574 0ustar00murraycmurrayc00000000000000 libglom-1.22: Glom::Field Class Reference
        Inheritance diagram for Glom::Field:
        Collaboration diagram for Glom::Field:

        Public Types

        enum  sql_format {
          SQL_FORMAT_POSTGRES,
          SQL_FORMAT_SQLITE
        }
         
        enum  glom_field_type {
          TYPE_INVALID,
          TYPE_NUMERIC,
          TYPE_TEXT,
          TYPE_DATE,
          TYPE_TIME,
          TYPE_BOOLEAN,
          TYPE_IMAGE
        }
         
        typedef std::vector
        < Glib::ustring
        type_list_strings
         
        typedef std::map
        < glom_field_type,
        Glib::ustring
        type_map_type_names
         
        - Public Types inherited from Glom::TranslatableItem
        enum  enumTranslatableItemType {
          TRANSLATABLE_TYPE_INVALID,
          TRANSLATABLE_TYPE_FIELD,
          TRANSLATABLE_TYPE_RELATIONSHIP,
          TRANSLATABLE_TYPE_LAYOUT_ITEM,
          TRANSLATABLE_TYPE_CUSTOM_TITLE,
          TRANSLATABLE_TYPE_PRINT_LAYOUT,
          TRANSLATABLE_TYPE_REPORT,
          TRANSLATABLE_TYPE_TABLE,
          TRANSLATABLE_TYPE_BUTTON,
          TRANSLATABLE_TYPE_TEXTOBJECT,
          TRANSLATABLE_TYPE_IMAGEOBJECT,
          TRANSLATABLE_TYPE_CHOICEVALUE,
          TRANSLATABLE_TYPE_DATABASE_TITLE
        }
         
        typedef std::map
        < Glib::ustring, Glib::ustring
        type_map_locale_to_translations
         

        Public Member Functions

         Field ()
         
         Field (const Field& src)
         
         ~Field ()
         
        Fieldoperator= (const Field& src)
         
        bool operator== (const Field& src) const
         
        bool operator!= (const Field& src) const
         
        Fieldclone () const
         
        glom_field_type get_glom_type () const
         
        void set_glom_type (glom_field_type fieldtype)
         
        virtual Glib::ustring get_name () const
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_name, so that we can use it in the same predicate template. More...
         
        virtual void set_name (const Glib::ustring&value)
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_name, for convenience. More...
         
        bool get_auto_increment () const
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_auto_increment. More...
         
        void set_auto_increment (bool val=true)
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_auto_increment. More...
         
        bool get_primary_key () const
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_primary_key. More...
         
        void set_primary_key (bool val=true)
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_primary_key. More...
         
        bool get_unique_key () const
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_unique_key. More...
         
        void set_unique_key (bool val=true)
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_unique_key. More...
         
        Gnome::Gda::Value get_default_value () const
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_default_value. More...
         
        void set_default_value (const Gnome::Gda::Value&value)
         This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_default_value. More...
         
        Glib::RefPtr< Gnome::Gda::Column > get_field_info ()
         
        Glib::RefPtr< const
        Gnome::Gda::Column > 
        get_field_info () const
         
        void set_field_info (const Glib::RefPtr< Gnome::Gda::Column >& fieldInfo)
         
        bool field_info_from_database_is_equal (const Glib::RefPtr< const Gnome::Gda::Column >& field)
         Ignores any part of FieldAttributes that libgda does not properly fill. More...
         
        bool get_is_lookup () const
         
        sharedptr< Relationshipget_lookup_relationship () const
         
        void set_lookup_relationship (const sharedptr< Relationship >& strRelationship)
         
        Glib::ustring get_lookup_field () const
         
        void set_lookup_field (const Glib::ustring& strField)
         
        Glib::ustring get_sql_type () const
         
        Glib::ustring get_gda_type_name () const
         
        Glib::ustring sql (const Gnome::Gda::Value&value, const Glib::RefPtr< Gnome::Gda::Connection >& connection) const
         Escape and quote the value so that it can be used in a SQL command. More...
         
        Glib::ustring to_file_format (const Gnome::Gda::Value&value) const
         Get the canonical format for a file, for instance for a default value or for example data. More...
         
        Gnome::Gda::Value from_file_format (const Glib::ustring& str, bool& success) const
         Parse the value from the canonical file format. More...
         
        Glib::ustring sql_find (const Gnome::Gda::Value&value, const Glib::RefPtr< Gnome::Gda::Connection >& connection) const
         Escape the value so that it can be used in a SQL command for a find. More...
         
        Gnome::Gda::SqlOperatorType sql_find_operator () const
         Get a suitable operator to use when finding records. More...
         
        Glib::ustring get_calculation () const
         
        void set_calculation (const Glib::ustring& calculation)
         
        bool get_has_calculation () const
         
        type_list_strings get_calculation_relationships () const
         
        void set_visible (bool val=true)
         
        bool get_visible () const
         
        - Public Member Functions inherited from Glom::TranslatableItem
         TranslatableItem ()
         
         TranslatableItem (const TranslatableItem& src)
         
        virtual ~TranslatableItem ()
         
        TranslatableItemoperator= (const TranslatableItem& src)
         
        bool operator== (const TranslatableItem& src) const
         
        bool operator!= (const TranslatableItem& src) const
         
        bool get_name_not_empty () const
         
        virtual Glib::ustring get_title_or_name (const Glib::ustring& locale) const
         
        virtual Glib::ustring get_title (const Glib::ustring& locale) const
         Get the title's translation for the specified locale, falling back to the original text if there is no translation. More...
         
        virtual Glib::ustring get_title_original () const
         Get the title's original (non-translated, usually English) text. More...
         
        Glib::ustring get_title_translation (const Glib::ustring& locale, bool fallback=true) const
         Get the title's translation for the specified locale, optionally falling back to a locale of the same language, and then falling back to the original. More...
         
        void set_title (const Glib::ustring& title, const Glib::ustring& locale)
         Set the title's translation for the specified locale. More...
         
        void set_title_original (const Glib::ustring& title)
         Set the title's original (non-translated, usually English) text. More...
         
        void clear_title_in_all_locales ()
         Clear the original title and any translations of the title. More...
         
        bool get_has_translations () const
         
        enumTranslatableItemType get_translatable_item_type () const
         

        Static Public Member Functions

        static Glib::ustring to_file_format (const Gnome::Gda::Value&value, glom_field_type glom_type)
         See to_file_format(const Gnome::Gda::Value& value). More...
         
        static Gnome::Gda::Value from_file_format (const Glib::ustring& str, glom_field_type glom_type, bool& success)
         
        static type_map_type_names get_type_names ()
         Get canonical type names for internal use, such as in the XML of the document. More...
         
        static type_map_type_names get_type_names_ui ()
         Get translated type names. More...
         
        static type_map_type_names get_usable_type_names ()
         Get translated type names of types that should be offered to the user. More...
         
        static Glib::ustring get_type_name_ui (glom_field_type glom_type)
         Get the translated name for a glom type. More...
         
        static glom_field_type get_type_for_ui_name (const Glib::ustring& glom_type)
         Get the type from a translated name. More...
         
        static glom_field_type get_glom_type_for_gda_type (GType gda_type)
         
        static GType get_gda_type_for_glom_type (Field::glom_field_type glom_type)
         
        static bool get_conversion_possible (glom_field_type field_type_src, glom_field_type field_type_dest)
         
        - Static Public Member Functions inherited from Glom::TranslatableItem
        static Glib::ustring get_translatable_type_name (enumTranslatableItemType item_type)
         
        static Glib::ustring get_translatable_type_name_nontranslated (enumTranslatableItemType item_type)
         The non-translated name is used for the context in gettext .po files. More...
         

        Public Attributes

        Formatting m_default_formatting
         

        Additional Inherited Members

        - Protected Attributes inherited from Glom::TranslatableItem
        enumTranslatableItemType m_translatable_item_type
         

        Member Typedef Documentation

        Member Enumeration Documentation

        Enumerator
        TYPE_INVALID 
        TYPE_NUMERIC 
        TYPE_TEXT 
        TYPE_DATE 
        TYPE_TIME 
        TYPE_BOOLEAN 
        TYPE_IMAGE 
        Enumerator
        SQL_FORMAT_POSTGRES 
        SQL_FORMAT_SQLITE 

        Constructor & Destructor Documentation

        Glom::Field::Field ( )
        Glom::Field::Field ( const Field src)
        Glom::Field::~Field ( )

        Member Function Documentation

        Field* Glom::Field::clone ( ) const
        bool Glom::Field::field_info_from_database_is_equal ( const Glib::RefPtr< const Gnome::Gda::Column > &  field)

        Ignores any part of FieldAttributes that libgda does not properly fill.

        Gnome::Gda::Value Glom::Field::from_file_format ( const Glib::ustring str,
        bool &  success 
        ) const

        Parse the value from the canonical file format.

        See to_file_format() This does note remove quotes from text values so the caller may need to do that.

        static Gnome::Gda::Value Glom::Field::from_file_format ( const Glib::ustring str,
        glom_field_type  glom_type,
        bool &  success 
        )
        static
        bool Glom::Field::get_auto_increment ( ) const

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_auto_increment.

        Glib::ustring Glom::Field::get_calculation ( ) const
        type_list_strings Glom::Field::get_calculation_relationships ( ) const
        static bool Glom::Field::get_conversion_possible ( glom_field_type  field_type_src,
        glom_field_type  field_type_dest 
        )
        static
        Gnome::Gda::Value Glom::Field::get_default_value ( ) const

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_default_value.

        Glib::RefPtr<Gnome::Gda::Column> Glom::Field::get_field_info ( )
        Glib::RefPtr<const Gnome::Gda::Column> Glom::Field::get_field_info ( ) const
        static GType Glom::Field::get_gda_type_for_glom_type ( Field::glom_field_type  glom_type)
        static
        Glib::ustring Glom::Field::get_gda_type_name ( ) const
        glom_field_type Glom::Field::get_glom_type ( ) const
        static glom_field_type Glom::Field::get_glom_type_for_gda_type ( GType  gda_type)
        static
        bool Glom::Field::get_has_calculation ( ) const
        bool Glom::Field::get_is_lookup ( ) const
        Glib::ustring Glom::Field::get_lookup_field ( ) const
        sharedptr<Relationship> Glom::Field::get_lookup_relationship ( ) const
        virtual Glib::ustring Glom::Field::get_name ( ) const
        virtual

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_name, so that we can use it in the same predicate template.

        Reimplemented from Glom::TranslatableItem.

        bool Glom::Field::get_primary_key ( ) const

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_primary_key.

        Glib::ustring Glom::Field::get_sql_type ( ) const
        static glom_field_type Glom::Field::get_type_for_ui_name ( const Glib::ustring glom_type)
        static

        Get the type from a translated name.

        static Glib::ustring Glom::Field::get_type_name_ui ( glom_field_type  glom_type)
        static

        Get the translated name for a glom type.

        static type_map_type_names Glom::Field::get_type_names ( )
        static

        Get canonical type names for internal use, such as in the XML of the document.

        static type_map_type_names Glom::Field::get_type_names_ui ( )
        static

        Get translated type names.

        bool Glom::Field::get_unique_key ( ) const

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::get_unique_key.

        static type_map_type_names Glom::Field::get_usable_type_names ( )
        static

        Get translated type names of types that should be offered to the user.

        bool Glom::Field::get_visible ( ) const
        bool Glom::Field::operator!= ( const Field src) const
        Field& Glom::Field::operator= ( const Field src)
        bool Glom::Field::operator== ( const Field src) const
        void Glom::Field::set_auto_increment ( bool  val = true)

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_auto_increment.

        void Glom::Field::set_calculation ( const Glib::ustring calculation)
        void Glom::Field::set_default_value ( const Gnome::Gda::Value &  value)

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_default_value.

        void Glom::Field::set_field_info ( const Glib::RefPtr< Gnome::Gda::Column > &  fieldInfo)
        void Glom::Field::set_glom_type ( glom_field_type  fieldtype)
        void Glom::Field::set_lookup_field ( const Glib::ustring strField)
        void Glom::Field::set_lookup_relationship ( const sharedptr< Relationship >&  strRelationship)
        virtual void Glom::Field::set_name ( const Glib::ustring value)
        virtual

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_name, for convenience.

        Reimplemented from Glom::TranslatableItem.

        void Glom::Field::set_primary_key ( bool  val = true)

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_primary_key.

        void Glom::Field::set_unique_key ( bool  val = true)

        This forwards to the Glib::RefPtr<Gnome::Gda::Column>::set_unique_key.

        void Glom::Field::set_visible ( bool  val = true)
        Glib::ustring Glom::Field::sql ( const Gnome::Gda::Value &  value,
        const Glib::RefPtr< Gnome::Gda::Connection > &  connection 
        ) const

        Escape and quote the value so that it can be used in a SQL command.

        Glib::ustring Glom::Field::sql_find ( const Gnome::Gda::Value &  value,
        const Glib::RefPtr< Gnome::Gda::Connection > &  connection 
        ) const

        Escape the value so that it can be used in a SQL command for a find.

        Gnome::Gda::SqlOperatorType Glom::Field::sql_find_operator ( ) const

        Get a suitable operator to use when finding records.

        For instance, == for numbers, or LIKE for text.

        Glib::ustring Glom::Field::to_file_format ( const Gnome::Gda::Value &  value) const

        Get the canonical format for a file, for instance for a default value or for example data.

        This does not add quotes for text fields so the caller may need to do that. Note that this does not do any extra escaping such as an XML file might need. However, this will escape data as per the CSV RFC.

        static Glib::ustring Glom::Field::to_file_format ( const Gnome::Gda::Value &  value,
        glom_field_type  glom_type 
        )
        static

        See to_file_format(const Gnome::Gda::Value& value).

        Member Data Documentation

        Formatting Glom::Field::m_default_formatting

        The documentation for this class was generated from the following file:
        • libglom/data_structure/field.h
        glom-1.22.4/docs/libglom_reference/html/classGlom_1_1LayoutItem__VerticalGroup__inherit__graph.png0000644000175000017500000001723212234777146034662 0ustar00murraycmurrayc00000000000000‰PNG  IHDR¸ ˆ. bKGDÿÿÿ ½§“OIDATxœíÝ{TSW¾ð}’ ƒ†×õ_@}Öq]¬KPQ\(>r‘ "ÌÂ:Ψ£KkGg@‹LiE\:cgV«m}Ì‚J ‚bÕŽˆÊ z±rµ¡T@TT,äÜ?6Óqƒ 'Ðßç¯Í>¿sòMÎIØЦiÀ›pØ. @‚ˆ@P Â#JQ”åê¬ ÏÛ  „¶oßîããÓÿz€Õ)..þÇ?þA>¾Añññ‘J¥ý, X©~®Q AD (€1PÚÚÚvîÜ)‹mmmÅbñúõëëëëñ]E•••™q[To̸‰·œ¢(µZݯ9Í~ˆÌ¥oßH¯×¯X±‚¢(¹\>iÒ¤G=zÔ××·²²ÒÖÖÖ¼ÛBi4Üprr*((˜5kBÈÑÑÑìfJRRRUU•J¥9r$BÈÍÍíðáà <ž™7„ ¦Íçó oŠ¢]]]‡èüýbæSOZZÚ–-[pJ€Ëå27µZmll¬X,vuuˆˆhjjÂýE¥§§‹D"GGÇ]»v:uJ(Ž5jÇŽÌ€ÔÔTÃF_(Š*,,7nܶmÛœíííg̘‘‘‘Á ÈËˉDÎÎÎ_|ñîT(>>>&L8~ü83[yyyÏIð/4ÜÜÜÔju¯°ììì &‚ÐÐЧOŸ2ý4Mïß¿âĉÎÎÎaaaÌA0Üfþ¾¿ñˆ™M !$“ÉLqrrÊÍÍ51ƒB¡HLLôðð())Q*•‹/fî•H$jµZ.—#„–/_䫪ªhšNII©®®6lÍlxÓ××÷ÚµkãÆÛ´iSMMÍãÇ?nkkÛÑÑ>yò$++‹ÇãýôÓO4MOš4)::º¡¡!++‹Ãá<~üO;yòä¾&ill¤iÚÄooïÛ·oß¹sgîܹ˗/gJýüóÏ===‹‹‹U*•D" í¹#Ìü&›>b&Èd²þ=úýJWTTdø#˜F£¡_//¯ääd< ¢¢!ÔÚÚŠï-(( iZ§Óµ CÐWmFAÉÌ̤iº¥¥E«ÕâN¥RÉz„ÐéÓ§™ùq§³³ógŸ}†k4­V‹§51 n˜€÷‚¦é[·n!„š››ñœÓ¦MKKKÃwÕ××s¹Ü/^Ð}ÅÄà±þÅ̧¡PXYYi˜æ-£¶¶ÖÃ÷q£®®ßäóù!‡cÔ€qãÆ!„ZZZbccýüü„Bᆠ ¸»»ÍäÈ‘ýû÷?þý÷ß¿{÷.sº41ÉxzzâÆ”)SB øfMMMdd$~›æîî®Ó阃Г‰Áfü® "@‚ˆ@P A1öìÙOÏžýÄvV§ËDŠ‹‹-T‡õ(-}JQÔœ9nlbYý}(û÷[ÿëzœƒÝÜ|šíBù£ßWòI‡®'OZÿë¿â) =yÒöÿK*_ƒk”ŸÉÏ¿ÃáPEåçÏv-Ö‚ò3¥4Mëõ´LVÊv-Ö‚òÚýûêÛ·ëôzš¦õß_÷ð¡ñ:Ö_2Êk¹¹å66xUÅãqΜù_– ²&”×ÒÓKµÚîµyZ­>3SÁn=V‚ÒíÞ½†û÷ÕÌ;š¦Uª§?üÐÀjQV‚Ò-'çÖ«óN·#¸99·ØªÇÚ@PBˆ¦éŒŒ]]:ÃÎÎN\^öKøôˆ!„nÝzðäI[ÏþGZnÝz8øõX! B>m|ÞÁàìÀ  ­VŸ]ftÞÁ:;uÙÙe:~ð«²6TRRÕÒòÒÆ†3boÄÞˆÜ#¸¸mcÃÑhÚKJªÙ®‘}ùoC‹ ÷£$ÌÍì웡ßüÆ›éáñàéÔŸe¿7&#„¾þz-Û…Xx®"@‚ˆ@P AD (€ "@‚ˆ@P AD (€ "@‚ˆ@P AD (€ "@‚ˆ@P AD (€ "@Ä‚ÿš+,,ÌB3[Ts³=BÈÙù%Û… Dff¦…f¶`P(Šš;w®H$²ÐüÀP]]]II‰M‹E&“I¥R Í edd¬^½Úr&\£"@‚ˆ@P Â~PÚÚÚvîÜ)‹mmmÅbñúõëëëëñ]E•••™q[fŸÐ ·h!,E¯×¯X±¢´´T.—×ÕÕ={ÖÎÎÎ××·££ƒÝ€–¿]#))©ªªJ¥R9!äæævøðá„„oíEQ®®®„ýC˯(iii[¶lÁ)a.÷õ÷qiµÚØØX±XìêêÑÔÔý½ÕE¥§§‹D"GGÇ]»v:uJ(Ž5jÇŽÌ€ÔÔTÃFOåååÎÎÎööö3fÌÈÈÈ@­\¹òСCx@II‰««ëË—/ûªA­V¶)ŠB¹¹¹1ý̽L?MÓû÷ïŸ8q¢³³sXXù±‰¶„L&3=ÆÉÉ)77×Ä …"11ÑÃ㤤D©T.^¼888˜¹W"‘¨Õj¹\ŽZ¾|9Ó®ªª¢i:%%¥ººÚ°'4ÜÄäÉ“7mÚTSSóøñããÇÛÚÚvtt$%%ùøøà|ðÁÆMÔÐØØhÔ6êd¶ÈôþùçžžžÅÅÅ*•J"‘„††î‘ 2™Ì²¦§& Ç+**2üL£ÑÐ¯Ž²——Wrr2PQQjmmÅ÷Ð4­ÓéŒÚFi0œßè®––­V‹ÛJ¥?–---vvvuuu:N(š¨aA™6mZZZ¯çr¹/^¼Ø1,–O=B¡°²²’¹©Ñh˜·<ŒÚÚZÜÆºº:|“Ïç#„8ŽQ›\KKKll¬ŸŸŸP(ܰaî=zt@@@VVÖÕ«Wy<Þ‚ LÔ0555‘‘‘EQåîî®Óé̸GÂrAAAGŽÁO„@ ¸yó¦Ñ‘HT]Ýý­~¸! ÍU€ŸŸ_uuõÁƒïß¿á¦_*•Êår™LNQ”‰ð+A¿r# srrð3U¯×k4šwÞyÇ\{d!,eÏž= ‰¤¬¬¬¡¡!;;;>>ÞhÌÚµk?ýôS…BQYY¹uëV‰D"H&OMM­©©1l „ž?ÞòŠN§ëêêš3gŽ——×½{÷¢¢¢BÍÍÍ¡U«V•••¥§§GDD˜¨A œ9s¦­­-!!ÁpӦגpTTTlllYY™J¥Ú°aƒ¿¿ŽK,wVC×(4M?|ø0""ÂÉÉÉÁÁA"‘àç«á5Jgggtt´»»»³³sxxx_§ÿžm„PJJŠQÃB¡ÈÍÍ0a‚­­­¯¯o~~~``à”)Sð ..nüøñl×b-†ð'å–ÂvÖ^Q AD (ÆôzZ¯·Ô= ]cׯWýÈvVDzf¡™-jôè„Pkëwl2–{4-øöV8´ètôîÝ „З_þžË’A· e(þ1éÅ‹¥!W×K–Lg»+×(?“™YÆãQ<'3SÁv-Ö‚òÚ³g?]¼X¡ÕêµZÝÅ‹ÿ÷âü%Àk”×.\¨Ðjõ¸­Õê¾ýö»õXÊkYYeN÷,EQYYÃá·Ì‚ÒM­~~ýz¥N×ýŠ¢Óé¯]û±¹ù»UYJ·üüï2~?|îÜmVбB”nr¹Âè“{½ž–Ëá½O7 BÕÕinÞ|`ô±&MÓeeZتʪ@PB(/¯œËíåPp¹œ3gÊ¿+AA¡ÌLó·E†t:=|ò†APPMMã?4ôúÛ4š¦ïÝ{tÿ¾º—û~a`Í,ºyóÁ´iîz}÷ã'OÚBcÆŒÂ79ÎÍ›÷'L’ÿ«ÂŒ,¸Ì`ˆÚ¸1!ôõ×kÙ.ĺÀ© "@‚ˆ@P AD (€ "@‚ˆ@P AD (€ "@‚ˆ@P AD (€ "@‚ˆ@P AD (€ "æünÅÅŵµµfœíí¡ŒŒ ¶ y[b±ØÇÇÇlÓÑæj¶²À[ 5ãƒkæÿ š™™iÞ9Á„……™wB¸FD (€ "@‚ˆ°”¶¶¶;wŠÅb[[[±X¼~ýúúúz|EQeeæüÖG³OHÂÄQ,E¯×¯X±¢´´T.—×ÕÕ={ÖÎÎÎ××·£c˜|Ïð°ÜA¾†%))©ªªJ¥R9!äæævøðá„„o' EQ®®®h˜î ¯(iii[¶lÁ‘!¸\.sS«ÕÆÆÆŠÅbWW׈ˆˆ¦¦&ÜOQTzzºH$rttܵkשS§„Bá¨Q£vìØÁ HMM5lôT^^àììloo?cÆ ük•+W:t())quu}ùòe_5¨ÕjÃ6EQ!777Üoz)Š*,,7nÜÑ£G çÇììì‰' ©TÊ ~ü¸­­mGGGRR’ðÁlܸÑD FmÃÎ7î ¯¯ïµk×âââú5ÿ”)SJJJîÞ½;oÞ¼U«V™>È„9‚ÂãñŠŠŠ^WðŠF£¡_=®^^^ÉÉÉx@EEB¨µµß[PP@Ó4þ @öQ ç7º«¥¥E«Õâ¶R©ÄFKK‹]]]N§ …………&j0”7î`ff&MÓý?)) w–——3ƒûbö °pê …•••†‡¯ç;‚ÚÚZÜÆºº:|“Ïç#„8ŽQ›\KKKll¬ŸŸŸP(ܰaî=zt@@@VVÖÕ«Wy<Þ‚ LÔð–;8nÜ8ÓûØ+fðäɓɋ1‚täÈæ[AÁÍ›7ƈD¢êêjÜÆ ¡Ph®üüüª««ýôS//¯7nàó·D"Á?‹ Î#½¶{½F)((м¢ÕjÇŽû·¿ý­©©©¼¼\*•"„”J%MÓ­­­ööö ¼¼œ¦é¾jÇŽkmmÝ´i285TVV’ïàæ÷ôô¼qãÆÝ»w,XÀ ~ËÇ‚ A¡iúáÇNNN‰?Ÿ cgggtt´»»»³³sxx¸á9ÛtPB)))F C …"77w„ ¶¶¶¾¾¾ùùùS¦LÁóMŸ>·ûªá›o¾3fŒ‹‹ ~W…ûýüüìììšššw°¿ó#„===GòôéSs=„Ìù-¥x±Ì^¸æüdv¨­mž;w/B¨´tHäÄv9V®Q~æÜ¹ï¹\—K;w›íZ¬ ågÒÓKu:½N§OO/e»ëAyM©|\Yù˜¦išîn³]‘ ¼–›û¿#Ft/ð¶±áææ–³[U t£i:#CÑÙÙ½,­«K'“Ý€+}¥[yym}½Æ°§¾^sûöÿOcæAé–“s‹9ï`66¼œœ[lÕcm (!¤Óéåò×笫K+——étz¶ª²*„úŸÿQi4/{ö77·«¿+AA¡ìì›66½ Nv6œ}‚  „:;µyy·»ºt=ïêêÒåæ–wvj¿*kAAW®üÐÞÞç?¤hoï(,Tf=Ö ~)ˆîÝ{¤R=en&'!„Ö®ÇôxzŽ™:u, •Yб“B_½–íB¬ œz AD (€ "@‚ˆ@P AD (€ "@‚ˆ@P AD (€ "@‚ˆ@P AD (€ "@‚ˆ@P CÉdl—Ã>‡wÞe» öÉd2ÃlôòUqýë_¿,ëó¶ `S||¼QO/AY´hÑ`Ô¬XÏ À5 AD (€ " J{{û—_~)•J—,Y"•J8 V«ñ]þþþJ¥9¿eÀ첾ń„£·åååK—.moo'ŸD§Óùûû·¶¶ökÓÞµ…¦éèèè{÷îÅÇÇgff&&&Ž1bË–-]]]˜íÈßß¿¤¤¤£ãõWz½÷Þ{ä“p8œÝ»w÷ëGÞÆ@‚òí·ß>zôèÀS§NÛ·o?qâ—Ë}ó[«¾žx־ќ9sx<Þ7˜ž¢¢¢… ’ü,SEQK–,±±±1om}HP.]ºlgggØÉçó9œ×³étº'NH¥ÒU«VíÝ»·­­ ÷ûûû_¾|9,,lÅŠÇŽû÷¿ÿºråÊ#GŽ0.]ºdØèI¥RíØ±#(((00pݺuW®\AÅÄÄdffâwïÞ]µjUGGG_50=nûûû#„‚ƒƒ2aØOÓôÉ“'׬YôñÇ“ïQO<oþüù………øfuuucc£¯¯¯‰Mܾ}{õêÕFuââñOEDD,[¶lóæÍ}¢·1 ¨T*Ócd2ÙåË—ããã>ÜÜÜ|ðàAæ®ï¾ûîĉ111'Ož¼téÒ¿þõ¯èèèÌÌ̆†„ÐîÝ»g̘aØèé“O>‰DGMOO Û·oŸV«õ÷÷gýåË—.\˜••ÕW F B999£Gî«?'''??Ïž=_}õUggç¡C‡÷¨WþþþÅÅÅød}ýúuooo>ŸobÇŽ‹ýöÛo{Ö™}æÌ™˜˜˜´´´Ù³gôÑG:®×CÔW1$zùÿÚÛÛ Å1Gåååñù|Ü>þüÚµk§NŠÚ¶mÛºuëÚÛÛñ U*•Ž5jÁ‚¡ððp¦ÝÖÖ6vìØ%K–à˜FO_~ù¥½½=~›9sfWW׋/æÏŸèÐ!µZíââråÊ•¸¸¸ƒöUÜ9sfݺuÓ¦MCíØ±C*•vttØÚÚ¾qzÍÛÛ›Çã) __ßëׯÿú׿6½‰°°°wßíýW•yyyk×®9s&BhݺuR©”ÃáôzˆŒžý2 ¸¸¸ÔÖÖNŸ>)´££#44ÔpÌÓ§O…B!nãFccãøñãBööö!Š¢ŒÚäž?~òäÉŠŠŠúúz‘H„;GŽéíí}õêÕI“&q¹Üwß}×D ðøñã½{÷îÝ»—éillÄ[Àq¹\??¿ÂÂBOOÏšššùóç›ÞĘ1cL&‹q›¢(ü\íõ½eÞ¼ygΜYºt),ŸÏÿþûïÆ¸¹¹=zôŸ;ð+°‹‹Ë[WÛmÛ¶mÓ¦MÛ´i“——MÓK—.Åý‹-:wî܃/^LQ”‰ð÷ž566’oÔÅÅeóæÍóæÍÃ?þâÅ æås`/^çéé9kÖ,GGGÓ›0‘<—††æõæùóç}¢È5JTTTSSÓ®]»”JeSSÓµk×’““Ʀ¤¤üðÃuuuÿüç?}||ë¥K—ðƒÊ4B/_¾|þŠ^¯×étS§N‰D<Ø·oBèÙ³g¡ùóç+•ÊË—/˜¨Ïçµ··§¦¦nOÒî òÙgŸ-[¶ì½÷Þûè£BÞÞÞ®®®øZ»¯¶nÝzâĉ5kÖžõgΜ¹~ýúžG“鈈ðññÙ³gÏþð‡§OŸ~òÉ'ý=nF8ÎÂ… ñÕî!ÙDÏ:ÃÃ×,Y²wïÞˆˆˆ+W®$&&ÚÛÛ÷uˆìg_>™‘‘±zõj|©?DÅÆÆN:522’íB†6™L&•J™ž\£X§ŽŽŽêêê²²²­[·²]K·7nôúRúÛßþvýúõƒ_ÏÛ>A)--Ý¿TT”‰7ƒlΜ9CúåÙÐð ŠŸŸŸŸŸÛU [°Ì "ÃçÔcB{{{rrrAAF£qrrš={öï~÷;WWW¶ëJ†PðꊢâããÇŽÛÔÔ”——·eË–ÔÔÔAûý00üƒ‚WϤ¥¥áu`ûöí¿ÿýï‡ôê™Á7ü¯QL¯ža–zœ={–pñ n\»vmÍš5‰$>>ž<Œ ÿ ¼qõ ^êÑØØH¸x;~üx\\ÜáÇÕjõÌZ²5þAé¹z{þü9îÁK=._¾Œ¯ˆD¢mÛ¶]¿~ÝôR爈ˆ©S§Ž?~ûöíøWŒ–Ý ¶ ÿ àÕ3Ìͼ¼<¹\n8’ÛëâÓ2ƒñZ~­XІPðê½^oòù|£¿WÀK=ðâÜC²x…\WW‡ÌºÚÆ: ÿ ¬žAý_¼‚?xð _«m†®á’Õ3¨Ÿ‹WB+V¬Ø»wïæÍ›Á_þò—AØv ·õ(ƒÃßßÿ«¯¾š&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/glom/libglom/filelist.am \ $(top_srcdir)/doc-reference.am $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(srcdir)/Doxyfile.in \ $(dist_noinst_DATA) $(dist_reference_DATA) @GLOM_ENABLE_CLIENT_ONLY_FALSE@am__append_1 = \ @GLOM_ENABLE_CLIENT_ONLY_FALSE@ glom/libglom/connectionpool_backends/postgres_self.cc \ @GLOM_ENABLE_CLIENT_ONLY_FALSE@ glom/libglom/connectionpool_backends/postgres_self.h @DIST_DOCTOOLS_TRUE@am__append_2 = $(MMDOCTOOLDIR)/doc-postprocess.pl $(MMDOCTOOLDIR)/doc-install.pl $(MMDOCTOOLDIR)/tagfile-to-devhelp2.xsl $(MMDOCTOOLDIR)/doxygen.css subdir = docs/libglom_reference ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/macros/ax_boost_python_murrayc.m4 \ $(top_srcdir)/macros/gettext.m4 \ $(top_srcdir)/macros/gnome-doc-utils.m4 \ $(top_srcdir)/macros/iconv.m4 \ $(top_srcdir)/macros/intlmacosx.m4 \ $(top_srcdir)/macros/intltool.m4 \ $(top_srcdir)/macros/lib-ld.m4 \ $(top_srcdir)/macros/lib-link.m4 \ $(top_srcdir)/macros/lib-prefix.m4 \ $(top_srcdir)/macros/libtool.m4 \ $(top_srcdir)/macros/ltoptions.m4 \ $(top_srcdir)/macros/ltsugar.m4 \ $(top_srcdir)/macros/ltversion.m4 \ $(top_srcdir)/macros/lt~obsolete.m4 \ $(top_srcdir)/macros/mm-pkg.m4 \ $(top_srcdir)/macros/mm-python.m4 $(top_srcdir)/macros/nls.m4 \ $(top_srcdir)/macros/po.m4 $(top_srcdir)/macros/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h \ $(top_builddir)/glom/libglom/libglom_config.h CONFIG_CLEAN_FILES = Doxyfile CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(referencedir)" DATA = $(dist_noinst_DATA) $(dist_reference_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_FLAGS = @ACLOCAL_FLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIB = @DL_LIB@ DOCINSTALL_FLAGS = @DOCINSTALL_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DOT = @DOT@ DOXYGEN = @DOXYGEN@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GENHTML = @GENHTML@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLOM_ABI_VERSION = @GLOM_ABI_VERSION@ GLOM_ABI_VERSION_UNDERLINED = @GLOM_ABI_VERSION_UNDERLINED@ GLOM_CFLAGS = @GLOM_CFLAGS@ GLOM_GZIP = @GLOM_GZIP@ GLOM_LIBS = @GLOM_LIBS@ GLOM_MSGFMT = @GLOM_MSGFMT@ GLOM_TAR = @GLOM_TAR@ GLOM_WFLAGS = @GLOM_WFLAGS@ GLOM_WXXFLAGS = @GLOM_WXXFLAGS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ ISO_CODES_PREFIX = @ISO_CODES_PREFIX@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGLOM_API_VERSION = @LIBGLOM_API_VERSION@ LIBGLOM_CFLAGS = @LIBGLOM_CFLAGS@ LIBGLOM_LIBS = @LIBGLOM_LIBS@ LIBGLOM_MAJOR_VERSION = @LIBGLOM_MAJOR_VERSION@ LIBGLOM_MICRO_VERSION = @LIBGLOM_MICRO_VERSION@ LIBGLOM_MINOR_VERSION = @LIBGLOM_MINOR_VERSION@ LIBGLOM_MODULE_NAME = @LIBGLOM_MODULE_NAME@ LIBGLOM_VERSION = @LIBGLOM_VERSION@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MMDOCTOOLDIR = @MMDOCTOOLDIR@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ libglom_toplevel_headers = \ glom/libglom/appstate.h \ glom/libglom/init.h \ glom/libglom/libglom_config.h \ glom/libglom/sharedptr.h \ glom/libglom/standard_table_prefs_fields.h \ glom/libglom/utils.h \ glom/libglom/db_utils.h \ glom/libglom/report_builder.h \ glom/libglom/translations_po.h libglom_data_structure_headers = \ glom/libglom/data_structure/database_title.h \ glom/libglom/data_structure/choicevalue.h \ glom/libglom/data_structure/field.h \ glom/libglom/data_structure/fieldtypes.h \ glom/libglom/data_structure/foundset.h \ glom/libglom/data_structure/has_title_singular.h \ glom/libglom/data_structure/glomconversions.h \ glom/libglom/data_structure/groupinfo.h \ glom/libglom/data_structure/numeric_format.h \ glom/libglom/data_structure/print_layout.h \ glom/libglom/data_structure/privileges.h \ glom/libglom/data_structure/relationship.h \ glom/libglom/data_structure/report.h \ glom/libglom/data_structure/system_prefs.h \ glom/libglom/data_structure/tableinfo.h \ glom/libglom/data_structure/translatable_item.h libglom_ds_layout_headers = \ glom/libglom/data_structure/layout/custom_title.h \ glom/libglom/data_structure/layout/formatting.h \ glom/libglom/data_structure/layout/layoutgroup.h \ glom/libglom/data_structure/layout/layoutitem.h \ glom/libglom/data_structure/layout/layoutitem_button.h \ glom/libglom/data_structure/layout/layoutitem_calendarportal.h \ glom/libglom/data_structure/layout/layoutitem_field.h \ glom/libglom/data_structure/layout/layoutitem_image.h \ glom/libglom/data_structure/layout/layoutitem_line.h \ glom/libglom/data_structure/layout/layoutitem_notebook.h \ glom/libglom/data_structure/layout/layoutitem_placeholder.h \ glom/libglom/data_structure/layout/layoutitem_portal.h \ glom/libglom/data_structure/layout/layoutitem_text.h \ glom/libglom/data_structure/layout/layoutitem_withformatting.h \ glom/libglom/data_structure/layout/usesrelationship.h libglom_ds_l_report_parts_headers = \ glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_footer.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_header.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_summary.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.h libglom_document_headers = \ glom/libglom/document/document.h \ glom/libglom/document/view.h libglom_d_bakery_headers = \ glom/libglom/document/bakery/document.h \ glom/libglom/document/bakery/document_xml.h libglom_d_b_view_headers = \ glom/libglom/document/bakery/view/view.h \ glom/libglom/document/bakery/view/view_composite.h \ glom/libglom/document/bakery/view/viewbase.h libglom_headers = \ $(libglom_toplevel_headers) \ $(libglom_data_structure_headers) \ $(libglom_ds_layout_headers) \ $(libglom_ds_l_report_parts_headers) \ $(libglom_document_headers) \ $(libglom_d_bakery_headers) \ $(libglom_d_b_view_headers) # Private source and header files: libglom_sources = glom/libglom/appstate.cc \ glom/libglom/calcinprogress.cc glom/libglom/calcinprogress.h \ glom/libglom/connectionpool.cc glom/libglom/connectionpool.h \ glom/libglom/db_utils.cc glom/libglom/db_utils.h \ glom/libglom/glom_postgres.cc glom/libglom/glom_postgres.h \ glom/libglom/gst-package.c glom/libglom/gst-package.h \ glom/libglom/init.cc glom/libglom/privs.cc \ glom/libglom/privs.h glom/libglom/report_builder.cc \ glom/libglom/report_builder.h \ glom/libglom/spawn_with_feedback.cc \ glom/libglom/spawn_with_feedback.h \ glom/libglom/translations_po.cc glom/libglom/translations_po.h \ glom/libglom/utils.cc glom/libglom/utils.h \ glom/libglom/xsl_utils.cc glom/libglom/xsl_utils.h \ glom/libglom/xml_utils.cc glom/libglom/xml_utils.h \ glom/libglom/connectionpool_backends/backend.cc \ glom/libglom/connectionpool_backends/backend.h \ glom/libglom/data_structure/database_title.cc \ glom/libglom/data_structure/choicevalue.cc \ glom/libglom/data_structure/field.cc \ glom/libglom/data_structure/fieldtypes.cc \ glom/libglom/data_structure/foundset.cc \ glom/libglom/data_structure/glomconversions.cc \ glom/libglom/data_structure/groupinfo.cc \ glom/libglom/data_structure/has_title_singular.cc \ glom/libglom/data_structure/numeric_format.cc \ glom/libglom/data_structure/print_layout.cc \ glom/libglom/data_structure/privileges.cc \ glom/libglom/data_structure/relationship.cc \ glom/libglom/data_structure/report.cc \ glom/libglom/data_structure/system_prefs.cc \ glom/libglom/data_structure/tableinfo.cc \ glom/libglom/data_structure/translatable_item.cc \ glom/libglom/data_structure/layout/custom_title.cc \ glom/libglom/data_structure/layout/formatting.cc \ glom/libglom/data_structure/layout/layoutgroup.cc \ glom/libglom/data_structure/layout/layoutitem.cc \ glom/libglom/data_structure/layout/layoutitem_button.cc \ glom/libglom/data_structure/layout/layoutitem_calendarportal.cc \ glom/libglom/data_structure/layout/layoutitem_field.cc \ glom/libglom/data_structure/layout/layoutitem_image.cc \ glom/libglom/data_structure/layout/layoutitem_line.cc \ glom/libglom/data_structure/layout/layoutitem_notebook.cc \ glom/libglom/data_structure/layout/layoutitem_placeholder.cc \ glom/libglom/data_structure/layout/layoutitem_portal.cc \ glom/libglom/data_structure/layout/layoutitem_text.cc \ glom/libglom/data_structure/layout/layoutitem_withformatting.cc \ glom/libglom/data_structure/layout/usesrelationship.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_footer.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_header.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_summary.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc \ glom/libglom/document/document.cc \ glom/libglom/document/bakery/document.cc \ glom/libglom/document/bakery/document_xml.cc \ glom/libglom/document/bakery/view/view.cc \ glom/libglom/document/bakery/view/view_composite.cc \ glom/libglom/document/bakery/view/viewbase.cc \ glom/libglom/python_embed/py_glom_record.cc \ glom/libglom/python_embed/py_glom_record.h \ glom/libglom/python_embed/py_glom_related.cc \ glom/libglom/python_embed/py_glom_related.h \ glom/libglom/python_embed/py_glom_relatedrecord.cc \ glom/libglom/python_embed/py_glom_relatedrecord.h \ glom/libglom/python_embed/py_glom_ui.cc \ glom/libglom/python_embed/py_glom_ui.h \ glom/libglom/python_embed/py_glom_ui_callbacks.h \ glom/libglom/python_embed/pygdavalue_conversions.cc \ glom/libglom/python_embed/pygdavalue_conversions.h \ glom/libglom/connectionpool_backends/sqlite.cc \ glom/libglom/connectionpool_backends/sqlite.h \ glom/libglom/connectionpool_backends/postgres.cc \ glom/libglom/connectionpool_backends/postgres.h \ glom/libglom/connectionpool_backends/postgres_central.cc \ glom/libglom/connectionpool_backends/postgres_central.h \ $(am__append_1) book_name = libglom-$(GLOM_ABI_VERSION) doc_input = $(addprefix $(top_srcdir)/,$(libglom_headers)) doc_outdir = . # Function: $(call vpath_listall,PATTERN ...) # Get all filenames which match a PATTERN from the list. Look for files # relative to either the current directory or $(srcdir). Strip $(srcdir)/ # again before returning and remove any duplicates. vpath_srclist = $(patsubst $(srcdir)/%,%,$(wildcard $(addprefix $(srcdir)/,$(1)))) vpath_listall = $(sort $(wildcard $(1)) $(if $(srcdir:.=),$(vpath_srclist))) # Installation directories. libdocdir = $(datarootdir)/doc/$(book_name) referencedir = $(libdocdir)/reference htmlrefdir = $(referencedir)/html devhelpdir = $(datadir)/devhelp/books/$(book_name) @ENABLE_DOCUMENTATION_FALSE@doc_inst_targets = @ENABLE_DOCUMENTATION_TRUE@doc_inst_targets = install-htmlref install-devhelp @ENABLE_DOCUMENTATION_FALSE@doc_inst_files = @ENABLE_DOCUMENTATION_TRUE@doc_inst_files = $(doxytagfile) @ENABLE_DOCUMENTATION_FALSE@doc_dist_files = $(am__append_2) @ENABLE_DOCUMENTATION_TRUE@doc_dist_files = $(devhelpfile) $(call \ @ENABLE_DOCUMENTATION_TRUE@ vpath_listall,$(htmlref_patterns)) \ @ENABLE_DOCUMENTATION_TRUE@ $(am__append_2) dist_reference_DATA = $(strip $(doc_inst_files)) dist_noinst_DATA = $(strip $(doc_dist_files)) DISTCLEANFILES = $(doc_outdir)/doxygen.log MAINTAINERCLEANFILES = $(doxytagfile) $(devhelpfile) $(doc_outdir)/html/* # The generic bit of the doc-install.pl command line. doc_install_cmd = $(doc_install) --verbose --mode=0644 # Transform $(datarootdir) into a URI to match MM_ARG_WITH_TAGFILE_DOC(). datarootdir_esc = $(subst $(subst ,, ),%20,$(subst \,/,$(datarootdir))) docdir_base_uri = file:///$(patsubst /%,%,$(datarootdir_esc:/=))/doc # The command and options used to install the files from the HTML reference # documentation. The $(subst) magic translates external tag references from # absolute to relative paths if the destination is on the local file system # and installed under the same prefix as the package being built. htmlref_relinst = $(subst @$(docdir_base_uri)/,@../../../,$(DOCINSTALL_FLAGS)) htmlref_install = $(doc_install_cmd) $(htmlref_relinst) # The command and options used to install the Devhelp file. devhelp_install = $(doc_install_cmd) --book-base='$(htmlrefdir:/=)' # Helper variables to replicate each pattern with a $(srcdir)/ prefix. # Also add quoting to prevent the shell from expanding the patterns. htmlref_patterns_dup = $(foreach item,$(htmlref_patterns),'$(item)' '$(srcdir)/$(item)') htmlref_patterns_quote = $(patsubst %,'%',$(htmlref_patterns)) htmlref_patterns_vpath = $(if $(srcdir:.=),$(htmlref_patterns_dup),$(htmlref_patterns_quote)) # Expand to a list of -name 'PATTERN' arguments for use with 'find'. htmlref_find_patterns = $(patsubst %,-name '%' -o,$(notdir $(htmlref_patterns))) -false # The parameters to the Doxygen-to-Devhelp XSLT script dh_xsl_params = --stringparam book_title '$(book_title)' \ --stringparam book_name '$(book_name)' \ --stringparam book_base html # Generated configuration files which, when updated, should cause the # reference documentation to be rebuilt. doc_config_deps = $(CONFIG_HEADER) $(srcdir)/$(doc_config).in $(srcdir)/Makefile.in @MAINTAINER_MODE_FALSE@doc_dependencies = # Regenerate the documentation automatically only in maintainer mode. # Depend on the generated configuration header files to trigger a rebuild # if a configuration value changed. The configuration header files only # have their timestamp modified when the content actually changed, which # is not the case for any other files generated by configure. @MAINTAINER_MODE_TRUE@doc_dependencies = $(doc_config_deps) $(doc_input) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/glom/libglom/filelist.am $(top_srcdir)/doc-reference.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/libglom_reference/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/libglom_reference/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/glom/libglom/filelist.am $(top_srcdir)/doc-reference.am: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_referenceDATA: $(dist_reference_DATA) @$(NORMAL_INSTALL) @list='$(dist_reference_DATA)'; test -n "$(referencedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(referencedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(referencedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(referencedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(referencedir)" || exit $$?; \ done uninstall-dist_referenceDATA: @$(NORMAL_UNINSTALL) @list='$(dist_reference_DATA)'; test -n "$(referencedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(referencedir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(referencedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dist_referenceDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_referenceDATA uninstall-local .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dist_referenceDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am \ uninstall-dist_referenceDATA uninstall-local # The name of the sub-directory where the generated documentation # will be placed. doc_outdir ?= reference # The name of the Doxygen configuration file. doc_config ?= $(doc_outdir)/Doxyfile # The base URL where the online documentation for C++ binding modules # is located, including the trailing slash. pubdocbase ?= http://library.gnome.org/devel/ # The URL of the module's online HTML reference documentation, which # may or may not end in a trailing slash. htmlrefpub ?= $(pubdocbase)$(PACKAGE_TARNAME)/unstable/ # The title of the generated Devhelp book. book_title ?= $(PACKAGE_NAME) Reference Manual # A list of wildcard patterns matching the files from the HTML directory # generated by Doxygen which should be distributed and installed. htmlref_patterns ?= $(addprefix $(doc_outdir)/html/*.,css gif html png js) # Locations of utilities shipped with glibmm. Made overridable # in case the installed utilities cannot be used for some reason. doc_postprocess ?= $(PERL) -- "$(MMDOCTOOLDIR)/doc-postprocess.pl" doc_install ?= $(PERL) -- "$(MMDOCTOOLDIR)/doc-install.pl" tagfile_to_devhelp2 ?= "$(MMDOCTOOLDIR)/tagfile-to-devhelp2.xsl" # Names of the main output files. doxytagfile ?= $(doc_outdir)/$(book_name).tag devhelpfile ?= $(doc_outdir)/$(book_name).devhelp2 # Explicitly depend on the files to be distributed or installed. all-local: $(doc_inst_files) $(doc_dist_files) # Hook up custom rules for translating references to external documentation # to the actual location at install time. install-data-local: $(doc_inst_targets) # Hook up corresponding custom uninstall rules. uninstall-local: $(addprefix un,$(doc_inst_targets)) # Install the HTML reference documentation files with just one invocation # of doc-install.pl to speed up the build process. Make use of the --glob # option, which tells it to perform filename globbing itself, like 'find'. # This helps to avoid excessively long command lines, as some platforms # have rather restrictive limits. install-htmlref: $(doc_outdir)/html/index.html @$(NORMAL_INSTALL) $(MKDIR_P) '$(DESTDIR)$(htmlrefdir)' $(htmlref_install) -t '$(DESTDIR)$(htmlrefdir)' --glob -- $(htmlref_patterns_vpath) # Delete files from the html installation directory. Avoid recursive # directory removal, and apply the same wildcard pattern as was used to # select files for installation. uninstall-htmlref: @$(NORMAL_UNINSTALL) (cd '$(DESTDIR)$(htmlrefdir)' 2>/dev/null || exit 0; \ find . -type f '(' $(htmlref_find_patterns) ')' -exec rm -f '{}' '+') -test ! -r '$(DESTDIR)$(htmlrefdir)' || rmdir '$(DESTDIR)$(htmlrefdir)' # Install the Devhelp file, translating the base path on the fly. install-devhelp: $(devhelpfile) @$(NORMAL_INSTALL) $(MKDIR_P) '$(DESTDIR)$(devhelpdir)' $(devhelp_install) -t '$(DESTDIR)$(devhelpdir)' -- $^ # Remove the installed Devhelp file and directory. uninstall-devhelp: @$(NORMAL_UNINSTALL) rm -f '$(DESTDIR)$(devhelpdir)/$(notdir $(devhelpfile))' -test ! -r '$(DESTDIR)$(devhelpdir)' || rmdir '$(DESTDIR)$(devhelpdir)' # Regenerate the Doxygen configuration file automatically. In the # top-level build directory Automake already takes care of this. ifneq ($(subdir),.) $(doc_config): $(srcdir)/$(doc_config).in $(top_builddir)/config.status $(AM_V_GEN)cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ endif # Make sure that the documentation will always have been generated before # executing commands of a rule that depends on files in $(doc_outdir)/html/. $(doc_outdir)/html/%: | $(doxytagfile) # Run Doxygen to build the reference documentation. The generated tag file # also functions as time stamp target for the documentation as a whole. # Quote $(DOXYGEN) so that this still works if this is a path containing # spaces such as "/c/Program Files (x86)/Doxygen/bin/doxygen" # The doc_config file may contain "$(MMDOCTOOLDIR)". Export MMDOCTOOLDIR to Doxygen. $(doxytagfile): $(doc_dependencies) | $(doc_config) -$(AM_V_at)rm -f $@ -$(AM_V_at)rm -fr $(doc_outdir)/html $(AM_V_GEN)(echo '@INCLUDE =' $(doc_config) && echo 'INPUT =' $(doc_input)) | MMDOCTOOLDIR="$(MMDOCTOOLDIR)" "$(DOXYGEN)" - $(AM_V_at)$(doc_postprocess) '$(doc_outdir)/html/*.html' # Run XSL transformation to generate a Devhelp book from a Doxygen tag file. %.devhelp2: %.tag $(AM_V_GEN)$(XSLTPROC) $(dh_xsl_params) -o $@ $(tagfile_to_devhelp2) $< .PHONY: install-htmlref uninstall-htmlref install-devhelp uninstall-devhelp # Instruct GNU make to delete the targets of a rule after it failed, in # order to avoid the complication of handling that situation manually. .DELETE_ON_ERROR: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: glom-1.22.4/docs/libglom_reference/Makefile.am0000644000175000017500000000164212234252645022423 0ustar00murraycmurrayc00000000000000## Copyright (c) 2010 Openismus GmbH ## ## This file is part of Glom. ## ## Glom is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published ## by the Free Software Foundation, either version 2 of the License, ## or (at your option) any later version. ## ## Glom is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with Glom. If not, see . include $(top_srcdir)/glom/libglom/filelist.am book_name = libglom-$(GLOM_ABI_VERSION) doc_input = $(addprefix $(top_srcdir)/,$(libglom_headers)) doc_outdir = . include $(top_srcdir)/doc-reference.am glom-1.22.4/docs/developer_documentation.txt0000644000175000017500000000321412234252645022400 0ustar00murraycmurrayc00000000000000Developer Documentation: *** The Document: - Stores: - Database connection information - server name, database name, user name. - Stores relationships between tables. - Lookup definitions - e.g. copy the current price of this product into this field. - Form layouts. - Remembered Finds - Which tables are secondary (hidden) - e.g. invoice lines. - Reuse: - Is in XML format, with a DTD, so it could be used to build other interfaces. e.g. an HTML/JSP web interface. See *** Web UI. *** Basic application framework: - App_Glom inherits from Bakery::App_WithDoc, overriding appropriately. - Document_Glom inherits from Document_XML, which inherits from Bakery::Document, overriding appropriately. - See comments in Bakery::App header. *** Database terminology: - I use Table, Record, Field *** Constraints: - Data Details: - Related records: - If the to field is a primary key, then there can be only one related record, because only one value can be in the from field. (If that field has a value then Add should be disabled). Crazy notions that just might work: *** Web UI: - The XML document stores enough information to generate a full-featured web interface. - e.g. JSP pages that put these things on the page by using Java classes/methods.: - List, optionally filtered by a Find. - Details, arranged using same layout logic as app. - Find forms, like Details. - The Java-generated HTML could use style names to allow customisation without change to the Java code. - By changing the top-level JSP pages and by defining styles a great deal of customisation would be possible, without making the system unmaintainable. glom-1.22.4/docs/overview.txt0000644000175000017500000000000012234252645017316 0ustar00murraycmurrayc00000000000000glom-1.22.4/autogen.sh0000755000175000017500000000062512234776363016005 0ustar00murraycmurrayc00000000000000#! /bin/sh -e test -n "$srcdir" || srcdir=`dirname "$0"` test -n "$srcdir" || srcdir=. ( cd "$srcdir" && gnome-doc-common --copy && gnome-doc-prepare --automake --copy --force && mm-common-prepare --copy --force && autopoint --force && AUTOPOINT='intltoolize --automake --copy' autoreconf --force --install ) || exit test -n "$NOCONFIGURE" || "$srcdir/configure" --enable-maintainer-mode "$@" glom-1.22.4/tests/0000755000175000017500000000000012235000127015116 5ustar00murraycmurrayc00000000000000glom-1.22.4/tests/test_script_check_for_problems.cc0000644000175000017500000000304412234776363023724 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include int main() { Glom::libglom_init(); Glib::ustring script; if(!Glom::Utils::script_check_for_pygtk2(script)) { std::cerr << "script_check_for_pygtk2() failed unexpectedly." << std::endl; return EXIT_FAILURE; } script = "from gi.repository import Gtk"; if(!Glom::Utils::script_check_for_pygtk2(script)) { std::cerr << "script_check_for_pygtk2() failed unexpectedly." << std::endl; return EXIT_FAILURE; } script = "import pygtk\n" \ "pygtk.require('2.0')\n" \ "import gtk"; if(Glom::Utils::script_check_for_pygtk2(script)) { std::cerr << "script_check_for_pygtk2() succeeded unexpectedly." << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_new_then_get_privs.cc0000644000175000017500000000527112234776363025014 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include //For EXIT_SUCCESS and EXIT_FAILURE static bool test(Glom::Document::HostingMode hosting_mode) { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_smallbusiness.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } const Glom::Privs::type_vec_strings groups = Glom::Privs::get_database_groups(); if(groups.empty()) { std::cerr << "Failure: groups was empty." << std::endl; return false; } for(Glom::Privs::type_vec_strings::const_iterator iter = groups.begin(); iter != groups.end(); ++iter) { const Glib::ustring group_name = *iter; if(group_name.empty()) { std::cerr << "Failure: group_name was empty." << std::endl; return false; } const Glom::Privs::type_vec_strings users = Glom::Privs::get_database_users(group_name); for(Glom::Privs::type_vec_strings::const_iterator iter = users.begin(); iter != users.end(); ++iter) { const Glib::ustring user_name = *iter; if(user_name.empty()) { std::cerr << "Failure: user_name was empty." << std::endl; return false; } std::cout << "group: " << group_name << ", has user: " << user_name << std::endl; } } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } /* SQLite does not have this feature: if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } */ Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_new_then_report_summary.cc0000644000175000017500000000551112234776363026077 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE static bool test(Glom::Document::HostingMode hosting_mode) { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_smallbusiness.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } const Glom::sharedptr report = document.get_report("invoices", "by_customer"); if(!report) { std::cerr << "The report could not be found." << std::endl; return false; } Glom::FoundSet found_set; //TODO: Test a where clause. found_set.m_table_name = "invoices"; const Glib::ustring locale = ""; /* original locale */ Glom::ReportBuilder report_builder(locale); report_builder.set_document(&document); const Glib::ustring html = report_builder.report_build(found_set, report); if(html.empty()) { std::cerr << "Failed: html was empty." << std::endl; return false; } if(html.find("Yodda Yossarian") == std::string::npos) { std::cerr << "Failed: html did not contain the expected text." << std::endl; return false; } if(html.find("90.47") == std::string::npos) { std::cerr << "Failed: html did not contain the expected summary number." << std::endl; return false; } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); //Make sure that we use an en locale, //so we can test for the expected numeric output; setlocale(LC_ALL, "en_US.UTF-8"); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_dtd_file_validation.sh0000755000175000017500000000025312234252646022516 0ustar00murraycmurrayc00000000000000#/bin/sh -e for x in $(find ${srcdir}/examples/ -name "*.glom") do # echo Validating $x xmllint --noout --dtdvalid ${srcdir}/glom/glom_document.dtd $x || exit 1 done glom-1.22.4/tests/test_signal_reemit.cc0000644000175000017500000000231012234252646021320 0ustar00murraycmurrayc00000000000000#include #include #include bool success_reemit_void = false; bool success_reemit_int = false; const int param_value = 1; void on_reemit_void() { //std::cout << "Success: signal_to_reemit_void was emitted when signal_first_emit was emitted." << std::endl; success_reemit_void = true; } void on_reemit_int(int param) { //std::cout << "Success: signal_to_reemit_int was emitted when signal_first_emit was emitted. param=" << param << std::endl; success_reemit_int = (param_value == param); } int main() { { sigc::signal signal_first_emit; sigc::signal signal_to_reemit; Glom::signal_connect_for_reemit_0args(signal_first_emit, signal_to_reemit); signal_to_reemit.connect( sigc::ptr_fun(&on_reemit_void) ); signal_first_emit.emit(); } { sigc::signal signal_first_emit; sigc::signal signal_to_reemit; Glom::signal_connect_for_reemit_1arg(signal_first_emit, signal_to_reemit); signal_to_reemit.connect( sigc::ptr_fun(&on_reemit_int) ); signal_first_emit.emit(param_value); } if(success_reemit_void && success_reemit_int) return EXIT_SUCCESS; else return EXIT_FAILURE; } glom-1.22.4/tests/test_selfhosting_new_then_image.cc0000644000175000017500000001252312234776363024072 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include "tests/test_utils.h" #include #include #include #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE #include //For memcmp(). static bool test(Glom::Document::HostingMode hosting_mode) { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_smallbusiness.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } //Where clause: const Glib::ustring table_name = "contacts"; const Glom::sharedptr field = document.get_field(table_name, "picture"); //Where clause: const Glom::sharedptr key_field = document.get_field(table_name, "contact_id"); if(!key_field) { std::cerr << "Failure: Could not get key field." << std::endl; return false; } const Gnome::Gda::SqlExpr where_clause = Glom::Utils::build_simple_where_expression(table_name, key_field, Gnome::Gda::Value(1)); //Set the value, from an image file: const Gnome::Gda::Value value_set = get_value_for_image(); const Glib::RefPtr builder_set = Glom::Utils::build_sql_update_with_where_clause(table_name, field, value_set, where_clause); const int rows_affected = Glom::DbUtils::query_execute(builder_set); if(rows_affected == -1) { std::cerr << "Failure: UPDATE failed." << std::endl; return false; } //Get the value: Glom::Utils::type_vecLayoutFields fieldsToGet; Glom::sharedptr layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); const Glib::RefPtr builder_get = Glom::Utils::build_sql_select_with_where_clause(table_name, fieldsToGet, where_clause); Glib::RefPtr data_model = Glom::DbUtils::query_execute_select(builder_get); if(!test_model_expected_size(data_model, 1, 1)) { std::cerr << "Failure: Unexpected data model size for main query." << std::endl; return false; } const int count = Glom::DbUtils::count_rows_returned_by(builder_get); if(count != 1 ) { std::cerr << "Failure: The COUNT query returned an unexpected value: " << count << std::endl; return false; } const Gnome::Gda::Value value_read = data_model->get_value_at(0, 0); const GType value_read_type = value_read.get_value_type(); if( (value_read_type != GDA_TYPE_BINARY) && (value_read_type != GDA_TYPE_BLOB)) { std::cerr << "Failure: The value read was not of the expected type: " << g_type_name( value_read.get_value_type() ) << std::endl; return false; } //Make sure that we have a GdaBinary, //even if (as with SQLite) it's actually a GdaBlob that we get back: const GdaBinary* binary_read = 0; if(value_read_type == GDA_TYPE_BINARY) binary_read = gda_value_get_binary(value_read.gobj()); else if(value_read_type == GDA_TYPE_BLOB) { const GdaBlob* blob = gda_value_get_blob(value_read.gobj()); const bool read_all = gda_blob_op_read_all(const_cast(blob->op), const_cast(blob)); if(!read_all) { std::cerr << "Failure: gda_blob_op_read_all() failed." << std::endl; return false; } binary_read = &(blob->data); } const GdaBinary* binary_set = gda_value_get_binary(value_set.gobj()); if(!binary_set) { std::cerr << "Failure: The value read's data was null." << std::endl; return false; } if(binary_set->binary_length != binary_read->binary_length) { std::cerr << "Failure: The value read's data length was not equal to that of the value set." << std::endl; return false; } if(memcmp(binary_set->data, binary_read->data, binary_set->binary_length) != 0) { std::cerr << "Failure: The value read was not equal to the value set." << std::endl; return false; } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_new_from_example_strangepath.cc0000644000175000017500000000511612234776363027050 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE static bool test(Glom::Document::HostingMode hosting_mode) { Glom::Document document; //Note: We avoid using a path that is longer than 107 characters to avoid a PostgreSQL error. //(107 == sizeof(struct sockaddr_un.sun_path) at least here). murrayc. //See http://lists.debian.org/debian-wb-team/2013/05/msg00015.html //TODO: Fail with long paths meaningfully in the libglom API too, and check for that? const bool recreated = test_create_and_selfhost_from_example("example_music_collection.glom", document, hosting_mode, "path w space and \" and ' and $ and / and \\ "); //hosting_mode, "path with space and \" quote and single ' quote and $ dollar sign and / forward slash and \\ backwards slash "); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } if(!test_example_musiccollection_data(&document)) { std::cerr << "test_example_musiccollection_data() failed." << std::endl; return false; } if(!test_table_exists("songs", document)) { return false; } if(!test_table_exists("publishers", document)) { return false; } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_glade_derived_instantiation.cc0000644000175000017500000002007712234776363024241 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010-2011 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const int GLOM_MAX_WINDOW_WIDTH = 800; const int GLOM_MAX_WINDOW_HEIGHT = 600; template bool instantiate_widget() { //Test that the widget can be instantiated with its own glade ID. T_Widget* widget = 0; Glom::Utils::get_glade_widget_derived_with_warning(widget); if(!widget) { std::cerr << "Test: Failed to instantiate widget of type: " << typeid(T_Widget).name() << std::endl; exit(EXIT_FAILURE); //Make sure that our test case fails. return false; } //Also check that it is not too big for our target minimum screen size. //Note that this is not testing all .glade files, or all windows (some not using glade), //and doesn't even reliably check all uses of .glade files, //but hopefully it will catch some problems: widget->show(); const Gtk::Allocation allocation = widget->get_allocation(); if( (allocation.get_height() > GLOM_MAX_WINDOW_HEIGHT) || (allocation.get_width() > GLOM_MAX_WINDOW_WIDTH)) { std::cerr << "Test: The window/widget is too big: " << T_Widget::glade_id << std::endl; std::cerr << " height=" << allocation.get_height() << std::endl; std::cerr << " width=" << allocation.get_width() << std::endl; std::cerr << " (Ignored, though it should be fixed.)" << std::endl; //TODO: Uncomment this when all the windows are small enough: exit(EXIT_FAILURE); //Make sure that our test case fails. } delete widget; return true; } int main(int argc, char *argv[]) { Glib::RefPtr app = Gtk::Application::create(argc, argv, "org.glom.test_glade_derived_instantiation"); Gsv::init(); //Our .glade files contain gtksourceview widgets too. using namespace Glom; //Operator-mode UI: instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); //Developer mode UI: instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); instantiate_widget(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_document_autosave.cc0000644000175000017500000000620512234252646022232 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include Glib::ustring file_uri; void cleanup() { try { //TODO: Catch exceptions: Glib::RefPtr file = Gio::File::create_for_uri(file_uri); file->remove(); //This should be OK because it is a file, not a directory. } catch(const Gio::Error& ex) { //It's OK if it's not found - we just want to make sure it doesn't exist. if(ex.code() == Gio::Error::NOT_FOUND) return; std::cerr << G_STRFUNC << ": Exception from Gio::File::remove(): " << ex.what() << std::endl << " file_uri= " << file_uri << std::endl; exit(EXIT_FAILURE); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ":Exception from Gio::File::remove(): " << ex.what() << std::endl << " file_uri= " << file_uri << std::endl; exit(EXIT_FAILURE); } } int main() { Glom::libglom_init(); file_uri = Glom::Utils::get_temp_file_uri("testglom_document_autosave", ".glom"); //Make sure that the file does not exist yet: cleanup(); const Glib::ustring test_title = "test_title"; //Test manual saving: { Glom::Document document; document.set_allow_autosave(false); document.set_file_uri(file_uri); document.set_hosting_mode(Glom::Document::HOSTING_MODE_POSTGRES_CENTRAL); document.set_database_title_original(test_title); const bool saved = document.save(); g_assert(saved); } { Glom::Document document; document.set_file_uri(file_uri); int failure_code = 0; const bool test = document.load(failure_code); g_assert(test); g_assert( document.get_database_title_original() == test_title ); } cleanup(); //Test autosaving: { Glom::Document document; document.set_file_uri(file_uri); document.set_hosting_mode(Glom::Document::HOSTING_MODE_POSTGRES_CENTRAL); document.set_allow_autosave(); document.set_database_title_original(test_title); g_assert( !document.get_modified() ); } { Glom::Document document; document.set_file_uri(file_uri); int failure_code = 0; const bool test = document.load(failure_code); g_assert(test); g_assert( document.get_database_title_original() == test_title ); } cleanup(); Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_glade_file_validation.sh0000755000175000017500000000023412234252646023016 0ustar00murraycmurrayc00000000000000#/bin/sh -e for x in $(find ${srcdir}/glom/ -name "*.glade") do # echo Validating $x # TODO: Is there a Glade DTD? xmllint --noout $x || exit 1 done glom-1.22.4/tests/test_selfhosting_new_from_example_in_locales.sh0000755000175000017500000000252512234252646026662 0ustar00murraycmurrayc00000000000000#/bin/sh -e # This test checks that creating from examples works in non-English locales. # This would break if libgda uses locale-dependent code to convert between numbers # and SQL text, as it has in the past. # # This test requires these locales to be installed and configured. # That might be a problem on some systems, so feel free to use a patch to edit this file or disable it altogether. # # These are chosen based on problems found previously, # and the ones with good translations shown here: http://l10n.gnome.org/module/glom/ # TODO: Get a list from po/*.po ? # # On debian/Ubuntu do this: # sudo apt-get install language-pack-de language-pack-es language-pack-fi language-pack-fr language-pack-hu language-pack-it language-pack-pt language-pack-sl language-pack-da language-pack-cz language-pack-nb language-pack-se # # These are apparently not available on Fedora: "da_DK.UTF-8" "cs_CZ.UTF-8" "nb_NO.UTF-8" "sv_SE.UTF-8" locales=("en_US.UTF-8" "en_GB.UTF-8" "en_CA.UTF-8" "de_DE.UTF-8" "es_ES.UTF-8" "fi_FI.UTF-8" "fr_FR.UTF-8" "hu_HU.UTF-8" "it_IT.UTF-8" "pt_PT.UTF-8" "pt_BR.UTF-8" "sl_SI.UTF-8" "da_DK.UTF-8" "cs_CZ.UTF-8" "nb_NO.UTF-8" "sv_SE.UTF-8") for x in "${locales[@]}" do echo testing with LANG and LANGUAGE="$x" export LANG="$x" export LANGUAGE="$x" export LC_TIME="$x" tests/test_selfhosting_new_from_example || exit 1 done glom-1.22.4/tests/test_fake_connection.cc0000644000175000017500000000626212234776363021644 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include int main() { Glom::libglom_init(); // Get a URI for a test file: Glib::ustring uri; try { const std::string path = Glib::build_filename(GLOM_DOCDIR_EXAMPLES_NOTINSTALLED, "example_music_collection.glom"); uri = Glib::filename_to_uri(path); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return EXIT_FAILURE; } // Load the document: Glom::Document document; document.set_file_uri(uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } //Allow a fake connection, so sqlbuilder_get_full_query() can work: Glom::DbUtils::set_fake_connection(); //Build a SQL query and get the string for it: const Gnome::Gda::Value value("Born To Run"); Glom::sharedptr where_field = document.get_field("albums", "name"); const Gnome::Gda::SqlExpr where_clause = Glom::Utils::build_simple_where_expression("albums", where_field, value); Glom::Utils::type_vecLayoutFields fieldsToGet; Glom::sharedptr field = document.get_field("albums", "album_id"); Glom::sharedptr layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); field = document.get_field("albums", "name"); layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); const Glib::RefPtr builder = Glom::Utils::build_sql_select_with_where_clause("albums", fieldsToGet, where_clause); const Glib::ustring& query = Glom::Utils::sqlbuilder_get_full_query(builder); g_assert(!query.empty()); if(query.find("album_id") == Glib::ustring::npos) { std::cerr << "Failed: The query did not contain an expected field name." << std::endl; return EXIT_FAILURE; } //std::cout << "query: " << query << std::endl; Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_new_then_alter_table.cc0000644000175000017500000000615712234776363025274 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE #include //For memcmp(). static bool do_test(Glom::Document::HostingMode hosting_mode, const Glib::ustring& first_table_name, const Glib::ustring& renamed_table_name) { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_smallbusiness.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } if(!Glom::DbUtils::create_table_with_default_fields(&document, first_table_name)) { std::cerr << "Failure: create_table_with_default_fields() failed." << std::endl; return false; } if(!Glom::DbUtils::rename_table(first_table_name, renamed_table_name)) { std::cerr << "Failure: rename_table() failed." << std::endl; return false; } if(!Glom::DbUtils::drop_table(renamed_table_name)) { std::cerr << "Failure: drop_table() failed." << std::endl; return false; } test_selfhosting_cleanup(); return true; } static bool test(Glom::Document::HostingMode hosting_mode) { const Glib::ustring table_name = "sometable"; const Glib::ustring new_table_name = "renamedtable"; bool result = do_test(hosting_mode, table_name, new_table_name); if(!result) return false; result = do_test(hosting_mode, table_name + "-plusahyphen", new_table_name + "-plusahyphen"); if(!result) return false; /* TODO: Uncomment this when this libgda bug is fixed: * https://bugzilla.gnome.org/show_bug.cgi?id=663608 result = do_test(hosting_mode, table_name + "with\"quote", new_table_name + "with\"quote"); if(!result) return false; */ return result; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_document_load_and_save_all.sh0000755000175000017500000000023312234252646024035 0ustar00murraycmurrayc00000000000000#/bin/sh -e for x in $(find ${srcdir}/examples/ -name "*.glom") do tests/test_document_load_and_save $x ${srcdir}/glom/glom_document.dtd || exit 1 done glom-1.22.4/tests/translations_po/0000755000175000017500000000000012235000127020335 5ustar00murraycmurrayc00000000000000glom-1.22.4/tests/translations_po/test_document_export_po.cc0000644000175000017500000001015612234776363025650 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include //For GLOM_MSGFMT #include #include #include #include #include #include #include #include #include #include #include static bool check_po_file(const std::string& filepath) { if(filepath.empty()) return false; //We could use the gettext-po po_file_check_all() function to check //the file, but the gettext-po error handling is very awkward, //so let's keep it simple: int return_status = EXIT_FAILURE; std::string stdout_output; const Glib::ustring command = Glib::ustring::compose(GLOM_MSGFMT " %1", Glib::shell_quote(filepath)); try { Glib::spawn_command_line_sync(command, &stdout_output, 0, &return_status); //std::cout << " debug: output=" << stdout_output << std::endl; } catch(const Glib::Error& ex) { std::cerr << "Exception caught: " << ex.what() << std::endl; } if(return_status != EXIT_SUCCESS) { std::cout << stdout_output << std::endl; return false; } return true; } int main() { Glom::libglom_init(); // Get a URI for a test file: Glib::ustring uri; try { const std::string path = Glib::build_filename(GLOM_DOCDIR_EXAMPLES_NOTINSTALLED, "example_film_manager.glom"); uri = Glib::filename_to_uri(path); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return EXIT_FAILURE; } //std::cout << "URI=" << uri << std::endl; // Load the document: Glom::Document document; document.set_file_uri(uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } const Glib::ustring po_file_uri = Glom::Utils::get_temp_file_uri("glom_export.po"); if(po_file_uri.empty()) { std::cerr << "Could not generate a temporary file URI=" << std::endl; return EXIT_FAILURE; } //std::cout << "po file URI: " << po_file_uri << std::endl; const Glib::ustring locale = "de"; const bool success = Glom::write_translations_to_po_file(&document, po_file_uri, locale); if(!success) { std::cerr << "Glom::write_translations_to_po_file() failed." << std::endl; return EXIT_FAILURE; } //Get a filepath for the URI: std::string po_file_path; try { po_file_path = Glib::filename_from_uri(po_file_uri); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return EXIT_FAILURE; } //Check that the exported po file contains an expected string: std::string data; try { data = Glib::file_get_contents(po_file_path); } catch(const Glib::Error& ex) { std::cerr << "Failed: file_get_contents() failed: " << ex.what() << std::endl; return EXIT_FAILURE; } bool text_found = (data.find("Stabliste") != std::string::npos); g_assert(text_found); text_found = (data.find("\u00DCbersicht") != std::string::npos); g_assert(text_found); //Check that the .po file is valid: check_po_file(po_file_path); //TODO: Remove po_file_uri Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/translations_po/data/0000755000175000017500000000000012235000126021245 5ustar00murraycmurrayc00000000000000glom-1.22.4/tests/translations_po/data/test.po0000644000175000017500000006603312234252646022613 0ustar00murraycmurrayc00000000000000msgid "" msgstr "" "Project-Id-Version: Openismus Film Manager\n" "product=glom&keywords=I18N+L10N&component=general\n" "PO-Revision-Date: 2012-01-08 22:38+0100\n" "Last-Translator: Someone \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgctxt "Table (accommodation)" msgid "Accommodation" msgstr "Unterkunft" msgctxt "Field (accommodation_id). Parent table: accommodation" msgid "Accommodation ID" msgstr "Unterkunft ID" msgctxt "Field (description). Parent table: accommodation" msgid "Description" msgstr "Beschreibung" msgctxt "Field (comments). Parent table: accommodation" msgid "Comments" msgstr "Kommentare" msgctxt "Field (address_street). Parent table: accommodation" msgid "Street" msgstr "Strasse" msgctxt "Field (address_town). Parent table: accommodation" msgid "Town" msgstr "Ort" msgctxt "Field (address_county). Parent table: accommodation" msgid "County" msgstr "Bundesland/Kanton" msgctxt "Field (address_country). Parent table: accommodation" msgid "Country" msgstr "Land" msgctxt "Field (address_postcode). Parent table: accommodation" msgid "Postcode" msgstr "Postleitzahl" msgctxt "Field (contact_id). Parent table: accommodation" msgid "Contact ID" msgstr "Kontakt ID" msgctxt "Field (name). Parent table: accommodation" msgid "Name" msgstr "" msgctxt "Relationship (contacts). Parent table: accommodation" msgid "Contacts" msgstr "Kontakte" msgctxt "Layout Group (overview). Parent table: accommodation" msgid "Overview" msgstr "" msgctxt "" "Layout Group (address). Parent table: accommodation, Parent Group: details" msgid "Address" msgstr "Addresse" msgctxt "" "Layout Group (contact). Parent table: accommodation, Parent Group: details" msgid "Contact" msgstr "Kontakt" msgctxt "Table (cars)" msgid "Cars" msgstr "Autos" msgctxt "Field (car_id). Parent table: cars" msgid "Car ID" msgstr "Auto ID" msgctxt "Field (manufacturer). Parent table: cars" msgid "Manufacturer" msgstr "Hersteller" msgctxt "Field (model). Parent table: cars" msgid "Model" msgstr "Model" msgctxt "Field (registration). Parent table: cars" msgid "Registration" msgstr "Kennzeichnung" msgctxt "Field (description). Parent table: cars" msgid "Description" msgstr "Beschreibung" msgctxt "Field (comment). Parent table: cars" msgid "Comment" msgstr "Kommentar" msgctxt "Layout Group (overview). Parent table: cars" msgid "Overview" msgstr "bersicht" msgctxt "Layout Group (details). Parent table: cars" msgid "Details" msgstr "Details" msgctxt "Table (characters)" msgid "Characters" msgstr "Besetzung" msgctxt "Field (character_id). Parent table: characters" msgid "Cast ID" msgstr "Besetzung ID" msgctxt "Field (character). Parent table: characters" msgid "Character" msgstr "Charakter" msgctxt "Field (comments). Parent table: characters" msgid "Comments" msgstr "Kommentar" msgctxt "Field (contact_id). Parent table: characters" msgid "Contact ID" msgstr "Kontakt ID" msgctxt "Field (mainpart). Parent table: characters" msgid "Main Part" msgstr "Hauptrolle" msgctxt "Relationship (contacts_actor). Parent table: characters" msgid "Actor" msgstr "Schauspieler" msgctxt "Relationship (scenes). Parent table: characters" msgid "Scenes" msgstr "" msgctxt "Report (cast_list). Parent table: characters" msgid "Cast List" msgstr "Besetzungsliste" msgctxt "Custom Title. Parent table: characters, Parent Report: cast_list" msgid "Actor" msgstr "Schauspieler" msgctxt "Custom Title. Parent table: characters, Parent Report: cast_list" msgid "Agent" msgstr "" msgctxt "Layout Group (overview). Parent table: characters, Parent Group: main" msgid "Overview" msgstr "bersicht" msgctxt "Layout Group (details). Parent table: characters, Parent Group: main" msgid "Details" msgstr "Details" msgctxt "" "Layout Group (actor). Parent table: characters, Parent Group: main, Parent " "Group: details" msgid "Actor" msgstr "Schauspieler" msgctxt "Custom Title. Parent table: characters, Parent Group: main" msgid "Actor's Contact ID" msgstr "Schauspieler Kontakt ID" msgctxt "Custom Title. Parent table: characters, Parent Group: main" msgid "Actor's Name" msgstr "Schauspieler Name" msgctxt "Layout Group (overview). Parent table: characters" msgid "Overview" msgstr "" msgctxt "Layout Group (details). Parent table: characters" msgid "Details" msgstr "" msgctxt "Layout Group (actor). Parent table: characters, Parent Group: details" msgid "Actor" msgstr "" msgctxt "" "Custom Title. Parent table: characters, Parent Group: details, Parent Group: " "actor" msgid "Actor's Name" msgstr "Schauspieler Name" msgctxt "Custom Title. Parent table: characters, Parent Group: main" msgid "Actor" msgstr "" msgctxt "Table (companies)" msgid "Companies" msgstr "Firmen" msgctxt "Field (company_id). Parent table: companies" msgid "Company ID" msgstr "Firma ID" msgctxt "Field (name). Parent table: companies" msgid "Name" msgstr "" msgctxt "Field (comments). Parent table: companies" msgid "Comments" msgstr "Kommentar" msgctxt "Field (description). Parent table: companies" msgid "Description" msgstr "Beschreibung" msgctxt "Field (logo). Parent table: companies" msgid "Logo" msgstr "" msgctxt "Field (website). Parent table: companies" msgid "Web Site" msgstr "Website" msgctxt "Relationship (staff). Parent table: companies" msgid "Staff" msgstr "Angestellte" msgctxt "Layout Group (overview). Parent table: companies" msgid "Overview" msgstr "bersicht" msgctxt "Layout Group (details). Parent table: companies" msgid "Details" msgstr "Details" msgctxt "Table (contacts)" msgid "Contacts" msgstr "Kontakte" msgctxt "Field (contact_id). Parent table: contacts" msgid "Contact ID" msgstr "Kontakt ID" msgctxt "Field (name_first). Parent table: contacts" msgid "First Name" msgstr "Vorname" msgctxt "Field (name_middle). Parent table: contacts" msgid "Second Name" msgstr "Zweiter Name" msgctxt "Field (name_last). Parent table: contacts" msgid "Last Name" msgstr "Familiename" msgctxt "Field (name_title). Parent table: contacts" msgid "Title" msgstr "Titel" msgctxt "Field Choice. Parent table: contacts, Parent Field: name_title" msgid "Mr" msgstr "" msgctxt "Field Choice. Parent table: contacts, Parent Field: name_title" msgid "Ms" msgstr "" msgctxt "Field Choice. Parent table: contacts, Parent Field: name_title" msgid "Mrs" msgstr "" msgctxt "Field Choice. Parent table: contacts, Parent Field: name_title" msgid "Miss" msgstr "" msgctxt "Field Choice. Parent table: contacts, Parent Field: name_title" msgid "Dr" msgstr "" msgctxt "Field Choice. Parent table: contacts, Parent Field: name_title" msgid "Prof" msgstr "" msgctxt "Field (address_street2). Parent table: contacts" msgid "Street (line 2)" msgstr "Strasse (2)" msgctxt "Field (address_town). Parent table: contacts" msgid "Town" msgstr "Ort" msgctxt "Field (address_state). Parent table: contacts" msgid "State" msgstr "Bundesland/Kanton" msgctxt "Field (address_country). Parent table: contacts" msgid "Country" msgstr "Land" msgctxt "Field Choice. Parent table: contacts, Parent Field: address_country" msgid "Germany" msgstr "" msgctxt "Field Choice. Parent table: contacts, Parent Field: address_country" msgid "United Kingdom" msgstr "" msgctxt "Field Choice. Parent table: contacts, Parent Field: address_country" msgid "USA" msgstr "" msgctxt "Field Choice. Parent table: contacts, Parent Field: address_country" msgid "France" msgstr "" msgctxt "Field Choice. Parent table: contacts, Parent Field: address_country" msgid "Spain" msgstr "" msgctxt "Field (address_postcode). Parent table: contacts" msgid "Postcode" msgstr "Postleitzahl" msgctxt "Field (date_of_birth). Parent table: contacts" msgid "Date Of Birth" msgstr "Geburtsdatum" msgctxt "Field (comments). Parent table: contacts" msgid "Comments" msgstr "Kommentare" msgctxt "Field (name_full). Parent table: contacts" msgid "Full Name" msgstr "Vollstndiger Name" msgctxt "Field (company_id). Parent table: contacts" msgid "Company ID" msgstr "Firma ID" msgctxt "Field (picture). Parent table: contacts" msgid "Picture" msgstr "Bild" msgctxt "Field (tel_home). Parent table: contacts" msgid "Home Telephone" msgstr "Telefon (Privat)" msgctxt "Field (tel_mobile). Parent table: contacts" msgid "Mobile Telephone" msgstr "Telefon (Handy)" msgctxt "Field (tel_fax). Parent table: contacts" msgid "Fax" msgstr "" msgctxt "Field (tel_work). Parent table: contacts" msgid "Work Telephone" msgstr "Telefon (Buro)" msgctxt "Field (email). Parent table: contacts" msgid "Email" msgstr "E-Mail" msgctxt "Field (address_street1). Parent table: contacts" msgid "Street (line 1)" msgstr "Strasse (1)" msgctxt "Field (website). Parent table: contacts" msgid "Web Site" msgstr "Website" msgctxt "Field (agent_id). Parent table: contacts" msgid "Agent ID" msgstr "" msgctxt "Field (stagename). Parent table: contacts" msgid "Stagename" msgstr "Knstlername" msgctxt "Relationship (company). Parent table: contacts" msgid "Company" msgstr "Firma" msgctxt "Relationship (agent). Parent table: contacts" msgid "Agent" msgstr "" msgctxt "Relationship (crew). Parent table: contacts" msgid "Crew" msgstr "" msgctxt "Relationship (cast). Parent table: contacts" msgid "Cast" msgstr "" msgctxt "Report (by_country). Parent table: contacts" msgid "Contacts By Country" msgstr "" msgctxt "Report (by_country_by_town). Parent table: contacts" msgid "By Country, By Town" msgstr "" msgctxt "Layout Group (overview). Parent table: contacts" msgid "Overview" msgstr "bersicht" msgctxt "Layout Group (details). Parent table: contacts" msgid "Details" msgstr "Details" msgctxt "" "Layout Group (name). Parent table: contacts, Parent Group: details, Parent " "Group: notebook_contact" msgid "Name" msgstr "Name" msgctxt "" "Layout Group (company). Parent table: contacts, Parent Group: details, " "Parent Group: notebook_contact" msgid "Company" msgstr "Firma" msgctxt "" "Layout Group (address). Parent table: contacts, Parent Group: details, " "Parent Group: notebook_contact" msgid "Address" msgstr "Addresse" msgctxt "" "Layout Group (telephone). Parent table: contacts, Parent Group: details, " "Parent Group: notebook_contact" msgid "Telephone" msgstr "Telefon" msgctxt "" "Layout Group (agent). Parent table: contacts, Parent Group: details, Parent " "Group: notebook_contact" msgid "Agent" msgstr "Agent" msgctxt "Custom Title. Parent table: contacts, Parent Group: main" msgid "Company Name" msgstr "" msgctxt "Table (costume)" msgid "Costume" msgstr "" msgctxt "Field (costume_id). Parent table: costume" msgid "Costume ID" msgstr "" msgctxt "Field (description). Parent table: costume" msgid "Description" msgstr "" msgctxt "Field (comments). Parent table: costume" msgid "Comments" msgstr "" msgctxt "Field (name). Parent table: costume" msgid "Name" msgstr "" msgctxt "Layout Group (overview). Parent table: costume" msgid "Overview" msgstr "" msgctxt "Layout Group (details). Parent table: costume" msgid "Details" msgstr "" msgctxt "Table (crew)" msgid "Crew" msgstr "" msgctxt "Field (crew_id). Parent table: crew" msgid "Crew ID" msgstr "" msgctxt "Field (description). Parent table: crew" msgid "Description" msgstr "Beschreibung" msgctxt "Field (comments). Parent table: crew" msgid "Comments" msgstr "Kommentar" msgctxt "Field (dept_id). Parent table: crew" msgid "Department ID" msgstr "Abteilung ID" msgctxt "Field (contact_id). Parent table: crew" msgid "Contact ID" msgstr "Kontakt ID" msgctxt "Relationship (contacts). Parent table: crew" msgid "Contacts" msgstr "Kontakten" msgctxt "Relationship (departments). Parent table: crew" msgid "Departments" msgstr "Abteilungen" msgctxt "Relationship (scenes). Parent table: crew" msgid "Scenes" msgstr "Szenen" msgctxt "Report (crew_list). Parent table: crew" msgid "Crew List" msgstr "TestResult2" msgctxt "Custom Title. Parent table: crew, Parent Report: crew_list" msgid "Department Name" msgstr "Abteilungsname" msgctxt "Layout Group (overview). Parent table: crew" msgid "Overview" msgstr "bersicht" msgctxt "Layout Group (department). Parent table: crew, Parent Group: details" msgid "Department" msgstr "Abteilung" msgctxt "Layout Group (contact). Parent table: crew, Parent Group: details" msgid "Contact" msgstr "Kontakt" msgctxt "" "Layout Group (address). Parent table: crew, Parent Group: details, Parent " "Group: contact" msgid "Address" msgstr "Addresse" msgctxt "" "Layout Group (agent). Parent table: crew, Parent Group: details, Parent " "Group: contact" msgid "Agent" msgstr "Agent" msgctxt "Custom Title. Parent table: crew, Parent Group: main" msgid "Department Name" msgstr "Abteilungsname" msgctxt "Table (deliveries)" msgid "Deliveries" msgstr "Lieferungen" msgctxt "Field (delivery_id). Parent table: deliveries" msgid "Delivery ID" msgstr "Lieferung ID" msgctxt "Field (arrival_date). Parent table: deliveries" msgid "Arrival Date" msgstr "Lieferungsdatum" msgctxt "Field (departure_contact_id). Parent table: deliveries" msgid "Contact ID" msgstr "Kontakt ID" msgctxt "Field (arrival_contact_id). Parent table: deliveries" msgid "Contact ID" msgstr "Kontakt ID" msgctxt "Field (arrival_time). Parent table: deliveries" msgid "Arrival Time" msgstr "Lieferungszeit" msgctxt "Field (arrival_place). Parent table: deliveries" msgid "Arrival Place" msgstr "Lieferungsaddresse" msgctxt "Field (departure_time). Parent table: deliveries" msgid "Departure Time" msgstr "Sendungszeit" msgctxt "Field (departure_date). Parent table: deliveries" msgid "Departure Date" msgstr "Sendungsdatum" msgctxt "Field (departure_place). Parent table: deliveries" msgid "Departure Place" msgstr "Sendungsaddresse" msgctxt "Field (comments). Parent table: deliveries" msgid "Comments" msgstr "Kommentare" msgctxt "Field (description). Parent table: deliveries" msgid "Description" msgstr "Beschreibung" msgctxt "Relationship (departure_contact). Parent table: deliveries" msgid "Departure Contact" msgstr "Sendungskontakt" msgctxt "Relationship (arrival_contact). Parent table: deliveries" msgid "Arrival Contact" msgstr "Empfaengerkontakt" msgctxt "Custom Title. Parent table: deliveries, Parent Group: main" msgid "Departure Name" msgstr "Sendername" msgctxt "Custom Title. Parent table: deliveries, Parent Group: main" msgid "Arrival Name" msgstr "Empfngerkontakt" msgctxt "Layout Group (overview). Parent table: deliveries" msgid "Overview" msgstr "" msgctxt "" "Layout Group (departure). Parent table: deliveries, Parent Group: details" msgid "Departure" msgstr "Departure" msgctxt "" "Layout Group (arrival). Parent table: deliveries, Parent Group: details" msgid "Arrival" msgstr "Arrival" msgctxt "Table (departments)" msgid "Departments" msgstr "Abteilungen" msgctxt "Field (departments_id). Parent table: departments" msgid "Department ID" msgstr "Abteilung ID" msgctxt "Field (name). Parent table: departments" msgid "Name" msgstr "" msgctxt "Field (comments). Parent table: departments" msgid "Comments" msgstr "Kommentar" msgctxt "Relationship (department_crew). Parent table: departments" msgid "Department Crew" msgstr "Abteilung Crew" msgctxt "Layout Group (overview). Parent table: departments" msgid "Overview" msgstr "bersicht" msgctxt "Table (equipment)" msgid "Equipment" msgstr "" msgctxt "Field (equipment_id). Parent table: equipment" msgid "Equipment ID" msgstr "" msgctxt "Field (description). Parent table: equipment" msgid "Description" msgstr "Beschreibung" msgctxt "Field (comments). Parent table: equipment" msgid "Comments" msgstr "Kommentar" msgctxt "Relationship (scenes). Parent table: equipment" msgid "Scenes" msgstr "Szenen" msgctxt "Layout Group (overview). Parent table: equipment" msgid "Overview" msgstr "bersicht" msgctxt "Layout Group (details). Parent table: equipment" msgid "Details" msgstr "Details" msgctxt "Table (journeys)" msgid "Journeys" msgstr "Fahrten" msgctxt "Field (journey_id). Parent table: journeys" msgid "Journey ID" msgstr "Fahrt ID" msgctxt "Field (comment). Parent table: journeys" msgid "Comment" msgstr "Kommentar" msgctxt "Field (description). Parent table: journeys" msgid "Description" msgstr "Beschreibung" msgctxt "Field (arrival_date). Parent table: journeys" msgid "Arrival Date" msgstr "" msgctxt "Field (arrival_time). Parent table: journeys" msgid "Arrival Time" msgstr "" msgctxt "Field (arrival_place). Parent table: journeys" msgid "Arrival Place" msgstr "" msgctxt "Field (departure_date). Parent table: journeys" msgid "Departure Date" msgstr "" msgctxt "Field (departure_time). Parent table: journeys" msgid "Departure Time" msgstr "" msgctxt "Field (departure_place). Parent table: journeys" msgid "Departure Place" msgstr "" msgctxt "Field (contact_id). Parent table: journeys" msgid "Contact ID" msgstr "Kontakt ID" msgctxt "Relationship (contacts). Parent table: journeys" msgid "Contacts" msgstr "Kontakte" msgctxt "Layout Group (overview). Parent table: journeys" msgid "Overview" msgstr "" msgctxt "Layout Group (person). Parent table: journeys, Parent Group: details" msgid "Person" msgstr "Person" msgctxt "" "Layout Group (departure). Parent table: journeys, Parent Group: details" msgid "Departure" msgstr "Departure" msgctxt "Layout Group (arrival). Parent table: journeys, Parent Group: details" msgid "Arrival" msgstr "Arrival" msgctxt "Table (locations)" msgid "Locations" msgstr "" msgctxt "Field (location_id). Parent table: locations" msgid "Location ID" msgstr "" msgctxt "Field (name). Parent table: locations" msgid "Name" msgstr "" msgctxt "Field (address_street). Parent table: locations" msgid "Street" msgstr "Strasse" msgctxt "Field (address_town). Parent table: locations" msgid "Town" msgstr "Stadt" msgctxt "Field (address_county). Parent table: locations" msgid "County" msgstr "Land" msgctxt "Field (address_country). Parent table: locations" msgid "Country" msgstr "Staat" msgctxt "Field (address_postcode). Parent table: locations" msgid "Postcode" msgstr "Postleitzahl" msgctxt "Field (comments). Parent table: locations" msgid "Comments" msgstr "Kommentar" msgctxt "Field (contact_id). Parent table: locations" msgid "Contact ID" msgstr "" msgctxt "Field (rent). Parent table: locations" msgid "Rent" msgstr "" msgctxt "Relationship (scenes). Parent table: locations" msgid "Scenes" msgstr "Szenen" msgctxt "Relationship (contacts). Parent table: locations" msgid "Contacts" msgstr "" msgctxt "Layout Group (overview). Parent table: locations" msgid "Overview" msgstr "" msgctxt "" "Layout Group (address). Parent table: locations, Parent Group: details" msgid "Address" msgstr "Addresse" msgctxt "" "Layout Group (contact_person). Parent table: locations, Parent Group: details" msgid "Contact Person" msgstr "Contact Person" msgctxt "Table (props)" msgid "Props" msgstr "" msgctxt "Field (prop_id). Parent table: props" msgid "Prop ID" msgstr "" msgctxt "Field (description). Parent table: props" msgid "Description" msgstr "" msgctxt "Field (comments). Parent table: props" msgid "Comments" msgstr "" msgctxt "Field (name). Parent table: props" msgid "Name" msgstr "" msgctxt "Layout Group (overview). Parent table: props" msgid "Overview" msgstr "" msgctxt "Layout Group (details). Parent table: props" msgid "Details" msgstr "" msgctxt "Table (scene_cast)" msgid "Scene Cast" msgstr "Szene Besetzung" msgctxt "Field (scene_cast_id). Parent table: scene_cast" msgid "Scene Cast ID" msgstr "Szene Besetzung ID" msgctxt "Field (comments). Parent table: scene_cast" msgid "Comments" msgstr "Kommentar" msgctxt "Field (cast_id). Parent table: scene_cast" msgid "Cast ID" msgstr "Besetzung ID" msgctxt "Field (scene_id). Parent table: scene_cast" msgid "Scene ID" msgstr "Szene ID" msgctxt "Relationship (cast). Parent table: scene_cast" msgid "Cast" msgstr "Besetzung" msgctxt "Layout Group (overview). Parent table: scene_cast, Parent Group: main" msgid "Overview" msgstr "" msgctxt "Layout Group (details). Parent table: scene_cast, Parent Group: main" msgid "Details" msgstr "" msgctxt "Table (scene_costume)" msgid "Scene Costume" msgstr "" msgctxt "Field (scene_costume_id). Parent table: scene_costume" msgid "Scene Costume ID" msgstr "" msgctxt "Field (comments). Parent table: scene_costume" msgid "Comments" msgstr "" msgctxt "Field (scene_id). Parent table: scene_costume" msgid "Scene Id" msgstr "" msgctxt "Field (costume_id). Parent table: scene_costume" msgid "Costume ID" msgstr "" msgctxt "Relationship (costume). Parent table: scene_costume" msgid "Costume" msgstr "" msgctxt "Layout Group (overview). Parent table: scene_costume" msgid "Overview" msgstr "" msgctxt "Layout Group (details). Parent table: scene_costume" msgid "Details" msgstr "" msgctxt "Custom Title. Parent table: scene_costume, Parent Group: details" msgid "Costume Name" msgstr "" msgctxt "Table (scene_crew)" msgid "Scene Crew" msgstr "Szene Crew" msgctxt "Field (scene_crew_id). Parent table: scene_crew" msgid "Scene Crew ID" msgstr "Szene Crew ID" msgctxt "Field (comments). Parent table: scene_crew" msgid "Comments" msgstr "Kommentar" msgctxt "Field (scene_id). Parent table: scene_crew" msgid "Scene ID" msgstr "Szene ID" msgctxt "Field (department_id). Parent table: scene_crew" msgid "Department ID" msgstr "" msgctxt "Relationship (department). Parent table: scene_crew" msgid "Department" msgstr "" msgctxt "Relationship (scenes). Parent table: scene_crew" msgid "Scenes" msgstr "Szenen" msgctxt "Layout Group (overview). Parent table: scene_crew, Parent Group: main" msgid "Overview" msgstr "bersicht" msgctxt "Layout Group (details). Parent table: scene_crew, Parent Group: main" msgid "Details" msgstr "Details" msgctxt "Field (scene_equipment_id). Parent table: scene_equipment" msgid "Scene Equipment ID" msgstr "" msgctxt "Field (comments). Parent table: scene_equipment" msgid "Comments" msgstr "Kommentar" msgctxt "Field (equipment_id). Parent table: scene_equipment" msgid "Equipment ID" msgstr "" msgctxt "Field (scene_id). Parent table: scene_equipment" msgid "Scene ID" msgstr "" msgctxt "Layout Group (overview). Parent table: scene_equipment" msgid "Overview" msgstr "" msgctxt "Layout Group (details). Parent table: scene_equipment" msgid "Details" msgstr "" msgctxt "Table (scene_extras)" msgid "Scene Extras" msgstr "" msgctxt "Field (scene_extras_id). Parent table: scene_extras" msgid "Scene Extras ID" msgstr "" msgctxt "Field (description). Parent table: scene_extras" msgid "Description" msgstr "" msgctxt "Field (comments). Parent table: scene_extras" msgid "Comments" msgstr "" msgctxt "Field (scene_id). Parent table: scene_extras" msgid "Scene ID" msgstr "" msgctxt "Field (contact_id). Parent table: scene_extras" msgid "Contact ID" msgstr "" msgctxt "Relationship (contact). Parent table: scene_extras" msgid "Contact" msgstr "" msgctxt "" "Layout Group (overview). Parent table: scene_extras, Parent Group: main" msgid "Overview" msgstr "" msgctxt "" "Layout Group (details). Parent table: scene_extras, Parent Group: main" msgid "Details" msgstr "" msgctxt "Table (scene_makeup)" msgid "Scene Makeup" msgstr "" msgctxt "Field (scene_makeup_id). Parent table: scene_makeup" msgid "Scene Makeup ID" msgstr "" msgctxt "Field (description). Parent table: scene_makeup" msgid "Description" msgstr "" msgctxt "Field (comments). Parent table: scene_makeup" msgid "Comments" msgstr "" msgctxt "Field (scene_id). Parent table: scene_makeup" msgid "Scene ID" msgstr "" msgctxt "Layout Group (overview). Parent table: scene_makeup" msgid "Overview" msgstr "" msgctxt "Layout Group (details). Parent table: scene_makeup" msgid "Details" msgstr "" msgctxt "Table (scene_props)" msgid "Scene Props" msgstr "" msgctxt "Field (scene_props_id). Parent table: scene_props" msgid "Scene Prop ID" msgstr "" msgctxt "Field (comments). Parent table: scene_props" msgid "Comments" msgstr "" msgctxt "Field (scene_id). Parent table: scene_props" msgid "Scene ID" msgstr "" msgctxt "Field (prop_id). Parent table: scene_props" msgid "Prop ID" msgstr "" msgctxt "Relationship (props). Parent table: scene_props" msgid "Props" msgstr "" msgctxt "Layout Group (overview). Parent table: scene_props" msgid "Overview" msgstr "" msgctxt "Layout Group (details). Parent table: scene_props" msgid "Details" msgstr "" msgctxt "Table (scenes)" msgid "Scenes" msgstr "TestResult1" msgctxt "Field (scene_id). Parent table: scenes" msgid "Scene ID" msgstr "Szene ID" msgctxt "Field (comments). Parent table: scenes" msgid "Comments" msgstr "Kommentar" msgctxt "Field (description). Parent table: scenes" msgid "Description" msgstr "Beschreibung" msgctxt "Field (location_id). Parent table: scenes" msgid "Location ID" msgstr "" msgctxt "Field (date). Parent table: scenes" msgid "Date" msgstr "Termin" msgctxt "Field (time). Parent table: scenes" msgid "Time" msgstr "Zeit" msgctxt "Field (minutes). Parent table: scenes" msgid "Stop (minutes)" msgstr "Stunde" msgctxt "Field (day_or_night). Parent table: scenes" msgid "Day/Night" msgstr "Tag/Nacht" msgctxt "Field Choice. Parent table: scenes, Parent Field: day_or_night" msgid "Day" msgstr "Tag" msgctxt "Field Choice. Parent table: scenes, Parent Field: day_or_night" msgid "Night" msgstr "Nacht" msgctxt "Field Choice. Parent table: scenes, Parent Field: day_or_night" msgid "Morning" msgstr "" msgctxt "Field Choice. Parent table: scenes, Parent Field: day_or_night" msgid "Evening" msgstr "" msgctxt "Field Choice. Parent table: scenes, Parent Field: day_or_night" msgid "Dawn" msgstr "" msgctxt "Field (interior_or_exterior). Parent table: scenes" msgid "Interior/Exterior" msgstr "Interior/Exterior" msgctxt "" "Field Choice. Parent table: scenes, Parent Field: interior_or_exterior" msgid "Interior" msgstr "" msgctxt "" "Field Choice. Parent table: scenes, Parent Field: interior_or_exterior" msgid "Exterior" msgstr "" msgctxt "Field (name). Parent table: scenes" msgid "Name" msgstr "Szene" msgctxt "Field (overview_name). Parent table: scenes" msgid "Scene" msgstr "" msgctxt "Field (pages). Parent table: scenes" msgid "Pages" msgstr "" msgctxt "Field (script_day). Parent table: scenes" msgid "Script Day" msgstr "" msgctxt "Relationship (location). Parent table: scenes" msgid "Locations" msgstr "" msgctxt "Relationship (scene_crew). Parent table: scenes" msgid "Additional Crew" msgstr "Szene Crew" msgctxt "Relationship (scene_cast). Parent table: scenes" msgid "Cast" msgstr "Szene Besetzung" msgctxt "Relationship (scene_equipment). Parent table: scenes" msgid "Additional Equipment" msgstr "" msgctxt "Relationship (scene_extras). Parent table: scenes" msgid "Extras" msgstr "" msgctxt "Relationship (scene_props). Parent table: scenes" msgid "Props" msgstr "" msgctxt "Relationship (scene_costume). Parent table: scenes" msgid "Costume" msgstr "" msgctxt "Relationship (scene_makeup). Parent table: scenes" msgid "Additional Makeup" msgstr "" msgctxt "Layout Group (overview). Parent table: scenes" msgid "Overview" msgstr "bersicht" msgctxt "Layout Group (details). Parent table: scenes" msgid "Details" msgstr "Details" msgctxt "Layout Group (scenario). Parent table: scenes, Parent Group: details" msgid "Scenario" msgstr "Stimmung" msgctxt "Layout Group (location). Parent table: scenes, Parent Group: details" msgid "Location" msgstr "Location" msgctxt "" "Custom Title. Parent table: scenes, Parent Group: details, Parent Group: " "location" msgid "Contact Name" msgstr "" msgctxt "" "Custom Title. Parent table: scenes, Parent Group: details_lower, Parent " "Group: notebook" msgid "Actor's Name" msgstr "" glom-1.22.4/tests/translations_po/test_document_import_po.cc0000644000175000017500000000710512234776363025641 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include int main() { Glom::libglom_init(); // Get a URI for a test file: Glib::ustring uri; try { const std::string path = Glib::build_filename(GLOM_DOCDIR_EXAMPLES_NOTINSTALLED, "example_film_manager.glom"); uri = Glib::filename_to_uri(path); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return EXIT_FAILURE; } //std::cout << "URI=" << uri << std::endl; // Load the document: Glom::Document document; document.set_file_uri(uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } document.set_allow_autosave(false); //Do not save changes back to the example file: Glib::ustring po_file_uri; try { const std::string path = Glib::build_filename(GLOM_TESTS_TRANSLATIONS_PO_DATA_NOTINSTALLED, "test.po"); po_file_uri = Glib::filename_to_uri(path); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return EXIT_FAILURE; } if(po_file_uri.empty()) { std::cerr << "po_file_uri was empty." << std::endl; return EXIT_FAILURE; } //std::cout << "po file URI: " << po_file_uri << std::endl; const Glib::ustring locale = "de"; const bool success = Glom::import_translations_from_po_file(&document, po_file_uri, locale); if(!success) { std::cerr << "Glom::import_translations_from_po_file() failed." << std::endl; return EXIT_FAILURE; } //Check that some expected translated titles are now in the document: Glom::sharedptr table = document.get_table("scenes"); g_assert(table); g_assert( table->get_title_original() == "Scenes" ); //The original title should be unchanged: //This should have a new translated title: if(table->get_title_translation(locale) != "TestResult1") { std::cerr << "Failure: Unexpected translated report title." << std::endl; return EXIT_FAILURE; } const Glom::sharedptr report = document.get_report("crew", "crew_list"); g_assert(report); g_assert(report->get_title_original() == "Crew List"); //The original title should be unchanged: //This should have a new translated title: if(report->get_title_translation(locale) != "TestResult2") { std::cerr << "Failure: Unexpected translated report title." << std::endl; return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/python/0000755000175000017500000000000012235000127016437 5ustar00murraycmurrayc00000000000000glom-1.22.4/tests/python/test_python_execute_func_date.cc0000644000175000017500000001074312234252646025103 0ustar00murraycmurrayc00000000000000//#include //Include it before anything else to avoid "_POSIX_C_SOURCE redefined". //#if PY_VERSION_HEX >= 0x02040000 //# include /* From Python */ //#endif #include #include #include void execute_func_with_date_return_value() { const char* calculation = "import datetime;return datetime.date.today();"; Glom::type_map_fields field_values; Glib::RefPtr connection; //Execute a python function: Glib::ustring error_message; const Gnome::Gda::Value value = Glom::glom_evaluate_python_function_implementation( Glom::Field::TYPE_DATE, calculation, field_values, 0 /* document */, "" /* table name */, Glom::sharedptr(), Gnome::Gda::Value(), // primary key details. Not used in this test. connection, error_message); //std::cout << "type=" << g_type_name(value.get_value_type()) << std::endl; //Check that there was no python error: g_assert(error_message.empty()); //Check that the return value is of the expected type: g_assert(value.get_value_type() == G_TYPE_DATE); //Check that the return value is of the expected value: Glib::Date date_current; date_current.set_time_current(); const Glib::Date date_result= value.get_date(); g_assert(date_current == date_result); //std::cout << "value=" << value.to_string() << std::endl; } void execute_func_with_date_input_value() { const char* calculation = "import datetime\n" "return record[\"test_field\"].year"; Glom::type_map_fields field_values; const Glib::Date input_date = Glib::Date(11, Glib::Date::MAY, 1973); field_values["test_field"] = Gnome::Gda::Value(input_date); Glib::RefPtr connection; //Execute a python function: Glib::ustring error_message; const Gnome::Gda::Value value = Glom::glom_evaluate_python_function_implementation( Glom::Field::TYPE_NUMERIC, calculation, field_values, 0 /* document */, "" /* table name */, Glom::sharedptr(), Gnome::Gda::Value(), // primary key details. Not used in this test. connection, error_message); //std::cout << "type=" << g_type_name(value.get_value_type()) << std::endl; //Check that there was no python error: g_assert(error_message.empty()); //Check that the return value is of the expected type: g_assert(value.get_value_type() == GDA_TYPE_NUMERIC); //Check that the return value is of the expected value: //std::cout << "GdaNumeric number=" << value.get_numeric()->number << std::endl; g_assert(value.get_numeric().get_double() == 1973); //std::cout << "value=" << value.to_string() << std::endl; } /* This would require the extra dateutil python module. void execute_func_with_date_input_value_relativedelta() { const char* calculation = "from dateutil.relativedelta import relativedelta\n" "import datetime\n" "today = datetime.date.today()\n" "date_of_birth = record[\"test_field\"]\n" "rd = relativedelta(today, date_of_birth)\n" "return rd.year"; Glom::type_map_fields field_values; const Glib::Date input_date = Glib::Date(11, Glib::Date::MAY, 1973); field_values["test_field"] = Gnome::Gda::Value(input_date); Glib::RefPtr connection; //Execute a python function: const Gnome::Gda::Value value = Glom::glom_evaluate_python_function_implementation( Glom::Field::TYPE_NUMERIC, calculation, field_values, 0, "", Glom::sharedptr(), Gnome::Gda::Value(), // primary key details. Not used in this test. connection); //std::cout << "type=" << g_type_name(value.get_value_type()) << std::endl; //Check that the return value is of the expected type: g_assert(value.get_value_type() == GDA_TYPE_NUMERIC); //Check that the return value is of the expected value: g_assert(value.get_numeric()); g_assert(value.get_numeric()->number); //std::cout << "GdaNumeric number=" << value.get_numeric()->number << std::endl; //g_assert(value.get_numeric()->number == std::string("1973")); std::cout << "value=" << value.to_string() << std::endl; } */ int main() { Glom::libglom_init(); //Also initializes python. execute_func_with_date_return_value(); execute_func_with_date_input_value(); //execute_func_with_date_input_value_relativedelta(); return EXIT_SUCCESS; } glom-1.22.4/tests/python/test_python_execute_func_with_record.cc0000644000175000017500000001021512234776363026500 0ustar00murraycmurrayc00000000000000#include #include #include #include #include #include #include #include #include static void on_startup_progress() { std::cout << "Database startup progress" << std::endl; } static void on_cleanup_progress() { std::cout << "Database cleanup progress" << std::endl; } void cleanup() { Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); const bool stopped = connection_pool->cleanup( sigc::ptr_fun(&on_cleanup_progress) ); g_assert(stopped); } int main() { Glom::libglom_init(); //Also initializes python. //Connect to a Glom database //A sqlite-based one, to simplify this test. // Get a URI for a test file: Glib::ustring uri; try { const std::string path = Glib::build_filename(GLOM_DOCDIR_EXAMPLES_NOTINSTALLED, "sqlite", "test_sqlite_music", "test_sqlite_music.glom"); uri = Glib::filename_to_uri(path); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return EXIT_FAILURE; } g_assert( Glom::Utils::file_exists(uri) ); //std::cout << "URI=" << uri << std::endl; // Load the document: Glom::Document document; document.set_file_uri(uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } g_assert(!document.get_is_example_file());; Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); connection_pool->setup_from_document(&document); //This is not really necessary for sqlite-based databases. const Glom::ConnectionPool::StartupErrors started = connection_pool->startup( sigc::ptr_fun(&on_startup_progress) ); if(started != Glom::ConnectionPool::Backend::STARTUPERROR_NONE) { std::cerr << "connection_pool->startup(): result=" << started << std::endl; } g_assert(started == Glom::ConnectionPool::Backend::STARTUPERROR_NONE); Glom::sharedptr connection = connection_pool->connect(); g_assert(connection); Glib::RefPtr gda_connection = connection->get_gda_connection(); g_assert(connection->get_gda_connection()); //Some silly python code just to exercise our PyGlomRecord API: const char* calculation = "connection = record.connection\nreturn connection.is_opened()"; Glom::type_map_fields field_values; //TODO: Use this: const type_map_fields field_values = get_record_field_values_for_calculation(field_in_record.m_table_name, field_in_record.m_key, field_in_record.m_key_value); // if(!field_values.empty()) //Execute a python function: Gnome::Gda::Value value; Glib::ustring error_message; try { value = Glom::glom_evaluate_python_function_implementation( Glom::Field::TYPE_BOOLEAN, calculation, field_values, 0 /* document */, "" /* table name */, Glom::sharedptr(), Gnome::Gda::Value(), // primary key details. Not used in this test. gda_connection, error_message); } catch(const std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } catch(const boost::python::error_already_set& ex) { std::cerr << "Exception: boost::python::error_already_set" << std::endl; return EXIT_FAILURE; } //std::cout << "type=" << g_type_name(value.get_value_type()) << std::endl; //Check that there was no python error: if(!error_message.empty()) { std::cerr << "Python error: " << error_message << std::endl; return EXIT_FAILURE; } //Check that the return value is of the expected type: g_assert(value.get_value_type() == G_TYPE_BOOLEAN); //Check that the return value is of the expected value: const double boolval = value.get_boolean(); g_assert(boolval == true); //std::cout << "value=" << value.to_string() << std::endl; cleanup(); return EXIT_SUCCESS; } glom-1.22.4/tests/python/test_python_execute_func_change_result_type.cc0000644000175000017500000000374512234776363030065 0ustar00murraycmurrayc00000000000000#include #include #include #include #include int main() { Glom::libglom_init(); //Also initializes python. const char* calculation = "count = 0\nfor i in range(0, 100): count += i\nreturn count"; Glom::type_map_fields field_values; Glib::RefPtr connection; //Execute a python function: Gnome::Gda::Value value; Glib::ustring error_message; const Glom::Field::glom_field_type result_type = Glom::Field::TYPE_TEXT; try { //We ask for a text result though the python function actually returns a number. value = Glom::glom_evaluate_python_function_implementation( result_type, calculation, field_values, 0 /* document */, "" /* table name */, Glom::sharedptr(), Gnome::Gda::Value(), // primary key details. Not used in this test. connection, error_message); } catch(const std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } catch(const boost::python::error_already_set& ex) { std::cerr << "Exception: boost::python::error_already_set" << std::endl; return EXIT_FAILURE; } //std::cout << "type=" << g_type_name(value.get_value_type()) << std::endl; //Check that there was no python error: g_assert(error_message.empty()); //Check that the return value is of the expected type: g_assert(Glom::Field::get_glom_type_for_gda_type(value.get_value_type()) == result_type); //Check that the return value is of the expected value: const Glib::ustring text = value.get_string(); //std::cout << "text=" << text << std::endl; g_assert(text == "4950"); //This should always be as per ISO, not according to the user's locale, because it's generally passed to the database. Presentation is separate to calculation or storage. //std::cout << "value=" << value.to_string() << std::endl; return EXIT_SUCCESS; } glom-1.22.4/tests/python/test_python_module.cc0000644000175000017500000000240312234776363022717 0ustar00murraycmurrayc00000000000000#include #include #include #include "config.h" #include "glom/python_embed/glom_python.h" #ifdef __linux__ extern "C" void __libc_freeres(void); #endif namespace Glom { bool glom_python_module_is_available() { const gchar* name = "glom_" GLOM_ABI_VERSION_UNDERLINED; PyObject* module_glom = PyImport_ImportModule((char*)name); //TODO: unref this? if(!module_glom) { g_warning("Glom: A python import of %s failed.\n", name); } return module_glom != 0; } bool gda_python_module_is_available() { //Python code usually uses "from gi.repository import Gda" so that //the code may use Gda. rather than gi.repository.Gda in the code. const gchar* name = "gi.repository.Gda"; PyObject* module_glom = PyImport_ImportModule((char*)name); //TODO: unref this? if(!module_glom) { g_warning("Glom: A python import of %s failed.\n", name); } return module_glom != 0; } } int main () { #ifdef __linux__ atexit(__libc_freeres); #endif Glom::libglom_init(); // Calls PyInitialize() if (!Glom::gda_python_module_is_available()) return EXIT_FAILURE; if (!Glom::glom_python_module_is_available()) return EXIT_FAILURE; Glom::libglom_deinit(); // Calls Py_Finalize(); return EXIT_SUCCESS; } glom-1.22.4/tests/python/test_python_execute_func.cc0000644000175000017500000000317512234776363024116 0ustar00murraycmurrayc00000000000000#include #include #include #include #include int main() { Glom::libglom_init(); //Also initializes python. const char* calculation = "count = 0\nfor i in range(0, 100): count += i\nreturn count"; Glom::type_map_fields field_values; Glib::RefPtr connection; //Execute a python function: Gnome::Gda::Value value; Glib::ustring error_message; try { value = Glom::glom_evaluate_python_function_implementation( Glom::Field::TYPE_NUMERIC, calculation, field_values, 0 /* document */, "" /* table name */, Glom::sharedptr(), Gnome::Gda::Value(), // primary key details. Not used in this test. connection, error_message); } catch(const std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } catch(const boost::python::error_already_set& ex) { std::cerr << "Exception: boost::python::error_already_set" << std::endl; return EXIT_FAILURE; } //std::cout << "type=" << g_type_name(value.get_value_type()) << std::endl; //Check that there was no python error: g_assert(error_message.empty()); //Check that the return value is of the expected type: g_assert(value.get_value_type() == GDA_TYPE_NUMERIC); //Check that the return value is of the expected value: const double numeric = Glom::Conversions::get_double_for_gda_value_numeric(value); g_assert(numeric == 4950.0); //std::cout << "value=" << value.to_string() << std::endl; return EXIT_SUCCESS; } glom-1.22.4/tests/python/test_python_execute_func_bad_syntax.cc0000644000175000017500000000330112234776363026321 0ustar00murraycmurrayc00000000000000#include #include #include #include #include int main() { Glom::libglom_init(); //Also initializes python. const char* calculation = "count = 0\n" "return cownt"; Glom::type_map_fields field_values; Glib::RefPtr connection; //Execute a python function: Gnome::Gda::Value value; Glib::ustring error_message; try { value = Glom::glom_evaluate_python_function_implementation( Glom::Field::TYPE_NUMERIC, calculation, field_values, 0 /* document */, "" /* table name */, Glom::sharedptr(), Gnome::Gda::Value(), // primary key details. Not used in this test. connection, error_message); } catch(const std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } catch(const boost::python::error_already_set& ex) { std::cerr << "Exception: boost::python::error_already_set" << std::endl; return EXIT_FAILURE; } //std::cout << "type=" << g_type_name(value.get_value_type()) << std::endl; //std::cout << "value=" << value.to_string() << std::endl; //Check that we received a traceback error: g_assert(!error_message.empty()); //Check that the return value is of the expected type: g_assert( (value.get_value_type() == GDA_TYPE_NUMERIC) || value.is_null() ); //Check that the return value is of the expected value: const double numeric = Glom::Conversions::get_double_for_gda_value_numeric(value); //std::cout << "numeric=" << value.to_string() << std::endl; g_assert(numeric == 0); return EXIT_SUCCESS; } glom-1.22.4/tests/python/test_python_execute_script.cc0000644000175000017500000000762212234776363024470 0ustar00murraycmurrayc00000000000000#include #include #include //Store results from the callbacks and check them later: Glib::ustring result_table_name_list; Glib::ustring result_table_name_details; //This can't be a normal global variable, //because it would be initialized before we have initialized the glib type system. static Gnome::Gda::Value& get_result_primary_key_value_details_instance() { static Gnome::Gda::Value result_primary_key_value_details; return result_primary_key_value_details; } Glib::ustring result_report_name; bool result_printed_layout = false; bool result_started_new_record = false; static void on_script_ui_show_table_list(const Glib::ustring& table_name) { //std::cout << "debug: " << G_STRFUNC << ": table_name=" << table_name << std::endl; result_table_name_list = table_name; } static void on_script_ui_show_table_details(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value) { //std::cout << "debug: " << G_STRFUNC << ": table_name=" << table_name // << ", primary_key_value=" << primary_key_value.to_string() << std::endl; result_table_name_details = table_name; get_result_primary_key_value_details_instance() = primary_key_value; } static void on_script_ui_print_report(const Glib::ustring& report_name) { result_report_name = report_name;; } static void on_script_ui_print_layout() { result_printed_layout = true; } static void on_script_ui_start_new_record() { result_started_new_record = true; } int main() { Glom::libglom_init(); //Also initializes python. const Glib::ustring table_name_input = "sometable"; const Glib::ustring table_name_details_input = "artists"; const Gnome::Gda::Value primary_key_value_input(123); const Glib::ustring report_name_input = "somereport"; //Just some code to make sure that the python API exists: const Glib::ustring script = "table_name = record.table_name;\n" "ui.show_table_list(table_name);\n" "ui.show_table_details(\"" + table_name_details_input + "\", " + primary_key_value_input.to_string() + ");\n" "ui.print_report(\"" + report_name_input + "\");\n" "ui.print_layout();\n" "ui.start_new_record();\n"; Glom::type_map_fields field_values; Glib::RefPtr connection; Glom::PythonUICallbacks callbacks; callbacks.m_slot_show_table_list = sigc::ptr_fun(&on_script_ui_show_table_list); callbacks.m_slot_show_table_details = sigc::ptr_fun(&on_script_ui_show_table_details); callbacks.m_slot_print_report = sigc::ptr_fun(&on_script_ui_print_report); callbacks.m_slot_print_layout = sigc::ptr_fun(&on_script_ui_print_layout); callbacks.m_slot_start_new_record = sigc::ptr_fun(&on_script_ui_start_new_record); //Execute a python script: Glib::ustring error_message; try { Glom::glom_execute_python_function_implementation( script, field_values, 0 /* document */, table_name_input, Glom::sharedptr(), Gnome::Gda::Value(), // primary key details. Not used in this test. connection, callbacks, error_message); } catch(const std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } catch(const boost::python::error_already_set& ex) { std::cerr << "Exception: boost::python::error_already_set" << std::endl; return EXIT_FAILURE; } if(!error_message.empty()) { std::cerr << "Python Error: " << error_message << std::endl; } g_assert(error_message.empty()); //Check that the callbacks received the expected values: g_assert(result_table_name_list == table_name_input); g_assert(result_table_name_details == table_name_details_input); g_assert(get_result_primary_key_value_details_instance() == primary_key_value_input); g_assert(result_report_name == report_name_input); g_assert(result_printed_layout); g_assert(result_started_new_record); return EXIT_SUCCESS; } glom-1.22.4/tests/python/test_load_python_library.cc0000644000175000017500000000102612234252646024066 0ustar00murraycmurrayc00000000000000#include #include #include #include "config.h" int main() { // Attempt to dynamically load the python module, // attempting to resolve all symbols immediately: const char* path = "glom/python_embed/python_module/.libs/glom_" GLOM_ABI_VERSION_UNDERLINED ".so";; void* lib = dlopen(path, RTLD_NOW); if(!lib) { const char *error = dlerror(); if(error) { fprintf (stderr, "%s\n", error); } return EXIT_FAILURE; } else dlclose(lib); return EXIT_SUCCESS; } glom-1.22.4/tests/test_document_change.cc0000644000175000017500000000642512234252646021634 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include template bool contains(const T_Container& container, const Glib::ustring& name) { typename T_Container::const_iterator iter = std::find(container.begin(), container.end(), name); return iter != container.end(); } template bool contains_named(const T_Container& container, const Glib::ustring& name) { typedef typename T_Container::value_type::object_type type_item; typename T_Container::const_iterator iter = std::find_if(container.begin(), container.end(), Glom::predicate_FieldHasName(name)); return iter != container.end(); } int main() { Glom::libglom_init(); Glom::Document document; document.set_allow_autosave(false); //Avoid warnings about it having no URI. //Test some simple get/set operations: const char* title = "Music Collection"; document.set_database_title_original(title); g_assert(document.get_database_title_original() == title); const char* value = "someuser"; document.set_connection_user(value); g_assert(document.get_connection_user() == value); value = "someserver"; document.set_connection_server(value); g_assert(document.get_connection_server() == value); value = "somedb"; document.set_connection_database(value); g_assert(document.get_connection_database() == value); const guint port = 12345; document.set_connection_port(port); g_assert(document.get_connection_port() == port); const bool try_other_ports = false; document.set_connection_try_other_ports(try_other_ports); g_assert(document.get_connection_try_other_ports() == try_other_ports); value = "somescriptcontents"; document.set_startup_script(value); g_assert(document.get_startup_script() == value); const Glib::ustring table_name = "sometable"; Glom::sharedptr table_info(new Glom::TableInfo()); table_info->set_name(table_name); const Glib::ustring table_title = "sometabletitle"; table_info->set_title_original(table_title); g_assert(table_info->get_title_original() == table_title); document.add_table(table_info); const float x = 20.0f; const float y = 30.0f; document.set_table_overview_position(table_name, x, y); float x_out = 0; float y_out = 0; document.get_table_overview_position(table_name, x_out, y_out); g_assert(x == x_out); g_assert(y == y_out); Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_document_load_and_save.cc0000644000175000017500000000675212234776363023200 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include static bool validate_glom_file(const Glib::ustring& uri, const std::string& dtd_filepath) { std::string filepath; try { filepath = Glib::filename_from_uri(uri); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": Could not convert uri to filepath: " << ex.what(); return false; } try { xmlpp::DomParser parser; //parser.set_validate(); parser.set_substitute_entities(); //We just want the text to be resolved/unescaped automatically. parser.parse_file(filepath); if(!parser) return false; xmlpp::DtdValidator validator(dtd_filepath); validator.validate(parser.get_document()); } catch(const xmlpp::validity_error& ex) { std::cerr << "Exception caught while validating file: " << ex.what() << std::endl; std::cerr << " uri: " << uri << std::endl; return false; } catch(const xmlpp::parse_error& ex) { std::cerr << "Exception caught while validating file: " << ex.what() << std::endl; std::cerr << " uri: " << uri << std::endl; return false; } return true; } int main(int argc, char* argv[]) { Glom::libglom_init(); if(argc <= 2 ) { std::cerr << "Usage: test_document_load_and_save filepath dtd_filepath" << std::endl; return EXIT_FAILURE; } //Get a URI (file://something) from the filepath: Glib::RefPtr file = Gio::File::create_for_commandline_arg(argv[1]); const Glib::ustring uri = file->get_uri(); const std::string dtd_filepath = argv[2]; //Validate the original document, though the test_dtd_file_validation.sh test does this anyway: if(!validate_glom_file(uri, dtd_filepath)) return EXIT_FAILURE; // Load the document: Glom::Document document; document.set_file_uri(uri); int failure_code = 0; const bool loaded = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!loaded) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } // Save the document: document.set_allow_autosave(false); const Glib::ustring temp_uri = Glom::Utils::get_temp_file_uri("testglom_document", ".glom"); document.set_file_uri(temp_uri); document.set_modified(); //TODO: Let save() succeed without this. const bool saved = document.save(); if(!saved) { std::cerr << "Document::save() failed." << std::endl; return EXIT_FAILURE; } //Validate the saved document: if(!validate_glom_file(temp_uri, dtd_filepath)) return EXIT_FAILURE; Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_new_then_lookup.cc0000644000175000017500000001543012234776363024321 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE static Glom::sharedptr get_lookup_field(const Glom::Document::type_list_lookups& container, const Glib::ustring& table_name, const Glib::ustring& field_name, Glom::sharedptr& relationship) { relationship.clear(); Glom::sharedptr result; for(Glom::Document::type_list_lookups::const_iterator iter = container.begin(); iter != container.end(); ++iter) { const Glom::sharedptr layout_item = iter->first; if(!layout_item) return result; const Glom::sharedptr this_relationship = iter->second; if(!this_relationship) return result; if(layout_item->get_table_used(table_name) != table_name) return result; if(layout_item->get_name() == field_name) { relationship = this_relationship; return layout_item; } } return result; } static bool contains_field(const Glom::Document::type_list_lookups& container, const Glib::ustring& table_name, const Glib::ustring& field_name) { Glom::sharedptr relationship; return get_lookup_field(container, table_name, field_name, relationship); } static bool test(Glom::Document::HostingMode hosting_mode) { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_smallbusiness.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } const Glib::ustring table_name = "invoice_lines"; Glom::sharedptr primary_key_field = document.get_field_primary_key(table_name); if(!primary_key_field) { std::cerr << "Failure: primary_key_field is empty." << std::endl; return false; } // Get the fields whose values should be looked up when a field changes: const Glom::Document::type_list_lookups lookups = document.get_lookup_fields(table_name, "product_id"); if(lookups.size() != 3) { std::cerr << "Failure: Unexpected number of lookups: " << lookups.size() << std::endl; return false; } if(!contains_field(lookups, table_name, "product_price")) { std::cerr << "Failure: Expected lookup field not found." << std::endl; return false; } if(!contains_field(lookups, table_name, "product_name")) { std::cerr << "Failure: Expected lookup field not found." << std::endl; return false; } if(!contains_field(lookups, table_name, "vat_percentage")) { std::cerr << "Failure: Expected lookup field not found." << std::endl; return false; } const Glib::ustring field_name = "product_price"; Glom::sharedptr relationship; const Glom::sharedptr layout_field = get_lookup_field(lookups, table_name, field_name, relationship); if(!layout_field) { std::cerr << "Failure: The lookup field is empty." << std::endl; return false; } if(!relationship) { std::cerr << "Failure: The lookup relationship is empty." << std::endl; return false; } if(relationship->get_to_table() != "products") { std::cerr << "Failure: The relationship's to table is unexpected." << std::endl; return false; } if(layout_field->get_table_used(table_name) != table_name) { std::cerr << "Failure: The lookup field's table is unexpected" << std::endl; return false; } if(layout_field->get_name() != field_name) { std::cerr << "Failure: The lookup field's name is unexpected." << std::endl; return false; } const Glom::sharedptr field = layout_field->get_full_field_details(); if(!field) { std::cerr << "Failure: The lookup item's field is empty." << std::endl; return false; } if(field->get_name() != field_name) { std::cerr << "Failure: The lookup item's field name is unexpected." << std::endl; return false; } if(!field->get_is_lookup()) { std::cerr << "Failure: The lookup item's field is not a lookup." << std::endl; return false; } if(field->get_lookup_field() != "price") { std::cerr << "Failure: The lookup item's field's name is unexpected." << std::endl; return false; } if(relationship != field->get_lookup_relationship()) { std::cerr << "Failure: The lookup item's field's relationship is not expected." << std::endl; return false; } //Lookup the value from the related record. //TODO: const Glom::sharedptr field_source = document.get_field(relationship->get_to_table(), field->get_lookup_field()); const Gnome::Gda::Value value = Glom::DbUtils::get_lookup_value(&document, table_name, relationship, field_source, Gnome::Gda::Value(2)); const GType expected_type = (hosting_mode != Glom::Document::HOSTING_MODE_SQLITE ? GDA_TYPE_NUMERIC : G_TYPE_DOUBLE); if(value.get_value_type() != expected_type) { std::cerr << "Failure: The value has an unexpected type: " << g_type_name(value.get_value_type()) << std::endl; return false; } if(Glom::Conversions::get_double_for_gda_value_numeric(value) != 3.5f) { std::cerr << "Failure: The value has an unexpected value: " << value.to_string() << std::endl; return false; } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_document_load_translations.cc0000644000175000017500000002711712234776363024137 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include #include #include #include #include #include #include #include template bool contains(const T_Container& container, const T_Value& name) { typename T_Container::const_iterator iter = std::find(container.begin(), container.end(), name); return iter != container.end(); } /** A predicate for use with std::find_if() to find a Field or LayoutItem which refers * to the same field, looking at just the name. */ template class predicate_ItemHasTitle { public: predicate_ItemHasTitle(const Glib::ustring& title) { m_title = title; } virtual ~predicate_ItemHasTitle() { } bool operator() (const Glom::sharedptr& element) { return (element->get_title_original() == m_title); } bool operator() (const Glom::sharedptr& element) { return (element->get_title_original() == m_title); } private: Glib::ustring m_title; }; /** A predicate for use with std::find_if() to find a LayoutItem of a particular type. */ template class predicate_ItemHasType { public: predicate_ItemHasType() { } virtual ~predicate_ItemHasType() { } bool operator() (const Glom::Document::pair_translatable_item_and_hint& element) { Glom::sharedptr item = element.first; Glom::sharedptr derived = Glom::sharedptr::cast_dynamic(item); if(derived) return true; else return false; } }; template typename T_Container::value_type get_titled(const T_Container& container, const Glib::ustring& title) { typedef typename T_Container::value_type type_sharedptr; type_sharedptr result; typedef typename T_Container::value_type::object_type type_item; typename T_Container::const_iterator iter = std::find_if(container.begin(), container.end(), predicate_ItemHasTitle(title)); if(iter != container.end()) result = *iter; return result; } template bool contains_item_type(const Glom::Document::type_list_translatables& container) { Glom::Document::type_list_translatables::const_iterator iter = std::find_if(container.begin(), container.end(), predicate_ItemHasType()); if(iter != container.end()) return true; return false; } static Glom::sharedptr get_field_on_layout(const Glom::Document& document, const Glib::ustring& layout_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) { const Glom::Document::type_list_layout_groups groups = document.get_data_layout_groups("details", layout_table_name); for(Glom::Document::type_list_layout_groups::const_iterator iter = groups.begin(); iter != groups.end(); ++iter) { const Glom::sharedptr group = *iter; if(!group) continue; const Glom::LayoutGroup::type_list_const_items items = group->get_items_recursive(); for(Glom::LayoutGroup::type_list_const_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { const Glom::sharedptr layout_item = *iter; const Glom::sharedptr layout_item_field = Glom::sharedptr::cast_dynamic(layout_item); if(!layout_item_field) continue; if( (layout_item_field->get_table_used(layout_table_name) == table_name) && (layout_item_field->get_name() == field_name) ) { return layout_item_field; } } } return Glom::sharedptr(); } static const char* locale_de = "de_DE.UTF-8"; template void check_title(const T_Item& item, const char* title_en, const char* title_de) { g_assert(item); //The get_title_original() and get_title_translation() should not be called //on items that delegate to a child item: bool has_own_title = true; Glom::sharedptr field = Glom::sharedptr::cast_dynamic(item); if(field) has_own_title = false; if(has_own_title) g_assert( item->get_title_original() == title_en ); g_assert( item->get_title(Glib::ustring()) == title_en ); g_assert( item->get_title("en_US") == title_en ); if(has_own_title) g_assert( item->get_title_translation(locale_de) == title_de ); g_assert( item->get_title(locale_de) == title_de ); g_assert( item->get_title_or_name(Glib::ustring()) == title_en ); g_assert( item->get_title_or_name("en_US") == title_en ); g_assert( item->get_title_or_name(locale_de) == title_de ); if(has_own_title) { //Check fallbacks: g_assert( item->get_title_translation(Glib::ustring()) == title_en ); g_assert( item->get_title_translation("en_US") == title_en ); g_assert( item->get_title_translation("en_GB") == title_en ); g_assert( item->get_title_translation("de_AU") == title_de ); //Check that fallbacks do not happen when we don't want them: g_assert( item->get_title_translation(Glib::ustring(), false) == Glib::ustring() ); g_assert( item->get_title_translation("en_US", false) == Glib::ustring() ); g_assert( item->get_title_translation("de_AU", false) == Glib::ustring() ); } } int main() { //Make this application use the current locale for _() translation: bindtextdomain(GETTEXT_PACKAGE, GLOM_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); Glom::libglom_init(); // Get a URI for a test file: Glib::ustring uri; try { const std::string path = Glib::build_filename(GLOM_DOCDIR_EXAMPLES_NOTINSTALLED, "example_film_manager.glom"); uri = Glib::filename_to_uri(path); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return EXIT_FAILURE; } //std::cout << "URI=" << uri << std::endl; // Load the document: Glom::Document document; document.set_file_uri(uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } const std::vector locales = document.get_translation_available_locales(); g_assert(locales.size() == 12); g_assert(contains(locales, "de")); const std::vector table_names = document.get_table_names(); g_assert(contains(table_names, "scenes")); g_assert( document.get_table_title_original("scenes") == "Scenes" ); g_assert( document.get_table_title_singular_original("scenes") == "Scene" ); g_assert( document.get_table_title("scenes", locale_de) == "Szenen" ); g_assert( document.get_table_title_singular("scenes", locale_de) == "Szene" ); //TODO: Make sure this is translated correctly. //Check a field: Glom::sharedptr field = document.get_field("contacts", "contact_id"); g_assert(field); check_title(field, "Contact ID", "Kontaktkennung"); //Check a field and its custom choices: field = document.get_field("scenes", "day_or_night"); g_assert(field); check_title(field, "Day/Night", "Tag/Nacht"); Glom::Formatting formatting = field->m_default_formatting; g_assert(formatting.get_has_custom_choices()); Glom::Formatting::type_list_values values = formatting.get_choices_custom(); //g_assert(contains(values, "Day")); Glom::sharedptr value = get_titled(values, "Day"); g_assert(value); check_title(value, "Day", "Tag"); g_assert(value->get_value() == Gnome::Gda::Value("Day")); g_assert( value->get_title_original() == "Day" ); g_assert( formatting.get_custom_choice_original_for_translated_text("Nacht", locale_de) == "Night" ); g_assert( formatting.get_custom_choice_original_for_translated_text("aaaa", locale_de) == "" ); g_assert( formatting.get_custom_choice_translated("Night", locale_de) == "Nacht" ); g_assert( formatting.get_custom_choice_translated("aaaa", locale_de) == "" ); g_assert( value->get_title_original() == "Day" ); //Check a relationship: const Glom::sharedptr relationship = document.get_relationship("characters", "contacts_actor"); g_assert(relationship); check_title(relationship, "Actor", "Schauspieler"); //Check a LayoutItemField's CustomTitle: Glom::sharedptr field_on_layout = get_field_on_layout(document, "characters", "contacts", "name_full"); g_assert(field_on_layout); check_title(field_on_layout, "Actor's Name", "Name des Schauspielers"); //Check a LayoutItemField's Field title: field_on_layout = get_field_on_layout(document, "scenes", "locations", "name"); g_assert(field_on_layout); check_title(field_on_layout, "Name", "Name" ); field_on_layout = get_field_on_layout(document, "scenes", "scenes", "day_or_night"); g_assert(field_on_layout); check_title(field_on_layout, "Day/Night", "Tag/Nacht"); g_assert(field_on_layout->get_formatting_used_has_translatable_choices()); //Check a print layout: const Glom::sharedptr print_layout = document.get_print_layout("contacts", "contact_details"); g_assert(print_layout); check_title(print_layout, "Contact Details", "Kontakt Details" ); //Check the whole list of translatable items: Glom::Document::type_list_translatables list_layout_items = document.get_translatable_items(); g_assert(!list_layout_items.empty()); const bool contains_databasetitle = contains_item_type(list_layout_items); g_assert( contains_databasetitle ); const bool contains_tableinfo = contains_item_type(list_layout_items); g_assert( contains_tableinfo ); const bool contains_layoutitem = contains_item_type(list_layout_items); g_assert( contains_layoutitem ); /* const bool contains_layoutitemfield = contains_item_type(list_layout_items); g_assert( contains_layoutitemfield ); */ const bool contains_relationship = contains_item_type(list_layout_items); g_assert( contains_relationship ); const bool contains_field = contains_item_type(list_layout_items); g_assert( contains_field ); const bool contains_choicevalue = contains_item_type(list_layout_items); g_assert( contains_choicevalue ); const bool contains_customtitle = contains_item_type(list_layout_items); g_assert( contains_customtitle ); const bool contains_report = contains_item_type(list_layout_items); g_assert( contains_report ); Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_utils.h0000644000175000017500000001007512234776363022123 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_TEST_SELFHOSTING_UTILS_H #define GLOM_TEST_SELFHOSTING_UTILS_H #include #include #include /** Create a .glom file from an example, with database data, and start a PostgreSQL server if necessary. * * @param document A new empty document that will be filled with hosting details. * @param hosting_mode Either HOSTING_MODE_POSTGRES_SELF or HOSTING_MODE_SQLITE * @param subdirectory_path: An additional directory path to use under the temporary directory that will be used to save the file. */ bool test_create_and_selfhost_new_empty(Glom::Document& document, Glom::Document::HostingMode hosting_mode, const std::string& subdirectory_path = std::string()); /** Create a .glom file from an example, with database data, and start a PostgreSQL server if necessary. * * @param document A new empty document that will be filled with hosting details. * @param hosting_mode Either HOSTING_MODE_POSTGRES_SELF or HOSTING_MODE_SQLITE * @param database_name The name of the database to created. * @param subdirectory_path: An additional directory path to use under the temporary directory that will be used to save the file. */ bool test_create_and_selfhost_new_database(Glom::Document& document, Glom::Document::HostingMode hosting_mode, const Glib::ustring& database_name, const std::string& subdirectory_path = std::string()); /** Create a .glom file from an example, with database data, and start a PostgreSQL server if necessary. * * @param hosting_mode Either HOSTING_MODE_POSTGRES_SELF or HOSTING_MODE_SQLITE * @param subdirectory_path: An additional directory path to use under the temporary directory that will be used to save the file. */ bool test_create_and_selfhost_from_example(const std::string& example_filename, Glom::Document& document, Glom::Document::HostingMode hosting_mode, const std::string& subdirectory_path = std::string()); /** Create a .glom file from an existing .glom example file with database data, and start a PostgreSQL server if necessary. * * @param hosting_mode Either HOSTING_MODE_POSTGRES_SELF or HOSTING_MODE_SQLITE * @param subdirectory_path: An additional directory path to use under the temporary directory that will be used to save the file. */ bool test_create_and_selfhost_from_uri(const Glib::ustring& file_uri, Glom::Document& document, Glom::Document::HostingMode hosting_mode, const std::string& subdirectory_path = std::string()); /** Start self-hosting of a .glom document. * @param document The document must already be saved to a file. */ bool test_selfhost(Glom::Document& document, const Glib::ustring& user, const Glib::ustring& password); bool test_model_expected_size(const Glib::RefPtr& data_model, guint columns_count, guint rows_count); bool test_table_exists(const Glib::ustring& table_name, const Glom::Document& document); /** Return the URI of the temporary .glom file created by the test_create_and_selfhost_*() methods. * This should only be used by some special tests. */ Glib::ustring test_get_temp_file_uri(); /** Stop the self-hosting server process, * and (optionally) delete the temporary .glom file and its data. */ void test_selfhosting_cleanup(bool delete_file = true); bool test_example_musiccollection_data(const Glom::Document* document); #endif //GLOM_TEST_SELFHOSTING_UTILS_H glom-1.22.4/tests/test_xslt_file_validation.sh0000755000175000017500000000031012234252646022727 0ustar00murraycmurrayc00000000000000#/bin/sh -e for x in $(find ${srcdir}/examples/ -name "*.glom") do # echo Validating $x # Note that there is no DTD for XSL because DTD is not capable enough. xmllint --noout $x || exit 1 done glom-1.22.4/tests/test_iso_codes.cc0000644000175000017500000000450012234252646020450 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include "glom/mode_design/iso_codes.h" #include static bool currencies_contains(const Glom::IsoCodes::type_list_currencies& container, const Glib::ustring& name) { for(Glom::IsoCodes::type_list_currencies::const_iterator iter = container.begin(); iter != container.end(); ++iter) { const Glom::IsoCodes::Currency& item = *iter; if(item.m_symbol == name) return true; } return false; } static bool locales_contains(const Glom::IsoCodes::type_list_locales& container, const Glib::ustring& name) { for(Glom::IsoCodes::type_list_locales::const_iterator iter = container.begin(); iter != container.end(); ++iter) { const Glom::IsoCodes::Locale& item = *iter; if(item.m_identifier == name) return true; } return false; } int main() { Glom::libglom_init(); Glom::IsoCodes::type_list_currencies currencies = Glom::IsoCodes::get_list_of_currency_symbols(); g_assert(!currencies.empty()); g_assert( currencies_contains(currencies, "EUR") ); Glom::IsoCodes::type_list_locales locales = Glom::IsoCodes::get_list_of_locales(); g_assert(!locales.empty()); g_assert( locales_contains(locales, "de") ); g_assert( locales_contains(locales, "de_DE") ); g_assert( locales_contains(locales, "de_AT") ); g_assert( locales_contains(locales, "en") ); g_assert( locales_contains(locales, "en_GB") ); g_assert( Glom::IsoCodes::get_locale_name("de") == "German" ); g_assert( Glom::IsoCodes::get_locale_name("de_AT") == "German (Austria)" ); Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_new_then_backup_restore.cc0000644000175000017500000000652012234776363026020 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE static void on_backup_progress() { std::cout << "Restore progress" << std::endl; } static bool test(Glom::Document::HostingMode hosting_mode) { //Create a file from an example: Glib::ustring backup_uri_tarball; { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_music_collection.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation from the example failed." << std::endl; return false; } const Glib::ustring backup_uri = Glom::Utils::get_temp_directory_uri(); backup_uri_tarball = document.save_backup_file( backup_uri, sigc::ptr_fun(&on_backup_progress)); if(backup_uri_tarball.empty()) { std::cerr << "Backup failed." << std::endl; return false; } test_selfhosting_cleanup(); } //Create a new document from the backup: { const Glib::ustring recreated_uri = Glom::Document::restore_backup_file( backup_uri_tarball, sigc::ptr_fun(&on_backup_progress)); if(recreated_uri.empty()) { std::cerr << "Recreation from the example failed." << std::endl; return false; } //Create a document from the backup: //std::cout << "debug: recreated_uri=" << recreated_uri << std::endl; Glom::Document document; const bool recreated = test_create_and_selfhost_from_uri(recreated_uri, document, hosting_mode); if(!recreated) { std::cerr << "Recreation from the backup failed." << std::endl; return false; } //Check that the new file has the expected data: /* TODO: Find out why this test fails, though it seems to work fine in the UI: if(!test_example_musiccollection_data(&document)) { std::cerr << "test_example_musiccollection_data() failed." << std::endl; return false; } */ test_selfhosting_cleanup(); } return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } /* TODO: Make this work with sqlite too: if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } */ Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_glom_date_in_locales.sh.in0000644000175000017500000000253612234252646023265 0ustar00murraycmurrayc00000000000000#/bin/sh -e # This test checks that dates are presented and interpreted correctly. # That sometimes requires a translation of the %x date format in the .po file, # and that translation is often lost accidentally # # This test requires these locales to be installed and configured. # That might be a problem on some systems, so feel free to use a patch to edit this file or disable it altogether. # # These are chosen based on problems found previously, # and the ones with good translations shown here: http://l10n.gnome.org/module/glom/ # TODO: Get a list from po/*.po ? # # On debian/Ubuntu do this: # sudo apt-get install language-pack-de language-pack-es language-pack-fi language-pack-fr language-pack-hu language-pack-it language-pack-pt language-pack-sl language-pack-da language-pack-cs language-pack-nb language-pack-sv # # These are apparently not available on Fedora: "da_DK.UTF-8" "cs_CZ.UTF-8" "nb_NO.UTF-8" "sv_SE.UTF-8" locales=("en_US.UTF-8" "en_GB.UTF-8" "en_CA.UTF-8" "de_DE.UTF-8" "es_ES.UTF-8" "fi_FI.UTF-8" "fr_FR.UTF-8" "hu_HU.UTF-8" "it_IT.UTF-8" "pt_PT.UTF-8" "pt_BR.UTF-8" "sl_SI.UTF-8" "da_DK.UTF-8" "cs_CZ.UTF-8" "nb_NO.UTF-8" "sv_SE.UTF-8") for x in "${locales[@]}" do echo testing with LANG and LANGUAGE="$x" export LANG="$x" export LANGUAGE="$x" export LC_TIME="$x" @abs_top_builddir@/glom/glom --debug-date-check || exit 1 done glom-1.22.4/tests/test_selfhosting_new_from_example.cc0000644000175000017500000000616512234776363024455 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE static bool test(Glom::Document::HostingMode hosting_mode) { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_music_collection.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } if(!test_example_musiccollection_data(&document)) { std::cerr << "test_example_musiccollection_data() failed." << std::endl; return false; } if(!test_table_exists("songs", document)) { return false; } if(!test_table_exists("publishers", document)) { return false; } //Test the system preferences for the database: //TODO: We should store this only in the document anyway, //and make it translatable: /* TODO: This is not stored in the examples. Should it be? const Glom::SystemPrefs prefs = Glom::DbUtils::get_database_preferences(&document); g_return_val_if_fail(prefs.m_name == "Music Collection", false); g_return_val_if_fail(prefs.m_org_name == "SomeOrganization Incorporated", false); g_return_val_if_fail(prefs.m_org_address_street == "Some House", false); g_return_val_if_fail(prefs.m_org_address_street2 == "123 Some Street", false); g_return_val_if_fail(prefs.m_org_address_town == "Some Town", false); g_return_val_if_fail(prefs.m_org_address_county == "Some State", false); g_return_val_if_fail(prefs.m_org_address_postcode == "12345", false); g_return_val_if_fail(prefs.m_org_address_country == "USA", false); */ test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); //We run this test in several locales via //test_selfhosting_new_from_example_in_locales.sh, //so we do this so the locale will really be used: setlocale(LC_ALL, ""); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/glade_toplevels_instantiation.cc0000644000175000017500000001054212234776363023571 0ustar00murraycmurrayc00000000000000/* main.cc * * Copyright (C) 2010 The Glom development team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include static bool attempt_instantiation(const std::string& filepath, const xmlpp::Element* child) { const Glib::ustring id = child->get_attribute_value("id"); const Glib::ustring gclassname = child->get_attribute_value("class"); // Try to instantiate the object: Glib::RefPtr builder; try { builder = Gtk::Builder::create_from_file(filepath, id); } catch(const Glib::Error& ex) { std::cerr << "Exception from Gtk::Builder::create_from_file() with id=" << id << " from file " << filepath << std::endl; std::cerr << " Error: " << ex.what() << std::endl; return EXIT_FAILURE; } // Try to get the widget, checking that it has the correct type: Gtk::Widget* widget = 0; if(gclassname == "GtkWindow") { Gtk::Window* window = 0; builder->get_widget(id, window); widget = window; } else if(gclassname == "GtkDialog") { Gtk::Dialog* dialog = 0; builder->get_widget(id, dialog); widget = dialog; } else { //We try to avoid using non-window top-level widgets in Glom. std::cerr << "Non-window top-level object in Glade file (unexpected by Glom): id=" << id << " from file " << filepath << std::endl; //But let's try this anyway: Glib::RefPtr object = builder->get_object(id); return false; } if(!widget) { std::cerr << "Failed to instantiate object with id=" << id << " from file " << filepath << std::endl; return false; } //Check that it is not visible by default, //because applications generally want to separate instantiation from showing. if(widget->get_visible()) { std::cerr << "Top-level window is visible by default (unwanted by Glom): id=" << id << " from file " << filepath << std::endl; return false; } //std::cout << "Successful instantiation of object with id=" << id << " from file " << filepath << std::endl; delete widget; return true; } int main(int argc, char* argv[]) { Glib::RefPtr app = Gtk::Application::create(argc, argv, "org.glom.test_glade_toplevels_instantiation"); Gsv::init(); //Our .glade files contain gtksourceview widgets too. std::string filepath; if(argc > 1 ) filepath = argv[1]; //Allow the user to specify a different XML file to parse. else { std::cerr << "Usage: glade_toplevels_instantiation filepath" << std::endl; return EXIT_FAILURE; } #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED try { #endif //LIBXMLCPP_EXCEPTIONS_ENABLED xmlpp::DomParser parser; //parser.set_validate(); parser.set_substitute_entities(); //We just want the text to be resolved/unescaped automatically. parser.parse_file(filepath); if(!parser) return EXIT_FAILURE; const xmlpp::Node* root = parser.get_document()->get_root_node(); //deleted by DomParser. if(!root) return EXIT_FAILURE; const xmlpp::Node::NodeList children = root->get_children("object"); for(xmlpp::Node::NodeList::const_iterator iter = children.begin(); iter != children.end(); ++iter) { const xmlpp::Element* child = dynamic_cast(*iter); //Try to instante the object with Gtk::Builder: if(child && !attempt_instantiation(filepath, child)) return EXIT_FAILURE; } #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED } catch(const std::exception& ex) { std::cout << "Exception caught: " << ex.what() << std::endl; } #endif //LIBXMLCPP_EXCEPTIONS_ENABLED return EXIT_SUCCESS; } glom-1.22.4/tests/test_utils.cc0000644000175000017500000000553412234776363017660 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_utils.h" #include #include #include Glom::sharedptr get_field_on_layout(const Glom::Document& document, const Glib::ustring& layout_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) { const Glom::Document::type_list_layout_groups groups = document.get_data_layout_groups("details", layout_table_name); for(Glom::Document::type_list_layout_groups::const_iterator iter = groups.begin(); iter != groups.end(); ++iter) { const Glom::sharedptr group = *iter; if(!group) continue; const Glom::LayoutGroup::type_list_const_items items = group->get_items_recursive(); for(Glom::LayoutGroup::type_list_const_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { const Glom::sharedptr layout_item = *iter; const Glom::sharedptr layout_item_field = Glom::sharedptr::cast_dynamic(layout_item); if(!layout_item_field) continue; if( (layout_item_field->get_table_used(layout_table_name) == table_name) && (layout_item_field->get_name() == field_name) ) { return layout_item_field; } } } return Glom::sharedptr(); } Gnome::Gda::Value get_value_for_image() { //Fill a value from a file: const std::string filename = Glib::build_filename(GLOM_TESTS_IMAGE_DATA_NOTINSTALLED, "test_image.jpg"); std::string data; try { data = Glib::file_get_contents(filename); } catch(const Glib::Error& ex) { std::cerr << "Failed: file_get_contents() failed: " << ex.what() << std::endl; return Gnome::Gda::Value(); //Something went wrong. It does not exist. } if(data.empty()) { std::cerr << "Failed: The data read from the file was empty. filepath=" << filename << std::endl; return Gnome::Gda::Value(); } //Set the value: return Gnome::Gda::Value((const guchar*)data.c_str(), data.size()); } glom-1.22.4/tests/test_document_load_and_change.cc0000644000175000017500000002023012234776363023452 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_utils.h" #include #include #include #include #include #include static bool field_is_on_a_layout(Glom::Document& document, const Glib::ustring& table_name, const Glib::ustring& field_name) { //Check that the field name is no longer used on a layout: const std::vector table_names = document.get_table_names(); for(std::vector::const_iterator iter = table_names.begin(); iter != table_names.end(); ++iter) { const Glib::ustring layout_table_name = *iter; const Glom::Document::type_list_layout_groups groups = document.get_data_layout_groups("details", layout_table_name); for(Glom::Document::type_list_layout_groups::const_iterator iter = groups.begin(); iter != groups.end(); ++iter) { const Glom::sharedptr group = *iter; if(group->has_field(layout_table_name, table_name, field_name)) { //std::cerr << "Failure: The field is still used on a layout for table: " << layout_table_name << std::endl; return true; } } } return false; } static bool groups_contain_named(const Glom::Document::type_list_groups& container, const Glib::ustring& name) { const Glom::Document::type_list_groups::const_iterator iter = std::find_if(container.begin(), container.end(), Glom::predicate_FieldHasName(name)); return iter != container.end(); } int main() { Glom::libglom_init(); // Get a URI for a test file: Glib::ustring uri; try { const std::string path = Glib::build_filename(GLOM_DOCDIR_EXAMPLES_NOTINSTALLED, "example_smallbusiness.glom"); uri = Glib::filename_to_uri(path); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return EXIT_FAILURE; } //std::cout << "URI=" << uri << std::endl; // Load the document: Glom::Document document; document.set_file_uri(uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } //Prevent these test changes from being saved back to the example file: document.set_allow_autosave(false); //Change a field name throughout the document: const Glib::ustring table_name = "products"; const Glib::ustring field_name_original = "product_id"; const Glib::ustring field_name_new = "newfieldname"; document.change_field_name(table_name, field_name_original, field_name_new); //Check that the original field name is not known to the document: if(document.get_field(table_name, field_name_original)) { std::cerr << "Failure: The document should have forgotten about the original field name." << std::endl; return false; } //Check that the new field name is known to the document: if(!(document.get_field(table_name, field_name_new))) { std::cerr << "Failure: The document does not know about the new field name." << std::endl; return false; } //Check that the original field name is no longer used in the relationship: Glom::sharedptr relationship = document.get_relationship("invoice_lines", "products"); if(!relationship) { std::cerr << "Failure: The relationship could not be found in the document." << std::endl; return false; } if(relationship->get_to_field() == field_name_original) { std::cerr << "Failure: The relationship still uses the original field name." << std::endl; return false; } //Check that the original field name is no longer used on a layout: if(field_is_on_a_layout(document, table_name, field_name_original)) { std::cerr << "Failure: The original field name is still used on a layout." << std::endl; return false; } { //Change a relationship name: const Glib::ustring table_name = "invoices"; const Glib::ustring relationship_name_original = "contacts"; const Glib::ustring relationship_name_new = "newrelationshipname"; document.change_relationship_name(table_name, relationship_name_original, relationship_name_new); if(document.get_relationship(table_name, relationship_name_original)) { std::cerr << "Failure: The original relationship name still exists." << std::endl; return false; } if(!document.get_relationship(table_name, relationship_name_new)) { std::cerr << "Failure: The new relationship name does not exist." << std::endl; return false; } //Check that the old relationship name is not used. Glom::sharedptr field_on_layout = get_field_on_layout(document, table_name, "contacts", "name_full"); g_assert(field_on_layout); if(field_on_layout->get_relationship_name() != relationship_name_new) { std::cerr << "Failure: A layout item does not use the new relationship name as expected." << std::endl; return false; } } //Remove a field from the whole document: document.remove_field("publisher", "publisher_id"); if(field_is_on_a_layout(document, "publisher", "publisher_id")) { std::cerr << "Failure: The removed field name is still used on a layout." << std::endl; return false; } //Remove a relationship: document.remove_relationship(relationship); relationship = document.get_relationship("invoice_lines", "products"); if(relationship) { std::cerr << "Failure: The removed relationship still exists." << std::endl; return false; } //Change a table name: const Glib::ustring table_renamed = "invoiceslinesrenamed"; document.change_table_name("invoice_lines", table_renamed); if(document.get_table("invoice_lines")) { std::cerr << "Failure: The renamed table still exists." << std::endl; return false; } relationship = document.get_relationship("invoices", "invoice_lines"); if(!relationship) { std::cerr << "Failure: The expected relationship does not exist." << std::endl; return false; } if(relationship->get_to_table() != table_renamed) { std::cerr << "Failure: The relationship's to_table does have been renamed." << std::endl; return false; } document.remove_table("products"); if(document.get_table("products")) { std::cerr << "Failure: The removed table still exists." << std::endl; return false; } //Remove a print layout: Glom::sharedptr print_layout = document.get_print_layout("contacts", "contact_details"); if(!print_layout) { std::cerr << "Failure: Could not get an expected print layout." << std::endl; return false; } document.remove_print_layout("contacts", "contact_details"); print_layout = document.get_print_layout("contacts", "contact_details"); if(print_layout) { std::cerr << "Failure: The removed print layotu still exists." << std::endl; return false; } //Test user groups: Glom::Document::type_list_groups groups = document.get_groups(); g_assert(groups_contain_named(groups, "glom_developer")); const Glib::ustring group_name = "accounts"; g_assert(groups_contain_named(groups, group_name)); document.remove_group(group_name); groups = document.get_groups(); g_assert(!groups_contain_named(groups, group_name)); Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_new_from_example_operator.cc0000644000175000017500000001253212234776363026363 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE template bool contains(const T_Container& container, const T_Value& name) { typename T_Container::const_iterator iter = std::find(container.begin(), container.end(), name); return iter != container.end(); } static bool test(Glom::Document::HostingMode hosting_mode) { Glib::ustring temp_file_uri; const Glib::ustring operator_user = "someoperator"; const Glib::ustring operator_password = "somepassword"; //Create and self-host the document: { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_smallbusiness.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } temp_file_uri = test_get_temp_file_uri(); if(temp_file_uri.empty()) { std::cerr << "temp_file_uri is empty." << std::endl; return false; } //Add an operator user: const Glib::ustring operator_group_name = "personnel_department"; const Glom::DbUtils::type_vec_strings group_list = Glom::Privs::get_database_groups(); if(!contains(group_list, operator_group_name)) { std::cerr << "The expected group was not found." << std::endl; return false; } if(!Glom::DbUtils::add_user(&document, operator_user, operator_password, operator_group_name)) { std::cerr << "DbUtils::add_user() failed." << std::endl; test_selfhosting_cleanup(); return false; } //Check that the developer user has access to database metadata: const Glom::DbUtils::type_vec_strings tables = Glom::DbUtils::get_table_names_from_database(true /* ignore system tables */); if(tables.empty()) { std::cerr << "get_table_names_from_database() failed for developer user." << std::endl; return false; } test_selfhosting_cleanup(false /* do not delete the file. */); } //Self-host the document again, this time as operator: { Glom::Document document; document.set_allow_autosave(false); //To simplify things and to not depend implicitly on autosave. document.set_file_uri(temp_file_uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return false; } if(!test_selfhost(document, operator_user, operator_password)) { std::cerr << "test_selfhost() failed." << std::endl; return false; } //Check that the operator user still has access to database metadata: Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); connection_pool->connect(); const Glom::FieldTypes* field_types = connection_pool->get_field_types(); if(!field_types) { std::cerr << "get_field_types() returned null." << std::endl; return false; } if(field_types->get_types_count() == 0) { std::cerr << "get_field_types() returned no types." << std::endl; return false; } //std::cout << "field_types count=" << field_types->get_types_count() << std::endl; const Glom::DbUtils::type_vec_strings tables = Glom::DbUtils::get_table_names_from_database(true /* ignore system tables */); if(tables.empty()) { std::cerr << "get_table_names_from_database() failed for operator user." << std::endl; return false; } if(Glom::Privs::get_user_is_in_group(connection_pool->get_user(), GLOM_STANDARD_GROUP_NAME_DEVELOPER)) { std::cerr << "The operator user is in the developer group, but should not be." << std::endl; return false; } test_selfhosting_cleanup(); //Delete the file this time. } return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } /* SQLite does not have user/group access levels, * so the SQL queries woudl fail. if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } */ Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_field_file_format.cc0000644000175000017500000000404312234776363022144 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_utils.h" #include #include #include static void test_text_field() { Glom::sharedptr field = Glom::sharedptr::create(); field->set_glom_type(Glom::Field::TYPE_TEXT); //TODO: Test an image too: const Gnome::Gda::Value value_original("text with \" double quote and ' single quote"); const Glib::ustring str = field->to_file_format(value_original); g_assert(!str.empty()); bool converted = false; const Gnome::Gda::Value value = field->from_file_format(str, converted); g_assert(converted); g_assert(value == value_original); } static void test_image_field() { Glom::sharedptr field = Glom::sharedptr::create(); field->set_glom_type(Glom::Field::TYPE_IMAGE); //TODO: Test an image too: const Gnome::Gda::Value value_original = get_value_for_image(); const Glib::ustring str = field->to_file_format(value_original); g_assert(!str.empty()); bool converted = false; const Gnome::Gda::Value value = field->from_file_format(str, converted); g_assert(converted); g_assert(value == value_original); } int main() { Glom::libglom_init(); test_text_field(); test_image_field(); Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_document_load.cc0000644000175000017500000003475712234776363021346 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_utils.h" #include #include #include #include #include #include #include template bool contains(const T_Container& container, const T_Value& name) { typename T_Container::const_iterator iter = std::find(container.begin(), container.end(), name); return iter != container.end(); } template bool contains_named(const T_Container& container, const Glib::ustring& name) { typedef typename T_Container::value_type::object_type type_item; typename T_Container::const_iterator iter = std::find_if(container.begin(), container.end(), Glom::predicate_FieldHasName(name)); return iter != container.end(); } template bool contains_value(const T_Container& container, const Glib::ustring& name) { typedef typename T_Container::value_type type_item; typedef typename T_Container::const_iterator type_iterator; for(type_iterator iter = container.begin(); iter != container.end(); ++iter) { const type_item item = *iter; if(item->get_value() == Gnome::Gda::Value(name)) return true; } return false; } static bool get_group_named(const Glom::Document::type_list_groups& container, const Glib::ustring& name, Glom::GroupInfo& group_info) { Glom::Document::type_list_groups::const_iterator iter = std::find_if(container.begin(), container.end(), Glom::predicate_FieldHasName(name)); if(iter != container.end()) { group_info = *iter; return true; } group_info = Glom::GroupInfo(); return false; } static bool needs_navigation(Glom::Document& document, const Glib::ustring& table_name, const Glib::ustring& field_name) { Glom::sharedptr layout_item = Glom::sharedptr::create(); layout_item->set_name(field_name); layout_item->set_full_field_details( document.get_field(table_name, field_name)); Glom::sharedptr field_used_in_relationship_to_one; return Glom::DbUtils::layout_field_should_have_navigation(table_name, layout_item, &document, field_used_in_relationship_to_one); } static Glom::sharedptr get_portal_from_details_layout(const Glom::Document& document, const Glib::ustring& table_name, const Glib::ustring& relationship_name) { const Glom::Document::type_list_layout_groups groups = document.get_data_layout_groups("details", table_name); if(groups.empty()) { std::cerr << G_STRFUNC << ": groups is empty." << std::endl; } for(Glom::Document::type_list_layout_groups::const_iterator iter = groups.begin(); iter != groups.end(); ++iter) { const Glom::sharedptr group = *iter; const Glom::LayoutGroup::type_list_const_items items = group->get_items_recursive_with_groups(); for(Glom::LayoutGroup::type_list_const_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { const Glom::sharedptr layout_item = *iter; const Glom::sharedptr group = Glom::sharedptr::cast_dynamic(layout_item); if(!group) continue; const Glom::sharedptr portal = Glom::sharedptr::cast_dynamic(layout_item); if(!portal) continue; if(portal->get_relationship_name() == relationship_name) return portal; } } return Glom::sharedptr(); } int main() { Glom::libglom_init(); // Get a URI for a test file: Glib::ustring uri; try { const std::string path = Glib::build_filename(GLOM_DOCDIR_EXAMPLES_NOTINSTALLED, "example_film_manager.glom"); uri = Glib::filename_to_uri(path); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return EXIT_FAILURE; } //std::cout << "URI=" << uri << std::endl; // Load the document: Glom::Document document; document.set_file_uri(uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } //Test some known details: g_assert(document.get_is_example_file()); g_assert(document.get_database_title_original() == "Openismus Film Manager"); const std::vector table_names = document.get_table_names(); g_assert(contains(table_names, "accommodation")); g_assert(contains(table_names, "cars")); g_assert(contains(table_names, "characters")); g_assert(contains(table_names, "companies")); g_assert(contains(table_names, "contacts")); g_assert(contains(table_names, "locations")); g_assert(contains(table_names, "scenes")); g_assert(!contains(table_names, "Scenes")); //The title, not the name. Glom::sharedptr table = document.get_table("scenes"); g_assert(table); g_assert( table->get_title_original() == "Scenes" ); g_assert( table->get_title_singular_original() == "Scene" ); //Test known fields of one table: const Glom::Document::type_vec_fields fields = document.get_table_fields("scenes"); g_assert(contains_named(fields, "scene_id")); g_assert(contains_named(fields, "comments")); g_assert(contains_named(fields, "description")); g_assert(contains_named(fields, "date")); g_assert(!contains_named(fields, "nosuchfield")); const Glom::Document::type_vec_relationships relationships = document.get_relationships("scenes"); g_assert(contains_named(relationships, "location")); g_assert(contains_named(relationships, "scene_crew")); g_assert(contains_named(relationships, "scene_cast")); //Check some fields: Glom::sharedptr field = document.get_field("contacts", "contact_id"); g_assert(field); g_assert( field->get_title_original() == "Contact ID" ); g_assert(field->get_glom_type() == Glom::Field::TYPE_NUMERIC); g_assert(field->get_auto_increment()); field = document.get_field("locations", "rent"); g_assert(field); g_assert( field->get_title_original() == "Rent" ); g_assert(field->get_glom_type() == Glom::Field::TYPE_NUMERIC); g_assert(!field->get_auto_increment()); g_assert(!field->get_unique_key()); //Check a relationship: const Glom::sharedptr relationship = document.get_relationship("characters", "contacts_actor"); g_assert(relationship); g_assert(relationship->get_from_field() == "contact_id"); g_assert(relationship->get_to_table() == "contacts"); g_assert(relationship->get_to_field() == "contact_id"); //Check a layout: const Glom::Document::type_list_layout_groups groups = document.get_data_layout_groups("details", "scenes"); g_assert(groups.size() == 3); const Glom::sharedptr group = groups[1]; const Glom::LayoutGroup::type_list_const_items items = group->get_items_recursive(); //std::cout << "size: " << items.size() << std::endl; g_assert(items.size() == 13); const Glom::LayoutGroup::type_list_const_items items_with_groups = group->get_items_recursive_with_groups(); //std::cout << "size: " << items_with_groups.size() << std::endl; g_assert(items_with_groups.size() == 15); //Check that expected fields can be found on a layout. Glom::sharedptr field_on_layout = get_field_on_layout(document, "scenes", "locations", "address_town"); g_assert(field_on_layout); g_assert(field_on_layout->get_table_used("scenes") == "locations"); g_assert(field_on_layout->get_name() == "address_town"); //Check Field Formatting: field = document.get_field("contacts", "name_title"); g_assert(field); g_assert(field->get_glom_type() == Glom::Field::TYPE_TEXT); const Glom::Formatting& formatting = field->m_default_formatting; g_assert(formatting.get_horizontal_alignment() == Glom::Formatting::HORIZONTAL_ALIGNMENT_AUTO); g_assert(formatting.get_has_choices()); g_assert(formatting.get_has_custom_choices()); g_assert(!formatting.get_has_related_choices()); Glom::Formatting::type_list_values choices = formatting.get_choices_custom(); g_assert(!choices.empty()); g_assert(contains_value(choices, "Mr")); g_assert(contains_value(choices, "Mrs")); //Check that the default formatting is used on the layout: field_on_layout = get_field_on_layout(document, "contacts", "contacts", "name_title"); g_assert(field_on_layout); g_assert(field_on_layout->get_table_used("contacts") == "contacts"); g_assert(field_on_layout->get_name() == "name_title"); g_assert(field_on_layout->get_formatting_use_default()); g_assert(field_on_layout->get_formatting_used() == formatting); //Test this utility method: g_assert( document.get_data_layout_groups_have_any_fields("list", "cars") ); //Test library modules: const std::vector module_names = document.get_library_module_names(); if(!module_names.empty()) //TODO: Test a document that actually has some? { std::cerr << "Failure: Unexpected library module names." << std::endl; return false; } //Test print layouts: const std::vector print_layout_names = document.get_print_layout_names("contacts"); if(print_layout_names.size() != 1) { std::cerr << "Failure: Unexpected number of print layouts." << std::endl; return false; } if(!contains(print_layout_names, "contact_details")) { std::cerr << "Failure: Could not find the expected print layout name." << std::endl; return false; } const Glom::sharedptr print_layout = document.get_print_layout("contacts", "contact_details"); if(!print_layout) { std::cerr << "Failure: Could not get an expected print layout." << std::endl; return false; } if(print_layout->get_title_original() != "Contact Details") { std::cerr << "Failure: Unexpected print layout title." << std::endl; return false; } if(!print_layout->get_layout_group()) { std::cerr << "Failure: The print layout has no layout group." << std::endl; return false; } const std::vector report_names = document.get_report_names("contacts"); if(report_names.size() != 2) { std::cerr << "Failure: Unexpected number of reports." << std::endl; return false; } if(!contains(report_names, "by_country")) { std::cerr << "Failure: Could not find the expected report name." << std::endl; return false; } const Glom::sharedptr report = document.get_report("contacts", "by_country_by_town"); if(!report) { std::cerr << "Failure: Could not get an expected report." << std::endl; return false; } if(report->get_title_original() != "By Country, By Town") { std::cerr << "Failure: Unexpected report title." << std::endl; return false; } if(!report->get_layout_group()) { std::cerr << "Failure: The report has no layout group." << std::endl; return false; } //Test user groups: Glom::Document::type_list_groups user_groups = document.get_groups(); Glom::GroupInfo group_info_ignored; g_assert(get_group_named(user_groups, "glom_developer", group_info_ignored)); Glom::GroupInfo group_info_accounts; g_assert(get_group_named(user_groups, "props_department", group_info_accounts)); Glom::GroupInfo::type_map_table_privileges::const_iterator iterFind = group_info_accounts.m_map_privileges.find("scenes"); const bool privileges_found = (iterFind != group_info_accounts.m_map_privileges.end()); g_assert(privileges_found); const Glom::Privileges privs = iterFind->second; g_assert(privs.m_view == true); g_assert(privs.m_edit == true); g_assert(privs.m_create == false); g_assert(privs.m_delete == false); //Test navigation: if(!needs_navigation(document, "scenes", "location_id")) { std::cerr << "Failure: DbUtils::layout_field_should_have_navigation() did not return the expected result." << std::endl; return false; } if(needs_navigation(document, "scenes", "description")) { std::cerr << "Failure: DbUtils::layout_field_should_have_navigation() did not return the expected result." << std::endl; return false; } //Test portal navigation. //Note that related records portals don't have names. //This example portal shows the scenes_cast table, but should navigate though that to the cast table. const Glib::ustring portal_relationship_name = "scene_cast"; Glom::sharedptr portal = get_portal_from_details_layout(document, "scenes", portal_relationship_name); if(!portal) { std::cerr << "Failure: Could not get the portal from the layout." << std::endl; return false; } Glib::ustring navigation_table_name; Glom::sharedptr navigation_relationship; portal->get_suitable_table_to_view_details(navigation_table_name, navigation_relationship, &document); if(navigation_table_name != "characters") { std::cerr << "Failure: get_suitable_table_to_view_details() returned an unexpected table name: " << navigation_table_name << std::endl; return false; } if(!navigation_relationship) { std::cerr << "Failure: get_suitable_table_to_view_details() returned an empty navigation_relationship." << std::endl; return false; } if(navigation_relationship->get_relationship_name() != "cast") { std::cerr << "Failure: get_suitable_table_to_view_details() returned an unexpected navigation_relationship name: " << navigation_relationship->get_relationship_name() << std::endl; return false; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_image.jpg0000644000175000017500000037717712234252646020005 0ustar00murraycmurrayc00000000000000ÿØÿàJFIFHHÿþ ÿÛC   ÿÛCÿÀôwÿÄ ÿÄC!1"AQa2q‘ð#¡± BÁÑáñ3$Rb%Cr‚’ 4ÿÄ ÿÄ?!1AQa"q‘ð¡±ÁÑ2áñB#R3br$¢’CÿÚ ?òA˜ÆÆL'ÔpOnü?ã¯ëC06Ñ~©,9†š¢ ÂÂá `“ŸožEèÙ,Tˆ1u½¦" ÷?ü0¸ý{þ=ÚMÀL¦ì¶:lŽxÛ×µD,T`À÷ÿoÔuÌy±™L-Óê·È\žíÎ?Ûý:áØKnFPFrÄã°Úb?°üú!U¦9þ$£2¬6îÚ»[Œ;cêqÇBÖ‘SQ¤ÈY2*­88/8æ?×£. »’ÍG8Æ„#Òa’0ÌB€@õÿÀèKÀ°ê‰´œ\AòCØ<ÝÏŸJ‘íïÛ·aÉèEìB‚ÀÓbµ 'b–`C äÛ>Ýÿ¯DÑ3Pic#„(Úp6sô~N?~àòFª@ÍÝßÂ7Êef ÎJç°üóøþ=p2˜úYA']A2£Ër¶Ëúc£pq¼$µ G:# 7¹Ýóüï¿Fgö¦™Ñ„nP3ƒ»g·çïŸÃÛ ÒÚã]h#*É/úO<Ÿ=º¸(Í2!¥i PìNà·ÓéûÏVwÙU{û¼î‡±Ï¶ÐBüÿ§·¯aЂ%0@C 2–Ø2yöÏ¿Ðvê r‹ÝªL€€Ä[xTžþç'ß°öíÑÆmi’Û›„ñ/qd\pÇ }¹íõüP¡9í& ûòF˜ßpÜäç·|žÀûsŸ¯Ks¤[DM¤fëlœúâG-Î äã}I.ÑÞü˜@6Ðûº€&ìí#ÈÆy?,}ûtN|ÙNžRG½}ÏUŠŒÅÞ]ò1 í+êù‘ùsí‘Ð5ÿ%%Ž Íånã+1’8íÛŽ?,žÓbMGÁÈâ\©g ÍŒ®ÝÃ=Ç?²:P€è ^Üç_­Ò„ËÜ– €£Û÷ÿC‰%\XÒEІvœ•*HÏ'?שhBê“{@@xÉfPs¡{Ÿõ?ŸM¢f.ªÕ¤ .ù|º¨s/­›ÌÏãŒgñ>ØéLaÝëNi[1ȾXQ…ϸ½Ôäÿ˜qôÿ¿n¥ô-¯$–b߲ƒlcr=±¬{qŒ|ÇG”‰<“ Ì}† €äœg `Ÿ¿·ï·AÐ! hÏÛî„b˜ÂÙ+’9íûþ½ûµQž 7Þëm2Ædeÿ!Ž8ööú~]4ÖÊcßVÆ Ç*€p2¸##·°äþÇK'QÑÿ‘÷º/ËgØ©P€óÉgØtÃDë¿€úªæ¤¿º˜88yU‰ÎàqŸŸ¾Ÿ^ý ² ꉵ‰iî¶±ÚªKÅIãç“ôèË-;©s\â/e§„H»0 ¸’9öãþ·Rð• â·Í*äàrXïôÏÏ¡Ëi*s Ç/?K-yi¸[/«Ô œóÇûuÙI8°:VÜpq#0ÆÐ6ðâ8Ï?¼õ=œ@ ZA3uŒœÌ}EaÛö§RÒd4¥‡4f! cû§x=ÊŸnØÿn$™äšZßÛ:¢6b2NÑÉ|±ïžàOÓ¦9ÆbRòˆÓ_4¡©!Âiq‘Ð5 èeYuBIq I$d]êK)'œc<à|±žT@‘A÷XUJ®é“ÃÏþúçFvÈkïä„#8xYǨg‘Ž;óøŽ¡Ä˜BÇj·±•v*œå€÷ÀãûºZÑ!;ÄbÇå˜øRì«ÇoŸp~½ne1 0AVÜáFG>ÙÁÎ{ûñÿNÑÍ F£D/,)FVR;dœƒì׎ƒÅ=äۢͬrŒ7§ Û Aêàç`çÕúgéÔ„¥ƒœ%mbó$ß„,\œ‚È~Qõê_P‹.¦uÑ”ä µ‹ÀǤüÌ {~ Z ž‰Ô)9‚'Y²S„•W99Áù“þ£êrq×7ߢ½ÆÇì´±*ÈB[`Ë€¹ã$|² üè̘+©åi ~èÀÈ!aÁ$yÀ÷on‡¼pº6UC€@Œ²F gNìã?ïõê\çI h±¶qÐ-ˆå$…,‹»o¤÷ã¡h.ªðÙ –ÂTó -¸/¤d‘Œ`v#8öÚT€ ’?„ *vP*yÀç±öÇlþ\tÀ &½ÞÖ†å"ãïttih¤Uÿ6W‚~¹ù`à|ÏPs“‡g@#æUPWîÜ2$©ãƒžGcÎ?¨–¸¡–L ž¨¢HB>å;I †ÏýÇQíÕŠTDÝ ZÄÙ‘k>÷QYbL¸Æ ÎxÇôü3úô¶fF¨}Vüµ )‘@8Èàç€;žHãñèÒ ˆT$ÙãÀ‘72(8bô¯aóèÛNòwB÷€l±iݲÀlüÜöïßýú—¼ &R¦çˆGm†â¬IÎÉ$` þ À#гa#î©ç7¤ã>ÿ?—E­‚‚ëLHJ¦@e€ØØ|þ_Sóéy wu šàë›c±ƒHrNH8Îqøcõ9ê$K‘6œ:ªV’S‚è )'=ùÏ÷Àüº*†ÀÔ ŽÌvZòòKª„v\ú±ÿdýêáü©I ÜÐäáC9lãpÊö=¹ãðúu-2$U)í©Y´¹‘w¾ìç…É9sÛýú ¡¥vØÝc ß¾L1Ûœ0Ù#ŸÏ¿#ý:“¢çDIחݧ†àp9ÚrG<ÝÏ\ ¸vŠM-Ú}ˆo6F;¨ÛŽøùóÇQLÈ’¹Ì-04„X@ìÈñœ€IÝŸÃÜã=q×u³cxB(Šˆ$\¦{Ž>C“žG¨vhPèÊÈ_r<ȱ Àpõcœïù|úQαD×6\Î`WYH?t0;çßý±ÑEÍ¿•áÑ#íü}õYñéÛŒd~gåôè² eS“äu „¬¥‚í«žÝóõïÐ5¢eX«VûÑ`,ƒŒÁy.3ì{Ž~Ý ;'×x{ôZ1#˜È$ä…Ïõ'ŸëøôYˆ1¤€6Ù¼•Üc-»ã ÇçÇl~‡B@òV `o¸[%Ns±ˆàŸ~ÇžÄ÷^:#=‚X'Oãt$|·õ0<€xçߎ…ÄÂ&<ÌŸ,(\` 0Fžqý?§Rw* pZ@‰CTaæžû™r{ddsÏ\\5DÖ8ÙÑcbÌ6Â7°òïú’~×É)ù‰äJ™Uª;“ïžì_ïíÐ44X)¨âá˜#Q 1™Ü*mÆY±ŸaƒÛå×’@¦Sh»‰·?~(¢ú±Á q»\ý¾ƒ« m®ªDXL%"(ÆÒÈÃpËI}{^–\â ˜ À ÜÐnn„ˆƒî>œœàóÏéÒˆ›‚žhEyjí´²äaN;çÓžÿô>XéùH¸RžsˆOºÞЂãd’=qmô\Ç–ƒ'_^AlF ˆÞ,q´ŒäO=ÿÛ¥Ÿý¥ç¼-Í (”eGóôýIägÛœ~]óL¸¨~À&È€Bº¶ S· œc?3Æx9ãߦ4ÒEÌ~Q嬀°„r8là÷Çàg®k H*¼ƒ¡ä£–£ÌxcÁ, äß¿@*_½²§U¡·æ‹j5Ÿ-I•`6ùÏaïÛ¦‚b.‘À$ǽVG*¾&=¶}³€?g¥É$A•m“b´Whu\’%·}ÜŽ{|ÿ^ˆê…•.@º4R•t 0÷8È#Øÿ·Ðô=¨"Ú'dÊA+KÍßÌÜ6¦ìŒ{ñî?Û®,; óJcÃm+ JÎØ.0F1Þ~¼§áÏ]™Ñ5ÙK‰û”4C¿r䀸;{¯Ÿç÷Ï@˜Ú÷–-2’þf2$Ï?_úô`·@”ð\K¶Fyjv¦¤PI{áÏõìì˜æwº„ì§×nlÿ¹ç®“¡KsA3É©F#|KÀÁû¿‰çžÿ>Ý D©€ÃKþ~S ÁYŸ!H#¿·ïëÔ—Ä\È0Q‘ÄJS½sŸl÷>ý¿/Ë¥¹Ó%Y¦v'D å€Üûçñí—åõë›: W:¦RIZ0”ä°äO~;`cóíùôb ÚUs" ¢š6 Ø2l* b9ÀÁÏÝýýºa‚[³Ldj…ܤÃ!—#üýz@ik“j8dªÁÔ1€\眯ÈÑätO2|Ó°ÒwF*fU €O¿ýç¾zÈ”ãLÉxVRuMÝ™r|~]É x %&cw`@Ø{ƒŽÀþ—-¯$+.¥¬j·\¨PD`g'åŽ2~Ãõút§<‘#T^q '’Tó¯¿M¨KD aÌîˆçƒˆûúƒ}áÇo~ß.…µI ´«Ui6n9¢ö¨!c…Îõ$ÀßÐóÑ™k•VÁ½†¨Ù)Æô°ì¼ðFxÈíŽÜuÍ舉1è²HÉe;TóŽÃŸ×œdõÄeEV$;r†ñÊîKFs»p~~ýNq—ª‡Ó{œfãùX±‚¢C€xçéÇÓwïCI9í07;ýÂ1!—`ƒ¸àAà}3ר‘BÚ`ˆ±oV*é¼è8ÿŽ˜^@CÃ6Å U0=J ?<ø¿B DÆŠEBè<¾å Àë¸ùc$œàqor9êEBDrP)›Ç½‘‹®0#'°È9ö½áóȩ̀v®Ù¿Ý "nÎÝb8#Ü“øqžžë6¯D‚ð áM­ÌsòÉÏÞßNç ÊÓ\æ´QˆÜ£6’À”gôÏû~që©gìîé¿ORe T $A‹ÃŒv8Èç¿áÛžœönUJžVõGHØù¯°à`à)Î8üǾsóâ`IÝ>¡Ìu·Ý `f*è¯ –“í‘óíùt:Ljº›ËŒžˆlž ÊÊXdo#'v·~üq×Sw553¼Ùj8‚°Iôc Ø÷ïùñß©¨ý3%°9w$2¬3åŸNK€¹ôò~\çþ>ÝcOuÈ]Pƒ  ƒè,U”…`Fr>>› Ä¢ñ¡L…¨Èñîçõçñ÷öÎáÔ’isœèÙiâap̹$lÀ=ò>ÝhÝAykm´éôZ’2ëÀÙž0sôçæF1þÝE(é•38‰Û6wþ`$ç°ÏÓÜsÿ}7)”èå‚ íã [x‰ÀÙ»’@88àž8ã=A •Î=ìÑÕlFŒ…wÍ´ã?_o§¿áùñ$:'4†’@“ò@’YAA’Ù'#æ3ý:0Ûx*ä÷¢YYK‘¹’~÷â?NßÓ®`¤:ñ§åñûBËé^HÁ žúþÿ…¶º'0ƒ{ÕÝY-´ÃñïÇëÐ8 ´L¤fZíPˆ ‘"º•ÉûÄûãëÀïþ1 !EB\b.l´)ÙÈ%bÍŒñó?÷üz ŽdL®l„HA2p@%€É>ÝÏ~Ãð?^¸¼mPní,¶aL•([8#‚1Ï·ËÛ¡7 ](R&ÆBçkw9íûþÞýi‚¥Õ.'T"ˆ¤Úª‚rJŽÃ·ÏŽ}úæ´ÝJ‚A@0‚§|j¬@÷ú‘Ï·ëÑAÖÞýƒ€á§¿²Ù] !q8_lwÇ>çßÌÙ5FÊ„%cu/ž;c<ð;öãþ:›rD×á›tÜáK)%Xƒ¯\ák©¦ëØÙÀÀ«˜}#Á>Ùö9ùõ-«b \ö™°°±IØ,„®ýïÄž–[&Û£còÅ®‚€0[ÝNW øüŽï=@l¥—¸Ù FT’@1gäç’{ðz‚ZDÍÔA´iîVXϺà(>Üp×ߢ I=äâRÁTn\cåÇýn˜÷À’R™Jmì„ôüìØ$>þ8?= \èä<ýP–ÃÔ9##¾H'±É稦H(êAÕ"@Ìlo~;y óò÷ÿ^„;˜O-»¤­òá)!³ÃÜc÷ßð耞ð]žú¡ËàŸqÆÓŽz+u.¦\L] !uU'ÐïŽ3îÎ1ßåЗLTÓhË™Ö#æXdLެ+ôýqß‘íþýq& }ÐV–»v¨nÄäòØ{ôÇ“’)µ Æ¡ðår0¡Ž>÷xàð{àt¶™¹Vƒ"ÍA0’í”%qÙG©¾}û÷íÛõét[(ÌIFhÔa›h8í“ô÷àãýzŒ²S‰†ëmÐÕaÁf±wÿ¨ë¯Kñ¿Õ!Þ“ ™Àm¿w'¾=ÿ>œ Øh–ØÍ˜˜>Ê9’\FÁ£FhÀû«Ü~=Ï?On«‚Ð.‰ùËÁiè³ËóÒ©IQò8Æryü:&¸-Ý<»8ÃIZò@ÜwÝ»$ÀÇß·EŸYAL!®ºÃ`åŠò~L$çöþ0>4Ýdú!Te$î+œöçØ{ŸßÏ ¸ÇQ¢"êeŒÞØ÷úäü½ú†´uB$ô"¼…lÎ1W=¿페 $©º‘Ò=”žHÈböð>þËØøéÌhpdº„‡óMßYÎÕ]§!›'*=ÈãsÓ¤X*Ž›}alĬAtRƒ<çî=ÿ·K ‹ SAIB ²àò;®>žÀÿ~–—]K³FTAˆÈ"ÞàGù€ãôþyùtg»¢]œÉåôG£Ë“ï´óÏϽ„¨—ô@1WpaÀàc=ý¸ú~`„n³¡·íª+aFFºãÛ¿y'??ǧ9¥ÂˆXòÓ˜j„0Ê0a°cÉü»ô¦ìšæ¶j,J…Âo¸0ùx=¿N¸4›¸C£uŒã.Cç¿<þ£þz–½¹ouÄ™aa2ˆdG“·âqò?Lñøóט¸²‡Tk‰%Ê,þ•1®n#·õýž ‘•tÞÚ{²9c'Ò]‡%sŽïƒùsþüôA‘É1¤ºô@ÃP¸%¸?åçóØûöþ½0²×Iui0Ô#•hùXÛ<( `ÿ¯ü~%Ì®5Ë6,ŒP»xù`ÿ§G$B âéQ» õiä1àãóéN£oî²ÅO/v‚;œXs ÷ùûõ“Þ\]¸X‰ÁÈ$)8÷ýzÒtDǰ,d\²ŒsžT€ÃŸßéÛØòÀ•¨ý¾ý…‚ÚX.NG©Wä{×=@;@qÌh†b!e/‡aÛqì3Œ~9Ç8íý`\€4M&K¯ãÕ ÉÜT,vƒêϹýý;óÒšJSœC¢d#B‚¹Ædœ¡Áýþ=Hh›¡så±ïÙZJ|pTò7ì>GŸßéÑg’ DÂ÷î‚m%÷°< ŸonÞüŸÔ¹ÎÉ̺d ±#er0§<Œç9÷ì?^§µ wRÛ@.[1ŽËß}óŸ§ñßúõ3벘€Øî2QØgÅAçñøûõ•ÔˆvF%‡òÃ`ãïgÿóÓÄî”çq¨C qé(êªxëíôè 0䯏呠²0Fwmν‰¸_~PúšÊ(&2TJÜõú~G¦¸!CÙ·¿hL#vrH Hýü÷LÊXü¦ahuA³œnÚqÁ?åÔD¼“„8[Rƒåˆˆ &Òúîôü?~æÖ *»ÜX Ù‡+­´Û»ãç=þ}ùêd”ì˜Â T%c²ÿ ãÓîOûíÑ5„BŠØíFè NX#°#î÷, ÷9ÏÈþ‰è]Z #KFkÝb£+dÎHÁà°?§úû×=·†è£S-ŸÑT88@3Ûäçý3@z¨{@wO/è$EvÄí pNpIü?CÕ‚Í vYŽx¾ë< ’¿åÂòTþÉê%H°"Q 7$. ç9íø{žÇú|ú—H¸RÈ3;D%ORdUî¬}‡áúvíÒê[(¨—fÊ4÷õBxÇ!;‰Á>ß<üûÓß e‚hé7¢;ð‰“œð=‡¸ùûtb"P>ÇÁ¢WÛèÏ%«FOú`tmá`èµä±^…$sŸ¼°÷ç=D€šÓb,µ$QîÈ*£8$ò[žãÿϣi YsÃsBÛBÄ®Wxç'ßéíБ ‘ª\è´"áUãï ~x÷ÆHút˜5[0¹#l~¼©%A8öü†:0WIî­Ô±ä¶HR¬¹Ýòã8íþ½AvÞ‹³4’%oÉÉô£ã·åòú|‡PfÒ‰Ð.„h\Žã¶~Cê÷ê)E£5‘"5ݽ±“Ÿ¯÷.› ¬Aì-$jIM¸\n;“ïŸ×ûuÃ3J擦ˆmô*AÜr23—¿ýõÓ6*ÈÏ$6çhÔ¾}D{¯Qœé6Ñ?( Úè¡vQ‚¿AŸÓ˿׮Íb«¹Äl¶)ðAB…är{ü³ÇRçÚLa3#§ácQ»  –!xÿ¾?OǤ‚MÓ36|aoÊ Ä€ÒH{€¿‡<~\ˆéÑs n@ï-•8Éq±I9aߞÙçäzŒ€ .#B´!ÜŒxlgêÏôêK`j¡ ‘1ïT5BÂl%}ÏsÐ=·¶ˆÚØ¥ É ÜÌ™Ÿnsì8öçòé…Û€ —@‹hЋØ÷]¹?O‘ç9öüºæ‚BAD-Œ«—.iÉ8Î@ù÷ý: ØV ÈVÊzôÜ1€çöêIðPׄ±çsùaHã<àg÷Ï´WCIïCHÆ#(U»±nqØuÄîäòvh²Ã?’„WƒŸúÇéÑšMÆ £›Î.ª>ñá‡p2{矨êE@‘²w±8àTüùïïÏÓpfèÜó¡Ô ˜˜•¬ØM¿wýöé¡À H-’g”##‰ÎÈäpG±ädd}yöü±Ð½ãP˜Æ2“²Œ}öÇœ Œc¿ïçЂH@â5Zòò¡Óþr¹û¼wÜvý㦴Á’”ûÀ(åIƒ–ö˜‚æ?/ëÒȆK_u³rÏÉÁ'Œÿ¯=¾}±ïд M3—0Eùo°ä‘‚,ysϹÇ?¼õc8ÛU\Òyë¨Õ¦òÎU·3 ËËsÀýÿ§J}PëŒ0³ºÛÊF¹&E-…à±Îyü†y÷苈 Í‘a²ß’ÍË$®rÇ–ã“þ¿.z‚DB—5ÿ»¢Ã#Ëô,p['\}:kX@’Ïq¦ Å!$†U8ïž·úçõéÍèC[,’Q&ÌL„€äû}Áý§Lh ¦Y'3‘F–ÌeBú¹ÇŽÌ`ßi-RÁ\ ‹{1@žF}»ÿ°íÐA(…@é…³™w© ¸àå±óý9þ½DÜŒD6ù¬v70>–ëèSˆ¦‰Ÿ+±‰Áàœü¿1ÑSt î–$ì‹ò²îcWÿ)$`ŸÏ`õÏ#Y²ê`ƒ_Åkˈ!‘´Üÿïй  Ó&uCeÃÈ E÷ùã=óïÈçðê sB"èvAh”£d».I$®N>§ýÓ¨ “tOÒŠmaЉ$ ~$ãžç¡‰Bãe2B˜÷evþ<c1øtRbeiÙá±…bxw¸Çýöè)’tL¨À ‚¶ÔêË e%1ŸŸã¯üu˜¨s@i.B’ÌYBŸósÎÏþzÂ.JæI¸M*ªïa‘»hÏç~ßÓ¢K©/qwui | )r£8>ÿ¡ùt®Ñ§U!²VŒaÕ™•² àŽÝ¾]LMÔ¹(kÀ yŽ=X€ÏôêI‘²0Ð#U³ ¡F,;à·¯Lë ˆ:¡ù%÷#òA wƒÏÓþº Â0I°A’»ƒ‘˃߹÷Ç<ÿ~¤\r² –°–ü°ÇЊÒc±xóÜûŸÇåÔ5‚ Úö¤;»ªÁ’ÅwÆr¸Î2yüxèÞÑ!¼£–•Fç~Þüä~ŸNz¯˜;+4̺=ôF¤m‡ O9%Aà™ã÷ïÔ:œ¶Õ%¥#_K)8ù’p3Îóÿn 8Q3 –4Ùî;Wœ‚>_ßútàð@€·}ÊЈB§'ì¾ÿóÇRáæS¨B¡ Ê`çÏáïút0ào¢œàëF0îÖBvð3É?"~|¹¬:º£Ú\_‚€’NÑ&qƒžÿˆù{cé×v6¾ŠYW0€.Q‚¥Waw%°Ï÷Çâ:  “ZÓ-ˆÆ@7{`éùþ>ýúâ  Ð[š„#Ü™ §¸ù§~¸<øÁ° •¿!A;8Ú~Þÿ_¯¶:6ÔДF$ QžQª çpd7ï·Ï¢ÙEWÉ–•8,ÈÛÈÏnN0yóí‘іͦÊ@n—B)WFsƒÁ<ÿCíÑ\…¯7xCXÖB²*CdòIÀ< }?¿× ²—´“š -ì(­‡Š6@€{óÏÓ±<ŸÓ¢q“óäip´ ø*ì-é/’qƒŒþyüz&X÷v EÙ„<É[1ù,…D-·ƒõü¿ßN¤²OU¡owm¦2QæúŽ}‰çßû|±Ó2ÿ±Me€iÐ£Š…’@Àì ò{cäüºPi'ö¢í:éÐ0ÆÀ]ÁàŽYŽ1Æ{{þGëÑ ¶UH"ö‘¿”|®‚bWÜ ´dcÔ3Ï×ý=º:e ÜÙIx’ÔS$lÌb,¨ÉÎÓœcß?3ŸïÕªbÁfÖp.$?…£  £¬lAq’@ä|Ïéß©o L—o^h“‚IUnlz°8ü¿¹üzçeó r¸Ø ¼cj±n ßÛžäd}:Ø2™œ}áa„‚,rpIçð¹÷é:˜ ¤@”\‘e€”ÆTŸ÷Áç÷ß©,BâéuÑmß· 6‚žÜsùÿ~‚£`!k³~ã¢ß”öî <ñƒïÇ¿Ïéíõçˆ ´›.! ápX‘°ÉÈ<þß>…­–Ä¢{ot%Kg €N8Ú÷DÇe $ JìãG>þÿ_Ãë×8ì„­ùD’S ì0=±íøüý³Ð‘1Æ% )” 1*rF8ÇëÁãž…Ï$£6X°‡ag<ç‘“ý1ëÓÑ¡@ÂL•‰,ÛÉvǨsxèȲN3st3ÿØ«œç–Æçëïúu º<ð$-C6ÙrØÛÜ|»ÿ¯Bd‹h¡¤\Œòˆ( ,dŒqÆ=±œqóíò냠&—f".Òñ˜#žGû~=®g’[›hÙ ãÈÎ@úŒÃäc¨?qD‘a…™Jù`ƒŽ1¾ÁG韯PÒ&eÉÓT!g™6`ž±ÿ¿ë×<‹®ODgÃ}×ð¸<œãƒÿô.yÓš“O-ÆË,;ØR3Œó‘î8ÿ~ýI˜²æTÏ+ùž“‡ì 'åÏçý:æÙ°vDÓ.ZX‚Œ gŒŒÇõ¿n•¬^ÈÚø–ÂÛDåål&Ê¿{ê}þ]Dr·UÇ(αé°ƒÇ<ãé“íßçѱ²¹Ðn‚Ñ“æ&ÈøÁ=½‡÷=þTæ&å±y€@ì@Èÿo¯n‚ Ԣ™%£ß»,ò 9r zA §Ðqø·ã×<Õ!½ÿ$#$vãœÛè8éliˆ:&‡.þþH&!…ß»hääü϶?|ýz YÖ\Q‹  ò‡Ïëûý“s Y1´àwÖ’,³2£*ðÊqœ÷îO¾2.¡í°IŽ[{ºÅ„«0häßþlŸVéßצ–Kc²: Ñ ! #Êœ¶ÏáŽ>_—= ©å&QËKBDŠ HçðçéÛðþýpn„Ùvc%¢ållj PÀ=<°?‡=5Í–PƒßͲ…el”T õñùŽùéM ÌàH‹¡ìRÆwcŽBý ýöë²æqF oªÍ¥Wj±ã# Ü;*ñûÇRÚPã+»A—.þì±a*T2+FÐÍßû~¾þýHh&Êîì¡ DÉ‚0s‚«äsõ$÷玊o}Ô¶–ß§á `ó7.ÑÂ’¹;ˆç=þ_O¯F_q q9¤èv.0ååBÛ[·Ë±—BúPd(F“dYŒ[€ž;Ÿ¦GÙ2&+9峤¡M Á •c·=[µ•ûF{;ût%  ĸëïÞ‰9‰ã&V@ ?ð>}ºŽÌ–+rŒXÁ3Fȼ_ÒÙn3Ç~3Õz´îÏùNcÁ$îlµ$~‚P~ð%qžI~'<õ,o4EÇýv[ørÎIŒ>1îïÓ¡!ÚFMÊ„ÜÇ9à {~C¿=¿N‰í ë¢ nÎQžAb»@8#·?Ÿ°$ÿNƒ.k¹1Æ -ó¹b_¹íÇ|ü¿ õÎi€ Ônn¨QŽÈÁ‘[#6@ýzæ€rç“pÝ–ÌˆÞØÁ9àœðqǹÇLq´€Š™½Ð– ÌÛ³ à7||óþÝCÆÃuÌn¤¬h[Ó2’On;Qœt=˜çu. X #ŸdlÌ †GÝöÿn”ÒIe/[&åÀ1mUö'ó±ÑÄ6û®:ÂAþgÚÞ ß £êqÇú~½‰€z€îQ‚“€gR9r0 9÷÷úãýº˜)õ[XcÁ%Iç<ŒàgO|ô!–²Œ Ý)W†,–ÎG~ü~º Á¾‰£(lîV|>KJS9ã…'p9ýr?¯DÃ"˳IuÐŒ>†ÞyÆ{㟡úŸ—R™bŽABX}, FqÀíÇcùãð=(¶C±9ì~\ü¿Ôt™š ,ja´d{Œ ©î01Ø÷èï¶…A§oU¦‡I”íÇéßðêC;!|>\–nøÎ ü{ñÔ;# Ýg’«ÁCŸ#¿O—\ˆ ¡¥À”8á@Ñ”;ˆN@ú˜Æ:‡6ðS)@9šn’H>YgÏuûûŸsƧӦdµô\Â4…¿)Ê«mwpJíϯӱ÷ÔG‚åÐu+fL§;}˜î;ò  Æ9ÙZIÓøBXPïÝ´c…ÿííÏÓ¾ÝS)ù.(hÜmd||‡óéÓÃ$ɺCÞ`¸[Ü­<(ÜJ¶N‚½»ÿOùë›k‡C€<Єj²úÜóùÏþz’ÐL¡5!Ä„bÆYü½¾®9Ï8À©?<N¹ÒØ)¬9ÏAªÒ¬HLv!@PG,ŒóÐ8Ñ1¢÷VÌ >ê‚7 •p?ß'¨kŒ].«@6Ñ  bpÝÆáŽ~§Ûþ¸êA ×t0NžådQ*òO*Ü€Fpr~¿Ó¢0re;\sõG¬AîÍñ° çñùç·lt1B–†Aûþ<¥MÈùUˆV$~CþxüzaïUÚËA´YhÆX•Fbn8?Ó¿úuÝ™u´Rk 9!=12³îV‘N8ç¾>\þ¿—VZá ”Ü›pðÍå‚͹AôÙq‘ô<Ç¢‘ PÐì²Qb&*µÐ« Àvý‡~;|úâ"Å:‰Ð¬hqe [î2>¹=ýŽ?¿P ¯¢êƒmPL.ÌÀ)¼Aã'òöíïòüú]¡2]&F¥Z>JeàœþßõԸȺ†³PLæ=ìèI ìsŸoÓŒu rçSÜÙÄÒ EA'>®ügó?¹üzÁ£$éd) Ǩ‰•Nÿ_~¹šBꆢR‹¸Í‚C/{3íïÔ–ÉH‚4ÝiUŽ2»Üžàwý¿öëœþI¥—ƒ¢Ò@ oHˆ+ÎN?×9ê 몆7˜ˆ+ 30eÿñÏnܧgóê]P¸´‰…¶§À1;úˆ`Gnßלã¢0ZH+€9 è4þZm‡-Á9'Žsßý÷élï\¦85¢6B4ÍŽùÇÞa‚Aö8ý?:X׈ºÚŠĩÂdûd9öü¸úõ&J[b`X€*`3ç±ãÛðÆ?Ó¢™7шº2:pÄ*¶ÑŽT`€qÉÏ·]%·„Lk\ƒðÉ¢„ûìHùuÈ\ÆÀIdlW·8ü~½º‚o`ŒŠ5 ³b¹ œà0öíôè‚2è3+mM“!$mO¼Xv9ù~gÛ¾zéjT9 Ë¶ZJ~ Ú )íøÿ¯EºfáÀHV Y…eRA<’pK|¿>ýD^ –¼äE†ë´`áxÁíÿ?×¢crÝApp• Ü„&qéÛõî?Ç¢n]I Š|uM¹$» ñóù{õp‰([3`‡$àfUùäpÞüŸoËý:êl¬´±A©r¹àþÈ?צ8ºÉ!¢VÄC†%P(' mçñ\ŒãëБ¬îŽ´û•žHÆÔ9Çl1ÏËØÿ~¹¶P=â ¨â@Xª&Ìlïúr>¾Ýº—¶H‹©¢@ÖÑ b@¨kþ|ã/õë¯0¤@.·ðâ@ÅŠp{;ûçëØc¡:)ÉZ0('$àqÎsóíøóÇR×J\4€Q© *yJÓ–çÛß?‡ëмeÈé‘9Z±¢S–&%°Þœü¿?׮̦–4™ì‚°¢ŒyÈ nü÷Ç·ôé—™K€¬m p±îT('è}_Ÿþ:âé0v]”wFX(m‹ƒŒãííÇPisÍ‚0ÄìKyD`dä|‡çÏúu,Þù¥½ä’G¾K2Ïò÷v8ãoùº–´eÀæPZ ÊcdܘÁÊç¶=‡·oøí×Rpi–ªõ€u<¥(xŽç ÎrT¯ÞùcžýÿcZ”ªšÀÕñ(PNÁ‚½;sÛ<ä}GËß9ê …Æ×(£LɳpVí?—lwý÷™Q<€%?˜Š]"$éã$c‘õã?§PH…&œï([QÔJ[wö{üùú;ô&[ÿIü‚r¨Q‡lç¿`=²}ÿÃ’Y|™vˆBAÚˆ¸<{cƒ‘ßñ‡ãÒ´>(œe¹‚-¢S”vïŸÈ|¾‡nŠt 37¢0Ó2 ½¹ÀöÇûýO=t„d´ Ü}c¹ súƒôÿŸŸG›’–™â´ .cŠA’¥—h ¾Ùüß¡ÓUÎl˜nèáL@pèáWÓêlnúÙè L-CŒ 3µ$s‘œöã¶Gâ{žˆIK2 ®±auÜ+0À p}ýÿ¡Ä$bt;¬ZuóÄ.0Gä>¿ç®x;+ '%>Ò}·Çó~˜@²ù¸ÑoÊ ¹•Aä‘»°ÀÇú~@¦M¶MíZÙ$ûÑm ‘‘ò®N6廎sÏôüºàèrQ'§åkÈq úC>xã¿Ï¨v‘ Z@6(Æ…›vÅ9#9üFy¿sÛ¡ ܦÕlA#RYAl`ãÔ ÷ÏåÔÈ)iq0Q‰UÙËI$ŽGçùt§6Ne,vVå„&€±Ã£ßv'ðê–F$˜+mN°º„ÿعÇ9=¾_¯üuÌ$Ü©#+¡½P<‰ç-’7'l{N¤¸ PKÕðÊXHåõeHöÇÞÏúÇ]b ".tƒïDY„ò8÷çžFéÇP"Èk8„/‡S†dT;qÜ“Žÿ÷Љ¢ V?<$dp[ïòü~£¦6/*Óþ¥ÀKÛ–àóÏ|û|³ýºç˜²2L­µ?¨E¹ÈÁ¸=98Çqøç¡càN醘&Ò2³Ó·8ÆqÆ1òðïùõÐHSMâè+·©#,ÜãnN;gÇŒ|ºàHÔ£iæ+BTÄœr2AÿLôz™JÒÅ S¸É,¤Fr{óDZàt€.šN‹b™·²?˜§Œ’F >ÇÛ·é‘.ÿÅiÉ ˜+ Áäà’y dŸÀþÝqvÊ)‚$Ûæ„i½dëÆÜc·=±øuÔÍ”½“ÒPDJ‰Ê($`íò^Hçö7´ÌòCHåwBXO}£9ÈØ ç¶r<õq˜Ù1‡t#ž`EuÎõ`c'¹<þÞÝh¹è…ͼ4­Ü z•HÜ@=‡¿ûõ'X*C»°}•‘Ä»TòAÉ$qŽ9Ï¿û{öèH ΨnˆÏ†õýå'¤ƒsŸnß!õ=™ŽhÃ[$è‹òÉ*ánÝ–ÁúþÁ´$fæá±«a‚¦îÙö^1Âçž—}Ó$j>~¹#Ù¼´q©$ãv6÷HÇëÓóK,‚!-zcæ á òNO'¿sì?§æ:º…R›³z¢¼† žje•ˆU=ÿÒ{qƒÏDëÌÔ›fü Rg[pXcyïÈüõéYÆ42&ßtX€¶íÛ·g'’8 };góèž`Y?¿_áÉ!c(Á¹²¼ŸËß_oà-ÉE¤¢,ÓnËÀvÈ9ãçòÇÓ®!xv¡ 81 ãh=¾˜?\~½uH$¦†aáîË>1’±ò7c€9ýüÇôêÝHh‚&9¬Ž€¬»±'9nÇ#Ÿ¯¿\éL¤î|ÐÌB4V ªŒŽМþOúI2¦«ò(B”îå»ägö=ú’àl¥Œƒ<ÖÍ3ûš0AàŸògßo¿|r}þA 9]¹Z§*6p€¿#Û¿l÷êA¹RÚÊòûÔ€Fì ÿÜžÿéԶФ=ÒKÌ Ò2Äì;wüÿ>>]0âgß$‡!ÁÚ•=ñÇ>þßÓ©$®MÂS…Û‘æI¸nýÃÎ Ïáûç¨lÞt]P\¢üVSÔÙc0HÇ·<{ñÇ×£¾âÉ6ÍÝëïÁ °ÊŠÙÂú{qòþ¿§UÌèLÂ(@F#SµŽßºsíß'þÇL-çÕ-­¶PwF,JY8Ýí‚qÇòîz[†‰Œ7ÐÚAUÈu.ÖÙùw#ëטNèÝ )‰ÿÕ"1ß‘Î?¿ô.@´ÝK)æýº--8QÁ^ùR8ÏÏ“Ûþº,Ó¢ÀC©%P[±í“ŽßAïùŽ–æ™‚œ7¬øF`ÀzIàm=Ïúgöz"àC(’ ´d¦öõ`žsß’qÿ|u .výVþÁUe;²Gñø|¹?Ó ´„A®h‚†°)ب@ç•'ÿ~Ývx&T†lkLU—–,xÉã#çŸõü:7 ” Hƒu´¦f NV@¹>Þÿ÷Ð&8ZÚ¢’–õ–\q^9Àý?^˜I&õC0óÏ` ¹Àü‰üzŽIÏ,çk® G·ï9Çâ{{~qj&z-yjAfW 'ïÏËß®kNÊXæˆ%a„“éÚê£ñÈÏ¿ëÔÀ €$@ÕjH\),Êà®Áã¿9þÝú3L ."gÕ á – æ?þ¤g·<ŒvÇãïÐR¸Ê‰àæ › ya,AqÁùŽÜòN:,À¡º1¢S¹˜mÁ$û|¿Û¥1Ðr¦ÔÒÈ´€0² qŽvûŸÇûþ>øé¯èP´Ó›_º3ÈFÚ$ òž1ÛçôöéDÞ¢#E¤wÅÖ* À䲦}#/ÐýDAˆPyå(+¤åC¾6à©ç‘ž?N¥ÐMÔÓ \£Ìwí O¾F ’=³î}û~]REôF憂Ô‹¸;6Ö“çÛŸßsÀêZÊ+›AhˆÃ‹“ƒ·îàócì1Ô°DÁ„§¼žñ>Id´æF!T(vaÁÆ{àœ^´š`,Š¢O(”JÉ´S¹ñŽÀòÇ~Ýt‚L¦6™lnƒð²#ºâF^pØÙŸ—ÏŸíЈÛdY ˽û(£ € c€G×åïú—\ãd§ÌÀÕÂ6†¡uycùÄ•–M¬¬v–­[z>äÈ%x# ý}½ñøtP€¢Ht”%÷6Öp„–%Ní¿™÷ú~½ "é`ãËkLC) ¬¸ö< ŽÙÿN:fNèÙ­îÚÌJ«“ÁÇ<{w?ïØt-d £x—CF¨ÁFP5L¬,8ÈÏnz^kÈE´w„•£]Ûƒ[8íßĈ0Ì¡uFÕmbH@rN0>¤§R7+ƒŒˆb—Ö‘…§*pFIäíùçž„D¤]™¢Ù‰”«yM ¼n?— wÇ]Ù¢sÎi"-0ôã–'#ÔsœçŒwù~G¨ Âæµ ÈF´äRSr€o¿Ë>ÝHÑKÍÑ`¦bT(ÁÛ“ƒÊœcûOŸ]!Y(&š0§lLAÚsþÿ¾ýDΫ²´~ÐçŒ œçsÀã??ïôè\Ø! É…³Nô€¤Qîœ|¿Cÿ@˜“tf †­2¦LŒ ?—¿oë×Dk¢&Á)ÀÀeoºH01ôúóý:‰ïlšÆÚPM8UbѪ‘÷€þ§ñÀè€Ãr„iKdÀÇ!²Nxê7¶¨ýÈ&M£ËfPpPvŒüÇãé Bê @ÙlR©ÀU ä—ÜÛ÷Þ w*Z/`‡Œn1žÃëÏPZOª§8ÜÊpNyçðúc¨-&Á7ÙÊ`û™7Ý$~g¿~§\@‹%É&赃 6ùlwgwïÎ;sõútÇ @ÁBòwŒ†Žxão—lsÐ9‡Q¢ é V‚6ÚP’¸>ùúíÁêK,W1Ã’–ŘŒgÿ®~§ñÇ'©¦v—ꊖœŒ¾Íòž<{û“×0ÎöHx11(F6vBÊ$cƒŽ2;nz ,œIq¸™AhlBŒ‘¼°ôž9ç÷ÏB/tNkAËóAxÕA ÃŒÿöäqÀü¿ï§5„Á@ç+F4R2ïÏÞçGl—>Üô fáCÜÙƒº §Pp°£sxÈ>à÷×£“T5€#›Õ6¨>–'>Ä¿Ôt ¦î§¾´º\!À¬vÊJö$çßœrIÀý:æ’4ì¶èùlü°Ûs'ö?¨ë›ÇT/.’Fˆ%%~æðç°ïßéïõç¨37DMÅ¿ª„`0W`Xí 0@Ïn=»óùsÏBðI€¡ õF¥;Hùg<œcïùþ]˜åS{>ü¶ö•­›Æñ– …$/¶0íž}»wùõù9Â&¢8Œ{¨9çŽùÿQûÏM¢Ë‘ª©ˆ¨$8Y>´ drÑù„wÜ228Æ=¸9úöêÙ›ÚI9ÄþQrBQ£b«“‚ã ýnýóÔÄjH– špR¬F02s»åޏ Âkjr < K ­ÛhcOÏßþú’9%Š’r”§mŽ€niQóÁù—ïðk*[X5°´°ù˜@‘È1†ÉäóÛüó÷è H™Ú‡:z#VÃÑ’ÈàŽ>÷‡@GTæTæ.=Ê Ó’C,BFÎ0xÓ÷õë-SD‡ ¬ZbòÂãœûç€sòÆ:’ѪT ’‘Àòm#ÔÇ$ŒdŽ{¯ïŽÀh4FÊ¤Ž¨"Ÿ«c IQÉú—áïÑ»˜KÁè4Ìp¢&—ñîãöèA´®7î‹­ŠyA<gðïúôv:©qx†·E¿‡pðyóïÁ÷?ñÐÇ%ÎyÝÓàeîÝŽ2G>ßëÔ´ÉÊË :×ùhb‘|Ì‚ûyÀ#þý¹ê "L’†hý@P~yåN·óè ²“¼!IJá˜a×=”äöÞùúu Ȳ‡YÒMÖ ouR?ÍœûÇÛŸÇ®.‰%sñ •Xyd•<ã'ÜŽAúwçðë"êÞ·$$§ÉHÈàòp1ŽÞÿ×ó@]ªIÊm"Âg'<“ϹüÇFX6J§PÄÖ|:HI S’r=_¼~J¾éÙÁ26ùÊ0S>$±àœgüÏCž ‘8˜ê‚”¨ç*@ãhÀ€ÇáÔ‚e^Л!K”Þ0CdäcŽ{|¿§B̧^ai”¡^çÏÓåžßLtbåvf‹J§pC.;äö9<þ= ø¨¨ó‹ŽJlÁço¿±=À˜QF§û±º‚­é'ÐH9ücòë¢ìÄ‹ùz­%8 2ù‰Ç§9?ïøt¤&5À‰µ>Ib¼nÃp½½ûÇï=M4º&‰¸: šl¨$e†pHÎ}¿^ÿ‡A˜ê‰}Ý à~y A‚¸ Þ3×XhU.2 Eˆ mBª¤)gÇ>ß^Š÷]ÛÝ#e¡NpYö/åã'åúþøëƒ À r÷nl‹jPŠÅÚ6ôvžç¯sÑr@m9ˆ(k‰W {àsïŒ|ûþž2›$¢&uä Wߘä~úao2‚NÚ£Ì%w +Àœ{ñôã¥5 Ïy=д°“'Vä÷Ç÷ÏP×@vÂfVŒ apÙ÷?L`|û{ã=º¡EV2$Ú\-ÜvÀü??Ðu$’$.σÏÉmUx_,"àœëžÿ·áÔ–Eܧõ`!»«ÄÊT…ƒÈö?.ß>…ð Ñ'S êÏ!‚o] !ÁñÏ>çôùüº‰%Ó‘Þ›r[’ps±Wq‚G¹÷=³Ñ±Äu*®(5͇X'öœ,3`wç<ûqÿ÷cß«@€5YÀæ“%ƒÌÔ† î¸Øü³øgçÔ‡ T;1D¼#8EØ0YwžÞÜvÎ?_§P•Q ée“R€BœF6ƒ·?—¿oŸoèkí*j´gÕéÊ–qïÜŒã‡ï=v`Eѹ™vþ–fî ¸ãžËž¤B‡Äx#>!,òN2F2~dñô<|ºVoü“€oÿóCJ\+›˜ä€ãÏËþ_Ó¡uÌ„àGŠÛRîv „•8=ØöýñÔö–ê£/zæËf˜¶Ñ±Kœö‘ž@èZO’ç,„iÐàÞ8þ‡Û÷êEBlW5±BøFf%SՎݱôÇï¿]"$©kµ…†%Š3ùgiFïø|úàN‡T.ª5-­2“æÉ ƒ’ vÀÜ3òèZAý¨â&ð€ -†ÎFy<7öýç©€¥¤—_ÙC4¨®xË'ÔÜŸ~ç÷øõ%ä¡`­šV$n@°Æîý¿Û¡Óªce×6E˜­ˆ }¹íÛߦ›X¶;r,†`W íŒñéŸËçÒ{»§›BѧfV,<¯ØãñçŸ\%ÇvM‘&•·«yDòç¿Ë}ˆK Z4Ê|¶Il}Ž;ŸøèCÉ”E$F… ©ž<¥8ã†ì{þŸÓ®·(òÛº-œ†!Sxc•$ç?Ó“ùuÏÝC{/¢Ñ¦ö²£7$äwýû\DMVšÈNÕ<çŒvíôýüúæ[u.=د‡*䃜)ïž}¾¼þ½yBÆ–‹-ÉÅ,ˆ]Î7T{öþØêdÄØ¨wq¹†ÓïÍ©7”[2ðË‚yà~ñ×1ãš7´Hv±¢/É‘„÷™A9p3ØvÉçô8-²H. ‘¨BòF%÷ûóØqž=×ëÒMIžJÃv(+ ˰+9P~àÇ×~º\ ‰}V–Œg€Œq€HwãœsÏBçí*À$…¦§b9 ­œ ǰÇ?¯×?§LiMÎÈ+J¥H ±6ã§¹äÿ_ŸëÔI½ÑSc rGŠvgÎB÷8#8ûwÏï= LYÄÉ KLçhä°88ä©ã··o÷ÇPòµîw@šþ…•¾éãð<óóíÓ¨¾ULk §—ÉIŒ ÎùNüŒpNsÿVH,Ö´’G½Ñm¶èIÆFJ õ`ð: ÝKœÓÝ ·•Þ¤œŽ\öÎN?O¯BÂA Ïppµ¥áIA¹wr02AÆ2zœ×„ѹ|ÖÞ"Uh†[¿$ò{矨è1'šgê"¸B1"•ô¸„dvÉÝþ|û|ºq'.©¦³EŽ—Z£q H™Ï¸ù·oŸý x(ZÀLqÍÈ‘›*F6©É?ßòê,è Ž{šÜÇDN™4¬S¾äüËçú~7¤j€µ²ˆå¥VÜFÑÏ`¶Û .ÉÑiB1&Õ ž¬œ;ØõÅ„èW6³lÍ4j3/¥GÎCþÜo¯BÔ.h´6¥v—IÀòïûu ÅÒß3"Òœ ¨%—o ¯=¾GßÓ¦9¶dœ.Ðl†i"ÎÖEÁobyöÇר‡lŠ¡lÝJpÛßÈçžãŒíýz˜¶è‹Á2=ì†ôh¨æD 2NHàóÛúûvÈ= .&Êk5 I f”‡cŒc¾}<‚}ÿß ÕDÉYð±°*"ãˆÀàû{Ž1¢®ËmK…'b ‘‚p1ûþC@•5ˆæ‚)’5f 3d½Œ ûý8<ûuÄ^4\QŸ ¹öò02 Çlgô?×å×H!1ÛÊ)`ln ¸‘“ß|uÎÊ,–Ú‡P°SîuÊäàsÎqùwþ£¥‘º"A1 1nÞ2 Éî>¿N‰Ä¨J٤ˆŠäpH'ó=j˜èÔ-­eˆ1ñÀ#Œã9öî:âñ¢á¯T¦8TmùìÃvãéß©h¥Äk¼¢þ À¼ŒgéûùômPµðذ†bØÛžG|þþŸŸPA(CÁtŽHMO÷6Š}óïŒóôébÂJt@ B6ðwnÎÜœwàu$sD,7 ~A;ÎDú¯üû:e$ åÒªzQ]$~£ôþÝKÎct-cFˆ©i²lcïz‡lqÔÒu¬}êÍÜ µ>ýà68ÚsÇáúôY†É f(MN0¾ùìÄý>–ç ’ÙH„P¥Îþ]Îw#‘ŒöÛ÷ïѸì–Àæ€ôêæ@T²ŽG¿·Ðþ=I P#B„ИÝÈr0yn}½ýÇã¥[mÊsÝÖE¼nXÆ"LB¶ÖØÝá—Ö“Èä[ñ?צIÙ*2uCZc"žW#ž~Ÿß¡/ ®É˜k¢1hø`# ‚'óúõÓ&JkiAZRà¨ìvàñó}SûD¤±Ò=ù£þ“¸G;C`wÆ3ô?¾zÍä·ájJBψ™Øî{{`|ýºcHèjM®¢•”’¡vðÃ'9ùôº— ®·»£> õl•€Àï“ò.Ü}zNq©Np îP»ÂžîsõÀùñÓ³¢I~h_Ä0;sŒtcý?¨è3„A¦LköBøbû”#ûØîï‘к‚M§ð²J\î_¼Ç‘Ãëǯ\Æ9%Ôx¢Ï…-’{žÄÀãÛý:<ÁC›ß½|;(*ÊËÁöʨÿ_Ǩ4ÁÓD-«Ê(Ó£`ŽÃ°nùú~NB5Q®0?´!LPqçi o»øŽ:‰Í²caº”†P\„Ýé%N{¿¿DFÅs@•gÃerV0½Ç¨qÛòé$w‘ JЦ>ÙÈôð¸úôº, IÙ6”'¥0mËÏpHÎÓ‘Ðoœ²ˆ4Œ˜¨ävÀ ÿØŒ{ãýzu7bFíêƒðX‰#^;¨ÿ§÷èZé°RæZJƦfŒ²¦æ cƒØöýF>½sH˜‹ˆl„O”ßöb2Oãý?O¯@Hƒºap V¾å›y%vç“ÛçøõuD"º/áÎR6##?€ï÷êbòÛP“+3pG£çñùqϹýz 90:.4 b‘½>˜ËÀÁÿƒÛåôéeÖM Ø"|ƒhøVæ÷ãçý:75ªES+ 1vâbç®·¿ïve,9„îŠø]áÐG±†Ñ¸œä×çÏnˆ¸¼¥f¦žk Û\rxäð;cæ?_ëЗC“ §TSÓ¨o1ÂóÉ*;–~™ýB'.è×t[Ryj­±$À¾FsýþŸïÓP8Bê´òßP´!d¼m‘ßÛŒýqùô%² aq©F«F™ÃaÀe!”'æúüúç8j6Pà能–%# 0Ø# Ùàö8úgߣ훥†C£¦Ìa˜Žûy#Ÿö=þƒ¥¹æâ鱤 Õ-‡ËP«A?ôüñÔ¢è 7DÕ i¹8'!±õüO㎢êAßß²´(C ’nîýp·¿éÑBÀàHù'§Ý’êÊÛ¹úñÆ?뎇2€ÙÕbÓeÞŒl§ {äÇŸ×å×F‰­ÄNžÊ×ÂR‚á{gêK u@þ»!|6âdÚHÆC`“Ÿ—â=ºäl :_Á•}ªƒhä–2{ÿ_§4,7@¶Ô™€EPq¸ß<߀êÉQdÉÛòƒ-(t$Æw8ãhúÓúõÔÞd„5D ­9eT$û÷ùÿ¿Pã¹Ml,„i<'Œ«r¼ûc÷ý:‰¨2-D5i2C#“ûüsÏMk¥,´=ÊßÂs°‰ ä†ùp{‘èýÂcµƒïŸå`¥ÉÈÈÀ'Æ^Ý Ÿ©  Èp‹³ }Î}°@Î;ñý:<ÂK§2‚Ôn츉‹dc·üŽ 87DPç¡´V@Û°Ýóü{c )Ó€Ô¥ÓrúHã??Ã>ý HuýÿHÝš`])XäŒ<œ ϶;ñ޹ù@€¡Ä­ü2RA€Ä cøç®¦S‘mV—iv·ä·ŸÇõýóÔ¹Ò¦œ!)C°ÚÅdqõÇDmE6Iº¢\‘O¤óÛ°žOB^ HLåE|&@9sßåÇìtyâð•”èV "†#êg|‚s÷qØþ<ô¶œÓ!1Ò¢›r…òÀ^F n$|þgÛ÷ž¼ ¢"Þù¡rȹÃØÇâGÿ~…ºIÔ.¨ãŸ(Ñ:VSQƒ1+œù`ž†£¯3dMaº-é•Q#x·àªNïÎOåÏn:u0㡉IxËgL´­— ÞR±}œãûc·D#0HªÒâA )‡Ãƒ&Y"ãœaœ÷& ,ü.§ò´Ô9Q¶=Á žOëßߣkäê…Ô„æÛð°S È©½rvïnüò?_éЗnJs]†êy£þw`w¾JŒ w<öÿ~Ýût²ðÑË\I;òXÔ~§l{s‘À9ϧï¿P*l„´‚HYð¬%›`É8öÿ‘×kFæÞÊÚR²å‘‚¨€ßwŸ—·D\"éìABå1Îüœ«œœr;Ÿ¡ùýz‚Ù¿$ ¨½ÐÅ#‚=*’­ÛŽxöãòùõ2ˆL›‘tlt¤H2dÀ>Øãœ}?¿Kq´#¢/:û”6¤lùjÏ8ñÇé×&P=Ù†]Ö—,Q‘6gÇoßýõÂF¨Ødå:!0J @ì@ÜN'éúöè·ST뺢ۄUU }ϸ1Ñ5àÉ(LŽèßð…ð¥•w&ù'ú¿1Ï\Ì®"[¥ÐÚšAè 0Hœ–~,DNèêæ&›­š ” G#°Ïï¿R×’P¹¶%i•6 dS€Y°éÔÀ›î Iˆ BŒá¶*–ì8ïßß÷íÑK ;!ü&$Á'ØTþ>Üwçé×fµ”A¿²…3: î8Æïö:[y2ˆ%¶A4m…‚ÈÁà|ÿÑfE1+FšBÃ%·–Áq“Û©Qf•ÁóT€Ä ¡ü~Ÿ¾z’’†ó˜k瘝q&ì6x^1È9ü:ríq…#9#<ü†1ýsйÁ3" ¤ þ—,ä{g9Çü~_ßšíS\Ûj´)2#VOH]§~„˜GMÒ$£®T‚¥¶r{õ©Ý@D-1v€¹ôãê8õ Ý6BСà1 cƒ‚{~þpª£!%ô²kHÇ8Ï9?¾Ý#d¸ÝéYÙ6ºpÙÁÈ÷Ïê:âà0o èŠjWpø,¼Œ€>ðÎ}ÇïéÑg„.—  ùA;Î Ûíï߃ÿ}HƒrˆTžè@jY7Gž;pœvö=º‚ë"va:-5/;Ö90psÀã¹÷ùà~wTNƒp%hZ¦PÃLe'¹ã‡î?¯@ÜSA2Q7\Û RsFV58Ž ííÇêN¬5÷•^2ŧÞ΋(eÁ'°Çôþÿ/ÕDÄ °Éy0V–ídA¸gkmÀÁý0;öê]RJX`‹DÔªìçÊ{}ãßéýz³‡&ÁÆÊ–(Ø5ü©‰…I_B.yô®Hç8¿ž}ºcB©ÜOçu†3"„É,$žøööýžÏ'DA¶€m}>«$¥YS9RAÀ'‚qÏnˆ;(% GH¾Í*¡ ì;»/Ëê1ø^‚ç½R÷€r“a¯ò´ÔeTäl@Ïn{ßÛñüz ñ¢ ™€º0Ò2 8Ž% /áóèA›nœàbâÞþˆä¤]û•U9 ÷Ï×9ÏqŸÇ¥¹Óbˆt¶ß_z--–lžç'ŒdgàãÄP¤†ÛÊœ÷Î{äs×9ÄþåÌhå MJ,`cÜãÛ·÷ãëÐ7’5<Ö… Áb mÉ<‘ø{öù~½ºâ貌·“¢ÔtŠFG¬ƒÏ9ç¿?×úu.q›£§¤ ü¬aNì䟟ïéס 3e†Þ±!YywútÛ'd&ëMDŒ‘¼g#Ǩ݃d[[‹Ç£%¶ƒƒŽÿ¯Yü:auõBúp ˆ”KÑÌw. ïœ{ã=øýý9µ#T6 >´à[Œ—¾Çn ¾ha$‚n”Çb©š"‚œ®s“ŽÿŸ~«;ÆÙ>ž îºi‰Ã†Ù$kµOùö?ÓözÍ©ÄÛµ)ð×jTÞÙjE¦tZR# ¹ ßÜ¡ëÏׯÙ3e»‡ÂƒOE¬Ó52ÔȰ>ó&ÿì;{ŽÝÿ¯^Ž—`NËÏÔáq&/*7-²X¤ÝåÊóÎG·÷ý:Ôf%„L¬Ú¸W‡Xj°Új€ÐL„’$r=½úá‰dØ 8z±pˆþ+ˆTœœÜ~^ßtþHÆ4 %ü{Üì ]J¾I+ÈCI TwŒþþ¿N­3Ñ %dš.s‹£ÁbÒ䆋f[“œù?ŽÜ~=¬f”¬ ûÕÒ±rÒar{cnÜ÷ùý>Ÿ.šj7-½”9]ž_¿¤#òØîG||Ǿã¨{Æêi´E+(…ä»+þcõîsÀëœFŠãkedtÁ(î9*Tœp>]CÞIï.¤è¸(Õ¦}¨Ub ÷Ç=¸üûúè Ûnš‰Ž…IûÜœ(¿o˜<~xèùÐY60Ñs>á(‘°(ãŒgޝëÔ“$(e¿)BÓ<$‡oÀSø‘út¬‹Ü-ü)ô *Œ±'ßû{öê\ä¶khŒ0`°!ïÀ'#_aýÏPâ‹5 „1M–©†Þ@ýÞE‚›enÈmJxÀäÇp í‘útMu’Ý>ˆKHÁ†7ì#Œr{ÿ^…ÄE“CNú#” Å”g¹À>ßçÔ !Ì X´¤eÆÞyÏöÿN>]q$ì…£eIÜ nF~‰öü:ìå ióYðL¥w™wpòÜqùžØêK¹1'T%¥ÚDŠ79àóì{“ès¶*ZØ‚-æ‰=ùvÏÓ©~—FÀPþíÀBÛO9^ØßCš £v‚b‘†ÜªÅÆN8ù÷ýüº’EÒØ‚l³àÔÆÀ)„ni2MK¹I(£Õž;7ïñÔLn¸¡BÅ\ŽIƒÜuҦ딱S°8îÛߥ¸ &ßÅ) 2ÞÜ(ç·õè*>Ó)‰)öÝcJ†Œl'ˆÀ^ýÏX˜¼qh±[¸|qˆ²°l¶xâqá\6Òoÿ/¯~;õ丅bD×§áôrÀ£õ-³$av;~|ßMášÓt¾/Iî^öÏ1ZB±ì02üÿ·^¨V’!y¾Ä%3Ï |Ù°pÄ~§çîzÓ£1uŸQÓ2kR™ 3O¿=øýý:°*DPÁ¹×ùDÿ +¸’ªFåàv}óÏõê;p‰´ˆ¼óù££·0*û2݉ ÁÁÉã‡éÕzµÁ¬Ó Iݺƒ{ï}…ÔîíßéÖ.2¶Qmà¨{ÅYtv¸R4“ËRN+Ãqò>ýxúØ—@+ÓP ”¹)èiD¬ï ˜TP0ÀØ|ºQ/s„”Õº (ôOÒù úPF>œý}¾]iTc˜ÜÊ•:{à#M[Q›ÍXˆ“8Èc߯סN±ÔÏÐÒi¸Hâ´C+˜VŠ9ÝAÆÜŸíÑÔÆ ”štZëB}š¢åjdÞ¿t•8ÙþP<%Zÿ†kˆ$*œEµŽøÂwÎcŸßëôëé•)8“ æ-¯­"ÚÊè>¬ã?ž{ui<”ºfX!hÑ©äcŒåòÿ¯Ç«ì« i4ë©Eü'–àíËöàw?¿ß·VØéTÞ ÀX´ŽI쬤Cc-òíß¿×è³€4@IðAø>ñù`‚vNIç=ûñz’à&6÷ºP”ÞYÜNI9?ëòïÔ9À,ž;·&è䣨22#ït·¦°ß´…ƒŒƒßpŒqþŸ×¨2Q¹Í8RJH ay<};þ¯RH !ÄÚÈÁÔƒ;r01íû8üz/eÎqåe‹J‚•P }sùû}zâé0W²P)hö&‚÷ÿ|ûdôóFðF‹#¤\4ª®T’¿_¯Ïëóé…ód l`£V*î=-ÎÑÎIï—B ¹¹G=ÿ8ÈÎÜÇÓçÇÓ¨”EƒtG½ƒ'± –ÿg®e§rPÅ«ÝyÈð=Áúô%Ò¤:¡ Gl§g`§åŸ—×ç×J€ ºÃFq´(Œ©ñÔ“º€>_•¡EÁrBò ÎF ùlþûõéŒnáÒwwg棷·÷@u×H@ø]ÞcSÀù`ÜuÒ„ $‚ƒð\±Ù…Àã~Ÿ¿ŸPE”ÜóXô¬ümUaÇ$vìùu …Îì„Ô[·o ·<ïøô9åsi¸ˆrÁÇ 3Êã¸úñÐfN3²)©#~‡ Éü3øõ2£,Øl„ÔÄù˜à}»ïÿ=,;ž¨ƒw(&gpMÛxÆO?Ÿ\;¢&/Ť®rx$dzíûü>½%îÔ&Sf€j!§§‰Gœ ±É?!ßïÇ׬ÚqÑjaÀ…8´, TP»WÛºžqøuåqÙÄî½6í,²I¾xêÜ–c¿Œöç¿ýtu)1-•œÂ}¸È&HÄj ?×#éÖf¡’JÔªç8ˆÞ)>ˆ0¥Fí£ßç× áõ®JóüBžWѪ‡UP‚‚sϨúÔõ¿N¬¬j´ˆ‹HHM.]– ÉàŽ ïúöþ½5΀”Ñ.$#éíEßù‘£6òGáûïÕLF$ÝVð´ ÷‚‘ÍDŸ *ª¦N0ÉÆ?®:Å£‰‚elT¥`RŠ;tJrÁWËö“Õ<^ “2®ah€Û©,”èÑ,ghÕ···ûõ•Hâai<‚ÐÙH+(Å"È`•Aù†û§ƒŸßÓ«xz™îB¯ˆfK4ÝC!ìBGÈíÈüqóúüúc]•EÜÒ5Rño!UYU€ÈošüˆÇnÿ¼õŠkä+Q´ËÈFQZ~ˆå;Óºûî?3Òqx¬ÂB:XrËBœĨ# ¤‹Œ¹ç/ìAS!’´.ÓP¹gÈ îBÀàr[ýzûÿh ü—ÂÜ\ ….è†Sž çþ>½ \6*\ÞìÂÓS‚61Ù¾½8T ¹J2éµÑ‚…I ¬mÎsœdãŽOáß$ÌNˆ{â딆PcË ãß¿·áò?^¬‡H•YÅÚnQ‘ѱíãŒ`sÛØuÎreF¥lÑŒ+1#ûnŒ<èšq²ÐÁ—#ÒTsÈïÇúcþ:ç>D"¥Ku±JFÜ)SŒ¨žç#=þ]B{ÂÈáJ®9BSîà|±þ˜ê3S\AFŠW@l\ž1×¶;óЃ²"îí´B4ŠœžOŸ—N`¢«fÈß„*V6Q#s[¹ù^€¸j¸¼£¾ ·ÞvÉà{g¨h²Ø£ó.3Ï·Pç Ï?´#ÚoÃ(<_Ã=s]ÉxÌ´´{€‹ß-Ço§ë×g¼(·ð!‡Ü<?n}ñÔ Š ZmÁE‚€ª8÷ë»EÀ‘rð!víPOan~½iº4LtX¢8CµI ç·Pj]DæêŒøºpXŒŽÃä>œã¨Ì¿‚×ÁÌBÙÀô㟮:— ‰#E¡J9$þx¥š·DJ¤00A\þ]vy²àHAd½·Ïoqî?§Ó¨Î‹ƒ÷(b˜ä•”Œ{ò}½ÿ|t“CÿØ"M$ Ž5gbÀ(¢ÍíÇ¿·o~ ÖIö9¡‡¸Ã}þQÑYkê’žjZ)eŠW1Äéê8RÅ󽂫£-€ÇŸ‹x]#’®&˜=^ÞqÏ–õ†x‹ûôè<þ'—‚±Ü‰ukmÇÌ îÀÓ¾Ubxì †?!ÉÇ~™[`©³;ë°7b^Ø3çùJ¡ÁqovQIÄÿñ3o$T–ùÑ÷=<ª‹Á;2£œ}áÆ8<ûõb—ÃÔsi¶£Kœ$á$n@™ nvCW‡â)‚÷Sph±0`±:ODO”S{)òçö:yfÉ®å-§¨š& „_n1ÉÈý~]Q¯„k„•vŽ1íJ«õ%²Ën¬¸]ò¢…åeAv ܨïî£=†á“Ï^/Žc™ƒhuCmÔ¯[Â0îÄ‚4ÔòN¶+ªUYª¯×:#k¡ÂcŒ¹–SÊ^pƒ]r–|9P7¾UÅ?È l”"57ñ·•—Ñð 5¬¨I>Ÿ“ÕÖÖó3ÉOK0¦Üv?}‡qN{“ée` ²žàäuè>øöž.¿éj@|OCü®°~$øEôYÛ²í˜ð• ŠÜ*©¾6ˆ­U6ç¡;À+!CÈÈûÀŽ~‡‘Ï_BÁ|Yƒ­TáÙP‚llm¬N¾KÆc~ÅP¦+=Ó}~©ÖìH¬¨p@<ó‚$~G¯BÜh…Žü,:…=¢Sœ®Tpÿ_ÃòüzƩŘá,3æµhð׋8G+)]¾ÐÂRYÓºñÎï©öëÏb¸¤>[ªßÂðñ“¼ž©í1¬%‡—œ€FHúç÷Û¬óÄžJ¼ÌkrÍ’G³HņÖ+œœ§?ŸOLDªÿñî&2kDM”q´ß8öþ½"sH\üË"¤µIÉ*@åðO¿§NÄãšár®Ì3„@Rjk]cŸ]!Œàü»u…ˆâô•©‡Ã;q B¶I‰Y{sè9ãëÈõ›ÿ$ßÚ®»N¥OLðÊ|æ.[¾@ãÜ~ŸÓ¥×~vÙ Zöº[ªæ¶¦ ¨ÙÁÏËŸûúu÷=bu_Ű#Þè/J\3@<ŽpyöÏëÕÑP€nNˆ¿'j®âÅÎNo|þ&­c†RÁG¥6dÜ»·qƒßŸ¯Ë¢ÂÕÃâiŒÍÕ*4®ŒíîyàóŸöëi°?jìòHû¬Z@N1 Áõ3ƒŸöèË·EMĘÝð¹[DïÆâ w<žÿ˜Çãôêø¼£q'ºB¥ ©µˆÎÉ=ÿӮ΢¡Ë`„(؆—QÀÊÿ—õê;Aº[A3%)BÇ,rü{žßˆ÷íÐöÁXk'yBø2WÆ1»äG¶Göê{MÂKþhŤÂT*݈=×·ïòè niÎk€€þA8Ü=±ŒdóœÿSúõ€Ñ½Š6:±… }òsŸ =-Õ¤Ù0S²8RÇ<çŒÇÓ¨5y¢&èKBÈ# ÿ!úuݰ+ƒÕa¡*¹Ço±ž~½Gh«œÀŠßÀ〈 2G'æ0zÔj»³"$w ͹H Nú~sj@M jP>‚¨Ï—òç¤U/³µ¬‚)@ ”pÇó×¼—̳D]‹®GrHúñÔvÖ„]‘7@4€9c´¶A Ãßýøê [.€ ×Áã<¾=°x ªtL,"NÈ2S$hÒKˆÑT–l€^I? = «@“²–P'mS›i«É]7WœÖ7K]ÚçIk§©µZ&¸"™ª<†˜ˆ† P>ó1È1yn¬7x.%þPàø|)Ä·Ê$48f;‹É¸áßãž)_(:“˜4ÌZr޲,oÈ«*õàn¤°%Lõ×}&mÑÒTŠ·U Ù+"#yãü޼GÿØöM*u ùCGÎH^§ÿáž Ê™jT`o>÷Òú.oñvž“Miª¸êuœúú–ùµMD5 O¾ÑHŸ$¡•L¾fÚX\;ˆ¢xËË”ÿ=âÿäŽ!ÅjöE QqË^N°N§©6ÖÐ½ß ø/Ãiçaš¢ùŽ±Ì @ õ\ãuÖÞ.è{öŸñ>1wZkªK¨hôÍ©‚áojjxÔÜ)ÙLi,ñÔÔÈ͹š(Ì+»z¾ÿ3K†ÅæÁ4wš@$s’Loˆëuéjâ*aãL‚&:[æd©–‡ûF^õ÷Šz’ÓjŠŽ¦ºù*ÇmÓöêj›½JÉ炵©5%yRM;Hˆ§§Ž” i’¿øfž*ûnI6ÐF»ÀŽfewã.ÄVÉ?»N“Ìxj~JFž"ëm¢uåÛRè ÝK®.šŒi‹už)íôßÀ¼Ò„gfÒIW`a‰Y ²¢º¿á,Ü?£‹ ë¦Â]¬Í!ã¤HéiKø§‡~£†ÔÂÔýÏt‰e§Î>eMô•^±¾iëåâ«GÛ*­ðXá¼íµI$µT•’NSøl›ûÉ jË! È ž•o¸Àÿ–±4øËª¸—ÐyË›4g6Ú“s:ƒAKþ7Ã?‡6“mVß0$ê{€-­¢U­5×zRÓ¢õ•ƒÐè}J‰mò_7K(Už(PWtjY_ΆHâØ ‰ãRÿ^·þ]5+T¥†ÊCظ›`؉ê°pŸã:l¦×V.’y€"mh&Nª-â·<\£ð«L]îöÍ?5â ]}}=2<”³‘,””/;2ÔNÔÒHUwþItFWN¼>?âÜUzò8àðÞèc1ÐÀ¸¹¹^³ðö[ô¸k0›opz ]½£–¦¾ë}  ³Þô^¬½%í$YÄpG?Æy²ÀGUáE1ºœÇäyŸ&—4dtæh(×Îþ«Üöm#ºl)_ÚRié¼×Rè÷¹ÏsžKx¢hËn“̨‰f…€ñÌË+Gì_{p‡iøwÑeJ®€Ù3à LmÏ¢î$Âì;©´I1o1?%·è«¾ðëHZmënšx­ A_Å$1FøÇÅG‚CÉS+†cÀ+‚¡ˆ*Äñ÷:³ë6FgHÛ嵡:Ž­`¦á ¿½Õ5®îTpÝ«ô-æóm«H"†šËTŠŒHÌ –;}r‘€§ÕÏ¿Àq¬K°lK I<ô÷¢òuð%å­ÎÖÃÞ–]'j±Ál±G¥ë|»uTcϤd—&†w‰<Åfà¼g³p nÀËÃqÕS·¦â'•¥hc0íx,xQø/¾eBü%ê†h¾ž%Ûi* &f ƒ“ÁÏ}Þ½›8ÕwÄ“Éy÷púm&REôTYíÕ¥d’H¥rˆC¶{“ìG<ø='þj qlî˜xu2ÐaIᨆ¢œ ßÊó° à ùƒùÔ·×$5§T·ðºbIá8[,5µÏ˜¾ŒÛ»Žÿ\~\g­Zv«lã ¬úÜ>™° Ç‚ËMCˆÑAÆIÇ?¯éÒªqTt’šÌ;X<@V å.÷ç‡Bê“pPa ã ‚0Àþùdöè©uÕ ¢²iU„hÄÄã­J5rU Œ.7\شŘƊ r??éÎ:ý@ľˆh|–ìQf©ÚÊG#Œ~¯ôúuaï-UéD‰h”$NP8?/ôïÿ]-ÕDÂaÏèŒH#f J·8çéÿ=+ã*Æ @NKaN;Gv'ãõ=k~«(™Y_§.t ÐÄ”³3väéôU½ÕÖpâS4`UN1Ž>éùý:S1¡Ä'» Ä1DѨvà‚;ÇåÛ«”qÚUôïªP´\ÆU2ß>Øöé⤪N€[øé׸@H#Óþz=1„%¤TG>ùú‰Ï:!k$f‹£> Ê í€GõüúY5 ‚•£;•€Ï9çý>}sº8¼¡ 7ÙaÆ@·søô!ÊK­t` `p nÆq“ï×óQ—’Â# ÁÏ'àóŸ©ÇAt¨ !š%Úwר|ú€û¨Å¹pqƒóüzâå"¤BP®¶“òöÉ÷ü¾q~Èç¢À*íQ´n9=wh…§b±¨P…Êœ—ŽÿïÔf*ZæîEúTœîüº’ôÌ͘Ù(HblüûœÔgB؉+I°Œ*#Œäûý?>¡ÎBÇvU‡‰³Þ.&Ãá&ˆ£7¯uŒ¦ÙEF8økyu޾¾gÆÈ Š)L{߃$¨â¥O‰øçâZ|;R¡0è s’-o]¾ø'€»ŽdŽãLŸ+ÇšôÏJJöI{Ñâ +¾™­§¤®â–J†ê²ÍQcÏy¦{´õÕñCK ¦*$[ZMTFÉüˆ@bJF ìð? .&¶%íÿ¨3(—km>3¯5ƒˆã‚µPkŽré›.bý9 Ñÿ³'€š#ÁÛÞ šñ5ÃRke­žj{ÍU"¬ÔÀÊ|´¥¥•—RÈ j7:™0UIÇ̾&øŠ¾;)Ö@G–¦Öá{ÂéáÁçYß§ö¯=;_^ï¡ôÖ¢®J:«¤–{²E õ´Õ5Òfi"b>ù‹+)8F*]×aU/ {Û}õä4 I¬†ž‰/‹†ã¢ôF‡Ò±‹•â÷WS§oS®c%-$4¿:<ª…÷RM¸«È¡^$€» Zž™Î{ì SÝUÌEÆäö÷äš^æ+èž’H©+L”³WËÀâi™“&8‰UP”u\(`i”œtÑPÌf7TÆšÿÿžPß®³Y®V顦¦ §–ß¶GjX¤Ú± vháÞ2ì‚­µ^¶v»Ù´F·æ±ÝO%R÷™ ʺêúÚ ¤µ±Ü­“×GCm†1 Eæ´qyÉ’IÄlŰIÁà‹˜*!¡­å>üÒq•]%ê#¨â ¬Ôu5PT#Ø« tª†9p”ó£FÃ!T6ÆENà]³ÆÚap¦ Ü}is{BÒ£LY.J8cµK-¾…d†M¡ŠddÇ<üÆ}[G˪š™]¾Å[¢À[eÐÖ›LûM¾œ4þTP*Ÿ0劃Vy'¹ÏÏ=YiÅP‡Ÿ7ÓҧÃF ,vóÏsïòé´1K'D©T‘ŠÔ#˜ÊÉǧӫ”± Uj¬q ¶J}Ù‘[ƒŸ~3Õ‰nʹ¦o)+ˆ˜®ì†ç 9Ýõ¾ÿ>®R¨á`“Q ãªÊzZiŸ ·Æ{(ü?>†®!ÂÅ)­k®¹–xHÁ•"ocÛ=ÿCŒþ]~­W(¢üýN›I‡Y6ÊÐ2HÌÑ…Ç£n2F;~œ~ÏT«c¶6*ÅÛIú$ë$d—$4_!“‘ø þóÕ7qì´™ÃN¥9QHE|sþþÝ,ñ&Ì”ÓÃÈBZ’; aë|ð1Üìz‡ñ!š%án žhbU+(ãƒß{ðùžß¯Hù%3ôYZžã€mBÊY€îGoÓ«ô+rUëSRøàn@Fcõ?^µiTÊÄÄFR¤¢9û¤óžFF=ñïóë@Uä²ÇRÅ£,UvnÏñõýzìöS$Y Q–0Glsú~ûõÝ¢‚ Õ Qml`nöÇËëíóèMIR(kF›·=¤“Ÿûê]PKy£Ö‰_#h$ðxºTT7½¢¡$Ê>‡½Áê@§³¼rÑà¨Wœgö3Ž ÔD „!DG¹$íþq©u¤1E÷‹)Îrî?Ìt&ª&Ó­½/¨ ã?LtÖº] à˜úŠ1VàŽOÌãóêMA¢6Óv§tƒXí¿×ô¦ê\:--9U€Ïcéúõ=ª‘LKQ…lýÞ;gºz¨ÿØ¿Á/<`¶ÝÊC}µÙi(®—E­µGQ À™!ßEJ­¹@1“¶I2AyU ÆUŸq·³ Ùè\H±ƒÏà(øk×UÌá07úì5Aø}cj´´õÕÜ'£¦¥‡fŠ%@ðI¸í""Z®rÑ9àS«´z~"ñ΃ó#èÑDÚR*õ5Pêmg{ƒBTÉw¤¼Q­sÅUÔ­%1Jt‘œ£TyÔ²@bm¬Kga2FîÇP/"›kA·Sxðº¿)%Æ=„‡í®ë´FŸñWWiºÿx†ŽïG_^«c˜5]O¾jŸ°ø…_jñOQøe©4NªŽÑiš9db<¹íwEˆ(â©¿•ðõæ8ÖDÚîá r)OHü 4Z›¤»é=:¬Vjn}T¶ûQMl´ÖSÚÒ*ê'¼O'•5+Âó±Êæ5W o /§aŒ‘ÁëC ×<É;N¸k[º¹<  ª¥ÓSCz§DªyË ì3»¹ÈãŽF+ÅÓgh6 )=ŦlBµM(Œ·z¯Ü¸ã±î8ÇU‹ÆƒDæ‚ ý„Ý5©"LÈ€à)å9ÈúƒôÁè]Ó*8Y)¸Vy1KÐ:*¾Iœ(ùáOn¹µ†hKuïTß.¢†–*8´R.62®J÷ïÈãõÏWpÕfê•ZHQ7ÔµT5]°¹XÒ%#-ºO,Ôwì^­à¸»ò×ÜœWyouSþ>}®<û)h:/¼tñÙ¡4ÝeWÀЦš®²éQÁh©hàWšs%¤e]±ëe,ŠÛøìv ”ûZÏóôXø\.%ÄÓ¦ÛóÐ-TÜæžIXãrF2?>¾Èþ*]¢ùƒxsX$Ý7M2±äØyŸaŸßˬüN6E•¼>-öA©ÃîpxëÖ=\[µ NEÐÒšIq–î¸9Ç|výÿN“ú·‹«mÂ0Ü%P© ífrN>÷çÔ²»³ßT5(°3º¤ “ÊT „óûÎ8êýœÒ«V´…-† 3bGo–GsíÖë1$+¥Ln©©÷© 6pÜqû?×­¬. ‘%yî#J ¬ž#¡ô¨## nÙëTVºÃ©1pZ,˜Ù[‘ú~¼teñ¡I p”-Êà2Øö?¿ŸKíÓ{+£>Z/'òN„×\)‚cB4€ŸJíÈ8öùõ±ç(œÙ0!ŠE ‹Ü?ÛŸŸ@*r¤€ 9)ï+¹#frqÛñê]RTó<Ñ«H2N`þûq×ÇÕ }V“ Ê•î}ðzáS’€ÕlQŒ¦hÇÝÇïØuƱ!`BÁw¥öÈÓúõåGfIðYð§ÔO>þÇß@¨ˆ Dè‚hŠª0Ï·áûüº†Ô&è²e6Zøn{¨#†ã·\j…-äQ-DÌÊ‚4ïW}I=€îO°û¹Õ{¥CƒÕxÃ⯌ú²ëãN¤ñƒFj Ý;k±TÁk²]­•â7Žš9Ú*r®Ž®æ©š¦ … låT ßø™ôñÏu‚s ¼òåæBû§Ã8g`i5í±Ôžd쾈üñ~Ùã?‡úSÄ…µWØ/uÖØn3Û>)EE(œ2lÚÌh%ØÛ#*QY~Pâ˜ák¾ŒÈi"yÂûžÚ¬kâ$'Û·‡þÜë'ªk¢Á{g‘\IJQ¬žhÄ‘TÒ£¤R,žÀíf*»z†©bk´k!9ôéT&¿À½'¦®–­Sºÿä6橨µ »›[é²°ÕLˆì´ˆñC!”†tŽ0 °æWsÎS¡Ö.|´ºc˜Ö¶u_;jŸ´ß‰híYg»ëš}'¦ÒÉE-ªÓh°Ìj¨­ðL’8©YeZ–fùÑޱÆvŸÔ? |;…áXW .‚K¬M­h—ÅøÏ¯¯ÿ`-€ßæy«fÝuºxYàW„–êma§tÍÞ;­]°×U½¦j+o± cY>&Kš¢Xc¦1ÿ5ÛÔpŒ«á*ÿùØêÎ4Ë™ä3O=2À¿ ½3AÃaéŒðé:ØÄrÖfaY>øÉ¢<3ÐBå®'ñ÷]ßéeKM--Žé Þ¬ÅWSQWŽ–¤2ÕÍQ;UUÉ0þ:¦å9øÎW‹4édcz]Ý(ølßP¬ÓƲ Æ\E­ܘ馫ÎÝuxÖz²³[ë«îÔ”šJÉAU¦¨`»GF‹ij¹$É–8@ß[W6 j“J…òQ›éœ:†“)á¨1)›íeKQâo…ýO¯PÝ!Ö¢\%9Wjj˜îQÆ!yø’H™i0­4ŒL†ü0?O‰s`Yó–ý渣³Òx?%8Ðz’ÍYmª¥Ô]ÿð‹ŠéÏè®±´’RÛ+ ­.”FÈïGX¼ÝŒÆ(Z U|Ôn¨ÔÂÔmBöÚ32:ùɃÍYeV–xÁóåä¬/õÿ†šÅ]c×ZÎñ ±+èi®6¤hhªm-I[OQÈ&Í!¤PSq®Í…¤Y‚ÂbÕ)»¸Ò$ošÄE¹Äò ±t{qMÂ\f9o¿‚Šø]¦tÍóSèÏ 5M=]]¾Ý/•K mŽ!=ÛNR'ÂPSÉXª¤T*Ó%Tf" Jd¤EAcªÔ£MÕi›¦ÄÜÛC¬( Ö½Á‡n‚ãkª²m^%êêÝ)¥týÆŸNÚ®µ4ÔMg¨«‰j^=MD„´q¶Æ1¨\ÛN b¾ÀÑv€ªóÞxÂDØ}V®+TÊÑ-iõê~˶t…¼\tý\vø¤ƒà*㢞b|é’Ç$±RNû×›©9®uZ­Ã˜ègøÍN˜4v•è®"YÚ7à ‹(ï€F@ÈÀüzÐeNÐ2©OÔ™u¦¦ÔVš_2VŠ…)”£*—\ (ÞXcǬªøN¡¦N…Z¥JX šºï5ʋϪäËñ·¢âPYŸ#Œ“‚03Û¡ÃŒ¯ÌMŠ*dš/Ü!)ê©'J¨Þ*h‚HŒäde¾öÛŽù#úÞÃUim–MVw¹/'ÿÄ+üT´/ÙVøUàKho<|‚[ÔÕ•b{>ƒ#;µb9«¸±óqoV_+ïNÈ’ÞSZ3w÷çÑjµ 4~÷_#0xßâ—Ú ]Þ|Gñ«_ê¯uEAdZ‹•K;QÀÎÒ zh@ò©iU‰+O ¬iÆ#wX*º£æe ïZ`/Ða⌻0Œ£óù¯Ù®§:ðüÊI4.®ÙorAäñœgê:§Z˜7)Ôê,•ÓSÈV0S g Ç¿oêݟ¢´j )rĆER …þ¿út=™æšÊ,¶ƒèFqžÝ¿éÐ’[tM3`Q±Hc™J‚¨x$ߺ–bŽ£U50÷ºšÛžŠJ.prÌ>¼ž·°õƒ‚Ƭ2è¦t”Ñ ª3ž çŸï¿[Tœ?ÕyÜC‰ ú*,®6á;ã ýáÕöT‹¬‡0”¥h”²áŽîG'¸êQBÜœÀ£¾î!H™£‘ÜßA¬…Ô ì…ðxílÓž£·iÑ5¸wu¯‚ç…f ã$vê{CºÓ²X”€*€ ¸<{sß¿Q™£ËTp¢ÜÅvn9Ü9ü:PB“NðÖ‰ˆÎÂGãÛ‘ÛéÔ:¨ÑKiEÐÒ…‡8M¹îœþÿש5B*t¤Ým(îÏ’x“û÷ê Q Fò‡ð )ô«°dü¿¤TÙK˜@4é8 rGõ \ÖA‹j& ¶ÐªH<ûuݪR‘!`¡y]#%–G!UTräðùäãõèMP&áåyö®û^Õj‡ÔÞøOP´ÚBaQk»jiUå½E’ÇDà‘ +aÓÎÉ:“·Ë½xìi{Hm‡Í{ÁO-Z·:ø/?¯÷h$–Òè¨mñU4“;„…d¦ÝÃvP¨ =•9vëÌ6˜³sô÷uîC‰x oó^þ}š©¨> ªé¼?Õ©C$²Ý™)áš!,³Dk™Îè|èdW_3Ë!B’PóÄ®¬(÷›'Nv˜ó•õÞO`Ìö1ý.§ºÁUQjÓ´Uºráªmÿ[Tó5k#´_̧rL‘з˜ê6“ Ãqo:¸*û¦Ü“U³\xcá©“NÑÒ^,ni š–’©&¨„UÎ(^¥˜—%ybRì€l|°îK†©P ŽÓìˆbZË/~Ñx! ^ñ³Â‹Ý6¡‚çrœÝôÝ-Ú¤I ÄÈÕòn ‹M,QβSÂÇÊ" Œ©*޾ñðö/V•L3»•¢ët´‚Aëy’Íøµ ;Ü]öcL__K@ÒйºûzÕþ*ø£O}ÕÑÉx×7 Äk<1+ aÀTÈãlpCø‘3·jŽ $M†ÂQÀpîÎîØó'ýŒnMÏácâ151XÞÒ§î'Nœ‡@4]SUâ¾™O“Uèÿ lZÂ/UQE£$¦¹TT×j+´æ7øÊ—WùQN Z:&Ñ,N)S¯Þ QØÁ‡©P¾«Ç~@†´M„n@ ;éu½ÿ*Ñ@Õ ÊÁû`ÝÄ󆾫­ôzƒÇ¯/‰4Ox’ÏRòM[RóÖÝ–ÖÁI!$ÔÏå…SéŠ2Pp¨3ïj>  ÏüA ]ôµ7ºóMeLeB,]Íà}OÉ[?gý  u›¿jG³\.Þ#Ù䥹é{b_ÙK]OÂÓcršaæ«¢«)Iaên?Ä+³(’;7H&$‚gåk­ †¦ê} ñ éoÍ—¡¿f™5Ö¯Ò:ö÷cÒUZÓWÙ­÷X ¸\@ž’õQt– ^)ŠYY&øª—TdÚ•;°¡£Qó.9†¥OÆ9ÑL–È€Ð`ø¹ò^¿…Õ{©xs¡$éãô”V¨ðS_Zém”šÚ‚é<–K"^ç¶•‰fž)é~-vÂQ¤JYY6Ž“4lSnYìÆPêf¢zƒ[õºX§TŽþ®‰û«r·Ã½Vš%jý[_5]ŽçAqþ¶.òÉ!ÆÕ‘\m;±°4x;·/™¥ŠiÄ‹ANÅkÕ K *þ4¼ÚóÇ ¼´Vš{L–›SÅ ³+SÏ;ÉnR©FtCTL±°ÛË]ˆÖ©‡x¥E‚di ï_ÌYPíÚ^ó´ú)>‘ðoLiJ? .We%žå#9¦ž†©‘$ ÕÒ,Œ’yo4Ë"…—r£Ær¡sZ¶6£šê  xûºx  PŸ ô}ÿWxWæß}×vi5mˆ×KÒKn K…--;JKyqM$÷ D労®âEÚêWO‰â™O³`l5ÌÌ[Ð*XJN{\ç ÈðÝ(ð;Â{LjÕU²ýqÑZêýðËÕ-}0ª[Y¡ˆR,ÁÃKëh냠—œcÅ7†€ XdFóxü¡¤Òé.'1çÑz?¦~Éz'Ã;e¦Ë ôÕ-…%•ÚâÃ`/U1I$c 6ç,F=fc8›±ÏUä»éÐv†S0@÷欭# 4Å¡.±Ë£ËxϦHãâ¡Hÿ1'-£%¾C©½ù¢ò?dʼn\áö‚ðêñs þ/aÓT·}‡ÿ“¬U™qå¨à°Ï|öã-.\6Ä«‹kˆ+à…uVŠÒ–Jú=qžÅI PUyê«+ M$ˆ€`“;Oˆ#Š`ÚúÎ-77ü|—a+‘LfÐ(WÚSí§|±k¯®&ãáþ—²Ë5Â*=Éñ°Êñ¢m*‘Þ%RÞ‘¼#ê5´è÷Íåê’e¢ËæCüE?Å?Txã¦F–û,æ^ x'^³%ÛQÝ!ŽÛ¨µ# šHæy))‚Ç&úÂIÈ’2Ѫ˜äϯñ̓¢B%ËÅMªÓr¦¡·YiR¢HÜÇAGçJç’8õÈÄ.XöÇ^GŪ&ÍBZ\`ê»wÃï±,æØú¯Ç ݇HÚ% #¦j½ñÂÌ2¿ÒRüœ€:^û¶c毌 —öØ,áÓÍãy9 ïú§_ÐÀu_–jU‚Cuú¡ C9%¡8À ¸‘óOïÕwR­öÄ n‹šß$@ªˆ€6óÛæ?©W§Jþ±&G­åã'GãÏYÕjAµ–†³stõFÁáF1Æ›W>ÃéÏn¸8t0AY k<챩-’{P?>…­½“ êm xÖ%©#·ãåûÿ~´¨¼ÄQ­™*_MG8» »ŸûëJ•@²ñ,ÙI¡Ž@WÒU±òöÇWYˆ´,Ã…ƒ)Ê}äB03ý:†×BiÇ{Á àv…ŒA<ŒgŸ—çÒj:o²{)µ£™FŠGWÆÑŽp{cÜõ4Ÿ”ê§¹ j[€Ç }‡|çëÕ\*5i¸”±(˜‚8àñÏnߟn ×€–Ê.Ñ h—$mÜ=Æ;~ù=± Ì¥µ(ŽÝÝÔñÀîyÿ~ˆÖ”¤N¨Áo*ª {Ï¡íù¨u+Ù P €{íøõ´¦¶œh°Ð ¯à{ޤV;¥ºžá¨pØG9 ìDkJ’Í&}{¶©òxãéÔöÊC ˜\öÖñæÅ¢´N ð“Mê:fñ2ïÒ\`¥sæÙ­’ÆZV•ÇÍ:mŠ8Éó<¹erª63gâqYˆct÷oÊßá<É«S@‹Fÿ kM%ET…!ŠžY݉#‘¨Écé@ÉÎp:ÊÇTm6æqñ+Ø`©šŽ†î½Qû'x >·Óê;¥®ñQ¬«j žíçSÂßÃc‰¢•éaW &9<é-$qΦ#¿óÿÆ_cËX@¦Ý"{Ó"IåÈ/©p^(´û޳·‚ì‹–žÔWM)|¦µÞ4ü×jª1-McšB0ßM-*úg¦YeêùªØrÅà«2•Aœôóè·j‡9†5S .;o†6«~¥kv•ÕÊ騒Z8Ê*¼oP™Má¤Rñ ,¡Ll96ãQâŒgn{3-þ$üÓ¨<䬪-|õ§Ä;^©Óz‚²Ól­§KU)¶3GqŠª¥Qe™wH Bºâ•‘Ž ¿EÓC+›¤t„·þìÀû•æOŠZHhýKfñÏOÅV.UT÷ºKm¢±)"©:–(×Sr4TìV–œÔÓKTw(’VDpùaý7„püN3 xsÀ ’ëÝ“œ4©‚ó^;¡†¬ÜSIÍÊ-gFY z®<ð“Oé¾±·Ù5Š^nZvšµTÔŠZ¢²%9I(`붨“rîg‘b@rÃè¿bjÑ×áÈk¶˜öåå+Êð¬5:•²Õ‡½WPý»|8—Ak/ ü4°ÁWnÒö}#AdRõ+bg¬¨&1,ŠG$ïêþA Bõ寨ÑZ…|U_ýJ’ïü¬6éÓrµ>.Âd«N?Úœ¯÷¶«™<1Òº«Y_­ÚHUÏemDém¸Vo+tÒ²©J‚A‡ 1îÜä*Žýzž1‹¥‡¢kÖä¸uÃ(>³Å6’3káËÁ{y¢þÀu46/ˆðŽÍqD®¶Ki©[ܯ-DK,°ªx›jï‰b-媂X߯Œñ?‰êUTýÀͺo _HÀðšt¬Áb7ë÷^¶xsöYÒ: øE–ÑK§ìVä¶RÛ•Ax)Õe—ïK)T ò7ªIÝ‹ë¿÷8¾¡—:äûÛ¦Ët5 ´@¢²õ†ºnžŠ®å%1¸ª0¤,€•›a GÈóÜv.zïÕdUn’ÐT³Ÿ.­ÍM\LIfìØwcØŒÝsªÅáCou'o³V™¬ª¬¬¦¨/]ÍbQÄ‘½P ç| nÏ<·sóã£Ãi ìõ)Ê£ìágª©Ž®°µ9&•¡%d¦bw¾IÁùp:–⎋‹¦´§Ùï $¿‹™H¤¯›Ï•]™Órç`ž3…À ?Ê1j¦=õ‹]PÌ$6ˆdå WhðgNÚî°Ü(í’«… ±%Ù²’-•ŽË>ăÕ1N"% iD’®Ih((¢Ž¦8á5ÕÁ$“Œ~ƒóê¨|ܧx*ÄÍ}£¼=Ò·]uâV¯Ñþh{s¬W½ö±(é(³" I%lb¾â:“‰…`‹®)ûSý¼þÊÿgZ/ eñÅÝ G`ÕUóQÁtŽíCn)à˜ÔM o¢ÛUM‘’†X÷íÞ ­¸æ‹ª9­ªð;íƒþ7ßeÚ®|;ð Jø¯ã^¦¹SËA晥ÓVšyÔ—Šy×øŒÑçy>\0Q*Ü+Öã,˜J¬êí €¾nþÑ_mÿ´ïÚv²xÝâÆ·ŸE$±4 E¶Ç"°FZ l$®‹3$æIH>§|g¬ú¸ªÎ:Ì¥6±Ñº.*¼k:{hŽ*ºš‰£ )ŠFVØFçbY»°ööÈàtú'TÔD¦Qi#¢qðóÄO´Æ¥µk3x—MIG:UG4ˆ¬$Áà`w ÉÇ<õ­K€Qwþ£l§´ ¸7SÝQâN²×õb¿Xê‹æ¤”Ë5|å•I<”L…Éÿ팞·iaÏý1ªT¨Lf_¡f˜ñKÃ{Ö¤Ñ:fŸVÛªîwö¸¥¡#É[£4Á[lèS?û?ËžÇôAãì0Êo’f<µ_<$€^áÂê*+ô’*„žTŒ óéÌâŽJ`[̨Em‰~"Xš(ˆœ’=ñÛäOZ¬ÄgŒÊ™fBB­nÖñØŠ!æÆO÷玫b*ÎÐs&ä£0©‹&D9àsúuQít[Uzƒ›bŸí¶Ùwªª²¯¿¹ï—SF–[®«\Ei[¨ƒ@©³ €3žGZ”Aê²k‘$rSj6ERü}G·ãøueÕ D*à5ÆSÒS PèÛéÇé×~¤e”§Q’ìöš«•H†Ž–J™6çÒ£ì3ø|ýúÎÅñºTnó æ‚>±î…,«ÑWZZs:Æ'‘tѯ©“Ÿlwàóþ½dÑøž•Z™E–½O‡_NžmNé® X*ÍM0‰»dpOáúôêüv›t2PPàÕb,z),äHÌMÖàŸÿßï·X¯ã¦fVïürÄ%°Û©Ê‡Œ{ôýüºš|iäÁ)U¸0PšæµâRÈ¥Žpãæ3Öû8©É›’óŽá?öeÙü-H$+aòüº|l悦§KšRy(9`';¾_³ÖÕ,Na+ÏWÃ: Ï‚<à^}¹èŽ ¡IÄØY+‚É[Xë5õ ØUDBsòà¯Tëñj4»ÕuW¨ðŒE[1„ù+ÕàÝþ¢ªºˆ­Ôª7…c¹ßòºñ˜ÿò ì˜q›®ÞKÙ`>ª|AŽš®ûZ} ¡û7éø ºÓKzו­2ÛáªÏÂ[’#†¬«Ç,ªÄ*B38 •Dr}¥ î×¼, ñVõàŸTuâ¯QxâñJøÍꦺéJc79¼Æ©i€åÞMÍŒ·¨’)¼[ Z2¼½áÕ ´©ï„_d¿|Q¸Ûï:+@^¿Í8‰µÆžžšÛ)%DF ò¨ÞÑá/°ö>Sñü=*npk=<9ô^‹„ðºŽp$CNëØÚitÒi+ƒÓ•šZ+-¼ÐÒJÈ+Ü‹„w•·fgòƒ¹-渙¸fÏN§^«Þê¦KŒŸÇ%õ ö4ËB±m¾ëº Ëev¨‚GïüÖ…d^"bX–t]¡Ø0 n6„ÅÇpònãuY¸šÂÈë…:’𶢦ÃünÕ Ìg3Ô> ìTD ë´–R„'.+þ“3µ¢|¯ðn¢¢©jå¬wºG2ÕÓMV†UŠeóvɰžJ™Î>Ã’yè14T³máMaiÌ5 ”õ‡øqø]¨t_‡Z&Ëd¦¡žÓZ&¬Ô+[ÅÚæªZŠ…!dy¥ΧÊUÛÅàûnñ'UõŒ8F_õ èžëÏbøE­Âàë¿2®›Ù¿ÂÍ!£it†þhÝ-òçáè#ø…v ¦s—2€ä†$ãÛdbø•jî.¬òOU{…§I 5¨z›ì ®í¨««i]î·€^¶i·Ô<åª ÄEULŒnÎrK0\aôƒYOFé·¾©uð,y.;¨7ƒßcáLúšÓCs½Õ<,(1Eሠ ß>¢:ž-ÆŸŠ†Õ:.ÀðöP»Jïíª«­æ9êD×ùqE‚we·{cœÿ.¼¥zb Øc%!¸ëKÔõ¿É EÇ—¸1‘ÏãÏúõžJyeG¼@¸TG@µ7P´éÝÁö¢“þcïïß=X¥@}RÍHÖÁV¶M}CD¶ºkR¸ zÿ›¿Î`y9'${“Ó]„;¡˨´çˆQTÑ©$Vx,Ç8=WuÚéIõ‰†É_H­X‚F|¶#9ù=¾¿^ P$JŽÐ¾x³–Ú›…=d2ȶÜÙû£ßýúe<9Ít.x*¹ ñEïTVÁM<Îkn4–Ø€æFª©b‰Jä 698 xèê´6ÇU ;*7Çÿñû"}®Ú–Áö’ñ’ß õ¥–È—ùlu4Oz^H¡·FI® ¦•™0êÎUrz êâbPöhïðuâ/ø¼xÏâo„:ÏÁ*ùtô~^©oýj¨Ï©ŒWT.:¢ÇÝãUÉ÷*³$4RŨ¹$8,8Ý´qŸ¯¾NzÙÃð¦ˆ.FÜ8‹¨7ñ›õGÃÓ4ÓJG;FŸn¶™†“ Ä5²¦ÔÖ+-†˜ÔÞ-UZú‰bZ8Ïáî{wý=úÔ¥E´†b’Ú¥ö ¦ãªªîÃMji‘r;(!³ØçŒŽçŸÃVv!ÏpÈT¶˜kaÉä\ª¬ðKüFê•í¸|¥\{c óÕ¼å‚n€³3³5{?à÷Úúãá?‰þøY·(ô­u-rÆÓHºE–J‡G!‰EbʇnÜå‹wë3†|AZjuIý ù¯;ˆáxp'Uí¿øf‰­ßÄ»ï‰ÚKíQâì]S ¾¿N\n T´•1ÇåÕPF´ñ*Åæ‰c™W„Í< _Ÿwð—Æ/ª÷ÒÆºI‚…£ÎÇÉyìoˆìFŸNkÛM/©ôž¸°ÒêÍ?©(®¶Z‹Y¼G*¸Y#¢/®ü—çÑö—è„3Õ.’Ç[4’AåQ‘¯~ÕF’Œ4¨]»JÔWÖWÔINˆê¡•ˆÏ¨ã+ôéoª@‰RЃu¥†Ž¶®‘p$àcÛçЗ9€M•UsÕu×%4âXiwC*ÅFü1Ûç×>%:§ý­³UÑÛj#´ÉnåwÊs<' ŒmóϾ:Ϫs]¥< ”ŒÔ¥N°H t¢•£'lkÂ>pwç'Øn”Ý% Y©´•=â„ÒÌçÊÛ–àØö9é´jEÒž ãÛn‚»Ú/÷¯.¤(ÓÌ߸e €|½¿¶ˆ¢Â×Ã[âm®ßU%#$U´óy>Ir¥[<–϶FôLÂî‹TÅ×koµ½Uúy¦¾\ªçXÊ$háÔö-‘ê9ÆëBž ÖUˆ&otÑ/Ú¢ÁgÓz–÷¯õ4–* ,u×z‘¿ðêsÁ’¦(ÁxãîK°*³“ÕL_eK½·åCk;Uàø ‹ß…Z¢ÅSàÙóRjKò×t¦®olù(­ÐVD͆·¬Í­1¯g™ qÌ›ãI¤yŒfjŽ– F÷’û¯˜ÍE¯å¯¨º•’¶¢¾¦w–¢¤È$z·c¸¼’02Häò^Ff>ç“ÔQÁeï99­pvbTžótD’ž Ç þ¢ ÈÏÏèxh:‹lwRæN‰]T³I†ži廃ý»õ̰…-I|Æ.%*¥°fÏáùuÓèæÐ¤ô:–ªJ UO/¤È×+üÉíóÀì:²qpÜ¢ßÒQ¦'1L5×KJ˜«*&*¤úíÉù{u]ÕIºc‹v‡’žYë‹L©ÁHãþûtêOkeÕÙ#¬¬©®˜Í6@=†0}>Tsƒ·E¢í=]sií´ÐSÇ$—. ‘ªŒd²‘…;°AÂ{ñïŽ:­‚-ìäì hÙX6kɶx}-}™™–3,evßccwQœðGašt^[^R \HÊíŸ ~Ú¾2èý1âŽÑºÊºÓ§5›6øV(Ýjh‘å•à§~Z"õ³¿–UäväX5SÇ«ÑÍK< óçóÝMztÇîûù.û}¤iì_n/±Î¬ñZþ–ý)C=·I×ÏQ4tñÚ-‰P#3)Š(j•Øœæ,’IÏMøâ·RŲµc9{ºíò ¥l#*7bºb?ñ(³øýñvO®6Ûv£ªÔÕ3xš?ášz;Ò¤±„Mººžž-¡‰ª”ö¬ðò_ê%•,~QùXu~§9˜.=•ê>“¹Y5ÞžÓ:ÓMOFž»[éî4’+‡)Sr凥8÷VÝ{Ê\tÔ`{LƒôYïàk²­«EI݉׎´°*µs ’ÑÞ"ÑH±Ø.4Ô¨¡Vi¡a ìFIY¥˜ä“ƒØuÚy·SAäØêõf¯£ n4kU5$g̨š×vî¹lóòë:ŒnU—‚ £|#ÖWMmª¨n6ŠÆ©µCQ²c3”gcílñþM@ £Bô&<“Zàf~BÃ;~VAnê%E£ªî3TSš•eØä‚xÀSíÛõèÅSºÁ+ˆ¼Uð#PUZ.ZÏK¬Z’„g_ ˆ£F`Z%ã{R$ƒÆ:ÚÂcA]eN¾!y¨5U‚ÍxJ}{ÓzwMFµ5—*‰== )ÌÓË;±"Ç„»£žTŒE\´ËòTÙtªùÿÿ·›ûAø÷â '€ºŸP\ü4¶›m=CŠÛhÖQÒá.u”Îèû‘æ–(RHÔ¡ŽB‹$ŒG–ý1uCXÚ}èRjòz¶ãQ]:5Tç`àÎÑôî3Õšl BnXMM;n}©ŸWbzcD@DrøðO~¸Ñ„C¦>ç8ê ‘*3#¡‰¦qeO‚Ý›=úQv’„¸tu_ðéV§lBe9RÄ‚>_ñïÏK¬fÛÎ`"èŠÉ¢¨˜Ì»îœ{ŸŸP m‘±–ðEM_)"ójf@8RÙÚ@èÜëMfåømlŒP‚7bÀ–oÁ@'cë‰껫QZìõö­-¨,Æ¡ªèë©"ºS`ÌÉ'—*ú~Kµ!€v|? ÇÕØwérÛð²é‚ZíTjñ|­ºÙ-vz«œÃ%T²ÑrR˜ d2Eñ¼à{¨$ç;žìÉThš`¹ÁL4b¥ŽË5LÔÒ"˜‰ž¨BØr$(_œna«î=J'ÌbÉ©UÂ~R”ã/˪™[u}=òÍE-Ä™ë©j+ÃGR=§`)ìÜíPÌ©–ôŠør)çÀÂsÿh +;JkÝg hn³éÝW_dÔH¶©j(çò&4Ò®¹È;[ËS•!·"œ)Qµx K›ˆ.a"ÇÒÞü”aD›Ý{oþoËÿ‡¾'xàÖ®Õú–óáLÚV-Eg®©qMo¸´²4/J$ó[Ìyc¥F£V {l;¾›ðßÄ/mFÑs»±§(ü¨ÄaAs /_£û}x}MöäºýžïúÊó£ã³øÁ}°Ôµd}%‹¢·Å8õÄ÷Êê†òWq uµAdõT¸àuw4˜‡uÓ,}R†’Ñ·Ý{Šªš) ž !–!,ŠË$d)¤pÊC¡Ü2=kÿØgЊم•&6&SÕ‹Aß.u1Hªh)]\«°û¤0W¸ïÛþ3V¶- uVD‘È';—†÷õ,‘ÜØe²#ãonÝø=)¸æFˆÎÒ£4ú2ïKPFù'›ŽÅ¹ÿoËåÔ¿ žÀêžÅ†Q“Hüd¨äwíÕ~Øî˜i“¥²áü4$5Ól‘Ô$ ¹ÎzÞIÍ|X \¯­L޳y¶8da¿±Ô±·•Õ*Z ¦î’Ã%D„ºnfÈçÛ=^i(ZWœ¬…~9Éä~ûõ!å];ÓÊâ8PåäHÇ·JsȺY‘ªwDìè«ìGïñªeHh)þ’à(•EAdEíŽßŸP€T‚ÊÛ«V4R¸xÕH ¯þ=!ôš³²óíAöññ ìõãf‹­·[oþ_,Û¢«´ÇSU_¤O0AR)â—Ïyæ%’cµšJ,ÈG”âx“F®WçÉZ¢æÅ׆g‰þ7ioÚÇ®îž?Y¼#¯¸ÖQYκԗ-J)kàzv[ÄÅ'ÁÃ,‹ ȧ„<Ò¢o,Â<ÿùµ\ÀÒ \“ÖD“òVî_M^éO”Æ)‹ .pIú޽YÿXMíBœÑ\þ)@tä:¨êwNÎ Ó]ÏHS^„’5+¬§ÿâ+z”çØþ]HP¸™ *Wé}E§&V’HØùrÿ˜Ÿ`ð=þœqÑ‚%KœB§nÚºç`Wdd¹â@Sýõ' wÇd~Xmá)΋+¯ÂŸF§Ó6­IËMKWb—‰#‘êÈ#¹íÖv"†Wî¨Õ²®Ñy¢®„:º±Ç³ª¦ãËOÕØ*iït4—kä:ºä yƒíÆ3Õœ1p2Ôh\¯«µU¢¬‰`’Y «âÛ¸ó÷C` .ãŽ1’8èëÓq.… ¶ÕßgZ© SSÙj­R1TRI»r‚s½p¡àFF3JJ´Ì…qíc´Q=ƒWøYÏ=5E®ß5SU—úe‘ð¿ÊnáN OˆÙ79ÎK€.½ðƒWÕÖGÕ8òþë}ðsÁ'ê:I;©Sï¾Ð>ý™|8¾xñ㎽Ò^xsc0ËUq»×ÅG³U4rH@z‰HÛK–cØ`<”.uñƒã·ÿåG¥|%Ð_Â_±€Qx¡q·ÔV5ÇXøõT5Ir«¨òè­T“-Ii#ž#çÏ4^[QLÛC*8rH.T™\eõú¯˜O¶/øŒ}¤~Ûú›PWøÁ¨lv][uší”Ó´h ‘þâÉi'Ⴜï#ƒ$§>³‹²@˜P]ºà骉Š´ Á°¼“žäž¡Æ÷)yF ¦¦<ÈY9àr;ôŠéJÖ(•æøÄ¨!G¤&9lÉùsÐ PIÙ(‚×]PŽÑST@uʲžäÜqíóïÕj¸¦6ÅCê J•Y4þñçKm´OsX[ÔYã†8±Ï¯{=¹>žy=gb8•6ˆ˜•ÈSÅÖ¨ßÄjklÖÚy@YAÄŸýAL¨'ŽãV£Šqî€I@3mTåQfˆL(äJ·ù®âIîNYFG8öä|ºÑ§Mú¹Xk²l…gº¼Á)¥fséecSõãžý^§D”mî‹'jzW²¦ï4M[ÎQˆ‡¹ÇryïÕÚ, “ª6Hjjb,mPRCË0'$þ>ýÏK}F“{" ‹Ûºj•¥‚žá}ή¢8Öv¦ò 2£€´lÛrIP9Rzù?CÁˆ}VI®XóÝïîº7ÄJÝq¢Ó¶}5O`½/ÄI;A‚¨S²ÿê\ˆØ‡Ù´íÇ'h=gpü]f ©9}Ý:½g ÚÞìªØè.v;5ʶT¼Z®TÁ^1,Ê)Âùj®bÈC—0NÒǃb–)µ+b°”(ˉ2é»=CVÒ×¼5Óij[Óùh¬%iU&2Â1,7É/ÃÅ®'ŠÙ¼ûñKÄ—~Ö©Xoü³MWTÛäcqÞµWj²>à*9>£ê‰ÀûÛz§EÆ•b×~Ý(÷jƒ`—Ù+ê-úƦjXª¨å§­QðIå<Œ `Äa¹Á8;r:½ú¢Ì®þ÷F*dBÍãÖ¼:³\xë/zŽû­««f¼Ü§¹W=dµÍVs;TÔ>RÍ,ÿÿ 屓¹‡ÅU8¬ÌtÌûþQÞ~‹Ö±øÐxÍáoÚ{Á?¾ÑºËYë¿m:j S@™¢³†z³SMþCIO@œÌttªHX³×¡À|@YQ¥Çº=•f¥&¹„{ºwü9¿ÅÛÄÃö®ÑU¾0j;»èÓ–›]¶‚ë|Ñ[)èg–YüÉe}²T˜ëîò5]C—in`‹CÀñ¬õ§hþ `‡h÷+×ðÿ³Þ°ð–·ÁϼBÃÍA§ÒŠƒDÁSAW]-æ×Ÿ£¬­2ÔG–«ZÙkÐG+ov1Æ…Ïå"ÀHþU—¸f%{Éோ>ý£4]»^ø]~Šõk¯´Ùî³R´{jíËq·Cp¥Ž¡F@‘©ê¢r˜½s¹ *X¼À8j”ì8*í9âT^xE­5W‡×í3~ñ àŒºjê!h®µ+;Ä"‰pÆ«ù°É Á¾qÎÕÝ´ô¼w,§™†ê«™!yÛ¡ÿÅì¹ãFŸ·TC¬!ÓÜF ÃOùSOQK[‡&’ æJ؉ˆÂã ìJª–è¸gÄøjÌ—˜váW{ ®¿¹]kYY¨²à0 •Èî8<ä|»Ž½c` ÓQÈê'©‘B|²{çß÷í×—!L.¥tñ¢*’êN>],¸îšÁÝZsÈe’ƒNk®Ñ³Ñ[®6ÚyÚž9)ˆ$qÎýHúî:£ÚOšƒø…á$ZÊž{e,4•tU…#j6ôueÃ)^A¡< ¤÷ê;E%¥xïAöÚû?é_³§Šk] ¬*õÖƒ°QÝåJI jŠ™ikf QåÎÈžjªf ? *+l̃Ëêy´\ÇŽz/‚/ñ>ÿÿ¿ÄËÄ­=¬5ý¾Ó |;²Z–Jh›=Æ®¦ƒO´¬í=T²L@¨¸LRJ‰ˆÒ(UU#;­QƜʵW—Û`¼š•¤™ÈR¤‘žéß«DÂNr.œkôÕÖš­•bjS”Ȳü¸ïœ°öÇת¬Æ°î…•ÓT]ªÁ[|–¦WSå(vÜ{Ÿ–¿¾‡¥b¸ƒi‰;®56…Ó¶½¡ê4u$3Ûì7è$h«¥–«5јÓyV·¥×*àdàox®!¸ƒ7iÓ¢¦ú‡2‹A¢­ÿÃ瞊ÑCwŽ ¯Ÿ#¶Ì®FâÇÔ~dFGn:¸1µ\ïÝšI:¤ÈRŽ–¡ µZ'¤—D¨­…l`‡iyî?Нè\ÌÆæêM8¨^©Õµq5IIcZ¸¼Ä¥hƒ<±ÆÇ$îeƒÎ;àò0yêþ:Âu¸nªŠºéëgóªd,B brx{ç­¦Q ¨æŠˆÑÁü÷šI\r6ôö“š ’ ´R›uÕ*c–8‘¼Ð>à\;ñƒŒþùêý7-ª^R&tI%Ž¥˜É0`CqÁ^‰ÀE”ƒ)²hFr“øüº«[-¥2 ºí_ äKýÛ|–Ø4éYª–¨U‘<É"W,§fÜìR„†8vùG{i8æƒÖû¼Ö-Çc1P0Çn;c¦ðúáµ^Ç sV(T qkŠl޶¶Ž®e©Å$Ž#2«dR ÙØ{㜞8¾Ì¹!§ÜÂ[Y™Ð=ì•XõUž¿TWt¶FËóäÜeYŠOS±$€Ã'àe~ë×WÄ84g:é8<Æ]5ü/E¼ÿÿ´Ù³Exá?…®¶Ý¤u´ôÐÜšjy<¨a Lñÿë0ÇʈâÝòØ]º˜.h NÐݪIqûDhš7¥5 ÃLèïüºï­*¤ÓZ‚eœ’ f<ÙÒ¡àž ""ˆþD“ÉçÆ] îQsŒ¦)GxŸïÏ¢«V£³w"ß•êØÏüAmKŠºÅ{ô¢ï¤ìI©¿ˆ=Åjèi­q| +Ãñ…C<­U\dìU#Ú§n>Ïá?‰ÙŠ/£R`Ÿ->¨Çm¬Âõzß«-t©šÉv±ÞbŠcO$ôUQÔD²€§ixÙ†í®Œöu=ˆëÛ‡‚,}ÂPv¤j¦Ôì£ù„2ä@ã?äCÒÝEe²TÚÕR“zNÐx£Èýÿ¯Ks®œ5+IÄ`&À?dþ&W¢WQÇFXyŠWv9ç'ö:76PvcB•Tß­ÓÃŒþS üò@üó¯\C€º’H Çïñ@Öß|*¬ÐZ›ZÝ´½LµTÞ+dõ ML*U$«G;¤,ÎØEóPÉ2I™ø›OK²¨a6‹äÂñ—ìUàF‰ñ·]x§à—‡RjËåL“Yª4uöÕ|ø‹MU¾uò+šín€ÒWTÐÆñÕ#ü*É™QɰLe_À8-*UÜ)“<ôµõ¿5eí ƒ ×­âÏŠ_fo´µ‹ìùöûAßüGÒŠT¼é¸îsSÛ*ï5(Œ)ª.ÓÌÅËâäU²æ6U z|?1g[oçßE^¤“uîu—Ziëý¾ ¥’ý§õ±”¬¶ÖÅUÀ¨ «ÄH ‚>àƒï×¶kÚá Ù,: ºt¼øj㸨¦|"¢px?óÖV7 "B»B°ë§¸UÒ-U2Iª žzÃ}0 t…GøÕá4Þ,è›…Š¢X ºTSK"’±OÊ÷Ûœgß§V°Õ…3d\!p5‡Å:ï ¨`ÓZöaAZòÉÔJÙVu¡óá{»°Éù¶½,ÎÌÝ’K[Þ´­i¯µ„š‡IÙõý‹TÙ.úfõOet[’:ÈŸî0W8ÆAÈíÒ›†qÐ& í‹*·H}­´ˆž.êo ,w_ƒ¾[m÷dwªŠ3ZYZxa$Hï¬;*²ˆêPämaÔ¶”¥® º«£^ý¢4—þëOµÜÕõZKOÚên×#I›7ÛØFœnsÀ ÆIºMr %q­7\…ö®û\xOâ7ŒþøY¢õý†=?©ôô 5CSU^ã¸išÓl4è ¼ß ²u•VQdFºU*€&wò¸F燾‹ç‹üb¿ÄkÇ÷ÿ–­¸^u¿†žxª§ÒznËn›ø-ºßSŽõU Ó«ù²×3¥ oL £lÔf5dD’ð«Ö{hn|ñø«ö¤Öž)Y/迵ÒxS¨.…¬R×¥¸K4¦ªž’X#TY£)ç+å,Ó4Šˆ[wDÌGfÐꚥRÍ.›{÷+”lZáS{¢}Oc¼E`ób’¢8YUŠRHm¹È^ÊHå \Ž@ê¾;Œ±´Ïb{ßtÃPsÙ>ÖxWo¯ºÎñÞ¥µ[§ËRG%>çÀm‘Û’Fp¹É8±Õ!Ç]’"ê»ãÝTãOYîÖX –– J†XäéQ•ý*$r[ÒF7Ž}°1Æ#ëÙ@¤Aº&KeïQ‹‚WÜ­RºRK¤´r%W ?Ì2®Ø8b9À$ô¬e7hf|•Šnië¾Ûn§’[IC¦4E<Ôí TÊ ­S4ŽñìÆÛ£ÚI$€xlv¥Wã7.ÞÚ4€òóTrãr áÞ)kd¨HNŽ/6"…²»˜z@<¯`óêÕ nv£}б‚Lì¢÷›ÍÊk%ʦ:[Õ<¨ŸT) “æd•<í9#¾1ÖÆ ƒPU†SïFËž¤wpez—”äÜIÛŽ>ýzœ°Þê¹hE(‘Ôº£2“Î9èàU%¼–,ÎþZFÙ¡€:1}‰ sm§Ž– ¢BƒŸ^O×ñíýzÒ ÁûBSÜH”’HÈ”a²@Á$çýOë×'@§7D…'-(p (È!NsÿVíT™z iŠå[iµÝíš.âeŠ$ œ½P€< ±9PG•&T2¾cn$±â8–Ë7T é:õûJÈ­@IŸ¢±ôf¬€ÏðpÏS,µPª¤¨¨ÑK½[ €ó°Û[`aŒz€¬g «IÁñ¡ö}•Õ0ä7MzóL6[þÖëf£½2ÑHÔ붨´1åˆA"öžàäs޽+\Ñ£A›è¢¥´,Ÿ)µµíF*Võ¨f–IfHnM+üLÔ‘$컩Ãã´l=Ú®#‡Ôí›ÑÒ,¡”šÀ*”h÷ð–ºmQA©­’QRUÀ•4Ô±Tš çs„òã;¤*1¹L19#Í1¥œS+çc©;ÆÉÔ@ØHú.`×úƒNX/54v‘z«‚R°G bB#Ž1ꦌ¨~FXyk€1’G^ß €séK„z¨kà%ni On­>CyqK:LC”Œf8ç#i#hÆG^K„s§¿4º, åþ®¤YR kut¬•tTŒÏ(ZvÊ«HNÝíŒ/`2{g¥¹ÄÈm‰ú«¸ŠŽ%·Ñ,¬†ÅpÒÕ±ÑÔÒ¥ 6ÈäeHÂ3ËáÝž\¬‚9DF2ÇÙ+·¥`±/epÂ5>ö¿49Ë_aÉGtåY5 ¬ÕVZ'§Häh`)Ì\ñΆ5ÆrxÆrq§ŠÊö·ïöAYùœAÙ9ÓÝj_Qßiî3×Ëcµ<”Ï,1’8…0Ó¨ä¶9+‚àƒ€J8†VÑŸîtDùè—R»©ÍÚ+̱ÓUWššYfY*cÚ¨Þ¶Æõä?¹+Î3€<Ý:Ôƒ³V| á(V`ŠmÔºþY§ðóLê[ ÓZ-¥-´³¤êm¦¦¢Iä1:(2o’C( ±9 [|AÏ©H:YM7:+5Œêy¥Ò„¬œ©RXcŽ·\9¹¹£$®,ñãíÙà>œ¾ø™à¼šÊçIâ›â(+ÄšZëYCù_äÔÑ® ӴЇrñ¤RË0¯%Å~) ÌôÎ`[©ÊHÓ§ˆBHWÌOÛOíYö™ñGP oŸh{‹ÔÛ«­õõ—·¥ªí>榖º•#¨ž¤4òÊdpº5ñkŽU¦iW1é?çê¯á™hꌬñ{í­õ Þ X/–MYsÓVÛ<ÖêÛ,”uzŠ‚Šµç¢‰éÄ&XÑ|²BÓ¬{£Ž2’|Ë ÆWpk*~ç[ÔU€J÷ûìmþ“j+¨îÞ6Õ G¨é.2\núÜê©Ú¶žDHó U-L&tEH– +Ϋݼï¢_OàœÙvœÿ”‡k<׺Ú"ß`Ж‹g†šv{te §Yi÷D•B&ygš$Æß1âŸ(MÊê¡@UïÖ4 m¼*å§ÉZ6›ÅT•ô³PTKªÙ\{ßFð„mzï uÌ—M¶óWOIÁ°¡ÇdžÿN¼î3 ”‡5haê—öªí©Ôbtõ7*$…QƒáÁ8œCž©v.&°\^Bý³|ðwVxo㼛ĭC§i©¬õ÷Eަ¢h H‰¶Äe#xÝ”dñÆ@8Ò~%ÔYQ«Mµ —Æ·ñÏWZ<>ðKCÅâe ÑÕÔvk¤U²ÖGÖŠw¬d޽P·•¶Ü6戬˜O5GHÀ|a‡eVÒslw™Óò°kaª~Ù÷ïî¡£í-Uögñß\ëÛ7‰zSÅ+å4/m¸ÑKI[OvœUbXÝUYé£ò#–%`é3)V,Q€\Ž-ÇÜS»`‹*Û)85¹ˆ•Zxµþ+~1ø…àãÀëõÇÃý_¥®K®£¹8qY,¢T%°{–Ôš’ÑWLíWCs¶Ö|8Ø UQæ¡GVPòú”†!˜ÝVáõ i‚ósb¹Õ,Ð6U¥ÏY^µ…Æ–û|¼Ýõ> z±w{•Þ¾Ygþ!½“yªwi¸ó(|’Kg9éµ+<fæÝay›Ý2³Ü,uÔíf‚ayXHiÇ4/¹AHÜbÛß#†5šþÙ²ótN œÒ£wK –¢®©*Ò£TFå$ófDb‡nîçð=X¥‚ÎÜàܧ 8>Q^mì*ëb¤¹E*€é$±OgåFHu,»@<:C¨ºÍ” 3¨Z¶Û¢z[ex•Yˆ§Ha3Å4ŒX¸;F"óÝ™n»‰÷Sc{ú§Ð¦âÐN¨7¯ãö›…âÝ-:|-9–šI …æUDrr8bb å1‚Qж'ÃÖ>k»›ÉFï¾#ÔSÇKn«§þ‚Ž%ª@#¨ŠªD!à ÙnäÚs‘¿¿ÞXÃp›Ën|ÂËKî©k¾¸º×H©A$–Ú(ÑáHÃï;ïdœNpoPá´Ø;ÂJm:- ©®«ª ÕËU–ÜÊíÜýGcÛ­SØBqd”@(Y„«"/Þ!qúö8¸(RÚz’d•¼éÁ °e¾CèOÏ®ii7\@ËÓÅ5¼­;ÓDŒË1ù;õe™u)A·‚gó"E_)£9  ôöÿ~­  Žêá­ÓŽ‘‚¢£RXÌp×Éu°»4Py¾YÞdp¼ãŒ‘òëcCh¸Má-úNˆím¤ofðæãnJ:*Ù%𔣣+Çr€ÚW±g‚yïÒ8?¥‰dÒtƨÛQ¯ï½ÂûRè/lòRií/¡Äª¾t¬–¦ŽYÍ $©¦iâ‰"£e ÆmëNA(:ù+ؼ´7ÐÍàh“XÄÀTö‡ðîÑ­,—»•¾·LX/ž{-†Ù[M,t¶¤'ÍŸâà†HУo‰ØT m¤³ úX\õGfòH¹úª.ÃÈo%qíâÁGE¦ïšªÙjš¦ššçp¥º³`·›4 QN]åÕv‡R¤÷ò~Ãq¯sû:L#Àìµ)°¶˜‘!Y–Û…&±Õ×ë†É§¬••ÖSéû-¨GK¹ yêÌÓN‹‚bÎ98@zÈâõ.ü€z¥†_Þú)6­¢Ð=QoÒ4–ª:AÖê©.(kÙiÛzùm#«ª$hË¢å]Øé/cê ûܾÞ*³ê–¼µ‚ÅUzßMø{®f£¿MyÑö!U–;*’îBÉ*É!.àðIÃz¹ €:×ÀñlMš.a1ÏxAR³Á%­Õ38ú3LBõrZ•¦¯’ßgºA“Ä!å*$'19nÖ1‘Ÿ~š÷vÎ5š‘Èÿ ”)“IV½Ö³`¶Üe¦HÙ©þZègó‹òÂÑï;:¾Ù`À“°uæj<´åê}þS‹%ÚÜ£ô¥5–ébÕš[[C¨©ZCI5¾W¹Å;mysnŽ9¹"MÌIV‰q•|¢0؆3ÚÄØ^oµõ² BHq¿%.ªð¿UiÙj.Õöio¤¶BÒî鬕PRÄ#Xjki$ÂÁ@©YÃ4‰!A±Ž@êÇĶMwÌ$o­í¼>“Ù¢ §i©j­)§ëd®h’ª ¸¹ü'ÂC ãù~|fJ–f œœ2¨=dRe6¼®‘¤kåm~¡®lTB£î”öiª¹K]y¼Þmvõ’J*˜SÖu`™6®ÌX 2‚›T‘ŒïQ¤Còå‡s¶šŸ}Q5øºwW%—Rj•¾SÙïÑÔYwÉ,1Ö[ª)„븪íó0€Üä•À_»ÏŽã8 -6º­ v3òUkÕ¦×i~iÖÍ¥5Ç[És޶[ñ‚7¯Šž’®± Ž]ÞQEEfTR¸' ´9ÁÝn7ˆ²¦Q¦ÛĵÏб€hßߢ¦é¥§žºûo·ÕÇSpŽz¨ˆƒ2KN«,²,žXÛ´;rá´õï*f¨Àc‘õ)ÅÒqdóR }[YOtþ!-âšñl’š=’D’çoòÙÒ=! Wq|ƒŠ§ ¢?%N“ SdÚ«PÛ,Vý;YÂß OQ1g¤RÓ,ò drì ùH¤à‚N051œ nŸÒsZK¼´ÿýT–’ކ8ª©h/Öêh©á‘%Ž#¶S¿ËÚVa®â&8!KŒŠ=«AµˆU…5Ç‘^©ýšÿÄëż&ðóÃÛMÅ/Ö+ WÐÙ☩‘¨*øá™åhiIdŒ¸–’ªZx‰ŸN†J†KtWûFå‰ï¢þ!ÿˆïˆšŽïi­cЗôsÛîKÿ’ÓT×½q¦­!ágEòéÕ’&1§ªL°n³q?½Ïš,ŸTÖ—]°¼ì½\µ>¡K}eæzêíOE§ç²ÑIYhƒÈŽßtðG¶,Ãj–îË– ¹¼—ÆT©T:¼4H6è7ððê–KÚob%Xôúj“Ië's§×ЦоßÂ÷-„<5ÖšÑä–¢Y]^V(%ò™\ˆ‚D…€÷ýœÚ•jç6ôä6ºxèÔ®×®ñ:ͤôN„Ð^x®+´¢ÕÆž÷ü8\)¦ŠJ?&šªñgË-kª H»ÖY7©‚‘¥„âm:Ub ÷1rôû*…Í»Z½yûý¦àñíSö³¾k/émÞTé½9š¯Õ·­Éº’FJqO%D¦8`t«’cšY‰2à¿OàÜHvmGXDO‚–‚ãzÍ ¼sðßÄ[-&¢ðÓYÙ5=¯ø“Ú ±Ë‚kV”Ö|>79¤©Bó*š—¦ñ-(Ko\ÚÅ5]O,´úÇNÌ`®¤¶T“pE eDi-==Cˆftš6 !S‡\ýá8šYflŠN+ÇßñEÿ­áo…Ÿfx¼ñƒWÝu¼Óš¾ó-ÍM.’·\[~:ªÝðê§ b‚rWl€õ縇¥L€Ë¦%Ëɶ?øÚ_~Ñ>Z´ß…k=/ªÈ¸ÐÜ%9m«k©§¤YÞ4 犗–’D¾R:yØ#dõçø‡Ä®Øœ§D‚æŽá^×ë/õ\+üRýGf´È©¦–2jXÁe“…R0s÷WÁsþŠ.0 #OÊç:ÇÉWRÛáIà‹P\¦u–U†¼ù£Š©ðäp€¨À—'vÖùƒÔâ1îŒôÇE-£ÍNjtýl6{Mâ¡éY}$r]¼Ï4(à–EF_- Æ»˜ êxÖ—:›‰¾¶þtŽŠèÂ5¬Ì]¨÷)ªÙ_wÓÕÿÂuE·DǨ£â"¦5ðÉ$Æ_\ER"1Ü8r €è±vT‡ÓqÊ||ý…4¨†:Mì™d»SWWÁ=҆ΰI!"è`ƒàŽß1£TUÐË0Þ¯s’YVƒÚ;¤ŸS?tšõ3¸æü&bté¼C-ÒŽGªtsOWMXc±`ƒµcb$tV%‰NwvXÚ…„³A¨ô²*tÈ‘¨C¡Z«5L=]l®c(Љ¥I¢’¡Ž ó›YrŽpº¤T9©´Æé¢˜>[î÷«ÅmÊ[E<’ÉW5m(¨-"¬‡{nÃ.м–Ù‚xé5ª¶“©Üò¿–Ñóê”{Î*ÚÑÖ½3¥Í-îÝ]%eʦ7¬¨xee”4Mµc žˆÄj1ÚFY˜eGšâ8¬Uri‘H?çeh¹­ý¦ÊÑŠûhºCSn×hªç’žjŠ–ED­qëBÊpXˆÁBqìFzÁÇWÄ0æ"lmÊ-õOerI!q/ŽþÜmz–ç«©aµÕi©êâGŠ‚™)šEºfÃI³o3$ìqõ„xý,MFáíÉŒàíµ’«]!sUNÔ–aÉä—ca‚S'i?–:ö¦ €Já2¤–«/•—}ºÍXÓÑd×±M©@Áiùw'ØuWĨS¹ÀfÓ¯‡ð£KОZ¬ö™¹WØéîut§&áQG3ÅC#ÂËå1“cº7lÊ î^¼7ÅXú¯fJ/‰‹7ÚàÛx"Ú¬œF)ó•©Æ? ´œö¾žJY$°^ ÅSñPO,yòʉ¶’dÙ…@Œd§ÿ¸ñ Ú­öÈQsç'šÑ$¹õê™*d ðÿãí5Ôv껕díGP»Vj~PÑ“’¤+…-Ç?ý°7_Qø Ó pòäUü5PÛŸÒõ¤¼EÓuË©imêÈ£øŠi¡i¢‘¢óT,ríWXËÈÅ|ÆpÙÂzzÍÂ~«ˆc¦‰Ô7´ž£ê¨Õª\gb”øUd¥£§¼|R\hJ4SÍæÍÓBÊ ±òÉlfSœƒq‚:¥ñ&8Ôx,¸Íün³1 ¹Þ*Ç0Y$¤—JëH枉)Ö7¦–ävÙ&3º@2ãÀ# H,®ÅÂÔ­F§iDëÖÞžgvé8ÔeŠ·ü\¹Þõ¦²§­[­ÊæÑ,qUTÞ+âšðvùëªo 1È>©ýÛ÷–ëS•”À|żüÖ“±B ÔÿÝ/¯îÚrzz»a·RÉ=\5T‘SG*8–šHeŽ3ÜFѹ;= £AJ‰c+ŒŽ-¬uGˆÅSÈ 5ëÈÿ)£Bë þÐZ‹CÅ¢ô˜¶ê*ø–¶Š¢]r¿Í‰ä;‘LŒ„‚;ºô8ž1DUí);öÓí¸Ð)n:§g7þú^çMGrºÕÓè-§ªj%i¨æ¡·°’–6UI…"4ÿÈW$"± ˆºÎâØÊuÛÆñ#iëÍTv>£Gz:¦ýk~¶Ý.õïu°è±_5;Ã%O›=Å%I—Ë™"vuŽWßüïàÊTšç8Ǿˆ*cªÇp¿T×¢-tŸø­›ÃÝ?5ÂçU¢ª‚®I«ÛDŒ®Ò¿¥\Žø=[¯^S™.é§Ù^¥Š¨økš"z«Cxgâg‹ÚVß´¿ZÞù l”ßÇ…u­Ù*DrG•syŠ=U*¿$1š„ic>cfUÏJ£^]Üu¾›û°ZÕƒòK$.ûû=}¾Ñÿhj á eF‚ðÿLÕYuÖÙC©n55´1UÓTÓÇ[k¸WÚ)êÍŽ°*ÅR¢¡P4[Z2ÎèF¶HTí¿¿ÂU6ÖŒ® Êo4§‹ÞÐÔ]u'†w½ áÕ¾ô´i©¨íõÂÓ1yj#¦xjê#C)”ZªfƒÌÛ$ÑE#íääà™QÎ3 ùÛÙUêÒ7suW^•Õuôéɬ· å Öÿ†ž–f¨Hf‰ž"u1¯eÀW#’­O…­ÁªÒÄKA&mà=‹-Ä!ÃkÝS°Ûõ Ã=–Ñ­Õ —5FÕE²½ ˵™£;1¹Ô–ì#e$ €g­ªÔš]ÔŒ™wéøÜuYUª‚søä”U^tÅ%…—PÜhBãË+sJÎÉÁyâ%|§*®6866”sUÃð¬Cª–´žZiïèŸE¯wíº{±I]|t®wÑ©ˆKI[S]æE[O"óSÒ’(bŒU†å và“ÔñO‡…뉋éùý•,Iˆ}þxý!¤ÖÚ²ÇGm³iÊÝ9æâõSPŠš“n'JYg#º¿ß0¹ÉFÞ›ðÂ8‡ý.x‹ßå{˜GKŒ»g7ËÇÉzÓ­tW†‡ÃK–³Þ,Õ†Š]Öúû”7K}ÇíZ¸j)wN¦Ñ•w+´• ¨Åzû]ñMj-/f Èñ·„Âiø©®˜§óþÞ,šÄMU¤tô> xi=%%u»á,0ÐZiŒÓ.õJ:Wi F|·V”¡P¤¯Y8ñ®>¬V§ˆ%®Ì6ê9¢wÅ 52ö?á>}£¼'û>xs¬´Ö¢¦û}Ÿ¼Ai¨Äm-ŠÏÿµ<ÿÄI­LC€‰BÃy@ʘ^´ñ_ã2YÿN$îÔÏþîÃ5ðúsçü+/ÃJÿþÏ nÿf­oKÕ¶$k\Kuš®Yce’žy‘àŒyŒ–á8RQ‚…ë&§øË°fâzGð¬ÐøŸ :œyÏÙqŠžýž¬6§o 5‡„µ”Öè'ž‚Ï}¯­FSÌOô5JÂ2É0,q̬¼WÀ¸öÍ:Ïi;ÃL9’EN!†­2ÿ/áp»h»Nªñ"[UƒG>¢Yb[-Ó»Ò® fw™vÎË d}áŸj°’<lÆÇ|;ަ Òt$>Hªb)µ³0|BÜ´}×OÕÈ@XI /Ä#KŸXÈ«€Fî¼·¯YÒ,Îù9'Ô¨rK[utß<<ª«°x}Q¨¯•Šçš×l¦¤¥øšÙ+:…FŒ«é…s€3ƒ¸ê÷ÁØÕ©vî“ãcÈòù¤T¨ÈÌéÍÑPZ“Fè*[]Ò7Öšžó¨#“ÿk“JA!YYÆjfz½±¡É_10èÊ ¬@õõÚNÊö‘Îé!´HÌ}>¨½âæ¦ð¥#·]µWоêøͲÇig¡¬§¸MHÂ6S•dx'œ,ÑfŽg ÅX¡M'Õ¥TÔ¦âYchæ¯=ƒN/ïòºONý¡?Ä}¯¼,Ó²ã¢ü<Ö —ëšÐ[¨®wècX’4¨ºÔ¨¸«…‰T2.Å »#ãút©yÁvãSãk|Ó0ü;ð F¼ÕSöe»KS[tÕú£LPQLñ˜ëíåêêiÀ¼Ù¥ªž8».Ü ãprG^yÿ ›KŽà˜¶’¯ÒàyHïΚ¿Ãý§©¬Z~Ç­ij*o¯,W{Ò™¢–d¿— þRpùÃÈF@v!Á1øŠ5jS9ZtoŽäͼ”bx] n§ß%ÇÐè§¥Óöª‹ÝM]ìK%/šÂJxéYN 5hŠÁ.À,„¨V`6Ÿ\þ"39Á¶å÷ $SiwDïEk½Té›ö ³ë? ¿ƒS*™šg«ig(Þ¸ébv™¶¨9,(b>ñ@«AÕKt‚°pÍâ}ôNšà®Z«L½Î¢?â©«Š–k4–ƪˆäì5ÔÆB7ìUäî¦>»XÒGs-ûÆAôßdÚTš\eZ·/µÝš¦Íy±iÝ Þa¨¨¡Ó6È­²ÕÖ# ÒÄ ‚3½TI-Cw8V«Åx›Ù´ ¼È˜/µÕêžX;röW6ÛdÓµ2êO†Ñš^fi$h£®V¬¨£˜.åš`ÛÉ °±A»q;PZϨ×4ç GAnvõ‰Ym.q"#ꃦ¦»Es¶[c£³N‚)éÌñÓARŽTvŠ5b É¹FBŒéÀ8 @Ô ëÞ¿ÚŠ´‹{κ³5¥ÄVÙhõV™°½Ú)7Ódm!g-!r^Dfàñ¼`Œ¨pÇïÓ¼å-õðBÜAhÈÑp=ù¨ŸK=eÂ-žRQG:GW”ÌcªÈó ‚O©‹³ÝÈöÈÝÓñ†£{A'cò¿’®Ù“˜ÝhVÒiŠûšÄnÕ+[ã–D¾ToʱsÊ®$£ÔI9õ‘¬kÀËÏ¿D@îê”xi}µßnw{3Y •ñE,íT^pô‘Åê»FwÃü¤ùh[,Uþ áÕšÞÝŽŽ–ùtþÖ‹Ó#š°õ–¦ÒWŠ/àwÈ%²US„¨Y>/|rA&j8;Ó8ŒŠDŠv•bq8&‡pÄ0‚ ¬¢÷÷&ÅS,‡7\Ù&ÓÖ*Ö–ëE<ÒªC¹c[ÿâÆ¤a•Ü Œà|ºöux­j´À¤f öÓdêM3•ÖþUý¥uýªÖÕÐÎн-D‘U(Ñ"“Ì17Êóáväb¡IÉõáø§­_+Û2-È×i´zÝ?!6:+RRV^ ¾ê ]P’ŽZd©©"h§gØ9Ë®D„©‘°6±æ@UAÃáÆS,ÃVàH“q®ŸmÇK¬ºøbIp®’¾ópºY%ºRR]4Ä"üdçÌÉ8 ’Wh$['ŽÀ޾‡‚4Ú `O%2M—9Þ.`K,UÉ,ô‚@V9iʯ˜T6®2¤íNGË óײ`s€ïI„Ö1Ùc4§Åñ©iR:(j¡€Ê¯OŸ¼€0xÀ=—%ŽÛ~c=T<09ĸû²*T€‘;|Ô¿FêŠzO„ª¸M u"E†`åÒʤ¨*¤(Sß;Gžrx†A öPç5€B½4ºX¥¾]jë¾1é–#«C0HÑÎ £& `(·mƒÎ:ò¼B¥LšÊÞÇ„*Ïvk;@ºoí 7„wïu.“ð£H\´Þ¢’éV´TZ^át¾@´4Àj>¾/ŽC±e}¥öÇó €8ØÄÔ¨XЙ­í¤—®ˆªððÇÁ'ß¹\ÃObšÅ£5]Æ*Û½M®£ÇTZæ£ø9eÌH%gÜ#y‘Ð’ ®p2Ù4ZØ–±ì‚G0g¨„Ú8r\™eÒýš>Ø ¦¨5t?c?´äšrkt÷ßÿôúî)èm±0YëK cæ"ù‘ÊIՉ—êéøbîó×ßUf¦„CW6èÚÛ¾§ÕSLhª%Ô×›\QÛ  —â*j%ž@‰(œbƒ8)“€[¥bx{HÐéÈO?i‡I“/Züð¿]É©i|ñ[™ô—ŒV©§€Ø5UªšŠ£¼Èå’j„hÊI“kÆvÈ‘oŠfr~gÄx6.–(Ѥó~Npíùº}* ˆpñ…Ò¾ÿЭ]¥ì”Z3OZ/‹ ³ÿ¿ÉgŒT–CRyFpñĦø\* D%’F,ñŒ' úî;š‡å6AWKXÖËmóWõÓÁ­4e¿[]þÙž i?j_.RÇ$Õ´škâZeyÒªo®IR¦ a†ö´ˆ FŽ®Ôø)Հ͋’$Á2Ü‘écµ¬»3ÀOú[Å?é<+¾x{áßÛ#T_–±sÀ¿†â$Û^ªÍ2ãâ¨8L°éî~"jm?kŽ÷¤´WéK|×–¬¥¹PLÞUÒX¦x„B ቩ²ðNŠ2È%/ŒÄŠNª30´å€D_S¤ˆ›hHÊl¬«—Š~}¦5~ ð[ÆôHŠùéRåXÞEÚÜó$çâêêêªúˆ*熣ÍÈ’lÆòy‰O7øOá½³íb¢³øùo­šåbx,Q×ÁpÓõTé¾ElJÁ'2Ã'ÄÇü:YÕáˆ1RãëFk(Óug˜;@è#[FÒD¬Œ_.ûWA©ê/uóÜî𽚪FXfš½–¡ê$Q9¨Ò©ÂðW!“•ä³ùþ0úÄŠoqs€ÔXÚãKs:A´û&åÃo}SýŠìš–áW©|5¢ÖvúÙê&’‘§”ÔMèV%q“B–`UP +Œí·Áþ#©J½:õ‡jÖÀpqŒÃOݶ–q“!VÄÒ¬öË }—¤~jß³…§UiQ§hŒ»ÍK¶GW;Ä'šm°“Á(ÇÖ¥œí 2ç¾ïðÄ_ bø£qt¨ö 'ýîÒ " ‰Ö 0¼Æ2†*c˜Ì U÷âÚ+Éôeêßkñ"†JêøÅÛçY'¥i71–32gÑÜàô‰~:àgö³ ww»Þ ›i"Ýy\m)Ááq-|–zª“À¯¼²Ç¦-•:×MPjIIj˜¥˜ùU<º%¨pc³í#$ ¿¾4à´0pµëPÉ ÌI11ÚMåv7‹}CS$>Ú.¢¼j »ŽÕz´UÐ^­m³ÓI¨Ç?ý”œpC`ÿ•”ö#¯°ðŒV‡Œ+ÅFÓáè|t^sj²¡cÄBÍGÎK,2S“E8ÛÀöý:Ón ¡°U7ã;öÙOîµðSiË”¯§¤Ô’RÑJñR%?˜Õ$BãÊQß.¡Çù]»àç?…hn`%]ÃbÉ!Žt/?¬ÚçYhÝC/†£Ã_ü#‹RSÉRuµóWÉTõ4qÅM$h#’eI„,<ͤ³n?=âM˜oúC¹r6ùj½# {PIªbñìsâ–¡Ô0Øô•žßªu­Ö¡¢‹Äª‹£ÓQ4‹øCp°ßüT¾ëš[Eêás–tŠß@iÞáÃïi"Wi‰HB“cH쾟q*\-¸_¡¶žF³"íó꽉¨ê®y– 9õ•sÛÒß š‡SøµlŠÇ4L²­5TôuÕb'U©’Uu“ÎßÍ‚K W¥•¾Eñ\I•ra¨¹Î/qõ•«C‚´°—›sþÔ^Ã?ÙãÅ¿f¢´ÒköOs]¢êm!S]iÑ‘½U‹PC PõÅ4ôó ›ºÄ’Ëþ`WŒŽ¾QŒÃ1ø¾ëÄ‹õ¶ß!¯Š–0j«šÿ5dWEƒOêJz)êÞSŒƒÊÊa»N{c¯YKŒÒc›˜‰ü*Ž é“p¢— |G¦¨µÜ­º'YV"™¢Z» ¨KìeÀc÷@Á-ÙºÚ§ÆðZj4¤Í€`ø©<^ 껎’°Í§ôf­‚çGVÆÒß?ž¬º¿97Æs”9ãÎQ§]â»ÆR9ˆùnˆ´Ñ*þk{n¥§´êk V»Ýe4‚kZu°òü¢ÞRÉåàªÌuÛÕêÿaÕ¦üÍðDú'ÂöºS1š¾ô¿Ù×VÓÕ×›¥ÆÓ¤éU£¯Šikje“ €°+¬@021‘›vxùlWÆ8:”óñDHñ#k{ºKŽ^ñò_A¢Õ¦­u•·›ô .2ÇAmL’4íc´ÈôØn<²%õ^2AÀü«O‹1Þç¿Ë[ø/jhѦ ¤û虯7M7vx¨éµÔÆ AGTõµ°54b¨Ê)IH÷]ÚP…‚ÆTÐàþ"âž×5ù\h&.~\úTÓ¢çwG×u3ŸÄUrÔÚ£øåî»R-"Y®´×$YnÈ%Tœ”… © P赃ùèãIWz:_ä%MÇ;0š:€`Ý ÝW8vfÎÐcßM•üd·SÝ#¸·€¿e›n»†aT÷ëf‚ŽÏs­— å·ËMæÊåÍ²ÇæyŠÛnTzþZǵ’ZËÛC>¹’Æɵ’ÏüpÔÞ1ÓÙ­šõ4†£vúª:Y+,öÚÊ›%D‘Ë$4¯<$0# eN<³%NÙ00±ßå<]r3ScbÚLù6·Š±úvÄÆ‚}…NÙmZv];]fµ 1:T$u²0ºÅË ±4rÒ¥kÀj•…CÓ¤¢6pQ¢v Ò«|hê´:ì7Œ¢tÒÆ=nˆàã.¦é\¶Ë]ÚŽçSuÓºbñ¨æ/MKu©c%@a*I É4‘+E$iM+AègY"bûŸñ]†}Òï:;Ö&“¿–‚ÚÊ`©¤ž\´ß‚wXuÆû>xe£µŽc^,1ÔDǪ̃‰-M]D•0ÔTÊè“´‡Ë@ÑÂâ0À–ÞÁÿ–±-ofê@IîŽs­úÄi¿K•¹Ë|’ï{.S›Â?êªn5´ú?Ãzd¯2‰i¨;tJ¤"¥‡Ë1QÊ…V• 2Œ£2µGÿ‘qî%õ"ú÷Z”Þßv²Kiû7xko»Z¥<]¦Ó´·»ÿãšæâ”5.¾°BA8huŒ SohpÏòn"“€Ä±µ¤eh3àé®—²µK†4ÌíÖÊ ãØÁ[/ˆ±x'¦µ„u׊H'¿_kï“ÛgZ•’¢ˆêDûüù›s³2R¾"ÿä,ž¬ÿ™°˜‡VÃu y{¶Èkp —oºŒè°õ—NÖ]/çĽ_㘤51X´Õ¡,:†éR° ¦¦Z»ŒÒPSÓɲx¥¨&v…–?þ+¬©${Tþ2øorº©¦l.Ýõ™½§_íf»áÚŸ¸b\óÃ;TÞ2Ú©¼qÒºº†ÍU Z2Z˜k¨Žª´TL‚¥_á`™¨.Ôʈ˜¨‚Z)ED’Á)PŒ®ÂücÀé““0Dƒ¶£O+J–|:ð{ÍQßÃwÃûûLê~Ó7Ý%£ãUübÏ­hã’ùo¥ŠgIyTôtÂi!¥—ds¤Ê•cõN?ªA°‡ï·î´ÏU^¯$èQw?ðÈÖ‡Â럊Ä-âkÚ!v;‚Ê}ÿÀ3…×n&“ȦãmÀuòÌ2 å&4‰…Æ>Æ‘í½¹¯@ôž–ñ*F·Áⶇ²øs¬ç·KYI¦4êÝA$ñ¾Ž¢ÏG4U”s¨x²õîp­"‘õjÿç³K+Fµs2£FVÿäsa¸y¼ÖümÚ8Ív¶ݤ’y »ò˜Õ[ZƒOx­¤íúºåü-Mi‡s5îª+m<23$qyÂY÷;ͬ)™d2* ;ƒq‰ÿ$pWR`†Š»9ˆ1$ é¹ÑbÓø/*8š'+wˆ´Äßš©oa-qáF”»ëߣÒ>6×^ÒkdÚGja\­z4ÒO-¶ ©]+içDðªùj8Åç.æœc*|7Äv&¬Ô åD‘$E¼Àä½E>ÄèUhm0Y#‘¿EóëO©mÕmM4a_®uMÐÒêz*‰¤}5Zõô3C]J5U*Ãm0* IpU¤BÍóª|7 E¹-”h#ÖÝW¸¢ÜÆrÇ+£|(¾kšk¾šÑW I¢õv¬±ß´µ¦¦¿W$3S\®pšZ ꪎô±ÒÔ:Õ*ªF[a“ ®îYM”NÂý9y&TÄ;(×Þú/M¼ ÿ?µåÁn‹ÿë߇ž ê%ŠÉGSâjJZ6®E–¾ Ïâ;Iðë?• bB¦P¡ƒ+n[´XÜÁ„€<~ШŒM~Ðæ§ÝØ‚'¬‹Gˆ•Ú×ÿt€TPI«ü2ѺKTZ.!ª/ÖClÔË¢øê”Šé¾Ü'ž4t4ó|,†9)å–uh¶M1ñ˜r 2 õûYnáq~ëeywã‡Ú§Ç;õVÐÚHiúo¤¼Ez±ÕÞì³PTÝj*•é'«©•ä†HiüË}dkŠ’˜ªÃ$UÇ|%Ã1xhÆ—ff‘®ÑÏnˆ3U©ˆm69 .d<í`7×¢¾é¬WšÛO‡ú’ÙcÕú=MoZêYB)gšhȧ«‹Ê–_"­*©ƒÄBM±ï(¿¾!øuøY´æn é#ÂHôLüåÍ{ºöìWö§ñ{Á8|l¯ûRÙüÖu’ÜRß é©ëo6u¢¬––˜GQ%Yš”I„ÇRÌ€‰â¬dëè\üS…¯ƒeLeGö‚Z„ÍŒÜØÜ¬d-ñ-l57Óô¾ÙÉÐto$’ ÁP^2ÿ†—Ã5ÙÿÆËŒ´š‚žzjz•ÓñSÒZëÖhŽž¤Ò×VM3LVÓÅ5$J…œª¬²'¨oø« KN´[ý…2HÓÓkƒÄðõðµÝ†­Žƒ•µ‹Æ´ÚÛ왪gðׯÿ²oˆúW^8=Eî.Èg1­U%u#IGUNdWa$ˆô‚ yž#þ=ªÚð瀇n~æüÒ°¸ÊÍrª›Wëm ¥}nŠñªÔá ¢þGc$–dRy¦¦U \•ŒmåW›='‡|%V "Ñ:É'm€ó(êâj¸ÈßߊµôW†÷›ÇÙî£ÄØü"ðûHéê+˜Óõw ýEa·»4¬ð@ðZ%D›s« hÕ—t…øŽŠ©Q¯§P»r3;󷯄'áêKaíÓÁ^š;ü;4ÇŽ?g ˆzç^ë¿­“_d’÷jÐþÓjÑ)ÑB’ßw\ –9j‘–ªâ‚ pì²?1ë1XÖa@çõ^öÞ6&IPÊ£ @3çìý—’>3ø:þx•uÒ÷hïú)o’ÒÙï1[&I/t±ÑΔò¾èdx™à˜†ËDÛ ôø,E7~œf-×oµ¼–}Zn¤é-óI•ã¼Ïü:+Å5ÆûTÔ´tíQб§bSFâF)‚ïë 9œãŒ‚ðÇKZE1~wëe^« CC¢¶Ü,×Ë•¾‹DkZù)fžŽ¶:(ë&hbóLm¶HàŒI;ûdgV«[Q¨j4fÍ’˜›‚}ôH¯€wí ì´øi¬u–œ¡ Ã-e¤(Œ”ËxHé¢b˜ß·v8;«€-Œ°J·Ã`ë8šÍy&ùLëà™†ÁbèÔ_¢µÝú×j t¾Ÿª¦©–¥¦–ାµÛ±D±Umßæ#9ÇâÊ4ÞãJH#¨Ðõê¬ÓÂÔÕÖþš_ìhJŠx«ï·šk}:ÂÉððÆáB}Ý„;ç8ÅÈ_m§q=/þG­~Í’ã??vLì7SÛ¯Ù—ìïk¶WÕÕËæ¤Ä—ï(1•hÑm žKòœáOYxo8­G¶$ÇúõñúaôèjÆüÔ‹N}›|[#OxqCI6ºG¨%©¨‘_Óœ jŸIÉEç$r:¥_ã^/R¤T­“ÿˆ_ÀIõ”?õЭkfœ¤ÒÐ¥²ÅAeÒ4ˆ‚OOGMOQFH’%>†ní’#¯?‹ÆÖ¯Xšµ Íï&óТ8€A Bp‚óSKS¨ÔU´”óN!Žh*Äl²€bâvòyøÂ78“ ªH™ ®¢¢áQZÊ+ï•nKòUÈ›•yX²áø*Bžqò#+¥™·Bú‚çܦʋ|µÕÕõ”õU|E>¤–xj¡õWÚDnIÈ$ƒÕ§×ÊÑ›oM5ñI4\ kÏß½Tn¾‚ãE5ºz‹m]Þ­’EþeFÖ„–QX)iå@·x ±ÃbP;1¿†¿…5˜c-ýÔb[敾߿ðHîø¦«¨O‹hš¾øªH¤É>*ü¥Œ•#ÛK•e]Ä=WàõÞш$bÒlÖ$ÇáY¥MÎÔÄ}ãì—·‡5YMo¾›¦›QåÑúå§eUIt¨e1«+îníÛ³ÆÂsŽ9µ*œÃ½ò?/ºUOÝ{¯M#¼øˆÕr<C ’¦˜C3M Ž%ŽMÛÐÄÕHã&FRL 7ÆÝF–@t&÷ùÜ…§Z½y-óû". jšk• %ª:ë„ñ‡’®_9Ò˜@ÆòÁŸù£+a€;‡¢)öƒYÒ÷ŸzŠ¸ÊŒf`ÛŸ/–ý®jn© “G̳ÊõHiØÊ\#£C%ˆiÁž‹ôí;ù Ãq ¯wxD~~éUF¹‘ªi磼ڭw™$ŽÛ\ð,rôƒÈĪœc‘‚{t¡Es=›+Æ8:Ôz+ å$–¸ º×RÑæ&’*ÓÉTŽÎÁ¡ŸQfb„cŽû³šÖ9ÝÝlµÃÝ€žší¥i~-KbðÖ®ß4ñ|5e]u- µñ&ff$ÈÆXJ¬€OM£AÙI:îQ2°.š FÚJm’¿LÒÑT¥*Z-·zØc‘)ç•¥“qCåùr¤r…Øœ¨$7íBZÞ+ˆcÇdïâ>iG³$Ÿ¿É;ÐÙô‰ct‚›IÃqž9xÞšo5™¤q“’e;ÂÆU”+åyê³quf îz+¬e<¹­'ÙF¶–ÓUÔFz{v– ›È‘åøšYѰ%x!|¼”þbNåa€¸OY‚ÝùûôGS AâÆ5g‡ôÿ -Þž{LÔÎËYÚC;à'’¶8fÀ Ÿ˜ÉS®L“õ÷º¨üCó <öí¢Uë-uë%L°3;DÊQÊŠ˜de>à|©ÊÒŽ"©‚ÝUKçÉLf§ÓZyêXëk¡™V•)¥’_¼ KÅ+’erK0gS€uTÓs ‘q¿°¬µô(ËsëòðN•z™" ¤¶=U¶‘i!§+>È¥?ô´†&ö ѲÃÓ¸PPÃÐ_ëyßÅX©Ä’ÓÒ´÷;ܱÝ.Vá¥XÙÌr"ÓT&äudYÞ†Ž7xÇv@Áµ™ìmöU»F8f;ûçdèÔ—mar¥NݨêÍ<]\´õk´*û2ƒÈ|²¥6dƃc®{€G‡¾[¢©Mõˆ-pë¢d¿Úí4WŠ¡}Õ“Ê‘M”2Öì6H¶ÊcPC–Tã'ÒüdÆ!À€ØÊo¯¹UêÖ¦ÂCª[×ò¢rÒÏYUÔ‚©|òZžehu„ù«º9°PɪÛA*GWèãñT©º¤-¡:ëªç‰á„ôM:;Nø?¡u¿Ä_‡þª)꾚¾ÄDRmòÀ•¤)æ®QÔ©G ÁÞëX/¸“jË*¸¡1¯ÝSc°-&¡‰¿»©gˆCRUE L×ZË›W-ìO5$Ö-À“æ0™‹É2†H$W~U£Qoþî╚Ú4ë8õÐÎ÷`ëöV(ã(<ÆYYGáíæºñO«´¾‘£ºÝdª[…*PÏQ–©dó•ñI*'ÜŠÃÌÛYó¸8#Üp_ˆx®Ý£iöŽˆ—8øè7<ùYV­„ªâ4ß»¦_´ˆðkÇÿét‡š­ ¯45ê–ÿnÔUŠ[Wð¸Ö&†¼M1cRë3-4‚,MM 6¾ïgGü…ÅS,ÃÒ-¨ãaÃm43’jðö9²,G—Šà_¾ÅzÃmXtÍãAxÉ õ¾™¶,—ë5u}t7”5J;©¯fŒBÈÓŽz}”“,(Mì|Æâ>/ã ozˆinàR "ê†#I¤Ä|Õ•áŠ~ ø^ë¢|AñÆßRÕ*®× ‘º‰¤1È›¤y¡«Xã¥mÅ ª1œ²äޏµŸN«Iä@ôòóKÊÐ{¤ÁV>©ñÆ›Äê¸j¼A:oUª¢âÔñ@dT ѳD‘p3®ý¡Ê±õ*…X¿xÅC˜ÝÍä´ò”lÄÑ _دž]«(®õøU­«­T©M mmL $ÍW<šˆNJ‰¤^Sk8a´î'+ñ§eP÷Ô=‚Ý9«M}èùŸÊ¶µ‰~ê™jk.?d³ mtÓ¢×M®ùKQ[(‚8ÃËWÛÌù~T[ÙÛŒÀ$•_ñ¦£__+í¡&g¤mLx¥Ô¾7ë;&¡¶jÿ«.¾Z-µfku†Õq«¯³ÒÊ j·’:™žJ¯=ÖFs<²÷b2uéÿ—1ÍÊÀÆåˆ Ï‘Ö},UZ¸0nF³ïÍLj?Äoí0iê-ók-/ðÃ'“55ºQP‹†]ÐÉ$ê‹‘‡ …s’¸7+ÿ”x‘pìÃXÞ`õ%fÁÓUÈ·n÷Ûͺí­î·}sŽžh#ÖUU7ø­ñÅ8J9.Tw£•š2¹²8þDâÕò—¼Ztk~vþ•ÖÖc&–Rx ò²‘ŽÝf¼ÑN%j%"hùrêcˆDÊ_zɼ08Ïêµ_ò¦ÒÆxö,žÌM7C~©³VéM'­¤ª¸kIôýú¾¢5žãhó§«§TbRRWܨNóÙßÕ…ólø‡+gÎÿ#ô_ĺˆ‰Õ6Sêy,pÔAMân‰[Êf1iæš*”U…ÎÓBÂeU‚ ªë¶riá>&â-¨qŸJµr ½ÔÁ¯g¼Ôø¿©ì>, ýå.׺X!©¨¨«PÇâVi$Y÷ùF5‘]A\¡=v3â ]aæ’Cµ“½†Ñi*Ÿhð|“õ¿Kx¥„ñi›U‚Ňɪ§·Øá…fˆ>D%ÐÉùbFàrA笇qLeQߪNº¸þaOjÖ¸ÛÈ&êªÑ/™UNo# O‚jЉc…rDhìFÞª ¨?w%—µ*„¸DÄèß™‹‹~.Š”æ (½ÖJAzš¦·@žt¨â¼†`vpJ‚Ù$íŽ×)IôLx¼ÅŠŠChjúZ‹Õ.·Ë "ÒÉp©§OŒ†Ùç± ÓÔ¾¥`Bù»”>ñÏn·†Ä>œ†Ü[öëè"Êž^î`mïÝÒÍO<> :;½¦®›RÔÍžÕT‘Ð×Ü$™ÁqL0Æ\ÉÛ‰†M׸/ÃXŒunÌ·.XÌOú뮞‹œÙuÓߪ™éxüYÐþ2Ç_[áý%6žÓõÙµ5-EÖ$4wO& ¼úzÀÉa>!^gIdóà×s/ÖxWÂX)sêú›Né´¨Ãæ4V–®©¡ñVý£lÚ(KbñKPVI½WU‹%MºŽ’jì$IKt¥Tø’ŒÏ3HòS˜ÜÊ À¸)šµZØ;Ìs¾ºþQº‹]aª†ø™M ´þ»£Ñ~Öê[’¶EŠ £Ú.°CkU©wÝvÓ·ÿ¸ìž%X#H#ò¤h…A2ÈÞŒpîi»ôÏk^ÿqçiä5úp¬Z{ʼŠÓª’…§“F\nçI‚™Ä‘ä0ó–3.6‰ ²®S²»[À=ôÙT±µ{Nº}UZXw8#úG¶™ºLY§¦¼SA%@ޤ-2ÖIA¶Œy‡tj¤œ¬TŒËާúAð^#ÀÇævñþž±9Ùèž*t…þKežD•2²ù~uÍrÈUHÃnwä0`Þ¿z‡C9iˆë÷æš:Àg»,ÿÅi-¦Ê]÷Þx­Ž×Owë­¦*U‰LFšu›Ï˜’O”°!WFب$$rNâ:ùý#T²ÈhÐsõ#}×bÚc¾FžöÑAêêÈ·ZiÑV¥až:ˆ©æj‰U“†RªC•9ÜGõ-m@2èt:_®û$? ‰õþšŽûk¦¤J*Ê9>2HùïI%b«|¼FQ½2¤. 8e$“zOè„ËŸ¦€G»î¬QâŒÐ#ßT}ûÄV©£º¥²†¢²}”ê^’(uXãEr&ÅÊŒnä¹.Ý ^\ã˜Éñ÷æ[Åó‰ $ñ±šHl²ÔIE-ꌕJd¨w‰ÝYŒgÔ2Þ€HUÈ=ºE R] òôüIÕqî.d£­Õ”öÛ]Etš–Ñdq ‘)–²j.lc8*á )ÊíGpßÌ@¡mJž\ÄÍô3ëÈFþ*)ã¥Ýó²}e±íôµWKjEÏ™"ÃH˨˨`q¸ Ä0ÜIê‘ÂÒeÚ4þhâ{S—ŸAèS~¸Œµ”‚®Iṛ̑†#Š5ÆEÉÆ6•bK6váAÝŽ¯a°yáÓo_º£ˆÆ¹³ ’˜hïÑ[ªjj*´ô”5“jä¶Ë,µnøVyYc ¾ÒÙ,!cãÓž‹]™CIœ¼çîtJn"¤çp tDT_Äì)馿[#\+%lòŠ .ÂT!A¹Ÿ$ôíàQ10>_’²1|MÌvQ Nò“5Öç_Cg´µMÎýPÂ8i(Öz¹êä#"4„‡v~wœà‚8é”+5àÓh.qØLùˆV¨Öv²P"Ô6jhÖI¯t¬LmÂdˆÉò¤ÿ) ’0@ëâÀÍâ}ú¥¿ò&`úù"é5Åm††ëE¤uƨÓT7‘gX.eà•_>c yŒ‘rJ±;}\ŒŽô/‰qb™eFÐ ŽZ[ÉLq¦r´Ûè¡t:ÊöŠmK§î—ÖÛ “ÚíiÄ£Ÿ'sª19$+l8zzÎâ•©T¨]M¹gbf< XVðø§:Ì “Áªª.fd£Öô‘àË(‚ÑI_^ïå ‘Î7n;ƒÆOÊŽ ä®Ud÷®«*ƒÂmUt ¥¸'ˆZzÁKQ0§§VÙmïRÁ œ£B]&3+mŒ4€'Ò}-?ƒ)¹ï¬é:øëïe`ð³’¤n¬ÓÚKé¸+hu~¤Õ:ީ榆¹QÐÓQJ¼–"&žmÀ† âÉ!,bx^ Ð3¼ÍɈÛ@OÍU¯†€ÌŸTX­×«…Ò†ºŽ; ÆcQÐÑÿó!©M¢VW‰±ñ #Þ^%e“ ßt©Î&‡[5*aÄm<Æþ© áU,^éñ?Ò™i{þ ÒñŠÈ|?ðÞ¿Ì‹áfžîwŒ¶äe¨F™ŠÅ)òãupÑò¤*çsCÃx“¨2)Ó©ó¹Z¬od'(”»ÄO¼W¿P¶ ñ_X­v1ÏP³S+ÓAȾlR´‘X…£ÒãN¿Åâ^Ã3ÊÇYF1ΦFxŸ²¸;Åÿ´²£Qé½Ch:‹ITÉO´´Öø §š–AOQK‰'æ3Hжb`H ×·àbê9¯Ã’?òž`ø[b¼æ3‹¹îËLÈðóU~ûgø…cÓT5ÞÒj#¤á¢:XZtæ¡¥4véhä£JW2Ó5+,²“F×i˜:0|õìG®*5ZÅ®"Ni‡O9¿¨óT‹«›)0ªºôÞ²™Ýâ^”¨øVЦ‚™%¥ˆ+.9:H<°›%-˺À+$ÿÀŒ$Ò ÏQb.³Þú€n GXxƒt©OÚ|HÓwÛ•%=uQyg—zÉâº;†TÜ#1ó²†ÜÁôªáðå²êdlv×@g—9Ô£ks„O%+›Å­`š~-Ar¡ÐšV´»Õ\+A5®âñ¬†"²,R:Á!åLm*ådI ®}>ƒuGR2è¶—ëh7ü!-˜‡eøK¼1ûAkËÒéóUèØ*ayju«‰iñ#%^ôD`Wljàå76îôxÏÁ8V´Ó&t6=.O‰ÕÚ|R­" t+«´wŒ2ð±Ú®w•KÝ@„ÄB³‚‡büõ–\*’ $Œ‘×ʸ—ÃuðïÎÑ-ÏN–Ö=•µCŽ2£r¸A>JןHi}J¶÷Ž«öG4“FÌjcòæ%ó P§8ɶ3Ö)âU`=ü•òúd‹(ÍV€ÓV欫ò®ð)9HÓA ecåí`C.7ƒêfeÚ0H=2–2£‹DÄ~eLn³œ|“ý¾ÙSp¡€Åg·]<™eªŠ •š "ó=!Œ«¸‡Z¾Å‡ %øñM§9ÐZ4ehàqÐZØžc@“ݼ4ÑÕ×z+ä4’i‹¤ôñ‚ž»Ì‚º¢ •&)Õ„EÝ•š8vªc „ǪŸÚÌ rÌÏ_5£B"Øyºl¥ðLiê zÊ«à™Äδ üB–7Úœ¢Æ»HTØÃw`Ž•SŠT‚çç¯æþ)µÂÁ7>‰µm¶üÒÅUF“^cß o¬jd^ÄtEyÛ•sƒ–7EŠÆ±Ä:Ë0áéºÑ'Ü'»UR š¦ €+Rí!7Vg‘œq¹C!RumŠ;þfˆ9^-ã󷾫A˜zbá·ê˜‚U]ˆ¤˽Ú0Õæª)¶,n̦⺕.v3Ë'‹œÔàƒM|O]w@\!‘ºz¶Isø±Ke£·ÙÞfd¨‚”¯Q¼l.q…V%e*Ç$(ç=&¦!ït¼UªVvmuºâåw¦Z“¦XÅ,¯.@§§@6Â%’7Ýff€3a‡««nâ-4 ¸ÛA}w´ˆÛ¯’¬{Svý“ÊZõE|¢+¤…TÄ’Ç,­.ú}À¹@ÊÌ â<(lR…'¬ãŽhÌã¦Üùk¿;Æ·Viaêä~Ém6”Ô’ÔT*VܧtTxÓâÙ¶¨ƒ`2Œ£-Á Ÿ¼@Éá‹t‚gÞ¼üT»ñÝ߯é@²j‰*ª²¦Ö-Ò¼dM5ne†UF,bTD݆m¼*îË7ôÇb)D‹ÇÏçì 8IòJ´ü´él¢’šýIz ±=M9˜$rù¬ Ä;rI >äˆ' £]ÑPŒ„AÜô˜Ük‰×óý%¯_2_⌤.Í(’%E‚2²4’¸ RŽûÈNKmMQ΀Ós¥•ƒ†‹4óåø@¢®¹®3ÇK@¬rÖV†YQ”©’DÙåñæp}A±¸÷íswF÷·Ë[ü”‚Ö ñQˆÒãn«©Z ®•¬·Zšé'’8ÃvȬl 1g 0Õ²âá. ÀšNŸÙQQÍÿTãtÔSVÕJ¢Š¾¹ GÍId*gaR V3’ÀõTÒk]s¯]Òk¹ÄVªÿo¦¸W\á­Gx*f,í4žÁ `“»#% ‚Bòçw³gd5÷ä©öç÷Š?¬^ øŒî„ R¢²ª–W¥È´x’›ø ÔëPv/©™_q^r€’\ØùÐç<þßT®$ΞtžLÝêÒÚŸY oX)}mäù…•qâ$¨9R[Žù«™ùC¤ôä7\0¤ÆYImö¯T®–}O eküÍUM36U™£‰ØU`‚¨ÇÞ j¥sLA‘à´šœ5¤™31º_{¿ C|ºÎWNÐUT9¨øT"šŽ˜Žž]±GÉ5È{(¡Æ:³ÝR›Ãlß!·‚UwÓÍ”ÙBk)â˜T@±UÕúÖ-»Ãy*y Êç#Žùcª‡ˆÔ-†¶d¬§aj:rŸ9Ý(·[a‰jLõ“Qì´aùª0ÀÀyaØ{pzÏ~"©ÿRŠ:Á Ï¿í:ÔTRÓI4ñÊÕÈǤÈî©þcr;°xÁ9ïÑ3ü¢6¶£s3{¨åMÒòìÓX£·ÓÂà(y•\œ‚X( €8ÛÛ8ù†gfïoÕIް֓ªÈî·fŠ6ëµE•QR¹±l2“H;³Œ|ùê^Ù9‡Ì¨v=ŦMüU¾Þ)å·==TðÖÒTŠÊ6£§už*AY¢™dq±Hta·Ç=j`ßR™¥Ý7¸&|Š£‹â.4OsÍ5Mq–ªJz“vªJf23ï ™°;YrKö9,I?œš —‰:ê~êpØîì¹ß ¥–Øtû|<÷ú«„È*Sù0$1‡ˆdmÜ[1¸ m%J甀TìpœV¬Ù«'EÎ2zBž]57‡ (_Ixyl²ˆÿ“$õÿ+U¨`ë2£TJ ¨Ê˜ÎÀÐl¬¸ÈôXÎ'ÃW5:zkµ•¯Ãxž )RZt…Îy/Ú‹ÃCy±,sAåèªéc£’HÁ,”ÑÆé†ÜɹÕïV£hÜÃpú†šÆŽcqªß¥MŽ9â}ÊkÓÕÚß©ë(|UðóVét¤¤’ªŽèÔoJÏNèŒ0–¥¢˜2«I½‘`•%¹O† ìN ´¹÷õ•v‰mG‘¤é«šKv±¹WÞ(è¯ZNÙm–_lŽY©ã–Z 27™ŸˆŒæ1º(× ‚Ê eÔàáÖ¦rÎ<£Iâ¡yÊ@áA-zšÝ~¾ÖP^µT£»½ºâÖåIê­±•Èv¦œDŽÛŠÊZ5hØÞ:¡‹ÀS à+¹À’ jt‘qn«/ t;mÔ‚­®ÐÅQMºþZS-S½3,ÓK©rÑÆìJ…#‚TÄú˜„p·P{ÚÀI$éh¤z¥3Ùg-ƒ Çß´‡ÛÄ[ÕÎãᧇÔÿ¦mõB&’;t‘Ô>ø•%Év(wVË}ï0±zý#ðŸÀ”@ªÿ¹àðë Î?=Qß÷à¹oÿöª¬DÖJw¼Ó!AM-SÖ-RU¢©Tó‹Eæ…æ1¼M.åfó6 {: µ¢HÐÍ„G=ãÄ¡ áÝEi>ÐED‘QZmpAWw·hEÙïÔkR\mùþÐç-d'ÑBéõÖ¡E)©í¶Ú+ìu’ÃðÙª§òâÜÌÓy¡X+‚$,¡[î«PÜÄÓ¡®—©0/ám: «TpÌý,š/z±ZÕHµ[«*|Æzª˜éç˜F€>ýˆdi2¡€\i Ѹ²×ÃðÂê……ð´öä#è9®©Ä[”Ú<’û~¤±_è ¨©®¡¹Ñ֫枺”fsŒld‘FõylsžGnqHak6¦`b7ú'³Óß@LúŽê*&±WÚì4z…^Y*Ö‚ ¸©’€ùeÖAML&d1¶Ô`í ž »…Áµ¥Í{îE I'ÆDÔß’]\`leò?dš÷®Žü]ǧ‚YÊ‚öù"©”Ç#I剜`.A-¹ YNíÓO‡šoÌØ˜æ½¹ëmôUëbÞ;x¼‘Sp¦O:ÑU|ª±o3KRðM%$.ƒ±X£aS’ƒhö7hðö¹À˜Ìmb/$¨­Š/9/mâÉEÂíyK}wÁA§µEâ’B´°×T,Í/˜ RRr"ÀÍuur †b ®s˜Í hÌyXKGÌx¨uRAs®’QÝ`Y£¨§†JJ˜¬•Bï es¥SÒ ò3…ÆÜ0S${÷õ*”€f=ûÝèa½SVÍE’ßQ M PF‰ @îÌ VCãR‘´:œ/h+½’Ä{÷!AyË-ÕoµWCkµ<×û…Æ©bfÍ4‘0/×y%•—'Òˆ,_qïž§M¯­Ú— ×h×KB.Ñî°ñ MM]¢ ŒK¨«ÚÛþ}%>Å–*—XÙ³²E—Ó!`»ƒR¤RÀ¸Sî_™)ö…Gsß°‘Ë¡Ž±á¸ÞïõUT’TQ4ÑI´«®wBÊî\2»v“–Ë;þ5üéóÞUjõÞrëõ]5Ä ¹åž Eh¾&dH¼•¦u€a昨ÊÛ‹¨b£9 ~÷—ÃÔx 8XrëÈ{ •ë´¶²š4¸^-ךÈã±Ùž%g[X•Ò:¶šF¨y#WTóü£•eÓ–"Õ|sCÖ êuŽQ±ë7Ñ?ƒ3±h6æ¤ô—j{U¶ôæ’¾ÃxzxhÑ⧉°ñI1WÞìæ>sžþ‚ÊTœcá²´‡8H7å×ë·HZU1©0þ•yt¼×TÔÎËVeˆO$’¤H@ÎI#ïèÎ{“žNz*•©þ×-þ‹Íº£ª<4X+û²nHÅÆª«–¢“syàFÞX«¢$r3z[#ê=óÖ^-ÔØ{6Ÿ‘÷ùVèàûà¼[š[¨ª4]‰M_þ]Okõz–¿(N]B0°Þ3»jÌôŒ>­h4ncݺ&bqøG³.LUp4¤¯"˜#I$ÔÌònV†VŒö`@É$÷#-×ÇÖ¦t‚³jñZ$Å# { = áZ©kMîûÀÉU$òDc1ð `³³>Ç–ÀÀåìÏL‡7m¼¼X™·®é-ïQ]o÷®¥¨Õ5ÚŽé_Rd¬¨¨¨Û,ÓË‚vÇÎÉc–%½û³‰uWš•ÍÉ÷Óé C ú’s\¤÷z á†Jë}4òfiá­¹ª(‹*—r”pG¨ êÛ² g$ÎR1Úº<÷òù*­¨ðém¡fz›åKYnšÏ)I$«²©cÀ(#ãvI㹦ժÆFBŠ:î¹¾ýê¤`G@—•ñ ŸÌòB€=-Ç¡N;•ÿ1Î2H½Iù™Ý6]Kç:,Š»ÑÓAD+­±Gx†¢=Æu•ð7„o¶à!À8Rsžµ1<͇´ËO%è¸{ÇÒ ´ uQ‰¨µÅ|MÊŠ ‰•䥒Y"P£x2Hì¥Üå·ùzºQ¤ì™¯ïÂVV:Ž"FF‚<4óRÿ¼Z¼èûÌŽÓªìf±|¹á[„‚¦†¤VT¨§4sÆpªQÎ\“w‡qlEæf¿/C ¿ ☖TÖ Ûoªš\uµn¼Š¢\›§OHûžª W¬Ù·òâ)+HÆ7 /©²1¼8…LWþ«ò¸G®ËÝ7ú“œØîê<=ð–ó¦tÕŠZ‚Ã|¦¼ù”žmÅHæ6’­´Ðd2Da¤ËÓð¢ÏIÔ¸f.o´‘i¯Š¸ÚÜC€Žª–Ö÷í3eÔšÆÃ«¿ßõ5,žmÆJúØêêí{•IYÔFÒ!uJJíu, õ‹Wƒçp¯QÓ ¸<ÉŽ¡gc¨a¥Â©&7ÕU>2xoQ㞸é›f°·øW¥¤^–›ÆÜê*•ƒîŽ«ÏX×-QUÏvѳ«âN« ÿ§/ªÛŽô Ò;ÉŽ„ª•ñL¬Ø£b"Ðys\Õ£¿ÃóFÙ&ª¾Wø£ãæ¼SXnR[i ZIFÑÉfq•c*ìfÀYF1÷·?çlK£.¡¿üø”ÙTmP»<µô)êÅþÓÜ«çÔµÚóPÔÑ‘AêIåÜKfã8GP£ËޠŶ6Ý€gñóÏxˇ¦Ö_‘qõ$iÿÅY¥…ÄöÀóó×ì¦w?°Ù±®wÛõãøõ¢ª¢¤3ïª]\CKa¢ë+nZ޶á²ê üFJ'·, s O¤¢«±bï+y]ÅIÆÑÐ?̆›?h3âwäŒâ«¹ýG÷cùM­5E<µB8’hÌB(ÝmòF~“±rĹ#yÉaZƒÁlÌ{eZ¤µÇ!ð÷â™åÔ´5 7šHÉ£Aå#&à»%mÊãÔ}éB˜ï:U†×q7ýú£f¼IªT¤©«¼RK Ty®V6 cj©‡$#²ä¶â¤° ã¦À\A°ü)~1ÐA¹(ÇÔ•âºzzƒJ.I)æ¨IJ¸Èd\eYŽw«pÞœnè±8fŸ’E*•*T¸Ö÷è‘U×V‡¤ø©Ö™ªf‘cxç!Žà¾Wò˯ÿfÞ¾œ7´ ¬¥˜fÜ\ÿJ˪·6Wû 1_Ss[…*KI©X• g’VÄ’©uVh¢’Ut(ž‰w´ÁJ†8 £TµÍi4€gYõÑWÅâ© Mö¿»$4wJšCM+ÖSË1¯Rë:´°®å$o(Ì.#‚p¥é50夳N^ýÚéÔáÐIŽ~ýÊmjɪ#ž3j§–Íå¶ê”ªØÒ/BÄFÌḞ$‚6°®®¶¿¤{ŸÂçÓ=Ë€9­jY5-¦¶Eªj«uaÜ mÇÍØgà© )áŽî2@Ï)§ßas]õ¾ÞʯV­Fºí×Ó¢‡_oô7;5 kÚ))+!3Iç×™Y¤V"4Œ÷ËîFÕ,ßœ.:eôÜ`Èéo3ãoº3^`uB®¸%ÂÔjmÚ²š’5¨qʹ,qT„pèµr É 6‡vIQ’pÍÂð×µùÓmLÌuER³ÜG2TÚºúÛy­ÔZ£\ÓÓDÔ‘´4†ZŠX'@ê'–¥BF.ý͵ˆBTjÖ8j”òR¤IÞ3xÓÆ›„4«½¿¼ÝNõh¨¹Ð¼õšgS\X|ê÷òþ$3>H[$«2¸ìÀ°ë?ÜŒÌÑ”}ùê}Ù[f%®xŽŠ?¨©®š~)4,6KlFX÷Ó\'Ph œÁ0ŒNÌÅU•Ýò¥\ú‚.˘LM:Î/® p#r#Q1ÒUZÎ-­Óǯ²ƒWqÔ¶é.rWëÝUaš®§Ì5Ô°Ó:¬³1w‰ƒÄ±˜Ô†6IV$íÌÒ­MÑ–˜04’ ·ÖdêcmµUë×sˆÁ%~ºj;®ÙMjÒ^øª`Û:Tj)iÀór<È¢*•\˜ÕƒdÁ»G Ú‘Z£©³ÿŒ›lE÷µìÐþ«/pí,зoëâk~§Ñ–KTô,óRÔZ.ò™7<Šg·€Ç˸`îp«ºA‚3xÕ=7…¨Lë-‘#×qãdÆÕ«f4_ßÊêGNÕ—Ëem »MY*®á㮆‰i*ªb|ÊÑí,ƒ*0Ò§ •%¾ïMsé0Éq‚zOÌúú$Ot‡j¿åhÙ®–ziª´Õ²Ù2ÕK¾J(#‰dw9É.Êå%Ì\œ¶y ÂëbYQÃ;‰|…£Ãð™©Ì¹.݈Zަ6´[Úæ"qHô¨ "òK—%‰,DJ¥ÛÓ’ L7‡«J©¬ pÉk Ö ÷™UT>dÚpîgš˜äyã¯ÔV™h5,Q¬":y‚lUˆ#oH e\>J‘Œc«®£4ˆdÏãr5¶ÊØÄTk˜\Øðë·+¨Ýúá•Õuk5DMæ'ÄUÚ¤±Rá hYG¥”ßßIÏIxm*røé õùräS^sŒÕ5'Þ‰m¾ß]6ûU\Õµe¸U¤²I-BEµvӄ©Ǩ#aw u‰ˆâtòæ6Ø$ʳF"AÕJíutqÍq’®Ó¦RÖ* hÉNÒBºm^Á°£†8õõ^f¹ç´lÈÞÿª Fp2»DÁv¹iT®·yv8â6¦X+O‡Wq`.rX ÎzÐÂpЧ¿šga:ûëæ°¿â©‡INEuUMþ)´—†Ú‹RÄ OMM§Þé‚ú¸>ã,ª²“)U*®*1ë¸=ý·ýûB~ÜÛr2&/šÎD;3šˆQ:dzÖ\c ¤Òõ”QV¿G%MdÑ•OO—JY]b0Á”sŽ«¿„=î% ˆ<­ôÛ’²Ü%0{¢)¬½uMŽ mÞ Jóˆb·ÛíóÍ,Ò»eSà• +úU}p6“Õ*<­gI¥ÎäŸ …~ ÙïÞŠ%}Ѻ·DÜj,Ú›J_´– ¦Á1×$”•k¸; ÔÒ,rá$e}œãß‚jâøK°Ç-`ZîN}oæ©WÂ>4¶É„T\`§©¬þ|RB<ÇV¤†=+‚Œ¼eÁÜ}Mò=UD:ê«©×a‘ ºq£×ÐEC+GX÷ï‘+U$mÙÜT’>ñäÙ9¹sö;;,¬ÑÅ=’Xï|”‚éâeêzÚ‹•º¾¦¯ÌS5Gðè#i[=Êåpİ'ðÏ[¯‹Ä< î˜÷Ëä‹Å+¹Ä9ÆÞˆÇ(®/nš¯âª*iâÛO B<&Ÿ“”FÃév6âwx٥ī4eÌcÆÊF>¾BÖ¼Ç=ÑÍ%%M}MÆH"øš™Vi6Fr91´h±£FÀUv†æNy¼EÍ9ËC¯pE¼Ò*qç"Ÿd,=튢џe›möšñámªšé©ié’Ýn †çê§ÎO•åHcOˆ–BÈ&œ³72œçe¼gÄÙÙ8‚ÂA'yÚúÇAnsd¯Ð<‹¾~©ÌX¸^)¢ZùiãŠ,°VªÈGŠg.ñí* mÁ+ïXê)í¼¦ãåîk n‡<ÅÏ¿¢&JOíW |u°T®­fD¥zÊæóªcbÅ™³o•Á™•QP¡9ÆÂ£hœv<Ðs›!£X+iÌš˜‚Üq‚wÑ:jÛ6¬Žx.ÚŽkÅb•ÏñAÆ©O@ܹžB}D« ®ÆCÖáÜgô£3i‚|$~WìÃÝΟèÂ6³OÞj¦¼WÚu¥òLçe5M\ÓQBÍê4ñFåqò$ ÂmÜ 0uÚNâ8zõK\ÐÐ/ë}¹ú¥ Y˜KdxóRHTÔLb©¯§5¯Ó´‘®ÏYyË%¹RyË€J‘Œ”©}6À“îÞÊØ¢çeÍ'æƒ_Qe)[îôutì'}®&Rv0%‘F!]¡¸åŽ@Èfj¢žV‹²²DŒÄRI¬ÖZjkíæÞõRA$Aä‘ç4xr ³¢¤XãØõjž-îgfI¾ÛNS£4>ÿ¤y°é?‰¹I2êË \¨é$éä6/KóU”«‚þÞ¦@ý ±u(œ¯<|¹onqæ›KKsÉÛÓ–ê pÓ•4•WÛ¸x}s¨ª0ÔGöI¦†»[ÖÂÀ«HF!TÆ­&}#vþIÍ‚#[€d΀è4¬xÛèf{A3ãÔtëmÓe–ÎÚ~¦ùWd´Úà·O<žP´QΟ )mŒðÒ² UÎòìÈÎÅÃd*àô²Wp/'8‹“Ós:mµÕhdæ¿?å>Gu·¥DïWk¶U@µci¢’Š Nbx°È¤,r #;°É$ª*Pi2 “ê’Úòc.Š·«¯ž¢²™´¥%®I Æ‘ëŒSËAæBã%•G—˜’]Àÿ0:•tÛ˜sÊloË]Ó˜êoE”R‹|–HeŽÜõ—(¦†”¸ª¦“ü¬wÊF;—²·æ O ÷5ã3 SËÖ=Âf!4Î[… ¢Ð^Tê[fª©Ð–:›­51zsWQ;Nrø2î°íÆìlävDCOÆS¤pý¡ÊLÝuò·×Um h¹òþ{ šjzÈŽé/À ©mpEðáßÌý¥¼µ-÷6g‘–$¨³Åšö—5·¶äô›Gœï;Y@@/:Ïð¬K‡þ7c‚¶½ÖÂ|Çd¨ƒ.ÂÀ2°PIèp¬HSœ’¥‡Yíap¯-ô·¿D, Û°ºHßß$ÙYÂ:Ê)ª¯WŠ3"´¦¦™’Ì®Ü$UØþ‚¼d`±e=/`àcÃß?aTÅQn|€•xeÓ¦Ó9TÝÖ)Z¾­âZŠª„þ[.ÕMdn éSée#4é—Tqh!¤îl;ÞÝuæ©~šòI4Ž÷gµÝ£¨†±ä†¢®6¸ ¼IuRÂÈX.'.‰–HÐHx ª‰ävö˜#Cí›s¸yưžÐƶIºK§#¼^muqø*¨ÉÆñS]mä‰[rí˜.Z0Ä©T`G#nIã‡cÜÆâ3^fà,}謂Â\/¢šÇEh¯Hö-¢àÏ"HÒyW-¸«Fv©RÊì=$œ÷fë*­w6!ÅÑÓm@¾ª ”ïmPémµÑܪ&·Òâ‰#óU)‘cÁ*ãjˆÀÜÁ²AÜy¤Ê´Ú%Ó"þ½#¯’°—Dý—gj-â_ƒúÖ¿Ex™W_cik`7J“HÁ÷:ÖC6PËHÍ!•Z+*“µ›ùg«OàõpØ‚Ì[ 2æÆÑhÖu²Ê.ªÉapññU¨«ª¬ÑôµT¯¬é5±­”ÈûmÒÙiá<*áêÞ­¿–|ö éeØÂþ6¾´)µÙæä›G†¾*»ÅFÑŒÝáç~‰–mO¦Sv¤¦¤ž­¡Æ ˜Þ±¿h£rÃïNInÑטÂpGcß–‰µÎ±aÉjp j½Ý°“ך"—ÄÕ©š­é­m«tò¬±TI¾UgË/±˜pçQTäeÔ…\:8ï‚háég¨ü†AŒÂO+kmþ«zµJtŽWØøþ}òVf“ÔV_üºÃ‰–‰ížÏKÞn6Eâ(˜+ùqSBD’;»´;¤eª, 3»( ༃¾§ÿ“T·•‰3ÎH">~J‰¬ê‡(ÒÚÃ/$²Ü<2Òu¾ è}CŠª ˆž{ÒæÎ<É#ÿ亱1‰!I¤Y&Á öá ¦Eg:“›"A4"ë?}sj½”ˆ‘7ZпiYiÑZ“Mè}Sã7ƒΦ¾¦Ça¤IhV‚GBK_1z‰*‘1cÇ*È ¦P§®¯ÄO¦Y†¬Øs¤4–úßS©¹ðL5ÃÄ{úª†óöÐÕ±iûÞš¼Ý¼dÔ4úÂýÚémºVÒÊÕÕT‘R¤pÏ? I©vÅLÞSŠpY™Ë\¯]5Ül'¬Í·‚Wë`î—þh}šù*ïHý™ü{Ô7kMo‡^#ØiMl”K%ðSå<ĉ x¡Ps´>¥Mι˜o1N~WÓ€GûH„Ì? ¹m´×_ÆŠô¶‡ïwjø©ãÕ&Zƒ]-¯K{…ÇÌ:Ÿ.òÈXH1–W Î8Ñâìiÿf.ãöº¶Þ ÌÐQâoÙ^ix,Uw›|×;…mDMG_QUF"ª»ë|††PD…’Uf‡b.÷RÄ¢þ4®Êj=ÏÇä¸ð nç_ßÍYZsìÅûÀ]I¨éü/Ôµž"išøë5N¡²ê”¸Ú(¨FCn¥tÁcE„·ò<Åi.ðÞ‡ð>a²ÓiÌæ;ìm7¤rW°ü&›-'œî¨+~ªðÓEhÍS§Šuc¸ÿëf#Ƶ‡%ı͋؟IZtþÆÔhym½?´—Wx©<9µÛüCÔ6.º ž­,Ës¶ÌÕôÔ· !vŠ €U3²«¤+3m˜£!”õƒÄ¸}pÂZnuõòù J⥈°<´P=#¦-´––žÅo·Ø æÖRÒÑÓÓnVRHT·¾@cèÈa€Á=yÜ{q5_ž£Ë¢$íç÷ºÂ¨Ênaa¦©úí¥5÷X®MsÖVúº2êa³ÑŲ 8õ™ é+È„6á<0 jÿɲRsXC·v£”i}÷ßeÏ¢Êm,È ‰Ö „áQ-–žåÆÚ€9%bf dï*íê“Ý}Cq;zÁ©Œ¤Îí2z*á3{ s×]}óH ¹QÅj¬øÊ4«Š4ß>Á¾hŸnXªçÌÆÅ# 20;Ž´°ÏÎîë «ôZìÆyjŒ»\®é2RYm&‡â#+4UœÓ ®ï…_c=#îpÝÉé´ëáÀ—ÕØØ¤y+­y $sü¨K^¯—;l·åÕÚ¶ËDvBLEÓ0`T».ðŠÿÊI;óG;U)5µ2åpÞzr´Ï½S)=Å’ÓÒ”6¢ÕzbÓ­õEE®DX¼êŒ‘%K¤f?6Bªwä7-³r¤Ã0tñÎ"þCíäS[‰{iÓꈄWÕ‰J))¦œX§e-»$)•äVua´ífS´ç%²Vö‚Li{ýö]Z¾wgqÊ-ïÉ1˜`£2YëhVßn3Ï8Žžc@PWòÓ,ÿmÁÏ Í :ÎgX¦-Îè*Ôíî½-%4sJû]\bo(GO³†P_âæÜîBŸJüB;° îE rGÁMÏ¿cUZ¾+³—8L¤ ùéÚŽÝ,Ôäù"*¤jjˆ%,Û!i½'É‚DÛ‚©FV=Xo eF;ÏçÏÂýZ˜ç½ 4Fšôü Õ[Æâó^(*ž J‰)ÚZiÏž¬¥‹;IŸ¹"¡V äb4a›M™F¼Ê¯ˆÄ8›÷`íæ„š;½¼ÐÛõ<Ð×B ITi„Ѩˆ³-¶52’$Á>¼•ê›éöonvÈ;L_çoP­šÎ™a¸ú!I_I©$¶G]¤ë®3ÉÍ£¶Dô’HNÄ€º´j³ä¶¾[I,îyÃ@¿>“:U¦=ÏŽÓp’= ²ý`¤’Þ±Ú(Ò Á]jÇšÁÎÁ·+³·1àòl”³ØWÉRç¡úDëîúXcaÝVíñÇI=Òçm·Yil‹‚ž þS:¡æªYo›Ί9$–m¤óÚNkÞ~@@õ“àˆkˆÏ¨),×K5\µÃøæš¦†–:µŠ¾i Dg`*ÉêÚVØ7í9FÁ*e\#ÚÐH$Ÿ `Üy[œøª¯Ã–¼0ÞÓ¯=’ÉiÚªž*8nz~:9³O(E™ÁÏ’øå‰e-<’ñ„@mÈ$üºsé¬rªTZ/)ŽáOrŠñn¸ézf¿!¯TÄÚ­é0BFâ%H†VÀ>³€F=@»h:‘¥\ätH† i&Aùú”ÚHÄYÙJénöÝeÕ*›žž¾lÔÑÆ&—e>Ì©…nÙeWî½gU¥W³Y±¸åÏ‘õ„ÚÌnLÃ÷<ýéd,×¶Ž–:JºÊš $h–½âyÒ)0\ÆÒE#8‘À³ ò«‚¨ìÄ‹ër9ÄÚ6ê~ª¯jæ /s~ߺë^ý¥¾Õ?gŸ|ðûÆ[µ%>¸Í·Íc©¤K¥M}3[d’qĔի,Ñ©ó˜nE‰÷þ€øëáJ¼K —øªÏÚ4RA1cÈÌn È£V›_û†‹Ïí£¯öJ›–‰Ôöj›.ªµISMQÕ ‚ŽUŒ’Dï…Ùä˜ÑH/–P8;zü«ˆÂb)Ô4^Øx0G¤ôô²œOmL¥ÃKÙQqf’ù=$w9+Afò¥€Âñ)bdXòd Ē'§Ãc­:tNžhƒÐ¤ùÙ>–˜&LžšýSúY/5Õ1Uݪ`þÅE8£øšªa·ppÊàˆØž0JÇ“Ö}Z­pŸ»{•åT©Ãi%ѹ÷à—ÕÚi¥£ªM-R4õ¾šVXžŠirF6Ã$»÷ÀŽB£vÑîz¯K޶„’%Çsªn#Ç’=Òûž¸ñZçC§,$ë=U¬4Ýž&¦´Eu¹ÔMIJ*¶Èf¨!Nwn@Ê*9SÎÐøØÔkC‰xnuÀÛm•:œ(±ÁÏ3÷Hî·;}úQ]üFiê˜é A,¶h(ã’¼3STÞ (* ³O_œªü`â*v„5„ìÑô²ºiáÜ×îG¬týÓQTùVÙ,0[œ¬­SI|³ÿ,ä_4²€’0! å÷¬áÿÑÃSÈ sµ±#kƒ¦¾ª†0ÿŠ–ÐX*¬WkÎÁ?ņrÇ D>Éæ]¨ 6?–X† „˜aBªqC]¢D}:~QÖĹ€Á¶ÿß/%¸\©­ Md³Bg3FË=*–ûãt]Ò0Egu8bG§Ô¡*´º¨sfÞýýÕ:„>C…/¥´Õ@ié-Õu7JÊ(hž®¤Eñ’Èï4ñ«.ˆ]¼ÄÊl»SnÍ …^µ›ˆ¨Övnp ˆtßoå*·sY¶ñ6ñnUK©ÖE¦¤°Ç¨© òMÆÝB¦¤• ÒÏ 1¯šB/ó’4r¡qÀQŠÇ»´/Ãw4»Iq˜ýS)q¡¸7òö|U¹Mö¹ñâÙIi¶Áâ×Új+|uYÃ_jªV×»|ÕQ#00QŒsuÛ·Ã>1âÂ+˜LôZøn&× ÞžýÊ´­_n_´ZŽÜÚšùjײÒFb†¶çGOGw¤‰eŽV„\èc¦š'ß $c2‡Œ1ŒíçW þ@âp¨< /1åâµ0ä: +³ÁÏ´%»Hê*©õ>šÓm¨·ÕvùÖ¦¤°©]ÞtTT.ÌÅÕã’©”Ë'£lˆÝ{žñŒ’Ú­-hë'^ƒÖVƒé¾3E—£5úíõšÜöšÍK¬.wµT«®¢¥´\Þß ì†š®ãGY$5ªÜ±ÇLÊ$I¶CîœCÚ]LŽTË`®S¡ðŸHømU¯¦Ô>xg¢tòpú’åfÒRX¦ž­$‘»Y©jçIG—0‰$õ…3ú|Ðõª¼¸v†Ctéáéµ—gkƒýIáut6;ªiîcIi›ŒkIg»UKQOq𥙄TT.Û”ÛYÖPõn´ê„²<‘µ\f›Ì¸\ûóMcÀhË þ'ø“öI›[Ü´æ¦ÐWüwë_ÄWPM§ïu‘Ç“T‘Ú£¤*Al¥CÌÏè³ùf«¨ÖÃ1ÎÃÞ‰ˆ÷×®û%œ8òz¨ä¯¬¶+L6]ãýu¦Úd‰ënµUŸÃž¨.ÎI>ZÆÒ9x€`(ŒŒ«·“Åcq ¨úN]º"ýsZiÑ:^üvÕMl¼iºý9w°ÑËLT¶ëÍLáC$Sª²Êï4éxUãp»Ô|2ŸÅµ®Ç´·¡}&~šú šÇÕ$Ó¾iÝ~¥»Þí0kíYO%5u¢ûd&¦ˆÇðê#j[‚J•¡¶æŒb6u £ éôûc÷Ó/q˜fzyúè” †žás=ïÁÏí’]j©àÔó[¨ßÉ©¤qÉ æ&ǧ#IX+ 2©V`0Àðïàﺣ,Iåo%q®y³/xѨo[,”Ú¢·UÒÛoõòY䂞rµê‘ynábd ¸¨HЩ`ååp¨øSƒSÏúˆ’Á rÛé>6²:â ²öì½gðí7á¶‚Ö”«tå~›±RiZ*?â/ðú+†J˜%( TS½MŒ¿ÿmÄ–Úu]ˆ-{é¸Aù^ò_Ù·)½:ð§ìÏ¡µ57Ž•!Zu!ѺÂÕÓ›QJµ²I%:Ð$@7›,¸ók"«R¤7+6ÆÎ£Žcq¹±3}ôÂOú°Ü%§šøüðçDÕéJ½Gb¹êMIª.4²V[äº^(ÙÊI±ÀLÈB]ÎÖ„¨ Àø‰¸ë]Pš@0:,ÛUñj|?±..¼÷>­Ê ¢ËQKæ‹„uæi’z‰—ÉÌM™!Ãú€ª€²*å󎼠ø¯¤áRÇ, c^ŸMPv½ÒؼÛùN÷}5«îFÛQnÕ?øýLÆBÑÓÐG6åÛéxåpqŒ2û18€ÊõC„ñ,K…jAÚnGŽš¦68!âAÚoîɦ×ÿÄ£øêÚjŠÙ¨ÄWb)KB9òd ᇘGn(Kar÷qAÄÓ˜Þyë·UVŽ!¬LÉ6>÷J¥º×Q-ê*jkC½r12´DINW +®¶¨#Ä‚1ÈPÄP'!"Û™*ös=¦}û„É-LëR|’îg ®h)ÙT+3.NïA)(b ôç¾ã¨Ú´Ã…G:=OIÛÉ1øÑSÿLO“„vê7šž¢’ïw†­`h\K2ÉI '–ŠÂ2ÁbE s¢"à+ç©cÛU匦]7Òö›}y'RÊfê×ÁC/vI+¬µ7%³IêyëV7¦†[Ïš±@®›ü· –Q°ls²Gc‚µœ-?ûÿìhÌóåÏÅW¨öµ½›Ä—¨ÚK= ¶ªç¢©Órù3*%!fZ‡<“Ÿ‡ˆdÜ ú•êÆwŒÛÌt’<=ò)ŽsiÒ<þ©Â®–YS}\WË; ç¡JjècZ¤”ɹÉÕXÏŸC1+’0@éÔšö‰pð”ÂiO?šÕ]uDÔ§««¢«£UeóãŸÏ¨2Ë#› ˆ¬TÌœÆøvKAhäafWÇS$ù!ÑÞkÅT‹[šúÈ*"µ0âTÞ±24LYLl¡\6m¬Ê¹B½E|=@è6çý¢œã0´ý‡ô˜îñY50k{½µžW’¢©¦†V?òÏÅ™ ²@T"°RFv0(&¬³ÿQ²v6ÓÂ9û…¡†u3LMÌ_ÇO–ê9ª§§–)êL3-TžM]M-YœCæ¨ßäÉêX²;l㱯J£ÞàØ¼L{>¶U FfœbâòÎ-ŠéQä%$òÐ)UM²¶Ö)½ŠŸæ" bw»´qMÁÂ@ÛžÓq×ÞªÕ@nGöšÖi­†)­t·9i2*ÃÇ[,û’¨VPÅ”¨9îØÐÄ’ü5&Ô$ÍÏO²ê¼Aðrj4÷ïÁ"{ÕÖJKý<ësò祒êee¬ŠÇ‰¥)g(G”¶b_Nû8pù‚6¹ñ¼fÜ¥RÄc*æϲ›'³Ø©oÉ«*n¶—jÅhŒu" ³Ô¡ç“ió ²ˆsŒ*(Q†ßr¶9ï£ØÔdÄ™ÈÁÚí>ˆ¢÷9ä:"&Iû)z|TÐ1ÔÚú_"†ˆŠ¨]ä%ÔŽa!™•!•víRªì§¬BÚ!‚׸=9øÎ¢à«o¥QÎË9¾-‘”š’h¦Wþ!i¨·ÂéÍ#ËP³¦r¹ÞÊce)Ý× ÿò•Ôá@™qo–šD×ghhý$gOÔÓAU=ïN¥½O ©ò¸Áã(2*ýå,ã±=Yhÿ°çG!Îúˆ@p×!¿Uîß…ÿâçⱓìw²ø7áo‡÷ÝOâE‹Ä[ÅÞŸãmzWÃ:I¶Ücø© HQ÷VL²(UAJaII}¿¨¸oÄxj­cÝb|õˆ~£Ü-:œ8æs[p>kœ>ÚþiS]kš …’iR°GDV~»6C¶î »ƒÐ¶›‰ÊŸÚ:”ZöÛm’vZ9áºÌk¨#’ºhjëÝHRqµ"pwýïò€Ã=ÁëB ð K7çËMý••W U³“DÙv¸é«¾ÛYOYO{¼5)z«}U=E,“RO'‰T¬žn (É‚™'‘ØŽ7‚ã)0â H½·ç w†UÅÓ½BàJ+k¡«+%†ãu–iÊ ØØ=dŽJʸÞ(Q–'=ÈaöÕiË…£¢Öž\wÝK§ñ7SÛ­¶;š¦ªYÝÞEVÊbÛ¼°,£xúqÖ— ø–£Hn!Ç/=V°Æehn[iï¢è㎟Ðznß~5v*F_̸iøè"•Ä1(Ø”÷ c’•Ö}ó´¨ñ†@Yõlëêx/Š08vC Áùrù+Lº${¼#­þ5ÒW»G†öZ=?i²ÕZ¤K‰¢{›PËÕZ*¸¤Š¢Ú&*±…©`Ì„™Cu°ÿ‡0U¤h“sp4×Sæ»þ¢s8ÆÞ>Ïš¾-ÿk»U%¾žÙádžúJézhêië­Tº¶iª¦ª‚$ÕÂv¨Âå¦e’]äºÌ•†ƒþ5¤Öö€Öt÷ùUÞZ-<º^êýÑŸhß<`JÖÕtÖM ®EdsBfÔ÷m× ièÕjR¤HòдÅið•/#$¡ã–de"£S ÇðxŠšàN“ë!Ù‚æÝsâ$³\'ÏÄ»þ bª¤—â›Í¼B*‚-=kÀ­A,SÔ´sLj–$(ü•óxž2H.¸ÐAß™åü+ôêèÑTö¯mºn‘-ÚUéí4õj yé'ŠîÆi%òjËlaW/´á3µ½EÊuœþ0ÖŒ³ÆT ‚…»Å /EGªªcÓú.ïT*(a¦©»|7‘’,ˆ²QÇæâ(ö(_¨pQC&7ÄžbéñL¦ê¬x 6k åÌõÑ(>›bFžŸ•jZ´Ö¡ºò·Rè»ì~UGoW­µ]© ’¾æê'¦†œãF2Et@Å‚TÇ;"ãËH‡¢ÃaÚü3™ŠÓD ð)*ã˜æ¼´ÿÝ3áÕÞ]4%«Å3â—\U[5¶ýkžš¦‚*›r´rI#jy#–B¬‘ÄïæïMÊ£­Ï‡iáš_NŒ‡€ Íã¤úÛì®à¨T®ó’ñ뺌‡7Ûõ¢õޏ·ÐUÔXm·©LÕ+#|OÃTÍMLµœ¯%|&©`©P§p'¬‰(µ‡;úºi ÜðœùH¾kèËìáöÏžùáݶz½Iæçêšhm7ÁwyÙ¦¥£9CPe’¤!“%wQ׆ÄWtŸUè)`CœÞþËçwÇ~šÓßh?t5§ZÇ­+mw£ñ"ŠÓ8’9ªŠM:̱ÈôÊÐTÍ-;L€§ÿJâq^iP5¤d‹éÝ6›Îœþñ¥&àø…lNlŽ"yoï¢Gl»jqC;D‰M Âà…;€òÏ}Ï‚X``íǹñM©MÒ?~ú/ì}C0ØÓÎÕΩê"«¹ÔÛ$óV3#!–q JÍÇrWÕ–‡pçHp2}òVpôXó˜fÿt¶ 4¥òšD:Å]—bTZjÖ)¦“aàã™0r£n >8=^¥QÔ\s4k;õ¿ª´Üé4ý@ö‹u3BQÕCH¦rõѼÒBrg‘êÖBä Ü `UUn¦&³kÔÌ3XX=ÔﺇÑÊH:ím4MTÚÛNÜívZéfÉ]2­¤ÕSJô—%q¿ošÑ"gk±1 ½XÊ“£S„Ö£zŒ05ÒGÌûÒBºügG;ÎP9ï¿©þ UbÒz®Ýn¶ëm¯P,MñGUn„£a%Æ…£ Ž.È#ªô8–&ƒ³Ð–5éÓrFÖ¥W¼ÍýüÓeO†v9æ²Ã-ª:ª‚iªéi-¢z(9;à ÌìAVFÚ[yCÕüÄ.iqyÊcrfÑÌNŸ%8Œ;ÌI¸÷ü|Òª½] Qj’ð–Ùª–X« ÄÁˆÃ°Ær„¶Ò¢õ2ÒÜÝ@ГõW(p’ùm3ø¸B}9KpÓ)t­xéI;ÄâjÑ4YVbEó `ñ£ «z¯‡}GUÈ$°ÿ~º«'ÓM¥±#Oá]!q’.Ky¼é[{FôpU@a„WÕÄ6S(•ƒoŒ°7(ä°hþ±ôˆÌÂ|AÓÂB¨pÌc4ˆÚ51´ª†õvÓ–!m¼VÑ«‰d‚s§ hæUHP$ó˜Bú‘L›ƒ+1;Fѿө„5±MÖ m®ƒŸÓuZ†"›ÞN]l~©ÎÓ®ìMT¶o?PSÔı̦xª! ©²ñ­,…vΦ2K¹AU·)Œgâ¸uzQR¨lˆ ¸E®&×ÒcŸ"iâüÅ­½ùý¹® Ú:šM?Qu³×йb–˜ÄîЬLÑÈGóI#Ú 12rs_†¬Ò ïãýgEb:fŸg7ûîR Ù¢ªU¹Ù.FÙ;ÆbJJú7Øà´NÎcBò1‰EpàF„¦=ez`ªè4ª´:úfâÒ#h¹ Õ*ôÈkÁóü¨vŸ×ºâžá®,S^ü6·ÔШú‹9¯–±Q$'ͨŽH Cœ$…›Ý9#­ìOÀµ”ëSH3! Mã)I˜7)‡-iRüŽùWOUo»ÖÛêªØ$ò-²=èa £ù[•ùÜCm3',Ç~Nêoš %¼È×c:Øç`J©^»Ü`ÄïáÅ FZ{Yòë\CJtªiˆÑ¶M,F2KÈ’bra[J¸kœ MÝß¿9:OHcUšY"[rmÿùü§J;Æ–¢ÆÓ÷w·ÕÉ ƒÏ´”‰cÉódaçlŒ+Xzy ê,:Îv ¥2A#»­ý—åc·([¸:ÈNÑøMUµ4V[mªïÙZ²/·ÁO|¦Hè£2">’ÄÈw)<–å Z¦çHfúßm¼Äz¥W ÷©ƒ¯¿U ’ -¦zÊú 5£.”Ò" H©)Å1§Lêc“Ì1ŒùYÚÌžö^¶iÔ/=çγ}­{¿¹Je:—:{óÝweº}nª¬½xüIouôíbøÚ±Lµ/mëZ¡N’F@ZA›‘.J¶ðÞ~†"¥ ¦Ž4Ûûf×±ˆ˜ÖDô²xysÏfã]-‡Jß)f¾ nÔõ³¬7,ÌŠ—é˜;ÆÂ/5cHÁ‹bubÒDwz¼oÃèÊD4œÄ˜¹¿Y审 jÂæÖæ¯¤]´Î»ÔÔÔ>>Åv’KMœ=ÖïIq £A ¦hê¥fެ§œÌ´0fbWiµÆ¸ÿÅàÝ@ªÐdmiß®†ê¶!Žu<®ýÞvÕE|£¬¨¡Z: ™©édB²ÓTÒ<2À+D’%N)îÄa•¶ üˆ¦ >zXÿ%çâž+ç5^±îqm—:XÒ–{„r‰Óâ#‚1¾}là m(l=;·.8£QÔŒ¸6Eýû”æaª¶Hñ÷ç(VÚùVãˆSÜ)çU¨‚’)¡/µS$ ³8qÁ#“ŒŒü^Pécrž°N›ÿK ]ôêq#]¶)ê£o6¸\:¤ôÒI+ª–q„þaaÉ œ:TŽwŒf~¦£Œ½»íáóZŒ¬ê¢Iå'6ù¦¬žº¶ë­YTG–;I;B©s’Fö …##§Õ¬CCoV=nr[®Ò–R5UÓRMÿŽÝ“dЙ„14¯¹eUX£DØ0«°ÆÐÀvÁ†c*5Ù æ~g[ýB[¸[È—ºãÊQ”ÔW­´6ë)³‰*kJrc "l¿<±uQ»ï\§ˆ-9ýýÕŠ&æ!-†É-=dÂæf¥Q(0ÏHçnÖòü¸Žè̆BY˜ÎÒ¿ä#«ò`î‹ó÷´ 9ø vÐØ]³CéÙ¨'·é{ÇDo‰^(øƒâw„ºËÂKöºÔ²S\m f4‹pÄVGx©¤EÎhdttó ­UòÊã‹/Š8žMÕ®ÐDÚ%»ú‰Zü›¨âV ƒ1ëkyÚë„>Á>Kâ÷Ú/Bè€k¾ŸË»ËQùR•P@.à98 ¹=_dø‰ÔKÎÞù/®pêyªÛEõ}ö§ûZ¾ÏßcßüUÓö;V¦×±ÿ ¤µ­–ÞñAr×RRÍyòdft¯šÏœ¹tŽBæ6*àuò®7Ãk.u3ÞÚÓ>åXââ8}ˆÁÀªØË0è3Ȉ0.>bËçŽýäCOUõÐH‰,Õ$ײ–ŸvHÃ+<¤ÿœ±9äüÀ6¥W’ùs‰ñðEù낯X—º§xÉ3©$É'©2S]$´WzjºôŠÛTLµ‰QHdrpC:[`ñ°'<ÈÆ¶ƒâªMŒ:*¸/†ëTiªn=Ý#Ñþ!imC-TT+]]Ò7q59o*¢ ÈÅ,EŠ£ãkÃéÎpžÆa²µì ì|÷ ³°.¤ãÓÁU]YW5ÂJ$–Š¢¨2JRºeŽUL82FKÚÂ6 @d`o»Öm1P4¸íàSõ-æ±¶ûé>D ¨«¡º--MòëA]NŽ*iv‚î±6\¬Ùe€úrCÜÐrÛ™¶ûíä£ú¬qÖ<|Tº‡]Ý’Ò Œz†Ž¾UwzH\BÎÞ¢â,²ƒ´È/éîqž‚2COu£c·¿KÙ â™  ûå²A«(+&¤™¢ø|àõ%dVPßæVFÛ!\€À'±'Œõf“­o¯¹TÙ‰Ì>þÇÏ¢Vµ´±@i*4ÜdZZ˜™O”6(*¤/k2†r…¶•ÛžsÓLµ® Óó?‹ˆZ4ßP?;â¿NI<óùFH¹SF±ÉQU$ÒC$ Óʲ Û½ n]£-•Ai:GK«¬Ä´41ß»¡÷¢c¬Óz~qÜ`·\žIPF*ö—¦–7-•R¹EƒÀmà¸dtø…v³þ«kèuÓ[*ÔÚæÔ/{I÷ýÿ)Ùôî’´ÜiïÐi»=â¶šJttha2F¤0;J©q…w®IÙ—\¬¥Äqµ¨†½Ç+|`O¿ª¾æ=ò_¸Q¼9Ó·kž¶ìú V^è£5tòILóˆÔ>s+ªù© LùÇÇÝ^½ ãõè±Ôé¼µ±ƒcn‚n̪áá„‘w~9¥1Øk¨)jé*$z[H…öl–u2«¿ÝšŸs ŒÌ놓yÜHMÅz^"¨XdÛ[xAÜ„öÒpuíÂi­zØá¨ŽÓw–å<(RXÊHó£d¢så°héçz³d† akHiþÚóÓ®°~èjaZ\s[ËùJ,ÒÉu}= ÎXPGp£šflà•vfòÀ,››kìÆxÞ†¸µ’à kÞMÕŸÒS“¦šY+¾ÙÌTQ½–’vjjyfdU”¿ à É2ÅŠ1 œœ¨],x{KK®'ŸËÜÚj˜FÆx±µ’¶Å5¬’‚«NÅ#¥*EBÖÔ¡ *´‘,‰ .Œ}A”"¶X…ôÍr(^v u0nÜà²õc†pÊ™.ª[ÌL“åó0|WS®I$|´\á_­lÚßYÕ5‹QièfXžª5v¦¦ºÕ¦Øƒ&Ríµoæ.w€ÔSÙTá—`é°=¤87´ 3#_”¢•R^íתRX­·Z!M¦*Ǭ™|µx®ß‰&"§]Û#Êr˜÷–)‡ù%lUGNFØÄdê~s3±!©˜:{¸æˆóíÑÜ’Ït½Òɨíóµ<˜iRZwÜóùÃ8&dÎj톪1×-sH¾iñ¶Òzi{ãEÍ`kŽžÂnj []·øŒu;$Š®[|P£AJK™}8Ý(V8Ná¶€¬ 0somÕÏö.¹çn†9'cv¶ÑS­ÎãŸá~E|”ôiXËNZAæ° Ü äîÛæ¢÷,:Rn¥»è.nwN“ôTªakÔ–¸€=üµM“µØÛ¡†J‹E ³G]"$’Hù܇™‰Ye*Á·“œ¤2‹¨ö‡=9i¤iŸUY¸úd‘µý-¸Ú_Ys¶ÜKU·QRÀð,eÚܳв¬6´²Æï2Eq卨ÙmÀ0«Ž 5XØMÄýoÓ~‹YµjT¦*SûúËUY©%ªŠH/º….PÛ"È`c› œm¤òO9ÈÏž5œ4>Ï?MVªâ;äyx'ú}Ö¦edzgª1¤•3G>*¥÷“awà!B(]Í…=5ìªæ€ZÛ—UeÆA|¤k½¢­¨ÖÕ’¦h‚¬KZ*¢'r°`È&ï3Ü1Ÿò®­6¹§´ü{úªF¼º)ƒ#Kû -]EæŽÞ GMVUÒ/‡™ÌCËg%wF ‚ÄíUó2X|ÀªÓ™²@õÚ5>]ŠGhùÌ ¹{ÝCUz¸Æõ5uW9Ù^/3áv Nà±8XÈfØä¨>¢™Üx `R¤ lz «ˆ/¹2| iÂKÌVëlôöˆ§¦’Y`’˜¦SœîeÈe?t ‚Šy9=0á ÜÈjõ­‰c¯áÉ%T“Ó[êÒÝÔªÊÑ”„ï*à9I#‘cÁ wr¡A]ÂWdœrô¼uþUº8²bwIm°š²ðPÜî•¶Å”´Tõ2º™Ô6ï'1¡DÏ´° ò2ä½>”;QÙœ§”iå>ú+q9†S¯¯¹W>¬ðÉ~/ÿ2¹jëeÞY’MºoJŠ÷•LÑ™£–J‰ QXo©"Uly{ºõ4q¸gQuJÏ& ÚÉÒI÷´«®«AÛæ¢›·…Öëß“fŠýeH¢x¥š:jq»Ìûiiçq2¦d¹yLm!@óøî%F£›NŒµ Gžç õ›¤>³u=è¦ÏM¨©îWÚÛž¢¤©™¥Š¶àÏO Èž¿ˆ8–¢b[8`•dwÈ* êy.m¯sc§K¤)k/•Æ~þ ò=´ C5âªÉwf? USÏ%!eœ mÑ@v3 ‚ÈJzU‹?L¥ÃY”“¡óó6óº ­låh…c[ô An‚º‚Ž*T¨1Çm|ÏPð‚Í“½$EŽ ÂÁ©‹ þVv†ëf‡˜sÆVúÀçUj•FkøõP_fÒ¶k´´ÚíOªtm*Í4·úÒ–’®B%1OEO%D9§Œ•õ#0F¹æ¯ ¢ÂjRww¨ßì5ƒÉQžð€7ðö›~  ¥¡¶ÏC ¼9Ó·kŒµÖ ¹ä™ˆ ÍU:M‰evÆ×1‘Œ¬jœCÖeu¸ñ¾…Yÿ¬XÂ}«­±ÔWÒ;\(5 ´Wˆ+®Õc¤j&òžÕx‘bIÌ,=3vÈ t4x…<3ÃEpòwõ1kH·[h‰Dž{ÛÓí6ß!ÓVÚº«ÞŽÑ:b¢¦ªŽžŠ¢ÇSxXmµ†9KO ®h]¨–¦:y VŒùpÀÆw£ØáœwGN¥V5ÔswÁäDžZˆëa^á!áx߇ñÕ¸N*¹ÍKö˜ðDµÃB$_¡°‡"˜p%ºs×táUn´XçOHbbED¯Ѩ¨Ú0¼Äž² gÜùmÄ‘׋ÆqÌMVvn¹ê/å&Êjq\#šcC¾†yuü(\V§»Ú®°=”FñI E%jÈ3¹€uV*ÃxýNF:ÊKæ:$ûWŸ«u²j/óôSŠ'É%Ö¦i ©-3"Gð«ê£ä0(]T¥UŠ‚‘Ô?hqñ¾·þ¼Ð×ÄÔ©p`쌎!ZyiíõÔåXÃo8m1‚È댮ãǵz¤¸KHët¾ölïÔ&¸ä‚Ii÷Á +7š‡Jóå°Þì0ÃÌÏÝ#–ûÝ)îkµÆg–ܧÅ1ïÒà@ñØ¢ÅM}<a¾6²\3Î ˜r rÙÀqéÎ20IÔíA´Ûd§¼äLO¸ådeºaQIUmŠi •-*˜âFÜsÂî ±ÞÏõÏMÃåq¬ÇD—âj5Á´Æ£[ë~H–ºÝ üUÚµí3ð`YX=*íÛ£ŸXÃËœ3ÕÜ^.ƒg@i¿?}U¬%lC‹W[å¢s¹ÑX+`t½ÛícIyµexfu“iYŸ;Bã•,Åð¼cª41µ›Ýcˆ†ý-¯ÙiQ­P°8:A1ïÁ;½Ú†*ú …˜mò#©‘›áRY;¥Þ¤D[h±†ùÓ YÿQ-ÔsòDÞ"ÐaÖ„Ç?ðŠy¨'5Ú±$dzxe"¢Úf,P€Š±6€¦ ’K¥t›R»Û“#}.5üõè«÷ 6 Áé×Þ‹ Ušé#Ó× ­y«óI_L$8qºB僑–Ø<­Ä.&$§Dö´v@ˆ-á諭î;F©2F·›Gö—Zf¶¸Ü­µ6a0ŒµT1!YêƒoÌ”+¨—€YA ´ zSTf+[ >p¥œIiƒÔøXtQëH´I[N· 9'Š6’j©RèV=ÊK„°C’ØlƒÓ[…{Ë»`'Mcñü©¥ŽÏ.;z'{••‰WNÖQèíE"…޲QÚžX;0H%ZpñH§'ê[Ô‚¾æ@ÚòáÈÛæf÷ “ZP@ˆÞÚ[Ç욨/W -JÁY;Èßc‚¦šŠƒhIJLY`4…U2n¾(®â<3;sÿvÄèb|æ Þ³Eìs»8’½ú¦z*ûtô-¯Hê›9ÉISKQl™b¬ 7"FØÜ]äÊç$RIJ à™!¦ sˆ›zs±·äB€úl€æý¬©½#¦ïÕGSØà§ÓóT¤“TUVHõ†®dFŽc'š6f=ÌLL‘†`‰=z†qJôI£‰`DÜ kâ%V­Äpí+t×sè£5·O,ÔÚ¶áyÔú6¦ßMðèïc¬¨2ÔÕˆ®´£Éó d´¼”,@xmL7 ÆÖ¨)ÐkšëÀp»Ñμ H¸ƒªU*Ôë°–ØLOñ ÑkÄ6 Kt«¤‹JÛ`ЦXžwJ/+â#á”S¸,6yx_,p m¸Éù= UF‘÷ÓÂmÏÃa+%ÏkŸÚ2EºëËê4„ËS§ìµ¶ûuºãj¤›á®"±g„Ф€û¤ØûL²0ET“råH?t^wx©Ú‡Ápã¤r½Ä©Úg¿Þ™ååà·޶ZÄ‹GEPð´O©¥¹Ç#˜ ˆ’,lÁBÁK ,¤ú£e *ö¯.ËõÖ÷Öɵ(å"¥GÖ6RG·Qùf®J›¥©œÔÌ”’|9¼ÎÒ@Ythê‘n,ÊÙç8 õN¦%¹Kˆ¹‰òÓÞ¨ZìðÁ$Û{‘¼ŸM”ZùU^”‘ÁA¥­—iEIb¿ÅÖUÜ K$²a‹#“û¢íRŤv1‚¥Eðê®Êʼn¼h#hºaó ÛÊßÙæ·UOð2šûá«ã¨„„’tN²!fQ]Æw¬s3`ƒ°m#î–¶£HÉOÃy(éPªEŽSøMRE”rUA=2Юš$ÕFÊ íÞ9]¬}*øÎÑÖ+g¼Ûëöù£ ©HwŸiëtô+$Câ®Tµm½UCÇü²ªÁr£l¨ÛÀq•f>˜‚°¶è5°L‘u©/•Õ§JêÇåÁ1xh²Y·IÀbBîÌ ŒÏZ@Êljð:ýhû…£‡øá '{Åjâ?öáðå³ãSö=è긿ÄñqñÄ¿t.¾°h­  ¯š~ë=òÀ°ÖÕÔ¥|–ïáRÐ3ùsM𛢠à…ÜJ€q…ÓÁcq®(·£Ñóvcçªe?‰þÁ±ìÂpqZtv"½W˜ÚYG±§3­ ‘¼ûWý >ЕÖx¿â^ ÕÑ 7ÅLäEN¬ÃyKîÉ ‘Ï=^Ã|9‡ÃÕíîúšfy.uõ‚lÑÐ*ÿ'ñN!€%‚ž˜;±¡M´i¹ÃG<6]QÍÿSQï-Ú5WØËÄÈü«¿…ÕÒPÀÌïx¶Ë9lô|D‹F¾bû²qœ¿,õEþ<íω(™ ›ÇBNGùô- ñ]9l“‰í ²övåï¥ú¨å>­®§ªø•e2¼²ËNÕ)\«'¨)´íÎØÁ*-»‡¶£sÓ´ÅïéÏš, 0ãû¾Éê §’9j¯šz·KÄy D„თ0TS®dHÕ!Yv)ܤ‰ÃC);8é<†Ç”ÆûìV“ 8k†‚üDz¦)mÔ3%aª³TËQM6ÙTG¹ã O©ƒ ÐàîÜ„8düÆK©:™9t"Ò-3¦·~H±t¬j±¦ÞôG‰ªg­ò„w£Pj„tãÍfXØ5HÀeݸÇ‘·Ò4èÑÄ04°Ç] ôë{ø¬N‹¥Îý'óô CÛ,¨%·ØžZ÷V„5JqPÁFõW¶â¬Tà”\„6Y‡Å›=öå ¶#‡§nÎ ÷½¿*6׫å«á(«4çð·ËäÀòV2² ²G¹v˜X"@!¶gjü4½ƒþÃií½‘`ø¥<™3M£Ý¹,Všîæ¹)êm×H©åФˆc¨uä#¶ ®$Û» rŒö=ØjNk-Ôl¬ÐÆ É)0FÂ5<¹)Fë£\-©]dÒÕºy'ZšžSt‘;!ØY˜¬,vÎ9ÚC.Âõ—KÇ9×$õÞѨ¼Fœ´…½J‹\ù-žïøKìw+ÅOñO¥$¶$11“¸€ù˜qvg‹Ÿ¿¿%Ôð!í"wúŽÍ]T`zJ¨%¢HU¿õùŸË`U‘K`¤àŒ)ÀíÓqTì Ž÷m××øJVÌÔWdµË,Ó»Ôløi*$ƒËVqÑ‚QÜãÌôeU䀊ª`Ae‡NÏÚRëpƈ—LsOZzjš ‹µU»N5Õi#˜ÍB%  ãu3>ñÜN™™²xa©†hqÁó+=Õû'ÜHo·R­ *µ=¾úô4ÓÓ³I=º¼³PBråfî‹0Éb´îò È0£pm¼4‹!ÁÁÂm×MbgÓXZx1Ú°Ôi·Š9n,”Túò¦ô¤’&[”ªíŠb¬£;|µô±2c(NK3 ¹eÄAhƒïŸ‚s鼃7…Ö÷±v¡¥’®¦âÔ"ˆéªY"@Ï1xÆî¸aénÀg’z­UÚ¾d{,¼Uv€8è ´µU¶xüØ"¯Õ³¸†© ®U®NâÞWÒ…Oÿµ¯ƒ5AïûÕt4»d6ZËÍ_‰ßÅg©¥šáŠêjhj¨ãqQ|¼uyœ„îþhÞvƒŸ¬p:Ôâ ïH›ÈNQ¥áh’es¢³GÉj¢:jœ¤5ŸÄi„¶êz)b”FR›|­!òœ‚I¤Q(¥v ެb¿N׸VhÜÄX7˜änPæ9Ž{Ž¿E^ßô-l”÷¹4ÅËRÞlu-¸@•ò¥,rÊFaűå…rçÎl2"‘)“J¿¦^Cg/ALyl¬ÈÌà£ÐXÖ²Ñv¹j #¹Üki&©£¥šš®Ç¦w:C*Æò«n!Yƒ")ü5A® s\F±u*§êœÛ·M<´^>ˆOŽV­Qt·ø'¥î $ï{ÔsTÈÎÂ¥ÃzPÛÈÂ+™äP6™^2¡@Ú>ûþø ôŽ«Äªÿ¸ÊÑ­†¤õ9GU‘Åqm$5‹Èw¦šÜ”(ÛÌŒ±ãY{ƒùs×Ù@u'ì¨ÙÀ…xX.\m±M®¾œ¸ÎyëÚá^ÚŒ °-$î‰56¹6ˆœTÆ =ÿ?¯VØÐ˜% ©•ò]¢Ž$ÇÂ=ØçÝÏoÙêî&$J½7Ìžj}àn´¡±ø½¦®ÒKåÐPj x*ägÂy­ ™ÛÉ@$ÉB:ùçùÿ%ðæ;˹ÔÝ-‡ÌY8áìlè½›µ\¢U4b¾ª¢Š9©&4¨VFTÞ¹$Œ„ÿ´)($ŽÿËú¬|ŵbyüÄø/A…á® -›rññOY©æ†®x'‚‚¦¢-äÔ,Ÿ>HTØñœ²•N9;˜¨Áâ«*‡ÝÌß9TŒ.$Xv÷u¨žx« K²U12#"UC g~ê¾q(U¶É€[Ô=$°Æ^èÀ{sê±èpç5²ñ#KYj*¸ ¸,”V,y@©)ÞÑVRq•ô…$2¶G ¯|÷MÈ=þ=UŒE*ltXû &{ÝLÄt¬”JîŠìÅXG,HàåÀÎF{=ØÚ.î} 1W+h¼9'[×ø½<¿Â`¢»0ª­M+—˜z<Ò¥†Ù•'U é‡Ð–Ôlc"ãÃKŠÞ ‹8Q"¶éª"ªû|ŽZ8.ú^äqNÉ,JahäM¤(‚Sq`˜f=¹ùøwmQÁ¯-¶çhû-*Xº•D$ÓçòÙAλ±k„~6™žÙU4ô4¾rÒ7•X—rFÌBíôòþ…>£ðö-î4ÅNк,LM÷“:ïyꎛ^ðHhüP¬¾-hm]j³[¨©t…þ2ÕõP¦¨Š±„äXÀÙæü¸î8,WÅ`ÛQ®a9Øõ“iÔ€Dªý«šÌ…²TÞ‡QS]¯÷Šø¯ÂŠèE4×Ï-TŒ”2ÈÈû÷nÜw3J¿µãUK+ÁË~Zô‘ç`¤ªµ1•ç4^cí쨽L]…²ÿ¦MR7áç–*ÚŸ`bÛ¥`pK¥™ƒ¶0yÆNƒjörÌCLóçòóU%Ìé¶äøt墳¬:I×ÕÏ%ù «ÔÔ¢¯ž[‚<Т£$RˆÃ2ª³1H‘T“÷OHu*µ\Ƽ]¦Ã—„ÛE¥‰®M2*>Ã×Oqꢰ|ñG¶ï_ªâG4±ÍS&jÊ_ÎU*M¬6íS‰ãjŠ„‚H·(>öæ¼N3Ö‚î~º2;m¹. !»Vé«’Æ*!¼oDÈÇ“!³F¡¹vŽ¥r±Úδl´ÛžÜÄ-l[ê­añ pÚ;Ñc$&úÛP¦ÔVÔ“Ʀ¥Äõ2 Pª$°Ièó¶cL³Xãƒa¸×Ô¥ÿSÈÖo`_mÔx}ê¼Áq¶žÇTË=¯K]i)l–û G10%†Y}YLu„p¦0^?K4xÁwVéÔ«MåõDÏ/f|üz*ئa]KHM†—ðþ×XÑ4•°V]©®6jA|E }tŒ”õNÂf‘\,ÂB•€ÁØ¡_N[Èa¨1®€ `r}Uü ZŽÌjÜéüÿ(÷ž¦xm¦ÙIIEWæ;WS5D’ËgÿÖ) ÈYT…— ¾ŸSª$m§òGE_°¦âòEŽž¾Â]¬4öœ¸^ Z-=EGGÛe"Üi«DÒ«ùʎͱ\Æ+e™…RFÕ áø§öpIp Ác®¢þ«DÑ÷`L~ù$qRéûeÁ¡»µcClD“ÏzjšH]S>u:º‰Sl™ÚÅØJ  T˜Å9ç-6&w™6‚´ ›E€4ôéîé ÆÛ-Æêº†Á¸ÅI®…ʹFøU¤ÊÇ#/ zrÊXÂ)öuŸI¾ÆÚƒ¢š!¨â ‰ùõñRkšŠjÊé¬6;^ØejÚkœ´õ“dGšvã´ïÚ¹hŒELcXÖ5ípi&f ó‹Þ:éáu¬Ö´Ò '¼…F*© ¸Ý©ÌãPjûO“#Ûi)Õi*¨áƒ8 ë´)0<œ\g¦Ê9)ÈqçpÛO;}‘Ts§3¼“F°ñy¥MEkÕÁnJšˆ¾*âi-+],¢m‹ðu “Å •Ÿy„ÄØ-#°㯢pŒÅ᦮\¤â4Ø>Wæ–(>#5Ò7®-´É7Çé›íšÌ7¨¨…å­3Kº†œš–%Awg!‚´„žü'ñ.$æ`Ò°ÐnºôMªÒFkeN¢ºé«…𒢂¢ä׳;ÇWLö¦‚†Z0î8e“”P ,Ù—±P{õäëpÓ@çsnzÎÉUœÇŒÒ&5Öæ‘QYê­šZÌÊ•IGQWLpÓ4ClqÊÓ°ÜîÍ”h‚;>T+¹9^F "›ó> ¼õ´môT›O51#q'îº_ìcãwØŽ÷rÔz3Çm;_¤547 -u—UÕS¤q[㤊T¸QFq,ÿ,Ó˜e‹2E5<1í-0'ë<3àü6ÜCòÕ5î ÿÚ9&±döaéÔh9}§«ëôVÉ_KWOCVí'ÄÒÔÉ-$±Ç““<m’9dFuÈ˾×ì©×ÂqTj …£A"loãï¢VŽí#}ÑWWjëQxgµ ]°ƒ—:NÑÅm>¦\mU8;[nQÒ„u7K]3ò÷r­S¥E—‰›£¨ozJ†°Ù«k`ªbe¥Rí$®̲–v‚G—•Q…#i­V “¡›íòû®5š[Ýnþœÿ •K|Ô0‹ŒCâ’®u2VO-g™åÊwœ¬ìA ¸äÇWšîÐeEL×'3[c~Z¨½5Ê®Ýh¡¥ž:Šº…ãïH7À$ФX`tþc,+–@ØH¬A9-rb~^}J©J½Vƒ™-ÖÚ¾ó©&¶SS˜*#†®9(*kþ OIùŽ¢0&EÜ¢fûÞ`»H°üO#Líµµ·³Ц¾µO~jÅО*\´}5Ýnßø›[.ñMv¶Ü¨U,ÎÊC¾ÂL1¹D*pvœ²Ÿ}ð¯Äuh°¶lNžûòR+º ‰Wf†»ßµ¨ÖڞѦbÖújáÇ5%=Ü»P¢A$ÐȱÍSA:‚ùÐzü²Lm"¤’/¸àÆ­gTx-{LØÛíù&ÔaqÞì¥z»Gj+}¦ñ-ªÁ¬ôUÆ:héâ¿Ôë.•wYiÍRS•†–áü´‰E3RcÜ»1&¦/áãPK\[àAÇM/¦ÉÔ˜fd•Çš»í#jÑW^ê;åÕíVû Ž}E‰ïQÔ\+$jz¨Ç‘çDDfI&òß̆=ÐÏ \¹ÍÞÀ…j¬¦éˆ>ÞNÐì‚®'(–ßÅ|¹ÔêÖ§ÔW½Oªkg¸jµl÷ ú©ê'’Fy³I,ÄòsýúýeÂpí£HR<–Ä å3\ §ŠÓw‚fC°–&€äñŒqÎH?ŸË¢ÇS‰exLZFúÖ»‚A3âŽVÿSìz_Æä~Gh™¡™²5 ô’UX#e*GšŒ2?þeïø0þÝ{FÅ¡aL§û…EUd‰ “CÁní!F~¬Týzf.¡p”º,‹ÃáýÎ -C\a™²—%”l)2Ÿî§d`‹jÒ{þﺿ]‡8ò_PQRÙ4ެºêk§‡–¿ô]]=YšÊµíl©òê] ‚¾Iè&¨45§Ç1’?5e?êFïÀØ(ƒ†u&¼#˜ó:moUîiÑni{¿´žë|ð¶žÍª(4w‡UúZ®k…q¥¬][S_ÓM:IQi#J§GJ¢• äƒJBPl·‰â¬JgÌ.WȤofu“\ý ûtñ\ëqj[T•v«…i’îÔòTˆWdÍ2 ¦95$˜ ¯ŠMCc²Ù/“³GUW,4ñÁD‡ÔÒ‰)â ÑÈñ3¹”9Vápêo?Õ¬ñK÷5Æ@œÇÈɱÚo UÊ4ÍQ™ÆmãÅ/«¦¦ÔV­´Uim;V’›ø,­ä.æør Fèam£Ò U‘ºœ*8VawScµÀ ÜDïª×Áµõýk¤}|Fóu¨ÒºÚŸDêÊkeâ¡ã’*úëL4‚dp 0(Ó$ŽKJØíBÈ Œøaî q8{0#1q¶ÇH¢&$‹,N!x|rgßEi ÊK¬²IQhjGŒ„‚H&h#û 4Ñã,³mÀĨÃ*ùëÄb(Ö¢2—Nñ'ng}`òXÊ9s6 ˜äz[š}ò#»PTÉM6ØÕœoXBËUxÙC0ÎJ“„²· U\)‡Œß{ÍýóIcÜ[=èoäFC rYhéãezf–v †õ0A'¯„ —fààtÊŽ–F»ôðúJ¶&–iÊcÏÆ=óKh/v¢bYkÌC`øxÞ]ˆ9+´ñä:¸Üä3õ[.Q%³¬ý¿>JÕGxŸvH&J觺´ºš‚?/,‹Ve%ò„<„!<ðvã$Üíi€ÜÀ’m·Û^›"§R©q¦ ˆ’~¡š¥d»GJ.¤JgœF i2êJ$‡kŒ)dÎC vC+†ÔD‰;tò÷Ì££†:ð@‰ú˜ ÂóYa0ÓT­Ê®Ò¤SÄÍR‘δÁÉßsFÄ'c€l(z %*ovjvßÇÂÃûRú °S$˜ßëïšED’×Í+ÛÛîÁ嚊rd Kì;«ùk˜„ŠÂܘ½³‹Cðà*‰o+k¾½yõ 5©šRÀ ‡Aéü®’¸I©šûQqŽñ¦Ø*¢§š¶g†7«Œ£¡Š'pHŽ_j HÈØª ‡6… !¢Ä’ òæ>VMγeªêîyÎÇZóa6Ð øôú­ÓÇzÖ÷K½Þûª*®:‚໽CH²ÜªdIfÊ"E•Fó–YAŒÿ,ÙwdÖ5ÍiïH¸´é7uDižÇ´.v¿ÔzY6Q-Öêov Y= 7ÕÒ™d¥pÆXKI,ÛZd’"ÅHÚûðA †©^¨{Ãr[s×n^ÂCÎp^ÂC­á:7NÕÕ•{%âåw¦i$–zyDiG$‘ù‹iP Ã $]£h~)PEcW)-‹DÈÒútµ®Sð¯©P–¿VØ6¾üþi®{»ÐƒbK­Î ¦|H õA]®ꇒ¿Í,~ÿ˜ƒ+ƒ¸™…¥ŸþÐÈ#@=;GN¢ƒ+‡L ×ÖÛ¤*je–:÷–9$Ì×Xbf`Ò1Û"ýöœHxä1GÜLì@ql¸ÈØz\}#¤­ºmp€óþŸ{¥²Qi©M$s<ì˜æšå‡f™2ªY@9Ç ØoP9®âº=}µ‡ìä5¤è-§×šÈ®ºáKSYn6)R'jžž8ö«>áæ•RÌá}!u;@ ÖæŒÖ ìs÷dî}Œ[äÚepkÓÇ’EQok]Öá5²Ñâš8ÿŸ%HÍAJ†ÔiàÒúréG<­$u3È‚¢#"ÄwÂ…Ë+-<ƒ>2I=baêV¤òsÀDG¯åéŸó+*ô}¿PP­%}bRÛåžjç†vÅ[z”etÎgiÀóùaz¿Oâ©‚öû>ï7VF°ºŽžÂx¶Oo*’\ê-´žU+EN Š3* ;³+È’¬U‰×Ó€}UéTªÂXlçïî'Ëê®× ââ@¶½OTžåK]5ekZ´ýDæ<Å™ªæY ' ySœ;Á>¸Ñcåt¿¾¥E|>HsŒ„¦ß¦5|Õ”«b¾ÓÀÒ”CºW†0Ãj£— »·W%†d8êÓ0L–¶[Î'Øúî¹Ô»4÷úþJ|Ô/QQÛÍe~”ºéK£GY!§–8a@«ëo0`,‹Š˜Ep£!NXÂC ˆ˜ûûðKÄÒ¬æË‡½9*ªóGOO|u¨¡ª¨¤ Šy+’–9WnðµGk4$nF•pÃ#ü®Á`_ˆî°jyL,º¸oûFfÌ{²"Çzµ]èª ¶\æ½ÖÍıÿ\rª²…x*Ù}l¦5Às…*¿—WáU)U ª"üùó÷²h} r€dú{•'¤ZjÚz&:kíÆ¢«m<”Õs=À»¢¹‰©#‚IR5œ1EfR@gUÌ7Ä8ʹEôç}:«n¤Ö¶亚ףh핚+XIá߈ZwTO_ŠÛ][_[ñ‘ži¤‚­^XåÀäBˆë^© ý/„b ÎÒxÌ®Ó ÄﯖÉUZ]£¿ »/þY©#šÜðý 4Æ£Ó&–Æ·X£¦££¦¨ƒu½mñ˜£¨¨"¤SÂ`wÆÙ\)\JÕâ;íp¼ ¹ùhgd,¨ Žö_9Ÿâ‘âeã@x!jð.Ǭ¬õÖÝSªå¬®¥ ––If£´´Ð)«hcÊÿ6«ËXƒ„_)×cm žËüomZŽq!Ù ­¡#—‡ÈªX·5ám¾‘Ö®ÓVcY)É "òÇ?.¾üÊr敇T˜*+© ’ÑU[e$‰ç ‰V'ÒAÚÿÜO?N°qÒ×d«Ô#2ŽAÔ8Š÷¹äþW¢ÂOu1Æ5VæŠÔ«"Ëf»³F§`l‚JóƒŸpGo§^Ã…ññ‘æádbðå½ö襣PÓͬàÓ‘Ê)âBÂI±÷g öÿùxü[?!ÓÆ8V¬ê-Ø|áðùi‡”É¢-Ïo¯«£œ …õqE|»ÁjŽye–hc¦5±ÖÓÌh*ž6Ši%yLÁæG˜e–&uÜ"PÙe'óÔüH;W1‡BáÜ›Hh¾„ZÂ;ºÿî PP[íz~ï|¹Í¦šãD)'§5wg§­¨‘$„µ`d*²a™ðÂ]ÉPdýX¡J›èЬ‡™é'úû.?¼°„¯W]í¶«^¡ñ&÷o—QTÖ%R[£mDŸ’ÆSRLOˆÙÀ©eŒfç°a±$ÒÖbó¡ßIŸ-tÕ&«ª2žvÝlÁ¡lþhÏtˆMrñEp±EhxgެijSÌ¡Q)ÜÅS¨ÈåâhЮwEZxl9í0UŽfºö6ð¶œÁ” ç<nžõQ[|Ÿ\Ün—‹½ùï÷z¦Ÿâêîf4¬¯DmJÀ"™J‰^±Ü¸€/Žâ£ú­b5ž³h×~… ¤êeÙŸ½jmzná§!¤®¸Ö ½4š=˜Æ¥|¯)gvÈ#VÊ CîS<ÊÕZk0CãM$su1¾–Y-ƒw©ü*¾{m ²¡©/× _ µºxnpЦRïòÔ20—ùq¬±®å#,@Þ½| qT‡Ñ²Óó663Ý¿MF'êT^éÏÿª­‡OÔ•¦K5qË,rBå£&%Þ©ÂïvX.Qw ã¯7F¨¦÷‚"5ÖþKÈŸ%ç°Ü)î.ׯÂÞïÕG©«µ~ŒÔ-©ëÅEÎ[y3TE ¥i)‘ƒî2Ù$Oˆ\ªÈª‘·,Xuê]Gõle&òH×hƒ¸"üÉv‚U¯¡‰kšI ëêtºžÑÝ- =»VÛé/ÓQOU$•µZ~J…1… í*JÏ'‘¿ÔÄs´€ tcŒTq4ëÀ¨ÍœKO;»£Ã¯5è©ñ²à7vüúûÑ$Õ””5-G«´µ’‚ t”&žã]*Å27Ñwn‚QýGdn Y Ñ·â<3èU©·Œ »B.7¸õ•c‰c¿íh¼oËoaSÔZYhæ¼hª;qÉ¢¡®I)®Â¥©&vU1˜eó\TÃͧY¦Ž>A§¬Ïˆ+áj¹˜ á.ÌÒ _}[ À'”Jò¸œmX·xA~ŸE%¼Ö½Æ²§/úmV©SA{šè.¬Òåi÷*üM,ƒË˜›ÆÔÁŠnë‡`F:™ÉæH-´IµàÚI‹›nnõf‹­ï’•i ýCÛn÷+ý5}¤š4ªøz”*g\¬‹Þ¿6-áˆmþ‚‡záÂŒ~+šʣC¼4yf>cI‰YÌáDkF–RŠ}Cg¼ÓH-KæÀ»%…&Í#Æä YrB3’G«•à‘[‡U¦;ÍÖ ÄNš}Gö¸0Ó ‘_ŸËØHmµ†KœÔ5SÜ&x)Dfhh[Ì\+ºº•]Û‰b0Ò=%€ ˜FšdºÃ¤Ç^œ¯²] 5ÃTXrz#§¼ÓÐZ+$¯¤U‚jƒÿçžECH«(ÉPU_Œ0¡ìíV ç<– MµOÎùs€mÎ:(\ÚŽ&©†žÜËUòÐ>6Œ€­åº’e ’Y2 VÁ“°ü%F€éž»z¼n²)bjvd}}ꥯvµÞh%±Ã ô²ù¦Zd…㎢`7H[bÆòúˆ}ÊO ƒß¥Q¤ZóUÆO‰1ÓYÖºÛ—m?Þ¾Âë=]¦ëô»½M4V©.ô³Ó +Åuõ,~t”ÕRNÓ¬tôËåR¬Y³2ì2:¥0å'3„I¶óñä"¾B“éTŒ0Ú:ûóP­Rº¦µ¬”Ö /l¶R–[„•—߈©ž0è²HdPŠï,Ò³ˆÈ“r6Ô8·ƒ¡…òâèîÀH Ê:b›AsÏí·?ìuú(ýF¬¯¤¬¹¶¹Ð4Ñ%T)$5©Fb¥1«ÔËDÎÊ¥&hHÚ€+!N‹CÁÙæIƒvæ Íìdf¼ØªÆä¹ – |’ª»—η­ÐÙn³:ü•0†Øah‘cÜDQ§ËuU%WÐ6m&ž'¡3ì‰"òp¥ÅÙgø÷ÎÛ„¤GMOºðÆÑmŽˆ¬¥EÍjÜù#î9—a…Ë2å•J*îMZ-sK<ùßS:þuVó›$Á»í÷”Ua³\5"ISIq¨¦‚ iñüI˘£”ºA‘€þ^Ь¡€ŽU+·†XœC0Óx:Z&Â~wð‚Š»œj4A-ñÛ—½Ó½uÖÛ¾å^ö»¾¾gù‹<˜3–-•r0®xA’Äá°NÎ|°;~›ŠacŸ_ϽS\Ô´õòÔ@•w$2¨çËŽÊ™ ¤ýðLÆN×Ü4h¸Y£Qoë’Ñ££”±ûGÏÞÖMi¾Ág’ [f¯Fy@¥ãϤùj"ÃD[2@n2xÕeSQÀ’'O” }ªqL=Ÿ-V¢ïk®¦­f‚ ´;–àišD„¡]áÑYSo¨‘’çhʃӨSs¬Dí~%ÌÄ ­4œp±NƒMÔ 5þeWoª‚%Y §¡§?Ä›ÿlr Ҩѓ½$,T*>Tɧ ‚Á˜I6_ÀÞ|A”. È\Aòöÿ€Þª)žŽ×ªk-vö‘`kiX±*„n‰½”) Kœ #hQyï° œ·SY´n ¯êÎÄvº_Z—ÿâ×®•ôtžjµ%rHJIüÀ$‰Ù¶¹”vY@j¢öhÖ©† ¹ëÓ¤sjèÇÔ¤ãÚÚ=ì˜u> 63-^¥ÔÕô.ÐCWJå^UQH&¥>aædƒhÂõ­G ÊÀT &7ÞÛÇæ=SÄG ­2ß_wS]5ªu%û\¼zJã¯.·Ì´´ô4”TÏTÓÊ‘K-+«<“ V43;™Ö8Ë÷8P l0ccGžŸ˜V‰£R õ÷ ª<<¥ñŽÛ,×+ä5ºÕrþT–šÊ•òëU- óSÓy’Ç,ê6Ù7I›ÖP³yÆ=Ñð—dñ[â°šØæÍþª¯ŒF•O DßosÜ•šº8*(fs#ù;Õùkmå&,YgSÀ¦Zøw»ãSO[ã˜Û^ž{s×󲫵­¿D\Üüqñ*Ó¦Ñg¥Ñ´’SUj;¢¾ÈíVö¨H·pÊ’Ìî°EG™ cèG#Kã?ŠéðŒ«êÿõrtžC™åÖ|&·|<×.xŸ§ÛLø™¯ôÁC [ïµöý’U­IÊ©x™Ô“Þ Œ€+XÖcj\õWH 9T2Jz«lÑ<±˜Øá‘Áʰú~®²›©ºH@â,ºëìÁ <1ñgÇß,~'ÖWÚ´5çRÑY/²RÔb›z‰<ãÿ¯ 3õ'Üsô†¸-:»®@# íËiUªS,a ÿ f´£¸ø—[w¯·TÛtÅ-DòÖÜ´ý4B–Ûcኬ1ÓÔ¹“ÉŠI¤+ÉpØ¢)üMK9ªúC;¯c©¹zXmrªÖc‹Q0'ß¿ªª©huw†¬×FwѶ¬ÔOnIDHB¿ÅFÔ 2ÊFáµ³ÈsÔñ>G ð_ú!§ž¶?.^@FC)Õ¦MJBü.žSZv{†—¾ÓÒV-r] -5?ÀÒJµU&õt€†’bѼDðå·1Ûêœ>OÚÐAmàè ¿(¸æ? K E•é¼CöU]ækÅ-ÎÇMz±^*(ë–XÅ]<•B1†Wœ·›#Q•U20VCѱá {jbC»ò  $_ŸÿæI@ì¦÷‰÷ôÑ.·j};w¿k;Lê [¥X/Tµ4© ¬ˆ‹éa˜  3‚T1Xž_h¹âÎý·‘¾—ÛÔ`ÂIyf ^JW>ˆ¶Ýí× ›Ä¢¢TZcbôõyMÏ(b:BŠèè3·‚™ Ö ÂS}@jv2v¼ ˆ"IOÙiÆÐ{dÿ:{ÑGu~š±WiûD–-Q¨t¶»‡â¾"Õw…Öžª6–@­*Tw”Xä…™”&Å*îÞ‹‚¢Ç;µh4íÞl5£”c¸VRîî‘hÓâœZ5¦—±j&Žž:ëxZrXS‡+\c>tu ¬Š<¬Ê̪¥r?Žfž(¶˜ph×_õ&Å¢o6å¬*§Qî,cÃZÛ š]]5þÛg§¹W]lôæ¢a] ÓD™‡isH¡Cƒ´#ǯ<ü[è9Ô©ÅVØ\ÜïhÓÿlLfÁÙ6™|€uûëp“A¦³^Ž»PÒê›-DTòSNjWΣ‘ÃSÍÛlØÒ.É™Y •biájaÙ^Èû‡7 "gS¬A³Íû1ÁÓÑHb‚¨ç zY`¨£–"±m‰vaü·%³ ŽYw4Ÿu]‰ÎwsZ(ÈsEô½õåxhÓhÝg¶žG9·=¯}ÑW y’$ˆÖ×RUbA*ÕS¤‹Ãc#€ñ®ÊW!T¡‡G†ÅvD€Ð[n{òÛÖz™N™pÎwJê)ot÷8¥·Çn¹H]£«ZsT$™öœ¨qÊTn8unNÔvÑÃbüzƒ˜ˆ×SòÓêj˜wÕRtG¿Â»èkâÔºpÐSÝ®Twÿ%®ŠZ8¦óÿ—æ…C[þ°ZËÅÉë6™àH3`¦/Útr½à’<öU&±¬¬¸ÕÑÞã“QÿˆÞX^+Vb#özXá…Q ¼ž­Rm7²dçÈ‹…æhqšŽ|÷gM}ÿ:'¯pI,vÙ.všj²½ÆZ5Î ŒÍ±U7«9RcÚucV£ò8 ‘6ä:u[LÆc+oïMÍú&‹…l”´T Âä¤K1~Z¬i!ó ]ò8®Ø˜º’T¶ÑÓhªã·!¯…ì7¹€U¾Ê•&ÿØI?As⢉¨ih_Φ§¸,ІZYàY!V Á C'fÐÆÕ$œ’¡ºuL;ÊÝ9Ÿ}}a)îÇÓÔrß§Ýj{½Î¶$†Ýw®¤¹Å)iš VJ†g(U7†SåÍ$lÛJU P %ô[H˜{G9£{yìB­’››˜´ƒ°ìÄ{ºr°O5æªÏ5]Ó⪪D‰I‹l“Ìê 34¸#nJ©c“‰.i-Öù_O(õZ' H’kÈKMÞÒimÕŒôÒy4õÉIÒƒeóT\ƒ´®pIÃ+n+ІÅL XO#áÜì¬á]K.W“݈§Ömù(Ë¥°ÖPTXïv¨Äâ‘$ü|rÛeÁÚ\@Ìx!ÁÈÆO\ÌcL¼ƒbtÚ"Þõ惄{*vÒî¿/‘Se¬žª£Í¥‚ɪ–(‚UÇð>ZÉtóiäp< YZ»Âgh#Æ›¸ÓÚÁÚ‹ÏKô+XqPFHžht×ÕÖCUWKMIOQMÇ5<2Á_-ŠòcwõÄY°žcöÜNVÅN1†¬üµZß+-§PwêV•*ŒªÌÕY©² ·Í¡¨¤½ØëΚ¸Ë,“¡¨EÌD¦Ö™L‘Ô/2lm¦%Û·A 4¸WÃÓq©MŮچpÊ%¥ú·ÕK«µ†·7k&°S@Š¢x)émÖZKoÁ(’Mê(£…ƒùî î£W9éxž1XTÌÚoÌ^ÛOϪɯ@g–“J|VñFáãm§IÉ®ô­£Q^¤¶­ª}D 3]ëi‹äIXÌõ/¤1ˆÔ“êÞ72;§[¿È8×0Û[Æ–÷óIÎà€Ÿ/¢ãÊj*ý â š¿LÚnºjëO–è"‰–¦]#D°TªÛÚ&§r؆WïÜUH$ä&ƒ¾7ŵÊàuôq7úG-Íwv¤—T°å÷]pÒžêÝ=rÕ:òõ”ñvj™ Ib²ì·Î#YêÂÍ,tÅÛ¤§¦T“'Ó–,•±ük ^€yvZ¦g+IÚg¯•¹Âf%ÏšdF¿OŸÃëM¿L<1Û^÷¡ê-h´µ•t—9„ut»šGAƒÙò×6q¸’¬â\GçiÕwjR¤’fMù(׿¶̹Co6×çõ]¤íŸÆ¿ýB¸øolñZ½êX4ÔT–IÖ²¥ÓÏš”Cr¦—Ъ&- y¡fR²<Ê#1¨ðJTž×æ’G-4ԆڡĽÂÄüû ÓVèÝ}D5ô¾éÊ´¥Mõâÿ[q¥ÓóUÕø¸$1,•5?“Í#I_âüºgFbL‘¯°Á»³© nfL̃ÊÞzlUvá{°l|Æo‡žø±¯¯–Ý¢tF¢Õz’I"ˆSÐS™yb<Ž2±DKæIϹ!Oß›ñF,ý ¶ÛÛÜô1? ñ líŸH†¨¾—Úv_K?d/^è›XµV‘Ôw÷‚£Ä UWW_kþ5Z ñü2â "ŠVIiÂTI¸=DÈ~ñO­ÄªÖÇH‡¹Xî.Mô. ‚4Ä6ö…ó;öÃ·Ü ûYý§!¸Ñ\-õ‡_ßä0UÈòË5t¬›¤pL©R¸p3×ܾkNˆeÀccÐ,šý×zªbÙY9ˆQÎÁÆ@®xö?ׯ_…ªâ2DªuXêohQI´!’"û¶2†ø ûÏ^ƒÜ€BʬI%Yôõß .Æ*{e{~_¯[´uO²eI¼ðC[øïã¶·èˆíÒÓX­•ºŠó<õ*‘Û­+THÙîøU#Èg’DUÉn¾Añ'Æ´8X«Z³I2@Žw‹ò^óðÇêpî¬^ÊmÌu'À©:jÔ•íl3êk•zÚ[Yµ»áëá­’ijfjJ5‘ÙH¹ÆLr,2Œ+îK!Œgñ÷üÎ¥0× uÜóó‹«8j×6¿/E!»ÜnNȳéú[ä:Jª¦G©‚'‰ ­C,†%ˆ¨ –Ä3ù/Áp6çð,#q5ÛÎvܱ¯=>¼–‡ldÀ¹æ˜tå›LÝáGÔÔ5ŒÜ¡’1C_5|h!xäj š´"=òI ùPÒØ»A;ؾ3C 'c¬éÎLHæ—V£Z\f=þÓ=U%d4vü‹Y^lŸëN÷y¡©–„d¼{„;$â]±.^UÛœîñ4E,Exl–’"šóp¬L€—4šø–Û¢-6‰¿^îvémUÔµ57 ÑÍSºM’B)â©‘# g2 –\œJ; ‡¨]AÚ¢l-ènº“ZÚ}‘#ß¿5Ô6[¥¢ßKkÕtözUS"SI_SñVÒ€GO'¥šY•i',‘– *§!‘H×5œÜÄ·Ê$õ×xKÂáH=ݸMšTèâu’Eq¸é 8#£¦¤Ž²¥ †áNÑ–c¾U2ˆŒ‘2Ó•s™$(kcøf"h =Ä‹^}4ê'ÁCx¸ÓãûV¥ ›Ã»„S½6¤Ó‚îµÓù“¬ÐÇ=$-ˆÞI"F“L¯˜=å²¥±°`3õ¹óQin—íÈÿjó ¢A¿°›µ¥·CRÙj¬UŠz[l× ™'«ÔH¨C*ɶž¢ÝL‘ˆåHdL¼„¢¨VÄ0Î.§Hø5ÆàZàÌ“s¡µ†«/°Êr7K*ƒPÞü4Ò:6¶msá¾ñÅ!6{meuΡ.Y$¨¦– ¢þh2K¹L¬€¬lêÃr{ðæ/V“ƒÒH›5´u²®ìK¯¼|Ê©5’ðkUY(åÑ~#øµ£µÃÍQOFó¨ÝOF¥]cØ#VJ˜Õ[ÌU¥öí±„âµ˜HÄáÛR çKØs"Mý$oTâSöY䀒¯-Þ$ܨª-÷Ø©êõVž«½¡ÔÔÍ7ðª©ÙÅ–EUj–9Œlþ½®ÊGwøW¶PnLÌæ‘æ`Þ´id"®%Ä8÷1 ¿¿²èÙ5¦›ÔVK={Þj®õ7cªœ5²Y ©+4ŒYb‘w$,¡YpKHëÉ·Õ¢çS¯X4‹~í¼'Ù0½\F{Á>–M—:íU]A¢àŽñ`º××$h·›L"šªv NYœ#¤n*Á†ÎáǾ‡êüÆ?ÕÆcC<Æ×Ûe?¢Â×´ŒO¿š]«ôM‚%¶Ãx¡·Þã·Î+!5+"PÎþlñ:ŠŸvÜKå©dR±Áø^IŒ„‰Ö6åb>¶:OÁÐ-̨UŠ+´öý7,4ð›•o—MCQOLazédòÑ!ÚFöv ´‡` (T—*|=UÏtƒÌwåøYƒ×kr r·¦ûÂm¶UŠ›ÍÞJŠØë3T ©â¦jzˆ"»ÿc R4ŠÐÈD· 6õO‹ðŸÓ8ÓxƒmL‚c”ÍÄ\wbXà `¾#{ý¥O¾¾V¼Ë_qøVcµ1ï–mÅ8-bÑä–à äàçjQÈ@'‘ä:õ¢c°¸àë ÁðI+í·)¥¶[5=K[ÆET§lAA( *7ŒouÎãè=†M˜ú,oiRúyk6þS*V¤ÚG(‚è“+ nÚúÑ]n¤»]ÚŠ*e™­×z*ů©ŒÔá7A3™%„‰–¡‹±¯,…Væ*‹›YÄ2æíˆÒgÏ‘æ “‡Æ0¼²ò,A÷;kóQˆ/ךK•þ–ÉWRÖÊ*Èn„ŠI¦$FPñÿ.6’XÌ­ü’¹Î #,RÊ ¨^Ù.lÆ·1= üÑÖfZÙ˜Û^v¾Þ¨»©Õ d’šKuU ´pVV%Õ4¢™ÿ.¦_*<ˆÈàìŸÐ =\«„mCö07ms=AÔ¬gàjÖ–f°™&|<:Ìj·]-%Âýpž††Ùp­¶4“T…  L€+Â$>C\ûHmÛSÌÇL­ÃÜîàÑÛúi{s<àJe.UÃ85=vçè™ëb¸UH”¶ië¯T$ Fôê©XQÌ,¦£ ]0êÌìÀ¦ ŽGYø¾[Hp"&ü§®šÛ@µˆ«`ös^^K'¡¨©þ 4MjßB @dò˜}ЪAPÁv Ï o P}X–õùóæ´ð¬í$ôòHa³Üÿ‡W\i%²×BëT†ŽWvªi<ØœÄØgÂÇ"–8*(ÎåÅ:4ˆ‡“ãM9O?d«5°¥¢u·/¿TàlÕ’QÛ*ªê<¶DÍEQ2Ê–uªÂylìãh(Wpw!}JOÔ0K¹'å¤o¥ïÐxªƒÑÚ¸i×—”{(ˆ©Ù&¥¯‚X$•hQ$†êÆæ ©R²Já*2xuª­B\éúÛKú ýBMRMSkïÈÎÊKDò ¬iâøšYj#— ÞeHû¡”6Z/P;†•ŽììY s$ê xxrÓËh•ÝFfí>¿$í[E µ¾šZ)îoN$­¦™ò7âC,Xóg/º1ê*°`:¨+†´¸MŒ^|ùÌ)íªÚ”ÌþTVÝo¾Õ]ž«ÿ!§¼iâ±$ñœ Šm˜W’HØ–T+–ȉ6«U¦ZC†§—Ëkø¨£„ª÷Ë=:)-Ʀò©MOk£®òä¨Bñ«3Á!pø&^8­q’ynˆR¦Ù oëæ¯¾¡ÇHè™ßWÞê)Öªµì†Q=uB¼-%=:0f1¼Î¥P ¸ C:ì$‘‹ôð@ ì"Ö<þ¼‡%q¸Â Íôû ÔÕQI2ÔRéêºÚwš)gŠv@±"mx%-´¢’6…Ú ÎÖ$ó(Ô|åvŸ9±úEü ¥Ä1åíh¦Óýú&«N«šŽGn¡–;e¦äŽ4¨¦•Öl^嫸 '.‡¦ÕÂW÷­<¶ŸN“e‰ƒã%Æaºûú'X/N®’Ï5¶j¬KGº:{„2V–KãË;©áÃi'Òª½…pKë~Ù:oã~^ eøª@K÷÷dÖ× ËÊÛ)¬PË_å1|¨¥Q‚óñ»gòÆ# ýþãz,=6æËW¥…¼¿¥b‹Ù_¸Û[t÷m}Cl1Ob¹jmUå5KÔÒOä$’+ï=;/— Dn êUʹBHfÝêèqÓ ìi’$›ô¿-c×U4p•LÎÚ|#ò®Ý+«ïVÛ›k*xm×›dÈÒUÔRËDöÕc*½;É­'†@Î܉^ …ß/o†qšìé5ÎqÑ:Á¶ß]ôWHªüÐ@üxsþ×Xø«<0¶Ú|MHm¶˜c¼ÍW©·-T[é`")åنؽ^KÄå|ÿ ð>6òÊ£cqo©›ÆºÑ,‡1Æÿ?¤ý>ª¯Ð°é--cÓóËeÖwÍCo¦Ó¶MO¬bÒŒZõgÓpÎÖYä z¼ÖL”掞¢á¬Z*ˆŸ$Ð>õJÕq5?QJr‰ Fæ3X‘i¸±: ²ôœKâ&âp ÃpdŸ 76ældxü!Õ:ËOÖxµâ¶’ñ‚×j ¦YŸÏ¦i#“ã T©¦¢VŽ’ Ä¿-41oO4f5Þ“ út+=¯nHÐØùXi}×™cf;3ïò¾W¾ÙÚ˨>Óž?^tuu¾;qÕ·X(„BV¤¨£Š¥âˆF$HäE *åáFQNG_ª8' yÂR}#2Ñ®öW‘«Å×–TÝqÿþ¨hßÌþ$rr r¬>XÆêÿlú«HòVèvUÛÜxõKiá­¥Ž#[OIDÅ7=e¦µ\Ic{m±²/×—÷I?›ž^ 9]á½ÆŠŽ;sZh-tÓFñQC â™ZA¸GÂÂ(Q#+!R@Èr8lcª=Ϫ ‰Ôžr/;ï×HºÍ8'µÙÏî6·½öP:K~±„%¢ïi·¼)*¤à¨¨‚.!(HЂ±º˜öeR0pÙ.8¦áÝÚáždéÎç~rŽ~I‰UÌ 6ߟžúx¥én¹WPM§–Ço©¢Û$¢…«+ÈJÒ¶Q‹U‘”¯ÝA¿GâìU3Úš„Ÿ[È ¾kWþn»À tÌù&iâY§ªŽº’¾¶’j„š¦šXe€m å …G.Ž¥hÎÐ8'^=‹i5Zè.E²™ÞÇ”u•§C^ç ÓoÂGü2®{…AO‡¾Ó¬_[ïsY:ƒ„õmf—` bÄî=†EWã{WQÐã`IÐu<§˜ä³+ð·W¬sU¿Ûuª8ª®ð´4,özͺ­l“l`2E Û¸äqµ‰pB IJ‚ó˜sk¾dÖ<-Í(Šn4ÜámöS8(+®“RÐüŽéXÊ'§J¦’§•#Þ91ô¶X€Öe<@hHn›\càzªU1”é<5°é?@¬ê8­u7)M&¶{†©œÒÇSùum…¤…Lk"@|¢]ÉP ª‰dëL¾»Ü’2ÌF°mp`m©Þn G 5˜è}úØõæ-Í"·ÑXþ*šñWv¬¢¦¥‚ªÝ=mifHü¸ÌmÂ:‚f(ÚÁ !AØÆÝkžì®lºC€o3×OœÍÕJŽkƒÞío©ä•[ëe¡CÖ’µk«Zf§’ª¨ªšX%§p5ÌfÚŒdFQ‡åZ*å #—‘õµ™{‰Xø7Wk¿î´i¡ïè¥ÑzSSÍê«ÿð[£Õš©)=L”T~Hv‘5’b2¢(±%²‡o ŒªÆ¹Ì#.¤"Ç{ÉúýWµ¥Aµ!¹ò‰ôñ€“\tnž »WXhïZ¯TYc¢hEt•{þ*øŒTI"åùFEBцnIbÃÌbxÓžüîf˜Žbò?{me;›Àh–êOMž(­µðßû0m*:MsÀ}‡Qïk-ÿáU´o§Ød~Ãˈ¨&cží§©:tÚÆzk©K­‚½›¯ïߢhÊ-ºÃ@\ªêª JYÄO HÒ5uhÝÙÌ‚"C1Û,Nÿ+­ nÄÕªsˆ»ß(Oé)^ B‹Ëéê`kê#nªK[A œGyµW-)¨‰å!š†©¼d‚ÙV$`4”]˜ML+‹.;ÚžÖúÆër³0ú=³õÖ|”j®Åb§Õ2‹­LÖÑMW$´Þj-ªTfˆ™<²ÈÁ˜"‡É ÑeK±œÊᥠyk#oKù[ª¢ÆP5r‚@ÖR‹µ&¢§°Ïšºž¦’–…‹È“H_ÈM´JŠO»¢®@$õc<µóshù_Ék<0´:5Ž©â’©¥Õ7 ¦¥«¦ŠÓQw¸|+磎wz™€9ôÆ7y¤ü­ÈÊ}Go‡ðüEzñÖgcï{Ê ´ÿñÐéì)uãUëÙteëN_5,TÚ~«ÊµÍo¨ª¦&ª ¦8ÛȉVI)™¥P^,F«:1Àµ x-©XÀ ÄØkWìÞèÀ§ÚSSørm4ž뛵åH õXä·ùáNñ <ꩺ¬Œ{Q‹lb²äkRãU0õ h¸Å‰µ…í¨‹–¦ÉÜÑRÛ.¶§‡Su§µxcvª¤‚éO}•íÔWp EXk©(f– 7Äj „_Ly:Yãï—åy,÷$ zrä™W ø/nÂ~«çv šÝyâ¬u²Ch©¹Þõ,ŽC”Š•§«¬c¨‘î˜`(\=¿¤Ÿ áË*S¤y5¼¶/Šñº S{Û´•ïU?ÙÂÛ†•ÓZ+Ä]-þŽÍCW*=5UM­q›ËY$Í;Æ»s¨FaI$õõ¼_´ñvÂrõÑ|¿ñ Zrh˜Íj¼ùÿ/<#ð“S}‘|)ð×Âß4Âm)tÔ×Ê›D,•w–­icM#»”æ‘w¹õM.0ã ‹8:TØ $Æ÷´úíø¨xuZõIÌ­&=W¼ž2ÐT诳Š-9´Ð¥/…v[lßÅcbõ´IcÔ_ éQ‚̪¡”œõç¿Ï-k>ŵÎÊÒÖ j{ìµùïÒVoøü œb•¤‚O…ט^%Õx“Wi’j œTÔ‘Ó-MôôW‰Ûq4æzw.ÙWÎ #ý¹ìBæö ‡P|ºDó‹ò6ñê¿Nñ !I÷îëͯ¼Cñ7Bêû~š¹h댶ɥd¡º]ie¨ˆ©òá bˆïLÒL’H\á›håA?Cà?àÍ]ÏÚ¸N„è uò^WÂX#=޽<†ÊÏÓ)|{ý½½ÿ㵺¢Ž‚8bI$³Ìr2%2¬e‘R8Ú6…W\mÝyN ÑÙœ3se$›ˆˆÒ5#péñ áK€sÌŽ§Au~i»ÖšÔ6ñq‘i´•§еÕ4kÖT(d”‡&)FÈ’U}í¶&Ê¢ú¼¶3„¾˜ìƒ³ô õ´uû¯A_O±ÊAÖ:}Õ“cñ Ãû\WJ ž—­®‰¨ŸlµÏ¦ÕMÁÉ'tÌ¥wm ÂÆ0âqƒ«š*ˆ$øß™ð÷0®³ŠÑk{2%ßÇ/50Òž&PÔO}ÔzrËQf¤ŠZ‰«(êR´ÈîŠÛ§ô¿DrÆQ” Ù !‹`1jÁ’³_Gh ¯°j*ën¢/t”­ ÙUL¿ÌW•àc TLx¬ÊØà(êk‡¦ÜÀ`ä­â)·´¹´i`<úuI^¬1ÑÇñ´Ô6Ú߆©€¢ ¼…®٢3Ç— pÝèÜp„ô‡·3‹¿qí1_{®í \ÚD Æü­·Ñ;>¯²ê:˜#µEúw0T¹B]Ý!]­ëY{añ&ðøÈU,º¼5âñ úmîn.›Ür²þϯ¿8­âÕ‹ø­°¨Šs%LU™”JžXÛn’3Ë(,Osî®ÕôÉ-Àþ 0iRý‚ú™Ú›(mmŽxªÅ‚{u!j£ó$òFž`ÔðF>á dc;‡L§ˆîç$G=¢Ãݺ-NÓ³±mïïä’G)§†YkíÅh¼Ù¤;ÁHØ É&¸Ê Ê9ÉêÜÕ;‡¹6ò<¼ ØŠ©vnß鯎ÉÒ¢KÝêîZjì^mˆb§ŒÇQ @Ûˆu@Å”`*ð]€sݧF7vUXIóF³ïtŠ•šê¤´L®¹Ûól¤‚åuÔõ7¦§VI+žG@ žzN†~w‹$WÖ¢–¢ë--ín´’«ÍGð¿+.@Vo Ñ–œoÚê„ P¾Ä³‚áÔØrT".fuñ‹À°7ñÔ¦›©¸L‰6øù§›E²ß“_fÖôÐÔÃG5\Èñº#L= ™!ž #ùQy’¡Û¹FÆè14ÅHÊðdé3}|ˆ°•©D1€—¾ñ'N~¾_`“Ø ´[íôð-ÒûXˆ´þ¿'†òy.–/"mô„ÀÚ#@ 1Æ7 MÏ–o>:ü¤oæt^…•™.6åÍBE¢K|×JkußrÔùT³= Ñ+Êîìâ½ñ³íDfÚŒ¬ƒ¾óx}jl &œ_”¨Öû&‰‡È¼û×ß-R:Zyž–I*­O ÁM =Tm¤Œ1eO+tm‚±3§sIF`d8´<:yÇ=µõˆä®þ•¹|¼éôÑVªŠÉd«“Èo2J©+£UTX“‘°EBí¬9$7L¥R™h9ŽnQÝ‘©™›ŽA.€ kö÷¢w¶ [un”ÓÖ( ±AT¦›Ì†ªC ©TÓ,¦PÄ2©Y=,ª¬O˜­ÐÔ¢çR5ÝÞ¸:Iß~@s×]Bx¨ZáGމÒãsJ:I–Oâ0ÎXÁ†…ÍÌfÒ4_&E+<êT圆 »ôiàúf ÎgQ=N²,zYH¬Ö—ÆcÒæyèžÖšµ¥ª†ê-š~å$±TÓPÛ€@è%óeˆT3†@Ñ8]¢I˜mž3„Ö÷´ªÙi°±`Û‘?´tTö—ëá7QE›œÑ=<TGSN!šäÄj ¡¤Æ3 ö«‚H8]¤g3‰á"–SayŸ¿ªmæ·,@´~!=5ºžj 41XH$ù%ëË(gå‹?”¡Ëç»)Áê¡ï–ä‹Lß^qóå“j»4¶˜¸úJrµ×ÐPÉuŽïi«–ÞKÔ¨œ§™‚6§¥L†@òûN*G#¦3…´ÅWÓº£¡Ðéqq îåü3NÚëm’Sêš·iâ„UTPÁGT:V`ð‚?še„aÕpOZ58uPîÞƒr´ÌëoÌÚV›”ƒìl¡÷-GAkÕªzK5Et !_‡þ!N²ÆÑt ÁcVHÔ÷ËoV=Oa­ª]#ï?9öUÃ34ˆ€5˜ù&ïttš¢ºÑM©5~Ù«(Ú´µ/o³¤µÑÍMLõ Ÿ æµ1ØK¯’÷¤_kÁqk—QµH܃:H·Ë¢¨Ì51Pº‹ÿEZ!èmEáÝúï¤îÚV} $ÈíO|F‚œMP4ËBĪQ>"*ƒä,,ñÀõŸ' \æ4þÀ_uf«¦ÔÄ‹[BžénÍQáuïÃJÝ;¡klò*IZÛé힆†H'ØÒ< î•^VlŸ_–ʨœ?m,1¢i#\¤x‚F¾=S°ôIî‚dyªFédºÑÐ ©/š†ž9§ÔSRU¤qSª0Ù'óU”ÀÌÞY\,j¡¶–b*ϦöÇÜOŒrêªã°•Cƒ˜mÉCfÓúRžÒ.’jûe5‚’–ª¥W‡àê¦^JHÜ÷͋l*ÍèQ$S¯ó~<ÏWSYíÊ]™Ö ÈÔLgÌ.ÌrnG²¤šrûqÔx…S£µe ÒÚ&£»ROUQMÖßNé,ÏS¤x£ZIKmŽ<‰ÌeU#K…b&³!ÓñÞ§¯"³»7öC3|í'Å_ÞôQÕ÷JÍ3¢-Z¶ßCc¨ÔtÆÙ-eóâìqCPõw8h+R\iêEÈé¶ykñ.ë+”‰=ïáxfSÍIŽÒñ¬~¢æFéΨv‹ù+ç¯ÃÍ®|K©†Ë¦4ßRÝ…WO<;À§3ÎdbÊÆç'pÉõ ¼?ázµIÊ#oM×Åx¥G¼ã>ôþ»e¿³gÛ›_M¤4×Ç-IeµÃD•ð[#£¹ÖÐР¡jÉ•¢oKf•[rûH}[‡`qLc[R¡<¬Î.¾_Äqø^ÑÆ ˜ñª£?ÆÃÛ4ŸâIj6z9)íµþ鑤vÜòy•tn^”§lÓíòÓ …ÝÝØõ‡W RµW ÀŽe¹Ã±¤pŠmŸö©é-÷à½Pÿ­ASaÒþèúÙj´ÎŸ®¹ÒÝRëIp‚)Þ ZTC ±¶WâYßÍfR¢Tõ<Œ?3ÿõoñ[ð´°œÌÊ€Ôp½òÓÒ]š7‹ÙzñF›»\cÁ/iÊ÷>}y/«ü{ñ 4—KÕqÖú¶ò¨ª(/‘R¦p$ [H†IWØ$lJã 0züMÁ¸MEb0óN6 “cÏr|º•÷ñ"ÁÜ1ã~U¡ñçRk»EM>™5rj™Ém `Z”S$'áLu9Wc6ónR6}l_ ­MäbCDi$z”i$j­R³ËªáÓßÉ<Ç¡¬z©mµðhûƒPUF*^çyŽZ—®¤f Bi£õU‹j0elμ¾]~H[…®ÇÃ5\}çÁM§¨ ®ª³XotðY¤¹ÕUT5 (?Yuð 71ÛKîþ%zâÄC…þ¿”×rºÕÞ#«³WSê:hZB’Ðoª·ÓÇ–/å Ñ¡E‰¤bÀDÉEBÕÿNZþè<ÿ?Öòªâ¸‰È,༄oÏšäû.ºÔ6» ¤¾^n´õ‹==Â’+¨©J¸’u"qM: "rBɘÈ1–Ü}YÝè?OIÍŒ¢Fùo$=mÌsY”8íw8‰íæ}Ûä¦ú*±.ÉC{ŸNËpTÑQÓ²1XÊÉåùì {B)Œ«òΦâ*ãpTÌ=“וºsPx”U‡Zþq­®¦·*z뎣dŠï=LŽ QŽxä™c‚$Ži™6U— †ÚB®ßKžÌçí1ç:Nêö Q·#_8·tÙ$²I$Ö[eÖŽ‚:U£†¾4w’ˆÉ€ôõ0ËdŽSé+¸«þó–±ÀÀê<'CëîP{Øßû?hjIÜÛ§ÍTñ‡µWÝe¶iû©%hhžœÕMS,äãiYòó±%³—* 14 c­À Xl:Å´ÒŽ$T%­±çÑ%®ZêIÝf½[.54êÕ0€‘ˆ˜¤°ÉÄ}½”€ŽÄ†j>3Ü`ƒmyo·×ºiº›QÚDOÔóÕt×€_c¿´/ÚÏMëkÿ€>ÃãuŽoá÷V¶^-ÉYS+8ƒá¦š$;wYÿÍí…ô¼?ü}Äñ4[Z‹A¸—æ&}ø¬Á¨àXÖËt›es•ÞÅÑZ¾ñ¥õµ“ShKC[SoÔVªúo*¾‚ª&"Hg§uܘ˜{åIãÔ¤ùî!Ã+ažê5löÀü¼¶›é²Uz5Çv˜‚wÓ_r®‡¯¦´III§(múŠHåSñ·šh ££˜0E/SV-¶3)pÛ*¿”À$oHš­ËšIoåò¿„¯ISÚܙ˹“úë®ýDlœªénzb‚ë6 ´Ãp³>Ò8×Ì0${Øæ,­.é’-©“!2eÝá´¨‘’ãO? Ðø,Õôÿê{bMæ¾@ê±5÷u;ÓÐkŒ6ô­š˜[ÝéÀtr¯Žv=;š@ʉæ1 ¦îeQxÎrÜf \Mµs$žr¯Uàa¦Kà¸i¶‘®÷ÑB®ª¶ÅmŠõ{¨»Û©h¶E›X4ê±)=4· Ž WbÀ¸|!–pеmJþ&ÓcµÄ ,µ(pšb]3üyNÊgc¯¢¸ÐBú_PÚ®n®ÒSm«|GK3ÄÄof ¡ÛÓéõ©{0qmıùk4³¢à{ò2†ÁÔs‰s¬¸J-7;媶–ß%ÉLuõÖW˜Å,`ˆr%Œ]ÈeA dGœùˆ¸÷}7U»†«NŽZut™½­§¯ðš¨e±Y“Ì⣧a 3ÓÔQ¥DˆîŠ#r3·™»„“qàÑ¡v"¡Ès™ÐE…£¢<6(ÌØLÚÃX ³ÔEQt£¦­ôõóÈjÍ ä‰$‘K +²HLM&æF¤íΆ(9/ƒ—§X±t¸#É)؇Na®‚×#É4ø“SâqÓFÂ{¾°jÝŸO%Í7ÖÍp[ÉÜ)9’G »2T+Xç¯oð6…6³|Sñ0HçÓ~°,MlCr¾‘}èz¯)µÚímž¦Û¨|EÕzvª³ùÕéåQ¬Å×VEEõà®ÇzƒÁõ÷ÌÂ\«£I®`ñ"Þ~÷Xu+¹Î..˜??D›N}ªüoÓòØé'ÔÃRÙ(dPmÕpEåO¨yrº*¹’A÷ËÙÏ·KâŸãΉ”Á"<6ž‘¸Ö$ŽÐÈÕv]ÛûB›-²ŽM'±ÕE4ÕsÚæ¨Jµ/„ËL|¹FöŒåä"6ÜõzÀáÿâ7KÿUZZ?l ó$ƒm´ºÕ¡Å‹d´Iq]9õ^6±ð—^Vé:ÿ(.:ƒN×[!½æ‚ˆÍwøÅž™Yw&zºv¨—Ac³qâ8—Á˜ŠòÌÌn¤ƒhÐòæUœ^=°\ÐLôP['‰6 VŠÕ>£´Ùªki©i«i’O>†©üâÓ#,²Iß$ u}qV/ §ôÅïε«<Y¯Š5UIGv!匤~jÈ“ îÌŽÛÐcâ꾋û7AHÇM'ÃiÖÈ8…ˆ²øÃ¡äÒºZ‹K_¤yîv*š4ނܛ#¤¡¦XdHÄoË ®á»8ÑtÐÃüE^3AŒhsæð9 #G ýuÖŽ µBü¯|õ=:%”~1h 5ˆ­tå³Å;ÍöˆR[Þm{ðW+cÔÇ3TBg¥/<¦ $ˆò•Ê \·=nðþ7O °EÌ“.t’wYVëQ®Îó ùî w¡ï·Oj­5ö›³Si9+åºj])|5ÒÞtõ+VmŠ:Wòjï)‰ÙÚFXd„ û*K2¢Þö1Õ+·i“¨¾œô-36Õ#Š B@›ÜùwKo…vÍs©lõ%ê»¶€ŠÊë ´éøê.÷XÝÒH)ë-µ“Ä”pȳO$²<Ò Ð"¤k¼bž4ðÚNs[0p6< í¼È:!Åqv“žI÷õç*]àïÚB·ì÷P4>•ºÔøáMÙÕzZhí´ú¦ë-/•ðòM!žª*d-O!—8 Ëf™_¸gŇ Ü\È–ìEü òü V˜¨)SlÌz™ŸEÏÚóRÓkmI®5Sx}¤íë•U]®’ËQfˆ›Eµð±ùR$0 ž(ÃDg1¬²2E&CÛCñ~ÕÎ I‘Ž_Ìo<ÒŸ^«†gw@Ûïä¤T_h­šÏÀªOé¼QñGÂÝ)¨òŠÙW¨êU¬2=ÓI)Y!F±ºC$ O&<©Q¢vëÓü?ñÍF9ÙêKNÑä·¨™\$œK‹²ìs瞪“û-]5gÚÄ}ö-Ô“ëzíU¤µMþí§oÇ£·Ý…- Òû¢ŠsJ³‰£@R]±‚‡áÉ?ÕñßÅ?ò˜<3^eå²1'¬u¹_ø»0O¯ŠÃŽã tÓÿ–àȘ˜^ýx/ögûGøm¨u ='‰ÚKIiÊÚ 8ÂÒM[]URo0U*MONUAr’" ‡!†AúˆÃwžWÌߌkÛÛ}u÷ùç+Â/·¦Oþ/Wß â¸ÜÒÕ§íš.ß]UJùCªžáZñ—]©ƒWRUXÆ8ëç˜|Kªq*æt-ƒO™ó_Dìû>HóW[ä’é¿ñ¾×ÜüyðîкRí¨-zgFÒXêjêÓ1Ir«2ܤ†:ÉU£V %"ˆk •9YzüKÿÕWÄ'ÇÃhUËØ1³} ûÆF¿¶ éËEô/ñŸ spöïºy X­º®¼iŠéè5 Êñ¡nð6¦¦¸­®{‘7”’<È#§„ò"Œ›ÌI•7­¾ðÿ¬ZꮪžAé5$Î9sÕÛ€obYW²åÛyƒ^hk®œÐµbáíÌÖÚº«ÜtT±ÓETïæÀÑN²fO2d`WÌ’%Üx*¬ž’•*¸,OoœnØ$ݱmÐI;Þrq-pd4 küTÕèõß‚vÀô~%i;½-m4piÛŒÖTܪ!¹NDÓyO³û­3/¨nn²[ú>!Tš”‹&â@¾Ä.><¶ºSðô2ƒ—8ùÖú Xé‹¥Vž–îƒÞuE u|qªÍ¥áíh¶˵Y>`Þöçøü-ZuE‚DÛÊ÷‹r:[’fÉíeÖ˜¿OOÊÕúNýx¬½]â½SÞ¨gk{Ol‘©ä»º«OÅÒ$š1ÐÓA¿4ùvE¤ÔÖ»Í-âågßæ×%®hi«¼qH•-&áþ²ådË‘:’.`ñB›Øié$9n¾#ÍmÿȽ”œ ‘ÒäG ÔÏ‚GvЇPGmÓt6ëüqB´³QÝ®µ+,ÑÂ#G’D¨…^%GÁ2J¾³´Hʲ>.úUMG´C% „Xëò¸ºÌÄ æ©Ð‘1=v1õPš­1¨(jknrÅ·xèéž7¶o¥‚Œy’æDG—2).ÌŠ”Ìϳ –h©‰ÃÔýÆ$o°ä \ þë ¼©N‰¨ò`Ì—+ëÊå?XtÕm}¦ë[Mo²I©)¤økm¶é4ñySÂc<•JîVv6dÜc“$&Õ¹F¦؆Ð{àÜáy‹67´|Ö•‡cÍJ9†Ý}5ñóV•²Ï%’ÙUyÔËÂÛååÓŠM;Tjd‘þåwd0«D6SϱYß-µX«I°£ân…£5XM†àH~V&ЮŠÔûL¡²mU¤¹Õ‹35 ©Ž²7˜NÎÕ”ãwò§–.Ì¡€È¡ÈŸ-‹áÌc@ÒÒDD|‰óV0¸!P¶­Q•ÚßhRïNKKt¶]n:mæ¸)Eøš)çN¡™(!O–¬åJH0 Y$ä3/ CMí©M¿·[H¸µ¦ò½îÔ†RÊu0=-àKmµØ)i«î:fAó/–° Du |¸ê¼¶Û}°¦íK4YB´«ŒC`Æ÷×Xùïa N´ó8ix÷·ŠË5ºÕnK¢ËUhÓI%E-)¤¥ôÇC JŠ€«îØ ¢F€²Hõ^­ZŽ­RKÌη'oH鼪X‡v›D«\Ú“YéÝCfÒ6 DÚ’™M “i‹}D#3†VZ¨ewPe*¯ä©EÜÿy~—Áª -VçqÉ@qŽ„xÁë!PÅ]ÝÐä¼çÖzÅ-§ì~%_¨ü-»Øn£ã)–ž‚ЧÈòbzˆ8Þž)0íå±òÆ~åG…{ÿNÇ÷… 3¸ÔÜhVQaÌE—>Õ\êc‚jx*í©OQ—h#i=äedŒÜÞ½ñÇ¥¥QÔÆºªô˜u„™u eP­*Åh1…Uó¶aþP¢]Û”c<ƒžÞÞž­TÄ9í!Ú& e’%;Tk[Íu%ÎýpñVaèi”×Ô»ÉWtbmÛ“’[nà‡³ŒWÂ`0ô˜; Ð=”Æ9àè,£µž!jËX®Ô7[¥æë#™j*ª®UsTÕ¾oš È\± ä?Td`›Y”ßþ¢<,Ž£Èv`UÁMö¾ñú‰l±Txx¸ÃH¬©ð-Áf…‰ ó¾Ç_K„`î>ñ÷o‰üÃqv­H[•£{AÒÚßUwõØ+‹Bý¾µþž2Rj_ ü+ñ5*¼¤®þ#D”ÒM²âŠªÆNøÖe‘U‘8!@5?Æ<=Ä–MÄ ƒž’}~JÓ1ÁÎÌ@Ô}¿Ný¼^ÞѽO‡•vºuV2%L~S8Pƒ`ÚŒ8Ë–<rAÊc¿Äåò;lÇiõZxå?ÚGåYý±ü¨‘.}mn»E$²ƒ-¢FŠYŽ×ófÛ#Wrå’*y`U‡Šø—Š l0ƒÿ»o1cÖê+c0uðN±}£þÏ5•¯TuÊÃÂ3)–ËU Y I[2ÎP‚¤ú˜’IÜNzÏÄÿŽ8Ý;d“Ì9§m#@¸XX¬6'ýfþÕYôþ"é \••:KRÛui§v–‚‚¹¥1GŒž’2΀qêR‹»¹óø{… mze·0H‰^‡ç …në‹›sý=RZmA@÷[{jCs£Ù’<³$I)l)P[º˜»‚ƒ‚Æ:^'‡¼³þ£3¿H¾ßÞÖI}@`ÜyrߘÒT–ñª­Tö™fZ[Æ÷”ø‰¤…¢b‹ÃˆåiY”H»‹;.ÐË×`0ÅÕC^lZóÊ-ÓXVðÏivZ£ Ûªó{VÔë˜~Ð^#\h)e°]ÒéO©,µvºé• ©SOUé}âHÎdá–O1NG_Пðv,¿…Rf¡&ˆ2lcMmЗ’ø–Æ’;®xÇÝ}—ÿ…Ú Uxáöw†ÍâΩ:ËÆ;$ÒRÜn’ìøŠº';éŒÁS")ØÒ …›, ?±°X×TÃT2ácïšüóÄð§‰!ÊÃìÿKÆñð³Vè_¶çø‹xëAIUq¯žÏc¬³"Ó´¤¥}ŠÞÒ ’ˆ"0–öü_-ÄÖvˆªÑ$º~A} æWÃa¨¸À ß|Î G¦é«|]×:’«U×iº›¼v½OM÷btw*ª)ê¡*¥Ø˜$Jt®2® (1þp˜ø~/ ñ>1üA…ݳÜö8Ìdx–PÑÁ Öþ¯†86Ò¤ <Èî²/nª³¹éûî–ã¦`Õú[XÓ<Öºj÷©òcuFE’CæG(òÖ7½BmÁd%‹|‚¦9Ô†j.-´’,†Ñ·3°+[Vµ#–ƒÁ-ïÁV:ŸÁ¨ëê.öHéô6¦®¦«[µ4‘Ú’ùa$bÙ‘Ú=ÁaB6˜ò©÷Hõ\/ãÜCÖâûðD‚Ðg–±¬õ;-Za•ZO9Qºß´ eMS¥}åeµS™K­Käó”¬tò,r”Š1¼ÂT'&]ŽTíAÿÖ£©‹¸Äº-i G Jª(h°SMOm |¸WSéû„ðA,­(Yf„Π/¾6Ž0à’Ì€-ÁñÕ8±}@ú`glŸï`“+3ǽ¢£DMüæ>…F©¬ôWM®+ª¤RÇ_nžÚ‰1H¾b‡x*â‰ãUV wE0À1>“ ÅjS®÷±Ðp5Ôic몯MÏ.Ûóù‹+PéÔ»ÑØ¨êµF«»Ú¨$“È™ëÍDÔÔÔˆñ !iTy’:BBŒ#‘ë ¬Çç–€M­¡&÷¼ÆÞ1´¦`kWs3Ö6忾cÍBï4”·m>iî57kí METOWS<¬$yªð»Z!#SÄ%_(·ÜÚ¬BipŽ(Eh!­Œ€.gIæLÜ+Ï¡K4—À'ÞÁ1ÑSëj”£Š+/•’þº+¢ÅTRwe2HLùÉ+nHFíàIèÚªç[‰bp”ÛÚ`pG.V1s©Úב ªöži)å*GMaÔ6Dµÿ]!5º¢©©jÚ—™©ˆt*¥B;33Rs%ظbO˜ÅvNkªRqžC}nnЬì$³ Zجé;û÷p–¼ÖÚxéaÑ—‹&Ÿj6Ý,T­,‘TCºWy¤‹taH Q‡òÑ=¶ã¬Ì@{ç´i%ÜÅæÜ¶Æ¤õMh§NÃG¿¢ASuM/(™jM5\ÒR0’6z£Uë•’2’4{³ìAwCpN{§YbmÒ㤛x^aX·Ó£5AÌLïõù£ébÑ÷ˆêÿýšhä§Ù-UBÓÅ ÁP!_Tj9ÄåàaŸ…ÁÀb_YŽæsm$Ø“3¯(p±…S]¥äXyôþSìUÒKT–úºHdYšªH¼çiØ‹+€B:z»&î0 ©¡QŽc€}<4<ùª”„wAÂO‰ä}¢hÑh¤Ô6{=Šs’–4U&UöÆ#VØHqér À‡VÞÆº¡x$É›˜_—4ªx€]š³=/ì&7»S[&©´T^è/Æ’O*’xi|©!Fòö ²¯µ¶¾Ð ž:wéAh«L’ õˆå¨Z­ìknuŽZyN¿D’KÍÎïEW ]-à¦Ix–¤FÍ`Ê -Æ \Äî;Y²öÒfpàë˜þ§N»tAGV¥†Æ[t:iéoeÙjª^¾Z«u]=tçmKÏQ z|– 3 \«(†]ÃÕ°Èž¢ŒÜCÚFb.~_ÞÜù*-á•‹;»óç2¢×¨¯02Ëi¤´)›ËuIÞž¦)% Æ•EŒ6yõn䦕J"s“å¬Ç䣪×5‡5æÃåo\]o·D¨´Å_\%Š"ÈñUom˜ØìKáÓz©Î -“¸¶iÒcØìƒXÔIµü4·…£UR³çÿPuòÓóæ•è=WQ_Æ9–ÏÈmòFôë$gÊTvî^ÀuGŽpì¤È¿5škEX'Ϥ.Çd¤’Å]g¶PÓéÚŠ þ ¦[8¬«Ž: IO,Œþc­Ÿ×ø8ÝŒæÞ6Œ2›œsfÄó… œ£Í}_-ZÐu<æ5úx"5å² ´vžÕõsWÖßå«»ÁæKPþRCM,ðÇÓ‚!ÛåÒÆ”$‚yávÙŸ²‹[ÇQù‘Èèµ8v˜Ã †äÉúÿQ¢®ôEÞ¾ÿ¡“XW½"]•îžRSÒC ­= ¢¬Hq¹È9ã€GX•øU'b»#1©$™7“%_fµ_ÞæGQ;‰Z®÷UIxzªjÚàa†ÑI::…fo?t•àŒq‚ÌKªðª4Ø^™„ЏFй1?…fÕ5TT˺áq•b¶P¦`”ñÉ%OòãA…TV…T .:Åâ5È`pä͇þß=ÒñT»Ì2tyBkhä¡´j:áSSQYäI8•˜# pþ²c ¹¿’¿{9ËËÕz5Ü÷†"'yÝ\m1•Ï77×¢p¥±['¤ÔÔ@eYêkíò¨cèáº%$grmmÂ6÷Ài€Ô£]ÃÆó-Ÿ ~Hp]÷773ò ¢¶¦–ÑSÛlözMÔ¯Tα³¥vÌNÜ0çŒð džOõ—aë’æÉÔÜ@. ò ¦ö&þ*ÐÑöûzèÚ-Q5mê¾[-\“§˜³Ä*Œ{3è †bxõ1,rI=eüMŠ©€ã/ÁáÌ1‘spí}ªT®\\]¬(6‘Д—Ƕҋö§´Ã5Ê–ˆü-Jæ$jŠå‘\ÂÊ-”Û|½ ç ©ð=©úcÃÅ]TU¦s7ýlmnb,I:‘¡^SãçàßPžó\:MâþF~ý‘Äžý§+o>4x~ñr-B)éíÏAcÕUv«|±A ´TÌ»$8Ê€=º°îJ .x’•ŠÌmJg#4°÷ºù•ûsˆ´¯ÛgSø# ü0ÐöÛ5ŽÇl·ÕM7ò ¤®vžz§ši™§¹Ô1V,mˆ*.Á×à_þ§jÄj0´Í¡¢ye.úu5÷¯„°Àpª5dæ{¤ŸGШڨªaÔšFTWÔ\­Wº‹˜®’¢(ŒÛ¡W(ѸA圧n^=Î!¹­mõØ2¹…± ïçºõ‚›@˧ä~ªÒ†Ái¾_mUµ4Tôµ5Öš cS ˆÔÍ3œ¹$aAö#Ž8ë"µWSih2ç;ÜGߟŠÛ~›iØ{1ùI£m”º:D2h’fJ†¹1˜É™ÌIÎrz«Š¤^üo¬~l²ÜH¦× åP4Õ{Y¨¦–z)¡Z—óO¬˜äŒF›—iØ ÿª€r:êG4¼ë }|PÄ=Ã1:OÒT6®×O]l°YªÞ¢z ŸÍeg<3ùLÄ~U.¿P¨NX6ébçGÚÿP’ʳl’AÙ)µ_nÏt§¦5Ҙ੒PH Ò6Ë1Éÿ*gghÎyÎmZm"HÖ<­6ùú«|ˆ«ü§ÿÚ>ŠUg±[)´Ë\VyšõII*ùŒ©S÷P[Kåðßhï{§?¨m¾r» D4 qí|åI³6ÜÇ œú[NáéÙºúIl¨pê…ä°ØDúÔ•Õzázuò/5œSÉp‰g4©èS‚6”ØÆ06ÕÆÝ¬ #ZÇ´GA¡÷­£­¬šÚAôj8Øå›s‘ùJt=²šó.²ÔQl“ÓIPôðQ±Âë ÑRûœ?”‹mÙ IbÌ]Çñ.e:CRà=&vxˆÛK*Øm©”;™E+šžÖCO†•úŽºOζËKu§¦—̆’ªHÑ\cÌE]Á_n7súä`óÕÐÁ1ºœšêªKö¤µÓTTA;Ñ2Ȳ¿šÿ–V|䪉U{m8;¹ëÌš †îåý-ŒÜ+=“`Óö)*s]h¦®µµtï?™ðrUº«²OØF8$6Ü÷œÎ¤4@×Ü*¸ÊäÕhuÁ²¨u- êjJ:‡†®hUž‘j‘pB€¼†オFÏZ %¤e1"ý}ýÒC‡cPF€ý=Ê&{]%eM¶œÃç–É&AƒìW¹ƒ‚I$õÃæ1Äs¢ÈÀ4Tx`¿ÿÙglom-1.22.4/tests/test_selfhosting_new_empty.cc0000644000175000017500000000402512234776363023126 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include static bool test(Glom::Document::HostingMode hosting_mode) { // Create the document: Glom::Document document; if(!(test_create_and_selfhost_new_database(document, hosting_mode, "test_db"))) { std::cerr << "test_create_and_selfhost_new_database() failed" << std::endl; return false; } //Test some simple changes to the database: try { Glom::SystemPrefs prefs; prefs.m_name = "test name"; prefs.m_org_name = "test org name"; Glom::DbUtils::set_database_preferences(&document, prefs); } catch(const Glom::ExceptionConnection& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return false; } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_sqlinjection.cc0000644000175000017500000002334212234776363023624 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE Glom::Document document; static bool check_get_extra_rows(const Glib::ustring& quote_char) { //Try to get more rows than intended: const Gnome::Gda::Value value("Born To Run" + quote_char + " OR " + quote_char + "x" + quote_char + "=" + quote_char + "x"); Glom::sharedptr where_field = document.get_field("albums", "name"); const Gnome::Gda::SqlExpr where_clause = Glom::Utils::build_simple_where_expression("albums", where_field, value); Glom::Utils::type_vecLayoutFields fieldsToGet; Glom::sharedptr field = document.get_field("albums", "album_id"); Glom::sharedptr layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); field = document.get_field("albums", "name"); layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); const Glib::RefPtr builder = Glom::Utils::build_sql_select_with_where_clause("albums", fieldsToGet, where_clause); Glib::RefPtr data_model = Glom::DbUtils::query_execute_select(builder); if(!test_model_expected_size(data_model, 2, 0)) //No rows should be returned because the match value was stupid, if escaped properly. { std::cerr << "Failure: Unexpected data model size for query, with quote_char=" << quote_char << std::endl; return false; } return true; } static bool check_drop_table(const Glib::ustring& quote_char) { //Try to drop the table in a second SQL statement: const Gnome::Gda::Value value("True Blue" + quote_char + "; DROP TABLE songs; --"); Glom::sharedptr where_field = document.get_field("albums", "name"); const Gnome::Gda::SqlExpr where_clause = Glom::Utils::build_simple_where_expression("albums", where_field, value); Glom::Utils::type_vecLayoutFields fieldsToGet; Glom::sharedptr field = document.get_field("albums", "album_id"); Glom::sharedptr layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); field = document.get_field("albums", "name"); layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); const Glib::RefPtr builder = Glom::Utils::build_sql_select_with_where_clause("albums", fieldsToGet, where_clause); Glib::RefPtr data_model = Glom::DbUtils::query_execute_select(builder); if(!test_model_expected_size(data_model, 2, 0)) //No rows should be returned because the match value was stupid, if escaped properly. { std::cerr << "Failure: Unexpected data model size for query, with quote_char=" << quote_char << std::endl; return false; } if(!test_table_exists("songs", document)) { std::cerr << "Failure: The table may have been dropped." << std::endl; return false; } return true; } static bool check_avoid_quotes_and_drop_table_with_false_value_type() { //Try to drop the table in a second SQL statement, //by using a text value for a field whose type should not need quoting: const Gnome::Gda::Value value("1;DROP TABLE songs"); Glom::sharedptr where_field = document.get_field("albums", "album_id"); const Gnome::Gda::SqlExpr where_clause = Glom::Utils::build_simple_where_expression("albums", where_field, value); Glom::Utils::type_vecLayoutFields fieldsToGet; Glom::sharedptr field = document.get_field("albums", "album_id"); Glom::sharedptr layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); field = document.get_field("albums", "name"); layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); const Glib::RefPtr builder = Glom::Utils::build_sql_select_with_where_clause("albums", fieldsToGet, where_clause); std::cout << "This test expects some std::cerr output about exceptions now:" << std::endl; //Glom::ConnectionPool::get_instance()->set_show_debug_output(true); bool result = false; Glib::RefPtr data_model = Glom::DbUtils::query_execute_select(builder); if(!data_model) { result = true; //This should have failed because the value was of the wrong type. } else { //Allow this because it fails (correctly) with PostgreSQL but not with SQLite. //though even with SQLite there is quoting that prevents the SQL injection. result = true; //result = false; //std::cerr << G_STRFUNC << ": Failure: The SQL query should have failed." << std::endl; } //We should not get this far, but if we do, tell us more about what happened: if(!test_table_exists("songs", document)) { std::cerr << "Failure: The table may have been dropped." << std::endl; return false; } //It should have failed earlier. return result; } static bool check_avoid_quotes_and_drop_table_with_false_field_type() { //Try to drop the table in a second SQL statement, //by using a text value for a field whose type should not need quoting: const Gnome::Gda::Value value("\"Born To Run\";DROP TABLE songs"); //Specify a field with incorrect type information: Glom::sharedptr where_field = document.get_field("albums", "name"); where_field->set_glom_type(Glom::Field::TYPE_NUMERIC); //const GType gda_type = Glom::Field::get_gda_type_for_glom_type(Glom::TYPE_NUMERIC); const Gnome::Gda::SqlExpr where_clause = Glom::Utils::build_simple_where_expression("albums", where_field, value); Glom::Utils::type_vecLayoutFields fieldsToGet; Glom::sharedptr field = document.get_field("albums", "album_id"); Glom::sharedptr layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); field = document.get_field("albums", "name"); layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); const Glib::RefPtr builder = Glom::Utils::build_sql_select_with_where_clause("albums", fieldsToGet, where_clause); Glib::RefPtr data_model = Glom::DbUtils::query_execute_select(builder); if(!test_model_expected_size(data_model, 2, 0)) //No rows should be returned because the match value was stupid, if escaped properly. { std::cerr << "Failure: Unexpected data model size for query." << std::endl; return false; } if(!test_table_exists("songs", document)) { std::cerr << "Failure: The table may have been dropped." << std::endl; return false; } return true; } static bool test(Glom::Document::HostingMode hosting_mode) { const bool recreated = test_create_and_selfhost_from_example("example_music_collection.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } if(!check_get_extra_rows("\"")) { std::cerr << "Failure: check_get_extra_rows() failed." << std::endl; return false; } if(!check_get_extra_rows("'")) { std::cerr << "Failure: check_get_extra_rows() failed." << std::endl; return false; } if(!check_drop_table("\"")) { std::cerr << "Failure: check_drop_table() failed." << std::endl; return false; } if(!check_drop_table("'")) { std::cerr << "Failure: check_drop_table() failed." << std::endl; return false; } if(!check_avoid_quotes_and_drop_table_with_false_value_type()) { std::cerr << "Failure: check_avoid_quotes_and_drop_table_with_false_value_type() failed." << std::endl; return false; } if(!check_avoid_quotes_and_drop_table_with_false_field_type()) { std::cerr << "Failure: check_avoid_quotes_and_drop_table_with_false_field_type() failed." << std::endl; return false; } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_parsing_time.cc0000644000175000017500000000341712234776363021177 0ustar00murraycmurrayc00000000000000#include #include #include int main() { Gnome::Gda::init(); const Glib::ustring time_text_input = "01:00 PM"; //std::cout << "time_text_input=" << time_text_input << std::endl; bool success = false; //We try parse_time() though parse_value() calls it anyway, //to give us a clue if parse_value would fail. /* struct tm value_as_tm = */ Glom::Conversions::parse_time(time_text_input, success); if(!success) { std::cerr << "Failed: parse_time() failed." << std::endl; return EXIT_FAILURE; } success = false; const Gnome::Gda::Value value = Glom::Conversions::parse_value(Glom::Field::TYPE_TIME, time_text_input, success); if(!success) { std::cerr << "Failed: parse_value() failed." << std::endl; return EXIT_FAILURE; } const Gnome::Gda::Time parsed_time = value.get_time(); //std::cout << "debug: Parsed Time: hour=" << parsed_time.hour << ", minute=" << parsed_time.minute << ", second=" << parsed_time.second << std::endl; if(parsed_time.hour != 13) { std::cerr << "Failed: The parsed hour was " << parsed_time.hour << " instead of 13" << std::endl; return EXIT_FAILURE; //Failed. } if(parsed_time.minute != 0) { std::cerr << "Failed: The parsed minute was " << parsed_time.minute << " instead of 0" << std::endl; return EXIT_FAILURE; } const Glib::ustring time_text_parsed = Glom::Conversions::get_text_for_gda_value(Glom::Field::TYPE_TIME, value); //std::cout << "time_text_parsed=" << time_text_parsed << std::endl; return EXIT_SUCCESS; //This extra check would fail if :00 seconds are added to the text: //if(time_text_input == time_text_parsed) // return EXIT_SUCCESS; //else // return EXIT_FAILURE; } glom-1.22.4/tests/test_selfhosting_new_then_choices.cc0000644000175000017500000000555112234776363024430 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include "tests/test_utils.h" #include #include #include #include #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE static bool test(Glom::Document::HostingMode hosting_mode) { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_smallbusiness.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } const Glib::ustring table_name = "invoice_lines"; const Glom::sharedptr field_with_choice = get_field_on_layout(document, table_name, table_name, "product_id"); if(!field_with_choice) { std::cerr << "Failure: Could not get the field with choice from the layout." << std::endl; return false; } const Glom::Utils::type_list_values_with_second values_with_second = Glom::Utils::get_choice_values_all(&document, field_with_choice); if(values_with_second.size() != 3) { std::cerr << "Failure: There were an unexpected number of choices." << std::endl; return false; } const std::pair pair_values = *(values_with_second.begin()); if(pair_values.second.size() != 1) { std::cerr << "Failure: There were an unexpected number of field values in each choice." << std::endl; return false; } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_new_empty_change_sysprefs.cc0000644000175000017500000000506412234776363026375 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include static bool test(Glom::Document::HostingMode hosting_mode) { // Create the document: Glom::Document document; if(!(test_create_and_selfhost_new_database(document, hosting_mode, "test_db"))) { std::cerr << "test_create_and_selfhost_new_database() failed" << std::endl; return false; } //Test some simple changes to the database: try { Glom::SystemPrefs prefs_in; prefs_in.m_name = "test name"; prefs_in.m_org_name = "test org name"; prefs_in.m_org_address_street = "test street 1"; prefs_in.m_org_address_street2 = "test street 2"; prefs_in.m_org_address_county = "test county"; prefs_in.m_org_address_postcode = "test postcode"; prefs_in.m_org_address_country = "test country"; Glom::DbUtils::set_database_preferences(&document, prefs_in); const Glom::SystemPrefs prefs_out = Glom::DbUtils::get_database_preferences(&document); if(prefs_out != prefs_in) { std::cerr << "The System Preferences read out were not the same as those written." << std::endl; return false; } } catch(const Glom::ExceptionConnection& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return false; } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_utils.h0000644000175000017500000000221312234252646017502 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_TEST_UTILS_H #define GLOM_TEST_UTILS_H #include #include Glom::sharedptr get_field_on_layout(const Glom::Document& document, const Glib::ustring& layout_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name); Gnome::Gda::Value get_value_for_image(); #endif //GLOM_TEST_UTILS_H glom-1.22.4/tests/test_selfhosting_new_then_report.cc0000644000175000017500000000473712234776363024333 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE static bool test(Glom::Document::HostingMode hosting_mode) { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_music_collection.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } const Glom::sharedptr report_temp = Glom::ReportBuilder::create_standard_list_report(&document, "albums"); Glom::FoundSet found_set; //TODO: Test a where clause. found_set.m_table_name = "albums"; const Glib::ustring locale = ""; /* original locale */ Glom::ReportBuilder report_builder(locale); report_builder.set_document(&document); const Glib::ustring html = report_builder.report_build(found_set, report_temp); if(html.empty()) { std::cerr << "Failed: html was empty." << std::endl; return false; } if(html.find("Bruce Springsteen") == std::string::npos) { std::cerr << "Failed: html did not contain the expected text." << std::endl; return false; } test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/import/0000755000175000017500000000000012235000127016430 5ustar00murraycmurrayc00000000000000glom-1.22.4/tests/import/data/0000755000175000017500000000000012235000126017340 5ustar00murraycmurrayc00000000000000glom-1.22.4/tests/import/data/albums.csv0000644000175000017500000030307712234252646021371 0ustar00murraycmurrayc000000000000000,"10cc","Look Hear",80,"Mercury SRM 1 3838","CA","ps" 1,"38 Special","Strength in Numbers",86,"A&M SP 5115","US","7"" EP (AM-39101, 87), ps, co" 2,"38 Special","Flashback",87,"A&M SP 3910","US","co, ps" 3,"4 Seasons","The Genuine Imitation Live Gazette",69,"Philips PHS 600290","US","foc, WLP, 'White cover'" 4,"AC/DC","Same",81,"EMI Australia","AUS","6LB + EP (AP 552)" 5,"AC/DC","The Early Years",91,"Warner ACDC 1","","5LPB ++ Inc 3376" 6,"Ace","Five a Side",74,"Anchor ANCL 2001","US","ps" 7,"Ace","Time for Another",75,"Anchor ANCL 2013","UK","" 8,"Ace","No Strings",77,"Anchor ANCL 2020","US","" 9,"Ace","The Best of Ace",,"See For Miles SEE 214","","" 10,"Affinity","Same",0,"Paramount PAS 5027","US","foc, co" 11,"After Shave","Live 96",0,"ASH","CH","#114/300, ins" 12,"Alabama State Troupers","Road Show",72,"Elektra EKS 75022","US","2LP, foc, co" 13,"Alan Bown","Same",-1,"Verve / Forecast FTS 3062","US","" 14,"Alexander's Timeless Bloozeband","For Sale",0,"Universal City 73021","US","co" 15,"Allman Brothers","Macon to Miami",-1,"HH-ALLMAN-1/2","","bootleg" 16,"Allman Brothers","Eat a Peach",72,"Capricorn 2CP 0102","US","2LP, foc, lyrics sheet" 17,"Allman Brothers","Brothers and Sisters",73,"Capricorn CP 0111","US","WLP, foc, lyrics sheet" 18,"Allman Brothers","Statesboro Blues",89,"Swingin' Pig TSP 033 3","LUX","3LP, cv/white, foc" 19,"Allman Brothers Band","Beginnings",73,"ATCO SD 2 805","US","2LP, foc" 20,"Allman Brothers Band","Win, Loose or Draw",75,"Capricorn CP 156","US","foc" 21,"Allman Brothers Band","Wipe the Windows, Check the Oil,",76,"Polydor 831 595 1","US","2LP, foc" 22,"Allman Brothers Band","Enlightened Rogues",79,"Capricorn CPN 0218","US","co, foc" 23,"Allman Brothers Band","Reach for the Sky",80,"Arista 9535","US","co, insert" 24,"Allman Brothers Band","Dreams",89,"Polydor 839 417 1","US","6LPB, booklet" 25,"Allman Brothers Band","An Evening with the Allman Brother",92,"Epic EPC 4713621","NL","ps" 26,"Allman Duane","An Anthology",72,"Capricorn 2CP 0108","US","2LP, foc" 27,"Allman Duane & Gregg","Same",72,"Bold 33 301","US","psb" 28,"Allman Gregg","BBC Rock Hour #350 Version B",-1,"","","Week of Dec. 121982" 29,"Allman Gregg","The Gregg Allman Tour",74,"Capricorn CAP 87500","D","2LP, foc" 30,"Allman Gregg & Duane","Same",-1,"Springboard SPB 4046","","" 31,"Allman Gregg Band","Playin' up a Storm",77,"Capricorn CP 0181","US","foc, psf" 32,"Allman Gregg Band","Just Before the Bullets Fly",88,"Epic EPC 462477 1","NL","ps" 33,"Allman Joys","Early Allman",73,"Dial DL 6005","","" 34,"Ambel Eric","Roscoe's Gang",88,"Demon FIEND 157","UK","" 35,"Amboy Dukes","Marriage on the Rocks - Rock Sotto",-1,"Polydor 24-4012","US","co" 36,"Amboy Dukes","Dr. Slingshot",74,"Mainstream 414","US","WLP, co" 37,"Ambrosia","Somewhere I've Never Travelled",76,"20th Century T 510","US","ins" 38,"American Revolution","Same",68,"Flick Disc FLS 45002","US","co" 39,"Angel City","Face to Face",79,"Epic JE 36344","CA","" 40,"Angel City","Night Attack",81,"Epic JE 37702","AUS","ins" 41,"Angel City","Night Attack",82,"Epic EPC 85480","NL","ps" 42,"Angel City","Two Minute Warning",84,"MCA 5509","US","psf, promo material" 43,"Angels","The Angels' Greatest",0,"EMI APLP.043","AUS","" 44,"Angels","Out of the Blue",0,"EMI AS.37","AUS","EP" 45,"Angels","Night Attack",81,"Epic ELPS 4258","AUS","ins" 46,"Angels","Special Angel City 2-Pack",85,"MCA L33.2.1295","US","2LP, WLP" 47,"Angels","Live from Angel City",88,"Telegraph","","" 48,"Angels from Angel City","Beyond Salvation",89,"Chrysalis 210 493","D","" 49,"Animals","Absolutely Live",-1,"Electrecord ELE 03954","RUM","" 50,"Arcangel","Same",83,"Portrait BF 38247","US","" 51,"Arcangels","Same",92,"Geffen GEF 24465","D","ins,soc" 52,"Association","Inside Out",-1,"Warner WS 1696","US","" 53,"Association","Birthday",-1,"Warner WS 1733","US","co" 54,"Association","And Then ... Along Comes",-1,"Valiant VLM 5002","US","mono" 55,"Atlanta Rhythm Section","Dog Days",75,"Polydor PD 6041","","ss, co" 56,"Atlanta Rhythm Section","Innerview Serie #12 Show #1",76,"","US","promo" 57,"Atlanta Rhythm Section","Red Tape",76,"Polydor 2391223","D","" 58,"Atlanta Rhythm Section","A Rock and Roll Alternative",76,"Polydor PD 1 6080","US","co, gepraegtes cover" 59,"Atlanta Rhythm Section","Champagne Jam",78,"Polydor PD 1-6134","US","ss, co" 60,"Atlanta Rhythm Section","Underdog",79,"Polydor PD 1 6200","US","gepraegtes cover" 61,"Atlanta Rhythm Section","Are You Ready !",79,"Polydor PD 2 6236","US","foc, order form" 62,"Ave De Veludo","Eletrico Blues",84,"Baratos Afins BA 007","BR","" 63,"Badfinger","The Original Badfinger Live in Vanc",-1,"Promo 002B","","bootleg" 64,"Badfinger","Unreleased and Some Released",0,"BAD-OUT-1/2/3/4","","2LP, bootleg, cv/cred" 65,"Badfinger","No Dice",70,"Apple SKAO 3367","US","foc" 66,"Badfinger","Ass",73,"Apple SW 3411","US","ps" 67,"Badfinger","Same",74,"Warner BS 2762","US","WLP, ps" 68,"Badfinger","Wish You Were Here",74,"Warner BS 2827","US","" 69,"Badfinger","Airwaves",79,"Elektra 6E 175","US","co, ps" 70,"Badfinger","Say no More",81,"Radio Records RR 16030","US","" 71,"Badfinger","Live Day After Day",90,"Essential ESSLP 135","F","rec 74, remix, foc" 72,"Baker Ginger","Ginger Baker's Airforce 2",70,"ATCO SD 33 343","US","foe, ins" 73,"Baker Ginger & Friends","Eleven Sides of Baker",76,"Sire 9147 7532","CAN","co" 74,"Balin Marty","Balin",81,"EMI SO 17054","US","ss" 75,"Bamboo","Same",-1,"Elektra EKS 74048","US","" 76,"Band","Same",-1,"Capitol SN 16296","US","RE" 77,"Band","In Concert",72,"Capitol SABB 11045","US","2LP, foc, co" 78,"Band","Northern Lights - Southern Cross",75,"Capitol ST 11440","US","ins" 79,"Band","The Last Waltz",78,"Warner WB 86076","D","3LP, book" 80,"Barnes Jimmy","Barnestorming Live",88,"Mushroom TVL98001/2","AUS","2LP, ps" 81,"Batfish Boys","Batfish Brew",88,"GWR GWLP 28","UK","" 82,"Bauer Joe","Moonset",71,"Warner WS 1901 (Raccoon #3)","US","co, ins" 83,"Baumann Rainer","Adoring Jimmy Reed",82,"Line LLP 5188","D","" 84,"Bear Richard T.","Same",79,"RCA AFL1 3313","US","psb" 85,"Bear Richard T.","Captured Alive",79,"RCA PL 13462","D","ps" 86,"Bear Richard T","The Runner",85,"Teldec 6.26201","D","" 87,"Beat of the Earth","Our Standard Three Minute Tune",94,"Radish Stereo AS. 0001 1/2","US","foc" 88,"Beatles","1962 -1966",-1,"Apple PCSP 717","UK","2LP, foc, ps" 89,"Beatles","With The Beatles",-1,"Odeon 0 83568","D","" 90,"Beatles","The Beatles' Greatest",-1,"EMI/Odeon 1C 062 04 207","D","" 91,"Beatles","1967 -1970",-1,"Apple C188 05 309/10","D","2LP, foc" 92,"Beatles","The Beatles 1",-1,"Electrecord ELE 03897","RUM","" 93,"Beatles","The Beatles 2",-1,"Electrecord ELE 03898","RUM","" 94,"Beatles","Sgt. Peppers Lonely Heart Club Band",67,"Odeon SMO 81045","D","foc, ps" 95,"Beatles","Magical Mystery Tour",67,"Capitol SMAL 2835","US","foc, ins, booklet" 96,"Beatles","Rock 'n' Roll Music",76,"EMI / Odeon C178 06137/38","D","2LP, foc" 97,"Beatles","Live! at the Star-Club in Hamburg",77,"Bellaphon BLS 5560","D","2LP, foc" 98,"Beatles","At the Hollywood Bowl",77,"Parlaphon EMTV 4","UK","foc, ps" 99,"Beatles","Second Album",78,"Capitol ST 2080","US","purple label" 100,"Beatles","Meet the Beatles",78,"Capitol ST 2047","US","purple label" 101,"Beatles","Live at the BBC",94,"Apple 8 317961","UK","2LP, foc, ps" 102,"Beck Jeff","Beck-Ole",-1,"Epic BN 26478","US","psb" 103,"Beck Jeff","Truth",0,"Epic BXN 26413","US","" 104,"Beck Jeff","With the Jan Hammer Group",77,"Epic EPC 32297","UK","" 105,"Beck, Bogert & Appice","Live",73,"Epic ECPO 58","J","" 106,"Beck, Bogert & Appice","Same",73,"Epic KE 32140","US","" 107,"Bee Gees","Odessa",69,"Polydor 583 050","UK","2LP, foc, felt cover" 108,"Bell Maggie","Queen of the Night",74,"Atlantic SD 7293","US","" 109,"Berdz","Kolibri - Lucsie pesni gruppy (Berdz)",91,"Anf(t?)on 3AKA3 312","RUSS","" 110,"Bevis Frond","Bevis Through the Looking Glass",88,"Reckless RECK D 9","UK","2LP" 111,"Bevis Frond","Son of Walter",96,"Woronzow WOO 28","UK","2LP, ins" 112,"Big 3","Same",-1,"FM-LP-307","","ins" 113,"Big Brother & The Holding Company","Same",67,"Mainstream S 6099","US","" 114,"Big Brother & The Holding Company","Cheap Thrills",68,"Columbia PC 9700","US","foc" 115,"Big Brother & The Holding Company","How Hard it is",71,"CBS S 64317","NL","foc" 116,"Big Business","Something Must Be Wrong",94,"Record Junkie JUNK 027 LP","CH","ins" 117,"Billy","Persephone",72,"Orion S80-462-2823S","US","" 118,"Black Crowes","Live 20 Juni 1991 London",-1,"","","promo, Matrix# BL 104 A/B" 119,"Black Crowes","Shake Your Money Maker",90,"Def American DEF 24278","US","ps" 120,"Black Crowes","Three Snakes and one Charm",96,"American Recordings 5439-17580-7","US","7 Singles Box, Poster" 121,"Blackfoot J. D.","The Ultimate Prophecy",0,"Blackfoot Records 6338031","US","REO of Mercury (1970)" 122,"Blackfoot J. D.","The Songs of Crazy Horse",74,"Fantasy F 9468","US","" 123,"Blackfoot J. D.","Southbound and Gone",77,"Fantasy F 9487 DJ","US","foc, DJ copy - not for sale" 124,"Blackfoot J. D.","Live in St. Louis",82,"Bison B 44","US","2LP, foc, autographed" 125,"Blessed End","Movin' on",71,"The New Sound TNS j248","US","boot REO" 126,"Blind Faith","Same",69,"ATCO SD 33 304B","US","" 127,"Blind Faith","Same",69,"Polydor 583059","UK","foc, nude girl" 128,"Blodwyn Pig","Getting to this Blodwyn Pig",-1,"Island ILPS 9122","D","foc" 129,"Blond","Same",68,"Fontana SRF 67607","US","co, foc" 130,"Blood, Sweat & Tears","Child is Father to the Man",88,"Columbia CS 9619","US","360 degree" 131,"Blood, Sweat & Tears","69 Same",69,"Columbia CS 9720","US","foc, 360 degree" 132,"Blood, Sweat & Tears","New Blood",72,"Columbia KC 31780","US","foc" 133,"Bloomfield Michael","Analine",77,"Sonet SNTF 749","UK","" 134,"Bloomfield Michael, Kooper AI","The Live Adventures of Michael Blo",0,"Columbia KGP 6","US","2LP, foc, 360 degree" 135,"Bloomfield Michael, Kooper Al","The Live Adventures of Michael Bloomfield",88,"Edsel DED 281","UK","REO, 2LP, foc" 136,"Bloomfield Michael, Kooper Al, Stills Stephen","Supersession",-1,"CBS PC 9701","US","REO" 137,"Bloomfield Mike","Initial Shock",-1,"Cobra CR LP 010","IT","2LP, bootleg" 138,"Bloomfield Mike","Live Adventures",0,"Masters MA 20784","NL","" 139,"Bloontz","Same",73,"Evolution 3020","US","foc" 140,"Blue Bill & Band","79 Sing like Thunder",79,"Adelphi AD 4109","US","lyrics sheet" 141,"Blue Cheer","Same",-1,"Philips 6463 142","D","REO" 142,"Blue Oyster Cult","On Your Feet or on Your Knees",75,"CBS 4601131","UK","2LP" 143,"Blues Addicts","Same",95,"Little Wing of Refugees LW 5020","D","RE, cv/clear" 144,"Blues Band","Same",0,"Amiga 856 800","DDR","" 145,"Blues Band","Official Blues Band Bootleg Album",80,"Arista 202021-270","D","" 146,"Blues Band","By Bye Blues",83,"Arista 205256","D","" 147,"Blues Brothers","Made in America",80,"Atlantic ATL 50768","D","" 148,"Blues Co.","The Third Step",86,"Woolfe WR 9019","D","" 149,"Blues Magoose","Gulf Coast Bound",0,"ABC ABCS 710","US","foc, co, ins" 150,"Blues Magoose","Never Going Back to Georgia",69,"ABC ABCS 897","US","co, foc" 151,"Blues Project","Live at The Cafe Au Go Go",-1,"Verve / Forecast FTS 3000","US","" 152,"Blues Project","Live at Town Hall",-1,"Verve / Forecast FTS 3025","US","" 153,"Blues Project","Projections",86,"Verve / Forecast 827918 1","D","REO" 154,"Blues Project","Reunion in Central Park",87,"MCA 25984","CA","REO" 155,"Bluesbusters","This Time",87,"Landslide LD 1014","US","co" 156,"Bowie David","The Man Who Sold The World",0,"Mercury 6338041","","counterfeit ""Dress Cover""" 157,"Bown Andy","Gone to My Head",72,"Mercury SRM 1 625","US","foc" 158,"Box Tops","Dimensions",-1,"Bell 6032","US","co" 159,"Bread","Lost With Your Love",77,"Elektra 7E 1094","","butterfly, co, foc" 160,"Brewer and Shipley","Down in L. A.",-1,"A&M 4154","US","WLP, psf" 161,"Brewer and Shipley","Weeds",69,"Kama Sutra KSBS 2016","US","foc, promo, psf" 162,"Brewer and Shipley","Tarkio",70,"Kama Sutra KSBS 2024","US","foc" 163,"Brewer and Shipley","Shake off the Demon",71,"Kama Sutra KSBS 2039","US","foc, co" 164,"Brewer and Shipley","Rural Space",72,"Kama Sutra KSBS 2058","US","promo, foc, co" 165,"Brewer and Shipley","Welcome to the Riddle Bridge",75,"Capitol 11402","US","ps" 166,"Brigman George & Split","I Can Hear The Ants Dancin'",0,"OR Records OR-004","US","RED, #63/225" 167,"Brinsley Schwarz","Nervous on the Road",72,"United Artists UAS 5647","US","co" 168,"Broken Glass","Same",76,"ECapitol ST 11510","US","ps" 169,"BROM","Same",86,"EBS-8600472","CH","" 170,"Bromberg David","My Own House",78,"Fantasy 9160 9572","CA","" 171,"Brown Bobby","The Enlightening Beam of Axomba",72,"Destiny DR 4002","US","ps" 172,"Brown Danny Joe","Danny Joe Brown and The DJB Ban",81,"Epic 85122","NL","ps" 173,"Brownsville Station","Same",70,"Warner WS 1888","US","WLP" 174,"Bruce Jack & Friends","I've Always Wanted to Do This",80,"Epic AL 36827","US","WLP, ps" 175,"Buchanan Roy","Same",72,"Polydor PD 5033","US","" 176,"Buchanan Roy","That's What I Am Here For",73,"Polydor PD 6020","US","" 177,"Buchanan Roy","Live Stock",75,"Polydor PD 6048","US","" 178,"Buchanan Roy","A Street Called Straight",76,"Atlantic SD 18170","US","" 179,"Buffalo Springfield","Same",73,"ATCO SD2 806","US","2LP, foc" 180,"Buggs","The Beetle Beat",64,"Coronet CX 212","US","mono" 181,"Bulbous Creation","You Won't Remember Dying",94,"Rockadelic Records RRLP 13.5","US","REO" 182,"Burdon Eric & The Animals","Love Is",-1,"Polydor 823 004 1 Y","D","REO, 2LP, foc" 183,"Burdon Eric & The Animals","The Twains Should Meet",-1,"MGM SE 4537","US","" 184,"Burning Rain","Ols And New",94,"Rockadelic Records RRLP 10.5","US","REC., ins, cv/grey" 185,"Burnt Suite","Same",0,"CSS-9","F","REO, #183/300" 186,"Butterfield Paul","Put It In Your Ear",75,"Bearsville BR 6960","US","ps" 187,"Butterfield Paul","North South",80,"Bearsville BRK 6995","US","psf" 188,"Butterfield Paul Blues Band","Live",70,"Exults 62001","D","2LP, foc" 189,"Butterfield's Paul Better Days","Same",90,"Sequel NEX LP 127","","REO, ps" 190,"Butterfield's Paul Better Days","It All Comes Back",90,"Sequel NEX LP 128","","REO, ps" 191,"Butts Band","Hear & Now",75,"ABC/Blue Thumb BTSD 6018","US","WLP, psf" 192,"Byrds","Ballad Of Easy Rider",-1,"Columbia CS 9942","US","360 degree" 193,"Byrds","Dr Byrds & Mr Hyde",-1,"Columbia CS 9755","US","360 degree" 194,"Byrds","Preflyte",0,"Together ST-T 1001","US","foc" 195,"Byrds","Live In Amsterdam",90,"Swingin' Pig TSP 046 3","LUX","3LPB cv/green" 196,"C.A. Quintet","Trip Thru Hell",96,"Sundazed LP 5037","US","2LP, foc" 197,"Cactus","Same",70,"ATCO SD 33 340","US","" 198,"Cactus","Restrictions",71,"ATCO SD 33 377","US","co" 199,"Cactus","One Way ... Or Another",71,"ATCO SD 33 356","US","foc" 200,"Cactus","Ot'n' Sweaty",72,"Atlantic 50013","D","foc" 201,"California Randy","Kapt. Kopter And The (Fabulous) T",72,"Epic EPC S 65381","US","" 202,"Calliope","Steamed'",-1,"Buddah BDS 5023","US","" 203,"Campbell Jimmy","Half Baked",0,"Vertigo VEL 1000","","co, foc, REO??" 204,"Canned Heat","Rollin' and Thumblin'",-1,"EMI America 1 S 038 82 698","EEC","" 205,"Canned Heat","Live",-1,"Masters MA 012185","NL","" 206,"Canned Heat","Same",0,"Springboard SPB 4026","","" 207,"Canned Heat","70 Concert Recorded Live In Europe",70,"BOO BGOLP 12","UK","foc, REO" 208,"Canned Heat","Historical Figures and Ancient Head",72,"United Artists UAS 5557","US","foc, poster" 209,"Canned Heat","Historical Figures and Ancient Head",72,"United Artists UAS 5557","US","foc, co" 210,"Canned Heat","Living the Blues",79,"EMI 128 15 7675 3","EEC","2LP, foc" 211,"Canned Heat","Hooker 'n' Heat",79,"EMI 128 15 7673 3","EEC","2LP" 212,"Canned Heat","The Canned Heat Cook Book",81,"Liberty LN 10106","US","REO" 213,"Canned Heat","Hooker 'n' Heat Live At The Fox The",81,"Rhino RNLP 801","US","" 214,"Canned Heat","Boogie With Canned Heat",86,"See For Miles SEE 62","","" 215,"Canned Heat","Boogie Assault 'Live In Australia'",87,"Bedrock BE2LP 5","UK","cv/blue" 216,"Canned Heat","Reheated",88,"SPV 08 8803","D","" 217,"Capaldi Jim","Electric Nights",79,"RSO 1 3050","US","co" 218,"Capaldi Jim","Some Come Running",88,"Island 209439","D","ps" 219,"Captain Beefheart","2 Originals Of Captain Beefheart",76,"Reprise K 84006","UK","2LP, foc, REO, ps, (The Spotlike Kid" 220,"Captain Beefheart & His Magic Band","Mirror Man",-1,"Buddah BDS 5077","US","co" 221,"Captain Beefheart & His Magic Band","Trout Mask Replica",69,"Straight STS 1053 - Reprise 2MS 2","US","2LP, foc, Straight cover, Reprise PI" 222,"Captain Beefheart & His Magic Band","Clear Spot",72,"Reprise REP 54 007","D","REO" 223,"Captain Beefheart & The Magic Band","Safe As Milk",-1,"Buddah BPS 5001","","ps" 224,"Captain Beefheart & The Magic Band","Bluejeans & Moonbeans",74,"Mercury SRM 1-1018","US","WLP" 225,"Captain Beefheart & The Magic Band","Unconditionally Guaranteed",74,"Mercury SRM 1 709","US","co" 226,"Captain Beefheart & The Magic Band","Ice Cream for Crow",82,"Virgin V2237","UK","ps" 227,"Captain Beefheart & The Magic Band","Light Reflected of The Oceans Of",82,"Virgin VS 534-12","UK","Maxi 45rpm" 228,"Captain Beyond","Same",72,"Capricorn CP 0105","US","3D cover" 229,"Captain Beyond","Sufficiently Breathless",73,"Capricorn CP 0115","US","foc" 230,"Captain Beyond","Dawn Explosion",77,"Warner BS 3047","US","" 231,"Cashman, Pistilli, West","Bound to Meet",-1,"ABC ABCS 629","US","co" 232,"Cat Mother","Last Chance Dance",73,"Polydor PD 5042","US","psf, foc" 233,"Catfish Hodge","Bout with the Blues",80,"Adelphi AD 4126","CA","" 234,"Chambers Brothers","Greatest Hits",-1,"Vault SLP 135/2","US","2LP, foc, WLP" 235,"Chambers Brothers","The Time Has Come",-1,"Columbia CS 9522","US","360 degree" 236,"Chambers Brothers","Unbonded",73,"AVCO AV 11013-598","US","" 237,"Chambers Brothers","Live in Concert on Mars",77,"Chelsea CHL 548","UK","" 238,"Charley D. and Milo","Same",0,"Epic BN 26533","US","co, ins" 239,"Cheap Trick","Trick Or Treat",-1,"Impossible Recordworks IMP 1-01","","bootleg" 240,"Cheap Trick","California Man",-1,"ACR 16","","2LP, bootleg" 241,"Chesterfield Kings","Kingsized Rock'n Roll",0,"Matrix Nummer 7814 A1B","NL","bootleg" 242,"Chesterfield Kings","Don't Open Til Doomsday",87,"Mirror MIRROR 12","US","co" 243,"Chicken Shack","Imagination Lady",71,"Decca 6.21570","D","" 244,"Chicken Shack","Unlucky Boy",73,"Deram SML 1100","UK","" 245,"Chicken Shack","O.K. Ken?",83,"Impact IMLP 4.001130 J","D","REO" 246,"Chicken Shack","100 Ton Chicken",83,"Impact IMLP 4.00125 J","D","REO" 247,"Chicken Shack","Accept Chicken Shack",83,"Impact IMLP 4.00134 J","D","REO" 248,"Chicken Shack Stan Webb's","39 Bars",86,"Bellaphon 25507005","D","" 249,"Chilliwack","Lights From The Valley",78,"Mushroom MRS 5011","US","co" 250,"Chuck Berry","The London Chuck Berry Sessions",72,"Chess CH 60020","US","foc, co, ps" 251,"Circuit Rider","Same",71,"CR 666","US","boot REO" 252,"Clapton Eric","Backtrackin'",84,"Starblend ERIC1","UK","2LP, foc" 253,"Clark Hutchinson","Blues",0,"Little Wing of Refugees LW 2042","D","REO (1968), foc, ps" 254,"Clark Hutchinson","Retribution",70,"Nova 6.22548","D","RI" 255,"Clark Hutchinson","A=MH2",70,"Nova 6.22426 AJ","D","RI" 256,"Clarke Stanley","If This Bass Could Only Talk",88,"Portrait PRT 460883 1","NL","" 257,"Climax Blues Band","FM/Live",73,"Sire SAS 2 7411","","2LP, foc" 258,"Climax Blues Band","Stamp Album",75,"Sire SASD 7507","US","foc, co" 259,"Climax Blues Band","Couldn't Get lt Right",87,"C5 508","UK","REO" 260,"Climax Blues Band","A Lot Of Bottle",90,"C5 548","UK","REO" 261,"Climax Blues Band","Plays On",90,"C5 556","UK","REO" 262,"Climax Chicago","Rich Man",90,"C5553","UK","REO" 263,"Climax Chicago","Tightly Knit",90,"C5 557","UK","REO" 264,"Climax Chicago Blues Band","Same",90,"C5 555","UK","REO" 265,"Cold Cuts","Meat",82,"Black Top BT 1021","US","" 266,"Colosseum","Valentyne Suite",-1,"Bronze 212052","D","RE" 267,"Colosseum","Daughter Of Time",-1,"Bronze 25858 ET","D","RE" 268,"Colosseum","The Grass Is Greener",69,"Dunhill DS 50079"," US","foc, USA Only" 269,"Colosseum","Epitaph",86,"Raw Power RAWLP 014"," F","REO" 270,"Colosseum","Live",87,"Castle CLALP 122","UK","2LP" 271,"Commander Cody","Lets Rock!",86,"Line LILP 4.00277 J","D","" 272,"Commander Cody & His Lost Airmen","Lost in The Ozone",71,"Paramount PAS 6617","US","" 273,"Commander Cody Band","Lose It Tonight",80,"Line LLP 5074","D","" 274,"Companion","On The Line",77,"Sleepy Eye COMP 1001","US","" 275,"Companion","Same",80,"Akashic A.K.A. 10-2-49-80-1","US","" 276,"Condition Green","Live",83,"Disque Jean-Jean JJ 1013CG"," J","ins" 277,"Country Joe & The Fish","The Life and Time of County Joe &",-1,"Vanguard VSD 27/28","US","2LP, foc" 278,"Country Joe & The Fish","I-Feel-Like-I'm-Fixin'-To-Die",0,"Vanguard VSD 79266","US","ins, game feNt" 279,"Country Joe & The Fish","Here We Are Again",0,"Vanguard VSD 79299","US","ins" 280,"Country Joe & The Fish","Electric Music For The Mind And Th",67,"Vanguard VSD 79244","US","" 281,"Country Joe & The Fish","Together",68,"Vanguard VSD 79277","US","foc" 282,"Country Joe & The Fish","C.J. Fish",70,"Vanguard VSD 6555","US","co" 283,"Country Joe & The Fish","Reunion",77,"Fantasy F 9530","US","ps, psb" 284,"Country Joe McDonald","Tonight I'm Singing For You",70,"Vanguard VSD 6547","US","" 285,"Country Joe McDonald","War-War-War",71,"Vanguard VSD 79315","US","ps" 286,"Country Joe McDonald","Hold On Its Coming",71,"Vanguard VSD 79314","US","foc" 287,"Country Joe McDonald","Incredible! Live!",72,"Vanguard VSD 79316","US","" 288,"Country Joe McDonald","Thinking Of Woody Guthry",75,"Vanguard VSD 6546","UK","co" 289,"Country Joe McDonald","Paradise With An Ocean View",75,"Fantasy F 9495","","foc, poster fehlt" 290,"Country Lane","Substratum",73,"Splendid","F","RED, #200/300" 291,"Country Joe McDonald","Into the Fray",81,"Rag Baby RAG 2001","US","2LP, foc" 292,"Cowboy","Reach For The Sky",70,"Capricorn 33 351","US","WLP, foc" 293,"Cowboy","Same",77,"Capricorn CPN 0194","US","" 294,"Cream","Wheels of Fire",-1,"RSO RS-2-3802","US","2LP, foc" 295,"Cream","Disraeli Gears",67,"ATCO SD 33 232","US","ins, pink/beige label" 296,"Creedence Clearwater Revival","Cosmos Factory",-1,"Fantasy FACE 505","D","REO" 297,"Creedence Clearwater Revival","Green River",-1,"Fantasy FACE 503","D","REO" 298,"Creedence Clearwater Revival","Same",-1,"Fantasy FACE 501","D","REO" 299,"Creedence Clearwater Revival","The Concert",-1,"Fantasy FACE 511","D","REO" 300,"Creedence Clearwater Revival","Willy and the Poor Boys",-1,"Fantasy FANT 8397","US","" 301,"Creedence Clearwater Revival","Bayou Country",-1,"Fantasy 8387","","ps" 302,"Creedence Clearwater Revival","Live in Europe",71,"Fantasy 68 510","F","2LP, foc" 303,"Creedence Clearwater Revival","Traveling Band",88,"Melodija C60 27093 009"," USSR","" 304,"Crosby, Stills & Nash","Same",69,"Atlantis SD 19117","US","foc, ps, ins" 305,"Crosby, Stills, Nash & Young","Long Time Gone",89,"Swingin' Pig TSP 032 2","LUX","2LP, foc, cv/cgreen" 306,"Cross Country","Same",73,"ATCO SD 7024","US","foc, co" 307,"Crow","Mosaic by Crow",-1,"Amaret ST 5009","US","" 308,"Crow","Crow Music",0,"Amaret ST 5002","US","" 309,"Cry of Love","Brother",93,"Columbia COL 473767 1","NL","ps" 310,"Curved Air","Phantasmagoria",72,"Warner WB 46158","D","lyrics sheet" 311,"Curved Air","Lovechild",90,"Essential ESSLP 024","UK","REO" 312,"cwt","The Hundredweight",0,"Kuckuck 2375022","","#480/750" 313,"Daltrey Roger","Parting Should Be Painless",84,"WEA 2502981","D","ps" 314,"Daltrey Roger","Under A Raging Moon",85,"Atlantic 7812691","CA","ss" 315,"Daltrey Roger","Can't Wait To See The Movie",87,"Atlantic 7817591","CA","ss" 316,"Danko Rick","Same",77,"Arista AB 4141","US","ps, co" 317,"Davis Spencer and Jameson Peter","Its Been so Long",0,"United Artists UAS 29177","D","gimmick cover" 318,"Davis Spencer Group","Autumn '68",-1,"Island ORL 8571","IT","RE" 319,"Deep Purple","In The Absence Of Pink, Knebworth",0,"Connoisseur Collection DP VSOP L","UK","2LP, foc" 320,"Deep Purple","The Book of Taliesyn",69,"EMI 138 1 57725 1","D","Re, foc" 321,"Deep Purple","Made in Japan",72,"EMI 164 7 94183 1","EEC","2LP, foc" 322,"Deep Purple","Made in Europe",76,"EMI 038-79 37961 ","EEC","foc" 323,"Deep Purple","Same",76,"EMI 038-1 577291","EEC","" 324,"Deep Purple","Smoke on the Water",87,"Melodija C60 26033 007","USSR","" 325,"Deep Purple","Smoke on the Water",88,"Melodija C60 26033 007","USSR","different cover" 326,"Deep Purple","Nobody's Perfect",88,"Polydor 835 8971","CA","2LP, foc, ps" 327,"Deep Purple","Scandinavian Nights",88,"Connoisseur Coll. DP VSOP LP 125","UK","2LP, foc, booklet" 328,"Deep Purple","In Rock",95,"EMI 8 3401818","UK","2LP, foc, cv/purple, ps" 329,"Deep Purple","Fireball",96,"EMI 8 53711 1","UK","Anniversary Edition, 2LP, foc, ins, #" 330,"Deodato","Prelude",72,"CTI 6021","D","foc" 331,"Deodato","First Cuckoo",75,"MCA MLA 491","US","" 332,"Deodato","Love Island",78,"Warner BSK 3132","US","foc" 333,"Derek & The Dominoes","Layla",70,"Polydor 2625005","D","2LP, foc" 334,"Dewey Terry","Chief",72,"Thumbleweed TWS 104","US","gimmick cover" 335,"Dharma Bums","Insane",90,"ATS LP213/0790","A","foc" 336,"Diga Rhythm Band","Diga",76,"Round RX-LA800G/RX-110","US","co, info leaflet" 337,"Dire Straits","American Tour 1985",-1,"Swingin' Pig TSP 088 2","LUX","2LP, foc, cv/clear" 338,"Distelmann Stefan","Folk Blues Band",0,"Amiga 8 55 633","DDR","" 339,"Doc Powell","The Doctor",92,"Vital Sound VTL 006","US","2LP, foc" 340,"Dollar Johnny","My Soul Is Blue",-1,"Isabel 900509","F","" 341,"Doors","Absolutely Live",-1,"Elektra P 6349 50E","J","2LP, lyrics sheet (E/J)" 342,"Doors","Down The Lights",-1,"TAKRL 2401","","2LP, bootleg" 343,"Doors","Moonlight Drive",-1,"TAKRL 1954","","bootleg" 344,"Doors","Resurrection",-1,"Paris","","2LP, bootleg" 345,"Doors","Waiting For The Sun",68,"Elektra EKS 74024","US","foc" 346,"Doors","",70,"Elektra EKS 74079","US","" 347,"Doors","Morrison Hotel",70,"Elektra 75007","US","foc" 348,"Doors","Full Circle",72,"Elektra EKS 75038","US","foc, butterfly, gimmick" 349,"Doors","The Matrix Tapes",90,"Swingin' Pig TSP 047 3","LUX","3LPB cv/different" 350,"Double Naught Spys","Goin' Nowhere With ...",92,"Rockadelic Records RRLP 6.5","US","REO, ins, #1811500" 351,"Dr. Feelgood","Let It Roll",79,"United Artists UA G 30269","UK","" 352,"Dr. John","The Night Tripper, The Sun, Moon A",71,"ATCO SD 33 362","US","foc, insert" 353,"Dr. John","In The Right Place",73,"ATCO SD 7018","US","foc, co" 354,"Dr. Ross","One Man Band",81,"Sonet SNTF 882","","" 355,"Drovers","Beyond The Blue",89,"Donkey Soul Music DSM 102","US","" 356,"Drovers","Tightrope Town",92,"Donkey Soul Music DSM 103","US","lyrics sheet" 357,"Ducks Deluxe","Last Performance - 100 Club",79,"Dynamite Take Dyr 3303","NL","2LP" 358,"Dylan Bob","Royal Albert Hall",-1,"TMOQ 71017","","bootleg, ss" 359,"Dylan Bob","While The Establishment Burns",-1,"TMOQ 73005","","bootleg, ss" 360,"Dylan Bob","V. D. Waltz (GWW III)",-1,"BD 508 (TMOQ)","","bootleg, cv/cyellow" 361,"Dylan Bob","Talking Bear Mountain Massacre Pi",-1,"TMOQ 71009","","bootleg" 362,"Dylan Bob","Talking Bear Mountain Massacre Pi",-1,"BD 502 (TMOQ)","","bootleg, cv/cblue" 363,"Dylan Bob","Seems Like A Freeze Out (GWW V",-1,"BD 501 (TMOQ)","","bootleg, cv/cyellow" 364,"Dylan Bob","GWW, A Thousand Miles Behind",-1,"Matrix# 111","","bootleg" 365,"Dylan Bob","Ceremonies Of The Horseman",-1,"Highway High Fi 107","","bootleg" 366,"Dylan Bob","Bridgetts Album",-1,"TMOQ 73034","","bootleg, smoking pig label" 367,"Dylan Bob","Bob Dylan, Vol. 3",-1,"Buhay 8003","IT.","bootleg, ss" 368,"Dylan Bob","Bob Dylan, Vol. 2",-1,"Buhay 8002","IT","bootleg" 369,"Dylan Bob","Bob Dylan, Vol. 1",-1,"Buhay 8001","IT","bootleg" 370,"Dylan Bob","Blond On Blond",-1,"Columbia C2S 841","US","2LP, foc, 360 degree" 371,"Dylan Bob","Live at Toad's",-1,"Ebb BDT 01","US","4LPB, bootleg" 372,"Dylan Bob","Zimmermann ""Looking Back""",0,"Zerocks","US","2LP, bootleg" 373,"Dylan Bob","Serf Portrait",0,"Columbia C2X 30050","US","2LP, foc" 374,"Dylan Bob","Bringing It All Back Home",65,"CBS 32344","UK","" 375,"Dylan Bob","Same",67,"CBS 32001.","NL","" 376,"Dylan Bob","John Wesley Harding",68,"Columbia JC 9604","US","" 377,"Dylan Bob","Nashville Skyline",69,"Columbia KCS 9825","US","360 degree" 378,"Dylan Bob","New Morning",70,"Columbia KC 30290","US","" 379,"Dylan Bob","Blood on the Tracks",74,"Columbia PC 33235","US","ps" 380,"Dylan Bob","Desire",75,"Columbia PC 33893","US","WLP, TOC, ps" 381,"Dylan Bob","Hard Rain",76,"Columbia PC 34349","US","ps" 382,"Dylan Bob","Street Legal",78,"Columbia JC 35453","US","ps" 383,"Dylan Bob","Slow Train Coming",79,"Columbia FC 38120","US","ps" 384,"Dylan Bob","Infidels",83,"Columbia QC 38819","US","ps" 385,"Dylan Bob","Real Live",84,"Columbia FC 39944","US","ps" 386,"Dylan Bob","Biograph",85,"Columbia C5X 38830","US","5LPB, ps, booklet" 387,"Dylan Bob","In Search Of Relief",88,"Instant Analysis BBR 017","","bootleg" 388,"Dylan Bob","Now Ain't Time For Your Tears",90,"Swingin' Pig TSP 057 2","LUX","2LP, cv/orange, green" 389,"Dylan Bob","Love Songs For America",90,"Swingin' Pig TSP 055 2","LUX","2LP, cv/grey" 390,"Dylan Bob","The 30th Anniversary Concert",93,"Columbia COL 474000 1","US","3LP, ps" 391,"Dylan Bob and the Band","The Basement Tapes",75,"Columbia C2 33682","US","2LP, foc" 392,"Dynatones","Curtain Call",82,"War 'Bride RL 0044","UK","" 393,"Eagles","Hotel California",76,"Asylum 6E 103","US","foc, ps" 394,"Eaton Sally","Farewell American Tour",69,"Paramount PAS 5021","US","ins" 395,"Eicher Stephan .","Louanges",99,"Virgin 7243 8476471 5","","2LP, ps, 3 sides only" 396,"Electric Blues Duo","Make Mine a Double",91,"Aris 831742","D","" 397,"Electric Flag","Same",-1,"Columbia CS 9714","US","" 398,"Emerson, Lake & Palmer","Brain Salad Surgery",73,"Manticore MC 66669","US","gimmick cover" 399,"Emerson, Lake & Palmer","Tarkus",94,"MFSL 1-203","US","#2329" 400,"Entwistle John","Too Late the Hero",81,"WEA K 99179","D","ps" 401,"Eric Clapton","Unplugged",92,"Reprise 9362-45024-1","D","foc, ps" 402,"Essex David","Gold & Ivory",77,"CBS 86038","UK","" 403,"Euphonious Wail","Same",73,"Kapp KS 3668","US","co" 404,"Fabulous Thunderbirds","Same",79,"Chrysalis PV 41250","US","" 405,"Fabulous Thunderbirds","What's The Word",80,"Chrysalis CHR 1287","US","" 406,"Fabulous Thunderbirds","Butt Rockin'",81,"Chrysalis CHR 1319","US","" 407,"Fabulous Thunderbirds","T-Bird Rhythm",82,"Chrysalis CHR 1395","UK","" 408,"Fabulous Thunderbirds","Tuff Enuff",86,"CBS FZ 40304","US","ps" 409,"Fabulous Thunderbirds","Hot Number",87,"CBS FZ 40818","US","ps, psb" 410,"Faces","A Nod's As Good As A Wink ... To",72,"Warner K 56006","D","RE" 411,"Fahey John","Volume 1 Blind Joe Death",0,"Takoma 7002","","REO" 412,"Fahey John","My Yellow Princess",68,"Vanguard VSD 79293","US","" 413,"Fahey, Lang, Kottke","Same",74,"Takoma C 1040","US","" 414,"Family","A Song For Me",-1,"Reprise RS 6384","US","WLP, foc, ps" 415,"Family","Fearless",71,"United Artists UAS 5562","US","foc, promo, ps" 416,"Family","Bandstand",72,"Reprise K54006","D","gimmick cover, ins" 417,"Fanny","Charity Ball",71,"Reprise RS 6456","US","" 418,"Fantasy Factory","Ode to Life",96,"ACME AC 8019 LP","UK","foc, ins" 419,"Far Out","Same",0,"Satori SAT 1004","J","REO" 420,"Fat Matress","Same",69,"ATCO SD 33 309","US","ins, foc" 421,"Federlosband","Federlos",88,"Stechapfel/Federlos 001","CH","bio insert" 422,"Firm","Mean Business",86,"Atlantic 7816281","CA","" 423,"Fitzgerald Ella and Basie Count","On the Sunny Side of the Street",0,"Verve MG-VS 4061","","RE, Limited" 424,"Fitzgerald Ella and Pass Joe","Fitzgerald and Pass ... Again",0,"Analogue Productions Revival Serie","","" 425,"Five Man Electrical Band","Same",-1,"Capitol ST 165","CA","" 426,"Fleetwood Mac","Black Magic Woman",-1,"Platinum 9043/3","D","3LPB" 427,"Fleetwood Mac","English Rose",69,"Epic BN 26466","US","US only" 428,"Fleetwood Mac","Peter Green's Fleetwood Mac",98,"Columbia 63200","UK","ins, Ltd Edition" 429,"Flint","Same",78,"CBS JC 35574","","" 430,"Floating Bridge","Same",69,"Vault Stereo 124","US","ss" 431,"Flood","No Time To Loose",0,"RoRec Records BLRR 010100","CH","" 432,"Flood","No Time To loose",0,"RoRec Records BLRR 010100","CH","ins" 433,"Flow","Same",92,"","","reo" 434,"Flying Pickets","Lost Boys",-1,"Moving Target MT 021","","" 435,"Focus","",-1,"Sire SAS 3901","US","" 436,"Focus","In And Out Of Focus",73,"Sire SAS 7404","","co, REO" 437,"Focus","Mother Focus",75,"Polydor 2310 408","D","" 438,"Fogelberg Dan","Souvenirs",74,"Epic KE 33137","US","foc" 439,"Fogelberg Dan","Phoenix",79,"Fullmoon / Epic FE 35634","","foc, co" 440,"Fogelberg Dan and Weisberg Tim","Twin Sons Of Different Mothers",75,"Fullmoon 1 Epic JE, 35339","","co, foc" 441,"Fogerty John","Same",75,"Asylum 7E1046","US","co" 442,"Fogerty John","The Old Man Down The Road",84,"Warner PRO A 2234","US","maxi, promo" 443,"Fogerty John","Centerfield",85,"Warner 252031","US","ps" 444,"Fogerty John","Eye of the Zombie",86,"Warner 925 4491","D","co, ps" 445,"Fogerty John","Change In The Weather",86,"Warner PRO A 2595","US","promo" 446,"Fogerty Torn","Myopia",74,"Fantasy F 9469","US","" 447,"Fogerty Tom","Zephyr National",74,"Fantasy F 9448","US","co" 448,"Fogerty Torn","Deal It Out",81,"Fantasy F 9611","US","" 449,"Foghat","Same",72,"Bearsville BR 2077","US","" 450,"Foghat","Stone Blue",78,"Bearsville BRK 6977","US","cv/cblue" 451,"Foghat","Tight Shoes",80,"Bearsville XBHS 6999","CA","" 452,"Foghat","Girls To Chat & Boys To Bounce",81,"Bearsville BRK 3578","US","psf" 453,"Frantic","Same",70,"Lizarc/Ampex A 20103","US","foc, ss" 454,"Free","Fire And Water",70,"Island 88019","D","RE" 455,"Free","Free Live !",71,"Island ILPS 9160","D","RE" 456,"Free","Heartbreaker",73,"Island ILPS 9217","US","" 457,"Freedom","Through The Years",71,"Cotillon SD 9048","US","foc, co" 458,"Freis Henry & The Cityleaders","Downtown-Cocktail",82,"Bellaphon 26040004","CH","" 459,"Frijid Pink","Same",-1,"Parrot PAS 71033","US","" 460,"Frijid Pink","Defrosted",0,"Parrot PAS 71041","US","ps" 461,"Frog M.","Labat",73,"Bearsville BR2140","US","foc" 462,"Fuzzhead","Isd",91,"Twisted Village TW 1021","US","" 463,"Gallagher Rory","Pop History Vol 30",0,"Polydor 2679 006","D","2LP, foc" 464,"Gallagher Rory","Tattoo",73,"Polydor PD 5539","US","co, psf" 465,"Gallagher Rory","Against The Grain",75,"Chrysalis CHR 1098","US","co" 466,"Gallagher Rory","Live in Europe /Stage Struck",80,"Intercord INT 155.066","D","2LP, ps, lyrics sheet" 467,"Gallagher Rory","The Bullfrog Interlude",90,"Flashback L.P. 07.90.0122-33","LUX","" 468,"Garcia Jerry","Garcia",72,"Warner BS 2582","US","" 469,"Geils J. Band","The Morning After",71,"Atlantic SD 8297","US","" 470,"Geils J. Band","Full House",72,"Atlantic SD 0698","US","" 471,"Geils J. Band","Ladies Invited",73,"Atlantic ATL 40536","D","WLP, ps" 472,"Geils J. Band","Blow Your Face Out",76,"Atlantic ATL 60115","D","2LP, foc" 473,"Genesis","Selling England By The Pound",73,"Famous Charisma CAS 1074","UK","" 474,"Genesis","Three Sides Live",82,"Atlantic SD 2 2000","US","2LP, foc '" 475,"Gentle Giant","Interview",76,"Capitol ST 11532","US","" 476,"Gentle Giant","Giant For A Day",78,"Capitol SW 11813","US","co, ps" 477,"Geordie","Hope You Like It",73,"EMI EMC 3001","UK","" 478,"Gilmor David","Same",78,"Columbia JC 35388","US","foc" 479,"Gilmour David","About Face",84,"Columbia FC 39296","U$","ps" 480,"Gold","Same",0,"Rockadelic Records RRLP20","US","REO, ins" 481,"Golden Earring","Live",77,"MCA MCA2 8009","US","foc" 482,"Goliath","Same",69,"ABC ABCS 702","US","foc" 483,"Golliwogs","Pre-Creedence",75,"Fantasy F 9474","US","" 484,"Gordon Jim","Welcome To The Canteen",-1,"United Artists UAS 5550","US","psf" 485,"Granmax","A Ninth Alive",0,"Pacific PRS 1001","","co" 486,"Granmax","Kiss Heaven Goodbye",78,"Panama PRS 1023","US","" 487,"Grass Roots","Leaving All Behind",-1,"ABC / Dunhill DS 50067","US","foc" 488,"Grass Roots","Move Along",72,"ABC / Dunhill DSX 50112","US","" 489,"Grassroots","Golden Grass",-1,"ABC / Dunhill DS 50047","US","" 490,"Grassroots","Feelings",-1,"ABC / Dunhill DS 50027","US","co, ins" 491,"Grateful Dead","Silent Dead",-1,"Double Dead Records DDR 107","","bootleg" 492,"Grateful Dead","Make Believe Ballroom",-1,"TAKRL 2979","","2LP, bootleg" 493,"Grateful Dead","Uncle John's Band, Palais de Seine",-1,"Skating Records N-67 (L30789)","US","2LP, bootleg" 494,"Grateful Dead","Uncle John's Band, Palais de Seine",-1,"Skating Records M-66 (L30788)","US","2LP, bootleg" 495,"Grateful Dead","25 Years on the Road",-1,"G 9091","","2LP, bootleg" 496,"Grateful Dead","Dead .A Head",-1,"ATT GD 120680","","2LP, bootleg" 497,"Grateful Dead","Uncle John's Band (Orpheum Theat",-1,"Alpine M-64","","" 498,"Grateful Dead","Dark Star",0,"Discurios DIS 311 LP","EEC","3LP" 499,"Grateful Dead","Workingman's Dead",70,"Warner WB 1869","US","ins" 500,"Grateful Dead","American Beauty",70,"Warner WS 1893","US","" 501,"Grateful Dead","""untiteled""",71,"Warner 2WS 1935","US","2LP, co, foc" 502,"Grateful Dead","Europe '72",72,"Warner WB 66019","D","3LP, foc" 503,"Grateful Dead","Live Dead",73,"Warner WB 66002","D","2LP, foc" 504,"Grateful Dead","The History Of The Grateful Dead, V",73,"Warner BS 2721","US","WLP, psf, ins" 505,"Grateful Dead","Reckoning",81,"Arista 301621","D","2LP" 506,"Grateful Dead","Dead Set",81,"Arista AL9 8112","US","2LP, foc" 507,"Grateful Dead","Terrapin Station",86,"Arista 301190","D","" 508,"Grateful Dead","Same",87,"Edsel ED 221","UK","" 509,"Grateful Dead","Wake Of The Flood",89,"Grateful Dead G2LP 4.00643 J","D","cv/white" 510,"Grateful Dead","Blues For Allah",89,"Grateful Dead G2LP 4.00650 J","D","cv/white, ps" 511,"Grateful Dead","Steal Your Face",89,"Grateful Dead GD2LP 5.00032 M","D","2LP, cv/white, foc" 512,"Grateful Dead","Without A Net",90,"Arista AL3 8634","US","3LP, foc, psb" 513,"Grateful Dead","One From The Vault",91,"Grateful Dead GDV3 4015","D","3LP, foc" 514,"Gravenites Nick","My Labors",0,"Columbia CS 9899","US","pst, rscl, 360 degree" 515,"Great Society","Live At The Matrix",89,"Edsel DED 280","UK","2LP, foc" 516,"Green Bullfrog","Same",80,"Ecy Street ECY 16","US","REO" 517,"Gregory Billy","Ifs A Bluesy Day",80,"Appaloosa AP 008","IT","info sheet" 518,"Grootna","Same",-1,"Columbia C 31033","US","co" 519,"Groundhogs","Groundhogs Best 1969-72",-1,"BOO 2LP1","UK","2LP, foc" 520,"Groundhogs","Split",0,"United Artists LBR 1017","UK","RE" 521,"Groundhogs","Thank Christ For The Bomb",70,"Liberty LBS 83295","UK","foc" 522,"Groundhogs","Who Will Save the World?",72,"United Artists UAS 5570","US","ps, foc, gimmick cover" 523,"Growl","Same",74,"Diskreet DS 2209","US","psf" 524,"Gypsy","Antithesis",72,"RCA Victor LSP 4775","US","ss, co" 525,"Gypsy","James Walsh Gypsy Band",78,"RCA AFL1 2914","US","ps" 526,"H.P. Lovecraft","Live - May 11, 1968",91,"Sundazed LP 5004","US","" 527,"Hamilton, Frank Joe & Reynolds","Same",70,"ABC/Dunhill DS 50103","US","WLP, foc, psf" 528,"Hammer","Same",70,"San Francisco SD' 03","US","co" 529,"Hammond John","Mileage",80,"Rounder 3042","US","" 530,"Hammond John","Frogs For Snakes",81,"Rounder 3060","US","" 531,"Hammond John","Live",83,"Rounder 3074","US","" 532,"Harpers Bizarre","Feelin' Groovy",-1,"Warner WB 1693","US","mono, co" 533,"Harris Richard","A Tramp Shining",-1,"ABC / Dunhill DS 50032","US","foc" 534,"Harrison George","All Things Must Pass",-1,"Apple STCH 639","US","3LPB, ps" 535,"Harrison George","US Tour 1974",0,"","","bootleg" 536,"Harrison George","Dark Horse",74,"EMI SMAS 3418","US","ps" 537,"Hart Mickey","Rolling Thunder",89,"Grateful Dead G2LP 4.00647 J","D","REO, cv/white, ps" 538,"Hawkins Screamin' Jay","Screamin' The Blues",79,"Red Lightnin RL 0025","UK","" 539,"Hawkins Screamin' Jay","Frenzy",82,"Edsel ED 104","UK","" 540,"Haycock's Pete Climax","The Soft Spot",86,"Bellaphon 26007092","D","" 541,"Healy Jeff Band","Hell To Pay",90,"Arista AL 8832","US","" 542,"Heart","Greatest Hits / Live",80,"Epic EG 63888","US","2LP" 543,"Heart of Gold Band","Same",86,"Relix RRLP 2020","US","" 544,"Help Yourself","Beware the Shadow",72,"United Artists UA LA079-F","US","" 545,"Help Yourself","Strange Affair",72,"United Artists UAS 5591","US","ins, co" 546,"Henderson Bugs Group","At Last",78,"Armadillo ARLP 78-1","US","ss" 547,"Henderson Bugs Group","Still Flyin'",81,"Flying High FH 6505","US","" 548,"Hendrix Jimi","Various Life Cuts",-1,"LE-1/2-HH","","bootleg" 549,"Hendrix Jimi","The Essential Jimi Hendrix Volume",79,"Reprise HS 2293","US","+7""EP EP2293, ps" 550,"Hendrix Jimi","All Along The Watchtower/Foxy Lad",82,"Polydor POSPX.401","UK","EP" 551,"Hendrix Jimi","Same",89,"Wifon Stereo LP 160","PO","" 552,"Hendrix Jimi","Band of Gypsys",97,"MCA MCA-11607","US","foc" 553,"Hendrix Jimi","First Rays of the New Rising Sun",97,"MCA MCA2-11599","US","2LP, foc, 'The Authorized Hendrix F" 554,"Hendrix Jimi","South Saturn Delta",97,"MCA MCA2-11664","US","2LP, foc, booklet, The Authorized" 555,"Jimi Hendrix Experience","Electric Ladyland",-1,"Reprise 8307","US","2LP, foc" 556,"Jimi Hendrix Experience","Axis Bold As Love",71,"Reprise RS 6281","US","foc, ps" 557,"Jimi Hendrix Experience","Live at Winterland",87,"Ryko Analogue RALP 0038-2","US","2LP, foc, cv/clear" 558,"Jimi Hendrix Experience","BBC Sessions",98,"MCA3-11742","US","3LP, foc, booklet" 559,"Hill Bill","Free Advice",83,"private press","US","ins" 560,"Hill Joel Scott; Barbata Johny; Ethridge","L. A. Getaway",71,"ATCO SD 33 357","US","-" 561,"Hillage Steve","Fish Rising",75,"Virgin VI 2031","US","" 562,"Hillage Steve","Open",79,"Virgin V2135","D","ins, die-cut cover" 563,"Hillage Steve","Live Herald",79,"Virgin VGD 3502","UK","2LP, foc" 564,"Hillage Steve","For To Next",83,"Virgin V2244","UK","soc ""FOR TO NEXT and 'and not fo" 565,"Hillage Steve","And Not Or",83,"Virgin OVED 8","UK","" 566,"Hollies","Moving Finger",-1,"Epic E 30255","US.","TOC" 567,"Hooker Earl","There's A Fungus Among Us",72,"Red Lightnin RL 009","UK","" 568,"Hooker John Leo","Get Back Home",-1,"Black And Blue 33553","F","RE" 569,"Hooker John Lee","Endless Boogie",-1,"ABC ADCD 720","US","2LP, foc, WLP" 570,"Hooker John Lee","Original Folk Blues",0,"United US 7746","US","" 571,"Hooker John Lee","Live Au Cafe Au-Go-Go",67,"BGO BGOLP 39","UK","REO" 572,"Hooker John Lee","Live At Sugarhill",68,"Ace CH 287","D","REO" 573,"Hopkins Nick, Cooder Ry, Jagger Nick,","Jamming With Edward",72,"Rolling Stones Records COC 39100","US","ins, co" 574,"Hopkins Sam Lightnin'","Live At The Bird Lounge",65,"Bulldog BDL 1010","UK","REO" 575,"Horslips","Live",-1,"Horslips MOD 10","UK","2LP, foc" 576,"Horslips","Happy To Meet ... Sorry To Part",72,"ATCO SD 7030","US","foc, ins, gimmick cover" 577,"Hot Soup","Openers",-1,"Rama Rama RR 78","US","foc, psf" 578,"Hot Tuna","Same",70,"RCA Victor LSP 4353","US","ps" 579,"Hot Tuna","Burgers",71,"Grunt FTR 1004","US","foc, ps" 580,"Hot Tuna","First Pull Up Then Pull Down",71,"RCA Victor CSP 4550","US","foc, ps" 581,"Hot Tuna","The Phosphorescent Rat",73,"Grunt BFL1 0348","US","foc, ins" 582,"Hot Tuna","Yellow Fever",75,"Grunt BXL1 1238","US","ps" 583,"Hot Tuna","America's Choice",75,"Grunt BFL1 0820","US","ps" 584,"Hot Tuna","Hoppkory",76,"Grunt BFL1 1920","US","ps, psb" 585,"Hot Tuna","Double Dose",78,"Grunt CYL2 2545","US","2LP, foc, ps" 586,"Hot Tuna","Splashdown",84,"Relix RRLP 2004","US","" 587,"Hot Tuna","Historic Hot Tuna",85,"Relix RRLP 2011","US","" 588,"Hot Tuna","Pair A Dice Found",90,"CBS 4673241","NL","ps" 589,"Hourglass","Same 1967-1969",73,"UA LA013-G2","US","2LP, foc" 590,"Howe Steve","Beginnings",75,"Atlantic SD 18154","US","foc" 591,"Howlin' Wolf","The Real Folk Blues",87,"Chess CH 9273","US","RE" 592,"Howlin' Wolf","The London Howlin' Wolf Sessions",87,"Amiga 856242","ODR","" 593,"Howlin' Wolf","Live In Cambridge, MA., 1966",91,"Fan Club FC 082","F","RE" 594,"Howlin' Wolf, Waters Muddy, Diddley","The Super Blues Band",84,"Chess CH 9169","US","RE" 595,"Human Instinct","Te Waiata Koru",0,"Little Wing of Refugees","D","3LPB, booklet, #129/500" 596,"Human Instinct","The Zodiac Years",94,"Little Wing of Refugees LW 4014/4","D","2LP, foc, ps, poster, booklet, RE of" 597,"Humble Pie","Rockin' The Fillmore",-1,"A&M SP 6008","US","2LP, foc" 598,"Hunters and Collectors","Ghost Nation",89,"White Label TVL 93314","AUS","ps" 599,"If","2",-1,"Capitol SW 676","US","" 600,"If","Same",70,"Island ILPS 9129","US","pink label" 601,"If","Waterfall",72,"Metromedia XMD 1057","US","foc" 602,"Illusion","Together (As A Way Of Live)""",69,"Steed ST 37005","US","" 603,"Incredible Bongo Band","Bongo Rock",96,"VIK VIK 4462","UK","reo" 604,"Iron Butterfly","In-A-Gadda-Da-Vida",68,"ATCO SD 33-250","US","ps" 605,"Iron Butterfly","Ball",69,"ATCO SD 33 280","US","foc" 606,"Iron Butterfly","Live",75,"Atlantic ATL 20093","D","" 607,"Its A Beautiful Day","Born Again",0,"Allied Production 364","US","bootleg" 608,"Its A Beautiful Day","Same",69,"CBS 63722","UK","foc" 609,"Its A Beautiful Day","Same",69,"Columbia CS 9766","US","foc, 360 deg" 610,"Its A Beautiful Day","Marrying Maiden",70,"Columbia CS 1058","US","" 611,"Its A Beautiful Day","Choice Quality Stuff",71,"CBS 83904","NL","lyrics sheet" 612,"Its A Beautiful Day","Its A Beautiful Day At Carnegy Hall",72,"CBS 83907","NL","foc, Not Licenced For Sale In The U" 613,"Its A Beautiful Day","Its a Beautiful Day ... Today ",73,"CBS 65483","NL","foc" 614,"Its A Beautiful Day","A Thousand And One Nights",80,"CBS 83906","NL","Not Licensed For Sale In The USA" 615,"James Gang","Live in Concert",71,"ABC ABCX 733","US","co" 616,"James Gang","Straight Shooter",72,"ABC ABCX 741","US","" 617,"James Gang","Thirds",72,"ABC ABCX 721","US","co" 618,"Jamul","Same",0,"Lizard/Ampex A 20101","US","" 619,"Jason & The Scorchers","Fervor",83,"EMI America SO 19008","US","psf" 620,"Jason & The Scorchers","Still Standing",86,"EMI America ST 17219","","co, psf" 621,"Jefferson Airplane","After Bathing At Baxter's",-1,"RCA Victor LSP 4545","US","foc, ps" 622,"Jefferson Airplane","Surrealistic Pillow",67,"RCA Victor LSP 3766","US","" 623,"Jefferson Airplane","The Worst Of Jefferson Airplane",70,"RCA Victor LSP 4459","US","foc, ins" 624,"Jefferson Airplane","Bark",71,"Grunt FTR 1001","US","lyrics flyer, bag" 625,"Jefferson Airplane","Long John Silver",72,"Grunt FTR 1007","US","Weed Box" 626,"Jefferson Airplane","Flight Log (1966-1976)",77,"Grunt CYL2 1255","US","2LP, foc, ps, book, co, gepraegtes c" 627,"Jefferson Airplane","Crown Of Creation",80,"RCA YL 13797","IT","REO (68)" 628,"Jefferson Airplane","The Collection",88,"Castle CCSLP 200","UK","2LP, foc" 629,"Jellybread","Same",97,"LIPHOOK 1","D","" 630,"Jericho Jones","Same",0,"","","REO" 631,"Jeronimo","Cosmic Blues",0,"Bellaphon 220.03.003","D","" 632,"Jeronimo","Time Ride",72,"Bacillus BAC 2010","D","foc" 633,"Jethro Tull","Flute Cake",-1,"TMOQ KW 215344","","booleg, cv/cblue" 634,"Jethro Tull","Hand in Glove",0,"TMOQ 72103","","2LP, bootleg" 635,"Jethro Tull","This Was",68,"Chrysalis 6339 002","D","foc" 636,"Jethro Tull","Thick As A Brick",72,"Reprise RS 2072","US","newspaper" 637,"Jethro Tull","Bursting Out",78,"Chrysalis CH2 1201","US","2LP, foc, co, ps" 638,"Jethro Tull","Nowhere Fast",85,"Tropo 319","","bootleg" 639,"Jethro Tull","Aqualung",96,"Chrysalis 7243 8 52213 1 6","UK","2LP, foc, ps, 25 anniversary special" 640,"Jethro Tull","Stand Up",97,"EMI 7243 8 55670 1 8","US","RED, EMI100 serie" 641,"Jimi Hendrix Experience","Starportrait Jimi Hendrix",0,"Polydor 2672 002","D","2LPB, booklet" 642,"Jimi Hendrix Experience","Electric Ladyland",97,"MCA MCA2-11600","US","2LP, foc, The Authorized Hendrix F" 643,"Jimi Hendrix Experience","Are You Experienced",97,"MCA MCA2-11608","US","2LP, foc" 644,"Jimi Hendrix Experience","axis: bold as love",97,"MCA MCA-11601","US","foc, The Authorized Hendrix Family" 645,"Jo Mama","J Is For Jump",71,"Atlantic SD 8288","US","" 646,"Johnny Rivers","Realization",0,"Imperial SIRL 932947","AUS","" 647,"Jones J. with Arnold Billy Boy","Same",79,"Sonet SNTF 821","UK","" 648,"Jones Rickie Lee","Same",79,"Warner BSK 3296","US","ps" 649,"Jones Rickie Lee","Pirates",80,"Warner BSK 3432","US","ps" 650,"Jones Rickie Lee","The Magazine",84,"Warner 925117","D","ps" 651,"Joplin Janis","Live in USA",-1,"Electrecord ELE 03900","RUM","" 652,"Joplin Janis","Pearl",-1,"Columbia KC 30322","US","" 653,"Joplin Janis","In Concert",72,"Columbia C2X 31160","US","2LP, foc" 654,"Josephus","Get off my Case",0,"Epilogue EPI 002","US","booklet" 655,"Jubal","Same",72,"Elektra EKS 75033","US","co, butterfly" 656,"Juke","Live At The Grand Cafe Au Casino",-1,"Wolfen LP 87149","CH","" 657,"July","Same",96,"Essex 1011 LP","UK","RED, mono, +45 rpm 10117" 658,"Jupp Mickey","Mickey Jupp's Legend",-1,"Stiff COU-B/GET 2","B","cv/cblue" 659,"Kahvas Jute","Wide Open",0,"Little Wings of Refugees LW4034","D","RE, Gimmick cover, ins, #792/1000" 660,"KAK","Same",0,"Epic XSB 138477","US","REO" 661,"Kaleidoscope","Same",-1,"Epic BN 26467","US","foc, co" 662,"Kaleidoscope","Side Trips",88,"Edsel ED 284","UK","REO" 663,"Kantner Paul Jefferson Starship","Blows Against The Empire",70,"RCA LSP 4448","US","foc, ps" 664,"Kantner Paul, Slick Grace","Sunfighter",71,"Grunt FTR 1002","US","foc, ps, book" 665,"Kantner Paul, Slick Grace, Freiberg Da","Baron von Tollbooth & The Chrome",73,"Grunt BFL 1-0148","US","ps" 666,"Kauffman David and Caboor Eric","Songs From Suicide Bridge",84,"Donkey Soul Music DSM 101","US","foc" 667,"Kaukonen Jorma","Jorma",79,"RCA AFL1 3446","US","" 668,"Kaukonen Jorma","Magic",85,"Relix Records RRLP 2007","US","" 669,"Kaukonen Jorma & Vital Parts","Barbeque King",80,"RCA AFL 3725","US","ps" 670,"Kaukonen Jorma, Hobson Tom","Quah",74,"Grunt BFL1 0209","US","psf, foc" 671,"Kaukonen Peter","Black Kangoroo",72,"Grunt 1006","US","co, foc, ins" 672,"Kay John & Steppenwolf","Wolftracks",83,"Allegiance AV 434","US","ins" 673,"Kelly Dave Band","Live",83,"Appaloosa AP 0033","IT","" 674,"Kennelmus","Beyond Folkstone Prism",95,"RD Records RD1","CH","RE, ins" 675,"Kevin Boritch","Angels Hand",80,"Mushroom L 37181","AUS","" 676,"Key Troyce, Malone J.J.","I've Gotta New Car",78,"Red Lightnin RL 0028","UK","" 677,"Key Troyce, Malone J.J.","Younger Than Yesterday",82,"Red Lightnin RL 0043","UK","" 678,"KGB","Same",76,"MCA 2166","US","co" 679,"King Bobby, Evans Terry","Live And Let Live!",88,"Marat CM 10","D","" 680,"Kingfish","Trident",78,"Jet 35479","US","psb , TOC" 681,"Kingfish","Alive in '85",85,"Relix RRLP 2016","US","" 682,"Kingfish","Same",89,"Grateful Dead G2LP 4.00645 J","D","REO, cv/white" 683,"Kinks","Something Else By The Kinks",-1,"Reprise RS 6279","US","" 684,"Kinks","Kink Kontroversy",-1,"Reprise 6197","US","mono, tricolor label" 685,"Kinks","Face to Face",0,"Reprise R 6228","US","mono, tricolor label" 686,"Kinks","Kinks-Size",0,"Reprise R6158","US","ins, tricolor label, mono" 687,"Kinks","Kinda Kinks",64,"Reprise R 6173","US","mono, tricolor label" 688,"Kinks","Arthur",65,"Reprise ST 93034","US","foc, bicolor label" 689,"Kinks","Greatest Hits",66,"Reprise R-6217","US","tricolor label, mono, ps" 690,"Kinks","The Live Kinks",67,"Reprise RS-6260","US","tricolor label" 691,"Kinks","Everybody's In Showbiz",72,"RCA VPS-6065-1/2","US","2LP, promo" 692,"Kinks","The Great Lost Kinks Album",73,"Reprise MS-2127","US","ins" 693,"Kinks","Celluloid Heroes",76,"RCA ASYL1-3869","US","" 694,"Kinks","The Kinks Low Budget Interview",79,"Arista SP-69","","WLP" 695,"Kinks","Give the People What They Want",81,"Arista AL 9567","US","ps" 696,"Kinks","Give People What They Want",81,"Arista AL 9567","","Testpressung" 697,"Kinks","Off The Record Specials - Part 2",84,"Westwood One OTRSP #84-34","US","Radio Show, 2LP" 698,"Kinks","Off The Record Specials - Part I",84,"Westwood One OTRSP #84-33","US","Radio Show, Ins, 2LP" 699,"Kinks","King Biscuit Flower Hour, Show #62",86,"DIR Broadcasting","US","Radio Show, 2LP, tins" 700,"Kinks","Live, The Road",87,"MCA 42107","US","" 701,"Kinks","To The Bone",94,"Konk KNKLP1","US","" 702,"Kinks","The Kinks are the Village Green Pre",97,"Castle Communications ORRLP005","UK","foc, bonus single, ins, #1702/5000" 703,"Kinsey Report","Midnight Drive",89,"Alligator AL 4775","US","" 704,"Korner Alexis","Same",74,"Polydor 2374109","D","" 705,"Korner Alexis","Me",79,"Jeton 100.3305","D","foc, direct-to-disc" 706,"Korner Alexis and Friends","Same",0,"Amiga 8 55 873","DDR","" 707,"Kottke Leo","The Best",0,"Crystal 134 EVC 85061/62","D","2LP, foc, RE" 708,"Kottke Leo","Mudlark",0,"BGO LP 101","UK","REO" 709,"Kottke Leo","Balance",79,"Chrysalis CHR 1234","CA","" 710,"Krokodil","Getting Up For The Morning",0,"Bellaphon BLPS 19117","D","foc" 711,"Krokus","To You All",77,"Schnoutz 6326934","CH","" 712,"Krokus","Tokio Nights",80,"Ariola AROD 241","UK","EP, cv/cyellow, autographed" 713,"Lagger Blues Machine","Same",0,"Fricrivan 88326","B","foc, #430/500" 714,"Lamb Paul & the King Snakes","Same",90,"Blue Horizon BLUH011","D","" 715,"Lammerhirt Werner","Ten Thousand Miles",74,"Stockfisch SF 5001","D","" 716,"Lay Sam's Bluesband","Sam Lay's Bluesband in Bluesland",72,"Blue Thumb BTS 14","US","co" 717,"Lear","Same",96,"Bluemoon SRH 001/96","CH","Swiss Rock History Vol 1, ps" 718,"Led Zeppelin","Live On Blueberry Hill",-1,"EV 666 (BLIMP EV?)","","2LP, bootleg, cv/cred, cblue" 719,"Led Zeppelin","Strange Tales From The Road",-1,"","","1OLPB, bootleg" 720,"Led Zeppelin","Moby Dick",-1,"Jester","","" 721,"Led Zeppelin","The Royal Albert Hall 1971",-1,"Jester","","bootleg" 722,"Led Zeppelin","Dallas",-1,"Toasted TRW 1988","US","2LP, bootleg" 723,"Led Zeppelin","Live In Rotterdam",-1,"Swingin' Pig TSP 096 2","LUX","2LP, cv/clear" 724,"Led Zeppelin","Live In Osaka 9/29/71",-1,"RSR 209","US","2LP, bootleg" 725,"Led Zeppelin","Gone To California",-1,"Dittolino Disc","","bootleg" 726,"Led Zeppelin","Gettin' The Led Out",-1,"Monomatapa","","2LP, bootleg" 727,"Led Zeppelin","Earls Court",-1,"Idle Mind Productions IMP 1107","","bootleg, cv/cblue-black splash" 728,"Led Zeppelin","Moonlight",-1,"Waggle 1938","","2LP, bootleg" 729,"Led Zeppelin","White Summer",0,"RSR 105","","Bootleg, Photocover, TMQ sticker" 730,"Led Zeppelin","II",0,"Atlantic SD 8236","","REO, ss" 731,"Led Zeppelin","Same",0,"Atlantic SD 8216","","REO, ss" 732,"Led Zeppelin","New York, Central Park, 1969",0,"","","Bootleg, cv/white-grey splash" 733,"Led Zeppelin","",0,"LZ 171","","bootleg" 734,"Led Zeppelin","Seattle, May 17, 1973",0,"HH-SEATTLE","","Bootleg, cv/white-grey splash" 735,"Led Zeppelin","Same",0,"Atlantic KSD 19129","","foc, ps, ins" 736,"Led Zeppelin","",0,"TM 1698","'71","bootleg, +EP EP-3XYZ" 737,"Led Zeppelin","L.A. Forum",0,"Led Zeppelin LZ1234","","2LP, Bootleg" 738,"Led Zeppelin","III",70,"Atlantic SD 7201","CA","foc, gimmick cover" 739,"Led Zeppelin","Same",71,"Atlantic 50008","F","foc, ps, orange-violet label" 740,"Led Zeppelin","Platinum",73,"Waggle Waggle 1937","AUS","2LP, bootleg" 741,"Led Zeppelin","Physical Graffiti",75,"Swan Song SS 89 400","D","2LP, ps" 742,"Led Zeppelin","The Song Remains The Same",76,"Swan Song SS 89 402","D","2LP, foc" 743,"Led Zeppelin","Presence",76,"Swan Song SS 8416","US","foc, psf, ps" 744,"Led Zeppelin","In Through The Out Door",79,"Swan Song SS 59 410","D","" 745,"Led Zeppelin","Seattle 73",79,"Phoenix 44772","AUS","2LP, bootleg" 746,"Led Zeppelin","Platinum",85,"Waggle 1937","","2LP, bootleg" 747,"Led Zeppelin","And IV to Go",87,"Ugly Duckling Music CY 6842","US","bootleg" 748,"Led Zeppelin","Stairway to Heaven",88,"Melodia C60 27502 005","RUSS","" 749,"Led Zeppelin","Live",88,"Instant Analysis BBR 020","US","bootleg" 750,"Led Zeppelin","Same",91,"Anf(t?)on C90 32315 H","Russ","" 751,"Legendary Blues Band","Keepin' The Blues Alive",90,"Ichiban ICH 1052 LP","US","" 752,"Lennon John","Mind Games",73,"Apple SW 3414","US","ps" 753,"Leo","Same",98,"Nasoni Nasoni 002","D","#322/500, ins" 754,"Les Sauterelles - The Counts","Swiss Beat Live!",96,"Blue Moon SRH 002/96","CH","#140/500, ins" 755,"Little Charlie & The Nightcats","All The Way Crazy",87,"Alligator AL 4753","US","" 756,"Little Charlie & The Nightcats","Disturbing The Peace",88,"Alligator AL 4761","US","" 757,"Litlle Charlie & The Nightcats","The Big Break",89,"Alligator AL 4776","U$","" 758,"Little Charlie & The Nightcats","Captured Live",91,"Alligator AL 4794","US","" 759,"Little Feat","Back On The Road",-1,"Swingin' Pig TSP 091 2","LUX","2LP, cv/white" 760,"Little Feat","Feats Don't Fail Me Now",74,"Warner BS 2784","US","" 761,"Little Feat","Time Loves A Hero",77,"Warner BS 3015","US","" 762,"Little Feat","Keep On Walking",90,"Flashback L.P. 09.90.0128-33","LUX","" 763,"Little Stevens","Freedom No Compromise",87,"Manhatten ST 53048","CA","ss" 764,"Live","Same",95,"MZE 2773","D","RE, foc" 765,"Lives","Buzz The Jerk",96,"ROREC RR 001196","CH","ps, Ltd. edition 200" 766,"Livin' Blues","Same",0,"Fontana 6428110","D","Attention! Serie" 767,"Livin' Blues","Blue Breeze",0,"Muza SX1687","P","" 768,"Livin' Blues","Hell Session",69,"Philips 6440 315","NL","" 769,"Livin' Blues","Ram Jam Josey",73,"Ariola 88 525 ET","D","" 770,"Livin' Blues","Live '75",75,"Ariola 89243","D","" 771,"Livin' Blues","Blue Breeze",76,"Muza SX 1687","PO","" 772,"Lloyd Richard","Alchemy",79,"Elektra 6E 245","US","" 773,"London Symphony Orchertra & Choir","Tommy",72,"ODE SP 99001","US","2LPB, book" 774,"Lookingglass","Same",72,"Epic KE 31320","US","TOC" 775,"Love Sculpture","Blues Helping",68,"Parlophone PCS 7059","UK","ps" 776,"Lovin' Spoonful","The Best Of Lovin' Spoonful Vol. II",-1,"Kama Sutra KLPS 8064","US","" 777,"Lovin' Spoonful","The Very Best Of",-1,"Kama Sutra KSBS 2013","US","co" 778,"Lovin' Spoonful","Everything Playing",-1,"Kama Sutra KLPS 8061","US","ps" 779,"Lovin' Spoonful","Revelation: Revolution '89",-1,"Kama Sutra KLPS 8073","US","" 780,"Lynyrd Skynyrd","Pronounced",73,"MCA 3019","US","foc" 781,"Lynyrd Skynyrd","One More From The Road",76,"MCA MCA2 8011","US","2LP,foc" 782,"Lynyrd Skynyrd","Street Survivors",77,"MCA 1694","UK","" 783,"Lynyrd Skynyrd","First And ... Last",78,"MCA 3047","US","foc, co" 784,"Lynyrd Skynyrd","Best Of The Rest",82,"MCA 5370","US","" 785,"Lynyrd Skynyrd","Live - Lynyrd Skynyrd Tribute Tour 1",88,"MCA MCA2-81","US","foc, 2LP" 786,"Lynyrd Skynyrd","Endangered Species",94,"Capricorn 477808 1","NL","" 787,"Mack Lonnie","Roadhouses & Dancehalls",88,"Epic 44075","US","" 788,"Mad River","Same",-1,"Capitol ST 2985","US","" 789,"Mama Cass","Dream A Little Dream Of Me",-1,"Pickwick SPC 5359","CA","" 790,"Mamas and Papas","A Gathering Of Flowers",-1,"Dunhill DSY 50073","US","2LPB, book, ins" 791,"Mamas and Papas","Monterey International Pop Festival",-1,"Dunhill/ABC DSX 50100","US","WLP, foc" 792,"Mamas and Papas","20 Golden Hits",73,"MCA DSX 50145","US","" 793,"Mammoth","Same",88,"Jive HIP 56","UK","ps" 794,"Man","Same",-1,"Columbia CS 9803","US","360 degree" 795,"Man","Same",71,"Liberty LBS 83464 I","D","foc" 796,"Man","Back Into The Future",73,"United Artists LA 179 #2","US","2LP, foc, co" 797,"Man","Rhinos, Winos And Lunatics",74,"United Artists LA 247","US","foc, co" 798,"Man","Maximum Drakness",75,"UA IC 064-82 936","D","foc" 799,"Man","Welsh Connection",78,"MCA MCA-2190","US","co" 800,"Mandel Harvey","Cristo Redentor",-1,"Philips PHS 600-28t","US","co" 801,"Marcus","Same",0,"House Of Trax NR 10788-112","US","REO" 802,"Maley Bob & The Wailers","Rastaman Vibration",76,"Island ILPS 19383","IT","foc" 803,"Martyn John","Well Kept Secret",82,"WEA K 99255","UK","ps" 804,"Martyn John","Piece By Piece",86,"Island 207634 630","D","foc" 805,"Mas Carolyne","Mas Hysteria",79,"Mercury 6337 163","NL","" 806,"Mas Carolyne","Live!",92,"SPV 010 88841","D","2LP" 807,"Masked Marauders","Same",0,"Deity RS 6378","US","co" 808,"Mason Dave","Alone Together",70,"Blue Thumb 19","US","foc, mcv" 809,"Mason Dave","Certified Live",76,"Columbia 34174","US","2LP, foc, ps" 810,"Mason Dave & Eliott Cass","Same",-1,"Blue Thumb BTS 8825","US","foc" 811,"Mattews' Southern Comfort","Later That Same Year",71,"Decca DC 75264","US","" 812,"Mayall John","Diary Of A Band",-1,"London PS 570","US","psb" 813,"Mayall John","USA Union",-1,"Polydor 24 4022","US","foc, co" 814,"Mayall John","The Turning Point",0,"Polydor 24-4004","US","" 815,"Mayall John","The Blues Alone",67,"Ace Of Clubs SCL 1243","UK","REO" 816,"Mayall John","Blues from Laurel Canyon",68,"London PS 545","US","foc, ins" 817,"Mayall John","Blues From Laurel Canyon",68,"Decca SKL 4972","UK","REO" 818,"Mayall John","Jazz Blues Fusion",72,"Polydor 2425-103","UK","" 819,"Mayall John","A Banquet in Blues",76,"ABC ABDP 958","US","co, ps" 820,"Mayall John","Lots Of People",77,"ABC AB 992","US","psf" 821,"Mayall John","Lots of People",77,"ABC AB 992","US","" 822,"Mayall John","Road Show",87,"Thunderbolt THBL 060","UK","" 823,"Mayall John with Clapton Eric","Bluesbreakers",-1,"Dekka SKL 4804","","REO" 824,"Mayall John, McGee Jerry, Taylor Larry","Memories",-1,"Polydor PD 5012","US","WLP, foc" 825,"Mayal's John Bluesbreakers","The Power of the Blues",90,"Castle CHL 7002","","" 826,"McCartney Paul","War And Peace",87,"Instant Analysis BBR 015","US","bootleg" 827,"McCartney Paul","CHOBA B CCCP",88,"Melodija A60 00415 006","USSR","" 828,"McGuinn Roger","Cardiff Rose",76,"Columbia PC 34154","US","WLP, TOC, ps, psb" 829,"McGuinn Roger & Band","Same",75,"Columbia PC 33541","US","WLP, TOC, co" 830,"McKay","Into You",93,"OR Records 01","US","REO, autographed, #1481300, ins" 831,"McLaughlin John, Di Meola Al, De Luci","Friday Night in San Francisco",81,"Philips 6302 137","NL","" 832,"McNeely Big Jay","Blow The Wall",90,"Ornament CH 7543","D","" 833,"McShann Jay, Vinton Eddy","Live In France",-1,"Black And Blue 33304","F","" 834,"Medicine Head","Pop History Vol 25",0,"Polydor 2625 026","D","2LP, foc" 835,"Melton Barry","We Are Like The Ocean",77,"Music Is Medicine MIM 9007","US","" 836,"Merryl and the Exiles","The Early Years (1964 - 1967)",0,"American Sound AS-1000","US","#4691500, poster" 837,"Methusalem","Drive On",82,"Methusalem Records METH 8203","CH","" 838,"Michaels Lee","Recital",-1,"A&M SP 4152","US","foc, ins" 839,"Michaels Lee","Carnival Of Life",-1,"A&M SP 4140","US","" 840,"Michaels Lee","Barrel",-1,"A&M SP 4249","US","foc, ins" 841,"Michaels Lee","""5th""",-1,"A&M SP 4302","US","" 842,"Michaels Lee","Same",69,"A&M 212073","D","" 843,"Michaels Lee","Space & First Takes",72,"A&M 4336","US","foc" 844,"Michaels Lee","Nice Day For Something",73,"Columbia 32275","US","psi, psb" 845,"Michaels Lee","Live",73,"A&M SP 3518","US","2LP, ps" 846,"Miller Steve","Fly Like An Eagle",76,"Capitol ST 11497","US","" 847,"Miller Steve Band","Living In The U.S.A.",-1,"Capitol SF 719","US","RE 'Sailor'" 848,"Miller Steve Band","The Joker",73,"Capitol SMAS 11235","US","foc" 849,"Mitchell Joni","Clouds",-1,"Reprise RS 6341","US","foc" 850,"Mitchell Joni & The L.A. Express","Miles Of Aisles",74,"Asylum AB 202","US","2LP, foc" 851,"Moby Grape","Grape Jam",-1,"Columbia MGS 1","US","WLP, TOC, mono" 852,"Moby Grape","Moby Grape '69",-1,"Columbia CS 9696","US","360 degree" 853,"Moby Grape","Truly Fine Citizen",-1,"Columbia CS 9912","US","360 degree, co" 854,"Moby Grape","Great Grape",0,"Columbia C 31098","US","label uberklebt mit schwarzem ring" 855,"Moby Grape","Same",67,"Columbia CL 2698","US","finger cover, mono, co, 360 degree" 856,"Moby Grape","Wow",68,"Columbia CS 9613","US","foc, 360 degree" 857,"Moby Grape","20 Granite Creek",71,"Reprise RS 6460","US","WLP, TOC" 858,"Moby Grape","Live Grape",79,"Line LILP 4.00335","D","REO" 859,"Moby Grape","Same",84,"Edsel ED 137","UK","REO, ps" 860,"Moby Grape","Murder In My Heart",86,"Edsel ED 171","UK","REO, ps" 861,"Molly Hatchett","Flirtin' With Disaster",79,"Epic EPC 4624901","NL","ps" 862,"Molly Hatchett","Beatin' The Odds",80,"Epic EPC 32746","NL","ps" 863,"Molly Hatchett","Take No Prisoners",81,"Epic FE 37480","US","ps, psb" 864,"Molly Hatchett","The Deed Is Done",84,"Epic EPC 26213","UK","" 865,"Molly Hatchett","Beatin' The Odds In Nine Easy Way",80,"Epic AS 841","US","WLP, psb" 866,"Molten Metal","Mercy Black Magic",-1,"Electrecord ST-ELE 04080","RUM","" 867,"Mom's Apple Pie","Same",72,"Brown Bag BB 14200","US","coh, ss" 868,"Moonlight Drive","Same",81,"Agora AG 1200","US","EP" 869,"Moore Gary","Parisienne Walkways",87,"MCA 255006 1","D","" 870,"Moore Gary","Blues For Greeny",95,"Virgin V2704","UK","ps" 871,"Moore Gary","Need Your Love So Bad",95,"Virgin VS 1546","","7"" Single, 33rpm, #2495" 872,"Moore Gary & The Midnight Blues Ban","Back To The Blues",-1,"Swingin' Pig TSP 080 2","LUX","2LP, cv/cblue" 873,"More Experience","Yes We Are",90,"117 556","CH","foc, 2nd. pressing" 874,"More Experience","Yes We Are",92,"117 556","CH","foc, mcv, Eigenverlag" 875,"Morningstar","Venus",79,"Columbia JC 35713","US","WLP, TOC, ps" 876,"Morrill Kent","The Dream Maker",71,"Cream CR 5001","US","WLP, foc, poster" 877,"Morrison Van","Astral Weeks",0,"Warner WB K46024","","REO, ""Simply Vinyl""" 878,"Morrison Van","Moondance",0,"Warner WB 46040","D","RE" 879,"Morrison Van","Saint Dominic's Preview",72,"Warner WB 46172","D","" 880,"Morrison Van","It's Too Late To Stop Now",74,"Warner 2BS 2760","US","2LP, foc" 881,"Morrison Van","Days Like This",95,"Exile Productions 527 307-1","UK","ps" 882,"Morrison Van","The Complete New York Sessions '",97,"Get Back GET 501","I","3LP, Gimmik Cover, ps" 883,"Mother Earth","Living With The Animals",-1,"Mercury SR 61194","US","foc" 884,"Mother Earth","Bring Me Home",71,"Reprise RS 6431","US","WLP" 885,"Mother's Finest","Live",79,"Epic EPC 4630891","NL","ps" 886,"Mott","Drive On",75,"Columbia PC 33705","US","ps" 887,"Mott The Hoople","The Collection",87,"Castle CCSLP 174","UK","2LP, foc" 888,"Mountain","Nantucket Sleighride",-1,"Windfall 5500","US","" 889,"Mountain","Flowers of Evil",71,"Windfall 5501","US","co" 890,"Mountain","Twin Peaks",84,"Columbia CG 32818","US","2LP, foc" 891,"Mu","Same",74,"United Artists UAG 29709","UK","ins" 892,"Mu","The Last Album",82,"Appaloosa AP017","IT","" 893,"Mu","Children of the Rainbow",85,"Blue Form BF1","US","" 894,"Mu","End of an Era",88,"Reckless RECK 7","UK","" 895,"Mugwumps","Same",-1,"Warner WB 1697","US","mono" 896,"Muldauer Maria","Same",73,"Warner MS 2148","US","foc" 897,"Murphy ""Spider"" John & Murphy Willy","Running, Jumping & Standing Still",-1,"Elektra EKS 74071","US","co" 898,"Music Emporium","Same",0,"Psycho 11","","REO, bootleg" 899,"Mystic Number National Bank","Same",0,"ABC/Probe CPLPS 4501","US","foc, gimmick cover" 900,"Nektar","Journey To The Centre Of The Eye",71,"Bacillus 26009010","D","foc" 901,"Nektar","A Tab In The Ocean",72,"Bacillus BAC 2014","D","foc" 902,"Nektar","Remember The Future",73,"Bacillus BLPS 19164 Q","D","foc, quadrophonic" 903,"Nektar","Sunday Night At London Roundhou",74,"Bacillus BLPS 19182","D","foc" 904,"Nektar","Down To Earth",75,"Passport PPSD 98005","US","foc, co" 905,"Nektar","Recycled",76,"Passport PPS 9811","US","foc, co" 906,"Nektar","Live In New York",77,"Bellaphon BAC 2044","D","2LP, foc" 907,"Nektar","Live In New York",77,"Bellaphon BLS 5557","D","2LP, foc" 908,"Nektar","Magic Is A Child",77,"Polydor PD 1 6115","US","ps" 909,"Nektar","Thru The Ears",78,"Visa IMP 9001","US","2LP, foc" 910,"Nektar","More Live Nektar In New York",78,"Bellaphon BAC 2058","D","2LP, foc" 911,"Neville Brothers","Live At Tipitina's Vol II",90,"Castle ESSLP 130","UK","" 912,"New Barbarians","Buried Alive",-1,"Swingin' Pig TSP 066 3","LUX","3LP cv/brown dgrey'grey, foc" 913,"New Cactus Band","Son Of Cactus",73,"ATCO SD 7017","US","psf" 914,"Nicodemus","Antennae Moonlite",94,"Zedikiah 7275539A","US","#306/500" 915,"Nicodemus and Matchez","Better Art Music",86,"Zedikiah 16754","US","" 916,"Nicodemus and Matchez the Congo Kid","Bachstreet Orange",78,"Zedikiah 1070","US","ps" 917,"Nighthawk Robert","Live On Maxwell Street",79,"Rounder 2022","US","" 918,"Nighthawks","Open All Nite",76,"Adelphi AD 4105","US","" 919,"Nighthawks","Nighthawks Live",76,"Adelphi AD 4110","US","" 920,"Nighthawks","Side Pocket Shot",77,"Adelphi AD 4115","US","" 921,"Nighthawks","Jacks & Kings ""Fullhouse""",79,"Adelphi AD 4125","US","" 922,"Nighthawks","Ten Years Live/The Nighthawks",82,"Chesapeake CR-LP 101","US","" 923,"Nighthawks","Times Four",82,"Adelphi AD 4130/35","US","2LP" 924,"Nighthawks","Hard Living",86,"Varrick VR 022","US","" 925,"Nighthawks","Live In Europe",87,"Varrick VR-033","","" 926,"Nine Below Zero","Live At The Venue",89,"Receiver RRLP 121","UK","" 927,"Nix Don","Living By The Days",71,"Elektra eks 74101","","""Samf"", foc, cb, lyrics sheet, ins" 928,"NRBQ","Scraps",82,"Red Rooster 106","CA","remastered" 929,"Nugent Ted","Double Live Ganzol",78,"Epic EPC 88282","NL","2LP, foc" 930,"Nugent Ted & The Amboy Dukes","Same",76,"Mainstream 421","US","" 931,"Nugent's Ted Amboy Dukes","Tooth, Fang & Claw",74,"Discreet DS 2203","US","" 932,"Nyro Laura","Christmas And The Beads Of Sweet",-1,"Columbia KC 30259","US","" 933,"Odom Big Voice","Feel So Good",-1,"Isabel 900516","F","" 934,"Ohio Express","Beg, Borrow & Steal",-1,"Buddah BDM 1018","US","promo, cover Cameo" 935,"Omar","Blues Bag",91,"Provogue PRL 70281","NL","" 936,"Omar and the Howlers","Hard Times in the Land of Plenty",87,"CBS 450948 1","NL","" 937,"Omar and the Howlers","Live at Paradiso",92,"Provogue PRL 70351","NL","" 938,"Orange Wedge","Same / No one Left but me",0,"Little Wing of Refugees LW 3051/5","D","2LP, ins" 939,"Oroboros","Different Feeling",85,"Oroboros Records FS 111880","US","ss" 940,"Orpheus","Same",-1,"Bell 6061","US","co" 941,"Out of Darkness","Same",0,"Little Wing of Refugees LW 2008","D","REO, ins, gimmick poster cover, #1" 942,"Outlaws","Same",75,"Arista C068-96896","F","foc" 943,"Outlaws","Bring It Back Alive",78,"Arista 300689","D","2LP, foc" 944,"Owen B","Same",70,"Mus I Col 101209","US","" 945,"Ozark Mountain Daredevils","Don't Lqok Down",77,"A&M SP 4662","US","ps" 946,"Ozark Mountain Daredevils","Ifs Alive",78,"A&M SP 6006","US","2LP, foc, co, WLP" 947,"Pacific Gas & Electric","Same",69,"Columbia CS 9900","US","360 degree" 948,"Pacific Sound","Forget Your Dream!",0,"Splendid SLP 50.104","CH","REO, foc, #374/500" 949,"Page Jimmy and Plant Robert","Walking into Clarksdale",98,"Atlantic 83092-1","","2LP, foc" 950,"Page Jimmy, Plant Robert","No Quarter",94,"Atlantic 82706-1","US","2LP, 2 ins, sticker" 951,"Patto","Same",70,"VEL 1001","","REO" 952,"Peacepipe","Jon Uzonyi's Peacepipe",95,"Rockadelic Records RRLP 18","US","REO, foc" 953,"Pee Wee Bluesgang","Cool Man's Burning",85,"Woolfe WR 9020","D","" 954,"Pentangle","Basket Of Light",-1,"Reprise 6372","US","" 955,"PG&E","Same",71,"Columbia C 30362","US","co" 956,"Phantasia","A Psychedelic by Phantasia",94,"Ton urn Ton LP ST641","A","#1361300" 957,"Phantom","Phantom's Divine Comedy",74,"Capitol ST 11313","US","woc" 958,"Phillips Steve","The Best Of Steve Phillips",87,"Unamerican Activities BRAVE 5","UK","" 959,"Pierle Ray","Time and Money",80,"Matrix #37488","US","" 960,"Pini Mick","Mick 'Wild Man"" Pini",89,"Blue Horizon BLUH 009","D","" 961,"Pink Floyd","Ummagumma",-1,"Harvest STBB 388","US","2LP, foc" 962,"Pink Floyd","The Dark Side Of The Moon",73,"Harvest C064 05249 '","F","foc" 963,"Pink Floyd","Wish You Were Here",75,"Harvest 064 96918","D","ps" 964,"Pink Floyd","Animals",77,"Harvest 2C 068 98434","F","foc, ps" 965,"Pink Floyd","The Wall",79,"Harvest 1C198-63410111","D","2LP, foe, ps" 966,"Pink Floyd","The Screaming Abdas Nebulosity",89,"Dessie","US","2LP, bootleg" 967,"Pink Floyd","Amsterdam '69",90,"Swingin' Pig TSP 052","LUX","cm/brown" 968,"Pink Floyd","Live In Montreux 1971",90,"Swingin' Pig TSP 071 3","LUX","3LPB, cv/pink" 969,"Pink Floyd","Welcome To The Machine",90,"Swingin' Pig TSP 081","LUX","cv/clear" 970,"Pink Floyd","The Division Bell",94,"EMI 7243 8 28984 1","UK","foc, ps" 971,"Pink Floyd","Atom Heart Mother",94,"MFSL 1-202","US","#2144" 972,"Pinkwind","Festival of the Sun",95,"Twink TWK LP 3","UK","ss" 973,"Plant Robert","The Principle Of Moments",83,"Es Paranza 790101 1","D","ps" 974,"Plant Robert","Shaken 'n' Stirred",85,"Es Parana 790265 1","D","ps" 975,"Plant Robert","After The Crash Vol I",90,"Toasted TRW 1290","AUS","bootleg, 2LP" 976,"Poco","Under The Gun",80,"MCA 202566","NL","gepraegtes Cover, foc, ps" 977,"Poco","Pickin' Up The Pieces",86,"Edsel XED 161","UK","RE, foc" 978,"Police","Bring On The Night",-1,"Swingin' Pig TSP 065 2","LUX","2LP, cv/cblue" 979,"Pot Liquor","Levee Blues",72,"Janus JLS 3033","US","foc, co" 980,"Potliquor","Same",79,"Capitol ST 11998","US","coh, ps" 981,"Procul Harum","Portfolio",88,"Chrysalis 209 155","D","foc" 982,"Psychadelic Furs","All Of This And Nothing",88,"CBS 4611101","NL","ps" 983,"Pucket Gary & The Union Gap","Incredible",-1,"Columbia CS 9715","US","psb, TOC, 360 degree" 984,"Pugsley Munion","Just Like You",0,"J&S LP-0001","","" 985,"Pyle Artimus Band","A.P.B.",82,"MCA 5313","US","" 986,"Quattro Suzi","Live And Kickin'",77,"RAK MID 166233","AUS","2LP, foc" 987,"Quicksilver Messenger Service","Shady Grove",-1,"Capitol SM 391","US","" 988,"Quicksilver Messenger Service","Quicksilver",-1,"Capitol SW 819","US","" 989,"Quicksilver Messenger Service","Same",-1,"Capitol ST 2904","US","" 990,"Quicksilver Messenger Service","Happy Trails",69,"Capitol GO 2012","UK","REO" 991,"Rafferty Gerry","Night Owl",79,"Liberty 038 1576321","EEC","" 992,"Rainbow Bridge Band","A Tribute to Jimmy Hendrix",88,"VPAG LP 5171","US","" 993,"Rainmakers","The Good News And The Bad News",89,"Mercury 8382321","NL","" 994,"Ram Jam","Same",77,"Epic 34885","US","" 995,"Ramatam","Same",72,"Atlantic SD 7236","US","co, ins" 996,"Rare Earth","Rare Earth In Concert",71,"Rare Earth Records R 534D","US","2LP, gimmick cover" 997,"Rare Earth","Willie Remembers",72,"Rare Earth Records R543L","US","foc" 998,"Rave-ups","Chance",89,"Epic 45255","US","" 999,"Rayne","Same",94,"OR Records OR-002","US","REO, ins, #379/500" 1000,"Red Beards","Havin' A Ball",87,"Receiver RRLP 108","UK","" 1001,"Redding Noel Band","Clonakilty Cowboys",75,"RCA APL1 1237","US","ps" 1002,"Redding Otis","""Big Blues"" Live",-1,"Electrecord ELE 03955","RUM","" 1003,"Redding Otis","Otis Redding In Person At The Whis",68,"ATCO SD 33 265","US","" 1004,"Redding Otis, Hendrix Jimi Experience","Historic Performances",0,"Atlantic 940056","F","" 1005,"Redding Otis, Hendrix Jimi Experience","Historic Performances..",70,"Reprise 2029","US","" 1006,"Reddog","Reincarnation",88,"Survival 103","CA","" 1007,"Redeye","One Man's Poison",-1,"Pentagram PE 10006","US","WLP" 1008,"Redeye","Same",-1,"Pentagram PE 10003","US","co" 1009,"Reed A. C.","I'm In The Wrong Business",-1,"Alligator AL 4757","US","" 1010,"Reed Jimmy","I Ain't from Chicago",73,"Bluesway BLS 8054","US","ps" 1011,"Reed Jimmy","At Carnegy Hall",74,"Vee Jay 2SR 1035","US","2LP, foc" 1012,"Reed Lou","??",-1,"Arista America A2L 8402","US","Testpressung" 1013,"Reed Lou","Live",0,"RCA NL 83752","D","" 1014,"Reed Lou","Live Take No Prisoners",78,"Arista America AL 8502","","" 1015,"Reed Lou","Hero & Heroine",90,"Swingin' Pig TSP 058 2","LUX","2LP, cv/olive, rbrown" 1016,"Reed Lou","Set the Twilight Reeling",96,"Warner 9362-46159-1","D","ps" 1017,"Renaissance","Live At Carnegie Hall",76,"Sire SASY 3902-2","US","2LP, foc, ps" 1018,"Renaissance","Novella",77,"Sire SA 7526","US","foc, co" 1019,"Rhinoceros","Same",0,"Disques Vogue CLVLXEK. 305","F","" 1020,"Rhinoceros","Satin Chickens",0,"Elektra EKS 74056","US","co, ins" 1021,"Richards Keith","A Stone Alone",-1,"Swingin' Pig TSP 085 2","LUX","2LP, cv/brown, olive, foc" 1022,"Richards Keith","Talk Is Cheap",88,"Virgin 209265","D","ps" 1023,"Rising Storm","Calm Before ...",0,"Stanton Park SRE 001","US","REO" 1024,"Rivers Johnny","Live at the Whiskey a Gogo",0,"Liberty LBS 83299 X","D","" 1025,"Rolling Stones","Winter Tour 1973",-1,"TMQ 72006","","2LP, bootleg, cv/cred, cgreen, 2 leaflets" 1026,"Rolling Stones","Stone Relics",-1,"TMOO (1816)","","bootleg, cv/cblue" 1027,"Rolling Stones","Hot Rocks 1964-1971",-1,"London 2PS 606/7","US","2LP, foc, book" 1028,"Rolling Stones","Hampton 81",-1,"Swingin' Pig TSP 100 3","LUX","3LPB, cv/red, blue, white" 1029,"Rolling Stones","European Tour 1970",-1,"TMOQ RS108","","bootleg, cv/cred" 1030,"Rolling Stones","Beggars Banquet",0,"London PS 539","","foc, ins" 1031,"Rolling Stones","Between the Buttons",67,"London PS 499","US","ps" 1032,"Rolling Stones","Flowers",67,"London PS 509","US","" 1033,"Rolling Stones","Exile On Main Street",72,"CBS 4501961","NL","2LP, foc" 1034,"Rolling Stones","Dancing With Mr. D",85,"Starlight SL 87015","US","bootleg" 1035,"Rolling Stones","Radio Rocks",88,"Starlight SL 87011","US","" 1036,"Rolling Stones","Lady Jane",88,"Melodija C60 27411 006","USSR","" 1037,"Rolling Stones","Play With Fire",88,"Melodija M60 48371 000","USSR","" 1038,"Rolling Stones","All Together",89,"Melodija C60 28807 006","USSR","" 1039,"Rolling Stones","Welcome To New York",89,"Swingin' Pig TSP 038","LUX","cv/light blue" 1040,"Rolling Stones","Philadelphia Special",90,"Swingin' Pig TSP 050 2","LUX","2LP, cv/clear, foc" 1041,"Rolling Stones","Basel '90",90,"Swingin' Pig TSP SB 3","LUX","3LPB, cv/grey" 1042,"Rolling Stones","Atlantic City '89",90,"Swingin' Pig TSP 075 3","LUX","3LPB" 1043,"Rolling Stones","Philadelphia Special II",90,"Swingin' Pig TSP 060 2","LUX","2LP, cv/light blue, foc" 1044,"Rolling Stones","Stripped",95,"Virgin 841 401 6","UK","2LP, ps" 1045,"Roomful of Blues","Dressed Up To Get Messed Up",84,"Varrick VR 018","US","" 1046,"Rose Garden","Same",68,"ATCO SD 33 225","US","pink/ brown label" 1047,"Rossi Walter","Same",76,"Negram Internat. 5N 064-60269","NL","" 1048,"Rossi Walter","Wizzard",78,"Heavy Sound HSLP 01","S","" 1049,"Rossi Walter","Picks",80,"Aquarius AQS 531","CA","" 1050,"Rossington Collins Band","This Is The Way",81,"MCA 5207","US","foc, gepraegt, ps" 1051,"Rumpelstilz","Vogelfuetter",75,"Schnoutz 8326925","CH","" 1052,"Rumpelstilz","Ds Beschte Vo 1973-78",79,"Schnoutz 9198237","CH","" 1053,"Rumplestiltskin","Same",0,"Bell 2C 062-91.240","F","different cover" 1054,"Rumplesliltskin","Same",70,"Bell SBLL 130","UK","FOC" 1055,"Rumplestiltskin","Same",70,"Bell 6047","US","" 1056,"Rumplesliltskin","Black Magician",72,"Bleeaphon BLPS 19082","D","" 1057,"Saffire - The Uppity Blues Women","Hot Flash",91,"Aligator AL 4796","US","" 1058,"Saint Steven","Same",69,"Command/Probe CPLP 4506","US","FOC" 1059,"Sainte-Marie Buffy","Fire & Fleet & Candlelight",67,"Vanguard VSD 79250","US","" 1060,"Salvation","Same",-1,"ABC ABCS 623","US","FOC" 1061,"Salvo","Solo Tu",-1,"Electrecord ST-EDE 02704","RUM","" 1062,"Santana","Abraxas",70,"CBS S 64087","NL","FOC" 1063,"Santana","Inner Secrets",78,"Columbia FC 35600","US","ps" 1064,"Santana","Marathon",79,"CBS 86098","NL","ps" 1065,"Saunders Merl, Gracia Jerry, Kahn John","Keystone Encores Vol. II",88,"Fantasy MPF 4534","US","psb" 1066,"Saunders Merl, Garcia Jerry, Kahn John","Keystone Encores Vol. t",88,"Fantasy MPF 4533","US","" 1067,"Savage Grace","2",-1,"Reprise RS 6434","US","WLP, TOC" 1068,"Savage Grace","Same",70,"Reprise 6399","US","no, ins" 1069,"Savage Rose","In The Plain",0,"Polydor 24-6001","US","co" 1070,"Savoy Brown","Raw Sienna",0,"Parrot PAS 71036","US","FOC" 1071,"Savoy Brown","A Step Further",0,"Parrot PAS 71029","US","foc, ps" 1072,"Savoy Brown","Blue Matter",69,"Parrot PAS 71027","US","FOC" 1073,"Savoy Brown","Lion's Share",72,"Parrot PAS XPAS 71057","UK","promo, CO, ins" 1074,"Savoy Brown","Jack the Toad",73,"Parrot XPAS 71059","UK","foc, ps" 1075,"Schmetterding Polo Hofer's","Same",78,"Schnoutz 6326939","CH","ps" 1076,"Schmetterding Polo's","Tip-Topi-Type",-1,"Schnoutz 6326940","CH","lyrics sheet" 1077,"Schmetterding Polo's","Enorm In Form",81,"Schnoutz 8399138","CH","FOC" 1078,"Schmetterding Polo's","Papper-La-Papp",82,"Schnoutz 6367036","CH","FOC" 1079,"Scott Isaac","Big Time Blues Man",83,"Red Lightnin RL 0046","UK","" 1080,"Seeds","Raw & Alive / The Seeds in Concert",69,"GNP Crescendo GNPS 2043","US","co" 1081,"Seger Bob System","Mongrel",-1,"Capitol SKAO 499","US","foc, co" 1082,"Sha Na Na","Steam",-1,"Mercury SR 61254","US","WLP" 1083,"Shakey Vick","Little Woman You're so Sweet",0,"Jahus JLS 3000","US","no" 1084,"Shankar Ravi","At The Monterey International Pop F",0,"World Pacific WP 1442","US","foc, ins" 1085,"Shavers Charlie, Johnson Budd","Live",-1,"Black And Blue 33302","F","" 1086,"Shorrock Glenn","The First Twenty Years",85,"EMI 261014/5","AUS","2LP, foc, ps" 1087,"Shotgun Ldt.","Same",71,"Prophecy SD 6050","US","co" 1088,"Silver","Same",76,"Arista AL 4076","US","ps" 1089,"Simon and Garfunkel","The Concert In Central Park",82,"Geffen GEF 96008","UK","2LP, foc" 1090,"Simon Carly","Anticipation",71,"Elektra EKS 75016","US","butterfly, ps" 1091,"Skip Bifferty","Same",67,"SF 7914","UK","REO" 1092,"Skip Bifferty","Same",97,"Essex 1016LP","UK","REO, +45 rpm (On Love, Cover Girl," 1093,"Slick Grace","Manhole",73,"RCA NL 13736","F","" 1094,"Slick Grace","Welcome to the Wrecking Ball",80,"RCA AQL1 3851","CA","co, foc, ps" 1095,"Smith Bob Collage","Smitty",81,"Moseka","US","ps" 1096,"Smith Patti Group","Radio Ethiopia",76,"Arista 201117","D","lyrics sheet" 1097,"Smith Patti Group","Easter",78,"Arista 201128","D","lyrics sheet" 1098,"Smith Pattie","Horses",75,"Arista 201112","D","" 1099,"Snafu","Situation Normal",75,"Capitol ST 11343","US","" 1100,"Snail","Flow",79,"Cream CRE 1012","US","" 1101,"Socrates Drank The Conium","Same",0,"Miles 016","H","REO" 1102,"Sonny","Innerviews",67,"ATCO 33 299","US","co, ocre-grey label" 1103,"Sons of Champlin","A Circle Filled With Love",76,"Ariola America ST 50007","US","co, ps" 1104,"Sopwith Camel","Hello Hello",-1,"Kama Sutra KSBS 2063","US","co, promo" 1105,"Sopwith Camel","Same",0,"Kama Sutra KLPS 8060","US","1. print, on" 1106,"Sorcery","Sinister Soldiers - Second Chapter",72,"SSS-2","","REO" 1107,"Sorcery","Sinister Soldiers - First Chapter",72,"SSS-1","","REO" 1108,"Southern Fried","A Little Taste Of Southern Fried",-1,"Mercury SR 61338","US","foc" 1109,"Southwind","Ready To Ride",-1,"Blue Thumb BTS 13","US","" 1110,"Space Farm","Going Home to Eternity",89,"Little Wing of Refugees LW 4005","D","RE, ins" 1111,"Span","Tschou Zame - Span Live im Tis",0,"Ariola 203 770","CH","" 1112,"Spanky & Our Gang","Same",-1,"Mercury SR 61124","US","foc" 1113,"Spin Doctors","Turn It Upside Down",94,"Epic E 52907","US","foc, ps, cv/cgreen, limited edition" 1114,"Spirit","The Family Play Together",-1,"ODE Z12 44014","US","foc" 1115,"Spirit","Live",0,"Illegal ILP 001","UK","" 1116,"Spirit","Feedback",0,"Epic KE 31175","US","ins, lyrics sheet, foc" 1117,"Spirit","Spirit of '76",75,"Mercury SRM 2 804","US","2LP, foc" 1118,"Spirit","Live Spirit",78,"Patato PR 2001","US","ps" 1119,"Spirit","Patatoland",81,"Line LLP 5102 AS","D","book" 1120,"Spirit","Rapture In The Chambers",89,"IRS 2410201","EEC","" 1121,"Spirits & Worm","Same",0,"Water Serpent LIH-3388","US","REO, #70/775" 1122,"Springsteen Bruce","And The Band Played",90,"Swingin' Pig TSP 051","LUX","cv/cred" 1123,"Spur","Spur Of The Moment",89,"Cinema International CSLP 1500","US","boot REO" 1124,"St John Green","Same",0,"Flick Disk FLS 45001","US","co" 1125,"Stanfield John","12-String Moonrise",83,"June Appal Recordings JA 044","US","ss" 1126,"Starglow Energy","Same",0,"S 54302","CH","cv/cgreen" 1127,"Starglow Energy","Time Machine",95,"SELP 7009","CH","for, ps, #287" 1128,"Starglow Energy","100% Live",97,"Think Progressive EFA-3540-1","D","2LP, foc, ins" 1129,"Starglow Energy","Gate To Celdan",98,"Black Rills Records BRRLP 007","CH","#169/500" 1130,"Starr Ringo","Ringo's Rotogravure",76,"Atlantic SD 18193","US","foc, ps" 1131,"Status Quo","Rockin' All Over The World",-1,"Exlibris PH 6858 085","A","" 1132,"Status Quo","Hello!",73,"Vertigo 6499 683","F","ps" 1133,"Status Quo","The Best Of Status Quo",73,"Pye LDM 30207","F","" 1134,"Steel Mill","Green Eyed God",75,"Essex 1012LP","UK","" 1135,"Steely Dan","Can't Buy A Thrill",72,"ABC ABCX 758","US","foc" 1136,"Steely Dan","Countdown To Ecstasy",73,"ABC ABCX 779","US","lyrics sheet" 1137,"Steely Dan","Pretzel Logic",74,"ABC ABCD 808","US","foc" 1138,"Stephen and the Farmband","Up in Your Thing",73,"Farm Records 1775","US","" 1139,"Steppenwolf","",-1,"Dunhill DX 50090","US","for, no" 1140,"Steppenwolf","Monster",-1,"Dunhill/ABC DS 50066","US","foc" 1141,"Steppenwolf","At Your Birthday Party",0,"Dunhill DSX 50053","US","foc, gimmick cover, sticker" 1142,"Steppenwolf","For Ladies Only",71,"Dunhill DX 50110","US","foc" 1143,"Steppenwolf","Rest In Peace",72,"Dunhill DSX 50124","US","co" 1144,"Steppenwolf","Steppenwolf Live",80,"MCA 6013","CA","2LP" 1145,"Stewart Rod","Had Me A Real Good Time",-1,"TMOQ 1814","","bootleg, smoking pig label" 1146,"Stewart Rod","Every Picture Tells A Story",-1,"Mercury SRM 1 609","US","" 1147,"Stewart Rod / Faces","Coast To Coast, Over Here And Beg",-1,"Mercury SRM 1 679,","US","foc, ps" 1148,"Stone Ground","Same",0,"Warner WS 1895","US","foc, ps" 1149,"Stone Ground","Family Album",71,"Warner 2ZS 1956","US","2LP, foc" 1150,"Stone Ground","3",72,"Warner BS 2545","US","lyrics sheet" 1151,"Stone the Crows","Same",0,"Polydor 24-4019","US","foc" 1152,"Stoned Circus","Same",94,"Rockadelic Records RRLP 12.5","US","REO, ins" 1153,"Strange","Translucent World",0,"Outer Galaxie Publishers 30553","US","RE" 1154,"Sugar Cube Blues Band","Same",0,"Rockadelic Records RRLP21","US","REO" 1155,"Sundial","Acid Yantra",0,"ACME AC8011 LP","UK","foc" 1156,"Sundial","Live Drug",96,"ACME AC8015LP","UK","" 1157,"Sunshine Company","Same",-1,"Imperial LP 12368","US","co" 1158,"Sunshine Company","Sunshine & Shadows",-1,"Imperial LP 12399","US","foc" 1159,"Supercharge","Now Jump",80,"Criminal INT 147704","D","" 1160,"Supertramp","Even In The Quietest Moments...",77,"A&M AMLK 64834","NL","ps" 1161,"Sweathog","Hallelujah",71,"Columbia KC 31144","US","TOC, Poster" 1162,"Sweet Lightning","Same",72,"RCA Victor LSP 4758","US","TOC" 1163,"Sweet Pain","Same",-1,"United Artists UAS 6793","US","foc, ps" 1164,"Sweet Smoke","Just a Poke",0,"EMI 2C 066 28 886","F","" 1165,"Sweet Thursday","Same",-1,"Great Western Gramophone KZ 32","US","foc, psb" 1166,"Taste","Same",-1,"ATCO SD 33 296","US","" 1167,"Taste","Live Taste",-1,"Polydor 2310082","D","" 1168,"Taste","Same",0,"Polydor 2459 327","D","re" 1169,"Taste","The Greatest Rock Sensation / Tast",0,"Karussel 2499 115","D","" 1170,"Taste","On The Boards",70,"Polydor 2459338","D","" 1171,"Taste","Taste Featuring Rory Gallagher In C",78,"Ariola 205366","D","" 1172,"Taste","The Best Of Taste",88,"Rock Machine MACH 10D","UK","2LP, cv/green, foc" 1173,"Taylor Koko","From The Heart Of A Woman",81,"Sonet SNTF 868","US","" 1174,"Taylor Koko & Her Blues Machine","Live From Chicago",87,"Sonet SNTF 988","NL","" 1175,"Tazmanien Devils","Same",80,"Warner BSK 3400","US","ps, psf" 1176,"Tea","Ship",75,"Philips 9118 001","UK","" 1177,"Ten Years After","Same",67,"Deram SML 1015","D","" 1178,"Ten Years After","Watt",70,"Deram SML 1078","UK","foc" 1179,"Ten Years After","Cricklewood Green",70,"Dearm SML 1065","D","foc," 1180,"Ten Years After","Recorded Live",73,"Chrysalis 301 284","D","2LP, foc" 1181,"Tesla","Five Man Acoustical Jam",90,"Geffen GEF 24311","D","2LP, ps" 1182,"Thackery Jimmy and the Drivers","Trouble Man",96,"Grooveland GL101","D","limited ed. #1-0665" 1183,"Things To Come","I Want Out",93,"Sundazed Music LP 5008","US","cv/cblue mono, material von 1965-6" 1184,"Third Power","Believe",0,"Mr. g records","","Boot REO Vanguard VSD 6554" 1185,"Thornton Big Mama","Sassy Mama",75,"Vanguard VSD 79354","US","" 1186,"Thornton Big Mama","Quit Snoopin' Rpund My Door",86,"Ace CH 170","EEC","mono" 1187,"Thornton Big Mama","Stronger Than Dirt/The Way It Is",88,"Charly CDX 24","EEC","2LP, REO zweier LP's, foc" 1188,"Thorogood George & The Destroyer","Move It On Over",78,"Sonet INT 147102","D","" 1189,"Thorogood George & The Destroyer","Live",86,"Fame FA 3211","UK","" 1190,"Thorogood George & The Destroyers","Better Than The Rest",79,"MCA 3091","US","co" 1191,"Thorogood George & The Dsteroyer","More George Thorogood And The D",80,"Sonet SNTF 850","","" 1192,"Three Dog Night","Seven Separate Fools",72,"Dunhill DSD 50118","US","gimmick cover, ps, 7 play cards" 1193,"Toad","Same",0,"AKARMA AK 081","IT","REO, foc, booklet, cv/yellow-splash," 1194,"Toad","dreams",0,"AKARMA AK 083","IT","REO, cv/purple, AK083/45RPM (sle" 1195,"Toad","Tomorrow Blue",0,"AKARMA AK 082","IT","REO, cv/blue, foc, ins, poster, AK08" 1196,"Toe Fat","Same",70,"Rare Earth RS 511","US","REO(?)" 1197,"Toffoletti Guido's Blues Society","Midnight Guitar Talks",0,"Next Step VPA 144","IT","ss" 1198,"Toffoletti Guido's Blues Society with Jo","Live at the City Hall Cafe",86,"Appaloosa AP 053","IT","" 1199,"Townshend Pete","The Genius Of Pete Townshend",-1,"TMOQ 71056","","bootleg, cv/orange (Matrix Pt 512)" 1200,"Townshend Pete","All The Best Cowboys Have Chines",82,"ATCO SD 38 149","US","TOC, ps, foc" 1201,"Townshend Pete","Deep End Live!",86,"ATCO Z 90553.1","US","ps" 1202,"Traffic","Last Exit",69,"United Artists UAS 6702","US","" 1203,"Traffic","John Barleycorn Must Die",70,"Island ILPS 9116","D","FOC" 1204,"Traffic","On The Road",73,"Island AORL 219866","IT","2LP, foc" 1205,"Traffic","Traffic Jam",88,"Document DR 016 LP","EEC","cv/clear" 1206,"Tripsichord Music Box","Same",0,"Sanfrancisco Sound JLS 3016","A","REO, cv/cgreen" 1207,"Triumph","Rock 'n' Roll Machine",73,"MCA 37269","CA","" 1208,"Triumph","Stages",85,"MCA MCA2 8020","US","2LP, foc, co" 1209,"Trout Walter Band","No More Fish Jokes",92,"Provogue PRL 70371","NL","ins" 1210,"Truth & Janey","Just A Little Bit Of Magic",0,"Bee Bee 711 x 98","US","ps" 1211,"Truth & Janey","Live",88,"Rock 'n' Back NR 17619","US","2LP, foc" 1212,"Truth and Janey","No Rest For The Wicked",0,"Montross MR 376","","" 1213,"Turtles","Happy Together, She'd Rather Be",-1,"White Whale WW 114","US","" 1214,"Turtles","More Golden Hits",-1,"White Whale WW 7127","","ss" 1215,"Turtles","Battle Of The Bands",-1,"White Whale WW 7118","US","foc, co" 1216,"Turtles","Turtle Soup",-1,"White Whale WW 7124","US","foc, ps" 1217,"Ultimate Spinach","Behold & See",0,"MGM SE 4570","US","co" 1218,"Ultimate Spinach","Same",0,"MGM SE 4518","US","foc, co" 1219,"Underneath","Sun Of '67",94,"Rockadelic Records RRLP 14.5","US","REO, ins" 1220,"VA","The 1969 Warner-Reprise Record S",-1,"Warner PRO 336","US","2LP, foc" 1221,"VA","The Concert For Bangla Desh",-1,"Apple STCX 3385","US","3LPB, ps, book" 1222,"VA","UK Top 20 Charts Vol. 1",-1,"Electrecord ST-ELE 04079","RUM","" 1223,"VA","West Side Story - Original Soudtrac",61,"CBS 70006","UK","" 1224,"VA","The Blues Came from Memphis",85,"Charly CR 30125","UK","mono" 1225,"VA","Isle Of Wight, Atlanta Pop Festival",71,"CBS 66311","NL","3LP, foc" 1226,"VA","Medicine Ball Caravan",71,"Warner WB 2585","US","co, ins" 1227,"VA","Fillmore - The Last Day",72,"CBS Z3X 31390","US","3LPB, book, 45rpm (AS7 1049)" 1228,"VA","Fathers And Sons",72,"Chess 2CH 50033","US","2LP, foc, co" 1229,"VA","Eric Clapton's Rainbow Concert",73,"RSO 2479116","F","foc" 1230,"VA","Monsters",79,"Warner PRO A 796","US","2LP, foc" 1231,"VA","No Nukes",79,"Asylum ML 801","US","3LP, foc, ps, book" 1232,"VA","Speciality Legendary Missing Maste",83,"Sonet SNTF 5029","UK","" 1233,"VA","Bristol Custom Bike Show 1986",87,"GWR GBS 1","UK","" 1234,"VA","A Slice of Swingin' Pig Vol. I",88,"Swingin' Pig TSP PRO 001","LUX","" 1235,"VA","Back On The Road",88,"Stylus SMR 854","UK","" 1236,"VA","The Music Never Stopped - Roots of",95,"Shanachie 6014","US","picture disc, #01774" 1237,"Vaughan Brothers","Family Style",90,"Epic Z 46255","US","ps" 1238,"Vaughan Stevie Ray & Double Trouble","Couldn't Stand The Weather",84,"Epic FE 39304","US","" 1239,"Vaughan Stevie Ray & Double Trouble","Soul To Soul",85,"Epic FE 40036","US","" 1240,"Vaughan Stevie Ray & Double Trouble","Live Alive",86,"Epic E2 40511","CA","2LP, foc" 1241,"Vaughan Stevie Ray & Double Trouble","The Sky Is Crying",91,"Epic E 47390","US","ps" 1242,"Vaughan Stevie Ray and Double Trouble","In The Beginning",92,"Epic 472624 1","NL","ps" 1243,"Vaughan Stevie Ray and Double Trouble","Greatest Hits",95,"Epic EPC 481025 1","NL","" 1244,"Velvet Underground & Nico","Same",-1,"Verve 710 004","D","unpeeled US cover" 1245,"Vestich Brothers","Live at Wolfendale's",79,"Eclipse W11779VB","US","foc" 1246,"Vikings Invasion","Vol. 1",96,"RD Records RD2","CH","REO, ins, #150/300" 1247,"Vomacka Sammy","Come to my Kitchen",75,"Stockfisch SF 8002","D","signiert" 1248,"Wadsworth Mansion","Same",-1,"Sussex SXBS 7008","US","" 1249,"Walsh Joe","Barnstorming",72,"Dunhill DSX 50130","US","foc" 1250,"Walsh Joe","The Smoker You Drink, The Player",73,"Dunhill DSX 50140","US","" 1251,"Walsh Joe","You Can't Argue With A Sick Mind",76,"ABC 27147","LS","ps" 1252,"Walsh Joe","There Goes The Neighborhood",81,"Asylum AS 52285","US","ps" 1253,"Walsh Joe","You Bought It - You Name It",83,"Warner 23884 1","US","ps" 1254,"Wassermann Rob","Duets",78,"MCA GRP 97121","D","Ilmitierted Edition, Audiophilic Press" 1255,"Waters Muddy","The Real Folk Blues",87,"Chess CH 9274","US","RE" 1256,"Waters Muddy","More Real Folk Blues",88,"Chess CH 9278","US","REO" 1257,"Waters Muddy","Folk Singer",94,"MFSL 1-201","US","#2429" 1258,"Watts John","One More Twist",82,"EMI 1A 064 07609","EEC","ps" 1259,"Waxing Poetics","Manakin Moon",88,"Emergo EM 9557","CA","co, ps" 1260,"Weinberg Elyse","Elyse",-1,"Tetragrammaton T 117","US","" 1261,"Weir Bob","Bobby & The Midnites",81,"Arista AL 9568","US","ps" 1262,"West Leslie","The Great Fatsby",75,"Phantom BPL1 0954","US","co" 1263,"West, Bruce & Laing","Why Dontcha",72,"RSO 2479111","D","" 1264,"Who","Who's Zoo",-1,"POD","US","2LP, bootleg" 1265,"Who","This Is For Them",-1,"RSR 235","US","bootleg" 1266,"Who","The Power Of Hoodoo",-1,"","","bootleg" 1267,"Who","Jaguar",-1,"TMOO 2812","US","2LP, bootleg, smoking pig label" 1268,"Who","Innerview, Show# Special",-1,"","","2LP" 1269,"Who","Who Unreleased",-1,"Who Records LPB 27","US","bootleg" 1270,"Who","Who's Next",0,"MCA MCA-11164","US","RE, audiphile Pressung, foc" 1271,"Who","Tommy",0,"Polydor 184216","NL.","2LP, triple foc" 1272,"Who","Live in Amsterdam",89,"Swingin' Pig TSP 021 2","EEC","2LP, cv/clear, foc" 1273,"Who","American Tour 1973",89,"Swingin' Pig TSP 029","EEC","cv/cyellow" 1274,"Wild Turkey","Battle Hymn",72,"Reprise MS 2070","US","foc" 1275,"Wild Turkey","Same",72,"Chrysalis CHR 1010","UK","foc" 1276,"Williams Robert Pete","The Lecacy Of The Blues Vol. 9",73,"Sonet SNTF 649","US","" 1277,"Windopane","See?",94,"OR Records 003","US","REO, #108/400, 2 inserts" 1278,"Windopane","Lucky Catatonia",95,"Open OPEN-111","US","ins" 1279,"Winter Edgar","Entrance",-1,"Epic BN 26503","US","/w Johnny Winters Band" 1280,"Winter Edgar Group","They Only Come Out At Night",72,"Epic KE 31584","US","foc" 1281,"Winter Edgar Group with Derringer Rick","Same",75,"Blue Sky PZ 33798","US","WLP, TOC, co, ps" 1282,"Winter Johnny","Captured Live",-1,"Blue Sky","NL","ps" 1283,"Winter Johnny","Live / And",-1,"Columbia CG 33651","US","2LP, foc" 1284,"Winter Johnny","Second Winter",-1,"Columbia KCS 9917","US","2LP, foc, 360 degree, 3sides" 1285,"Winter Johnny","Saints & Sinners",74,"Columbia PC 32715","US","" 1286,"Winter Johnny","Better Live Than Never",91,"Double Dutch MMLP 99002","D","2LP, Bootleg, 3-seitig" 1287,"Winter Johnny","Johnny Be Good",91,"Flashback L.P. 07.91.0155-33","LUX","2LP, foc" 1288,"Winwood Steve","Arc Of A Diver",80,"Island ILPS 9576","US","" 1289,"Wishbone Ash","Same",70,"MCA 62.060","D","" 1290,"Wishbone Ash","Pilgrimage",71,"MCA 1762","UK","" 1291,"Wishbone Ash","Argus",72,"MCA 250473 1","D","" 1292,"Wishbone Ash","Double Live Dates Album",73,"MCA MCF 2541","UK","2LP, foc" 1293,"Wolf Peter","Come As You Are",87,"EMI America ST 17230","CA","ps" 1294,"Womb","Same",-1,"Dot DLP 25933","US","ps" 1295,"Wonder Stevie","Sunshine Of My Life",88,"Melodia C60 26825 009","USSR","" 1296,"Wood, Ronnie","Slide On Live",0,"Continuum CTUM 3","F","2LP, foc" 1297,"Wyman Bill","Monkey Grip",74,"Rolling Stones Records COC 79100","US","ps" 1298,"Wynn Michael Band","Queen Of The Night",78,"Ariola America SW 50027","US","" 1299,"Yardbirds","Who Was First?",-1,"Nardem 013","CA","" 1300,"Yardbirds","Shapes Of Things",-1,"Astan 201022","D","RE" 1301,"Yardbirds","For Your Love",-1,"Astan 201024","D","RE" 1302,"Yardbirds","Original Recordings 1963-1968",-1,"Astan 201023","D","RE" 1303,"Yardbirds","Live Again",0,"Vogelfreithree","","bootleg, Limited Edition 300" 1304,"Yardbirds","No. 4",82,"Astan 201030","D","RE" 1305,"Yardbirds","Roger The Engineer",83,"Edsel ED 1165","UK","RE, ps" 1306,"Yardbirds","blasting at the bbc",87,"Bird Brain BBR004","","bootleg" 1307,"Young Jesse Colin","Together",72,"Raccoon/Warner BS 2588","US","" 1308,"Young Jesse Colin","Song For Juli",73,"Warner BS 2734","US","ps" 1309,"Young Jesse Colin","Light Shine",74,"Warner BS 2790","US","" 1310,"Young Jesse Colin","On The Road",76,"Wamer BS 2913","US","" 1311,"Young Jesse Colin","Love On The Wing",77,"Warner BS 3033","US","ps" 1312,"Youngbloods","Earth Music",0,"RCA Victor LPS 3865","AUS","" 1313,"Youngbloods","Get Together (First Album)",0,"RCA Victor LSP 3724","US","ps, zipper label" 1314,"Youngbloods","Elephants Mountain",69,"RCA LSP-4150","US","zipper label" 1315,"Youngbloods","Rock Festival",70,"Warner WS1878 (Raccoon #1)","US","ps" 1316,"Youngbloods","Good And Dusty",71,"Raccoon/Warner BS 2566","US","WLP" 1317,"Youngbloods","Same",71,"Warner BS 2563 (Raccoon #4)","US","TOC, lyrics sheet" 1318,"Youngbloods","Sunlight",71,"RCA Victor LPS-4561","US","" 1319,"Youngbloods","High on a Ridgetop",72,"Warner BS2653 (Raccoon #15)","US","foc" 1320,"Zappa Frank","Live in Europe",-1,"Electrecord ELE 03899","RUM","" 1321,"Zappa Frank","Fred Zeppelin",0,"Mud Shark Stereo MZ 3606","","2LP, bootleg" 1322,"Zappa Frank","Mothers - Fillmore East, June 1971",71,"Bizarre/Reprise MS 2042","US","ps" 1323,"Zappa Frank","Joe's Garage Acts II & III",79,"Zappa Records SRZ-2 1502","US","2LP, foc" 1324,"Zappa Frank","You Are What You Is",81,"Barking Pumpkin PW2 37537","US","2LP, foc, ps, psb" 1325,"Zappa Frank","Beat The Boots!",91,"Rhino 70907","US","8LPB, T-Shirt, etc" 1326,"Zappa Frank","Beat The Boots! Vol 2",92,"Rhino 70372","US","7LPB, Beret, book" 1327,"Zappa Frank / Mothers of Invention","Wax Flag",-1,"Ruthless Rhymes Ldt FZ500","","2LP, bootleg" 1328,"Zerfas","Same",94,"700 West Recording 730710","US","REO, 3 ins, #227/500" 1329,"Zipper","Same",75,"Whizeagle","US","ss" 1330,"Zueri West","Splendid",-1,"Black Cat MS 061185","CH","" 1331,"Zueri West","Kirchberg",-1,"Black Cat MS 51185","CH","" 1332,"ZZ Top","First Album",-1,"London PS 584","US","" 1333,"ZZ Top","Tres Hombres",73,"London XPS 631","US","foc, ps" 1334,"ZZ Top","Deguello",79,"Warner 3381","US","ps" 1335,"ZZ Top","Antenna",94,"RCA 74321182601","NL","Intemationale Version mit Bonus Track" 1336,"Stiller Has","Moudi",96,"Sund Service 300396-1","CH","WASCHEN / 2EP" 1338,"The Pile Up","Drumkit / Postcard ...",88,"PU 11 187","CH","WASCHEN / 45 rpm" 1339,"The Pile Up","Drumkit / Postcard ...",88,"PU 11 187","CH","WASCHEN / 45 rpm" 1340,"Baxter Mind Circus","Insect Love Affair / Insect Love Feast / Insect Love Ride",5,"Electric Brotherhood EB-01","CH","3LP, Steel Box, #17/50, 12"" promo LP ""Hot Wax"", VHS Video ""Baxter Sundance - The Movie"", div promo material" 1341,"Vaughan, Sarah","The Magic of Sarah Vaughan",-1,"Mercury MG-20438","US","WASCHEN" 1342,"Ferderlosband","Federlos",88,"Stechapfel / Federlos 001","CH","WASCHEN / Bio insert Ben Jeger" 1343,"Brom","Same",86,"EBS 86 004 72","CH","WASCHEN" 1344,"Marsalis, Wynton","The Majesty of the Blues",89,"CBS C 45091 / BL 45091","EEC","WASCHEN / ins" 1345,"Corea, Chick","Bliss!",79,"Muse Records MUSE 5011","US","WASCHEN" 1346,"Szabo, Gabor","1969",69,"Skye SK-9","US","WASCHEN / foc, ins" 1347,"VA","Columbia Jazz Festival",-1,"Columbia XLP 45473","US","WASCHEN / foc" 1348,"Warhol, Andy's Velvet Underground","Same",67,"MGM 2683 006","US","WASCHEN / 2LP, foc" glom-1.22.4/tests/import/utils.h0000644000175000017500000000170212234252646017757 0ustar00murraycmurrayc00000000000000#ifndef TEST_IMPORT_UTILS_H #define TEST_IMPORT_UTILS_H #include #include namespace ImportTests { bool check(const std::string& name, bool test, std::stringstream& report); typedef sigc::slot FuncConnectParserSignals; /** * @result Whether the parser finished without being killed by a timeout. */ bool run_parser_from_buffer(const FuncConnectParserSignals& connect_parser_signals, const char* input, guint input_size); /** * @result Whether the parser finished without being killed by a timeout. */ bool run_parser_from_buffer(const FuncConnectParserSignals& connect_parser_signals, const std::string& input); /** * @result Whether the parser finished reading a CSV file correctly without being killed by a timeout. */ bool run_parser_on_file(const FuncConnectParserSignals& connect_parser_signals, const std::string &uri); } // namespace ImportTests #endif //TEST_IMPORT_UTILS_H glom-1.22.4/tests/import/test_parsing.cc0000644000175000017500000001670212234776363021474 0ustar00murraycmurrayc00000000000000#include #include //#include #include #include #include #include #include #include #include #include namespace { typedef std::vector type_tokens; type_tokens& get_tokens_instance() { static type_tokens tokens; return tokens; } void on_line_scanned(const std::vector& row, guint /*line_number*/) { for(std::vector::const_iterator iter = row.begin(); iter != row.end(); ++iter) { //std::cout << "debug: " << G_STRFUNC << ": item=" << *iter << std::endl; get_tokens_instance().push_back(*iter); } } /* void print_tokens() { for(type_tokens::const_iterator iter = get_tokens_instance().begin(); iter != get_tokens_instance().end(); ++iter) { std::cout << " [" << *iter << "] "; } std::cout << std::endl; } */ // Check that a string (or regex) exists in the parsed tokens. bool check_tokens(const std::string& regex) { Glib::RefPtr check; try { check = Glib::Regex::create(regex); } catch(const Glib::Error& ex) { std::cerr << "Glib::Regex::create() failed: " << ex.what() << std::endl; return false; } if(!check && 0 == get_tokens_instance().size()) return false; for(type_tokens::const_iterator iter = get_tokens_instance().begin(); iter != get_tokens_instance().end(); ++iter) { if(check->match(*iter)) return true; } return false; } void connect_signals(Glom::CsvParser& parser) { parser.signal_line_scanned().connect(sigc::ptr_fun(&on_line_scanned)); //parser.signal_encoding_error().connect(sigc::ptr_fun(&on_encoding_error)); } } // namespace // Testcases int main() { //Threading is always enabled starting from GLib 2.31.0: //TODO: Just remove this when we can increase the glibmm version needed: #if !GLIB_CHECK_VERSION (2, 31, 0) Glib::thread_init(); #endif Glib::init(); Gio::init(); //Glib::RefPtr mainloop = Glib::MainLoop::create(); bool result = true; std::stringstream report; // Test parsing of escaped quotes (double quotes in .csv mean a single quote in the actual field value): // test_dquoted_string { const char* raw = "\"a \"\"quoted\"\" token\",\"sans quotes\"\n"; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw); const bool passed = (finished_parsing && check_tokens("^(a \"quoted\" token|sans quotes)$") && 2 == get_tokens_instance().size()); get_tokens_instance().clear(); if(!ImportTests::check("test_dquoted_string", passed, report)) result = false; } // Allow a line to have no newline at the end. // test_allow_no_ending_newline { const char* raw = "\"token in first line\"\n\"2nd token\", \"but\", \"this\",\"line\",\"will\",\"be\",\"skipped\""; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw); const bool passed = (finished_parsing && check_tokens("token in first line") && check_tokens("2nd token") && 8 == get_tokens_instance().size()); get_tokens_instance().clear(); if(!ImportTests::check("test_allow_no_ending_newline", passed, report)) result = false; } // Make sure that we do not demand quotes around items. // test_allow_no_quotes { const char* raw = "this,line,contains,some,tokens\n"; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw); const bool passed = (finished_parsing && !check_tokens("^$") && //Check that there are no empty strings 5 == get_tokens_instance().size()); get_tokens_instance().clear(); if(!ImportTests::check("test_allow_no_quotes", passed, report)) result = false; } // test_skip_spaces_around_separators // TODO: This seems wise, but where is it specified? murrayc. /* { const char* raw = "\"spaces\" , \"around\", \"separators\"\n"; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw); const bool passed = (finished_parsing && check_tokens("^(spaces|around|separators)$") && //Matches these words with nothing else at the start or end. 3 == get_tokens_instance().size()); get_tokens_instance().clear(); if(!ImportTests::check("test_skip_spaces_around_separators", passed, report)) { result = false; } } */ // test_fail_on_non_comma_separators // TODO: Where is this behaviour (ignoring text between quoted text) specified? murray /* { const char* raw = "\"cannot\"\t\"tokenize\"\t\"this\"\n"; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw); const bool passed = (finished_parsing && check_tokens("^cannottokenizethis$") && //Matches this text with nothing else at the start or end. 1 == get_tokens_instance().size()); get_tokens_instance().clear(); if(!ImportTests::check("test_fail_on_non_comma_separators", passed, report)) result = false; } */ // test_parse_newline_inside_quotes { const char* raw = "\"cell with\nnewline\"\n\"token on next line\"\n"; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw); const bool passed = (finished_parsing && check_tokens("^(cell with\nnewline|token on next line)$") && //Matches these texts with nothing else at the start or end. 2 == get_tokens_instance().size()); get_tokens_instance().clear(); if(!ImportTests::check("test_parse_newline_inside_quotes", passed, report)) result = false; } // test_fail_on_non_matching_quotes // Commented out because it's not clear what we want to do here. // In this case, the ending newline would just appear as a quoted newline. murrayc. /* { const char* raw = "\"token1\"\nthis quote has no partner\",\"token2\"\n"; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw); const bool passed = (finished_parsing && check_tokens("token") && 1 == get_tokens_instance().size()); print_tokens(); get_tokens_instance().clear(); if(!ImportTests::check("test_fail_on_non_matching_quotes", passed, report)) result = false; } */ // test_import_csv_file { // filename_to_uri expects absolute filenames const std::string filename = Glib::build_filename(GLOM_TESTS_IMPORT_DATA_NOTINSTALLED, "albums.csv"); const bool finished_parsing = ImportTests::run_parser_on_file(&connect_signals, Glib::filename_to_uri(filename)); //std::cout << "tokens count=" << get_tokens_instance().size() << std::endl; const guint expected_tokens = 1348.0 /* lines */ * 7.0 /* columns */; //std::cout << "expected_tokens=" << expected_tokens << std::endl; const bool passed = (finished_parsing && expected_tokens == get_tokens_instance().size()); get_tokens_instance().clear(); if(!ImportTests::check("test_csv_import", passed, report)) result = false; } if(!result) std::cout << report.rdbuf() << std::endl; return result ? EXIT_SUCCESS : EXIT_FAILURE; } glom-1.22.4/tests/import/utils.cc0000644000175000017500000001074112234776363020127 0ustar00murraycmurrayc00000000000000#include #include #include #include #include namespace ImportTests { //The result just shows whether it finished before the timeout. static bool finished_parsing = true; bool check(const std::string& name, bool test, std::stringstream& report) { if(!test) report << name << ": FAILED" << std::endl; return test; } // Returns the file URI of the temporary created file, which will contain the buffer's contents. static Glib::ustring create_file_from_buffer(const char* input, guint input_size) { const std::string file_uri = Glom::Utils::get_temp_file_uri("glom_import_testdata"); if(file_uri.empty()) { std::cerr << G_STRFUNC << ": file_uri was empty." << std::endl; return std::string(); } Glib::RefPtr file = Gio::File::create_for_uri(file_uri); gssize result = 0; //TODO: Catch exception. result = file->append_to()->write(input, input_size); g_return_val_if_fail(-1 < result, ""); return file_uri; } static void on_mainloop_killed_by_watchdog(const Glib::RefPtr& mainloop) { finished_parsing = false; //Quit the mainloop that we ran because the parser uses an idle handler. mainloop->quit(); } static void on_parser_encoding_error(const Glib::RefPtr& mainloop) { finished_parsing = true; //Quit the mainloop that we ran because the parser uses an idle handler. mainloop->quit(); } static void on_parser_finished(const Glib::RefPtr& mainloop) { finished_parsing = true; //Quit the mainloop that we ran because the parser uses an idle handler. mainloop->quit(); } static void on_file_read_error(const std::string& /*unused*/, const Glib::RefPtr& mainloop) { finished_parsing = true; //Quit the mainloop that we ran because the parser uses an idle handler. mainloop->quit(); } bool run_parser_from_buffer(const FuncConnectParserSignals& connect_parser_signals, const std::string& input) { return run_parser_from_buffer(connect_parser_signals, input.data(), input.size()); } bool run_parser_from_buffer(const FuncConnectParserSignals& connect_parser_signals, const char* input, guint input_size) { finished_parsing = true; //Start a mainloop because the parser uses an idle handler. //TODO: Stop the parser from doing that. Glib::RefPtr mainloop = Glib::MainLoop::create(); Glom::CsvParser parser("UTF-8"); parser.signal_encoding_error().connect(sigc::bind(&on_parser_encoding_error, mainloop)); parser.signal_finished_parsing().connect(sigc::bind(&on_parser_finished, mainloop)); // Install a watchdog for the mainloop. No test should need longer than 300 // seconds. Also, we need to avoid being stuck in the mainloop. // Infinitely running tests are useless. mainloop->get_context()->signal_timeout().connect_seconds_once(sigc::bind(&on_mainloop_killed_by_watchdog, mainloop), 300); connect_parser_signals(parser); const Glib::ustring file_uri = create_file_from_buffer(input, input_size); parser.set_file_and_start_parsing(file_uri); if (Glom::CsvParser::STATE_PARSING != parser.get_state()) return false; mainloop->run(); Glib::RefPtr file = Gio::File::create_for_uri(file_uri); //TODO: Catch exception. const bool removed = file->remove(); g_assert(removed); return finished_parsing; } bool run_parser_on_file(const FuncConnectParserSignals& connect_parser_signals, const std::string &uri) { finished_parsing = true; //Start a mainloop because the parser uses an idle handler. //TODO: Stop the parser from doing that. Glib::RefPtr mainloop = Glib::MainLoop::create(); Glom::CsvParser parser("UTF-8"); parser.signal_encoding_error().connect(sigc::bind(&on_parser_encoding_error, mainloop)); parser.signal_finished_parsing().connect(sigc::bind(&on_parser_finished, mainloop)); parser.signal_file_read_error().connect(sigc::bind(&on_file_read_error, mainloop)); // Install a watchdog for the mainloop. No test should need longer than 300 // seconds. Also, we need to avoid being stuck in the mainloop. // Infinitely running tests are useless. mainloop->get_context()->signal_timeout().connect_seconds_once(sigc::bind(&on_mainloop_killed_by_watchdog, mainloop), 300); connect_parser_signals(parser); parser.set_file_and_start_parsing(uri); if (Glom::CsvParser::STATE_PARSING != parser.get_state()) return false; mainloop->run(); return finished_parsing; } } //namespace ImportTests glom-1.22.4/tests/import/test_signals.cc0000644000175000017500000001023212234252646021452 0ustar00murraycmurrayc00000000000000#include #include #include #include #include #include #include #include namespace { typedef std::vector type_encodings; guint& get_line_scanned_count_instance() { static guint line_scanned_count = 0; return line_scanned_count; } guint& get_encoding_error_count_instance() { static guint encoding_error_count = 0; return encoding_error_count; } void on_line_scanned() { ++(get_line_scanned_count_instance()); } void on_encoding_error() { ++(get_encoding_error_count_instance()); } void reset_signal_counts() { get_line_scanned_count_instance() = 0; get_encoding_error_count_instance() = 0; } /* void print_signal_counts() { std::cout << "lines scanned: " << get_line_scanned_count_instance() << std::endl; std::cout << "encoding errors: " << get_encoding_error_count_instance() << std::endl; } */ void connect_signals(Glom::CsvParser& parser) { parser.signal_line_scanned().connect(sigc::hide(sigc::hide(&on_line_scanned))); parser.signal_encoding_error().connect(sigc::ptr_fun(&on_encoding_error)); } } // namespace // Testcases int main() { //Threading is always enabled starting from GLib 2.31.0: //TODO: Just remove this when we can increase the glibmm version needed: #if !GLIB_CHECK_VERSION (2, 31, 0) Glib::thread_init(); #endif Glib::init(); Gio::init(); bool result = true; std::stringstream report; // test_ignore_quoted_newlines { // 2 CSV lines, first one contains newlines inside quotes const char* raw = "\"some\n quoted\r\n newlines\n\", \"token2\"\n\"token3\"\n"; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw); const bool passed = (finished_parsing && 2 == get_line_scanned_count_instance() && 0 == get_encoding_error_count_instance()); if(!ImportTests::check("test_ignore_quoted_newlines", passed, report)) result = false; reset_signal_counts(); } // test_ignore_empty_lines { // 5 CSV lines, but only 2 contain data const char* raw = "token1\n\n\n\ntoken2, token3\n"; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw); const bool passed = (finished_parsing && 2 == get_line_scanned_count_instance() && 0 == get_encoding_error_count_instance()); if(!ImportTests::check("test_ignore_empty_lines", passed, report)) result = false; reset_signal_counts(); } // TODO: Cannot currently run this test in a sane fashion, fix me! /* { const char* const encoding_arr[] = {"UTF-8", "UCS-2"}; type_encodings encodings(encoding_arr, encoding_arr + G_N_ELEMENTS(encoding_arr)); // An invalid Unicode sequence. const char* raw = "\0xc0\0x00\n"; ImportTests::set_parser_contents(parser, raw); for (type_encodings::const_iterator iter = encodings.begin(); iter != encodings.end(); ++iter) { try { while(parser.on_idle_parse()) {} parser.clear(); } catch(const Glib::ConvertError& exception) { std::cout << exception.what() << std::endl; } parser.set_encoding((*iter).c_str()); } const const bool passed = (2 == get_encoding_error_count_instance() && 0 == get_line_scanned_count_instance()); if(!ImportTests::check("test_wrong_encoding", passed, report)) result = false; reset_signal_counts(); parser.clear(); } */ // test_incomplete_chars { // An incomplete Unicode sequence. const char raw[] = "\0xc0\n"; const bool finished_parsing = ImportTests::run_parser_from_buffer(&connect_signals, raw, G_N_ELEMENTS(raw)); const bool passed = (finished_parsing && 1 == get_encoding_error_count_instance() && 0 == get_line_scanned_count_instance()); if(!ImportTests::check("test_incomplete_chars", passed, report)) result = false; reset_signal_counts(); } if(!result) std::cout << report.rdbuf() << std::endl; return result ? EXIT_SUCCESS : EXIT_FAILURE; } glom-1.22.4/tests/test_selfhosting_new_empty_then_users.cc0000644000175000017500000002350312234776363025367 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE template bool contains(const T_Container& container, const T_Value& name) { typename T_Container::const_iterator iter = std::find(container.begin(), container.end(), name); return iter != container.end(); } static bool test_add_group(const Glom::Document& document, const Glib::ustring& group) { if(!Glom::DbUtils::add_group(&document, group)) { std::cerr << "DbUtils::add_group() failed." << std::endl; return false; } const Glom::Privs::type_vec_strings group_list = Glom::Privs::get_database_groups(); if(!contains(group_list, group)) { std::cerr << "Privs::get_database_groups() does not contain the expected group." << std::endl; std::cerr << " group: " << group << std::endl; return false; } const Glom::Privs::type_vec_strings user_list = Glom::Privs::get_database_users(group); if(!user_list.empty()) { std::cerr << "The user list is not empty as expected.." << std::endl; return false; } return true; } static bool test_add_user(const Glom::Document& document, const Glib::ustring& user, const Glib::ustring& group) { //Add an operator user, adding it to the group: if(!Glom::DbUtils::add_user(&document, user, "somepassword", group)) { std::cerr << "DbUtils::add_user() failed." << std::endl; test_selfhosting_cleanup(); return false; } const Glom::Privs::type_vec_strings user_list = Glom::Privs::get_database_users(group); if(!contains(user_list, user)) { std::cerr << "Privs::get_database_users() does not contain the expected user:" << std::endl; std::cerr << " group: " << group << std::endl; std::cerr << " user: " << user << std::endl; return false; } return true; } static bool change_privileges(const Glib::ustring& group_name, const Glib::ustring& table_name, bool view, bool edit, bool create, bool del) { //Change the privs and make sure that it worked: Glom::Privileges privs_new; privs_new.m_view = view; privs_new.m_edit = edit; privs_new.m_create = create; privs_new.m_delete = del; if(!Glom::Privs::set_table_privileges(group_name, table_name, privs_new, false)) { std::cerr << "Privs::set_table_privileges() failed for group=" << group_name << ", table_name=" << table_name << std::endl; return false; } const Glom::Privileges privs_changed = Glom::Privs::get_table_privileges(group_name, table_name); if( (privs_changed.m_view != privs_new.m_view) || (privs_changed.m_edit != privs_new.m_edit) || (privs_changed.m_create != privs_new.m_create) || (privs_changed.m_delete != privs_new.m_delete) ) { std::cerr << "Changing and re-reading privileges failed for group=" << group_name << ", table_name=" << table_name << std::endl; return false; } return true; } static bool test(Glom::Document::HostingMode hosting_mode) { //Create and self-host the document: Glom::Document document; if(!(test_create_and_selfhost_new_database(document, hosting_mode, "test_db"))) { std::cerr << "test_create_and_selfhost_new_database() failed" << std::endl; return false; } typedef std::vector type_vec_strings; type_vec_strings table_names; table_names.push_back("sometable"); table_names.push_back("SomeTableWithUpperCase"); table_names.push_back("sometable with space characters"); table_names.push_back("sometable with a \" doublequote character"); table_names.push_back("sometable with a ' quote character"); table_names.push_back("sometablewithaverylongnameyaddayaddayaddayaddayaddyaddayaddayaddayaddayaddayaddayaddayaddayaddayaddayaddayadda"); //Add some tables, for the groups to have rights for: for(type_vec_strings::const_iterator iter = table_names.begin(); iter != table_names.end(); ++iter) { if(!Glom::DbUtils::create_table_with_default_fields(&document, *iter)) { std::cerr << "Failure: create_table_with_default_fields() failed." << std::endl; return false; } } //Check that only one group exists (the developer group): const Glom::Privs::type_vec_strings group_list_original = Glom::Privs::get_database_groups(); if(group_list_original.empty()) { std::cerr << "Privs::get_database_groups() returned an empty list." << std::endl; return false; } if(!contains(group_list_original, GLOM_STANDARD_GROUP_NAME_DEVELOPER)) { std::cerr << "Privs::get_database_groups() does not contain the developers group." << std::endl; return false; } //Add groups: type_vec_strings group_names; group_names.push_back("somegroup1"); group_names.push_back("somegroup with space characters"); group_names.push_back("somegroup with a \" doublequote character"); group_names.push_back("somegroup with a ' quote character"); group_names.push_back("somegroupwithaverylongnameyaddayaddayaddayaddayaddyaddayaddayad"); //Almost too big. //We expect this to fail because of an apparently-undocumented max pg_user size of 63 characters in PostgreSQL: //group_names.push_back("somegroupwithaverylongnameyaddayaddayaddayaddayaddyaddayaddayadd"); //Add groups: for(type_vec_strings::const_iterator iter = group_names.begin(); iter != group_names.end(); ++iter) { //Add groups: if(!test_add_group(document, *iter)) return false; } //Add users: //TODO: Test strange passwords. type_vec_strings user_names; user_names.push_back("someuser1"); user_names.push_back("someuser with space characters"); user_names.push_back("someuser with a \" doublequote character"); user_names.push_back("someuser with a ' quote character"); user_names.push_back("someuserwithaverylongnameyaddayaddayaddayaddayaddyaddayadda"); //Almost too big, with space for the numeric suffix below. //We expect this to fail because of an apparently-undocumented max pg_user size of 63 characters in PostgreSQL: //user_names.push_back("someuserwithaverylongnameyaddayaddayaddayaddayaddyaddayaddayadd"); guint i = 0; for(type_vec_strings::const_iterator iter_user = user_names.begin(); iter_user != user_names.end(); ++iter_user) { for(type_vec_strings::const_iterator iter_group = group_names.begin(); iter_group != group_names.end(); ++iter_group) { const Glib::ustring group_name = *iter_group; const Glib::ustring username = Glib::ustring::compose("%1%2", *iter_user, i); //Make sure the username is unique. if(!test_add_user(document, username, group_name)) return false; for(type_vec_strings::const_iterator iter_table = table_names.begin(); iter_table != table_names.end(); ++iter_table) { const Glib::ustring table_name = *iter_table; const Glom::Privileges privs = Glom::Privs::get_table_privileges(group_name, table_name); if(!privs.m_view) { std::cerr << "Privs::get_table_privileges() returned an unexpected view privilege for group=" << group_name << ", table_name=" << table_name << std::endl; return false; } if(!privs.m_edit) { std::cerr << "Privs::get_table_privileges() returned an unexpected edit privilege for group=" << group_name << ", table_name=" << table_name << std::endl; return false; } //We default to create and delete being false: /* if(privs.m_create) { std::cerr << "Privs::get_table_privileges() returned an unexpected create privilege for group=" << group_name << ", table_name=" << table_name << std::endl; return false; } if(privs.m_delete) { std::cerr << "Privs::get_table_privileges() returned an unexpected delete privilege for group=" << group_name << ", table_name=" << table_name << std::endl; return false; } */ if(!change_privileges(group_name, table_name, true, true, true, false)) return false; } if(!Glom::DbUtils::remove_user_from_group(username, group_name)) { std::cerr << "DbUtils::remove_user() failed for user=" << username << ", group=" << group_name << std::endl; return false; } if(!Glom::DbUtils::remove_user(username)) { std::cerr << "DbUtils::remove_user() failed for user=" << username << std::endl; return false; } ++i; } } //Test get_table_privileges(). test_selfhosting_cleanup(false /* do not delete the file. */); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } /* SQLite does not have user/group access levels, * so the SQL queries woudl fail. if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } */ Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/tests/test_selfhosting_utils.cc0000644000175000017500000003260612234776363022265 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include #include #include #include #include #include #include #include static void on_initialize_progress() { //std::cout << "Database initialization progress" << std::endl; } static void on_startup_progress() { //std::cout << "Database startup progress" << std::endl; } static void on_recreate_progress() { //std::cout << "Database re-creation progress" << std::endl; } static void on_cleanup_progress() { //std::cout << "Database cleanup progress" << std::endl; } static void on_db_creation_progress() { //std::cout << "Database creation progress" << std::endl; } static std::string temp_filepath_dir; //Remembered so we can delete it later. static Glib::ustring temp_file_uri; //Rememered so we can return it sometimes. static bool check_directory_exists() { if(temp_filepath_dir.empty()) { std::cerr << G_STRFUNC << ": temp_filepath_dir is empty." << std::endl; return false; } Glib::RefPtr file = Gio::File::create_for_path(temp_filepath_dir); return file->query_exists(); } /** Delete a directory, if it exists, and its contents. * Unlike g_file_delete(), this does not fail if the directory is not empty. */ static bool delete_directory(const Glib::RefPtr& directory) { if(!(directory->query_exists())) return true; //(Recursively) Delete any child files and directories, //so we can delete this directory. Glib::RefPtr enumerator = directory->enumerate_children(); Glib::RefPtr info = enumerator->next_file(); while(info) { Glib::RefPtr child = directory->get_child(info->get_name()); bool removed_child = false; if(child->query_file_type() == Gio::FILE_TYPE_DIRECTORY) removed_child = delete_directory(child); else removed_child = child->remove(); if(!removed_child) return false; info = enumerator->next_file(); } //Delete the actual directory: if(!directory->remove()) return false; return true; } /** Delete a directory, if it exists, and its contents. * Unlike g_file_delete(), this does not fail if the directory is not empty. */ static bool delete_directory(const std::string& uri) { Glib::RefPtr file = Gio::File::create_for_uri(uri); return delete_directory(file); } void test_selfhosting_cleanup(bool delete_file) { Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); const bool stopped = connection_pool->cleanup( sigc::ptr_fun(&on_cleanup_progress) ); g_assert(stopped); if(!delete_file) return; //Make sure the directory is removed at the end: if(!temp_filepath_dir.empty()) { Glib::ustring uri; try { uri = Glib::filename_to_uri(temp_filepath_dir); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": Glib::filename_to_uri() failed: " << ex.what() << std::endl; } if(!uri.empty()) delete_directory(uri); } temp_filepath_dir.clear(); temp_file_uri.clear(); //Forget this too. } bool test_selfhost(Glom::Document& document, const Glib::ustring& user, const Glib::ustring& password) { //TODO: Let this happen automatically on first connection? Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); connection_pool->setup_from_document(&document); connection_pool->set_user(user); connection_pool->set_password(password); const Glom::ConnectionPool::StartupErrors started = connection_pool->startup( sigc::ptr_fun(&on_startup_progress) ); if(started != Glom::ConnectionPool::Backend::STARTUPERROR_NONE) { std::cerr << "connection_pool->startup(): result=" << started << std::endl; test_selfhosting_cleanup(); return false; } g_assert(started == Glom::ConnectionPool::Backend::STARTUPERROR_NONE); return true; } bool test_create_and_selfhost_new_empty(Glom::Document& document, Glom::Document::HostingMode hosting_mode, const std::string& subdirectory_path) { if( (hosting_mode != Glom::Document::HOSTING_MODE_POSTGRES_SELF) && (hosting_mode != Glom::Document::HOSTING_MODE_SQLITE) ) { std::cerr << G_STRFUNC << ": This test function does not support the specified hosting_mode: " << hosting_mode << std::endl; return false; } //Save a copy, specifying the path to file in a directory: //For instance, /tmp/testglom/testglom.glom"); const std::string temp_filename = "testglom"; temp_filepath_dir = Glom::Utils::get_temp_directory_path(temp_filename); if(!subdirectory_path.empty()) temp_filepath_dir = Glib::build_filename(temp_filepath_dir, subdirectory_path); const std::string temp_filepath = Glib::build_filename(temp_filepath_dir, temp_filename); //Make sure that the file does not exist yet: { const Glib::ustring uri = Glib::filename_to_uri(temp_filepath_dir); delete_directory(uri); } //Save the example as a real file: temp_file_uri = Glib::filename_to_uri(temp_filepath); document.set_allow_autosave(false); //To simplify things and to not depend implicitly on autosave. document.set_file_uri(temp_file_uri); document.set_hosting_mode(hosting_mode); document.set_is_example_file(false); document.set_network_shared(false); const bool saved = document.save(); g_assert(saved); //Specify the backend and backend-specific details to be used by the connectionpool. Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); connection_pool->setup_from_document(&document); //We must specify a default username and password: Glib::ustring password; const Glib::ustring user = Glom::Privs::get_default_developer_user_name(password); connection_pool->set_user(user); connection_pool->set_password(password); //Create the self-hosting files: const Glom::ConnectionPool::InitErrors initialized_errors = connection_pool->initialize( sigc::ptr_fun(&on_initialize_progress) ); g_assert(initialized_errors == Glom::ConnectionPool::Backend::INITERROR_NONE); if(!check_directory_exists()) { std::cerr << "Failure: The data directory does not exist after calling initialize()." << std::endl; return false; } //Start self-hosting: return test_selfhost(document, user, password); } Glib::ustring test_get_temp_file_uri() { return temp_file_uri; } bool test_create_and_selfhost_new_database(Glom::Document& document, Glom::Document::HostingMode hosting_mode, const Glib::ustring& database_name, const std::string& subdirectory_path) { if(!test_create_and_selfhost_new_empty(document, hosting_mode, subdirectory_path)) { std::cerr << G_STRFUNC << ": test_create_and_selfhost_new_empty() failed." << std::endl; return false; } const Glib::ustring db_name = Glom::DbUtils::get_unused_database_name(database_name); if(db_name.empty()) { std::cerr << "DbUtils::get_unused_database_name) failed." << std::endl; return false; } //Create a database: const bool created = Glom::DbUtils::create_database(&document, db_name, "test title", sigc::ptr_fun(&on_db_creation_progress)); if(!created) { std::cerr << "DbUtils::create_database() failed." << std::endl; return false; } return true; } bool test_create_and_selfhost_from_example(const std::string& example_filename, Glom::Document& document, Glom::Document::HostingMode hosting_mode, const std::string& subdirectory_path) { Glib::ustring uri; // Get a URI for the example file: try { const std::string path = Glib::build_filename(GLOM_DOCDIR_EXAMPLES_NOTINSTALLED, example_filename); uri = Glib::filename_to_uri(path); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return false; } return test_create_and_selfhost_from_uri(uri, document, hosting_mode, subdirectory_path); } bool test_create_and_selfhost_from_uri(const Glib::ustring& example_file_uri, Glom::Document& document, Glom::Document::HostingMode hosting_mode, const std::string& subdirectory_path) { if( (hosting_mode != Glom::Document::HOSTING_MODE_POSTGRES_SELF) && (hosting_mode != Glom::Document::HOSTING_MODE_SQLITE) ) { std::cerr << G_STRFUNC << ": This test function does not support the specified hosting_mode: " << hosting_mode << std::endl; return false; } // Load the document: document.set_allow_autosave(false); //To simplify things and to not depend implicitly on autosave. document.set_file_uri(example_file_uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << G_STRFUNC << ": Document::load() failed with failure_code=" << failure_code << std::endl; return false; } if(!document.get_is_example_file() && !document.get_is_backup_file()) { std::cerr << G_STRFUNC << ": The document is not an example or a backup." << std::endl; return false; } if(!test_create_and_selfhost_new_empty(document, hosting_mode, subdirectory_path)) { std::cerr << G_STRFUNC << ": test_create_and_selfhost_new_empty() failed." << std::endl; return false; } const bool recreated = Glom::DbUtils::recreate_database_from_document(&document, sigc::ptr_fun(&on_recreate_progress) ); if(!recreated) test_selfhosting_cleanup(); return recreated; } bool test_model_expected_size(const Glib::RefPtr& data_model, guint columns_count, guint rows_count) { if(!data_model) { std::cerr << "Failure: data_model was null" << std::endl; return false; } if(data_model->get_n_columns() != (int)columns_count) { std::cerr << "Failure: get_n_columns() returned an unexpected value. Expected: " << columns_count << ", Actual: " << data_model->get_n_columns() << std::endl; return false; } if(data_model->get_n_rows() != (int)rows_count) { std::cerr << "Failure: get_n_rows() returned an unexpected value. Expected: " << rows_count << ", Actual: " << data_model->get_n_rows() << std::endl; return false; } return true; } bool test_table_exists(const Glib::ustring& table_name, const Glom::Document& document) { //Try to get more rows than intended: Glom::Utils::type_vecLayoutFields fieldsToGet; Glom::sharedptr field = document.get_field_primary_key(table_name); //To to get some field. Glom::sharedptr layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); const Glib::RefPtr builder = Glom::Utils::build_sql_select_with_where_clause(table_name, fieldsToGet); Glib::RefPtr data_model = Glom::DbUtils::query_execute_select(builder); if(!data_model || !(data_model->get_n_columns())) { std::cerr << "Failure: table does not exist: " << table_name << std::endl; return false; } return true; } bool test_example_musiccollection_data(const Glom::Document* document) { if(!document) { std::cerr << G_STRFUNC << ": document is null" << std::endl; return false; } //Check that some data is as expected: const Gnome::Gda::Value value("Born To Run"); const Gnome::Gda::SqlExpr where_clause = Glom::Utils::get_find_where_clause_quick(document, "albums", value); Glom::Utils::type_vecLayoutFields fieldsToGet; Glom::sharedptr field = document->get_field("albums", "album_id"); Glom::sharedptr layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); field = document->get_field("albums", "name"); layoutitem = Glom::sharedptr::create(); layoutitem->set_full_field_details(field); fieldsToGet.push_back(layoutitem); const Glib::RefPtr builder = Glom::Utils::build_sql_select_with_where_clause("albums", fieldsToGet, where_clause); Glib::RefPtr data_model = Glom::DbUtils::query_execute_select(builder); if(!test_model_expected_size(data_model, 2, 1)) { std::cerr << "Failure: Unexpected data model size with query: " << Glom::Utils::sqlbuilder_get_full_query(builder) << std::endl; return false; } const int count = Glom::DbUtils::count_rows_returned_by(builder); if(count != 1 ) { std::cerr << "Failure: The COUNT query returned an unexpected value: " << count << std::endl; return false; } return true; } glom-1.22.4/tests/test_glade_toplevels_instantiation.sh0000755000175000017500000000024312234252646024646 0ustar00murraycmurrayc00000000000000#/bin/sh -e for x in $(find ${srcdir}/glom/ -name "*.glade") do # echo glade_toplevels_instantiation $x tests/glade_toplevels_instantiation $x || exit 1 done glom-1.22.4/tests/test_selfhosting_new_then_change_columns.cc0000644000175000017500000001443012234776363025774 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "tests/test_selfhosting_utils.h" #include #include #include #include #include #include #include #include #include //For g_assert() #include #include //For EXIT_SUCCESS and EXIT_FAILURE #include //For memcmp(). static bool test(Glom::Document::HostingMode hosting_mode) { Glom::Document document; const bool recreated = test_create_and_selfhost_from_example("example_smallbusiness.glom", document, hosting_mode); if(!recreated) { std::cerr << "Recreation failed." << std::endl; return false; } const Glib::ustring table_name = "contacts"; const Glib::ustring field_name_original = "date_of_birth"; Glom::sharedptr field = document.get_field(table_name, field_name_original); if(!field) { std::cerr << "Failure: Could not get field." << std::endl; return false; } Glom::sharedptr field_new = Glom::glom_sharedptr_clone(field); if(!field_new) { std::cerr << "Failure: field_new is null." << std::endl; return false; } field_new->set_glom_type(Glom::Field::TYPE_TEXT); Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); if(!connection_pool) { std::cerr << "Failure: connection_pool is null." << std::endl; return false; } //Test that change_column() does not fail horribly: //TODO: Start with some data that can be converted meaningfully, //and check that the result is as expected: try { const bool test = connection_pool->change_column(table_name, field, field_new); if(!test) { std::cerr << "Failure: change_column() failed." << std::endl; return false; } } catch(const Glib::Error& ex) { std::cerr << "Failure: change_column() threw an exception: " << ex.what() << std::endl; return false; } //Try another change: field = Glom::glom_sharedptr_clone(field_new); field_new->set_glom_type(Glom::Field::TYPE_NUMERIC); try { const bool test = connection_pool->change_column(table_name, field, field_new); if(!test) { std::cerr << "Failure: change_column() failed." << std::endl; return false; } } catch(const Glib::Error& ex) { std::cerr << "Failure: change_column() threw an exception: " << ex.what() << std::endl; return false; } //Try another change: field = Glom::glom_sharedptr_clone(field_new); field_new->set_name("somenewfieldname"); try { const bool test = connection_pool->change_column(table_name, field, field_new); if(!test) { std::cerr << "Failure: change_column() failed." << std::endl; return false; } } catch(const Glib::Error& ex) { std::cerr << "Failure: change_column() threw an exception: " << ex.what() << std::endl; return false; } //Try to make it auto-increment: field = Glom::glom_sharedptr_clone(field_new); field_new->set_auto_increment(); try { const bool test = connection_pool->change_column(table_name, field, field_new); if(!test) { std::cerr << "Failure: change_column() failed." << std::endl; return false; } } catch(const Glib::Error& ex) { std::cerr << "Failure: change_column() threw an exception: " << ex.what() << std::endl; return false; } //Check that the auto-increment works: //Actually checking for a 0 here is not very useful, //but at least we are running some of the relevant code: const Gnome::Gda::Value value_next = Glom::DbUtils::get_next_auto_increment_value(table_name, field_new->get_name()); const double value_next_as_double = Glom::Conversions::get_double_for_gda_value_numeric(value_next); if(value_next_as_double != 0) { std::cerr << "Failure: The next auto-increment value is not 0 as expected. Instead it is: " << value_next_as_double << std::endl; return false; } //Add a field: try { //TODO: Avoid the need for this awkward use of set_g_type(): Glom::sharedptr field = Glom::sharedptr::create(); field->set_name("newfield"); field->set_glom_type(Glom::Field::TYPE_NUMERIC); Glib::RefPtr field_info = field->get_field_info(); field_info->set_g_type( Glom::Field::get_gda_type_for_glom_type(field->get_glom_type()) ); field->set_field_info(field_info); Gnome::Gda::Numeric numeric; numeric.set_double(123); field->set_default_value( Gnome::Gda::Value(numeric) ); const bool test = connection_pool->add_column(table_name, field); if(!test) { std::cerr << "Failure: add_column() failed." << std::endl; return false; } } catch(const Glib::Error& ex) { std::cerr << "Failure: add_column() threw an exception: " << ex.what() << std::endl; return false; } //Anything using this code would then update the Glom::Document, //for instance by calling Document::set_table_fields(), //but we are not testing that here. test_selfhosting_cleanup(); return true; } int main() { Glom::libglom_init(); if(!test(Glom::Document::HOSTING_MODE_POSTGRES_SELF)) { std::cerr << "Failed with PostgreSQL" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } if(!test(Glom::Document::HOSTING_MODE_SQLITE)) { std::cerr << "Failed with SQLite" << std::endl; test_selfhosting_cleanup(); return EXIT_FAILURE; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/missing0000755000175000017500000001533112234777115015377 0ustar00murraycmurrayc00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: glom-1.22.4/Makefile_libglom.am0000644000175000017500000001134712234776363017550 0ustar00murraycmurrayc00000000000000## Copyright (c) 2009-2010 Openismus GmbH ## ## This file is part of Glom. ## ## Glom is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published ## by the Free Software Foundation, either version 2 of the License, ## or (at your option) any later version. ## ## Glom is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ## See the GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see . libglom_defines = \ -DGLOM_PKGDATADIR_XSLT=\""$(pkgdatadir)/xslt"\" \ -DGLOM_PKGDATADIR_XSLT_NOTINSTALLED=\""$(top_srcdir)/xslt"\" lib_LTLIBRARIES = glom/libglom/libglom-@GLOM_ABI_VERSION@.la include $(top_srcdir)/glom/libglom/filelist.am libglom_includedir = $(includedir)/glom-$(GLOM_ABI_VERSION)/libglom libglom_include_HEADERS = $(libglom_toplevel_headers) libglom_data_structure_includedir = $(libglom_includedir)/data_structure libglom_data_structure_include_HEADERS = $(libglom_data_structure_headers) libglom_ds_layout_includedir = $(libglom_data_structure_includedir)/layout libglom_ds_layout_include_HEADERS = $(libglom_ds_layout_headers) libglom_ds_l_report_parts_includedir = $(libglom_ds_layout_includedir)/report_parts libglom_ds_l_report_parts_include_HEADERS = $(libglom_ds_l_report_parts_headers) libglom_document_includedir = $(libglom_includedir)/document libglom_document_include_HEADERS = $(libglom_document_headers) libglom_d_bakery_includedir = $(libglom_document_includedir)/bakery libglom_d_bakery_include_HEADERS = $(libglom_d_bakery_headers) libglom_d_b_view_includedir = $(libglom_d_bakery_includedir)/view libglom_d_b_view_include_HEADERS = $(libglom_d_b_view_headers) glom_libglom_libglom_@GLOM_ABI_VERSION@_la_SOURCES = $(libglom_sources) libglom_all_libs = $(LIBGLOM_LIBS) $(PYTHON_LIBS) $(BOOST_PYTHON_LIBS) -lgettextpo $(GCOV_CFLAGS) glom_libglom_libglom_@GLOM_ABI_VERSION@_la_LIBADD = $(libglom_all_libs) if HOST_WIN32 glom_libglom_libglom_@GLOM_ABI_VERSION@_la_LIBADD += -lws2_32 endif glom_libglom_libglom_@GLOM_ABI_VERSION@_la_LDFLAGS = -no-undefined glom_libglom_libglom_@GLOM_ABI_VERSION@_la_CPPFLAGS = $(glom_includes) $(LIBGLOM_CFLAGS) $(PYTHON_CPPFLAGS) $(BOOST_PYTHON_CFLAGS) $(GCOV_CFLAGS) $(libglom_defines) pyexec_LTLIBRARIES = glom/python_embed/python_module/glom_@GLOM_ABI_VERSION_UNDERLINED@.la glom_python_embed_python_module_glom_@GLOM_ABI_VERSION_UNDERLINED@_la_SOURCES = \ glom/python_embed/python_module/py_glom_module.cc \ glom/python_embed/python_module/py_glom_module.h glom_python_embed_python_module_glom_@GLOM_ABI_VERSION_UNDERLINED@_la_LIBADD = \ glom/libglom/libglom-$(GLOM_ABI_VERSION).la \ $(PYTHON_LIBS) $(BOOST_PYTHON_LIBS) if HOST_WIN32 pymod_ldflags = -module -avoid-version -no-undefined -shrext .pyd else pymod_ldflags = -module -avoid-version -no-undefined endif glom_pyexport = -export-symbols-regex '^_*initglom' glom_python_embed_python_module_glom_@GLOM_ABI_VERSION_UNDERLINED@_la_LDFLAGS = $(pymod_ldflags) $(glom_pyexport) glom_python_embed_python_module_glom_@GLOM_ABI_VERSION_UNDERLINED@_la_CPPFLAGS = $(glom_includes) $(LIBGLOM_CFLAGS) $(PYTHON_CPPFLAGS) $(BOOST_PYTHON_CFLAGS) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = glom/libglom/glom-@GLOM_ABI_VERSION@.pc # Command-line tools: glom_commandline_ldadd = glom/libglom/libglom-$(GLOM_ABI_VERSION).la $(libglom_all_libs) glom_commandline_cppflags = $(glom_includes) $(LIBGLOM_CFLAGS) $(PYTHON_CPPFLAGS) $(BOOST_PYTHON_CFLAGS) $(glom_defines) bin_PROGRAMS = glom/glom_create_from_example \ glom/glom_test_connection \ glom/glom_export_po \ glom/glom_export_po_all \ glom/glom_import_po_all glom_glom_create_from_example_SOURCES = glom/glom_create_from_example.cc glom_glom_create_from_example_LDADD = $(glom_commandline_ldadd) glom_glom_create_from_example_CPPFLAGS = $(glom_commandline_cppflags) glom_glom_test_connection_SOURCES = glom/glom_test_connection.cc glom_glom_test_connection_LDADD = $(glom_commandline_ldadd) glom_glom_test_connection_CPPFLAGS = $(glom_commandline_cppflags) glom_glom_export_po_SOURCES = glom/glom_export_po.cc glom_glom_export_po_LDADD = $(glom_commandline_ldadd) glom_glom_export_po_CPPFLAGS = $(glom_commandline_cppflags) glom_glom_export_po_all_SOURCES = glom/glom_export_po_all.cc glom_glom_export_po_all_LDADD = $(glom_commandline_ldadd) glom_glom_export_po_all_CPPFLAGS = $(glom_commandline_cppflags) glom_glom_import_po_all_SOURCES = glom/glom_import_po_all.cc glom_glom_import_po_all_LDADD = $(glom_commandline_ldadd) glom_glom_import_po_all_CPPFLAGS = $(glom_commandline_cppflags) glom-1.22.4/configure.ac0000644000175000017500000003305612234776701016272 0ustar00murraycmurrayc00000000000000## Copyright (c) 2009, 2010 Openismus GmbH ## ## This file is part of Glom. ## ## Glom is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published ## by the Free Software Foundation, either version 2 of the License, ## or (at your option) any later version. ## ## Glom is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ## See the GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see . AC_INIT([Glom],[1.22.4],[http://bugzilla.gnome.org/enter_bug.cgi?product=Glom],[glom]) AC_PREREQ(2.63) AC_CONFIG_SRCDIR([glom/main.cc]) AC_CONFIG_MACRO_DIR([macros]) AC_CONFIG_HEADERS([config.h glom/libglom/libglom_config.h]) AM_INIT_AUTOMAKE([1.10 -Wno-portability no-define nostdinc tar-ustar]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) AM_MAINTAINER_MODE AC_ARG_VAR([ACLOCAL_FLAGS], [aclocal flags, e.g. -I ]) AC_PROG_CC AM_PROG_CC_C_O AC_PROG_CXX LT_PREREQ([2.2.0]) LT_INIT([disable-static win32-dll]) # Used for the install directories for headers. The same number is used in # the library name, which must be kept in sync, but variables can't be used # with that. AC_SUBST([GLOM_ABI_VERSION], [1.22]) AC_DEFINE_UNQUOTED([GLOM_ABI_VERSION], ["$GLOM_ABI_VERSION"], [Define to the Glom ABI version string.]) # Python modules can't be called glom-1.x, so we use underlines. AC_SUBST([GLOM_ABI_VERSION_UNDERLINED], ["AS_TR_SH([$GLOM_ABI_VERSION])"]) AC_DEFINE_UNQUOTED([GLOM_ABI_VERSION_UNDERLINED], ["$GLOM_ABI_VERSION_UNDERLINED"], [Define to the Glom ABI version with '.' replaced by '_'.]) # libgettext-po changed its API, changing the error handler struct # from po_error_handler to po_xerror_handler: AC_CACHE_CHECK([for po_xerror_handler], [glom_cv_has_po_xerror_handler], [AC_CHECK_MEMBER([struct po_xerror_handler.xerror], [glom_cv_has_po_xerror_handler=yes], [glom_cv_has_po_xerror_handler=no], [#include ])]) AS_IF([test "x$glom_cv_has_po_xerror_handler" = xyes], [AC_DEFINE([HAVE_GETTEXTPO_XERROR], [1], [Define if libgettextpo provides the new po_xerror_handler struct.])]) # i18n IT_PROG_INTLTOOL([0.35]) AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.17]) AC_SUBST([GETTEXT_PACKAGE], [glom]) AC_DEFINE([GETTEXT_PACKAGE], [PACKAGE_TARNAME], [Define to the gettext package name.]) # Linking with libdl isn't needed on various non-Linux platforms, # eventhough they do provide dlopen(3). AC_CHECK_LIB([dl], [dlopen], AC_SUBST([DL_LIB], ["-ldl"])) AC_MSG_CHECKING([whether to enable Windows specific options]) AS_CASE([$host_os], [mingw*], [glom_host_win32=yes], [glom_host_win32=no]) AC_MSG_RESULT([$glom_host_win32]) AS_IF([test "x$glom_host_win32" = xyes], [AC_CHECK_TOOL([WINDRES], [windres])]) AM_CONDITIONAL([HOST_WIN32], [test "x$glom_host_win32" = xyes]) AC_ARG_ENABLE([glom-ui], [AS_HELP_STRING([--enable-glom-ui], [build the glom UI application instead of just libglom. The command-line utilities are always built. [default=yes]])], [glom_enable_ui=$enableval], [glom_enable_ui=yes]) AM_CONDITIONAL([GLOM_ENABLE_UI], [test "x$glom_enable_ui" = xyes]) AC_ARG_ENABLE([client-only], [AS_HELP_STRING([--enable-client-only], [build without developer mode and self-hosting])], [glom_enable_client_only=$enableval], [glom_enable_client_only=no]) AM_CONDITIONAL([GLOM_ENABLE_CLIENT_ONLY], [test "x$glom_enable_client_only" = xyes]) AS_IF([test "x$glom_enable_client_only" = xyes], AC_DEFINE([GLOM_ENABLE_CLIENT_ONLY], [1], [Define to disable support for self-hosting and developer mode.])]) AC_ARG_ENABLE([ui-tests], [AS_HELP_STRING([--enable-ui-tests], [Run UI tests during make check. [default=yes]])], [glom_enable_ui_tests=$enableval], [glom_enable_ui_tests=yes]) AM_CONDITIONAL([GLOM_ENABLE_UI_TESTS], [test "x$glom_enable_ui_tests" = xyes]) AC_ARG_ENABLE([sqlite], [AS_HELP_STRING([--enable-sqlite], [Allow creation of SQLite databases and opening of documents using SQLite databases. This disables some functionality and is intended only for embedded use.])], [glom_enable_sqlite=$enableval], [glom_enable_sqlite=no]) AM_CONDITIONAL([GLOM_ENABLE_SQLITE], [test "x$glom_enable_sqlite" = xyes]) AS_IF([test "x$glom_enable_sqlite" = xyes], [AC_DEFINE([GLOM_ENABLE_SQLITE], [1], [Whether to enable support for SQLite databases.])]) AC_ARG_ENABLE([postgresql], [AS_HELP_STRING([--disable-postgresql], [do not build with support for PostgreSQL databases])], [glom_enable_postgresql=$enableval], [glom_enable_postgresql=yes]) AM_CONDITIONAL([GLOM_ENABLE_POSTGRESQL], [test "x$glom_enable_postgresql" = xyes]) AS_IF([test "x$glom_enable_postgresql" = xyes], [AC_DEFINE([GLOM_ENABLE_POSTGRESQL], [1], [Whether to enable support for PostgreSQL databases.])]) # Libraries used by libglom: REQUIRED_LIBGLOM_LIBS='giomm-2.4 >= 2.32.0 libxml++-2.6 >= 2.23.1 libxslt >= 1.1.10 pygobject-3.0 >= 2.29.0 libgdamm-5.0 >= 4.99.6 libgda-5.0 >= 5.0.3 libgda-postgres-5.0' AS_IF([test "x$glom_host_win32" != xyes], [REQUIRED_LIBGLOM_LIBS="$REQUIRED_LIBGLOM_LIBS libepc-1.0 >= 0.4.0"]) # Libraries used by Glom: REQUIRED_GLOM_LIBS="$REQUIRED_LIBGLOM_LIBS gtkmm-3.0 >= 3.4.0 goocanvasmm-2.0 >= 1.90.8 goocanvas-2.0 >= 2.0.1 evince-view-3.0" # Do not require iso-codes in client-only mode, or on Windows: # TODO: Package iso-codes for Windows? AS_IF([test "x$glom_enable_client_only" != xyes && test "x$glom_host_win32" != xyes], [REQUIRED_GLOM_LIBS="$REQUIRED_GLOM_LIBS iso-codes"]) # Do not require gtksourceviewmm in client only mode AS_IF([test "x$glom_enable_client_only" != xyes], [REQUIRED_GLOM_LIBS="$REQUIRED_GLOM_LIBS gtksourceviewmm-3.0 >= 3.0.0"]) AS_IF([test "x$glom_enable_sqlite" = xyes], [REQUIRED_GLOM_LIBS="$REQUIRED_GLOM_LIBS libgda-sqlite-5.0"]) #TODO: Remove this check, because we checked again later anyway, #because we add REQUIRED_LIBGLOM_LIBS to REQUIRED_GLOM_LIBS? PKG_CHECK_MODULES([LIBGLOM], [$REQUIRED_LIBGLOM_LIBS]) #Disable the checks for UI dependencies if not building the UI: AS_IF([test "x$glom_enable_ui" = xno], [REQUIRED_GLOM_LIBS="$REQUIRED_LIBGLOM_LIBS"]) PKG_CHECK_MODULES([GLOM], [$REQUIRED_GLOM_LIBS]) MM_PKG_CONFIG_SUBST([GLIB_GENMARSHAL], [--variable=glib_genmarshal glib-2.0]) # Get the location of the ISO-Codes (currencies, languages) files: MM_PKG_CONFIG_SUBST([ISO_CODES_PREFIX], [--variable=prefix iso-codes]) AC_DEFINE_UNQUOTED([ISO_CODES_PREFIX], ["$ISO_CODES_PREFIX"], [Define to the installation prefix of the iso-codes module.]) # Allow use of mm-common macros for the warnings option and for installing developer documentation. MM_PREREQ([0.9.5]) MM_INIT_MODULE([libglom-1.22]) # Copy the mm-common .pl scripts into docs/, # and use them from there, # so we can dist them to avoid a tarball-build dependency. MM_CONFIG_DOCTOOL_DIR([docs/libglom_reference]) # Evaluate the --enable-warnings=level option. AC_LANG([C]) MM_ARG_ENABLE_WARNINGS([GLOM_WFLAGS], [-Wall], [-Wall -Wextra -Wno-missing-field-initializers -DGSEAL_ENABLE], [G GDK GDK_PIXBUF CAIRO PANGO GTK]) AC_LANG([C++]) MM_ARG_ENABLE_WARNINGS([GLOM_WXXFLAGS], [-Wall], [-Wall -Wextra -Wno-missing-field-initializers -DGSEAL_ENABLE], [G GDK GDK_PIXBUF GTK GLIBMM GDKMM CAIROMM PANGOMM GTKMM]) AC_CHECK_FUNCS([strptime]) # Get the compiler and linker flags for embedding Python. # To specify a particular python version set an environment variable. # For instance: PYTHON=python2.5 MM_CHECK_MODULE_PYTHON AC_SUBST(PYTHON_CPPFLAGS) #Not used, because boost::python has it as a dependency: AC_SUBST(PYTHON_LIBS) # Get the CFLAGS and LIBS for boost::python. # Note that we have hacked this script to work with MM_CHECK_MODULE_PYTHON instead of AX_PYTHON # This does an AC_SUBST() of BOOST_PYTHON_LIBS # For the CFLAGS we must assume that boost is at the top-level, for instance in /usr/include/: AX_BOOST_PYTHON_MURRAYC AC_ARG_ENABLE([update-mime-database], [AS_HELP_STRING([--disable-update-mime-database], [do not run the update-mime-database utility (mainly useful to package maintainers)])], [glom_update_mime_database=$enableval], [glom_update_mime_database=yes]) AM_CONDITIONAL([UPDATE_MIME_DATABASE], [test "x$glom_update_mime_database" != xno]) # Locate the directory containing the postgresql utilities, such as the # postmaster executable, so we can self-host postgresql databases. AC_ARG_WITH([postgres-utils], [AS_HELP_STRING([--with-postgres-utils=DIR], [path to PostgreSQL utilities (overriding pg_config)])], [POSTGRES_UTILS_PATH=$withval]) # Path not needed on Windows AS_IF([test "x$glom_host_win32" != xyes && test "x$glom_enable_client_only" != xyes], [AS_CASE([$POSTGRES_UTILS_PATH], [""|no|yes], [ POSTGRES_UTILS_PATH=`pg_config --bindir 2>&AS_MESSAGE_LOG_FD` AS_IF(["$POSTGRES_UTILS_PATH/pg_ctl" --version >/dev/null 2>&AS_MESSAGE_LOG_FD],, [AC_MSG_ERROR([[ The Postgres utilities could not be found. They are needed for self-hosting of Glom databases. Please make sure that Postgres is installed, and if necessary specify the correct directory explicitly with the --with-postgres-utils option. ]])])])]) AC_DEFINE_UNQUOTED([POSTGRES_UTILS_PATH], ["$POSTGRES_UTILS_PATH"], [Define to the location of the PostgreSQL utilities.]) AC_DEFINE_UNQUOTED([EXEEXT], ["$EXEEXT"], [Define to the file extension of executables on the target.]) GNOME_DOC_INIT([0.9.0],, [AC_MSG_WARN([[gnome-doc-utils not found: documentation will not be built.]])]) MM_ARG_ENABLE_DOCUMENTATION MM_ARG_WITH_TAGFILE_DOC([libstdc++.tag], [mm-common-libstdc++]) MM_ARG_WITH_TAGFILE_DOC([libsigc++-2.0.tag], [sigc++-2.0]) MM_ARG_WITH_TAGFILE_DOC([glibmm-2.4.tag], [glibmm-2.4]) MM_ARG_WITH_TAGFILE_DOC([cairomm-1.0.tag], [cairomm-1.0]) MM_ARG_WITH_TAGFILE_DOC([pangomm-1.4.tag], [pangomm-1.4]) AC_ARG_VAR([SPHINX_BUILD], [path to sphinx-build utility]) AS_IF([test "x$ENABLE_DOCUMENTATION" != xno], [AC_PATH_PROG([SPHINX_BUILD], [sphinx-build], [sphinx-build]) AS_IF([test "x$SPHINX_BUILD" != xsphinx-build], [], [AC_MSG_ERROR([The documentation build is enabled, but the sphinx-build tool could not be found.])])]) # Check for tar and gzip (used by tar via -z) because we use these when # creating backups. # TODO: This lets us provide a path via a configure option, but we just use # Glib::find_program_in_path(), ignoring that. # TODO: This should check for GNU tar, as GNU tar features are used during the # backup process. AC_CHECK_PROG([GLOM_TAR], [tar], [yes], [no]) AS_IF([test "$GLOM_TAR" = no], [AC_MSG_ERROR([tar not found. Glom needs this to create backup files.])]) AC_CHECK_PROG([GLOM_GZIP], [gzip], [yes], [no]) AS_IF([test "$GLOM_GZIP" = no], [AC_MSG_ERROR([gzip not found. Glom needs this to create backup files.])]) AC_PATH_PROG([GLOM_MSGFMT], [msgfmt], [no]) AS_IF([test "$GLOM_MSGFMT" = no], [AC_MSG_ERROR([msgfmt not found. Glom needs this to test exported .po (gettext) files.])]) AC_DEFINE_UNQUOTED([GLOM_MSGFMT], ["$GLOM_MSGFMT"], [Define to the location of the msgfmt gettext utility.]) # Code testing coverage with gcov AC_MSG_CHECKING(whether to build with gcov testing) AC_ARG_ENABLE(gcov, AS_HELP_STRING([--enable-gcov], [Whether to enable gcov testing]),, enable_gcov=no) if test "x$enable_gcov" = "xyes"; then if test "$GCC" = "no"; then AC_MSG_ERROR(not compiling with gcc, which is required for gcov testing) fi AC_PATH_PROG(GCOV, [gcov], [no]) if test "x$GCOV" = "xno"; then AC_MSG_ERROR([gcov was enabled but gcov was not found.]) fi AC_SUBST(GCOV) AC_PATH_PROG(LCOV, [lcov], [no]) if test "x$LCOV" = "xno"; then AC_MSG_ERROR([gcov was enabled but lcov was not found.]) fi AC_SUBST(LCOV) AC_PATH_PROG(GENHTML, [genhtml], [no]) if test "x$GENHTML" = "xno"; then AC_MSG_ERROR([gcov was enabled but lcov's genhtml was not found.]) fi AC_SUBST(GENHTML) GCOV_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" GCOV_LIBS="-lgcov" AC_SUBST(GCOV_CFLAGS) AC_SUBST(GCOV_LIBS) fi AM_CONDITIONAL(GCOV_ENABLED, test x$enable_gcov = xyes) AC_MSG_RESULT($enable_gcov) AC_CONFIG_FILES([Makefile docs/user-guide/Makefile po/Makefile.in glom.desktop.in glom/libglom/glom-${GLOM_ABI_VERSION}.pc:glom/libglom/glom.pc.in docs/libglom_reference/Makefile docs/libglom_reference/Doxyfile docs/pyglom_reference/Makefile docs/pyglom_reference/conf.py docs/pyglom_reference/index.rst win32/glom.iss]) AC_CONFIG_FILES([tests/test_glom_date_in_locales.sh], [chmod u+x tests/test_glom_date_in_locales.sh]) AC_OUTPUT glom-1.22.4/configure0000755000175000017500000264466412234777113015730 0ustar00murraycmurrayc00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Glom 1.22.4. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 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=: # Pre-4.2 versions of Zsh do 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_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } 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.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do 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_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://bugzilla.gnome.org/enter_bug.cgi?product=Glom $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_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 || $as_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" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error 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 if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # 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" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # 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 } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac 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 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then 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 -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' 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='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # 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'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/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= # Identity of this package. PACKAGE_NAME='Glom' PACKAGE_TARNAME='glom' PACKAGE_VERSION='1.22.4' PACKAGE_STRING='Glom 1.22.4' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=Glom' PACKAGE_URL='' ac_unique_file="glom/main.cc" # 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" gt_needs= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS GCOV_ENABLED_FALSE GCOV_ENABLED_TRUE GCOV_LIBS GCOV_CFLAGS GENHTML LCOV GCOV GLOM_MSGFMT GLOM_GZIP GLOM_TAR SPHINX_BUILD DOCINSTALL_FLAGS DOXYGEN_TAGFILES ENABLE_DOCUMENTATION_FALSE ENABLE_DOCUMENTATION_TRUE XSLTPROC DOXYGEN DOT PERL HAVE_GNOME_DOC_UTILS_FALSE HAVE_GNOME_DOC_UTILS_TRUE DISTCHECK_CONFIGURE_FLAGS ENABLE_SK_FALSE ENABLE_SK_TRUE DOC_USER_FORMATS OMF_DIR HELP_DIR UPDATE_MIME_DATABASE_FALSE UPDATE_MIME_DATABASE_TRUE BOOST_PYTHON_LIBS PYTHON_LIBS PYTHON_CPPFLAGS pkgpyexecdir pyexecdir pkgpythondir pythondir PYTHON_PLATFORM PYTHON_EXEC_PREFIX PYTHON_PREFIX PYTHON_VERSION PYTHON GLOM_WXXFLAGS GLOM_WFLAGS MMDOCTOOLDIR DIST_DOCTOOLS_FALSE DIST_DOCTOOLS_TRUE LIBGLOM_MICRO_VERSION LIBGLOM_MINOR_VERSION LIBGLOM_MAJOR_VERSION LIBGLOM_API_VERSION LIBGLOM_VERSION LIBGLOM_MODULE_NAME ISO_CODES_PREFIX GLIB_GENMARSHAL GLOM_LIBS GLOM_CFLAGS LIBGLOM_LIBS LIBGLOM_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG GLOM_ENABLE_POSTGRESQL_FALSE GLOM_ENABLE_POSTGRESQL_TRUE GLOM_ENABLE_SQLITE_FALSE GLOM_ENABLE_SQLITE_TRUE GLOM_ENABLE_UI_TESTS_FALSE GLOM_ENABLE_UI_TESTS_TRUE GLOM_ENABLE_CLIENT_ONLY_FALSE GLOM_ENABLE_CLIENT_ONLY_TRUE GLOM_ENABLE_UI_FALSE GLOM_ENABLE_UI_TRUE HOST_WIN32_FALSE HOST_WIN32_TRUE WINDRES DL_LIB GETTEXT_PACKAGE POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS XGETTEXT_EXTRA_OPTIONS XGETTEXT_015 GMSGFMT_015 MSGFMT_015 GETTEXT_MACRO_VERSION DATADIRNAME ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE intltool__v_merge_options_0 intltool__v_merge_options_ INTLTOOL_V_MERGE_OPTIONS INTLTOOL__v_MERGE_0 INTLTOOL__v_MERGE_ INTLTOOL_V_MERGE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS GLOM_ABI_VERSION_UNDERLINED GLOM_ABI_VERSION CXXCPP CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL OBJDUMP DLLTOOL AS am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ACLOCAL_FLAGS MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking enable_static enable_shared with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_nls enable_rpath with_libiconv_prefix with_libintl_prefix enable_glom_ui enable_client_only enable_ui_tests enable_sqlite enable_postgresql enable_warnings with_boost_python enable_update_mime_database with_postgres_utils with_help_dir with_omf_dir with_help_formats enable_scrollkeeper enable_documentation with_libstdc_doc with_libsigc_doc with_glibmm_doc with_cairomm_doc with_pangomm_doc enable_gcov ' ac_precious_vars='build_alias host_alias target_alias ACLOCAL_FLAGS CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR LIBGLOM_CFLAGS LIBGLOM_LIBS GLOM_CFLAGS GLOM_LIBS PYTHON PYTHON_CPPFLAGS PYTHON_LIBS PERL DOT DOXYGEN XSLTPROC SPHINX_BUILD' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # 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_TARNAME}' 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= ;; *) 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_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=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_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=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 ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_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'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. 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 # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" 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 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 .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # 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 -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | 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 .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" 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 Glom 1.22.4 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/glom] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Glom 1.22.4:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-static[=PKGS] build static libraries [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --enable-glom-ui build the glom UI application instead of just libglom. The command-line utilities are always built. [default=yes] --enable-client-only build without developer mode and self-hosting --enable-ui-tests Run UI tests during make check. [default=yes] --enable-sqlite Allow creation of SQLite databases and opening of documents using SQLite databases. This disables some functionality and is intended only for embedded use. --disable-postgresql do not build with support for PostgreSQL databases --enable-warnings[=min|max|fatal|no] set compiler pedantry level [default=min] --disable-update-mime-database do not run the update-mime-database utility (mainly useful to package maintainers) --disable-scrollkeeper do not make updates to the scrollkeeper database --disable-documentation do not build or install the documentation --enable-gcov Whether to enable gcov testing Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-boost-python specify the boost python shared library to use. For instance, --with-boost-python=boost_python-py25. Defaults to boost-python. If you use this then you should probably set PYTHON too, to avoid using multiple python versions. --with-postgres-utils=DIR path to PostgreSQL utilities (overriding pg_config) --with-help-dir=DIR path to help docs --with-omf-dir=DIR path to OMF files --with-help-formats=FORMATS list of formats --with-libstdc-doc=[TAGFILE@]HTMLREFDIR Link to external libstdc documentation [auto] --with-libsigc-doc=[TAGFILE@]HTMLREFDIR Link to external libsigc documentation [auto] --with-glibmm-doc=[TAGFILE@]HTMLREFDIR Link to external glibmm documentation [auto] --with-cairomm-doc=[TAGFILE@]HTMLREFDIR Link to external cairomm documentation [auto] --with-pangomm-doc=[TAGFILE@]HTMLREFDIR Link to external pangomm documentation [auto] Some influential environment variables: ACLOCAL_FLAGS aclocal flags, e.g. -I 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 (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path LIBGLOM_CFLAGS C compiler flags for LIBGLOM, overriding pkg-config LIBGLOM_LIBS linker flags for LIBGLOM, overriding pkg-config GLOM_CFLAGS C compiler flags for GLOM, overriding pkg-config GLOM_LIBS linker flags for GLOM, overriding pkg-config PYTHON the Python interpreter PYTHON_CPPFLAGS compiler include flags for Python PYTHON_LIBS linker flags for Python PERL path to Perl interpreter DOT path to dot utility DOXYGEN path to Doxygen utility XSLTPROC path to xsltproc utility SPHINX_BUILD path to sphinx-build utility Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _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" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && 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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_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 $as_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 Glom configure 1.22.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 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 ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* 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 $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" 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 eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* 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 $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func 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 Glom $as_me 1.22.4, which was generated by GNU Autoconf 2.69. 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=. $as_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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append 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 as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset 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 $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" 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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; 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 $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_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'; as_fn_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 $as_echo "/* confdefs.h */" > 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 cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " # 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,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_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 # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_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. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## 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 config.h glom/libglom/libglom_config.h" am__api_version='1.13' 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 as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 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. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$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' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P 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. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='glom' VERSION='1.22.4' # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar plaintar pax cpio none' # The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 $as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; } if test $am_uid -le $am_max_uid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 $as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; } if test $am_gid -le $am_max_gid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 $as_echo_n "checking how to create a ustar tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_ustar-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_ustar}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_ustar+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_ustar=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 $as_echo "$am_cv_prog_tar_ustar" >&6; } # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 | *.dSYM | *.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 if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* 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" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg 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) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes 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_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&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 && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&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` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; 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 # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_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 do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_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_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then 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" as_fn_executable_p "$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 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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 if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then 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" as_fn_executable_p "$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 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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 if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_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 fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h 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=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=no fi enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } 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 else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: # Used for the install directories for headers. The same number is used in # the library name, which must be kept in sync, but variables can't be used # with that. GLOM_ABI_VERSION=1.22 cat >>confdefs.h <<_ACEOF #define GLOM_ABI_VERSION "$GLOM_ABI_VERSION" _ACEOF # Python modules can't be called glom-1.x, so we use underlines. GLOM_ABI_VERSION_UNDERLINED="`$as_echo "$GLOM_ABI_VERSION" | $as_tr_sh`" cat >>confdefs.h <<_ACEOF #define GLOM_ABI_VERSION_UNDERLINED "$GLOM_ABI_VERSION_UNDERLINED" _ACEOF # libgettext-po changed its API, changing the error handler struct # from po_error_handler to po_xerror_handler: { $as_echo "$as_me:${as_lineno-$LINENO}: checking for po_xerror_handler" >&5 $as_echo_n "checking for po_xerror_handler... " >&6; } if ${glom_cv_has_po_xerror_handler+:} false; then : $as_echo_n "(cached) " >&6 else ac_fn_c_check_member "$LINENO" "struct po_xerror_handler" "xerror" "ac_cv_member_struct_po_xerror_handler_xerror" "#include " if test "x$ac_cv_member_struct_po_xerror_handler_xerror" = xyes; then : glom_cv_has_po_xerror_handler=yes else glom_cv_has_po_xerror_handler=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glom_cv_has_po_xerror_handler" >&5 $as_echo "$glom_cv_has_po_xerror_handler" >&6; } if test "x$glom_cv_has_po_xerror_handler" = xyes; then : $as_echo "#define HAVE_GETTEXTPO_XERROR 1" >>confdefs.h fi # i18n { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } case "$am__api_version" in 1.01234) as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.35 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "0.35"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.35" >&5 $as_echo_n "checking for intltool >= 0.35... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error $? "Your intltool is too old. You need intltool 0.35 or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_MERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "x" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : DATADIRNAME=share else DATADIRNAME=lib fi ;; *) DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac GETTEXT_MACRO_VERSION=0.17 # Prepare PATH_SEPARATOR. # 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 # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # 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 # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # 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 # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # 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 ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBICONV_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBINTL_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" GETTEXT_PACKAGE=glom $as_echo "#define GETTEXT_PACKAGE PACKAGE_TARNAME" >>confdefs.h # Linking with libdl isn't needed on various non-Linux platforms, # eventhough they do provide dlopen(3). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : DL_LIB="-ldl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Windows specific options" >&5 $as_echo_n "checking whether to enable Windows specific options... " >&6; } case $host_os in #( mingw*) : glom_host_win32=yes ;; #( *) : glom_host_win32=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glom_host_win32" >&5 $as_echo "$glom_host_win32" >&6; } if test "x$glom_host_win32" = xyes; then : if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_WINDRES"; then ac_ct_WINDRES=$WINDRES # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_WINDRES"; then ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_WINDRES="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES if test -n "$ac_ct_WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 $as_echo "$ac_ct_WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_WINDRES" = x; then WINDRES="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac WINDRES=$ac_ct_WINDRES fi else WINDRES="$ac_cv_prog_WINDRES" fi fi if test "x$glom_host_win32" = xyes; then HOST_WIN32_TRUE= HOST_WIN32_FALSE='#' else HOST_WIN32_TRUE='#' HOST_WIN32_FALSE= fi # Check whether --enable-glom-ui was given. if test "${enable_glom_ui+set}" = set; then : enableval=$enable_glom_ui; glom_enable_ui=$enableval else glom_enable_ui=yes fi if test "x$glom_enable_ui" = xyes; then GLOM_ENABLE_UI_TRUE= GLOM_ENABLE_UI_FALSE='#' else GLOM_ENABLE_UI_TRUE='#' GLOM_ENABLE_UI_FALSE= fi # Check whether --enable-client-only was given. if test "${enable_client_only+set}" = set; then : enableval=$enable_client_only; glom_enable_client_only=$enableval else glom_enable_client_only=no fi if test "x$glom_enable_client_only" = xyes; then GLOM_ENABLE_CLIENT_ONLY_TRUE= GLOM_ENABLE_CLIENT_ONLY_FALSE='#' else GLOM_ENABLE_CLIENT_ONLY_TRUE='#' GLOM_ENABLE_CLIENT_ONLY_FALSE= fi if test "x$glom_enable_client_only" = xyes; then : $as_echo "#define GLOM_ENABLE_CLIENT_ONLY 1" >>confdefs.h ] fi # Check whether --enable-ui-tests was given. if test "${enable_ui_tests+set}" = set; then : enableval=$enable_ui_tests; glom_enable_ui_tests=$enableval else glom_enable_ui_tests=yes fi if test "x$glom_enable_ui_tests" = xyes; then GLOM_ENABLE_UI_TESTS_TRUE= GLOM_ENABLE_UI_TESTS_FALSE='#' else GLOM_ENABLE_UI_TESTS_TRUE='#' GLOM_ENABLE_UI_TESTS_FALSE= fi # Check whether --enable-sqlite was given. if test "${enable_sqlite+set}" = set; then : enableval=$enable_sqlite; glom_enable_sqlite=$enableval else glom_enable_sqlite=no fi if test "x$glom_enable_sqlite" = xyes; then GLOM_ENABLE_SQLITE_TRUE= GLOM_ENABLE_SQLITE_FALSE='#' else GLOM_ENABLE_SQLITE_TRUE='#' GLOM_ENABLE_SQLITE_FALSE= fi if test "x$glom_enable_sqlite" = xyes; then : $as_echo "#define GLOM_ENABLE_SQLITE 1" >>confdefs.h fi # Check whether --enable-postgresql was given. if test "${enable_postgresql+set}" = set; then : enableval=$enable_postgresql; glom_enable_postgresql=$enableval else glom_enable_postgresql=yes fi if test "x$glom_enable_postgresql" = xyes; then GLOM_ENABLE_POSTGRESQL_TRUE= GLOM_ENABLE_POSTGRESQL_FALSE='#' else GLOM_ENABLE_POSTGRESQL_TRUE='#' GLOM_ENABLE_POSTGRESQL_FALSE= fi if test "x$glom_enable_postgresql" = xyes; then : $as_echo "#define GLOM_ENABLE_POSTGRESQL 1" >>confdefs.h fi # Libraries used by libglom: REQUIRED_LIBGLOM_LIBS='giomm-2.4 >= 2.32.0 libxml++-2.6 >= 2.23.1 libxslt >= 1.1.10 pygobject-3.0 >= 2.29.0 libgdamm-5.0 >= 4.99.6 libgda-5.0 >= 5.0.3 libgda-postgres-5.0' if test "x$glom_host_win32" != xyes; then : REQUIRED_LIBGLOM_LIBS="$REQUIRED_LIBGLOM_LIBS libepc-1.0 >= 0.4.0" fi # Libraries used by Glom: REQUIRED_GLOM_LIBS="$REQUIRED_LIBGLOM_LIBS gtkmm-3.0 >= 3.4.0 goocanvasmm-2.0 >= 1.90.8 goocanvas-2.0 >= 2.0.1 evince-view-3.0" # Do not require iso-codes in client-only mode, or on Windows: # TODO: Package iso-codes for Windows? if test "x$glom_enable_client_only" != xyes && test "x$glom_host_win32" != xyes; then : REQUIRED_GLOM_LIBS="$REQUIRED_GLOM_LIBS iso-codes" fi # Do not require gtksourceviewmm in client only mode if test "x$glom_enable_client_only" != xyes; then : REQUIRED_GLOM_LIBS="$REQUIRED_GLOM_LIBS gtksourceviewmm-3.0 >= 3.0.0" fi if test "x$glom_enable_sqlite" = xyes; then : REQUIRED_GLOM_LIBS="$REQUIRED_GLOM_LIBS libgda-sqlite-5.0" fi #TODO: Remove this check, because we checked again later anyway, #because we add REQUIRED_LIBGLOM_LIBS to REQUIRED_GLOM_LIBS? if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGLOM" >&5 $as_echo_n "checking for LIBGLOM... " >&6; } if test -n "$LIBGLOM_CFLAGS"; then pkg_cv_LIBGLOM_CFLAGS="$LIBGLOM_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$REQUIRED_LIBGLOM_LIBS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$REQUIRED_LIBGLOM_LIBS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGLOM_CFLAGS=`$PKG_CONFIG --cflags "$REQUIRED_LIBGLOM_LIBS" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBGLOM_LIBS"; then pkg_cv_LIBGLOM_LIBS="$LIBGLOM_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$REQUIRED_LIBGLOM_LIBS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$REQUIRED_LIBGLOM_LIBS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGLOM_LIBS=`$PKG_CONFIG --libs "$REQUIRED_LIBGLOM_LIBS" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBGLOM_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$REQUIRED_LIBGLOM_LIBS" 2>&1` else LIBGLOM_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$REQUIRED_LIBGLOM_LIBS" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBGLOM_PKG_ERRORS" >&5 as_fn_error $? "Package requirements ($REQUIRED_LIBGLOM_LIBS) were not met: $LIBGLOM_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBGLOM_CFLAGS and LIBGLOM_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBGLOM_CFLAGS and LIBGLOM_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBGLOM_CFLAGS=$pkg_cv_LIBGLOM_CFLAGS LIBGLOM_LIBS=$pkg_cv_LIBGLOM_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi #Disable the checks for UI dependencies if not building the UI: if test "x$glom_enable_ui" = xno; then : REQUIRED_GLOM_LIBS="$REQUIRED_LIBGLOM_LIBS" fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLOM" >&5 $as_echo_n "checking for GLOM... " >&6; } if test -n "$GLOM_CFLAGS"; then pkg_cv_GLOM_CFLAGS="$GLOM_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$REQUIRED_GLOM_LIBS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$REQUIRED_GLOM_LIBS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLOM_CFLAGS=`$PKG_CONFIG --cflags "$REQUIRED_GLOM_LIBS" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLOM_LIBS"; then pkg_cv_GLOM_LIBS="$GLOM_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$REQUIRED_GLOM_LIBS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$REQUIRED_GLOM_LIBS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLOM_LIBS=`$PKG_CONFIG --libs "$REQUIRED_GLOM_LIBS" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLOM_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$REQUIRED_GLOM_LIBS" 2>&1` else GLOM_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$REQUIRED_GLOM_LIBS" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLOM_PKG_ERRORS" >&5 as_fn_error $? "Package requirements ($REQUIRED_GLOM_LIBS) were not met: $GLOM_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLOM_CFLAGS and GLOM_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GLOM_CFLAGS and GLOM_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GLOM_CFLAGS=$pkg_cv_GLOM_CFLAGS GLOM_LIBS=$pkg_cv_GLOM_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB_GENMARSHAL" >&5 $as_echo_n "checking for GLIB_GENMARSHAL... " >&6; } if test -z "${GLIB_GENMARSHAL+set}"; then : GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0 2>&5` if test "$?" -eq 0; then : fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_GENMARSHAL" >&5 $as_echo "$GLIB_GENMARSHAL" >&6; } # Get the location of the ISO-Codes (currencies, languages) files: { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO_CODES_PREFIX" >&5 $as_echo_n "checking for ISO_CODES_PREFIX... " >&6; } if test -z "${ISO_CODES_PREFIX+set}"; then : ISO_CODES_PREFIX=`$PKG_CONFIG --variable=prefix iso-codes 2>&5` if test "$?" -eq 0; then : fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ISO_CODES_PREFIX" >&5 $as_echo "$ISO_CODES_PREFIX" >&6; } cat >>confdefs.h <<_ACEOF #define ISO_CODES_PREFIX "$ISO_CODES_PREFIX" _ACEOF # Allow use of mm-common macros for the warnings option and for installing developer documentation. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports GNU make features" >&5 $as_echo_n "checking whether ${MAKE-make} supports GNU make features... " >&6; } cat >conftest.make <<'_MMEOF' override reverse = $(2)$(subst ,, )$(1) override result := $(word 2,$(call reverse,success,failure)) all: ; test '$(result)' = success .PHONY: all _MMEOF if ${MAKE-make} -f conftest.make >&5 2>&5; then : mm_gnu_make=yes else mm_gnu_make=no fi rm -f conftest.make { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mm_gnu_make" >&5 $as_echo "$mm_gnu_make" >&6; } if test "x$mm_gnu_make" != xyes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The GNU make program is required to build $PACKAGE_NAME. See \`config.log' for more details" "$LINENO" 5; } fi LIBGLOM_MODULE_NAME='libglom-1.22' LIBGLOM_VERSION='1.22.4' LIBGLOM_API_VERSION='1.22' LIBGLOM_MAJOR_VERSION=1 $as_echo "#define LIBGLOM_MAJOR_VERSION 1" >>confdefs.h LIBGLOM_MINOR_VERSION=22 $as_echo "#define LIBGLOM_MINOR_VERSION 22" >>confdefs.h LIBGLOM_MICRO_VERSION=4 $as_echo "#define LIBGLOM_MICRO_VERSION 4" >>confdefs.h # Copy the mm-common .pl scripts into docs/, # and use them from there, # so we can dist them to avoid a tarball-build dependency. MMDOCTOOLDIR='${top_srcdir}/docs/libglom_reference' if test 'xdocs/libglom_reference' != 'x'; then DIST_DOCTOOLS_TRUE= DIST_DOCTOOLS_FALSE='#' else DIST_DOCTOOLS_TRUE='#' DIST_DOCTOOLS_FALSE= fi # Evaluate the --enable-warnings=level option. 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 # Check whether --enable-warnings was given. if test "${enable_warnings+set}" = set; then : enableval=$enable_warnings; mm_enable_warnings=$enableval else mm_enable_warnings=min fi case $ac_compile in #( *'$CXXFLAGS '*) : mm_lang='C++' mm_cc=$CXX mm_conftest="conftest.${ac_ext-cc}" ;; #( *'$CFLAGS '*) : mm_lang=C mm_cc=$CC mm_conftest="conftest.${ac_ext-c}" ;; #( *) : as_fn_error $? "current language is neither C nor C++" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking which $mm_lang compiler warning flags to use" >&5 $as_echo_n "checking which $mm_lang compiler warning flags to use... " >&6; } mm_deprecation_flags= mm_tested_flags= case $mm_enable_warnings in #( no) : mm_warning_flags= ;; #( max) : mm_warning_flags="-Wall -Wextra -Wno-missing-field-initializers -DGSEAL_ENABLE" ;; #( fatal) : mm_warning_flags="-Wall -Wextra -Wno-missing-field-initializers -DGSEAL_ENABLE -Werror" for mm_prefix in G GDK GDK_PIXBUF CAIRO PANGO GTK do mm_deprecation_flags="$mm_deprecation_flags-D${mm_prefix}_DISABLE_DEPRECATED " done ;; #( *) : mm_warning_flags="-Wall" ;; esac if test "x$mm_warning_flags" != x; then : # Keep in mind that the dummy source must be devoid of any # problems that might cause diagnostics. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(int argc, char** argv) { return (argv != 0) ? argc : 0; } _ACEOF for mm_flag in $mm_warning_flags do # Test whether the compiler accepts the flag. Look at standard output, # since GCC only shows a warning message if an option is not supported. mm_cc_out=`$mm_cc $mm_tested_flags $mm_flag -c "$mm_conftest" 2>&1 || echo failed` rm -f "conftest.${OBJEXT-o}" if test "x$mm_cc_out" = x; then : if test "x$mm_tested_flags" = x; then : mm_tested_flags=$mm_flag else mm_tested_flags="$mm_tested_flags $mm_flag" fi else cat <<_MMEOF >&5 $mm_cc: $mm_cc_out _MMEOF fi done rm -f "$mm_conftest" fi mm_all_flags=$mm_deprecation_flags$mm_tested_flags GLOM_WFLAGS=$mm_all_flags test "x$mm_all_flags" != x || mm_all_flags=none { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mm_all_flags" >&5 $as_echo "$mm_all_flags" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu case $ac_compile in #( *'$CXXFLAGS '*) : mm_lang='C++' mm_cc=$CXX mm_conftest="conftest.${ac_ext-cc}" ;; #( *'$CFLAGS '*) : mm_lang=C mm_cc=$CC mm_conftest="conftest.${ac_ext-c}" ;; #( *) : as_fn_error $? "current language is neither C nor C++" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking which $mm_lang compiler warning flags to use" >&5 $as_echo_n "checking which $mm_lang compiler warning flags to use... " >&6; } mm_deprecation_flags= mm_tested_flags= case $mm_enable_warnings in #( no) : mm_warning_flags= ;; #( max) : mm_warning_flags="-Wall -Wextra -Wno-missing-field-initializers -DGSEAL_ENABLE" ;; #( fatal) : mm_warning_flags="-Wall -Wextra -Wno-missing-field-initializers -DGSEAL_ENABLE -Werror" for mm_prefix in G GDK GDK_PIXBUF GTK GLIBMM GDKMM CAIROMM PANGOMM GTKMM do mm_deprecation_flags="$mm_deprecation_flags-D${mm_prefix}_DISABLE_DEPRECATED " done ;; #( *) : mm_warning_flags="-Wall" ;; esac if test "x$mm_warning_flags" != x; then : # Keep in mind that the dummy source must be devoid of any # problems that might cause diagnostics. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(int argc, char** argv) { return (argv != 0) ? argc : 0; } _ACEOF for mm_flag in $mm_warning_flags do # Test whether the compiler accepts the flag. Look at standard output, # since GCC only shows a warning message if an option is not supported. mm_cc_out=`$mm_cc $mm_tested_flags $mm_flag -c "$mm_conftest" 2>&1 || echo failed` rm -f "conftest.${OBJEXT-o}" if test "x$mm_cc_out" = x; then : if test "x$mm_tested_flags" = x; then : mm_tested_flags=$mm_flag else mm_tested_flags="$mm_tested_flags $mm_flag" fi else cat <<_MMEOF >&5 $mm_cc: $mm_cc_out _MMEOF fi done rm -f "$mm_conftest" fi mm_all_flags=$mm_deprecation_flags$mm_tested_flags GLOM_WXXFLAGS=$mm_all_flags test "x$mm_all_flags" != x || mm_all_flags=none { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mm_all_flags" >&5 $as_echo "$mm_all_flags" >&6; } for ac_func in strptime do : ac_fn_cxx_check_func "$LINENO" "strptime" "ac_cv_func_strptime" if test "x$ac_cv_func_strptime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRPTIME 1 _ACEOF fi done # Get the compiler and linker flags for embedding Python. # To specify a particular python version set an environment variable. # For instance: PYTHON=python2.5 # Find any Python interpreter. if test -z "$PYTHON"; then for ac_prog in python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON" && break done test -n "$PYTHON" || PYTHON=":" fi am_display_PYTHON=python if test "$PYTHON" = :; then as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 $as_echo_n "checking for $am_display_PYTHON version... " >&6; } if ${am_cv_python_version+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 $as_echo "$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version PYTHON_PREFIX='${prefix}' PYTHON_EXEC_PREFIX='${exec_prefix}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 $as_echo_n "checking for $am_display_PYTHON platform... " >&6; } if ${am_cv_python_platform+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 $as_echo "$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform # Just factor out some code duplication. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[:3] == '2.7': can_use_sysconfig = 0 except ImportError: pass" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 $as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } if ${am_cv_python_pythondir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 $as_echo "$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 $as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } if ${am_cv_python_pyexecdir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 $as_echo "$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python headers" >&5 $as_echo_n "checking for Python headers... " >&6; } if test "x$PYTHON_CPPFLAGS" = x; then : mm_val=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_inc() or '')" 2>&5` if test "$?" -eq 0 && test "x$mm_val" != x; then : PYTHON_CPPFLAGS="-I$mm_val" fi mm_val=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_inc(True) or '')" 2>&5` if test "$?" -eq 0 && test "x$mm_val" != x; then : test "x$PYTHON_CPPFLAGS" = "x-I$mm_val" || PYTHON_CPPFLAGS="$PYTHON_CPPFLAGS -I$mm_val" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CPPFLAGS" >&5 $as_echo "$PYTHON_CPPFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python libraries" >&5 $as_echo_n "checking for Python libraries... " >&6; } if test "x$PYTHON_LIBS" = x; then : mm_val=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_config_var('LIBS') or '')" 2>&5` if test "$?" -eq 0 && test "x$mm_val" != x; then : PYTHON_LIBS=$mm_val fi set X mm_val=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.EXEC_PREFIX or '')" 2>&5` if test "$?" -eq 0 && test "x$mm_val" != x; then : set "$@" "$mm_val/lib" "$mm_val/libs" "$mm_val/lib64" "$mm_val/lib/i386-linux-gnu" fi mm_val=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.PREFIX or '')" 2>&5` if test "$?" -eq 0 && test "x$mm_val" != x; then : set "$@" "$mm_val/lib" "$mm_val/libs" "$mm_val/lib64" "$mm_val/lib/i386-linux-gnu" fi mm_val=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(True, True) or '')" 2>&5` if test "$?" -eq 0 && test "x$mm_val" != x; then : set "$@" "$mm_val/config" "$mm_val" fi mm_val=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(False, True) or '')" 2>&5` if test "$?" -eq 0 && test "x$mm_val" != x; then : set "$@" "$mm_val/config" "$mm_val" fi shift mm_pylib=python$PYTHON_VERSION mm_pylib_win=`echo "$mm_pylib" | sed 's/\.//g'` for mm_dir do if test -f "$mm_dir/lib$mm_pylib.so" || \ test -f "$mm_dir/lib$mm_pylib.a"; then : case $mm_dir in #( /usr/lib|/usr/lib64) : PYTHON_LIBS="$PYTHON_LIBS -l$mm_pylib"; break ;; #( *) : PYTHON_LIBS="$PYTHON_LIBS -L$mm_dir -l$mm_pylib"; break ;; esac elif test -f "$mm_dir/lib$mm_pylib_win.dll.a" || \ test -f "$mm_dir/lib$mm_pylib_win.a" || \ test -f "$mm_dir/$mm_pylib_win.lib"; then : PYTHON_LIBS="$PYTHON_LIBS -L$mm_dir -l$mm_pylib_win"; break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_LIBS" >&5 $as_echo "$PYTHON_LIBS" >&6; } mm_save_CPPFLAGS=$CPPFLAGS mm_save_LIBS=$LIBS CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS" LIBS="$LIBS $PYTHON_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { (void) PyImport_ImportModule((char*)"sys"); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Failed to compile test program for Python embedding. See \`config.log' for more details" "$LINENO" 5; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS=$mm_save_CPPFLAGS LIBS=$mm_save_LIBS #Not used, because boost::python has it as a dependency: AC_SUBST(PYTHON_LIBS) # Get the CFLAGS and LIBS for boost::python. # Note that we have hacked this script to work with MM_CHECK_MODULE_PYTHON instead of AX_PYTHON # This does an AC_SUBST() of BOOST_PYTHON_LIBS # For the CFLAGS we must assume that boost is at the top-level, for instance in /usr/include/: ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu saved_CPPFLAGS=$CPPFLAGS saved_LIBS=$LIBS # Note that this requires PYTHON_CPPFLAGS from MM_CHECK_MODULE_PYTHON() # Note that this expects boost/ to be at some top-level such as /usr/include/ # We couldn't check for anything else anyway because there's no pkg-config file to tell us where it is CPPFLAGS="$PYTHON_CPPFLAGS $saved_CPPFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Boost::Python headers are available" >&5 $as_echo_n "checking whether the Boost::Python headers are available... " >&6; } if ${ac_cv_boost_python+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include using namespace boost::python; BOOST_PYTHON_MODULE(test) { (void)0; } int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_boost_python=yes else ac_cv_boost_python=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_boost_python" >&5 $as_echo "$ac_cv_boost_python" >&6; } if test "x$ac_cv_boost_python" = xyes; then : BOOST_PYTHON_LIBS= ax_python_lib=boost_python # Check whether --with-boost-python was given. if test "${with_boost_python+set}" = set; then : withval=$with_boost_python; if test "x$with_boost_python" != xno; then ax_python_lib=$with_boost_python ax_boost_python_lib=boost_python-$with_boost_python fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boost::python shared library" >&5 $as_echo_n "checking for boost::python shared library... " >&6; } for ax_lib in "$ax_python_lib" "$ax_boost_python_lib" boost_python do # Note that this requires PYTHON_LIBS from MM_CHECK_MODULE_PYTHON() LIBS="$saved_LIBS $PYTHON_LIBS -l$ax_lib" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { boost::python::object test_object; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : BOOST_PYTHON_LIBS="-l$ax_lib"; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done if test "x$BOOST_PYTHON_LIBS" != x; then : ax_result=$BOOST_PYTHON_LIBS else ax_result= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_result" >&5 $as_echo "$ax_result" >&6; } fi CPPFLAGS=$saved_CPPFLAGS LIBS=$saved_LIBS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "x$ac_cv_boost_python" = xyes && test "x$BOOST_PYTHON_LIBS" != x; then : $as_echo "#define HAVE_BOOST_PYTHON 1" >>confdefs.h else as_fn_error $? "boost::python is required to build $PACKAGE_NAME" "$LINENO" 5 fi # Check whether --enable-update-mime-database was given. if test "${enable_update_mime_database+set}" = set; then : enableval=$enable_update_mime_database; glom_update_mime_database=$enableval else glom_update_mime_database=yes fi if test "x$glom_update_mime_database" != xno; then UPDATE_MIME_DATABASE_TRUE= UPDATE_MIME_DATABASE_FALSE='#' else UPDATE_MIME_DATABASE_TRUE='#' UPDATE_MIME_DATABASE_FALSE= fi # Locate the directory containing the postgresql utilities, such as the # postmaster executable, so we can self-host postgresql databases. # Check whether --with-postgres-utils was given. if test "${with_postgres_utils+set}" = set; then : withval=$with_postgres_utils; POSTGRES_UTILS_PATH=$withval fi # Path not needed on Windows if test "x$glom_host_win32" != xyes && test "x$glom_enable_client_only" != xyes; then : case $POSTGRES_UTILS_PATH in #( ""|no|yes) : POSTGRES_UTILS_PATH=`pg_config --bindir 2>&5` if "$POSTGRES_UTILS_PATH/pg_ctl" --version >/dev/null 2>&5; then : else as_fn_error $? " The Postgres utilities could not be found. They are needed for self-hosting of Glom databases. Please make sure that Postgres is installed, and if necessary specify the correct directory explicitly with the --with-postgres-utils option. " "$LINENO" 5 fi ;; #( *) : ;; esac fi cat >>confdefs.h <<_ACEOF #define POSTGRES_UTILS_PATH "$POSTGRES_UTILS_PATH" _ACEOF cat >>confdefs.h <<_ACEOF #define EXEEXT "$EXEEXT" _ACEOF if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi gdu_cv_version_required=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking gnome-doc-utils >= $gdu_cv_version_required" >&5 $as_echo_n "checking gnome-doc-utils >= $gdu_cv_version_required... " >&6; } if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-doc-utils >= \$gdu_cv_version_required\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-doc-utils >= $gdu_cv_version_required") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then gdu_cv_have_gdu=yes else gdu_cv_have_gdu=no fi if test "$gdu_cv_have_gdu" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gnome-doc-utils not found: documentation will not be built." >&5 $as_echo "$as_me: WARNING: gnome-doc-utils not found: documentation will not be built." >&2;} fi # Check whether --with-help-dir was given. if test "${with_help_dir+set}" = set; then : withval=$with_help_dir; else with_help_dir='${datadir}/gnome/help' fi HELP_DIR="$with_help_dir" # Check whether --with-omf-dir was given. if test "${with_omf_dir+set}" = set; then : withval=$with_omf_dir; else with_omf_dir='${datadir}/omf' fi OMF_DIR="$with_omf_dir" # Check whether --with-help-formats was given. if test "${with_help_formats+set}" = set; then : withval=$with_help_formats; else with_help_formats='' fi DOC_USER_FORMATS="$with_help_formats" # Check whether --enable-scrollkeeper was given. if test "${enable_scrollkeeper+set}" = set; then : enableval=$enable_scrollkeeper; else enable_scrollkeeper=yes fi if test "$gdu_cv_have_gdu" = "yes" -a "$enable_scrollkeeper" = "yes"; then ENABLE_SK_TRUE= ENABLE_SK_FALSE='#' else ENABLE_SK_TRUE='#' ENABLE_SK_FALSE= fi DISTCHECK_CONFIGURE_FLAGS="--disable-scrollkeeper $DISTCHECK_CONFIGURE_FLAGS" if test "$gdu_cv_have_gdu" = "yes"; then HAVE_GNOME_DOC_UTILS_TRUE= HAVE_GNOME_DOC_UTILS_FALSE='#' else HAVE_GNOME_DOC_UTILS_TRUE='#' HAVE_GNOME_DOC_UTILS_FALSE= fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="perl" ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "dot", so it can be a program name with args. set dummy dot; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DOT+:} false; then : $as_echo_n "(cached) " >&6 else case $DOT in [\\/]* | ?:[\\/]*) ac_cv_path_DOT="$DOT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DOT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_DOT" && ac_cv_path_DOT="dot" ;; esac fi DOT=$ac_cv_path_DOT if test -n "$DOT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOT" >&5 $as_echo "$DOT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DOXYGEN+:} false; then : $as_echo_n "(cached) " >&6 else case $DOXYGEN in [\\/]* | ?:[\\/]*) ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_DOXYGEN" && ac_cv_path_DOXYGEN="doxygen" ;; esac fi DOXYGEN=$ac_cv_path_DOXYGEN if test -n "$DOXYGEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5 $as_echo "$DOXYGEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xsltproc", so it can be a program name with args. set dummy xsltproc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XSLTPROC+:} false; then : $as_echo_n "(cached) " >&6 else case $XSLTPROC in [\\/]* | ?:[\\/]*) ac_cv_path_XSLTPROC="$XSLTPROC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XSLTPROC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XSLTPROC" && ac_cv_path_XSLTPROC="xsltproc" ;; esac fi XSLTPROC=$ac_cv_path_XSLTPROC if test -n "$XSLTPROC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5 $as_echo "$XSLTPROC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-documentation was given. if test "${enable_documentation+set}" = set; then : enableval=$enable_documentation; ENABLE_DOCUMENTATION=$enableval else ENABLE_DOCUMENTATION=auto fi if test "x$ENABLE_DOCUMENTATION" != xno; then : mm_err= if test "x$MMDOCTOOLDIR" = x; then : mm_err='The mm-common-util module is available, but the installation of mm-common on this machine is missing the shared documentation utilities of the GNOME C++ bindings. It may be necessary to upgrade to a more recent release of mm-common in order to build '$PACKAGE_NAME' and install the documentation.' elif test "x$PERL" = xperl; then : mm_err='Perl is required for installing the documentation.' elif test "x$USE_MAINTAINER_MODE" != xno; then : test "x$DOT" != xdot || mm_err=' dot' test "x$DOXYGEN" != xdoxygen || mm_err="$mm_err doxygen" test "x$XSLTPROC" != xxsltproc || mm_err="$mm_err xsltproc" test -z "$mm_err" || mm_err='The documentation cannot be generated because not all of the required tools are available:'$mm_err fi if test -z "$mm_err"; then : ENABLE_DOCUMENTATION=yes elif test "x$ENABLE_DOCUMENTATION" = xyes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "$mm_err See \`config.log' for more details" "$LINENO" 5; } else ENABLE_DOCUMENTATION=no; { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $mm_err" >&5 $as_echo "$as_me: WARNING: $mm_err" >&2;} fi fi if test "x$ENABLE_DOCUMENTATION" = xyes; then ENABLE_DOCUMENTATION_TRUE= ENABLE_DOCUMENTATION_FALSE='#' else ENABLE_DOCUMENTATION_TRUE='#' ENABLE_DOCUMENTATION_FALSE= fi DOXYGEN_TAGFILES= DOCINSTALL_FLAGS= if test "x$ENABLE_DOCUMENTATION" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libstdc documentation" >&5 $as_echo_n "checking for libstdc documentation... " >&6; } # Check whether --with-libstdc-doc was given. if test "${with_libstdc_doc+set}" = set; then : withval=$with_libstdc_doc; mm_htmlrefdir=`expr "X@$withval" : '.*@\(.*\)' 2>&5` mm_tagname=`expr "X/$withval" : '[^@]*[\\/]\([^\\/@]*\)@' 2>&5` mm_tagpath=`expr "X$withval" : 'X\([^@]*\)@' 2>&5` test "x$mm_tagname" != x || mm_tagname="libstdc++.tag" test "x$mm_tagpath" != x || mm_tagpath=$mm_tagname else mm_htmlrefdir= mm_tagname="libstdc++.tag" mm_tagpath=$mm_tagname fi # Prepend working direcory if the tag file path starts with ./ or ../ case $mm_tagpath in #( .[\\/]*|..[\\/]*) : mm_tagpath=`pwd`/$mm_tagpath ;; #( *) : ;; esac # If no local directory was specified, get the default from the .pc file if test "x$mm_htmlrefdir" = x; then : mm_htmlrefdir=`$PKG_CONFIG --variable=htmlrefdir "mm-common-libstdc++" 2>&5` fi # If the user specified a Web URL, allow it to override the public location case $mm_htmlrefdir in #( http://*|https://*) : mm_htmlrefpub=$mm_htmlrefdir ;; #( *) : mm_htmlrefpub=`$PKG_CONFIG --variable=htmlrefpub "mm-common-libstdc++" 2>&5` test "x$mm_htmlrefpub" != x || mm_htmlrefpub=$mm_htmlrefdir test "x$mm_htmlrefdir" != x || mm_htmlrefdir=$mm_htmlrefpub ;; esac # The user-supplied tag-file name takes precedence if it includes the path case $mm_tagpath in #( *[\\/]*) : ;; #( *) : mm_doxytagfile=`$PKG_CONFIG --variable=doxytagfile "mm-common-libstdc++" 2>&5` test "x$mm_doxytagfile" = x || mm_tagpath=$mm_doxytagfile ;; esac # Remove trailing slashes and translate to URI mm_htmlrefpub=`expr "X$mm_htmlrefpub" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` mm_htmlrefdir=`expr "X$mm_htmlrefdir" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mm_tagpath@$mm_htmlrefdir" >&5 $as_echo "$mm_tagpath@$mm_htmlrefdir" >&6; } if test "x$USE_MAINTAINER_MODE" != xno && test ! -f "$mm_tagpath"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Doxygen tag file libstdc++.tag not found" >&5 $as_echo "$as_me: WARNING: Doxygen tag file libstdc++.tag not found" >&2;} fi if test "x$mm_htmlrefdir" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Location of external libstdc documentation not set" >&5 $as_echo "$as_me: WARNING: Location of external libstdc documentation not set" >&2;} else if test "x$DOCINSTALL_FLAGS" = x; then : DOCINSTALL_FLAGS="-l '$mm_tagname@$mm_htmlrefdir/'" else DOCINSTALL_FLAGS="$DOCINSTALL_FLAGS -l '$mm_tagname@$mm_htmlrefdir/'" fi fi if test "x$mm_htmlrefpub" = x; then : mm_val=$mm_tagpath else mm_val="$mm_tagpath=$mm_htmlrefpub" fi if test "x$DOXYGEN_TAGFILES" = x; then : DOXYGEN_TAGFILES=\"$mm_val\" else DOXYGEN_TAGFILES="$DOXYGEN_TAGFILES "\"$mm_val\" fi fi if test "x$ENABLE_DOCUMENTATION" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsigc documentation" >&5 $as_echo_n "checking for libsigc documentation... " >&6; } # Check whether --with-libsigc-doc was given. if test "${with_libsigc_doc+set}" = set; then : withval=$with_libsigc_doc; mm_htmlrefdir=`expr "X@$withval" : '.*@\(.*\)' 2>&5` mm_tagname=`expr "X/$withval" : '[^@]*[\\/]\([^\\/@]*\)@' 2>&5` mm_tagpath=`expr "X$withval" : 'X\([^@]*\)@' 2>&5` test "x$mm_tagname" != x || mm_tagname="libsigc++-2.0.tag" test "x$mm_tagpath" != x || mm_tagpath=$mm_tagname else mm_htmlrefdir= mm_tagname="libsigc++-2.0.tag" mm_tagpath=$mm_tagname fi # Prepend working direcory if the tag file path starts with ./ or ../ case $mm_tagpath in #( .[\\/]*|..[\\/]*) : mm_tagpath=`pwd`/$mm_tagpath ;; #( *) : ;; esac # If no local directory was specified, get the default from the .pc file if test "x$mm_htmlrefdir" = x; then : mm_htmlrefdir=`$PKG_CONFIG --variable=htmlrefdir "sigc++-2.0" 2>&5` fi # If the user specified a Web URL, allow it to override the public location case $mm_htmlrefdir in #( http://*|https://*) : mm_htmlrefpub=$mm_htmlrefdir ;; #( *) : mm_htmlrefpub=`$PKG_CONFIG --variable=htmlrefpub "sigc++-2.0" 2>&5` test "x$mm_htmlrefpub" != x || mm_htmlrefpub=$mm_htmlrefdir test "x$mm_htmlrefdir" != x || mm_htmlrefdir=$mm_htmlrefpub ;; esac # The user-supplied tag-file name takes precedence if it includes the path case $mm_tagpath in #( *[\\/]*) : ;; #( *) : mm_doxytagfile=`$PKG_CONFIG --variable=doxytagfile "sigc++-2.0" 2>&5` test "x$mm_doxytagfile" = x || mm_tagpath=$mm_doxytagfile ;; esac # Remove trailing slashes and translate to URI mm_htmlrefpub=`expr "X$mm_htmlrefpub" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` mm_htmlrefdir=`expr "X$mm_htmlrefdir" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mm_tagpath@$mm_htmlrefdir" >&5 $as_echo "$mm_tagpath@$mm_htmlrefdir" >&6; } if test "x$USE_MAINTAINER_MODE" != xno && test ! -f "$mm_tagpath"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Doxygen tag file libsigc++-2.0.tag not found" >&5 $as_echo "$as_me: WARNING: Doxygen tag file libsigc++-2.0.tag not found" >&2;} fi if test "x$mm_htmlrefdir" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Location of external libsigc documentation not set" >&5 $as_echo "$as_me: WARNING: Location of external libsigc documentation not set" >&2;} else if test "x$DOCINSTALL_FLAGS" = x; then : DOCINSTALL_FLAGS="-l '$mm_tagname@$mm_htmlrefdir/'" else DOCINSTALL_FLAGS="$DOCINSTALL_FLAGS -l '$mm_tagname@$mm_htmlrefdir/'" fi fi if test "x$mm_htmlrefpub" = x; then : mm_val=$mm_tagpath else mm_val="$mm_tagpath=$mm_htmlrefpub" fi if test "x$DOXYGEN_TAGFILES" = x; then : DOXYGEN_TAGFILES=\"$mm_val\" else DOXYGEN_TAGFILES="$DOXYGEN_TAGFILES "\"$mm_val\" fi fi if test "x$ENABLE_DOCUMENTATION" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glibmm documentation" >&5 $as_echo_n "checking for glibmm documentation... " >&6; } # Check whether --with-glibmm-doc was given. if test "${with_glibmm_doc+set}" = set; then : withval=$with_glibmm_doc; mm_htmlrefdir=`expr "X@$withval" : '.*@\(.*\)' 2>&5` mm_tagname=`expr "X/$withval" : '[^@]*[\\/]\([^\\/@]*\)@' 2>&5` mm_tagpath=`expr "X$withval" : 'X\([^@]*\)@' 2>&5` test "x$mm_tagname" != x || mm_tagname="glibmm-2.4.tag" test "x$mm_tagpath" != x || mm_tagpath=$mm_tagname else mm_htmlrefdir= mm_tagname="glibmm-2.4.tag" mm_tagpath=$mm_tagname fi # Prepend working direcory if the tag file path starts with ./ or ../ case $mm_tagpath in #( .[\\/]*|..[\\/]*) : mm_tagpath=`pwd`/$mm_tagpath ;; #( *) : ;; esac # If no local directory was specified, get the default from the .pc file if test "x$mm_htmlrefdir" = x; then : mm_htmlrefdir=`$PKG_CONFIG --variable=htmlrefdir "glibmm-2.4" 2>&5` fi # If the user specified a Web URL, allow it to override the public location case $mm_htmlrefdir in #( http://*|https://*) : mm_htmlrefpub=$mm_htmlrefdir ;; #( *) : mm_htmlrefpub=`$PKG_CONFIG --variable=htmlrefpub "glibmm-2.4" 2>&5` test "x$mm_htmlrefpub" != x || mm_htmlrefpub=$mm_htmlrefdir test "x$mm_htmlrefdir" != x || mm_htmlrefdir=$mm_htmlrefpub ;; esac # The user-supplied tag-file name takes precedence if it includes the path case $mm_tagpath in #( *[\\/]*) : ;; #( *) : mm_doxytagfile=`$PKG_CONFIG --variable=doxytagfile "glibmm-2.4" 2>&5` test "x$mm_doxytagfile" = x || mm_tagpath=$mm_doxytagfile ;; esac # Remove trailing slashes and translate to URI mm_htmlrefpub=`expr "X$mm_htmlrefpub" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` mm_htmlrefdir=`expr "X$mm_htmlrefdir" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mm_tagpath@$mm_htmlrefdir" >&5 $as_echo "$mm_tagpath@$mm_htmlrefdir" >&6; } if test "x$USE_MAINTAINER_MODE" != xno && test ! -f "$mm_tagpath"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Doxygen tag file glibmm-2.4.tag not found" >&5 $as_echo "$as_me: WARNING: Doxygen tag file glibmm-2.4.tag not found" >&2;} fi if test "x$mm_htmlrefdir" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Location of external glibmm documentation not set" >&5 $as_echo "$as_me: WARNING: Location of external glibmm documentation not set" >&2;} else if test "x$DOCINSTALL_FLAGS" = x; then : DOCINSTALL_FLAGS="-l '$mm_tagname@$mm_htmlrefdir/'" else DOCINSTALL_FLAGS="$DOCINSTALL_FLAGS -l '$mm_tagname@$mm_htmlrefdir/'" fi fi if test "x$mm_htmlrefpub" = x; then : mm_val=$mm_tagpath else mm_val="$mm_tagpath=$mm_htmlrefpub" fi if test "x$DOXYGEN_TAGFILES" = x; then : DOXYGEN_TAGFILES=\"$mm_val\" else DOXYGEN_TAGFILES="$DOXYGEN_TAGFILES "\"$mm_val\" fi fi if test "x$ENABLE_DOCUMENTATION" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairomm documentation" >&5 $as_echo_n "checking for cairomm documentation... " >&6; } # Check whether --with-cairomm-doc was given. if test "${with_cairomm_doc+set}" = set; then : withval=$with_cairomm_doc; mm_htmlrefdir=`expr "X@$withval" : '.*@\(.*\)' 2>&5` mm_tagname=`expr "X/$withval" : '[^@]*[\\/]\([^\\/@]*\)@' 2>&5` mm_tagpath=`expr "X$withval" : 'X\([^@]*\)@' 2>&5` test "x$mm_tagname" != x || mm_tagname="cairomm-1.0.tag" test "x$mm_tagpath" != x || mm_tagpath=$mm_tagname else mm_htmlrefdir= mm_tagname="cairomm-1.0.tag" mm_tagpath=$mm_tagname fi # Prepend working direcory if the tag file path starts with ./ or ../ case $mm_tagpath in #( .[\\/]*|..[\\/]*) : mm_tagpath=`pwd`/$mm_tagpath ;; #( *) : ;; esac # If no local directory was specified, get the default from the .pc file if test "x$mm_htmlrefdir" = x; then : mm_htmlrefdir=`$PKG_CONFIG --variable=htmlrefdir "cairomm-1.0" 2>&5` fi # If the user specified a Web URL, allow it to override the public location case $mm_htmlrefdir in #( http://*|https://*) : mm_htmlrefpub=$mm_htmlrefdir ;; #( *) : mm_htmlrefpub=`$PKG_CONFIG --variable=htmlrefpub "cairomm-1.0" 2>&5` test "x$mm_htmlrefpub" != x || mm_htmlrefpub=$mm_htmlrefdir test "x$mm_htmlrefdir" != x || mm_htmlrefdir=$mm_htmlrefpub ;; esac # The user-supplied tag-file name takes precedence if it includes the path case $mm_tagpath in #( *[\\/]*) : ;; #( *) : mm_doxytagfile=`$PKG_CONFIG --variable=doxytagfile "cairomm-1.0" 2>&5` test "x$mm_doxytagfile" = x || mm_tagpath=$mm_doxytagfile ;; esac # Remove trailing slashes and translate to URI mm_htmlrefpub=`expr "X$mm_htmlrefpub" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` mm_htmlrefdir=`expr "X$mm_htmlrefdir" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mm_tagpath@$mm_htmlrefdir" >&5 $as_echo "$mm_tagpath@$mm_htmlrefdir" >&6; } if test "x$USE_MAINTAINER_MODE" != xno && test ! -f "$mm_tagpath"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Doxygen tag file cairomm-1.0.tag not found" >&5 $as_echo "$as_me: WARNING: Doxygen tag file cairomm-1.0.tag not found" >&2;} fi if test "x$mm_htmlrefdir" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Location of external cairomm documentation not set" >&5 $as_echo "$as_me: WARNING: Location of external cairomm documentation not set" >&2;} else if test "x$DOCINSTALL_FLAGS" = x; then : DOCINSTALL_FLAGS="-l '$mm_tagname@$mm_htmlrefdir/'" else DOCINSTALL_FLAGS="$DOCINSTALL_FLAGS -l '$mm_tagname@$mm_htmlrefdir/'" fi fi if test "x$mm_htmlrefpub" = x; then : mm_val=$mm_tagpath else mm_val="$mm_tagpath=$mm_htmlrefpub" fi if test "x$DOXYGEN_TAGFILES" = x; then : DOXYGEN_TAGFILES=\"$mm_val\" else DOXYGEN_TAGFILES="$DOXYGEN_TAGFILES "\"$mm_val\" fi fi if test "x$ENABLE_DOCUMENTATION" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pangomm documentation" >&5 $as_echo_n "checking for pangomm documentation... " >&6; } # Check whether --with-pangomm-doc was given. if test "${with_pangomm_doc+set}" = set; then : withval=$with_pangomm_doc; mm_htmlrefdir=`expr "X@$withval" : '.*@\(.*\)' 2>&5` mm_tagname=`expr "X/$withval" : '[^@]*[\\/]\([^\\/@]*\)@' 2>&5` mm_tagpath=`expr "X$withval" : 'X\([^@]*\)@' 2>&5` test "x$mm_tagname" != x || mm_tagname="pangomm-1.4.tag" test "x$mm_tagpath" != x || mm_tagpath=$mm_tagname else mm_htmlrefdir= mm_tagname="pangomm-1.4.tag" mm_tagpath=$mm_tagname fi # Prepend working direcory if the tag file path starts with ./ or ../ case $mm_tagpath in #( .[\\/]*|..[\\/]*) : mm_tagpath=`pwd`/$mm_tagpath ;; #( *) : ;; esac # If no local directory was specified, get the default from the .pc file if test "x$mm_htmlrefdir" = x; then : mm_htmlrefdir=`$PKG_CONFIG --variable=htmlrefdir "pangomm-1.4" 2>&5` fi # If the user specified a Web URL, allow it to override the public location case $mm_htmlrefdir in #( http://*|https://*) : mm_htmlrefpub=$mm_htmlrefdir ;; #( *) : mm_htmlrefpub=`$PKG_CONFIG --variable=htmlrefpub "pangomm-1.4" 2>&5` test "x$mm_htmlrefpub" != x || mm_htmlrefpub=$mm_htmlrefdir test "x$mm_htmlrefdir" != x || mm_htmlrefdir=$mm_htmlrefpub ;; esac # The user-supplied tag-file name takes precedence if it includes the path case $mm_tagpath in #( *[\\/]*) : ;; #( *) : mm_doxytagfile=`$PKG_CONFIG --variable=doxytagfile "pangomm-1.4" 2>&5` test "x$mm_doxytagfile" = x || mm_tagpath=$mm_doxytagfile ;; esac # Remove trailing slashes and translate to URI mm_htmlrefpub=`expr "X$mm_htmlrefpub" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` mm_htmlrefdir=`expr "X$mm_htmlrefdir" : 'X\(.*[^\\/]\)[\\/]*' 2>&5 | sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&5` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mm_tagpath@$mm_htmlrefdir" >&5 $as_echo "$mm_tagpath@$mm_htmlrefdir" >&6; } if test "x$USE_MAINTAINER_MODE" != xno && test ! -f "$mm_tagpath"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Doxygen tag file pangomm-1.4.tag not found" >&5 $as_echo "$as_me: WARNING: Doxygen tag file pangomm-1.4.tag not found" >&2;} fi if test "x$mm_htmlrefdir" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Location of external pangomm documentation not set" >&5 $as_echo "$as_me: WARNING: Location of external pangomm documentation not set" >&2;} else if test "x$DOCINSTALL_FLAGS" = x; then : DOCINSTALL_FLAGS="-l '$mm_tagname@$mm_htmlrefdir/'" else DOCINSTALL_FLAGS="$DOCINSTALL_FLAGS -l '$mm_tagname@$mm_htmlrefdir/'" fi fi if test "x$mm_htmlrefpub" = x; then : mm_val=$mm_tagpath else mm_val="$mm_tagpath=$mm_htmlrefpub" fi if test "x$DOXYGEN_TAGFILES" = x; then : DOXYGEN_TAGFILES=\"$mm_val\" else DOXYGEN_TAGFILES="$DOXYGEN_TAGFILES "\"$mm_val\" fi fi if test "x$ENABLE_DOCUMENTATION" != xno; then : # Extract the first word of "sphinx-build", so it can be a program name with args. set dummy sphinx-build; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SPHINX_BUILD+:} false; then : $as_echo_n "(cached) " >&6 else case $SPHINX_BUILD in [\\/]* | ?:[\\/]*) ac_cv_path_SPHINX_BUILD="$SPHINX_BUILD" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SPHINX_BUILD="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SPHINX_BUILD" && ac_cv_path_SPHINX_BUILD="sphinx-build" ;; esac fi SPHINX_BUILD=$ac_cv_path_SPHINX_BUILD if test -n "$SPHINX_BUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SPHINX_BUILD" >&5 $as_echo "$SPHINX_BUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$SPHINX_BUILD" != xsphinx-build; then : else as_fn_error $? "The documentation build is enabled, but the sphinx-build tool could not be found." "$LINENO" 5 fi fi # Check for tar and gzip (used by tar via -z) because we use these when # creating backups. # TODO: This lets us provide a path via a configure option, but we just use # Glib::find_program_in_path(), ignoring that. # TODO: This should check for GNU tar, as GNU tar features are used during the # backup process. # Extract the first word of "tar", so it can be a program name with args. set dummy tar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GLOM_TAR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GLOM_TAR"; then ac_cv_prog_GLOM_TAR="$GLOM_TAR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GLOM_TAR="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_GLOM_TAR" && ac_cv_prog_GLOM_TAR="no" fi fi GLOM_TAR=$ac_cv_prog_GLOM_TAR if test -n "$GLOM_TAR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLOM_TAR" >&5 $as_echo "$GLOM_TAR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GLOM_TAR" = no; then : as_fn_error $? "tar not found. Glom needs this to create backup files." "$LINENO" 5 fi # Extract the first word of "gzip", so it can be a program name with args. set dummy gzip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GLOM_GZIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GLOM_GZIP"; then ac_cv_prog_GLOM_GZIP="$GLOM_GZIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GLOM_GZIP="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_GLOM_GZIP" && ac_cv_prog_GLOM_GZIP="no" fi fi GLOM_GZIP=$ac_cv_prog_GLOM_GZIP if test -n "$GLOM_GZIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLOM_GZIP" >&5 $as_echo "$GLOM_GZIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GLOM_GZIP" = no; then : as_fn_error $? "gzip not found. Glom needs this to create backup files." "$LINENO" 5 fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GLOM_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GLOM_MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GLOM_MSGFMT="$GLOM_MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GLOM_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GLOM_MSGFMT" && ac_cv_path_GLOM_MSGFMT="no" ;; esac fi GLOM_MSGFMT=$ac_cv_path_GLOM_MSGFMT if test -n "$GLOM_MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLOM_MSGFMT" >&5 $as_echo "$GLOM_MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GLOM_MSGFMT" = no; then : as_fn_error $? "msgfmt not found. Glom needs this to test exported .po (gettext) files." "$LINENO" 5 fi cat >>confdefs.h <<_ACEOF #define GLOM_MSGFMT "$GLOM_MSGFMT" _ACEOF # Code testing coverage with gcov { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with gcov testing" >&5 $as_echo_n "checking whether to build with gcov testing... " >&6; } # Check whether --enable-gcov was given. if test "${enable_gcov+set}" = set; then : enableval=$enable_gcov; else enable_gcov=no fi if test "x$enable_gcov" = "xyes"; then if test "$GCC" = "no"; then as_fn_error which is required for gcov testing "not compiling with gcc" "$LINENO" 5 fi # Extract the first word of "gcov", so it can be a program name with args. set dummy gcov; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GCOV+:} false; then : $as_echo_n "(cached) " >&6 else case $GCOV in [\\/]* | ?:[\\/]*) ac_cv_path_GCOV="$GCOV" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GCOV="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GCOV" && ac_cv_path_GCOV="no" ;; esac fi GCOV=$ac_cv_path_GCOV if test -n "$GCOV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCOV" >&5 $as_echo "$GCOV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$GCOV" = "xno"; then as_fn_error $? "gcov was enabled but gcov was not found." "$LINENO" 5 fi # Extract the first word of "lcov", so it can be a program name with args. set dummy lcov; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LCOV+:} false; then : $as_echo_n "(cached) " >&6 else case $LCOV in [\\/]* | ?:[\\/]*) ac_cv_path_LCOV="$LCOV" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LCOV="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LCOV" && ac_cv_path_LCOV="no" ;; esac fi LCOV=$ac_cv_path_LCOV if test -n "$LCOV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5 $as_echo "$LCOV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$LCOV" = "xno"; then as_fn_error $? "gcov was enabled but lcov was not found." "$LINENO" 5 fi # Extract the first word of "genhtml", so it can be a program name with args. set dummy genhtml; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GENHTML+:} false; then : $as_echo_n "(cached) " >&6 else case $GENHTML in [\\/]* | ?:[\\/]*) ac_cv_path_GENHTML="$GENHTML" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GENHTML="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GENHTML" && ac_cv_path_GENHTML="no" ;; esac fi GENHTML=$ac_cv_path_GENHTML if test -n "$GENHTML"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5 $as_echo "$GENHTML" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$GENHTML" = "xno"; then as_fn_error $? "gcov was enabled but lcov's genhtml was not found." "$LINENO" 5 fi GCOV_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" GCOV_LIBS="-lgcov" fi if test x$enable_gcov = xyes; then GCOV_ENABLED_TRUE= GCOV_ENABLED_FALSE='#' else GCOV_ENABLED_TRUE='#' GCOV_ENABLED_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gcov" >&5 $as_echo "$enable_gcov" >&6; } ac_config_files="$ac_config_files Makefile docs/user-guide/Makefile po/Makefile.in glom.desktop.in glom/libglom/glom-${GLOM_ABI_VERSION}.pc:glom/libglom/glom.pc.in docs/libglom_reference/Makefile docs/libglom_reference/Doxyfile docs/pyglom_reference/Makefile docs/pyglom_reference/conf.py docs/pyglom_reference/index.rst win32/glom.iss" ac_config_files="$ac_config_files tests/test_glom_date_in_locales.sh" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( 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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= 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=`$as_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. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${HOST_WIN32_TRUE}" && test -z "${HOST_WIN32_FALSE}"; then as_fn_error $? "conditional \"HOST_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GLOM_ENABLE_UI_TRUE}" && test -z "${GLOM_ENABLE_UI_FALSE}"; then as_fn_error $? "conditional \"GLOM_ENABLE_UI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GLOM_ENABLE_CLIENT_ONLY_TRUE}" && test -z "${GLOM_ENABLE_CLIENT_ONLY_FALSE}"; then as_fn_error $? "conditional \"GLOM_ENABLE_CLIENT_ONLY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GLOM_ENABLE_UI_TESTS_TRUE}" && test -z "${GLOM_ENABLE_UI_TESTS_FALSE}"; then as_fn_error $? "conditional \"GLOM_ENABLE_UI_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GLOM_ENABLE_SQLITE_TRUE}" && test -z "${GLOM_ENABLE_SQLITE_FALSE}"; then as_fn_error $? "conditional \"GLOM_ENABLE_SQLITE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GLOM_ENABLE_POSTGRESQL_TRUE}" && test -z "${GLOM_ENABLE_POSTGRESQL_FALSE}"; then as_fn_error $? "conditional \"GLOM_ENABLE_POSTGRESQL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DIST_DOCTOOLS_TRUE}" && test -z "${DIST_DOCTOOLS_FALSE}"; then as_fn_error $? "conditional \"DIST_DOCTOOLS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${UPDATE_MIME_DATABASE_TRUE}" && test -z "${UPDATE_MIME_DATABASE_FALSE}"; then as_fn_error $? "conditional \"UPDATE_MIME_DATABASE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SK_TRUE}" && test -z "${ENABLE_SK_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GNOME_DOC_UTILS_TRUE}" && test -z "${HAVE_GNOME_DOC_UTILS_FALSE}"; then as_fn_error $? "conditional \"HAVE_GNOME_DOC_UTILS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_DOCUMENTATION_TRUE}" && test -z "${ENABLE_DOCUMENTATION_FALSE}"; then as_fn_error $? "conditional \"ENABLE_DOCUMENTATION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GCOV_ENABLED_TRUE}" && test -z "${GCOV_ENABLED_FALSE}"; then as_fn_error $? "conditional \"GCOV_ENABLED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $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} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## 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=: # Pre-4.2 versions of Zsh do 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_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } 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.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith 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 if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac 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 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then 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 -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_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 || $as_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" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # 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 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=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 Glom $as_me 1.22.4, which was generated by GNU Autoconf 2.69. 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 case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Glom config.status 1.22.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 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' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. 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=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= 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 ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_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. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append 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 || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "glom/libglom/libglom_config.h") CONFIG_HEADERS="$CONFIG_HEADERS glom/libglom/libglom_config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "docs/user-guide/Makefile") CONFIG_FILES="$CONFIG_FILES docs/user-guide/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "glom.desktop.in") CONFIG_FILES="$CONFIG_FILES glom.desktop.in" ;; "glom/libglom/glom-${GLOM_ABI_VERSION}.pc") CONFIG_FILES="$CONFIG_FILES glom/libglom/glom-${GLOM_ABI_VERSION}.pc:glom/libglom/glom.pc.in" ;; "docs/libglom_reference/Makefile") CONFIG_FILES="$CONFIG_FILES docs/libglom_reference/Makefile" ;; "docs/libglom_reference/Doxyfile") CONFIG_FILES="$CONFIG_FILES docs/libglom_reference/Doxyfile" ;; "docs/pyglom_reference/Makefile") CONFIG_FILES="$CONFIG_FILES docs/pyglom_reference/Makefile" ;; "docs/pyglom_reference/conf.py") CONFIG_FILES="$CONFIG_FILES docs/pyglom_reference/conf.py" ;; "docs/pyglom_reference/index.rst") CONFIG_FILES="$CONFIG_FILES docs/pyglom_reference/index.rst" ;; "win32/glom.iss") CONFIG_FILES="$CONFIG_FILES win32/glom.iss" ;; "tests/test_glom_date_in_locales.sh") CONFIG_FILES="$CONFIG_FILES tests/test_glom_date_in_locales.sh" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason 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= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries 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[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # 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. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[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="$ac_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 || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append 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 '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; 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 || $as_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"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_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 ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # 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= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 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 || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;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 s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_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 "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build static libraries. build_old_libs=$enable_static # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; "tests/test_glom_date_in_locales.sh":F) chmod u+x tests/test_glom_date_in_locales.sh ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # 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 || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi glom-1.22.4/ABOUT-NLS0000644000175000017500000022532612234777071015237 0ustar00murraycmurrayc000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of November 2007. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ Compendium | [] [] [] [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] | bison-runtime | [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] [] | console-tools | [] [] | coreutils | [] [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | dialog | | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | fetchmail | [] [] () [] [] | findutils | [] | findutils_stable | [] [] [] | flex | [] [] [] | fslint | | gas | | gawk | [] [] [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gip | [] | gliv | [] [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | [] [] () () [] | gnuedu | | gnulib | [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | | gramadoir | [] [] | grep | [] [] | gretl | () | gsasl | | gss | | gst-plugins-bad | [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gst-plugins-ugly | [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | () | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] | indent | [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | [] [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | [] [] | libidn | [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] | man-db | [] [] [] | minicom | [] [] [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] | pwdutils | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | shared-mime-info | [] [] [] [] () [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | skencil | [] () | solfege | | soundtracker | [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] | texinfo | [] [] [] | tin | () () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] | bfd | [] [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | dialog | [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | fetchmail | [] | findutils | [] [] [] | findutils_stable | [] [] [] [] | flex | [] [] [] | fslint | | gas | [] [] | gawk | [] [] [] [] () | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnuedu | [] | gnulib | [] [] [] | gnunet | | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] [] | gpsdrive | [] | gramadoir | [] [] | grep | [] [] [] | gretl | [] [] [] () | gsasl | [] [] | gss | [] [] | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] | gstreamer | [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] [] [] | keytouch-editor | [] | keytouch-keyboa... | [] [] | latrine | [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | [] [] [] | libidn | [] [] | lifelines | () | lilypond | [] [] [] | lingoteach | [] [] [] | lprng | | lynx | [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | [] | minicom | [] [] [] [] | nano | [] [] [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] | tin | [] () | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | util-linux-ng | [] [] [] [] [] [] [] | vorbis-tools | | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52 ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn +--------------------------------------------------+ Compendium | [] | a2ps | () [] [] | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | [] | cpplib | [] | cryptonit | [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | fetchmail | [] [] | findutils | [] | findutils_stable | [] | flex | [] [] | fslint | | gas | | gawk | [] [] | gcal | | gcc | | gettext-examples | [] [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] [] | gnubiff | | gnucash | () () () | gnuedu | | gnulib | [] [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] | gphoto2 | [] [] | gprof | [] | gpsdrive | [] | gramadoir | () | grep | [] [] | gretl | | gsasl | [] | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] | gtick | [] | gtkam | [] [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] | indent | [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | [] | libidn | [] [] | lifelines | [] | lilypond | [] | lingoteach | [] | lprng | | lynx | [] [] | m4 | [] [] | mailfromd | | mailutils | | make | [] [] [] | man-db | | minicom | [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] [] [] | pwdutils | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | shared-mime-info | [] [] [] [] [] [] [] | sharutils | [] [] | shishi | | skencil | | solfege | () () | soundtracker | | sp | () | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] | tin | | tuxpaint | () [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | util-linux-ng | [] [] | vorbis-tools | | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6 or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] [] | bash | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | dialog | [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | fetchmail | [] [] [] | findutils | [] [] [] | findutils_stable | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] | gas | | gawk | [] [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gip | [] [] [] [] | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () [] | gnucash | () [] | gnuedu | | gnulib | [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | gretl | [] [] [] | gsasl | [] [] [] | gss | [] [] [] [] | gst-plugins-bad | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] | gstreamer | [] [] [] [] | gtick | [] | gtkam | [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | herrie | [] [] [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] [] | libgpg-error | [] [] [] | libgphoto2 | [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] [] [] | make | [] [] [] [] | man-db | [] [] [] [] | minicom | [] [] [] [] [] | nano | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | [] [] | qof | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | | wdiff | [] [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ Compendium | [] [] [] [] | 19 a2ps | [] [] [] | 19 aegis | [] | 1 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 16 bash | [] | 6 bfd | | 2 bibshelf | [] | 7 binutils | [] [] [] [] | 9 bison | [] [] [] [] | 20 bison-runtime | [] [] [] [] | 18 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 5 clisp | | 9 console-tools | [] [] | 5 coreutils | [] [] [] | 18 cpio | [] [] [] [] | 11 cpplib | [] [] [] [] [] | 12 cryptonit | [] | 6 dialog | [] [] [] | 9 diffutils | [] [] [] [] [] | 29 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 fetchmail | [] [] | 12 findutils | [] [] [] | 11 findutils_stable | [] [] [] [] | 18 flex | [] [] | 15 fslint | [] | 2 gas | [] | 3 gawk | [] [] [] | 16 gcal | [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] | 29 gettext-runtime | [] [] [] [] [] [] | 28 gettext-tools | [] [] [] [] [] | 20 gip | [] [] | 13 gliv | [] [] | 11 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 16 gnubiff | [] | 2 gnucash | () [] | 5 gnuedu | [] | 2 gnulib | [] | 10 gnunet | | 0 gnunet-gtk | [] [] | 3 gnutls | | 4 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] [] | 7 gpe-clock | [] [] [] [] | 21 gpe-conf | [] [] [] | 16 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] [] | 22 gpe-filemanager | [] [] | 7 gpe-go | [] [] [] [] | 19 gpe-login | [] [] [] [] [] | 21 gpe-ownerinfo | [] [] [] [] | 21 gpe-package | [] | 6 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] [] | 21 gpe-taskmanager | [] [] [] [] | 21 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 21 gpe-todo | [] [] | 8 gphoto2 | [] [] [] [] | 21 gprof | [] [] | 13 gpsdrive | [] | 5 gramadoir | [] | 7 grep | [] | 12 gretl | | 6 gsasl | [] [] [] | 9 gss | [] | 7 gst-plugins-bad | [] [] [] | 13 gst-plugins-base | [] [] | 11 gst-plugins-good | [] [] [] [] [] | 16 gst-plugins-ugly | [] [] [] | 13 gstreamer | [] [] [] | 18 gtick | [] [] | 7 gtkam | [] | 16 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 27 gutenprint | | 4 hello | [] [] [] [] [] | 38 herrie | [] [] | 8 hylafax | | 0 idutils | [] [] | 15 indent | [] [] [] [] [] | 28 iso_15924 | [] [] | 4 iso_3166 | [] [] [] [] [] [] [] [] [] | 54 iso_3166_2 | [] [] | 4 iso_4217 | [] [] [] [] [] | 24 iso_639 | [] [] [] [] [] | 26 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] [] | 13 keytouch | [] | 8 keytouch-editor | [] | 5 keytouch-keyboa... | [] | 5 latrine | [] [] | 5 ld | [] [] [] [] | 10 leafpad | [] [] [] [] [] | 24 libc | [] [] [] | 19 libexif | [] | 5 libextractor | [] | 5 libgpewidget | [] [] [] | 20 libgpg-error | [] | 6 libgphoto2 | [] [] | 9 libgphoto2_port | [] [] [] | 11 libgsasl | [] | 8 libiconv | [] [] | 11 libidn | [] [] | 11 lifelines | | 4 lilypond | [] | 6 lingoteach | [] | 6 lprng | [] | 2 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailfromd | [] [] | 3 mailutils | [] [] | 8 make | [] [] [] | 20 man-db | [] | 9 minicom | [] | 14 nano | [] [] [] | 20 opcodes | [] [] | 10 parted | [] [] [] | 11 pilot-qof | [] | 1 popt | [] [] [] [] | 18 psmisc | [] [] | 10 pwdutils | [] | 3 qof | [] | 4 radius | [] [] | 7 recode | [] [] [] | 25 rpm | [] [] [] [] | 13 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] [] | 23 shared-mime-info | [] [] [] | 29 sharutils | [] [] [] | 23 shishi | [] | 3 skencil | [] | 7 solfege | [] | 3 soundtracker | [] [] | 9 sp | [] | 3 system-tools-ba... | [] [] [] [] [] [] [] | 38 tar | [] [] [] | 17 texinfo | [] [] [] | 15 tin | | 1 tuxpaint | [] [] [] | 19 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 util-linux-ng | [] [] [] | 20 vorbis-tools | [] [] | 4 wastesedge | | 1 wdiff | [] [] | 23 wget | [] [] [] | 20 xchat | [] [] [] [] | 29 xkeyboard-config | [] [] [] | 14 xpad | [] [] [] | 15 +---------------------------------------------------+ 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If November 2007 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams. glom-1.22.4/aclocal.m40000644000175000017500000021055012234777112015635 0ustar00murraycmurrayc00000000000000# generated automatically by aclocal 1.13.3 -*- Autoconf -*- # Copyright (C) 1996-2013 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_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 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. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 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. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 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. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 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. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 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. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 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 macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 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. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 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. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 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. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 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. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Copyright (C) 1999-2013 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. # AM_PROG_CC_C_O # -------------- # Like AC_PROG_CC_C_O, but changed for automake. AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi dnl Make sure AC_PROG_CC is never called again, or it will override our dnl setting of CC. m4_define([AC_PROG_CC], [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 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. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Copyright (C) 2003-2013 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. # AM_PROG_MKDIR_P # --------------- # Check for 'mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl FIXME we are no longer going to remove this! adjust warning dnl FIXME message accordingly. AC_DIAGNOSE([obsolete], [$0: this macro is deprecated, and will soon be removed. You should use the Autoconf-provided 'AC][_PROG_MKDIR_P' macro instead, and use '$(MKDIR_P)' instead of '$(mkdir_p)'in your Makefile.am files.]) dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 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. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 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. # AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 dnl python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) AC_ARG_VAR([PYTHON], [the Python interpreter]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version is >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([Python interpreter is too old])]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Getting [:3] seems to be dnl the best way to do this; it's what "site.py" does in the standard dnl library. AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl Use the values of $prefix and $exec_prefix for the corresponding dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made dnl distinct variables so they can be overridden if need be. However, dnl general consensus is that you shouldn't need this ability. AC_SUBST([PYTHON_PREFIX], ['${prefix}']) AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) dnl At times (like when building shared libraries) you may want dnl to know which OS platform Python thinks this is. AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) # Just factor out some code duplication. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': can_use_sysconfig = 0 except ImportError: pass" dnl Set up 4 directories: dnl pythondir -- where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory like in previous automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query distutils for this directory. AC_CACHE_CHECK([for $am_display_PYTHON script directory], [am_cv_python_pythondir], [if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl pkgpythondir -- $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl pyexecdir -- directory for installing python extension modules dnl (shared libraries) dnl Query distutils for this directory. AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], [am_cv_python_pyexecdir], [if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) # Copyright (C) 2001-2013 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. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 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. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 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. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 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. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 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. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 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. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES #serial 20090814 AC_DEFUN([_MM_PRE_INIT], [m4_pattern_forbid([^_?MM_])]) m4_define([_MM_PREREQ], [dnl m4_if(m4_quote(m4_version_compare([$2], [$3])), [-1], [m4_fatal([$4 requires $1 $3 (version $2 is installed)])])[]dnl ]) AC_DEFUN([MM_PREREQ], [dnl m4_assert([$# >= 1])[]dnl AC_REQUIRE([_MM_PRE_INIT])[]dnl _MM_PREREQ([mm-common], [0.9.6], [$1], m4_defn([AC_PACKAGE_NAME]))[]dnl ]) #serial 20110327 m4_define([_MM_CONFIG_DOCTOOL_DIR], [dnl AC_PROVIDE([$0])[]dnl AC_REQUIRE([PKG_PROG_PKG_CONFIG])[]dnl dnl AC_MSG_CHECKING([location of documentation utilities]) AS_IF([test "x$MMDOCTOOLDIR" = x], [ MMDOCTOOLDIR=`$PKG_CONFIG --variable=doctooldir mm-common-util 2>&AS_MESSAGE_LOG_FD` AS_IF([test "[$]?" -ne 0], [AC_MSG_ERROR([[not found The required module mm-common-util could not be found on this system. If you are running a binary distribution and the mm-common package is installed, make sure that any separate development package for mm-common is installed as well. If you built mm-common yourself, it may be necessary to adjust the PKG_CONFIG_PATH environment variable for pkg-config to find it. ]])]) ]) AC_MSG_RESULT([$MMDOCTOOLDIR])[]dnl ]) AC_DEFUN([MM_CONFIG_DOCTOOL_DIR], [dnl AC_REQUIRE([_MM_PRE_INIT])[]dnl AC_REQUIRE([MM_CHECK_GNU_MAKE])[]dnl m4_ifval([$1], [MMDOCTOOLDIR='[$]{top_srcdir}/$1'], [AC_REQUIRE([_MM_CONFIG_DOCTOOL_DIR])]) AM_CONDITIONAL([DIST_DOCTOOLS], [test 'x$1' != 'x'])dnl AC_SUBST([MMDOCTOOLDIR])[]dnl ]) m4_define([_MM_ARG_ENABLE_DOCUMENTATION], [dnl AC_PROVIDE([$0])[]dnl dnl AC_ARG_VAR([DOT], [path to dot utility])[]dnl AC_ARG_VAR([DOXYGEN], [path to Doxygen utility])[]dnl AC_ARG_VAR([XSLTPROC], [path to xsltproc utility])[]dnl dnl AC_PATH_PROG([DOT], [dot], [dot]) AC_PATH_PROG([DOXYGEN], [doxygen], [doxygen]) AC_PATH_PROG([XSLTPROC], [xsltproc], [xsltproc]) dnl AC_ARG_ENABLE([documentation], [AS_HELP_STRING([--disable-documentation], [do not build or install the documentation])], [ENABLE_DOCUMENTATION=$enableval], [ENABLE_DOCUMENTATION=auto]) AS_IF([test "x$ENABLE_DOCUMENTATION" != xno], [ mm_err= AS_IF([test "x$MMDOCTOOLDIR" = x], [mm_err='dnl The mm-common-util module is available, but the installation of mm-common on this machine is missing the shared documentation utilities of the GNOME C++ bindings. It may be necessary to upgrade to a more recent release of mm-common in order to build '$PACKAGE_NAME' and install the documentation.'], [test "x$PERL" = xperl], [mm_err='Perl is required for installing the documentation.'], [test "x$USE_MAINTAINER_MODE" != xno], [ test "x$DOT" != xdot || mm_err=' dot' test "x$DOXYGEN" != xdoxygen || mm_err="$mm_err doxygen" test "x$XSLTPROC" != xxsltproc || mm_err="$mm_err xsltproc" test -z "$mm_err" || mm_err='The documentation cannot be generated because not all of the required tools are available:'$mm_err ]) AS_IF([test -z "$mm_err"], [ENABLE_DOCUMENTATION=yes], [test "x$ENABLE_DOCUMENTATION" = xyes], [AC_MSG_FAILURE([[$mm_err]])], [ENABLE_DOCUMENTATION=no; AC_MSG_WARN([[$mm_err]])]) ]) AM_CONDITIONAL([ENABLE_DOCUMENTATION], [test "x$ENABLE_DOCUMENTATION" = xyes]) AC_SUBST([DOXYGEN_TAGFILES], [[]]) AC_SUBST([DOCINSTALL_FLAGS], [[]])[]dnl ]) AC_DEFUN([MM_ARG_ENABLE_DOCUMENTATION], [dnl AC_BEFORE([$0], [MM_ARG_WITH_TAGFILE_DOC])[]dnl AC_REQUIRE([_MM_PRE_INIT])[]dnl AC_REQUIRE([MM_CONFIG_DOCTOOL_DIR])[]dnl AC_REQUIRE([MM_PATH_PERL])[]dnl AC_REQUIRE([_MM_ARG_ENABLE_DOCUMENTATION])[]dnl ]) m4_define([_MM_TR_URI], [dnl [`expr "X$1" : 'X\(.*[^\\/]\)[\\/]*' 2>&]AS_MESSAGE_LOG_FD[ |]dnl [ sed 's|[\\]|/|g;s| |%20|g;s|^/|file:///|;s|^.:/|file:///&|' 2>&]AS_MESSAGE_LOG_FD[`]dnl ]) m4_define([_MM_ARG_WITH_TAGFILE_DOC], [dnl AC_MSG_CHECKING([for $1 documentation]) AC_ARG_WITH([$1-doc], [AS_HELP_STRING([[--with-$1-doc=[TAGFILE@]HTMLREFDIR]], [Link to external $1 documentation]m4_ifval([$4], [[ [auto]]]))], [ mm_htmlrefdir=`[expr "X@$withval" : '.*@\(.*\)' 2>&]AS_MESSAGE_LOG_FD` mm_tagname=`[expr "X/$withval" : '[^@]*[\\/]\([^\\/@]*\)@' 2>&]AS_MESSAGE_LOG_FD` mm_tagpath=`[expr "X$withval" : 'X\([^@]*\)@' 2>&]AS_MESSAGE_LOG_FD` test "x$mm_tagname" != x || mm_tagname="$3" test "x$mm_tagpath" != x || mm_tagpath=$mm_tagname[]dnl ], [ mm_htmlrefdir= mm_tagname="$3" mm_tagpath=$mm_tagname[]dnl ]) # Prepend working direcory if the tag file path starts with ./ or ../ AS_CASE([$mm_tagpath], [[.[\\/]*|..[\\/]*]], [mm_tagpath=`pwd`/$mm_tagpath]) m4_ifval([$4], [dnl # If no local directory was specified, get the default from the .pc file AS_IF([test "x$mm_htmlrefdir" = x], [ mm_htmlrefdir=`$PKG_CONFIG --variable=htmlrefdir "$4" 2>&AS_MESSAGE_LOG_FD`dnl ]) # If the user specified a Web URL, allow it to override the public location AS_CASE([$mm_htmlrefdir], [[http://*|https://*]], [mm_htmlrefpub=$mm_htmlrefdir], [ mm_htmlrefpub=`$PKG_CONFIG --variable=htmlrefpub "$4" 2>&AS_MESSAGE_LOG_FD` test "x$mm_htmlrefpub" != x || mm_htmlrefpub=$mm_htmlrefdir test "x$mm_htmlrefdir" != x || mm_htmlrefdir=$mm_htmlrefpub ]) # The user-supplied tag-file name takes precedence if it includes the path AS_CASE([$mm_tagpath], [[*[\\/]*]],, [ mm_doxytagfile=`$PKG_CONFIG --variable=doxytagfile "$4" 2>&AS_MESSAGE_LOG_FD` test "x$mm_doxytagfile" = x || mm_tagpath=$mm_doxytagfile ]) # Remove trailing slashes and translate to URI mm_htmlrefpub=_MM_TR_URI([$mm_htmlrefpub]) ])[]dnl mm_htmlrefdir=_MM_TR_URI([$mm_htmlrefdir]) AC_MSG_RESULT([$mm_tagpath@$mm_htmlrefdir]) AS_IF([test "x$USE_MAINTAINER_MODE" != xno && test ! -f "$mm_tagpath"], [AC_MSG_WARN([Doxygen tag file $3 not found])]) AS_IF([test "x$mm_htmlrefdir" = x], [AC_MSG_WARN([Location of external $1 documentation not set])], [AS_IF([test "x$DOCINSTALL_FLAGS" = x], [DOCINSTALL_FLAGS="-l '$mm_tagname@$mm_htmlrefdir/'"], [DOCINSTALL_FLAGS="$DOCINSTALL_FLAGS -l '$mm_tagname@$mm_htmlrefdir/'"])]) AS_IF([test "x$mm_$2" = x], [mm_val=$mm_tagpath], [mm_val="$mm_tagpath=$mm_$2"]) AS_IF([test "x$DOXYGEN_TAGFILES" = x], [DOXYGEN_TAGFILES=[\]"$mm_val[\]"], [DOXYGEN_TAGFILES="$DOXYGEN_TAGFILES "[\]"$mm_val[\]"])[]dnl ]) AC_DEFUN([MM_ARG_WITH_TAGFILE_DOC], [dnl m4_assert([$# >= 1])[]dnl m4_ifval([$2], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])])[]dnl AC_REQUIRE([MM_CONFIG_DOCTOOL_DIR])[]dnl AC_REQUIRE([_MM_ARG_ENABLE_DOCUMENTATION])[]dnl dnl AS_IF([test "x$ENABLE_DOCUMENTATION" != xno], [_MM_ARG_WITH_TAGFILE_DOC(m4_quote(m4_bpatsubst([$1], [[+]*\([-+][0123456789]\|[._]\).*$])), [htmlref]m4_ifval([$2], [[pub]], [[dir]]), [$1], [$2])])[]dnl ]) #serial 20091228 m4_define([_MM_INIT_MODULE_VERSION], [dnl m4_ifval([$3], [AC_SUBST([$2][_MAJOR_VERSION], [$3]) AC_DEFINE([$2][_MAJOR_VERSION], [$3], [Major version number of $1.]) ])[]dnl m4_ifval([$4], [AC_SUBST([$2][_MINOR_VERSION], [$4]) AC_DEFINE([$2][_MINOR_VERSION], [$4], [Minor version number of $1.]) ])[]dnl m4_ifval([$5], [AC_SUBST([$2][_MICRO_VERSION], [$5]) AC_DEFINE([$2][_MICRO_VERSION], [$5], [Micro version number of $1.]) ])[]dnl ]) m4_define([_MM_INIT_MODULE_SUBST], [dnl AC_SUBST([$5][_MODULE_NAME], ['$1']) AC_SUBST([$5][_VERSION], ['$2']) m4_ifval([$4], [AC_SUBST([$5][_API_VERSION], ['$4']) ])[]dnl _MM_INIT_MODULE_VERSION([$3], [$5], m4_bpatsubst([$2], [[^0123456789]+], [,]))[]dnl ]) m4_define([_MM_INIT_MODULE_BASENAME], [_MM_INIT_MODULE_SUBST([$1], [$2], [$3], [$4], m4_quote(AS_TR_CPP(m4_quote(m4_translit([$3], [+], [X])))))]) AC_DEFUN([MM_INIT_MODULE], [dnl m4_assert([$# >= 1])[]dnl AC_REQUIRE([_MM_PRE_INIT])[]dnl AC_REQUIRE([MM_CHECK_GNU_MAKE])[]dnl _MM_INIT_MODULE_BASENAME([$1], m4_quote(m4_ifval([$2], [$2], m4_defn([AC_PACKAGE_VERSION]))), m4_quote(m4_bpatsubst([$1], [[-.0123456789]+$])), m4_quote(m4_bregexp([$1], [-?\([.0123456789]+\)$], [\1])))[]dnl ]) #serial 20090822 m4_define([_MM_CHECK_GNU_MAKE], [dnl AC_PROVIDE([$0])[]dnl AC_MSG_CHECKING([whether [$]{MAKE-make} supports GNU make features]) cat >conftest.make <<'_MMEOF' override reverse = [$](2)[$](subst ,, )[$](1) override result := [$](word 2,[$](call reverse,success,failure)) all: ; test '[$](result)' = success .PHONY: all _MMEOF AS_IF([[$]{MAKE-make} -f conftest.make >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [mm_gnu_make=yes], [mm_gnu_make=no]) rm -f conftest.make AC_MSG_RESULT([$mm_gnu_make]) AS_IF([test "x$mm_gnu_make" != xyes], [AC_MSG_FAILURE([[The GNU make program is required to build $PACKAGE_NAME.]])])[]dnl ]) AC_DEFUN([MM_CHECK_GNU_MAKE], [dnl AC_REQUIRE([_MM_PRE_INIT])[]dnl AC_REQUIRE([_MM_CHECK_GNU_MAKE])[]dnl ]) m4_define([_MM_PATH_PERL], [dnl AC_PROVIDE([$0])[]dnl AC_ARG_VAR([PERL], [path to Perl interpreter])[]dnl AC_PATH_PROG([PERL], [perl], [perl])[]dnl ]) AC_DEFUN([MM_PATH_PERL], [dnl AC_REQUIRE([_MM_PRE_INIT])[]dnl AC_REQUIRE([_MM_PATH_PERL])[]dnl ]) m4_define([_MM_CHECK_PERL], [dnl AS_IF([$PERL -e "require v$1; exit 0;" >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [$2], m4_ifval([$2$3], [[$3]], [[AC_MSG_FAILURE([[At least Perl ]$1[ is required to build $PACKAGE_NAME.]])]]))[]dnl ]) AC_DEFUN([MM_CHECK_PERL], [dnl AC_REQUIRE([_MM_PRE_INIT])[]dnl AC_REQUIRE([_MM_PATH_PERL])[]dnl _MM_CHECK_PERL(m4_ifval([$1], [[$1]], [[5.6.0]]), [$2], [$3])[]dnl ]) AC_DEFUN([MM_PKG_CONFIG_SUBST], [dnl m4_assert([$# >= 2])[]dnl AC_REQUIRE([_MM_PRE_INIT])[]dnl AC_REQUIRE([PKG_PROG_PKG_CONFIG])[]dnl AC_MSG_CHECKING([for $1]) dnl AS_IF([test -z "[$]{$1+set}"], [$1=`$PKG_CONFIG $2 2>&AS_MESSAGE_LOG_FD` AS_IF([test "[$]?" -eq 0], [$3], [$4])]) dnl AC_MSG_RESULT([[$]$1]) AC_SUBST([$1])[]dnl ]) #serial 20091103 m4_define([_MM_ARG_ENABLE_WARNINGS_OPTION], [dnl AC_PROVIDE([$0])[]dnl AC_ARG_ENABLE([warnings], [AS_HELP_STRING([[--enable-warnings[=min|max|fatal|no]]], [set compiler pedantry level [default=min]])], [mm_enable_warnings=$enableval], [mm_enable_warnings=min])[]dnl ]) AC_DEFUN([MM_ARG_ENABLE_WARNINGS], [dnl m4_assert([$# >= 3])[]dnl AC_REQUIRE([_MM_PRE_INIT])[]dnl AC_REQUIRE([_MM_ARG_ENABLE_WARNINGS_OPTION])[]dnl dnl AS_CASE([$ac_compile], [[*'$CXXFLAGS '*]], [mm_lang='C++' mm_cc=$CXX mm_conftest="conftest.[$]{ac_ext-cc}"], [[*'$CFLAGS '*]], [mm_lang=C mm_cc=$CC mm_conftest="conftest.[$]{ac_ext-c}"], [AC_MSG_ERROR([[current language is neither C nor C++]])]) dnl AC_MSG_CHECKING([which $mm_lang compiler warning flags to use]) m4_ifval([$4], [mm_deprecation_flags= ])mm_tested_flags= dnl AS_CASE([$mm_enable_warnings], [no], [mm_warning_flags=], [max], [mm_warning_flags="$3"], [fatal], [mm_warning_flags="$3 -Werror"[]m4_ifval([$4], [ for mm_prefix in $4 do mm_deprecation_flags="$mm_deprecation_flags-D[$]{mm_prefix}_DISABLE_DEPRECATED " done])], [mm_warning_flags="$2"]) dnl AS_IF([test "x$mm_warning_flags" != x], [ # Keep in mind that the dummy source must be devoid of any # problems that might cause diagnostics. AC_LANG_CONFTEST([AC_LANG_SOURCE([[ int main(int argc, char** argv) { return (argv != 0) ? argc : 0; } ]])]) for mm_flag in $mm_warning_flags do # Test whether the compiler accepts the flag. Look at standard output, # since GCC only shows a warning message if an option is not supported. mm_cc_out=`$mm_cc $mm_tested_flags $mm_flag -c "$mm_conftest" 2>&1 || echo failed` rm -f "conftest.[$]{OBJEXT-o}" AS_IF([test "x$mm_cc_out" = x], [AS_IF([test "x$mm_tested_flags" = x], [mm_tested_flags=$mm_flag], [mm_tested_flags="$mm_tested_flags $mm_flag"])], [cat <<_MMEOF >&AS_MESSAGE_LOG_FD $mm_cc: $mm_cc_out _MMEOF ]) done rm -f "$mm_conftest" ]) mm_all_flags=m4_ifval([$4], [$mm_deprecation_flags])$mm_tested_flags AC_SUBST([$1], [$mm_all_flags]) dnl test "x$mm_all_flags" != x || mm_all_flags=none AC_MSG_RESULT([$mm_all_flags])[]dnl ]) m4_include([macros/ax_boost_python_murrayc.m4]) m4_include([macros/gettext.m4]) m4_include([macros/gnome-doc-utils.m4]) m4_include([macros/iconv.m4]) m4_include([macros/intlmacosx.m4]) m4_include([macros/intltool.m4]) m4_include([macros/lib-ld.m4]) m4_include([macros/lib-link.m4]) m4_include([macros/lib-prefix.m4]) m4_include([macros/libtool.m4]) m4_include([macros/ltoptions.m4]) m4_include([macros/ltsugar.m4]) m4_include([macros/ltversion.m4]) m4_include([macros/lt~obsolete.m4]) m4_include([macros/mm-pkg.m4]) m4_include([macros/mm-python.m4]) m4_include([macros/nls.m4]) m4_include([macros/po.m4]) m4_include([macros/progtest.m4]) glom-1.22.4/TODO0000644000175000017500000000101112234252645014452 0ustar00murraycmurrayc00000000000000libgda 3.0: * glom/mode_design/fields/box_db_table_definition.cc:590: There is a Gnome::Gda::TransactionIsolation parameter I have absolutely no clue about. We should either find out what it is supposed to do and/or provide some reasonable default in libgdamm. * Creating databases (frame_glom.cc, create_database()) sometimes fails due to the source database "template1" already being in use. A two-second-sleep seems to have improved chance that it works, but it is a) still not really reliable and b) a damn hack glom-1.22.4/Makefile_tests.am0000644000175000017500000005144012234776363017263 0ustar00murraycmurrayc00000000000000## Copyright (c) 2009, 2010 Openismus GmbH ## ## This file is part of Glom. ## ## Glom is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published ## by the Free Software Foundation, either version 2 of the License, ## or (at your option) any later version. ## ## Glom is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ## See the GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see . check_PROGRAMS = \ glom/libglom/test_connectionpool \ glom/libglom/example_document_load \ glom/libglom/test_sharedptr_layoutitem \ tests/test_document_load \ tests/test_document_load_and_change \ tests/test_document_load_and_save \ tests/test_document_load_translations \ tests/test_document_change \ tests/test_document_autosave \ tests/test_field_file_format \ tests/test_parsing_time \ tests/test_signal_reemit \ tests/python/test_load_python_library\ tests/python/test_python_module \ tests/test_fake_connection \ tests/test_script_check_for_problems \ tests/test_selfhosting_new_empty \ tests/test_selfhosting_new_empty_change_sysprefs \ tests/test_selfhosting_new_empty_then_users \ tests/test_selfhosting_new_from_example \ tests/test_selfhosting_new_from_example_operator \ tests/test_selfhosting_new_from_example_strangepath \ tests/test_selfhosting_new_then_report \ tests/test_selfhosting_new_then_report_summary \ tests/test_selfhosting_new_then_image \ tests/test_selfhosting_new_then_lookup \ tests/test_selfhosting_new_then_choices \ tests/test_selfhosting_new_then_backup_restore \ tests/test_selfhosting_new_then_get_privs \ tests/test_selfhosting_new_then_alter_table \ tests/test_selfhosting_new_then_change_columns \ tests/test_selfhosting_sqlinjection \ tests/import/test_parsing \ tests/import/test_signals \ tests/translations_po/test_document_export_po \ tests/translations_po/test_document_import_po TESTS = tests/test_document_load \ tests/test_document_load_and_change \ tests/test_document_load_and_save_all.sh \ tests/test_document_load_translations \ tests/test_document_change \ tests/test_document_autosave \ tests/test_field_file_format \ tests/test_parsing_time \ tests/test_signal_reemit \ tests/test_dtd_file_validation.sh \ tests/test_glade_file_validation.sh \ tests/test_xslt_file_validation.sh \ tests/python/test_load_python_library \ tests/python/test_python_module \ tests/test_fake_connection \ tests/test_script_check_for_problems \ tests/test_selfhosting_new_empty \ tests/test_selfhosting_new_empty_change_sysprefs \ tests/test_selfhosting_new_empty_then_users \ tests/test_selfhosting_new_from_example \ tests/test_selfhosting_new_from_example_operator \ tests/test_selfhosting_new_from_example_in_locales.sh \ tests/test_selfhosting_new_from_example_strangepath \ tests/test_selfhosting_new_then_report \ tests/test_selfhosting_new_then_report_summary \ tests/test_selfhosting_new_then_backup_restore \ tests/test_selfhosting_new_then_image \ tests/test_selfhosting_new_then_lookup \ tests/test_selfhosting_new_then_choices \ tests/test_selfhosting_new_then_get_privs \ tests/test_selfhosting_new_then_alter_table \ tests/test_selfhosting_new_then_change_columns \ tests/test_selfhosting_sqlinjection \ tests/import/test_parsing \ tests/import/test_signals \ tests/translations_po/test_document_export_po \ tests/translations_po/test_document_import_po # We also set this in Makefile.am, with +=, # but this is the first use, where we must use = dist_noinst_SCRIPTS = tests/test_dtd_file_validation.sh \ tests/test_glade_file_validation.sh \ tests/test_xslt_file_validation.sh \ tests/test_glade_toplevels_instantiation.sh \ tests/test_glom_date_in_locales.sh.in \ tests/test_selfhosting_new_from_example_in_locales.sh \ tests/test_document_load_and_save_all.sh #TESTS_ENVIRONMENT=which valgrind && valgrind --tool=memcheck --leak-check=full --leak-resolution=high --trace-children=yes --num-callers=30 # Tell python to use the python modules that we have built, # instead of just looking in the installed paths, # so the test can run before installation:: TESTS_ENVIRONMENT = PYTHONPATH=${PYTHONPATH}:$(abs_top_builddir)/glom/python_embed/python_module/.libs tests_ldadd = glom/libglom/libglom-$(GLOM_ABI_VERSION).la $(libglom_all_libs) tests_cppflags = $(glom_includes) $(LIBGLOM_CFLAGS) $(PYTHON_CPPFLAGS) $(BOOST_PYTHON_CFLAGS) $(glom_defines) tests_cppflags_ui = $(glom_includes) $(GLOM_CFLAGS) $(PYTHON_CPPFLAGS) $(BOOST_PYTHON_CFLAGS) $(glom_defines) glom_libglom_test_connectionpool_SOURCES = glom/libglom/test_connectionpool.cc glom_libglom_test_connectionpool_LDADD = $(tests_ldadd) glom_libglom_test_connectionpool_CPPFLAGS = $(tests_cppflags) glom_libglom_example_document_load_SOURCES = glom/libglom/example_document_load.cc glom_libglom_example_document_load_LDADD = $(tests_ldadd) glom_libglom_example_document_load_CPPFLAGS = $(tests_cppflags) glom_libglom_test_sharedptr_layoutitem_SOURCES = glom/libglom/test_sharedptr_layoutitem.cc glom_libglom_test_sharedptr_layoutitem_LDADD = $(tests_ldadd) glom_libglom_test_sharedptr_layoutitem_CPPFLAGS = $(tests_cppflags) tests_test_document_load_SOURCES = tests/test_document_load.cc $(sources_test_utils) tests_test_document_load_LDADD = $(tests_ldadd) tests_test_document_load_CPPFLAGS = $(tests_cppflags) $(glom_test_image_defines) tests_test_document_load_and_change_SOURCES = tests/test_document_load_and_change.cc $(sources_test_utils) tests_test_document_load_and_change_LDADD = $(tests_ldadd) tests_test_document_load_and_change_CPPFLAGS = $(tests_cppflags) $(glom_test_image_defines) tests_test_document_load_and_save_SOURCES = tests/test_document_load_and_save.cc tests_test_document_load_and_save_LDADD = $(tests_ldadd) tests_test_document_load_and_save_CPPFLAGS = $(tests_cppflags) tests_test_document_load_translations_SOURCES = tests/test_document_load_translations.cc tests_test_document_load_translations_LDADD = $(tests_ldadd) tests_test_document_load_translations_CPPFLAGS = $(tests_cppflags) tests_test_document_change_SOURCES = tests/test_document_change.cc tests_test_document_change_LDADD = $(tests_ldadd) tests_test_document_change_CPPFLAGS = $(tests_cppflags) tests_test_document_autosave_SOURCES = tests/test_document_autosave.cc tests_test_document_autosave_LDADD = $(tests_ldadd) tests_test_document_autosave_CPPFLAGS = $(tests_cppflags) tests_test_field_file_format_SOURCES = tests/test_field_file_format.cc $(sources_test_utils) tests_test_field_file_format_LDADD = $(tests_ldadd) tests_test_field_file_format_CPPFLAGS = $(tests_cppflags) $(glom_test_image_defines) tests_test_parsing_time_SOURCES = tests/test_parsing_time.cc tests_test_parsing_time_LDADD = $(tests_ldadd) tests_test_parsing_time_CPPFLAGS = $(tests_cppflags) tests_test_signal_reemit_SOURCES = tests/test_signal_reemit.cc tests_test_signal_reemit_LDADD = $(LIBGLOM_LIBS) tests_test_signal_reemit_CPPFLAGS = $(tests_cppflags) tests_python_test_load_python_library_SOURCES = tests/python/test_load_python_library.cc tests_python_test_load_python_library_LDADD = $(LIBGLOM_LIBS) $(DL_LIB) tests_python_test_load_python_library_CPPFLAGS = $(tests_cppflags) tests_python_test_python_module_SOURCES = tests/python/test_python_module.cc tests_python_test_python_module_LDADD = $(tests_ldadd) $(PYTHON_LIBS) tests_python_test_python_module_CPPFLAGS = $(tests_cppflags) # Distribute the tests data: dist_noinst_DATA = \ tests/import/data/albums.csv \ tests/translations_po/data/test.po \ tests/test_image.jpg # Let the .cc source code know about this path: glom_test_import_defines = -DGLOM_TESTS_IMPORT_DATA_NOTINSTALLED=\""$(abs_top_srcdir)/tests/import/data/"\" glom_test_image_defines = -DGLOM_TESTS_IMAGE_DATA_NOTINSTALLED=\""$(abs_top_srcdir)/tests/"\" # Let the .cc source code know about this path: glom_test_translations_po_defines = -DGLOM_TESTS_TRANSLATIONS_PO_DATA_NOTINSTALLED=\""$(abs_top_srcdir)/tests/translations_po/data/"\" tests_import_test_parsing_SOURCES = \ glom/import_csv/csv_parser.cc \ glom/import_csv/csv_parser.h \ tests/import/utils.cc\ tests/import/utils.h\ tests/import/test_parsing.cc tests_import_test_parsing_LDADD = $(tests_ldadd) tests_import_test_parsing_CPPFLAGS = $(tests_cppflags) $(glom_test_import_defines) tests_import_test_signals_SOURCES = \ glom/import_csv/csv_parser.cc \ glom/import_csv/csv_parser.h \ tests/import/utils.cc\ tests/import/utils.h\ tests/import/test_signals.cc tests_import_test_signals_LDADD = $(tests_ldadd) tests_import_test_signals_CPPFLAGS = $(tests_cppflags) tests_translations_po_test_document_export_po_SOURCES = \ tests/translations_po/test_document_export_po.cc tests_translations_po_test_document_export_po_LDADD = $(tests_ldadd) tests_translations_po_test_document_export_po_CPPFLAGS = $(tests_cppflags) tests_translations_po_test_document_import_po_SOURCES = \ tests/translations_po/test_document_import_po.cc tests_translations_po_test_document_import_po_LDADD = $(tests_ldadd) tests_translations_po_test_document_import_po_CPPFLAGS = $(tests_cppflags) $(glom_test_translations_po_defines) # Note that wherever we use this we must also use glom_test_image_defines. sources_test_utils = tests/test_utils.h \ tests/test_utils.cc sources_test_selfhosting_utils = tests/test_selfhosting_utils.h \ tests/test_selfhosting_utils.cc tests_test_fake_connection_SOURCES = tests/test_fake_connection.cc tests_test_fake_connection_LDADD = $(tests_ldadd) tests_test_fake_connection_CPPFLAGS = $(tests_cppflags) tests_test_script_check_for_problems_SOURCES = tests/test_script_check_for_problems.cc tests_test_script_check_for_problems_LDADD = $(tests_ldadd) tests_test_script_check_for_problems_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_empty_SOURCES = tests/test_selfhosting_new_empty.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_empty_LDADD = $(tests_ldadd) tests_test_selfhosting_new_empty_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_empty_change_sysprefs_SOURCES = tests/test_selfhosting_new_empty_change_sysprefs.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_empty_change_sysprefs_LDADD = $(tests_ldadd) tests_test_selfhosting_new_empty_change_sysprefs_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_empty_then_users_SOURCES = tests/test_selfhosting_new_empty_then_users.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_empty_then_users_LDADD = $(tests_ldadd) tests_test_selfhosting_new_empty_then_users_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_from_example_SOURCES = tests/test_selfhosting_new_from_example.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_from_example_LDADD = $(tests_ldadd) tests_test_selfhosting_new_from_example_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_from_example_operator_SOURCES = tests/test_selfhosting_new_from_example_operator.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_from_example_operator_LDADD = $(tests_ldadd) tests_test_selfhosting_new_from_example_operator_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_from_example_strangepath_SOURCES = tests/test_selfhosting_new_from_example_strangepath.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_from_example_strangepath_LDADD = $(tests_ldadd) tests_test_selfhosting_new_from_example_strangepath_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_then_report_SOURCES = tests/test_selfhosting_new_then_report.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_then_report_LDADD = $(tests_ldadd) tests_test_selfhosting_new_then_report_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_then_report_summary_SOURCES = tests/test_selfhosting_new_then_report_summary.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_then_report_summary_LDADD = $(tests_ldadd) tests_test_selfhosting_new_then_report_summary_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_then_image_SOURCES = tests/test_selfhosting_new_then_image.cc $(sources_test_selfhosting_utils) $(sources_test_utils) tests_test_selfhosting_new_then_image_LDADD = $(tests_ldadd) tests_test_selfhosting_new_then_image_CPPFLAGS = $(tests_cppflags) $(glom_test_image_defines) tests_test_selfhosting_new_then_lookup_SOURCES = tests/test_selfhosting_new_then_lookup.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_then_lookup_LDADD = $(tests_ldadd) tests_test_selfhosting_new_then_lookup_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_then_choices_SOURCES = tests/test_selfhosting_new_then_choices.cc $(sources_test_selfhosting_utils) $(sources_test_utils) tests_test_selfhosting_new_then_choices_LDADD = $(tests_ldadd) tests_test_selfhosting_new_then_choices_CPPFLAGS = $(tests_cppflags) $(glom_test_image_defines) tests_test_selfhosting_new_then_backup_restore_SOURCES = tests/test_selfhosting_new_then_backup_restore.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_then_backup_restore_LDADD = $(tests_ldadd) tests_test_selfhosting_new_then_backup_restore_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_then_get_privs_SOURCES = tests/test_selfhosting_new_then_get_privs.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_then_get_privs_LDADD = $(tests_ldadd) tests_test_selfhosting_new_then_get_privs_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_then_alter_table_SOURCES = tests/test_selfhosting_new_then_alter_table.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_then_alter_table_LDADD = $(tests_ldadd) tests_test_selfhosting_new_then_alter_table_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_new_then_change_columns_SOURCES = tests/test_selfhosting_new_then_change_columns.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_new_then_change_columns_LDADD = $(tests_ldadd) tests_test_selfhosting_new_then_change_columns_CPPFLAGS = $(tests_cppflags) tests_test_selfhosting_sqlinjection_SOURCES = tests/test_selfhosting_sqlinjection.cc $(sources_test_selfhosting_utils) tests_test_selfhosting_sqlinjection_LDADD = $(tests_ldadd) tests_test_selfhosting_sqlinjection_CPPFLAGS = $(tests_cppflags) # Tests of code used by the application, # and not just the library or the command-line utilities. if GLOM_ENABLE_UI # TODO: Shouldn't test_pyembed be non-UI? check_PROGRAMS += \ glom/utility_widgets/test_flowtable \ glom/utility_widgets/eggspreadtablemm/test_spreadtablednd \ glom/test_pyembed \ tests/test_glade_derived_instantiation \ tests/glade_toplevels_instantiation \ tests/python/test_python_execute_func \ tests/python/test_python_execute_func_bad_syntax \ tests/python/test_python_execute_func_date \ tests/python/test_python_execute_func_change_result_type \ tests/python/test_python_execute_func_with_record \ tests/python/test_python_execute_script \ tests/test_iso_codes # glom/mode_data/test_flowtablewithfields # glom/utility_widgets/canvas/test_canvas_editable TESTS += \ tests/python/test_python_execute_func \ tests/python/test_python_execute_func_bad_syntax \ tests/python/test_python_execute_func_date \ tests/python/test_python_execute_func_change_result_type \ tests/python/test_python_execute_func_with_record \ tests/python/test_python_execute_script \ tests/test_iso_codes # Note that test_glom_date_in_locales.sh requires us to have certain locales # installed and configured. # Also note: This is only in the UI tests because it use the glom executable, # and GtkApplication will not let us handle the command-line argument # before initializing GTK+. See the comments in the code. # Some continuous-integration systems won't have an X server, # so they will want to disable these in configure. if GLOM_ENABLE_UI_TESTS TESTS += \ tests/test_glade_toplevels_instantiation.sh \ tests/test_glade_derived_instantiation \ tests/test_glom_date_in_locales.sh endif #GLOM_ENABLE_UI_TESTS glom_utility_widgets_test_flowtable_SOURCES = \ glom/utility_widgets/flowtable.cc \ glom/utility_widgets/flowtable.h \ $(glom_eggspreadtable_files) \ glom/utility_widgets/test_flowtable.cc glom_utility_widgets_test_flowtable_LDADD = $(GLOM_LIBS) glom_utility_widgets_test_flowtable_CPPFLAGS = $(tests_cppflags_ui) glom_utility_widgets_eggspreadtablemm_test_spreadtablednd_SOURCES = \ $(glom_eggspreadtable_files) \ glom/utility_widgets/eggspreadtablemm/test_spreadtablednd.cc glom_utility_widgets_eggspreadtablemm_test_spreadtablednd_LDADD = $(GLOM_LIBS) glom_utility_widgets_eggspreadtablemm_test_spreadtablednd_CPPFLAGS = $(tests_cppflags_ui) # Disabled because it slows down the build, because it builds all Glom files again, using its own flags: #glom_utility_widgets_canvas_test_canvas_editable_SOURCES = \ # $(glom_source_files) \ # glom/utility_widgets/canvas/test_canvas_editable.cc #glom_utility_widgets_canvas_test_canvas_editable_LDADD = $(glom_all_libs) #glom_utility_widgets_canvas_test_canvas_editable_CPPFLAGS = $(tests_cppflags_ui) # Disabled because it slows down the build, because it builds all Glom files again, using its own flags: #glom_mode_data_test_flowtablewithfields_SOURCES = \ # $(glom_source_files) \ # glom/mode_data/test_flowtablewithfields.cc #glom_mode_data_test_flowtablewithfields_LDADD = $(glom_all_libs) #glom_mode_data_test_flowtablewithfields_CPPFLAGS = $(tests_cppflags_ui) tests_python_test_python_execute_func_SOURCES = tests/python/test_python_execute_func.cc \ glom/python_embed/glom_python.cc tests_python_test_python_execute_func_LDADD = $(tests_ldadd) $(GLOM_LIBS) $(PYTHON_LIBS) tests_python_test_python_execute_func_CPPFLAGS = $(tests_cppflags_ui) tests_python_test_python_execute_func_CFLAGS = $(tests_cflags) tests_python_test_python_execute_func_CXXFLAGS = $(tests_cxxflags) tests_python_test_python_execute_func_bad_syntax_SOURCES = tests/python/test_python_execute_func_bad_syntax.cc \ glom/python_embed/glom_python.cc tests_python_test_python_execute_func_bad_syntax_LDADD = $(tests_ldadd) $(GLOM_LIBS) $(PYTHON_LIBS) tests_python_test_python_execute_func_bad_syntax_CPPFLAGS = $(tests_cppflags_ui) tests_python_test_python_execute_func_date_SOURCES = tests/python/test_python_execute_func_date.cc \ glom/python_embed/glom_python.cc tests_python_test_python_execute_func_date_LDADD = $(tests_ldadd) $(GLOM_LIBS) $(PYTHON_LIBS) tests_python_test_python_execute_func_date_CPPFLAGS = $(tests_cppflags_ui) tests_python_test_python_execute_func_change_result_type_SOURCES = tests/python/test_python_execute_func_change_result_type.cc \ glom/python_embed/glom_python.cc tests_python_test_python_execute_func_change_result_type_LDADD = $(tests_ldadd) $(GLOM_LIBS) $(PYTHON_LIBS) tests_python_test_python_execute_func_change_result_type_CPPFLAGS = $(tests_cppflags_ui) tests_python_test_python_execute_func_with_record_SOURCES = tests/python/test_python_execute_func_with_record.cc \ glom/python_embed/glom_python.cc tests_python_test_python_execute_func_with_record_LDADD = $(tests_ldadd) $(GLOM_LIBS) $(PYTHON_LIBS) tests_python_test_python_execute_func_with_record_CPPFLAGS = $(tests_cppflags_ui) tests_python_test_python_execute_script_SOURCES = tests/python/test_python_execute_script.cc \ glom/python_embed/glom_python.cc tests_python_test_python_execute_script_LDADD = $(tests_ldadd) $(GLOM_LIBS) $(PYTHON_LIBS) tests_python_test_python_execute_script_CPPFLAGS = $(tests_cppflags_ui) tests_test_iso_codes_SOURCES = tests/test_iso_codes.cc \ glom/mode_design/iso_codes.cc \ glom/mode_design/iso_codes.h tests_test_iso_codes_LDADD = $(tests_ldadd) $(GLOM_LIBS) tests_test_iso_codes_CPPFLAGS = $(tests_cppflags_ui) # You must remove PlaceholderGlom::get_application() to avoid having to specify # a huge set of .cc files when building this test: #glom_utility_widgets_test_flowtable_dnd_SOURCES = \ # glom/utility_widgets/flowtable.cc \ # glom/utility_widgets/flowtable.h \ # glom/utility_widgets/flowtable_dnd.cc \ # glom/utility_widgets/flowtable_dnd.h \ # glom/utility_widgets/layoutwidgetutils.h \ # glom/utility_widgets/layoutwidgetutils.cc \ # glom/utility_widgets/layoutwidgetbase.h \ # glom/utility_widgets/layoutwidgetbase.cc \ # glom/utility_widgets/placeholder-glom.h \ # glom/utility_widgets/placeholder-glom.cc \ # glom/utility_widgets/test_flowtable_dnd.cc tests_test_glade_derived_instantiation_SOURCES = tests/test_glade_derived_instantiation.cc $(glom_source_files) tests_test_glade_derived_instantiation_LDADD = $(glom_all_libs) tests_test_glade_derived_instantiation_CPPFLAGS = $(tests_cppflags_ui) tests_glade_toplevels_instantiation_SOURCES = tests/glade_toplevels_instantiation.cc tests_glade_toplevels_instantiation_LDADD = $(tests_ldadd) $(GLOM_LIBS) tests_glade_toplevels_instantiation_CPPFLAGS = $(tests_cppflags_ui) glom_test_pyembed_SOURCES = glom/test_pyembed.cc glom_test_pyembed_LDADD = $(LIBGLOM_LIBS) $(PYTHON_LIBS) glom_test_pyembed_CPPFLAGS = $(tests_cppflags_ui) endif #GLOM_ENABLE_UI glom-1.22.4/glom/0000755000175000017500000000000012235000127014712 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/glom_export_po.cc0000644000175000017500000001656512234776363020320 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ // For instance: // glom_export_po /opt/gnome30/share/doc/glom/examples/example_music_collection.glom --output-path="/home/someone/something.po" #include "config.h" #include #include #include #include #include #include #include #include #include class GlomCreateOptionGroup : public Glib::OptionGroup { public: GlomCreateOptionGroup(); //These instances should live as long as the OptionGroup to which they are added, //and as long as the OptionContext to which those OptionGroups are added. std::string m_arg_filepath_output; Glib::ustring m_arg_locale_id; bool m_arg_template; bool m_arg_version; }; GlomCreateOptionGroup::GlomCreateOptionGroup() : Glib::OptionGroup("glom_export_po", _("Glom options"), _("Command-line options")), m_arg_version(false) { Glib::OptionEntry entry; entry.set_long_name("output-path"); entry.set_short_name('o'); entry.set_description(_("The path at which to save the created .po file, such as /home/someuser/somefile.po .")); add_entry_filename(entry, m_arg_filepath_output); entry.set_long_name("locale-id"); entry.set_short_name('l'); entry.set_description(_("The locale whose translations should be written to the .po file, such as de_DE.")); add_entry(entry, m_arg_locale_id); entry.set_long_name("template"); entry.set_short_name('t'); entry.set_description(_("Generate a .pot template file instead of a .po file for a locale.")); add_entry(entry, m_arg_template); entry.set_long_name("version"); entry.set_short_name('V'); entry.set_description(_("The version of this application.")); add_entry(entry, m_arg_version); } int main(int argc, char* argv[]) { bindtextdomain(GETTEXT_PACKAGE, GLOM_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); // Set the locale for any streams to the user's current locale, // We should not rely on the default locale of // any streams (we should always do an explicit imbue()), // but this is maybe a good default in case we forget. try { std::locale::global(std::locale("")); } catch(const std::runtime_error& ex) { //This has been known to throw an exception at least once: //https://bugzilla.gnome.org/show_bug.cgi?id=619445 //This should tell us what the problem is: std::cerr << G_STRFUNC << ": exception from std::locale::global(std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } Glom::libglom_init(); Glib::OptionContext context; GlomCreateOptionGroup group; context.set_main_group(group); try { context.parse(argc, argv); } catch(const Glib::OptionError& ex) { std::cout << _("Error while parsing command-line options: ") << std::endl << ex.what() << std::endl; std::cout << _("Use --help to see a list of available command-line options.") << std::endl; return 0; } catch(const Glib::Error& ex) { std::cout << "Error: " << ex.what() << std::endl; return 0; } if(group.m_arg_version) { std::cout << PACKAGE_STRING << std::endl; return 0; } // Get a URI for a glom file: Glib::ustring input_uri; // The GOption documentation says that options without names will be returned to the application as "rest arguments". // I guess this means they will be left in the argv. Murray. if(input_uri.empty() && (argc > 1)) { const char* pch = argv[1]; if(pch) input_uri = pch; } if(input_uri.empty()) { std::cerr << _("Please specify a glom file.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } if(group.m_arg_locale_id.empty() && !(group.m_arg_template)) { std::cerr << _("Please use either the --locale-id option or the --template option.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Get a URI (file://something) from the filepath: Glib::RefPtr file_input = Gio::File::create_for_commandline_arg(input_uri); //Make sure it is really a URI: input_uri = file_input->get_uri(); if(!file_input->query_exists()) { std::cerr << _("Glom: The file does not exist.") << std::endl; std::cerr << "uri: " << input_uri << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } const Gio::FileType file_type = file_input->query_file_type(); if(file_type == Gio::FILE_TYPE_DIRECTORY) { std::cerr << _("Glom: The file path is a directory instead of a file.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Check the output path: if(group.m_arg_filepath_output.empty()) { std::cerr << _("Please specify an output path.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Get a URI (file://something) from the filepath: Glib::RefPtr file_output = Gio::File::create_for_commandline_arg(group.m_arg_filepath_output); const Glib::ustring ouput_uri = file_output->get_uri(); /* Silently overwriting is easier when we use this in a batch: if(file_output->query_exists()) { std::cerr << _("Glom: The output file aready exists.") << std::endl; std::cerr << "uri: " << ouput_uri << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } */ // Load the document: Glom::Document document; document.set_file_uri(input_uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } if(group.m_arg_template) { const bool succeeded = Glom::write_pot_file(&document, ouput_uri); if(!succeeded) { std::cerr << _("Pot file creation failed.") << std::endl; return EXIT_FAILURE; } std::cout << Glib::ustring::compose(_("Pot file created at: %1"), ouput_uri) << std::endl; } else { const bool succeeded = Glom::write_translations_to_po_file(&document, ouput_uri, group.m_arg_locale_id); if(!succeeded) { std::cerr << _("Po file creation failed.") << std::endl; return EXIT_FAILURE; } std::cout << Glib::ustring::compose(_("Po file created at: %1"), ouput_uri) << std::endl; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/glom/notebook_glom.cc0000644000175000017500000000715212234776363020111 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "notebook_glom.h" #include "appwindow.h" namespace Glom { Notebook_Glom::Notebook_Glom() { m_uiPreviousPage = 0; //Connect signals: //We do this on on_show() instead, because otherwise GtkNotebook emits the signal (and we catch it) during show: //signal_switch_page().connect(sigc::mem_fun(*this, &Notebook_Glom::on_switch_page_handler)); //signal_leave_page().connect(sigc::mem_fun(*this, &Notebook_Glom::on_leave_page)); m_destructor_in_progress = false; } Notebook_Glom::~Notebook_Glom() { } void Notebook_Glom::on_show() { NotebookNoFrame::on_show(); //We do this only in on_show() because otherwise GtkNotebook emits the signal (and we catch it) during show: if(!m_connection_switch_page) m_connection_switch_page = signal_switch_page().connect(sigc::mem_fun(*this, &Notebook_Glom::on_switch_page_handler)); } /* Notebook_Glom::type_signal_leave_page Notebook_Glom::signal_leave_page() { return m_signal_leave_page; } */ void Notebook_Glom::on_switch_page_handler(Gtk::Widget* /* pPage */, guint uiPageNumber) { //Remove the help hint for the previous page: Gtk::Window* pApp = get_app_window(); //if(pAppGlom) //{ // pAppGlom->statusbar_clear(); // } //m_signal_leave_page.emit(m_uiPreviousPage); m_uiPreviousPage = uiPageNumber; //Remember the current page for next time. //Load the page as we enter it: Gtk::Widget* pChild = get_nth_page(uiPageNumber); if(pChild) { Box_WithButtons* pBox = dynamic_cast(pChild); if(pBox) { //pBox->load_from_document(); //Set the default button, if there is one: AppWindow* pAppGlom = dynamic_cast(pApp); if(pAppGlom) { Gtk::Widget* default_button = pBox->get_default_button(); if(default_button) { default_button->grab_default(); pAppGlom->set_default(*default_button); } else pAppGlom->unset_default(); } } } } void Notebook_Glom::on_leave_page(guint uiPageNumber) { //Call base class: //NotebookNoFrame::on_leave_page(uiPageNumber); //Tell the page to save itself: if(!m_destructor_in_progress) { Gtk::Widget* pChild = get_nth_page(uiPageNumber); if(pChild) { Base_DB* pBox = dynamic_cast(pChild); if(pBox) { pBox->save_to_document(); } } } } Gtk::Window* Notebook_Glom::get_app_window() { return dynamic_cast(get_toplevel()); } /* void Notebook_Glom::show_hint() { int iPageCurrent = get_current_page(); Gtk::Widget* pChild = get_nth_page(iPageCurrent); if(pChild) { Box_WithButtons* pBox = dynamic_cast(pChild); if(pBox) pBox->show_hint(); } } */ void Notebook_Glom::do_menu_developer_layout() { //Override this. } void Notebook_Glom::do_menu_file_print() { //Override this. } } //namespace Glom glom-1.22.4/glom/python_embed/0000755000175000017500000000000012235000126017366 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/python_embed/glom_python.h0000644000175000017500000000527712234252646022130 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PYTHON_H #define GLOM_PYTHON_H #include #include #include #include namespace Glom { /** Check that Python can really import the Glom module, * as a runtime sanity check. */ bool glom_python_module_is_available(); /** Check that Python can really import the gi.repository module, * as a runtime sanity check. */ bool gir_python_module_is_available(); /** Check that Python can really import the gda module, * as a runtime sanity check. */ bool gda_python_module_is_available(); typedef std::map type_map_fields; /** Run a script, ignoring the python return value. * The record object will be writable and the function will receive a ui * parameter so it can control navigation in the UI. */ void glom_execute_python_function_implementation(const Glib::ustring& func_impl, const type_map_fields& field_values, Document* pDocument, const Glib::ustring& table_name, const sharedptr& key_field, const Gnome::Gda::Value& key_field_value, const Glib::RefPtr& opened_connection, const PythonUICallbacks& callbacks, Glib::ustring& error_message); /** Run a python calculation, returning the python return value. * @param for_script: If this is true then the record object will be writable, * and the function will receive a ui parameter so it can control navigation in the UI. */ Gnome::Gda::Value glom_evaluate_python_function_implementation(Field::glom_field_type result_type, const Glib::ustring& func_impl, const type_map_fields& field_values, Document* pDocument, const Glib::ustring& table_name, const sharedptr& key_field, const Gnome::Gda::Value& key_field_value, const Glib::RefPtr& opened_connection, Glib::ustring& error_message); } //namespace Glom #endif //GLOM_PYTHON_H glom-1.22.4/glom/python_embed/glom_python.cc0000644000175000017500000004130712234776363022267 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" //We need to include this before anything else, to avoid redefinitions: #include #include #include #include //#define NO_IMPORT_PYGOBJECT //To avoid a multiple definition in pygtk. //#include //For the PyGObject and PyGBoxed struct definitions. #include "glom_python.h" #include #include #include //For g_warning(). #include #include #include namespace Glom { static std::list ustring_tokenize(const Glib::ustring& msg, const Glib::ustring& separators, int maxParts) { std::list result; Glib::ustring str = msg; bool nocount = false; if(maxParts == -1) nocount = true; int count = 0; while(str.find(separators) != Glib::ustring::npos && (nocount? true : count!=maxParts)) { unsigned int pos = str.find(separators); Glib::ustring tmp = str.substr(0, pos); str = str.erase(0, pos + separators.size()); result.push_back(tmp); count++; } result.push_back(str); return result; } // Use this for errors not (directly) caused by the user static void HandlePythonError() { if(PyErr_Occurred()) PyErr_Print(); } // Show python coding errors of the user static Glib::ustring get_traceback() { // Python equivilant: // import traceback, sys // return "".join(traceback.format_exception(sys.exc_type, // sys.exc_value, sys.exc_traceback)) PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); if(!traceback) { std::cerr << "traceback = 0" << std::endl; } PyObject *tracebackModule = PyImport_ImportModule((char*)"traceback"); gchar* chrRetval = 0; if(tracebackModule) { PyObject* tbList = PyObject_CallMethod( tracebackModule, (char*)"format_exception", (char*)"OOO", type, value == 0 ? Py_None : value, traceback == 0 ? Py_None : traceback); if(!tbList) { std::cerr << "Glom: format_exception failed while trying to show Python TraceBack." << std::endl; return ""; } boost::python::str emptyString(""); PyObject* strRetval = PyObject_CallMethod(emptyString.ptr(), (char*)"join", (char*)"O", tbList); if(strRetval) chrRetval = g_strdup(PyString_AsString(strRetval)); Py_DECREF(tbList); if(strRetval) { Py_DECREF(strRetval); } Py_DECREF(tracebackModule); } else { std::cerr << "Unable to import traceback module." << std::endl; } Py_DECREF(type); Py_XDECREF(value); Py_XDECREF(traceback); Glib::ustring result; if(chrRetval) { result = chrRetval; g_free(chrRetval); } return result; } static void ShowTrace() { std::cerr << "Glom: Python Error:" << std::endl << get_traceback() << std::endl; } /** Import a python module, warning about exceptions. * Compare with boost::python::object() to detect failure. */ static boost::python::object import_module(const char* name) { boost::python::object module_glom; //Defaults to PyNone. try { module_glom = boost::python::import(name); } catch(const boost::python::error_already_set& ex) { std::cerr << "boost::python::import() failed while importing module: "<< name << std::endl; ShowTrace(); } if(module_glom == boost::python::object()) { std::cerr << "Glom: A python import of a module failed: " << name << std::endl; } return module_glom; } bool glom_python_module_is_available() { const char* name = "glom_" GLOM_ABI_VERSION_UNDERLINED; const boost::python::object module_glom = import_module(name); return module_glom != boost::python::object(); } bool gir_python_module_is_available() { const char* name = "gi.repository"; const boost::python::object module_glom = import_module(name); return module_glom != boost::python::object(); } bool gda_python_module_is_available() { const char* name = "gi.repository.Gda"; const boost::python::object module_glom = import_module(name); return module_glom != boost::python::object(); } static boost::python::object glom_python_call(Field::glom_field_type result_type, Document* pDocument, const Glib::ustring& func_impl, Glib::ustring& error_message, const boost::python::object& param1, const boost::python::object& param2 = boost::python::object()) { //std::cout << "glom_evaluate_python_function_implementation()" << std::endl; //for(type_map_fields::const_iterator iter = field_values.begin(); iter != field_values.end(); ++iter) //{ // std::cout << " field_value: name=" << iter->first << ", value=" << iter->second.to_string() << std::endl; //} g_assert(result_type != Field::TYPE_INVALID); //g_warning("glom_evaluate_python_function_implementation: func=%s", func_impl.c_str()); Gnome::Gda::Value valueResult; Glib::ustring func_def; //Indent the function implementation (required by python syntax): typedef std::list type_listStrings; type_listStrings listStrings = ustring_tokenize(func_impl, "\n", -1); for(type_listStrings::const_iterator iter = listStrings.begin(); iter != listStrings.end(); ++iter) { func_def += " " + *iter + '\n'; } //prefix the def line: const Glib::ustring func_name = "glom_calc_field_value"; Glib::ustring func_signature; if(!param2.ptr()) func_signature = func_name + "(record)"; else func_signature = func_name + "(record, ui)"; func_def = "def " + func_signature + ":\n import glom_" GLOM_ABI_VERSION_UNDERLINED "\n from gi.repository import Gda\n" + func_def; //We did this in main(): Py_Initialize(); boost::python::object pMain = import_module("__main__"); boost::python::object pDict(pMain.attr("__dict__")); //TODO: Does boost::python have an equivalent for PyModule_GetDict()? //TODO: Complain that this doesn't work: //boost::python::dict pDict = pMain.attr("__dict__"); //TODO: Does boost::python have an equivalent for PyModule_GetDict()? if(!pDict) { std::cerr << G_STRFUNC << ": pDict is null" << std::endl; error_message = get_traceback(); return boost::python::object(); } //Allow the function to import from our script library: if(pDocument) { const std::vector module_names = pDocument->get_library_module_names(); for(std::vector::const_iterator iter = module_names.begin(); iter != module_names.end(); ++iter) { const Glib::ustring name = *iter; const Glib::ustring script = pDocument->get_library_module(name); if(!name.empty() && !script.empty()) { //TODO: Is there a boost::python equivalent for Py_CompileString()? PyObject* cObject = Py_CompileString(script.c_str(), name.c_str() /* "filename", for debugging info */, Py_file_input /* "start token" for multiple lines of code. */); //Returns a reference. boost::python::object objectCompiled( (boost::python::handle<>(cObject)) ); //Takes the reference. if(!objectCompiled.ptr()) //TODO: We'd probably have an exception instead if we don't use boost's allow_null. HandlePythonError(); PyObject* cObjectExeced = PyImport_ExecCodeModule(const_cast(name.c_str()), cObject); //Returns a reference. //This should make it importable. boost::python::object objectExeced( (boost::python::handle<>(cObjectExeced)) ); //Takes the reference. if(!objectExeced.ptr()) HandlePythonError(); //TODO: When do these stop being importable? Should we unload them somehow later? } } } //TODO: Is this necessary? boost::python::object module_glom = import_module("glom_" GLOM_ABI_VERSION_UNDERLINED); if(module_glom == boost::python::object()) { g_warning("Could not import python glom module."); return boost::python::object(); // don't crash } //TODO: Is this necessary? boost::python::object module_gda = import_module("gi.repository.Gda"); if(module_gda == boost::python::object()) { g_warning("Could not import python gi.repository.Gda module."); return boost::python::object(); } //Create the function definition: /* boost::python::object pyValue; try { pyValue = boost::python::eval(func_def.c_str(), pDict, pDict); //TODO: This throws. } catch(const boost::python::error_already_set& ex) { std::cerr << "Glom: boost::python::eval() threw boost::python_error_already_set." << std::endl; HandlePythonError(); } */ //TODO: Complain that exec(std::string(something), pMain) doesn't work. boost::python::object pyValue; try { //TODO: The second dict is optional, and the documentation suggests using pMain as the first argument, but you'll get a //"TypeError: 'module' object does not support item assignment" error if you omit it. //TODO: Make sure that's documented. pyValue = boost::python::exec(func_def.c_str(), pDict, pDict); } catch(const boost::python::error_already_set& ex) { std::cerr << G_STRFUNC << ": boost::python::exec() threw error_already_set when using text= " << std::endl << func_def << std::endl; error_message = get_traceback(); return boost::python::object(); } if(!pyValue.ptr()) { std::cerr << G_STRFUNC << ": boost::python::exec failed." << std::endl; error_message = get_traceback(); return boost::python::object(); } //Call the function: boost::python::object pFunc; try { pFunc = pDict[func_name.c_str()]; } catch(const boost::python::error_already_set& ex) { std::cerr << G_STRFUNC << ": pDict[func_name] threw error_already_set when func_name= " << std::endl << func_name << std::endl; error_message = get_traceback(); return boost::python::object(); } if(!pFunc.ptr()) { std::cerr << G_STRFUNC << ": pDict[func_name] failed." << std::endl; HandlePythonError(); return boost::python::object(); } if(!PyCallable_Check(pFunc.ptr())) { HandlePythonError(); g_warning("pFunc is not callable."); return boost::python::object(); } //Call the function with the parameters: boost::python::object pyResultCpp; try { if(!param2.ptr()) { pyResultCpp = pFunc(param1); } else { pyResultCpp = pFunc(param1, param2); } } catch(const boost::python::error_already_set& ex) { std::cerr << "Glom: Exception caught from pFunc(objRecord). func_name=" << std::endl << func_name << std::endl; error_message = get_traceback(); //std::cerr << " traceback=" << error_message << std::endl; } if(!(pyResultCpp.ptr())) { g_warning("pyResult.ptr() was null"); HandlePythonError(); } //TODO: Why do we do this? Py_FlushLine(); PyErr_Clear(); //We did this in main(): Py_Finalize(); return pyResultCpp; } void glom_execute_python_function_implementation(const Glib::ustring& func_impl, const type_map_fields& field_values, Document* pDocument, const Glib::ustring& table_name, const sharedptr& key_field, const Gnome::Gda::Value& key_field_value, const Glib::RefPtr& opened_connection, const PythonUICallbacks& callbacks, Glib::ustring& error_message) { //Import the glom module so that boost::python::object(new PyGlomRecord) can work. boost::python::object module_glom = import_module("glom_" GLOM_ABI_VERSION_UNDERLINED); if(module_glom == boost::python::object()) { g_warning("Could not import python glom module."); return; // don't crash } boost::python::object objRecord(new PyGlomRecord); boost::python::extract extractor(objRecord); if(!extractor.check()) { std::cerr << ("extract failed.") << std::endl; } PyGlomRecord* pParam = extractor; if(pParam) { //Fill the record's details: pParam->set_fields(field_values, pDocument, table_name, key_field, key_field_value, opened_connection); pParam->set_read_only(); } //Pass an additional ui parameter for use by scripts: boost::python::object objUI(new PyGlomUI(callbacks)); glom_python_call(Field::TYPE_TEXT, pDocument, func_impl, error_message, objRecord, objUI); } Gnome::Gda::Value glom_evaluate_python_function_implementation(Field::glom_field_type result_type, const Glib::ustring& func_impl, const type_map_fields& field_values, Document* pDocument, const Glib::ustring& table_name, const sharedptr& key_field, const Gnome::Gda::Value& key_field_value, const Glib::RefPtr& opened_connection, Glib::ustring& error_message) { //Import the glom module so that boost::python::object(new PyGlomRecord) can work. boost::python::object module_glom = import_module("glom_" GLOM_ABI_VERSION_UNDERLINED); if(module_glom == boost::python::object()) { g_warning("Could not import python glom module."); return Gnome::Gda::Value(); // don't crash } boost::python::object objRecord(new PyGlomRecord); boost::python::extract extractor(objRecord); if(!extractor.check()) { std::cerr << ("extract failed.") << std::endl; return Gnome::Gda::Value(); } PyGlomRecord* pParam = extractor; if(pParam) { //Fill the record's details: pParam->set_fields(field_values, pDocument, table_name, key_field, key_field_value, opened_connection); } const boost::python::object pyResultCpp = glom_python_call(result_type, pDocument, func_impl, error_message, objRecord); //Deal with the various possible return types: Gnome::Gda::Value valueResult; bool object_is_gda_value = false; GValue value = {0, {{0}}}; const bool test = glom_pygda_value_from_pyobject(&value, pyResultCpp); if(test) object_is_gda_value = true; if(object_is_gda_value && G_IS_VALUE(&value)) { valueResult = Gnome::Gda::Value(&value); if(valueResult.get_value_type() == 0) { std::cerr << G_STRFUNC << ": valueResult (before convert_value()) has a GType of 0 before convert_value()." << std::endl; } //Make sure that the value is of the expected Gda type: //TODO_Performance: valueResult = Glom::Conversions::convert_value(valueResult, result_type); if(valueResult.get_value_type() == 0) { std::cerr << G_STRFUNC << ": valueResult has a GType of 0 after convert_value()." << std::endl; } //std::cout << "debug: " << G_STRFUNC << ": valueResult Gda type=" << g_type_name(valueResult.get_value_type()) << std::endl; g_value_unset(&value); } else { //g_warning("debug: pyResult is not a gda.value"); //For instance, if one of the fields was empty, then the calculation might want to return an empty value, //instead of returning 0. if(pyResultCpp == boost::python::object()) //Check if it is PyNone { //The result should be an appropriate empty value for this field type: valueResult = Conversions::get_empty_value(result_type); //std::cout << "debug: " << G_STRFUNC << ": empty value Gda type=" << g_type_name(valueResult.get_value_type()) << std::endl; } else { //TODO: Handle numeric/date/time types: //(though I don't think this code is ever reached. murrayc) //Treat this as a string or something that can be converted to a string: const char* pchResult = 0; try { pchResult = boost::python::extract(pyResultCpp); } catch(const boost::python::error_already_set& ex) { std::cerr << "Glom: Exception caught from boost::python::extract() while converting result to a const char*." << std::endl; ShowTrace(); return valueResult; } if(pchResult) { bool success = false; valueResult = Conversions::parse_value(result_type, pchResult, success, true /* iso_format */); std::cout << "debug: " << G_STRFUNC << ": parsed value Gda type=" << g_type_name(valueResult.get_value_type()) << std::endl; } else HandlePythonError(); } } return valueResult; } } //namespace Glom glom-1.22.4/glom/python_embed/python_ui_callbacks.cc0000644000175000017500000000437212234252646023737 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { AppPythonUICallbacks::AppPythonUICallbacks() { m_slot_show_table_details = sigc::mem_fun(*this, &AppPythonUICallbacks::on_show_table_details); m_slot_show_table_list = sigc::mem_fun(*this, &AppPythonUICallbacks::on_show_table_list); m_slot_print_report = sigc::mem_fun(*this, &AppPythonUICallbacks::on_print_report); m_slot_print_layout = sigc::mem_fun(*this, &AppPythonUICallbacks::on_print_layout); m_slot_start_new_record = sigc::mem_fun(*this, &AppPythonUICallbacks::on_start_new_record); } void AppPythonUICallbacks::on_show_table_details(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value) { AppWindow* app = AppWindow::get_appwindow(); if(app) app->show_table_details(table_name, primary_key_value); } void AppPythonUICallbacks::on_show_table_list(const Glib::ustring& table_name) { AppWindow* app = AppWindow::get_appwindow(); if(app) app->show_table_list(table_name); } void AppPythonUICallbacks::on_print_report(const Glib::ustring& report_name) { AppWindow* app = AppWindow::get_appwindow(); if(app) app->print_report(report_name); } void AppPythonUICallbacks::on_print_layout() { AppWindow* app = AppWindow::get_appwindow(); if(app) app->print_layout(); } void AppPythonUICallbacks::on_start_new_record() { AppWindow* app = AppWindow::get_appwindow(); if(app) app->start_new_record(); } } //namespace Glom glom-1.22.4/glom/python_embed/python_module/0000755000175000017500000000000012235000126022254 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/python_embed/python_module/py_glom_module.cc0000644000175000017500000002176112234776363025633 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" //We need to include this before anything else, to avoid redefinitions: #include #include #include #include #include using namespace Glom; BOOST_PYTHON_MODULE(glom_1_22) { boost::python::docstring_options doc_options( true, // show the docstrings from here false, // don't show Python signatures. false); // Don't mention the C++ method signatures in the generated docstrings. // Note: Our python docstring documentation is in ReStructuredText format, // because we use sphinx to generate the API reference documentation. // However, sphinx does not seem to allow us to use regular reStructuredText // - section headings // - :: at the end of a paragraph, instead of on a separate line. // TODO: Add # targets so we can link directly to parts such as Testing for Empty Values // TODO: We can't seem to use reStuctureText sections. boost::python::class_("Record", "This is the current record of the current table. A :class:`Record` object is passed to field calculations and button scripts, providing access to the values of the fields in that record. The :class:`Record` object passed to field calculations is read-only.\n" "\n" "Field values\n" " Use record['field_name'] to get the value of a specified field in the current record. For instance, this concatenates the values of the name_first and name_last fields in the current record.\n" " ::\n" "\n" " record['name_first'] + ' ' + record['name_last']\n" "\n" " You may also use this syntax to set the value of a field in the current record. This is possible in a button script, but not in a field calculation. For instance, this sets the value of the name_first field in the current record.\n" " ::\n" "\n" " record['name_first'] = 'Bob'\n" "\n" "Related Records\n" " Use the :attr:`related` attribute to access related records via a relationship." "\n" "Testing for Empty Values\n" " How you test for empty values depends on the type of field.\n" "\n" " Non-Text Fields\n" " Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0. You can test whether a field is empty by using Python's None. For instance.\n" " ::\n" "\n" " if(record['contact_id'] == None):\n" " return 'No Contact'\n" " else:\n" " return record.related['contacts']['name_full']\n" "\n" " Text Fields\n" " For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance:\n" " ::\n" "\n" " if(record['name_full'] == ''):\n" " return 'No Name'\n" " else:\n" " return record['name_full']\n") // boost::python doesn't mention the property types in the generated docstring, // so we must mention it in the properties' docstring text. .add_property("table_name", &PyGlomRecord::get_table_name, "The name of the current table as a string.") .add_property("connection", &PyGlomRecord::get_connection, "The current database connection for use with the gi.repository.Gda API. This is a :class:`Gda.Connection` object.") .add_property("related", &PyGlomRecord::get_related, ":class:`Related` records. Use the ['relationship_name'] notation with this object.") // These can have docstring text too, but sphinx ignores it, // so we mention the [] syntax in the class docstring instead. // TODO: Ask about that / file a sphinx bug. .def("__getitem__", &PyGlomRecord::getitem) .def("__setitem__", &PyGlomRecord::setitem) .def("__len__", &PyGlomRecord::len) ; boost::python::class_("Related", "This object provides access to related records via its [] syntax, which takes a relationship name and returns a :class:`RelatedRecord`. For instance, this provides the related records for the current record, via the :attr:`Record.related` attribute\n" "::\n" "\n" " record.related['location']") .def("__getitem__", &PyGlomRelated::getitem) .def("__len__", &PyGlomRelated::len) ; boost::python::class_("RelatedRecord", "One or more related records, returned by the [] syntax on a :class:`Related` object, such as the :attr:`Record.related` attribute.\n" "\n" "Single Related Records\n" " For relationships that specify a single record, you can get the value of a field in that record by using the [] synax, providing a field name. For instance, this is the value of the name field in the table indicated by the location relationship (often called location::name).\n" " ::\n" "\n" " record.related['location']['name']\n" "\n" "Multiple Related Records\n" " For relationships that specify multiple records, you can use the aggregate functions to get overall values. For instance, this provides the sum of all total_price values from all of the lines of the current invoice record. See the :class:`RelatedRecord` class for more aggregate functions.\n" " ::\n" "\n" " record.related['invoice_lines'].sum('total_price')\n") .def("sum", &PyGlomRelatedRecord::sum, boost::python::arg("field_name"), " Add all values of the field in the related records.\n" "\n" " :param field_name: The name of the field.\n" " :type field_name: string\n" " :returns: The summarized value.") .def("count", &PyGlomRelatedRecord::sum, boost::python::arg("field_name"), " Count all values in the field in the related records.\n" "\n" " :param field_name: The name of the field.\n" " :type field_name: string\n" " :returns: The summarized value.") .def("min", &PyGlomRelatedRecord::sum, boost::python::arg("field_name"), " Minimum of all values of the field in the related records.\n" "\n" " :param field_name: The name of the field.\n" " :type field_name: string\n" " :returns: The summarized value.") .def("max", &PyGlomRelatedRecord::sum, boost::python::arg("field_name"), " Maximum of all values of the field in the related records.\n" "\n" " :param field_name: The name of the field.\n" " :type field_name: string\n" " :returns: The summarized value.") .def("__getitem__", &PyGlomRelatedRecord::getitem) .def("__len__", &PyGlomRelatedRecord::len) ; boost::python::class_("UI", "A collection of methods to programatically change the Glom UI, performing some tasks that might otherwise be done by the user via the mouse and keyboard. A :class:`UI` object is passed to button scripts, allowing them to control the user interface.") .def("show_table_details", &PyGlomUI::show_table_details, boost::python::arg("table_name"), boost::python::arg("primary_key_value"), " Navigate to the specified table, showing its details view for the specified record.\n" "\n" " :param table_name: The name of the table to navigate to.\n" " :type table_name: string\n" " :param primary_key_value: The value of the primary key field in the record to navigate to.") .def("show_table_list", &PyGlomUI::show_table_list, boost::python::arg("table_name"), " Navigate to the specified table, showing its list view.\n" "\n" " :param table_name: The name of the table to navigate to." " :type table_name: string") .def("print_layout", &PyGlomUI::print_layout, "Print the current layout for the current table.") .def("print_report", &PyGlomUI::print_report, boost::python::arg("report_name"), " Print the specified report for the current table.\n" "\n" " :param report_name: The name of the report to print.\n" " :type report_name: string") .def("start_new_record", &PyGlomUI::start_new_record, "Start a new empty record for the current table, offering the empty record in the UI.") ; } glom-1.22.4/glom/python_embed/python_module/py_glom_module.h0000644000175000017500000000272212234252646025462 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PYTHON_GLOM_MODULE_H #define GLOM_PYTHON_GLOM_MODULE_H #include #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ //#define PyMODINIT_FUNC void #endif /** * PyGlomRecord provides * - field values: for instance, name = record["name_first"]; * - relationships (PyGlomRelated): for instance, record.related * PyGlomRelated provides: * - related records (PyGlomRelatedRecord) - for instance, record.related["contacts"] * PyGlomRelatedRecord provides * - field values: for instance, name = record.related["contacts"]["name_first"]; * - Summary functions: for instance, total = record.related["invoice_lines"].sum("price"); */ #endif //GLOM_PYTHON_GLOM_MODULE_H glom-1.22.4/glom/python_embed/python_ui_callbacks.h0000644000175000017500000000270712234252646023601 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PYTHON_EMBED_UI_CALLBACKS_H #define GLOM_PYTHON_EMBED_UI_CALLBACKS_H #include namespace Glom { /** UI code should connect to the signals to respond when Python code * request a change in the UI. */ class AppPythonUICallbacks : public PythonUICallbacks { public: AppPythonUICallbacks(); private: void on_show_table_details(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value); void on_show_table_list(const Glib::ustring& table_name); void on_print_report(const Glib::ustring& report_name); void on_print_layout(); void on_start_new_record(); }; } //namespace Glom #endif //GLOM_PYTHON_GLOM_UI_H glom-1.22.4/glom/glom_import_po_all.cc0000644000175000017500000001606012234776363021127 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ // For instance: // glom_import_po_all /opt/gnome30/share/doc/glom/examples/example_music_collection.glom --input-path="/home/someone/po_Files" #include "config.h" #include #include #include #include #include #include #include #include #include #include class GlomCreateOptionGroup : public Glib::OptionGroup { public: GlomCreateOptionGroup(); //These instances should live as long as the OptionGroup to which they are added, //and as long as the OptionContext to which those OptionGroups are added. std::string m_arg_filepath_po_input; bool m_arg_version; }; GlomCreateOptionGroup::GlomCreateOptionGroup() : Glib::OptionGroup("glom_import_po_all", _("Glom options"), _("Command-line options")), m_arg_version(false) { Glib::OptionEntry entry; entry.set_long_name("input-path"); entry.set_short_name('o'); entry.set_description(_("The path to a directory containing .po files, such as /home/someuser/po_files/ .")); add_entry_filename(entry, m_arg_filepath_po_input); entry.set_long_name("version"); entry.set_short_name('V'); entry.set_description(_("The version of this application.")); add_entry(entry, m_arg_version); } int main(int argc, char* argv[]) { bindtextdomain(GETTEXT_PACKAGE, GLOM_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); // Set the locale for any streams to the user's current locale, // We should not rely on the default locale of // any streams (we should always do an explicit imbue()), // but this is maybe a good default in case we forget. try { std::locale::global(std::locale("")); } catch(const std::runtime_error& ex) { //This has been known to throw an exception at least once: //https://bugzilla.gnome.org/show_bug.cgi?id=619445 //This should tell us what the problem is: std::cerr << G_STRFUNC << ": exception from std::locale::global(std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } Glom::libglom_init(); Glib::OptionContext context; GlomCreateOptionGroup group; context.set_main_group(group); try { context.parse(argc, argv); } catch(const Glib::OptionError& ex) { std::cout << _("Error while parsing command-line options: ") << std::endl << ex.what() << std::endl; std::cout << _("Use --help to see a list of available command-line options.") << std::endl; return 0; } catch(const Glib::Error& ex) { std::cout << "Error: " << ex.what() << std::endl; return 0; } if(group.m_arg_version) { std::cout << PACKAGE_STRING << std::endl; return 0; } // Get a URI for a glom file: Glib::ustring input_uri; // The GOption documentation says that options without names will be returned to the application as "rest arguments". // I guess this means they will be left in the argv. Murray. if(input_uri.empty() && (argc > 1)) { const char* pch = argv[1]; if(pch) input_uri = pch; } if(input_uri.empty()) { std::cerr << _("Please specify a glom file.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Get a URI (file://something) from the filepath: Glib::RefPtr file_input = Gio::File::create_for_commandline_arg(input_uri); //Make sure it is really a URI: input_uri = file_input->get_uri(); if(!file_input->query_exists()) { std::cerr << _("The Glom file does not exist.") << std::endl; std::cerr << "uri: " << input_uri << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } Gio::FileType file_type = file_input->query_file_type(); if(file_type == Gio::FILE_TYPE_DIRECTORY) { std::cerr << _("The Glom file path is a directory instead of a file.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Check the po files path: if(group.m_arg_filepath_po_input.empty()) { std::cerr << _("Please specify the path to a directory containing po files.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Get a URI (file://something) from the filepath: Glib::RefPtr file_output = Gio::File::create_for_commandline_arg(group.m_arg_filepath_po_input); file_type = file_output->query_file_type(); if(file_type != Gio::FILE_TYPE_DIRECTORY) { std::cerr << _("Glom: The po files directory path is not a directory.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } // Load the document: Glom::Document document; document.set_file_uri(input_uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } //Import all .po files from the directory: Glib::RefPtr enumerator = file_output->enumerate_children(); Glib::RefPtr info; while( (info = enumerator->next_file()) ) { Glib::RefPtr child = file_output->get_child(info->get_name()); if(child->query_file_type() == Gio::FILE_TYPE_DIRECTORY) continue; //Check that it has the .po file extension: const std::string basename = child->get_basename(); const std::string locale_id = Glom::Utils::string_remove_suffix(basename, ".po"); if(locale_id == basename) continue; document.set_allow_autosave(false); //Prevent saving while we modify the document. const bool succeeded = Glom::import_translations_from_po_file(&document, child->get_uri(), locale_id); if(!succeeded) { std::cerr << Glib::ustring::compose(_("Po file import failed for locale: %1"), locale_id) << std::endl; return EXIT_FAILURE; } document.save(); std::cout << Glib::ustring::compose(_("Po file imported for locale: %1 for file %2"), locale_id, input_uri) << std::endl; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/glom/base_db_table.h0000644000175000017500000000247712234252645017640 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BASE_DB_TABLE_H #define GLOM_BASE_DB_TABLE_H #include #include namespace Glom { /** A base class that is a Bakery View with some database functionality * for use with a specific database table. */ class Base_DB_Table : public Base_DB { public: Base_DB_Table(); virtual ~Base_DB_Table(); bool init_db_details(const Glib::ustring& table_name); Glib::ustring get_table_name() const; protected: Glib::ustring m_table_name; }; } //namespace Glom #endif // GLOM_BASE_DB_TABLE_H glom-1.22.4/glom/mode_data/0000755000175000017500000000000012235000126016626 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_data/box_data_list_related.h0000644000175000017500000000656412234252646023345 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_BOX_DATA_LIST_RELATED_H #define GLOM_MODE_DATA_BOX_DATA_LIST_RELATED_H #include "config.h" // GLOM_ENABLE_CLIENT_ONLY #include "box_data_portal.h" namespace Glom { class Box_Data_List_Related : public Box_Data_Portal { public: Box_Data_List_Related(); /** * @param portal: The full portal details */ virtual bool init_db_details(const sharedptr& portal, bool show_title = true); /** Use this if no portal is yet defined, so the user can use the context menu to define a portal. */ virtual bool init_db_details(const Glib::ustring& parent_table, bool show_title = true); virtual void set_find_mode(bool val = true); protected: virtual bool fill_from_database(); //Override. //Signal handlers: void on_adddel_record_changed(); void on_adddel_user_requested_edit(const Gtk::TreeModel::iterator& row); void on_adddel_user_requested_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& rowEnd); void on_adddel_user_reordered_columns(); void on_adddel_script_button_clicked(const sharedptr& layout_item, const Gtk::TreeModel::iterator& row); bool on_script_button_idle(const sharedptr& layout_item, const Gnome::Gda::Value& primary_key); void on_adddel_record_added(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& primary_key_value); #ifndef GLOM_ENABLE_CLIENT_ONLY void on_adddel_user_requested_layout(); #endif // !GLOM_ENABLE_CLIENT_ONLY #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void on_dialog_layout_hide(); //override. #endif // !GLOM_ENABLE_CLIENT_ONLY //Implementations of pure virtual methods from Base_DB_Table_Data: virtual sharedptr get_field_primary_key() const; //TODO: Already in base class? virtual Gnome::Gda::Value get_primary_key_value_selected() const; virtual void set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_primary_key_value(const Gtk::TreeModel::iterator& row) const; //Overrides of functions from Box_Data: virtual Document::type_list_layout_groups create_layout_get_layout(); virtual void create_layout(); virtual void enable_buttons(); //override #ifndef GLOM_ENABLE_CLIENT_ONLY virtual Dialog_Layout* create_layout_dialog() const; // override. virtual void prepare_layout_dialog(Dialog_Layout* dialog); // override. #endif // !GLOM_ENABLE_CLIENT_ONLY //Member widgets: mutable DbAddDel_WithButtons m_AddDel; //mutable because its get_ methods aren't const. }; } //namespace Glom #endif // GLOM_MODE_DATA_BOX_DATA_LIST_RELATED_H glom-1.22.4/glom/mode_data/box_data_list_related.cc0000644000175000017500000004076612234776363023514 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include //For show_ok_dialog() #include //For bold_message()). #include #include namespace Glom { Box_Data_List_Related::Box_Data_List_Related() { m_Alignment.add(m_AddDel); add_view(&m_AddDel); //Give it access to the document. m_AddDel.show(); m_AddDel.set_height_rows(6, 6); m_Alignment.show(); //Connect signals: m_AddDel.signal_user_requested_edit().connect(sigc::mem_fun(*this, &Box_Data_List_Related::on_adddel_user_requested_edit)); m_AddDel.signal_record_changed().connect(sigc::mem_fun(*this, &Box_Data_List_Related::on_adddel_record_changed)); m_AddDel.signal_script_button_clicked().connect(sigc::mem_fun(*this, &Box_Data_List_Related::on_adddel_script_button_clicked)); m_AddDel.signal_record_added().connect(sigc::mem_fun(*this, &Box_Data_List_Related::on_adddel_record_added)); #ifndef GLOM_ENABLE_CLIENT_ONLY m_AddDel.signal_user_requested_layout().connect(sigc::mem_fun(*this, &Box_Data_List_Related::on_adddel_user_requested_layout)); #endif // !GLOM_ENABLE_CLIENT_ONLY //We do not actually use this, //so it is a bug if this appears in the .glom file: m_layout_name = "list_related"; } void Box_Data_List_Related::enable_buttons() { const bool view_details_possible = get_has_suitable_record_to_view_details() && (m_portal->get_navigation_type() != LayoutItem_Portal::NAVIGATION_NONE); // Don't allow the user to go to a record in a hidden table. // Unless we are on Maemo - then we want to allow editing in a separate window only. m_AddDel.set_allow_view_details(view_details_possible); } bool Box_Data_List_Related::init_db_details(const sharedptr& portal, bool show_title) { //This calls the other method overload: return Box_Data_Portal::init_db_details(portal, show_title); } bool Box_Data_List_Related::init_db_details(const Glib::ustring& parent_table, bool show_title) { m_parent_table = parent_table; if(m_portal) LayoutWidgetBase::m_table_name = m_portal->get_table_used(Glib::ustring() /* parent table_name, not used. */); else LayoutWidgetBase::m_table_name = Glib::ustring(); if(LayoutWidgetBase::m_table_name.empty()) { std::cerr << G_STRFUNC << ": LayoutWidgetBase::m_table_name is null" << std::endl; } Base_DB_Table::m_table_name = LayoutWidgetBase::m_table_name; if(show_title) { Glib::ustring title; if(m_portal) title = item_get_title(m_portal); m_Label.set_markup(Utils::bold_message(title)); m_Label.show(); if(!(m_Frame.get_label_widget())) m_Frame.set_label_widget(m_Label); m_Alignment.set_padding(Utils::DEFAULT_SPACING_SMALL /* top */, 0, Utils::DEFAULT_SPACING_LARGE /* left */, 0); } else { m_Label.set_markup(Glib::ustring()); m_Label.hide(); if(m_Frame.get_label_widget()) m_Frame.unset_label(); //Otherwise the allocation is calculated wrong due to GtkFrame bug: https://bugzilla.gnome.org/show_bug.cgi?id=662915 m_Alignment.set_padding(0.0f, 0.0f, 0.0f, 0.0f); //The box itself has padding of 6. } if(m_portal) { m_key_field = DbUtils::get_fields_for_table_one_field(get_document(), LayoutWidgetBase::m_table_name, m_portal->get_to_field_used()); } else m_key_field.clear(); //Prevent impossible multiple related records: const bool single_related = (m_key_field && (m_key_field->get_unique_key() || m_key_field->get_primary_key())); m_AddDel.set_allow_only_one_related_record(single_related); enable_buttons(); //TODO: Use m_found_set? FoundSet found_set; found_set.m_table_name = LayoutWidgetBase::m_table_name; const Privileges table_privs = Privs::get_current_privs(found_set.m_table_name); m_AddDel.set_allow_view(table_privs.m_view); m_AddDel.set_found_set(found_set); return Box_Data_ManyRecords::init_db_details(found_set, "" /* layout_platform */); //Calls create_layout() and fill_from_database(). } bool Box_Data_List_Related::fill_from_database() { bool result = false; bool allow_add = true; if(m_key_field && m_found_set.m_where_clause.empty()) //There's a key field, but no value. { //No Foreign Key value, so just show the field names: result = Base_DB_Table_Data::fill_from_database(); if(!result) { std::cerr << G_STRFUNC << ": Base_DB_Table_Data::fill_from_database() failed." << std::endl; } //create_layout(); } else { result = Box_Data_Portal::fill_from_database(); if(!result) { std::cerr << G_STRFUNC << ": Box_Data_Portal::fill_from_database() failed." << std::endl; } //TODO: Disable add if the from_field already has a value and the to_field is auto-incrementing because //- we cannot override the auto-increment in the to_field. //- we cannot change the value in the from_field to the new auto_increment value in the to_field. } //Prevent addition of new records if that is what the relationship specifies: if(allow_add && m_portal && m_portal->get_relationship()) allow_add = m_portal->get_relationship()->get_auto_create(); m_AddDel.set_allow_add(allow_add); const Privileges table_privs = Privs::get_current_privs(m_found_set.m_table_name); m_AddDel.set_allow_view(table_privs.m_view); m_AddDel.set_found_set(m_found_set); result = m_AddDel.refresh_from_database(); return result; } Gnome::Gda::Value Box_Data_List_Related::get_primary_key_value(const Gtk::TreeModel::iterator& row) const { return m_AddDel.get_value_key(row); } void Box_Data_List_Related::on_adddel_user_requested_edit(const Gtk::TreeModel::iterator& row) { //Note that this is really an Open rather than an Edit. const Gnome::Gda::Value primary_key_value = m_AddDel.get_value_key(row); //The primary key is in the key. if(!Conversions::value_is_empty(primary_key_value)) { //std::cout << "debug: " << G_STRFUNC << ": Requesting edit for primary_key=" << primary_key_value.to_string() << std::endl; signal_user_requested_details().emit(primary_key_value); } } void Box_Data_List_Related::on_adddel_record_changed() { //Let parent respond: signal_portal_record_changed().emit(m_portal->get_relationship_name()); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Data_List_Related::on_adddel_user_requested_layout() { show_layout_dialog(); } #endif // !GLOM_ENABLE_CLIENT_ONLY void Box_Data_List_Related::on_adddel_script_button_clicked(const sharedptr& layout_item, const Gtk::TreeModel::iterator& row) { if(!layout_item) return; const Gnome::Gda::Value primary_key_value = get_primary_key_value(row); // TODO: Calling refresh_data_from_database(), // or navigating to a different table from inside the Python script, // causes a crash somewhere down in GTK+, so it is done in an idle handler here. // We are currently in a callback from the CellRendererButton_Text cell // renderer which is deleted by a call to refresh_data_from_database(). // Probably this causes issues somewhere. Glib::signal_idle().connect( sigc::bind( sigc::mem_fun(*this, &Box_Data_List_Related::on_script_button_idle), layout_item, primary_key_value)); } bool Box_Data_List_Related::on_script_button_idle(const sharedptr& layout_item, const Gnome::Gda::Value& primary_key) { execute_button_script(layout_item, primary_key); // Refill view from database as the script might have changed arbitrary records #if 0 // TODO: This is perhaps a better approach, but // DbTreeModel::refresh_from_database is protected Glib::RefPtr model = m_AddDel.get_model(); Glib::RefPtr db_model = Glib::RefPtr::cast_dynamic(model); if(db_model) db_model->refresh_from_database(m_found_set); #endif refresh_data_from_database(); set_primary_key_value_selected(primary_key); return false; } void Box_Data_List_Related::on_adddel_record_added(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& primary_key_value) { //Note that on_record_added() would only be called on the AddDel itself, //so we need to handle this AddDel signal. //primary_key_value is a new autogenerated or human-entered key for the row. //It has already been added to the database. //Gnome::Gda::Value primary_key_value = m_AddDel.get_value_key(row); //std::cout << "debug: " << G_STRFUNC << ": primary_key_value=" << primary_key_value.to_string() << std::endl; if(!row) return; Gnome::Gda::Value key_value; if(m_key_field) { //m_key_field is the field in this table that must match another field in the parent table. sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(m_key_field); key_value = m_AddDel.get_value(row, layout_item); } //Make sure that the new related record is related, //by setting the foreign key: //If it's not auto-generated. if(!Conversions::value_is_empty(key_value)) //If there is already a value. { //It was auto-generated. Tell the parent about it, so it can make a link. signal_record_added.emit(key_value); } else if(Conversions::value_is_empty(m_key_value)) { std::cerr << G_STRFUNC << ": m_key_value is NULL." << std::endl; } else { sharedptr field_primary_key = m_AddDel.get_key_field(); //Create the link by setting the foreign key if(m_key_field && m_portal) { make_record_related(primary_key_value); //Show it on the view, if it's visible: sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(m_key_field); //TODO: Although the to-field value is visible on the new related record, get_value() returns NULL so you can't immediately navigate to the new record: //std::cout << "debug: " << G_STRFUNC << ": setting field=" << layout_item->get_name() << "m_key_value=" << m_key_value.to_string() << std::endl; m_AddDel.set_value(row, layout_item, m_key_value); } else std::cerr << G_STRFUNC << ": m_key_field is NULL" << std::endl; //on_adddel_user_changed(row, iKey); //Update the database. } on_record_added(key_value, row); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Data_List_Related::on_dialog_layout_hide() { Dialog_Layout_List_Related* dialog_related = dynamic_cast(m_pDialogLayout); g_assert(dialog_related); m_portal = dialog_related->get_portal_layout(); //Update the UI: init_db_details(m_portal); Box_Data::on_dialog_layout_hide(); sharedptr pLayoutItem = sharedptr::cast_dynamic(get_layout_item()); if(pLayoutItem) { *pLayoutItem = *m_portal; signal_layout_changed().emit(); //TODO: Check whether it has really changed. } } #endif // !GLOM_ENABLE_CLIENT_ONLY #ifndef GLOM_ENABLE_CLIENT_ONLY Dialog_Layout* Box_Data_List_Related::create_layout_dialog() const { Dialog_Layout_List_Related* dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(dialog); return dialog; } void Box_Data_List_Related::prepare_layout_dialog(Dialog_Layout* dialog) { Dialog_Layout_List_Related* related_dialog = dynamic_cast(dialog); g_assert(related_dialog); related_dialog->init_with_portal(m_layout_name, m_layout_platform, get_document(), m_portal, m_parent_table); } #endif // !GLOM_ENABLE_CLIENT_ONLY Gnome::Gda::Value Box_Data_List_Related::get_primary_key_value_selected() const { return m_AddDel.get_value_key_selected(); } sharedptr Box_Data_List_Related::get_field_primary_key() const { return m_AddDel.get_key_field(); } void Box_Data_List_Related::set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value) { m_AddDel.set_value_key(row, value); } Document::type_list_layout_groups Box_Data_List_Related::create_layout_get_layout() { Document::type_list_layout_groups result; //Do not use get_data_layout_groups(m_layout_name). //instead do this: if(m_portal) result.push_back(m_portal); return result; } //These create_layout*() methods are actually copy/pasted from Box_Data_List(), //because we do not derived from Box_Data_List. //TODO: Reduce the copy/pasting of these? void Box_Data_List_Related::create_layout() { Box_Data::create_layout(); //Fills m_TableFields. const Document* pDoc = dynamic_cast(get_document()); if(!pDoc) return; //Field Names: m_AddDel.remove_all_columns(); //m_AddDel.set_columns_count(m_Fields.size()); m_AddDel.set_table_name(Base_DB_Table::m_table_name); if(m_portal) { gulong rows_count_min = 0; gulong rows_count_max = 0; m_portal->get_rows_count(rows_count_min, rows_count_max); if(rows_count_min) //0 is a silly value. m_AddDel.set_height_rows(rows_count_min, rows_count_max); } sharedptr field_primary_key = get_field_primary_key_for_table(Base_DB_Table::m_table_name); if(!field_primary_key) { std::cerr << G_STRFUNC << ": primary key not found." << std::endl; return; } m_AddDel.set_key_field(field_primary_key); LayoutGroup::type_list_items items_to_use; //This map of layout groups will also contain the field information from the database: Document::type_list_layout_groups layout_groups = create_layout_get_layout(); for(Document::type_list_layout_groups::const_iterator iter = layout_groups.begin(); iter != layout_groups.end(); ++iter) { const sharedptr layout_group = *iter; if(!layout_group) continue; const LayoutGroup::type_list_items child_items = layout_group->get_items_recursive(); for(LayoutGroup::type_list_items::const_iterator iterItems = child_items.begin(); iterItems != child_items.end(); ++iterItems) { sharedptr child_item = *iterItems; //TODO: Set the whole thing as read-only instead: if(m_read_only) child_item->set_editable(false); sharedptr child_field = sharedptr::cast_dynamic(child_item); //This check has already happened in Frame_Glom::update_table_in_document_from_database(). //It is inefficient and unnecessary to do it here too. /* if(child_field) { //Check that the field really exists, to avoid SQL errors. //This could probably only happen if we have failed to rename something everywhere, when the user has renamed something. if(!DbUtils::get_field_exists_in_database(child_field->get_table_used(Base_DB_Table::m_table_name), child_field->get_name())) { std::cerr << G_STRFUNC << ": Field does not exist in database: table_name=" << child_field->get_table_used(Base_DB_Table::m_table_name) << ", field_name=" << child_field->get_name() << std::endl; continue; } } */ items_to_use.push_back(child_item); } } //Add extra possibly-non-visible columns that we need: //TODO: Only add it if it is not already there. if(field_primary_key) { sharedptr layout_item = sharedptr::create(); layout_item->set_hidden(); layout_item->set_full_field_details(m_AddDel.get_key_field()); m_FieldsShown.push_back(layout_item); items_to_use.push_back(layout_item); } const Privileges table_privs = Privs::get_current_privs(m_found_set.m_table_name); m_AddDel.set_allow_view(table_privs.m_view); m_AddDel.set_found_set(m_found_set); m_AddDel.set_columns(items_to_use); m_FieldsShown = get_fields_to_show(); } void Box_Data_List_Related::set_find_mode(bool val) { Box_Data_Portal::set_find_mode(val); m_AddDel.set_find_mode(val); } } //namespace Glom glom-1.22.4/glom/mode_data/flowtablewithfields.cc0000644000175000017500000014207712234776363023240 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "flowtablewithfields.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //For bold_message()). #include #include #include namespace Glom { FlowTableWithFields::Info::Info() : m_first(0), m_first_eventbox(0), m_second(0), m_checkbutton(0) { } FlowTableWithFields::FlowTableWithFields(const Glib::ustring& table_name) : m_placeholder(0), m_table_name(table_name), m_find_mode(false) { } FlowTableWithFields::~FlowTableWithFields() { //Remove views. The widgets are deleted automatically because they are managed. for(type_listFields::iterator iter = m_listFields.begin(); iter != m_listFields.end(); ++iter) { View_Composite_Glom* pViewFirst = dynamic_cast(iter->m_first); if(pViewFirst) { remove_view(pViewFirst); } View_Composite_Glom* pViewSecond = dynamic_cast(iter->m_second); if(pViewSecond) { remove_view(pViewSecond); } } } void FlowTableWithFields::set_table(const Glib::ustring& table_name) { m_table_name = table_name; //Recurse: for(type_sub_flow_tables::iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { FlowTableWithFields* subtable = *iter; if(subtable) { subtable->set_table(table_name); } } } void FlowTableWithFields::add_layout_item(const sharedptr& item) { //Get derived type and do the appropriate thing: sharedptr field = sharedptr::cast_dynamic(item); if(field) { add_field(field, m_table_name); //Do not allow editing of auto-increment fields: sharedptr field_details = field->get_full_field_details(); if(field_details) { if(field_details->get_auto_increment()) set_field_editable(field, false); else set_field_editable(field, field->get_editable_and_allowed()); } } else { sharedptr portal = sharedptr::cast_dynamic(item); if(portal) { add_layout_portal(portal); } else { sharedptr notebook = sharedptr::cast_dynamic(item); if(notebook) { add_layout_notebook(notebook); } else { sharedptr group = sharedptr::cast_dynamic(item); if(group) add_layout_group(group); else { sharedptr layout_button = sharedptr::cast_dynamic(item); if(layout_button) add_button(layout_button, m_table_name); else { sharedptr layout_textobject = sharedptr::cast_dynamic(item); if(layout_textobject) add_textobject(layout_textobject, m_table_name); else { sharedptr layout_imageobject = sharedptr::cast_dynamic(item); if(layout_imageobject) add_imageobject(layout_imageobject, m_table_name); } } } } } } } void FlowTableWithFields::add_layout_group(const sharedptr& group, bool with_indent) { if(!group) return; if(true)//!fields.empty() && !group_name.empty()) { Gtk::Frame* frame = Gtk::manage( new Gtk::Frame ); //TODO_leak: This is possibly leaked, according to valgrind. const Glib::ustring group_title = item_get_title(group); if(!group_title.empty()) { Gtk::Label* label = Gtk::manage( new Gtk::Label ); //TODO: This is maybe leaked, according to valgrind, though it should be managed by GtkFrame. label->set_markup( Utils::bold_message(group_title) ); label->show(); frame->set_label_widget(*label); } frame->set_shadow_type(Gtk::SHADOW_NONE); //HIG-style frame->show(); Gtk::Alignment* alignment = Gtk::manage( new Gtk::Alignment ); //TODO_leak: This is possibly leaked, according to valgrind. if(!group_title.empty()) //Don't indent if it has no title, to allow use of groups just for positioning. { //Add some indenting just to avoid the out-denting caused by this GtkFrame bug: //https://bugzilla.gnome.org/show_bug.cgi?id=644199 const int BASE_INDENT = 3; //std::cout << "title= " << group_title << ", with_indent=" << with_indent << std::endl; if(with_indent) { alignment->set_padding(Glom::Utils::DEFAULT_SPACING_SMALL, 0, Glom::Utils::DEFAULT_SPACING_SMALL + BASE_INDENT, 0); } else { alignment->set_padding(Glom::Utils::DEFAULT_SPACING_SMALL, 0, BASE_INDENT, 0); } } alignment->show(); frame->add(*alignment); FlowTableWithFields* flow_table = Gtk::manage( new FlowTableWithFields() ); flow_table->set_find_mode(m_find_mode); add_view(flow_table); //Allow these sub-flowtables to access the document too. flow_table->set_table(m_table_name); flow_table->set_lines(group->get_columns_count()); //Use the parent table's padding: flow_table->set_horizontal_spacing(get_horizontal_spacing()); flow_table->set_vertical_spacing(get_vertical_spacing()); flow_table->show(); Gtk::EventBox* event_box = Gtk::manage( new Gtk::EventBox() ); //TODO_Leak: Valgrind says this is possibly leaked. event_box->add(*flow_table); event_box->set_visible_window(false); #ifndef GLOM_ENABLE_CLIENT_ONLY event_box->signal_button_press_event().connect (sigc::mem_fun (*flow_table, &FlowTableWithFields::on_button_press_event)); #endif event_box->show(); alignment->add(*event_box); LayoutGroup::type_list_items items = group->get_items(); for(LayoutGroup::type_list_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr item = *iter; if(item) { flow_table->add_layout_item(item); } } add_widgets(*frame, true /* expand */); m_sub_flow_tables.push_back(flow_table); flow_table->set_layout_item(group, m_table_name); add_layoutwidgetbase(flow_table); //Connect signals: signal_connect_for_reemit_2args(flow_table->signal_field_edited(), m_signal_field_edited); signal_connect_for_reemit_1arg(flow_table->signal_field_choices_changed(), m_signal_field_choices_changed); signal_connect_for_reemit_2args(flow_table->signal_field_open_details_requested(), m_signal_field_open_details_requested); signal_connect_for_reemit_1arg(flow_table->signal_related_record_changed(), m_signal_related_record_changed); signal_connect_for_reemit_2args(flow_table->signal_requested_related_details(), m_signal_requested_related_details); flow_table->signal_script_button_clicked().connect( sigc::mem_fun(*this, &FlowTableWithFields::on_script_button_clicked) ); flow_table->align_child_group_labels(); } } Box_Data_List_Related* FlowTableWithFields::create_related(const sharedptr& portal, bool show_title) { if(!portal) return 0; Document* pDocument = static_cast(get_document()); if(pDocument) { Box_Data_List_Related* portal_box = Gtk::manage(new Box_Data_List_Related); portal_box->set_find_mode(m_find_mode); add_view(portal_box); //Give it access to the document, needed to get the layout and fields information. //Create the layout: if(portal && portal->get_has_relationship_name()) portal_box->init_db_details(portal, show_title); else portal_box->init_db_details(m_table_name, show_title); Glib::ustring to_table; sharedptr relationship = pDocument->get_relationship(m_table_name, portal->get_relationship_name()); if(relationship) to_table = relationship->get_to_table(); portal_box->set_layout_item(portal, to_table); portal_box->show(); m_portals.push_back(portal_box); //Connect signals: //Just reemit this object's signal when receiving the same signal from the portal: signal_connect_for_reemit_1arg(portal_box->signal_portal_record_changed(), signal_related_record_changed()); portal_box->signal_user_requested_details().connect( sigc::bind( sigc::mem_fun(*this, &FlowTableWithFields::on_portal_user_requested_details), portal_box)); return portal_box; } return 0; } Box_Data_Calendar_Related* FlowTableWithFields::create_related_calendar(const sharedptr& portal, bool show_title) { if(!portal) return 0; Document* pDocument = static_cast(get_document()); if(pDocument) { Box_Data_Calendar_Related* portal_box = Gtk::manage(new Box_Data_Calendar_Related); portal_box->set_find_mode(m_find_mode); //TODO: Implement this in the class add_view(portal_box); //Give it access to the document, needed to get the layout and fields information. //Create the layout: if(portal && portal->get_has_relationship_name()) portal_box->init_db_details(portal, show_title); else portal_box->init_db_details(m_table_name, show_title); Glib::ustring to_table; sharedptr relationship = pDocument->get_relationship(m_table_name, portal->get_relationship_name()); if(relationship) to_table = relationship->get_to_table(); portal_box->set_layout_item(portal, to_table); portal_box->show(); m_portals.push_back(portal_box); //Connect signals: //Just reemit this object's signal when receiving the same signal from the portal: signal_connect_for_reemit_1arg(portal_box->signal_portal_record_changed(), signal_related_record_changed()); portal_box->signal_user_requested_details().connect( sigc::bind( sigc::mem_fun(*this, &FlowTableWithFields::on_portal_user_requested_details), portal_box)); return portal_box; } return 0; } void FlowTableWithFields::add_layout_portal(const sharedptr& portal) { Box_Data_Portal* portal_box = 0; sharedptr calendar_portal = sharedptr::cast_dynamic(portal); if(calendar_portal) portal_box = create_related_calendar(calendar_portal); else portal_box = create_related(portal); if(portal_box) { add_widgets(*portal_box, true /* expand */); add_layoutwidgetbase(portal_box); } else std::cerr << G_STRFUNC << ": No portal was created." << std::endl; } void FlowTableWithFields::add_layout_notebook(const sharedptr& notebook) { if(!notebook) return; //Add the widget: NotebookGlom* notebook_widget = Gtk::manage(new NotebookGlom()); notebook_widget->show(); notebook_widget->set_layout_item(notebook, m_table_name); for(LayoutGroup::type_list_items::iterator iter = notebook->m_list_items.begin(); iter != notebook->m_list_items.end(); ++iter) { sharedptr group = sharedptr::cast_dynamic(*iter); if(group) { #ifndef GLOM_ENABLE_CLIENT_ONLY NotebookLabel* tab_label = Gtk::manage(new NotebookLabel(notebook_widget)); tab_label->show(); #else Gtk::Label* tab_label = Gtk::manage(new Gtk::Label()); tab_label->show(); #endif tab_label->set_label(item_get_title_or_name(group)); sharedptr portal = sharedptr::cast_dynamic(group); if(portal) { //Add a Related Records list for this portal: Box_Data_List_Related* portal_box = create_related(portal, false /* no label, because it's in the tab instead. */); //portal_box->set_border_width(Glom::Utils::DEFAULT_SPACING_SMALL); It has "padding" around the Alignment instead. portal_box->show(); notebook_widget->append_page(*portal_box, *tab_label); add_layoutwidgetbase(portal_box); } else { //Add a FlowTable for this group: FlowTableWithFields* flow_table = Gtk::manage( new FlowTableWithFields() ); flow_table->set_find_mode(m_find_mode); add_view(flow_table); //Allow these sub-flowtables to access the document too. flow_table->set_table(m_table_name); flow_table->set_lines(group->get_columns_count()); flow_table->set_horizontal_spacing(get_horizontal_spacing()); flow_table->set_vertical_spacing(get_vertical_spacing()); flow_table->show(); // Put the new flowtable in an event box to catch events Gtk::EventBox* event_box = Gtk::manage( new Gtk::EventBox() ); //TODO_Leak: Valgrind says this is possibly leaked. event_box->add(*flow_table); event_box->set_visible_window(false); #ifndef GLOM_ENABLE_CLIENT_ONLY event_box->signal_button_press_event().connect (sigc::mem_fun (*flow_table, &FlowTableWithFields::on_button_press_event)); #endif event_box->show(); //This doesn't work (probably because we haven't implmented it in our custom container), //so we put the flowtable in an alignment and give that a border instead. //flow_table->set_border_width(Glom::Utils::DEFAULT_SPACING_SMALL); //Put some space between the page child and the page edges. Gtk::Alignment* alignment = Gtk::manage(new Gtk::Alignment()); alignment->set_border_width(Glom::Utils::DEFAULT_SPACING_SMALL); alignment->add(*event_box); alignment->show(); notebook_widget->append_page(*alignment, *tab_label); //Add child items: LayoutGroup::type_list_items items = group->get_items(); for(LayoutGroup::type_list_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr item = *iter; if(item) { flow_table->add_layout_item(item); } } m_sub_flow_tables.push_back(flow_table); flow_table->set_layout_item(group, m_table_name); add_layoutwidgetbase(flow_table); //Connect signal: signal_connect_for_reemit_2args(flow_table->signal_field_edited(), m_signal_field_edited); signal_connect_for_reemit_2args(flow_table->signal_field_open_details_requested(), m_signal_field_open_details_requested); signal_connect_for_reemit_1arg(flow_table->signal_related_record_changed(), signal_related_record_changed()); signal_connect_for_reemit_2args(flow_table->signal_requested_related_details(), signal_requested_related_details()); flow_table->signal_script_button_clicked().connect( sigc::mem_fun(*this, &FlowTableWithFields::on_script_button_clicked) ); } } } add_layoutwidgetbase(notebook_widget); //add_view(button); //So it can get the document. add_widgets(*notebook_widget, true /* expand */); } /* void FlowTableWithFields::add_group(const Glib::ustring& group_name, const Glib::ustring& group_title, const type_map_field_sequence& fields) { if(true)//!fields.empty() && !group_name.empty()) { Gtk::Frame* frame = Gtk::manage( new Gtk::Frame ); if(!group_title.empty()) { Gtk::Label* label = Gtk::manage( new Gtk::Label ); label->set_text("" + group_title + "") ); label->set_use_markup(); label->show(); frame->set_label_widget(*label); } frame->set_shadow_type(Gtk::SHADOW_NONE); //HIG-style frame->show(); Gtk::Alignment* alignment = Gtk::manage( new Gtk::Alignment ); if(!group_title.empty()) //Don't indent if it has no title, to allow use of groups just for positioning. alignment->set_padding(Utils::DEFAULT_SPACING_SMALL, 0, Utils::DEFAULT_SPACING_SMALL, 0); alignment->show(); frame->add(*alignment); FlowTableWithFields* flow_table = Gtk::manage( new FlowTableWithFields() ); flow_table->set_line(1); flow_table->set_horizontal_spacing(get_column_padding()); flow_table->set_row_padding(get_row_padding()); flow_table->show(); alignment->add(*flow_table); for(type_map_field_sequence::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { //Gtk::Entry* debug = Gtk::manage(new Gtk::Entry() ); //flow_table->add(*debug); //debug->show(); flow_table->add_field(*iter); } add_widgets(*frame); m_sub_flow_tables.push_back(flow_table); //Connect signal: flow_table->signal_field_edited().connect( sigc::mem_fun(*this, &FlowTableWithFields::on_flowtable_entry_edited) ); } } */ void FlowTableWithFields::add_field(const sharedptr& layoutitem_field, const Glib::ustring& table_name) { Info info; info.m_field = layoutitem_field; //Add the entry or checkbox (handled by the DataWidget) DataWidget* pDataWidget = Gtk::manage(new DataWidget(layoutitem_field, table_name, get_document()) ); //TODO_Leak: Possibly leaked, according to valgrind. add_layoutwidgetbase(pDataWidget); add_view(pDataWidget); //So it can get the document. info.m_second = pDataWidget; info.m_second->show_all(); //Add a label, if one is necessary: Gtk::Label* label = info.m_second->get_label(); info.m_first = label; if(label && !label->get_text().empty()) { label->set_property("xalign", 0.0); //Equivalent to Gtk::ALIGN_START, but we can't use that here. label->set_property("yalign", 0.5); //Equivalent ot Gtk::ALIGN_CENTER, but we can't use that here.; label->show(); } //info.m_group = layoutitem_field.m_group; //Expand multiline text fields to take up the maximum possible width: if( (layoutitem_field->get_glom_type() == Field::TYPE_TEXT) && layoutitem_field->get_formatting_used().get_text_format_multiline()) { if(label) label->set_property("yalign", 0.0); //Equivalent to Gtk::ALIGN_START. Center is neater next to entries, but center is silly next to multi-line text boxes. } else if(layoutitem_field->get_glom_type() == Field::TYPE_IMAGE) { if(label) label->set_property("yalign", 0.0); //Equivalent to Gtk::ALIGN_START. Center is neater next to entries, but center is silly next to large images. } Gtk::EventBox* eventbox = Gtk::manage(new Gtk::EventBox()); eventbox->add(*info.m_first); info.m_first_eventbox = eventbox; //Remember it so we can retrieve the column number later from FlowTable. eventbox->set_visible_window(false); eventbox->set_events(Gdk::ALL_EVENTS_MASK); eventbox->show_all(); add_widgets(*eventbox, *(info.m_second), true); info.m_second->signal_edited().connect( sigc::bind(sigc::mem_fun(*this, &FlowTableWithFields::on_entry_edited), layoutitem_field) ); //TODO: Is it a good idea to bind the LayoutItem? sigc::bind() probably stores a copy at this point. info.m_second->signal_choices_changed().connect( sigc::bind(sigc::mem_fun(*this, &FlowTableWithFields::on_entry_choices_changed), layoutitem_field) ); #ifndef GLOM_ENABLE_CLIENT_ONLY info.m_second->signal_layout_item_added().connect( sigc::bind( sigc::mem_fun(*this, &FlowTableWithFields::on_datawidget_layout_item_added), info.m_second) ); #endif // !GLOM_ENABLE_CLIENT_ONLY info.m_second->signal_open_details_requested().connect( sigc::bind(sigc::mem_fun(*this, &FlowTableWithFields::on_entry_open_details_requested), layoutitem_field) ); m_listFields.push_back(info); //This would be the wrong position, but you should only use this method directly when you expect it to be followed by a complete re-layout. } void FlowTableWithFields::add_button(const sharedptr& layoutitem_button, const Glib::ustring& table_name) { //Add the widget ButtonGlom* button = Gtk::manage(new ButtonGlom()); button->set_label(item_get_title_or_name(layoutitem_button)); button->set_layout_item(layoutitem_button, table_name); button->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &FlowTableWithFields::on_script_button_clicked), layoutitem_button) ); button->show(); add_layoutwidgetbase(button); //add_view(button); //So it can get the document. const Formatting::HorizontalAlignment alignment = layoutitem_button->get_formatting_used_horizontal_alignment(); Gtk::Widget* widget_to_add = button; bool expand = false; if(alignment != Formatting::HORIZONTAL_ALIGNMENT_LEFT) { //Put the button in a Gtk::Box so we can have non-default alignment in //its space. Note that we will need a different technique if we ever //support center alignment. Gtk::Box* box_button = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL)); box_button->show(); if(alignment == Formatting::HORIZONTAL_ALIGNMENT_RIGHT) box_button->pack_end(*button, Gtk::PACK_SHRINK); else box_button->pack_start(*button, Gtk::PACK_SHRINK); widget_to_add = box_button; expand = true; } add_widgets(*widget_to_add, expand); apply_formatting(*button, layoutitem_button); } void FlowTableWithFields::add_textobject(const sharedptr& layoutitem_text, const Glib::ustring& table_name) { //Add the widget: const Formatting::HorizontalAlignment alignment = layoutitem_text->get_formatting_used_horizontal_alignment(); const Gtk::Align x_align = (alignment == Formatting::HORIZONTAL_ALIGNMENT_LEFT ? Gtk::ALIGN_START : Gtk::ALIGN_END); Gtk::Alignment* alignment_label = Gtk::manage(new Gtk::Alignment()); alignment_label->set(x_align, Gtk::ALIGN_CENTER); alignment_label->show(); const Glib::ustring text = layoutitem_text->get_text(AppWindow::get_current_locale()); DataWidgetChildren::Label* label = Gtk::manage(new DataWidgetChildren::Label(text)); label->set_layout_item(layoutitem_text, table_name); label->show(); alignment_label->add(*label); apply_formatting(*label, layoutitem_text); add_layoutwidgetbase(label); const Glib::ustring title = item_get_title(layoutitem_text); if(title.empty()) { add_widgets(*alignment_label, true /* expand */); } else { Gtk::Alignment* alignment_title = Gtk::manage(new Gtk::Alignment()); alignment_title->set(Gtk::ALIGN_END, Gtk::ALIGN_CENTER); alignment_title->show(); DataWidgetChildren::Label* title_label = Gtk::manage(new DataWidgetChildren::Label(title, 0, 0, false)); title_label->set_layout_item(layoutitem_text, table_name); title_label->show(); alignment_title->add(*title_label); add_layoutwidgetbase(title_label); add_widgets(*alignment_title, *alignment_label, true /* expand */); } } void FlowTableWithFields::add_imageobject(const sharedptr& layoutitem_image, const Glib::ustring& table_name) { //Add the widget: ImageGlom* image = Gtk::manage(new ImageGlom()); image->set_size_request(200, 200); image->set_value(layoutitem_image->get_image()); image->set_read_only(); //Only field images can be changed by the user when they are on a layout. image->set_layout_item(layoutitem_image, table_name); image->show(); add_layoutwidgetbase(image); //add_view(button); //So it can get the document. const Glib::ustring title = item_get_title(layoutitem_image); if(title.empty()) { add_widgets(*image, true /* expand */); } else { Gtk::Alignment* alignment_title = Gtk::manage(new Gtk::Alignment()); alignment_title->set(Gtk::ALIGN_END, Gtk::ALIGN_CENTER); alignment_title->show(); Gtk::Label* title_label = Gtk::manage(new Gtk::Label(title)); title_label->show(); alignment_title->add(*title_label); add_widgets(*alignment_title, *image, true /* expand */); } } void FlowTableWithFields::get_layout_groups(Document::type_list_layout_groups& groups) { sharedptr group(get_layout_group()); if(group) { groups.push_back(group); } } sharedptr FlowTableWithFields::get_layout_group() { return sharedptr::cast_dynamic(get_layout_item()); } void FlowTableWithFields::remove_field(const Glib::ustring& id) { for(type_listFields::iterator iter = m_listFields.begin(); iter != m_listFields.end(); ++iter) { if(iter->m_field->get_name() == id) { Info info = *iter; remove(*(info.m_first)); View_Composite_Glom* pViewFirst = dynamic_cast(info.m_first); if(pViewFirst) remove_view(pViewFirst); delete info.m_first; View_Composite_Glom* pViewSecond = dynamic_cast(info.m_second); if(pViewSecond) remove_view(pViewSecond); delete info.m_second; //It is removed at the same time. iter = m_listFields.erase(iter); } } } void FlowTableWithFields::set_field_value(const sharedptr& field, const Gnome::Gda::Value& value) { set_field_value(field, value, true); } void FlowTableWithFields::set_field_value(const sharedptr& field, const Gnome::Gda::Value& value, bool set_specified_field_layout) { //Set widgets which should show the value of this field: type_list_widgets list_widgets = get_field(field, set_specified_field_layout); for(type_list_widgets::iterator iter = list_widgets.begin(); iter != list_widgets.end(); ++iter) { DataWidget* datawidget = dynamic_cast(*iter); if(datawidget) { datawidget->set_value(value); } } //Refresh portal widgets which should show the related records for relationships that use this field: type_portals list_portals = get_portals(field /* from_key field name */); for(type_portals::iterator iter = list_portals.begin(); iter != list_portals.end(); ++iter) { Box_Data_Portal* portal = *iter; if(portal) { //std::cerr << G_STRFUNC << ": foreign_key_value=" << value.to_string() << std::endl; portal->refresh_data_from_database_with_foreign_key(value /* foreign key value */); } } //Refresh choices widgets which should show the related records for relationships that use this field: type_choice_widgets list_choice_widgets = get_choice_widgets(field /* from_key field name */); for(type_choice_widgets::iterator iter = list_choice_widgets.begin(); iter != list_choice_widgets.end(); ++iter) { DataWidgetChildren::ComboChoices* widget = *iter; if(widget) { //std::cerr << G_STRFUNC << ": foreign_key_value=" << value.to_string() << std::endl; widget->refresh_data_from_database_with_foreign_key(get_document(), value /* foreign key value */); } } } void FlowTableWithFields::set_other_field_value(const sharedptr& field, const Gnome::Gda::Value& value) { set_field_value(field, value, false); } Gnome::Gda::Value FlowTableWithFields::get_field_value(const sharedptr& field) const { type_list_const_widgets list_widgets = get_field(field, true); for(type_list_const_widgets::const_iterator iter = list_widgets.begin(); iter != list_widgets.end(); ++iter) { const DataWidget* datawidget = dynamic_cast(*iter); if(!datawidget) continue; const Gnome::Gda::Value value = datawidget->get_value(); if(!Conversions::value_is_empty(value)) return value; } //std::cerr << G_STRFUNC << ": returning null" << std::endl; return Gnome::Gda::Value(); //null. } void FlowTableWithFields::set_field_editable(const sharedptr& field, bool editable) { type_list_widgets list_widgets = get_field(field, true); for(type_list_widgets::iterator iter = list_widgets.begin(); iter != list_widgets.end(); ++iter) { DataWidget* datawidget = dynamic_cast(*iter); if(datawidget) { datawidget->set_editable(editable); } } } void FlowTableWithFields::update_choices(const sharedptr& field) { type_list_widgets list_widgets = get_field(field, true); for(type_list_widgets::iterator iter = list_widgets.begin(); iter != list_widgets.end(); ++iter) { DataWidget* datawidget = dynamic_cast(*iter); if(!datawidget) continue; DataWidgetChildren::ComboChoices* combo = dynamic_cast(datawidget->get_data_child_widget()); if(!combo) continue; const sharedptr layout_item = combo->get_layout_item(); const sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); if(!layout_item_field || !layout_item_field->get_formatting_used().get_has_related_choices()) continue; //TODO: Handle not-all related choices, too. combo->set_choices_related(get_document(), field, Gnome::Gda::Value() /* no ID means show all related records */); } //TODO: See also "Refresh choices widgets which should show the related records for relationships that use this field" } FlowTableWithFields::type_portals FlowTableWithFields::get_portals(const sharedptr& from_key) { type_portals result; const Glib::ustring from_key_name = from_key->get_name(); //Check the single-item widgets: for(type_portals::const_iterator iter = m_portals.begin(); iter != m_portals.end(); ++iter) { //*iter is a FlowTableItem. Box_Data_Portal* pPortalUI = *iter; if(pPortalUI) { sharedptr portal = pPortalUI->get_portal(); if(portal) { sharedptr relationship = portal->get_relationship(); //In this case, we only care about the first relationship (not any child relationships), because that's what would trigger a change. if(relationship && (relationship->get_from_field() == from_key_name)) result.push_back(pPortalUI); } else { std::cerr << G_STRFUNC << ": get_portal() returned NULL." << std::endl; } } } //Check the sub-flowtables: for(type_sub_flow_tables::const_iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { FlowTableWithFields* subtable = *iter; if(subtable) { type_portals sub_list = subtable->get_portals(from_key); if(!sub_list.empty()) { //Add to the main result: result.insert(result.end(), sub_list.begin(), sub_list.end()); } } } return result; } FlowTableWithFields::type_choice_widgets FlowTableWithFields::get_choice_widgets(const sharedptr& from_key) { type_choice_widgets result; if(!from_key) return result; const Glib::ustring from_key_name = from_key->get_name(); //Check the single-item widgets: for(type_listFields::iterator iter = m_listFields.begin(); iter != m_listFields.end(); ++iter) { DataWidget* widget = iter->m_second; if(!widget) continue; Gtk::Widget* child_widget = widget->get_data_child_widget(); DataWidgetChildren::ComboChoices* combochoices = dynamic_cast(child_widget); if(!combochoices) continue; const sharedptr layout_item = combochoices->get_layout_item(); const sharedptr field = sharedptr::cast_dynamic(layout_item); if(!field) continue; const Formatting& format = field->get_formatting_used(); bool choice_show_all = false; const sharedptr choice_relationship = format.get_choices_related_relationship(choice_show_all); if(choice_show_all) continue; //"Show All" choices don't use the ID field values. if(choice_relationship->get_from_field() == from_key_name) result.push_back(combochoices); } //Check the sub-flowtables: for(type_sub_flow_tables::const_iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { FlowTableWithFields* subtable = *iter; if(subtable) { const type_choice_widgets sub_list = subtable->get_choice_widgets(from_key); if(!sub_list.empty()) { //Add to the main result: result.insert(result.end(), sub_list.begin(), sub_list.end()); } } } return result; } namespace { // Get the direct widgets represesenting a given layout item // from a flowtable, without considering subflowtables: template static void get_direct_fields(InputIterator begin, InputIterator end, OutputIterator out, const sharedptr& layout_item, bool include_item) { for(InputIterator iter = begin; iter != end; ++iter) { if(iter->m_field->is_same_field(layout_item) && (include_item || iter->m_field != layout_item)) { if(iter->m_checkbutton) *out++ = iter->m_checkbutton; else *out++ = iter->m_second; } } } } FlowTableWithFields::type_list_const_widgets FlowTableWithFields::get_field(const sharedptr& layout_item, bool include_item) const { type_list_const_widgets result; get_direct_fields(m_listFields.begin(), m_listFields.end(), std::back_inserter(result), layout_item, include_item); //Check the sub-flowtables: for(type_sub_flow_tables::const_iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { const FlowTableWithFields* subtable = *iter; if(subtable) { type_list_const_widgets sub_list = subtable->get_field(layout_item, include_item); if(!sub_list.empty()) { //Add to the main result: result.insert(result.end(), sub_list.begin(), sub_list.end()); } } } return result; } FlowTableWithFields::type_list_widgets FlowTableWithFields::get_field(const sharedptr& layout_item, bool include_item) { type_list_widgets result; get_direct_fields(m_listFields.begin(), m_listFields.end(), std::back_inserter(result), layout_item, include_item); //TODO: Avoid duplication //Check the sub-flowtables: for(type_sub_flow_tables::const_iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { FlowTableWithFields* subtable = *iter; if(subtable) { type_list_widgets sub_list = subtable->get_field(layout_item, include_item); if(!sub_list.empty()) { //Add to the main result: result.insert(result.end(), sub_list.begin(), sub_list.end()); } } } return result; } void FlowTableWithFields::change_group(const Glib::ustring& /* id */, const Glib::ustring& /*new_group */) { //TODO. } void FlowTableWithFields::remove_all() { FlowTable::remove_all(); m_listFields.clear(); for(type_sub_flow_tables::iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { FlowTableWithFields* pSub = *iter; if(pSub) { remove_view(*iter); delete pSub; } } m_sub_flow_tables.clear(); for(type_portals::iterator iter = m_portals.begin(); iter != m_portals.end(); ++iter) { Box_Data_Portal* pPortal = *iter; remove_view(pPortal); delete pPortal; } m_portals.clear(); m_list_layoutwidgets.clear(); //Remove views. The widgets are deleted automatically because they are managed. for(type_listFields::iterator iter = m_listFields.begin(); iter != m_listFields.end(); ++iter) { View_Composite_Glom* pViewFirst = dynamic_cast(iter->m_first); if(pViewFirst) remove_view(pViewFirst); View_Composite_Glom* pViewSecond = dynamic_cast(iter->m_second); if(pViewSecond) remove_view(pViewSecond); } FlowTable::remove_all(); } FlowTableWithFields::type_signal_field_edited FlowTableWithFields::signal_field_edited() { return m_signal_field_edited; } FlowTableWithFields::type_signal_field_choices_changed FlowTableWithFields::signal_field_choices_changed() { return m_signal_field_choices_changed; } FlowTableWithFields::type_signal_field_open_details_requested FlowTableWithFields::signal_field_open_details_requested() { return m_signal_field_open_details_requested; } FlowTableWithFields::type_signal_related_record_changed FlowTableWithFields::signal_related_record_changed() { return m_signal_related_record_changed; } FlowTableWithFields::type_signal_requested_related_details FlowTableWithFields::signal_requested_related_details() { return m_signal_requested_related_details; } FlowTableWithFields::type_signal_script_button_clicked FlowTableWithFields::signal_script_button_clicked() { return m_signal_script_button_clicked; } void FlowTableWithFields::on_script_button_clicked(const sharedptr< LayoutItem_Button>& layout_item) { m_signal_script_button_clicked.emit(layout_item); } void FlowTableWithFields::on_entry_edited(const Gnome::Gda::Value& value, const sharedptr field) { m_signal_field_edited.emit(field, value); } void FlowTableWithFields::on_entry_choices_changed(const sharedptr field) { m_signal_field_choices_changed.emit(field); } void FlowTableWithFields::on_entry_open_details_requested(const Gnome::Gda::Value& value, const sharedptr field) { m_signal_field_open_details_requested.emit(field, value); } void FlowTableWithFields::set_design_mode(bool value) { #ifndef GLOM_ENABLE_CLIENT_ONLY FlowTable::set_design_mode(value); #else FlowTable::set_design_mode(value); #endif //Set the mode in the sub-flowtables: for(type_sub_flow_tables::iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { FlowTableWithFields* subtable = *iter; if(subtable) subtable->set_design_mode(value); } } void FlowTableWithFields::add_layoutwidgetbase(LayoutWidgetBase* layout_widget) { m_list_layoutwidgets.push_back(layout_widget); //Handle layout_changed signal: #ifndef GLOM_ENABLE_CLIENT_ONLY layout_widget->signal_layout_changed().connect(signal_layout_changed().make_slot()); #endif // !GLOM_ENABLE_CLIENT_ONLY } #ifndef GLOM_ENABLE_CLIENT_ONLY void FlowTableWithFields::on_datawidget_layout_item_added(LayoutWidgetBase::enumType item_type, DataWidget* pDataWidget) { //pDataWidget is the widget that asked us to add an item, //so the new item will be after that item, next to it. //Get the widget's layout item: sharedptr layout_item = pDataWidget->get_layout_item(); if(!layout_item) { std::cerr << G_STRFUNC << ": layout_item is null." << std::endl; return; } //std::cout << "debug: layout_item name=" << layout_item->get_name() << std::endl; //Get the group that the widget's layout item is in: sharedptr layout_group = sharedptr::cast_dynamic(get_layout_item()); if(!layout_group) { std::cerr << G_STRFUNC << ": layout_group is null." << std::endl; return; } //Create/Choose the new layout item: sharedptr layout_item_new; if(item_type == LayoutWidgetBase::TYPE_FIELD) { sharedptr layout_item_field = pDataWidget->offer_field_list(m_table_name); if(layout_item_field) { //TODO: privileges. layout_item_new = layout_item_field; } } else if(item_type == LayoutWidgetBase::TYPE_GROUP) { sharedptr layout_item = sharedptr::create(); layout_item->set_title_original(_("New Group")); layout_item_new = layout_item; } else if(item_type == LayoutWidgetBase::TYPE_NOTEBOOK) { sharedptr layout_item = sharedptr::create(); layout_item->set_name(_("notebook")); //Add an example tab, so that it shows up. sharedptr group_tab = sharedptr::create(); //Note to translators: This is the default name (not seen by most users) for a notebook tab. group_tab->set_name(_("tab1")); //Note to translators: This is the default label text for a notebook tab. group_tab->set_title_original(_("Tab One")); layout_item->add_item(group_tab); layout_item_new = layout_item; } else if(item_type == LayoutWidgetBase::TYPE_PORTAL) { layout_item_new = get_portal_relationship(); } else if(item_type == LayoutWidgetBase::TYPE_BUTTON) { sharedptr layout_item = sharedptr::create(); layout_item->set_name(_("button")); layout_item->set_title_original(_("New Button")); layout_item_new = layout_item; } else if(item_type == LayoutWidgetBase::TYPE_TEXT) { sharedptr layout_item = sharedptr::create(); layout_item->set_name(_("text")); layout_item->set_text_original(_("New Text")); layout_item_new = layout_item; } if(layout_item_new) { layout_group->add_item(layout_item_new, layout_item); //We have changed the structure itself in the document, because we are using the same structure via sharedptr. //So we just tell the parent widgets to rebuild the layout from the document: signal_layout_changed().emit(); //This should result in a complete re-layout. } } #endif // !GLOM_ENABLE_CLIENT_ONLY //TODO: Use Value by const & void FlowTableWithFields::on_portal_user_requested_details(Gnome::Gda::Value primary_key_value, Box_Data_Portal* portal_box) { sharedptr portal = portal_box->get_portal(); if(!portal) return; //Try to find a related (or doubly related) table that is not hidden, and open that, //based on the navigation options for the portal: Glib::ustring table_name; Gnome::Gda::Value primary_key; portal_box->get_suitable_record_to_view_details(primary_key_value, table_name, primary_key); if(!(table_name.empty()) && !Conversions::value_is_empty(primary_key)) signal_requested_related_details().emit(table_name, primary_key); } void FlowTableWithFields::apply_size_groups_to_labels(const type_vec_sizegroups& size_groups) { //Remove widgets from any existing size group: for(type_listFields::iterator iter = m_listFields.begin(); iter != m_listFields.end(); ++iter) { Info info = *iter; Gtk::Label* label = info.m_first; Glib::RefPtr previous_size_group = info.m_first_in_sizegroup; if(!label || !previous_size_group) continue; previous_size_group->remove_widget(*label); info.m_first_in_sizegroup.reset(); } m_vec_size_groups = size_groups; if(m_vec_size_groups.empty()) return; for(type_listFields::iterator iter = m_listFields.begin(); iter != m_listFields.end(); ++iter) { Info info = *iter; Gtk::Label* label = info.m_first; if(!label) continue; Gtk::EventBox* label_parent = info.m_first_eventbox; if(!label_parent) continue; //Only align labels in the first column, because items in separate columns //couldn't be aligned vertically anyway, and this would cause extra space. //TODO: Use a different SizeGroup for items in 2nd columns? guint column = 0; const bool ready = get_column_for_first_widget(*label_parent, column); if(!ready) continue; if(column >= m_vec_size_groups.size()) continue; Glib::RefPtr size_group = m_vec_size_groups[column]; if(size_group && (info.m_first_in_sizegroup != size_group)) { size_group->add_widget(*label); info.m_first_in_sizegroup = size_group; //Remember it so we can remove it later. } } } void FlowTableWithFields::align_child_group_labels() { //Don't bother if there are not >1 groups to align: if(m_sub_flow_tables.size() < 2) return; //Create a size group for each column and tell all groups to use them for their labels: const guint max_columns = get_sub_flowtables_max_columns(); type_vec_sizegroups vec_sizegroups(max_columns); for(guint i = 0; i < max_columns; ++i) { vec_sizegroups[i] = Gtk::SizeGroup::create(Gtk::SIZE_GROUP_HORIZONTAL); } for(type_sub_flow_tables::iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { FlowTableWithFields* subtable = *iter; if(subtable) subtable->apply_size_groups_to_labels(vec_sizegroups); } } guint FlowTableWithFields::get_sub_flowtables_max_columns() const { guint result = get_lines(); for(type_sub_flow_tables::const_iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { const FlowTableWithFields* subtable = *iter; if(subtable) { const guint count = subtable->get_lines(); if(count > result) result = count; } } return result; } #ifndef GLOM_ENABLE_CLIENT_ONLY void FlowTableWithFields::on_menu_properties_activate() { Dialog_FlowTable* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_flowtable(this); const int response = dialog->run(); if(response == Gtk::RESPONSE_OK) { sharedptr group = get_layout_group(); group->set_columns_count( dialog->get_columns_count() ); group->set_title(dialog->get_title(), AppWindow::get_current_locale()); signal_layout_changed().emit(); } delete dialog; } void FlowTableWithFields::on_menu_delete_activate() { Glib::ustring message; if(!item_get_title(get_layout_item()).empty()) { //TODO: Use a real English sentence here? message = Glib::ustring::compose(_("Delete whole group \"%1\"?"), item_get_title(get_layout_item())); } else { //TODO: Use a real English sentence here: message = _("Delete whole group?"); } Gtk::MessageDialog dlg(message, false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true); switch(dlg.run()) { case Gtk::RESPONSE_YES: LayoutWidgetUtils::on_menu_delete_activate(); break; default: return; } } bool FlowTableWithFields::on_button_press_event(GdkEventButton *event) { AppWindow* pApp = AppWindow::get_appwindow(); if(pApp && pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pPopupMenuUtils->popup(event->button, event->time); return true; //We handled this event. } } return Gtk::Widget::on_button_press_event(event); } //TODO: Rename this? It's not a simpler getter. It does UI. sharedptr FlowTableWithFields::get_portal_relationship() { Dialog_ChooseRelationship* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return sharedptr(); Document* pDocument = static_cast(get_document()); dialog->set_document(pDocument, m_table_name); //TODO: dialog->set_transient_for(*get_app_window()); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: sharedptr relationship = dialog->get_relationship_chosen(); if(relationship) { sharedptr layout_item = sharedptr::create(); layout_item->set_relationship(relationship); delete dialog; return layout_item; } } delete dialog; return sharedptr(); } void FlowTableWithFields::set_find_mode(bool val) { m_find_mode = val; //Set find mode in all portals: for(type_portals::const_iterator iter = m_portals.begin(); iter != m_portals.end(); ++iter) { //*iter is a FlowTableItem. Box_Data_Portal* portal = *iter; if(portal) portal->set_find_mode(m_find_mode); } //Set find mode in all the child flowtables, recursively: for(type_sub_flow_tables::iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { FlowTableWithFields* subtable = *iter; if(subtable) { subtable->set_find_mode(m_find_mode); } } } void FlowTableWithFields::set_enable_drag_and_drop(bool enabled) { const EggDragEnableMode drag_mode = (enabled ? EGG_DRAG_FULL : EGG_DRAG_DISABLED); //Only enable dragging of the sub-tables. //Otherwise just the whole thing will be dragged, //though there would be nowhere to drop it: set_drag_enabled(EGG_DRAG_DISABLED); set_drop_enabled(enabled); for(type_sub_flow_tables::iterator iter = m_sub_flow_tables.begin(); iter != m_sub_flow_tables.end(); ++iter) { FlowTableWithFields* child = *iter; if(child) { //std::cout << G_STRFUNC << ": child" << std::endl; child->set_drag_enabled(drag_mode); child->set_drop_enabled(enabled); } } } #endif // !GLOM_ENABLE_CLIENT_ONLY } //namespace Glom glom-1.22.4/glom/mode_data/box_data.h0000644000175000017500000001215412234252646020602 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_BOX_DATA_H #define GLOM_MODE_DATA_BOX_DATA_H #include "config.h" // GLOM_ENABLE_CLIENT_ONLY #include #include #include namespace Glom { /** A Box for viewing and editing the data in a database table. * * Call init_db_details() to create the layout and fill it with data from the database. * Call refresh_data_from_database() to fill the existing layout with up-to-date data from the database. * * Derived classes should implement create_layout() to create/arrange the widgets for the groups, fields, portals, etc. * Derived classes should implement fill_from_database() to get the data from the database and fill the widgets created by create_layout(). */ class Box_Data : public Box_WithButtons, public Base_DB_Table_Data { public: Box_Data(); virtual ~Box_Data(); //TODO: Put this in Base_DB_Table_Data? ///Create the layout for the database structure, and fill it with data from the database. bool init_db_details(const FoundSet& found_set, const Glib::ustring& layout_platform); //Fill the existing layout with data from the database: virtual bool refresh_data_from_database_with_where_clause(const FoundSet& found_set); virtual void print_layout(); //A test, for now. ///Get the existing where clause, previously supplied to init_db_details(). FoundSet get_found_set() const; virtual Gnome::Gda::SqlExpr get_find_where_clause() const; virtual void set_unstored_data(bool bVal); virtual bool get_unstored_data() const; virtual bool confirm_discard_unstored_data() const; #ifndef GLOM_ENABLE_CLIENT_ONLY void show_layout_dialog(); #endif // !GLOM_ENABLE_CLIENT_ONLY Glib::ustring get_layout_name() const; //Signals: /** Emitted when the user has entered a find critera that * should be used to find and display records. * Used by _Find sub-classes. * @param find_criteria The SQL where clause. */ //Should be a MI class, derived by those sub-classes. TODO. //where_clause. sigc::signal signal_find_criteria; #ifndef GLOM_ENABLE_CLIENT_ONLY //g++ 3.4 needs this to be public when used from Box_Data_Details. I'm not sure why. murrayc. virtual void on_dialog_layout_hide(); #endif // !GLOM_ENABLE_CLIENT_ONLY protected: /* Create the layout based on the database structure and saved layout, * so that fill_from_database() can fill it with data. */ virtual void create_layout(); ///Fill the existing layout with data from the database. virtual bool fill_from_database(); //override. virtual type_vecConstLayoutFields get_fields_to_show() const; type_vecConstLayoutFields get_table_fields_to_show(const Glib::ustring& table_name) const; /** Get the layout groups, with the Field information filled in. */ Document::type_list_layout_groups get_data_layout_groups(const Glib::ustring& layout_name, const Glib::ustring& layout_platform); void fill_layout_group_field_info(const sharedptr& group, const Privileges& table_privs); void execute_button_script(const sharedptr& layout_item, const Gnome::Gda::Value& primary_key_value); private: //Signal handlers: void on_Button_Find(); //only used by _Find sub-classes. Should be MI. //Signal handlers for the PyGlomUI callbacks: void on_python_requested_show_table_details(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value); void on_python_requested_show_table_list(const Glib::ustring& table_name); void on_python_requested_print_report(const Glib::ustring& report_name); void on_python_requested_print_layout(); void on_python_requested_start_new_record(); protected: #ifndef GLOM_ENABLE_CLIENT_ONLY virtual Dialog_Layout* create_layout_dialog() const = 0; virtual void prepare_layout_dialog(Dialog_Layout* dialog) = 0; #endif // !GLOM_ENABLE_CLIENT_ONLY Gtk::Button m_Button_Find; //only used by _Find sub-classes. Should be MI. Gtk::Label m_Label_FindStatus; bool m_bUnstoredData; #ifndef GLOM_ENABLE_CLIENT_ONLY Dialog_Layout* m_pDialogLayout; #endif // !GLOM_ENABLE_CLIENT_ONLY /// "details" or "list", as specified in the Document's XML. Glib::ustring m_layout_name; /// Empty string or "maemo" as specified in the Document's XML. Glib::ustring m_layout_platform; }; } //namespace Glom #endif // GLOM_MODE_DATA_BOX_DATA_H glom-1.22.4/glom/mode_data/box_data_list.h0000644000175000017500000001027012234252646021632 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_BOX_DATA_LIST_H #define GLOM_MODE_DATA_BOX_DATA_LIST_H #include "config.h" // GLOM_ENABLE_CLIENT_ONLY #include "box_data_manyrecords.h" #include namespace Glom { class Box_Data_List : public Box_Data_ManyRecords { public: Box_Data_List(); virtual ~Box_Data_List(); void refresh_data_from_database_blank(); Gnome::Gda::Value get_primary_key_value_first() const; //Implementations of pure virtual methods from Base_DB_Table_Data: virtual Gnome::Gda::Value get_primary_key_value_selected() const; virtual void set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_entered_field_data(const sharedptr& field) const; virtual void set_entered_field_data(const sharedptr& field, const Gnome::Gda::Value& value); virtual void set_entered_field_data(const Gtk::TreeModel::iterator& row, const sharedptr& field, const Gnome::Gda::Value& value); virtual Gtk::TreeModel::iterator get_row_selected(); bool get_showing_multiple_records() const; void set_read_only(bool read_only = true); //For instance, change "Open" to "Select" when used to select an ID. void set_open_button_title(const Glib::ustring& title); ///Highlight and scroll to the specified record, with primary key value @primary_key_value. void set_primary_key_value_selected(const Gnome::Gda::Value& primary_key_value); //Signal Handlers: void on_details_nav_first(); void on_details_nav_previous(); void on_details_nav_next(); void on_details_nav_last(); void on_details_record_deleted(const Gnome::Gda::Value& primary_key_value); void get_record_counts(gulong& total, gulong& found) const; #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void on_dialog_layout_hide(); //override #endif //GLOM_ENABLE_CLIENT_ONLY protected: //Implementations of pure virtual methods from Base_DB_Table_Data: virtual Gnome::Gda::Value get_primary_key_value(const Gtk::TreeModel::iterator& row) const; //Overrides of functions from Box_Data: virtual void create_layout(); //override virtual Document::type_list_layout_groups create_layout_get_layout(); virtual bool fill_from_database(); //override. virtual void enable_buttons(); virtual sharedptr get_field_primary_key() const; //Signal handlers: void on_adddel_user_requested_edit(const Gtk::TreeModel::iterator& row); void on_adddel_user_requested_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& rowEnd); void on_adddel_user_reordered_columns(); void on_adddel_user_sort_clause_changed(); #ifndef GLOM_ENABLE_CLIENT_ONLY void on_adddel_user_requested_layout(); #endif // !GLOM_ENABLE_CLIENT_ONLY void on_adddel_script_button_clicked(const sharedptr& layout_item, const Gtk::TreeModel::iterator& row); bool on_script_button_idle(const sharedptr& layout_item, const Gnome::Gda::Value& primary_key); #ifndef GLOM_ENABLE_CLIENT_ONLY virtual Dialog_Layout* create_layout_dialog() const; // override. virtual void prepare_layout_dialog(Dialog_Layout* dialog); // override. #endif // !GLOM_ENABLE_CLIENT_ONLY //Member widgets: mutable DbAddDel_WithButtons m_AddDel; //mutable because its get_ methods aren't const. bool m_read_only; }; } //namespace Glom #endif // GLOM_MODE_DATA_BOX_DATA_LIST_H glom-1.22.4/glom/mode_data/box_data_list.cc0000644000175000017500000004224112234252646021773 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "box_data_list.h" #include #include #include #include #include #include //For bold_message()). #include //For stringstream #include #include namespace Glom { Box_Data_List::Box_Data_List() : m_read_only(false) { m_layout_name = "list"; //m_strHint = _("When you change the data in a field the database is updated immediately.\n Click [Add] or enter data into the last row to add a new record.\n Leave automatic ID fields empty - they will be filled for you.\nOnly the first 100 records are shown."); pack_start(m_AddDel); add_view(&m_AddDel); //Give it access to the document. //Connect signals: //The Add and Delete buttons are handled by the DbAddDel widget itself. m_AddDel.signal_user_requested_edit().connect(sigc::mem_fun(*this, &Box_Data_List::on_adddel_user_requested_edit)); m_AddDel.signal_script_button_clicked().connect(sigc::mem_fun(*this, &Box_Data_List::on_adddel_script_button_clicked)); m_AddDel.signal_sort_clause_changed().connect(sigc::mem_fun(*this, &Box_Data_List::on_adddel_user_sort_clause_changed)); m_AddDel.signal_record_selection_changed().connect(m_signal_record_selection_changed.make_slot()); //TODO: Re-add this signal if this is really wanted, but make it part of a complete drag-and-drop feature for list views: //m_AddDel.signal_user_reordered_columns().connect(sigc::mem_fun(*this, &Box_Data_List::on_adddel_user_reordered_columns)); #ifndef GLOM_ENABLE_CLIENT_ONLY m_AddDel.signal_user_requested_layout().connect(sigc::mem_fun(*this, &Box_Data_List::on_adddel_user_requested_layout)); #endif // !GLOM_ENABLE_CLIENT_ONLY //Groups are not very helpful for a list view: //m_pDialogLayout->set_show_groups(false); m_AddDel.show(); } Box_Data_List::~Box_Data_List() { remove_view(&m_AddDel); } void Box_Data_List::enable_buttons() { const Privileges table_privs = Privs::get_current_privs(m_table_name); //Enable/Disable record creation and deletion: bool allow_create = !m_read_only; bool allow_delete = !m_read_only; if(!m_read_only) { allow_create = table_privs.m_create; allow_delete = table_privs.m_delete; } m_AddDel.set_allow_add(allow_create); m_AddDel.set_allow_delete(allow_delete); m_AddDel.set_allow_view_details(table_privs.m_view); } void Box_Data_List::refresh_data_from_database_blank() { FoundSet found_set = m_found_set; found_set.m_where_clause = Gnome::Gda::SqlExpr(); m_AddDel.set_found_set(found_set); std::cout << "debug: " << G_STRFUNC << ": before refresh_from_database_blank()." << std::endl; m_AddDel.refresh_from_database_blank(); m_found_set = found_set; } bool Box_Data_List::fill_from_database() { bool result = false; //Don't try to open a connection if there is no document, //for instance, during application destruction. if(!get_document()) return false; BusyCursor busy_cursor(get_app_window()); sharedptr sharedconnection; try { sharedconnection = connect_to_server(get_app_window()); } catch(const Glib::Exception& ex) { handle_error(ex); result = false; } catch(const std::exception& ex) { handle_error(ex); result = false; } if(sharedconnection) { Box_Data::fill_from_database(); //Field Names: //create_layout(); //if(sharedconnection) //{ //Glib::RefPtr connection = sharedconnection->get_gda_connection(); //Do not try to show the data if the user may not view it: const Privileges table_privs = Privs::get_current_privs(m_table_name); enable_buttons(); m_AddDel.set_allow_view(table_privs.m_view); m_AddDel.set_found_set(m_found_set); result = m_AddDel.refresh_from_database(); if(table_privs.m_view) { //Select first record: Glib::RefPtr refModel = m_AddDel.get_model(); if(refModel) m_AddDel.select_item(refModel->children().begin()); } //privs } return result; } void Box_Data_List::on_adddel_user_requested_edit(const Gtk::TreeModel::iterator& row) { const Gnome::Gda::Value primary_key_value = m_AddDel.get_value_key(row); //The primary key is in the key. signal_user_requested_details().emit(primary_key_value); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Data_List::on_adddel_user_requested_layout() { show_layout_dialog(); } #endif // !GLOM_ENABLE_CLIENT_ONLY void Box_Data_List::set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value) { m_AddDel.set_value_key(row, value); } void Box_Data_List::on_adddel_user_reordered_columns() { Document* pDoc = dynamic_cast(get_document()); if(pDoc) { sharedptr group = sharedptr::create(); group->set_name("toplevel"); AddDel::type_vec_strings vec_field_names = m_AddDel.get_columns_order(); for(AddDel::type_vec_strings::iterator iter = vec_field_names.begin(); iter != vec_field_names.end(); ++iter) { sharedptr layout_item = sharedptr::create(); layout_item->set_name(*iter); group->add_item(layout_item); } Document::type_list_layout_groups mapGroups; mapGroups[1] = group; pDoc->set_data_layout_groups("list", m_table_name, m_layout_platform, mapGroups); } } void Box_Data_List::on_adddel_script_button_clicked(const sharedptr& layout_item, const Gtk::TreeModel::iterator& row) { if(!layout_item) return; const Gnome::Gda::Value primary_key_value = get_primary_key_value(row); // TODO: Calling refresh_data_from_database(), // or navigating to a different table from inside the Python script, // causes a crash somewhere down in GTK+, so it is done in an idle handler here. // We are currently in a callback from the CellRendererButton_Text cell // renderer which is deleted by a call to refresh_data_from_database(). // Probably this causes issues somewhere. Glib::signal_idle().connect( sigc::bind( sigc::mem_fun(*this, &Box_Data_List::on_script_button_idle), layout_item, primary_key_value)); } bool Box_Data_List::on_script_button_idle(const sharedptr& layout_item, const Gnome::Gda::Value& primary_key) { execute_button_script(layout_item, primary_key); // Refill view from database as the script might have changed arbitrary records #if 0 // TODO: This is perhaps a better approach, but // DbTreeModel::refresh_from_database is protected Glib::RefPtr model = m_AddDel.get_model(); Glib::RefPtr db_model = Glib::RefPtr::cast_dynamic(model); if(db_model) db_model->refresh_from_database(m_found_set); #endif refresh_data_from_database(); set_primary_key_value_selected(primary_key); return false; } void Box_Data_List::on_details_nav_first() { m_AddDel.select_item(m_AddDel.get_model()->children().begin()); signal_user_requested_details().emit(m_AddDel.get_value_key_selected()); } void Box_Data_List::on_details_nav_previous() { Gtk::TreeModel::iterator iter = m_AddDel.get_item_selected(); if(iter) { //Don't try to select a negative record number. if(!m_AddDel.get_is_first_row(iter)) { iter--; m_AddDel.select_item(iter); signal_user_requested_details().emit(m_AddDel.get_value_key_selected()); } } } void Box_Data_List::on_details_nav_next() { Gtk::TreeModel::iterator iter = m_AddDel.get_item_selected(); if(iter) { //Don't go past the last record: if( !m_AddDel.get_is_last_row(iter) ) { //std::cout << "debug: " << G_STRFUNC << ": The current row was not the last row." << std::endl; iter++; m_AddDel.select_item(iter); signal_user_requested_details().emit(m_AddDel.get_value_key_selected()); } //else // std::cout << "debug: " << G_STRFUNC << ": Not going past the last row." << std::endl; } } void Box_Data_List::on_details_nav_last() { Gtk::TreeModel::iterator iter = m_AddDel.get_last_row(); if(iter) { m_AddDel.select_item(iter); signal_user_requested_details().emit(m_AddDel.get_value_key_selected()); } //No, don't do this. When would that ever be a good idea? murrayc: //signal_user_requested_details().emit(Gnome::Gda::Value()); //Show a blank record if there are no records. } void Box_Data_List::on_details_record_deleted(const Gnome::Gda::Value& primary_key_value) { //Find out which row is affected: Gtk::TreeModel::iterator iter = m_AddDel.get_row(primary_key_value); if(iter) { //Remove the row: Gtk::TreeModel::iterator iterNext = iter; iterNext++; m_AddDel.remove_item(iter); //Show Details for the next one: if(iterNext != m_AddDel.get_model()->children().end()) { //Next record moves up one: on_adddel_user_requested_edit(iterNext); } else { //Just show the last one: on_details_nav_last(); } } else { //Just update everything and go the first record. //This shouldn't happen. fill_from_database(); on_details_nav_first(); } } Gnome::Gda::Value Box_Data_List::get_primary_key_value(const Gtk::TreeModel::iterator& row) const { return m_AddDel.get_value_key(row); } Gnome::Gda::Value Box_Data_List::get_primary_key_value_selected() const { return m_AddDel.get_value_key_selected(); } Gnome::Gda::Value Box_Data_List::get_primary_key_value_first() const { //std::cout << "debug: " << G_STRFUNC << ": get_primary_key_value_first() records_count = " << m_AddDel.get_count() << std::endl; Glib::RefPtr model = m_AddDel.get_model(); if(model) { Gtk::TreeModel::iterator iter = model->children().begin(); while(iter != model->children().end()) { Gnome::Gda::Value value = get_primary_key_value(iter); if(Conversions::value_is_empty(value)) { //std::cout << "debug: " << G_STRFUNC << ": get_primary_key_value_first() iter val is NULL" << std::endl; ++iter; } else { //std::cout << "debug: " << G_STRFUNC << ": get_primary_key_value_first() returning: " << value.to_string() << std::endl; return value; } } } // std::cout << "debug: " << G_STRFUNC << ": get_primary_key_value_first() return NULL" << std::endl; return Gnome::Gda::Value(); } Gnome::Gda::Value Box_Data_List::get_entered_field_data(const sharedptr& field) const { return m_AddDel.get_value_selected(field); } void Box_Data_List::set_entered_field_data(const sharedptr& field, const Gnome::Gda::Value& value) { return m_AddDel.set_value_selected(field, value); } void Box_Data_List::set_entered_field_data(const Gtk::TreeModel::iterator& row, const sharedptr& field, const Gnome::Gda::Value& value) { return m_AddDel.set_value(row, field, value); } bool Box_Data_List::get_showing_multiple_records() const { return m_AddDel.get_count() > 1; } Document::type_list_layout_groups Box_Data_List::create_layout_get_layout() { //This method is overriden in Box_Data_List_Related. return get_data_layout_groups(m_layout_name, m_layout_platform); } void Box_Data_List::create_layout() { Box_Data::create_layout(); //Fills m_TableFields. const Document* pDoc = dynamic_cast(get_document()); if(!pDoc) return; //Field Names: m_AddDel.remove_all_columns(); //m_AddDel.set_columns_count(m_Fields.size()); m_AddDel.set_table_name(m_table_name); sharedptr field_primary_key = get_field_primary_key_for_table(m_table_name); if(!field_primary_key) { std::cerr << G_STRFUNC << ": primary key not found for table: " << m_table_name << std::endl; return; } m_AddDel.set_key_field(field_primary_key); LayoutGroup::type_list_items items_to_use; //This map of layout groups will also contain the field information from the database: Document::type_list_layout_groups layout_groups = create_layout_get_layout(); for(Document::type_list_layout_groups::const_iterator iter = layout_groups.begin(); iter != layout_groups.end(); ++iter) { const sharedptr layout_group = *iter; if(!layout_group) continue; const LayoutGroup::type_list_items child_items = layout_group->get_items_recursive(); for(LayoutGroup::type_list_items::const_iterator iterItems = child_items.begin(); iterItems != child_items.end(); ++iterItems) { sharedptr child_item = *iterItems; //TODO: Set the whole thing as read-only instead: if(m_read_only) child_item->set_editable(false); sharedptr child_field = sharedptr::cast_dynamic(child_item); //This check has already happened in Frame_Glom::update_table_in_document_from_database(). //It is inefficient and unnecessary to do it here too. /* if(child_field) { //Check that the field really exists, to avoid SQL errors. //This could probably only happen if we have failed to rename something everywhere, when the user has renamed something. if(!DbUtils::get_field_exists_in_database(child_field->get_table_used(m_table_name), child_field->get_name())) { std::cerr << G_STRFUNC << ": Field does not exist in database: table_name=" << child_field->get_table_used(m_table_name) << ", field_name=" << child_field->get_name() << std::endl; continue; } } */ items_to_use.push_back(child_item); } } //Add extra possibly-non-visible columns that we need: //TODO: Only add it if it is not already there. items_to_use = Utils::get_layout_items_plus_primary_key(items_to_use, pDoc, m_table_name); if(field_primary_key) { sharedptr layout_item = sharedptr::create(); layout_item->set_hidden(); layout_item->set_full_field_details(m_AddDel.get_key_field()); m_FieldsShown.push_back(layout_item); //TODO: Do this only if it is not already present. } const Privileges table_privs = Privs::get_current_privs(m_found_set.m_table_name); m_AddDel.set_allow_view(table_privs.m_view); m_AddDel.set_found_set(m_found_set); m_AddDel.set_columns(items_to_use); //TODO: Use LayoutGroup::type_list_const_items instead? m_FieldsShown = get_fields_to_show(); } sharedptr Box_Data_List::get_field_primary_key() const { return m_AddDel.get_key_field(); } void Box_Data_List::set_read_only(bool read_only) { //This is useful when showing find results for the user to select one, without changing them. m_read_only = read_only; m_AddDel.set_allow_add(!read_only); m_AddDel.set_allow_delete(!read_only); } void Box_Data_List::set_open_button_title(const Glib::ustring& title) { m_AddDel.set_open_button_title(title); } void Box_Data_List::set_primary_key_value_selected(const Gnome::Gda::Value& primary_key_value) { Gtk::TreeModel::iterator iter = m_AddDel.get_row(primary_key_value); if(iter) { m_AddDel.select_item(iter); } } void Box_Data_List::get_record_counts(gulong& total, gulong& found) const { //Initialize output parameters: total = 0; found = 0; Glib::RefPtr refModel = m_AddDel.get_model(); Glib::RefPtr refModelDerived = Glib::RefPtr::cast_dynamic(refModel); if(refModelDerived) refModelDerived->get_record_counts(total, found); } void Box_Data_List::on_adddel_user_sort_clause_changed() { //Remember details about the previously viewed table, //so we don't forget the sort order and where clause when //navigating back, which would annoy the user: m_found_set = m_AddDel.get_found_set(); Document* document = get_document(); if(document) document->set_criteria_current(m_table_name, m_found_set); } Gtk::TreeModel::iterator Box_Data_List::get_row_selected() { return m_AddDel.get_item_selected(); } #ifndef GLOM_ENABLE_CLIENT_ONLY //overridden, so we can change the column widths, so they are all visible: void Box_Data_List::on_dialog_layout_hide() { Box_Data::on_dialog_layout_hide(); } Dialog_Layout* Box_Data_List::create_layout_dialog() const { Dialog_Layout_List* dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(dialog); return dialog; } void Box_Data_List::prepare_layout_dialog(Dialog_Layout* dialog) { dialog->init(m_layout_name, m_layout_platform, get_document(), m_table_name, m_FieldsShown); //TODO: Use m_TableFields? } #endif // !GLOM_ENABLE_CLIENT_ONLY } //namespace Glom glom-1.22.4/glom/mode_data/flowtablewithfields.h0000644000175000017500000002771212234252646023071 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_FLOWTABLEWITHFIELDS_H #define GLOM_MODE_DATA_FLOWTABLEWITHFIELDS_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "box_data_calendar_related.h" #include //Forthe enum. #include #include #include #include #include #include #include namespace Glom { class DataWidget; class FlowTableWithFields : public FlowTable, #ifndef GLOM_ENABLE_CLIENT_ONLY public LayoutWidgetUtils, #endif public View_Composite_Glom { public: FlowTableWithFields(const Glib::ustring& table_name = Glib::ustring()); virtual ~FlowTableWithFields(); ///The table name is needed to discover details of relationships. virtual void set_table(const Glib::ustring& table_name); /** Prevent any attempts to change actual records, * if the widget is just being used to enter find critera, * and prevents any need for data retrieval from the database, because * no data will be displayed. * * @param val True if find mode should be used. */ void set_find_mode(bool val = true); /** Add a field. * @param layoutitem_field The layout item that describes this field, * @param table_name The table on which this layout appears. */ void add_field(const sharedptr& layoutitem_field, const Glib::ustring& table_name); void remove_field(const Glib::ustring& id); typedef std::map type_map_field_sequence; //virtual void add_group(const Glib::ustring& group_name, const Glib::ustring& group_title, const type_map_field_sequence& fields); void add_layout_item(const sharedptr& item); /** * @param with_indent Pass true for top-level groups, to avoid wasting extra space with an unnecessary indent. */ void add_layout_group(const sharedptr& group, bool with_indent = true); void set_field_editable(const sharedptr& field, bool editable = true); Gnome::Gda::Value get_field_value(const sharedptr& field) const; /** Set the displayed @a value in any instances of the specified @a field. */ void set_field_value(const sharedptr& field, const Gnome::Gda::Value& value); /** Set the displayed @a value in any instances of the field other than the specified @a layout_field. */ void set_other_field_value(const sharedptr& layout_field, const Gnome::Gda::Value& value); /** Refresh the list of related records in choice combo boxes, * in any instance of the specified field. */ void update_choices(const sharedptr& field); typedef std::list type_list_widgets; typedef std::list type_list_const_widgets; virtual void change_group(const Glib::ustring& id, const Glib::ustring& new_group); virtual void set_design_mode(bool value = true); virtual void remove_all(); typedef std::vector< Glib::RefPtr > type_vec_sizegroups; /** Apply the size groups to all field labels. * By calling this method on multiple FlowTables, the field widgets in * different groups can then align. * @param size_groups A vector containing a size group for each possible column. */ void apply_size_groups_to_labels(const type_vec_sizegroups& size_group); /** Create a size group and make all the labels in child flowtables use it, * making them align. */ void align_child_group_labels(); /** Get the layout structure, which might have changed in the child widgets since * the whole widget structure was built. * for instance, if the user chose a new field for a DataWidget, * or a new relationship for a portal. */ void get_layout_groups(Document::type_list_layout_groups& groups); sharedptr get_layout_group(); void set_enable_drag_and_drop(bool enabled = true); /** For instance, * void on_flowtable_field_edited(const sharedptr& field, const Gnome::Gda::Value& value); */ typedef sigc::signal&, const Gnome::Gda::Value&> type_signal_field_edited; type_signal_field_edited signal_field_edited(); /** For instance, * void on_flowtable_field_choices_changed(const sharedptr& field); */ typedef sigc::signal&> type_signal_field_choices_changed; type_signal_field_choices_changed signal_field_choices_changed(); /** For instance, * void on_flowtable_field_open_details_requested(const sharedptr& field, const Gnome::Gda::Value& value); */ typedef sigc::signal&, const Gnome::Gda::Value&> type_signal_field_open_details_requested; type_signal_field_open_details_requested signal_field_open_details_requested(); /** For instance, * void on_related_record_changed(const Glib::ustring& relationship_name); */ typedef sigc::signal type_signal_related_record_changed; type_signal_related_record_changed signal_related_record_changed(); /** For instance, * void on_requested_related_details(const Glib::ustring& table_name, Gnome::Gda::Value primary_key_value); */ typedef sigc::signal type_signal_requested_related_details; type_signal_requested_related_details signal_requested_related_details(); /** For instance, * void on_script_button_clicked(const sharedptr& layout_item>); */ typedef sigc::signal&> type_signal_script_button_clicked; type_signal_script_button_clicked signal_script_button_clicked(); private: void set_field_value(const sharedptr& field, const Gnome::Gda::Value& value, bool set_specified_field_layout); // If include_item is set, then the output list will contain field's widget, // otherwise not. type_list_widgets get_field(const sharedptr& field, bool include_item); type_list_const_widgets get_field(const sharedptr& field, bool include_item) const; typedef std::list type_portals; /// Get portals whose relationships have @a from_key as the from_key. type_portals get_portals(const sharedptr& from_key); typedef std::list type_choice_widgets; /// Get choice widgets with !show_all relationships that have @a from_key as the from_key. type_choice_widgets get_choice_widgets(const sharedptr& from_key); /** Examine this flow table and all child flow tables, discovering which * has the most columns. */ guint get_sub_flowtables_max_columns() const; //int get_suitable_width(Field::glom_field_type field_type); void on_entry_edited(const Gnome::Gda::Value& value, const sharedptr field); void on_entry_choices_changed(const sharedptr field); void on_entry_open_details_requested(const Gnome::Gda::Value& value, const sharedptr field); void on_script_button_clicked(const sharedptr& layout_item); #ifndef GLOM_ENABLE_CLIENT_ONLY void on_datawidget_layout_item_added(LayoutWidgetBase::enumType item_type, DataWidget* pDataWidget); #endif // !GLOM_ENABLE_CLIENT_ONLY void on_portal_user_requested_details(Gnome::Gda::Value primary_key_value, Box_Data_Portal* portal_box); class Info { public: Info(); sharedptr m_field; //Store the field information so we know the title, ID, and type. Gtk::Label* m_first; Gtk::EventBox* m_first_eventbox; //The label is often inside an eventbox. Glib::RefPtr m_first_in_sizegroup; //Just to avoid a warning when removing a widget not in a group. DataWidget* m_second; Gtk::CheckButton* m_checkbutton; //Used instead of first and second if it's a bool. }; typedef std::list type_listFields; //Map of IDs to full info. type_listFields m_listFields; //Remember the nested FlowTables, so that we can search them for fields too: typedef std::list< FlowTableWithFields* > type_sub_flow_tables; type_sub_flow_tables m_sub_flow_tables; type_portals m_portals; //Remember the sequence of LayoutWidgetBase widgets, so we can iterate over them later: typedef std::list< LayoutWidgetBase* > type_list_layoutwidgets; type_list_layoutwidgets m_list_layoutwidgets; void add_button(const sharedptr& layoutitem_button, const Glib::ustring& table_name); void add_textobject(const sharedptr& layoutitem_text, const Glib::ustring& table_name); void add_imageobject(const sharedptr& layoutitem_image, const Glib::ustring& table_name); void add_layoutwidgetbase(LayoutWidgetBase* layout_widget); void add_layout_notebook(const sharedptr& notebook); void add_layout_portal(const sharedptr& portal); #ifndef GLOM_ENABLE_CLIENT_ONLY sharedptr get_portal_relationship(); #endif // !GLOM_ENABLE_CLIENT_ONLY Box_Data_List_Related* create_related(const sharedptr& portal, bool show_title = true); Box_Data_Calendar_Related* create_related_calendar(const sharedptr& portal, bool show_title = true); Gtk::Alignment* m_placeholder; Glib::ustring m_table_name; bool m_find_mode; //Size groups shared by this widget's sibling FlowTables, //with one group for each column. type_vec_sizegroups m_vec_size_groups; type_signal_field_edited m_signal_field_edited; type_signal_field_choices_changed m_signal_field_choices_changed; type_signal_field_open_details_requested m_signal_field_open_details_requested; //type_signal_related_record_added m_signal_related_record_added; type_signal_related_record_changed m_signal_related_record_changed; type_signal_requested_related_details m_signal_requested_related_details; type_signal_script_button_clicked m_signal_script_button_clicked; //menu #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void on_menu_properties_activate(); virtual void on_menu_delete_activate(); // override this to add a dialog box virtual bool on_button_press_event(GdkEventButton *event); #endif // !GLOM_ENABLE_CLIENT_ONLY }; } //namespace Glom #endif // GLOM_MODE_DATA_FLOWTABLEWITHFIELDS_H glom-1.22.4/glom/mode_data/box_data_manyrecords.cc0000644000175000017500000000617712234252646023356 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "box_data_manyrecords.h" #include #include #include #include #include #include #include #include //For bold_message()). #include //For stringstream #include namespace Glom { Box_Data_ManyRecords::Box_Data_ManyRecords() : m_read_only(false) { //We do not actually use this, //so it is a bug if this appears in the .glom file: m_layout_name = "manyrecords"; //Set by derived classes. //Groups are not very helpful for a list view: //m_pDialogLayout->set_show_groups(false); } Box_Data_ManyRecords::~Box_Data_ManyRecords() { } void Box_Data_ManyRecords::refresh_data_from_database_blank() { //Overridden by derived classes. } /* Document::type_list_layout_groups Box_Data_ManyRecords::create_layout_get_layout() { //Overriden in Box_Data_ManyRecords_Related: return get_data_layout_groups(m_layout_name); } */ Box_Data_ManyRecords::type_signal_user_requested_details Box_Data_ManyRecords::signal_user_requested_details() { return m_signal_user_requested_details; } Box_Data_ManyRecords::type_signal_record_selection_changed Box_Data_ManyRecords::signal_record_selection_changed() { return m_signal_record_selection_changed; } void Box_Data_ManyRecords::print_layout() { const Privileges table_privs = Privs::get_current_privs(m_table_name); //Don't try to print tables that the user can't view. if(!table_privs.m_view) { //TODO: Warn the user. } else { //Create a simple report on the fly: Document* document = get_document(); sharedptr report_temp = ReportBuilder::create_standard_list_report(document, m_table_name); ReportBuilder report_builder(AppWindow::get_current_locale()); report_builder.set_document(document); const std::string filepath = report_builder.report_build_and_save(m_found_set, report_temp); Utils::show_report_in_browser(filepath, get_app_window()); } } void Box_Data_ManyRecords::print_layout_group(xmlpp::Element* /* node_parent */, const sharedptr& /* group */) { } void Box_Data_ManyRecords::set_primary_key_value_selected(const Gnome::Gda::Value& /* primary_key_value */) { //Overridden in derived classes. } } //namespace Glom glom-1.22.4/glom/mode_data/buttonglom.h0000644000175000017500000000307512234252646021215 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_BUTTON_GLOM_H #define GLOM_UTILITY_WIDGETS_BUTTON_GLOM_H #include #include #include #include namespace Glom { class AppWindow; class ButtonGlom : public Gtk::Button, public LayoutWidgetUtils { public: explicit ButtonGlom(BaseObjectType* cobject, const Glib::RefPtr& builder); ButtonGlom(); virtual ~ButtonGlom(); private: void init(); virtual AppWindow* get_appwindow() const; #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void on_menu_properties_activate(); virtual bool on_button_press_event(GdkEventButton *event); #endif // !GLOM_ENABLE_CLIENT_ONLY }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_BUTTON_GLOM_H glom-1.22.4/glom/mode_data/db_adddel/0000755000175000017500000000000012235000126020510 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_data/db_adddel/db_adddel_withbuttons.cc0000644000175000017500000000701712234776363025406 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "db_adddel_withbuttons.h" #include #include #include namespace Glom { DbAddDel_WithButtons::DbAddDel_WithButtons() : m_ButtonBox(Gtk::ORIENTATION_HORIZONTAL), m_Button_Del(Gtk::Stock::DELETE), m_Button_Edit(Gtk::Stock::OPEN), m_Button_Add(Gtk::Stock::ADD) { m_ButtonBox.set_layout(Gtk::BUTTONBOX_END); m_ButtonBox.set_spacing(Utils::DEFAULT_SPACING_SMALL); setup_buttons(); pack_start(m_ButtonBox, Gtk::PACK_SHRINK); //Link buttons to handlers: m_Button_Add.signal_clicked().connect(sigc::mem_fun(*this, &DbAddDel_WithButtons::on_button_add)); m_ButtonBox.pack_end(m_Button_Add, Gtk::PACK_SHRINK); m_Button_Del.signal_clicked().connect(sigc::mem_fun(*this, &DbAddDel_WithButtons::on_button_del)); m_Button_Edit.signal_clicked().connect(sigc::mem_fun(*this, &DbAddDel_WithButtons::on_button_edit)); m_ButtonBox.pack_end(m_Button_Del, Gtk::PACK_SHRINK); m_ButtonBox.pack_end(m_Button_Edit, Gtk::PACK_SHRINK); setup_buttons(); } DbAddDel_WithButtons::~DbAddDel_WithButtons() { } void DbAddDel_WithButtons::on_button_add() { on_MenuPopup_activate_Add(); } void DbAddDel_WithButtons::on_button_del() { on_MenuPopup_activate_Delete(); } void DbAddDel_WithButtons::on_button_edit() { do_user_requested_edit(); } void DbAddDel_WithButtons::set_allow_add(bool val) { DbAddDel::set_allow_add(val); setup_buttons(); } void DbAddDel_WithButtons::set_allow_delete(bool val) { DbAddDel::set_allow_delete(val); setup_buttons(); } void DbAddDel_WithButtons::set_allow_user_actions(bool bVal) { DbAddDel::set_allow_user_actions(bVal); setup_buttons(); //Recreate popup menu with correct items: setup_menu(); } void DbAddDel_WithButtons::setup_buttons() { const bool allow_edit = get_allow_user_actions() && get_allow_view_details(); const bool allow_del = get_allow_user_actions() && m_allow_delete; const bool allow_add = get_allow_user_actions() && m_allow_add; m_Button_Add.show(); m_Button_Add.set_property("visible", allow_add); m_Button_Edit.show(); m_Button_Edit.set_property("visible", allow_edit); if(!m_open_button_title.empty()) m_Button_Edit.set_label(m_open_button_title); m_Button_Del.show(); m_Button_Del.set_property("visible", allow_del); m_ButtonBox.show(); } void DbAddDel_WithButtons::show_all_vfunc() { //Call the base class: Gtk::Box::show_all_vfunc(); //Hide some stuff: setup_buttons(); } void DbAddDel_WithButtons::set_allow_view_details(bool val) { DbAddDel::set_allow_view_details(val); setup_buttons(); } void DbAddDel_WithButtons::on_selection_changed(bool selection) { m_Button_Edit.set_sensitive(selection); m_Button_Del.set_sensitive(selection); DbAddDel::on_selection_changed(selection); } } //namespace Glom glom-1.22.4/glom/mode_data/db_adddel/db_adddel.cc0000644000175000017500000023320312234776363022732 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "db_adddel.h" #include //For std::find. #include #include #include #include #include #include "db_treeviewcolumn_glom.h" #include #include #include #include //For Utils::image_scale_keeping_ratio(). #include #include #include #include #include //For debug output. namespace Glom { DbAddDel::DbAddDel() : Gtk::Box(Gtk::ORIENTATION_VERTICAL), m_column_is_sorted(false), m_column_sorted_direction(false), m_column_sorted(0), m_pMenuPopup(0), m_bAllowUserActions(true), m_bPreventUserSignals(false), m_bIgnoreTreeViewSignals(false), m_allow_add(true), m_allow_delete(true), m_find_mode(false), m_allow_only_one_related_record(false), m_validation_retry(false), m_allow_view(true), m_allow_view_details(false), m_treeviewcolumn_button(0), m_fixed_cell_height(0), m_rows_count_min(0), m_rows_count_max(0) { set_prevent_user_signals(); set_ignore_treeview_signals(true); set_spacing(Utils::DEFAULT_SPACING_SMALL); //Start with a useful default TreeModel: //set_columns_count(1); //construct_specified_columns(); // Give the TreeView an accessible name, to access it in LDTP // TODO: Maybe this should be a constructor parameter, so that multiple // DbAddDels in a single Window can be addressed separately. #ifdef GTKMM_ATKMM_ENABLED m_TreeView.get_accessible()->set_name(_("Table Content")); #endif m_ScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); m_ScrolledWindow.set_shadow_type(Gtk::SHADOW_IN); m_TreeView.set_fixed_height_mode(); //This allows some optimizations. m_TreeView.set_rules_hint(); m_ScrolledWindow.add(m_TreeView); pack_start(m_ScrolledWindow); m_TreeView.show(); //Make sure that the TreeView doesn't start out only big enough for zero items. set_height_rows(6, 6); //Allow the user to change the column order: //m_TreeView.set_column_drag_function( sigc::mem_fun(*this, &DbAddDel::on_treeview_column_drop) ); m_TreeView.add_events(Gdk::BUTTON_PRESS_MASK); //Allow us to catch button_press_event and button_release_event m_TreeView.signal_button_press_event().connect_notify( sigc::mem_fun(*this, &DbAddDel::on_treeview_button_press_event) ); m_TreeView.signal_columns_changed().connect( sigc::mem_fun(*this, &DbAddDel::on_treeview_columns_changed) ); //signal_button_press_event().connect(sigc::mem_fun(*this, &DbAddDel::on_button_press_event_Popup)); //add_blank(); setup_menu(); set_prevent_user_signals(false); set_ignore_treeview_signals(false); remove_all_columns(); //set up the default columns. show_all_children(); #ifdef GLOM_ENABLE_CLIENT_ONLY //Actually this has only been necessary for Maemo. // Adjust sizing when style changed signal_style_changed().connect(sigc::mem_fun(*this, &DbAddDel::on_self_style_changed)); #endif // !GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr refSelection = m_TreeView.get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &DbAddDel::on_treeview_selection_changed)); } } DbAddDel::~DbAddDel() { #ifndef GLOM_ENABLE_CLIENT_ONLY AppWindow* pApp = get_appwindow(); if(pApp) { pApp->remove_developer_action(m_refContextLayout); } #endif // !GLOM_ENABLE_CLIENT_ONLY } void DbAddDel::set_height_rows(gulong rows_count_min, gulong rows_count_max) { m_rows_count_min = rows_count_min; m_rows_count_max = rows_count_max; set_height_rows_actual(m_rows_count_min); } void DbAddDel::set_height_rows_actual(gulong rows_count) { //TODO: File a bug about API for this in GtkTreeView. const guint height_for_rows = rows_count * get_fixed_cell_height(); //std::cout << "debug: height_for_rows = " << height_for_rows << std::endl; const guint extra_for_treeview = 50; //TODO: Find some way to guess this. m_ScrolledWindow.set_min_content_height(height_for_rows + extra_for_treeview); } void DbAddDel::do_user_requested_edit() { Gtk::TreeModel::iterator iter = get_item_selected(); if(iter) { signal_user_requested_edit()(iter); } else std::cerr << G_STRFUNC << ": No item was selected." << std::endl; } void DbAddDel::on_idle_row_edit() { on_MenuPopup_activate_Edit(); } void DbAddDel::on_cell_button_clicked(const Gtk::TreeModel::Path& path) { if(!m_refListStore) return; Gtk::TreeModel::iterator iter = m_refListStore->get_iter(path); if(iter) { select_item(iter, false /* start_editing */); } //This delayed action avoids a warning about a NULL GtkAdjustment. //It's fairly understandable that GtkTreeView doesn't like to be destroyed //as a side-effect of a click on one of its GtkCellRenderers. //That's unlikely to be fixed properly until GtkTreeView supports a real //button cell-renderer. Glib::signal_idle().connect_once( sigc::mem_fun(*this, &DbAddDel::on_idle_row_edit)); } void DbAddDel::on_MenuPopup_activate_Edit() { do_user_requested_edit(); } void DbAddDel::on_MenuPopup_activate_Add() { //Create a new record in the database: start_new_record(); } void DbAddDel::on_MenuPopup_activate_Delete() { finish_editing(); Glib::RefPtr refSelection = m_TreeView.get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter && !get_is_placeholder_row(iter)) { //TODO: We can't handle multiple-selections yet. user_requested_delete(iter, iter); } } } void DbAddDel::on_MenuPopup_activate_layout() { finish_editing(); signal_user_requested_layout().emit(); } void DbAddDel::setup_menu() { m_refActionGroup = Gtk::ActionGroup::create(); m_refActionGroup->add(Gtk::Action::create("ContextMenu", "Context Menu") ); if(m_open_button_title.empty()) m_refContextEdit = Gtk::Action::create("ContextEdit", Gtk::Stock::EDIT); else m_refContextEdit = Gtk::Action::create("ContextEdit", m_open_button_title); m_refActionGroup->add(m_refContextEdit, sigc::mem_fun(*this, &DbAddDel::on_MenuPopup_activate_Edit) ); m_refContextDelete = Gtk::Action::create("ContextDelete", Gtk::Stock::DELETE); m_refActionGroup->add(m_refContextDelete, sigc::mem_fun(*this, &DbAddDel::on_MenuPopup_activate_Delete) ); m_refContextAdd = Gtk::Action::create("ContextAdd", Gtk::Stock::ADD); m_refActionGroup->add(m_refContextAdd, sigc::mem_fun(*this, &DbAddDel::on_MenuPopup_activate_Add) ); m_refContextAdd->set_sensitive(m_allow_add); #ifndef GLOM_ENABLE_CLIENT_ONLY // Don't add ContextLayout in client only mode because it would never // be sensitive anyway m_refContextLayout = Gtk::Action::create("ContextLayout", _("Layout")); m_refActionGroup->add(m_refContextLayout, sigc::mem_fun(*this, &DbAddDel::on_MenuPopup_activate_layout) ); //TODO: This does not work until this widget is in a container in the window: AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->update_userlevel_ui(); //Update our action's sensitivity. } #endif // !GLOM_ENABLE_CLIENT_ONLY m_refUIManager = Gtk::UIManager::create(); m_refUIManager->insert_action_group(m_refActionGroup); //TODO: add_accel_group(m_refUIManager->get_accel_group()); try { Glib::ustring ui_info = "" " " " " " " " " #ifndef GLOM_ENABLE_CLIENT_ONLY " " #endif " " ""; m_refUIManager->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_pMenuPopup = dynamic_cast( m_refUIManager->get_widget("/ContextMenu") ); if(!m_pMenuPopup) g_warning("menu not found"); if(get_allow_user_actions()) { m_refContextEdit->set_sensitive(); m_refContextDelete->set_sensitive(); } else { m_refContextEdit->set_sensitive(false); m_refContextDelete->set_sensitive(false); } #ifndef GLOM_ENABLE_CLIENT_ONLY if(pApp) m_refContextLayout->set_sensitive(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER); #endif // !GLOM_ENABLE_CLIENT_ONLY } bool DbAddDel::on_button_press_event_Popup(GdkEventButton *event) { #ifndef GLOM_ENABLE_CLIENT_ONLY //Enable/Disable items. //We did this earlier, but get_appwindow is more likely to work now: AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->update_userlevel_ui(); //Update our action's sensitivity. } #endif GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window(Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); return true; //handled. } else { if(event->type == GDK_2BUTTON_PRESS) { //Double-click means edit. //Don't do this usually, because users sometimes double-click by accident when they just want to edit a cell. //TODO: If the cell is not editable, handle the double-click as an edit/selection. //on_MenuPopup_activate_Edit(); return false; //Not handled. } } return false; //Not handled. TODO: Call base class? } Gtk::TreeModel::iterator DbAddDel::get_item_placeholder() { //Get the existing placeholder row, or add one if necessary: if(m_refListStore) return m_refListStore->get_placeholder_row(); else return Gtk::TreeModel::iterator(); } Gnome::Gda::Value DbAddDel::get_value(const Gtk::TreeModel::iterator& iter, const sharedptr& layout_item) const { Gnome::Gda::Value value; if(m_refListStore) { Gtk::TreeModel::Row treerow = *iter; if(treerow) { type_list_indexes list_indexes = get_data_model_column_index(layout_item); if(!list_indexes.empty()) { type_list_indexes::const_iterator iter = list_indexes.begin(); //Just get the first displayed instance of this field-> const guint col_real = *iter + get_count_hidden_system_columns(); treerow.get_value(col_real, value); } } } return value; } Gnome::Gda::Value DbAddDel::get_value_key_selected() const { Gtk::TreeModel::iterator iter = get_item_selected(); if(iter) { return get_value_key(iter); } else return Gnome::Gda::Value(); } Gnome::Gda::Value DbAddDel::get_value_selected(const sharedptr& layout_item) const { return get_value(get_item_selected(), layout_item); } Gtk::TreeModel::iterator DbAddDel::get_item_selected() { Glib::RefPtr refTreeSelection = m_TreeView.get_selection(); if(refTreeSelection) { return refTreeSelection->get_selected(); } if(m_refListStore) return m_refListStore->children().end(); else return Gtk::TreeModel::iterator(); } Gtk::TreeModel::iterator DbAddDel::get_item_selected() const { Glib::RefPtr refTreeSelection = m_TreeView.get_selection(); if(refTreeSelection) { Glib::RefPtr unconst = Glib::RefPtr::cast_const(refTreeSelection); return unconst->get_selected(); } if(m_refListStore) return m_refListStore->children().end(); else return Gtk::TreeModel::iterator(); } Gtk::TreeModel::iterator DbAddDel::get_row(const Gnome::Gda::Value& key) { if(!m_refListStore) return Gtk::TreeModel::iterator(); for(Gtk::TreeModel::iterator iter = m_refListStore->children().begin(); iter != m_refListStore->children().end(); ++iter) { //Gtk::TreeModel::Row row = *iter; const Gnome::Gda::Value& valTemp = get_value_key(iter); if(valTemp == key) { return iter; } } return m_refListStore->children().end(); } bool DbAddDel::select_item(const Gtk::TreeModel::iterator& iter, bool start_editing) { //Find the first column with a layout_item: sharedptr layout_item; for(type_column_items::const_iterator iter_columns = m_column_items.begin(); iter_columns != m_column_items.end(); ++iter_columns) { layout_item = *iter_columns; if(layout_item) break; } return select_item(iter, layout_item, start_editing); } bool DbAddDel::select_item(const Gtk::TreeModel::iterator& iter, const sharedptr& layout_item, bool start_editing) { if(!m_refListStore) return false; InnerIgnore innerIgnore(this); //see comments for InnerIgnore class bool bResult = false; if(iter) { //Get the model column: guint treemodel_col = 0; type_list_indexes list_indexes = get_column_index(layout_item); if(list_indexes.empty()) return false; else treemodel_col = *(list_indexes.begin()); treemodel_col += get_count_hidden_system_columns(); Glib::RefPtr refTreeSelection = m_TreeView.get_selection(); g_assert(refTreeSelection); refTreeSelection->select(iter); Gtk::TreeModel::Path path = m_refListStore->get_path(iter); guint view_column_index = 0; const bool test = get_view_column_index(treemodel_col, view_column_index); if(test) { Gtk::TreeView::Column* pColumn = m_TreeView.get_column(view_column_index); if(pColumn) { if(pColumn != m_treeviewcolumn_button) //This would activate the button. Let's avoid this, though it should never happen. { m_TreeView.set_cursor(path, *pColumn, start_editing); } } else g_warning("DbAddDel::select_item:TreeViewColumn not found."); } else g_warning("DbAddDel::select_item:TreeViewColumn index not found. column=%d", treemodel_col); bResult = true; } return bResult; } guint DbAddDel::get_count() const { if(!m_refListStore) return 0; guint iCount = m_refListStore->children().size(); //Take account of the extra blank for new entries: if(get_allow_user_actions()) //If it has the extra row. { --iCount; } return iCount; } guint DbAddDel::get_columns_count() const { return m_TreeView.get_columns().size(); } guint DbAddDel::get_fixed_cell_height() { if(m_fixed_cell_height <= 0) { // Discover a suitable height, and cache it, // by looking at the heights of all columns: // Note that this is usually calculated during construct_specified_columns(), // when all columns are known. //Get a default: Glib::RefPtr refLayout = m_TreeView.create_pango_layout("ExampleEg"); int width = 0; int height = 0; refLayout->get_pixel_size(width, height); m_fixed_cell_height = height; //Look at each column: for(type_column_items::iterator iter = m_column_items.begin(); iter != m_column_items.end(); ++iter) { Glib::ustring font_name; sharedptr item_withformatting = sharedptr::cast_dynamic(*iter); if(item_withformatting) { const Formatting& formatting = item_withformatting->get_formatting_used(); font_name = formatting.get_text_format_font(); } if(font_name.empty()) continue; // Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. Glib::RefPtr refLayout = m_TreeView.create_pango_layout(_("ExampleEg")); const Pango::FontDescription font(font_name); refLayout->set_font_description(font); int width = 0; int height = 0; refLayout->get_pixel_size(width, height); if(height > (int)m_fixed_cell_height) m_fixed_cell_height = (guint)height; } } //We add extra spacing, because otherwise the bottom of letters such as "g" get cut off. //We get this style property, which might be causing it. murrayc //TODO: Find out if this is reallyt the right way to calculate the correct height: int extra_height = 0; gtk_widget_style_get(GTK_WIDGET(m_TreeView.gobj()), "vertical-separator", &extra_height, (void*)0); //std::cout << "debug: extra_height=" << extra_height << std::endl; return m_fixed_cell_height + extra_height; } Gtk::CellRenderer* DbAddDel::construct_specified_columns_cellrenderer(const sharedptr& layout_item, int model_column_index, int data_model_column_index) { InnerIgnore innerIgnore(this); //see comments for InnerIgnore class Gtk::CellRenderer* pCellRenderer = create_cell(layout_item, m_table_name, get_document(), get_fixed_cell_height()); sharedptr item_field = sharedptr::cast_dynamic(layout_item); //Set extra cellrenderer attributes, depending on the type used, //to support editing: Gtk::CellRendererText* pCellRendererText = dynamic_cast(pCellRenderer); if(pCellRendererText) { //Connect to edited signal: if(item_field) //Only fields can be edited: { pCellRendererText->signal_editing_started().connect(sigc::mem_fun(*this, &DbAddDel::on_treeview_cell_editing_started)); //Make it editable: pCellRendererText->set_property("editable", true); //Connect to its signal: pCellRendererText->signal_edited().connect( sigc::bind( sigc::mem_fun(*this, &DbAddDel::on_treeview_cell_edited), model_column_index, data_model_column_index) ); } } else { Gtk::CellRendererToggle* pCellRendererToggle = dynamic_cast(pCellRenderer); if(pCellRendererToggle) { pCellRendererToggle->set_property("activatable", true); if(item_field) //Only fields can be edited: { //Connect to its signal: pCellRendererToggle->signal_toggled().connect( sigc::bind( sigc::mem_fun(*this, &DbAddDel::on_treeview_cell_edited_bool), model_column_index, data_model_column_index ) ); } } else { Gtk::CellRendererPixbuf* pCellRendererPixbuf = dynamic_cast(pCellRenderer); if(pCellRendererPixbuf) { //TODO: Do something when it's clicked, such as show the big image in a window or tooltip? } } } GlomCellRenderer_ButtonText* pCellButton = Gtk::manage( new GlomCellRenderer_ButtonText() ); if(pCellButton) { sharedptr item_button = sharedptr::cast_dynamic(layout_item); if(item_button) { pCellButton->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &DbAddDel::on_cell_layout_button_clicked), model_column_index) ); } } return pCellRenderer; } void DbAddDel::construct_specified_columns() { InnerIgnore innerIgnore(this); //TODO_optimisation: This is called many times, just to simplify the API. //Delay actual use of set_column_*() stuff until this method is called. if(m_column_items.empty()) { //std::cout << "debug: " << G_STRFUNC << ": showing hint model: m_find_mode=" << m_find_mode << std::endl; m_refListStore.reset(); if(m_table_name.empty()) { m_TreeView.set_model(m_refListStore); // clear old model from treeview } else show_hint_model(); return; } m_refListStore = DbTreeModel::create(m_found_set, m_column_items, m_allow_view, m_find_mode, m_FieldsShown); //m_FieldsShown is needed by Base_DB_Table_Data::record_new(). m_TreeView.set_model(m_refListStore); // clear old model from treeview //Remove all View columns: treeview_delete_all_columns(); //Add new View Colums: int model_column_index = 0; //Not including the hidden internal columns. int view_column_index = 0; { GlomCellRenderer_ButtonImage* pCellButton = Gtk::manage(new GlomCellRenderer_ButtonImage()); pCellButton->signal_clicked().connect(sigc::mem_fun(*this, &DbAddDel::on_cell_button_clicked)); m_treeviewcolumn_button = Gtk::manage(new Gtk::TreeViewColumn()); m_treeviewcolumn_button->pack_start(*pCellButton); Gtk::Requisition requistion_min, requistion_natural; //TODO: Really support natural size. pCellButton->get_preferred_size(m_TreeView, requistion_min, requistion_natural); m_treeviewcolumn_button->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); //Needed by fixed-height mode. // TODO: I am not sure whether this is always correct. Perhaps, we also // have to take into account the xpad property of the cell renderer and // the spacing property of the treeviewcolumn. int horizontal_separator = 0; m_TreeView.get_style_property("horizontal-separator", horizontal_separator); const int button_width = requistion_min.width + horizontal_separator*2; if(button_width > 0) //Otherwise an assertion fails. m_treeviewcolumn_button->set_fixed_width(button_width); m_treeviewcolumn_button->set_visible(m_allow_view_details); m_TreeView.append_column(*m_treeviewcolumn_button); ++view_column_index; } bool no_columns_used = true; int data_model_column_index = 0; //-1 means undefined index. guint column_to_expand = 0; const bool has_expandable_column = get_column_to_expand(column_to_expand); //std::cout << "DEBUG: column_to_expand=" << column_to_expand << ", has=" << has_expandable_column << std::endl; for(type_column_items::iterator iter = m_column_items.begin(); iter != m_column_items.end(); ++iter) { const sharedptr layout_item = m_column_items[model_column_index]; //TODO: Inefficient. if(layout_item) //column_info.m_visible) { no_columns_used = false; const Glib::ustring column_name = item_get_title_or_name(layout_item); const Glib::ustring column_id = layout_item->get_name(); // Whenever we are dealing with real database fields, // we need to know the index of the field in the query: int item_data_model_column_index = -1; sharedptr item_field = sharedptr::cast_dynamic(layout_item); if(item_field) { item_data_model_column_index = data_model_column_index; ++data_model_column_index; } //Add the ViewColumn Gtk::CellRenderer* pCellRenderer = construct_specified_columns_cellrenderer(layout_item, model_column_index, item_data_model_column_index); if(pCellRenderer) { //Get the index of the field in the query, if it is a field: //std::cout << "debug: model_column_index=" << model_column_index << ", item_data_model_column_index=" << item_data_model_column_index << std::endl; const bool expand = has_expandable_column && ((int)column_to_expand == model_column_index); treeview_append_column(column_name, *pCellRenderer, model_column_index, item_data_model_column_index, expand); /* TODO: if(column_info.m_editable) { } */ ++view_column_index; } } //is visible ++model_column_index; } //for if(no_columns_used) { show_hint_model(); } else { //We must set this each time, because show_hint_model() might unset it: m_TreeView.set_fixed_height_mode(); //This allows some optimizations. } m_TreeView.columns_autosize(); //Make sure there's a blank row after the database rows that have just been added. //add_blank(); //Adjust the number of rows to show. //This can change the amount of height requested for the widget. //Show as many rows as needed, but not more than the maximum: gulong total = 0; //ignored gulong db_rows_count_found = 0; Glib::RefPtr refModelDerived = Glib::RefPtr::cast_dynamic(m_refListStore); if(refModelDerived) refModelDerived->get_record_counts(total, db_rows_count_found); //+1 for the empty row: gulong rows_count = std::min(m_rows_count_max, db_rows_count_found + 1); //Do not use less than the minimum: rows_count = std::max(rows_count, m_rows_count_min); set_height_rows_actual(rows_count); } bool DbAddDel::refresh_from_database() { construct_specified_columns(); return true; /* if(m_refListStore) { //Glib::RefPtr refNull; const bool result = m_refListStore->refresh_from_database(m_found_set); //m_TreeView.set_model(refNull); //TODO: This causes a g_warning(): gtk_tree_view_unref_tree_helper: assertion `node != NULL' failed if(m_TreeView.get_model()) gtk_tree_view_set_model(m_TreeView.gobj(), 0); //This gives the same warning. m_TreeView.set_model(m_refListStore); return result; } else return false; */ } bool DbAddDel::refresh_from_database_blank() { if(m_find_mode) return refresh_from_database(); if(m_refListStore) { m_refListStore->clear(); //Remove all rows. } return true; } void DbAddDel::set_value(const Gtk::TreeModel::iterator& iter, const sharedptr& layout_item, const Gnome::Gda::Value& value) { set_value(iter, layout_item, value, true /* including the specified field */); } void DbAddDel::set_value(const Gtk::TreeModel::iterator& iter, const sharedptr& layout_item, const Gnome::Gda::Value& value, bool set_specified_field_layout) { //g_warning("DbAddDel::set_value begin"); InnerIgnore innerIgnore(this); if(!m_refListStore) { std::cerr << G_STRFUNC << ": No model." << std::endl; return; } //Show the value in any columns: Gtk::TreeModel::Row treerow = *iter; if(treerow) { const type_list_indexes list_indexes = get_data_model_column_index(layout_item, set_specified_field_layout); for(type_list_indexes::const_iterator iter = list_indexes.begin(); iter != list_indexes.end(); ++iter) { const guint treemodel_col = *iter + get_count_hidden_system_columns(); treerow.set_value(treemodel_col, value); } } /// Get indexes of any columns with choices with !show_all relationships that have @a from_key as the from_key. const type_list_indexes list_choice_cells = get_choice_index(layout_item /* from_key field name */); for(type_list_indexes::const_iterator iter = list_choice_cells.begin(); iter != list_choice_cells.end(); ++iter) { const guint model_index = *iter; refresh_cell_choices_data_from_database_with_foreign_key(model_index, value /* foreign key value */); } //Add extra blank if necessary: //add_blank(); //g_warning("DbAddDel::set_value end"); } void DbAddDel::set_value_selected(const sharedptr& layout_item, const Gnome::Gda::Value& value) { set_value(get_item_selected(), layout_item, value); } void DbAddDel::refresh_cell_choices_data_from_database_with_foreign_key(guint model_index, const Gnome::Gda::Value& foreign_key_value) { if(m_column_items.size() <= model_index) { std::cerr << G_STRFUNC << ": model_index is out of range: model_index=" << model_index << ", size=" << m_column_items.size() << std::endl; return; } sharedptr item = m_column_items[model_index]; sharedptr layout_field = sharedptr::cast_dynamic(item); if(!layout_field) { std::cerr << G_STRFUNC << ": The layout item was not a LayoutItem_Field." << std::endl; return; } guint view_column_index = 0; const bool test = get_view_column_index(model_index, view_column_index); if(!test) { std::cerr << G_STRFUNC << ": view column not found for model_column=" << model_index << std::endl; return; } CellRendererDbList* cell = dynamic_cast( m_TreeView.get_column_cell_renderer(view_column_index) ); if(!cell) { std::cerr << G_STRFUNC << ": cell renderer not found for model_column=" << model_index << std::endl; return; } cell->set_choices_related(get_document(), layout_field, foreign_key_value); } void DbAddDel::remove_all_columns() { m_column_items.clear(); m_fixed_cell_height = 0; //Force it to be recalculated. } void DbAddDel::set_table_name(const Glib::ustring& table_name) { m_found_set.m_table_name = table_name; Base_DB_Table::m_table_name = table_name; } void DbAddDel::set_columns(const LayoutGroup::type_list_items& layout_items) { InnerIgnore innerIgnore(this); //Stop on_treeview_columns_changed() from doing anything when it is called just because we add a new column. for(LayoutGroup::type_list_items::const_iterator iter = layout_items.begin(); iter != layout_items.end(); ++iter) { sharedptr layout_item = *iter; if(!layout_item) continue; //TODO: Do something more sensible. //Make it non-editable if it is auto-generated: //TODO: Actually use this bool: /* sharedptr field = sharedptr::cast_dynamic(layout_item); if(field) { sharedptr field_full = field->get_full_field_details(); if(field_full && field_full->get_auto_increment()) column_info.m_editable = false; else column_info.m_editable = field->get_editable_and_allowed(); } */ m_column_items.push_back(layout_item); } //Generate appropriate model columns: construct_specified_columns(); } void DbAddDel::set_found_set(const FoundSet& found_set) { m_found_set = found_set; } FoundSet DbAddDel::get_found_set() const { return m_found_set; } DbAddDel::type_list_indexes DbAddDel::get_data_model_column_index(const sharedptr& layout_item_field, bool including_specified_field_layout) const { //TODO_Performance: Replace all this looping by a cache/map: type_list_indexes list_indexes; if(!layout_item_field) return list_indexes; guint data_model_column_index = 0; for(type_column_items::const_iterator iter = m_column_items.begin(); iter != m_column_items.end(); ++iter) { sharedptr field = sharedptr::cast_dynamic(*iter); //TODO_Performance: This would be unnecessary if !layout_item_field if(field) { if(field->is_same_field(layout_item_field) && (including_specified_field_layout || field != layout_item_field)) { list_indexes.push_back(data_model_column_index); } ++data_model_column_index; } } return list_indexes; } DbAddDel::type_list_indexes DbAddDel::get_column_index(const sharedptr& layout_item) const { //TODO_Performance: Replace all this looping by a cache/map: type_list_indexes list_indexes; sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); guint i = 0; for(type_column_items::const_iterator iter = m_column_items.begin(); iter != m_column_items.end(); ++iter) { const sharedptr item = *iter; const sharedptr field = sharedptr::cast_dynamic(item); //TODO_Performance: This would be unnecessary if !layout_item_field if(field && layout_item_field && field->is_same_field(layout_item_field)) { list_indexes.push_back(i); } else if(*(item) == *(layout_item)) { list_indexes.push_back(i); } ++i; } return list_indexes; } DbAddDel::type_list_indexes DbAddDel::get_choice_index(const sharedptr& from_key) { type_list_indexes result; if(!from_key) return result; const Glib::ustring from_key_name = from_key->get_name(); guint index = 0; for(type_column_items::const_iterator iter = m_column_items.begin(); iter != m_column_items.end(); ++iter) { sharedptr field = sharedptr::cast_dynamic(*iter); if(!field) continue; const Formatting& format = field->get_formatting_used(); bool choice_show_all = false; const sharedptr choice_relationship = format.get_choices_related_relationship(choice_show_all); if(choice_relationship && !choice_show_all) //"Show All" choices don't use the ID field values. { if(choice_relationship->get_from_field() == from_key_name) result.push_back(index); } index++; } return result; } sharedptr DbAddDel::get_column_field(guint column_index) const { if(column_index < m_column_items.size()) { sharedptr field = sharedptr::cast_dynamic( m_column_items[column_index] ); if(field) return field; } return sharedptr(); } bool DbAddDel::get_prevent_user_signals() const { return m_bPreventUserSignals; } void DbAddDel::set_prevent_user_signals(bool bVal) { m_bPreventUserSignals = bVal; } /* //This is generally used for non-database-data lists. void DbAddDel::set_column_choices(guint col, const type_vec_strings& vecStrings) { InnerIgnore innerIgnore(this); //Stop on_treeview_columns_changed() from doing anything when it is called just because we add new columns. m_column_items[col].m_choices = vecStrings; guint view_column_index = 0; const bool test = get_view_column_index(col, view_column_index); if(test) { CellRendererDbList* pCellRenderer = dynamic_cast( m_TreeView.get_column_cell_renderer(view_column_index) ); if(pCellRenderer) { //Add the choices: pCellRenderer->remove_all_list_items(); for(type_vec_strings::const_iterator iter = vecStrings.begin(); iter != vecStrings.end(); ++iter) { pCellRenderer->append_list_item(*iter); } } else { //The column does not exist yet, so we must create it: if(m_columns_ready) construct_specified_columns(); } } } */ void DbAddDel::set_allow_add(bool val) { m_allow_add = val; m_refContextAdd->set_sensitive(val); } void DbAddDel::set_allow_delete(bool val) { m_allow_delete = val; } void DbAddDel::set_allow_user_actions(bool bVal) { m_bAllowUserActions = bVal; } bool DbAddDel::get_allow_user_actions() const { return m_bAllowUserActions; } void DbAddDel::set_find_mode(bool val) { const bool current = m_find_mode; m_find_mode = val; //Recreate the model if necessary: if( (current != m_find_mode) && m_refListStore) { construct_specified_columns(); } } void DbAddDel::set_allow_only_one_related_record(bool val) { m_allow_only_one_related_record = val; } void DbAddDel::finish_editing() { // bool bIgnoreSheetSignals = get_ignore_treeview_signals(); //The deactivate signals seems to cause the current cell to revert to it's previsous value. // set_ignore_treeview_signals(); // // int row = 0; // int col = 0; // m_Sheet.get_active_cell(row, col); // m_Sheet.set_active_cell(row, col); // // set_ignore_treeview_signals(bIgnoreSheetSignals); } /* void DbAddDel::reactivate() { // //The sheet does not seem to get updated until one of its cells is activated: // // int row = 0; // int col = 0; // m_Sheet.get_active_cell(row, col); // // //Activate 0,0 if none is currently active. // if( (row == -1) && (col == -1) ) // { // row = 0; // col = 0; // } // // m_Sheet.set_active_cell(row, col); } */ void DbAddDel::remove_item(const Gtk::TreeModel::iterator& iter) { if(iter && m_refListStore) m_refListStore->erase(iter); } bool DbAddDel::get_ignore_treeview_signals() const { return m_bIgnoreTreeViewSignals; } void DbAddDel::set_ignore_treeview_signals(bool ignore) { m_bIgnoreTreeViewSignals = ignore; } DbAddDel::InnerIgnore::InnerIgnore(DbAddDel* pOuter) : m_pOuter(pOuter), m_bPreventUserSignals(false), m_bIgnoreTreeViewSignals(false) { if(m_pOuter) { m_bPreventUserSignals = m_pOuter->get_prevent_user_signals(); m_pOuter->set_prevent_user_signals(); m_bIgnoreTreeViewSignals = m_pOuter->get_ignore_treeview_signals(); m_pOuter->set_ignore_treeview_signals(); } } DbAddDel::InnerIgnore::~InnerIgnore() { //Restore values: if(m_pOuter) { m_pOuter->set_prevent_user_signals(m_bPreventUserSignals); m_pOuter->set_ignore_treeview_signals(m_bIgnoreTreeViewSignals); } m_pOuter = 0; } Gnome::Gda::Value DbAddDel::treeview_get_key(const Gtk::TreeModel::iterator& row) const { Gnome::Gda::Value value; if(m_refListStore) { return m_refListStore->get_key_value(row); } return value; } #ifndef GLOM_ENABLE_CLIENT_ONLY DbAddDel::type_signal_user_requested_layout DbAddDel::signal_user_requested_layout() { return m_signal_user_requested_layout; } #endif // !GLOM_ENABLE_CLIENT_ONLY DbAddDel::type_signal_user_requested_edit DbAddDel::signal_user_requested_edit() { return m_signal_user_requested_edit; } DbAddDel::type_signal_script_button_clicked DbAddDel::signal_script_button_clicked() { return m_signal_script_button_clicked; } DbAddDel::type_signal_record_added DbAddDel::signal_record_added() { return m_signal_record_added; } DbAddDel::type_signal_sort_clause_changed DbAddDel::signal_sort_clause_changed() { return m_signal_sort_clause_changed; } DbAddDel::type_signal_record_selection_changed DbAddDel::signal_record_selection_changed() { return m_signal_record_selection_changed; } void DbAddDel::on_cell_layout_button_clicked(const Gtk::TreeModel::Path& path, int model_column_index) { if(!m_refListStore) return; Gtk::TreeModel::iterator iter = m_refListStore->get_iter(path); if(iter) { sharedptr layout_item = m_column_items[model_column_index]; sharedptr item_button = sharedptr::cast_dynamic(layout_item); if(item_button) { m_signal_script_button_clicked.emit(item_button, iter); } } } void DbAddDel::on_treeview_cell_edited_bool(const Glib::ustring& path_string, int model_column_index, int data_model_column_index) { //Note:: model_column_index is actually the AddDel column index, not the TreeModel column index. if(path_string.empty()) return; if(!m_refListStore) return; const Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_refListStore->get_iter(path); if(iter) { Gtk::TreeModel::Row row = *iter; const int tree_model_column_index = data_model_column_index + get_count_hidden_system_columns(); Gnome::Gda::Value value_old; row.get_value(tree_model_column_index, value_old); const bool bValueOld = (value_old.get_value_type() == G_TYPE_BOOLEAN) && value_old.get_boolean(); const bool bValueNew = !bValueOld; Gnome::Gda::Value value_new; value_new.set(bValueNew); //Store the user's new value in the model: row.set_value(tree_model_column_index, value_new); //TODO: Did it really change? //Is this an add or a change?: bool bIsAdd = false; bool bIsChange = false; const int iCount = m_refListStore->children().size(); if(iCount) { if(get_allow_user_actions()) //If add is possible: { if( get_is_placeholder_row(iter) ) //If it's the last row: { //We will ignore editing of bool values in the blank row. It seems like a bad way to start a new record. //New item in the blank row: /* Glib::ustring strValue = get_value(row); if(!strValue.empty()) { bool bPreventUserSignals = get_prevent_user_signals(); set_prevent_user_signals(true); //Stops extra signal_user_changed. add_item(); //Add the next blank for the next user add. set_prevent_user_signals(bPreventUserSignals); */ bIsAdd = true; //Signal that a new key was added. //} } } if(!bIsAdd) bIsChange = true; } //Fire appropriate signal: if(bIsAdd) { //Change it back, so that we ignore it: row.set_value(tree_model_column_index, value_old); //Signal that a new key was added: //We will ignore editing of bool values in the blank row. It seems like a bad way to start a new record. //user_added(row); } else if(bIsChange) { //Existing item changed: user_changed(row, model_column_index); } } } void DbAddDel::on_idle_treeview_cell_edited_revert(const Gtk::TreeModel::Row& row, guint model_column_index) { Glib::RefPtr refTreeSelection = m_TreeView.get_selection(); if(!refTreeSelection) return; refTreeSelection->select(row); //TODO: This does not seem to work. guint view_column_index = 0; get_view_column_index(model_column_index, view_column_index); Gtk::TreeView::Column* pColumn = m_TreeView.get_column(view_column_index); if(!pColumn) { std::cerr << G_STRFUNC << ": pColumn is null." << std::endl; return; } Gtk::CellRendererText* pCell = dynamic_cast(pColumn->get_first_cell()); if(!pCell) { std::cerr << G_STRFUNC << ": pCell is null." << std::endl; return; } const Gtk::TreeModel::Path path = get_model()->get_path(row); //Highlights the cell, and start the editing: m_TreeView.set_cursor(path, *pColumn, *pCell, true /* start_editing */); } void DbAddDel::on_treeview_cell_edited(const Glib::ustring& path_string, const Glib::ustring& new_text, int model_column_index, int data_model_column_index) { //Note:: model_column_index is actually the AddDel column index, not the TreeModel column index. if(path_string.empty()) return; if(!m_refListStore) return; const Gtk::TreeModel::Path path(path_string); if(path.empty()) { std::cerr << G_STRFUNC << ": path is empty." << std::endl; return; } //Get the row from the path: Gtk::TreeModel::iterator iter = m_refListStore->get_iter(path); if(iter != get_model()->children().end()) { Gtk::TreeModel::Row row = *iter; const int treemodel_column_index = data_model_column_index + get_count_hidden_system_columns(); Gnome::Gda::Value valOld; row.get_value(treemodel_column_index, valOld); //std::cout << "debug: valOld type=" << valOld.get_value_type() << std::endl; //Store the user's new text in the model: //row.set_value(treemodel_column_index, new_text); //Is it an add or a change?: bool bIsAdd = false; bool bIsChange = false; bool do_change = true; if(get_allow_user_actions()) //If add is possible: { if(get_is_placeholder_row(iter)) { const bool bPreventUserSignals = get_prevent_user_signals(); set_prevent_user_signals(true); //Stops extra signal_user_changed. //Don't add a new row if nothing was entered into the placeholder. if (new_text.empty()) return; //Mark this row as no longer a placeholder, because it has data now. The client code must set an actual key for this in the signal_user_added() or m_signal_user_changed signal handlers. m_refListStore->set_is_not_placeholder(iter); //Don't mark this as not a placeholder, because it's still a placeholder until it has a key value. set_prevent_user_signals(bPreventUserSignals); bIsAdd = true; //Signal that a new key was added. } } sharedptr item_field = sharedptr::cast_dynamic(m_column_items[model_column_index]); if(!item_field) return; const Field::glom_field_type field_type = item_field->get_glom_type(); if(field_type != Field::TYPE_INVALID) //If a field type was specified for this column. { //Make sure that the entered data is suitable for this field type: bool success = false; Glib::ustring new_text_to_save = new_text; //If this layout field uses a translatable set of custom choices, //then make sure that we only write the original to the database, though we display the translated version: if(item_field->get_formatting_used_has_translatable_choices()) { const Formatting& formatting = item_field->get_formatting_used(); new_text_to_save = formatting.get_custom_choice_original_for_translated_text(new_text); //If somehow (though this should be impossible), the user entered a //translated value with no corresponding original text, then //store the translated version rather than losing data. if(new_text_to_save.empty()) new_text_to_save = new_text; } const Gnome::Gda::Value value = Conversions::parse_value(field_type, new_text_to_save, item_field->get_formatting_used().m_numeric_format, success); if(!success) { //Tell the user and offer to revert or try again: const bool revert = glom_show_dialog_invalid_data(field_type); if(revert) { //Revert the data: row.set_value(treemodel_column_index, valOld); } else { //Reactivate the cell so that the data can be corrected. //Set the text to be used in the start_editing signal handler: m_validation_invalid_text_for_retry = new_text; m_validation_retry = true; //But do this in an idle timout, so that the TreeView doesn't get //confused by us changing editing state in this signal handler. Glib::signal_idle().connect_once( sigc::bind( sigc::mem_fun(*this, &DbAddDel::on_idle_treeview_cell_edited_revert), row, model_column_index)); } do_change = false; } else { //Store the value in the model: //std::cout << "debug: setting value: column=" << treemodel_column_index << ", type=" << value.get_value_type() << std::endl; row.set_value(treemodel_column_index, value); //std::cout << "debug: after setting value" << std::endl; } if(!bIsAdd) bIsChange = true; //Fire appropriate signal: if(bIsAdd) { //Signal that a new key was added: if(m_allow_add) user_added(row); } else if(bIsChange) { //Existing item changed: //Check that it has really changed - get the last value. if(value != valOld) { if(do_change) user_changed(row, model_column_index); } } } } } void DbAddDel::on_treeview_button_press_event(GdkEventButton* event) { on_button_press_event_Popup(event); } bool DbAddDel::on_treeview_columnheader_button_press_event(GdkEventButton* event) { //If this is a right-click with the mouse: if( (event->type == GDK_BUTTON_PRESS) && (event->button == 3) ) { } return false; } bool DbAddDel::on_treeview_column_drop(Gtk::TreeView* /* treeview */, Gtk::TreeViewColumn* /* column */, Gtk::TreeViewColumn* /* prev_column */, Gtk::TreeViewColumn* /* next_column */) { return true; } /* We do not let the developer resize the columns directly in the treeview * because we cannot easily avoid this signal handler from being called just during the * intial size allocation. * Anyway, this would be rather implicit anyway - people might not know that they are changing it in the document. * The size can still be specified in the layout dialog. */ /* void DbAddDel::on_treeview_column_resized(int model_column_index, DbTreeViewColumnGlom* view_column) { if(!view_column) return; //Ignore this property change signal handler if we are setting the size in code: if(m_bIgnoreTreeViewSignals) return; //We do not save the column width if this is the last column, //because that must always be automatic, //because it must resize when the whole column resizes. std::vector columns = m_TreeView.get_columns(); const int n_view_columns = columns.size(); if(n_view_columns && (view_column == m_TreeView.get_column(n_view_columns -1))) return; const sharedptr& layout_item = m_column_items[model_column_index]; const int width = view_column->get_width(); //std::cout << "debug: " << G_STRFUNC << ": width=" << width << std::endl; if(width == -1) //Means automatic. return; if(layout_item) layout_item->set_display_width(width); } */ void DbAddDel::on_treeview_column_clicked(int model_column_index) { BusyCursor busy_cursor(get_appwindow()); if(model_column_index >= (int)m_column_items.size()) return; sharedptr layout_item = sharedptr::cast_dynamic(m_column_items[model_column_index]); //We can only sort on fields, not on other layout item. if(layout_item && layout_item->get_name_not_empty()) { bool ascending = true; if(m_column_is_sorted && ((int)m_column_sorted == model_column_index)) { //Reverse the existing direction: ascending = !m_column_sorted_direction; } //Remember the user's chosen sort, so we can reverse it if he clicks again: m_column_is_sorted = true; m_column_sorted_direction = ascending; m_column_sorted = model_column_index; //Set the sort clause to be used by refresh_from_database(): m_found_set.m_sort_clause.clear(); m_found_set.m_sort_clause.push_back( type_pair_sort_field(layout_item, ascending) ); } refresh_from_database(); m_signal_sort_clause_changed.emit(); } void DbAddDel::on_treeview_columns_changed() { if(!m_bIgnoreTreeViewSignals) { //Get the new column order, and save it in m_vecColumnIDs: m_vecColumnIDs.clear(); typedef std::vector type_vecViewColumns; type_vecViewColumns vecViewColumns = m_TreeView.get_columns(); for(type_vecViewColumns::iterator iter = vecViewColumns.begin(); iter != vecViewColumns.end(); ++iter) { DbTreeViewColumnGlom* pViewColumn = dynamic_cast(*iter); if(pViewColumn) { const Glib::ustring column_id = pViewColumn->get_column_id(); m_vecColumnIDs.push_back(column_id); } } //Tell other code that something has changed, so the new column order can be serialized. //TODO: If this is ever wanted: m_signal_user_reordered_columns.emit(); } } bool DbAddDel::get_column_to_expand(guint& column_to_expand) const { //Initialize output parameter: column_to_expand = 0; bool result = false; //Discover the right-most text column: guint i = 0; for(type_column_items::const_iterator iter = m_column_items.begin(); iter != m_column_items.end(); ++iter) { sharedptr layout_item = *iter; sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); if(layout_item_field) { //Only text columns should expand. //Number fields are right-aligned, so expansion is annoying. //Time and date fields don't vary their width much. if(layout_item_field->get_glom_type() == Field::TYPE_TEXT) { //Check that no specific width has been specified: const guint column_width = layout_item_field->get_display_width(); if(!column_width) { column_to_expand = i; result = true; } } } ++i; } return result; } guint DbAddDel::treeview_append_column(const Glib::ustring& title, Gtk::CellRenderer& cellrenderer, int model_column_index, int data_model_column_index, bool expand) { InnerIgnore innerIgnore(this); //see comments for InnerIgnore class DbTreeViewColumnGlom* pViewColumn = Gtk::manage( new DbTreeViewColumnGlom(Utils::string_escape_underscores(title), cellrenderer) ); //This is needed by fixed-height mode. We get critical warnings otherwise. //But we must call set_fixed_width() later or we will have a zero-width column. pViewColumn->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); guint cols_count = m_TreeView.append_column(*pViewColumn); sharedptr layout_item = m_column_items[model_column_index]; sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); //Tell the Treeview.how to render the Gnome::Gda::Values: if(layout_item_field) { pViewColumn->set_cell_data_func(cellrenderer, sigc::bind( sigc::mem_fun(*this, &DbAddDel::treeviewcolumn_on_cell_data), model_column_index, data_model_column_index) ); } //Allow the column to be reordered by dragging and dropping the column header: pViewColumn->set_reorderable(); //Allow the column to be resized: pViewColumn->set_resizable(); //GtkTreeView's fixed-height-mode does not allow us to have anything but //the last column as expandable. //TODO: Can we get the total size and calculate a starting size instead? expand = false; int column_width = -1; //Means expand. if(!expand) { column_width = layout_item->get_display_width(); if(!(column_width > 0)) { //TODO: Choose a width based on the first 100 values. if(layout_item_field) { column_width = Utils::get_suitable_field_width_for_widget(*this, layout_item_field, true /* or_title */, true /* for treeview */); column_width = column_width + 8; //Some extra for the GtkTreeView's padding. //std::cout << "DEBUG: column_width=" << column_width << std::endl; } else column_width = 100; //TODO: Don't save this default in the document. } } if(column_width > 0) //Otherwise there's an assertion fails. pViewColumn->set_fixed_width(column_width); //This is the only way to set the width, so we need to set it as resizable again immediately afterwards. pViewColumn->set_resizable(); //This property is read only: pViewColumn->property_width() = column_width; //Save the extra ID, using the title if the column_id is empty: const Glib::ustring column_id = m_column_items[model_column_index]->get_name(); pViewColumn->set_column_id( (column_id.empty() ? title : column_id) ); //TODO pViewColumn->signal_button_press_event().connect( sigc::mem_fun(*this, &DbAddDel::on_treeview_columnheader_button_press_event) ); //Let the user click on the column header to sort. pViewColumn->set_clickable(); pViewColumn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &DbAddDel::on_treeview_column_clicked), model_column_index) ); // See the comment on on_treeview_column_resized(): //pViewColumn->connect_property_changed("width", sigc::bind(sigc::mem_fun(*this, &DbAddDel::on_treeview_column_resized), model_column_index, pViewColumn) ); return cols_count; } DbAddDel::type_vec_strings DbAddDel::get_columns_order() const { //This list is rebuilt in on_treeview_columns_changed, but maybe we could just build it here. return m_vecColumnIDs; } Glib::RefPtr DbAddDel::get_model() { return m_refListStore; } Glib::RefPtr DbAddDel::get_model() const { return m_refListStore; } bool DbAddDel::get_is_first_row(const Gtk::TreeModel::iterator& iter) const { if(iter) return iter == get_model()->children().begin(); else return false; } bool DbAddDel::get_is_last_row(const Gtk::TreeModel::iterator& iter) const { if(iter) { //TODO: Avoid this. iter::operator() might not work properly with our custom tree model. return iter == get_last_row(); } else return false; } Gtk::TreeModel::iterator DbAddDel::get_last_row() const { if(m_refListStore) return m_refListStore->get_last_row(); else return Gtk::TreeModel::iterator(); } Gtk::TreeModel::iterator DbAddDel::get_last_row() { if(m_refListStore) return m_refListStore->get_last_row(); else return Gtk::TreeModel::iterator(); } Gnome::Gda::Value DbAddDel::get_value_key(const Gtk::TreeModel::iterator& iter) const { return treeview_get_key(iter); } void DbAddDel::set_value_key(const Gtk::TreeModel::iterator& iter, const Gnome::Gda::Value& value) { if(iter && m_refListStore) { if(!(Conversions::value_is_empty(value))) { //This is not a placeholder anymore, if it every was: m_refListStore->set_is_not_placeholder(iter); //row[*m_modelcolumn_placeholder] = false; } m_refListStore->set_key_value(iter, value); } } bool DbAddDel::get_is_placeholder_row(const Gtk::TreeModel::iterator& iter) const { //g_warning("DbAddDel::get_is_placeholder_row()"); if(!iter) return false; if(!m_refListStore) return false; if(iter == m_refListStore->children().end()) { return false; } return m_refListStore->get_is_placeholder(iter); //Gtk::TreeModel::Row row = *iter; //return row[*m_modelcolumn_placeholder]; } bool DbAddDel::get_model_column_index(guint view_column_index, guint& model_column_index) { //TODO: Remove this function. We should never seem to expose the underlying TreeModel modelcolumn index anyway. model_column_index = view_column_index; return true; } bool DbAddDel::get_view_column_index(guint model_column_index, guint& view_column_index) const { //Initialize output parameter: view_column_index = 0; if(model_column_index >= m_column_items.size()) return false; view_column_index = model_column_index; if(m_treeviewcolumn_button) { ++view_column_index; } else std::cout << "m_treeviewcolumn_button is null." << std::endl; return true; } guint DbAddDel::get_count_hidden_system_columns() const { return 0; //The key now has explicit API in the model. //return 1; //The key. //return 2; //The key and the placeholder boolean. } sharedptr DbAddDel::get_key_field() const { return m_key_field; } void DbAddDel::set_key_field(const sharedptr& field) { m_key_field = field; } void DbAddDel::treeviewcolumn_on_cell_data(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, int model_column_index, int data_model_column_index) { //std::cout << "debug: DbAddDel::treeviewcolumn_on_cell_data()" << std::endl; if(iter) { const sharedptr& layout_item = m_column_items[model_column_index]; sharedptr field = sharedptr::cast_dynamic(layout_item); if(field) { const guint col_real = data_model_column_index + get_count_hidden_system_columns(); Gtk::TreeModel::Row treerow = *iter; Gnome::Gda::Value value; treerow->get_value(col_real, value); /* GType debug_type = value.get_value_type(); std::cout << "debug: " << G_STRFUNC << ": GType=" << debug_type << std::endl; if(debug_type) std::cout << " GType name=\"" << g_type_name(debug_type) << "\"" << std::endl; */ const Field::glom_field_type type = field->get_glom_type(); switch(type) { case(Field::TYPE_BOOLEAN): { Gtk::CellRendererToggle* pDerived = dynamic_cast(renderer); if(pDerived) pDerived->set_active( (value.get_value_type() == G_TYPE_BOOLEAN) && value.get_boolean() ); break; } case(Field::TYPE_IMAGE): { Gtk::CellRendererPixbuf* pDerived = dynamic_cast(renderer); if(pDerived) { Glib::RefPtr pixbuf = Utils::get_pixbuf_for_gda_value(value); //Scale it down to a sensible size. if(pixbuf) pixbuf = Utils::image_scale_keeping_ratio(pixbuf, get_fixed_cell_height(), pixbuf->get_width()); pDerived->property_pixbuf() = pixbuf; } else std::cerr << G_STRFUNC << ": glom_type is TYPE_IMAGE but gda type is not VALUE_TYPE_BINARY" << std::endl; break; } default: { //TODO: Maybe we should have custom cellrenderers for time, date, and numbers. Gtk::CellRendererText* pDerived = dynamic_cast(renderer); if(pDerived) { //std::cout << "debug: " << G_STRFUNC << ": field name=" << field->get_name() << ", glom type=" << field->get_glom_type() << std::endl; Glib::ustring text = Conversions::get_text_for_gda_value(field->get_glom_type(), value, field->get_formatting_used().m_numeric_format); //g_assert(text != "NULL"); //If this layout field uses a translatable set of custom choices, //then make sure that we show the translated version, never showing the original text from the database: if(field->get_formatting_used_has_translatable_choices()) { const Formatting& formatting = field->get_formatting_used(); const Glib::ustring text_to_show = formatting.get_custom_choice_translated(text); //Use the translation if there is one. //Otherwise, show the original data rather than showing nothing: if(!text_to_show.empty()) text = text_to_show; } pDerived->property_text() = text; //Show a different color if the value is numeric, if that's specified: if(type == Field::TYPE_NUMERIC) { const Glib::ustring fg_color = field->get_formatting_used().get_text_format_color_foreground_to_use(value); if(!fg_color.empty()) pDerived->property_foreground() = fg_color; else //TODO: Remove this when this GTK+ bug is fixed: https://bugzilla.gnome.org/show_bug.cgi?id=667415 g_object_set(pDerived->gobj(), "foreground", (const char*)0, (gpointer)0); } } break; } } } } } AppWindow* DbAddDel::get_appwindow() { Gtk::Container* pWindow = get_toplevel(); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } void DbAddDel::on_treeview_cell_editing_started(Gtk::CellEditable* cell_editable, const Glib::ustring& /* path */) { //Start editing with previously-entered (but invalid) text, //if we are allowing the user to correct some invalid data. if(m_validation_retry) { //This is the CellEditable inside the CellRenderer. Gtk::CellEditable* celleditable_validated = cell_editable; //It's usually an Entry, at least for a CellRendererText: Gtk::Entry* pEntry = dynamic_cast(celleditable_validated); if(pEntry) { pEntry->set_text(m_validation_invalid_text_for_retry); m_validation_retry = false; m_validation_invalid_text_for_retry.clear(); } } } void DbAddDel::set_allow_view(bool val) { m_allow_view = val; } void DbAddDel::set_allow_view_details(bool val) { m_allow_view_details = val; //Hide it if it was visible, if it exists, //otherwise do that later after creating it: if(m_treeviewcolumn_button) m_treeviewcolumn_button->set_visible(val); } bool DbAddDel::get_allow_view_details() const { return m_allow_view_details; } #ifdef GLOM_ENABLE_CLIENT_ONLY void DbAddDel::on_self_style_changed(const Glib::RefPtr& /* style */) { // Reset fixed cell height because the font might have changed due to the new style: m_fixed_cell_height = 0; // Reconstruct columns because sizes might have changed: // (TODO: But don't get the data again because that would be inefficient). construct_specified_columns(); } #endif void DbAddDel::set_open_button_title(const Glib::ustring& title) { m_open_button_title = title; } void DbAddDel::show_hint_model() { treeview_delete_all_columns(); m_treeviewcolumn_button = 0; //When we removed the view columns, this was deleted because it's manage()ed. m_model_hint = Gtk::ListStore::create(m_columns_hint); Gtk::TreeModel::iterator iter = m_model_hint->append(); (*iter)[m_columns_hint.m_col_hint] = _("Right-click to layout, to specify the related fields."); m_TreeView.set_model(m_model_hint); m_TreeView.set_fixed_height_mode(false); //fixed_height mode is incompatible with the default append_column() helper method. m_TreeView.append_column("", m_columns_hint.m_col_hint); } bool DbAddDel::start_new_record() { Gtk::TreeModel::iterator iter = get_item_placeholder(); if(!iter) return false; sharedptr fieldToEdit; //Start editing in the primary key or the first cell if the primary key is auto-incremented (because there is no point in editing an auto-generated value) //guint index_primary_key = 0; const bool bPresent = true; //get_field_primary_key_index(index_primary_key); //If there is no primary key then the default of 0 is OK. if(!bPresent) return false; sharedptr fieldPrimaryKey = get_key_field(); if(fieldPrimaryKey && fieldPrimaryKey->get_auto_increment()) { //Start editing in the first cell that is not auto_increment: for(type_column_items::iterator iter = m_column_items.begin(); iter != m_column_items.end(); ++iter) { sharedptr layout_item = *iter; sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); if(!(layout_item_field->get_full_field_details()->get_auto_increment())) { fieldToEdit = layout_item_field; break; } } } else { //The primary key is not auto-increment, so start by editing it: fieldToEdit = sharedptr::create(); fieldToEdit->set_full_field_details(fieldPrimaryKey); } //std::cout << "debug: index_field_to_edit=" << index_field_to_edit << std::endl; if(fieldToEdit) { select_item(iter, fieldToEdit, true /* start_editing */); } else { //The only keys are non-editable, so just add a row: select_item(iter); //without start_editing. //g_warning("start_new_record(): index_field_to_edit does not exist: %d", index_field_to_edit); } return true; } void DbAddDel::user_changed(const Gtk::TreeModel::iterator& row, guint col) { const Gnome::Gda::Value parent_primary_key_value = get_value_key(row); //std::cout << "debug: " << G_STRFUNC << ": parent_primary_key_value=" << parent_primary_key_value.to_string() << std::endl; sharedptr layout_field = get_column_field(col); if(!Conversions::value_is_empty(parent_primary_key_value)) //If the record's primary key is filled in: { Glib::ustring table_name = m_found_set.m_table_name; sharedptr primary_key_field; Gnome::Gda::Value primary_key_value; Gtk::Window* window = get_appwindow(); //Just update the record: try { if(!layout_field->get_has_relationship_name()) { table_name = m_found_set.m_table_name; primary_key_field = get_key_field(); primary_key_value = parent_primary_key_value; } else { //If it's a related field then discover the actual table that it's in, //plus how to identify the record in that table. const Glib::ustring relationship_name = layout_field->get_relationship_name(); Document* document = dynamic_cast(get_document()); sharedptr relationship = document->get_relationship(m_found_set.m_table_name, relationship_name); if(relationship) { table_name = relationship->get_to_table(); const Glib::ustring to_field_name = relationship->get_to_field(); //Get the key field in the other table (the table that we will change) primary_key_field = DbUtils::get_fields_for_table_one_field(document, table_name, to_field_name); //TODO_Performance. if(primary_key_field) { //Get the value of the corresponding key in the current table (that identifies the record in the table that we will change) sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details( document->get_field(relationship->get_from_table(), relationship->get_from_field()) ); primary_key_value = get_value_selected(layout_item); //Note: This just uses an existing record if one already exists: Gnome::Gda::Value primary_key_value_used; if(!m_find_mode) { const bool test = add_related_record_for_field(layout_field, relationship, primary_key_field, primary_key_value, primary_key_value_used); if(!test) return; } //Get the new primary_key_value if it has been created: primary_key_value = primary_key_value_used; //Now that the related record exists, the following code to set the value of the other field in the related field can succeed. } else { std::cerr << G_STRFUNC << ": key not found for edited related field." << std::endl; } } } //Update the field in the record (the record with this primary key): const Gnome::Gda::Value field_value = get_value(row, layout_field); //std::cout << "debug: " << G_STRFUNC << ": field_value = " << field_value.to_string() << std::endl; //const sharedptr& field = layout_field->m_field; //const Glib::ustring strFieldName = layout_field->get_name(); LayoutFieldInRecord field_in_record(layout_field, m_found_set.m_table_name /* parent */, primary_key_field, primary_key_value); //Check whether the value meets uniqueness constraints: if(!check_entered_value_for_uniqueness(m_found_set.m_table_name, row, layout_field, field_value, window)) { //Revert to the value in the database: const Gnome::Gda::Value value_old = get_field_value_in_database(field_in_record, window); set_entered_field_data(row, layout_field, value_old); return; //The value has been reverted to the value in the database. } const bool bTest = set_field_value_in_database(field_in_record, row, field_value, false /* don't use current calculations */, window); if(!bTest) { //Update failed. //Replace with correct values. const Gnome::Gda::Value value_old = get_field_value_in_database(field_in_record, window); set_entered_field_data(row, layout_field, value_old); } else { //Display the same value in other instances of the same field: set_value(row, layout_field, field_value, false /* don't set the actually-edited cell */); signal_record_changed().emit(); } } catch(const Glib::Exception& ex) { handle_error(ex); //Replace with correct values. if(primary_key_field) { LayoutFieldInRecord field_in_record(layout_field, m_found_set.m_table_name /* parent */, primary_key_field, primary_key_value); const Gnome::Gda::Value value_old = get_field_value_in_database(field_in_record, window); set_entered_field_data(row, layout_field, value_old); } } catch(const std::exception& ex) { handle_error(ex); //Replace with correct values. if(primary_key_field) { LayoutFieldInRecord field_in_record(layout_field, m_found_set.m_table_name /* parent */, primary_key_field, primary_key_value); const Gnome::Gda::Value value_old = get_field_value_in_database(field_in_record, window); set_entered_field_data(row, layout_field, value_old); } } } else { //This record probably doesn't exist yet. //Add new record, which will generate the primary key: user_added(row); const Gnome::Gda::Value primaryKeyValue = get_value_key(row); //TODO_Value if(!(Conversions::value_is_empty(primaryKeyValue))) //If the Add succeeeded: { if(!(layout_field->get_full_field_details()->get_primary_key())) //Don't try to re-set the primary key field, because we just inserted the record with it. { user_changed(row, col); //Change this field in the new record. } } else { //A field value was entered, but the record has not been added yet, because not enough information exists yet. std::cout << G_STRFUNC << ": debug: record not yet added." << std::endl; } } } void DbAddDel::user_added(const Gtk::TreeModel::iterator& row) { //Prevent impossible multiple related records: //The developer-mode UI now prevents the developer from using such a relationship anyway. if(m_allow_only_one_related_record && (get_count() > 0)) { //Tell user that they can't do that: Gtk::MessageDialog dialog(Utils::bold_message(_("Extra Related Records Not Possible")), true, Gtk::MESSAGE_WARNING); dialog.set_secondary_text(_("You attempted to add a new related record, but there can only be one related record, because the relationship uses a unique key.")), dialog.set_transient_for(*AppWindow::get_appwindow()); dialog.run(); return; } //std::cout << "DbAddDel::on_adddel_user_added" << std::endl; Gnome::Gda::Value primary_key_value; sharedptr primary_key_field = get_key_field(); //Get the new primary key value, if one is available now: if(primary_key_field->get_auto_increment()) { //Auto-increment is awkward (we can't get the last-generated ID) with postgres, so we auto-generate it ourselves; const Glib::ustring strPrimaryKeyName = primary_key_field->get_name(); primary_key_value = DbUtils::get_next_auto_increment_value(m_found_set.m_table_name, strPrimaryKeyName); //TODO: return a Gnome::Gda::Value of an appropriate type. } else { //Use the user-entered primary key value: //This only works when the primary key is already stored: primary_key_value = get_value_key(row); //primary_key_value = get_value_key_selected(); sharedptr layout_field = sharedptr::create(); layout_field->set_full_field_details(primary_key_field); primary_key_value = get_value_selected(layout_field); std::cout << "DEBUG: get_value_key_selected(): " << primary_key_value.to_string() << std::endl; } //If no primary key value is available yet, then don't add the record yet: if(Conversions::value_is_empty(primary_key_value)) return; sharedptr sharedconnection = connect_to_server(get_appwindow()); //Keep it alive while we need the data_model. if(!sharedconnection) { //Add Record failed. //Replace with correct values: fill_from_database(); return; } sharedptr layout_field = sharedptr::create(); layout_field->set_full_field_details(primary_key_field); if(!check_entered_value_for_uniqueness(m_found_set.m_table_name, layout_field, primary_key_value, get_appwindow())) { //Revert to a blank value. primary_key_value = Conversions::get_empty_value(layout_field->get_full_field_details()->get_glom_type()); set_entered_field_data(row, layout_field, primary_key_value); return; } if(m_find_mode) return; const bool added = record_new(true /* use entered field data*/, primary_key_value); if(!added) { handle_error(); return; } //Save the primary key value for later use: set_value_key(row, primary_key_value); //Show the primary key in the row, if the primary key is visible: //If it's an auto-increment, then get the value and show it: if(primary_key_field->get_auto_increment()) { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(primary_key_field); set_value(row, layout_item, primary_key_value); } //Allow a parent widget to link the new record by setting the foreign key: signal_record_added().emit(row, primary_key_value); } void DbAddDel::user_requested_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& /* rowEnd TODO */) { if(rowStart) { if(confirm_delete_record()) { const Gnome::Gda::Value primary_key_value = get_primary_key_value(rowStart); if(!m_find_mode) record_delete(primary_key_value); //Remove the row: remove_item(rowStart); //TODO_refactor: Just emit signal_record_changed() directly instead? on_record_deleted(primary_key_value); } } } //An override of the Base_DB method: void DbAddDel::set_entered_field_data(const sharedptr& field, const Gnome::Gda::Value& value) { return set_value_selected(field, value); } //An override of the Base_DB method: void DbAddDel::set_entered_field_data(const Gtk::TreeModel::iterator& row, const sharedptr& field, const Gnome::Gda::Value& value) { return set_value(row, field, value); } Gnome::Gda::Value DbAddDel::get_entered_field_data(const sharedptr& field) const { return get_value_selected(field); } sharedptr DbAddDel::get_field_primary_key() const { return get_key_field(); } Gnome::Gda::Value DbAddDel::get_primary_key_value_selected() const { return get_value_key_selected(); } void DbAddDel::set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value) { set_value_key(row, value); } Gnome::Gda::Value DbAddDel::get_primary_key_value(const Gtk::TreeModel::iterator& row) const { return get_value_key(row); } Gtk::TreeModel::iterator DbAddDel::get_row_selected() { return get_item_selected(); } void DbAddDel::on_treeview_selection_changed() { Glib::RefPtr refSelection = m_TreeView.get_selection(); if(!refSelection) return; const bool one_selected = (refSelection->count_selected_rows() > 0); on_selection_changed(one_selected); } void DbAddDel::on_selection_changed(bool selection) { m_refContextDelete->set_sensitive(selection); m_refContextAdd->set_sensitive(selection); m_signal_record_selection_changed.emit(); } void DbAddDel::treeview_delete_all_columns() { Utils::treeview_delete_all_columns(&m_TreeView); //Reset this too, because we must have just deleted it: m_treeviewcolumn_button = 0; } } //namespace Glom glom-1.22.4/glom/mode_data/db_adddel/db_adddel_withbuttons.h0000644000175000017500000000337112234252646025240 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DB_ADDDEL_WITHBUTTONS_H #define GLOM_DB_ADDDEL_WITHBUTTONS_H #include "db_adddel.h" #include namespace Glom { class DbAddDel_WithButtons : public DbAddDel { public: DbAddDel_WithButtons(); virtual ~DbAddDel_WithButtons(); virtual void set_allow_add(bool val = true); //override virtual void set_allow_delete(bool val = true); //override virtual void set_allow_user_actions(bool bVal = true); //override ///Whether each row should have a button, to request edit. virtual void set_allow_view_details(bool val = true); private: void setup_buttons(); void on_button_add(); void on_button_del(); void on_button_edit(); virtual void on_selection_changed(bool selection); virtual void show_all_vfunc(); //member widgets: Gtk::ButtonBox m_ButtonBox; typedef Gtk::Button type_button; type_button m_Button_Del; type_button m_Button_Edit; type_button m_Button_Add; }; } //namespace Glom #endif //GLOM_DB_ADDDEL_WITHBUTTONS_H glom-1.22.4/glom/mode_data/db_adddel/db_adddel.h0000644000175000017500000004653512234776363022606 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DB_ADDDEL_H #define GLOM_DB_ADDDEL_H #include #include #include #include #include #include #include #include #include #include #include #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY namespace Glom { class AppWindow; class DbTreeViewColumnGlom; /** For adding/deleting/selecting record rows. */ class DbAddDel : public Gtk::Box, public Base_DB_Table_Data { public: friend class InnerIgnore; //declared below. DbAddDel(); virtual ~DbAddDel(); virtual void set_allow_user_actions(bool bVal = true); virtual bool get_allow_user_actions() const; virtual void set_allow_add(bool val = true); virtual void set_allow_delete(bool val = true); /** Prevent any attempts by this class to change actual records, * if the widget is just being used to enter find critera, * and prevents any need for data retrieval from the database, because * no data will be displayed. * * @param val True if find mode should be used. */ void set_find_mode(bool val = true); /** Prevent more than one record from being added, * Use this if the portal is showing related records, * and if the relationship's to-field is unique or a primary key. * In this case, adding a new record would require a duplicate value in that * unique field. * When the user tries to do this, he will see an explanatory dialog from this * widget. * * @param val True if multiple records should be presented. */ void set_allow_only_one_related_record(bool val = true); //Gtk::TreeModel::iterator add_item(const Gnome::Gda::Value& valKey); //Return index of new row. void remove_item(const Gtk::TreeModel::iterator& iter); Gnome::Gda::Value get_value(const Gtk::TreeModel::iterator& iter, const sharedptr& layout_item) const; /** Get the row's hidden key */ Gnome::Gda::Value get_value_key(const Gtk::TreeModel::iterator& iter) const; /** Set the row's hidden key */ void set_value_key(const Gtk::TreeModel::iterator& iter, const Gnome::Gda::Value& value); /** @param col A value returned from add_column(). * @result The value on the selected row. */ Gnome::Gda::Value get_value_selected(const sharedptr& layout_item) const; Gnome::Gda::Value get_value_key_selected() const; Gtk::TreeModel::iterator get_item_selected(); Gtk::TreeModel::iterator get_item_selected() const; //There is no TreeModel::const_iterator /** * @param iter The row to be selected. * @param column A value returned from add_column(). * @param start_editing Whether editing should start in the cell. * @result Whether the row was successfully selected. */ bool select_item(const Gtk::TreeModel::iterator& iter, const sharedptr& layout_item, bool start_editing = false); //bool indicates success. bool select_item(const Gtk::TreeModel::iterator& iter, bool start_editing = false); guint get_count() const; /** * @param iter The row to be changed. * @param layout_item Describes the column(s) whose values should be changed. * @param value The new value. */ virtual void set_value(const Gtk::TreeModel::iterator& iter, const sharedptr& layout_item, const Gnome::Gda::Value& value); /** * @param col A value returned from add_column(). * @param value The new value. */ virtual void set_value_selected(const sharedptr& layout_item, const Gnome::Gda::Value& value); bool get_is_first_row(const Gtk::TreeModel::iterator& iter) const; /** Check whether the row is the last (non-placeholder) row. * This will also return true if @a iter is the placeholder row, * but this should be used to identify the last real row. * @see get_is_placeholder_row() */ bool get_is_last_row(const Gtk::TreeModel::iterator& iter) const; /** @result Whether this is a blank row where date for a new row should be entered */ bool get_is_placeholder_row(const Gtk::TreeModel::iterator& iter) const; sharedptr get_key_field() const; void set_key_field(const sharedptr& field); void set_table_name(const Glib::ustring& table_name); ///For instance, if the user cannot view the table then don't try to get the records. void set_allow_view(bool val = true); ///Whether each row should have a button, to request edit. virtual void set_allow_view_details(bool val = true); bool get_allow_view_details() const; //TODO: Just add this as a parameter to a different method? /** Specify which records to show. * This does not actually request the data from the database - it just * sets the found set to use when that happens later. */ void set_found_set(const FoundSet& found_set); /** Set the items to show, and actually get and show the data from the database. * The items are not const, so that their display widths can be changed in the UI. */ void set_columns(const LayoutGroup::type_list_items& layout_items); FoundSet get_found_set() const; guint get_columns_count() const; sharedptr get_column_field(guint column_index) const; typedef std::vector type_vec_strings; /** Retrieves the column order, even after they have been reordered by the user. * @result a vector of column_id. These column_ids were provided in the call to add_column(). */ type_vec_strings get_columns_order() const; void remove_all_columns(); /// For popup cells. //void set_column_choices(guint col, const type_vec_strings& vecStrings); void construct_specified_columns(); //Delay actual use of set_column_*() stuff until this method is called. bool refresh_from_database(); bool refresh_from_database_blank(); Gtk::TreeModel::iterator get_row(const Gnome::Gda::Value& key); void finish_editing(); //Closes active edit controls and commits the data to the cell. //virtual void reactivate(); //Sheet doesn't seem to update unless a cell is active. void set_prevent_user_signals(bool bVal = true); //TODO_refactor: make private. private: void user_added(const Gtk::TreeModel::iterator& row); public: Glib::RefPtr get_model(); Glib::RefPtr get_model() const; //Signals: #ifndef GLOM_ENABLE_CLIENT_ONLY /** Emitted when the user wants to edit the layout of the items in this widget. */ typedef sigc::signal type_signal_user_requested_layout; type_signal_user_requested_layout signal_user_requested_layout(); #endif // !GLOM_ENABLE_CLIENT_ONLY /** Emitted when the user request a view/edit of the details of the record. * @param row */ typedef sigc::signal type_signal_user_requested_edit; type_signal_user_requested_edit signal_user_requested_edit(); /** Emitted when the user clicks on a script button. * @param layout_button The layout item for the script button that was clicked. * @param row */ typedef sigc::signal&, const Gtk::TreeModel::iterator&> type_signal_script_button_clicked; type_signal_script_button_clicked signal_script_button_clicked(); /** Allow a parent widget to set the foreign key when a record is added, * to make the new record a related record. * * @param row Row number * @param primary_key_value The value of the primary key of the new related record. */ typedef sigc::signal type_signal_record_added; type_signal_record_added signal_record_added(); /** Emitted when the user changed the sort order, * for instance by clicking on a column header. */ typedef sigc::signal type_signal_sort_clause_changed; type_signal_sort_clause_changed signal_sort_clause_changed(); /** Emitted when the user selected (or deselected) a record. */ typedef sigc::signal type_signal_record_selection_changed; type_signal_record_selection_changed signal_record_selection_changed(); /** Get the last row. * This will never return the placeholder row. */ Gtk::TreeModel::iterator get_last_row(); /** Get the last row. * This will never return the placeholder row. */ Gtk::TreeModel::iterator get_last_row() const; void set_open_button_title(const Glib::ustring& title); /** Add a new row to the list, for the user to enter record details, * adding the generated primary key if necessary. */ bool start_new_record(); /** Request a height for this widget, based on the number of rows to show. * The widget will change its requested height if it is filled with enough * data to need more than the @a rows_count_min, if @a rows_count_max allows that. */ void set_height_rows(gulong rows_count_min, gulong rows_count_max); private: void set_value(const Gtk::TreeModel::iterator& iter, const sharedptr& layout_item, const Gnome::Gda::Value& value, bool set_specified_field_layout); //Overrides of Base_DB/Base_DB_Table methods: virtual void set_entered_field_data(const sharedptr& field, const Gnome::Gda::Value& value); virtual void set_entered_field_data(const Gtk::TreeModel::iterator& row, const sharedptr& field, const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_entered_field_data(const sharedptr& field) const; virtual Gtk::TreeModel::iterator get_row_selected(); //Implementations of pure virtual methods from Base_DB_Table_Data: virtual sharedptr get_field_primary_key() const; virtual Gnome::Gda::Value get_primary_key_value_selected() const; virtual void set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_primary_key_value(const Gtk::TreeModel::iterator& row) const; Gtk::CellRenderer* construct_specified_columns_cellrenderer(const sharedptr& layout_item, int model_column_index, int data_model_column_index); bool get_model_column_index(guint view_column_index, guint& model_column_index); typedef std::list type_list_indexes; ///Return the column indexes of any columns that display this field. type_list_indexes get_column_index(const sharedptr& layout_item) const; /// Get indexes of any columns with choices with !show_all relationships that have @a from_key as the from_key. type_list_indexes get_choice_index(const sharedptr& from_key); /** Return the query column index of any columns that display this field: * @param including_specified_field_layout If false, then don't return the actual layout item itself. */ type_list_indexes get_data_model_column_index(const sharedptr& layout_item_field, bool including_specified_field_layout = true) const; protected: void setup_menu(); /// A common handler for the edit button, the context menu, etc. void do_user_requested_edit(); virtual void on_selection_changed(bool selection); private: Gnome::Gda::Value treeview_get_key(const Gtk::TreeModel::iterator& row) const; ///Add a blank row, or return the existing blank row if there already is one. //Gtk::TreeModel::iterator get_next_available_row_with_add_if_necessary(); //Signal handlers: void treeviewcolumn_on_cell_data(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, int model_column_index, int data_model_column_index); void on_treeview_cell_editing_started(Gtk::CellEditable* cell_editable, const Glib::ustring& path); void on_treeview_cell_edited(const Glib::ustring& path_string, const Glib::ustring& new_text, int model_column_index, int data_model_column_index); void on_treeview_cell_edited_bool(const Glib::ustring& path_string, int model_column_index, int data_model_column_index); void on_idle_treeview_cell_edited_revert(const Gtk::TreeModel::Row& row, guint model_column_index); bool on_treeview_column_drop(Gtk::TreeView* treeview, Gtk::TreeViewColumn* column, Gtk::TreeViewColumn* prev_column, Gtk::TreeViewColumn* next_column); void on_treeview_columns_changed(); bool on_button_press_event_Popup(GdkEventButton* event); void on_treeview_button_press_event(GdkEventButton* event); void on_treeview_selection_changed(); protected: void on_MenuPopup_activate_Edit(); void on_MenuPopup_activate_Add(); void on_MenuPopup_activate_Delete(); private: #ifndef GLOM_ENABLE_CLIENT_ONLY void on_MenuPopup_activate_layout(); #endif bool on_treeview_columnheader_button_press_event(GdkEventButton* event); void on_treeview_column_clicked(int model_column_index); //void on_treeview_column_resized(int model_column_index, DbTreeViewColumnGlom* view_column); void on_idle_row_edit(); void on_cell_button_clicked(const Gtk::TreeModel::Path& path); void on_cell_layout_button_clicked(const Gtk::TreeModel::Path& path, int model_column_index); #ifdef GLOM_ENABLE_CLIENT_ONLY // Don't name it on_style_changed, otherwise we would override a virtual // function from Gtk::Widget. We could indeed do that, but we do it with // a normal signal handler, because we have to do it this way anyway in // case default signal handlers have been disabled in glibmm. void on_self_style_changed(const Glib::RefPtr& style); #endif //GLOM_ENABLE_CLIENT_ONLY bool get_prevent_user_signals() const; /** @param model_column_index A value returned from add_column(). * @param view_column_index The index of the corresponding view column. */ bool get_view_column_index(guint model_column_index, guint& view_column_index) const; guint get_count_hidden_system_columns() const; //The column_id is extra information that we can use later to discover what the column shows, even when columns have been reordered. guint treeview_append_column(const Glib::ustring& title, Gtk::CellRenderer& cellrenderer, int model_column_index, int data_model_column_index, bool expand); /** Show a model that gives a visual hint to the developer, * when he has not yet specified fields to show. * TODO: Make this more obvious in a less strange way. */ void show_hint_model(); guint get_fixed_cell_height(); //TODO: Remove this and use AppGlom::get_appwindow() instead? AppWindow* get_appwindow(); void refresh_cell_choices_data_from_database_with_foreign_key(guint model_index, const Gnome::Gda::Value& foreign_key_value); static void apply_formatting(Gtk::CellRenderer* renderer, const sharedptr& layout_item); typedef Gtk::Box type_base; //Member widgets: Gtk::ScrolledWindow m_ScrolledWindow; Gtk::TreeView m_TreeView; Glib::RefPtr m_refListStore; //Columns, not including the hidden internal columns: typedef LayoutGroup::type_list_items type_column_items; type_column_items m_column_items; FoundSet m_found_set; //table, where_clause, sort_clause. bool m_column_is_sorted; //If empty, then m_column_sorted and m_column_sorted_direction should not be used. bool m_column_sorted_direction; //true means ascending. guint m_column_sorted; //Previously-clicked (on the treeview header) column. Remember it so we can reverse the sort order on a second click. protected: Glib::ustring m_open_button_title; //Allow us to change "Open" to "Select". private: //TODO: Avoid repeating these in so many widgets: Gtk::Menu* m_pMenuPopup; Glib::RefPtr m_refActionGroup; Glib::RefPtr m_refUIManager; Glib::RefPtr m_refContextEdit, m_refContextAdd, m_refContextDelete; #ifndef GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr m_refContextLayout; #endif bool m_bAllowUserActions; bool m_bPreventUserSignals; bool m_bIgnoreTreeViewSignals; type_vec_strings m_vecColumnIDs; //We give each ViewColumn a special ID, so we know where they are after a reorder. protected: bool m_allow_add; bool m_allow_delete; private: void treeview_delete_all_columns(); bool m_find_mode; bool m_allow_only_one_related_record; //Used to revert the currently-edited cell. bool m_validation_retry; Glib::ustring m_validation_invalid_text_for_retry; /// The primary key for the table: sharedptr m_key_field; bool m_allow_view; bool m_allow_view_details; Gtk::TreeViewColumn* m_treeviewcolumn_button; //Signals: type_signal_user_requested_edit m_signal_user_requested_edit; type_signal_script_button_clicked m_signal_script_button_clicked; type_signal_record_added m_signal_record_added; type_signal_sort_clause_changed m_signal_sort_clause_changed; type_signal_record_selection_changed m_signal_record_selection_changed; #ifndef GLOM_ENABLE_CLIENT_ONLY type_signal_user_requested_layout m_signal_user_requested_layout; #endif // !GLOM_ENABLE_CLIENT_ONLY //TODO: Do this properly: //type_signal_user_added m_signal_record_count_changed; bool get_ignore_treeview_signals() const; void set_ignore_treeview_signals(bool ignore = true); //An instance of InnerIgnore remembers the ignore settings, //then restores them when it goes out of scope and is destroyed. class InnerIgnore { public: InnerIgnore(DbAddDel* pOuter); ~InnerIgnore(); private: DbAddDel* m_pOuter; bool m_bPreventUserSignals, m_bIgnoreTreeViewSignals; }; //When no columns have been chosen in the layout editor, //show this model to give the user a hint about what to do: class ModelColumnsEmptyHint : public Gtk::TreeModel::ColumnRecord { public: ModelColumnsEmptyHint() { add(m_col_hint); } Gtk::TreeModelColumn m_col_hint; }; ModelColumnsEmptyHint m_columns_hint; Glib::RefPtr m_model_hint; guint m_fixed_cell_height; /// Discover the right-most text column, so we can make it expand. bool get_column_to_expand(guint& column_to_expand) const; //TODO_refactor: Give these better names, and document them: void user_changed(const Gtk::TreeModel::iterator& row, guint col); void user_requested_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& /* rowEnd TODO */); void set_height_rows_actual(gulong rows_count); //TODO_refactor: Make some other methods private too. /** Get an iterator to the blank row in which the user should add data for the new row. * You can then add the row to your underlying data store when some data has been filled, by handling signal_user_changed. */ Gtk::TreeModel::iterator get_item_placeholder(); //Return index of the placeholder row. gulong m_rows_count_min; gulong m_rows_count_max; }; } //namespace Glom #endif //GLOM_DB_ADDDEL_H glom-1.22.4/glom/mode_data/db_adddel/db_treeviewcolumn_glom.h0000644000175000017500000000244712234252646025442 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DB_ADDDEL_TREEVIEWCOLUMN_GLOM_H #define GLOM_DB_ADDDEL_TREEVIEWCOLUMN_GLOM_H #include namespace Glom { class DbTreeViewColumnGlom : public Gtk::TreeViewColumn { public: DbTreeViewColumnGlom(const Glib::ustring& title, Gtk::CellRenderer& cell); virtual ~DbTreeViewColumnGlom(); virtual Glib::ustring get_column_id() const; virtual void set_column_id(const Glib::ustring& value); private: Glib::ustring m_column_id; }; } //namespace Glom #endif //GLOM_DB_ADDDEL_TREEVIEWCOLUMN_GLOM_H glom-1.22.4/glom/mode_data/db_adddel/db_treeviewcolumn_glom.cc0000644000175000017500000000231012234252646025565 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "db_treeviewcolumn_glom.h" namespace Glom { DbTreeViewColumnGlom::DbTreeViewColumnGlom(const Glib::ustring& title, Gtk::CellRenderer& cell) : Gtk::TreeViewColumn(title, cell) { } DbTreeViewColumnGlom::~DbTreeViewColumnGlom() { } Glib::ustring DbTreeViewColumnGlom::get_column_id() const { return m_column_id; } void DbTreeViewColumnGlom::set_column_id(const Glib::ustring& value) { m_column_id = value; } } //namespace Glom glom-1.22.4/glom/mode_data/notebook_data.cc0000644000175000017500000003242512234776363022002 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include namespace Glom { static const gchar gNotebookCss[] = "gtkmm__GtkNotebook#glomnotebook { padding: 0 0 0 0; }"; Notebook_Data::Notebook_Data() : m_iPage_Details(0), m_iPage_List(0) { //Hide the GtkNotebook border: set_name("glomnotebook"); GtkStyleContext *style_context; GtkCssProvider *provider; GError *error = NULL; style_context = gtk_widget_get_style_context(GTK_WIDGET(gobj())); provider = gtk_css_provider_new(); if (!gtk_css_provider_load_from_data(provider, gNotebookCss, -1, &error)) { g_error("%s", error->message); g_error_free(error); return; } gtk_style_context_add_provider(style_context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref(provider); //Add Pages: //Translators: This is a noun. It is a notebook tab title. append_page(m_Box_List, _("List")); m_iPage_List = 0; //Translators: This is a noun. It is a notebook tab title. append_page(m_Box_Details, _("Details")); m_iPage_Details = 1; // Set accessible name for the notebook, to be able to access it via LDTP #ifdef GTKMM_ATKMM_ENABLED //Translators: This is a title, not an action. get_accessible()->set_name(_("List Or Details View")); #endif //Connect signals: //Allow List to ask Details to show a record. m_Box_List.signal_user_requested_details().connect(sigc::mem_fun(*this, &Notebook_Data::on_list_user_requested_details)); //Allow the parent widget to detect list selection changes: m_Box_List.signal_record_selection_changed().connect(m_signal_record_selection_changed.make_slot()); //Allow Details to ask List to ask Details to show a different record: m_Box_Details.signal_nav_first().connect(sigc::mem_fun(m_Box_List, &Box_Data_List::on_details_nav_first)); m_Box_Details.signal_nav_prev().connect(sigc::mem_fun(m_Box_List, &Box_Data_List::on_details_nav_previous)); m_Box_Details.signal_nav_next().connect(sigc::mem_fun(m_Box_List, &Box_Data_List::on_details_nav_next)); m_Box_Details.signal_nav_last().connect(sigc::mem_fun(m_Box_List, &Box_Data_List::on_details_nav_last)); //Allow Details to tell List about record deletion: m_Box_Details.signal_record_deleted().connect(sigc::mem_fun(m_Box_List, &Box_Data_List::on_details_record_deleted)); //Allow Details to ask to show a different record in a different table: signal_connect_for_reemit_2args(m_Box_Details.signal_requested_related_details(), m_signal_record_details_requested); //Fill composite view: add_view(&m_Box_List); add_view(&m_Box_Details); show_all_children(); #ifndef GLOM_ENABLE_CLIENT_ONLY //This is hidden by default, m_Box_Details.show_layout_toolbar(false); #endif //GLOM_ENABLE_CLIENT_ONLY } Notebook_Data::~Notebook_Data() { remove_view(&m_Box_List); remove_view(&m_Box_Details); } bool Notebook_Data::init_db_details(const FoundSet& found_set, const Gnome::Gda::Value& primary_key_value_for_details) { m_table_name = found_set.m_table_name; //std::cout << "Notebook_Data::init_db_details: table_name=" << m_table_name << ", primary_key_value_for_details=" << primary_key_value_for_details.to_string() << std::endl; const bool details_record_specified = !Conversions::value_is_empty(primary_key_value_for_details); bool result = true; //where_clause is only used as a result of a find. //Performance optimisation: //Keep the connection open during all these operations: { sharedptr sharedconnection = connect_to_server(get_app_window()); result = m_Box_List.init_db_details(found_set, get_active_layout_platform(get_document())); //TODO: Select the last selected record. //Show the previously-shown record, if there is one, if this is not a new found-set (via a new where_clause) //so that returning to this table will return the user to the same record: Document* document = get_document(); if(document) { Gnome::Gda::Value primary_key_for_details; if(!details_record_specified) { //std::cout << "debug: no new_found_set" << std::endl; primary_key_for_details = document->get_layout_record_viewed(m_table_name, m_Box_Details.get_layout_name()); } else if(details_record_specified) { primary_key_for_details = primary_key_value_for_details; } //If the specified (or remembered) primary key value is not in the found set, //then ignore it: if(!found_set.m_where_clause.empty() && !get_primary_key_is_in_foundset(found_set, primary_key_for_details)) { primary_key_for_details = Gnome::Gda::Value(); //TODO: We set it to empty just so we can test if for empty. } if(Conversions::value_is_empty(primary_key_for_details)) { //Make sure that the details view is not empty, if there are any records to show: primary_key_for_details = m_Box_List.get_primary_key_value_selected(); //std::cout << "debug: m_Box_List.get_primary_key_value_selected()=" << primary_key_for_details.to_string() << std::endl; if(Conversions::value_is_empty(primary_key_for_details)) { //std::cout << "debug: calling list.get_primary_key_value_first()" << std::endl; primary_key_for_details = m_Box_List.get_primary_key_value_first(); //std::cout << " debug: result=" << primary_key_for_details.to_string() << std::endl; } } m_Box_Details.init_db_details(found_set, get_active_layout_platform(get_document()), primary_key_for_details); } else std::cerr << G_STRFUNC << ": document is NULL" << std::endl; } //Block this handler temporarily because we don't need another refresh from the database: if(m_connection_switch_page) m_connection_switch_page.block(); //Select the last-viewed layout, or the details layout, if a specific details record was specified: const dataview current_view = get_current_view(); if(details_record_specified) { if(current_view != DATA_VIEW_Details) set_current_view(DATA_VIEW_Details); } else { //Get information abvout the the last-viewed layout: Glib::ustring current_layout; if(!details_record_specified) { Document* document = get_document(); if(document) current_layout = document->get_layout_current(m_table_name); } //Set the layout: if( (current_layout.empty() || (current_layout == "list")) && (current_view != DATA_VIEW_List) ) set_current_view(DATA_VIEW_List); else if( (current_layout == "details") && (current_view != DATA_VIEW_Details) ) set_current_view(DATA_VIEW_Details); } //Re-enable this handler, so we can respond to notebook page changes: if(m_connection_switch_page) m_connection_switch_page.unblock(); return result; } FoundSet Notebook_Data::get_found_set() const { return m_Box_List.get_found_set(); } void Notebook_Data::show_details(const Gnome::Gda::Value& primary_key_value) { //Prevent n_switch_page_handler() from doing the same thing: if(m_connection_switch_page) m_connection_switch_page.block(); //std::cout << "DEBUG: Notebook_Data::show_details() primary_key_value=" << primary_key_value.to_string() << std::endl; m_Box_Details.refresh_data_from_database_with_primary_key(primary_key_value); if(get_current_view() != DATA_VIEW_Details) set_current_view(DATA_VIEW_Details); //Re-enable this handler, so we can respond to notebook page changes: if(m_connection_switch_page) m_connection_switch_page.unblock(); } bool Notebook_Data::on_idle_show_details(const Gnome::Gda::Value& primary_key_value) { show_details(primary_key_value); return false; //Don't call this idle handler again. } void Notebook_Data::on_list_user_requested_details(const Gnome::Gda::Value& primary_key_value) { //Show the details after a delay, //to avoid problems with deleting the list GtkCellRenderer while //handling its signal. Glib::signal_idle().connect( sigc::bind( sigc::mem_fun(*this, &Notebook_Data::on_idle_show_details), primary_key_value)); } FoundSet Notebook_Data::get_found_set_selected() const { if(get_current_view() == DATA_VIEW_Details) { return m_Box_Details.get_found_set(); } else { //Start with something sensible: FoundSet found_set = m_Box_List.get_found_set(); const Gnome::Gda::Value primary_key_value_selected = m_Box_List.get_primary_key_value_selected(); if(Conversions::value_is_empty(primary_key_value_selected)) { //Indicate to the caller that no record is selected: found_set.m_where_clause = Gnome::Gda::SqlExpr(); return found_set; } const Document* document = get_document(); if(!document) { std::cerr << G_STRFUNC << ": document is null" << std::endl; found_set.m_where_clause = Gnome::Gda::SqlExpr(); return found_set; } sharedptr primary_key_field = document->get_field_primary_key(m_table_name); found_set.m_where_clause = Utils::build_simple_where_expression( m_table_name, primary_key_field, primary_key_value_selected); return found_set; } } void Notebook_Data::set_current_view(dataview view) { if(view == DATA_VIEW_List) set_current_page(m_iPage_List); else set_current_page(m_iPage_Details); } void Notebook_Data::select_page_for_find_results() { if(m_Box_List.get_showing_multiple_records()) { set_current_page(m_iPage_List); } else { set_current_page(m_iPage_Details); } } #ifndef GLOM_ENABLE_CLIENT_ONLY void Notebook_Data::do_menu_developer_layout() { int iPageCurrent = get_current_page(); Gtk::Widget* pChild = get_nth_page(iPageCurrent); if(pChild) { Box_Data* pBox = dynamic_cast(pChild); if(pBox) pBox->show_layout_dialog(); } } void Notebook_Data::set_enable_layout_drag_and_drop(bool enable) { m_Box_Details.show_layout_toolbar(enable); m_Box_Details.set_enable_drag_and_drop(enable); } #endif // !GLOM_ENABLE_CLIENT_ONLY void Notebook_Data::do_menu_file_print() { const int iPageCurrent = get_current_page(); Gtk::Widget* pChild = get_nth_page(iPageCurrent); if(pChild) { Box_Data* pBox = dynamic_cast(pChild); if(pBox) pBox->print_layout(); } } enum dataview { DATA_VIEW_Details, DATA_VIEW_List }; Notebook_Data::dataview Notebook_Data::get_current_view() const { const int current_page = get_current_page(); dataview result = DATA_VIEW_Details; if(current_page == (int)m_iPage_List) result = DATA_VIEW_List; return result; } Notebook_Data::type_signal_record_details_requested Notebook_Data::signal_record_details_requested() { return m_signal_record_details_requested; } Notebook_Data::type_signal_record_selection_changed Notebook_Data::signal_record_selection_changed() { return m_signal_record_selection_changed; } void Notebook_Data::on_switch_page_handler(Gtk::Widget* pPage, guint uiPageNumber) { //Call base class: Notebook_Glom::on_switch_page_handler(pPage, uiPageNumber); //Remember that currently-viewed layout, so we can show it again when the user comes back to this table from elsewhere: Box_Data* box = dynamic_cast(get_nth_page(uiPageNumber)); if(box) { Document* document = get_document(); if(document) document->set_layout_current(m_table_name, box->get_layout_name()); //And refresh the list view whenever it is shown, to //a) show any new records that were added via the details view, or via a related portal elsewhere. //b) show changed field contents, changed elsewhere. if(box == &m_Box_List) { //std::cout << "debug: switching to list" << std::endl; const Gnome::Gda::Value primary_key_selected = m_Box_List.get_primary_key_value_selected(); m_Box_List.refresh_data_from_database(); m_Box_List.set_primary_key_value_selected(primary_key_selected); } else if(box == &m_Box_Details) { //std::cout << "debug: switching to details" << std::endl; const Gnome::Gda::Value primary_key_selected = m_Box_List.get_primary_key_value_selected(); m_Box_Details.refresh_data_from_database_with_primary_key(primary_key_selected); } } } void Notebook_Data::get_record_counts(gulong& total, gulong& found) { m_Box_List.get_record_counts(total, found); } void Notebook_Data::do_menu_file_add_record() { show_details(Gnome::Gda::Value()); m_Box_Details.do_new_record(); } } //namespace Glom glom-1.22.4/glom/mode_data/box_data_details.h0000644000175000017500000001445512234776363022324 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_BOX_DATA_DETAILS_H #define GLOM_MODE_DATA_BOX_DATA_DETAILS_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include "box_data.h" //#include #include "flowtablewithfields.h" #include #ifndef GLOM_ENABLE_CLIENT_ONLY #include #endif namespace Glom { class Box_Data_Details : public Box_Data { public: Box_Data_Details(bool bWithNavButtons = true); virtual ~Box_Data_Details(); bool init_db_details(const FoundSet& found_set, const Glib::ustring& layout_platform, const Gnome::Gda::Value& primary_key_value); virtual bool refresh_data_from_database_with_primary_key(const Gnome::Gda::Value& primary_key_value); virtual bool refresh_data_from_database_blank(); virtual void print_layout(); //Signals: typedef sigc::signal type_signal_void; type_signal_void signal_nav_first(); type_signal_void signal_nav_prev(); type_signal_void signal_nav_next(); type_signal_void signal_nav_last(); typedef sigc::signal type_signal_record_deleted; //arg is PrimaryKey. type_signal_record_deleted signal_record_deleted(); /** For instance, * void on_requested_related_details(const Glib::ustring& table_name, Gnome::Gda::Value primary_key_value); */ typedef sigc::signal type_signal_requested_related_details; type_signal_requested_related_details signal_requested_related_details(); #ifndef GLOM_ENABLE_CLIENT_ONLY void show_layout_toolbar(bool show = true); #endif void do_new_record(); void set_enable_drag_and_drop(bool enabled = true); protected: //Implementations of pure virtual methods from Base_DB_Table_Data: public: virtual Gnome::Gda::Value get_primary_key_value_selected() const; //Value in the primary key's cell. protected: virtual void set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_primary_key_value(const Gtk::TreeModel::iterator& row) const; //Actual primary key value of this record. virtual Gnome::Gda::Value get_entered_field_data(const sharedptr& field) const; virtual void set_entered_field_data(const sharedptr& field, const Gnome::Gda::Value& value); virtual void set_entered_field_data(const Gtk::TreeModel::iterator& row, const sharedptr& field, const Gnome::Gda::Value& value); virtual bool fill_from_database(); //override. virtual void create_layout(); //virtual void fill_related(); virtual sharedptr get_field_primary_key() const; void set_found_set_from_primary_key_value(); private: //Signal handlers: void on_button_new(); void on_button_del(); void on_button_nav_first(); void on_button_nav_prev(); void on_button_nav_next(); void on_button_nav_last(); protected: virtual void on_userlevel_changed(AppState::userlevels user_level); //override #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void on_flowtable_layout_changed(); #endif // !GLOM_ENABLE_CLIENT_ONLY //Signal handler: The last 2 args are bind-ed. virtual void on_related_record_added(Gnome::Gda::Value key_value, Glib::ustring strFromKeyName); //Signal handler: The last arg is bind-ed. //virtual void on_related_user_requested_details(Gnome::Gda::Value key_value, Glib::ustring table_name); //This is virtual so it can be overriden in Box_Data_Details_Find. virtual void on_flowtable_field_edited(const sharedptr& layout_field, const Gnome::Gda::Value& value); void on_flowtable_field_choices_changed(const sharedptr& layout_field); void on_flowtable_field_open_details_requested(const sharedptr& id, const Gnome::Gda::Value& value); void on_flowtable_related_record_changed(const Glib::ustring& relationship_name); void on_flowtable_requested_related_details(const Glib::ustring& table_name, Gnome::Gda::Value primary_key_value); void on_flowtable_script_button_clicked(const sharedptr& layout_item); virtual void recalculate_fields_for_related_records(const Glib::ustring& relationship_name); #ifndef GLOM_ENABLE_CLIENT_ONLY virtual Dialog_Layout* create_layout_dialog() const; // override. virtual void prepare_layout_dialog(Dialog_Layout* dialog); // override. #endif // !GLOM_ENABLE_CLIENT_ONLY sharedptr m_field_primary_key; Gnome::Gda::Value m_primary_key_value; //Member widgets: Gtk::ScrolledWindow m_ScrolledWindow; Gtk::Box m_hbox_content; FlowTableWithFields m_FlowTable; #ifndef GLOM_ENABLE_CLIENT_ONLY LayoutToolbar m_Dragbar; #endif Gtk::ButtonBox m_hbox_buttons; Gtk::Button m_Button_New; Gtk::Button m_Button_Del; Gtk::Button m_Button_Nav_First; Gtk::Button m_Button_Nav_Prev; Gtk::Button m_Button_Nav_Next; Gtk::Button m_Button_Nav_Last; guint m_ColumnName, m_ColumnValue; bool m_bDoNotRefreshRelated; //Stops us from refreshing related records in response to an addition of a related record. bool m_ignore_signals; type_signal_void m_signal_nav_first; type_signal_void m_signal_nav_prev; type_signal_void m_signal_nav_next; type_signal_void m_signal_nav_last; type_signal_record_deleted m_signal_record_deleted; type_signal_requested_related_details m_signal_requested_related_details; #ifndef GLOM_ENABLE_CLIENT_ONLY bool m_design_mode; // Cache here because we need it when the layout is redrawn #endif }; } //namespace Glom #endif // GLOM_MODE_DATA_BOX_DATA_DETAILS_H glom-1.22.4/glom/mode_data/notebook_data.h0000644000175000017500000000723612234776363021646 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_NOTEBOOK_DATA_H #define GLOM_MODE_DATA_NOTEBOOK_DATA_H #include #include #include namespace Glom { class Notebook_Data : public Notebook_Glom { public: Notebook_Data(); virtual ~Notebook_Data(); /** Create the layout for the database structure, and fill it with data. * @param found_set Specifies a found sub-set of the table's records, or all records. * @param primary_key_value_for_details Specifies a single record to show in the details tab, if specified. * @result true if the operation was successful. */ bool init_db_details(const FoundSet& found_set, const Gnome::Gda::Value& primary_key_value_for_details = Gnome::Gda::Value()); ///Get the existing where clause, previously supplied to init_db_details(). FoundSet get_found_set() const; /** Get the found set for the currently-selected record in the list view, * if the list view is visible, or the currently-visible details tab. */ FoundSet get_found_set_selected() const; ///Show the details for a particular record, without affecting the list view. void show_details(const Gnome::Gda::Value& primary_key_value); void select_page_for_find_results(); //Details for 1, List for > 1. #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void do_menu_developer_layout(); //override void set_enable_layout_drag_and_drop(bool enable = true); #endif // !GLOM_ENABLE_CLIENT_ONLY virtual void do_menu_file_print(); //override void do_menu_file_add_record(); void get_record_counts(gulong& total, gulong& found); enum dataview { DATA_VIEW_Details, DATA_VIEW_List }; dataview get_current_view() const; void set_current_view(dataview view); typedef sigc::signal type_signal_record_details_requested; type_signal_record_details_requested signal_record_details_requested(); typedef sigc::signal type_signal_record_selection_changed; /** This signal is emitted when the a record is selected, or deselected, * in the list view. */ type_signal_record_selection_changed signal_record_selection_changed(); protected: ///Show the counts of all records and found records. void update_records_count(); //Signal handlers: virtual void on_list_user_requested_details(const Gnome::Gda::Value& primary_key_value); virtual void on_switch_page_handler(Gtk::Widget* pPage, guint uiPageNumber); private: bool on_idle_show_details(const Gnome::Gda::Value& primary_key_value); protected: //Member widgets: Box_Data_List m_Box_List; Box_Data_Details m_Box_Details; guint m_iPage_Details, m_iPage_List; Glib::ustring m_table_name; type_signal_record_details_requested m_signal_record_details_requested; type_signal_record_selection_changed m_signal_record_selection_changed; }; } //namespace Glom #endif // GLOM_MODE_DATA_NOTEBOOK_DATA_H glom-1.22.4/glom/mode_data/box_data_calendar_related.cc0000644000175000017500000005205312234776363024302 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include //For show_ok_dialog() #include #include #include namespace Glom { Box_Data_Calendar_Related::Box_Data_Calendar_Related() : m_pMenuPopup(0), m_query_column_date_field(-1) { set_size_request(400, -1); //An arbitrary default. m_Alignment.add(m_calendar); m_calendar.show(); //m_calendar.set_show_details(); m_calendar.set_detail_width_chars(7); m_calendar.set_detail_height_rows(2); //Tell the calendar how to get the record details to show: m_calendar.set_detail_func( sigc::mem_fun(*this, &Box_Data_Calendar_Related::on_calendar_details) ); m_calendar.signal_month_changed().connect( sigc::mem_fun(*this, &Box_Data_Calendar_Related::on_calendar_month_changed) ); setup_menu(); //m_calendar.add_events(Gdk::BUTTON_PRESS_MASK); //Allow us to catch button_press_event and button_release_event m_calendar.signal_button_press_event().connect_notify( sigc::mem_fun(*this, &Box_Data_Calendar_Related::on_calendar_button_press_event) ); m_layout_name = "list_related_calendar"; //TODO: We need a unique name when 2 portals use the same table. } Box_Data_Calendar_Related::~Box_Data_Calendar_Related() { clear_cached_database_values(); } void Box_Data_Calendar_Related::enable_buttons() { //const bool view_details_possible = get_has_suitable_record_to_view_details(); //m_calendar.set_allow_view_details(view_details_possible); //Don't allow the user to go to a record in a hidden table. } bool Box_Data_Calendar_Related::init_db_details(const sharedptr& portal, bool show_title) { //This calls the other method overload: return Box_Data_Portal::init_db_details(portal, show_title); } bool Box_Data_Calendar_Related::init_db_details(const Glib::ustring& parent_table, bool show_title) { //std::cout << "debug: " << G_STRFUNC << ": " << parent_table << std::endl; m_parent_table = parent_table; if(m_portal) LayoutWidgetBase::m_table_name = m_portal->get_table_used(Glib::ustring() /* parent table_name, not used. */); else LayoutWidgetBase::m_table_name = Glib::ustring(); Base_DB_Table::m_table_name = LayoutWidgetBase::m_table_name; //TODO: This is duplicated in box_data_related_list.cc and box_data_portal.cc. Just use code from the base class? if(show_title) { Glib::ustring title; if(m_portal) title = item_get_title(m_portal); m_Label.set_markup(Utils::bold_message(title)); m_Label.show(); m_Alignment.set_padding(Utils::DEFAULT_SPACING_SMALL /* top */, 0, Utils::DEFAULT_SPACING_LARGE /* left */, 0); } else { m_Label.set_markup(Glib::ustring()); m_Label.hide(); m_Alignment.set_padding(0, 0, 0, 0); //The box itself has padding of 6. } if(m_portal) { Document* document = get_document(); m_key_field = DbUtils::get_fields_for_table_one_field(document, LayoutWidgetBase::m_table_name, m_portal->get_to_field_used()); } else m_key_field.clear(); enable_buttons(); FoundSet found_set; found_set.m_table_name = LayoutWidgetBase::m_table_name; return Box_Data::init_db_details(found_set, "" /* layout_platform */); //Calls create_layout() and fill_from_database(). } void Box_Data_Calendar_Related::create_layout() { Box_Data::create_layout(); m_FieldsShown = get_fields_to_show(); } bool Box_Data_Calendar_Related::fill_from_database() { if(!m_portal) return false; bool result = false; if(m_key_field && m_found_set.m_where_clause.empty()) //There's a key field, but no value. { //No Foreign Key value, so just show the field names: result = Base_DB_Table_Data::fill_from_database(); //create_layout(); } else { if(m_query_column_date_field == -1) return false; //This is useless without the date in the result. //Create a date range from the beginning to end of the selected month: Glib::Date calendar_date; m_calendar.get_date(calendar_date); const Glib::Date date_start(1, calendar_date.get_month(), calendar_date.get_year()); Glib::Date date_end = date_start; date_end.add_months(1); Gnome::Gda::Value date_start_value(date_start); Gnome::Gda::Value date_end_value(date_end); //Add a WHERE clause for this date range: sharedptr relationship = m_portal->get_relationship(); Glib::ustring where_clause_to_table_name = relationship->get_to_table(); sharedptr derived_portal = sharedptr::cast_dynamic(m_portal); const Glib::ustring date_field_name = derived_portal->get_date_field()->get_name(); sharedptr relationship_related = m_portal->get_related_relationship(); if(relationship_related) { //Adjust the WHERE clause appropriately for the extra JOIN: sharedptr uses_rel_temp = sharedptr::create(); uses_rel_temp->set_relationship(relationship); where_clause_to_table_name = uses_rel_temp->get_sql_join_alias_name(); } //Add an AND to the existing where clause, to get only records within these dates, if any: sharedptr date_field = derived_portal->get_date_field(); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); const guint cond = builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_BETWEEN, builder->add_field_id(date_field->get_name(), m_found_set.m_table_name), builder->add_expr_as_value(date_start_value), builder->add_expr_as_value(date_end_value)); builder->set_where(cond); //Might be unnecessary. const Gnome::Gda::SqlExpr extra_where_clause = builder->export_expression(cond); Gnome::Gda::SqlExpr where_clause; if(m_found_set.m_where_clause.empty()) { where_clause = extra_where_clause; } else { where_clause = Utils::build_combined_where_expression( m_found_set.m_where_clause, extra_where_clause, Gnome::Gda::SQL_OPERATOR_TYPE_AND); } //Do one SQL query for the whole month and store the cached values here: clear_cached_database_values(); Glib::RefPtr sql_query = Utils::build_sql_select_with_where_clause(m_found_set.m_table_name, m_FieldsShown, where_clause, m_found_set.m_extra_join, m_found_set.m_sort_clause); //std::cout << "DEBUG: sql_query=" << sql_query << std::endl; Glib::RefPtr datamodel = DbUtils::query_execute_select(sql_query); if(!(datamodel)) return true; const int rows_count = datamodel->get_n_rows(); if(!(rows_count > 0)) return true; //Get the data: for(int row_index = 0; row_index < rows_count; ++row_index) { const int columns_count = datamodel->get_n_columns(); if(m_query_column_date_field > columns_count) continue; //Get the date value for this row: const Gnome::Gda::Value value_date = datamodel->get_value_at(m_query_column_date_field, row_index); const Glib::Date date = value_date.get_date(); //Get all the values for this row: type_vector_values* pVector = new type_vector_values(m_FieldsShown.size()); for(int column_index = 0; column_index < columns_count; ++column_index) { (*pVector)[column_index] = datamodel->get_value_at(column_index, row_index); } m_map_values[date].push_back(pVector); } } return result; } void Box_Data_Calendar_Related::clear_cached_database_values() { for(type_map_values::iterator iter = m_map_values.begin(); iter != m_map_values.end(); ++iter) { type_list_vectors vec = iter->second; for(type_list_vectors::iterator iter = vec.begin(); iter != vec.end(); ++iter) { type_vector_values* pValues = *iter; delete pValues; } } m_map_values.clear(); } //TODO: Make this generic in Box_Data_Portal: void Box_Data_Calendar_Related::on_record_added(const Gnome::Gda::Value& primary_key_value, const Gtk::TreeModel::iterator& row) { //primary_key_value is a new autogenerated or human-entered key for the row. //It has already been added to the database. if(!row) return; Gnome::Gda::Value key_value; if(m_key_field) { //m_key_field is the field in this table that must match another field in the parent table. sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(m_key_field); //TODO: key_value = m_calendar.get_value(row, layout_item); } //Make sure that the new related record is related, //by setting the foreign key: //If it's not auto-generated. if(!Conversions::value_is_empty(key_value)) //If there is already a value. { //It was auto-generated. Tell the parent about it, so it can make a link. signal_record_added.emit(key_value); } else if(Conversions::value_is_empty(m_key_value)) { std::cerr << G_STRFUNC << ": m_key_value is NULL." << std::endl; } else { sharedptr field_primary_key; //TODO: = m_calendar.get_key_field(); //Create the link by setting the foreign key if(m_key_field && m_portal) { Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); const Glib::ustring target_table = m_portal->get_table_used(Glib::ustring() /* not relevant */); builder->set_table(target_table); builder->add_field_value_as_value(m_key_field->get_name(), m_key_value); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(field_primary_key->get_name(), target_table), builder->add_expr_as_value(primary_key_value))); const bool test = DbUtils::query_execute(builder); if(test) { //Show it on the view, if it's visible: sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(field_primary_key); //TODO: m_calendar.set_value(row, layout_item, m_key_value); } } //on_adddel_user_changed(row, iKey); //Update the database. } } Box_Data_Calendar_Related::type_vecConstLayoutFields Box_Data_Calendar_Related::get_fields_to_show() const { type_vecConstLayoutFields layout_fields = Box_Data_Portal::get_fields_to_show(); sharedptr derived_portal = sharedptr::cast_dynamic(m_portal); if(!derived_portal) { std::cerr << G_STRFUNC << ": The portal is not a LayoutItem_CalendarPortal." << std::endl; return layout_fields; } sharedptr date_field = derived_portal->get_date_field(); if(!date_field) { std::cerr << G_STRFUNC << ": get_date_field() returned no field." << std::endl; return layout_fields; } //Add it to the list to ensure that we request the date (though it will not really be shown in the calendar): sharedptr layout_item_date_field = sharedptr::create(); layout_item_date_field->set_full_field_details(date_field); layout_fields.push_back(layout_item_date_field); m_query_column_date_field = layout_fields.size() - 1; return layout_fields; } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Data_Calendar_Related::on_dialog_layout_hide() { Dialog_Layout_Calendar_Related* dialog_related = dynamic_cast(m_pDialogLayout); g_assert(dialog_related); m_portal = dialog_related->get_portal_layout(); //Update the UI: sharedptr derived_portal = sharedptr::cast_dynamic(m_portal); init_db_details(derived_portal); Box_Data::on_dialog_layout_hide(); sharedptr pLayoutItem = sharedptr::cast_dynamic(get_layout_item()); if(pLayoutItem) { sharedptr derived_portal = sharedptr::cast_dynamic(m_portal); if(derived_portal) *pLayoutItem = *derived_portal; signal_layout_changed().emit(); //TODO: Check whether it has really changed. } } #endif // !GLOM_ENABLE_CLIENT_ONLY #ifndef GLOM_ENABLE_CLIENT_ONLY Dialog_Layout* Box_Data_Calendar_Related::create_layout_dialog() const { Dialog_Layout_Calendar_Related* dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(dialog); return dialog; } void Box_Data_Calendar_Related::prepare_layout_dialog(Dialog_Layout* dialog) { Dialog_Layout_Calendar_Related* related_dialog = dynamic_cast(dialog); g_assert(related_dialog); sharedptr derived_portal = sharedptr::cast_dynamic(m_portal); if(derived_portal && derived_portal->get_has_relationship_name()) { related_dialog->init_with_portal(m_layout_name, m_layout_platform, get_document(), derived_portal); } else { related_dialog->init_with_tablename(m_layout_name, m_layout_platform, get_document(), m_parent_table); } } #endif // !GLOM_ENABLE_CLIENT_ONLY void Box_Data_Calendar_Related::on_calendar_month_changed() { //Update the cached values for the new month: fill_from_database(); } Glib::ustring Box_Data_Calendar_Related::on_calendar_details(guint year, guint month, guint day) { sharedptr derived_portal = sharedptr::cast_dynamic(m_portal); if(!derived_portal) { //std::cout << "debug: " << G_STRFUNC << ": date_field is NULL" << std::endl; return Glib::ustring(); } sharedptr date_field = derived_portal->get_date_field(); if(!date_field) { std::cerr << G_STRFUNC << ": get_date_field() returned no field." << std::endl; return Glib::ustring(); } //TODO: month seems to be 143710360 sometimes, which seems to be a GtkCalendar bug: //std::cout << "debug: " << G_STRFUNC << ": year=" << year << ", month=" << month << " day=" << day << std::endl; //Glib::Date is 1-indexed: Glib::Date::Month datemonth = (Glib::Date::Month)(month +1); if(datemonth > Glib::Date::DECEMBER) datemonth = Glib::Date::JANUARY; Glib::Date date(day, datemonth, year); //Examine the cached data: type_map_values::const_iterator iter_find = m_map_values.find(date); if(iter_find == m_map_values.end()) return Glib::ustring(); //No data was found for this date. Glib::ustring result; //Look at each row for this date: const type_list_vectors& rows = iter_find->second; for(type_list_vectors::const_iterator iter = rows.begin(); iter != rows.end(); ++iter) { type_vector_values* pRow = *iter; if(!pRow) continue; //Get the data for each column in the row: Glib::ustring row_text; int column_index = 0; //We iterate over the original list of items from the portal, //instead of the ones used by the query (m_FieldsShown), //because we really don't want to show the extra fields (at the end) to the user: LayoutGroup::type_list_items items = m_portal->get_items(); for(LayoutGroup::type_list_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr layout_item = *iter; if(!layout_item) continue; Glib::ustring text; //Text for a text item: sharedptr layout_item_text = sharedptr::cast_dynamic(layout_item); if(layout_item_text) text = layout_item_text->get_text(AppWindow::get_current_locale()); else { //Text for a field: sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); const Gnome::Gda::Value value = (*pRow)[column_index]; text = Conversions::get_text_for_gda_value(layout_item_field->get_glom_type(), value, layout_item_field->get_formatting_used().m_numeric_format); ++column_index; } //Add the field text to the row: if(!text.empty()) { if(!row_text.empty()) row_text += ", "; //TODO: Internationalization? row_text += text; } } //Add the row text to the result: if(!row_text.empty()) { if(!result.empty()) result += '\n'; result += row_text; } } return result; } void Box_Data_Calendar_Related::setup_menu() { m_refActionGroup = Gtk::ActionGroup::create(); m_refActionGroup->add(Gtk::Action::create("ContextMenu", "Context Menu") ); m_refContextEdit = Gtk::Action::create("ContextEdit", Gtk::Stock::EDIT); m_refActionGroup->add(m_refContextEdit, sigc::mem_fun(*this, &Box_Data_Calendar_Related::on_MenuPopup_activate_Edit) ); #ifndef GLOM_ENABLE_CLIENT_ONLY // Don't add ContextLayout in client only mode because it would never // be sensitive anyway m_refContextLayout = Gtk::Action::create("ContextLayout", _("Layout")); m_refActionGroup->add(m_refContextLayout, sigc::mem_fun(*this, &Box_Data_Calendar_Related::on_MenuPopup_activate_layout) ); //TODO: This does not work until this widget is in a container in the window: AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->update_userlevel_ui(); //Update our action's sensitivity. } #endif // !GLOM_ENABLE_CLIENT_ONLY m_refUIManager = Gtk::UIManager::create(); m_refUIManager->insert_action_group(m_refActionGroup); //TODO: add_accel_group(m_refUIManager->get_accel_group()); try { Glib::ustring ui_info = "" " " " " #ifndef GLOM_ENABLE_CLIENT_ONLY " " #endif " " ""; m_refUIManager->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_pMenuPopup = dynamic_cast( m_refUIManager->get_widget("/ContextMenu") ); if(!m_pMenuPopup) g_warning("menu not found"); #ifndef GLOM_ENABLE_CLIENT_ONLY if(pApp) m_refContextLayout->set_sensitive(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER); #endif // !GLOM_ENABLE_CLIENT_ONLY } void Box_Data_Calendar_Related::on_calendar_button_press_event(GdkEventButton *event) { #ifndef GLOM_ENABLE_CLIENT_ONLY //Enable/Disable items. //We did this earlier, but get_appwindow is more likely to work now: AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->update_userlevel_ui(); //Update our action's sensitivity. } #endif GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window(Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); return; //handled. } else { if(event->type == GDK_2BUTTON_PRESS) { //Double-click means edit. //Don't do this usually, because users sometimes double-click by accident when they just want to edit a cell. //TODO: If the cell is not editable, handle the double-click as an edit/selection. //on_MenuPopup_activate_Edit(); return; //Not handled. } } return; //Not handled. TODO: Call base class? } void Box_Data_Calendar_Related::on_MenuPopup_activate_Edit() { const Gnome::Gda::Value primary_key_value; //TODO: = m_AddDel.get_value_key(row); //The primary key is in the key. signal_user_requested_details().emit(primary_key_value); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Data_Calendar_Related::on_MenuPopup_activate_layout() { show_layout_dialog(); } #endif // !GLOM_ENABLE_CLIENT_ONLY Gnome::Gda::Value Box_Data_Calendar_Related::get_primary_key_value(const Gtk::TreeModel::iterator& /* row */) const { return Gnome::Gda::Value(); //TODO: m_AddDel.get_value_key(row); } Gnome::Gda::Value Box_Data_Calendar_Related::get_primary_key_value_selected() const { return Gnome::Gda::Value(); //TODO: m_AddDel.get_value_key_selected(); } void Box_Data_Calendar_Related::set_primary_key_value(const Gtk::TreeModel::iterator& /* row */, const Gnome::Gda::Value& /* value */) { //TODO } } //namespace Glom glom-1.22.4/glom/mode_data/box_data_details.cc0000644000175000017500000010445112234776363022456 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2009 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include #include //For show_ok_dialog(). #include #include #include #include #include #include #include #include #include #include #include #include #include #include //For stringstream #include namespace Glom { Box_Data_Details::Box_Data_Details(bool bWithNavButtons /* = true */) : m_hbox_content(Gtk::ORIENTATION_HORIZONTAL, Utils::DEFAULT_SPACING_SMALL), m_hbox_buttons(Gtk::ORIENTATION_HORIZONTAL), m_Button_New(Gtk::Stock::ADD), m_Button_Del(Gtk::Stock::DELETE), m_Button_Nav_First(Gtk::Stock::GOTO_FIRST), m_Button_Nav_Prev(Gtk::Stock::GO_BACK), m_Button_Nav_Next(Gtk::Stock::GO_FORWARD), m_Button_Nav_Last(Gtk::Stock::GOTO_LAST), m_bDoNotRefreshRelated(false), m_ignore_signals(true) #ifndef GLOM_ENABLE_CLIENT_ONLY , m_design_mode(false) #endif { m_layout_name = "details"; m_hbox_buttons.set_layout(Gtk::BUTTONBOX_END); m_hbox_buttons.set_spacing(Utils::DEFAULT_SPACING_SMALL); add_view(&m_FlowTable); //Allow this to access the document too. m_FlowTable.set_lines(1); //Sub-groups will have multiple columns (by default, there is one sub-group, with 2 columns). m_FlowTable.set_horizontal_spacing(Utils::DEFAULT_SPACING_SMALL); //The default anyway. m_FlowTable.set_vertical_spacing(Utils::DEFAULT_SPACING_SMALL); //The default anyway. //m_strHint = _("When you change the data in a field the database is updated immediately.\n Click [New] to add a new record.\n Leave automatic ID fields empty - they will be filled for you."); //m_ScrolledWindow.set_border_width(Utils::DEFAULT_SPACING_SMALL); // Allow vertical scrolling, but never scroll horizontally: m_ScrolledWindow.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); m_ScrolledWindow.set_shadow_type(Gtk::SHADOW_NONE); //SHADOW_IN is Recommended by the GNOME HIG, but looks odd. #ifndef GLOM_ENABLE_CLIENT_ONLY m_hbox_content.pack_start(m_Dragbar, Gtk::PACK_SHRINK); m_Dragbar.hide(); #endif m_hbox_content.pack_start(m_ScrolledWindow); m_ScrolledWindow.add(m_FlowTable); // The FlowTable does not support native scrolling, so gtkmm adds it to a // viewport first that also has some shadow we do not want. Gtk::Viewport* viewport = dynamic_cast(m_FlowTable.get_parent()); if(viewport) viewport->set_shadow_type(Gtk::SHADOW_NONE); pack_start(m_hbox_content); m_FlowTable.signal_field_edited().connect( sigc::mem_fun(*this, &Box_Data_Details::on_flowtable_field_edited) ); m_FlowTable.signal_field_choices_changed().connect( sigc::mem_fun(*this, &Box_Data_Details::on_flowtable_field_choices_changed) ); m_FlowTable.signal_field_open_details_requested().connect( sigc::mem_fun(*this, &Box_Data_Details::on_flowtable_field_open_details_requested) ); show_all(); m_FlowTable.signal_related_record_changed().connect( sigc::mem_fun(*this, &Box_Data_Details::on_flowtable_related_record_changed) ); #ifndef GLOM_ENABLE_CLIENT_ONLY m_FlowTable.signal_layout_changed().connect( sigc::mem_fun(*this, &Box_Data_Details::on_flowtable_layout_changed) ); #endif // !GLOM_ENABLE_CLIENT_ONLY m_FlowTable.signal_requested_related_details().connect( sigc::mem_fun(*this, &Box_Data_Details::on_flowtable_requested_related_details) ); m_FlowTable.signal_script_button_clicked().connect( sigc::mem_fun(*this, &Box_Data_Details::on_flowtable_script_button_clicked) ); m_Button_New.set_tooltip_text(_("Create a new record.")); m_Button_Del.set_tooltip_text(_("Remove this record.")); m_Button_Nav_First.set_tooltip_text(_("View the first record in the list.")); m_Button_Nav_Prev.set_tooltip_text(_("View the previous record in the list.")); m_Button_Nav_Next.set_tooltip_text(_("View the next record in the list.")); m_Button_Nav_Last.set_tooltip_text(_("View the last record in the list.")); //Add or delete record: m_hbox_buttons.pack_start(m_Button_New, Gtk::PACK_SHRINK); m_hbox_buttons.pack_start(m_Button_Del, Gtk::PACK_SHRINK); m_hbox_buttons.set_child_secondary(m_Button_New, true); m_hbox_buttons.set_child_secondary(m_Button_Del, true); //Link buttons to handlers: m_Button_New.signal_clicked().connect(sigc::mem_fun(*this, &Box_Data_Details::on_button_new)); m_Button_Del.signal_clicked().connect(sigc::mem_fun(*this, &Box_Data_Details::on_button_del)); //Navigation: if(bWithNavButtons) { m_hbox_buttons.pack_start(m_Button_Nav_First, Gtk::PACK_SHRINK); m_hbox_buttons.pack_start(m_Button_Nav_Prev, Gtk::PACK_SHRINK); m_hbox_buttons.pack_start(m_Button_Nav_Next, Gtk::PACK_SHRINK); m_hbox_buttons.pack_start(m_Button_Nav_Last, Gtk::PACK_SHRINK); } //Link buttons to handlers: m_Button_Nav_First.signal_clicked().connect(sigc::mem_fun(*this, &Box_Data_Details::on_button_nav_first)); m_Button_Nav_Prev.signal_clicked().connect(sigc::mem_fun(*this, &Box_Data_Details::on_button_nav_prev)); m_Button_Nav_Next.signal_clicked().connect(sigc::mem_fun(*this, &Box_Data_Details::on_button_nav_next)); m_Button_Nav_Last.signal_clicked().connect(sigc::mem_fun(*this, &Box_Data_Details::on_button_nav_last)); pack_start(m_hbox_buttons, Gtk::PACK_SHRINK); m_ignore_signals = false; } Box_Data_Details::~Box_Data_Details() { remove_view(&m_FlowTable); } Gnome::Gda::Value Box_Data_Details::get_primary_key_value(const Gtk::TreeModel::iterator& /* row */) const { return get_primary_key_value_selected(); } void Box_Data_Details::set_primary_key_value(const Gtk::TreeModel::iterator& /* row */, const Gnome::Gda::Value& value) { m_primary_key_value = value; set_found_set_from_primary_key_value(); } void Box_Data_Details::set_found_set_from_primary_key_value() { if(!m_field_primary_key) return; if(!Conversions::value_is_empty(m_primary_key_value)) { m_found_set.m_where_clause = Utils::build_simple_where_expression( m_table_name, m_field_primary_key, m_primary_key_value); //std::cout << "debug: " << G_STRFUNC << ": m_found_set.m_where_clause = " << m_found_set.m_where_clause << std::endl; } } bool Box_Data_Details::init_db_details(const FoundSet& found_set, const Glib::ustring& layout_platform, const Gnome::Gda::Value& primary_key_value) { //std::cout << "debug: " << G_STRFUNC << ": primary_key_value=" << primary_key_value.to_string() << std::endl; m_primary_key_value = primary_key_value; m_field_primary_key = get_field_primary_key_for_table(found_set.m_table_name); const bool result = Box_Data::init_db_details(found_set, layout_platform); //Calls create_layout(), then fill_from_database() //This is not used much, but we create it anyway: m_found_set = found_set; //Not used much. set_found_set_from_primary_key_value(); return result; } bool Box_Data_Details::refresh_data_from_database_with_primary_key(const Gnome::Gda::Value& primary_key_value) { m_primary_key_value = primary_key_value; set_found_set_from_primary_key_value(); return fill_from_database(); } bool Box_Data_Details::refresh_data_from_database_blank() { return refresh_data_from_database_with_primary_key( Gnome::Gda::Value() ); } void Box_Data_Details::create_layout() { BusyCursor busy_cursor(get_app_window()); Box_Data::create_layout(); //Fills m_TableFields. //Remove existing child widgets: m_FlowTable.remove_all(); Document* document = dynamic_cast(get_document()); if(document) { m_FlowTable.set_table(m_table_name); //This allows portals to get full Relationship information //This map of layout groups will also contain the field information from the database: Document::type_list_layout_groups layout_groups = get_data_layout_groups(m_layout_name, m_layout_platform); for(Document::type_list_layout_groups::const_iterator iter = layout_groups.begin(); iter != layout_groups.end(); ++iter) { m_FlowTable.add_layout_group(*iter, false /* no indent at this top level */); } m_FlowTable.align_child_group_labels(); } #ifndef GLOM_ENABLE_CLIENT_ONLY m_FlowTable.set_design_mode(m_design_mode); #endif } bool Box_Data_Details::fill_from_database() { //std::cout << "debug: " << G_STRFUNC << ": m_primary_key_value=" << m_primary_key_value.to_string() << std::endl; //Don't try to open a connection if there is no document, //for instance, during application destruction. if(!get_document()) return false; bool bResult = false; BusyCursor busy_cursor(get_app_window()); const bool primary_key_is_empty = Conversions::value_is_empty(m_primary_key_value); if(!primary_key_is_empty) get_document()->set_layout_record_viewed(m_table_name, m_layout_name, m_primary_key_value); if(!m_field_primary_key) { //refresh_data_from_database_blank(); //shows blank record return false; } //TODO: This should keep the connection open, so we don't need to //reconnect many times.. sharedptr sharedconnection; try { sharedconnection = connect_to_server(get_app_window()); } catch(const Glib::Exception& ex) { handle_error(ex); bResult = false; } catch(const std::exception& ex) { handle_error(ex); bResult = false; } if(sharedconnection) { // TODO: Can this throw? bResult = Box_Data::fill_from_database(); m_FieldsShown = get_fields_to_show(); type_vecConstLayoutFields fieldsToGet = m_FieldsShown; if(!fieldsToGet.empty()) { //Do not try to show the data if the user may not view it: Privileges table_privs = Privs::get_current_privs(m_table_name); //Enable/Disable record creation and deletion: m_Button_New.set_sensitive(table_privs.m_create); m_Button_Del.set_sensitive(table_privs.m_delete); if(table_privs.m_view) { //Add extra possibly-non-visible columns that we need: sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(m_field_primary_key); //Get the primary key index, adding the primary key if necessary: //TODO_Performance: Do this for create_layout() only, instead of repeating it for each refresh?: int index_primary_key = -1; //Arbitrary default. //g_warning("primary_key name = %s", m_field_primary_key->get_name().c_str()); const type_vecConstLayoutFields::const_iterator iterFind = std::find_if(fieldsToGet.begin(), fieldsToGet.end(), predicate_LayoutItem_Field_IsSameField(layout_item)); if(iterFind == fieldsToGet.end()) { fieldsToGet.push_back(layout_item); index_primary_key = fieldsToGet.size() - 1; } else { //TODO_Performance: Is there any quick way to get the index from iterFind? //TODO_Performance: If not, then just use this instead of the predicate. const type_vecLayoutFields::size_type count = fieldsToGet.size(); for(type_vecLayoutFields::size_type i = 0; i < count; ++i) { sharedptr element = fieldsToGet[i]; if(!element) continue; if(element->get_name() != layout_item->get_name()) continue; //Compare the relationship and related relationship: sharedptr uses_a = layout_item; sharedptr uses_b = element; if(*uses_a == *uses_b) { index_primary_key = i; break; } } } Glib::RefPtr query = Utils::build_sql_select_with_key(m_table_name, fieldsToGet, m_field_primary_key, m_primary_key_value); Glib::RefPtr result; if(!primary_key_is_empty) result = DbUtils::query_execute_select(query); if((result && result->get_n_rows()) || primary_key_is_empty) //either a working result or no result needed. { const Document* pDoc = dynamic_cast(get_document()); if(pDoc) { //Get glom-specific field info: //Document::type_vec_fields vecFields = pDoc->get_table_fields(m_table_name); const int row_number = 0; //The only row. int cols_count = 0; if(!primary_key_is_empty) cols_count = result->get_n_columns(); else cols_count = fieldsToGet.size(); //Get special possibly-non-visible field values: if(!primary_key_is_empty) { if(index_primary_key < cols_count) { m_primary_key_value = result->get_value_at(index_primary_key, row_number); set_found_set_from_primary_key_value(); } } //Get field values to show: for(int i = 0; i < cols_count; ++i) { sharedptr layout_item = fieldsToGet[i]; //Field value: Gnome::Gda::Value value; if(!primary_key_is_empty) value = result->get_value_at(i, row_number); else { value = Conversions::get_empty_value(layout_item->get_glom_type()); } m_FlowTable.set_field_value(layout_item, value); } } } else { bResult = false; //There were no records. } } } //if(!fieldsToGet.empty()) //fill_related(); set_unstored_data(false); } return bResult; } void Box_Data_Details::on_button_new() { if(!confirm_discard_unstored_data()) return; //Don't try to add a record to a list with no fields. if(m_FieldsShown.empty()) { //Warn the user that they won't see anything if there are no fields on the layout, //doing an extra check: Document* document = get_document(); if( document && !(document->get_data_layout_groups_have_any_fields(m_layout_name, m_table_name, m_layout_platform)) ) { Gtk::Window* parent_window = get_app_window(); if(parent_window) Utils::show_ok_dialog(_("Layout Contains No Fields"), _("There are no fields on the layout, so there is no way to enter data in a new record."), *parent_window, Gtk::MESSAGE_ERROR); } return; } if(m_field_primary_key && m_field_primary_key->get_auto_increment()) //If the primary key is an auto-increment: { //Just make a new record, and show it: const Gnome::Gda::Value primary_key_value = DbUtils::get_next_auto_increment_value(m_table_name, m_field_primary_key->get_name()); //TODO: This should return a Gda::Value record_new(false /* use entered field data */, primary_key_value); refresh_data_from_database_with_primary_key(primary_key_value); } else { //It's not an auto-increment primary key, //so just blank the fields ready for a primary key later. refresh_data_from_database_blank(); //shows blank record. } } void Box_Data_Details::on_button_del() { if( Conversions::value_is_empty(get_primary_key_value_selected()) ) { //Tell user that a primary key is needed to delete a record: Gtk::MessageDialog dialog(Utils::bold_message(_("No primary key value.")), true); dialog.set_secondary_text(_("This record cannot be deleted because there is no primary key.")); dialog.set_transient_for(*get_app_window()); dialog.run(); } else { if(confirm_delete_record()) { const bool bTest = record_delete(m_primary_key_value); if(bTest) { //Tell the list that it has been deleted: //It will go to the next (or last) record, signal_record_deleted().emit(m_primary_key_value); } } } } void Box_Data_Details::on_button_nav_first() { if(confirm_discard_unstored_data()) signal_nav_first().emit(); } void Box_Data_Details::on_button_nav_prev() { if(confirm_discard_unstored_data()) signal_nav_prev().emit(); } void Box_Data_Details::on_button_nav_next() { if(confirm_discard_unstored_data()) signal_nav_next().emit(); } void Box_Data_Details::on_button_nav_last() { if(confirm_discard_unstored_data()) signal_nav_last().emit(); } Gnome::Gda::Value Box_Data_Details::get_entered_field_data(const sharedptr& field) const { return m_FlowTable.get_field_value(field); } void Box_Data_Details::set_entered_field_data(const sharedptr& field, const Gnome::Gda::Value& value) { m_FlowTable.set_field_value(field, value); } void Box_Data_Details::set_entered_field_data(const Gtk::TreeModel::iterator& /* row */, const sharedptr& field, const Gnome::Gda::Value& value) { set_entered_field_data(field, value); } Gnome::Gda::Value Box_Data_Details::get_primary_key_value_selected() const { return m_primary_key_value; } void Box_Data_Details::recalculate_fields_for_related_records(const Glib::ustring& relationship_name) { m_FieldsCalculationInProgress.clear(); //Check all fields in the parent table: const Gnome::Gda::Value primary_key_value = get_primary_key_value_selected(); for(type_vec_fields::iterator iter = m_TableFields.begin(); iter != m_TableFields.end(); ++iter) { const sharedptr field = *iter; //Is this field triggered by this relationship? const Field::type_list_strings triggered_by = field->get_calculation_relationships(); Field::type_list_strings::const_iterator iterFind = std::find(triggered_by.begin(), triggered_by.end(), relationship_name); if(iterFind != triggered_by.end()) //If it was found { sharedptr field = *iter; if(field) { sharedptr layoutitem_field = sharedptr::create(); layoutitem_field->set_full_field_details(field); LayoutFieldInRecord field_in_record(layoutitem_field, m_table_name, m_field_primary_key, primary_key_value); calculate_field(field_in_record); //And any dependencies. //Calculate anything that depends on this. //sharedptr layout_item = sharedptr::create(); //layout_item->set_full_field_details(field); do_calculations(field_in_record, false /* recurse, reusing m_FieldsCalculationInProgress */); } } } m_FieldsCalculationInProgress.clear(); } void Box_Data_Details::on_related_record_added(Gnome::Gda::Value /* strKeyValue */, Glib::ustring /* strFromKeyName */) { //Prevent deletion of Related boxes. //One of them emitted this signal, and is probably still being edited. //This prevents a crash. bool bDoNotRefreshRelated = m_bDoNotRefreshRelated; m_bDoNotRefreshRelated = true; //std::cout << "debug: " << G_STRFUNC << ": " << strKeyValue << ", " << strFromKeyName << std::endl; //Get current FromKey value: /* TODO_port guint iKey = 0; bool bTest = get_field_index(strFromKeyName, iKey); Glib::ustring strFromKeyValue = get_entered_field_data(iKey).get_data(); if(strFromKeyValue.size() == 0) { //Set the From key value, to link the new related record (the first one so far) with the parent record. m_AddDel.set_value(iKey, m_ColumnValue, strKeyValue); on_adddel_user_changed(iKey, m_ColumnValue); //Update the database. } */ //Restore value: m_bDoNotRefreshRelated = bDoNotRefreshRelated; } Box_Data_Details::type_signal_void Box_Data_Details::signal_nav_first() { return m_signal_nav_first; } Box_Data_Details::type_signal_void Box_Data_Details::signal_nav_prev() { return m_signal_nav_prev; } Box_Data_Details::type_signal_void Box_Data_Details::signal_nav_next() { return m_signal_nav_next; } Box_Data_Details::type_signal_void Box_Data_Details::signal_nav_last() { return m_signal_nav_last; } Box_Data_Details::type_signal_record_deleted Box_Data_Details::signal_record_deleted() { return m_signal_record_deleted; } Box_Data_Details::type_signal_requested_related_details Box_Data_Details::signal_requested_related_details() { return m_signal_requested_related_details; } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Data_Details::on_flowtable_layout_changed() { //Get new layout: #if 0 Document::type_list_layout_groups layout_groups; m_FlowTable.get_layout_groups(layout_groups); //Store it in the document: Document* document = get_document(); if(document) document->set_data_layout_groups(m_layout_name, m_table_name, m_layout_platform, layout_groups); //Build the view again from the new layout: #endif create_layout(); //Store it in the document: Document* document = get_document(); if(document) document->set_modified(); //And fill it with data: fill_from_database(); } #endif // !GLOM_ENABLE_CLIENT_ONLY void Box_Data_Details::on_flowtable_requested_related_details(const Glib::ustring& table_name, Gnome::Gda::Value primary_key_value) { if(Conversions::value_is_empty(primary_key_value)) return; //Ignore empty ID fields. signal_requested_related_details().emit(table_name, primary_key_value); } void Box_Data_Details::on_flowtable_related_record_changed(const Glib::ustring& relationship_name) { recalculate_fields_for_related_records(relationship_name); } void Box_Data_Details::on_flowtable_field_open_details_requested(const sharedptr& layout_field, const Gnome::Gda::Value& field_value) { if(Conversions::value_is_empty(field_value)) return; //Ignore empty ID fields. //Updating doesn't seem necessary. The field details seem to be full already. //Update the field details from the document: ////sharedptr unconst_field = sharedptr::cast_const(layout_field); //A hack, because layout_field_should_have_navigation() needs to get full field details. //unconst_field->set_full_field_details( // document->get_field(field->get_table_used(table_name), field->get_name()) ); //Otherwise get_primary_key() returns false always. sharedptr field_used_in_relationship_to_one; const bool has_open_button = DbUtils::layout_field_should_have_navigation(m_table_name, layout_field, get_document(), field_used_in_relationship_to_one); //If it's a simple field that is part of a relationship, //identifying a related record. if(field_used_in_relationship_to_one) { signal_requested_related_details().emit(field_used_in_relationship_to_one->get_to_table(), field_value); return; } //If it is a related field that is a primary key, //meaning it identifies a record in another table: if(has_open_button) { signal_requested_related_details().emit(layout_field->get_table_used(m_table_name), field_value); } } void Box_Data_Details::on_flowtable_script_button_clicked(const sharedptr& layout_item) { if(!layout_item) { std::cerr << G_STRFUNC << ": layout_item is null" << std::endl; return; } const Gnome::Gda::Value primary_key_value = get_primary_key_value_selected(); const Glib::ustring table_name_before = m_table_name; execute_button_script(layout_item, primary_key_value); //Refresh the view, in case the script changed any data, //but not if the script navigated away: if(m_table_name != table_name_before) return; //(m_primary_key_value seems to be NULL here. We can use primary_key_value instead, but it's a bit strange. murrayc.) if(get_primary_key_is_in_foundset(m_found_set, primary_key_value)) //Check, because maybe the script deleted the current record, or changed something so that it should no longer be shown in the found set. { refresh_data_from_database_with_primary_key(primary_key_value); } else { //Tell the parent to do something appropriate, such as show another record: signal_record_deleted().emit(primary_key_value); } } void Box_Data_Details::on_flowtable_field_edited(const sharedptr& layout_field, const Gnome::Gda::Value& field_value) { if(m_ignore_signals) return; const Glib::ustring strFieldName = layout_field->get_name(); Gtk::Window* window = get_app_window(); Document* document = dynamic_cast(get_document()); Gnome::Gda::Value primary_key_value = get_primary_key_value_selected(); //std::cout << "debug: " << G_STRFUNC << ": primary_key_value=" << primary_key_value.to_string() << std::endl; if(!Conversions::value_is_empty(primary_key_value)) //If there is not a stored primary key value yet: { Glib::ustring table_name; sharedptr primary_key_field; Gnome::Gda::Value primary_key_value; if(!layout_field->get_has_relationship_name()) { table_name = get_table_name(); primary_key_field = m_field_primary_key; primary_key_value = get_primary_key_value_selected(); } else { //If it's a related field then discover the actual table that it's in, //plus how to identify the record in that table. const Glib::ustring relationship_name = layout_field->get_relationship_name(); sharedptr relationship = document->get_relationship(get_table_name(), relationship_name); if(relationship) { table_name = relationship->get_to_table(); const Glib::ustring to_field_name = relationship->get_to_field(); //Get the key field in the other table (the table that we will change) primary_key_field = DbUtils::get_fields_for_table_one_field(document, table_name, to_field_name); //TODO_Performance. if(primary_key_field) { //Get the value of the corresponding key in the current table (that identifies the record in the table that we will change) sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details( document->get_field(relationship->get_from_table(), relationship->get_from_field()) ); primary_key_value = get_entered_field_data(layout_item); //Note: This just uses an existing record if one already exists: Gnome::Gda::Value primary_key_value_used; const bool test = add_related_record_for_field(layout_field, relationship, primary_key_field, primary_key_value, primary_key_value_used); if(!test) return; //Get the new primary_key_value if it has been created: primary_key_value = primary_key_value_used; //Now that the related record exists, the following code to set the value of the other field in the related field can succeed. } else { std::cerr << G_STRFUNC << ": key not found for edited related field." << std::endl; } } } LayoutFieldInRecord field_in_record(layout_field, m_table_name /* parent table */, primary_key_field, primary_key_value); //Check whether the value meets uniqueness constraints: if(!check_entered_value_for_uniqueness(m_table_name, layout_field, field_value, window)) { //Revert to the value in the database: const Gnome::Gda::Value value_old = get_field_value_in_database(field_in_record, window); set_entered_field_data(layout_field, value_old); return; } //Set the value in all instances of this field in the layout (The field might be on the layout more than once): //We don't need to set the value in the layout_field itself, as this is where the value comes from. m_FlowTable.set_other_field_value(layout_field, field_value); //Update the field in the record (the record with this primary key): bool bTest = false; try { bTest = set_field_value_in_database(field_in_record, field_value, false /* don't use current calculations */, get_app_window()); } catch(const Glib::Exception& ex) { handle_error(ex); } catch(const std::exception& ex) { handle_error(ex); } try { if(!bTest) { //Update failed. //Replace with correct values. const Gnome::Gda::Value value_old = get_field_value_in_database(field_in_record, window); set_entered_field_data(layout_field, value_old); } else { //TODO: Display new values for related fields. //If this is a foreign key then refresh the related records: /* bool bIsForeignKey = false; Document::type_vec_relationships vecRelationships = get_document()->get_relationships(m_table_name); for(Document::type_vec_relationships::iterator iter = vecRelationships.begin(); iter != vecRelationships.end(); ++iter) { const Relationship& relationship = *iter; if(relationship->get_from_field() == strFieldName) { bIsForeignKey = true; break; } } if(bIsForeignKey) fill_related(); */ } } catch(const Glib::Exception& ex) { handle_error(ex); } catch(const std::exception& ex) { handle_error(ex); } } else { //There is no current stored primary key value yet: if(m_field_primary_key && m_field_primary_key->get_auto_increment()) //If the primary key is an auto-increment: { if(strFieldName == m_field_primary_key->get_name()) //If edited field is the primary key. { //Warn user that they can't choose their own primary key: Gtk::MessageDialog dialog(Utils::bold_message(_("Primary key auto increments")), true); dialog.set_secondary_text(_("The primary key is auto-incremented.\n You may not enter your own primary key value.")); dialog.set_transient_for(*get_app_window()); dialog.run(); } else { //Make a new record, and show it: const Gnome::Gda::Value primary_key_value = DbUtils::get_next_auto_increment_value(m_table_name, m_field_primary_key->get_name()); record_new(true /* use entered field data */, primary_key_value); refresh_data_from_database_with_primary_key(primary_key_value); } } else { //It is not auto-generated: if(m_field_primary_key && strFieldName == m_field_primary_key->get_name()) //if it is the primary key that is being edited. { if(!check_entered_value_for_uniqueness(m_table_name, layout_field, field_value, window)) { //Revert to a blank value: const Gnome::Gda::Value value_old = Conversions::get_empty_value(layout_field->get_full_field_details()->get_glom_type()); set_entered_field_data(layout_field, value_old); } else { //Create new record with this primary key, //and all the other field values too. //see comments after 'else': record_new(true /* use entered field data */); } } else { //The record does not exist yet. //The values in the other fields will have to wait //until the primary key is set by the user. set_unstored_data(true); //Cause a warning if this is never put into the database. } } } //if(get_primary_key_value_selected().size()) } void Box_Data_Details::on_flowtable_field_choices_changed(const sharedptr& layout_field) { if(m_ignore_signals) return; m_FlowTable.update_choices(layout_field); } void Box_Data_Details::on_userlevel_changed(AppState::userlevels user_level) { #ifndef GLOM_ENABLE_CLIENT_ONLY m_design_mode = ( user_level == AppState::USERLEVEL_DEVELOPER ); m_FlowTable.set_design_mode(m_design_mode); // Recreate the layout to correctly set the size of empty flowtables: init_db_details(m_found_set, m_layout_platform, m_primary_key_value); #endif } sharedptr Box_Data_Details::get_field_primary_key() const { return m_field_primary_key; } void Box_Data_Details::print_layout() { const Privileges table_privs = Privs::get_current_privs(m_table_name); //Don't try to print tables that the user can't view. if(!table_privs.m_view) return; //TODO: Warn the user. const Document* document = dynamic_cast(get_document()); if(!document) { std::cerr << G_STRFUNC << ": document was null" << std::endl; return; } Glib::RefPtr page_setup = Gtk::PageSetup::create(); //TODO: m_canvas.get_page_setup(); if(!page_setup) { std::cerr << G_STRFUNC << ": page_setup was null" << std::endl; return; } //Note that we initially create the page layout without spaces for page //breaks because those spaces would be empty space on the page after //we have moved items down when expanding: //TODO: Squash that space when expanding custom layouts. sharedptr print_layout = PrintLayoutUtils::create_standard(page_setup, m_table_name, document, false /* do not avoid page margins */); //Show the print preview window: AppWindow* app = AppWindow::get_appwindow(); PrintLayoutUtils::do_print_layout(print_layout, m_found_set, false /* not preview */, document, true /* avoid page margins */, app); } #ifndef GLOM_ENABLE_CLIENT_ONLY Dialog_Layout* Box_Data_Details::create_layout_dialog() const { Dialog_Layout_Details* dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(dialog); return dialog; } void Box_Data_Details::prepare_layout_dialog(Dialog_Layout* dialog) { if(dialog) dialog->init(m_layout_name, m_layout_platform, get_document(), m_table_name, m_FieldsShown); //TODO: Use m_TableFields? } void Box_Data_Details::show_layout_toolbar(bool show) { if(show) m_Dragbar.show(); else m_Dragbar.hide(); } #endif // !GLOM_ENABLE_CLIENT_ONLY void Box_Data_Details::do_new_record() { on_button_new(); } void Box_Data_Details::set_enable_drag_and_drop(bool enabled) { m_FlowTable.set_enable_drag_and_drop(enabled); } } //namespace Glom glom-1.22.4/glom/mode_data/buttonglom.cc0000644000175000017500000000540512234776363021361 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "buttonglom.h" #include #include #include #include #ifndef GLOM_ENABLE_CLIENT_ONLY #include #endif #include //#include //For stringstream namespace Glom { ButtonGlom::ButtonGlom(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::Button(cobject) { init(); } ButtonGlom::ButtonGlom() { init(); } ButtonGlom::~ButtonGlom() { } void ButtonGlom::init() { } AppWindow* ButtonGlom::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } #ifndef GLOM_ENABLE_CLIENT_ONLY void ButtonGlom::on_menu_properties_activate() { Dialog_ButtonScript* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); dialog->set_script(layout_item, m_table_name); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { dialog->get_script(layout_item); signal_layout_changed().emit(); } delete dialog; } bool ButtonGlom::on_button_press_event(GdkEventButton *event) { AppWindow* pApp = get_appwindow(); if(pApp && pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pPopupMenuUtils->popup(event->button, event->time); return true; //We handled this event. } } return Gtk::Button::on_button_press_event(event); } #endif } //namespace Glom glom-1.22.4/glom/mode_data/box_data.cc0000644000175000017500000002774312234776363020761 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include "box_data.h" #include #include #include #include #include #include #include #include #include #include //For std::find() #include #include #include namespace Glom { Box_Data::Box_Data() : m_Button_Find(Gtk::Stock::FIND) #ifndef GLOM_ENABLE_CLIENT_ONLY ,m_pDialogLayout(0) #endif // !GLOM_ENABLE_CLIENT_ONLY { m_bUnstoredData = false; //Connect signals: m_Button_Find.signal_clicked().connect(sigc::mem_fun(*this, &Box_Data::on_Button_Find)); } Box_Data::~Box_Data() { #ifndef GLOM_ENABLE_CLIENT_ONLY if(m_pDialogLayout) { remove_view(m_pDialogLayout); delete m_pDialogLayout; } #endif // !GLOM_ENABLE_CLIENT_ONLY } bool Box_Data::init_db_details(const FoundSet& found_set, const Glib::ustring& layout_platform) { m_layout_platform = layout_platform; m_table_name = found_set.m_table_name; m_found_set = found_set; create_layout(); //So that fill_from_database() can succeed. return Base_DB_Table_Data::init_db_details(m_table_name); //Calls fill_from_database(). } bool Box_Data::refresh_data_from_database_with_where_clause(const FoundSet& found_set) { m_found_set = found_set; return Base_DB_Table_Data::refresh_data_from_database(); //Calls fill_from_database(). } FoundSet Box_Data::get_found_set() const { return m_found_set; } Gnome::Gda::SqlExpr Box_Data::get_find_where_clause() const { Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_target(m_table_name); //This might not be necessary. guint where_cond_id = 0; Glib::RefPtr connection = get_connection(); if(!connection) { std::cerr << G_STRFUNC << ": connection was null." << std::endl; return Gnome::Gda::SqlExpr(); } //Look at each field entry and build e.g. 'Name = "Bob"' for(type_vecConstLayoutFields::const_iterator iter = m_FieldsShown.begin(); iter != m_FieldsShown.end(); ++iter) { const Gnome::Gda::Value data = get_entered_field_data(*iter); if(!Conversions::value_is_empty(data)) { const sharedptr field = (*iter)->get_full_field_details(); if(field) { bool use_this_field = true; if(field->get_glom_type() == Field::TYPE_BOOLEAN) //TODO: We need an intermediate state for boolean fields, so that they can be ignored in searches. { if(!data.get_boolean()) use_this_field = false; } if(use_this_field) { const guint cond_id = builder->add_cond(field->sql_find_operator(), builder->add_field_id(field->get_name(), m_table_name), builder->add_expr( field->sql_find(data, connection) )); //And with previous condition, if any: if(where_cond_id) { where_cond_id = builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_AND, where_cond_id, cond_id); } else where_cond_id = cond_id; } } } } if(where_cond_id) { builder->set_where(where_cond_id); //This might not be necessary. return builder->export_expression(where_cond_id); } else return Gnome::Gda::SqlExpr(); } void Box_Data::on_Button_Find() { //Make sure that the cell is updated: //m_AddDel.finish_editing(); //Call the virtual method to get the find criteria for a details or list view: const Gnome::Gda::SqlExpr where_clause = get_find_where_clause(); //The signal handler then checks and warns if no find criteria were entered. signal_find_criteria.emit(where_clause); } void Box_Data::set_unstored_data(bool bVal) { m_bUnstoredData = bVal; } bool Box_Data::get_unstored_data() const { return m_bUnstoredData; } void Box_Data::create_layout() { set_unstored_data(false); //Cache the table information, for performance: const Document* document = dynamic_cast(get_document()); m_TableFields = DbUtils::get_fields_for_table(document, m_table_name); } bool Box_Data::fill_from_database() { set_unstored_data(false); return Base_DB_Table_Data::fill_from_database(); } bool Box_Data::confirm_discard_unstored_data() const { if(get_unstored_data()) { const Glib::ustring message = _("This data cannot be stored in the database because you have not provided a primary key.\nDo you really want to discard this data?"); //Ask user to confirm loss of data: Gtk::MessageDialog dialog(Utils::bold_message(_("No primary key value")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL ); dialog.set_secondary_text(message); //TODO: It needs a const. I wonder if it should. murrayc. dialog.set_transient_for(*get_app_window()); const int iButton = dialog.run(); return (iButton == Gtk::RESPONSE_OK); } else { return true; //no data to lose. } } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Data::show_layout_dialog() { if(!m_pDialogLayout) { m_pDialogLayout = create_layout_dialog(); add_view(m_pDialogLayout); //Give it access to the document. m_pDialogLayout->signal_hide().connect( sigc::mem_fun(*this, &Box_Data::on_dialog_layout_hide) ); } prepare_layout_dialog(m_pDialogLayout); m_pDialogLayout->show(); } #endif // !GLOM_ENABLE_CLIENT_ONLY #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Data::on_dialog_layout_hide() { //Re-fill view, in case the layout has changed: create_layout(); if(ConnectionPool::get_instance()->get_ready_to_connect()) fill_from_database(); } #endif // !GLOM_ENABLE_CLIENT_ONLY Box_Data::type_vecConstLayoutFields Box_Data::get_fields_to_show() const { if(m_table_name.empty()) { return type_vecConstLayoutFields(); } else return get_table_fields_to_show(m_table_name); } Box_Data::type_vecConstLayoutFields Box_Data::get_table_fields_to_show(const Glib::ustring& table_name) const { const Document* pDoc = dynamic_cast(get_document()); if(pDoc) { Document::type_list_layout_groups mapGroupSequence = pDoc->get_data_layout_groups_plus_new_fields(m_layout_name, table_name, m_layout_platform); return get_table_fields_to_show_for_sequence(table_name, mapGroupSequence); } else return type_vecConstLayoutFields(); } Document::type_list_layout_groups Box_Data::get_data_layout_groups(const Glib::ustring& layout_name, const Glib::ustring& layout_platform) { Document::type_list_layout_groups layout_groups; Document* document = dynamic_cast(get_document()); if(document) { if(!m_table_name.empty()) { //Get the layout information from the document: layout_groups = document->get_data_layout_groups_plus_new_fields(layout_name, m_table_name, layout_platform); document->fill_layout_field_details(m_table_name, layout_groups); //TODO: Do this automatically in Document? const Privileges table_privs = Privs::get_current_privs(m_table_name); //Fill in the field information for the fields mentioned in the layout: for(Document::type_list_layout_groups::iterator iterGroups = layout_groups.begin(); iterGroups != layout_groups.end(); ++iterGroups) { fill_layout_group_field_info(*iterGroups, table_privs); //std::cout << "debug: Box_Data::get_data_layout_groups: " << std::endl; //*iterGroups->debug(); } } } return layout_groups; } void Box_Data::fill_layout_group_field_info(const sharedptr& group, const Privileges& table_privs) { if(!group) return; const Document* document = get_document(); LayoutGroup::type_list_items items = group->get_items(); for(LayoutGroup::type_list_items::iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr item = *iter; sharedptr item_field = sharedptr::cast_dynamic(item); if(item_field) //If is a field rather than some other layout item { if(item_field->get_has_relationship_name()) //If it's a field in a related table. { //Get the full field information: const Glib::ustring relationship_name = item_field->get_relationship_name(); sharedptr relationship = document->get_relationship(m_table_name, relationship_name); if(relationship) { sharedptr field = DbUtils::get_fields_for_table_one_field(document, relationship->get_to_table(), item->get_name()); if(field) { item_field->set_full_field_details(field); //TODO_Performance: Don't do this repeatedly for the same table. const Privileges privs = Privs::get_current_privs(relationship->get_to_table()); item_field->m_priv_view = privs.m_view; item_field->m_priv_edit = privs.m_edit; } } } else { //Get the field info: sharedptr field = DbUtils::get_fields_for_table_one_field(document, m_table_name, item_field->get_name()); if(field) { item_field->set_full_field_details(field); //TODO_Performance: Just use this as the output arg? item_field->m_priv_view = table_privs.m_view; item_field->m_priv_edit = table_privs.m_edit; } } } else { sharedptr item_group = sharedptr::cast_dynamic(item); if(item_group) //If it is a group { //recurse, to fill the fields info in this group: fill_layout_group_field_info(item_group, table_privs); } } } } void Box_Data::print_layout() { const Glib::ustring message = "Sorry, this feature has not been implemented yet."; Gtk::MessageDialog dialog("Not implemented", true); dialog.set_secondary_text(message); dialog.set_transient_for(*get_app_window()); dialog.run(); } Glib::ustring Box_Data::get_layout_name() const { return m_layout_name; } void Box_Data::execute_button_script(const sharedptr& layout_item, const Gnome::Gda::Value& primary_key_value) { const Glib::ustring script = layout_item->get_script(); if(!Utils::script_check_for_pygtk2_with_warning(script, get_app_window())) return; const sharedptr field_primary_key = get_field_primary_key(); const type_map_fields field_values = get_record_field_values_for_calculation(m_table_name, field_primary_key, primary_key_value); //We need the connection when we run the script, so that the script may use it. sharedptr sharedconnection = connect_to_server(0 /* parent window */); //Allow this UI to respond to UI change requests from the Python code: AppPythonUICallbacks callbacks; Glib::ustring error_message; glom_execute_python_function_implementation(script, field_values, //TODO: Maybe use the field's type here. get_document(), get_table_name(), field_primary_key, primary_key_value, sharedconnection->get_gda_connection(), callbacks, error_message); if(!error_message.empty()) { std::cerr << "Python Error: " << error_message << std::endl; } } } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/0000755000175000017500000000000012235000126020743 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_data/datawidget/combo_as_radio_buttons.h0000644000175000017500000000615112234252646025654 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_COMBO_AS_RADIO_BUTTONS_H #define GLOM_UTILITY_WIDGETS_COMBO_AS_RADIO_BUTTONS_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include #include namespace Glom { class AppWindow; namespace DataWidgetChildren { /** A set of radio buttons, with an API similar to a ComboBox with restricted values. * Use this only when the user should only be allowed to enter values that are in the choices. */ class ComboAsRadioButtons : public Gtk::Box, public ComboChoices { public: ///You must call set_layout_item() to specify the field type and formatting of the main column. ComboAsRadioButtons(); virtual ~ComboAsRadioButtons(); virtual void set_choices_fixed(const Formatting::type_list_values& list_values, bool restricted = false); virtual void set_choices_related(const Document* document, const sharedptr& layout_field, const Gnome::Gda::Value& foreign_key_value); virtual void set_read_only(bool read_only = true); //Override this so we can store the text to compare later. //This is not virtual, so you must not use it via Gtk::Entry. void set_text(const Glib::ustring& text); //override Glib::ustring get_text() const; /** Set the text from a Gnome::Gda::Value. */ virtual void set_value(const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_value() const; private: void init(); typedef std::vector type_list_values; typedef std::vector< std::pair > type_list_values_with_second; //A utility function that's needed because we don't use a real db model: void set_choices_with_second(const type_list_values_with_second& list_values); void on_radiobutton_toggled(); void check_for_change(); #ifndef GLOM_ENABLE_CLIENT_ONLY virtual bool on_button_press_event(GdkEventButton *event); virtual bool on_radiobutton_button_press_event(GdkEventButton *event); void show_context_menu(GdkEventButton *event); #endif // !GLOM_ENABLE_CLIENT_ONLY virtual AppWindow* get_appwindow() const; Glib::ustring m_old_text; typedef std::map type_map_buttons; type_map_buttons m_map_buttons; }; } //namespace DataWidetChildren } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_COMBOENTRY_GLOM_H glom-1.22.4/glom/mode_data/datawidget/entry.cc0000644000175000017500000001521212234776363022442 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "entry.h" #include #include #include #include #include #include //#include //For stringstream #include // for locale, time_put #include // for struct tm #include // for cout, endl namespace Glom { namespace DataWidgetChildren { Entry::Entry(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::Entry(cobject), m_glom_type(Field::TYPE_TEXT) { #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // !GLOM_ENABLE_CLIENT_ONLY init(); } Entry::Entry(Field::glom_field_type glom_type) : m_glom_type(glom_type) { #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // !GLOM_ENABLE_CLIENT_ONLY init(); } Entry::~Entry() { } void Entry::init() { } void Entry::set_layout_item(const sharedptr& layout_item, const Glib::ustring& table_name) { LayoutWidgetField::set_layout_item(layout_item, table_name); #ifdef GTKMM_ATKMM_ENABLED get_accessible()->set_name(layout_item->get_name()); #endif //Horizontal Alignment: Formatting::HorizontalAlignment alignment = Formatting::HORIZONTAL_ALIGNMENT_LEFT; sharedptr layout_field = sharedptr::cast_dynamic(get_layout_item()); if(layout_field) alignment = layout_field->get_formatting_used_horizontal_alignment(true /* for details view */); const float x_align = (alignment == Formatting::HORIZONTAL_ALIGNMENT_LEFT ? 0.0 : 1.0); set_alignment(x_align); } void Entry::set_glom_type(Field::glom_field_type glom_type) { m_glom_type = glom_type; } void Entry::check_for_change() { Glib::ustring new_text = get_text(); if(new_text != m_old_text) { //Validate the input: bool success = false; sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); Gnome::Gda::Value value = Conversions::parse_value(m_glom_type, get_text(), layout_item->get_formatting_used().m_numeric_format, success); if(success) { //Actually show the canonical text: set_value(value); m_signal_edited.emit(); //The text was edited, so tell the client code. } else { //Tell the user and offer to revert or try again: bool revert = glom_show_dialog_invalid_data(m_glom_type); if(revert) { set_text(m_old_text); } else grab_focus(); //Force the user back into the same field, so that the field can be checked again and eventually corrected or reverted. } } } bool Entry::on_focus_out_event(GdkEventFocus* event) { const bool result = Gtk::Entry::on_focus_out_event(event); //The user has finished editing. check_for_change(); //Call base class: return result; } void Entry::on_activate() { //Call base class: Gtk::Entry::on_activate(); //The user has finished editing. check_for_change(); } void Entry::on_changed() { //The text is being edited, but the user has not finished yet. //Call base class: Gtk::Entry::on_changed(); } void Entry::set_value(const Gnome::Gda::Value& value) { sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); if(!layout_item) return; const Glib::ustring text = Conversions::get_text_for_gda_value(m_glom_type, value, layout_item->get_formatting_used().m_numeric_format); set_text(text); //Show a different color if the value is numeric, if that's specified: if(layout_item->get_glom_type() == Field::TYPE_NUMERIC) { const Glib::ustring fg_color = layout_item->get_formatting_used().get_text_format_color_foreground_to_use(value); if(!fg_color.empty()) override_color(Gdk::RGBA(fg_color)); else unset_color(); } } void Entry::set_text(const Glib::ustring& text) { m_old_text = text; //Call base class: Gtk::Entry::set_text(text); } Gnome::Gda::Value Entry::get_value() const { bool success = false; sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); return Conversions::parse_value(m_glom_type, get_text(), layout_item->get_formatting_used().m_numeric_format, success); } #ifndef GLOM_ENABLE_CLIENT_ONLY bool Entry::on_button_press_event(GdkEventButton *event) { //Enable/Disable items. //We did this earlier, but get_appwindow is more likely to work now: AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->add_developer_action(m_refContextAddField); pApp->add_developer_action(m_refContextAddRelatedRecords); pApp->add_developer_action(m_refContextAddGroup); pApp->update_userlevel_ui(); //Update our action's sensitivity. //Only show this popup in developer mode, so operators still see the default GtkEntry context menu. //TODO: It would be better to add it somehow to the standard context menu. if(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); return true; //We handled this event. } } } return Gtk::Entry::on_button_press_event(event); } #endif // !GLOM_ENABLE_CLIENT_ONLY AppWindow* Entry::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } void Entry::set_read_only(bool read_only) { set_editable(!read_only); } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/treemodel_db_withextratext.cc0000644000175000017500000001151412234252646026724 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include "treemodel_db_withextratext.h" #include #include //For util_build_sql #include #include #include "glom/appwindow.h" namespace Glom { typedef Glib::Value type_value_string; DbTreeModelWithExtraText::DbTreeModelWithExtraText(const FoundSet& found_set, const type_vec_const_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown) : Glib::ObjectBase( typeid(DbTreeModel) ), //register a custom GType. DbTreeModel(found_set, layout_items, get_records, find_mode, fields_shown), m_column_index_first(-1) { //Remember the first field details so we can use it later to get a text representation. int column_index = 0; for(type_vec_const_layout_items::const_iterator iter = layout_items.begin(); iter != layout_items.end(); ++iter) { const sharedptr item_field = sharedptr::cast_dynamic(*iter); if(item_field) { m_item_first = item_field; break; } ++column_index; } if(m_item_first) { m_column_index_first = column_index; } else { std::cerr << G_STRFUNC << ": The first field was found in the list." << std::endl; } } DbTreeModelWithExtraText::~DbTreeModelWithExtraText() { clear(); } Glib::RefPtr DbTreeModelWithExtraText::create(const FoundSet& found_set, const type_vec_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown) { //Create a const version of the input, because C++ can't convert it automatically: type_vec_const_layout_items const_items; const_items.insert(const_items.end(), layout_items.begin(), layout_items.end()); return create(found_set, const_items, get_records, find_mode, fields_shown); } Glib::RefPtr DbTreeModelWithExtraText::create(const FoundSet& found_set, const type_vec_const_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown) { return Glib::RefPtr( new DbTreeModelWithExtraText(found_set, layout_items, get_records, find_mode, fields_shown) ); } int DbTreeModelWithExtraText::get_n_columns_vfunc() const { return DbTreeModel::get_n_columns_vfunc() + 1; } GType DbTreeModelWithExtraText::get_column_type_vfunc(int index) const { if(index == get_text_column()) return type_value_string::value_type(); else return DbTreeModel::get_column_type_vfunc(index); } void DbTreeModelWithExtraText::get_value_vfunc(const TreeModel::iterator& iter, int column, Glib::ValueBase& value) const { //std::cout << G_STRFUNC << ": Debug: column=" << column << std::endl; if(column == get_text_column()) { Glib::ustring text; if(m_column_index_first == -1) { std::cerr << G_STRFUNC << ": m_column_index_first is not set." << std::endl; //TODO: This then causes a crash later. Find out why. } else { Glib::Value value_db; get_value_vfunc(iter, m_column_index_first, value_db); const DbValue dbvalue = value_db.get(); text = Conversions::get_text_for_gda_value(m_item_first->get_glom_type(), dbvalue, m_item_first->get_formatting_used().m_numeric_format); //std::cout << "debug: text=" << text << std::endl; //std::cout << " debug: m_item_key name=" << m_item_key->get_name() << std::endl; //std::cout << " debug: dbvalue=" << dbvalue.to_string() << std::endl; } type_value_string value_specific; value_specific.init( type_value_string::value_type() ); //TODO: Is there any way to avoid this step? value_specific.set(text); value.init( type_value_string::value_type() ); //TODO: Is there any way to avoid this step? value = value_specific; } else { DbTreeModel::get_value_vfunc(iter, column, value); } } int DbTreeModelWithExtraText::get_text_column() const { return get_n_columns_vfunc() - 1; } } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/treemodel_db.h0000644000175000017500000002126412234776363023574 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_DB_TREEMODEL_H #define GLOM_UTILITY_WIDGETS_DB_TREEMODEL_H #include #include #include #include #include namespace Glom { class DbTreeModel; class DbTreeModelRow { public: DbTreeModelRow(); typedef Gnome::Gda::Value DbValue; //Field Values. We store them here after reading them from the database, //so that we can change them without changing them in the database immediately. //This is a duplication of data but at least we are still only getting the _rows_ that will be displayed. //TODO_Performance? typedef std::map type_vec_values; type_vec_values m_db_values; ///Gets the values from the database if necessary. DbValue get_value(DbTreeModel& model, int column, int row); void set_value(DbTreeModel& model, int column, int row, const DbValue& value); void fill_values_if_necessary(DbTreeModel& model, int row); bool m_values_retrieved; //Whether the values have been read from the datamodel. //int m_data_model_row_number; //The row in the data model from which the values were read. DbValue m_key; bool m_removed; //If it should not be shown anymore. bool m_extra; //A temporary new row. }; class DbTreeModel : public Glib::Object, public Gtk::TreeModel { public: //typedef unsigned int size_type; typedef Base_DB::type_vecConstLayoutFields type_vec_const_fields; friend class DbTreeModelRow; public: typedef std::vector< sharedptr > type_vec_layout_items; typedef std::vector< sharedptr > type_vec_const_layout_items; protected: /** * @param found_set This specifies the table and where clause for the data to show in the treemodel. * @param layout_items The items to show in the treemodel. This should include the primary key for the table at least once. * @param get_records * @param find_mode * @param fields_shown This will be filled with a list of the LayoutItem_Fields that will be shown in the treemodel. */ DbTreeModel(const FoundSet& found_set, const type_vec_const_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown); virtual ~DbTreeModel(); public: /** A convenience method, creating the model from a list of LayoutItems, * instead of a list of LayoutItem_Fields. * * @param found_set This specifies the table and where clause for the data to show in the treemodel. * @param layout_items The items to show in the treemodel. This should include the primary key for the table at least once. * @param get_records * @param find_mode * @param fields_shown This will be filled with a list of the LayoutItem_Fields that will be shown in the treemodel. */ static Glib::RefPtr create(const FoundSet& found_set, const type_vec_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown); /** A convenience method, creating the model from a list of LayoutItems, * instead of a list of LayoutItem_Fields. * Any LayoutItem_Fields should already have their full field details. */ static Glib::RefPtr create(const FoundSet& found_set, const type_vec_const_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown); typedef DbTreeModelRow::DbValue DbValue; void set_is_not_placeholder(const TreeModel::iterator& iter); bool get_is_placeholder(const TreeModel::iterator& iter) const; /** Set the value of the primary key for the specified row. */ void set_key_value(const TreeModel::iterator& iter, const DbValue& value); /** Get the value of the primary key for the specified row. */ DbValue get_key_value(const TreeModel::iterator& iter) const; /** Get the last row. * This will never return the placeholder row. */ TreeModel::iterator get_last_row(); /** Get the placeholder row. */ TreeModel::iterator get_placeholder_row(); /** Removes the given row from the list store. * @param iter The iterator to the row to be removed. * @result An iterator to the next row, or end() if there is none. */ iterator erase(const iterator& iter); void clear(); /** Creates a new row at the end. * The row will be empty - to fill in values, you need to dereference the returned iterator and use Row::operator[] or Row::set_value(). * * @result An iterator to the new row. */ iterator append(); void get_record_counts(gulong& total, gulong& found) const; private: bool refresh_from_database(const FoundSet& found_set); protected: // Overrides: virtual Gtk::TreeModelFlags get_flags_vfunc() const; virtual int get_n_columns_vfunc() const; virtual GType get_column_type_vfunc(int index) const; virtual void get_value_vfunc(const TreeModel::iterator& iter, int column, Glib::ValueBase& value) const; bool iter_next_vfunc(const iterator& iter, iterator& iter_next) const; //TODO: Make sure that we make all of these const when we have made them all const in the TreeModel: virtual bool iter_children_vfunc(const iterator& parent, iterator& iter) const; virtual bool iter_has_child_vfunc(const iterator& iter) const; virtual int iter_n_children_vfunc(const iterator& iter) const; virtual int iter_n_root_children_vfunc() const; virtual bool iter_nth_child_vfunc(const iterator& parent, int n, iterator& iter) const; virtual bool iter_nth_root_child_vfunc(int n, iterator& iter) const; virtual bool iter_parent_vfunc(const iterator& child, iterator& iter) const; virtual Path get_path_vfunc(const iterator& iter) const; virtual bool get_iter_vfunc(const Path& path, iterator& iter) const; private: bool iter_is_valid(const iterator& iter) const; virtual void set_value_impl(const iterator& row, int column, const Glib::ValueBase& value); typedef DbTreeModelRow typeRow; //X columns, all of type Value. //We use a std::list instead of a std::vector, though it is slower to access via an index, //because std::list iterators are not all invalidated when we erase an element from the middle. //typedef std::list< typeRow > typeListOfRows; //Y rows. typedef unsigned int type_datamodel_row_index; bool create_iterator(const type_datamodel_row_index& row_iter, DbTreeModel::iterator& iter) const; void invalidate_iter(iterator& iter) const; bool row_was_removed(const type_datamodel_row_index& row_iter) const; type_datamodel_row_index get_datamodel_row_index_from_tree_row_iter(const iterator& iter) const; bool check_treeiter_validity(const iterator& iter) const; //Structure: unsigned int m_columns_count; FoundSet m_found_set; type_vec_const_fields m_column_fields; int m_column_index_key; //The index of the primary key in the Gda::DataModel. //Data: sharedptr m_connection; Glib::RefPtr m_gda_datamodel; guint m_data_model_rows_count; guint m_data_model_columns_count; //1 less than m_columns_count, which also has a model column for the key. //TODO: Performance: typedef std::map type_map_rows; mutable type_map_rows m_map_rows; //mutable because getting fills the internal cache. int m_count_extra_rows; //Rows that are not from the database. int m_count_removed_rows; //A cache, instead of searching through the map. int get_internal_rows_count() const; //mutable typeListOfRows m_rows; //Column information: //ColumnRecord m_column_record; //This is useful for users of this model, though this typedef is not used by this class itself: typedef Gtk::TreeModelColumn< DbValue > typeModelColumn; bool m_get_records; bool m_find_mode; int m_stamp; //When the model's stamp and the TreeIter's stamp are equal, the TreeIter is valid. static bool m_iface_initialized; }; } //namespace Glom #endif // GLOM_UTILITY_WIDGETS_DB_TREEMODEL_H glom-1.22.4/glom/mode_data/datawidget/textview.cc0000644000175000017500000001476712234776363023176 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "textview.h" #include #include #include #include #include #include //#include //For stringstream #include // for locale, time_put #include // for struct tm #include // for cout, endl namespace Glom { namespace DataWidgetChildren { TextView::TextView(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::ScrolledWindow(cobject), m_glom_type(Field::TYPE_TEXT) { init(); } TextView::TextView(Field::glom_field_type glom_type) : m_glom_type(glom_type) { init(); } void TextView::init() { #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // !GLOM_ENABLE_CLIENT_ONLY set_shadow_type(Gtk::SHADOW_IN); m_TextView.show(); add(m_TextView); //Wrap text, and allow vertical scrolling: set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); set_shadow_type(Gtk::SHADOW_IN); m_TextView.set_wrap_mode(Gtk::WRAP_WORD); //We use connect(slot, false) to connect before the default signal handler, because the default signal handler prevents _further_ handling. m_TextView.signal_focus_out_event().connect(sigc::mem_fun(*this, &TextView::on_textview_focus_out_event), false); // m_TextView.get_buffer()->signal_end_user_action().connect(sigc::mem_fun(*this, &TextView::on_buffer_changed)); } TextView::~TextView() { } void TextView::set_glom_type(Field::glom_field_type glom_type) { m_glom_type = glom_type; } void TextView::check_for_change() { const Glib::ustring new_text = m_TextView.get_buffer()->get_text(); if(new_text != m_old_text) { //Validate the input: bool success = false; sharedptrlayout_item = sharedptr::cast_dynamic(get_layout_item()); Gnome::Gda::Value value = Conversions::parse_value(m_glom_type, new_text, layout_item->get_formatting_used().m_numeric_format, success); if(success) { //Actually show the canonical text: set_value(value); m_signal_edited.emit(); //The text was edited, so tell the client code. } else { //Tell the user and offer to revert or try again: bool revert = glom_show_dialog_invalid_data(m_glom_type); if(revert) { set_text(m_old_text); } else grab_focus(); //Force the user back into the same field, so that the field can be checked again and eventually corrected or reverted. } } } bool TextView::on_textview_focus_out_event(GdkEventFocus* event) { //Call base class: bool result = Gtk::ScrolledWindow::on_focus_out_event(event); //The user has finished editing. check_for_change(); return result; } /* void TextView::on_activate() { //Call base class: Gtk::TextView::on_activate(); //The user has finished editing. check_for_change(); } */ void TextView::on_buffer_changed() { check_for_change(); } /* void TextView::on_insert_text(const Glib::ustring& text, int* position) { Gtk::TextView::on_insert_text(text, position); } */ void TextView::set_value(const Gnome::Gda::Value& value) { sharedptrlayout_item = sharedptr::cast_dynamic(get_layout_item()); if(layout_item) set_text(Conversions::get_text_for_gda_value(m_glom_type, value, layout_item->get_formatting_used().m_numeric_format)); } void TextView::set_text(const Glib::ustring& text) { m_old_text = text; //Call base class: m_TextView.get_buffer()->set_text(text); } Gnome::Gda::Value TextView::get_value() const { bool success = false; sharedptrlayout_item = sharedptr::cast_dynamic(get_layout_item()); TextView* pNonConstThis = const_cast(this); //Gtk::TextBuffer::get_text() is non-const in gtkmm <=2.6. return Conversions::parse_value(m_glom_type, pNonConstThis->m_TextView.get_buffer()->get_text(true), layout_item->get_formatting_used().m_numeric_format, success); } #ifndef GLOM_ENABLE_CLIENT_ONLY bool TextView::on_button_press_event(GdkEventButton *event) { //Enable/Disable items. //We did this earlier, but get_appwindow is more likely to work now: AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->add_developer_action(m_refContextAddField); pApp->add_developer_action(m_refContextAddRelatedRecords); pApp->add_developer_action(m_refContextAddGroup); pApp->update_userlevel_ui(); //Update our action's sensitivity. //Only show this popup in developer mode, so operators still see the default GtkEntry context menu. //TODO: It would be better to add it somehow to the standard context menu. if(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); return true; //We handled this event. } } } return Gtk::ScrolledWindow::on_button_press_event(event); } #endif // !GLOM_ENABLE_CLIENT_ONLY AppWindow* TextView::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } TextView::type_text_view* TextView::get_textview() { return &m_TextView; } void TextView::set_read_only(bool read_only) { m_TextView.set_editable(!read_only); } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/dialog_choose_date.h0000644000175000017500000000322612234252646024732 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_DIALOG_CHOOSE_DATE_H #define GLOM_MODE_DATA_DIALOG_CHOOSE_DATE_H #include #include #include //#include #include #include namespace Glom { namespace DataWidgetChildren { class Dialog_ChooseDate : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; Dialog_ChooseDate(); Dialog_ChooseDate(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ChooseDate(); void set_date_chosen(const Gnome::Gda::Value& value); Gnome::Gda::Value get_date_chosen() const; private: void on_day_selected_double_click(); Gtk::Calendar* m_calendar; }; } //namespace DataWidetChildren } //namespace Glom #endif //GLOM_MODE_DATA_DIALOG_CHOOSE_DATE_H glom-1.22.4/glom/mode_data/datawidget/combochoiceswithtreemodel.cc0000644000175000017500000004172612234776363026544 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "combochoiceswithtreemodel.h" #include #include #include #include #include #include #include //#include //For stringstream #include // for locale, time_put #include // for struct tm #include // for cout, endl namespace Glom { namespace DataWidgetChildren { ComboChoicesWithTreeModel::ComboChoicesWithTreeModel() : m_fixed_cell_height(0) { init(); } ComboChoicesWithTreeModel::~ComboChoicesWithTreeModel() { delete_model(); } void ComboChoicesWithTreeModel::init() { ComboChoices::init(); } int ComboChoicesWithTreeModel::get_fixed_model_text_column() const { const int count = m_refModel->get_n_columns(); if(count > 0) return count -1; else return 0; //An error, but better than a negative number. } void ComboChoicesWithTreeModel::create_model_non_db(guint columns_count) { delete_model(); Gtk::TreeModel::ColumnRecord record; //Create the TreeModelColumns, adding them to the ColumnRecord: m_vec_model_columns_value_fixed.resize(columns_count, 0); for(guint i = 0; i < columns_count; ++i) { //Create a value column for all columns //for instance for later value comparison. type_model_column_value_fixed* model_column = new type_model_column_value_fixed(); //Store it so we can use it and delete it later: m_vec_model_columns_value_fixed[i] = model_column; record.add(*model_column); } //Create a text column, for use by a GtkComboBox with has-entry, which allows no other column type: //Note that get_fixed_model_text_column() assumes that this is the last column: m_vec_model_columns_string_fixed.resize(1, 0); if(columns_count > 0) { type_model_column_string_fixed* model_column = new type_model_column_string_fixed(); //Store it so we can use it and delete it later: m_vec_model_columns_string_fixed.push_back(model_column); record.add(*model_column); } //Create the model: m_refModel = Gtk::ListStore::create(record); } void ComboChoicesWithTreeModel::delete_model() { //Delete the vector's items: for(type_vec_model_columns_string_fixed::iterator iter = m_vec_model_columns_string_fixed.begin(); iter != m_vec_model_columns_string_fixed.end(); ++iter) { type_model_column_string_fixed* model_column = *iter; delete model_column; } m_vec_model_columns_string_fixed.clear(); //Delete the vector's items: for(type_vec_model_columns_value_fixed::iterator iter = m_vec_model_columns_value_fixed.begin(); iter != m_vec_model_columns_value_fixed.end(); ++iter) { type_model_column_value_fixed* model_column = *iter; delete model_column; } m_vec_model_columns_value_fixed.clear(); m_refModel.reset(); } /* TODO: Remove this void ComboChoicesWithTreeModel::set_choices_with_second(const type_list_values_with_second& list_values) { //Recreate the entire model: guint columns_count = 1; //For the main field. if(!list_values.empty()) { type_list_values_with_second::const_iterator iter= list_values.begin(); if(iter != list_values.end()) { const type_list_values& second = iter->second; columns_count += second.size(); } } create_model(columns_count); //Fill the model with data: sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); const Formatting& format = layout_item->get_formatting_used(); sharedptr choice_relationship; sharedptr layout_choice_first; sharedptr layout_choice_extra; bool choice_show_all = false; format.get_choices_related(choice_relationship, layout_choice_first, layout_choice_extra, choice_show_all); LayoutGroup::type_list_const_items extra_fields; if(layout_choice_extra) extra_fields = layout_choice_extra->get_items_recursive(); Glib::RefPtr list_store = Glib::RefPtr::cast_dynamic(m_refModel); if(!list_store) { std::cerr << G_STRFUNC << ": list_store is null." << std::endl; return; } for(type_list_values_with_second::const_iterator iter = list_values.begin(); iter != list_values.end(); ++iter) { Gtk::TreeModel::iterator iterTree = list_store->append(); Gtk::TreeModel::Row row = *iterTree; if(layout_choice_first) { const Glib::ustring text = Conversions::get_text_for_gda_value(layout_choice_first->get_glom_type(), iter->first, layout_choice_first->get_formatting_used().m_numeric_format); row.set_value(0, text); const type_list_values extra_values = iter->second; if(layout_choice_extra && !extra_values.empty()) { guint model_index = 1; //0 is for the main field. type_list_values::const_iterator iterValues = extra_values.begin(); for(LayoutGroup::type_list_const_items::const_iterator iterExtra = extra_fields.begin(); iterExtra != extra_fields.end(); ++iterExtra) { if(model_index >= columns_count) break; if(iterValues == extra_values.end()) break; const sharedptr item = *iterExtra; const sharedptr item_field = sharedptr::cast_dynamic(item); if(item_field) { const Gnome::Gda::Value value = *iterValues; const Glib::ustring text = Conversions::get_text_for_gda_value(item_field->get_glom_type(), value, item_field->get_formatting_used().m_numeric_format); row.set_value(model_index, text); } ++model_index; ++iterValues; } } } } } */ void ComboChoicesWithTreeModel::set_choices_fixed(const Formatting::type_list_values& list_values, bool restricted) { create_model_non_db(1); //Use a regular ListStore without a dynamic column? Glib::RefPtr list_store = Glib::RefPtr::cast_dynamic(m_refModel); if(!list_store) { std::cerr << G_STRFUNC << ": list_store is null." << std::endl; return; } for(Formatting::type_list_values::const_iterator iter = list_values.begin(); iter != list_values.end(); ++iter) { Gtk::TreeModel::iterator iterTree = list_store->append(); Gtk::TreeModel::Row row = *iterTree; sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); if(!layout_item) continue; const sharedptr choicevalue = *iter; if(!choicevalue) continue; //Note that this is never a translated version of the value. //This is the original value that will be stored in, or read form, the database. const Gnome::Gda::Value value = choicevalue->get_value(); row.set_value(0, value); //The text to show in the combo box for the item: Glib::ustring text; if(restricted && choicevalue->is_translatable()) { //Show the translated text of the value: //This will never be stored in the database: text = item_get_title(choicevalue); } else { text = Conversions::get_text_for_gda_value(layout_item->get_glom_type(), value, layout_item->get_formatting_used().m_numeric_format); } row.set_value(1, text); } //The derived class's (virtual) implementation calls this base method and //then sets up the view, using the model. } void ComboChoicesWithTreeModel::set_choices_related(const Document* document, const sharedptr& layout_field, const Gnome::Gda::Value& foreign_key_value) { if(!document) { std::cerr << G_STRFUNC << ": document is null." << std::endl; return; } const Formatting& format = layout_field->get_formatting_used(); sharedptr choice_relationship; sharedptr layout_choice_first; sharedptr layout_choice_extra; Formatting::type_list_sort_fields choice_sort_fields; bool choice_show_all = false; format.get_choices_related(choice_relationship, layout_choice_first, layout_choice_extra, choice_sort_fields, choice_show_all); if(layout_choice_first->get_glom_type() == Field::TYPE_INVALID) std::cerr << G_STRFUNC << ": layout_choice_first has invalid type. field name: " << layout_choice_first->get_name() << std::endl; //Set full field details, cloning the group to avoid the constness: sharedptr layout_choice_extra_full = glom_sharedptr_clone(layout_choice_extra); const Glib::ustring table_name = choice_relationship->get_to_table(); document->fill_layout_field_details(table_name, layout_choice_extra_full); //Get the list of fields to show: LayoutGroup::type_list_items extra_fields; if(layout_choice_extra_full) extra_fields = layout_choice_extra_full->get_items_recursive(); LayoutGroup::type_list_const_items layout_items; layout_items.push_back(layout_choice_first); layout_items.insert(layout_items.end(), extra_fields.begin(), extra_fields.end()); //Make sure that the primary key is also in the list, but hidden, //because TreeModel_DB needs it: layout_items = Utils::get_layout_items_plus_primary_key(layout_items, document, table_name); //Build the FoundSet: const Glib::ustring to_table = choice_relationship->get_to_table(); FoundSet found_set; found_set.m_table_name = to_table; if(!foreign_key_value.is_null()) { const sharedptr to_field = document->get_field(to_table, choice_relationship->get_to_field()); found_set.m_where_clause = Utils::build_simple_where_expression( to_table, to_field, foreign_key_value); } found_set.m_sort_clause = choice_sort_fields; if(found_set.m_sort_clause.empty()) { //Sort by the first field, because that is better than so sort at all. found_set.m_sort_clause.push_back( FoundSet::type_pair_sort_field(layout_choice_first, true /* ascending */) ); } m_db_layout_items.clear(); //We create DbTreeModelWithExtraText rather than just DbTreeModel, //because Combo(has_entry) needs it. //TODO: Avoid getting the actual data if the user does not have view rights. const Privileges table_privs = Privs::get_current_privs(found_set.m_table_name); m_refModel = DbTreeModelWithExtraText::create(found_set, layout_items, table_privs.m_view, false /* find mode */, m_db_layout_items); if(!m_refModel) { std::cerr << G_STRFUNC << ": DbTreeModel::create() returned a null model." << std::endl; } //The derived class's (virtual) implementation calls this base method and //then sets up the view, using the model. } Glib::RefPtr ComboChoicesWithTreeModel::get_choices_model() { return m_refModel; } void ComboChoicesWithTreeModel::set_cell_for_field_value(Gtk::CellRenderer* cell, const sharedptr& field, const Gnome::Gda::Value& value) { if(!field) return; if(!cell) return; const Field::glom_field_type type = field->get_glom_type(); switch(type) { case(Field::TYPE_BOOLEAN): { Gtk::CellRendererToggle* pDerived = dynamic_cast(cell); if(pDerived) pDerived->set_active( (value.get_value_type() == G_TYPE_BOOLEAN) && value.get_boolean() ); break; } case(Field::TYPE_IMAGE): { Gtk::CellRendererPixbuf* pDerived = dynamic_cast(cell); if(pDerived) { const Glib::RefPtr pixbuf = Utils::get_pixbuf_for_gda_value(value); //Scale it down to a sensible size. //TODO: if(pixbuf) // pixbuf = Utils::image_scale_keeping_ratio(pixbuf, get_fixed_cell_height(), pixbuf->get_width()); pDerived->property_pixbuf() = pixbuf; } else std::cerr << "Field::sql(): glom_type is TYPE_IMAGE but gda type is not VALUE_TYPE_BINARY" << std::endl; break; } default: { //TODO: Maybe we should have custom cellcells for time, date, and numbers. Gtk::CellRendererText* pDerived = dynamic_cast(cell); if(pDerived) { //std::cout << "debug: " << G_STRFUNC << ": field name=" << field->get_name() << ", glom type=" << field->get_glom_type() << std::endl; const Glib::ustring text = Conversions::get_text_for_gda_value(field->get_glom_type(), value, field->get_formatting_used().m_numeric_format); pDerived->property_text() = text; } else { std::cerr << G_STRFUNC << ": cell has an unexpected type: " << typeid(cell).name() << std::endl; } //Show a different color if the value is numeric, if that's specified: if(type == Field::TYPE_NUMERIC) { const Glib::ustring fg_color = field->get_formatting_used().get_text_format_color_foreground_to_use(value); if(!fg_color.empty()) pDerived->property_foreground() = fg_color; else //TODO: Remove this when this GTK+ bug is fixed: https://bugzilla.gnome.org/show_bug.cgi?id=667415 g_object_set(pDerived->gobj(), "foreground", (const char*)0, (gpointer)0); } break; } } } void ComboChoicesWithTreeModel::on_cell_data(const Gtk::TreeModel::iterator& iter, Gtk::CellRenderer* cell, guint model_column_index) { //std::cout << G_STRFUNC << ": DEBUG: model_column_index=" << model_column_index << std::endl; if(model_column_index >= m_db_layout_items.size()) { std::cerr << G_STRFUNC << ": model_column_index (" << model_column_index << ") is out of range. size=" << m_db_layout_items.size() << std::endl; return; } if(!cell) { std::cerr << G_STRFUNC << ": cell is null." << std::endl; return; } if(!iter) return; const sharedptr& layout_item = m_db_layout_items[model_column_index]; sharedptr field = sharedptr::cast_dynamic(layout_item); if(!field) return; Gnome::Gda::Value value; Gtk::TreeModel::Row treerow = *iter; treerow->get_value(model_column_index, value); set_cell_for_field_value(cell, field, value); } void ComboChoicesWithTreeModel::cell_connect_cell_data_func(Gtk::CellLayout* celllayout, Gtk::CellRenderer* cell, guint model_column_index) { if(model_column_index >= m_db_layout_items.size()) { std::cerr << G_STRFUNC << ": model_column_index (" << model_column_index << ") is out of range. size=" << m_db_layout_items.size() << std::endl; return; } celllayout->set_cell_data_func(*cell, sigc::bind( sigc::mem_fun(*this, &ComboChoicesWithTreeModel::on_cell_data), cell, model_column_index)); } int ComboChoicesWithTreeModel::get_fixed_cell_height(Gtk::Widget& widget) { if(m_fixed_cell_height <= 0) { // Discover a suitable height, and cache it, // by looking at the heights of all columns: // Note that this is usually calculated during construct_specified_columns(), // when all columns are known. //Get a default: const Glib::RefPtr refLayout = widget.create_pango_layout("example"); int width = 0; int height = 0; refLayout->get_pixel_size(width, height); m_fixed_cell_height = height; //Look at each column: for(type_vec_const_layout_items::iterator iter = m_db_layout_items.begin(); iter != m_db_layout_items.end(); ++iter) { Glib::ustring font_name; const sharedptr item_withformatting = sharedptr::cast_dynamic(*iter); if(item_withformatting) { const Formatting& formatting = item_withformatting->get_formatting_used(); font_name = formatting.get_text_format_font(); } if(font_name.empty()) continue; // Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. Glib::RefPtr refLayout = widget.create_pango_layout(_("Example")); const Pango::FontDescription font(font_name); refLayout->set_font_description(font); int width = 0; int height = 0; refLayout->get_pixel_size(width, height); if(height > m_fixed_cell_height) m_fixed_cell_height = height; } } return m_fixed_cell_height; } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/cellrenderer_buttontext.h0000644000175000017500000000302712234252646026103 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_CELLRENDERER_BUTTONTEXT_H #define GLOM_CELLRENDERER_BUTTONTEXT_H #include #include #include namespace Glom { class GlomCellRenderer_ButtonText : public Gtk::CellRendererText { public: GlomCellRenderer_ButtonText(); virtual ~GlomCellRenderer_ButtonText(); typedef sigc::signal type_signal_clicked; type_signal_clicked signal_clicked(); private: virtual bool activate_vfunc(GdkEvent* event, Gtk::Widget& widget, const Glib::ustring& path, const Gdk::Rectangle& background_area, const Gdk::Rectangle& cell_area, Gtk::CellRendererState flags); type_signal_clicked m_signal_clicked; }; } //namespace Glom #endif //GLOM_CELLRENDERER_BUTTONTEXT_H glom-1.22.4/glom/mode_data/datawidget/checkbutton.h0000644000175000017500000000327112234252646023447 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2008 Johannes Schmid * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_CHECK_BUTTON_H #define GLOM_MODE_DATA_CHECK_BUTTON_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include #include #include namespace Glom { class AppWindow; namespace DataWidgetChildren { class CheckButton : public Gtk::CheckButton, public LayoutWidgetField { public: explicit CheckButton(const Glib::ustring& title = Glib::ustring()); virtual ~CheckButton(); virtual void set_value(const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_value() const; private: void init(); #ifndef GLOM_ENABLE_CLIENT_ONLY virtual bool on_button_press_event(GdkEventButton *event); //override #endif // !GLOM_ENABLE_CLIENT_ONLY virtual AppWindow* get_appwindow() const; }; } //namespace DataWidetChildren } //namespace Glom #endif // GLOM_MODE_DATA_CHECK_BUTTON_H glom-1.22.4/glom/mode_data/datawidget/combochoices.h0000644000175000017500000000550012234252646023570 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_COMBO_CHOICES_H #define GLOM_UTILITY_WIDGETS_COMBO_CHOICES_H #include #include namespace Glom { class Document; namespace DataWidgetChildren { /** A polymorphic base class for all the combo-like widgets. */ class ComboChoices : public LayoutWidgetField { public: ///You must call set_layout_item() to specify the field type and formatting of the main column. explicit ComboChoices(); ///You must call set_layout_item() to specify the field type and formatting of the main column. explicit ComboChoices(const sharedptr& field_second); virtual ~ComboChoices(); /** Set a list of choice values, for instance for a list of custom choices. * You should first call set_layout_item() to provide formatting details. */ virtual void set_choices_fixed(const Formatting::type_list_values& list_values, bool restricted = false) = 0; /** Show the list of related chocie values based on the LayoutItem's formatting choices. * You should first call set_layout_item() to provide that formatting detail, * so the widget knows what choices to show, and how to format them. * * The LayoutItem_Fields should already have their full field details * * See also refresh_data_from_database_with_foreign_key(). */ virtual void set_choices_related(const Document* document, const sharedptr& layout_field, const Gnome::Gda::Value& foreign_key_value) = 0; /** Update a choices widget's list of related choices if a relevant value in its parent table has changed. * * @param foreign_key_value: The value that should be found in this table. */ bool refresh_data_from_database_with_foreign_key(const Document* document, const Gnome::Gda::Value& foreign_key_value); protected: void init(); //Gnome::Gda::Value m_value; //The last-stored value. We have this because the displayed value might be unparseable. }; } //namespace DataWidetChildren } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_COMBO_CHOICES_H glom-1.22.4/glom/mode_data/datawidget/cellcreation.h0000644000175000017500000000241512234252646023601 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_CELL_CREATION_H #define GLOM_CELL_CREATION_H #include #include namespace Glom { /** Create a Gtk::CellRenderer that's appropriate to display a layout item, * for internal use by a DbAddDel or ComboChoices widget. */ Gtk::CellRenderer* create_cell(const sharedptr& layout_item, const Glib::ustring& table_name, const Document* document, guint fixed_cell_height); } //namespace Glom #endif //GLOM_CELL_CREATION_H glom-1.22.4/glom/mode_data/datawidget/combo.h0000644000175000017500000000566312234252646022244 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_COMBO_H #define GLOM_MODE_DATA_COMBO_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include namespace Glom { class AppWindow; namespace DataWidgetChildren { /** A Gtk::ComboBox that can show choices of field values. * Use this when the user should only be allowed to enter values that are in the choices. */ class ComboGlom : public Gtk::ComboBox, public ComboChoicesWithTreeModel { public: ///You must call set_layout_item() to specify the field type and formatting of the main column. ComboGlom(bool has_entry = false); virtual ~ComboGlom(); //This creates a simple ListStore, with a text cell renderer. virtual void set_choices_fixed(const Formatting::type_list_values& list_values, bool restricted = false); //This creates a db-based tree model, with appropriate cell renderers: virtual void set_choices_related(const Document* document, const sharedptr& layout_field, const Gnome::Gda::Value& foreign_key_value); virtual void set_read_only(bool read_only = true); /** Set the text from a Gnome::Gda::Value. */ virtual void set_value(const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_value() const; private: void on_fixed_cell_data(const Gtk::TreeModel::iterator& iter, Gtk::CellRenderer* cell, guint model_column_index); // Note that this is a normal signal handler when glibmm was complied // without default signal handlers virtual void on_changed(); //From Gtk::ComboBox virtual void check_for_change(); #ifndef GLOM_ENABLE_CLIENT_ONLY virtual bool on_button_press_event(GdkEventButton *event); #endif // !GLOM_ENABLE_CLIENT_ONLY virtual AppWindow* get_appwindow() const; Gnome::Gda::Value m_old_value; //TODO: Only useful for navigation, which currently has no implementation. //Gnome::Gda::Value m_value; //The last-stored value. We have this because the displayed value might be unparseable. //Prevent us from emitting signals just because set_value() was called: bool m_ignore_changed; }; } //namespace DataWidetChildren } //namespace Glom #endif // GLOM_MODE_DATA_COMBO_H glom-1.22.4/glom/mode_data/datawidget/dialog_choose_id.cc0000644000175000017500000001226012234252646024545 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_choose_id.h" #include //For bold_message()). #include //#include #include namespace Glom { namespace DataWidgetChildren { const char* Dialog_ChooseID::glade_id("dialog_find_id"); const bool Dialog_ChooseID::glade_developer(false); Dialog_ChooseID::Dialog_ChooseID() : m_label_table_name(0), m_pBox_QuickFind(0), m_pEntry_QuickFind(0), m_pButton_QuickFind(0), m_alignment_parent(0), m_document(0), m_stage(STAGE_INVALID) { } Dialog_ChooseID::Dialog_ChooseID(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_label_table_name(0), m_pBox_QuickFind(0), m_pEntry_QuickFind(0), m_pButton_QuickFind(0), m_alignment_parent(0), m_document(0), m_stage(STAGE_INVALID) { builder->get_widget("label_table_name", m_label_table_name); builder->get_widget("alignment_parent", m_alignment_parent); builder->get_widget("hbox_quickfind", m_pBox_QuickFind); builder->get_widget("entry_quickfind", m_pEntry_QuickFind); builder->get_widget("button_quickfind", m_pButton_QuickFind); m_pButton_QuickFind->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_ChooseID::on_button_quickfind) ); setup(); } Dialog_ChooseID::~Dialog_ChooseID() { remove_view(&m_box_find); remove_view(&m_box_select); //Work around this bug (apparently in GTK+): //https://bugzilla.gnome.org/show_bug.cgi?id=660347 m_alignment_parent->remove(); } void Dialog_ChooseID::setup() { m_box_find.signal_find_criteria.connect(sigc::mem_fun(*this, &Dialog_ChooseID::on_box_find_criteria)); m_box_select.signal_user_requested_details().connect(sigc::mem_fun(*this, &Dialog_ChooseID::on_box_select_selected)); m_box_select.set_read_only(); //Fill composite view: add_view(&m_box_find); //m_box_select.show_all_children(); add_view(&m_box_select); m_box_select.set_open_button_title(_("Select")); m_stage = STAGE_FIND; update_ui_for_stage(); } bool Dialog_ChooseID::get_id_chosen(Gnome::Gda::Value& chosen_id) const { chosen_id = m_id_chosen; return true; } void Dialog_ChooseID::on_button_quickfind() { const Glib::ustring criteria = m_pEntry_QuickFind->get_text(); if(criteria.empty()) { Glib::ustring message = _("You have not entered any quick find criteria."); Gtk::MessageDialog dialog(Utils::bold_message(_("No Find Criteria")), true, Gtk::MESSAGE_WARNING ); dialog.set_secondary_text(message); dialog.set_transient_for(*this); dialog.run(); } else { const Gnome::Gda::SqlExpr where_clause = Utils::get_find_where_clause_quick(get_document(), m_table_name, Gnome::Gda::Value(criteria)); on_box_find_criteria(where_clause); } } void Dialog_ChooseID::on_box_find_criteria(const Gnome::Gda::SqlExpr& where_clause) { //Use the find criteria to show a list of results: if(!where_clause.empty()) { FoundSet found_set = m_box_select.get_found_set(); found_set.m_table_name = m_table_name; found_set.m_where_clause = where_clause; const bool records_found = m_box_select.init_db_details(found_set, m_layout_platform); if(!records_found) { const bool find_again = Utils::show_warning_no_records_found(*this); if(!find_again) response(Gtk::RESPONSE_CANCEL); } else { m_stage = STAGE_SELECT; update_ui_for_stage(); } } } void Dialog_ChooseID::on_box_select_selected(const Gnome::Gda::Value& primary_key) { m_id_chosen = primary_key; response(Gtk::RESPONSE_OK); //Close the dialog. } void Dialog_ChooseID::update_ui_for_stage() { m_alignment_parent->remove(); if(m_stage == STAGE_FIND) { m_pBox_QuickFind->show(); m_box_find.show(); m_alignment_parent->add(m_box_find); } else if(m_stage == STAGE_SELECT) { m_pBox_QuickFind->hide(); m_box_select.show(); m_alignment_parent->add(m_box_select); } } bool Dialog_ChooseID::init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform) { m_table_name = table_name; m_layout_platform = layout_platform; m_label_table_name->set_text( get_document()->get_table_title(m_table_name, AppWindow::get_current_locale()) ); //Start by asking for find criteria: m_stage = STAGE_FIND; update_ui_for_stage(); bool result = m_box_find.init_db_details(table_name, layout_platform); m_table_name = table_name; return result; } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/treemodel_db.cc0000644000175000017500000010334312234776363023731 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include "treemodel_db.h" #include #include //For util_build_sql #include #include #include #include #include #include namespace Glom { DbTreeModelRow::DbTreeModelRow() : m_values_retrieved(false), m_removed(false), m_extra(false) //m_data_model_row_number(false) { } void DbTreeModelRow::fill_values_if_necessary(DbTreeModel& model, int row) { //std::cout << "debug: " << G_STRFUNC << ": row=" << row << std::endl; //if(row == 1000) //{ // std::cout << "1000" << std::endl; //} if(m_values_retrieved) { //std::cout << "debug: " << G_STRFUNC << ": already retrieved" << std::endl; } else { //std::cout << "debug: " << G_STRFUNC << ": retrieving for row=" << row << std::endl; if((row < (int)model.m_data_model_rows_count) && model.m_gda_datamodel) { Glib::RefPtr iter = model.m_gda_datamodel->create_iter(); if(iter) { iter->move_to_row(row); //It is a row from the database; const int cols_count = model.m_data_model_columns_count; for(int i = 0; i < cols_count; ++i) { try { m_db_values[i] = iter->get_value_at(i); } catch(const Glib::Error& ex) { // This is quite possible, for example for unset dates. jhs std::cerr << G_STRFUNC << ": get_value_at() failed for column=" << i << ", with exception: " << ex.what() << std::endl; } //std::cout << " debug: col=" << i << ", GType=" << m_db_values[i].get_value_type() << ", string=" << m_db_values[i].to_string() << std::endl; } //TODO: Use iter->get_value_at(i) with try/catch instead when we can depend on libgdamm >= 4.99.4.2 try { m_key = iter->get_value_at(model.m_column_index_key); } catch(const Glib::Error& ex) { // This is quite possible, for example for unset dates. jhs std::cerr << G_STRFUNC << ": get_value_at() failed for model.m_column_index_key=" << model.m_column_index_key << ", with exception: " << ex.what() << std::endl; } m_extra = false; m_removed = false; } } else { //std::cerr << G_STRFUNC << ": Non-db row." << std::endl; if(m_extra) { //std::cout << "debug: " << G_STRFUNC << ": using default value" << std::endl; //It is an extra row, added with append(). } else if(!m_removed) { //It must be the last blank placeholder row. //m_placeholder = true; } //Create default values, if necessary, of the correct types: //Examine the columns in the returned DataModel: const Glib::RefPtr datamodel = model.m_gda_datamodel; for(guint col = 0; col < model.m_data_model_columns_count; ++col) { if(m_db_values.find(col) == m_db_values.end()) //If there is not already a value in the map for this column. { if(!datamodel) //though this should not happen. { m_db_values[col] = Gnome::Gda::Value(); } else { const Glib::RefPtr column = datamodel->describe_column(col); //We don't just create a Gda::Value of the column's gda type, //because we should use a NULL-type Gda::Value as the initial value for some fields: const Field::glom_field_type glom_type = Field::get_glom_type_for_gda_type(column->get_g_type()); m_db_values[col] = Glom::Conversions::get_empty_value(glom_type); } } } } } m_values_retrieved = true; //Don't read them again. } void DbTreeModelRow::set_value(DbTreeModel& model, int column, int row, const DbValue& value) { fill_values_if_necessary(model, row); //Check that the value has the correct type: /* Glib::RefPtr gdacolumn = model.m_gda_datamodel->describe_column(column); const GType debug_type_in = value.get_value_type(); const GType debug_type_expected = gdacolumn->get_g_type(); if(debug_type_in != debug_type_expected) { std::cout << "debug: " << G_STRFUNC << ": expected GType=" << debug_type_expected << ", but received GType=" << debug_type_in << std::endl; if(debug_type_expected) std::cout << " expected GType name=\"" << g_type_name(debug_type_expected) << "\"" << std::endl; if(debug_type_in) std::cout << " received GType name=\"" << g_type_name(debug_type_in) << "\"" << std::endl; } */ m_db_values[column] = value; } DbTreeModelRow::DbValue DbTreeModelRow::get_value(DbTreeModel& model, int column, int row) { fill_values_if_necessary(model, row); type_vec_values::const_iterator iterFind = m_db_values.find(column); if(iterFind != m_db_values.end()) return iterFind->second; else { std::cout << "debug: " << G_STRFUNC << ": column not found." << std::endl; return DbValue(); } } //Intialize static variable: bool DbTreeModel::m_iface_initialized = false; DbTreeModel::DbTreeModel(const FoundSet& found_set, const type_vec_const_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown) : Glib::ObjectBase( typeid(DbTreeModel) ), //register a custom GType. Glib::Object(), //The custom GType is actually registered here. m_columns_count(0), m_found_set(found_set), m_column_index_key(-1), //means it's not set yet. m_data_model_rows_count(0), m_data_model_columns_count(0), m_count_extra_rows(0), m_count_removed_rows(0), m_get_records(get_records), m_find_mode(find_mode), m_stamp(1) //When the model's stamp != the iterator's stamp then that iterator is invalid and should be ignored. Also, 0=invalid { if(!m_iface_initialized) { //GType gtype = G_OBJECT_TYPE(gobj()); //The custom GType created in the Object constructor, from the typeid. //Gtk::TreeModel::add_interface( gtype ); m_iface_initialized = true; //Prevent us from calling add_interface() on the same gtype again. } //Database columns:; { for(type_vec_const_layout_items::const_iterator iter = layout_items.begin(); iter != layout_items.end(); ++iter) { sharedptr item_field = sharedptr::cast_dynamic(*iter); if(item_field) { if(item_field->get_glom_type() == Field::TYPE_INVALID) std::cerr << G_STRFUNC << ": field has invalid type. field name: " << item_field->get_name() << std::endl; m_column_fields.push_back(item_field); } } } fields_shown = m_column_fields; { //Find the primary key: int column_index_key = 0; bool key_found = false; for( DbTreeModel::type_vec_const_fields::const_iterator iter = m_column_fields.begin(); iter != m_column_fields.end(); ++iter) { const sharedptr layout_item = *iter; if(!layout_item) continue; if( !(layout_item->get_has_relationship_name()) ) { const sharedptr field_full = layout_item->get_full_field_details(); if(!field_full) std::cerr << G_STRFUNC << ": The layout item (" << layout_item->get_name() << ") has no field details." << std::endl; else if(field_full->get_primary_key() ) { key_found = true; break; } } ++column_index_key; } if(!key_found) { std::cerr << G_STRFUNC << ": no primary key field found in the list of items:" << std::endl; for(DbTreeModel::type_vec_const_fields::const_iterator iter = m_column_fields.begin(); iter != m_column_fields.end(); ++iter) { const sharedptr layout_item = *iter; if(layout_item) std::cerr << " field: " << layout_item->get_name() << std::endl; } return; } m_column_index_key = column_index_key; //The Column information that can be used with TreeView::append(), TreeModel::iterator[], etc. m_columns_count = m_column_fields.size(); refresh_from_database(m_found_set); } } DbTreeModel::~DbTreeModel() { clear(); } Glib::RefPtr DbTreeModel::create(const FoundSet& found_set, const type_vec_const_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown) { return Glib::RefPtr( new DbTreeModel(found_set, layout_items, get_records, find_mode, fields_shown) ); } Glib::RefPtr DbTreeModel::create(const FoundSet& found_set, const type_vec_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown) { //Create a const version of the input, because C++ can't convert it automatically: type_vec_const_layout_items const_items; const_items.insert(const_items.end(), layout_items.begin(), layout_items.end()); return create(found_set, const_items, get_records, find_mode, fields_shown); } bool DbTreeModel::refresh_from_database(const FoundSet& found_set) { //std::cout << "DbTreeModel::refresh_from_database()" << std::endl; m_found_set = found_set; if(!m_get_records && !m_find_mode) return false; clear(); //Clear existing shown records. if(m_find_mode) { m_get_records = false; //Otherwise it would not make sense. //Use a dummy DataModel that has the same columns and types, //but which does not use a real database table, //so we can use it to add find criteria. Glib::RefPtr model_array = Gnome::Gda::DataModelArray::create(m_column_fields.size()); m_gda_datamodel = model_array; int col = 0; for(type_vec_const_fields::const_iterator iter = m_column_fields.begin(); iter != m_column_fields.end(); ++iter) { sharedptr layout_item = *iter; if(layout_item) { const Field::glom_field_type glom_type = layout_item->get_glom_type(); const GType gda_type = Field::get_gda_type_for_glom_type(glom_type); model_array->set_column_g_type(col, gda_type); ++col; } } //Add at least an initial row: m_gda_datamodel->append_row(); //TODO: Handle adding. return true; } //Connect to database: ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(connection_pool) { m_connection = connection_pool->connect(); } if(m_found_set.m_table_name.empty()) std::cerr << G_STRFUNC << ": found_set.m_table_name is empty." << std::endl; if(m_connection && !m_found_set.m_table_name.empty() && m_get_records) { Glib::RefPtr sql_query = Utils::build_sql_select_with_where_clause(m_found_set.m_table_name, m_column_fields, m_found_set.m_where_clause, m_found_set.m_extra_join, m_found_set.m_sort_clause); //std::cout << "debug: " << G_STRFUNC << ": " << sql_query << std::endl; m_gda_datamodel = DbUtils::query_execute_select(sql_query, true /* use_cursor */); if(!m_gda_datamodel) { m_data_model_rows_count = 0; m_data_model_columns_count = m_columns_count; std::cerr << G_STRFUNC << ": error executing SQL. SQL query: " << std::endl; std::cerr << " " << Utils::sqlbuilder_get_full_query(sql_query) << std::endl; ConnectionPool::handle_error_cerr_only(); return false; //No records were found. } else { // If using the sqlite backed, then use a DataAccessWrapper to allow random access. This is necessary // since we use move_to_row() on a created iterator in // fill_values_if_necessary(), which does not work if the iterator // does not support it (for example the one for Sqlite recordsets does // not). The alternative would be to acquire a random-access model // directly here for SQLite, but this would // a) make this code dependent on the database backend used. // b) fetch rows we perhaps don't need, if only the first few rows of // a table are accessed. ConnectionPool* connection = ConnectionPool::get_instance(); if(connection && !connection->get_backend_supports_cursor()) m_gda_datamodel = Gnome::Gda::DataAccessWrapper::create(m_gda_datamodel); //This doesn't work with cursor-based models: const int count = m_gda_datamodel->get_n_rows(); //because rows count is -1 until we have iterated to the last row. Glib::RefPtr sql_query_without_sort = Utils::build_sql_select_with_where_clause(m_found_set.m_table_name, m_column_fields, m_found_set.m_where_clause, m_found_set.m_extra_join, type_sort_clause()); const int count = DbUtils::count_rows_returned_by(sql_query_without_sort); if(count < 0) { std::cerr << G_STRFUNC << ": count is < 0" << std::endl; m_data_model_rows_count = 0; } else { m_data_model_rows_count = count; } //std::cout << " rows count=" << m_data_model_rows_count << std::endl; m_data_model_columns_count = m_gda_datamodel->get_n_columns(); return (m_data_model_rows_count > 0); //false is not really a failure, but the caller needs to know whether the foundset found any records. } } else { m_data_model_columns_count = m_columns_count; return false; //No records were found. } } Gtk::TreeModelFlags DbTreeModel::get_flags_vfunc() const { return (Gtk::TreeModelFlags)(Gtk::TREE_MODEL_LIST_ONLY | Gtk::TREE_MODEL_ITERS_PERSIST); } int DbTreeModel::get_n_columns_vfunc() const { return m_columns_count; //including the key. } GType DbTreeModel::get_column_type_vfunc(int index) const { if(index < (int)m_columns_count) return typeModelColumn::ValueType::value_type(); else return 0; } void DbTreeModel::get_value_vfunc(const TreeModel::iterator& iter, int column, Glib::ValueBase& value) const { //std::cout << "debug: " << G_STRFUNC << ": column=" << column << std::endl; if(check_treeiter_validity(iter)) { //std::cout << " debug: DbTreeModel::get_value_vfunc() 1" << std::endl; if(column < (int)m_columns_count) { //std::cout << " debug: DbTreeModel::get_value_vfunc() 1.1" << std::endl; //Get the correct ValueType from the Gtk::TreeModel::Column's type, so we don't have to repeat it here: //(This would be a custom boxed type for our Gda::Value (stored inside the TreeModel's Glib::Value just as an int or char* would be stored in it.) //std::cout << "debug: " << G_STRFUNC << ": column=" << column << ", value type=" << g_type_name(typeModelColumn::ValueType::value_type()) << std::endl; typeModelColumn::ValueType value_specific; value_specific.init( typeModelColumn::ValueType::value_type() ); //TODO: Is there any way to avoid this step? //Or, instead of asking the compiler for the TreeModelColumn's ValueType: //Glib::Value< DbValue > value_specific; //value_specific.init( Glib::Value< DbValue >::value_type() ); //TODO: Is there any way to avoid this step? type_datamodel_row_index datamodel_row = get_datamodel_row_index_from_tree_row_iter(iter); //g_warning("DbTreeModel::get_value_vfunc(): datamodel_row=%d, get_internal_rows_count=%d", datamodel_row, get_internal_rows_count()); const unsigned int internal_rows_count = get_internal_rows_count(); if( datamodel_row < internal_rows_count) //!= m_rows.end()) { //std::cout << " debug: DbTreeModel::get_value_vfunc() 1.2" << std::endl; //const typeRow& dataRow = *datamodel_row; //g_warning("DbTreeModel::get_value_vfunc 1: column=%d, row=%d", column, datamodel_row); DbValue result; DbTreeModelRow& row_details = m_map_rows[datamodel_row]; //Adds it if necessary. const int column_sql = column; if(column_sql < (int)m_columns_count) //TODO_Performance: Remove the checks. { //std::cout << " debug: DbTreeModel::get_value_vfunc() 1.3" << std::endl; if( !(datamodel_row < (internal_rows_count - 1))) { //std::cout << " debug: DbTreeModel::get_value_vfunc() 1.4" << std::endl; //std::cout << "DbTreeModel::get_value_vfunc: row " << datamodel_row << " is placeholder" << std::endl; //If it's after the database rows then it must be a placeholder row. //We have only one of these because iter_n_root_children_vfunc() only adds 1 to the row count. //row_details.m_placeholder = true; } else { /* std::cout << " debug: DbTreeModel::get_value_vfunc() 1.4b: column_sql=" << column_sql << std::endl; //Examine the columns in the returned DataModel: for(int col = 0; col < m_gda_datamodel->get_n_columns(); ++col) { Glib::RefPtr column = m_gda_datamodel->describe_column(col); std::cout << " debug: column index=" << col << ", name=" << column->get_name() << ", type=" << g_type_name(column->get_g_type()) << std::endl; } */ //Double check that the result has the correct type: //Glib::RefPtr column = m_gda_datamodel->describe_column(column_sql); //const GType gtype_expected = column->get_g_type(); result = row_details.get_value(const_cast(*this), column_sql, datamodel_row); //m_gda_datamodel->get_value_at(column_sql, datamodel_row); //dataRow.m_db_values[column]; /* if((result.get_value_type() != 0) && (result.get_value_type() != gtype_expected)) { std::cout << "debug: " << G_STRFUNC << ": column_sql=" << column_sql << ", describe_column() returned GType: " << gtype_expected << " but get_value() returned GType: " << result.get_value_type() << std::endl; } */ } } else g_warning("DbTreeModel::get_value_vfunc: column out of bounds: sql_col=%d, max=%d.", column_sql, m_columns_count); /* GType debug_type = result.get_value_type(); std::cout << "debug: " << G_STRFUNC << ": result value type: GType=" << debug_type << std::endl; if(debug_type) std::cout << " GType name=\"" << g_type_name(debug_type) << "\"" << std::endl; */ value_specific.set(result); //The compiler would complain if the type was wrong. value.init( Glib::Value< DbValue >::value_type() ); //TODO: Is there any way to avoid this step? Can't it copy the type as well as the value? value = value_specific; } } } } bool DbTreeModel::iter_next_vfunc(const iterator& iter, iterator& iter_next) const { if( check_treeiter_validity(iter) ) { //Get the current row: type_datamodel_row_index datamodel_row = get_datamodel_row_index_from_tree_row_iter(iter); //std::cout << "debug: " << G_STRFUNC << ":" << datamodel_row << std::endl; //Make the iter_next GtkTreeIter represent the next row: ++datamodel_row; //Jump over removed rows: while(row_was_removed(datamodel_row)) ++datamodel_row; //g_warning("DbTreeModel::iter_next_vfunc(): attempting to return row=%d", datamodel_row); return create_iterator(datamodel_row, iter_next); } else iter_next = iterator(); //Set is as invalid, as the TreeModel documentation says that it should be. return false; //There is no next row. } bool DbTreeModel::iter_children_vfunc(const iterator& parent, iterator& iter) const { return iter_nth_child_vfunc(parent, 0, iter); } bool DbTreeModel::iter_has_child_vfunc(const iterator& /* iter */) const { return false; } int DbTreeModel::iter_n_children_vfunc(const iterator& iter) const { if(!check_treeiter_validity(iter)) return iter_n_root_children_vfunc(); return 0; //There are no children } int DbTreeModel::iter_n_root_children_vfunc() const { //std::cout << "debug: " << G_STRFUNC << ": returning: " << get_internal_rows_count() - m_count_removed_rows + 1 << std::endl; return get_internal_rows_count() - m_count_removed_rows; } void DbTreeModel::invalidate_iter(iterator& iter) const { iter.set_stamp(0); } bool DbTreeModel::iter_nth_child_vfunc(const iterator& parent, int /* n */, iterator& iter) const { if(!check_treeiter_validity(parent)) { iter = iterator(); //Set is as invalid, as the TreeModel documentation says that it should be. return false; } iter = iterator(); //Set is as invalid, as the TreeModel documentation says that it should be. return false; //There are no children. } bool DbTreeModel::iter_nth_root_child_vfunc(int n, iterator& iter) const { //g_warning("DbTreeModel::iter_nth_root_child_vfunc(): n=%d", n); //if(m_data_model_rows_count == 0) // return false; //There are no children. if(true) //n < (int)m_data_model_rows_count) { //Store the row_index in the GtkTreeIter: //See also iter_next_vfunc() //TODO_Performance: //Get the nth unremoved row: type_datamodel_row_index datamodel_row = 0; for(int child_n = 0; child_n < n; ++child_n) { //Jump over hidden rows: while(m_map_rows[datamodel_row].m_removed) ++datamodel_row; ++datamodel_row; } while(m_map_rows[datamodel_row].m_removed) ++datamodel_row; return create_iterator(datamodel_row, iter); //create_iterator(datamodel_row, iter); } return false; //There are no children. } bool DbTreeModel::iter_parent_vfunc(const iterator& child, iterator& iter) const { if(!check_treeiter_validity(child)) { invalidate_iter(iter); //Set is as invalid, as the TreeModel documentation says that it should be. return false; } invalidate_iter(iter); //Set is as invalid, as the TreeModel documentation says that it should be. return false; //There are no children, so no parents. } Gtk::TreeModel::Path DbTreeModel::get_path_vfunc(const iterator& iter) const { type_datamodel_row_index datamodel_row = get_datamodel_row_index_from_tree_row_iter(iter); //TODO_Performance: //Get the number of non-removed items before this iter, because the path index doesn't care about removed internal stuff. int path_index = -1; if(datamodel_row > 0) //A row index of 0 must mean a path index if there are _any_ non-removed rows. { for(type_datamodel_row_index i = 0; i <= datamodel_row; ++i) { if(!(m_map_rows[i].m_removed)) ++path_index; } } //g_warning("DbTreeModel::get_path_vfunc(): returning path index %d for internal row %d", path_index, datamodel_row); if(path_index == -1) path_index = 0; //This should never happen, but let's not risk having a strange -1 value if it does. Gtk::TreeModel::Path path; path.push_back(path_index); //path.push_back(index); return path; } bool DbTreeModel::create_iterator(const type_datamodel_row_index& datamodel_row, DbTreeModel::iterator& iter) const { Glib::RefPtr refModel(const_cast(this)); refModel->reference(); iter.set_model_refptr(refModel); const guint count_all_rows = get_internal_rows_count(); //g_warning("DbTreeModel::create_iterator(): datamodel_row=%d, count=%d", datamodel_row, count_all_rows); if(datamodel_row >= (count_all_rows)) //datamodel_row == m_rows.end()) //1 for the placeholder. { //TreeView seems to use this to identify the last row. //g_warning("DbTreeModel::create_iterator(): out of bounds: returning invalid iterator: datamodel_row=%d", datamodel_row); invalidate_iter(iter); return false; } else { iter.set_stamp(m_stamp); //Store the std::list iterator in the GtkTreeIter: //See also iter_next_vfunc() //Store the row number in the GtkTreeIter. iter.gobj()->user_data = GINT_TO_POINTER(datamodel_row); return true; } } bool DbTreeModel::get_iter_vfunc(const Path& path, iterator& iter) const { //std::cout << ": path=" << path << std::endl; unsigned sz = path.size(); if(!sz) { invalidate_iter(iter); //Set is as invalid, as the TreeModel documentation says that it should be. return false; } if(sz > 1) //There are no children. { invalidate_iter(iter); //Set is as invalid, as the TreeModel documentation says that it should be. return false; } return iter_nth_root_child_vfunc(path[0], iter); } DbTreeModel::type_datamodel_row_index DbTreeModel::get_datamodel_row_index_from_tree_row_iter(const iterator& iter) const { return GPOINTER_TO_INT(iter.gobj()->user_data); } bool DbTreeModel::check_treeiter_validity(const iterator& iter) const { if(!(iter->get_model_gobject())) return false; // Anything that modifies the model's structure should change the model's stamp, // so that old iters are ignored. return m_stamp == iter.get_stamp(); } bool DbTreeModel::iter_is_valid(const iterator& iter) const { return check_treeiter_validity(iter); } int DbTreeModel::get_internal_rows_count() const { return m_data_model_rows_count + m_count_extra_rows + 1; //1 for placeholder. } DbTreeModel::iterator DbTreeModel::append() { //const size_type existing_size = m_data_model_rows_count; //std::cerr << G_STRFUNC << ": existing_size = " << existing_size << std::endl; //m_rows.resize(existing_size + 1); //Get aniterator to the last element: type_datamodel_row_index datamodel_row = get_internal_rows_count(); //std::cerr << G_STRFUNC << ": new row number=" << datamodel_row << std::endl; ++m_count_extra_rows; //So that create_iterator() can succeed. //Create the row: //datamodel_row->m_db_values.resize(m_columns_count); for(unsigned int column_number = 0; column_number < m_columns_count; ++column_number) { // Set the data in the row cells: // It is more likely that you would be reusing existing data from some other data structure, // instead of generating the data here. //char buffer[20]; //You could use a std::stringstream instead. //g_snprintf(buffer, sizeof(buffer), "%d, %d", row_number, column_number); //(m_rows[row_number]).m_db_values[column_number] = buffer; //Note that allcolumns here are of the same type. } //Create the iterator to the new row: iterator iter; const bool iter_is_valid = create_iterator(datamodel_row, iter); if(iter_is_valid) { row_inserted(get_path(iter), iter); //Allow the TreeView to respond to the addition. } return iter; } void DbTreeModel::set_value_impl(const iterator& row, int column, const Glib::ValueBase& value) { if(iter_is_valid(row)) { //Get the index from the user_data: type_datamodel_row_index datamodel_row = get_datamodel_row_index_from_tree_row_iter(row); //TODO: Check column against get_n_columns() too, though it could hurt performance. //Cast it to the specific value type. //It can't work with anything else anyway. typedef Glib::Value< DbValue > ValueDbValue; const ValueDbValue* pDbValue = static_cast(&value); if(!pDbValue) std::cerr << G_STRFUNC << ": value is not a Value< DbValue >." << std::endl; else { DbTreeModelRow& row_details = m_map_rows[datamodel_row]; //Adds it if necessary. row_details.set_value(*this, column, datamodel_row, pDbValue->get()); //TODO: Performance: get_path() is really slow. row_changed( get_path(row), row); //g_warning("set_value_impl: value=%s", pDbValue->get().to_string().c_str()); //TODO: DbValue& refValue = datamodel_row->m_db_values[column]; //refValue = pDbValue->get(); //TODO: Performance: get_path() is really slow. //row_changed( get_path(row), row); } } } DbTreeModel::iterator DbTreeModel::erase(const iterator& iter) { iterator iter_result; if(iter_is_valid(iter)) { //Get the index from the user_data: type_datamodel_row_index datamodel_row = get_datamodel_row_index_from_tree_row_iter(iter); //Remove the row. Gtk::TreeModel::Path path_deleted = get_path(iter); if(!(m_map_rows[datamodel_row].m_removed)) { m_map_rows[datamodel_row].m_removed = true; ++m_count_removed_rows; row_deleted(path_deleted); //Get next non-removed row: while(row_was_removed(datamodel_row)) ++datamodel_row; //Return an iterator to the next row: create_iterator(datamodel_row, iter_result); } } return iter_result; } void DbTreeModel::set_key_value(const TreeModel::iterator& iter, const DbValue& value) { //g_warning("DbTreeModel::set_is_placeholder(): val=%d", val); if(check_treeiter_validity(iter)) { type_datamodel_row_index datamodel_row = get_datamodel_row_index_from_tree_row_iter(iter); m_map_rows[datamodel_row].m_key = value; } } DbTreeModel::DbValue DbTreeModel::get_key_value(const TreeModel::iterator& iter) const { if(check_treeiter_validity(iter)) { type_datamodel_row_index datamodel_row = get_datamodel_row_index_from_tree_row_iter(iter); type_map_rows::iterator iterFind = m_map_rows.find(datamodel_row); if(iterFind != m_map_rows.end()) return iterFind->second.m_key; else { DbTreeModelRow& row_details = m_map_rows[datamodel_row]; //Adds it if necessary row_details.fill_values_if_necessary(const_cast(*this), datamodel_row); return row_details.m_key; } } return DbValue(); } bool DbTreeModel::get_is_placeholder(const TreeModel::iterator& iter) const { //g_warning("DbTreeModel::g et_is_placeholder()"); if(check_treeiter_validity(iter)) { type_datamodel_row_index datamodel_row = get_datamodel_row_index_from_tree_row_iter(iter); return (datamodel_row == ((type_datamodel_row_index)get_internal_rows_count() -1)); } return false; } void DbTreeModel::set_is_not_placeholder(const TreeModel::iterator& iter) { if(get_is_placeholder(iter)) { //This row is an extra row (after a refresh it will probably be a row in the database). //So now we need a new row to be the placeholder. append(); } } void DbTreeModel::clear() { //m_rows.clear(); m_map_rows.clear(); } bool DbTreeModel::row_was_removed(const type_datamodel_row_index& datamodel_row) const { type_map_rows::const_iterator iterFind = m_map_rows.find(datamodel_row); if(iterFind != m_map_rows.end()) return iterFind->second.m_removed; else return false; //If it was never accessed before then it has never been removed. } Gtk::TreeModel::iterator DbTreeModel::get_last_row() { iterator result; //Find the last non-removed row: const int rows_count = get_internal_rows_count(); if(rows_count) { type_datamodel_row_index row = rows_count - 1; if(row > 0) //This should always be true, because there is always a placeholder. --row; //Ignore the placeholder. //Step backwards until we find one that is not removed. while((m_map_rows.find(row) != m_map_rows.end()) && m_map_rows[row].m_removed) { if(row) --row; else return result; //failed, because there are no non-removed row. } //std::cout << G_STRFUNC << ": debug: returning row=" << row << std::endl; create_iterator(row, result); } return result; } Gtk::TreeModel::iterator DbTreeModel::get_placeholder_row() { iterator result; //Find the last non-removed row: const int rows_count = get_internal_rows_count(); if(rows_count) { type_datamodel_row_index row = rows_count - 1; //Step backwards until we find one that is not removed: while((m_map_rows.find(row) != m_map_rows.end()) && m_map_rows[row].m_removed) { if(row) --row; else { std::cerr << G_STRFUNC << ": Placeholder row not found." << std::endl; return result; //failed, because there are no non-removed rows. } } type_map_rows::const_iterator iter_map = m_map_rows.find(row); if(iter_map != m_map_rows.end()) { //std::cerr << G_STRFUNC << ": returning row=" << row << std::endl; create_iterator(row, result); } } return result; } void DbTreeModel::get_record_counts(gulong& total, gulong& found) const { if(m_gda_datamodel) { //This doesn't work with iter-only models (it returns -1): found = (gulong)m_gda_datamodel->get_n_rows(); found = m_data_model_rows_count; if(m_found_set.m_where_clause.empty()) total = found; else { //Ask the database how many records there are in the whole table: //TODO: Apparently, this is very slow: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); const Gnome::Gda::SqlBuilder::Id id_function = builder->add_function("count", builder->add_id("*")); //TODO: Is * allowed here? builder->add_field_value_id(id_function); builder->select_add_target(m_found_set.m_table_name); Glib::RefPtr datamodel = DbUtils::query_execute_select(builder); if(datamodel) { if(datamodel->get_n_rows()) { const Gnome::Gda::Value value = datamodel->get_value_at(0, 0); // This will probably fail on Windows, where a long is only 32 bits wide. total = static_cast(value.get_int64()); //I discovered that it's a int64 by trying it. } } } } else { total = 0; found = 0; } } } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/dialog_new_record.h0000644000175000017500000000342112234252646024601 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_DIALOG_NEW_RECORD_H #define GLOM_MODE_DATA_DIALOG_NEW_RECORD_H #include #include #include #include namespace Glom { namespace DataWidgetChildren { class Dialog_NewRecord : public Gtk::Dialog, public View_Composite_Glom { public: static const char* glade_id; static const bool glade_developer; Dialog_NewRecord(); Dialog_NewRecord(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_NewRecord(); bool init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform); bool get_id_chosen(Gnome::Gda::Value& chosen_id) const; private: void setup(); Gtk::Label* m_label_table_name; Gtk::Alignment* m_alignment_parent; Glib::ustring m_table_name; Glib::ustring m_layout_platform; Box_Data_Details m_box_details; }; } //namespace DataWidetChildren } //namespace Glom #endif //GLOM_MODE_DATA_DIALOG_NEW_RECORD_H glom-1.22.4/glom/mode_data/datawidget/label.h0000644000175000017500000000350312234252646022213 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_LABEL_GLOM_H #define GLOM_UTILITY_WIDGETS_LABEL_GLOM_H #include #include #include #include #include #include namespace Glom { class AppWindow; namespace DataWidgetChildren { class Label : public Gtk::EventBox, public LayoutWidgetUtils { public: Label(); explicit Label(const Glib::ustring& label, bool mnemonic = false); explicit Label(const Glib::ustring& label, float xalign, float yalign, bool mnemonic = false); virtual ~Label(); Gtk::Label* get_label(); private: void init(); virtual AppWindow* get_appwindow() const; Gtk::Label m_label; #ifndef GLOM_ENABLE_CLIENT_ONLY virtual bool on_button_press_event(GdkEventButton *event); virtual void on_menu_properties_activate(); #endif // !GLOM_ENABLE_CLIENT_ONLY }; } //namespace DataWidetChildren } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_LABEL_GLOM_H glom-1.22.4/glom/mode_data/datawidget/dialog_choose_id.h0000644000175000017500000000451012234252646024406 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_DIALOG_CHOOSE_ID_H #define GLOM_MODE_DATA_DIALOG_CHOOSE_ID_H #include #include #include #include #include namespace Glom { namespace DataWidgetChildren { class Dialog_ChooseID : public Gtk::Dialog, public View_Composite_Glom { public: static const char* glade_id; static const bool glade_developer; Dialog_ChooseID(); Dialog_ChooseID(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ChooseID(); bool init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform); bool get_id_chosen(Gnome::Gda::Value& chosen_id) const; enum enumStage { STAGE_INVALID, STAGE_FIND, STAGE_SELECT }; private: void setup(); void update_ui_for_stage(); void on_button_quickfind(); void on_box_find_criteria(const Gnome::Gda::SqlExpr& where_clause); void on_box_select_selected(const Gnome::Gda::Value& primary_key); Gtk::Label* m_label_table_name; Gtk::Box* m_pBox_QuickFind; //Only show this when in Find mode. Gtk::Entry* m_pEntry_QuickFind; Gtk::Button* m_pButton_QuickFind; Gtk::Alignment* m_alignment_parent; Glib::ustring m_table_name; Glib::ustring m_layout_platform; Document* m_document; Gnome::Gda::Value m_id_chosen; Box_Data_Details_Find m_box_find; Box_Data_List m_box_select; enumStage m_stage; }; } //namespace DataWidetChildren } //namespace Glom #endif //GLOM_MODE_DATA_DIALOG_CHOOSE_ID_H glom-1.22.4/glom/mode_data/datawidget/combochoiceswithtreemodel.h0000644000175000017500000000757712234252646026405 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_COMBO_CHOICES_WITH_TREE_MODEL_H #define GLOM_MODE_DATA_COMBO_CHOICES_WITH_TREE_MODEL_H #include #include #include namespace Glom { namespace DataWidgetChildren { class ComboChoicesWithTreeModel : public ComboChoices { public: ///You must call set_layout_item() to specify the field type and formatting of the main column. explicit ComboChoicesWithTreeModel(); virtual ~ComboChoicesWithTreeModel(); //This creates a simple ListStore, with a text cell renderer. virtual void set_choices_fixed(const Formatting::type_list_values& list_values, bool restricted = false); //This creates a db-based tree model, with appropriate cell renderers: virtual void set_choices_related(const Document* document, const sharedptr& layout_field, const Gnome::Gda::Value& foreign_key_value); //Not named get_model(), to avoid clashing with ComboBox::get_model(). Glib::RefPtr get_choices_model(); protected: void init(); void create_model_non_db(guint columns_count); /** Get a suitable fixed height for cells, so we can display them more efficiently. * This caches the result to avoid repeated recalculation. */ int get_fixed_cell_height(Gtk::Widget& widget); typedef Gtk::TreeModelColumn type_model_column_string_fixed; typedef std::vector< type_model_column_string_fixed* > type_vec_model_columns_string_fixed; type_vec_model_columns_string_fixed m_vec_model_columns_string_fixed; //If set_choices_fixed() was used. typedef Gtk::TreeModelColumn type_model_column_value_fixed; typedef std::vector< type_model_column_value_fixed* > type_vec_model_columns_value_fixed; type_vec_model_columns_value_fixed m_vec_model_columns_value_fixed; //If set_choices_fixed() was used. /** Get the index of the extra column, at the end, that is just a * text representation of the first column, for use by GtkCombo with has-entry=true, * which accepts only a text column. */ int get_fixed_model_text_column() const; typedef std::vector< sharedptr > type_vec_const_layout_items; type_vec_const_layout_items m_db_layout_items; //If set_choices_related() was used. //This avoids us making on_cell_data() public just so that derived classes can use it, //though that shouldn't be necessary anyway. void cell_connect_cell_data_func(Gtk::CellLayout* celllayout, Gtk::CellRenderer* cell, guint model_column_index); /** Display the value in the cell according to the layout field's type and formatting. */ void set_cell_for_field_value(Gtk::CellRenderer* cell, const sharedptr& field, const Gnome::Gda::Value& value); private: /// Render the model data to the cells in the view. void on_cell_data(const Gtk::TreeModel::iterator& iter, Gtk::CellRenderer* cell, guint model_column_index); Glib::RefPtr m_refModel; void delete_model(); int m_fixed_cell_height; }; } //namespace DataWidetChildren } //namespace Glom #endif // GLOM_MODE_DATA_COMBO_CHOICES_WITH_TREE_MODEL_H glom-1.22.4/glom/mode_data/datawidget/cellrenderer_dblist.h0000644000175000017500000000445312234252646025150 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_DBADDDELL_CELLRENDERDBERLIST_H #define GLOM_UTILITY_WIDGETS_DBADDDELL_CELLRENDERDBERLIST_H #include #include //#include namespace Glom { /** A CellRendererCombo to show database records. * For instance, to show related choices. */ class CellRendererDbList : public Gtk::CellRendererCombo, public DataWidgetChildren::ComboChoicesWithTreeModel { public: CellRendererDbList(); virtual ~CellRendererDbList(); //This creates a simple ListStore, with a text cell renderer. virtual void set_choices_fixed(const Formatting::type_list_values& list_values, bool restricted = false); //This creates a db-based tree model, with appropriate cell renderers: virtual void set_choices_related(const Document* document, const sharedptr& layout_field, const Gnome::Gda::Value& foreign_key_value); void set_restrict_values_to_list(bool val = true); private: virtual void on_editing_started(Gtk::CellEditable* cell_editable, const Glib::ustring& path); virtual void set_value(const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_value() const; void repack_cells_fixed(Gtk::CellLayout* combobox); void repack_cells_related(Gtk::CellLayout* combobox); void set_text(const Glib::ustring& text); Glib::ustring get_text() const; bool m_repacked_first_cell; const Document* m_document; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_DBADDDELL_CELLRENDERDBERLIST_H glom-1.22.4/glom/mode_data/datawidget/datawidget.cc0000644000175000017500000005732512234776363023431 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include "datawidget.h" #include "entry.h" #include "checkbutton.h" #include "label.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Glom { static DataWidgetChildren::ComboChoices* create_combo_widget_for_field(const sharedptr& field) { DataWidgetChildren::ComboChoices* result = 0; bool as_radio_buttons = false; const bool restricted = field->get_formatting_used().get_choices_restricted(as_radio_buttons); if(restricted) { if(as_radio_buttons) result = Gtk::manage(new DataWidgetChildren::ComboAsRadioButtons()); else result = Gtk::manage(new DataWidgetChildren::ComboGlom()); } else result = Gtk::manage(new DataWidgetChildren::ComboGlom(true /* has_entry */)); return result; } DataWidget::DataWidget(const sharedptr& field, const Glib::ustring& table_name, const Document* document) : m_child(0), m_button_go_to_details(0) { const Field::glom_field_type glom_type = field->get_glom_type(); set_layout_item(field, table_name); //The GNOME HIG says that labels should have ":" at the end: //http://library.gnome.org/devel/hig-book/stable/design-text-labels.html.en const Glib::ustring title = Glib::ustring::compose(_("%1:"), item_get_title_or_name(field)); m_child = 0; LayoutWidgetField* pFieldWidget = 0; if(glom_type == Field::TYPE_BOOLEAN) { DataWidgetChildren::CheckButton* checkbutton = Gtk::manage( new DataWidgetChildren::CheckButton() ); checkbutton->show(); checkbutton->signal_toggled().connect( sigc::mem_fun(*this, &DataWidget::on_widget_edited) ); //TODO: entry->signal_user_requested_layout().connect( sigc::mem_fun(*this, &DataWidget::on_child_user_requested_layout ); m_child = checkbutton; pFieldWidget = checkbutton; m_label.set_label(title); m_label.set_alignment(0); m_label.show(); } else if(glom_type == Field::TYPE_IMAGE) { ImageGlom* image = Gtk::manage( new ImageGlom() ); image->set_size_request(200, 200); //Gtk::Image* image = Gtk::manage( new Gtk::Image("/home/murrayc/gnome-small.jpg") ); image->show(); //TODO: Respond to double-click: checkbutton->signal_toggled().connect( sigc::mem_fun(*this, &DataWidget::on_widget_edited) ); //TODO: entry->signal_user_requested_layout().connect( sigc::mem_fun(*this, &DataWidget::on_child_user_requested_layout ); m_child = image; pFieldWidget = image; m_label.set_label(title); m_label.set_alignment(0); m_label.show(); } else { m_label.set_label(title); m_label.set_alignment(0); m_label.show(); //Use a Combo if there is a drop-down of choices (A "value list"), else an Entry: if(field->get_formatting_used().get_has_choices()) { DataWidgetChildren::ComboChoices* combo = create_combo_widget_for_field(field); if(field->get_formatting_used().get_has_custom_choices()) { //set_choices_fixed() needs this, for the numeric layout: combo->set_layout_item( get_layout_item(), table_name); const Formatting& formatting = field->get_formatting_used(); bool as_radio_buttons = false; //Ignored; combo->set_choices_fixed( formatting.get_choices_custom(), formatting.get_choices_restricted(as_radio_buttons)); } else if(field->get_formatting_used().get_has_related_choices()) { combo = create_combo_widget_for_field(field); combo->set_layout_item( get_layout_item(), table_name); combo->set_choices_related(document, field, Gnome::Gda::Value() /* no ID means show all related records */); } else { std::cerr << G_STRFUNC << ": Unexpected choice type." << std::endl; } pFieldWidget = combo; } else { if((glom_type == Field::TYPE_TEXT) && (field->get_formatting_used().get_text_format_multiline())) { DataWidgetChildren::TextView* textview = Gtk::manage(new DataWidgetChildren::TextView(glom_type)); pFieldWidget = textview; } else //TYPE_DATE, TYPE_NUMBER, etc. { DataWidgetChildren::Entry* entry = Gtk::manage(new DataWidgetChildren::Entry(glom_type)); pFieldWidget = entry; } if(pFieldWidget) pFieldWidget->set_layout_item( get_layout_item(), table_name); //TODO_Performance: We only need this for the numerical format. } } if(pFieldWidget) { pFieldWidget->signal_edited().connect( sigc::mem_fun(*this, &DataWidget::on_widget_edited) ); #ifndef GLOM_ENABLE_CLIENT_ONLY pFieldWidget->signal_user_requested_layout().connect( sigc::mem_fun(*this, &DataWidget::on_child_user_requested_layout) ); pFieldWidget->signal_user_requested_layout_properties().connect( sigc::mem_fun(*this, &DataWidget::on_child_user_requested_layout_properties) ); pFieldWidget->signal_layout_item_added().connect( sigc::mem_fun(*this, &DataWidget::on_child_layout_item_added) ); #endif // !GLOM_ENABLE_CLIENT_ONLY m_child = dynamic_cast(pFieldWidget); set_child_size_by_field(field); m_child->show_all(); } if(m_child) { //Use the text formatting: apply_formatting(*m_child, field); bool child_added = false; //Don't use an extra container unless necessary. //Update the field details from the document: field->set_full_field_details( document->get_field(field->get_table_used(table_name), field->get_name()) ); //Otherwise get_primary_key() returns false always. sharedptr field_used_in_relationship_to_one; const bool add_open_button = DbUtils::layout_field_should_have_navigation(table_name, field, document, field_used_in_relationship_to_one); Gtk::Box* hbox_parent = 0; //Only used if there are extra widgets. const bool with_extra_widgets = field_used_in_relationship_to_one || add_open_button || (glom_type == Field::TYPE_DATE); if(with_extra_widgets) { hbox_parent = Gtk::manage( new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL) ); //We put the child (and any extra stuff) in this: hbox_parent->set_spacing(Utils::DEFAULT_SPACING_SMALL); hbox_parent->pack_start(*m_child); hbox_parent->show(); add(*hbox_parent); child_added = true; } if(glom_type == Field::TYPE_DATE) { //Let the user choose a date from a calendar dialog: Gtk::Button* button_date = Gtk::manage(new Gtk::Button(_("..."))); //TODO: A better label/icon for "Choose Date". button_date->set_tooltip_text(_("Choose a date from an on-screen calendar.")); button_date->show(); hbox_parent->pack_start(*button_date, Gtk::PACK_SHRINK); button_date->signal_clicked().connect(sigc::mem_fun(*this, &DataWidget::on_button_choose_date)); } if(hbox_parent && add_open_button) { //Add a button for related record navigation: m_button_go_to_details = Gtk::manage(new Gtk::Button(Gtk::Stock::OPEN)); m_button_go_to_details->set_tooltip_text(_("Open the record identified by this ID, in the other table.")); hbox_parent->pack_start(*m_button_go_to_details, Gtk::PACK_SHRINK); m_button_go_to_details->signal_clicked().connect(sigc::mem_fun(*this, &DataWidget::on_button_open_details)); //Add an additional button to make it easier to choose an ID for this field. //Don't add this for simple related primary key fields, because they //can generally not be edited via another table's layout. if(field_used_in_relationship_to_one) { Gtk::Button* button_select = Gtk::manage(new Gtk::Button(Gtk::Stock::FIND)); button_select->set_tooltip_text(_("Enter search criteria to identify records in the other table, to choose an ID for this field.")); hbox_parent->pack_start(*button_select, Gtk::PACK_SHRINK); button_select->signal_clicked().connect(sigc::mem_fun(*this, &DataWidget::on_button_select_id)); Gtk::Button* button_new = Gtk::manage(new Gtk::Button(Gtk::Stock::NEW)); button_new->set_tooltip_text(_("Enter details for a new record in the other table, then use its ID for this field.")); hbox_parent->pack_start(*button_new, Gtk::PACK_SHRINK); button_new->signal_clicked().connect(sigc::mem_fun(*this, &DataWidget::on_button_new_id)); } } if(!child_added) add(*m_child); } #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // GLOM_ENABLE_CLIENT_ONLY set_events(Gdk::BUTTON_PRESS_MASK); //TODO: signal_style_changed().connect(sigc::mem_fun(*this, &DataWidget::on_self_style_changed)); } DataWidget::~DataWidget() { } void DataWidget::on_widget_edited() { m_signal_edited.emit(get_value()); update_go_to_details_button_sensitivity(); } DataWidget::type_signal_edited DataWidget::signal_edited() { return m_signal_edited; } DataWidget::type_signal_choices_changed DataWidget::signal_choices_changed() { return m_signal_choices_changed; } void DataWidget::set_value(const Gnome::Gda::Value& value) { Gtk::Widget* widget = get_data_child_widget(); LayoutWidgetField* generic_field_widget = dynamic_cast(widget); if(generic_field_widget) { //if(generic_field_widget->get_layout_item()) // std::cout << "debug: " << G_STRFUNC << ": generic_field_widget->get_layout_item()->get_name()=" << generic_field_widget->get_layout_item()->get_name() << std::endl; generic_field_widget->set_value(value); } else { Gtk::CheckButton* checkbutton = dynamic_cast(widget); if(checkbutton) { bool bValue = false; if(!value.is_null() && value.get_value_type() == G_TYPE_BOOLEAN) bValue = value.get_boolean(); checkbutton->set_active( bValue ); } } update_go_to_details_button_sensitivity(); } void DataWidget::update_go_to_details_button_sensitivity() { //If there is a Go-To-Details "Open" button, only enable it if there is //an ID: if(m_button_go_to_details) { const Gnome::Gda::Value value = get_value(); const bool enabled = !Conversions::value_is_empty(value); m_button_go_to_details->set_sensitive(enabled); } } Gnome::Gda::Value DataWidget::get_value() const { const Gtk::Widget* widget = get_data_child_widget(); const LayoutWidgetField* generic_field_widget = dynamic_cast(widget); if(generic_field_widget) return generic_field_widget->get_value(); else { const Gtk::CheckButton* checkbutton = dynamic_cast(widget); if(checkbutton) { return Gnome::Gda::Value(checkbutton->get_active()); } else return Gnome::Gda::Value(); //null. } } Gtk::Label* DataWidget::get_label() { return &m_label; } const Gtk::Label* DataWidget::get_label() const { return &m_label; } void DataWidget::set_child_size_by_field(const sharedptr& field) { const Field::glom_field_type glom_type = field->get_glom_type(); int width = get_suitable_width(field); if(glom_type == Field::TYPE_IMAGE) //GtkImage widgets default to no size (invisible) if they are empty. m_child->set_size_request(width, width); else { int height = -1; //auto. if((glom_type == Field::TYPE_TEXT) && (field->get_formatting_used().get_text_format_multiline())) { int example_width = 0; int example_height = 0; Glib::RefPtr refLayout = create_pango_layout("example"); //TODO: Use different text, according to the current locale, or allow the user to choose an example? refLayout->get_pixel_size(example_width, example_height); if(example_height > 0) height = example_height * field->get_formatting_used().get_text_format_multiline_height_lines(); } m_child->set_size_request(width, height); } } int DataWidget::get_suitable_width(const sharedptr& field_layout) { return Utils::get_suitable_field_width_for_widget(*this, field_layout); } void DataWidget::set_viewable(bool viewable) { Gtk::Widget* child = get_data_child_widget(); Gtk::Entry* entry = dynamic_cast(child); if(entry) entry->set_visibility(viewable); //TODO: This is not an ideal way to show non-viewable fields.. else { Gtk::CheckButton* checkbutton = dynamic_cast(child); if(checkbutton) checkbutton->set_property("inconsistent", !viewable); } } void DataWidget::set_editable(bool editable) { Gtk::Widget* child = get_data_child_widget(); Gtk::Editable* gtkeditable = dynamic_cast(child); if(gtkeditable) { gtkeditable->set_editable(editable); return; } //GtkTextView does not implement GtkEditable: //See https://bugzilla.gnome.org/show_bug.cgi?id=667008 //and our TextView class actually derives from ScrolledView anyway, //and out LayoutWidgetBase::set_read_only() override takes care of it instead. //But let's leave this here just in case: Gtk::TextView* textview = dynamic_cast(child); if(textview) { textview->set_editable(editable); return; } LayoutWidgetBase* base = dynamic_cast(child); if(base) { base->set_read_only(!editable); return; } Gtk::CheckButton* checkbutton = dynamic_cast(child); if(checkbutton) checkbutton->set_sensitive(editable); } #ifndef GLOM_ENABLE_CLIENT_ONLY bool DataWidget::on_button_press_event(GdkEventButton *event) { //g_warning("DataWidget::on_button_press_event_popup"); //Enable/Disable items. //We did this earlier, but get_appwindow is more likely to work now: AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->add_developer_action(m_refContextAddField); pApp->add_developer_action(m_refContextAddRelatedRecords); pApp->add_developer_action(m_refContextAddGroup); pApp->update_userlevel_ui(); //Update our action's sensitivity. //Only show this popup in developer mode, so operators still see the default GtkEntry context menu. //TODO: It would be better to add it somehow to the standard context menu. if(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); return true; //We handled this event. } } } return Gtk::EventBox::on_button_press_event(event); } sharedptr DataWidget::offer_field_list(const Glib::ustring& table_name) { return offer_field_list(table_name, sharedptr()); } sharedptr DataWidget::offer_field_list(const Glib::ustring& table_name, const sharedptr& start_field) { return offer_field_list(table_name, start_field, get_document(), get_appwindow()); } sharedptr DataWidget::offer_field_list(const Glib::ustring& table_name, const sharedptr& start_field, Document* document, AppWindow* app) { sharedptr result; Dialog_ChooseField* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(dialog) { dialog->set_document(document, table_name, start_field); if(app) dialog->set_transient_for(*app); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen field: result = dialog->get_field_chosen(); } delete dialog; } return result; } sharedptr DataWidget::offer_field_layout(const sharedptr& start_field) { sharedptr result; Dialog_FieldLayout* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; add_view(dialog); //Give it access to the document. dialog->set_field(start_field, m_table_name); Gtk::Window* parent = get_appwindow(); if(parent) dialog->set_transient_for(*parent); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen field: result = dialog->get_field_chosen(); } remove_view(dialog); delete dialog; return result; } void DataWidget::on_menupopup_activate_layout() { //finish_editing(); sharedptr layoutField = sharedptr::cast_dynamic(get_layout_item()); if(layoutField) { sharedptr itemchosen = offer_field_list(m_table_name, layoutField); if(itemchosen) { *layoutField = *itemchosen; signal_layout_changed().emit(); } } } void DataWidget::on_menupopup_activate_layout_properties() { //finish_editing(); sharedptr layoutField = sharedptr::cast_dynamic(get_layout_item()); if(layoutField) { sharedptr itemchosen = offer_field_layout(layoutField); if(itemchosen) { *layoutField = *itemchosen; //set_layout_item(itemchosen, m_table_name); signal_layout_changed().emit(); } } } void DataWidget::on_child_user_requested_layout_properties() { on_menupopup_activate_layout_properties(); } void DataWidget::on_child_user_requested_layout() { on_menupopup_activate_layout(); } #endif // !GLOM_ENABLE_CLIENT_ONLY AppWindow* DataWidget::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } #ifndef GLOM_ENABLE_CLIENT_ONLY void DataWidget::on_child_layout_item_added(LayoutWidgetBase::enumType item_type) { //Tell the parent widget that this widget wants to add an item: signal_layout_item_added().emit(item_type); } #endif // !GLOM_ENABLE_CLIENT_ONLY Gtk::Widget* DataWidget::get_data_child_widget() { return m_child; } const Gtk::Widget* DataWidget::get_data_child_widget() const { return m_child; } DataWidget::type_signal_open_details_requested DataWidget::signal_open_details_requested() { return m_signal_open_details_requested; } void DataWidget::on_button_open_details() { signal_open_details_requested().emit(get_value()); } void DataWidget::on_button_select_id() { Gnome::Gda::Value chosen_id; bool chosen = offer_related_record_id_find(chosen_id); if(chosen) { set_value(chosen_id); m_signal_edited.emit(chosen_id); } } void DataWidget::on_button_new_id() { Gnome::Gda::Value chosen_id; const bool chosen = offer_related_record_id_new(chosen_id); if(!chosen) return; //Update the choices, if any, to show the new related record: m_signal_choices_changed.emit(); set_value(chosen_id); m_signal_edited.emit(chosen_id); } void DataWidget::on_button_choose_date() { DataWidgetChildren::Dialog_ChooseDate* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(dialog) { Gtk::Window* parent = get_appwindow(); //This doesn't work (and would be wrong) when the widget is in a Field Definitions dialog. if(parent) dialog->set_transient_for(*parent); dialog->set_date_chosen(get_value()); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen date const Gnome::Gda::Value value = dialog->get_date_chosen(); set_value(value); m_signal_edited.emit(value); } delete dialog; } } void DataWidget::on_self_style_changed(const Glib::RefPtr& /* style */) { sharedptr layoutField = sharedptr::cast_dynamic(get_layout_item()); set_child_size_by_field(layoutField); } bool DataWidget::offer_related_record_id_find(Gnome::Gda::Value& chosen_id) { bool result = false; //Initialize output variable: chosen_id = Gnome::Gda::Value(); DataWidgetChildren::Dialog_ChooseID* dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(dialog); if(dialog) { //dialog->set_document(get_document(), table_name, field); Gtk::Window* parent = get_appwindow(); if(parent) dialog->set_transient_for(*parent); add_view(dialog); //Discover the related table, in the relationship that uses this ID field: Glib::ustring related_table_name; sharedptr layoutField = sharedptr::cast_dynamic(get_layout_item()); if(layoutField) { sharedptr relationship = get_document()->get_field_used_in_relationship_to_one(m_table_name, layoutField); if(relationship) related_table_name = relationship->get_to_table(); } else g_warning("get_layout_item() was not a LayoutItem_Field"); dialog->init_db_details(related_table_name, Base_DB::get_active_layout_platform(get_document())); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen field: result = dialog->get_id_chosen(chosen_id); } remove_view(dialog); delete dialog; } return result; } bool DataWidget::offer_related_record_id_new(Gnome::Gda::Value& chosen_id) { bool result = false; //Initialize output variable: chosen_id = Gnome::Gda::Value(); DataWidgetChildren::Dialog_NewRecord* dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(dialog); if(dialog) { //dialog->set_document(get_document(), table_name, field); Gtk::Window* parent = get_appwindow(); if(parent) dialog->set_transient_for(*parent); add_view(dialog); //Discover the related table, in the relationship that uses this ID field: Glib::ustring related_table_name; sharedptr layoutField = sharedptr::cast_dynamic(get_layout_item()); if(layoutField) { sharedptr relationship = get_document()->get_field_used_in_relationship_to_one(m_table_name, layoutField); if(relationship) related_table_name = relationship->get_to_table(); } else g_warning("get_layout_item() was not a LayoutItem_Field"); dialog->init_db_details(related_table_name, Base_DB::get_active_layout_platform(get_document())); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen ID: result = dialog->get_id_chosen(chosen_id); } remove_view(dialog); delete dialog; } return result; } } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/datawidget.h0000644000175000017500000001277512234252646023264 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_DATAWIDGET_H #define GLOM_UTILITY_WIDGETS_DATAWIDGET_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include #include //Forthe enum. #include #include namespace Glom { class AppWindow; class DataWidget : public Gtk::EventBox, public LayoutWidgetMenu, public View_Composite_Glom { public: explicit DataWidget(const sharedptr& field, const Glib::ustring& table_name, const Document* document); virtual ~DataWidget(); virtual Gtk::Label* get_label(); virtual const Gtk::Label* get_label() const; //Override this so we can store the text to compare later. //This is not virtual, so you must not use it via Gtk::Entry. //virtual void set_text(const Glib::ustring& text); //override virtual void set_value(const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_value() const; virtual void set_editable(bool editable = true); virtual void set_viewable(bool viewable = true); #ifndef GLOM_ENABLE_CLIENT_ONLY static sharedptr offer_field_list(const Glib::ustring& table_name, const sharedptr& start_field, Document* document, AppWindow* app); sharedptr offer_field_list(const Glib::ustring& table_name); sharedptr offer_field_list(const Glib::ustring& table_name, const sharedptr& start_field); sharedptr offer_field_layout(const sharedptr& start_field); #endif // !GLOM_ENABLE_CLIENT_ONLY /// Get the actual child widget used to show the data: Gtk::Widget* get_data_child_widget(); const Gtk::Widget* get_data_child_widget() const; typedef sigc::signal type_signal_edited; type_signal_edited signal_edited(); typedef sigc::signal type_signal_open_details_requested; type_signal_open_details_requested signal_open_details_requested(); /** For instance, * void on_choices_changed(); */ typedef sigc::signal type_signal_choices_changed; /** This is emitted when the related records, used by a choices combobox, * have been changed. For instance, when the user adds a new choice via the "New" button. */ type_signal_choices_changed signal_choices_changed(); private: //virtual void setup_menu(); //Overrides of default signal handlers: void on_widget_edited(); //From Gtk::Entry, or Gtk::CheckButton. #ifndef GLOM_ENABLE_CLIENT_ONLY virtual bool on_button_press_event(GdkEventButton* event); //override. virtual void on_child_user_requested_layout(); virtual void on_child_user_requested_layout_properties(); virtual void on_child_layout_item_added(LayoutWidgetBase::enumType item_type); #endif // !GLOM_ENABLE_CLIENT_ONLY void on_button_open_details(); void on_button_select_id(); void on_button_new_id(); void on_button_choose_date(); // Don't call it on_style_changed, otherwise we would override a virtual // function from Gtk::Widget. We could indeed do that, but we do it with // a normal signal handler, because we have to do it this way anyway in // case default signal handlers have been disabled in glibmm. void on_self_style_changed(const Glib::RefPtr& style); #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void on_menupopup_activate_layout(); //override virtual void on_menupopup_activate_layout_properties(); //override //virtual void on_menupopup_add_item(LayoutWidgetBase::enumType item); #endif // !GLOM_ENABLE_CLIENT_ONLY virtual AppWindow* get_appwindow() const; void set_child_size_by_field(const sharedptr& field); int get_suitable_width(const sharedptr& field_layout); /** Show a dialog with a Find so that the user can choose an ID value to indicate the related record. */ bool offer_related_record_id_find(Gnome::Gda::Value& chosen_id); /** Show a dialog with Details so that the user can add a new record and then use that ID value to indicate that related record. */ bool offer_related_record_id_new(Gnome::Gda::Value& chosen_id); private: void update_go_to_details_button_sensitivity(); protected: type_signal_edited m_signal_edited; type_signal_open_details_requested m_signal_open_details_requested; type_signal_choices_changed m_signal_choices_changed; Gtk::Label m_label; Gtk::Widget* m_child; Gtk::Button* m_button_go_to_details; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_DATAWIDGET_H glom-1.22.4/glom/mode_data/datawidget/cellrenderer_buttontext.cc0000644000175000017500000000354312234776363026253 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "cellrenderer_buttontext.h" namespace Glom { GlomCellRenderer_ButtonText::GlomCellRenderer_ButtonText(): Glib::ObjectBase("GlomCellRenderer_ButtonText") // Create a new GType for us { //const Gtk::StockID stock_id = Gtk::Stock::OPEN; //A default. //property_stock_id() = stock_id.get_string(); set_property("mode", Gtk::CELL_RENDERER_MODE_ACTIVATABLE); //So that it calls activate_vfunc(). } GlomCellRenderer_ButtonText::~GlomCellRenderer_ButtonText() {} GlomCellRenderer_ButtonText::type_signal_clicked GlomCellRenderer_ButtonText::signal_clicked() { return m_signal_clicked; } bool GlomCellRenderer_ButtonText::activate_vfunc(GdkEvent* event, Gtk::Widget& widget, const Glib::ustring& path, const Gdk::Rectangle& background_area, const Gdk::Rectangle& cell_area, Gtk::CellRendererState flags) { //TODO: It would be nice to depress this like a real button. //Call base class: bool result = CellRendererText::activate_vfunc(event, widget, path, background_area, cell_area, flags); m_signal_clicked.emit( Gtk::TreeModel::Path(path) ); return result; } } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/cellrenderer_dblist.cc0000644000175000017500000002130212234252646025276 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "cellrenderer_dblist.h" #include #include #include #include #include namespace Glom { CellRendererDbList::CellRendererDbList() : m_repacked_first_cell(false), m_document(0) { } CellRendererDbList::~CellRendererDbList() { } void CellRendererDbList::set_choices_fixed(const Formatting::type_list_values& list_values, bool restricted) { ComboChoicesWithTreeModel::set_choices_fixed(list_values, restricted); Glib::RefPtr model = get_choices_model(); //Show model in the view: property_model() = model; property_text_column() = get_fixed_model_text_column(); //This must be a text column, in m_refModel. property_editable() = true; //It would be useless if we couldn't edit it. //The other cells are added in on_editing_started(). } void CellRendererDbList::set_choices_related(const Document* document, const sharedptr& layout_field, const Gnome::Gda::Value& foreign_key_value) { ComboChoicesWithTreeModel::set_choices_related(document, layout_field, foreign_key_value); Glib::RefPtr model = get_choices_model(); if(!model) { std::cerr << G_STRFUNC << ": model is null" << std::endl; } //Show model in the view: property_model() = model; Glib::RefPtr model_db = Glib::RefPtr::cast_dynamic(model); if(model_db) property_text_column() = model_db->get_text_column(); else { std::cerr << G_STRFUNC << ": The model is not a DbTreeModelWithExtraText." << std::endl; return; } property_editable() = true; //It would be useless if we couldn't edit it. //The other cells are added in on_editing_started(), //which uses the document. m_document = document; } void CellRendererDbList::set_restrict_values_to_list(bool val) { property_has_entry() = !val; } void CellRendererDbList::repack_cells_fixed(Gtk::CellLayout* combobox) { //We need an actual widget, to guess the fixed cell height. Gtk::Widget* widget = dynamic_cast(combobox); if(!widget) { std::cerr << G_STRFUNC << ": widget is null." << std::endl; } if(!m_repacked_first_cell) { //Get the default column, created by set_text_column(): Gtk::CellRendererText* cell = dynamic_cast(combobox->get_first_cell()); //Unpack and repack it with expand=false instead of expand=true: //We don't expand the first column, so we can align the other columns. cell->reference(); combobox->clear(); combobox->pack_start(*cell, false); cell->unreference(); //Make the renderer render the column: combobox->add_attribute(*cell, "text", get_fixed_model_text_column()); cell->property_xalign() = 0.0f; m_repacked_first_cell = true; //Avoid doing this again. } //Add extra cells: Glib::ListHandle cells = combobox->get_cells(); if(cells.size() < m_vec_model_columns_value_fixed.size()) { for(guint col = cells.size(); col != m_vec_model_columns_value_fixed.size(); ++col) { Gtk::CellRenderer* cell = 0; if(m_db_layout_items.empty()) cell = Gtk::manage(new Gtk::CellRendererText); else if(col < m_db_layout_items.size()) { sharedptr layout_item = m_db_layout_items[col]; cell = create_cell(layout_item, m_table_name, m_document, get_fixed_cell_height(*widget)); } if(!cell) continue; //Use the renderer: combobox->pack_start(*cell, true); //Make the renderer render the column: combobox->add_attribute(*cell, "text", col); cell->property_xalign() = 0.0f; } } } void CellRendererDbList::repack_cells_related(Gtk::CellLayout* combobox) { //We need an actual widget, to guess the fixed cell height. Gtk::Widget* widget = dynamic_cast(combobox); if(!widget) { std::cerr << G_STRFUNC << ": widget is null." << std::endl; } const std::vector cells = combobox->get_cells(); const guint initial_cells_count = cells.size(); guint i = 0; for(type_vec_const_layout_items::const_iterator iter = m_db_layout_items.begin(); iter != m_db_layout_items.end(); ++iter) { const sharedptr layout_item = *iter; Gtk::CellRenderer* cell = 0; if(i == 0 && !m_repacked_first_cell) { //Get the default column, created by set_text_column(): cell = combobox->get_first_cell(); if(!cell) { //This is normal, for instance if the item is meant to be hidden. //std::cerr << G_STRFUNC << ": get_first_cell() returned null." << std::endl; } else { //Unpack and repack it with expand=false instead of expand=true: //We don't expand the first column, so we can align the other columns. cell->reference(); combobox->clear(); combobox->pack_start(*cell, false); cell->unreference(); cell_connect_cell_data_func(combobox, cell, i); m_repacked_first_cell = true; } } else if(i >= initial_cells_count) { //Create the cell: cell = create_cell(layout_item, m_table_name, m_document, get_fixed_cell_height(*widget)); if(!cell) { std::cerr << G_STRFUNC << ": create_cell() return 0." << std::endl; } else { combobox->pack_start(*cell, true); cell_connect_cell_data_func(combobox, cell, i); } } ++i; } } void CellRendererDbList::on_editing_started(Gtk::CellEditable* cell_editable, const Glib::ustring& path) { //This can happen if no text-column has been set yet, //though that shouldn't really happen. if(!cell_editable) { std::cerr << G_STRFUNC << ": cell_editable was null" << std::endl; return; } Gtk::CellLayout* combobox = dynamic_cast(cell_editable); if(!combobox) return; //The DB model has a special virtual text column, //and the simple model just has text in all columns: Glib::RefPtr model_db = Glib::RefPtr::cast_dynamic(get_choices_model()); if(model_db) repack_cells_related(combobox); else repack_cells_fixed(combobox); Gtk::CellRenderer::on_editing_started(cell_editable, path); } void CellRendererDbList::set_value(const Gnome::Gda::Value& value) { sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); if(!layout_item) return; set_text(Conversions::get_text_for_gda_value(layout_item->get_glom_type(), value, layout_item->get_formatting_used().m_numeric_format)); //Show a different color if the value is numeric, if that's specified: /* TODO: if(layout_item->get_glom_type() == Field::TYPE_NUMERIC) { std::vector cells = get_cells(); if(cells.empty()) return; Gtk::CellRendererText* cell = dynamic_cast(cells[0]); if(!cell) return; const Glib::ustring fg_color = layout_item->get_formatting_used().get_text_format_color_foreground_to_use(value); if(fg_color.empty()) { //GtkComboBox doesn't interpret "" as an unset. TODO: Fix that? cell->property_foreground_set() = false; } else cell->property_foreground() = fg_color; } */ } Gnome::Gda::Value CellRendererDbList::get_value() const { sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); bool success = false; const Glib::ustring text = get_text(); return Conversions::parse_value(layout_item->get_glom_type(), text, layout_item->get_formatting_used().m_numeric_format, success); } void CellRendererDbList::set_text(const Glib::ustring& text) { property_text() = text; } Glib::ustring CellRendererDbList::get_text() const { return property_text(); } } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/entry.h0000644000175000017500000000523212234252646022276 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_ENTRY_H #define GLOM_MODE_DATA_ENTRY_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include #include #include namespace Glom { class AppWindow; namespace DataWidgetChildren { class Entry : public Gtk::Entry, public LayoutWidgetField { public: explicit Entry(BaseObjectType* cobject, const Glib::RefPtr& builder); explicit Entry(Field::glom_field_type glom_type = Field::TYPE_TEXT); virtual ~Entry(); virtual void set_layout_item(const sharedptr& layout_item, const Glib::ustring& table_name); void set_glom_type(Field::glom_field_type glom_type); //Override this so we can store the text to compare later. //This is not virtual, so you must not use it via Gtk::Entry. void set_text(const Glib::ustring& text); //override /** Set the text from a Gnome::Gda::Value. */ virtual void set_value(const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_value() const; virtual void set_read_only(bool read_only = true); private: void init(); //Overrides of default signal handlers: virtual void on_changed(); //From Gtk::Entry. virtual void on_activate(); //From Gtk::Entry. virtual bool on_focus_out_event(GdkEventFocus* event); //From Gtk::Widget virtual void check_for_change(); #ifndef GLOM_ENABLE_CLIENT_ONLY virtual bool on_button_press_event(GdkEventButton *event); //override #endif // !GLOM_ENABLE_CLIENT_ONLY virtual AppWindow* get_appwindow() const; Glib::ustring m_old_text; Field::glom_field_type m_glom_type; //Store the type so we can validate the text accordingly. //Gnome::Gda::Value m_value; //The last-stored value. We have this because the displayed value might be unparseable. }; } //namespace DataWidetChildren } //namespace Glom #endif // GLOM_MODE_DATA_ENTRY_H glom-1.22.4/glom/mode_data/datawidget/cellrenderer_buttonimage.h0000644000175000017500000000304112234252646026175 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_CELLRENDERER_BUTTONIMAGE_H #define GLOM_CELLRENDERER_BUTTONIMAGE_H #include #include #include namespace Glom { class GlomCellRenderer_ButtonImage : public Gtk::CellRendererPixbuf { public: GlomCellRenderer_ButtonImage(); virtual ~GlomCellRenderer_ButtonImage(); typedef sigc::signal type_signal_clicked; type_signal_clicked signal_clicked(); private: virtual bool activate_vfunc(GdkEvent* event, Gtk::Widget& widget, const Glib::ustring& path, const Gdk::Rectangle& background_area, const Gdk::Rectangle& cell_area, Gtk::CellRendererState flags); type_signal_clicked m_signal_clicked; }; } //namespace Glom #endif //GLOM_CELLRENDERER_BUTTONIMAGE_H glom-1.22.4/glom/mode_data/datawidget/treemodel_db_withextratext.h0000644000175000017500000000536012234252646026570 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_DB_TREEMODEL_WITHEXTRATEXTH #define GLOM_UTILITY_WIDGETS_DB_TREEMODEL_WITHEXTRATEXTH #include namespace Glom { /** This awkward class is just a version of DbTreeModel that has an * extra text column that is a text representation of the primary key, * for use in a GtkCombo with has_entry, which requires a text column in the model. */ class DbTreeModelWithExtraText : public DbTreeModel { public: private: DbTreeModelWithExtraText(const FoundSet& found_set, const type_vec_const_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown); virtual ~DbTreeModelWithExtraText(); public: /** A convenience method, creating the model from a list of LayoutItems, * instead of a list of LayoutItem_Fields. */ static Glib::RefPtr create(const FoundSet& found_set, const type_vec_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown); /** A convenience method, creating the model from a list of LayoutItems, * instead of a list of LayoutItem_Fields. * Any LayoutItem_Fields should already have their full field details. */ static Glib::RefPtr create(const FoundSet& found_set, const type_vec_const_layout_items& layout_items, bool get_records, bool find_mode, Base_DB::type_vecConstLayoutFields& fields_shown); /** This column is a text representation of the first field column. */ int get_text_column() const; private: virtual int get_n_columns_vfunc() const; virtual GType get_column_type_vfunc(int index) const; virtual void get_value_vfunc(const TreeModel::iterator& iter, int column, Glib::ValueBase& value) const; int m_column_index_first; //The index of the first field in the TreeModel. sharedptr m_item_first; }; } //namespace Glom #endif // GLOM_UTILITY_WIDGETS_DB_TREEMODEL_WITHEXTRATEXTH glom-1.22.4/glom/mode_data/datawidget/label.cc0000644000175000017500000000653212234776363022365 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "label.h" #include #include #include #include #include #include //#include //For stringstream namespace Glom { namespace DataWidgetChildren { Label::Label() { init(); } Label::Label(const Glib::ustring& label, bool mnemonic) : m_label(label, mnemonic) { init(); } Label::Label(const Glib::ustring& label, float xalign, float yalign, bool mnemonic) : m_label(label, xalign, yalign, mnemonic) { init(); } Label::~Label() { } void Label::init() { add(m_label); m_label.show(); set_events(Gdk::ALL_EVENTS_MASK); //This would be more efficient if we were only using the (base) EventBox to get events, //but we also want to allow changing of the background color, so we don't use it: set_visible_window(false); //Otherwise the label could demand a huge width if there is lots of text. m_label.set_line_wrap(); } AppWindow* Label::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Label::on_menu_properties_activate() { sharedptr textobject = sharedptr::cast_dynamic(m_pLayoutItem); if(!textobject) return; Dialog_TextObject* dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_textobject(textobject, m_table_name); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: dialog->get_textobject(textobject); } signal_layout_changed().emit(); delete dialog; } bool Label::on_button_press_event(GdkEventButton *event) { AppWindow* pApp = get_appwindow(); if(pApp && pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pPopupMenuUtils->popup(event->button, event->time); return true; //We handled this event. } } return Gtk::EventBox::on_button_press_event(event); } #endif // !GLOM_ENABLE_CLIENT_ONLY Gtk::Label* Label::get_label() { return &m_label; } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/dialog_new_record.cc0000644000175000017500000000502612234252646024742 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_new_record.h" #include //For bold_message()). #include //#include #include namespace Glom { namespace DataWidgetChildren { const char* Dialog_NewRecord::glade_id("dialog_new_record"); const bool Dialog_NewRecord::glade_developer(false); Dialog_NewRecord::Dialog_NewRecord() : m_label_table_name(0), m_alignment_parent(0) { } Dialog_NewRecord::Dialog_NewRecord(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_label_table_name(0), m_alignment_parent(0) { builder->get_widget("label_table_name", m_label_table_name); builder->get_widget("alignment_parent", m_alignment_parent); setup(); } Dialog_NewRecord::~Dialog_NewRecord() { remove_view(&m_box_details); } void Dialog_NewRecord::setup() { m_box_details.show_layout_toolbar(false); m_alignment_parent->add(m_box_details); //Fill composite view: add_view(&m_box_details); } bool Dialog_NewRecord::get_id_chosen(Gnome::Gda::Value& chosen_id) const { chosen_id = m_box_details.get_primary_key_value_selected(); return true; } bool Dialog_NewRecord::init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform) { m_table_name = table_name; m_layout_platform = layout_platform; m_label_table_name->set_text( get_document()->get_table_title(m_table_name, AppWindow::get_current_locale()) ); FoundSet found_set; found_set.m_table_name = m_table_name; const Gnome::Gda::Value primary_key_for_details; const bool result = m_box_details.init_db_details(found_set, layout_platform, primary_key_for_details); m_box_details.do_new_record(); m_table_name = table_name; return result; } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/cellrenderer_buttonimage.cc0000644000175000017500000000361312234776363026347 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "cellrenderer_buttonimage.h" #include namespace Glom { GlomCellRenderer_ButtonImage::GlomCellRenderer_ButtonImage(): Glib::ObjectBase("GlomCellRenderer_ButtonImage") // Create a new GType for us { const Gtk::StockID stock_id = Gtk::Stock::OPEN; //A default. set_property("stock_id", stock_id.get_string()); //So that it calls activate_vfunc(): set_property("mode", Gtk::CELL_RENDERER_MODE_ACTIVATABLE); } GlomCellRenderer_ButtonImage::~GlomCellRenderer_ButtonImage() {} GlomCellRenderer_ButtonImage::type_signal_clicked GlomCellRenderer_ButtonImage::signal_clicked() { return m_signal_clicked; } bool GlomCellRenderer_ButtonImage::activate_vfunc(GdkEvent* event, Gtk::Widget& widget, const Glib::ustring& path, const Gdk::Rectangle& background_area, const Gdk::Rectangle& cell_area, Gtk::CellRendererState flags) { //TODO: It would be nice to depress this like a real button. //Call base class: bool result = CellRendererPixbuf::activate_vfunc(event, widget, path, background_area, cell_area, flags); m_signal_clicked.emit( Gtk::TreeModel::Path(path) ); return result; } } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/checkbutton.cc0000644000175000017500000000576312234776363023624 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2008 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "checkbutton.h" #include #include #include #include #include // for cout, endl namespace Glom { namespace DataWidgetChildren { CheckButton::CheckButton(const Glib::ustring& title) : Gtk::CheckButton(title) { #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // !GLOM_ENABLE_CLIENT_ONLY init(); } CheckButton::~CheckButton() { } void CheckButton::init() { } #ifndef GLOM_ENABLE_CLIENT_ONLY bool CheckButton::on_button_press_event(GdkEventButton *event) { //Enable/Disable items. //We did this earlier, but get_appwindow is more likely to work now: AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->add_developer_action(m_refContextAddField); pApp->add_developer_action(m_refContextAddRelatedRecords); pApp->add_developer_action(m_refContextAddGroup); pApp->update_userlevel_ui(); //Update our action's sensitivity. //Only show this popup in developer mode, so operators still see the default GtkCheckButton context menu. //TODO: It would be better to add it somehow to the standard context menu. if(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); return true; //We handled this event. } } } return Gtk::CheckButton::on_button_press_event(event); } #endif // !GLOM_ENABLE_CLIENT_ONLY AppWindow* CheckButton::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } void CheckButton::set_value(const Gnome::Gda::Value& value) { set_active (value.get_boolean()); } Gnome::Gda::Value CheckButton::get_value() const { return Gnome::Gda::Value(get_active()); } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/textview.h0000644000175000017500000000547112234252646023021 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_TEXTVIEW_GLOM_H #define GLOM_UTILITY_WIDGETS_TEXTVIEW_GLOM_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include namespace Glom { class AppWindow; namespace DataWidgetChildren { class TextView : public Gtk::ScrolledWindow, public LayoutWidgetField { public: explicit TextView(BaseObjectType* cobject, const Glib::RefPtr& builder); explicit TextView(Field::glom_field_type glom_type = Field::TYPE_TEXT); virtual ~TextView(); void set_glom_type(Field::glom_field_type glom_type); //Override this so we can store the text to compare later. //This is not virtual, so you must not use it via Gtk::Entry. void set_text(const Glib::ustring& text); //override /** Set the text from a Gnome::Gda::Value. */ virtual void set_value(const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_value() const; typedef Gtk::TextView type_text_view; type_text_view* get_textview(); void set_read_only(bool read_only = true); private: void init(); //Overrides of default signal handlers: virtual void on_buffer_changed(); //virtual void on_activate(); //From Gtk::Entry. virtual bool on_textview_focus_out_event(GdkEventFocus* event); //From Gtk::Widget //virtual void on_insert_text(const Glib::ustring& text, int* position); //From Gtk::Editable virtual void check_for_change(); #ifndef GLOM_ENABLE_CLIENT_ONLY virtual bool on_button_press_event(GdkEventButton *event); //override #endif virtual AppWindow* get_appwindow() const; Glib::ustring m_old_text; Field::glom_field_type m_glom_type; //Store the type so we can validate the text accordingly. //Gnome::Gda::Value m_value; //The last-stored value. We have this because the displayed value might be unparseable. type_text_view m_TextView; }; } //namespace DataWidetChildren } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_TEXTVIEW_GLOM_H glom-1.22.4/glom/mode_data/datawidget/combochoices.cc0000644000175000017500000000624312234252646023733 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "combochoices.h" #include #include #include #include #include //#include //For stringstream #include // for locale, time_put #include // for struct tm #include // for cout, endl namespace Glom { namespace DataWidgetChildren { ComboChoices::ComboChoices() { init(); } void ComboChoices::init() { } ComboChoices::~ComboChoices() { } bool ComboChoices::refresh_data_from_database_with_foreign_key(const Document* /* document */, const Gnome::Gda::Value& /* foreign_key_value */) { /** TODO: sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); if(!layout_item || Conversions::value_is_empty(foreign_key_value)) { //Clear the choices list: type_list_values_with_second list_values; set_choices_with_second(list_values); return true; } const Utils::type_list_values_with_second list_values = Utils::get_choice_values(document, layout_item, foreign_key_value); const Gnome::Gda::Value old_value = get_value(); set_choices_with_second(list_values); set_value(old_value); //Try to preserve the value, even in iter-based ComboBoxes. */ return true; } void ComboChoices::set_choices_related(const Document* /* document */, const sharedptr& /* layout_field */, const Gnome::Gda::Value& /* foreign_key_value */) { /* TODO: type_list_values_with_second list_values; sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); if(layout_item) { bool choice_show_all = false; const sharedptr choice_relationship = layout_item->get_formatting_used().get_choices_related_relationship(choice_show_all); //Set the values now because if it will be the same regardless of the foreign key value. //Otherwise show them when refresh_data_from_database_with_foreign_key() is called. if(choice_relationship && choice_show_all) { list_values = Utils::get_choice_values_all(document, layout_item); } } const Gnome::Gda::Value old_value = get_value(); set_choices_with_second(list_values); set_value(old_value); //Try to preserve the value, even in iter-based ComboBoxes. */ } } //namespace DataWidgetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/combo.cc0000644000175000017500000002631212234776363022403 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "combo.h" #include #include #include #include #include #include #include #include #include #include #include //#include //For stringstream #include // for locale, time_put #include // for struct tm #include // for cout, endl namespace Glom { namespace DataWidgetChildren { ComboGlom::ComboGlom(bool has_entry) : Gtk::ComboBox(has_entry), ComboChoicesWithTreeModel(), m_ignore_changed(false) { #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // !GLOM_ENABLE_CLIENT_ONLY //if(m_glom_type == Field::TYPE_NUMERIC) // get_entry()->set_alignment(1.0); //Align numbers to the right. //Let the combo be big enough: set_popup_fixed_width(false); } ComboGlom::~ComboGlom() { } void ComboGlom::on_fixed_cell_data(const Gtk::TreeModel::iterator& iter, Gtk::CellRenderer* cell, guint model_column_index) { if(!cell) { std::cerr << G_STRFUNC << ": cell is null." << std::endl; return; } if(!iter) return; const sharedptr& layout_item = get_layout_item(); const sharedptr field = sharedptr::cast_dynamic(layout_item); if(!field) return; Gnome::Gda::Value value; Gtk::TreeModel::Row treerow = *iter; treerow->get_value(model_column_index, value); set_cell_for_field_value(cell, field, value); } void ComboGlom::set_choices_fixed(const Formatting::type_list_values& list_values, bool restricted) { ComboChoicesWithTreeModel::set_choices_fixed(list_values, restricted); Glib::RefPtr model = get_choices_model(); if(!model) { std::cerr << G_STRFUNC << ": model is null." << std::endl; return; } //Show the model in the view: set_model(model); if(get_has_entry()) { set_entry_text_column( get_fixed_model_text_column() ); } else { clear(); //This breaks GtkCombo with has-entry. } Glib::RefPtr cell_area = Glib::RefPtr::cast_dynamic(get_area()); if(!cell_area) { std::cerr << G_STRFUNC << ": Unexpected or null CellArea type." << std::endl; return; } guint columns_count = model->get_n_columns(); if(columns_count) columns_count -= 1; //The last one is the just the extra text-equivalent of the first one, for GtkComboBox with has-entry=true, or for translations. const sharedptr& layout_item = get_layout_item(); const sharedptr field = sharedptr::cast_dynamic(layout_item); //For fixed (custom) choices, this will always be 1 column anyway, //so the for() loop here is excessive. for(guint i = 0; i < columns_count; ++i) { //set_entry_text_column() adds its own CellRenderer, //which we cannot replace without confusing (and crashing) GtkComboBox. //We used the special get_fixed_model_text_column() column for that, //so we don't need to add another cell renderer for the value-equivalent of that column: if(i == 0 && get_has_entry()) continue; Gtk::CellRendererText* cell = Gtk::manage(new Gtk::CellRendererText); cell->property_xalign() = 0.0f; //Use the renderer: cell_area->pack_start(*cell, true /* expand */, true /* align */, true /* fixed */); //Make the renderer render the column: if(restricted && field && (field->get_glom_type() == Field::TYPE_TEXT)) { //Use the translation instead: add_attribute(*cell, "text", columns_count); //The extra text column. } else { set_cell_data_func(*cell, sigc::bind( sigc::mem_fun(*this, &ComboGlom::on_fixed_cell_data), cell, i)); } } } void ComboGlom::set_choices_related(const Document* document, const sharedptr& layout_field, const Gnome::Gda::Value& foreign_key_value) { ComboChoicesWithTreeModel::set_choices_related(document, layout_field, foreign_key_value); Glib::RefPtr model = get_choices_model(); if(!model) { std::cerr << G_STRFUNC << ": model is null." << std::endl; return; } //Show the model in the view: set_model(model); if(get_has_entry()) { Glib::RefPtr model_db = Glib::RefPtr::cast_dynamic(model); if(model_db) { const int text_col = model_db->get_text_column(); //const GType debug_type = model_db->get_column_type(text_col); //std::cout << "DEBUG: text_col=" << text_col << ", debug_type=" << g_type_name(debug_type) << std::endl; set_entry_text_column(text_col); } else { std::cerr << G_STRFUNC << ": The model is not a DbTreeModelWithExtraText." << std::endl; return; } } else { clear(); //This breaks GtkCombo with has-entry. } guint model_column_index = 0; for(type_vec_const_layout_items::const_iterator iter = m_db_layout_items.begin(); iter != m_db_layout_items.end(); ++iter) { const sharedptr layout_item = *iter; if(!layout_item) //column_info.m_visible) { ++model_column_index; continue; } //set_entry_text_column() adds its own CellRenderer, //which we cannot replace without confusing (and crashing) GtkComboBox. if(model_column_index == 0 && get_has_entry()) { ++model_column_index; continue; } Gtk::CellRenderer* cell = create_cell(layout_item, m_table_name, document, get_fixed_cell_height(*this)); //Add the ViewColumn: if(cell) { //Use the renderer: //We don't expand the first column, so we can align the other columns. //Otherwise the other columns appear center-aligned. //This bug is relevant: https://bugzilla.gnome.org/show_bug.cgi?id=629133 pack_start(*cell, false); cell_connect_cell_data_func(this, cell, model_column_index); } ++model_column_index; } //for } void ComboGlom::check_for_change() { m_signal_edited.emit(); } void ComboGlom::set_value(const Gnome::Gda::Value& value) { sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); if(!layout_item) return; m_old_value = value; Glib::RefPtr model = get_choices_model(); if(!model) { std::cerr << G_STRFUNC << ": model is null." << std::endl; return; } //Avoid emiting the edited signal just because of these calls: const bool old_ignore = m_ignore_changed; m_ignore_changed = true; bool found = false; for(Gtk::TreeModel::iterator iter = model->children().begin(); iter != model->children().end(); ++iter) { const Gtk::TreeModel::Row row = *iter; Gnome::Gda::Value this_value; row.get_value(0, this_value); if(this_value == value) { found = true; set_active(iter); break; } } if(!found) { //Not found, so mark it as blank: unset_active(); } m_ignore_changed = old_ignore; //Show a different color if the value is numeric, if that's specified: if(layout_item->get_glom_type() == Field::TYPE_NUMERIC) { std::vector cells = get_cells(); if(cells.empty()) return; Gtk::CellRendererText* cell = dynamic_cast(cells[0]); if(!cell) return; const Glib::ustring fg_color = layout_item->get_formatting_used().get_text_format_color_foreground_to_use(value); if(fg_color.empty()) { //GtkComboBox doesn't interpret "" as an unset. TODO: Fix that? cell->property_foreground_set() = false; } else cell->property_foreground() = fg_color; } } Gnome::Gda::Value ComboGlom::get_value() const { //Get the active row: Gtk::TreeModel::iterator iter = get_active(); if(iter) { const Gtk::TreeModel::Row row = *iter; Gnome::Gda::Value value; row.get_value(0, value); return value; } return Gnome::Gda::Value(); } #ifndef GLOM_ENABLE_CLIENT_ONLY bool ComboGlom::on_button_press_event(GdkEventButton *event) { g_warning("ComboGlom::on_button_press_event()"); //Enable/Disable items. //We did this earlier, but get_appwindow is more likely to work now: AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->add_developer_action(m_refContextAddField); pApp->add_developer_action(m_refContextAddRelatedRecords); pApp->add_developer_action(m_refContextAddGroup); pApp->update_userlevel_ui(); //Update our action's sensitivity. //Only show this popup in developer mode, so operators still see the default GtkEntry context menu. //TODO: It would be better to add it somehow to the standard context menu. if(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); return true; //We handled this event. } } } return Gtk::ComboBox::on_button_press_event(event); } #endif // !GLOM_ENABLE_CLIENT_ONLY AppWindow* ComboGlom::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } void ComboGlom::on_changed() { //Call base class: Gtk::ComboBox::on_changed(); if(m_ignore_changed) return; //This signal is emitted for every key press, but sometimes it's just to say that the active item has changed to "no active item", //if the text is not in the dropdown list: Gtk::TreeModel::iterator iter = get_active(); if(iter) { //This is either a choice from the dropdown menu, or someone has typed in something that is in the drop-down menu. //TODO: If both ab, and abc, are in the menu, we are responding twice if the user types abc. check_for_change(); } //Entry of text that is not in the menu will be handled by the ->get_entry() signal handlers._ } void ComboGlom::set_read_only(bool /* read_only */) { //TODO } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/dialog_choose_date.cc0000644000175000017500000000467212234252646025076 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_choose_date.h" #include //For bold_message()). //#include #include namespace Glom { namespace DataWidgetChildren { const char* Dialog_ChooseDate::glade_id("dialog_choose_date"); const bool Dialog_ChooseDate::glade_developer(false); Dialog_ChooseDate::Dialog_ChooseDate() : m_calendar(0) { } Dialog_ChooseDate::Dialog_ChooseDate(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_calendar(0) { builder->get_widget("calendar", m_calendar); m_calendar->signal_day_selected_double_click().connect(sigc::mem_fun(*this, &Dialog_ChooseDate::on_day_selected_double_click)); } Dialog_ChooseDate::~Dialog_ChooseDate() { } void Dialog_ChooseDate::set_date_chosen(const Gnome::Gda::Value& value) { if(value.get_value_type() == G_TYPE_DATE) //Otherwise GtkCalendar defaults to the current (today's) date. { Glib::Date date = value.get_date(); guint month = static_cast(date.get_month()); if(month != 0) --month; //Gtk::Calendar months start at 0. m_calendar->select_month(month, date.get_year()); m_calendar->select_day(date.get_day()); } } Gnome::Gda::Value Dialog_ChooseDate::get_date_chosen() const { guint year = 0; guint month = 0; guint day = 0; m_calendar->get_date(year, month, day); ++ month; //GtkCalendar months start at 0. if(month > 12) month = 12; Glib::Date date(day, static_cast(month), year); return Gnome::Gda::Value(date); } void Dialog_ChooseDate::on_day_selected_double_click() { //Close the dialog: response(Gtk::RESPONSE_OK); } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/combo_as_radio_buttons.cc0000644000175000017500000002544612234776363026031 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "combo_as_radio_buttons.h" #include #include #include #include #include #include //#include //For stringstream #include // for cout, endl namespace Glom { namespace DataWidgetChildren { ComboAsRadioButtons::ComboAsRadioButtons() : Gtk::Box(Gtk::ORIENTATION_VERTICAL), ComboChoices() { #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // !GLOM_ENABLE_CLIENT_ONLY init(); } void ComboAsRadioButtons::init() { //if(m_glom_type == Field::TYPE_NUMERIC) // get_entry()->set_alignment(1.0); //Align numbers to the right. } void ComboAsRadioButtons::set_choices_with_second(const type_list_values_with_second& list_values) { //Clear existing buttons: for(type_map_buttons::iterator iter = m_map_buttons.begin(); iter != m_map_buttons.end(); ++iter) { Gtk::RadioButton* button = iter->second; delete button; } m_map_buttons.clear(); sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); const Formatting& format = layout_item->get_formatting_used(); sharedptr choice_relationship; sharedptr layout_choice_first; sharedptr layout_choice_extra; Formatting::type_list_sort_fields choice_sort_fields; //Ignored. TODO? bool choice_show_all = false; format.get_choices_related(choice_relationship, layout_choice_first, layout_choice_extra, choice_sort_fields, choice_show_all); LayoutGroup::type_list_const_items extra_fields; if(layout_choice_extra) extra_fields = layout_choice_extra->get_items_recursive(); //Add new buttons: Gtk::RadioButton::Group group; for(type_list_values_with_second::const_iterator iter = list_values.begin(); iter != list_values.end(); ++iter) { if(layout_choice_first) { const Glib::ustring value_first = Conversions::get_text_for_gda_value(layout_choice_first->get_glom_type(), iter->first, layout_choice_first->get_formatting_used().m_numeric_format); Glib::ustring title = value_first; const type_list_values extra_values = iter->second; if(layout_choice_extra && !extra_values.empty()) { type_list_values::const_iterator iterValues = extra_values.begin(); for(LayoutGroup::type_list_const_items::const_iterator iterExtra = extra_fields.begin(); iterExtra != extra_fields.end(); ++iterExtra) { const sharedptr item = *iterExtra; const sharedptr item_field = sharedptr::cast_dynamic(item); if(item_field && (iterValues != extra_values.end())) { const Gnome::Gda::Value value = *iterValues; //TODO: Use a vector instead? const Glib::ustring value_second = Conversions::get_text_for_gda_value(item_field->get_glom_type(), value, item_field->get_formatting_used().m_numeric_format); title += " - " + value_second; //TODO: Find a better way to join them? } ++iterValues; } } Gtk::RadioButton* button = new Gtk::RadioButton(group, title); m_map_buttons[value_first] = button; pack_start(*button); button->show(); button->signal_toggled().connect( sigc::mem_fun(*this, &ComboAsRadioButtons::on_radiobutton_toggled)); //TODO: This doesn't seem be be emitted: button->signal_button_press_event().connect( sigc::mem_fun(*this, &ComboAsRadioButtons::on_radiobutton_button_press_event), false); } } } void ComboAsRadioButtons::set_choices_fixed(const Formatting::type_list_values& list_values, bool /* restricted */) { //Clear existing buttons: for(type_map_buttons::iterator iter = m_map_buttons.begin(); iter != m_map_buttons.end(); ++iter) { Gtk::RadioButton* button = iter->second; delete button; } m_map_buttons.clear(); //Add new buttons: Gtk::RadioButton::Group group; for(Formatting::type_list_values::const_iterator iter = list_values.begin(); iter != list_values.end(); ++iter) { sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); if(layout_item) { const sharedptr choicevalue = *iter; Gnome::Gda::Value value; if(choicevalue) value = choicevalue->get_value(); const Glib::ustring value_first = Conversions::get_text_for_gda_value(layout_item->get_glom_type(), value, layout_item->get_formatting_used().m_numeric_format); Gtk::RadioButton* button = new Gtk::RadioButton(group, value_first); m_map_buttons[value_first] = button; pack_start(*button); button->show(); button->signal_toggled().connect( sigc::mem_fun(*this, &ComboAsRadioButtons::on_radiobutton_toggled)); } } } void ComboAsRadioButtons::set_choices_related(const Document* document, const sharedptr& layout_field, const Gnome::Gda::Value& foreign_key_value) { const Utils::type_list_values_with_second list_values = Utils::get_choice_values(document, layout_field, foreign_key_value); set_choices_with_second(list_values); } ComboAsRadioButtons::~ComboAsRadioButtons() { for(type_map_buttons::iterator iter = m_map_buttons.begin(); iter != m_map_buttons.end(); ++iter) { Gtk::RadioButton* button = iter->second; delete button; } m_map_buttons.clear(); } void ComboAsRadioButtons::check_for_change() { Glib::ustring new_text = get_text(); if(new_text == m_old_text) return; //Validate the input: bool success = false; sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); const Gnome::Gda::Value value = Conversions::parse_value(layout_item->get_glom_type(), new_text, layout_item->get_formatting_used().m_numeric_format, success); if(success) { //Actually show the canonical text: set_value(value); m_signal_edited.emit(); //The text was edited, so tell the client code. } else { //Tell the user and offer to revert or try again: const bool revert = glom_show_dialog_invalid_data(layout_item->get_glom_type()); if(revert) { set_text(m_old_text); } else grab_focus(); //Force the user back into the same field, so that the field can be checked again and eventually corrected or reverted. } } void ComboAsRadioButtons::set_value(const Gnome::Gda::Value& value) { sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); if(!layout_item) return; set_text(Conversions::get_text_for_gda_value(layout_item->get_glom_type(), value, layout_item->get_formatting_used().m_numeric_format)); //Show a different color if the value is numeric, if that's specified: if(layout_item->get_glom_type() == Field::TYPE_NUMERIC) { //TODO } } void ComboAsRadioButtons::set_text(const Glib::ustring& text) { m_old_text = text; type_map_buttons::iterator iter = m_map_buttons.find(text); if(iter != m_map_buttons.end()) { Gtk::RadioButton* button = iter->second; if(button) { button->set_active(); return; } } //std::cerr << G_STRFUNC << ": no item found for: " << text << std::endl; } Gnome::Gda::Value ComboAsRadioButtons::get_value() const { sharedptr layout_item = sharedptr::cast_dynamic(get_layout_item()); bool success = false; const Glib::ustring text = get_text(); return Conversions::parse_value(layout_item->get_glom_type(), text, layout_item->get_formatting_used().m_numeric_format, success); } Glib::ustring ComboAsRadioButtons::get_text() const { //Get the active row: for(type_map_buttons::const_iterator iter = m_map_buttons.begin(); iter != m_map_buttons.end(); ++iter) { Gtk::CheckButton* button = iter->second; if(button && button->get_active()) { return iter->first; } } return Glib::ustring(); } #ifndef GLOM_ENABLE_CLIENT_ONLY void ComboAsRadioButtons::show_context_menu(GdkEventButton *event) { std::cout << "ComboAsRadioButtons::show_context_menu()" << std::endl; AppWindow* pApp = get_appwindow(); if(pApp) { //Enable/Disable items. //We did this earlier, but get_appwindow is more likely to work now: pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->add_developer_action(m_refContextAddField); pApp->add_developer_action(m_refContextAddRelatedRecords); pApp->add_developer_action(m_refContextAddGroup); pApp->update_userlevel_ui(); //Update our action's sensitivity. //Only show this popup in developer mode, so operators still see the default GtkEntry context menu. //TODO: It would be better to add it somehow to the standard context menu. if(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); } } } } bool ComboAsRadioButtons::on_radiobutton_button_press_event(GdkEventButton *event) { show_context_menu(event); return false; //Let other signal handlers handle it too. } bool ComboAsRadioButtons::on_button_press_event(GdkEventButton *event) { show_context_menu(event); return Gtk::Box::on_button_press_event(event); } #endif // !GLOM_ENABLE_CLIENT_ONLY AppWindow* ComboAsRadioButtons::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } void ComboAsRadioButtons::on_radiobutton_toggled() { check_for_change(); } void ComboAsRadioButtons::set_read_only(bool /* read_only */) { //TODO } } //namespace DataWidetChildren } //namespace Glom glom-1.22.4/glom/mode_data/datawidget/cellcreation.cc0000644000175000017500000002227712234776363023756 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Glom { static void apply_formatting(Gtk::CellRenderer* renderer, const sharedptr& layout_item) { Gtk::CellRendererText* text_renderer = dynamic_cast(renderer); if(!text_renderer) return; //Use the text formatting: //Horizontal alignment: const Formatting::HorizontalAlignment alignment = layout_item->get_formatting_used_horizontal_alignment(); const float x_align = (alignment == Formatting::HORIZONTAL_ALIGNMENT_LEFT ? 0.0 : 1.0); text_renderer->property_xalign() = x_align; const Formatting& formatting = layout_item->get_formatting_used(); const Glib::ustring font_desc = formatting.get_text_format_font(); if(!font_desc.empty()) text_renderer->property_font() = font_desc; const Glib::ustring fg = formatting.get_text_format_color_foreground(); if(!fg.empty()) text_renderer->property_foreground() = fg; const Glib::ustring bg = formatting.get_text_format_color_background(); if(!bg.empty()) text_renderer->property_background() = bg; } Gtk::CellRenderer* create_cell(const sharedptr& layout_item, const Glib::ustring& table_name, const Document* document, guint fixed_cell_height) { Gtk::CellRenderer* cell = 0; //Create the appropriate cellrenderer type: sharedptr item_field = sharedptr::cast_dynamic(layout_item); if(item_field) { //Ignore hiddent fields. //For instance, these are generally added to DbTreeModels when they would not otherwise contain the primary key, //so that the record can still be uniquely identified. if(item_field->get_hidden()) { //std::cerr << G_STRFUNC << ": Returning 0 because the layout field is hidden. table_name=" << table_name << ", field name=" << item_field->get_name() << std::endl; return 0; } switch(item_field->get_glom_type()) { case(Field::TYPE_BOOLEAN): { cell = Gtk::manage( new Gtk::CellRendererToggle() ); break; } case(Field::TYPE_IMAGE): { cell = Gtk::manage( new Gtk::CellRendererPixbuf() ); break; } default: { const Formatting& formatting = item_field->get_formatting_used(); if(formatting.get_has_choices()) { CellRendererDbList* rendererList = Gtk::manage( new CellRendererDbList() ); sharedptr unconst = sharedptr::cast_const(layout_item); //TODO: Avoid this. rendererList->set_layout_item(unconst, table_name); bool as_radio_buttons = false; //Can't really be done in a list, so we ignore it. const bool restricted = formatting.get_choices_restricted(as_radio_buttons); rendererList->set_restrict_values_to_list(restricted); //Set the choices. //For related choices, that gets set when the value of a dependent field is set. if(formatting.get_has_custom_choices()) { rendererList->set_choices_fixed( formatting.get_choices_custom(), restricted); } cell = rendererList; } else cell = Gtk::manage( new Gtk::CellRendererText() ); break; } } } else { //Non-fields: sharedptr item_image = sharedptr::cast_dynamic(layout_item); if(item_image) { Gtk::CellRendererPixbuf* pixbuf_renderer = Gtk::manage( new Gtk::CellRendererPixbuf() ); const Glib::RefPtr pixbuf = Utils::get_pixbuf_for_gda_value(item_image->m_image); if(pixbuf) pixbuf_renderer->set_property("pixbuf", pixbuf); else pixbuf_renderer->set_property("stock-id", Gtk::StockID(Gtk::Stock::MISSING_IMAGE)); cell = pixbuf_renderer; } else { sharedptr item_text = sharedptr::cast_dynamic(layout_item); if(item_text) { Gtk::CellRendererText* pCellText = Gtk::manage( new Gtk::CellRendererText() ); pCellText->set_property("text", item_get_title(item_text)); cell = pCellText; } else { sharedptr item_button = sharedptr::cast_dynamic(layout_item); if(item_button) { GlomCellRenderer_ButtonText* pCellButton = Gtk::manage( new GlomCellRenderer_ButtonText() ); pCellButton->set_property("text", item_get_title_or_name(item_button)); //pCellButton->set_fixed_width(50); //Otherwise it doesn't show up. TODO: Discover the width of the contents. cell = pCellButton; } } } } if(!cell) { std::cerr << G_STRFUNC << ": Returning 0 because no cell was created." << std::endl; return 0; } //Use formatting: sharedptr item_withformatting = sharedptr::cast_dynamic(layout_item); if(item_withformatting) { apply_formatting(cell, item_withformatting); } Gtk::CellRendererText* cell_text = dynamic_cast(cell); if(cell_text) { //Use an ellipze to indicate excessive text, //so that similar values do not look equal, //and to avoid multi-line comments. TODO: Is there a better way to restrict the height? This doesn't actually truncate multilines anyway. cell_text->property_ellipsize() = Pango::ELLIPSIZE_END; //Restrict the height, to prevent multiline text cells, //and to allow TreeView performance optimisation: //TODO: Avoid specifying a width for the last column? int suitable_width = 0; cell_text->get_property("width", suitable_width); cell_text->set_fixed_size(suitable_width, fixed_cell_height); } //Choices: CellRendererList* pCellRendererList = dynamic_cast(cell); CellRendererDbList* pCellRendererDbList = dynamic_cast(cell); if(pCellRendererList) //Used for custom choices: { pCellRendererList->remove_all_list_items(); if(item_field && item_field->get_formatting_used().get_has_custom_choices()) { //set_choices_fixed() needs this, for the numeric layout: //pCellRendererCombo->set_layout_item(get_layout_item()->clone(), table_name); //TODO_Performance: We only need this for the numerical format. const Formatting::type_list_values list_values = item_field->get_formatting_used().get_choices_custom(); for(Formatting::type_list_values::const_iterator iter = list_values.begin(); iter != list_values.end(); ++iter) { const sharedptr< const ChoiceValue> value = *iter; if(!value) continue; pCellRendererList->append_list_item( Conversions::get_text_for_gda_value(item_field->get_glom_type(), value->get_value(), item_field->get_formatting_used().m_numeric_format) ); } } } else if(pCellRendererDbList) //Used for related choices: { if(item_field && item_field->get_formatting_used().get_has_related_choices()) { sharedptr choice_relationship; sharedptr choice_field; sharedptr choice_extras; //Ignored Formatting::type_list_sort_fields choice_sort_fields; //Ignored bool choice_show_all = false; item_field->get_formatting_used().get_choices_related(choice_relationship, choice_field, choice_extras, choice_sort_fields, choice_show_all); if(choice_relationship && choice_field) { const Glib::ustring to_table = choice_relationship->get_to_table(); //TODO: Update this when the relationship's field value changes: if(choice_show_all) //Otherwise it must change whenever the relationships's ID value changes. { pCellRendererDbList->set_choices_related(document, item_field, Gnome::Gda::Value() /* TODO: Makes no sense */); } } } } return cell; } } //namespace Glom glom-1.22.4/glom/mode_data/box_data_calendar_related.h0000644000175000017500000000771312234776363024147 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATA_BOX_DATA_CALENDAR_RELATED_H #define GLOM_DATA_BOX_DATA_CALENDAR_RELATED_H #include "config.h" // GLOM_ENABLE_CLIENT_ONLY #include "box_data_portal.h" #include #include #include namespace Glom { class Dialog_Layout_Calendar_Related; class Box_Data_Calendar_Related : public Box_Data_Portal { public: Box_Data_Calendar_Related(); virtual ~Box_Data_Calendar_Related(); /** * @param portal: The full portal details */ virtual bool init_db_details(const sharedptr& portal, bool show_title = true); /** Use this if no portal is yet defined, so the user can use the context menu to define a portal. */ virtual bool init_db_details(const Glib::ustring& parent_table, bool show_title = true); private: virtual bool fill_from_database(); //Override. virtual type_vecConstLayoutFields get_fields_to_show() const; //override virtual void create_layout(); //override //Implementations of pure virtual methods from Base_DB_Table_Data: virtual void set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value); void on_record_added(const Gnome::Gda::Value& primary_key_value, const Gtk::TreeModel::iterator& row); //Override. Not a signal handler. #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void on_dialog_layout_hide(); //override. #endif // !GLOM_ENABLE_CLIENT_ONLY virtual void enable_buttons(); //override //Implementations of pure virtual methods from Base_DB_Table_Data: virtual Gnome::Gda::Value get_primary_key_value_selected() const; virtual Gnome::Gda::Value get_primary_key_value(const Gtk::TreeModel::iterator& row) const; #ifndef GLOM_ENABLE_CLIENT_ONLY virtual Dialog_Layout* create_layout_dialog() const; // override. virtual void prepare_layout_dialog(Dialog_Layout* dialog); // override. #endif // !GLOM_ENABLE_CLIENT_ONLY Glib::ustring on_calendar_details(guint year, guint month, guint day); void on_calendar_month_changed(); void setup_menu(); void on_calendar_button_press_event(GdkEventButton *event); void on_MenuPopup_activate_Edit(); void on_MenuPopup_activate_Add(); void on_MenuPopup_activate_Delete(); #ifndef GLOM_ENABLE_CLIENT_ONLY void on_MenuPopup_activate_layout(); #endif void clear_cached_database_values(); private: Gtk::Calendar m_calendar; //TODO: Avoid repeating these in so many widgets: Gtk::Menu* m_pMenuPopup; Glib::RefPtr m_refActionGroup; Glib::RefPtr m_refUIManager; Glib::RefPtr m_refContextEdit, m_refContextAdd, m_refContextDelete; #ifndef GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr m_refContextLayout; #endif //The cached data for the month: //For each date we have a list of rows (vectors): typedef std::vector type_vector_values; typedef std::list type_list_vectors; typedef std::map type_map_values; type_map_values m_map_values; mutable int m_query_column_date_field; }; } //namespace Glom #endif // GLOM_MODE_DATA_BOX_DATA_CALENDAR_RELATED_H glom-1.22.4/glom/mode_data/box_data_portal.cc0000644000175000017500000003053112234252646022320 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include //For show_ok_dialog() #include //For bold_message()). #include #include namespace Glom { Box_Data_Portal::Box_Data_Portal() : m_find_mode(false) { //m_Frame.set_label_widget(m_Label_Related); m_Frame.set_shadow_type(Gtk::SHADOW_NONE); m_Frame.add(m_Alignment); m_Frame.show(); m_Frame.set_label_widget(m_Label); m_Label.show(); //The AddDel or Calendar is added to this: m_Alignment.set_padding(Utils::DEFAULT_SPACING_SMALL /* top */, 0, Utils::DEFAULT_SPACING_LARGE /* left */, 0); m_Alignment.show(); add(m_Frame); m_layout_name = "list_portal"; //Replaced by derived classes. } Box_Data_Portal::~Box_Data_Portal() { } void Box_Data_Portal::make_record_related(const Gnome::Gda::Value& related_record_primary_key_value) { sharedptr field_primary_key = get_field_primary_key(); //Create the link by setting the foreign key if(!m_key_field) { std::cerr << G_STRFUNC << ": m_key_field was null." << std::endl; } if(Conversions::value_is_empty(m_key_value)) { std::cerr << G_STRFUNC << ": m_key_value was empty." << std::endl; } if(!m_portal) { std::cerr << G_STRFUNC << ": m_portal was null." << std::endl; } const Glib::ustring target_table = m_portal->get_table_used(Glib::ustring() /* not relevant */); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder->set_table(target_table); builder->add_field_value_as_value(m_key_field->get_name(), m_key_value); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(field_primary_key->get_name(), target_table), builder->add_expr_as_value(related_record_primary_key_value))); //std::cout << "debug: " << G_STRFUNC << ": setting value in db=" << primary_key_value.to_string() << std::endl; const bool test = DbUtils::query_execute(builder); if(!test) { std::cerr << G_STRFUNC << ": SQL query failed." << std::endl; } } bool Box_Data_Portal::init_db_details(const sharedptr& portal, bool show_title) { m_portal = glom_sharedptr_clone(portal); Glib::ustring parent_table; if(m_portal) parent_table = m_portal->get_from_table(); return init_db_details(parent_table, show_title); } Glib::ustring Box_Data_Portal::get_title(const Glib::ustring& locale) const { if(m_portal) return m_portal->get_title_or_name(locale); else { //Note to translators: This text is shown instead of a table title, when the table has not yet been chosen. return _("Undefined Table"); } } Glib::ustring Box_Data_Portal::get_title_singular(const Glib::ustring& locale) const { Glib::ustring relationship_title; if(m_portal && m_portal->get_has_relationship_name()) relationship_title = m_portal->get_title_singular_used(Glib::ustring() /* parent title - not relevant */, locale); else { //Note to translators: This text is shown instead of a table title, when the table has not yet been chosen. relationship_title = _("Undefined Table"); } return relationship_title; } bool Box_Data_Portal::refresh_data_from_database_with_foreign_key(const Gnome::Gda::Value& foreign_key_value) { m_key_value = foreign_key_value; //std::cout << "debug: " << G_STRFUNC << ": m_key_value=" << m_key_value.to_string() << std::endl; if(m_key_field && m_portal) { if(!Conversions::value_is_empty(m_key_value)) { FoundSet found_set; set_found_set_where_clause_for_portal(found_set, m_portal, m_key_value); //std::cout << "debug: " << G_STRFUNC << ": where_clause=" << found_set.m_where_clause << std::endl; return Box_Data::refresh_data_from_database_with_where_clause(found_set); } else { //If there is no from key value then no records can be shown: refresh_data_from_database_blank(); return true; } } else { //If there is no to field then this relationship specifies all records in the table. FoundSet found_set = m_found_set; found_set.m_where_clause = Gnome::Gda::SqlExpr(); return Box_Data::refresh_data_from_database_with_where_clause(found_set); } } sharedptr Box_Data_Portal::get_portal() const { return m_portal; } sharedptr Box_Data_Portal::get_key_field() const { return m_key_field; } //TODO: refactor: Remove this because it is never called? void Box_Data_Portal::on_record_deleted(const Gnome::Gda::Value& /* primary_key_value */) { //Allow the parent record (Details view) to recalculate aggregations: signal_portal_record_changed().emit(m_portal->get_relationship_name()); } void Box_Data_Portal::on_record_added(const Gnome::Gda::Value& /* primary_key_value */, const Gtk::TreeModel::iterator& /* row */) { //Allow the parent record (Details view) to recalculate aggregations: signal_portal_record_changed().emit(m_portal->get_relationship_name()); } Box_Data_Portal::type_vecConstLayoutFields Box_Data_Portal::get_fields_to_show() const { const Document* document = get_document(); if(document && m_portal) { Document::type_list_layout_groups mapGroups; mapGroups.push_back(m_portal); sharedptr relationship = m_portal->get_relationship(); if(relationship) { type_vecConstLayoutFields result = get_table_fields_to_show_for_sequence(m_portal->get_table_used(Glib::ustring() /* not relevant */), mapGroups); //If the relationship does not allow editing, then mark all these fields as non-editable: //TODO: Prevent this in some other way: /* if(!(m_portal->get_relationship_used_allows_edit())) { for(type_vecConstLayoutFields::iterator iter = result.begin(); iter != result.end(); ++iter) { sharedptr item = *iter; if(item) item->set_editable(false); } } */ return result; } } return type_vecConstLayoutFields(); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Data_Portal::on_dialog_layout_hide() { //Overridden in derived classes. } #endif // !GLOM_ENABLE_CLIENT_ONLY bool Box_Data_Portal::get_has_suitable_record_to_view_details() const { if(!m_portal) return false; const Document* document = get_document(); if(!document) return false; Glib::ustring navigation_table_name; sharedptr navigation_relationship; //Ignored. m_portal->get_suitable_table_to_view_details(navigation_table_name, navigation_relationship, document); return !(navigation_table_name.empty()); } void Box_Data_Portal::get_suitable_record_to_view_details(const Gnome::Gda::Value& primary_key_value, Glib::ustring& table_name, Gnome::Gda::Value& table_primary_key_value) const { //Initialize output parameters: table_name = Glib::ustring(); table_primary_key_value = Gnome::Gda::Value(); if(!m_portal) return; const Document* document = get_document(); if(!document) return; Glib::ustring navigation_table_name; sharedptr navigation_relationship; m_portal->get_suitable_table_to_view_details(navigation_table_name, navigation_relationship, document); //if(navigation_relationship && navigation_relationship->get_relationship()) // std::cout << "debug: navigation_relationship=" << navigation_relationship->get_relationship()->get_name() << std::endl; //if(navigation_relationship && navigation_relationship->get_related_relationship()) // std::cout << "debug: navigation_related_relationship=" << navigation_relationship->get_related_relationship()->get_name() << std::endl; if(navigation_table_name.empty()) return; //Get the primary key of that table: sharedptr navigation_table_primary_key = get_field_primary_key_for_table(navigation_table_name); //Build a layout item to get the field's value: sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(navigation_table_primary_key); if(navigation_relationship) { layout_item->set_relationship( navigation_relationship->get_relationship() ); //std::cout << "debug: navigation_relationship->get_relationship()= " << navigation_relationship->get_relationship()->get_name() << std::endl; layout_item->set_related_relationship( navigation_relationship->get_related_relationship() ); } //Get the value of the navigation related primary key: type_vecLayoutFields fieldsToGet; fieldsToGet.push_back(layout_item); //For instance "invoice_line_id" if this is a portal to an "invoice_lines" table: const Glib::ustring related_table = m_portal->get_table_used(Glib::ustring() /* not relevant */); sharedptr key_field = get_field_primary_key_for_table(related_table); //std::cout << "DEBUG: related table=" << related_table << ", whose primary_key=" << key_field->get_name() << ", with value=" << primary_key_value.to_string() << "getting value for: " << layout_item->get_layout_display_name() << std::endl; Glib::RefPtr query = Utils::build_sql_select_with_key(related_table, fieldsToGet, key_field, primary_key_value); Glib::RefPtr data_model = DbUtils::query_execute_select(query); bool value_found = true; if(data_model && data_model->get_n_rows() && data_model->get_n_columns()) { //Set the output parameters: table_name = navigation_table_name; table_primary_key_value = data_model->get_value_at(0, 0); //std::cout << "debug: " << G_STRFUNC << ": table_primary_key_value=" << table_primary_key_value.to_string() << std::endl; //The value is empty when there there is no record to match the key in the related table: //For instance, if an invoice lines record mentions a product id, but the product does not exist in the products table. if(Conversions::value_is_empty(table_primary_key_value)) { value_found = false; std::cout << "debug: " << G_STRFUNC << ": SQL query returned empty primary key." << std::endl; } } else { value_found = false; std::cout << "DEBUG: Box_Data_Portal::get_suitable_record_to_view_details(): SQL query returned no suitable primary key. table=" << related_table << ", field=" << layout_item->get_layout_display_name() << ", key_field=" << key_field->get_name() << ", primary_key_value=" << primary_key_value.to_string() << std::endl; std::cout << " DEBUG: SQL was: " << query << std::endl; } if(!value_found) { //Clear the output parameters: table_name = Glib::ustring(); table_primary_key_value = Gnome::Gda::Value(); Gtk::Window* window = const_cast(get_app_window()); if(window) Frame_Glom::show_ok_dialog(_("No Corresponding Record Exists"), _("No record with this value exists. Therefore navigation to the related record is not possible."), *window, Gtk::MESSAGE_WARNING); //TODO: Make it more clear to the user exactly what record, what field, and what value, we are talking about. } } Document::type_list_layout_groups Box_Data_Portal::create_layout_get_layout() { Document::type_list_layout_groups result; if(m_portal) result.push_back(m_portal); return result; } sharedptr Box_Data_Portal::get_field_primary_key() const { return m_key_field; } Box_Data_Portal::type_signal_portal_record_changed Box_Data_Portal::signal_portal_record_changed() { return m_signal_portal_record_changed; } void Box_Data_Portal::set_find_mode(bool val) { m_find_mode = val; } } //namespace Glom glom-1.22.4/glom/mode_data/box_data_portal.h0000644000175000017500000001203412234252646022160 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2008 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_BOX_DATA_PORTAL_H #define GLOM_MODE_DATA_BOX_DATA_PORTAL_H #include "config.h" // GLOM_ENABLE_CLIENT_ONLY #include "box_data_manyrecords.h" #include #include #include #include namespace Glom { class Box_Data_Details; /** This is a base class for data widgets that should show multiple related records. */ class Box_Data_Portal : public Box_Data_ManyRecords, public LayoutWidgetBase { public: Box_Data_Portal(); virtual ~Box_Data_Portal(); /** * @param portal: The full portal details */ virtual bool init_db_details(const sharedptr& portal, bool show_title = true); /** Use this if no portal is yet defined, so the user can use the context menu to define a portal. */ virtual bool init_db_details(const Glib::ustring& parent_table, bool show_title = true) = 0; /** Update a portal if a relevant value in its parent table has changed. * * @param foreign_key_value: The value that should be found in this table. */ bool refresh_data_from_database_with_foreign_key(const Gnome::Gda::Value& foreign_key_value); virtual sharedptr get_portal() const; virtual sharedptr get_key_field() const; sigc::signal signal_record_added; /** Tell the parent widget that something has changed in one of the related records, * or a record was added or deleted. * * @param relationship_name, if any. */ typedef sigc::signal type_signal_portal_record_changed; type_signal_portal_record_changed signal_portal_record_changed(); bool get_has_suitable_record_to_view_details() const; /** Discover what record to show, in what table, when clicking on a related record. * This record will not necessarily just be the directly related record. * * @param primary_key_value Identifies the related record that has been clicked. * @param table_name The table that should be shown. * @param table_primary_key_value Identifies the record in that table that should be shown. */ void get_suitable_record_to_view_details(const Gnome::Gda::Value& primary_key_value, Glib::ustring& table_name, Gnome::Gda::Value& table_primary_key_value) const; /** Prevent any attempts to change actual records, * if the widget is just being used to enter find critera, * and prevents any need for data retrieval from the database, because * no data will be displayed. * * @param val True if find mode should be used. */ virtual void set_find_mode(bool val = true); protected: virtual type_vecConstLayoutFields get_fields_to_show() const; //override //Implementations of pure virtual methods from Base_DB_Table_Data: virtual sharedptr get_field_primary_key() const; //Overrides of virtual methods from Base_Db_Table_Data: virtual void on_record_added(const Gnome::Gda::Value& primary_key_value, const Gtk::TreeModel::iterator& row); //Override. Not a signal handler. virtual void on_record_deleted(const Gnome::Gda::Value& primary_key_value); //override. #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void on_dialog_layout_hide(); //override. #endif // !GLOM_ENABLE_CLIENT_ONLY protected: virtual Document::type_list_layout_groups create_layout_get_layout(); //override. void make_record_related(const Gnome::Gda::Value& related_record_primary_key_value); /** Get the title of the relationship used by the portal. */ Glib::ustring get_title(const Glib::ustring& locale) const; /** Get the singular title of the relationship used by the portal. */ Glib::ustring get_title_singular(const Glib::ustring& locale) const; Gtk::Frame m_Frame; Gtk::Alignment m_Alignment; Gtk::Label m_Label; sharedptr m_portal; Glib::ustring m_parent_table; //A duplicate of the from_table in m_portal, but only when m_portal is not null. // m_key_field and m_key_value are the field and its value in this table that // must match another field in the parent table. sharedptr m_key_field; Gnome::Gda::Value m_key_value; bool m_find_mode; type_signal_portal_record_changed m_signal_portal_record_changed; }; } //namespace Glom #endif // GLOM_MODE_DATA_BOX_DATA_PORTAL_H glom-1.22.4/glom/mode_data/box_data_manyrecords.h0000644000175000017500000000501412234252646023205 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_BOX_DATA_MANY_RECORDS_H #define GLOM_MODE_DATA_BOX_DATA_MANY_RECORDS_H #include "config.h" // GLOM_ENABLE_CLIENT_ONLY #include "box_data.h" #include namespace Glom { class Box_Data_ManyRecords : public Box_Data { public: Box_Data_ManyRecords(); virtual ~Box_Data_ManyRecords(); void refresh_data_from_database_blank(); bool get_showing_multiple_records() const; void set_read_only(bool read_only = true); //For instance, change "Open" to "Select" when used to select an ID. void set_open_button_title(const Glib::ustring& title); ///Highlight and scroll to the specified record, with primary key value @primary_key_value. virtual void set_primary_key_value_selected(const Gnome::Gda::Value& primary_key_value); //Primary Key value: typedef sigc::signal type_signal_user_requested_details; type_signal_user_requested_details signal_user_requested_details(); typedef sigc::signal type_signal_record_selection_changed; type_signal_record_selection_changed signal_record_selection_changed(); void get_record_counts(gulong& total, gulong& found) const; protected: //virtual Document::type_list_layout_groups create_layout_get_layout(); //overriden in Box_Data_ManyRecords_Related. void create_layout_add_group(const sharedptr& layout_group); virtual void print_layout(); virtual void print_layout_group(xmlpp::Element* node_parent, const sharedptr& group); bool m_read_only; type_signal_user_requested_details m_signal_user_requested_details; type_signal_record_selection_changed m_signal_record_selection_changed; }; } //namespace Glom #endif // GLOM_MODE_DATA_BOX_DATA_MANY_RECORDS_H glom-1.22.4/glom/base_db_table_data.h0000644000175000017500000000720512234252645020623 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BASE_DB_TABLE_DATA_H #define GLOM_BASE_DB_TABLE_DATA_H #include "base_db_table_data_readonly.h" namespace Glom { /** A base class some database functionality * for use with a specific database table, showing data from the table. */ class Base_DB_Table_Data : public Base_DB_Table_Data_ReadOnly { public: Base_DB_Table_Data(); virtual ~Base_DB_Table_Data(); /** Tell the parent widget that something has changed in one of the shown records, * or a record was added or deleted. * This is only emitted for widgets for which it would be useful. * * @param relationship_name, if any. */ typedef sigc::signal type_signal_record_changed; type_signal_record_changed signal_record_changed(); protected: /** Create a new record with all the entered field values from the currently-active details/row. * @result true if the record was added to the database. */ bool record_new(bool use_entered_data = true, const Gnome::Gda::Value& primary_key_value = Gnome::Gda::Value()); Gnome::Gda::Value get_entered_field_data_field_only(const sharedptr& field) const; virtual Gnome::Gda::Value get_entered_field_data(const sharedptr& field) const; //Gets the row being edited, for derived classes that have rows. virtual Gtk::TreeModel::iterator get_row_selected(); virtual void set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value) = 0; virtual void refresh_related_fields(const LayoutFieldInRecord& field_in_record_changed, const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& field_value); /** Get the fields that are in related tables, via a relationship using @a field_name changes. */ type_vecConstLayoutFields get_related_fields(const sharedptr& field) const; /** Ask the user if he really wants to delete the record. */ bool confirm_delete_record(); /** Delete a record from the database table. * @param primary_key_value A primary key to indentify the record to delete. */ bool record_delete(const Gnome::Gda::Value& primary_key_value); bool add_related_record_for_field(const sharedptr& layout_item_parent, const sharedptr& relationship, const sharedptr& primary_key_field, const Gnome::Gda::Value& primary_key_value_provided, Gnome::Gda::Value& primary_key_value_used); virtual void on_record_added(const Gnome::Gda::Value& primary_key_value, const Gtk::TreeModel::iterator& row); //Overridden by derived classes. virtual void on_record_deleted(const Gnome::Gda::Value& primary_key_value); //Overridden by derived classes. type_signal_record_changed m_signal_record_changed; private: bool get_related_record_exists(const sharedptr& relationship, const Gnome::Gda::Value& key_value); }; } //namespace Glom #endif // GLOM_BASE_DB_TABLE_DATA_H glom-1.22.4/glom/utils_ui.h0000644000175000017500000000766412234252646016753 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2009 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILS_UI_H #define GLOM_UTILS_UI_H #include "config.h" #include #include #include #include #include #include namespace Glom { //TODO: Rename this to UiUtils namespace Utils { enum DefaultSpacings { DEFAULT_SPACING_LARGE = 12, DEFAULT_SPACING_SMALL = 6 }; /** * Show the dialog, blocking until there is a non-help response, * showing the appropriate help page if the help button is clicked. */ int dialog_run_with_help(Gtk::Dialog* dialog, const Glib::ustring& id = Glib::ustring()); /** * Show the dialog, blocking until there is a non-help response, * showing the appropriate help page if the help button is clicked. * This requires the dialog class to have a static * glade_id member variable, which we reuse as the help ID. */ template int dialog_run_with_help(T_Dialog* dialog) { return dialog_run_with_help(dialog, T_Dialog::glade_id); } /** This is a replacement for gnome_help_display(), * to avoid the libgnome dependency. * TODO: GTK+ should have a function for this soon. */ void show_help(const Glib::ustring& id = Glib::ustring()); void show_ok_dialog(const Glib::ustring& title, const Glib::ustring& message, Gtk::Window& parent, Gtk::MessageType message_type); void show_ok_dialog(const Glib::ustring& title, const Glib::ustring& message, Gtk::Window* parent, Gtk::MessageType message_type); void show_window_until_hide(Gtk::Window* window); /// For instance, to create bold primary text for a dialog box, without marking the markup for translation. Glib::ustring bold_message(const Glib::ustring& message); Glib::RefPtr get_pixbuf_for_gda_value(const Gnome::Gda::Value& value); /** Get the width required for typical data of this type in the current font. * * @widget The widget whose font should be used. * @field_layout The layout item whose data type should be used. * @or_title If true, check the width of the item's title too, returning the larger of the two values. * @result The width in pixels. */ int get_suitable_field_width_for_widget(Gtk::Widget& widget, const sharedptr& field_layout, bool or_title = false, bool for_treeview = false); /// Add the @a extension if no extension is there already: std::string get_filepath_with_extension(const std::string& filepath, const std::string& extension); Glib::RefPtr image_scale_keeping_ratio(const Glib::RefPtr& pixbuf, int target_height, int target_width); ///@result Whether the user would like to find again. bool show_warning_no_records_found(Gtk::Window& transient_for); void show_report_in_browser(const std::string& filepath, Gtk::Window* parent_window); std::string get_icon_path(const Glib::ustring& filename); /** Runs libglom's Utils::script_check_for_pygtk2() and shows * a warning dialog if necessary. */ bool script_check_for_pygtk2_with_warning(const Glib::ustring& script, Gtk::Window* parent_window); void treeview_delete_all_columns(Gtk::TreeView* treeview); } //namespace Utils } //namespace Glom #endif //GLOM_UTILS_UI_H glom-1.22.4/glom/frame_glom.h0000644000175000017500000002424312234776363017225 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_FRAME_GLOM_H #define GLOM_FRAME_GLOM_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include "window_boxholder.h" #include #include #include #include #include "navigation/box_tables.h" #include "mode_data/notebook_data.h" #include "mode_find/notebook_find.h" #ifndef GLOM_ENABLE_CLIENT_ONLY #include "box_reports.h" #include "mode_design/print_layouts/box_print_layouts.h" #include "mode_design/dialog_fields.h" #include "mode_design/dialog_relationships.h" #endif // !GLOM_ENABLE_CLIENT_ONLY #include "dialog_connection.h" #include #include "mode_data/box_data_list_related.h" //only for m_HackToFixLinkerError. namespace Glom { #ifndef GLOM_ENABLE_CLIENT_ONLY class Dialog_Layout_Report; class Window_PrintLayout_Edit; class Dialog_AddRelatedTable; class Dialog_RelationshipsOverview; #endif // !GLOM_ENABLE_CLIENT_ONLY class Frame_Glom : public PlaceHolder, //public GlomBakery::View_Composite, public Base_DB //Inherits from View_Composite. { public: Frame_Glom(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Frame_Glom(); void set_databases_selected(const Glib::ustring& strName); void do_print_layout(const Glib::ustring& print_layout_name, bool preview = false, Gtk::Window* transient_for = 0); void on_box_tables_selected(const Glib::ustring& strName); #ifndef GLOM_ENABLE_CLIENT_ONLY void on_box_reports_selected(const Glib::ustring& strName); void on_box_print_layouts_selected(const Glib::ustring& strName); void on_menu_developer_developer(const Glib::RefPtr& action, const Glib::RefPtr& operator_action); void on_menu_developer_operator(const Glib::RefPtr& action); void on_menu_file_export(); void on_menu_file_import(); void on_menu_file_print_edit_layouts(); #endif // !GLOM_ENABLE_CLIENT_ONLY void on_menu_file_toggle_share(const Glib::RefPtr& action); void on_menu_file_print(); void on_menu_Edit_Find(); void on_menu_add_record(); void on_menu_report_selected(const Glib::ustring& report_name); void do_menu_Navigate_Table(bool open_default = false); #ifndef GLOM_ENABLE_CLIENT_ONLY void on_menu_print_layout_selected(const Glib::ustring& print_layout_name); void on_menu_Tables_EditTables(); /* Commented out because it is useful but confusing to new users: void on_menu_Tables_AddRelatedTable(); */ #endif // !GLOM_ENABLE_CLIENT_ONLY #ifndef GLOM_ENABLE_CLIENT_ONLY void on_menu_Reports_EditReports(); void on_menu_developer_database_preferences(); void on_menu_developer_fields(); void do_menu_developer_fields(Gtk::Window& parent); void do_menu_developer_fields(Gtk::Window& parent, const Glib::ustring table_name); void on_menu_developer_relationships_overview(); void on_menu_developer_relationships(); void do_menu_developer_relationships(Gtk::Window& parent, const Glib::ustring table_name); void on_menu_developer_users(); void on_menu_developer_layout(); void on_menu_developer_reports(); void on_menu_developer_print_layouts(); void on_menu_developer_script_library(); void on_developer_dialog_hide(); void on_dialog_layout_report_hide(); void on_dialog_layout_print_hide(); void on_dialog_add_related_table_request_edit_fields(); #endif // !GLOM_ENABLE_CLIENT_ONLY void on_dialog_tables_hide(); virtual void set_document(Document* pDocument); //View override virtual void load_from_document(); //View override enum enumModes { MODE_None, //at the start. MODE_Data, MODE_Find }; enumModes m_Mode; enumModes m_Mode_Previous; // see comments in set_mode_widget(). static void show_ok_dialog(const Glib::ustring& title, const Glib::ustring& message, Gtk::Window& parent, Gtk::MessageType message_type = Gtk::MESSAGE_INFO); /** Show the dialog to request the password, and check whether it works. * * @param database_not_found true if the connection failed only because the database was not found on the server. * @param known_username The username if known. Otherwise, the user will be asked via a dialog. * @param known_password The password if known. Otherwise, the user will be asked via a dialog. * @param confirm_existing_user If true then an alternative message text will be shown. * @result true if the connection succeeded and the database was found on the server. */ bool connection_request_password_and_attempt(bool& database_not_found, const Glib::ustring known_username = Glib::ustring(), const Glib::ustring& known_password = Glib::ustring(), bool confirm_existing_user = false); #ifndef GLOM_ENABLE_CLIENT_ONLY //Show the dialog to request the password, and choose an unused database name. bool connection_request_password_and_choose_new_database_name(); ///Create the database for new documents, showing the Connection dialog bool create_database(const Glib::ustring& database_name, const Glib::ustring& title); void set_enable_layout_drag_and_drop(bool enable = true); #endif // !GLOM_ENABLE_CLIENT_ONLY void export_data_to_vector(Document::type_example_rows& the_vector, const FoundSet& found_set, const Document::type_list_layout_groups& sequence); void export_data_to_stream(std::ostream& the_stream, const FoundSet& found_set, const Document::type_list_layout_groups& sequence); /** Show the table again. For instance, if the document has changed, or we want to display it differently. */ void show_table_refresh(); Glib::ustring get_shown_table_name() const; /** Show the table, possibly selecting a particular record, possibly showing that in the details tab. * * @param table_name The database table to show. * @param primary_key_value_for_details If specified, switch to the details view, and show this record. */ void show_table(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value_for_details = Gnome::Gda::Value()); protected: //virtual void set_document(Document* pDocument); //override /** Show the table, possibly selecting a particular record, possibly showing that in the details tab. This allows table_name to be empty in which case no * table will be shown. * * @param table_name The database table to show. * @param primary_key_value_for_details If specified, switch to the details view, and show this record. */ void show_table_allow_empty(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value_for_details = Gnome::Gda::Value()); /** Hide the currently shown table so that no table is shown. */ void show_no_table(); void show_table_title(); #ifndef GLOM_ENABLE_CLIENT_ONLY bool connection_request_initial_password(Glib::ustring& user, Glib::ustring& password); void update_table_in_document_from_database(); #endif // !GLOM_ENABLE_CLIENT_ONLY void set_mode_widget(Gtk::Widget& widget); //e.g. show the design mode notebook. bool set_mode(enumModes mode); //bool indicates that there was a change. Gtk::Window* get_app_window(); const Gtk::Window* get_app_window() const; void update_records_count(); void alert_no_table(); //TODO: Make these private? //Signal handlers: void on_notebook_find_criteria(const Gnome::Gda::SqlExpr& where_clause); void on_button_quickfind(); void on_button_find_all(); void on_notebook_data_switch_page(Gtk::Widget* page, guint page_num); void on_notebook_data_record_details_requested(const Glib::ustring& table_name, Gnome::Gda::Value primary_key_value); void on_userlevel_changed(AppState::userlevels userlevel); #ifndef GLOM_ENABLE_CLIENT_ONLY void on_dialog_add_related_table_response(int response); #endif // !GLOM_ENABLE_CLIENT_ONLY void on_connection_initialize_progress(); void on_connection_startup_progress(); void on_connection_cleanup_progress(); void cleanup_connection(); bool handle_connection_initialize_errors(ConnectionPool::InitErrors error); private: void on_notebook_data_record_selection_changed(); /** * @result Whether to try again. */ bool handle_request_password_connection_error(bool asked_for_password, const ExceptionConnection& ex, bool& database_not_found); //Member data: Glib::ustring m_table_name; //Child widgets: Gtk::Label* m_pLabel_Table_DataMode; Gtk::Label* m_pLabel_Table_FindMode; Gtk::Box m_Box_RecordsCount; //Only show this when in Data mode. Gtk::Label m_Label_RecordsCount; Gtk::Label m_Label_FoundCount; Gtk::Button m_Button_FindAll; PlaceHolder* m_pBox_Mode; //Contains e.g. design mode notebook. //Navigation: Box_Tables* m_pBox_Tables; Window_BoxHolder* m_pDialog_Tables; Notebook_Data m_Notebook_Data; Gtk::Box* m_pBox_QuickFind; //Only show this when in Find mode. Gtk::Entry* m_pEntry_QuickFind; Gtk::Button* m_pButton_QuickFind; Notebook_Find m_Notebook_Find; #ifndef GLOM_ENABLE_CLIENT_ONLY //Developer: Window_BoxHolder* m_pDialog_Reports; Dialog_Layout_Report* m_pDialogLayoutReport; Box_Reports* m_pBox_Reports; Window_BoxHolder* m_pDialog_PrintLayouts; Window_PrintLayout_Edit* m_pDialogLayoutPrint; Box_Print_Layouts* m_pBox_PrintLayouts; Dialog_Fields* m_pDialog_Fields; Dialog_Relationships* m_pDialog_Relationships; Dialog_AddRelatedTable* m_dialog_addrelatedtable; Dialog_RelationshipsOverview* m_dialog_relationships_overview; #endif //GLOM_ENABLE_CLIENT_ONLY Dialog_Connection* m_pDialogConnection; }; } //namespace Glom #endif // GLOM_FRAME_GLOM_H glom-1.22.4/glom/base_db.cc0000644000175000017500000015723112234776363016636 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include "appwindow.h" //AppWindow. #include #include #include #include #include //#ifndef GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include //#endif // !GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include #include #include #include #include #include #include #include //For stringstream #include // gda_g_type_from_string namespace Glom { template class predicate_LayoutItemIsEqual { public: predicate_LayoutItemIsEqual(const sharedptr& layout_item) : m_layout_item(layout_item) { } bool operator() (const sharedptr& layout_item) const { if(!m_layout_item && !layout_item) return true; if(layout_item && m_layout_item) { return m_layout_item->is_same_field(layout_item); //std::cout << " debug: name1=" << m_layout_item->get_name() << ", name2=" << layout_item->get_name() << ", result=" << result << std::endl; //return result; } else return false; } private: sharedptr m_layout_item; }; Base_DB::Base_DB() { //m_pDocument = 0; } Base_DB::~Base_DB() { } bool Base_DB::init_db_details() { return fill_from_database(); } //TODO: Remove this? bool Base_DB::fill_from_database() { //m_AddDel.remove_all(); return true; } //static: sharedptr Base_DB::connect_to_server(Gtk::Window* parent_window) { BusyCursor busy_cursor(parent_window); return ConnectionPool::get_and_connect(); } void Base_DB::handle_error(const Glib::Exception& ex) { std::cerr << "Internal Error (Base_DB::handle_error()): exception type=" << typeid(ex).name() << ", ex.what()=" << ex.what() << std::endl; Gtk::MessageDialog dialog(Utils::bold_message(_("Internal error")), true, Gtk::MESSAGE_WARNING ); dialog.set_secondary_text(ex.what()); //TODO: dialog.set_transient_for(*get_appwindow()); dialog.run(); } void Base_DB::handle_error(const std::exception& ex) { std::cerr << "Internal Error (Base_DB::handle_error()): exception type=" << typeid(ex).name() << ", ex.what()=" << ex.what() << std::endl; Gtk::MessageDialog dialog(Utils::bold_message(_("Internal error")), true, Gtk::MESSAGE_WARNING ); dialog.set_secondary_text(ex.what()); //TODO: dialog.set_transient_for(*get_appwindow()); dialog.run(); } bool Base_DB::handle_error() { return ConnectionPool::handle_error_cerr_only(); } void Base_DB::load_from_document() { if(get_document()) { // TODO: When is it *ever* correct to call fill_from_database() from here? if(ConnectionPool::get_instance()->get_ready_to_connect()) fill_from_database(); //virtual. //Call base class: View_Composite_Glom::load_from_document(); } } AppState::userlevels Base_DB::get_userlevel() const { const Document* document = dynamic_cast(get_document()); if(document) { return document->get_userlevel(); } else { std::cerr << G_STRFUNC << ": document not found." << std::endl; return AppState::USERLEVEL_OPERATOR; } } void Base_DB::set_userlevel(AppState::userlevels value) { Document* document = get_document(); if(document) { document->set_userlevel(value); } } void Base_DB::on_userlevel_changed(AppState::userlevels /* userlevel */) { //Override this in derived classes. } void Base_DB::set_document(Document* pDocument) { View_Composite_Glom::set_document(pDocument); //Connect to a signal that is only on the derived document class: Document* document = get_document(); if(document) { document->signal_userlevel_changed().connect( sigc::mem_fun(*this, &Base_DB::on_userlevel_changed) ); //Show the appropriate UI for the user level that is specified by this new document: on_userlevel_changed(document->get_userlevel()); } } //static: Base_DB::type_vec_strings Base_DB::util_vecStrings_from_Fields(const type_vec_fields& fields) { //Get vector of field names, suitable for a combo box: type_vec_strings vecNames; for(type_vec_fields::size_type i = 0; i < fields.size(); ++i) { vecNames.push_back(fields[i]->get_name()); } return vecNames; } #ifndef GLOM_ENABLE_CLIENT_ONLY namespace { // Check primary key and uniqueness constraints when changing a column sharedptr check_field_change_constraints(const sharedptr& field_old, const sharedptr& field) { sharedptr result = glom_sharedptr_clone(field); bool primary_key_was_unset = false; if(field_old->get_primary_key() != field->get_primary_key()) { //TODO: Check that there is only one primary key //When unsetting a primary key, ask which one should replace it. if(field->get_primary_key()) { result->set_unique_key(); } else { //Make sure the caller knows that a fields stop being unique when it //stops being a primary key, because its uniqueness was just a //side-effect of it being a primary key. result->set_unique_key(false); primary_key_was_unset = true; } } if(field_old->get_unique_key() != field->get_unique_key()) { if(!primary_key_was_unset && !field->get_unique_key()) { if(field->get_primary_key()) result->set_unique_key(); } } return result; } } sharedptr Base_DB::change_column(const Glib::ustring& table_name, const sharedptr& field_old, const sharedptr& field, Gtk::Window* /* parent_window */) const { ConnectionPool* connection_pool = ConnectionPool::get_instance(); sharedptr result = check_field_change_constraints(field_old, field); try { connection_pool->change_column(table_name, field_old, result); } catch(const Glib::Error& ex) { handle_error(ex); // Gtk::MessageDialog window(*parent_window, Utils::bold_message(ex.what()), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); // window.run(); return sharedptr(); } return result; } bool Base_DB::change_columns(const Glib::ustring& table_name, const type_vec_const_fields& old_fields, type_vec_fields& fields, Gtk::Window* /* parent_window */) const { g_assert(old_fields.size() == fields.size()); type_vec_const_fields pass_fields(fields.size()); for(unsigned int i = 0; i < fields.size(); ++i) { fields[i] = check_field_change_constraints(old_fields[i], fields[i]); pass_fields[i] = fields[i]; } ConnectionPool* connection_pool = ConnectionPool::get_instance(); try { connection_pool->change_columns(table_name, old_fields, pass_fields); } catch(const Glib::Error& ex) { handle_error(ex); // Gtk::MessageDialog window(*parent_window, Utils::bold_message(ex.what()), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); // window.run(); return false; } return true; } #endif //GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr Base_DB::get_connection() { sharedptr sharedconnection; try { sharedconnection = connect_to_server(); } catch (const Glib::Error& error) { std::cerr << G_STRFUNC << ": " << error.what() << std::endl; } if(!sharedconnection) { std::cerr << G_STRFUNC << ": No connection yet." << std::endl; return Glib::RefPtr(0); } Glib::RefPtr gda_connection = sharedconnection->get_gda_connection(); return gda_connection; } #ifndef GLOM_ENABLE_CLIENT_ONLY sharedptr Base_DB::offer_field_list_select_one_field(const Glib::ustring& table_name, Gtk::Window* transient_for) { return offer_field_list_select_one_field(sharedptr(), table_name, transient_for); } sharedptr Base_DB::offer_field_list_select_one_field(const sharedptr& start_field, const Glib::ustring& table_name, Gtk::Window* transient_for) { sharedptr result; Dialog_ChooseField* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; if(dialog) { if(transient_for) dialog->set_transient_for(*transient_for); dialog->set_document(get_document(), table_name, start_field); const int response = dialog->run(); if(response == Gtk::RESPONSE_OK) { //Get the chosen field: result = dialog->get_field_chosen(); } else if(start_field) //Cancel means use the old one: result = glom_sharedptr_clone(start_field); delete dialog; } return result; } Base_DB::type_list_field_items Base_DB::offer_field_list(const Glib::ustring& table_name, Gtk::Window* transient_for) { type_list_field_items result; Dialog_ChooseField* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; if(dialog) { if(transient_for) dialog->set_transient_for(*transient_for); dialog->set_document(get_document(), table_name); const int response = dialog->run(); if(response == Gtk::RESPONSE_OK) { //Get the chosen field: result = dialog->get_fields_chosen(); } delete dialog; } return result; } bool Base_DB::offer_non_field_item_formatting(const sharedptr& layout_item, Gtk::Window* transient_for) { bool result = false; Dialog_Formatting dialog; if(transient_for) dialog.set_transient_for(*transient_for); add_view(&dialog); dialog.set_item(layout_item, false); const int response = dialog.run(); if(response == Gtk::RESPONSE_OK) { //Get the chosen formatting: dialog.use_item_chosen(layout_item); result = true; } //Cancel means use the old one: remove_view(&dialog); return result; } sharedptr Base_DB::offer_field_formatting(const sharedptr& start_field, const Glib::ustring& table_name, Gtk::Window* transient_for, bool show_editable_options) { sharedptr result; Dialog_FieldLayout* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; if(transient_for) dialog->set_transient_for(*transient_for); add_view(dialog); dialog->set_field(start_field, table_name, show_editable_options); const int response = dialog->run(); if(response == Gtk::RESPONSE_OK) { //Get the chosen field: result = dialog->get_field_chosen(); } else if(start_field) //Cancel means use the old one: result = glom_sharedptr_clone(start_field); remove_view(dialog); delete dialog; return result; } sharedptr Base_DB::offer_textobject(const sharedptr& start_textobject, Gtk::Window* transient_for, bool show_title) { sharedptr result = start_textobject; Dialog_TextObject* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; if(transient_for) dialog->set_transient_for(*transient_for); dialog->set_textobject(start_textobject, Glib::ustring(), show_title); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: result = dialog->get_textobject(); } delete dialog; return result; } sharedptr Base_DB::offer_imageobject(const sharedptr& start_imageobject, Gtk::Window* transient_for, bool show_title) { sharedptr result = start_imageobject; Dialog_ImageObject* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; if(transient_for) dialog->set_transient_for(*transient_for); dialog->set_imageobject(start_imageobject, Glib::ustring(), show_title); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: result = dialog->get_imageobject(); } delete dialog; return result; } sharedptr Base_DB::offer_notebook(const sharedptr& start_notebook, Gtk::Window* transient_for) { sharedptr result = start_notebook; Dialog_Notebook* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; if(transient_for) dialog->set_transient_for(*transient_for); dialog->set_notebook(start_notebook); //dialog->set_transient_for(*this); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: result = dialog->get_notebook(); } delete dialog; return result; } #endif // !GLOM_ENABLE_CLIENT_ONLY //static: bool Base_DB::get_field_primary_key_index_for_fields(const type_vec_fields& fields, guint& field_column) { //Initialize input parameter: field_column = 0; //TODO_performance: Cache the primary key? guint col = 0; guint cols_count = fields.size(); while(col < cols_count) { if(fields[col]->get_primary_key()) { field_column = col; return true; } else { ++col; } } return false; //Not found. } //static: bool Base_DB::get_field_primary_key_index_for_fields(const type_vecLayoutFields& fields, guint& field_column) { //Initialize input parameter: field_column = 0; //TODO_performance: Cache the primary key? guint col = 0; guint cols_count = fields.size(); while(col < cols_count) { if(fields[col]->get_full_field_details()->get_primary_key()) { field_column = col; return true; } else { ++col; } } return false; //Not found. } sharedptr Base_DB::get_field_primary_key_for_table(const Glib::ustring& table_name) const { const Document* document = get_document(); if(document) { //TODO_Performance: Cache this result? Document::type_vec_fields fields = document->get_table_fields(table_name); //std::cout << "debug: " << G_STRFUNC << ": table=" << table_name << ", fields count=" << fields.size() << std::endl; for(Document::type_vec_fields::iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr field = *iter; if(!field) continue; //std::cout << " field=" << field->get_name() << std::endl; if(field->get_primary_key()) return *iter; } } return sharedptr(); } void Base_DB::get_table_fields_to_show_for_sequence_add_group(const Glib::ustring& table_name, const Privileges& table_privs, const type_vec_fields& all_db_fields, const sharedptr& group, Base_DB::type_vecConstLayoutFields& vecFields) const { const Document* document = dynamic_cast(get_document()); //g_warning("Box_Data::get_table_fields_to_show_for_sequence_add_group(): table_name=%s, all_db_fields.size()=%d, group->name=%s", table_name.c_str(), all_db_fields.size(), group->get_name().c_str()); LayoutGroup::type_list_items items = group->get_items(); for(LayoutGroup::type_list_items::iterator iterItems = items.begin(); iterItems != items.end(); ++iterItems) { sharedptr item = *iterItems; sharedptr item_field = sharedptr::cast_dynamic(item); if(item_field) { //Get the field info: const Glib::ustring field_name = item->get_name(); if(item_field->get_has_relationship_name()) //If it's a field in a related table. { //TODO_Performance: get_fields_for_table_one_field() is probably very inefficient sharedptr field = DbUtils::get_fields_for_table_one_field(document, item_field->get_table_used(table_name), item->get_name()); if(field) { sharedptr layout_item = item_field; layout_item->set_full_field_details(field); //Fill in the full field information for later. //TODO_Performance: We do this once for each related field, even if there are 2 from the same table: const Privileges privs_related = Privs::get_current_privs(item_field->get_table_used(table_name)); layout_item->m_priv_view = privs_related.m_view; layout_item->m_priv_edit = privs_related.m_edit; vecFields.push_back(layout_item); } else { std::cerr << G_STRFUNC << ": related field not found: field=" << item->get_layout_display_name() << std::endl; } } else //It's a regular field in the table: { type_vec_fields::const_iterator iterFind = std::find_if(all_db_fields.begin(), all_db_fields.end(), predicate_FieldHasName(field_name)); //If the field does not exist anymore then we won't try to show it: if(iterFind != all_db_fields.end() ) { sharedptr layout_item = item_field; layout_item->set_full_field_details(*iterFind); //Fill the LayoutItem with the full field information. //std::cout << "debug: " << G_STRFUNC << ": name=" << layout_item->get_name() << std::endl; //Prevent editing of the field if the user may not edit this table: layout_item->m_priv_view = table_privs.m_view; layout_item->m_priv_edit = table_privs.m_edit; vecFields.push_back(layout_item); } } } else { sharedptr item_group = sharedptr::cast_dynamic(item); if(item_group) { sharedptr item_portal = sharedptr::cast_dynamic(item); if(!item_portal) //Do not recurse into portals. They are filled by means of a separate SQL query. { //Recurse: get_table_fields_to_show_for_sequence_add_group(table_name, table_privs, all_db_fields, item_group, vecFields); } } } } if(vecFields.empty()) { //std::cerr << G_STRFUNC << ": Returning empty list." << std::endl; } } Base_DB::type_vecConstLayoutFields Base_DB::get_table_fields_to_show_for_sequence(const Glib::ustring& table_name, const Document::type_list_layout_groups& mapGroupSequence) const { const Document* pDoc = dynamic_cast(get_document()); //Get field definitions from the database, with corrections from the document: type_vec_fields all_fields = DbUtils::get_fields_for_table(pDoc, table_name); const Privileges table_privs = Privs::get_current_privs(table_name); //Get fields that the document says we should show: type_vecConstLayoutFields result; if(pDoc) { if(mapGroupSequence.empty()) { //No field sequence has been saved in the document, so we use all fields by default, so we start with something visible: //Start with the Primary Key as the first field: guint iPrimaryKey = 0; bool bPrimaryKeyFound = get_field_primary_key_index_for_fields(all_fields, iPrimaryKey); Glib::ustring primary_key_field_name; if(bPrimaryKeyFound) { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(all_fields[iPrimaryKey]); //Don't use thousands separators with ID numbers: layout_item->m_formatting.m_numeric_format.m_use_thousands_separator = false; layout_item->set_editable(true); //A sensible default. //Prevent editing of the field if the user may not edit this table: layout_item->m_priv_view = table_privs.m_view; layout_item->m_priv_edit = table_privs.m_edit; result.push_back(layout_item); } //Add the rest: for(type_vec_fields::const_iterator iter = all_fields.begin(); iter != all_fields.end(); ++iter) { sharedptr field_info = *iter; if((*iter)->get_name() != primary_key_field_name) //We already added the primary key. { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(field_info); layout_item->set_editable(true); //A sensible default. //Prevent editing of the field if the user may not edit this table: layout_item->m_priv_view = table_privs.m_view; layout_item->m_priv_edit = table_privs.m_edit; result.push_back(layout_item); } } } else { type_vec_fields vecFieldsInDocument = pDoc->get_table_fields(table_name); //We will show the fields that the document says we should: for(Document::type_list_layout_groups::const_iterator iter = mapGroupSequence.begin(); iter != mapGroupSequence.end(); ++iter) { sharedptr group = *iter; if(true) //!group->get_hidden()) { //Get the fields: get_table_fields_to_show_for_sequence_add_group(table_name, table_privs, all_fields, group, result); } } } } if(result.empty()) { //std::cerr << G_STRFUNC << ": Returning empty list." << std::endl; } return result; } void Base_DB::calculate_field_in_all_records(const Glib::ustring& table_name, const sharedptr& field) { sharedptr primary_key = get_field_primary_key_for_table(table_name); calculate_field_in_all_records(table_name, field, primary_key); } void Base_DB::calculate_field_in_all_records(const Glib::ustring& table_name, const sharedptr& field, const sharedptr& primary_key) { //Get primary key values for every record: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field(primary_key->get_name(), table_name); builder->select_add_target(table_name); Glib::RefPtr data_model = DbUtils::query_execute_select(builder); if(!data_model || !data_model->get_n_rows() || !data_model->get_n_columns()) { //HandleError(); return; } LayoutFieldInRecord field_in_record; field_in_record.m_table_name = table_name; sharedptr layoutitem_field = sharedptr::create(); layoutitem_field->set_full_field_details(field); field_in_record.m_field = layoutitem_field; field_in_record.m_key = primary_key; //Calculate the value for the field in every record: const int rows_count = data_model->get_n_rows(); for(int row = 0; row < rows_count; ++row) { const Gnome::Gda::Value primary_key_value = data_model->get_value_at(0, row); if(!Conversions::value_is_empty(primary_key_value)) { field_in_record.m_key_value = primary_key_value; m_FieldsCalculationInProgress.clear(); calculate_field(field_in_record); } } } void Base_DB::calculate_field(const LayoutFieldInRecord& field_in_record) { const Glib::ustring field_name = field_in_record.m_field->get_name(); //std::cerr << G_STRFUNC << ": field_name=" << field_name << std::endl; //Do we already have this in our list? type_field_calcs::iterator iterFind = m_FieldsCalculationInProgress.find(field_name); if(iterFind == m_FieldsCalculationInProgress.end()) //If it was not found. { //Add it: CalcInProgress item; item.m_field = field_in_record.m_field->get_full_field_details(); m_FieldsCalculationInProgress[field_name] = item; iterFind = m_FieldsCalculationInProgress.find(field_name); //Always succeeds. } CalcInProgress& refCalcProgress = iterFind->second; //Use the previously-calculated value if possible: if(refCalcProgress.m_calc_in_progress) { //std::cerr << G_STRFUNC << ": Circular calculation detected. field_name=" << field_name << std::endl; //refCalcProgress.m_value = Conversions::get_empty_value(field->get_glom_type()); //Give up. } else if(refCalcProgress.m_calc_finished) { //std::cerr << G_STRFUNC << ": Already calculated." << std::endl; //Don't bother calculating it again. The correct value is already in the database and layout. } else { //std::cerr << G_STRFUNC << ": setting calc_in_progress: field_name=" << field_name << std::endl; refCalcProgress.m_calc_in_progress = true; //Let the recursive calls to calculate_field() check this. sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(refCalcProgress.m_field); //Calculate dependencies first: //TODO: Prevent unncessary recalculations? const type_list_const_field_items fields_needed = get_calculation_fields(field_in_record.m_table_name, field_in_record.m_field); for(type_list_const_field_items::const_iterator iterNeeded = fields_needed.begin(); iterNeeded != fields_needed.end(); ++iterNeeded) { sharedptr field_item_needed = *iterNeeded; if(field_item_needed->get_has_relationship_name()) { //TOOD: Handle related fields? We already handle whole relationships. } else { sharedptr field_needed = field_item_needed->get_full_field_details(); if(field_needed) { if(field_needed->get_has_calculation()) { //g_warning(" calling calculate_field() for %s", iterNeeded->c_str()); //TODO: What if the field is in a different table? LayoutFieldInRecord needed_field_in_record(field_item_needed, field_in_record.m_table_name, field_in_record.m_key, field_in_record.m_key_value); calculate_field(needed_field_in_record); } else { //g_warning(" not a calculated field->"); } } } } //m_FieldsCalculationInProgress has changed, probably invalidating our iter, so get it again: iterFind = m_FieldsCalculationInProgress.find(field_name); //Always succeeds. CalcInProgress& refCalcProgress = iterFind->second; //Check again, because the value miight have been calculated during the dependencies. if(refCalcProgress.m_calc_finished) { //We recently calculated this value, and set it in the database and layout, so don't waste time doing it again: } else { //recalculate: //TODO_Performance: We don't know what fields the python calculation will use, so we give it all of them: const type_map_fields field_values = get_record_field_values_for_calculation(field_in_record.m_table_name, field_in_record.m_key, field_in_record.m_key_value); if(!field_values.empty()) { sharedptr field = refCalcProgress.m_field; if(field) { //We need the connection when we run the script, so that the script may use it. sharedptr sharedconnection = connect_to_server(0 /* parent window */); g_assert(sharedconnection); Glib::ustring error_message; //TODO: Check this. refCalcProgress.m_value = glom_evaluate_python_function_implementation(field->get_glom_type(), field->get_calculation(), field_values, get_document(), field_in_record.m_table_name, field_in_record.m_key, field_in_record.m_key_value, sharedconnection->get_gda_connection(), error_message); refCalcProgress.m_calc_finished = true; refCalcProgress.m_calc_in_progress = false; sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(field); //show it: set_entered_field_data(layout_item, refCalcProgress.m_value ); //TODO: If this record is shown. //Add it to the database (even if it is not shown in the view) //Using true for the last parameter means we use existing calculations where possible, //instead of recalculating a field that is being calculated already, and for which this dependent field is being calculated anyway. Document* document = get_document(); if(document) { LayoutFieldInRecord field_in_record_layout(layout_item, field_in_record.m_table_name /* parent */, field_in_record.m_key, field_in_record.m_key_value); set_field_value_in_database(field_in_record_layout, refCalcProgress.m_value, true); //This triggers other recalculations/lookups. } } } } } } Base_DB::type_map_fields Base_DB::get_record_field_values_for_calculation(const Glib::ustring& table_name, const sharedptr primary_key, const Gnome::Gda::Value& primary_key_value) { type_map_fields field_values; Document* document = get_document(); if(document) { //TODO: Cache the list of all fields, as well as caching (m_Fields) the list of all visible fields: const Document::type_vec_fields fields = document->get_table_fields(table_name); //TODO: This seems silly. We should just have a build_sql_select() that can take this container: type_vecLayoutFields fieldsToGet; for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(*iter); fieldsToGet.push_back(layout_item); } if(!Conversions::value_is_empty(primary_key_value)) { //sharedptr fieldPrimaryKey = get_field_primary_key(); Glib::RefPtr query = Utils::build_sql_select_with_key(table_name, fieldsToGet, primary_key, primary_key_value); Glib::RefPtr data_model; try { data_model = DbUtils::query_execute_select(query); } catch(const Glib::Exception& ex) { std::cerr << G_STRFUNC << ": Exception while executing SQL: " << query << std::endl; handle_error(ex); return field_values; } if(data_model && data_model->get_n_rows()) { int col_index = 0; for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { //There should be only 1 row. Well, there could be more but we will ignore them. sharedptr field = *iter; Gnome::Gda::Value value = data_model->get_value_at(col_index, 0); //Never give a NULL-type value to the python calculation for types that don't use them: //to prevent errors: if(value.is_null()) value = Conversions::get_empty_value(field->get_glom_type()); field_values[field->get_name()] = value; ++col_index; } } else { //Maybe the record does not exist yet //(Maybe we need the field values so we can calculate default values for some fields when creating the record.) //So we create appropriate empty values below. } } if(field_values.empty()) //Maybe there was no primary key, or maybe the record is not yet in the database. { //Create appropriate empty values: for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr field = *iter; field_values[field->get_name()] = Conversions::get_empty_value(field->get_glom_type()); } } } return field_values; } void Base_DB::set_entered_field_data(const sharedptr& /* field */, const Gnome::Gda::Value& /* value */) { //Override this. } void Base_DB::set_entered_field_data(const Gtk::TreeModel::iterator& /* row */, const sharedptr& /* field */, const Gnome::Gda::Value& /* value */) { //Override this. } bool Base_DB::set_field_value_in_database(const LayoutFieldInRecord& field_in_record, const Gnome::Gda::Value& field_value, bool use_current_calculations, Gtk::Window* parent_window) { return set_field_value_in_database(field_in_record, Gtk::TreeModel::iterator(), field_value, use_current_calculations, parent_window); } bool Base_DB::set_field_value_in_database(const LayoutFieldInRecord& layoutfield_in_record, const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& field_value, bool use_current_calculations, Gtk::Window* /* parent_window */) { Document* document = get_document(); g_assert(document); const FieldInRecord field_in_record = layoutfield_in_record.get_fieldinrecord(*document); //row is invalid, and ignored, for Box_Data_Details. if(!(field_in_record.m_field)) { std::cerr << G_STRFUNC << ": field_in_record.m_field is empty." << std::endl; return false; } if(!(field_in_record.m_key)) { std::cerr << G_STRFUNC << ": field_in_record.m_key is empty." << std::endl; return false; } const Glib::ustring field_name = field_in_record.m_field->get_name(); if(!field_name.empty()) //This should not happen. { const Gnome::Gda::SqlExpr where_clause = Utils::build_simple_where_expression(field_in_record.m_table_name, field_in_record.m_key, field_in_record.m_key_value); const Glib::RefPtr builder = Utils::build_sql_update_with_where_clause(field_in_record.m_table_name, field_in_record.m_field, field_value, where_clause); try //TODO: The exceptions are probably already handled by query_execute( { const bool test = DbUtils::query_execute(builder); //TODO: Respond to failure. if(!test) { std::cerr << G_STRFUNC << ": UPDATE failed." << std::endl; return false; //failed. } } catch(const Glib::Exception& ex) { handle_error(ex); return false; } catch(const std::exception& ex) { handle_error(ex); return false; } //Get-and-set values for lookup fields, if this field triggers those relationships: do_lookups(layoutfield_in_record, row, field_value); //Update related fields, if this field is used in the relationship: refresh_related_fields(layoutfield_in_record, row, field_value); //Calculate any dependent fields. //TODO: Make lookups part of this? //Prevent circular calculations during the recursive do_calculations: { //Recalculate any calculated fields that depend on this calculated field. //std::cerr << G_STRFUNC << ": calling do_calculations" << std::endl; do_calculations(layoutfield_in_record, !use_current_calculations); } } return true; } Gnome::Gda::Value Base_DB::get_field_value_in_database(const LayoutFieldInRecord& field_in_record, Gtk::Window* /* parent_window */) { Gnome::Gda::Value result; //TODO: Return suitable empty value for the field when failing? //row is invalid, and ignored, for Box_Data_Details. if(!(field_in_record.m_field)) { std::cerr << G_STRFUNC << ": field_in_record.m_field is empty." << std::endl; return result; } //Check that there is a key value, if there should be one: //System Preferences, for instance, should not need a key to identify the record: if(!(field_in_record.m_key)) { Glib::ustring to_field; if(field_in_record.m_field && field_in_record.m_field->get_relationship()) { to_field = field_in_record.m_field->get_relationship()->get_to_field(); } if(!to_field.empty()) { std::cerr << G_STRFUNC << ": field_in_record.m_key is empty." << std::endl; return result; } } type_vecConstLayoutFields list_fields; sharedptr layout_item = field_in_record.m_field; list_fields.push_back(layout_item); Glib::RefPtr sql_query = Utils::build_sql_select_with_key(field_in_record.m_table_name, list_fields, field_in_record.m_key, field_in_record.m_key_value, type_sort_clause(), 1); Glib::RefPtr data_model = DbUtils::query_execute_select(sql_query); if(data_model) { if(data_model->get_n_rows()) { result = data_model->get_value_at(0, 0); } } else { handle_error(); } return result; } Gnome::Gda::Value Base_DB::get_field_value_in_database(const sharedptr& field, const FoundSet& found_set, Gtk::Window* /* parent_window */) { Gnome::Gda::Value result; //TODO: Return suitable empty value for the field when failing? //row is invalid, and ignored, for Box_Data_Details. if(!field) { std::cerr << G_STRFUNC << ": field is empty." << std::endl; return result; } if(found_set.m_where_clause.empty()) { std::cerr << G_STRFUNC << ": where_clause is empty." << std::endl; return result; } type_vecConstLayoutFields list_fields; sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(field); list_fields.push_back(layout_item); Glib::RefPtr sql_query = Utils::build_sql_select_with_where_clause(found_set.m_table_name, list_fields, found_set.m_where_clause, sharedptr() /* extra_join */, type_sort_clause(), 1 /* limit */); Glib::RefPtr data_model = DbUtils::query_execute_select(sql_query); if(data_model) { if(data_model->get_n_rows()) { result = data_model->get_value_at(0, 0); } } else { handle_error(); } return result; } void Base_DB::do_calculations(const LayoutFieldInRecord& field_changed, bool first_calc_field) { //std::cout << "debug: " << G_STRFUNC << ": field_changed=" << field_changed.m_field->get_name() << std::endl; if(first_calc_field) { //g_warning(" clearing m_FieldsCalculationInProgress"); m_FieldsCalculationInProgress.clear(); } //Recalculate fields that are triggered by a change of this field's value, not including calculations that these calculations use. type_list_const_field_items calculated_fields = get_calculated_fields(field_changed.m_table_name, field_changed.m_field); //std::cout << " debug: calculated_field.size()=" << calculated_fields.size() << std::endl; for(type_list_const_field_items::const_iterator iter = calculated_fields.begin(); iter != calculated_fields.end(); ++iter) { sharedptr field = *iter; if(field) { //std::cout << "debug: recalcing field: " << field->get_name() << std::endl; //TODO: What if the field is in another table? LayoutFieldInRecord triggered_field(field, field_changed.m_table_name, field_changed.m_key, field_changed.m_key_value); calculate_field(triggered_field); //And any dependencies. //Calculate anything that depends on this. do_calculations(triggered_field, false /* recurse, reusing m_FieldsCalculationInProgress */); } } if(first_calc_field) m_FieldsCalculationInProgress.clear(); } Base_DB::type_list_const_field_items Base_DB::get_calculated_fields(const Glib::ustring& table_name, const sharedptr& field) { //std::cout << "debug: Base_DB::get_calculated_fields field=" << field->get_name() << std::endl; type_list_const_field_items result; const Document* document = dynamic_cast(get_document()); if(document) { //Look at each field in the table, and get lists of what fields trigger their calculations, //so we can see if our field is in any of those lists: const type_vec_fields fields = document->get_table_fields(table_name); //TODO_Performance: Cache this? //Examine all fields, not just the the shown fields. //TODO: How do we trigger relcalculation of related fields if necessary? for(type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr field_to_examine = *iter; sharedptr layoutitem_field_to_examine = sharedptr::create(); layoutitem_field_to_examine->set_full_field_details(field_to_examine); //std::cout << " debug: examining field=" << field_to_examine->get_name() << std::endl; //Does this field's calculation use the field? const type_list_const_field_items fields_triggered = get_calculation_fields(table_name, layoutitem_field_to_examine); //std::cout << " debug: field_triggered.size()=" << fields_triggered.size() << std::endl; type_list_const_field_items::const_iterator iterFind = std::find_if(fields_triggered.begin(), fields_triggered.end(), predicate_LayoutItemIsEqual(field)); if(iterFind != fields_triggered.end()) { //std::cout << " debug: FOUND: name=" << layoutitem_field_to_examine->get_name() << std::endl; //Tell the caller that this field is triggered by the specified field: //TODO: Test related fields too? result.push_back(layoutitem_field_to_examine); } } } return result; } Base_DB::type_list_const_field_items Base_DB::get_calculation_fields(const Glib::ustring& table_name, const sharedptr& layoutitem_field) { //TODO: Use regex, for instance with pcre here? //TODO: Better?: Run the calculation on some example data, and record the touched fields? But this could not exercise every code path. //TODO_Performance: Just cache the result whenever m_calculation changes. type_list_const_field_items result; sharedptr field = layoutitem_field->get_full_field_details(); if(!field) return result; Glib::ustring::size_type index = 0; const Glib::ustring calculation = field->get_calculation(); if(calculation.empty()) return result; Document* document = get_document(); if(!document) return result; const Glib::ustring::size_type count = calculation.size(); const Glib::ustring prefix = "record[\""; const Glib::ustring::size_type prefix_size = prefix.size(); while(index < count) { Glib::ustring::size_type pos_find = calculation.find(prefix, index); if(pos_find != Glib::ustring::npos) { Glib::ustring::size_type pos_find_end = calculation.find("\"]", pos_find); if(pos_find_end != Glib::ustring::npos) { Glib::ustring::size_type pos_start = pos_find + prefix_size; const Glib::ustring field_name = calculation.substr(pos_start, pos_find_end - pos_start); sharedptr field_found = document->get_field(table_name, field_name); if(field) { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(field_found); result.push_back(layout_item); } index = pos_find_end + 1; } } ++index; } //Check the use of related records too: const Field::type_list_strings relationships_used = field->get_calculation_relationships(); for(Field::type_list_strings::const_iterator iter = relationships_used.begin(); iter != relationships_used.end(); ++iter) { sharedptr relationship = document->get_relationship(table_name, *iter); if(relationship) { //If the field uses this relationship then it should be triggered by a change in the key that specifies which record the relationship points to: const Glib::ustring field_from_name = relationship->get_from_field(); sharedptr field_from = document->get_field(table_name, field_from_name); if(field_from) { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(field_from); result.push_back(layout_item); } } } return result; } void Base_DB::do_lookups(const LayoutFieldInRecord& field_in_record, const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& field_value) { Document* document = get_document(); if(!document) return; //Get values for lookup fields, if this field triggers those relationships: //TODO_performance: There is a LOT of iterating and copying here. const Glib::ustring strFieldName = field_in_record.m_field->get_name(); const Document::type_list_lookups lookups = document->get_lookup_fields(field_in_record.m_table_name, strFieldName); //std::cout << "debug: " << G_STRFUNC << ": lookups size=" << lookups.size() << std::endl; for(Document::type_list_lookups::const_iterator iter = lookups.begin(); iter != lookups.end(); ++iter) { sharedptr layout_item = iter->first; //std::cout << "debug: " << G_STRFUNC << ": item=" << layout_item->get_name() << std::endl; sharedptr relationship = iter->second; const sharedptr field_lookup = layout_item->get_full_field_details(); if(field_lookup) { sharedptr field_source = DbUtils::get_fields_for_table_one_field(document, relationship->get_to_table(), field_lookup->get_lookup_field()); if(field_source) { const Gnome::Gda::Value value = DbUtils::get_lookup_value(document, field_in_record.m_table_name, iter->second /* relationship */, field_source /* the field to look in to get the value */, field_value /* Value of to and from fields */); const Gnome::Gda::Value value_converted = Conversions::convert_value(value, layout_item->get_glom_type()); LayoutFieldInRecord field_in_record_to_set(layout_item, field_in_record.m_table_name /* parent table */, field_in_record.m_key, field_in_record.m_key_value); //Add it to the view: set_entered_field_data(row, layout_item, value_converted); //m_AddDel.set_value(row, layout_item, value_converted); //Add it to the database (even if it is not shown in the view) set_field_value_in_database(field_in_record_to_set, row, value_converted); //Also does dependent lookups/recalcs. //TODO: Handle lookups triggered by these fields (recursively)? TODO: Check for infinitely looping lookups. } } } } void Base_DB::refresh_related_fields(const LayoutFieldInRecord& /* field_in_record_changed */, const Gtk::TreeModel::iterator& /* row */, const Gnome::Gda::Value& /* field_value */) { //overridden in Box_Data. } bool Base_DB::get_field_value_is_unique(const Glib::ustring& table_name, const sharedptr& field, const Gnome::Gda::Value& value) { bool result = true; //Arbitrarily default to saying it's unique if we can't get any result. const Glib::ustring table_name_used = field->get_table_used(table_name); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field(field->get_name(), table_name_used); builder->select_add_target(table_name_used); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(field->get_name(), table_name_used), builder->add_expr(value))); Glib::RefPtr data_model = DbUtils::query_execute_select(builder); if(data_model) { //std::cout << "debug: " << G_STRFUNC << ": table_name=" << table_name << ", field name=" << field->get_name() << ", value=" << value.to_string() << ", rows count=" << data_model->get_n_rows() << std::endl; //The value is unique for this field, if the query returned no existing rows: result = (data_model->get_n_rows() == 0); } else { handle_error(); } return result; } bool Base_DB::check_entered_value_for_uniqueness(const Glib::ustring& table_name, const sharedptr& layout_field, const Gnome::Gda::Value& field_value, Gtk::Window* parent_window) { return check_entered_value_for_uniqueness(table_name, Gtk::TreeModel::iterator(), layout_field, field_value, parent_window); } bool Base_DB::check_entered_value_for_uniqueness(const Glib::ustring& table_name, const Gtk::TreeModel::iterator& /* row */, const sharedptr& layout_field, const Gnome::Gda::Value& field_value, Gtk::Window* parent_window) { //Check whether the value meets uniqueness constraints, if any: const sharedptr& field = layout_field->get_full_field_details(); if(field && (field->get_primary_key() || field->get_unique_key())) { if(!get_field_value_is_unique(table_name, layout_field, field_value)) { //std::cout << "debug: " << G_STRFUNC << ": field=" << layout_field->get_name() << ", value is not unique: " << field_value.to_string() << std::endl; //Warn the user and revert the value: if(parent_window) Frame_Glom::show_ok_dialog(_("Value Is Not Unique"), _("The field's value must be unique, but a record with this value already exists."), *parent_window); return false; //Failed. } else return true; //Succeed, because the value is unique. } else return true; //Succeed, because the value does not need to be unique. } bool Base_DB::get_relationship_exists(const Glib::ustring& table_name, const Glib::ustring& relationship_name) { Document* document = get_document(); if(document) { sharedptr relationship = document->get_relationship(table_name, relationship_name); if(relationship) return true; } return false; } bool Base_DB::get_primary_key_is_in_foundset(const FoundSet& found_set, const Gnome::Gda::Value& primary_key_value) { //TODO_Performance: This is probably called too often, when we should know that the key is in the found set. sharedptr primary_key = get_field_primary_key_for_table(found_set.m_table_name); if(!primary_key) { std::cerr << G_STRFUNC << ": No primary key found for table: " << found_set.m_table_name << std::endl; return false; } type_vecLayoutFields fieldsToGet; sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(primary_key); fieldsToGet.push_back(layout_item); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_target(found_set.m_table_name); const guint eq_id = builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(primary_key->get_name(), found_set.m_table_name), builder->add_expr_as_value(primary_key_value)); guint cond_id = 0; if(found_set.m_where_clause.empty()) { cond_id = eq_id; } else { cond_id = builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_AND, builder->import_expression(found_set.m_where_clause), eq_id); } builder->set_where(cond_id); //This might be unnecessary. cond_id = eq_id; Glib::RefPtr query = Utils::build_sql_select_with_where_clause(found_set.m_table_name, fieldsToGet, builder->export_expression(cond_id)); Glib::RefPtr data_model = DbUtils::query_execute_select(query); if(data_model && data_model->get_n_rows()) { //std::cout << "debug: Record found: " << query << std::endl; return true; //A record was found in the record set with this value. } else return false; } void Base_DB::set_found_set_where_clause_for_portal(FoundSet& found_set, const sharedptr& portal, const Gnome::Gda::Value& foreign_key_value) { found_set.m_table_name = Glib::ustring(); found_set.m_where_clause = Gnome::Gda::SqlExpr(); found_set.m_extra_join = sharedptr(); if( !portal || Conversions::value_is_empty(foreign_key_value) ) { return; } sharedptr relationship = portal->get_relationship(); // Notice that, in the case that this is a portal to doubly-related records, // The WHERE clause mentions the first-related table (though by the alias defined in extra_join) // and we add an extra JOIN to mention the second-related table. Document* document = get_document(); Glib::ustring where_clause_to_table_name = relationship->get_to_table(); sharedptr where_clause_to_key_field = DbUtils::get_fields_for_table_one_field(document, relationship->get_to_table(), relationship->get_to_field()); found_set.m_table_name = portal->get_table_used(Glib::ustring() /* parent table - not relevant */); sharedptr relationship_related = portal->get_related_relationship(); if(relationship_related) { //Add the extra JOIN: sharedptr uses_rel_temp = sharedptr::create(); uses_rel_temp->set_relationship(relationship); found_set.m_extra_join = relationship; //Adjust the WHERE clause appropriately for the extra JOIN: where_clause_to_table_name = uses_rel_temp->get_sql_join_alias_name(); const Glib::ustring to_field_name = uses_rel_temp->get_to_field_used(); where_clause_to_key_field = DbUtils::get_fields_for_table_one_field(document, relationship->get_to_table(), to_field_name); //std::cout << "extra_join=" << found_set.m_extra_join << std::endl; //std::cout << "extra_join where_clause_to_key_field=" << where_clause_to_key_field->get_name() << std::endl; } if(where_clause_to_key_field) { found_set.m_where_clause = Utils::build_simple_where_expression(where_clause_to_table_name, where_clause_to_key_field, foreign_key_value); } } bool Base_DB::set_database_owner_user(const Glib::ustring& user) { if(user.empty()) return false; ConnectionPool* connectionpool = ConnectionPool::get_instance(); const Glib::ustring database_name = connectionpool->get_database(); if(database_name.empty()) return false; const Glib::ustring strQuery = "ALTER DATABASE " + DbUtils::escape_sql_id(database_name) + " OWNER TO " + DbUtils::escape_sql_id(user); const bool test = DbUtils::query_execute_string(strQuery); if(!test) { std::cerr << G_STRFUNC << ": ALTER DATABASE failed." << std::endl; return false; } return true; } bool Base_DB::disable_user(const Glib::ustring& user) { if(user.empty()) return false; type_vec_strings vecGroups = Privs::get_groups_of_user(user); for(type_vec_strings::const_iterator iter = vecGroups.begin(); iter != vecGroups.end(); ++iter) { const Glib::ustring group = *iter; DbUtils::remove_user_from_group(user, group); } const Glib::ustring strQuery = "ALTER ROLE " + DbUtils::escape_sql_id(user) + " NOLOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE"; const bool test = DbUtils::query_execute_string(strQuery); if(!test) { std::cerr << G_STRFUNC << ": DROP USER failed" << std::endl; return false; } return true; } Glib::ustring Base_DB::get_active_layout_platform(Document* document) { Glib::ustring result; if(document) result = document->get_active_layout_platform(); return result; } } //namespace Glom glom-1.22.4/glom/filechooser_export.h0000644000175000017500000000340012234252645021000 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_FILECHOOSER_EXPORT_H #define GLOM_FILECHOOSER_EXPORT_H #include #include namespace Glom { class Dialog_Layout_Export; class FileChooser_Export : public Gtk::FileChooserDialog { public: FileChooser_Export(); virtual ~FileChooser_Export(); void set_export_layout(const Document::type_list_layout_groups& layout_groups, const Glib::ustring& table_name, Document* document); void get_layout_groups(Document::type_list_layout_groups& layout_groups) const; private: #ifndef GLOM_ENABLE_CLIENT_ONLY void on_button_define_layout(); void on_dialog_layout_hide(); #endif //Member widgets: Gtk::Box m_extra_widget; #ifndef GLOM_ENABLE_CLIENT_ONLY Gtk::Button m_button_format; Dialog_Layout_Export* m_pDialogLayout; #endif //GLOM_ENABLE_CLIENT_ONLY Glib::ustring m_table_name; Document::type_list_layout_groups m_layout_groups; Document* m_document; }; } //namespace Glom #endif // GLOM_FILESCHOOSER_EXPORT_H glom-1.22.4/glom/base_db_table_data_readonly.cc0000644000175000017500000000257412234252645022662 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include "base_db_table_data.h" #include #include #include #include #include #include #include namespace Glom { Base_DB_Table_Data_ReadOnly::Base_DB_Table_Data_ReadOnly() { } Base_DB_Table_Data_ReadOnly::~Base_DB_Table_Data_ReadOnly() { } bool Base_DB_Table_Data_ReadOnly::refresh_data_from_database() { if(!ConnectionPool::get_instance()->get_ready_to_connect()) return false; return fill_from_database(); } } //namespace Glom glom-1.22.4/glom/box_db_table.h0000644000175000017500000000257112234252645017511 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BOX_DB_TABLE_H #define GLOM_BOX_DB_TABLE_H #include #include #include #include namespace Glom { /** A Box that has access to a database table's structure. */ class Box_DB_Table : public Box_WithButtons, public Base_DB_Table { public: Box_DB_Table(); Box_DB_Table(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Box_DB_Table(); Gtk::Window* get_app_window(); const Gtk::Window* get_app_window() const; }; } //namespace Glom #endif // GLOM_BOX_DB_TABLE_H glom-1.22.4/glom/box_db_table.cc0000644000175000017500000000262612234252645017650 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "box_db_table.h" #include #include #include namespace Glom { Box_DB_Table::Box_DB_Table() { } Box_DB_Table::Box_DB_Table(BaseObjectType* cobject, const Glib::RefPtr& builder) : Box_WithButtons(cobject, builder) { } Box_DB_Table::~Box_DB_Table() { } const Gtk::Window* Box_DB_Table::get_app_window() const { Box_DB_Table* nonconst = const_cast(this); return nonconst->get_app_window(); } Gtk::Window* Box_DB_Table::get_app_window() { return dynamic_cast(get_toplevel()); } } //namespace Glom glom-1.22.4/glom/appwindow.h0000644000175000017500000002471212234776363017126 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_APP_WINDOW_H #define GLOM_APP_WINDOW_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include //Avoid including the header here: extern "C" { typedef struct AvahiStringList AvahiStringList; typedef struct _EpcServiceInfo EpcServiceInfo; } namespace Glom { class Window_Translations; class AppWindow : public GlomBakery::AppWindow_WithDoc_Gtk { public: static const char* glade_id; static const bool glade_developer; AppWindow(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~AppWindow(); /** * @param restore Whether @a document_uri is a .tar.gz backup file to restore. */ bool init_with_document(const Glib::ustring& document_uri = Glib::ustring(), bool restore = false); //override //virtual void statusbar_set_text(const Glib::ustring& strText); //virtual void statusbar_clear(); /// Get the UIManager so we can merge new menus in. Glib::RefPtr get_ui_manager(); /** Changes the mode to Data mode, as if the user had selected the Data Mode menu item. */ void set_mode_data(); void set_mode_find(); /** Show in the UI whether the database is shared on the network. */ void update_network_shared_ui(); #ifndef GLOM_ENABLE_CLIENT_ONLY void add_developer_action(const Glib::RefPtr& refAction); void remove_developer_action(const Glib::RefPtr& refAction); /** Show in the UI whether the document is in developer or operator mode. */ void update_userlevel_ui(); #endif // !GLOM_ENABLE_CLIENT_ONLY /** Enable/disable UI elements depending on whether a table is loaded. */ void update_table_sensitive_ui(); AppState::userlevels get_userlevel() const; void fill_menu_tables(); void fill_menu_reports(const Glib::ustring& table_name); void fill_menu_print_layouts(const Glib::ustring& table_name); void enable_menu_print_layouts_details(bool enable = true); #ifndef GLOM_ENABLE_CLIENT_ONLY void do_menu_developer_fields(Gtk::Window& parent, const Glib::ustring table_name); void do_menu_developer_relationships(Gtk::Window& parent, const Glib::ustring table_name); void do_print_layout(const Glib::ustring& print_layout_name, bool preview = false, Gtk::Window* transient_for = 0); bool do_restore_backup(const Glib::ustring& backup_uri); #endif //GLOM_ENABLE_CLIENT_ONLY ///Whether to show the generated SQL queries on stdout, for debugging. bool get_show_sql_debug() const; ///Whether to show the generated SQL queries on stdout, for debugging. void set_show_sql_debug(bool val = true); ///Whether to automatically shutdown the database server when Glom crashes. void set_stop_auto_server_shutdown(bool val = true); void show_table_details(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value); void show_table_list(const Glib::ustring& table_name); /** Print the named report for the current table. */ void print_report(const Glib::ustring& report_name); /** Print the current layout for the current table. */ void print_layout(); /** Offer the user the UI to add a new record, */ void start_new_record(); void set_progress_message(const Glib::ustring& message); void pulse_progress_message(); void clear_progress_message(); /** Set the locale used for original text of titles. This * must usually be stored in the document. * Ideally, it would be English. */ static void set_original_locale(const Glib::ustring& locale); static Glib::ustring get_original_locale(); static bool get_current_locale_not_original(); /** Set the locale used for titles, to test translations. * Usually the current locale is just the locale at startup. */ static void set_current_locale(const Glib::ustring& locale); /** Get the locale used by this program when it was started, * or the locale set by set_current_locale(). */ static Glib::ustring get_current_locale(); static AppWindow* get_appwindow(); protected: virtual void ui_warning_load_failed(int failure_code = 0); //Override. private: virtual void init_layout(); //override. virtual void init_menus(); //override. virtual void init_toolbars(); //override virtual void init_create_document(); //override virtual bool on_document_load(); //override. virtual void on_document_close(); //override. virtual void update_window_title(); //override. virtual void init_menus_file(); //override. bool offer_new_or_existing(); void on_menu_help_contents(); /** Check that the file's hosting mode is supported by this build and * tell the user if necessary. */ bool check_document_hosting_mode_is_supported(Document* document); #ifndef GLOM_ENABLE_CLIENT_ONLY void existing_or_new_new(); void on_menu_file_toggle_share(); void on_menu_developer_developer(); void on_menu_developer_operator(); void on_menu_file_save_as_example(); void on_menu_developer_changelanguage(); void on_menu_developer_translations(); void on_menu_developer_active_platform_normal(); void on_menu_developer_active_platform_maemo(); void on_menu_developer_export_backup(); void on_menu_developer_restore_backup(); void on_menu_developer_enable_layout_drag_and_drop (); void on_window_translations_hide(); virtual Glib::ustring ui_file_select_save(const Glib::ustring& old_file_uri); //overridden. void on_userlevel_changed(AppState::userlevels userlevel); Document* on_connection_pool_get_document(); bool recreate_database_from_example(bool& user_cancelled); //return indicates success. bool recreate_database_from_backup(const Glib::ustring& backup_uri, bool& user_cancelled); //return indicates success. void on_recreate_database_progress(); void stop_self_hosting_of_document_database(); void on_connection_avahi_begin(); void on_connection_avahi_progress(); void on_connection_avahi_done(); #endif // !GLOM_ENABLE_CLIENT_ONLY void on_menu_help_about(); void on_about_close(); #ifndef G_OS_WIN32 /** Offer a file chooser dialog, with a Browse Network button. * @param browsed This will be set to true if the user chose a networked glom instance to open. * @browsed_server This will be filled with the server details if browsed was set to true. */ Glib::ustring ui_file_select_open_with_browse(bool& browsed, EpcServiceInfo*& browsed_server, Glib::ustring& browsed_service_name, const Glib::ustring& starting_folder_uri = Glib::ustring()); #endif // !G_OS_WIN32 virtual void document_history_add(const Glib::ustring& file_uri); //overridden. virtual void new_instance(const Glib::ustring& uri = Glib::ustring()); //Override void on_connection_create_database_progress(); void on_connection_close_progress(); void on_connection_save_backup_progress(); void on_connection_convert_backup_progress(); #ifndef G_OS_WIN32 void open_browsed_document(const EpcServiceInfo* server, const Glib::ustring& service_name); #endif // !G_OS_WIN32 typedef GlomBakery::AppWindow_WithDoc_Gtk type_base; //Widgets: Glib::RefPtr m_refActionGroup_Others; typedef std::list< Glib::RefPtr > type_listActions; type_listActions m_listDeveloperActions; //Only enabled when in developer mode. type_listActions m_listTableSensitiveActions; // Only enabled when a table is loaded. Glib::RefPtr m_action_mode_find; #ifndef GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr m_action_developer_users; Glib::RefPtr m_action_menu_developer_developer, m_action_menu_developer_operator; Glib::RefPtr m_action_enable_layout_drag_and_drop ; #endif // !GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr m_toggleaction_network_shared; sigc::connection m_connection_toggleaction_network_shared; Gtk::Box* m_pBoxTop; Frame_Glom* m_pFrame; bool m_bAboutShown; Gtk::AboutDialog* m_pAbout; //About box. Infobar_ProgressCreating* m_infobar_progress; std::string m_progress_collate_key; #ifndef GLOM_ENABLE_CLIENT_ONLY Window_Translations* m_window_translations; #endif // !GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr m_refHelpActionGroup; Glib::RefPtr m_refNavTablesActionGroup, m_refNavReportsActionGroup, m_refNavPrintLayoutsActionGroup; type_listActions m_listNavTableActions, m_listNavReportActions, m_listNavPrintLayoutActions; Gtk::UIManager::ui_merge_id m_menu_tables_ui_merge_id, m_menu_reports_ui_merge_id, m_menu_print_layouts_ui_merge_id; #ifndef GLOM_ENABLE_CLIENT_ONLY //Set these before calling offer_saveas() (which uses ui_file_select_save()), and clear it afterwards. bool m_ui_save_extra_showextras; Glib::ustring m_ui_save_extra_title; Glib::ustring m_ui_save_extra_message; Glib::ustring m_ui_save_extra_newdb_title; Document::HostingMode m_ui_save_extra_newdb_hosting_mode; Gtk::MessageDialog* m_avahi_progress_dialog; #endif // !GLOM_ENABLE_CLIENT_ONLY // This is set to the URI of an example file that is loaded to be able to // prevent adding it into the recently used resources in // document_history_add(). Glib::ustring m_example_uri; //A temporary store for the username/password if //we already asked for them when getting the document over the network, //so we can use them again when connecting directly to the database: Glib::ustring m_temp_username, m_temp_password; bool m_show_sql_debug; static Glib::ustring m_current_locale, m_original_locale; }; Glib::ustring item_get_title(const sharedptr& item); Glib::ustring item_get_title_or_name(const sharedptr& item); } //namespace Glom #endif // GLOM_APP_WINDOW_H glom-1.22.4/glom/frame_glom.cc0000644000175000017500000025162212234776424017364 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" //For GLOM_ENABLE_SQLITE #include // For GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include #ifdef GLOM_ENABLE_POSTGRESQL #include #include #endif #ifndef GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include #include #include #include #endif // !GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include #ifndef GLOM_ENABLE_CLIENT_ONLY #include #include #include #endif // !GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include #include //For stringstream. #include #include namespace Glom { Frame_Glom::Frame_Glom(BaseObjectType* cobject, const Glib::RefPtr& builder) : PlaceHolder(cobject, builder), m_pLabel_Table_DataMode(0), m_pLabel_Table_FindMode(0), m_Box_RecordsCount(Gtk::ORIENTATION_HORIZONTAL, Utils::DEFAULT_SPACING_SMALL), m_Button_FindAll(_("Find All")), m_pBox_Mode(0), m_pBox_Tables(0), m_pDialog_Tables(0), m_pBox_QuickFind(0), m_pEntry_QuickFind(0), m_pButton_QuickFind(0), #ifndef GLOM_ENABLE_CLIENT_ONLY m_pDialog_Reports(0), m_pDialogLayoutReport(0), m_pBox_Reports(0), m_pDialog_PrintLayouts(0), m_pDialogLayoutPrint(0), m_pBox_PrintLayouts(0), m_pDialog_Fields(0), m_pDialog_Relationships(0), m_dialog_addrelatedtable(0), m_dialog_relationships_overview(0), #endif // !GLOM_ENABLE_CLIENT_ONLY m_pDialogConnection(0) { m_pLabel_Table_DataMode = Gtk::manage(new Gtk::Label(_("No Table Selected"))); m_pLabel_Table_DataMode->show(); m_Notebook_Data.set_action_widget(m_pLabel_Table_DataMode, Gtk::PACK_START); m_pLabel_Table_FindMode = Gtk::manage(new Gtk::Label(_("No Table Selected"))); m_pLabel_Table_FindMode->show(); m_Notebook_Find.set_action_widget(m_pLabel_Table_FindMode, Gtk::PACK_START); //QuickFind widgets: //We don't use Glade for these, so it easier to modify them for the Maemo port. m_pBox_QuickFind = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, Utils::DEFAULT_SPACING_SMALL)); Gtk::Label* label = Gtk::manage(new Gtk::Label(_("Quick _search:"), true)); m_pBox_QuickFind->pack_start(*label, Gtk::PACK_SHRINK); m_pEntry_QuickFind = Gtk::manage(new Gtk::Entry()); //Pressing Enter here is like pressing Find: m_pEntry_QuickFind->set_activates_default(); label->set_mnemonic_widget(*m_pEntry_QuickFind); m_pBox_QuickFind->pack_start(*m_pEntry_QuickFind, Gtk::PACK_EXPAND_WIDGET); m_pButton_QuickFind = Gtk::manage(new Gtk::Button(_("_Find"), true)); m_pButton_QuickFind->signal_clicked().connect( sigc::mem_fun(*this, &Frame_Glom::on_button_quickfind) ); m_pBox_QuickFind->pack_start(*m_pButton_QuickFind, Gtk::PACK_SHRINK); m_pBox_QuickFind->show_all_children(); m_pBox_QuickFind->hide(); PlaceHolder* placeholder_quickfind = 0; builder->get_widget_derived("vbox_quickfind", placeholder_quickfind); if(placeholder_quickfind) placeholder_quickfind->add(*m_pBox_QuickFind); //Add the Records/Found widgets at the right of the notebook tabs: m_Box_RecordsCount.pack_start( *Gtk::manage(new Gtk::Label(_("Records:"))), Gtk::PACK_SHRINK); m_Box_RecordsCount.pack_start(m_Label_RecordsCount, Gtk::PACK_SHRINK); m_Box_RecordsCount.pack_start( *Gtk::manage(new Gtk::Label(_("Found:"))), Gtk::PACK_SHRINK); m_Box_RecordsCount.pack_start(m_Label_FoundCount, Gtk::PACK_SHRINK); m_Box_RecordsCount.pack_start(m_Button_FindAll, Gtk::PACK_SHRINK); m_Box_RecordsCount.show_all(); m_Notebook_Data.set_action_widget(&m_Box_RecordsCount, Gtk::PACK_END); m_Button_FindAll.signal_clicked().connect( sigc::mem_fun(*this, &Frame_Glom::on_button_find_all) ); builder->get_widget_derived("vbox_mode", m_pBox_Mode); m_Mode = MODE_None; m_Mode_Previous = MODE_None; m_Notebook_Find.signal_find_criteria.connect(sigc::mem_fun(*this, &Frame_Glom::on_notebook_find_criteria)); m_Notebook_Find.show(); m_Notebook_Data.signal_record_details_requested().connect(sigc::mem_fun(*this, &Frame_Glom::on_notebook_data_record_details_requested)); m_Notebook_Data.signal_record_selection_changed().connect(sigc::mem_fun(*this, &Frame_Glom::on_notebook_data_record_selection_changed)); m_Notebook_Data.signal_switch_page().connect(sigc::mem_fun(*this, &Frame_Glom::on_notebook_data_switch_page)); m_Notebook_Data.show(); //Fill Composite View: //This means that set_document and load/save are delegated to these children: add_view(&m_Notebook_Data); //Also a composite view. add_view(&m_Notebook_Find); //Also a composite view. on_userlevel_changed(AppState::USERLEVEL_OPERATOR); //A default to show before a document is created or loaded. } Frame_Glom::~Frame_Glom() { if(m_pBox_Tables) remove_view(m_pBox_Tables); delete m_pDialog_Tables; m_pDialog_Tables = 0; remove_view(&m_Notebook_Data); //Also a composite view. remove_view(&m_Notebook_Find); //Also a composite view. if(m_pDialogConnection) { remove_view(m_pDialogConnection); delete m_pDialogConnection; m_pDialogConnection = 0; } #ifndef GLOM_ENABLE_CLIENT_ONLY if(m_pBox_Reports) remove_view(m_pBox_Reports); if(m_pBox_PrintLayouts) remove_view(m_pBox_PrintLayouts); if(m_pDialog_Relationships) { remove_view(m_pDialog_Relationships); delete m_pDialog_Relationships; m_pDialog_Relationships = 0; } if(m_pDialogLayoutReport) { remove_view(m_pDialogLayoutReport); delete m_pDialogLayoutReport; m_pDialogLayoutReport = 0; } if(m_pDialogLayoutPrint) { remove_view(m_pDialogLayoutPrint); delete m_pDialogLayoutPrint; m_pDialogLayoutPrint = 0; } if(m_pDialog_Fields) { remove_view(m_pDialog_Fields); delete m_pDialog_Fields; m_pDialog_Fields = 0; } if(m_dialog_addrelatedtable) { remove_view(m_dialog_addrelatedtable); delete m_dialog_addrelatedtable; m_dialog_addrelatedtable = 0; } if(m_dialog_relationships_overview) { remove_view(m_dialog_relationships_overview); delete m_dialog_relationships_overview; m_dialog_relationships_overview = 0; } #endif // !GLOM_ENABLE_CLIENT_ONLY } void Frame_Glom::set_databases_selected(const Glib::ustring& strName) { //m_pDialog_Databases->hide(); //cause_close(); get_document()->set_connection_database(strName); //show_system_name(); do_menu_Navigate_Table(true /* open default */); } void Frame_Glom::on_box_tables_selected(const Glib::ustring& strName) { if(m_pDialog_Tables) m_pDialog_Tables->hide(); show_table(strName); } void Frame_Glom::set_mode_widget(Gtk::Widget& widget) { //Remove current contents. //I wish that there was a better way to do this: //Trying to remove all of them leads to warnings, //and I don't see a way to get a list of children. AppWindow* pApp = dynamic_cast(get_app_window()); if(pApp) { //Glib::RefPtr ui_manager = pApp->get_ui_manager(); Notebook_Glom* notebook_current = dynamic_cast(m_pBox_Mode->get_child()); if(notebook_current) { m_pBox_Mode->remove(); } m_pBox_Mode->add(widget); widget.show(); } } bool Frame_Glom::set_mode(enumModes mode) { //TODO: This seems to be called twice when changing mode. const bool changed = (m_Mode != mode); //Choose a default mode, if necessary: if(mode == MODE_None) mode = MODE_Data; m_Mode_Previous = m_Mode; m_Mode = mode; //Hide the Quick Find widgets if we are not in Find mode. const bool show_quickfind = (m_Mode == MODE_Find); if(show_quickfind) { m_pBox_QuickFind->show(); //Clear the quick-find entry, ready for a new Find. if(changed) { m_pEntry_QuickFind->set_text(Glib::ustring()); //Put the cursor in the quick find entry: m_pEntry_QuickFind->grab_focus(); } } else { m_pBox_QuickFind->hide(); } return changed; } void Frame_Glom::alert_no_table() { //Ask user to choose a table first: Gtk::Window* pWindowApp = get_app_window(); if(pWindowApp) { //TODO: Obviously this document should have been deleted when the database-creation was cancelled. /* Note that "canceled" is the correct US spelling. */ show_ok_dialog(_("No table"), _("This database has no tables yet."), *pWindowApp, Gtk::MESSAGE_WARNING); } } void Frame_Glom::show_table_refresh() { show_table(m_table_name); } void Frame_Glom::show_table_allow_empty(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value_for_details) { AppWindow* pApp = dynamic_cast(get_app_window()); //This can take quite a long time, so we show the busy cursor while it's working: BusyCursor busy_cursor(pApp); //Choose a default mode, if necessary: if(m_Mode == MODE_None) set_mode(m_Mode); //Show the table: m_table_name = table_name; #ifndef GLOM_ENABLE_CLIENT_ONLY //Update the document with any new information in the database if necessary (though the database _should never have changed information) update_table_in_document_from_database(); #endif // !GLOM_ENABLE_CLIENT_ONLY //Update user-level dependent UI: if(pApp) { on_userlevel_changed(pApp->get_userlevel()); pApp->update_table_sensitive_ui(); } switch(m_Mode) { case(MODE_Data): { FoundSet found_set; //Start with the last-used found set (sort order and where clause) //for this layout: //(This would be ignored anyway if a details primary key is specified.) Document* document = get_document(); if(document) found_set = document->get_criteria_current(m_table_name); //Make sure that this is set: found_set.m_table_name = m_table_name; //If there is no saved sort clause, //then sort by the ID, just so we sort by something, so that the order is predictable: if(found_set.m_sort_clause.empty()) { sharedptr field_primary_key = get_field_primary_key_for_table(m_table_name); if(field_primary_key) { sharedptr layout_item_sort = sharedptr::create(); layout_item_sort->set_full_field_details(field_primary_key); found_set.m_sort_clause.clear(); //Avoid the sort clause if the found set will include too many records, //because that would be too slow. //The user can explicitly request a sort later, by clicking on a column header. //TODO_Performance: This causes an almost-duplicate COUNT query (we do it in the treemodel too), but it's not that slow. sharedptr layout_item_temp = sharedptr::create(); layout_item_temp->set_full_field_details(field_primary_key); type_vecLayoutFields layout_fields; layout_fields.push_back(layout_item_temp); Glib::RefPtr sql_query_without_sort = Utils::build_sql_select_with_where_clause(found_set.m_table_name, layout_fields, found_set.m_where_clause, found_set.m_extra_join, type_sort_clause()); const Privileges table_privs = Privs::get_current_privs(found_set.m_table_name); int count = 0; if(table_privs.m_view) //Avoid the query if the user does not have view rights, because it would fail. count = DbUtils::count_rows_returned_by(sql_query_without_sort); if(count < 10000) //Arbitrary large number. found_set.m_sort_clause.push_back( type_pair_sort_field(layout_item_sort, true /* ascending */) ); } } //Show the wanted records in the notebook, showing details for a particular record if wanted: m_Notebook_Data.init_db_details(found_set, primary_key_value_for_details); set_mode_widget(m_Notebook_Data); //Show how many records were found: update_records_count(); break; } case(MODE_Find): { m_Notebook_Find.init_db_details(m_table_name, get_active_layout_platform(get_document())); set_mode_widget(m_Notebook_Find); break; } default: { std::cout << "debug: " << G_STRFUNC << ": Unexpected mode" << std::endl; break; } } show_table_title(); //List the reports and print layouts in the menus: if(pApp) { pApp->fill_menu_reports(table_name); pApp->fill_menu_print_layouts(table_name); } //show_all(); } void Frame_Glom::show_table(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value_for_details) { //Check that there is a table to show: if(table_name.empty()) { alert_no_table(); } else { show_table_allow_empty(table_name, primary_key_value_for_details); } } void Frame_Glom::show_no_table() { show_table_allow_empty(Glib::ustring()); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_menu_developer_developer(const Glib::RefPtr& action, const Glib::RefPtr& operator_action) { if(action && action->get_active()) { Document* document = dynamic_cast(get_document()); if(document) { //Check whether the current user has developer privileges: ConnectionPool* connection_pool = ConnectionPool::get_instance(); sharedptr sharedconnection = connection_pool->connect(); // Default to true; if we don't support users, we always have // priviliges to change things in developer mode. bool test = true; if(sharedconnection && sharedconnection->get_gda_connection()->supports_feature(Gnome::Gda::CONNECTION_FEATURE_USERS)) { test = Privs::get_user_is_in_group(connection_pool->get_user(), GLOM_STANDARD_GROUP_NAME_DEVELOPER); } if(test) { std::cout << "DEBUG: User=" << connection_pool->get_user() << " _is_ in the developer group on the server." << std::endl; //Avoid double signals: //if(document->get_userlevel() != AppState::USERLEVEL_DEVELOPER) test = document->set_userlevel(AppState::USERLEVEL_DEVELOPER); if(!test) std::cout << " DEBUG: But document->set_userlevel(AppState::USERLEVEL_DEVELOPER) failed." << std::endl; } else { std::cout << "DEBUG: User=" << connection_pool->get_user() << " is _not_ in the developer group on the server." << std::endl; } //If this was not possible then revert the menu: if(!test) { if(document->get_opened_from_browse()) { //TODO: Obviously this could be possible but it would require a network protocol and some work: Gtk::MessageDialog dialog(Utils::bold_message(_("Developer mode not available.")), true, Gtk::MESSAGE_WARNING); dialog.set_secondary_text(_("Developer mode is not available because the file was opened over the network from a running Glom. Only the original file may be edited.")); dialog.set_transient_for(*get_app_window()); dialog.run(); } else { Gtk::MessageDialog dialog(Utils::bold_message(_("Developer mode not available")), true, Gtk::MESSAGE_WARNING); dialog.set_secondary_text(_("Developer mode is not available. Check that you have sufficient database access rights and that the glom file is not read-only.")); dialog.set_transient_for(*get_app_window()); dialog.run(); } } else if(document->get_document_format_version() < Document::get_latest_known_document_format_version()) { Gtk::MessageDialog dialog(Utils::bold_message(_("Saving in new document format")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE); dialog.set_secondary_text(_("The document was created by an earlier version of the application. Making changes to the document will mean that the document cannot be opened by some earlier versions of the application.")); dialog.set_transient_for(*get_app_window()); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Continue"), Gtk::RESPONSE_OK); const int response = dialog.run(); test = (response == Gtk::RESPONSE_OK); } if(!test) { //Abort the change of user level: //This causes an endless loop, but it is not recursive so we can't block it. //TODO: Submit GTK+ bug. //action->set_active(false); operator_action->set_active(); } } } } void Frame_Glom::on_menu_developer_operator(const Glib::RefPtr& action) { if(action && action->get_active()) { Document* document = dynamic_cast(get_document()); if(document) { //Avoid double signals: //if(document->get_userlevel() != AppState::USERLEVEL_OPERATOR) document->set_userlevel(AppState::USERLEVEL_OPERATOR); } } } void Frame_Glom::on_menu_file_export() { //Start with a sequence based on the Details view: //The user can changed this by clicking the button in the FileChooser: Document* document = get_document(); if(!document) return; Document::type_list_layout_groups mapGroupSequence = document->get_data_layout_groups_plus_new_fields("details", m_table_name, get_active_layout_platform(document)); Gtk::Window* pWindowApp = get_app_window(); g_assert(pWindowApp); //Do not try to export the data if the user may not view it: Privileges table_privs = Privs::get_current_privs(m_table_name); if(!table_privs.m_view) { show_ok_dialog(_("Export Not Allowed."), _("You do not have permission to view the data in this table, so you may not export the data."), *pWindowApp, Gtk::MESSAGE_ERROR); return; } //Ask the user for the new file location, and to optionally modify the format: FileChooser_Export dialog; dialog.set_transient_for(*get_app_window()); dialog.set_do_overwrite_confirmation(); dialog.set_export_layout(mapGroupSequence, m_table_name, get_document()); const int response = dialog.run(); dialog.hide(); if((response == Gtk::RESPONSE_CANCEL) || (response == Gtk::RESPONSE_DELETE_EVENT)) return; std::string filepath = dialog.get_filename(); if(filepath.empty()) return; filepath = Utils::get_filepath_with_extension(filepath, "csv"); dialog.get_layout_groups(mapGroupSequence); //std::cout << "DEBUG 0: mapGroupSequence.size()=" << mapGroupSequence.size() << std::endl; //const int index_primary_key = fieldsSequence.size() - 1; const FoundSet found_set = m_Notebook_Data.get_found_set(); std::fstream the_stream(filepath.c_str(), std::ios_base::out | std::ios_base::trunc); if(!the_stream) { show_ok_dialog(_("Could Not Create File."), _("Glom could not create the specified file."), *pWindowApp, Gtk::MESSAGE_ERROR); return; } export_data_to_stream(the_stream, found_set, mapGroupSequence); } //TODO: Reduce copy/pasting in these export_data_to_*() methods: void Frame_Glom::export_data_to_vector(Document::type_example_rows& the_vector, const FoundSet& found_set, const Document::type_list_layout_groups& sequence) { type_vecConstLayoutFields fieldsSequence = get_table_fields_to_show_for_sequence(found_set.m_table_name, sequence); if(fieldsSequence.empty()) { std::cerr << G_STRFUNC << ": No fields in sequence." << std::endl; return; } Glib::RefPtr query = Utils::build_sql_select_with_where_clause(found_set.m_table_name, fieldsSequence, found_set.m_where_clause, found_set.m_extra_join, found_set.m_sort_clause); //TODO: Lock the database (prevent changes) during export. Glib::RefPtr result = DbUtils::query_execute_select(query); guint rows_count = 0; if(result) rows_count = result->get_n_rows(); if(rows_count) { const guint columns_count = result->get_n_columns(); for(guint row_index = 0; row_index < rows_count; ++row_index) { Document::type_row_data row_data; for(guint col_index = 0; col_index < columns_count; ++col_index) { const Gnome::Gda::Value value = result->get_value_at(col_index, row_index); sharedptr layout_item = fieldsSequence[col_index]; //if(layout_item->m_field.get_glom_type() != Field::TYPE_IMAGE) //This is too much data. //{ //Output data in canonical SQL format, ignoring the user's locale, and ignoring the layout formatting: row_data.push_back(value); //TODO_Performance: reserve the size. //if(layout_item->m_field.get_glom_type() == Field::TYPE_IMAGE) //This is too much data. //{ //std::cout << " field name=" << layout_item->get_name() << ", value=" << layout_item->m_field.sql(value) << std::endl; //} } //std::cout << " row_string=" << row_string << std::endl; the_vector.push_back(row_data); //TODO_Performance: Reserve the size. } } } void Frame_Glom::export_data_to_stream(std::ostream& the_stream, const FoundSet& found_set, const Document::type_list_layout_groups& sequence) { type_vecConstLayoutFields fieldsSequence = get_table_fields_to_show_for_sequence(found_set.m_table_name, sequence); if(fieldsSequence.empty()) { std::cerr << G_STRFUNC << ": No fields in sequence." << std::endl; return; } Glib::RefPtr query = Utils::build_sql_select_with_where_clause(found_set.m_table_name, fieldsSequence, found_set.m_where_clause, found_set.m_extra_join, found_set.m_sort_clause); //TODO: Lock the database (prevent changes) during export. Glib::RefPtr result = DbUtils::query_execute_select(query); guint rows_count = 0; if(result) rows_count = result->get_n_rows(); if(rows_count) { const guint columns_count = result->get_n_columns(); for(guint row_index = 0; row_index < rows_count; ++row_index) { std::string row_string; for(guint col_index = 0; col_index < columns_count; ++col_index) { const Gnome::Gda::Value value = result->get_value_at(col_index, row_index); sharedptr layout_item = fieldsSequence[col_index]; //if(layout_item->m_field.get_glom_type() != Field::TYPE_IMAGE) //This is too much data. //{ if(!row_string.empty()) row_string += ","; //Output data in canonical SQL format, ignoring the user's locale, and ignoring the layout formatting: sharedptr field = layout_item->get_full_field_details(); if(!field) { std::cerr << G_STRFUNC << ": A field was null." << std::endl; return; } const Glib::ustring field_text = field->to_file_format(value); if(layout_item->get_glom_type() == Field::TYPE_IMAGE) //This is too much data. { // Some extra debug checks, // though we believe that all these problems are now fixed in File::to_file_format(): const char* newline_to_find = "\r\n"; size_t pos = field_text.find_first_of(newline_to_find); if(pos != std::string::npos) { std::cerr << "export: binary data field text contains an unexpected newline: " << field_text << std::endl; continue; } const char* quote_to_find = "\""; pos = field_text.find_first_of(quote_to_find); if(pos != std::string::npos) { std::cerr << "export: binary data field text contains an unexpected quote: " << field_text << std::endl; continue; } } if(layout_item->get_glom_type() == Field::TYPE_TEXT) { //The CSV RFC says text may be quoted and should be if it has newlines: //TODO: Escape the text? row_string += ("\"" + field_text + "\""); } else row_string += field_text; //std::cout << " field name=" << layout_item->get_name() << ", value=" << layout_item->m_field.sql(value) << std::endl; //} } //std::cout << " row_string=" << row_string << std::endl; the_stream << row_string << std::endl; } } } void Frame_Glom::on_menu_file_import() { if(m_table_name.empty()) { Utils::show_ok_dialog(_("No Table"), _("There is no table in to which data could be imported."), *get_app_window(), Gtk::MESSAGE_ERROR); } else { Gtk::FileChooserDialog file_chooser(*get_app_window(), _("Open CSV Document"), Gtk::FILE_CHOOSER_ACTION_OPEN); file_chooser.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); file_chooser.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT); Glib::RefPtr filter_csv = Gtk::FileFilter::create(); filter_csv->set_name(_("CSV files")); filter_csv->add_mime_type("text/csv"); file_chooser.add_filter(filter_csv); Glib::RefPtr filter_any = Gtk::FileFilter::create(); filter_any->set_name(_("All files")); filter_any->add_pattern("*"); file_chooser.add_filter(filter_any); if(file_chooser.run() == Gtk::RESPONSE_ACCEPT) { file_chooser.hide(); Dialog_Import_CSV* dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; add_view(dialog); dialog->import(file_chooser.get_uri(), m_table_name); while(Glom::Utils::dialog_run_with_help(dialog) == Gtk::RESPONSE_ACCEPT) { dialog->hide(); Dialog_Import_CSV_Progress* progress_dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(progress_dialog); int response = Gtk::RESPONSE_OK; if(!progress_dialog) { std::cerr << G_STRFUNC << ": progress_dialog was null." << std::endl; } else { add_view(progress_dialog); progress_dialog->init_db_details(dialog->get_target_table_name()); progress_dialog->import(*dialog); response = progress_dialog->run(); //TODO: Check response? remove_view(progress_dialog); delete progress_dialog; progress_dialog = 0; // Force update from database so the newly added entries are shown show_table_refresh(); // Re-show chooser dialog when an error occured or when the user // cancelled. if(response == Gtk::RESPONSE_OK) break; } } remove_view(dialog); delete dialog; } } } void Frame_Glom::on_menu_file_toggle_share(const Glib::RefPtr& action) { if(!action) { std::cerr << G_STRFUNC << ": action was null." << std::endl; } //Prevent this change if not in developer mode, //though the menu item should be disabled then anyway. Document* document = dynamic_cast(get_document()); if(!document || document->get_userlevel() != AppState::USERLEVEL_DEVELOPER) return; bool shared = action->get_active(); //Whether it should be shared. if(shared == document->get_network_shared()) { //Do nothing, because things are already as requested. //This is probably just an extra signal emitted when we set the toggle in the UI. //So we avoid the endless loop: return; } bool change = true; //Ask user for confirmation: //TODO: Warn that this will be saved as the default if doing this in developer mode? if(shared) { Gtk::MessageDialog dialog(Utils::bold_message(_("Share on the network")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE); dialog.set_secondary_text(_("This will allow other users on the network to use this database.")); dialog.set_transient_for(*get_app_window()); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("_Share"), Gtk::RESPONSE_OK); const int response = dialog.run(); dialog.hide(); if(response == Gtk::RESPONSE_OK) { shared = true; //Ask for a user/password if none is set: const bool real_user_exists = Privs::get_developer_user_exists_with_password(); if(!real_user_exists) { //Ask for an initial user: Glib::ustring user, password; const bool initial_password_provided = connection_request_initial_password(user, password); bool added = false; if(initial_password_provided) added = DbUtils::add_user(document, user, password, GLOM_STANDARD_GROUP_NAME_DEVELOPER); if(initial_password_provided && added) { //Use the new user/password from now on: ConnectionPool* connectionpool = ConnectionPool::get_instance(); connectionpool->set_user(user); connectionpool->set_password(password); } else { shared = false; change = false; } } else { //Ask for the password of a developer user, to //a) Check that the user knows it, so he won't lose access. //b) Reconnect as that user so we can remove the default user. //TODO: Check that this user is a developer. bool database_not_found = false; //Ignored; const bool dev_password_known = connection_request_password_and_attempt(database_not_found, "" ,"", true /* alternative text */); if(!dev_password_known) { shared = false; change = false; } } if(change) //If nothing has gone wrong so far. { //Remove the default no-password user, because that would be a security hole: //We do this after adding/using the non-default user, because we can't //remove a currently-used user. const bool default_user_exists = Privs::get_default_developer_user_exists(); if(default_user_exists) { //Force a reconnection with the new password: //ConnectionPool* connectionpool = ConnectionPool::get_instance(); //Remove it, after stopping it from being the database owner: bool disabled = true; Glib::ustring default_password; const Glib::ustring default_user = Privs::get_default_developer_user_name(default_password); ConnectionPool* connectionpool = ConnectionPool::get_instance(); const bool reowned = set_database_owner_user(connectionpool->get_user()); bool removed = false; if(reowned) removed = DbUtils::remove_user(default_user); if(!removed) { //This is a workaround. //Try to revoke it instead. //TODO: Discover how to make remove_user() succeed. disabled = disable_user(default_user); if(disabled) { //This message should be reassuring if the user sees a previous error //about the default user not being removed. std::cout << G_STRFUNC << ": The default user could not be removed, but it has been disabled." << std::endl; } } if(!reowned || !(removed || disabled)) { std::cerr << G_STRFUNC << ": Failed to reown and remove/revoke default user." << std::endl; shared = false; change = false; } } } } else { shared = false; change = false; } } else //not shared: { //TODO: Warn about connected users if possible. Gtk::MessageDialog dialog(Utils::bold_message(_("Stop sharing on the network")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE); dialog.set_secondary_text(_("This will prevent other users on the network from using this database.")); dialog.set_transient_for(*get_app_window()); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("_Stop Sharing"), Gtk::RESPONSE_OK); const int response = dialog.run(); dialog.hide(); if(response == Gtk::RESPONSE_OK) { shared = false; //Make sure the default no-password user exists: const bool default_user_exists = Privs::get_default_developer_user_exists(); if(!default_user_exists) { //Add it: Glib::ustring default_password; const Glib::ustring default_user = Privs::get_default_developer_user_name(default_password); const bool added = DbUtils::add_user(document, default_user, default_password, GLOM_STANDARD_GROUP_NAME_DEVELOPER); if(!added) { shared = true; change = false; } } } else { shared = true; change = false; } } if(document) document->set_network_shared(shared); //Stop the self-hosted database server, //change its configuration, //and start it again: if(change) { ConnectionPool* connectionpool = ConnectionPool::get_instance(); sharedptr sharedconnection = connectionpool->connect(); if(sharedconnection) { sharedconnection->close(); sharedconnection.clear(); } ShowProgressMessage cleanup_message(_("Stopping Database Server")); connectionpool->cleanup (sigc::mem_fun(*this, &Frame_Glom::on_connection_cleanup_progress) ); ShowProgressMessage startup_message(_("Starting Database Server")); connectionpool->set_network_shared(sigc::mem_fun(*this, &Frame_Glom::on_connection_startup_progress), shared); ConnectionPool::StartupErrors started = connectionpool->startup( sigc::mem_fun(*this, &Frame_Glom::on_connection_startup_progress) ); if(started != ConnectionPool::Backend::STARTUPERROR_NONE) { std::cerr << G_STRFUNC << ": startup() failed." << std::endl; //TODO: Tell the user. } connectionpool->set_ready_to_connect(); } //Update the UI: AppWindow* pApp = dynamic_cast(get_app_window()); if(pApp) { pApp->update_network_shared_ui(); } } #endif // !GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_menu_file_print() { Notebook_Glom* notebook_current = dynamic_cast(m_pBox_Mode->get_child()); if(notebook_current) notebook_current->do_menu_file_print(); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_menu_file_print_edit_layouts() { on_menu_developer_print_layouts(); } void Frame_Glom::set_enable_layout_drag_and_drop(bool enable) { m_Notebook_Data.set_enable_layout_drag_and_drop(enable); } #endif // !GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_menu_Edit_Find() { //Switch back to data mode if we are in find mode. if(m_Mode == MODE_Find) { //Switch to data mode if(set_mode(MODE_Data)) show_table(m_table_name); return; } //Otherwise switch to find mode. //This can take quite a long time, flicking between 1 or 2 intermediate screens. //It shouldn't, but until we fix that, let's show the busy cursor while it's working: BusyCursor busy_cursor(get_app_window()); const bool previously_in_data_mode = (m_Mode == MODE_Data); const Notebook_Data::dataview list_or_details = m_Notebook_Data.get_current_view(); //A workaround hack to make sure that the list view will be active when the results are shown. //Because the list doesn't refresh properly (to give the first result) when the Details view was active first. //murrayc. if(previously_in_data_mode && (list_or_details == Notebook_Data::DATA_VIEW_Details)) m_Notebook_Data.set_current_view(Notebook_Data::DATA_VIEW_List); if(!set_mode(MODE_Find)) return; show_table(m_table_name); if(previously_in_data_mode) { //Show the same layout in Find mode as was just being viewed in Data mode: m_Notebook_Find.set_current_view(list_or_details); } } void Frame_Glom::on_menu_add_record() { BusyCursor busy_cursor(get_app_window()); //Note: This should only be called in Data mode. m_Notebook_Data.do_menu_file_add_record(); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_menu_Reports_EditReports() { on_menu_developer_reports(); } void Frame_Glom::on_menu_Tables_EditTables() { do_menu_Navigate_Table(); } /* Commented out because it is useful but confusing to new users: void Frame_Glom::on_menu_Tables_AddRelatedTable() { //Delete and recreate the dialog, //so we start with a blank one: if(m_dialog_addrelatedtable) { remove_view(m_dialog_addrelatedtable); delete m_dialog_addrelatedtable; m_dialog_addrelatedtable = 0; } Utils::get_glade_widget_derived_with_warning(m_dialog_addrelatedtable); if(!m_dialog_addrelatedtable) return; add_view(m_dialog_addrelatedtable); //Give it access to the document. m_dialog_addrelatedtable->set_fields(m_table_name); m_dialog_addrelatedtable->signal_request_edit_fields().connect( sigc::mem_fun(*this, &Frame_Glom::on_dialog_add_related_table_request_edit_fields) ); m_dialog_addrelatedtable->signal_response().connect( sigc::mem_fun(*this, &Frame_Glom::on_dialog_add_related_table_response) ); Gtk::Window* parent = get_app_window(); if(parent) m_dialog_addrelatedtable->set_transient_for(*parent); m_dialog_addrelatedtable->set_modal(); //We don't want people to edit the main window while we are changing structure. m_dialog_addrelatedtable->show(); } */ #endif #ifndef GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_dialog_add_related_table_response(int response) { if(!m_dialog_addrelatedtable) return; m_dialog_addrelatedtable->hide(); bool stop_trying = false; if(response == Gtk::RESPONSE_OK) { Glib::ustring table_name, relationship_name, from_key_name; m_dialog_addrelatedtable->get_input(table_name, relationship_name, from_key_name); Gtk::Window* parent = get_app_window(); //It would be nice to put this in the dialog's on_response() instead, //but I don't think we can stop the response from being returned. murrayc if(DbUtils::get_table_exists_in_database(table_name)) { Frame_Glom::show_ok_dialog(_("Table Exists Already"), _("A table with this name already exists in the database. Please choose a different table name."), *parent, Gtk::MESSAGE_ERROR); } else if(get_relationship_exists(m_table_name, relationship_name)) { Frame_Glom::show_ok_dialog(_("Relationship Exists Already"), _("A relationship with this name already exists for this table. Please choose a different relationship name."), *parent, Gtk::MESSAGE_ERROR); } else if(table_name.empty() || relationship_name.empty() || relationship_name.empty()) { Frame_Glom::show_ok_dialog(_("More information needed"), _("You must specify a field, a table name, and a relationship name."), *parent, Gtk::MESSAGE_ERROR); } else { stop_trying = true; } if(!stop_trying) { //Offer the dialog again: //This signal handler should be called again when a button is clicked. m_dialog_addrelatedtable->show(); } else { //Create the new table: const bool result = DbUtils::create_table_with_default_fields(get_document(), table_name); if(!result) { std::cerr << G_STRFUNC << ": create_table_with_default_fields() failed." << std::endl; return; } //Create the new relationship: sharedptr relationship = sharedptr::create(); relationship->set_name(relationship_name); relationship->set_title(Utils::title_from_string(relationship_name), AppWindow::get_current_locale()); relationship->set_from_table(m_table_name); relationship->set_from_field(from_key_name); relationship->set_to_table(table_name); sharedptr related_primary_key = get_field_primary_key_for_table(table_name); //This field was created by create_table_with_default_fields(). if(!related_primary_key) { std::cerr << G_STRFUNC << ": get_field_primary_key_for_table() failed." << std::endl; return; } relationship->set_to_field(related_primary_key->get_name()); relationship->set_allow_edit(true); relationship->set_auto_create(true); Document* document = get_document(); if(!document) return; document->set_relationship(m_table_name, relationship); on_dialog_tables_hide(); //Update the menu. Gtk::Window* parent = get_app_window(); if(parent) show_ok_dialog(_("Related Table Created"), _("The new related table has been created."), *parent, Gtk::MESSAGE_INFO); } } } void Frame_Glom::on_dialog_add_related_table_request_edit_fields() { if(m_dialog_addrelatedtable) do_menu_developer_fields(*m_dialog_addrelatedtable); } #endif // !GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::do_menu_Navigate_Table(bool open_default) { if(get_document()->get_connection_database().empty()) { alert_no_table(); return; } Glib::ustring default_table_name; if(open_default) default_table_name = get_document()->get_default_table(); //Create the dialog, if it has not already been created: if(!m_pBox_Tables) { Utils::get_glade_child_widget_derived_with_warning(m_pBox_Tables); m_pDialog_Tables = new Window_BoxHolder(m_pBox_Tables, _("Edit Tables")); m_pDialog_Tables->signal_hide().connect(sigc::mem_fun(*this, &Frame_Glom::on_dialog_tables_hide)); Gtk::Window* pWindow = get_app_window(); if(pWindow) m_pDialog_Tables->set_transient_for(*pWindow); m_pDialog_Tables->set_default_size(300, 400); m_pBox_Tables->show_all(); add_view(m_pBox_Tables); //Connect signals: m_pBox_Tables->signal_selected.connect(sigc::mem_fun(*this, &Frame_Glom::on_box_tables_selected)); } { BusyCursor busy_cursor(get_app_window()); m_pBox_Tables->init_db_details(); } //Let the user choose a table: //m_pDialog_Tables->set_policy(false, true, false); //TODO_port //m_pDialog_Tables->load_from_document(); //Refresh if(!default_table_name.empty()) { //Show the default table, and let the user navigate to another table manually if he wants: show_table(default_table_name); } else { m_pDialog_Tables->show(); } } const Gtk::Window* Frame_Glom::get_app_window() const { Frame_Glom* nonconst = const_cast(this); return nonconst->get_app_window(); } Gtk::Window* Frame_Glom::get_app_window() { Gtk::Widget* pWidget = get_parent(); while(pWidget) { //Is this widget a Gtk::Window?: Gtk::Window* pWindow = dynamic_cast(pWidget); if(pWindow) { //Yes, return it. return pWindow; } else { //Try the parent's parent: pWidget = pWidget->get_parent(); } } return 0; //not found. } void Frame_Glom::show_ok_dialog(const Glib::ustring& title, const Glib::ustring& message, Gtk::Window& parent, Gtk::MessageType message_type) { Utils::show_ok_dialog(title, message, parent, message_type); } void Frame_Glom::on_button_quickfind() { //This will get the criteria for the quick find: on_notebook_find_criteria(Gnome::Gda::SqlExpr()); } void Frame_Glom::on_notebook_find_criteria(const Gnome::Gda::SqlExpr& where_clause) { AppWindow* app = dynamic_cast(get_app_window()); if(!app) { std::cerr << G_STRFUNC << ": get_app_window() failed." << std::endl; return; } Gnome::Gda::SqlExpr where_clause_to_use = where_clause; //Prefer the quick find text if any was entered: const Glib::ustring quickfind_criteria = m_pEntry_QuickFind->get_text(); if(!quickfind_criteria.empty()) { where_clause_to_use = Utils::get_find_where_clause_quick(get_document(), m_table_name, Gnome::Gda::Value(quickfind_criteria)); } if(where_clause_to_use.empty()) { const Glib::ustring message = _("You have not entered any find criteria. Try entering information in the fields."); Gtk::MessageDialog dialog(Utils::bold_message(_("No Find Criteria")), true, Gtk::MESSAGE_WARNING ); dialog.set_secondary_text(message); dialog.set_transient_for(*app); dialog.run(); return; } //std::cout << "debug: " << G_STRFUNC << ": " << where_clause << std::endl; bool records_found = false; { //Extra scope, to control the lifetime of the busy cursor. BusyCursor busy_cursor(app); app->set_mode_data(); //std::cout << "Frame_Glom::on_notebook_find_criteria: where_clause=" << where_clause << std::endl; FoundSet found_set; found_set.m_table_name = m_table_name; found_set.m_where_clause = where_clause_to_use; records_found = m_Notebook_Data.init_db_details(found_set); //std::cout << "debug: " << G_STRFUNC << ": BEFORE m_Notebook_Data.select_page_for_find_results()" << std::endl; m_Notebook_Data.select_page_for_find_results(); //std::cout << "debug: " << G_STRFUNC << ": AFTER m_Notebook_Data.select_page_for_find_results()" << std::endl; } if(!records_found) { const bool find_again = Utils::show_warning_no_records_found(*app); if(find_again) app->set_mode_find(); else on_button_find_all(); } else { //Show how many records were found: update_records_count(); } } void Frame_Glom::on_userlevel_changed(AppState::userlevels /* userlevel */) { //show user level in the window title: show_table_title(); } void Frame_Glom::show_table_title() { Document* document = dynamic_cast(get_document()); if(!document) return; //Show the table title: Glib::ustring table_label = document->get_table_title(m_table_name, AppWindow::get_current_locale()); if(!table_label.empty()) { if(document->get_userlevel() == AppState::USERLEVEL_DEVELOPER) table_label += " (" + m_table_name + ")"; //Show the table name as well, if in developer mode. } else //Use the table name if there is no table title. table_label = m_table_name; //Show the table title in bold text, because it's important to the user. const Glib::ustring title = Utils::bold_message(table_label); m_pLabel_Table_DataMode->set_markup(title); m_pLabel_Table_FindMode->set_markup(title); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::update_table_in_document_from_database() { //Add any new/changed information from the database to the document //The database should never change without the knowledge of the document anyway, so this should be unnecessary. //TODO_performance: There are a lot of temporary Field and Column instances here, with a lot of string copying. //For instance, changed field details, or new fields, or removed fields. typedef Box_DB_Table::type_vec_fields type_vec_fields; //Get the fields information from the database: DbUtils::type_vec_fields fieldsDatabase = DbUtils::get_fields_for_table_from_database(m_table_name); if(fieldsDatabase.empty()) { std::cerr << G_STRFUNC << ": Could not get the list of fields for table=" << m_table_name << " from the database. This might be due to insufficient database user rights." << " Falling back to the field details in the document." << std::endl; } Document* pDoc = dynamic_cast(get_document()); if(pDoc) { bool document_must_be_updated = false; //Get the fields information from the document. //and add to, or update Document's list of fields: type_vec_fields fieldsDocument = pDoc->get_table_fields(m_table_name); for(Base_DB::type_vec_fields::const_iterator iter = fieldsDatabase.begin(); iter != fieldsDatabase.end(); ++iter) { sharedptr field_database = *iter; if(field_database) { //Is the field already in the document? type_vec_fields::iterator iterFindDoc = std::find_if( fieldsDocument.begin(), fieldsDocument.end(), predicate_FieldHasName( field_database->get_name() ) ); if(iterFindDoc == fieldsDocument.end()) //If it was not found: { //Add it fieldsDocument.push_back(field_database); document_must_be_updated = true; } else //if it was found. { //Compare the information: Glib::RefPtr field_info_db = field_database->get_field_info(); sharedptr field_document = *iterFindDoc; if(field_document) { if(!field_document->field_info_from_database_is_equal( field_info_db )) //ignores auto_increment because libgda does not report it from the database properly. { //The database has different information. We assume that the information in the database is newer. //Update the field information: // Ignore things that libgda does not report from the database properly: // We do this also in Field::field_info_from_database_is_equal() and // Base_DB::get_fields_for_table(), // so make sure that we ignore the same things everywhere always // TODO: Avoid that duplication? field_info_db->set_auto_increment( field_document->get_auto_increment() ); field_info_db->set_default_value( field_document->get_default_value() ); (*iterFindDoc)->set_field_info( field_info_db ); document_must_be_updated = true; } } } } } //Remove fields that are no longer in the database: //TODO_performance: This is incredibly inefficient - but it's difficut to erase() items while iterating over them. if(!fieldsDatabase.empty()) //Do not do this if getting the fields from the database failed completely, probably due to permissions. { type_vec_fields fieldsActual; for(type_vec_fields::const_iterator iter = fieldsDocument.begin(); iter != fieldsDocument.end(); ++iter) { sharedptr field = *iter; //Check whether it's in the database: type_vec_fields::iterator iterFindDatabase = std::find_if( fieldsDatabase.begin(), fieldsDatabase.end(), predicate_FieldHasName( field->get_name() ) ); if(iterFindDatabase != fieldsDatabase.end()) //If it was found { fieldsActual.push_back(field); } else { document_must_be_updated = true; //Something changed. } } if(document_must_be_updated) pDoc->set_table_fields(m_table_name, fieldsActual); } } } #endif // !GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::set_document(Document* pDocument) { View_Composite_Glom::set_document(pDocument); Document* document = get_document(); if(document) { //Connect to a signal that is only on the derived document class: document->signal_userlevel_changed().connect( sigc::mem_fun(*this, &Frame_Glom::on_userlevel_changed) ); //Show the appropriate UI for the user level that is specified by this new document: on_userlevel_changed(document->get_userlevel()); } } void Frame_Glom::load_from_document() { Document* document = dynamic_cast(get_document()); if(document) { //Call base class: View_Composite_Glom::load_from_document(); } } #ifndef GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_menu_developer_database_preferences() { Dialog_Database_Preferences* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*(get_app_window())); add_view(dialog); dialog->load_from_document(); Glom::Utils::dialog_run_with_help(dialog); remove_view(dialog); delete dialog; //show_system_name(); //In case it has changed. } void Frame_Glom::on_menu_developer_fields() { Gtk::Window* parent = get_app_window(); if(parent) do_menu_developer_fields(*parent); } void Frame_Glom::do_menu_developer_fields(Gtk::Window& parent, const Glib::ustring table_name) { if(!m_pDialog_Fields) { Utils::get_glade_widget_derived_with_warning(m_pDialog_Fields); m_pDialog_Fields->signal_hide().connect( sigc::mem_fun(*this, &Frame_Glom::on_developer_dialog_hide)); add_view(m_pDialog_Fields); } // Some database backends (SQLite) require the table to change to no longer // be in use when changing the records, so we stop the database usage // here. We reshow everything in on_developer_dialog_hide() anyway. Document* document = dynamic_cast(get_document()); if(document && document->get_hosting_mode() == Document::HOSTING_MODE_SQLITE) show_no_table(); // Remember the old table name so that we re-show the previous table as // soon as the dialog has been closed. m_table_name = table_name; m_pDialog_Fields->set_transient_for(parent); m_pDialog_Fields->init_db_details(table_name); m_pDialog_Fields->show(); } void Frame_Glom::do_menu_developer_fields(Gtk::Window& parent) { //Check that there is a table to show: if(m_table_name.empty()) return; do_menu_developer_fields(parent, m_table_name); } void Frame_Glom::on_menu_developer_relationships_overview() { if(!m_dialog_relationships_overview) { Utils::get_glade_widget_derived_with_warning(m_dialog_relationships_overview); add_view(m_dialog_relationships_overview); } if(m_dialog_relationships_overview) { m_dialog_relationships_overview->set_transient_for(*(get_app_window())); m_dialog_relationships_overview->load_from_document(); Glom::Utils::dialog_run_with_help(m_dialog_relationships_overview); remove_view(m_dialog_relationships_overview); delete m_dialog_relationships_overview; m_dialog_relationships_overview = 0; } } void Frame_Glom::do_menu_developer_relationships(Gtk::Window& parent, const Glib::ustring table_name) { //Create the widget if necessary: if(!m_pDialog_Relationships) { Utils::get_glade_widget_derived_with_warning(m_pDialog_Relationships); if(!m_pDialog_Relationships) { std::cerr << G_STRFUNC << ": m_pDialog_Relationships is null." << std::cerr; return; } m_pDialog_Relationships->set_title("Relationships"); m_pDialog_Relationships->signal_hide().connect( sigc::mem_fun(*this, &Frame_Glom::on_developer_dialog_hide)); add_view(m_pDialog_Relationships); //Also a composite view. } m_pDialog_Relationships->set_transient_for(parent); m_pDialog_Relationships->init_db_details(table_name); m_pDialog_Relationships->show(); } void Frame_Glom::on_menu_developer_relationships() { //Check that there is a table to show: if(m_table_name.empty()) return; Gtk::Window* app = get_app_window(); if(app) do_menu_developer_relationships(*app, m_table_name); } void Frame_Glom::on_menu_developer_users() { Dialog_GroupsList* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*get_app_window()); add_view(dialog); //Give it access to the document. dialog->load_from_document(); //Update the UI now that it has the document. Glom::Utils::dialog_run_with_help(dialog); remove_view(dialog); delete dialog; //Update the Details and List layouts, in case the permissions have changed: //TODO: Also update them somehow if another user has changed them, //or respond to the failed SQL nicely. show_table(m_table_name); } void Frame_Glom::on_menu_developer_layout() { //Check that there is a table to show: if(m_table_name.empty()) return; Notebook_Glom* notebook_current = dynamic_cast(m_pBox_Mode->get_child()); if(notebook_current) notebook_current->do_menu_developer_layout(); } void Frame_Glom::on_menu_developer_reports() { //Check that there is a table to show: if(m_table_name.empty()) return; //Create the widget if necessary: if(!m_pBox_Reports) { Utils::get_glade_child_widget_derived_with_warning(m_pBox_Reports); if(!m_pBox_Reports) { std::cerr << G_STRFUNC << ": m_pBox_Reports is null." << std::cerr; return; } m_pDialog_Reports = new Window_BoxHolder(m_pBox_Reports); m_pDialog_Reports->set_transient_for(*(get_app_window())); m_pDialog_Reports->set_title(_("Reports")); Utils::get_glade_widget_derived_with_warning(m_pDialogLayoutReport); if(!m_pDialogLayoutReport) { std::cerr << G_STRFUNC << ": m_pDialogLayoutReport is null." << std::endl; return; } add_view(m_pDialogLayoutReport); m_pDialogLayoutReport->set_transient_for(*(get_app_window())); m_pDialogLayoutReport->signal_hide().connect( sigc::mem_fun(*this, &Frame_Glom::on_dialog_layout_report_hide) ); m_pDialog_Reports->set_default_size(300, 400); m_pBox_Reports->show_all(); m_pBox_Reports->signal_selected.connect(sigc::mem_fun(*this, &Frame_Glom::on_box_reports_selected)); add_view(m_pBox_Reports); } m_pBox_Reports->init_db_details(m_table_name); m_pDialog_Reports->show(); } void Frame_Glom::on_menu_developer_print_layouts() { //Check that there is a table to show: if(m_table_name.empty()) return; //Create the widget if necessary: if(!m_pBox_PrintLayouts) { Utils::get_glade_child_widget_derived_with_warning(m_pBox_PrintLayouts); if(!m_pBox_PrintLayouts) { std::cerr << G_STRFUNC << ": m_pBox_PrintLayouts is null." << std::endl; return; } m_pDialog_PrintLayouts = new Window_BoxHolder(m_pBox_PrintLayouts); m_pDialog_PrintLayouts->set_transient_for(*get_app_window()); m_pDialog_PrintLayouts->set_title(_("Print Layouts")); m_pDialog_PrintLayouts->set_default_size(300, 400); m_pBox_PrintLayouts->show_all(); add_view(m_pBox_PrintLayouts); m_pBox_PrintLayouts->signal_selected.connect(sigc::mem_fun(*this, &Frame_Glom::on_box_print_layouts_selected)); } m_pBox_PrintLayouts->init_db_details(m_table_name); m_pDialog_PrintLayouts->show(); } void Frame_Glom::on_menu_developer_script_library() { Dialog_ScriptLibrary* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*(get_app_window())); add_view(dialog); //Give it access to the document. dialog->load_from_document(); Glom::Utils::dialog_run_with_help(dialog); //TODO: Create the help section. dialog->save_to_document(); remove_view(dialog); delete dialog; } void Frame_Glom::on_box_reports_selected(const Glib::ustring& report_name) { m_pDialog_Reports->hide(); sharedptr report = get_document()->get_report(m_table_name, report_name); if(report) { m_pDialogLayoutReport->set_transient_for(*get_app_window()); m_pDialogLayoutReport->set_report(m_table_name, report); m_pDialogLayoutReport->show(); } } void Frame_Glom::on_box_print_layouts_selected(const Glib::ustring& print_layout_name) { //Create the dialog if necessary: if(!m_pDialogLayoutPrint) { Utils::get_glade_widget_derived_with_warning(m_pDialogLayoutPrint); if(!m_pDialogLayoutPrint) { std::cerr << G_STRFUNC << ": m_pDialogLayoutPrint is null" << std::endl; return; } add_view(m_pDialogLayoutPrint); m_pDialogLayoutPrint->signal_hide().connect( sigc::mem_fun(*this, &Frame_Glom::on_dialog_layout_print_hide) ); } m_pDialog_PrintLayouts->hide(); sharedptr print_layout = get_document()->get_print_layout(m_table_name, print_layout_name); if(print_layout) { Gtk::Window* app_window = get_app_window(); if(app_window) m_pDialogLayoutPrint->set_transient_for(*app_window); m_pDialogLayoutPrint->set_print_layout(m_table_name, print_layout); m_pDialogLayoutPrint->show(); } } void Frame_Glom::on_developer_dialog_hide() { //The dababase structure might have changed, so refresh the data view: show_table(m_table_name); //TODO: This is a bit of a hack. It's not always useful to do this: if(m_dialog_addrelatedtable) m_dialog_addrelatedtable->set_fields(m_table_name); //Update the display. TODO: Shouldn't this happen automatically via the view? if(m_dialog_relationships_overview) m_dialog_relationships_overview->load_from_document(); } #endif // !GLOM_ENABLE_CLIENT_ONLY #ifndef GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_connection_initialize_progress() { AppWindow *app = dynamic_cast(AppWindow::get_appwindow()); if(app) app->pulse_progress_message(); } #endif //GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_connection_startup_progress() { AppWindow *app = dynamic_cast(AppWindow::get_appwindow()); if(app) app->pulse_progress_message(); } void Frame_Glom::on_connection_cleanup_progress() { AppWindow *app = dynamic_cast(AppWindow::get_appwindow()); if(app) app->pulse_progress_message(); } bool Frame_Glom::handle_connection_initialize_errors(ConnectionPool::InitErrors error) { Glib::ustring title; Glib::ustring message; if(error == ConnectionPool::Backend::INITERROR_NONE) return true; else if(error == ConnectionPool::Backend::INITERROR_DIRECTORY_ALREADY_EXISTS) { title = _("Directory Already Exists"); message = _("There is an existing directory with the same name as the directory that should be created for the new database files. You should specify a different filename to use a new directory instead."); } else if(error == ConnectionPool::Backend::INITERROR_COULD_NOT_CREATE_DIRECTORY) { title = _("Could Not Create Directory"); message = _("There was an error when attempting to create the directory for the new database files."); } else if(error == ConnectionPool::Backend::INITERROR_COULD_NOT_START_SERVER) { title = _("Could Not Start Database Server"); message = _("There was an error when attempting to start the database server."); } Utils::show_ok_dialog(title, message, *get_app_window(), Gtk::MESSAGE_ERROR); return false; } #ifndef GLOM_ENABLE_CLIENT_ONLY bool Frame_Glom::connection_request_initial_password(Glib::ustring& user, Glib::ustring& password) { //Intialze output parameters: user = Glib::ustring(); password = Glib::ustring(); Document* document = dynamic_cast(get_document()); if(!document) return false; //This is only useful for self-hosted postgres: if(document->get_hosting_mode() != Document::HOSTING_MODE_POSTGRES_SELF) return false; //Ask for a new username and password to specify when creating a new self-hosted database. Dialog_InitialPassword* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) return false; add_view(dialog); int response = Gtk::RESPONSE_OK; bool keep_trying = true; while(keep_trying) { response = Utils::dialog_run_with_help(dialog); //Check the password is acceptable: if(response == Gtk::RESPONSE_OK) { const bool password_ok = dialog->check_password(); if(password_ok) { user = dialog->get_user(); password = dialog->get_password(); keep_trying = false; //Everything is OK. } } else { keep_trying = false; //The user cancelled. } dialog->hide(); } remove_view(dialog); delete dialog; dialog = 0; return (response == Gtk::RESPONSE_OK); } bool Frame_Glom::connection_request_password_and_choose_new_database_name() { Document* document = dynamic_cast(get_document()); if(!document) return false; ConnectionPool* connection_pool = ConnectionPool::get_instance(); connection_pool->setup_from_document(document); if(!m_pDialogConnection) { Utils::get_glade_widget_derived_with_warning(m_pDialogConnection); if(!m_pDialogConnection) { std::cerr << G_STRFUNC << ": m_pBox_Reports is null." << std::cerr; return false; } add_view(m_pDialogConnection); //Also a composite view. } switch(document->get_hosting_mode()) { case Document::HOSTING_MODE_POSTGRES_SELF: { Glib::ustring user, password; if(document->get_network_shared()) //Usually not the case when creating new documents. { const bool test = connection_request_initial_password(user, password); if(!test) return false; } else { //Use the default user because we are not network shared: user = Privs::get_default_developer_user_name(password); } // Create the requested self-hosting database: //Set the connection details in the ConnectionPool singleton. //The ConnectionPool will now use these every time it tries to connect. connection_pool->set_user(user); connection_pool->set_password(password); ShowProgressMessage progress_message(_("Initializing Database Data")); const bool initialized = handle_connection_initialize_errors( connection_pool->initialize( sigc::mem_fun(*this, &Frame_Glom::on_connection_initialize_progress) ) ); if(!initialized) return false; //Put the details into m_pDialogConnection too, because that's what we use to connect. //This is a bit of a hack: m_pDialogConnection->set_self_hosted_user_and_password(connection_pool->get_user(), connection_pool->get_password()); //std::cout << "DEBUG: after connection_pool->initialize(). The database cluster should now exist." << std::endl; } break; #ifdef GLOM_ENABLE_POSTGRESQL case Document::HOSTING_MODE_POSTGRES_CENTRAL: { //Ask for connection details: m_pDialogConnection->load_from_document(); //Get good defaults. m_pDialogConnection->set_transient_for(*get_app_window()); const int response = Glom::Utils::dialog_run_with_help(m_pDialogConnection); m_pDialogConnection->hide(); if(response == Gtk::RESPONSE_OK) { // We are not self-hosting, but we also call initialize() for // consistency (the backend will ignore it anyway). ConnectionPool::SlotProgress slot_ignored; if(!handle_connection_initialize_errors( connection_pool->initialize(slot_ignored)) ) return false; // Remember the user name in the document, to be able to open the // document again later: Glib::ustring username, password; m_pDialogConnection->get_username_and_password(username, password); document->set_connection_user(username); } else { // The user cancelled return false; } } break; #endif //GLOM_ENABLE_POSTGRESQL #ifdef GLOM_ENABLE_SQLITE case Document::HOSTING_MODE_SQLITE: { // sqlite ConnectionPool::SlotProgress slot_ignored; if(!handle_connection_initialize_errors( connection_pool->initialize(slot_ignored)) ) return false; m_pDialogConnection->load_from_document(); //Get good defaults. // No authentication required } break; #endif //GLOM_ENABLE_SQLITE default: g_assert_not_reached(); break; } // Do startup, such as starting the self-hosting database server ShowProgressMessage progress_message(_("Starting Database Server")); const ConnectionPool::StartupErrors started = connection_pool->startup( sigc::mem_fun(*this, &Frame_Glom::on_connection_startup_progress) ); if(started != ConnectionPool::Backend::STARTUPERROR_NONE) { std::cerr << G_STRFUNC << ": startup() failed." << std::endl; return false; } const Glib::ustring database_name = document->get_connection_database(); //std::cout << "debug: database_name to create=" << database_name << std::endl; //TODO: Use DbUtils::get_unused_database_name() instead: bool keep_trying = true; size_t extra_num = 0; while(keep_trying) { Glib::ustring database_name_possible; if(extra_num == 0) { //Try the original name first, //removing any characters that are likely to cause problems when used in a SQL identifier name: database_name_possible = Utils::trim_whitespace(database_name); database_name_possible = Utils::string_replace(database_name_possible, "\"", ""); database_name_possible = Utils::string_replace(database_name_possible, "'", ""); database_name_possible = Utils::string_replace(database_name_possible, "\t", ""); database_name_possible = Utils::string_replace(database_name_possible, "\n", ""); } else { //Create a new database name by appending a number to the original name: Glib::ustring pchExtraNum = Glib::ustring::compose("%1", extra_num); database_name_possible = (database_name + pchExtraNum); } ++extra_num; m_pDialogConnection->set_database_name(database_name_possible); //std::cout << "debug: possible name=" << database_name_possible << std::endl; try { g_assert(m_pDialogConnection); sharedptr sharedconnection = m_pDialogConnection->connect_to_server_with_connection_settings(); //If no exception was thrown then the database exists. //But we are looking for an unused database name, so we will try again. } catch(const ExceptionConnection& ex) { //std::cerr << G_STRFUNC << ": caught exception." << std::endl; if(ex.get_failure_type() == ExceptionConnection::FAILURE_NO_SERVER) { //Warn the user, and let him try again: Utils::show_ok_dialog(_("Connection Failed"), _("Glom could not connect to the database server. Maybe you entered an incorrect user name or password, or maybe the postgres database server is not running."), *(get_app_window()), Gtk::MESSAGE_ERROR); //TODO: Add help button. keep_trying = false; } else { std::cout << "debug: " << G_STRFUNC << ": unused database name successfully found: " << database_name_possible << std::endl; //The connection to the server is OK, but the specified database does not exist. //That's good - we were looking for an unused database name. //std::cout << "debug: unused database name found: " << database_name_possible << std::endl; document->set_connection_database(database_name_possible); // Remember host and port if the document is not self hosted #ifdef GLOM_ENABLE_POSTGRESQL if(document->get_hosting_mode() == Document::HOSTING_MODE_POSTGRES_CENTRAL) { ConnectionPool::Backend* backend = connection_pool->get_backend(); ConnectionPoolBackends::PostgresCentralHosted* central = dynamic_cast(backend); g_assert(central); document->set_connection_server(central->get_host()); document->set_connection_port(central->get_port()); document->set_connection_try_other_ports(false); } // Remember port if the document is self-hosted, so that remote // connections to the database (usinc browse network) know what port to use. // TODO: There is already similar code in // connect_to_server_with_connection_settings, which is just not // executed because it failed with no database present. We should // somehow avoid this code duplication. else if(document->get_hosting_mode() == Document::HOSTING_MODE_POSTGRES_SELF) { ConnectionPool::Backend* backend = connection_pool->get_backend(); ConnectionPoolBackends::PostgresSelfHosted* self = dynamic_cast(backend); g_assert(self); document->set_connection_port(self->get_port()); document->set_connection_try_other_ports(false); } #endif //GLOM_ENABLE_POSTGRESQL return true; } } } cleanup_connection(); return false; } #endif //GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::cleanup_connection() { ConnectionPool* connection_pool = ConnectionPool::get_instance(); ShowProgressMessage progress_message(_("Stopping Database Server")); connection_pool->cleanup( sigc::mem_fun(*this, &Frame_Glom::on_connection_cleanup_progress) ); } bool Frame_Glom::handle_request_password_connection_error(bool asked_for_password, const ExceptionConnection& ex, bool& database_not_found) { std::cerr << G_STRFUNC << ": caught exception." << std::endl; //Initialize input parameter: database_not_found = false; if(asked_for_password && ex.get_failure_type() == ExceptionConnection::FAILURE_NO_SERVER) { //Warn the user, and let him try again: Utils::show_ok_dialog(_("Connection Failed"), _("Glom could not connect to the database server. Maybe you entered an incorrect user name or password, or maybe the postgres database server is not running."), *(get_app_window()), Gtk::MESSAGE_ERROR); //TODO: Add help button. return true; } else if(ex.get_failure_type() == ExceptionConnection::FAILURE_NO_DATABASE) { cleanup_connection(); //The connection to the server might be OK, but the specified database does not exist: //Or the connection failed when trying without a password. database_not_found = true; //Tell the caller about this error. return false; } else { std::cerr << G_STRFUNC << ": Unexpected exception: " << ex.what() << std::endl; cleanup_connection(); return false; } } bool Frame_Glom::connection_request_password_and_attempt(bool& database_not_found, const Glib::ustring known_username, const Glib::ustring& known_password, bool confirm_known_user) { //Initialize output parameter: database_not_found = false; Document* document = dynamic_cast(get_document()); if(!document) return false; //Start a self-hosted server if necessary: ConnectionPool* connection_pool = ConnectionPool::get_instance(); ShowProgressMessage progress_message(_("Starting Database Server")); connection_pool->setup_from_document(document); const ConnectionPool::StartupErrors started = connection_pool->startup( sigc::mem_fun(*this, &Frame_Glom::on_connection_startup_progress) ); if(started != ConnectionPool::Backend::STARTUPERROR_NONE) { std::cerr << G_STRFUNC << ": startup() failed." << std::endl; return false; } AppWindow* app = dynamic_cast(get_app_window()); app->clear_progress_message(); //Only ask for the password if we are shared on the network, or we are using a centrally hosted server. //Otherwise, no password question is necessary, due to how our self-hosted database server is configured. if(document->get_network_shared() || document->get_hosting_mode() == Document::HOSTING_MODE_POSTGRES_CENTRAL) { //We recreate the dialog each time to make sure it is clean of any changes: delete m_pDialogConnection; m_pDialogConnection = 0; Utils::get_glade_widget_derived_with_warning(m_pDialogConnection); if(!m_pDialogConnection) { std::cerr << G_STRFUNC << ": m_pDialogConnection is null." << std::endl; return false; } add_view(m_pDialogConnection); //Also a composite view. m_pDialogConnection->load_from_document(); //Get good defaults. m_pDialogConnection->set_transient_for(*get_app_window()); //Show alternative text if necessary: if(confirm_known_user) m_pDialogConnection->set_confirm_existing_user_note(); if(!known_username.empty()) m_pDialogConnection->set_username(known_username); if(!known_password.empty()) m_pDialogConnection->set_password(known_password); } else { //Later, if m_pDialogConnection is null then we assume we should use the known user/password: delete m_pDialogConnection; m_pDialogConnection = 0; } //Ask for connection details: while(true) //Loop until a return { //Only show the dialog if we don't know the correct username/password yet: int response = Gtk::RESPONSE_OK; if(m_pDialogConnection) { response = Glom::Utils::dialog_run_with_help(m_pDialogConnection); m_pDialogConnection->hide(); } //Try to use the entered username/password: if(response == Gtk::RESPONSE_OK) { sharedptr sharedconnection; //Ask for the user/password if necessary: //TODO: Remove any previous database setting? if(m_pDialogConnection) { try { sharedconnection = m_pDialogConnection->connect_to_server_with_connection_settings(); // TODO: Save username in document? return true; //Succeeded, because no exception was thrown. } catch(const ExceptionConnection& ex) { if(!handle_request_password_connection_error(true, ex, database_not_found)) return false; } } else { //Use the known password: ConnectionPool* connectionpool = ConnectionPool::get_instance(); connectionpool->set_user(known_username); connectionpool->set_password(known_password); try { Base_DB::connect_to_server(get_app_window()); return true; //Succeeded, because no exception was thrown. } catch(const ExceptionConnection& ex) { if(!handle_request_password_connection_error(false, ex, database_not_found)) return false; } } //Try again. } else { cleanup_connection(); return false; //The user cancelled. } } } #ifndef GLOM_ENABLE_CLIENT_ONLY bool Frame_Glom::create_database(const Glib::ustring& database_name, const Glib::ustring& title) { bool result = false; Gtk::Window* pWindowApp = get_app_window(); g_assert(pWindowApp); { BusyCursor busycursor(*pWindowApp); sigc::slot onProgress; //TODO: Show visual feedback. result = DbUtils::create_database(get_document(), database_name, title, onProgress); } if(!result) { //Tell the user: Gtk::Dialog* dialog = 0; Utils::get_glade_widget_with_warning("glom_developer.glade", "dialog_error_create_database", dialog); if(!dialog) { std::cerr << G_STRFUNC << ": dialog is null." << std::cerr; return false; } dialog->set_transient_for(*pWindowApp); Glom::Utils::dialog_run_with_help(dialog, "dialog_error_create_database"); delete dialog; return false; } return result; } #endif // !GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_menu_report_selected(const Glib::ustring& report_name) { const Privileges table_privs = Privs::get_current_privs(m_table_name); //Don't try to print tables that the user can't view. if(!table_privs.m_view) { //TODO: Warn the user. return; } Document* document = get_document(); sharedptr report = document->get_report(m_table_name, report_name); if(!report) return; FoundSet found_set = m_Notebook_Data.get_found_set(); ReportBuilder report_builder(AppWindow::get_current_locale()); report_builder.set_document(document); const std::string filepath = report_builder.report_build_and_save(found_set, report); //TODO: Use found set's where_clause. Utils::show_report_in_browser(filepath, get_app_window()); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_menu_print_layout_selected(const Glib::ustring& print_layout_name) { do_print_layout(print_layout_name, false /* not preview */, get_app_window()); } void Frame_Glom::do_print_layout(const Glib::ustring& print_layout_name, bool preview, Gtk::Window* transient_for) { const Document* document = get_document(); sharedptr print_layout = document->get_print_layout(m_table_name, print_layout_name); const Privileges table_privs = Privs::get_current_privs(m_table_name); //Don't try to print tables that the user can't view. if(!table_privs.m_view) { //TODO: Warn the user. return; } //TODO: When expanding items, avoid the page gaps that the print layout's design //has added. const FoundSet found_set = m_Notebook_Data.get_found_set_selected(); //Note that found_set.m_where_clause could be empty if there are no records yet, //and that is acceptable if this is for a print preview while designing the print layout. PrintLayoutUtils::do_print_layout(print_layout, found_set, preview, document, false /* do not avoid print margins */, transient_for); } #endif // !GLOM_ENABLE_CLIENT_ONLY #ifndef GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_dialog_layout_report_hide() { Document* document = get_document(); if(document && true) //m_pDialogLayoutReport->get_modified()) { const Glib::ustring original_name = m_pDialogLayoutReport->get_original_report_name(); sharedptr report = m_pDialogLayoutReport->get_report(); if(report && (original_name != report->get_name())) document->remove_report(m_table_name, original_name); document->set_report(m_table_name, report); } //Update the reports menu: AppWindow* pApp = dynamic_cast(get_app_window()); if(pApp) pApp->fill_menu_reports(m_table_name); } void Frame_Glom::on_dialog_layout_print_hide() { Document* document = get_document(); if(document && true) //m_pDialogLayoutReport->get_modified()) { const Glib::ustring original_name = m_pDialogLayoutPrint->get_original_name(); sharedptr print_layout = m_pDialogLayoutPrint->get_print_layout(); if(print_layout && (original_name != print_layout->get_name())) document->remove_report(m_table_name, original_name); document->set_print_layout(m_table_name, print_layout); } //Update the print layouts menu: AppWindow* pApp = dynamic_cast(get_app_window()); if(pApp) pApp->fill_menu_print_layouts(m_table_name); } #endif // !GLOM_ENABLE_CLIENT_ONLY void Frame_Glom::on_dialog_tables_hide() { //If tables could have been added or removed, update the tables menu: Document* document = dynamic_cast(get_document()); if(document) { // This is never true in client only mode, so we can as well save the // code size. #ifndef GLOM_ENABLE_CLIENT_ONLY if(document->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { AppWindow* pApp = dynamic_cast(get_app_window()); if(pApp) pApp->fill_menu_tables(); //Select a different table if the current one no longer exists: if(!document->get_table_is_known(m_table_name)) { //Open the default table, or the first table if there is no default: Glib::ustring table_name = document->get_default_table(); if(table_name.empty()) table_name = document->get_first_table(); show_table(table_name); } } #endif // !GLOM_ENABLE_CLIENT_ONLY } } void Frame_Glom::on_notebook_data_switch_page(Gtk::Widget* /* page */, guint /* page_num */) { //Refill this menu, because it depends on whether list or details are visible: AppWindow* pApp = dynamic_cast(get_app_window()); if(pApp) pApp->fill_menu_print_layouts(m_table_name); } void Frame_Glom::on_notebook_data_record_details_requested(const Glib::ustring& table_name, Gnome::Gda::Value primary_key_value) { //Specifying a primary key value causes the details tab to be shown: show_table(table_name, primary_key_value); } void Frame_Glom::on_notebook_data_record_selection_changed() { bool something_selected = false; const FoundSet found_set = m_Notebook_Data.get_found_set_selected(); if(!found_set.m_where_clause.empty()) something_selected = true; AppWindow* pApp = dynamic_cast(get_app_window()); if(pApp) pApp->enable_menu_print_layouts_details(something_selected); } void Frame_Glom::update_records_count() { //Get the number of records available and the number found, //and all the user to find all if necessary. gulong count_all = 0; gulong count_found = 0; m_Notebook_Data.get_record_counts(count_all, count_found); std::string str_count_all, str_count_found; std::stringstream the_stream; //the_stream.imbue( current_locale ); the_stream << count_all; the_stream >> str_count_all; if(count_found == count_all) { if(count_found != 0) //Show 0 instead of "all" when all of no records are found, to avoid confusion. str_count_found = _("All"); else str_count_found = str_count_all; m_Button_FindAll.hide(); } else { std::stringstream the_stream; //Reusing the existing stream seems to produce an empty string. the_stream << count_found; the_stream >> str_count_found; m_Button_FindAll.show(); } m_Label_RecordsCount.set_text(str_count_all); m_Label_FoundCount.set_text(str_count_found); } void Frame_Glom::on_button_find_all() { //Change the found set to all records: show_table(m_table_name); } Glib::ustring Frame_Glom::get_shown_table_name() const { return m_table_name; } } //namespace Glom glom-1.22.4/glom/utils_ui.cc0000644000175000017500000004201212234776363017102 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include // For GLOM_IMAGE_FORMAT #include #include // For gda_blob_op_read_all() #include #include #include #include #include #include #include #include #include // for strchr #include //For stringstream #include #include #include // for locale, time_put #include // for struct tm #include // for cout, endl #include #include // For ShellExecute: #ifdef G_OS_WIN32 # include #endif namespace { // Basically copied from libgnome (gnome-help.c, Copyright (C) 2001 Sid Vicious // Copyright (C) 2001 Jonathan Blandford ), but C++ified std::string locate_help_file(const std::string& path, const std::string& doc_name) { // g_get_language_names seems not to be wrapped by glibmm const char* const* lang_list = g_get_language_names (); for(unsigned int j = 0; lang_list[j] != 0; ++j) { const char* lang = lang_list[j]; /* This must be a valid language AND a language with * no encoding postfix. The language will come up without * encoding next. */ if(lang == 0 || strchr(lang, '.') != 0) continue; const char* exts[] = { "", ".xml", ".docbook", ".sgml", ".html", 0 }; for(unsigned i = 0; exts[i] != 0; ++i) { std::string name = doc_name + exts[i]; std::string full = Glib::build_filename(path, Glib::build_filename(lang, name)); if(Glib::file_test(full, Glib::FILE_TEST_EXISTS)) return full; } } return std::string(); } } //anonymous namespace namespace Glom { // Run dialog and response on Help if appropriate. int Utils::dialog_run_with_help(Gtk::Dialog* dialog, const Glib::ustring& id) { int result = dialog->run(); while (result == Gtk::RESPONSE_HELP) { show_help(id); result = dialog->run(); } dialog->hide(); return result; } /* * Help::show_help(const std::string& id) * * Launch a help browser with the glom help and load the given id if given * If the help cannot be found an error dialog will be shown */ void Utils::show_help(const Glib::ustring& id) { GError* err = 0; const gchar* pId; if(id.length()) { pId = id.c_str(); } else { pId = 0; } try { const char path[] = GLOM_DATADIR G_DIR_SEPARATOR_S "gnome" G_DIR_SEPARATOR_S "help" G_DIR_SEPARATOR_S "glom"; std::string help_file = locate_help_file(path, "glom.xml"); if(help_file.empty()) { throw std::runtime_error(_("No help file available")); } else { std::string uri = "ghelp:" + help_file; if(pId) { uri += '?'; uri += pId; } // g_app_info_launch_default_for_uri seems not to be wrapped by giomm if(!g_app_info_launch_default_for_uri(uri.c_str(), 0, &err)) { std::string message(err->message); g_error_free(err); throw std::runtime_error(message); } } } catch(const std::exception& ex) { const Glib::ustring message = Glib::ustring::compose(_("Could not display help: %1"), Glib::ustring(ex.what())); Gtk::MessageDialog dialog(message, false, Gtk::MESSAGE_ERROR); dialog.run(); } } void Utils::show_ok_dialog(const Glib::ustring& title, const Glib::ustring& message, Gtk::Window* parent, Gtk::MessageType message_type) { Gtk::MessageDialog dialog("" + title + "", true /* markup */, message_type, Gtk::BUTTONS_OK); dialog.set_secondary_text(message); if(parent) dialog.set_transient_for(*parent); dialog.run(); } void Utils::show_ok_dialog(const Glib::ustring& title, const Glib::ustring& message, Gtk::Window& parent, Gtk::MessageType message_type) { show_ok_dialog(title, message, &parent, message_type); } namespace { static void on_window_hide(Glib::RefPtr main_loop, sigc::connection handler_connection) { handler_connection.disconnect(); //This should release a main_loop reference. main_loop->quit(); //main_loop should be destroyed soon, because nothing else is using it. } } //anonymous namespace. void Utils::show_window_until_hide(Gtk::Window* window) { if(!window) return; Glib::RefPtr main_loop = Glib::MainLoop::create(false /* not running */); //Stop the main_loop when the window is hidden: sigc::connection handler_connection; //TODO: There seems to be a crash if this is on the same line. handler_connection = window->signal_hide().connect( sigc::bind( sigc::ptr_fun(&on_window_hide), main_loop, handler_connection ) ); window->show(); main_loop->run(); //Run and block until it is stopped by the hide signal handler. } Glib::ustring Utils::bold_message(const Glib::ustring& message) { return "" + message + ""; } Glib::RefPtr Utils::get_pixbuf_for_gda_value(const Gnome::Gda::Value& value) { Glib::RefPtr result; if(value.get_value_type() == GDA_TYPE_BINARY || value.get_value_type() == GDA_TYPE_BLOB) { glong buffer_binary_length; gconstpointer buffer_binary; if(value.get_value_type() == GDA_TYPE_BLOB) { const GdaBlob* blob = value.get_blob(); if(gda_blob_op_read_all(blob->op, const_cast(blob))) { buffer_binary_length = blob->data.binary_length; buffer_binary = blob->data.data; } else { buffer_binary_length = 0; buffer_binary = 0; std::cerr << G_STRFUNC << ": Failed to read BLOB data" << std::endl; } } else { buffer_binary = value.get_binary(buffer_binary_length); } /* Note that this is regular binary data, not escaped text representing the binary data: */ if(buffer_binary && buffer_binary_length) { //typedef std::list type_list_formats; //const type_list_formats formats = Gdk::Pixbuf::get_formats(); //std::cout << "Debug: Supported pixbuf formats:" << std::endl; //for(type_list_formats::const_iterator iter = formats.begin(); iter != formats.end(); ++iter) //{ // std::cout << " name=" << iter->get_name() << ", writable=" << iter->is_writable() << std::endl; //} Glib::RefPtr refPixbufLoader; try { refPixbufLoader = Gdk::PixbufLoader::create(); } catch(const Gdk::PixbufError& ex) { refPixbufLoader.reset(); std::cerr << "PixbufLoader::create failed: " << ex.what() << std::endl; } if(refPixbufLoader) { guint8* puiData = (guint8*)buffer_binary; try { refPixbufLoader->write(puiData, static_cast(buffer_binary_length)); result = refPixbufLoader->get_pixbuf(); refPixbufLoader->close(); //This throws if write() threw, so it must be inside the try block. } catch(const Glib::Exception& ex) { std::cerr << G_STRFUNC << ": PixbufLoader::write() failed: " << ex.what() << std::endl; } } //TODO: load the image, using the mime type stored elsewhere. //pixbuf = Gdk::Pixbuf::create_from_data( } } return result; } static int get_width_for_text(Gtk::Widget& widget, const Glib::ustring& text) { //Get the width required for this string in the current font: Glib::RefPtr refLayout = widget.create_pango_layout(text); int width = 0; int height = 0; refLayout->get_pixel_size(width, height); int result = width; //Add a bit more: result += 10; return result; } int Utils::get_suitable_field_width_for_widget(Gtk::Widget& widget, const sharedptr& field_layout, bool or_title, bool for_treeview) { int result = 150; //Suitable default. const Field::glom_field_type field_type = field_layout->get_glom_type(); Glib::ustring example_text; switch(field_type) { case(Field::TYPE_DATE): { const Glib::Date date(31, Glib::Date::Month(12), 2000); example_text = Conversions::get_text_for_gda_value(field_type, Gnome::Gda::Value(date)); break; } case(Field::TYPE_TIME): { Gnome::Gda::Time time = {0, 0, 0, 0, 0}; time.hour = 24; time.minute = 59; time.second = 59; example_text = Conversions::get_text_for_gda_value(field_type, Gnome::Gda::Value(time)); break; } case(Field::TYPE_NUMERIC): { if(for_treeview) example_text = "EUR 999.99"; else example_text = "EUR 9999999999"; break; } case(Field::TYPE_TEXT): case(Field::TYPE_IMAGE): //Give images the same width as text fields, so they will often line up. { if(for_treeview) example_text = "AAAAAAAAAAAA"; else example_text = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; break; } default: { break; } } if(!example_text.empty()) { //Get the width required for this string in the current font: result = get_width_for_text(widget, example_text); } if(or_title) { //Make sure that there's enough space for the title too. const int title_width = get_width_for_text(widget, item_get_title(field_layout)); if(title_width > result) result = title_width; } return result; } std::string Utils::get_filepath_with_extension(const std::string& filepath, const std::string& extension) { std::string result = filepath; bool add_ext = false; const std::string str_ext = "." + extension; if(result.size() < str_ext.size()) //It can't have the ext already if it's not long enough. { add_ext = true; //It isn't there already. } else { const Glib::ustring strEnd = result.substr(result.size() - str_ext.size()); if(strEnd != str_ext) //If it doesn't already have the extension add_ext = true; } //Add extension if necessay. if(add_ext) result += str_ext; //TODO: Do not replace existing extensions, so it could be e.g. 'something.blah.theext' return result; } //static: Glib::RefPtr Utils::image_scale_keeping_ratio(const Glib::RefPtr& pixbuf, int target_height, int target_width) { if( (target_height == 0) || (target_width == 0) ) return Glib::RefPtr(); //This shouldn't happen anyway. if(!pixbuf) return pixbuf; enum enum_scale_mode { SCALE_WIDTH, SCALE_HEIGHT, SCALE_BOTH, SCALE_NONE }; enum_scale_mode scale_mode = SCALE_NONE; //Start with either the width or height, and scale the other according to the ratio. const int pixbuf_height = pixbuf->get_height(); const int pixbuf_width = pixbuf->get_width(); if(pixbuf_height > target_height) { if(pixbuf_width > target_width) { scale_mode = SCALE_BOTH; } else { //Only the height is bigger: scale_mode = SCALE_HEIGHT; } } else if(pixbuf_width > target_width) { //Only the height is bigger: scale_mode = SCALE_WIDTH; } if(scale_mode == SCALE_NONE) return pixbuf; else if(scale_mode == SCALE_HEIGHT) { const float ratio = (float)target_height / (float)pixbuf_height; target_width = (int)((float)pixbuf_width * ratio); } else if(scale_mode == SCALE_WIDTH) { const float ratio = (float)target_width / (float) pixbuf_width; target_height = (int)((float)pixbuf_height * ratio); } else if(scale_mode == SCALE_BOTH) { const float ratio = std::min( (float)target_width / (float) pixbuf_width, (float)target_height / (float) pixbuf_height); target_width = (int)((float)pixbuf_width * ratio); target_height = (int)((float)pixbuf_height * ratio); } if( (target_height == 0) || (target_width == 0) ) { return Glib::RefPtr(); //This shouldn't happen anyway. It seems to happen sometimes though, when ratio is very small. } return pixbuf->scale_simple(target_width, target_height, Gdk::INTERP_NEAREST); } bool Utils::show_warning_no_records_found(Gtk::Window& transient_for) { const Glib::ustring message = _("Your find criteria did not match any records in the table."); Gtk::MessageDialog dialog(Utils::bold_message(_("No Records Found")), true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE); dialog.set_secondary_text(message); dialog.set_transient_for(transient_for); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("New Find"), Gtk::RESPONSE_OK); const bool find_again = (dialog.run() == Gtk::RESPONSE_OK); return find_again; } void Utils::show_report_in_browser(const std::string& filepath, Gtk::Window* parent_window) { //Give the user a clue, in case the web browser opens in the background, for instance in a new tab: if(parent_window) show_ok_dialog(_("Report Finished"), _("The report will now be opened in your web browser."), *parent_window, Gtk::MESSAGE_INFO); #ifdef G_OS_WIN32 // gtk_show_uri doesn't seem to work on Win32, at least not for local files // We use Windows API instead. // TODO: Check it again and file a bug if necessary. ShellExecute(0, "open", filepath.c_str(), 0, 0, SW_SHOW); #else Glib::ustring uri; try { uri = Glib::filename_to_uri(filepath); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": Could not convert filepath to URI: " << filepath << std::endl; return; } //Use the GNOME browser: GError* gerror = 0; if(!gtk_show_uri(0 /* screen */, uri.c_str(), GDK_CURRENT_TIME, &gerror)) { std::cerr << G_STRFUNC << ": " << gerror->message << std::endl; g_error_free(gerror); } #endif //G_OS_WIN32 } std::string Utils::get_icon_path(const Glib::ustring& filename) { #ifdef G_OS_WIN32 gchar* basepath = g_win32_get_package_installation_directory_of_module(0); const std::string result = Glib::build_filename(Glib::build_filename(basepath, "share" G_DIR_SEPARATOR_S "glom" G_DIR_SEPARATOR_S "pixmaps"), filename); g_free(basepath); return result; #else return Glib::build_filename(GLOM_PKGDATADIR G_DIR_SEPARATOR_S "pixmaps", filename); #endif } bool Utils::script_check_for_pygtk2_with_warning(const Glib::ustring& script, Gtk::Window* parent_window) { if(!Utils::script_check_for_pygtk2(script)) { Utils::show_ok_dialog(_("Script Uses PyGTK 2"), _("Glom cannot run this script because it uses pygtk 2, but Glom uses GTK+ 3, and attempting to use pygtk 2 would cause Glom to crash."), parent_window, Gtk::MESSAGE_ERROR); return false; } return true; } void Utils::treeview_delete_all_columns(Gtk::TreeView* treeview) { if(!treeview) return; //We use this instead of just Gtk::TreeView::remove_all_columns() //because that deletes columns as a side-effect of unreferencing them, //and that behaviour might be fixed in gtkmm sometime, //and whether they should be deleted by that would depend on whether we used Gtk::manage(). //Deleting them explicitly is safer and clearer. murrayc. //Remove all View columns: typedef std::vector type_vec_columns; type_vec_columns vecViewColumns (treeview->get_columns()); for (type_vec_columns::iterator iter (vecViewColumns.begin ()), columns_end (vecViewColumns.end ()); iter != columns_end; ++iter) { Gtk::TreeView::Column* pViewColumn (*iter); if(!pViewColumn) continue; GtkTreeViewColumn* weak_ptr = 0; g_object_add_weak_pointer (G_OBJECT (pViewColumn->gobj()), (gpointer*)&weak_ptr); //Keep the object alive, instead of letting gtk_tree_view_remove_column() delete it by reducing its reference to 0, //so we can explicitly delete it. //This feels safer, considering some strange crashes I've seen when using Gtk::TreeView::remove_all_columns(), //though that might have been just because we didn't reset m_treeviewcolumn_button. murrayc. pViewColumn->reference(); treeview->remove_column(*pViewColumn); delete pViewColumn; //This should cause it to be removed. if(weak_ptr) { std::cerr << G_STRFUNC << ": The GtkTreeViewColumn was not destroyed as expected." << std::endl; } } } } //namespace Glom glom-1.22.4/glom/filechooser_export.cc0000644000175000017500000000670712234776363021163 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "filechooser_export.h" #include #include #include #include #include namespace Glom { FileChooser_Export::FileChooser_Export() : Gtk::FileChooserDialog(_("Export to File"), Gtk::FILE_CHOOSER_ACTION_SAVE), m_extra_widget(Gtk::ORIENTATION_HORIZONTAL, Utils::DEFAULT_SPACING_SMALL), #ifndef GLOM_ENABLE_CLIENT_ONLY m_button_format(_("Define Data _Format"), true /* use mnenomic */), m_pDialogLayout(0), #endif //GLOM_ENABLE_CLIENT_ONLY m_document(0) { add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); add_button(_("_Export"), Gtk::RESPONSE_OK); m_extra_widget.pack_start(m_button_format, Gtk::PACK_SHRINK); #ifndef GLOM_ENABLE_CLIENT_ONLY m_button_format.signal_clicked().connect( sigc::mem_fun(*this, &FileChooser_Export::on_button_define_layout) ); m_button_format.show(); #endif set_extra_widget(m_extra_widget); m_extra_widget.show(); #ifndef GLOM_ENABLE_CLIENT_ONLY //TODO: Use a generic layout dialog? Dialog_Layout_Export* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) return; m_pDialogLayout = dialog; //add_view(m_pDialogLayout); //Give it access to the document. m_pDialogLayout->signal_hide().connect( sigc::mem_fun(*this, &FileChooser_Export::on_dialog_layout_hide) ); #endif //GLOM_ENABLE_CLIENT_ONLY } FileChooser_Export::~FileChooser_Export() { #ifndef GLOM_ENABLE_CLIENT_ONLY delete m_pDialogLayout; m_pDialogLayout = 0; #endif //GLOM_ENABLE_CLIENT_ONLY } void FileChooser_Export::set_export_layout(const Document::type_list_layout_groups& layout_groups, const Glib::ustring& table_name, Document* document) { m_layout_groups = layout_groups; m_table_name = table_name; m_document = document; if(!m_document) std::cerr << "FileChooser_Export::set_export_layout() document is NULL." << std::endl; } //We only allow a full export in client-only mode, //to avoid building a large part of the layout definition code. #ifndef GLOM_ENABLE_CLIENT_ONLY void FileChooser_Export::on_button_define_layout() { if(!m_pDialogLayout) return; m_pDialogLayout->set_layout_groups(m_layout_groups, m_document, m_table_name); //TODO: Use m_TableFields? m_pDialogLayout->set_transient_for(*this); set_modal(false); m_pDialogLayout->set_modal(); m_pDialogLayout->show(); } void FileChooser_Export::on_dialog_layout_hide() { if(m_pDialogLayout) m_pDialogLayout->get_layout_groups(m_layout_groups); } #endif //GLOM_ENABLE_CLIENT_ONLY void FileChooser_Export::get_layout_groups(Document::type_list_layout_groups& layout_groups) const { layout_groups = m_layout_groups; } } //namespace Glom glom-1.22.4/glom/utility_widgets/0000755000175000017500000000000012235000127020143 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/utility_widgets/layouttoolbarbutton.h0000644000175000017500000000332412234252646024470 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007, 2008 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_LAYOUTTOOLBARBUTTON_H #define GLOM_UTILITY_WIDGETS_LAYOUTTOOLBARBUTTON_H #include #include #include #include "layoutwidgetbase.h" namespace Glom { class LayoutToolbarButton : public Gtk::ToolButton { public: LayoutToolbarButton(const std::string& icon_name, LayoutWidgetBase::enumType type, const Glib::ustring& title, const Glib::ustring& tooltip); virtual ~LayoutToolbarButton(); private: //TODO: What is this for? murrayc. // We need an unique identifier for drag & drop! jhs static const gchar* get_target() { return "glom_print_layout_palette"; }; virtual void on_drag_begin(const Glib::RefPtr& drag_context); virtual void on_drag_data_get(const Glib::RefPtr&, Gtk::SelectionData& selection_data, guint, guint); private: LayoutWidgetBase::enumType m_type; }; } #endif //GLOM_UTILITY_WIDGETS_LAYOUTTOOLBARBUTTON_H glom-1.22.4/glom/utility_widgets/adddel/0000755000175000017500000000000012235000126021357 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/utility_widgets/adddel/adddel.h0000644000175000017500000003136412234776363023002 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTLITY_WIDGETS_ADDDEL_H #define GLOM_UTLITY_WIDGETS_ADDDEL_H #include #include #include #include #include #include #include #include #include namespace Glom { class AddDelColumnInfo { public: AddDelColumnInfo(); AddDelColumnInfo(const AddDelColumnInfo& src); AddDelColumnInfo& operator=(const AddDelColumnInfo& src); //If we need any more complicated style (e.g. number of decimal digits) then we will need a separate AddDelStyle class. enum enumStyles { STYLE_Text, STYLE_Numerical, //TODO: Right-justify STYLE_Boolean, STYLE_Choices }; enumStyles m_style; Glib::ustring m_name; Glib::ustring m_id; Field::glom_field_type m_field_type; //If any. typedef std::vector type_vec_strings; type_vec_strings m_choices; bool m_editable; bool m_visible; bool m_prevent_duplicates; }; //For adding/deleting/selecting multi-columned lists of items. //This was also an abstraction layer against the strangeness of GtkSheet, though it now uses Gtk::TreeView instead. class AddDel : public Gtk::Box { public: friend class InnerIgnore; //declared below. AddDel(); AddDel(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~AddDel(); // Set the accessible name for the TreeView widget void set_treeview_accessible_name(const Glib::ustring& name); void set_allow_user_actions(bool bVal = true); bool get_allow_user_actions() const; void set_allow_add(bool val = true); void set_allow_delete(bool val = true); Gtk::TreeModel::iterator add_item(const Glib::ustring& strKey); //Return index of new row. /** Get an iterator to the blank row in which the user should add data for the new row. * You can then add the row to your underlying data store when some data has been filled, by handling signal_user_changed. */ Gtk::TreeModel::iterator get_item_placeholder(); //Return index of the placeholder row. void remove_item(const Gtk::TreeModel::iterator& iter); void remove_item_by_key(const Glib::ustring& strKey); void remove_all(); Glib::ustring get_value(const Gtk::TreeModel::iterator& iter, guint col); bool get_value_as_bool(const Gtk::TreeModel::iterator& iter, guint col); /** Get the row's hidden key */ Glib::ustring get_value_key(const Gtk::TreeModel::iterator& iter); /** Set the row's hidden key */ void set_value_key(const Gtk::TreeModel::iterator& iter, const Glib::ustring& strValue); Glib::ustring get_value_selected(guint col); Glib::ustring get_value_key_selected(); Gtk::TreeModel::iterator get_item_selected(); bool select_item(const Gtk::TreeModel::iterator& iter, guint column, bool start_editing = false); //bool indicates success. bool select_item(const Gtk::TreeModel::iterator& iter); //Select row with this key value: bool select_item(const Glib::ustring& strItemText, guint column, bool start_editing = false); guint get_count() const; //void set_value(const Gtk::TreeModel::iterator& iter, guint col, const Gnome::Gda::Value& value); void set_value(const Gtk::TreeModel::iterator& iter, guint col, const Glib::ustring& strValue); void set_value(const Gtk::TreeModel::iterator& iter, guint col, unsigned long ulValue); void set_value(const Gtk::TreeModel::iterator& iter, guint col, bool bVal); //void set_value_selected(guint col, const Gnome::Gda::Value& value); bool get_is_first_row(const Gtk::TreeModel::iterator& iter) const; bool get_is_last_row(const Gtk::TreeModel::iterator& iter) const; /** @result Whether this is a blank row where date for a new row should be entered */ bool get_is_placeholder_row(const Gtk::TreeModel::iterator& iter) const; guint add_column(const AddDelColumnInfo& column_info); guint add_column(const Glib::ustring& strTitle, AddDelColumnInfo::enumStyles style = AddDelColumnInfo::STYLE_Text, bool editable = true, bool visible = true); guint add_column(const Glib::ustring& strTitle, const Glib::ustring& column_id, AddDelColumnInfo::enumStyles style = AddDelColumnInfo::STYLE_Text, bool editable = true, bool visible = true); void prevent_duplicates(guint column_number); ///Allow the warning message about duplicate items to be more explicit. void set_prevent_duplicates_warning(const Glib::ustring& warning_text); guint get_columns_count() const; Glib::ustring get_column_field(guint column_index) const; typedef AddDelColumnInfo::type_vec_strings type_vec_strings; /** Retrieves the column order, even after they have been reordered by the user. * @result a vector of column_id. These column_ids were provided in the call to add_column(). */ type_vec_strings get_columns_order() const; void remove_all_columns(); //void set_columns_count(guint count); //void set_column_title(guint col, const Glib::ustring& strText); void set_column_width(guint col, guint width); /// For popup cells. void set_column_choices(guint col, const type_vec_strings& vecStrings); void construct_specified_columns(); //Delay actual use of set_column_*() stuff until this method is called. Gtk::TreeModel::iterator get_row(const Glib::ustring& key); void finish_editing(); //Closes active edit controls and commits the data to the cell. //void reactivate(); //Sheet doesn't seem to update unless a cell is active. void set_prevent_user_signals(bool bVal = true); /** When this is set to true, a new row will be added automatically, and the cursor will be placed in the first column of the new row. * Use set_auto_add(false) if you want to provide default values for columns in the new row, or if you want to place the cursor in a different column. * If @a value is false then signal_user_requested_add will be emitted so that you can add the row explicitly. */ void set_auto_add(bool value = true); Glib::RefPtr get_model(); Glib::RefPtr get_model() const; //Signals: //row number. typedef sigc::signal type_signal_user_added; type_signal_user_added signal_user_added(); //row number, col number. typedef sigc::signal type_signal_user_changed; type_signal_user_changed signal_user_changed(); //start row, end row typedef sigc::signal type_signal_user_requested_delete; type_signal_user_requested_delete signal_user_requested_delete(); //row number. typedef sigc::signal type_signal_user_requested_edit; type_signal_user_requested_edit signal_user_requested_edit(); typedef sigc::signal type_signal_user_requested_add; type_signal_user_requested_add signal_user_requested_add(); //row number, col number. typedef sigc::signal type_signal_user_activated; type_signal_user_activated signal_user_activated(); typedef sigc::signal type_signal_user_reordered_columns; type_signal_user_reordered_columns signal_user_reordered_columns(); bool get_model_column_index(guint view_column_index, guint& model_column_index); /** Get the last row. This will generally be the placeholder row. */ Gtk::TreeModel::iterator get_last_row(); /** Get the last row. This will generally be the placeholder row. */ Gtk::TreeModel::iterator get_last_row() const; protected: void init(); /** Get an iterator to the blank row in which the user should add data for the new row. * You can then add the row to your underlying data store when some data has been filled, by handling signal_user_changed. */ Gtk::TreeModel::iterator add_item_placeholder(); //Return index of new row. void setup_menu(); Glib::ustring treeview_get_key(const Gtk::TreeModel::iterator& row); ///Add a blank row, or return the existing blank row if there already is one. Gtk::TreeModel::iterator get_next_available_row_with_add_if_necessary(); void add_blank(); //Signal handlers: void on_treeview_cell_edited(const Glib::ustring& path_string, const Glib::ustring& new_text, int model_column_index); void on_treeview_cell_edited_bool(const Glib::ustring& path_string, int model_column_index); void on_treeview_cell_editing_started(Gtk::CellEditable* editable, const Glib::ustring& path, int model_column_index); bool on_treeview_column_drop(Gtk::TreeView* treeview, Gtk::TreeViewColumn* column, Gtk::TreeViewColumn* prev_column, Gtk::TreeViewColumn* next_column); void on_treeview_columns_changed(); bool on_button_press_event_Popup(GdkEventButton* event); void on_MenuPopup_activate_Edit(); void on_MenuPopup_activate_Delete(); void on_treeview_button_press_event(GdkEventButton* event); /** Set the menu to popup when the user right-clicks on the column titles. * This method does not take ownership of the Gtk::Menu. */ void set_column_header_popup(Gtk::Menu& popup); bool row_has_duplicates(const Gtk::TreeModel::iterator& iter) const; void warn_about_duplicate(); bool get_prevent_user_signals() const; //Sometimes the sheet sends signals when it shouldn't: void set_ignore_treeview_signals(bool bVal = true); bool get_ignore_treeview_signals() const; bool get_view_column_index(guint model_column_index, guint& view_column_index); guint get_count_hidden_system_columns(); //The column_id is extra information that we can use later to discover what the column shows, even when columns have been reordered. guint treeview_append_column(const Glib::ustring& title, Gtk::CellRenderer& cellrenderer, const Gtk::TreeModelColumnBase& model_column, const Glib::ustring& column_id); template guint treeview_append_column(const Glib::ustring& title, const Gtk::TreeModelColumn& column, const Glib::ustring& column_id); typedef Gtk::Box type_base; //Member widgets: Gtk::ScrolledWindow m_ScrolledWindow; Gtk::TreeView m_TreeView; Gtk::TreeModel::ColumnRecord m_ColumnRecord; Glib::RefPtr m_refListStore; guint m_col_key; //The index of the hidden model column. guint m_col_placeholder; //The index of the placeholder-marker model column. typedef std::vector type_ColumnTypes; type_ColumnTypes m_ColumnTypes; bool m_bAllowUserActions; bool m_bPreventUserSignals; bool m_bIgnoreSheetSignals; type_vec_strings m_vecColumnIDs; //We give each ViewColumn a special ID, so we know where they are after a reorder. Glib::ustring m_strTextActiveCell; //value before the change Gtk::Menu* m_pMenuPopup; Glib::RefPtr m_refActionGroup; Glib::RefPtr m_refUIManager; Glib::RefPtr m_refContextEdit, m_refContextDelete; bool m_auto_add; bool m_allow_add; bool m_allow_delete; Glib::ustring m_prevent_duplicates_warning; //signals: type_signal_user_added m_signal_user_added; type_signal_user_changed m_signal_user_changed; type_signal_user_requested_delete m_signal_user_requested_delete; type_signal_user_requested_edit m_signal_user_requested_edit; type_signal_user_requested_add m_signal_user_requested_add; type_signal_user_activated m_signal_user_activated; type_signal_user_reordered_columns m_signal_user_reordered_columns; //An instance of InnerIgnore remembers the ignore settings, //then restores them when it goes out of scope and is destroyed. class InnerIgnore { public: InnerIgnore(AddDel* pOuter); ~InnerIgnore(); protected: AddDel* m_pOuter; bool m_bPreventUserSignals, m_bIgnoreSheetSignals; }; }; template guint AddDel::treeview_append_column(const Glib::ustring& title, const Gtk::TreeModelColumn& column, const Glib::ustring& column_id) { Gtk::CellRenderer* pCellRenderer = manage( Gtk::CellRenderer_Generation::generate_cellrenderer() ); return treeview_append_column(title, *pCellRenderer, column, column_id); } } //namespace Glom #endif // GLOM_UTLITY_WIDGETS_ADDDEL_H glom-1.22.4/glom/utility_widgets/adddel/treeviewcolumn_glom.cc0000644000175000017500000000227112234252646025775 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "treeviewcolumn_glom.h" namespace Glom { TreeViewColumnGlom::TreeViewColumnGlom(const Glib::ustring& title, Gtk::CellRenderer& cell) : Gtk::TreeViewColumn(title, cell) { } TreeViewColumnGlom::~TreeViewColumnGlom() { } Glib::ustring TreeViewColumnGlom::get_column_id() const { return m_column_id; } void TreeViewColumnGlom::set_column_id(const Glib::ustring& value) { m_column_id = value; } } //namespace Glom glom-1.22.4/glom/utility_widgets/adddel/adddel_withbuttons.h0000644000175000017500000000320712234776363025447 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_ADDDEL_WITHBUTTONS_H #define GLOM_UTILITY_WIDGETS_ADDDEL_WITHBUTTONS_H #include "adddel.h" #include namespace Glom { class AddDel_WithButtons : public AddDel { public: AddDel_WithButtons(); AddDel_WithButtons(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~AddDel_WithButtons(); virtual void set_allow_add(bool val = true); //override virtual void set_allow_delete(bool val = true); //override virtual void set_allow_user_actions(bool bVal = true); //override private: void init(); void setup_buttons(); void on_button_add(); void on_button_del(); void on_button_edit(); //member widgets: Gtk::ButtonBox m_ButtonBox; Gtk::Button m_Button_Add; Gtk::Button m_Button_Del; Gtk::Button m_Button_Edit; }; } //namespace Glom #endif // GLOM_UTLITY_WIDGETS_ADDDEL_WITHBUTTONS_H glom-1.22.4/glom/utility_widgets/adddel/adddel.cc0000644000175000017500000013134312234776363023136 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include //For std::find. #include #include #include #include #include #include #include #include //#include #include //For debug output. namespace Glom { AddDelColumnInfo::AddDelColumnInfo() : m_style(STYLE_Text), m_field_type(Field::TYPE_INVALID), m_editable(true), m_visible(true), m_prevent_duplicates(false) { } AddDelColumnInfo::AddDelColumnInfo(const AddDelColumnInfo& src) : m_style(src.m_style), m_name(src.m_name), m_id(src.m_id), m_field_type(src.m_field_type), m_choices(src.m_choices), m_editable(src.m_editable), m_visible(src.m_visible), m_prevent_duplicates(src.m_prevent_duplicates) { } AddDelColumnInfo& AddDelColumnInfo::operator=(const AddDelColumnInfo& src) { m_style = src.m_style;; m_name = src.m_name; m_id = src.m_id; m_field_type = src.m_field_type; m_choices = src.m_choices; m_editable = src.m_editable; m_visible = src.m_visible; m_prevent_duplicates = src.m_prevent_duplicates; return *this; } AddDel::AddDel() : Gtk::Box(Gtk::ORIENTATION_VERTICAL), m_col_key(0), m_pMenuPopup(0), m_auto_add(true), m_allow_add(true), m_allow_delete(true) { init(); } AddDel::AddDel(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::Box(cobject), m_col_key(0), m_pMenuPopup(0), m_auto_add(true), m_allow_add(true), m_allow_delete(true) { init(); } void AddDel::init() { set_prevent_user_signals(); set_ignore_treeview_signals(); set_spacing(Utils::DEFAULT_SPACING_SMALL); m_bAllowUserActions = true; //Start with a useful default TreeModel: //set_columns_count(1); //construct_specified_columns(); m_ScrolledWindow.add(m_TreeView); m_ScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); m_ScrolledWindow.set_shadow_type(Gtk::SHADOW_IN); m_TreeView.show(); pack_start(m_ScrolledWindow); //Make sure that the TreeView doesn't start out only big enough for zero items. m_TreeView.set_size_request(-1, 150); //Allow the user to change the column order: //m_TreeView.set_column_drag_function( sigc::mem_fun(*this, &AddDel::on_treeview_column_drop) ); //m_TreeView.add_events(Gdk::BUTTON_PRESS_MASK); //Allow us to catch button_press_event and button_release_event m_TreeView.signal_button_press_event().connect_notify( sigc::mem_fun(*this, &AddDel::on_treeview_button_press_event) ); m_TreeView.signal_columns_changed().connect( sigc::mem_fun(*this, &AddDel::on_treeview_columns_changed) ); //add_blank(); setup_menu(); signal_button_press_event().connect(sigc::mem_fun(*this, &AddDel::on_button_press_event_Popup)); set_prevent_user_signals(false); set_ignore_treeview_signals(false); remove_all_columns(); //set up the default columns. show_all_children(); } AddDel::~AddDel() { } void AddDel::set_treeview_accessible_name(const Glib::ustring& name) { #ifdef GTKMM_ATKMM_ENABLED m_TreeView.get_accessible()->set_name(name); #endif } void AddDel::warn_about_duplicate() { Glib::ustring message; if(m_prevent_duplicates_warning.empty()) message = _("This item already exists. Please try again."); else message = m_prevent_duplicates_warning; //Something more specific and helpful. Gtk::MessageDialog dialog(Utils::bold_message(_("Duplicate")), true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK); dialog.set_secondary_text(message); //TODO: dialog.set_transient_for(get_parent_window()); dialog.run(); } void AddDel::on_MenuPopup_activate_Edit() { Glib::RefPtr refSelection = m_TreeView.get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { //Discover whether it's the last (empty) row: if(get_is_placeholder_row(iter)) { if(row_has_duplicates(iter)) { warn_about_duplicate(); } else { //This is a new entry: signal_user_added()(iter); /* bool bRowAdded = true; //The rows might be re-ordered: Gtk::TreeModel::iterator rowAdded = iter; Glib::ustring strValue_Added = get_value_key(iter); if(strValue_Added != strValue) rowAdded = get_row(strValue); if(bRowAdded) signal_user_requested_edit()(rowAdded); */ } } else { //Value changed: signal_user_requested_edit()(iter); } } } } void AddDel::on_MenuPopup_activate_Delete() { finish_editing(); Glib::RefPtr refSelection = m_TreeView.get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { //TODO: We can't handle multiple-selections yet. signal_user_requested_delete().emit(iter, iter); } } } void AddDel::setup_menu() { m_refActionGroup = Gtk::ActionGroup::create(); m_refActionGroup->add(Gtk::Action::create("ContextMenu", "Context Menu") ); m_refContextEdit = Gtk::Action::create("ContextEdit", Gtk::Stock::EDIT); m_refActionGroup->add(m_refContextEdit, sigc::mem_fun(*this, &AddDel::on_MenuPopup_activate_Edit) ); if(get_allow_user_actions()) { m_refContextDelete = Gtk::Action::create("ContextDelete", Gtk::Stock::DELETE); m_refActionGroup->add(m_refContextDelete, sigc::mem_fun(*this, &AddDel::on_MenuPopup_activate_Delete) ); } m_refUIManager = Gtk::UIManager::create(); m_refUIManager->insert_action_group(m_refActionGroup); //TODO: add_accel_group(m_refUIManager->get_accel_group()); try { Glib::ustring ui_info = "" " " " " " " " " ""; m_refUIManager->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_pMenuPopup = dynamic_cast( m_refUIManager->get_widget("/ContextMenu") ); if(!m_pMenuPopup) g_warning("menu not found"); } bool AddDel::on_button_press_event_Popup(GdkEventButton *event) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); } else { if(event->type == GDK_2BUTTON_PRESS) { //Double-click means edit. //Disable this, because it is confusing when single-click activates editable cells too. } } return true; } Gtk::TreeModel::iterator AddDel::get_item_placeholder() { //Get the existing placeholder row, or add one if necessary: Gtk::TreeModel::iterator iter = get_last_row(); if( get_is_placeholder_row(iter) ) { return iter; } else { return add_item_placeholder(); } } Gtk::TreeModel::iterator AddDel::add_item_placeholder() { Gtk::TreeModel::iterator iter = m_refListStore->append(); if(iter) { iter->set_value(m_col_key, Glib::ustring("")); //Remove temporary key value. iter->set_value(m_col_placeholder, true); //This will be unset when set_value() is used to put real data in this column. } return iter; } Gtk::TreeModel::iterator AddDel::add_item(const Glib::ustring& strKey) { Gtk::TreeModel::iterator result = get_next_available_row_with_add_if_necessary(); if(result) { Gtk::TreeModel::Row treerow = *result; if(treerow) { result->set_value(m_col_key, strKey); result->set_value(m_col_placeholder, false); } } add_blank(); //if necessary return result; } void AddDel::remove_all() { InnerIgnore innerIgnore(this); //see comments for InnerIgnore class. if(m_refListStore) { Gtk::TreeModel::iterator iter = m_refListStore->children().begin(); while(iter) { m_refListStore->erase(iter); iter = m_refListStore->children().begin(); } } } Glib::ustring AddDel::get_value(const Gtk::TreeModel::iterator& iter, guint col) { Glib::ustring value; if(m_refListStore) { Gtk::TreeModel::Row treerow = *iter; if(treerow) { const guint col_real = col; //Get different types of data, depending on the column: if(m_ColumnTypes[col_real].m_style == AddDelColumnInfo::STYLE_Boolean) { bool bValue = false; treerow.get_value(col_real, bValue); //Create a string representation of the value: value = bValue ? "true" : "false"; } else { treerow.get_value(col_real, value); } } } return value; } bool AddDel::get_value_as_bool(const Gtk::TreeModel::iterator& iter, guint col) { //TODO: I doubt that this works. It should really get the value from the treeview as a bool. murrayc Glib::ustring strValue = get_value(iter, col); return (strValue == "true"); } Glib::ustring AddDel::get_value_key_selected() { return get_value_selected(m_col_key); } Glib::ustring AddDel::get_value_selected(guint col) { Glib::ustring strValue = get_value(get_item_selected(), col); return strValue; } Gtk::TreeModel::iterator AddDel::get_item_selected() { Glib::RefPtr refTreeSelection = m_TreeView.get_selection(); if(refTreeSelection) { return refTreeSelection->get_selected(); } return m_refListStore->children().end(); } Gtk::TreeModel::iterator AddDel::get_row(const Glib::ustring& key) { for(Gtk::TreeModel::iterator iter = m_refListStore->children().begin(); iter != m_refListStore->children().end(); ++iter) { const Glib::ustring strTemp = get_value(iter, m_col_key); if(strTemp == key) { return iter; } } return m_refListStore->children().end(); } bool AddDel::select_item(const Gtk::TreeModel::iterator& iter) { guint col_first = 0; get_model_column_index(0, col_first); return select_item(iter, col_first); } bool AddDel::select_item(const Gtk::TreeModel::iterator& iter, guint column, bool start_editing) { if(!m_refListStore) return false; InnerIgnore innerIgnore(this); //see comments for InnerIgnore class bool bResult = false; if(iter) { Glib::RefPtr refTreeSelection = m_TreeView.get_selection(); if(refTreeSelection) { refTreeSelection->select(iter); Gtk::TreeModel::Path path = m_refListStore->get_path(iter); guint view_column_index = 0; bool test = get_view_column_index(column, view_column_index); if(test) { Gtk::TreeView::Column* pColumn = m_TreeView.get_column(view_column_index); if(pColumn) m_TreeView.set_cursor(path, *pColumn, start_editing); else g_warning("AddDel::select_item:TreeViewColumn not found."); } else g_warning("AddDel::select_item:TreeViewColumn index not found. column=%d", column); } bResult = true; } return bResult; } bool AddDel::select_item(const Glib::ustring& strItemText, guint column, bool start_editing) { Gtk::TreeModel::iterator iter = get_row(strItemText); if(iter) { return select_item(iter, column, start_editing); } return false; //failed } guint AddDel::get_count() const { if(!m_refListStore) return 0; guint iCount = m_refListStore->children().size(); //Take account of the extra blank for new entries: if(get_allow_user_actions()) //If it has the extra row. { if(get_is_placeholder_row(get_last_row())) --iCount; } return iCount; } void AddDel::add_blank() { bool bPreventUserSignals = get_prevent_user_signals(); set_prevent_user_signals(true); bool bAddNewBlank = false; if(get_allow_user_actions()) //The extra blank line is only used if the user may add items: { Gtk::TreeModel::iterator iter = get_last_row(); if(get_is_placeholder_row(iter)) { bAddNewBlank = false; //One already exists. } else { bAddNewBlank = true; // The last line isn't a placeholder. Add one. } } if(bAddNewBlank) add_item_placeholder(); set_prevent_user_signals(bPreventUserSignals); } guint AddDel::get_columns_count() const { return m_TreeView.get_columns().size(); } /* void AddDel::set_columns_count(guint count) { m_ColumnTypes.resize(count, STYLE_Text); m_vecColumnNames.resize(count); } */ /* void AddDel::set_column_title(guint col, const Glib::ustring& strText) { bool bPreventUserSignals = get_prevent_user_signals(); set_prevent_user_signals(true); Gtk::TreeViewColumn* pColumn = m_TreeView.get_column(col); if(pColumn) pColumn->set_title(strText); set_prevent_user_signals(bPreventUserSignals); } */ void AddDel::construct_specified_columns() { //TODO_optimisation: This is called many times, just to simplify the API. //Delay actual use of set_column_*() stuff until this method is called. if(m_ColumnTypes.empty()) return; typedef std::vector< Gtk::TreeModelColumnBase* > type_vecModelColumns; type_vecModelColumns vecModelColumns(m_ColumnTypes.size(), 0); //Create the Gtk ColumnRecord: Gtk::TreeModel::ColumnRecord record; { type_vecModelColumns::size_type i = 0; for(type_ColumnTypes::iterator iter = m_ColumnTypes.begin(); iter != m_ColumnTypes.end(); ++iter) { Gtk::TreeModelColumnBase* pModelColumn = 0; AddDelColumnInfo column_info = *iter; switch(column_info.m_style) { //Create an appropriate type of Model Column: case(AddDelColumnInfo::STYLE_Boolean): { pModelColumn = new Gtk::TreeModelColumn(); break; } case(AddDelColumnInfo::STYLE_Numerical): { pModelColumn = new Gtk::TreeModelColumn(); //TODO: Actually there are many different numeric types. break; } default: { pModelColumn = new Gtk::TreeModelColumn(); break; } } //Store it so we can use it and delete it later: vecModelColumns[i] = pModelColumn; record.add( *pModelColumn ); i++; } } //Create the model from the ColumnRecord: m_refListStore = Gtk::ListStore::create(record); m_TreeView.set_model(m_refListStore); //Remove all View columns: Utils::treeview_delete_all_columns(&m_TreeView); //Add new View Colums: int model_column_index = 0; int view_column_index = 0; for(type_vecModelColumns::iterator iter = vecModelColumns.begin(); iter != vecModelColumns.end(); ++iter) { type_vecModelColumns::value_type& pModelColumn = *iter; if(m_ColumnTypes[model_column_index].m_visible) { const Glib::ustring column_name = m_ColumnTypes[model_column_index].m_name; const Glib::ustring column_id = m_ColumnTypes[model_column_index].m_id; switch(m_ColumnTypes[model_column_index].m_style) { case(AddDelColumnInfo::STYLE_Choices): { //Use a custom CellRenderer: CellRendererList* pCellRenderer = Gtk::manage( new CellRendererList() ); //Add the choices: const type_vec_strings vecStrings = m_ColumnTypes[model_column_index].m_choices; for(type_vec_strings::const_iterator iter = vecStrings.begin(); iter != vecStrings.end(); ++iter) { pCellRenderer->append_list_item(*iter); } // Append the View column. // We use a derived Gtk::TreeViewColumn so that we can store extra information in it. // This means that we must reimplement the code from the convenience template methods from gtkmm. treeview_append_column( Utils::string_escape_underscores(column_name), *pCellRenderer, *pModelColumn, column_id); break; } case(AddDelColumnInfo::STYLE_Boolean): { //Use whatever standard CellRenderer gtkmm thinks is appropriate: //Cast to the derived type, because append_column<> is templated, and needs the type at compile-time //to use the correct specialization: Gtk::TreeModelColumn* pModelColumnDerived = static_cast< Gtk::TreeModelColumn* >(pModelColumn); if(pModelColumnDerived) treeview_append_column(Utils::string_escape_underscores(column_name), *pModelColumnDerived, column_id); break; } default: { //Use whatever standard CellRenderer gtkmm thinks is appropriate: //Cast to the derived type, because append_column<> is templated, and needs the type at compile-time //to use the correct specialization: Gtk::TreeModelColumn* pModelColumnDerived = static_cast< Gtk::TreeModelColumn* >(pModelColumn); if(pModelColumnDerived) treeview_append_column(Utils::string_escape_underscores(column_name), *pModelColumnDerived, column_id); break; } } //switch if(m_ColumnTypes[model_column_index].m_editable) { Gtk::CellRendererText* pCellRenderer = dynamic_cast(m_TreeView.get_column_cell_renderer(view_column_index)); if(pCellRenderer) { //Connect a signal handler: if(pCellRenderer) { //Make it editable: pCellRenderer->property_editable() = true; //Connect to its signal: pCellRenderer->signal_edited().connect( sigc::bind( sigc::mem_fun(*this, &AddDel::on_treeview_cell_edited), model_column_index) ); } } else { Gtk::CellRendererToggle* pCellRenderer = dynamic_cast(m_TreeView.get_column_cell_renderer(view_column_index)); if(pCellRenderer) { pCellRenderer->property_activatable() = true; //Connect to its signal: pCellRenderer->signal_toggled().connect( sigc::bind( sigc::mem_fun(*this, &AddDel::on_treeview_cell_edited_bool), model_column_index ) ); } } } //Connect other signals: Gtk::CellRenderer* pCellRenderer = m_TreeView.get_column_cell_renderer(view_column_index); if(pCellRenderer) pCellRenderer->signal_editing_started().connect( sigc::bind( sigc::mem_fun(*this, &AddDel::on_treeview_cell_editing_started), model_column_index) ); ++view_column_index; } //is visible ++model_column_index; } //Delete the vector's items: model_column_index = 0; for(type_vecModelColumns::iterator iter = vecModelColumns.begin(); iter != vecModelColumns.end(); ++iter) { Gtk::TreeModelColumnBase* pModelColumn = *iter; if(model_column_index < (int)m_ColumnTypes.size()) { AddDelColumnInfo::enumStyles style = m_ColumnTypes[model_column_index].m_style; switch(style) { //Cast it to the derived type, so we can delete it properly. //This is necessary because TreeModelColumnBase's destructor is not virtual. case(AddDelColumnInfo::STYLE_Boolean): { Gtk::TreeModelColumn* pModelColumnDerived = static_cast< Gtk::TreeModelColumn* >(pModelColumn); delete pModelColumnDerived; break; } case(AddDelColumnInfo::STYLE_Numerical): { Gtk::TreeModelColumn* pModelColumnDerived = static_cast< Gtk::TreeModelColumn* >(pModelColumn); delete pModelColumnDerived; break; } default: { Gtk::TreeModelColumn* pModelColumnDerived = static_cast< Gtk::TreeModelColumn* >(pModelColumn); delete pModelColumnDerived; break; } *iter = 0; } } else { std::cerr << G_STRFUNC << ": Leaking a Gtk::TreeModelColumn<>." << std::endl; } ++model_column_index; } m_TreeView.columns_autosize(); } /* void AddDel::set_value(const Gtk::TreeModel::iterator& iter, guint col, const Gnome::Gda::Value& value) { //Different model columns have different types of data: switch(m_ColumnTypes[col].m_style) { case(AddDelColumnInfo::STYLE_Boolean): { std::cerr << G_STRFUNC << ": boolean column being set as bool." << std::endl; set_value(iter, col, value.get_bool()); break; } default: { set_value( iter, col, Conversions::get_text_for_gda_value(m_ColumnTypes[col].m_field_type, value) ); break; } } } */ void AddDel::set_value(const Gtk::TreeModel::iterator& iter, guint col, const Glib::ustring& strValue) { InnerIgnore innerIgnore(this); if(!m_refListStore) std::cerr << G_STRFUNC << ": No model." << std::endl; else { Gtk::TreeModel::Row treerow = *iter; if(treerow) { //Different model columns have different types of data: switch(m_ColumnTypes[col].m_style) { case(AddDelColumnInfo::STYLE_Boolean): { bool bValue = (strValue == "true"); treerow.set_value(col, bValue); break; } default: { treerow.set_value(col, strValue); break; } } //Mark this row as not a placeholder because it has real data now. if( (col != m_col_key) && (col != m_col_placeholder) ) { if(!strValue.empty()) { //treerow.set_value(m_col_key, Glib::ustring("placeholder debug value setted")); //treerow.set_value(m_col_placeholder, false); } } } //Add extra blank if necessary: add_blank(); } } void AddDel::set_value(const Gtk::TreeModel::iterator& iter, guint col, unsigned long ulValue) { gchar pchValue[10] = {0}; sprintf(pchValue, "%d", (guint)ulValue); set_value(iter, col, Glib::ustring(pchValue)); } void AddDel::set_value(const Gtk::TreeModel::iterator& iter, guint col, bool bVal) { InnerIgnore innerIgnore(this); if(!m_refListStore) std::cerr << G_STRFUNC << ": No model." << std::endl; else { Gtk::TreeModel::Row treerow = *iter; if(treerow) { //Different model columns have different types of data: switch(m_ColumnTypes[col].m_style) { case(AddDelColumnInfo::STYLE_Boolean): { treerow.set_value(col, bVal); break; } default: { Glib::ustring strValue = (bVal ? "true" : "false"); treerow.set_value(col, strValue); break; } } } //Add extra blank if necessary: add_blank(); } } /* void AddDel::set_value_selected(guint col, const Gnome::Gda::Value& value) { set_value(get_item_selected(), col, value); } */ void AddDel::remove_all_columns() { m_ColumnTypes.clear(); //Add the hidden key.ID columns //Make these visible (with true) if you want to debug problems. m_col_key = add_column("Glom Hidden Key", AddDelColumnInfo::STYLE_Text, false /* not editable */, false /* not visible */); m_col_placeholder = add_column("Glom Hidden Placeholder", AddDelColumnInfo::STYLE_Boolean, true /* not editable */, false /* not visible */); } guint AddDel::add_column(const AddDelColumnInfo& column_info) { m_ColumnTypes.push_back(column_info); //Generate appropriate model columns: construct_specified_columns(); //Tell the View to use the model: //m_TreeView.set_model(m_refListStore); return m_ColumnTypes.size()-1; } guint AddDel::add_column(const Glib::ustring& strTitle, AddDelColumnInfo::enumStyles style, bool editable, bool visible) { //Use the title as the column_id: return add_column(strTitle, strTitle, style, editable, visible); } guint AddDel::add_column(const Glib::ustring& strTitle, const Glib::ustring& column_id, AddDelColumnInfo::enumStyles style, bool editable, bool visible) { InnerIgnore innerIgnore(this); //Stop on_treeview_columns_changed() from doing anything when it is called just because we add a new column. AddDelColumnInfo column_info; column_info.m_name = strTitle; column_info.m_style = style; column_info.m_id = column_id; column_info.m_editable = editable; column_info.m_visible = visible; return add_column(column_info); } Glib::ustring AddDel::get_column_field(guint column_index) const { Glib::ustring result; if(column_index < m_ColumnTypes.size()) result = m_ColumnTypes[column_index].m_id; return result; } bool AddDel::get_prevent_user_signals() const { return m_bPreventUserSignals; } void AddDel::set_prevent_user_signals(bool bVal) { m_bPreventUserSignals = bVal; } void AddDel::set_column_choices(guint col, const type_vec_strings& vecStrings) { InnerIgnore innerIgnore(this); //Stop on_treeview_columns_changed() from doing anything when it is called just because we add new columns. m_ColumnTypes[col].m_choices = vecStrings; guint view_column_index = 0; bool test = get_view_column_index(col, view_column_index); if(test) { CellRendererList* pCellRenderer = dynamic_cast( m_TreeView.get_column_cell_renderer(view_column_index) ); if(pCellRenderer) { //Add the choices: pCellRenderer->remove_all_list_items(); for(type_vec_strings::const_iterator iter = vecStrings.begin(); iter != vecStrings.end(); ++iter) { pCellRenderer->append_list_item(*iter); } } else { //The column does not exist yet, so we must create it: construct_specified_columns(); } } } void AddDel::set_allow_add(bool val) { m_allow_add = val; } void AddDel::set_allow_delete(bool val) { m_allow_delete= val; } void AddDel::set_allow_user_actions(bool bVal) { m_bAllowUserActions = bVal; } bool AddDel::get_allow_user_actions() const { return m_bAllowUserActions; } void AddDel::set_column_width(guint /* col */, guint /*width*/) { // if( col < (guint)m_Sheet.get_columns_count()) // m_Sheet.set_column_width(col, width); } void AddDel::finish_editing() { // bool bIgnoreSheetSignals = get_ignore_treeview_signals(); //The deactivate signals seems to cause the current cell to revert to it's previsous value. // set_ignore_treeview_signals(); // // int row = 0; // int col = 0; // m_Sheet.get_active_cell(row, col); // m_Sheet.set_active_cell(row, col); // // set_ignore_treeview_signals(bIgnoreSheetSignals); } void AddDel::set_ignore_treeview_signals(bool bVal) { m_bIgnoreSheetSignals = bVal; } bool AddDel::get_ignore_treeview_signals() const { return m_bIgnoreSheetSignals; } /* void AddDel::reactivate() { // //The sheet does not seem to get updated until one of its cells is activated: // // int row = 0; // int col = 0; // m_Sheet.get_active_cell(row, col); // // //Activate 0,0 if none is currently active. // if( (row == -1) && (col == -1) ) // { // row = 0; // col = 0; // } // // m_Sheet.set_active_cell(row, col); } */ void AddDel::remove_item(const Gtk::TreeModel::iterator& iter) { if(iter) m_refListStore->erase(iter); } void AddDel::remove_item_by_key(const Glib::ustring& strKey) { Gtk::TreeModel::iterator iter = get_row(strKey); remove_item(iter); } AddDel::InnerIgnore::InnerIgnore(AddDel* pOuter) : m_pOuter(pOuter), m_bPreventUserSignals(false), m_bIgnoreSheetSignals(false) { if(m_pOuter) { m_bPreventUserSignals = m_pOuter->get_prevent_user_signals(); m_pOuter->set_prevent_user_signals(); m_bIgnoreSheetSignals = m_pOuter->get_ignore_treeview_signals(); m_pOuter->set_ignore_treeview_signals(); } } AddDel::InnerIgnore::~InnerIgnore() { //Restore values: if(m_pOuter) { m_pOuter->set_prevent_user_signals(m_bPreventUserSignals); m_pOuter->set_ignore_treeview_signals(m_bIgnoreSheetSignals); } m_pOuter = 0; } Glib::ustring AddDel::treeview_get_key(const Gtk::TreeModel::iterator& row) { Glib::ustring value; if(m_refListStore) { Gtk::TreeModel::Row treerow = *row; if(treerow) treerow.get_value(m_col_key, value); } return value; } void AddDel::on_treeview_cell_edited_bool(const Glib::ustring& path_string, int model_column_index) { if(path_string.empty()) return; Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_refListStore->get_iter(path); if(iter) { Gtk::TreeModel::Row row = *iter; bool value_old = false; row.get_value(model_column_index, value_old); bool value_new = !value_old; //Store the user's new value in the model: row.set_value(model_column_index, value_new); //TODO: Did it really change? //Is this an add or a change?: bool bIsAdd = false; bool bIsChange = false; int iCount = m_refListStore->children().size(); if(iCount) { if(get_allow_user_actions()) //If add is possible: { if( get_is_placeholder_row(iter) ) //If it's the last row: { //We will ignore editing of bool values in the blank row. It seems like a bad way to start a new record. //New item in the blank row: /* Glib::ustring strValue = get_value(row); if(!strValue.empty()) { bool bPreventUserSignals = get_prevent_user_signals(); set_prevent_user_signals(true); //Stops extra signal_user_changed. add_item(); //Add the next blank for the next user add. set_prevent_user_signals(bPreventUserSignals); */ bIsAdd = true; //Signal that a new key was added. //} } } if(!bIsAdd) bIsChange = true; } //Fire appropriate signal: if(bIsAdd) { //Change it back, so that we ignore it: row.set_value(model_column_index, value_old); //Signal that a new key was added: //We will ignore editing of bool values in the blank row. It seems like a bad way to start a new record. //m_signal_user_added.emit(row); } else if(bIsChange) { //Existing item changed: m_signal_user_changed.emit(row, model_column_index); } } } void AddDel::on_treeview_cell_edited(const Glib::ustring& path_string, const Glib::ustring& new_text, int model_column_index) { if(path_string.empty()) return; Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_refListStore->get_iter(path); if(iter != get_model()->children().end()) { Gtk::TreeModel::Row row = *iter; Glib::ustring strTextOld; row.get_value(model_column_index, strTextOld); //Store the user's new text in the model: row.set_value(model_column_index, new_text); if(strTextOld == new_text) return; //This is not actually an edit. //Is it an add or a change?: bool bIsAdd = false; bool bIsChange = false; if(get_allow_user_actions()) //If add is possible: { if(get_is_placeholder_row(iter)) { bool bPreventUserSignals = get_prevent_user_signals(); set_prevent_user_signals(true); //Stops extra signal_user_changed. if(row_has_duplicates(iter)) { warn_about_duplicate(); return; } else { //Mark this row as no longer a placeholder, because it has data now. The client code must set an actual key for this in the signal_user_added() or m_signal_user_changed signal handlers. set_value_key(iter, "glom_unknown"); add_item_placeholder(); //Add the next blank for the next user add. } set_prevent_user_signals(bPreventUserSignals); bIsAdd = true; //Signal that a new key was added. } } if(!bIsAdd) bIsChange = true; //Fire appropriate signal: if(bIsAdd) { //Signal that a new key was added" m_signal_user_added.emit(row); } else if(bIsChange) { //Existing item changed: //Check that it has really changed - get the last value. if(new_text != strTextOld) { bool do_signal = true; const Field::glom_field_type field_type = m_ColumnTypes[model_column_index].m_field_type; if(field_type != Field::TYPE_INVALID) //If a field type was specified for this column. { //Make sure that the entered data is suitable for this field type: bool success = false; Glib::ustring text = get_value(row, model_column_index); Gnome::Gda::Value value = Conversions::parse_value(field_type, new_text, success); if(!success) { //Tell the user and offer to revert or try again: bool revert = glom_show_dialog_invalid_data(field_type); if(revert) { //Revert the data: row.set_value(model_column_index, strTextOld); } else { //Reactivate the cell so that the data can be corrected. Glib::RefPtr refTreeSelection = m_TreeView.get_selection(); if(refTreeSelection) { refTreeSelection->select(row); //TODO: This does not seem to work. Gtk::TreeModel::Path path = m_refListStore->get_path(row); Gtk::TreeView::Column* pColumn = m_TreeView.get_column(model_column_index); //TODO: This might the the view column index, not the model column index. m_TreeView.set_cursor(path, *pColumn, true /* start_editing */); //This highlights the cell, but does not seem to actually start the editing. } } do_signal = false; } else { //Actually show the canonical text representation, so that the user sees how his input was interpreted: Glib::ustring text_canonical = Conversions::get_text_for_gda_value(field_type, value); row.set_value(model_column_index, text_canonical); } } if(do_signal) m_signal_user_changed.emit(row, model_column_index); } } } } void AddDel::on_treeview_cell_editing_started(Gtk::CellEditable* /* editable */, const Glib::ustring& path_string, int model_column_index) { Gtk::TreeModel::Path path(path_string); if(!m_refListStore) return; Gtk::TreeModel::iterator iterRow = m_refListStore->get_iter(path); if(iterRow) signal_user_activated().emit(iterRow, model_column_index); } AddDel::type_signal_user_added AddDel::signal_user_added() { return m_signal_user_added; } AddDel::type_signal_user_changed AddDel::signal_user_changed() { return m_signal_user_changed; } AddDel::type_signal_user_requested_delete AddDel::signal_user_requested_delete() { return m_signal_user_requested_delete; } AddDel::type_signal_user_requested_edit AddDel::signal_user_requested_edit() { return m_signal_user_requested_edit; } AddDel::type_signal_user_requested_add AddDel::signal_user_requested_add() { return m_signal_user_requested_add; } AddDel::type_signal_user_activated AddDel::signal_user_activated() { return m_signal_user_activated; } AddDel::type_signal_user_reordered_columns AddDel::signal_user_reordered_columns() { return m_signal_user_reordered_columns; } void AddDel::on_treeview_button_press_event(GdkEventButton* event) { on_button_press_event_Popup(event); } bool AddDel::on_treeview_column_drop(Gtk::TreeView* /* treeview */, Gtk::TreeViewColumn* /* column */, Gtk::TreeViewColumn* /* prev_column */, Gtk::TreeViewColumn* /* next_column */) { return true; } guint AddDel::treeview_append_column(const Glib::ustring& title, Gtk::CellRenderer& cellrenderer, const Gtk::TreeModelColumnBase& model_column, const Glib::ustring& column_id) { TreeViewColumnGlom* pViewColumn = Gtk::manage( new TreeViewColumnGlom(title, cellrenderer) ); pViewColumn->set_renderer(cellrenderer, model_column); //render it via the default "text" property. guint cols_count = m_TreeView.append_column(*pViewColumn); //Allow the column to be reordered by dragging and dropping the column header: pViewColumn->set_reorderable(); //Allow the column to be resized: pViewColumn->set_resizable(); //Set a faily sensible default width: pViewColumn->set_fixed_width(100); //This is the only way to set the width, so we need to set it as resizable again immediately afterwards. pViewColumn->set_resizable(); //Save the extra ID, using the title if the column_id is empty: pViewColumn->set_column_id( (column_id.empty() ? title : column_id) ); return cols_count; } void AddDel::on_treeview_columns_changed() { if(!get_ignore_treeview_signals()) { //Get the new column order, and save it in m_vecColumnIDs: m_vecColumnIDs.clear(); typedef std::vector type_vecViewColumns; type_vecViewColumns vecViewColumns = m_TreeView.get_columns(); for(type_vecViewColumns::iterator iter = vecViewColumns.begin(); iter != vecViewColumns.end(); ++iter) { TreeViewColumnGlom* pViewColumn = dynamic_cast(*iter); if(pViewColumn) { const Glib::ustring column_id = pViewColumn->get_column_id(); m_vecColumnIDs.push_back(column_id); } } //Tell other code that something has changed, so the new column order can be serialized. m_signal_user_reordered_columns.emit(); } } AddDel::type_vec_strings AddDel::get_columns_order() const { //This list is rebuilt in on_treeview_columns_changed, but maybe we could just build it here. return m_vecColumnIDs; } void AddDel::set_auto_add(bool value) { m_auto_add = value; } Glib::RefPtr AddDel::get_model() { return m_refListStore; } Glib::RefPtr AddDel::get_model() const { return m_refListStore; } bool AddDel::get_is_first_row(const Gtk::TreeModel::iterator& iter) const { return iter == get_model()->children().begin(); } bool AddDel::get_is_last_row(const Gtk::TreeModel::iterator& iter) const { return iter == get_last_row(); } Gtk::TreeModel::iterator AddDel::get_next_available_row_with_add_if_necessary() { Gtk::TreeModel::iterator result; if(!m_refListStore) return result; bool bPreventUserSignals = get_prevent_user_signals(); set_prevent_user_signals(true); if(get_allow_user_actions()) //The extra blank line is only used if the user may add items: { Gtk::TreeModel::iterator iter = get_last_row(); if(iter != get_model()->children().end()) { //Look at the last row: if( get_is_placeholder_row(iter)) { result = iter; } else { // The last line isn't blank, so we cannot use it. Add another one. result = m_refListStore->append(); } } else { // This is the first line. result = m_refListStore->append(); } } else { result = m_refListStore->append(); //Add a new blank line. There are no blank lines. } set_prevent_user_signals(bPreventUserSignals); return result; } Gtk::TreeModel::iterator AddDel::get_last_row() const { //TODO_performance: Hopefully there is a better way to do this. Gtk::TreeModel::iterator iter = get_model()->children().begin(); guint size = get_model()->children().size(); if(size > 1) { for(guint i = 0; i < (size -1); ++i) { ++iter; } } return iter; } Gtk::TreeModel::iterator AddDel::get_last_row() { //TODO_performance: Hopefully there is a better way to do this. Gtk::TreeModel::iterator iter = get_model()->children().begin(); guint size = get_model()->children().size(); if(size > 1) { for(guint i = 0; i < (size -1); ++i) { ++iter; } } return iter; } Glib::ustring AddDel::get_value_key(const Gtk::TreeModel::iterator& iter) { return get_value(iter, m_col_key); } void AddDel::set_value_key(const Gtk::TreeModel::iterator& iter, const Glib::ustring& strValue) { if(!strValue.empty()) { //This is not a placeholder anymore, if it every was: iter->set_value(m_col_placeholder, false); } iter->set_value(m_col_key, strValue); } bool AddDel::get_is_placeholder_row(const Gtk::TreeModel::iterator& iter) const { if(!iter) return false; if(!get_is_last_row(iter)) return false; if(iter == m_refListStore->children().end()) return false; bool val = false; iter->get_value(m_col_placeholder, val); return val; } bool AddDel::get_model_column_index(guint view_column_index, guint& model_column_index) { //Initialize output parameter: model_column_index = 0; const guint hidden = get_count_hidden_system_columns(); const guint count = m_ColumnTypes.size(); if(hidden > count) return false; //This should never happen. if(view_column_index >= (count - hidden)) return false; model_column_index = view_column_index + hidden; //There are 2 hidden columns at the start. return true; } bool AddDel::get_view_column_index(guint model_column_index, guint& view_column_index) { //Initialize output parameter: view_column_index = 0; if(model_column_index >= m_ColumnTypes.size()) return false; if( !(m_ColumnTypes[model_column_index].m_visible) ) return false; view_column_index = model_column_index - get_count_hidden_system_columns(); //There are 2 hidden columns at the start. return true; } guint AddDel::get_count_hidden_system_columns() { guint hidden_count = 0; if(!(m_ColumnTypes[m_col_key].m_visible)) ++hidden_count; if(!(m_ColumnTypes[m_col_placeholder].m_visible)) ++hidden_count; return hidden_count; } void AddDel::prevent_duplicates(guint column_number) { if(column_number < m_ColumnTypes.size()) m_ColumnTypes[column_number].m_prevent_duplicates = true; } void AddDel::set_prevent_duplicates_warning(const Glib::ustring& warning_text) { m_prevent_duplicates_warning = warning_text; } bool AddDel::row_has_duplicates(const Gtk::TreeModel::iterator& iter) const { const type_ColumnTypes::size_type cols_count = m_ColumnTypes.size(); for(type_ColumnTypes::size_type col = 0; col < cols_count; ++col) { if(m_ColumnTypes[col].m_prevent_duplicates) { Gtk::TreeModel::Row row = *iter; //We can't just use Value, because Gnome::Gda::Value has no operator==, because there is no g_value_equal //Gnome::Gda::Value value_this_row; //TODO: Actually, Gnome::Gda::Value has an operator== //iter->get_value(col, value_this_row); Glib::ustring value_text; bool value_bool = false; int value_int = 0; if(m_ColumnTypes[col].m_style == AddDelColumnInfo::STYLE_Text) row.get_value(col, value_text); else if(m_ColumnTypes[col].m_style == AddDelColumnInfo::STYLE_Boolean) row.get_value(col, value_bool); else if(m_ColumnTypes[col].m_style == AddDelColumnInfo::STYLE_Numerical) row.get_value(col, value_int); //std::cout << "value_text=" << value_text << std::endl; //Look at each other row to see whether the value exists there already: for(Gtk::TreeModel::iterator iterCheck = m_refListStore->children().begin(); iterCheck != m_refListStore->children().end(); ++iterCheck) { if(iterCheck != iter) //Don't compare the row with itself { Gtk::TreeModel::Row check_row = *iterCheck; ////Gnome::Gda::Value has no operator==, because there is no g_value_equal //Gnome::Gda::Value value_check_row; //TODO: Actually, Gnome::Gda::Value has an operator== //iterCheck->get_value(col, value_check_row); // //if(value_check_row == value_this_row) // return false; //Duplicate found. Glib::ustring check_value_text; bool check_value_bool = false; int check_value_int = 0; if(m_ColumnTypes[col].m_style == AddDelColumnInfo::STYLE_Text) { check_row.get_value(col, check_value_text); //std::cout << " check_value_text=" << value_text << std::endl; if(check_value_text == value_text) return true; } else if(m_ColumnTypes[col].m_style == AddDelColumnInfo::STYLE_Boolean) { check_row.get_value(col, check_value_bool); if(check_value_text == value_text) return true; } else if(m_ColumnTypes[col].m_style == AddDelColumnInfo::STYLE_Numerical) { check_row.get_value(col, check_value_int); if(check_value_text == value_text) return true; } } } } } return false; } } //namespace Glom glom-1.22.4/glom/utility_widgets/adddel/treeviewcolumn_glom.h0000644000175000017500000000246112234252646025640 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTLITY_WIDGETS_ADDDEL_TREEVIEWCOLUMN_GLOM_H #define GLOM_UTLITY_WIDGETS_ADDDEL_TREEVIEWCOLUMN_GLOM_H #include namespace Glom { class TreeViewColumnGlom : public Gtk::TreeViewColumn { public: TreeViewColumnGlom(const Glib::ustring& title, Gtk::CellRenderer& cell); virtual ~TreeViewColumnGlom(); virtual Glib::ustring get_column_id() const; virtual void set_column_id(const Glib::ustring& value); private: Glib::ustring m_column_id; }; } //namespace Glom #endif //ADDDEL_TREEVIEWCOLUMN_GLOM_H glom-1.22.4/glom/utility_widgets/adddel/adddel_withbuttons.cc0000644000175000017500000000766312234776363025617 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "adddel_withbuttons.h" #include #include //#include namespace Glom { AddDel_WithButtons::AddDel_WithButtons() : m_ButtonBox(Gtk::ORIENTATION_HORIZONTAL), m_Button_Add(Gtk::Stock::ADD), m_Button_Del(Gtk::Stock::DELETE), m_Button_Edit(Gtk::Stock::OPEN) { init(); } AddDel_WithButtons::AddDel_WithButtons(BaseObjectType* cobject, const Glib::RefPtr& builder) : AddDel(cobject, builder), m_ButtonBox(Gtk::ORIENTATION_HORIZONTAL), m_Button_Add(Gtk::Stock::ADD), m_Button_Del(Gtk::Stock::DELETE), m_Button_Edit(Gtk::Stock::OPEN) { init(); } void AddDel_WithButtons::init() { m_ButtonBox.set_layout(Gtk::BUTTONBOX_END); m_ButtonBox.set_spacing(Utils::DEFAULT_SPACING_SMALL); //m_Button_Add.set_border_width(Utils::DEFAULT_SPACING_SMALL); //m_Button_Del.set_border_width(Utils::DEFAULT_SPACING_SMALL); //m_Button_Edit.set_border_width(Utils::DEFAULT_SPACING_SMALL); setup_buttons(); pack_start(m_ButtonBox, Gtk::PACK_SHRINK); //Link buttons to handlers: m_Button_Add.signal_clicked().connect(sigc::mem_fun(*this, &AddDel_WithButtons::on_button_add)); m_Button_Del.signal_clicked().connect(sigc::mem_fun(*this, &AddDel_WithButtons::on_button_del)); m_Button_Edit.signal_clicked().connect(sigc::mem_fun(*this, &AddDel_WithButtons::on_button_edit)); } AddDel_WithButtons::~AddDel_WithButtons() { } void AddDel_WithButtons::on_button_add() { if(m_auto_add) { Gtk::TreeModel::iterator iter = get_item_placeholder(); if(iter) { guint first_visible = get_count_hidden_system_columns(); select_item(iter, first_visible, true /* start_editing */); } } else { signal_user_requested_add().emit(); //Let the client code add the row explicitly, if it wants. } } void AddDel_WithButtons::on_button_del() { on_MenuPopup_activate_Delete(); } void AddDel_WithButtons::on_button_edit() { on_MenuPopup_activate_Edit(); } void AddDel_WithButtons::set_allow_add(bool val) { AddDel::set_allow_add(val); m_Button_Add.set_sensitive(val); } void AddDel_WithButtons::set_allow_delete(bool val) { AddDel::set_allow_delete(val); m_Button_Del.set_sensitive(val); } void AddDel_WithButtons::set_allow_user_actions(bool bVal) { AddDel::set_allow_user_actions(bVal); //add or remove buttons: if(bVal) { set_allow_user_actions(false); //Remove them first (Don't want to add them twice). //Ensure that the buttons are in the ButtonBox. setup_buttons(); } else { //We don't just remove m_ButtonBox, because we want it to remain as a placeholder. m_ButtonBox.remove(m_Button_Add); m_ButtonBox.remove(m_Button_Del); m_ButtonBox.remove(m_Button_Edit); } //Recreate popup menu with correct items: setup_menu(); } void AddDel_WithButtons::setup_buttons() { //Put buttons below sheet: //m_ButtonBox.remove(m_Button_Add); //m_ButtonBox.remove(m_Button_Del); //m_ButtonBox.remove(m_Button_Edit); if(get_allow_user_actions()) { m_ButtonBox.pack_end(m_Button_Add, Gtk::PACK_SHRINK); m_ButtonBox.pack_end(m_Button_Del, Gtk::PACK_SHRINK); m_ButtonBox.pack_end(m_Button_Edit, Gtk::PACK_SHRINK); } } } //namespace Glom glom-1.22.4/glom/utility_widgets/placeholder.cc0000644000175000017500000000264512234252646022761 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "placeholder.h" namespace Glom { PlaceHolder::PlaceHolder() : Gtk::Box(Gtk::ORIENTATION_VERTICAL), m_pChild(0) { } PlaceHolder::PlaceHolder(BaseObjectType* cobject, const Glib::RefPtr& /*builder*/) : Gtk::Box(cobject), m_pChild(0) { } PlaceHolder::~PlaceHolder() { } void PlaceHolder::add(Gtk::Widget& child) { remove(); pack_start(child); m_pChild = &child; } void PlaceHolder::remove() { if(m_pChild) { Gtk::Box::remove(*m_pChild); m_pChild = 0; } } Gtk::Widget *PlaceHolder::get_child() { return m_pChild; } const Gtk::Widget* PlaceHolder::get_child() const { return m_pChild; } } //namespace Glom glom-1.22.4/glom/utility_widgets/layoutwidgetmenu.cc0000644000175000017500000001500512234776363024106 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "layoutwidgetfield.h" #include #include #include "../mode_data/flowtablewithfields.h" #include namespace Glom { LayoutWidgetMenu::LayoutWidgetMenu() #ifndef GLOM_ENABLE_CLIENT_ONLY : m_pMenuPopup(0) #endif { #ifndef GLOM_ENABLE_CLIENT_ONLY m_refActionGroup = Gtk::ActionGroup::create(); m_refActionGroup->add(Gtk::Action::create("ContextMenu", "Context Menu") ); m_refContextLayout = Gtk::Action::create("ContextLayout", _("Choose Field")); m_refContextLayoutProperties = Gtk::Action::create("ContextLayoutProperties", _("Field Layout Properties")); m_refContextAddField = Gtk::Action::create("ContextAddField", _("Add Field")); m_refContextAddRelatedRecords = Gtk::Action::create("ContextAddRelatedRecords", _("Add Related Records")); m_refContextAddNotebook = Gtk::Action::create("ContextAddNotebook", _("Add Notebook")); m_refContextAddGroup = Gtk::Action::create("ContextAddGroup", _("Add Group")); m_refContextAddButton = Gtk::Action::create("ContextAddButton", _("Add Button")); m_refContextAddText = Gtk::Action::create("ContextAddText", _("Add Text")); m_refContextDelete = Gtk::Action::create("ContextDelete", _("Delete")); #endif // !GLOM_ENABLE_CLIENT_ONLY } LayoutWidgetMenu::~LayoutWidgetMenu() { } #ifndef GLOM_ENABLE_CLIENT_ONLY void LayoutWidgetMenu::setup_menu() { m_refActionGroup->add(m_refContextLayout, sigc::mem_fun(*this, &LayoutWidgetMenu::on_menupopup_activate_layout) ); m_refActionGroup->add(m_refContextLayoutProperties, sigc::mem_fun(*this, &LayoutWidgetMenu::on_menupopup_activate_layout_properties) ); m_refActionGroup->add(m_refContextAddField, sigc::bind( sigc::mem_fun(*this, &LayoutWidgetMenu::on_menupopup_add_item), TYPE_FIELD ) ); m_refActionGroup->add(m_refContextAddRelatedRecords, sigc::bind( sigc::mem_fun(*this, &LayoutWidgetMenu::on_menupopup_add_item), TYPE_PORTAL ) ); m_refActionGroup->add(m_refContextAddGroup, sigc::bind( sigc::mem_fun(*this, &LayoutWidgetMenu::on_menupopup_add_item), TYPE_GROUP ) ); m_refActionGroup->add(m_refContextAddNotebook, sigc::bind( sigc::mem_fun(*this, &LayoutWidgetMenu::on_menupopup_add_item), TYPE_NOTEBOOK ) ); m_refActionGroup->add(m_refContextAddButton, sigc::bind( sigc::mem_fun(*this, &LayoutWidgetMenu::on_menupopup_add_item), TYPE_BUTTON ) ); m_refActionGroup->add(m_refContextAddText, sigc::bind( sigc::mem_fun(*this, &LayoutWidgetMenu::on_menupopup_add_item), TYPE_TEXT ) ); m_refActionGroup->add(m_refContextDelete, sigc::mem_fun(*this, &LayoutWidgetMenu::on_menupopup_activate_delete) ); //TODO: This does not work until this widget is in a container in the window:s AppWindow* pApp = get_appwindow(); if(pApp) { pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->add_developer_action(m_refContextLayoutProperties); //So that it can be disabled when not in developer mode. pApp->add_developer_action(m_refContextAddField); pApp->add_developer_action(m_refContextAddRelatedRecords); pApp->add_developer_action(m_refContextAddNotebook); pApp->add_developer_action(m_refContextAddGroup); pApp->add_developer_action(m_refContextAddButton); pApp->add_developer_action(m_refContextAddText); pApp->update_userlevel_ui(); //Update our action's sensitivity. } m_refUIManager = Gtk::UIManager::create(); m_refUIManager->insert_action_group(m_refActionGroup); //TODO: add_accel_group(m_refUIManager->get_accel_group()); try { Glib::ustring ui_info = "" " " " " " " " " " " " " " " " " " " " " " " " " ""; m_refUIManager->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_pMenuPopup = dynamic_cast( m_refUIManager->get_widget("/ContextMenu") ); if(!m_pMenuPopup) g_warning("menu not found"); if(pApp) m_refContextLayout->set_sensitive(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER); } void LayoutWidgetMenu::on_menupopup_add_item(enumType item) { signal_layout_item_added().emit(item); } void LayoutWidgetMenu::on_menupopup_activate_layout() { //finish_editing(); //Ask the parent widget to show the layout dialog: signal_user_requested_layout().emit(); } void LayoutWidgetMenu::on_menupopup_activate_layout_properties() { //finish_editing(); //Ask the parent widget to show the layout dialog: signal_user_requested_layout_properties().emit(); } void LayoutWidgetMenu::on_menupopup_activate_delete() { Gtk::Widget* parent = dynamic_cast(this); if(!parent) { // Should never happen! std::cerr << "LayoutWidgetUtils is no Gtk::Widget" << std::endl; return; } LayoutWidgetBase* base = 0; do { parent = parent->get_parent(); base = dynamic_cast(parent); if(base && dynamic_cast(base)) break; } while (parent); if(base) { sharedptr group = sharedptr::cast_dynamic(base->get_layout_item()); if(!group) return; group->remove_item(get_layout_item()); base->signal_layout_changed().emit(); } } #endif // !GLOM_ENABLE_CLIENT_ONLY } //namespace Glom glom-1.22.4/glom/utility_widgets/combo_textglade.cc0000644000175000017500000000277512234252646023643 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "combo_textglade.h" namespace Glom { Combo_TextGlade::Combo_TextGlade(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::ComboBoxText(cobject) { //Check that this was really created from a GtkComboBoxText in the .glade file, //instead of just a GtkComboBox, which would not usually have a model. g_assert(get_model()); //Workaround this GtkComboBoxText bug: https://bugzilla.gnome.org/show_bug.cgi?id=612396 if(get_entry_text_column() < 0) set_entry_text_column(0); } void Combo_TextGlade::set_first_active() { Glib::RefPtr model = get_model(); if(!model) return; Gtk::TreeModel::iterator iter = model->children().begin(); set_active(iter); } } //namespace Glom glom-1.22.4/glom/utility_widgets/notebook_noframe.h0000644000175000017500000000434112234776363023672 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_NOTEBOOK_NOFRAME_H #define GLOM_UTILITY_WIDGETS_NOTEBOOK_NOFRAME_H #include #include #include namespace Glom { class AppWindow; class NotebookLabel; class NotebookNoFrame : public Gtk::Box { public: explicit NotebookNoFrame(); virtual ~NotebookNoFrame(); int append_page(Gtk::Widget& child, Gtk::Widget& tab_label); /* int append_page(Widget& child); */ int append_page(Widget& child, const Glib::ustring& tab_label, bool use_mnemonic = false); Widget* get_nth_page(int page_num); const Widget* get_nth_page(int page_num) const; int get_current_page() const; void set_current_page(int page_num); void set_action_widget(Gtk::Widget* widget, Gtk::PackType pack_type); typedef sigc::signal type_signal_switch_page; type_signal_switch_page signal_switch_page(); protected: void on_tab_toggled(int index); Gtk::Box m_box_tabs; Gtk::Box m_box_pages; Gtk::Box m_box_action_left, m_box_action_right; type_signal_switch_page m_signal_switch_page; //Caching the widget pointers is nicer than repeatedly calling Gtk::Container::get_children(). typedef std::vector type_vec_togglebuttons; type_vec_togglebuttons m_vec_tab_widgets; typedef std::vector type_vec_widgets; type_vec_widgets m_vec_page_widgets; int m_current_page; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_NOTEBOOK_NOFRAME_H glom-1.22.4/glom/utility_widgets/imageglom.cc0000644000175000017500000006614112234776363022450 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2011 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "imageglom.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef G_OS_WIN32 #include #endif #include // for cout, endl namespace Glom { ImageGlom::type_vec_ustrings ImageGlom::m_evince_supported_mime_types; ImageGlom::type_vec_ustrings ImageGlom::m_gdkpixbuf_supported_mime_types; ImageGlom::ImageGlom() : m_ev_view(0), m_ev_document_model(0), m_pMenuPopup_UserMode(0) { init(); } ImageGlom::ImageGlom(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::EventBox(cobject), m_ev_view(0), m_ev_document_model(0), m_pMenuPopup_UserMode(0) { init(); } void ImageGlom::init() { m_ev_view = EV_VIEW(ev_view_new()); //gtk_widget_add_events(GTK_WIDGET(m_ev_view), GDK_BUTTON_PRESS_MASK); //Connect the the EvView's button-press-event signal, //because we don't get it otherwise. //For some reason this is not necessary with the GtkImage. Gtk::Widget* cppEvView = Glib::wrap(GTK_WIDGET(m_ev_view)); cppEvView->signal_button_press_event().connect( sigc::mem_fun(*this, &ImageGlom::on_button_press_event), false); m_read_only = false; #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // !GLOM_ENABLE_CLIENT_ONLY setup_menu_usermode(); //m_image.set_size_request(150, 150); m_frame.set_shadow_type(Gtk::SHADOW_ETCHED_IN); //Without this, the image widget has no borders and is completely invisible when empty. m_frame.show(); add(m_frame); } ImageGlom::~ImageGlom() { } void ImageGlom::set_layout_item(const sharedptr& layout_item, const Glib::ustring& table_name) { LayoutWidgetField::set_layout_item(layout_item, table_name); #ifdef GTKMM_ATKMM_ENABLED get_accessible()->set_name(layout_item->get_name()); #endif } bool ImageGlom::on_button_press_event(GdkEventButton *event) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); //Enable/Disable items. //We did this earlier, but get_appwindow is more likely to work now: AppWindow* pApp = get_appwindow(); if(pApp) { #ifndef GLOM_ENABLE_CLIENT_ONLY pApp->add_developer_action(m_refContextLayout); //So that it can be disabled when not in developer mode. pApp->add_developer_action(m_refContextAddField); pApp->add_developer_action(m_refContextAddRelatedRecords); pApp->add_developer_action(m_refContextAddGroup); pApp->update_userlevel_ui(); //Update our action's sensitivity. #endif // !GLOM_ENABLE_CLIENT_ONLY //Only show this popup in developer mode, so operators still see the default GtkEntry context menu. //TODO: It would be better to add it somehow to the standard context menu. #ifndef GLOM_ENABLE_CLIENT_ONLY if(pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup->popup(event->button, event->time); return true; //We handled this event. } } else #endif // !GLOM_ENABLE_CLIENT_ONLY { // We cannot be in developer mode in client only mode. if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pMenuPopup_UserMode->popup(event->button, event->time); return true; //We handled this event. } } //Single-click to select file: if(mods & GDK_BUTTON1_MASK) { on_menupopup_activate_select_file(); return true; //We handled this event. } } return Gtk::EventBox::on_button_press_event(event); } AppWindow* ImageGlom::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } bool ImageGlom::get_has_original_data() const { return true; //TODO. } /* void ImageGlom::set_pixbuf(const Glib::RefPtr& pixbuf) { m_pixbuf_original = pixbuf; show_image_data(); } */ void ImageGlom::set_value(const Gnome::Gda::Value& value) { // Remember original data m_original_data = Gnome::Gda::Value(); m_original_data = value; show_image_data(); } Gnome::Gda::Value ImageGlom::get_value() const { return m_original_data; } void ImageGlom::on_size_allocate(Gtk::Allocation& allocation) { Gtk::EventBox::on_size_allocate(allocation); //Resize the GtkImage if necessary: if(m_pixbuf_original) { const Glib::RefPtr pixbuf_scaled = get_scaled_image(); m_image.set(pixbuf_scaled); } } static void image_glom_ev_job_finished(EvJob* job, void* user_data) { g_assert(job); ImageGlom* self = (ImageGlom*)user_data; g_assert(self); self->on_ev_job_finished(job); } void ImageGlom::on_ev_job_finished(EvJob* job) { if (ev_job_is_failed (job)) { g_warning ("%s", job->error->message); g_object_unref (job); return; } ev_document_model_set_document(m_ev_document_model, job->document); ev_document_model_set_page(m_ev_document_model, 1); g_object_unref (job); ev_view_set_loading(m_ev_view, FALSE); } const GdaBinary* ImageGlom::get_binary() const { const GdaBinary* gda_binary = 0; if(m_original_data.get_value_type() == GDA_TYPE_BINARY) gda_binary = gda_value_get_binary(m_original_data.gobj()); else if(m_original_data.get_value_type() == GDA_TYPE_BLOB) { const GdaBlob* gda_blob = gda_value_get_blob(m_original_data.gobj()); if(gda_blob && gda_blob_op_read_all(const_cast(gda_blob->op), const_cast(gda_blob))) gda_binary = &(gda_blob->data); } return gda_binary; } Glib::ustring ImageGlom::get_mime_type() const { const GdaBinary* gda_binary = get_binary(); if(!gda_binary) return Glib::ustring(); if(!gda_binary->data) return Glib::ustring(); bool uncertain = false; const Glib::ustring result = Gio::content_type_guess(std::string(), gda_binary->data, gda_binary->binary_length, uncertain); //std::cout << G_STRFUNC << ": mime_type=" << result << ", uncertain=" << uncertain << std::endl; return result; } void ImageGlom::fill_evince_supported_mime_types() { //Fill the static list if it has not already been filled: if(!m_evince_supported_mime_types.empty()) return; //Discover what mime types libevview can support. //Older versions supported image types too, via GdkPixbuf, //but that support was then removed. GList* types_list = ev_backends_manager_get_all_types_info(); if(!types_list) { return; } for(GList* l = types_list; l; l = g_list_next(l)) { EvTypeInfo *info = (EvTypeInfo *)l->data; if(!info) continue; const char* mime_type = 0; int i = 0; while((mime_type = info->mime_types[i++])) { if(mime_type) m_evince_supported_mime_types.push_back(mime_type); //std::cout << "evince supported mime_type=" << mime_type << std::endl; } } } void ImageGlom::fill_gdkpixbuf_supported_mime_types() { //Fill the static list if it has not already been filled: if(!m_gdkpixbuf_supported_mime_types.empty()) return; typedef std::vector type_vec_formats; const type_vec_formats formats = Gdk::Pixbuf::get_formats(); for(type_vec_formats::const_iterator iter = formats.begin(); iter != formats.end(); ++iter) { const Gdk::PixbufFormat& format = *iter; const std::vector mime_types = format.get_mime_types(); m_gdkpixbuf_supported_mime_types.insert( m_gdkpixbuf_supported_mime_types.end(), mime_types.begin(), mime_types.end()); } } void ImageGlom::show_image_data() { bool use_evince = false; const Glib::ustring mime_type = get_mime_type(); //std::cout << "mime_type=" << mime_type << std::endl; fill_evince_supported_mime_types(); const type_vec_ustrings::iterator iterFind = std::find(m_evince_supported_mime_types.begin(), m_evince_supported_mime_types.end(), mime_type); if(iterFind != m_evince_supported_mime_types.end()) { use_evince = true; } m_frame.remove(); //Clear all possible display widgets: m_pixbuf_original.reset(); m_image.set(Glib::RefPtr()); //TODO: Add an unset() to gtkmm. if(m_ev_document_model) { g_object_unref(m_ev_document_model); m_ev_document_model = 0; } if(use_evince) { //Use EvView: m_image.hide(); gtk_widget_show(GTK_WIDGET(m_ev_view)); gtk_container_add(GTK_CONTAINER(m_frame.gobj()), GTK_WIDGET(m_ev_view)); // Try loading from data in memory: // TODO: Uncomment this if this API is added: https://bugzilla.gnome.org/show_bug.cgi?id=654832 /* const GdaBinary* gda_binary = get_binary(); if(!gda_binary || !gda_binary->data || !gda_binary->binary_length) { std::cerr << G_STRFUNC << "Data was null or empty." << std::endl; return; } EvJob *job = ev_job_load_new_with_data( (char*)gda_binary->data, gda_binary->binary_length); */ //TODO: Test failure asynchronously. const Glib::ustring uri = save_to_temp_file(false /* don't show progress */); if(uri.empty()) { std::cerr << G_STRFUNC << "Could not save temp file to show in the EvView." << std::endl; } EvJob *job = ev_job_load_new(uri.c_str()); m_ev_document_model = ev_document_model_new(); ev_view_set_model(m_ev_view, m_ev_document_model); ev_document_model_set_continuous(m_ev_document_model, FALSE); //Show only one page. ev_view_set_loading(m_ev_view, TRUE); g_signal_connect (job, "finished", G_CALLBACK (image_glom_ev_job_finished), this); ev_job_scheduler_push_job (job, EV_JOB_PRIORITY_NONE); } else { //Use GtkImage instead: gtk_widget_hide(GTK_WIDGET(m_ev_view)); m_image.show(); m_frame.add(m_image); Glib::RefPtr icon; bool use_gdkpixbuf = false; fill_gdkpixbuf_supported_mime_types(); const type_vec_ustrings::iterator iterFind = std::find(m_gdkpixbuf_supported_mime_types.begin(), m_gdkpixbuf_supported_mime_types.end(), mime_type); if(iterFind != m_gdkpixbuf_supported_mime_types.end()) { use_gdkpixbuf = true; } if(use_gdkpixbuf) { //Try to use GdkPixbuf's loader: m_pixbuf_original = Utils::get_pixbuf_for_gda_value(m_original_data); } else { //Get an icon for the file type; icon = Gio::content_type_get_icon(mime_type); } if(m_pixbuf_original) { Glib::RefPtr pixbuf_scaled = get_scaled_image(); m_image.set(pixbuf_scaled); } else if(icon) { m_image.set(icon, Gtk::ICON_SIZE_DIALOG); } else { m_image.set(Gtk::Stock::MISSING_IMAGE, Gtk::ICON_SIZE_DIALOG); } } } Glib::RefPtr ImageGlom::get_scaled_image() { Glib::RefPtr pixbuf = m_pixbuf_original; if(!pixbuf) return pixbuf; const Gtk::Allocation allocation = m_image.get_allocation(); const int pixbuf_height = pixbuf->get_height(); const int pixbuf_width = pixbuf->get_width(); const int allocation_height = allocation.get_height(); const int allocation_width = allocation.get_width(); //std::cout << "pixbuf_height=" << pixbuf_height << ", pixbuf_width=" << pixbuf_width << std::endl; //std::cout << "allocation_height=" << allocation.get_height() << ", allocation_width=" << allocation.get_width() << std::endl; if( (pixbuf_height > allocation_height) || (pixbuf_width > allocation_width) ) { if(true) //allocation_height > 10 || allocation_width > 10) { Glib::RefPtr pixbuf_scaled = Utils::image_scale_keeping_ratio(pixbuf, allocation_height, allocation_width); //Don't set a new pixbuf if the dimensions have not changed: Glib::RefPtr pixbuf_in_image; if(m_image.get_storage_type() == Gtk::IMAGE_PIXBUF) //Prevent warning. pixbuf_in_image = m_image.get_pixbuf(); if( !pixbuf_in_image || !pixbuf_scaled || (pixbuf_in_image->get_height() != pixbuf_scaled->get_height()) || (pixbuf_in_image->get_width() != pixbuf_scaled->get_width()) ) { /* std::cout << "get_scale(): returning scaled" << std::endl; if(pixbuf_scaled) { std::cout << "scaled height=" << pixbuf_scaled->get_height() << ", scaled width=" << pixbuf_scaled->get_width() << std::endl; } */ return pixbuf_scaled; } else { //Return the existing one, //instead of a new one with the same contents, //so no unnecessary changes will be triggered. return pixbuf_in_image; } } } //std::cout << "get_scaled(): returning original" << std::endl; return pixbuf; } void ImageGlom::on_menupopup_activate_open_file() { open_with(); } void ImageGlom::on_menupopup_activate_open_file_with() { AppWindow* pApp = get_appwindow(); //Offer the user a choice of suitable applications: const Glib::ustring mime_type = get_mime_type(); if(mime_type.empty()) { std::cerr << G_STRFUNC << ": mime_type is empty." << std::endl; } Gtk::AppChooserDialog dialog(mime_type); if(pApp) dialog.set_transient_for(*pApp); if(dialog.run() != Gtk::RESPONSE_OK) return; Glib::RefPtr app_info = dialog.get_app_info(); if(!app_info) { std::cerr << G_STRFUNC << ": app_info was null." << std::endl; } open_with(app_info); } static void make_file_read_only(const Glib::ustring& uri) { std::string filepath; try { filepath = Glib::filename_from_uri(uri); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << "Exception: " << ex.what() << std::endl; return; } if(filepath.empty()) { std::cerr << G_STRFUNC << ": filepath is empty." << std::endl; } const int result = chmod(filepath.c_str(), S_IRUSR); if(result != 0) { std::cerr << G_STRFUNC << ": chmod() failed." << std::endl; } //Setting the attribute via gio gives us this exception: //"Setting attribute access::can-write not supported" /* Glib::RefPtr file = Gio::File::create_for_uri(uri); Glib::RefPtr file_info; try { file_info = file->query_info(G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": query_info() failed: " << ex.what() << std::endl; return; } if(!file_info) { std::cerr << ": file_info is null" << std::endl; return; } const bool can_write = file_info->get_attribute_boolean(G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); if(!can_write) return; file_info->set_attribute_boolean(G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, false); try { file->set_attributes_from_info(file_info); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": set_attributes_from_info() failed: " << ex.what() << std::endl; } */ } Glib::ustring ImageGlom::save_to_temp_file(bool show_progress) { Glib::ustring uri = Utils::get_temp_file_uri("glom_image"); if(uri.empty()) { std::cerr << ": uri is empty." << std::endl; } bool saved = false; if(show_progress) saved = save_file(uri); else saved = save_file_sync(uri); if(!saved) { uri = Glib::ustring(); std::cerr << G_STRFUNC << ": save_file() failed." << std::endl; } else { //Don't let people easily edit the saved file, //because they would lose data when it is automatically deleted later. //Also they might think that editing it will change it in the database. make_file_read_only(uri); } return uri; } void ImageGlom::open_with(const Glib::RefPtr& app_info) { const Glib::ustring uri = save_to_temp_file(); if(uri.empty()) return; if(app_info) { app_info->launch_uri(uri); //TODO: Get a GdkAppLaunchContext? } else { //TODO: Avoid duplication in xsl_utils.cc, by moving this into a utility function: #ifdef G_OS_WIN32 // gtk_show_uri doesn't seem to work on Win32, at least not for local files // We use Windows API instead. // TODO: Check it again and file a bug if necessary. // TODO: and this might not be necessary with Gio::AppInfo::launch_default_for_uri(). // Previously we used gtk_show_uri(). ShellExecute(0, "open", uri.c_str(), 0, 0, SW_SHOW); #else Gio::AppInfo::launch_default_for_uri(uri); #endif //G_OS_WIN32 } } static void set_file_filter_images(Gtk::FileChooser& file_chooser) { //Get image formats only: Glib::RefPtr filter = Gtk::FileFilter::create(); filter->set_name(_("Images")); filter->add_pixbuf_formats(); file_chooser.add_filter(filter); ev_document_factory_add_filters(GTK_WIDGET(file_chooser.gobj()), 0); //Make Images the currently-selected one: file_chooser.set_filter(filter); /* ev_document_factory_add_filters() add this already: filter = Gtk::FileFilter::create(); filter->set_name(_("All Files")); filter->add_pattern("*"); file_chooser.add_filter(filter); */ } void ImageGlom::on_menupopup_activate_save_file() { AppWindow* pApp = get_appwindow(); Gtk::FileChooserDialog dialog(_("Save Image"), Gtk::FILE_CHOOSER_ACTION_SAVE); if(pApp) dialog.set_transient_for(*pApp); set_file_filter_images(dialog); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); const int response = dialog.run(); dialog.hide(); if(response != Gtk::RESPONSE_OK) return; const Glib::ustring uri = dialog.get_uri(); if(uri.empty()) return; save_file(uri); } bool ImageGlom::save_file_sync(const Glib::ustring& uri) { //TODO: We should still do this asynchronously, //even when we don't use the dialog's run() to do that //because we don't want to offer feedback. //Ideally, EvView would just load from data anyway. const GdaBinary* gda_binary = get_binary(); if(!gda_binary) { std::cerr << G_STRFUNC << ": GdaBinary is null" << std::endl; return false; } if(!gda_binary->data) { std::cerr << G_STRFUNC << ": GdaBinary::data is null" << std::endl; return false; } try { const std::string filepath = Glib::filename_from_uri(uri); Glib::file_set_contents(filepath, (const char*)gda_binary->data, gda_binary->binary_length); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << "Exception: " << ex.what() << std::endl; return false; } return true; } bool ImageGlom::save_file(const Glib::ustring& uri) { DialogImageSaveProgress* dialog_save = 0; Utils::get_glade_widget_derived_with_warning(dialog_save); if(!dialog_save) return false; // Automatically delete the dialog when we no longer need it: std::auto_ptr dialog_keeper(dialog_save); AppWindow* pApp = get_appwindow(); if(pApp) dialog_save->set_transient_for(*pApp); const GdaBinary* gda_binary = get_binary(); if(!gda_binary) return false; dialog_save->set_image_data(*gda_binary); dialog_save->save(uri); dialog_save->run(); return true; } void ImageGlom::on_menupopup_activate_select_file() { if(m_read_only) return; AppWindow* pApp = get_appwindow(); Gtk::FileChooserDialog dialog(_("Choose Image"), Gtk::FILE_CHOOSER_ACTION_OPEN); if(pApp) dialog.set_transient_for(*pApp); set_file_filter_images(dialog); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Select"), Gtk::RESPONSE_OK); int response = dialog.run(); dialog.hide(); if((response != Gtk::RESPONSE_CANCEL) && (response != Gtk::RESPONSE_DELETE_EVENT)) { const Glib::ustring uri = dialog.get_uri(); if(!uri.empty()) { DialogImageLoadProgress* dialog; Utils::get_glade_widget_derived_with_warning(dialog); if(dialog) { // Automatically delete the dialog when we no longer need it: std::auto_ptr dialog_keeper(dialog); if(pApp) dialog->set_transient_for(*pApp); dialog->load(uri); if(dialog->run() == Gtk::RESPONSE_ACCEPT) { GdaBinary* bin = g_new(GdaBinary, 1); std::auto_ptr image_data = dialog->get_image_data(); bin->data = image_data->data; bin->binary_length = image_data->binary_length; m_original_data = Gnome::Gda::Value(); g_value_unset(m_original_data.gobj()); g_value_init(m_original_data.gobj(), GDA_TYPE_BINARY); gda_value_take_binary(m_original_data.gobj(), bin); show_image_data(); signal_edited().emit(); } } } } } void ImageGlom::on_clipboard_get(Gtk::SelectionData& selection_data, guint /* info */) { //info is meant to indicate the target, but it seems to be always 0, //so we use the selection_data's target instead. const std::string target = selection_data.get_target(); const Glib::ustring mime_type = get_mime_type(); if(mime_type.empty()) { std::cerr << G_STRFUNC << ": mime_type is empty." << std::endl; } if(target == mime_type) { const GdaBinary* gda_binary = get_binary(); if(!gda_binary) return; if(!gda_binary->data) return; selection_data.set(mime_type, 8, gda_binary->data, gda_binary->binary_length); // This set() override uses an 8-bit text format for the data. //selection_data.set_pixbuf(m_pixbuf_clipboard); } else { std::cout << "ExampleWindow::on_clipboard_get(): Unexpected clipboard target format. expected: " << mime_type << std::endl; } } void ImageGlom::on_clipboard_clear() { if(m_read_only) return; m_pixbuf_clipboard.reset(); } void ImageGlom::on_menupopup_activate_copy() { if(m_pixbuf_original) { //When copy is used, store it here until it is pasted. m_pixbuf_clipboard = m_pixbuf_original->copy(); //TODO: Get it from the DB, when we stop storing the original here instead of just the preview. } else m_pixbuf_clipboard.reset(); Glib::RefPtr refClipboard = Gtk::Clipboard::get(); //Targets: const Glib::ustring mime_type = get_mime_type(); if(mime_type.empty()) { std::cerr << G_STRFUNC << ": mime_type is empty." << std::endl; } std::vector listTargets; listTargets.push_back( Gtk::TargetEntry(mime_type) ); refClipboard->set( listTargets, sigc::mem_fun(*this, &ImageGlom::on_clipboard_get), sigc::mem_fun(*this, &ImageGlom::on_clipboard_clear) ); } void ImageGlom::on_clipboard_received_image(const Glib::RefPtr& pixbuf) { if(m_read_only) return; if(pixbuf) { // Clear original data of previous image m_original_data = Gnome::Gda::Value(); m_pixbuf_original = pixbuf; show_image_data(); signal_edited().emit(); } } void ImageGlom::on_menupopup_activate_paste() { if(m_read_only) return; //Tell the clipboard to call our method when it is ready: Glib::RefPtr refClipboard = Gtk::Clipboard::get(); if(refClipboard) refClipboard->request_image( sigc::mem_fun(*this, &ImageGlom::on_clipboard_received_image) ); } void ImageGlom::on_menupopup_activate_clear() { if(m_read_only) return; m_original_data = Gnome::Gda::Value(); show_image_data(); signal_edited().emit(); } void ImageGlom::setup_menu_usermode() { m_refActionGroup_UserModePopup = Gtk::ActionGroup::create(); m_refActionGroup_UserModePopup->add(Gtk::Action::create("ContextMenu_UserMode", "Context Menu") ); m_refActionOpenFile = Gtk::Action::create("ContextOpenFile", Gtk::Stock::OPEN); m_refActionOpenFileWith = Gtk::Action::create("ContextOpenFileWith", Gtk::Stock::OPEN, _("Open With")); m_refActionSaveFile = Gtk::Action::create("ContextSaveFile", Gtk::Stock::SAVE); m_refActionSelectFile = Gtk::Action::create("ContextSelectFile", Gtk::Stock::EDIT, _("Choose File")); m_refActionCopy = Gtk::Action::create("ContextCopy", Gtk::Stock::COPY); m_refActionPaste = Gtk::Action::create("ContextPaste", Gtk::Stock::PASTE); m_refActionClear = Gtk::Action::create("ContextClear", Gtk::Stock::CLEAR); m_refActionGroup_UserModePopup->add(m_refActionOpenFile, sigc::mem_fun(*this, &ImageGlom::on_menupopup_activate_open_file) ); m_refActionGroup_UserModePopup->add(m_refActionOpenFileWith, sigc::mem_fun(*this, &ImageGlom::on_menupopup_activate_open_file_with) ); m_refActionGroup_UserModePopup->add(m_refActionSaveFile, sigc::mem_fun(*this, &ImageGlom::on_menupopup_activate_save_file) ); m_refActionGroup_UserModePopup->add(m_refActionSelectFile, sigc::mem_fun(*this, &ImageGlom::on_menupopup_activate_select_file) ); m_refActionGroup_UserModePopup->add(m_refActionCopy, sigc::mem_fun(*this, &ImageGlom::on_menupopup_activate_copy) ); m_refActionGroup_UserModePopup->add(m_refActionPaste, sigc::mem_fun(*this, &ImageGlom::on_menupopup_activate_paste) ); m_refActionGroup_UserModePopup->add(m_refActionClear, sigc::mem_fun(*this, &ImageGlom::on_menupopup_activate_clear) ); m_refUIManager_UserModePopup = Gtk::UIManager::create(); m_refUIManager_UserModePopup->insert_action_group(m_refActionGroup_UserModePopup); //TODO: add_accel_group(m_refUIManager_UserModePopup->get_accel_group()); try { Glib::ustring ui_info = "" " " " " " " " " " " " " " " " " " " ""; m_refUIManager_UserModePopup->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_pMenuPopup_UserMode = dynamic_cast( m_refUIManager_UserModePopup->get_widget("/ContextMenu_UserMode") ); if(!m_pMenuPopup_UserMode) g_warning("menu not found"); } void ImageGlom::do_choose_image() { on_menupopup_activate_select_file(); } void ImageGlom::set_read_only(bool read_only) { m_read_only = read_only; } } //namespace Glom glom-1.22.4/glom/utility_widgets/flowtable.cc0000644000175000017500000002226712234776363022467 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "flowtable.h" #include "layoutwidgetbase.h" #include #include #include #include namespace Glom { FlowTable::FlowTable() : m_design_mode(false) { //Default to disabling drag and drop: set_drag_enabled(EGG_DRAG_DISABLED); set_drop_enabled(false); } FlowTable::~FlowTable() { while(!m_list_hboxes.empty()) { type_list_hboxes::iterator iter = m_list_hboxes.begin(); Gtk::Box* hbox = *iter; delete_and_forget_hbox(hbox); } } const Gtk::Box* FlowTable::get_parent_hbox(const Gtk::Widget* first) const { const type_const_list_widgets::const_iterator iter_find = std::find(m_list_first_widgets.begin(), m_list_first_widgets.end(), first); if(iter_find == m_list_first_widgets.end()) { std::cerr << G_STRFUNC << ": first was not a first widget. first=" << first << std::endl; return 0; //It has no Box parent because it is not even a first widget. } for(type_list_hboxes::const_iterator iter = m_list_hboxes.begin(); iter != m_list_hboxes.end(); ++iter) { const Gtk::Box* hbox = *iter; if(!hbox) continue; //Check if it has the widget as one of its children: typedef std::vector type_children; const type_children box_children = hbox->get_children(); if(box_children.empty()) continue; const type_children::const_iterator iter_find = std::find(box_children.begin(), box_children.end(), first); if(iter_find != box_children.end()) return hbox; } return 0; } void FlowTable::delete_and_forget_hbox(Gtk::Box* hbox) { //Remove its children because the API hides the fact that they are inside the Box. //Otherwise they could even be deleted by the Box. typedef std::vector type_children; type_children children = hbox->get_children(); while(!children.empty()) { Gtk::Widget* widget = children[0]; hbox->remove(*widget); children = hbox->get_children(); } //This check does not work because EggSpreadTableDnD adds an intermediate GtkEventBox: //if(hbox->get_parent() == this) //Check that it is in our list of hboxes: const type_list_hboxes::iterator iter = std::find( m_list_hboxes.begin(), m_list_hboxes.end(), hbox); if(iter == m_list_hboxes.end()) { std::cerr << G_STRFUNC << ": hbox=" << hbox << " is not in our list of hboxes." << std::endl; return; } //Check that it has a parent, //as a sanity check: Gtk::Widget* parent= hbox->get_parent(); if(parent) { Egg::SpreadTableDnd::remove_child(*hbox); } else { std::cerr << G_STRFUNC << ": hbox=" << hbox << " has no parent. Not removing from SpreadTableDnd" << std::endl; } //Delete and forget it: delete hbox; //TODO: This causes a warning during gtk_container_remove(), though we have already removed it: sys:1: Warning: g_object_ref: assertion `object->ref_count > 0' failed m_list_hboxes.erase(iter); } void FlowTable::set_design_mode(bool value) { m_design_mode = value; queue_draw(); //because this changes how the widget would be drawn. } void FlowTable::add_widgets(Gtk::Widget& first, Gtk::Widget& second, bool expand_second) { insert(&first, &second, -1, expand_second); } void FlowTable::add_widgets(Gtk::Widget& first, bool expand) { insert(&first, 0 /* second */, -1, expand); } void FlowTable::insert(Gtk::Widget* first, Gtk::Widget* second, int index, bool expand) { if(first && second) { Gtk::Box* hbox = new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, get_horizontal_spacing()); m_list_hboxes.push_back(hbox); //So we can delete it whenever necessary. hbox->pack_start(*first, Gtk::PACK_SHRINK); hbox->pack_start(*second, expand ? Gtk::PACK_EXPAND_WIDGET : Gtk::PACK_SHRINK); hbox->show(); hbox->set_halign(Gtk::ALIGN_FILL); Egg::SpreadTableDnd::insert_child(*hbox, index); //std::cout << "DEBUG: inserted hbox=" << hbox << " for first=" << first << std::endl; m_list_first_widgets.push_back(first); } else if(first) { first->set_halign(expand ? Gtk::ALIGN_FILL : Gtk::ALIGN_START); Egg::SpreadTableDnd::append_child(*first); //std::cout << "DEBUG: inserted first=" << first << std::endl; m_list_first_widgets.push_back(first); } else { std::cerr << G_STRFUNC << ": first was null" << std::endl; } } void FlowTable::remove_all() { for(type_const_list_widgets::const_iterator iter = m_list_first_widgets.begin(); iter != m_list_first_widgets.end(); ++iter) { Gtk::Widget* first_widget = const_cast(*iter); if(first_widget) remove(*first_widget); } m_list_first_widgets.clear(); //We can't use get_children() because EggSpreadTableDnd does not allow that, //because it handles children differently via its specific API. /* typedef std::vector type_children; const type_children children = get_children(); for(type_children::iterator iter = children.begin(); iter != children.end(); ++iter) { Gtk::Widget* widget = *iter; remove(*widget); } */ } void FlowTable::remove(Gtk::Widget& first) { //std::cout << G_STRFUNC << ": debug: remove() first=" << &first << std::endl; //Handle widgets that were added to an Box: Gtk::Box* parent = const_cast(get_parent_hbox(&first)); if(parent) { //std::cout << " debug: hbox=" << parent << std::endl; delete_and_forget_hbox(parent); return; } Egg::SpreadTableDnd::remove_child(first); } FlowTable::type_const_list_widgets FlowTable::get_first_child_widgets() const { return m_list_first_widgets; } bool FlowTable::get_column_for_first_widget(const Gtk::Widget& first, guint& column) const { //Initialize output parameter: column = 0; if(get_lines() == 0) return false; //Discover actual child widget that was added to the EggSpreadTable, //so we can use it again to call EggSpreadTable::get_child_line(): const Gtk::Widget* child = 0; //Check that it is really a child widget: const type_const_list_widgets::const_iterator iter_find = std::find(m_list_first_widgets.begin(), m_list_first_widgets.end(), &first); if(iter_find == m_list_first_widgets.end()) return false; //It is not a first widget. child = &first; //Check if it was added to an Box: const Gtk::Box* hbox = get_parent_hbox(child); if(hbox) child = hbox; if(!child) return false; int width_min = 0; int width_natural = 0; child->get_preferred_width(width_min, width_natural); //std::cout << G_STRFUNC << ": Calling get_child_line() with child=" << child << ", for first=" << &first << std::endl; //Get the internal parent GtkEventBox, if any, //though we need a derived get_child_line() to do this automatically: const Gtk::Widget* parent = child->get_parent(); if(dynamic_cast(parent)) child = parent; column = get_child_line(*child, width_natural); return true; } bool FlowTable::on_draw(const Cairo::RefPtr& cr) { const bool result = Egg::SpreadTableDnd::on_draw(cr); if(!m_design_mode) return result; cr->set_line_width(1); cr->set_line_cap(Cairo::LINE_CAP_SQUARE); cr->set_line_join(Cairo::LINE_JOIN_MITER); std::vector dashes; dashes.push_back(10); cr->set_dash(dashes, 0); //Draw lines based on the allocations of the "first" widgets: //This is a very rough interpretation of the column/item borders, //but it is better than nothing. //TODO: Add API to EggSpreadTable for this? for(type_const_list_widgets::iterator iter = m_list_first_widgets.begin(); iter != m_list_first_widgets.end(); ++iter) { const Gtk::Widget* widget = *iter; //std::cout << G_STRFUNC << ": widget: " << widget << std::endl; if(!widget) continue; const Gtk::Allocation allocation = widget->get_allocation(); const int x = allocation.get_x(); const int y = allocation.get_y(); //std::cout << G_STRFUNC << ": x: " << x << ", y: " << y << std::endl; int real_x = 0; int real_y = 0; Gtk::Widget* unconst = const_cast(widget); unconst->translate_coordinates(*this, x, y, real_x, real_y); //std::cout << G_STRFUNC << ": real_x: " << real_x << ", real_y: " << real_y << std::endl; cr->move_to(real_x, real_y); cr->line_to(real_x + allocation.get_width(), real_y); cr->stroke(); //cr->move_to(real_x, real_y + allocation.get_height()); //cr->line_to(real_x + allocation.get_width(), real_y + allocation.get_height()); //cr->stroke(); } return result; } } //namespace Glom glom-1.22.4/glom/utility_widgets/layoutwidgetbase.h0000644000175000017500000000701512234252646023711 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_LAYOUT_WIDGET_BASE_H #define GLOM_UTILITY_WIDGETS_LAYOUT_WIDGET_BASE_H #include #include #include //Forthe enum. #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY namespace Glom { class AppWindow; class LayoutWidgetBase : virtual public sigc::trackable { public: LayoutWidgetBase(); virtual ~LayoutWidgetBase(); ///Takes ownership. virtual void set_layout_item(const sharedptr& layout_item, const Glib::ustring& table_name); //The caller should call clone(). sharedptr get_layout_item() const; sharedptr get_layout_item(); enum enumType { TYPE_FIELD, TYPE_GROUP, TYPE_NOTEBOOK, TYPE_PORTAL, TYPE_BUTTON, TYPE_TEXT, TYPE_IMAGE }; #ifndef GLOM_ENABLE_CLIENT_ONLY typedef sigc::signal type_signal_layout_changed; /// Signals that the layout has changed, so it should be saved to the document again. type_signal_layout_changed signal_layout_changed(); typedef sigc::signal type_signal_layout_item_added; ///Requests the addition of an item: type_signal_layout_item_added signal_layout_item_added(); //Allow a child widget to delegate to a parent widget: typedef sigc::signal type_signal_user_requested_layout; type_signal_user_requested_layout signal_user_requested_layout(); //Allow a child widget to delegate to a parent widget: typedef sigc::signal type_signal_user_requested_layout_properties; type_signal_user_requested_layout_properties signal_user_requested_layout_properties(); #endif // !GLOM_ENABLE_CLIENT_ONLY virtual void set_read_only(bool read_only = true); #ifndef GLOM_ENABLE_CLIENT_ONLY void set_dnd_in_progress(bool drag = true); bool get_dnd_in_progress(); #endif // !GLOM_ENABLE_CLIENT_ONLY protected: virtual AppWindow* get_appwindow() const; // = 0; static void apply_formatting(Gtk::Widget& widget, const sharedptr& layout_item); protected: //TODO: Add accessor? sharedptr m_pLayoutItem; protected: //TODO: Add accessor? Glib::ustring m_table_name; private: #ifndef GLOM_ENABLE_CLIENT_ONLY /// Signals that the layout has changed, so it should be saved to the document again. type_signal_layout_changed m_signal_layout_changed; /// Requests the addition of an item. type_signal_layout_item_added m_signal_layout_item_added; type_signal_user_requested_layout m_signal_user_requested_layout; type_signal_user_requested_layout_properties m_signal_user_requested_layout_properties; bool m_drag_in_progress; #endif // !GLOM_ENABLE_CLIENT_ONLY }; } //namespace Glom #endif // GLOM_UTILITYWIDGETS_LAYOUT_WIDGET_BASE_H glom-1.22.4/glom/utility_widgets/layoutwidgetmenu.h0000644000175000017500000000406312234776363023752 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_LAYOUT_WIDGET_MENU_H #define GLOM_MODE_DATA_LAYOUT_WIDGET_MENU_H #include "layoutwidgetbase.h" #include namespace Glom { class LayoutWidgetMenu : public LayoutWidgetBase { public: LayoutWidgetMenu(); virtual ~LayoutWidgetMenu(); //Popup-menu: #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void setup_menu(); virtual void on_menupopup_activate_layout(); virtual void on_menupopup_activate_layout_properties(); virtual void on_menupopup_add_item(enumType item); virtual void on_menupopup_activate_delete(); #endif // !GLOM_ENABLE_CLIENT_ONLY protected: #ifndef GLOM_ENABLE_CLIENT_ONLY Gtk::Menu* m_pMenuPopup; //TODO_Performance: //Presumably we waste lots of memory by having this in each layout widget. Maybe we can use one shared menu. Glib::RefPtr m_refActionGroup; Glib::RefPtr m_refUIManager; Glib::RefPtr m_refContextLayout, m_refContextLayoutProperties; Glib::RefPtr m_refContextAddField, m_refContextAddRelatedRecords, m_refContextAddGroup, m_refContextAddNotebook, m_refContextAddButton, m_refContextAddText; Glib::RefPtr m_refContextDelete; #endif // GLOM_ENABLE_CLIENT_ONLY }; } //namespace Glom #endif //GLOM_MODE_DATA_LAYOUT_WIDGET_MENU_H glom-1.22.4/glom/utility_widgets/layoutwidgetfield.cc0000644000175000017500000000233512234252646024220 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "layoutwidgetfield.h" namespace Glom { LayoutWidgetField::LayoutWidgetField() : m_entered_data_stored(false) { } LayoutWidgetField::~LayoutWidgetField() { } LayoutWidgetField::type_signal_edited LayoutWidgetField::signal_edited() { return m_signal_edited; } bool LayoutWidgetField::get_has_original_data() const { //Most widgets always have the original data. //Override this method for widgets that don't. return true; } } //namespace Glom glom-1.22.4/glom/utility_widgets/layoutwidgetbase.cc0000644000175000017500000001321112234776240024043 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "layoutwidgetbase.h" #include #include #include #include #include namespace Glom { LayoutWidgetBase::LayoutWidgetBase() : m_pLayoutItem(0) #ifndef GLOM_ENABLE_CLIENT_ONLY , m_drag_in_progress(false) #endif // !GLOM_ENABLE_CLIENT_ONLY { } LayoutWidgetBase::~LayoutWidgetBase() { } void LayoutWidgetBase::set_layout_item(const sharedptr& layout_item, const Glib::ustring& table_name) { m_pLayoutItem = layout_item; m_table_name = table_name; } sharedptr LayoutWidgetBase::get_layout_item() const { return m_pLayoutItem; } sharedptr LayoutWidgetBase::get_layout_item() { return m_pLayoutItem; } AppWindow* LayoutWidgetBase::get_appwindow() const { return 0; //override to implement. } #ifndef GLOM_ENABLE_CLIENT_ONLY LayoutWidgetBase::type_signal_layout_changed LayoutWidgetBase::signal_layout_changed() { return m_signal_layout_changed; } LayoutWidgetBase::type_signal_layout_item_added LayoutWidgetBase::signal_layout_item_added() { return m_signal_layout_item_added; } LayoutWidgetBase::type_signal_user_requested_layout LayoutWidgetBase::signal_user_requested_layout() { return m_signal_user_requested_layout; } LayoutWidgetBase::type_signal_user_requested_layout_properties LayoutWidgetBase::signal_user_requested_layout_properties() { return m_signal_user_requested_layout_properties; } #endif // !GLOM_ENABLE_CLIENT_ONLY void LayoutWidgetBase::set_read_only(bool /* read_only */) { } void LayoutWidgetBase::apply_formatting(Gtk::Widget& widget, const sharedptr& layout_item) { Gtk::Widget* widget_to_change = &widget; Gtk::Button* button = dynamic_cast(&widget); DataWidgetChildren::Label* labelglom = dynamic_cast(&widget); if(button) widget_to_change = button->get_child(); else { DataWidgetChildren::TextView* textview = dynamic_cast(&widget); if(textview) widget_to_change = textview->get_textview(); else if(labelglom) widget_to_change = labelglom->get_label(); } if(!widget_to_change) { std::cerr << G_STRFUNC << ": widget_to_change is null." << std::endl; return; } if(!layout_item) return; //Horizontal alignment: const Formatting::HorizontalAlignment alignment = layout_item->get_formatting_used_horizontal_alignment(true /* for details view */); const float x_align = (alignment == Formatting::HORIZONTAL_ALIGNMENT_LEFT ? 0.0 : 1.0); Gtk::Misc* misc = dynamic_cast(widget_to_change); if(misc) misc->set_alignment(x_align); //Set justification on labels: //Assume that people want left/right justification of multi-line text if they chose //left/right alignment of the text itself. { Gtk::Label* label = dynamic_cast(widget_to_change); if(label) { const Gtk::Justification justification = (alignment == Formatting::HORIZONTAL_ALIGNMENT_LEFT ? Gtk::JUSTIFY_LEFT : Gtk::JUSTIFY_RIGHT); label->set_justify(justification); } } const Formatting& formatting = layout_item->get_formatting_used(); //Use the text formatting: const Glib::ustring font_desc = formatting.get_text_format_font(); if(!font_desc.empty()) { widget_to_change->override_font( Pango::FontDescription(font_desc) ); } const Glib::ustring fg = formatting.get_text_format_color_foreground(); if(!fg.empty()) { // "text" is the text color. (Works for GtkEntry and GtkTextView, // for which override_color() doesn't seem to have any effect. widget_to_change->override_color(Gdk::RGBA(fg)); // This works for GtkLabel, for which override_color() does not. widget_to_change->override_color(Gdk::RGBA(fg)); } const Glib::ustring bg = formatting.get_text_format_color_background(); if(!bg.empty()) { if(!labelglom && !button) { // "base" is the background color for GtkEntry. "bg" seems to change the border: widget_to_change->override_background_color(Gdk::RGBA(bg)); } //According to the gtk_widget_override_background_color() documentation, //a GtkLabel can only have a background color by, for instance, placing it //in a GtkEventBox. Luckily Label is actually derived from EventBox. else if(labelglom) { //label->override_background_color(Gdk::RGBA("bg")); labelglom->override_background_color(Gdk::RGBA(bg)); } else if(button) { //button->override_background_color(Gdk::RGBA("bg")); button->override_background_color(Gdk::RGBA(bg)); } } } #ifndef GLOM_ENABLE_CLIENT_ONLY void LayoutWidgetBase::set_dnd_in_progress(bool drag) { m_drag_in_progress = drag; } bool LayoutWidgetBase::get_dnd_in_progress() { return m_drag_in_progress; } #endif // !GLOM_ENABLE_CLIENT_ONLY } //namespace Glom glom-1.22.4/glom/utility_widgets/layoutwidgetutils.cc0000644000175000017500000000624712234776363024312 0ustar00murraycmurrayc00000000000000/* * glom * * glom is free software. * * You may redistribute it and/or modify it under the terms of the * GNU General Public License, as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * glom is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glom. If not, write to: * The Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301, USA. */ #include "layoutwidgetutils.h" #include #include namespace Glom { LayoutWidgetUtils::LayoutWidgetUtils() : m_pPopupMenuUtils(0) { m_refActionGroup = Gtk::ActionGroup::create(); m_refActionGroup->add(Gtk::Action::create("UtilMenu", "Utility Menu") ); m_refUtilProperties = Gtk::Action::create("UtilProperties", _("Properties")); m_refUtilDelete = Gtk::Action::create("UtilDelete", _("Delete")); #ifndef GLOM_ENABLE_CLIENT_ONLY setup_util_menu(); #endif } LayoutWidgetUtils::~LayoutWidgetUtils() { } #ifndef GLOM_ENABLE_CLIENT_ONLY void LayoutWidgetUtils::setup_util_menu() { m_refUIManager = Gtk::UIManager::create(); m_refActionGroup->add(m_refUtilProperties, sigc::mem_fun(*this, &LayoutWidgetUtils::on_menu_properties_activate) ); m_refActionGroup->add(m_refUtilDelete, sigc::mem_fun(*this, &LayoutWidgetUtils::on_menu_delete_activate) ); m_refUIManager->insert_action_group(m_refActionGroup); try { Glib::ustring ui_info = "" " " " " " " " " " " ""; m_refUIManager->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_pPopupMenuUtils = dynamic_cast( m_refUIManager->get_widget("/UtilMenu") ); if(!m_pPopupMenuUtils) g_warning("menu not found"); } void LayoutWidgetUtils::on_menu_delete_activate() { Gtk::Widget* parent = dynamic_cast(this); if(!parent) { // Should never happen! std::cerr << "LayoutWidgetUtils is no Gtk::Widget" << std::endl; return; } LayoutWidgetBase* base = 0; do { parent = parent->get_parent(); base = dynamic_cast(parent); if(base) { break; } } while (parent); if(base) { sharedptr group = sharedptr::cast_dynamic(base->get_layout_item()); if(!group) return; group->remove_item(get_layout_item()); signal_layout_changed().emit(); } } void LayoutWidgetUtils::on_menu_properties_activate() { //This is not pure virtual, so we can easily use this base class in unit tests. std::cerr << G_STRFUNC << ": Not imlemented. Derived classes should override this." << std::endl; } #endif // !GLOM_ENABLE_CLIENT_ONLY } // namespace Glom glom-1.22.4/glom/utility_widgets/cellrendererlist.h0000644000175000017500000000323612234252646023700 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CELLRENDERERLIST_H #define GLOM_UTILITY_WIDGETS_CELLRENDERERLIST_H #include #include namespace Glom { /** A CellRendererCombo with a single (text) column. */ class CellRendererList : public Gtk::CellRendererCombo { public: CellRendererList(); virtual ~CellRendererList(); void remove_all_list_items(); void append_list_item(const Glib::ustring& text); void set_restrict_values_to_list(bool val = true); private: //Tree model columns for the Combo CellRenderer in the TreeView column: class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_choice); } Gtk::TreeModelColumn m_col_choice; }; ModelColumns m_model_columns; Glib::RefPtr m_refModel; }; } //namespace Glom #endif // GLOM_UTILITY_WIDGETS_CELLRENDERERLIST_H glom-1.22.4/glom/utility_widgets/filechooserdialog_saveextras.cc0000644000175000017500000002067612234776363026441 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include #include #include #include //For bold_message()). #include namespace Glom { FileChooserDialog_SaveExtras::FileChooserDialog_SaveExtras(const Glib::ustring& title, Gtk::FileChooserAction action, const Glib::ustring& backend) : Gtk::FileChooserDialog(title, action, backend), m_extra_widget(Gtk::ORIENTATION_VERTICAL) { create_child_widgets(); } FileChooserDialog_SaveExtras::FileChooserDialog_SaveExtras(Gtk::Window& parent, const Glib::ustring& title, Gtk::FileChooserAction action, const Glib::ustring& backend) : Gtk::FileChooserDialog(parent, title, action, backend), m_extra_widget(Gtk::ORIENTATION_VERTICAL) { create_child_widgets(); } FileChooserDialog_SaveExtras::FileChooserDialog_SaveExtras(const Glib::ustring& title, Gtk::FileChooserAction action) : Gtk::FileChooserDialog(title, action), m_extra_widget(Gtk::ORIENTATION_VERTICAL) { create_child_widgets(); } FileChooserDialog_SaveExtras::FileChooserDialog_SaveExtras(Gtk::Window& parent, const Glib::ustring& title, Gtk::FileChooserAction action) : Gtk::FileChooserDialog(parent, title, action), m_extra_widget(Gtk::ORIENTATION_VERTICAL) { create_child_widgets(); } FileChooserDialog_SaveExtras::~FileChooserDialog_SaveExtras() { } void FileChooserDialog_SaveExtras::set_extra_message(const Glib::ustring& message) { m_label_extra_message.set_text(message); if (!message.empty()) { m_label_extra_message.show(); } else { m_label_extra_message.hide(); } } void FileChooserDialog_SaveExtras::create_child_widgets() { //m_extra_widget.pack_start(m_label_extra_message); m_label_extra_message.set_alignment(0.0f, 0.5f); Gtk::Frame* frame = Gtk::manage(new Gtk::Frame()); Gtk::Label* frame_label = Gtk::manage(new Gtk::Label()); frame_label->set_markup(Utils::bold_message(_("New Database"))); frame_label->show(); frame->set_label_widget(*frame_label); frame->set_shadow_type(Gtk::SHADOW_NONE); Gtk::Alignment* alignment = Gtk::manage(new Gtk::Alignment()); alignment->set_padding(Utils::DEFAULT_SPACING_SMALL, 0, Utils::DEFAULT_SPACING_LARGE, 0); //Add padding at the top and left. alignment->show(); frame->add(*alignment); frame->show(); Gtk::Box* vbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL, Utils::DEFAULT_SPACING_SMALL)); alignment->add(*vbox); vbox->show(); vbox->pack_start(m_label_extra_message); /* For instance, an extra hint when saving from an example, saying that a new file must be saved. */ Gtk::Label* label_newdb = Gtk::manage(new Gtk::Label(_("Please choose a human-readable title for the new database. You can change this later in the database properties. It may contain any characters."))); vbox->pack_start(*label_newdb); label_newdb->set_alignment(0.0f, 0.5f); label_newdb->show(); Gtk::Box* box_label = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, Utils::DEFAULT_SPACING_LARGE)); Gtk::Label* label_title = Gtk::manage(new Gtk::Label(_("_Title:"), true)); box_label->pack_start(*label_title, Gtk::PACK_SHRINK); label_title->show(); box_label->pack_start(m_entry_title); m_entry_title.get_accessible()->set_name(_("Title")); m_entry_title.show(); box_label->show(); vbox->pack_start(*box_label); #ifndef GLOM_ENABLE_CLIENT_ONLY #ifdef GLOM_ENABLE_SQLITE #ifdef GLOM_ENABLE_POSTGRESQL //Use titles that show the distinction between PostgreSQL and SQLite: m_radiobutton_server_postgres_selfhosted.set_label(_("Create PostgreSQL database in its own folder, to be hosted by this computer.")); vbox->pack_start(m_radiobutton_server_postgres_selfhosted); m_radiobutton_server_postgres_selfhosted.show(); m_radiobutton_server_postgres_central.set_label(_("Create database on an external PostgreSQL database server, to be specified in the next step.")); Gtk::RadioButton::Group group = m_radiobutton_server_postgres_selfhosted.get_group(); m_radiobutton_server_postgres_central.set_group(group); vbox->pack_start(m_radiobutton_server_postgres_central); m_radiobutton_server_postgres_central.show(); m_radiobutton_server_sqlite.set_label(_("Create SQLite database in its own folder, to be hosted by this computer.")); m_radiobutton_server_sqlite.set_tooltip_text(_("SQLite does not support authentication or remote access but is suitable for embedded devices.")); m_radiobutton_server_sqlite.set_group(group); vbox->pack_start(m_radiobutton_server_sqlite); m_radiobutton_server_sqlite.show(); m_radiobutton_server_postgres_selfhosted.set_active(true); // Default #else //Only SQLite: std::cerr << "WARNING: Glom was built with developer mode (not client-only) but with only support for SQLite. This is very unusual. Postgres is the default backend so it should not be hidden from developers." << std::endl; //TODO: Hide this because it's the only radio button, so it's not a choice: m_radiobutton_server_sqlite.set_label(_("Create database in its own folder, to be hosted by this computer, using SQLite")); //m_radiobutton_server_sqlite.set_group(group); vbox->pack_start(m_radiobutton_server_sqlite); m_radiobutton_server_sqlite.show(); #endif // GLOM_ENABLE_POSTGRESQL #else //GLOM_ENABLE_SQLITE //Only PostgreSQL: //Use titles that don't mention the boring name of the backend: m_radiobutton_server_postgres_selfhosted.set_label(_("Create database in its own folder, to be hosted by this computer.")); vbox->pack_start(m_radiobutton_server_postgres_selfhosted); m_radiobutton_server_postgres_selfhosted.show(); m_radiobutton_server_postgres_central.set_label(_("Create database on an external database server, to be specified in the next step.")); Gtk::RadioButton::Group group = m_radiobutton_server_postgres_selfhosted.get_group(); m_radiobutton_server_postgres_central.set_group(group); vbox->pack_start(m_radiobutton_server_postgres_central); m_radiobutton_server_postgres_central.show(); m_radiobutton_server_postgres_selfhosted.set_active(true); // Default #endif //GLOM_ENABLE_SQLITE #endif // !GLOM_ENABLE_CLIENT_ONLY m_extra_widget.pack_start(*frame); set_extra_widget(m_extra_widget); m_extra_widget.show(); } void FileChooserDialog_SaveExtras::set_extra_newdb_title(const Glib::ustring& title) { m_entry_title.set_text(title); } void FileChooserDialog_SaveExtras::set_extra_newdb_hosting_mode(Document::HostingMode mode) { switch(mode) { #ifdef GLOM_ENABLE_POSTGRESQL case Document::HOSTING_MODE_POSTGRES_CENTRAL: m_radiobutton_server_postgres_central.set_active(); break; case Document::HOSTING_MODE_POSTGRES_SELF: m_radiobutton_server_postgres_selfhosted.set_active(); break; #endif //GLOM_ENABLE_POSTGRESQL #ifdef GLOM_ENABLE_SQLITE case Document::HOSTING_MODE_SQLITE: m_radiobutton_server_sqlite.set_active(); break; #endif //GLOM_ENABLE_SQLITE default: g_assert_not_reached(); break; } } Glib::ustring FileChooserDialog_SaveExtras::get_extra_newdb_title() const { return m_entry_title.get_text(); } Document::HostingMode FileChooserDialog_SaveExtras::get_extra_newdb_hosting_mode() const { #ifdef GLOM_ENABLE_POSTGRESQL if(m_radiobutton_server_postgres_central.get_active()) return Document::HOSTING_MODE_POSTGRES_CENTRAL; else if(m_radiobutton_server_postgres_selfhosted.get_active()) return Document::HOSTING_MODE_POSTGRES_SELF; #endif //GLOM_ENABLE_POSTGRESQL #ifdef GLOM_ENABLE_SQLITE if(m_radiobutton_server_sqlite.get_active()) return Document::HOSTING_MODE_SQLITE; #endif //GLOM_ENABLE_SQLITE g_assert_not_reached(); #ifdef GLOM_ENABLE_SQLITE return Document::HOSTING_MODE_SQLITE; //Arbitrary #else return Document::HOSTING_MODE_POSTGRES_SELF; //Arbitrary. #endif //GLOM_ENABLE_SQLITE } } //namespace Glom glom-1.22.4/glom/utility_widgets/eggspreadtable/0000755000175000017500000000000012235000126023113 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/utility_widgets/eggspreadtable/eggspreadtablednd.h0000644000175000017500000000766312234252646026756 0ustar00murraycmurrayc00000000000000/* * Copyright (C) 2011 Openismus GmbH * * Authors: * Tristan Van Berkom * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef __EGG_SPREAD_TABLE_DND_H__ #define __EGG_SPREAD_TABLE_DND_H__ #include #include "eggspreadtable.h" G_BEGIN_DECLS #define EGG_TYPE_SPREAD_TABLE_DND (egg_spread_table_dnd_get_type ()) #define EGG_SPREAD_TABLE_DND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SPREAD_TABLE_DND, EggSpreadTableDnd)) #define EGG_SPREAD_TABLE_DND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SPREAD_TABLE_DND, EggSpreadTableDndClass)) #define EGG_IS_SPREAD_TABLE_DND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SPREAD_TABLE_DND)) #define EGG_IS_SPREAD_TABLE_DND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SPREAD_TABLE_DND)) #define EGG_SPREAD_TABLE_DND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SPREAD_TABLE_DND, EggSpreadTableDndClass)) typedef struct _EggSpreadTableDnd EggSpreadTableDnd; typedef struct _EggSpreadTableDndPrivate EggSpreadTableDndPrivate; typedef struct _EggSpreadTableDndClass EggSpreadTableDndClass; /** * EggDragEnableMode: * @EGG_DRAG_DISABLED: Children cannot be dragged. * @EGG_DRAG_ENABLED: Children can be dragged if the needed mouse events * are not handled by those said children. * @EGG_DRAG_FULL: All mouse events on children are consumed for the * purpose of starting drag and drop operations on children. * * Constants that control whether child widgets can be dragged from * an #EggSpreadTableDnd. * */ typedef enum { EGG_DRAG_DISABLED = 0, EGG_DRAG_ENABLED, EGG_DRAG_FULL } EggDragEnableMode; /** * EggSpreadTableDnd: */ struct _EggSpreadTableDnd { /*< private >*/ EggSpreadTable parent_instance; EggSpreadTableDndPrivate *priv; }; /** * EggSpreadTableDndClass: * @widget_drop_possible: A signal to determine whether @widget can be dropped into @table */ struct _EggSpreadTableDndClass { /*< private >*/ EggSpreadTableClass parent_class; /*< public >*/ gboolean (* widget_drop_possible) (EggSpreadTableDnd *table, GtkWidget *widget, gboolean *drop_possible); }; GType egg_spread_table_dnd_get_type (void) G_GNUC_CONST; GtkWidget *egg_spread_table_dnd_new (GtkOrientation orientation, guint lines); void egg_spread_table_dnd_insert_child (EggSpreadTableDnd *table, GtkWidget *child, gint index); void egg_spread_table_dnd_remove_child (EggSpreadTableDnd *table, GtkWidget *child); void egg_spread_table_dnd_set_drag_enabled (EggSpreadTableDnd *table, EggDragEnableMode drag_enabled); EggDragEnableMode egg_spread_table_dnd_get_drag_enabled (EggSpreadTableDnd *table); void egg_spread_table_dnd_set_drop_enabled (EggSpreadTableDnd *table, gboolean drop_enabled); gboolean egg_spread_table_dnd_get_drop_enabled (EggSpreadTableDnd *table); G_END_DECLS #endif /* __EGG_SPREAD_TABLE_H__ */ glom-1.22.4/glom/utility_widgets/eggspreadtable/eggspreadtablednd.c0000644000175000017500000013606512234252646026750 0ustar00murraycmurrayc00000000000000/* gtkspreadtablednd.c * Copyright (C) 2011 Openismus GmbH * * Authors: * Tristan Van Berkom * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include #include #include "eggspreadtablednd.h" #include "eggplaceholder.h" #include "eggmarshalers.h" #define DEFAULT_LINES 2 #define P_(msgid) (msgid) /* GObjectClass */ static void egg_spread_table_dnd_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void egg_spread_table_dnd_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); /* GtkWidgetClass */ static void egg_spread_table_dnd_realize (GtkWidget *widget); static void egg_spread_table_dnd_size_allocate (GtkWidget *widget, GtkAllocation *allocation); /* GtkWidgetClass drag-dest */ static void egg_spread_table_dnd_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time_); static gboolean egg_spread_table_dnd_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time_); static gboolean egg_spread_table_dnd_drag_drop (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time_); static void egg_spread_table_dnd_drag_data_received (GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint info, guint time); /* GtkContainerClass */ static void egg_spread_table_dnd_remove (GtkContainer *container, GtkWidget *child); /* EggSpreadTableClass */ static void egg_spread_table_dnd_insert_child_impl (EggSpreadTable *spread_table, GtkWidget *child, gint index); static gint egg_spread_table_dnd_build_segments (EggSpreadTable *table, gint for_size, gint **segments); /* EggSpreadTableDndClass */ static gboolean egg_spread_table_dnd_drop_possible(EggSpreadTableDnd *table, GtkWidget *widget, gboolean *possible); /* Drag and Drop callbacks & other utilities */ static void drag_begin (GtkWidget *widget, GdkDragContext *context, EggSpreadTableDnd *spread_table); static void drag_end (GtkWidget *widget, GdkDragContext *context, EggSpreadTableDnd *spread_table); static void drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection, guint info, guint time, EggSpreadTableDnd *spread_table); static gboolean drag_failed (GtkWidget *widget, GdkDragContext *drag_context, GtkDragResult result, EggSpreadTableDnd *spread_table); static gint get_index_at_position (EggSpreadTableDnd *spread_table, gint x, gint y, gint *line_ret); static gboolean boolean_handled_accumulator (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer dummy); static gboolean drop_possible (EggSpreadTableDnd *spread_table, GtkWidget *widget); static void adjust_line_segment (EggSpreadTableDnd *table, gint segment, gint offset); static void lock_table (EggSpreadTableDnd *spread_table); static void unlock_table (EggSpreadTableDnd *spread_table); static void animate_out_drop_target (EggSpreadTableDnd *table, gboolean end); typedef struct { EggSpreadTableDnd *table; GtkWidget *child; } EggSpreadTableDndDragData; struct _EggSpreadTableDndPrivate { /* State of drop target while drag-motion is happening over this spread table */ GtkWidget *drop_target; /* Remember which child widget is the active placeholder */ /* After successfully calling gtk_drag_get_data(), the drag data ends up in this struct */ EggSpreadTableDndDragData drag_data; GtkWidget *drag_child; /* If the drag started on a widget with no window, then the spread table * keeps a hold on which child is being dragged */ guint dragging : 1; /* Whether a drag'n'drop operation is currently active over this table */ guint drop_enabled : 1; /* Whether dropping is allowed on this table */ guint drag_enabled : 2; /* The EggDragEnableMode (can cause the event-boxes to * place thier event window above of below all children) */ gint disappearing; /* Count of placeholders that are currently disappearing */ gint *locked_config; /* Caching and locking the child configuration */ }; enum { PROP_0, PROP_DRAG_ENABLED, PROP_DROP_ENABLED }; enum { SIGNAL_DROP_POSSIBLE, LAST_SIGNAL }; static guint dnd_table_signals [LAST_SIGNAL] = { 0 }; static GQuark dnd_table_child_quark = 0; static GQuark dnd_table_connected_quark = 0; static GdkAtom dnd_target_atom_child = GDK_NONE; static const GtkTargetEntry dnd_targets[] = { { "application/x-egg-spread-table-dnd-child", GTK_TARGET_SAME_APP, 0 } }; G_DEFINE_TYPE (EggSpreadTableDnd, egg_spread_table_dnd, EGG_TYPE_SPREAD_TABLE) static void egg_spread_table_dnd_class_init (EggSpreadTableDndClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class); EggSpreadTableClass *spread_class = EGG_SPREAD_TABLE_CLASS (class); gobject_class->get_property = egg_spread_table_dnd_get_property; gobject_class->set_property = egg_spread_table_dnd_set_property; widget_class->realize = egg_spread_table_dnd_realize; widget_class->size_allocate = egg_spread_table_dnd_size_allocate; widget_class->drag_leave = egg_spread_table_dnd_drag_leave; widget_class->drag_motion = egg_spread_table_dnd_drag_motion; widget_class->drag_drop = egg_spread_table_dnd_drag_drop; widget_class->drag_data_received = egg_spread_table_dnd_drag_data_received; container_class->remove = egg_spread_table_dnd_remove; spread_class->insert_child = egg_spread_table_dnd_insert_child_impl; spread_class->build_segments_for_size = egg_spread_table_dnd_build_segments; class->widget_drop_possible = egg_spread_table_dnd_drop_possible; /** * EggSpreadTableDnd:drag-enabled: * * Specifies the #EggDragEnableMode controlling whether child * widgets can be dragged from this table. * * */ g_object_class_install_property (gobject_class, PROP_DRAG_ENABLED, g_param_spec_int ("drag-enabled", P_("Drag Enabled"), P_("The #EggDragEnableMode controlling whether " "children can be dragged"), EGG_DRAG_DISABLED, EGG_DRAG_FULL, EGG_DRAG_ENABLED, G_PARAM_READABLE | G_PARAM_WRITABLE)); /** * EggSpreadTableDnd:drop-enabled: * * Whether this spread table accepts drops. * * If this is set to %FALSE then the EggSpreadTableDnd::widget-drop-possible * signal will never be emitted. */ g_object_class_install_property (gobject_class, PROP_DROP_ENABLED, g_param_spec_boolean ("drop-enabled", P_("Drop Enabled"), P_("Whether this spread table accepts drops"), TRUE, G_PARAM_READABLE | G_PARAM_WRITABLE)); /** * EggSpreadTableDnd::widget-drop-possible: * @eggspreadtablednd: An #EggSpreadTableDnd * @widget: The currently dragging widget to check * @drop_possible: (out): Location to store whether the @eggspreadtablednd should accept @widget * * Emitted to check if @widget can be dropped into @eggspreadtablednd. * * The first connected signal to return TRUE decides whether @widget * can be dropped into @eggspreadtablednd. * * When handling this signal and returning %TRUE, you must set the value of @drop_possible: * * * By default EggSpreadTableDnd accepts drops from only the same table * * To disable dropping completely in a spread table, use egg_spread_table_set_drop_enabled(). */ dnd_table_signals[SIGNAL_DROP_POSSIBLE] = g_signal_new ("widget-drop-possible", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EggSpreadTableDndClass, widget_drop_possible), boolean_handled_accumulator, NULL, _egg_marshal_BOOLEAN__OBJECT_POINTER, G_TYPE_BOOLEAN, 2, GTK_TYPE_WIDGET, G_TYPE_POINTER); dnd_target_atom_child = gdk_atom_intern_static_string (dnd_targets[0].target); dnd_table_child_quark = g_quark_from_static_string ("egg-spread-table-dnd-child"); dnd_table_connected_quark = g_quark_from_static_string ("egg-spread-table-dnd-connected"); g_type_class_add_private (class, sizeof (EggSpreadTableDndPrivate)); } static void egg_spread_table_dnd_init (EggSpreadTableDnd *spread_table) { EggSpreadTableDndPrivate *priv; spread_table->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (spread_table, EGG_TYPE_SPREAD_TABLE_DND, EggSpreadTableDndPrivate); /* Setup the spread table as a drag target for our target type */ gtk_drag_dest_set (GTK_WIDGET (spread_table), 0, dnd_targets, G_N_ELEMENTS (dnd_targets), GDK_ACTION_MOVE); /* Setup the spread table as a drag source for our target type also * (to handle no-window widget children) */ gtk_drag_source_set (GTK_WIDGET (spread_table), 0, dnd_targets, G_N_ELEMENTS (dnd_targets), GDK_ACTION_MOVE); priv->drag_enabled = EGG_DRAG_ENABLED; priv->drop_enabled = TRUE; gtk_widget_set_has_window (GTK_WIDGET (spread_table), TRUE); } /***************************************************** * GObectClass * *****************************************************/ static void egg_spread_table_dnd_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { EggSpreadTableDnd *table = EGG_SPREAD_TABLE_DND (object); switch (prop_id) { case PROP_DRAG_ENABLED: g_value_set_int (value, table->priv->drag_enabled); break; case PROP_DROP_ENABLED: g_value_set_boolean (value, table->priv->drop_enabled); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void egg_spread_table_dnd_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { EggSpreadTableDnd *table = EGG_SPREAD_TABLE_DND (object); switch (prop_id) { case PROP_DRAG_ENABLED: egg_spread_table_dnd_set_drag_enabled (table, g_value_get_int (value)); break; case PROP_DROP_ENABLED: egg_spread_table_dnd_set_drop_enabled (table, g_value_get_int (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /***************************************************** * GtkWidgetClass * *****************************************************/ static void egg_spread_table_dnd_realize (GtkWidget *widget) { GtkAllocation allocation; GdkWindow *window; GdkWindowAttr attributes; gint attributes_mask; gtk_widget_set_realized (widget, TRUE); gtk_widget_get_allocation (widget, &allocation); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.event_mask = gtk_widget_get_events (widget) | GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gtk_widget_set_window (widget, window); gdk_window_set_user_data (window, widget); gtk_style_context_set_background (gtk_widget_get_style_context (widget), window); } static void get_widget_size (GtkWidget *widget, GtkOrientation orientation, gint for_size, gint *min_size, gint *nat_size) { if (orientation == GTK_ORIENTATION_HORIZONTAL) { if (for_size < 0) gtk_widget_get_preferred_width (widget, min_size, nat_size); else gtk_widget_get_preferred_width_for_height (widget, for_size, min_size, nat_size); } else { if (for_size < 0) gtk_widget_get_preferred_height (widget, min_size, nat_size); else gtk_widget_get_preferred_height_for_width (widget, for_size, min_size, nat_size); } } static void allocate_child (EggSpreadTableDnd *table, GtkWidget *child, gint item_offset, gint line_offset, gint item_size, gint line_size) { GtkAllocation widget_allocation; GtkAllocation child_allocation; GtkOrientation orientation; gtk_widget_get_allocation (GTK_WIDGET (table), &widget_allocation); orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (table)); if (gtk_widget_get_has_window (GTK_WIDGET (table))) { widget_allocation.x = 0; widget_allocation.y = 0; } if (orientation == GTK_ORIENTATION_HORIZONTAL) { child_allocation.x = widget_allocation.x + item_offset; child_allocation.y = widget_allocation.y + line_offset; child_allocation.width = item_size; child_allocation.height = line_size; } else /* GTK_ORIENTATION_VERTICAL */ { child_allocation.x = widget_allocation.x + line_offset; child_allocation.y = widget_allocation.y + item_offset; child_allocation.width = line_size; child_allocation.height = item_size; } gtk_widget_size_allocate (child, &child_allocation); } static void get_spread_table_dimensions (EggSpreadTableDnd *spread_table, gint for_size, gint *line_spacing, gint *item_spacing, gint *full_size, gint *line_width) { EggSpreadTable *table = EGG_SPREAD_TABLE (spread_table); gint local_full_size, local_item_spacing, local_spacing; gint lines = egg_spread_table_get_lines (table); GtkAllocation allocation; gtk_widget_get_allocation (GTK_WIDGET (table), &allocation); if (gtk_orientable_get_orientation (GTK_ORIENTABLE (table)) == GTK_ORIENTATION_VERTICAL) { local_full_size = for_size < 0 ? allocation.width : for_size; local_spacing = egg_spread_table_get_horizontal_spacing (table); local_item_spacing = egg_spread_table_get_vertical_spacing (table); } else { local_full_size = for_size < 0 ? allocation.height : for_size; local_spacing = egg_spread_table_get_vertical_spacing (table); local_item_spacing = egg_spread_table_get_horizontal_spacing (table); } if (full_size) *full_size = local_full_size; if (line_spacing) *line_spacing = local_spacing; if (item_spacing) *item_spacing = local_item_spacing; if (line_width) *line_width = (local_full_size - (local_spacing * (lines -1))) / lines; } static void egg_spread_table_dnd_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { EggSpreadTableDnd *table = EGG_SPREAD_TABLE_DND (widget); GList *list, *children; gint *segments = NULL; gint full_thickness; gint i, j; gint line_offset, item_offset; gint line_thickness; gint line_spacing; gint item_spacing; gint placeholder_cnt = 0; gint lines; GtkWidgetClass *parent_parent_class; GtkOrientation orientation; /* Skip the EggSpreadTableClass allocator, chain up to it's parent to resize * the GdkWindow properly */ parent_parent_class = g_type_class_peek_parent (egg_spread_table_dnd_parent_class); parent_parent_class->size_allocate (widget, allocation); get_spread_table_dimensions (table, -1, &line_spacing, &item_spacing, &full_thickness, &line_thickness); lines = egg_spread_table_get_lines (EGG_SPREAD_TABLE (table)); orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (table)); egg_spread_table_build_segments_for_size (EGG_SPREAD_TABLE (table), full_thickness, &segments); children = gtk_container_get_children (GTK_CONTAINER (table)); for (list = children, line_offset = 0, i = 0; i < lines; line_offset += line_thickness + line_spacing, i++) { /* Count the placeholders on each line */ placeholder_cnt = 0; for (j = 0, item_offset = 0; list && j < segments[i]; list = list->next, j++) { GtkWidget *child = list->data; gint child_size; if (!gtk_widget_get_visible (child)) continue; get_widget_size (child, orientation, line_thickness, NULL, &child_size); /* Stop allocating children on this line after 2 placeholders * this avoids annoying flicker when moving a widget inside a single column */ if (placeholder_cnt >= 2) continue; if (placeholder_cnt < 2 && EGG_IS_PLACEHOLDER (child)) placeholder_cnt++; allocate_child (table, child, item_offset, line_offset, child_size, line_thickness); item_offset += child_size + item_spacing; } } g_list_free (children); g_free (segments); } /***************************************************** * GtkWidgetClass drag dest * *****************************************************/ static gint get_child_line (EggSpreadTableDnd *table, GtkWidget *child) { gint size; if (gtk_orientable_get_orientation (GTK_ORIENTABLE (table)) == GTK_ORIENTATION_VERTICAL) size = gtk_widget_get_allocated_width (GTK_WIDGET (table)); else size = gtk_widget_get_allocated_height (GTK_WIDGET (table)); return egg_spread_table_get_child_line (EGG_SPREAD_TABLE (table), child, size); } static void placeholder_animated_out (GtkWidget *placeholder, EggSpreadTableDnd *spread_table) { gint line = -1; gboolean last_target = FALSE; if (spread_table->priv->drop_target == placeholder) { spread_table->priv->drop_target = NULL; last_target = TRUE; } if (spread_table->priv->dragging) line = get_child_line (spread_table, placeholder); gtk_container_remove (GTK_CONTAINER (spread_table), placeholder); /* Adjust line segment here manually since table may be locked */ if (spread_table->priv->dragging) adjust_line_segment (spread_table, line, -1); else if (last_target) /* Unlock the table after the drag is finished */ unlock_table (spread_table); spread_table->priv->disappearing--; } static void egg_spread_table_dnd_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time_) { EggSpreadTableDnd *spread_table = EGG_SPREAD_TABLE_DND (widget); gtk_drag_get_data (widget, context, dnd_target_atom_child, time_); /* Animate-out drop target for drop-zone spread table */ animate_out_drop_target (spread_table, TRUE); /* Animate-out drop target for drag-source spread table * (sometimes when drag'n'drop happens very fast no drag-leave gets * emitted on the source spread table so we take care of it here) */ if (spread_table->priv->drag_data.table != spread_table) animate_out_drop_target (spread_table->priv->drag_data.table, TRUE); } static void get_placeholder_size (EggSpreadTableDnd *spread_table, gint *width, gint *height) { GtkOrientation orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (spread_table)); gint line_width; /* Calculate the size of the required placeholder based on the dimensions of the drag widget */ get_spread_table_dimensions (spread_table, -1, NULL, NULL, NULL, &line_width); if (orientation == GTK_ORIENTATION_VERTICAL) { gint min_width; gtk_widget_get_preferred_width (spread_table->priv->drag_data.child, &min_width, NULL); *width = MAX (line_width, min_width); gtk_widget_get_preferred_height_for_width (spread_table->priv->drag_data.child, *width, height, NULL); } else { gint min_height; gtk_widget_get_preferred_width (spread_table->priv->drag_data.child, &min_height, NULL); *height = MAX (line_width, min_height); gtk_widget_get_preferred_width_for_height (spread_table->priv->drag_data.child, *height, width, NULL); } } static gboolean egg_spread_table_dnd_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time_) { EggSpreadTableDnd *spread_table = EGG_SPREAD_TABLE_DND (widget); gint index, line, drop_index; /* Could be comming from another spread table, lock it now incase * its not already locked. */ gtk_drag_get_data (widget, context, dnd_target_atom_child, time_); if (!drop_possible (spread_table, spread_table->priv->drag_data.child)) return FALSE; lock_table (spread_table); spread_table->priv->dragging = TRUE; /* Dont do anything until the currently drop target placeholder finishes animating in */ if ((spread_table->priv->drop_target && egg_placeholder_get_animating (EGG_PLACEHOLDER (spread_table->priv->drop_target)) != EGG_PLACEHOLDER_ANIM_NONE) || spread_table->priv->disappearing) return TRUE; if (spread_table->priv->drop_target) gtk_container_child_get (GTK_CONTAINER (spread_table), spread_table->priv->drop_target, "position", &drop_index, NULL); else drop_index = -1; index = get_index_at_position (spread_table, x, y, &line); if (index != drop_index) { animate_out_drop_target (spread_table, FALSE); if (index >= 0) { gint width, height; /* Import the drag data, get the drag widget and query it's size for this spread table */ get_placeholder_size (spread_table, &width, &height); spread_table->priv->drop_target = egg_placeholder_new (width, height); g_object_set_qdata (G_OBJECT (spread_table->priv->drop_target), dnd_table_child_quark, GINT_TO_POINTER (TRUE)); egg_spread_table_insert_child (EGG_SPREAD_TABLE (spread_table), spread_table->priv->drop_target, index); adjust_line_segment (spread_table, line, 1); egg_placeholder_animate_in (EGG_PLACEHOLDER (spread_table->priv->drop_target), gtk_orientable_get_orientation (GTK_ORIENTABLE (spread_table))); } } return TRUE; } static gboolean egg_spread_table_dnd_drag_drop (GtkWidget *widget, GdkDragContext *context, G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y, guint time_) { EggSpreadTableDnd *spread_table = EGG_SPREAD_TABLE_DND (widget); gtk_drag_get_data (widget, context, dnd_target_atom_child, time_); if (spread_table->priv->drop_target && spread_table->priv->drag_data.child) { gint drop_index; /* Carry the widget over */ g_object_ref (spread_table->priv->drag_data.child); gtk_container_remove (GTK_CONTAINER (spread_table->priv->drag_data.table), spread_table->priv->drag_data.child); /* Get the appropriate target index */ gtk_container_child_get (GTK_CONTAINER (spread_table), spread_table->priv->drop_target, "position", &drop_index, NULL); /* Insert drag child at the index */ egg_spread_table_insert_child (EGG_SPREAD_TABLE (spread_table), spread_table->priv->drag_data.child, drop_index); g_object_unref (spread_table->priv->drag_data.child); /* Ensure visibility */ gtk_widget_show (spread_table->priv->drag_data.child); /* Hide the drop target placeholder in the target spread table, * it will be removed and the spread table unlocked after animating out * (the placeholder started animating out at "drag-leave" time). */ gtk_widget_hide (spread_table->priv->drop_target); gtk_drag_finish (context, TRUE, TRUE, time_); return TRUE; } else { gtk_drag_finish (context, FALSE, TRUE, time_); return FALSE; } } static void egg_spread_table_dnd_drag_data_received (GtkWidget *widget, GdkDragContext *context, G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y, GtkSelectionData *data, G_GNUC_UNUSED guint info, guint time_) { EggSpreadTableDnd *spread_table = EGG_SPREAD_TABLE_DND (widget); EggSpreadTableDndDragData *drag_data; memset (&spread_table->priv->drag_data, 0x0, sizeof (EggSpreadTableDndDragData)); g_return_if_fail (gtk_selection_data_get_format (data) == 8); g_return_if_fail (gtk_selection_data_get_length (data) == sizeof (EggSpreadTableDndDragData)); g_return_if_fail (gtk_selection_data_get_target (data) == dnd_target_atom_child); drag_data = (EggSpreadTableDndDragData*) gtk_selection_data_get_data (data); memcpy (&spread_table->priv->drag_data, drag_data, sizeof (EggSpreadTableDndDragData)); gdk_drag_status (context, GDK_ACTION_MOVE, time_); } /***************************************************** * GtkContainerClass * *****************************************************/ static void egg_spread_table_connect_child (gpointer spread_table, gpointer child) { if (!EGG_IS_PLACEHOLDER (child) && GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (child), dnd_table_connected_quark)) == FALSE) { gtk_drag_source_set (child, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK, dnd_targets, G_N_ELEMENTS (dnd_targets), GDK_ACTION_MOVE); g_signal_connect (child, "drag-data-get", G_CALLBACK (drag_data_get), spread_table); g_signal_connect (child, "drag-failed", G_CALLBACK (drag_failed), spread_table); g_signal_connect (child, "drag-begin", G_CALLBACK (drag_begin), spread_table); g_signal_connect (child, "drag-end", G_CALLBACK (drag_end), spread_table); g_object_set_qdata (G_OBJECT (child), dnd_table_connected_quark, GINT_TO_POINTER (TRUE)); } } static void egg_spread_table_disconnect_child (gpointer spread_table, gpointer child) { /* Disconnect dnd */ if (!EGG_IS_PLACEHOLDER (child) && GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (child), dnd_table_connected_quark))) { g_signal_handlers_disconnect_by_func (child, G_CALLBACK (drag_data_get), spread_table); g_signal_handlers_disconnect_by_func (child, G_CALLBACK (drag_failed), spread_table); g_signal_handlers_disconnect_by_func (child, G_CALLBACK (drag_begin), spread_table); g_signal_handlers_disconnect_by_func (child, G_CALLBACK (drag_end), spread_table); gtk_drag_source_unset (child); g_object_set_qdata (G_OBJECT (child), dnd_table_connected_quark, GINT_TO_POINTER (FALSE)); } } static void egg_spread_table_dnd_remove (GtkContainer *container, GtkWidget *child) { if (GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (child), dnd_table_child_quark)) == FALSE) { g_message ("Refusing to remove child widget from EggSpreadTableDnd directly, " "use egg_spread_table_dnd_remove_child() instead."); return; } /* Disconnect dnd */ egg_spread_table_disconnect_child (container, child); GTK_CONTAINER_CLASS (egg_spread_table_dnd_parent_class)->remove (container, child); } /***************************************************** * EggSpreadTableClass * *****************************************************/ static void egg_spread_table_dnd_insert_child_impl (EggSpreadTable *spread_table, GtkWidget *child, gint index) { EggSpreadTableDnd *table = EGG_SPREAD_TABLE_DND (spread_table); if (GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (child), dnd_table_child_quark)) == FALSE) { g_message ("Refusing to add child widget to an EggSpreadTableDnd directly, " "use egg_spread_table_dnd_insert_child() instead."); return; } EGG_SPREAD_TABLE_CLASS (egg_spread_table_dnd_parent_class)->insert_child (spread_table, child, index); /* Connect dnd after really parenting the child */ if (table->priv->drag_enabled != EGG_DRAG_DISABLED) egg_spread_table_connect_child (spread_table, child); } static gint egg_spread_table_dnd_build_segments (EggSpreadTable *table, gint for_size, gint **segments) { EggSpreadTableDnd *dnd_table = EGG_SPREAD_TABLE_DND (table); EggSpreadTableDndPrivate *priv = dnd_table->priv; GList *list, *children; gint i, j, lines; gint largest_line = 0, line_size = 0; gint line_thickness; gint spacing; GtkOrientation orientation; gboolean first_widget = TRUE; if (!priv->locked_config) return EGG_SPREAD_TABLE_CLASS (egg_spread_table_dnd_parent_class)->build_segments_for_size (table, for_size, segments); get_spread_table_dimensions (dnd_table, for_size, NULL, &spacing, NULL, &line_thickness); children = gtk_container_get_children (GTK_CONTAINER (table)); orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (table)); lines = egg_spread_table_get_lines (table); for (list = children, i = 0; i < lines; i++) { for (j = 0; list && j < priv->locked_config[i]; list = list->next, j++) { GtkWidget *child = list->data; gint child_size; if (!gtk_widget_get_visible (child)) continue; get_widget_size (child, orientation, line_thickness, NULL, &child_size); line_size += child_size; if (!first_widget) line_size += spacing; else first_widget = FALSE; } largest_line = MAX (largest_line, line_size); line_size = 0; first_widget = TRUE; } if (segments) *segments = g_memdup (priv->locked_config, lines * sizeof (gint)); g_list_free (children); return largest_line; } /***************************************************** * EggSpreadTableDndClass * *****************************************************/ static gboolean egg_spread_table_dnd_drop_possible (EggSpreadTableDnd *table, GtkWidget *widget, gboolean *possible) { *possible = (GTK_WIDGET (table) == gtk_widget_get_parent (widget)); return TRUE; } /***************************************************** * Drag'n'Drop signals & other functions * *****************************************************/ static void set_drag_icon (GtkWidget *widget, GdkDragContext *context) { GtkAllocation allocation; cairo_surface_t *surface; cairo_t *cr; GtkStyleContext *style; GdkPixbuf *pixbuf; gint hot_x, hot_y; GdkModifierType modifier_mask; /* XXX Force allocate here ? need to absolutely have an allocated widget * for this to work (gtk_widget_draw() needs that). */ gtk_widget_get_allocation (widget, &allocation); gdk_window_get_device_position( gtk_widget_get_window (widget), gtk_get_current_event_device (), &hot_x, &hot_y, &modifier_mask); surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, allocation.width, allocation.height); cr = cairo_create (surface); /* Synthetically render a background */ style = gtk_widget_get_style_context (widget); gtk_style_context_save (style); gtk_style_context_add_class (style, GTK_STYLE_CLASS_BACKGROUND); gtk_render_background (style, cr, 0, 0, allocation.width, allocation.height); gtk_style_context_restore (style); /* Draw the actual widget, this might or might not draw the background */ gtk_widget_draw (widget, cr); /* Make a pixbuf and use that (just to take advantage of the 'hot_x'/'hot_y' parameters) */ pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, allocation.width, allocation.height); gtk_drag_set_icon_pixbuf (context, pixbuf, hot_x, hot_y); g_object_unref (pixbuf); cairo_destroy (cr); cairo_surface_destroy (surface); } static void drag_begin (GtkWidget *widget, GdkDragContext *context, EggSpreadTableDnd *spread_table) { GtkAllocation allocation; gint drop_index; /* Set the icon for the drag */ set_drag_icon (widget, context); /* Mark the spread table for an active drag */ lock_table (spread_table); spread_table->priv->dragging = TRUE; /* Just assign a drag child, this is only important for * child widgets that dont have a GdkWindow though really */ spread_table->priv->drag_child = widget; /* Save the drag origin in case of failed drags and insert a placeholder as the first * default drop target */ gtk_container_child_get (GTK_CONTAINER (spread_table), spread_table->priv->drag_child, "position", &drop_index, NULL); /* Create a placeholder of the correct dimensions and insert it at the drag origin */ gtk_widget_get_allocation (widget, &allocation); spread_table->priv->drop_target = egg_placeholder_new (allocation.width, allocation.height); g_object_set_qdata (G_OBJECT (spread_table->priv->drop_target), dnd_table_child_quark, GINT_TO_POINTER (TRUE)); egg_spread_table_insert_child (EGG_SPREAD_TABLE (spread_table), spread_table->priv->drop_target, drop_index); /* Add one index for the new placeholder */ adjust_line_segment (spread_table, get_child_line (spread_table, spread_table->priv->drop_target), 1); /* Hide the drag child (we cant remove it because it needs a GdkWindow in the mean time) */ gtk_widget_hide (spread_table->priv->drag_child); } static void drag_end (G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED GdkDragContext *context, EggSpreadTableDnd *spread_table) { /* Sometimes when drag'n'drop happens very fast, drag-leave, * drag-failed and drag-drop dont happen, so we cancel it out here */ animate_out_drop_target (spread_table, TRUE); } static void drag_data_get (GtkWidget *widget, G_GNUC_UNUSED GdkDragContext *context, GtkSelectionData *selection, G_GNUC_UNUSED guint info, G_GNUC_UNUSED guint time, EggSpreadTableDnd *spread_table) { EggSpreadTableDndDragData drag_data = { spread_table, NULL }; GdkAtom target; target = gtk_selection_data_get_target (selection); if (target == dnd_target_atom_child) { drag_data.child = widget; gtk_selection_data_set (selection, target, 8, (guchar*) &drag_data, sizeof (drag_data)); } } static gboolean drag_failed (GtkWidget *widget, G_GNUC_UNUSED GdkDragContext *drag_context, G_GNUC_UNUSED GtkDragResult result, G_GNUC_UNUSED EggSpreadTableDnd *spread_table) { gtk_widget_show (widget); return FALSE; } static gint get_index_at_position (EggSpreadTableDnd *spread_table, gint x, gint y, gint *line_ret) { EggSpreadTable *table; GtkWidget *child; GList *children, *l; GtkAllocation allocation; gint placeholder_cnt = 0; GtkOrientation orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (spread_table)); gint *segments, lines, line = -1, i, full_size, spacing, position, line_width, first_child; gint index = -1; table = EGG_SPREAD_TABLE (spread_table); /* First find the "line" in question */ lines = egg_spread_table_get_lines (table); segments = egg_spread_table_get_segments (table); get_spread_table_dimensions (spread_table, -1, &spacing, NULL, &full_size, &line_width); if (orientation == GTK_ORIENTATION_VERTICAL) position = x; else position = y; for (i = 0; i < lines; i++) { gint start, end; start = line_width * i + (spacing / 2) * i; end = start + line_width + (spacing / 2) * i; if (i == lines - 1) end = full_size; if (position >= start && position <= end) { line = i; break; } } g_assert (line >= 0); /* Get the first child on this line */ for (i = 0, first_child = 0; i < line; i++) first_child += segments[i]; children = gtk_container_get_children (GTK_CONTAINER (spread_table)); for (l = g_list_nth (children, first_child), i = 0; l != NULL && index < 0 && i < segments[line]; l = l->next, i++) { child = l->data; if (!gtk_widget_get_visible (child)) continue; gtk_widget_get_allocation (child, &allocation); if (child == spread_table->priv->drop_target) { if (orientation == GTK_ORIENTATION_VERTICAL) { if (y < allocation.y + allocation.height) index = first_child + i; } else { if (x < allocation.x + allocation.width) index = first_child + i; } placeholder_cnt++; } else { if (orientation == GTK_ORIENTATION_VERTICAL) { if (y < allocation.y + allocation.height / 2) index = first_child + i + placeholder_cnt; } else { if (x < allocation.x + allocation.width / 2) index = first_child + i + placeholder_cnt; } } } if (index < 0) index = first_child + segments[line]; g_list_free (children); g_free (segments); if (line_ret) *line_ret = line; g_assert (index >= 0); return index; } static gboolean drop_possible (EggSpreadTableDnd *spread_table, GtkWidget *widget) { gboolean possible = FALSE; gboolean handled = FALSE; if (spread_table->priv->drop_enabled) g_signal_emit (spread_table, dnd_table_signals[SIGNAL_DROP_POSSIBLE], 0, widget, &possible, &handled); return possible; } /* Copy of _gtk_boolean_handled_accumulator */ static gboolean boolean_handled_accumulator (G_GNUC_UNUSED GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, G_GNUC_UNUSED gpointer dummy) { gboolean continue_emission; gboolean signal_handled; signal_handled = g_value_get_boolean (handler_return); g_value_set_boolean (return_accu, signal_handled); continue_emission = !signal_handled; return continue_emission; } static void adjust_line_segment (EggSpreadTableDnd *table, gint segment, gint offset) { if (table->priv->locked_config) table->priv->locked_config[segment] += offset; } static void animate_out_drop_target (EggSpreadTableDnd *table, gboolean end) { if (table->priv->drop_target && egg_placeholder_get_animating (EGG_PLACEHOLDER (table->priv->drop_target)) != EGG_PLACEHOLDER_ANIM_OUT) { egg_placeholder_animate_out (EGG_PLACEHOLDER (table->priv->drop_target), gtk_orientable_get_orientation (GTK_ORIENTABLE (table))); g_signal_connect (table->priv->drop_target, "animation-done", G_CALLBACK (placeholder_animated_out), table); table->priv->disappearing++; } if (end) table->priv->dragging = FALSE; } static void lock_table (EggSpreadTableDnd *table) { if (table->priv->locked_config == NULL) table->priv->locked_config = egg_spread_table_get_segments (EGG_SPREAD_TABLE (table)); } static void unlock_table (EggSpreadTableDnd *table) { g_free (table->priv->locked_config); table->priv->locked_config = NULL; gtk_widget_queue_resize (GTK_WIDGET (table)); } /***************************************************** * API * *****************************************************/ /** * egg_spread_table_dnd_new: * @orientation: The #GtkOrientation for the #EggSpreadTableDnd * @lines: The fixed amount of lines to distribute children to. * * Creates a #EggSpreadTableDnd. * * Returns: A new #EggSpreadTableDnd container */ GtkWidget * egg_spread_table_dnd_new (GtkOrientation orientation, guint lines) { return (GtkWidget *)g_object_new (EGG_TYPE_SPREAD_TABLE_DND, "orientation", orientation, "lines", lines, NULL); } /** * egg_spread_table_dnd_insert_child: * @table: An #EggSpreadTableDnd * @child: The child widget to insert. * * Adds a child widget to an #EggSpreadTableDnd. * * Regular #GtkContainer apis and #EggSpreadTable * apis are inappropriate for adding children as those * are reserved for internal use by the #EggSpreadTableDnd. */ void egg_spread_table_dnd_insert_child (EggSpreadTableDnd *table, GtkWidget *child, gint index) { GtkWidget *event_box; g_return_if_fail (EGG_IS_SPREAD_TABLE_DND (table)); g_return_if_fail (GTK_IS_WIDGET (child)); event_box = gtk_event_box_new (); gtk_event_box_set_above_child (GTK_EVENT_BOX (event_box), table->priv->drag_enabled == EGG_DRAG_FULL); g_object_set_qdata (G_OBJECT (event_box), dnd_table_child_quark, GINT_TO_POINTER (TRUE)); gtk_widget_show (event_box); gtk_container_add (GTK_CONTAINER (event_box), child); egg_spread_table_insert_child (EGG_SPREAD_TABLE (table), event_box, index); } /** * egg_spread_table_dnd_remove_child: * @table: An #EggSpreadTableDnd * @child: The child widget to insert. * * Adds a child widget to an #EggSpreadTableDnd. * * Regular #GtkContainer apis and #EggSpreadTable * apis are inappropriate for removing children as those * are reserved for internal use by the #EggSpreadTableDnd. */ void egg_spread_table_dnd_remove_child (EggSpreadTableDnd *table, GtkWidget *child) { GtkWidget *event_box; g_return_if_fail (EGG_IS_SPREAD_TABLE_DND (table)); g_return_if_fail (GTK_IS_WIDGET (child)); event_box = gtk_widget_get_parent (child); if (!event_box) { g_message ("Bad hierarchy encountered in %s. The child had no parent.", G_STRFUNC); return; } if (GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (event_box), dnd_table_child_quark)) == FALSE) { g_message ("Bad hierarchy encountered in %s.", G_STRFUNC); return; } /* unparent the user's child and remove the intermediate spread-table owned event-box. */ gtk_container_remove (GTK_CONTAINER (event_box), child); gtk_container_remove (GTK_CONTAINER (table), event_box); } static void reconfigure_children (GtkEventBox *child, EggSpreadTableDnd *table) { /* Besides the internally owned event boxes, only EggPlaceholders can exist * as direct children of the EggSpreadTableDnd */ if (GTK_IS_EVENT_BOX (child)) { gtk_event_box_set_above_child (child, table->priv->drag_enabled == EGG_DRAG_FULL); if (table->priv->drag_enabled == EGG_DRAG_DISABLED) egg_spread_table_disconnect_child (table, child); else egg_spread_table_connect_child (table, child); } } /** * egg_spread_table_dnd_set_drag_enabled: * @table: An #EggSpreadTableDnd * @drag_enabled: The #EggDragEnableMode to set * * Sets the #EggDragEnableMode determining whther * dragging of children is enabled. */ void egg_spread_table_dnd_set_drag_enabled (EggSpreadTableDnd *table, EggDragEnableMode drag_enabled) { g_return_if_fail (EGG_IS_SPREAD_TABLE_DND (table)); if (table->priv->drag_enabled != drag_enabled) { table->priv->drag_enabled = drag_enabled; gtk_container_foreach (GTK_CONTAINER (table), (GtkCallback)reconfigure_children, table); g_object_notify (G_OBJECT (table), "drag-enabled"); } } /** * egg_spread_table_dnd_get_drag_enabled: * @table: An #EggSpreadTableDnd * * Gets the #EggDragEnableMode determining whther * dragging of children is enabled. * * Returns: The #EggDragEnableMode for @table */ EggDragEnableMode egg_spread_table_dnd_get_drag_enabled (EggSpreadTableDnd *table) { g_return_val_if_fail (EGG_IS_SPREAD_TABLE_DND (table), 0); return table->priv->drag_enabled; } /** * egg_spread_table_dnd_set_drop_enabled: * @table: An #EggSpreadTableDnd * @drop_enabled: Whether to enable or disable dropping in @table * * Enables/disables dropping of children into @table. */ void egg_spread_table_dnd_set_drop_enabled (EggSpreadTableDnd *table, gboolean drop_enabled) { g_return_if_fail (EGG_IS_SPREAD_TABLE_DND (table)); if (table->priv->drop_enabled != drop_enabled) { table->priv->drop_enabled = drop_enabled; g_object_notify (G_OBJECT (table), "drop-enabled"); } } /** * egg_spread_table_dnd_get_drop_enabled: * @table: An #EggSpreadTableDnd * * Gets whether dropping of children into @table is enabled. * * Returns: Whether dropping of children into @table is enabled. */ gboolean egg_spread_table_dnd_get_drop_enabled (EggSpreadTableDnd *table) { g_return_val_if_fail (EGG_IS_SPREAD_TABLE_DND (table), FALSE); return table->priv->drop_enabled; } glom-1.22.4/glom/utility_widgets/eggspreadtable/eggmarshalers.h0000644000175000017500000000126312234252646026131 0ustar00murraycmurrayc00000000000000 #ifndef ___egg_marshal_MARSHAL_H__ #define ___egg_marshal_MARSHAL_H__ #include G_BEGIN_DECLS /* BOOLEAN:OBJECT,POINTER (./eggmarshalers.list:1) */ extern void _egg_marshal_BOOLEAN__OBJECT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); G_END_DECLS #endif /* ___egg_marshal_MARSHAL_H__ */ glom-1.22.4/glom/utility_widgets/eggspreadtable/eggplaceholder.c0000644000175000017500000001410312234252646026242 0ustar00murraycmurrayc00000000000000 #include "eggplaceholder.h" /* GObjectClass */ static void egg_placeholder_finalize (GObject *object); /* GtkWidgetClass */ static void egg_placeholder_get_preferred_width (GtkWidget *widget, gint *min_width, gint *nat_width); static void egg_placeholder_get_preferred_height (GtkWidget *widget, gint *min_height, gint *nat_height); #define ANIMATION_STEP 0.12F /* How much percentage of the size to animate per iteration */ #define ANIMATION_FREQ 20 /* At what frequency in millisecs to animate */ enum { SIGNAL_ANIMATION_DONE, NUM_SIGNALS }; static guint placeholder_signals[NUM_SIGNALS] = { 0, }; struct _EggPlaceholderPrivate { gint width; gint height; GtkOrientation animation_orientation; /* Whether we are animating in/out horizontally or vertically */ gdouble animation_percent; /* A multiplier between 0 and 1 representing the current progress */ guint animation_id; /* The GSource id for the animation timeout */ EggPlaceholderAnimDirection animation_direction; /* Whether the placeholder is animating in or out */ }; G_DEFINE_TYPE (EggPlaceholder, egg_placeholder, GTK_TYPE_DRAWING_AREA) static void egg_placeholder_class_init (EggPlaceholderClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->finalize = egg_placeholder_finalize; widget_class->get_preferred_width = egg_placeholder_get_preferred_width; widget_class->get_preferred_height = egg_placeholder_get_preferred_height; placeholder_signals[SIGNAL_ANIMATION_DONE] = g_signal_new ("animation-done", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); g_type_class_add_private (klass, sizeof (EggPlaceholderPrivate)); } static void egg_placeholder_init (EggPlaceholder * placeholder) { placeholder->priv = G_TYPE_INSTANCE_GET_PRIVATE (placeholder, EGG_TYPE_PLACEHOLDER, EggPlaceholderPrivate); placeholder->priv->animation_percent = 1.0F; /* Default visible, avoid cluttering code in eggspreadtablednd.c */ gtk_widget_show (GTK_WIDGET (placeholder)); } static void egg_placeholder_finalize (GObject * object) { EggPlaceholder *placeholder = EGG_PLACEHOLDER (object); if (placeholder->priv->animation_id > 0) { g_source_remove (placeholder->priv->animation_id); placeholder->priv->animation_id = 0; } G_OBJECT_CLASS (egg_placeholder_parent_class)->finalize (object); } static void egg_placeholder_get_preferred_width (GtkWidget *widget, gint *min_width, gint *nat_width) { EggPlaceholder *placeholder = EGG_PLACEHOLDER (widget); gint width; if (placeholder->priv->animation_orientation == GTK_ORIENTATION_HORIZONTAL) width = placeholder->priv->width * placeholder->priv->animation_percent; else width = placeholder->priv->width; *min_width = *nat_width = width; } static void egg_placeholder_get_preferred_height (GtkWidget *widget, gint *min_height, gint *nat_height) { EggPlaceholder *placeholder = EGG_PLACEHOLDER (widget); gint height; if (placeholder->priv->animation_orientation == GTK_ORIENTATION_VERTICAL) height = placeholder->priv->height * placeholder->priv->animation_percent; else height = placeholder->priv->height; *min_height = *nat_height = height; } static gboolean placeholder_animate (EggPlaceholder *placeholder) { if (placeholder->priv->animation_direction == EGG_PLACEHOLDER_ANIM_IN) placeholder->priv->animation_percent += ANIMATION_STEP; else if (placeholder->priv->animation_direction == EGG_PLACEHOLDER_ANIM_OUT) placeholder->priv->animation_percent -= ANIMATION_STEP; else g_error ("Placeholder animation called while not animating"); placeholder->priv->animation_percent = CLAMP (placeholder->priv->animation_percent, 0.0, 1.0); gtk_widget_queue_resize (GTK_WIDGET (placeholder)); if (placeholder->priv->animation_percent >= 1.0 || placeholder->priv->animation_percent <= 0.0) { placeholder->priv->animation_id = 0; placeholder->priv->animation_direction = EGG_PLACEHOLDER_ANIM_NONE; g_signal_emit (placeholder, placeholder_signals[SIGNAL_ANIMATION_DONE], 0); return FALSE; } return TRUE; } void egg_placeholder_animate_in (EggPlaceholder *placeholder, GtkOrientation orientation) { g_return_if_fail (EGG_IS_PLACEHOLDER (placeholder)); placeholder->priv->animation_orientation = orientation; placeholder->priv->animation_direction = EGG_PLACEHOLDER_ANIM_IN; if (placeholder->priv->animation_id == 0) { placeholder->priv->animation_percent = 0.0F; placeholder->priv->animation_id = gdk_threads_add_timeout (ANIMATION_FREQ, (GSourceFunc)placeholder_animate, placeholder); } gtk_widget_queue_resize (GTK_WIDGET (placeholder)); } void egg_placeholder_animate_out (EggPlaceholder *placeholder, GtkOrientation orientation) { g_return_if_fail (EGG_IS_PLACEHOLDER (placeholder)); placeholder->priv->animation_orientation = orientation; placeholder->priv->animation_direction = EGG_PLACEHOLDER_ANIM_OUT; if (placeholder->priv->animation_id == 0) { placeholder->priv->animation_percent = 1.0F; placeholder->priv->animation_id = gdk_threads_add_timeout (ANIMATION_FREQ, (GSourceFunc)placeholder_animate, placeholder); } gtk_widget_queue_resize (GTK_WIDGET (placeholder)); } EggPlaceholderAnimDirection egg_placeholder_get_animating (EggPlaceholder *placeholder) { g_return_val_if_fail (EGG_IS_PLACEHOLDER (placeholder), EGG_PLACEHOLDER_ANIM_NONE); return placeholder->priv->animation_direction; } GtkWidget * egg_placeholder_new (gint width, gint height) { EggPlaceholder *placeholder = g_object_new (EGG_TYPE_PLACEHOLDER, NULL); placeholder->priv->width = width; placeholder->priv->height = height; return GTK_WIDGET (placeholder); } glom-1.22.4/glom/utility_widgets/eggspreadtable/eggplaceholder.h0000644000175000017500000000331512234252646026252 0ustar00murraycmurrayc00000000000000 #ifndef __EGG_PLACEHOLDER_H__ #define __EGG_PLACEHOLDER_H__ #include G_BEGIN_DECLS #define EGG_TYPE_PLACEHOLDER (egg_placeholder_get_type ()) #define EGG_PLACEHOLDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_PLACEHOLDER, EggPlaceholder)) #define EGG_PLACEHOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_PLACEHOLDER, EggPlaceholderClass)) #define EGG_IS_PLACEHOLDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_PLACEHOLDER)) #define EGG_IS_PLACEHOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_PLACEHOLDER)) #define EGG_PLACEHOLDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_PLACEHOLDER, EggPlaceholderClass)) typedef struct _EggPlaceholder EggPlaceholder; typedef struct _EggPlaceholderClass EggPlaceholderClass; typedef struct _EggPlaceholderPrivate EggPlaceholderPrivate; typedef enum { EGG_PLACEHOLDER_ANIM_NONE, EGG_PLACEHOLDER_ANIM_IN, EGG_PLACEHOLDER_ANIM_OUT } EggPlaceholderAnimDirection; struct _EggPlaceholder { GtkDrawingArea drawing_area; EggPlaceholderPrivate *priv; }; struct _EggPlaceholderClass { GtkDrawingAreaClass parent_class; }; GType egg_placeholder_get_type (void) G_GNUC_CONST; GtkWidget *egg_placeholder_new (gint width, gint height); void egg_placeholder_animate_in (EggPlaceholder *placeholder, GtkOrientation orientation); void egg_placeholder_animate_out (EggPlaceholder *placeholder, GtkOrientation orientation); EggPlaceholderAnimDirection egg_placeholder_get_animating (EggPlaceholder *placeholder); G_END_DECLS #endif /* __EGG_PLACEHOLDER_H__ */ glom-1.22.4/glom/utility_widgets/eggspreadtable/eggspreadtable.c0000644000175000017500000011373112234252646026255 0ustar00murraycmurrayc00000000000000/* gtkspreadtable.c * Copyright (C) 2010 Openismus GmbH * * Authors: * Tristan Van Berkom * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ /** * SECTION:gtkspreadtable * @Short_Description: A container that distributes its children evenly across rows/columns. * @Title: EggSpreadTable * * #EggSpreadTable positions its children by distributing them as * evenly as possible across a fixed number of rows or columns. * * When oriented vertically the #EggSpreadTable will list its * children in order from top to bottom in columns and request * the smallest height as possible regardless of differences in * child sizes. */ #include "config.h" #include #include #include "eggspreadtable.h" #define DEFAULT_LINES 2 #define P_(msgid) (msgid) enum { PROP_0, PROP_ORIENTATION, PROP_HORIZONTAL_SPACING, PROP_VERTICAL_SPACING, PROP_LINES }; enum { CHILD_PROP_0, CHILD_PROP_POSITION }; struct _EggSpreadTablePrivate { GList *children; GtkOrientation orientation; guint16 lines; guint16 horizontal_spacing; guint16 vertical_spacing; }; /* GObjectClass */ static void egg_spread_table_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void egg_spread_table_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); /* GtkWidgetClass */ static GtkSizeRequestMode egg_spread_table_get_request_mode (GtkWidget *widget); static void egg_spread_table_get_width (GtkWidget *widget, gint *minimum_size, gint *natural_size); static void egg_spread_table_get_height (GtkWidget *widget, gint *minimum_size, gint *natural_size); static void egg_spread_table_get_height_for_width (GtkWidget *widget, gint width, gint *minimum_height, gint *natural_height); static void egg_spread_table_get_width_for_height (GtkWidget *widget, gint width, gint *minimum_height, gint *natural_height); static void egg_spread_table_size_allocate (GtkWidget *widget, GtkAllocation *allocation); /* GtkContainerClass */ static void egg_spread_table_add (GtkContainer *container, GtkWidget *widget); static void egg_spread_table_remove (GtkContainer *container, GtkWidget *widget); static void egg_spread_table_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); static GType egg_spread_table_child_type (GtkContainer *container); static void egg_spread_table_get_child_property (GtkContainer *container, GtkWidget *child, guint property_id, GValue *value, GParamSpec *pspec); static void egg_spread_table_set_child_property (GtkContainer *container, GtkWidget *child, guint property_id, const GValue *value, GParamSpec *pspec); /* EggSpreadTableClass */ static gint egg_spread_table_build_segments (EggSpreadTable *table, gint for_size, gint **segments); static void egg_spread_table_real_insert_child (EggSpreadTable *table, GtkWidget *child, gint index); G_DEFINE_TYPE_WITH_CODE (EggSpreadTable, egg_spread_table, GTK_TYPE_CONTAINER, G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, NULL)) #define ITEM_SPACING(table) \ (((EggSpreadTable *)(table))->priv->orientation == GTK_ORIENTATION_HORIZONTAL ? \ ((EggSpreadTable *)(table))->priv->horizontal_spacing : \ ((EggSpreadTable *)(table))->priv->vertical_spacing) #define LINE_SPACING(table) \ (((EggSpreadTable *)(table))->priv->orientation == GTK_ORIENTATION_HORIZONTAL ? \ ((EggSpreadTable *)(table))->priv->vertical_spacing : \ ((EggSpreadTable *)(table))->priv->horizontal_spacing) #define OPPOSITE_ORIENTATION(table) \ (((EggSpreadTable *)(table))->priv->orientation == GTK_ORIENTATION_HORIZONTAL ? \ GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL) static void egg_spread_table_class_init (EggSpreadTableClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class); gobject_class->get_property = egg_spread_table_get_property; gobject_class->set_property = egg_spread_table_set_property; widget_class->get_request_mode = egg_spread_table_get_request_mode; widget_class->get_preferred_width = egg_spread_table_get_width; widget_class->get_preferred_height = egg_spread_table_get_height; widget_class->get_preferred_height_for_width = egg_spread_table_get_height_for_width; widget_class->get_preferred_width_for_height = egg_spread_table_get_width_for_height; widget_class->size_allocate = egg_spread_table_size_allocate; container_class->add = egg_spread_table_add; container_class->remove = egg_spread_table_remove; container_class->forall = egg_spread_table_forall; container_class->child_type = egg_spread_table_child_type; container_class->get_child_property = egg_spread_table_get_child_property; container_class->set_child_property = egg_spread_table_set_child_property; class->build_segments_for_size = egg_spread_table_build_segments; class->insert_child = egg_spread_table_real_insert_child; gtk_container_class_handle_border_width (container_class); /* GObjectClass properties */ g_object_class_override_property (gobject_class, PROP_ORIENTATION, "orientation"); /** * EggSpreadTable:lines: * * The number of lines (rows/columns) to evenly distribute children to. * */ g_object_class_install_property (gobject_class, PROP_LINES, g_param_spec_uint ("lines", P_("Lines"), P_("The number of lines (rows/columns) to " "evenly distribute children to."), 1, 65535, DEFAULT_LINES, G_PARAM_READABLE | G_PARAM_WRITABLE)); /** * EggSpreadTable:vertical-spacing: * * The amount of vertical space between two children. * */ g_object_class_install_property (gobject_class, PROP_VERTICAL_SPACING, g_param_spec_uint ("vertical-spacing", P_("Vertical spacing"), P_("The amount of vertical space between two children"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE)); /** * EggSpreadTable:horizontal-spacing: * * The amount of horizontal space between two children. * */ g_object_class_install_property (gobject_class, PROP_HORIZONTAL_SPACING, g_param_spec_uint ("horizontal-spacing", P_("Horizontal spacing"), P_("The amount of horizontal space between two children"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE)); /** * EggSpreadTable:position: * * The position of the child in the spread table. * */ gtk_container_class_install_child_property (container_class, CHILD_PROP_POSITION, g_param_spec_int ("position", P_("Position"), P_("The index of the child in the table"), -1, G_MAXINT, -1, G_PARAM_READABLE | G_PARAM_WRITABLE)); g_type_class_add_private (class, sizeof (EggSpreadTablePrivate)); } static void egg_spread_table_init (EggSpreadTable *spread_table) { EggSpreadTablePrivate *priv; spread_table->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (spread_table, EGG_TYPE_SPREAD_TABLE, EggSpreadTablePrivate); /* We are vertical by default */ priv->orientation = GTK_ORIENTATION_VERTICAL; priv->lines = DEFAULT_LINES; gtk_widget_set_has_window (GTK_WIDGET (spread_table), FALSE); } /***************************************************** * GObectClass * *****************************************************/ static void egg_spread_table_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { EggSpreadTable *table = EGG_SPREAD_TABLE (object); EggSpreadTablePrivate *priv = table->priv; switch (prop_id) { case PROP_ORIENTATION: g_value_set_enum (value, priv->orientation); break; case PROP_LINES: g_value_set_uint (value, egg_spread_table_get_lines (table)); break; case PROP_VERTICAL_SPACING: g_value_set_uint (value, egg_spread_table_get_vertical_spacing (table)); break; case PROP_HORIZONTAL_SPACING: g_value_set_uint (value, egg_spread_table_get_horizontal_spacing (table)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void egg_spread_table_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { EggSpreadTable *table = EGG_SPREAD_TABLE (object); EggSpreadTablePrivate *priv = table->priv; switch (prop_id) { case PROP_ORIENTATION: priv->orientation = g_value_get_enum (value); /* Re-spread_table the children in the new orientation */ gtk_widget_queue_resize (GTK_WIDGET (table)); break; case PROP_LINES: egg_spread_table_set_lines (table, g_value_get_uint (value)); break; case PROP_HORIZONTAL_SPACING: egg_spread_table_set_horizontal_spacing (table, g_value_get_uint (value)); break; case PROP_VERTICAL_SPACING: egg_spread_table_set_vertical_spacing (table, g_value_get_uint (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /***************************************************** * Geometric helper functions for request/allocate * *****************************************************/ static void get_widget_size (GtkWidget *widget, GtkOrientation orientation, gint for_size, gint *min_size, gint *nat_size) { if (orientation == GTK_ORIENTATION_HORIZONTAL) { if (for_size < 0) gtk_widget_get_preferred_width (widget, min_size, nat_size); else gtk_widget_get_preferred_width_for_height (widget, for_size, min_size, nat_size); } else { if (for_size < 0) gtk_widget_get_preferred_height (widget, min_size, nat_size); else gtk_widget_get_preferred_height_for_width (widget, for_size, min_size, nat_size); } } /* This gets the widest child, it is used to reserve * enough space for (columns * widest_child) */ static void get_largest_line_thickness (EggSpreadTable *table, gint *min_thickness, gint *nat_thickness) { EggSpreadTablePrivate *priv = table->priv; GList *list; gint min_size = 0, nat_size = 0; GtkOrientation opposite_orientation; opposite_orientation = OPPOSITE_ORIENTATION (table); for (list = priv->children; list; list = list->next) { GtkWidget *child = list->data; gint child_min, child_nat; if (!gtk_widget_get_visible (child)) continue; get_widget_size (child, opposite_orientation, -1, &child_min, &child_nat); min_size = MAX (min_size, child_min); nat_size = MAX (nat_size, child_nat); } *min_thickness = min_size; *nat_thickness = nat_size; } /* Gets the column width for a given width */ static gint get_line_thickness (EggSpreadTable *table, gint for_thickness) { EggSpreadTablePrivate *priv = table->priv; gint line_thickness; /* Get the available size per line (when vertical, we are getting the column width here) */ line_thickness = for_thickness - (priv->lines -1) * LINE_SPACING (table); line_thickness = line_thickness / priv->lines; return line_thickness; } /* Gets the overall height of a column (length of a line segment) */ static gint get_segment_length (EggSpreadTable *table, gint line_thickness, GList *seg_children) { EggSpreadTablePrivate *priv = table->priv; GList *list; gint size = 0, i = 0; gint spacing; spacing = ITEM_SPACING (table); for (i = 0, list = seg_children; list; list = list->next) { GtkWidget *child = list->data; gint child_nat; if (!gtk_widget_get_visible (child)) continue; get_widget_size (child, priv->orientation, line_thickness, NULL, &child_nat); size += child_nat; if (i != 0) size += spacing; i++; } return size; } static gboolean children_fit_segment_size (EggSpreadTable *table, GList *children, gint line_thickness, gint size, gint *segments, gint *largest_segment_size) { EggSpreadTablePrivate *priv; GList *l; gint segment_size, i; gint spacing; priv = table->priv; spacing = ITEM_SPACING (table); /* reset segments */ memset (segments, 0x0, sizeof (gint) * priv->lines); for (l = children, i = 0; l && i < priv->lines; i++) { segment_size = 0; /* While we still have children to place and * there is space left on this line */ while (l && segment_size < size) { GtkWidget *child = l->data; gint widget_size; if (!gtk_widget_get_visible (child)) { segments[i]++; l = l->next; continue; } get_widget_size (child, priv->orientation, line_thickness, NULL, &widget_size); if (segment_size != 0) segment_size += spacing; segment_size += widget_size; /* Consume this widget in this line segment if it fits the size * or it is alone taller than the whole tested size */ if (segment_size <= size || segments[i] == 0) { *largest_segment_size = MAX (*largest_segment_size, segment_size); segments[i]++; l = l->next; } } } /* If we placed all the widgets in the target size, the size fits. */ return (l == NULL); } /***************************************************** * GtkWidgetClass * *****************************************************/ static GtkSizeRequestMode egg_spread_table_get_request_mode (GtkWidget *widget) { EggSpreadTable *table = EGG_SPREAD_TABLE (widget); EggSpreadTablePrivate *priv = table->priv; if (priv->orientation == GTK_ORIENTATION_VERTICAL) return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH; else return GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT; } static void egg_spread_table_get_width (GtkWidget *widget, gint *minimum_size, gint *natural_size) { EggSpreadTable *table = EGG_SPREAD_TABLE (widget); EggSpreadTablePrivate *priv = table->priv; gint min_width, nat_width; if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { /* Get the width for minimum height */ gint min_height; GTK_WIDGET_GET_CLASS (widget)->get_preferred_height (widget, &min_height, NULL); GTK_WIDGET_GET_CLASS (widget)->get_preferred_width_for_height (widget, min_height, &min_width, &nat_width); } else /* GTK_ORIENTATION_VERTICAL */ { gint min_thickness, nat_thickness; get_largest_line_thickness (table, &min_thickness, &nat_thickness); min_width = min_thickness * priv->lines + LINE_SPACING (table) * (priv->lines - 1); nat_width = nat_thickness * priv->lines + LINE_SPACING (table) * (priv->lines - 1); } #if 0 g_print ("get_width() called; returning min %d and nat %d\n", min_width, nat_width); #endif if (minimum_size) *minimum_size = min_width; if (natural_size) *natural_size = nat_width; } static void egg_spread_table_get_height (GtkWidget *widget, gint *minimum_size, gint *natural_size) { EggSpreadTable *table = EGG_SPREAD_TABLE (widget); EggSpreadTablePrivate *priv = table->priv; gint min_height, nat_height; if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { gint min_thickness, nat_thickness; get_largest_line_thickness (table, &min_thickness, &nat_thickness); min_height = min_thickness * priv->lines + LINE_SPACING (table) * (priv->lines - 1); nat_height = nat_thickness * priv->lines + LINE_SPACING (table) * (priv->lines - 1); } else /* GTK_ORIENTATION_VERTICAL */ { /* Return the height for the minimum width */ gint min_width; GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, &min_width, NULL); GTK_WIDGET_GET_CLASS (widget)->get_preferred_height_for_width (widget, min_width, &min_height, &nat_height); } #if 0 g_print ("get_height() called; returning min %d and nat %d\n", min_height, nat_height); #endif if (minimum_size) *minimum_size = min_height; if (natural_size) *natural_size = nat_height; } static void egg_spread_table_get_height_for_width (GtkWidget *widget, gint width, gint *minimum_height, gint *natural_height) { EggSpreadTable *table = EGG_SPREAD_TABLE (widget); EggSpreadTablePrivate *priv = table->priv; gint min_height = 0, nat_height = 0; if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { /* Just return the minimum/natural height */ GTK_WIDGET_GET_CLASS (widget)->get_preferred_height (widget, &min_height, &nat_height); } else /* GTK_ORIENTATION_VERTICAL */ { /* This will segment the lines evenly and return the overall * lengths of the split segments */ nat_height = min_height = egg_spread_table_build_segments_for_size (table, width, NULL); } #if 0 g_print ("get_height_for_width() called for width %d; returning min %d and nat %d\n", width, min_height, nat_height); #endif if (minimum_height) *minimum_height = min_height; if (natural_height) *natural_height = nat_height; } static void egg_spread_table_get_width_for_height (GtkWidget *widget, gint height, gint *minimum_width, gint *natural_width) { EggSpreadTable *table = EGG_SPREAD_TABLE (widget); EggSpreadTablePrivate *priv = table->priv; gint min_width = 0, nat_width = 0; if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { /* This will segment the lines evenly and return the overall * lengths of the split segments */ nat_width = min_width = egg_spread_table_build_segments_for_size (table, height, NULL); } else /* GTK_ORIENTATION_VERTICAL */ { /* Just return the minimum/natural height */ GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, &min_width, &nat_width); } #if 0 g_print ("get_width_for_height() called for height %d; returning min %d and nat %d\n", height, min_width, nat_width); #endif if (minimum_width) *minimum_width = min_width; if (natural_width) *natural_width = nat_width; } static void allocate_child (EggSpreadTable *table, GtkWidget *child, gint item_offset, gint line_offset, gint item_size, gint line_size) { EggSpreadTablePrivate *priv = table->priv; GtkAllocation widget_allocation; GtkAllocation child_allocation; gtk_widget_get_allocation (GTK_WIDGET (table), &widget_allocation); if (gtk_widget_get_has_window (GTK_WIDGET (table))) { widget_allocation.x = 0; widget_allocation.y = 0; } if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { child_allocation.x = widget_allocation.x + item_offset; child_allocation.y = widget_allocation.y + line_offset; child_allocation.width = item_size; child_allocation.height = line_size; } else /* GTK_ORIENTATION_VERTICAL */ { child_allocation.x = widget_allocation.x + line_offset; child_allocation.y = widget_allocation.y + item_offset; child_allocation.width = line_size; child_allocation.height = item_size; } gtk_widget_size_allocate (child, &child_allocation); } static void egg_spread_table_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { EggSpreadTable *table = EGG_SPREAD_TABLE (widget); EggSpreadTablePrivate *priv = table->priv; GList *list; gint *segments = NULL; gint full_thickness; gint i, j; gint line_offset, item_offset; gint line_thickness; gint line_spacing; gint item_spacing; GTK_WIDGET_CLASS (egg_spread_table_parent_class)->size_allocate (widget, allocation); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) full_thickness = allocation->height; else full_thickness = allocation->width; line_thickness = get_line_thickness (table, full_thickness); line_spacing = LINE_SPACING (table); item_spacing = ITEM_SPACING (table); egg_spread_table_build_segments_for_size (table, full_thickness, &segments); for (list = priv->children, line_offset = 0, i = 0; i < priv->lines; line_offset += line_thickness + line_spacing, i++) { for (j = 0, item_offset = 0; list && j < segments[i]; list = list->next, j++) { GtkWidget *child = list->data; gint child_size; if (!gtk_widget_get_visible (child)) continue; get_widget_size (child, priv->orientation, line_thickness, NULL, &child_size); allocate_child (table, child, item_offset, line_offset, child_size, line_thickness); item_offset += child_size + item_spacing; } } g_free (segments); } /***************************************************** * GtkContainerClass * *****************************************************/ static void egg_spread_table_add (GtkContainer *container, GtkWidget *widget) { egg_spread_table_insert_child (EGG_SPREAD_TABLE (container), widget, -1); } static void egg_spread_table_remove (GtkContainer *container, GtkWidget *widget) { EggSpreadTable *table = EGG_SPREAD_TABLE (container); EggSpreadTablePrivate *priv = table->priv; GList *list; list = g_list_find (priv->children, widget); if (list) { gboolean was_visible = gtk_widget_get_visible (widget); gtk_widget_unparent (widget); priv->children = g_list_delete_link (priv->children, list); if (was_visible && gtk_widget_get_visible (GTK_WIDGET (container))) gtk_widget_queue_resize (GTK_WIDGET (container)); } } static void egg_spread_table_forall (GtkContainer *container, G_GNUC_UNUSED gboolean include_internals, GtkCallback callback, gpointer callback_data) { EggSpreadTable *table = EGG_SPREAD_TABLE (container); EggSpreadTablePrivate *priv = table->priv; GList *list; GtkWidget *child; list = priv->children; while (list) { child = list->data; list = list->next; (* callback) ((GtkWidget*) child, callback_data); } } static GType egg_spread_table_child_type (G_GNUC_UNUSED GtkContainer *container) { return GTK_TYPE_WIDGET; } static void egg_spread_table_get_child_property (GtkContainer *container, GtkWidget *child, guint property_id, GValue *value, GParamSpec *pspec) { EggSpreadTable *table = EGG_SPREAD_TABLE (container); EggSpreadTablePrivate *priv = table->priv; gint position; switch (property_id) { case CHILD_PROP_POSITION: position = g_list_index (priv->children, child); g_value_set_int (value, position); break; default: GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); break; } } static void egg_spread_table_set_child_property (GtkContainer *container, GtkWidget *child, guint property_id, const GValue *value, GParamSpec *pspec) { switch (property_id) { case CHILD_PROP_POSITION: egg_spread_table_reorder_child (EGG_SPREAD_TABLE (container), child, g_value_get_int (value)); break; default: GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); break; } } /***************************************************** * EggSpreadTableClass * *****************************************************/ static gint egg_spread_table_build_segments (EggSpreadTable *table, gint for_size, gint **segments) { EggSpreadTablePrivate *priv; GList *children; gint line_thickness; gint *segment_counts = NULL, *test_counts; gint upper, lower, segment_size, largest_size = 0; gint i, j; priv = table->priv; line_thickness = get_line_thickness (table, for_size); segment_counts = g_new0 (gint, priv->lines); test_counts = g_new0 (gint, priv->lines); /* Start by getting the child list/total size/average size */ children = priv->children; upper = get_segment_length (table, line_thickness, children); lower = upper / priv->lines; /* Handle a single line spread table as a special case */ if (priv->lines == 1) { segment_counts[0] = g_list_length (children); largest_size = upper; } else { /* Start with half way between the average and total height */ segment_size = lower + (upper - lower) / 2; while (segment_size > lower && segment_size < upper) { gint test_largest = 0; if (children_fit_segment_size (table, children, line_thickness, segment_size, test_counts, &test_largest)) { upper = segment_size; segment_size -= (segment_size - lower) / 2; /* Save the last arrangement that 'fit' */ largest_size = test_largest; memcpy (segment_counts, test_counts, sizeof (gint) * priv->lines); } else { lower = segment_size; segment_size += (upper - segment_size) / 2; } } /* Perform some corrections: fill in any trailing columns that are missing widgets */ for (i = 0; i < priv->lines; i++) { /* If this column has no widgets... */ if (!segment_counts[i]) { /* rewind to the last column that had more than 1 widget */ for (j = i - 1; j >= 0; j--) { if (segment_counts[j] > 1) { /* put an available widget in the empty column */ segment_counts[j]--; segment_counts[i]++; break; } } } } } if (segments) *segments = segment_counts; else g_free (segment_counts); g_free (test_counts); return largest_size; } static void egg_spread_table_real_insert_child (EggSpreadTable *table, GtkWidget *child, gint index) { EggSpreadTablePrivate *priv; GList *list; priv = table->priv; list = g_list_find (priv->children, child); g_return_if_fail (list == NULL); priv->children = g_list_insert (priv->children, child, index); gtk_widget_set_parent (child, GTK_WIDGET (table)); } /***************************************************** * API * *****************************************************/ /** * egg_spread_table_new: * @orientation: The #GtkOrientation for the #EggSpreadTable * @lines: The fixed amount of lines to distribute children to. * * Creates a #EggSpreadTable. * * Returns: A new #EggSpreadTable container */ GtkWidget * egg_spread_table_new (GtkOrientation orientation, guint lines) { return (GtkWidget *)g_object_new (EGG_TYPE_SPREAD_TABLE, "orientation", orientation, "lines", lines, NULL); } /** * egg_spread_table_insert_child: * @spread_table: An #EggSpreadTable * @widget: the child #GtkWidget to add * @index: the position in the child list to insert, specify -1 to append to the list. * * Adds a child to an #EggSpreadTable with its packing options set */ void egg_spread_table_insert_child (EggSpreadTable *table, GtkWidget *child, gint index) { g_return_if_fail (EGG_IS_SPREAD_TABLE (table)); g_return_if_fail (GTK_IS_WIDGET (child)); EGG_SPREAD_TABLE_GET_CLASS (table)->insert_child (table, child, index); } /** * egg_spread_table_reorder_child: * @spread_table: An #EggSpreadTable * @widget: The child to reorder * @index: The new child position * * Reorders the child @widget in @spread_table's list of children. */ void egg_spread_table_reorder_child (EggSpreadTable *spread_table, GtkWidget *widget, guint index) { EggSpreadTablePrivate *priv; GList *link; g_return_if_fail (EGG_IS_SPREAD_TABLE (spread_table)); g_return_if_fail (GTK_IS_WIDGET (widget)); priv = spread_table->priv; link = g_list_find (priv->children, widget); g_return_if_fail (link != NULL); if (g_list_position (priv->children, link) != (gint)index) { priv->children = g_list_delete_link (priv->children, link); priv->children = g_list_insert (priv->children, widget, index); gtk_widget_queue_resize (GTK_WIDGET (spread_table)); } } /* All purpose algorithm entry point, this function takes an allocated size * to fit the columns (or rows) and then splits up the child list into * 'n' children per 'segment' in a way that it takes the least space as possible. * * If 'segments' is specified, it will be allocated the array of integers representing * how many children are to be fit per line segment (and must be freed afterwards with g_free()). * * The function returns the required space (the required height for all columns). */ /** * egg_spread_table_build_segments_for_size: * @table: An #EggSpreadTable * @for_size: The hypothetical width if vertically oriented, otherwise the hypothetical height. * @segments: The return location to store the calculated segments, or %NULL. * * This function takes an allocated size to fit the columns (or rows) and then splits * up the child list into 'n' children per 'segment' in a way that it takes the * least space as possible. * * If 'segments' is specified, it will be allocated the array of integers representing * how many children are to be fit per line segment. The array returned in @segments will * be "lines" long and must be freed afterwards with g_free()). * * Returns: The minimum height for a width of 'for_size' if @table is vertically oriented, * otherwise a width for a height of 'for_size'. */ gint egg_spread_table_build_segments_for_size (EggSpreadTable *table, gint for_size, gint **segments) { g_return_val_if_fail (EGG_IS_SPREAD_TABLE (table), 0); return EGG_SPREAD_TABLE_GET_CLASS (table)->build_segments_for_size (table, for_size, segments); } /** * egg_spread_table_get_segments: * @table: A #EggSpreadTable * * Gets the number of children distributed in each line. * * Returns: An array of integers representing how many * widgets are in each line, the returned array * is the length of the amount of lines * (see egg_spread_table_get_lines()). */ gint * egg_spread_table_get_segments (EggSpreadTable *table) { EggSpreadTablePrivate *priv; GtkAllocation allocation; gint *segments = NULL; gint size; g_return_val_if_fail (EGG_IS_SPREAD_TABLE (table), NULL); priv = table->priv; gtk_widget_get_allocation (GTK_WIDGET (table), &allocation); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) size = allocation.height; else size = allocation.width; egg_spread_table_build_segments_for_size (table, size, &segments); return segments; } /** * egg_spread_table_get_child_line: * @table: A #EggSpreadTable * @child: A Child of the @table. * @size: A size in the opposing orientation of @table * * Gets the line index in which @child would be positioned * if @table were to be allocated @size in the opposing * orientation of @table. * * For instance, if the @table is oriented vertically, * this function will return @child's column if @table * were to be allocated @size width. * * Returns: the line index @child would be positioned in * for @size (starting from 0). */ guint egg_spread_table_get_child_line (EggSpreadTable *table, GtkWidget *child, gint size) { EggSpreadTablePrivate *priv; gint *segments = NULL; gint i, child_count, child_idx = 0; GList *l; g_return_val_if_fail (EGG_IS_SPREAD_TABLE (table), 0); g_return_val_if_fail (GTK_IS_WIDGET (child), 0); priv = table->priv; egg_spread_table_build_segments_for_size (table, size, &segments); /* Get child index in list */ l = g_list_find (priv->children, child); g_return_val_if_fail (l != NULL, 0); child_idx = g_list_position (priv->children, l); for (i = 0, child_count = 0; i < priv->lines; i++) { child_count += segments[i]; if (child_idx < child_count) break; } if (i >= priv->lines) g_warning ("[table %p] Crappy lines, child_index %d, child_count %d, children %d\n", table, child_idx, child_count, g_list_length (priv->children)); g_assert (i < priv->lines); g_free (segments); return i; } /** * egg_spread_table_set_lines: * @table: A #EggSpreadTable * @lines: The amount of evenly allocated child segments. * * Sets the fixed amount of lines (rows or columns) to * distribute children to. * * Space will be allocated for all lines even * if there are not enough children to be placed on every * line, for instance if @lines is set to 4 and the table * has only 3 children; then the last line will appear empty. */ void egg_spread_table_set_lines (EggSpreadTable *table, guint lines) { EggSpreadTablePrivate *priv; g_return_if_fail (EGG_IS_SPREAD_TABLE (table)); g_return_if_fail (lines > 0); priv = table->priv; if (priv->lines != lines) { priv->lines = lines; gtk_widget_queue_resize (GTK_WIDGET (table)); g_object_notify (G_OBJECT (table), "lines"); } } /** * egg_spread_table_get_lines: * @table: An #EggSpreadTable * * Gets the fixed amount of lines (rows or columns) to * distribute children to. * * Returns: The amount of lines. */ guint egg_spread_table_get_lines (EggSpreadTable *table) { g_return_val_if_fail (EGG_IS_SPREAD_TABLE (table), 0); return table->priv->lines; } /** * egg_spread_table_set_vertical_spacing: * @table: An #EggSpreadTable * @spacing: The spacing to use. * * Sets the vertical space to add between children. */ void egg_spread_table_set_vertical_spacing (EggSpreadTable *table, guint spacing) { EggSpreadTablePrivate *priv; g_return_if_fail (EGG_IS_SPREAD_TABLE (table)); priv = table->priv; if (priv->vertical_spacing != spacing) { priv->vertical_spacing = spacing; gtk_widget_queue_resize (GTK_WIDGET (table)); g_object_notify (G_OBJECT (table), "vertical-spacing"); } } /** * egg_spread_table_get_vertical_spacing: * @table: An #EggSpreadTable * * Gets the vertical spacing. * * Returns: The vertical spacing. */ guint egg_spread_table_get_vertical_spacing (EggSpreadTable *table) { g_return_val_if_fail (EGG_IS_SPREAD_TABLE (table), 0); return table->priv->vertical_spacing; } /** * egg_spread_table_set_horizontal_spacing: * @table: A #EggSpreadTable * @spacing: The spacing to use. * * Sets the horizontal space to add between children. */ void egg_spread_table_set_horizontal_spacing (EggSpreadTable *table, guint spacing) { EggSpreadTablePrivate *priv; g_return_if_fail (EGG_IS_SPREAD_TABLE (table)); priv = table->priv; if (priv->horizontal_spacing != spacing) { priv->horizontal_spacing = spacing; gtk_widget_queue_resize (GTK_WIDGET (table)); g_object_notify (G_OBJECT (table), "horizontal-spacing"); } } /** * egg_spread_table_get_horizontal_spacing: * @table: A #EggSpreadTable * * Gets the horizontal spacing. * * Returns: The horizontal spacing. */ guint egg_spread_table_get_horizontal_spacing (EggSpreadTable *table) { g_return_val_if_fail (EGG_IS_SPREAD_TABLE (table), 0); return table->priv->horizontal_spacing; } glom-1.22.4/glom/utility_widgets/eggspreadtable/eggmarshalers.c0000644000175000017500000001152212234252646026123 0ustar00murraycmurrayc00000000000000 #ifndef ___egg_marshal_MARSHAL_H__ #define ___egg_marshal_MARSHAL_H__ #include G_BEGIN_DECLS #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) #define g_marshal_value_peek_char(v) g_value_get_char (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) #define g_marshal_value_peek_long(v) g_value_get_long (v) #define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) #define g_marshal_value_peek_int64(v) g_value_get_int64 (v) #define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) #define g_marshal_value_peek_enum(v) g_value_get_enum (v) #define g_marshal_value_peek_flags(v) g_value_get_flags (v) #define g_marshal_value_peek_float(v) g_value_get_float (v) #define g_marshal_value_peek_double(v) g_value_get_double (v) #define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) #define g_marshal_value_peek_param(v) g_value_get_param (v) #define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) #define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) #define g_marshal_value_peek_object(v) g_value_get_object (v) #define g_marshal_value_peek_variant(v) g_value_get_variant (v) #else /* !G_ENABLE_DEBUG */ /* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. * Do not access GValues directly in your code. Instead, use the * g_value_get_*() functions */ #define g_marshal_value_peek_boolean(v) (v)->data[0].v_int #define g_marshal_value_peek_char(v) (v)->data[0].v_int #define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint #define g_marshal_value_peek_int(v) (v)->data[0].v_int #define g_marshal_value_peek_uint(v) (v)->data[0].v_uint #define g_marshal_value_peek_long(v) (v)->data[0].v_long #define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong #define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 #define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 #define g_marshal_value_peek_enum(v) (v)->data[0].v_long #define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong #define g_marshal_value_peek_float(v) (v)->data[0].v_float #define g_marshal_value_peek_double(v) (v)->data[0].v_double #define g_marshal_value_peek_string(v) (v)->data[0].v_pointer #define g_marshal_value_peek_param(v) (v)->data[0].v_pointer #define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer #define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer #define g_marshal_value_peek_object(v) (v)->data[0].v_pointer #define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer #endif /* !G_ENABLE_DEBUG */ /* BOOLEAN:OBJECT,POINTER (./eggmarshalers.list:1) */ extern void _egg_marshal_BOOLEAN__OBJECT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); void _egg_marshal_BOOLEAN__OBJECT_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__OBJECT_POINTER) (gpointer data1, gpointer arg_1, gpointer arg_2, gpointer data2); register GMarshalFunc_BOOLEAN__OBJECT_POINTER callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__OBJECT_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), data2); g_value_set_boolean (return_value, v_return); } G_END_DECLS #endif /* ___egg_marshal_MARSHAL_H__ */ glom-1.22.4/glom/utility_widgets/eggspreadtable/eggspreadtable.h0000644000175000017500000000750612234252646026264 0ustar00murraycmurrayc00000000000000/* * Copyright (C) 2010 Openismus GmbH * * Authors: * Tristan Van Berkom * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef __EGG_SPREAD_TABLE_H__ #define __EGG_SPREAD_TABLE_H__ #include G_BEGIN_DECLS #define EGG_TYPE_SPREAD_TABLE (egg_spread_table_get_type ()) #define EGG_SPREAD_TABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SPREAD_TABLE, EggSpreadTable)) #define EGG_SPREAD_TABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SPREAD_TABLE, EggSpreadTableClass)) #define EGG_IS_SPREAD_TABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SPREAD_TABLE)) #define EGG_IS_SPREAD_TABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SPREAD_TABLE)) #define EGG_SPREAD_TABLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SPREAD_TABLE, EggSpreadTableClass)) typedef struct _EggSpreadTable EggSpreadTable; typedef struct _EggSpreadTablePrivate EggSpreadTablePrivate; typedef struct _EggSpreadTableClass EggSpreadTableClass; struct _EggSpreadTable { GtkContainer parent_instance; /*< private >*/ EggSpreadTablePrivate *priv; }; struct _EggSpreadTableClass { GtkContainerClass parent_class; gint (* build_segments_for_size) (EggSpreadTable *table, gint for_size, gint **segments); void ( *insert_child) (EggSpreadTable *table, GtkWidget *child, gint index); }; GType egg_spread_table_get_type (void) G_GNUC_CONST; GtkWidget *egg_spread_table_new (GtkOrientation orientation, guint lines); void egg_spread_table_insert_child (EggSpreadTable *table, GtkWidget *child, gint index); void egg_spread_table_reorder_child (EggSpreadTable *table, GtkWidget *widget, guint index); gint *egg_spread_table_get_segments (EggSpreadTable *table); gint egg_spread_table_build_segments_for_size (EggSpreadTable *table, gint for_size, gint **segments); guint egg_spread_table_get_child_line (EggSpreadTable *table, GtkWidget *child, gint size); void egg_spread_table_set_lines (EggSpreadTable *table, guint lines); guint egg_spread_table_get_lines (EggSpreadTable *table); void egg_spread_table_set_horizontal_spacing (EggSpreadTable *table, guint spacing); guint egg_spread_table_get_horizontal_spacing (EggSpreadTable *table); void egg_spread_table_set_vertical_spacing (EggSpreadTable *table, guint spacing); guint egg_spread_table_get_vertical_spacing (EggSpreadTable *table); G_END_DECLS #endif /* __EGG_SPREAD_TABLE_H__ */ glom-1.22.4/glom/utility_widgets/layouttoolbar.cc0000644000175000017500000000534612234776363023407 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007, 2008 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "layouttoolbar.h" #include #include #include #include "layoutwidgetbase.h" namespace Glom { LayoutToolbar::LayoutToolbar() : m_group_items(_("Items")), m_group_containers(_("Containers")), m_drag_group("glom-group.png", LayoutWidgetBase::TYPE_GROUP, _("Group"), _("Drag this to the layout to add a new group.")), m_drag_notebook("glom-notebook.png", LayoutWidgetBase::TYPE_NOTEBOOK, _("Notebook"), _("Drag this to the layout to add a new notebook.")), m_drag_item("glom-field.png", LayoutWidgetBase::TYPE_FIELD, _("Database Field"), _("Drag this to the layout to add a new database field.")), m_drag_portal("glom-related-records.png", LayoutWidgetBase::TYPE_PORTAL, _("Related Records"), _("Drag this to the layout to add a new Related Record.")), m_drag_button("glom-button.png", LayoutWidgetBase::TYPE_BUTTON, _("Button"), _("Drag this to the layout to add a new button.")), m_drag_text("glom-text.png", LayoutWidgetBase::TYPE_TEXT, _("Group"), _("Drag this to the layout to add a new static text box.")), m_drag_image("glom-image.png", LayoutWidgetBase::TYPE_IMAGE, _("Image"), _("Drag this to the layout to add a new static image.")) { // Looks ugly otherwise: set_size_request(100, 200); //TODO: Add a drag item for the related records item. //Note for translators: These are container layout items, containing child layout items, like container widgets in GTK+. m_group_containers.add(m_drag_group); m_group_containers.add(m_drag_notebook); //Note for translators: These are layout items, like widgets in GTK+. m_group_items.add(m_drag_portal); m_group_items.add(m_drag_item); m_group_items.add(m_drag_button); m_group_items.add(m_drag_text); m_group_items.add(m_drag_image); add(m_group_containers); add(m_group_items); set_drag_source(); show_all_children(); } LayoutToolbar::~LayoutToolbar() { } } // namespace Glom glom-1.22.4/glom/utility_widgets/imageglom.h0000644000175000017500000001041612234776363022304 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_IMAGE_GLOM_H #define GLOM_UTILITY_WIDGETS_IMAGE_GLOM_H #include #include #include #include #include "layoutwidgetfield.h" #include #include #include #include namespace Glom { class AppWindow; class ImageGlom : public Gtk::EventBox, public LayoutWidgetField { public: ImageGlom(); explicit ImageGlom(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~ImageGlom(); virtual void set_layout_item(const sharedptr& layout_item, const Glib::ustring& table_name); virtual void set_value(const Gnome::Gda::Value& value); virtual Gnome::Gda::Value get_value() const; virtual bool get_has_original_data() const; //Optionally use this instead of set_value(), to avoid creating an unnecessary Value. //void set_pixbuf(const Glib::RefPtr& pixbuf); void do_choose_image(); void set_read_only(bool read_only = true); void on_ev_job_finished(EvJob* job); private: void init(); virtual void on_size_allocate(Gtk::Allocation& allocation); virtual bool on_button_press_event(GdkEventButton *event); void on_menupopup_activate_open_file(); void on_menupopup_activate_open_file_with(); void on_menupopup_activate_save_file(); void on_menupopup_activate_select_file(); void on_menupopup_activate_copy(); void on_menupopup_activate_paste(); void on_menupopup_activate_clear(); void on_clipboard_get(Gtk::SelectionData& selection_data, guint /* info */); void on_clipboard_clear(); void on_clipboard_received_image(const Glib::RefPtr& pixbuf); virtual AppWindow* get_appwindow() const; void setup_menu_usermode(); void show_image_data(); const GdaBinary* get_binary() const; //Get a pixbuf scaled down to the current size allocation: Glib::RefPtr get_scaled_image(); Glib::ustring save_to_temp_file(bool show_progress = true); bool save_file(const Glib::ustring& uri); bool save_file_sync(const Glib::ustring& uri); void open_with(const Glib::RefPtr& app_info = Glib::RefPtr()); Glib::ustring get_mime_type() const; static void fill_evince_supported_mime_types(); static void fill_gdkpixbuf_supported_mime_types(); mutable Gnome::Gda::Value m_original_data; // Original file data (mutable so that we can create it in get_value() if it does not exist yet) Gtk::Frame m_frame; //For anything supported by Evince: EvView* m_ev_view; EvDocumentModel* m_ev_document_model; //For anything supported by GdkPixbuf, //or for representative thumbnails and icons: Gtk::Image m_image; Glib::RefPtr m_pixbuf_original; //Only stored temporarily, because it could be big. Glib::RefPtr m_pixbuf_clipboard; //When copy is used, store it here until it is pasted. Gtk::Menu* m_pMenuPopup_UserMode; Glib::RefPtr m_refActionGroup_UserModePopup; Glib::RefPtr m_refUIManager_UserModePopup; Glib::RefPtr m_refActionOpenFile, m_refActionOpenFileWith, m_refActionSaveFile, m_refActionSelectFile, m_refActionCopy, m_refActionPaste, m_refActionClear; bool m_read_only; typedef std::vector type_vec_ustrings; static type_vec_ustrings m_evince_supported_mime_types; static type_vec_ustrings m_gdkpixbuf_supported_mime_types; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_COMBOENTRY_GLOM_H glom-1.22.4/glom/utility_widgets/layoutwidgetutils.h0000644000175000017500000000314012234776363024141 0ustar00murraycmurrayc00000000000000/* * glom * * glom is free software. * * You may redistribute it and/or modify it under the terms of the * GNU General Public License, as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * glom is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glom. If not, write to: * The Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301, USA. */ #ifndef GLOM_UTILITY_WIDGETS_LAYOUT_WIDGET_UTILS_H #define GLOM_UTILITY_WIDGETS_LAYOUT_WIDGET_UTILS_H #include #include #include "layoutwidgetbase.h" #include namespace Glom { class LayoutWidgetUtils : public LayoutWidgetBase { public: LayoutWidgetUtils(); virtual ~LayoutWidgetUtils(); protected: void setup_util_menu(); Gtk::Menu* m_pPopupMenuUtils; #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void on_menu_properties_activate(); // This one is implemented here: virtual void on_menu_delete_activate(); #endif // !GLOM_ENABLE_CLIENT_ONLY //private: Glib::RefPtr m_refUtilProperties; Glib::RefPtr m_refUtilDelete; Glib::RefPtr m_refActionGroup; Glib::RefPtr m_refUIManager; }; } // namespace Glom #endif // GLOM_UTILITY_WIDGETS_LAYOUT_WIDGET_UTILS_H glom-1.22.4/glom/utility_widgets/cellrendererlist.cc0000644000175000017500000000342112234252646024032 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "cellrendererlist.h" namespace Glom { CellRendererList::CellRendererList() : Glib::ObjectBase(0) //Mark this class as gtkmmproc-generated, rather than a custom class, to allow vfunc optimisations. //TODO: This should not be necessary - our gtkmm callbacks are somehow preventing the popup from appearing. { m_refModel = Gtk::ListStore::create(m_model_columns); set_property("model", m_refModel); set_property("text-column", 0); //This must be a text column, in m_refModel. set_property("editable", true); //It would be useless if we couldn't edit it. } CellRendererList::~CellRendererList() { } void CellRendererList::remove_all_list_items() { if(m_refModel) m_refModel->clear(); } void CellRendererList::append_list_item(const Glib::ustring& text) { Gtk::TreeModel::Row row = *(m_refModel->append()); row[m_model_columns.m_col_choice] = text; } void CellRendererList::set_restrict_values_to_list(bool val) { set_property("has-entry", static_cast(!val)); } } //namespace Glom glom-1.22.4/glom/utility_widgets/notebooklabelglom.h0000644000175000017500000000353712234776363024050 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_NOTEBOOK_LABEL_GLOM_H #define GLOM_UTILITY_WIDGETS_NOTEBOOK_LABEL_GLOM_H #include "notebookglom.h" #include #include #include #include namespace Glom { class AppWindow; class NotebookLabel : public Gtk::EventBox { public: explicit NotebookLabel(NotebookGlom* notebook); explicit NotebookLabel(const Glib::ustring& label, NotebookGlom* notebook); virtual ~NotebookLabel(); void set_label(const Glib::ustring& title); private: void init(); virtual AppWindow* get_appwindow(); Gtk::Label m_label; NotebookGlom* m_notebook; void setup_menu(); Gtk::Menu* m_pPopupMenu; void on_menu_new_group_activate(); void on_menu_delete_activate(); virtual bool on_button_press_event(GdkEventButton *event); Glib::RefPtr m_refNewGroup; Glib::RefPtr m_refDelete; Glib::RefPtr m_refActionGroup; Glib::RefPtr m_refUIManager; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_NOTEBOOK_LABEL_GLOM_H glom-1.22.4/glom/utility_widgets/layouttoolbarbutton.cc0000644000175000017500000000370712234776363024642 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007, 2008 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "layouttoolbarbutton.h" #include namespace Glom { LayoutToolbarButton::LayoutToolbarButton(const std::string& icon_name, LayoutWidgetBase::enumType type, const Glib::ustring& title, const Glib::ustring& tooltip) : Gtk::ToolButton( *(Gtk::manage (new Gtk::Image(Utils::get_icon_path(icon_name)))) ) { m_type = type; g_object_set_data(G_OBJECT(gobj()), "glom-type", GINT_TO_POINTER(type)); std::vector targetentries; targetentries.push_back(Gtk::TargetEntry(get_target())); drag_source_set(targetentries, Gdk::MODIFIER_MASK, Gdk::ACTION_COPY | Gdk::ACTION_MOVE); set_tooltip_text(tooltip); set_label(title); } LayoutToolbarButton::~LayoutToolbarButton() { } void LayoutToolbarButton::on_drag_data_get(const Glib::RefPtr&, Gtk::SelectionData& selection_data, guint, guint) { selection_data.set(8, (guint8*)(&m_type), 4); } void LayoutToolbarButton::on_drag_begin(const Glib::RefPtr& drag_context) { drag_context->set_icon(dynamic_cast(get_icon_widget())->get_pixbuf(), 0, 0); } } // namespace Glom glom-1.22.4/glom/utility_widgets/dialog_properties.h0000644000175000017500000000440312234252646024046 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_PROPERTIES_H #define GLOM_DIALOG_PROPERTIES_H #include #include #include #include #include namespace Glom { class Dialog_Properties : public Gtk::Window { public: Dialog_Properties(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Properties(); //Add a widget (probably a container) to the top half of the dialog: virtual void add(Gtk::Widget& widget); virtual void set_modified(bool modified = true); //int page_number typedef sigc::signal type_signal_apply; type_signal_apply signal_apply(); protected: //Signal handlers: void on_button_save(); void on_button_cancel(); void on_anything_changed(); virtual void on_adddel_user_changed(const Gtk::TreeModel::iterator& /* iter */, guint /* col */); /// Disable/enable other controls when a control is selected. virtual void enforce_constraints(); void on_foreach_connect(Gtk::Widget& widget); void widget_connect_changed_signal(Gtk::Widget& widget); void set_blocked(bool val = true); type_signal_apply m_signal_apply; //Child widgets: //PlaceHolder m_Frame; //For the top-half. See add(). Gtk::Button* m_pButton_Save; Gtk::Button* m_pButton_Cancel; bool m_block; bool m_modified; //typedef std::list type_listConnections; //Store the connections so that we can remove them later. }; } //namespace Glom #endif //GLOM_DIALOG_PROPERTIES_H glom-1.22.4/glom/utility_widgets/gimpruler/0000755000175000017500000000000012235000126022150 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/utility_widgets/gimpruler/gimpruler.c0000644000175000017500000011431112234776363024351 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #include "config.h" #include #include #include "libgimpbase/gimpbase.h" #include "libgimpmath/gimpmath.h" /* A change for Glom: #include "gimpwidgetstypes.h" */ #include "gimpruler.h" /** * SECTION: gimpruler * @title: GimpRuler * @short_description: A ruler widget with configurable unit and orientation. * * A ruler widget with configurable unit and orientation. **/ #define DEFAULT_RULER_FONT_SCALE PANGO_SCALE_SMALL #define MINIMUM_INCR 5 enum { PROP_0, PROP_ORIENTATION, PROP_UNIT, PROP_LOWER, PROP_UPPER, PROP_POSITION, PROP_MAX_SIZE }; /* All distances below are in 1/72nd's of an inch. (According to * Adobe that's a point, but points are really 1/72.27 in.) */ typedef struct { GtkOrientation orientation; GimpUnit unit; gdouble lower; gdouble upper; gdouble position; gdouble max_size; GdkWindow *input_window; cairo_surface_t *backing_store; PangoLayout *layout; gdouble font_scale; gint xsrc; gint ysrc; GList *track_widgets; } GimpRulerPrivate; #define GIMP_RULER_GET_PRIVATE(ruler) \ G_TYPE_INSTANCE_GET_PRIVATE (ruler, GIMP_TYPE_RULER, GimpRulerPrivate) static const struct { const gdouble ruler_scale[16]; const gint subdivide[5]; } ruler_metric = { { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 25000, 50000, 100000 }, { 1, 5, 10, 50, 100 } }; static void gimp_ruler_dispose (GObject *object); static void gimp_ruler_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void gimp_ruler_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void gimp_ruler_realize (GtkWidget *widget); static void gimp_ruler_unrealize (GtkWidget *widget); static void gimp_ruler_map (GtkWidget *widget); static void gimp_ruler_unmap (GtkWidget *widget); static void gimp_ruler_size_allocate (GtkWidget *widget, GtkAllocation *allocation); static void gimp_ruler_get_preferred_width (GtkWidget *widget, gint *minimum_width, gint *natural_width); static void gimp_ruler_get_preferred_height (GtkWidget *widget, gint *minimum_height, gint *natural_height); static void gimp_ruler_style_updated (GtkWidget *widget); static gboolean gimp_ruler_motion_notify (GtkWidget *widget, GdkEventMotion *event); static gboolean gimp_ruler_draw (GtkWidget *widget, cairo_t *cr); static void gimp_ruler_draw_ticks (GimpRuler *ruler); static void gimp_ruler_draw_pos (GimpRuler *ruler); static void gimp_ruler_make_pixmap (GimpRuler *ruler); static PangoLayout * gimp_ruler_get_layout (GtkWidget *widget, const gchar *text); G_DEFINE_TYPE (GimpRuler, gimp_ruler, GTK_TYPE_WIDGET) #define parent_class gimp_ruler_parent_class static void gimp_ruler_class_init (GimpRulerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->dispose = gimp_ruler_dispose; object_class->set_property = gimp_ruler_set_property; object_class->get_property = gimp_ruler_get_property; widget_class->realize = gimp_ruler_realize; widget_class->unrealize = gimp_ruler_unrealize; widget_class->map = gimp_ruler_map; widget_class->unmap = gimp_ruler_unmap; widget_class->get_preferred_width = gimp_ruler_get_preferred_width; widget_class->get_preferred_height = gimp_ruler_get_preferred_height; widget_class->size_allocate = gimp_ruler_size_allocate; widget_class->style_updated = gimp_ruler_style_updated; widget_class->motion_notify_event = gimp_ruler_motion_notify; widget_class->draw = gimp_ruler_draw; g_type_class_add_private (object_class, sizeof (GimpRulerPrivate)); g_object_class_install_property (object_class, PROP_ORIENTATION, g_param_spec_enum ("orientation", "Orientation", "The orientation of the ruler", GTK_TYPE_ORIENTATION, GTK_ORIENTATION_HORIZONTAL, GIMP_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_LOWER, gimp_param_spec_unit ("unit", "Unit", "Unit of ruler", TRUE, TRUE, GIMP_UNIT_PIXEL, GIMP_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_LOWER, g_param_spec_double ("lower", "Lower", "Lower limit of ruler", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, GIMP_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_UPPER, g_param_spec_double ("upper", "Upper", "Upper limit of ruler", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, GIMP_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_POSITION, g_param_spec_double ("position", "Position", "Position of mark on the ruler", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, GIMP_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_MAX_SIZE, g_param_spec_double ("max-size", "Max Size", "Maximum size of the ruler", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, GIMP_PARAM_READWRITE)); gtk_widget_class_install_style_property (widget_class, g_param_spec_double ("font-scale", NULL, NULL, 0.0, G_MAXDOUBLE, DEFAULT_RULER_FONT_SCALE, GIMP_PARAM_READABLE)); } static void gimp_ruler_init (GimpRuler *ruler) { GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); gtk_widget_set_has_window (GTK_WIDGET (ruler), FALSE); priv->orientation = GTK_ORIENTATION_HORIZONTAL; priv->unit = GIMP_PIXELS; priv->lower = 0; priv->upper = 0; priv->position = 0; priv->max_size = 0; priv->backing_store = NULL; priv->font_scale = DEFAULT_RULER_FONT_SCALE; } static void gimp_ruler_dispose (GObject *object) { GimpRuler *ruler = GIMP_RULER (object); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); while (priv->track_widgets) gimp_ruler_remove_track_widget (ruler, priv->track_widgets->data); G_OBJECT_CLASS (parent_class)->dispose (object); } static void gimp_ruler_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GimpRuler *ruler = GIMP_RULER (object); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); switch (prop_id) { case PROP_ORIENTATION: priv->orientation = g_value_get_enum (value); gtk_widget_queue_resize (GTK_WIDGET (ruler)); break; case PROP_UNIT: gimp_ruler_set_unit (ruler, g_value_get_int (value)); break; case PROP_LOWER: gimp_ruler_set_range (ruler, g_value_get_double (value), priv->upper, priv->max_size); break; case PROP_UPPER: gimp_ruler_set_range (ruler, priv->lower, g_value_get_double (value), priv->max_size); break; case PROP_POSITION: gimp_ruler_set_position (ruler, g_value_get_double (value)); break; case PROP_MAX_SIZE: gimp_ruler_set_range (ruler, priv->lower, priv->upper, g_value_get_double (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gimp_ruler_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GimpRuler *ruler = GIMP_RULER (object); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); switch (prop_id) { case PROP_ORIENTATION: g_value_set_enum (value, priv->orientation); break; case PROP_UNIT: g_value_set_int (value, priv->unit); break; case PROP_LOWER: g_value_set_double (value, priv->lower); break; case PROP_UPPER: g_value_set_double (value, priv->upper); break; case PROP_POSITION: g_value_set_double (value, priv->position); break; case PROP_MAX_SIZE: g_value_set_double (value, priv->max_size); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /** * gimp_ruler_new: * @orientation: the ruler's orientation. * * Creates a new ruler. * * Return value: a new #GimpRuler widget. * * Since: GIMP 2.8 **/ GtkWidget * gimp_ruler_new (GtkOrientation orientation) { return g_object_new (GIMP_TYPE_RULER, "orientation", orientation, NULL); } static void gimp_ruler_update_position (GimpRuler *ruler, gdouble x, gdouble y) { GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); GtkAllocation allocation; gdouble lower; gdouble upper; gtk_widget_get_allocation (GTK_WIDGET (ruler), &allocation); gimp_ruler_get_range (ruler, &lower, &upper, NULL); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { gimp_ruler_set_position (ruler, lower + (upper - lower) * x / allocation.width); } else { gimp_ruler_set_position (ruler, lower + (upper - lower) * y / allocation.height); } } /* Returns TRUE if a translation should be done */ static gboolean gtk_widget_get_translation_to_window (GtkWidget *widget, GdkWindow *window, int *x, int *y) { GdkWindow *w, *widget_window; if (! gtk_widget_get_has_window (widget)) { GtkAllocation allocation; gtk_widget_get_allocation (widget, &allocation); *x = -allocation.x; *y = -allocation.y; } else { *x = 0; *y = 0; } widget_window = gtk_widget_get_window (widget); for (w = window; w && w != widget_window; w = gdk_window_get_effective_parent (w)) { gdouble px, py; gdk_window_coords_to_parent (w, *x, *y, &px, &py); *x += px; *y += py; } if (w == NULL) { *x = 0; *y = 0; return FALSE; } return TRUE; } static void gimp_ruler_event_to_widget_coords (GtkWidget *widget, GdkWindow *window, gdouble event_x, gdouble event_y, gint *widget_x, gint *widget_y) { gint tx, ty; if (gtk_widget_get_translation_to_window (widget, window, &tx, &ty)) { event_x += tx; event_y += ty; } *widget_x = event_x; *widget_y = event_y; } static gboolean gimp_ruler_track_widget_motion_notify (GtkWidget *widget, GdkEventMotion *mevent, GimpRuler *ruler) { gint widget_x; gint widget_y; gint ruler_x; gint ruler_y; widget = gtk_get_event_widget ((GdkEvent *) mevent); gimp_ruler_event_to_widget_coords (widget, mevent->window, mevent->x, mevent->y, &widget_x, &widget_y); if (gtk_widget_translate_coordinates (widget, GTK_WIDGET (ruler), widget_x, widget_y, &ruler_x, &ruler_y)) { gimp_ruler_update_position (ruler, ruler_x, ruler_y); } return FALSE; } /** * gimp_ruler_add_track_widget: * @ruler: a #GimpRuler * @widget: the track widget to add * * Adds a "track widget" to the ruler. The ruler will connect to * GtkWidget:motion-notify-event: on the track widget and update its * position marker accordingly. The marker is correctly updated also * for the track widget's children, regardless of whether they are * ordinary children of off-screen children. * * Since: GIMP 2.8 */ void gimp_ruler_add_track_widget (GimpRuler *ruler, GtkWidget *widget) { GimpRulerPrivate *priv; g_return_if_fail (GIMP_IS_RULER (ruler)); g_return_if_fail (GTK_IS_WIDGET (ruler)); priv = GIMP_RULER_GET_PRIVATE (ruler); g_return_if_fail (g_list_find (priv->track_widgets, widget) == NULL); priv->track_widgets = g_list_prepend (priv->track_widgets, widget); g_signal_connect (widget, "motion-notify-event", G_CALLBACK (gimp_ruler_track_widget_motion_notify), ruler); g_signal_connect_swapped (widget, "destroy", G_CALLBACK (gimp_ruler_remove_track_widget), ruler); } /** * gimp_ruler_remove_track_widget: * @ruler: a #GimpRuler * @widget: the track widget to remove * * Removes a previously added track widget from the ruler. See * gimp_ruler_add_track_widget(). * * Since: GIMP 2.8 */ void gimp_ruler_remove_track_widget (GimpRuler *ruler, GtkWidget *widget) { GimpRulerPrivate *priv; g_return_if_fail (GIMP_IS_RULER (ruler)); g_return_if_fail (GTK_IS_WIDGET (ruler)); priv = GIMP_RULER_GET_PRIVATE (ruler); g_return_if_fail (g_list_find (priv->track_widgets, widget) != NULL); priv->track_widgets = g_list_remove (priv->track_widgets, widget); g_signal_handlers_disconnect_by_func (widget, gimp_ruler_track_widget_motion_notify, ruler); g_signal_handlers_disconnect_by_func (widget, gimp_ruler_remove_track_widget, ruler); } /** * gimp_ruler_set_unit: * @ruler: a #GimpRuler * @unit: the #GimpUnit to set the ruler to * * This sets the unit of the ruler. * * Since: GIMP 2.8 */ void gimp_ruler_set_unit (GimpRuler *ruler, GimpUnit unit) { GimpRulerPrivate *priv; g_return_if_fail (GIMP_IS_RULER (ruler)); priv = GIMP_RULER_GET_PRIVATE (ruler); if (priv->unit != unit) { priv->unit = unit; g_object_notify (G_OBJECT (ruler), "unit"); gtk_widget_queue_draw (GTK_WIDGET (ruler)); } } /** * gimp_ruler_get_unit: * @ruler: a #GimpRuler * * Return value: the unit currently used in the @ruler widget. * * Since: GIMP 2.8 **/ GimpUnit gimp_ruler_get_unit (GimpRuler *ruler) { g_return_val_if_fail (GIMP_IS_RULER (ruler), 0); return GIMP_RULER_GET_PRIVATE (ruler)->unit; } /** * gimp_ruler_set_position: * @ruler: a #GimpRuler * @position: the position to set the ruler to * * This sets the position of the ruler. * * Since: GIMP 2.8 */ void gimp_ruler_set_position (GimpRuler *ruler, gdouble position) { GimpRulerPrivate *priv; g_return_if_fail (GIMP_IS_RULER (ruler)); priv = GIMP_RULER_GET_PRIVATE (ruler); if (priv->position != position) { priv->position = position; g_object_notify (G_OBJECT (ruler), "position"); gimp_ruler_draw_pos (ruler); } } /** * gimp_ruler_get_position: * @ruler: a #GimpRuler * * Return value: the current position of the @ruler widget. * * Since: GIMP 2.8 **/ gdouble gimp_ruler_get_position (GimpRuler *ruler) { g_return_val_if_fail (GIMP_IS_RULER (ruler), 0.0); return GIMP_RULER_GET_PRIVATE (ruler)->position; } /** * gimp_ruler_set_range: * @ruler: a #GimpRuler * @lower: the lower limit of the ruler * @upper: the upper limit of the ruler * @max_size: the maximum size of the ruler used when calculating the space to * leave for the text * * This sets the range of the ruler. * * Since: GIMP 2.8 */ void gimp_ruler_set_range (GimpRuler *ruler, gdouble lower, gdouble upper, gdouble max_size) { GimpRulerPrivate *priv; g_return_if_fail (GIMP_IS_RULER (ruler)); priv = GIMP_RULER_GET_PRIVATE (ruler); g_object_freeze_notify (G_OBJECT (ruler)); if (priv->lower != lower) { priv->lower = lower; g_object_notify (G_OBJECT (ruler), "lower"); } if (priv->upper != upper) { priv->upper = upper; g_object_notify (G_OBJECT (ruler), "upper"); } if (priv->max_size != max_size) { priv->max_size = max_size; g_object_notify (G_OBJECT (ruler), "max-size"); } g_object_thaw_notify (G_OBJECT (ruler)); gtk_widget_queue_draw (GTK_WIDGET (ruler)); } /** * gimp_ruler_get_range: * @ruler: a #GimpRuler * @lower: location to store lower limit of the ruler, or %NULL * @upper: location to store upper limit of the ruler, or %NULL * @max_size: location to store the maximum size of the ruler used when * calculating the space to leave for the text, or %NULL. * * Retrieves values indicating the range and current position of a #GimpRuler. * See gimp_ruler_set_range(). * * Since: GIMP 2.8 **/ void gimp_ruler_get_range (GimpRuler *ruler, gdouble *lower, gdouble *upper, gdouble *max_size) { GimpRulerPrivate *priv; g_return_if_fail (GIMP_IS_RULER (ruler)); priv = GIMP_RULER_GET_PRIVATE (ruler); if (lower) *lower = priv->lower; if (upper) *upper = priv->upper; if (max_size) *max_size = priv->max_size; } static void gimp_ruler_realize (GtkWidget *widget) { GimpRuler *ruler = GIMP_RULER (widget); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); GtkAllocation allocation; GdkWindowAttr attributes; gint attributes_mask; GTK_WIDGET_CLASS (gimp_ruler_parent_class)->realize (widget); gtk_widget_get_allocation (widget, &allocation); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes.wclass = GDK_INPUT_ONLY; attributes.event_mask = (gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); attributes_mask = GDK_WA_X | GDK_WA_Y; priv->input_window = gdk_window_new (gtk_widget_get_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (priv->input_window, ruler); gimp_ruler_make_pixmap (ruler); } static void gimp_ruler_unrealize (GtkWidget *widget) { GimpRuler *ruler = GIMP_RULER (widget); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); if (priv->backing_store) { cairo_surface_destroy (priv->backing_store); priv->backing_store = NULL; } if (priv->layout) { g_object_unref (priv->layout); priv->layout = NULL; } if (priv->input_window) { gdk_window_destroy (priv->input_window); priv->input_window = NULL; } GTK_WIDGET_CLASS (gimp_ruler_parent_class)->unrealize (widget); } static void gimp_ruler_map (GtkWidget *widget) { GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (widget); GTK_WIDGET_CLASS (parent_class)->map (widget); if (priv->input_window) gdk_window_show (priv->input_window); } static void gimp_ruler_unmap (GtkWidget *widget) { GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (widget); if (priv->input_window) gdk_window_hide (priv->input_window); GTK_WIDGET_CLASS (parent_class)->unmap (widget); } static void gimp_ruler_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GimpRuler *ruler = GIMP_RULER (widget); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); GtkAllocation widget_allocation; gboolean resized; gtk_widget_get_allocation (widget, &widget_allocation); resized = (widget_allocation.width != allocation->width || widget_allocation.height != allocation->height); gtk_widget_set_allocation (widget, allocation); if (gtk_widget_get_realized (widget)) { gdk_window_move_resize (priv->input_window, allocation->x, allocation->y, allocation->width, allocation->height); if (resized) gimp_ruler_make_pixmap (ruler); } } static void gimp_ruler_size_request (GtkWidget *widget, GtkRequisition *requisition) { GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (widget); GtkStyleContext *context = gtk_widget_get_style_context (widget); PangoLayout *layout; PangoRectangle ink_rect; GtkBorder border; gint size; layout = gimp_ruler_get_layout (widget, "0123456789"); pango_layout_get_pixel_extents (layout, &ink_rect, NULL); size = 2 + ink_rect.height * 1.7; gtk_style_context_get_border (context, 0, &border); requisition->width = border.left + border.right; requisition->height = border.top + border.bottom; if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { requisition->width += 1; requisition->height += size; } else { requisition->width += size; requisition->height += 1; } } static void gimp_ruler_get_preferred_width (GtkWidget *widget, gint *minimum_width, gint *natural_width) { GtkRequisition requisition; gimp_ruler_size_request (widget, &requisition); *minimum_width = *natural_width = requisition.width; } static void gimp_ruler_get_preferred_height (GtkWidget *widget, gint *minimum_height, gint *natural_height) { GtkRequisition requisition; gimp_ruler_size_request (widget, &requisition); *minimum_height = *natural_height = requisition.height; } static void gimp_ruler_style_updated (GtkWidget *widget) { GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (widget); GTK_WIDGET_CLASS (gimp_ruler_parent_class)->style_updated (widget); gtk_widget_style_get (widget, "font-scale", &priv->font_scale, NULL); if (priv->layout) { g_object_unref (priv->layout); priv->layout = NULL; } } static gboolean gimp_ruler_motion_notify (GtkWidget *widget, GdkEventMotion *event) { GimpRuler *ruler = GIMP_RULER (widget); gdk_event_request_motions (event); gimp_ruler_update_position (ruler, event->x, event->y); return FALSE; } static gboolean gimp_ruler_draw (GtkWidget *widget, cairo_t *cr) { GimpRuler *ruler = GIMP_RULER (widget); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); gimp_ruler_draw_ticks (ruler); cairo_set_source_surface (cr, priv->backing_store, 0, 0); cairo_paint (cr); gimp_ruler_draw_pos (ruler); return FALSE; } static void gimp_ruler_draw_ticks (GimpRuler *ruler) { GtkWidget *widget = GTK_WIDGET (ruler); GtkStyleContext *context = gtk_widget_get_style_context (widget); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); GtkAllocation allocation; GtkBorder border; GdkRGBA color; cairo_t *cr; gint i; gint width, height; gint length, ideal_length; gdouble lower, upper; /* Upper and lower limits, in ruler units */ gdouble increment; /* Number of pixels per unit */ gint scale; /* Number of units per major unit */ gdouble start, end, cur; gchar unit_str[32]; gint digit_height; gint digit_offset; gint text_size; gint pos; gdouble max_size; GimpUnit unit; PangoLayout *layout; PangoRectangle logical_rect, ink_rect; if (! gtk_widget_is_drawable (widget)) return; gtk_widget_get_allocation (widget, &allocation); gtk_style_context_get_border (context, 0, &border); layout = gimp_ruler_get_layout (widget, "0123456789"); pango_layout_get_extents (layout, &ink_rect, &logical_rect); digit_height = PANGO_PIXELS (ink_rect.height) + 2; digit_offset = ink_rect.y; if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { width = allocation.width; height = allocation.height - (border.top + border.bottom); } else { width = allocation.height; height = allocation.width - (border.top + border.bottom); } cr = cairo_create (priv->backing_store); gtk_render_background (context, cr, 0, 0, allocation.width, allocation.height); gtk_render_frame (context, cr, 0, 0, allocation.width, allocation.height); gtk_style_context_get_color (context, gtk_widget_get_state_flags (widget), &color); gdk_cairo_set_source_rgba (cr, &color); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { cairo_rectangle (cr, border.left, height + border.top, allocation.width - (border.left + border.right), 1); } else { cairo_rectangle (cr, height + border.left, border.top, 1, allocation.height - (border.top + border.bottom)); } gimp_ruler_get_range (ruler, &lower, &upper, &max_size); if ((upper - lower) == 0) goto out; increment = (gdouble) width / (upper - lower); /* determine the scale * use the maximum extents of the ruler to determine the largest * possible number to be displayed. Calculate the height in pixels * of this displayed text. Use this height to find a scale which * leaves sufficient room for drawing the ruler. * * We calculate the text size as for the vruler instead of * actually measuring the text width, so that the result for the * scale looks consistent with an accompanying vruler. */ scale = ceil (max_size); g_snprintf (unit_str, sizeof (unit_str), "%d", scale); text_size = strlen (unit_str) * digit_height + 1; for (scale = 0; scale < (gint)G_N_ELEMENTS (ruler_metric.ruler_scale); scale++) if (ruler_metric.ruler_scale[scale] * fabs (increment) > 2 * text_size) break; if (scale == G_N_ELEMENTS (ruler_metric.ruler_scale)) scale = G_N_ELEMENTS (ruler_metric.ruler_scale) - 1; unit = gimp_ruler_get_unit (ruler); /* drawing starts here */ length = 0; for (i = G_N_ELEMENTS (ruler_metric.subdivide) - 1; i >= 0; i--) { gdouble subd_incr; /* hack to get proper subdivisions at full pixels */ if (unit == GIMP_UNIT_PIXEL && scale == 1 && i == 1) subd_incr = 1.0; else subd_incr = ((gdouble) ruler_metric.ruler_scale[scale] / (gdouble) ruler_metric.subdivide[i]); if (subd_incr * fabs (increment) <= MINIMUM_INCR) continue; /* don't subdivide pixels */ if (unit == GIMP_UNIT_PIXEL && subd_incr < 1.0) continue; /* Calculate the length of the tickmarks. Make sure that * this length increases for each set of ticks */ ideal_length = height / (i + 1) - 1; if (ideal_length > ++length) length = ideal_length; if (lower < upper) { start = floor (lower / subd_incr) * subd_incr; end = ceil (upper / subd_incr) * subd_incr; } else { start = floor (upper / subd_incr) * subd_incr; end = ceil (lower / subd_incr) * subd_incr; } for (cur = start; cur <= end; cur += subd_incr) { pos = ROUND ((cur - lower) * increment); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { cairo_rectangle (cr, pos, height + border.top - length, 1, length); } else { cairo_rectangle (cr, height + border.left - length, pos, length, 1); } /* draw label */ if (i == 0) { g_snprintf (unit_str, sizeof (unit_str), "%d", (int) cur); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { pango_layout_set_text (layout, unit_str, -1); pango_layout_get_extents (layout, &logical_rect, NULL); cairo_move_to (cr, pos + 2, border.top + PANGO_PIXELS (logical_rect.y - digit_offset)); pango_cairo_show_layout (cr, layout); } else { gint j; for (j = 0; j < (int) strlen (unit_str); j++) { pango_layout_set_text (layout, unit_str + j, 1); pango_layout_get_extents (layout, NULL, &logical_rect); cairo_move_to (cr, border.left + 1, pos + digit_height * j + 2 + PANGO_PIXELS (logical_rect.y - digit_offset)); pango_cairo_show_layout (cr, layout); } } } } } cairo_fill (cr); out: cairo_destroy (cr); } static void gimp_ruler_draw_pos (GimpRuler *ruler) { GtkWidget *widget = GTK_WIDGET (ruler); GtkStyleContext *context = gtk_widget_get_style_context (widget); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); GtkAllocation allocation; GtkBorder border; GdkRGBA color; gint x, y; gint width, height; gint bs_width, bs_height; if (! gtk_widget_is_drawable (widget)) return; gtk_widget_get_allocation (widget, &allocation); gtk_style_context_get_border (context, 0, &border); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { width = allocation.width; height = allocation.height - (border.top + border.bottom); bs_width = height / 2 + 2; bs_width |= 1; /* make sure it's odd */ bs_height = bs_width / 2 + 1; } else { width = allocation.width - (border.left + border.right); height = allocation.height; bs_height = width / 2 + 2; bs_height |= 1; /* make sure it's odd */ bs_width = bs_height / 2 + 1; } if ((bs_width > 0) && (bs_height > 0)) { cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (widget)); gdouble lower; gdouble upper; gdouble position; gdouble increment; cairo_rectangle (cr, allocation.x, allocation.y, allocation.width, allocation.height); cairo_clip (cr); cairo_translate (cr, allocation.x, allocation.y); /* If a backing store exists, restore the ruler */ if (priv->backing_store) { cairo_set_source_surface (cr, priv->backing_store, 0, 0); cairo_rectangle (cr, priv->xsrc, priv->ysrc, bs_width, bs_height); cairo_fill (cr); } position = gimp_ruler_get_position (ruler); gimp_ruler_get_range (ruler, &lower, &upper, NULL); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { increment = (gdouble) width / (upper - lower); x = ROUND ((position - lower) * increment) + (border.left - bs_width) / 2 - 1; y = (height + bs_height) / 2 + border.top; } else { increment = (gdouble) height / (upper - lower); x = (width + bs_width) / 2 + border.left; y = ROUND ((position - lower) * increment) + (border.top - bs_height) / 2 - 1; } gtk_style_context_get_color (context, gtk_widget_get_state_flags (widget), &color); gdk_cairo_set_source_rgba (cr, &color); cairo_move_to (cr, x, y); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { cairo_line_to (cr, x + bs_width / 2.0, y + bs_height); cairo_line_to (cr, x + bs_width, y); } else { cairo_line_to (cr, x + bs_width, y + bs_height / 2.0); cairo_line_to (cr, x, y + bs_height); } cairo_fill (cr); cairo_destroy (cr); priv->xsrc = x; priv->ysrc = y; } } static void gimp_ruler_make_pixmap (GimpRuler *ruler) { GtkWidget *widget = GTK_WIDGET (ruler); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); GtkAllocation allocation; gtk_widget_get_allocation (widget, &allocation); if (priv->backing_store) cairo_surface_destroy (priv->backing_store); priv->backing_store = gdk_window_create_similar_surface (gtk_widget_get_window (widget), CAIRO_CONTENT_COLOR, allocation.width, allocation.height); } static PangoLayout * gimp_ruler_create_layout (GtkWidget *widget, const gchar *text) { GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (widget); PangoLayout *layout; PangoAttrList *attrs; PangoAttribute *attr; layout = gtk_widget_create_pango_layout (widget, text); attrs = pango_attr_list_new (); attr = pango_attr_scale_new (priv->font_scale); attr->start_index = 0; attr->end_index = -1; pango_attr_list_insert (attrs, attr); pango_layout_set_attributes (layout, attrs); pango_attr_list_unref (attrs); return layout; } static PangoLayout * gimp_ruler_get_layout (GtkWidget *widget, const gchar *text) { GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (widget); if (priv->layout) { pango_layout_set_text (priv->layout, text, -1); return priv->layout; } priv->layout = gimp_ruler_create_layout (widget, text); return priv->layout; } glom-1.22.4/glom/utility_widgets/gimpruler/libgimpbase/0000755000175000017500000000000012235000126024426 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/utility_widgets/gimpruler/libgimpbase/gimpbaseenums.h0000644000175000017500000003567512234776363027504 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #ifndef __GIMP_BASE_ENUMS_H__ #define __GIMP_BASE_ENUMS_H__ /** * SECTION: gimpbaseenums * @title: gimpbaseenums * @short_description: Basic GIMP enumeration data types. * * Basic GIMP enumeration data types. **/ G_BEGIN_DECLS /* For information look into the C source or the html documentation */ #define GIMP_TYPE_ADD_MASK_TYPE (gimp_add_mask_type_get_type ()) GType gimp_add_mask_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_ADD_WHITE_MASK, /*< desc="_White (full opacity)" >*/ GIMP_ADD_BLACK_MASK, /*< desc="_Black (full transparency)" >*/ GIMP_ADD_ALPHA_MASK, /*< desc="Layer's _alpha channel" >*/ GIMP_ADD_ALPHA_TRANSFER_MASK, /*< desc="_Transfer layer's alpha channel" >*/ GIMP_ADD_SELECTION_MASK, /*< desc="_Selection" >*/ GIMP_ADD_COPY_MASK, /*< desc="_Grayscale copy of layer" >*/ GIMP_ADD_CHANNEL_MASK /*< desc="C_hannel" >*/ } GimpAddMaskType; #define GIMP_TYPE_BLEND_MODE (gimp_blend_mode_get_type ()) GType gimp_blend_mode_get_type (void) G_GNUC_CONST; typedef enum { GIMP_FG_BG_RGB_MODE, /*< desc="FG to BG (RGB)" >*/ GIMP_FG_BG_HSV_MODE, /*< desc="FG to BG (HSV)" >*/ GIMP_FG_TRANSPARENT_MODE, /*< desc="FG to transparent" >*/ GIMP_CUSTOM_MODE /*< desc="Custom gradient" >*/ } GimpBlendMode; #define GIMP_TYPE_BUCKET_FILL_MODE (gimp_bucket_fill_mode_get_type ()) GType gimp_bucket_fill_mode_get_type (void) G_GNUC_CONST; typedef enum { GIMP_FG_BUCKET_FILL, /*< desc="FG color fill" >*/ GIMP_BG_BUCKET_FILL, /*< desc="BG color fill" >*/ GIMP_PATTERN_BUCKET_FILL /*< desc="Pattern fill" >*/ } GimpBucketFillMode; #define GIMP_TYPE_CHANNEL_OPS (gimp_channel_ops_get_type ()) GType gimp_channel_ops_get_type (void) G_GNUC_CONST; typedef enum { GIMP_CHANNEL_OP_ADD, /*< desc="Add to the current selection" >*/ GIMP_CHANNEL_OP_SUBTRACT, /*< desc="Subtract from the current selection" >*/ GIMP_CHANNEL_OP_REPLACE, /*< desc="Replace the current selection" >*/ GIMP_CHANNEL_OP_INTERSECT /*< desc="Intersect with the current selection" >*/ } GimpChannelOps; #define GIMP_TYPE_CHANNEL_TYPE (gimp_channel_type_get_type ()) GType gimp_channel_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_RED_CHANNEL, /*< desc="Red" >*/ GIMP_GREEN_CHANNEL, /*< desc="Green" >*/ GIMP_BLUE_CHANNEL, /*< desc="Blue" >*/ GIMP_GRAY_CHANNEL, /*< desc="Gray" >*/ GIMP_INDEXED_CHANNEL, /*< desc="Indexed" >*/ GIMP_ALPHA_CHANNEL /*< desc="Alpha" >*/ } GimpChannelType; #define GIMP_TYPE_CHECK_SIZE (gimp_check_size_get_type ()) GType gimp_check_size_get_type (void) G_GNUC_CONST; typedef enum /*< pdb-skip >*/ { GIMP_CHECK_SIZE_SMALL_CHECKS = 0, /*< desc="Small" >*/ GIMP_CHECK_SIZE_MEDIUM_CHECKS = 1, /*< desc="Medium" >*/ GIMP_CHECK_SIZE_LARGE_CHECKS = 2 /*< desc="Large" >*/ } GimpCheckSize; #define GIMP_TYPE_CHECK_TYPE (gimp_check_type_get_type ()) GType gimp_check_type_get_type (void) G_GNUC_CONST; typedef enum /*< pdb-skip >*/ { GIMP_CHECK_TYPE_LIGHT_CHECKS = 0, /*< desc="Light checks" >*/ GIMP_CHECK_TYPE_GRAY_CHECKS = 1, /*< desc="Mid-tone checks" >*/ GIMP_CHECK_TYPE_DARK_CHECKS = 2, /*< desc="Dark checks" >*/ GIMP_CHECK_TYPE_WHITE_ONLY = 3, /*< desc="White only" >*/ GIMP_CHECK_TYPE_GRAY_ONLY = 4, /*< desc="Gray only" >*/ GIMP_CHECK_TYPE_BLACK_ONLY = 5 /*< desc="Black only" >*/ } GimpCheckType; #define GIMP_TYPE_CLONE_TYPE (gimp_clone_type_get_type ()) GType gimp_clone_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_IMAGE_CLONE, /*< desc="Image" >*/ GIMP_PATTERN_CLONE /*< desc="Pattern" >*/ } GimpCloneType; #define GIMP_TYPE_DESATURATE_MODE (gimp_desaturate_mode_get_type ()) GType gimp_desaturate_mode_get_type (void) G_GNUC_CONST; typedef enum { GIMP_DESATURATE_LIGHTNESS, /*< desc="Lightness" >*/ GIMP_DESATURATE_LUMINOSITY, /*< desc="Luminosity" >*/ GIMP_DESATURATE_AVERAGE /*< desc="Average" >*/ } GimpDesaturateMode; #define GIMP_TYPE_DODGE_BURN_TYPE (gimp_dodge_burn_type_get_type ()) GType gimp_dodge_burn_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_DODGE, /*< desc="Dodge" >*/ GIMP_BURN /*< desc="Burn" >*/ } GimpDodgeBurnType; #define GIMP_TYPE_FOREGROUND_EXTRACT_MODE (gimp_foreground_extract_mode_get_type ()) GType gimp_foreground_extract_mode_get_type (void) G_GNUC_CONST; typedef enum { GIMP_FOREGROUND_EXTRACT_SIOX } GimpForegroundExtractMode; #define GIMP_TYPE_GRADIENT_TYPE (gimp_gradient_type_get_type ()) GType gimp_gradient_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_GRADIENT_LINEAR, /*< desc="Linear" >*/ GIMP_GRADIENT_BILINEAR, /*< desc="Bi-linear" >*/ GIMP_GRADIENT_RADIAL, /*< desc="Radial" >*/ GIMP_GRADIENT_SQUARE, /*< desc="Square" >*/ GIMP_GRADIENT_CONICAL_SYMMETRIC, /*< desc="Conical (sym)" >*/ GIMP_GRADIENT_CONICAL_ASYMMETRIC, /*< desc="Conical (asym)" >*/ GIMP_GRADIENT_SHAPEBURST_ANGULAR, /*< desc="Shaped (angular)" >*/ GIMP_GRADIENT_SHAPEBURST_SPHERICAL, /*< desc="Shaped (spherical)">*/ GIMP_GRADIENT_SHAPEBURST_DIMPLED, /*< desc="Shaped (dimpled)" >*/ GIMP_GRADIENT_SPIRAL_CLOCKWISE, /*< desc="Spiral (cw)" >*/ GIMP_GRADIENT_SPIRAL_ANTICLOCKWISE /*< desc="Spiral (ccw)" >*/ } GimpGradientType; #define GIMP_TYPE_GRID_STYLE (gimp_grid_style_get_type ()) GType gimp_grid_style_get_type (void) G_GNUC_CONST; typedef enum { GIMP_GRID_DOTS, /*< desc="Intersections (dots)" >*/ GIMP_GRID_INTERSECTIONS, /*< desc="Intersections (crosshairs)" >*/ GIMP_GRID_ON_OFF_DASH, /*< desc="Dashed" >*/ GIMP_GRID_DOUBLE_DASH, /*< desc="Double dashed" >*/ GIMP_GRID_SOLID /*< desc="Solid" >*/ } GimpGridStyle; #define GIMP_TYPE_ICON_TYPE (gimp_icon_type_get_type ()) GType gimp_icon_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_ICON_TYPE_STOCK_ID, /*< desc="Stock ID" >*/ GIMP_ICON_TYPE_INLINE_PIXBUF, /*< desc="Inline pixbuf" >*/ GIMP_ICON_TYPE_IMAGE_FILE /*< desc="Image file" >*/ } GimpIconType; #define GIMP_TYPE_IMAGE_BASE_TYPE (gimp_image_base_type_get_type ()) GType gimp_image_base_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_RGB, /*< desc="RGB color" >*/ GIMP_GRAY, /*< desc="Grayscale" >*/ GIMP_INDEXED /*< desc="Indexed color" >*/ } GimpImageBaseType; #define GIMP_TYPE_IMAGE_TYPE (gimp_image_type_get_type ()) GType gimp_image_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_RGB_IMAGE, /*< desc="RGB" >*/ GIMP_RGBA_IMAGE, /*< desc="RGB-alpha" >*/ GIMP_GRAY_IMAGE, /*< desc="Grayscale" >*/ GIMP_GRAYA_IMAGE, /*< desc="Grayscale-alpha" >*/ GIMP_INDEXED_IMAGE, /*< desc="Indexed" >*/ GIMP_INDEXEDA_IMAGE /*< desc="Indexed-alpha" >*/ } GimpImageType; #define GIMP_TYPE_INTERPOLATION_TYPE (gimp_interpolation_type_get_type ()) GType gimp_interpolation_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_INTERPOLATION_NONE, /*< desc="None" >*/ GIMP_INTERPOLATION_LINEAR, /*< desc="Linear" >*/ GIMP_INTERPOLATION_CUBIC, /*< desc="Cubic" >*/ GIMP_INTERPOLATION_LANCZOS /*< desc="Sinc (Lanczos3)" >*/ } GimpInterpolationType; #define GIMP_TYPE_PAINT_APPLICATION_MODE (gimp_paint_application_mode_get_type ()) GType gimp_paint_application_mode_get_type (void) G_GNUC_CONST; typedef enum { GIMP_PAINT_CONSTANT, /*< desc="Constant" >*/ GIMP_PAINT_INCREMENTAL /*< desc="Incremental" >*/ } GimpPaintApplicationMode; #define GIMP_TYPE_REPEAT_MODE (gimp_repeat_mode_get_type ()) GType gimp_repeat_mode_get_type (void) G_GNUC_CONST; typedef enum { GIMP_REPEAT_NONE, /*< desc="None" >*/ GIMP_REPEAT_SAWTOOTH, /*< desc="Sawtooth wave" >*/ GIMP_REPEAT_TRIANGULAR /*< desc="Triangular wave" >*/ } GimpRepeatMode; #define GIMP_TYPE_RUN_MODE (gimp_run_mode_get_type ()) GType gimp_run_mode_get_type (void) G_GNUC_CONST; typedef enum { GIMP_RUN_INTERACTIVE, /*< desc="Run interactively" >*/ GIMP_RUN_NONINTERACTIVE, /*< desc="Run non-interactively" >*/ GIMP_RUN_WITH_LAST_VALS /*< desc="Run with last used values" >*/ } GimpRunMode; #define GIMP_TYPE_SIZE_TYPE (gimp_size_type_get_type ()) GType gimp_size_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_PIXELS, /*< desc="Pixels" >*/ GIMP_POINTS /*< desc="Points" >*/ } GimpSizeType; #define GIMP_TYPE_TRANSFER_MODE (gimp_transfer_mode_get_type ()) GType gimp_transfer_mode_get_type (void) G_GNUC_CONST; typedef enum { GIMP_SHADOWS, /*< desc="Shadows" >*/ GIMP_MIDTONES, /*< desc="Midtones" >*/ GIMP_HIGHLIGHTS /*< desc="Highlights" >*/ } GimpTransferMode; #define GIMP_TYPE_TRANSFORM_DIRECTION (gimp_transform_direction_get_type ()) GType gimp_transform_direction_get_type (void) G_GNUC_CONST; typedef enum { GIMP_TRANSFORM_FORWARD, /*< desc="Normal (Forward)" >*/ GIMP_TRANSFORM_BACKWARD /*< desc="Corrective (Backward)" >*/ } GimpTransformDirection; #define GIMP_TYPE_TRANSFORM_RESIZE (gimp_transform_resize_get_type ()) GType gimp_transform_resize_get_type (void) G_GNUC_CONST; typedef enum { GIMP_TRANSFORM_RESIZE_ADJUST = 0, /*< desc="Adjust" >*/ GIMP_TRANSFORM_RESIZE_CLIP = 1, /*< desc="Clip" >*/ GIMP_TRANSFORM_RESIZE_CROP, /*< desc="Crop to result" >*/ GIMP_TRANSFORM_RESIZE_CROP_WITH_ASPECT /*< desc="Crop with aspect" >*/ } GimpTransformResize; typedef enum /*< skip >*/ { GIMP_UNIT_PIXEL = 0, GIMP_UNIT_INCH = 1, GIMP_UNIT_MM = 2, GIMP_UNIT_POINT = 3, GIMP_UNIT_PICA = 4, GIMP_UNIT_END = 5, GIMP_UNIT_PERCENT = 65536 /*< pdb-skip >*/ } GimpUnit; #define GIMP_TYPE_PDB_ARG_TYPE (gimp_pdb_arg_type_get_type ()) GType gimp_pdb_arg_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_PDB_INT32, GIMP_PDB_INT16, GIMP_PDB_INT8, GIMP_PDB_FLOAT, GIMP_PDB_STRING, GIMP_PDB_INT32ARRAY, GIMP_PDB_INT16ARRAY, GIMP_PDB_INT8ARRAY, GIMP_PDB_FLOATARRAY, GIMP_PDB_STRINGARRAY, GIMP_PDB_COLOR, GIMP_PDB_ITEM, GIMP_PDB_DISPLAY, GIMP_PDB_IMAGE, GIMP_PDB_LAYER, GIMP_PDB_CHANNEL, GIMP_PDB_DRAWABLE, GIMP_PDB_SELECTION, GIMP_PDB_COLORARRAY, GIMP_PDB_VECTORS, GIMP_PDB_PARASITE, GIMP_PDB_STATUS, GIMP_PDB_END, /* the following aliases are deprecated */ GIMP_PDB_PATH = GIMP_PDB_VECTORS, /*< skip >*/ GIMP_PDB_BOUNDARY = GIMP_PDB_COLORARRAY, /*< skip >*/ GIMP_PDB_REGION = GIMP_PDB_ITEM /*< skip >*/ } GimpPDBArgType; #define GIMP_TYPE_PDB_ERROR_HANDLER (gimp_pdb_error_handler_get_type ()) GType gimp_pdb_error_handler_get_type (void) G_GNUC_CONST; typedef enum { GIMP_PDB_ERROR_HANDLER_INTERNAL, GIMP_PDB_ERROR_HANDLER_PLUGIN } GimpPDBErrorHandler; #define GIMP_TYPE_PDB_PROC_TYPE (gimp_pdb_proc_type_get_type ()) GType gimp_pdb_proc_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_INTERNAL, /*< desc="Internal GIMP procedure" >*/ GIMP_PLUGIN, /*< desc="GIMP Plug-In" >*/ GIMP_EXTENSION, /*< desc="GIMP Extension" >*/ GIMP_TEMPORARY /*< desc="Temporary Procedure" >*/ } GimpPDBProcType; #define GIMP_TYPE_PDB_STATUS_TYPE (gimp_pdb_status_type_get_type ()) GType gimp_pdb_status_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_PDB_EXECUTION_ERROR, GIMP_PDB_CALLING_ERROR, GIMP_PDB_PASS_THROUGH, GIMP_PDB_SUCCESS, GIMP_PDB_CANCEL } GimpPDBStatusType; #define GIMP_TYPE_MESSAGE_HANDLER_TYPE (gimp_message_handler_type_get_type ()) GType gimp_message_handler_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_MESSAGE_BOX, GIMP_CONSOLE, GIMP_ERROR_CONSOLE } GimpMessageHandlerType; #define GIMP_TYPE_STACK_TRACE_MODE (gimp_stack_trace_mode_get_type ()) GType gimp_stack_trace_mode_get_type (void) G_GNUC_CONST; typedef enum { GIMP_STACK_TRACE_NEVER, GIMP_STACK_TRACE_QUERY, GIMP_STACK_TRACE_ALWAYS } GimpStackTraceMode; #define GIMP_TYPE_PROGRESS_COMMAND (gimp_progress_command_get_type ()) GType gimp_progress_command_get_type (void) G_GNUC_CONST; typedef enum { GIMP_PROGRESS_COMMAND_START, GIMP_PROGRESS_COMMAND_END, GIMP_PROGRESS_COMMAND_SET_TEXT, GIMP_PROGRESS_COMMAND_SET_VALUE, GIMP_PROGRESS_COMMAND_PULSE, GIMP_PROGRESS_COMMAND_GET_WINDOW } GimpProgressCommand; #define GIMP_TYPE_TEXT_DIRECTION (gimp_text_direction_get_type ()) GType gimp_text_direction_get_type (void) G_GNUC_CONST; typedef enum { GIMP_TEXT_DIRECTION_LTR, /*< desc="From left to right" >*/ GIMP_TEXT_DIRECTION_RTL /*< desc="From right to left" >*/ } GimpTextDirection; #define GIMP_TYPE_TEXT_HINT_STYLE (gimp_text_hint_style_get_type ()) GType gimp_text_hint_style_get_type (void) G_GNUC_CONST; typedef enum { GIMP_TEXT_HINT_STYLE_NONE, /*< desc="None" >*/ GIMP_TEXT_HINT_STYLE_SLIGHT, /*< desc="Slight" >*/ GIMP_TEXT_HINT_STYLE_MEDIUM, /*< desc="Medium" >*/ GIMP_TEXT_HINT_STYLE_FULL /*< desc="Full" >*/ } GimpTextHintStyle; #define GIMP_TYPE_TEXT_JUSTIFICATION (gimp_text_justification_get_type ()) GType gimp_text_justification_get_type (void) G_GNUC_CONST; typedef enum { GIMP_TEXT_JUSTIFY_LEFT, /*< desc="Left justified" >*/ GIMP_TEXT_JUSTIFY_RIGHT, /*< desc="Right justified" >*/ GIMP_TEXT_JUSTIFY_CENTER, /*< desc="Centered" >*/ GIMP_TEXT_JUSTIFY_FILL /*< desc="Filled" >*/ } GimpTextJustification; #ifndef GIMP_DISABLE_DEPRECATED #define GIMP_TYPE_USER_DIRECTORY (gimp_user_directory_get_type ()) GType gimp_user_directory_get_type (void) G_GNUC_CONST; typedef enum { GIMP_USER_DIRECTORY_DESKTOP, GIMP_USER_DIRECTORY_DOCUMENTS, GIMP_USER_DIRECTORY_DOWNLOAD, GIMP_USER_DIRECTORY_MUSIC, GIMP_USER_DIRECTORY_PICTURES, GIMP_USER_DIRECTORY_PUBLIC_SHARE, GIMP_USER_DIRECTORY_TEMPLATES, GIMP_USER_DIRECTORY_VIDEOS } GimpUserDirectory; #endif /* !GIMP_DISABLE_DEPRECATED */ #define GIMP_TYPE_VECTORS_STROKE_TYPE (gimp_vectors_stroke_type_get_type ()) GType gimp_vectors_stroke_type_get_type (void) G_GNUC_CONST; typedef enum { GIMP_VECTORS_STROKE_TYPE_BEZIER } GimpVectorsStrokeType; G_END_DECLS #endif /* __GIMP_BASE_ENUMS_H__ */ glom-1.22.4/glom/utility_widgets/gimpruler/libgimpbase/gimpbase-private.h0000644000175000017500000000532312234776363030067 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * gimpbase-private.h * Copyright (C) 2003 Sven Neumann * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #ifndef __GIMP_BASE_PRIVATE_H__ #define __GIMP_BASE_PRIVATE_H__ typedef struct _GimpUnitVtable GimpUnitVtable; struct _GimpUnitVtable { gint (* unit_get_number_of_units) (void); gint (* unit_get_number_of_built_in_units) (void); GimpUnit (* unit_new) (gchar *identifier, gdouble factor, gint digits, gchar *symbol, gchar *abbreviation, gchar *singular, gchar *plural); gboolean (* unit_get_deletion_flag) (GimpUnit unit); void (* unit_set_deletion_flag) (GimpUnit unit, gboolean deletion_flag); gdouble (* unit_get_factor) (GimpUnit unit); gint (* unit_get_digits) (GimpUnit unit); const gchar * (* unit_get_identifier) (GimpUnit unit); const gchar * (* unit_get_symbol) (GimpUnit unit); const gchar * (* unit_get_abbreviation) (GimpUnit unit); const gchar * (* unit_get_singular) (GimpUnit unit); const gchar * (* unit_get_plural) (GimpUnit unit); void (* _reserved_1) (void); void (* _reserved_2) (void); void (* _reserved_3) (void); void (* _reserved_4) (void); }; extern GimpUnitVtable _gimp_unit_vtable; G_BEGIN_DECLS void gimp_base_init (GimpUnitVtable *vtable); G_END_DECLS #endif /* __GIMP_BASE_PRIVATE_H__ */ glom-1.22.4/glom/utility_widgets/gimpruler/libgimpbase/gimpbase-private.c0000644000175000017500000000245512234776363030065 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * gimpbase-private.c * Copyright (C) 2003 Sven Neumann * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #include "config.h" #include #include "libgimpbase/gimpbase.h" #include "gimpbasetypes.h" #include "gimpbase-private.h" GimpUnitVtable _gimp_unit_vtable = { NULL, }; void gimp_base_init (GimpUnitVtable *vtable) { static gboolean gimp_base_initialized = FALSE; g_return_if_fail (vtable != NULL); if (gimp_base_initialized) g_error ("gimp_base_init() must only be called once!"); _gimp_unit_vtable = *vtable; gimp_base_initialized = TRUE; } glom-1.22.4/glom/utility_widgets/gimpruler/libgimpbase/gimpunit.h0000644000175000017500000001042412234776363026462 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * gimpunit.h * Copyright (C) 1999-2003 Michael Natterer * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ /* We disable this so we can use gimpruler.h in Glom without the other files. #if !defined (__GIMP_BASE_H_INSIDE__) && !defined (GIMP_BASE_COMPILATION) #error "Only can be included directly." #endif */ #ifndef __GIMP_UNIT_H__ #define __GIMP_UNIT_H__ /* A change for Glom: */ #include G_BEGIN_DECLS /* For information look into the C source or the html documentation */ /** * GIMP_TYPE_UNIT: * * #GIMP_TYPE_UNIT is a #GType derived from #G_TYPE_INT. **/ #define GIMP_TYPE_UNIT (gimp_unit_get_type ()) #define GIMP_VALUE_HOLDS_UNIT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), GIMP_TYPE_UNIT)) GType gimp_unit_get_type (void) G_GNUC_CONST; /* * GIMP_TYPE_PARAM_UNIT */ #define GIMP_TYPE_PARAM_UNIT (gimp_param_unit_get_type ()) #define GIMP_IS_PARAM_SPEC_UNIT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), GIMP_TYPE_PARAM_UNIT)) GType gimp_param_unit_get_type (void) G_GNUC_CONST; GParamSpec * gimp_param_spec_unit (const gchar *name, const gchar *nick, const gchar *blurb, gboolean allow_pixels, gboolean allow_percent, GimpUnit default_value, GParamFlags flags); gint gimp_unit_get_number_of_units (void); gint gimp_unit_get_number_of_built_in_units (void) G_GNUC_CONST; GimpUnit gimp_unit_new (gchar *identifier, gdouble factor, gint digits, gchar *symbol, gchar *abbreviation, gchar *singular, gchar *plural); gboolean gimp_unit_get_deletion_flag (GimpUnit unit); void gimp_unit_set_deletion_flag (GimpUnit unit, gboolean deletion_flag); gdouble gimp_unit_get_factor (GimpUnit unit); gint gimp_unit_get_digits (GimpUnit unit); const gchar * gimp_unit_get_identifier (GimpUnit unit); const gchar * gimp_unit_get_symbol (GimpUnit unit); const gchar * gimp_unit_get_abbreviation (GimpUnit unit); const gchar * gimp_unit_get_singular (GimpUnit unit); const gchar * gimp_unit_get_plural (GimpUnit unit); gchar * gimp_unit_format_string (const gchar *format, GimpUnit unit); gdouble gimp_pixels_to_units (gdouble pixels, GimpUnit unit, gdouble resolution); gdouble gimp_units_to_pixels (gdouble value, GimpUnit unit, gdouble resolution); gdouble gimp_units_to_points (gdouble value, GimpUnit unit, gdouble resolution); G_END_DECLS #endif /* __GIMP_UNIT_H__ */ glom-1.22.4/glom/utility_widgets/gimpruler/libgimpbase/gimpbase.h0000644000175000017500000000264212234776363026420 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #ifndef __GIMP_BASE_H__ #define __GIMP_BASE_H__ #define __GIMP_BASE_H_INSIDE__ #include /* A change for Glom: #include #include #include #include #include #include #include #include #include #include #include #ifndef G_OS_WIN32 #include #endif */ #undef __GIMP_BASE_H_INSIDE__ #endif /* __GIMP_BASE_H__ */ glom-1.22.4/glom/utility_widgets/gimpruler/libgimpbase/gimpunit.c0000644000175000017500000004275012234776363026464 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * gimpunit.c * Copyright (C) 2003 Michael Natterer * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #include "config.h" #include #include #include "gimpbasetypes.h" #include "gimpbase-private.h" #include "gimpunit.h" /** * SECTION: gimpunit * @title: gimpunit * @short_description: Provides a collection of predefined units and * functions for creating user-defined units. * @see_also: #GimpUnitMenu, #GimpSizeEntry. * * Provides a collection of predefined units and functions for * creating user-defined units. **/ static void unit_to_string (const GValue *src_value, GValue *dest_value); static void string_to_unit (const GValue *src_value, GValue *dest_value); GType gimp_unit_get_type (void) { static GType unit_type = 0; if (! unit_type) { const GTypeInfo type_info = { 0, }; unit_type = g_type_register_static (G_TYPE_INT, "GimpUnit", &type_info, 0); g_value_register_transform_func (unit_type, G_TYPE_STRING, unit_to_string); g_value_register_transform_func (G_TYPE_STRING, unit_type, string_to_unit); } return unit_type; } static void unit_to_string (const GValue *src_value, GValue *dest_value) { GimpUnit unit = (GimpUnit) g_value_get_int (src_value); g_value_set_string (dest_value, gimp_unit_get_identifier (unit)); } static void string_to_unit (const GValue *src_value, GValue *dest_value) { const gchar *str; gint num_units; gint i; str = g_value_get_string (src_value); if (!str || !*str) goto error; num_units = gimp_unit_get_number_of_units (); for (i = GIMP_UNIT_PIXEL; i < num_units; i++) if (strcmp (str, gimp_unit_get_identifier (i)) == 0) break; if (i == num_units) { if (strcmp (str, gimp_unit_get_identifier (GIMP_UNIT_PERCENT)) == 0) i = GIMP_UNIT_PERCENT; else goto error; } g_value_set_int (dest_value, i); return; error: g_warning ("Can't convert string to GimpUnit."); } /** * gimp_unit_get_number_of_units: * * Returns the number of units which are known to the #GimpUnit system. * * Returns: The number of defined units. **/ gint gimp_unit_get_number_of_units (void) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_number_of_units != NULL, GIMP_UNIT_END); return _gimp_unit_vtable.unit_get_number_of_units (); } /** * gimp_unit_get_number_of_built_in_units: * * Returns the number of #GimpUnit's which are hardcoded in the unit system * (UNIT_INCH, UNIT_MM, UNIT_POINT, UNIT_PICA and the two "pseudo unit" * UNIT_PIXEL). * * Returns: The number of built-in units. **/ gint gimp_unit_get_number_of_built_in_units (void) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_number_of_built_in_units != NULL, GIMP_UNIT_END); return _gimp_unit_vtable.unit_get_number_of_built_in_units (); } /** * gimp_unit_new: * @identifier: The unit's identifier string. * @factor: The unit's factor (how many units are in one inch). * @digits: The unit's suggested number of digits (see gimp_unit_get_digits()). * @symbol: The symbol of the unit (e.g. "''" for inch). * @abbreviation: The abbreviation of the unit. * @singular: The singular form of the unit. * @plural: The plural form of the unit. * * Returns the integer ID of the new #GimpUnit. * * Note that a new unit is always created with it's deletion flag * set to %TRUE. You will have to set it to %FALSE with * gimp_unit_set_deletion_flag() to make the unit definition persistent. * * Returns: The ID of the new unit. **/ GimpUnit gimp_unit_new (gchar *identifier, gdouble factor, gint digits, gchar *symbol, gchar *abbreviation, gchar *singular, gchar *plural) { g_return_val_if_fail (_gimp_unit_vtable.unit_new != NULL, GIMP_UNIT_INCH); return _gimp_unit_vtable.unit_new (identifier, factor, digits, symbol, abbreviation, singular, plural); } /** * gimp_unit_get_deletion_flag: * @unit: The unit you want to know the @deletion_flag of. * * Returns: The unit's @deletion_flag. **/ gboolean gimp_unit_get_deletion_flag (GimpUnit unit) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_deletion_flag != NULL, FALSE); return _gimp_unit_vtable.unit_get_deletion_flag (unit); } /** * gimp_unit_set_deletion_flag: * @unit: The unit you want to set the @deletion_flag for. * @deletion_flag: The new deletion_flag. * * Sets a #GimpUnit's @deletion_flag. If the @deletion_flag of a unit is * %TRUE when GIMP exits, this unit will not be saved in the users's * "unitrc" file. * * Trying to change the @deletion_flag of a built-in unit will be silently * ignored. **/ void gimp_unit_set_deletion_flag (GimpUnit unit, gboolean deletion_flag) { g_return_if_fail (_gimp_unit_vtable.unit_set_deletion_flag != NULL); _gimp_unit_vtable.unit_set_deletion_flag (unit, deletion_flag); } /** * gimp_unit_get_factor: * @unit: The unit you want to know the factor of. * * A #GimpUnit's @factor is defined to be: * * distance_in_units == (@factor * distance_in_inches) * * Returns 0 for @unit == GIMP_UNIT_PIXEL. * * Returns: The unit's factor. **/ gdouble gimp_unit_get_factor (GimpUnit unit) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_factor != NULL, 1.0); return _gimp_unit_vtable.unit_get_factor (unit); } /** * gimp_unit_get_digits: * @unit: The unit you want to know the digits. * * Returns the number of digits an entry field should provide to get * approximately the same accuracy as an inch input field with two digits. * * Returns 0 for @unit == GIMP_UNIT_PIXEL. * * Returns: The suggested number of digits. **/ gint gimp_unit_get_digits (GimpUnit unit) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_digits != NULL, 2); return _gimp_unit_vtable.unit_get_digits (unit); } /** * gimp_unit_get_identifier: * @unit: The unit you want to know the identifier of. * * This is an unstranslated string and must not be changed or freed. * * Returns: The unit's identifier. **/ const gchar * gimp_unit_get_identifier (GimpUnit unit) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_identifier != NULL, NULL); return _gimp_unit_vtable.unit_get_identifier (unit); } /** * gimp_unit_get_symbol: * @unit: The unit you want to know the symbol of. * * This is e.g. "''" for UNIT_INCH. * * NOTE: This string must not be changed or freed. * * Returns: The unit's symbol. **/ const gchar * gimp_unit_get_symbol (GimpUnit unit) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_symbol != NULL, NULL); return _gimp_unit_vtable.unit_get_symbol (unit); } /** * gimp_unit_get_abbreviation: * @unit: The unit you want to know the abbreviation of. * * For built-in units, this function returns the translated abbreviation * of the unit. * * NOTE: This string must not be changed or freed. * * Returns: The unit's abbreviation. **/ const gchar * gimp_unit_get_abbreviation (GimpUnit unit) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_abbreviation != NULL, NULL); return _gimp_unit_vtable.unit_get_abbreviation (unit); } /** * gimp_unit_get_singular: * @unit: The unit you want to know the singular form of. * * For built-in units, this function returns the translated singular form * of the unit's name. * * NOTE: This string must not be changed or freed. * * Returns: The unit's singular form. **/ const gchar * gimp_unit_get_singular (GimpUnit unit) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_singular != NULL, NULL); return _gimp_unit_vtable.unit_get_singular (unit); } /** * gimp_unit_get_plural: * @unit: The unit you want to know the plural form of. * * For built-in units, this function returns the translated plural form * of the unit's name. * * NOTE: This string must not be changed or freed. * * Returns: The unit's plural form. **/ const gchar * gimp_unit_get_plural (GimpUnit unit) { g_return_val_if_fail (_gimp_unit_vtable.unit_get_plural != NULL, NULL); return _gimp_unit_vtable.unit_get_plural (unit); } static gint print (gchar *buf, gint len, gint start, const gchar *fmt, ...) { va_list args; gint printed; va_start (args, fmt); printed = g_vsnprintf (buf + start, len - start, fmt, args); if (printed < 0) printed = len - start; va_end (args); return printed; } /** * gimp_unit_format_string: * @format: A printf-like format string which is used to create the unit * string. * @unit: A unit. * * The @format string supports the following percent expansions: * * * * * * % f * Factor (how many units make up an inch) * * * % y * Symbol (e.g. "''" for GIMP_UNIT_INCH) * * * % a * Abbreviation * * * % s * Singular * * * % p * Plural * * * %% * Literal percent * * * * * * Returns: A newly allocated string with above percent expressions * replaced with the resp. strings for @unit. * * Since: GIMP 2.8 **/ gchar * gimp_unit_format_string (const gchar *format, GimpUnit unit) { gchar buffer[1024]; gint i = 0; g_return_val_if_fail (format != NULL, NULL); g_return_val_if_fail ((gint)unit == GIMP_UNIT_PERCENT || ( /* A change for Glom: This is unsigned, so always true: unit >= GIMP_UNIT_PIXEL && */ (gint)unit < gimp_unit_get_number_of_units ()), NULL); while (i < ((gint)sizeof (buffer) - 1) && *format) { switch (*format) { case '%': format++; switch (*format) { case 0: g_warning ("%s: unit-menu-format string ended within %%-sequence", G_STRFUNC); break; case '%': buffer[i++] = '%'; break; case 'f': /* factor (how many units make up an inch) */ i += print (buffer, sizeof (buffer), i, "%f", gimp_unit_get_factor (unit)); break; case 'y': /* symbol ("''" for inch) */ i += print (buffer, sizeof (buffer), i, "%s", gimp_unit_get_symbol (unit)); break; case 'a': /* abbreviation */ i += print (buffer, sizeof (buffer), i, "%s", gimp_unit_get_abbreviation (unit)); break; case 's': /* singular */ i += print (buffer, sizeof (buffer), i, "%s", gimp_unit_get_singular (unit)); break; case 'p': /* plural */ i += print (buffer, sizeof (buffer), i, "%s", gimp_unit_get_plural (unit)); break; default: g_warning ("%s: unit-menu-format contains unknown format " "sequence '%%%c'", G_STRFUNC, *format); break; } break; default: buffer[i++] = *format; break; } format++; } buffer[MIN (i, (gint)sizeof (buffer) - 1)] = 0; return g_strdup (buffer); } /* * GIMP_TYPE_PARAM_UNIT */ #define GIMP_PARAM_SPEC_UNIT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), GIMP_TYPE_PARAM_UNIT, GimpParamSpecUnit)) typedef struct _GimpParamSpecUnit GimpParamSpecUnit; struct _GimpParamSpecUnit { GParamSpecInt parent_instance; gboolean allow_percent; }; static void gimp_param_unit_class_init (GParamSpecClass *class); static gboolean gimp_param_unit_value_validate (GParamSpec *pspec, GValue *value); /** * gimp_param_unit_get_type: * * Reveals the object type * * Returns: the #GType for a unit param object * * Since: GIMP 2.4 **/ GType gimp_param_unit_get_type (void) { static GType spec_type = 0; if (! spec_type) { const GTypeInfo type_info = { sizeof (GParamSpecClass), NULL, NULL, (GClassInitFunc) gimp_param_unit_class_init, NULL, NULL, sizeof (GimpParamSpecUnit), 0, NULL, NULL }; spec_type = g_type_register_static (G_TYPE_PARAM_INT, "GimpParamUnit", &type_info, 0); } return spec_type; } static void gimp_param_unit_class_init (GParamSpecClass *class) { class->value_type = GIMP_TYPE_UNIT; class->value_validate = gimp_param_unit_value_validate; } static gboolean gimp_param_unit_value_validate (GParamSpec *pspec, GValue *value) { GParamSpecInt *ispec = G_PARAM_SPEC_INT (pspec); GimpParamSpecUnit *uspec = GIMP_PARAM_SPEC_UNIT (pspec); gint oval = value->data[0].v_int; if (uspec->allow_percent && value->data[0].v_int == GIMP_UNIT_PERCENT) { value->data[0].v_int = value->data[0].v_int; } else { value->data[0].v_int = CLAMP (value->data[0].v_int, ispec->minimum, gimp_unit_get_number_of_units () - 1); } return value->data[0].v_int != oval; } /** * gimp_param_spec_unit: * @name: Canonical name of the param * @nick: Nickname of the param * @blurb: Brief desciption of param. * @allow_pixels: Whether "pixels" is an allowed unit. * @allow_percent: Whether "perecent" is an allowed unit. * @default_value: Unit to use if none is assigned. * @flags: a combination of #GParamFlags * * Creates a param spec to hold a units param. * See g_param_spec_internal() for more information. * * Returns: a newly allocated #GParamSpec instance * * Since: GIMP 2.4 **/ GParamSpec * gimp_param_spec_unit (const gchar *name, const gchar *nick, const gchar *blurb, gboolean allow_pixels, gboolean allow_percent, GimpUnit default_value, GParamFlags flags) { GimpParamSpecUnit *pspec; GParamSpecInt *ispec; pspec = g_param_spec_internal (GIMP_TYPE_PARAM_UNIT, name, nick, blurb, flags); ispec = G_PARAM_SPEC_INT (pspec); ispec->default_value = default_value; ispec->minimum = allow_pixels ? GIMP_UNIT_PIXEL : GIMP_UNIT_INCH; ispec->maximum = GIMP_UNIT_PERCENT - 1; pspec->allow_percent = allow_percent; return G_PARAM_SPEC (pspec); } /** * gimp_pixels_to_units: * @pixels: value in pixels * @unit: unit to convert to * @resolution: resloution in DPI * * Converts a @value specified in pixels to @unit. * * Returns: @pixels converted to units. * * Since: GIMP 2.8 **/ gdouble gimp_pixels_to_units (gdouble pixels, GimpUnit unit, gdouble resolution) { if (unit == GIMP_UNIT_PIXEL) return pixels; return pixels * gimp_unit_get_factor (unit) / resolution; } /** * gimp_units_to_pixels: * @value: value in units * @unit: unit of @value * @resolution: resloution in DPI * * Converts a @value specified in @unit to pixels. * * Returns: @value converted to pixels. * * Since: GIMP 2.8 **/ gdouble gimp_units_to_pixels (gdouble value, GimpUnit unit, gdouble resolution) { if (unit == GIMP_UNIT_PIXEL) return value; return value * resolution / gimp_unit_get_factor (unit); } /** * gimp_units_to_points: * @value: value in units * @unit: unit of @value * @resolution: resloution in DPI * * Converts a @value specified in @unit to points. * * Returns: @value converted to points. * * Since: GIMP 2.8 **/ gdouble gimp_units_to_points (gdouble value, GimpUnit unit, gdouble resolution) { if (unit == GIMP_UNIT_POINT) return value; if (unit == GIMP_UNIT_PIXEL) return (value * gimp_unit_get_factor (GIMP_UNIT_POINT) / resolution); return (value * gimp_unit_get_factor (GIMP_UNIT_POINT) / gimp_unit_get_factor (unit)); } glom-1.22.4/glom/utility_widgets/gimpruler/libgimpbase/gimpbasetypes.h0000644000175000017500000000640212234776363027503 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #ifndef __GIMP_BASE_TYPES_H__ #define __GIMP_BASE_TYPES_H__ /* A change for Glom: #include #include */ #include #include G_BEGIN_DECLS /* For information look into the C source or the html documentation */ typedef struct _GimpParasite GimpParasite; typedef struct _GimpDatafileData GimpDatafileData; typedef struct _GimpEnumDesc GimpEnumDesc; typedef struct _GimpFlagsDesc GimpFlagsDesc; typedef void (* GimpDatafileLoaderFunc) (const GimpDatafileData *file_data, gpointer user_data); /** * GimpEnumDesc: * @value: An enum value. * @value_desc: The value's description. * @value_help: The value's help text. * * This structure is used to register translatable descriptions and * help texts for enum values. See gimp_enum_set_value_descriptions(). **/ struct _GimpEnumDesc { gint value; const gchar *value_desc; const gchar *value_help; }; /** * GimpFlagsDesc: * @value: A flag value. * @value_desc: The value's description. * @value_help: The value's help text. * * This structure is used to register translatable descriptions and * help texts for flag values. See gimp_flags_set_value_descriptions(). **/ struct _GimpFlagsDesc { guint value; const gchar *value_desc; const gchar *value_help; }; void gimp_type_set_translation_domain (GType type, const gchar *domain); const gchar * gimp_type_get_translation_domain (GType type); void gimp_type_set_translation_context (GType type, const gchar *context); const gchar * gimp_type_get_translation_context (GType type); void gimp_enum_set_value_descriptions (GType enum_type, const GimpEnumDesc *descriptions); const GimpEnumDesc * gimp_enum_get_value_descriptions (GType enum_type); void gimp_flags_set_value_descriptions (GType flags_type, const GimpFlagsDesc *descriptions); const GimpFlagsDesc * gimp_flags_get_value_descriptions (GType flags_type); G_END_DECLS #endif /* __GIMP_BASE_TYPES_H__ */ glom-1.22.4/glom/utility_widgets/gimpruler/libgimpbase/gimpparam.h0000644000175000017500000000336312234776363026607 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #ifndef __GIMP_PARAM_H__ #define __GIMP_PARAM_H__ /** * SECTION: gimpparam * @title: gimpparam * @short_description: Definitions of useful #GParamFlags. * * Definitions of useful #GParamFlags. **/ /** * GIMP_PARAM_STATIC_STRINGS: * * Since: GIMP 2.4 **/ #define GIMP_PARAM_STATIC_STRINGS (G_PARAM_STATIC_NAME | \ G_PARAM_STATIC_NICK | \ G_PARAM_STATIC_BLURB) /** * GIMP_PARAM_READABLE: * * Since: GIMP 2.4 **/ #define GIMP_PARAM_READABLE (G_PARAM_READABLE | \ GIMP_PARAM_STATIC_STRINGS) /** * GIMP_PARAM_WRITABLE: * * Since: GIMP 2.4 **/ #define GIMP_PARAM_WRITABLE (G_PARAM_WRITABLE | \ GIMP_PARAM_STATIC_STRINGS) /** * GIMP_PARAM_READWRITE: * * Since: GIMP 2.4 **/ #define GIMP_PARAM_READWRITE (G_PARAM_READWRITE | \ GIMP_PARAM_STATIC_STRINGS) #endif /* __GIMP_PARAM_H__ */ glom-1.22.4/glom/utility_widgets/gimpruler/libgimpmath/0000755000175000017500000000000012235000126024445 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/utility_widgets/gimpruler/libgimpmath/gimpmath.h0000644000175000017500000000543412234776363026460 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * gimpmath.h * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #ifndef __GIMP_MATH_H__ #define __GIMP_MATH_H__ #include #ifdef HAVE_IEEEFP_H #include #endif #ifdef G_OS_WIN32 #include #endif #define __GIMP_MATH_H_INSIDE__ /* A change for Glom: #include #include #include #include */ #undef __GIMP_MATH_H_INSIDE__ G_BEGIN_DECLS /** * SECTION: gimpmath * @title: GimpMath * @short_description: Mathematical definitions and macros. * * Mathematical definitions and macros for use both by the GIMP * application and plug-ins. These macros should be used rather than * the ones from <math.h> for enhanced portability. **/ /** * RINT: * @x: the value to be rounded * * This macro rounds its argument @x to an integer value in floating * point format. Use RINT() instead of rint(). **/ #ifdef HAVE_RINT #define RINT(x) rint(x) #else #define RINT(x) floor ((x) + 0.5) #endif /** * ROUND: * @x: the value to be rounded. * * This macro rounds its argument @x to the nearest integer. **/ #define ROUND(x) ((int) ((x) + 0.5)) /** * SQR: * @x: the value to be squared. * * This macro squares its argument @x. **/ #define SQR(x) ((x) * (x)) /** * MAX255: * @a: the value to be limited. * * This macro limits it argument @a, an (0-511) int, to 255. **/ #define MAX255(a) ((a) | (((a) & 256) - (((a) & 256) >> 8))) /** * CLAMP0255: * @a: the value to be clamped. * * This macro clamps its argument @a, an int32-range int, between 0 * and 255 inclusive. **/ #define CLAMP0255(a) CLAMP(a,0,255) /** * gimp_deg_to_rad: * @angle: the angle to be converted. * * This macro converts its argument @angle from degree to radian. **/ #define gimp_deg_to_rad(angle) ((angle) * (2.0 * G_PI) / 360.0) /** * gimp_rad_to_deg: * @angle: the angle to be converted. * * This macro converts its argument @angle from radian to degree. **/ #define gimp_rad_to_deg(angle) ((angle) * 360.0 / (2.0 * G_PI)) G_END_DECLS #endif /* __GIMP_MATH_H__ */ glom-1.22.4/glom/utility_widgets/gimpruler/gimpruler.h0000644000175000017500000000700212234776363024354 0ustar00murraycmurrayc00000000000000/* LIBGIMP - The GIMP Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ /* We disable this so we can use it in Glom without the other files. #if !defined (__GIMP_WIDGETS_H_INSIDE__) && !defined (GIMP_WIDGETS_COMPILATION) #error "Only can be included directly." #endif */ #ifndef __GIMP_RULER_H__ #define __GIMP_RULER_H__ G_BEGIN_DECLS /* This is not in the original gimp source code. */ #include #define GIMP_TYPE_RULER (gimp_ruler_get_type ()) #define GIMP_RULER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_RULER, GimpRuler)) #define GIMP_RULER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_RULER, GimpRulerClass)) #define GIMP_IS_RULER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_RULER)) #define GIMP_IS_RULER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_RULER)) #define GIMP_RULER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_RULER, GimpRulerClass)) /* In the original gimp source code, this is in libgimpwidgets/gimpwidgetstypes.h */ typedef struct _GimpRuler GimpRuler; typedef struct _GimpRulerClass GimpRulerClass; struct _GimpRuler { GtkWidget parent_instance; }; struct _GimpRulerClass { GtkWidgetClass parent_class; /* Padding for future expansion */ void (*_gimp_reserved1) (void); void (*_gimp_reserved2) (void); void (*_gimp_reserved3) (void); void (*_gimp_reserved4) (void); }; GType gimp_ruler_get_type (void) G_GNUC_CONST; GtkWidget * gimp_ruler_new (GtkOrientation orientation); void gimp_ruler_add_track_widget (GimpRuler *ruler, GtkWidget *widget); void gimp_ruler_remove_track_widget (GimpRuler *ruler, GtkWidget *widget); void gimp_ruler_set_unit (GimpRuler *ruler, GimpUnit unit); GimpUnit gimp_ruler_get_unit (GimpRuler *ruler); void gimp_ruler_set_position (GimpRuler *ruler, gdouble position); gdouble gimp_ruler_get_position (GimpRuler *ruler); void gimp_ruler_set_range (GimpRuler *ruler, gdouble lower, gdouble upper, gdouble max_size); void gimp_ruler_get_range (GimpRuler *ruler, gdouble *lower, gdouble *upper, gdouble *max_size); G_END_DECLS #endif /* __GIMP_RULER_H__ */ glom-1.22.4/glom/utility_widgets/dialog_properties.cc0000644000175000017500000001060312234252646024203 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "glom/utility_widgets/adddel/adddel.h" #include "dialog_properties.h" #include #include namespace Glom { Dialog_Properties::Dialog_Properties(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Window(cobject), m_block(false), m_modified(false) { builder->get_widget("button_cancel", m_pButton_Cancel); builder->get_widget("button_save", m_pButton_Save); //In general, we don't want to allow changes to windows underneath while editing properties. //Also, if we don't set this then seconday windows (from a modal dialog) will be on top but unusable. set_modal(); //Connect signal handlers: m_pButton_Cancel->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Properties::on_button_cancel) ); m_pButton_Save->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Properties::on_button_save) ); show_all_children(); } Dialog_Properties::~Dialog_Properties() { } Dialog_Properties::type_signal_apply Dialog_Properties::signal_apply() { return m_signal_apply; } void Dialog_Properties::on_button_save() { signal_apply().emit(); } void Dialog_Properties::on_button_cancel() { hide(); } void Dialog_Properties::add(Gtk::Widget& /*widget */) { //TODO: Remove this method? //Connect the widgets signals: //on_foreach_connect(widget); } void Dialog_Properties::widget_connect_changed_signal(Gtk::Widget& widget) { Gtk::ComboBox* pCombo = dynamic_cast(&widget); if(pCombo) //If it is actually a Combo: { pCombo->signal_changed().connect(sigc::mem_fun(*this, &Dialog_Properties::on_anything_changed)); } else { Gtk::Entry* pEntry = dynamic_cast(&widget); if(pEntry) //If it is actually an Entry: { pEntry->signal_changed().connect(sigc::mem_fun(*this, &Dialog_Properties::on_anything_changed)); } else { Gtk::ToggleButton* pToggleButton = dynamic_cast(&widget); if(pToggleButton) { pToggleButton->signal_toggled().connect( sigc::mem_fun(*this, &Dialog_Properties::on_anything_changed) ); } else { Gtk::TextView* pTextView = dynamic_cast(&widget); if(pTextView) { pTextView->get_buffer()->signal_changed().connect( sigc::mem_fun(*this, &Dialog_Properties::on_anything_changed) ); } else { AddDel* pAddDel = dynamic_cast(&widget); if(pAddDel) { pAddDel->signal_user_changed().connect( sigc::mem_fun(*this, &Dialog_Properties::on_adddel_user_changed) ); } } } } } } void Dialog_Properties::on_adddel_user_changed(const Gtk::TreeModel::iterator& /* iter */, guint /* col */) { on_anything_changed(); } void Dialog_Properties::on_anything_changed() { if(!m_block) { //Something (e.g. an edit or a combo) changed. //So we need to activate the [Save] button: enforce_constraints(); set_modified(); } } void Dialog_Properties::on_foreach_connect(Gtk::Widget& widget) { widget_connect_changed_signal(widget); //Connect the appropriate signal //Recurse through children: Gtk::Container* pContainer = dynamic_cast(&widget); if(pContainer) { pContainer->foreach( sigc::mem_fun(*this, &Dialog_Properties::on_foreach_connect)); //recursive } } void Dialog_Properties::set_blocked(bool val) { m_block = val; } void Dialog_Properties::set_modified(bool modified) { m_modified = true; m_pButton_Save->set_sensitive(modified); m_pButton_Cancel->set_sensitive(true); } void Dialog_Properties::enforce_constraints() { } } //namespace Glom glom-1.22.4/glom/utility_widgets/notebook_noframe.cc0000644000175000017500000001235012234776363024027 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "notebook_noframe.h" #include #include #include #include //#include //For stringstream namespace Glom { NotebookNoFrame::NotebookNoFrame() : m_current_page(0) { set_orientation(Gtk::ORIENTATION_VERTICAL); set_spacing(Utils::DEFAULT_SPACING_SMALL); m_box_tabs.set_spacing(Utils::DEFAULT_SPACING_SMALL); m_box_tabs.pack_start(m_box_action_left, Gtk::PACK_SHRINK); m_box_tabs.pack_end(m_box_action_right, Gtk::PACK_SHRINK); pack_start(m_box_tabs, Gtk::PACK_SHRINK); m_box_tabs.show(); pack_start(m_box_pages); m_box_pages.show(); } NotebookNoFrame::~NotebookNoFrame() { } NotebookNoFrame::type_signal_switch_page NotebookNoFrame::signal_switch_page() { return m_signal_switch_page; } Gtk::Widget* NotebookNoFrame::get_nth_page(int page_num) { if(page_num < 0) return 0; if(page_num >= (int)m_vec_page_widgets.size()) return 0; Gtk::Box* box = m_vec_page_widgets[page_num]; if(!box) return 0; std::vector children = box->get_children(); if(children.empty()) return 0; return children[0]; } const Gtk::Widget* NotebookNoFrame::get_nth_page(int page_num) const { NotebookNoFrame* unconstThis = const_cast(this); return unconstThis->get_nth_page(page_num); } int NotebookNoFrame::get_current_page() const { return m_current_page; } void NotebookNoFrame::set_current_page(int page_num) { if(page_num < 0) return; const int size = (int)m_vec_page_widgets.size(); if(page_num >= size) return; m_current_page = page_num; //TODO: Enable the tab button too. //Show only the current page: for(int i = 0; i < size; ++i) { Gtk::ToggleButton* tab = m_vec_tab_widgets[i]; if(!tab) continue; Gtk::Box* box = m_vec_page_widgets[i]; if(!box) continue; if(i == page_num) { if(!tab->get_active()) tab->set_active(); box->show(); } else { if(tab->get_active()) tab->set_active(false); box->hide(); } } } int NotebookNoFrame::append_page(Gtk::Widget& child, Gtk::Widget& tab_label) { Gtk::ToggleButton* toggle = Gtk::manage(new Gtk::ToggleButton()); toggle->set_active(false); toggle->add(tab_label); toggle->show(); m_box_tabs.pack_start(*toggle, Gtk::PACK_SHRINK); m_vec_tab_widgets.push_back(toggle); //We put the child into a box so we can show or hide it regardless of //whether the callers calls show() or hide() on the child widget. //Note that this would make the public list of children incorrect, if we supported that anyway. Gtk::Box* box = Gtk::manage(new Gtk::Box()); box->pack_start(child, Gtk::PACK_EXPAND_WIDGET); m_box_pages.pack_start(*box, Gtk::PACK_EXPAND_WIDGET); m_vec_page_widgets.push_back(box); const int index = m_vec_page_widgets.size() - 1; //Make sure that the first one is showing: if(index == 0) { m_current_page = 0; toggle->set_active(); box->show(); } else { toggle->set_active(false); box->hide(); } set_current_page(index); toggle->signal_toggled().connect( sigc::bind( sigc::mem_fun(*this, &NotebookNoFrame::on_tab_toggled), index)); return index; } int NotebookNoFrame::append_page(Widget& child, const Glib::ustring& tab_label, bool use_mnemonic) { Gtk::Label* pLabel = Gtk::manage( new Gtk::Label(tab_label, use_mnemonic) ); pLabel->show(); return append_page(child, *pLabel); } void NotebookNoFrame::on_tab_toggled(int index) { Gtk::ToggleButton* tab = m_vec_tab_widgets[index]; if(!tab) return; int new_current_page = 0; if(tab->get_active()) { //A different page was selected by clicking on its tab, pressing the button down: new_current_page = index; } else { //A different page was selected by clicking on another tab, raising it's button: //So let's choose another one: new_current_page = index + 1; if(new_current_page >= (int)m_vec_tab_widgets.size()) new_current_page = 0; } set_current_page(new_current_page); Gtk::Widget* child = get_nth_page(new_current_page); m_signal_switch_page.emit(child, new_current_page); } void NotebookNoFrame::set_action_widget(Gtk::Widget* widget, Gtk::PackType pack_type) { if(pack_type == Gtk::PACK_START) { m_box_action_left.pack_start(*widget, Gtk::PACK_SHRINK); m_box_action_left.show(); } else { m_box_action_right.pack_end(*widget, Gtk::PACK_SHRINK); m_box_action_right.show(); } } } //namespace Glom glom-1.22.4/glom/utility_widgets/placeholder.h0000644000175000017500000000264412234252646022622 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_PLACEHOLDER_H #define GLOM_UTILITY_WIDGETS_PLACEHOLDER_H #include #include namespace Glom { /** This is just an easy way to use a Gtk::Box as a single-item container. */ class PlaceHolder : public Gtk::Box { public: PlaceHolder(); PlaceHolder(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~PlaceHolder(); virtual void add(Gtk::Widget& child); virtual void remove(); virtual Gtk::Widget* get_child(); virtual const Gtk::Widget* get_child() const; private: Gtk::Widget* m_pChild; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_PLACEHOLDER_H glom-1.22.4/glom/utility_widgets/notebooklabelglom.cc0000644000175000017500000001055312234776363024202 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "notebooklabelglom.h" #include #include #include namespace Glom { NotebookLabel::NotebookLabel(NotebookGlom* notebook) : m_notebook(notebook), m_pPopupMenu(0) { init(); } NotebookLabel::NotebookLabel(const Glib::ustring& label, NotebookGlom* notebook) : m_label(label), m_notebook (notebook), m_pPopupMenu(0) { init(); } NotebookLabel::~NotebookLabel() { } void NotebookLabel::init() { add(m_label); m_label.show(); set_events (Gdk::ALL_EVENTS_MASK); set_visible_window (false); setup_menu(); } void NotebookLabel::set_label (const Glib::ustring& title) { m_label.set_label (title); } AppWindow* NotebookLabel::get_appwindow() { Gtk::Container* pWindow = get_toplevel(); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } void NotebookLabel::on_menu_new_group_activate() { sharedptr group(new LayoutGroup()); group->set_title_original(_("New Group")); group->set_name(_("Group")); sharedptr notebook_group = sharedptr::cast_dynamic (m_notebook->get_layout_item()); notebook_group->add_item(group); m_notebook->signal_layout_changed().emit(); } void NotebookLabel::on_menu_delete_activate() { Glib::ustring message; const Glib::ustring notebook_title = item_get_title(m_notebook->get_layout_item()); if(!notebook_title.empty()) { message = Glib::ustring::compose (_("Delete whole notebook \"%1\"?"), notebook_title); } else { message = _("Delete whole notebook?"); } Gtk::MessageDialog dlg (message, false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true); switch(dlg.run()) { case Gtk::RESPONSE_YES: m_notebook->delete_from_layout(); break; default: return; } } void NotebookLabel::setup_menu() { m_refUIManager = Gtk::UIManager::create(); m_refActionGroup = Gtk::ActionGroup::create(); m_refActionGroup->add(Gtk::Action::create("NotebookMenu", "Notebook Menu") ); m_refNewGroup = Gtk::Action::create("NewGroup", _("New Group")); m_refDelete = Gtk::Action::create("Delete", _("Delete")); m_refActionGroup->add(m_refNewGroup, sigc::mem_fun(*this, &NotebookLabel::on_menu_new_group_activate) ); m_refActionGroup->add(m_refDelete, sigc::mem_fun(*this, &NotebookLabel::on_menu_delete_activate) ); m_refUIManager->insert_action_group(m_refActionGroup); try { Glib::ustring ui_info = "" " " " " " " " " " " ""; m_refUIManager->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_pPopupMenu = dynamic_cast( m_refUIManager->get_widget("/NotebookMenu") ); if(!m_pPopupMenu) g_warning("menu not found"); } bool NotebookLabel::on_button_press_event(GdkEventButton *event) { AppWindow* pApp = get_appwindow(); if(pApp && pApp->get_userlevel() == AppState::USERLEVEL_DEVELOPER) { GdkModifierType mods; gdk_window_get_device_position( gtk_widget_get_window (Gtk::Widget::gobj()), event->device, 0, 0, &mods ); if(mods & GDK_BUTTON3_MASK) { //Give user choices of actions on this item: m_pPopupMenu->popup(event->button, event->time); return true; //We handled this event. } } return Gtk::EventBox::on_button_press_event(event); } } //namespace Glom glom-1.22.4/glom/utility_widgets/flowtable.h0000644000175000017500000000520712234252646022315 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITYWIDGETS_FLOWTABLE_H #define GLOM_UTILITYWIDGETS_FLOWTABLE_H #include #include "layoutwidgetbase.h" #include namespace Glom { class FlowTable : public Egg::SpreadTableDnd { public: FlowTable(); virtual ~FlowTable(); typedef Gtk::Container type_base; void add_widgets(Gtk::Widget& first, Gtk::Widget& second, bool expand_second = false); void add_widgets(Gtk::Widget& first, bool expand = false); //override /** Show extra UI that is useful in RAD tools: */ virtual void set_design_mode(bool value = true); void remove(Gtk::Widget& first); void remove_all(); protected: /** Get the column in which the specified "first" widget is placed. * result false if the widget is not one of the "first" widgets, or * if has not yet been placed in a column, because the size has not yet been requested. */ bool get_column_for_first_widget(const Gtk::Widget& first, guint& column) const; void insert(Gtk::Widget* first, Gtk::Widget* second, int index, bool expand); typedef std::list type_const_list_widgets; /** This returns all first widgets added with FlowTable::add(). * Gtk::Container::get_children() instead returns internal widgets. */ type_const_list_widgets get_first_child_widgets() const; virtual bool on_draw(const Cairo::RefPtr& cr); private: const Gtk::Box* get_parent_hbox(const Gtk::Widget* first) const; void delete_and_forget_hbox(Gtk::Box* hbox); bool m_design_mode; //For drawing: Glib::RefPtr m_refGdkWindow; //We remember the Boxes so we can delete them when the are no longer used. typedef std::list type_list_hboxes; type_list_hboxes m_list_hboxes; type_const_list_widgets m_list_first_widgets; }; } //namespace Glom #endif //GLOM_UTILITYWIDGETS_FLOWTABLE_H glom-1.22.4/glom/utility_widgets/eggspreadtablemm/0000755000175000017500000000000012235000127023446 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/utility_widgets/eggspreadtablemm/private/0000755000175000017500000000000012235000126025117 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/utility_widgets/eggspreadtablemm/private/eggspreadtabledndmm_p.h0000644000175000017500000000227012234252646031620 0ustar00murraycmurrayc00000000000000#ifndef _EGG_SPREADTABLE_DND_P_H #define _EGG_SPREADTABLE_DND_P_H #include #include namespace Egg { class SpreadTableDnd_Class : public Glib::Class { public: #ifndef DOXYGEN_SHOULD_SKIP_THIS typedef SpreadTableDnd CppObjectType; typedef EggSpreadTableDnd BaseObjectType; typedef EggSpreadTableDndClass BaseClassType; typedef SpreadTable_Class CppClassParent; typedef EggSpreadTableClass BaseClassParent; friend class SpreadTableDnd; #endif /* DOXYGEN_SHOULD_SKIP_THIS */ const Glib::Class& init(); static void class_init_function(void* g_class, void* class_data); static Glib::ObjectBase* wrap_new(GObject*); protected: //Callbacks (default signal handlers): //These will call the *_impl member methods, which will then call the existing default signal callbacks, if any. //You could prevent the original default signal handlers being called by overriding the *_impl method. static gboolean widget_drop_possible_callback(EggSpreadTableDnd* self, GtkWidget* p0, gboolean* drop_possible); //Callbacks (virtual functions): }; } // namespace Egg #endif /* _EGG_SPREADTABLE_P_H */ glom-1.22.4/glom/utility_widgets/eggspreadtablemm/private/eggspreadtablemm_p.h0000644000175000017500000000201012234252646031122 0ustar00murraycmurrayc00000000000000#ifndef _EGG_SPREADTABLE_P_H #define _EGG_SPREADTABLE_P_H #include #include namespace Egg { class SpreadTable_Class : public Glib::Class { public: #ifndef DOXYGEN_SHOULD_SKIP_THIS typedef SpreadTable CppObjectType; typedef EggSpreadTable BaseObjectType; typedef EggSpreadTableClass BaseClassType; typedef Gtk::Container_Class CppClassParent; typedef GtkContainerClass BaseClassParent; friend class SpreadTable; #endif /* DOXYGEN_SHOULD_SKIP_THIS */ const Glib::Class& init(); static void class_init_function(void* g_class, void* class_data); static Glib::ObjectBase* wrap_new(GObject*); protected: //Callbacks (default signal handlers): //These will call the *_impl member methods, which will then call the existing default signal callbacks, if any. //You could prevent the original default signal handlers being called by overriding the *_impl method. //Callbacks (virtual functions): }; } // namespace Egg #endif /* _EGG_SPREADTABLE_P_H */ glom-1.22.4/glom/utility_widgets/eggspreadtablemm/eggspreadtabledndmm.cc0000644000175000017500000002263112234252646027770 0ustar00murraycmurrayc00000000000000/* * * Copyright 2011 The gtkmm Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include namespace Glib { Egg::SpreadTableDnd* wrap(EggSpreadTableDnd* object, bool take_copy) { return dynamic_cast (Glib::wrap_auto ((GObject*)(object), take_copy)); } } /* namespace Glib */ namespace { static gboolean EggSpreadTableDnd_signal_widget_drop_possible_callback(EggSpreadTableDnd* self, GtkWidget* p0, gboolean* drop_possible, void* data) { using namespace Egg; typedef sigc::slot< bool, Gtk::Widget*, bool& > SlotType; // Do not try to call a signal on a disassociated wrapper. if(Glib::ObjectBase::_get_current_wrapper((GObject*) self)) { #ifdef GLIBMM_EXCEPTIONS_ENABLED try { #endif //GLIBMM_EXCEPTIONS_ENABLED if(sigc::slot_base *const slot = Glib::SignalProxyNormal::data_to_slot(data)) { bool cpp_drop_possible = false; const gboolean result = static_cast((*static_cast(slot))(Glib::wrap(p0), cpp_drop_possible)); *drop_possible = cpp_drop_possible; return result; } #ifdef GLIBMM_EXCEPTIONS_ENABLED } catch(...) { Glib::exception_handlers_invoke(); } #endif //GLIBMM_EXCEPTIONS_ENABLED } typedef gboolean RType; return RType(); } static gboolean EggSpreadTableDnd_signal_widget_drop_possible_notify_callback(EggSpreadTableDnd* self, GtkWidget* p0, gboolean* drop_possible, void* data) { using namespace Egg; typedef sigc::slot< bool, Gtk::Widget*, bool& > SlotType; // Do not try to call a signal on a disassociated wrapper. if(Glib::ObjectBase::_get_current_wrapper((GObject*) self)) { #ifdef GLIBMM_EXCEPTIONS_ENABLED try { #endif //GLIBMM_EXCEPTIONS_ENABLED if(sigc::slot_base *const slot = Glib::SignalProxyNormal::data_to_slot(data)) { bool cpp_drop_possible = false; const gboolean result = static_cast((*static_cast(slot))(Glib::wrap(p0), cpp_drop_possible)); *drop_possible = cpp_drop_possible; return result; } #ifdef GLIBMM_EXCEPTIONS_ENABLED } catch(...) { Glib::exception_handlers_invoke(); } #endif //GLIBMM_EXCEPTIONS_ENABLED } typedef gboolean RType; return RType(); } static const Glib::SignalProxyInfo SpreadTableDnd_signal_widget_drop_possible_info = { "widget-drop-possible", (GCallback) &EggSpreadTableDnd_signal_widget_drop_possible_callback, (GCallback) &EggSpreadTableDnd_signal_widget_drop_possible_notify_callback }; } //anonymous namespace namespace Egg { /* The *_Class implementation: */ const Glib::Class& SpreadTableDnd_Class::init() { if(!gtype_) // create the GType if necessary { // Glib::Class has to know the class init function to clone custom types. class_init_func_ = &SpreadTableDnd_Class::class_init_function; // This is actually just optimized away, apparently with no harm. // Make sure that the parent type has been created. //CppClassParent::CppObjectType::get_type(); // Create the wrapper type, with the same class/instance size as the base type. register_derived_type(egg_spread_table_dnd_get_type()); } return *this; } void SpreadTableDnd_Class::class_init_function(void* g_class, void* class_data) { BaseClassType *const klass = static_cast(g_class); CppClassParent::class_init_function(klass, class_data); klass->widget_drop_possible = &widget_drop_possible_callback; } gboolean SpreadTableDnd_Class::widget_drop_possible_callback(EggSpreadTableDnd* self, GtkWidget* p0, gboolean* drop_possible) { Glib::ObjectBase *const obj_base = static_cast( Glib::ObjectBase::_get_current_wrapper((GObject*)self)); // Non-gtkmmproc-generated custom classes implicitly call the default // Glib::ObjectBase constructor, which sets is_derived_. But gtkmmproc- // generated classes can use this optimisation, which avoids the unnecessary // parameter conversions if there is no possibility of the virtual function // being overridden: if(obj_base && obj_base->is_derived_()) { CppObjectType *const obj = dynamic_cast(obj_base); if(obj) // This can be NULL during destruction. { #ifdef GLIBMM_EXCEPTIONS_ENABLED try // Trap C++ exceptions which would normally be lost because this is a C callback. { #endif //GLIBMM_EXCEPTIONS_ENABLED // Call the virtual member method, which derived classes might override. bool cpp_drop_possible = false; const bool result = static_cast(obj->on_widget_drop_possible(Glib::wrap(p0), cpp_drop_possible)); *drop_possible = cpp_drop_possible; return result; #ifdef GLIBMM_EXCEPTIONS_ENABLED } catch(...) { Glib::exception_handlers_invoke(); } #endif //GLIBMM_EXCEPTIONS_ENABLED } } BaseClassType *const base = static_cast( g_type_class_peek_parent(G_OBJECT_GET_CLASS(self)) // Get the parent class of the object class (The original underlying C class). ); // Call the original underlying C function: if(base && base->widget_drop_possible) return (*base->widget_drop_possible)(self, p0, drop_possible); typedef gboolean RType; return RType(); } Glib::ObjectBase* SpreadTableDnd_Class::wrap_new(GObject* o) { return manage(new SpreadTableDnd((EggSpreadTableDnd*)(o))); } /* The implementation: */ SpreadTableDnd::SpreadTableDnd(const Glib::ConstructParams& construct_params) : SpreadTable(construct_params) { } SpreadTableDnd::SpreadTableDnd(EggSpreadTableDnd* castitem) : SpreadTable((EggSpreadTable*)(castitem)) { } SpreadTableDnd::~SpreadTableDnd() { destroy_(); } SpreadTableDnd::CppClassType SpreadTableDnd::spreadtable_class_; // initialize static member GType SpreadTableDnd::get_type() { return spreadtable_class_.init().get_type(); } GType SpreadTableDnd::get_base_type() { return egg_spread_table_dnd_get_type(); } SpreadTableDnd::SpreadTableDnd() : // Mark this class as non-derived to allow C++ vfuncs to be skipped. Glib::ObjectBase(0), SpreadTable(Glib::ConstructParams(spreadtable_class_.init())) { } SpreadTableDnd::SpreadTableDnd(Gtk::Orientation orientation, guint lines) : // Mark this class as non-derived to allow C++ vfuncs to be skipped. Glib::ObjectBase(0), SpreadTable(Glib::ConstructParams(spreadtable_class_.init(), "orientation", ((GtkOrientation)(orientation)), "lines", lines, static_cast(0))) { } void SpreadTableDnd::insert_child(Gtk::Widget& child, int index) { egg_spread_table_dnd_insert_child(gobj(), child.gobj(), index); } void SpreadTableDnd::remove_child(Gtk::Widget& child) { //This is based on Gtk::Container::remove() //We don't need to do this often, because specialized remove() functions are unusual: // //If this is a managed widget, //then do an extra ref so that it will //not be destroyed when adding to another container //This should leave it in much the same state as when it was instantiated, //before being added to the first container. if(child.is_managed_()) child.reference(); egg_spread_table_dnd_remove_child(gobj(), child.gobj()); } void SpreadTableDnd::set_drag_enabled(EggDragEnableMode drag_enabled) { egg_spread_table_dnd_set_drag_enabled(gobj(), drag_enabled); } EggDragEnableMode SpreadTableDnd::get_drag_enabled() const { return egg_spread_table_dnd_get_drag_enabled(const_cast(gobj())); } void SpreadTableDnd::set_drop_enabled(bool drop_enabled) { egg_spread_table_dnd_set_drop_enabled(gobj(), drop_enabled); } bool SpreadTableDnd::get_drop_enabled() const { return egg_spread_table_dnd_get_drop_enabled(const_cast(gobj())); } bool SpreadTableDnd::on_widget_drop_possible(Gtk::Widget* widget, bool& drop_possible) { BaseClassType *const base = static_cast( g_type_class_peek_parent(G_OBJECT_GET_CLASS(gobject_)) // Get the parent class of the object class (The original underlying C class). ); if(base && base->widget_drop_possible) { gboolean c_drop_possible = FALSE; const gboolean result = (*base->widget_drop_possible)(gobj(), Glib::unwrap(widget), &c_drop_possible); drop_possible = c_drop_possible; return result; } else return false; } Glib::SignalProxy2< bool, Gtk::Widget*, bool& > SpreadTableDnd::signal_widget_drop_possible() { return Glib::SignalProxy2< bool, Gtk::Widget*, bool& >(this, &SpreadTableDnd_signal_widget_drop_possible_info); } } // namespace Egg glom-1.22.4/glom/utility_widgets/eggspreadtablemm/test_spreadtablednd.cc0000644000175000017500000002644212234252646030016 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2010 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static const guint INITIAL_HSPACING = 2; static const guint INITIAL_VSPACING = 2; static const guint INITIAL_LINES = 3; static const Gtk::Align INITIAL_HALIGN = Gtk::ALIGN_FILL; static Egg::SpreadTableDnd *paper = 0; static Gtk::ComboBoxText* combo_halign = 0; static Gtk::ComboBoxText* combo_orientation = 0; static Gtk::SpinButton* spinbutton_lines = 0; static Gtk::Align child_halign = INITIAL_HALIGN; static bool child_accepts_drops = true; static bool parent_accepts_drops = true; static void populate_spread_table_wrappy(Egg::SpreadTableDnd* spread_table) { const gchar *strings[] = { "These are", "some wrappy label", "texts", "of various", "lengths.", "They should always be", "shown", "consecutively. Except it's", "hard to say", "where exactly the", "label", "will wrap", "and where exactly", "the actual", "container", "will wrap.", "This label is really really really long !", "Let's add some more", "labels to the", "mix. Just to", "make sure we", "got something to work", "with here." }; /* Remove all children first */ typedef std::vector type_vec_widgets; type_vec_widgets children = paper->get_children(); for(type_vec_widgets::iterator iter = children.begin(); iter != children.end(); ++iter) { Gtk::Widget *child = *iter; paper->remove_child(*child); delete child; } for(gsize i = 0; i < G_N_ELEMENTS (strings); ++i) { Gtk::Label* label = Gtk::manage(new Gtk::Label(strings[i])); Gtk::Frame* frame = Gtk::manage(new Gtk::Frame()); Gtk::EventBox* eventbox = Gtk::manage(new Gtk::EventBox()); label->show(); frame->show(); eventbox->show(); frame->add(*label); eventbox->add(*frame); label->set_line_wrap(); label->set_line_wrap_mode(Pango::WRAP_WORD); label->set_width_chars(10); frame->set_halign(child_halign); spread_table->insert_child(*eventbox, -1); } } static void on_combo_orientation_changed() { Gtk::Orientation orientation = (Gtk::Orientation)combo_orientation->get_active_row_number(); paper->set_orientation(orientation); } static void on_spinbutton_lines_changed() { const int lines = spinbutton_lines->get_value_as_int(); paper->set_lines(lines); } static void on_spinbutton_spacing_changed(Gtk::SpinButton* spinbutton, Gtk::Orientation orientation) { const int state = spinbutton->get_value_as_int(); if(orientation == Gtk::ORIENTATION_HORIZONTAL) paper->set_horizontal_spacing(state); else paper->set_vertical_spacing(state); } static void on_combo_halign_changed() { child_halign = (Gtk::Align)combo_halign->get_active_row_number(); populate_spread_table_wrappy(paper); } static bool on_spreadtable_parent_drop_possible(Gtk::Widget* /* child */, bool& drop_possible) { drop_possible = parent_accepts_drops; return TRUE; //Handled, instead of using the default behaviour. } static bool on_inner_spreadtable_drop_possible(Gtk::Widget* /* child */, bool& drop_possible) { drop_possible = child_accepts_drops; return TRUE; //Handled, instead of using the default behaviour. } static void on_togglebutton_toggled(Gtk::ToggleButton* togglebutton, bool& value) { value = togglebutton->get_active(); } static Gtk::Window * create_window() { Gtk::Window* window = new Gtk::Window(); Gtk::Box* hbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 2)); hbox->show(); Gtk::Box* vbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL, 6)); vbox->show(); window->set_border_width (8); window->add (*hbox); hbox->pack_start(*vbox, false, false, 0); Gtk::Frame* frame = Gtk::manage(new Gtk::Frame("SpreadTable")); frame->show(); hbox->pack_start(*frame, true, true, 0); Gtk::ScrolledWindow* swindow = Gtk::manage(new Gtk::ScrolledWindow()); swindow->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); swindow->show(); frame->add(*swindow); paper = Gtk::manage(new Egg::SpreadTableDnd( Gtk::ORIENTATION_VERTICAL, INITIAL_LINES)); paper->set_vertical_spacing (INITIAL_VSPACING); paper->set_horizontal_spacing (INITIAL_HSPACING); paper->show(); swindow->add(*paper); /* Add SpreadTable test control frame */ Gtk::Expander* expander = Gtk::manage(new Gtk::Expander("SpreadTable controls")); expander->set_expanded(); Gtk::Box* paper_cntl = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL, 2)); paper_cntl->show();; expander->show(); expander->add(*paper_cntl); vbox->pack_start(*expander, false, false, 0); /* Add Orientation control */ combo_orientation = Gtk::manage(new Gtk::ComboBoxText()); combo_orientation->append("Horizontal"); combo_orientation->append("Vertical"); combo_orientation->set_active(1); combo_orientation->show(); combo_orientation->set_tooltip_text("Set the spread_table orientation"); paper_cntl->pack_start(*combo_orientation, false, false, 0); combo_orientation->signal_changed().connect( sigc::ptr_fun(&on_combo_orientation_changed)); /* Add horizontal/vertical spacing controls */ hbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 2)); hbox->show(); Gtk::Widget* label = Gtk::manage(new Gtk::Label("H Spacing")); label->show(); hbox->pack_start(*label, true, true, 0); Gtk::SpinButton* spinbutton = Glib::wrap(GTK_SPIN_BUTTON(gtk_spin_button_new_with_range (0, 30, 1))); spinbutton->set_value(INITIAL_HSPACING); spinbutton->show(); spinbutton->set_tooltip_text("Set the horizontal spacing between children"); hbox->pack_start(*spinbutton, false, false, 0); spinbutton->signal_changed().connect( sigc::bind( sigc::ptr_fun(&on_spinbutton_spacing_changed), spinbutton, Gtk::ORIENTATION_HORIZONTAL)); spinbutton->signal_value_changed().connect( sigc::bind( sigc::ptr_fun(&on_spinbutton_spacing_changed), spinbutton, Gtk::ORIENTATION_HORIZONTAL)); paper_cntl->pack_start(*hbox, false, false, 0); hbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 2)); hbox->show(); label = Gtk::manage(new Gtk::Label("V Spacing")); label->show(); hbox->pack_start(*label, true, true, 0); spinbutton = Glib::wrap(GTK_SPIN_BUTTON(gtk_spin_button_new_with_range (0, 30, 1))); spinbutton->set_value(INITIAL_VSPACING); spinbutton->show(); spinbutton->set_tooltip_text("Set the vertical spacing between children"); hbox->pack_start(*spinbutton, false, false, 0); spinbutton->signal_changed().connect( sigc::bind( sigc::ptr_fun(&on_spinbutton_spacing_changed), spinbutton, Gtk::ORIENTATION_VERTICAL)); spinbutton->signal_value_changed().connect( sigc::bind( sigc::ptr_fun(&on_spinbutton_spacing_changed), spinbutton, Gtk::ORIENTATION_VERTICAL)); paper_cntl->pack_start(*hbox, false, false, 0); /* Add widget-drop-possible controls */ Gtk::ToggleButton* togglebutton = Gtk::manage(new Gtk::ToggleButton("parent accept drop")); togglebutton->show(); togglebutton->set_active(); paper_cntl->pack_start(*togglebutton, false, false, 0); togglebutton->signal_toggled().connect( sigc::bind( sigc::ptr_fun(&on_togglebutton_toggled), togglebutton, parent_accepts_drops)); togglebutton = Gtk::manage(new Gtk::ToggleButton("child accept drop")); togglebutton->show(); togglebutton->set_active(); paper_cntl->pack_start(*togglebutton, false, false, 0); togglebutton->signal_toggled().connect( sigc::bind( sigc::ptr_fun(&on_togglebutton_toggled), togglebutton, child_accepts_drops)); /* Add lines controls */ hbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 2)); hbox->show(); label = Gtk::manage(new Gtk::Label("Lines")); label->show(); hbox->pack_start(*label, true, true, 0); spinbutton_lines = Glib::wrap(GTK_SPIN_BUTTON(gtk_spin_button_new_with_range (1, 30, 1))); spinbutton_lines->set_value(INITIAL_LINES); spinbutton_lines->show(); spinbutton_lines->set_tooltip_text("Set the horizontal spacing between children"); hbox->pack_start(*spinbutton_lines, false, false, 0); spinbutton_lines->signal_changed().connect( sigc::ptr_fun(&on_spinbutton_lines_changed)); spinbutton_lines->signal_value_changed().connect( sigc::ptr_fun(&on_spinbutton_lines_changed)); paper_cntl->pack_start(*hbox, false, false, 0); /* Add test items control frame */ expander = Gtk::manage(new Gtk::Expander("Test item controls")); expander->set_expanded(); Gtk::Box* items_cntl = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL, 2)); items_cntl->show(); expander->show(); expander->add(*items_cntl); vbox->pack_start(*expander, false, false, 0); /* Add child halign control */ combo_halign = Gtk::manage(new Gtk::ComboBoxText()); combo_halign->append("Fill"); combo_halign->append("Start"); combo_halign->append("End"); combo_halign->append("Center"); combo_halign->set_active(INITIAL_HALIGN); combo_halign->show(); combo_halign->set_tooltip_text("Set the children's halign property"); items_cntl->pack_start(*combo_halign, false, false, 0); combo_halign->signal_changed().connect( sigc::ptr_fun(&on_combo_halign_changed)); populate_spread_table_wrappy(paper); /* Embed another dnd spread table */ Egg::SpreadTableDnd* spreadtable_inner = Gtk::manage(new Egg::SpreadTableDnd( Gtk::ORIENTATION_VERTICAL, INITIAL_LINES)); spreadtable_inner->set_vertical_spacing(INITIAL_VSPACING); spreadtable_inner->set_horizontal_spacing(INITIAL_HSPACING); frame = Gtk::manage(new Gtk::Frame()); spreadtable_inner->show(); frame->show(); spreadtable_inner->set_size_request(40, 40); frame->add(*spreadtable_inner); paper->insert_child(*frame, 5); window->set_default_size (500, 400); /* Signals to control drop allowed or not */ paper->signal_widget_drop_possible().connect( sigc::ptr_fun(&on_spreadtable_parent_drop_possible)); spreadtable_inner->signal_widget_drop_possible().connect( sigc::ptr_fun(&on_inner_spreadtable_drop_possible)); return window; } int main(int argc, char *argv[]) { Glib::RefPtr app = Gtk::Application::create(argc, argv, "org.glom.test_spreadtablednd"); Gtk::Window* window = create_window(); return app->run(*window); } glom-1.22.4/glom/utility_widgets/eggspreadtablemm/eggspreadtabledndmm.h0000644000175000017500000000730212234252646027630 0ustar00murraycmurrayc00000000000000/* Copyright (C) 2011 The gtkmm Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _EGG_SPREADTABLE_DND_H #define _EGG_SPREADTABLE_DND_H #include #include //For the enum, though we could wrap it instead. #ifndef DOXYGEN_SHOULD_SKIP_THIS typedef struct _EggSpreadTableDnd EggSpreadTableDnd; typedef struct _EggSpreadTableDndClass EggSpreadTableDndClass; #endif /* DOXYGEN_SHOULD_SKIP_THIS */ namespace Egg { class SpreadTableDnd_Class; } // namespace Egg namespace Egg { class SpreadTableDnd : public SpreadTable { public: #ifndef DOXYGEN_SHOULD_SKIP_THIS typedef SpreadTableDnd CppObjectType; typedef SpreadTableDnd_Class CppClassType; typedef EggSpreadTableDnd BaseObjectType; typedef EggSpreadTableDndClass BaseClassType; #endif /* DOXYGEN_SHOULD_SKIP_THIS */ virtual ~SpreadTableDnd(); #ifndef DOXYGEN_SHOULD_SKIP_THIS private: friend class SpreadTableDnd_Class; static CppClassType spreadtable_class_; // noncopyable SpreadTableDnd(const SpreadTableDnd&); SpreadTableDnd& operator=(const SpreadTableDnd&); protected: explicit SpreadTableDnd(const Glib::ConstructParams& construct_params); explicit SpreadTableDnd(EggSpreadTableDnd* castitem); #endif /* DOXYGEN_SHOULD_SKIP_THIS */ public: #ifndef DOXYGEN_SHOULD_SKIP_THIS static GType get_type() G_GNUC_CONST; static GType get_base_type() G_GNUC_CONST; #endif ///Provides access to the underlying C GtkObject. EggSpreadTableDnd* gobj() { return reinterpret_cast(gobject_); } ///Provides access to the underlying C GtkObject. const EggSpreadTableDnd* gobj() const { return reinterpret_cast(gobject_); } public: //C++ methods used to invoke GTK+ virtual functions: protected: //GTK+ Virtual Functions (override these to change behaviour): //Default Signal Handlers:: bool on_widget_drop_possible(Gtk::Widget* widget, bool& drop_possible); private: public: SpreadTableDnd(); explicit SpreadTableDnd(Gtk::Orientation orientation, guint lines); void insert_child(Gtk::Widget& child, int index); void remove_child(Gtk::Widget& child); void set_drag_enabled(EggDragEnableMode drag_enabled); EggDragEnableMode get_drag_enabled() const; void set_drop_enabled(bool drop_enabled = true); bool get_drop_enabled() const; /** * @par Prototype: * void on_my_%widget_drop_possible() */ Glib::SignalProxy2< bool, Gtk::Widget*, bool& > signal_widget_drop_possible(); }; } // namespace Egg namespace Glib { /** A Glib::wrap() method for this object. * * @param object The C instance. * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref. * @result A C++ instance that wraps this C instance. * * @relates Egg::SpreadTableDnd */ Egg::SpreadTableDnd* wrap(EggSpreadTableDnd* object, bool take_copy = false); } //namespace Glib #endif /* _EGG_SPREADTABLE_H */ glom-1.22.4/glom/utility_widgets/eggspreadtablemm/eggspreadtablemm.h0000644000175000017500000001451012234252646027141 0ustar00murraycmurrayc00000000000000/* Copyright (C) 2010 The gtkmm Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _EGG_SPREADTABLE_H #define _EGG_SPREADTABLE_H #include #include #ifndef DOXYGEN_SHOULD_SKIP_THIS typedef struct _EggSpreadTable EggSpreadTable; typedef struct _EggSpreadTableClass EggSpreadTableClass; #endif /* DOXYGEN_SHOULD_SKIP_THIS */ namespace Egg { class SpreadTable_Class; } // namespace Egg namespace Egg { class SpreadTable : public Gtk::Container, public Gtk::Orientable { public: #ifndef DOXYGEN_SHOULD_SKIP_THIS typedef SpreadTable CppObjectType; typedef SpreadTable_Class CppClassType; typedef EggSpreadTable BaseObjectType; typedef EggSpreadTableClass BaseClassType; #endif /* DOXYGEN_SHOULD_SKIP_THIS */ virtual ~SpreadTable(); #ifndef DOXYGEN_SHOULD_SKIP_THIS private: friend class SpreadTable_Class; static CppClassType spreadtable_class_; // noncopyable SpreadTable(const SpreadTable&); SpreadTable& operator=(const SpreadTable&); protected: explicit SpreadTable(const Glib::ConstructParams& construct_params); explicit SpreadTable(EggSpreadTable* castitem); #endif /* DOXYGEN_SHOULD_SKIP_THIS */ public: #ifndef DOXYGEN_SHOULD_SKIP_THIS static GType get_type() G_GNUC_CONST; static GType get_base_type() G_GNUC_CONST; #endif ///Provides access to the underlying C GtkObject. EggSpreadTable* gobj() { return reinterpret_cast(gobject_); } ///Provides access to the underlying C GtkObject. const EggSpreadTable* gobj() const { return reinterpret_cast(gobject_); } public: //C++ methods used to invoke GTK+ virtual functions: protected: //GTK+ Virtual Functions (override these to change behaviour): //Default Signal Handlers:: private: public: SpreadTable(); explicit SpreadTable(Gtk::Orientation orientation, guint lines); //TODO: Is the default packing appropriate (and like the default for a Box::pack_start())? //This is virtual to avoid us needing to override append_child() too in EggSpreadTableDnd virtual void insert_child(Gtk::Widget& widget, int index); guint get_child_line(const Gtk::Widget& child, int size) const; void set_lines(guint lines); guint get_lines() const; void set_vertical_spacing(guint spacing); guint get_vertical_spacing() const; void set_horizontal_spacing(guint spacing); guint get_horizontal_spacing() const; //TODO: Documentation void append_child(Widget& widget); #ifdef GLIBMM_PROPERTIES_ENABLED /** The amount of vertical space between two children. * * You rarely need to use properties because there are get_ and set_ methods for almost all of them. * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when * the value of the property changes. */ Glib::PropertyProxy property_vertical_spacing() ; #endif //#GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED /** The amount of vertical space between two children. * * You rarely need to use properties because there are get_ and set_ methods for almost all of them. * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when * the value of the property changes. */ Glib::PropertyProxy_ReadOnly property_vertical_spacing() const; #endif //#GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED /** The amount of horizontal space between two children. * * You rarely need to use properties because there are get_ and set_ methods for almost all of them. * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when * the value of the property changes. */ Glib::PropertyProxy property_horizontal_spacing() ; #endif //#GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED /** The amount of horizontal space between two children. * * You rarely need to use properties because there are get_ and set_ methods for almost all of them. * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when * the value of the property changes. */ Glib::PropertyProxy_ReadOnly property_horizontal_spacing() const; #endif //#GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED /** The number of lines (rows/columns) to evenly distribute children to. * * You rarely need to use properties because there are get_ and set_ methods for almost all of them. * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when * the value of the property changes. */ Glib::PropertyProxy property_lines() ; #endif //#GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED /** The number of lines (rows/columns) to evenly distribute children to. * * You rarely need to use properties because there are get_ and set_ methods for almost all of them. * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when * the value of the property changes. */ Glib::PropertyProxy_ReadOnly property_lines() const; #endif //#GLIBMM_PROPERTIES_ENABLED }; } // namespace Egg namespace Glib { /** A Glib::wrap() method for this object. * * @param object The C instance. * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref. * @result A C++ instance that wraps this C instance. * * @relates Egg::SpreadTable */ Egg::SpreadTable* wrap(EggSpreadTable* object, bool take_copy = false); } //namespace Glib #endif /* _EGG_SPREADTABLE_H */ glom-1.22.4/glom/utility_widgets/eggspreadtablemm/eggspreadtablemm.cc0000644000175000017500000001343712234252646027306 0ustar00murraycmurrayc00000000000000/* * * Copyright 2010 The gtkmm Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include namespace Egg { void SpreadTable::append_child(Widget& widget) { insert_child(widget, -1 /* see the C documentation */); } } // namespace Egg namespace Glib { Egg::SpreadTable* wrap(EggSpreadTable* object, bool take_copy) { return dynamic_cast (Glib::wrap_auto ((GObject*)(object), take_copy)); } } /* namespace Glib */ namespace Egg { /* The *_Class implementation: */ const Glib::Class& SpreadTable_Class::init() { if(!gtype_) // create the GType if necessary { // Glib::Class has to know the class init function to clone custom types. class_init_func_ = &SpreadTable_Class::class_init_function; // This is actually just optimized away, apparently with no harm. // Make sure that the parent type has been created. //CppClassParent::CppObjectType::get_type(); // Create the wrapper type, with the same class/instance size as the base type. register_derived_type(egg_spread_table_get_type()); // Add derived versions of interfaces, if the C type implements any interfaces: Gtk::Orientable::add_interface(get_type()); } return *this; } void SpreadTable_Class::class_init_function(void* g_class, void* class_data) { BaseClassType *const klass = static_cast(g_class); CppClassParent::class_init_function(klass, class_data); } Glib::ObjectBase* SpreadTable_Class::wrap_new(GObject* o) { return manage(new SpreadTable((EggSpreadTable*)(o))); } /* The implementation: */ SpreadTable::SpreadTable(const Glib::ConstructParams& construct_params) : Gtk::Container(construct_params) { } SpreadTable::SpreadTable(EggSpreadTable* castitem) : Gtk::Container((GtkContainer*)(castitem)) { } SpreadTable::~SpreadTable() { destroy_(); } SpreadTable::CppClassType SpreadTable::spreadtable_class_; // initialize static member GType SpreadTable::get_type() { return spreadtable_class_.init().get_type(); } GType SpreadTable::get_base_type() { return egg_spread_table_get_type(); } SpreadTable::SpreadTable() : // Mark this class as non-derived to allow C++ vfuncs to be skipped. Glib::ObjectBase(0), Gtk::Container(Glib::ConstructParams(spreadtable_class_.init())) { } SpreadTable::SpreadTable(Gtk::Orientation orientation, guint lines) : // Mark this class as non-derived to allow C++ vfuncs to be skipped. Glib::ObjectBase(0), Gtk::Container(Glib::ConstructParams(spreadtable_class_.init(), "orientation", ((GtkOrientation)(orientation)), "lines", lines, static_cast(0))) { } void SpreadTable::insert_child(Gtk::Widget& widget, int index) { egg_spread_table_insert_child(gobj(), (widget).gobj(), index); } guint SpreadTable::get_child_line(const Gtk::Widget& child, int size) const { return egg_spread_table_get_child_line(const_cast(gobj()), const_cast(child.gobj()), size); } void SpreadTable::set_lines(guint lines) { egg_spread_table_set_lines(gobj(), lines); } guint SpreadTable::get_lines() const { return egg_spread_table_get_lines(const_cast(gobj())); } void SpreadTable::set_vertical_spacing(guint spacing) { egg_spread_table_set_vertical_spacing(gobj(), spacing); } guint SpreadTable::get_vertical_spacing() const { return egg_spread_table_get_vertical_spacing(const_cast(gobj())); } void SpreadTable::set_horizontal_spacing(guint spacing) { egg_spread_table_set_horizontal_spacing(gobj(), spacing); } guint SpreadTable::get_horizontal_spacing() const { return egg_spread_table_get_horizontal_spacing(const_cast(gobj())); } #ifdef GLIBMM_PROPERTIES_ENABLED Glib::PropertyProxy SpreadTable::property_vertical_spacing() { return Glib::PropertyProxy(this, "vertical-spacing"); } #endif //GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED Glib::PropertyProxy_ReadOnly SpreadTable::property_vertical_spacing() const { return Glib::PropertyProxy_ReadOnly(this, "vertical-spacing"); } #endif //GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED Glib::PropertyProxy SpreadTable::property_horizontal_spacing() { return Glib::PropertyProxy(this, "horizontal-spacing"); } #endif //GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED Glib::PropertyProxy_ReadOnly SpreadTable::property_horizontal_spacing() const { return Glib::PropertyProxy_ReadOnly(this, "horizontal-spacing"); } #endif //GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED Glib::PropertyProxy SpreadTable::property_lines() { return Glib::PropertyProxy(this, "lines"); } #endif //GLIBMM_PROPERTIES_ENABLED #ifdef GLIBMM_PROPERTIES_ENABLED Glib::PropertyProxy_ReadOnly SpreadTable::property_lines() const { return Glib::PropertyProxy_ReadOnly(this, "lines"); } #endif //GLIBMM_PROPERTIES_ENABLED } // namespace Egg glom-1.22.4/glom/utility_widgets/layouttoolbar.h0000644000175000017500000000255312234252646023237 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007, 2008 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_LAYOUTTOOLBAR_H #define GLOM_UTILITY_WIDGETS_LAYOUTTOOLBAR_H #include #include #include #include namespace Glom { class LayoutToolbar : public Gtk::ToolPalette { public: LayoutToolbar(); ~LayoutToolbar(); private: Gtk::ToolItemGroup m_group_items, m_group_containers; LayoutToolbarButton m_drag_group, m_drag_notebook, m_drag_item, m_drag_portal, m_drag_button, m_drag_text, m_drag_image; }; } //namespace Glom #endif // GLOM_UTILITY_WIDGETS_LAYOUTTOOLBAR_H glom-1.22.4/glom/utility_widgets/dialog_image_load_progress.h0000644000175000017500000000374012234252646025662 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_DIALOG_IMAGE_LOAD_PROGRESS_H #define GLOM_UTILITY_WIDGETS_DIALOG_IMAGE_LOAD_PROGRESS_H #include #include #include #include #include #include #include namespace Glom { class DialogImageLoadProgress : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; DialogImageLoadProgress(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~DialogImageLoadProgress(); void load(const Glib::ustring& uri); std::auto_ptr get_image_data(); private: void error(const Glib::ustring& error_message); void on_file_read(const Glib::RefPtr& result); void on_query_info(const Glib::RefPtr& result); void on_stream_read(const Glib::RefPtr& result, unsigned int offset); void on_read_next(unsigned int at); std::auto_ptr m_data; Gtk::ProgressBar* m_progress_bar; Glib::RefPtr m_file; Glib::RefPtr m_stream; }; } //namespace Glom #endif // GLOM_UTILITY_WIDGETS_DIALOG_IMAGE_LOAD_PROGRESS_H glom-1.22.4/glom/utility_widgets/dialog_image_save_progress.cc0000644000175000017500000001130612234252646026034 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_image_save_progress.h" #include #include #include #include namespace { // Write the file in chunks of this size: const unsigned int CHUNK_SIZE = 2048; } // anonymous namespace namespace Glom { const char* DialogImageSaveProgress::glade_id("dialog_image_save_progress"); const bool DialogImageSaveProgress::glade_developer(false); DialogImageSaveProgress::DialogImageSaveProgress(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_data(0) { builder->get_widget("progress_bar", m_progress_bar); if(!m_progress_bar) throw std::runtime_error("Missing widgets from glade file for DialogImageSaveProgress"); } DialogImageSaveProgress::~DialogImageSaveProgress() { } void DialogImageSaveProgress::save(const Glib::ustring& uri) { g_assert(m_data); if(m_data->data == 0) return; if(m_data->binary_length == 0) return; m_file = Gio::File::create_for_uri(uri); m_progress_bar->set_text(Glib::ustring::compose("Saving %1...", m_file->get_parse_name())); m_stream.reset(); try { if(m_file->query_exists()) { m_stream = m_file->replace(); //Instead of append_to(). } else { //By default files created are generally readable by everyone, but if we pass FILE_CREATE_PRIVATE in flags the file will be made readable only to the current user, to the level that is supported on the target filesystem. //TODO: Do we want to specify 0660 exactly? (means "this user and his group can read and write this non-executable file".) m_stream = m_file->create_file(); } } catch(const Gio::Error& ex) { std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; response(Gtk::RESPONSE_REJECT); return; } //Write the data to the output uri try { m_stream->write_async(m_data->data, std::min(CHUNK_SIZE, m_data->binary_length), sigc::bind(sigc::mem_fun(*this, &DialogImageSaveProgress::on_stream_write), 0)); } catch(const Gio::Error& ex) { std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; response(Gtk::RESPONSE_REJECT); return; } } void DialogImageSaveProgress::on_stream_write(const Glib::RefPtr& result, unsigned int offset) { try { const gssize size = m_stream->write_finish(result); g_assert(size >= 0); // Would have thrown an exception otherwise // Set progress m_progress_bar->set_fraction(static_cast(offset + size) / m_data->binary_length); // Write next chunk, if any if( static_cast(offset + size) < static_cast(m_data->binary_length)) // Even if choose a priority lower than GDK_PRIORITY_REDRAW + 10 for the // write_async we don't see the progressbar progressing while the image // is loading. Therefore we put an idle inbetween. Glib::signal_idle().connect(sigc::bind_return(sigc::bind(sigc::mem_fun(*this, &DialogImageSaveProgress::on_write_next), offset + size), false)); else // We are done saving the image, close the progress dialog response(Gtk::RESPONSE_ACCEPT); } catch(const Glib::Error& ex) { error(ex.what()); response(Gtk::RESPONSE_REJECT); } } void DialogImageSaveProgress::error(const Glib::ustring& error_message) { Gtk::MessageDialog dialog(*this, _("Error Saving"), Gtk::MESSAGE_ERROR); dialog.set_title(_("Error saving image")); dialog.set_secondary_text(error_message); dialog.run(); response(Gtk::RESPONSE_REJECT); } void DialogImageSaveProgress::on_write_next(unsigned int at) { g_assert(at < static_cast(m_data->binary_length)); m_stream->write_async(m_data->data + at, std::min(CHUNK_SIZE, m_data->binary_length - at), sigc::bind(sigc::mem_fun(*this, &DialogImageSaveProgress::on_stream_write), at)); } void DialogImageSaveProgress::set_image_data(const GdaBinary& data) { m_data = &data; } } // namespace Glom glom-1.22.4/glom/utility_widgets/dialog_flowtable.h0000644000175000017500000000342112234776363023637 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2008 Johannes Schmid * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_FLOWTABLE_H #define GLOM_DIALOG_FLOWTABLE_H #include #include #include #include #include "../mode_data/flowtablewithfields.h" #include namespace Glom { //TODO: Is this used? class Dialog_FlowTable : public Gtk::Dialog, public Base_DB //Give this class access to the current document, and to some utility methods. { public: static const char* glade_id; static const bool glade_developer; Dialog_FlowTable(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_FlowTable(); void set_flowtable(FlowTableWithFields* flowtable); gint get_columns_count(); //TODO: Make const? Glib::ustring get_title(); //TODO: Isn't this the same as Widget::get_title()? private: Gtk::Entry* m_entry_title; Gtk::SpinButton* m_spin_columns; FlowTableWithFields* m_flowtable; sharedptr m_layoutgroup; }; } //namespace Glom #endif // GLOM_DIALOG_FLOWTABLE_H glom-1.22.4/glom/utility_widgets/filechooserdialog_saveextras.h0000644000175000017500000000562612234776363026301 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_FILECHOOSERDIALOG_SAVEEXTRAS_H #define GLOM_UTILITY_WIDGETS_FILECHOOSERDIALOG_SAVEEXTRAS_H #include "config.h" //For GLOM_ENABLE_SQLITE #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY, #include #include #include #include #include #include #include namespace Glom { class FileChooserDialog_SaveExtras : public Gtk::FileChooserDialog { public: FileChooserDialog_SaveExtras(const Glib::ustring& title, Gtk::FileChooserAction action, const Glib::ustring& backend); FileChooserDialog_SaveExtras(Gtk::Window& parent, const Glib::ustring& title, Gtk::FileChooserAction action, const Glib::ustring& backend); explicit FileChooserDialog_SaveExtras(const Glib::ustring& title, Gtk::FileChooserAction action = Gtk::FILE_CHOOSER_ACTION_OPEN); FileChooserDialog_SaveExtras(Gtk::Window& parent, const Glib::ustring& title, Gtk::FileChooserAction action = Gtk::FILE_CHOOSER_ACTION_OPEN); virtual ~FileChooserDialog_SaveExtras(); void set_extra_message(const Glib::ustring& message); void set_extra_newdb_title(const Glib::ustring& title); #ifndef GLOM_ENABLE_CLIENT_ONLY void set_extra_newdb_hosting_mode(Document::HostingMode mode); //void set_extra_newdb_self_hosted(bool self_hosted = true); #endif // !GLOM_ENABLE_CLIENT_ONLY Glib::ustring get_extra_newdb_title() const; #ifndef GLOM_ENABLE_CLIENT_ONLY Document::HostingMode get_extra_newdb_hosting_mode() const; #endif // !GLOM_ENABLE_CLIENT_ONLY private: void create_child_widgets(); Gtk::Box m_extra_widget; Gtk::Label m_label_extra_message; /* New database details: */ Gtk::Entry m_entry_title; #ifndef GLOM_ENABLE_CLIENT_ONLY #ifdef GLOM_ENABLE_POSTGRESQL Gtk::RadioButton m_radiobutton_server_postgres_central; Gtk::RadioButton m_radiobutton_server_postgres_selfhosted; #endif // GLOM_ENABLE_POSTGRESQL #ifdef GLOM_ENABLE_SQLITE Gtk::RadioButton m_radiobutton_server_sqlite; #endif // GLOM_ENABLE_SQLITE #endif // !GLOM_ENABLE_CLIENT_ONLY }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_FILECHOOSERDIALOG_GLOM_H glom-1.22.4/glom/utility_widgets/layoutwidgetfield.h0000644000175000017500000000312512234252646024060 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_LAYOUT_WIDGET_FIELD_H #define GLOM_UTILITY_WIDGETS_LAYOUT_WIDGET_FIELD_H #include "layoutwidgetmenu.h" namespace Glom { class LayoutWidgetField : public LayoutWidgetMenu { public: LayoutWidgetField(); virtual ~LayoutWidgetField(); virtual void set_value(const Gnome::Gda::Value& value) = 0; virtual Gnome::Gda::Value get_value() const = 0; /** Whether this widget still has the original entered data, instead of just a representation. * For instance, an image widget might only store a preview. */ virtual bool get_has_original_data() const; typedef sigc::signal type_signal_edited; type_signal_edited signal_edited(); protected: type_signal_edited m_signal_edited; bool m_entered_data_stored; }; } //namespace Glom #endif // GLOM_UTLITY_WIDGETS_LAYOUT_WIDGET_FIELD_H glom-1.22.4/glom/utility_widgets/combo_textglade.h0000644000175000017500000000266712234252646023505 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_COMBO_TEXTGLADE_H #define GLOM_UTILITY_WIDGETS_COMBO_TEXTGLADE_H #include #include #include namespace Glom { /** This class just derives from Gtk::ComboBoxText and provides a constuctor suitable for libglade's get_widget_derived() template. * so we can use its set_first_active() method. */ class Combo_TextGlade : public Gtk::ComboBoxText { public: Combo_TextGlade(BaseObjectType* cobject, const Glib::RefPtr& builder); ///This ensures that something is selected, void set_first_active(); }; } //namespace Glom #endif // GLOM_UTILITY_WIDGETS_COMBO_TEXTGLADE_H glom-1.22.4/glom/utility_widgets/notebookglom.cc0000644000175000017500000000365412234776363023206 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "notebookglom.h" #include #include #include //#include //For stringstream namespace Glom { NotebookGlom::NotebookGlom(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::Notebook(cobject) { #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // !GLOM_ENABLE_CLIENT_ONLY init(); //set_size_request(400, -1); //It doesn't seem to demand the space used by its children. } NotebookGlom::NotebookGlom() { #ifndef GLOM_ENABLE_CLIENT_ONLY setup_menu(); #endif // !GLOM_ENABLE_CLIENT_ONLY init(); //set_size_request(400, -1); //It doesn't seem to demand the space used by its children. } NotebookGlom::~NotebookGlom() { } void NotebookGlom::init() { } AppWindow* NotebookGlom::get_appwindow() const { Gtk::Container* pWindow = const_cast(get_toplevel()); //TODO: This only works when the child widget is already in its parent. return dynamic_cast(pWindow); } void NotebookGlom::delete_from_layout() { #ifndef GLOM_ENABLE_CLIENT_ONLY on_menupopup_activate_delete(); #endif // !GLOM_ENABLE_CLIENT_ONLY } } //namespace Glom glom-1.22.4/glom/utility_widgets/test_flowtable.cc0000644000175000017500000000720712234252646023514 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include "flowtable.h" #include //#include "dragwindow.h" /* void on_drag_data_get_label(const Glib::RefPtr&, Gtk::SelectionData& selection_data, guint, guint) { selection_data.set(selection_data.get_target(), 8, (const guchar*)"label", 5); } void on_drag_data_get_entry(const Glib::RefPtr&, Gtk::SelectionData& selection_data, guint, guint) { selection_data.set(selection_data.get_target(), 8, (const guchar*)"entry", 5); } */ typedef std::list type_vec_widgets; type_vec_widgets vec_child_widgets; static void fill_flowtable(Glom::FlowTable& flowtable) { Gtk::Entry* button1 = Gtk::manage(new Gtk::Entry()); button1->set_text("one"); button1->show(); //button1->set_size_request(100, 100); vec_child_widgets.push_back(button1); Gtk::Entry* button2 = Gtk::manage(new Gtk::Entry()); button2->set_text("two"); flowtable.add_widgets(*button1, *button2); button2->show(); //button2->set_size_request(100, 100); vec_child_widgets.push_back(button2); Gtk::Label* button3 = Gtk::manage(new Gtk::Label()); button3->set_text("three"); //TODO: valgrind says that something here is leaked. button3->show(); //button1->set_size_request(100, 100); vec_child_widgets.push_back(button3); Gtk::Entry* button4 = Gtk::manage(new Gtk::Entry()); button4->set_text("four"); flowtable.add_widgets(*button3, *button4); button4->show(); vec_child_widgets.push_back(button4); Gtk::Entry* button5 = Gtk::manage(new Gtk::Entry()); button5->set_text("five"); Gtk::Entry* button6 = Gtk::manage(new Gtk::Entry()); button6->set_text("size"); flowtable.add_widgets(*button5, *button6); button5->show(); button6->show(); vec_child_widgets.push_back(button5); vec_child_widgets.push_back(button6); } static void clear_flowtable(Glom::FlowTable& flowtable) { flowtable.remove_all(); //std::cout << G_STRFUNC << ": debug 1" << std::endl; for(type_vec_widgets::iterator iter = vec_child_widgets.begin(); iter != vec_child_widgets.end(); ++iter) { Gtk::Widget* widget = *iter; //std::cout << " loop: widget=" << widget << std::endl; delete widget; //TODO: This crashes } vec_child_widgets.clear(); } int main(int argc, char* argv[]) { Glib::RefPtr app = Gtk::Application::create(argc, argv, "org.glom.test_flowtable"); Gtk::Window window; //Gtk::Box flowtable; Glom::FlowTable flowtable; flowtable.set_lines(2); flowtable.set_horizontal_spacing(6); flowtable.set_vertical_spacing(6); fill_flowtable(flowtable); clear_flowtable(flowtable); fill_flowtable(flowtable); window.add(flowtable); flowtable.set_design_mode(); flowtable.show(); // Glom::DragWindow drag_window; // drag_window.show(); return app->run(window); } glom-1.22.4/glom/utility_widgets/dialog_image_save_progress.h0000644000175000017500000000350312234252646025676 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_DIALOG_IMAGE_SAVE_PROGRESS_H #define GLOM_UTILITY_WIDGETS_DIALOG_IMAGE_SAVE_PROGRESS_H #include #include #include #include #include #include namespace Glom { class DialogImageSaveProgress : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; DialogImageSaveProgress(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~DialogImageSaveProgress(); void save(const Glib::ustring& uri); void set_image_data(const GdaBinary& data); private: void on_stream_write(const Glib::RefPtr& result, unsigned int offset); void error(const Glib::ustring& error_message); void on_write_next(unsigned int at); Gtk::ProgressBar* m_progress_bar; const GdaBinary* m_data; Glib::RefPtr m_file; Glib::RefPtr m_stream; }; } //namespace Glom #endif // GLOM_UTILITY_WIDGETS_DIALOG_IMAGE_SAVE_PROGRESS_H glom-1.22.4/glom/utility_widgets/dialog_image_load_progress.cc0000644000175000017500000001234112234252646026015 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_image_load_progress.h" #include #include #include namespace { // Read the file in chunks of this size: const unsigned int CHUNK_SIZE = 2048; } // anonymous namespace namespace Glom { const char* DialogImageLoadProgress::glade_id("dialog_image_load_progress"); const bool DialogImageLoadProgress::glade_developer(false); DialogImageLoadProgress::DialogImageLoadProgress(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject) { builder->get_widget("progress_bar", m_progress_bar); if(!m_progress_bar) throw std::runtime_error("Missing widgets from glade file for DialogImageLoadProgress"); } DialogImageLoadProgress::~DialogImageLoadProgress() { if(m_data.get()) g_free(m_data->data); // TODO: Cancel outstanding async operations in destructor? } void DialogImageLoadProgress::load(const Glib::ustring& uri) { // Can only load one file with data g_assert(!m_data.get()); m_data.reset(new GdaBinary); m_data->data = 0; m_data->binary_length = 0; m_file = Gio::File::create_for_uri(uri); m_progress_bar->set_text(Glib::ustring::compose("Loading %1...", m_file->get_parse_name())); try { // Open the file for reading: m_file->read_async(sigc::mem_fun(*this, &DialogImageLoadProgress::on_file_read)); } catch(const Glib::Error& ex) { error(ex.what()); } } void DialogImageLoadProgress::on_file_read(const Glib::RefPtr& result) { try { m_stream = m_file->read_finish(result); // Query size of the file, so that we can show progress: m_stream->query_info_async(sigc::mem_fun(*this, &DialogImageLoadProgress::on_query_info), G_FILE_ATTRIBUTE_STANDARD_SIZE); } catch(const Glib::Error& ex) { error(ex.what()); } } void DialogImageLoadProgress::on_query_info(const Glib::RefPtr& result) { try { Glib::RefPtr info = m_stream->query_info_finish(result); m_data->binary_length = info->get_size(); // We need to use the glib allocator here: m_data->data = static_cast(g_try_malloc(m_data->binary_length)); if(!m_data->data) error(_("Not enough memory available to load the image")); // Read the first chunk from the file m_stream->read_async(m_data->data, std::min(CHUNK_SIZE, m_data->binary_length), sigc::bind(sigc::mem_fun(*this, &DialogImageLoadProgress::on_stream_read), 0)); } catch(const Glib::Error& ex) { error(ex.what()); } } void DialogImageLoadProgress::on_stream_read(const Glib::RefPtr& result, unsigned int offset) { try { const gssize size = m_stream->read_finish(result); g_assert(size >= 0); // Would have thrown an exception otherwise // Cannot read more data than there is available in the file: g_assert( static_cast(offset + size) <= static_cast(m_data->binary_length)); // Set progress m_progress_bar->set_fraction(static_cast(offset + size) / m_data->binary_length); // Read next chunk, if any if( static_cast(offset + size) < static_cast(m_data->binary_length) ) { // Even if choose a priority lower than GDK_PRIORITY_REDRAW + 10 for the // read_async we don't see the progressbar progressing while the image // is loading. Therefore we put an idle inbetween. Glib::signal_idle().connect(sigc::bind_return(sigc::bind(sigc::mem_fun(*this, &DialogImageLoadProgress::on_read_next), offset + size), false)); } else // We are done loading the image, close the progress dialog response(Gtk::RESPONSE_ACCEPT); } catch(const Glib::Error& ex) { error(ex.what()); response(Gtk::RESPONSE_REJECT); } } void DialogImageLoadProgress::on_read_next(unsigned int at) { g_assert(at < static_cast(m_data->binary_length)); m_stream->read_async(m_data->data + at, std::min(CHUNK_SIZE, m_data->binary_length - at), sigc::bind(sigc::mem_fun(*this, &DialogImageLoadProgress::on_stream_read), at)); } void DialogImageLoadProgress::error(const Glib::ustring& error_message) { Gtk::MessageDialog dialog(*this, Glib::ustring::compose(_("Error loading %1"), m_file->get_parse_name()), Gtk::MESSAGE_ERROR); dialog.set_title(_("Error loading image")); dialog.set_secondary_text(error_message); dialog.run(); response(Gtk::RESPONSE_REJECT); } std::auto_ptr DialogImageLoadProgress::get_image_data() { return m_data; } } // namespace Glom glom-1.22.4/glom/utility_widgets/canvas/0000755000175000017500000000000012235000126021415 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/utility_widgets/canvas/canvas_group_movable.h0000644000175000017500000000374212234252646026007 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_GROUP_MOVABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_GROUP_MOVABLE_H #include "canvas_item_movable.h" #include namespace Glom { class CanvasGroupMovable : public Goocanvas::Group, public CanvasItemMovable { protected: CanvasGroupMovable(); virtual ~CanvasGroupMovable(); public: static Glib::RefPtr create(); virtual void get_xy(double& x, double& y) const; virtual void set_xy(double x, double y); virtual void get_width_height(double& width, double& height) const; virtual void set_width_height(double width, double height); virtual void set_grid(const Glib::RefPtr& grid); private: virtual Goocanvas::Canvas* get_parent_canvas_widget(); enum Corners { CORNER_TOP_LEFT, CORNER_TOP_RIGHT, CORNER_BOTTOM_LEFT, CORNER_BOTTOM_RIGHT, CORNER_COUNT }; void snap_position_one_corner(Corners corner, double& x, double& y) const; virtual void snap_position(double& x, double& y) const; //We store the position so that we have something before any children wer added: double m_x, m_y, m_width, m_height; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_GROUP_MOVABLE_H glom-1.22.4/glom/utility_widgets/canvas/canvas_rect_movable.cc0000644000175000017500000001202312234252646025736 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_rect_movable.h" #include #include #include namespace Glom { CanvasRectMovable::CanvasRectMovable() : Goocanvas::Rect(0.0, 0.0, 0.0, 0.0), CanvasItemMovable(), m_snap_corner(CORNER_ALL) { init(); } CanvasRectMovable::CanvasRectMovable(double x, double y, double width, double height) : Goocanvas::Rect(x, y, width, height), m_snap_corner(CORNER_ALL) { init(); } CanvasRectMovable::~CanvasRectMovable() { } void CanvasRectMovable::init() { signal_motion_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_motion_notify_event)); signal_button_press_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_press_event)); signal_button_release_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_release_event)); signal_enter_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_enter_notify_event)); signal_leave_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_leave_notify_event)); } Glib::RefPtr CanvasRectMovable::create() { return Glib::RefPtr(new CanvasRectMovable()); } Glib::RefPtr CanvasRectMovable::create(double x, double y, double width, double height) { return Glib::RefPtr(new CanvasRectMovable(x, y, width, height)); } void CanvasRectMovable::get_xy(double& x, double& y) const { x = property_x(); y = property_y(); } void CanvasRectMovable::set_xy(double x, double y) { property_x() = x; property_y() = y; } void CanvasRectMovable::get_width_height(double& width, double& height) const { width = property_width(); height = property_height(); } void CanvasRectMovable::set_width_height(double width, double height) { property_width() = width; property_height() = height; } void CanvasRectMovable::snap_position_one_corner(Corners corner, double& x, double& y) const { //Choose the offset of the part to snap to the grid: double corner_x_offset = 0; double corner_y_offset = 0; switch(corner) { case CORNER_TOP_LEFT: corner_x_offset = 0; corner_y_offset = 0; break; case CORNER_TOP_RIGHT: corner_x_offset = property_width(); corner_y_offset = 0; break; case CORNER_BOTTOM_LEFT: corner_x_offset = 0; corner_y_offset = property_height(); break; case CORNER_BOTTOM_RIGHT: corner_x_offset = property_width(); corner_y_offset = property_height(); break; default: break; } //Snap that point to the grid: const double x_to_snap = x + corner_x_offset; const double y_to_snap = y + corner_y_offset; double corner_x_snapped = x_to_snap; double corner_y_snapped = y_to_snap; CanvasItemMovable::snap_position(corner_x_snapped, corner_y_snapped); //Discover what offset the snapping causes: const double snapped_offset_x = corner_x_snapped - x_to_snap; const double snapped_offset_y = corner_y_snapped - y_to_snap; //Apply that offset to the regular position: x += snapped_offset_x; y += snapped_offset_y; } void CanvasRectMovable::snap_position_all_corners(double& x, double& y) const { double offset_x_min = 0; double offset_y_min = 0; //Try snapping each corner, to choose the one that snapped closest: for(int i = CORNER_TOP_LEFT; i < CORNER_COUNT; ++i) { const Corners corner = (Corners)i; double temp_x = x; double temp_y = y; snap_position_one_corner(corner, temp_x, temp_y); const double offset_x = temp_x -x; const double offset_y = temp_y - y; //Use the smallest offset, preferring some offset to no offset: if(offset_x && ((std::abs(offset_x) < std::abs(offset_x_min)) || !offset_x_min)) offset_x_min = offset_x; if(offset_y && ((std::abs(offset_y) < std::abs(offset_y_min)) || !offset_y_min)) offset_y_min = offset_y; } x += offset_x_min; y += offset_y_min; } void CanvasRectMovable::snap_position(double& x, double& y) const { if(m_snap_corner == CORNER_ALL) return snap_position_all_corners(x, y); else return snap_position_one_corner(m_snap_corner, x, y); } Goocanvas::Canvas* CanvasRectMovable::get_parent_canvas_widget() { return get_canvas(); } void CanvasRectMovable::set_snap_corner(Corners corner) { m_snap_corner = corner; } } //namespace Glom glom-1.22.4/glom/utility_widgets/canvas/canvas_text_movable.cc0000644000175000017500000001411112234252646025765 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_text_movable.h" #include #include #include #include namespace Glom { CanvasTextMovable::CanvasTextMovable(const Glib::ustring& text, double x, double y, double width, Goocanvas::AnchorType anchor) : Goocanvas::Text(text, x, y, width, anchor), m_snap_corner(CORNER_TOP_LEFT) //arbitrary default. { init(); } CanvasTextMovable::~CanvasTextMovable() { } void CanvasTextMovable::init() { signal_motion_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_motion_notify_event)); signal_button_press_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_press_event)); signal_button_release_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_release_event)); signal_enter_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_enter_notify_event)); signal_leave_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_leave_notify_event)); } Glib::RefPtr CanvasTextMovable::create(const Glib::ustring& string, double x, double y, double width, Goocanvas::AnchorType anchor) { return Glib::RefPtr(new CanvasTextMovable(string, x, y, width, anchor)); } void CanvasTextMovable::get_xy(double& x, double& y) const { x = property_x(); y = property_y(); } void CanvasTextMovable::set_xy(double x, double y) { property_x() = x; property_y() = y; } void CanvasTextMovable::get_width_height(double& width, double& height) const { //TODO: This only works when it is on a canvas already, //and this is apparently incorrect when the "coordinate space" of the item changes, whatever that means. murrayc. width = property_width(); height = property_height(); } void CanvasTextMovable::set_width_height(double width, double height) { property_width() = width; property_height() = height; } void CanvasTextMovable::snap_position(double& x, double& y) const { double width = 0; double height = 0; get_width_height(width, height); //Choose the offset of the part to snap to the grid: double corner_x_offset = 0; double corner_y_offset = 0; switch(m_snap_corner) { case CORNER_TOP_LEFT: corner_x_offset = 0; corner_y_offset = 0; break; case CORNER_TOP_RIGHT: corner_x_offset = property_width(); corner_y_offset = 0; break; case CORNER_BOTTOM_LEFT: corner_x_offset = 0; corner_y_offset = height; break; case CORNER_BOTTOM_RIGHT: corner_x_offset = width; corner_y_offset = height; break; default: break; } //Snap that point to the grid: const double x_to_snap = x + corner_x_offset; const double y_to_snap = y + corner_y_offset; double corner_x_snapped = x_to_snap; double corner_y_snapped = y_to_snap; CanvasItemMovable::snap_position(corner_x_snapped, corner_y_snapped); //Discover what offset the snapping causes: const double snapped_offset_x = corner_x_snapped - x_to_snap; const double snapped_offset_y = corner_y_snapped - y_to_snap; //Apply that offset to the regular position: x += snapped_offset_x; y += snapped_offset_y; } Goocanvas::Canvas* CanvasTextMovable::get_parent_canvas_widget() { return get_canvas(); } void CanvasTextMovable::set_snap_corner(Corners corner) { m_snap_corner = corner; } void CanvasTextMovable::set_text(const Glib::ustring& text) { m_text = text; reconstruct_markup(); } void CanvasTextMovable::set_font_points(const Glib::ustring& font) { Glib::ustring font_points = font; if(font_points.empty()) font_points = "Serif 9"; //Convert the size to mm, because GooCanvasText can only understand font sizes in terms of the canvas units, //but user will provide the size in points. //TODO: Discover the canvas units and do an appropriate conversion, //so that this works for other canvas units: Pango::FontDescription pango_font(font_points); pango_font.set_absolute_size( (int)((double)pango_font.get_size() * 0.375) ); //according to Wikipedia. //I don't know what it would be relative to, but it seems necessary to specify the absolute size. font_points = pango_font.to_string(); m_font = font_points; //std::cout << "DEBUG: m_font=" << m_font << std::endl; reconstruct_markup(); } void CanvasTextMovable::reconstruct_markup() { if(m_font.empty()) { property_text() = m_text; return; } char* markup = 0; if(!m_text.empty()) { //We will use the text as markup, so remove anything that could be //interpreted as pango markup. //This is not really pango-specific, but it might just work: const Glib::ustring text_escaped = Glib::Markup::escape_text(m_text); //We add px (meaning absolute points size). //Otherwise both GooCanvas and GTK+ scale the font up, making it too large. //This really seems like a bug in GooCanvas. //TODO: This might not be robust - it assumes that the font size is at the end of the font_desc //provided by GtkFontButton. markup = g_strdup_printf("%s", m_font.c_str(), text_escaped.c_str()); //std::cout << "DEBUG: markup=" << markup << std::endl; } property_use_markup() = true; if(markup) { property_text() = Glib::ustring(markup); //TODO: Inefficient. g_free(markup); } else { property_text() = Glib::ustring(); } } } //namespace Glom glom-1.22.4/glom/utility_widgets/canvas/canvas_item_movable.h0000644000175000017500000001370112234252646025605 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_ITEM_MOVABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_ITEM_MOVABLE_H #include "canvas_group_grid.h" #include #include namespace Glom { class CanvasItemMovable : virtual public Glib::ObjectBase { protected: CanvasItemMovable(); virtual ~CanvasItemMovable(); public: /* Get the position of the item. * For some items, this is an arbitrary part of the item, * such as the top-left of a rectangle, * or the first point in a line. */ virtual void get_xy(double& x, double& y) const = 0; /** Move the item. * This should be the same arbitrary part of the item that is used by get_xy(). * All other parts of the item will move by the same offset. */ virtual void set_xy(double x, double y) = 0; /* */ virtual void get_width_height(double& width, double& height) const = 0; /** */ virtual void set_width_height(double width, double height) = 0; void set_drag_cursor(Gdk::CursorType cursor); void set_drag_cursor(const Glib::RefPtr& cursor); /** For instance, * * @param item The item (this item) that was moved, for convenience. * @param x_offset How much the item has moved in the x dimension. * @param y_offset How much the item has moved in the y dimension. * * void on_moved(bool group_select, double x_offset, double y_offset); */ typedef sigc::signal&, double, double> type_signal_moved; /// This signal is emitted when the canvas item is moved by the user. type_signal_moved signal_moved(); /** void on_show_context(guint button, guint32 activate_time); */ typedef sigc::signal type_signal_show_context; type_signal_show_context signal_show_context(); /** For instance, * * @param item The item (this item) that was selected/deseleted, for convenience. * @param group_select Whether the user selected this while pressing Shift to select multiple items. * * void on_selected(bool group_select); */ typedef sigc::signal&, bool> type_signal_selected; /** This signal is emitted if the user causes the item * to be selected or deselected. See get_selected(). */ type_signal_selected signal_selected(); /** Provide information about a grid or rules, * to which the item should snap when moving: * * @param grid: This must exist for as long as the canvas item. */ virtual void set_grid(const Glib::RefPtr& grid); /** Restrict drag movement (via dragging) to the x axis or the y axis, * or prevent all drag movement. */ void set_movement_allowed(bool vertical = true, bool horizontal = true); ///A convenience function, to avoid repeating a large if/else block. static Glib::RefPtr cast_to_movable(const Glib::RefPtr& item); static Glib::RefPtr cast_const_to_movable(const Glib::RefPtr& item); static Glib::RefPtr cast_to_item(const Glib::RefPtr& item); static Glib::RefPtr cast_const_to_item(const Glib::RefPtr& item); virtual void snap_position(double& x, double& y) const; /** Mark the item as selected, * meaning that its boundaries will be visible, * and this can be queried later, for instance to move several items together. */ void set_selected(bool selected = true); bool get_selected() const; private: /** Show some visual cue that the item is selected, * depending on the value of get_selected(), * hiding that visual cue if it is not selected. */ virtual void show_selected(); virtual Goocanvas::Canvas* get_parent_canvas_widget() = 0; void set_cursor(const Glib::RefPtr& cursor); void unset_cursor(); public: //These should really be protected, but the compiler doesn't allow it: bool on_button_press_event(const Glib::RefPtr& target, GdkEventButton* event); bool on_motion_notify_event(const Glib::RefPtr& target, GdkEventMotion* event); bool on_button_release_event(const Glib::RefPtr& target, GdkEventButton* event); bool on_enter_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); bool on_leave_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); private: bool m_dragging; bool m_dragging_vertical_only, m_dragging_horizontal_only; //Set by using Ctrl while dragging. double m_drag_start_cursor_x, m_drag_start_cursor_y; double m_drag_start_position_x, m_drag_start_position_y; double m_drag_latest_position_x, m_drag_latest_position_y; //To discover how much the latest motion_event has moved the item. Glib::RefPtr m_drag_cursor; protected: Glib::RefPtr m_grid; private: bool m_allow_vertical_movement, m_allow_horizontal_movement; bool m_selected; bool m_shift_click; type_signal_moved m_signal_moved; type_signal_show_context m_signal_show_context; type_signal_selected m_signal_selected; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_ITEM_MOVABLE_H glom-1.22.4/glom/utility_widgets/canvas/canvas_line_movable.h0000644000175000017500000000350212234252646025574 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_LINE_MOVABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_LINE_MOVABLE_H #include "canvas_item_movable.h" #include namespace Glom { class CanvasLineMovable : public Goocanvas::Polyline, public CanvasItemMovable { protected: CanvasLineMovable(); virtual ~CanvasLineMovable(); public: static Glib::RefPtr create(); void set_hover_color(const Glib::ustring& color); virtual void get_xy(double& x, double& y) const; virtual void set_xy(double x, double y); virtual void get_width_height(double& width, double& height) const; virtual void set_width_height(double width, double height); private: virtual Goocanvas::Canvas* get_parent_canvas_widget(); virtual bool on_enter_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); virtual bool on_leave_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); Gdk::RGBA m_stroke_color; Glib::ustring m_hover_color; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_LINE_MOVABLE_H glom-1.22.4/glom/utility_widgets/canvas/canvas_table_movable.h0000644000175000017500000000442712234252646025743 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_TABLE_MOVABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_TABLE_MOVABLE_H #include "canvas_item_movable.h" #include namespace Glom { class CanvasTableMovable : public Goocanvas::Table, public CanvasItemMovable { private: CanvasTableMovable(); virtual ~CanvasTableMovable(); public: static Glib::RefPtr create(); virtual void get_xy(double& x, double& y) const; virtual void set_xy(double x, double y); virtual void get_width_height(double& width, double& height) const; virtual void set_width_height(double width, double height); virtual void set_grid(const Glib::RefPtr& grid); void set_lines_details(double row_line_width, double column_line_width, const Glib::ustring& color); /** Show horizontal and vertical grid lines, if they were not shown already somehow. * @param show If this is false then the normal lines will be shown, or no lines. See set_line_details(). */ void set_lines_visibility(bool show = true); private: virtual Goocanvas::Canvas* get_parent_canvas_widget(); enum Corners { CORNER_TOP_LEFT, CORNER_TOP_RIGHT, CORNER_BOTTOM_LEFT, CORNER_BOTTOM_RIGHT, CORNER_COUNT }; void snap_position_one_corner(Corners corner, double& x, double& y) const; virtual void snap_position(double& x, double& y) const; double m_row_line_width, m_column_line_width; Glib::ustring m_line_color; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_TABLE_MOVABLE_H glom-1.22.4/glom/utility_widgets/canvas/canvas_editable.cc0000644000175000017500000001444612234252646025060 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_editable.h" #include "canvas_group_resizable.h" #include "canvas_rect_movable.h" #include #include namespace Glom { CanvasEditable::CanvasEditable() : m_dragging(false), m_drag_x(0.0), m_drag_y(0.0) { m_grid = CanvasGroupGrid::create(); add_item(m_grid); } CanvasEditable::~CanvasEditable() { } void CanvasEditable::add_item(const Glib::RefPtr& item, bool resizable) { Glib::RefPtr root = get_root_item(); Glib::RefPtr root_group = Glib::RefPtr::cast_dynamic(root); if(!root_group) return; add_item(item, root_group, resizable); } void CanvasEditable::add_item(const Glib::RefPtr& item, const Glib::RefPtr& group, bool resizable) { if(!group) return; bool added = false; //Add it inside a manipulatable group, if requested: if(resizable) { Glib::RefPtr movable = Glib::RefPtr::cast_dynamic(item); if(movable) { Glib::RefPtr resizable = CanvasGroupResizable::create(); resizable->set_grid(m_grid); //Specify the resizable's position, using the child's position: double x = 0; double y = 0; movable->get_xy(x, y); double width = 0; double height = 0; movable->get_width_height(width, height); resizable->set_xy(x, y); resizable->set_width_height(width, height); group->add_child(resizable); resizable->set_child(movable); //Puts draggable corners and edges around it. added = true; } } //Or just add it directly: if(!added) group->add_child(item); Glib::RefPtr movable = CanvasItemMovable::cast_to_movable(item); if(movable) { movable->set_grid(m_grid); //Let this canvas item signal whenever any of its children are selected or deselected: movable->signal_selected().connect( sigc::mem_fun(*this, &CanvasEditable::on_item_selected)); } } void CanvasEditable::remove_item(const Glib::RefPtr& item , const Glib::RefPtr& group) { if(!group) return; //TODO: Remove resizable=true items via their parent item. item->remove(); Glib::RefPtr movable = Glib::RefPtr::cast_dynamic(item); if(movable && movable->get_selected()) m_signal_selection_changed.emit(); } void CanvasEditable::remove_all_items() { const bool some_selected = !(get_selected_items().empty()); Glib::RefPtr root = get_root_item(); Glib::RefPtr root_group = Glib::RefPtr::cast_dynamic(root); while(root_group && root_group->get_n_children()) root_group->remove_child(0); //The selection has changed because selected items have been removed: if(some_selected) m_signal_selection_changed.emit(); } void CanvasEditable::remove_all_items(const Glib::RefPtr& group) { const bool some_selected = !(get_selected_items().empty()); while(group && group->get_n_children()) group->remove_child(0); //The selection has changed because selected items have been removed: if(some_selected) m_signal_selection_changed.emit(); } //static: Glib::RefPtr CanvasEditable::get_parent_container_or_self(const Glib::RefPtr& item) { return item; Glib::RefPtr result = item; while(result && !result->is_container()) result = result->get_parent(); return result; } void CanvasEditable::add_vertical_rule(double x) { m_grid->add_vertical_rule(x); } void CanvasEditable::add_horizontal_rule(double y) { m_grid->add_horizontal_rule(y); } void CanvasEditable::remove_rules() { m_grid->remove_rules(); } CanvasEditable::type_vec_doubles CanvasEditable::get_horizontal_rules() const { return m_grid->get_horizontal_rules(); } CanvasEditable::type_vec_doubles CanvasEditable::get_vertical_rules() const { return m_grid->get_vertical_rules(); } void CanvasEditable::show_temp_rule(double x, double y, bool show) { m_grid->show_temp_rule(x, y, show); } void CanvasEditable::set_grid_gap(double gap) { m_grid->set_grid_gap(gap); } void CanvasEditable::remove_grid() { m_grid->remove_grid(); } void CanvasEditable::associate_with_grid(const Glib::RefPtr& item) { Glib::RefPtr movable = CanvasItemMovable::cast_to_movable(item); if(movable) movable->set_grid(m_grid); } CanvasEditable::type_signal_show_context CanvasEditable::signal_show_context() { return m_signal_show_context; } CanvasEditable::type_signal_selection_changed CanvasEditable::signal_selection_changed() { return m_signal_selection_changed; } void CanvasEditable::on_item_selected(const Glib::RefPtr& item, bool group_select) { const bool selected = !item->get_selected(); if(!group_select) { //Make sure that all other items are deselected first: const type_vec_items items = get_selected_items(); for(type_vec_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(selected_item) selected_item->set_selected(false); } } item->set_selected(!selected); m_signal_selection_changed.emit(); } CanvasEditable::type_vec_items CanvasEditable::get_selected_items() { //TODO: Provide a default implementation. return type_vec_items(); } void CanvasEditable::set_rules_visibility(bool visible) { m_grid->set_rules_visibility(visible); } } //namespace Glom glom-1.22.4/glom/utility_widgets/canvas/canvas_text_movable.h0000644000175000017500000000556312234252646025642 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_TEXT_MOVABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_TEXT_MOVABLE_H #include "canvas_item_movable.h" #include namespace Glom { class CanvasTextMovable : public Goocanvas::Text, public CanvasItemMovable { private: explicit CanvasTextMovable(const Glib::ustring& string = Glib::ustring(), double x = 0.0, double y = 0.0, double width = 0.0, Goocanvas::AnchorType anchor = Goocanvas::ANCHOR_NORTH_WEST); virtual ~CanvasTextMovable(); void init(); public: static Glib::RefPtr create(const Glib::ustring& string = Glib::ustring(), double x = 0.0, double y = 0.0, double width = 0.0, Goocanvas::AnchorType anchor = Goocanvas::ANCHOR_NORTH_WEST); enum Corners { CORNER_TOP_LEFT, CORNER_TOP_RIGHT, CORNER_BOTTOM_LEFT, CORNER_BOTTOM_RIGHT }; /** Specify the corner to be considered when snapping to a grid while moving. */ void set_snap_corner(Corners corner); virtual void get_xy(double& x, double& y) const; virtual void set_xy(double x, double y); virtual void get_width_height(double& width, double& height) const; virtual void set_width_height(double width, double height); /** Use this instead of property_text() (from the base class), * so that the desired points size will be used. */ void set_text(const Glib::ustring& text); /** The font name, as returned from Gtk::FontButton::get_font_name(), * which may include the size and style. * This assumes that the font size is specified in points. * Note that property_font() assumes that the size is in canavs units (usually mm). */ void set_font_points(const Glib::ustring& font); private: virtual Goocanvas::Canvas* get_parent_canvas_widget(); virtual void snap_position(double& x, double& y) const; void reconstruct_markup(); //What corner is considered when snapping to a grid while moving: Corners m_snap_corner; //We remember this so we can reconstruct the pango markup when the text size changes: Glib::ustring m_text; Glib::ustring m_font; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_TEXT_MOVABLE_H glom-1.22.4/glom/utility_widgets/canvas/canvas_group_resizable.h0000644000175000017500000001656012234252646026344 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_GROUP_RESIZABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_GROUP_RESIZABLE_H #include "canvas_item_movable.h" #include #include namespace Glom { class CanvasRectMovable; class CanvasLineMovable; class CanvasGroupResizable : public Goocanvas::Group, public CanvasItemMovable { protected: CanvasGroupResizable(); virtual ~CanvasGroupResizable(); public: static Glib::RefPtr create(); /** This should only be called after this CanvasGroupResizable has already been added to a canvas. * The position (x, y, width, height) of the child will match the position of the CanvasGroupResizable, * overriding any previous position of the child. */ void set_child(const Glib::RefPtr& child); /// Get the only child: Glib::RefPtr get_child(); /// Get the only child: Glib::RefPtr get_child() const; virtual void get_xy(double& x, double& y) const; virtual void set_xy(double x_offet, double y_offset); virtual void get_width_height(double& width, double& height) const; virtual void set_width_height(double width, double height); virtual void set_grid(const Glib::RefPtr& grid); virtual void snap_position(double& x, double& y) const; void set_outline_visible(bool visible = true); static double get_outline_stroke_width(); static Glib::ustring get_outline_stroke_color(); typedef sigc::signal type_signal_resized; /// This signal is emitted when the canvas item is resized by the user. type_signal_resized signal_resized(); //Get the outline details so they can be used elsewhere, for consistency. static void get_outline_stroke(Glib::ustring& color, double& width); private: virtual void show_selected(); virtual Goocanvas::Canvas* get_parent_canvas_widget(); enum Corners { CORNER_TOP_LEFT, CORNER_TOP_RIGHT, CORNER_BOTTOM_LEFT, CORNER_BOTTOM_RIGHT, CORNER_COUNT }; void snap_position(Corners corner, double& x, double& y) const; bool on_rect_enter_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); bool on_rect_leave_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); bool on_resizer_enter_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); bool on_resizer_leave_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); virtual bool on_child_button_press_event(const Glib::RefPtr& target, GdkEventButton* event); virtual bool on_child_button_release_event(const Glib::RefPtr& target, GdkEventButton* event); virtual bool on_child_motion_notify_event(const Glib::RefPtr& target, GdkEventMotion* event); enum Manipulators { MANIPULATOR_NONE, //For rectangles: MANIPULATOR_CORNER_TOP_LEFT, MANIPULATOR_CORNER_TOP_RIGHT, MANIPULATOR_CORNER_BOTTOM_LEFT, MANIPULATOR_CORNER_BOTTOM_RIGHT, MANIPULATOR_EDGE_TOP, MANIPULATOR_EDGE_BOTTOM, MANIPULATOR_EDGE_LEFT, MANIPULATOR_EDGE_RIGHT, //For straight lines: MANIPULATOR_START, MANIPULATOR_END }; Glib::RefPtr get_manipulator(Manipulators manipulator_id); void create_manipulators(); void create_rect_manipulators(); void create_line_manipulators(); void create_outline_group(); Glib::RefPtr create_outline_line(double x1, double y1, double x2, double y2); void manipulator_connect_signals(const Glib::RefPtr& manipulator, Manipulators manipulator_id); void position_manipulators(); void position_rect_manipulators(); void position_line_manipulators(); void set_manipulators_visibility(Goocanvas::ItemVisibility visibility); void position_outline(); /** Make sure that the outline and manipulators are correctly placed and sized. */ void position_extras(); void on_manipulator_corner_moved(const Glib::RefPtr& item, double x_offset, double y_offset, Manipulators manipulator_id); void on_manipulator_edge_moved(const Glib::RefPtr& item, double x_offset, double y_offset, Manipulators manipulator_id); void on_manipulator_line_end_moved(const Glib::RefPtr& item, double x_offset, double y_offset, Manipulators manipulator_id); bool on_manipulator_enter_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); bool on_manipulator_leave_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event); bool get_is_line() const; //bool on_manipulator_button_press_event(const Glib::RefPtr& target, GdkEventButton* event, Manipulators manipulator); //bool on_manipulator_button_release_event(const Glib::RefPtr& target, GdkEventButton* event, Manipulators manipulator); //bool on_manipulator_motion_notify_event(const Glib::RefPtr& target, GdkEventMotion* event, Manipulators manipulator); static Glib::RefPtr create_corner_manipulator(); static Glib::RefPtr create_edge_manipulator(); static void set_edge_points(const Glib::RefPtr& line, double x1, double y1, double x2, double y2); Glib::RefPtr m_child; Glib::RefPtr m_group_edge_manipulators; //not including the rect. Glib::RefPtr m_group_corner_manipulators; //not including the rect. //Manipulators for a rectangle: Glib::RefPtr m_rect; //Something to get events on, because m_child might actually be smaller than indicated by our manipulators. Glib::RefPtr m_manipulator_corner_top_left, m_manipulator_corner_top_right, m_manipulator_corner_bottom_left, m_manipulator_corner_bottom_right; Glib::RefPtr m_manipulator_edge_top, m_manipulator_edge_bottom, m_manipulator_edge_left, m_manipulator_edge_right; //Manipulators for a line: Glib::RefPtr m_manipulator_start, m_manipulator_end; //These are visible to indicate the item's dimensions: Glib::RefPtr m_group_outline; Glib::RefPtr m_outline_top, m_outline_bottom, m_outline_left, m_outline_right; bool m_in_manipulator; //Whether the cursor is in a manipulator. //These are used only before there is a child. //When there is a child, we delegate to it instead. double m_x, m_y, m_width, m_height; type_signal_resized m_signal_resized; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_GROUP_RESIZABLE_H glom-1.22.4/glom/utility_widgets/canvas/canvas_group_movable.cc0000644000175000017500000001562512234252646026150 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_group_movable.h" #include "canvas_rect_movable.h" #include "canvas_line_movable.h" #include "canvas_text_movable.h" #include #include #include namespace Glom { CanvasGroupMovable::CanvasGroupMovable() : m_x(0), m_y(0), m_width(0), m_height(0) { signal_motion_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_motion_notify_event)); signal_button_press_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_press_event)); signal_button_release_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_release_event)); signal_enter_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_enter_notify_event)); signal_leave_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_leave_notify_event)); } CanvasGroupMovable::~CanvasGroupMovable() { } Glib::RefPtr CanvasGroupMovable::create() { return Glib::RefPtr(new CanvasGroupMovable()); } void CanvasGroupMovable::get_xy(double& x, double& y) const { Glib::RefPtr first_child = get_child(0); if(!first_child) { //Just return any x/y that was previously set: x = m_x; y = m_y; return; } Glib::RefPtr movable = CanvasItemMovable::cast_const_to_movable(first_child); if(movable) movable->get_xy(x, y); } void CanvasGroupMovable::set_xy(double x, double y) { //Store them here, in case we don't have children yet: m_x = x; m_y = y; //Discover the offset: double old_x = 0; double old_y = 0; get_xy(old_x, old_y); const double offset_x = x - old_x; const double offset_y = y - old_y; //Apply the offset to all children: const int count = get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = get_child(i); Glib::RefPtr movable = CanvasItemMovable::cast_to_movable(child); if(movable) { double this_x = 0; double this_y = 0; movable->get_xy(this_x, this_y); movable->set_xy(this_x + offset_x, this_y + offset_y); } } } void CanvasGroupMovable::get_width_height(double& width, double& height) const { Glib::RefPtr first_child = get_child(0); if(!first_child) { //Just return any width/height that was previously set: width = m_width; height = m_height; } else { Glib::RefPtr movable = CanvasItemMovable::cast_const_to_movable(first_child); if(movable) movable->get_width_height(width, height); } //GooCanvasGroup allows height and width to be -1 to mean the "use the default", //but other GooCanvas* items reject that as out of range, //so prevent us from using it: if(width == -1) width = 100; //Arbitrary default. if(height == -1) height = 100; //Arbitrary default. } void CanvasGroupMovable::set_width_height(double width, double height) { //Store them here, in case we don't have children yet: m_width = width; m_height = height; Glib::RefPtr first_child = get_child(0); if(!first_child) return; Glib::RefPtr movable = CanvasItemMovable::cast_to_movable(first_child); if(movable) movable->set_width_height(width, height); } void CanvasGroupMovable::set_grid(const Glib::RefPtr& grid) { std::cout << "CanvasGroupMovable::set_grid" << std::endl; //Call the base class: CanvasItemMovable::set_grid(grid); //Apply the grid to all children: const int count = get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = get_child(i); Glib::RefPtr movable = CanvasItemMovable::cast_to_movable(child); if(movable) { movable->set_grid(grid); } } } void CanvasGroupMovable::snap_position_one_corner(Corners corner, double& x, double& y) const { const Goocanvas::Bounds bounds = get_bounds(); const double width = std::abs(bounds.get_x2() - bounds.get_x1()); const double height = std::abs(bounds.get_y2() - bounds.get_y1()); //Choose the offset of the part to snap to the grid: double corner_x_offset = 0; double corner_y_offset = 0; switch(corner) { case CORNER_TOP_LEFT: corner_x_offset = 0; corner_y_offset = 0; break; case CORNER_TOP_RIGHT: corner_x_offset = width; corner_y_offset = 0; break; case CORNER_BOTTOM_LEFT: corner_x_offset = 0; corner_y_offset = height; break; case CORNER_BOTTOM_RIGHT: corner_x_offset = width; corner_y_offset = height; break; default: break; } //Snap that point to the grid: const double x_to_snap = x + corner_x_offset; const double y_to_snap = y + corner_y_offset; double corner_x_snapped = x_to_snap; double corner_y_snapped = y_to_snap; CanvasItemMovable::snap_position(corner_x_snapped, corner_y_snapped); //Discover what offset the snapping causes: const double snapped_offset_x = corner_x_snapped - x_to_snap; const double snapped_offset_y = corner_y_snapped - y_to_snap; //Apply that offset to the regular position: x += snapped_offset_x; y += snapped_offset_y; } void CanvasGroupMovable::snap_position(double& x, double& y) const { //std::cout << "CanvasGroupMovable::snap_position" << std::endl; double offset_x_min = 0; double offset_y_min = 0; //Try snapping each corner, to choose the one that snapped closest: for(int i = CORNER_TOP_LEFT; i < CORNER_COUNT; ++i) { const Corners corner = (Corners)i; double temp_x = x; double temp_y = y; snap_position_one_corner(corner, temp_x, temp_y); const double offset_x = temp_x -x; const double offset_y = temp_y - y; //Use the smallest offset, preferring some offset to no offset: if(offset_x && ((std::abs(offset_x) < std::abs(offset_x_min)) || !offset_x_min)) offset_x_min = offset_x; if(offset_y && ((std::abs(offset_y) < std::abs(offset_y_min)) || !offset_y_min)) offset_y_min = offset_y; } x += offset_x_min; y += offset_y_min; } Goocanvas::Canvas* CanvasGroupMovable::get_parent_canvas_widget() { return get_canvas(); } } //namespace Glom glom-1.22.4/glom/utility_widgets/canvas/canvas_table_movable.cc0000644000175000017500000001413312234252646026074 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_table_movable.h" #include #include #include namespace Glom { CanvasTableMovable::CanvasTableMovable() : m_row_line_width(0), m_column_line_width(0) { signal_motion_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_motion_notify_event)); signal_button_press_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_press_event)); signal_button_release_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_release_event)); signal_enter_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_enter_notify_event)); signal_leave_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_leave_notify_event)); } CanvasTableMovable::~CanvasTableMovable() { } Glib::RefPtr CanvasTableMovable::create() { return Glib::RefPtr(new CanvasTableMovable()); } void CanvasTableMovable::get_xy(double& x, double& y) const { x = property_x(); y = property_y(); } void CanvasTableMovable::set_xy(double x, double y) { property_x() = x; property_y() = y; } void CanvasTableMovable::get_width_height(double& width, double& height) const { width = property_width(); height = property_height(); if(width == -1) //Means "default width" - presumably the width demanded by the children. But we don't use that. width = 0; if(height == -1) //Means "default height" - presumably the height demanded by the children. But we don't use that. height = 0; } void CanvasTableMovable::set_width_height(double width, double height) { if(width == -1) { std::cout << "debug: " << G_STRFUNC << ": width is -1" << std::endl; } property_width() = width; property_height() = height; } void CanvasTableMovable::set_grid(const Glib::RefPtr& grid) { //Call the base class: CanvasItemMovable::set_grid(grid); //Apply the grid to all children: const int count = get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = get_child(i); Glib::RefPtr movable = CanvasItemMovable::cast_to_movable(child); if(movable) { movable->set_grid(grid); } } } void CanvasTableMovable::snap_position_one_corner(Corners corner, double& x, double& y) const { const Goocanvas::Bounds bounds = get_bounds(); const double width = std::abs(bounds.get_x2() - bounds.get_x1()); const double height = std::abs(bounds.get_y2() - bounds.get_y1()); //Choose the offset of the part to snap to the grid: double corner_x_offset = 0; double corner_y_offset = 0; switch(corner) { case CORNER_TOP_LEFT: corner_x_offset = 0; corner_y_offset = 0; break; case CORNER_TOP_RIGHT: corner_x_offset = width; corner_y_offset = 0; break; case CORNER_BOTTOM_LEFT: corner_x_offset = 0; corner_y_offset = height; break; case CORNER_BOTTOM_RIGHT: corner_x_offset = width; corner_y_offset = height; break; default: break; } //Snap that point to the grid: const double x_to_snap = x + corner_x_offset; const double y_to_snap = y + corner_y_offset; double corner_x_snapped = x_to_snap; double corner_y_snapped = y_to_snap; CanvasItemMovable::snap_position(corner_x_snapped, corner_y_snapped); //Discover what offset the snapping causes: const double snapped_offset_x = corner_x_snapped - x_to_snap; const double snapped_offset_y = corner_y_snapped - y_to_snap; //Apply that offset to the regular position: x += snapped_offset_x; y += snapped_offset_y; } void CanvasTableMovable::snap_position(double& x, double& y) const { //std::cout << "CanvasTableMovable::snap_position" << std::endl; double offset_x_min = 0; double offset_y_min = 0; //Try snapping each corner, to choose the one that snapped closest: for(int i = CORNER_TOP_LEFT; i < CORNER_COUNT; ++i) { const Corners corner = (Corners)i; double temp_x = x; double temp_y = y; snap_position_one_corner(corner, temp_x, temp_y); const double offset_x = temp_x -x; const double offset_y = temp_y - y; //Use the smallest offset, preferring some offset to no offset: if(offset_x && ((std::abs(offset_x) < std::abs(offset_x_min)) || !offset_x_min)) offset_x_min = offset_x; if(offset_y && ((std::abs(offset_y) < std::abs(offset_y_min)) || !offset_y_min)) offset_y_min = offset_y; } x += offset_x_min; y += offset_y_min; } Goocanvas::Canvas* CanvasTableMovable::get_parent_canvas_widget() { return get_canvas(); } void CanvasTableMovable::set_lines_details(double row_line_width, double column_line_width, const Glib::ustring& color) { m_column_line_width = row_line_width; m_row_line_width = column_line_width; m_line_color = color; set_lines_visibility(false); } void CanvasTableMovable::set_lines_visibility(bool show) { if(show && (m_line_color.empty() || ((m_row_line_width == 0) && (m_column_line_width == 0)))) { //TODO: Use constants or function calls from somewhere else: property_vert_grid_line_width() = 0.5f; property_horz_grid_line_width() = 0.5f; property_stroke_color() = "black"; } else { property_vert_grid_line_width() = m_column_line_width; property_horz_grid_line_width() = m_row_line_width; property_stroke_color() = m_line_color; } } } //namespace Glom glom-1.22.4/glom/utility_widgets/canvas/canvas_group_grid.cc0000644000175000017500000002275112234252646025446 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007-2011 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_group_grid.h" #include "canvas_line_movable.h" #include #include #include #include namespace Glom { const double LINE_WIDTH = 0.5f; CanvasGroupGrid::CanvasGroupGrid() : m_grid_gap(0.0), m_grid_sensitivity(5.0) { m_grid_rules_group = Goocanvas::Group::create(); add_child(m_grid_rules_group); //Create the temp rule and hide it by default: m_temp_rule = create_rule_line(0, true); //Arbitrary defaults. m_temp_rule->property_visibility() = Goocanvas::ITEM_INVISIBLE; add_child(m_temp_rule); } CanvasGroupGrid::~CanvasGroupGrid() { } Glib::RefPtr CanvasGroupGrid::create() { return Glib::RefPtr(new CanvasGroupGrid()); } inline void division_and_remainder(double a, double b, double& whole, double& remainder) { if(b == 0) { whole = 0; remainder = 0; return; } remainder = fmod(a, b); whole = (int)(a / b); } bool CanvasGroupGrid::is_close(double a, double b) const { return (std::abs((long)(a - b)) < m_grid_sensitivity); } double CanvasGroupGrid::snap_position_rules(const type_vec_doubles& rules, double a) const { double result = a; for(type_vec_doubles::const_iterator iter = rules.begin(); iter != rules.end(); ++iter) { const double rule_a = *iter; if(is_close(a, rule_a)) { if(result == a) //Prefer some snap to no snap result = rule_a; else if(std::abs((long)(a - rule_a)) < std::abs((long)(a - result))) //Use the closest one. result = rule_a; } } return result; } double CanvasGroupGrid::snap_position_rules_x(double x) const { const type_vec_doubles rules = get_vertical_rules(); return snap_position_rules(rules, x); } double CanvasGroupGrid::snap_position_rules_y(double y) const { const type_vec_doubles rules = get_horizontal_rules(); return snap_position_rules(rules, y); } double CanvasGroupGrid::snap_position_grid(double a) const { double result = a; if(m_grid_gap) { /* Get closest horizontal grid line: */ double grid_line_num_before = 0; double distance_after_grid_line_before = 0; division_and_remainder(a, m_grid_gap, grid_line_num_before, distance_after_grid_line_before); //printf("grid_line_num_before=%f, distance_after_grid_line_before=%f\n", grid_line_num_before, distance_after_grid_line_before); if(is_close(0, distance_after_grid_line_before)) { //Snap to the grid line: result = grid_line_num_before * m_grid_gap; } else { const double distance_to_next_grid_line = m_grid_gap - distance_after_grid_line_before; if(is_close(m_grid_gap, distance_to_next_grid_line)) { //Snap to the grid line: result = (grid_line_num_before + 1) * m_grid_gap; } } } return result; } void CanvasGroupGrid::snap_position(double& x, double& y) const { double offset_x = 0; double offset_y = 0; double offset_x_min = 0; double offset_y_min = 0; if(m_grid_gap) { //Try snapping to the grid: double temp_x = snap_position_grid(x); double temp_y = snap_position_grid(y); offset_x = temp_x - x; offset_y = temp_y - y; //Use the smallest offset, preferring some offset to no offset: if(offset_x) offset_x_min = offset_x; if(offset_y) offset_y_min = offset_y; } //Try snapping to the rules, if any: double temp_x = snap_position_rules_x(x); double temp_y = snap_position_rules_y(y); offset_x = temp_x - x; offset_y = temp_y - y; //Use the smallest offset, preferring some offset to no offset: if(offset_x && ((std::abs((long)offset_x) < std::abs((long)offset_x_min)) || !offset_x_min)) offset_x_min = offset_x; if(offset_y && ((std::abs((long)offset_y) < std::abs((long)offset_y_min)) || !offset_y_min)) offset_y_min = offset_y; x += offset_x_min; y += offset_y_min; } Glib::RefPtr CanvasGroupGrid::create_rule_line(double pos, bool horizontal) { double left = 0.0; double top = 0.0; double right = 0.0; double bottom = 0.0; Goocanvas::Canvas* canvas = get_canvas(); if(canvas) canvas->get_bounds(left, top, right, bottom); Glib::RefPtr line = CanvasLineMovable::create(); if(horizontal) { double data[4] = {left, pos, right, pos}; Goocanvas::Points points(2, data); line->property_points() = points ; } else { double data[4] = {pos, top, pos, bottom}; Goocanvas::Points points(2, data); line->property_points() = points ; } line->property_line_width() = LINE_WIDTH; line->property_stroke_color() = "green"; line->set_hover_color("red"); //So the user knows when he can click to drag. if(horizontal) line->set_movement_allowed(true, false); else line->set_movement_allowed(false, true); return line; } void CanvasGroupGrid::add_vertical_rule(double x) { Glib::RefPtr line = create_rule_line(x, false); m_rules_x.push_back(line); m_grid_rules_group->add_child(line); } void CanvasGroupGrid::add_horizontal_rule(double y) { Glib::RefPtr line = create_rule_line(y, true); m_rules_y.push_back(line); m_grid_rules_group->add_child(line); } void CanvasGroupGrid::remove_rules() { m_rules_x.clear(); m_rules_y.clear(); while(m_grid_rules_group && m_grid_rules_group->get_n_children()) m_grid_rules_group->remove_child(0); } CanvasGroupGrid::type_vec_doubles CanvasGroupGrid::get_horizontal_rules() const { type_vec_doubles result; for(type_vec_lines::const_iterator iter = m_rules_y.begin(); iter != m_rules_y.end(); ++iter) { Glib::RefPtr line = *iter; if(!line) continue; double x = 0; double y = 0; line->get_xy(x, y); result.push_back(y); } return result; } CanvasGroupGrid::type_vec_doubles CanvasGroupGrid::get_vertical_rules() const { type_vec_doubles result; for(type_vec_lines::const_iterator iter = m_rules_x.begin(); iter != m_rules_x.end(); ++iter) { Glib::RefPtr line = *iter; if(!line) continue; double x = 0; double y = 0; line->get_xy(x, y); result.push_back(x); } return result; } void CanvasGroupGrid::set_grid_gap(double gap) { m_grid_gap = gap; create_grid_lines(); } void CanvasGroupGrid::update_grid_for_new_size() { create_grid_lines(); } void CanvasGroupGrid::remove_grid() { m_grid_gap = 0.0; create_grid_lines(); } void CanvasGroupGrid::create_grid_lines() { //Remove any existing lines: if(m_grid_lines) { m_grid_lines->remove(); m_grid_lines.reset(); //Null the RefPtr. } //Fill the parent canvas with lines: double left = 0.0; double top = 0.0; double right = 0.0; double bottom = 0.0; Goocanvas::Canvas* canvas = get_canvas(); if(canvas) canvas->get_bounds(left, top, right, bottom); const double width = right - left; const double height = bottom - top; //Vertical and horizontal grid lines: if(m_grid_gap > 0) //0 steps cause a crash in older versions of goocanvas. { m_grid_lines = Goocanvas::Grid::create(0, 0, width, height, m_grid_gap, m_grid_gap); m_grid_lines->property_horz_grid_line_width() = LINE_WIDTH; m_grid_lines->property_vert_grid_line_width() = LINE_WIDTH; m_grid_lines->property_horz_grid_line_color() = "light blue"; m_grid_lines->property_vert_grid_line_color() = "light blue"; add_child(m_grid_lines); } //Make sure that the grid is below the rules, so that the rules are visible: if(m_grid_lines && m_grid_rules_group) m_grid_lines->lower(m_grid_rules_group); } void CanvasGroupGrid::set_rules_visibility(bool visible) { if(m_grid_rules_group) m_grid_rules_group->property_visibility() = (visible ? Goocanvas::ITEM_VISIBLE : Goocanvas::ITEM_INVISIBLE); else std::cerr << G_STRFUNC << ": m_grid_rules_group was null." << std::endl; //Make sure that the gris is below the rules, so that the rules are visible: if(m_grid_lines && m_grid_rules_group) m_grid_lines->lower(m_grid_rules_group); } void CanvasGroupGrid::show_temp_rule(double x, double y, bool show) { m_temp_rule->property_visibility() = (show ? Goocanvas::ITEM_VISIBLE : Goocanvas::ITEM_INVISIBLE); double left = 0.0; double top = 0.0; double right = 0.0; double bottom = 0.0; Goocanvas::Canvas* canvas = get_canvas(); if(canvas) canvas->get_bounds(left, top, right, bottom); const bool horizontal = (y == 0); if(horizontal) { double points_coordinates[] = {x, top, x , bottom}; Goocanvas::Points points(2, points_coordinates); m_temp_rule->property_points() = points; } else { double points_coordinates[] = {left, y, right , y}; Goocanvas::Points points(2, points_coordinates); m_temp_rule->property_points() = points; } m_temp_rule->raise(); } } //namespace Glom glom-1.22.4/glom/utility_widgets/canvas/canvas_image_movable.h0000644000175000017500000000624412234252646025735 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_IMAGE_MOVABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_IMAGE_MOVABLE_H #include "canvas_item_movable.h" #include namespace Glom { class CanvasImageMovable : public Goocanvas::Image, public CanvasItemMovable { private: explicit CanvasImageMovable(double x = 0.0, double y = 0.0); explicit CanvasImageMovable(const Glib::RefPtr& pixbuf, double x = 0.0, double y = 0.0); virtual ~CanvasImageMovable(); void init(); public: static Glib::RefPtr create(double x = 0.0, double y = 0.0); static Glib::RefPtr create(const Glib::RefPtr& pixbuf, double x = 0.0, double y = 0.0); /** Use this instead of property_pixbuf(), * to make sure that m_image_empty is set to false. * * This also scales the image (maintaining the aspect ratio) to fit the current width and * height if they are not 0. */ void set_image(const Glib::RefPtr& pixbuf, bool scale = true); /// Show the no-image picture. void set_image_empty(); bool get_image_empty() const; /** Scale the pixbuf to the current height and width, keeping the aspect ratio. * This uses the original pixbuf provided to set_image(), so this should not * result in a loss of quality if the original was large enough. */ void scale_to_size(); enum Corners { CORNER_TOP_LEFT, CORNER_TOP_RIGHT, CORNER_BOTTOM_LEFT, CORNER_BOTTOM_RIGHT }; /** Specify the corner to be considered when snapping to a grid while moving. */ void set_snap_corner(Corners corner); virtual void get_xy(double& x, double& y) const; virtual void set_xy(double x, double y); virtual void get_width_height(double& width, double& height) const; virtual void set_width_height(double width, double height); private: virtual Goocanvas::Canvas* get_parent_canvas_widget(); virtual void snap_position(double& x, double& y) const; //What corner is considered when snapping to a grid while moving: Corners m_snap_corner; //Whether we are showing the no-image picture: bool m_image_empty; //We keep a copy of this here because //- GooCanvasImage doesn't let use read the pixbuf property (just write it), //- This allows us to rescale (if wanted) when resizing, without losing quality. Glib::RefPtr m_pixbuf; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_IMAGE_MOVABLE_H glom-1.22.4/glom/utility_widgets/canvas/canvas_editable.h0000644000175000017500000000764012234252646024720 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_EDITABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_EDITABLE_H #include #include #include #include #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY namespace Glom { class CanvasEditable : public Goocanvas::Canvas { public: CanvasEditable(); virtual ~CanvasEditable(); void add_item(const Glib::RefPtr& item, bool resizable = false); void add_item(const Glib::RefPtr& item, const Glib::RefPtr& group, bool resizable = false); void remove_item(const Glib::RefPtr& item, const Glib::RefPtr& group); void remove_all_items(); void remove_all_items(const Glib::RefPtr& group); /** Set the distance between grid lines, * used to snap to the grid lines when moving or resizing items. */ virtual void set_grid_gap(double gap = 20.0); /** Remove grid lines. * See also remove_rules(). */ void remove_grid(); void set_rules_visibility(bool visible = true); void add_vertical_rule(double x); void add_horizontal_rule(double y); void remove_rules(); typedef std::vector type_vec_doubles; type_vec_doubles get_horizontal_rules() const; type_vec_doubles get_vertical_rules() const; /** Either @a x or @a y should be 0. */ void show_temp_rule(double x, double y, bool show = true); /** For items not added directly via add_item(), * but which need to snap to the grid. */ void associate_with_grid(const Glib::RefPtr& item); typedef std::vector< Glib::RefPtr > type_vec_items; /** Get any items that have get_selected()==true. * Derived classes may override this to only examine items that they consider interesting. */ virtual type_vec_items get_selected_items(); //TODO: Actually emit this, so we actually show the context menu when clicking on blank space: /** void on_show_context(guint button, guint32 activate_time); */ typedef sigc::signal type_signal_show_context; type_signal_show_context signal_show_context(); /** For instance, * void on_selection_changed(); */ typedef sigc::signal type_signal_selection_changed; /** This signal is emitted if the user causes items * to be selected or deselected. See get_selected_items(). */ type_signal_selection_changed signal_selection_changed(); private: void on_item_selected(const Glib::RefPtr& item, bool group_select); static Glib::RefPtr get_parent_container_or_self(const Glib::RefPtr& item); bool m_dragging; double m_drag_x, m_drag_y; class ItemInfo { public: //ItemInfo() //ItemInfo(const ItemInfo& src); //ItemInfo& operator=(const ItemInfo& src); bool m_resizable; }; protected: Glib::RefPtr m_grid; private: type_signal_show_context m_signal_show_context; type_signal_selection_changed m_signal_selection_changed; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_EDITABLE_H glom-1.22.4/glom/utility_widgets/canvas/canvas_rect_movable.h0000644000175000017500000000441512234252646025606 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_RECT_MOVABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_RECT_MOVABLE_H #include "canvas_item_movable.h" #include namespace Glom { class CanvasRectMovable : public Goocanvas::Rect, public CanvasItemMovable { private: CanvasRectMovable(); CanvasRectMovable(double x, double y, double width, double height); virtual ~CanvasRectMovable(); void init(); public: static Glib::RefPtr create(); static Glib::RefPtr create(double x, double y, double width, double height); enum Corners { CORNER_ALL, // Snap to all corners. CORNER_TOP_LEFT, CORNER_TOP_RIGHT, CORNER_BOTTOM_LEFT, CORNER_BOTTOM_RIGHT, CORNER_COUNT }; /** Specify the corner to be considered when snapping to a grid while moving. */ void set_snap_corner(Corners corner); virtual void get_xy(double& x, double& y) const; virtual void set_xy(double x, double y); virtual void get_width_height(double& width, double& height) const; virtual void set_width_height(double width, double height); private: virtual Goocanvas::Canvas* get_parent_canvas_widget(); virtual void snap_position(double& x, double& y) const; void snap_position_one_corner(Corners corner, double& x, double& y) const; void snap_position_all_corners(double& x, double& y) const; //What corner is considered when snapping to a grid while moving: Corners m_snap_corner; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_RECT_MOVABLE_H glom-1.22.4/glom/utility_widgets/canvas/canvas_line_movable.cc0000644000175000017500000000630012234252646025731 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_line_movable.h" #include #include #include namespace Glom { CanvasLineMovable::CanvasLineMovable() : Goocanvas::Polyline(0.0, 0.0, 0.0, 0.0), CanvasItemMovable() { signal_motion_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_motion_notify_event)); signal_button_press_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_press_event)); signal_button_release_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_release_event)); signal_enter_notify_event().connect(sigc::mem_fun(*this, &CanvasLineMovable::on_enter_notify_event)); signal_leave_notify_event().connect(sigc::mem_fun(*this, &CanvasLineMovable::on_leave_notify_event)); } CanvasLineMovable::~CanvasLineMovable() { } Glib::RefPtr CanvasLineMovable::create() { return Glib::RefPtr(new CanvasLineMovable()); } void CanvasLineMovable::get_xy(double& x, double& y) const { x = property_x(); y = property_y(); } void CanvasLineMovable::set_xy(double x, double y) { property_x() = x; property_y() = y; } void CanvasLineMovable::get_width_height(double& width, double& height) const { width = property_width(); height = property_height(); //std::cout << "debug: " << G_STRFUNC << ": width=" << width << std::endl; } void CanvasLineMovable::set_width_height(double width, double height) { property_width() = width; property_height() = height; //std::cout << "debug: " << G_STRFUNC << ": end x=" << x1+width << std::endl; } Goocanvas::Canvas* CanvasLineMovable::get_parent_canvas_widget() { return get_canvas(); } void CanvasLineMovable::set_hover_color(const Glib::ustring& color) { m_hover_color = color; } bool CanvasLineMovable::on_enter_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event) { if(!m_hover_color.empty()) { m_stroke_color = property_stroke_color_gdk_rgba(); property_stroke_color() = m_hover_color; } CanvasItemMovable::on_enter_notify_event(target, event); return Goocanvas::Polyline::on_enter_notify_event(target, event); } bool CanvasLineMovable::on_leave_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event) { if(!m_hover_color.empty()) property_stroke_color_gdk_rgba() = m_stroke_color; CanvasItemMovable::on_leave_notify_event(target, event); return Goocanvas::Polyline::on_leave_notify_event(target, event); } } //namespace Glom glom-1.22.4/glom/utility_widgets/canvas/canvas_group_resizable.cc0000644000175000017500000010552312234252646026500 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_group_resizable.h" #include "canvas_rect_movable.h" #include "canvas_line_movable.h" #include #include #include #include #include namespace Glom { static const double MANIPULATOR_CORNER_SIZE = 2; static const char MANIPULATOR_CORNER_FILL_COLOR[] = "black"; static const double MANIPULATOR_STROKE_WIDTH = 0.5f; //mm (assuming that the canvas uses mm. static const char MANIPULATOR_STROKE_COLOR[] = "black"; static const double OUTLINE_STROKE_WIDTH = MANIPULATOR_STROKE_WIDTH; //mm (assuming that the canvas uses mm. static const char OUTLINE_STROKE_COLOR[] = "gray"; void CanvasGroupResizable::get_outline_stroke(Glib::ustring& color, double& width) { color = OUTLINE_STROKE_COLOR; width = OUTLINE_STROKE_WIDTH; } CanvasGroupResizable::CanvasGroupResizable() : m_in_manipulator(false), m_x(0), m_y(0), m_width(0), m_height(0) { //property_pointer_events() = // (Goocanvas::PointerEvents)(Goocanvas::EVENTS_VISIBLE_FILL & GOO_CANVAS_EVENTS_VISIBLE_STROKE); set_drag_cursor(Gdk::FLEUR); } void CanvasGroupResizable::create_manipulators() { //Remove any existing manipulators: if(m_group_edge_manipulators) m_group_edge_manipulators->remove(); if(m_group_corner_manipulators) m_group_corner_manipulators->remove(); m_group_edge_manipulators = Goocanvas::Group::create(); add_child(m_group_edge_manipulators); m_group_corner_manipulators = Goocanvas::Group::create(); add_child(m_group_corner_manipulators); if(get_is_line()) create_line_manipulators(); else create_rect_manipulators(); } void CanvasGroupResizable::create_rect_manipulators() { m_rect = Goocanvas::Rect::create(0, 0, 0, 0); m_rect->property_line_width() = 0; m_rect->property_fill_color_rgba() = 0xFFFFFF00; //Needed to make it react to drags. White but completely transparent. add_child(m_rect); //Allow dragging of the rect to move everything: m_rect->signal_motion_notify_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_child_motion_notify_event)); m_rect->signal_button_press_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_child_button_press_event)); m_rect->signal_button_release_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_child_button_release_event)); //m_rect->property_pointer_events() = // (Goocanvas::PointerEvents)(Goocanvas::EVENTS_VISIBLE_FILL & GOO_CANVAS_EVENTS_VISIBLE_STROKE); m_rect->signal_enter_notify_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_rect_enter_notify_event), false); m_rect->signal_leave_notify_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_rect_leave_notify_event), false); m_manipulator_corner_top_left = create_corner_manipulator(); m_manipulator_corner_top_right = create_corner_manipulator(); m_manipulator_corner_bottom_left = create_corner_manipulator(); m_manipulator_corner_bottom_right = create_corner_manipulator(); m_manipulator_edge_top = create_edge_manipulator(); m_manipulator_edge_bottom = create_edge_manipulator(); m_manipulator_edge_left = create_edge_manipulator(); m_manipulator_edge_right = create_edge_manipulator(); m_group_corner_manipulators->add_child(m_manipulator_corner_top_left); m_group_corner_manipulators->add_child(m_manipulator_corner_top_right); m_group_corner_manipulators->add_child(m_manipulator_corner_bottom_left); m_group_corner_manipulators->add_child(m_manipulator_corner_bottom_right); m_group_edge_manipulators->add_child(m_manipulator_edge_top); m_group_edge_manipulators->add_child(m_manipulator_edge_bottom); m_group_edge_manipulators->add_child(m_manipulator_edge_left); m_group_edge_manipulators->add_child(m_manipulator_edge_right); m_manipulator_corner_top_left->set_grid(m_grid); m_manipulator_corner_top_left->set_snap_corner(CanvasRectMovable::CORNER_TOP_LEFT); m_manipulator_corner_top_right->set_grid(m_grid); m_manipulator_corner_top_right->set_snap_corner(CanvasRectMovable::CORNER_TOP_RIGHT); m_manipulator_corner_bottom_left->set_grid(m_grid); m_manipulator_corner_bottom_left->set_snap_corner(CanvasRectMovable::CORNER_BOTTOM_LEFT); m_manipulator_corner_bottom_right->set_grid(m_grid); m_manipulator_corner_bottom_right->set_snap_corner(CanvasRectMovable::CORNER_BOTTOM_RIGHT); m_manipulator_edge_top->set_grid(m_grid); m_manipulator_edge_bottom->set_grid(m_grid); m_manipulator_edge_left->set_grid(m_grid); m_manipulator_edge_right->set_grid(m_grid); m_manipulator_corner_top_left->set_drag_cursor(Gdk::TOP_LEFT_CORNER); m_manipulator_corner_top_right->set_drag_cursor(Gdk::TOP_RIGHT_CORNER); m_manipulator_corner_bottom_left->set_drag_cursor(Gdk::BOTTOM_LEFT_CORNER); m_manipulator_corner_bottom_right->set_drag_cursor(Gdk::BOTTOM_RIGHT_CORNER); m_manipulator_edge_top->set_drag_cursor(Gdk::TOP_SIDE); m_manipulator_edge_bottom->set_drag_cursor(Gdk::BOTTOM_SIDE); m_manipulator_edge_left->set_drag_cursor(Gdk::LEFT_SIDE); m_manipulator_edge_right->set_drag_cursor(Gdk::RIGHT_SIDE); //Make sure that this is above the outline group: m_group_edge_manipulators->raise();//m_group_outline); m_group_corner_manipulators->raise();//m_group_outline); manipulator_connect_signals(m_manipulator_corner_top_left, MANIPULATOR_CORNER_TOP_LEFT); manipulator_connect_signals(m_manipulator_corner_top_right, MANIPULATOR_CORNER_TOP_RIGHT); manipulator_connect_signals(m_manipulator_corner_bottom_left, MANIPULATOR_CORNER_BOTTOM_LEFT); manipulator_connect_signals(m_manipulator_corner_bottom_right, MANIPULATOR_CORNER_BOTTOM_RIGHT); manipulator_connect_signals(m_manipulator_edge_top, MANIPULATOR_EDGE_TOP); manipulator_connect_signals(m_manipulator_edge_bottom, MANIPULATOR_EDGE_BOTTOM); manipulator_connect_signals(m_manipulator_edge_left, MANIPULATOR_EDGE_LEFT); manipulator_connect_signals(m_manipulator_edge_right, MANIPULATOR_EDGE_RIGHT); } void CanvasGroupResizable::create_line_manipulators() { m_manipulator_start = create_corner_manipulator(); m_manipulator_end = create_corner_manipulator(); //We add these to the edge manipulators, though they look like //corner manipulators, because we want to use them to show selection. m_group_edge_manipulators->add_child(m_manipulator_start); m_group_edge_manipulators->add_child(m_manipulator_end); m_manipulator_start->set_grid(m_grid); //m_manipulator_corner_top_left->set_snap_corner(CanvasRectMovable::CORNER_TOP_LEFT); m_manipulator_end->set_grid(m_grid); //m_manipulator_corner_top_right->set_snap_corner(CanvasRectMovable::CORNER_TOP_RIGHT); m_manipulator_start->set_drag_cursor(Gdk::TCROSS); //A rather arbitrary cursor. m_manipulator_end->set_drag_cursor(Gdk::TCROSS); manipulator_connect_signals(m_manipulator_start, MANIPULATOR_START); manipulator_connect_signals(m_manipulator_end, MANIPULATOR_END); } Glib::RefPtr CanvasGroupResizable::create_outline_line(double x1, double y1, double x2, double y2) { Glib::RefPtr line = Glom::CanvasLineMovable::create(); line->property_line_width() = OUTLINE_STROKE_WIDTH; line->property_stroke_color() = OUTLINE_STROKE_COLOR; line->set_movement_allowed(false, false); m_group_outline->add_child(line); set_edge_points(line, x1, y1, x2, y2); return line; } void CanvasGroupResizable::create_outline_group() { //Add something to indicate when the item is selected: if(m_group_outline) m_group_outline->remove(); m_group_outline = Goocanvas::Group::create(); add_child(m_group_outline); double x1 = 0; double y1 = 0; get_xy(x1, y1); double child_width = 0; double child_height = 0; get_width_height(child_width, child_height); const double x2 = x1 + child_width; const double y2 = y1 + child_height; m_outline_top = create_outline_line(x1, y1, x2, y1); m_outline_bottom = create_outline_line(x1, y2, x2, y2); m_outline_left = create_outline_line(x1, y1, x1, y2); m_outline_right = create_outline_line(x2, y1, x2, y2); } void CanvasGroupResizable::set_outline_visible(bool visible) { if(!m_group_outline) { std::cerr << G_STRFUNC << ": m_group_outline was null." << std::endl; return; } m_group_outline->property_visibility() = (visible ? Goocanvas::ITEM_VISIBLE : Goocanvas::ITEM_INVISIBLE); } CanvasGroupResizable::~CanvasGroupResizable() { } Glib::RefPtr CanvasGroupResizable::create() { return Glib::RefPtr(new CanvasGroupResizable()); } void CanvasGroupResizable::position_extras() { position_manipulators(); position_outline(); } void CanvasGroupResizable::position_manipulators() { if(get_is_line()) position_line_manipulators(); else position_rect_manipulators(); } void CanvasGroupResizable::position_rect_manipulators() { if(!m_rect) return; //Note that this only works after the child has been added to the canvas: //Goocanvas::Bounds bounds; //m_child->get_bounds(bounds); double x1 = 0; double y1 = 0; get_xy(x1, y1); double child_x = 0; double child_y = 0; get_xy(child_x, child_y); //TODO: Remove duplicate get_xy() call? //std::cout << "debug: " << G_STRFUNC << ": child x=" << child_x << std::endl; double child_width = 0; double child_height = 0; get_width_height(child_width, child_height); //std::cout << "debug: " << G_STRFUNC << ": child width=" << child_width << std::endl; //Show the size of this item (not always the same as the child size): m_rect->property_x() = child_x; m_rect->property_y() = child_y; m_rect->property_width() = child_width; m_rect->property_height() = child_height; //m_rect->property_fill_color_rgba() = 0xFFFFFF00; const double x2 = child_x + child_width; const double y2 = child_y + child_height; Glib::RefPtr item = CanvasItemMovable::cast_to_item(m_child); m_manipulator_corner_top_left->set_xy(x1, y1); m_manipulator_corner_top_right->set_xy(x2 - MANIPULATOR_CORNER_SIZE, y1); m_manipulator_corner_bottom_left->set_xy(x1, y2 - MANIPULATOR_CORNER_SIZE); m_manipulator_corner_bottom_right->set_xy(x2 - MANIPULATOR_CORNER_SIZE, y2 - MANIPULATOR_CORNER_SIZE); set_edge_points(m_manipulator_edge_top, x1, y1, x2, y1); set_edge_points(m_manipulator_edge_bottom, x1, y2, x2, y2); set_edge_points(m_manipulator_edge_left, x1, y1, x1, y2); set_edge_points(m_manipulator_edge_right, x2, y1, x2, y2); //Make sure that the bounds rect is below the item, //and the manipulators are above the item (and above the rect): if(item) { m_group_edge_manipulators->raise(); m_group_corner_manipulators->raise(); m_rect->lower(item); } else { m_group_edge_manipulators->raise(); m_group_corner_manipulators->raise(); } } void CanvasGroupResizable::position_line_manipulators() { Glib::RefPtr line = Glib::RefPtr::cast_dynamic(m_child); if(!line) return; const Goocanvas::Points points = line->property_points(); if(points.get_num_points() < 2) return; double start_x = 0; double start_y = 0; points.get_coordinate(0, start_x, start_y); const double half_size = MANIPULATOR_CORNER_SIZE / 2; m_manipulator_start->set_xy(start_x - half_size, start_y - half_size); //Center it over the point. double end_x = 0; double end_y = 0; points.get_coordinate(1, end_x, end_y); m_manipulator_end->set_xy(end_x - half_size, end_y - half_size); //Center it over the point. m_group_edge_manipulators->raise(); m_group_corner_manipulators->raise(); } void CanvasGroupResizable::position_outline() { if(!m_rect) return; //Note that this only works after the child has been added to the canvas: //Goocanvas::Bounds bounds; //m_child->get_bounds(bounds); double x1 = 0; double y1 = 0; get_xy(x1, y1); double child_width = 0; double child_height = 0; get_width_height(child_width, child_height); //std::cout << "debug: " << G_STRFUNC << ": child width=" << child_width << std::endl; const double x2 = x1 + child_width; const double y2 = y1 + child_height; Glib::RefPtr item = CanvasItemMovable::cast_to_item(m_child); set_edge_points(m_outline_top, x1, y1, x2, y1); set_edge_points(m_outline_bottom, x1, y2, x2, y2); set_edge_points(m_outline_left, x1, y1, x1, y2); set_edge_points(m_outline_right, x2, y1, x2, y2); /* //Make sure that the bounds rect is below the item, //and the manipulators are above the item (and above the rect): if(item) { m_group_edge_manipulators->raise(item); m_group_corner_manipulators->raise(item); m_rect->lower(item); } else { m_group_edge_manipulators->raise(m_rect); m_group_corner_manipulators->raise(m_rect); } */ } void CanvasGroupResizable::set_child(const Glib::RefPtr& child) { //Remove the previous child, if any: if(m_child) { Glib::RefPtr item = CanvasItemMovable::cast_to_item(m_child); item->remove(); } //std::cout << "DEBUG: CanvasGroupResizable::set_child() start" << std::endl; if(!child) return; Glib::RefPtr item = CanvasItemMovable::cast_to_item(child); if(!item) return; //Get any previously-set position //(after we set m_child, this would get the position from the child.) double x = 0; double y = 0; get_xy(x, y); double width = 0; double height = 0; get_width_height(width, height); m_child = child; add_child(item); //Do not use the child's own movable behaviour, because we want everything to move together: child->set_movement_allowed(false, false); //Allow drag to move: item->signal_motion_notify_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_child_motion_notify_event)); item->signal_button_press_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_child_button_press_event)); item->signal_button_release_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_child_button_release_event)); item->signal_enter_notify_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_resizer_enter_notify_event), false); item->signal_leave_notify_event().connect(sigc::mem_fun(*this, &CanvasGroupResizable::on_resizer_leave_notify_event), false); create_manipulators(); //Potentially changing the type of manipulators used, if the item is of a different type. create_outline_group(); //Set the child's position to match this parent resizable's position, if any was set: //(Note that the resizable should have its position set to that of the child, //if that is the position that is wanted. set_xy(x, y); set_width_height(width, height); position_extras(); set_manipulators_visibility(Goocanvas::ITEM_INVISIBLE); set_outline_visible(false); } Glib::RefPtr CanvasGroupResizable::get_child() { return m_child; } Glib::RefPtr CanvasGroupResizable::get_child() const { return m_child; } void CanvasGroupResizable::manipulator_connect_signals(const Glib::RefPtr& manipulator, Manipulators manipulator_id) { //Respond when the corner rectangles move (they implement their own dragging): //TODO: Use x and y property notification. Glib::RefPtr rect = Glib::RefPtr::cast_dynamic(manipulator); if(rect) { if(get_is_line()) { rect->signal_moved().connect( sigc::bind( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_line_end_moved), manipulator_id) ); } else { rect->signal_moved().connect( sigc::bind( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_corner_moved), manipulator_id) ); } } else { Glib::RefPtr line = Glib::RefPtr::cast_dynamic(manipulator); if(line) { line->signal_moved().connect( sigc::bind( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_edge_moved), manipulator_id) ); } } manipulator->signal_enter_notify_event().connect( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_enter_notify_event), false); manipulator->signal_leave_notify_event().connect( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_leave_notify_event), false); //manipulator->property_x().signal_changed().connect( // sigc::bind( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_moved), manipulator_id) ); // manipulator->property_y().signal_changed().connect( // sigc::bind( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_moved), manipulator_id) ); //manipulator->signal_button_press_event().connect( // sigc::bind( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_button_press_event), manipulator_id) ); //manipulator->signal_motion_notify_event().connect( // sigc::bind( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_motion_notify_event), manipulator_id) ); //manipulator->signal_button_release_event().connect( // sigc::bind( sigc::mem_fun(*this, &CanvasGroupResizable::on_manipulator_button_release_event), manipulator_id) ); } Glib::RefPtr CanvasGroupResizable::get_manipulator(Manipulators manipulator_id) { switch(manipulator_id) { //Rectangle manipulators: case(MANIPULATOR_CORNER_TOP_LEFT): return m_manipulator_corner_top_left; case(MANIPULATOR_CORNER_TOP_RIGHT): return m_manipulator_corner_top_right; case(MANIPULATOR_CORNER_BOTTOM_LEFT): return m_manipulator_corner_bottom_left; case(MANIPULATOR_CORNER_BOTTOM_RIGHT): return m_manipulator_corner_bottom_right; case(MANIPULATOR_EDGE_TOP): return m_manipulator_edge_top; case(MANIPULATOR_EDGE_BOTTOM): return m_manipulator_edge_bottom; case(MANIPULATOR_EDGE_LEFT): return m_manipulator_edge_left; case(MANIPULATOR_EDGE_RIGHT): return m_manipulator_edge_right; //Line manipulators: case(MANIPULATOR_START): return m_manipulator_start; case(MANIPULATOR_END): return m_manipulator_end; default: return Glib::RefPtr(); } } void CanvasGroupResizable::on_manipulator_corner_moved(const Glib::RefPtr& /* item */, double /* x_offset */, double /* y_offset */, Manipulators manipulator_id) { //Make sure that the manipulator is still visibile. //(if the user moves too fast then we get a leave-notify-event on the manipulator, rect, or item): set_manipulators_visibility(Goocanvas::ITEM_VISIBLE); Glib::RefPtr manipulator_base = get_manipulator(manipulator_id); Glib::RefPtr manipulator = Glib::RefPtr::cast_dynamic(manipulator_base); if(!manipulator) return; double manipulator_x = 0; double manipulator_y = 0; manipulator->get_xy(manipulator_x, manipulator_y); double child_x = 0; double child_y = 0; get_xy(child_x, child_y); double child_width = 0; double child_height = 0; get_width_height(child_width, child_height); switch(manipulator_id) { case(MANIPULATOR_CORNER_TOP_LEFT): { const double new_x = std::min(manipulator_x, child_x + child_width); const double new_y = std::min(manipulator_y, child_y + child_height); const double new_height = std::max(child_y + child_height - manipulator->property_y(), 0.0); const double new_width = std::max(child_x + child_width - manipulator->property_x(), 0.0); set_xy(new_x, new_y); set_width_height(new_width, new_height); break; } case(MANIPULATOR_CORNER_TOP_RIGHT): { const double new_y = std::min(manipulator_y, child_y + child_height); const double new_height = std::max(child_y + child_height - manipulator->property_y(), 0.0); const double new_width = std::max(manipulator->property_x() + MANIPULATOR_CORNER_SIZE - child_x, 0.0); set_xy(child_x, new_y); set_width_height(new_width, new_height); break; } case(MANIPULATOR_CORNER_BOTTOM_LEFT): { const double new_x = std::min(manipulator_x, child_x + child_width); const double new_height = std::max(manipulator->property_y() + MANIPULATOR_CORNER_SIZE - child_y, 0.0); const double new_width = std::max(child_x + child_width - manipulator->property_x(), 0.0); set_xy(new_x, child_y); set_width_height(new_width, new_height); break; } case(MANIPULATOR_CORNER_BOTTOM_RIGHT): { const double new_height = std::max(manipulator->property_y() + MANIPULATOR_CORNER_SIZE - child_y, 0.0); const double new_width = std::max(manipulator->property_x() + MANIPULATOR_CORNER_SIZE - child_x, 0.0); set_width_height(new_width, new_height); break; } default: break; } position_extras(); m_signal_resized.emit(); } void CanvasGroupResizable::on_manipulator_line_end_moved(const Glib::RefPtr& /* item */, double /* x_offset */, double /* y_offset */, Manipulators manipulator_id) { //Make sure that the manipulator is still visibile. //(if the user moves too fast then we get a leave-notify-event on the manipulator, rect, or item): set_manipulators_visibility(Goocanvas::ITEM_VISIBLE); Glib::RefPtr manipulator_base = get_manipulator(manipulator_id); Glib::RefPtr manipulator = Glib::RefPtr::cast_dynamic(manipulator_base); if(!manipulator) return; Glib::RefPtr line = Glib::RefPtr::cast_dynamic(m_child); if(!line) return; double manipulator_x = 0; double manipulator_y = 0; manipulator->get_xy(manipulator_x, manipulator_y); Goocanvas::Points points = line->property_points(); if(points.get_num_points() < 2) return; const int point_index = (manipulator_id == MANIPULATOR_START) ? 0 : 1; const double half_size = MANIPULATOR_CORNER_SIZE / 2; points.set_coordinate(point_index, manipulator_x + half_size, manipulator_y + half_size); line->property_points() = points; //TODO: Add a way to do this without getting and setting the points property. position_extras(); } bool CanvasGroupResizable::on_manipulator_enter_notify_event(const Glib::RefPtr& /* target */, GdkEventCrossing* /* event */) { m_in_manipulator = true; set_manipulators_visibility(Goocanvas::ITEM_VISIBLE); return false; } bool CanvasGroupResizable::on_manipulator_leave_notify_event(const Glib::RefPtr& /* target */, GdkEventCrossing* /* event */) { m_in_manipulator = false; set_manipulators_visibility(Goocanvas::ITEM_INVISIBLE); return false; } void CanvasGroupResizable::on_manipulator_edge_moved(const Glib::RefPtr& /* item */, double /* x_offset */, double /* y_offset */, Manipulators manipulator_id) { //Make sure that the manipulator is still visibile. //(if the user moves too fast then we get a leave-notify-event on the manipulator, rect, or item): set_manipulators_visibility(Goocanvas::ITEM_VISIBLE); Glib::RefPtr manipulator_base = get_manipulator(manipulator_id); Glib::RefPtr manipulator = Glib::RefPtr::cast_dynamic(manipulator_base); //std::cout << "debug: " << G_STRFUNC << ": manipulator=" << manipulator_id << std::endl; Goocanvas::Points points = manipulator->property_points(); double x1 = 0; double y1 = 0; points.get_coordinate(0, x1, y1); double x2 = 0; double y2 = 0; points.get_coordinate(1, x2, y2); double child_x = 0; double child_y = 0; get_xy(child_x, child_y); double child_width = 0; double child_height = 0; get_width_height(child_width, child_height); switch(manipulator_id) { case(MANIPULATOR_EDGE_TOP): { const double new_y = y1; const double new_height = std::max(child_y + child_height - y1, 0.0); set_xy(child_x, new_y); set_width_height(child_width, new_height); break; } case(MANIPULATOR_EDGE_BOTTOM): { const double new_height = std::max(y1 - child_y, 0.0); set_width_height(child_width, new_height); break; } case(MANIPULATOR_EDGE_LEFT): { const double new_x = x1; const double new_width = std::max(child_x + child_width - x1, 0.0); set_xy(new_x, child_y); set_width_height(new_width, child_height); break; } case(MANIPULATOR_EDGE_RIGHT): { const double new_width = std::max(x1 - child_x, 0.0); set_width_height(new_width, child_height); break; } default: break; } position_extras(); m_signal_resized.emit(); } bool CanvasGroupResizable::on_child_button_press_event(const Glib::RefPtr& target, GdkEventButton* event) { return CanvasItemMovable::on_button_press_event(target, event); } bool CanvasGroupResizable::on_child_motion_notify_event(const Glib::RefPtr& target, GdkEventMotion* event) { //std::cout << "CanvasGroupResizable::on_motion_notify_event()" << std::endl; const bool result = CanvasItemMovable::on_motion_notify_event(target, event); position_extras(); return result; } bool CanvasGroupResizable::on_child_button_release_event(const Glib::RefPtr& target, GdkEventButton* event) { return CanvasItemMovable::on_button_release_event(target, event); } /* bool CanvasGroupResizable::on_manipulator_button_press_event(const Glib::RefPtr& target, GdkEventButton* event, Manipulators manipulator) { return true; } bool CanvasGroupResizable::on_manipulator_button_release_event(const Glib::RefPtr& target, GdkEventButton* event, Manipulators manipulator) { return true; } bool CanvasGroupResizable::on_manipulator_motion_notify_event(const Glib::RefPtr& target, GdkEventMotion* event, Manipulators manipulator) { return true; } */ void CanvasGroupResizable::set_manipulators_visibility(Goocanvas::ItemVisibility visibility) { if(!m_group_edge_manipulators || !m_group_corner_manipulators) return; //Make sure that edges stays visible if the item is selected, //because that is how we show selection: Goocanvas::ItemVisibility edge_visibility = visibility; if(get_selected()) edge_visibility = Goocanvas::ITEM_VISIBLE; //For testing: visibility = Goocanvas::ITEM_VISIBLE; m_group_edge_manipulators->property_visibility() = edge_visibility; m_group_corner_manipulators->property_visibility() = visibility; //Also show grid lines in the portal table, //though these are not actually manipulatable. Glib::RefPtr table = Glib::RefPtr::cast_dynamic(get_child()); if(table) { if(visibility == Goocanvas::ITEM_VISIBLE) table->set_lines_visibility(); else table->set_lines_visibility(false); } } bool CanvasGroupResizable::on_rect_enter_notify_event(const Glib::RefPtr& /* target */, GdkEventCrossing* /* event */) { set_manipulators_visibility(Goocanvas::ITEM_VISIBLE); return true; } bool CanvasGroupResizable::on_rect_leave_notify_event(const Glib::RefPtr& /* target */, GdkEventCrossing* /* event */) { //std::cout << "CanvasGroupResizable::on_rect_leave_notify_event" << std::endl; //Glib::RefPtr target_movable = CanvasItemMovable::cast_to_movable(target); //Hide the manipulators if we are outside of the main area, //but not just because we are instead inside the manipulator itself: //Doesn't seem useful: if(!m_in_manipulator && (target_movable == m_child)) set_manipulators_visibility(Goocanvas::ITEM_INVISIBLE); return false; } bool CanvasGroupResizable::on_resizer_enter_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event) { CanvasItemMovable::on_enter_notify_event(target, event); set_manipulators_visibility(Goocanvas::ITEM_VISIBLE); return true; } bool CanvasGroupResizable::on_resizer_leave_notify_event(const Glib::RefPtr& target, GdkEventCrossing* event) { CanvasItemMovable::on_leave_notify_event(target, event); //Glib::RefPtr target_movable = CanvasItemMovable::cast_to_movable(target); //Hide the manipulators if we are outside of the main area, //but not just because we are instead inside the manipulator itself: //Doesn't seem useful: if(!m_in_manipulator && (target_movable == m_child)) set_manipulators_visibility(Goocanvas::ITEM_INVISIBLE); return false; } Glib::RefPtr CanvasGroupResizable::create_corner_manipulator() { Glib::RefPtr result = CanvasRectMovable::create(); result->property_fill_color() = MANIPULATOR_CORNER_FILL_COLOR; //This makes the whole area clickable, not just the outline stroke: result->property_line_width() = MANIPULATOR_STROKE_WIDTH; result->property_stroke_color() = MANIPULATOR_STROKE_COLOR; result->property_height() = MANIPULATOR_CORNER_SIZE; result->property_width() = MANIPULATOR_CORNER_SIZE; return result; } Glib::RefPtr CanvasGroupResizable::create_edge_manipulator() { Glib::RefPtr line = Glom::CanvasLineMovable::create(); line->property_line_width() = MANIPULATOR_STROKE_WIDTH; line->property_stroke_color() = MANIPULATOR_STROKE_COLOR; return line; } void CanvasGroupResizable::set_edge_points(const Glib::RefPtr& line, double x1, double y1, double x2, double y2) { double points_coordinates[] = {x1, y1, x2, y2}; Goocanvas::Points points(2, points_coordinates); line->property_points() = points; } void CanvasGroupResizable::get_xy(double& x, double& y) const { if(m_child) m_child->get_xy(x, y); else { x = m_x; y = m_y; } } void CanvasGroupResizable::set_xy(double x, double y) { //std::cout << "debug: " << G_STRFUNC << ": " << x << ", " << y << std::endl; if(m_child) m_child->set_xy(x, y); //Store them for use when we have a child. m_x = x; m_y = y; position_extras(); } void CanvasGroupResizable::get_width_height(double& width, double& height) const { if(m_child) m_child->get_width_height(width, height); else { width = m_width; height = m_height; } //GooCanvasGroup allows height and width to be -1 to mean the "use the default", //but other GooCanvas* items reject that as out of range, //so prevent us from using it: if(width == -1) width = 100; //Arbitrary default. if(height == -1) height = 100; //Arbitrary default. } void CanvasGroupResizable::set_width_height(double width, double height) { if(m_child) m_child->set_width_height(width, height); //Store them for use when we have a child. m_width = width; m_height = height; position_extras(); } void CanvasGroupResizable::snap_position(double& x, double& y) const { double offset_x_min = 0; double offset_y_min = 0; //Try snapping each corner, to choose the one that snapped closest: for(int i = 0; i < CORNER_COUNT; ++i) { const Corners corner = (Corners)i; double temp_x = x; double temp_y = y; snap_position(corner, temp_x, temp_y); const double offset_x = temp_x -x; const double offset_y = temp_y - y; //Use the smallest offset, preferring some offset to no offset: if(offset_x && ((std::abs(offset_x) < std::abs(offset_x_min)) || !offset_x_min)) offset_x_min = offset_x; if(offset_y && ((std::abs(offset_y) < std::abs(offset_y_min)) || !offset_y_min)) offset_y_min = offset_y; } x += offset_x_min; y += offset_y_min; } void CanvasGroupResizable::snap_position(Corners corner, double& x, double& y) const { double child_width = 0; double child_height = 0; get_width_height(child_width, child_height); //Choose the offset of the part to snap to the grid: double corner_x_offset = 0; double corner_y_offset = 0; switch(corner) { case CORNER_TOP_LEFT: corner_x_offset = 0; corner_y_offset = 0; break; case CORNER_TOP_RIGHT: corner_x_offset = child_width; corner_y_offset = 0; break; case CORNER_BOTTOM_LEFT: corner_x_offset = 0; corner_y_offset = child_height; break; case CORNER_BOTTOM_RIGHT: corner_x_offset = child_width; corner_y_offset = child_height; break; default: break; } //Snap that point to the grid: const double x_to_snap = x + corner_x_offset; const double y_to_snap = y + corner_y_offset; double corner_x_snapped = x_to_snap; double corner_y_snapped = y_to_snap; CanvasItemMovable::snap_position(corner_x_snapped, corner_y_snapped); //Discover what offset the snapping causes: const double snapped_offset_x = corner_x_snapped - x_to_snap; const double snapped_offset_y = corner_y_snapped - y_to_snap; //Apply that offset to the regular position: x += snapped_offset_x; y += snapped_offset_y; } Goocanvas::Canvas* CanvasGroupResizable::get_parent_canvas_widget() { return get_canvas(); } bool CanvasGroupResizable::get_is_line() const { Glib::RefPtr line = Glib::RefPtr::cast_dynamic(m_child); return line; } CanvasGroupResizable::type_signal_resized CanvasGroupResizable::signal_resized() { return m_signal_resized; } void CanvasGroupResizable::set_grid(const Glib::RefPtr& grid) { //Call the base class: CanvasItemMovable::set_grid(grid); //Apply the grid to all the manipulators: if(!m_group_edge_manipulators || !m_group_corner_manipulators) return; int count = m_group_edge_manipulators->get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = m_group_edge_manipulators->get_child(i); Glib::RefPtr movable = CanvasItemMovable::cast_to_movable(child); if(movable) { movable->set_grid(grid); } } count = m_group_corner_manipulators->get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = m_group_corner_manipulators->get_child(i); Glib::RefPtr movable = CanvasItemMovable::cast_to_movable(child); if(movable) { movable->set_grid(grid); } } } void CanvasGroupResizable::show_selected() { if(!m_group_edge_manipulators) return; Goocanvas::ItemVisibility edge_visibility = Goocanvas::ITEM_INVISIBLE; if(get_selected()) edge_visibility = Goocanvas::ITEM_VISIBLE; //This is also set the same way if set_manipulators_visibility(), //in case that is called at some other time. m_group_edge_manipulators->property_visibility() = edge_visibility; } } //namespace Glom glom-1.22.4/glom/utility_widgets/canvas/canvas_item_movable.cc0000644000175000017500000003472012234252646025747 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_item_movable.h" #include "canvas_rect_movable.h" #include "canvas_text_movable.h" #include "canvas_image_movable.h" #include "canvas_line_movable.h" #include "canvas_group_movable.h" #include "canvas_group_resizable.h" #include "canvas_table_movable.h" #include #include #include #include #include namespace Glom { CanvasItemMovable::CanvasItemMovable() : m_dragging(false), m_dragging_vertical_only(false), m_dragging_horizontal_only(false), m_drag_start_cursor_x(0.0), m_drag_start_cursor_y(0.0), m_drag_start_position_x(0.0), m_drag_start_position_y(0.0), m_drag_latest_position_x(0.0), m_drag_latest_position_y(0.0), m_grid(0), m_allow_vertical_movement(true), m_allow_horizontal_movement(true), m_selected(false), m_shift_click(false) { //TODO: Remove this when goocanvas is fixed, so the goocanvasmm constructor can connect default signal handlers: /* signal_motion_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_motion_notify_event)); signal_button_press_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_press_event)); signal_button_release_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_release_event)); signal_enter_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_enter_notify_event)); signal_leave_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_leave_notify_event)); */ } CanvasItemMovable::~CanvasItemMovable() { } bool CanvasItemMovable::on_button_press_event(const Glib::RefPtr& target, GdkEventButton* event) { //std::cout << G_STRFUNC << ": DEBUG" << std::endl; m_shift_click = false; switch(event->button) { case 1: { if(!m_allow_vertical_movement && !m_allow_horizontal_movement) return false; // Not handled. Let it be handled by an item lower in the z order, or a parent group, if any. Glib::RefPtr item = target; m_drag_start_cursor_x = event->x; m_drag_start_cursor_y = event->y; get_xy(m_drag_start_position_x, m_drag_start_position_y); m_drag_latest_position_x = m_drag_start_position_x; m_drag_latest_position_y = m_drag_start_position_y; Goocanvas::Canvas* canvas = get_parent_canvas_widget(); if(canvas) { canvas->pointer_grab(item, Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_RELEASE_MASK, m_drag_cursor, event->time); } m_dragging = true; //Holding down shift when pressing the mouse down //means that any selection (decided later) will be a multiple selection. if(event->state & GDK_SHIFT_MASK) m_shift_click = true; return true; // Handled. break; } case 3: { m_signal_show_context.emit(event->button, event->time); return false; // Not fully Handled. break; } default: break; } return false; // Not handled. Pass it to an item lower in the z order, if any. } bool CanvasItemMovable::on_motion_notify_event(const Glib::RefPtr& target, GdkEventMotion* event) { if(!m_allow_vertical_movement && !m_allow_horizontal_movement) return false; // Not handled. Let it be handled by an item lower in the z order, or a parent group, if any. Glib::RefPtr item = target; if(item && m_dragging && (event->state & Gdk::BUTTON1_MASK)) { const double offset_x = event->x - m_drag_start_cursor_x; const double offset_y = event->y - m_drag_start_cursor_y; // Inkscape uses the Ctrl key to restrict movement to horizontal or vertical, // so let's do that too. if( (event->state & Gdk::CONTROL_MASK) && !m_dragging_vertical_only && !m_dragging_horizontal_only ) { //Decide whether to restrict to vertical or horizontal movement: //Whichever has the greatest offset already will be the axis that we restrict movement to. if(offset_x > offset_y) { m_dragging_horizontal_only = true; m_dragging_vertical_only = false; } else { m_dragging_vertical_only = true; m_dragging_horizontal_only = false; } } else if( !(event->state & Gdk::CONTROL_MASK) && (m_dragging_vertical_only || m_dragging_horizontal_only)) { //Ctrl was released, so allow full movement again: m_dragging_vertical_only = false; m_dragging_horizontal_only = false; } double new_x = m_drag_start_position_x + offset_x; double new_y = m_drag_start_position_y + offset_y; snap_position(new_x, new_y); if(!m_allow_vertical_movement || m_dragging_horizontal_only) new_y = m_drag_start_position_y; if(!m_allow_horizontal_movement || m_dragging_vertical_only) new_x = m_drag_start_position_x; set_xy(new_x, new_y); Glib::RefPtr refThis(this); refThis->reference(); // A click with a move should always select: // We emit this before signal_moved, // so that its signal handler can know about the selection. const bool old_selected = get_selected(); set_selected(true); if(!old_selected) { m_signal_selected.emit(refThis, m_shift_click); } const double this_move_offset_x = new_x - m_drag_latest_position_x; const double this_move_offset_y = new_y - m_drag_latest_position_y; m_drag_latest_position_x = new_x; m_drag_latest_position_y = new_y; m_signal_moved.emit(refThis, this_move_offset_x, this_move_offset_y); return true; //We handled this event. } return false; //We didn't handle this event. } bool CanvasItemMovable::on_button_release_event(const Glib::RefPtr& target, GdkEventButton* event) { //std::cout << G_STRFUNC << ": DEBUG" << std::endl; if(!m_allow_vertical_movement && !m_allow_horizontal_movement) return false; // Not handled. Let it be handled by an item lower in the z order, or a parent group, if any. Goocanvas::Canvas* canvas = get_parent_canvas_widget(); if(canvas) canvas->pointer_ungrab(target, event->time); m_dragging = false; // A click without a move should select or deselect: const bool old_selected = get_selected(); bool selected = !old_selected; // A drag-to-move should always select and never deselect: if(!selected) { double x = 0; double y = 0; get_xy(x, y); if( (m_drag_start_position_x != x) || (m_drag_start_position_y != y) ) { selected = true; } } //This will also ask derived classes to indicate it visually: set_selected(selected); //Notify of the selection change, if any: if(selected != old_selected) { Glib::RefPtr refThis(this); refThis->reference(); m_signal_selected.emit(refThis, m_shift_click); } return true; } bool CanvasItemMovable::on_enter_notify_event(const Glib::RefPtr& /* target */, GdkEventCrossing* /* event */) { set_cursor(m_drag_cursor); return false; //We didn't fully handle this event - let other signal handlers (even for other items) handle it too. } bool CanvasItemMovable::on_leave_notify_event(const Glib::RefPtr& /* target */, GdkEventCrossing* /* event */) { unset_cursor(); return false; //We didn't fully handle this event - let other signal handlers (even for other items) handle it too. } CanvasItemMovable::type_signal_moved CanvasItemMovable::signal_moved() { return m_signal_moved; } CanvasItemMovable::type_signal_show_context CanvasItemMovable::signal_show_context() { return m_signal_show_context; } CanvasItemMovable::type_signal_selected CanvasItemMovable::signal_selected() { return m_signal_selected; } void CanvasItemMovable::set_drag_cursor(const Glib::RefPtr& cursor) { m_drag_cursor = cursor; } void CanvasItemMovable::set_drag_cursor(Gdk::CursorType cursor) { m_drag_cursor = Gdk::Cursor::create(cursor); } void CanvasItemMovable::set_cursor(const Glib::RefPtr& cursor) { Goocanvas::Canvas* canvas = get_parent_canvas_widget(); if(!canvas) return; Glib::RefPtr window = canvas->get_window(); if(window) window->set_cursor(cursor); } void CanvasItemMovable::unset_cursor() { Goocanvas::Canvas* canvas = get_parent_canvas_widget(); if(canvas) { Glib::RefPtr window = canvas->get_window(); if(window) window->set_cursor(); } } void CanvasItemMovable::set_grid(const Glib::RefPtr& grid) { m_grid = grid; } void CanvasItemMovable::snap_position(double& x, double& y) const { //Override this to snap on a part other than the arbitrary part used by get_xy() and move(). //For instance, you may want to snap on the bottom-left corner of a rectangle rather than the top-left. if(m_grid) m_grid->snap_position(x, y); //else //{ // std::cout << "debug: " << G_STRFUNC << ": m_grid is NULL" << std::endl; //} } void CanvasItemMovable::set_movement_allowed(bool vertical, bool horizontal) { m_allow_vertical_movement = vertical; m_allow_horizontal_movement = horizontal; } //static: Glib::RefPtr CanvasItemMovable::cast_to_movable(const Glib::RefPtr& item) { Glib::RefPtr movable; if(!item) return movable; //We can't cast directly to CanvasItemMovable because each class derives from it separately, //instead of it being a base class of Goocanvas::Item (the common base class): Glib::RefPtr rect = Glib::RefPtr::cast_dynamic(item); if(rect) movable = Glib::RefPtr::cast_dynamic(rect); else { Glib::RefPtr line = Glib::RefPtr::cast_dynamic(item); if(line) movable = Glib::RefPtr::cast_dynamic(line); else { Glib::RefPtr text = Glib::RefPtr::cast_dynamic(item); if(text) movable = Glib::RefPtr::cast_dynamic(text); else { Glib::RefPtr image = Glib::RefPtr::cast_dynamic(item); if(image) movable = Glib::RefPtr::cast_dynamic(image); else { Glib::RefPtr group = Glib::RefPtr::cast_dynamic(item); if(group) movable = Glib::RefPtr::cast_dynamic(group); else { Glib::RefPtr table = Glib::RefPtr::cast_dynamic(item); if(table) movable = Glib::RefPtr::cast_dynamic(table); else { Glib::RefPtr group_resizable = Glib::RefPtr::cast_dynamic(item); if(group_resizable) movable = Glib::RefPtr::cast_dynamic(group_resizable); } } } } } } //Goocanvas::Item* debug = item.operator->(); //std::cout << "CanvasItemMovable::cast_to_movable(" << typeid(*debug).name() << ") = " << movable << std::endl; return movable; } //static: Glib::RefPtr CanvasItemMovable::cast_const_to_movable(const Glib::RefPtr& item) { Glib::RefPtr unconst = Glib::RefPtr::cast_const(item); return cast_to_movable(unconst); } //static: Glib::RefPtr CanvasItemMovable::cast_to_item(const Glib::RefPtr& item) { Glib::RefPtr result; if(!item) return result; //We can't cast directly to Item because each class derives from it separately. Glib::RefPtr rect = Glib::RefPtr::cast_dynamic(item); if(rect) result = Glib::RefPtr::cast_dynamic(rect); else { Glib::RefPtr line = Glib::RefPtr::cast_dynamic(item); if(line) result = Glib::RefPtr::cast_dynamic(line); else { Glib::RefPtr text = Glib::RefPtr::cast_dynamic(item); if(text) result = Glib::RefPtr::cast_dynamic(text); else { Glib::RefPtr image = Glib::RefPtr::cast_dynamic(item); if(image) result = Glib::RefPtr::cast_dynamic(image); else { Glib::RefPtr group = Glib::RefPtr::cast_dynamic(item); if(group) result = Glib::RefPtr::cast_dynamic(group); else { Glib::RefPtr table = Glib::RefPtr::cast_dynamic(item); if(table) result = Glib::RefPtr::cast_dynamic(table); else { Glib::RefPtr group_resizable = Glib::RefPtr::cast_dynamic(item); if(group_resizable) result = Glib::RefPtr::cast_dynamic(group_resizable); } } } } } } return result; } //static: Glib::RefPtr CanvasItemMovable::cast_const_to_item(const Glib::RefPtr& item) { Glib::RefPtr unconst = Glib::RefPtr::cast_const(item); return cast_to_item(unconst); } void CanvasItemMovable::set_selected(bool selected) { m_selected = selected; show_selected(); //Let derived classes indicate it visually, } bool CanvasItemMovable::get_selected() const { return m_selected; } void CanvasItemMovable::show_selected() { //Derived classes should override this. } } //namespace Glom glom-1.22.4/glom/utility_widgets/canvas/canvas_group_grid.h0000644000175000017500000000613312234252646025304 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_GROUP_GRID_H #define GLOM_UTILITY_WIDGETS_CANVAS_GROUP_GRID_H //#include #include #include #include #include namespace Glom { class CanvasLineMovable; class CanvasGroupGrid : public Goocanvas::Group { private: CanvasGroupGrid(); virtual ~CanvasGroupGrid(); public: static Glib::RefPtr create(); /** Snap a coordinate position to any nearby grid or rule line, if the coordinate is close enough to one. */ void snap_position(double& x, double& y) const; /** Set the distance between grid lines, * used to snap to the grid lines when moving or resizing items. */ void set_grid_gap(double gap); /** Recreate the grid lines if this item has changed size. * TODO: Just do this in response to some property change? */ void update_grid_for_new_size(); /** Remove grid lines. * See also remove_rules(). */ void remove_grid(); void add_vertical_rule(double x); void add_horizontal_rule(double x); void remove_rules(); typedef std::vector type_vec_doubles; type_vec_doubles get_horizontal_rules() const; type_vec_doubles get_vertical_rules() const; void set_rules_visibility(bool visible = true); /** Either @a x or @a y should be 0. */ void show_temp_rule(double x, double y, bool show = true); private: void create_grid_lines(); Glib::RefPtr create_rule_line(double pos, bool horizontal); double snap_position_grid(double a) const; double snap_position_rules(const type_vec_doubles& rules, double a) const; double snap_position_rules_x(double x) const; double snap_position_rules_y(double y) const; bool is_close(double a, double b) const; /// 0.0 means no grid. double m_grid_gap; /// How close we have to be to a grid line to snap to it: double m_grid_sensitivity; typedef std::vector< Glib::RefPtr > type_vec_lines; /// The vertical rules: type_vec_lines m_rules_x; /// The horizontal rules: type_vec_lines m_rules_y; Glib::RefPtr m_grid_lines; Glib::RefPtr m_grid_rules_group; Glib::RefPtr m_temp_rule; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_GROUP_GRID_H glom-1.22.4/glom/utility_widgets/canvas/canvas_image_movable.cc0000644000175000017500000001424312234776363026100 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include // For get_appwindow(). #include "canvas_image_movable.h" #include #include #include //For Utils::image_scale_keeping_ratio(). #include namespace Glom { CanvasImageMovable::CanvasImageMovable(const Glib::RefPtr& pixbuf, double x, double y) : Goocanvas::Image(pixbuf, x, y), m_snap_corner(CORNER_TOP_LEFT), //arbitrary default. m_image_empty(false) { init(); } CanvasImageMovable::CanvasImageMovable(double x, double y) : Goocanvas::Image(x, y), CanvasItemMovable(), m_snap_corner(CORNER_TOP_LEFT) //arbitrary default. { init(); } CanvasImageMovable::~CanvasImageMovable() { } void CanvasImageMovable::init() { signal_motion_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_motion_notify_event)); signal_button_press_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_press_event)); signal_button_release_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_button_release_event)); signal_enter_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_enter_notify_event)); signal_leave_notify_event().connect(sigc::mem_fun(*this, &CanvasItemMovable::on_leave_notify_event)); } Glib::RefPtr CanvasImageMovable::create(const Glib::RefPtr& pixbuf, double x, double y) { return Glib::RefPtr(new CanvasImageMovable(pixbuf, x, y)); } Glib::RefPtr CanvasImageMovable::create(double x, double y) { return Glib::RefPtr(new CanvasImageMovable(x, y)); } void CanvasImageMovable::get_xy(double& x, double& y) const { x = property_x(); y = property_y(); } void CanvasImageMovable::set_xy(double x, double y) { property_x() = x; property_y() = y; } void CanvasImageMovable::get_width_height(double& width, double& height) const { //TODO: This only works when it is on a canvas already, //and this is apparently incorrect when the "coordinate space" of the item changes, whatever that means. murrayc. width = property_width(); height = property_height(); } void CanvasImageMovable::set_width_height(double width, double height) { property_width() = width; property_height() = height; } void CanvasImageMovable::snap_position(double& x, double& y) const { double width = 0; double height = 0; get_width_height(width, height); //Choose the offset of the part to snap to the grid: double corner_x_offset = 0; double corner_y_offset = 0; switch(m_snap_corner) { case CORNER_TOP_LEFT: corner_x_offset = 0; corner_y_offset = 0; break; case CORNER_TOP_RIGHT: corner_x_offset = property_width(); corner_y_offset = 0; break; case CORNER_BOTTOM_LEFT: corner_x_offset = 0; corner_y_offset = height; break; case CORNER_BOTTOM_RIGHT: corner_x_offset = width; corner_y_offset = height; break; default: break; } //Snap that point to the grid: const double x_to_snap = x + corner_x_offset; const double y_to_snap = y + corner_y_offset; double corner_x_snapped = x_to_snap; double corner_y_snapped = y_to_snap; CanvasItemMovable::snap_position(corner_x_snapped, corner_y_snapped); //Discover what offset the snapping causes: const double snapped_offset_x = corner_x_snapped - x_to_snap; const double snapped_offset_y = corner_y_snapped - y_to_snap; //Apply that offset to the regular position: x += snapped_offset_x; y += snapped_offset_y; } Goocanvas::Canvas* CanvasImageMovable::get_parent_canvas_widget() { return get_canvas(); } void CanvasImageMovable::set_snap_corner(Corners corner) { m_snap_corner = corner; } void CanvasImageMovable::set_image(const Glib::RefPtr& pixbuf, bool scale) { property_pixbuf() = pixbuf; m_pixbuf = pixbuf; if(scale) scale_to_size(); m_image_empty = false; } void CanvasImageMovable::scale_to_size() { if(!m_pixbuf) return; double width = 0; double height = 0; get_width_height(width, height); Goocanvas::Canvas* canvas = get_canvas(); if(!canvas) { std::cerr << G_STRFUNC << ": canvas is null" << std::endl; return; } //Convert, because our canvas uses units (mm) but the pixbuf uses pixels: double width_pixels = width; double height_pixels = height; canvas->convert_to_pixels(width_pixels, height_pixels); if(width_pixels && height_pixels) { Glib::RefPtr pixbuf = Utils::image_scale_keeping_ratio(m_pixbuf, (int)height_pixels, (int)width_pixels); property_pixbuf() = pixbuf; } //Make sure that the size stays the same even if the scaling wasn't exact: set_width_height(width, height); //TODO: Fix this goocanvas bug http://bugzilla.gnome.org/show_bug.cgi?id=657592, //We can't work around it by forcing an extra scale in GooCanvasItem like so: //property_scale_to_fit() = true; //because that does not keep the aspect ratio. } void CanvasImageMovable::set_image_empty() { m_image_empty = true; //We need some widget to use either render_icon() or get_style()+IconSet. Gtk::Widget *widget = get_canvas(); if(!widget) widget = AppWindow::get_appwindow(); Glib::RefPtr pixbuf; if(widget) pixbuf = widget->render_icon_pixbuf(Gtk::Stock::MISSING_IMAGE, Gtk::ICON_SIZE_DIALOG); property_pixbuf() = pixbuf; } bool CanvasImageMovable::get_image_empty() const { return m_image_empty; } } //namespace Glom glom-1.22.4/glom/utility_widgets/notebookglom.h0000644000175000017500000000276212234252646023040 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_NOTEBOOK_GLOM_H #define GLOM_UTILITY_WIDGETS_NOTEBOOK_GLOM_H #include #include "layoutwidgetmenu.h" #include #include namespace Glom { class AppWindow; class NotebookLabel; class NotebookGlom : public Gtk::Notebook, public LayoutWidgetMenu { public: explicit NotebookGlom(BaseObjectType* cobject, const Glib::RefPtr& builder); explicit NotebookGlom(); virtual ~NotebookGlom(); protected: friend class NotebookLabel; void delete_from_layout(); protected: void init(); virtual AppWindow* get_appwindow() const; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_NOTEBOOK_GLOM_H glom-1.22.4/glom/utility_widgets/dialog_flowtable.cc0000644000175000017500000000436012234776363024000 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2008 Johannes Schmid * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_flowtable.h" #include #include namespace Glom { const char* Dialog_FlowTable::glade_id("dialog_flowtable"); const bool Dialog_FlowTable::glade_developer(true); Dialog_FlowTable::Dialog_FlowTable(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_entry_title(0), m_spin_columns(0), m_flowtable(0) { builder->get_widget("entry_title", m_entry_title); builder->get_widget("spin_columns", m_spin_columns); //Set the adjustment details, to avoid a useless 0-to-0 range and a 0 incremenet. //We don't do this the Glade file because GtkBuilder wouldn't find the //associated adjustment object unless we specified it explictly: //See http://bugzilla.gnome.org/show_bug.cgi?id=575714 m_spin_columns->set_range(0, 10); m_spin_columns->set_increments(1, 2); m_spin_columns->set_value(3); //A sensible default. show_all_children(); } Dialog_FlowTable::~Dialog_FlowTable() { } void Dialog_FlowTable::set_flowtable(FlowTableWithFields* flowtable) { m_flowtable = flowtable; m_layoutgroup = sharedptr::cast_dynamic(flowtable->get_layout_item()); m_entry_title->set_text(item_get_title(m_layoutgroup)); m_spin_columns->set_value(m_layoutgroup->get_columns_count()); } Glib::ustring Dialog_FlowTable::get_title() { return m_entry_title->get_text(); } gint Dialog_FlowTable::get_columns_count() { return m_spin_columns->get_value_as_int(); } } //namespace Glom glom-1.22.4/glom/main_local_options.h0000644000175000017500000000336012234252646020754 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MAIN_LOCAL_OPTIONS_H #define GLOM_MAIN_LOCAL_OPTIONS_H #include namespace Glom { //These options can be run by the local (short-lived) instance: //However, real separation (or even real remote handling) of OptionGroups is //not possible yet: //https://bugzilla.gnome.org/show_bug.cgi?id=634990#c6 //This only works at all because we use Gio::APPLICATION_NON_UNIQUE . class LocalOptionGroup : public Glib::OptionGroup { public: LocalOptionGroup(); /** * @result If this is false then the GApplication, or main() should return EXIT_FAILURE. */ bool handle_options(); bool get_debug_date_check_result(bool& stop) const; private: //These int instances should live as long as the OptionGroup to which they are added, //and as long as the OptionContext to which those OptionGroups are added. bool m_arg_version; bool m_arg_debug_date_check; bool m_debug_date_check_result; }; } //namespace Glom #endif //GLOM_MAIN_LOCAL_OPTIONS glom-1.22.4/glom/application.h0000644000175000017500000000304712234776363017417 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_APPLICATION_H #define GLOM_APPLICATION_H #include #include namespace Glom { class Application: public Gtk::Application { protected: Application(); public: static Glib::RefPtr create(); protected: //Overrides of default signal handlers: virtual void on_activate(); virtual void on_open(const Gio::Application::type_vec_files& files, const Glib::ustring& hint); virtual int on_command_line(const Glib::RefPtr& command_line); private: void create_window(const Glib::RefPtr& file = Glib::RefPtr()); void on_window_hide(Gtk::Window* window); RemoteOptionGroup m_remote_option_group; }; } //namespace Glom #endif /* GTKMM_APPLICATION_H */ glom-1.22.4/glom/show_progress_message.h0000644000175000017500000000251612234252646021515 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_SHOW_PROGRESS_MESSAGE_H #define GLOM_SHOW_PROGRESS_MESSAGE_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include namespace Glom { class AppWindow; /** Use this class to ensure that the progress message is cleared upon exiting a * method with multiple return points. */ class ShowProgressMessage { public: explicit ShowProgressMessage(const Glib::ustring &message); ~ShowProgressMessage(); void pulse(); private: AppWindow* const m_app; Glib::ustring m_message; }; } //namespace Glom #endif // GLOM_SHOW_PROGRESS_MESSAGE_H glom-1.22.4/glom/main.cc0000644000175000017500000004366112234776363016204 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include //We use Python for calculated fields. //#include //Include it before anything else to avoid "_POSIX_C_SOURCE redefined". #include //#include #include #include #include #include #include #include #include // For postgres availability checks: #ifdef GLOM_ENABLE_POSTGRESQL #include #ifndef GLOM_ENABLE_CLIENT_ONLY #include #endif //GLOM_ENABLE_CLIENT_ONLY #endif //GLOM_ENABLE_POSTGRESQL // For sanity checks: #include #ifndef GLOM_ENABLE_CLIENT_ONLY #include #include #endif // !GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #ifdef G_OS_WIN32 #include #else #include //For cleanup. #endif namespace { #ifdef G_OS_WIN32 static BOOL pgwin32_get_dynamic_tokeninfo(HANDLE token, TOKEN_INFORMATION_CLASS class_, char **InfoBuffer, char *errbuf, int errsize) { DWORD InfoBufferSize; if(GetTokenInformation(token, class_, 0, 0, &InfoBufferSize)) { snprintf(errbuf, errsize, "could not get token information: got zero size\n"); return false; } if(GetLastError() != ERROR_INSUFFICIENT_BUFFER) { snprintf(errbuf, errsize, "could not get token information: error code %d\n", (int) GetLastError()); return false; } *InfoBuffer = static_cast(malloc(InfoBufferSize)); if(*InfoBuffer == 0) { snprintf(errbuf, errsize, "could not allocate %d bytes for token information\n", (int) InfoBufferSize); return false; } if(!GetTokenInformation(token, class_, *InfoBuffer, InfoBufferSize, &InfoBufferSize)) { snprintf(errbuf, errsize, "could not get token information: error code %d\n", (int) GetLastError()); return false; } return true; } int pgwin32_is_admin(void) { HANDLE AccessToken; char *InfoBuffer = 0; char errbuf[256]; PTOKEN_GROUPS Groups; PSID AdministratorsSid; PSID PowerUsersSid; SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY}; UINT x; BOOL success; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &AccessToken)) { throw std::runtime_error(Glib::ustring::compose("Could not open process token: error code %1", (int)GetLastError())); } if(!pgwin32_get_dynamic_tokeninfo(AccessToken, TokenGroups, &InfoBuffer, errbuf, sizeof(errbuf))) { CloseHandle(AccessToken); throw std::runtime_error(errbuf); } Groups = (PTOKEN_GROUPS) InfoBuffer; CloseHandle(AccessToken); if(!AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsSid)) { free(InfoBuffer); throw std::runtime_error(Glib::ustring::compose("could not get SID for Administrators group: error code %1", (int)GetLastError())); } if(!AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_POWER_USERS, 0, 0, 0, 0, 0, 0, &PowerUsersSid)) { free(InfoBuffer); FreeSid(AdministratorsSid); throw std::runtime_error(Glib::ustring::compose("could not get SID for PowerUsers group: error code %1", (int) GetLastError())); } success = false; for (x = 0; x < Groups->GroupCount; ++x) { if((EqualSid(AdministratorsSid, Groups->Groups[x].Sid) && (Groups->Groups[x].Attributes & SE_GROUP_ENABLED)) || (EqualSid(PowerUsersSid, Groups->Groups[x].Sid) && (Groups->Groups[x].Attributes & SE_GROUP_ENABLED))) { success = true; break; } } free(InfoBuffer); FreeSid(AdministratorsSid); FreeSid(PowerUsersSid); return success; } #endif // G_OS_WIN32 } // anonymous namespace namespace Glom { #ifdef GLOM_ENABLE_POSTGRESQL bool check_user_is_not_root_with_warning() { Glib::ustring message; #ifdef G_OS_WIN32 try { if(pgwin32_is_admin()) { message = _("You seem to be running Glom as a user with administrator privileges. Glom may not be run with such privileges for security reasons.\nPlease login to your system as a normal user."); } } catch(const std::runtime_error& ex) { message = ex.what(); } #else //std::cout << "debug: " << G_STRFUNC << ": geteuid()=" << geteuid() << ", getgid()=" << getgid() << std::endl; //This is very linux-specific. We should ifdef this out for other platforms. if(geteuid() == 0) { //Warn the user: message = _("You seem to be running Glom as root. Glom may not be run as root.\nPlease login to your system as a normal user."); } #endif if(!message.empty()) { //Make sure this is on stderr too, in case something goes wrong with the UI: std::cerr << message << std::endl; Gtk::MessageDialog dialog(Utils::bold_message(_("Running As Root")), true /* use_markup */, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true /* modal */); dialog.set_secondary_text(message); dialog.run(); return false; /* Is root. Bad. */ } return true; /* Not root. It's OK. */ } #ifndef GLOM_ENABLE_CLIENT_ONLY // Message to packagers: // If your Glom package does not depend on PostgreSQL, for some reason, // then your distro-specific patch should uncomment this #define. // and implement ConnectionPool::install_posgres(). // But please, just make your Glom package depend on PostgreSQL instead, // because this is silly. // //#define DISTRO_SPECIFIC_POSTGRES_INSTALL_IMPLEMENTED 1 /** Check whether PostgreSQL is really available for self-hosting, * in case the distro package has incorrect dependencies. * * @results True if everything is OK. */ bool check_postgres_is_available_with_warning() { const std::string binpath = Glom::ConnectionPoolBackends::PostgresSelfHosted::get_path_to_postgres_executable("postgres", false /* not quoted */); // TODO: At least on Windows we should probably also check for initdb and // pg_ctl. Perhaps it would also be a good idea to access these files as // long as glom runs so they cannot be (re)moved. if(!binpath.empty()) { const Glib::ustring uri_binpath = Glib::filename_to_uri(binpath); if(Utils::file_exists(uri_binpath)) return true; } #ifdef DISTRO_SPECIFIC_POSTGRES_INSTALL_IMPLEMENTED //Show message to the user about the broken installation: //This is a packaging bug, but it would probably annoy packagers to mention that in the dialog: Gtk::MessageDialog dialog(Utils::bold_message(_("Incomplete Glom Installation")), true /* use_markup */, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_NONE, true /* modal */); dialog.set_secondary_text(_("Your installation of Glom is not complete, because PostgreSQL is not available on your system. PostgreSQL is needed for self-hosting of Glom databases.\n\nYou may now install PostgreSQL to complete the Glom installation.")); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Install PostgreSQL"), Gtk::RESPONSE_OK); const int response = dialog.run(); if(response != Gtk::RESPONSE_OK) return false; //Failure. Glom should now quit. else return install_postgres(&dialog); #else //DISTRO_SPECIFIC_POSTGRES_INSTALL_IMPLEMENTED //Show message to the user about the broken installation: const Glib::ustring message = _("Your installation of Glom is not complete, because PostgreSQL is not available on your system. PostgreSQL is needed for self-hosting of Glom databases.\n\nPlease report this bug to your vendor, or your system administrator so it can be corrected."); //Make sure this is on stderr too, in case something goes wrong with the UI: std::cerr << message << std::endl; Gtk::MessageDialog dialog(Utils::bold_message(_("Incomplete Glom Installation")), true /* use_markup */, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true /* modal */); dialog.set_secondary_text(message); dialog.run(); return false; #endif //DISTRO_SPECIFIC_POSTGRES_INSTALL_IMPLEMENTED } #endif //GLOM_ENABLE_CLIENT_ONLY #endif //GLOM_ENABLE_POSTGRESQL bool check_pyglom_is_available_with_warning() { if(glom_python_module_is_available()) return true; /* The python module could not be imported by Glom, so warn the user: */ const Glib::ustring message = _("Your installation of Glom is not complete, because the Glom Python module is not available on your system.\n\nPlease report this bug to your vendor, or your system administrator so it can be corrected."); //Make sure this is on stderr too, in case something goes wrong with the UI: std::cerr << message << std::endl; Gtk::MessageDialog dialog(Utils::bold_message(_("Glom Python Module Not Installed")), true /* use_markup */, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true /* modal */); dialog.set_secondary_text(message); dialog.run(); return false; } bool check_gir_is_available_with_warning() { if(gir_python_module_is_available()) return true; /* The python module could not be imported by Glom, so warn the user: */ const Glib::ustring message = _("Your installation of Glom is not complete, because the gi.repository Python module is not available on your system.\n\nPlease report this bug to your vendor, or your system administrator so it can be corrected."); //Make sure this is on stderr too, in case something goes wrong with the UI: std::cerr << message << std::endl; Gtk::MessageDialog dialog(Utils::bold_message(_("gi.repository Python Module Not Installed")), true /* use_markup */, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true /* modal */); dialog.set_secondary_text(message); dialog.run(); return false; } bool check_pygda_is_available_with_warning() { if(gda_python_module_is_available()) return true; /* The python module could not be imported by Glom, so warn the user: */ const Glib::ustring message = _("Your installation of Glom is not complete, because the gi.repository.Gda python module is not available on your system.\n\nPlease report this bug to your vendor, or your system administrator so it can be corrected."); //Make sure this is on stderr too, in case something goes wrong with the UI: std::cerr << message << std::endl; Gtk::MessageDialog dialog(Utils::bold_message(_("gi.repository.Gda Python Module Not Installed")), true /* use_markup */, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true /* modal */); dialog.set_secondary_text(message); dialog.run(); return false; } } //namespace Glom #ifdef __linux__ extern "C" void __libc_freeres(void); #endif int main(int argc, char* argv[]) { #ifdef __linux__ //Force some cleanup at exit, //to help valgrind to detect memory leaks: atexit(__libc_freeres); #else # ifdef G_OS_WIN32 WSADATA data; int errcode = WSAStartup(MAKEWORD(2, 0), &data); if(errcode != 0) { std::cerr << "Failed to initialize WinSock: " << errcode << std::endl; return EXIT_FAILURE; } gchar* installation_dir_c = g_win32_get_package_installation_directory_of_module(0); const std::string installation_dir(installation_dir_c); g_free(installation_dir_c); # endif #endif // TODO: I am not sure why, but this does not work. PYTHONPATH is set // correctly according to getenv(), but python still does not look in it. // For now, the installer installs all the python stuff directly into the // application directory, although I would like to move this to a python/ // subdirectory. #if 0 #ifdef G_OS_WIN32 // Set PYTHONPATH to point to python/ because that's where the installer // installs all the python modules into. std::string python_path = Glib::build_filename(installation_dir, "python"); std::string current_path = Glib::getenv("PYTHONPATH"); if(current_path.empty()) current_path = python_path; else current_path += (std::string(";") + python_path); // PATH-like variables are separated by ; on Windows because : is a valid character in paths. std::cout << "Setting " << current_path << ":" << std::endl; std::cout << Glib::setenv("PYTHONPATH", current_path) << std::endl; std::cout << getenv("PYTHONPATH") << std::endl; #endif #endif #ifdef G_OS_WIN32 // Add glom's bin directory to PATH so that g_spawn* finds the // gspawn-win32-helper.exe helper program. The installer installs it there. Glib::setenv("PATH", Glib::getenv("PATH") + ";" + Glib::build_filename(installation_dir, "bin")); #endif #ifdef G_OS_WIN32 // Load translations relative to glom.exe on Windows bindtextdomain(GETTEXT_PACKAGE, Glib::build_filename(installation_dir, "share" G_DIR_SEPARATOR_S "locale").c_str()); #else //Make this application use the current locale for _() translation: bindtextdomain(GETTEXT_PACKAGE, GLOM_LOCALEDIR); #endif bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); // Set the locale for any streams to the user's current locale, // We should not rely on the default locale of // any streams (we should always do an explicit imbue()), // but this is maybe a good default in case we forget. try { std::locale::global(std::locale("")); } catch(const std::runtime_error& ex) { //This has been known to throw an exception at least once: //https://bugzilla.gnome.org/show_bug.cgi?id=619445 //This should tell us what the problem is: std::cerr << G_STRFUNC << ": exception from std::locale::global(std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } Glom::libglom_init(); //Also initializes python. //We use python for calculated-fields: PySys_SetArgv(argc, argv); try { //Create the app here, //so we can use UI, for instance with Gtk::MessageDialog, //even before calling run(). Glib::RefPtr application = Glom::Application::create(); //Call gtk_init() too, because earlier (< 3.9.17) versions //of gtkmm do not do this in the default Gtk::Application constructor. //TODO: Remove this when we can depend on a newer gtkmm: gtk_init(0, 0); #ifndef GLOM_ENABLE_CLIENT_ONLY Gsv::init(); Goocanvas::init(); #endif //!GLOM_ENABLE_CLIENT_ONLY ev_init(); #ifdef GLOM_ENABLE_POSTGRESQL //Check that the libgda postgres provider is really available: bool install_complete = Glom::ConnectionPoolBackends::Postgres::check_postgres_gda_client_is_available(); if(!install_complete) { /* The Postgres provider was not found, so warn the user: */ const Glib::ustring message = _("Your installation of Glom is not complete, because the PostgreSQL libgda provider is not available on your system. This provider is needed to access Postgres database servers.\n\nPlease report this bug to your vendor, or your system administrator so it can be corrected."); //Make sure this is on stderr too, in case something goes wrong with the UI: std::cerr << message << std::endl; Gtk::MessageDialog dialog(Glom::Utils::bold_message(_("Incomplete Glom Installation")), true /* use_markup */, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true /* modal */); dialog.set_secondary_text(message); dialog.run(); return EXIT_FAILURE; //There is no point in going further because Glom would not be able to connect to any Postgres servers. } #ifndef GLOM_ENABLE_CLIENT_ONLY //Check that the postgres executable is really available: if(!Glom::check_postgres_is_available_with_warning()) return EXIT_FAILURE; //There is no point in going further because the most useful Glom functionality will not work without Postgres. Only a very cut-down Glom client would be useful without self-hosting. #endif // !GLOM_ENABLE_CLIENT_ONLY // Postgres can't be started as root. initdb complains. // So just prevent this in general. It is safer anyway. if(!Glom::check_user_is_not_root_with_warning()) return EXIT_FAILURE; #endif //GLOM_ENABLE_POSTGRESQL if(!Glom::check_gir_is_available_with_warning()) return EXIT_FAILURE; if(!Glom::check_pygda_is_available_with_warning()) return EXIT_FAILURE; if(!Glom::check_pyglom_is_available_with_warning()) return EXIT_FAILURE; const int status = application->run(argc, argv); if(status != EXIT_SUCCESS) //TODO: Is this right? return status; } catch(const Glib::Exception& ex) { //If this happens then comment out the try/catch, and let the debugger show the call stack. std::cerr << "Glom: exception: \n " << ex.what() << std::endl; } catch(const std::exception& ex) { //If this happens then comment out the try/catch, and let the debugger show the call stack. std::cerr << "Glom: exception: \n " << ex.what() << std::endl; } Glom::libglom_deinit(); //Tell libxml to clean things up to make valgrind more useful: xmlCleanupParser(); //These fail, probably because of previous things that are causing leaks: //cairo_debug_reset_static_data(); //This crashes with _cairo_hash_table_destroy: Assertion `hash_table->live_entries == 0' failed. //FcFini(); //This crashes with "FcCacheFini: Assertion `fcCacheChains[i] == ((void *)0)' failed." #ifdef G_OS_WIN32 WSACleanup(); #endif return EXIT_SUCCESS; } glom-1.22.4/glom/mode_find/0000755000175000017500000000000012235000126016635 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_find/box_data_list_find.cc0000644000175000017500000000426312234252646023004 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include namespace Glom { Box_Data_List_Find::Box_Data_List_Find() : m_HBox(Gtk::ORIENTATION_HORIZONTAL, Glom::Utils::DEFAULT_SPACING_SMALL) { //m_strHint = _("Enter the search criteria and click [Find]\n Glom will then change to Data mode to display the results."); m_HBox.pack_end(m_Button_Find, Gtk::PACK_SHRINK); pack_start(m_HBox, Gtk::PACK_SHRINK); //A signal handler is connected in the Box_Data base class. m_Button_Find.set_can_default(); //Prevent the widget from trying to add or change records: m_AddDel.set_find_mode(); show_all_children(); } Box_Data_List_Find::~Box_Data_List_Find() { } void Box_Data_List_Find::create_layout() { Box_Data_List::create_layout(); } bool Box_Data_List_Find::fill_from_database() { BusyCursor busy_cursor(get_app_window()); const bool result = Base_DB_Table_Data::fill_from_database(); if(!result) return false; //Field Names: create_layout(); m_FieldsShown = get_fields_to_show(); return result; } Gtk::Widget* Box_Data_List_Find::get_default_button() //override { return &m_Button_Find; } bool Box_Data_List_Find::init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform) { FoundSet found_set; found_set.m_table_name = table_name; return Box_Data_List::init_db_details(found_set, layout_platform); } } //namespace Glom glom-1.22.4/glom/mode_find/box_data_details_find.cc0000644000175000017500000000745612234252646023465 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include // For GLOM_ENABLE_CLIENT_ONLY #include "box_data_details_find.h" #include namespace Glom { Box_Data_Details_Find::Box_Data_Details_Find() : Box_Data_Details(false) { //Instead of nav buttons: m_hbox_buttons.pack_end(m_Button_Find, Gtk::PACK_SHRINK); //A signal handler is connected in the Box_Data base class. m_Button_Find.set_can_default(); #ifndef GLOM_ENABLE_CLIENT_ONLY //Hide this because it is useless for Find mode: show_layout_toolbar(false); #endif m_FlowTable.set_find_mode(); show_all_children(); } Box_Data_Details_Find::~Box_Data_Details_Find() { } bool Box_Data_Details_Find::init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform) { FoundSet found_set; found_set.m_table_name = table_name; return Box_Data_Details::init_db_details(found_set, layout_platform, Gnome::Gda::Value()); } bool Box_Data_Details_Find::fill_from_database() { BusyCursor busy_cursor(get_app_window()); const bool result = Base_DB_Table_Data::fill_from_database(); if(!result) return result; m_FieldsShown = get_fields_to_show(); create_layout(); //TODO: Only do this when the layout has changed. #ifndef GLOM_ENABLE_CLIENT_ONLY //Hide this because it is useless for Find mode: //Actually we already hide this in the constructor, but somehow it is visible again by now. show_layout_toolbar(false); #endif return result; } //TODO: Remove this? void Box_Data_Details_Find::fill_related() { //Clear existing pages: //m_Notebook_Related.pages().clear(); //Get relationships from the document: Document::type_vec_relationships vecRelationships = get_document()->get_relationships(m_table_name); //Add the relationships: for(Document::type_vec_relationships::iterator iter = vecRelationships.begin(); iter != vecRelationships.end(); ++iter) { /* const Relationship& relationship = *iter; Box_Data_List_Related* pBox = Gtk::manage(new Box_Data_List_Related()); std::cout << "Box_Data_Details::fill_related() 2:" << relationship->get_name() << std::endl; m_Notebook_Related.pages().push_back( Gtk::Notebook_Helpers::TabElem(*pBox, relationship->get_name()) ); std::cout << "Box_Data_Details::fill_related() 2.5:" << std::endl; guint rowKey = m_FieldsShown.get_index(relationship->get_from_field()); Glib::ustring strKeyValue = m_AddDel.get_value(rowKey); strKeyValue = m_FieldsShown[rowKey].sql(strKeyValue); //Quote/Escape it if necessary. std::cout << "Box_Data_Details::fill_related() 3:" << std::endl; pBox->init_db_details(get_database_name(), relationship->get_to_table(), relationship->get_to_field(), strKeyValue); pBox->show_all(); */ } } void Box_Data_Details_Find::on_flowtable_field_edited(const sharedptr& /* id */, const Gnome::Gda::Value& /* value */) { //Don't do anything. //This just blocks the method in the base class. } Gtk::Widget* Box_Data_Details_Find::get_default_button() //override { return &m_Button_Find; } } //namespace Glom glom-1.22.4/glom/mode_find/notebook_find.cc0000644000175000017500000000426412234776363022020 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "notebook_find.h" #include #include namespace Glom { Notebook_Find::Notebook_Find() : m_iPage_Details(0), m_iPage_List(0) { append_page(m_Box_List, _("List")); m_iPage_List = 0; m_iPage_Details = 1; //Fill composite view: add_view(&m_Box_List); append_page(m_Box_Details, _("Details")); set_current_page(m_iPage_Details); //Show the details page by default. It's more obvious for a Find. //TODO: Show the same layout that is being edited at the time that the mode was changed. //Connect Signals: //Pass it up to the application: signal_connect_for_reemit_1arg(m_Box_List.signal_find_criteria, signal_find_criteria); signal_connect_for_reemit_1arg(m_Box_Details.signal_find_criteria, signal_find_criteria); add_view(&m_Box_Details); show_all_children(); } Notebook_Find::~Notebook_Find() { remove_view(&m_Box_List); remove_view(&m_Box_Details); } bool Notebook_Find::init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform) { bool result = true; result = m_Box_List.init_db_details(table_name, layout_platform); m_Box_Details.init_db_details(table_name, layout_platform); return result; } void Notebook_Find::set_current_view(Notebook_Data::dataview view) { if(view == Notebook_Data::DATA_VIEW_List) set_current_page(m_iPage_List); else set_current_page(m_iPage_Details); } } //namespace Glom glom-1.22.4/glom/mode_find/notebook_find.h0000644000175000017500000000316012234776363021654 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_NOTEBOOK_FIND_H #define GLOM_NOTEBOOK_FIND_H #include "../mode_data/notebook_data.h" #include "box_data_list_find.h" #include "box_data_details_find.h" namespace Glom { class Notebook_Find : public Notebook_Glom { public: Notebook_Find(); virtual ~Notebook_Find(); bool init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform); void set_current_view(Notebook_Data::dataview view); /** Emitted when the user has entered a find critera that * should be used to find and display records. * @param find_criteria The SQL where clause. */ sigc::signal signal_find_criteria; private: //Member widgets: Box_Data_List_Find m_Box_List; Box_Data_Details_Find m_Box_Details; guint m_iPage_Details, m_iPage_List; }; } //namespace Glom #endif // GLOM_NOTEBOOK_FIND_H glom-1.22.4/glom/mode_find/box_data_list_find.h0000644000175000017500000000254212234252646022644 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BOX_DATA_LIST_FIND_H #define GLOM_BOX_DATA_LIST_FIND_H #include "../mode_data/box_data_list.h" namespace Glom { class Box_Data_List_Find : public Box_Data_List { public: Box_Data_List_Find(); virtual ~Box_Data_List_Find(); virtual bool init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform); virtual Gtk::Widget* get_default_button(); //override private: virtual bool fill_from_database(); //override. virtual void create_layout(); //Member widgets: Gtk::Box m_HBox; }; } //namespace Glom #endif // GLOM_BOX_DATA_LIST_FIND_H glom-1.22.4/glom/mode_find/box_data_details_find.h0000644000175000017500000000271612234252646023321 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BOX_DATA_DETAILS_FIND_H #define GLOM_BOX_DATA_DETAILS_FIND_H #include "../mode_data/box_data_details.h" namespace Glom { class Box_Data_Details_Find : public Box_Data_Details { public: Box_Data_Details_Find(); virtual ~Box_Data_Details_Find(); bool init_db_details(const Glib::ustring& table_name, const Glib::ustring& layout_platform); virtual Gtk::Widget* get_default_button(); //override private: virtual bool fill_from_database(); //override. virtual void fill_related(); //override. virtual void on_flowtable_field_edited(const sharedptr& id, const Gnome::Gda::Value& value); }; } //namespace Glom #endif // GLOM_BOX_DATA_DETAILS_FIND_H glom-1.22.4/glom/main_remote_options.h0000644000175000017500000000310112234252646021146 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MAIN_REMOTE_OPTIONS_H #define GLOM_MAIN_REMOTE_OPTIONS_H #include namespace Glom { //These options can be run by the remote (main) instance: //However, real separation (or even real remote handling) of OptionGroups is //not possible yet: //https://bugzilla.gnome.org/show_bug.cgi?id=634990#c6 //This only works at all because we use Gio::APPLICATION_NON_UNIQUE . class RemoteOptionGroup : public Glib::OptionGroup { public: RemoteOptionGroup(); //These int instances should live as long as the OptionGroup to which they are added, //and as long as the OptionContext to which those OptionGroups are added. std::string m_arg_filename; bool m_arg_restore; bool m_arg_stop_auto_server_shutdown; bool m_arg_debug_sql; }; } //namespace Glom #endif //GLOM_MAIN_REMOTE_OPTIONS glom-1.22.4/glom/dialog_connection.cc0000644000175000017500000001523712234252645020724 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" //For GLOM_ENABLE_POSTGRESQL #include "dialog_connection.h" #include #include #ifdef GLOM_ENABLE_POSTGRESQL #include #include #endif //#ifdef GLOM_ENABLE_POSTGRESQL #include namespace Glom { const char Dialog_Connection::glade_id[] = "dialog_connection"; const bool Dialog_Connection::glade_developer(false); Dialog_Connection::Dialog_Connection(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), Base_DB(), m_entry_host(0), m_entry_user(0), m_entry_password(0), m_label_database(0), m_label_note(0) { builder->get_widget("entry_host", m_entry_host); builder->get_widget("entry_user", m_entry_user); builder->get_widget("entry_password", m_entry_password); builder->get_widget("label_database", m_label_database); builder->get_widget("connection_note", m_label_note); } Dialog_Connection::~Dialog_Connection() { } sharedptr Dialog_Connection::connect_to_server_with_connection_settings() const { //std::cout << "debug: Dialog_Connection::connect_to_server_with_connection_settings()" << std::endl; //TODO: BusyCursor busy_cursor(get_app_window()); sharedptr result(0); ConnectionPool* connection_pool = ConnectionPool::get_instance(); g_assert(connection_pool); //Set the connection details in the ConnectionPool singleton. //The ConnectionPool will now use these every time it tries to connect. const Document* document = get_document(); if(!document) return result; //std::cout << "debug: " << G_STRFUNC << ": m_database_name=" << m_database_name << std::endl; connection_pool->set_database(m_database_name); #ifdef GLOM_ENABLE_POSTGRESQL if(document->get_hosting_mode() == Document::HOSTING_MODE_POSTGRES_CENTRAL) { ConnectionPool::Backend* backend = connection_pool->get_backend(); ConnectionPoolBackends::PostgresCentralHosted* central = dynamic_cast(backend); g_assert(central); central->set_host(m_entry_host->get_text()); } #endif //GLOM_ENABLE_POSTGRESQL connection_pool->set_user(m_entry_user->get_text()); connection_pool->set_password(m_entry_password->get_text()); result = Base_DB::connect_to_server(const_cast(this)); #ifdef GLOM_ENABLE_POSTGRESQL //Remember the port, //to make opening faster next time, //and so we can tell connecting clients (using browse network) what port to use: Document* unconst = const_cast(document); if(document->get_hosting_mode() == Document::HOSTING_MODE_POSTGRES_CENTRAL) { ConnectionPool::Backend* backend = connection_pool->get_backend(); ConnectionPoolBackends::PostgresCentralHosted* central = dynamic_cast(backend); g_assert(central); unconst->set_connection_port(central->get_port() ); // As we know the port of the database already, we don't need to try // other ports anymore: unconst->set_connection_try_other_ports(false); } #ifndef GLOM_ENABLE_CLIENT_ONLY else if(document->get_hosting_mode() == Document::HOSTING_MODE_POSTGRES_SELF) { ConnectionPool::Backend* backend = connection_pool->get_backend(); ConnectionPoolBackends::PostgresSelfHosted* self = dynamic_cast(backend); g_assert(self); unconst->set_connection_port(self->get_port() ); unconst->set_connection_try_other_ports(false); } #endif //GLOM_ENABLE_CLIENT_ONLY #endif //GLOM_ENABLE_POSTGRESQL return result; } void Dialog_Connection::load_from_document() { Document* document = get_document(); if(document) { #ifndef GLOM_ENABLE_CLIENT_ONLY #ifdef GLOM_ENABLE_POSTGRESQL //Load server and user: if(document->get_hosting_mode() != Document::HOSTING_MODE_POSTGRES_CENTRAL) { m_entry_host->set_text("(self hosted)"); m_entry_host->set_sensitive(false); } else #endif // LOM_ENABLE_POSTGRESQL #endif // !GLOM_ENABLE_CLIENT_ONLY { Glib::ustring host = document->get_connection_server(); if(host.empty()) host = "localhost"; m_entry_host->set_text(host); m_entry_host->set_sensitive(true); } Glib::ustring user = document->get_connection_user(); //TODO: Offer a drop-down list of users. if(user.empty()) { //Default to the UNIX user name, which is often the same as the Postgres user name: const char* pchUser = getenv("USER"); if(pchUser) user = pchUser; } m_entry_user->set_text(user); //Show the database to be opened, or created. //TODO: In future, we can hide this completely. set_database_name(document->get_connection_database()); } else std::cerr << G_STRFUNC << ": no document" << std::endl; } ///Disable irrelevant fields: void Dialog_Connection::set_connect_to_browsed() { m_entry_host->set_sensitive(false); } void Dialog_Connection::set_self_hosted_user_and_password(const Glib::ustring& user, const Glib::ustring& password) { set_username(user); set_password(password); } void Dialog_Connection::set_username(const Glib::ustring& user) { m_entry_user->set_text(user); } void Dialog_Connection::set_password(const Glib::ustring& password) { m_entry_password->set_text(password); } void Dialog_Connection::set_database_name(const Glib::ustring& name) { m_database_name = name; if(m_database_name.empty()) m_label_database->set_text(_("Not yet created.")); else m_label_database->set_text(name); } void Dialog_Connection::get_username_and_password(Glib::ustring& username, Glib::ustring& password) const { username = m_entry_user->get_text(); password = m_entry_password->get_text(); } void Dialog_Connection::set_confirm_existing_user_note() { m_label_note->set_text(Glib::ustring()); } } //namespace Glom glom-1.22.4/glom/variablesmap.cc0000644000175000017500000001302012234252646017701 0ustar00murraycmurrayc00000000000000/* variablesmap.cc * * Copyright (C) 2002 The libglademm Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include namespace Glom { VariablesMap::VariablesMap(const Glib::RefPtr& builder) : m_builder(builder) { } VariablesMap::~VariablesMap() { } void VariablesMap::connect_widget(const Glib::ustring& widget_name, bool& variable) { Gtk::ToggleButton* pToggleButton = 0; m_builder->get_widget(widget_name, pToggleButton); //Glade::Xml will complain if it is not a ToggleButton. if(pToggleButton) { m_mapWidgetsToVariables[pToggleButton] = (void*)(&variable); } } void VariablesMap::connect_widget(const Glib::ustring& widget_name, Glib::ustring& variable) { Gtk::Widget* pWidget = 0; m_builder->get_widget(widget_name, pWidget); Gtk::Entry* pEntry = dynamic_cast(pWidget); //it mange both Gtk::entry and Gtk::SpinButton Gtk::ComboBox* pComboBox = dynamic_cast(pWidget); if(pEntry) { m_mapWidgetsToVariables[pEntry] = (void*)(&variable); } if(pComboBox) { m_mapWidgetsToVariables[pComboBox] = (void*)(&variable); } } void VariablesMap::connect_widget(const Glib::ustring& widget_name, double& variable) { Gtk::Widget* pWidget = 0; m_builder->get_widget(widget_name, pWidget); Gtk::Scale* pScale = dynamic_cast(pWidget); if(pScale) { m_mapWidgetsToVariables[pScale] = (void*)(&variable); } } void VariablesMap::connect_widget(const Glib::ustring& widget_name, Glib::Date& variable) { Gtk::Widget* pWidget = 0; m_builder->get_widget(widget_name, pWidget); Gtk::Calendar* pCalendar = dynamic_cast(pWidget); if(pCalendar) { m_mapWidgetsToVariables[pCalendar] = (void*)(&variable); } } void VariablesMap::transfer_widgets_to_variables() { if(validate_widgets()) //If the widgets' data is correct. Useful to override. { for(type_mapWidgetsToVariables::iterator iter = m_mapWidgetsToVariables.begin(); iter != m_mapWidgetsToVariables.end(); ++iter) { transfer_one_widget(iter->first, true); //true = to_variable. } } } void VariablesMap::transfer_variables_to_widgets() { for(type_mapWidgetsToVariables::iterator iter = m_mapWidgetsToVariables.begin(); iter != m_mapWidgetsToVariables.end(); ++iter) { transfer_one_widget(iter->first, false); //false = to_widget. } } void VariablesMap::transfer_one_widget(Gtk::Widget* pWidget, bool to_variable) { //Find the widget in the map: type_mapWidgetsToVariables::iterator iterFind = m_mapWidgetsToVariables.find(pWidget); if(iterFind != m_mapWidgetsToVariables.end()) { //Get the variable for the widget: void* pVariable = iterFind->second; if(pVariable) { //Cast the variable appropriately and set it appropriately: Gtk::Entry* pEntry = dynamic_cast(pWidget); Gtk::ComboBox* pComboBox = dynamic_cast(pWidget); Gtk::ToggleButton* pToggleButton = dynamic_cast(pWidget); //CheckButtons and RadioButtons. Gtk::Scale* pScale = dynamic_cast(pWidget); Gtk::Calendar* pCalendar = dynamic_cast(pWidget); if(pEntry) { Glib::ustring* pVar = (Glib::ustring*)(pVariable); if(to_variable) (*pVar) = pEntry->get_text(); else pEntry->set_text(*pVar); } if(pComboBox) { Glib::ustring* pVar = (Glib::ustring*)(pVariable); Gtk::Entry* pIEntry = dynamic_cast(pComboBox->get_child()); if(to_variable) { if(pIEntry) (*pVar) = pIEntry->get_text(); } else { if(pIEntry) pIEntry->set_text(*pVar); } } if(pToggleButton) { bool* pVar = (bool*)(pVariable); if(to_variable) (*pVar) = pToggleButton->get_active(); else pToggleButton->set_active(*pVar); } if(pScale) { double* pVar = (double*)(pVariable); if(to_variable) (*pVar) = pScale->get_value(); else pScale->set_value(*pVar); } if(pCalendar) { Glib::Date* pVar = (Glib::Date*)(pVariable); if(to_variable) { guint year,month,day; pCalendar->get_date(year,month,day); (*pVar) = Glib::Date(day,(Glib::Date::Month)month,year); } else { pCalendar->select_day(pVar->get_day()); pCalendar->select_month(pVar->get_month(), pVar->get_year()); } } } } } bool VariablesMap::validate_widgets() { //Override to add validation. //TODO: We could add some automatic data-range and text-length validation. return true; } } // namespace Glom glom-1.22.4/glom/bakery/0000755000175000017500000000000012235000126016166 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/bakery/dialog_offersave.h0000644000175000017500000000225312234252645021656 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef DIALOG_OFFERSAVE_H #define DIALOG_OFFERSAVE_H #include "config.h" #include namespace GlomBakery { class Dialog_OfferSave : public Gtk::MessageDialog { public: Dialog_OfferSave(const Glib::ustring& file_uri); virtual ~Dialog_OfferSave(); ///Return values: enum enumButtons { BUTTON_Save, BUTTON_Discard, BUTTON_Cancel }; }; } //namespace #endif //DIALOG_OFFERSAVE_H glom-1.22.4/glom/bakery/busy_cursor.h0000644000175000017500000000351712234252645020742 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_BAKERY_UTILITIES_BUSYCURSOR_H #define GLOM_BAKERY_UTILITIES_BUSYCURSOR_H #include #include #include namespace Glom { /** Changes the cursor for as long as this instance lives. * For instance, put it at the start of code in a { and } block. */ class BusyCursor { public: /** Associate a busy cursor with the window, for the lifetime of this object. */ explicit BusyCursor(Gtk::Window& window, Gdk::CursorType cursor_type = Gdk::WATCH); /** Associate a busy cursor with the window, for the lifetime of this object, if window is not 0. */ explicit BusyCursor(Gtk::Window* window, Gdk::CursorType cursor_type = Gdk::WATCH); virtual ~BusyCursor(); private: void init(); void force_gui_update(); Glib::RefPtr m_Cursor; Gtk::Window* m_pWindow; Glib::RefPtr m_refWindow; typedef std::map > type_map_cursors; static type_map_cursors m_map_cursors; Glib::RefPtr m_old_cursor; }; } //namespace Glom #endif //BAKERY_UTILITIES_BUSYCURSOR_H glom-1.22.4/glom/bakery/appwindow_withdoc.cc0000644000175000017500000003072212234776363022260 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include #include namespace GlomBakery { AppWindow_WithDoc::type_list_strings AppWindow_WithDoc::m_mime_types; AppWindow_WithDoc::AppWindow_WithDoc(const Glib::ustring& appname) : AppWindow(appname), m_pDocument(0), m_bCloseAfterSave(false) { } AppWindow_WithDoc::~AppWindow_WithDoc() { //Delete the document: delete m_pDocument; //This will cause Document::signal_forget to be emitted, so the Views will then null their pointers as well. A smartpointer might be a better way to do this. m_pDocument = 0; } //static void AppWindow_WithDoc::add_mime_type(const Glib::ustring& mime_type) { if( std::find(m_mime_types.begin(), m_mime_types.end(), mime_type) == m_mime_types.end() ) m_mime_types.push_back(mime_type); } void AppWindow_WithDoc::on_menu_file_close() { if(m_pDocument->get_modified()) { //Offer to save changes: m_bCloseAfterSave = true; //Checked in FileChooser signal handler. offer_to_save_changes(); //If a File|Exit is in progress, this could cancel it. } on_document_close(); if(!get_operation_cancelled()) { //Note that this can result in this appwindow being deleted, //so we do it last. ui_hide(); } } bool AppWindow_WithDoc::open_document_from_data(const guchar* data, std::size_t length) { int failure_code = 0; const bool bTest = m_pDocument->load_from_data(data, length, failure_code); bool bOpenFailed = false; if(!bTest) //if open failed. bOpenFailed = true; else { //if open succeeded then let the App respond: const bool test = on_document_load(); if(!test) bOpenFailed = true; //The application didn't like something about the just-loaded document. else { update_window_title(); set_document_modified(false); //disables menu and toolbar Save items. return true; //success. } } if(bOpenFailed) { ui_warning_load_failed(failure_code); return false; //failed. } else return true; } bool AppWindow_WithDoc::open_document(const Glib::ustring& file_uri) { { //Open it: //Load it into a new instance unless the current document is just a default new. if(!(get_document()->get_is_new())) //if it's not new. { //New instance: new_instance(file_uri); return true; } AppWindow_WithDoc* pApp = this; //Replace the default new document in this instance. //Open it. pApp->m_pDocument->set_file_uri(file_uri); int failure_code = 0; const bool bTest = pApp->m_pDocument->load(failure_code); bool bOpenFailed = false; bool bShowError = false; if(!bTest) //if open failed. { bOpenFailed = true; bShowError = true; } else { //if open succeeded then let the App respond: const bool test = pApp->on_document_load(); if(!test) bOpenFailed = true; //The application didn't like something about the just-loaded document. else { pApp->update_window_title(); set_document_modified(false); //disables menu and toolbar Save items. //Update document history list: //(Getting the file URI again, in case it has changed while being opened, //for instance if it was a template file that was saved as a real file.) if(pApp->m_pDocument) document_history_add(file_uri); return true; //success. } } if(bOpenFailed) { if (bShowError) ui_warning_load_failed(failure_code); //Make sure that non-existant files are removed from the history list: if(failure_code == Document::LOAD_FAILURE_CODE_NOT_FOUND) document_history_remove(file_uri); //re-initialize document. delete pApp->m_pDocument; pApp->m_pDocument = 0; pApp->init_create_document(); return false; //failed. } } //if already open. return false; //failed. } void AppWindow_WithDoc::on_menu_file_open() { //Display File Open dialog and respond to choice: //Bring document window to front, to make it clear which document is being changed: ui_bring_to_front(); //Ask user to choose file to open: Glib::ustring file_uri = ui_file_select_open(); if(!file_uri.empty()) open_document(file_uri); } //This is for calling directly, use the other override for the signal handler: void AppWindow_WithDoc::offer_saveas() { on_menu_file_saveas(); } bool AppWindow_WithDoc::file_exists(const Glib::ustring& uri) { if(uri.empty()) return false; //Check whether file exists already: { // Try to examine the input file. Glib::RefPtr file = Gio::File::create_for_uri(uri); try { return file->query_exists(); } catch(const Gio::Error& /* ex */) { return false; //Something went wrong. It does not exist. } } } void AppWindow_WithDoc::on_menu_file_saveas() { //Display File Save dialog and respond to choice: //Bring document window to front, to make it clear which document is being saved: //This doesn't work: TODO. ui_bring_to_front(); //Show the save dialog: const Glib::ustring& file_uriOld = m_pDocument->get_file_uri(); Glib::ustring file_uri = ui_file_select_save(file_uriOld); //Also asks for overwrite confirmation. if(!file_uri.empty()) { //Enforce the file extension: file_uri = m_pDocument->get_file_uri_with_extension(file_uri); bool bUseThisFileUri = true; //Save to this filepath: if(bUseThisFileUri) { m_pDocument->set_file_uri(file_uri, true); //true = enforce file extension const bool bTest = m_pDocument->save(); if(!bTest) { ui_warning(_("Save failed."), _("There was an error while saving the file. Your changes have not been saved.")); } else { //Disable Save and SaveAs menu items: after_successful_save(); } update_window_title(); //Close if this save was a result of a File|Close or File|Exit:. //if(bTest && m_bCloseAfterSave) //Don't close if the save failed. //{ // on_menu_file_close(); //This could be the second time, but now there are no unsaved changes. //} } else { //Let the user choose a different file path, //because he decided not to overwrite the 1st one. offer_saveas(); //recursive. } } else { cancel_close_or_exit(); } } void AppWindow_WithDoc::on_menu_file_save() { if(m_pDocument) { //If there is already a filepath, then save to that location: if(!(m_pDocument->get_file_uri().empty())) { bool bTest = m_pDocument->save(); if(bTest) { //Disable Save and SaveAs menu items: after_successful_save(); //Close the document if this save was in response to a 'Do you want to save before closing?': //if(m_bCloseAfterSave) // || m_bExiting // close_mark_or_destroy(); } else { //The save failed. Tell the user and don't do anything else: ui_warning(_("Save failed."), _("There was an error while saving the file. Your changes have not been saved.")); cancel_close_or_exit(); } } else { //If there is no filepath, then ask for one and save to that location: offer_saveas(); } } if(!m_bCloseAfterSave) //Don't try to do anything after closing - this instance would not exist anymore. { update_window_title(); } } void AppWindow_WithDoc::init() { init_create_document(); //Call base method: AppWindow::init(); on_document_load(); //Show default empty document in the View. set_document_modified(false); //Disable Save menu item. } void AppWindow_WithDoc::init_create_document() { //Overrides should call this base method at the end. if(!m_pDocument) { m_pDocument = new Document(); } m_pDocument->set_is_new(true); //Can't be modified if it's just been created. m_pDocument->signal_modified().connect(sigc::mem_fun(*this, &AppWindow_WithDoc::on_document_modified)); update_window_title(); } Document* AppWindow_WithDoc::get_document() { return m_pDocument; } const Document* AppWindow_WithDoc::get_document() const { return m_pDocument; } void AppWindow_WithDoc::offer_to_save_changes() { if(m_pDocument) { if(m_pDocument->get_modified()) { set_operation_cancelled(false); //Initialize it again. It might be set later in this method by cancel_close_or_exit(). //The document has unsaved changes, //so ask the user whether the document should be saved: enumSaveChanges buttonClicked = ui_offer_to_save_changes(); //Respond to button that was clicked: switch(buttonClicked) { case(SAVECHANGES_Save): { on_menu_file_save(); //If File|Exit is in progress, this could cancel it. break; } case(SAVECHANGES_Discard): { //Close if this save offer was a result of a FileClose (It probably always is): //close_mark_or_destroy(); //Do nothing - the caller will probably hide() the window to have it deleted. break; } case(SAVECHANGES_Cancel): //Cancel. { cancel_close_or_exit(); break; } default: { break; } } } } } void AppWindow_WithDoc::cancel_close_or_exit() { set_operation_cancelled(); m_bCloseAfterSave = false; //exit_destroy_marked_instances(); //Clean up after an exit. } bool AppWindow_WithDoc::on_document_load() { //Show document contents: if(m_pDocument) { GlomBakery::ViewBase* pView = m_pDocument->get_view(); if(pView) pView->load_from_document(); //Set document as unmodified (this could have been wrongly set during the load): set_document_modified(false); return true; } else return false; //I can't think of any reason why this would happen. //If you are not using Views, then override this to fill your various windows with stuff according to the contents of the document. } void AppWindow_WithDoc::on_document_close() { } void AppWindow_WithDoc::update_window_title() { } void AppWindow_WithDoc::on_document_modified(bool /* modified */) { //Change the displayed 'modified' status. //This method could be overridden to e.g. enable a Save icon or enable the Save menu item. //TODO: enable/disable the Save menu item. ui_show_modification_status(); //Change title bar: update_window_title(); } void AppWindow_WithDoc::set_document_modified(bool bModified /* = true */) { m_pDocument->set_modified(bModified); //Enable/Disable Save menu item and toolbar item: ui_show_modification_status(); } void AppWindow_WithDoc::on_menu_edit_copy() { GlomBakery::ViewBase* pView = m_pDocument->get_view(); if(pView) pView->clipboard_copy(); } void AppWindow_WithDoc::on_menu_edit_paste() { GlomBakery::ViewBase* pView = m_pDocument->get_view(); if(pView) pView->clipboard_paste(); } void AppWindow_WithDoc::on_menu_edit_clear() { GlomBakery::ViewBase* pView = m_pDocument->get_view(); if(pView) pView->clipboard_clear(); } void AppWindow_WithDoc::after_successful_save() { set_document_modified(false); //enables/disables menu and toolbar widgets. //Update document history list: document_history_add(m_pDocument->get_file_uri()); } Glib::ustring AppWindow_WithDoc::get_conf_fullkey(const Glib::ustring& key) { return "/apps/" + m_strAppName + '/' + key; } void AppWindow_WithDoc::document_history_add(const Glib::ustring& /* file_uri */) { //Override this. } void AppWindow_WithDoc::document_history_remove(const Glib::ustring& /* file_uri */) { //Override this. } void AppWindow_WithDoc::ui_warning_load_failed(int) { ui_warning(_("Open Failed."), _("The document could not be opened.")); } } //namespace glom-1.22.4/glom/bakery/busy_cursor.cc0000644000175000017500000000350512234252645021075 0ustar00murraycmurrayc00000000000000#include #include #include namespace Glom { //Intialize static member variable: BusyCursor::type_map_cursors BusyCursor::m_map_cursors; BusyCursor::BusyCursor(Gtk::Window& window, Gdk::CursorType cursor_type) : m_Cursor( Gdk::Cursor::create(cursor_type) ), m_pWindow(&window) //If this is a nested cursor then remember the previously-set cursor, so we can restore it. { init(); } BusyCursor::BusyCursor(Gtk::Window* window, Gdk::CursorType cursor_type) : m_Cursor( Gdk::Cursor::create(cursor_type) ), m_pWindow(window) //If this is a nested cursor then remember the previously-set cursor, so we can restore it. { if(m_pWindow) init(); } void BusyCursor::init() { if(!m_pWindow) return; m_refWindow = m_pWindow->get_window(); if(!m_refWindow) return; type_map_cursors::iterator iter = m_map_cursors.find(m_pWindow); if(iter != m_map_cursors.end()) { m_old_cursor = iter->second; //Remember the existing cursor. } m_map_cursors[m_pWindow] = m_Cursor; //Let a further nested cursor know about the new cursor in use. //Change the cursor: if(m_refWindow) m_refWindow->set_cursor(m_Cursor); force_gui_update(); } BusyCursor::~BusyCursor() { //Restore the old cursor: if(m_old_cursor) { if(m_refWindow) m_refWindow->set_cursor(m_old_cursor); } else { if(m_refWindow) m_refWindow->set_cursor(); type_map_cursors::iterator iter = m_map_cursors.find(m_pWindow); if(iter != m_map_cursors.end()) m_map_cursors.erase(iter); } force_gui_update(); } void BusyCursor::force_gui_update() { if(m_refWindow) { //Force the GUI to update: //TODO: Make sure that gtkmm has some non-Gtk::Main API for this: while(gtk_events_pending()) gtk_main_iteration_do(true); } } } //namespace Glom glom-1.22.4/glom/bakery/appwindow.h0000644000175000017500000000767212234776363020411 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_BAKERY_APP_H #define GLOM_BAKERY_APP_H #include #include namespace GlomBakery { /** Bakery's Main Window. * This is an abstract class. You must use a class such as AppWindow_Gtk, which implements * the ui_* methods for a particular GUI toolkit. * * Features: * - Override methods to add/change menus/toolbars/statusbar. * - Default is basic File, Edit, Help menus and toolbar icons. * * * TODO: * - Command-line args - wrap popt? * - Session Management - need Command-line args. * */ class AppWindow : virtual public Glib::ObjectBase { public: //The constructor has a default argument so that there is a default constructor, //so that derived classes do not need to call a specific constructor. This is //a virtual base class so they would otherwise need to do that. ///Don't forget to call init() too. AppWindow(const Glib::ustring& appname = Glib::ustring()); virtual ~AppWindow(); virtual void init(); //Sets it up and shows it. virtual Glib::ustring get_version() const; static void set_command_line_args(int argc, char** &argv); //Needed for session management. typedef sigc::signal type_signal_hide; type_signal_hide ui_signal_hide(); protected: static void init_app_name(const Glib::ustring& appname); /** Builds the intial ui string, with placeholders. * This allows us to merge in actual menus and toolbars in the other init_*() methods. */ virtual void init_ui_manager(); /** Override this to add more menus or different menus. */ virtual void init_menus(); /** Call this from init_menus() to add the standard file menu */ virtual void init_menus_file() = 0; /** Call this from init_menus() to add the standard edit menu */ virtual void init_menus_edit() = 0; virtual void init_toolbars(); virtual void new_instance(const Glib::ustring& uri = Glib::ustring()) = 0; //Must override in order to new() the derived document class. // virtual void close_window() = 0; // virtual void bring_to_front() = 0; //Signal handlers: public: // We can not take function pointers of these methods in a // derived class, if they are protected - for instance, with sigc::mem_fun() //Menus: virtual void on_menu_file_new(); virtual void on_menu_file_close(); //Edit menu handlers overriden in AppWindow_WithDoc: virtual void on_menu_edit_cut(); virtual void on_menu_edit_copy(); virtual void on_menu_edit_paste(); virtual void on_menu_edit_clear(); virtual void on_menu_help_about() = 0; protected: //GUI abstractions: virtual void ui_hide() = 0; virtual void ui_bring_to_front() = 0; //operation_cancelled: //e.g. A File|Open tries to save existing data, //but this needs to be cancelled if the save failed. static void set_operation_cancelled(bool bVal = true); static bool get_operation_cancelled(); //Member data: //'About Box'/WM Class information: static Glib::ustring m_strAppName; static Glib::ustring m_strVersion; //Instances static bool m_bOperationCancelled; //see set/get_operation_cancelled(). //Command line args: static Glib::ustring m_strCommandLine_0; type_signal_hide m_signal_hide; }; } //namespace #endif //BAKERY_APP_H glom-1.22.4/glom/bakery/appwindow_withdoc.h0000644000175000017500000001417012234252645022111 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_BAKERY_APP_WITHDOC_H #define GLOM_BAKERY_APP_WITHDOC_H #include #include namespace GlomBakery { /** Main Window which supports documents. * * This is an abstract class. You must use a class such as AppWindow_WithDoc_Gtk, which implements * the ui_* methods for a particular GUI toolkit. * Features: * - 1 document per application instance. Uses Document-derived class polymorphically. * - Override init_create_document() to create new blank document. * - Appropriate Default handling of document open, save, save as. * - Appropriate checking of document 'modified' status - asks user about unsaved changes. * - Asks user about overwriting existing documents. * - Override methods to add/change menus/toolbars/statusbar. * - Default is basic File, Edit, Help menus and toolbar icons. * - Shows document name (or 'untitled') in window title. * - Shows * in title bar for unsaved docs. Overridable to e.g. shade a Save icon. * - Enforces a file extension. * - Recent Documents menu item - if you use add_mime_type(). * * * TODO: * - Printing -? * - Print Setup * - Print Preview * - Multiple document-types: * - File/New sub menu * - Some way to associate a view with a document type: class factory. */ class AppWindow_WithDoc : public AppWindow { public: ///Don't forget to call init() too. AppWindow_WithDoc(const Glib::ustring& appname = ""); //TODO: appname when using get_derived_widget() virtual ~AppWindow_WithDoc(); virtual void init(); //overridden to create document. enum enumSaveChanges { SAVECHANGES_Save, SAVECHANGES_Cancel, SAVECHANGES_Discard }; static bool file_exists(const Glib::ustring& uri); protected: virtual void init_create_document(); //override this to new() the specific document type. /** Add a MIME-type that this application can support. * You should also register the MIME-type when the application is installed: * See http://freedesktop.org/Standards/AddingMIMETutor */ static void add_mime_type(const Glib::ustring& mime_type); ///static_cast<> or dynamic_cast<> this pointer to the correct type. virtual Document* get_document(); ///static_cast<> or dynamic_cast<> this pointer to the correct type. virtual const Document* get_document() const ; virtual void set_document_modified(bool bModified = true); /** Open the document from a file at a URI. * This will check whether the document is already open. * @result true indicates success. */ virtual bool open_document(const Glib::ustring& file_uri); //This cannot be virtual, because that would break our ABI. //Hopefully that is not necessary. /** Open the document using the supplied document contents. * Unlike open_document(), this has no way to know whether the document is already open. * @param data A pointer to the bytes of the document contents. * @param length The number of bytes in the data. * @result true indicates success. */ bool open_document_from_data(const guchar* data, std::size_t length); virtual void document_history_add(const Glib::ustring& file_uri); virtual void document_history_remove(const Glib::ustring& file_uri); public: // We can not take function pointers of these methods in // a derived class if they are protected - for instance, with sigc::mem_fun() //Signal handlers: //Menu items: virtual void on_menu_file_open(); virtual void on_menu_file_saveas(); //signal handler. virtual void offer_saveas(); //For direct use. virtual void on_menu_file_save(); //signal handler. virtual void on_menu_file_close(); virtual void on_menu_edit_copy(); virtual void on_menu_edit_paste(); virtual void on_menu_edit_clear(); protected: //Document: ///Update visual status. virtual void on_document_modified(bool modified); ///override this to show document contents. virtual bool on_document_load(); ///override this to do extra cleanup. virtual void on_document_close(); virtual void offer_to_save_changes(); ///Stop the File|Close or the File|Exit. virtual void cancel_close_or_exit(); virtual void update_window_title(); virtual void after_successful_save(); //e.g. disable File|Save. virtual void ui_warning(const Glib::ustring& text, const Glib::ustring& secondary_text) = 0; /** Warn the user about a failure while loading a document. * Override this to show a specific message in response to your application's * custom @a failure_code. */ virtual void ui_warning_load_failed(int failure_code = 0); virtual Glib::ustring ui_file_select_open(const Glib::ustring& ui_file_select_open = Glib::ustring()) = 0; /** Present a user interface that allows the user to select a location to save the file. * @param old_file_uri The existing URI of the file, if any. * @result The URI of the file chosen by the user. */ virtual Glib::ustring ui_file_select_save(const Glib::ustring& old_file_uri) = 0; virtual void ui_show_modification_status() = 0; virtual enumSaveChanges ui_offer_to_save_changes() = 0; static Glib::ustring get_conf_fullkey(const Glib::ustring& key); //Document: Document* m_pDocument; //An instance of a derived type. bool m_bCloseAfterSave; //Mime types which this application can load and save: typedef std::list type_list_strings; static type_list_strings m_mime_types; }; } //namespace #endif //BAKERY_APP_WITHDOC_H glom-1.22.4/glom/bakery/appwindow_withdoc_gtk.cc0000644000175000017500000005034312234776363023126 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include //#include //For escape_path_string() //#include //For type_is_known(). #include #include #include #include #include #include #include #include #include #include #include "config.h" #include namespace GlomBakery { //Initialize static member data: AppWindow_WithDoc_Gtk::AppWindow_WithDoc_Gtk(const Glib::ustring& appname) : AppWindow_WithDoc(appname), m_pVBox(0), m_VBox_PlaceHolder(Gtk::ORIENTATION_VERTICAL) { init_app_name(appname); } /// This constructor can be used with Gtk::Builder::get_derived_widget(). AppWindow_WithDoc_Gtk::AppWindow_WithDoc_Gtk(BaseObjectType* cobject, const Glib::ustring& appname) : AppWindow_WithDoc(appname), ParentWindow(cobject), m_pVBox(0), m_VBox_PlaceHolder(Gtk::ORIENTATION_VERTICAL) { init_app_name(appname); } AppWindow_WithDoc_Gtk::~AppWindow_WithDoc_Gtk() { delete m_pVBox; m_pVBox = 0; } void AppWindow_WithDoc_Gtk::on_hide() { ui_signal_hide().emit(); } void AppWindow_WithDoc_Gtk::ui_hide() { hide(); } void AppWindow_WithDoc_Gtk::ui_bring_to_front() { get_window()->raise(); } void AppWindow_WithDoc_Gtk::init_layout() { set_resizable(); //resizable set_default_size(640, 400); //A sensible default. //This might have been instantiated by Gtk::Builder::get_widget() instead. //If not, then we create a default one and add it to the window. if(!m_pVBox) { m_pVBox = new Gtk::VBox(Gtk::ORIENTATION_VERTICAL); Gtk::Window::add(*m_pVBox); } //Add menu bar at the top: //These were defined in init_uimanager(). Gtk::MenuBar* pMenuBar = static_cast(m_refUIManager->get_widget("/Bakery_MainMenu")); m_pVBox->pack_start(*pMenuBar, Gtk::PACK_SHRINK); add_accel_group(m_refUIManager->get_accel_group()); //Add placeholder, to be used by add(): m_pVBox->pack_start(m_VBox_PlaceHolder); m_VBox_PlaceHolder.show(); m_pVBox->show(); //Show it last so the child widgets all show at once. } void AppWindow_WithDoc_Gtk::add_ui_from_string(const Glib::ustring& ui_description) { try { m_refUIManager->add_ui_from_string(ui_description); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } } void AppWindow_WithDoc_Gtk::init() { AppWindow_WithDoc::init(); //Create document and ask to show it in the UI. init_layout(); // start setting up layout after we've gotten all widgets from UIManager show(); } void AppWindow_WithDoc_Gtk::init_ui_manager() { using namespace Gtk; m_refUIManager = UIManager::create(); //This is just a skeleton structure. //The placeholders allow us to merge the menus and toolbars in later, //by adding a us string with one of the placeholders, but with menu items underneath it. static const Glib::ustring ui_description = "" " " " " " " " " //Note that extra menus should be inserted before the Help menu, which should always be at the end. " " " " " " " " " " ""; add_ui_from_string(ui_description); } void AppWindow_WithDoc_Gtk::init_toolbars() { //Build part of the menu structure, to be merged in by using the "PH" placeholders: static const Glib::ustring ui_description = "" " " " " " " " " " " " " " " ""; add_ui_from_string(ui_description); } void AppWindow_WithDoc_Gtk::init_menus() { //Override this to add more menus init_menus_file(); init_menus_edit(); } void AppWindow_WithDoc_Gtk::init_menus_file_recentfiles(const Glib::ustring& path) { if(!m_mime_types.empty()) //"Recent-files" is useless unless it knows what documents (which MIME-types) to show. { //Add recent-files submenu: Gtk::MenuItem* pMenuItem = dynamic_cast(m_refUIManager->get_widget(path)); if(pMenuItem) { Glib::RefPtr filter = Gtk::RecentFilter::create(); //Add the mime-types, so that it only shows those documents: for(type_list_strings::iterator iter = m_mime_types.begin(); iter != m_mime_types.end(); ++iter) { const Glib::ustring mime_type = *iter; //TODO: Find a gio equivalent for gnome_vfs_mime_type_is_known(). murrayc. filter->add_mime_type(mime_type); } Gtk::RecentChooserMenu* menu = Gtk::manage(new Gtk::RecentChooserMenu); menu->set_filter(filter); menu->set_show_numbers(false); menu->set_sort_type(Gtk::RECENT_SORT_MRU); menu->signal_item_activated().connect(sigc::bind(sigc::mem_fun(*this, static_cast(&AppWindow_WithDoc_Gtk::on_recent_files_activate)), sigc::ref(*menu))); pMenuItem->set_submenu(*menu); } else { std::cout << "debug: recent files menu not found" << std::endl; } } else { //std::cout << "debug: " << G_STRFUNC << ": No recent files sub-menu added, because no MIME types are specified." << std::endl; } } void AppWindow_WithDoc_Gtk::init_menus_file() { // File menu //Build actions: m_refFileActionGroup = Gtk::ActionGroup::create("BakeryFileActions"); m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_Menu_File", _("_File"))); m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_Menu_File_RecentFiles", _("_Recent Files"))); //File actions m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_File_New", Gtk::Stock::NEW), sigc::mem_fun((AppWindow&)*this, &AppWindow::on_menu_file_new)); m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_File_Open", Gtk::Stock::OPEN), sigc::mem_fun((AppWindow_WithDoc&)*this, &AppWindow_WithDoc::on_menu_file_open)); //Remember thes ones for later, so we can disable Save menu and toolbar items: m_action_save = Gtk::Action::create("BakeryAction_File_Save", Gtk::Stock::SAVE); m_refFileActionGroup->add(m_action_save, sigc::mem_fun((AppWindow_WithDoc&)*this, &AppWindow_WithDoc::on_menu_file_save)); m_action_saveas = Gtk::Action::create("BakeryAction_File_SaveAs", Gtk::Stock::SAVE_AS); m_refFileActionGroup->add(m_action_saveas, sigc::mem_fun((AppWindow_WithDoc&)*this, &AppWindow_WithDoc::on_menu_file_saveas)); m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_File_Close", Gtk::Stock::CLOSE), sigc::mem_fun((AppWindow_WithDoc&)*this, &AppWindow_WithDoc::on_menu_file_close)); m_refUIManager->insert_action_group(m_refFileActionGroup); //Build part of the menu structure, to be merged in by using the "PH" placeholders: static const Glib::ustring ui_description = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; //Add menu: add_ui_from_string(ui_description); //Add recent-files submenu: init_menus_file_recentfiles("/Bakery_MainMenu/Bakery_MenuPH_File/BakeryAction_Menu_File/BakeryAction_Menu_File_RecentFiles"); } void AppWindow_WithDoc_Gtk::init_menus_edit() { using namespace Gtk; //Edit menu //Build actions: m_refEditActionGroup = Gtk::ActionGroup::create("BakeryEditActions"); m_refEditActionGroup->add(Action::create("BakeryAction_Menu_Edit", _("_Edit"))); m_refEditActionGroup->add(Action::create("BakeryAction_Edit_Cut", Gtk::Stock::CUT), sigc::mem_fun((AppWindow_WithDoc_Gtk&)*this, &AppWindow_WithDoc_Gtk::on_menu_edit_cut_activate)); m_refEditActionGroup->add(Action::create("BakeryAction_Edit_Copy", Gtk::Stock::COPY), sigc::mem_fun((AppWindow_WithDoc_Gtk&)*this, &AppWindow_WithDoc_Gtk::on_menu_edit_copy_activate)); m_refEditActionGroup->add(Action::create("BakeryAction_Edit_Paste", Gtk::Stock::PASTE), sigc::mem_fun((AppWindow_WithDoc_Gtk&)*this, &AppWindow_WithDoc_Gtk::on_menu_edit_paste_activate)); m_refEditActionGroup->add(Action::create("BakeryAction_Edit_Clear", Gtk::Stock::CLEAR)); m_refUIManager->insert_action_group(m_refEditActionGroup); //Build part of the menu structure, to be merged in by using the "PH" placeholders: static const Glib::ustring ui_description = "" " " " " " " " " " " " " " " " " " " " " ""; //Add menu: add_ui_from_string(ui_description); } void AppWindow_WithDoc_Gtk::add(Gtk::Widget& child) { m_VBox_PlaceHolder.pack_start(child); } bool AppWindow_WithDoc_Gtk::on_delete_event(GdkEventAny* /* event */) { //Clicking on the [x] in the title bar should be like choosing File|Close on_menu_file_close(); return true; // true = don't hide, don't destroy } void AppWindow_WithDoc_Gtk::update_window_title() { //Set application's main window title: Document* pDoc = get_document(); if(!pDoc) return; Glib::ustring strTitle = m_strAppName; strTitle += " - " + pDoc->get_name(); //Indicate unsaved changes: if(pDoc->get_modified()) strTitle += " *"; //Indicate read-only files: if(pDoc->get_read_only()) strTitle += _(" (read-only)"); set_title(strTitle); } void AppWindow_WithDoc_Gtk::ui_warning(const Glib::ustring& text, const Glib::ustring& secondary_text) { Gtk::Window* pWindow = this; Gtk::MessageDialog dialog(AppWindow_WithDoc_Gtk::util_bold_message(text), true /* use markup */, Gtk::MESSAGE_WARNING); dialog.set_secondary_text(secondary_text); dialog.set_title(""); //The HIG says that alert dialogs should not have titles. The default comes from the message type. if(pWindow) dialog.set_transient_for(*pWindow); dialog.run(); } Glib::ustring AppWindow_WithDoc_Gtk::util_bold_message(const Glib::ustring& message) { return "" + message + ""; } Glib::ustring AppWindow_WithDoc_Gtk::ui_file_select_open(const Glib::ustring& starting_folder_uri) { Gtk::Window* pWindow = this; Gtk::FileChooserDialog fileChooser_Open(_("Open Document"), Gtk::FILE_CHOOSER_ACTION_OPEN); fileChooser_Open.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); fileChooser_Open.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK); fileChooser_Open.set_default_response(Gtk::RESPONSE_OK); if(pWindow) fileChooser_Open.set_transient_for(*pWindow); if(!starting_folder_uri.empty()) fileChooser_Open.set_current_folder_uri(starting_folder_uri); const int response_id = fileChooser_Open.run(); fileChooser_Open.hide(); if(response_id != Gtk::RESPONSE_CANCEL) { return fileChooser_Open.get_uri(); } else return Glib::ustring(); } static bool uri_is_writable(const Glib::RefPtr& uri) { if(!uri) return false; Glib::RefPtr file_info; try { file_info = uri->query_info(G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); } catch(const Glib::Error& /* ex */) { return false; } if(file_info) { return file_info->get_attribute_boolean(G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); } else return true; //Not every URI protocol supports access rights, so assume that it's writable and complain later. } Glib::ustring AppWindow_WithDoc_Gtk::ui_file_select_save(const Glib::ustring& old_file_uri) { Gtk::Window* pWindow = this; Gtk::FileChooserDialog fileChooser_Save(_("Save Document"), Gtk::FILE_CHOOSER_ACTION_SAVE); fileChooser_Save.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); fileChooser_Save.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); fileChooser_Save.set_default_response(Gtk::RESPONSE_OK); if(pWindow) fileChooser_Save.set_transient_for(*pWindow); fileChooser_Save.set_do_overwrite_confirmation(); //Ask the user if the file already exists. //Make the save dialog show the existing filename, if any: if(!old_file_uri.empty()) { //Just start with the parent folder, //instead of the whole name, to avoid overwriting: Glib::RefPtr gio_file = Gio::File::create_for_uri(old_file_uri); if(gio_file) { Glib::RefPtr parent = gio_file->get_parent(); if(parent) { const Glib::ustring uri_parent = parent->get_uri(); fileChooser_Save.set_uri(uri_parent); } } } bool try_again = true; while(try_again) { try_again = false; const int response_id = fileChooser_Save.run(); fileChooser_Save.hide(); if(response_id != Gtk::RESPONSE_CANCEL) { const Glib::ustring uri = fileChooser_Save.get_uri(); Glib::RefPtr gio_file = Gio::File::create_for_uri(uri); //If the file exists (the FileChooser offers a "replace?" dialog, so this is possible.): if(AppWindow_WithDoc::file_exists(uri)) { //Check whether we have rights to the file to change it: //Really, GtkFileChooser should do this for us. if(!uri_is_writable(gio_file)) { //Warn the user: ui_warning(_("Read-only File."), _("You may not overwrite the existing file, because you do not have sufficient access rights.")); try_again = true; //Try again. continue; } } //Check whether we have rights to the directory, to create a new file in it: //Really, GtkFileChooser should do this for us. Glib::RefPtr gio_file_parent = gio_file->get_parent(); if(gio_file_parent) { if(!uri_is_writable(gio_file_parent)) { //Warn the user: ui_warning(_("Read-only Directory."), _("You may not create a file in this directory, because you do not have sufficient access rights.")); try_again = true; //Try again. continue; } } if(!try_again) return uri; } else return Glib::ustring(); //The user cancelled. } return Glib::ustring(); } void AppWindow_WithDoc_Gtk::ui_show_modification_status() { const bool modified = m_pDocument->get_modified(); //Enable Save and SaveAs menu items: if(m_action_save) m_action_save->set_sensitive(modified); if(m_action_saveas) m_action_saveas->set_sensitive(modified); } AppWindow_WithDoc_Gtk::enumSaveChanges AppWindow_WithDoc_Gtk::ui_offer_to_save_changes() { AppWindow_WithDoc::enumSaveChanges result = AppWindow_WithDoc::SAVECHANGES_Cancel; if(!m_pDocument) return result; GlomBakery::Dialog_OfferSave* pDialogQuestion = new GlomBakery::Dialog_OfferSave( m_pDocument->get_file_uri() ); Gtk::Window* pWindow = this; if(pWindow) pDialogQuestion->set_transient_for(*pWindow); GlomBakery::Dialog_OfferSave::enumButtons buttonClicked = (GlomBakery::Dialog_OfferSave::enumButtons)pDialogQuestion->run(); delete pDialogQuestion; pDialogQuestion = 0; if(buttonClicked == GlomBakery::Dialog_OfferSave::BUTTON_Save) result = AppWindow_WithDoc::SAVECHANGES_Save; else if(buttonClicked == GlomBakery::Dialog_OfferSave::BUTTON_Discard) result = AppWindow_WithDoc::SAVECHANGES_Discard; else result = AppWindow_WithDoc::SAVECHANGES_Cancel; return result; } void AppWindow_WithDoc_Gtk::document_history_add(const Glib::ustring& file_uri) { if(file_uri.empty()) return; //This can sometimes be called for a file that does not yet exist on disk. //Avoid warning in RecentManager if that is the case. //For instance, Glom does this when the user chooses a new filename, //but before Glom has enough information to save a useful file. if(!file_exists(file_uri)) return; Gtk::RecentManager::get_default()->add_item(file_uri); } void AppWindow_WithDoc_Gtk::document_history_remove(const Glib::ustring& file_uri) { if(!file_uri.empty()) { //Glib::ustring filename_e = Gnome::Vfs::escape_path_string(file_uri.c_str()); const Glib::ustring uri = file_uri; //"file://" + filename_e; Gtk::RecentManager::get_default()->remove_item(uri); } } void AppWindow_WithDoc_Gtk::on_menu_edit_copy_activate() { Gtk::Widget* widget = get_focus(); Gtk::Editable* editable = dynamic_cast(widget); if(editable) { editable->copy_clipboard(); return; } //GtkTextView does not implement GtkTextView. //See GTK+ bug: https://bugzilla.gnome.org/show_bug.cgi?id=667008 Gtk::TextView* textview = dynamic_cast(widget); if(textview) { Glib::RefPtr buffer = textview->get_buffer(); if(buffer) { Glib::RefPtr clipboard = Gtk::Clipboard::get_for_display(get_display()); buffer->copy_clipboard(clipboard); } } } void AppWindow_WithDoc_Gtk::on_menu_edit_cut_activate() { Gtk::Widget* widget = get_focus(); Gtk::Editable* editable = dynamic_cast(widget); if(editable) { editable->cut_clipboard(); return; } //GtkTextView does not implement GtkTextView. //See GTK+ bug: https://bugzilla.gnome.org/show_bug.cgi?id=667008 Gtk::TextView* textview = dynamic_cast(widget); if(textview) { Glib::RefPtr buffer = textview->get_buffer(); if(buffer) { Glib::RefPtr clipboard = Gtk::Clipboard::get_for_display(get_display()); buffer->cut_clipboard(clipboard, textview->get_editable()); } } } void AppWindow_WithDoc_Gtk::on_menu_edit_paste_activate() { Gtk::Widget* widget = get_focus(); Gtk::Editable* editable = dynamic_cast(widget); if(editable) { editable->paste_clipboard(); return; } //GtkTextView does not implement GtkTextView. //See GTK+ bug: https://bugzilla.gnome.org/show_bug.cgi?id=667008 Gtk::TextView* textview = dynamic_cast(widget); if(textview) { Glib::RefPtr buffer = textview->get_buffer(); if(buffer) { Glib::RefPtr clipboard = Gtk::Clipboard::get_for_display(get_display()); buffer->paste_clipboard(clipboard); } } } void AppWindow_WithDoc_Gtk::on_recent_files_activate(Gtk::RecentChooser& chooser) { const Glib::ustring uri = chooser.get_current_uri(); const bool bTest = open_document(uri); if(!bTest) document_history_remove(uri); } } //namespace glom-1.22.4/glom/bakery/appwindow_withdoc_gtk.h0000644000175000017500000001066212234776363022770 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_BAKERY_APP_WITHDOC_GTK_H #define GLOM_BAKERY_APP_WITHDOC_GTK_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace GlomBakery { /** This class implements GlomBakery::AppWindow_WithDoc using gtkmm. * * Your application's installation should register your document's MIME-type in GNOME's (freedesktop's) MIME-type system, * and register your application as capable of opening documents of that MIME-type. * * */ class AppWindow_WithDoc_Gtk : public AppWindow_WithDoc, public Gtk::ApplicationWindow //inherit virtually to share sigc::trackable. { public: typedef Gtk::ApplicationWindow ParentWindow; ///Don't forget to call init() too. AppWindow_WithDoc_Gtk(const Glib::ustring& appname); /// This constructor can be used to implement derived classes for use with Gtk::Builder::get_derived_widget(). AppWindow_WithDoc_Gtk(BaseObjectType* cobject, const Glib::ustring& appname); virtual ~AppWindow_WithDoc_Gtk(); virtual void init(); //Unique final overrider. /// Overidden to add a widget in the middle, under the menu, instead of replacing the whole contents. virtual void add(Gtk::Widget& child); /// For instance, to create bold primary text for a dialog box, without marking the markup for translation. static Glib::ustring util_bold_message(const Glib::ustring& message); protected: virtual void init_layout(); //Arranges the menu, toolbar, etc. void init_menus_file_recentfiles(const Glib::ustring& path); // call this in init_menus_file() virtual void init_ui_manager(); //Override this to add more UI placeholders virtual void init_menus(); //Override this to add more or different menus. virtual void init_menus_file(); //Call this from init_menus() to add the standard file menu. virtual void init_menus_edit(); //Call this from init_menus() to add the standard edit menu virtual void init_toolbars(); void add_ui_from_string(const Glib::ustring& ui_description); //Convenience function virtual void on_hide(); //override. //Overrides from AppWindow_WithDoc: virtual void document_history_add(const Glib::ustring& file_uri); //overridden. virtual void document_history_remove(const Glib::ustring& file_uri); //overridden. virtual void update_window_title(); virtual void ui_warning(const Glib::ustring& text, const Glib::ustring& secondary_text); virtual Glib::ustring ui_file_select_open(const Glib::ustring& starting_folder_uri = Glib::ustring()); virtual Glib::ustring ui_file_select_save(const Glib::ustring& old_file_uri); virtual void ui_show_modification_status(); virtual enumSaveChanges ui_offer_to_save_changes(); //Signal handlers: //Menus: virtual void ui_hide(); virtual void ui_bring_to_front(); virtual bool on_delete_event(GdkEventAny* event); //override void on_menu_edit_copy_activate(); void on_menu_edit_cut_activate(); void on_menu_edit_paste_activate(); void on_recent_files_activate(Gtk::RecentChooser& recent_chooser); //UIManager and Actions Glib::RefPtr m_refUIManager; Glib::RefPtr m_refFileActionGroup; Glib::RefPtr m_refEditActionGroup; //Member widgets: Gtk::Box* m_pVBox; Gtk::Box m_VBox_PlaceHolder; //Menu stuff: Glib::RefPtr m_action_save, m_action_saveas; }; } //namespace #endif //BAKERY_APP_WITHDOC_GTK_H glom-1.22.4/glom/bakery/appwindow.cc0000644000175000017500000000502112234776363020531 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include namespace GlomBakery { //Initialize static member data: Glib::ustring AppWindow::m_strVersion; bool AppWindow::m_bOperationCancelled = false; Glib::ustring AppWindow::m_strCommandLine_0; Glib::ustring AppWindow::m_strAppName; AppWindow::AppWindow(const Glib::ustring& appname) { init_app_name(appname); } AppWindow::~AppWindow() { } void AppWindow::init_app_name(const Glib::ustring& appname) //static { m_strAppName = appname; } void AppWindow::init() { //set_wmclass(m_strAppName, m_strTitle); //The docs say "Don't use this". init_ui_manager(); init_menus(); init_toolbars(); //on_document_load(); //Show the document (even if it is empty). } void AppWindow::init_ui_manager() { } void AppWindow::init_menus() { init_menus_file(); init_menus_edit(); //create_menus(m_menu_UI_Infos); //install_menu_hints(); //Override this to add more menus. } void AppWindow::init_toolbars() { } void AppWindow::on_menu_file_new() { new_instance(); } void AppWindow::on_menu_file_close() { ui_hide(); } void AppWindow::on_menu_edit_cut() { on_menu_edit_copy(); on_menu_edit_clear(); } void AppWindow::on_menu_edit_copy() { } void AppWindow::on_menu_edit_paste() { } void AppWindow::on_menu_edit_clear() { } Glib::ustring AppWindow::get_version() const { return m_strVersion; } void AppWindow::set_operation_cancelled(bool bVal /* = true */) { m_bOperationCancelled = bVal; } bool AppWindow::get_operation_cancelled() { return m_bOperationCancelled; } void AppWindow::set_command_line_args(int argc, char **&argv) { if( (argc > 0) && argv[0]) m_strCommandLine_0 = (char*)argv[0]; } AppWindow::type_signal_hide AppWindow::ui_signal_hide() { return m_signal_hide; } } //namespace glom-1.22.4/glom/bakery/dialog_offersave.cc0000644000175000017500000000421212234776363022021 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include #include #include namespace { Glib::ustring get_confirmation_message(const Glib::ustring& file_uri) { Glib::ustring message = _("This document has unsaved changes. Would you like to save the document?"); if(!file_uri.empty()) { message += "\n\n"; message += Glib::ustring::compose(_("Document:\n%1"), Glib::filename_display_basename(file_uri)); //TODO: Can we use filename_display_basename() with a URI? } return message; } } namespace GlomBakery { Dialog_OfferSave::Dialog_OfferSave(const Glib::ustring& file_uri) : Gtk::MessageDialog( AppWindow_WithDoc_Gtk::util_bold_message(_("Close without Saving")), true /* use markup */, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE) { set_title(""); //The HIG says that alert dialogs should not have titles. The default comes from the message type. set_secondary_text(get_confirmation_message(file_uri)); add_button(_("Discard"), BUTTON_Discard); Gtk::Button* cancel_button = add_button(Gtk::Stock::CANCEL, BUTTON_Cancel); add_button(Gtk::Stock::SAVE, BUTTON_Save); // Otherwise Discard has focus initially which seems inconvenient: cancel_button->grab_focus(); } Dialog_OfferSave::~Dialog_OfferSave() { } } //namespace glom-1.22.4/glom/mode_design/0000755000175000017500000000000012235000127017167 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/box_db_table_relationships.h0000644000175000017500000000375612234252646024741 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef BOX_DB_TABLE_RELATIONSHIPS_H #define BOX_DB_TABLE_RELATIONSHIPS_H #include #include namespace Glom { class Box_DB_Table_Relationships : public Box_DB_Table { public: Box_DB_Table_Relationships(); Box_DB_Table_Relationships(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Box_DB_Table_Relationships(); void init(); //avoid duplication in constructors. virtual void save_to_document(); //override. private: virtual bool fill_from_database(); //Signal handlers: void on_adddel_user_activated(const Gtk::TreeModel::iterator& row, guint col); void on_adddel_user_changed(const Gtk::TreeModel::iterator& row, guint col); void on_adddel_user_requested_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& rowEnd); void on_adddel_user_added(const Gtk::TreeModel::iterator& row); guint m_colName, m_colTitle, m_colFromField, m_colToTable, m_colToField, m_colAllowEdit, m_colAutoCreate, m_colTitleSingular; mutable AddDel_WithButtons m_AddDel; //mutable because its get_ methods aren't const. Gtk::Button m_Button_Guess; }; } //namespace Glom #endif //BOX_DB_TABLE_RELATIONSHIPS_H glom-1.22.4/glom/mode_design/dialog_add_related_table.cc0000644000175000017500000001263512234252646024441 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_add_related_table.h" #include //For show_ok_dialog.h #include #include namespace Glom { const char* Dialog_AddRelatedTable::glade_id("dialog_add_related_table"); const bool Dialog_AddRelatedTable::glade_developer(true); Dialog_AddRelatedTable::Dialog_AddRelatedTable(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), Base_DB(), m_entry_table_name(0), m_entry_relationship_name(0), m_combo_from_field(0), m_button_edit_fields(0), m_button_ok(0) { builder->get_widget("entry_related_table_name", m_entry_table_name); builder->get_widget("entry_relationship_name", m_entry_relationship_name); builder->get_widget("combobox_from_key", m_combo_from_field); //Connect signals: m_combo_from_field->signal_changed().connect( sigc::mem_fun(*this, &Dialog_AddRelatedTable::on_combo_field_name) ); m_entry_table_name->signal_changed().connect( sigc::mem_fun(*this, &Dialog_AddRelatedTable::on_entry_table_name) ); builder->get_widget("button_edit_fields", m_button_edit_fields); builder->get_widget("button_ok", m_button_ok); m_button_edit_fields->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_AddRelatedTable::on_button_edit_fields) ); } Dialog_AddRelatedTable::~Dialog_AddRelatedTable() { } void Dialog_AddRelatedTable::get_input(Glib::ustring& table_name, Glib::ustring& relationship_name, Glib::ustring& from_key_name) { table_name = m_entry_table_name->get_text(); relationship_name = m_entry_relationship_name->get_text(); from_key_name = m_combo_from_field->get_active_text(); } void Dialog_AddRelatedTable::set_fields(const Glib::ustring& table_name) { m_table_name = table_name; const type_vec_fields fields = DbUtils::get_fields_for_table_from_database(table_name); //Show the fields: m_combo_from_field->remove_all(); for(type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr item = *iter; if(item) m_combo_from_field->append(item->get_name()); } } void Dialog_AddRelatedTable::on_entry_table_name() { const Glib::ustring table_name = m_entry_table_name->get_text(); if(table_name.empty()) return; //Guess a possible relationship name, based on the table name: Glib::ustring possible_relationship_name = table_name; //Discover whether a table with this name exists already, //and append a numerical prefix until we find one that doesn't exist. //TODO: A numerical prefix would look pretty stupid, but I suppose must do something. murrayc bool exists_already = true; Glib::ustring name_to_try = possible_relationship_name; int suffix_number = 1; while(exists_already) { if(!get_relationship_exists(m_table_name, name_to_try)) exists_already = false; //Stop the while loop. else { //Append a numeric suffix and try again: name_to_try = possible_relationship_name + Utils::string_from_decimal(suffix_number); ++suffix_number; } } possible_relationship_name = name_to_try; //We found an unused relationship name. m_entry_relationship_name->set_text(possible_relationship_name); } void Dialog_AddRelatedTable::on_combo_field_name() { const Glib::ustring field_name = m_combo_from_field->get_active_text(); if(field_name.empty()) return; //Guess a possible related table name, based on the from key: Glib::ustring possible_table_name = field_name; //If the field has an _id prefix then remove that: possible_table_name = Utils::string_remove_suffix(possible_table_name, "_id", false /* not case sensitive */); //Add a "s" to the end, though this probably only makes sense in English. TODO: Don't do this? possible_table_name += 's'; //Discover whether a table with this name exists already, //and append a numerical prefix until we find one that doesn't exist: bool exists_already = true; Glib::ustring name_to_try = possible_table_name; int suffix_number = 1; while(exists_already) { if(!DbUtils::get_table_exists_in_database(name_to_try)) exists_already = false; //Stop the while loop. else { //Append a numeric suffix and try again: name_to_try = possible_table_name + Utils::string_from_decimal(suffix_number); ++suffix_number; } } possible_table_name = name_to_try; //We found an unused table name. m_entry_table_name->set_text(possible_table_name); } void Dialog_AddRelatedTable::on_button_edit_fields() { m_signal_request_edit_fields.emit(); } Dialog_AddRelatedTable::type_signal_request_edit_fields Dialog_AddRelatedTable::signal_request_edit_fields() { return m_signal_request_edit_fields; } } //namespace Glom glom-1.22.4/glom/mode_design/dialog_relationships.h0000644000175000017500000000254712234252646023571 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef DIALOG_RELATIONSHIPS_H #define DIALOG_RELATIONSHIPS_H #include "dialog_design.h" #include "box_db_table_relationships.h" namespace Glom { class Dialog_Relationships : public Dialog_Design { public: static const char* glade_id; static const bool glade_developer; Dialog_Relationships(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Relationships(); virtual bool init_db_details(const Glib::ustring& table_name); virtual void on_hide(); private: Box_DB_Table_Relationships* m_box; }; } //namespace Glom #endif //DIALOG_RELATIONSHIPS_H glom-1.22.4/glom/mode_design/users/0000755000175000017500000000000012235000127020330 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/users/dialog_users_list.cc0000644000175000017500000003063312234776363024404 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_users_list.h" #include "dialog_user.h" #include "dialog_choose_user.h" #include #include #include #include //For bold_message()). //#include #include namespace Glom { const char* Dialog_UsersList::glade_id("window_users"); const bool Dialog_UsersList::glade_developer(true); Dialog_UsersList::Dialog_UsersList(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_treeview_users(0), m_combo_group(0), m_button_user_add(0), m_button_user_remove(0), m_button_user_new(0), m_button_user_delete(0), m_button_user_edit(0) { builder->get_widget("combobox_group", m_combo_group); m_combo_group->signal_changed().connect(sigc::mem_fun(*this, &Dialog_UsersList::on_combo_group_changed)); builder->get_widget("treeview_users", m_treeview_users); if(m_treeview_users) { Glib::RefPtr refSelection = m_treeview_users->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_UsersList::on_treeview_users_selection_changed) ); } m_model_users = Gtk::ListStore::create(m_model_columns_users); m_treeview_users->set_model(m_model_users); // Append the View columns: m_treeview_users->append_column(C_("Users List", "User"), m_model_columns_users.m_col_name); } builder->get_widget("button_delete", m_button_user_delete); m_button_user_delete->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_UsersList::on_button_user_delete) ); builder->get_widget("button_add", m_button_user_add); m_button_user_add->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_UsersList::on_button_user_add) ); builder->get_widget("button_remove", m_button_user_remove); m_button_user_remove->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_UsersList::on_button_user_remove) ); builder->get_widget("button_new", m_button_user_new); m_button_user_new->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_UsersList::on_button_user_new) ); builder->get_widget("button_edit", m_button_user_edit); m_button_user_edit->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_UsersList::on_button_user_edit) ); enable_buttons(); show_all_children(); } Dialog_UsersList::~Dialog_UsersList() { } void Dialog_UsersList::enable_buttons() { if(!m_button_user_edit) return; //Fields: Glib::RefPtr refSelection = m_treeview_users->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { m_button_user_edit->set_sensitive(true); m_button_user_delete->set_sensitive(true); } else { //Disable all buttons that act on a selection: m_button_user_edit->set_sensitive(false); m_button_user_delete->set_sensitive(false); } } } void Dialog_UsersList::on_button_user_remove() { Glib::RefPtr refTreeSelection = m_treeview_users->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { if(warn_about_empty_standard_group()) { Gtk::TreeModel::Row row = *iter; const Glib::ustring user = row[m_model_columns_users.m_col_name]; if(!user.empty()) { DbUtils::remove_user_from_group(user, m_combo_group->get_active_text()); fill_list(); } //m_modified = true; } } } } void Dialog_UsersList::on_button_user_delete() { Glib::RefPtr refTreeSelection = m_treeview_users->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { if(warn_about_empty_standard_group()) { Gtk::TreeModel::Row row = *iter; const Glib::ustring user = row[m_model_columns_users.m_col_name]; if(!user.empty()) { Gtk::MessageDialog dialog(Utils::bold_message(_("Delete User")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); dialog.set_secondary_text(_("Are your sure that you wish to delete this user?")); dialog.set_transient_for(*this); const int response = dialog.run(); dialog.hide(); if(response == Gtk::RESPONSE_OK) { DbUtils::remove_user(user); //TODO: Warn about failure when this returns false? fill_list(); } } //m_modified = true; } } } } void Dialog_UsersList::on_button_user_add() { //Fill it with the list of users: const Privs::type_vec_strings users = Privs::get_database_users(); if(users.empty()) { Utils::show_ok_dialog(_("Error Retrieving the List of Users"), _("Glom could not get the list of users from the database server. You probably do not have enough permissions. You should be a superuser."), *this, Gtk::MESSAGE_ERROR); return; } Dialog_ChooseUser* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*this); dialog->set_user_list(users); const int response = Glom::Utils::dialog_run_with_help(dialog); const Glib::ustring user = dialog->get_user(); delete dialog; if(response != Gtk::RESPONSE_OK) return; if(!user.empty()) { //Add it to the group: const Glib::ustring strQuery = DbUtils::build_query_add_user_to_group(m_combo_group->get_active_text(), user); const bool test = DbUtils::query_execute_string(strQuery); if(!test) std::cerr << G_STRFUNC << ": ALTER GROUP failed." << std::endl; //Remove any user rights, so that all rights come from the user's presence in the group: Document::type_listTableInfo table_list = get_document()->get_tables(); for(Document::type_listTableInfo::const_iterator iter = table_list.begin(); iter != table_list.end(); ++iter) { const Glib::ustring table_name = (*iter)->get_name(); const Glib::ustring strQuery = "REVOKE ALL PRIVILEGES ON " + DbUtils::escape_sql_id(table_name) + " FROM " + DbUtils::escape_sql_id(user); const bool test = DbUtils::query_execute_string(strQuery); if(!test) std::cerr << G_STRFUNC << ": REVOKE failed." << std::endl; } fill_list(); } } void Dialog_UsersList::on_button_user_new() { Dialog_User* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*this); dialog->m_combo_group->set_sensitive(false); //It is being added to the current group, so don't offer a different group. int response = Gtk::RESPONSE_OK; bool keep_trying = true; while(keep_trying) { response = Glom::Utils::dialog_run_with_help(dialog); //Check the password is acceptable: if(response == Gtk::RESPONSE_OK) { const bool password_ok = dialog->check_password(); if(password_ok) keep_trying = false; } else keep_trying = false; } const Glib::ustring user = dialog->m_entry_user->get_text(); const Glib::ustring password = dialog->m_entry_password->get_text(); delete dialog; if(response != Gtk::RESPONSE_OK) return; DbUtils::add_user(get_document(), user, password, m_combo_group->get_active_text() /* group */); fill_list(); } void Dialog_UsersList::on_button_user_edit() { //Get the selected item: Glib::RefPtr refTreeSelection = m_treeview_users->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; Dialog_User* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*this); //TODO: Do this in the derived class: dialog->m_entry_user->set_text( row[m_model_columns_users.m_col_name] ); dialog->m_entry_user->set_sensitive(false); //They can edit the password, but not the name. TODO: Allow editing of name? //Fill groups: dialog->m_combo_group->remove_all(); type_vec_strings group_list = Privs::get_database_groups(); for(type_vec_strings::const_iterator iter = group_list.begin(); iter != group_list.end(); ++iter) { dialog->m_combo_group->append(*iter); } dialog->m_combo_group->set_active_text(m_combo_group->get_active_text()); dialog->m_combo_group->set_sensitive(false); //TODO: Allow, and handle, changes to this. int response = Gtk::RESPONSE_OK; bool keep_trying = true; while(keep_trying) { response = Glom::Utils::dialog_run_with_help(dialog); //Check the password is acceptable: if(response == Gtk::RESPONSE_OK) { const bool password_ok = dialog->check_password(); if(password_ok) keep_trying = false; } else keep_trying = false; } const Glib::ustring user = dialog->m_entry_user->get_text(); const Glib::ustring password = dialog->m_entry_password->get_text(); delete dialog; if(response != Gtk::RESPONSE_OK) return; if(!user.empty() && !password.empty()) { const Glib::ustring strQuery = "ALTER USER " + DbUtils::escape_sql_id(user) + " PASSWORD '" + password + "'" ; //TODO: Escape the password. const bool test = DbUtils::query_execute_string(strQuery); if(!test) std::cerr << G_STRFUNC << ": ALTER USER failed." << std::endl; //Change the password in the current connection, if this is the current user. ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(connection_pool->get_user() == user) connection_pool->set_password(password); fill_list(); } } } } void Dialog_UsersList::save_to_document() { //if(m_modified) //{ //} } void Dialog_UsersList::on_treeview_users_selection_changed() { enable_buttons(); } void Dialog_UsersList::fill_list() { //Fill the model rows: m_model_users->clear(); if(m_combo_group) { const Glib::ustring group_name = m_combo_group->get_active_text(); const type_vec_strings user_list = Privs::get_database_users(group_name); for(type_vec_strings::const_iterator iter = user_list.begin(); iter != user_list.end(); ++iter) { Gtk::TreeModel::iterator iterTree = m_model_users->append(); Gtk::TreeModel::Row row = *iterTree; row[m_model_columns_users.m_col_name] = Privs::get_user_visible_group_name(*iter); } } } void Dialog_UsersList::set_group(const Glib::ustring& group_name) { //Fill the list of groups: m_combo_group->remove_all(); type_vec_strings group_list = Privs::get_database_groups(); for(type_vec_strings::const_iterator iter = group_list.begin(); iter != group_list.end(); ++iter) { m_combo_group->append(*iter); } m_combo_group->set_active_text(group_name); } void Dialog_UsersList::on_combo_group_changed() { fill_list(); } bool Dialog_UsersList::warn_about_empty_standard_group() { //Prevent removal of the last developer: if(m_combo_group->get_active_text() == GLOM_STANDARD_GROUP_NAME_DEVELOPER) { if(m_model_users->children().size() == 1) { Gtk::MessageDialog dialog(Utils::bold_message(_("Developer group may not be empty.")), true, Gtk::MESSAGE_WARNING); dialog.set_secondary_text(_("The developer group must contain at least one user.")); dialog.set_transient_for(*this); dialog.run(); return false; } } return true; } } //namespace Glom glom-1.22.4/glom/mode_design/users/dialog_groups_list.cc0000644000175000017500000004521612234776363024565 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_groups_list.h" #include "dialog_user.h" #include "dialog_users_list.h" #include "dialog_new_group.h" #include #include #include #include //#include #include //For bold_message()). #include #include namespace Glom { const char* Dialog_GroupsList::glade_id("window_groups"); const bool Dialog_GroupsList::glade_developer(true); Dialog_GroupsList::Dialog_GroupsList(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_treeview_groups(0), m_button_group_new(0), m_button_group_delete(0), m_button_group_users(0) { //set_default_size(600, -1); builder->get_widget("treeview_groups", m_treeview_groups); builder->get_widget("treeview_tables", m_treeview_tables); m_model_groups = Gtk::ListStore::create(m_model_columns_groups); m_model_tables = Gtk::ListStore::create(m_model_columns_tables); //Do this only in load_from_document(), to avoid ever doing it too early, before there is a connection: //fill_group_list(); //fill_table_list(); m_treeview_groups->set_model(m_model_groups); m_treeview_tables->set_model(m_model_tables); // Append the View columns: //Groups: Gtk::CellRendererText* pCell = Gtk::manage(new Gtk::CellRendererText); Gtk::TreeView::Column* pViewColumn = Gtk::manage(new Gtk::TreeView::Column(_("Name"), *pCell) ); pViewColumn->set_cell_data_func(*pCell, sigc::mem_fun(*this, &Dialog_GroupsList::on_cell_data_group_name)); m_treeview_groups->append_column(*pViewColumn); m_treeview_groups->append_column(_("Description"), m_model_columns_groups.m_col_description); //Tables: m_treeview_tables->append_column(_("Table"), m_model_columns_tables.m_col_title); treeview_append_bool_column(*m_treeview_tables, _("View"), m_model_columns_tables.m_col_view, sigc::mem_fun( *this, &Dialog_GroupsList::on_treeview_tables_toggled_view) ); treeview_append_bool_column(*m_treeview_tables, _("Edit"), m_model_columns_tables.m_col_edit, sigc::mem_fun( *this, &Dialog_GroupsList::on_treeview_tables_toggled_edit) ); treeview_append_bool_column(*m_treeview_tables, _("Create"), m_model_columns_tables.m_col_create, sigc::mem_fun( *this, &Dialog_GroupsList::on_treeview_tables_toggled_create) ); treeview_append_bool_column(*m_treeview_tables, _("Delete"), m_model_columns_tables.m_col_delete, sigc::mem_fun( *this, &Dialog_GroupsList::on_treeview_tables_toggled_delete) ); Glib::RefPtr refSelection = m_treeview_groups->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_GroupsList::on_treeview_groups_selection_changed) ); } refSelection = m_treeview_tables->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_GroupsList::on_treeview_tables_selection_changed) ); } builder->get_widget("button_group_new", m_button_group_new); m_button_group_new->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_GroupsList::on_button_group_new) ); builder->get_widget("button_group_delete", m_button_group_delete); m_button_group_delete->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_GroupsList::on_button_group_delete) ); builder->get_widget("button_group_users", m_button_group_users); m_button_group_users->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_GroupsList::on_button_group_users) ); enable_buttons(); show_all_children(); } Dialog_GroupsList::~Dialog_GroupsList() { } /* void Dialog_GroupsList::set_document(const Glib::ustring& layout, Document* document, const Glib::ustring& table_name, const type_vecLayoutFields& table_fields) { m_modified = false; Dialog_Layout::set_document(layout, document, table_name, table_fields); //Update the tree models from the document if(document) { //Set the table name and title: m_label_table_name->set_text(table_name); m_entry_table_title->set_text( document->get_table_title(table_name, AppWindow::get_current_locale()) ); Document::type_list_layout_groups mapGroups = document->get_data_layout_groups_plus_new_fields(layout, m_table_name, m_layout_platform); //If no information is stored in the document, then start with something: if(mapGroups.empty()) { LayoutGroup group; group.set_name("main"); group.m_columns_count = 2; guint field_sequence = 1; //0 means no sequence for(type_vecLayoutFields::const_iterator iter = table_fields.begin(); iter != table_fields.end(); ++iter) { LayoutItem_Field item = *iter; group.add_item(item); ++field_sequence; } mapGroups[1] = group; } //Show the field layout typedef std::list< Glib::ustring > type_listStrings; m_model_groups->clear(); for(Document::type_list_layout_groups::const_iterator iter = mapGroups.begin(); iter != mapGroups.end(); ++iter) { sharedptr group = iter->second; add_group(Gtk::TreeModel::iterator(), group); } //treeview_fill_sequences(m_model_groups, m_model_groups->m_columns.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } //Open all the groups: m_treeview_groups->expand_all(); m_modified = false; } */ void Dialog_GroupsList::enable_buttons() { if(!m_button_group_users) return; Glib::RefPtr refSelection = m_treeview_groups->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { m_button_group_users->set_sensitive(true); m_button_group_delete->set_sensitive(true); } else { //Disable all buttons that act on a selection: m_button_group_users->set_sensitive(false); m_button_group_delete->set_sensitive(false); } } } void Dialog_GroupsList::on_button_group_delete() { Glib::RefPtr refTreeSelection = m_treeview_groups->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; const Glib::ustring group = row[m_model_columns_groups.m_col_name]; if(!group.empty()) { //TODO: Prevent deletion of standard groups Gtk::MessageDialog dialog(Utils::bold_message(_("Delete Group")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); dialog.set_secondary_text(_("Are your sure that you wish to delete this group?")); dialog.set_transient_for(*this); int response = dialog.run(); dialog.hide(); if(response == Gtk::RESPONSE_OK) { const Glib::ustring strQuery = "DROP GROUP " + DbUtils::escape_sql_id(group); const bool test = DbUtils::query_execute_string(strQuery); if(!test) std::cerr << G_STRFUNC << ": DROP GROUP failed." << std::endl; fill_group_list(); } } //m_modified = true; } } } void Dialog_GroupsList::on_button_group_new() { Dialog_NewGroup* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*this); const int response = Glom::Utils::dialog_run_with_help(dialog); const Glib::ustring group_name = dialog->m_entry_name->get_text(); delete dialog; if(response != Gtk::RESPONSE_OK) return; if(group_name.empty()) { std::cerr << ": group_name is empty" << std::endl; return; } if(!DbUtils::add_group(get_document(), group_name)) { std::cerr << ": DbUtils::add_group() failed." << std::endl; } fill_group_list(); } void Dialog_GroupsList::on_button_group_users() { //Get the selected item: Glib::RefPtr refTreeSelection = m_treeview_groups->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; const Glib::ustring group_name = row[m_model_columns_groups.m_col_name]; Dialog_UsersList* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*this); add_view(dialog); //Give it access to the document. dialog->fill_list(); dialog->set_group(group_name); Glom::Utils::dialog_run_with_help(dialog); remove_view(dialog); delete dialog; fill_group_list(); } } } void Dialog_GroupsList::save_to_document() { //if(m_modified) //{ //} } void Dialog_GroupsList::on_treeview_tables_selection_changed() { enable_buttons(); } Glib::ustring Dialog_GroupsList::get_selected_group() const { Glib::RefPtr refSelection = m_treeview_groups->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; return row[m_model_columns_groups.m_col_name]; } } return Glib::ustring(); } void Dialog_GroupsList::on_treeview_groups_selection_changed() { //Update the tables list for the currently-selected group: const Glib::ustring group_name = get_selected_group(); if(!group_name.empty()) //This can happen when clearing the list, just before filling it, so something real can be selected. fill_table_list(group_name); enable_buttons(); } void Dialog_GroupsList::fill_group_list() { //Fill the model rows: m_model_groups->clear(); type_vec_strings group_list = Privs::get_database_groups(); for(type_vec_strings::const_iterator iter = group_list.begin(); iter != group_list.end(); ++iter) { Gtk::TreeModel::iterator iterTree = m_model_groups->append(); Gtk::TreeModel::Row row = *iterTree; row[m_model_columns_groups.m_col_name] = *iter; if(*iter == GLOM_STANDARD_GROUP_NAME_DEVELOPER) row[m_model_columns_groups.m_col_description] = _("Full access."); } if(m_treeview_groups && m_treeview_groups->get_model()) //Avoid a warning. { //Select the first item, so that there is always something in the tables TreeView: Glib::RefPtr refSelection = m_treeview_groups->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iterFirst = m_model_groups->children().begin(); if(iterFirst) { refSelection->select(iterFirst); } } } } void Dialog_GroupsList::fill_table_list(const Glib::ustring& group_name) { if(group_name.empty()) { std::cerr << G_STRFUNC << ": group_name is empty." << std::endl; } //Fill the model rows: m_model_tables->clear(); Document* pDocument = get_document(); if(pDocument) { // Make sure that these are in the document, // so that the correct groups will be created if we recreate the database from the document: GroupInfo group_info; group_info.set_name(group_name); Document::type_listTableInfo table_list = pDocument->get_tables(true /* plus system prefs */); for(Document::type_listTableInfo::const_iterator iter = table_list.begin(); iter != table_list.end(); ++iter) { Gtk::TreeModel::iterator iterTree = m_model_tables->append(); Gtk::TreeModel::Row row = *iterTree; const Glib::ustring table_name = (*iter)->get_name(); row[m_model_columns_tables.m_col_name] = table_name; row[m_model_columns_tables.m_col_title] = item_get_title_or_name(*iter); const Privileges privs = Privs::get_table_privileges(group_name, table_name); row[m_model_columns_tables.m_col_view] = privs.m_view; row[m_model_columns_tables.m_col_edit] = privs.m_edit; row[m_model_columns_tables.m_col_create] = privs.m_create; row[m_model_columns_tables.m_col_delete] = privs.m_delete; group_info.m_map_privileges[table_name] = privs; } pDocument->set_group(group_info); } } void Dialog_GroupsList::load_from_document() { //Ensure that the glom_developer group exists. DbUtils::add_standard_groups(get_document()); fill_group_list(); //fill_table_list(); } void Dialog_GroupsList::treeview_append_bool_column(Gtk::TreeView& treeview, const Glib::ustring& title, Gtk::TreeModelColumn& model_column, const sigc::slot& slot_toggled) { Gtk::CellRendererToggle* pCellRenderer = Gtk::manage( new Gtk::CellRendererToggle() ); //GTK+'s "activatable" really means "editable": pCellRenderer->property_activatable() = true; Gtk::TreeView::Column* pViewColumn = Gtk::manage( new Gtk::TreeView::Column(title, *pCellRenderer) ); pViewColumn->set_renderer(*pCellRenderer, model_column); //render it via the default "text" property. treeview.append_column(*pViewColumn); pCellRenderer->signal_toggled().connect( slot_toggled ); } //TODO: Use Privs::set_table_privileges() instead? bool Dialog_GroupsList::set_table_privilege(const Glib::ustring& table_name, const Glib::ustring& group_name, bool grant, enumPriv priv) { if(group_name.empty() || table_name.empty()) return false; if(group_name == GLOM_STANDARD_GROUP_NAME_DEVELOPER) return false; //Change the permission in the database: //Build the SQL statement: //Grant or revoke: Glib::ustring strQuery; if(grant) strQuery = "GRANT"; else strQuery = "REVOKE"; //What to grant or revoke: Glib::ustring strPrivilege; if(priv == PRIV_VIEW) strPrivilege = "SELECT"; else if(priv == PRIV_EDIT) strPrivilege = "UPDATE"; else if(priv == PRIV_CREATE) strPrivilege = "INSERT"; else if(priv == PRIV_DELETE) strPrivilege = "DELETE"; strQuery += " " + strPrivilege + " ON " + DbUtils::escape_sql_id(table_name) + " "; //This must match the Grant or Revoke: if(grant) strQuery += "TO"; else strQuery += "FROM"; strQuery += " GROUP " + DbUtils::escape_sql_id(group_name); const bool test = DbUtils::query_execute_string(strQuery); //TODO: Handle errors. if(!test) std::cerr << G_STRFUNC << ": GRANT/REVOKE failed." << std::endl; return test; } void Dialog_GroupsList::on_treeview_tables_toggled_view(const Glib::ustring& path_string) { Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_model_tables->get_iter(path); if(iter) { Gtk::TreeRow row = *iter; //Toggle the value in the model: bool bActive = row[m_model_columns_tables.m_col_view]; bActive = !bActive; const Glib::ustring group_name = get_selected_group(); const Glib::ustring table_name = row[m_model_columns_tables.m_col_name]; bool test = set_table_privilege(table_name, group_name, bActive, PRIV_VIEW); if(test) row[m_model_columns_tables.m_col_view] = bActive; //If the group cannot view, then it should not do anything else either: if(!bActive) { bool test = set_table_privilege(table_name, group_name, bActive, PRIV_EDIT); if(test) row[m_model_columns_tables.m_col_edit] = false; test = set_table_privilege(table_name, group_name, bActive, PRIV_CREATE); if(test) row[m_model_columns_tables.m_col_create] = false; test = set_table_privilege(table_name, group_name, bActive, PRIV_DELETE); if(test) row[m_model_columns_tables.m_col_delete] = false; } } } void Dialog_GroupsList::on_treeview_tables_toggled_edit(const Glib::ustring& path_string) { Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_model_tables->get_iter(path); if(iter) { Gtk::TreeRow row = *iter; //Toggle the value in the model: bool bActive = row[m_model_columns_tables.m_col_edit]; bActive = !bActive; const Glib::ustring group_name = get_selected_group(); const Glib::ustring table_name = row[m_model_columns_tables.m_col_name]; bool test = set_table_privilege(table_name, group_name, bActive, PRIV_EDIT); if(test) row[m_model_columns_tables.m_col_edit] = bActive; } } void Dialog_GroupsList::on_treeview_tables_toggled_create(const Glib::ustring& path_string) { Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_model_tables->get_iter(path); if(iter) { Gtk::TreeRow row = *iter; //Toggle the value in the model: bool bActive = row[m_model_columns_tables.m_col_create]; bActive = !bActive; const Glib::ustring group_name = get_selected_group(); const Glib::ustring table_name = row[m_model_columns_tables.m_col_name]; const bool test = set_table_privilege(table_name, group_name, bActive, PRIV_CREATE); if(test) row[m_model_columns_tables.m_col_create] = bActive; } } void Dialog_GroupsList::on_treeview_tables_toggled_delete(const Glib::ustring& path_string) { Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_model_tables->get_iter(path); if(iter) { Gtk::TreeRow row = *iter; //Toggle the value in the model: bool bActive = row[m_model_columns_tables.m_col_delete]; bActive = !bActive; const Glib::ustring group_name = get_selected_group(); const Glib::ustring table_name = row[m_model_columns_tables.m_col_name]; const bool test = set_table_privilege(table_name, group_name, bActive, PRIV_DELETE); if(test) row[m_model_columns_tables.m_col_delete] = bActive; } } void Dialog_GroupsList::on_cell_data_group_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; Glib::ustring name = row[m_model_columns_groups.m_col_name]; renderer_text->property_text() = Privs::get_user_visible_group_name(name); } } } } //namespace Glom glom-1.22.4/glom/mode_design/users/dialog_choose_user.cc0000644000175000017500000000304112234252646024510 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_choose_user.h" namespace Glom { const char* Dialog_ChooseUser::glade_id("dialog_choose_user"); const bool Dialog_ChooseUser::glade_developer(true); Dialog_ChooseUser::Dialog_ChooseUser(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_combo_name(0) { builder->get_widget_derived("combo_user_name", m_combo_name); } Dialog_ChooseUser::~Dialog_ChooseUser() { } void Dialog_ChooseUser::set_user_list(const type_vec_strings& users) { for(type_vec_strings::const_iterator iter = users.begin(); iter != users.end(); ++iter) { m_combo_name->append(*iter); } m_combo_name->set_first_active(); } Glib::ustring Dialog_ChooseUser::get_user() const { return m_combo_name->get_active_text(); } } //namespace Glom glom-1.22.4/glom/mode_design/users/dialog_groups_list.h0000644000175000017500000001106412234252646024412 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_GROUPS_LIST_H #define GLOM_MODE_DESIGN_DIALOG_GROUPS_LIST_H #include #include #include #include #include namespace Glom { class Dialog_GroupsList : public Gtk::Dialog, public Base_DB { public: static const char* glade_id; static const bool glade_developer; Dialog_GroupsList(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_GroupsList(); //Refresh the UI when we get the document, from add_view: virtual void load_from_document(); /** * @param layout "list" or "details" * @param document The document, so that the dialog can load the previous layout, and save changes. * @param table_name The table name. * @param table_fields: The actual fields in the table, in case the document does not yet know about them all. */ //virtual void set_document(const Glib::ustring& layout, Document* document, const Glib::ustring& table_name, const type_vecLayoutFields& table_fields); private: void fill_group_list(); void fill_table_list(const Glib::ustring& group_name); Glib::ustring get_selected_group() const; void treeview_append_bool_column(Gtk::TreeView& treeview, const Glib::ustring& title, Gtk::TreeModelColumn& model_column, const sigc::slot& slot_toggled); //Enable/disable buttons, depending on treeview selection: virtual void enable_buttons(); virtual void save_to_document(); //signal handlers: virtual void on_button_group_delete(); virtual void on_button_group_new(); virtual void on_button_group_users(); virtual void on_treeview_groups_selection_changed(); virtual void on_treeview_tables_selection_changed(); virtual void on_treeview_tables_toggled_view(const Glib::ustring& path_string); virtual void on_treeview_tables_toggled_edit(const Glib::ustring& path_string); virtual void on_treeview_tables_toggled_create(const Glib::ustring& path_string); virtual void on_treeview_tables_toggled_delete(const Glib::ustring& path_string); enum enumPriv { PRIV_VIEW, PRIV_EDIT, PRIV_CREATE, PRIV_DELETE }; bool set_table_privilege(const Glib::ustring& table_name, const Glib::ustring& group_name, bool grant, enumPriv priv); void on_cell_data_group_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); // virtual void on_treeview_cell_edited_text(const Glib::ustring& path_string, const Glib::ustring& new_text, const Gtk::TreeModelColumn& model_column); // virtual void on_treeview_cell_edited_numeric(const Glib::ustring& path_string, const Glib::ustring& new_text, const Gtk::TreeModelColumn& model_column); class ModelColumnsTables : public Gtk::TreeModel::ColumnRecord { public: ModelColumnsTables() { add(m_col_name); add(m_col_title); add(m_col_view); add(m_col_edit); add(m_col_create); add(m_col_delete); } Gtk::TreeModelColumn m_col_name; //Not shown in view. Gtk::TreeModelColumn m_col_title; Gtk::TreeModelColumn m_col_view, m_col_edit, m_col_create, m_col_delete; }; ModelColumnsTables m_model_columns_tables; Gtk::TreeView* m_treeview_tables; Glib::RefPtr m_model_tables; class ModelColumnsGroups : public Gtk::TreeModel::ColumnRecord { public: ModelColumnsGroups() { add(m_col_name); add(m_col_description); } Gtk::TreeModelColumn m_col_name, m_col_description; }; ModelColumnsGroups m_model_columns_groups; Gtk::TreeView* m_treeview_groups; Gtk::Button* m_button_group_new; Gtk::Button* m_button_group_delete; Gtk::Button* m_button_group_users; Glib::RefPtr m_model_groups; }; } //namespace Glom #endif //GLOM_MODE_DESIGN_DIALOG_GROUPS_LIST_H glom-1.22.4/glom/mode_design/users/dialog_user.cc0000644000175000017500000000456112234252646023160 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_user.h" #include //For Frame_Glom::show_ok_dialog(). #include //#include #include namespace Glom { const char* Dialog_User::glade_id("dialog_user"); const bool Dialog_User::glade_developer(true); Dialog_User::Dialog_User(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject) { //builder->get_widget("label_table_name", m_label_table_name); builder->get_widget("entry_user", m_entry_user); m_entry_user->set_max_length(Privs::MAX_ROLE_SIZE); builder->get_widget_derived("combobox_group", m_combo_group); builder->get_widget("entry_password", m_entry_password); m_entry_password->set_max_length(Privs::MAX_ROLE_SIZE); //Let's assume that this has a similar (undocumented in PostgreSQL) max size as the user. builder->get_widget("entry_password_confirm", m_entry_password_confirm); m_entry_password_confirm->set_max_length(Privs::MAX_ROLE_SIZE); show_all_children(); } Dialog_User::~Dialog_User() { } bool Dialog_User::check_password() { if(m_entry_password->get_text() != m_entry_password_confirm->get_text()) { Frame_Glom::show_ok_dialog(_("Passwords Do Not Match"), _("The entered password does not match the entered password confirmation. Please try again."), *this, Gtk::MESSAGE_ERROR); return false; } else if(m_entry_password->get_text().empty()) { Frame_Glom::show_ok_dialog(_("Password Is Empty"), _("Please enter a password for this user."), *this, Gtk::MESSAGE_ERROR); return false; } else return true; } } //namespace Glom glom-1.22.4/glom/mode_design/users/dialog_new_group.cc0000644000175000017500000000256612234252646024212 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_new_group.h" #include namespace Glom { const char* Dialog_NewGroup::glade_id("dialog_new_group"); const bool Dialog_NewGroup::glade_developer(true); Dialog_NewGroup::Dialog_NewGroup(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_entry_name(0) { builder->get_widget("entry_group_name", m_entry_name); m_entry_name->set_max_length(Privs::MAX_ROLE_SIZE); //m_entry_name->signal_changed().connect( sigc::mem_fun(*this, &Dialog_NewGroup::on_entry_name_changed) ); } Dialog_NewGroup::~Dialog_NewGroup() { } } //namespace Glom glom-1.22.4/glom/mode_design/users/dialog_user.h0000644000175000017500000000360112234252646023014 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_USER_H #define GLOM_MODE_DESIGN_DIALOG_USER_H #include #include #include #include "../../utility_widgets/combo_textglade.h" namespace Glom { class Dialog_User : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; Dialog_User(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_User(); bool check_password(); /** * @param layout "list" or "details" * @param document The document, so that the dialog can load the previous layout, and save changes. * @param table_name The table name. * @param table_fields: The actual fields in the table, in case the document does not yet know about them all. */ //virtual void set_document(const Glib::ustring& layout, Document* document, const Glib::ustring& table_name, const type_vecLayoutFields& table_fields); Gtk::Entry* m_entry_user; Combo_TextGlade* m_combo_group; Gtk::Entry* m_entry_password; Gtk::Entry* m_entry_password_confirm; }; } //namespace Glom #endif //GLOM_MODE_DESIGN_DIALOG_USER_H glom-1.22.4/glom/mode_design/users/dialog_choose_user.h0000644000175000017500000000301012234252646024346 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_USERS_DIALOG_CHOOSE_USER_H #define GLOM_MODE_DESIGN_USERS_DIALOG_CHOOSE_USER_H #include #include #include #include "../../utility_widgets/combo_textglade.h" namespace Glom { class Dialog_ChooseUser : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; Dialog_ChooseUser(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ChooseUser(); typedef std::vector type_vec_strings; void set_user_list(const type_vec_strings& users); Glib::ustring get_user() const; private: Combo_TextGlade* m_combo_name; }; } //namespace Glom #endif //GLOM_MODE_DESIGN_USERS_DIALOG_CHOOSER_USER_H glom-1.22.4/glom/mode_design/users/dialog_new_group.h0000644000175000017500000000245012234252646024044 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_USERS_DIALOG_NEWGROUP_H #define GLOM_MODE_DESIGN_USERS_DIALOG_NEWGROUP_H #include #include #include namespace Glom { class Dialog_NewGroup : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; Dialog_NewGroup(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_NewGroup(); Gtk::Entry* m_entry_name; }; } //namespace Glom #endif //GLOM_MODE_DESIGN_USERS_DIALOG_NEWGROUP_H glom-1.22.4/glom/mode_design/users/dialog_users_list.h0000644000175000017500000000613412234252646024236 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_USERS_LIST_H #define GLOM_MODE_DESIGN_DIALOG_USERS_LIST_H #include #include #include #include #include #include namespace Glom { /** A dialog that lists the users in a group, * or all users if no group is selected. */ class Dialog_UsersList : public Gtk::Dialog, public Base_DB { public: static const char* glade_id; static const bool glade_developer; /** Call fill_list() after instantiating this class. */ Dialog_UsersList(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_UsersList(); /** Fill the list of users. */ void fill_list(); virtual void set_group(const Glib::ustring& group_name); private: //Enable/disable buttons, depending on treeview selection: virtual void enable_buttons(); virtual void save_to_document(); //signal handlers: virtual void on_button_user_delete(); virtual void on_button_user_add(); virtual void on_button_user_remove(); virtual void on_button_user_new(); virtual void on_button_user_edit(); virtual void on_treeview_users_selection_changed(); virtual void on_combo_group_changed(); /** Warn if the group is the developer group, and there is only one user remaining. * @result Whether the warning was necessary. */ virtual bool warn_about_empty_standard_group(); // virtual void on_treeview_cell_edited_text(const Glib::ustring& path_string, const Glib::ustring& new_text, const Gtk::TreeModelColumn& model_column); // virtual void on_treeview_cell_edited_numeric(const Glib::ustring& path_string, const Glib::ustring& new_text, const Gtk::TreeModelColumn& model_column); class ModelColumnsUsers : public Gtk::TreeModel::ColumnRecord { public: ModelColumnsUsers() { add(m_col_name); } Gtk::TreeModelColumn m_col_name; }; ModelColumnsUsers m_model_columns_users; Gtk::TreeView* m_treeview_users; Gtk::ComboBoxText* m_combo_group; Gtk::Button* m_button_user_add; Gtk::Button* m_button_user_remove; Gtk::Button* m_button_user_new; Gtk::Button* m_button_user_delete; Gtk::Button* m_button_user_edit; Glib::RefPtr m_model_users; }; } //namespace Glom #endif //GLOM_MODE_DESIGN_DIALOG_USERS_LIST_H glom-1.22.4/glom/mode_design/fields/0000755000175000017500000000000012235000127020435 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/fields/dialog_fielddefinition.h0000644000175000017500000000655112234252646025306 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_FIELDDEFINITION_H #define GLOM_MODE_DESIGN_DIALOG_FIELDDEFINITION_H #include #include #include #include #include #include #include "combo_fieldtype.h" //#include "../../utility_widgets/entry_numerical.h" #include "../../utility_widgets/dialog_properties.h" #include #include #include #include #include namespace Glom { class Dialog_FieldDefinition : public Dialog_Properties, public Base_DB //Give this class access to the current document, and to some utility methods. { public: static const char* glade_id; static const bool glade_developer; Dialog_FieldDefinition(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_FieldDefinition(); virtual void set_field(const sharedptr& field, const Glib::ustring& table_name); virtual sharedptr get_field() const; //TODO_FieldShared private: //Signal handlers: void on_combo_type_changed(); void on_combo_lookup_relationship_changed(); void on_check_lookup_toggled(); void on_radio_calculate_toggled(); void on_radio_userentry_toggled(); void on_button_edit_calculation(); //void on_foreach(Gtk::Widget& widget); //Disable/enable other controls when a control is selected. virtual void enforce_constraints(); //override. Gtk::Entry* m_pEntry_Name; Combo_FieldType* m_pCombo_Type; Gtk::CheckButton* m_pCheck_Unique; Gtk::CheckButton* m_pCheck_NotNull; Gtk::Box* m_pBox_DefaultValueSimple; Gtk::CheckButton* m_pCheck_PrimaryKey; Gtk::CheckButton* m_pCheck_AutoIncrement; Gtk::Box* m_pBox_ValueTab; Gtk::RadioButton* m_pRadio_UserEntry; Gtk::Alignment* m_pAlignment_UserEntry; Gtk::CheckButton* m_pCheck_Lookup; Gtk::Widget* m_pTable_Lookup; //So we can make it insensitive. ComboBox_Relationship* m_pCombo_LookupRelationship; Gtk::ComboBoxText* m_pCombo_LookupField; Gtk::RadioButton* m_pRadio_Calculate; Gtk::Alignment* m_pAlignment_Calculate; Gsv::View* m_pTextView_Calculation; Gtk::Button* m_pButton_EditCalculation; Gtk::Entry* m_pEntry_Title; DataWidget* m_pDataWidget_DefaultValueSimple; Gtk::Box* m_box_formatting_placeholder; Box_Formatting* m_box_formatting; sharedptr m_Field; Glib::ustring m_table_name; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_FIELDDEFINITION_H glom-1.22.4/glom/mode_design/fields/dialog_fieldcalculation.cc0000644000175000017500000001416412234252646025611 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_fieldcalculation.h" #include "../../box_db_table.h" #include #include #include #include #include #include //#include #include namespace Glom { const char* Dialog_FieldCalculation::glade_id("window_field_calculation"); const bool Dialog_FieldCalculation::glade_developer(true); Dialog_FieldCalculation::Dialog_FieldCalculation(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject) { builder->get_widget("textview_calculation", m_text_view); builder->get_widget("button_test", m_button_test); builder->get_widget("label_triggered_by", m_label_triggered_by); m_button_test->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_FieldCalculation::on_button_test) ); //on_foreach_connect(*this); if(m_text_view) { m_text_view->set_highlight_current_line(true); Glib::RefPtr languages_manager = Gsv::LanguageManager::get_default(); Glib::RefPtr language = languages_manager->get_language("python"); //This is the GtkSourceView language ID. if(language) { //Createa a new buffer and set it, instead of getting the default buffer, in case libglade has tried to set it, using the wrong buffer type: Glib::RefPtr buffer = Gsv::Buffer::create(language); buffer->set_highlight_syntax(); m_text_view->set_buffer(buffer); } } //Dialog_Properties::set_modified(false); show_all_children(); } Dialog_FieldCalculation::~Dialog_FieldCalculation() { } void Dialog_FieldCalculation::set_field(const sharedptr& field, const Glib::ustring& table_name) { //set_blocked(); m_field = glom_sharedptr_clone(field); //Remember it so we save any details that are not in our UI. m_table_name = table_name; //Used for lookup combo boxes. m_text_view->get_buffer()->set_text( field->get_calculation() ); //set_blocked(false); //Dialog_Properties::set_modified(false); } sharedptr Dialog_FieldCalculation::get_field() const { sharedptr field = glom_sharedptr_clone(m_field); //Start with the old details, to preserve anything that is not in our UI. field->set_calculation( m_text_view->get_buffer()->get_text() ); return field; } bool Dialog_FieldCalculation::check_for_return_statement(const Glib::ustring& calculation) { if(calculation.find("return") == Glib::ustring::npos) { Frame_Glom::show_ok_dialog(_("Calculation Error"), _("The calculation does not have a return statement."), *this); return false; } return true; } void Dialog_FieldCalculation::on_button_test() { const Glib::ustring calculation = m_text_view->get_buffer()->get_text(); if(!check_for_return_statement(calculation)) return; if(!Utils::script_check_for_pygtk2_with_warning(calculation, this)) return; type_map_fields field_values; Document* document = get_document(); if(document) { const Document::type_vec_fields fields = document->get_table_fields(m_table_name); for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { const sharedptr field = *iter; const Gnome::Gda::Value example_value = Conversions::get_example_value(field->get_glom_type()); field_values[field->get_name()] = example_value; } } //We need the connection when we run the script, so that the script may use it. sharedptr sharedconnection = connect_to_server(this /* parent window */); Glib::ustring error_message; const Gnome::Gda::Value value = glom_evaluate_python_function_implementation( Field::TYPE_TEXT, calculation, field_values, //TODO: Maybe use the field's type here. document, m_table_name, sharedptr(), Gnome::Gda::Value(), // primary key - only used when setting values in the DB. sharedconnection->get_gda_connection(), error_message); if(error_message.empty()) Utils::show_ok_dialog(_("Calculation result"), Glib::ustring::compose(_("The result of the calculation is:\n%1"), value.to_string()), *this, Gtk::MESSAGE_INFO); else Utils::show_ok_dialog( _("Calculation failed"), Glib::ustring::compose(_("The calculation failed with this error:\n%s"), error_message), *this, Gtk::MESSAGE_ERROR); //Show what fields would trigger the recalculation: sharedptr temp = sharedptr::create(); temp->set_calculation(calculation); sharedptr layoutitem_temp = sharedptr::create(); layoutitem_temp->set_full_field_details(temp); const type_list_const_field_items triggered_fields = get_calculation_fields(m_table_name, layoutitem_temp); Glib::ustring field_names; for(type_list_const_field_items::const_iterator iter = triggered_fields.begin(); iter != triggered_fields.end(); ++iter) { field_names += ( (*iter)->get_layout_display_name() + ", " ); } const Field::type_list_strings triggered_relationships = temp->get_calculation_relationships(); for(Field::type_list_strings::const_iterator iter = triggered_relationships.begin(); iter != triggered_relationships.end(); ++iter) { field_names += ( "related(" + *iter + "), " ); } m_label_triggered_by->set_text(field_names); } } //namespace Glom glom-1.22.4/glom/mode_design/fields/dialog_fieldcalculation.h0000644000175000017500000000361412234252646025451 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_FIELDCALCULATION_H #define GLOM_MODE_DESIGN_DIALOG_FIELDCALCULATION_H #include #include #include #include #include #include #include namespace Glom { class Dialog_FieldCalculation : public Gtk::Dialog, public Base_DB //Give this class access to the current document, and to some utility methods. { public: static const char* glade_id; static const bool glade_developer; Dialog_FieldCalculation(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_FieldCalculation(); void set_field(const sharedptr& field, const Glib::ustring& table_name); sharedptr get_field() const; private: void on_button_test(); bool check_for_return_statement(const Glib::ustring& calculation); Gsv::View* m_text_view; Gtk::Button* m_button_test; Gtk::Label* m_label_triggered_by; sharedptr m_field; Glib::ustring m_table_name; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_FIELDCALCULATION_H glom-1.22.4/glom/mode_design/fields/combo_fieldtype.h0000644000175000017500000000453312234252646023775 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_COMBO_FIELDTYPE_H #define GLOM_MODE_DESIGN_COMBO_FIELDTYPE_H #include #include #include #include namespace Glom { //Predicate for use with algorithms with maps. template class pred_mapPair_HasValue { public: typedef typename T_map::mapped_type type_value; //earlier versions of gcc had data_type instead of mapped_type. typedef std::pair type_pair; pred_mapPair_HasValue(type_value valueToFind) { m_valueToFind = valueToFind; } virtual ~pred_mapPair_HasValue() { } bool operator()(const type_pair& item) const { return item.second == m_valueToFind; } private: type_value m_valueToFind; }; class Combo_FieldType : public Gtk::ComboBox { public: Combo_FieldType(); Combo_FieldType(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Combo_FieldType(); //set/get the text in terms of enumerated type: virtual void set_field_type(Field::glom_field_type fieldType); virtual Field::glom_field_type get_field_type() const; private: void init(); //Tree model columns: class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_name); add(m_col_type); } Gtk::TreeModelColumn m_col_name; Gtk::TreeModelColumn m_col_type; }; ModelColumns m_Columns; Glib::RefPtr m_refTreeModel; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_COMBO_FIELDTYPE_H glom-1.22.4/glom/mode_design/fields/box_db_table_definition.h0000644000175000017500000000512212234776363025447 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_BOX_DB_TABLE_DEFINITION_H #define GLOM_MODE_DESIGN_BOX_DB_TABLE_DEFINITION_H #include "../../box_db_table.h" #include "dialog_fielddefinition.h" namespace Glom { class Box_DB_Table_Definition : public Box_DB_Table { public: Box_DB_Table_Definition(); Box_DB_Table_Definition(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Box_DB_Table_Definition(); private: void init(); //Avoid duplicating code in constructors. virtual bool fill_from_database(); virtual void fill_fields(); void fill_field_row(const Gtk::TreeModel::iterator& iter, const sharedptr& field); sharedptr get_field_definition(const Gtk::TreeModel::iterator& row); sharedptr change_definition(const sharedptr& fieldOld, const sharedptr& field); bool field_has_null_values(const sharedptr& field); bool field_has_non_unique_values(const sharedptr& field); //Signal handlers: virtual void on_adddel_add(const Gtk::TreeModel::iterator& row); virtual void on_adddel_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& rowEnd); virtual void on_adddel_changed(const Gtk::TreeModel::iterator& row, guint col); virtual void on_adddel_edit(const Gtk::TreeModel::iterator& row); virtual void on_Properties_apply(); bool check_field_change(const sharedptr& field_old, const sharedptr& field_new); mutable AddDel_WithButtons m_AddDel; //mutable because its get_ methods aren't const. guint m_colName, m_colTitle, m_colType, m_colUnique, m_colPrimaryKey; Dialog_FieldDefinition* m_pDialog; sharedptr m_Field_BeingEdited; //TODO_FieldShared type_vec_fields m_vecFields; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_BOX_DB_TABLE_DEFINITION_H glom-1.22.4/glom/mode_design/fields/dialog_fielddefinition.cc0000644000175000017500000003450112234776363025447 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_fielddefinition.h" #include "dialog_fieldcalculation.h" #include #include #include #include "../../box_db_table.h" #include //#include #include namespace Glom { const char* Dialog_FieldDefinition::glade_id("window_field_definition_edit"); const bool Dialog_FieldDefinition::glade_developer(true); Dialog_FieldDefinition::Dialog_FieldDefinition(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Properties(cobject, builder), m_pDataWidget_DefaultValueSimple(0), m_box_formatting_placeholder(0), m_box_formatting(0) { builder->get_widget_derived("combobox_type", m_pCombo_Type); builder->get_widget("entry_name", m_pEntry_Name); builder->get_widget("entry_title", m_pEntry_Title); builder->get_widget("checkbutton_unique", m_pCheck_Unique); builder->get_widget("checkbutton_primarykey", m_pCheck_PrimaryKey); builder->get_widget("checkbutton_autoincrement", m_pCheck_AutoIncrement); builder->get_widget("hbox_default_value_simple", m_pBox_DefaultValueSimple); builder->get_widget("box_default_value", m_pBox_ValueTab); builder->get_widget("radiobutton_userentry", m_pRadio_UserEntry); builder->get_widget("alignment_userentry", m_pAlignment_UserEntry); builder->get_widget("checkbutton_lookup", m_pCheck_Lookup); builder->get_widget("table_lookup", m_pTable_Lookup); builder->get_widget_derived("combobox_lookup_relationship", m_pCombo_LookupRelationship); builder->get_widget("combobox_lookup_field", m_pCombo_LookupField); builder->get_widget("radiobutton_calculate", m_pRadio_Calculate); builder->get_widget("alignment_calculate", m_pAlignment_Calculate); builder->get_widget("textview_calculate", m_pTextView_Calculation); builder->get_widget("button_edit_calculation", m_pButton_EditCalculation); //Connect signals: m_pCombo_Type->signal_changed().connect( sigc::mem_fun(*this, &Dialog_FieldDefinition::on_combo_type_changed) ); m_pCombo_LookupRelationship->signal_changed().connect( sigc::mem_fun(*this, &Dialog_FieldDefinition::on_combo_lookup_relationship_changed) ); m_pCheck_Lookup->signal_toggled().connect( sigc::mem_fun(*this, &Dialog_FieldDefinition::on_check_lookup_toggled) ); m_pRadio_Calculate->signal_toggled().connect( sigc::mem_fun(*this, &Dialog_FieldDefinition::on_radio_calculate_toggled) ); m_pRadio_UserEntry->signal_toggled().connect( sigc::mem_fun(*this, &Dialog_FieldDefinition::on_radio_userentry_toggled) ); m_pButton_EditCalculation->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_FieldDefinition::on_button_edit_calculation) ); //TODO: //Connect every widget to on_anything_changed(): //foreach_( (GtkCallback)(&on_foreach), this); //Crashes several levels down. //on_anything_changed(); //In the meantime, we'll just start with [Apply] already enabled. //Make sure that the correct Type Details are showing: on_combo_type_changed(); //Formatting: //Get the place to put the Formatting stuff: builder->get_widget("box_formatting_placeholder", m_box_formatting_placeholder); //Get the formatting stuff: Utils::get_glade_child_widget_derived_with_warning(m_box_formatting); if(m_box_formatting) ////Unlikely to fail and it already warns on stderr. m_box_formatting_placeholder->pack_start(*m_box_formatting); add_view(m_box_formatting); on_foreach_connect(*this); on_foreach_connect(*m_pBox_DefaultValueSimple); on_foreach_connect(*m_pBox_ValueTab); if(m_box_formatting) { on_foreach_connect(*m_box_formatting); //Plus an extra signal for the related extra show-also fields: m_box_formatting->signal_modified().connect( sigc::mem_fun(*this, &Dialog_FieldDefinition::on_anything_changed)); } Dialog_Properties::set_modified(false); show_all_children(); } Dialog_FieldDefinition::~Dialog_FieldDefinition() { remove_view(m_box_formatting); } void Dialog_FieldDefinition::set_field(const sharedptr& field, const Glib::ustring& table_name) { set_blocked(); m_Field = glom_sharedptr_clone(field); //Remember it so we save any details that are not in our UI. m_table_name = table_name; //Used for lookup combo boxes. //Set the Widgets from the field info: //const Glib::RefPtr& fieldInfo = field->get_field_info(); m_pEntry_Name->set_text(field->get_name()); m_pCombo_Type->set_field_type( field->get_glom_type() ); m_pCheck_Unique->set_active(field->get_unique_key()); m_pCheck_PrimaryKey->set_active(field->get_primary_key()); m_pCheck_AutoIncrement->set_active(field->get_auto_increment()); //Glom-specific details: //Default value bool disable_default_value = false; if(field->get_auto_increment()) //Ignore default_values for auto_increment fields - it's just some obscure postgres code. disable_default_value = true; //Default value: simple: Gnome::Gda::Value default_value; if(!disable_default_value) default_value = m_Field->get_default_value(); //Create an appropriate DataWidget for the default value: delete m_pDataWidget_DefaultValueSimple; m_pDataWidget_DefaultValueSimple = 0; //We use a regular DataWidget for the default value, so we can reuse its functionality, //but it's not a real field - hence the special title. sharedptr layout_item = sharedptr::create(); sharedptr field_default_value = glom_sharedptr_clone(m_Field); field_default_value->set_name("glom_temp_default_value"); field_default_value->set_title_original(_("Default Value")); layout_item->set_full_field_details(field_default_value); m_pDataWidget_DefaultValueSimple = Gtk::manage( new DataWidget(layout_item, "", get_document()) ); if(!m_pDataWidget_DefaultValueSimple->get_data_child_widget()) std::cerr << G_STRFUNC << ": The DataWidget did not create a child widget." << std::endl; on_foreach_connect(*m_pDataWidget_DefaultValueSimple); Gtk::Label* pLabel = m_pDataWidget_DefaultValueSimple->get_label(); if(!pLabel->get_text().empty()) m_pBox_DefaultValueSimple->pack_start(*pLabel); m_pBox_DefaultValueSimple->pack_end(*m_pDataWidget_DefaultValueSimple, Gtk::PACK_EXPAND_WIDGET); m_pDataWidget_DefaultValueSimple->set_value(default_value); m_pDataWidget_DefaultValueSimple->show(); //Default value: lookup: m_pCheck_Lookup->set_active(m_Field->get_is_lookup()); on_check_lookup_toggled(); //Fill the lookup relationships combo: Document* document = dynamic_cast(get_document()); if(document) { const Document::type_vec_relationships vecRelationships = document->get_relationships(table_name); m_pCombo_LookupRelationship->set_relationships(vecRelationships); } sharedptr lookup_relationship; if(!disable_default_value) lookup_relationship = m_Field->get_lookup_relationship(); m_pCombo_LookupRelationship->set_selected_relationship(lookup_relationship); on_combo_lookup_relationship_changed(); //Put the correct list of fields in the fields combo. Glib::ustring lookup_field_name; if(!disable_default_value) lookup_field_name = m_Field->get_lookup_field(); m_pCombo_LookupField->set_active_text(lookup_field_name); //Calculation: const Glib::ustring calculation = field->get_calculation(); if(calculation.empty()) m_pRadio_UserEntry->set_active(); else m_pRadio_Calculate->set_active(); on_check_lookup_toggled(); //std::cout << "debug: dialog_fielddefinition.c:: m_pTextView_Calculation.gobj() gtype = " << G_OBJECT_TYPE_NAME(m_pTextView_Calculation->gobj()) << std::endl; m_pTextView_Calculation->get_buffer()->set_text(calculation); //std::cout << " debug: dialog_fielddefinition.c:: after get_buffer()" << std::endl; m_pEntry_Title->set_text(item_get_title(field)); //Formatting: m_box_formatting->set_formatting_for_field(field->m_default_formatting, m_table_name, field); set_blocked(false); enforce_constraints(); Dialog_Properties::set_modified(false); } sharedptr Dialog_FieldDefinition::get_field() const { sharedptr field = glom_sharedptr_clone(m_Field); //Start with the old details, to preserve anything that is not in our UI. // const_cast is necessary and save here for the window (jhs) sharedptr sharedcnc = connect_to_server(const_cast(this)); Glib::RefPtr cnc = sharedcnc->get_gda_connection(); //Get the field info from the widgets: Glib::RefPtr fieldInfo = field->get_field_info(); //Preserve previous information. fieldInfo->set_name(m_pEntry_Name->get_text()); fieldInfo->set_g_type( Field::get_gda_type_for_glom_type( m_pCombo_Type->get_field_type() ) ); fieldInfo->set_auto_increment(m_pCheck_AutoIncrement->get_active()); if(!fieldInfo->get_auto_increment()) //Ignore default_values for auto_increment fields - it's just some obscure postgres code. { //Simple default value: fieldInfo->set_default_value( m_pDataWidget_DefaultValueSimple->get_value() ); } //Lookup: const bool is_lookup = m_pCheck_Lookup->get_active(); sharedptr relationship; if(is_lookup) relationship = m_pCombo_LookupRelationship->get_selected_relationship(); field->set_lookup_relationship(relationship); Glib::ustring lookup_field; if(is_lookup) lookup_field = m_pCombo_LookupField->get_active_text(); field->set_lookup_field(lookup_field); //Calculation: if(m_pRadio_Calculate) field->set_calculation(m_pTextView_Calculation->get_buffer()->get_text()); Glib::RefPtr field_info_copy = fieldInfo; field->set_field_info(fieldInfo); //Glom-specific details: field->set_unique_key(m_pCheck_Unique->get_active()); field->set_primary_key(m_pCheck_PrimaryKey->get_active()); field->set_title(m_pEntry_Title->get_text(), AppWindow::get_current_locale()); //Formatting: m_box_formatting->get_formatting(field->m_default_formatting); return field; } void Dialog_FieldDefinition::on_combo_type_changed() { //Display appropriate Table of widgets for this type: //m_Frame_TypeDetails.remove(); //Use FieldType static method to categorise field type: // glom_field_type fieldType = m_pCombo_Type->get_field_type(); } void Dialog_FieldDefinition::enforce_constraints() { if(m_pCheck_PrimaryKey->get_active()) { m_pCheck_Unique->set_active(true); //Primary keys must be unique. m_pCheck_Unique->set_sensitive(false); //Stop the user from disagreeing with that. } else m_pCheck_Unique->set_sensitive(true); if(m_pCheck_Unique->get_active() || m_pCheck_AutoIncrement->get_active()) { m_pBox_ValueTab->set_sensitive(false); //Disable all controls on the Notebook page. m_pDataWidget_DefaultValueSimple->set_value( Gnome::Gda::Value() ); //Unique fields cannot have default values. //TODO: People will be surprised when they lose information here. We should probably read the text as "" if the widget is disabled. } else { m_pBox_ValueTab->set_sensitive(true); } const bool enable_calc = m_pRadio_Calculate->get_active(); m_pAlignment_Calculate->set_sensitive(enable_calc); const bool enable_userentry = m_pRadio_UserEntry->get_active(); m_pAlignment_UserEntry->set_sensitive(enable_userentry); } void Dialog_FieldDefinition::on_check_lookup_toggled() { bool enable = m_pCheck_Lookup->get_active(); m_pTable_Lookup->set_sensitive(enable); //re-disable it if it was not meant to be enabled: enforce_constraints(); } void Dialog_FieldDefinition::on_radio_calculate_toggled() { bool enable = m_pRadio_Calculate->get_active(); m_pAlignment_Calculate->set_sensitive(enable); //re-disable it if it was not meant to be enabled: enforce_constraints(); } void Dialog_FieldDefinition::on_radio_userentry_toggled() { bool enable = m_pRadio_UserEntry->get_active(); m_pAlignment_UserEntry->set_sensitive(enable); //re-disable it if it was not meant to be enabled: enforce_constraints(); } void Dialog_FieldDefinition::on_combo_lookup_relationship_changed() { //Get the fields that are avaiable from the new relationship: m_pCombo_LookupField->remove_all(); //Get the relationship name: sharedptr relationship = m_pCombo_LookupRelationship->get_selected_relationship(); if(relationship) { //Get the relationship details: Document* document = dynamic_cast(get_document()); if(document) { const Glib::ustring to_table = relationship->get_to_table(); if(!to_table.empty()) { //Get the fields in the other table, and add them to the combo: const type_vec_fields fields_in_to_table = DbUtils::get_fields_for_table(document, to_table); for(type_vec_fields::const_iterator iter = fields_in_to_table.begin(); iter != fields_in_to_table.end(); ++iter) { m_pCombo_LookupField->append((*iter)->get_name()); } } } } } void Dialog_FieldDefinition::on_button_edit_calculation() { //TODO: Share a global instance, to make this quicker? Dialog_FieldCalculation* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; add_view(dialog); //Give it access to the document. m_Field->set_calculation( m_pTextView_Calculation->get_buffer()->get_text() ); dialog->set_field(m_Field, m_table_name); //TODO: dialog.set_transient_for(*get_app_window()); const int response = Glom::Utils::dialog_run_with_help(dialog); if(response == Gtk::RESPONSE_OK) { m_pTextView_Calculation->get_buffer()->set_text( dialog->get_field()->get_calculation() ); } remove_view(dialog); delete dialog; } } //namespace Glom glom-1.22.4/glom/mode_design/fields/box_db_table_definition.cc0000644000175000017500000006140612234776363025614 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "box_db_table_definition.h" #include #include #include //For bold_message()). #include #include #include #include #include namespace Glom { Box_DB_Table_Definition::Box_DB_Table_Definition() { init(); } Box_DB_Table_Definition::Box_DB_Table_Definition(BaseObjectType* cobject, const Glib::RefPtr& builder) : Box_DB_Table(cobject, builder) { init(); } void Box_DB_Table_Definition::init() { //m_strHint = _("Click [Edit] to edit the field definition in more detail.\nUse the Mode menu to see Data or perform a Find."); Utils::get_glade_widget_derived_with_warning(m_pDialog); add_view(m_pDialog); //Give it access to the document. pack_start(m_AddDel); m_colName = m_AddDel.add_column(_("Name")); m_AddDel.prevent_duplicates(m_colName); //Don't allow adding of fields that already exist. m_AddDel.set_prevent_duplicates_warning(_("This field already exists. Please choose a different field name")); m_colTitle = m_AddDel.add_column(_("Title")); m_colType = m_AddDel.add_column(_("Type"), AddDelColumnInfo::STYLE_Choices); m_AddDel.set_column_width(m_colType, 100); //TODO: Auto-size columns. //Set Type choices: Field::type_map_type_names mapFieldTypes = Field::get_usable_type_names(); AddDel::type_vec_strings vecTypes; for(Field::type_map_type_names ::iterator iter = mapFieldTypes.begin(); iter != mapFieldTypes.end();++iter) { const Glib::ustring& name = (*iter).second; vecTypes.push_back(name); } m_AddDel.set_column_choices(m_colType, vecTypes); m_colUnique = m_AddDel.add_column("Unique", AddDelColumnInfo::STYLE_Boolean); m_colPrimaryKey = m_AddDel.add_column("Primary Key", AddDelColumnInfo::STYLE_Boolean); //Connect signals: m_AddDel.signal_user_added().connect(sigc::mem_fun(*this, &Box_DB_Table_Definition::on_adddel_add)); m_AddDel.signal_user_requested_delete().connect(sigc::mem_fun(*this, &Box_DB_Table_Definition::on_adddel_delete)); m_AddDel.signal_user_changed().connect(sigc::mem_fun(*this, &Box_DB_Table_Definition::on_adddel_changed)); m_AddDel.signal_user_requested_edit().connect(sigc::mem_fun(*this, &Box_DB_Table_Definition::on_adddel_edit)); //React to changes in the field properties: m_pDialog->signal_apply().connect(sigc::mem_fun(*this, &Box_DB_Table_Definition::on_Properties_apply)); } Box_DB_Table_Definition::~Box_DB_Table_Definition() { if(m_pDialog) { remove_view(m_pDialog); delete m_pDialog; } } void Box_DB_Table_Definition::fill_field_row(const Gtk::TreeModel::iterator& iter, const sharedptr& field) { m_AddDel.set_value_key(iter, field->get_name()); m_AddDel.set_value(iter, m_colName, field->get_name()); const Glib::ustring title = item_get_title(field); m_AddDel.set_value(iter, m_colTitle, title); //Type: //Field::glom_field_type fieldType = Field::get_glom_type_for_gda_type(field->get_field_info()->get_g_type()); //Could be TYPE_INVALID if the gda type is not one of ours. // TODO: Why was this done by converting the field's gtype to a glom type // instead of using the glom type directly? This breaks numerical types in // sqlite which we store as double. Field::glom_field_type fieldType = field->get_glom_type(); const Glib::ustring strType = Field::get_type_name_ui( fieldType ); m_AddDel.set_value(iter, m_colType, strType); //Unique: const bool bUnique = field->get_unique_key(); m_AddDel.set_value(iter, m_colUnique, bUnique); //Primary Key: const bool bPrimaryKey = field->get_primary_key(); m_AddDel.set_value(iter, m_colPrimaryKey, bPrimaryKey); } bool Box_DB_Table_Definition::fill_from_database() { bool result = Box_DB_Table::fill_from_database(); if(!result) { std::cerr << G_STRFUNC << ": Box_DB_Table::fill_from_database() failed." << std::endl; return false; } if(!(ConnectionPool::get_instance()->get_ready_to_connect())) return false; fill_fields(); try { //Fields: m_AddDel.remove_all(); Field::type_map_type_names mapFieldTypes = Field::get_type_names_ui(); for(type_vec_fields::iterator iter = m_vecFields.begin(); iter != m_vecFields.end(); ++iter) { const sharedptr& field = *iter; //Name: Gtk::TreeModel::iterator tree_iter= m_AddDel.add_item(field->get_name()); fill_field_row(tree_iter, field); } result = true; } catch(const Glib::Exception& ex) { handle_error(ex); result = false; } catch(const std::exception& ex) { handle_error(ex); result = false; } return result; } void Box_DB_Table_Definition::on_adddel_add(const Gtk::TreeModel::iterator& row) { Glib::ustring name = m_AddDel.get_value(row, m_colName); if(!name.empty()) { sharedptr field(new Field()); field->set_name(name); field->set_title( Utils::title_from_string(name) , AppWindow::get_current_locale()); //Start with a title that might be useful. field->set_glom_type(Field::TYPE_NUMERIC); Glib::RefPtr field_info = field->get_field_info(); field_info->set_g_type( Field::get_gda_type_for_glom_type(Field::TYPE_NUMERIC) ); field->set_field_info(field_info); //TODO: Warn about a delay before actually doing this when the backend //needs to recreate the whole table. const bool bTest = DbUtils::add_column(m_table_name, field, get_app_window()); //TODO: Get schema type for Field::TYPE_NUMERIC if(bTest) { //Store the generated title in the document: //on_adddel_changed(row, m_colTitle); // Don't call on_adddel_changed for this, since this does a lot of // unnecessary extra stuff just to get the field added into the // document: Document* pDoc = static_cast(get_document()); if(pDoc) { std::cout << field->get_glom_type() << std::endl; Document::type_vec_fields vecFields = pDoc->get_table_fields(m_table_name); vecFields.push_back(field); pDoc->set_table_fields(m_table_name, vecFields); } // Do this after having added the new field to the document, so // Base_DB::get_fields_for_table() can use it to compare the fields from // the database against. //Show the new field (fill in the other cells): //Update our list of database fields. fill_fields(); //fill_from_database(); //We cannot change the structure in a cell renderer signal handler. fill_field_row(row, field); m_AddDel.select_item(field->get_name(), m_colName, false); //m_AddDel.select_item(row, m_colTitle, true); //Start editing the title } } } void Box_DB_Table_Definition::on_adddel_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& rowEnd) { Gtk::TreeModel::iterator iterAfterEnd = rowEnd; if(iterAfterEnd != m_AddDel.get_model()->children().end()) ++iterAfterEnd; for(Gtk::TreeModel::iterator iter = rowStart; iter != iterAfterEnd; ++iter) { Glib::ustring name = m_AddDel.get_value_key(iter); if(!name.empty()) { //TODO: Warn about a delay before actually doing this when the backend //needs to recreate the whole table. const bool test = DbUtils::drop_column(m_table_name, name); if(test) { //update_gda_metastore_for_table(m_table_name); // already done in drop_column(). //Remove it from all layouts, reports, etc: get_document()->remove_field(m_table_name, name); } else std::cerr << G_STRFUNC << ": field deletion failed." << std::endl; } } fill_fields(); fill_from_database(); } bool Box_DB_Table_Definition::check_field_change(const sharedptr& field_old, const sharedptr& field_new) { bool result = true; //Tells the caller whether to continue. Gtk::Window* parent_window = get_app_window(); //Warn about a long slow recalculation, and offer the chance to cancel it: if(field_new->get_has_calculation()) { if(field_new->get_calculation() != field_old->get_calculation()) { //TODO: Only show this when there are > 100 records? Gtk::MessageDialog dialog(Utils::bold_message(_("Recalculation Required")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE); dialog.set_secondary_text(_("You have changed the calculation used by this field so Glom must recalculate the value in all records. If the table contains many records then this could take a long time.")); if(parent_window) dialog.set_transient_for(*parent_window); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Recalculate"), Gtk::RESPONSE_OK); result = (dialog.run() == Gtk::RESPONSE_OK); } } //If we are changing a non-glom type: //Refuse to edit field definitions that were not created by glom: if(field_old->get_glom_type() == Field::TYPE_INVALID) { Utils::show_ok_dialog(_("Invalid database structure"), _("This database field was created or edited outside of Glom. It has a data type that is not supported by Glom. Your system administrator may be able to correct this."), parent_window, Gtk::MESSAGE_ERROR); return false; } //Refuse to have no primary key set: if(field_old->get_primary_key() && !field_new->get_primary_key()) //Was the primary key column unchecked? { Utils::show_ok_dialog(_("Primary key required"), _("You may not unset the primary key because the table must have a primary key. You may set another field as the primary key instead."), parent_window, Gtk::MESSAGE_ERROR); return false; } //Setting a different primary key: if(field_new->get_primary_key() && !field_old->get_primary_key()) //Was the primary key column checked? { //Check for nulls: if(field_has_null_values(field_old)) //Use the fieldOld because we only use the name, and we want to check the _existing_ field: { Utils::show_ok_dialog(_("Field contains empty values."), _("The field may not yet be used as a primary key because it contains empty values."), parent_window, Gtk::MESSAGE_ERROR); //TODO: Offer to fill it in with generated ID numbers? That could give strange results if the existing values are human-readable. return false; } //Check that the values are unique: if(field_has_non_unique_values(field_old)) //Use the fieldOld because we only use the name, and we want to check the _existing_ field: { Utils::show_ok_dialog(_("Field contains non-unique values."), _("The field may not yet be used as a primary key because it contains values that are not unique."), parent_window, Gtk::MESSAGE_ERROR); return false; } //Ask the user to confirm this major change: Gtk::MessageDialog dialog(Utils::bold_message(_("Change primary key")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE); dialog.set_secondary_text(_("Are you sure that you wish to set this field as the primary key, instead of the existing primary key?")); if(parent_window) dialog.set_transient_for(*parent_window); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Change Primary Key"), Gtk::RESPONSE_OK); if(dialog.run() != Gtk::RESPONSE_OK) return false; //Otherwise, continue, allowing the change. } //Refuse to change a field name to the same as an existing one: if( (field_new->get_name() != field_old->get_name()) && (DbUtils::get_field_exists_in_database(m_table_name, field_new->get_name())) ) { std::cout << "get_field_exists_in_database(" << m_table_name << ", " << field_new->get_name() << ") returned true" << std::endl; //Warn the user and refuse to make the change: Utils::show_ok_dialog(_("Field Name Already Exists"), _("This field already exists. Please choose a different field name"), parent_window, Gtk::MESSAGE_ERROR); return false; } return result; } void Box_DB_Table_Definition::on_adddel_changed(const Gtk::TreeModel::iterator& row, guint /* col */) { //Get old field definition: Document* pDoc = static_cast(get_document()); if(pDoc) { const Glib::ustring strFieldNameBeingEdited = m_AddDel.get_value_key(row); sharedptr constfield = pDoc->get_field(m_table_name, strFieldNameBeingEdited); m_Field_BeingEdited = constfield; //Get DB field info: (TODO: This might be unnecessary). type_vec_fields::const_iterator iterFind = std::find_if( m_vecFields.begin(), m_vecFields.end(), predicate_FieldHasName(strFieldNameBeingEdited) ); if(iterFind == m_vecFields.end()) //If it was not found: std::cerr << G_STRFUNC << ": field not found: " << strFieldNameBeingEdited << std::endl; else { sharedptr constfield = *iterFind; m_Field_BeingEdited = constfield; //Get new field definition: sharedptr fieldNew = get_field_definition(row); //Change it: if(*m_Field_BeingEdited != *fieldNew) //If it has really changed. { const bool bcontinue = check_field_change(m_Field_BeingEdited, fieldNew); if(bcontinue) { sharedptr fieldNewWithModifications = change_definition(m_Field_BeingEdited, fieldNew); //Update the row to show any extra changes (such as unique being set/unset whenever the primary key is set/unset) // TODO: When change_definition decides to unset another column from // being primary key, then we also need to refill that row, so that // the user interface does not show two primary keys. fill_field_row(row, fieldNewWithModifications); } else { //revert: fill_field_row(row, m_Field_BeingEdited); } } } } } void Box_DB_Table_Definition::on_adddel_edit(const Gtk::TreeModel::iterator& row) { sharedptr constfield = get_field_definition(row); m_Field_BeingEdited = constfield; m_pDialog->set_field(m_Field_BeingEdited, m_table_name); //m_pDialog->set_modified(false); //Disable [Apply] at start. Gtk::Window* parent_window = get_app_window(); if(parent_window) m_pDialog->set_transient_for(*parent_window); m_pDialog->show(); } sharedptr Box_DB_Table_Definition::get_field_definition(const Gtk::TreeModel::iterator& row) { sharedptr fieldResult; //Get old field definition (to preserve anything that the user doesn't have access to): const Glib::ustring strFieldNameBeforeEdit = m_AddDel.get_value_key(row); //Glom field definition: Document* pDoc = static_cast(get_document()); if(pDoc) { Document::type_vec_fields vecFields= pDoc->get_table_fields(m_table_name); Document::type_vec_fields::iterator iterFind = std::find_if( vecFields.begin(), vecFields.end(), predicate_FieldHasName(strFieldNameBeforeEdit) ); if((iterFind != vecFields.end()) && (*iterFind)) //If it was found: { fieldResult = glom_sharedptr_clone(*iterFind); } else { //Start with a default: fieldResult = sharedptr(new Field()); } } //DB field definition: //Start with original definitions, so that we preserve things like UNSIGNED. //TODO maybe use document's fieldinfo instead of m_vecFields. sharedptr field_temp = DbUtils::get_fields_for_table_one_field(pDoc, m_table_name, strFieldNameBeforeEdit); if(field_temp) { Glib::RefPtr fieldInfo = field_temp->get_field_info()->copy(); //Name: const Glib::ustring name = m_AddDel.get_value(row, m_colName); fieldInfo->set_name(name); //Title: const Glib::ustring title = m_AddDel.get_value(row, m_colTitle); fieldResult->set_title(title, AppWindow::get_current_locale()); //Type: const Glib::ustring& strType = m_AddDel.get_value(row, m_colType); const Field::glom_field_type glom_type = Field::get_type_for_ui_name(strType); GType fieldType = Field::get_gda_type_for_glom_type(glom_type); //Unique: const bool bUnique = m_AddDel.get_value_as_bool(row, m_colUnique); //TODO_gda: fieldInfo->set_unique_key(bUnique); //Primary Key: const bool bPrimaryKey = m_AddDel.get_value_as_bool(row, m_colPrimaryKey); ///TODO_gda: fieldInfo->set_primary_key(bPrimaryKey); fieldInfo->set_g_type(fieldType); // Reset old default value if the field type changes: if(fieldResult->get_glom_type() != glom_type) fieldInfo->set_default_value(Gnome::Gda::Value()); //Put it together: fieldResult->set_glom_type(glom_type); fieldResult->set_field_info(fieldInfo); //TODO: Use the libgda functions above when we make them work: fieldResult->set_unique_key(bUnique); fieldResult->set_primary_key(bPrimaryKey); } return fieldResult; } void Box_DB_Table_Definition::on_Properties_apply() { sharedptr field_New = m_pDialog->get_field(); if(*m_Field_BeingEdited != *field_New) { const bool bcontinue = check_field_change(m_Field_BeingEdited, field_New); if(bcontinue) { change_definition(m_Field_BeingEdited, field_New); m_Field_BeingEdited = field_New; } //Update the list: fill_from_database(); } m_pDialog->hide(); } sharedptr Box_DB_Table_Definition::change_definition(const sharedptr& fieldOld, const sharedptr& field) { BusyCursor busy_cursor(get_app_window()); //DB field definition: sharedptr result; if(!fieldOld || !field) return result; type_vec_const_fields old_fields; type_vec_fields new_fields; if(fieldOld->get_primary_key() != field->get_primary_key()) { //Note: We have already checked whether this change of primary key is likely to succeed. if(field->get_primary_key()) { //Unset the current primary key: //(There should be one.) sharedptr existing_primary_key = get_field_primary_key_for_table(m_table_name); if(existing_primary_key) { sharedptr existing_primary_key_unset = glom_sharedptr_clone(existing_primary_key); existing_primary_key_unset->set_primary_key(false); old_fields.push_back(existing_primary_key); new_fields.push_back(existing_primary_key_unset); } } //Forget the remembered currently-viewed primary key value, //because it will be useless with a different field as the primary key, or with no field as primary key: Document* document = get_document(); document->forget_layout_record_viewed(m_table_name); } old_fields.push_back(fieldOld); new_fields.push_back(glom_sharedptr_clone(field)); //TODO: Warn about a delay, and possible loss of precision, before actually //changing types or when the backend needs to recreate the whole column or //table. // TODO: Don't call change_columns if only the field title has changed, // since the title is only stored in the document anyway. if(change_columns(m_table_name, old_fields, new_fields, get_app_window())) { result = new_fields.back(); } else { //Give up. Don't update the document. Hope that we can read the current field properties from the database. fill_fields(); //fill_from_database(); //We should not change the database definition in a cell renderer signal handler. //Select the same field again: m_AddDel.select_item(field->get_name(), m_colName, false); return glom_sharedptr_clone(old_fields.back()); } //Extra Glom field definitions: Document* pDoc = static_cast(get_document()); if(pDoc) { //Get Table's fields: Document::type_vec_fields vecFields = pDoc->get_table_fields(m_table_name); for(unsigned int i = 0; i < old_fields.size(); ++ i) { //Find old field: const Glib::ustring field_name_old = old_fields[i]->get_name(); Document::type_vec_fields::iterator iterFind = std::find_if( vecFields.begin(), vecFields.end(), predicate_FieldHasName(field_name_old) ); if(iterFind != vecFields.end()) //If it was found: { //Change it to the new Fields's value: *iterFind = glom_sharedptr_clone(new_fields[i]); } else { //Add it, because it's not there already: vecFields.push_back( glom_sharedptr_clone(new_fields[i]) ); } // TODO_Performance: Can we do this at the end, after the loop? Or do // the following operations depend on this? pDoc->set_table_fields(m_table_name, vecFields); //Update field names where they are used in relationships or on layouts: if(field_name_old != new_fields[i]->get_name()) { pDoc->change_field_name(m_table_name, field_name_old, new_fields[i]->get_name()); } // TODO_Performance: Do we even need to do this if only the primary key // flag changed, such as for the first entry in the new_fields vector? //Recalculate if necessary: if(new_fields[i]->get_has_calculation()) { const Glib::ustring calculation = new_fields[i]->get_calculation(); if(calculation != old_fields[i]->get_calculation()) calculate_field_in_all_records(m_table_name, new_fields[i]); } } } //Update UI: fill_fields(); //fill_from_database(); //We should not change the database definition in a cell renderer signal handler. //Select the same field again: m_AddDel.select_item(field->get_name(), m_colName, false); return result; } void Box_DB_Table_Definition::fill_fields() { //std::cout << "DEBUG: Box_DB_Table_Definition::fill_fields()" << std::endl; //Update the fields (also checking the actual database): m_vecFields = DbUtils::get_fields_for_table(get_document(), m_table_name); } bool Box_DB_Table_Definition::field_has_null_values(const sharedptr& field) { //Note that "= Null" doesn't work, though it doesn't error either. //Note also that SELECT COUNT always returns 0 if all the values are NULL, so we can't use that to be more efficient. Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field(field->get_name(), m_table_name); builder->select_add_target(m_table_name); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_ISNULL, builder->add_field_id(field->get_name(), m_table_name))); long null_count = 0; Glib::RefPtr datamodel = DbUtils::query_execute_select(builder); if(datamodel) { if(datamodel->get_n_rows() && datamodel->get_n_columns()) { null_count = datamodel->get_n_rows(); //std::cout << "debug: null_count = " << null_count << std::endl; } } else { std::cerr << G_STRFUNC << ": query failed." << std::endl; } return null_count > 0; } bool Box_DB_Table_Definition::field_has_non_unique_values(const sharedptr& field) { long count_distinct = 0; long count_all = 0; //Count the distinct rows: Glib::RefPtr builder_query_distinct = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder_query_distinct->select_set_distinct(); builder_query_distinct->set_table(m_table_name); builder_query_distinct->select_add_field(field->get_name(), m_table_name); Glib::RefPtr datamodel = DbUtils::query_execute_select(builder_query_distinct); if(datamodel) { count_distinct = datamodel->get_n_rows(); //std::cout << "debug: count_distinct = " << count_distinct << std::endl; } else { std::cerr << G_STRFUNC << ": SELECT COUNT() failed." << std::endl; } //Count all rows, to compare. TODO_performance: Is there a more efficient way to do this? Maybe count(*), which apparently doesn't ignore NULL rows like count(somefield) would. Glib::RefPtr builder_query_all = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder_query_all->select_add_field(field->get_name(), m_table_name); builder_query_all->select_add_target(m_table_name); datamodel = DbUtils::query_execute_select(builder_query_all); if(datamodel) { count_all = datamodel->get_n_rows(); //std::cout << "debug: null_count = " << null_count << std::endl; } else { std::cerr << G_STRFUNC << ": SELECT COUNT() failed." << std::endl; } return count_distinct != count_all; } } //namespace Glom glom-1.22.4/glom/mode_design/fields/combo_fieldtype.cc0000644000175000017500000000544612234252646024137 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include "combo_fieldtype.h" #include "../../box_db_table.h" #include namespace Glom { Combo_FieldType::Combo_FieldType(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::ComboBox(cobject) { init(); } Combo_FieldType::Combo_FieldType() { init(); } void Combo_FieldType::init() { m_refTreeModel = Gtk::ListStore::create(m_Columns); set_model(m_refTreeModel); //Set Type choices: Field::type_map_type_names map_names = Field::get_usable_type_names(); for(Field::type_map_type_names::iterator iter = map_names.begin(); iter != map_names.end(); ++iter) { Gtk::TreeModel::iterator iterModel = m_refTreeModel->append(); if(iterModel) { Gtk::TreeModel::Row row = *iterModel; row[m_Columns.m_col_name] = iter->second; row[m_Columns.m_col_type] = iter->first; //std::cout << "adding combo row: " << row[m_Columns.m_col_name] << ", " << row[m_Columns.m_col_type] << std::endl; } } pack_start(m_Columns.m_col_name); //Show the name, but hide the ID. //The value must be from the list, and it can't be empty: //set_value_in_list(true, false); } Combo_FieldType::~Combo_FieldType() { } void Combo_FieldType::set_field_type(Field::glom_field_type fieldType) { const Gtk::TreeModel::Children& children = m_refTreeModel->children(); for(Gtk::TreeModel::iterator iter = children.begin(); iter != children.end(); ++iter) { Gtk::TreeModel::Row row = *iter; if( row[m_Columns.m_col_type] == fieldType ) { set_active(iter); Glib::ustring temp = row[m_Columns.m_col_name]; //iter } } } Field::glom_field_type Combo_FieldType::get_field_type() const { Field::glom_field_type result = Field::TYPE_INVALID; //Get the active row: Gtk::TreeModel::iterator active_row = get_active(); if(active_row) { Gtk::TreeModel::Row row = *active_row; result = row[m_Columns.m_col_type]; Glib::ustring temp = row[m_Columns.m_col_name]; } return result; } } //namespace Glom glom-1.22.4/glom/mode_design/comboentry_currency.cc0000644000175000017500000000336612234252646023617 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "comboentry_currency.h" #include namespace Glom { ComboEntry_Currency::ComboEntry_Currency(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::ComboBox(cobject) { m_model = Gtk::ListStore::create(m_model_columns); //Fill the model: const IsoCodes::type_list_currencies list_currencies = IsoCodes::get_list_of_currency_symbols(); for(IsoCodes::type_list_currencies::const_iterator iter = list_currencies.begin(); iter != list_currencies.end(); ++iter) { Gtk::TreeModel::iterator tree_iter = m_model->append(); Gtk::TreeModel::Row row = *tree_iter; const IsoCodes::Currency& currency = *iter; row[m_model_columns.m_symbol] = currency.m_symbol; row[m_model_columns.m_name] = currency.m_name; } set_model(m_model); set_entry_text_column(m_model_columns.m_symbol); //Show this too. pack_start(m_model_columns.m_name); } ComboEntry_Currency::~ComboEntry_Currency() { } } //namespace Glom glom-1.22.4/glom/mode_design/script_library/0000755000175000017500000000000012235000127022217 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/script_library/dialog_script_library.cc0000644000175000017500000001566412234776363027136 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_script_library.h" #include #include #include #include #include #include #include #include //#include #include namespace Glom { const char* Dialog_ScriptLibrary::glade_id("dialog_script_library"); const bool Dialog_ScriptLibrary::glade_developer(true); Dialog_ScriptLibrary::Dialog_ScriptLibrary(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject) { //Get child widgets: builder->get_widget_derived("combobox_name", m_combobox_name); builder->get_widget("textview_script", m_text_view); builder->get_widget("button_check", m_button_check); builder->get_widget("button_add", m_button_add); builder->get_widget("button_remove", m_button_remove); //Connect signals: m_button_check->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_ScriptLibrary::on_button_check) ); m_button_add->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_ScriptLibrary::on_button_add) ); m_button_remove->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_ScriptLibrary::on_button_remove) ); m_combobox_name->signal_changed().connect( sigc::mem_fun(*this, &Dialog_ScriptLibrary::on_combo_name_changed) ); //on_foreach_connect(*this); //Dialog_Properties::set_modified(false); //Set the SourceView to do syntax highlighting for Python: Glib::RefPtr languages_manager = Gsv::LanguageManager::get_default(); Glib::RefPtr language = languages_manager->get_language("python"); //This is the GtkSourceView language ID. if(language) { //Create a new buffer and set it, instead of getting the default buffer, in case libglade has tried to set it, using the wrong buffer type: Glib::RefPtr buffer = Gsv::Buffer::create(language); buffer->set_highlight_syntax(); m_text_view->set_buffer(buffer); } show_all_children(); } Dialog_ScriptLibrary::~Dialog_ScriptLibrary() { } void Dialog_ScriptLibrary::on_button_check() { const Glib::ustring script = m_text_view->get_buffer()->get_text(); //TODO: glom_execute_python_function_implementation(script); } void Dialog_ScriptLibrary::on_button_add() { //Save any outstanding changes: save_current_script(); Document* document = get_document(); if(!document) return; Dialog_NewScript* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*this); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response != Gtk::RESPONSE_OK) return; const Glib::ustring name = dialog->m_entry_name->get_text(); delete dialog; if(name.empty()) return; //TODO Warn and retry. if(!(document->get_library_module(name).empty())) //Don't add one that already exists. return; //TODO Warn and retry. document->set_library_module(name, Glib::ustring()); save_current_script(); load_from_document(); //Fill the combo. m_combobox_name->set_active_text(name); } void Dialog_ScriptLibrary::on_button_remove() { Document* document = get_document(); if(!document) return; Gtk::MessageDialog dialog(Utils::bold_message(_("Remove library script")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE ); dialog.set_secondary_text(_("Do you really want to delete this script? This data can not be recovered")); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::REMOVE, Gtk::RESPONSE_OK); dialog.set_transient_for(*this); const int response = dialog.run(); dialog.hide(); if(response != Gtk::RESPONSE_OK) return; const Glib::ustring name = m_combobox_name->get_active_text(); if(!name.empty()) { document->remove_library_module(name); //TODO: Show warning dialog. load_from_document(); //Fill the combo. } } void Dialog_ScriptLibrary::on_combo_name_changed() { //Save the old script: save_current_script(); //Lod the new script: load_current_script(); } void Dialog_ScriptLibrary::load_current_script() { Document* document = get_document(); if(!document) return; //Get the selected module name: const Glib::ustring name = m_combobox_name->get_active_text(); //Get the module's script text: Glib::ustring script; if(!name.empty()) { script = document->get_library_module(name); } //Show the script text: m_text_view->get_buffer()->set_text(script); m_current_name = name; } void Dialog_ScriptLibrary::save_current_script() { Document* document = get_document(); if(!document) return; //Get the current module name: const Glib::ustring name = m_current_name; /* We might be saving the current script in response to a change in the combo. */ //Set the module's script text: if(!name.empty()) { //Get the script text: const Glib::ustring script = m_text_view->get_buffer()->get_text(); document->set_library_module(name, script); } } void Dialog_ScriptLibrary::load_from_document() { Document* document = get_document(); if(!document) return; const std::vector module_names = document->get_library_module_names(); m_combobox_name->remove_all(); for(std::vector::const_iterator iter = module_names.begin(); iter != module_names.end(); ++iter) { const Glib::ustring name = *iter; m_combobox_name->append(name); } //Show the current script, or the first one, if there is one: if(m_current_name.empty()) { m_combobox_name->set_first_active(); m_current_name = m_combobox_name->get_active_text(); } else { m_combobox_name->set_active_text(m_current_name); } //TODO: Maybe already done by the signal handler: if(m_current_name.empty()) m_text_view->get_buffer()->set_text(Glib::ustring()); else load_current_script(); } void Dialog_ScriptLibrary::save_to_document() { Document* document = get_document(); if(!document) return; save_current_script(); } } //namespace Glom glom-1.22.4/glom/mode_design/script_library/dialog_script_library.h0000644000175000017500000000362512234252646026763 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef DIALOG_SCRIPTLIBRARY_H #define DIALOG_SCRIPTLIBRARY_H #include #include #include #include #include #include namespace Glom { class Dialog_ScriptLibrary : public Gtk::Dialog, public Base_DB //Give this class access to the current document, and to some utility methods. { public: static const char* glade_id; static const bool glade_developer; Dialog_ScriptLibrary(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ScriptLibrary(); virtual void load_from_document(); virtual void save_to_document(); private: void on_button_add(); void on_button_remove(); void on_button_check(); void on_combo_name_changed(); void load_current_script(); void save_current_script(); Combo_TextGlade* m_combobox_name; Gsv::View* m_text_view; Gtk::Button* m_button_check; Gtk::Button* m_button_add; Gtk::Button* m_button_remove; Glib::ustring m_current_name; }; } //namespace Glom #endif //DIALOG_SCRIPTLIBRARY_H glom-1.22.4/glom/mode_design/script_library/dialog_new_script.h0000644000175000017500000000245512234252646026110 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_USERS_DIALOG_NEWSCRIPT_H #define GLOM_MODE_DESIGN_USERS_DIALOG_NEWSCRIPT_H #include #include #include namespace Glom { class Dialog_NewScript : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; Dialog_NewScript(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_NewScript(); Gtk::Entry* m_entry_name; }; } //namespace Glom #endif //GLOM_MODE_DESIGN_USERS_DIALOG_NEWSCRIPT_H glom-1.22.4/glom/mode_design/script_library/dialog_new_script.cc0000644000175000017500000000246012234252646026242 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_new_script.h" namespace Glom { const char* Dialog_NewScript::glade_id("dialog_new_library_script"); const bool Dialog_NewScript::glade_developer(true); Dialog_NewScript::Dialog_NewScript(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_entry_name(0) { builder->get_widget("entry_name", m_entry_name); //m_entry_name->signal_changed().connect( sigc::mem_fun(*this, &Dialog_NewScript::on_entry_name_changed) ); } Dialog_NewScript::~Dialog_NewScript() { } } //namespace Glom glom-1.22.4/glom/mode_design/dialog_add_related_table.h0000644000175000017500000000400512234252646024273 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_ADDRELATEDTABLE_H #define GLOM_DIALOG_ADDRELATEDTABLE_H #include #include #include #include #include namespace Glom { class Dialog_AddRelatedTable : public Gtk::Dialog, public Base_DB { public: static const char* glade_id; static const bool glade_developer; Dialog_AddRelatedTable(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_AddRelatedTable(); void set_fields(const Glib::ustring& table_name); //Get the user input: void get_input(Glib::ustring& table_name, Glib::ustring& relationship_name, Glib::ustring& from_key_name); typedef sigc::signal type_signal_request_edit_fields; type_signal_request_edit_fields signal_request_edit_fields(); private: void on_entry_table_name(); void on_combo_field_name(); void on_button_edit_fields(); Gtk::Entry* m_entry_table_name; Gtk::Entry* m_entry_relationship_name; Gtk::ComboBoxText* m_combo_from_field; Gtk::Button* m_button_edit_fields; Gtk::Button* m_button_ok; Glib::ustring m_table_name; type_signal_request_edit_fields m_signal_request_edit_fields; }; } //namespace Glom #endif //GLOM_DIALOG_ADDRELATEDTABLE_H glom-1.22.4/glom/mode_design/report_layout/0000755000175000017500000000000012235000127022077 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/report_layout/treestore_report_layout.cc0000644000175000017500000001462012234252646027433 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "treestore_report_layout.h" #include #include #include #include #include #include #include #include #include namespace Glom { TreeStore_ReportLayout::TreeStore_ReportLayout() : Gtk::TreeStore() { //We can't just call Gtk::TreeModel(m_columns) in the initializer list //because m_columns does not exist when the base class constructor runs. //And we can't have a static m_columns instance, because that would be //instantiated before the gtkmm type system. //So, we use this method, which should only be used just after creation: set_column_types(m_columns); } Glib::RefPtr TreeStore_ReportLayout::create() { return Glib::RefPtr( new TreeStore_ReportLayout() ); } bool TreeStore_ReportLayout::row_draggable_vfunc(const Gtk::TreeModel::Path& path) const { //Allow everything to be dragged. return Gtk::TreeStore::row_draggable_vfunc(path); } bool TreeStore_ReportLayout::row_drop_possible_vfunc(const Gtk::TreeModel::Path& dest, const Gtk::SelectionData& selection_data) const { //Get the Row that is being dragged: //TODO: Add const version of get_from_selection_data(): Glib::RefPtr refThis = Glib::RefPtr(this); Glib::RefPtr refThis = Glib::RefPtr(const_cast(this)); refThis->reference(); //, true /* take_copy */) Gtk::TreeModel::Path path_dragged_row; Gtk::TreeModel::Path::get_from_selection_data(selection_data, refThis, path_dragged_row); if(path_dragged_row == dest) return false; //Prevent a row from being dragged onto itself. Gtk::TreeModel::iterator iter_dragged_row = refThis->get_iter(path_dragged_row); if(!iter_dragged_row) return false; sharedptr item_dragged_row = (*iter_dragged_row)[m_columns.m_col_item]; //dest is the path that the row would have after it has been dropped: //But in this case we are more interested in the parent row: Gtk::TreeModel::Path dest_parent = dest; bool dest_is_not_top_level = dest_parent.up(); if(!dest_is_not_top_level || dest_parent.empty()) { return may_be_child_of(sharedptr() /* parent */, item_dragged_row); } else { if(dest_parent == path_dragged_row) return false; //Don't allow an item to be dragged under itself. TODO: Check the whole parent hierarchy. //Get an iterator for the row at the requested parent's path: //We must unconst this. This should not be necessary with a future version of gtkmm. TreeStore_ReportLayout* unconstThis = const_cast(this); //TODO: Add a const version of get_iter to TreeModel: const_iterator iter_dest_parent = unconstThis->get_iter(dest_parent); //const_iterator iter_dest_parent = get_iter(dest); if(iter_dest_parent) { Gtk::TreeModel::Row row_parent = *iter_dest_parent; sharedptr item_parent = (row_parent)[m_columns.m_col_item]; return may_be_child_of(item_parent, item_dragged_row); } } //Fallback: return Gtk::TreeStore::row_drop_possible_vfunc(dest, selection_data); } void TreeStore_ReportLayout::fill_sequences() { guint sequence = 1; for(iterator iter_children = children().begin(); iter_children != children().end(); ++iter_children) { Gtk::TreeModel::Row row = *iter_children; row[m_columns.m_col_sequence] = sequence; ++sequence; //Recurse: fill_sequences(iter_children); } } void TreeStore_ReportLayout::fill_sequences(const iterator& iter) { guint sequence = 1; for(iterator iter_children = iter->children().begin(); iter_children != iter->children().end(); ++iter_children) { Gtk::TreeModel::Row row = *iter_children; row[m_columns.m_col_sequence] = sequence; ++sequence; //Recurse: fill_sequences(iter_children); } } bool TreeStore_ReportLayout::may_be_child_of(const sharedptr& parent, const sharedptr& suggested_child) { if(!parent) return true; //Anything may be at the top-level. if(!(sharedptr::cast_dynamic(parent))) return false; //Only LayoutGroup (and derived types) may have children. const bool child_fieldsummary = sharedptr::cast_dynamic(suggested_child); sharedptr summary = sharedptr::cast_dynamic(parent); //A Summary may only have FieldSummary children: if(summary && !child_fieldsummary) return false; //FieldSummary may only be a member of Summary: if(child_fieldsummary && !summary) return false; const bool header = sharedptr::cast_dynamic(parent); const bool footer = sharedptr::cast_dynamic(parent); const bool child_groupby = sharedptr::cast_dynamic(suggested_child); const bool child_summary = sharedptr::cast_dynamic(suggested_child); if((header || footer) && (child_summary || child_groupby)) return false; //Nothing that needs data can be in a Header or Footer. A field is allowed because it could show constans from System Preferences. return true; } } //namespace Glom glom-1.22.4/glom/mode_design/report_layout/dialog_layout_report.cc0000644000175000017500000011146412234776363026671 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include //For bold_message()). #include #include //For stringstream namespace Glom { const char* Dialog_Layout_Report::glade_id("window_report_layout"); const bool Dialog_Layout_Report::glade_developer(true); Dialog_Layout_Report::Dialog_Layout_Report(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Layout(cobject, builder, false /* No table title */), m_notebook_parts(0), m_treeview_parts_header(0), m_treeview_parts_footer(0), m_treeview_parts_main(0), m_treeview_available_parts(0), m_button_up(0), m_button_down(0), m_button_add(0), m_button_delete(0), m_button_edit(0), m_button_formatting(0), m_label_table_name(0), m_entry_name(0), m_entry_title(0), m_checkbutton_table_title(0) { builder->get_widget("label_table_name", m_label_table_name); builder->get_widget("entry_name", m_entry_name); builder->get_widget("entry_title", m_entry_title); builder->get_widget("checkbutton_table_title", m_checkbutton_table_title); builder->get_widget("button_up", m_button_up); m_button_up->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Report::on_button_up) ); builder->get_widget("button_down", m_button_down); m_button_down->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Report::on_button_down) ); builder->get_widget("button_delete", m_button_delete); m_button_delete->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Report::on_button_delete) ); builder->get_widget("button_add", m_button_add); m_button_add->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Report::on_button_add) ); builder->get_widget("button_edit", m_button_edit); m_button_edit->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Report::on_button_edit) ); builder->get_widget("button_formatting", m_button_formatting); m_button_formatting->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Report::on_button_formatting) ); builder->get_widget("notebook_parts", m_notebook_parts); m_notebook_parts->set_current_page(1); //The main part, because it is used most often. //Available parts: builder->get_widget("treeview_available_parts", m_treeview_available_parts); if(m_treeview_available_parts) { //Add list of available parts: //These are deleted in the destructor: //Main parts: { m_model_available_parts_main = type_model::create(); // Gtk::TreeModel::iterator iterHeader = m_model_available_parts_main->append(); // (*iterHeader)[m_model_available_parts_main->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_Header())); Gtk::TreeModel::iterator iter = m_model_available_parts_main->append(); (*iter)[m_model_available_parts_main->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_GroupBy())); Gtk::TreeModel::iterator iterField = m_model_available_parts_main->append(iter->children()); //Place Field under GroupBy to indicate that that's where it belongs in the actual layout. (*iterField)[m_model_available_parts_main->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_Field())); Gtk::TreeModel::iterator iterText = m_model_available_parts_main->append(iter->children()); (*iterText)[m_model_available_parts_main->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_Text())); Gtk::TreeModel::iterator iterImage = m_model_available_parts_main->append(iter->children()); (*iterImage)[m_model_available_parts_main->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_Image())); Gtk::TreeModel::iterator iterVerticalGroup = m_model_available_parts_main->append(iter->children()); (*iterVerticalGroup)[m_model_available_parts_main->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_VerticalGroup())); iter = m_model_available_parts_main->append(); (*iter)[m_model_available_parts_main->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_Summary())); iter = m_model_available_parts_main->append(iter->children()); (*iter)[m_model_available_parts_main->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_FieldSummary())); // Gtk::TreeModel::iterator iterFooter = m_model_available_parts_main->append(); // (*iterFooter)[m_model_available_parts_main->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_Footer())); } //Header/Footer parts: { m_model_available_parts_headerfooter = type_model::create(); Gtk::TreeModel::iterator iterVerticalGroup = m_model_available_parts_headerfooter->append(); (*iterVerticalGroup)[m_model_available_parts_headerfooter->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_VerticalGroup())); Gtk::TreeModel::iterator iterField = m_model_available_parts_headerfooter->append(iterVerticalGroup->children()); (*iterField)[m_model_available_parts_headerfooter->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_Field())); Gtk::TreeModel::iterator iterText = m_model_available_parts_headerfooter->append(iterVerticalGroup->children()); (*iterText)[m_model_available_parts_headerfooter->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_Text())); Gtk::TreeModel::iterator iterImage = m_model_available_parts_headerfooter->append(iterVerticalGroup->children()); (*iterImage)[m_model_available_parts_headerfooter->m_columns.m_col_item] = sharedptr(static_cast(new LayoutItem_Image())); } m_treeview_available_parts->set_model(m_model_available_parts_main); m_treeview_available_parts->expand_all(); // Append the View columns: // Use set_cell_data_func() to give more control over the cell attributes depending on the row: //Name column: Gtk::TreeView::Column* column_part = Gtk::manage( new Gtk::TreeView::Column(_("Part")) ); m_treeview_available_parts->append_column(*column_part); Gtk::CellRendererText* renderer_part = Gtk::manage(new Gtk::CellRendererText()); column_part->pack_start(*renderer_part); column_part->set_cell_data_func(*renderer_part, sigc::mem_fun(*this, &Dialog_Layout_Report::on_cell_data_available_part)); m_treeview_available_parts->set_headers_visible(false); //There's only one column, so this is not useful. //Respond to changes of selection: Glib::RefPtr refSelection = m_treeview_available_parts->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_Report::on_treeview_available_parts_selection_changed) ); } } builder->get_widget("treeview_parts_header", m_treeview_parts_header); setup_model(*m_treeview_parts_header, m_model_parts_header); builder->get_widget("treeview_parts_footer", m_treeview_parts_footer); setup_model(*m_treeview_parts_footer, m_model_parts_footer); builder->get_widget("treeview_parts_main", m_treeview_parts_main); setup_model(*m_treeview_parts_main, m_model_parts_main); show_all_children(); //We save the connection, so we can disconnect it in the destructor, //because, for some reason, this signal handler is still called _after_ the destructor. //TODO: Fix that problem in GTK+ or gtkmm? m_signal_connection = m_notebook_parts->signal_switch_page().connect(sigc::mem_fun(*this, &Dialog_Layout_Report::on_notebook_switch_page)); } Dialog_Layout_Report::~Dialog_Layout_Report() { m_signal_connection.disconnect(); } void Dialog_Layout_Report::setup_model(Gtk::TreeView& treeview, Glib::RefPtr& model) { //Allow drag-and-drop: treeview.enable_model_drag_source(); treeview.enable_model_drag_dest(); model = type_model::create(); treeview.set_model(model); // Append the View columns: // Use set_cell_data_func() to give more control over the cell attributes depending on the row: //Name column: Gtk::TreeView::Column* column_part = Gtk::manage( new Gtk::TreeView::Column(_("Part")) ); treeview.append_column(*column_part); Gtk::CellRendererText* renderer_part = Gtk::manage(new Gtk::CellRendererText); column_part->pack_start(*renderer_part); column_part->set_cell_data_func(*renderer_part, sigc::bind( sigc::mem_fun(*this, &Dialog_Layout_Report::on_cell_data_part), model)); //Details column: Gtk::TreeView::Column* column_details = Gtk::manage( new Gtk::TreeView::Column(_("Details")) ); treeview.append_column(*column_details); Gtk::CellRendererText* renderer_details = Gtk::manage(new Gtk::CellRendererText); column_details->pack_start(*renderer_details); column_details->set_cell_data_func(*renderer_details, sigc::bind( sigc::mem_fun(*this, &Dialog_Layout_Report::on_cell_data_details), model)); //Connect to its signal: //renderer_count->signal_edited().connect( // sigc::bind( sigc::mem_fun(*this, &Dialog_Layout_Report::on_treeview_cell_edited_numeric), m_model_parts_main->m_columns.m_col_columns_count) ); //Respond to changes of selection: Glib::RefPtr refSelection = treeview.get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_Report::on_treeview_parts_selection_changed) ); } //m_model_parts_main->signal_row_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_Report::on_treemodel_row_changed) ); } sharedptr Dialog_Layout_Report::fill_group(const Gtk::TreeModel::iterator& iter, const Glib::RefPtr model) { if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr pItem = row[model->m_columns.m_col_item]; sharedptr pGroup = sharedptr::cast_dynamic(pItem); if(pGroup) { //Make sure that it contains the child items: fill_group_children(pGroup, iter, model); return glom_sharedptr_clone(pGroup); } } return sharedptr(); } void Dialog_Layout_Report::fill_group_children(const sharedptr& group, const Gtk::TreeModel::iterator& iter, const Glib::RefPtr model) { if(iter) { Gtk::TreeModel::Row row = *iter; group->remove_all_items(); for(Gtk::TreeModel::iterator iterChild = row.children().begin(); iterChild != row.children().end(); ++iterChild) { Gtk::TreeModel::Row row = *iterChild; sharedptr item = row[model->m_columns.m_col_item]; //Recurse: sharedptr child_group = sharedptr::cast_dynamic(item); if(child_group) fill_group_children(child_group, iterChild, model); //std::cout << "debug: " << G_STRFUNC << ": Adding group child: parent part type=" << group->get_part_type_name() << ", child part type=" << item->get_part_type_name() << std::endl; group->add_item(item); } } } void Dialog_Layout_Report::add_group_children(const Glib::RefPtr& model_parts, const Gtk::TreeModel::iterator& parent, const sharedptr& group) { for(LayoutGroup::type_list_items::const_iterator iter = group->m_list_items.begin(); iter != group->m_list_items.end(); ++iter) { sharedptr item = *iter; sharedptr group = sharedptr::cast_dynamic(item); if(group) { sharedptr header = sharedptr::cast_dynamic(item); sharedptr footer = sharedptr::cast_dynamic(item); //Special-case the header and footer so that their items go into the separate treeviews: if(header) add_group_children(m_model_parts_header, parent, group); //Without the Header group being explicitly shown. else if(footer) add_group_children(m_model_parts_footer, parent, group); //Without the Footer group being explicitly shown. else { add_group(model_parts, parent, group); } } else { Gtk::TreeModel::iterator iter = model_parts->append(parent->children()); Gtk::TreeModel::Row row = *iter; row[model_parts->m_columns.m_col_item] = glom_sharedptr_clone(item); } } m_modified = true; } void Dialog_Layout_Report::add_group(const Glib::RefPtr& model_parts, const Gtk::TreeModel::iterator& parent, const sharedptr& group) { Gtk::TreeModel::iterator iterNewItem; if(!parent) { //Add it at the top-level, because nothing was selected: iterNewItem = model_parts->append(); } else { iterNewItem = model_parts->append(parent->children()); } if(iterNewItem) { Gtk::TreeModel::Row row = *iterNewItem; row[model_parts->m_columns.m_col_item] = sharedptr(static_cast(group->clone())); add_group_children(model_parts, iterNewItem /* parent */, group); m_modified = true; } } //void Dialog_Layout_Report::set_document(const Glib::ustring& layout, Document* document, const Glib::ustring& table_name, const type_vecLayoutFields& table_fields) void Dialog_Layout_Report::set_report(const Glib::ustring& table_name, const sharedptr& report) { m_modified = false; m_name_original = report->get_name(); m_report = sharedptr(new Report(*report)); //Copy it, so we only use the changes when we want to. m_table_name = table_name; //Dialog_Layout::set_document(layout, document, table_name, table_fields); //Set the table name and title: m_label_table_name->set_text(table_name); m_entry_name->set_text(report->get_name()); m_entry_title->set_text(item_get_title(report)); m_checkbutton_table_title->set_active(report->get_show_table_title()); //Update the tree models from the document if(true) //document) { //m_entry_table_title->set_text( document->get_table_title(table_name, AppWindow::get_current_locale()) ); //document->fill_layout_field_details(m_table_name, mapGroups); //Update with full field information. //Show the report items: m_model_parts_header->clear(); m_model_parts_main->clear(); m_model_parts_footer->clear(); //Add most parts to main, adding any found header or footer chidlren to those other models: add_group_children(m_model_parts_main, Gtk::TreeModel::iterator() /* null == top-level */, report->get_layout_group()); //treeview_fill_sequences(m_model_parts_main, m_model_parts_main->m_columns.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } //Open all the groups: m_treeview_parts_header->expand_all(); m_treeview_parts_main->expand_all(); m_treeview_parts_footer->expand_all(); m_notebook_parts->set_current_page(1); //The main part, because it is used most often. m_modified = false; } void Dialog_Layout_Report::enable_buttons() { sharedptr layout_item_available; bool enable_add = false; //Available Parts: Glib::RefPtr refSelectionAvailable = m_treeview_available_parts->get_selection(); if(refSelectionAvailable) { Gtk::TreeModel::iterator iter = refSelectionAvailable->get_selected(); if(iter) { layout_item_available = (*iter)[m_model_available_parts_main->m_columns.m_col_item]; enable_add = true; } else { enable_add = false; } } sharedptr layout_item_parent; Gtk::TreeView* treeview = get_selected_treeview(); if(!treeview) return; Glib::RefPtr model = get_selected_model(); //Parts: Glib::RefPtr refSelection = treeview->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { layout_item_parent = (*iter)[model->m_columns.m_col_item]; //Disable Up if It can't go any higher. bool enable_up = true; if(iter == model->children().begin()) enable_up = false; //It can't go any higher. m_button_up->set_sensitive(enable_up); //Disable Down if It can't go any lower. Gtk::TreeModel::iterator iterNext = iter; iterNext++; bool enable_down = true; if(iterNext == model->children().end()) enable_down = false; m_button_down->set_sensitive(enable_down); m_button_delete->set_sensitive(true); //The [Formatting] button: bool enable_formatting = false; sharedptr item_field = sharedptr::cast_dynamic(layout_item_parent); if(item_field) enable_formatting = true; m_button_formatting->set_sensitive(enable_formatting); //m_button_formatting->set_sensitive( (*iter)[m_columns_parts->m_columns.m_col_type] == TreeStore_Layout::TYPE_FIELD); } else { //Disable all buttons that act on a selection: m_button_down->set_sensitive(false); m_button_up->set_sensitive(false); m_button_delete->set_sensitive(false); m_button_formatting->set_sensitive(false); } //Not all parts may be children of all other parts. if(layout_item_available && layout_item_parent) { const bool may_be_child_of_parent = TreeStore_ReportLayout::may_be_child_of(layout_item_parent, layout_item_available); enable_add = may_be_child_of_parent; if(!may_be_child_of_parent) { //Maybe it can be a sibling of the parent instead (and that's what would happen if Add was clicked). sharedptr layout_item_parent_of_parent; Gtk::TreeModel::iterator iterParent = iter->parent(); if(iterParent) layout_item_parent_of_parent = (*iterParent)[model->m_columns.m_col_item]; enable_add = TreeStore_ReportLayout::may_be_child_of(layout_item_parent_of_parent, layout_item_available); } } } m_button_add->set_sensitive(enable_add); } Glib::RefPtr Dialog_Layout_Report::get_selected_model() { Glib::RefPtr model; Gtk::TreeView* treeview = get_selected_treeview(); if(treeview) model = Glib::RefPtr::cast_dynamic(treeview->get_model()); return model; } Glib::RefPtr Dialog_Layout_Report::get_selected_model() const { Dialog_Layout_Report* this_nonconst = const_cast(this); return this_nonconst->get_selected_model(); } Gtk::TreeView* Dialog_Layout_Report::get_selected_treeview() { switch(m_notebook_parts->get_current_page()) { //These numbers depende on the page position as defined by our .glade file. //We could just get the page widget, but I'd like to allow other widgets in the page if we decide to do that. It's not ideal. murrayc. case(0): //Header return m_treeview_parts_header; case(1): //Main return m_treeview_parts_main; case(2): //Footer return m_treeview_parts_footer; default: { std::cerr << "Dialog_Layout_Report::get_selected_treeview(): Unrecognised current notebook page:" << m_notebook_parts->get_current_page() << std::endl; return 0; } } } const Gtk::TreeView* Dialog_Layout_Report::get_selected_treeview() const { Dialog_Layout_Report* this_nonconst = const_cast(this); return this_nonconst->get_selected_treeview(); } void Dialog_Layout_Report::on_button_delete() { Gtk::TreeView* treeview = get_selected_treeview(); if(!treeview) return; Glib::RefPtr model = get_selected_model(); Glib::RefPtr refTreeSelection = treeview->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { model->erase(iter); m_modified = true; } } } void Dialog_Layout_Report::on_button_up() { Gtk::TreeView* treeview = get_selected_treeview(); if(!treeview) return; Glib::RefPtr model = get_selected_model(); Glib::RefPtr refSelection = treeview->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { Gtk::TreeModel::iterator parent = iter->parent(); bool is_first = false; if(parent) is_first = (iter == parent->children().begin()); else is_first = (iter == model->children().begin()); if(!is_first) { Gtk::TreeModel::iterator iterBefore = iter; --iterBefore; model->iter_swap(iter, iterBefore); m_modified = true; } } } enable_buttons(); } void Dialog_Layout_Report::on_button_down() { Gtk::TreeView* treeview = get_selected_treeview(); if(!treeview) return; Glib::RefPtr model = get_selected_model(); Glib::RefPtr refSelection = treeview->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { Gtk::TreeModel::iterator iterNext = iter; iterNext++; Gtk::TreeModel::iterator parent = iter->parent(); bool is_last = false; if(parent) is_last = (iterNext == parent->children().end()); else is_last = (iterNext == model->children().end()); if(!is_last) { //Swap the sequence values, so that the one before will be after: model->iter_swap(iter, iterNext); m_modified = true; } } } enable_buttons(); } void Dialog_Layout_Report::on_button_add() { Gtk::TreeView* treeview = get_selected_treeview(); if(!treeview) return; Glib::RefPtr model = get_selected_model(); Glib::RefPtr model_available = Glib::RefPtr::cast_dynamic(m_treeview_available_parts->get_model()); Gtk::TreeModel::iterator parent = get_selected_group_parent(); sharedptr pParentPart; if(parent) { sharedptr temp = (*parent)[m_model_available_parts_main->m_columns.m_col_item]; pParentPart = temp; } Gtk::TreeModel::iterator available = get_selected_available(); sharedptr pAvailablePart; if(available) { sharedptr temp = (*available)[model_available->m_columns.m_col_item]; pAvailablePart = temp; } //Check whether the available part may be a child of the selected parent: if(pParentPart && !TreeStore_ReportLayout::may_be_child_of(pParentPart, pAvailablePart)) { //Maybe it may be a child of the items' parent instead, //to become a sibling of the selected item. parent = (*parent).parent(); if(parent) { sharedptr temp = (*parent)[model_available->m_columns.m_col_item]; pParentPart = temp; if(!TreeStore_ReportLayout::may_be_child_of(pParentPart, pAvailablePart)) return; //Not allowed either. } } //Copy the available part to the list of parts: if(available) { Gtk::TreeModel::iterator iter; if(parent) { m_treeview_parts_main->expand_row( Gtk::TreeModel::Path(parent), true); iter = model->append(parent->children()); } else iter = model->append(); (*iter)[model->m_columns.m_col_item] = sharedptr(pAvailablePart->clone()); } if(parent) treeview->expand_row( Gtk::TreeModel::Path(parent), true); enable_buttons(); } sharedptr Dialog_Layout_Report::offer_relationship_list() { sharedptr result; Dialog_ChooseRelationship* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; dialog->set_document(get_document(), m_table_name); dialog->set_transient_for(*this); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: result = dialog->get_relationship_chosen(); } delete dialog; return result; } Gtk::TreeModel::iterator Dialog_Layout_Report::get_selected_group_parent() const { //Get the selected group, or a suitable parent group, or the first group: Gtk::TreeModel::iterator parent; Gtk::TreeView* treeview = const_cast(get_selected_treeview()); if(!treeview) return parent; Glib::RefPtr model = get_selected_model(); Glib::RefPtr refTreeSelection = treeview->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[model->m_columns.m_col_item]; if(sharedptr::cast_dynamic(layout_item)) { //Add a group under this group: parent = iter; } else { //Add a group under this item's group: parent = iter->parent(); } } } return parent; } Gtk::TreeModel::iterator Dialog_Layout_Report::get_selected_available() const { //Get the selected group, or a suitable parent group, or the first group: Gtk::TreeModel::iterator iter; Glib::RefPtr refTreeSelection = m_treeview_available_parts->get_selection(); if(refTreeSelection) { iter = refTreeSelection->get_selected(); } return iter; } void Dialog_Layout_Report::on_button_formatting() { Gtk::TreeView* treeview = get_selected_treeview(); if(!treeview) return; Glib::RefPtr model = get_selected_model(); //Get the selected item: Glib::RefPtr refTreeSelection = treeview->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr item = row[model->m_columns.m_col_item]; sharedptr field = sharedptr::cast_dynamic(item); if(field) { sharedptr field_chosen = offer_field_formatting(field, m_table_name, this, false /* no editing options */); if(field_chosen) { *field = *field_chosen; model->row_changed(Gtk::TreeModel::Path(iter), iter); } } } } } void Dialog_Layout_Report::on_button_edit() { Gtk::TreeView* treeview = get_selected_treeview(); if(!treeview) return; Glib::RefPtr model = get_selected_model(); //Get the selected item: Glib::RefPtr refTreeSelection = treeview->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { //Do something different for each type of item: Gtk::TreeModel::Row row = *iter; sharedptr item = row[model->m_columns.m_col_item]; sharedptr fieldsummary = sharedptr::cast_dynamic(item); if(fieldsummary) { Dialog_FieldSummary* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); add_view(dialog); dialog->set_item(fieldsummary, m_table_name); dialog->set_transient_for(*this); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: sharedptr chosenitem = dialog->get_item(); if(chosenitem) { *fieldsummary = *chosenitem; //TODO_Performance. model->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm? m_modified = true; } } remove_view(dialog); delete dialog; } else { sharedptr field = sharedptr::cast_dynamic(item); if(field) { sharedptr chosenitem = offer_field_list_select_one_field(field, m_table_name, this); if(chosenitem) { *field = *chosenitem; //TODO_Performance. model->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm? m_modified = true; } } else { sharedptr layout_item_text = sharedptr::cast_dynamic(item); if(layout_item_text) { sharedptr chosen = offer_textobject(layout_item_text); if(chosen) { *layout_item_text = *chosen; model->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm? m_modified = true; } } else { sharedptr layout_item_image = sharedptr::cast_dynamic(item); if(layout_item_image) { sharedptr chosen = offer_imageobject(layout_item_image); if(chosen) { *layout_item_image = *chosen; model->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm? m_modified = true; } } else { sharedptr group_by = sharedptr::cast_dynamic(item); if(group_by) { Dialog_GroupBy* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) return; add_view(dialog); dialog->set_item(group_by, m_table_name); dialog->set_transient_for(*this); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: sharedptr chosenitem = dialog->get_item(); if(chosenitem) { *group_by = *chosenitem; model->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm? m_modified = true; } } remove_view(dialog); delete dialog; } } } } } } } } void Dialog_Layout_Report::save_to_document() { Dialog_Layout::save_to_document(); } void Dialog_Layout_Report::on_treeview_available_parts_selection_changed() { enable_buttons(); } void Dialog_Layout_Report::on_treeview_parts_selection_changed() { enable_buttons(); } void Dialog_Layout_Report::on_cell_data_part(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, const Glib::RefPtr& model) { //TODO: If we ever use this as a real layout tree, then let's add icons for each type. //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr pItem = row[model->m_columns.m_col_item]; const Glib::ustring part = pItem->get_part_type_name(); renderer_text->property_text() = part; renderer_text->property_editable() = false; //Part names can never be edited. } } } void Dialog_Layout_Report::on_cell_data_details(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, const Glib::RefPtr& model) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Glib::ustring text; Gtk::TreeModel::Row row = *iter; sharedptr pItem = row[model->m_columns.m_col_item]; renderer_text->property_text() = pItem->get_layout_display_name(); renderer_text->property_editable() = false; } } } void Dialog_Layout_Report::on_cell_data_available_part(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //TODO: If we ever use this as a real layout tree, then let's add icons for each type. //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; Glib::RefPtr model = Glib::RefPtr::cast_dynamic(m_treeview_available_parts->get_model()); sharedptr pItem = row[model->m_columns.m_col_item]; Glib::ustring part = pItem->get_part_type_name(); renderer_text->property_text() = part; renderer_text->property_editable() = false; //Part names can never be edited. } } } Glib::ustring Dialog_Layout_Report::get_original_report_name() const { return m_name_original; } sharedptr Dialog_Layout_Report::get_report() { m_report->set_name( m_entry_name->get_text() ); m_report->set_title( m_entry_title->get_text() , AppWindow::get_current_locale()); m_report->set_show_table_title( m_checkbutton_table_title->get_active() ); sharedptr group = m_report->get_layout_group(); group->remove_all_items(); //The Header and Footer parts are implicit (they are the whole header or footer treeview) sharedptr header = sharedptr::create(); sharedptr group_temp = header; fill_report_parts(group_temp, m_model_parts_header); if(header->get_items_count()) group->add_item(header); fill_report_parts(group, m_model_parts_main); sharedptr footer = sharedptr::create(); group_temp = footer; fill_report_parts(group_temp, m_model_parts_footer); if(footer->get_items_count()) group->add_item(footer); return m_report; } void Dialog_Layout_Report::fill_report_parts(sharedptr& group, const Glib::RefPtr parts_model) { for(Gtk::TreeModel::iterator iter = parts_model->children().begin(); iter != parts_model->children().end(); ++iter) { //Recurse into a group if necessary: sharedptr group_child = fill_group(iter, parts_model); if(group_child) { //Add the group: group->add_item(group_child); } else { sharedptr item = (*iter)[parts_model->m_columns.m_col_item]; if(item) { group->add_item(item); } } } } void Dialog_Layout_Report::on_notebook_switch_page(Gtk::Widget*, guint page_number) { //Change the list of available parts, depending on the destination treeview: Glib::RefPtr model_available_parts; switch(page_number) { case(0): //Header case(2): //Footer model_available_parts = m_model_available_parts_headerfooter; break; case(1): //Main default: model_available_parts = m_model_available_parts_main; break; } m_treeview_available_parts->set_model(model_available_parts); m_treeview_available_parts->expand_all(); //Enable the correct buttons for the now-visible TreeView: enable_buttons(); } } //namespace Glom glom-1.22.4/glom/mode_design/report_layout/treestore_report_layout.h0000644000175000017500000000365512234252646027303 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_TREESTORE_REPORT_LAYOUT_H #define GLOM_MODE_DATA_TREESTORE_REPORT_LAYOUT_H #include #include namespace Glom { class TreeStore_ReportLayout : public Gtk::TreeStore { private: TreeStore_ReportLayout(); public: //Tree model columns: class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_item); add(m_col_sequence); } Gtk::TreeModelColumn< sharedptr > m_col_item; Gtk::TreeModelColumn m_col_sequence; }; ModelColumns m_columns; static Glib::RefPtr create(); void fill_sequences(); void fill_sequences(const iterator& iter); static bool may_be_child_of(const sharedptr& parent, const sharedptr& suggested_child); private: //Overridden virtual functions: virtual bool row_draggable_vfunc(const Gtk::TreeModel::Path& path) const; virtual bool row_drop_possible_vfunc(const Gtk::TreeModel::Path& dest, const Gtk::SelectionData& selection_data) const; }; } //namespace Glom #endif //GLOM_MODE_DATA_TREESTORE_REPORT_LAYOUT_H glom-1.22.4/glom/mode_design/report_layout/dialog_layout_report.h0000644000175000017500000001121512234252646026515 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_LAYOUT_REPORT_H #define GLOM_DIALOG_LAYOUT_REPORT_H #include #include #include #include #include #include #include "treestore_report_layout.h" //#include //#include namespace Glom { class Dialog_Layout_Report : public Dialog_Layout { public: static const char* glade_id; static const bool glade_developer; Dialog_Layout_Report(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Layout_Report(); void set_report(const Glib::ustring& table_name, const sharedptr& report); sharedptr get_report(); Glib::ustring get_original_report_name() const; private: typedef TreeStore_ReportLayout type_model; virtual void add_group(const Glib::RefPtr& model_parts, const Gtk::TreeModel::iterator& parent, const sharedptr& group); void add_group_children(const Glib::RefPtr& model_parts, const Gtk::TreeModel::iterator& parent, const sharedptr& group); void fill_group_children(const sharedptr& group, const Gtk::TreeModel::iterator& iter, const Glib::RefPtr model); sharedptr fill_group(const Gtk::TreeModel::iterator& iter, const Glib::RefPtr model); //Enable/disable buttons, depending on treeview selection: virtual void enable_buttons(); virtual void save_to_document(); sharedptr offer_relationship_list(); ///Depends on the active notebook tab. Glib::RefPtr get_selected_model(); Glib::RefPtr get_selected_model() const; Gtk::TreeView* get_selected_treeview(); const Gtk::TreeView* get_selected_treeview() const; Gtk::TreeModel::iterator get_selected_group_parent() const; Gtk::TreeModel::iterator get_selected_available() const; void setup_model(Gtk::TreeView& treeview, Glib::RefPtr& model); //signal handlers: virtual void on_button_add(); virtual void on_button_up(); virtual void on_button_down(); virtual void on_button_delete(); virtual void on_button_edit(); virtual void on_button_formatting(); virtual void on_treeview_parts_selection_changed(); virtual void on_treeview_available_parts_selection_changed(); void on_cell_data_part(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, const Glib::RefPtr& model); void on_cell_data_details(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, const Glib::RefPtr& model); void on_cell_data_available_part(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void on_notebook_switch_page(Gtk::Widget*, guint); void fill_report_parts(sharedptr& group, const Glib::RefPtr parts_model); Gtk::Notebook* m_notebook_parts; Gtk::TreeView* m_treeview_parts_header; Gtk::TreeView* m_treeview_parts_footer; Gtk::TreeView* m_treeview_parts_main; Gtk::TreeView* m_treeview_available_parts; Gtk::Button* m_button_up; Gtk::Button* m_button_down; Gtk::Button* m_button_add; Gtk::Button* m_button_delete; Gtk::Button* m_button_edit; Gtk::Button* m_button_formatting; Gtk::Label* m_label_table_name; Gtk::Entry* m_entry_name; Gtk::Entry* m_entry_title; Gtk::CheckButton* m_checkbutton_table_title; Glib::RefPtr m_model_parts_header; Glib::RefPtr m_model_parts_footer; Glib::RefPtr m_model_parts_main; Glib::RefPtr m_model_available_parts_headerfooter; Glib::RefPtr m_model_available_parts_main; Glib::ustring m_name_original; sharedptr m_report; sigc::connection m_signal_connection; }; } //namespace Glom #endif //GLOM_DIALOG_LAYOUT_REPORT_H glom-1.22.4/glom/mode_design/dialog_fields.h0000644000175000017500000000244312234252646022146 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef DIALOG_FIELDS_H #define DIALOG_FIELDS_H #include "dialog_design.h" #include "fields/box_db_table_definition.h" namespace Glom { class Dialog_Fields : public Dialog_Design { public: static const char* glade_id; static const bool glade_developer; Dialog_Fields(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Fields(); virtual bool init_db_details(const Glib::ustring& table_name); private: Box_DB_Table_Definition* m_box; }; } //namespace Glom #endif //DIALOG_FIELDS_H glom-1.22.4/glom/mode_design/dialog_relationships.cc0000644000175000017500000000360312234252646023721 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_relationships.h" #include "../box_db_table.h" //#include #include //For bold_message()). #include namespace Glom { const char* Dialog_Relationships::glade_id("window_design"); const bool Dialog_Relationships::glade_developer(true); Dialog_Relationships::Dialog_Relationships(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Design(cobject, builder), m_box(0) { builder->get_widget_derived("vbox_placeholder", m_box); //Fill composite view: add_view(m_box); show_all_children(); } Dialog_Relationships::~Dialog_Relationships() { remove_view(m_box); } /** * * @param table_name */ bool Dialog_Relationships::init_db_details(const Glib::ustring& table_name) { if(m_box) { m_box->load_from_document(); Dialog_Design::init_db_details(table_name); return m_box->init_db_details(table_name); } return false; } void Dialog_Relationships::on_hide() { //Save the relationships when the dialog is closed. save_to_document(); //Call base class: Dialog_Design::on_hide(); } } //namespace Glom glom-1.22.4/glom/mode_design/dialog_initial_password.cc0000644000175000017500000000575412234252646024421 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include //For Frame_Glom::show_ok_dialog #include #include namespace Glom { const char* Dialog_InitialPassword::glade_id("dialog_initial_password"); const bool Dialog_InitialPassword::glade_developer(true); Dialog_InitialPassword::Dialog_InitialPassword(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), Base_DB(), m_entry_user(0), m_entry_password(0) { builder->get_widget("entry_user", m_entry_user); builder->get_widget("entry_password", m_entry_password); builder->get_widget("entry_password_confirm", m_entry_password_confirm); } Dialog_InitialPassword::~Dialog_InitialPassword() { } Glib::ustring Dialog_InitialPassword::get_user() const { return m_entry_user->get_text(); } Glib::ustring Dialog_InitialPassword::get_password() const { return m_entry_password->get_text(); } void Dialog_InitialPassword::load_from_document() { Document* document = get_document(); if(document) { Glib::ustring user = document->get_connection_user(); //TODO: Offer a drop-down list of users. if(user.empty()) { //Default to the UNIX user name, which is often the same as the Postgres user name: const char* pchUser = getenv("USER"); if(pchUser) user = pchUser; } m_entry_user->set_text(user); } else std::cerr << G_STRFUNC << ": no document" << std::endl; } bool Dialog_InitialPassword::check_password() { if(m_entry_user->get_text().empty()) { Frame_Glom::show_ok_dialog(_("Username Is Empty"), _("Please enter a login name for the new user."), *this, Gtk::MESSAGE_ERROR); return false; } else if(m_entry_password->get_text() != m_entry_password_confirm->get_text()) { Frame_Glom::show_ok_dialog(_("Passwords Do Not Match"), _("The entered password does not match the entered password confirmation. Please try again."), *this, Gtk::MESSAGE_ERROR); return false; } else if(m_entry_password->get_text().empty()) { Frame_Glom::show_ok_dialog(_("Password Is Empty"), _("Please enter a password for this user."), *this, Gtk::MESSAGE_ERROR); return false; } else return true; } } //namespace Glom glom-1.22.4/glom/mode_design/iso_codes.cc0000644000175000017500000002653512234776363021505 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" //For ISO_CODES_PREFIX. #include #include //#include #include #include #include #include namespace Glom { namespace IsoCodes { static type_list_currencies list_currencies; static type_list_locales list_locales; typedef std::map type_map_locales; //ID to locale. static type_map_locales map_locales; //For quick lookup. type_list_currencies get_list_of_currency_symbols() { if(list_currencies.empty()) { const Glib::ustring filename = ISO_CODES_PREFIX "/share/xml/iso-codes/iso_4217.xml"; #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED try #endif // LIBXMLCPP_EXCEPTIONS_ENABLED { xmlpp::DomParser parser; //parser.set_validate(); parser.set_substitute_entities(); //We just want the text to be resolved/unescaped automatically. parser.parse_file(filename); if(parser) { //Walk the tree: const xmlpp::Node* nodeRoot = parser.get_document()->get_root_node(); //deleted by DomParser. xmlpp::Node::NodeList listNodes = nodeRoot->get_children("iso_4217_entry"); for(xmlpp::Node::NodeList::const_iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* nodeEntry = dynamic_cast(*iter); if(nodeEntry) { Currency currency; const xmlpp::Attribute* attribute_code = nodeEntry->get_attribute("letter_code"); if(attribute_code) currency.m_symbol = attribute_code->get_value(); const xmlpp::Attribute* attribute_name = nodeEntry->get_attribute("currency_name"); if(attribute_name) { Glib::ustring name = _(attribute_name->get_value().c_str()); const char* pchTranslatedName = dgettext("iso_4217", name.c_str()); if(pchTranslatedName) name = pchTranslatedName; currency.m_name = name; } list_currencies.push_back(currency); } } } } #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED catch(const std::exception& ex) { std::cerr << "Exception while parsing iso codes (currencies): " << ex.what() << std::endl; } #endif // LIBXMLCPP_EXCEPTIONS_ENABLED } return list_currencies; } static void split_locale_id(const Glib::ustring& locale_id, Glib::ustring& language_id, Glib::ustring& country_id) { //Split the locale ID into language and country parts: language_id = Utils::locale_language_id(locale_id); country_id.clear(); if(!language_id.empty() && ((language_id.size() +1) < locale_id.size())) country_id = locale_id.substr(language_id.size() + 1); } Glib::ustring get_locale_name(const Glib::ustring& locale_id) { //Build the list of locales, with their translated language and countries names: if(map_locales.empty()) { //Get a list of locale IDs: typedef std::list type_list_ids; type_list_ids list_ids; const std::string locales_path = "/usr/share/i18n/locales/"; try { Glib::Dir dir(locales_path); list_ids = type_list_ids(dir.begin(), dir.end()); } catch(const Glib::FileError& ex) { std::cerr << G_STRFUNC << ": Could not open (or read) glibc locales directory: " << locales_path << "Error: " << ex.what() << std::endl; } //Make sure that we list non-specific versions of the locales too, //because this is normally what translators translate to. //For instance, po/ files generally contain po/de.po. type_list_ids list_ids_simple; for(type_list_ids::const_iterator iter = list_ids.begin(); iter != list_ids.end(); ++iter) { const Glib::ustring id = *iter; Glib::ustring id_language, id_country; split_locale_id(id, id_language, id_country); list_ids_simple.push_back(id_language); } //Add the non-specific locales: for(type_list_ids::const_iterator iter = list_ids_simple.begin(); iter != list_ids_simple.end(); ++iter) { const Glib::ustring id = *iter; if(std::find(list_ids.begin(), list_ids.end(), id) == list_ids.end()) list_ids.push_back(id); } //Get the (translated) language names: typedef std::map type_map_language; //ID to language name. type_map_language map_languages; const std::string filename_languages = ISO_CODES_PREFIX "/share/xml/iso-codes/iso_639.xml"; #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED try #endif // LIBXMLCPP_EXCEPTIONS_ENABLED { xmlpp::DomParser parser; //parser.set_validate(); parser.set_substitute_entities(); //We just want the text to be resolved/unescaped automatically. parser.parse_file(filename_languages); if(parser) { //Walk the tree: const xmlpp::Node* nodeRoot = parser.get_document()->get_root_node(); //deleted by DomParser. xmlpp::Node::NodeList listNodes = nodeRoot->get_children("iso_639_entry"); for(xmlpp::Node::NodeList::const_iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* nodeEntry = dynamic_cast(*iter); if(nodeEntry) { //TODO: There are 3 codes (not each entry has each code). Is this the correct one to identify a language? const xmlpp::Attribute* attribute_code = nodeEntry->get_attribute("iso_639_1_code"); if(attribute_code) { const Glib::ustring identifier = attribute_code->get_value(); if(!identifier.empty()) { const xmlpp::Attribute* attribute_name = nodeEntry->get_attribute("name"); if(attribute_name) { Glib::ustring name = attribute_name->get_value(); const char* pchTranslatedName = dgettext("iso_639", name.c_str()); if(pchTranslatedName) name = pchTranslatedName; map_languages[identifier] = name; } } } } } } } #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED catch(const std::exception& ex) { std::cerr << "Exception while parsing iso codes (locales): " << ex.what() << std::endl; } #endif // LIBXMLCPP_EXCEPTIONS_ENABLED //Get the (translated) country names: typedef std::map type_map_country; //ID to country name. type_map_country map_country; const Glib::ustring filename_countries = ISO_CODES_PREFIX "/share/xml/iso-codes/iso_3166.xml"; #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED try #endif // LIBXMLCPP_EXCEPTIONS_ENABLED { xmlpp::DomParser parser; //parser.set_validate(); parser.set_substitute_entities(); //We just want the text to be resolved/unescaped automatically. parser.parse_file(filename_countries); if(parser) { //Walk the tree: const xmlpp::Node* nodeRoot = parser.get_document()->get_root_node(); //deleted by DomParser. xmlpp::Node::NodeList listNodes = nodeRoot->get_children("iso_3166_entry"); for(xmlpp::Node::NodeList::const_iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* nodeEntry = dynamic_cast(*iter); if(nodeEntry) { const xmlpp::Attribute* attribute_code = nodeEntry->get_attribute("alpha_2_code"); if(attribute_code) { const Glib::ustring identifier = attribute_code->get_value(); if(!identifier.empty()) { const xmlpp::Attribute* attribute_name = nodeEntry->get_attribute("name"); if(attribute_name) { Glib::ustring name = attribute_name->get_value(); const char* pchTranslatedName = dgettext("iso_3166", name.c_str()); if(pchTranslatedName) name = pchTranslatedName; map_country[identifier] = name; } } } } } } } #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED catch(const std::exception& ex) { std::cerr << "Exception while parsing iso codes (locales): " << ex.what() << std::endl; } #endif // LIBXMLCPP_EXCEPTIONS_ENABLED //Use a map so we can easily check for duplicates. for(type_list_ids::iterator iter = list_ids.begin(); iter != list_ids.end(); ++iter) { const Glib::ustring identifier = Utils::locale_simplify(*iter); if(map_locales.find(identifier) == map_locales.end()) //Prevent duplicates. { //Split the locale ID into language and country parts: Glib::ustring id_language, id_country; split_locale_id(identifier, id_language, id_country); //std::cout << "debug: id_language=" << id_language << ", id_country=" << id_country << std::endl; //Get the translated human-readable names of the language and country: Glib::ustring name; type_map_language::iterator iterFindLanguage = map_languages.find(id_language); if(iterFindLanguage != map_languages.end()) //Ignore languages that are not listed by iso-codes. { name += iterFindLanguage->second; if(!id_country.empty()) { type_map_country::iterator iterFindCountry = map_country.find(id_country); if(iterFindCountry != map_country.end()) name += " (" + iterFindCountry->second + ')'; else name = Glib::ustring(); //Ignore locales with unnamed countries. } if(!name.empty()) //Ignore locales that are not listed by iso-codes. They are probably strange things that humans can't understand { Locale the_locale; the_locale.m_identifier = identifier; the_locale.m_name = name; map_locales[identifier] = the_locale; //std::cout << "DEBUG: id=" << identifier << ", name=" << name << std::endl; } } } } } Glib::ustring result; type_map_locales::const_iterator iter = map_locales.find(locale_id); if(iter != map_locales.end()) result = iter->second.m_name; return result; } type_list_locales get_list_of_locales() { if(list_locales.empty()) { get_locale_name("temp"); //Fill the map. //Put the map into a list: for(type_map_locales::iterator iter = map_locales.begin(); iter != map_locales.end(); ++iter) { list_locales.push_back(iter->second); } } return list_locales; } } //namespace Glom } //namespace IsoCodes glom-1.22.4/glom/mode_design/print_layouts/0000755000175000017500000000000012235000127022103 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/print_layouts/print_layout_toolbar.cc0000644000175000017500000000531712234776363026720 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007, 2008 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "print_layout_toolbar.h" #include #include #include namespace Glom { PrintLayoutToolbar::PrintLayoutToolbar() : m_group_items(_("Items")), m_group_lines(_("Lines")), m_group_records(_("Records")), m_drag_field("glom-field.png", PrintLayoutToolbarButton::ITEM_FIELD, _("Database Field"), _("Drag this to the layout to add a new database field.")), m_drag_text("glom-text.png", PrintLayoutToolbarButton::ITEM_TEXT, _("Text"), _("Drag this to the layout to add a new static text box.")), m_drag_image("glom-image.png", PrintLayoutToolbarButton::ITEM_IMAGE, _("Image"), _("Drag this to the layout to add a new static image.")), m_drag_line_horizontal("glom-line-horizontal.png", PrintLayoutToolbarButton::ITEM_LINE_HORIZONTAL, _("Horizontal Line"), _("Drag this to the layout to add a new horizontal line.")), m_drag_line_vertical("glom-line-vertical.png", PrintLayoutToolbarButton::ITEM_LINE_VERTICAL, _("Vertical Line"), _("Drag this to the layout to add a new vertical line.")), m_drag_related_records("glom-related-records.png", PrintLayoutToolbarButton::ITEM_PORTAL, _("Related Records"), _("Drag this to the layout to add a new related records portal.")) { // Looks ugly otherwise: set_size_request(100, 200); //Note for translators: These are layout items, like widgets in GTK+. m_group_items.add(m_drag_field); m_group_items.add(m_drag_text); m_group_items.add(m_drag_image); //Note for translators: These are layout items, like widgets in GTK+. m_group_lines.add(m_drag_line_horizontal); m_group_lines.add(m_drag_line_vertical); //Note for translators: These are layout items, like widgets in GTK+. m_group_records.add(m_drag_related_records); add(m_group_items); add(m_group_lines); add(m_group_records); set_drag_source(); show_all_children(); } PrintLayoutToolbar::~PrintLayoutToolbar() { } } // namespace Glom glom-1.22.4/glom/mode_design/print_layouts/box_print_layouts.h0000644000175000017500000000402712234252646026061 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef BOX_PRINT_LAYOUTS_H #define BOX_PRINT_LAYOUTS_H #include #include #include namespace Glom { class Box_Print_Layouts : public Box_DB_Table { public: static const char* glade_id; static const bool glade_developer; Box_Print_Layouts(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Box_Print_Layouts(); private: virtual bool fill_from_database(); //override virtual void fill_row(const Gtk::TreeModel::iterator& iter, const sharedptr& print_layout); virtual void save_to_document(); //Signal handlers: void on_adddel_user_added(const Gtk::TreeModel::iterator& row); void on_adddel_user_requested_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& rowEnd); void on_adddel_user_requested_edit(const Gtk::TreeModel::iterator& row); void on_adddel_user_changed(const Gtk::TreeModel::iterator& row, guint column); virtual void on_userlevel_changed(AppState::userlevels userlevel); guint m_colName; guint m_colTitle; mutable AddDel_WithButtons m_AddDel; //mutable because its get_ methods aren't const. }; } //namespace Glom #endif //BOX_PRINT_LAYOUTS_H glom-1.22.4/glom/mode_design/print_layouts/window_print_layout_edit.h0000644000175000017500000001633612234776363027437 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef WINDOW_PRINT_LAYOUT_EDIT_H #define WINDOW_PRINT_LAYOUT_EDIT_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Glom { class Window_PrintLayout_Edit : public Gtk::Window, public View_Composite_Glom { public: static const char* glade_id; static const bool glade_developer; Window_PrintLayout_Edit(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Window_PrintLayout_Edit(); virtual bool init_db_details(const Glib::ustring& table_name); void set_print_layout(const Glib::ustring& table_name, const sharedptr& print_layout); Glib::ustring get_original_name() const; sharedptr get_print_layout(); private: void enable_buttons(); void init_menu(); sharedptr create_empty_item(PrintLayoutToolbarButton::enumItems item_type); void on_menu_file_page_setup(); void on_menu_file_print_preview(); void on_menu_insert_field(); void on_menu_insert_text(); void on_menu_insert_image(); void on_menu_insert_relatedrecords(); void on_menu_insert_line_horizontal(); void on_menu_insert_line_vertical(); void on_menu_insert_create_standard(); void on_menu_insert_add_page(); void on_menu_insert_delete_page(); void on_menu_view_show_grid(); void on_menu_view_show_rules(); void on_menu_view_show_outlines(); void on_menu_view_zoom(guint percent); void on_menu_view_fitpagewidth(); void on_menu_edit_cut(); void on_menu_edit_copy(); void on_menu_edit_paste(); void on_menu_edit_delete(); void on_menu_edit_selectall(); void on_menu_edit_unselectall(); void on_menu_align_top(); void on_menu_align_bottom(); void on_menu_align_left(); void on_menu_align_right(); bool on_canvas_motion_notify_event(GdkEventMotion* event); void on_canvas_show_context_menu(guint button, guint32 activate_time); void on_context_menu_insert_field(); void on_context_menu_insert_text(); void on_scroll_value_changed(); void on_button_close(); //void on_toolbar_item_drag_begin(const Glib::RefPtr& drag_context); //void on_toolbar_item_drag_end(const Glib::RefPtr& drag_context); bool on_canvas_drag_drop(const Glib::RefPtr& drag_context, int x, int y, guint timestamp); bool on_canvas_drag_motion(const Glib::RefPtr& drag_context, int x, int y, guint timestamp); void on_canvas_drag_data_received(const Glib::RefPtr& drag_context, int x, int y, const Gtk::SelectionData& selection_data, guint info, guint timestamp); void on_canvas_drag_leave(const Glib::RefPtr& drag_context, guint timestamp); void on_canvas_selection_changed(); void on_selected_item_moved(const Glib::RefPtr& item, double x_offset, double y_offset); void on_spinbutton_x(); void on_spinbutton_y(); void on_spinbutton_width(); void on_spinbutton_height(); bool on_hruler_button_press_event(GdkEventButton* event); bool on_vruler_button_press_event(GdkEventButton* event); //override: virtual bool on_configure_event(GdkEventConfigure* event); void update_table_title(); void setup_context_menu(); void set_ruler_sizes(); bool get_is_item_at(double x, double y); void set_default_position(const sharedptr& item); void canvas_convert_from_drag_pixels(double& x, double& y, bool adjust_for_scrolling = false) const; void get_dimensions_of_multiple_selected_items(double& x, double& y, double& width, double& height); Glib::RefPtr create_canvas_layout_item_and_add(const sharedptr& layout_item); //Box_DB_Table_Definition* m_box; Glib::ustring m_name_original; Glib::ustring m_table_name; bool m_modified; sharedptr m_print_layout; Gtk::Entry* m_entry_name; Gtk::Entry* m_entry_title; Gtk::Label* m_label_table_name; //Gtk::Label* m_label_table_title; Gtk::Button* m_button_close; Gtk::Box* m_box_menu; Gtk::Box* m_box_canvas; Gtk::Box* m_box; Gtk::ScrolledWindow m_scrolled_window; Canvas_PrintLayout m_canvas; //Widgets that let the user edit item position and size: Gtk::Box* m_box_item_position; Gtk::SpinButton* m_spinbutton_x; Gtk::SpinButton* m_spinbutton_y; Gtk::SpinButton* m_spinbutton_width; Gtk::SpinButton* m_spinbutton_height; bool m_ignore_spinbutton_signals; //A preview of the item being dragged onto the canvas: bool m_drag_preview_requested; Glib::RefPtr m_layout_item_dropping; bool m_temp_rule_horizontal; //Otherwise vertical. //A cache of the selected item, //to avoid repeatedly requesting it: typedef std::vector< Glib::RefPtr > type_vec_canvas_items; type_vec_canvas_items m_layout_items_selected; typedef std::vector type_vec_connections; type_vec_connections m_connections_items_selected_moved; //A copied item to be pasted later: typedef LayoutGroup::type_list_items type_list_items; type_list_items m_layout_items_to_paste; std::vector m_drag_targets_rule; GimpRuler* m_vruler; GimpRuler* m_hruler; //Main menu: Glib::RefPtr m_action_group; Glib::RefPtr m_uimanager; Glib::RefPtr m_action_showgrid, m_action_showrules, m_action_showoutlines; Glib::RefPtr m_action_zoom_fit_page_width; //Edit menu: Glib::RefPtr m_action_edit_cut, m_action_edit_copy, m_action_edit_paste, m_action_edit_delete; //Align menu: Glib::RefPtr m_action_align_top, m_action_align_bottom, m_action_align_left, m_action_align_right; //Toolbar: Gtk::Box* m_palette_box; std::vector m_drag_targets_all; PrintLayoutToolbar m_toolbar; //Context menu for clicking on empty space on the canvas: Gtk::Menu* m_context_menu; Glib::RefPtr m_context_menu_action_group; Glib::RefPtr m_context_menu_uimanager; }; } //namespace Glom #endif //WINDOW_PRINT_LAYOUT_EDIT_H glom-1.22.4/glom/mode_design/print_layouts/dialog_text_formatting.h0000644000175000017500000000332112234252646027026 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_TEXT_FORMATTING_H #define GLOM_DIALOG_TEXT_FORMATTING_H #include #include #include #include namespace Glom { //TODO: Rename this? It seems to be only used for Print Layouts. Or why not use Dialog_Formatting instead? /** A dialog with a titled frame, a label for the table title, and a close button. */ class Dialog_TextFormatting : public Gtk::Window, public View_Composite_Glom { public: static const char* glade_id; static const bool glade_developer; Dialog_TextFormatting(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_TextFormatting(); //Allow direct access, for convenience: Gtk::Box* m_box_formatting_placeholder; Box_Formatting* m_box_formatting; private: virtual void on_button_close(); }; } //namespace Glom #endif //GLOM_DIALOG_TEXT_FORMATTING_H glom-1.22.4/glom/mode_design/print_layouts/box_print_layouts.cc0000644000175000017500000002012012234776363026216 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "box_print_layouts.h" #include #include #include #include #include //For bold_message()). #include #include namespace Glom { const char* Box_Print_Layouts::glade_id("box_print_layouts"); const bool Box_Print_Layouts::glade_developer(true); Box_Print_Layouts::Box_Print_Layouts(BaseObjectType* cobject, const Glib::RefPtr& builder) : Box_DB_Table(cobject, builder), m_colName(0), m_colTitle(0) { //Get the Glade-instantiated widgets, and connect signal handlers: Gtk::Button* pButtonCancel = 0; builder->get_widget("button_cancel", pButtonCancel); set_button_cancel(*pButtonCancel); Gtk::Alignment* pAligmentPlaceholder = 0; builder->get_widget("alignment_placeholder_adddel", pAligmentPlaceholder); pAligmentPlaceholder->add(m_AddDel); m_AddDel.signal_user_added().connect(sigc::mem_fun(*this, &Box_Print_Layouts::on_adddel_user_added)); m_AddDel.signal_user_requested_delete().connect(sigc::mem_fun(*this, &Box_Print_Layouts::on_adddel_user_requested_delete)); m_AddDel.signal_user_requested_edit().connect(sigc::mem_fun(*this, &Box_Print_Layouts::on_adddel_user_requested_edit)); m_AddDel.signal_user_changed().connect(sigc::mem_fun(*this, &Box_Print_Layouts::on_adddel_user_changed)); show_all_children(); } Box_Print_Layouts::~Box_Print_Layouts() { } void Box_Print_Layouts::fill_row(const Gtk::TreeModel::iterator& iter, const sharedptr& item) { if(iter) { const Glib::ustring& name = item->get_name(); m_AddDel.set_value_key(iter, name); m_AddDel.set_value(iter, m_colName, name); m_AddDel.set_value(iter, m_colTitle, item_get_title(item)); } } bool Box_Print_Layouts::fill_from_database() { BusyCursor busy_cursor(get_app_window()); bool result = Base_DB::fill_from_database(); //Enable/Disable extra widgets: bool developer_mode = (get_userlevel() == AppState::USERLEVEL_DEVELOPER); //Developers see more columns, so make it bigger: if(developer_mode) set_size_request(400, -1); else set_size_request(-1, -1); m_AddDel.remove_all(); //Add the columns: m_AddDel.remove_all_columns(); const bool editable = developer_mode; const bool visible_extras = developer_mode; m_colName = m_AddDel.add_column(_("Name"), AddDelColumnInfo::STYLE_Text, editable, visible_extras); m_AddDel.prevent_duplicates(m_colName); //Don't allow a relationship to be added twice. m_AddDel.set_prevent_duplicates_warning(_("This item already exists. Please choose a different item name")); m_colTitle = m_AddDel.add_column(_("Title"), AddDelColumnInfo::STYLE_Text, editable, true); std::vector listItems; Document* document = get_document(); if(document) { listItems = document->get_print_layout_names(m_table_name); for(std::vector::const_iterator iter = listItems.begin(); iter != listItems.end(); ++iter) { sharedptr item = document->get_print_layout(m_table_name, *iter); if(item) { Gtk::TreeModel::iterator row = m_AddDel.add_item(item->get_name()); fill_row(row, item); } } } else std::cerr << G_STRFUNC << ": document is null" << std::endl; //TODO: m_AddDel.set_allow_add(developer_mode); m_AddDel.set_allow_delete(developer_mode); return result; } void Box_Print_Layouts::on_adddel_user_added(const Gtk::TreeModel::iterator& row) { sharedptr item = sharedptr::create(); const Glib::ustring name = m_AddDel.get_value(row, m_colName); if(!name.empty()) { item->set_name(name); m_AddDel.set_value_key(row, name); //Set a suitable starting title, if there is none already: Glib::ustring title = m_AddDel.get_value(row, m_colTitle); if(title.empty()) { title = Utils::title_from_string(name); m_AddDel.set_value(row, m_colTitle, title); } item->set_title(title, AppWindow::get_current_locale()); get_document()->set_print_layout(m_table_name, item); } } void Box_Print_Layouts::on_adddel_user_requested_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& /* TODO: rowEnd */) { const Glib::ustring name = m_AddDel.get_value_key(rowStart); if(!name.empty()) { get_document()->remove_print_layout(m_table_name, name); m_AddDel.remove_item_by_key(name); } } void Box_Print_Layouts::on_adddel_user_requested_edit(const Gtk::TreeModel::iterator& row) { Glib::ustring name = m_AddDel.get_value_key(row); Document* document = get_document(); if(document) { save_to_document(); //Emit the signal: signal_selected.emit(name); } } void Box_Print_Layouts::save_to_document() { if(get_userlevel() == AppState::USERLEVEL_DEVELOPER) { //Add any that are not in the document: std::vector listItems = get_document()->get_print_layout_names(m_table_name); bool modified = false; for(Gtk::TreeModel::iterator iter = m_AddDel.get_model()->children().begin(); iter != m_AddDel.get_model()->children().end(); ++iter) { const Glib::ustring name = m_AddDel.get_value(iter, m_colName); if(!name.empty() && std::find(listItems.begin(), listItems.end(), name) == listItems.end()) { sharedptr item(new PrintLayout()); item->set_name(name); item->set_title( m_AddDel.get_value(iter, m_colTitle) , AppWindow::get_current_locale()); //TODO: Translations: Store the original in the TreeView. get_document()->set_print_layout(m_table_name, item); modified = true; } } if(modified) get_document()->set_modified(true); } } void Box_Print_Layouts::on_adddel_user_changed(const Gtk::TreeModel::iterator& row, guint column) { if(get_userlevel() == AppState::USERLEVEL_DEVELOPER) { const Glib::ustring name = m_AddDel.get_value_key(row); Document* document = get_document(); sharedptr item = document->get_print_layout(m_table_name, name); if(item) { if(column == m_colTitle) { item->set_title( m_AddDel.get_value(row, m_colTitle) , AppWindow::get_current_locale()); //TODO: Unnecessary: document->set_print_layout(m_table_name, item); } else if(column == m_colName) { const Glib::ustring name_new = m_AddDel.get_value(row, m_colName); if(!name.empty() && !name_new.empty()) { Glib::ustring strMsg = _("Are you sure that you want to rename this print layout?"); //TODO: Show old and new names? Gtk::MessageDialog dialog(_("Rename Print Layout"), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE ); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Rename"), Gtk::RESPONSE_OK); dialog.set_secondary_text(strMsg); const int iButtonClicked = dialog.run(); //Rename the item: if(iButtonClicked == Gtk::RESPONSE_OK) { m_AddDel.set_value_key(row, name_new); document->remove_print_layout(m_table_name, name); item->set_name(name_new); document->set_print_layout(m_table_name, item); } } } } } } void Box_Print_Layouts::on_userlevel_changed(AppState::userlevels /* userlevel */) { fill_from_database(); } } //namespace Glom glom-1.22.4/glom/mode_design/print_layouts/window_print_layout_edit.cc0000644000175000017500000015671012234776363027576 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "window_print_layout_edit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include //For bold_message()).> #include #include namespace Glom { const char* Window_PrintLayout_Edit::glade_id("window_print_layout_edit"); const bool Window_PrintLayout_Edit::glade_developer(true); static const char DRAG_TARGET_NAME_RULE[] = "application/x-glom-printoutlayout-rule"; Window_PrintLayout_Edit::Window_PrintLayout_Edit(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Window(cobject), m_entry_name(0), m_entry_title(0), m_label_table_name(0), m_button_close(0), m_box(0), m_box_item_position(0), m_spinbutton_x(0), m_spinbutton_y(0), m_spinbutton_width(0), m_spinbutton_height(0), m_ignore_spinbutton_signals(false), m_drag_preview_requested(false), m_temp_rule_horizontal(false), m_vruler(0), m_hruler(0), m_context_menu(0) { //See CanvasPrintLayout's commented-out use of set_size_request() //for an attempt to do this properly. //Try to give the user a large-enough window for working with a whole page: //TODO: Make this even larger if we can be sure that no WM will make //the window bigger than the screen. set_default_size(900, 640); add_view(&m_canvas); builder->get_widget("vbox_menu", m_box_menu); builder->get_widget("vbox_canvas", m_box_canvas); builder->get_widget("vbox_inner", m_box); builder->get_widget("label_table_name", m_label_table_name); builder->get_widget("entry_name", m_entry_name); builder->get_widget("entry_title", m_entry_title); builder->get_widget("box_item_position", m_box_item_position); builder->get_widget("spinbutton_x", m_spinbutton_x); m_spinbutton_x->signal_value_changed().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_spinbutton_x)); builder->get_widget("spinbutton_y", m_spinbutton_y); m_spinbutton_y->signal_value_changed().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_spinbutton_y)); builder->get_widget("spinbutton_width", m_spinbutton_width); m_spinbutton_width->signal_value_changed().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_spinbutton_width)); builder->get_widget("spinbutton_height", m_spinbutton_height); m_spinbutton_height->signal_value_changed().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_spinbutton_height)); const Gtk::TargetEntry target_rule(DRAG_TARGET_NAME_RULE, Gtk::TARGET_SAME_APP, 0); m_drag_targets_rule.push_back(target_rule); //The rulers are not in the glade file because they use an unusual widget //that Glade wouldn't usually know about: m_vruler = GIMP_RULER(gimp_ruler_new(GTK_ORIENTATION_VERTICAL)); gtk_widget_show(GTK_WIDGET(m_vruler)); Glib::wrap(GTK_WIDGET(m_vruler))->drag_source_set(m_drag_targets_rule); m_hruler = GIMP_RULER(gimp_ruler_new(GTK_ORIENTATION_HORIZONTAL)); gtk_widget_show(GTK_WIDGET(m_hruler)); Glib::wrap(GTK_WIDGET(m_hruler))->drag_source_set(m_drag_targets_rule); //Handle mouse button presses on the rulers, to start rule dragging: gtk_widget_set_events (GTK_WIDGET(m_hruler), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); gtk_widget_set_events (GTK_WIDGET(m_vruler), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); Glib::wrap(GTK_WIDGET(m_hruler))->signal_button_press_event().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_hruler_button_press_event), true); Glib::wrap(GTK_WIDGET(m_vruler))->signal_button_press_event().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_vruler_button_press_event), false); //Add the ruler widgets to the table at the left and top: //TODO: Use C++ API here: Gtk::Grid* grid = 0; builder->get_widget("grid_canvas", grid); gtk_grid_attach(grid->gobj(), GTK_WIDGET(m_vruler), 0, 1, 1, 1); gtk_widget_set_hexpand(GTK_WIDGET(m_vruler), FALSE); gtk_widget_set_vexpand(GTK_WIDGET(m_vruler), TRUE); gtk_grid_attach(grid->gobj(), GTK_WIDGET(m_hruler), 1, 0, 1, 1); gtk_widget_set_hexpand(GTK_WIDGET(m_hruler), TRUE); gtk_widget_set_vexpand(GTK_WIDGET(m_hruler), FALSE); gimp_ruler_set_unit(m_hruler, GIMP_UNIT_MM); gimp_ruler_set_unit(m_vruler, GIMP_UNIT_MM); builder->get_widget("toolpalette_box", m_palette_box); builder->get_widget("button_close", m_button_close); m_button_close->signal_clicked().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_button_close) ); m_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); m_scrolled_window.add(m_canvas); m_scrolled_window.show_all(); m_box_canvas->pack_start(m_scrolled_window); m_canvas.show(); //Make the canvas a drag-and-drop destination: //TODO: Does this need to be a member variable? m_drag_targets_all = m_drag_targets_rule; const Gtk::TargetEntry toolbar_target = Gtk::ToolPalette::get_drag_target_item(); m_drag_targets_all.push_back(toolbar_target); //Note that we don't use Gtk::DEST_DEFAULT_DEFAULTS because that would prevent our signal handlers from being used: m_canvas.drag_dest_set(m_drag_targets_all, Gtk::DEST_DEFAULT_HIGHLIGHT, Gdk::ACTION_COPY); m_canvas.signal_drag_drop().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_canvas_drag_drop) ); m_canvas.signal_drag_motion().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_canvas_drag_motion) ); m_canvas.signal_drag_data_received().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_canvas_drag_data_received) ); m_canvas.signal_drag_leave().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_canvas_drag_leave) ); init_menu(); m_palette_box->add(m_toolbar); //TODO: Just put the GtkToolPalette in the glade file and use get_widget_derived()? m_toolbar.show(); m_scrolled_window.get_hadjustment()->signal_changed().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_scroll_value_changed) ); m_scrolled_window.get_hadjustment()->signal_value_changed().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_scroll_value_changed) ); m_scrolled_window.get_vadjustment()->signal_changed().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_scroll_value_changed) ); m_scrolled_window.get_vadjustment()->signal_value_changed().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_scroll_value_changed) ); //Fill composite view: //add_view(m_box); setup_context_menu(); m_canvas.signal_show_context().connect(sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_canvas_show_context_menu)); m_canvas.signal_motion_notify_event().connect(sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_canvas_motion_notify_event)); m_canvas.signal_selection_changed().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_canvas_selection_changed)); on_canvas_selection_changed(); //Disable relevant widgets or actions by default. show_all_children(); } void Window_PrintLayout_Edit::init_menu() { m_action_group = Gtk::ActionGroup::create(); m_action_group->add(Gtk::Action::create("Menu_File", _("_File"))); m_action_group->add(Gtk::Action::create("Action_Menu_File_PageSetup", Gtk::Stock::PAGE_SETUP), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_file_page_setup)); m_action_group->add(Gtk::Action::create("Action_Menu_File_PrintPreview", Gtk::Stock::PRINT_PREVIEW), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_file_print_preview)); m_action_group->add(Gtk::Action::create("Menu_Edit", Gtk::Stock::EDIT)); m_action_edit_cut = Gtk::Action::create("Action_Menu_Edit_Cut", Gtk::Stock::CUT); m_action_group->add(m_action_edit_cut, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_edit_cut) ); m_action_edit_copy = Gtk::Action::create("Action_Menu_Edit_Copy", Gtk::Stock::COPY); m_action_group->add(m_action_edit_copy, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_edit_copy) ); m_action_edit_paste = Gtk::Action::create("Action_Menu_Edit_Paste", Gtk::Stock::PASTE); m_action_group->add(m_action_edit_paste, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_edit_paste) ); m_action_edit_paste->set_sensitive(false); //This is enable when something is copied or cut. m_action_edit_delete = Gtk::Action::create("Action_Menu_Edit_Delete", Gtk::Stock::DELETE); m_action_group->add(m_action_edit_delete, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_edit_delete) ); m_action_group->add( Gtk::Action::create("Action_Menu_Edit_SelectAll", Gtk::Stock::SELECT_ALL), Gtk::AccelKey("A"), //TODO: Suggest this as part of the stock item in GTK+? sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_edit_selectall) ); m_action_group->add( Gtk::Action::create("Action_Menu_Edit_UnselectAll", _("Unselect All")), //TODO: Propose a new stock item for GTK+. sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_edit_unselectall) ); m_action_group->add(Gtk::Action::create("Menu_Insert", _("_Insert"))); m_action_group->add(Gtk::Action::create("Action_Menu_Insert_Field", _("Insert _Field")), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_insert_field) ); m_action_group->add(Gtk::Action::create("Action_Menu_Insert_Text", _("Insert _Text")), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_insert_text) ); m_action_group->add(Gtk::Action::create("Action_Menu_Insert_Image", _("Insert _Image")), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_insert_image) ); m_action_group->add(Gtk::Action::create("Action_Menu_Insert_RelatedRecords", _("Insert _Related Records")), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_insert_relatedrecords) ); m_action_group->add(Gtk::Action::create("Action_Menu_Insert_LineHorizontal", _("Insert _Horizontal Line")), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_insert_line_horizontal) ); m_action_group->add(Gtk::Action::create("Action_Menu_Insert_LineVertical", _("Insert _Vertical Line")), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_insert_line_vertical) ); m_action_group->add(Gtk::Action::create("Action_Menu_Insert_CreateStandard", _("_Create Standard Layout")), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_insert_create_standard) ); m_action_group->add(Gtk::Action::create("Action_Menu_Insert_AddPage", _("_Add Page")), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_insert_add_page) ); m_action_group->add(Gtk::Action::create("Action_Menu_Insert_DeletePage", _("_Delete Page")), sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_insert_delete_page) ); m_action_group->add(Gtk::Action::create("Menu_Align", _("_Align"))); m_action_align_top = Gtk::Action::create("Action_Menu_Align_Top", _("Align _Top")); m_action_group->add(m_action_align_top, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_align_top) ); m_action_align_bottom = Gtk::Action::create("Action_Menu_Align_Bottom", _("Align _Bottom")); m_action_group->add(m_action_align_bottom, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_align_bottom) ); m_action_align_left = Gtk::Action::create("Action_Menu_Align_Left", _("Align _Left")); m_action_group->add(m_action_align_left, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_align_left) ); m_action_align_right = Gtk::Action::create("Action_Menu_Align_Right", _("Align _Right")); m_action_group->add(m_action_align_right, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_align_right) ); m_action_group->add(Gtk::Action::create("Menu_View", _("_View"))); m_action_showgrid = Gtk::ToggleAction::create("Action_Menu_View_ShowGrid", _("Show Grid")); m_action_group->add(m_action_showgrid, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_view_show_grid)); m_action_showrules = Gtk::ToggleAction::create("Action_Menu_View_ShowRules", _("Show Rules")); m_action_group->add(m_action_showrules, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_view_show_rules)); m_action_showoutlines = Gtk::ToggleAction::create("Action_Menu_View_ShowOutlines", _("Show Outlines")); m_action_group->add(m_action_showoutlines, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_view_show_outlines)); Gtk::RadioAction::Group group_zoom; m_action_zoom_fit_page_width = Gtk::RadioAction::create(group_zoom, "Action_Menu_View_ZoomFitPageWidth", _("Fit Page _Width")); m_action_group->add(m_action_zoom_fit_page_width, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_view_fitpagewidth)); m_action_group->add(Gtk::RadioAction::create(group_zoom, "Action_Menu_View_Zoom200", _("Zoom 200%")), sigc::bind( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_view_zoom), 200)); Glib::RefPtr action_zoom100 = Gtk::RadioAction::create(group_zoom, "Action_Menu_View_Zoom100", Gtk::Stock::ZOOM_100); m_action_group->add(action_zoom100, sigc::bind( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_view_zoom), 100)); Glib::RefPtr action_50 = Gtk::RadioAction::create(group_zoom, "Action_Menu_View_Zoom50", _("Zoom 50%")); m_action_group->add(action_50, sigc::bind( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_view_zoom), 50)); m_action_group->add(Gtk::RadioAction::create(group_zoom, "Action_Menu_View_Zoom25", _("Zoom 25%")), sigc::bind( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_menu_view_zoom), 25)); action_zoom100->activate(); //This seems like a sane default. //Build part of the menu structure, to be merged in by using the "PH" placeholders: static const Glib::ustring ui_description = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; //Add menu: m_uimanager = Gtk::UIManager::create(); m_uimanager->insert_action_group(m_action_group); m_uimanager->add_ui_from_string(ui_description); //Menubar: Gtk::MenuBar* pMenuBar = static_cast(m_uimanager->get_widget("/Menubar")); m_box_menu->pack_start(*pMenuBar, Gtk::PACK_SHRINK); pMenuBar->show(); //TODO: Add a toolbar if it would be useful: //Gtk::Toolbar* pToolBar = static_cast(m_uimanager->get_widget("/Bakery_ToolBar")); //m_HandleBox_Toolbar.add(*pToolBar); //m_HandleBox_Toolbar.show(); add_accel_group(m_uimanager->get_accel_group()); } bool Window_PrintLayout_Edit::on_canvas_drag_drop(const Glib::RefPtr& drag_context, int /* x */, int /* y */, guint timestamp) { const Glib::ustring target = m_canvas.drag_dest_find_target(drag_context); if(target.empty()) return false; //Cause our drag_data_received callback to be called: //Note that this isn't necessary when using DEST_DEFAULT_DEFAULTS (or DEST_DEFAULT_DROP), //because that would allow us to just return true to make this happen automatically. m_canvas.drag_get_data(drag_context, target, timestamp); return true; //Allow the drop. } bool Window_PrintLayout_Edit::on_canvas_drag_motion(const Glib::RefPtr& drag_context, int x, int y, guint timestamp) { const Glib::ustring target = m_canvas.drag_dest_find_target(drag_context); if(target.empty()) return false; m_canvas.drag_highlight(); double item_x = x; double item_y = y; canvas_convert_from_drag_pixels(item_x, item_y, true /* adjust for scrolling */); //Show the position in the rulers: gimp_ruler_set_position(m_hruler, item_x); gimp_ruler_set_position(m_vruler, item_y); //Handle dragging of the rule from the GimpRuler widget: if(target == DRAG_TARGET_NAME_RULE) { if(!m_action_showrules->get_active()) return false; //Don't allow the drop. if(m_temp_rule_horizontal) m_canvas.show_temp_rule(0, item_y); else m_canvas.show_temp_rule(item_x, 0); drag_context->drag_status(Gdk::ACTION_MOVE, timestamp); return true; //Allow the drop. } //Else handle dragging of an item from the ToolPalette: //Create the temporary canvas item if necesary: if(!m_layout_item_dropping) { //We need to examine the SelectionData: //This will cause our drag_data_received callback to be called, with that information. //Note: This does not work (and grabs the cursor) if we call dest_set() with the flags for default actions, such as DEST_DEFAULT_DEFAULTS. m_drag_preview_requested = true; m_canvas.drag_get_data(drag_context, target, timestamp); return true; } drag_context->drag_status(Gdk::ACTION_COPY, timestamp); //Move the temporary canvas item to the new position: m_layout_item_dropping->snap_position(item_x, item_y); m_layout_item_dropping->set_xy(item_x, item_y); return true; //Allow the drop. } sharedptr Window_PrintLayout_Edit::create_empty_item(PrintLayoutToolbarButton::enumItems item_type) { sharedptr layout_item; if(item_type == PrintLayoutToolbarButton::ITEM_FIELD) { sharedptr layout_item_derived = sharedptr::create(); layout_item = layout_item_derived; layout_item->set_print_layout_position(0, 0, PrintLayoutUtils::ITEM_WIDTH_WIDE, PrintLayoutUtils::ITEM_HEIGHT); //Don't use the field's default formatting, because that is probably only for on-screen layouts: layout_item_derived->set_formatting_use_default(false); } else if(item_type == PrintLayoutToolbarButton::ITEM_TEXT) { sharedptr layout_item_derived = sharedptr::create(); // Note to translators: This is the default contents of a text item on a print layout: layout_item_derived->set_text_original(_("text")); //TODO: Choose some other longer default because this is hidden under the drag icon? layout_item = layout_item_derived; layout_item->set_print_layout_position(0, 0, PrintLayoutUtils::ITEM_WIDTH_WIDE, PrintLayoutUtils::ITEM_HEIGHT); } else if(item_type == PrintLayoutToolbarButton::ITEM_IMAGE) { layout_item = sharedptr::create(); layout_item->set_print_layout_position(0, 0, PrintLayoutUtils::ITEM_WIDTH_WIDE, PrintLayoutUtils::ITEM_WIDTH_WIDE); } else if(item_type == PrintLayoutToolbarButton::ITEM_LINE_HORIZONTAL) { sharedptr layout_item_derived = sharedptr::create(); layout_item_derived->set_coordinates(0, 0, PrintLayoutUtils::ITEM_WIDTH_WIDE * 2, 0); layout_item = layout_item_derived; } else if(item_type == PrintLayoutToolbarButton::ITEM_LINE_VERTICAL) { sharedptr layout_item_derived = sharedptr::create(); layout_item_derived->set_coordinates(0, 0, 0, PrintLayoutUtils::ITEM_WIDTH_WIDE * 2); layout_item = layout_item_derived; } else if(item_type == PrintLayoutToolbarButton::ITEM_PORTAL) { sharedptr portal = sharedptr::create(); portal->set_print_layout_row_height(10); //Otherwise it will be 0, which is useless. layout_item = portal; layout_item->set_print_layout_position(0, 0, PrintLayoutUtils::ITEM_WIDTH_WIDE * 2, PrintLayoutUtils::ITEM_WIDTH_WIDE); } else { std::cerr << G_STRFUNC << ": Unhandled item type: " << item_type << std::endl; } //Set a default text style and size: //12pt text seems sane. It is what OpenOffice/LibreOffice and Abiword use: //Serif (rather than sans-serif) is sane for body text: sharedptr with_formatting = sharedptr::cast_dynamic(layout_item); if(with_formatting) with_formatting->m_formatting.set_text_format_font("Serif 12"); return layout_item; } void Window_PrintLayout_Edit::canvas_convert_from_drag_pixels(double& x, double& y, bool adjust_for_scrolling) const { //The canvas might be scrolled down in the viewport/scrolledwindow, //so deal with that: if(adjust_for_scrolling) { const double scroll_x = m_scrolled_window.get_hadjustment()->get_value(); const double scroll_y = m_scrolled_window.get_vadjustment()->get_value(); x += scroll_x; y += scroll_y; } m_canvas.convert_from_pixels(x, y); } void Window_PrintLayout_Edit::on_canvas_drag_data_received(const Glib::RefPtr& drag_context, int x, int y, const Gtk::SelectionData& selection_data, guint /* info */, guint timestamp) { //This is called when an item is dropped on the canvas, //or after our drag_motion handler has called drag_get_data()): const Glib::ustring target = m_canvas.drag_dest_find_target(drag_context); if(target.empty()) return; double item_x = x; double item_y = y; canvas_convert_from_drag_pixels(item_x, item_y, true /* adjust for scrolling */); //Handle dragging of the rule from the GimpRuler widget: if(target == DRAG_TARGET_NAME_RULE) { if(!m_action_showrules->get_active()) return; m_canvas.show_temp_rule(0, 0, false); if(m_temp_rule_horizontal) m_canvas.add_horizontal_rule(item_y); else m_canvas.add_vertical_rule(item_x); drag_context->drag_finish(true, false, timestamp); return; } //Discover what toolbar item was dropped: const PrintLayoutToolbarButton::enumItems item_type = PrintLayoutToolbarButton::get_item_type_from_selection_data(drag_context, selection_data); if(item_type == PrintLayoutToolbarButton::ITEM_INVALID) { std::cerr << G_STRFUNC << ": item_type was invalid" << std::endl; return; } if(m_drag_preview_requested) { //Create the temporary drag item if necessary: if(!m_layout_item_dropping) { sharedptr layout_item = create_empty_item(item_type); //Show it on the canvas, at the position: if(layout_item) { m_layout_item_dropping = create_canvas_layout_item_and_add(layout_item); m_layout_item_dropping->snap_position(item_x, item_y); m_layout_item_dropping->set_xy(item_x, item_y); } } drag_context->drag_status(Gdk::ACTION_COPY, timestamp); m_drag_preview_requested = false; } else { //Drop an item: drag_context->drag_finish(false, false, timestamp); m_canvas.drag_unhighlight(); //Add the item to the canvas: sharedptr layout_item = create_empty_item(item_type); if(!layout_item) { std::cerr << G_STRFUNC << ": layout_item is null." << std::endl; return; } Glib::RefPtr item = create_canvas_layout_item_and_add(layout_item); double item_x = x; double item_y = y; canvas_convert_from_drag_pixels(item_x, item_y, true /* adjust for scrolling */); item->snap_position(item_x, item_y); item->set_xy(item_x, item_y); if(m_layout_item_dropping) { m_layout_item_dropping->remove(); m_layout_item_dropping.reset(); } } } void Window_PrintLayout_Edit::on_canvas_drag_leave(const Glib::RefPtr& /* drag_context */, guint /* timestamp */) { //Remove the temporary drag item if the cursor was dragged out of the drop widget: //This also seems to be called after a drop, just before getting the data, //therefore we should not do anything here that would stop the drop from succeeding. if(m_layout_item_dropping) { m_layout_item_dropping->remove(); m_layout_item_dropping.reset(); } m_canvas.show_temp_rule(0, 0, false); //Remove it. } Window_PrintLayout_Edit::~Window_PrintLayout_Edit() { remove_view(&m_canvas); } void Window_PrintLayout_Edit::update_table_title() { const Document* document = dynamic_cast(get_document()); if(!document) { std::cerr << G_STRFUNC << ": document was null" << std::endl; return; } Glib::ustring table_label = _("None selected"); //Show the table title (if any) and name: Glib::ustring table_title = document->get_table_title(m_table_name, AppWindow::get_current_locale()); if(table_title.empty()) table_label = m_table_name; else table_label = table_title + " (" + m_table_name + ')'; if(m_label_table_name) { m_label_table_name->set_markup( Utils::bold_message(table_label)); } } bool Window_PrintLayout_Edit::init_db_details(const Glib::ustring& table_name) { m_table_name = table_name; update_table_title(); return true; } Glib::ustring Window_PrintLayout_Edit::get_original_name() const { return m_name_original; } void Window_PrintLayout_Edit::set_print_layout(const Glib::ustring& table_name, const sharedptr& print_layout) { m_modified = false; m_name_original = print_layout->get_name(); m_print_layout = sharedptr(new PrintLayout(*print_layout)); //Copy it, so we only use the changes when we want to. m_canvas.set_print_layout(table_name, m_print_layout); m_table_name = table_name; //Dialog_Layout::set_document(layout, document, table_name, table_fields); //Set the table name and title: update_table_title(); m_entry_name->set_text(print_layout->get_name()); m_entry_title->set_text(item_get_title(print_layout)); set_ruler_sizes(); m_action_showgrid->set_active( print_layout->get_show_grid() ); m_action_showrules->set_active( print_layout->get_show_rules() ); m_action_showoutlines->set_active( print_layout->get_show_outlines() ); m_modified = false; } void Window_PrintLayout_Edit::enable_buttons() { } sharedptr Window_PrintLayout_Edit::get_print_layout() { m_print_layout = m_canvas.get_print_layout(); m_print_layout->set_name( m_entry_name->get_text() ); m_print_layout->set_title( m_entry_title->get_text() , AppWindow::get_current_locale()); m_print_layout->set_show_grid( m_action_showgrid->get_active() ); m_print_layout->set_show_rules( m_action_showrules->get_active() ); m_print_layout->set_show_outlines( m_action_showoutlines->get_active() ); m_print_layout->set_horizontal_rules( m_canvas.get_horizontal_rules() ); m_print_layout->set_vertical_rules( m_canvas.get_vertical_rules() ); /* m_print_layout->get_layout_group()->remove_all_items(); //The Header and Footer parts are implicit (they are the whole header or footer treeview) sharedptr header = sharedptr::create(); sharedptr group_temp = header; fill_print_layout_parts(group_temp, m_model_parts_header); if(header->get_items_count()) m_print_layout->get_layout_group()->add_item(header); fill_print_layout_parts(m_print_layout->get_layout_group(), m_model_parts_main); sharedptr footer = sharedptr::create(); group_temp = footer; fill_print_layout_parts(group_temp, m_model_parts_footer); if(footer->get_items_count()) m_print_layout->get_layout_group()->add_item(footer); */ return m_print_layout; } void Window_PrintLayout_Edit::on_context_menu_insert_field() { on_menu_insert_field(); } void Window_PrintLayout_Edit::on_context_menu_insert_text() { on_menu_insert_text(); } void Window_PrintLayout_Edit::setup_context_menu() { m_context_menu_action_group = Gtk::ActionGroup::create(); m_context_menu_action_group->add(Gtk::Action::create("ContextMenu", "Context Menu") ); m_context_menu_action_group->add(Gtk::Action::create("ContextMenuInsert", _("Insert")) ); Glib::RefPtr action = Gtk::Action::create("ContextInsertField", _("Field")); m_context_menu_action_group->add(action, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_context_menu_insert_field) ); action = Gtk::Action::create("ContextInsertText", _("Text")); m_context_menu_action_group->add(action, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_context_menu_insert_text) ); /* action = Gtk::Action::create("ContextDelete", Gtk::Stock::DELETE); m_context_menu_action_group->add(action, sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_context_menu_delete) ); */ m_context_menu_uimanager = Gtk::UIManager::create(); m_context_menu_uimanager->insert_action_group(m_context_menu_action_group); try { Glib::ustring ui_info = "" " " " " " " " " " " " " ""; m_context_menu_uimanager->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_context_menu = dynamic_cast( m_context_menu_uimanager->get_widget("/ContextMenu") ); } bool Window_PrintLayout_Edit::on_canvas_motion_notify_event(GdkEventMotion* event) { //Notice that, unlike drag-motion, motion-notify-event's x/y position already //seems to have the scrolling taken into account. double x = event->x; double y = event->y; canvas_convert_from_drag_pixels(x, y, false /* do not adjust for scrolling */); gimp_ruler_set_position(m_hruler, x); gimp_ruler_set_position(m_vruler, y); return false; } void Window_PrintLayout_Edit::on_canvas_show_context_menu(guint button, guint32 activate_time) { if(m_context_menu) m_context_menu->popup(button, activate_time); } bool Window_PrintLayout_Edit::get_is_item_at(double x, double y) { Glib::RefPtr item_hit = m_canvas.get_item_at(x, y, false); if(!item_hit) return false; Glib::RefPtr layout_item = Glib::RefPtr::cast_dynamic(item_hit); return layout_item; } void Window_PrintLayout_Edit::set_default_position(const sharedptr& item) { if(!item) return; double item_x = 10; double item_y = 10; canvas_convert_from_drag_pixels(item_x, item_y); //TODO: This doesn't seem to actually work: while(get_is_item_at(item_x, item_y)) { item_x += 10; item_y += 10; } //Get the old position so we can preserve the width and height: double old_x = 0; double old_y = 0; double old_width = 0; double old_height = 0; item->get_print_layout_position(old_x, old_y, old_width, old_height); item->set_print_layout_position(item_x, item_y, old_width, old_height); } void Window_PrintLayout_Edit::on_menu_insert_field() { sharedptr layout_item = create_empty_item(PrintLayoutToolbarButton::ITEM_FIELD); // Note to translators: This is the default contents of a text item on a print layout: set_default_position(layout_item); create_canvas_layout_item_and_add(layout_item); } void Window_PrintLayout_Edit::on_menu_insert_text() { sharedptr layout_item = create_empty_item(PrintLayoutToolbarButton::ITEM_TEXT); set_default_position(layout_item); create_canvas_layout_item_and_add(layout_item); } void Window_PrintLayout_Edit::on_menu_insert_image() { sharedptr layout_item = create_empty_item(PrintLayoutToolbarButton::ITEM_IMAGE); // Note to translators: This is the default contents of a text item on a print layout: //layout_item->set_text_original(_("text")); set_default_position(layout_item); create_canvas_layout_item_and_add(layout_item); } void Window_PrintLayout_Edit::on_menu_insert_relatedrecords() { sharedptr layout_item = create_empty_item(PrintLayoutToolbarButton::ITEM_PORTAL); set_default_position(layout_item); create_canvas_layout_item_and_add(layout_item); } void Window_PrintLayout_Edit::on_menu_insert_line_horizontal() { sharedptr layout_item = create_empty_item(PrintLayoutToolbarButton::ITEM_LINE_HORIZONTAL); /* double item_x = m_drop_x; double item_y = m_drop_y; m_canvas.convert_from_pixels(item_x, item_y); */ // Note to translators: This is the default contents of a text item on a print layout: //layout_item->set_text_original(_("text")); //layout_item->set_coordinates(item_x, item_y, item_x + 100, item_y); create_canvas_layout_item_and_add(layout_item); } void Window_PrintLayout_Edit::on_menu_insert_line_vertical() { sharedptr layout_item = create_empty_item(PrintLayoutToolbarButton::ITEM_LINE_VERTICAL); create_canvas_layout_item_and_add(layout_item); } void Window_PrintLayout_Edit::on_menu_insert_create_standard() { //Ask for confirmation: Gtk::MessageDialog dialog(Utils::bold_message(_("Create Standard Layout")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE); dialog.set_secondary_text(_("This is an experimental feature. It will remove all items from the print layout and then try to create a layout similar to the layout of the detail view.")); dialog.set_transient_for(*this); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Create"), Gtk::RESPONSE_OK); const int response = dialog.run(); if(response != Gtk::RESPONSE_OK) return; const Document* document = dynamic_cast(get_document()); if(!document) { std::cerr << G_STRFUNC << ": document was null" << std::endl; return; } Glib::RefPtr page_setup = m_canvas.get_page_setup(); if(!page_setup) { std::cerr << G_STRFUNC << ": page_setup was null" << std::endl; return; } m_print_layout = PrintLayoutUtils::create_standard(page_setup, m_table_name, document, true /* avoid page margins */); m_canvas.set_print_layout(m_table_name, m_print_layout); } void Window_PrintLayout_Edit::on_menu_insert_add_page() { m_canvas.set_page_count( m_canvas.get_page_count() + 1); } //TODO: Disable this menu item when there is only one page: void Window_PrintLayout_Edit::on_menu_insert_delete_page() { const guint page_count = m_canvas.get_page_count(); if(page_count <= 1) return; //Ask the user to confirm: Gtk::MessageDialog dialog(Utils::bold_message(_("Remove page")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE); dialog.set_secondary_text(_("Are you sure that you wish to remove the last page and any items on that page?")); dialog.set_transient_for(*this); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Remove Page"), Gtk::RESPONSE_OK); if(dialog.run() != Gtk::RESPONSE_OK) return; m_canvas.set_page_count(page_count - 1); } void Window_PrintLayout_Edit::on_button_close() { hide(); } void Window_PrintLayout_Edit::on_menu_view_show_grid() { if(m_action_showgrid->get_active()) { m_canvas.set_grid_gap(PrintLayoutUtils::GRID_GAP); } else { m_canvas.remove_grid(); } } void Window_PrintLayout_Edit::on_menu_view_show_rules() { const bool active = m_action_showrules->get_active(); m_canvas.set_rules_visibility(active); Gtk::Widget* hruler = Glib::wrap(GTK_WIDGET(m_hruler)); Gtk::Widget* vruler = Glib::wrap(GTK_WIDGET(m_vruler)); if(active) { hruler->drag_source_set(m_drag_targets_rule); vruler->drag_source_set(m_drag_targets_rule); } else { hruler->drag_source_unset(); vruler->drag_source_unset(); } } void Window_PrintLayout_Edit::on_menu_view_show_outlines() { m_canvas.set_outlines_visibility( m_action_showoutlines->get_active()); } void Window_PrintLayout_Edit::on_menu_view_zoom(guint percent) { m_canvas.set_zoom_percent(percent); } void Window_PrintLayout_Edit::on_menu_view_fitpagewidth() { //Get the canvas size: Goocanvas::Bounds bounds; m_canvas.get_bounds(bounds); double canvas_width_pixels = bounds.get_x2() - bounds.get_x1(); double canvas_height_pixels = bounds.get_y2() - bounds.get_y1(); m_canvas.convert_to_pixels(canvas_width_pixels, canvas_height_pixels); canvas_width_pixels = canvas_width_pixels / m_canvas.property_scale(); //Get the viewport size: Gtk::Widget* child = m_scrolled_window.get_child(); if(child) { Gtk::Allocation widget_allocation = child->get_allocation(); const double viewport_width = widget_allocation.get_width(); if(canvas_width_pixels) { //scale the canvas so it fits perfectly in the viewport: const double scale = viewport_width / canvas_width_pixels; m_canvas.set_zoom_percent((guint)(scale * 100)); } } } void Window_PrintLayout_Edit::on_menu_file_page_setup() { Glib::RefPtr page_setup = m_canvas.get_page_setup(); //Show the page setup dialog, asking it to start with the existing settings: Glib::RefPtr print_settings = Gtk::PrintSettings::create(); //TODO: Do we really need to get this from the user and store it? page_setup = Gtk::run_page_setup_dialog(*this, page_setup, print_settings); //Save the chosen page setup dialog for use when printing, previewing, or //showing the page setup dialog again: m_canvas.set_page_setup(page_setup); set_ruler_sizes(); } void Window_PrintLayout_Edit::on_menu_file_print_preview() { //Save any recent changes in the document, //so that the preview will show them: Document* document = dynamic_cast(get_document()); if(!document) return; const Glib::ustring original_name = get_original_name(); sharedptr print_layout = get_print_layout(); if(print_layout && (original_name != get_name())) document->remove_print_layout(m_table_name, original_name); document->set_print_layout(m_table_name, print_layout); //Show the print preview window: AppWindow* app = AppWindow::get_appwindow(); if(app) app->do_print_layout(m_print_layout->get_name(), true /* preview */, this); } void Window_PrintLayout_Edit::on_menu_edit_cut() { on_menu_edit_copy(); on_menu_edit_delete(); } void Window_PrintLayout_Edit::on_menu_edit_copy() { if(m_layout_items_selected.empty()) return; m_layout_items_to_paste.clear(); for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr item = *iter; if(item) item->update_layout_position_from_canvas(); sharedptr cloned = glom_sharedptr_clone(item->get_layout_item()); m_layout_items_to_paste.push_back(cloned); } m_action_edit_paste->set_sensitive(); } void Window_PrintLayout_Edit::on_menu_edit_paste() { if(m_layout_items_to_paste.empty()) return; for(type_list_items::iterator iter = m_layout_items_to_paste.begin(); iter != m_layout_items_to_paste.end(); ++iter) { sharedptr item = *iter; if(!item) continue; //TODO: Add x,y offset and add. double x = 0; double y = 0; double width = 0; double height = 0; item->get_print_layout_position( x, y, width, height); const double offset = 5; x += offset; y += offset; item->set_print_layout_position(x, y, width, height); create_canvas_layout_item_and_add(item); } } Glib::RefPtr Window_PrintLayout_Edit::create_canvas_layout_item_and_add(const sharedptr& layout_item) { Glib::RefPtr canvas_item = CanvasLayoutItem::create(); m_canvas.add_canvas_layout_item(canvas_item); canvas_item->set_layout_item(layout_item); //canvas_item->set_outline_visible(m_outline_visibility); return canvas_item; } void Window_PrintLayout_Edit::on_menu_edit_delete() { while(!m_layout_items_selected.empty()) { Glib::RefPtr item = m_layout_items_selected[0]; if(item) m_canvas.remove_canvas_layout_item(item); } m_layout_items_selected.clear(); } void Window_PrintLayout_Edit::on_menu_edit_selectall() { m_canvas.select_all(); } void Window_PrintLayout_Edit::on_menu_edit_unselectall() { m_canvas.select_all(false); } void Window_PrintLayout_Edit::on_menu_align_top() { //Get the top-most position: double top = 0; for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(!selected_item) continue; double x = 0; double y = 0; selected_item->get_xy(x, y); if(iter == m_layout_items_selected.begin()) top = y; else if(y < top) top = y; } //Give all items the same top position: for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(!selected_item) continue; double x = 0; double y = 0; selected_item->get_xy(x, y); selected_item->set_xy(x, top); } } void Window_PrintLayout_Edit::on_menu_align_bottom() { //Get the bottom-most position: double bottom = 0; for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(!selected_item) continue; double x = 0; double y = 0; selected_item->get_xy(x, y); double width = 0; double height = 0; selected_item->get_width_height(width, height); const double this_bottom = y + height; if(iter == m_layout_items_selected.begin()) bottom = this_bottom; else if(this_bottom > bottom) bottom = this_bottom; } //Give all items the same top position: for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(!selected_item) continue; double x = 0; double y = 0; selected_item->get_xy(x, y); double width = 0; double height = 0; selected_item->get_width_height(width, height); const double this_bottom = y + height; const double new_y = y + (bottom - this_bottom); selected_item->set_xy(x, new_y); } } void Window_PrintLayout_Edit::on_menu_align_left() { //Get the left-most position: double left = 0; for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(!selected_item) continue; double x = 0; double y = 0; selected_item->get_xy(x, y); if(iter == m_layout_items_selected.begin()) left = x; else if(x < left) left = x; } //Give all items the same left position: for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(!selected_item) continue; double x = 0; double y = 0; selected_item->get_xy(x, y); selected_item->set_xy(left, y); } } void Window_PrintLayout_Edit::on_menu_align_right() { //Get the right-most position: double right = 0; for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(!selected_item) continue; double x = 0; double y = 0; selected_item->get_xy(x, y); double width = 0; double height = 0; selected_item->get_width_height(width, height); const double this_right = x + width; if(iter == m_layout_items_selected.begin()) right = this_right; else if(this_right > right) right = this_right; } //Give all items the same top position: for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(!selected_item) continue; double x = 0; double y = 0; selected_item->get_xy(x, y); double width = 0; double height = 0; selected_item->get_width_height(width, height); const double this_right = x + width; const double new_x = x + (right - this_right); selected_item->set_xy(new_x, y); } } static void spinbutton_set_max(Gtk::SpinButton& spinbutton, double max) { spinbutton.set_range(0, max); spinbutton.set_increments(1, 10); } void Window_PrintLayout_Edit::set_ruler_sizes() { //Note: We should use the page size if we decide not to make the canvas bounds == page size. on_scroll_value_changed(); double x1 = 0; double y1 = 0; double x2 = 0; double y2 = 0; m_canvas.get_bounds(x1, y1, x2, y2); gimp_ruler_set_range(m_hruler, x1, x2, x2); gimp_ruler_set_range(m_vruler, y1, y2, x2); //Set the limits for the SpinButtons too: spinbutton_set_max(*m_spinbutton_x, x2); spinbutton_set_max(*m_spinbutton_y, y2); spinbutton_set_max(*m_spinbutton_width, x2); spinbutton_set_max(*m_spinbutton_height, y2); } void Window_PrintLayout_Edit::on_scroll_value_changed() { double width = m_scrolled_window.get_hadjustment()->get_page_size(); double height = m_scrolled_window.get_vadjustment()->get_page_size(); double x = m_scrolled_window.get_hadjustment()->get_value(); double y = m_scrolled_window.get_vadjustment()->get_value(); //This definitely seems to give the correct mm values. //(It understands the canvas units and scale): m_canvas.convert_from_pixels(width, height); m_canvas.convert_from_pixels(x, y); //std::cout << "DEBUG: Calling m_hruler->set_range(" << x << ", " << x + width << ", 0, " << x + width << std::endl; gimp_ruler_set_range(m_hruler, x, x + width, x + width); gimp_ruler_set_range(m_vruler, y, y + height, y + height); } bool Window_PrintLayout_Edit::on_configure_event(GdkEventConfigure* event) { const bool result = Gtk::Window::on_configure_event(event); //If we are in fit-page-width then rescale the canvas: if(m_action_zoom_fit_page_width->get_active()) on_menu_view_fitpagewidth(); return result; } void Window_PrintLayout_Edit::get_dimensions_of_multiple_selected_items(double& x, double& y, double& width, double& height) { //Get the selected items, and their dimensions as a group: x = 0; y = 0; double x2 = 0; double y2 = 0; bool first = true; for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr item = Glib::RefPtr::cast_dynamic(*iter); if(!item) continue; //Get the position: double item_x = 0; double item_y = 0; item->get_xy(item_x, item_y); double item_width = 0; double item_height = 0; item->get_width_height(item_width, item_height); const double item_x2 = item_x + item_width; const double item_y2 = item_y + item_height; //Store the outermost positions of the group of items: if(first || item_x < x) x = item_x; if(first || item_y < y) y = item_y; if(item_x2 > x2) x2 = item_x2; if(item_y2 > y2) y2 = item_y2; first = false; } width = x2 - x; height = y2 - y; } void Window_PrintLayout_Edit::on_canvas_selection_changed() { Canvas_PrintLayout::type_vec_items items = m_canvas.get_selected_items(); //Forget about any previously selected items: m_layout_items_selected.clear(); for(type_vec_connections::iterator iter = m_connections_items_selected_moved.begin(); iter != m_connections_items_selected_moved.end(); ++iter) { iter->disconnect(); } m_connections_items_selected_moved.clear(); for(Canvas_PrintLayout::type_vec_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { Glib::RefPtr item = Glib::RefPtr::cast_dynamic(*iter); if(!item) continue; //Cache the selected items and handle their signal_moved signals: m_layout_items_selected.push_back(item); m_connections_items_selected_moved.push_back( item->signal_moved().connect( sigc::mem_fun(*this, &Window_PrintLayout_Edit::on_selected_item_moved))); } double x = 0; double y = 0; double width = 0; double height = 0; get_dimensions_of_multiple_selected_items(x, y, width, height); //Update the SpinButton values, //but don't respond to the SpinButton changes that we cause programatically: const bool old_ignore = m_ignore_spinbutton_signals; m_ignore_spinbutton_signals = true; m_spinbutton_x->set_value(x); m_spinbutton_y->set_value(y); m_spinbutton_width->set_value(width); m_spinbutton_height->set_value(height); m_ignore_spinbutton_signals = old_ignore; //Disable the spinbuttons if there are no items selected, //or if there are more than 1. //TODO: Let the user resize groups of items. const bool one_selected = (m_layout_items_selected.size() == 1); const bool some_selected = !m_layout_items_selected.empty(); //Allow x/y editing via the numbers for multiple items, //but not width/height for multiple items (TODO: Stretch them in that case?) //and only allow any editing when at least one item is selected: m_box_item_position->set_sensitive(some_selected); m_spinbutton_x->set_sensitive(some_selected); m_spinbutton_y->set_sensitive(some_selected); m_spinbutton_width->set_sensitive(one_selected); m_spinbutton_height->set_sensitive(one_selected); if(m_action_edit_cut) m_action_edit_cut->set_sensitive(some_selected); if(m_action_edit_copy) m_action_edit_copy->set_sensitive(some_selected); if(m_action_edit_delete) m_action_edit_delete->set_sensitive(some_selected); } void Window_PrintLayout_Edit::on_selected_item_moved(const Glib::RefPtr& item, double x_offset, double y_offset) { //Move the other selected items too: for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr selected_item = *iter; if(!selected_item || (item == selected_item)) continue; double x = 0; double y = 0; selected_item->get_xy(x, y); selected_item->set_xy(x + x_offset, y + y_offset); } //Show the new positions in the spinbuttons: on_canvas_selection_changed(); //Show the left-most and top-most position in the rulers: //TODO: Maybe showing the position of the one item being //moved (though part of a group) would be better. //Inkscape just tracks the cursor, which doesn't seem useful. double x = 0; double y = 0; double width = 0; double height = 0; get_dimensions_of_multiple_selected_items(x, y, width, height); gimp_ruler_set_position(m_hruler, x); gimp_ruler_set_position(m_vruler, y); } void Window_PrintLayout_Edit::on_spinbutton_x() { if(m_ignore_spinbutton_signals) return; if(m_layout_items_selected.empty()) return; double x = 0; double y = 0; double width = 0; double height = 0; get_dimensions_of_multiple_selected_items(x, y, width, height); //Discover the offset: const double offset_x = m_spinbutton_x->get_value() - x; //Apply the offset to all items: for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr item = *iter; if(!item) continue; double item_x = 0; double item_y = 0; item->get_xy(item_x, item_y); item->set_xy( item_x + offset_x, item_y); } } void Window_PrintLayout_Edit::on_spinbutton_y() { if(m_ignore_spinbutton_signals) return; if(m_layout_items_selected.empty()) return; double x = 0; double y = 0; double width = 0; double height = 0; get_dimensions_of_multiple_selected_items(x, y, width, height); //Discover the offset: const double offset_y = m_spinbutton_y->get_value() - y; //Apply the offset to all items: for(type_vec_canvas_items::iterator iter = m_layout_items_selected.begin(); iter != m_layout_items_selected.end(); ++iter) { Glib::RefPtr item = *iter; if(!item) continue; double item_x = 0; double item_y = 0; item->get_xy(item_x, item_y); item->set_xy( item_x, item_y + offset_y); } } void Window_PrintLayout_Edit::on_spinbutton_width() { if(m_ignore_spinbutton_signals) return; if(m_layout_items_selected.empty()) return; Glib::RefPtr item = m_layout_items_selected[0]; double width = 0; double height = 0; item->get_width_height(width, height); item->set_width_height( m_spinbutton_width->get_value(), height); } void Window_PrintLayout_Edit::on_spinbutton_height() { if(m_ignore_spinbutton_signals) return; if(m_layout_items_selected.empty()) return; Glib::RefPtr item = m_layout_items_selected[0]; double width = 0; double height = 0; item->get_width_height(width, height); item->set_width_height( width, m_spinbutton_height->get_value()); } bool Window_PrintLayout_Edit::on_hruler_button_press_event(GdkEventButton* event) { if(event->button != 1) return true; m_temp_rule_horizontal = true; return false; } bool Window_PrintLayout_Edit::on_vruler_button_press_event(GdkEventButton* event) { if(event->button != 1) return true; m_temp_rule_horizontal = false; //vertical. return false; } } //namespace Glom glom-1.22.4/glom/mode_design/print_layouts/print_layout_toolbar_button.cc0000644000175000017500000000561512234776363030314 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007, 2008 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "print_layout_toolbar_button.h" #include #include #include namespace Glom { PrintLayoutToolbarButton::PrintLayoutToolbarButton(const std::string& icon_name, enumItems type, const Glib::ustring& title, const Glib::ustring& tooltip) : Gtk::ToolButton( *(Gtk::manage (new Gtk::Image(Utils::get_icon_path(icon_name)))) ) { m_type = type; g_object_set_data(G_OBJECT(gobj()), "glom-type", GINT_TO_POINTER(type)); std::vector targetentries; targetentries.push_back(Gtk::TargetEntry(get_target())); drag_source_set(targetentries, Gdk::MODIFIER_MASK, Gdk::ACTION_COPY | Gdk::ACTION_MOVE); set_tooltip_text(tooltip); set_label(title); } PrintLayoutToolbarButton::~PrintLayoutToolbarButton() { } PrintLayoutToolbarButton::enumItems PrintLayoutToolbarButton::get_item_type_from_selection_data(const Glib::RefPtr& drag_context, const Gtk::SelectionData& selection_data) { PrintLayoutToolbarButton::enumItems result = ITEM_INVALID; //Put this code in the toolbar class: Gtk::Widget* palette_candidate = drag_get_source_widget(drag_context); Gtk::ToolPalette* palette = dynamic_cast(palette_candidate); while(palette_candidate && !palette) { palette_candidate = palette_candidate->get_parent(); palette = dynamic_cast(palette_candidate); } if(!palette) return result; Gtk::Widget* tool_item = palette->get_drag_item(selection_data); if(!tool_item) return result; result = static_cast(GPOINTER_TO_INT(tool_item->get_data("glom-type"))); return result; } void PrintLayoutToolbarButton::on_drag_data_get(const Glib::RefPtr&, Gtk::SelectionData& selection_data, guint, guint) { selection_data.set(8, (guint8*)(&m_type), 4); } void PrintLayoutToolbarButton::on_drag_begin(const Glib::RefPtr& drag_context) { drag_context->set_icon(dynamic_cast(get_icon_widget())->get_pixbuf(), 0, 0); } } // namespace Glom glom-1.22.4/glom/mode_design/print_layouts/dialog_text_formatting.cc0000644000175000017500000000415112234776260027171 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_text_formatting.h" #include #include #include namespace Glom { const char* Dialog_TextFormatting::glade_id("window_text_format"); const bool Dialog_TextFormatting::glade_developer(true); Dialog_TextFormatting::Dialog_TextFormatting(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Window(cobject), m_box_formatting_placeholder(0), m_box_formatting(0) { Gtk::Button* button_close = 0; builder->get_widget("button_close", button_close); if(button_close) { button_close->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_TextFormatting::on_button_close) ); } //Formatting: //Get the place to put the Formatting stuff: builder->get_widget("box_formatting_placeholder", m_box_formatting_placeholder); Utils::get_glade_child_widget_derived_with_warning(m_box_formatting); if(m_box_formatting) { m_box_formatting_placeholder->pack_start(*m_box_formatting); add_view(m_box_formatting); m_box_formatting->set_is_for_non_editable(); } set_modal(); //We don't want people to edit the main window while we are changing structure. show_all_children(); } Dialog_TextFormatting::~Dialog_TextFormatting() { remove_view(m_box_formatting); } void Dialog_TextFormatting::on_button_close() { hide(); } } //namespace Glom glom-1.22.4/glom/mode_design/print_layouts/print_layout_toolbar_button.h0000644000175000017500000000405412234252646030143 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007, 2008 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PRINT_LAYOUT_TOOLBAR_BUTTON_H #define GLOM_PRINT_LAYOUT_TOOLBAR_BUTTON_H #include #include #include //#include "layoutwidgetbase.h" namespace Glom { class PrintLayoutToolbarButton : public Gtk::ToolButton { public: //TODO: Use LayoutWidgetBase::enumType m_type instead (and just use LayoutToolbarButton?) enum enumItems { ITEM_INVALID, ITEM_FIELD, ITEM_TEXT, ITEM_IMAGE, ITEM_PORTAL, ITEM_LINE_HORIZONTAL, ITEM_LINE_VERTICAL }; PrintLayoutToolbarButton(const std::string& icon_name, enumItems type, const Glib::ustring& title, const Glib::ustring& tooltip); virtual ~PrintLayoutToolbarButton(); static enumItems get_item_type_from_selection_data(const Glib::RefPtr& drag_context, const Gtk::SelectionData& selection_data); private: //TODO: What is this for? murrayc. // We need an unique identifier for drag & drop! jhs static const gchar* get_target() { return "flowtable"; }; virtual void on_drag_begin(const Glib::RefPtr& drag_context); virtual void on_drag_data_get(const Glib::RefPtr&, Gtk::SelectionData& selection_data, guint, guint); private: enumItems m_type; }; } #endif //GLOM_PRINT_LAYOUT_TOOLBAR_BUTTON_H glom-1.22.4/glom/mode_design/print_layouts/print_layout_toolbar.h0000644000175000017500000000271712234252646026554 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Johannes Schmid * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PRINT_LAYOUT_TOOLBAR_H #define GLOM_PRINT_LAYOUT_TOOLBAR_H #include #include #include #include #include namespace Glom { class PrintLayoutToolbar : public Gtk::ToolPalette { public: PrintLayoutToolbar(); virtual ~PrintLayoutToolbar(); private: Gtk::ToolItemGroup m_group_items, m_group_lines, m_group_records; PrintLayoutToolbarButton m_drag_field, m_drag_text, m_drag_image, m_drag_line_horizontal, m_drag_line_vertical, m_drag_related_records; }; } //namespace Glom #endif // GLOM_PRINT_LAYOUT_TOOLBAR_H glom-1.22.4/glom/mode_design/box_db_table_relationships.cc0000644000175000017500000002524312234252646025072 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ //#include #include "box_db_table_relationships.h" #include #include #include #include namespace Glom { Box_DB_Table_Relationships::Box_DB_Table_Relationships() { init(); } Box_DB_Table_Relationships::Box_DB_Table_Relationships(BaseObjectType* cobject, const Glib::RefPtr& builder) : Box_DB_Table(cobject, builder) { init(); } void Box_DB_Table_Relationships::init() { pack_start(m_AddDel); m_colName = m_AddDel.add_column(_("Name")); m_AddDel.prevent_duplicates(m_colName); //Don't allow a relationship to be added twice. m_AddDel.set_prevent_duplicates_warning(_("This relationship already exists. Please choose a different relationship name")); m_colTitle = m_AddDel.add_column(_("Title")); //Translators: FROM as in SQL's FROM m_colFromField = m_AddDel.add_column(_("From Field"), AddDelColumnInfo::STYLE_Choices); m_colToTable = m_AddDel.add_column(_("Table"), AddDelColumnInfo::STYLE_Choices); m_colToField = m_AddDel.add_column(_("To Field"), AddDelColumnInfo::STYLE_Choices); m_colAllowEdit = m_AddDel.add_column(_("Allow Editing"), AddDelColumnInfo::STYLE_Boolean); m_colAutoCreate = m_AddDel.add_column(_("Automatic Creation"), AddDelColumnInfo::STYLE_Boolean); m_colTitleSingular = m_AddDel.add_column(_("Title (Singular Form)")); //Connect signals: m_AddDel.signal_user_activated().connect(sigc::mem_fun(*this, &Box_DB_Table_Relationships::on_adddel_user_activated)); m_AddDel.signal_user_changed().connect(sigc::mem_fun(*this, &Box_DB_Table_Relationships::on_adddel_user_changed)); m_AddDel.signal_user_added().connect(sigc::mem_fun(*this, &Box_DB_Table_Relationships::on_adddel_user_added)); m_AddDel.signal_user_requested_delete().connect(sigc::mem_fun(*this, &Box_DB_Table_Relationships::on_adddel_user_requested_delete)); show_all_children(); } Box_DB_Table_Relationships::~Box_DB_Table_Relationships() { } bool Box_DB_Table_Relationships::fill_from_database() { BusyCursor busy_cursor(get_app_window()); bool result = Box_DB_Table::fill_from_database(); Document* document = get_document(); if(!document) return false; //Get relationships from the document: Document::type_vec_relationships vecRelationships = document->get_relationships(m_table_name); m_AddDel.remove_all(); sharedptr sharedconnection = connect_to_server(get_app_window()); if(sharedconnection) { Glib::RefPtr connection = sharedconnection->get_gda_connection(); //Set combo choices: m_AddDel.set_column_choices(m_colFromField, util_vecStrings_from_Fields( DbUtils::get_fields_for_table(document, m_table_name))); type_vec_strings vecTableNames = document->get_table_names(false /* ignore_system_tables */); type_vec_strings vecTableNames_ustring(vecTableNames.begin(), vecTableNames.end()); m_AddDel.set_column_choices(m_colToTable, vecTableNames_ustring); //To Field choices are different for each row: set in on_adddel_signal_user_activated. //Add the relationships: for(Document::type_vec_relationships::iterator iter = vecRelationships.begin(); iter != vecRelationships.end(); ++iter) { sharedptr relationship = *iter; if(relationship) { //Name: Gtk::TreeModel::iterator iterTree = m_AddDel.add_item(relationship->get_name()); m_AddDel.set_value(iterTree, m_colName, relationship->get_name()); //Title: m_AddDel.set_value(iterTree, m_colTitle, item_get_title(relationship)); m_AddDel.set_value(iterTree, m_colTitleSingular, relationship->get_title_singular(AppWindow::get_current_locale())); //From Field: m_AddDel.set_value(iterTree, m_colFromField, relationship->get_from_field()); //To Table: const Glib::ustring& strToTable = relationship->get_to_table(); m_AddDel.set_value(iterTree, m_colToTable, strToTable); //To Field: m_AddDel.set_value(iterTree, m_colToField, relationship->get_to_field()); m_AddDel.set_value(iterTree, m_colAllowEdit, relationship->get_allow_edit()); m_AddDel.set_value(iterTree, m_colAutoCreate, relationship->get_auto_create()); } } } return result; } void Box_DB_Table_Relationships::save_to_document() { //Build relationships from AddDel: Document::type_vec_relationships vecRelationships; const Document* document = get_document(); for(Gtk::TreeModel::iterator iter = m_AddDel.get_model()->children().begin(); iter != m_AddDel.get_model()->children().end(); ++iter) { const Glib::ustring old_name = m_AddDel.get_value_key(iter); const Glib::ustring name = m_AddDel.get_value(iter, m_colName); if(!name.empty()) { //If it is a rename: if(!old_name.empty() && (old_name != name)) get_document()->change_relationship_name(m_table_name, old_name, name); //Update layouts and reports. if(std::find_if(vecRelationships.begin(), vecRelationships.end(), predicate_FieldHasName(name)) == vecRelationships.end()) //Don't add 2 relationships with the same name. { sharedptr relationship = document->get_relationship(m_table_name, name); //Preserve other information, such as translations. if(!relationship) relationship = sharedptr::create(); relationship->set_name(name); relationship->set_title(m_AddDel.get_value(iter, m_colTitle), AppWindow::get_current_locale()); relationship->set_title_singular(m_AddDel.get_value(iter, m_colTitleSingular), AppWindow::get_current_locale()); relationship->set_from_table(m_table_name); relationship->set_from_field(m_AddDel.get_value(iter, m_colFromField)); relationship->set_to_table(m_AddDel.get_value(iter, m_colToTable)); relationship->set_to_field(m_AddDel.get_value(iter, m_colToField)); relationship->set_allow_edit(m_AddDel.get_value_as_bool(iter, m_colAllowEdit)); relationship->set_auto_create(m_AddDel.get_value_as_bool(iter, m_colAutoCreate)); vecRelationships.push_back(relationship); } } } //Update the Document with these relationships. get_document()->set_relationships(m_table_name, vecRelationships); //Call base: Box_DB_Table::save_to_document(); } void Box_DB_Table_Relationships::on_adddel_user_added(const Gtk::TreeModel::iterator& row) { const guint col_with_first_value = m_colName; if(col_with_first_value == m_colName) { //The name is the key: Glib::ustring new_name = m_AddDel.get_value(row, m_colName); if(!new_name.empty()) m_AddDel.set_value_key(row, new_name); //Set a suitable starting title, if there is none already: Glib::ustring title = m_AddDel.get_value(row, m_colTitle); if(title.empty()) { title = Utils::title_from_string(new_name); m_AddDel.set_value(row, m_colTitle, title); } } } void Box_DB_Table_Relationships::on_adddel_user_changed(const Gtk::TreeModel::iterator& row, guint col) { if(col == m_colName) { //The name is the key, so If the name has been changed then the key must change too. Glib::ustring new_name = m_AddDel.get_value(row, m_colName); //if(!new_name.empty()) //Don't do this, so we can use the key as the old name to detect a rename later. // m_AddDel.set_value_key(row, new_name); //Update the title, if there is none already: Glib::ustring title = m_AddDel.get_value(row, m_colTitle); if(title.empty()) { title = Utils::title_from_string(new_name); m_AddDel.set_value(row, m_colTitle, title); } } else if(col == m_colToTable) { //User chose a new table so we need to wipe the field //because it might not be a valid field for that table: m_AddDel.set_value(row, m_colToField, Glib::ustring("")); //Plain "" goes to bool override. } set_modified(); } void Box_DB_Table_Relationships::on_adddel_user_activated(const Gtk::TreeModel::iterator& row, guint col) { if(col == m_colToField) { BusyCursor busy_cursor(get_app_window()); const Glib::ustring old_to_field = m_AddDel.get_value(row, m_colToField); const Glib::ustring table_name = m_AddDel.get_value(row, m_colToTable); if(!table_name.empty()) { //Set list of 'To' fields depending on table: m_AddDel.set_value(row, m_colToField, Glib::ustring("")); sharedptr sharedconnection = connect_to_server(get_app_window()); if(sharedconnection) { Glib::RefPtr connection = sharedconnection->get_gda_connection(); Document* document = get_document(); type_vec_strings vecFields = util_vecStrings_from_Fields(DbUtils::get_fields_for_table(document, table_name)); //This would cause a lot of tedious re-filling: //m_AddDel.set_column_choices(m_colToField, vecFields); //fill_from_database(); m_AddDel.set_column_choices(m_colToField, vecFields); //Attempt to set the previous value: m_AddDel.set_value(row, m_colToField, old_to_field); } } } } void Box_DB_Table_Relationships::on_adddel_user_requested_delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& /* rowEnd */) { //Gtk::TreeModel::iterator iterAfter = rowEnd; //++iterAfter; //for(Gtk::TreeModel::iterator iter = rowStart; iter != iterAfter; ++iter) //{ //AddDel::remove_item() can't cope with this. Gtk::TreeModel::iterator iter = rowStart; const Glib::ustring relationship_name = m_AddDel.get_value_key(iter); //Remove the row: m_AddDel.remove_item(iter); //Remove it from any layouts, reports, field lookups, etc: Document* document = get_document(); if(document) { sharedptr relationship = document->get_relationship(m_table_name, relationship_name); if(relationship) { document->remove_relationship(relationship); } } //} set_modified(); } } //namespace Glom glom-1.22.4/glom/mode_design/comboentry_currency.h0000644000175000017500000000331012234252646023446 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_COMBOENTRY_CURRENCY_H #define GLOM_MODE_DESIGN_COMBOENTRY_CURRENCY_H #include #include #include namespace Glom { /// A ComboBox that allows the user to choose, or enter, a currency symbol. class ComboEntry_Currency : public Gtk::ComboBox { public: ComboEntry_Currency(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~ComboEntry_Currency(); private: //Tree model columns: //These columns are used by the model that is created by the default constructor class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_symbol); add(m_name); } Gtk::TreeModelColumn m_symbol; Gtk::TreeModelColumn m_name; }; ModelColumns m_model_columns; Glib::RefPtr m_model; }; } //namespace Glom #endif //GLOM_MODE_DESIGN_COMBOENTRY_CURRENCY_H glom-1.22.4/glom/mode_design/layout/0000755000175000017500000000000012235000127020504 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/layout/dialog_choose_field.cc0000644000175000017500000003002612234776240024775 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_choose_field.h" #include //#include #include #include namespace Glom { const char* Dialog_ChooseField::glade_id("dialog_choose_field"); const bool Dialog_ChooseField::glade_developer(true); Dialog_ChooseField::Dialog_ChooseField(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_combo_relationship(0), m_button_select(0), m_checkbutton_show_related_relationships(0), m_treeview(0), m_document(0) { builder->get_widget("checkbutton_show_related_relationships", m_checkbutton_show_related_relationships); m_checkbutton_show_related_relationships->set_active(false); //Start with the simpler list, to avoid confusing people. m_checkbutton_show_related_relationships->signal_toggled().connect(sigc::mem_fun(*this, &Dialog_ChooseField::on_checkbutton_related_relationships_toggled)); builder->get_widget("button_select", m_button_select); builder->get_widget_derived("combobox_relationship", m_combo_relationship); if(m_combo_relationship) { m_combo_relationship->signal_changed().connect(sigc::mem_fun(*this, &Dialog_ChooseField::on_combo_relationship_changed)); } builder->get_widget("treeview_fields", m_treeview); if(m_treeview) { m_model = Gtk::ListStore::create(m_ColumnsFields); m_treeview->set_model(m_model); m_treeview->append_column( _("Name"), m_ColumnsFields.m_col_name ); m_treeview->append_column( _("Title"), m_ColumnsFields.m_col_title ); m_model->set_sort_column(m_ColumnsFields.m_col_name, Gtk::SORT_ASCENDING); m_treeview->signal_row_activated().connect( sigc::mem_fun(*this, &Dialog_ChooseField::on_row_activated) ); Glib::RefPtr refSelection = m_treeview->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_ChooseField::on_treeview_selection_changed) ); } } show_all_children(); } Dialog_ChooseField::~Dialog_ChooseField() { } void Dialog_ChooseField::set_document(Document* document, const Glib::ustring& table_name, const sharedptr& field) { set_document(document, table_name); m_start_field = glom_sharedptr_clone(field); //Select the current relationship at the start: if(field && field->get_has_relationship_name()) { if(field->get_has_related_relationship_name()) m_checkbutton_show_related_relationships->set_active(true); //We'll need the full list of relationships to show this. m_combo_relationship->set_selected_relationship( field->get_relationship(), field->get_related_relationship()); } else m_combo_relationship->set_selected_parent_table(table_name, document->get_table_title(table_name, AppWindow::get_current_locale())); //If one start field was specified, then multiple selection would not make //much sense. The caller probably wants single selection. //Make this explicit in the API if that is not always suitable. Glib::RefPtr selection = m_treeview->get_selection(); selection->set_mode((field && !(field->get_name().empty())) ? Gtk::SELECTION_SINGLE : Gtk::SELECTION_MULTIPLE); //Select the current field at the start: if(field) { const Glib::ustring field_name = field->get_name(); //Get the iterator for the row: Gtk::TreeModel::iterator iterFound = m_model->children().end(); for(Gtk::TreeModel::iterator iter = m_model->children().begin(); iter != m_model->children().end(); ++iter) { if(field_name == (*iter)[m_ColumnsFields.m_col_name]) { iterFound = iter; break; } } if(iterFound != m_model->children().end()) { selection->select(iterFound); //Make sure that it is scrolled into view: m_treeview->scroll_to_row(Gtk::TreeModel::Path(iterFound)); } } } void Dialog_ChooseField::set_document(Document* document, const Glib::ustring& table_name) { m_document = document; m_table_name = table_name; m_start_field.clear(); if(!m_document) { std::cerr << G_STRFUNC << ": document is null" << std::endl; } if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name is empty" << std::endl; } Glib::RefPtr selection = m_treeview->get_selection(); selection->set_mode(Gtk::SELECTION_MULTIPLE); //Update the tree models from the document if(document) { //Fill the list of relationships: //Add a special option for the current table: m_combo_relationship->set_display_parent_table(table_name, document->get_table_title(table_name, AppWindow::get_current_locale())); //Add the relationships for this table: const Glib::ustring table_title = document->get_table_title(table_name, AppWindow::get_current_locale()); m_combo_relationship->set_relationships(document, table_name, false /* show related relationships */); //Set the table name and title: m_combo_relationship->set_selected_parent_table(table_name, table_title); //Fill the treeview: m_model->clear(); Document::type_vec_fields vecFields = document->get_table_fields(table_name); for(Document::type_vec_fields::const_iterator iter = vecFields.begin(); iter != vecFields.end(); ++iter) { Gtk::TreeModel::iterator iterRow = m_model->append(); Gtk::TreeModel::Row row = *iterRow; sharedptr field = *iter; row[m_ColumnsFields.m_col_name] = field->get_name(); row[m_ColumnsFields.m_col_title] = item_get_title(field); row[m_ColumnsFields.m_col_field] = field; } } } /* void Dialog_ChooseField::select_item(const Field& field) { //TODO: We do this in set_document() as well. //Find any items with the same name: for(Gtk::TreeModel::iterator iter = m_model->children().begin(); iter != m_model->children().end(); ++iter) { Gtk::TreeModel::Row row = *iter; const Field& field_item = row[m_ColumnsFields.m_col_field]; if(field_item.get_name() == field.get_name()) { //Select the item: Glib::RefPtr refTreeSelection = m_treeview->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); } } } */ sharedptr Dialog_ChooseField::get_field_chosen() const { sharedptr field; type_list_field_items list_fields = get_fields_chosen(); if(!(list_fields.empty())) { field = *(list_fields.begin()); } if(!field) return field; if(!m_start_field) return field; else { //Preserve extra details of the field that was originally used, if any, //changing only the details that could have been changed in this dialog: //Note that m_start_field is already a clone, so it's safe to change it: m_start_field->set_name( field->get_name() ); m_start_field->set_full_field_details( field->get_full_field_details() ); m_start_field->set_relationship( field->get_relationship() ); m_start_field->set_related_relationship( field->get_related_relationship() ); return m_start_field; } } Dialog_ChooseField::type_list_field_items Dialog_ChooseField::get_fields_chosen() const { type_list_field_items list_fields; //Field: Glib::RefPtr refTreeSelection = m_treeview->get_selection(); if(!refTreeSelection) return list_fields; //Relationship: //Note that a null relationship means that the parent table was selected instead. sharedptr related_relationship; sharedptr relationship = m_combo_relationship->get_selected_relationship(related_relationship); typedef std::vector type_list_paths; type_list_paths list_paths = refTreeSelection->get_selected_rows(); for(type_list_paths::const_iterator iter = list_paths.begin(); iter != list_paths.end(); ++iter) { const Gtk::TreeModel::Path path = *iter; Gtk::TreeModel::iterator tree_iter = m_model->get_iter(path); if(!tree_iter) continue; // Setup a LayoutItem_Field for the Field, // so is_same_field() can work: sharedptr field = sharedptr::create(); field->set_relationship(relationship); field->set_related_relationship(related_relationship); Gtk::TreeModel::Row row = *tree_iter; sharedptr field_details = row[m_ColumnsFields.m_col_field]; field->set_full_field_details(field_details); // Start with the original LayoutItem_Field, // to preserve extra information such as Translations: if(m_start_field && m_start_field->is_same_field(field)) field = m_start_field; else field = sharedptr::create(); //Use the chosen field: field->set_relationship(relationship); field->set_related_relationship(related_relationship); field->set_full_field_details(field_details); //So is_same_field() can work. field->set_full_field_details(field_details); field->set_name(row[m_ColumnsFields.m_col_name]); list_fields.push_back(field); } return list_fields; } void Dialog_ChooseField::on_row_activated(const Gtk::TreeModel::Path& /* path */, Gtk::TreeViewColumn* /* view_column */) { response(Gtk::RESPONSE_OK); } void Dialog_ChooseField::on_checkbutton_related_relationships_toggled() { if(!m_document) return; const bool show_related_relationships = m_checkbutton_show_related_relationships->get_active(); //Preserve the selection: sharedptr related_relationship; sharedptr relationship = m_combo_relationship->get_selected_relationship(related_relationship); //Refresh the list, hiding or showing the child relationships: m_combo_relationship->set_relationships(m_document, m_table_name, show_related_relationships); m_combo_relationship->set_selected_relationship(relationship, related_relationship); } void Dialog_ChooseField::on_combo_relationship_changed() { sharedptr relationship = m_combo_relationship->get_selected_relationship(); Document* pDocument = m_document; if(pDocument) { //Show the list of fields from this relationship: Document::type_vec_fields vecFields; if(!relationship) vecFields = pDocument->get_table_fields(m_table_name); else { vecFields = pDocument->get_table_fields(relationship->get_to_table()); } m_model->clear(); for(Document::type_vec_fields::const_iterator iter = vecFields.begin(); iter != vecFields.end(); ++iter) { Gtk::TreeModel::iterator iterRow = m_model->append(); Gtk::TreeModel::Row row = *iterRow; sharedptr field = *iter; row[m_ColumnsFields.m_col_name] = field->get_name(); row[m_ColumnsFields.m_col_title] = item_get_title(field); row[m_ColumnsFields.m_col_field] = field; } } } void Dialog_ChooseField::on_treeview_selection_changed() { #if 0 Glib::RefPtr refSelection = m_treeview->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { /* Gtk::TreeModel::Row row = *iter; const Field& field = row[m_ColumnsFields.m_col_field]; const bool is_numeric = (field.get_glom_type() == Field::TYPE_NUMERIC); if(is_numeric) m_vbox_numeric_format->show(); else m_vbox_numeric_format->hide(); */ } } #endif } } //namespace Glom glom-1.22.4/glom/mode_design/layout/dialog_layout_details.h0000644000175000017500000001242012234252646025233 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_LAYOUT_DETAILS_H #define GLOM_MODE_DESIGN_DIALOG_LAYOUT_DETAILS_H #include #include #include #include namespace Glom { class Dialog_Layout_Details : public Dialog_Layout { public: static const char* glade_id; static const bool glade_developer; Dialog_Layout_Details(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Layout_Details(); /** * @param layout_name "list" or "details" * @param layout_platform As in the document. Empty or "maemo". * @param document The document, so that the dialog can load the previous layout, and save changes. * @param table_name The table name. * @param table_fields: The actual fields in the table, in case the document does not yet know about them all. */ virtual void init(const Glib::ustring& layout_name, const Glib::ustring& layout_platform, Document* document, const Glib::ustring& table_name, const type_vecConstLayoutFields& table_fields); protected: virtual void add_group(const Gtk::TreeModel::iterator& parent, const sharedptr& group); virtual void fill_group(const Gtk::TreeModel::iterator& iter, sharedptr& group); //Enable/disable buttons, depending on treeview selection: virtual void enable_buttons(); virtual void save_to_document(); sharedptr offer_relationship_list(); sharedptr offer_relationship_list(const sharedptr& relationship); Gtk::TreeModel::iterator get_selected_group_parent() const; sharedptr offer_button_script_edit(const sharedptr& button); /** Get the table that the fields belong to. * This is usually the regular table name (m_table_name), * but for related records portals (Dialog_Layout_List_Related), * it's the to table of the relationship. */ virtual Glib::ustring get_fields_table() const; //signal handlers: void on_button_up(); void on_button_down(); void on_button_field_delete(); virtual void on_button_add_field(); //overridden in derived class. void on_button_add_group(); void on_button_add_notebook(); void on_button_add_related(); void on_button_add_related_calendar(); void on_button_add_button(); void on_button_add_text(); void on_button_add_image(); void on_button_formatting(); virtual void on_button_edit(); //overridden in derived class void on_treeview_fields_selection_changed(); void on_cell_data_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void on_cell_data_title(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void on_cell_data_group_columns(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void on_cell_data_column_width(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void on_treeview_cell_edited_name(const Glib::ustring& path_string, const Glib::ustring& new_text); void on_treeview_cell_edited_title(const Glib::ustring& path_string, const Glib::ustring& new_text); void on_treeview_cell_edited_group_columns(const Glib::ustring& path_string, const Glib::ustring& new_text); void on_treeview_cell_edited_column_width(const Glib::ustring& path_string, const Glib::ustring& new_text); Gtk::TreeModel::iterator append_appropriate_row(); Gtk::TreeView* m_treeview_fields; Gtk::TreeView::Column* m_treeview_column_title; Gtk::TreeView::Column* m_treeview_column_group_columns; Gtk::TreeView::Column* m_treeview_column_column_width; // Only one of these boxes should be shown: Gtk::Box* m_box_table_widgets; Gtk::Box* m_box_related_table_widgets; Gtk::Frame* m_box_related_navigation; Gtk::Frame* m_box_frame_lines; Gtk::Button* m_button_up; Gtk::Button* m_button_down; Gtk::Button* m_button_add_field; Gtk::Button* m_button_add_group; Gtk::Button* m_button_add_notebook; Gtk::Button* m_button_add_related; Gtk::Button* m_button_add_related_calendar; Gtk::Button* m_button_add_button; Gtk::Button* m_button_add_text; Gtk::Button* m_button_add_image; Gtk::Button* m_button_field_delete; Gtk::Button* m_button_formatting; Gtk::Button* m_button_edit; Gtk::Label* m_label_table_name; Gtk::Box* m_hbox_rows_count; Gtk::SpinButton* m_spinbutton_rows_count_min; Gtk::SpinButton* m_spinbutton_rows_count_max; Glib::RefPtr m_model_items; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_LAYOUT_DETAILS_H glom-1.22.4/glom/mode_design/layout/dialog_layout_list.cc0000644000175000017500000000406412234252646024724 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include //For bold_message()). //#include #include namespace Glom { const char* Dialog_Layout_List::glade_id("window_data_layout"); const bool Dialog_Layout_List::glade_developer(true); Dialog_Layout_List::Dialog_Layout_List(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Layout_Details(cobject, builder) { //These do not make sense in a list: m_button_add_notebook->hide(); m_button_add_related->hide(); m_button_add_related_calendar->hide(); m_button_add_group->hide(); //We don't want this part of the dialog: //(We share one glade definition for several dialogs.) Gtk::Frame* box_calendar = 0; builder->get_widget("frame_calendar", box_calendar); box_calendar->hide(); //We don't use this column: if(m_treeview_column_group_columns) m_treeview_column_group_columns->set_visible(false); //We do use this column: if(m_treeview_column_column_width) m_treeview_column_column_width->set_visible(); } Dialog_Layout_List::~Dialog_Layout_List() { } } //namespace Glom glom-1.22.4/glom/mode_design/layout/treestore_layout.cc0000644000175000017500000001244112234252646024444 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { TreeStore_Layout::TreeStore_Layout() : Gtk::TreeStore() { //We can't just call Gtk::TreeModel(m_columns) in the initializer list //because m_columns does not exist when the base class constructor runs. //And we can't have a static m_columns instance, because that would be //instantiated before the gtkmm type system. //So, we use this method, which should only be used just after creation: set_column_types(m_columns); } Glib::RefPtr TreeStore_Layout::create() { return Glib::RefPtr( new TreeStore_Layout() ); } bool TreeStore_Layout::row_draggable_vfunc(const Gtk::TreeModel::Path& path) const { //Allow everything to be dragged. return Gtk::TreeStore::row_draggable_vfunc(path); } bool TreeStore_Layout::row_drop_possible_vfunc(const Gtk::TreeModel::Path& dest, const Gtk::SelectionData& selection_data) const { //Get the Row that is being dragged: //TODO: Add const version of get_from_selection_data(): Glib::RefPtr refThis = Glib::RefPtr(this); Glib::RefPtr refThis = Glib::RefPtr(const_cast(this)); refThis->reference(); //, true /* take_copy */) Gtk::TreeModel::Path path_dragged_row; Gtk::TreeModel::Path::get_from_selection_data(selection_data, refThis, path_dragged_row); if(path_dragged_row == dest) return false; //Prevent a row from being dragged onto itself. //Only allow items to become children of groups. //Do not allow items to become children of fields. //dest is the path that the row would have after it has been dropped: //But in this case we are more interested in the parent row: Gtk::TreeModel::Path dest_parent = dest; bool dest_is_not_top_level = dest_parent.up(); if(!dest_is_not_top_level || dest_parent.empty()) { //The user wants to move something to the top-level. //Only groups can be at the top level, so we examine the thing being dragged: //Get an iterator for the row at this path: //We must unconst this. This should not be necessary with a future version of gtkmm. TreeStore_Layout* unconstThis = const_cast(this); //TODO: Add a const version of get_iter to TreeModel: const_iterator iter_dragged = unconstThis->get_iter(path_dragged_row); //const_iterator iter_dragged = get_iter(path_dragged_row); if(iter_dragged) { Gtk::TreeModel::Row row = *iter_dragged; sharedptr layout_item = row[m_columns.m_col_layout_item]; sharedptr layout_group = sharedptr::cast_dynamic(layout_item); const bool is_group = layout_group; return is_group; //Only groups can be dragged to the top-level. } } else { if(dest_parent == path_dragged_row) return false; //Don't allow an item to be dragged under itself. TODO: Check the whole parent hierarchy. //Get an iterator for the row at the requested parent's path: //We must unconst this. This should not be necessary with a future version of gtkmm. TreeStore_Layout* unconstThis = const_cast(this); //TODO: Add a const version of get_iter to TreeModel: const_iterator iter_dest_parent = unconstThis->get_iter(dest_parent); //const_iterator iter_dest_parent = get_iter(dest); if(iter_dest_parent) { Gtk::TreeModel::Row row_parent = *iter_dest_parent; sharedptr layout_item = row_parent[m_columns.m_col_layout_item]; sharedptr layout_group = sharedptr::cast_dynamic(layout_item); const bool is_group = layout_group; return is_group; //Only groups can contain other items. } } //Fallback: return Gtk::TreeStore::row_drop_possible_vfunc(dest, selection_data); } void TreeStore_Layout::fill_sequences() { guint sequence = 1; for(iterator iter_children = children().begin(); iter_children != children().end(); ++iter_children) { Gtk::TreeModel::Row row = *iter_children; row[m_columns.m_col_sequence] = sequence; ++sequence; //Recurse: fill_sequences(iter_children); } } void TreeStore_Layout::fill_sequences(const iterator& iter) { guint sequence = 1; for(iterator iter_children = iter->children().begin(); iter_children != iter->children().end(); ++iter_children) { Gtk::TreeModel::Row row = *iter_children; row[m_columns.m_col_sequence] = sequence; ++sequence; //Recurse: fill_sequences(iter_children); } } } //namespace Glom glom-1.22.4/glom/mode_design/layout/dialog_layout_calendar_related.h0000644000175000017500000000611112234252646027057 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_LAYOUT_CALENDAR_RELATED_H #define GLOM_MODE_DESIGN_DIALOG_LAYOUT_CALENDAR_RELATED_H #include #include #include #include #include #include namespace Glom { class Dialog_Layout_Calendar_Related : public Dialog_Layout_List { public: static const char* glade_id; static const bool glade_developer; Dialog_Layout_Calendar_Related(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Layout_Calendar_Related(); /** * @param layout "list" or "details" * @param document The document, so that the dialog can load the previous layout, and save changes. * @param table_name The table name. * @param table_fields: The actual fields in the table, in case the document does not yet know about them all. */ void init_with_portal(const Glib::ustring& layout, const Glib::ustring& layout_platform, Document* document, const sharedptr& portal); void init_with_tablename(const Glib::ustring& layout, const Glib::ustring& layout_platform, Document* document, const Glib::ustring& parent_table); virtual void update_ui(bool including_relationships_list = true); sharedptr get_relationship() const; sharedptr get_portal_layout(); private: virtual void save_to_document(); //signal handlers: virtual void on_button_add_field(); //override virtual void on_button_edit(); //override void on_combo_relationship_changed(); void on_combo_navigation_specific_changed(); void on_combo_date_field_changed(); void on_checkbutton_show_child_relationships(); ComboBox_Relationship* m_combo_relationship; Gtk::CheckButton* m_checkbutton_show_child_relationships; sharedptr m_portal; Gtk::RadioButton* m_radio_navigation_automatic; Gtk::RadioButton* m_radio_navigation_specify; Gtk::Label* m_label_navigation_automatic; ComboBox_Relationship* m_combo_navigation_specify; ComboBox_Fields* m_combobox_date_field; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_LAYOUT_CALENDAR_RELATED_H glom-1.22.4/glom/mode_design/layout/dialog_layout_calendar_related.cc0000644000175000017500000004163312234776363027234 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include //For bold_message()). //#include #include #include #include namespace Glom { const char* Dialog_Layout_Calendar_Related::glade_id("window_data_layout"); const bool Dialog_Layout_Calendar_Related::glade_developer(true); Dialog_Layout_Calendar_Related::Dialog_Layout_Calendar_Related(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Layout_List(cobject, builder), m_combo_relationship(0), m_checkbutton_show_child_relationships(0), m_radio_navigation_automatic(0), m_radio_navigation_specify(0), m_label_navigation_automatic(0), m_combo_navigation_specify(0), m_combobox_date_field(0) { // Show the appropriate alternate widgets: m_box_table_widgets->hide(); m_box_related_table_widgets->show(); m_box_related_navigation->show(); builder->get_widget_derived("combo_relationship_name", m_combo_relationship); if(m_combo_relationship) { m_combo_relationship->signal_changed().connect(sigc::mem_fun(*this, &Dialog_Layout_Calendar_Related::on_combo_relationship_changed)); } builder->get_widget("checkbutton_show_child_relationships", m_checkbutton_show_child_relationships); if(m_checkbutton_show_child_relationships) { m_checkbutton_show_child_relationships->signal_toggled().connect(sigc::mem_fun(*this, &Dialog_Layout_Calendar_Related::on_checkbutton_show_child_relationships)); } builder->get_widget("radiobutton_navigation_automatic", m_radio_navigation_automatic); builder->get_widget("label_navigation_automatic", m_label_navigation_automatic); make_sensitivity_depend_on_toggle_button(*m_radio_navigation_automatic, *m_label_navigation_automatic); builder->get_widget("radiobutton_navigation_specify", m_radio_navigation_specify); builder->get_widget_derived("combobox_navigation_specify", m_combo_navigation_specify); if(m_radio_navigation_specify && m_combo_navigation_specify) { make_sensitivity_depend_on_toggle_button(*m_radio_navigation_specify, *m_combo_navigation_specify); m_combo_navigation_specify->signal_changed().connect(sigc::mem_fun(*this, &Dialog_Layout_Calendar_Related::on_combo_navigation_specific_changed)); } builder->get_widget_derived("combobox_date_field", m_combobox_date_field); if(m_combobox_date_field) { m_combobox_date_field->signal_changed().connect(sigc::mem_fun(*this, &Dialog_Layout_Calendar_Related::on_combo_date_field_changed)); } m_modified = false; //show_all_children(); //The base class hid this, but we do want it here: //(We share one glade definition for several dialogs.) Gtk::Frame* box_calendar = 0; builder->get_widget("frame_calendar", box_calendar); box_calendar->show(); //This entry must be in the Glade file, because it's used by the base class, //but we don't want it here, because it is confusing when dealing with relationships: if(m_entry_table_title) m_entry_table_title->hide(); // We don't use this (it's from the base class). if(m_label_table_title) m_label_table_title->hide(); // We don't use this (it's from the base class). } Dialog_Layout_Calendar_Related::~Dialog_Layout_Calendar_Related() { } void Dialog_Layout_Calendar_Related::init_with_portal(const Glib::ustring& layout, const Glib::ustring& layout_platform, Document* document, const sharedptr& portal) { m_portal = glom_sharedptr_clone(portal); Glib::ustring from_table; if(portal) from_table = portal->get_from_table(); init_with_tablename(layout, layout_platform, document, from_table); } void Dialog_Layout_Calendar_Related::init_with_tablename(const Glib::ustring& layout_name, const Glib::ustring& layout_platform, Document* document, const Glib::ustring& from_table) { if(!m_portal) { m_portal = sharedptr::create(); //The rest of the class assumes that this is not null. } type_vecConstLayoutFields empty_fields; //Just to satisfy the base class. Dialog_Layout::init(layout_name, layout_platform, document, from_table, empty_fields); //m_table_name is now actually the parent_table_name. update_ui(); } void Dialog_Layout_Calendar_Related::update_ui(bool including_relationship_list) { m_modified = false; const Glib::ustring related_table_name = m_portal->get_table_used(Glib::ustring() /* parent table - not relevant*/); //Update the tree models from the document Document* document = get_document(); if(document) { //Fill the relationships combo: if(including_relationship_list) { bool show_child_relationships = m_checkbutton_show_child_relationships->get_active(); //For the showing of child relationships if necessary: if(!show_child_relationships && m_portal && m_portal->get_related_relationship()) { show_child_relationships = true; } Glib::ustring from_table; if(m_portal->get_has_relationship_name()) from_table = m_portal->get_relationship()->get_from_table(); else from_table = m_table_name; m_combo_relationship->set_relationships(document, from_table, show_child_relationships, false /* don't show parent table */); //We don't show the optional parent table because portal use _only_ relationships, of course. if(show_child_relationships != m_checkbutton_show_child_relationships->get_active()) { m_checkbutton_show_child_relationships->set_active(show_child_relationships); } } //Set the table name and title: //sharedptr portal_temp = m_portal; m_combo_relationship->set_selected_relationship(m_portal->get_relationship(), m_portal->get_related_relationship()); Document::type_list_layout_groups mapGroups; if(m_portal) { mapGroups.push_back(m_portal); document->fill_layout_field_details(related_table_name, mapGroups); //Update with full field information. } //Show the field layout //typedef std::list< Glib::ustring > type_listStrings; m_model_items->clear(); for(Document::type_list_layout_groups::const_iterator iter = mapGroups.begin(); iter != mapGroups.end(); ++iter) { sharedptr group = *iter; sharedptr portal = sharedptr::cast_dynamic(group); if(portal) { for(LayoutGroup::type_list_items::const_iterator iterInner = group->m_list_items.begin(); iterInner != group->m_list_items.end(); ++iterInner) { sharedptr item = *iterInner; sharedptr groupInner = sharedptr::cast_dynamic(item); if(groupInner) add_group(Gtk::TreeModel::iterator() /* null == top-level */, groupInner); else { //Add the item to the treeview: Gtk::TreeModel::iterator iter = m_model_items->append(); Gtk::TreeModel::Row row = *iter; row[m_model_items->m_columns.m_col_layout_item] = glom_sharedptr_clone(item); } } } } } //Show the navigation information: //const Document::type_vec_relationships vecRelationships = document->get_relationships(m_portal->get_relationship()->get_from_table()); m_combo_navigation_specify->set_relationships(document, related_table_name, true /* show related relationships */, false /* don't show parent table */); //TODO: Don't show the hidden tables, and don't show relationships that are not used by any fields. //m_combo_navigation_specify->set_display_parent_table(""); //This would be superfluous, and a bit confusing. bool navigation_is_automatic = false; if(m_portal->get_navigation_type() == LayoutItem_Portal::NAVIGATION_SPECIFIC) { sharedptr navrel = m_portal->get_navigation_relationship_specific(); //std::cout << "debug navrel=" << navrel->get_relationship()->get_name() << std::endl; m_combo_navigation_specify->set_selected_relationship(navrel->get_relationship(), navrel->get_related_relationship()); } else { navigation_is_automatic = true; sharedptr none; m_combo_navigation_specify->set_selected_relationship(none); } //Set the appropriate radio button: //std::cout << "debug: navigation_is_automatic=" << navigation_is_automatic << std::endl; m_radio_navigation_automatic->set_active(navigation_is_automatic); m_radio_navigation_specify->set_active(!navigation_is_automatic); //Describe the automatic navigation: sharedptr relationship_navigation_automatic = m_portal->get_portal_navigation_relationship_automatic(document); Glib::ustring automatic_navigation_description = m_portal->get_relationship_name_used(); //TODO: Use get_relationship_display_name() instead? if(relationship_navigation_automatic) //This is a relationship in the related table. { automatic_navigation_description += ("::" + relationship_navigation_automatic->get_relationship_display_name()); } if(automatic_navigation_description.empty()) { automatic_navigation_description = _("None: No visible tables are specified by the fields."); } m_label_navigation_automatic->set_text(automatic_navigation_description); sharedptr debugfield = m_portal->get_date_field(); if(!debugfield) std::cout << "debug: " << G_STRFUNC << ": date field is NULL" << std::endl; else std::cout << "debug: " << G_STRFUNC << ": date field:" << debugfield->get_name() << std::endl; m_combobox_date_field->set_fields(document, related_table_name, Field::TYPE_DATE); m_combobox_date_field->set_selected_field(m_portal->get_date_field()); m_modified = false; } void Dialog_Layout_Calendar_Related::save_to_document() { Dialog_Layout::save_to_document(); if(m_modified) { //Get the data from the TreeView and store it in the document: //Get the groups and their fields: Document::type_list_layout_groups mapGroups; //Add the fields to the portal: //The code that created this dialog must read m_portal back out again. m_portal->remove_all_items(); guint field_sequence = 1; //0 means no sequence for(Gtk::TreeModel::iterator iterFields = m_model_items->children().begin(); iterFields != m_model_items->children().end(); ++iterFields) { Gtk::TreeModel::Row row = *iterFields; sharedptr item = row[m_model_items->m_columns.m_col_layout_item]; const Glib::ustring field_name = item->get_name(); if(!field_name.empty()) { m_portal->add_item(item); //Add it to the group: ++field_sequence; } } if(m_radio_navigation_specify->get_active()) { sharedptr rel, rel_related; rel = m_combo_navigation_specify->get_selected_relationship(rel_related); sharedptr uses_rel = sharedptr::create(); uses_rel->set_relationship(rel); uses_rel->set_related_relationship(rel_related); if (rel || rel_related) m_portal->set_navigation_relationship_specific(uses_rel); //std::cout << "debug99 main=specify_main" << ", relationship=" << (rel ? rel->get_name() : "none") << std::endl; } else { //std::cout << "debug: set_navigation_relationship_specific(false, none)" << std::endl; sharedptr none; m_portal->set_navigation_relationship_specific(none); } m_portal->set_date_field( m_combobox_date_field->get_selected_field() ); sharedptr debugfield = m_portal->get_date_field(); if(!debugfield) std::cout << "debug: " << G_STRFUNC << ": date field is NULL" << std::endl; else std::cout << "debug: " << G_STRFUNC << ": date field:" << debugfield->get_name() << std::endl; } } void Dialog_Layout_Calendar_Related::on_checkbutton_show_child_relationships() { update_ui(); } void Dialog_Layout_Calendar_Related::on_combo_relationship_changed() { if(!m_portal) return; sharedptr relationship_related; sharedptr relationship = m_combo_relationship->get_selected_relationship(relationship_related); if(relationship) { //Clear the list of fields if the relationship has changed, because the fields could not possible be correct for the new table: bool relationship_changed = false; const Glib::ustring old_relationship_name = glom_get_sharedptr_name(m_portal->get_relationship()); const Glib::ustring old_relationship_related_name = glom_get_sharedptr_name(m_portal->get_related_relationship()); if( (old_relationship_name != glom_get_sharedptr_name(relationship)) || (old_relationship_related_name != glom_get_sharedptr_name(relationship_related)) ) relationship_changed = true; m_portal->set_relationship(relationship); m_portal->set_related_relationship(relationship_related); if(relationship_changed) m_portal->remove_all_items(); //Refresh everything for the new relationship: update_ui(false /* not including the list of relationships */); m_modified = true; } } sharedptr Dialog_Layout_Calendar_Related::get_relationship() const { std::cout << "debug: I wonder if this function is used." << std::endl; return m_combo_relationship->get_selected_relationship(); } void Dialog_Layout_Calendar_Related::on_combo_navigation_specific_changed() { m_modified = true; } void Dialog_Layout_Calendar_Related::on_combo_date_field_changed() { m_modified = true; } //Overridden so we can show related fields instead of fields from the parent table: void Dialog_Layout_Calendar_Related::on_button_add_field() { //Get the chosen field: //std::cout << "debug: related relationship=" << glom_get_sharedptr_name(m_portal->get_related_relationship()) << std::endl; //std::cout << "debug table used =" << m_portal->get_table_used(m_table_name) << std::endl; type_list_field_items fields_list = offer_field_list(m_table_name, this); for(type_list_field_items::iterator iter_chosen = fields_list.begin(); iter_chosen != fields_list.end(); ++iter_chosen) { sharedptr field = *iter_chosen; if(!field) continue; //Add the field details to the layout treeview: Gtk::TreeModel::iterator iter = m_model_items->append(); if(iter) { Gtk::TreeModel::Row row = *iter; row[m_model_items->m_columns.m_col_layout_item] = field; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); } } } void Dialog_Layout_Calendar_Related::on_button_edit() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr field = sharedptr::cast_dynamic(layout_item); //Get the chosen field: sharedptr field_chosen = offer_field_list_select_one_field(field, m_portal->get_table_used(m_table_name), this); if(field_chosen) { //Set the field details in the layout treeview: row[m_model_items->m_columns.m_col_layout_item] = field_chosen; //Scroll to, and select, the new row: /* Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); treeview_fill_sequences(m_model_items, m_model_items->m_columns.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. */ } } } } sharedptr Dialog_Layout_Calendar_Related::get_portal_layout() { return m_portal; } } //namespace Glom glom-1.22.4/glom/mode_design/layout/combobox_relationship.cc0000644000175000017500000002616212234252646025431 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include namespace Glom { ComboBox_Relationship::ComboBox_Relationship(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::ComboBox(cobject), m_renderer_title(0), m_renderer_fromfield(0) { m_model = Gtk::TreeStore::create(m_model_columns); set_model(m_model); //Add name column: //m_renderer_name = Gtk::manage(new Gtk::CellRendererText()); //pack_start(*m_renderer_name); //set_cell_data_func(*m_renderer_name, sigc::mem_fun(*this, &ComboBox_Relationship::on_cell_data_name)); //Add title column: m_renderer_title = Gtk::manage(new Gtk::CellRendererText()); pack_start(*m_renderer_title); set_cell_data_func(*m_renderer_title, sigc::mem_fun(*this, &ComboBox_Relationship::on_cell_data_title)); //Add from field (as hint) column: m_renderer_fromfield = Gtk::manage(new Gtk::CellRendererText()); pack_start(*m_renderer_fromfield); m_renderer_fromfield->set_property("xalign", 0.0f); set_cell_data_func(*m_renderer_fromfield, sigc::mem_fun(*this, &ComboBox_Relationship::on_cell_data_fromfield)); set_row_separator_func(sigc::mem_fun(*this, &ComboBox_Relationship::on_row_separator)); } ComboBox_Relationship::~ComboBox_Relationship() { } sharedptr ComboBox_Relationship::get_selected_relationship() const { Gtk::TreeModel::iterator iter = get_active(); if(iter) { Gtk::TreeModel::Row row = *iter; return row[m_model_columns.m_relationship]; } else return sharedptr(); } sharedptr ComboBox_Relationship::get_selected_relationship(sharedptr& related_relationship) const { Gtk::TreeModel::iterator iter = get_active(); if(iter) { Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::iterator iterParent = row.parent(); if(iterParent) { //It's a related relationship: related_relationship = row[m_model_columns.m_relationship]; return (*iterParent)[m_model_columns.m_relationship]; } else return row[m_model_columns.m_relationship]; } else return sharedptr(); } void ComboBox_Relationship::set_selected_relationship(const sharedptr& relationship) { if(relationship) set_selected_relationship(relationship->get_name()); else set_selected_relationship(Glib::ustring()); } void ComboBox_Relationship::set_selected_relationship(const sharedptr& relationship, const sharedptr& related_relationship) { if(relationship) set_selected_relationship(relationship->get_name(), glom_get_sharedptr_name(related_relationship)); else set_selected_relationship(Glib::ustring()); } void ComboBox_Relationship::set_selected_relationship(const Glib::ustring& relationship_name, const Glib::ustring& related_relationship_name) { //Look for the row with this text, and activate it: Glib::RefPtr model = get_model(); if(model) { for(Gtk::TreeModel::iterator iter = model->children().begin(); iter != model->children().end(); ++iter) { Gtk::TreeModel::Row row = *iter; sharedptr relationship = row[m_model_columns.m_relationship]; const Glib::ustring this_name = glom_get_sharedptr_name(relationship); //(An empty name means Select the parent table item.) if(this_name == relationship_name) { if(related_relationship_name.empty()) { set_active(iter); return; //success } else { for(Gtk::TreeModel::iterator iterChildren = iter->children().begin(); iterChildren != iter->children().end(); ++iterChildren) { Gtk::TreeModel::Row row = *iterChildren; sharedptr relationship = row[m_model_columns.m_relationship]; const Glib::ustring this_name = glom_get_sharedptr_name(relationship); if(this_name == related_relationship_name) { set_active(iterChildren); return; //success } } } } } } //Not found, so mark it as blank: //std::cerr << G_STRFUNC << ": relationship not found in list: " << relationship_name << std::endl; //Avoid calling unset_active() if nothing is selected, because it triggers the changed signal unnecessarily. if(get_active()) //If something is active (selected). unset_active(); } void ComboBox_Relationship::set_relationships(Document* document, const Glib::ustring parent_table_name, bool show_related_relationships, bool show_parent_table_name) { if(!document) return; const Document::type_vec_relationships relationships = document->get_relationships(parent_table_name, true /* plus system properties */); m_model->clear(); if(show_parent_table_name) set_display_parent_table(parent_table_name, document->get_table_title(parent_table_name, AppWindow::get_current_locale())); //Fill the model: for(type_vec_relationships::const_iterator iter = relationships.begin(); iter != relationships.end(); ++iter) { Gtk::TreeModel::iterator tree_iter = m_model->append(); Gtk::TreeModel::Row row = *tree_iter; sharedptr rel = *iter; row[m_model_columns.m_relationship] = rel; row[m_model_columns.m_separator] = false; //Children: if(show_related_relationships && !Document::get_relationship_is_system_properties(rel)) { const Document::type_vec_relationships sub_relationships = document->get_relationships(rel->get_to_table(), false /* plus system properties */); for(type_vec_relationships::const_iterator iter = sub_relationships.begin(); iter != sub_relationships.end(); ++iter) { Gtk::TreeModel::iterator tree_iter_child = m_model->append(tree_iter->children()); Gtk::TreeModel::Row row = *tree_iter_child; sharedptr rel = *iter; row[m_model_columns.m_relationship] = rel; row[m_model_columns.m_separator] = false; } } } } void ComboBox_Relationship::set_relationships(const type_vec_relationships& relationships, const Glib::ustring& parent_table_name, const Glib::ustring& parent_table_title) { m_model->clear(); set_display_parent_table(parent_table_name, parent_table_title); //Fill the model: for(type_vec_relationships::const_iterator iter = relationships.begin(); iter != relationships.end(); ++iter) { Gtk::TreeModel::iterator tree_iter = m_model->append(); Gtk::TreeModel::Row row = *tree_iter; row[m_model_columns.m_relationship] = *iter; row[m_model_columns.m_separator] = false; } } /* void ComboBox_Relationship::on_cell_data_name(const Gtk::TreeModel::const_iterator& iter) { Gtk::TreeModel::Row row = *iter; sharedptr relationship = row[m_model_columns.m_relationship]; if(relationship) m_renderer_name->property_text() = relationship->get_name(); else if(get_has_parent_table()) m_renderer_name->property_text() = m_extra_table_name; } */ void ComboBox_Relationship::on_cell_data_title(const Gtk::TreeModel::const_iterator& iter) { Gtk::TreeModel::Row row = *iter; sharedptr relationship = row[m_model_columns.m_relationship]; if(relationship) { Gtk::TreeModel::iterator iterParent = row->parent(); if(iterParent) { //related relationship: sharedptr parent_relationship = (*iterParent)[m_model_columns.m_relationship]; if(relationship) m_renderer_title->set_property("text", item_get_title_or_name(parent_relationship) + "::" + item_get_title_or_name(relationship)); } else m_renderer_title->set_property("text", item_get_title_or_name(relationship)); } else if(get_has_parent_table()) { m_renderer_title->set_property("text", (m_extra_table_title.empty() ? m_extra_table_name : m_extra_table_title)); } else { //std::cerr << G_STRFUNC << ": empty relationship and no m_extra_table_name. m_extra_table_name=" << m_extra_table_name << std::endl; } } bool ComboBox_Relationship::on_row_separator(const Glib::RefPtr& /* model */, const Gtk::TreeModel::const_iterator& iter) { Gtk::TreeModel::Row row = *iter; const bool separator = row[m_model_columns.m_separator]; return separator; } void ComboBox_Relationship::on_cell_data_fromfield(const Gtk::TreeModel::const_iterator& iter) { Gtk::TreeModel::Row row = *iter; sharedptr relationship = row[m_model_columns.m_relationship]; if(relationship && relationship->get_has_fields()) { Gtk::TreeModel::iterator iterParent = iter->parent(); if(iterParent) { sharedptr parent_relationship = (*iterParent)[m_model_columns.m_relationship]; if(parent_relationship) m_renderer_fromfield->set_property("text", Glib::ustring::compose(_(" Via: %1::%2"), item_get_title(parent_relationship), relationship->get_from_field())); } else { m_renderer_fromfield->set_property("text", Glib::ustring::compose(_(" Via: %1"), relationship->get_to_field())); } } else m_renderer_fromfield->set_property("text", Glib::ustring()); } void ComboBox_Relationship::set_display_parent_table(const Glib::ustring& table_name, const Glib::ustring& table_title) { if(table_name.empty()) return; const bool already_added = get_has_parent_table() && !(m_model->children().empty()); //We don't need to recreate the model row when these change, because the callback just uses the new values. m_extra_table_name = table_name; m_extra_table_title = table_title; if(!already_added) { //Add a separator row after the table name: Gtk::TreeModel::iterator tree_iter = m_model->prepend(); Gtk::TreeModel::Row row = *tree_iter; row[m_model_columns.m_separator] = true; tree_iter = m_model->prepend(); row = *tree_iter; row[m_model_columns.m_relationship] = sharedptr(); //A marker for the parent table's item. See the on_data_* signal handlers. row[m_model_columns.m_separator] = false; } } void ComboBox_Relationship::set_selected_parent_table(const Glib::ustring& table_name, const Glib::ustring& table_title) { //Save the values: set_display_parent_table(table_name, table_title); set_selected_relationship(sharedptr()); //Select the extra item. } bool ComboBox_Relationship::get_has_parent_table() const { return !(m_extra_table_name.empty()) || !(m_extra_table_title.empty()); } } //namespace Glom glom-1.22.4/glom/mode_design/layout/dialog_layout_list_related.h0000644000175000017500000000625112234252646026266 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_LAYOUT_LIST_RELATED_H #define GLOM_MODE_DESIGN_DIALOG_LAYOUT_LIST_RELATED_H #include #include #include #include #include namespace Glom { class Dialog_Layout_List_Related : public Dialog_Layout_List { public: static const char* glade_id; static const bool glade_developer; Dialog_Layout_List_Related(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Layout_List_Related(); /** * @param layout_name "list" or "details" * @param layout_platform As in the document. Empty or "maemo". * @param document The document, so that the dialog can load the previous layout, and save changes. * @param portal The layout item, which knows its from_table, for instance. * @apram for_print_layout If true, don't show the navigation options, for instance. */ void init_with_portal(const Glib::ustring& layout_name, const Glib::ustring& layout_platform, Document* document, const sharedptr& portal, const Glib::ustring& from_table, bool for_print_layout = false); virtual void update_ui(bool including_relationships_list = true); sharedptr get_relationship() const; sharedptr get_portal_layout(); protected: virtual void save_to_document(); ///@inheritdoc virtual Glib::ustring get_fields_table() const; //signal handlers: virtual void on_button_add_field(); //override virtual void on_button_edit(); //override void on_combo_relationship_changed(); void on_combo_navigation_specific_changed(); void on_checkbutton_show_child_relationships(); void on_spinbutton_changed(); ComboBox_Relationship* m_combo_relationship; Gtk::CheckButton* m_checkbutton_show_child_relationships; sharedptr m_portal; Gtk::RadioButton* m_radio_navigation_automatic; Gtk::RadioButton* m_radio_navigation_none; Gtk::RadioButton* m_radio_navigation_specify; Gtk::Label* m_label_navigation_automatic; ComboBox_Relationship* m_combo_navigation_specify; Gtk::SpinButton* m_spinbutton_row_line_width; Gtk::SpinButton* m_spinbutton_column_line_width; Gtk::ColorButton* m_colorbutton_line; bool m_for_print_layout; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_LAYOUT_LIST_RELATED_H glom-1.22.4/glom/mode_design/layout/dialog_layout_export.h0000644000175000017500000000572612234252646025142 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_LAYOUT_EXPORT_H #define GLOM_MODE_DESIGN_DIALOG_LAYOUT_EXPORT_H #include namespace Glom { class Dialog_Layout_Export : public Dialog_Layout { public: static const char* glade_id; static const bool glade_developer; Dialog_Layout_Export(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Layout_Export(); /** * @param mapGroups The initial layout. (Note: This is only non-const for performance, to avoid an extra copy. This update with full field information. * @param document The document, so that the dialog can get extra information. * @param table_name The table name. * @param table_fields: The actual fields in the table, in case the document does not yet know about them all. */ virtual void set_layout_groups(Document::type_list_layout_groups& mapGroups, Document* document, const Glib::ustring& table_name); void get_layout_groups(Document::type_list_layout_groups& layout_groups) const; private: //Enable/disable buttons, depending on treeview selection: virtual void enable_buttons(); //signal handlers: virtual void on_button_up(); virtual void on_button_down(); virtual void on_button_add_field(); virtual void on_button_delete(); virtual void on_button_edit_field(); virtual void on_treeview_fields_selection_changed(); virtual void on_cell_data_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); //Tree model columns: class ModelColumns_Fields : public Gtk::TreeModel::ColumnRecord { public: ModelColumns_Fields() { add(m_col_layout_item); add(m_col_sequence); } Gtk::TreeModelColumn< sharedptr > m_col_layout_item; Gtk::TreeModelColumn m_col_sequence; }; ModelColumns_Fields m_ColumnsFields; //Tree model columns: Gtk::TreeView* m_treeview_fields; Gtk::Button* m_button_field_up; Gtk::Button* m_button_field_down; Gtk::Button* m_button_field_add; Gtk::Button* m_button_field_delete; Gtk::Button* m_button_field_edit; Glib::RefPtr m_model_fields; Gtk::Label* m_label_table_name; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_LAYOUT_EXPORT_H glom-1.22.4/glom/mode_design/layout/dialog_layout_list_related.cc0000644000175000017500000005245512234776363026442 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include //For bold_message(). #include #include //For show_ok_dialog(). //#include #include #include #include namespace Glom { const char* Dialog_Layout_List_Related::glade_id("window_data_layout"); const bool Dialog_Layout_List_Related::glade_developer(true); Dialog_Layout_List_Related::Dialog_Layout_List_Related(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Layout_List(cobject, builder), m_combo_relationship(0), m_checkbutton_show_child_relationships(0), m_radio_navigation_automatic(0), m_radio_navigation_none(0), m_radio_navigation_specify(0), m_label_navigation_automatic(0), m_combo_navigation_specify(0), m_spinbutton_row_line_width(0), m_spinbutton_column_line_width(0), m_colorbutton_line(0), m_for_print_layout(false) { // Show the appropriate alternate widgets: m_box_table_widgets->hide(); m_box_related_table_widgets->show(); m_box_related_navigation->show(); m_hbox_rows_count->show(); m_spinbutton_rows_count_min->set_range(0, 100); //Otherwise only 0 would be allowed. m_spinbutton_rows_count_min->set_increments(1, 10); //Otherwise the buttons do nothing. m_spinbutton_rows_count_min->signal_value_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_List_Related::on_spinbutton_changed)); m_spinbutton_rows_count_max->set_range(0, 100); //Otherwise only 0 would be allowed. m_spinbutton_rows_count_max->set_increments(1, 10); //Otherwise the buttons do nothing. m_spinbutton_rows_count_max->signal_value_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_List_Related::on_spinbutton_changed)); builder->get_widget_derived("combo_relationship_name", m_combo_relationship); if(m_combo_relationship) { m_combo_relationship->signal_changed().connect(sigc::mem_fun(*this, &Dialog_Layout_List_Related::on_combo_relationship_changed)); } builder->get_widget("checkbutton_show_child_relationships", m_checkbutton_show_child_relationships); if(m_checkbutton_show_child_relationships) { m_checkbutton_show_child_relationships->signal_toggled().connect(sigc::mem_fun(*this, &Dialog_Layout_List_Related::on_checkbutton_show_child_relationships)); } builder->get_widget("radiobutton_navigation_automatic", m_radio_navigation_automatic); builder->get_widget("label_navigation_automatic", m_label_navigation_automatic); make_sensitivity_depend_on_toggle_button(*m_radio_navigation_automatic, *m_label_navigation_automatic); builder->get_widget("radiobutton_navigation_none", m_radio_navigation_none); builder->get_widget("radiobutton_navigation_specify", m_radio_navigation_specify); builder->get_widget_derived("combobox_navigation_specify", m_combo_navigation_specify); if(m_radio_navigation_specify && m_combo_navigation_specify) { make_sensitivity_depend_on_toggle_button(*m_radio_navigation_specify, *m_combo_navigation_specify); m_combo_navigation_specify->signal_changed().connect(sigc::mem_fun(*this, &Dialog_Layout_List_Related::on_combo_navigation_specific_changed)); } builder->get_widget("spinbutton_row_line_width", m_spinbutton_row_line_width); if(m_spinbutton_row_line_width) { m_spinbutton_row_line_width->signal_value_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_List_Related::on_spinbutton_changed)); } builder->get_widget("spinbutton_column_line_width", m_spinbutton_column_line_width); if(m_spinbutton_column_line_width) { m_spinbutton_column_line_width->signal_value_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_List_Related::on_spinbutton_changed)); } builder->get_widget("colorbutton_line", m_colorbutton_line); if(m_colorbutton_line) { m_colorbutton_line->signal_color_set().connect( sigc::mem_fun(*this, &Dialog_Layout_List_Related::on_spinbutton_changed)); } m_modified = false; //show_all_children(); //This entry must be in the Glade file, because it's used by the base class, //but we don't want it here, because it is confusing when dealing with relationships: if(m_entry_table_title) m_entry_table_title->hide(); // We don't use this (it's from the base class). if(m_label_table_title) m_label_table_title->hide(); // We don't use this (it's from the base class). } Dialog_Layout_List_Related::~Dialog_Layout_List_Related() { } void Dialog_Layout_List_Related::init_with_portal(const Glib::ustring& layout_name, const Glib::ustring& layout_platform, Document* document, const sharedptr& portal, const Glib::ustring& from_table, bool for_print_layout) { m_for_print_layout = for_print_layout; //Ignore the provided from_table if the portal has one: Glib::ustring actual_from_table; if(portal) { const Glib::ustring portal_from_table = portal->get_from_table(); if(portal_from_table.empty()) actual_from_table = portal_from_table; } if(actual_from_table.empty()) actual_from_table = from_table; if(portal) m_portal = glom_sharedptr_clone(portal); else m_portal = sharedptr::create(); //The rest of the class assumes that this is not null. gulong rows_count_min = 0; gulong rows_count_max = 0; m_portal->get_rows_count(rows_count_min, rows_count_max); m_spinbutton_rows_count_min->set_value(rows_count_min); m_spinbutton_rows_count_max->set_value(rows_count_max); type_vecConstLayoutFields empty_fields; //Just to satisfy the base class. Dialog_Layout::init(layout_name, layout_platform, document, actual_from_table, empty_fields); //m_table_name is now actually the parent_table_name. //Hide unwanted widgets and show extra ones: if(for_print_layout) { m_box_related_navigation->hide(); m_box_frame_lines->show(); m_spinbutton_row_line_width->set_value( portal->get_print_layout_row_line_width()); m_spinbutton_column_line_width->set_value( portal->get_print_layout_column_line_width()); const Gdk::RGBA color( portal->get_print_layout_line_color() ); m_colorbutton_line->set_rgba(color); //Avoid showing formatting options that are about editing: m_editable_layout = false; } update_ui(); } void Dialog_Layout_List_Related::update_ui(bool including_relationship_list) { if(!m_portal) return; m_modified = false; const Glib::ustring related_table_name = m_portal->get_table_used(Glib::ustring() /* parent table - not relevant*/); //Update the tree models from the document Document* document = get_document(); if(document) { //Fill the relationships combo: if(including_relationship_list) { bool show_child_relationships = m_checkbutton_show_child_relationships->get_active(); //For the showing of child relationships if necessary: if(!show_child_relationships && m_portal->get_related_relationship()) { show_child_relationships = true; } Glib::ustring from_table; if(m_portal->get_has_relationship_name()) from_table = m_portal->get_relationship()->get_from_table(); else from_table = m_table_name; m_combo_relationship->set_relationships(document, from_table, show_child_relationships, false /* don't show parent table */); //We don't show the optional parent table because portal use _only_ relationships, of course. if(show_child_relationships != m_checkbutton_show_child_relationships->get_active()) { m_checkbutton_show_child_relationships->set_active(show_child_relationships); } } //Set the table name and title: //sharedptr portal_temp = m_portal; Document::type_list_layout_groups mapGroups; if(m_portal) { m_combo_relationship->set_selected_relationship(m_portal->get_relationship(), m_portal->get_related_relationship()); mapGroups.push_back(m_portal); document->fill_layout_field_details(related_table_name, mapGroups); //Update with full field information. //Show the field layout //typedef std::list< Glib::ustring > type_listStrings; } m_model_items->clear(); for(Document::type_list_layout_groups::const_iterator iter = mapGroups.begin(); iter != mapGroups.end(); ++iter) { sharedptr group = *iter; sharedptr portal = sharedptr::cast_dynamic(group); if(portal) { for(LayoutGroup::type_list_items::const_iterator iterInner = group->m_list_items.begin(); iterInner != group->m_list_items.end(); ++iterInner) { sharedptr item = *iterInner; sharedptr groupInner = sharedptr::cast_dynamic(item); if(groupInner) add_group(Gtk::TreeModel::iterator() /* null == top-level */, groupInner); else { //Add the item to the treeview: Gtk::TreeModel::iterator iter = m_model_items->append(); Gtk::TreeModel::Row row = *iter; row[m_model_items->m_columns.m_col_layout_item] = glom_sharedptr_clone(item); } } } } } //Show the navigation information: //const Document::type_vec_relationships vecRelationships = document->get_relationships(m_portal->get_relationship()->get_from_table()); m_combo_navigation_specify->set_relationships(document, related_table_name, true /* show related relationships */, false /* don't show parent table */); //TODO: Don't show the hidden tables, and don't show relationships that are not used by any fields. //m_combo_navigation_specify->set_display_parent_table(""); //This would be superfluous, and a bit confusing. if(m_portal->get_navigation_type() == LayoutItem_Portal::NAVIGATION_SPECIFIC) { sharedptr navrel = m_portal->get_navigation_relationship_specific(); //std::cout << "debug navrel=" << navrel->get_relationship()->get_name() << std::endl; m_combo_navigation_specify->set_selected_relationship(navrel->get_relationship(), navrel->get_related_relationship()); } else { sharedptr none; m_combo_navigation_specify->set_selected_relationship(none); } //Set the appropriate radio button: //std::cout << "debug: navrel_type=" << m_portal->get_navigation_relationship_type() << std::endl; switch(m_portal->get_navigation_type()) { case LayoutItem_Portal::NAVIGATION_NONE: m_radio_navigation_none->set_active(true); break; case LayoutItem_Portal::NAVIGATION_AUTOMATIC: m_radio_navigation_automatic->set_active(true); break; case LayoutItem_Portal::NAVIGATION_SPECIFIC: m_radio_navigation_specify->set_active(true); break; } //Describe the automatic navigation: sharedptr relationship_navigation_automatic = m_portal->get_portal_navigation_relationship_automatic(document); Glib::ustring automatic_navigation_description = m_portal->get_relationship_name_used(); //TODO: Use get_relationship_display_name() instead? if(relationship_navigation_automatic) //This is a relationship in the related table. { automatic_navigation_description += ("::" + relationship_navigation_automatic->get_relationship_display_name()); } if(automatic_navigation_description.empty()) { automatic_navigation_description = _("None: No visible tables are specified by the fields."); } m_label_navigation_automatic->set_text(automatic_navigation_description); m_modified = false; } void Dialog_Layout_List_Related::save_to_document() { Dialog_Layout::save_to_document(); if(m_modified) { //Get the data from the TreeView and store it in the document: //Get the groups and their fields: Document::type_list_layout_groups mapGroups; //Add the fields to the portal: //The code that created this dialog must read m_portal back out again. m_portal->remove_all_items(); guint field_sequence = 1; //0 means no sequence for(Gtk::TreeModel::iterator iterFields = m_model_items->children().begin(); iterFields != m_model_items->children().end(); ++iterFields) { Gtk::TreeModel::Row row = *iterFields; sharedptr item = row[m_model_items->m_columns.m_col_layout_item]; const Glib::ustring field_name = item->get_name(); if(!field_name.empty()) { m_portal->add_item(item); //Add it to the group: ++field_sequence; } } if(m_radio_navigation_specify->get_active()) { sharedptr rel, rel_related; rel = m_combo_navigation_specify->get_selected_relationship(rel_related); sharedptr uses_rel = sharedptr::create(); uses_rel->set_relationship(rel); uses_rel->set_related_relationship(rel_related); if(rel || rel_related) m_portal->set_navigation_relationship_specific(uses_rel); //std::cout << "debug99 main=specify_main" << ", relationship=" << (rel ? rel->get_name() : "none") << std::endl; } else { // TODO: Get rid of the else branch. Cleanup code for the relations should // go into the Glom::LayoutItem_Portal::set_navigation_relationship_type_* functions. //std::cout << "debug: set_navigation_relationship_specific(false, none)" << std::endl; sharedptr none; m_portal->set_navigation_relationship_specific(none); } if (m_radio_navigation_automatic->get_active()) m_portal->set_navigation_type(LayoutItem_Portal::NAVIGATION_AUTOMATIC); if(m_radio_navigation_none->get_active()) { sharedptr uses_rel = sharedptr::create(); uses_rel->set_related_relationship(sharedptr()); m_portal->set_navigation_type(LayoutItem_Portal::NAVIGATION_NONE); } m_portal->set_rows_count( m_spinbutton_rows_count_min->get_value(), m_spinbutton_rows_count_max->get_value()); if(m_for_print_layout) { m_portal->set_print_layout_row_line_width( m_spinbutton_row_line_width->get_value()); m_portal->set_print_layout_column_line_width( m_spinbutton_column_line_width->get_value()); m_portal->set_print_layout_line_color( m_colorbutton_line->get_rgba().to_string() ); } } } void Dialog_Layout_List_Related::on_checkbutton_show_child_relationships() { update_ui(); } void Dialog_Layout_List_Related::on_combo_relationship_changed() { if(!m_portal) return; sharedptr relationship_related; sharedptr relationship = m_combo_relationship->get_selected_relationship(relationship_related); if(!relationship) return; //Check that the relationship is appropriate for use in a related records portal. //The relationship's to field may not be a unique field, because that would //prevent the portal from having multiple records. sharedptr to_key_field = DbUtils::get_fields_for_table_one_field(get_document(), relationship->get_to_table(), relationship->get_to_field()); bool relationship_invalid = false; if(!to_key_field) { Utils::show_ok_dialog(_("Invalid Relationship"), _("The relationship may not be used to show related records because the relationship does not specify a field in the related table."), *this, Gtk::MESSAGE_ERROR); relationship_invalid = true; } else if(to_key_field->get_primary_key()) { Utils::show_ok_dialog(_("Relationship Uses a Related Primary Key"), _("The relationship may not be used to show related records because the relationship uses a primary key field in the related table, which must contain unique values. This would prevent the relationship from specifying multiple related records."), *this, Gtk::MESSAGE_ERROR); relationship_invalid = true; } else if(to_key_field->get_unique_key()) { Utils::show_ok_dialog(_("Relationship Uses a Related Unique Field"), _("The relationship may not be used to show related records because the relationship uses a unique-values field in the related table. This would prevent the relationship from specifying multiple related records."), *this, Gtk::MESSAGE_ERROR); relationship_invalid = true; } //Reset the previous value if the choice was bad: if(relationship_invalid) { m_combo_relationship->set_selected_relationship( m_portal->get_relationship(), m_portal->get_related_relationship()); return; } //Clear the list of fields if the relationship has changed, //because the fields could not possible be correct for the new table: bool relationship_changed = false; const Glib::ustring old_relationship_name = glom_get_sharedptr_name(m_portal->get_relationship()); const Glib::ustring old_relationship_related_name = glom_get_sharedptr_name(m_portal->get_related_relationship()); if( (old_relationship_name != glom_get_sharedptr_name(relationship)) || (old_relationship_related_name != glom_get_sharedptr_name(relationship_related)) ) { relationship_changed = true; } m_portal->set_relationship(relationship); m_portal->set_related_relationship(relationship_related); if(relationship_changed) m_portal->remove_all_items(); //Refresh everything for the new relationship: update_ui(false /* not including the list of relationships */); m_modified = true; } void Dialog_Layout_List_Related::on_spinbutton_changed() { m_modified = true; } sharedptr Dialog_Layout_List_Related::get_relationship() const { std::cout << "debug: I wonder if this function is used." << std::endl; return m_combo_relationship->get_selected_relationship(); } sharedptr Dialog_Layout_List_Related::get_portal_layout() { return m_portal; } void Dialog_Layout_List_Related::on_combo_navigation_specific_changed() { m_modified = true; } //Overridden so we can show related fields instead of fields from the parent table: void Dialog_Layout_List_Related::on_button_add_field() { //Get the chosen field: //std::cout << "debug: related relationship=" << glom_get_sharedptr_name(m_portal->get_related_relationship()) << std::endl; //std::cout << "debug table used =" << m_portal->get_table_used(m_table_name) << std::endl; type_list_field_items fields_list = offer_field_list(m_portal->get_table_used(m_table_name), this); for(type_list_field_items::iterator iter_chosen = fields_list.begin(); iter_chosen != fields_list.end(); ++iter_chosen) { sharedptr field = *iter_chosen; if(!field) continue; //Add the field details to the layout treeview: Gtk::TreeModel::iterator iter = m_model_items->append(); if(iter) { Gtk::TreeModel::Row row = *iter; row[m_model_items->m_columns.m_col_layout_item] = field; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); } } } void Dialog_Layout_List_Related::on_button_edit() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr field = sharedptr::cast_dynamic(layout_item); //Get the chosen field: sharedptr field_chosen = offer_field_list_select_one_field(field, m_portal->get_table_used(m_table_name), this); if(field_chosen) { //Set the field details in the layout treeview: row[m_model_items->m_columns.m_col_layout_item] = field_chosen; //Scroll to, and select, the new row: /* Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); treeview_fill_sequences(m_model_items, m_model_items->m_columns.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. */ } } } } Glib::ustring Dialog_Layout_List_Related::get_fields_table() const { if(!m_portal) return Glib::ustring(); return m_portal->get_table_used(m_table_name); } } //namespace Glom glom-1.22.4/glom/mode_design/layout/dialog_layout_list.h0000644000175000017500000000240412234252646024562 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_LAYOUT_LIST_H #define GLOM_MODE_DESIGN_DIALOG_LAYOUT_LIST_H #include namespace Glom { class Dialog_Layout_List : public Dialog_Layout_Details { public: static const char* glade_id; static const bool glade_developer; Dialog_Layout_List(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Layout_List(); }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_LAYOUT_LIST_H glom-1.22.4/glom/mode_design/layout/dialog_choose_relationship.h0000644000175000017500000000464612234252646026265 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_CHOOSE_RELATIONSHIP_H #define GLOM_MODE_DESIGN_DIALOG_CHOOSE_RELATIONSHIP_H #include #include #include #include namespace Glom { class Dialog_ChooseRelationship : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; Dialog_ChooseRelationship(); Dialog_ChooseRelationship(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ChooseRelationship(); /** * @param document The document, so that the dialog can load the previous layout, and save changes. * @param table_name The table name. */ virtual void set_document(Document* document, const Glib::ustring& table_name); void select_item(const sharedptr& relationship); sharedptr get_relationship_chosen() const; private: //Tree model columns: class ModelColumns_Relationships : public Gtk::TreeModel::ColumnRecord { public: ModelColumns_Relationships() { add(m_col_name); /* add(m_col_title); */ add(m_col_relationship); } Gtk::TreeModelColumn m_col_name; //Gtk::TreeModelColumn m_col_title; Gtk::TreeModelColumn< sharedptr > m_col_relationship; }; ModelColumns_Relationships m_ColumnsRelationships; Gtk::Label* m_label_table_name; Gtk::Button* m_button_select; Gtk::TreeView* m_treeview; Glib::RefPtr m_model; Glib::ustring m_table_name; Document* m_document; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_CHOOSE_RELATIONSHIP_H glom-1.22.4/glom/mode_design/layout/dialog_layout_export.cc0000644000175000017500000002704512234252646025276 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include //For bold_message()). //#include #include namespace Glom { const char* Dialog_Layout_Export::glade_id("window_data_layout_export"); const bool Dialog_Layout_Export::glade_developer(true); Dialog_Layout_Export::Dialog_Layout_Export(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Layout(cobject, builder, false /* no table title */), m_treeview_fields(0), m_button_field_up(0), m_button_field_down(0), m_button_field_add(0), m_button_field_delete(0), m_button_field_edit(0), m_label_table_name(0) { builder->get_widget("label_table_name", m_label_table_name); m_entry_table_title = 0; //Not in this glade file. builder->get_widget("treeview_fields", m_treeview_fields); if(m_treeview_fields) { m_model_fields = Gtk::ListStore::create(m_ColumnsFields); m_treeview_fields->set_model(m_model_fields); // Append the View columns: Gtk::TreeView::Column* column_name = Gtk::manage( new Gtk::TreeView::Column(_("Fields")) ); m_treeview_fields->append_column(*column_name); Gtk::CellRendererText* renderer_name = Gtk::manage(new Gtk::CellRendererText); column_name->pack_start(*renderer_name); column_name->set_cell_data_func(*renderer_name, sigc::mem_fun(*this, &Dialog_Layout_Export::on_cell_data_name)); //Sort by sequence, so we can change the order by changing the values in the hidden sequence column. m_model_fields->set_sort_column(m_ColumnsFields.m_col_sequence, Gtk::SORT_ASCENDING); //Respond to changes of selection: Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_Export::on_treeview_fields_selection_changed) ); } m_model_fields->signal_row_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_Export::on_treemodel_row_changed) ); } builder->get_widget("button_field_up", m_button_field_up); m_button_field_up->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Export::on_button_up) ); builder->get_widget("button_field_down", m_button_field_down); m_button_field_down->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Export::on_button_down) ); builder->get_widget("button_field_delete", m_button_field_delete); m_button_field_delete->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Export::on_button_delete) ); builder->get_widget("button_field_add", m_button_field_add); m_button_field_add->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Export::on_button_add_field) ); builder->get_widget("button_field_edit", m_button_field_edit); m_button_field_edit->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Export::on_button_edit_field) ); show_all_children(); } Dialog_Layout_Export::~Dialog_Layout_Export() { } void Dialog_Layout_Export::set_layout_groups(Document::type_list_layout_groups& mapGroups, Document* document, const Glib::ustring& table_name) { Base_DB::set_document(document); m_modified = false; //m_document = document m_table_name = table_name; //Update the tree models from the document if(document) { //Set the table name and title: m_label_table_name->set_text(table_name); if(document) document->fill_layout_field_details(m_table_name, mapGroups); //Update with full field information. //If we have not layout information, then start with something: /* if(mapGroups.empty()) { LayoutGroup group; group->set_name("main"); guint field_sequence = 1; //0 means no sequence for(type_vecLayoutFields::const_iterator iter = table_fields.begin(); iter != table_fields.end(); ++iter) { LayoutItem_Field item = *(*iter); group->add_item(item); ++field_sequence; } mapGroups[1] = group; } */ //Show the field layout: m_model_fields->clear(); guint field_sequence = 1; //0 means no sequence for(Document::type_list_layout_groups::const_iterator iter = mapGroups.begin(); iter != mapGroups.end(); ++iter) { sharedptr group = *iter; if(!group) continue; //Add the group's fields: LayoutGroup::type_list_const_items items = group->get_items(); for(LayoutGroup::type_list_const_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr item = sharedptr::cast_dynamic(*iter); if(item) { Gtk::TreeModel::iterator iterTree = m_model_fields->append(); Gtk::TreeModel::Row row = *iterTree; row[m_ColumnsFields.m_col_layout_item] = glom_sharedptr_clone(item); row[m_ColumnsFields.m_col_sequence] = field_sequence; ++field_sequence; } } } treeview_fill_sequences(m_model_fields, m_ColumnsFields.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } m_modified = false; } void Dialog_Layout_Export::enable_buttons() { //Fields: Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { //Disable Up if It can't go any higher. bool enable_up = true; if(iter == m_model_fields->children().begin()) enable_up = false; //It can't go any higher. m_button_field_up->set_sensitive(enable_up); //Disable Down if It can't go any lower. Gtk::TreeModel::iterator iterNext = iter; iterNext++; bool enable_down = true; if(iterNext == m_model_fields->children().end()) enable_down = false; m_button_field_down->set_sensitive(enable_down); m_button_field_delete->set_sensitive(true); } else { //Disable all buttons that act on a selection: m_button_field_down->set_sensitive(false); m_button_field_up->set_sensitive(false); m_button_field_delete->set_sensitive(false); } } } void Dialog_Layout_Export::on_button_up() { move_treeview_selection_up(m_treeview_fields, m_ColumnsFields.m_col_sequence); } void Dialog_Layout_Export::on_button_down() { move_treeview_selection_down(m_treeview_fields, m_ColumnsFields.m_col_sequence); } void Dialog_Layout_Export::get_layout_groups(Document::type_list_layout_groups& layout_groups) const { //Get the data from the TreeView and store it in the document: //Get the groups and their fields: Document::type_list_layout_groups groups; //Add the fields to the one group: sharedptr others = sharedptr::create(); others->set_name("main"); guint field_sequence = 1; //0 means no sequence for(Gtk::TreeModel::iterator iterFields = m_model_fields->children().begin(); iterFields != m_model_fields->children().end(); ++iterFields) { Gtk::TreeModel::Row row = *iterFields; sharedptr item = row[m_ColumnsFields.m_col_layout_item]; const Glib::ustring field_name = item->get_name(); if(!field_name.empty()) { others->add_item(item); //Add it to the group: ++field_sequence; } } groups.push_back(others); layout_groups.swap(groups); } void Dialog_Layout_Export::on_treeview_fields_selection_changed() { enable_buttons(); } void Dialog_Layout_Export::on_button_add_field() { //Get the chosen fields: type_list_field_items fields_list = offer_field_list(m_table_name, this); for(type_list_field_items::iterator iter_chosen = fields_list.begin(); iter_chosen != fields_list.end(); ++iter_chosen) { sharedptr field = *iter_chosen; if(!field) continue; //Add the field details to the layout treeview: Gtk::TreeModel::iterator iter = m_model_fields->append(); if(iter) { Gtk::TreeModel::Row row = *iter; row[m_ColumnsFields.m_col_layout_item] = field; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); treeview_fill_sequences(m_model_fields, m_ColumnsFields.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } } enable_buttons(); } void Dialog_Layout_Export::on_button_delete() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { m_model_fields->erase(iter); m_modified = true; } } enable_buttons(); } void Dialog_Layout_Export::on_cell_data_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; //Indicate that it's a field in another table. sharedptr item = row[m_ColumnsFields.m_col_layout_item]; //Names can never be edited. renderer_text->property_markup() = item->get_layout_display_name(); } } } void Dialog_Layout_Export::on_button_edit_field() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr field = row[m_ColumnsFields.m_col_layout_item]; //Get the chosen field: sharedptr field_chosen = offer_field_list_select_one_field(field, m_table_name, this); if(field_chosen) { //Set the field details in the layout treeview: row[m_ColumnsFields.m_col_layout_item] = field; //Scroll to, and select, the new row: /* Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); treeview_fill_sequences(m_model_fields, m_ColumnsFields.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. */ } } } } } //namespace Glom glom-1.22.4/glom/mode_design/layout/dialog_layout.h0000644000175000017500000000630512234252646023533 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_LAYOUT_H #define GLOM_MODE_DESIGN_DIALOG_LAYOUT_H #include #include #include #include #include namespace Glom { class Dialog_Layout : public Gtk::Dialog, public Base_DB //Give it access to the document, and to the database utilities { public: Dialog_Layout(BaseObjectType* cobject, const Glib::RefPtr& builder, bool with_table_title = true); virtual ~Dialog_Layout(); virtual bool get_modified() const; /** * @param layout_name "list" or "details" * @param layout_platform As in the document. Empty or "maemo". * @param document The document, so that the dialog can load the previous layout, and save changes. * @param table_name The table name. * @param table_fields: The actual fields in the table, in case the document does not yet know about them all. */ virtual void init(const Glib::ustring& layout_name, const Glib::ustring& layout_platform, Document* document, const Glib::ustring& table_name, const type_vecConstLayoutFields& table_fields); protected: virtual void treeview_fill_sequences(const Glib::RefPtr model, const Gtk::TreeModelColumn& sequence_column); virtual void enable_buttons(); virtual void save_to_document(); void move_treeview_selection_down(Gtk::TreeView* treeview, const Gtk::TreeModelColumn& sequence_column); void move_treeview_selection_up(Gtk::TreeView* treeview, const Gtk::TreeModelColumn& sequence_column); //signal handlers: //TODO: Do these need to be virtual? virtual void on_treemodel_row_changed(const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter); virtual void on_entry_table_title_changed(); virtual void on_button_close(); void make_sensitivity_depend_on_toggle_button(Gtk::ToggleButton& toggle_button, Gtk::Widget& widget); void on_sensitivity_toggle_button(Gtk::ToggleButton* toggle_button, Gtk::Widget* widget); Gtk::Entry* m_entry_table_title; Gtk::Label* m_label_table_title; Glib::ustring m_table_name; Glib::ustring m_layout_name, m_layout_platform; //As in the document. //Whether the layout is for a view that allows editing. //If so, various editing options will be available in the formatting. bool m_editable_layout; bool m_modified; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_LAYOUT_H glom-1.22.4/glom/mode_design/layout/dialog_choose_relationship.cc0000644000175000017500000001035712234252646026417 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_choose_relationship.h" //#include #include namespace Glom { const char* Dialog_ChooseRelationship::glade_id("dialog_choose_relationship"); const bool Dialog_ChooseRelationship::glade_developer(true); Dialog_ChooseRelationship::Dialog_ChooseRelationship() : m_label_table_name(0), m_button_select(0), m_treeview(0), m_document(0) { } Dialog_ChooseRelationship::Dialog_ChooseRelationship(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_label_table_name(0), m_button_select(0), m_treeview(0), m_document(0) { builder->get_widget("button_select", m_button_select); builder->get_widget("label_table_name", m_label_table_name); builder->get_widget("treeview_relationships", m_treeview); if(m_treeview) { m_model = Gtk::ListStore::create(m_ColumnsRelationships); m_treeview->set_model(m_model); m_treeview->append_column( _("Name"), m_ColumnsRelationships.m_col_name ); //m_treeview->append_column( _("Title"), m_ColumnsRelationships.m_col_title ); } show_all_children(); } Dialog_ChooseRelationship::~Dialog_ChooseRelationship() { } void Dialog_ChooseRelationship::set_document(Document* document, const Glib::ustring& table_name) { m_document = document; m_table_name = table_name; //Update the tree models from the document if(document) { //Set the table name and title: m_label_table_name->set_text(table_name); //TODO: Show table title here too. //Fill the treeview: m_model->clear(); Document::type_vec_relationships vecRelationships = document->get_relationships(table_name); for(Document::type_vec_relationships::const_iterator iter = vecRelationships.begin(); iter != vecRelationships.end(); ++iter) { Gtk::TreeModel::iterator iterRow = m_model->append(); Gtk::TreeModel::Row row = *iterRow; sharedptr relationship = *iter; if(relationship) row[m_ColumnsRelationships.m_col_name] = glom_get_sharedptr_name(relationship); //row[m_ColumnsRelationships.m_col_title] = item_get_title(iter); row[m_ColumnsRelationships.m_col_relationship] = relationship; } } } void Dialog_ChooseRelationship::select_item(const sharedptr& relationship) { Glib::RefPtr refTreeSelection = m_treeview->get_selection(); if(!refTreeSelection) return; //Should never happen. if(!relationship) refTreeSelection->unselect_all(); else { //Find any items with the same name: for(Gtk::TreeModel::iterator iter = m_model->children().begin(); iter != m_model->children().end(); ++iter) { const Glib::ustring relationship_name = glom_get_sharedptr_name(relationship); Gtk::TreeModel::Row row = *iter; sharedptr relationship_item = row[m_ColumnsRelationships.m_col_relationship]; if(glom_get_sharedptr_name(relationship_item) == relationship_name) { //Select the item: refTreeSelection->select(iter); } } } } sharedptr Dialog_ChooseRelationship::get_relationship_chosen() const { sharedptr result; Glib::RefPtr refTreeSelection = m_treeview->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; result = row[m_ColumnsRelationships.m_col_relationship]; } } return result; } } //namespace Glom glom-1.22.4/glom/mode_design/layout/combobox_fields.cc0000644000175000017500000001531312234252646024172 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include namespace Glom { ComboBox_Fields::ComboBox_Fields(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::ComboBox(cobject), m_renderer_title(0) { m_model = Gtk::TreeStore::create(m_model_columns); set_model(m_model); //Add name column: //m_renderer_name = Gtk::manage(new Gtk::CellRendererText()); //pack_start(*m_renderer_name); //set_cell_data_func(*m_renderer_name, sigc::mem_fun(*this, &ComboBox_Fields::on_cell_data_name)); //Add title column: m_renderer_title = Gtk::manage(new Gtk::CellRendererText()); pack_start(*m_renderer_title); set_cell_data_func(*m_renderer_title, sigc::mem_fun(*this, &ComboBox_Fields::on_cell_data_title)); set_row_separator_func(sigc::mem_fun(*this, &ComboBox_Fields::on_row_separator)); } ComboBox_Fields::~ComboBox_Fields() { } sharedptr ComboBox_Fields::get_selected_field() const { Gtk::TreeModel::iterator iter = get_active(); if(iter) { Gtk::TreeModel::Row row = *iter; return row[m_model_columns.m_field]; } else return sharedptr(); } Glib::ustring ComboBox_Fields::get_selected_field_name() const { sharedptr field = get_selected_field(); return glom_get_sharedptr_name(field); } void ComboBox_Fields::set_selected_field(const sharedptr& field) { if(field) set_selected_field(field->get_name()); else set_selected_field(Glib::ustring()); } void ComboBox_Fields::set_selected_field(const Glib::ustring& field_name) { //Look for the row with this text, and activate it: Glib::RefPtr model = get_model(); if(model) { for(Gtk::TreeModel::iterator iter = model->children().begin(); iter != model->children().end(); ++iter) { Gtk::TreeModel::Row row = *iter; sharedptr field = row[m_model_columns.m_field]; const Glib::ustring this_name = glom_get_sharedptr_name(field); //(An empty name means Select the parent table item.) if(this_name == field_name) { set_active(iter); return; //success } } } //Not found, so mark it as blank: //std::cerr << G_STRFUNC << ": field not found in list: " << field_name << std::endl; //Avoid calling unset_active() if nothing is selected, because it triggers the changed signal unnecessarily. if(get_active()) //If something is active (selected). unset_active(); } void ComboBox_Fields::set_fields(Document* document, const Glib::ustring parent_table_name) { if(!document) return; const Document::type_vec_fields fields = document->get_table_fields(parent_table_name); if(!m_model) return; m_model->clear(); //Fill the model: for(type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { Gtk::TreeModel::iterator tree_iter = m_model->append(); Gtk::TreeModel::Row row = *tree_iter; sharedptr rel = *iter; row[m_model_columns.m_field] = rel; row[m_model_columns.m_separator] = false; } } void ComboBox_Fields::set_fields(Document* document, const Glib::ustring parent_table_name, Field::glom_field_type field_type) { if(!document) return; const Document::type_vec_fields fields = document->get_table_fields(parent_table_name); if(!m_model) return; m_model->clear(); //Fill the model: for(type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr rel = *iter; if(rel && (rel->get_glom_type() == field_type)) { std::cout << "DEBUG: ComboBox_Fields::set_fields() 1" << std::endl; Gtk::TreeModel::iterator tree_iter = m_model->append(); std::cout << "DEBUG: ComboBox_Fields::set_fields() 2" << std::endl; Gtk::TreeModel::Row row = *tree_iter; row[m_model_columns.m_field] = rel; row[m_model_columns.m_separator] = false; } } } void ComboBox_Fields::set_fields(const type_vec_fields& fields, bool with_none_item) { if(!m_model) return; m_model->clear(); if(with_none_item) { //Add a special "None" item, so the user can clear the GtkComboBox: Gtk::TreeModel::iterator tree_iter = m_model->append(); Gtk::TreeModel::Row row = *tree_iter; row[m_model_columns.m_field] = sharedptr(); row[m_model_columns.m_separator] = false; //Add a separator after the "None" item: tree_iter = m_model->append(); row = *tree_iter; row[m_model_columns.m_field] = sharedptr(); row[m_model_columns.m_separator] = true; } //Fill the model: for(type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { Gtk::TreeModel::iterator tree_iter = m_model->append(); Gtk::TreeModel::Row row = *tree_iter; row[m_model_columns.m_field] = *iter; row[m_model_columns.m_separator] = false; } } void ComboBox_Fields::on_cell_data_title(const Gtk::TreeModel::const_iterator& iter) { Gtk::TreeModel::Row row = *iter; sharedptr field = row[m_model_columns.m_field]; if(field) { m_renderer_title->set_property("text", item_get_title_or_name(field)); } else { // A special "None" item, allowing the user to do the equivalent of clearing the combobox, // which is not normally possible with the GtkComboBox UI: //set_property() does not work with a const gchar*, so we explicitly create a ustring. //otherwise we get this warning: //" unable to set property `text' of type `gchararray' from value of type `glibmm__CustomPointer_Pc' " //TODO: Add a template specialization to Glib::ObjectBase::set_property() to allow this? m_renderer_title->set_property("text", Glib::ustring(_("(None)"))); } } bool ComboBox_Fields::on_row_separator(const Glib::RefPtr& /* model */, const Gtk::TreeModel::const_iterator& iter) { Gtk::TreeModel::Row row = *iter; const bool separator = row[m_model_columns.m_separator]; return separator; } } //namespace Glom glom-1.22.4/glom/mode_design/layout/dialog_layout.cc0000644000175000017500000001416712234252646023676 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include //#include #include namespace Glom { Dialog_Layout::Dialog_Layout(BaseObjectType* cobject, const Glib::RefPtr& builder, bool with_table_title) : Gtk::Dialog(cobject), m_entry_table_title(0), m_label_table_title(0), m_editable_layout(true), m_modified(false) { Gtk::Button* button = 0; builder->get_widget("button_close", button); button->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout::on_button_close) ); if(with_table_title) { builder->get_widget("entry_table_title", m_entry_table_title); m_entry_table_title->signal_changed().connect( sigc::mem_fun(*this, &Dialog_Layout::on_entry_table_title_changed) ); builder->get_widget("label_title", m_label_table_title); } show_all_children(); } Dialog_Layout::~Dialog_Layout() { } void Dialog_Layout::init(const Glib::ustring& layout_name, const Glib::ustring& layout_platform, Document* /* document */, const Glib::ustring& table_name, const type_vecConstLayoutFields& /* table_fields */) { m_modified = false; m_layout_name = layout_name; m_layout_platform = layout_platform; m_table_name = table_name; m_modified = false; } void Dialog_Layout::move_treeview_selection_up(Gtk::TreeView* treeview, const Gtk::TreeModelColumn& sequence_column) { Glib::RefPtr refSelection = treeview->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { Glib::RefPtr model = treeview->get_model(); if(iter != model->children().begin()) //If it is not the first one. { Gtk::TreeModel::iterator iterBefore = iter; --iterBefore; Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::Row rowBefore = **iterBefore; //Swap the sequence values, so that the one before will be after: guint tempBefore = rowBefore[sequence_column]; guint tempRow = row[sequence_column]; rowBefore[sequence_column] = tempRow; row[sequence_column] = tempBefore; //Because the model is sorted, the visual order should now be swapped. m_modified = true; } } } enable_buttons(); } void Dialog_Layout::move_treeview_selection_down(Gtk::TreeView* treeview, const Gtk::TreeModelColumn& sequence_column) { Glib::RefPtr refSelection = treeview->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { Gtk::TreeModel::iterator iterNext = iter; iterNext++; Glib::RefPtr model = treeview->get_model(); if(iterNext != model->children().end()) //If it is not the last one. { Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::Row rowNext = *iterNext; //Swap the sequence values, so that the one before will be after: guint tempNext = rowNext[sequence_column]; guint tempRow = row[sequence_column]; rowNext[sequence_column] = tempRow; row[sequence_column] = tempNext; //Because the model is sorted, the visual order should now be swapped. m_modified = true; } } } enable_buttons(); } void Dialog_Layout::on_button_close() { save_to_document(); hide(); } void Dialog_Layout::save_to_document() { } void Dialog_Layout::treeview_fill_sequences(const Glib::RefPtr model, const Gtk::TreeModelColumn& sequence_column) { //Get the highest sequence number: guint max_sequence = 1; //0 means no sequence. for(Gtk::TreeModel::iterator iter = model->children().begin(); iter != model->children().end(); ++iter) { Gtk::TreeModel::Row row = *iter; guint sequence = row[sequence_column]; max_sequence = MAX(max_sequence, sequence); } //Add sequences to any that don't have a sequence: //(0 means no sequence) guint next_sequence = max_sequence+1; //This could leave holes, of course. But we want new groups to be after the old groups. We can compact it later. for(Gtk::TreeModel::iterator iter = model->children().begin(); iter != model->children().end(); ++iter) { Gtk::TreeModel::Row row = *iter; guint sequence = row[sequence_column]; if(sequence == 0) { row[sequence_column] = next_sequence; ++next_sequence; } } } void Dialog_Layout::on_treemodel_row_changed(const Gtk::TreeModel::Path& /* path */, const Gtk::TreeModel::iterator& /* iter */) { m_modified = true; } void Dialog_Layout::on_entry_table_title_changed() { m_modified = true; } void Dialog_Layout::enable_buttons() { } bool Dialog_Layout::get_modified() const { return m_modified; } void Dialog_Layout::make_sensitivity_depend_on_toggle_button(Gtk::ToggleButton& toggle_button, Gtk::Widget& widget) { toggle_button.signal_toggled().connect( sigc::bind( sigc::mem_fun(*this, &Dialog_Layout::on_sensitivity_toggle_button), &toggle_button, &widget) ); //Call the handler once, so that the initial state is set: on_sensitivity_toggle_button(&toggle_button, &widget); } void Dialog_Layout::on_sensitivity_toggle_button(Gtk::ToggleButton* toggle_button, Gtk::Widget* widget) { if(!toggle_button || !widget) return; const bool sensitivity = toggle_button->get_active(); widget->set_sensitive(sensitivity); m_modified = true; } } //namespace Glom glom-1.22.4/glom/mode_design/layout/combobox_fields.h0000644000175000017500000000640312234252646024034 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_COMBOBOX_FIELDS_H #define GLOM_MODE_DESIGN_COMBOBOX_FIELDS_H #include #include #include #include #include #include namespace Glom { class ComboBox_Fields : public Gtk::ComboBox { public: ComboBox_Fields(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~ComboBox_Fields(); typedef std::vector< sharedptr > type_vec_fields; /** Fill the combo box with fields. * @param fields The fields to show in the combo box. * @param with_none_type Whether to show an extra None item. */ void set_fields(const type_vec_fields& fields, bool with_none_item = false); /** Fill the combo box with fields. * @param document The Document, used to get the list of fields. * @param parent_table_name The table whose fields should be shown. * @param field_type Show only fields of this type. */ void set_fields(Document* document, const Glib::ustring parent_table_name); /** Fill the combo box with fields, but only fields of a certain type. * @param document The Document, used to get the list of fields. * @param parent_table_name The table whose fields should be shown. * @param field_type Show only fields of this type. */ void set_fields(Document* document, const Glib::ustring parent_table_name, Field::glom_field_type field_type); void set_selected_field(const sharedptr& field); void set_selected_field(const Glib::ustring& field_name); sharedptr get_selected_field() const; Glib::ustring get_selected_field_name() const; private: //void on_cell_data_name(const Gtk::TreeModel::const_iterator& iter); void on_cell_data_title(const Gtk::TreeModel::const_iterator& iter); bool on_row_separator(const Glib::RefPtr& model, const Gtk::TreeModel::const_iterator& iter); //Tree model columns: //These columns are used by the model that is created by the default constructor class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_field); add(m_separator); } Gtk::TreeModelColumn< sharedptr > m_field; Gtk::TreeModelColumn m_separator; }; ModelColumns m_model_columns; Glib::RefPtr m_model; //Gtk::CellRendererText* m_renderer_name; Gtk::CellRendererText* m_renderer_title; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_COMBOBOX_FIELDS_H glom-1.22.4/glom/mode_design/layout/combobox_relationship.h0000644000175000017500000000723412234252646025272 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_COMBOBOX_RELATIONSHIP_H #define GLOM_MODE_DESIGN_COMBOBOX_RELATIONSHIP_H #include #include #include #include #include #include namespace Glom { class ComboBox_Relationship : public Gtk::ComboBox { public: ComboBox_Relationship(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~ComboBox_Relationship(); typedef std::vector< sharedptr > type_vec_relationships; void set_relationships(const type_vec_relationships& relationships, const Glib::ustring& parent_table_name = Glib::ustring(), const Glib::ustring& parent_table_title = Glib::ustring()); void set_relationships(Document* document, const Glib::ustring parent_table_name, bool show_related_relationships = false, bool show_parent_table = true); void set_selected_relationship(const sharedptr& relationship); void set_selected_relationship(const sharedptr& relationship, const sharedptr& related_relationship); void set_selected_relationship(const Glib::ustring& name, const Glib::ustring& related_relationship_name = Glib::ustring()); sharedptr get_selected_relationship() const; sharedptr get_selected_relationship(sharedptr& related_relatioship) const; //Sometimes we want to show the parent table as an option too, instead of just relationships: ///Whether the parent table should be in the list. void set_display_parent_table(const Glib::ustring& table_name, const Glib::ustring& table_title = Glib::ustring()); ///Select the parent table. void set_selected_parent_table(const Glib::ustring& table_name, const Glib::ustring& table_title = Glib::ustring()); private: //void on_cell_data_name(const Gtk::TreeModel::const_iterator& iter); void on_cell_data_title(const Gtk::TreeModel::const_iterator& iter); void on_cell_data_fromfield(const Gtk::TreeModel::const_iterator& iter); bool on_row_separator(const Glib::RefPtr& model, const Gtk::TreeModel::const_iterator& iter); bool get_has_parent_table() const; //Tree model columns: //These columns are used by the model that is created by the default constructor class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_relationship); add(m_separator); } Gtk::TreeModelColumn< sharedptr > m_relationship; Gtk::TreeModelColumn m_separator; }; ModelColumns m_model_columns; Glib::RefPtr m_model; //Gtk::CellRendererText* m_renderer_name; Gtk::CellRendererText* m_renderer_title; Gtk::CellRendererText* m_renderer_fromfield; Glib::ustring m_extra_table_name, m_extra_table_title; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_COMBOBOX_RELATIONSHIP_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/0000755000175000017500000000000012235000127024541 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.h0000644000175000017500000000472212234252646030734 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_FIELD_LAYOUT_H #define GLOM_MODE_DESIGN_DIALOG_FIELD_LAYOUT_H #include #include #include #include #include #include #include #include "box_formatting.h" namespace Glom { class Dialog_FieldLayout : public Gtk::Dialog, public View_Composite_Glom //Give it access to the document. { public: static const char* glade_id; static const bool glade_developer; Dialog_FieldLayout(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_FieldLayout(); /** * @param document The document, so that the dialog can load the previous layout, and save changes. * @param field The starting field information. * @param table_name The field's table. */ virtual void set_field(const sharedptr& field, const Glib::ustring& table_name, bool show_editable_options = true); sharedptr get_field_chosen() const; private: void on_radiobutton_custom_formatting(); void enforce_constraints(); Gtk::Label* m_label_field_name; Gtk::CheckButton* m_checkbutton_editable; Gtk::CheckButton* m_radiobutton_title_default; Gtk::Label* m_label_title_default; Gtk::CheckButton* m_radiobutton_title_custom; Gtk::Entry* m_entry_title_custom; Gtk::Box* m_box_formatting_placeholder; Gtk::RadioButton* m_radiobutton_custom_formatting; Box_Formatting* m_box_formatting; mutable sharedptr m_layout_item; Glib::ustring m_table_name; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_FIELD_LAYOUT_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/combo_summarytype.cc0000644000175000017500000000540312234252646030646 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "combo_summarytype.h" #include #include namespace Glom { Combo_SummaryType::Combo_SummaryType(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::ComboBox(cobject) { m_model = Gtk::ListStore::create(m_model_columns); //Fill the model: Gtk::TreeModel::iterator iter = m_model->append(); (*iter)[m_model_columns.m_summary_type] = LayoutItem_FieldSummary::TYPE_SUM; (*iter)[m_model_columns.m_name] = LayoutItem_FieldSummary::get_summary_type_name(LayoutItem_FieldSummary::TYPE_SUM); iter = m_model->append(); (*iter)[m_model_columns.m_summary_type] = LayoutItem_FieldSummary::TYPE_AVERAGE; (*iter)[m_model_columns.m_name] = LayoutItem_FieldSummary::get_summary_type_name(LayoutItem_FieldSummary::TYPE_AVERAGE); iter = m_model->append(); (*iter)[m_model_columns.m_summary_type] = LayoutItem_FieldSummary::TYPE_COUNT; (*iter)[m_model_columns.m_name] = LayoutItem_FieldSummary::get_summary_type_name(LayoutItem_FieldSummary::TYPE_COUNT); set_model(m_model); //Show this column. pack_start(m_model_columns.m_name); } Combo_SummaryType::~Combo_SummaryType() { } void Combo_SummaryType::set_summary_type(LayoutItem_FieldSummary::summaryType summary_type) { for(Gtk::TreeModel::iterator iter = m_model->children().begin(); iter != m_model->children().end(); ++iter) { const LayoutItem_FieldSummary::summaryType this_value = (*iter)[m_model_columns.m_summary_type]; if(this_value == summary_type) { set_active(iter); return; //success } } std::cerr << G_STRFUNC << ": no item found" << std::endl; //Not found, so mark it as blank: unset_active(); } LayoutItem_FieldSummary::summaryType Combo_SummaryType::get_summary_type() const { //Get the active row: Gtk::TreeModel::iterator active_row = get_active(); if(active_row) { Gtk::TreeModel::Row row = *active_row; return row[m_model_columns.m_summary_type]; } return LayoutItem_FieldSummary::TYPE_INVALID; } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.cc0000644000175000017500000000471212234252646031251 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_field_summary.h" #include #include namespace Glom { const char* Dialog_FieldSummary::glade_id("dialog_field_summary"); const bool Dialog_FieldSummary::glade_developer(true); Dialog_FieldSummary::Dialog_FieldSummary(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_label_field(0), m_combo_summarytype(0), m_button_field(0) { builder->get_widget("label_field", m_label_field); builder->get_widget_derived("combobox_summarytype", m_combo_summarytype); builder->get_widget("button_field", m_button_field); //Connect signals: m_button_field->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_FieldSummary::on_button_field)); show_all_children(); } Dialog_FieldSummary::~Dialog_FieldSummary() { } void Dialog_FieldSummary::set_item(const sharedptr& item, const Glib::ustring& table_name) { m_layout_item = glom_sharedptr_clone(item); m_table_name = table_name; m_label_field->set_text( item->get_layout_display_name_field() ); m_combo_summarytype->set_summary_type( item->get_summary_type() ); } sharedptr Dialog_FieldSummary::get_item() const { sharedptr result = glom_sharedptr_clone(m_layout_item); result->set_summary_type( m_combo_summarytype->get_summary_type() ); return result; } void Dialog_FieldSummary::on_button_field() { sharedptr field = offer_field_list_select_one_field(m_layout_item, m_table_name, this); if(field) { m_layout_item->set_field(field); set_item(m_layout_item, m_table_name); //Update the UI. } } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.h0000644000175000017500000000360312234252646030424 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_TEXTOBJECT_H #define GLOM_MODE_DESIGN_DIALOG_TEXTOBJECT_H #include #include #include #include #include #include namespace Glom { class Dialog_TextObject : public Gtk::Dialog, public Base_DB //Give this class access to the current document, and to some utility methods. { public: static const char* glade_id; static const bool glade_developer; Dialog_TextObject(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_TextObject(); void set_textobject(const sharedptr& textobject, const Glib::ustring& table_name, bool show_title = true); sharedptr get_textobject() const; void get_textobject(sharedptr& textobject) const; private: Gtk::Box* m_box_title; Gtk::Entry* m_entry_title; Gtk::TextView* m_text_view; sharedptr m_textobject; Glib::ustring m_table_name; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_TEXTOBJECT_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.h0000644000175000017500000000551212234252646030414 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_FIELDSLIST_H #define GLOM_MODE_DESIGN_DIALOG_FIELDSLIST_H #include #include #include namespace Glom { /** This dialog allows the user to specify a list of non-editable fields, * with field formatting. * For instance, for related choice lists, or for sort criteria. */ class Dialog_FieldsList : public Dialog_Layout //It has some useful stuff { public: static const char* glade_id; static const bool glade_developer; Dialog_FieldsList(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_FieldsList(); void set_fields(const Glib::ustring& table_name, const LayoutGroup::type_list_items& table_fields); LayoutGroup::type_list_items get_fields() const; private: //Enable/disable buttons, depending on treeview selection: virtual void enable_buttons(); //signal handlers: void on_button_field_up(); void on_button_field_down(); void on_button_add_field(); void on_button_delete(); void on_button_edit_field(); void on_button_formatting(); void on_treeview_fields_selection_changed(); void on_cell_data_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); Gtk::TreeModel::iterator append_appropriate_row(); //Tree model columns: class ModelColumns_Fields : public Gtk::TreeModel::ColumnRecord { public: ModelColumns_Fields() { add(m_col_layout_item); add(m_col_sequence); } Gtk::TreeModelColumn< sharedptr > m_col_layout_item; Gtk::TreeModelColumn m_col_sequence; }; ModelColumns_Fields m_ColumnsFields; //Tree model columns: Gtk::TreeView* m_treeview_fields; Gtk::Button* m_button_field_up; Gtk::Button* m_button_field_down; Gtk::Button* m_button_field_add; Gtk::Button* m_button_field_delete; Gtk::Button* m_button_field_edit; Gtk::Button* m_button_field_formatting; Glib::RefPtr m_model_fields; Gtk::Label* m_label_table_name; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_FIELDSLIST_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.cc0000644000175000017500000002460612234252646030573 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_sortfields.h" #include "dialog_field_layout.h" //#include #include namespace Glom { const char* Dialog_SortFields::glade_id("dialog_sort_fields"); const bool Dialog_SortFields::glade_developer(true); Dialog_SortFields::Dialog_SortFields(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Layout(cobject, builder, false /* means no table title */), m_treeview_fields(0), m_button_field_up(0), m_button_field_down(0), m_button_field_add(0), m_button_field_delete(0), m_button_field_edit(0), m_label_table_name(0) { builder->get_widget("label_table_name", m_label_table_name); builder->get_widget("treeview_fields", m_treeview_fields); if(m_treeview_fields) { m_model_fields = Gtk::ListStore::create(m_ColumnsFields); m_treeview_fields->set_model(m_model_fields); // Append the View columns: Gtk::TreeView::Column* column_name = Gtk::manage( new Gtk::TreeView::Column(_("Name")) ); m_treeview_fields->append_column(*column_name); Gtk::CellRendererText* renderer_name = Gtk::manage(new Gtk::CellRendererText); column_name->pack_start(*renderer_name); column_name->set_cell_data_func(*renderer_name, sigc::mem_fun(*this, &Dialog_SortFields::on_cell_data_name)); m_treeview_fields->append_column_editable(_("Ascending"), m_ColumnsFields.m_col_ascending); //Sort by sequence, so we can change the order by changing the values in the hidden sequence column. m_model_fields->set_sort_column(m_ColumnsFields.m_col_sequence, Gtk::SORT_ASCENDING); //Respond to changes of selection: Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_SortFields::on_treeview_fields_selection_changed) ); } m_model_fields->signal_row_changed().connect( sigc::mem_fun(*this, &Dialog_SortFields::on_treemodel_row_changed) ); } builder->get_widget("button_field_up", m_button_field_up); m_button_field_up->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_SortFields::on_button_field_up) ); builder->get_widget("button_field_down", m_button_field_down); m_button_field_down->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_SortFields::on_button_field_down) ); builder->get_widget("button_field_delete", m_button_field_delete); m_button_field_delete->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_SortFields::on_button_delete) ); builder->get_widget("button_field_add", m_button_field_add); m_button_field_add->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_SortFields::on_button_add_field) ); builder->get_widget("button_field_edit", m_button_field_edit); m_button_field_edit->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_SortFields::on_button_edit_field) ); show_all_children(); } Dialog_SortFields::~Dialog_SortFields() { } void Dialog_SortFields::set_fields(const Glib::ustring& table_name, const LayoutItem_GroupBy::type_list_sort_fields& fields) { m_modified = false; m_table_name = table_name; Document* document = get_document(); //Update the tree models from the document if(document) { //Set the table name and title: m_label_table_name->set_text(table_name); //Show the field layout m_model_fields->clear(); guint field_sequence = 0; for(LayoutItem_GroupBy::type_list_sort_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr item = sharedptr::cast_dynamic(iter->first); Gtk::TreeModel::iterator iterTree = m_model_fields->append(); Gtk::TreeModel::Row row = *iterTree; row[m_ColumnsFields.m_col_layout_item] = item; row[m_ColumnsFields.m_col_ascending] = iter->second; row[m_ColumnsFields.m_col_sequence] = field_sequence; ++field_sequence; } //treeview_fill_sequences(m_model_fields, m_ColumnsFields.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } m_modified = false; } void Dialog_SortFields::enable_buttons() { //Fields: Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { //Disable Up if It can't go any higher. bool enable_up = true; if(iter == m_model_fields->children().begin()) enable_up = false; //It can't go any higher. m_button_field_up->set_sensitive(enable_up); //Disable Down if It can't go any lower. Gtk::TreeModel::iterator iterNext = iter; iterNext++; bool enable_down = true; if(iterNext == m_model_fields->children().end()) enable_down = false; m_button_field_down->set_sensitive(enable_down); m_button_field_delete->set_sensitive(true); } else { //Disable all buttons that act on a selection: m_button_field_down->set_sensitive(false); m_button_field_up->set_sensitive(false); m_button_field_delete->set_sensitive(false); } } } void Dialog_SortFields::on_button_field_up() { move_treeview_selection_up(m_treeview_fields, m_ColumnsFields.m_col_sequence); } void Dialog_SortFields::on_button_field_down() { move_treeview_selection_down(m_treeview_fields, m_ColumnsFields.m_col_sequence); } LayoutItem_GroupBy::type_list_sort_fields Dialog_SortFields::get_fields() const { LayoutItem_GroupBy::type_list_sort_fields result; guint field_sequence = 1; //0 means no sequence for(Gtk::TreeModel::iterator iterFields = m_model_fields->children().begin(); iterFields != m_model_fields->children().end(); ++iterFields) { Gtk::TreeModel::Row row = *iterFields; sharedptr item = row[m_ColumnsFields.m_col_layout_item]; const Glib::ustring field_name = item->get_name(); if(!field_name.empty()) { sharedptr field_copy = glom_sharedptr_clone(item); const bool ascending = row[m_ColumnsFields.m_col_ascending]; result.push_back( LayoutItem_GroupBy::type_pair_sort_field(field_copy, ascending) ); ++field_sequence; } } return result; } void Dialog_SortFields::on_treeview_fields_selection_changed() { enable_buttons(); } void Dialog_SortFields::on_button_add_field() { //Get the chosen fields: type_list_field_items fields_list = offer_field_list(m_table_name, this); for(type_list_field_items::iterator iter_chosen = fields_list.begin(); iter_chosen != fields_list.end(); ++iter_chosen) { sharedptr field = *iter_chosen; if(!field) continue; //Add the field details to the layout treeview: Gtk::TreeModel::iterator iter = m_model_fields->append(); if(iter) { Gtk::TreeModel::Row row = *iter; row[m_ColumnsFields.m_col_layout_item] = field; row[m_ColumnsFields.m_col_ascending] = true; //Default to this so that alphabetical searches go from A to Z by default. //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); treeview_fill_sequences(m_model_fields, m_ColumnsFields.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } } } void Dialog_SortFields::on_button_delete() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { m_model_fields->erase(iter); m_modified = true; } } } void Dialog_SortFields::on_cell_data_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr item = row[m_ColumnsFields.m_col_layout_item]; //TODO_performance: Reduce copying. renderer_text->property_markup() = item->get_layout_display_name(); renderer_text->property_editable() = false; //Names can never be edited. } } } void Dialog_SortFields::on_button_edit_field() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr field = row[m_ColumnsFields.m_col_layout_item]; //Get the chosen field: sharedptr field_chosen = offer_field_list_select_one_field(field, m_table_name, this); if(field_chosen) //Set the field details in the layout treeview: row[m_ColumnsFields.m_col_layout_item] = field_chosen; //Scroll to, and select, the new row: /* Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); treeview_fill_sequences(m_model_fields, m_ColumnsFields.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. */ } } } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.h0000644000175000017500000000365512234252646030531 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_IMAGEOBJECT_H #define GLOM_MODE_DESIGN_DIALOG_IMAGEOBJECT_H #include #include #include #include #include #include #include namespace Glom { class Dialog_ImageObject : public Gtk::Dialog, public Base_DB //Give this class access to the current document, and to some utility methods. { public: static const char* glade_id; static const bool glade_developer; Dialog_ImageObject(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ImageObject(); void set_imageobject(const sharedptr& imageobject, const Glib::ustring& table_name, bool show_title = true); sharedptr get_imageobject() const; private: void on_button_choose(); Gtk::Box* m_box_title; Gtk::Entry* m_entry_title; ImageGlom* m_image; Gtk::Button* m_button_choose_image; sharedptr m_imageobject; Glib::ustring m_table_name; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_IMAGEOBJECT_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.h0000644000175000017500000000502712234252646030101 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_LAYOUT_ITEM_DIALOGS_GROUP_BY_H #define GLOM_LAYOUT_ITEM_DIALOGS_GROUP_BY_H #include #include #include #include #include #include #include #include "dialog_fieldslist.h" #include "dialog_sortfields.h" #include "comboentry_borderwidth.h" namespace Glom { class Dialog_GroupBy : public Gtk::Dialog, public Base_DB { public: static const char* glade_id; static const bool glade_developer; Dialog_GroupBy(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_GroupBy(); /** * @param item The starting information. * @param table_name The item's table. */ virtual void set_item(const sharedptr& item, const Glib::ustring& table_name); sharedptr get_item() const; private: //Signal handlers: void on_button_field_group_by(); void on_button_formatting_group_by(); void on_button_field_sort_by(); void on_button_secondary_fields(); void on_dialog_secondary_fields_hide(); void update_labels(); Gtk::Label* m_label_group_by; Gtk::Label* m_label_sort_by; Gtk::Label* m_label_secondary_fields; Gtk::Button* m_button_field_group_by; Gtk::Button* m_button_formatting_group_by; Gtk::Button* m_button_field_sort_by; Gtk::Button* m_button_secondary_fields; ComboEntry_BorderWidth* m_comboboxentry_border_width; Dialog_FieldsList* m_dialog_choose_secondary_fields; Dialog_SortFields* m_dialog_choose_sort_fields; mutable sharedptr m_layout_item; Glib::ustring m_table_name; }; } //namespace Glom #endif //GLOM_LAYOUT_ITEM_DIALOGS_GROUP_BY_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/combo_summarytype.h0000644000175000017500000000360012234252646030505 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_COMBO_SUMMARYTYPE_H #define GLOM_MODE_DESIGN_COMBO_SUMMARYTYPE_H #include #include #include #include namespace Glom { class Combo_SummaryType : public Gtk::ComboBox { public: Combo_SummaryType(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Combo_SummaryType(); virtual void set_summary_type(LayoutItem_FieldSummary::summaryType summary_type); virtual LayoutItem_FieldSummary::summaryType get_summary_type() const; private: //Tree model columns: //These columns are used by the model that is created by the default constructor class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_summary_type); add(m_name); } Gtk::TreeModelColumn m_summary_type; Gtk::TreeModelColumn m_name; }; ModelColumns m_model_columns; Glib::RefPtr m_model; }; } //namespace Glom #endif //GLOM_MODE_DESIGN_COMBO_SUMMARYTYPE_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.cc0000644000175000017500000001174612234776240031077 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_field_layout.h" #include #include #include #include namespace Glom { const char* Dialog_FieldLayout::glade_id("dialog_layout_field_properties"); const bool Dialog_FieldLayout::glade_developer(true); Dialog_FieldLayout::Dialog_FieldLayout(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_label_field_name(0), m_checkbutton_editable(0), m_radiobutton_title_default(0), m_label_title_default(0), m_radiobutton_title_custom(0), m_entry_title_custom(0), m_box_formatting_placeholder(0), m_radiobutton_custom_formatting(0), m_box_formatting(0) { builder->get_widget("label_field_name", m_label_field_name); builder->get_widget("checkbutton_editable", m_checkbutton_editable); builder->get_widget("radiobutton_use_title_default", m_radiobutton_title_default); builder->get_widget("label_title_default", m_label_title_default); builder->get_widget("radiobutton_use_title_custom", m_radiobutton_title_custom); builder->get_widget("entry_title_custom", m_entry_title_custom); //Get the place to put the Formatting stuff: builder->get_widget("radiobutton_use_custom", m_radiobutton_custom_formatting); builder->get_widget("box_formatting_placeholder", m_box_formatting_placeholder); //Get the formatting stuff: Utils::get_glade_child_widget_derived_with_warning(m_box_formatting); if(m_box_formatting) { m_box_formatting_placeholder->pack_start(*m_box_formatting); add_view(m_box_formatting); } m_radiobutton_custom_formatting->signal_toggled().connect(sigc::mem_fun(*this, &Dialog_FieldLayout::on_radiobutton_custom_formatting)); show_all_children(); } Dialog_FieldLayout::~Dialog_FieldLayout() { remove_view(m_box_formatting); } void Dialog_FieldLayout::set_field(const sharedptr& field, const Glib::ustring& table_name, bool show_editable_options) { m_layout_item = glom_sharedptr_clone(field); m_table_name = table_name; m_label_field_name->set_text( field->get_layout_display_name() ); m_checkbutton_editable->set_active( field->get_editable() ); //Calculated fields can never be edited: sharedptr field_details = field->get_full_field_details(); const bool editable_allowed = field_details && !field_details->get_has_calculation(); m_checkbutton_editable->set_sensitive(editable_allowed); if(!show_editable_options) m_checkbutton_editable->hide(); //Custom title: Glib::ustring title_custom; if(field->get_title_custom()) title_custom = item_get_title(field->get_title_custom()); m_radiobutton_title_custom->set_active( field->get_title_custom() && field->get_title_custom()->get_use_custom_title() ); m_entry_title_custom->set_text(title_custom); m_label_title_default->set_text(field->get_title_or_name_no_custom(AppWindow::get_current_locale())); //Formatting: m_radiobutton_custom_formatting->set_active( !field->get_formatting_use_default() ); m_box_formatting->set_formatting_for_field(field->m_formatting, table_name, field->get_full_field_details()); if(!show_editable_options) m_box_formatting->set_is_for_non_editable(); enforce_constraints(); } sharedptr Dialog_FieldLayout::get_field_chosen() const { m_layout_item->set_editable( m_checkbutton_editable->get_active() ); m_layout_item->set_formatting_use_default( !m_radiobutton_custom_formatting->get_active() ); m_box_formatting->get_formatting(m_layout_item->m_formatting); sharedptr title_custom = sharedptr::create(); title_custom->set_use_custom_title(m_radiobutton_title_custom->get_active()); //For instance, tell it to really use a blank title. title_custom->set_title(m_entry_title_custom->get_text(), AppWindow::get_current_locale()); m_layout_item->set_title_custom(title_custom); return glom_sharedptr_clone(m_layout_item); } void Dialog_FieldLayout::on_radiobutton_custom_formatting() { enforce_constraints(); } void Dialog_FieldLayout::enforce_constraints() { //Enable/Disable the custom formatting widgets: const bool custom = m_radiobutton_custom_formatting->get_active(); m_box_formatting->set_sensitive(custom); } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.cc0000644000175000017500000002725212234252646030557 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_fieldslist.h" #include "dialog_field_layout.h" //#include #include namespace Glom { const char* Dialog_FieldsList::glade_id("dialog_fieldslist"); const bool Dialog_FieldsList::glade_developer(true); Dialog_FieldsList::Dialog_FieldsList(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Layout(cobject, builder, false /* means no table title */), m_treeview_fields(0), m_button_field_up(0), m_button_field_down(0), m_button_field_add(0), m_button_field_delete(0), m_button_field_edit(0), m_button_field_formatting(0), m_label_table_name(0) { builder->get_widget("label_table_name", m_label_table_name); builder->get_widget("treeview_fields", m_treeview_fields); if(m_treeview_fields) { m_model_fields = Gtk::ListStore::create(m_ColumnsFields); m_treeview_fields->set_model(m_model_fields); // Append the View columns: Gtk::TreeView::Column* column_name = Gtk::manage( new Gtk::TreeView::Column(_("Name")) ); m_treeview_fields->append_column(*column_name); Gtk::CellRendererText* renderer_name = Gtk::manage(new Gtk::CellRendererText); column_name->pack_start(*renderer_name); column_name->set_cell_data_func(*renderer_name, sigc::mem_fun(*this, &Dialog_FieldsList::on_cell_data_name)); //Sort by sequence, so we can change the order by changing the values in the hidden sequence column. m_model_fields->set_sort_column(m_ColumnsFields.m_col_sequence, Gtk::SORT_ASCENDING); //Respond to changes of selection: Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_FieldsList::on_treeview_fields_selection_changed) ); } m_model_fields->signal_row_changed().connect( sigc::mem_fun(*this, &Dialog_FieldsList::on_treemodel_row_changed) ); } builder->get_widget("button_field_up", m_button_field_up); m_button_field_up->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_FieldsList::on_button_field_up) ); builder->get_widget("button_field_down", m_button_field_down); m_button_field_down->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_FieldsList::on_button_field_down) ); builder->get_widget("button_field_delete", m_button_field_delete); m_button_field_delete->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_FieldsList::on_button_delete) ); builder->get_widget("button_field_add", m_button_field_add); m_button_field_add->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_FieldsList::on_button_add_field) ); builder->get_widget("button_field_edit", m_button_field_edit); m_button_field_edit->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_FieldsList::on_button_edit_field) ); builder->get_widget("button_field_formatting", m_button_field_formatting); m_button_field_formatting->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_FieldsList::on_button_formatting) ); show_all_children(); } Dialog_FieldsList::~Dialog_FieldsList() { } void Dialog_FieldsList::set_fields(const Glib::ustring& table_name, const LayoutGroup::type_list_items& fields) { m_modified = false; m_table_name = table_name; Document* document = get_document(); //Update the tree models from the document if(document) { //Set the table name and title: m_label_table_name->set_text(table_name); //Show the field layout: m_model_fields->clear(); guint field_sequence = 0; for(LayoutGroup::type_list_items::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr item = sharedptr::cast_dynamic(*iter); if(!item) continue; Gtk::TreeModel::iterator iterTree = m_model_fields->append(); Gtk::TreeModel::Row row = *iterTree; row[m_ColumnsFields.m_col_layout_item] = item; row[m_ColumnsFields.m_col_sequence] = field_sequence; ++field_sequence; } //treeview_fill_sequences(m_model_fields, m_ColumnsFields.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } m_modified = false; } void Dialog_FieldsList::enable_buttons() { //Fields: Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { //Disable Up if It can't go any higher. bool enable_up = true; if(iter == m_model_fields->children().begin()) enable_up = false; //It can't go any higher. m_button_field_up->set_sensitive(enable_up); //Disable Down if It can't go any lower. Gtk::TreeModel::iterator iterNext = iter; iterNext++; bool enable_down = true; if(iterNext == m_model_fields->children().end()) enable_down = false; m_button_field_down->set_sensitive(enable_down); m_button_field_delete->set_sensitive(true); } else { //Disable all buttons that act on a selection: m_button_field_down->set_sensitive(false); m_button_field_up->set_sensitive(false); m_button_field_delete->set_sensitive(false); } } } void Dialog_FieldsList::on_button_field_up() { move_treeview_selection_up(m_treeview_fields, m_ColumnsFields.m_col_sequence); } void Dialog_FieldsList::on_button_field_down() { move_treeview_selection_down(m_treeview_fields, m_ColumnsFields.m_col_sequence); } LayoutGroup::type_list_items Dialog_FieldsList::get_fields() const { const Gtk::TreeModel::Children children = m_model_fields->children(); LayoutGroup::type_list_items result(children.size()); guint field_sequence = 0; for(Gtk::TreeModel::iterator iterFields = m_model_fields->children().begin(); iterFields != children.end(); ++iterFields) { Gtk::TreeModel::Row row = *iterFields; sharedptr item = row[m_ColumnsFields.m_col_layout_item]; const Glib::ustring field_name = item->get_name(); if(!field_name.empty()) { sharedptr field_copy = glom_sharedptr_clone(item); //TODO: This seems to overwrite the sequence set when the user reorders an item. result[field_sequence] = field_copy; ++field_sequence; } } return result; } void Dialog_FieldsList::on_treeview_fields_selection_changed() { enable_buttons(); } Gtk::TreeModel::iterator Dialog_FieldsList::append_appropriate_row() { Gtk::TreeModel::iterator result; Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); Gtk::TreeModel::iterator selected = refTreeSelection->get_selected(); //Add the field details to the layout treeview: if(selected) { //TODO: This doesn't work because it's the sequence ID that really affects the order. result = m_model_fields->insert_after(selected); } else { result = m_model_fields->append(); } return result; } void Dialog_FieldsList::on_button_add_field() { //Get the chosen fields: type_list_field_items fields_list = offer_field_list(m_table_name, this); for(type_list_field_items::iterator iter_chosen = fields_list.begin(); iter_chosen != fields_list.end(); ++iter_chosen) { sharedptr field = *iter_chosen; if(!field) continue; //Add the field details to the layout treeview: Gtk::TreeModel::iterator iter = append_appropriate_row(); if(iter) { Gtk::TreeModel::Row row = *iter; row[m_ColumnsFields.m_col_layout_item] = field; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); treeview_fill_sequences(m_model_fields, m_ColumnsFields.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } } } void Dialog_FieldsList::on_button_delete() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { m_model_fields->erase(iter); m_modified = true; } } } void Dialog_FieldsList::on_cell_data_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr item = row[m_ColumnsFields.m_col_layout_item]; //TODO_performance: Reduce copying. if(item) { renderer_text->property_markup() = item->get_layout_display_name(); } else { //Though this really shouldn't even be in the model: renderer_text->property_markup() = Glib::ustring(); } renderer_text->property_editable() = false; //Names can never be edited. } } } void Dialog_FieldsList::on_button_edit_field() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr field = row[m_ColumnsFields.m_col_layout_item]; //Get the chosen field: sharedptr field_chosen = offer_field_list_select_one_field(field, m_table_name, this); //Set the field details in the layout treeview: if(field_chosen) row[m_ColumnsFields.m_col_layout_item] = field_chosen; //Scroll to, and select, the new row: /* Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); treeview_fill_sequences(m_model_fields, m_ColumnsFields.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. */ } } } void Dialog_FieldsList::on_button_formatting() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr field = row[m_ColumnsFields.m_col_layout_item]; if(field) { field = offer_field_formatting(field, m_table_name, this, false /* no editing options */); row[m_ColumnsFields.m_col_layout_item] = field; } } } } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.h0000644000175000017500000000366312234252646031017 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_BUTTONSCRIPT_H #define GLOM_MODE_DESIGN_DIALOG_BUTTONSCRIPT_H #include #include #include #include #include #include namespace Glom { class Dialog_ButtonScript : public Gtk::Dialog, public View_Composite_Glom //Give this class access to the current document, and to some utility methods. { public: static const char* glade_id; static const bool glade_developer; Dialog_ButtonScript(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ButtonScript(); void set_script(const sharedptr& script, const Glib::ustring& table_name); sharedptr get_script() const; void get_script (const sharedptr& script) const; private: void on_button_test_script(); Gtk::Entry* m_entry_title; Gsv::View* m_text_view_script; Gtk::Button* m_button_test_script; sharedptr m_script; Glib::ustring m_table_name; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_BUTTONSCRIPT_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.h0000644000175000017500000000403312234252646031107 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_LAYOUT_ITEM_DIALOGS_FIELD_SUMMARY_H #define GLOM_LAYOUT_ITEM_DIALOGS_FIELD_SUMMARY_H #include #include #include #include #include #include #include #include "combo_summarytype.h" namespace Glom { class Dialog_FieldSummary : public Gtk::Dialog, public Base_DB { public: static const char* glade_id; static const bool glade_developer; Dialog_FieldSummary(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_FieldSummary(); /** * @param item The starting information. * @param table_name The item's table. */ virtual void set_item(const sharedptr& item, const Glib::ustring& table_name); sharedptr get_item() const; private: //Signal handlers: void on_button_field(); Gtk::Label* m_label_field; Combo_SummaryType* m_combo_summarytype; Gtk::Button* m_button_field; mutable sharedptr m_layout_item; Glib::ustring m_table_name; }; } //namespace Glom #endif //GLOM_LAYOUT_ITEM_DIALOGS_FIELD_SUMMARY_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/comboentry_borderwidth.cc0000644000175000017500000000362212234252646031647 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "comboentry_borderwidth.h" #include //For stringstream. namespace Glom { ComboEntry_BorderWidth::ComboEntry_BorderWidth(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::ComboBox(cobject) { m_model = Gtk::ListStore::create(m_model_columns); //Fill the model: Gtk::TreeModel::iterator iter = m_model->append(); (*iter)[m_model_columns.m_value] = string_for_number(0.05); iter = m_model->append(); (*iter)[m_model_columns.m_value] = string_for_number(0.1); iter = m_model->append(); (*iter)[m_model_columns.m_value] = string_for_number(0.2); iter = m_model->append(); (*iter)[m_model_columns.m_value] = string_for_number(0.5); iter = m_model->append(); (*iter)[m_model_columns.m_value] = string_for_number(1.0); set_model(m_model); set_entry_text_column(m_model_columns.m_value); } ComboEntry_BorderWidth::~ComboEntry_BorderWidth() { } Glib::ustring ComboEntry_BorderWidth::string_for_number(double number) { std::stringstream the_stream; the_stream.imbue(std::locale("")); //The current locale. the_stream << number; return the_stream.str(); } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.cc0000644000175000017500000000550212234252646030660 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_imageobject.h" #include #include #include //#include #include namespace Glom { const char* Dialog_ImageObject::glade_id("window_imageobject"); const bool Dialog_ImageObject::glade_developer(true); Dialog_ImageObject::Dialog_ImageObject(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_box_title(0), m_entry_title(0), m_image(0) { builder->get_widget("vbox_title", m_box_title); builder->get_widget("entry_title", m_entry_title); builder->get_widget_derived("imageglom", m_image); builder->get_widget("button_choose_image", m_button_choose_image); m_button_choose_image->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_ImageObject::on_button_choose)); //on_foreach_connect(*this); //Dialog_Properties::set_modified(false); show_all_children(); } Dialog_ImageObject::~Dialog_ImageObject() { } void Dialog_ImageObject::on_button_choose() { m_image->do_choose_image(); } void Dialog_ImageObject::set_imageobject(const sharedptr& imageobject, const Glib::ustring& table_name, bool show_title) { //set_blocked(); m_imageobject = glom_sharedptr_clone(imageobject); //Remember it so we save any details that are not in our UI. m_table_name = table_name; //Used for lookup combo boxes. m_entry_title->set_text(item_get_title(imageobject)); m_image->set_value( imageobject->get_image() ); if(show_title) m_box_title->show(); else m_box_title->hide(); //set_blocked(false); //Dialog_Properties::set_modified(false); } sharedptr Dialog_ImageObject::get_imageobject() const { sharedptr result = glom_sharedptr_clone(m_imageobject); //Start with the old details, to preserve anything that is not in our UI. result->set_title(m_entry_title->get_text(), AppWindow::get_current_locale()); result->set_image( m_image->get_value() ); return result; } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc0000644000175000017500000001575212234776240030246 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include //For stringstream #include namespace Glom { const char* Dialog_GroupBy::glade_id("dialog_group_by"); const bool Dialog_GroupBy::glade_developer(true); Dialog_GroupBy::Dialog_GroupBy(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_label_group_by(0), m_label_sort_by(0), m_label_secondary_fields(0), m_button_field_group_by(0), m_button_formatting_group_by(0), m_button_field_sort_by(0), m_button_secondary_fields(0), m_comboboxentry_border_width(0), m_dialog_choose_secondary_fields(0), m_dialog_choose_sort_fields(0) { builder->get_widget("label_group_by", m_label_group_by); builder->get_widget("label_sort_by", m_label_sort_by); builder->get_widget("label_secondary_fields", m_label_secondary_fields); builder->get_widget("button_select_group_by", m_button_field_group_by); builder->get_widget("button_formatting_group_by", m_button_formatting_group_by); builder->get_widget("button_select_sort_by", m_button_field_sort_by); builder->get_widget("button_secondary_edit", m_button_secondary_fields); builder->get_widget_derived("comboboxentry_border_width", m_comboboxentry_border_width); //Connect signals: m_button_field_group_by->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_GroupBy::on_button_field_group_by)); m_button_formatting_group_by->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_GroupBy::on_button_formatting_group_by)); m_button_field_sort_by->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_GroupBy::on_button_field_sort_by)); m_button_secondary_fields->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_GroupBy::on_button_secondary_fields)); show_all_children(); } Dialog_GroupBy::~Dialog_GroupBy() { if(m_dialog_choose_secondary_fields) { remove_view(m_dialog_choose_secondary_fields); delete m_dialog_choose_secondary_fields; } if(m_dialog_choose_sort_fields) { remove_view(m_dialog_choose_sort_fields); delete m_dialog_choose_sort_fields; } } void Dialog_GroupBy::set_item(const sharedptr& item, const Glib::ustring& table_name) { m_layout_item = glom_sharedptr_clone(item); m_table_name = table_name; update_labels(); Glib::ustring border_width_as_text; std::stringstream the_stream; the_stream.imbue(std::locale("")); //Current locale. the_stream << m_layout_item->get_border_width(); border_width_as_text = the_stream.str(); m_comboboxentry_border_width->get_entry()->set_text(border_width_as_text); } sharedptr Dialog_GroupBy::get_item() const { std::stringstream the_stream; the_stream.imbue(std::locale("")); //Current locale. the_stream << m_comboboxentry_border_width->get_entry()->get_text(); double border_width_as_number = 0; the_stream >> border_width_as_number; m_layout_item->set_border_width(border_width_as_number); return glom_sharedptr_clone(m_layout_item); } void Dialog_GroupBy::on_button_field_group_by() { sharedptr field = offer_field_list_select_one_field(m_layout_item->get_field_group_by(), m_table_name, this); if(field) { m_layout_item->set_field_group_by(field); set_item(m_layout_item, m_table_name); //Update the UI. } } void Dialog_GroupBy::on_button_formatting_group_by() { if(m_layout_item) { sharedptr field = offer_field_formatting(m_layout_item->get_field_group_by(), m_table_name, this, false /* no editing options. */); if(field) { m_layout_item->set_field_group_by(field); set_item(m_layout_item, m_table_name); //Update the UI. } } } void Dialog_GroupBy::on_button_field_sort_by() { if(!m_dialog_choose_sort_fields) { Utils::get_glade_widget_derived_with_warning(m_dialog_choose_sort_fields); add_view(m_dialog_choose_sort_fields); //Give it access to the document. } if(m_dialog_choose_sort_fields) { m_dialog_choose_sort_fields->set_fields(m_table_name, m_layout_item->get_fields_sort_by()); const int response = Glom::Utils::dialog_run_with_help(m_dialog_choose_sort_fields); m_dialog_choose_sort_fields->hide(); if(response == Gtk::RESPONSE_OK && m_dialog_choose_sort_fields->get_modified()) { m_layout_item->set_fields_sort_by( m_dialog_choose_sort_fields->get_fields() ); } } update_labels(); } void Dialog_GroupBy::on_button_secondary_fields() { if(!m_dialog_choose_secondary_fields) { Utils::get_glade_widget_derived_with_warning(m_dialog_choose_secondary_fields); if(m_dialog_choose_secondary_fields) { add_view(m_dialog_choose_secondary_fields); //Give it access to the document. m_dialog_choose_secondary_fields->set_title(_("Group By - Secondary Fields")); } } if(m_dialog_choose_secondary_fields) { m_dialog_choose_secondary_fields->set_fields(m_table_name, m_layout_item->get_secondary_fields()->m_list_items); const int response = Glom::Utils::dialog_run_with_help(m_dialog_choose_secondary_fields); m_dialog_choose_secondary_fields->hide(); if(response == Gtk::RESPONSE_OK && m_dialog_choose_secondary_fields->get_modified()) { m_layout_item->get_secondary_fields()->remove_all_items(); //Free the existing member items. m_layout_item->get_secondary_fields()->m_list_items = m_dialog_choose_secondary_fields->get_fields(); } } update_labels(); } void Dialog_GroupBy::update_labels() { //Group-by Field: if(m_layout_item->get_has_field_group_by()) { m_label_group_by->set_text( m_layout_item->get_field_group_by()->get_layout_display_name() ); m_button_formatting_group_by->set_sensitive(true); } else { m_label_group_by->set_text( Glib::ustring() ); m_button_formatting_group_by->set_sensitive(false); } //Sort fields: m_label_sort_by->set_text( Utils::get_list_of_sort_fields_for_display(m_layout_item->get_fields_sort_by()) ); //Secondary Fields: const Glib::ustring text_secondary_fields = Utils::get_list_of_layout_items_for_display(m_layout_item->get_secondary_fields()); m_label_secondary_fields->set_text(text_secondary_fields); } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/box_formatting.h0000644000175000017500000001220012234252646027745 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_BOX_FORMATTING_H #define GLOM_MODE_DESIGN_BOX_FORMATTING_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Glom { class Dialog_FieldsList; class Box_Formatting : public Gtk::Box, public View_Composite_Glom { public: static const char* glade_id; static const bool glade_developer; Box_Formatting(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Box_Formatting(); /** * @param format The starting information. */ void set_formatting_for_non_field(const Formatting& format, bool show_numeric = true); /** * @param format The starting information. * @param table_name The field's table. * @param The field that will have this formatting, so we know what formatting options to allow. */ void set_formatting_for_field(const Formatting& format, const Glib::ustring& table_name, const sharedptr& field); bool get_formatting(Formatting& format) const; /** When used, for instance, for print layout items or choice lists, * where the user could not edit the field anyway. * This hides some UI. */ void set_is_for_non_editable(); typedef sigc::signal type_signal_modified; type_signal_modified signal_modified(); private: //Signal handlers: void on_combo_choices_relationship_changed(); void on_checkbox(); void on_button_choices_extra(); void on_button_choices_sortby(); void enforce_constraints(); Gtk::Box* m_vbox_numeric_format; Gtk::CheckButton* m_checkbox_format_use_thousands; Gtk::CheckButton* m_checkbox_format_use_decimal_places; Gtk::Entry* m_entry_format_decimal_places; ComboEntry_Currency* m_entry_currency_symbol; Gtk::CheckButton* m_checkbox_format_color_negatives; Gtk::Box* m_vbox_text_format; Gtk::ComboBox* m_combo_format_text_horizontal_alignment; Gtk::CheckButton* m_checkbox_format_text_multiline; Gtk::Label* m_label_format_text_multiline_height; Gtk::SpinButton* m_spinbutton_format_text_multiline_height; Gtk::Box* m_hbox_font; Gtk::CheckButton* m_checkbox_format_text_font; Gtk::FontButton* m_fontbutton; Gtk::Box* m_hbox_color_foreground; Gtk::CheckButton* m_checkbox_format_text_color_foreground; Gtk::ColorButton* m_colorbutton_foreground; Gtk::Box* m_hbox_color_background; Gtk::CheckButton* m_checkbox_format_text_color_background; Gtk::ColorButton* m_colorbutton_background; Gtk::Box* m_vbox_choices; Gtk::RadioButton* m_radiobutton_choices_custom; Gtk::RadioButton* m_radiobutton_choices_related; Gtk::CheckButton* m_checkbutton_choices_restricted; Gtk::CheckButton* m_checkbutton_choices_restricted_as_radio_buttons; AddDel_WithButtons* m_adddel_choices_custom; guint m_col_index_custom_choices; ComboBox_Relationship* m_combo_choices_relationship; ComboBox_Fields* m_combo_choices_field; Gtk::Label* m_label_choices_extra_fields; Gtk::Button* m_button_choices_extra_fields; Gtk::Label* m_label_choices_sortby; Gtk::Button* m_button_choices_sortby; Gtk::CheckButton* m_checkbutton_choices_related_show_all; Dialog_FieldsList* m_dialog_choices_extra_fields; Dialog_SortFields* m_dialog_choices_sortby; mutable Formatting m_format; Glib::ustring m_table_name; sharedptr m_field; //We show different options when //showing this on a print layout. bool m_for_print_layout; bool m_show_numeric; bool m_show_editable_options; type_signal_modified m_signal_modified; class AlignmentColumns: public Gtk::TreeModelColumnRecord { public: AlignmentColumns() { add(m_col_alignment); add(m_col_title); } Gtk::TreeModelColumn m_col_alignment; Gtk::TreeModelColumn m_col_title; }; AlignmentColumns m_columns_alignment; Glib::RefPtr m_model_alignment; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_BOX_FORMATTING_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc0000644000175000017500000001171612234252646031153 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_buttonscript.h" #include #include #include #include #include //#include #include namespace Glom { const char* Dialog_ButtonScript::glade_id("window_button_script"); const bool Dialog_ButtonScript::glade_developer(true); Dialog_ButtonScript::Dialog_ButtonScript(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject) { builder->get_widget("textview_calculation", m_text_view_script); builder->get_widget("button_test", m_button_test_script); builder->get_widget("entry_title", m_entry_title); m_button_test_script->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_ButtonScript::on_button_test_script) ); // Set a monospace font m_text_view_script->override_font(Pango::FontDescription("Monospace")); //on_foreach_connect(*this); //Dialog_Properties::set_modified(false); //Tell the SourceView to do syntax highlighting for Python: Glib::RefPtr languages_manager = Gsv::LanguageManager::get_default(); Glib::RefPtr language = languages_manager->get_language("python"); //This is the GtkSourceView language ID. if(language) { //Create a new buffer and set it, instead of getting the default buffer, in case libglade has tried to set it, using the wrong buffer type: Glib::RefPtr buffer = Gsv::Buffer::create(language); buffer->set_highlight_syntax(); m_text_view_script->set_buffer(buffer); } show_all_children(); } Dialog_ButtonScript::~Dialog_ButtonScript() { } void Dialog_ButtonScript::set_script(const sharedptr& script, const Glib::ustring& table_name) { //set_blocked(); m_script = glom_sharedptr_clone(script); //Remember it so we save any details that are not in our UI. m_table_name = table_name; //Used for lookup combo boxes. m_text_view_script->get_buffer()->set_text( script->get_script() ); m_entry_title->set_text(item_get_title(script)); //set_blocked(false); //Dialog_Properties::set_modified(false); } sharedptr Dialog_ButtonScript::get_script() const { sharedptr result = glom_sharedptr_clone(m_script); //Start with the old details, to preserve anything that is not in our UI. get_script(result); return result; } void Dialog_ButtonScript::get_script(const sharedptr& script) const { script->set_script(m_text_view_script->get_buffer()->get_text() ); script->set_title(m_entry_title->get_text(), AppWindow::get_current_locale()); } void Dialog_ButtonScript::on_button_test_script() { const Glib::ustring calculation = m_text_view_script->get_buffer()->get_text(); if(!Utils::script_check_for_pygtk2_with_warning(calculation, this)) return; type_map_fields field_values; Document* document = get_document(); if(document) { const Document::type_vec_fields fields = document->get_table_fields(m_table_name); for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { const sharedptr field = *iter; const Gnome::Gda::Value example_value = Conversions::get_example_value(field->get_glom_type()); field_values[field->get_name()] = example_value; } } //We need the connection when we run the script, so that the script may use it. sharedptr sharedconnection = ConnectionPool::get_and_connect(); Glib::ustring error_message; PythonUICallbacks callbacks; glom_execute_python_function_implementation(calculation, field_values, //TODO: Maybe use the field's type here. document, m_table_name, sharedptr(), Gnome::Gda::Value(), // primary key - only used when setting values in the DB, which we would not encourage in a test. sharedconnection->get_gda_connection(), callbacks, error_message); if(!error_message.empty()) Utils::show_ok_dialog(_("Calculation failed"), Glib::ustring::compose(_("The calculation failed with this error:\n%1"), error_message), *this, Gtk::MESSAGE_ERROR); } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.cc0000644000175000017500000000533612234252646030567 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_textobject.h" #include #include //#include #include namespace Glom { const char* Dialog_TextObject::glade_id("window_textobject"); const bool Dialog_TextObject::glade_developer(true); Dialog_TextObject::Dialog_TextObject(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_box_title(0), m_entry_title(0), m_text_view(0) { builder->get_widget("vbox_title", m_box_title); builder->get_widget("entry_title", m_entry_title); builder->get_widget("textview_text", m_text_view); //on_foreach_connect(*this); //Dialog_Properties::set_modified(false); show_all_children(); } Dialog_TextObject::~Dialog_TextObject() { } void Dialog_TextObject::set_textobject(const sharedptr& textobject, const Glib::ustring& table_name, bool show_title) { //set_blocked(); m_textobject = glom_sharedptr_clone(textobject); //Remember it so we save any details that are not in our UI. m_table_name = table_name; //Used for lookup combo boxes. m_entry_title->set_text(item_get_title(textobject)); m_text_view->get_buffer()->set_text( textobject->get_text(AppWindow::get_current_locale()) ); if(show_title) m_box_title->show(); else m_box_title->hide(); //set_blocked(false); //Dialog_Properties::set_modified(false); } sharedptr Dialog_TextObject::get_textobject() const { sharedptr result = glom_sharedptr_clone(m_textobject); //Start with the old details, to preserve anything that is not in our UI. get_textobject(result); return result; } void Dialog_TextObject::get_textobject(sharedptr& textobject) const { textobject->set_title(m_entry_title->get_text(), AppWindow::get_current_locale()); textobject->set_text( m_text_view->get_buffer()->get_text(), AppWindow::get_current_locale()); } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/comboentry_borderwidth.h0000644000175000017500000000334212234252646031510 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_COMBOENTRY_BORDERWIDTH_H #define GLOM_MODE_DESIGN_COMBOENTRY_BORDERWIDTH_H #include #include #include namespace Glom { class ComboEntry_BorderWidth : public Gtk::ComboBox { public: ComboEntry_BorderWidth(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~ComboEntry_BorderWidth(); private: /** Get the correct text representation of the @a number for the current locale: */ static Glib::ustring string_for_number(double number); //Tree model columns: //These columns are used by the model that is created by the default constructor class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_value); } Gtk::TreeModelColumn m_value; }; ModelColumns m_model_columns; Glib::RefPtr m_model; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_COMBOENTRY_BORDERWIDTH_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_formatting.h0000644000175000017500000000374212234252646030427 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_FORMATTING_H #define GLOM_MODE_DESIGN_DIALOG_FORMATTING_H #include #include #include #include #include #include "box_formatting.h" namespace Glom { /** This dialog lets the user choose the formatting for non-field items. * Field items should use Dialog_FieldLayout instead. */ class Dialog_Formatting : public Gtk::Dialog, public View_Composite_Glom //Give it access to the document. { public: Dialog_Formatting(); virtual ~Dialog_Formatting(); /** * @param document The document, so that the dialog can load the previous layout, and save changes. * @param field The starting item information. */ void set_item(const sharedptr& field, bool show_numeric); /** Set the @a layout_item's formatting to the formatting specified in the * dialog by the user. */ void use_item_chosen(const sharedptr& layout_item); private: void enforce_constraints(); Box_Formatting* m_box_formatting; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_FORMATTING_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.h0000644000175000017500000000527212234252646030433 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_SORTFIELDS_H #define GLOM_MODE_DESIGN_DIALOG_SORTFIELDS_H #include #include #include namespace Glom { class Dialog_SortFields : public Dialog_Layout //It has some useful stuff { public: static const char* glade_id; static const bool glade_developer; Dialog_SortFields(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_SortFields(); void set_fields(const Glib::ustring& table_name, const LayoutItem_GroupBy::type_list_sort_fields& table_fields); LayoutItem_GroupBy::type_list_sort_fields get_fields() const; private: //Enable/disable buttons, depending on treeview selection: virtual void enable_buttons(); //signal handlers: virtual void on_button_field_up(); virtual void on_button_field_down(); virtual void on_button_add_field(); virtual void on_button_delete(); virtual void on_button_edit_field(); virtual void on_treeview_fields_selection_changed(); virtual void on_cell_data_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); //Tree model columns: class ModelColumns_Fields : public Gtk::TreeModel::ColumnRecord { public: ModelColumns_Fields() { add(m_col_layout_item); add(m_col_ascending); add(m_col_sequence); } Gtk::TreeModelColumn< sharedptr > m_col_layout_item; Gtk::TreeModelColumn m_col_ascending; Gtk::TreeModelColumn m_col_sequence; }; ModelColumns_Fields m_ColumnsFields; //Tree model columns: Gtk::TreeView* m_treeview_fields; Gtk::Button* m_button_field_up; Gtk::Button* m_button_field_down; Gtk::Button* m_button_field_add; Gtk::Button* m_button_field_delete; Gtk::Button* m_button_field_edit; Glib::RefPtr m_model_fields; Gtk::Label* m_label_table_name; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_SORTFIELDS_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/box_formatting.cc0000644000175000017500000006231412234776240030117 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "box_formatting.h" #include #include #include #include #include namespace Glom { const char* Box_Formatting::glade_id("box_formatting"); const bool Box_Formatting::glade_developer(true); Box_Formatting::Box_Formatting(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Box(cobject), m_vbox_numeric_format(0), m_checkbox_format_use_thousands(0), m_checkbox_format_use_decimal_places(0), m_entry_format_decimal_places(0), m_entry_currency_symbol(0), m_checkbox_format_color_negatives(0), m_vbox_text_format(0), m_combo_format_text_horizontal_alignment(0), m_checkbox_format_text_multiline(0), m_label_format_text_multiline_height(0), m_spinbutton_format_text_multiline_height(0), m_hbox_font(0), m_checkbox_format_text_font(0), m_fontbutton(0), m_hbox_color_foreground(0), m_checkbox_format_text_color_foreground(0), m_colorbutton_foreground(0), m_hbox_color_background(0), m_checkbox_format_text_color_background(0), m_colorbutton_background(0), m_vbox_choices(0), m_radiobutton_choices_custom(0), m_radiobutton_choices_related(0), m_checkbutton_choices_restricted(0), m_checkbutton_choices_restricted_as_radio_buttons(0), m_adddel_choices_custom(0), m_col_index_custom_choices(0), m_combo_choices_relationship(0), m_combo_choices_field(0), m_label_choices_extra_fields(0), m_button_choices_extra_fields(0), m_label_choices_sortby(0), m_button_choices_sortby(0), m_checkbutton_choices_related_show_all(0), m_dialog_choices_extra_fields(0), m_dialog_choices_sortby(0), m_for_print_layout(false), m_show_numeric(true), m_show_editable_options(true) { //Numeric formatting: builder->get_widget("vbox_numeric_format", m_vbox_numeric_format); builder->get_widget("checkbutton_format_thousands", m_checkbox_format_use_thousands); builder->get_widget("checkbutton_format_use_decimal_places", m_checkbox_format_use_decimal_places); builder->get_widget("entry_format_decimal_places", m_entry_format_decimal_places); builder->get_widget_derived("entry_currency_symbol", m_entry_currency_symbol); builder->get_widget("checkbutton_foreground_negatives", m_checkbox_format_color_negatives); //Text formatting: builder->get_widget("vbox_text_format", m_vbox_text_format); builder->get_widget("combo_format_text_horizontal_alignment", m_combo_format_text_horizontal_alignment); builder->get_widget("checkbutton_format_text_multiline", m_checkbox_format_text_multiline); builder->get_widget("label_format_text_multiline", m_label_format_text_multiline_height); builder->get_widget("spinbutton_format_text_multiline_height", m_spinbutton_format_text_multiline_height); builder->get_widget("hbox_font", m_hbox_font); builder->get_widget("checkbutton_font", m_checkbox_format_text_font); builder->get_widget("fontbutton", m_fontbutton); builder->get_widget("hbox_color_foreground", m_hbox_color_foreground); builder->get_widget("colorbutton_foreground", m_colorbutton_foreground); builder->get_widget("checkbutton_color_foreground", m_checkbox_format_text_color_foreground); builder->get_widget("hbox_color_background", m_hbox_color_background); builder->get_widget("colorbutton_background", m_colorbutton_background); builder->get_widget("checkbutton_color_background", m_checkbox_format_text_color_background); //Set the adjustment details, to avoid a useless 0-to-0 range and a 0 incremenet. //We don't do this the Glade file because GtkBuilder wouldn't find the //associated adjustment object unless we specified it explictly: //See http://bugzilla.gnome.org/show_bug.cgi?id=575714 m_spinbutton_format_text_multiline_height->set_range(0, 100); m_spinbutton_format_text_multiline_height->set_increments(1, 10); m_spinbutton_format_text_multiline_height->set_value(3); //A sensible default. //Fill the alignment combo: m_model_alignment = Gtk::ListStore::create(m_columns_alignment); Gtk::TreeModel::iterator iter = m_model_alignment->append(); (*iter)[m_columns_alignment.m_col_alignment] = Formatting::HORIZONTAL_ALIGNMENT_AUTO; //Translators: This is Automatic text alignment. (*iter)[m_columns_alignment.m_col_title] = _("Automatic"); iter = m_model_alignment->append(); (*iter)[m_columns_alignment.m_col_alignment] = Formatting::HORIZONTAL_ALIGNMENT_LEFT; //Translators: This is Left text alignment. (*iter)[m_columns_alignment.m_col_title] = _("Left"); iter = m_model_alignment->append(); (*iter)[m_columns_alignment.m_col_alignment] = Formatting::HORIZONTAL_ALIGNMENT_RIGHT; //Translators: This is Right text alignment. (*iter)[m_columns_alignment.m_col_title] = _("Right"); m_combo_format_text_horizontal_alignment->set_model(m_model_alignment); m_combo_format_text_horizontal_alignment->pack_start(m_columns_alignment.m_col_title); //Choices: builder->get_widget("vbox_choices", m_vbox_choices); builder->get_widget_derived("adddel_choices", m_adddel_choices_custom); m_col_index_custom_choices = m_adddel_choices_custom->add_column("Choices"); m_adddel_choices_custom->set_allow_add(); m_adddel_choices_custom->set_allow_delete(); m_adddel_choices_custom->set_auto_add(); builder->get_widget("checkbutton_choices_restrict", m_checkbutton_choices_restricted); builder->get_widget("checkbutton_choices_restrict_as_radio_buttons", m_checkbutton_choices_restricted_as_radio_buttons); builder->get_widget_derived("combobox_choices_related_relationship", m_combo_choices_relationship); builder->get_widget_derived("combobox_choices_related_field", m_combo_choices_field); builder->get_widget("label_choices_related_extra_fields", m_label_choices_extra_fields); builder->get_widget("button_choices_related_extra_fields", m_button_choices_extra_fields); builder->get_widget("label_choices_related_sortby", m_label_choices_sortby); builder->get_widget("button_choices_related_sortby", m_button_choices_sortby); builder->get_widget("checkbutton_choices_related_show_all", m_checkbutton_choices_related_show_all); builder->get_widget("radiobutton_choices_custom", m_radiobutton_choices_custom); builder->get_widget("radiobutton_choices_related", m_radiobutton_choices_related); m_combo_choices_relationship->signal_changed().connect(sigc::mem_fun(*this, &Box_Formatting::on_combo_choices_relationship_changed)); m_checkbox_format_text_multiline->signal_toggled().connect( sigc::mem_fun(*this, &Box_Formatting::on_checkbox) ); m_checkbox_format_text_font->signal_toggled().connect( sigc::mem_fun(*this, &Box_Formatting::on_checkbox) ); m_checkbox_format_text_color_foreground->signal_toggled().connect( sigc::mem_fun(*this, &Box_Formatting::on_checkbox) ); m_checkbox_format_text_color_background->signal_toggled().connect( sigc::mem_fun(*this, &Box_Formatting::on_checkbox) ); m_checkbox_format_color_negatives->signal_toggled().connect( sigc::mem_fun(*this, &Box_Formatting::on_checkbox) ); m_checkbutton_choices_restricted->signal_toggled().connect( sigc::mem_fun(*this, &Box_Formatting::on_checkbox) ); m_button_choices_extra_fields->signal_clicked().connect( sigc::mem_fun(*this, &Box_Formatting::on_button_choices_extra) ); m_button_choices_sortby->signal_clicked().connect( sigc::mem_fun(*this, &Box_Formatting::on_button_choices_sortby) ); //TODO: Delay this until it is used? Utils::get_glade_widget_derived_with_warning(m_dialog_choices_extra_fields); if(m_dialog_choices_extra_fields) { add_view(m_dialog_choices_extra_fields); //Give it access to the document. m_dialog_choices_extra_fields->set_title(_("Extra Fields")); } //TODO: Delay this until it is used? Utils::get_glade_widget_derived_with_warning(m_dialog_choices_sortby); if(m_dialog_choices_sortby) { add_view(m_dialog_choices_sortby); //Give it access to the document. m_dialog_choices_sortby->set_title(_("Sort Order")); } show_all_children(); } Box_Formatting::~Box_Formatting() { if(m_dialog_choices_extra_fields) { remove_view(m_dialog_choices_extra_fields); //Give it access to the document. delete m_dialog_choices_extra_fields; } if(m_dialog_choices_sortby) { remove_view(m_dialog_choices_sortby); //Give it access to the document. delete m_dialog_choices_sortby; } } void Box_Formatting::set_is_for_non_editable() { m_for_print_layout = true; m_show_editable_options = false; //Add labels (because we will hide the checkboxes): Gtk::Label* label = Gtk::manage(new Gtk::Label(_("Font"))); label->show(); m_hbox_font->pack_start(*label, Gtk::PACK_SHRINK); label = Gtk::manage(new Gtk::Label(_("Foreground Color"))); label->show(); m_hbox_color_foreground->pack_start(*label, Gtk::PACK_SHRINK); label = Gtk::manage(new Gtk::Label(_("Background Color"))); label->show(); m_hbox_color_background->pack_start(*label, Gtk::PACK_SHRINK); enforce_constraints(); } void Box_Formatting::set_formatting_for_field(const Formatting& format, const Glib::ustring& table_name, const sharedptr& field) { //Used for choices and some extra text formatting: m_table_name = table_name; m_field = field; set_formatting_for_non_field(format, true /* show_numeric, ignoring anyway when m_field is set */); } void Box_Formatting::set_formatting_for_non_field(const Formatting& format, bool show_numeric) { //TODO: Split this into a private method, so that previously-set m_table_name and m_field (from set_formatting_for_field()) will not stay set. m_format = format; m_show_numeric = show_numeric; //Numeric formatting: m_checkbox_format_use_thousands->set_active( format.m_numeric_format.m_use_thousands_separator ); m_checkbox_format_use_decimal_places->set_active( format.m_numeric_format.m_decimal_places_restricted ); char pchText[10] = {0}; sprintf(pchText, "%d", format.m_numeric_format.m_decimal_places); m_entry_format_decimal_places->set_text(Glib::ustring(pchText)); m_entry_currency_symbol->get_entry()->set_text(format.m_numeric_format.m_currency_symbol); m_checkbox_format_color_negatives->set_active( format.m_numeric_format.m_alt_foreground_color_for_negatives ); //Text formatting const Formatting::HorizontalAlignment alignment = format.get_horizontal_alignment(); Gtk::TreeModel::Children children = m_model_alignment->children(); for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) { Gtk::TreeModel::Row row = *iter; if(row[m_columns_alignment.m_col_alignment] == alignment) { m_combo_format_text_horizontal_alignment->set_active(iter); break; } } m_checkbox_format_text_multiline->set_active(format.get_text_format_multiline()); m_spinbutton_format_text_multiline_height->set_value(format.get_text_format_multiline_height_lines()); const Glib::ustring font = format.get_text_format_font(); m_checkbox_format_text_font->set_active(!font.empty()); m_fontbutton->set_font_name(font); const Glib::ustring color_foreground = format.get_text_format_color_foreground(); m_checkbox_format_text_color_foreground->set_active(!color_foreground.empty()); m_colorbutton_foreground->set_rgba( Gdk::RGBA(color_foreground) ); const Glib::ustring color_background = format.get_text_format_color_background(); m_checkbox_format_text_color_background->set_active(!color_background.empty()); m_colorbutton_background->set_rgba( Gdk::RGBA(color_background) ); //Choices: if(m_field) { bool as_radio_buttons = false; //TODO m_checkbutton_choices_restricted->set_active( format.get_choices_restricted(as_radio_buttons)); m_checkbutton_choices_restricted_as_radio_buttons->set_active(as_radio_buttons); const Document* document = get_document(); //Fill the list of relationships: const Document::type_vec_relationships vecRelationships = document->get_relationships(m_table_name); m_combo_choices_relationship->set_relationships(vecRelationships); sharedptr choices_relationship; sharedptr choices_field; sharedptr choices_field_extras; Formatting::type_list_sort_fields choices_sort_fields; bool choices_show_all = false; format.get_choices_related(choices_relationship, choices_field, choices_field_extras, choices_sort_fields, choices_show_all); m_combo_choices_relationship->set_selected_relationship(choices_relationship); on_combo_choices_relationship_changed(); //Fill the combos so we can set their active items. m_combo_choices_field->set_selected_field(choices_field ? choices_field->get_name() : Glib::ustring()); //Show the list of extra fields in a label: const Glib::ustring text_extra_fields = Utils::get_list_of_layout_items_for_display(choices_field_extras); m_label_choices_extra_fields->set_text(text_extra_fields); //Update the contents of the dialog that will be shown if Edit is clicked: const Glib::ustring related_to_table = (choices_relationship ? choices_relationship->get_to_table() : Glib::ustring()); if(choices_field_extras) m_dialog_choices_extra_fields->set_fields(related_to_table, choices_field_extras->m_list_items); else m_dialog_choices_extra_fields->set_fields(related_to_table, LayoutGroup::type_list_items()); //Show the list of sort fields in a label: const Glib::ustring text_sortby = Utils::get_list_of_sort_fields_for_display(choices_sort_fields); m_label_choices_sortby->set_text(text_sortby); //Update the contents of the dialog that will be shown if Edit is clicked: m_dialog_choices_sortby->set_fields(related_to_table, choices_sort_fields); m_checkbutton_choices_related_show_all->set_active(choices_show_all); //Custom choices: m_adddel_choices_custom->remove_all(); Formatting::type_list_values list_choice_values = format.get_choices_custom(); for(Formatting::type_list_values::const_iterator iter = list_choice_values.begin(); iter != list_choice_values.end(); ++iter) { const sharedptr choicevalue = *iter; Gnome::Gda::Value value; if(choicevalue) value = choicevalue->get_value(); //Display the value in the choices list as it would be displayed in the format: const Glib::ustring value_text = Conversions::get_text_for_gda_value(m_field->get_glom_type(), value, format.m_numeric_format); Gtk::TreeModel::iterator tree_iter = m_adddel_choices_custom->add_item(value_text); m_adddel_choices_custom->set_value(tree_iter, m_col_index_custom_choices, value_text); } m_radiobutton_choices_custom->set_active(format.get_has_custom_choices()); m_radiobutton_choices_related->set_active(format.get_has_related_choices()); } enforce_constraints(); } bool Box_Formatting::get_formatting(Formatting& format) const { //Numeric Formatting: m_format.m_numeric_format.m_use_thousands_separator = m_checkbox_format_use_thousands->get_active(); m_format.m_numeric_format.m_decimal_places_restricted = m_checkbox_format_use_decimal_places->get_active(); const Glib::ustring strDecPlaces = m_entry_format_decimal_places->get_text(); m_format.m_numeric_format.m_decimal_places = atoi(strDecPlaces.c_str()); m_format.m_numeric_format.m_currency_symbol = m_entry_currency_symbol->get_entry()->get_text(); m_format.m_numeric_format.m_alt_foreground_color_for_negatives = m_checkbox_format_color_negatives->get_active(); //Text formatting: Gtk::TreeModel::iterator iter = m_combo_format_text_horizontal_alignment->get_active(); Formatting::HorizontalAlignment alignment = Formatting::HORIZONTAL_ALIGNMENT_LEFT; if(iter) alignment = (*iter)[m_columns_alignment.m_col_alignment]; m_format.set_horizontal_alignment(alignment); m_format.set_text_format_multiline(m_checkbox_format_text_multiline->get_active()); m_format.set_text_format_multiline_height_lines( m_spinbutton_format_text_multiline_height->get_value_as_int() ); Glib::ustring font; if(m_checkbox_format_text_font->get_active()) font = m_fontbutton->get_font_name(); m_format.set_text_format_font(font); Glib::ustring color_foreground; if(m_checkbox_format_text_color_foreground->get_active()) color_foreground = m_colorbutton_foreground->get_rgba().to_string(); m_format.set_text_format_color_foreground(color_foreground); Glib::ustring color_background; if(m_checkbox_format_text_color_background->get_active()) color_background = m_colorbutton_background->get_rgba().to_string(); m_format.set_text_format_color_background(color_background); //Choices: if(m_field) { m_format.set_choices_restricted( m_checkbutton_choices_restricted->get_active(), m_checkbutton_choices_restricted_as_radio_buttons->get_active()); const sharedptr choices_relationship = m_combo_choices_relationship->get_selected_relationship(); sharedptr layout_choice_first = sharedptr::create(); layout_choice_first->set_name(m_combo_choices_field->get_selected_field_name()); sharedptr layout_choice_extra = sharedptr::create(); layout_choice_extra->m_list_items = m_dialog_choices_extra_fields->get_fields(); const Formatting::type_list_sort_fields sort_fields = m_dialog_choices_sortby->get_fields(); m_format.set_choices_related(choices_relationship, layout_choice_first, layout_choice_extra, sort_fields, m_checkbutton_choices_related_show_all->get_active()); //Custom choices: Formatting::type_list_values list_choice_values; Glib::RefPtr choices_model = m_adddel_choices_custom->get_model(); if(choices_model) { for(Gtk::TreeModel::iterator iter = choices_model->children().begin(); iter != choices_model->children().end(); ++iter) { const Glib::ustring text = m_adddel_choices_custom->get_value(iter, m_col_index_custom_choices); if(!text.empty()) { bool success = false; const Gnome::Gda::Value value = Conversions::parse_value(m_field->get_glom_type(), text, m_format.m_numeric_format, success); if(success) { sharedptr choicevalue = sharedptr::create(); choicevalue->set_value(value); list_choice_values.push_back(choicevalue); } } } } m_format.set_choices_custom(list_choice_values); m_format.set_has_custom_choices(m_radiobutton_choices_custom->get_active()); m_format.set_has_related_choices(m_radiobutton_choices_related->get_active()); } format = m_format; return true; } void Box_Formatting::on_combo_choices_relationship_changed() { sharedptr relationship = m_combo_choices_relationship->get_selected_relationship(); Document* pDocument = get_document(); if(pDocument) { //Show the list of fields from this relationship: if(relationship) { const Glib::ustring related_table = relationship->get_to_table(); const Document::type_vec_fields vecFields = pDocument->get_table_fields(related_table); m_combo_choices_field->set_fields(vecFields); //Default to using the Primary Key field from the related table, //because this is almost always what people want to use: const sharedptr related_primary_key = pDocument->get_field_primary_key(related_table); if(related_primary_key) m_combo_choices_field->set_selected_field(related_primary_key); //Update the show-all dialog's list: //If the related table name has changed then the list of fields will probably //be ignored, clearing the list, but we try to preserve it if possible: const LayoutGroup::type_list_items list_fields = m_dialog_choices_extra_fields->get_fields(); m_dialog_choices_extra_fields->set_fields(relationship->get_to_table(), list_fields); //Update the label: const Glib::ustring text_extra_fields = Utils::get_list_of_layout_items_for_display(m_dialog_choices_extra_fields->get_fields()); m_label_choices_extra_fields->set_text(text_extra_fields); //If the related table name has changed then the list of sort fields will probably //be ignored, clearing the list, but we try to preserve it if possible: const Formatting::type_list_sort_fields sort_fields = m_dialog_choices_sortby->get_fields(); m_dialog_choices_sortby->set_fields(relationship->get_to_table(), sort_fields); //Update the label: //TODO: Do the label updating in a shared function. const Glib::ustring text_sortby = Utils::get_list_of_sort_fields_for_display(m_dialog_choices_sortby->get_fields()); m_label_choices_sortby->set_text(text_sortby); } } } void Box_Formatting::enforce_constraints() { //Hide inappropriate UI: bool show_text = true; if(m_field) { m_show_numeric = false; if(m_field->get_glom_type() == Field::TYPE_NUMERIC) m_show_numeric = true; if((m_field->get_glom_type() == Field::TYPE_BOOLEAN) || (m_field->get_glom_type() == Field::TYPE_IMAGE)) //TODO: Allow text options when showing booleans as Yes/No on print layouts. { show_text = false; } } if(show_text) { m_vbox_text_format->show(); //Hide multiline options for non-text fields: if(m_for_print_layout || !m_field || (m_field->get_glom_type() != Field::TYPE_TEXT)) { m_checkbox_format_text_multiline->hide(); m_label_format_text_multiline_height->hide(); m_spinbutton_format_text_multiline_height->hide(); } else { m_checkbox_format_text_multiline->show(); m_label_format_text_multiline_height->hide(); m_spinbutton_format_text_multiline_height->show(); } //Do not allow the user to specify a text height if it is not going to be multiline: const bool text_height_sensitive = m_checkbox_format_text_multiline->get_active(); m_spinbutton_format_text_multiline_height->set_sensitive(text_height_sensitive); } else m_vbox_text_format->hide(); //Hide the checkbuttons (we show labels instead) for print layouts: if(m_for_print_layout) { m_checkbox_format_text_font->hide(); m_checkbox_format_text_color_background->hide(); m_checkbox_format_text_color_foreground->hide(); //But enable them so that other code, that checks for it, works: m_checkbox_format_text_font->set_active(); m_checkbox_format_text_color_background->set_active(); m_checkbox_format_text_color_foreground->set_active(); } //Enable UI depending on the checkbutton state: m_fontbutton->set_sensitive( m_checkbox_format_text_font->get_active() ); m_colorbutton_foreground->set_sensitive( m_checkbox_format_text_color_foreground->get_active() ); m_colorbutton_background->set_sensitive( m_checkbox_format_text_color_background->get_active() ); //Choices: //Radio buttons only make sense when the items are restricted, instead of free-form: m_checkbutton_choices_restricted_as_radio_buttons->set_sensitive( m_checkbutton_choices_restricted->get_active()); if(m_show_numeric) m_vbox_numeric_format->show(); else m_vbox_numeric_format->hide(); if(m_field && m_show_editable_options) m_vbox_choices->show(); else m_vbox_choices->hide(); } void Box_Formatting::on_checkbox() { enforce_constraints(); } void Box_Formatting::on_button_choices_extra() { if(!m_dialog_choices_extra_fields) return; const int response = Glom::Utils::dialog_run_with_help(m_dialog_choices_extra_fields); m_dialog_choices_extra_fields->hide(); if(response == Gtk::RESPONSE_OK && m_dialog_choices_extra_fields->get_modified()) { //Update the label: const Glib::ustring text_extra_fields = Utils::get_list_of_layout_items_for_display(m_dialog_choices_extra_fields->get_fields()); m_label_choices_extra_fields->set_text(text_extra_fields); //Tell the parent (which connects directly to all other (regular) widgets): m_signal_modified.emit(); } } void Box_Formatting::on_button_choices_sortby() { if(!m_dialog_choices_sortby) return; const int response = Glom::Utils::dialog_run_with_help(m_dialog_choices_sortby); m_dialog_choices_sortby->hide(); if(response == Gtk::RESPONSE_OK && m_dialog_choices_sortby->get_modified()) { //Update the label: const Glib::ustring text_sortby = Utils::get_list_of_sort_fields_for_display(m_dialog_choices_sortby->get_fields()); m_label_choices_sortby->set_text(text_sortby); //Tell the parent (which connects directly to all other (regular) widgets): m_signal_modified.emit(); } } Box_Formatting::type_signal_modified Box_Formatting::signal_modified() { return m_signal_modified; } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_line.cc0000644000175000017500000000477012234776363027353 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_line.h" #include #include //#include #include namespace Glom { const char* Dialog_Line::glade_id("dialog_line"); const bool Dialog_Line::glade_developer(true); Dialog_Line::Dialog_Line(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_spinbutton_line_width(0), m_colorbutton(0) { builder->get_widget("spinbutton_line_width", m_spinbutton_line_width); builder->get_widget("colorbutton", m_colorbutton); //on_foreach_connect(*this); //Dialog_Properties::set_modified(false); show_all_children(); } Dialog_Line::~Dialog_Line() { } void Dialog_Line::set_line(const sharedptr& line) { if(!line) { std::cerr << G_STRFUNC << ": line is null" << std::endl; } //set_blocked(); m_line = glom_sharedptr_clone(line); //Remember it so we save any details that are not in our UI. m_spinbutton_line_width->set_value(line->get_line_width()); const Gdk::RGBA color( line->get_line_color() ); m_colorbutton->set_rgba(color); //set_blocked(false); //Dialog_Properties::set_modified(false); } sharedptr Dialog_Line::get_line() const { if(!m_line) { std::cerr << G_STRFUNC << ": m_line is null" << std::endl; } sharedptr result = glom_sharedptr_clone(m_line); //Start with the old details, to preserve anything that is not in our UI. if(!result) { std::cerr << ": result is null" << std::endl; return result; } result->set_line_width( m_spinbutton_line_width->get_value() ); result->set_line_color( m_colorbutton->get_rgba().to_string() ); return result; } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_line.h0000644000175000017500000000325612234252646027204 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_LINE_H #define GLOM_MODE_DESIGN_DIALOG_LINE_H #include #include #include #include #include #include namespace Glom { class Dialog_Line : public Gtk::Dialog, public Base_DB //Give this class access to the current document, and to some utility methods. { public: static const char* glade_id; static const bool glade_developer; Dialog_Line(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Line(); void set_line(const sharedptr& line); sharedptr get_line() const; private: Gtk::SpinButton* m_spinbutton_line_width; Gtk::ColorButton* m_colorbutton; sharedptr m_line; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_LINE_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc0000644000175000017500000001613412234252646030232 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_notebook.h" #include #include //#include #include namespace Glom { const char* Dialog_Notebook::glade_id("dialog_notebook"); const bool Dialog_Notebook::glade_developer(true); Dialog_Notebook::Dialog_Notebook(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Layout(cobject, builder, false /* means no table title */), m_treeview(0), m_button_up(0), m_button_down(0), m_button_add(0), m_button_delete(0) { builder->get_widget("treeview", m_treeview); if(m_treeview) { m_model = Gtk::ListStore::create(m_ColumnsTabs); m_treeview->set_model(m_model); // Append the View columns: m_treeview->append_column_editable(_("Name"), m_ColumnsTabs.m_col_name); m_treeview->append_column_editable(_("Title"), m_ColumnsTabs.m_col_title); //Sort by sequence, so we can change the order by changing the values in the hidden sequence column. m_model->set_sort_column(m_ColumnsTabs.m_col_sequence, Gtk::SORT_ASCENDING); //Respond to changes of selection: Glib::RefPtr refSelection = m_treeview->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_Notebook::on_treeview_selection_changed) ); } m_model->signal_row_changed().connect( sigc::mem_fun(*this, &Dialog_Notebook::on_treemodel_row_changed) ); } builder->get_widget("button_up", m_button_up); m_button_up->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Notebook::on_button_up) ); builder->get_widget("button_down", m_button_down); m_button_down->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Notebook::on_button_down) ); builder->get_widget("button_delete", m_button_delete); m_button_delete->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Notebook::on_button_delete) ); builder->get_widget("button_add", m_button_add); m_button_add->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Notebook::on_button_add) ); show_all_children(); } Dialog_Notebook::~Dialog_Notebook() { } void Dialog_Notebook::set_notebook(const sharedptr& start_notebook) { m_layout_item = start_notebook; //So we can preserve information for later. m_modified = false; //Document* document = get_document(); guint sequence = 1; for(LayoutGroup::type_list_items::const_iterator iter = start_notebook->m_list_items.begin(); iter != start_notebook->m_list_items.end(); ++iter) { sharedptr item = sharedptr::cast_dynamic(*iter); if(item) { Gtk::TreeModel::iterator iterTree = m_model->append(); Gtk::TreeModel::Row row = *iterTree; row[m_ColumnsTabs.m_col_item] = glom_sharedptr_clone(item); row[m_ColumnsTabs.m_col_name] = item->get_name(); row[m_ColumnsTabs.m_col_title] = item_get_title(item); row[m_ColumnsTabs.m_col_sequence] = sequence; ++sequence; } //treeview_fill_sequences(m_model, m_ColumnsTabs.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } m_modified = false; } void Dialog_Notebook::enable_buttons() { //Fields: Glib::RefPtr refSelection = m_treeview->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { //Disable Up if It can't go any higher. bool enable_up = true; if(iter == m_model->children().begin()) enable_up = false; //It can't go any higher. m_button_up->set_sensitive(enable_up); //Disable Down if It can't go any lower. Gtk::TreeModel::iterator iterNext = iter; iterNext++; bool enable_down = true; if(iterNext == m_model->children().end()) enable_down = false; m_button_down->set_sensitive(enable_down); m_button_delete->set_sensitive(true); } else { //Disable all buttons that act on a selection: m_button_down->set_sensitive(false); m_button_up->set_sensitive(false); m_button_delete->set_sensitive(false); } } } void Dialog_Notebook::on_button_up() { move_treeview_selection_up(m_treeview, m_ColumnsTabs.m_col_sequence); } void Dialog_Notebook::on_button_down() { move_treeview_selection_down(m_treeview, m_ColumnsTabs.m_col_sequence); } sharedptr Dialog_Notebook::get_notebook() const { sharedptr result = glom_sharedptr_clone(m_layout_item); result->remove_all_items(); for(Gtk::TreeModel::iterator iterFields = m_model->children().begin(); iterFields != m_model->children().end(); ++iterFields) { Gtk::TreeModel::Row row = *iterFields; const Glib::ustring name = row[m_ColumnsTabs.m_col_name]; if(!name.empty()) { sharedptr item = row[m_ColumnsTabs.m_col_item]; sharedptr group_copy; if(item) group_copy = glom_sharedptr_clone(item); else group_copy = sharedptr::create(); group_copy->set_name(name); group_copy->set_title( row[m_ColumnsTabs.m_col_title] , AppWindow::get_current_locale()); //group_copy->set_sequence( row[m_ColumnsTabs.m_col_sequence] ); result->add_item(group_copy); } } return result; } void Dialog_Notebook::on_treeview_selection_changed() { enable_buttons(); } void Dialog_Notebook::on_button_add() { //Add the field details to the layout treeview: Gtk::TreeModel::iterator iter = m_model->append(); if(iter) { //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview->scroll_to_row( Gtk::TreeModel::Path(iter) ); treeview_fill_sequences(m_model, m_ColumnsTabs.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } } void Dialog_Notebook::on_button_delete() { Glib::RefPtr refTreeSelection = m_treeview->get_selection(); if(refTreeSelection) { //TODO: Handle multiple-selection: Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { m_model->erase(iter); m_modified = true; } } } } //namespace Glom glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.h0000644000175000017500000000501412234252646030067 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_NOTEBOOK_H #define GLOM_MODE_DESIGN_DIALOG_NOTEBOOK_H #include #include #include #include namespace Glom { class Dialog_Notebook : public Dialog_Layout //It has some useful stuff { public: static const char* glade_id; static const bool glade_developer; Dialog_Notebook(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Notebook(); void set_notebook(const sharedptr& start_notebook); sharedptr get_notebook() const; private: //Enable/disable buttons, depending on treeview selection: virtual void enable_buttons(); //signal handlers: virtual void on_button_up(); virtual void on_button_down(); virtual void on_button_add(); virtual void on_button_delete(); virtual void on_treeview_selection_changed(); //Tree model columns: class ModelColumns_Tabs : public Gtk::TreeModel::ColumnRecord { public: ModelColumns_Tabs() { add(m_col_name); add(m_col_title); add(m_col_sequence); add(m_col_item); } Gtk::TreeModelColumn m_col_name; Gtk::TreeModelColumn m_col_title; Gtk::TreeModelColumn m_col_sequence; Gtk::TreeModelColumn< sharedptr > m_col_item; }; ModelColumns_Tabs m_ColumnsTabs; //Tree model columns: Gtk::TreeView* m_treeview; Gtk::Button* m_button_up; Gtk::Button* m_button_down; Gtk::Button* m_button_add; Gtk::Button* m_button_delete; Glib::RefPtr m_model; sharedptr m_layout_item; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_NOTEBOOK_H glom-1.22.4/glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc0000644000175000017500000000372512234776363030575 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_formatting.h" #include #include #include #include namespace Glom { Dialog_Formatting::Dialog_Formatting() : m_box_formatting(0) { set_title(_("Formatting")); set_border_width(6); //Get the formatting stuff: Utils::get_glade_child_widget_derived_with_warning(m_box_formatting); get_content_area()->pack_start(*m_box_formatting, Gtk::PACK_EXPAND_WIDGET); add_view(m_box_formatting); add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); show_all_children(); } Dialog_Formatting::~Dialog_Formatting() { remove_view(m_box_formatting); } void Dialog_Formatting::set_item(const sharedptr& layout_item, bool show_numeric) { m_box_formatting->set_formatting_for_non_field(layout_item->m_formatting, show_numeric); enforce_constraints(); } void Dialog_Formatting::use_item_chosen(const sharedptr& layout_item) { if(!layout_item) return; m_box_formatting->get_formatting(layout_item->m_formatting); } void Dialog_Formatting::enforce_constraints() { } } //namespace Glom glom-1.22.4/glom/mode_design/layout/dialog_choose_field.h0000644000175000017500000000623312234252646024641 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_CHOOSE_FIELD_H #define GLOM_MODE_DESIGN_DIALOG_CHOOSE_FIELD_H #include #include #include #include #include #include #include namespace Glom { class Dialog_ChooseField : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; Dialog_ChooseField(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ChooseField(); /** * @param document The document, so that the dialog can load the previous layout, and save changes. * @param table_name The table name. * @param field The starting field information. */ virtual void set_document(Document* document, const Glib::ustring& table_name, const sharedptr& field); virtual void set_document(Document* document, const Glib::ustring& table_name); //void select_item(const sharedptr& field); sharedptr get_field_chosen() const; typedef std::list< sharedptr > type_list_field_items; type_list_field_items get_fields_chosen() const; private: virtual void on_row_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* view_column); virtual void on_treeview_selection_changed(); virtual void on_combo_relationship_changed(); virtual void on_checkbutton_related_relationships_toggled(); //Tree model columns: class ModelColumns_Fields : public Gtk::TreeModel::ColumnRecord { public: ModelColumns_Fields() { add(m_col_name); add(m_col_title); add(m_col_field); } Gtk::TreeModelColumn m_col_name; Gtk::TreeModelColumn m_col_title; Gtk::TreeModelColumn< sharedptr > m_col_field; }; ModelColumns_Fields m_ColumnsFields; ComboBox_Relationship* m_combo_relationship; Gtk::Button* m_button_select; Gtk::CheckButton* m_checkbutton_show_related_relationships; Gtk::TreeView* m_treeview; Glib::RefPtr m_model; Glib::ustring m_table_name; sharedptr m_start_field; //stored so we can preserve extra information that's not changed here. Document* m_document; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_CHOOSE_FIELD_H glom-1.22.4/glom/mode_design/layout/dialog_layout_details.cc0000644000175000017500000013761612234252646025410 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include //For show_ok_dialog() //#include #include //For bold_message()). #include #include #include //For stringstream namespace Glom { const char* Dialog_Layout_Details::glade_id("window_data_layout"); const bool Dialog_Layout_Details::glade_developer(true); Dialog_Layout_Details::Dialog_Layout_Details(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Layout(cobject, builder), m_treeview_fields(0), m_treeview_column_title(0), m_treeview_column_group_columns(0), m_treeview_column_column_width(0), m_box_table_widgets(0), m_box_related_table_widgets(0), m_box_related_navigation(0), m_button_up(0), m_button_down(0), m_button_add_field(0), m_button_add_group(0), m_button_add_notebook(0), m_button_add_related(0), m_button_add_related_calendar(0), m_button_add_button(0), m_button_add_text(0), m_button_add_image(0), m_button_field_delete(0), m_button_formatting(0), m_button_edit(0), m_label_table_name(0), m_hbox_rows_count(0), m_spinbutton_rows_count_min(0), m_spinbutton_rows_count_max(0) { // Get the alternate sets of widgets, only one of which should be shown: // Derived classes will hide one and show the other: builder->get_widget("hbox_table_widgets", m_box_table_widgets); m_box_table_widgets->show(); builder->get_widget("hbox_related_table_widgets", m_box_related_table_widgets); m_box_related_table_widgets->hide(); builder->get_widget("frame_related_table_navigation", m_box_related_navigation); m_box_related_navigation->hide(); builder->get_widget("frame_lines", m_box_frame_lines); m_box_frame_lines->hide(); Gtk::Frame* box_calendar = 0; builder->get_widget("frame_calendar", box_calendar); box_calendar->hide(); builder->get_widget("label_table_name", m_label_table_name); //This is only shown in Dialog_Layout_List_Related: builder->get_widget("hbox_rows_count", m_hbox_rows_count); builder->get_widget("spinbutton_rows_count_min", m_spinbutton_rows_count_min); builder->get_widget("spinbutton_rows_count_max", m_spinbutton_rows_count_max); m_hbox_rows_count->hide(); builder->get_widget("treeview_fields", m_treeview_fields); if(m_treeview_fields) { m_treeview_fields->set_reorderable(); m_treeview_fields->enable_model_drag_source(); m_treeview_fields->enable_model_drag_dest(); m_model_items = TreeStore_Layout::create(); m_treeview_fields->set_model(m_model_items); // Append the View columns: // Use set_cell_data_func() to give more control over the cell attributes depending on the row: //Name column: Gtk::TreeView::Column* column_name = Gtk::manage( new Gtk::TreeView::Column(_("Name")) ); m_treeview_fields->append_column(*column_name); Gtk::CellRendererText* renderer_name = Gtk::manage(new Gtk::CellRendererText); column_name->pack_start(*renderer_name); column_name->set_cell_data_func(*renderer_name, sigc::mem_fun(*this, &Dialog_Layout_Details::on_cell_data_name)); //Connect to its signal: renderer_name->property_editable() = true; renderer_name->signal_edited().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_treeview_cell_edited_name) ); //Title column: m_treeview_column_title = Gtk::manage( new Gtk::TreeView::Column(_("Title")) ); m_treeview_fields->append_column(*m_treeview_column_title); Gtk::CellRendererText* renderer_title = Gtk::manage(new Gtk::CellRendererText); m_treeview_column_title->pack_start(*renderer_title); m_treeview_column_title->set_cell_data_func(*renderer_title, sigc::mem_fun(*this, &Dialog_Layout_Details::on_cell_data_title)); //Connect to its signal: renderer_title->signal_edited().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_treeview_cell_edited_title) ); //Columns-count column: //Note to translators: This is the number of columns in a group (group being a noun) m_treeview_column_group_columns = Gtk::manage( new Gtk::TreeView::Column(_("Group Columns")) ); m_treeview_fields->append_column(*m_treeview_column_group_columns); Gtk::CellRendererText* renderer_count = Gtk::manage(new Gtk::CellRendererText); m_treeview_column_group_columns->pack_start(*renderer_count); m_treeview_column_group_columns->set_cell_data_func(*renderer_count, sigc::mem_fun(*this, &Dialog_Layout_Details::on_cell_data_group_columns)); //Connect to its signal: renderer_count->signal_edited().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_treeview_cell_edited_group_columns) ); //Column-Width column: (only for list views) //Note to translators: This is a name (the width of a UI element in the display), not an action. m_treeview_column_column_width = Gtk::manage( new Gtk::TreeView::Column(_("Display Width")) ); m_treeview_fields->append_column(*m_treeview_column_column_width); Gtk::CellRendererText* renderer_column_width = Gtk::manage(new Gtk::CellRendererText); m_treeview_column_column_width->pack_start(*renderer_column_width); m_treeview_column_column_width->set_cell_data_func(*renderer_column_width, sigc::mem_fun(*this, &Dialog_Layout_Details::on_cell_data_column_width)); //Connect to its signal: renderer_column_width->signal_edited().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_treeview_cell_edited_column_width) ); //Hide this column because we don't need it for the details layout. //It is made visible by the (derived) list layout class. m_treeview_column_column_width->set_visible(false); //Respond to changes of selection: Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { refSelection->signal_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_treeview_fields_selection_changed) ); } m_model_items->signal_row_changed().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_treemodel_row_changed) ); } builder->get_widget("button_up", m_button_up); m_button_up->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_up) ); builder->get_widget("button_down", m_button_down); m_button_down->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_down) ); builder->get_widget("button_field_delete", m_button_field_delete); m_button_field_delete->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_field_delete) ); builder->get_widget("button_formatting", m_button_formatting); m_button_formatting->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_formatting) ); builder->get_widget("button_add_field", m_button_add_field); m_button_add_field->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_add_field) ); builder->get_widget("button_add_group", m_button_add_group); m_button_add_group->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_add_group) ); builder->get_widget("button_add_notebook", m_button_add_notebook); m_button_add_notebook->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_add_notebook) ); builder->get_widget("button_add_related", m_button_add_related); m_button_add_related->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_add_related) ); builder->get_widget("button_add_related_calendar", m_button_add_related_calendar); m_button_add_related_calendar->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_add_related_calendar) ); builder->get_widget("button_add_button", m_button_add_button); m_button_add_button->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_add_button) ); builder->get_widget("button_add_text", m_button_add_text); m_button_add_text->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_add_text) ); builder->get_widget("button_add_image", m_button_add_image); m_button_add_image->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_add_image) ); builder->get_widget("button_edit", m_button_edit); m_button_edit->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Layout_Details::on_button_edit) ); //show_all_children(); } Dialog_Layout_Details::~Dialog_Layout_Details() { } void Dialog_Layout_Details::fill_group(const Gtk::TreeModel::iterator& iter, sharedptr& group) { sharedptr portal = sharedptr::cast_dynamic(group); if(portal) return; //This method is not for portals. if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item_top = row[m_model_items->m_columns.m_col_layout_item]; sharedptr group_row = sharedptr::cast_dynamic(layout_item_top); if(!group_row) return; sharedptr portal_row = sharedptr::cast_dynamic(group_row); if(portal_row) //This is only for groups. return; *group = *group_row; //Copy name, title, columns count, etc. group->remove_all_items(); //Remove the copied child items, if any, so we can add them. //Get child layout items: for(Gtk::TreeModel::iterator iterChild = row.children().begin(); iterChild != row.children().end(); ++iterChild) { Gtk::TreeModel::Row rowChild = *iterChild; sharedptr layout_item = rowChild[m_model_items->m_columns.m_col_layout_item]; sharedptr layout_portal = sharedptr::cast_dynamic(layout_item); if(layout_portal) { //std::cout << "debug: " << G_STRFUNC << ": adding portal." << std::endl; group->add_item(glom_sharedptr_clone(layout_portal)); } else { //std::cout << "debug: " << G_STRFUNC << ": adding group." << std::endl; sharedptr layout_group = sharedptr::cast_dynamic(layout_item); sharedptr layout_portal = sharedptr::cast_dynamic(layout_group); if(layout_group && !layout_portal) { //Recurse: sharedptr group_child = glom_sharedptr_clone(layout_group); fill_group(iterChild, group_child); group->add_item(group_child); } else if(layout_item) { //std::cout << "debug: " << G_STRFUNC << ": adding item." << std::endl; //Add field or button: sharedptr item = glom_sharedptr_clone(layout_item); group->add_item(item); } } } } } void Dialog_Layout_Details::add_group(const Gtk::TreeModel::iterator& parent, const sharedptr& group) { if(!group) return; sharedptr portal = sharedptr::cast_dynamic(group); if(portal) return; //This method is not for portals. Gtk::TreeModel::iterator iterNewGroup; if(!parent) { //Add it at the top-level, because nothing was selected: iterNewGroup = m_model_items->append(); } else { iterNewGroup = m_model_items->append(parent->children()); } if(iterNewGroup) { Gtk::TreeModel::Row rowGroup = *iterNewGroup; sharedptr group_inserted = glom_sharedptr_clone(group); group_inserted->remove_all_items(); rowGroup[m_model_items->m_columns.m_col_layout_item] = group_inserted; //Add the child items: (TODO_Performance: The child items are ignored/wasted because we clone them again.) LayoutGroup::type_list_const_items items = group->get_items(); for(LayoutGroup::type_list_const_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr item = *iter; sharedptr portal = sharedptr::cast_dynamic(item); if(portal) //If it is a portal { //Handle this differently to regular groups, so we do not also add its children: Gtk::TreeModel::iterator iter = m_model_items->append(iterNewGroup->children()); Gtk::TreeModel::Row row = *iter; row[m_model_items->m_columns.m_col_layout_item] = glom_sharedptr_clone(portal); } else { sharedptr child_group = sharedptr::cast_dynamic(item); if(child_group) //If it is a group: add_group(iterNewGroup, child_group); //recursive else { //Add the item to the treeview: Gtk::TreeModel::iterator iter = m_model_items->append(iterNewGroup->children()); Gtk::TreeModel::Row row = *iter; row[m_model_items->m_columns.m_col_layout_item] = glom_sharedptr_clone(item); } } } m_modified = true; } } void Dialog_Layout_Details::init(const Glib::ustring& layout_name, const Glib::ustring& layout_platform, Document* document, const Glib::ustring& table_name, const type_vecConstLayoutFields& table_fields) { m_modified = false; Dialog_Layout::init(layout_name, layout_platform, document, table_name, table_fields); //Update the tree models from the document if(document) { //Set the table name and title: m_label_table_name->set_text(table_name); m_entry_table_title->set_text( document->get_table_title(table_name, AppWindow::get_current_locale()) ); Document::type_list_layout_groups list_groups = document->get_data_layout_groups_plus_new_fields(m_layout_name, m_table_name, m_layout_platform); document->fill_layout_field_details(m_table_name, list_groups); //Update with full field information. //If no information is stored in the document, add a default group if(list_groups.empty()) { sharedptr group = sharedptr::create(); group->set_name("main"); group->set_columns_count(1); list_groups.push_back(group); } //Show the field layout //typedef std::list< Glib::ustring > type_listStrings; m_model_items->clear(); for(Document::type_list_layout_groups::const_iterator iter = list_groups.begin(); iter != list_groups.end(); ++iter) { sharedptr group = *iter; sharedptr portal = sharedptr::cast_dynamic(group); if(group && !portal) add_group(Gtk::TreeModel::iterator() /* null == top-level */, group); } //treeview_fill_sequences(m_model_items, m_model_items->m_columns.m_col_sequence); //The document should have checked this already, but it does not hurt to check again. } //Open all the groups: m_treeview_fields->expand_all(); m_modified = false; } void Dialog_Layout_Details::enable_buttons() { //Fields: Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { //Disable Up if It can't go any higher. bool enable_up = true; Gtk::TreeModel::iterator iterParent = iter->parent(); if(iterParent) { //See whether it is the last child of its parent: if(iter == iterParent->children().begin()) enable_up = false; } else { //It is at the top-level: if(iter == m_model_items->children().begin()) enable_up = false; //It can't go any higher. } m_button_up->set_sensitive(enable_up); //Disable Down if It can't go any lower. Gtk::TreeModel::iterator iterNext = iter; iterNext++; bool enable_down = true; if(iterParent) { //See whether it is the last child of its parent: if(iterNext == iterParent->children().end()) enable_down = false; } else { //It is at the top-level: if(iterNext == m_model_items->children().end()) enable_down = false; } m_button_down->set_sensitive(enable_down); m_button_field_delete->set_sensitive(true); //Only some items have formatting: sharedptr layout_item = (*iter)[m_model_items->m_columns.m_col_layout_item]; sharedptr layoutitem_withformatting = sharedptr::cast_dynamic(layout_item); const bool is_field = layoutitem_withformatting; m_button_formatting->set_sensitive(is_field); } else { //Disable all buttons that act on a selection: m_button_down->set_sensitive(false); m_button_up->set_sensitive(false); m_button_field_delete->set_sensitive(false); m_button_formatting->set_sensitive(false); } } } void Dialog_Layout_Details::on_button_field_delete() { Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { m_model_items->erase(iter); m_modified = true; } } } void Dialog_Layout_Details::on_button_up() { Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { Gtk::TreeModel::iterator parent = iter->parent(); bool is_first = false; if(parent) is_first = (iter == parent->children().begin()); else is_first = (iter == m_model_items->children().begin()); if(!is_first) { Gtk::TreeModel::iterator iterBefore = iter; --iterBefore; m_model_items->iter_swap(iter, iterBefore); m_modified = true; } } } enable_buttons(); } void Dialog_Layout_Details::on_button_down() { Glib::RefPtr refSelection = m_treeview_fields->get_selection(); if(refSelection) { Gtk::TreeModel::iterator iter = refSelection->get_selected(); if(iter) { Gtk::TreeModel::iterator iterNext = iter; iterNext++; Gtk::TreeModel::iterator parent = iter->parent(); bool is_last = false; if(parent) is_last = (iterNext == parent->children().end()); else is_last = (iterNext == m_model_items->children().end()); if(!is_last) { //Swap the sequence values, so that the one before will be after: m_model_items->iter_swap(iter, iterNext); m_modified = true; } } } enable_buttons(); } void Dialog_Layout_Details::on_button_add_field() { type_list_field_items fields_list = offer_field_list(m_table_name, this); for(type_list_field_items::iterator iter_chosen = fields_list.begin(); iter_chosen != fields_list.end(); ++iter_chosen) { sharedptr layout_item = *iter_chosen; if(!layout_item) continue; //Add the field details to the layout treeview: Gtk::TreeModel::iterator iter = append_appropriate_row(); if(iter) { Gtk::TreeModel::Row row = *iter; row[m_model_items->m_columns.m_col_layout_item] = glom_sharedptr_clone(layout_item); //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); m_modified = true; } } enable_buttons(); } sharedptr Dialog_Layout_Details::offer_button_script_edit(const sharedptr& button) { sharedptr result; Dialog_ButtonScript* dialog = 0; Glom::Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; dialog->set_script(button, m_table_name); dialog->set_transient_for(*this); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: result = dialog->get_script(); } delete dialog; return result; } sharedptr Dialog_Layout_Details::offer_relationship_list() { return offer_relationship_list(sharedptr()); } sharedptr Dialog_Layout_Details::offer_relationship_list(const sharedptr& item) { sharedptr result = glom_sharedptr_clone(item); Dialog_ChooseRelationship* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; dialog->set_document(get_document(), m_table_name); dialog->select_item(item); dialog->set_transient_for(*this); const int response = dialog->run(); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: result = dialog->get_relationship_chosen(); } delete dialog; return result; } Gtk::TreeModel::iterator Dialog_Layout_Details::append_appropriate_row() { Gtk::TreeModel::iterator result; Gtk::TreeModel::iterator parent = get_selected_group_parent(); //Add the field details to the layout treeview: if(parent) { result = m_model_items->append(parent->children()); } else { //Find the first group, and make the new row a child of that: Gtk::TreeModel::iterator iter_first = m_model_items->children().begin(); if(iter_first) { Gtk::TreeModel::Row row = *iter_first; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr layout_group = sharedptr::cast_dynamic(layout_item); sharedptr layout_portal = sharedptr::cast_dynamic(layout_item); if(layout_group && !layout_portal) result = m_model_items->append(iter_first->children()); } if(!result) { //For instance, for a Dialog_Layout_List_Related derived class, with a portal as the top-level group: result = m_model_items->append(); } } return result; } void Dialog_Layout_Details::on_button_add_button() { Gtk::TreeModel::iterator iter = append_appropriate_row(); if(iter) { Gtk::TreeModel::Row row = *iter; //Add a new button: sharedptr button = sharedptr::create(); button->set_title_original(_("New Button")); //Give the button a default title, so it is big enough, and so people see that they should change it. row[m_model_items->m_columns.m_col_layout_item] = button; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); m_modified = true; } enable_buttons(); } void Dialog_Layout_Details::on_button_add_text() { Gtk::TreeModel::iterator iter = append_appropriate_row(); if(iter) { Gtk::TreeModel::Row row = *iter; //Add a new button: sharedptr textobject = sharedptr::create(); textobject->set_title_original(_("Text Title")); //Give the button a default title, so it is big enough, and so people see that they should change it. row[m_model_items->m_columns.m_col_layout_item] = textobject; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); m_modified = true; } enable_buttons(); } void Dialog_Layout_Details::on_button_add_image() { Gtk::TreeModel::iterator iter = append_appropriate_row(); if(iter) { Gtk::TreeModel::Row row = *iter; //Add a new button: sharedptr imageobject = sharedptr::create(); imageobject->set_title_original(_("Image Title")); //Give the item a default title, so it is big enough, and so people see that they should change it. row[m_model_items->m_columns.m_col_layout_item] = imageobject; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); m_modified = true; } enable_buttons(); } void Dialog_Layout_Details::on_button_add_notebook() { Gtk::TreeModel::iterator iter = append_appropriate_row(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr notebook = sharedptr::create(); notebook->set_name(_("notebook")); row[m_model_items->m_columns.m_col_layout_item] = notebook; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); m_modified = true; } enable_buttons(); } void Dialog_Layout_Details::on_button_add_related() { /* We don't need to ask this because the portal layout dialog can now handle an empty portal: sharedptr relationship = offer_relationship_list(); if(relationship) { */ Gtk::TreeModel::iterator iter = append_appropriate_row(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr portal = sharedptr::create(); //portal->set_relationship(relationship); row[m_model_items->m_columns.m_col_layout_item] = portal; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); m_modified = true; } /* } */ enable_buttons(); } void Dialog_Layout_Details::on_button_add_related_calendar() { /* We don't need to ask this because the portal layout dialog can now handle an empty portal: sharedptr relationship = offer_relationship_list(); if(relationship) { */ Gtk::TreeModel::iterator iter = append_appropriate_row(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr portal = sharedptr::create(); //portal->set_relationship(relationship); row[m_model_items->m_columns.m_col_layout_item] = portal; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iter); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iter) ); m_modified = true; } //} enable_buttons(); } Gtk::TreeModel::iterator Dialog_Layout_Details::get_selected_group_parent() const { //Get the selected group, or a suitable parent group, or the first group: Gtk::TreeModel::iterator parent; Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr layout_group = sharedptr::cast_dynamic(layout_item); sharedptr layout_portal = sharedptr::cast_dynamic(layout_item); if(layout_group && !layout_portal) { //Add a group under this group: parent = iter; } else { //Add a group under this item's group: parent = iter->parent(); } } } return parent; } void Dialog_Layout_Details::on_button_add_group() { Gtk::TreeModel::iterator parent = get_selected_group_parent(); Gtk::TreeModel::iterator iterNewGroup; if(!parent) { //Add it at the top-level, because nothing was selected: iterNewGroup = m_model_items->append(); } else { iterNewGroup = m_model_items->append(parent->children()); } if(iterNewGroup) { Gtk::TreeModel::Row row = *iterNewGroup; sharedptr layout_item = sharedptr::create(); layout_item->set_name(_("group")); row[m_model_items->m_columns.m_col_layout_item] = layout_item; //Scroll to, and select, the new row: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) refTreeSelection->select(iterNewGroup); m_treeview_fields->scroll_to_row( Gtk::TreeModel::Path(iterNewGroup) ); m_modified = true; } enable_buttons(); } void Dialog_Layout_Details::on_button_formatting() { //TODO: Abstract this into the base class: //Get the selected item: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr field = sharedptr::cast_dynamic(layout_item); if(field) { //Handle field formatting, which includes more than the generic formatting stuff: sharedptr chosenitem = offer_field_formatting(field, get_fields_table(), this, m_editable_layout); if(chosenitem) { *field = *chosenitem; //TODO_Performance. m_modified = true; //m_model_parts->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm? } } else { //Handle any other items that can have formatting: sharedptr withformatting = sharedptr::cast_dynamic(layout_item); if(withformatting) { const bool changed = offer_non_field_item_formatting(withformatting, this); if(changed) m_modified = true; } } } } } void Dialog_Layout_Details::on_button_edit() { //Get the selected item: Glib::RefPtr refTreeSelection = m_treeview_fields->get_selection(); if(refTreeSelection) { Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) { //Do something different for each type of item: //This is unpleasant, but so is this whole dialog. //This whole dialog is just a temporary way to edit the layout before we have a visual DnD way. Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr layout_portal = sharedptr::cast_dynamic(layout_item); if(layout_portal) { sharedptr relationship = offer_relationship_list(layout_portal->get_relationship()); if(relationship) { layout_portal->set_relationship(relationship); //This is unnecessary and seems to cause a crash. //row[m_model_items->m_columns.m_col_layout_item] = layout_portal; m_modified = true; } } else { sharedptr layout_notebook = sharedptr::cast_dynamic(layout_item); if(layout_notebook) { Frame_Glom::show_ok_dialog(_("Notebook Tabs"), _("Add child groups to the notebook to add tabs."), *this); /* sharedptr chosen = offer_notebook(layout_notebook); if(chosen) { row[m_model_items->m_columns.m_col_layout_item] = chosen; m_modified = true; } */ } else { sharedptr layout_group = sharedptr::cast_dynamic(layout_item); if(layout_group) { Gtk::TreeModel::Path path = m_model_items->get_path(iter); m_treeview_fields->set_cursor(path, *m_treeview_column_title, true /* start_editing */); } else { sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); if(layout_item_field) { sharedptr chosenitem = offer_field_list_select_one_field(layout_item_field, m_table_name, this); if(chosenitem) { *layout_item_field = *chosenitem; //row[m_model_items->m_columns.m_col_layout_item] = chosenitem; m_modified = true; } } else { sharedptr layout_item_button = sharedptr::cast_dynamic(layout_item); if(layout_item_button) { sharedptr chosen = offer_button_script_edit(layout_item_button); if(chosen) { *layout_item_button = *chosen; //std::cout << "script: " << layout_item_button->get_script() << std::endl; m_modified = true; } } else { sharedptr layout_item_text = sharedptr::cast_dynamic(layout_item); if(layout_item_text) { sharedptr chosen = offer_textobject(layout_item_text); if(chosen) { *layout_item_text = *chosen; //std::cout << "script: " << layout_item_button->get_script() << std::endl; m_modified = true; } } else { sharedptr layout_item_image = sharedptr::cast_dynamic(layout_item); if(layout_item_image) { sharedptr chosen = offer_imageobject(layout_item_image); if(chosen) { *layout_item_image = *chosen; //std::cout << "script: " << layout_item_button->get_script() << std::endl; m_modified = true; } } } } } } } } if(m_modified) { Gtk::TreeModel::Path path = m_model_items->get_path(iter); m_model_items->row_changed(path, iter); } } } } void Dialog_Layout_Details::save_to_document() { Dialog_Layout::save_to_document(); if(m_modified) { //Set the table name and title: Document* document = get_document(); if(document) document->set_table_title( m_table_name, m_entry_table_title->get_text(), AppWindow::get_current_locale()); //Get the data from the TreeView and store it in the document: //Fill the sequences: //(This model is not sorted - we need to set the sequence numbers based on the order). m_model_items->fill_sequences(); //Get the groups and their fields: Document::type_list_layout_groups list_groups; //Add the layout items: for(Gtk::TreeModel::iterator iterFields = m_model_items->children().begin(); iterFields != m_model_items->children().end(); ++iterFields) { Gtk::TreeModel::Row row = *iterFields; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr layout_group = sharedptr::cast_dynamic(layout_item); sharedptr layout_portal = sharedptr::cast_dynamic(layout_item); if(layout_group && !layout_portal) //There may be top-level groups, but no top-level fields, because the fields must be in a group (so that they are in columns) { sharedptr group = sharedptr::create(); fill_group(iterFields, group); list_groups.push_back(group); } } if(document) { document->set_data_layout_groups(m_layout_name, m_table_name, m_layout_platform, list_groups); m_modified = false; } } } void Dialog_Layout_Details::on_treeview_fields_selection_changed() { enable_buttons(); } void Dialog_Layout_Details::on_cell_data_name(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //TODO: If we ever use this a real layout tree, then let's add icons for each type. //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; //Use the markup property instead of the text property, so that we can give the text some style: Glib::ustring markup; bool is_group = false; sharedptr layout_portal = sharedptr::cast_dynamic(layout_item); if(layout_portal) { sharedptr layout_calendar = sharedptr::cast_dynamic(layout_portal); if(layout_calendar) markup = Glib::ustring::compose(_("Related Calendar: %1"), layout_portal->get_relationship_name()); else markup = Glib::ustring::compose(_("Related List: %1"), layout_portal->get_relationship_name()); } else { sharedptr layout_group = sharedptr::cast_dynamic(layout_item); if(layout_group) { is_group = true; //Make group names bold: markup = Utils::bold_message( layout_item->get_name() ); } else { sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); if(layout_item_field) { markup = Glib::ustring::compose(_("Field: %1"), layout_item_field->get_layout_display_name()); //Just for debugging: //if(!row[m_model_items->m_columns.m_col_editable]) // markup += " *"; } else { sharedptr layout_item_button = sharedptr::cast_dynamic(layout_item); if(layout_item_button) { markup = _("Button"); //Buttons don't have names - just titles. TODO: Would they be useful? } else { sharedptr layout_item_text = sharedptr::cast_dynamic(layout_item); if(layout_item_text) { markup = _("Text"); //Text objects don't have names - just titles. TODO: Would they be useful? } else { sharedptr layout_item_image = sharedptr::cast_dynamic(layout_item); if(layout_item_image) { markup = _("Image"); //Image objects don't have names - just titles. TODO: Would they be useful? } else if(layout_item) markup = layout_item->get_name(); else markup = Glib::ustring(); } } } } } renderer_text->property_markup() = markup; if(is_group) renderer_text->property_editable() = true; //Group names can be changed. else renderer_text->property_editable() = false; //Field names can never be edited. } } } void Dialog_Layout_Details::on_cell_data_title(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr layout_notebook = sharedptr::cast_dynamic(layout_item); if(layout_notebook) renderer_text->property_text() = _("(Notebook)"); else if(layout_item) renderer_text->property_text() = item_get_title(layout_item); else renderer_text->property_text() = Glib::ustring(); sharedptr layout_group = sharedptr::cast_dynamic(layout_item); sharedptr layout_portal = sharedptr::cast_dynamic(layout_item); sharedptr layout_button = sharedptr::cast_dynamic(layout_item); sharedptr layout_text = sharedptr::cast_dynamic(layout_item); const bool editable = (layout_group && !layout_portal) || layout_button || layout_text; //Only groups, buttons, and text objects have titles that can be edited. renderer_text->property_editable() = editable; } } } void Dialog_Layout_Details::on_cell_data_column_width(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; guint column_width = 0; if(layout_item) { sharedptr layout_button = sharedptr::cast_dynamic(layout_item); sharedptr layout_text = sharedptr::cast_dynamic(layout_item); sharedptr layout_field = sharedptr::cast_dynamic(layout_item); const bool editable = (layout_field || layout_button || layout_text); //Only these have column widths that can be edited. renderer_text->property_editable() = editable; column_width = layout_item->get_display_width(); } Glib::ustring text; if(column_width) //Show nothing if no width has been specified, meaning that it's automatic. text = Utils::string_from_decimal(column_width); renderer_text->property_text() = text; } } } void Dialog_Layout_Details::on_cell_data_group_columns(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr layout_group = sharedptr::cast_dynamic(layout_item); sharedptr layout_portal = sharedptr::cast_dynamic(layout_item); const bool is_group = layout_group && !layout_portal; //Only groups have column_counts. //Get a text representation of the number: Glib::ustring text; if(is_group) { text = Utils::string_from_decimal(layout_group->get_columns_count()); } else { //Show nothing in the columns_count columns for fields. } renderer_text->property_text() = text; renderer_text->property_editable() = is_group; } } } void Dialog_Layout_Details::on_treeview_cell_edited_title(const Glib::ustring& path_string, const Glib::ustring& new_text) { if(!path_string.empty()) { Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_model_items->get_iter(path); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; if(layout_item) { //Store the user's new text in the model: layout_item->set_title(new_text, AppWindow::get_current_locale()); m_modified = true; } } } } void Dialog_Layout_Details::on_treeview_cell_edited_name(const Glib::ustring& path_string, const Glib::ustring& new_text) { if(!path_string.empty()) { Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_model_items->get_iter(path); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; if(layout_item) { //Store the user's new text in the model: layout_item->set_name(new_text); m_modified = true; } } } } void Dialog_Layout_Details::on_treeview_cell_edited_column_width(const Glib::ustring& path_string, const Glib::ustring& new_text) { if(!path_string.empty()) { Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_model_items->get_iter(path); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; if(layout_item) { //Convert the text to a number, using the same logic used by GtkCellRendererText when it stores numbers. char* pchEnd = 0; const guint new_value = static_cast( strtod(new_text.c_str(), &pchEnd) ); //Store the user's new value in the model: layout_item->set_display_width(new_value); m_modified = true; } } } } void Dialog_Layout_Details::on_treeview_cell_edited_group_columns(const Glib::ustring& path_string, const Glib::ustring& new_text) { //This is used on numerical model columns: if(path_string.empty()) return; Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_model_items->get_iter(path); if(iter) { Gtk::TreeModel::Row row = *iter; sharedptr layout_item = row[m_model_items->m_columns.m_col_layout_item]; sharedptr layout_group = sharedptr::cast_dynamic(layout_item); sharedptr layout_portal = sharedptr::cast_dynamic(layout_item); if(layout_group && !layout_portal) { //std::istringstream astream(new_text); //Put it in a stream. //ColumnType new_value = ColumnType(); //new_value << astream; //Get it out of the stream as the numerical type. //Convert the text to a number, using the same logic used by GtkCellRendererText when it stores numbers. char* pchEnd = 0; guint new_value = static_cast( strtod(new_text.c_str(), &pchEnd) ); //Don't allow a 0 columns_count: if(new_value == 0) new_value = 1; //Store the user's new text in the model: layout_group->set_columns_count(new_value); m_modified = true; } } } Glib::ustring Dialog_Layout_Details::get_fields_table() const { return m_table_name; } } //namespace Glom glom-1.22.4/glom/mode_design/layout/treestore_layout.h0000644000175000017500000000355712234252646024316 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_TREESTORE_LAYOUT_H #define GLOM_MODE_DESIGN_TREESTORE_LAYOUT_H #include #include #include namespace Glom { class TreeStore_Layout : public Gtk::TreeStore { private: TreeStore_Layout(); public: //Tree model columns: class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_layout_item); add(m_col_sequence); } Gtk::TreeModelColumn< sharedptr > m_col_layout_item; Gtk::TreeModelColumn m_col_sequence; }; ModelColumns m_columns; static Glib::RefPtr create(); virtual void fill_sequences(); virtual void fill_sequences(const iterator& iter); private: //Overridden virtual functions: virtual bool row_draggable_vfunc(const Gtk::TreeModel::Path& path) const; virtual bool row_drop_possible_vfunc(const Gtk::TreeModel::Path& dest, const Gtk::SelectionData& selection_data) const; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_TREESTORE_LAYOUT_H glom-1.22.4/glom/mode_design/translation/0000755000175000017500000000000012235000127021525 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/translation/dialog_change_language.h0000644000175000017500000000260412234252646026325 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_TRANSLATIONS_DIALOG_CHANGE_LANGUAGE_H #define GLOM_TRANSLATIONS_DIALOG_CHANGE_LANGUAGE_H #include "combobox_locale.h" #include #include namespace Glom { /** */ class Dialog_ChangeLanguage : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; Dialog_ChangeLanguage(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ChangeLanguage(); Glib::ustring get_locale() const; private: ComboBox_Locale* m_combo_locale; }; } //namespace Glom #endif //GLOM_TRANSLATIONS_DIALOG_CHANGE_LANGUAGE_H glom-1.22.4/glom/mode_design/translation/window_translations.cc0000644000175000017500000003162712234776363026202 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "window_translations.h" #include "combobox_locale.h" #include "dialog_identify_original.h" #include "dialog_copy_translation.h" #include //For bold_message()). #include #include #include #include #include #include #include #include #include // for memset #include namespace Glom { const char* Window_Translations::glade_id("window_translations"); const bool Window_Translations::glade_developer(true); Window_Translations::Window_Translations(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Window(cobject), m_treeview(0), m_button_identify(0), m_combo_target_locale(0), m_label_source_locale(0), m_button_ok(0), m_button_cancel(0), m_button_import(0), m_button_export(0), m_treeview_modified(false) { builder->get_widget("label_source_locale", m_label_source_locale); builder->get_widget("treeview", m_treeview); if(m_treeview) { m_model = Gtk::ListStore::create(m_columns); m_treeview->set_model(m_model); // Append the View columns: Gtk::TreeView::Column* column_original = Gtk::manage( new Gtk::TreeView::Column(_("Original")) ); m_treeview->append_column(*column_original); Gtk::CellRendererText* renderer_name = Gtk::manage(new Gtk::CellRendererText); column_original->pack_start(*renderer_name); column_original->set_cell_data_func(*renderer_name, sigc::mem_fun(*this, &Window_Translations::on_cell_data_original)); const int col = m_treeview->append_column_editable(_("Translation"), m_columns.m_col_translation); Gtk::CellRendererText* renderer = dynamic_cast(m_treeview->get_column_cell_renderer(col - 1)); if(renderer) renderer->signal_edited().connect(sigc::mem_fun(*this, &Window_Translations::on_treeview_edited)); //This is at the end, because it can contain a long description of the item's context. Gtk::TreeView::Column* column_item_typename = Gtk::manage( new Gtk::TreeView::Column(_("Item")) ); m_treeview->append_column(*column_item_typename); Gtk::CellRendererText* renderer_item_typename = Gtk::manage(new Gtk::CellRendererText); column_item_typename->pack_start(*renderer_item_typename); column_item_typename->set_cell_data_func(*renderer_item_typename, sigc::mem_fun(*this, &Window_Translations::on_cell_data_item_itemhint)); } builder->get_widget("button_identify", m_button_identify); if(m_button_identify) { m_button_identify->signal_clicked().connect( sigc::mem_fun(*this, &Window_Translations::on_button_identify) ); } builder->get_widget_derived("combobox_target_locale", m_combo_target_locale); if(m_combo_target_locale) { m_combo_target_locale->signal_changed().connect(sigc::mem_fun(*this, &Window_Translations::on_combo_target_locale_changed)); } builder->get_widget("button_ok", m_button_ok); if(m_button_ok) { m_button_ok->signal_clicked().connect( sigc::mem_fun(*this, &Window_Translations::on_button_ok) ); } builder->get_widget("button_cancel", m_button_cancel); if(m_button_cancel) { m_button_cancel->signal_clicked().connect( sigc::mem_fun(*this, &Window_Translations::on_button_cancel) ); } builder->get_widget("button_copy_translation", m_button_copy_translation); if(m_button_copy_translation) { m_button_copy_translation->signal_clicked().connect( sigc::mem_fun(*this, &Window_Translations::on_button_copy_translation) ); } builder->get_widget("button_import", m_button_import); if(m_button_import) { m_button_import->signal_clicked().connect( sigc::mem_fun(*this, &Window_Translations::on_button_import) ); } builder->get_widget("button_export", m_button_export); if(m_button_export) { m_button_export->signal_clicked().connect( sigc::mem_fun(*this, &Window_Translations::on_button_export) ); } show_all_children(); //Start with the currently-used/tested translation, if appropriate: if(AppWindow::get_current_locale_not_original()) { m_translation_locale = AppWindow::get_current_locale(); m_combo_target_locale->set_selected_locale(m_translation_locale); //The translations will be shown in the treeview when load_from_document() is called. } else { //Start with _some_ locale, rather than no locale: m_combo_target_locale->set_active(0); } } Window_Translations::~Window_Translations() { } void Window_Translations::enable_buttons() { } void Window_Translations::on_button_identify() { Dialog_IdentifyOriginal* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; add_view(dialog); dialog->load_from_document(); //Doesn't seem to happen otherwise. dialog->set_transient_for(*this); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { get_document()->set_translation_original_locale(dialog->get_locale()); //Save and update: on_combo_target_locale_changed(); } remove_view(dialog); delete dialog; } void Window_Translations::on_cell_data_original(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(renderer_text) { if(iter) { Gtk::TreeModel::Row row = *iter; Glib::ustring text; sharedptr item = row[m_columns.m_col_item]; if(item) text = item->get_title_original(); //Use the name if there is no title: if(text.empty()) text = item->get_name(); //TODO: Mark non-English originals. renderer_text->property_text() = text; renderer_text->property_editable() = false; //Names can never be edited. } } } void Window_Translations::on_cell_data_item_itemhint(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { //Set the view's cell properties depending on the model's data: Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(!renderer_text) return; if(!iter) return; Gtk::TreeModel::Row row = *iter; Glib::ustring item_type_name; sharedptr item = row[m_columns.m_col_item]; const Glib::ustring hint = row[m_columns.m_col_hint]; renderer_text->property_text() = get_po_context_for_item(item, hint); renderer_text->property_editable() = false; //Names can never be edited. } void Window_Translations::load_from_document() { m_model->clear(); //Remove all rows. Document* document = get_document(); if(!document) return; //std::cout << "document->get_translation_original_locale()=" << document->get_translation_original_locale() << std::endl; Glib::ustring original_locale_name = IsoCodes::get_locale_name(document->get_translation_original_locale()); if(original_locale_name.empty()) original_locale_name = _("Unknown"); m_label_source_locale->set_text(original_locale_name); Document::type_list_translatables list_layout_items = document->get_translatable_items(); for(Document::type_list_translatables::iterator iter = list_layout_items.begin(); iter != list_layout_items.end(); ++iter) { sharedptr item = iter->first; if(!item) continue; if(item->get_title_original().empty()) continue; Gtk::TreeModel::iterator iterTree = m_model->append(); Gtk::TreeModel::Row row = *iterTree; row[m_columns.m_col_item] = item; row[m_columns.m_col_translation] = item->get_title_translation(m_translation_locale, false); row[m_columns.m_col_hint] = iter->second; } m_treeview_modified = false; } void Window_Translations::save_to_document() { if(!m_treeview_modified || m_translation_locale.empty()) return; //Look at every item in the treeview and apply its translation: for(Gtk::TreeModel::iterator iter = m_model->children().begin(); iter != m_model->children().end(); ++iter) { Gtk::TreeModel::Row row = *iter; //We have stored a sharedptr to the original item, so we can just change it directly: sharedptr item = row[m_columns.m_col_item]; if(item) { const Glib::ustring translation = row[m_columns.m_col_translation]; item->set_title(translation, m_translation_locale); } } m_treeview_modified = false; set_modified(); //Save to the document. } void Window_Translations::on_button_cancel() { hide(); } void Window_Translations::on_button_ok() { save_to_document(); hide(); } void Window_Translations::on_button_copy_translation() { Dialog_CopyTranslation* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*this); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { const Glib::ustring copy_source_locale = dialog->get_locale(); if(!copy_source_locale.empty()) { //Save and update: on_combo_target_locale_changed(); for(Gtk::TreeModel::iterator iter = m_model->children().begin(); iter != m_model->children().end(); ++iter) { Gtk::TreeModel::Row row = *iter; sharedptr item = row[m_columns.m_col_item]; if(item) { //Copy the translation from the chosen locale to the current locale: const Glib::ustring translation = item->get_title_translation(copy_source_locale); row[m_columns.m_col_translation] = translation; } } //Save and update: m_treeview_modified = true; save_to_document(); } } delete dialog; } void Window_Translations::on_combo_target_locale_changed() { save_to_document(); m_translation_locale = m_combo_target_locale->get_selected_locale(); load_from_document(); } void Window_Translations::on_treeview_edited(const Glib::ustring& /* path */, const Glib::ustring& /* new_text */) { m_treeview_modified = true; } void Window_Translations::on_button_export() { //Show the file-chooser dialog, to select an output .po file: Gtk::FileChooserDialog file_dlg(_("Choose .po File Name"), Gtk::FILE_CHOOSER_ACTION_SAVE); file_dlg.set_transient_for(*this); file_dlg.set_do_overwrite_confirmation(); // Only po files Glib::RefPtr filter = Gtk::FileFilter::create(); filter->set_name(_("Po files")); filter->add_pattern("*.po"); file_dlg.add_filter(filter); file_dlg.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); file_dlg.add_button(_("Export"), Gtk::RESPONSE_OK); const int result = file_dlg.run(); if(result != Gtk::RESPONSE_OK) return; Glib::ustring uri = file_dlg.get_uri(); if(uri.empty()) return; save_to_document(); //Enforce the file extension: const Glib::ustring extension = ".po"; bool add_extension = false; if(uri.size() <= extension.size()) add_extension = true; else if(uri.substr(uri.size() - extension.size()) != extension) add_extension = true; if(add_extension) uri += extension; Glom::write_translations_to_po_file(get_document(), uri, m_translation_locale, IsoCodes::get_locale_name(m_translation_locale)); } void Window_Translations::on_button_import() { Gtk::FileChooserDialog file_dlg(_("Choose .po File Name"), Gtk::FILE_CHOOSER_ACTION_OPEN); file_dlg.set_transient_for(*this); // Only po files Glib::RefPtr filter = Gtk::FileFilter::create(); filter->set_name(_("Po files")); filter->add_pattern("*.po"); file_dlg.add_filter(filter); file_dlg.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); //Note to translators: "Import" here is an action verb - it's a button. file_dlg.add_button(_("Import"), Gtk::RESPONSE_OK); const int result = file_dlg.run(); if(result != Gtk::RESPONSE_OK) return; const std::string uri = file_dlg.get_uri(); if(uri.empty()) return; Glom::import_translations_from_po_file(get_document(), uri, m_translation_locale); //Show the changed document in the UI: load_from_document(); } } //namespace Glom glom-1.22.4/glom/mode_design/translation/dialog_change_language.cc0000644000175000017500000000276212234776260026473 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_change_language.h" #include #include namespace Glom { const char* Dialog_ChangeLanguage::glade_id("dialog_change_language"); const bool Dialog_ChangeLanguage::glade_developer(true); Dialog_ChangeLanguage::Dialog_ChangeLanguage(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_combo_locale(0) { builder->get_widget_derived("combobox_locale", m_combo_locale); if(m_combo_locale) m_combo_locale->set_selected_locale(AppWindow::get_current_locale()); } Dialog_ChangeLanguage::~Dialog_ChangeLanguage() { } Glib::ustring Dialog_ChangeLanguage::get_locale() const { return m_combo_locale->get_selected_locale(); } } //namespace Glom glom-1.22.4/glom/mode_design/translation/dialog_identify_original.h0000644000175000017500000000305112234252646026731 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_TRANSLATIONS_DIALOG_IDENTIFY_ORIGINAL_H #define GLOM_TRANSLATIONS_DIALOG_IDENTIFY_ORIGINAL_H #include #include "combobox_locale.h" #include // For View_Glom #include namespace Glom { /** */ class Dialog_IdentifyOriginal : public Gtk::Dialog, public View_Glom { public: static const char* glade_id; static const bool glade_developer; Dialog_IdentifyOriginal(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_IdentifyOriginal(); Glib::ustring get_locale() const; virtual void load_from_document(); //override private: Gtk::Label* m_label_original; ComboBox_Locale* m_combo_locale; }; } //namespace Glom #endif //GLOM_TRANSLATIONS_DIALOG_IDENTIFY_ORIGINAL_H glom-1.22.4/glom/mode_design/translation/combobox_locale.h0000644000175000017500000000346312234252646025051 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_TRANSLATION_COMBOBOX_LOCALE_H #define GLOM_TRANSLATION_COMBOBOX_LOCALE_H #include #include #include #include namespace Glom { /// A ComboBox that allows the user to choose a locale. class ComboBox_Locale : public Gtk::ComboBox { public: ComboBox_Locale(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~ComboBox_Locale(); void set_selected_locale(const Glib::ustring& locale); Glib::ustring get_selected_locale() const; private: //Tree model columns: //These columns are used by the model that is created by the default constructor class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_identifier); add(m_name); } Gtk::TreeModelColumn m_identifier; Gtk::TreeModelColumn m_name; }; ModelColumns m_model_columns; Glib::RefPtr m_model; }; } //namespace Glom #endif //GLOM_TRANSLATION_COMBOBOX_LOCALE_H glom-1.22.4/glom/mode_design/translation/dialog_copy_translation.h0000644000175000017500000000271212234252646026625 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_TRANSLATIONS_DIALOG_COPY_TRANSLATION_H #define GLOM_TRANSLATIONS_DIALOG_COPY_TRANSLATION_H #include #include "combobox_locale.h" #include // For View_Composite_Glom #include namespace Glom { /** */ class Dialog_CopyTranslation : public Gtk::Dialog { public: static const char* glade_id; static const bool glade_developer; Dialog_CopyTranslation(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_CopyTranslation(); Glib::ustring get_locale() const; private: ComboBox_Locale* m_combo_locale; }; } //namespace Glom #endif //GLOM_TRANSLATIONS_DIALOG_COPY_TRANSLATION_H glom-1.22.4/glom/mode_design/translation/dialog_identify_original.cc0000644000175000017500000000414412234776260027076 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_identify_original.h" #include #include //For bold_message()). #include #include #include namespace Glom { const char* Dialog_IdentifyOriginal::glade_id("dialog_translation_identify_original"); const bool Dialog_IdentifyOriginal::glade_developer(true); Dialog_IdentifyOriginal::Dialog_IdentifyOriginal(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_label_original(0), m_combo_locale(0) { builder->get_widget("label_original", m_label_original); builder->get_widget_derived("combobox_locale", m_combo_locale); if(m_combo_locale) m_combo_locale->set_selected_locale(AppWindow::get_current_locale()); } Dialog_IdentifyOriginal::~Dialog_IdentifyOriginal() { } void Dialog_IdentifyOriginal::load_from_document() { std::cout << "Dialog_IdentifyOriginal::load_from_document" << std::endl; if(m_label_original ) m_label_original->set_markup( Utils::bold_message( IsoCodes::get_locale_name( get_document()->get_translation_original_locale()) ) ); m_combo_locale->set_selected_locale(AppWindow::get_current_locale()); View_Glom::load_from_document(); } Glib::ustring Dialog_IdentifyOriginal::get_locale() const { return m_combo_locale->get_selected_locale(); } } //namespace Glom glom-1.22.4/glom/mode_design/translation/combobox_locale.cc0000644000175000017500000000633012234252646025203 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "combobox_locale.h" #include #include namespace Glom { ComboBox_Locale::ComboBox_Locale(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::ComboBox(cobject) { m_model = Gtk::ListStore::create(m_model_columns); //Fill the model: const IsoCodes::type_list_locales list_locales = IsoCodes::get_list_of_locales(); for(IsoCodes::type_list_locales::const_iterator iter = list_locales.begin(); iter != list_locales.end(); ++iter) { Gtk::TreeModel::iterator tree_iter = m_model->append(); Gtk::TreeModel::Row row = *tree_iter; const IsoCodes::Locale& the_locale = *iter; row[m_model_columns.m_identifier] = the_locale.m_identifier; row[m_model_columns.m_name] = the_locale.m_name; } m_model->set_sort_column(m_model_columns.m_name, Gtk::SORT_ASCENDING); set_model(m_model); //Do not show the non-human-readable ID: pack_start(m_model_columns.m_identifier); //Show this too. //Create the cell renderer manually, so we can specify the alignment: Gtk::CellRendererText* cell = Gtk::manage(new Gtk::CellRendererText()); cell->property_xalign() = 0.0f; pack_start(*cell); add_attribute(cell->property_text(), m_model_columns.m_name); } ComboBox_Locale::~ComboBox_Locale() { } Glib::ustring ComboBox_Locale::get_selected_locale() const { Gtk::TreeModel::iterator iter = get_active(); if(iter) { Gtk::TreeModel::Row row = *iter; return row[m_model_columns.m_identifier]; } else return Glib::ustring(); } void ComboBox_Locale::set_selected_locale(const Glib::ustring& locale) { //Look for the row with this text, and activate it: Glib::RefPtr model = get_model(); if(model) { for(Gtk::TreeModel::iterator iter = model->children().begin(); iter != model->children().end(); ++iter) { const Glib::ustring& this_text = (*iter)[m_model_columns.m_identifier]; //std::cout << G_STRFUNC << ": DEBUG: locale=" << locale << ", this_text=" << this_text << "." << std::endl; if(this_text == locale) { set_active(iter); return; //success } } //Not found, so mark it as blank: std::cerr << G_STRFUNC << ": locale not found in list: " << locale << ", list size=" << model->children().size() << std::endl; } else { std::cerr << G_STRFUNC << ": locale not found in list: " << locale << ". The model is empty." << std::endl; } unset_active(); } } //namespace Glom glom-1.22.4/glom/mode_design/translation/window_translations.h0000644000175000017500000000602512234252646026027 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_TRANSLATIONS_DIALOG_TRANSLATIONS_H #define GLOM_TRANSLATIONS_DIALOG_TRANSLATIONS_H #include #include #include #include #include #include #include namespace Glom { class ComboBox_Locale; class Window_Translations : public Gtk::Window, public View_Composite_Glom //So it can use the document. { public: static const char* glade_id; static const bool glade_developer; Window_Translations(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Window_Translations(); virtual void load_from_document(); //override virtual void save_to_document(); //override private: //Enable/disable buttons, depending on treeview selection: virtual void enable_buttons(); //signal handlers: void on_button_identify(); void on_cell_data_original(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void on_cell_data_item_itemhint(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void on_treeview_edited(const Glib::ustring& path, const Glib::ustring& new_text); void on_combo_target_locale_changed(); void on_button_cancel(); void on_button_ok(); void on_button_copy_translation(); void on_button_import(); void on_button_export(); //Tree model columns: class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_item); add(m_col_translation); add(m_col_hint); } Gtk::TreeModelColumn< sharedptr > m_col_item; //The table name, field name, etc. Gtk::TreeModelColumn m_col_translation; Gtk::TreeModelColumn m_col_hint; }; ModelColumns m_columns; //Tree model columns: Gtk::TreeView* m_treeview; Gtk::Button* m_button_identify; ComboBox_Locale* m_combo_target_locale; Glib::RefPtr m_model; Gtk::Label* m_label_source_locale; Glib::ustring m_translation_locale; Gtk::Button* m_button_ok; Gtk::Button* m_button_cancel; Gtk::Button* m_button_copy_translation; Gtk::Button* m_button_import; Gtk::Button* m_button_export; bool m_treeview_modified; }; } //namespace Glom #endif //GLOM_TRANSLATIONS_DIALOG_TRANSLATIONS_H glom-1.22.4/glom/mode_design/translation/dialog_copy_translation.cc0000644000175000017500000000305512234776260026767 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_copy_translation.h" #include //For bold_message()). #include #include namespace Glom { const char* Dialog_CopyTranslation::glade_id("dialog_translation_copy"); const bool Dialog_CopyTranslation::glade_developer(true); Dialog_CopyTranslation::Dialog_CopyTranslation(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_combo_locale(0) { builder->get_widget_derived("combobox_locale", m_combo_locale); if(m_combo_locale) m_combo_locale->set_selected_locale(AppWindow::get_current_locale()); } Dialog_CopyTranslation::~Dialog_CopyTranslation() { } Glib::ustring Dialog_CopyTranslation::get_locale() const { return m_combo_locale->get_selected_locale(); } } //namespace Glom glom-1.22.4/glom/mode_design/relationships_overview/0000755000175000017500000000000012235000127024001 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/mode_design/relationships_overview/printoperation_relationshipsoverview.h0000644000175000017500000000324112234252646034000 0ustar00murraycmurrayc00000000000000/* gtkmm example Copyright (C) 2006 gtkmm development team * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef GLOM_RELATIONSHIPS_OVERVIEW_PRINT_OPERATION_H #define GLOM_RELATIONSHIPS_OVERVIEW_PRINT_OPERATION_H #include #include #include namespace Glom { //We derive our own class from PrintOperation, //so we can put the actual print implementation here. class PrintOperationRelationshipsOverview : public Gtk::PrintOperation { public: static Glib::RefPtr create(); virtual ~PrintOperationRelationshipsOverview(); void set_canvas(Goocanvas::Canvas* canvas); private: PrintOperationRelationshipsOverview(); //PrintOperation default signal handler overrides: virtual void on_begin_print(const Glib::RefPtr& context); virtual void on_draw_page(const Glib::RefPtr& context, int page_nr); //Not owned by this instance: Goocanvas::Canvas* m_canvas; }; } //namespace Glom #endif // GLOM_RELATIONSHIPS_OVERVIEW_PRINT_OPERATION_H glom-1.22.4/glom/mode_design/relationships_overview/canvas_group_dbtable.cc0000644000175000017500000001164712234252646030503 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_group_dbtable.h" #include "glom/utility_widgets/canvas/canvas_rect_movable.h" #include "glom/utility_widgets/canvas/canvas_line_movable.h" #include "glom/utility_widgets/canvas/canvas_text_movable.h" #include #include #include #include #include #include #include #include #include #include namespace Glom { double CanvasGroupDbTable::m_table_width = 200; //TODO: Calculate based on the title text's width. double margin = 5.0; CanvasGroupDbTable::CanvasGroupDbTable(const Glib::ustring& table_name, const Glib::ustring& table_title, const Document::type_vec_fields& fields, double x, double y) : m_table_height(0) { m_table_name = table_name; //double max_table_height = 0; const double field_height = 20; m_table_height = field_height * (fields.size() + 1); Glib::RefPtr m_rect = CanvasRectMovable::create(x, y, m_table_width, m_table_height); m_rect->property_line_width() = 2.0; m_rect->property_radius_x() = 4.0, m_rect->property_radius_y() = 4.0; m_rect->property_stroke_color() = "black"; m_rect->property_fill_color() = "white"; m_rect->set_movement_allowed(false, false); //Move only as part of the parent group. add_child(m_rect); const Glib::ustring title = "" + table_title + ""; Glib::RefPtr m_text = CanvasTextMovable::create(title, x + margin, y + margin, m_table_width - margin*2, Goocanvas::ANCHOR_NORTH_WEST); m_text->property_font() = "Sans 12"; //TODO: Let the user specify this. m_text->property_use_markup() = true; m_text->set_movement_allowed(false, false); //Move only as part of the parent group. add_child(m_text); Glib::RefPtr m_line = CanvasLineMovable::create(); double points_coordinates[] = {x, y + field_height, x + m_table_width, y + field_height}; Goocanvas::Points points(2, points_coordinates); m_line->property_points() = points; m_line->property_stroke_color() = "black"; m_line->property_line_width() = 1.0; m_line->set_movement_allowed(false, false); //Move only as part of the parent group. add_child(m_line); //Add the table's fields: double field_y = field_height; for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr field = *iter; //Show the primary key as bold: Glib::ustring title; if(field->get_primary_key()) title = "" + item_get_title_or_name(field) + ""; else title = item_get_title_or_name(field); Glib::RefPtr text_item = CanvasTextMovable::create(title, x + margin, y + margin + field_y, m_table_width - margin*2, Goocanvas::ANCHOR_NORTH_WEST); text_item->property_font() = "Sans 12"; //TODO: Let the user specify this. text_item->property_use_markup() = true; text_item->set_movement_allowed(false, false); //Move only as part of the parent group. add_child(text_item); //Remember the postion for later, for drawing relationships lines: m_map_fields_y[field->get_name()] = field_y; field_y += field_height; } } CanvasGroupDbTable::~CanvasGroupDbTable() { } Glib::RefPtr CanvasGroupDbTable::create(const Glib::ustring& table_name, const Glib::ustring& table_title, const Document::type_vec_fields& fields, double x, double y) { return Glib::RefPtr(new CanvasGroupDbTable(table_name, table_title, fields, x, y)); } double CanvasGroupDbTable::get_table_height() const { return m_table_height; } double CanvasGroupDbTable::get_table_width() const { return m_table_width; } double CanvasGroupDbTable::get_field_y(const Glib::ustring& field_name) const { type_map_fields_y::const_iterator iterFind = m_map_fields_y.find(field_name); if(iterFind != m_map_fields_y.end()) return iterFind->second + 10.0; //Added an offset so that lines point approximately to the middle of the text. else return 0; } Glib::ustring CanvasGroupDbTable::get_table_name() const { return m_table_name; } } //namespace Glom glom-1.22.4/glom/mode_design/relationships_overview/dialog_relationships_overview.cc0000644000175000017500000004547312234776363032503 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include "dialog_relationships_overview.h" #include "glom/utility_widgets/canvas/canvas_line_movable.h" #include "glom/utility_widgets/canvas/canvas_text_movable.h" #include #include "printoperation_relationshipsoverview.h" #include "glom/appwindow.h" #include #include #include #include namespace Glom { //static: int Dialog_RelationshipsOverview::m_last_size_x = 0; int Dialog_RelationshipsOverview::m_last_size_y = 0; const char* Dialog_RelationshipsOverview::glade_id("dialog_relationships_overview"); const bool Dialog_RelationshipsOverview::glade_developer(true); Dialog_RelationshipsOverview::Dialog_RelationshipsOverview(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_menu(0), m_modified(false), m_scrolledwindow_canvas(0) { m_refPageSetup = Gtk::PageSetup::create(); m_refSettings = Gtk::PrintSettings::create(); //Add a menu: Gtk::Box* vbox = 0; builder->get_widget("vbox_placeholder_menubar", vbox); m_refActionGroup = Gtk::ActionGroup::create(); m_refActionGroup->add(Gtk::Action::create("Overview_MainMenu_File", _("_File")) ); m_refActionGroup->add(Gtk::Action::create("Overview_MainMenu_File_PageSetup", _("Page _Setup")), sigc::mem_fun(*this, &Dialog_RelationshipsOverview::on_menu_file_page_setup) ); m_refActionGroup->add(Gtk::Action::create("Overview_MainMenu_File_Print", Gtk::Stock::PRINT), sigc::mem_fun(*this, &Dialog_RelationshipsOverview::on_menu_file_print) ); m_refActionGroup->add(Gtk::Action::create("Overview_MainMenu_View", _("_View")) ); m_action_showgrid = Gtk::ToggleAction::create("Overview_MainMenu_View_Grid", _("Show _Grid")); m_refActionGroup->add(m_action_showgrid, sigc::mem_fun(*this, &Dialog_RelationshipsOverview::on_menu_view_showgrid) ); Glib::RefPtr m_refUIManager = Gtk::UIManager::create(); m_refUIManager->insert_action_group(m_refActionGroup); add_accel_group(m_refUIManager->get_accel_group()); try { static const Glib::ustring ui_description = "" " " " " " " " " " " " " " " " " " " ""; m_refUIManager->add_ui_from_string(ui_description); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_menu = dynamic_cast( m_refUIManager->get_widget("/Overview_MainMenu") ); if(!m_menu) g_warning("menu not found"); vbox->pack_start(*m_menu, Gtk::PACK_SHRINK); m_menu->show(); //Get the scolled window and add the canvas to it: m_scrolledwindow_canvas = 0; builder->get_widget("scrolledwindow_canvas", m_scrolledwindow_canvas); m_scrolledwindow_canvas->add(m_canvas); m_canvas.show(); //Restore the previous window size, to avoid annoying the user: if(m_last_size_x != 0 && m_last_size_y != 0 ) { set_default_size(m_last_size_x, m_last_size_y); } m_group_tables = Goocanvas::Group::create(); m_canvas.add_item(m_group_tables); m_group_lines = Goocanvas::Group::create(); m_canvas.add_item(m_group_lines); m_group_lines->lower(); //Make sure that the lines are below the tables. //Respond to changes of window size, //so we always make the canvas bounds big enough: m_scrolledwindow_canvas->get_hadjustment()->signal_changed().connect( sigc::mem_fun(*this, &Dialog_RelationshipsOverview::on_scroll_value_changed) ); m_scrolledwindow_canvas->get_vadjustment()->signal_changed().connect( sigc::mem_fun(*this, &Dialog_RelationshipsOverview::on_scroll_value_changed) ); setup_context_menu(); } Dialog_RelationshipsOverview::~Dialog_RelationshipsOverview() { get_size(m_last_size_x, m_last_size_y); //Disconnect signal handlers for all current items, //so sigc::bind()ed RefPtrs can be released. while(m_list_table_connections.size()) { type_list_connections::iterator iter = m_list_table_connections.begin(); sigc::connection the_connection = *iter; the_connection.disconnect(); m_list_table_connections.erase(iter); } //Remove all current items: //while(m_group_tables->get_n_children() > 0) // m_group_tables->remove_child(0); } void Dialog_RelationshipsOverview::draw_tables() { //Disconnect signal handlers for all current items, //so sigc::bind()ed RefPtrs can be released. while(m_list_table_connections.size()) { type_list_connections::iterator iter = m_list_table_connections.begin(); sigc::connection the_connection = *iter; the_connection.disconnect(); m_list_table_connections.erase(iter); } //Remove all current items: while(m_group_tables->get_n_children() > 0) m_group_tables->remove_child(0); Document* document = dynamic_cast(get_document()); if(document) { double max_table_height = 0; double sizex = 10; double sizey = 10; //Create tables canvas items, with lists of fields: Document::type_listTableInfo tables = document->get_tables(); for(Document::type_listTableInfo::iterator iter = tables.begin(); iter != tables.end(); ++iter) { sharedptr info = *iter; const Glib::ustring table_name = info->get_name(); float table_x = 0; float table_y = 0; //Get the x and y position from the document: if(!document->get_table_overview_position(table_name, table_x, table_y)) { table_x = sizex; table_y = sizey; document->set_table_overview_position(table_name, table_x, table_y); m_modified = true; } Document::type_vec_fields fields = document->get_table_fields(table_name); Glib::RefPtr table_group = CanvasGroupDbTable::create(info->get_name(), item_get_title_or_name(info), fields, table_x, table_y); m_group_tables->add_child(table_group); m_canvas.associate_with_grid(table_group); //Make snapping work. table_group->signal_moved().connect( sigc::mem_fun(*this, &Dialog_RelationshipsOverview::on_table_moved)); sigc::connection the_connection = table_group->signal_show_context().connect( sigc::bind( sigc::mem_fun(*this, &Dialog_RelationshipsOverview::on_table_show_context), table_group) ); m_list_table_connections.push_back(the_connection); //tv->x2 = tv->x1 + table_width; //tv->y2 = tv->y1 + table_height; sizex += table_group->get_table_width() + 10; max_table_height = std::max(max_table_height, table_group->get_table_height()); } m_canvas.set_bounds(0, 0, sizex, max_table_height * tables.size()); } } void Dialog_RelationshipsOverview::draw_lines() { //Remove all current items: while(m_group_lines->get_n_children() > 0) m_group_lines->remove_child(0); Document* document = dynamic_cast(get_document()); if(document) { //Create the lines linking tables to show relationships: Document::type_listTableInfo tables = document->get_tables(); for(Document::type_listTableInfo::iterator iter = tables.begin(); iter != tables.end(); ++iter) { sharedptr info = *iter; const Glib::ustring table_name = info->get_name(); Document::type_vec_relationships m_relationships = document->get_relationships(table_name); Document::type_vec_fields fields = document->get_table_fields(table_name); for(Document::type_vec_relationships::const_iterator rit = m_relationships.begin(); rit != m_relationships.end(); ++rit) { sharedptr relationship = *rit; if(!relationship) continue; Glib::RefPtr group_from = get_table_group(relationship->get_from_table()); double from_field_x = 0.0; double from_field_y = 0.0; if(group_from) { double temp_x = 0.0; double temp_y = 0.0; group_from->get_xy(temp_x, temp_y); from_field_x = temp_x; from_field_y = temp_y + group_from->get_field_y(relationship->get_from_field()); } //Only primary keys can be to fields: if(true) //document->get_field(relationship->get_to_table(), relationship->get_to_field())->get_primary_key()) { Glib::RefPtr group_to = get_table_group(relationship->get_to_table()); double to_field_x = 0.0; double to_field_y = 0.0; if(group_to) { double temp_x = 0.0; double temp_y = 0.0; group_to->get_xy(temp_x, temp_y); to_field_x = temp_x; to_field_y = temp_y + group_to->get_field_y(relationship->get_to_field()); } //Start the line from the right of the from table instead of the left, if the to table is to the right: double extra_line = 0; //An extra horizontal line before the real diagonal line starts. if(to_field_x > from_field_x) { from_field_x += group_from->get_table_width(); extra_line = 20; } else { to_field_x += group_to->get_table_width(); extra_line = -20; } //Create the line: Glib::RefPtr line = CanvasLineMovable::create(); double points_coordinates[] = {from_field_x, from_field_y, from_field_x + extra_line, from_field_y, to_field_x - extra_line, to_field_y, to_field_x, to_field_y}; Goocanvas::Points points(4, points_coordinates); line->property_points() = points; line->property_stroke_color() = "black"; line->property_line_width() = 1.0; line->property_start_arrow() = false; line->property_end_arrow() = true; line->property_arrow_width() = 10.0; line->property_arrow_length() = 10.0; line->set_movement_allowed(false, false); //Don't let the user move this by dragging. m_group_lines->add_child(line); //Create a text item, showing the name of the relationship on the line: // //Raise or lower the text slightly to make it show above the line when horizontal, //and to avoid overwriting a relationship in the other direction: //TODO: This is not very clear. Investigate how other systems show this. double y_offset = (from_field_x < to_field_x) ? -10 : +10; if(from_field_x == to_field_x) y_offset = (from_field_y < to_field_y) ? -10 : +10; const double text_x = (from_field_x + to_field_x) / 2; const double text_y = ((from_field_y + to_field_y) / 2) + y_offset; Glib::RefPtr text = CanvasTextMovable::create(item_get_title_or_name(relationship), text_x, text_y, -1, //TODO: Calc a suitable width. Goocanvas::ANCHOR_CENTER); text->property_font() = "Sans 10"; text->property_use_markup() = true; text->set_movement_allowed(false, false); //Move only as part of the parent group. m_group_lines->add_child(text); } } } } else { std::cout << "ERROR: Could not retrieve the Glom document." << std::endl; } } void Dialog_RelationshipsOverview::load_from_document() { draw_tables(); draw_lines(); } void Dialog_RelationshipsOverview::on_response(int /* id */) { if(m_modified && get_document()) get_document()->set_modified(); hide(); } void Dialog_RelationshipsOverview::on_menu_file_print() { print_or_preview(Gtk::PRINT_OPERATION_ACTION_PRINT_DIALOG); } void Dialog_RelationshipsOverview::on_menu_file_page_setup() { //Show the page setup dialog, asking it to start with the existing settings: Glib::RefPtr new_page_setup = Gtk::run_page_setup_dialog(*this, m_refPageSetup, m_refSettings); //Save the chosen page setup dialog for use when printing, previewing, or //showing the page setup dialog again: m_refPageSetup = new_page_setup; } void Dialog_RelationshipsOverview::on_menu_view_showgrid() { if(m_action_showgrid->get_active()) { m_canvas.set_grid_gap(40); } else { m_canvas.remove_grid(); } } void Dialog_RelationshipsOverview::on_menu_file_save() { } void Dialog_RelationshipsOverview::print_or_preview(Gtk::PrintOperationAction print_action) { //Create a new PrintOperation with our PageSetup and PrintSettings: //(We use our derived PrintOperation class) Glib::RefPtr print = PrintOperationRelationshipsOverview::create(); print->set_canvas(&m_canvas); print->set_track_print_status(); print->set_default_page_setup(m_refPageSetup); print->set_print_settings(m_refSettings); //print->signal_done().connect(sigc::bind(sigc::mem_fun(*this, // &ExampleWindow::on_printoperation_done), print)); try { print->run(print_action /* print or preview */, *this); } catch (const Gtk::PrintError& ex) { //See documentation for exact Gtk::PrintError error codes. std::cerr << "An error occurred while trying to run a print operation:" << ex.what() << std::endl; } } Glib::RefPtr Dialog_RelationshipsOverview::get_table_group(const Glib::ustring& table_name) { const int count = m_group_tables->get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr item = m_group_tables->get_child(i); Glib::RefPtr table_item = Glib::RefPtr::cast_dynamic(item); if(table_item && (table_item->get_table_name() == table_name)) { return table_item; } } return Glib::RefPtr(); } void Dialog_RelationshipsOverview::on_table_moved(const Glib::RefPtr& item, double /* x_offset */, double /* y_offset */) { Glib::RefPtr table = Glib::RefPtr::cast_dynamic(item); if(!table) return; Document* document = dynamic_cast(get_document()); if(document && table) { //Save the new position in the document: double x = 0; double y = 0; table->get_xy(x, y); document->set_table_overview_position(table->get_table_name(), x, y); } //It is probably incredibly inefficient to recreate the lines repeatedly while dragging a table, //but it seems to work OK, and it makes the code much simpler. //If this is a problem, we should just change the start/end coordinates of any lines connected to the moved table. draw_lines(); } void Dialog_RelationshipsOverview::on_table_show_context(guint button, guint32 activate_time, Glib::RefPtr table) { if(m_action_edit_fields) { // Disconnect the previous handler, // and connect a new one, with the correct table as a bound parameter: m_connection_edit_fields.disconnect(); m_connection_edit_fields = m_action_edit_fields->signal_activate().connect( sigc::bind( sigc::mem_fun(*this, &Dialog_RelationshipsOverview::on_context_menu_edit_fields), table )); m_connection_edit_relationships.disconnect(); m_connection_edit_relationships = m_action_edit_relationships->signal_activate().connect( sigc::bind( sigc::mem_fun(*this, &Dialog_RelationshipsOverview::on_context_menu_edit_relationships), table )); } if(m_context_menu) m_context_menu->popup(button, activate_time); } void Dialog_RelationshipsOverview::setup_context_menu() { m_context_menu_action_group = Gtk::ActionGroup::create(); m_context_menu_action_group->add(Gtk::Action::create("ContextMenu", "Context Menu") ); m_action_edit_fields = Gtk::Action::create("ContextEditFields", _("Edit _Fields")); m_context_menu_action_group->add(m_action_edit_fields); m_action_edit_relationships = Gtk::Action::create("ContextEditRelationships", _("Edit _Relationships")); m_context_menu_action_group->add(m_action_edit_relationships); m_context_menu_uimanager = Gtk::UIManager::create(); m_context_menu_uimanager->insert_action_group(m_context_menu_action_group); try { Glib::ustring ui_info = "" " " " " " " " " ""; m_context_menu_uimanager->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_context_menu = dynamic_cast( m_context_menu_uimanager->get_widget("/ContextMenu") ); } void Dialog_RelationshipsOverview::on_context_menu_edit_fields(Glib::RefPtr table) { AppWindow* pApp = AppWindow::get_appwindow(); if(pApp && table) { pApp->do_menu_developer_fields(*this, table->get_table_name()); //draw_tables(); //draw_lines(); } } void Dialog_RelationshipsOverview::on_context_menu_edit_relationships(Glib::RefPtr table) { AppWindow* pApp = AppWindow::get_appwindow(); if(pApp && table) { pApp->do_menu_developer_relationships(*this, table->get_table_name()); //draw_tables(); //draw_lines(); } } void Dialog_RelationshipsOverview::on_scroll_value_changed() { if(!m_scrolledwindow_canvas) return; double width = m_scrolledwindow_canvas->get_hadjustment()->get_page_size(); double height = m_scrolledwindow_canvas->get_vadjustment()->get_page_size(); //double x = m_scrolledwindow_canvas->get_hadjustment()->get_value(); //double y = m_scrolledwindow_canvas->get_vadjustment()->get_value(); //Make sure that the canvas bounds are as big as the scrollable area: double old_left = 0; double old_top = 0; double old_right = 0; double old_bottom = 0; m_canvas.get_bounds(old_left, old_top, old_right, old_bottom); const double old_height = old_bottom - old_top; const double old_width = old_right - old_left; if( (width > old_width) || (height > old_height) ) { m_canvas.set_bounds(0, 0, width, height); } } } //namespace Glom glom-1.22.4/glom/mode_design/relationships_overview/canvas_group_dbtable.h0000644000175000017500000000406212234252646030336 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILITY_WIDGETS_CANVAS_GROUP_DBTABLE_H #define GLOM_UTILITY_WIDGETS_CANVAS_GROUP_DBTABLE_H #include "glom/utility_widgets/canvas/canvas_group_movable.h" #include #include namespace Glom { class CanvasGroupDbTable : public CanvasGroupMovable { private: CanvasGroupDbTable(const Glib::ustring& table_name, const Glib::ustring& table_title, const Document::type_vec_fields& fields, double x = 0.0, double y = 0.0); virtual ~CanvasGroupDbTable(); public: static Glib::RefPtr create(const Glib::ustring& table_name, const Glib::ustring& table_title, const Document::type_vec_fields& fields, double x = 0.0, double y = 0.0); //TODO: Use bounds instead? double get_table_height() const; double get_table_width() const; Glib::ustring get_table_name() const; double get_field_y(const Glib::ustring& field_name) const; private: Glib::RefPtr m_rect; Glib::RefPtr m_text; Glib::RefPtr m_line; Glib::ustring m_table_name; double m_table_height; static double m_table_width; typedef std::map type_map_fields_y; type_map_fields_y m_map_fields_y; }; } //namespace Glom #endif //GLOM_UTILITY_WIDGETS_CANVAS_GROUP_DBTABLE_H glom-1.22.4/glom/mode_design/relationships_overview/dialog_relationships_overview.h0000644000175000017500000000722612234776363032337 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_RELATIONSHIPS_OVERVIEW #define GLOM_DIALOG_RELATIONSHIPS_OVERVIEW #include #include "glom/utility_widgets/canvas/canvas_editable.h" #include "canvas_group_dbtable.h" #include #include #include #include #include #include #include #include #include #include #include //#include "relationships_canvas.h" namespace Glom { class Dialog_RelationshipsOverview : public Gtk::Dialog, public View_Composite_Glom { public: static const char* glade_id; static const bool glade_developer; Dialog_RelationshipsOverview(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_RelationshipsOverview(); virtual void load_from_document(); //overridden. private: class TableView; void draw_tables(); void draw_lines(); void setup_context_menu(); void update_relationships(TableView* table_from); void print_or_preview(Gtk::PrintOperationAction print_action); void on_response(int id); void on_menu_file_print(); void on_menu_file_page_setup(); void on_menu_file_save(); void on_menu_view_showgrid(); void on_table_moved(const Glib::RefPtr& item, double x_offset, double y_offset); void on_table_show_context(guint button, guint32 activate_time, Glib::RefPtr table); void on_context_menu_edit_fields(Glib::RefPtr table); void on_context_menu_edit_relationships(Glib::RefPtr table); void on_scroll_value_changed(); Glib::RefPtr get_table_group(const Glib::ustring& table_name); Glib::RefPtr m_refUIManager; Glib::RefPtr m_refActionGroup; Glib::RefPtr m_action_showgrid; Gtk::MenuBar* m_menu; bool m_modified; CanvasEditable m_canvas; Gtk::ScrolledWindow* m_scrolledwindow_canvas; //typedef std::map, TableView*> type_map_item_tables; //type_map_item_tables m_tables; static int m_last_size_x, m_last_size_y; Glib::RefPtr m_group_tables; Glib::RefPtr m_group_lines; typedef std::list type_list_connections; type_list_connections m_list_table_connections; //Context menu: Gtk::Menu* m_context_menu; Glib::RefPtr m_context_menu_action_group; Glib::RefPtr m_context_menu_uimanager; Glib::RefPtr m_action_edit_fields, m_action_edit_relationships; sigc::connection m_connection_edit_fields, m_connection_edit_relationships; //Printing: Glib::RefPtr m_refSettings; Glib::RefPtr m_refPageSetup; }; } //namespace Glom #endif //GLOM_DIALOG_RELATIONSHIPS_OVERVIEW glom-1.22.4/glom/mode_design/relationships_overview/printoperation_relationshipsoverview.cc0000644000175000017500000000655512234252646034151 0ustar00murraycmurrayc00000000000000/* gtkmm example Copyright (C) 2006 gtkmm development team * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "printoperation_relationshipsoverview.h" #include namespace Glom { PrintOperationRelationshipsOverview::PrintOperationRelationshipsOverview() : m_canvas(0) { } PrintOperationRelationshipsOverview::~PrintOperationRelationshipsOverview() { } Glib::RefPtr PrintOperationRelationshipsOverview::create() { return Glib::RefPtr(new PrintOperationRelationshipsOverview()); } void PrintOperationRelationshipsOverview::on_begin_print( const Glib::RefPtr& /* print_context */) { set_n_pages(1); } void PrintOperationRelationshipsOverview::on_draw_page( const Glib::RefPtr& print_context, int /* page_nr */) { if(!m_canvas) return; //Get a Cairo Context, which is used as a drawing board: Cairo::RefPtr cairo_context = print_context->get_cairo_context(); //Set a drawing scale (before drawing) so that the cairo context fits on the page: const double print_height = print_context->get_height(); const double print_width = print_context->get_width(); //std::cout << "print_height=" << print_height << ", print_width=" << print_width << std::endl; //TODO: Get the total size of the drawn objects instead of the bounds (which includes extra whitespace): double canvas_left = 0; double canvas_top = 0; double canvas_right = 0; double canvas_bottom = 0; Glib::RefPtr root_item = m_canvas->get_root_item(); if(!root_item) return; const Goocanvas::Bounds bounds = root_item->get_bounds(); canvas_left = bounds.get_x1(); canvas_right = bounds.get_x2(); canvas_top = bounds.get_y1(); canvas_bottom = bounds.get_y2(); std::cout << "canvas_left=" << canvas_left << ", canvas_top=" << canvas_top << ", canvas_right=" << canvas_right << ", canvas_bottom=" << canvas_bottom << std::endl; const double canvas_height = (canvas_bottom - canvas_top); const double canvas_width = (canvas_right - canvas_left); std::cout << "canvas_height=" << canvas_height << ", canvas_width=" << canvas_width << std::endl; double scale_x = 1.0; double scale_y = 1.0; if(canvas_width) scale_x = print_width / canvas_width; if(canvas_height) scale_y = print_height / canvas_height; std::cout << "scale_x=" << scale_x << ", scale_y=" << scale_y << std::endl; scale_x = std::min(scale_x, scale_y); scale_y = scale_x; cairo_context->scale(scale_x, scale_y); //Render the canvas onto the cairo context: if(m_canvas) m_canvas->render(cairo_context); } void PrintOperationRelationshipsOverview::set_canvas(Goocanvas::Canvas* canvas) { m_canvas = canvas; } } //namespace Glom glom-1.22.4/glom/mode_design/dialog_design.h0000644000175000017500000000272712234252646022156 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_DIALOG_DESIGN_H #define GLOM_MODE_DESIGN_DIALOG_DESIGN_H #include #include #include #include namespace Glom { /** A dialog with a titled frame, a label for the table title, and a close button. */ class Dialog_Design : public Gtk::Window, public View_Composite_Glom { public: Dialog_Design(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Design(); virtual bool init_db_details(const Glib::ustring& table_name); private: virtual void on_button_close(); protected: Gtk::Label* m_label_table; }; } //namespace Glom #endif // GLOM_MODE_DESIGN_DIALOG_DESIGN_H glom-1.22.4/glom/mode_design/iso_codes.h0000644000175000017500000000272012234252646021326 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_ISO_CODES_H #define GLOM_MODE_DESIGN_ISO_CODES_H #include #include namespace Glom { namespace IsoCodes { class Currency { public: Glib::ustring m_symbol; Glib::ustring m_name; }; typedef std::list type_list_currencies; type_list_currencies get_list_of_currency_symbols(); class Locale { public: Glib::ustring m_identifier; Glib::ustring m_name; }; typedef std::list type_list_locales; type_list_locales get_list_of_locales(); Glib::ustring get_locale_name(const Glib::ustring& locale_id); } //namespace IsoCodes } //namespace Glom #endif //GLOM_MODE_DESIGN_ISO_CODES_H glom-1.22.4/glom/mode_design/dialog_database_preferences.cc0000644000175000017500000002642412234776363025177 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_database_preferences.h" #include #include #include #include #include #include #include #include namespace Glom { const char* Dialog_Database_Preferences::glade_id("dialog_database_preferences"); const bool Dialog_Database_Preferences::glade_developer(true); Dialog_Database_Preferences::Dialog_Database_Preferences(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), Base_DB(), m_glade_variables_map(builder) { m_glade_variables_map.connect_widget("entry_name", m_system_prefs.m_name); m_glade_variables_map.connect_widget("entry_org_name", m_system_prefs.m_org_name); m_glade_variables_map.connect_widget("entry_org_address_street", m_system_prefs.m_org_address_street); m_glade_variables_map.connect_widget("entry_org_address_street2", m_system_prefs.m_org_address_street2); m_glade_variables_map.connect_widget("entry_org_address_town", m_system_prefs.m_org_address_town); m_glade_variables_map.connect_widget("entry_org_address_county", m_system_prefs.m_org_address_county); m_glade_variables_map.connect_widget("entry_org_address_country", m_system_prefs.m_org_address_country); m_glade_variables_map.connect_widget("entry_org_address_postcode", m_system_prefs.m_org_address_postcode); builder->get_widget_derived("imageglom", m_image); builder->get_widget("button_choose_image", m_button_choose_image); m_button_choose_image->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_Database_Preferences::on_button_choose_image)); builder->get_widget("treeview_autoincrements", m_treeview_autoincrements); m_model_autoincrements = Gtk::ListStore::create(m_columns); m_treeview_autoincrements->set_model(m_model_autoincrements); m_treeview_autoincrements->append_column(_("Table"), m_columns.m_col_table); m_treeview_autoincrements->append_column(_("Field"), m_columns.m_col_field); const int view_cols_count = m_treeview_autoincrements->append_column(_("Next Value"), m_columns.m_col_next_value); Gtk::CellRendererText* pCellRenderer = dynamic_cast(m_treeview_autoincrements->get_column_cell_renderer(view_cols_count-1)); if(pCellRenderer) { //Make it editable: pCellRenderer->property_editable() = true; pCellRenderer->property_xalign() = 1.0f; //Align right. //Connect to its signal: pCellRenderer->signal_edited().connect( sigc::mem_fun(*this, &Dialog_Database_Preferences::on_treeview_cell_edited_next_value) ); } //Startup script widgets: builder->get_widget("textview_calculation", m_text_view_script); builder->get_widget("button_test", m_button_test_script); m_button_test_script->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Database_Preferences::on_button_test_script) ); // Set a monospace font m_text_view_script->override_font(Pango::FontDescription("Monospace")); //Dialog_Properties::set_modified(false); //Tell the SourceView to do syntax highlighting for Python: Glib::RefPtr languages_manager = Gsv::LanguageManager::get_default(); Glib::RefPtr language = languages_manager->get_language("python"); //This is the GtkSourceView language ID. if(language) { //Create a new buffer and set it, instead of getting the default buffer, in case libglade has tried to set it, using the wrong buffer type: Glib::RefPtr buffer = Gsv::Buffer::create(language); buffer->set_highlight_syntax(); m_text_view_script->set_buffer(buffer); } } Dialog_Database_Preferences::~Dialog_Database_Preferences() { } void Dialog_Database_Preferences::on_treeview_cell_edited_next_value(const Glib::ustring& path_string, const Glib::ustring& new_text) { if(path_string.empty()) return; Gtk::TreeModel::Path path(path_string); //Get the row from the path: Gtk::TreeModel::iterator iter = m_model_autoincrements->get_iter(path); if(iter != m_model_autoincrements->children().end()) { Gtk::TreeModel::Row row = *iter; //Set it in the model: long new_value = atol(new_text.c_str()); //TODO: Careful of locale. row[m_columns.m_col_next_value] = new_value; //Set it in the database system table: const Glib::ustring table_name = row[m_columns.m_col_table]; const Glib::ustring field_name = row[m_columns.m_col_field]; const Gnome::Gda::Value next_value = Conversions::parse_value(new_value); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder->set_table(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder->add_field_value_as_value(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_NEXT_VALUE, next_value); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_AND, builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_TABLE_NAME, GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME), builder->add_expr(table_name)), builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_FIELD_NAME, GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME), builder->add_expr(field_name)))); const bool test = DbUtils::query_execute(builder); if(!test) std::cerr << G_STRFUNC << ": UPDATE failed." << std::endl; } } void Dialog_Database_Preferences::load_from_document() { Document* document = get_document(); m_system_prefs = DbUtils::get_database_preferences(document); //Show the data in the UI: m_glade_variables_map.transfer_variables_to_widgets(); m_image->set_value(m_system_prefs.m_org_logo); //Make sure that all auto-increment values are setup: const Document::type_listTableInfo tables = document->get_tables(); for(Document::type_listTableInfo::const_iterator iter = tables.begin(); iter != tables.end(); ++iter) { const Document::type_vec_fields fields = document->get_table_fields((*iter)->get_name()); for(Document::type_vec_fields::const_iterator iterFields = fields.begin(); iterFields != fields.end(); ++iterFields) { sharedptr field = *iterFields; if(field->get_primary_key()) DbUtils::auto_increment_insert_first_if_necessary((*iter)->get_name(), field->get_name()); } } //Show the auto-increment values: m_model_autoincrements->clear(); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_TABLE_NAME, GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_FIELD_NAME, GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_NEXT_VALUE, GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder->select_add_target(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); NumericFormat numeric_format; //ignored Glib::RefPtr datamodel = DbUtils::query_execute_select(builder); if(!datamodel) { std::cerr << G_STRFUNC << ": Gda::DataModel is NULL." << std::endl; return; } const guint count = datamodel->get_n_rows(); for(guint i = 0; i < count; ++i) { Gtk::TreeModel::iterator iter = m_model_autoincrements->append(); Gtk::TreeModel::Row row = *iter; row[m_columns.m_col_table] = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(0, i), numeric_format); row[m_columns.m_col_field] = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(1, i), numeric_format); //TODO: Careful of locale: row[m_columns.m_col_next_value] = atol(datamodel->get_value_at(2, i).to_string().c_str()); } m_model_autoincrements->set_default_sort_func( sigc::mem_fun(*this, &Dialog_Database_Preferences::on_autoincrements_sort) ); const Glib::ustring script = document->get_startup_script(); m_text_view_script->get_buffer()->set_text(script); } int Dialog_Database_Preferences::on_autoincrements_sort(const Gtk::TreeModel::iterator& a, const Gtk::TreeModel::iterator& b) { const Glib::ustring a_full = (*a)[m_columns.m_col_table] + ", " + (*a)[m_columns.m_col_field]; const Glib::ustring b_full = (*b)[m_columns.m_col_table] + ", " + (*b)[m_columns.m_col_field]; if(a_full < b_full) return -1; else if(a_full > b_full) return 1; else return 0; } void Dialog_Database_Preferences::save_to_document() { BusyCursor busy_cursor(this); m_glade_variables_map.transfer_widgets_to_variables(); m_system_prefs.m_org_logo = m_image->get_value(); Document* document = get_document(); //Make sure that set_database_preferences() can work. if(get_userlevel() == AppState::USERLEVEL_DEVELOPER) DbUtils::add_standard_tables(document); DbUtils::set_database_preferences(document, m_system_prefs); //The script is not part of "database preferences" in the database data, //because it does not seem to be part of simple personalisation. if(!document) return; const Glib::ustring script = m_text_view_script->get_buffer()->get_text(); document->set_startup_script(script); } void Dialog_Database_Preferences::on_response(int response_id) { if(response_id == Gtk::RESPONSE_OK) save_to_document(); } void Dialog_Database_Preferences::on_button_choose_image() { m_image->do_choose_image(); } void Dialog_Database_Preferences::on_button_test_script() { const Glib::ustring calculation = m_text_view_script->get_buffer()->get_text(); type_map_fields field_values; Document* document = get_document(); if(!document) return; //We need the connection when we run the script, so that the script may use it. sharedptr sharedconnection = connect_to_server(this /* parent window */); Glib::ustring error_message; //TODO: Check this and tell the user. PythonUICallbacks callbacks; glom_execute_python_function_implementation(calculation, type_map_fields(), document, Glib::ustring() /* table_name */, sharedptr(), Gnome::Gda::Value(), // primary key - only used when setting values in the DB, which we would not encourage in a test. sharedconnection->get_gda_connection(), callbacks, error_message); if(!error_message.empty()) { std::cerr << "Python Error: " << error_message << std::endl; } } } //namespace Glom glom-1.22.4/glom/mode_design/dialog_initial_password.h0000644000175000017500000000316212234252646024252 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_INITIAL_PASSWORD_H #define GLOM_DIALOG_INITIAL_PASSWORD_H #include #include #include #include #include #include namespace Glom { class Dialog_InitialPassword : public Gtk::Dialog, public Base_DB { public: static const char* glade_id; static const bool glade_developer; Dialog_InitialPassword(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_InitialPassword(); bool check_password(); Glib::ustring get_user() const; Glib::ustring get_password() const; virtual void load_from_document(); //override private: Gtk::Entry* m_entry_user; Gtk::Entry* m_entry_password; Gtk::Entry* m_entry_password_confirm; }; } //namespace Glom #endif //GLOM_DIALOG_INITIAL_PASSWORD_H glom-1.22.4/glom/mode_design/dialog_database_preferences.h0000644000175000017500000000537012234252646025027 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_DATABASE_PREFERENCES_H #define GLOM_DIALOG_DATABASE_PREFERENCES_H #include #include #include #include #include #include #include #include #include #include #include #include "utility_widgets/imageglom.h" namespace Glom { class Dialog_Database_Preferences : public Gtk::Dialog, public Base_DB { public: static const char* glade_id; static const bool glade_developer; Dialog_Database_Preferences(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Database_Preferences(); sharedptr connect_to_server_with_connection_settings() const; virtual void load_from_document(); //override virtual void save_to_document(); //override private: void on_response(int response_id); void on_button_choose_image(); void on_button_test_script(); void on_treeview_cell_edited_next_value(const Glib::ustring& path_string, const Glib::ustring& new_text); int on_autoincrements_sort(const Gtk::TreeModel::iterator& a, const Gtk::TreeModel::iterator& b); //Tree model columns: class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_table); add(m_col_field); add(m_col_next_value); } Gtk::TreeModelColumn m_col_table; Gtk::TreeModelColumn m_col_field; Gtk::TreeModelColumn m_col_next_value; }; ModelColumns m_columns; Glib::RefPtr m_model_autoincrements; Glom::VariablesMap m_glade_variables_map; Gtk::TreeView* m_treeview_autoincrements; ImageGlom* m_image; Gtk::Button* m_button_choose_image; Gsv::View* m_text_view_script; Gtk::Button* m_button_test_script; SystemPrefs m_system_prefs; }; } //namespace Glom #endif //GLOM_DIALOG_DATABASE_PREFERENCES_H glom-1.22.4/glom/mode_design/dialog_fields.cc0000644000175000017500000000317112234252646022303 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_fields.h" #include "../box_db_table.h" //#include #include //For bold_message()). #include namespace Glom { const char* Dialog_Fields::glade_id("window_design"); const bool Dialog_Fields::glade_developer(true); Dialog_Fields::Dialog_Fields(BaseObjectType* cobject, const Glib::RefPtr& builder) : Dialog_Design(cobject, builder), m_box(0) { builder->get_widget_derived("vbox_placeholder", m_box); //Fill composite view: add_view(m_box); show_all_children(); } Dialog_Fields::~Dialog_Fields() { remove_view(m_box); } bool Dialog_Fields::init_db_details(const Glib::ustring& table_name) { if(m_box) { m_box->load_from_document(); Dialog_Design::init_db_details(table_name); m_box->init_db_details(table_name); } return true; } } //namespace Glom glom-1.22.4/glom/mode_design/dialog_design.cc0000644000175000017500000000424712234252646022313 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_design.h" #include "../box_db_table.h" #include //#include #include namespace Glom { Dialog_Design::Dialog_Design(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Window(cobject), m_label_table(0) { Gtk::Button* button_close = 0; builder->get_widget("button_close", button_close); button_close->signal_clicked().connect( sigc::mem_fun(*this, &Dialog_Design::on_button_close) ); builder->get_widget("label_table_name", m_label_table); set_modal(); //We don't want people to edit the main window while we are changing structure. show_all_children(); } Dialog_Design::~Dialog_Design() { } bool Dialog_Design::init_db_details(const Glib::ustring& table_name) { if(get_document()) { Glib::ustring table_label = _("None selected"); //Show the table title (if any) and name: Document* document = dynamic_cast(get_document()); if(document) { Glib::ustring table_title = document->get_table_title(table_name, AppWindow::get_current_locale()); if(table_title.empty()) table_label = table_name; else table_label = table_title + " (" + table_name + ')'; } m_label_table->set_text(table_label); } else { g_warning("no document"); } return true; } void Dialog_Design::on_button_close() { hide(); } } //namespace Glom glom-1.22.4/glom/infobar_progress_creating.h0000644000175000017500000000303112234252645022315 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_INFOBAR_PROGRESS_CREATING_H #define GLOM_INFOBAR_PROGRESS_CREATING_H #include #include #include #include namespace Glom { /** Use this to show the user that something is happening. * Call pulse() repeatedly to show that we are still working. */ class Infobar_ProgressCreating : public Gtk::InfoBar { public: Infobar_ProgressCreating(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Infobar_ProgressCreating(); void set_message(const Glib::ustring& title, const Glib::ustring& secondary_text); void pulse(); private: Gtk::ProgressBar* m_progress; Gtk::Label* m_label_message; }; } //namespace Glom #endif //GLOM_INFOBAR_PROGRESS_CREATING_H glom-1.22.4/glom/infobar_progress_creating.cc0000644000175000017500000000304712234252645022462 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include namespace Glom { Infobar_ProgressCreating::Infobar_ProgressCreating(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::InfoBar(cobject), m_progress(0), m_label_message(0) { builder->get_widget("progressbar", m_progress); builder->get_widget("label_message", m_label_message); } Infobar_ProgressCreating::~Infobar_ProgressCreating() { } void Infobar_ProgressCreating::pulse() { m_progress->pulse(); } void Infobar_ProgressCreating::set_message(const Glib::ustring& title, const Glib::ustring& secondary_text) { m_label_message->set_markup("" + title + "\n\n" + secondary_text); } } //namespace Glom glom-1.22.4/glom/dialog_existing_or_new.cc0000644000175000017500000007167712234776363022012 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include "dialog_existing_or_new.h" #include #include //For xmlStopParser() #include #include #include #include #include #include #ifdef G_OS_WIN32 #include #include #else #include #endif #include #ifdef GLOM_ENABLE_CLIENT_ONLY static const int NEW_PAGE = 1; #endif /* GLOM_ENABLE_CLIENT_ONLY */ namespace { const char RECENT_DUMMY_TEXT[] = N_("No recently used documents available."); const char NETWORK_DUMMY_TEXT[] = N_("No sessions found on the local network."); #ifndef GLOM_ENABLE_CLIENT_ONLY const char TEMPLATE_DUMMY_TEXT[] = N_("No templates available."); #endif //TODO_Performance: A DomParser or XmlReader might be faster, or even a regex. /// Reads the title of an example from the first few characters of the XML. class Parser: public xmlpp::SaxParser { public: Parser() {} Glib::ustring get_example_title(const std::string& beginning) { try { parse_chunk(beginning); } catch(const xmlpp::exception& /* ex */) { //Ignore these, returning as much of the title as we have managed to retrieve. //Recent versions of libxml now cause an exception after we call xmlStopParser() anyway. //TODO: How can we get the error code from the exception anyway? } return m_title; } private: virtual void on_start_element(const Glib::ustring& name, const AttributeList& attributes) { if(m_title.empty()) // Already found name? Wait for parse_chunk() call to return. { if(name == "glom_document") //See document_glom.cc for the #defines. { for(AttributeList::const_iterator iter = attributes.begin(); iter != attributes.end(); ++ iter) { if(iter->name == "database_title") { m_title = iter->value; // Stop parsing here because we have what we need: xmlStopParser(context_); break; } } } } } Glib::ustring m_title; }; } //anonymous namespace namespace Glom { const char Dialog_ExistingOrNew::glade_id[] = "dialog_existing_or_new"; const bool Dialog_ExistingOrNew::glade_developer(false); Dialog_ExistingOrNew::Dialog_ExistingOrNew(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject) { #ifdef GLOM_ENABLE_CLIENT_ONLY //Don't mention creation of new documents in client-only mode: Gtk::Label* label = 0; builder->get_widget("existing_or_new_label", label); label->set_text(_("Open a Document")); #endif //GLOM_ENABLE_CLIENT_ONLY builder->get_widget("existing_or_new_existing_treeview", m_existing_view); g_assert(m_existing_view); builder->get_widget("existing_or_new_notebook", m_notebook); builder->get_widget("existing_or_new_button_select", m_select_button); if(!m_notebook || !m_select_button) throw std::runtime_error("Glade file does not contain the notebook or the select button for ExistingOrNew dialog."); m_existing_model = Gtk::TreeStore::create(m_existing_columns); m_existing_model->set_sort_column(m_existing_columns.m_col_time, Gtk::SORT_DESCENDING); m_existing_view->set_model(m_existing_model); m_iter_existing_other = m_existing_model->append(); (*m_iter_existing_other)[m_existing_columns.m_col_title] = _("Select File"); #ifndef G_OS_WIN32 m_iter_existing_network = m_existing_model->append(); (*m_iter_existing_network)[m_existing_columns.m_col_title] = _("Local Network"); #endif m_iter_existing_recent = m_existing_model->append(); (*m_iter_existing_recent)[m_existing_columns.m_col_title] = _("Recently Opened"); m_existing_column_title.set_expand(true); m_existing_column_title.pack_start(m_existing_icon_renderer, false); m_existing_column_title.pack_start(m_existing_title_renderer, true); m_existing_column_title.set_cell_data_func(m_existing_icon_renderer, sigc::mem_fun(*this, &Dialog_ExistingOrNew::existing_icon_data_func)); m_existing_column_title.set_cell_data_func(m_existing_title_renderer, sigc::mem_fun(*this, &Dialog_ExistingOrNew::existing_title_data_func)); m_existing_view->append_column(m_existing_column_title); m_existing_view->set_headers_visible(false); m_existing_view->signal_row_activated().connect(sigc::mem_fun(*this, &Dialog_ExistingOrNew::on_existing_row_activated)); // Browse local network #ifndef G_OS_WIN32 gchar* service_type = epc_service_type_new(EPC_PROTOCOL_HTTPS, "glom"); m_service_monitor = epc_service_monitor_new_for_types(0, service_type, (void*)0); g_signal_connect(m_service_monitor, "service-found", G_CALLBACK(on_service_found_static), this); g_signal_connect(m_service_monitor, "service-removed", G_CALLBACK(on_service_removed_static), this); g_free(service_type); #endif // Add recently used files typedef std::vector< Glib::RefPtr > type_vec_infos; type_vec_infos infos = Gtk::RecentManager::get_default()->get_items(); for(type_vec_infos::const_iterator iter = infos.begin(); iter != infos.end(); ++ iter) { Glib::RefPtr info = *iter; if(info->get_mime_type() == "application/x-glom") { Gtk::TreeModel::iterator iter = m_existing_model->append(m_iter_existing_recent->children()); (*iter)[m_existing_columns.m_col_title] = info->get_display_name(); (*iter)[m_existing_columns.m_col_time] = info->get_modified(); (*iter)[m_existing_columns.m_col_recent_info] = info; } } const Gtk::TreeNodeChildren& children = m_iter_existing_recent->children(); if(children.begin() == children.end()) m_iter_existing_recent_dummy = create_dummy_item_existing(m_iter_existing_recent, _(RECENT_DUMMY_TEXT)); #ifndef G_OS_WIN32 // Will be removed when items are added: m_iter_existing_network_dummy = create_dummy_item_existing(m_iter_existing_network, _(NETWORK_DUMMY_TEXT)); #endif // Expand recently used files and the networked files, // because the contents help to explain what this is: m_existing_view->expand_row(m_existing_model->get_path(m_iter_existing_recent), false); #ifndef G_OS_WIN32 m_existing_view->expand_row(m_existing_model->get_path(m_iter_existing_network), false); #endif m_select_button->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_ExistingOrNew::on_select_clicked)); m_select_button->set_image(*Gtk::manage(new Gtk::Image(Gtk::Stock::APPLY, Gtk::ICON_SIZE_BUTTON))); #ifndef GLOM_ENABLE_CLIENT_ONLY m_notebook->signal_switch_page().connect(sigc::mem_fun(*this, &Dialog_ExistingOrNew::on_switch_page)); #endif /* !GLOM_ENABLE_CLIENT_ONLY */ Glib::RefPtr existing_view_selection = m_existing_view->get_selection(); existing_view_selection->signal_changed().connect(sigc::mem_fun(*this, &Dialog_ExistingOrNew::on_existing_selection_changed)); existing_view_selection->set_select_function( sigc::mem_fun(*this, &Dialog_ExistingOrNew::on_existing_select_func) ); #ifndef GLOM_ENABLE_CLIENT_ONLY builder->get_widget("existing_or_new_new_treeview", m_new_view); g_assert(m_new_view); m_new_model = Gtk::TreeStore::create(m_new_columns); m_new_view->set_model(m_new_model); m_iter_new_empty = m_new_model->append(); (*m_iter_new_empty)[m_new_columns.m_col_title] = _("New Empty Document"); m_iter_new_template = m_new_model->append(); (*m_iter_new_template)[m_new_columns.m_col_title] = _("New From Template"); m_new_column_title.set_expand(true); m_new_column_title.pack_start(m_new_icon_renderer, false); m_new_column_title.pack_start(m_new_title_renderer, true); m_new_column_title.set_cell_data_func(m_new_icon_renderer, sigc::mem_fun(*this, &Dialog_ExistingOrNew::new_icon_data_func)); m_new_column_title.set_cell_data_func(m_new_title_renderer, sigc::mem_fun(*this, &Dialog_ExistingOrNew::new_title_data_func)); m_new_view->append_column(m_new_column_title); m_new_view->set_headers_visible(false); m_new_view->signal_row_activated().connect(sigc::mem_fun(*this, &Dialog_ExistingOrNew::on_new_row_activated)); m_iter_new_template_dummy = create_dummy_item_new(m_iter_new_template, _(TEMPLATE_DUMMY_TEXT)); Glib::RefPtr new_view_selection = m_new_view->get_selection(); new_view_selection->signal_changed().connect(sigc::mem_fun(*this, &Dialog_ExistingOrNew::on_new_selection_changed)); new_view_selection->set_select_function( sigc::mem_fun(*this, &Dialog_ExistingOrNew::on_new_select_func) ); #else /* GLOM_ENABLE_CLIENT_ONLY */ m_notebook->remove_page(NEW_PAGE); m_notebook->set_show_tabs(false); #endif /* !GLOM_ENABLE_CLIENT_ONLY */ // Load example files: #ifndef GLOM_ENABLE_CLIENT_ONLY #ifdef G_OS_WIN32 gchar* dir = g_win32_get_package_installation_directory_of_module(0); std::string path = Glib::build_filename(dir, "share" G_DIR_SEPARATOR_S "doc" G_DIR_SEPARATOR_S "glom" G_DIR_SEPARATOR_S "examples"); g_free(dir); if(!Glib::file_test(path, Glib::FILE_TEST_EXISTS)) path = GLOM_DOCDIR_EXAMPLES; #else const char path[] = GLOM_DOCDIR_EXAMPLES; #endif //G_OS_WIN32 //Show the installed example files, //falling back to the ones from the local source tree if none are installed: if(!list_examples_at_path(path)) list_examples_at_path(GLOM_DOCDIR_EXAMPLES_NOTINSTALLED); #endif //!GLOM_ENABLE_CLIENT_ONLY //Make sure the first item is visible: m_existing_view->scroll_to_row( Gtk::TreeModel::Path(m_iter_existing_other) ); update_ui_sensitivity(); } #ifndef GLOM_ENABLE_CLIENT_ONLY bool Dialog_ExistingOrNew::list_examples_at_path(const std::string& path) { //std::cout << "debug: " << G_STRFUNC << ": path=" << path << std::endl; Glib::RefPtr examples_dir = Gio::File::create_for_path(path); Glib::RefPtr info; try { Glib::RefPtr examples = examples_dir->enumerate_children(G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE","G_FILE_ATTRIBUTE_STANDARD_NAME); bool example_found = false; while( (info = examples->next_file()) ) { const Glib::ustring title = get_title_from_example(info, examples_dir); if(!title.empty()) { append_example(title, Gio::File::create_for_path(Glib::build_filename(examples_dir->get_path(), info->get_name()))); example_found = true; } } // TODO: Monitor example directory for new/removed files? return example_found; } catch(const Glib::Exception& ex) { std::cerr << "Could not enumerate examples at path=" << path << ", Error=" << ex.what() << std::endl; } return false; } #endif // !GLOM_ENABLE_CLIENT_ONLY Dialog_ExistingOrNew::~Dialog_ExistingOrNew() { #ifndef G_OS_WIN32 if(m_service_monitor) { g_object_unref(m_service_monitor); m_service_monitor = 0; } // Release the service infos in the treestore if(!m_iter_existing_network_dummy.get()) { const Gtk::TreeNodeChildren& children = m_iter_existing_network->children(); for(Gtk::TreeModel::iterator iter = children.begin(); iter != children.end(); ++ iter) epc_service_info_unref((*iter)[m_existing_columns.m_col_service_info]); } #endif } bool Dialog_ExistingOrNew::on_existing_select_func(const Glib::RefPtr& model, const Gtk::TreeModel::Path& path, bool /* path_currently_selected */) { Gtk::TreeModel::iterator iter = model->get_iter(path); #ifndef G_OS_WIN32 if(iter == m_iter_existing_network) return false; /* Do not allow parent nodes to be selected. */ #endif if(iter == m_iter_existing_recent) return false; return true; } #ifndef GLOM_ENABLE_CLIENT_ONLY bool Dialog_ExistingOrNew::on_new_select_func(const Glib::RefPtr& model, const Gtk::TreeModel::Path& path, bool /* path_currently_selected */) { Gtk::TreeModel::iterator iter = model->get_iter(path); if(iter == m_iter_new_template) return false; /* Do not allow parent nodes to be selected. */ else return true; } #endif //GLOM_ENABLE_CLIENT_ONLY Dialog_ExistingOrNew::Action Dialog_ExistingOrNew::get_action_impl(Gtk::TreeModel::iterator& iter) const { if(m_notebook->get_current_page() == 0) { if(m_existing_view->get_selection()->count_selected_rows() == 0) return NONE; iter = m_existing_view->get_selection()->get_selected(); if(m_existing_model->is_ancestor(m_iter_existing_recent, iter)) return OPEN_URI; #ifndef G_OS_WIN32 if(m_existing_model->is_ancestor(m_iter_existing_network, iter)) return OPEN_REMOTE; #endif if(iter == m_iter_existing_other) return OPEN_URI; return NONE; } else { #ifndef GLOM_ENABLE_CLIENT_ONLY if(m_new_view->get_selection()->count_selected_rows() == 0) return NONE; iter = m_new_view->get_selection()->get_selected(); if(m_new_model->is_ancestor(m_iter_new_template, iter)) return NEW_FROM_TEMPLATE; else if(iter == m_iter_new_empty) return NEW_EMPTY; else return NONE; #endif //GLOM_ENABLE_CLIENT_ONLY } return NONE; } Dialog_ExistingOrNew::Action Dialog_ExistingOrNew::get_action() const { Gtk::TreeModel::iterator iter; return get_action_impl(iter); } Glib::ustring Dialog_ExistingOrNew::get_uri() const { Gtk::TreeModel::iterator iter; const Action action = get_action_impl(iter); #ifndef GLOM_ENABLE_CLIENT_ONLY if(action == NEW_FROM_TEMPLATE) { return (*iter)[m_new_columns.m_col_template_uri]; } else #endif //GLOM_ENABLE_CLIENT_ONLY if(action == OPEN_URI) { if(iter == m_iter_existing_other) { return m_chosen_uri; } else { Glib::RefPtr info = (*iter)[m_existing_columns.m_col_recent_info]; return info->get_uri(); } } else { throw std::logic_error("Dialog_ExistingOrNew::get_uri: action is neither NEW_FROM_TEMPLATE nor OPEN_URI"); } return Glib::ustring(); } #ifndef G_OS_WIN32 EpcServiceInfo* Dialog_ExistingOrNew::get_service_info() const { Gtk::TreeModel::iterator iter; Action action = get_action_impl(iter); if(action == OPEN_REMOTE) return (*iter)[m_existing_columns.m_col_service_info]; else throw std::logic_error("Dialog_ExistingOrNew::get_service_info: action is not OPEN_REMOTE"); return 0; } Glib::ustring Dialog_ExistingOrNew::get_service_name() const { Gtk::TreeModel::iterator iter; Action action = get_action_impl(iter); if(action == OPEN_REMOTE) return (*iter)[m_existing_columns.m_col_service_name]; else throw std::logic_error("Dialog_ExistingOrNew::get_service_name: action is not OPEN_REMOTE"); return Glib::ustring(); } #endif std::auto_ptr Dialog_ExistingOrNew::create_dummy_item_existing(const Gtk::TreeModel::iterator& parent, const Glib::ustring& text) { Gtk::TreeModel::iterator iter = m_existing_model->append(parent->children()); (*iter)[m_existing_columns.m_col_title] = text; return std::auto_ptr(new Gtk::TreeModel::iterator(iter)); } #ifndef GLOM_ENABLE_CLIENT_ONLY std::auto_ptr Dialog_ExistingOrNew::create_dummy_item_new(const Gtk::TreeModel::iterator& parent, const Glib::ustring& text) { Gtk::TreeModel::iterator iter = m_new_model->append(parent->children()); (*iter)[m_new_columns.m_col_title] = text; return std::auto_ptr(new Gtk::TreeModel::iterator(iter)); } #endif //GLOM_ENABLE_CLIENT_ONLY void Dialog_ExistingOrNew::existing_icon_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { Gtk::CellRendererPixbuf* pixbuf_renderer = dynamic_cast(renderer); if(!pixbuf_renderer) throw std::logic_error("Renderer not a pixbuf renderer in existing_icon_data_func"); pixbuf_renderer->property_stock_size() = Gtk::ICON_SIZE_BUTTON; pixbuf_renderer->property_stock_id() = ""; pixbuf_renderer->property_pixbuf() = Glib::RefPtr(); if(iter == m_iter_existing_recent) pixbuf_renderer->property_stock_id() = Gtk::Stock::INDEX.id; // TODO: More meaningful icon? pixbuf_renderer->set_property("stock-size", Gtk::ICON_SIZE_BUTTON); pixbuf_renderer->set_property("stock-id", std::string()); pixbuf_renderer->set_property("pixbuf", Glib::RefPtr()); if(iter == m_iter_existing_recent) pixbuf_renderer->set_property("stock-id", Gtk::StockID(Gtk::Stock::INDEX)); #ifndef G_OS_WIN32 else if(iter == m_iter_existing_network) pixbuf_renderer->set_property("stock-id", Gtk::StockID(Gtk::Stock::NETWORK)); #endif else if(iter == m_iter_existing_other) pixbuf_renderer->set_property("stock-id", Gtk::StockID(Gtk::Stock::OPEN)); else if(m_iter_existing_recent_dummy.get() && iter == *m_iter_existing_recent_dummy) pixbuf_renderer->set_property("stock-id", std::string()); // TODO: Use Stock::STOP instead? #ifndef G_OS_WIN32 else if(m_iter_existing_network_dummy.get() && iter == *m_iter_existing_network_dummy) pixbuf_renderer->set_property("stock-id", std::string()); // TODO: Use Stock::STOP instead? #endif else { if(m_existing_model->is_ancestor(m_iter_existing_recent, iter)) { //Glib::RefPtr info = (*iter)[m_existing_columns.m_col_recent_info]; //pixbuf_renderer->property_pixbuf() = (*info)->get_icon(Gtk::ICON_SIZE_BUTTON); pixbuf_renderer->set_property("icon-name", Glib::ustring("glom")); } #ifndef G_OS_WIN32 else if(m_existing_model->is_ancestor(m_iter_existing_network, iter)) { //pixbuf_renderer->property_stock_id() = Gtk::Stock::CONNECT.id; pixbuf_renderer->set_property("icon-name", Glib::ustring("glom")); } #endif else { throw std::logic_error("Unexpected iterator in existing_icon_data_func"); } } } void Dialog_ExistingOrNew::existing_title_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { Gtk::CellRendererText* text_renderer = dynamic_cast(renderer); if(!text_renderer) throw std::logic_error("Renderer not a text renderer in existing_title_data_func"); text_renderer->property_text() = (*iter)[m_existing_columns.m_col_title]; // Default: Use default color: text_renderer->property_foreground_set() = false; // Use grey if parent item has no children: #ifndef G_OS_WIN32 if( (iter == m_iter_existing_network && m_iter_existing_network_dummy.get()) || (iter == m_iter_existing_recent && m_iter_existing_recent_dummy.get())) #else if(iter == m_iter_existing_recent && m_iter_existing_recent_dummy.get()) #endif { text_renderer->property_foreground() = "grey"; } } #ifndef GLOM_ENABLE_CLIENT_ONLY void Dialog_ExistingOrNew::new_icon_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { Gtk::CellRendererPixbuf* pixbuf_renderer = dynamic_cast(renderer); if(!pixbuf_renderer) throw std::logic_error("Renderer not a pixbuf renderer in new_icon_data_func"); pixbuf_renderer->property_stock_size() = Gtk::ICON_SIZE_BUTTON; pixbuf_renderer->property_stock_id() = ""; pixbuf_renderer->property_pixbuf() = Glib::RefPtr(); if(iter == m_iter_new_empty) pixbuf_renderer->property_stock_id() = Gtk::Stock::NEW.id; else if(iter == m_iter_new_template) pixbuf_renderer->property_stock_id() = Gtk::Stock::EDIT.id; // TODO: More meaningful icon? else if(m_iter_new_template_dummy.get() && iter == *m_iter_new_template_dummy) pixbuf_renderer->property_stock_id() = Gtk::Stock::DIALOG_ERROR.id; // TODO: Use Stock::STOP instead? else { if(m_new_model->is_ancestor(m_iter_new_template, iter)) { pixbuf_renderer->set_property("icon-name", Glib::ustring("glom")); } else { throw std::logic_error("Unexpected iterator in new_icon_data_func"); } } } void Dialog_ExistingOrNew::new_title_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { Gtk::CellRendererText* text_renderer = dynamic_cast(renderer); if(!text_renderer) throw std::logic_error("Renderer not a text renderer in new_title_data_func"); text_renderer->property_text() = (*iter)[m_new_columns.m_col_title]; // Default: Use default color text_renderer->property_foreground_set() = false; // Use grey if parent item has no children if( (iter == m_iter_new_template && m_iter_new_template_dummy.get())) { text_renderer->property_foreground() = "grey"; } } #endif //GLOM_ENABLE_CLIENT_ONLY void Dialog_ExistingOrNew::on_switch_page(Gtk::Widget* /* page */, guint /* page_num */) { update_ui_sensitivity(); } void Dialog_ExistingOrNew::on_existing_selection_changed() { update_ui_sensitivity(); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Dialog_ExistingOrNew::on_new_selection_changed() { update_ui_sensitivity(); } #endif //GLOM_ENABLE_CLIENT_ONLY void Dialog_ExistingOrNew::update_ui_sensitivity() { bool sensitivity = false; if(m_notebook->get_current_page() == 0) { const int count = m_existing_view->get_selection()->count_selected_rows(); if(count == 0) { sensitivity = false; } else { Gtk::TreeModel::iterator sel = m_existing_view->get_selection()->get_selected(); sensitivity = (sel != m_iter_existing_recent); #ifndef G_OS_WIN32 sensitivity = sensitivity && (sel != m_iter_existing_network); #endif sensitivity = sensitivity && (!m_iter_existing_recent_dummy.get() || sel != *m_iter_existing_recent_dummy); #ifndef G_OS_WIN32 sensitivity = sensitivity && (!m_iter_existing_network_dummy.get() || sel != *m_iter_existing_network_dummy); #endif } } #ifndef GLOM_ENABLE_CLIENT_ONLY else { const int count = m_new_view->get_selection()->count_selected_rows(); if(count == 0) { sensitivity = false; } else { Gtk::TreeModel::iterator sel = m_new_view->get_selection()->get_selected(); sensitivity = (sel != m_iter_new_template && (!m_iter_new_template_dummy.get() || sel != *m_iter_new_template_dummy)); } } #endif //GLOM_ENABLE_CLIENT_ONLY m_select_button->set_sensitive(sensitivity); } #ifndef GLOM_ENABLE_CLIENT_ONLY Glib::ustring Dialog_ExistingOrNew::get_title_from_example(const Glib::RefPtr& info, const Glib::RefPtr& examples_dir) { try { // Load file. const Glib::ustring content_type = info->get_attribute_string(G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE); const Glib::ustring mime_type = Gio::content_type_get_mime_type(content_type); if(mime_type == "application/x-glom") { const Glib::RefPtr current_example = Gio::File::create_for_path(Glib::build_filename(examples_dir->get_path(), info->get_name())); Glib::RefPtr stream = current_example->read(); m_current_buffer.reset(new buffer); const int bytes_read = stream->read(m_current_buffer->buf, buffer::SIZE); const std::string data(m_current_buffer->buf, bytes_read); // TODO: Check that data is valid UTF-8, the last character might be truncated Parser parser; return (Glib::ustring(parser.get_example_title(data))); } } catch(const Glib::Exception& exception) { std::cerr << "Could not enumerate files in examples directory: " << exception.what() << std::endl; m_current_buffer.reset(); } // File is not a glom file, continue with next. return Glib::ustring(); } void Dialog_ExistingOrNew::append_example(const Glib::ustring& title, const Glib::RefPtr& file) { if(!m_new_model) { std::cerr << G_STRFUNC << ": m_new_model is null" << std::endl; return; } if(!m_iter_new_template) { std::cerr << G_STRFUNC << ": m_iter_new_template is null" << std::endl; return; } try { const bool is_first_item = m_iter_new_template_dummy.get(); // Add to list. Gtk::TreeModel::iterator iter = m_new_model->append(m_iter_new_template->children()); (*iter)[m_new_columns.m_col_title] = title; (*iter)[m_new_columns.m_col_template_uri] = file->get_uri(); if(is_first_item) { // Remove dummy. m_new_model->erase(*m_iter_new_template_dummy); m_iter_new_template_dummy.reset(); // Expand if this is the first item. m_new_view->expand_row(m_new_model->get_path(m_iter_new_template), false); } } catch(const Glib::Exception& ex) { std::cerr << "Could not read example: " << file->get_path() << ": " << ex.what() << std::endl; } } #endif /* !GLOM_ENABLE_CLIENT_ONLY */ #ifndef G_OS_WIN32 void Dialog_ExistingOrNew::on_service_found_static(EpcServiceMonitor* /* monitor */, gchar* name, EpcServiceInfo* info, gpointer user_data) { static_cast(user_data)->on_service_found(name, info); } void Dialog_ExistingOrNew::on_service_removed_static(EpcServiceMonitor* /* monitor */, gchar* name, gchar* type, gpointer user_data) { static_cast(user_data)->on_service_removed(name, type); } void Dialog_ExistingOrNew::on_service_found(const Glib::ustring& name, EpcServiceInfo* info) { //Translator hint: This is on (via Network Interface such as eth0). gchar* title = g_strdup_printf(_("%s on %s (via %s)"), name.c_str(), epc_service_info_get_host(info), epc_service_info_get_interface(info)); Gtk::TreeModel::iterator iter = m_existing_model->prepend(m_iter_existing_network->children()); (*iter)[m_existing_columns.m_col_title] = title; (*iter)[m_existing_columns.m_col_time] = std::time(0); /* sort more recently discovered items above */ (*iter)[m_existing_columns.m_col_service_name] = name; (*iter)[m_existing_columns.m_col_service_info] = info; epc_service_info_ref(info); g_free(title); // Remove dummy item if(m_iter_existing_network_dummy.get()) { m_existing_model->erase(*m_iter_existing_network_dummy); m_iter_existing_network_dummy.reset(); } } void Dialog_ExistingOrNew::on_service_removed(const Glib::ustring& name, const Glib::ustring& /* type */) { // Find the entry with the given name const Gtk::TreeNodeChildren& children = m_iter_existing_network->children(); for(Gtk::TreeModel::iterator iter = children.begin(); iter != children.end(); ++ iter) { if((*iter)[m_existing_columns.m_col_service_name] == name) { const bool was_expanded = m_existing_view->row_expanded(m_existing_model->get_path(iter)); // Remove from store epc_service_info_unref((*iter)[m_existing_columns.m_col_service_info]); m_existing_model->erase(iter); // Reinsert dummy, if necessary if(children.begin() == children.end()) m_iter_existing_network_dummy = create_dummy_item_existing(m_iter_existing_network, _(NETWORK_DUMMY_TEXT)); if(was_expanded) m_existing_view->expand_row(m_existing_model->get_path(iter), false); break; } } } #endif // !G_OS_WIN32 void Dialog_ExistingOrNew::on_existing_row_activated(const Gtk::TreeModel::Path& /* path */, Gtk::TreeViewColumn* /* column */) { if(m_select_button->is_sensitive()) on_select_clicked(); } void Dialog_ExistingOrNew::on_existing_button_clicked(const Gtk::TreeModel::Path& path) { m_existing_view->get_selection()->select(path); if(m_select_button->is_sensitive()) on_select_clicked(); } #ifndef GLOM_ENABLE_CLIENT_ONLY void Dialog_ExistingOrNew::on_new_row_activated(const Gtk::TreeModel::Path& /* path */, Gtk::TreeViewColumn* /* column */) { if(m_select_button->is_sensitive()) on_select_clicked(); } void Dialog_ExistingOrNew::on_new_button_clicked(const Gtk::TreeModel::Path& path) { m_new_view->get_selection()->select(path); if(m_select_button->is_sensitive()) on_select_clicked(); } #endif //GLOM_ENABLE_CLIENT_ONLY void Dialog_ExistingOrNew::on_select_clicked() { Gtk::TreeModel::iterator iter; Action action = get_action_impl(iter); if(action == OPEN_URI && iter == m_iter_existing_other) { Gtk::FileChooserDialog dialog(*this, "Open Glom File"); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK); dialog.set_default_response(Gtk::RESPONSE_OK); Glib::RefPtr filter = Gtk::FileFilter::create(); filter->add_mime_type("application/x-glom"); filter->set_name("Glom files"); dialog.add_filter(filter); const int response_id = dialog.run(); if(response_id == Gtk::RESPONSE_OK) { m_chosen_uri = dialog.get_uri(); response(Gtk::RESPONSE_ACCEPT); } } else { response(Gtk::RESPONSE_ACCEPT); } } } //namespace Glom glom-1.22.4/glom/notebook_glom.h0000644000175000017500000000405612234776363017753 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_NOTEBOOK_GLOM_H #define GLOM_NOTEBOOK_GLOM_H #include #include #include namespace Glom { /** Notebook with document methods. */ class Notebook_Glom : public NotebookNoFrame, public Base_DB { public: Notebook_Glom(); virtual ~Notebook_Glom(); //virtual void show_hint(); //Signals: //Page number //typedef sigc::signal type_signal_leave_page; // type_signal_leave_page signal_leave_page(); //Overridden by derived classes: virtual void do_menu_developer_layout(); virtual void do_menu_file_print(); protected: void on_show(); Gtk::Window* get_app_window(); //Signal handlers: virtual void on_switch_page_handler(Gtk::Widget* pPage, guint uiPageNumber); //The _handler suffix is to avoid overriding the base class's method. void on_leave_page(guint uiPageNumber); //type_signal_leave_page m_signal_leave_page; //Signals when the user leaves a page. guint m_uiPreviousPage; bool m_destructor_in_progress; //A hack to prevent calling wrap() on dead C instances. sigc::connection m_connection_switch_page; //This allows us to delay connecting, and to block the handler temporarily. }; } //namespace Glom #endif // GLOM_NOTEBOOK_GLOM_H glom-1.22.4/glom/dialog_connection.h0000644000175000017500000000465312234252645020566 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_CONNECTION_H #define GLOM_DIALOG_CONNECTION_H #include #include #include #include #include #include namespace Glom { class Dialog_Connection : public Gtk::Dialog, public Base_DB { public: static const char glade_id[]; static const bool glade_developer; Dialog_Connection(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_Connection(); sharedptr connect_to_server_with_connection_settings() const; ///Disable irrelevant fields: void set_connect_to_browsed(); /** Change the main message text of the dialog, so we can use the dialog * to confirm that the user knows a password before disconnecting, when * switching to network sharing. */ void set_confirm_existing_user_note(); void set_username(const Glib::ustring& username); void set_password(const Glib::ustring& password); void get_username_and_password(Glib::ustring& user, Glib::ustring& password) const; virtual void load_from_document(); //override void set_self_hosted_user_and_password(const Glib::ustring& username, const Glib::ustring& password); /** Use this to override the data from load_from_document(). * For instance, if you want to try to connect to a renamed database. */ void set_database_name(const Glib::ustring& name); private: Gtk::Entry* m_entry_host; Gtk::Entry* m_entry_user; Gtk::Entry* m_entry_password; Gtk::Label* m_label_database; Gtk::Label* m_label_note; Glib::ustring m_database_name; }; } //namespace Glom #endif //GLOM_DIALOG_CONNECTION_H glom-1.22.4/glom/box_withbuttons.h0000644000175000017500000000451412234776363020356 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BOX_WITHBUTTONS_H #define GLOM_BOX_WITHBUTTONS_H #include #include "utility_widgets/adddel/adddel_withbuttons.h" #include #include #include #include #include namespace Glom { /** A Gtk::Box base widget class, * with some extra signals to allow derived classes to be used generically in * Window_BoxHolder, allowing the dialog to respond to buttons in the box. */ class Box_WithButtons : public Gtk::Box { public: Box_WithButtons(); Box_WithButtons(BaseObjectType* cobject, const Glib::RefPtr& builder); ///For use with libglademm's get_widget_derived(): Box_WithButtons(BaseObjectType* cobject); virtual ~Box_WithButtons(); Gtk::Window* get_app_window(); const Gtk::Window* get_app_window() const; //void show_hint(); //Public so that it can be called *after* this widget is added to its container. void set_button_cancel(Gtk::Button& button); //Signals: sigc::signal signal_selected; //When an item is selected. sigc::signal signal_cancelled; //When the cancel button is clicked. //Signal handlers: virtual void on_Button_Cancel(); virtual Gtk::Widget* get_default_button(); private: //virtual void hint_set(const Glib::ustring& strText); //Member data: //Glib::ustring m_strHint; //Help text. Gtk::Box m_Box_Buttons; Gtk::Button m_Button_Cancel; //Derived classes can use it if it's necessary. }; } //namespace Glom #endif //GLOM_BOX_WITHBUTTONS_H glom-1.22.4/glom/window_boxholder.cc0000644000175000017500000000301212234776363020617 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { Window_BoxHolder::Window_BoxHolder(Box_WithButtons* pBox, const Glib::ustring& title) { g_assert(pBox); if(!title.empty()) set_title(title); //Set default position: set_position(Gtk::WIN_POS_CENTER_ON_PARENT); pBox->signal_cancelled.connect(sigc::mem_fun(*this, &Window_BoxHolder::on_box_cancelled)); set_border_width(Utils::DEFAULT_SPACING_SMALL); add(*pBox); pBox->show(); //Set the default button, if there is one: Gtk::Widget* default_button = pBox->get_default_button(); if(default_button) set_default(*default_button); } Window_BoxHolder::~Window_BoxHolder() { } void Window_BoxHolder::on_box_cancelled() { hide(); } } //namespace Glom glom-1.22.4/glom/libglom/0000755000175000017500000000000012235000127016337 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/libglom/python_embed/0000755000175000017500000000000012235000126021013 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/libglom/python_embed/py_glom_record.cc0000644000175000017500000001635412234776363024365 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ //We need to include this before anything else, to avoid redefinitions: //#include #define NO_IMPORT_PYGOBJECT //To avoid a multiple definition in pygtk. #include //For the PyGObject and PyGBoxed struct definitions. #include #include #include //For pygda_value_as_pyobject(). #include #include #include #include namespace Glom { //Set the object's member data, from the parameters supplied when creating the object: PyGlomRecord::PyGlomRecord() : m_document(0), m_read_only(false) { } PyGlomRecord::~PyGlomRecord() { } void PyGlomRecord::set_read_only() { m_read_only = true; } std::string PyGlomRecord::get_table_name() const { return m_table_name; } boost::python::object PyGlomRecord::get_connection() { boost::python::object result; if(m_connection) { if(!_PyGObject_API) { std::cerr << "pyggobject does not seem to be initialized properly." << std::endl; return result; } PyObject* cobject = pygobject_new( G_OBJECT(m_connection->gobj()) ); if(cobject) result = boost::python::object( boost::python::borrowed(cobject) ); } return result; } boost::python::object PyGlomRecord::get_related() { //We initialize it here, so that this work never happens if it's not needed: if(!m_related) { //Return a new RelatedRecord: m_related = boost::python::object(new PyGlomRelated()); //TODO_NotSure //Fill it: Document::type_vec_relationships vecRelationships = m_document->get_relationships(m_table_name); PyGlomRelated::type_map_relationships map_relationships; for(Document::type_vec_relationships::const_iterator iter = vecRelationships.begin(); iter != vecRelationships.end(); ++iter) { if(*iter) map_relationships[(*iter)->get_name()] = *iter; } boost::python::extract extractor(m_related); if(extractor.check()) { PyGlomRelated* related_cpp = extractor; related_cpp->set_relationships(map_relationships); related_cpp->m_record = boost::python::object(this); //TODO_NotSure } } return m_related; } PyGlomRecord::type_map_field_values::size_type PyGlomRecord::len() const { return m_map_field_values.size(); } boost::python::object PyGlomRecord::getitem(const boost::python::object& cppitem) { const std::string key = boost::python::extract(cppitem); PyGlomRecord::type_map_field_values::const_iterator iterFind = m_map_field_values.find(key); if(iterFind != m_map_field_values.end()) { return glom_pygda_value_as_boost_pyobject(iterFind->second); } return boost::python::object(); } //TODO: Stop this from being used in field calculations, by making the record somehow read-only. void PyGlomRecord::setitem(const boost::python::object& key, const boost::python::object& value) { if(m_read_only) { std::cerr << "PyGlomRecord::setitem(): Failed to set a value because the record object is read-only."<< std::endl; return; } //Get the specified field name (and details) and value: std::string field_name; boost::python::extract extractor(key); if(extractor.check()) field_name = extractor; sharedptr field = m_document->get_field(m_table_name, field_name); if(!field) { std::cerr << G_STRFUNC << ": field=" << field_name << " not found in table=" << m_table_name << std::endl; //TODO: Throw python exception. return; } const Field::glom_field_type field_type = field->get_glom_type(); //TODO Gnome::Gda::Value field_value; GValue value_c = {0, {{0}}}; bool test = glom_pygda_value_from_pyobject(&value_c, value); if(test && G_IS_VALUE(&value)) { field_value = Gnome::Gda::Value(&value_c); //Make sure that the value is of the expected Gda type: field_value = Conversions::convert_value(field_value, field_type); g_value_unset(&value_c); } else field_value = Conversions::get_empty_value(field_type); //std::cout << "debug: " << G_STRFUNC << ": field_name=" << field_name << ", field_type=" << field_type << ", field_value=" << field_value.to_string() << std::endl; //Set the value in the database: if(!m_key_field || Conversions::value_is_empty(m_key_field_value)) { std::cerr << G_STRFUNC << ": The primary key name and value is not set. This would be a Glom bug." << std::endl; return; } if(!m_connection) { std::cerr << G_STRFUNC << ": The connection is null. This would be a Glom bug." << std::endl; return; } Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder->set_table(m_table_name); builder->add_field_value_as_value(field->get_name(), field_value); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(m_key_field->get_name(), m_table_name), builder->add_expr(m_key_field_value))); bool updated = false; try { updated = m_connection->statement_execute_non_select_builder(builder); } catch(const Glib::Exception& ex) { std::cerr << G_STRFUNC << ": exception while executing query: " << ex.what() << std::endl; } catch(const std::exception& ex) { std::cerr << G_STRFUNC << ": exception while executing query: " << ex.what() << std::endl; } if(!updated) { std::cerr << G_STRFUNC << ": UPDATE failed." << std::endl; } //TODO: Do dependent calculations and lookups. Or just do them for all fields for this record when finishing the script? } void PyGlomRecord::set_fields(const PyGlomRecord::type_map_field_values& field_values, Document* document, const Glib::ustring& table_name, const sharedptr& key_field, const Gnome::Gda::Value& key_field_value, const Glib::RefPtr& opened_connection) { m_map_field_values = field_values; /* Just for debugging: for(type_map_field_values::const_iterator iter = field_values.begin(); iter != field_values.end(); ++iter) { const Gnome::Gda::Value value = iter->second; std::cout << "debug: " << G_STRFUNC << ": field name=" << iter->first << ", type=" << g_type_name(value.get_value_type()) << std::endl; } */ m_table_name = table_name; m_key_field = key_field; m_key_field_value = key_field_value; if(m_document == 0) m_document = document; m_connection = opened_connection; } } //namespace Glom glom-1.22.4/glom/libglom/python_embed/pygdavalue_conversions.h0000644000175000017500000000106112234252646025772 0ustar00murraycmurrayc00000000000000#ifndef GLOM_PYGDA_VALUE_CONVERSIONS_H #define GLOM_PYGDA_VALUE_CONVERSIONS_H //We need to include this before anything else, to avoid redefinitions: #include #include #include #include bool glom_pygda_value_from_pyobject(GValue *boxed, const boost::python::object& input); //PyObject * //glom_pygda_value_as_pyobject(const GValue *value, gboolean copy_boxed); boost::python::object glom_pygda_value_as_boost_pyobject(const Glib::ValueBase& value); #endif //GLOM_PYGDA_VALUE_CONVERSIONS_H glom-1.22.4/glom/libglom/python_embed/py_glom_relatedrecord.h0000644000175000017500000000441512234252646025554 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PYTHON_GLOM_RELATEDRECORD_H #define GLOM_PYTHON_GLOM_RELATEDRECORD_H #include #include #include #include namespace Glom { class PyGlomRecord; class PyGlomRelatedRecord { public: PyGlomRelatedRecord(); ~PyGlomRelatedRecord(); void set_relationship(const sharedptr& relationship, const Gnome::Gda::Value& from_key_value, Document* document); boost::python::object sum(const std::string& field_name) const; boost::python::object count(const std::string& field_name) const; boost::python::object min(const std::string& field_name) const; boost::python::object max(const std::string& field_name) const; //Available, for instance, in python via record["name_first"] typedef std::map type_map_field_values; //[] notation: type_map_field_values::size_type len() const; boost::python::object getitem(const boost::python::object& item); private: boost::python::object generic_aggregate(const std::string& field_name, const std::string& aggregate) const; //PyObject* m_fields_dict; //Dictionary (map) of field names (string) to field values (Gnome::Gda::Value). //PyGlomRecord* m_record_parent; Document* m_document; sharedptr m_relationship; Gnome::Gda::Value m_from_key_value; mutable type_map_field_values m_map_field_values; //A cache. }; } //namespace Glom #endif //GLOM_PYTHON_GLOM_RELATEDRECORD_H glom-1.22.4/glom/libglom/python_embed/py_glom_relatedrecord.cc0000644000175000017500000002130112234252646025703 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include //For pygda_value_as_pyobject(). #include #include #include #include //#include "glom/appwindow.h" namespace Glom { PyGlomRelatedRecord::PyGlomRelatedRecord() { } PyGlomRelatedRecord::~PyGlomRelatedRecord() { } static void RelatedRecord_HandlePythonError() { if(PyErr_Occurred()) PyErr_Print(); } PyGlomRelatedRecord::type_map_field_values::size_type PyGlomRelatedRecord::len() const { return m_map_field_values.size(); } boost::python::object PyGlomRelatedRecord::getitem(const boost::python::object& cppitem) { const std::string field_name = boost::python::extract(cppitem); PyGlomRelatedRecord::type_map_field_values::const_iterator iterFind = m_map_field_values.find(field_name); if(iterFind != m_map_field_values.end()) { //If the value has already been stored, then just return it again: return glom_pygda_value_as_boost_pyobject(iterFind->second); } const Glib::ustring related_table = m_relationship->get_to_table(); //Check whether the field exists in the table. //TODO_Performance: Do this without the useless Field information? sharedptr field = m_document->get_field(m_relationship->get_to_table(), field_name); if(!field) { std::cerr << G_STRFUNC << ": field " << field_name << " not found in table " << m_relationship->get_to_table() << std::endl; PyErr_SetString(PyExc_IndexError, "field not found"); return boost::python::object(); } else { //Try to get the value from the database: //const Glib::ustring parent_key_name; sharedptr sharedconnection = ConnectionPool::get_instance()->connect(); if(!sharedconnection) { PyErr_SetString(PyExc_IndexError, "no database connection"); return boost::python::object(); } Glib::RefPtr gda_connection = sharedconnection->get_gda_connection(); const Glib::ustring related_key_name = m_relationship->get_to_field(); //Do not try to get a value based on a null key value: if(Conversions::value_is_empty(m_from_key_value)) { PyErr_SetString(PyExc_IndexError, "connection not found"); return boost::python::object(); } //Get the single value from the related records: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field(field_name, related_table); builder->select_add_target(related_table); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(related_key_name, related_table), builder->add_expr(m_from_key_value))); /* TODO: Fix linking problems const App_Glom* app = App_Glom::get_appwindow(); if(app && app->get_show_sql_debug()) { try { std::cout << "debug: " << G_STRFUNC << ": " << sql_query << std::endl; } catch(const Glib::Exception& ex) { std::cout << "Debug: query string could not be converted to std::cout: " << ex.what() << std::endl; } }*/ // TODO: Does this behave well if this throws an exception? Glib::RefPtr datamodel = gda_connection->statement_execute_select_builder(builder); if(datamodel && datamodel->get_n_rows()) { const Gnome::Gda::Value value = datamodel->get_value_at(0, 0); //g_warning("PyGlomRelatedRecord::setitem()(): value from datamodel = %s", value.to_string().c_str()); //Cache it, in case it's asked-for again. m_map_field_values[field_name] = value; return glom_pygda_value_as_boost_pyobject(value); } else if(!datamodel) { std::cerr << G_STRFUNC << ": The datamodel was null." << std::endl; ConnectionPool::handle_error_cerr_only(); RelatedRecord_HandlePythonError(); } else { g_warning("PyGlomRelatedRecord::setitem()(): No related records exist yet for relationship %s.", m_relationship->get_name().c_str()); } } std::cerr << G_STRFUNC << ": return null." << std::endl; return boost::python::object(); } boost::python::object PyGlomRelatedRecord::generic_aggregate(const std::string& field_name, const std::string& aggregate) const { const Glib::ustring related_table = m_relationship->get_to_table(); //Check whether the field exists in the table. //TODO_Performance: Do this without the useless Field information? sharedptr field = m_document->get_field(m_relationship->get_to_table(), field_name); if(!field) { g_warning("RelatedRecord_sum: field %s not found in table %s", field_name.c_str(), m_relationship->get_to_table().c_str()); return boost::python::object(); } //Try to get the value from the database: //const Glib::ustring parent_key_name; sharedptr sharedconnection = ConnectionPool::get_instance()->connect(); if(!sharedconnection) { g_warning("RelatedRecord_sum: no connection."); return boost::python::object(); } Glib::RefPtr gda_connection = sharedconnection->get_gda_connection(); const Glib::ustring related_key_name = m_relationship->get_to_field(); //Do not try to get a value based on a null key value: if(Conversions::value_is_empty(m_from_key_value)) { return boost::python::object(); } //Get the aggregate value from the related records: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); const Gnome::Gda::SqlBuilder::Id id_function = builder->add_function(aggregate, builder->add_id(field_name)); //TODO: It would be nice to specify the table here too. builder->add_field_value_id(id_function); builder->select_add_target(related_table); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(related_key_name, related_table), builder->add_expr(m_from_key_value))); //std::cout << "PyGlomRelatedRecord: Executing: " << sql_query << std::endl; Glib::RefPtr datamodel = gda_connection->statement_execute_select_builder(builder); // Ignore the error: The case that the command execution didn't return // a datamodel is handled below. if(datamodel && datamodel->get_n_rows()) { const Gnome::Gda::Value value = datamodel->get_value_at(0, 0); //g_warning("RelatedRecord_generic_aggregate(): value from datamodel = %s", value.to_string().c_str()); //Cache it, in case it's asked-for again. m_map_field_values[field_name] = value; return glom_pygda_value_as_boost_pyobject(value); } else if(!datamodel) { g_warning("RelatedRecord_generic_aggregate(): The datamodel was null."); ConnectionPool::handle_error_cerr_only(); RelatedRecord_HandlePythonError(); } else { g_warning("RelatedRecord_generic_aggregate(): No related records exist yet for relationship %s.", m_relationship->get_name().c_str()); } return boost::python::object(); } boost::python::object PyGlomRelatedRecord::sum(const std::string& field_name) const { return generic_aggregate(field_name, "sum"); } boost::python::object PyGlomRelatedRecord::count(const std::string& field_name) const { return generic_aggregate(field_name, "count"); } boost::python::object PyGlomRelatedRecord::min(const std::string& field_name) const { return generic_aggregate(field_name, "min"); } boost::python::object PyGlomRelatedRecord::max(const std::string& field_name) const { return generic_aggregate(field_name, "max"); } void PyGlomRelatedRecord::set_relationship(const sharedptr& relationship, const Gnome::Gda::Value& from_key_value, Document* document) { m_relationship = relationship; m_from_key_value = from_key_value; m_document = document; } } //namespace Glom glom-1.22.4/glom/libglom/python_embed/py_glom_related.h0000644000175000017500000000341412234252646024353 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PYTHON_GLOM_RELATED_H #define GLOM_PYTHON_GLOM_RELATED_H #include #include namespace Glom { class PyGlomRelatedRecord; class PyGlomRecord; class PyGlomRelated { public: PyGlomRelated(); ~PyGlomRelated(); typedef std::map > type_map_relationships; void set_relationships(const PyGlomRelated::type_map_relationships& relationships); //[] notation: type_map_relationships::size_type len() const; boost::python::object getitem(const boost::python::object& item); friend class PyGlomRecord; private: typedef std::map type_map_relatedrecords; boost::python::object m_record; //Actually PyGlomRecord. A reference to the parent record. type_map_relationships m_map_relationships; type_map_relatedrecords m_map_relatedrecords; }; } //namespace Glom #endif //GLOM_PYTHON_GLOM_RELATED_H glom-1.22.4/glom/libglom/python_embed/pygdavalue_conversions.cc0000644000175000017500000002345112234776363026146 0ustar00murraycmurrayc00000000000000#include #if PY_VERSION_HEX >= 0x02040000 # include /* From Python */ #endif #include "pygdavalue_conversions.h" #include #include "pygdavalue_conversions.h" #include #include #include /** * pygda_value_from_pyobject: * @value: the GValue object to store the converted value in. * @obj: the Python object to convert. * * This function converts a Python object and stores the result in a * GValue. If the Python object can't be converted to the * type of the GValue, then an error is returned. * * Returns: true for success. */ bool glom_pygda_value_from_pyobject(GValue* boxed, const boost::python::object& input) { /* Use an appropriate gda_value_set_*() function. We cannot know what GValue type is actually wanted, so we must still have the get_*() functions in the python API. */ if (G_IS_VALUE (boxed)) g_value_unset(boxed); PyObject* input_c = input.ptr(); //We check for bool first, //because bool is derived from int in Python, //so PyInt_Check() would also succeed on a bool object. if(PyBool_Check(input_c)) { boost::python::extract extractor_bool(input); if(extractor_bool.check()) { const bool val = extractor_bool; g_value_init (boxed, G_TYPE_BOOLEAN); g_value_set_boolean (boxed, val); return true; } } if(PyInt_Check(input_c)) { boost::python::extract extractor_int(input); if(extractor_int.check()) { const int val = extractor_int; g_value_init (boxed, G_TYPE_INT); g_value_set_int (boxed, val); return true; } } if(PyLong_Check(input_c)) { boost::python::extract extractor_long(input); if(extractor_long.check()) { const long val = extractor_long; g_value_init (boxed, G_TYPE_INT); g_value_set_int (boxed, val); return true; } } if(PyFloat_Check(input_c)) { boost::python::extract extractor_double(input); if(extractor_double.check()) { const double val = extractor_double; g_value_init (boxed, G_TYPE_DOUBLE); g_value_set_double (boxed, val); return true; } } if(PyString_Check(input_c)) { boost::python::extract extractor_string(input); if(extractor_string.check()) { const std::string str = extractor_string; g_value_init(boxed, G_TYPE_STRING); g_value_set_string(boxed, str.c_str()); return true; } } #if PY_VERSION_HEX >= 0x02040000 //TODO: Remove this redefine when Python fixes the compiler error in their macro: // http://bugs.python.org/issue7463 // Note that this sets a local copy of PyDateTimeAPI (in Python's datetime.h // header) so it _must_ be repeated and called before any code that use the // Python PyDate* macros (!) such as PyDateTime_Check // PyDateTime_IMPORT; //A macro, needed to use PyDate_Check(), PyDateTime_Check(), etc. PyDateTimeAPI = (PyDateTime_CAPI*) PyCObject_Import((char*)"datetime", (char*)"datetime_CAPI"); if(PyDateTimeAPI) //This should have been set but it can fail: https://bugzilla.gnome.org/show_bug.cgi?id=644702 { //TODO: Find some way to do this with boost::python if(PyDateTime_Check (input_c)) { GdaTimestamp gda; gda.year = PyDateTime_GET_YEAR(input_c); gda.month = PyDateTime_GET_MONTH(input_c); gda.day = PyDateTime_GET_DAY(input_c); gda.hour = PyDateTime_DATE_GET_HOUR(input_c); gda.minute = PyDateTime_DATE_GET_MINUTE(input_c); gda.second = PyDateTime_DATE_GET_SECOND(input_c); gda.timezone = 0; gda_value_set_timestamp (boxed, &gda); return true; } else if(PyDate_Check (input_c)) { GDate *gda = g_date_new_dmy( PyDateTime_GET_DAY(input_c), (GDateMonth)PyDateTime_GET_MONTH(input_c), PyDateTime_GET_YEAR(input_c) ); g_value_init (boxed, G_TYPE_DATE); g_value_set_boxed(boxed, gda); g_date_free(gda); return true; } else if(PyTime_Check (input_c)) { GdaTime gda; gda.hour = PyDateTime_TIME_GET_HOUR(input_c); gda.minute = PyDateTime_TIME_GET_MINUTE(input_c); gda.second = PyDateTime_TIME_GET_SECOND(input_c); gda.timezone = 0; gda_value_set_time (boxed, &gda); return true; } } #else //std::cout << "DEBUG Dates not supported." << std::endl; #endif std::cerr << G_STRFUNC << ": Unhandled python type." << std::endl; return false; /* failed. */ } boost::python::object glom_pygda_value_as_boost_pyobject(const Glib::ValueBase& value) { GValue* boxed = const_cast(value.gobj()); const GType value_type = G_VALUE_TYPE(boxed); boost::python::object ret; #if PY_VERSION_HEX >= 0x02040000 if((value_type == G_TYPE_DATE) || (value_type == GDA_TYPE_TIME) || (value_type == GDA_TYPE_TIMESTAMP)) { // We shouldn't need to call PyDateTime_IMPORT again, // after already doing it in libglom_init(), // but PyDate_FromDate() crashes (with valgrind warnings) if we don't. // // Causes a C++ compiler warning, so we use its definition directly. // See http://bugs.python.org/issue7463. // PyDateTime_IMPORT; //A macro, needed to use PyDate_Check(), PyDateTime_Check(), etc. PyDateTimeAPI = (PyDateTime_CAPI*) PyCObject_Import((char*)"datetime", (char*)"datetime_CAPI"); g_assert(PyDateTimeAPI); //This should have been set by the PyDateTime_IMPORT macro } #endif if (value_type == G_TYPE_INT64) { ret = boost::python::object(g_value_get_int64(boxed)); } else if (value_type == G_TYPE_UINT64) { ret = boost::python::object(g_value_get_uint64(boxed)); } else if (value_type == GDA_TYPE_BINARY) { const GdaBinary* gdabinary = gda_value_get_binary(boxed); if(gdabinary) ret = boost::python::object((const char*)gdabinary->data); /* TODO: Use the size. TODO: Check for null GdaBinary. */ } else if (value_type == GDA_TYPE_BLOB) { const GdaBlob* gdablob = gda_value_get_blob (boxed); if(gdablob && gdablob->op) { if(gda_blob_op_read_all(const_cast(gdablob->op), const_cast(gdablob))) { ret = boost::python::object((const char*)gdablob->data.data); /* TODO: Use the size. TODO: Check for null GdaBinary. */ } } } else if (value_type == G_TYPE_BOOLEAN) { ret = boost::python::object((bool)g_value_get_boolean(boxed)); #if PY_VERSION_HEX >= 0x02040000 } else if (value_type == G_TYPE_DATE) { const GDate* val = (const GDate*)g_value_get_boxed(boxed); if(val) { //Note that the g_date_get* functions give what we expect, but direct struct field access does not. const int year = g_date_get_year(val); const int month = g_date_get_month(val); const int day = g_date_get_day(val); if(!g_date_valid(val)) std::cerr << G_STRFUNC << ": The GDate is not valid." << std::endl; //std::cout << "DEBUG G_TYPE_DATE: year=" << year << ", month=" << month << ", day=" << day << std::endl; PyObject* cobject = PyDate_FromDate(year, month, day); ret = boost::python::object( (boost::python::handle<>(cobject)) ); } #endif } else if (value_type == G_TYPE_DOUBLE) { ret = boost::python::object(g_value_get_double(boxed)); } else if (value_type == GDA_TYPE_GEOMETRIC_POINT) { const GdaGeometricPoint* val = gda_value_get_geometric_point(boxed); if(val) { PyObject* cobject = Py_BuildValue ("(ii)", val->x, val->y); ret = boost::python::object( (boost::python::handle<>(cobject)) ); } } else if (value_type == G_TYPE_INT) { ret = boost::python::object(g_value_get_int(boxed)); } else if (value_type == GDA_TYPE_NUMERIC) { const GdaNumeric* val = gda_value_get_numeric(boxed); ret = boost::python::object(gda_numeric_get_double((GdaNumeric*)val)); } else if (value_type == G_TYPE_FLOAT) { ret = boost::python::object(g_value_get_float(boxed)); } else if (value_type == GDA_TYPE_SHORT) { ret = boost::python::object(gda_value_get_short(boxed)); } else if (value_type == G_TYPE_STRING) { const gchar* val = g_value_get_string(boxed); ret = boost::python::object(val); } else if (value_type == GDA_TYPE_TIME) { #if PY_VERSION_HEX >= 0x02040000 const GdaTime* val = gda_value_get_time(boxed); if(val) { PyObject* cobject = PyTime_FromTime(val->hour, val->minute, val->second, 0); /* TODO: Should we ignore GDate::timezone ? */ ret = boost::python::object( (boost::python::handle<>(cobject)) ); } } else if (value_type == GDA_TYPE_TIMESTAMP) { const GdaTimestamp* val = gda_value_get_timestamp(boxed); if(val) { PyObject* cobject = PyDateTime_FromDateAndTime(val->year, val->month, val->day, val->hour, val->minute, val->second, 0); /* TODO: Should we ignore GdaTimestamp::timezone ? */ ret = boost::python::object( (boost::python::handle<>(cobject)) ); } #endif } else if (value_type == GDA_TYPE_SHORT) { ret = boost::python::object(gda_value_get_short(boxed)); } else if (value_type == GDA_TYPE_USHORT) { ret = boost::python::object(gda_value_get_ushort(boxed)); } else if (value_type == G_TYPE_UINT) { ret = boost::python::object(g_value_get_uint(boxed)); } else { std::cerr << "Glom: G_VALUE_TYPE() returned unknown type: " << value_type << std::endl; } return ret; } glom-1.22.4/glom/libglom/python_embed/py_glom_ui.cc0000644000175000017500000000423612234776240023512 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { PyGlomUI::PyGlomUI() : m_callbacks(0) { } PyGlomUI::PyGlomUI(const PythonUICallbacks& callbacks) : m_callbacks(&callbacks) { } PyGlomUI::~PyGlomUI() { } void PyGlomUI::show_table_details(const std::string& table_name, const boost::python::object& primary_key_value) { if(!m_callbacks || !(m_callbacks->m_slot_show_table_details)) return; Gnome::Gda::Value gda_primary_key_value; GValue value = {0, {{0}}}; const bool test = glom_pygda_value_from_pyobject(&value, primary_key_value); if(test && G_IS_VALUE(&value)) gda_primary_key_value = Gnome::Gda::Value(&value); m_callbacks->m_slot_show_table_details(table_name, gda_primary_key_value); } void PyGlomUI::show_table_list(const std::string& table_name) { if(m_callbacks && m_callbacks->m_slot_show_table_list) m_callbacks->m_slot_show_table_list(table_name); } void PyGlomUI::print_layout() { if(m_callbacks && m_callbacks->m_slot_print_layout) m_callbacks->m_slot_print_layout(); } void PyGlomUI::print_report(const std::string& report_name) { if(m_callbacks && m_callbacks->m_slot_print_report) m_callbacks->m_slot_print_report(report_name); } void PyGlomUI::start_new_record() { if(m_callbacks && m_callbacks->m_slot_print_report) m_callbacks->m_slot_start_new_record(); } } //namespace Glom glom-1.22.4/glom/libglom/python_embed/py_glom_ui.h0000644000175000017500000000361412234252646023352 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PYTHON_GLOM_UI_H #define GLOM_PYTHON_GLOM_UI_H #include #include #include #include #include namespace Glom { class PyGlomUI { public: //A default constructor seems to be necessary for boost::python PyGlomUI(); explicit PyGlomUI(const PythonUICallbacks& callbacks); ~PyGlomUI(); /** Navigate to the named table, showing the details view for the specified record. */ void show_table_details(const std::string& table_name, const boost::python::object& primary_key_value); /** Navigate to the named table, showing its list view. */ void show_table_list(const std::string& table_name); /** Print the current view of the current table. */ void print_layout(); /** Print the named report from the current table. */ void print_report(const std::string& report_name); /** Offer the user the UI to add a new record. */ void start_new_record(); private: const PythonUICallbacks* m_callbacks; }; } //namespace Glom #endif //GLOM_PYTHON_GLOM_UI_H glom-1.22.4/glom/libglom/python_embed/py_glom_ui_callbacks.h0000644000175000017500000000372512234252646025354 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PYTHON_GLOM_UI_CALLBACKS_H #define GLOM_PYTHON_GLOM_UI_CALLBACKS_H #include #include #include #include namespace Glom { /** UI code should connect to the signals to respond when Python code * request a change in the UI. */ class PythonUICallbacks { public: /** For example, * void on_show_table_details(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value); */ sigc::slot m_slot_show_table_details; /** For example, * void on_show_table_list(const Glib::ustring& table_name); */ sigc::slot m_slot_show_table_list; /** For example, * void on_print_report(const Glib::ustring& report_name); */ sigc::slot m_slot_print_report; /** For example, * void on_print_layout(); */ sigc::slot m_slot_print_layout; /** For example, * void on_start_new_record(); * Use an empty Value for auto-created fields. */ sigc::slot m_slot_start_new_record; }; } //namespace Glom #endif //GLOM_PYTHON_GLOM_CALLBACKS_UI_H glom-1.22.4/glom/libglom/python_embed/py_glom_related.cc0000644000175000017500000000766712234252646024527 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include //#include #include #include #include #include namespace Glom { PyGlomRelated::PyGlomRelated() { } PyGlomRelated::~PyGlomRelated() { } PyGlomRelated::type_map_relationships::size_type PyGlomRelated::len() const { return m_map_relationships.size(); } boost::python::object PyGlomRelated::getitem(const boost::python::object& cppitem) { boost::python::extract extractor(cppitem); if(extractor.check()) { const std::string key = extractor; if(!key.empty()) { //Return a cached item if possible: PyGlomRelated::type_map_relatedrecords::iterator iterCacheFind = m_map_relatedrecords.find(key); if(iterCacheFind != m_map_relatedrecords.end()) { //Return a reference to the cached item: boost::python::object objectRelatedRecord = iterCacheFind->second; return objectRelatedRecord; } else { //If the relationship exists: PyGlomRelated::type_map_relationships::const_iterator iterFind = m_map_relationships.find(key); if(iterFind != m_map_relationships.end()) { //Return a new RelatedRecord: PyGlomRelatedRecord* pyRelatedRecord = new PyGlomRelatedRecord(); //Fill it. //Get the value of the from_key in the parent record. sharedptr relationship = iterFind->second; const Glib::ustring from_key = relationship->get_from_field(); boost::python::extract extractor(m_record); if(extractor.check()) { PyGlomRecord* record = extractor; PyGlomRecord::type_map_field_values::const_iterator iterFromKey = record->m_map_field_values.find(from_key); if(iterFromKey != record->m_map_field_values.end()) { const Gnome::Gda::Value& from_key_value = iterFromKey->second; //TODO_Performance: //Get the full field details so we can sqlize its value: sharedptr from_key_field = record->m_document->get_field(record->m_table_name, from_key); if(from_key_field) { pyRelatedRecord->set_relationship(iterFind->second, from_key_value, record->m_document); //Store it in the cache: boost::python::object objectRelatedRecord(pyRelatedRecord); m_map_relatedrecords[key] = objectRelatedRecord; return objectRelatedRecord; } } } } } } } PyErr_SetString(PyExc_IndexError, "relationship not found"); boost::python::throw_error_already_set(); //TODO: Find a simpler way to throw a python exception/error. return boost::python::object(); } /* static void Related_HandlePythonError() { if(PyErr_Occurred()) PyErr_Print(); } */ void PyGlomRelated::set_relationships(const PyGlomRelated::type_map_relationships& relationships) { m_map_relationships = relationships; } } //namespace Glom glom-1.22.4/glom/libglom/python_embed/py_glom_record.h0000644000175000017500000000504512234252646024213 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PYTHON_GLOM_RECORD_H #define GLOM_PYTHON_GLOM_RECORD_H #include #include #include #include namespace Glom { class PyGlomRelated; class PyGlomRecord { public: PyGlomRecord(); ~PyGlomRecord(); /* Prevent python code from changing data in the database via this object. * For instance, this should be used in a field calculation, * though changing data would be OK from a script. * This is not exposed via Python. */ void set_read_only(); std::string get_table_name() const; //TODO: Use a more specific type somehow? boost::python::object get_connection(); boost::python::object get_related(); //Available, for instance, in python via record["name_first"] typedef std::map type_map_field_values; //[] notation: type_map_field_values::size_type len() const; boost::python::object getitem(const boost::python::object& item); void setitem(const boost::python::object& /* key */, const boost::python::object& /* value */); void set_fields(const PyGlomRecord::type_map_field_values& field_values, Document* document, const Glib::ustring& table_name, const sharedptr& key_field, const Gnome::Gda::Value& key_field_value, const Glib::RefPtr& opened_connection); public: Document* m_document; Glib::ustring m_table_name; type_map_field_values m_map_field_values; private: sharedptr m_key_field; Gnome::Gda::Value m_key_field_value; boost::python::object m_related; //Actually a PyGlomRelated Glib::RefPtr m_connection; private: bool m_read_only; }; } //namespace Glom #endif //GLOM_PYTHON_GLOM_RECORD_H glom-1.22.4/glom/libglom/init.cc0000644000175000017500000000543212234776363017642 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2009 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include //Include it before anything else to avoid "_POSIX_C_SOURCE redefined". #if PY_VERSION_HEX >= 0x02040000 # include /* From Python */ #endif #include #include #include #include #include #include //TODO: Remove this redefine when Python fixes the compiler error in their macro: // http://bugs.python.org/issue7463 // Note that this sets a local copy of PyDateTimeAPI (in Python's datetime.h // header) so it _must_ be repeated and called before any code that use the // Python PyDate* macros (!) such as PyDateTime_Check #undef PyDateTime_IMPORT #define PyDateTime_IMPORT \ PyDateTimeAPI = (PyDateTime_CAPI*) PyCObject_Import((char*)"datetime", \ (char*)"datetime_CAPI") namespace Glom { void libglom_init() { //Threading is always enabled starting from GLib 2.31.0: //TODO: Just remove this when we can increase the glibmm version needed: #if !GLIB_CHECK_VERSION (2, 31, 0) if (!Glib::thread_supported()) Glib::thread_init(0); //So we can use GMutex. #endif Gnome::Gda::init(); Gio::init(); Py_Initialize(); PyDateTime_IMPORT; //A macro, needed to use PyDate_Check(), PyDateTime_Check(), etc. if(!PyDateTimeAPI) { //Give people a clue on stdout: std::cerr << G_STRFUNC << ": PyDateTime_IMPORT (a python module import) failed." << std::endl; //This gives more information. When this happens it is generally a linker //failure while importing a python module: //See https://bugzilla.gnome.org/show_bug.cgi?id=644702 PyErr_Print(); } //Initialize PyGObject, so that functions such as pygobject_new() work //instead of crashing. pygobject_init(3, 0, 0); //The major version should match the one in configure.ac. } void libglom_deinit() { //We use python for calculated-fields: Py_Finalize(); //Clean up singletons: Glom::ConnectionPool::delete_instance(); } } //namespace Glom glom-1.22.4/glom/libglom/test_connectionpool.cc0000644000175000017500000000555612234252646022767 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2008 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #define GLOM_ENABLE_POSTGRESQL #ifdef GLOM_ENABLE_POSTGRESQL #include #else #include #endif //#GLOM_ENABLE_POSTGRESQL #include int main() { Gnome::Gda::init(); Glib::RefPtr gdaconnection; { //Set the connection details: Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); if(connection_pool) { //Set the connection details in the ConnectionPool singleton. //The ConnectionPool will now use these every time it tries to connect. connection_pool->set_database("glom_musiccollection217"); connection_pool->set_user("murrayc"); connection_pool->set_password("murraycpw"); #ifdef GLOM_ENABLE_POSTGRESQL Glom::ConnectionPoolBackends::PostgresCentralHosted* backend = new Glom::ConnectionPoolBackends::PostgresCentralHosted; backend->set_host("localhost"); backend->set_port(5433); backend->set_try_other_ports(false); #else Glom::ConnectionPoolBackends::Sqlite* backend = new Glom::ConnectionPoolBackends::Sqlite; #endif //GLOM_ENABLE_POSTGRESQL connection_pool->set_backend(std::auto_ptr(backend)); connection_pool->set_ready_to_connect(); //connect_to_server() will now attempt the connection-> Shared instances of m_Connection will also be usable. } //Connect: Glom::sharedptr connection; try { connection = Glom::ConnectionPool::get_and_connect(); } catch(const Glom::ExceptionConnection& ex) { std::cout << "Exception: " << ex.what() << std::endl; } if(connection) std::cout << "Connected" << std::endl; else std::cout << "Connection failed." << std::endl; gdaconnection = connection->get_gda_connection(); //Cleanup: Glom::ConnectionPool::delete_instance(); } std::cout << "gdaconnection refcount=" << G_OBJECT(gdaconnection->gobj())->ref_count << std::endl; return 0; } glom-1.22.4/glom/libglom/libglom_config.h0000644000175000017500000000131112234777137021503 0ustar00murraycmurrayc00000000000000/* glom/libglom/libglom_config.h. Generated from libglom_config.h.in by configure. */ #ifndef GLOM_LIBGLOM_CONFIG_H #define GLOM_LIBGLOM_CONFIG_H /* "definition of GLOM_DTD_INSTALL_DIR" */ /* #undef GLOM_DTD_INSTALL_DIR */ /* Define to 1 if you have the `dcgettext' function. */ #define HAVE_DCGETTEXT 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define if the GNU gettext() function is already present or preinstalled. */ #define HAVE_GETTEXT 1 /* Define to 1 if you have the `strptime' function. */ #define HAVE_STRPTIME 1 /* Define to the installation prefix of the iso-codes module. */ #define ISO_CODES_PREFIX "/opt/gnome" #endif /* GLOM_LIBGLOM_CONFIG_H */ glom-1.22.4/glom/libglom/translations_po.cc0000644000175000017500000002323212234776363022114 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include // To read the .po files #include #include "config.h" //For HAVE_GETTEXTPO_XERROR #include #include #include #include #include /* For really ugly hacks! */ #include #define GLOM_PO_HEADER \ "msgid \"\"\n" \ "msgstr \"\"\n" \ "\"Project-Id-Version: %1\\n\"\n" \ "\"product=glom&keywords=I18N+L10N&component=general\\n\"\n" \ "\"PO-Revision-Date: %2\\n\"\n" \ "\"Last-Translator: Someone \\n\"\n" \ "\"Language-Team: %3 \\n\"\n" \ "\"MIME-Version: 1.0\\n\"\n" \ "\"Content-Type: text/plain; charset=UTF-8\\n\"\n" \ "\"Content-Transfer-Encoding: 8bit\\n\"" namespace Glom { static jmp_buf jump; static void show_gettext_error(int severity, const char* filename, const gchar* message) { std::ostringstream msg_stream; if(filename) msg_stream << filename << ": "; if(message) msg_stream << message; switch(severity) { #ifdef PO_SEVERITY_WARNING //This was introduced in libgettext-po some time after gettext version 0.14.5 case PO_SEVERITY_WARNING: { // Show only debug output std::cout << _("Gettext-Warning: ") << msg_stream.str() << std::endl; break; } #endif //PO_SEVERITY_WARNING #ifdef PO_SEVERITY_ERROR //This was introduced in libgettext-po some time after gettext version 0.14.5 case PO_SEVERITY_ERROR: #endif //PO_SEVERITY_ERROR #ifdef PO_SEVERITY_FATAL_ERROR //This was introduced in libgettext-po some time after gettext version 0.14.5 case PO_SEVERITY_FATAL_ERROR: #endif //PO_SEVERITY_FATAL_ERROR default: { //TODO: const Glib::ustring msg = Glib::ustring(_("Gettext-Error: ")) + ' ' + msg_stream.str(); //Gtk::MessageDialog dlg(msg, false, Gtk::MESSAGE_ERROR); //dlg.run(); break; } } } /* * The exception handling of libgettext-po is very ugly! The following methods are called * if an exception occurs and may not return in case of a fatal exception. We use setjmp * and longjmp to bypass this and return to the caller */ #ifdef HAVE_GETTEXTPO_XERROR static void on_gettextpo_xerror (int severity, po_message_t /* message */, const char *filename, size_t /* lineno */, size_t /* column */, int /* multiline_p */, const char *message_text) { show_gettext_error(severity, filename, message_text); #ifdef PO_SEVERITY_FATAL_ERROR //This was introduced in libgettext-po some time after gettext version 0.14.5 if(severity == PO_SEVERITY_FATAL_ERROR) longjmp(jump, 1); #endif //PO_SEVERITY_FATAL_ERROR } static void on_gettextpo_xerror2 (int severity, po_message_t /* message1 */, const char * filename1, size_t /* lineno1 */, size_t /* column1 */, int /* multiline_p1 */, const char *message_text1, po_message_t /* message2 */, const char * /*filename2 */, size_t /* lineno2 */, size_t /* column2 */, int /* multiline_p2 */, const char * /* message_text2 */) { show_gettext_error(severity, filename1, message_text1); #ifdef PO_SEVERITY_FATAL_ERROR //This was introduced in libgettext-po some time after gettext version 0.14.5 if(severity == PO_SEVERITY_FATAL_ERROR) longjmp(jump, 1); #endif //PO_SEVERITY_FATAL_ERROR } #else //HAVE_GETTEXTPO_XERROR static void on_gettextpo_error(int status, int errnum, const char * /* format */, ...) { std::cerr << "gettext error (old libgettext-po API): status=" << status << ", errnum=" << errnum << std::endl; } #endif //HAVE_GETTEXTPO_XERROR Glib::ustring get_po_context_for_item(const sharedptr& item, const Glib::ustring& hint) { // Note that this context string should use English rather than the translated strings, // or the context would change depending on the locale of the user doing the export: Glib::ustring result = TranslatableItem::get_translatable_type_name_nontranslated(item->get_translatable_item_type()); const Glib::ustring name = item->get_name(); if(!name.empty()) result += " (" + item->get_name() + ')'; if(!hint.empty()) result += ". " + hint; return result; } bool write_pot_file(Document* document, const Glib::ustring& pot_file_uri) { //A .pot file return write_translations_to_po_file(document, pot_file_uri, Glib::ustring() /* no locale */); } bool write_translations_to_po_file(Document* document, const Glib::ustring& po_file_uri, const Glib::ustring& translation_locale, const Glib::ustring& locale_name) { std::string filename; try { filename = Glib::filename_from_uri(po_file_uri); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << "Exception when converting URI to filepath: " << ex.what() << std::endl; return false; } //We do not use gettext-po.h and its po_file_write() function for this, //because that does not allow us to specify UTF-8, so it drops non-ASCII //characters such as U with umlaut. //It also has no obvious API for setting the header, so we would have to //do that manually anyway. Glib::ustring data; Document::type_list_translatables list_layout_items = document->get_translatable_items(); for(Document::type_list_translatables::iterator iter = list_layout_items.begin(); iter != list_layout_items.end(); ++iter) { sharedptr item = iter->first; if(!item) continue; if(item->get_title_original().empty()) continue; const Glib::ustring hint = iter->second; // Add "context" comments, to uniquely identify similar strings, used in different places, // and to provide a hint for translators. Glib::ustring msg = "msgctxt \"" + get_po_context_for_item(item, hint) + "\"\n"; //The original and its translation: msg += "msgid \"" + item->get_title_original() + "\"\n"; msg += "msgstr \"" + item->get_title_translation(translation_locale, false) + "\""; data += msg + "\n\n"; } //The header: const Glib::DateTime revision_date = Glib::DateTime::create_now_local(); const Glib::ustring revision_date_str = revision_date.format("%F %R%z"); const Glib::ustring header = Glib::ustring::compose(GLOM_PO_HEADER, document->get_database_title_original(), revision_date_str, locale_name); const Glib::ustring full = header + "\n\n" + data; Glib::file_set_contents(filename, full); return true; } bool import_translations_from_po_file(Document* document, const Glib::ustring& po_file_uri, const Glib::ustring& translation_locale) { std::string filename; try { filename = Glib::filename_from_uri(po_file_uri); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << "Exception when converting URI to filepath: " << ex.what() << std::endl; return false; } Document::type_list_translatables list_layout_items = document->get_translatable_items(); if(list_layout_items.empty()) return false; if(setjmp(jump) != 0) return false; #ifdef HAVE_GETTEXTPO_XERROR po_xerror_handler error_handler; memset(&error_handler, 0, sizeof(error_handler)); error_handler.xerror = &on_gettextpo_xerror; error_handler.xerror2 = &on_gettextpo_xerror2; #else po_error_handler error_handler; memset(&error_handler, 0, sizeof(error_handler)); error_handler.error = &on_gettextpo_error; #endif //HAVE_GETTEXTPO_XERROR po_file_t po_file = po_file_read(filename.c_str(), &error_handler); if(!po_file) { // error message is already given by error_handle. return false; } //Look at each domain (could there be more than one?): const char* const* domains = po_file_domains(po_file); for (int i = 0; domains[i] != 0; ++i) { //Look at each message: po_message_iterator_t iter = po_message_iterator(po_file, domains[i]); po_message_t msg; while ((msg = po_next_message(iter))) { //This message: //TODO: Just use const char* instead of copying it in to a Glib::ustring, //if we have performance problems here: const Glib::ustring msgid = Glib::convert_const_gchar_ptr_to_ustring( po_message_msgid(msg) ); const Glib::ustring msgstr = Glib::convert_const_gchar_ptr_to_ustring( po_message_msgstr(msg) ); const Glib::ustring msgcontext = Glib::convert_const_gchar_ptr_to_ustring( po_message_msgctxt(msg) ); //Find the matching item in the list: for(Document::type_list_translatables::iterator iter = list_layout_items.begin(); iter != list_layout_items.end(); ++iter) { sharedptr item = iter->first; if(!item) continue; const Glib::ustring hint = iter->second; if( (item->get_title_original() == msgid) && (get_po_context_for_item(item, hint) == msgcontext) ) // This is not efficient, but it should be reliable. { item->set_title(msgstr, translation_locale); // Keep examining items, in case there are duplicates. break; } } } po_message_iterator_free(iter); } po_file_free(po_file); document->set_modified(); return true; } } //namespace Glom glom-1.22.4/glom/libglom/xsl_utils.cc0000644000175000017500000001055712234776363020731 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include //#include //For exsltRegisterAll(). #include #include #include #include //For stringstream #include #include #include // for locale, time_put #include // for struct tm #include // for cout, endl #include namespace { static std::string get_xsl_file_dir() { #ifdef G_OS_WIN32 gchar* directory = g_win32_get_package_installation_directory_of_module(0); const std::string xsltdir = Glib::build_filename(directory, "share" G_DIR_SEPARATOR_S "glom" G_DIR_SEPARATOR_S "xslt"); g_free(directory); return xsltdir; #else return GLOM_PKGDATADIR_XSLT; #endif } static std::string get_xslt_file(const std::string& xsl_file) { const std::string result = Glib::build_filename(get_xsl_file_dir(), xsl_file); // Check that it exists: const Glib::RefPtr file = Gio::File::create_for_path(result); if(file && file->query_exists()) return result; return Glib::build_filename(GLOM_PKGDATADIR_XSLT_NOTINSTALLED, xsl_file); } } namespace Glom { static Glib::ustring xslt_process(const xmlpp::Document& xml_document, const std::string& filepath_xslt) { //Debug output: //std::cout << "XML before XSLT processing: " << std::endl; //std::cout << " "; //xmlpp::Document& nonconst = const_cast(xml_document); //nonconst.write_to_stream_formatted(std::cout); //std::cout << std::endl; Glib::ustring result; //Use libxslt to transform the XML: xmlDocPtr style = xmlReadFile(filepath_xslt.c_str(), 0, 0); if(style) { //We need this to be able to use the exsl: functions, even if we declare the namespace at the start of the xsl. //We don't need this anymore - we use xsl:copy-of instead of exsl:node-set (which didn't work as expected anyway): //exsltRegisterAll(); //Parse the stylesheet: xsltStylesheetPtr cur = xsltParseStylesheetDoc(style); if(cur) { //Use the parsed stylesheet on the XML: xmlDocPtr pDocOutput = xsltApplyStylesheet(cur, const_cast(xml_document.cobj()), 0); xsltFreeStylesheet(cur); //Get the output text: xmlChar* buffer = 0; int length = 0; xmlIndentTreeOutput = 1; //Format the output with extra white space. TODO: Is there a better way than this global variable? xmlDocDumpFormatMemoryEnc(pDocOutput, &buffer, &length, 0, 0); if(buffer) { // Create a Glib::ustring copy of the buffer // Here we force the use of Glib::ustring::ustring( InputIterator begin, InputIterator end ) // instead of Glib::ustring::ustring( const char*, size_type ) because it // expects the length of the string in characters, not in bytes. result = Glib::ustring( reinterpret_cast(buffer), reinterpret_cast(buffer + length) ); // Deletes the original buffer xmlFree(buffer); } xmlFreeDoc(pDocOutput); } } return result; } Glib::ustring GlomXslUtils::transform(const xmlpp::Document& xml_document, const std::string& xsl_file_path) { //Use libxslt to convert the XML to HTML: return xslt_process(xml_document, get_xslt_file(xsl_file_path)); //std::cout << "After xslt: " << result << std::endl; } } //namespace Glom glom-1.22.4/glom/libglom/db_utils.h0000644000175000017500000002225612234776363020351 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DB_UTILS_H #define GLOM_DB_UTILS_H #include #include namespace Glom { namespace DbUtils { bool create_database(Document* document, const Glib::ustring& database_name, const Glib::ustring& title, const sigc::slot& progress); //TODO: Use this in Glom::AppWindow? /** Create the database on an already-connected server. */ bool recreate_database_from_document(Document* document, const sigc::slot& progress); /** This creates the standard tables if necessary, * filling them with some information from the document. */ SystemPrefs get_database_preferences(Document* document); void set_database_preferences(Document* document, const SystemPrefs& prefs); bool add_standard_tables(Document* document); bool add_standard_groups(Document* document); bool add_groups_from_document(Document* document); bool set_table_privileges_groups_from_document(Document* document); typedef std::vector< sharedptr > type_vec_fields; type_vec_fields get_fields_for_table_from_database(const Glib::ustring& table_name, bool including_system_fields = false); bool get_field_exists_in_database(const Glib::ustring& table_name, const Glib::ustring& field_name); /** Get all the fields for a table, including any from the database that are not yet known in the document. * * @param table_name The name of the table whose fields should be listed. * @param including_system_fields Whether extra non-user-visible fields should be included in the list. * @result A list of fields. */ type_vec_fields get_fields_for_table(const Document* document, const Glib::ustring& table_name, bool including_system_fields = false); /** Get a single field definition for a table, even if the field is in the datasbase but not yet known in the document. * * @param table_name The name of the table whose fields should be listed. * @param field_name The name of the field for which to get the definition. * @result The field definition. */ sharedptr get_fields_for_table_one_field(const Document* document, const Glib::ustring& table_name, const Glib::ustring& field_name); typedef std::vector type_vec_strings; /** Get the table names from the database server. * This could theoretically be different than the ones listed in the document. */ type_vec_strings get_table_names_from_database(bool ignore_system_tables = false); bool get_table_exists_in_database(const Glib::ustring& table_name); bool create_table(const sharedptr& table_info, const Document::type_vec_fields& fields); /// Also saves the table information in the document: bool create_table_with_default_fields(Document* document, const Glib::ustring& table_name); bool create_table_add_missing_fields(const sharedptr& table_info, const Document::type_vec_fields& fields); // TODO: Should these functions update the document, so callers don't need // to do it? bool add_column(const Glib::ustring& table_name, const sharedptr& field, Gtk::Window* parent_window); bool drop_column(const Glib::ustring& table_name, const Glib::ustring& field_name); /** Insert example data, from the document, into the table on the database server. */ bool insert_example_data(Document* document, const Glib::ustring& table_name); /** Execute a SQL Select command, returning the result. * @param builder The finished SqlBuilder object. * @use_cursor Whether the data model should be cursor-based (not allowing random access). */ Glib::RefPtr query_execute_select( const Glib::RefPtr& builder, bool use_cursor = false); /** Execute a SQL non-select command, returning true if it succeeded. * See also query_execute(), which takes a SqlBuilder. * This should only be used for SQL commands that are not supported by SqlBuilder, * such as ADD GROUP. */ bool query_execute_string(const Glib::ustring& strQuery, const Glib::RefPtr& params = Glib::RefPtr(0)); /** Execute a SQL non-select command, returning true if it succeeded. */ bool query_execute(const Glib::RefPtr& builder); /** Insert the auto-increment row in the database preferences table, if necessary, * returning the next value. */ Gnome::Gda::Value auto_increment_insert_first_if_necessary(const Glib::ustring& table_name, const Glib::ustring& field_name); /** Get the next auto-increment value for this primary key, from the glom system table. * Add a row for this field in the system table if it does not exist already. * This increments the next value after obtaining the current next value. */ Gnome::Gda::Value get_next_auto_increment_value(const Glib::ustring& table_name, const Glib::ustring& field_name); /** Use this, for instance, when deleting a table. */ void remove_auto_increment(const Glib::ustring& table_name, const Glib::ustring& field_name); void layout_item_fill_field_details(Document* document, const Glib::ustring& parent_table_name, sharedptr& layout_item); //TODO: It would be nice to use sharedptr& instead of sharedptr&, //but it does not seem possible to pass a sharedptr for a sharedptr&. /** Decides whether a field should have an Open button next to it, * allowing the user to navigate to a related record. * * @param layout_item A field on a layout. This must have full field details. * @param field_used_in_relationship_to_one A relationship, if the field identifies a single record, so a Find button would also make sense, to choose the ID, in editing mode. */ bool layout_field_should_have_navigation(const Glib::ustring& table_name, const sharedptr& layout_item, const Document* document, sharedptr& field_used_in_relationship_to_one); /** Discover a database name that is not yet used. * This assumes that all other connection details are correctly set. * * @param base_name The wished-for name, to be modified until an unused name is found. * @result A database name that does not yet exist on the server. */ Glib::ustring get_unused_database_name(const Glib::ustring& base_name); /** Discover how many rows a SQL query would return if it was run. * * This uses a COUNT * on a the @a sql_query as a sub-statement. * Be careful not to include ORDER BY clauses in the supplied SQL query, because that would make it unnecessarily slow. * * @sql_query A SQL query. * @result The number of rows. Or -1 if something went wrong. */ int count_rows_returned_by(const Glib::RefPtr& sql_query); /** Rename a table in the database. */ bool rename_table(const Glib::ustring& table_name, const Glib::ustring& new_table_name); /* Remove a table from the database. */ bool drop_table(const Glib::ustring& table_name); /** Escape, and quote, SQL identifiers such as table names. */ Glib::ustring escape_sql_id(const Glib::ustring& id); /** Just a wrapper around gda_rfc1738_encode(), * for use when building libgda connection strings or authentication strings. */ Glib::ustring gda_cnc_string_encode(const Glib::ustring& str); Glib::ustring build_query_create_group(const Glib::ustring& group, bool superuser = false); Glib::ustring build_query_add_user_to_group(const Glib::ustring& group, const Glib::ustring& user); /** Add a @a user to the database, with the specified @a password, in the specified @a group. * @result true if the addition succeeded. */ bool add_user(const Document* document, const Glib::ustring& user, const Glib::ustring& password, const Glib::ustring& group); /** Remove the @a user from the database. * @result true if the removal succeeded. */ bool remove_user(const Glib::ustring& user); /** Add a @a group to the database. * @result true if the addition succeeded. */ bool add_group(const Document* document, const Glib::ustring& group, bool superuser = false); bool remove_user_from_group(const Glib::ustring& user, const Glib::ustring& group); /** Get the value of the @a source_field from the @a relationship, using the @a key_value. */ Gnome::Gda::Value get_lookup_value(Document* document, const Glib::ustring& table_name, const sharedptr& relationship, const sharedptr& source_field, const Gnome::Gda::Value & key_value); /** Allow a fake connection, so sqlbuilder_get_full_query() can work. */ void set_fake_connection(); } //namespace DbUtils } //namespace Glom #endif //GLOM_DB_UTILS_H glom-1.22.4/glom/libglom/connectionpool.h0000644000175000017500000003121712234252645021562 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_CONNECTIONPOOL_H #define GLOM_CONNECTIONPOOL_H #include #include #include #include #include #include #include // For std::auto_ptr //Avoid including the header here: extern "C" { typedef struct _EpcPublisher EpcPublisher; typedef struct _EpcContents EpcContents; typedef struct _EpcAuthContext EpcAuthContext; } namespace Gtk { class Dialog; } namespace Glom { class AvahiPublisher; /** When the SharedConnection is destroyed, it will inform the connection pool, * so that the connection pool can keep track of who is using the connection, * so that it can close it when nobody is using it. */ class SharedConnection : public sigc::trackable { public: SharedConnection(); SharedConnection(const Glib::RefPtr& gda_connection); virtual ~SharedConnection(); Glib::RefPtr get_gda_connection(); Glib::RefPtr get_gda_connection() const; /** Be careful not to use the gda_connection, or any copies of the SharedConnection after calling this. */ void close(); //TODO: Document this: typedef sigc::signal type_signal_finished; type_signal_finished signal_finished(); private: Glib::RefPtr m_gda_connection; type_signal_finished m_signal_finished; }; class Document; /** This is a singleton. * Use get_instance(). */ class ConnectionPool : public sigc::trackable { private: ConnectionPool(); //ConnectionPool(const ConnectionPool& src); virtual ~ConnectionPool(); //ConnectionPool& operator=(const ConnectionPool& src); public: typedef ConnectionPoolBackends::Backend Backend; typedef Backend::type_vec_const_fields type_vec_const_fields; /** Get the singleton instance. * Use delete_instance() when the program quits. */ static ConnectionPool* get_instance(); /** Whether the connection is ready to be used. */ static bool get_instance_is_ready(); /** Make the ConnectionPool use the correct backend, with the necessary details, * as required by the document. */ void setup_from_document(const Document* document); /// Delete the singleton so it doesn't show up as leaked memory in, for instance, valgrind. static void delete_instance(); typedef sigc::slot type_void_slot; #ifndef G_OS_WIN32 /** Set callbacks that will be called to show UI while starting to advertise * on the network via Avahi. * * @param slot_begin Show an explanatory message. * @param slot_progress Show a pulse progress and/or keep the UI updating. * @param slot_done Stop showing the message. */ void set_avahi_publish_callbacks(const type_void_slot& slot_begin, const type_void_slot& slot_progress, const type_void_slot& slot_done); #endif bool get_ready_to_connect() const; void set_ready_to_connect(bool val = true); /** Do not actually connect to the database, * but create a Gnome::Gda::Connection object * just so that utility functions such as Utils::sqlbuilder_get_full_query() * and DbUtils::escape_sql_id() can work. */ void set_fake_connection(); void set_backend(std::auto_ptr backend); Backend* get_backend(); const Backend* get_backend() const; /** Discover whether the backend can create GdaDataModels that can be iterated, * by creating them with the GDA_STATEMENT_MODEL_CURSOR_FORWARD flag. * If not (with sqlite, for instance), the GdaDataAccessWrapper model can provide that API, without the performance. */ bool get_backend_supports_cursor() const; /** This method will return a SharedConnection, either by opening a new connection or returning an already-open connection. * When that SharedConnection is destroyed, or when SharedConnection::close() is called, then the ConnectionPool will be informed. * The connection will only be closed when all SharedConnections have finished with their connections. * * @result a sharedptr to a SharedConnection. This sharedptr will be null if the connection failed. * * @throws an ExceptionConnection when the connection fails. */ sharedptr connect(); static sharedptr get_and_connect(); /** This callback should show UI to indicate that work is still happening. * For instance, a pulsing ProgressBar. */ typedef Backend::SlotProgress SlotProgress; /** Creates a new database. */ void create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name); /** Save a backup of the database in a tarball. * This backup can later be used to recreate the database, * for instance with a later version of PostgreSQL. * See @convert_backup(). * * @param path_dir The top-level directory for the backup file, using the normal directory structure. * */ bool save_backup(const SlotProgress& slot_progress, const std::string& path_dir); /** Use a backup of the database in a tarball to create tables and data in an existing empty database. * The database (server) should already have the necessary groups and users. * * @param path_dir The top-level directory for the backup file, using the normal directory structure. * See save_backup(). */ bool convert_backup(const SlotProgress& slot_progress, const std::string& path_dir); void set_user(const Glib::ustring& value); void set_password(const Glib::ustring& value); void set_database(const Glib::ustring& value); Glib::ustring get_user() const; Glib::ustring get_password() const; Glib::ustring get_database() const; const FieldTypes* get_field_types() const; Gnome::Gda::SqlOperatorType get_string_find_operator() const; typedef Backend::InitErrors InitErrors; /** Do one-time initialization, such as creating required database * files on disk for later use by their own database server instance. * * @param slot_progress A callback to call while the work is still happening. * @param network_shared Whether the database (and document) should be available to other users over the network, * if possible. * @param parent_window A parent window to use as the transient window when displaying errors. */ InitErrors initialize(const SlotProgress& slot_progress, bool network_shared = false); typedef Backend::StartupErrors StartupErrors; /** Start a database server instance for the existing database files. * * @param slot_progress A callback to call while the work is still happening. * @param network_shared Whether the database (and document) should be available to other users over the network, * if possible. * @param parent_window The parent window (transient for) of any dialogs shown during this operation. * @result Whether the operation was successful. */ StartupErrors startup(const SlotProgress& slot_progress, bool network_shared = false); /** Stop the database server instance for the database files. * * @param slot_progress A callback to call while the work is still happening. * @param parent_window The parent window (transient for) of any dialogs shown during this operation. */ bool cleanup(const SlotProgress& slot_progress); ///Whether to automatically shutdown the database server when Glom crashes. void set_auto_server_shutdown(bool val = true); /** Change the database server's configration to allow or prevent access from * other users on the network. * * For current backends, you may use this only before startup(), * or after cleanup(). * * @param slot_progress A callback to call while the work is still happening. * @param network_shared Whether the database (and document) should be available to other users over the network, * if possible. */ virtual bool set_network_shared(const SlotProgress& slot_progress, bool network_shared = true); /** Add a field to the database. * The caller should then update the document's list of fields, * for instance by calling Document::set_table_fields(). * * @param table_name The parent table of the fields to be changed. * @param field The field to be added. */ bool add_column(const Glib::ustring& table_name, const sharedptr& field) throw(); /** Remove a field from the database. * The caller should then update the document's list of fields, * for instance by calling Document::set_table_fields(). * * @param table_name The parent table of the fields to be changed. * @param field_name The name of the field to be removed. */ bool drop_column(const Glib::ustring& table_name, const Glib::ustring& field_name) throw(); /** Change some detail about a field in the database. * The caller should then update the document's list of fields, * for instance by calling Document::set_table_fields(). * * @param table_name The parent table of the field to be changed. * @param field_old The old field information. * @param field The new field information. */ bool change_column(const Glib::ustring& table_name, const sharedptr& field_old, const sharedptr& field) throw(); /** Change some detail about some fields in the database. * The caller should then update the document's list of fields, * for instance by calling Document::set_table_fields(). * * @param table_name The parent table of the fields to be changed. * @param old_fields The old field information. * @param fields The new field information. */ bool change_columns(const Glib::ustring& table_name, const type_vec_const_fields& old_fields, const type_vec_const_fields& fields) throw(); /** Specify a callback that the ConnectionPool can call to get a pointer to the document. * This callback avoids Connection having to link to AppWindow, * and avoids us worrying about whether a previously-set document (via a set_document() method) is still valid. */ typedef sigc::slot SlotGetDocument; void set_get_document_func(const SlotGetDocument& slot); #ifndef G_OS_WIN32 static EpcContents* on_publisher_document_requested (EpcPublisher* publisher, const gchar* key, gpointer user_data); static gboolean on_publisher_document_authentication(EpcAuthContext* context, const gchar* user_name, gpointer user_data); static void on_epc_progress_begin(const gchar *title, gpointer user_data); static void on_epc_progress_update(gdouble progress, const gchar* message, gpointer user_data); static void on_epc_progress_end(gpointer user_data); #endif // !G_OS_WIN32 //TODO: Document void set_show_debug_output(bool val); bool get_show_debug_output() const; //Show the gda error in a dialog. static bool handle_error_cerr_only(); private: void on_sharedconnection_finished(); /** We call this when we know that the current connection will no longer work, * for instance after we have stopped the server. */ void invalidate_connection(); /** Examine ports one by one, starting at @a starting_port, in increasing order, * and return the first one that is available. */ //static int discover_first_free_port(int start_port, int end_port); Document* get_document(); #ifndef G_OS_WIN32 /** Advertize self-hosting via avahi: */ void avahi_start_publishing(); void avahi_stop_publishing(); #endif // !G_OS_WIN32 private: EpcPublisher* m_epc_publisher; Gtk::Dialog* m_dialog_epc_progress; //For progress while generating certificates. std::auto_ptr m_backend; Glib::RefPtr m_refGdaConnection; guint m_sharedconnection_refcount; bool m_ready_to_connect; Glib::ustring m_user, m_password, m_database; FieldTypes* m_pFieldTypes; bool m_show_debug_output, m_auto_server_shutdown; bool m_fake_connection; private: static ConnectionPool* m_instance; SlotGetDocument m_slot_get_document; type_void_slot m_epc_slot_begin, m_epc_slot_progress, m_epc_slot_done; }; } //namespace Glom #endif //GLOM_CONNECTIONPOOL_H glom-1.22.4/glom/libglom/gst-package.c0000644000175000017500000001247412234252646020717 0ustar00murraycmurrayc00000000000000/* -*- Mode: C; c-file-style: "gnu"; tab-width: 8 -*- */ /* * Copyright (C) 2004 Vincent Untz * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Authors: Vincent Untz * Guillaume Desmottes * Carlos Garnacho */ /* TODO: Use PackageKit? Is that recommended on all major distros now? */ /* Commented-out because this is only useful when * using the example code while patching * ConnectionPoolBackends::PostgresSelf::install_postgres(). */ #if 0 #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #include #include "gst-package.h" static void show_error_dialog (GtkWindow *window, const gchar *secondary_text) { GtkWidget *dialog; dialog = gtk_message_dialog_new (window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not install package")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), secondary_text); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } static gboolean find_app (GtkWindow *window, const gchar *app) { gchar *path; path = g_find_program_in_path (app); if(!path) { show_error_dialog (window, _("The necessary applications to install" " the package could not be found.")); return FALSE; } g_free (path); return TRUE; } static gchar * create_temp_file (const gchar *packages[]) { int fd; gchar *path, *str; path = g_strdup_printf ("/tmp/packages.XXXXXX"); fd = mkstemp (path); while (*packages) { str = g_strdup_printf ("%s\ti\n", *packages); write (fd, str, strlen (str)); g_free (str); packages++; } close (fd); return path; } static gchar* get_synaptic_command_line (GtkWindow *window, const gchar *path) { gchar *synaptic_path, *command; synaptic_path = g_find_program_in_path ("synaptic"); command = g_strdup_printf ("%s --hide-main-window --non-interactive " "--set-selections-file %s --parent-window-id %d", synaptic_path, path, GDK_WINDOW_XID (GTK_WIDGET (window)->window)); g_free (synaptic_path); return command; } static gboolean spawn_synaptic (GtkWindow *window, const gchar *path, gint *child_pid) { gchar **argv; GError *error = NULL; gboolean retval = TRUE; gint i = 0; argv = g_new0 (gchar*, 6); argv[i++] = g_find_program_in_path ("gksudo"); argv[i++] = g_strdup ("--desktop"); argv[i++] = g_strdup ("/usr/share/applications/synaptic.desktop"); argv[i++] = g_strdup ("--disable-grab"); argv[i++] = get_synaptic_command_line (window, path); argv[i++] = NULL; if (!gdk_spawn_on_screen (gtk_window_get_screen (window), NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, child_pid, &error)) { show_error_dialog (window, (error) ? error->message : ""); g_error_free (error); retval = FALSE; } g_strfreev (argv); return retval; } gboolean on_wait_timeout (gpointer data) { gint pid, status; pid = GPOINTER_TO_INT (data); if (waitpid (pid, &status, WNOHANG) > 0) { /* FIXME: should show an error dialog if the installation fails, * but funnily I'm getting always an exit status 0 here... maybe gksudo fault? */ gtk_main_quit (); return FALSE; } return TRUE; } static gboolean wait_for_synaptic (GtkWindow *window, gint pid) { GdkCursor *cursor; gint timer; cursor = gdk_cursor_new (GDK_WATCH); gdk_window_set_cursor (GTK_WIDGET (window)->window, cursor); gtk_widget_set_sensitive (GTK_WIDGET (window), FALSE); /* wait here a bit until the process has exited */ timer = g_timeout_add (500, on_wait_timeout, GINT_TO_POINTER (pid)); gtk_main (); g_source_remove (timer); gtk_widget_set_sensitive (GTK_WIDGET (window), TRUE); gdk_window_set_cursor (GTK_WIDGET (window)->window, NULL); gdk_cursor_unref (cursor); /* keep this until we can get status * info from the launched process */ return TRUE; } gboolean gst_packages_install (GtkWindow *window, const gchar *packages[]) { gchar *path; pid_t pid; gboolean retval = FALSE; g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE); if (!find_app (window, "synaptic") || !find_app (window, "gksudo")) return FALSE; path = create_temp_file (packages); if (spawn_synaptic (window, path, &pid)) retval = wait_for_synaptic (window, pid); unlink (path); g_free (path); return retval; } #endif /* if 0 */ glom-1.22.4/glom/libglom/glom.pc.in0000644000175000017500000000067112234252646020250 0ustar00murraycmurrayc00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ PACKAGE_TARNAME=@PACKAGE_TARNAME@ datarootdir=@datarootdir@ exampledir=@docdir@/examples Name: libglom Description: Library for accessing Glom documents and data structures. Requires: glibmm-2.4 giomm-2.4 libgdamm-5.0 libxml++-2.6 libxslt Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lglom-@GLOM_ABI_VERSION@ Cflags: -I${includedir}/glom-@GLOM_ABI_VERSION@ glom-1.22.4/glom/libglom/spawn_with_feedback.h0000644000175000017500000000521612234252646022521 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_SPAWN_WITH_FEEDBACK_H #define GLOM_SPAWN_WITH_FEEDBACK_H #include #include namespace Glom { namespace Spawn { /** This callback should show UI to indicate that work is still happening. * For instance, a pulsing ProgressBar. */ typedef sigc::slot SlotProgress; /** Execute a command-line command, and wait for it to return. * @param command The command-line command. * @param message A human-readable message to be shown, for instance in a dialog, while waiting. * @slot_progress A callback to call while the work is still happening. */ bool execute_command_line_and_wait(const std::string& command, const SlotProgress& slot_progress); /** Execute a command-line command, and wait for it to return. * @param command The command-line command. * @param message A human-readable message to be shown, for instance in a dialog, while waiting. * @slot_progress A callback to call while the work is still happening. * @output The stdout output of the command. */ bool execute_command_line_and_wait(const std::string& command, const SlotProgress& slot_progress, std::string& output); /** Execute a command-line command, and repeatedly call a second command that tests whether the first command has finished. * @param command The command-line command. * @param message A human-readable message to be shown, for instance in a dialog, while waiting. * @slot_progress A callback to call while the work is still happening. * @success_text If this is not empty, then the second command will only be considered to have succeeded when this text is found in its stdout output. */ bool execute_command_line_and_wait_until_second_command_returns_success(const std::string& command, const std::string& second_command, const SlotProgress& slot_progress, const std::string& success_text = std::string()); } //Spawn } //Glom #endif //GLOM_SPAWN_WITH_FEEDBACK_H glom-1.22.4/glom/libglom/appstate.h0000644000175000017500000000366212234252645020355 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_APPSTATE_H #define GLOM_APPSTATE_H #include namespace Glom { /** There is one instance per document. * This is for storing volatile application state. * It is not for configuration that should be the same after the application is closed and restarted - use gconf for that. */ class AppState { public: AppState(); virtual ~AppState(); enum userlevels { USERLEVEL_OPERATOR, USERLEVEL_DEVELOPER }; /** Returns whether we are in developer mode. * Some functionality will be deactivated when not in developer mode. */ virtual userlevels get_userlevel() const; /** This will cause the userlevel_changed signal to be emitted. */ virtual void set_userlevel(userlevels value); /// Use this to set the initial UI state: virtual void emit_userlevel_changed(); typedef sigc::signal type_signal_userlevel_changed; /// The user interface should handle this signal and alter itself accordingly. type_signal_userlevel_changed signal_userlevel_changed(); private: userlevels m_userlevel; type_signal_userlevel_changed m_signal_userlevel_changed; }; } //namespace Glom #endif //GLOM_APPSTATE_H glom-1.22.4/glom/libglom/translations_po.h0000644000175000017500000000500112234252646021741 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_TRANSLATIONS_PO #define GLOM_TRANSLATIONS_PO #include namespace Glom { /** Create a pot template file that can be used by translators to create a new .po file. * @param document The document whose translations should be written to a .po file. * @param pot_file The filepath at which to create a .po file. */ bool write_pot_file(Document* document, const Glib::ustring& pot_file_uri); /** Create a po file containing the translations from the Glom document. * @param document The document whose translations should be written to a .po file. * @param po_file The filepath at which to create a .po file. * @param translation_locale For instance, de_DE. * @param locale_name For instance, Deutsch, to identify the translation team. */ bool write_translations_to_po_file(Document* document, const Glib::ustring& po_file_uri, const Glib::ustring& translation_locale, const Glib::ustring& locale_name = Glib::ustring()); /** Parse a po file, storing its translations in the Glom document. * @param document The document into which the translations should be stored. * @param po_file The filepath at which to find a .po file. * @param translation_locale For instance, de_DE. */ bool import_translations_from_po_file(Document* document, const Glib::ustring& po_file_uri, const Glib::ustring& translation_locale); /** Get a hint about what the text is for. * This is also necessary to uniquely identify the item, * because not all text with the same contents should be translated the same * way in all languages - the context might change the translation. */ Glib::ustring get_po_context_for_item(const sharedptr& item, const Glib::ustring& hint); } //namespace Glom #endif //GLOM_TRANSLATIONS_PO glom-1.22.4/glom/libglom/glom_postgres.h0000644000175000017500000000234412234252646021415 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef DB_POSTGRES_H #define DB_POSTGRES_H //#include #include #include namespace Glom { class GlomPostgres { public: typedef std::vector type_vec_strings; protected: //Utility functions to help with the odd formats of postgres internal catalog fields: static type_vec_strings pg_list_separate(const Glib::ustring& str); }; } //namespace Glom #endif //DB_POSTGRES_H glom-1.22.4/glom/libglom/connectionpool.cc0000644000175000017500000007500212234776363021730 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include //#include #include #include #include #include #ifdef G_OS_WIN32 # include #else # include //For epc_shell_set_progress_hooks(). # include #endif #include //To catch segfaults #include #include #include #include #ifndef G_OS_WIN32 static EpcProtocol publish_protocol = EPC_PROTOCOL_HTTPS; #endif // Uncomment to see debug messages //#define GLOM_CONNECTION_DEBUG namespace Glom { SharedConnection::SharedConnection() { } SharedConnection::SharedConnection(const Glib::RefPtr& gda_connection) : m_gda_connection(gda_connection) { } SharedConnection::~SharedConnection() { if(m_gda_connection) m_signal_finished.emit(); } Glib::RefPtr SharedConnection::get_gda_connection() { return m_gda_connection; } Glib::RefPtr SharedConnection::get_gda_connection() const { return m_gda_connection; } SharedConnection::type_signal_finished SharedConnection::signal_finished() { return m_signal_finished; } void SharedConnection::close() { if(m_gda_connection) { m_gda_connection.reset(); } //Tell the connection pool that we have finished with this connection. //It might want to close it, or keep it open if somebody else is using it. //It might even give it to someone else while it is waiting for that other person to finish with it. m_signal_finished.emit(); } //init_db_details static data: ConnectionPool* ConnectionPool::m_instance = 0; ConnectionPool::ConnectionPool() : m_epc_publisher(0), m_dialog_epc_progress(0), m_backend(0), m_sharedconnection_refcount(0), m_ready_to_connect(false), m_pFieldTypes(0), m_show_debug_output(false), m_auto_server_shutdown(true), m_fake_connection(false) { } ConnectionPool::~ConnectionPool() { delete m_pFieldTypes; m_pFieldTypes = 0; } //static ConnectionPool* ConnectionPool::get_instance() { //TODO: Synchronize this for threads? if(m_instance) return m_instance; else { m_instance = new ConnectionPool(); return m_instance; } } void ConnectionPool::setup_from_document(const Document* document) { switch(document->get_hosting_mode()) { case Document::HOSTING_MODE_POSTGRES_SELF: { ConnectionPoolBackends::PostgresSelfHosted* backend = new ConnectionPoolBackends::PostgresSelfHosted; backend->set_database_directory_uri(document->get_connection_self_hosted_directory_uri()); set_backend(std::auto_ptr(backend)); } break; case Document::HOSTING_MODE_POSTGRES_CENTRAL: { ConnectionPoolBackends::PostgresCentralHosted* backend = new ConnectionPoolBackends::PostgresCentralHosted; backend->set_host(document->get_connection_server()); backend->set_port(document->get_connection_port()); backend->set_try_other_ports(document->get_connection_try_other_ports()); set_backend(std::auto_ptr(backend)); } break; case Document::HOSTING_MODE_SQLITE: { ConnectionPoolBackends::Sqlite* backend = new ConnectionPoolBackends::Sqlite; backend->set_database_directory_uri(document->get_connection_self_hosted_directory_uri()); set_backend(std::auto_ptr(backend)); } break; default: //on_document_load() should have checked for this already, informing the user. std::cerr << G_STRFUNC << ": Unhandled hosting mode: " << document->get_hosting_mode() << std::endl; g_assert_not_reached(); break; } // Might be overwritten later when actually attempting a connection: set_user(document->get_connection_user()); set_database(document->get_connection_database()); set_ready_to_connect(); } void ConnectionPool::delete_instance() { delete m_instance; m_instance = 0; } bool ConnectionPool::get_ready_to_connect() const { return m_ready_to_connect; } void ConnectionPool::set_ready_to_connect(bool val) { m_ready_to_connect = val; } void ConnectionPool::set_backend(std::auto_ptr backend) { m_backend = backend; } ConnectionPool::Backend* ConnectionPool::get_backend() { return m_backend.get(); } const ConnectionPool::Backend* ConnectionPool::get_backend() const { return m_backend.get(); } bool ConnectionPool::get_backend_supports_cursor() const { //TODO: Is there a generic libgda way to discover this? const ConnectionPoolBackends::Sqlite* sqlite_backend = dynamic_cast(get_backend()); return !sqlite_backend; } //static: sharedptr ConnectionPool::get_and_connect() { sharedptr result(0); ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(!connection_pool) return result; if(!(connection_pool->m_backend.get())) { std::cerr << G_STRFUNC << ": m_backend is null." << std::endl; return result; //TODO: Return a FAILURE_NO_BACKEND error?, though that would be tedious. } result = connection_pool->connect(); return result; } bool ConnectionPool::get_instance_is_ready() { ConnectionPool* instance = get_instance(); if(!instance) return false; return instance->get_ready_to_connect(); } // Store the connection for a few seconds in case it // is immediately requested again, to avoid making a new connection // and introspecting again, which is slow. // TODO: Why aren't these member variables? static sharedptr connection_cached; static sigc::connection connection_cached_timeout_connection; static sigc::connection connection_cached_finished_connection; static bool on_connection_pool_cache_timeout() { //std::cout << "DEBUG: Clearing connection cache." << std::endl; //Forget the cached connection after a few seconds: connection_cached.clear(); return false; //Don't call this again. } sharedptr ConnectionPool::connect() { //std::cout << G_STRFUNC << ": debug" << std::endl; //Don't try to connect if we don't have a backend to connect to. g_return_val_if_fail(m_backend.get(), sharedptr(0)); if(get_ready_to_connect() || m_fake_connection) { if(connection_cached) { //Avoid a reconnection immediately after disconnecting: return connection_cached; } //If the connection is already open (because it is being used by somebody): else if(m_refGdaConnection) { sharedptr sharedConnection( new SharedConnection(m_refGdaConnection) ); //Ask for notification when the SharedConnection has been finished with: //TODO: Note that we are overwriting the connection to a signal of a //previous sharedconnection here. This can be problematic when //invalidate_connection() is called, because then we don't disconnect //from the signal of the previous instance, and when the signal //handler is called later we might decrement the reference count for //a completely different shared connection. connection_cached_finished_connection = sharedConnection->signal_finished().connect( sigc::mem_fun(*this, &ConnectionPool::on_sharedconnection_finished) ); //Remember that somebody is using it: m_sharedconnection_refcount++; //Store the connection in a cache for a few seconds to avoid unnecessary disconnections/reconnections: //std::cout << "DEBUG: Stored connection cache." << std::endl; connection_cached = sharedConnection; connection_cached_timeout_connection.disconnect(); //Stop the existing timeout if it has not run yet. connection_cached_timeout_connection = Glib::signal_timeout().connect_seconds(&on_connection_pool_cache_timeout, 30 /* seconds */); return sharedConnection; } else { try { m_refGdaConnection = m_backend->connect(m_database, get_user(), get_password(), m_fake_connection); } catch(const Glib::Error& ex) { throw ex; } { //Allow get_meta_store_data() to succeed: //Hopefully this (and the update_meta_store_for_table() calls) is all we need. //std::cout << "DEBUG: Calling update_meta_store_data_types() ..." << std::endl; try { m_refGdaConnection->update_meta_store_data_types(); } catch(const Glib::Error& ex) { //If the conneciton was not opened, because it is a fake connection, //then we should not be surprised that this fails, //and a warning will only be useful later when get_meta_store_data() fails when used in FieldTypes, from Field::set_*(). if(!m_fake_connection) { std::cerr << G_STRFUNC << ": update_meta_store_data_types() failed: " << ex.what() << std::endl; } } //std::cout << "DEBUG: ... update_meta_store_data_types() has finished." << std::endl; //std::cout << "DEBUG: Calling update_meta_store_table_names() ..." << std::endl; try { //update_meta_store_table_names() has been known to throw an exception. //Glom is mostly unusable when it fails, but that's still better than a crash. //std::cout << G_STRFUNC << ": Before update_meta_store_table_name()" << std::endl; const bool test = m_refGdaConnection->update_meta_store_table_names(m_backend->get_public_schema_name()); if(!test && !m_fake_connection) { std::cerr << G_STRFUNC << ": update_meta_store_table_names() failed without an exception." << std::endl; } } catch(const Glib::Error& ex) { //If the connection was not opened, because it is a fake connection, //then we should not be surprised that this fails, //and a warning will only be useful later when get_meta_store_data() fails when used in get_table_names_from_database(). if(!m_fake_connection) { std::cerr << G_STRFUNC << ": update_meta_store_table_names() failed: " << ex.what() << std::endl; } } //std::cout << "DEBUG: ... update_meta_store_table_names() has finished." << std::endl; // Connection succeeded // Create the fieldtypes member if it has not already been done: if(!m_pFieldTypes) m_pFieldTypes = new FieldTypes(m_refGdaConnection); #ifndef G_OS_WIN32 //Let other clients discover this server via avahi: //TODO: Only advertize if we are the first to open the document, //to avoid duplicates. //TODO: Only advertize if it makes sense for the backend, //it does not for sqlite Document* document = get_document(); if(document && document->get_network_shared()) avahi_start_publishing(); //Stopped in the signal_finished handler. #endif // !G_OS_WIN32 return connect(); //Call this method recursively. This time m_refGdaConnection exists. } } } else { //std::cerr << G_STRFUNC << ": not ready to connect." << std::endl; } return sharedptr(0); } void ConnectionPool::create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name) { if(m_backend.get()) m_backend->create_database(slot_progress, database_name, get_user(), get_password()); } void ConnectionPool::set_user(const Glib::ustring& value) { if(value.empty()) { #ifdef GLOM_CONNECTION_DEBUG std::cout << "debug: " << G_STRFUNC << ": user is empty." << std::endl; #endif } m_user = value; //Make sure that connect() makes a new connection: invalidate_connection(); } bool ConnectionPool::save_backup(const SlotProgress& slot_progress, const std::string& path_dir) { g_assert(m_backend.get()); const std::string old_uri = m_backend->get_database_directory_uri(); std::string uri; try { //TODO: Avoid the copy/paste of glom_postgres_data and make it work for sqlite too. const std::string subdir = Glib::build_filename(path_dir, "glom_postgres_data"); uri = Glib::filename_to_uri(subdir); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception from Glib::build_filename(): " << ex.what() << std::endl; return false; } m_backend->set_database_directory_uri(uri); const bool result = m_backend->save_backup(slot_progress, m_user, m_password, m_database); m_backend->set_database_directory_uri(old_uri); return result; } bool ConnectionPool::convert_backup(const SlotProgress& slot_progress, const std::string& path_dir) { g_assert(m_backend.get()); //TODO: Avoid this copy/paste of the directory name: std::string path_dir_to_use = path_dir; if(!path_dir_to_use.empty()) { path_dir_to_use = Glib::build_filename(path_dir, "glom_postgres_data"); } const bool result = m_backend->convert_backup(slot_progress, path_dir_to_use, m_user, m_password, m_database); if(!result) return false; try { //update_meta_store_table_names() has been known to throw an exception. //Glom is mostly unusable when it fails, but that's still better than a crash. m_refGdaConnection->update_meta_store_table_names(m_backend->get_public_schema_name()); } catch(const Glib::Error& ex) { //If the conneciton was not opened, because it is a fake connection, //then we should not be surprised that this fails, //and a warning will only be useful later when get_meta_store_data() fails when used in get_table_names_from_database(). if(!m_fake_connection) { std::cerr << "ConnectionPool::connect(): update_meta_store_table_names() failed: " << ex.what() << std::endl; } } return result; } void ConnectionPool::set_password(const Glib::ustring& value) { m_password = value; //Make sure that connect() makes a new connection: invalidate_connection(); } void ConnectionPool::set_database(const Glib::ustring& value) { m_database = value; //Make sure that connect() makes a new connection: invalidate_connection(); } Glib::ustring ConnectionPool::get_user() const { return m_user; } Glib::ustring ConnectionPool::get_password() const { return m_password; } Glib::ustring ConnectionPool::get_database() const { return m_database; } const FieldTypes* ConnectionPool::get_field_types() const { //TODO: Investigate this: //if(!m_pFieldTypes) // std::cerr << G_STRFUNC << ": m_pFieldTypes is null but this should never happen." << std::endl; return m_pFieldTypes; } Gnome::Gda::SqlOperatorType ConnectionPool::get_string_find_operator() const { g_assert(m_backend.get()); return m_backend->get_string_find_operator(); } void ConnectionPool::invalidate_connection() { //std::cerr << G_STRFUNC << ": debug" << std::endl; connection_cached.clear(); connection_cached_timeout_connection.disconnect(); connection_cached_finished_connection.disconnect(); if(m_refGdaConnection) m_refGdaConnection->close(); m_refGdaConnection.reset(); m_sharedconnection_refcount = 0; delete m_pFieldTypes; m_pFieldTypes = 0; } void ConnectionPool::on_sharedconnection_finished() { //g_warning("ConnectionPool::on_sharedconnection_finished()."); //One SharedConnection is no longer being used: m_sharedconnection_refcount--; //If this was the last user of SharedConnection then we can close the connection. if(m_sharedconnection_refcount == 0) { //There should be no copies of the m_refConnection, so the Gnome::Gda::Connection destructor should //run when we clear this last RefPtr of it, but we will explicitly close it just in case. //std::cerr << G_STRFUNC << ": closing GdaConnection" << std::endl; m_refGdaConnection->close(); m_refGdaConnection.reset(); #ifndef G_OS_WIN32 //TODO: this should only even be started if we are the first to open the .glom file: avahi_stop_publishing(); #endif //g_warning("ConnectionPool: connection closed"); } } //static bool ConnectionPool::handle_error_cerr_only() { sharedptr sharedconnection = get_and_connect(); if(sharedconnection) { Glib::RefPtr gda_connection = sharedconnection->get_gda_connection(); typedef std::vector< Glib::RefPtr > type_list_errors; type_list_errors list_errors = gda_connection->get_events(); if(!list_errors.empty()) { Glib::ustring error_details; for(type_list_errors::iterator iter = list_errors.begin(); iter != list_errors.end(); ++iter) { Glib::RefPtr event = *iter; if(event && (event->get_event_type() == Gnome::Gda::CONNECTION_EVENT_ERROR)) { if(!error_details.empty()) error_details += '\n'; //Add newline after each error. error_details += (*iter)->get_description(); std::cerr << G_STRFUNC << ": Internal error (Database): " << error_details << std::endl; } } return true; //There really was an error. } } //There was no error. libgda just did not return any data, and has no concept of an empty datamodel. return false; } #ifdef G_OS_WIN32 // TODO: This is probably mingw specific static __p_sig_fn_t previous_sig_handler = SIG_DFL; #else static sighandler_t previous_sig_handler = SIG_DFL; /* Arbitrary default */ #endif /* This is a Linux/Unix signal handler, * so we can respond to a crash. */ static void on_linux_signal(int signum) { ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(!connection_pool) return; if(signum == SIGSEGV) { ConnectionPool::SlotProgress slot_ignored; connection_pool->cleanup(slot_ignored); //Let GNOME/Ubuntu's crash handler still handle this? if(previous_sig_handler) (*previous_sig_handler)(signum); else exit(1); } } ConnectionPool::StartupErrors ConnectionPool::startup(const SlotProgress& slot_progress, bool network_shared) { if(!m_backend.get()) return Backend::STARTUPERROR_FAILED_UNKNOWN_REASON; const Backend::StartupErrors started = m_backend->startup(slot_progress, network_shared); if(started != Backend::STARTUPERROR_NONE) return started; #ifndef G_OS_WIN32 //Let clients discover this server via avahi: //avahi_start_publishing(); #endif // !G_OS_WIN32 //If we crash while running (unlikely, hopefully), then try to cleanup. //Comment this out if you want to see the backtrace in a debugger. if(m_auto_server_shutdown) previous_sig_handler = signal(SIGSEGV, &on_linux_signal); return started; } bool ConnectionPool::cleanup(const SlotProgress& slot_progress) { // Without a valid backend instance we should not state that we are ready to // connect. Fixes crash described in #577821. // TODO: Implement checks in set_ready_to_connect() to only set the flag to // "true" when the ConnectionPool instance is in a consistent state // afterwards. Or, have a private set_ready_to_connect() and a public // set_not_ready_to_connect()? set_ready_to_connect(false); bool result = false; //Make sure that no connections are still open. //Otherwise database shutdown could fail. //And make sure that connect() tries to make a new connection: invalidate_connection(); if(m_backend.get()) result = m_backend->cleanup(slot_progress); #ifndef G_OS_WIN32 /* Stop advertising the self-hosting database server via avahi: */ //avahi_stop_publishing(); #endif // !G_OS_WIN32 //We don't need the segfault handler anymore: if(previous_sig_handler != SIG_DFL) /* Arbitrary default */ { signal(SIGSEGV, previous_sig_handler); previous_sig_handler = SIG_DFL; /* Arbitrary default */ } return result; } bool ConnectionPool::set_network_shared(const SlotProgress& slot_progress, bool network_shared) { if(m_backend.get()) return m_backend->set_network_shared(slot_progress, network_shared); else return false; } bool ConnectionPool::add_column(const Glib::ustring& table_name, const sharedptr& field) throw() { sharedptr conn; if(!m_refGdaConnection) { conn = connect(); } if(!m_refGdaConnection) return false; try { const bool result = m_backend->add_column(m_refGdaConnection, table_name, field); m_refGdaConnection->update_meta_store_table(table_name, m_backend->get_public_schema_name()); return result; } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception:" << ex.what() << std::endl; } return false; } bool ConnectionPool::drop_column(const Glib::ustring& table_name, const Glib::ustring& field_name) throw() { sharedptr conn; if(!m_refGdaConnection) { conn = connect(); } if(!m_refGdaConnection) return false; try { const bool result = m_backend->drop_column(m_refGdaConnection, table_name, field_name); m_refGdaConnection->update_meta_store_table(table_name, m_backend->get_public_schema_name()); return result; } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception:" << ex.what() << std::endl; } return false; } bool ConnectionPool::change_column(const Glib::ustring& table_name, const sharedptr& field_old, const sharedptr& field) throw() { type_vec_const_fields old_fields(1, field_old); type_vec_const_fields new_fields(1, field); return change_columns(table_name, old_fields, new_fields); } bool ConnectionPool::change_columns(const Glib::ustring& table_name, const type_vec_const_fields& old_fields, const type_vec_const_fields& new_fields) throw() { sharedptr conn; if(!m_refGdaConnection) { conn = connect(); } if(!m_refGdaConnection) return false; const bool result = m_backend->change_columns(m_refGdaConnection, table_name, old_fields, new_fields); try { m_refGdaConnection->update_meta_store_table(table_name, m_backend->get_public_schema_name()); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": update_meta_store_table() failed: " << ex.what() << std::endl; return false; } if(!result) return false; //Add or remove any auto-increment rows: //The new auto-increment row would actually be added automatically, //but this makes it available even before a record has been added. type_vec_const_fields::const_iterator iter_old = old_fields.begin(); type_vec_const_fields::const_iterator iter_new = new_fields.begin(); while( (iter_old != old_fields.end()) && (iter_new != new_fields.end()) ) { const sharedptr field_old = *iter_old; const sharedptr field_new = *iter_new; if(field_old && field_new && field_old->get_auto_increment() != field_new->get_auto_increment()) { if(field_new->get_auto_increment()) DbUtils::auto_increment_insert_first_if_necessary(table_name, field_new->get_name()); else DbUtils::remove_auto_increment(table_name, field_new->get_name()); } ++iter_old; ++iter_new; } return result; } ConnectionPool::InitErrors ConnectionPool::initialize(const SlotProgress& slot_progress, bool network_shared) { if(m_backend.get()) return m_backend->initialize(slot_progress, get_user(), get_password(), network_shared); else return Backend::INITERROR_OTHER; } Document* ConnectionPool::get_document() { if(!m_slot_get_document) { //Don't bother warning because all the code that calls get_document() checks //for 0 and responds reasonably. //std::cerr << G_STRFUNC << ": m_slot_get_document is null." << std::endl; return 0; } return m_slot_get_document(); } #ifndef G_OS_WIN32 //static EpcContents* ConnectionPool::on_publisher_document_requested(EpcPublisher* /* publisher */, const gchar* /* key */, gpointer user_data) { Glom::ConnectionPool* connection_pool = static_cast(user_data); if(!connection_pool) return 0; const Document* document = connection_pool->get_document(); if(!document) return 0; const Glib::ustring contents = document->get_contents(); //std::cout << "debug: " << G_STRFUNC << ": returning: " << std::endl << " " << contents << std::endl; return epc_contents_new_dup ("text/plain", (void*)contents.c_str(), -1); } //static gboolean ConnectionPool::on_publisher_document_authentication(EpcAuthContext* context, const gchar* user_name, gpointer user_data) { g_return_val_if_fail(context, false); ConnectionPool* connection_pool = (ConnectionPool*)(user_data); g_return_val_if_fail(connection_pool, false); // Check if the username/password are correct: const gchar* password = epc_auth_context_get_password(context); g_return_val_if_fail(password, false); //TODO: This seems to happen once before this callback is called again properly. //std::cout << "debug: " << G_STRFUNC << ": username=" << user_name << ", password=" << password << std::endl; g_return_val_if_fail(connection_pool->m_backend.get(), false); //Attempt a connection with this username/password: std::auto_ptr error; Glib::RefPtr connection = connection_pool->m_backend->connect(connection_pool->get_database(), user_name, password); if(connection) { //std::cout << "debug: " << G_STRFUNC << ": succeeded." << std::endl; return true; //Succeeded. } else { //std::cout << "debug: " << G_STRFUNC << ": failed." << std::endl; return false; //Failed. } } void ConnectionPool::on_epc_progress_begin(const gchar* /* title */, gpointer user_data) { //We ignore the title parameter because there is no way that libepc could know what Glom wants to say. ConnectionPool* connection_pool = (ConnectionPool*)user_data; if(connection_pool) connection_pool->m_epc_slot_begin(); } void ConnectionPool::on_epc_progress_update(gdouble /* progress */, const gchar* /* message */, gpointer user_data) { //We ignore the title parameter because there is no way that libepc could know what Glom wants to say. //TODO: Show the progress in a ProgressBar. ConnectionPool* connection_pool = (ConnectionPool*)user_data; if(connection_pool) connection_pool->m_epc_slot_progress(); } void ConnectionPool::on_epc_progress_end(gpointer user_data) { ConnectionPool* connection_pool = (ConnectionPool*)user_data; if(connection_pool) connection_pool->m_epc_slot_done(); } void ConnectionPool::set_avahi_publish_callbacks(const type_void_slot& slot_begin, const type_void_slot& slot_progress, const type_void_slot& slot_done) { m_epc_slot_begin = slot_begin; m_epc_slot_progress = slot_progress; m_epc_slot_done = slot_done; } /** Advertise self-hosting via avahi: */ void ConnectionPool::avahi_start_publishing() { // Don't advertize if the database cannot be accessed remotely anyway if(!m_backend->supports_remote_access()) return; if(m_epc_publisher) return; #ifdef GLOM_CONNECTION_DEBUG std::cout << "debug: ConnectionPool::avahi_start_publishing" << std::endl; #endif //Publish the document contents over HTTPS (discoverable via avahi): const Document* document = get_document(); if(!document) return; m_epc_publisher = epc_publisher_new(document->get_database_title_original().c_str(), "glom", 0); epc_publisher_set_protocol(m_epc_publisher, publish_protocol); epc_publisher_add_handler(m_epc_publisher, "document", on_publisher_document_requested, this /* user_data */, 0); //Password-protect the document, //because the document's structure could be considered as a business secret: epc_publisher_set_auth_flags(m_epc_publisher, EPC_AUTH_PASSWORD_TEXT_NEEDED); epc_publisher_set_auth_handler(m_epc_publisher, "document", on_publisher_document_authentication, this /* user_data */, 0); //Install progress callback, so we can keep the UI responsive while libepc is generating certificates for the first time: EpcShellProgressHooks callbacks; callbacks.begin = &ConnectionPool::on_epc_progress_begin; callbacks.update = &ConnectionPool::on_epc_progress_update; callbacks.end = &ConnectionPool::on_epc_progress_end; epc_shell_set_progress_hooks(&callbacks, this, 0); //Prevent the consumer from seeing duplicates, //if multiple client computers advertize the same document: // //Defer announcement until a duplicate disappears: epc_publisher_set_collision_handling(m_epc_publisher, EPC_COLLISIONS_UNIQUE_SERVICE); // // How to uniquely-identify the service. TODO: Use some additional criteria, such as the real host name. if(!m_database.empty()) epc_publisher_set_service_cookie(m_epc_publisher, m_database.c_str()); //Start the publisher, serving HTTPS: GError* error = 0; epc_publisher_run_async(m_epc_publisher, &error); if(error) { #ifdef GLOM_CONNECTION_DEBUG std::cout << "debug: " << G_STRFUNC << ": Error while running epc_publisher_run_async: " << error->message << std::endl; #endif g_clear_error(&error); } } void ConnectionPool::avahi_stop_publishing() { if(!m_backend->supports_remote_access()) return; if(!m_epc_publisher) return; #ifdef GLOM_CONNECTION_DEBUG std::cout << "debug: ConnectionPool::avahi_stop_publishing" << std::endl; #endif #ifndef G_OS_WIN32 epc_publisher_quit(m_epc_publisher); #endif // !G_OS_WIN32 g_object_unref(m_epc_publisher); m_epc_publisher = 0; } #endif // !G_OS_WIN32 void ConnectionPool::set_get_document_func(const SlotGetDocument& slot) { m_slot_get_document = slot; } void ConnectionPool::set_show_debug_output(bool val) { m_show_debug_output = val; } bool ConnectionPool::get_show_debug_output() const { return m_show_debug_output; } void ConnectionPool::set_auto_server_shutdown(bool val) { m_auto_server_shutdown = val; } void ConnectionPool::set_fake_connection() { m_fake_connection = true; //Set a fake username and password, to avoid a GError from gda_connection_new_from_string(): set_user("glom_fake_user"); set_password("glom_fake_password"); } } //namespace Glom glom-1.22.4/glom/libglom/libglom_config.h.in0000644000175000017500000000112112234252646022100 0ustar00murraycmurrayc00000000000000 #ifndef GLOM_LIBGLOM_CONFIG_H #define GLOM_LIBGLOM_CONFIG_H /* "definition of GLOM_DTD_INSTALL_DIR" */ #undef GLOM_DTD_INSTALL_DIR /* Define to 1 if you have the `dcgettext' function. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `strptime' function. */ #undef HAVE_STRPTIME /* Define to the installation prefix of the iso-codes module. */ #undef ISO_CODES_PREFIX #endif /* GLOM_LIBGLOM_CONFIG_H */ glom-1.22.4/glom/libglom/report_builder.cc0000644000175000017500000007046512234252646021721 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include namespace Glom { ReportBuilder::ReportBuilder(const Glib::ustring& locale) : m_document(0), m_locale(locale) { } ReportBuilder::~ReportBuilder() { } bool ReportBuilder::report_build_headerfooter(const FoundSet& found_set, xmlpp::Element& parent_node, const sharedptr& group) { //Add XML node: xmlpp::Element* node = parent_node.add_child(group->get_report_part_id()); //Add child parts: type_vecLayoutItems itemsToGet; for(LayoutGroup::type_list_items::iterator iterChildren = group->m_list_items.begin(); iterChildren != group->m_list_items.end(); ++iterChildren) { sharedptr item = *iterChildren; sharedptr item_text = sharedptr::cast_dynamic(item); if(item_text) { if(!report_build_records_text(found_set, *node, item_text)) { std::cerr << G_STRFUNC << ": report_build_records_text() failed." << std::endl; return false; } } else { sharedptr item_image = sharedptr::cast_dynamic(item); if(item_image) { if(!report_build_records_image(found_set, *node, item_image)) { std::cerr << G_STRFUNC << ": report_build_records_image() failed." << std::endl; return false; } } else { sharedptr pField = sharedptr::cast_dynamic(item); if(pField) { guint col_index = 0; //ignored. if(!report_build_records_field(found_set, *node, pField, Glib::RefPtr(), 0, col_index)) { std::cerr << G_STRFUNC << ": report_build_records_field() failed." << std::endl; return false; } } else { sharedptr vertical_group = sharedptr::cast_dynamic(item); if(vertical_group) { //Reuse (a bit hacky) this function for the header and footer: guint col_index = 0; //Ignored, because the model is null. if(!report_build_records_vertical_group(found_set, *node, vertical_group, Glib::RefPtr(), 0, col_index)) { std::cerr << G_STRFUNC << ": report_build_records_vertical_group() failed." << std::endl; return false; } } } } } } return true; } bool ReportBuilder::report_build_summary(const FoundSet& found_set, xmlpp::Element& parent_node, const sharedptr& summary) { //Add XML node: xmlpp::Element* node = parent_node.add_child(summary->get_report_part_id()); //Get fields type_vecLayoutItems itemsToGet; for(LayoutGroup::type_list_items::iterator iterChildren = summary->m_list_items.begin(); iterChildren != summary->m_list_items.end(); ++iterChildren) { sharedptr item = *iterChildren; sharedptr pGroupBy = sharedptr::cast_dynamic(item); if(pGroupBy) { //Recurse, adding a sub-groupby block: if(!report_build_groupby(found_set, *node, pGroupBy)) { std::cerr << G_STRFUNC << ": report_build_groupby() failed." << std::endl; return false; } } else { sharedptr pSummary = sharedptr::cast_dynamic(item); if(pSummary) { //Recurse, adding a summary block: if(!report_build_summary(found_set, *node, pSummary)) { std::cerr << G_STRFUNC << ": report_build_summary() failed." << std::endl; return false; } } else { itemsToGet.push_back( glom_sharedptr_clone(item) ); } } } if(!itemsToGet.empty()) { //Make sure that the FoundSet has no ORDER BY, because //a) That makes no sense for a single summary row result. //b) That would require us to mention the ORDER BY field in the GROUP BY clause or in an aggregate function. FoundSet found_set_used = found_set; found_set_used.m_sort_clause.clear(); //Rows, with data: if(!report_build_records(found_set_used, *node, itemsToGet)) { std::cerr << G_STRFUNC << ": report_build_records() failed." << std::endl; return false; } } return true; } bool ReportBuilder::report_build_groupby_children(const FoundSet& found_set, xmlpp::Element& node, const sharedptr& group_by) { //Get data and add child rows: type_vecLayoutItems itemsToGet; for(LayoutGroup::type_list_items::iterator iterChildren = group_by->m_list_items.begin(); iterChildren != group_by->m_list_items.end(); ++iterChildren) { sharedptr item = *iterChildren; sharedptr pGroupBy = sharedptr::cast_dynamic(item); if(pGroupBy) { //Recurse, adding a sub-groupby block: if(!report_build_groupby(found_set, node, pGroupBy)) { std::cerr << G_STRFUNC << ": report_build_groupby() failed." << std::endl; return false; } } else { sharedptr pSummary = sharedptr::cast_dynamic(item); if(pSummary) { //Recurse, adding a summary block: if(!report_build_summary(found_set, node, pSummary)) { std::cerr << G_STRFUNC << ": report_build_summary() failed." << std::endl; return false; } } else { itemsToGet.push_back( glom_sharedptr_clone(item) ); } } } if(!itemsToGet.empty()) { //Rows, with data: FoundSet found_set_records = found_set; found_set_records.m_sort_clause = group_by->get_fields_sort_by(); if(!report_build_records(found_set_records, node, itemsToGet)) { std::cerr << G_STRFUNC << ": report_build_records() failed." << std::endl; return false; } } return true; } bool ReportBuilder::report_build_groupby(const FoundSet& found_set_parent, xmlpp::Element& parent_node, const sharedptr& group_by) { //Get the possible heading values. if(group_by->get_has_field_group_by()) { sharedptr field_group_by = group_by->get_field_group_by(); DbUtils::layout_item_fill_field_details(get_document(), found_set_parent.m_table_name, field_group_by); //Get the possible group values, ignoring repeats by using GROUP BY. const Glib::ustring group_field_table_name = field_group_by->get_table_used(found_set_parent.m_table_name); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field(field_group_by->get_name(), group_field_table_name); builder->select_add_target(group_field_table_name); if(!found_set_parent.m_where_clause.empty()) { builder->set_where( builder->import_expression(found_set_parent.m_where_clause) ); } builder->select_group_by( builder->add_field_id(field_group_by->get_name(), group_field_table_name) ); //TODO: And restrict to the current found set. Glib::RefPtr datamodel = DbUtils::query_execute_select(builder); if(!datamodel) { std::cerr << G_STRFUNC << ": The SQL query failed." << std::endl; return false; } else { const guint rows_count = datamodel->get_n_rows(); for(guint row = 0; row < rows_count; ++row) { const Gnome::Gda::Value group_value = datamodel->get_value_at(0 /* col*/, row); //TODO: Catch exceptions. //Add XML node: xmlpp::Element* nodeGroupBy = parent_node.add_child(group_by->get_report_part_id()); XmlUtils::set_node_attribute_value_as_decimal_double(nodeGroupBy, "border_width", group_by->get_border_width()); nodeGroupBy->set_attribute("group_field", field_group_by->get_title_or_name(m_locale)); nodeGroupBy->set_attribute("group_value", Conversions::get_text_for_gda_value(field_group_by->get_glom_type(), group_value, field_group_by->get_formatting_used().m_numeric_format) ); //TODO: Use a SQL parameter instead of using sql(). Gnome::Gda::SqlExpr where_clause = Utils::build_simple_where_expression(group_field_table_name, field_group_by->get_full_field_details(), group_value); if(!found_set_parent.m_where_clause.empty()) { where_clause = Utils::build_combined_where_expression(where_clause, found_set_parent.m_where_clause, Gnome::Gda::SQL_OPERATOR_TYPE_AND); } FoundSet found_set_records = found_set_parent; found_set_records.m_where_clause = where_clause; //Secondary fields. For instance, the Contact Name, in addition to the Contact ID that we group by. if(!(group_by->get_secondary_fields()->m_list_items.empty())) { xmlpp::Element* nodeSecondaryFields = nodeGroupBy->add_child("secondary_fields"); type_vecLayoutItems itemsToGet; for(LayoutGroup::type_list_items::iterator iterChildren = group_by->get_secondary_fields()->m_list_items.begin(); iterChildren != group_by->get_secondary_fields()->m_list_items.end(); ++iterChildren) { sharedptr item = *iterChildren; itemsToGet.push_back( glom_sharedptr_clone(item) ); } if(!itemsToGet.empty()) { if(!report_build_records(found_set_records, *nodeSecondaryFields, itemsToGet, true /* one record only */)) { std::cerr << G_STRFUNC << ": report_build_records() failed." << std::endl; return false; } } } //Get data and add child rows: if(!report_build_groupby_children(found_set_records, *nodeGroupBy, group_by)) { std::cerr << G_STRFUNC << ": report_build_groupby_children() failed." << std::endl; return false; } } } } else { //There is no group-by field, so ouput all the found records. //For instance, the user could use the GroupBy part just to specify a sort, though that would be a bit of a hack: xmlpp::Element* nodeGroupBy = parent_node.add_child(group_by->get_report_part_id()); //We need this to create the HTML table. XmlUtils::set_node_attribute_value_as_decimal_double(nodeGroupBy, "border_width", group_by->get_border_width()); return report_build_groupby_children(found_set_parent, *nodeGroupBy, group_by); } return true; } bool ReportBuilder::report_build_records_get_fields(const FoundSet& found_set, const sharedptr& group, type_vecLayoutFields& items) { for(LayoutGroup::type_list_items::iterator iterChildren = group->m_list_items.begin(); iterChildren != group->m_list_items.end(); ++iterChildren) { sharedptr item = *iterChildren; sharedptr pVerticalGroup = sharedptr::cast_dynamic(item); if(pVerticalGroup) { if(!report_build_records_get_fields(found_set, pVerticalGroup, items)) { std::cerr << G_STRFUNC << ": report_build_records_get_fields() failed." << std::endl; return false; } } else { sharedptr pField = sharedptr::cast_dynamic(item); if(pField) items.push_back(pField); } } return true; } bool ReportBuilder::report_build_records(const FoundSet& found_set, xmlpp::Element& parent_node, const type_vecLayoutItems& items, bool one_record_only) { if(!items.empty()) { //Add Field headings: for(type_vecLayoutItems::const_iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr layout_item = *iter; sharedptr layoutitem_field = sharedptr::cast_dynamic(layout_item); //This adds a field heading (and therefore, column) for fields, or for a vertical group. xmlpp::Element* nodeFieldHeading = parent_node.add_child("field_heading"); if(layoutitem_field && layoutitem_field->get_glom_type() == Field::TYPE_NUMERIC) nodeFieldHeading->set_attribute("field_type", "numeric"); //TODO: More sophisticated formatting. nodeFieldHeading->set_attribute("name", layout_item->get_name()); //Not really necessary, but maybe useful. nodeFieldHeading->set_attribute("title", layout_item->get_title_or_name(m_locale)); } //Get list of fields to get from the database. Utils::type_vecLayoutFields fieldsToGet; for(type_vecLayoutItems::const_iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr layout_item = *iter; sharedptr layoutitem_field = sharedptr::cast_dynamic(layout_item); if(layoutitem_field) fieldsToGet.push_back(layoutitem_field); else { sharedptr vertical_group = sharedptr::cast_dynamic(layout_item); if(vertical_group) { //Get all the fields in this group: if(!report_build_records_get_fields(found_set, vertical_group, fieldsToGet)) { std::cerr << G_STRFUNC << ": report_build_records_get_fields() failed." << std::endl; return false; } } } } //For instance, when we just want to get a name corresponding to a contact ID, and want to ignore duplicates. guint limit = 0; //no limit. if(one_record_only) limit = 1; Glib::RefPtr sql_query = Utils::build_sql_select_with_where_clause(found_set.m_table_name, fieldsToGet, found_set.m_where_clause, sharedptr() /* extra_join */, found_set.m_sort_clause, limit); Glib::RefPtr datamodel = DbUtils::query_execute_select(sql_query); if(!datamodel) { std::cerr << G_STRFUNC << ": The SLQ query failed." << std::endl; return false; } else { const guint rows_count = datamodel->get_n_rows(); for(guint row = 0; row < rows_count; ++row) { xmlpp::Element* nodeRow = parent_node.add_child("row"); guint colField = 0; for(type_vecLayoutItems::const_iterator iter = items.begin(); iter != items.end(); ++iter) { xmlpp::Element* nodeField = 0; sharedptr item = *iter; sharedptr field = sharedptr::cast_dynamic(item); if(field) { if(!report_build_records_field(found_set, *nodeRow, field, datamodel, row, colField)) { std::cerr << G_STRFUNC << ": report_build_records_field() failed." << std::endl; return false; } } else { sharedptr item_text = sharedptr::cast_dynamic(item); if(item_text) { if(!report_build_records_text(found_set, *nodeRow, item_text)) { std::cerr << G_STRFUNC << ": report_build_records_text() failed." << std::endl; return false; } } else { sharedptr item_verticalgroup = sharedptr::cast_dynamic(item); if(item_verticalgroup) { if(!report_build_records_vertical_group(found_set, *nodeRow, item_verticalgroup, datamodel, row, colField)) { std::cerr << G_STRFUNC << ": report_build_records_vertical_group() failed." << std::endl; return false; } } } } if(nodeField) nodeField->set_attribute("name", item->get_name()); //Not really necessary, but maybe useful. } } } //If there are no records, show zero //if(!rows_found && show_null_row) } return true; } bool ReportBuilder::report_build_records_field(const FoundSet& found_set, xmlpp::Element& nodeParent, const sharedptr& field, const Glib::RefPtr& datamodel, guint row, guint& colField, bool vertical) { const Field::glom_field_type field_type = field->get_glom_type(); xmlpp::Element* nodeField = nodeParent.add_child(field->get_report_part_id()); if(field_type == Field::TYPE_NUMERIC) nodeField->set_attribute("field_type", "numeric"); //TODO: More sophisticated formatting. if(vertical) nodeField->set_attribute("vertical", "true"); Gnome::Gda::Value value; Glib::ustring text_value; if(!datamodel) //We call this for headers and footers too. { //In this case it can only be a system preferences field. //So let's get that data here: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->set_table(field->get_table_used(found_set.m_table_name)); builder->select_add_field(field->get_name(), found_set.m_table_name); builder->select_set_limit(1); Glib::RefPtr datamodel = DbUtils::query_execute_select(builder); if(!datamodel) { std::cerr << G_STRFUNC << ": The SQL query failed." << std::endl; return false; } value = datamodel->get_value_at(colField, row); //TODO: Catch exceptions. colField = 0; } else { value = datamodel->get_value_at(colField, row); //TODO: Catch exceptions. } nodeField->set_attribute("title", field->get_title_or_name(m_locale)); //Not always used, but useful. //Handle the value: if(field_type == Field::TYPE_IMAGE) nodeField->set_attribute("image_uri", Utils::create_local_image_uri(value)); else { Glib::ustring text_value = Conversions::get_text_for_gda_value(field_type, value, field->get_formatting_used().m_numeric_format); //The Postgres summary functions return NULL when summarising NULL records, but 0 is more sensible: if(text_value.empty() && sharedptr::cast_dynamic(field) && (field_type == Field::TYPE_NUMERIC)) { //Use get_text_for_gda_value() instead of "0" so we get the correct numerical formatting: const Gnome::Gda::Value value = Conversions::parse_value(0); text_value = Conversions::get_text_for_gda_value(field_type, value, field->get_formatting_used().m_numeric_format); } nodeField->set_attribute("value", text_value); } ++colField; return true; } bool ReportBuilder::report_build_records_text(const FoundSet& /* found_set */, xmlpp::Element& nodeParent, const sharedptr& textobject, bool vertical) { //Text object: xmlpp::Element* nodeField = nodeParent.add_child(textobject->get_report_part_id()); //We reuse this node type for text objects. nodeField->set_attribute("value", textobject->get_text(m_locale)); if(vertical) nodeField->set_attribute("vertical", "true"); return true; } bool ReportBuilder::report_build_records_image(const FoundSet& /* found_set */, xmlpp::Element& nodeParent, const sharedptr& imageobject, bool vertical) { //Text object: xmlpp::Element* nodeImage = nodeParent.add_child(imageobject->get_report_part_id()); //We reuse this node type for text objects. nodeImage->set_attribute("image_uri", imageobject->create_local_image_uri()); if(vertical) nodeImage->set_attribute("vertical", "true"); return true; } bool ReportBuilder::report_build_records_vertical_group(const FoundSet& found_set, xmlpp::Element& parentNode, const sharedptr& group, const Glib::RefPtr& datamodel, guint row, guint& field_index) { xmlpp::Element* nodeGroupVertical = parentNode.add_child(group->get_report_part_id()); for(LayoutGroup::type_list_items::iterator iterChildren = group->m_list_items.begin(); iterChildren != group->m_list_items.end(); ++iterChildren) { sharedptr item = *iterChildren; sharedptr pVerticalGroup = sharedptr::cast_dynamic(item); if(pVerticalGroup) { if(!report_build_records_vertical_group(found_set, *nodeGroupVertical, pVerticalGroup, datamodel, row, field_index)) { std::cerr << G_STRFUNC << ": report_build_records_vertical_group() failed." << std::endl; return false; } } else { sharedptr pField = sharedptr::cast_dynamic(item); if(pField) { if(!report_build_records_field(found_set, *nodeGroupVertical, pField, datamodel, row, field_index, true /* vertical, so we get a row for each field too. */)) { std::cerr << G_STRFUNC << ": report_build_records_field() failed." << std::endl; return false; } } else { sharedptr pText = sharedptr::cast_dynamic(item); if(pText) { if(!report_build_records_text(found_set, *nodeGroupVertical, pText, true)) { std::cerr << G_STRFUNC << ": report_build_records_text() failed." << std::endl; return false; } } } } } return true; } //TODO: Return a URI std::string ReportBuilder::report_build_and_save(const FoundSet& found_set, const sharedptr& report) { const Glib::ustring contents = report_build(found_set, report); //Save it to a temporary file and show it in a browser: const Glib::ustring temp_uri = Utils::get_temp_file_uri("glom_printout", "html"); std::cout << G_STRFUNC << ": temp_uri=" << temp_uri << std::endl; Glib::RefPtr file = Gio::File::create_for_uri(temp_uri); Glib::RefPtr stream; //Create the file if it does not already exist: try { if(file->query_exists()) { stream = file->replace(); //Instead of append_to(). } else { //By default files created are generally readable by everyone, but if we pass FILE_CREATE_PRIVATE in flags the file will be made readable only to the current user, to the level that is supported on the target filesystem. //TODO: Do we want to specify 0660 exactly? (means "this user and his group can read and write this non-executable file".) stream = file->create_file(); } } catch(const Gio::Error& ex) { // If the operation was not successful, print the error and abort return std::string(); // print_error(ex, output_uri_string); } //Write the data to the output uri gssize bytes_written = 0; const Glib::ustring::size_type result_bytes = contents.bytes(); try { bytes_written = stream->write(contents.data(), result_bytes); } catch(const Gio::Error& ex) { // If the operation was not successful, print the error and abort return std::string(); // false; //print_error(ex, output_uri_string); } if(bytes_written != (gssize)result_bytes) return std::string(); //false return file->get_path(); } Glib::ustring ReportBuilder::report_build(const FoundSet& found_set, const sharedptr& report) { //Create a DOM Document with the XML: xmlpp::DomParser dom_parser;; xmlpp::Document* pDocument = dom_parser.get_document(); xmlpp::Element* nodeRoot = pDocument->get_root_node(); if(!nodeRoot) { //Add it if it isn't there already: nodeRoot = pDocument->create_root_node("report_print"); } Glib::ustring table_title = get_document()->get_table_title(found_set.m_table_name, m_locale); if(table_title.empty()) table_title = found_set.m_table_name; nodeRoot->set_attribute("table", table_title); if(report->get_show_table_title()) nodeRoot->set_attribute("show_table_title", "true"); //The groups: xmlpp::Element* nodeParent = nodeRoot; nodeRoot->set_attribute("title", report->get_title_or_name(m_locale)); type_vecLayoutItems itemsToGet_TopLevel; const sharedptr group = report->get_layout_group(); for(LayoutGroup::type_list_items::const_iterator iter = group->m_list_items.begin(); iter != group->m_list_items.end(); ++iter) { sharedptr pPart = *iter; //The Group, and the details for each record in the group: sharedptr pGroupBy = sharedptr::cast_dynamic(pPart); if(pGroupBy) { if(!report_build_groupby(found_set, *nodeParent, pGroupBy)) { std::cerr << G_STRFUNC << ": report_build_groupby() failed." << std::endl; return Glib::ustring(); } } else { sharedptr pSummary = sharedptr::cast_dynamic(pPart); if(pSummary) { //Recurse, adding a summary block: if(!report_build_summary(found_set, *nodeParent, pSummary)) { std::cerr << G_STRFUNC << ": report_build_summary() failed." << std::endl; return Glib::ustring(); } } else { sharedptr pGroup = sharedptr::cast_dynamic(pPart); if(pGroup) { sharedptr pHeader = sharedptr::cast_dynamic(pPart); sharedptr pFooter = sharedptr::cast_dynamic(pPart); if(pHeader || pFooter) { //Recurse, adding a summary block: if(!report_build_headerfooter(found_set, *nodeParent, pGroup)) { std::cerr << G_STRFUNC << ": report_build_headerfooter() failed." << std::endl; return Glib::ustring(); } } } else itemsToGet_TopLevel.push_back( glom_sharedptr_clone(pPart) ); } } } //Add top-level records, outside of any groupby or summary, if fields have been specified: if(!itemsToGet_TopLevel.empty()) { xmlpp::Element* nodeGroupBy = nodeParent->add_child("ungrouped_records"); if(!report_build_records(found_set, *nodeGroupBy, itemsToGet_TopLevel)) { std::cerr << G_STRFUNC << ": report_build_records() failed." << std::endl; return Glib::ustring(); } } return GlomXslUtils::transform(*pDocument, "print_report_to_html.xsl"); } static void fill_standard_list_report_fill(const sharedptr& report, const sharedptr& layout_group) { if(!report) return; if(!layout_group) return; for(LayoutGroup::type_list_items::const_iterator iter = layout_group->m_list_items.begin(); iter != layout_group->m_list_items.end(); ++iter) { const sharedptr item = *iter; if(!item) continue; const sharedptr unconst = sharedptr::cast_const(item); //TODO: Avoid this? report->get_layout_group()->add_item(unconst); } } sharedptr ReportBuilder::create_standard_list_report(const Document* document, const Glib::ustring& table_name) { sharedptr result(new Report()); result->set_name("list"); //Translators: This is a noun. It is the title of a report. result->set_title_original(_("List")); const Document::type_list_layout_groups layout_groups = document->get_data_layout_groups("list", table_name); //TODO: layout_platform. for(Document::type_list_layout_groups::const_iterator iter = layout_groups.begin(); iter != layout_groups.end(); ++iter) { const sharedptr group = *iter; if(group) fill_standard_list_report_fill(result, group); } return result; } void ReportBuilder::set_document(Document* document) { m_document = document; } Document* ReportBuilder::get_document() { return m_document; } } //namespace Glom glom-1.22.4/glom/libglom/appstate.cc0000644000175000017500000000267412234252645020515 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { AppState::AppState() : m_userlevel(USERLEVEL_DEVELOPER) { } AppState::~AppState() { } AppState::userlevels AppState::get_userlevel() const { return m_userlevel; } void AppState::set_userlevel(userlevels value) { if(m_userlevel != value) { m_userlevel = value; //Tell the UI to respond accordingly: m_signal_userlevel_changed.emit(value); } } AppState::type_signal_userlevel_changed AppState::signal_userlevel_changed() { return m_signal_userlevel_changed; } void AppState::emit_userlevel_changed() { m_signal_userlevel_changed.emit(m_userlevel); } } //namespace Glom glom-1.22.4/glom/libglom/utils.h0000644000175000017500000002432212234252646017671 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_UTILS_H #define GLOM_UTILS_H #include #include #include #include #include #include namespace Glom { ///field, ascending typedef std::pair< sharedptr, bool> type_pair_sort_field; typedef std::vector type_sort_clause; namespace Utils { Glib::ustring trim_whitespace(const Glib::ustring& text); Glib::ustring string_replace(const Glib::ustring& src, const Glib::ustring& search_for, const Glib::ustring& replace_with); /** Remove any characters that may not be in XML even when escaped. */ Glib::ustring string_clean_for_xml(const Glib::ustring& src); //typedef Base_DB::type_vecLayoutFields type_vecLayoutFields; typedef std::vector< sharedptr > type_vecLayoutFields; typedef std::vector< sharedptr > type_vecConstLayoutFields; //TODO: Move these to their own file: // Create a Gnome::Gda::SqlExpr. Gnome::Gda::SqlExpr build_simple_where_expression(const Glib::ustring& table_name, const sharedptr& key_field, const Gnome::Gda::Value& key_value); // Create a where clause that is two other conditions combined together. Gnome::Gda::SqlExpr build_combined_where_expression(const Gnome::Gda::SqlExpr& a, const Gnome::Gda::SqlExpr& b, Gnome::Gda::SqlOperatorType op); /** Generate a SQL statement to SELECT field values, * even if the fields are in related (or doubly related) records. */ void build_sql_select_add_fields_to_get( const Glib::RefPtr& builder, const Glib::ustring& table_name, const type_vecConstLayoutFields& fieldsToGet, const type_sort_clause& sort_clause, bool extra_join); /** Generate a SQL statement to SELECT field values, * even if the fields are in related (or doubly related) records, * narrowing the records down with a WHERE clause. */ Glib::RefPtr build_sql_select_with_where_clause( const Glib::ustring& table_name, const type_vecLayoutFields& fieldsToGet, const Gnome::Gda::SqlExpr& where_clause = Gnome::Gda::SqlExpr(), const sharedptr& extra_join = sharedptr(), const type_sort_clause& sort_clause = type_sort_clause(), guint limit = 0); /** Just a version of build_sql_select_with_where_clause() that takes a list of const fields. */ Glib::RefPtr build_sql_select_with_where_clause( const Glib::ustring& table_name, const type_vecConstLayoutFields& fieldsToGet, const Gnome::Gda::SqlExpr& where_clause = Gnome::Gda::SqlExpr(), const sharedptr& extra_join = sharedptr(), const type_sort_clause& sort_clause = type_sort_clause(), guint limit = 0); /** * @param key_value If this is empty then all records in the tables will be retrieved. */ Glib::RefPtr build_sql_select_with_key( const Glib::ustring& table_name, const type_vecLayoutFields& fieldsToGet, const sharedptr& key_field, const Gnome::Gda::Value& key_value, const type_sort_clause& sort_clause = type_sort_clause(), guint limit = 0); /** Just a version of build_sql_select_with_key() that takes a list of const fields. */ Glib::RefPtr build_sql_select_with_key( const Glib::ustring& table_name, const type_vecConstLayoutFields& fieldsToGet, const sharedptr& key_field, const Gnome::Gda::Value& key_value, const type_sort_clause& sort_clause = type_sort_clause(), guint limit = 0); //Note: This is not used by glom itself, but it is used by java-libglom. /** Build a SQL query to discover how many rows a SQL query would return if it was run. * * This uses a COUNT * on a the @a sql_query as a sub-statement. * Be careful not to include ORDER BY clauses in the supplied SQL query, because that would make it unnecessarily slow. * * @sql_query A SQL query. * @result The number of rows. */ Glib::RefPtr build_sql_select_count_rows(const Glib::RefPtr& sql_query); Gnome::Gda::SqlExpr get_find_where_clause_quick(const Document* document, const Glib::ustring& table_name, const Gnome::Gda::Value& quick_search); /** Generate a SQL statement to UPDATE field values, */ Glib::RefPtr build_sql_update_with_where_clause( const Glib::ustring& table_name, const sharedptr& field, const Gnome::Gda::Value& value, const Gnome::Gda::SqlExpr& where_clause); typedef std::vector type_list_values; typedef std::vector< std::pair > type_list_values_with_second; //TODO: Rename this now that we have more than just 1 extra field. type_list_values_with_second get_choice_values_all(const Document* document, const sharedptr& field); type_list_values_with_second get_choice_values(const Document* document, const sharedptr& field, const Gnome::Gda::Value& foreign_key_value); /// Get the full query string suitable for use with std::cout. std::string sqlbuilder_get_full_query( const Glib::RefPtr& builder); /** Guess an appropriate identifier name based on a human-readable title */ Glib::ustring create_name_from_title(const Glib::ustring& title); Glib::ustring string_escape_underscores(const Glib::ustring& text); /** Get just the first part of a locale, such as de_DE, * ignoring, for instance, .UTF-8 or \@euro at the end. */ Glib::ustring locale_simplify(const Glib::ustring& locale_id); /** Get just the language ID part of a locale, such as de from "de_DE", */ Glib::ustring locale_language_id(const Glib::ustring& locale_id); Glib::ustring create_local_image_uri(const Gnome::Gda::Value& value); /** Get a decimal text representation of the number, * in the current locale. */ Glib::ustring string_from_decimal(guint decimal); /** Create an appropriate title for an ID string. * For instance, date_of_birth would become Date Of Birth. */ Glib::ustring title_from_string(const Glib::ustring& text); typedef std::vector type_vec_strings; type_vec_strings string_separate(const Glib::ustring& str, const Glib::ustring& separator, bool ignore_quoted_separator = false); Glib::ustring string_trim(const Glib::ustring& str, const Glib::ustring& to_remove); Glib::ustring string_remove_suffix(const Glib::ustring& str, const Glib::ustring& suffix, bool case_sensitive = true); bool file_exists(const Glib::ustring& uri); bool file_exists(const Glib::RefPtr& file); /** Delete a directory, if it exists, and its contents. * Unlike g_file_delete(), this does not fail if the directory is not empty. */ bool delete_directory(const Glib::RefPtr& directory); /** Delete a directory, if it exists, and its contents. * Unlike g_file_delete(), this does not fail if the directory is not empty. */ bool delete_directory(const std::string& uri); /** For instance, to find the first file in the directory with a .glom extension. */ Glib::ustring get_directory_child_with_suffix(const Glib::ustring& uri_directory, const std::string& suffix, bool recursive); /** Get a URI with the extension (any extension, not just .glom) removed. */ Glib::ustring get_file_uri_without_extension(const Glib::ustring& uri); /** Get a filepath with the extension (any extension, not just .glom) removed. */ std::string get_file_path_without_extension(const std::string& filepath); /** Get a string to display to the user, as a representation of a list of layout items. */ Glib::ustring get_list_of_layout_items_for_display(const LayoutGroup::type_list_items& list_layout_fields); /** Get a string to display to the user, as a representation of a list of layout items. */ Glib::ustring get_list_of_layout_items_for_display(const sharedptr& layout_group); /** Get a string to display to the user, as a representation of a sort order */ Glib::ustring get_list_of_sort_fields_for_display(const Formatting::type_list_sort_fields& sort_fields); /** This returns the provided list of layout items, * plus the primary key, if the primary key is not already present in the list */ LayoutGroup::type_list_const_items get_layout_items_plus_primary_key(const LayoutGroup::type_list_const_items& items, const Document* document, const Glib::ustring& table_name); //TODO: Avoid the overload just for constness. /** This returns the provided list of layout items, * plus the primary key, if the primary key is not already present in the list */ LayoutGroup::type_list_items get_layout_items_plus_primary_key(const LayoutGroup::type_list_items& items, const Document* document, const Glib::ustring& table_name); std::string get_temp_file_path(const std::string& prefix = std::string(), const std::string& extension = std::string()); Glib::ustring get_temp_file_uri(const std::string& prefix = std::string(), const std::string& extension = std::string()); /** This actually creates the directory. */ std::string get_temp_directory_path(const std::string& prefix = std::string()); /** This actually creates the directory. */ Glib::ustring get_temp_directory_uri(const std::string& prefix = std::string()); /** @returns true if the script is OK, or * false if the script uses pygtk2, which would cause a crash, * because Glom itself uses GTK+ 3. */ bool script_check_for_pygtk2(const Glib::ustring& script); } //namespace Utils } //namespace Glom #endif //GLOM_UTILS_H glom-1.22.4/glom/libglom/data_structure/0000755000175000017500000000000012235000126021367 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/libglom/data_structure/numeric_format.cc0000644000175000017500000000435212234252646024733 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { NumericFormat::NumericFormat() : m_use_thousands_separator(true), //A sensible default. m_decimal_places_restricted(false), m_decimal_places(2), //A sensible default. m_alt_foreground_color_for_negatives(false) { } NumericFormat::NumericFormat(const NumericFormat& src) { operator=(src); } NumericFormat::~NumericFormat() { } NumericFormat& NumericFormat::operator=(const NumericFormat& src) { m_currency_symbol = src.m_currency_symbol; m_use_thousands_separator = src.m_use_thousands_separator; m_decimal_places_restricted = src.m_decimal_places_restricted; m_decimal_places = src.m_decimal_places; m_alt_foreground_color_for_negatives = src.m_alt_foreground_color_for_negatives; return *this; } bool NumericFormat::operator==(const NumericFormat& src) const { return (m_currency_symbol == src.m_currency_symbol) && (m_use_thousands_separator == src.m_use_thousands_separator) && (m_decimal_places_restricted == src.m_decimal_places_restricted) && (m_decimal_places == src.m_decimal_places) && (m_alt_foreground_color_for_negatives == src.m_alt_foreground_color_for_negatives); } bool NumericFormat::operator!=(const NumericFormat& src) const { return !(operator==(src)); } guint NumericFormat::get_default_precision() { return 15; } Glib::ustring NumericFormat::get_alternative_color_for_negatives() { return "#ffff00000000"; //red } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/report.cc0000644000175000017500000000325512234252646023235 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { Report::Report() : m_show_table_title(true) { m_translatable_item_type = TRANSLATABLE_TYPE_REPORT; m_layout_group = sharedptr::create(); } Report::Report(const Report& src) : TranslatableItem(src), m_layout_group(src.m_layout_group), m_show_table_title(src.m_show_table_title) { } Report& Report::operator=(const Report& src) { TranslatableItem::operator=(src); m_layout_group = src.m_layout_group; m_show_table_title = src.m_show_table_title; return *this; } bool Report::get_show_table_title() const { return m_show_table_title; } void Report::set_show_table_title(bool show_table_title) { m_show_table_title = show_table_title; } sharedptr Report::get_layout_group() { return m_layout_group; } sharedptr Report::get_layout_group() const { return m_layout_group; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/tableinfo.cc0000644000175000017500000000305712234252646023665 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { TableInfo::TableInfo() : m_hidden(false), m_default(false) { m_translatable_item_type = TRANSLATABLE_TYPE_TABLE; } TableInfo::TableInfo(const TableInfo& src) : TranslatableItem(src), HasTitleSingular(src), m_hidden(src.m_hidden), m_default(src.m_default) { } TableInfo& TableInfo::operator=(const TableInfo& src) { TranslatableItem::operator=(src); HasTitleSingular::operator=(src); m_hidden = src.m_hidden; m_default = src.m_default; return *this; } bool TableInfo::get_hidden() const { return m_hidden; } void TableInfo::set_hidden(bool val) { m_hidden = val; } bool TableInfo::get_default() const { return m_default; } void TableInfo::set_default(bool val) { m_default = val; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/foundset.cc0000644000175000017500000000302012234252645023536 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { FoundSet::FoundSet() { } FoundSet::FoundSet(const FoundSet& src) : m_table_name(src.m_table_name), m_extra_join(src.m_extra_join), m_where_clause(src.m_where_clause), m_sort_clause(src.m_sort_clause) { } FoundSet& FoundSet::operator=(const FoundSet& src) { m_table_name = src.m_table_name; m_extra_join = src.m_extra_join; m_where_clause = src.m_where_clause; m_sort_clause = src.m_sort_clause; return *this; } bool FoundSet::operator==(const FoundSet& src) const { return (m_table_name == src.m_table_name) && (m_extra_join == src.m_extra_join) /* TODO: && (m_where_clause == src.m_where_clause) */ && (m_sort_clause == src.m_sort_clause); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/database_title.h0000644000175000017500000000246412234252645024531 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_DATABASE_TITLE_H #define GLOM_DATASTRUCTURE_DATABASE_TITLE_H #include namespace Glom { /** This is a separate class, instead of just deriving Document from * TranslatableItem, to avoid the need to use Document via sharedptr. */ class DatabaseTitle : public TranslatableItem { public: DatabaseTitle(); DatabaseTitle(const DatabaseTitle& src); DatabaseTitle& operator=(const DatabaseTitle& src); }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_DATABASE_TITLE_H glom-1.22.4/glom/libglom/data_structure/field.h0000644000175000017500000002145512234776363022660 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_FIELD_H #define GLOM_DATASTRUCTURE_FIELD_H #include #include #include #include #include #include //Predicate, for use with std::find_if(): namespace Glom { /** A predicate for use with std::find_if() to find a Field or LayoutItem which refers * to the same field, looking at just the name. */ template class predicate_FieldHasName { public: predicate_FieldHasName(const Glib::ustring& strName) { m_strName = strName; } virtual ~predicate_FieldHasName() { } bool operator() (const T_Element& element) { return (element.get_name() == m_strName); } bool operator() (const sharedptr& element) { return (element->get_name() == m_strName); } bool operator() (const sharedptr& element) { return (element->get_name() == m_strName); } private: Glib::ustring m_strName; }; //Field info, such as Name, Title, definitions, and, sometimes, contents. class Field : public TranslatableItem { public: /* Possible formats when converting from/to SQL representation. * TODO: Maybe we should move the code that does the conversion between gda * type and SQL into the connectionpool backends. */ enum sql_format { SQL_FORMAT_POSTGRES, SQL_FORMAT_SQLITE }; enum glom_field_type { TYPE_INVALID, TYPE_NUMERIC, TYPE_TEXT, TYPE_DATE, TYPE_TIME, TYPE_BOOLEAN, TYPE_IMAGE //Always stored as a standard format. }; Field(); Field(const Field& src); ~Field(); Field& operator=(const Field& src); bool operator==(const Field& src) const; bool operator!=(const Field& src) const; Field* clone() const; glom_field_type get_glom_type() const; void set_glom_type(glom_field_type fieldtype); /// This forwards to the Glib::RefPtr::get_name, so that we can use it in the same predicate template. virtual Glib::ustring get_name() const; /// This forwards to the Glib::RefPtr::set_name, for convenience virtual void set_name(const Glib::ustring& value); /// This forwards to the Glib::RefPtr::get_auto_increment. bool get_auto_increment() const; /// This forwards to the Glib::RefPtr::set_auto_increment. void set_auto_increment(bool val = true); /// This forwards to the Glib::RefPtr::get_primary_key. bool get_primary_key() const; /// This forwards to the Glib::RefPtr::set_primary_key. void set_primary_key(bool val = true); /// This forwards to the Glib::RefPtr::get_unique_key. bool get_unique_key() const; /// This forwards to the Glib::RefPtr::set_unique_key. void set_unique_key(bool val = true); /// This forwards to the Glib::RefPtr::get_default_value. Gnome::Gda::Value get_default_value() const; /// This forwards to the Glib::RefPtr::set_default_value. void set_default_value(const Gnome::Gda::Value& value); //TODO_Performance: Lots of code calls this just to call one of its methods: Glib::RefPtr get_field_info(); Glib::RefPtr get_field_info() const; void set_field_info(const Glib::RefPtr& fieldInfo); /// Ignores any part of FieldAttributes that libgda does not properly fill. bool field_info_from_database_is_equal(const Glib::RefPtr& field); //Lookup stuff: bool get_is_lookup() const; sharedptr get_lookup_relationship() const; void set_lookup_relationship(const sharedptr& strRelationship); Glib::ustring get_lookup_field() const; void set_lookup_field(const Glib::ustring& strField); Glib::ustring get_sql_type() const; Glib::ustring get_gda_type_name() const; /** Escape and quote the value so that it can be used in a SQL command. */ Glib::ustring sql(const Gnome::Gda::Value& value, const Glib::RefPtr& connection) const; /** Get the canonical format for a file, for instance for * a default value or for example data. * This does not add quotes for text fields so the caller may need to do that. * Note that this does not do any extra escaping such as an XML file might need. * However, this will escape data as per the CSV RFC. */ Glib::ustring to_file_format(const Gnome::Gda::Value& value) const; /** See to_file_format(const Gnome::Gda::Value& value). */ static Glib::ustring to_file_format(const Gnome::Gda::Value& value, glom_field_type glom_type); /** Parse the value from the canonical file format. See to_file_format() * This does note remove quotes from text values so the caller may need to do that. */ Gnome::Gda::Value from_file_format(const Glib::ustring& str, bool& success) const; static Gnome::Gda::Value from_file_format(const Glib::ustring& str, glom_field_type glom_type, bool& success); /** Escape the value so that it can be used in a SQL command for a find. */ Glib::ustring sql_find(const Gnome::Gda::Value& value, const Glib::RefPtr& connection) const; /** Get a suitable operator to use when finding records. * For instance, == for numbers, or LIKE for text. */ Gnome::Gda::SqlOperatorType sql_find_operator() const; Glib::ustring get_calculation() const; void set_calculation(const Glib::ustring& calculation); bool get_has_calculation() const; /* Discover what fields are used in the calculation, * so the value can be recalculated when their values change. */ typedef std::vector type_list_strings; type_list_strings get_calculation_relationships() const; void set_visible(bool val = true); bool get_visible() const; typedef std::map type_map_type_names; /// Get canonical type names for internal use, such as in the XML of the document. static type_map_type_names get_type_names(); /// Get translated type names. static type_map_type_names get_type_names_ui(); /// Get translated type names of types that should be offered to the user. static type_map_type_names get_usable_type_names(); /// Get the translated name for a glom type. static Glib::ustring get_type_name_ui(glom_field_type glom_type); /// Get the type from a translated name. static glom_field_type get_type_for_ui_name(const Glib::ustring& glom_type); static glom_field_type get_glom_type_for_gda_type(GType gda_type); static GType get_gda_type_for_glom_type(Field::glom_field_type glom_type); static bool get_conversion_possible(glom_field_type field_type_src, glom_field_type field_type_dest); Formatting m_default_formatting; private: static void init_map(); //The glom type to be used for the gda type: typedef std::map type_map_gda_type_to_glom_type; static type_map_gda_type_to_glom_type m_map_gda_type_to_glom_type; //The gda type to be used for the glom type: typedef std::map type_map_glom_type_to_gda_type; static type_map_glom_type_to_gda_type m_map_glom_type_to_gda_type; typedef std::vector type_list_conversion_targets; typedef std::map type_map_conversions; static type_map_type_names m_map_type_names; //These are canonical, for internal use. static type_map_type_names m_map_type_names_ui; //These are translated. static type_map_conversions m_map_conversions; //Map of types to list of possibnle conversion targets types. static bool m_maps_inited; glom_field_type m_glom_type; Glib::RefPtr m_field_info; sharedptr m_lookup_relationship; Glib::ustring m_strLookupField; Glib::ustring m_calculation; bool m_visible; //Whether it will be shown to the user. //Things that libgda cannot easily tell us: bool m_primary_key; bool m_unique_key; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_FIELD_H glom-1.22.4/glom/libglom/data_structure/groupinfo.cc0000644000175000017500000000304312234252645023724 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { GroupInfo::GroupInfo() : m_developer(false) { } GroupInfo::GroupInfo(const GroupInfo& src) : TranslatableItem(src), m_developer(src.m_developer), m_map_privileges(src.m_map_privileges) { } GroupInfo::~GroupInfo() { } GroupInfo& GroupInfo::operator=(const GroupInfo& src) { TranslatableItem::operator=(src); m_developer = src.m_developer; m_map_privileges = src.m_map_privileges; return *this; } bool GroupInfo::operator==(const GroupInfo& src) const { return TranslatableItem::operator==(src) && (m_developer == src.m_developer) && (m_map_privileges == src.m_map_privileges); } bool GroupInfo::operator!=(const GroupInfo& src) const { return !(operator==(src)); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/print_layout.cc0000644000175000017500000000704712234252646024456 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { PrintLayout::PrintLayout() : m_show_table_title(true), m_show_grid(true), m_show_rules(true), m_show_outlines(true), m_page_count(1) //A sensible default { m_translatable_item_type = TRANSLATABLE_TYPE_PRINT_LAYOUT; m_layout_group = sharedptr::create(); } PrintLayout::PrintLayout(const PrintLayout& src) : TranslatableItem(src), m_layout_group(src.m_layout_group), m_show_table_title(src.m_show_table_title), m_show_grid(src.m_show_grid), m_show_rules(src.m_show_rules), m_show_outlines(src.m_show_outlines), m_page_count(src.m_page_count) { m_page_setup = src.m_page_setup; m_horizontal_rules = src.m_horizontal_rules; m_vertical_rules = src.m_vertical_rules; } PrintLayout& PrintLayout::operator=(const PrintLayout& src) { TranslatableItem::operator=(src); m_layout_group = src.m_layout_group; m_show_table_title = src.m_show_table_title; m_show_grid = src.m_show_grid; m_show_rules = src.m_show_rules; m_show_outlines = src.m_show_outlines; m_page_setup = src.m_page_setup; m_page_count = src.m_page_count; m_horizontal_rules = src.m_horizontal_rules; m_vertical_rules = src.m_vertical_rules; return *this; } bool PrintLayout::get_show_table_title() const { return m_show_table_title; } void PrintLayout::set_show_table_title(bool show_table_title) { m_show_table_title = show_table_title; } sharedptr PrintLayout::get_layout_group() { return m_layout_group; } sharedptr PrintLayout::get_layout_group() const { return m_layout_group; } void PrintLayout::set_page_setup(const std::string& page_setup) { m_page_setup = page_setup; } std::string PrintLayout::get_page_setup() const { return m_page_setup; } void PrintLayout::set_page_count(guint count) { m_page_count = count; } guint PrintLayout::get_page_count() const { return m_page_count; } bool PrintLayout::get_show_grid() const { return m_show_grid; } void PrintLayout::set_show_grid(bool show_grid) { m_show_grid = show_grid; } bool PrintLayout::get_show_rules() const { return m_show_rules; } void PrintLayout::set_show_rules(bool show_rules) { m_show_rules = show_rules; } bool PrintLayout::get_show_outlines() const { return m_show_outlines; } void PrintLayout::set_show_outlines(bool show_outlines) { m_show_outlines = show_outlines; } PrintLayout::type_vec_doubles PrintLayout::get_horizontal_rules() const { return m_horizontal_rules; } void PrintLayout::set_horizontal_rules(const type_vec_doubles& rules) { m_horizontal_rules = rules; } PrintLayout::type_vec_doubles PrintLayout::get_vertical_rules() const { return m_vertical_rules; } void PrintLayout::set_vertical_rules(const type_vec_doubles& rules) { m_vertical_rules = rules; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/relationship.cc0000644000175000017500000000643312234252646024424 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { Relationship::Relationship() : m_allow_edit(true), m_auto_create(false) { m_translatable_item_type = TRANSLATABLE_TYPE_RELATIONSHIP; } Relationship::Relationship(const Relationship& src) : TranslatableItem(src), HasTitleSingular(src) { operator=(src); //TODO_Performance: Implement properly. } Relationship::~Relationship() { } Relationship& Relationship::operator=(const Relationship& src) { TranslatableItem::operator=(src); HasTitleSingular::operator=(src); m_strFrom_Table = src.m_strFrom_Table; m_strFrom_Field = src.m_strFrom_Field; m_strTo_Table = src.m_strTo_Table; m_strTo_Field = src.m_strTo_Field; m_allow_edit = src.m_allow_edit; m_auto_create = src.m_auto_create; return *this; } bool Relationship::operator==(const Relationship& src) const { return TranslatableItem::operator==(src) && HasTitleSingular::operator==(src) && (m_strFrom_Table == src.m_strFrom_Table) && (m_strFrom_Field == src.m_strFrom_Field) && (m_strTo_Table == src.m_strTo_Table) && (m_strTo_Field == src.m_strTo_Field) && (m_allow_edit == src.m_allow_edit) && (m_auto_create == src.m_auto_create); } Relationship* Relationship::clone() const { return new Relationship(*this); } Glib::ustring Relationship::get_from_table() const { return m_strFrom_Table; } Glib::ustring Relationship::get_from_field() const { return m_strFrom_Field; } Glib::ustring Relationship::get_to_table() const { return m_strTo_Table; } Glib::ustring Relationship::get_to_field() const { return m_strTo_Field; } void Relationship::set_from_table(const Glib::ustring& strVal) { m_strFrom_Table = strVal; } void Relationship::set_from_field(const Glib::ustring& strVal) { m_strFrom_Field = strVal; } void Relationship::set_to_table(const Glib::ustring& strVal) { m_strTo_Table = strVal; } void Relationship::set_to_field(const Glib::ustring& strVal) { m_strTo_Field = strVal; } bool Relationship::get_auto_create() const { return m_auto_create; } void Relationship::set_auto_create(bool val) { m_auto_create = val; } bool Relationship::get_allow_edit() const { return m_allow_edit; } void Relationship::set_allow_edit(bool val) { m_allow_edit = val; } bool Relationship::get_has_fields() const { return !m_strTo_Field.empty() && !m_strFrom_Field.empty() && !m_strTo_Table.empty() && !m_strFrom_Table.empty(); } bool Relationship::get_has_to_table() const { return !m_strTo_Table.empty(); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/system_prefs.h0000644000175000017500000000274012234776363024314 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_SYSTEMPREFS_H #define GLOM_DATASTRUCTURE_SYSTEMPREFS_H #include #include namespace Glom { class SystemPrefs { public: SystemPrefs(); SystemPrefs(const SystemPrefs& src); SystemPrefs& operator=(const SystemPrefs& src); bool operator==(const SystemPrefs& src) const; bool operator!=(const SystemPrefs& src) const; //TODO: Add getters and setters: Glib::ustring m_name, m_org_name, m_org_address_street, m_org_address_street2, m_org_address_town, m_org_address_county, m_org_address_country, m_org_address_postcode; Gnome::Gda::Value m_org_logo; //TYPE_IMAGE. }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_SYSTEMPREFS_H glom-1.22.4/glom/libglom/data_structure/field.cc0000644000175000017500000006246312234776363023022 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include namespace Glom { //Initialize static data: Field::type_map_gda_type_to_glom_type Field::m_map_gda_type_to_glom_type; Field::type_map_glom_type_to_gda_type Field::m_map_glom_type_to_gda_type; Field::type_map_type_names Field::m_map_type_names; Field::type_map_type_names Field::m_map_type_names_ui; Field::type_map_conversions Field::m_map_conversions; bool Field::m_maps_inited = false; Field::Field() : m_glom_type(TYPE_INVALID), m_field_info(Gnome::Gda::Column::create()), m_visible(true), m_primary_key(false), m_unique_key(false) { m_translatable_item_type = TRANSLATABLE_TYPE_FIELD; } Field::Field(const Field& src) : TranslatableItem(src) { //TODO_Performance: Implement this properly, without the extra copy. operator=(src); } Field::~Field() { } Field& Field::operator=(const Field& src) { TranslatableItem::operator=(src); m_glom_type = src.m_glom_type; m_field_info = src.m_field_info->copy(); m_lookup_relationship = src.m_lookup_relationship; m_strLookupField = src.m_strLookupField; m_calculation = src.m_calculation; m_visible = src.m_visible; m_primary_key = src.m_primary_key; m_unique_key = src.m_unique_key; m_default_formatting = src.m_default_formatting; return *this; } bool Field::operator==(const Field& src) const { return TranslatableItem::operator==(src) && (m_field_info->equal(src.m_field_info)) && (m_glom_type == src.m_glom_type) && (m_lookup_relationship == src.m_lookup_relationship) && (m_strLookupField == src.m_strLookupField) && (m_calculation == src.m_calculation) && (m_visible == src.m_visible) && (m_primary_key == src.m_primary_key) && (m_unique_key == src.m_unique_key) && (m_default_formatting == src.m_default_formatting); } bool Field::operator!=(const Field& src) const { return !(operator==(src)); } Field* Field::clone() const { return new Field(*this); } Field::glom_field_type Field::get_glom_type() const { return m_glom_type; } void Field::set_glom_type(glom_field_type fieldtype) { glom_field_type old_type = m_glom_type; // Set glom type from fieldinfo if it represents a different type. m_glom_type = fieldtype; // Reset default value if the default value type does not match the new // glom type. // TODO: Should we try to convert the default value to the new type here? if(fieldtype != old_type) set_default_value(Gnome::Gda::Value()); //TODO: Try to convert it, maybe by rendering and parsing it. } Glib::RefPtr Field::get_field_info() { return m_field_info; } Glib::RefPtr Field::get_field_info() const { return m_field_info; } static const FieldTypes* get_field_types() { ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(!connection_pool) return 0; return connection_pool->get_field_types(); } void Field::set_field_info(const Glib::RefPtr& fieldinfo) { m_field_info = fieldinfo; const glom_field_type glom_type = get_glom_type(); const GType new_type = fieldinfo->get_g_type(); if( (glom_type == TYPE_INVALID) && (new_type == GDA_TYPE_NULL)) //GDA_TYPE_NULL is the default for GdaColumn. { //Don't bother with any of the following checks. return; } // Also take fallback types into account as fieldinfo might originate from // the database system directly. GType cur_type = G_TYPE_NONE; if(glom_type != TYPE_INVALID) { cur_type = get_gda_type_for_glom_type(glom_type); const FieldTypes* pFieldTypes = get_field_types(); if(pFieldTypes) { while(cur_type != new_type && cur_type != G_TYPE_NONE) cur_type = pFieldTypes->get_fallback_type_for_gdavaluetype(cur_type); } } if(cur_type == G_TYPE_NONE) set_glom_type( get_glom_type_for_gda_type(fieldinfo->get_g_type()) ); Gnome::Gda::Value value = get_default_value(); if(!value.is_null()) { // Check that the default value is consistent with the field's type // TODO: Basically copied from set_default_value(). Maybe this check should // be moved into an extra function. GType cur_type = get_gda_type_for_glom_type(get_glom_type()); const FieldTypes* pFieldTypes = get_field_types(); // Take into account that value might be one of the fallback types if(pFieldTypes) { while(cur_type != value.get_value_type() && cur_type != G_TYPE_NONE) cur_type = pFieldTypes->get_fallback_type_for_gdavaluetype(cur_type); } if(!value.is_null() && value.get_value_type() != cur_type) { std::cerr << G_STRFUNC << ": New field's default value type (" << g_type_name(value.get_value_type()) << " does not match field type (" << g_type_name(get_gda_type_for_glom_type(get_glom_type())) << "). Resetting default value." << std::endl; m_field_info->set_default_value(Gnome::Gda::Value()); } } } sharedptr Field::get_lookup_relationship() const { return m_lookup_relationship; } void Field::set_lookup_relationship(const sharedptr& relationship) { m_lookup_relationship = relationship; } Glib::ustring Field::get_lookup_field() const { return m_strLookupField; } void Field::set_lookup_field(const Glib::ustring& strField) { m_strLookupField = strField; } bool Field::get_is_lookup() const { //It's a lookup if the lookup relationship and field are set: return ( m_lookup_relationship && (!m_strLookupField.empty()) ); } Glib::ustring Field::sql(const Gnome::Gda::Value& value, const Glib::RefPtr& connection) const { //std::cout << ": glom_type=" << get_glom_type() << std::endl; if(value.is_null() && (get_glom_type() == TYPE_TEXT)) { return "''"; //We want to ignore the concept of NULL strings, and deal only with empty strings. } //Use libgda's DataHandler to get the string for SQL: Glib::RefPtr provider = connection->get_provider(); if(!provider) { std::cerr << G_STRFUNC << ": The ServerProvider was null." << std::endl; return Glib::ustring(); } const GType gda_type = get_gda_type_for_glom_type(m_glom_type); Glib::RefPtr datahandler = provider->get_data_handler_g_type(connection, gda_type); if(datahandler) { //Note that this does seems to add the needed quotes too, for instance around strings, //though that is not clearly documented. See bug http://bugzilla.gnome.org/show_bug.cgi?id=572220 return datahandler->get_sql_from_value(value); } else { std::cerr << G_STRFUNC << ": The DataHandler was null." << std::endl; return Glib::ustring(); } return Glib::ustring(); } #define GLOM_QUOTE_FOR_FILE_FORMAT "\"" Glib::ustring Field::to_file_format(const Gnome::Gda::Value& value) const { return to_file_format(value, m_glom_type); } Glib::ustring Field::to_file_format(const Gnome::Gda::Value& value, glom_field_type glom_type) { //Handle TYPE_IMAGE specially: if(glom_type == TYPE_IMAGE) { if(!value.gobj()) return Glib::ustring(); gchar* str = 0; const GType value_type = value.get_value_type(); if(value_type == GDA_TYPE_BINARY) { const GdaBinary* gdabinary = gda_value_get_binary(value.gobj()); if(!gdabinary) return Glib::ustring(); else { str = gda_binary_to_string(gdabinary, 0); } } else if(value_type == GDA_TYPE_BLOB) { const GdaBlob* gdablob = gda_value_get_blob(value.gobj()); if(!gdablob) return Glib::ustring(); else { str = gda_blob_to_string(const_cast(gdablob), 0); } } if(!str) return Glib::ustring(); Glib::ustring result = (str) ? Glib::ustring(Glib::ScopedPtr(str).get()) : Glib::ustring(); //Correction for text representations of image (binary) data: //Avoid arbitrary newlines in this text. //See libgda bug: https://bugzilla.gnome.org/show_bug.cgi?id=597390 result = Utils::string_replace(result, "\n", "\\012"); //Avoid arbitrary newlines in this text. //See libgda bug: https://bugzilla.gnome.org/show_bug.cgi?id=597390 result = Utils::string_replace(result, "\r", "\\015"); //Escape any quotes in this text: //See libgda bug: https://bugzilla.gnome.org/show_bug.cgi?id=597390 return Utils::string_replace(result, "\"", "\\042"); } NumericFormat format_ignored; //Because we use ISO format. const Glib::ustring result = Conversions::get_text_for_gda_value(glom_type, value, std::locale::classic() /* SQL uses the C locale */, format_ignored, true /* ISO standard */); //Escape " as "", as specified by the CSV RFC: return Utils::string_replace(result, GLOM_QUOTE_FOR_FILE_FORMAT, GLOM_QUOTE_FOR_FILE_FORMAT GLOM_QUOTE_FOR_FILE_FORMAT); } namespace { // Changes the type of a given value void value_reinit(GValue* value, GType g_type) { if(G_IS_VALUE(value) && G_VALUE_TYPE(value) != g_type) g_value_unset(value); if(!G_IS_VALUE(value)) g_value_init(value, g_type); } } Gnome::Gda::Value Field::from_file_format(const Glib::ustring& str, bool& success) const { return from_file_format(str, m_glom_type, success); } Gnome::Gda::Value Field::from_file_format(const Glib::ustring& str, glom_field_type glom_type, bool& success) { success = true; //Unescape "" to ", because to_file_format() escaped ", as specified by the CSV RFC: Glib::ustring string_unescaped; if(glom_type == TYPE_IMAGE) { string_unescaped = str; //binary data does not have quote characters so we do not bother to escape or unescape it. } else { string_unescaped = Utils::string_replace(str, GLOM_QUOTE_FOR_FILE_FORMAT GLOM_QUOTE_FOR_FILE_FORMAT, GLOM_QUOTE_FOR_FILE_FORMAT); } if(glom_type == TYPE_IMAGE) { if(string_unescaped.empty()) return Gnome::Gda::Value(); GdaBinary* gdabinary = gda_string_to_binary(string_unescaped.c_str()); if(!success || !gdabinary) return Gnome::Gda::Value(); else { Gnome::Gda::Value value; value_reinit(value.gobj(), GDA_TYPE_BINARY); gda_value_take_binary(value.gobj(), gdabinary); return value; } } else { NumericFormat format_ignored; //Because we use ISO format. return Conversions::parse_value(glom_type, string_unescaped, format_ignored, success, true); } } Glib::ustring Field::sql_find(const Gnome::Gda::Value& value, const Glib::RefPtr& connection) const { switch(get_glom_type()) { case(TYPE_TEXT): { //% means 0 or more characters. if(value.is_null()) return "''"; //We want to ignore the concept of NULL strings, and deal only with empty strings. else return ("%" + value.to_string() + "%"); //TODO: Escape it before adding "%", but then prevent SqlBuilder from re-escaping it. break; } case(TYPE_DATE): case(TYPE_TIME): case(TYPE_NUMERIC): case(TYPE_BOOLEAN): default: { return sql(value, connection); break; } } } Gnome::Gda::SqlOperatorType Field::sql_find_operator() const { switch(get_glom_type()) { case(TYPE_TEXT): { ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(connection_pool && connection_pool->get_backend()) return connection_pool->get_string_find_operator(); else return Gnome::Gda::SQL_OPERATOR_TYPE_LIKE; // Default break; } case(TYPE_DATE): case(TYPE_TIME): case(TYPE_NUMERIC): case(TYPE_BOOLEAN): default: { return Gnome::Gda::SQL_OPERATOR_TYPE_EQ; break; } } } Glib::ustring Field::get_name() const { return m_field_info->get_name(); } void Field::set_name(const Glib::ustring& value) { m_field_info->set_name(value); } bool Field::get_auto_increment() const { return m_field_info->get_auto_increment(); } void Field::set_auto_increment(bool val) { m_field_info->set_auto_increment(val); } bool Field::get_primary_key() const { //TODO_gda: return m_field_info->get_primary_key(); return m_primary_key; } void Field::set_primary_key(bool val) { m_primary_key = val; //TODO_gda: m_field_info->set_primary_key(val); } bool Field::get_unique_key() const { //TODO_gda: return m_field_info->get_unique_key(); return m_unique_key; } void Field::set_unique_key(bool val) { //TODO_gda: m_field_info->set_unique_key(val); m_unique_key = val; } Gnome::Gda::Value Field::get_default_value() const { return m_field_info->get_default_value(); } void Field::set_default_value(const Gnome::Gda::Value& value) { // TODO: Allow setting a NULL default value when glom type is invalid? // Verify that the value matches the type of the field. GType cur_type = get_gda_type_for_glom_type(get_glom_type()); const FieldTypes* pFieldTypes = 0; ConnectionPool* pConnectionPool = ConnectionPool::get_instance(); if(pConnectionPool) pFieldTypes = pConnectionPool->get_field_types(); // Take into account that value might be one of the fallback types if(pFieldTypes) { while(cur_type != value.get_value_type() && cur_type != G_TYPE_NONE) cur_type = pFieldTypes->get_fallback_type_for_gdavaluetype(cur_type); } if(value.is_null() || value.get_value_type() == cur_type) m_field_info->set_default_value(value); else std::cerr << G_STRFUNC << ": Cannot set incompatible default value: Default value has type " << g_type_name(value.get_value_type()) << ", but field has type " << g_type_name(get_gda_type_for_glom_type(get_glom_type())) << std::endl; } Glib::ustring Field::get_sql_type() const { if(false) //See get_next_auto_increment_value() //m_field_info->get_auto_increment()) return "serial"; //See Postgres manual: http://www.postgresql.org/docs/7.4/interactive/datatype.html#DATATYPE-SERIAL. It's actually an integer.. else { Glib::ustring result; //Type Glib::ustring strType = "unknowntype"; ConnectionPool* pConnectionPool = ConnectionPool::get_instance(); if(pConnectionPool) { const FieldTypes* pFieldTypes = pConnectionPool->get_field_types(); if(pFieldTypes) { const GType fieldType = m_field_info->get_g_type(); strType = pFieldTypes->get_string_name_for_gdavaluetype(fieldType); } else { std::cerr << G_STRFUNC << ": get_field_types() returned null" << std::endl; } } if(strType == "unknowntype") { std::cerr << G_STRFUNC << ": returning unknowntype for field name=" << get_name() << ", glom_type=" << get_glom_type() << ", gda_type=" << (int)m_field_info->get_g_type() << std::endl; } return strType; } } Glib::ustring Field::get_gda_type_name() const { //return g_type_name( get_gda_type_for_glom_type(m_glom_type) ); return g_type_name( m_field_info->get_g_type()); } /// Ignores any part of FieldAttributes that libgda does not properly fill. bool Field::field_info_from_database_is_equal(const Glib::RefPtr& field) { Glib::RefPtr temp = m_field_info->copy(); temp->set_auto_increment( field->get_auto_increment() ); //Don't compare this, because the data is incorrect when libgda reads it from the database. Gnome::Gda::Value value = field->get_default_value(); temp->set_default_value(value); //Don't compare this, because the data is incorrect when libgda reads it from the database. //TODO_gda: temp->set_primary_key( field->get_primary_key() ); //Don't compare this, because the data is incorrect when libgda reads it from the database. return temp->equal(field); } Field::glom_field_type Field::get_glom_type_for_gda_type(GType gda_type) { init_map(); Field::glom_field_type result = TYPE_INVALID; //Get the glom type used for this gda type: { type_map_gda_type_to_glom_type::iterator iterFind = m_map_gda_type_to_glom_type.find(gda_type); if(iterFind != m_map_gda_type_to_glom_type.end()) result = iterFind->second; else { std::cerr << G_STRFUNC << ": Unhandled GType: " << g_type_name(gda_type) << std::endl; } } return result; } GType Field::get_gda_type_for_glom_type(Field::glom_field_type glom_type) { init_map(); //Get the ideal gda type used for that glom type; type_map_glom_type_to_gda_type::iterator iterFind = m_map_glom_type_to_gda_type.find(glom_type); GType ideal_gda_type = G_TYPE_NONE; if(iterFind != m_map_glom_type_to_gda_type.end()) ideal_gda_type = iterFind->second; if(ideal_gda_type == G_TYPE_NONE) { std::cerr << G_STRFUNC << ": Returning G_TYPE_NONE for glom_type=" << glom_type << std::endl; } //std::cout << "debug: " << G_STRFUNC << ": returning: " << g_type_name(ideal_gda_type) << std::endl; return ideal_gda_type; } //static: void Field::init_map() { if(!m_maps_inited) { //Fill maps. //Ideals: m_map_gda_type_to_glom_type[GDA_TYPE_NUMERIC] = TYPE_NUMERIC; m_map_gda_type_to_glom_type[G_TYPE_INT] = TYPE_NUMERIC; //Only for "serial" (auto-increment) fields. m_map_gda_type_to_glom_type[G_TYPE_STRING] = TYPE_TEXT; m_map_gda_type_to_glom_type[GDA_TYPE_TIME] = TYPE_TIME; m_map_gda_type_to_glom_type[G_TYPE_DATE] = TYPE_DATE; m_map_gda_type_to_glom_type[G_TYPE_BOOLEAN] = TYPE_BOOLEAN; m_map_gda_type_to_glom_type[GDA_TYPE_BINARY] = TYPE_IMAGE; //SQLite can return a GdaBlob though it can take a GdaBinary: m_map_gda_type_to_glom_type[GDA_TYPE_BLOB] = TYPE_IMAGE; //Extra conversions for GTypes that can be returned by glom_pygda_value_from_pyobject(): m_map_gda_type_to_glom_type[G_TYPE_DOUBLE] = TYPE_NUMERIC; //TODO? m_map_gda_type_to_glom_type[GDA_TYPE_TIME] = ; //TODO? m_map_gda_type_to_glom_type[GDA_TYPE_TIMESTAMP] = ; m_map_glom_type_to_gda_type[TYPE_NUMERIC] = GDA_TYPE_NUMERIC; m_map_glom_type_to_gda_type[TYPE_TEXT] = G_TYPE_STRING; m_map_glom_type_to_gda_type[TYPE_TIME] = GDA_TYPE_TIME; m_map_glom_type_to_gda_type[TYPE_DATE] = G_TYPE_DATE; m_map_glom_type_to_gda_type[TYPE_BOOLEAN] = G_TYPE_BOOLEAN; m_map_glom_type_to_gda_type[TYPE_IMAGE] = GDA_TYPE_BINARY; // Translators: This means an unknown or unnacceptable value type in a database. m_map_type_names_ui[TYPE_INVALID] = _("Invalid"); // Translators: This means a numeric value type in a database. m_map_type_names_ui[TYPE_NUMERIC] = _("Number"); // Translators: This means a text/string value type in a database. m_map_type_names_ui[TYPE_TEXT] = _("Text"); // Translators: This means a time value type in a database. m_map_type_names_ui[TYPE_TIME] = _("Time"); // Translators: This means a time value type in a database. m_map_type_names_ui[TYPE_DATE] = _("Date"); // Translators: This means a true/false value type in a database. m_map_type_names_ui[TYPE_BOOLEAN] = _("Boolean"); // Translators: This means a picture value type in a database. m_map_type_names_ui[TYPE_IMAGE] = _("Image"); //Non-translated names used for the document: m_map_type_names[TYPE_INVALID] = "Invalid"; m_map_type_names[TYPE_NUMERIC] = "Number"; m_map_type_names[TYPE_TEXT] = "Text"; m_map_type_names[TYPE_TIME] = "Time"; m_map_type_names[TYPE_DATE] = "Date"; m_map_type_names[TYPE_BOOLEAN] = "Boolean"; m_map_type_names[TYPE_IMAGE] = "Image"; //Conversions: //These are the conversions know to be supported by the used version of postgres m_map_conversions.clear(); type_list_conversion_targets list_conversions; //Numeric: list_conversions.clear(); list_conversions.push_back(Field::TYPE_BOOLEAN); list_conversions.push_back(Field::TYPE_TEXT); //to_date(numeric) was supported in 8.2 but not in 8.3: list_conversions.push_back(Field::TYPE_DATE); //to_timestamp(numeric) was supported in 8.2 but not in 8.3: list_conversions.push_back(Field::TYPE_TIME); m_map_conversions[Field::TYPE_NUMERIC] = list_conversions; //Text: list_conversions.clear(); list_conversions.push_back(Field::TYPE_BOOLEAN); list_conversions.push_back(Field::TYPE_NUMERIC); list_conversions.push_back(Field::TYPE_DATE); list_conversions.push_back(Field::TYPE_TIME); m_map_conversions[Field::TYPE_TEXT] = list_conversions; //Boolean: list_conversions.clear(); list_conversions.push_back(Field::TYPE_TEXT); list_conversions.push_back(Field::TYPE_NUMERIC); //to_timestamp(numeric) was supported in 8.2 but not in 8.3: list_conversions.push_back(Field::TYPE_DATE); //to_timestamp(numeric) was supported in 8.2 but not in 8.3: list_conversions.push_back(Field::TYPE_TIME); m_map_conversions[Field::TYPE_BOOLEAN] = list_conversions; //Date: list_conversions.clear(); list_conversions.push_back(Field::TYPE_TEXT); //to_number(textcat()) was supported in 8.2 but not in 8.3: list_conversions.push_back(Field::TYPE_NUMERIC); //to_number(textcat()) was supported in 8.2 but not in 8.3: list_conversions.push_back(Field::TYPE_BOOLEAN); m_map_conversions[Field::TYPE_DATE] = list_conversions; //Time: list_conversions.clear(); list_conversions.push_back(Field::TYPE_TEXT); list_conversions.push_back(Field::TYPE_NUMERIC); list_conversions.push_back(Field::TYPE_BOOLEAN); m_map_conversions[Field::TYPE_TIME] = list_conversions; m_maps_inited = true; } } //static: bool Field::get_conversion_possible(glom_field_type field_type_src, glom_field_type field_type_dest) { type_map_conversions::const_iterator iterFind = m_map_conversions.find(field_type_src); if(iterFind != m_map_conversions.end()) { const type_list_conversion_targets list_conversions = iterFind->second; type_list_conversion_targets::const_iterator iterConversionFind = std::find(list_conversions.begin(), list_conversions.end(), field_type_dest); if(iterConversionFind != list_conversions.end()) return true; //Success: conversion found. } return false; //failed. } //static: Field::type_map_type_names Field::get_type_names_ui() { init_map(); return m_map_type_names_ui; } //static: Field::type_map_type_names Field::get_type_names() { init_map(); return m_map_type_names; } //static: Field::type_map_type_names Field::get_usable_type_names() { init_map(); type_map_type_names result = m_map_type_names_ui; //Remove INVALID, because it's not something that a user can use for a field type. type_map_type_names::iterator iter = result.find(TYPE_INVALID); if(iter != result.end()) result.erase(iter); return result; } //static: Glib::ustring Field::get_type_name_ui(glom_field_type glom_type) { Glib::ustring result = "Invalid"; type_map_type_names::iterator iterFind = m_map_type_names_ui.find(glom_type); if(iterFind != m_map_type_names_ui.end()) result = iterFind->second; return result; } //static: Field::glom_field_type Field::get_type_for_ui_name(const Glib::ustring& glom_type) { glom_field_type result = TYPE_INVALID; for(type_map_type_names::iterator iter = m_map_type_names_ui.begin(); iter != m_map_type_names_ui.end(); ++iter) { if(iter->second == glom_type) { result = iter->first; break; } } return result; } Glib::ustring Field::get_calculation() const { return m_calculation; } void Field::set_calculation(const Glib::ustring& calculation) { m_calculation = calculation; } bool Field::get_has_calculation() const { return !m_calculation.empty(); } Field::type_list_strings Field::get_calculation_relationships() const { //TODO: Use regex, for instance with pcre here? //TODO: Better?: Run the calculation on some example data, and record the touched fields? But this could not exercise every code path. //TODO_Performance: Just cache the result whenever m_calculation changes. type_list_strings result; Glib::ustring::size_type index = 0; const Glib::ustring::size_type count = m_calculation.size(); const Glib::ustring prefix = "record.related[\""; const Glib::ustring::size_type prefix_size = prefix.size(); while(index < count) { Glib::ustring::size_type pos_find = m_calculation.find(prefix, index); if(pos_find != Glib::ustring::npos) { Glib::ustring::size_type pos_find_end = m_calculation.find("\"]", pos_find); if(pos_find_end != Glib::ustring::npos) { Glib::ustring::size_type pos_start = pos_find + prefix_size; const Glib::ustring field_name = m_calculation.substr(pos_start, pos_find_end - pos_start); result.push_back(field_name); index = pos_find_end + 1; } } ++index; } return result; } void Field::set_visible(bool val) { m_visible = val; } bool Field::get_visible() const { return m_visible; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/print_layout.h0000644000175000017500000000520412234252646024311 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_PRINT_LAYOUT_H #define GLOM_DATASTRUCTURE_PRINT_LAYOUT_H #include #include #include namespace Glom { class PrintLayout : public TranslatableItem { public: PrintLayout(); PrintLayout(const PrintLayout& src); PrintLayout& operator=(const PrintLayout& src); bool get_show_table_title() const; void set_show_table_title(bool show_table_title = true); sharedptr get_layout_group(); sharedptr get_layout_group() const; /** Sets the Page Setup as it would be created by a Gtk::PageSetup. */ void set_page_setup(const std::string& page_setup); /** Returns the Page Setup as it would be created by a Gtk::PageSetup. */ std::string get_page_setup() const; void set_page_count(guint count); guint get_page_count() const; bool get_show_grid() const; void set_show_grid(bool show_grid = true); bool get_show_rules() const; void set_show_rules(bool show_rules = true); bool get_show_outlines() const; void set_show_outlines(bool show_outlines = true); typedef std::vector type_vec_doubles; /** Get the y positions of the horizontal rule lines. */ type_vec_doubles get_horizontal_rules() const; void set_horizontal_rules(const type_vec_doubles& rules); /** Get the x positions of the vertical rule lines. */ type_vec_doubles get_vertical_rules() const; void set_vertical_rules(const type_vec_doubles& rules); private: sharedptr m_layout_group; bool m_show_table_title; bool m_show_grid; bool m_show_rules; bool m_show_outlines; std::string m_page_setup; guint m_page_count; type_vec_doubles m_horizontal_rules; type_vec_doubles m_vertical_rules; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_PRINT_LAYOUT_H glom-1.22.4/glom/libglom/data_structure/report.h0000644000175000017500000000273612234252646023102 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_REPORT_H #define GLOM_DATASTRUCTURE_REPORT_H #include #include #include namespace Glom { class Report : public TranslatableItem { public: Report(); Report(const Report& src); Report& operator=(const Report& src); bool get_show_table_title() const; void set_show_table_title(bool show_table_title = true); sharedptr get_layout_group(); sharedptr get_layout_group() const; private: sharedptr m_layout_group; bool m_show_table_title; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_REPORT_H glom-1.22.4/glom/libglom/data_structure/translatable_item.h0000644000175000017500000001212012234776363025254 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_TRANSLATABLE_ITEM_H #define GLOM_DATASTRUCTURE_TRANSLATABLE_ITEM_H #include #include #include namespace Glom { ///TranslatableItem have a map of translation strings - one string for each locale. class TranslatableItem { public: TranslatableItem(); TranslatableItem(const TranslatableItem& src); virtual ~TranslatableItem(); TranslatableItem& operator=(const TranslatableItem& src); bool operator==(const TranslatableItem& src) const; bool operator!=(const TranslatableItem& src) const; /** Set the non-translated identifier name. */ virtual void set_name(const Glib::ustring& name); /** Get the non-translated identifier name. */ virtual Glib::ustring get_name() const; bool get_name_not_empty() const; //For performance. virtual Glib::ustring get_title_or_name(const Glib::ustring& locale) const; /** Get the title's translation for the specified locale, falling back to the * original text if there is no translation. * * See also get_title_translation() and get_title_original(), which (optionally) * do not use fallbacks. * * @param locale The locale whose title text should be returned. If this is empty then the original text will be returned. * @result The text of the title. */ virtual Glib::ustring get_title(const Glib::ustring& locale) const; //This is virtual so that ChoiceValue can override it. /** Get the title's original (non-translated, usually English) text. */ virtual Glib::ustring get_title_original() const; /** Get the title's translation for the specified @a locale, optionally * falling back to a locale of the same language, and then falling back to * the original. * Calling this with the current locale is the same as calling get_title_original(). */ Glib::ustring get_title_translation(const Glib::ustring& locale, bool fallback = true) const; /** Set the title's translation for the specified locale. * @param title The text of the title. * @param locale The locale whose title text should be set. If this is empty then the original text will be set. */ void set_title(const Glib::ustring& title, const Glib::ustring& locale); /** Set the title's original (non-translated, usually English) text. * This is the same as calling set_title() with an empty locale parameter. */ void set_title_original(const Glib::ustring& title); /// Clear the original title and any translations of the title. void clear_title_in_all_locales(); typedef std::map type_map_locale_to_translations; bool get_has_translations() const; enum enumTranslatableItemType { TRANSLATABLE_TYPE_INVALID, TRANSLATABLE_TYPE_FIELD, TRANSLATABLE_TYPE_RELATIONSHIP, TRANSLATABLE_TYPE_LAYOUT_ITEM, TRANSLATABLE_TYPE_CUSTOM_TITLE, TRANSLATABLE_TYPE_PRINT_LAYOUT, TRANSLATABLE_TYPE_REPORT, TRANSLATABLE_TYPE_TABLE, TRANSLATABLE_TYPE_BUTTON, TRANSLATABLE_TYPE_TEXTOBJECT, TRANSLATABLE_TYPE_IMAGEOBJECT, TRANSLATABLE_TYPE_CHOICEVALUE, TRANSLATABLE_TYPE_DATABASE_TITLE }; enumTranslatableItemType get_translatable_item_type() const; //Direct access, for performance: const type_map_locale_to_translations& _get_translations_map() const; static Glib::ustring get_translatable_type_name(enumTranslatableItemType item_type); /** The non-translated name is used for the context in gettext .po files. */ static Glib::ustring get_translatable_type_name_nontranslated(enumTranslatableItemType item_type); private: /** Get the locale used as the source language. * This is the language of the title that is used when there are no translations. */ static Glib::ustring get_original_locale(); void set_title_translation(const Glib::ustring& locale, const Glib::ustring& translation); protected: enumTranslatableItemType m_translatable_item_type; private: Glib::ustring m_name; //Non-translated identifier; Glib::ustring m_title; //The original, untranslated (usually-English) title. type_map_locale_to_translations m_map_translations; }; template Glib::ustring glom_get_sharedptr_name(const sharedptr& item) { if(item) return item->get_name(); else return Glib::ustring(); } } //namespace Glom #endif //GLOM_DATASTRUCTURE_TRANSLATABLE_ITEM_H glom-1.22.4/glom/libglom/data_structure/translatable_item.cc0000644000175000017500000002026712234776363025425 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include namespace Glom { TranslatableItem::TranslatableItem() : m_translatable_item_type(TRANSLATABLE_TYPE_INVALID) { } TranslatableItem::TranslatableItem(const TranslatableItem& src) : m_translatable_item_type(src.m_translatable_item_type), m_name(src.m_name), m_title(src.m_title), m_map_translations(src.m_map_translations) { } TranslatableItem::~TranslatableItem() { } TranslatableItem& TranslatableItem::operator=(const TranslatableItem& src) { m_name = src.m_name; m_title = src.m_title; m_translatable_item_type = src.m_translatable_item_type; m_map_translations = src.m_map_translations; return *this; } bool TranslatableItem::operator==(const TranslatableItem& src) const { bool bResult = (m_name == src.m_name) && (m_title == src.m_title) && (m_translatable_item_type == src.m_translatable_item_type) && (m_map_translations == src.m_map_translations); return bResult; } bool TranslatableItem::operator!=(const TranslatableItem& src) const { return !(operator==(src)); } void TranslatableItem::set_title_translation(const Glib::ustring& locale, const Glib::ustring& translation) { if(translation.empty()) { //Remove it from the map, to save space: type_map_locale_to_translations::iterator iterFind = m_map_translations.find(locale); if(iterFind != m_map_translations.end()) m_map_translations.erase(iterFind); } else m_map_translations[locale] = translation; } Glib::ustring TranslatableItem::get_title_translation(const Glib::ustring& locale, bool fallback) const { type_map_locale_to_translations::const_iterator iterFind = m_map_translations.find(locale); if(iterFind != m_map_translations.end()) return iterFind->second; if(!fallback) return Glib::ustring(); if(m_map_translations.empty()) return get_title_original(); //Return the first translation from a locale with the same language, if any. //TODO_Performance: This is slow. //Note that this would, for instance, give en_GB translations before en_US translations, if there are no en_AU translations. const Glib::ustring locale_language_id = Utils::locale_language_id(locale); for(type_map_locale_to_translations::const_iterator iter = m_map_translations.begin(); iter != m_map_translations.end(); ++iter) { const Glib::ustring& locale_id = iter->first; if(Utils::locale_language_id(locale_id) == locale_language_id) { if(!(iter->second.empty())) return iter->second; } } //Fall back to the original title: const Glib::ustring title_original = get_title_original(); if(!title_original.empty()) return title_original; //Fall back to first translation, if any. //This would be quite unusual. type_map_locale_to_translations::const_iterator iter = m_map_translations.begin(); if(iter != m_map_translations.end()) { //std::cout << "debug: TranslatableItem::get_title() falling back to the first translation: locale=" << iter->first << std::endl; return iter->second; } return Glib::ustring(); } const TranslatableItem::type_map_locale_to_translations& TranslatableItem::_get_translations_map() const { return m_map_translations; } bool TranslatableItem::get_has_translations() const { return !m_map_translations.empty(); } Glib::ustring TranslatableItem::get_title(const Glib::ustring& locale) const { if(!locale.empty()) { const Glib::ustring translated_title = get_title_translation(locale, true /* fallback */); if(!translated_title.empty()) return translated_title; } return get_title_original(); } Glib::ustring TranslatableItem::get_title_original() const { return m_title; } void TranslatableItem::set_title(const Glib::ustring& title, const Glib::ustring& locale) { if(locale.empty()) { set_title_original(title); return; } set_title_translation(locale, title); } void TranslatableItem::set_title_original(const Glib::ustring& title) { m_title = title; } //TODO: Make this virtual and handle it in ChoiceValue? void TranslatableItem::clear_title_in_all_locales() { m_title.clear(); for(type_map_locale_to_translations::iterator iter = m_map_translations.begin(); iter != m_map_translations.end(); ++iter) { Glib::ustring& translation = iter->second; translation.clear(); } } TranslatableItem::enumTranslatableItemType TranslatableItem::get_translatable_item_type() const { return m_translatable_item_type; } Glib::ustring TranslatableItem::get_translatable_type_name_nontranslated(enumTranslatableItemType item_type) { //TODO: Is there an easier way to do this, without duplicating code? if(item_type == TRANSLATABLE_TYPE_FIELD) return "Field"; else if(item_type == TRANSLATABLE_TYPE_CUSTOM_TITLE) return "Custom Title"; else if(item_type == TRANSLATABLE_TYPE_RELATIONSHIP) return "Relationship"; else if(item_type == TRANSLATABLE_TYPE_RELATIONSHIP) return "Layout Item"; else if(item_type == TRANSLATABLE_TYPE_PRINT_LAYOUT) return "Print Layout"; else if(item_type == TRANSLATABLE_TYPE_REPORT) return "Report"; else if(item_type == TRANSLATABLE_TYPE_TABLE) return "Table"; else if(item_type == TRANSLATABLE_TYPE_LAYOUT_ITEM) return "Layout Group"; else if(item_type == TRANSLATABLE_TYPE_CUSTOM_TITLE) return "Field Title"; else if(item_type == TRANSLATABLE_TYPE_BUTTON) return "Button"; else if(item_type == TRANSLATABLE_TYPE_TEXTOBJECT) return "Text"; else if(item_type == TRANSLATABLE_TYPE_IMAGEOBJECT) return "Image"; else if(item_type == TRANSLATABLE_TYPE_CHOICEVALUE) return "Field Choice"; else if(item_type == TRANSLATABLE_TYPE_DATABASE_TITLE) return "Database Title"; else return "Unknown"; } Glib::ustring TranslatableItem::get_translatable_type_name(enumTranslatableItemType item_type) { if(item_type == TRANSLATABLE_TYPE_FIELD) return _("Field"); else if(item_type == TRANSLATABLE_TYPE_CUSTOM_TITLE) return _("Custom Title"); else if(item_type == TRANSLATABLE_TYPE_RELATIONSHIP) return _("Relationship"); else if(item_type == TRANSLATABLE_TYPE_RELATIONSHIP) return _("Layout Item"); else if(item_type == TRANSLATABLE_TYPE_PRINT_LAYOUT) return _("Print Layout"); else if(item_type == TRANSLATABLE_TYPE_REPORT) return _("Report"); else if(item_type == TRANSLATABLE_TYPE_TABLE) return _("Table"); else if(item_type == TRANSLATABLE_TYPE_LAYOUT_ITEM) return _("Layout Group"); else if(item_type == TRANSLATABLE_TYPE_CUSTOM_TITLE) return _("Field Title"); else if(item_type == TRANSLATABLE_TYPE_BUTTON) return _("Button"); else if(item_type == TRANSLATABLE_TYPE_TEXTOBJECT) return _("Text"); else if(item_type == TRANSLATABLE_TYPE_IMAGEOBJECT) return _("Image"); else if(item_type == TRANSLATABLE_TYPE_CHOICEVALUE) return _("Field Choice"); else if(item_type == TRANSLATABLE_TYPE_DATABASE_TITLE) return _("Database Title"); else return _("Unknown"); } void TranslatableItem::set_name(const Glib::ustring& name) { m_name = name; } Glib::ustring TranslatableItem::get_name() const { return m_name; } bool TranslatableItem::get_name_not_empty() const { return !(get_name().empty()); } Glib::ustring TranslatableItem::get_title_or_name(const Glib::ustring& locale) const { const Glib::ustring title = get_title(locale); if(title.empty()) return get_name(); else return title; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/numeric_format.h0000644000175000017500000000540712234252646024577 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2005 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATA_STRUCTURE_NUMERIC_FORMAT_H #define GLOM_DATA_STRUCTURE_NUMERIC_FORMAT_H #include namespace Glom { class NumericFormat { public: NumericFormat(); NumericFormat(const NumericFormat& src); ~NumericFormat(); NumericFormat& operator=(const NumericFormat& src); bool operator==(const NumericFormat& src) const; bool operator!=(const NumericFormat& src) const; /** The foreground color to use for negative values, if * m_alt_foreground_color_for_negatives is true. * @returns the foreground color, in a format recognised by XParseColor */ static Glib::ustring get_alternative_color_for_negatives(); /** Get the number of significant figures we should allow to be shown until * we show the awkward e syntax. This should not be used if * m_decimal_places_restricted is true. * @returns the number of significant figures to show */ static guint get_default_precision(); /** String to use as the currency symbol. When the symbol is shown in the UI, * a space is appended to the string, and the result is prepended to the * data from the database. Be aware that the string supplied by the Glom * document might have no representation in the current user's locale. */ Glib::ustring m_currency_symbol; /** Setting this to false would override the locale, if it used a 1000s * separator. */ bool m_use_thousands_separator; /** Whether to restrict numeric precision. If true, a fixed precision is set * according to m_decimal_places. If false, the maximum precision is used. * However, the chosen fixed precision might exceed the maximum precision. */ bool m_decimal_places_restricted; /** The number of decimal places to show, although it is only used if * m_decimal_places_restricted is false. */ guint m_decimal_places; /** Whether to use an alternative foreground color for negative values. */ bool m_alt_foreground_color_for_negatives; }; } //namespace Glom #endif //GLOM_DATA_STRUCTURE_NUMERIC_FORMAT_H glom-1.22.4/glom/libglom/data_structure/fieldtypes.h0000644000175000017500000000404412234776363023740 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_FIELDTYPES_H #define GLOM_DATASTRUCTURE_FIELDTYPES_H #include #include namespace Glom { /* This class maps the SQL type names (seen in libgda schema datamodels, and in SQL) to the Gda Types. */ class FieldTypes { public: FieldTypes(const Glib::RefPtr& gda_connection); virtual ~FieldTypes(); Glib::ustring get_string_name_for_gdavaluetype(GType field_type) const; GType get_fallback_type_for_gdavaluetype(GType field_type) const; guint get_types_count() const; private: /** Use some default mappings, * if, for some reason, we cannot get it from the database server at runtime. */ void fill_with_default_data(); typedef std::map type_mapSchemaStringsToGdaTypes; type_mapSchemaStringsToGdaTypes m_mapSchemaStringsToGdaTypes; //Duplicate information, to make searching easier: typedef std::map type_mapGdaTypesToSchemaStrings; type_mapGdaTypesToSchemaStrings m_mapGdaTypesToSchemaStrings; //Fallback types used if the database system does not support a type natively typedef std::map type_mapFallbackTypes; type_mapFallbackTypes m_mapFallbackTypes; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_FIELDTYPES_H glom-1.22.4/glom/libglom/data_structure/choicevalue.cc0000644000175000017500000000377012234252645024212 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include namespace Glom { ChoiceValue::ChoiceValue() { m_translatable_item_type = TRANSLATABLE_TYPE_CHOICEVALUE; } ChoiceValue::ChoiceValue(const ChoiceValue& src) : TranslatableItem(src) { //TODO_Performance: Implement this properly, without the extra copy. operator=(src); } ChoiceValue::~ChoiceValue() { } ChoiceValue& ChoiceValue::operator=(const ChoiceValue& src) { TranslatableItem::operator=(src); m_value = src.m_value; return *this; } bool ChoiceValue::operator==(const ChoiceValue& src) const { return TranslatableItem::operator==(src) && (m_value == src.m_value); } bool ChoiceValue::operator!=(const ChoiceValue& src) const { return !(operator==(src)); } ChoiceValue* ChoiceValue::clone() const { return new ChoiceValue(*this); } void ChoiceValue::set_value(const Gnome::Gda::Value& value) { m_value = value; } Gnome::Gda::Value ChoiceValue::get_value() const { return m_value; } Glib::ustring ChoiceValue::get_title_original() const { return m_value.to_string(); } bool ChoiceValue::is_translatable() const { if(m_value.get_value_type() == G_TYPE_STRING) return true; return false; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/groupinfo.h0000644000175000017500000000306112234252646023567 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATA_STRUCTURE_GROUPINFO_H #define GLOM_DATA_STRUCTURE_GROUPINFO_H #include #include #include namespace Glom { class GroupInfo : public TranslatableItem { public: GroupInfo(); GroupInfo(const GroupInfo& src); virtual ~GroupInfo(); GroupInfo& operator=(const GroupInfo& src); bool operator==(const GroupInfo& src) const; bool operator!=(const GroupInfo& src) const; bool m_developer; //m_privs is ignored if this is true. typedef std::map type_map_table_privileges; type_map_table_privileges m_map_privileges; //typedef std::vector type_users; //type_users m_users; }; } //namespace Glom #endif //GLOM_DATA_STRUCTURE_GROUPINFO_H glom-1.22.4/glom/libglom/data_structure/foundset.h0000644000175000017500000000360512234252645023411 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2008 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_FOUNDSET_H #define GLOM_DATASTRUCTURE_FOUNDSET_H #include #include #include //For std::pair #include #include namespace Glom { /** A grouping of information about a view of a table, * including what records are viewed (the where clause), * how the are sorted (the sort clause). */ class FoundSet { public: FoundSet(); FoundSet(const FoundSet& src); FoundSet& operator=(const FoundSet& src); bool operator==(const FoundSet& src) const; Glib::ustring m_table_name; sharedptr m_extra_join; // Only used for doubly-related related records (portals), in which case the WHERE clause is also slightly different. Gnome::Gda::SqlExpr m_where_clause; //TODO: Avoid duplication with types in Formatting. ///field, ascending typedef std::pair< sharedptr, bool> type_pair_sort_field; typedef std::vector type_sort_clause; type_sort_clause m_sort_clause; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_FOUNDSET_H glom-1.22.4/glom/libglom/data_structure/relationship.h0000644000175000017500000000456012234252646024265 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_RELATIONSHIP_H #define GLOM_RELATIONSHIP_H #include #include #include namespace Glom { class Relationship : public TranslatableItem, public HasTitleSingular { public: Relationship(); Relationship(const Relationship& src); ~Relationship(); Relationship& operator=(const Relationship& src); bool operator==(const Relationship& src) const; Relationship* clone() const; Glib::ustring get_from_table() const; Glib::ustring get_from_field() const; Glib::ustring get_to_table() const; Glib::ustring get_to_field() const; void set_from_table(const Glib::ustring& strVal); void set_from_field(const Glib::ustring& strVal); void set_to_table(const Glib::ustring& strVal); void set_to_field(const Glib::ustring& strVal); ///Whether related records will be created automatically. bool get_auto_create() const; void set_auto_create(bool val = true); ///Whether related records may be edited through this relationship. bool get_allow_edit() const; void set_allow_edit(bool val = true); /** Whether the relationship specifies from and to fields. * If not, then it specifies all records in the to table. */ bool get_has_fields() const; /** Whether the relationship specifies a related table. */ bool get_has_to_table() const; private: Glib::ustring m_strFrom_Table; Glib::ustring m_strFrom_Field; Glib::ustring m_strTo_Table; Glib::ustring m_strTo_Field; bool m_allow_edit, m_auto_create; }; } //namespace Glom #endif // GLOM_RELATIONSHIP_H glom-1.22.4/glom/libglom/data_structure/layout/0000755000175000017500000000000012235000126022704 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_portal.h0000644000175000017500000001525012234776363026663 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_PORTAL_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_PORTAL_H #include #include #include //#include namespace Glom { class Document; //For the utility functions. /** * get_title() returns either the title of the Field or the CustomTitle. * You should not call get/set_title_original() or get/set_title_translation() * on items of this type. */ class LayoutItem_Portal : public LayoutGroup, public UsesRelationship //TODO: Allow portals to have custom titles that override the relationship titles? //public HasTitleSingular { public: LayoutItem_Portal(); LayoutItem_Portal(const LayoutItem_Portal& src); LayoutItem_Portal& operator=(const LayoutItem_Portal& src); virtual ~LayoutItem_Portal(); virtual LayoutItem* clone() const; virtual Glib::ustring get_title(const Glib::ustring& locale) const; virtual Glib::ustring get_title_or_name(const Glib::ustring& locale) const; virtual Glib::ustring get_part_type_name() const; virtual void change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new); virtual void change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new); ///A helper method to avoid extra ifs to avoid null dereferencing. Glib::ustring get_from_table() const; //virtual void debug(guint level = 0) const; /** Gets the relationship to use for navigation if get_navigation_type() is * NAVIGATION_NONE. */ sharedptr get_navigation_relationship_specific(); /** Get the @a relationship to use for navigation if get_navigation_type() is * NAVIGATION_NONE. */ sharedptr get_navigation_relationship_specific() const; /** Set the @a relationship to use for navigation if get_navigation_type() is * NAVIGATION_NONE. */ void set_navigation_relationship_specific(const sharedptr& relationship); void reset_navigation_relationship(); /** The navigation (if any) that should be used when the user * activates a related record row. */ enum navigation_type { NAVIGATION_NONE, /**< No navigation will be offered. */ NAVIGATION_AUTOMATIC, /**< The destination related table will be chosen automatically based on the relationship and the visible fields. */ NAVIGATION_SPECIFIC /**< The destination related table will be determined by a specified relationship. */ }; /** Discover what @a type (if any) navigation should be used when the user * activates a related record row. */ navigation_type get_navigation_type() const; /** Set what @a type (if any) navigation should be used when the user * activates a related record row. */ void set_navigation_type(navigation_type type); /** Discover what table to show when clicking on a related record. * This table will not necessarily just be the directly related table. * The caller should check, in the document, that the returned @a table_name is not hidden. * * @param table_name The table that should be shown. * @param relationship The relationship in the directly related table that should be used to get to that table. If this is empty then we should just show the table directly. */ void get_suitable_table_to_view_details(Glib::ustring& table_name, sharedptr& relationship, const Document* document) const; /** Get the relationship (from the related table) into which the row button should navigate, * or none if it should use the portal's directly related table itself. * (If that should be chosen automatically, by looking at the fields in the portal.) */ sharedptr get_portal_navigation_relationship_automatic(const Document* document) const; /// This is used only for the print layouts. double get_print_layout_row_height() const; /// This is used only for the print layouts. void set_print_layout_row_height(double row_height); /// This is used only for the print layouts. double get_print_layout_row_line_width() const; /// This is used only for the print layouts. void set_print_layout_row_line_width(double width); /// This is used only for the print layouts. double get_print_layout_column_line_width() const; /// This is used only for the print layouts. void set_print_layout_column_line_width(double width); /// This is used only for the print layouts. Glib::ustring get_print_layout_line_color() const; /// This is used only for the print layouts. void set_print_layout_line_color(const Glib::ustring& color); /** Get the number of rows that should be displayed. */ void get_rows_count(gulong& rows_count_min, gulong& rows_count_max) const; /** Set the number of rows that should be displayed. */ void set_rows_count(gulong rows_count_min, gulong rows_count_max); private: sharedptr get_field_is_from_non_hidden_related_record(const Document* document) const; sharedptr get_field_identifies_non_hidden_related_record(sharedptr& used_in_relationship, const Document* document) const; sharedptr m_navigation_relationship_specific; // This is used only for the print layouts. double m_print_layout_row_height; double m_print_layout_row_line_width, m_print_layout_column_line_width; Glib::ustring m_print_layout_line_color; //TODO: Patch GooCanvasTable to allow different colors for rows and columns? //If no navigation relationship has been specified then it will be automatically chosen or navigation will be disabled: navigation_type m_navigation_type; gulong m_rows_count_min, m_rows_count_max; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_PORTAL_H glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_placeholder.cc0000644000175000017500000000324512234252646027774 0ustar00murraycmurrayc00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * glom * Copyright (C) Johannes Schmid 2007 * * glom is free software. * * You may redistribute it and/or modify it under the terms of the * GNU General Public License, as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * glom is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glom. If not, write to: * The Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301, USA. */ #include #include namespace Glom { LayoutItem_Placeholder::LayoutItem_Placeholder() { } LayoutItem_Placeholder::~LayoutItem_Placeholder() { } LayoutItem_Placeholder::LayoutItem_Placeholder(const LayoutItem_Placeholder& src) : LayoutItem(src) { } LayoutItem* LayoutItem_Placeholder::clone() const { return new LayoutItem_Placeholder(*this); } bool LayoutItem_Placeholder::operator==(const LayoutItem_Placeholder* src) const { return LayoutItem::operator==(*src); } Glib::ustring LayoutItem_Placeholder::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Placeholder"); } Glib::ustring LayoutItem_Placeholder::get_report_part_id() const { return "placeholder"; } } glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_notebook.h0000644000175000017500000000300112234252646027162 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_NOTEBOOK_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_NOTEBOOK_H #include #include #include namespace Glom { /** The child items are LayoutGroups, each of which will be shown on its own tab. */ class LayoutItem_Notebook : public LayoutGroup { public: LayoutItem_Notebook(); LayoutItem_Notebook(const LayoutItem_Notebook& src); LayoutItem_Notebook& operator=(const LayoutItem_Notebook& src); virtual ~LayoutItem_Notebook(); virtual LayoutItem* clone() const; virtual Glib::ustring get_part_type_name() const; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_NOTEBOOK_H glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_calendarportal.cc0000644000175000017500000000524612234252646030510 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { LayoutItem_CalendarPortal::LayoutItem_CalendarPortal() { } LayoutItem_CalendarPortal::LayoutItem_CalendarPortal(const LayoutItem_CalendarPortal& src) : LayoutItem_Portal(src), m_date_field(src.m_date_field) { } LayoutItem_CalendarPortal::~LayoutItem_CalendarPortal() { } LayoutItem* LayoutItem_CalendarPortal::clone() const { return new LayoutItem_CalendarPortal(*this); } LayoutItem_CalendarPortal& LayoutItem_CalendarPortal::operator=(const LayoutItem_CalendarPortal& src) { LayoutItem_Portal::operator=(src); m_date_field = src.m_date_field; return *this; } Glib::ustring LayoutItem_CalendarPortal::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Calendar Portal"); } void LayoutItem_CalendarPortal::change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new) { LayoutItem_Portal::change_related_field_item_name(table_name, field_name, field_name_new); } void LayoutItem_CalendarPortal::change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new) { LayoutItem_Portal::change_field_item_name(table_name, field_name, field_name_new); sharedptr relationship = get_relationship(); if(relationship && (relationship->get_to_table() == table_name) && (m_date_field->get_name() == field_name)) m_date_field->set_name(field_name_new); //Change it. } sharedptr LayoutItem_CalendarPortal::get_date_field() { return m_date_field; } sharedptr LayoutItem_CalendarPortal::get_date_field() const { return m_date_field; } void LayoutItem_CalendarPortal::set_date_field(const sharedptr& field) { m_date_field = field; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_notebook.cc0000644000175000017500000000301012234252646027320 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { LayoutItem_Notebook::LayoutItem_Notebook() { } LayoutItem_Notebook::LayoutItem_Notebook(const LayoutItem_Notebook& src) : LayoutGroup(src) { } LayoutItem_Notebook::~LayoutItem_Notebook() { } LayoutItem* LayoutItem_Notebook::clone() const { return new LayoutItem_Notebook(*this); } LayoutItem_Notebook& LayoutItem_Notebook::operator=(const LayoutItem_Notebook& src) { LayoutGroup::operator=(src); return *this; } Glib::ustring LayoutItem_Notebook::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). //"Notebook" means a GtkNotebook-type widget. return _("Notebook"); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_field.cc0000644000175000017500000002257712234252646026606 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { LayoutItem_Field::LayoutItem_Field() : m_priv_view(false), m_priv_edit(false), m_field_cache_valid(false), m_hidden(false), m_formatting_use_default(true) { } LayoutItem_Field::LayoutItem_Field(const LayoutItem_Field& src) : LayoutItem_WithFormatting(src), UsesRelationship(src), m_priv_view(src.m_priv_view), m_priv_edit(src.m_priv_edit), //m_table_name(src.m_table_name), m_field_cache_valid(src.m_field_cache_valid), m_hidden(src.m_hidden), m_formatting_use_default(src.m_formatting_use_default), m_title_custom(src.m_title_custom) { //std::cerr << G_STRFUNC << ": m_choices_related_relationship=" << m_choices_related_relationship << ", src.m_choices_related_relationship=" << src.m_choices_related_relationship << std::endl; m_field = src.m_field; } LayoutItem_Field::~LayoutItem_Field() { } LayoutItem* LayoutItem_Field::clone() const { return new LayoutItem_Field(*this); } bool LayoutItem_Field::operator==(const LayoutItem_Field& src) const { bool result = LayoutItem_WithFormatting::operator==(src) && UsesRelationship::operator==(src) && (m_priv_view == src.m_priv_view) && (m_priv_edit == src.m_priv_edit) && (m_hidden == src.m_hidden) && (m_formatting_use_default == src.m_formatting_use_default) && (m_field_cache_valid == src.m_field_cache_valid); if(m_field && src.m_field) result = result && (*m_field == *(src.m_field)); else result = result && (m_field == src.m_field); if(m_title_custom && src.m_title_custom) result = result && (*m_title_custom == *(src.m_title_custom)); else result = result && (m_title_custom == src.m_title_custom); return result; } //Avoid using this, for performance: LayoutItem_Field& LayoutItem_Field::operator=(const LayoutItem_Field& src) { LayoutItem_WithFormatting::operator=(src); UsesRelationship::operator=(src); m_field = src.m_field; m_field_cache_valid = src.m_field_cache_valid; m_priv_view = src.m_priv_view; m_priv_edit = src.m_priv_edit; m_hidden = src.m_hidden; m_formatting_use_default = src.m_formatting_use_default; m_title_custom = src.m_title_custom; return *this; } void LayoutItem_Field::set_name(const Glib::ustring& name) { if(get_name() != name) m_field_cache_valid = false; LayoutItem_WithFormatting::set_name(name); } Glib::ustring LayoutItem_Field::get_name() const { return LayoutItem_WithFormatting::get_name(); } Glib::ustring LayoutItem_Field::get_title_no_custom(const Glib::ustring& locale) const { //Use the field's default title: if(m_field_cache_valid && m_field) { return m_field->get_title_or_name(locale); } else return get_name(); //We ignore TranslatableItem::get_title() for LayoutItem_Field. } Glib::ustring LayoutItem_Field::get_title_no_custom_translation(const Glib::ustring& locale, bool fallback) const { //Use the field's default title: if(m_field_cache_valid && m_field) { return m_field->get_title_translation(locale, fallback); } else return Glib::ustring(); } Glib::ustring LayoutItem_Field::get_title_or_name_no_custom(const Glib::ustring& locale) const { //Use the field's default title: if(m_field_cache_valid && m_field) { return m_field->get_title(locale); } return Glib::ustring(); } Glib::ustring LayoutItem_Field::get_title(const Glib::ustring& locale) const { //Use the custom title (overriding the field's default title), if there is one: //This may even be empty if the developer specifies that. if(m_title_custom && m_title_custom->get_use_custom_title()) { return m_title_custom->get_title(locale); } //Use the field's default title: return get_title_no_custom(locale); } Glib::ustring LayoutItem_Field::get_title_or_name(const Glib::ustring& locale) const { //Use the custom title (overriding the field's default title), if there is one: //This may even be empty if the developer specifies that. if(m_title_custom && m_title_custom->get_use_custom_title()) { return m_title_custom->get_title(locale); } //Use the field's default title: return get_title_no_custom(locale); } bool LayoutItem_Field::get_editable_and_allowed() const { //The relationship might forbid editing of any fields through itself: if(get_has_relationship_name()) { sharedptr rel = get_relationship(); if(rel) { if(!(rel->get_allow_edit())) return false; } } else if(m_field && m_field->get_has_calculation()) { return false; //Calculations can never be edited. } return get_editable() && m_priv_edit; } Glib::ustring LayoutItem_Field::get_layout_display_name() const { Glib::ustring result; if(m_field_cache_valid && m_field) result = m_field->get_name(); else result = get_name(); //Indicate if it's a field in another table. if(get_has_related_relationship_name()) result = get_related_relationship_name() + "::" + result; if(get_has_relationship_name()) result = get_relationship_name() + "::" + result; return result; } bool LayoutItem_Field::get_hidden() const { return m_hidden; } void LayoutItem_Field::set_hidden(bool val) { m_hidden = val; } Glib::ustring LayoutItem_Field::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Field"); } Glib::ustring LayoutItem_Field::get_report_part_id() const { return "field"; } bool LayoutItem_Field::get_formatting_use_default() const { return m_formatting_use_default; } void LayoutItem_Field::set_formatting_use_default(bool use_default) { m_formatting_use_default = use_default; } const Formatting& LayoutItem_Field::get_formatting_used() const { if(m_formatting_use_default && m_field_cache_valid && m_field) return m_field->m_default_formatting; else return m_formatting; } Formatting::HorizontalAlignment LayoutItem_Field::get_formatting_used_horizontal_alignment(bool for_details_view) const { const Formatting& format = get_formatting_used(); Formatting::HorizontalAlignment alignment = format.get_horizontal_alignment(); if(alignment == Formatting::HORIZONTAL_ALIGNMENT_AUTO) { //By default, right-align numbers on list views, unless they are ID fields. //And left-align them on details views, because that looks silly otherwise. if(!for_details_view && (m_field && !m_field->get_primary_key())) //TODO: Also prevent this when it is a foreign key. { //Align numbers to the right by default: alignment = (m_field->get_glom_type() == Field::TYPE_NUMERIC ? Formatting::HORIZONTAL_ALIGNMENT_RIGHT : Formatting::HORIZONTAL_ALIGNMENT_LEFT); } else alignment = Formatting::HORIZONTAL_ALIGNMENT_LEFT; } return alignment; } bool LayoutItem_Field::get_formatting_used_has_translatable_choices() const { const Formatting& formatting = get_formatting_used(); if(!formatting.get_has_custom_choices()) return false; bool as_radio_buttons = false; //Ignored. if(!formatting.get_choices_restricted(as_radio_buttons)) return false; return true; } void LayoutItem_Field::set_full_field_details(const sharedptr& field) { if(field) { //std::cout << "debug: " << G_STRFUNC << ": name=" << field->get_name() << std::endl; //std::cout << "debug: " << G_STRFUNC << ": field->get_title_or_name()=" << field->get_title_or_name() << std::endl; m_field = field; m_field_cache_valid = true; LayoutItem_WithFormatting::set_name(field->get_name()); //It seems to be OK to expect get_name() to work after setting _full_ details. } else { //std::cout << "LayoutItem_Field::set_full_field_details(null): previous name=" << m_name << std::endl; m_field = sharedptr(); m_field_cache_valid = false; } } sharedptr LayoutItem_Field::get_full_field_details() const { return m_field; } Field::glom_field_type LayoutItem_Field::get_glom_type() const { if(m_field && m_field_cache_valid) return m_field->get_glom_type(); else return Field::TYPE_INVALID; } sharedptr LayoutItem_Field::get_title_custom() const { return m_title_custom; } sharedptr LayoutItem_Field::get_title_custom() { return m_title_custom; } void LayoutItem_Field::set_title_custom(const sharedptr& title) { m_title_custom = title; } bool LayoutItem_Field::is_same_field(const sharedptr& field) const { const UsesRelationship* uses_a = this; const UsesRelationship* uses_b = &(*field); if(!uses_a || !uses_b) return false; //Shouldn't happen. return (get_name() == field->get_name()) && (*uses_a == *uses_b); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_image.h0000644000175000017500000000413412234252646026434 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_IMAGE_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_IMAGE_H #include #include namespace Glom { //JPEG seems to give ugly results when saved to the database and shown again. //#define GLOM_IMAGE_FORMAT "jpeg" //#define GLOM_IMAGE_FORMAT_MIME_TYPE "image/jpeg" const char GLOM_IMAGE_FORMAT[] = "png"; const char GLOM_IMAGE_FORMAT_MIME_TYPE[] = "image/png"; class LayoutItem_Image : public LayoutItem { public: LayoutItem_Image(); LayoutItem_Image(const LayoutItem_Image& src); LayoutItem_Image& operator=(const LayoutItem_Image& src); virtual ~LayoutItem_Image(); virtual LayoutItem* clone() const; bool operator==(const LayoutItem_Image& src) const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; /** Get the image that will be shown on each record. */ Gnome::Gda::Value get_image() const; /** Set the image that will be shown on each record. */ void set_image(const Gnome::Gda::Value& image); //Saves the image to a temporary file and provides the file URI. Glib::ustring create_local_image_uri() const; //private: //This is public, for performance: Gnome::Gda::Value m_image; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_IMAGE_H glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_line.h0000644000175000017500000000400212234776363026302 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_LINE_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_LINE_H #include #include namespace Glom { /// This is only used on print layouts. class LayoutItem_Line : public LayoutItem { public: LayoutItem_Line(); LayoutItem_Line(const LayoutItem_Line& src); LayoutItem_Line& operator=(const LayoutItem_Line& src); virtual ~LayoutItem_Line(); virtual LayoutItem* clone() const; bool operator==(const LayoutItem_Line& src) const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; /** Get the coordinates. */ void get_coordinates(double& start_x, double& start_y, double& end_x, double& end_y) const; /** Set the coordinates. */ void set_coordinates(double start_x, double start_y, double end_x, double end_y); double get_line_width() const; void set_line_width(double line_width); //TODO: Document the format: Glib::ustring get_line_color() const; void set_line_color(const Glib::ustring& color); private: double m_start_x, m_start_y, m_end_x, m_end_y; double m_line_width; Glib::ustring m_color; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_LINE_H glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_text.h0000644000175000017500000000404112234776363026342 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_TEXT_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_TEXT_H #include #include namespace Glom { class LayoutItem_Text : public LayoutItem_WithFormatting { public: LayoutItem_Text(); LayoutItem_Text(const LayoutItem_Text& src); LayoutItem_Text& operator=(const LayoutItem_Text& src); virtual ~LayoutItem_Text(); virtual LayoutItem* clone() const; bool operator==(const LayoutItem_Text& src) const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; /** Get the text that will be shown on each record. */ Glib::ustring get_text(const Glib::ustring& locale) const; /** Set the text that will be shown on each record. */ void set_text(const Glib::ustring& text, const Glib::ustring& locale); /** Set the text's original (non-translated, usually English) text. * This is the same as calling set_text() with an empty locale parameter. */ void set_text_original(const Glib::ustring& text); sharedptr m_text; //Reuse the title concept of this class to give us translatable text. }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_TEXT_H glom-1.22.4/glom/libglom/data_structure/layout/formatting.cc0000644000175000017500000002600412234252646025406 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include const guint MULTILINE_TEXT_DEFAULT_HEIGHT_LINES = 6; //const char* MULTILINE_TEXT_DEFAULT_WIDTH_EXAMPLE = "abcdefghijklmnopqrstuvwxyz" namespace Glom { Formatting::Formatting() : m_choices_restricted(false), m_choices_restricted_as_radio_buttons(false), m_choices_custom(false), m_choices_related(false), m_text_format_multiline(false), m_text_multiline_height_lines(MULTILINE_TEXT_DEFAULT_HEIGHT_LINES), m_horizontal_alignment(HORIZONTAL_ALIGNMENT_AUTO), m_choices_related_show_all(true) //Because this a the simpler, more often useful, default. { } Formatting::Formatting(const Formatting& src) : UsesRelationship(src), m_numeric_format(src.m_numeric_format), m_choices_custom_list(src.m_choices_custom_list), m_choices_restricted(src.m_choices_restricted), m_choices_restricted_as_radio_buttons(src.m_choices_restricted_as_radio_buttons), m_choices_custom(src.m_choices_custom), m_choices_related(src.m_choices_related), m_text_format_multiline(src.m_text_format_multiline), m_text_multiline_height_lines(src.m_text_multiline_height_lines), m_text_font(src.m_text_font), m_text_color_foreground(src.m_text_color_foreground), m_text_color_background(src.m_text_color_background), m_horizontal_alignment(src.m_horizontal_alignment), m_choices_related_field(src.m_choices_related_field), m_choices_extra_layout_group(src.m_choices_extra_layout_group), m_choices_related_sort_fields(src.m_choices_related_sort_fields), m_choices_related_show_all(src.m_choices_related_show_all) { } Formatting::~Formatting() { } bool Formatting::operator==(const Formatting& src) const { return UsesRelationship::operator==(src) && (m_numeric_format == src.m_numeric_format) && (m_choices_custom_list == src.m_choices_custom_list) && (m_choices_restricted == src.m_choices_restricted) && (m_choices_restricted_as_radio_buttons == src.m_choices_restricted_as_radio_buttons) && (m_choices_custom == src.m_choices_custom) && (m_choices_related == src.m_choices_related) && (m_choices_related_field == src.m_choices_related_field) && (m_choices_extra_layout_group == src.m_choices_extra_layout_group) && (m_choices_related_sort_fields == src.m_choices_related_sort_fields) && (m_text_format_multiline == src.m_text_format_multiline) && (m_text_multiline_height_lines == src.m_text_multiline_height_lines) && (m_text_font == src.m_text_font) && (m_text_color_foreground == src.m_text_color_foreground) && (m_text_color_background == src.m_text_color_background) && (m_horizontal_alignment == src.m_horizontal_alignment) && (m_choices_related_show_all == src.m_choices_related_show_all); } Formatting& Formatting::operator=(const Formatting& src) { UsesRelationship::operator=(src); m_numeric_format = src.m_numeric_format; m_choices_custom_list = src.m_choices_custom_list; m_choices_restricted = src.m_choices_restricted; m_choices_restricted_as_radio_buttons = src.m_choices_restricted_as_radio_buttons; m_choices_custom = src.m_choices_custom; m_choices_related = src.m_choices_related; m_choices_related_field = src.m_choices_related_field; m_choices_extra_layout_group = src.m_choices_extra_layout_group; m_choices_related_sort_fields = src.m_choices_related_sort_fields; m_choices_related_show_all = src.m_choices_related_show_all; m_text_format_multiline = src.m_text_format_multiline; m_text_multiline_height_lines = src.m_text_multiline_height_lines; m_text_font = src.m_text_font; m_text_color_foreground = src.m_text_color_foreground; m_text_color_background = src.m_text_color_background; m_horizontal_alignment = src.m_horizontal_alignment; //std::cerr << G_STRFUNC << ": m_choices_related_relationship=" << m_choices_related_relationship << ", src.m_choices_related_relationship=" << src.m_choices_related_relationship << std::endl; return *this; } bool Formatting::get_text_format_multiline() const { return m_text_format_multiline; } void Formatting::set_text_format_multiline(bool value) { m_text_format_multiline = value; } guint Formatting::get_text_format_multiline_height_lines() const { return m_text_multiline_height_lines; } void Formatting::set_text_format_multiline_height_lines(guint value) { //Do not allow inappropriate values. TODO: Respond when they are entered, not later here. if(value < 2) value = MULTILINE_TEXT_DEFAULT_HEIGHT_LINES; m_text_multiline_height_lines = value; } void Formatting::set_text_format_font(const Glib::ustring& font_desc) { m_text_font = font_desc; } Glib::ustring Formatting::get_text_format_font() const { return m_text_font; } void Formatting::set_text_format_color_foreground(const Glib::ustring& color) { m_text_color_foreground = color; } Glib::ustring Formatting::get_text_format_color_foreground() const { return m_text_color_foreground; } Glib::ustring Formatting::get_text_format_color_foreground_to_use(const Gnome::Gda::Value& value) const { if(m_numeric_format.m_alt_foreground_color_for_negatives) { //TODO: Use some other color if the alternative color is too similar to the foreground color. if(Conversions::get_double_for_gda_value_numeric(value) < 0) return NumericFormat::get_alternative_color_for_negatives(); } return m_text_color_foreground; } void Formatting::set_text_format_color_background(const Glib::ustring& color) { m_text_color_background = color; } Glib::ustring Formatting::get_text_format_color_background() const { return m_text_color_background; } void Formatting::set_horizontal_alignment(HorizontalAlignment alignment) { m_horizontal_alignment = alignment; } Formatting::HorizontalAlignment Formatting::get_horizontal_alignment() const { return m_horizontal_alignment; } bool Formatting::get_has_choices() const { return ( m_choices_related && get_has_relationship_name() && m_choices_related_field ) || ( m_choices_custom && !m_choices_custom_list.empty() ); } Formatting::type_list_values Formatting::get_choices_custom() const { return m_choices_custom_list; } void Formatting::set_choices_custom(const type_list_values& choices) { m_choices_custom_list = choices; } Glib::ustring Formatting::get_custom_choice_original_for_translated_text(const Glib::ustring& text, const Glib::ustring& locale) const { for(Formatting::type_list_values::const_iterator iter = m_choices_custom_list.begin(); iter != m_choices_custom_list.end(); ++iter) { const sharedptr value = *iter; if(!value) continue; if(value->get_title(locale) == text) return value->get_title_original(); } return Glib::ustring(); } Glib::ustring Formatting::get_custom_choice_translated(const Glib::ustring& original_text, const Glib::ustring& locale) const { for(Formatting::type_list_values::const_iterator iter = m_choices_custom_list.begin(); iter != m_choices_custom_list.end(); ++iter) { const sharedptr value = *iter; if(!value) continue; if(value->get_title_original() == original_text) return value->get_title(locale); } return Glib::ustring(); } bool Formatting::get_choices_restricted(bool& as_radio_buttons) const { as_radio_buttons = m_choices_restricted_as_radio_buttons; return m_choices_restricted; } void Formatting::set_choices_restricted(bool val, bool as_radio_buttons) { m_choices_restricted = val; m_choices_restricted_as_radio_buttons = as_radio_buttons; } bool Formatting::get_has_custom_choices() const { return m_choices_custom; } void Formatting::set_has_custom_choices(bool val) { m_choices_custom = val; } bool Formatting::get_has_related_choices() const { return m_choices_related; } bool Formatting::get_has_related_choices(bool& show_all, bool& with_second) const { show_all = m_choices_related_show_all; with_second = m_choices_extra_layout_group; return m_choices_related; } void Formatting::set_has_related_choices(bool val) { m_choices_related = val; } void Formatting::set_choices_related(const sharedptr& relationship, const sharedptr& field, const sharedptr& extra_layout, const type_list_sort_fields& sort_fields, bool show_all) { set_relationship(relationship); m_choices_related_field = field; m_choices_extra_layout_group = extra_layout; m_choices_related_sort_fields = sort_fields; m_choices_related_show_all = show_all; } void Formatting::get_choices_related(sharedptr& relationship, sharedptr& field, sharedptr& extra_layout, type_list_sort_fields& sort_fields, bool& show_all) const { relationship = get_relationship(); field = m_choices_related_field; extra_layout = m_choices_extra_layout_group; sort_fields = m_choices_related_sort_fields; show_all = m_choices_related_show_all; } void Formatting::get_choices_related(sharedptr& relationship, sharedptr& field, sharedptr& extra_layout, type_list_sort_fields& sort_fields, bool& show_all) { relationship = get_relationship(); field = m_choices_related_field; extra_layout = m_choices_extra_layout_group; sort_fields = m_choices_related_sort_fields; show_all = m_choices_related_show_all; } sharedptr Formatting::get_choices_related_relationship(bool& show_all) const { show_all = m_choices_related_show_all; return get_relationship(); } bool Formatting::change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name_old, const Glib::ustring& field_name_new) { if(!m_choices_related_field) return false; //Nothing changed. sharedptr relationship = get_relationship(); const Glib::ustring field_table = m_choices_related_field->get_table_used( relationship->get_to_table() ); if((field_table == table_name) && (m_choices_related_field->get_name() == field_name_old)) { //Change it: m_choices_related_field->set_name(field_name_new); return true; //something changed. } if(m_choices_extra_layout_group) { m_choices_extra_layout_group->change_field_item_name(table_name, field_name_old, field_name_new); } return false; //Nothing changed. } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_image.cc0000644000175000017500000000430712234252646026574 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include namespace Glom { LayoutItem_Image::LayoutItem_Image() { m_translatable_item_type = TRANSLATABLE_TYPE_IMAGEOBJECT; } LayoutItem_Image::LayoutItem_Image(const LayoutItem_Image& src) : LayoutItem(src), m_image(src.m_image) { } LayoutItem_Image::~LayoutItem_Image() { } LayoutItem* LayoutItem_Image::clone() const { return new LayoutItem_Image(*this); } bool LayoutItem_Image::operator==(const LayoutItem_Image& src) const { bool result = LayoutItem::operator==(src) && (m_image == src.m_image); return result; } //Avoid using this, for performance: LayoutItem_Image& LayoutItem_Image::operator=(const LayoutItem_Image& src) { LayoutItem::operator=(src); m_image = src.m_image; return *this; } Glib::ustring LayoutItem_Image::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Image"); } Glib::ustring LayoutItem_Image::get_report_part_id() const { return "field"; //We reuse this for this node. } Gnome::Gda::Value LayoutItem_Image::get_image() const { return m_image; } void LayoutItem_Image::set_image(const Gnome::Gda::Value& image) { m_image = image; } Glib::ustring LayoutItem_Image::create_local_image_uri() const { return Utils::create_local_image_uri(m_image); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_button.h0000644000175000017500000000332112234252646026662 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_BUTTON_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_BUTTON_H #include namespace Glom { class LayoutItem_Button : public LayoutItem_WithFormatting { public: LayoutItem_Button(); LayoutItem_Button(const LayoutItem_Button& src); LayoutItem_Button& operator=(const LayoutItem_Button& src); virtual ~LayoutItem_Button(); virtual LayoutItem* clone() const; bool operator==(const LayoutItem_Button& src) const; virtual Glib::ustring get_part_type_name() const; /** Set the python code that will be executed when the button is pressed. */ Glib::ustring get_script() const; bool get_has_script() const; /** Get the python code that will be executed when the button is pressed. */ void set_script(const Glib::ustring& script); private: Glib::ustring m_script; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_BUTTON_H glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_button.cc0000644000175000017500000000404712234252646027026 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { LayoutItem_Button::LayoutItem_Button() { m_translatable_item_type = TRANSLATABLE_TYPE_BUTTON; } LayoutItem_Button::LayoutItem_Button(const LayoutItem_Button& src) : LayoutItem_WithFormatting(src), m_script(src.m_script) { } LayoutItem_Button::~LayoutItem_Button() { } LayoutItem* LayoutItem_Button::clone() const { return new LayoutItem_Button(*this); } bool LayoutItem_Button::operator==(const LayoutItem_Button& src) const { bool result = LayoutItem_WithFormatting::operator==(src) && (m_script == src.m_script); return result; } //Avoid using this, for performance: LayoutItem_Button& LayoutItem_Button::operator=(const LayoutItem_Button& src) { LayoutItem_WithFormatting::operator=(src); m_script = src.m_script; return *this; } Glib::ustring LayoutItem_Button::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Button"); } Glib::ustring LayoutItem_Button::get_script() const { return m_script; } bool LayoutItem_Button::get_has_script() const { return !(m_script.empty()); } void LayoutItem_Button::set_script(const Glib::ustring& script) { m_script = script; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem.h0000644000175000017500000000670612234252646025301 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_H #include #include namespace Glom { class LayoutItem : public TranslatableItem { public: LayoutItem(); LayoutItem(const LayoutItem& src); LayoutItem& operator=(const LayoutItem& src); virtual ~LayoutItem(); /** Create a new copied instance. * This allows us to deep-copy a list of LayoutItems. */ virtual LayoutItem* clone() const = 0; bool operator==(const LayoutItem& src) const; virtual bool get_editable() const; virtual void set_editable(bool val = true); virtual Glib::ustring get_layout_display_name() const; virtual Glib::ustring get_part_type_name() const = 0; /** Gets the node name to use for the intermediate XML, * (and usually, the CSS style class to use for the resulting HTML). */ virtual Glib::ustring get_report_part_id() const; guint get_display_width() const; void set_display_width(guint value); /// This is used only for the print layouts. void get_print_layout_position(double& x, double& y, double& width, double& height) const; /// This is used only for the print layouts. void set_print_layout_position(double x, double y, double width, double height); /// This is used only for the print layouts. void set_print_layout_position_y(double y); //TODO: Do we use this? Do we want to? /// This is used only for the print layouts. void set_print_layout_split_across_pages(bool split = true); /// This is used only for the print layouts. bool get_print_layout_split_across_pages() const; //bool m_hidden; private: Glib::ustring m_name; bool m_editable; guint m_display_width; //In pixels for the list layout, in mm for the print layout. void instantiate_positions() const; // These are used only for the print layouts. // We put them in a separate member class that's only instantiated when necessary, // so that we only waste one pointer instead of several doubles when we don't need them. class PrintLayoutPosition { public: PrintLayoutPosition(); PrintLayoutPosition(const PrintLayoutPosition& src); PrintLayoutPosition& operator=(const PrintLayoutPosition& src); bool operator==(const PrintLayoutPosition& src) const; double m_x; double m_y; double m_width; double m_height; //Whether the item should be split if it is too big for the page, //or if the whole item should instead be moved to the next page. //(A split will happen anyway if it is too big for a whole page): bool m_split_across_pages; }; mutable PrintLayoutPosition* m_positions; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_H glom-1.22.4/glom/libglom/data_structure/layout/custom_title.cc0000644000175000017500000000336712234252646025756 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { CustomTitle::CustomTitle() : m_use_custom_title(false) { m_translatable_item_type = TRANSLATABLE_TYPE_CUSTOM_TITLE; } CustomTitle::CustomTitle(const CustomTitle& src) : TranslatableItem(src), m_use_custom_title(src.m_use_custom_title) { } CustomTitle::~CustomTitle() { } bool CustomTitle::operator==(const CustomTitle& src) const { const bool result = TranslatableItem::operator==(src) && (m_use_custom_title == src.m_use_custom_title); return result; } //Avoid using this, for performance: CustomTitle& CustomTitle::operator=(const CustomTitle& src) { TranslatableItem::operator=(src); m_use_custom_title = src.m_use_custom_title; return *this; } bool CustomTitle::get_use_custom_title() const { return m_use_custom_title; } void CustomTitle::set_use_custom_title(bool use_custom_title) { m_use_custom_title = use_custom_title; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_placeholder.h0000644000175000017500000000301612234252646027632 0ustar00murraycmurrayc00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * glom * Copyright (C) Johannes Schmid 2007 * * glom is free software. * * You may redistribute it and/or modify it under the terms of the * GNU General Public License, as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * glom is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glom. If not, write to: * The Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301, USA. */ #ifndef GLOM_LAYOUTITEM_PLACEHOLDER_H #define GLOM_LAYOUTITEM_PLACEHOLDER_H #include namespace Glom { class LayoutItem_Placeholder: public LayoutItem { public: LayoutItem_Placeholder(); ~LayoutItem_Placeholder(); LayoutItem_Placeholder(const LayoutItem_Placeholder& src); /** Create a new copied instance. * This allows us to deep-copy a list of LayoutItems. */ virtual LayoutItem* clone() const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; bool operator==(const LayoutItem_Placeholder* src) const; }; } #endif // GLOM_LAYOUTITEM_PLACEHOLDER_H glom-1.22.4/glom/libglom/data_structure/layout/usesrelationship.h0000644000175000017500000001142412234252646026477 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUT_USESRELATIONSHIP_H #define GLOM_DATASTRUCTURE_LAYOUT_USESRELATIONSHIP_H #include #include #include namespace Glom { class Field; /* Base class for classes that need to store a relationship name * and a cache of the actual relationship information. */ class UsesRelationship { public: UsesRelationship(); UsesRelationship(const UsesRelationship& src); UsesRelationship& operator=(const UsesRelationship& src); virtual ~UsesRelationship(); bool operator==(const UsesRelationship& src) const; bool get_has_relationship_name() const; bool get_has_related_relationship_name() const; /** Convenience function, equivalent to get_relationship()->get_name(). */ Glib::ustring get_relationship_name() const; /** Convenience function, equivalent to get_relationship()->get_name(). */ Glib::ustring get_related_relationship_name() const; /** Return the relationship used by this item, if any, or a null sharedptr. * See also get_has_relationship_name() which can prevent the need for your * own null sharedptr check. */ sharedptr get_relationship() const; void set_relationship(const sharedptr& relationship); /** Return the related relationship used by this item, if any, or a null sharedptr. * See also get_has_related_relationship_name() which can prevent the need for your * own null sharedptr check. */ sharedptr get_related_relationship() const; void set_related_relationship(const sharedptr& relationship); /** Returns either the @a parent_table, related to table, or doubly-related to-table. */ Glib::ustring get_table_used(const Glib::ustring& parent_table) const; /** Get the title of the relationship that is actually used, * falling back to the relationship's name. * @param parent_table_title The title of table to which the item (or its relatinoships) belong. */ Glib::ustring get_title_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const; /** Get the singular title of the relationship that is actually used, * falling back to the regular (plural) title, and then to the relationship's name. * @param parent_table_title The title of table to which the item (or its relatinoships) belong. */ Glib::ustring get_title_singular_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const; Glib::ustring get_to_field_used() const; /** Get the name of the related relationship used, if any, or the relationship * if there is no related relationship, or an empty string if neither are * used by this item. */ Glib::ustring get_relationship_name_used() const; /** Discover whether the relationship used allows the user to edit values * in its to table. */ bool get_relationship_used_allows_edit() const; /** Get a name to use as an alias in SQL statements. * This will always be the same string for items that have the same definition. */ Glib::ustring get_sql_join_alias_name() const; /** Get the item's alias name, if it uses a relationship, or just get its table name. * @param parent_table The table to which the item (or its relatinoships) belong. */ Glib::ustring get_sql_table_or_join_alias_name(const Glib::ustring& parent_table) const; /** Get a human-readable representation of th relationship. * This just concatenates the chain of relationships, separating them by ":". */ Glib::ustring get_relationship_display_name() const; private: //This is just cached data, so we don't need to always lookup the relationship details from the document, from the name. sharedptr m_relationship; sharedptr m_related_relationship; //Rarely used. It is for showing fields from the (related) relationships of related tables. }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUT_USESRELATIONSHIP_H glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_withformatting.h0000644000175000017500000000402412234252646030416 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2009 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_WITHFORMATTING_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_WITHFORMATTING_H #include "layoutitem.h" #include "formatting.h" namespace Glom { /** A base class for all layout items that may have formatting options. * See get_formatting_used(). */ class LayoutItem_WithFormatting : public LayoutItem { public: LayoutItem_WithFormatting(); LayoutItem_WithFormatting(const LayoutItem_WithFormatting& src); LayoutItem_WithFormatting& operator=(const LayoutItem_WithFormatting& src); virtual ~LayoutItem_WithFormatting(); bool operator==(const LayoutItem_WithFormatting& src) const; Formatting m_formatting; /** Get the field formatting used by this layout item, which * may be either custom field formatting or the default field formatting. */ virtual const Formatting& get_formatting_used() const; /** Get the alignment for the formatting used (see get_formatting_used()), * choosing an appropriate alignment if it is set to HORIZONTAL_ALIGNMENT_AUTO. * Note that this never returns HORIZONTAL_ALIGNMENT_AUTO. */ virtual Formatting::HorizontalAlignment get_formatting_used_horizontal_alignment(bool for_details_view = false) const; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_WITHFORMATTING_H glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_line.cc0000644000175000017500000000672412234252646026446 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include namespace Glom { LayoutItem_Line::LayoutItem_Line() : m_start_x(0), m_start_y(0), m_end_x(0), m_end_y(0), m_line_width(0.5f), //Arbitrary default m_color("black") //Arbitrary default { m_translatable_item_type = TRANSLATABLE_TYPE_INVALID; //There is no text in this to translate. } LayoutItem_Line::LayoutItem_Line(const LayoutItem_Line& src) : LayoutItem(src), m_start_x(src.m_start_x), m_start_y(src.m_start_y), m_end_x(src.m_end_x), m_end_y(src.m_end_y), m_line_width(src.m_line_width), m_color(src.m_color) { } LayoutItem_Line::~LayoutItem_Line() { } LayoutItem* LayoutItem_Line::clone() const { return new LayoutItem_Line(*this); } bool LayoutItem_Line::operator==(const LayoutItem_Line& src) const { bool result = LayoutItem::operator==(src) && (m_start_x == src.m_start_x) && (m_start_y == src.m_start_y) && (m_end_x == src.m_end_x) && (m_end_y == src.m_end_y) && (m_line_width == src.m_line_width) && (m_color == src.m_color); return result; } //Avoid using this, for performance: LayoutItem_Line& LayoutItem_Line::operator=(const LayoutItem_Line& src) { LayoutItem::operator=(src); m_start_x = src.m_start_x; m_start_y = src.m_start_y; m_end_x = src.m_end_x; m_end_y = src.m_end_y; m_line_width = src.m_line_width; m_color = src.m_color; return *this; } Glib::ustring LayoutItem_Line::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). //This is a straight line, not a database row. return _("Line"); } Glib::ustring LayoutItem_Line::get_report_part_id() const { return "line"; //We reuse this for this node. } void LayoutItem_Line::get_coordinates(double& start_x, double& start_y, double& end_x, double& end_y) const { start_x = m_start_x; start_y = m_start_y; end_x = m_end_x; end_y = m_end_y; } void LayoutItem_Line::set_coordinates(double start_x, double start_y, double end_x, double end_y) { m_start_x = start_x; m_start_y = start_y; m_end_x = end_x; m_end_y = end_y; //Set the x,y,height,width too, //for generic code that deals with that API: set_print_layout_position(m_start_x, m_start_y, (m_end_x - m_start_x), (m_end_y - m_start_y)); } double LayoutItem_Line::get_line_width() const { return m_line_width; } void LayoutItem_Line::set_line_width(double line_width) { m_line_width = line_width; } Glib::ustring LayoutItem_Line::get_line_color() const { return m_color; } void LayoutItem_Line::set_line_color(const Glib::ustring& color) { m_color = color; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_withformatting.cc0000644000175000017500000000406712234252646030563 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2009 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "layoutitem_withformatting.h" #include namespace Glom { LayoutItem_WithFormatting::LayoutItem_WithFormatting() { } LayoutItem_WithFormatting::LayoutItem_WithFormatting(const LayoutItem_WithFormatting& src) : LayoutItem(src), m_formatting(src.m_formatting) { } LayoutItem_WithFormatting::~LayoutItem_WithFormatting() { } bool LayoutItem_WithFormatting::operator==(const LayoutItem_WithFormatting& src) const { bool result = LayoutItem::operator==(src) && (m_formatting == src.m_formatting); return result; } //Avoid using this, for performance: LayoutItem_WithFormatting& LayoutItem_WithFormatting::operator=(const LayoutItem_WithFormatting& src) { LayoutItem::operator=(src); m_formatting = src.m_formatting; return *this; } const Formatting& LayoutItem_WithFormatting::get_formatting_used() const { return m_formatting; } Formatting::HorizontalAlignment LayoutItem_WithFormatting::get_formatting_used_horizontal_alignment(bool /* for_details_view */) const { const Formatting& format = get_formatting_used(); Formatting::HorizontalAlignment alignment = format.get_horizontal_alignment(); if(alignment == Formatting::HORIZONTAL_ALIGNMENT_AUTO) alignment = Formatting::HORIZONTAL_ALIGNMENT_LEFT; return alignment; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_portal.cc0000644000175000017500000003521612234776363027025 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include //For the utility functions. #include #include namespace Glom { LayoutItem_Portal::LayoutItem_Portal() : m_print_layout_row_height(20), //arbitrary default. m_print_layout_row_line_width(1), //Sensible default. m_print_layout_column_line_width(1), //Sensible default. m_navigation_type(LayoutItem_Portal::NAVIGATION_AUTOMATIC), m_rows_count_min(6), //Sensible default. m_rows_count_max(6) //Sensible default. { } LayoutItem_Portal::LayoutItem_Portal(const LayoutItem_Portal& src) : LayoutGroup(src), UsesRelationship(src), //HasTitleSingular(src), m_navigation_relationship_specific(src.m_navigation_relationship_specific), m_print_layout_row_height(src.m_print_layout_row_height), m_print_layout_row_line_width(src.m_print_layout_row_line_width), m_print_layout_column_line_width(src.m_print_layout_column_line_width), m_print_layout_line_color(src.m_print_layout_line_color), m_navigation_type(src.m_navigation_type), m_rows_count_min(src.m_rows_count_min), m_rows_count_max(src.m_rows_count_max) { } LayoutItem_Portal::~LayoutItem_Portal() { } LayoutItem* LayoutItem_Portal::clone() const { return new LayoutItem_Portal(*this); } LayoutItem_Portal& LayoutItem_Portal::operator=(const LayoutItem_Portal& src) { LayoutGroup::operator=(src); UsesRelationship::operator=(src); //HasTitleSingular::operator=(src); m_navigation_relationship_specific = src.m_navigation_relationship_specific; m_print_layout_row_height = src.m_print_layout_row_height; m_print_layout_row_line_width = src.m_print_layout_row_line_width; m_print_layout_column_line_width = src.m_print_layout_column_line_width; m_print_layout_line_color = src.m_print_layout_line_color; m_navigation_type = src.m_navigation_type; m_rows_count_min = src.m_rows_count_min; m_rows_count_max = src.m_rows_count_max; return *this; } Glib::ustring LayoutItem_Portal::get_part_type_name() const { //TODO: "Portal" probably shouldn't appear in the UI. //We should use "Related Records instead. //Translators: This is the name of a UI element (a layout part name). //It means a list of related records. return _("Portal"); } void LayoutItem_Portal::change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new) { LayoutGroup::change_related_field_item_name(table_name, field_name, field_name_new); } void LayoutItem_Portal::change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new) { //Look at each item: for(LayoutGroup::type_list_items::iterator iterItem = m_list_items.begin(); iterItem != m_list_items.end(); ++iterItem) { sharedptr item = *iterItem; sharedptr field_item = sharedptr::cast_dynamic(item); if(field_item) { if(field_item->get_table_used(Glib::ustring()) == table_name) //If it's a related table (this would be a self-relationship) { if(field_item->get_name() == field_name) field_item->set_name(field_name_new); //Change it. } else { sharedptr relationship = get_relationship(); if(relationship && (relationship->get_to_table() == table_name) && (field_item->get_name() == field_name)) field_item->set_name(field_name_new); //Change it. } } else { sharedptr sub_group = sharedptr::cast_dynamic(item); if(sub_group) sub_group->change_field_item_name(table_name, field_name, field_name_new); } } } sharedptr LayoutItem_Portal::get_navigation_relationship_specific() { if(get_navigation_type() == LayoutItem_Portal::NAVIGATION_SPECIFIC) return m_navigation_relationship_specific; else return sharedptr(); } sharedptr LayoutItem_Portal::get_navigation_relationship_specific() const { if(get_navigation_type() == LayoutItem_Portal::NAVIGATION_SPECIFIC) return m_navigation_relationship_specific; else return sharedptr(); } void LayoutItem_Portal::set_navigation_relationship_specific(const sharedptr& relationship) { m_navigation_relationship_specific = relationship; m_navigation_type = LayoutItem_Portal::NAVIGATION_SPECIFIC; } void LayoutItem_Portal::reset_navigation_relationship() { m_navigation_relationship_specific = sharedptr(); m_navigation_type = LayoutItem_Portal::NAVIGATION_AUTOMATIC; } Glib::ustring LayoutItem_Portal::get_from_table() const { Glib::ustring from_table; sharedptr relationship = get_relationship(); if(relationship) from_table = relationship->get_from_table(); return from_table; } double LayoutItem_Portal::get_print_layout_row_height() const { return m_print_layout_row_height; } void LayoutItem_Portal::set_print_layout_row_height(double row_height) { m_print_layout_row_height = row_height; } LayoutItem_Portal::navigation_type LayoutItem_Portal::get_navigation_type() const { return m_navigation_type; } void LayoutItem_Portal::set_navigation_type(LayoutItem_Portal::navigation_type type) { m_navigation_type = type; } void LayoutItem_Portal::get_rows_count(gulong& rows_count_min, gulong& rows_count_max) const { rows_count_min = m_rows_count_min; rows_count_max = m_rows_count_max; } void LayoutItem_Portal::set_rows_count(gulong rows_count_min, gulong rows_count_max) { m_rows_count_min = rows_count_min; m_rows_count_max = rows_count_max; //Keep the values sane: if(m_rows_count_max < m_rows_count_min) m_rows_count_max = m_rows_count_min; } double LayoutItem_Portal::get_print_layout_row_line_width() const { return m_print_layout_row_line_width; } void LayoutItem_Portal::set_print_layout_row_line_width(double width) { m_print_layout_row_line_width = width; } double LayoutItem_Portal::get_print_layout_column_line_width() const { return m_print_layout_column_line_width; } void LayoutItem_Portal::set_print_layout_column_line_width(double width) { m_print_layout_column_line_width = width; } Glib::ustring LayoutItem_Portal::get_print_layout_line_color() const { return m_print_layout_line_color; } void LayoutItem_Portal::set_print_layout_line_color(const Glib::ustring& color) { m_print_layout_line_color = color; } void LayoutItem_Portal::get_suitable_table_to_view_details(Glib::ustring& table_name, sharedptr& relationship, const Document* document) const { //Initialize output parameters: table_name = Glib::ustring(); sharedptr navigation_relationship; //Check whether a relationship was specified: if(get_navigation_type() == LayoutItem_Portal::NAVIGATION_AUTOMATIC) { //std::cout << "debug: decide automatically." << std::endl; //Decide automatically: navigation_relationship = get_portal_navigation_relationship_automatic(document); //if(navigation_relationship && navigation_relationship->get_relationship()) // std::cout << " navigation_relationship->get_relationship()=" << navigation_relationship->get_relationship()->get_name() << std::endl; //if(navigation_relationship && navigation_relationship->get_related_relationship()) // std::cout << " navigation_relationship->get_related_relationship()=" << navigation_relationship->get_related_relationship()->get_name() << std::endl; } else { navigation_relationship = get_navigation_relationship_specific(); //std::cout << "debug: " << G_STRFUNC << ": Using specific nav." << std::endl; } //Get the navigation table name from the chosen relationship: const Glib::ustring directly_related_table_name = get_table_used(Glib::ustring() /* not relevant */); // The navigation_table_name (and therefore, the table_name output parameter, // as well) stays empty if the navrel type was set to none. Glib::ustring navigation_table_name; if(navigation_relationship) { navigation_table_name = navigation_relationship->get_table_used(directly_related_table_name); } else if(get_navigation_type() != LayoutItem_Portal::NAVIGATION_NONE) { //An empty result from get_portal_navigation_relationship_automatic() or //get_navigation_relationship_specific() means we should use the directly related table: navigation_table_name = directly_related_table_name; } if(navigation_table_name.empty()) { //std::cerr << G_STRFUNC << ": navigation_table_name is empty." << std::endl; return; } if(!document) { std::cerr << G_STRFUNC << ": document is null" << std::endl; return; } if(document->get_table_is_hidden(navigation_table_name)) { std::cerr << G_STRFUNC << ": navigation_table_name indicates a hidden table: " << navigation_table_name << std::endl; return; } table_name = navigation_table_name; relationship = navigation_relationship; } sharedptr LayoutItem_Portal::get_portal_navigation_relationship_automatic(const Document* document) const { if(!document) { std::cerr << G_STRFUNC << ": document was null" << std::endl; return sharedptr(); } //If the related table is not hidden then we can just navigate to that: const Glib::ustring direct_related_table_name = get_table_used(Glib::ustring() /* parent table - not relevant */); if(!(document->get_table_is_hidden(direct_related_table_name))) { //Non-hidden tables can just be shown directly. Navigate to it: return sharedptr(); } else { //If the related table is hidden, //then find a suitable related non-hidden table by finding the first layout field that mentions one: sharedptr field = get_field_is_from_non_hidden_related_record(document); if(field) { return field; //Returns the UsesRelationship base part. (A relationship belonging to the portal's related table.) //sharedptr result = sharedptr::create(); //result->set_relationship( get_relationship() ); //result->set_related_relationship( field->get_relationship() ); //return result; } else { //Instead, find a key field that's used in a relationship, //and pretend that we are showing the to field as a related field: sharedptr used_in_relationship; sharedptr field_identifies = get_field_identifies_non_hidden_related_record(used_in_relationship, document); if(field_identifies) { sharedptr result = sharedptr::create(); sharedptr rel_nonconst = sharedptr::cast_const(used_in_relationship); result->set_relationship(rel_nonconst); return result; } } } //There was no suitable related table to show: return sharedptr(); } sharedptr LayoutItem_Portal::get_field_is_from_non_hidden_related_record(const Document* document) const { //Find the first field that is from a non-hidden related table. sharedptr result; if(!document) { std::cerr << G_STRFUNC << ": document is null" << std::endl; return result; } const Glib::ustring parent_table_name = get_table_used(Glib::ustring() /* parent table - not relevant */); LayoutItem_Portal::type_list_const_items items = get_items(); for(LayoutItem_Portal::type_list_const_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr field = sharedptr::cast_dynamic(*iter); if(field) { if(field->get_has_relationship_name()) { const Glib::ustring table_name = field->get_table_used(parent_table_name); if(!(document->get_table_is_hidden(table_name))) return field; } } } return result; } sharedptr LayoutItem_Portal::get_field_identifies_non_hidden_related_record(sharedptr& used_in_relationship, const Document* document) const { //Find the first field that is from a non-hidden related table. sharedptr result; if(!document) { std::cerr << G_STRFUNC << ": document is null" << std::endl; return result; } const Glib::ustring parent_table_name = get_table_used(Glib::ustring() /* parent table - not relevant */); LayoutItem_Portal::type_list_const_items items = get_items(); for(LayoutItem_Portal::type_list_const_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { sharedptr field = sharedptr::cast_dynamic(*iter); if(field && !(field->get_has_relationship_name())) { sharedptr relationship = document->get_field_used_in_relationship_to_one(parent_table_name, field); if(relationship) { const Glib::ustring table_name = relationship->get_to_table(); if(!(table_name.empty())) { if(!(document->get_table_is_hidden(table_name))) { used_in_relationship = relationship; return field; } } } } } return result; } Glib::ustring LayoutItem_Portal::get_title_or_name(const Glib::ustring& locale) const { Glib::ustring title = get_title_used(Glib::ustring() /* parent table - not relevant */, locale); if(title.empty()) title = get_relationship_name_used(); if(title.empty()) //TODO: This prevents "" as a real title. title = _("Undefined Table"); return title; } Glib::ustring LayoutItem_Portal::get_title(const Glib::ustring& locale) const { Glib::ustring title = get_title_used(Glib::ustring() /* parent table - not relevant */, locale); if(title.empty()) //TODO: This prevents "" as a real title. title = _("Undefined Table"); return title; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_calendarportal.h0000644000175000017500000000360212234252646030344 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_CALENDAR_PORTAL_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_CALENDAR_PORTAL_H #include namespace Glom { class LayoutItem_CalendarPortal : public LayoutItem_Portal { public: LayoutItem_CalendarPortal(); LayoutItem_CalendarPortal(const LayoutItem_CalendarPortal& src); LayoutItem_CalendarPortal& operator=(const LayoutItem_CalendarPortal& src); virtual ~LayoutItem_CalendarPortal(); virtual LayoutItem* clone() const; virtual Glib::ustring get_part_type_name() const; sharedptr get_date_field(); sharedptr get_date_field() const; void set_date_field(const sharedptr& field); virtual void change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new); virtual void change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new); private: sharedptr m_date_field; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_CALENDAR_PORTAL_H glom-1.22.4/glom/libglom/data_structure/layout/formatting.h0000644000175000017500000002001012234252646025237 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_FIELDFORMATTING_H #define GLOM_DATASTRUCTURE_FIELDFORMATTING_H #include #include #include #include #include #include namespace Glom { class LayoutItem_Field; class LayoutGroup; /** This specifies how to display data for fields or static text items. */ class Formatting : public UsesRelationship //The UsesRelationship base has the relationship for the choices. { public: Formatting(); Formatting(const Formatting& src); Formatting& operator=(const Formatting& src); virtual ~Formatting(); bool operator==(const Formatting& src) const; bool get_has_choices() const; bool get_has_related_choices() const; bool get_has_related_choices(bool& show_all, bool& with_second) const; void set_has_related_choices(bool val = true); bool get_has_custom_choices() const; void set_has_custom_choices(bool val = true); typedef std::vector< sharedptr > type_list_values; virtual type_list_values get_choices_custom() const; virtual void set_choices_custom(const type_list_values& choices); /** Get the original text that corresponds to the translated choice for the * current locale. */ Glib::ustring get_custom_choice_original_for_translated_text(const Glib::ustring& text, const Glib::ustring& locale = Glib::ustring()) const; /** Get the translated choice text, for the * current locale, that corresponds to the original text . */ Glib::ustring get_custom_choice_translated(const Glib::ustring& original_text, const Glib::ustring& locale = Glib::ustring()) const; typedef std::pair< sharedptr, bool /* is_ascending */> type_pair_sort_field; typedef std::vector type_list_sort_fields; /** Discover whether the entered data should only be one of the available * choices. * @param [out] as_radio_buttons: Whether the choices should be displayed as * radio buttons instead of a combo box. */ bool get_choices_restricted(bool& as_radio_buttons) const; /** See get_choices_restricted(). */ void set_choices_restricted(bool val = true, bool as_radio_buttons = false); //TODO: Add a ChoicesRelated class? void get_choices_related(sharedptr& relationship, sharedptr& field, sharedptr& extra_layout, type_list_sort_fields& sort_fields, bool& show_all); void get_choices_related(sharedptr& relationship, sharedptr& field, sharedptr& extra_layout, type_list_sort_fields& sort_fields, bool& show_all) const; void set_choices_related(const sharedptr& relationship_name, const sharedptr& field, const sharedptr& extra_layout, const type_list_sort_fields& sort_fields, bool show_all); //Just for convenience: sharedptr get_choices_related_relationship(bool& show_all) const; /** Get whether the text should be displayed with multiple lines in the * details view. Text is displayed with a single line in the list view. * @returns whether the text should be displayed with multiple lines */ bool get_text_format_multiline() const; /** Set whether the text should be displayed with multiple lines in the * details view. Text is displayed with a single line in the list view. * @param[in] value whether the text should be displayed with multiple lines */ void set_text_format_multiline(bool value = true); /** Get the number of lines of text that should be displayed. * @see get_text_format_multiline() * @returns the number of lines of text */ guint get_text_format_multiline_height_lines() const; /** Get the number of lines of text that should be displayed. * @returns the number of lines of text */ void set_text_format_multiline_height_lines(guint value); /** Set the font description, as returned from * Gtk::FontButton::get_font_name(), which may include the size and style. * @param font_desc a Pango font description string */ void set_text_format_font(const Glib::ustring& font_desc); /** Get the font description, as returned from * Gtk::FontButton::get_font_name(), which may include the size and style. * @returns a Pango font description string */ Glib::ustring get_text_format_font() const; /** Set the foreground color to use for text when displaying a field value. * @param[in] color the text foreground color, in a format recognised by * XParseColor */ void set_text_format_color_foreground(const Glib::ustring& color); /** Get the foreground color to use for text for the specified value, * taking the negative-color into account, if specified. * @returns the text foreground color, in a format recognised by XParseColor */ Glib::ustring get_text_format_color_foreground_to_use(const Gnome::Gda::Value& value) const; /** Get the foreground color to use for text when displaying a field value. * This should be overriden by * m_numeric_formatting.m_foreground_color_for_negatives if that is active. * @returns the text foreground color, in a format recognised by XParseColor */ Glib::ustring get_text_format_color_foreground() const; /** Set the background color to use for text when displaying a field value. * @param[in] color a text background color, in a format recognised by * XParseColor */ void set_text_format_color_background(const Glib::ustring& color); /** Get the background color to use for text when displaying a field value. * @returns the text background color, in a format recognised by XParseColor */ Glib::ustring get_text_format_color_background() const; enum HorizontalAlignment { HORIZONTAL_ALIGNMENT_AUTO, //For instance, RIGHT for numeric fields. HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_RIGHT }; void set_horizontal_alignment(HorizontalAlignment alignment); HorizontalAlignment get_horizontal_alignment() const; NumericFormat m_numeric_format; //Only used for numeric fields. /** Adapt to a change of field name, * so this Formatting does not refer to any field that no longer exists. * * @result true if something was changed. */ bool change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name_old, const Glib::ustring& field_name_new); private: type_list_values m_choices_custom_list; //A drop-down list of possible values for the field. bool m_choices_restricted; bool m_choices_restricted_as_radio_buttons; bool m_choices_custom, m_choices_related; bool m_text_format_multiline; guint m_text_multiline_height_lines; //The height in number of lines of text. //Glib::ustring m_text_multiline_width_example; //An example string from which to calculate the width. Glib::ustring m_text_font; Glib::ustring m_text_color_foreground, m_text_color_background; HorizontalAlignment m_horizontal_alignment; sharedptr m_choices_related_field; sharedptr m_choices_extra_layout_group; type_list_sort_fields m_choices_related_sort_fields; bool m_choices_related_show_all; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_FIELDFORMATTING_H glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_field.h0000644000175000017500000001526012234252646026437 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_FIELD_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_FIELD_H #include #include #include #include #include #include namespace Glom { /** A predicate for use with std::find_if() to find a LayoutItem_Field which refers * to the same field, without comparing irrelevant stuff such as formatting. */ template class predicate_LayoutItem_Field_IsSameField { public: predicate_LayoutItem_Field_IsSameField(const sharedptr& layout_item) { m_layout_item = layout_item; } bool operator() (const sharedptr& element) { if(!m_layout_item && !element) return true; //Allow this to be used on a container of LayoutItems, //as well as just of LayoutItem_Fields. sharedptr element_field = sharedptr::cast_dynamic(element); if(!element_field) return false; return m_layout_item && m_layout_item->is_same_field(element_field); } private: sharedptr m_layout_item; }; /** A LayoutItem that shows the data from a table field. * The field may be in a known table, or in a to table of a relationship * or related relatinoship. See UsesRelationship::get_relationship() and * UsesRelationship::get_related_relationship() in the base class. * * get_title() returns either the title of the Field or the CustomTitle. * You should not call get/set_title_original() or get/set_title_translation() * on items of this type. */ class LayoutItem_Field : public LayoutItem_WithFormatting, public UsesRelationship { public: LayoutItem_Field(); LayoutItem_Field(const LayoutItem_Field& src); LayoutItem_Field& operator=(const LayoutItem_Field& src); virtual ~LayoutItem_Field(); virtual LayoutItem* clone() const; bool operator==(const LayoutItem_Field& src) const; /** Set the non-user-visible name of the field. */ virtual void set_name(const Glib::ustring& name); /** Get the non-user-visible name of the field. */ virtual Glib::ustring get_name() const; //For use with our std::find_if() predicate. /** Get the user-visible title for the field, in the user's current locale. * This returns the name if no title is set. */ virtual Glib::ustring get_title(const Glib::ustring& locale) const; /** Get the user-visible title for the field, in the user's current locale. */ virtual Glib::ustring get_title_or_name(const Glib::ustring& locale) const; Glib::ustring get_title_or_name_no_custom(const Glib::ustring& locale) const; sharedptr get_title_custom() const; sharedptr get_title_custom(); void set_title_custom(const sharedptr& title); //virtual Glib::ustring get_table_name() const; //virtual void set_table_name(const Glib::ustring& table_name); /** Get a text representation for the field, such as Relationship::FieldName. */ virtual Glib::ustring get_layout_display_name() const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; void set_full_field_details(const sharedptr& field); sharedptr get_full_field_details() const; ///Convenience function, to avoid use of get_full_field_details(). Field::glom_field_type get_glom_type() const; //TODO: This might occasionally be different on different layouts: Glib::ustring m_title; bool get_editable_and_allowed() const; /// For extra fields, needed for SQL queries. The user should never be able to make an item hidden - he can just remove it. bool get_hidden() const; void set_hidden(bool val = true); //Not saved to the document: bool m_priv_view; bool m_priv_edit; /** Discover whether to use the default formatting for this field, * instead of some custom per-layout-item field formatting. */ bool get_formatting_use_default() const; /** Specify whether to use the default formatting for this field, * instead of some custom per-layout-item field formatting. */ void set_formatting_use_default(bool use_default = true); /** Get the field formatting used by this layout item, which * may be either custom field formatting or the default field formatting. */ virtual const Formatting& get_formatting_used() const; /** Get the alignment for the formatting used (see get_formatting_used()), * choosing an appropriate alignment if it is set to HORIZONTAL_ALIGNMENT_AUTO. * Note that this never returns HORIZONTAL_ALIGNMENT_AUTO. * * @param for_details_view This can change the effect of HORIZONTAL_ALIGNMENT_AUTO. */ virtual Formatting::HorizontalAlignment get_formatting_used_horizontal_alignment(bool for_details_view = false) const; /** A convenience method to discover whether the formatting that is used * has custom choices with the values restricted to those choices, * meaning that those choices could be translated. */ bool get_formatting_used_has_translatable_choices() const; /** Compare the name, relationship, and related_relationship. */ bool is_same_field(const sharedptr& field) const; private: Glib::ustring get_title_no_custom(const Glib::ustring& locale) const; Glib::ustring get_title_no_custom_translation(const Glib::ustring& locale, bool fallback = true) const; //This is just a cache, filled in by looking at the database structure: sharedptr m_field; bool m_field_cache_valid; //Whetehr m_field is up-to-date. bool m_hidden; bool m_formatting_use_default; sharedptr m_title_custom; //translatable. }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_FIELD_H glom-1.22.4/glom/libglom/data_structure/layout/custom_title.h0000644000175000017500000000272312234252646025613 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUT_CUSTOM_TITLE_H #define GLOM_DATASTRUCTURE_LAYOUT_CUSTOM_TITLE_H #include namespace Glom { class CustomTitle : public TranslatableItem { public: CustomTitle(); CustomTitle(const CustomTitle& src); CustomTitle& operator=(const CustomTitle& src); virtual ~CustomTitle(); bool operator==(const CustomTitle& src) const; bool get_use_custom_title() const; void set_use_custom_title(bool use_custom_title = true); private: //We need this in order to specify that an empty custom title should really be used. bool m_use_custom_title; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUT_CUSTOM_TITLE_H glom-1.22.4/glom/libglom/data_structure/layout/usesrelationship.cc0000644000175000017500000001435612234252646026644 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { UsesRelationship::UsesRelationship() { } UsesRelationship::UsesRelationship(const UsesRelationship& src) : m_relationship(src.m_relationship), m_related_relationship(src.m_related_relationship) { } UsesRelationship::~UsesRelationship() { } bool UsesRelationship::operator==(const UsesRelationship& src) const { return (m_relationship == src.m_relationship) && (m_related_relationship == src.m_related_relationship); } UsesRelationship& UsesRelationship::operator=(const UsesRelationship& src) { m_relationship = src.m_relationship; m_related_relationship = src.m_related_relationship; return *this; } bool UsesRelationship::get_has_relationship_name() const { if(!m_relationship) return false; else return !(m_relationship->get_name().empty()); } bool UsesRelationship::get_has_related_relationship_name() const { if(!m_related_relationship) return false; else return !(m_related_relationship->get_name().empty()); } Glib::ustring UsesRelationship::get_relationship_name() const { if(m_relationship) return m_relationship->get_name(); else return Glib::ustring(); } Glib::ustring UsesRelationship::get_related_relationship_name() const { if(m_related_relationship) return m_related_relationship->get_name(); else return Glib::ustring(); } sharedptr UsesRelationship::get_relationship() const { return m_relationship; } void UsesRelationship::set_relationship(const sharedptr& relationship) { m_relationship = relationship; } sharedptr UsesRelationship::get_related_relationship() const { return m_related_relationship; } void UsesRelationship::set_related_relationship(const sharedptr& relationship) { m_related_relationship = relationship; } Glib::ustring UsesRelationship::get_sql_table_or_join_alias_name(const Glib::ustring& parent_table) const { if(get_has_relationship_name() || get_has_related_relationship_name()) { const Glib::ustring result = get_sql_join_alias_name(); if(result.empty()) { //Non-linked-fields relationship: return get_table_used(parent_table); } else return result; } else return parent_table; } Glib::ustring UsesRelationship::get_table_used(const Glib::ustring& parent_table) const { //std::cout << "debug: " << G_STRFUNC << ": relationship=" << glom_get_sharedptr_name(m_relationship) << "related_relationship=" << glom_get_sharedptr_name(m_related_relationship) << std::endl; if(m_related_relationship) return m_related_relationship->get_to_table(); else if(m_relationship) return m_relationship->get_to_table(); else return parent_table; } Glib::ustring UsesRelationship::get_title_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const { if(m_related_relationship) return m_related_relationship->get_title_or_name(locale); else if(m_relationship) return m_relationship->get_title_or_name(locale); else return parent_table_title; } Glib::ustring UsesRelationship::get_title_singular_used(const Glib::ustring& parent_table_title, const Glib::ustring& locale) const { sharedptr used = m_related_relationship; if(!used) used = m_relationship; if(!used) return Glib::ustring(); const Glib::ustring result = used->get_title_singular(locale); if(!result.empty()) return result; else return get_title_used(parent_table_title, locale); } Glib::ustring UsesRelationship::get_to_field_used() const { if(m_related_relationship) return m_related_relationship->get_to_field(); else if(m_relationship) return m_relationship->get_to_field(); else return Glib::ustring(); } Glib::ustring UsesRelationship::get_relationship_name_used() const { if(m_related_relationship) return m_related_relationship->get_name(); else if(m_relationship) return m_relationship->get_name(); else return Glib::ustring(); } bool UsesRelationship::get_relationship_used_allows_edit() const { if(m_related_relationship) return m_related_relationship->get_allow_edit(); else if(m_relationship) return m_relationship->get_allow_edit(); else return false; /* Arbitrary default. */ } Glib::ustring UsesRelationship::get_sql_join_alias_name() const { Glib::ustring result; if(get_has_relationship_name() && m_relationship->get_has_fields()) //relationships that link to tables together via a field { //We use relationship_name.field_name instead of related_table_name.field_name, //because, in the JOIN below, will specify the relationship_name as an alias for the related table name result += ("relationship_" + m_relationship->get_name()); /* const Glib::ustring field_table_name = relationship->get_to_table(); if(field_table_name.empty()) { std::cerr << G_STRFUNC << ": field_table_name is null. relationship name = " << relationship->get_name() << std::endl; } */ if(get_has_related_relationship_name() && m_related_relationship->get_has_fields()) { result += ('_' + m_related_relationship->get_name()); } } return result; } Glib::ustring UsesRelationship::get_relationship_display_name() const { Glib::ustring result; if(get_has_relationship_name()) result = get_relationship_name(); if(get_has_related_relationship_name()) result += ("::" + get_related_relationship_name()); return result; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem.cc0000644000175000017500000001172212234252646025431 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { LayoutItem::PrintLayoutPosition::PrintLayoutPosition() : m_x(0), m_y(0), m_width(0), m_height(0), m_split_across_pages(false) { } LayoutItem::PrintLayoutPosition::PrintLayoutPosition(const LayoutItem::PrintLayoutPosition& src) : m_x(src.m_x), m_y(src.m_y), m_width(src.m_width), m_height(src.m_height), m_split_across_pages(src.m_split_across_pages) { } LayoutItem::PrintLayoutPosition& LayoutItem::PrintLayoutPosition::operator=(const LayoutItem::PrintLayoutPosition& src) { m_x = src.m_x; m_y = src.m_y; m_width = src.m_width; m_height = src.m_height; m_split_across_pages = src.m_split_across_pages; return *this; } bool LayoutItem::PrintLayoutPosition::operator==(const LayoutItem::PrintLayoutPosition& src) const { return (m_x == src.m_x) && (m_y == src.m_y) && (m_width == src.m_width) && (m_height == src.m_height) && (m_split_across_pages == src.m_split_across_pages); } LayoutItem::LayoutItem() : m_editable(true), m_display_width(0), m_positions(0) { m_translatable_item_type = TRANSLATABLE_TYPE_LAYOUT_ITEM; } LayoutItem::LayoutItem(const LayoutItem& src) : TranslatableItem(src), m_editable(src.m_editable), m_display_width(src.m_display_width), m_positions(0) { if(src.m_positions) m_positions = new PrintLayoutPosition(*(src.m_positions)); } LayoutItem::~LayoutItem() { } LayoutItem& LayoutItem::operator=(const LayoutItem& src) { if(this == &src) return *this; TranslatableItem::operator=(src); m_editable = src.m_editable; m_display_width = src.m_display_width; delete m_positions; m_positions = 0; if(src.m_positions) m_positions = new PrintLayoutPosition(*(src.m_positions)); return *this; } //Is this used? bool LayoutItem::operator==(const LayoutItem& src) const { bool equal = (TranslatableItem::operator==(src)) && (m_editable == src.m_editable) && (m_display_width == src.m_display_width); if(m_positions && src.m_positions) { //compare them: equal = equal && (*m_positions == *(src.m_positions)); } else if(!m_positions && !m_positions) { //no change. } else { equal = false; } return equal; } bool LayoutItem::get_editable() const { return m_editable; } void LayoutItem::set_editable(bool val) { m_editable = val; } Glib::ustring LayoutItem::get_layout_display_name() const { return Glib::ustring(); } Glib::ustring LayoutItem::get_report_part_id() const { return "unexpected_report_part_id"; //This should never be used. } guint LayoutItem::get_display_width() const { return m_display_width; } void LayoutItem::set_display_width(guint value) { m_display_width = value; } void LayoutItem::instantiate_positions() const { if(!m_positions) m_positions = new PrintLayoutPosition(); } void LayoutItem::get_print_layout_position(double& x, double& y, double& width, double& height) const { if(!m_positions) { x = 0; y = 0; width = 0; height = 0; } else { x = m_positions->m_x; y = m_positions->m_y; width = m_positions->m_width; height = m_positions->m_height; } } void LayoutItem::set_print_layout_position(double x, double y, double width, double height) { if(!m_positions && (x == 0) && (y == 0) && (width == 0) && (height == 0)) return; //Don't bother instantiating the positions instance if everything is still 0. instantiate_positions(); m_positions->m_x = x; m_positions->m_y = y; m_positions->m_width = width; m_positions->m_height = height; } void LayoutItem::set_print_layout_position_y(double y) { if(!m_positions && (y == 0)) return; //Don't bother instantiating the positions instance if everything is still 0. instantiate_positions(); m_positions->m_y = y; } void LayoutItem::set_print_layout_split_across_pages(bool split) { if(!m_positions && !split) return; //Don't bother instantiating the positions instance if everything is still 0. instantiate_positions(); m_positions->m_split_across_pages = split; } bool LayoutItem::get_print_layout_split_across_pages() const { if(!m_positions) return false; else return m_positions->m_split_across_pages; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutgroup.h0000644000175000017500000001102512234252646025465 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTGROUP_H #define GLOM_DATASTRUCTURE_LAYOUTGROUP_H #include #include namespace Glom { class LayoutItem_Field; class LayoutGroup : public LayoutItem { public: LayoutGroup(); LayoutGroup(const LayoutGroup& src); LayoutGroup& operator=(const LayoutGroup& src); virtual ~LayoutGroup(); virtual LayoutItem* clone() const; /** Discover whether the layout group contains the specified field (from the current table). * @param parent_table_name The table to which this layout belongs. * @param table_name The table to which the field, specified by @a field_name, belongs. * @param field_name The name of the field to search for. * @result True if the field is in the layout group (or its child groups). */ bool has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const; /** Discover whether the layout group contains any fields. * @result True if the field is in the layout group (or its child groups). */ bool has_any_fields() const; /** Add the item to the end of the list. * @param item The item to add. */ void add_item(const sharedptr& item); /** Add the item after the specified existing item. * @param item The item to add. * @param position The item after which the item should be added. */ void add_item(const sharedptr& item, const sharedptr& position); /** Remove a layout item from the group * @param item The item to remove. */ void remove_item(const sharedptr& item); /** Remove any instance of the field from the layout. * * @param parent_table_name The table to which this layout belongs. * @param table_name The table to which the field, specified by @a field_name, belongs. * @param field_name The name of the field to remove. */ void remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name); //These are virtual so that the portal item can do more. virtual void change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new); virtual void change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new); /** Remove any use of the relationship from the layout. */ virtual void remove_relationship(const sharedptr& relationship); void remove_all_items(); double get_border_width() const; void set_border_width(double border_width); //virtual void debug(guint level = 0) const; guint get_items_count() const; guint get_columns_count() const; void set_columns_count(guint columns_count); typedef std::vector< sharedptr > type_list_items; type_list_items get_items(); typedef std::vector< sharedptr > type_list_const_items; type_list_const_items get_items() const; /** Get the items recursively, depth-first, not returning any groups. */ type_list_const_items get_items_recursive() const; /** Get the items recursively, depth-first, not returning any groups. */ type_list_items get_items_recursive(); /** Get the items recursively, depth-first, also returning the groups. * This is only used by the tests so far. */ type_list_const_items get_items_recursive_with_groups() const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; //Allow more efficient access: protected: type_list_items m_list_items; private: guint m_columns_count; double m_border_width; //For use on reports. }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTGROUP_H glom-1.22.4/glom/libglom/data_structure/layout/layoutgroup.cc0000644000175000017500000003300412234252646025624 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include namespace Glom { LayoutGroup::LayoutGroup() : m_columns_count(1), //A sensible default m_border_width(0) { } LayoutGroup::LayoutGroup(const LayoutGroup& src) : LayoutItem(src), m_columns_count(src.m_columns_count), m_border_width(src.m_border_width) { //Deep copy of the items map: for(type_list_items::const_iterator iter = src.m_list_items.begin(); iter != src.m_list_items.end(); ++iter) { if(*iter) m_list_items.push_back( glom_sharedptr_clone(*iter) ); } } LayoutGroup::~LayoutGroup() { remove_all_items(); } void LayoutGroup::remove_all_items() { //Delete the items: m_list_items.clear(); } LayoutItem* LayoutGroup::clone() const { return new LayoutGroup(*this); } LayoutGroup& LayoutGroup::operator=(const LayoutGroup& src) { if(this != &src) { LayoutItem::operator=(src); m_columns_count = src.m_columns_count; m_border_width = src.m_border_width; //Deep copy of the items map: remove_all_items(); for(type_list_items::const_iterator iter = src.m_list_items.begin(); iter != src.m_list_items.end(); ++iter) { if(*iter) m_list_items.push_back( glom_sharedptr_clone(*iter) ); } } return *this; } bool LayoutGroup::has_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) const { for(type_list_items::const_iterator iter = m_list_items.begin(); iter != m_list_items.end(); ++iter) { sharedptr item = *iter; sharedptr field_item = sharedptr::cast_dynamic(item); if(field_item) { if( (field_item->get_name() == field_name) && (field_item->get_table_used(parent_table_name) == table_name)) { return true; } } else { //Recurse into the child groups: sharedptr group_item = sharedptr::cast_dynamic(item); if(group_item) { if(group_item->has_field(parent_table_name, table_name, field_name)) return true; } } } return false; } bool LayoutGroup::has_any_fields() const { for(type_list_items::const_iterator iter = m_list_items.begin(); iter != m_list_items.end(); ++iter) { sharedptr item = *iter; sharedptr field_item = sharedptr::cast_dynamic(item); if(field_item) { return true; } else { //Recurse into the child groups: sharedptr group_item = sharedptr::cast_dynamic(item); if(group_item) { if(group_item->has_any_fields()) return true; } } } return false; } void LayoutGroup::add_item(const sharedptr& item) { m_list_items.push_back(item); } void LayoutGroup::add_item(const sharedptr& item, const sharedptr& position) { //Find the position of the item. sharedptr unconst = sharedptr::cast_const(position); type_list_items::iterator iter = std::find(m_list_items.begin(), m_list_items.end(), unconst); //std::vector::insert() adds before rather than after: // jhs: We want to add after rather than before - at least for dnd //++iter; m_list_items.insert(iter, item); } void LayoutGroup::remove_item (const sharedptr& item) { sharedptr unconst = sharedptr::cast_const(item); type_list_items::iterator iter = std::find(m_list_items.begin(), m_list_items.end(), unconst); m_list_items.erase(iter); } LayoutGroup::type_list_items LayoutGroup::get_items() { return m_list_items; } LayoutGroup::type_list_const_items LayoutGroup::get_items() const { //Get a const map from the non-const map: //TODO_Performance: Surely we should not need to copy the structure just to constize it? type_list_const_items result; for(type_list_items::const_iterator iter = m_list_items.begin(); iter != m_list_items.end(); ++iter) { result.push_back(*iter); } return result; } LayoutGroup::type_list_const_items LayoutGroup::get_items_recursive() const { type_list_const_items result; for(type_list_items::const_iterator iter = m_list_items.begin(); iter != m_list_items.end(); ++iter) { const sharedptr item = *iter; sharedptr group = sharedptr::cast_dynamic(item); if(group) { const type_list_const_items sub_result = group->get_items_recursive(); result.insert(result.end(), sub_result.begin(), sub_result.end()); } else result.push_back(item); } return result; } LayoutGroup::type_list_items LayoutGroup::get_items_recursive() { type_list_items result; for(type_list_items::const_iterator iter = m_list_items.begin(); iter != m_list_items.end(); ++iter) { const sharedptr item = *iter; sharedptr group = sharedptr::cast_dynamic(item); if(group) { const type_list_items sub_result = group->get_items_recursive(); result.insert(result.end(), sub_result.begin(), sub_result.end()); } else result.push_back(item); } return result; } LayoutGroup::type_list_const_items LayoutGroup::get_items_recursive_with_groups() const { type_list_const_items result; for(type_list_items::const_iterator iter = m_list_items.begin(); iter != m_list_items.end(); ++iter) { const sharedptr item = *iter; //Add the item itself: result.push_back(item); sharedptr group = sharedptr::cast_dynamic(item); if(group) { const type_list_const_items sub_result = group->get_items_recursive_with_groups(); result.insert(result.end(), sub_result.begin(), sub_result.end()); } } return result; } void LayoutGroup::remove_relationship(const sharedptr& relationship) { LayoutGroup::type_list_items::iterator iterItem = m_list_items.begin(); while(iterItem != m_list_items.end()) { sharedptr item = *iterItem; sharedptr uses_rel = sharedptr::cast_dynamic(item); if(uses_rel) { if(uses_rel->get_has_relationship_name()) { if(*(uses_rel->get_relationship()) == *relationship) //TODO_Performance: Slow if there are lots of translations. { m_list_items.erase(iterItem); iterItem = m_list_items.begin(); //Start again, because we changed the container.AddDel continue; } } } sharedptr sub_group = sharedptr::cast_dynamic(item); if(sub_group) sub_group->remove_relationship(relationship); ++iterItem; } } void LayoutGroup::remove_field(const Glib::ustring& parent_table_name, const Glib::ustring& table_name, const Glib::ustring& field_name) { //Look at each item: LayoutGroup::type_list_items::iterator iterItem = m_list_items.begin(); while(iterItem != m_list_items.end()) { sharedptr item = *iterItem; sharedptr field_item = sharedptr::cast_dynamic(item); if(field_item) { if(field_item->get_table_used(parent_table_name) == table_name) { if(field_item->get_name() == field_name) { m_list_items.erase(iterItem); iterItem = m_list_items.begin(); //Start again, because we changed the container.AddDel continue; } } } else { sharedptr sub_group = sharedptr::cast_dynamic(item); if(sub_group) sub_group->remove_field(parent_table_name, table_name, field_name); } ++iterItem; } } void LayoutGroup::change_related_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new) { //Look at each item: for(LayoutGroup::type_list_items::iterator iterItem = m_list_items.begin(); iterItem != m_list_items.end(); ++iterItem) { sharedptr item = *iterItem; sharedptr field_item = sharedptr::cast_dynamic(item); if(field_item) { if(field_item->get_has_relationship_name()) //If it's related table. { sharedptr relationship = field_item->get_relationship(); if(relationship) { if(relationship->get_to_table() == table_name) { if(field_item->get_name() == field_name) field_item->set_name(field_name_new); //Change it. } } } } else { sharedptr sub_group = sharedptr::cast_dynamic(item); if(sub_group) sub_group->change_field_item_name(table_name, field_name, field_name_new); } } } void LayoutGroup::change_field_item_name(const Glib::ustring& table_name, const Glib::ustring& field_name, const Glib::ustring& field_name_new) { //Look at each item: for(LayoutGroup::type_list_items::iterator iterItem = m_list_items.begin(); iterItem != m_list_items.end(); ++iterItem) { sharedptr item = *iterItem; sharedptr field_item = sharedptr::cast_dynamic(item); //Field layout items: if(field_item) { if(field_item->get_has_relationship_name()) //If it's a related table (this would be a self-relationship) { sharedptr rel = field_item->get_relationship(); if(rel) { if(rel->get_to_table() == table_name) { if(field_item->get_name() == field_name) field_item->set_name(field_name_new); //Change it. } } } else { if(field_item->get_name() == field_name) field_item->set_name(field_name_new); //Change it. } } else { //Formatting: sharedptr with_formatting = sharedptr::cast_dynamic(item); if(with_formatting) { Formatting& formatting = with_formatting->m_formatting; formatting.change_field_item_name(table_name, field_name, field_name_new); } //Recurse into sub-groups: sharedptr sub_group = sharedptr::cast_dynamic(item); if(sub_group) sub_group->change_field_item_name(table_name, field_name, field_name_new); } } } /* void LayoutGroup::change_relationship_name(const Glib::ustring& table_name, const Glib::ustring& name, const Glib::ustring& name_new) { //Look at each item: for(LayoutGroup::type_list_items::iterator iterItem = m_list_items.begin(); iterItem != m_list_items.end(); ++iterItem) { LayoutItem_Field* field_item = dynamic_cast(*iterItem); if(field_item) { if(field_item->get_has_relationship_name()) { if(field_item->get_relationship_name() == name) { field_item->set_relationship_name(name_new); } } field_item->m_formatting.change_relationship_name(table_name, name, name_new); } else { LayoutGroup* sub_group = dynamic_cast(*iterItem); if(sub_group) sub_group->change_relationship_name(table_name, name, name_new); } } } */ Glib::ustring LayoutGroup::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Group"); } Glib::ustring LayoutGroup::get_report_part_id() const { return "group"; } guint LayoutGroup::get_items_count() const { return m_list_items.size(); } /* void LayoutGroup::debug(guint level) const { for(int i = 0; i < level; ++i) std::cout << " "; std::cout << "LayoutGroup::debug() level =" << level << std::endl; for(type_list_items::const_iterator iter = m_list_items.begin(); iter != m_list_items.end(); ++iter) { sharedptr group = sharedptr::cast_dynamic(*iter); if(group) group->debug(level + 1); else { sharedptr field = sharedptr::cast_dynamic(*iter); if(field) { for(int i = 0; i < level; ++i) std::cout << " "; std::cout << " field: name=" << field->get_name() << ", relationship=" << field->get_relationship_name() << std::endl; } } } } */ guint LayoutGroup::get_columns_count() const { return m_columns_count; } void LayoutGroup::set_columns_count(guint columns_count) { m_columns_count = columns_count; } double LayoutGroup::get_border_width() const { return m_border_width; } void LayoutGroup::set_border_width(double border_width) { m_border_width = border_width; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/layoutitem_text.cc0000644000175000017500000000526012234776363026504 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { LayoutItem_Text::LayoutItem_Text() { m_translatable_item_type = TRANSLATABLE_TYPE_TEXTOBJECT; m_text = sharedptr::create(); //TODO: Why use a smartpointer? } LayoutItem_Text::LayoutItem_Text(const LayoutItem_Text& src) : LayoutItem_WithFormatting(src) { //Copy the underlying TranslatableItem, not the shardptr to it: const TranslatableItem& src_item = *(src.m_text); m_text = sharedptr(new TranslatableItem(src_item)); } LayoutItem_Text::~LayoutItem_Text() { } LayoutItem* LayoutItem_Text::clone() const { return new LayoutItem_Text(*this); } bool LayoutItem_Text::operator==(const LayoutItem_Text& src) const { bool result = LayoutItem_WithFormatting::operator==(src) && (*m_text == *(src.m_text)); //TODO: Compare the underlying item, not the smartpointer? return result; } //Avoid using this, for performance: LayoutItem_Text& LayoutItem_Text::operator=(const LayoutItem_Text& src) { LayoutItem_WithFormatting::operator=(src); //Copy the underlying TranslatableItem, not the shardptr to it: const TranslatableItem& src_item = *(src.m_text); m_text = sharedptr(new TranslatableItem(src_item)); return *this; } Glib::ustring LayoutItem_Text::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Text"); } Glib::ustring LayoutItem_Text::get_report_part_id() const { return "field"; //We reuse this for this node. } Glib::ustring LayoutItem_Text::get_text(const Glib::ustring& locale) const { return m_text->get_title(locale); } void LayoutItem_Text::set_text(const Glib::ustring& text, const Glib::ustring& locale) { m_text->set_title(text, locale); } void LayoutItem_Text::set_text_original(const Glib::ustring& text) { m_text->set_title_original(text); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/report_parts/0000755000175000017500000000000012235000126025430 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_footer.h0000644000175000017500000000264312234252646031377 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_FOOTER_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_FOOTER_H #include #include namespace Glom { /** */ class LayoutItem_Footer : public LayoutGroup { public: LayoutItem_Footer(); LayoutItem_Footer(const LayoutItem_Footer& src); LayoutItem_Footer& operator=(const LayoutItem_Footer& src); virtual ~LayoutItem_Footer(); virtual LayoutItem* clone() const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_FOOTER_H glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc0000644000175000017500000000322412234252646033121 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { LayoutItem_VerticalGroup::LayoutItem_VerticalGroup() { } LayoutItem_VerticalGroup::LayoutItem_VerticalGroup(const LayoutItem_VerticalGroup& src) : LayoutGroup(src) { } LayoutItem_VerticalGroup::~LayoutItem_VerticalGroup() { } LayoutItem* LayoutItem_VerticalGroup::clone() const { return new LayoutItem_VerticalGroup(*this); } LayoutItem_VerticalGroup& LayoutItem_VerticalGroup::operator=(const LayoutItem_VerticalGroup& src) { LayoutGroup::operator=(src); return *this; } Glib::ustring LayoutItem_VerticalGroup::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Vertical Group"); } Glib::ustring LayoutItem_VerticalGroup::get_report_part_id() const { return "group_vertical"; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.h0000644000175000017500000000304612234252646032765 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_VERTICALGROUP_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_VERTICALGROUP_H #include #include namespace Glom { /** The child items are arranged vertically in a row on a report. */ class LayoutItem_VerticalGroup : public LayoutGroup { public: LayoutItem_VerticalGroup(); LayoutItem_VerticalGroup(const LayoutItem_VerticalGroup& src); LayoutItem_VerticalGroup& operator=(const LayoutItem_VerticalGroup& src); virtual ~LayoutItem_VerticalGroup(); virtual LayoutItem* clone() const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_VERTICALGROUP_H glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_summary.cc0000644000175000017500000000323412234252646031731 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include namespace Glom { LayoutItem_Summary::LayoutItem_Summary() { } LayoutItem_Summary::LayoutItem_Summary(const LayoutItem_Summary& src) : LayoutGroup(src) { } LayoutItem_Summary::~LayoutItem_Summary() { remove_all_items(); } LayoutItem* LayoutItem_Summary::clone() const { return new LayoutItem_Summary(*this); } LayoutItem_Summary& LayoutItem_Summary::operator=(const LayoutItem_Summary& src) { if(this != &src) { LayoutGroup::operator=(src); } return *this; } Glib::ustring LayoutItem_Summary::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Summary"); } Glib::ustring LayoutItem_Summary::get_report_part_id() const { return "summary"; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc0000644000175000017500000001057712234252646032745 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { LayoutItem_FieldSummary::LayoutItem_FieldSummary() : m_summary_type(TYPE_INVALID) { } LayoutItem_FieldSummary::LayoutItem_FieldSummary(const LayoutItem_FieldSummary& src) : LayoutItem_Field(src), m_summary_type(src.m_summary_type) { } LayoutItem_FieldSummary::~LayoutItem_FieldSummary() { } LayoutItem* LayoutItem_FieldSummary::clone() const { return new LayoutItem_FieldSummary(*this); } bool LayoutItem_FieldSummary::operator==(const LayoutItem_FieldSummary& src) const { return LayoutItem_Field::operator==(src) && (m_summary_type == src.m_summary_type); } LayoutItem_FieldSummary& LayoutItem_FieldSummary::operator=(const LayoutItem_FieldSummary& src) { LayoutItem_Field::operator=(src); m_summary_type = src.m_summary_type; return *this; } Glib::ustring LayoutItem_FieldSummary::get_title_or_name(const Glib::ustring& locale) const { const Glib::ustring field_title = get_full_field_details()->get_title_or_name(locale); return get_summary_type_name(m_summary_type) + ": " + field_title; //TODO: Allow a more human-readable title for summary headings. } Glib::ustring LayoutItem_FieldSummary::get_title(const Glib::ustring& locale) const { const Glib::ustring field_title = get_full_field_details()->get_title(locale); return get_summary_type_name(m_summary_type) + ": " + field_title; //TODO: Allow a more human-readable title for summary headings. } Glib::ustring LayoutItem_FieldSummary::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Field Summary"); } Glib::ustring LayoutItem_FieldSummary::get_report_part_id() const { return "field"; } LayoutItem_FieldSummary::summaryType LayoutItem_FieldSummary::get_summary_type() const { return m_summary_type; } void LayoutItem_FieldSummary::set_summary_type(summaryType summary_type) { m_summary_type = summary_type; } Glib::ustring LayoutItem_FieldSummary::get_summary_type_sql() const { if(m_summary_type == TYPE_INVALID) return "INVALID"; else if(m_summary_type == TYPE_SUM) return "SUM"; else if(m_summary_type == TYPE_AVERAGE) return "AVG"; else if(m_summary_type == TYPE_COUNT) return "COUNT"; else return "INVALID"; } void LayoutItem_FieldSummary::set_summary_type_from_sql(const Glib::ustring& summary_type) { if(summary_type == "SUM") m_summary_type = TYPE_SUM; else if(summary_type == "AVG") m_summary_type = TYPE_AVERAGE; else if(summary_type == "COUNT") m_summary_type = TYPE_COUNT; else m_summary_type = TYPE_INVALID; } void LayoutItem_FieldSummary::set_field(const sharedptr& field) { if(field) LayoutItem_Field::operator=(*field); } Glib::ustring LayoutItem_FieldSummary::get_layout_display_name() const { Glib::ustring result = get_layout_display_name_field(); if(m_summary_type == TYPE_INVALID) result = _("No summary chosen"); else result = get_summary_type_name(m_summary_type) + '(' + result + ')'; return result; } Glib::ustring LayoutItem_FieldSummary::get_layout_display_name_field() const { //Get the name for just the field part. return LayoutItem_Field::get_layout_display_name(); } //static: Glib::ustring LayoutItem_FieldSummary::get_summary_type_name(summaryType summary_type) { if(summary_type == TYPE_INVALID) return _("Invalid"); else if(summary_type == TYPE_SUM) return _("Sum"); else if(summary_type == TYPE_AVERAGE) return _("Average"); else if(summary_type == TYPE_COUNT) return _("Count"); else return _("Invalid"); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_header.cc0000644000175000017500000000303412234252646031462 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { LayoutItem_Header::LayoutItem_Header() { } LayoutItem_Header::LayoutItem_Header(const LayoutItem_Header& src) : LayoutGroup(src) { } LayoutItem_Header::~LayoutItem_Header() { } LayoutItem* LayoutItem_Header::clone() const { return new LayoutItem_Header(*this); } LayoutItem_Header& LayoutItem_Header::operator=(const LayoutItem_Header& src) { LayoutGroup::operator=(src); return *this; } Glib::ustring LayoutItem_Header::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Header"); } Glib::ustring LayoutItem_Header::get_report_part_id() const { return "header"; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_footer.cc0000644000175000017500000000303512234252646031531 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { LayoutItem_Footer::LayoutItem_Footer() { } LayoutItem_Footer::LayoutItem_Footer(const LayoutItem_Footer& src) : LayoutGroup(src) { } LayoutItem_Footer::~LayoutItem_Footer() { } LayoutItem* LayoutItem_Footer::clone() const { return new LayoutItem_Footer(*this); } LayoutItem_Footer& LayoutItem_Footer::operator=(const LayoutItem_Footer& src) { LayoutGroup::operator=(src); return *this; } Glib::ustring LayoutItem_Footer::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Footer"); } Glib::ustring LayoutItem_Footer::get_report_part_id() const { return "footer"; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.h0000644000175000017500000000546012234252646031570 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_GROUPBY_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_GROUPBY_H #include #include #include namespace Glom { class LayoutItem_Field; /** The child items are fields to be shown for each record in the group. * The records are grouped by a specified field and there may be. * secondary fields that are also shown for each group. */ class LayoutItem_GroupBy : public LayoutGroup { public: LayoutItem_GroupBy(); LayoutItem_GroupBy(const LayoutItem_GroupBy& src); LayoutItem_GroupBy& operator=(const LayoutItem_GroupBy& src); virtual ~LayoutItem_GroupBy(); virtual LayoutItem* clone() const; typedef Formatting::type_pair_sort_field type_pair_sort_field; typedef Formatting::type_list_sort_fields type_list_sort_fields; sharedptr get_field_group_by(); sharedptr get_field_group_by() const; bool get_has_field_group_by() const; void set_field_group_by(const sharedptr& field); //How to sort the records in this group: type_list_sort_fields get_fields_sort_by(); type_list_sort_fields get_fields_sort_by() const; bool get_has_fields_sort_by() const; void set_fields_sort_by(const type_list_sort_fields& field); /** Get a text representation for the a layout. */ virtual Glib::ustring get_layout_display_name() const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; sharedptr get_secondary_fields(); sharedptr get_secondary_fields() const; type_list_sort_fields get_sort_by() const; void set_sort_by(const type_list_sort_fields& sort_by); private: sharedptr m_field_group_by; sharedptr m_group_secondary_fields; //For instance, show a contact name as well as the contact ID that we group by. type_list_sort_fields m_fields_sort_by; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LayoutGroupBY_H glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.h0000644000175000017500000000456412234252646032606 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_FIELDSUMMARY_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_FIELDSUMMARY_H #include namespace Glom { class LayoutItem_FieldSummary : public LayoutItem_Field { public: LayoutItem_FieldSummary(); LayoutItem_FieldSummary(const LayoutItem_FieldSummary& src); LayoutItem_FieldSummary& operator=(const LayoutItem_FieldSummary& src); virtual ~LayoutItem_FieldSummary(); virtual LayoutItem* clone() const; bool operator==(const LayoutItem_FieldSummary& src) const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; enum summaryType { TYPE_INVALID, TYPE_SUM, TYPE_AVERAGE, TYPE_COUNT }; summaryType get_summary_type() const; void set_summary_type(summaryType summary_type); /// Get the SQL command to use for this summary. Glib::ustring get_summary_type_sql() const; /// This is used when loading the XML document, because we use get_summary_type_sql() when writing it. void set_summary_type_from_sql(const Glib::ustring& summary_type); void set_field(const sharedptr& field); virtual Glib::ustring get_title(const Glib::ustring& locale) const; virtual Glib::ustring get_title_or_name(const Glib::ustring& locale) const; virtual Glib::ustring get_layout_display_name() const; Glib::ustring get_layout_display_name_field() const; static Glib::ustring get_summary_type_name(summaryType summary_type); private: summaryType m_summary_type; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_FIELDSUMMARY_H glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_header.h0000644000175000017500000000264312234252646031331 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_HEADER_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_HEADER_H #include #include namespace Glom { /** */ class LayoutItem_Header : public LayoutGroup { public: LayoutItem_Header(); LayoutItem_Header(const LayoutItem_Header& src); LayoutItem_Header& operator=(const LayoutItem_Header& src); virtual ~LayoutItem_Header(); virtual LayoutItem* clone() const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_HEADER_H glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_summary.h0000644000175000017500000000262412234252646031575 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_LAYOUTITEM_SUMMARY_H #define GLOM_DATASTRUCTURE_LAYOUTITEM_SUMMARY_H #include namespace Glom { class LayoutItem_Field; class LayoutItem_Summary : public LayoutGroup { public: LayoutItem_Summary(); LayoutItem_Summary(const LayoutItem_Summary& src); LayoutItem_Summary& operator=(const LayoutItem_Summary& src); virtual ~LayoutItem_Summary(); virtual LayoutItem* clone() const; virtual Glib::ustring get_part_type_name() const; virtual Glib::ustring get_report_part_id() const; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_LAYOUTITEM_SUMMARY_H glom-1.22.4/glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.cc0000644000175000017500000001012712234252646031722 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include namespace Glom { LayoutItem_GroupBy::LayoutItem_GroupBy() { m_group_secondary_fields = sharedptr::create(); //So that we dont need to create it from outside. } LayoutItem_GroupBy::LayoutItem_GroupBy(const LayoutItem_GroupBy& src) : LayoutGroup(src), m_field_group_by(src.m_field_group_by), m_group_secondary_fields(src.m_group_secondary_fields), m_fields_sort_by(src.m_fields_sort_by) { } LayoutItem_GroupBy::~LayoutItem_GroupBy() { remove_all_items(); } LayoutItem* LayoutItem_GroupBy::clone() const { return new LayoutItem_GroupBy(*this); } LayoutItem_GroupBy& LayoutItem_GroupBy::operator=(const LayoutItem_GroupBy& src) { if(this != &src) { LayoutGroup::operator=(src); m_group_secondary_fields = src.m_group_secondary_fields; m_field_group_by = src.m_field_group_by; m_fields_sort_by = src.m_fields_sort_by; } return *this; } sharedptr LayoutItem_GroupBy::get_field_group_by() { return m_field_group_by; } sharedptr LayoutItem_GroupBy::get_field_group_by() const { return m_field_group_by; } bool LayoutItem_GroupBy::get_has_field_group_by() const { if(!m_field_group_by) return false; return m_field_group_by->get_name_not_empty(); } LayoutItem_GroupBy::type_list_sort_fields LayoutItem_GroupBy::get_fields_sort_by() { return m_fields_sort_by; } LayoutItem_GroupBy::type_list_sort_fields LayoutItem_GroupBy::get_fields_sort_by() const { return m_fields_sort_by; } bool LayoutItem_GroupBy::get_has_fields_sort_by() const { return !m_fields_sort_by.empty(); } Glib::ustring LayoutItem_GroupBy::get_part_type_name() const { //Translators: This is the name of a UI element (a layout part name). return _("Group By"); } void LayoutItem_GroupBy::set_field_group_by(const sharedptr& field) { m_field_group_by = field; } void LayoutItem_GroupBy::set_fields_sort_by(const type_list_sort_fields& fields) { m_fields_sort_by = fields; } Glib::ustring LayoutItem_GroupBy::get_layout_display_name() const { Glib::ustring result; //TODO: Internationalize this properly: if(get_has_field_group_by()) result = get_field_group_by()->get_layout_display_name(); if(get_has_fields_sort_by()) { result += "(sort by: "; Glib::ustring sort_fields_names; //List all the sort fields: for(type_list_sort_fields::const_iterator iter = m_fields_sort_by.begin(); iter != m_fields_sort_by.end(); ++iter) { if(!sort_fields_names.empty()) sort_fields_names += ", "; sort_fields_names += iter->first->get_layout_display_name(); } result += sort_fields_names + ')'; } return result; } Glib::ustring LayoutItem_GroupBy::get_report_part_id() const { return "group_by"; } sharedptr LayoutItem_GroupBy::get_secondary_fields() { return m_group_secondary_fields; } sharedptr LayoutItem_GroupBy::get_secondary_fields() const { return m_group_secondary_fields; } LayoutItem_GroupBy::type_list_sort_fields LayoutItem_GroupBy::get_sort_by() const { return m_fields_sort_by; } void LayoutItem_GroupBy::set_sort_by(const type_list_sort_fields& sort_by) { m_fields_sort_by = sort_by; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/glomconversions.h0000644000175000017500000001004412234252645025004 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_GLOMCONVERSIONS_H #define GLOM_DATASTRUCTURE_GLOMCONVERSIONS_H #include #include #include #include namespace Glom { namespace Conversions { ///Get text for display to the user. Glib::ustring get_text_for_gda_value(Field::glom_field_type glom_type, const Gnome::Gda::Value& value, const NumericFormat& numeric_format = NumericFormat()); Glib::ustring get_text_for_gda_value(Field::glom_field_type glom_type, const Gnome::Gda::Value& value, const std::locale& locale, const NumericFormat& numeric_format = NumericFormat(), bool iso_format = false); //This is easier than using the GdaNumeric API, //which normally involves text-to-number parsing. double get_double_for_gda_value_numeric(const Gnome::Gda::Value& value); Glib::ustring format_time(const tm& tm_data); Glib::ustring format_time(const tm& tm_data, const std::locale& locale, bool iso_format = false); Glib::ustring format_date(const tm& tm_data); Glib::ustring format_date(const tm& tm_data, const std::locale& locale, bool iso_format = false); Gnome::Gda::Value parse_value(double number); Gnome::Gda::Value parse_value(Field::glom_field_type glom_type, const Glib::ustring& text, bool& success, bool iso_format = false); Gnome::Gda::Value parse_value(Field::glom_field_type glom_type, const Glib::ustring& text, const NumericFormat& numeric_format, bool& success, bool iso_format = false); tm parse_date(const Glib::ustring& text, bool& success); tm parse_date(const Glib::ustring& text, const std::locale& locale, bool& success); tm parse_time(const Glib::ustring& text, bool& success); tm parse_time(const Glib::ustring& text, const std::locale& locale, bool& success); /** Check that Glom can parse text representations of dates for which is has * itself created the text representation. * This may fail in some locales if a translation of the date format is missing. * * @result true if parsing is working. */ bool sanity_check_date_parsing(); /** Check that Glom uses 4 digits to show years in text representations of dates. * This may fail in some locales if a translation of the date format is missing. * If it fails then Glom will default to using a dd/mm/yy format, which * might be incorrect for the locale. * * @result true if 4 digits are used. */ bool sanity_check_date_text_representation_uses_4_digit_years(bool debug_output = false); Glib::ustring format_tm(const tm& tm_data, const std::locale& locale, const char* format); //static tm parse_tm(const Glib::ustring& text, const std::locale& locale, char format); bool value_is_empty(const Gnome::Gda::Value& value); Gnome::Gda::Value get_empty_value(Field::glom_field_type field_type); Gnome::Gda::Value get_example_value(Field::glom_field_type field_type); /** Convert the value to a different type, if necessary. * Any text-to-number or number-to-text conversions will be in the ISO format, * ignoring the current locale. */ Gnome::Gda::Value convert_value(const Gnome::Gda::Value& value, Field::glom_field_type target_glom_type); } //namespace Conversions } //namespace Glom #endif //GLOM_DATASTRUCTURE_GLOMCONVERSIONS_H glom-1.22.4/glom/libglom/data_structure/tableinfo.h0000644000175000017500000000324712234252646023530 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_TABLEINFO_H #define GLOM_DATASTRUCTURE_TABLEINFO_H #include #include namespace Glom { class TableInfo : public TranslatableItem, public HasTitleSingular { public: TableInfo(); TableInfo(const TableInfo& src); TableInfo& operator=(const TableInfo& src); /** Returns true if this table should not be shown in the list of tables when in operator mode. */ bool get_hidden() const; /** See get_default(). */ void set_hidden(bool val = true); /** Returns true if this table should be shown when the system is opened. * Only one table can be the default table. */ bool get_default() const; /** See get_default(). */ void set_default(bool val = true); private: bool m_hidden; bool m_default; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_TABLEINFO_H glom-1.22.4/glom/libglom/data_structure/glomconversions.cc0000644000175000017500000011221612234776363025156 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include // For HAVE_STRPTIME #include #include #include #include #include //For stringstream #include // for locale, time_put #include // for struct tm #include // for cout, endl #include #include // for strlen, memset, strcmp #include #include namespace Glom { Glib::ustring Conversions::format_time(const tm& tm_data) { try { return format_time( tm_data, std::locale("") /* the user's current locale */ ); //Get the current locale. } catch(const std::runtime_error& ex) { std::cerr << G_STRFUNC << ": exception from std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; return Glib::ustring(); } } Glib::ustring Conversions::format_time(const tm& tm_data, const std::locale& locale, bool iso_format) { if(iso_format) { return format_tm(tm_data, locale, "%T" /* I see no iso-format time in the list, but this looks like the standard C-locale format. murrayc*/); } else return format_tm(tm_data, locale, "%X" /* time */); } Glib::ustring Conversions::format_date(const tm& tm_data) { try { return format_date( tm_data, std::locale("") /* the user's current locale */ ); //Get the current locale. } catch(const std::runtime_error& ex) { std::cerr << G_STRFUNC << ": exception from std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; return Glib::ustring(); } } #define GLOM_NON_TRANSLATED_LOCALE_DATE_FORMAT "%x" // The % format to use to print and interpret dates, with 4-digit years: static const gchar* c_locale_date_format = 0; static inline const char* glom_get_locale_date_format() { if(!c_locale_date_format) { /* TRANSLATORS: Please only translate this string if you know that strftime() * shows only 2 year digits when using format "x". We want to always display * 4 year digits. For instance, en_GB should translate it to "%d/%m/%Y". * Glom will show a warning in the terminal at startup if this is necessary * and default to %d/%m/%Y" if it detects a problem, but that might not be * correct for your locale. * Thanks. * xgettext:no-c-format */ c_locale_date_format = _("%x"); } //std::cout << G_STRFUNC << ": c_locale_date_format=" << c_locale_date_format << std::endl; return c_locale_date_format; } Glib::ustring Conversions::format_date(const tm& tm_data, const std::locale& locale, bool iso_format) { if(iso_format) return format_tm(tm_data, locale, "%F" /* iso-format date */); else { /* TRANSLATORS: Please only translate this string if you know that strftime() shows only 2 year digits when using format "x". We want to always display 4 year digits. For instance, en_GB should translate it to "%d/%m/%Y". To discover if your locale has this problem, try the testdateput_allformats.cc test case in http://bugzilla.gnome.org/show_bug.cgi?id=334648. Thanks. */ return format_tm(tm_data, locale, glom_get_locale_date_format() /* date */); } } bool Conversions::sanity_check_date_parsing() { //A date that is really really the date that we mean: tm the_c_time; memset(&the_c_time, 0, sizeof(the_c_time)); //We mean 22nd November 2008: the_c_time.tm_year = 2008 - 1900; //C years start are the AD year - 1900. So, 01 is 1901. the_c_time.tm_mon = 11 - 1; //C months start at 0. the_c_time.tm_mday = 22; //starts at 1 //Get the current locale's text representation: const Glib::ustring date_text = format_date(the_c_time); //std::cout << "DEBUG: 22nd November 2008 in this locale has this text represention: " << date_text << std::endl; //Try to parse it: bool success = false; tm parsed_date = parse_date(date_text, success); if(success) { //std::cout << " DEBUG: parsed date: year=" << parsed_date.tm_year + 1900 << ", month=" << parsed_date.tm_mon + 1 << ", day=" << parsed_date.tm_mday << std::endl; } if(!success || parsed_date.tm_year != the_c_time.tm_year || parsed_date.tm_mon != the_c_time.tm_mon || parsed_date.tm_mday != the_c_time.tm_mday) { //Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. std::cerr << _("ERROR: sanity_check_date_parsing(): Sanity check failed: Glom could not parse a date's text representation that it generated itself, in this locale.") << " (" << std::locale("").name() << ")" << std::endl; //If translators cannot be relied upon to do this, maybe we should default to "%d/%m/%Y" when "%x" fails this test. return false; } return true; } bool Conversions::sanity_check_date_text_representation_uses_4_digit_years(bool debug_output) { //A date that is really really the date that we mean: tm the_c_time; memset(&the_c_time, 0, sizeof(the_c_time)); //We mean 22nd November 2008: the_c_time.tm_year = 2008 - 1900; //C years start are the AD year - 1900. So, 01 is 1901. the_c_time.tm_mon = 11 - 1; //C months start at 0. the_c_time.tm_mday = 22; //starts at 1 //Get the current locale's text representation: const Glib::ustring date_text = format_date(the_c_time); if(debug_output) { std::cout << "DEBUG: 22nd November 2008 in this locale (" << std::locale("").name() << ") has this text represention: " << date_text << std::endl; } //See if the year appears in full in that date. //There are probably some locales for which this fails. //Please tell us if there are. const Glib::ustring::size_type pos = date_text.find("2008"); if(pos == Glib::ustring::npos) { //Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. std::cerr << _("ERROR: sanity_check_date_text_representation_uses_4_digit_year(): Sanity check failed: Glom does not seem to use 4 digits to display years in a date's text representation, in this locale. Defaulting to dd/mm/yyyy though this might be incorrect for your locale. This needs attention from a translator. Please file a bug - see http://www.glom.org") << std::endl; //std::cout << " Unexpected date text: " << date_text << std::endl; //Do not depend on translators to do what we ask. //Default to a common format, though this would be incorrect in some //locales, such as German. c_locale_date_format = "%d/%m/%Y"; return false; } return true; } Glib::ustring Conversions::format_tm(const tm& tm_data, const std::locale& locale, const char* format) { //This is based on docs found here: //http://www.roguewave.com/support/docs/sourcepro/stdlibref/time-put.html //Format it into this stream: typedef std::stringstream type_stream; type_stream the_stream; the_stream.imbue(locale); //Make it format things for this locale. (Actually, I don't know if this is necessary, because we mention the locale in the time_put<> constructor. // Get a time_put face: typedef std::time_put type_time_put; const type_time_put& tp = std::use_facet(locale); //type_iterator begin(the_stream); tp.put(the_stream /* iter to beginning of stream */, the_stream, ' ' /* fill */, &tm_data, format, format + strlen(format) /* 'E' */ /* use locale's alternative format */); Glib::ustring text = the_stream.str(); //std::cout << "debug: " << G_STRFUNC << ": result from tp.put: " << text << std::endl; try { if(locale == std::locale("") /* The user's current locale */) { // Converts from the user's current locale to utf8. I would prefer a generic conversion from any locale, // but there is no such function, and it's hard to do because I don't know how to get the encoding name from the std::locale() text = Glib::locale_to_utf8(text); } } catch(const std::runtime_error& ex) { std::cerr << G_STRFUNC << ": exception from std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } //std::cout << "debug: " << G_STRFUNC << ": returning: " << text << std::endl; return text; //TODO: Use something like Glib::locale_to_utf8()? /* //This is based on the code in Glib::Date::format_string(), which only deals with dates, but not times: const std::string locale_format = Glib::locale_from_utf8("%X"); //%x means "is replaced by the locale's appropriate time representation". gsize bufsize = std::max(2 * locale_format.size(), 128); do { const Glib::ScopedPtr buf (static_cast(g_malloc(bufsize))); // Set the first byte to something other than '\0', to be able to // recognize whether strftime actually failed or just returned "". buf.get()[0] = '\1'; const gsize len = strftime(buf.get(), bufsize, locale_format.c_str(), &tm_data); if(len != 0 || buf.get()[0] == '\0') { g_assert(len < bufsize); return Glib::locale_to_utf8(std::string(buf.get(), len)); } } while((bufsize *= 2) <= 65536); // This error is quite unlikely (unless strftime is buggy). std::cerr << G_STRFUNC << ": maximum size of strftime buffer exceeded. Giving up." << std::endl; return Glib::ustring(); */ } namespace //anonymous { /* class numpunct_thousands_separator: public std::numpunct { //Override std::string do_grouping() const { return "\3"; }; }; */ class numpunct_no_thousands_separator: public std::numpunct { //Override std::string do_grouping() const { return ""; }; }; } //anonymous namespace Glib::ustring Conversions::get_text_for_gda_value(Field::glom_field_type glom_type, const Gnome::Gda::Value& value, const NumericFormat& numeric_format) { try { return get_text_for_gda_value(glom_type, value, std::locale("") /* the user's current locale */, numeric_format); //Get the current locale. } catch(const std::runtime_error& ex) { std::cerr << G_STRFUNC << ": exception from std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; return Glib::ustring(); } } double Conversions::get_double_for_gda_value_numeric(const Gnome::Gda::Value& value) { const GType vtype = value.get_value_type(); if(vtype != GDA_TYPE_NUMERIC) { // Note that in case the database system does not support GdaNumeric // (such as sqlite) we fall back to double (see // FieldTypes::get_string_name_for_gdavaluetype), so try this as well. switch(vtype) { case G_TYPE_DOUBLE: return value.get_double(); case G_TYPE_INT: return value.get_int(); case G_TYPE_UINT: return value.get_uint(); //case G_TYPE_LONG: //TODO: Add this to libgdamm: return value.get_long(); case G_TYPE_ULONG: return value.get_ulong(); case G_TYPE_INT64: return value.get_int64(); case G_TYPE_UINT64: return value.get_uint64(); default: std::cerr << G_STRFUNC << ": expected NUMERIC but GdaValue type is: " << g_type_name(value.get_value_type()) << std::endl; return 0; } } const Gnome::Gda::Numeric numeric = value.get_numeric(); return numeric.get_double(); } Glib::ustring Conversions::get_text_for_gda_value(Field::glom_field_type glom_type, const Gnome::Gda::Value& value, const std::locale& locale, const NumericFormat& numeric_format, bool iso_format) { if(value.is_null()) //The type can be null for any of the actual field types. { return Glib::ustring(); } if(glom_type == Field::TYPE_DATE) { tm the_c_time; memset(&the_c_time, 0, sizeof(the_c_time)); if(value.get_value_type() == G_TYPE_STRING) { // If a date is contained in a string type instead of a date type, // which can happen if the database system does not support dates // natively, then the string representation is always in ISO format. bool success; the_c_time = parse_date(value.get_string(), std::locale::classic(), success); if(!success) std::cerr << G_STRFUNC << ": Failed to convert string-represented date value" << std::endl; } else if(value.get_value_type() == G_TYPE_DATE) { Glib::Date gda_date = value.get_date(); //Gnome::Gda::Date gda_date = value.get_date(); //tm the_c_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; the_c_time.tm_year = gda_date.get_year() - 1900; //C years start are the AD year - 1900. So, 01 is 1901. the_c_time.tm_mon = gda_date.get_month() - 1; //C months start at 0. the_c_time.tm_mday = gda_date.get_day(); //starts at 1 } else { std::cerr << G_STRFUNC << ": glom field type is DATE but GdaValue type is: " << g_type_name(value.get_value_type()) << std::endl; // Default the_c_time.tm_mday = 1; } return format_date(the_c_time, locale, iso_format); /* Glib::Date date((Glib::Date::Day)gda_date.day, (Glib::Date::Month)gda_date.month, (Glib::Date::Year)gda_date.year); return date.format_string("%x"); //%x means "is replaced by the locale's appropriate date representation". */ } else if(glom_type == Field::TYPE_TIME) { tm the_c_time; memset(&the_c_time, 0, sizeof(the_c_time)); if(value.get_value_type() == G_TYPE_STRING) { // If a time is contained in a string type instead of a gda time type, // which can happen if the database system does not support times // natively, then the string representation is always in ISO format. bool success; the_c_time = parse_time(value.get_string(), std::locale::classic(), success); if(!success) std::cerr << G_STRFUNC << ": Failed to convert string-represented time value" << std::endl; } else if(value.get_value_type() == GDA_TYPE_TIME) { Gnome::Gda::Time gda_time = value.get_time(); //tm the_c_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; the_c_time.tm_hour = gda_time.hour; the_c_time.tm_min = gda_time.minute; the_c_time.tm_sec = gda_time.second; } else { std::cerr << G_STRFUNC << ": glom field type is TIME but GdaValue type is: " << g_type_name(value.get_value_type()) << std::endl; } return format_time(the_c_time, locale, iso_format); } else if(glom_type == Field::TYPE_NUMERIC) { const GType value_type = value.get_value_type(); if(value_type != GDA_TYPE_NUMERIC && value_type != G_TYPE_DOUBLE && value_type != G_TYPE_INT) //SQLite uses int for summary field results. { std::cerr << G_STRFUNC << ": glom field type is NUMERIC but GdaValue type is: " << g_type_name(value.get_value_type()) << std::endl; return value.to_string(); } const double number = get_double_for_gda_value_numeric(value); //Get the locale-specific text representation, in the required format: std::stringstream another_stream; another_stream.imbue(locale); //Tell it to parse stuff as per this locale. //Numeric formatting: if(!iso_format) { if(!numeric_format.m_use_thousands_separator) { std::locale locale_modified(locale, new numpunct_no_thousands_separator()); //The locale takes ownership. another_stream.imbue(locale_modified); } if(numeric_format.m_decimal_places_restricted) { another_stream << std::fixed; //precision means number of decimal places when using std::fixed: another_stream << std::setprecision(numeric_format.m_decimal_places); } else { //Increase the number of digits (even before the decimal point) we can //have until it uses the awkward e syntax. The default seems to be 7. another_stream << std::setprecision( NumericFormat::get_default_precision() ); } if(!(numeric_format.m_currency_symbol.empty())) { std::string charset; Glib::get_charset(charset); Glib::ustring currency_symbol = Glib::convert_with_fallback(numeric_format.m_currency_symbol, charset, "UTF-8"); // Uses convert_with_fallback(.) for the curreny symbol to avoid an // exception where the operator<<'s automatic conversion fails. // Incompatible encodings are possible since the currency symbol itself // is stored in the Glom document (UTF-8), whereas the stream encoding // depends on the user's locale (needed for the numeric value // representation). another_stream << currency_symbol << " "; } } another_stream << number; Glib::ustring text = another_stream.str(); //Avoid using << because Glib::ustring does implicit character conversion with that. try { if(locale == std::locale("") /* The user's current locale */) { // Converts from the user's current locale to utf8. I would prefer a generic conversion from any locale, // but there is no such function, and it's hard to do because I don't know how to get the encoding name from the std::locale() text = Glib::locale_to_utf8(text); } } catch(const std::runtime_error& ex) { std::cerr << G_STRFUNC << ": exception from std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } //std::cout << "debug: " << G_STRFUNC << ": number=" << number << ", text=" << text << std::endl; return text; //Do something like Glib::locale_to_utf(), but with the specified locale instead of the current locale. } else if(glom_type == Field::TYPE_TEXT) { return value.get_string(); } else if (glom_type == Field::TYPE_BOOLEAN) { //This is used only by Field::to_file_format(), //and should never be shown in the UI. if(G_VALUE_TYPE(value.gobj()) == G_TYPE_BOOLEAN) return (value.get_boolean() ? "TRUE" : "FALSE" ); else return "FALSE"; } else if (glom_type == Field::TYPE_IMAGE) { //This function is only used for : //- UI-visible strings, but images should never be shown as text in the UI. //- Values in SQL queries, but we only do that for clauses (where/sort/order) // which should never use image values. std::cerr << G_STRFUNC << ": Unexpected TYPE_IMAGE field type: " << glom_type << std::endl; return Glib::ustring(); } else { std::cerr << G_STRFUNC << ": Unexpected glom field type: " << glom_type << std::endl; return value.to_string(); } } Gnome::Gda::Value Conversions::parse_value(double number) { //This is just a way to get a NUMERIC Gnome::Gda::Value from a numeric type: Gnome::Gda::Numeric numeric; numeric.set_double(number); return Gnome::Gda::Value(numeric); } Gnome::Gda::Value Conversions::parse_value(Field::glom_field_type glom_type, const Glib::ustring& text, bool& success, bool iso_format) { NumericFormat ignore_format; return parse_value(glom_type, text, ignore_format, success, iso_format); } Gnome::Gda::Value Conversions::parse_value(Field::glom_field_type glom_type, const Glib::ustring& text, const NumericFormat& numeric_format, bool& success, bool iso_format) { std::locale the_locale; try { the_locale = (iso_format ? std::locale::classic() : std::locale("") /* The user's current locale */); } catch(const std::runtime_error& ex) { std::cerr << G_STRFUNC << ": exception from std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } //Put a NULL in the database for empty dates, times, and numerics, because 0 would be an actual value. //But we use "" for strings, because the distinction between NULL and "" would not be clear to users. if(text.empty()) { if( (glom_type == Field::TYPE_DATE) || (glom_type == Field::TYPE_TIME) || (glom_type == Field::TYPE_NUMERIC) ) { Gnome::Gda::Value null_value; success = true; return null_value; } } if(glom_type == Field::TYPE_DATE) { tm the_c_time = parse_date(text, the_locale, success); // The C time starts at 1900 and the C month starts at 0. Glib::Date gda_date(the_c_time.tm_mday, static_cast(the_c_time.tm_mon + 1), the_c_time.tm_year + 1900); return Gnome::Gda::Value(gda_date); } else if(glom_type == Field::TYPE_TIME) { tm the_c_time = parse_time(text, the_locale, success); if(!success) { //Fall back to trying both the current locale and C locale: the_c_time = parse_time(text, success); } Gnome::Gda::Time gda_time = {0, 0, 0, 0, 0}; gda_time.hour = the_c_time.tm_hour; gda_time.minute = the_c_time.tm_min; gda_time.second = the_c_time.tm_sec; return Gnome::Gda::Value(gda_time); } else if(glom_type == Field::TYPE_NUMERIC) { Glib::ustring text_to_parse = Utils::trim_whitespace(text); if(!(numeric_format.m_currency_symbol.empty())) { //Remove the currency symbol: const Glib::ustring prefix = text_to_parse.substr(0, numeric_format.m_currency_symbol.size()); if(text_to_parse.substr(0, numeric_format.m_currency_symbol.size()) == numeric_format.m_currency_symbol) { text_to_parse = text_to_parse.substr(numeric_format.m_currency_symbol.size()); text_to_parse = Utils::trim_whitespace(text_to_parse); //remove any whitespace between the currency symbol and the number. } } //text_to_parse = Base_DB::string_trim(text_to_parse, " "); //Try to parse the inputted number, according to the current locale. std::stringstream the_stream; the_stream.imbue( the_locale ); //Parse it as per the specified locale. the_stream.str(text_to_parse); //Avoid << because it does implicit character conversion (though that might not be a problem here. Not sure). murrayc double the_number = 0; the_stream >> the_number; //TODO: Does this throw any exception if the text is an invalid number? //std::cout << "debug: " << G_STRFUNC << ": text=" << text_to_parse << ", number=" << the_number << std::endl; Gnome::Gda::Numeric numeric; numeric.set_double(the_number); success = true; //Can this ever fail? return Gnome::Gda::Value(numeric); } else if(glom_type == Field::TYPE_BOOLEAN) { success = true; return Gnome::Gda::Value( (text.uppercase() == "TRUE" ? true : false) ); //TODO: Internationalize this, but it should never be used anyway. } else if(glom_type == Field::TYPE_IMAGE) { //This function is only used for : //- UI-visible strings, but images should never be entered as text in the UI. std::cerr << G_STRFUNC << ": Unexpected TYPE_IMAGE field type: " << glom_type << std::endl; return Gnome::Gda::Value(); } success = true; return Gnome::Gda::Value(text); } tm Conversions::parse_date(const Glib::ustring& text, bool& success) { try { return parse_date( text, std::locale("") /* the user's current locale */, success ); //Get the current locale. } catch(const std::runtime_error& ex) { std::cerr << G_STRFUNC << ": exception from std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; tm the_c_time; memset(&the_c_time, 0, sizeof(the_c_time)); return the_c_time; } } tm Conversions::parse_date(const Glib::ustring& text, const std::locale& locale, bool& success) { //return parse_tm(text, locale, 'x' /* date */); //This is based on docs found here: //http://www.roguewave.com/support/docs/sourcepro/stdlibref/time-get.html //Format it into this stream: typedef std::stringstream type_stream; //tm the_c_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* This seems to be necessary - when I do this, as found here ( http://www.tacc.utexas.edu/services/userguides/pgi/pgC++_lib/stdlibcr/tim_0622.htm ) then the time is correctly parsed (it is changed). * When not, I get just zeros. */ //tm the_c_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; tm the_c_time; memset(&the_c_time, 0, sizeof(the_c_time)); //If the standard locale date format is not appropriate for display then it's also not appropriate for parsing, //because std::get_time() stupidly parses _only_ that format. //Some implementations parse extra formats, in unspecified/non-standard ways, but not g++'s libstdc++ //So just use the fallback instead. It's probably good enough. const bool is_iso_locale = (locale == std::locale::classic()); const bool skip_time_get = !is_iso_locale && (strcmp(GLOM_NON_TRANSLATED_LOCALE_DATE_FORMAT, glom_get_locale_date_format()) != 0); std::ios_base::iostate err = std::ios_base::goodbit; //The initialization is essential because time_get seems to a) not initialize this output argument and b) check its value. if(!skip_time_get) { //For some reason, the stream must be instantiated after we get the facet. This is a worryingly strange "bug". type_stream the_stream; the_stream.imbue(locale); //Make it format things for this locale. (Actually, I don't know if this is necessary, because we mention the locale in the time_put<> constructor. the_stream << text; // Get a time_get facet: typedef std::time_get type_time_get; typedef type_time_get::iter_type type_iterator; const type_time_get& tg = std::use_facet(locale); type_iterator the_begin(the_stream); type_iterator the_end; tg.get_date(the_begin, the_end, the_stream, err, &the_c_time); } else { //std::cout << "DEBUG: Skipping std::time_get<> because it is incapable of parsing 4-digit years in the current locale." << std::endl; } if(!skip_time_get && err != std::ios_base::failbit) { success = true; } else { //time_get can fail just because you have entered "1/2/1903" instead of "01/02/1903", //or maybe we chose to skip it because it is not useful in this locale, //so let's try another, more liberal, way: Glib::Date date; date.set_parse(text); //I think this uses the current locale. murrayc. if(date.valid()) { //tm null_c_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; tm null_c_time; memset(&null_c_time, 0, sizeof(null_c_time)); the_c_time = null_c_time; if(date.get_year() != Glib::Date::BAD_YEAR) the_c_time.tm_year = date.get_year() - 1900; //C years start are the AD year - 1900. So, 01 is 1901. if(date.get_month() != Glib::Date::BAD_MONTH) the_c_time.tm_mon = date.get_month() - 1; //C months start at 0. if(date.get_day() != Glib::Date::BAD_DAY) the_c_time.tm_mday = date.get_day(); //starts at 1 success = true; } else //It really really failed. { //Note that 0 would be invalid for some of these. //tm blank_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; tm blank_time; memset(&blank_time, 0, sizeof(blank_time)); blank_time.tm_mday = 1; blank_time.tm_mon = 1; the_c_time = blank_time; success = false; } } //Prevent some nonsense values: //tm_day starts from 1. if(the_c_time.tm_mday == 0) the_c_time.tm_mday = 1; //tm_mon starts from 0, so 0 is an acceptable value. //if(the_c_time.tm_mon == 0) // the_c_time.tm_mon = 1; return the_c_time; } tm Conversions::parse_time(const Glib::ustring& text, bool& success) { //Initialize output parameter: success = false; //return parse_time( text, std::locale("") /* the user's current locale */ ); //Get the current locale. //time_get() does not seem to work with non-C locales. TODO: Try again. tm the_time; try { the_time = parse_time( text, std::locale("") /* the user's current locale */, success ); } catch(const std::runtime_error& ex) { std::cerr << G_STRFUNC << ": exception from std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } if(success) { return the_time; } else { //Fallback: //Try interpreting it as the C locale instead. //For instance, time_get::get_time() does not seem to be able to parse any time in a non-C locale (even "en_US" or "en_US.UTF-8"). return parse_time( text, std::locale::classic() /* the C locale */, success ); } } tm Conversions::parse_time(const Glib::ustring& text, const std::locale& locale, bool& success) { //std::cout << "debug: " << G_STRFUNC << ": text=" << text << std::endl; //The sequence of statements here seems to be very fragile. If you move things then it stops working. //return parse_tm(text, locale, 'X' /* time */); //This is based on docs found here: //http://www.roguewave.com/support/docs/sourcepro/stdlibref/time-get.html //Format it into this stream: typedef std::stringstream type_stream; //tm the_c_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* This seems to be necessary - when I do this, as found here ( http://www.tacc.utexas.edu/services/userguides/pgi/pgC++_lib/stdlibcr/tim_0622.htm ) then the time is correctly parsed (it is changed). * When not, I get just zeros. */ //tm the_c_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; tm the_c_time; memset(&the_c_time, 0, sizeof(the_c_time)); std::ios_base::iostate err = std::ios_base::goodbit; //The initialization is essential because time_get seems to a) not initialize this output argument and b) check its value. type_stream the_stream; the_stream.imbue(locale); //Make it format things for this locale. (Actually, I don't know if this is necessary, because we mention the locale in the time_put<> constructor. the_stream << text; // Get a time_get facet: typedef std::istreambuf_iterator > type_iterator; typedef std::time_get type_time_get; const type_time_get& tg = std::use_facet(locale); type_iterator the_begin(the_stream); type_iterator the_end; tg.get_time(the_begin, the_end, the_stream, err, &the_c_time); if(err != std::ios_base::failbit) { success = true; return the_c_time; } #ifdef HAVE_STRPTIME //Fall back to strptime(): //This fallback will be used in most cases. TODO: Remove the useless? time_get<> code then? //It seems to be well known that time_get<> can parse much less than what time_put<> can generate: // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2070.html // //Try various formats: memset(&the_c_time, 0, sizeof(the_c_time)); char* lastchar = strptime(text.c_str(), "%r" /* 12-hour clock time using the AM/PM notation */, &the_c_time); if(lastchar) { success = true; return the_c_time; } memset(&the_c_time, 0, sizeof(the_c_time)); lastchar = strptime(text.c_str(), "%X" /* The time, using the locale's time format. */, &the_c_time); if(lastchar) { //std::cout << "debug: " << G_STRFUNC << ": %X: text=" << text << " was parsed as: hour=" << the_c_time.tm_hour << ", min=" << the_c_time.tm_min << ", sec=" << the_c_time.tm_sec << std::endl; success = true; return the_c_time; } //Note: strptime() with "%OI" parses "01:00 PM" incorrectly as 01:00, though it claims to parse successfully. memset(&the_c_time, 0, sizeof(the_c_time)); lastchar = strptime(text.c_str(), "%c" /* alternative 12-hour clock */, &the_c_time); if(lastchar) { //std::cout << "debug: " << G_STRFUNC << ": %c: text=" << text << " was parsed as: hour=" << the_c_time.tm_hour << ", min=" << the_c_time.tm_min << ", sec=" << the_c_time.tm_sec << std::endl; success = true; return the_c_time; } //This seems to be the only one that can parse "01:00 PM": memset(&the_c_time, 0, sizeof(the_c_time)); lastchar = strptime(text.c_str(), "%I : %M %p" /* 12 hours clock with AM/PM, without seconds. */, &the_c_time); if(lastchar) { //std::cout << "debug: " << G_STRFUNC << ": %I : %M %p: text=" << text << " was parsed as: hour=" << the_c_time.tm_hour << ", min=" << the_c_time.tm_min << ", sec=" << the_c_time.tm_sec << std::endl; success = true; return the_c_time; } //std::cout << " DEBUG: strptime(%c) failed on text=" << text << std::endl; #endif // HAVE_STRPTIME //Nothing worked: //tm blank_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; tm blank_time ; memset(&blank_time , 0, sizeof(blank_time )); success = false; return blank_time; } /* This requires an extension to the standard - time_get<>.get().: tm Conversions::parse_tm(const Glib::ustring& text, const std::locale& locale, char format) { //This is based on docs found here: //http://www.roguewave.com/support/docs/sourcepro/stdlibref/time-get.html //Format it into this stream: typedef std::stringstream type_stream; type_stream the_stream; the_stream.imbue(locale); //Make it format things for this locale. (Actually, I don't know if this is necessary, because we mention the locale in the time_put<> constructor. // Get a time_get facet: typedef std::istreambuf_iterator > type_iterator; typedef std::time_get type_time_get; const type_time_get& tg = std::use_facet(locale); the_stream << text; //tm the_c_time = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; tm the_c_time; memset(&the_c_time, 0, sizeof(the_c_time)); type_iterator the_begin(the_stream); type_iterator the_end; std::ios_base::iostate state; // Unused std::ios_base::iostate err; tg.get(the_begin, the_end, the_stream, state, err, &the_c_time, format, 0); return the_c_time; } */ bool Conversions::value_is_empty(const Gnome::Gda::Value& value) { if(value.is_null()) return true; switch(value.get_value_type()) { case(0): return true; //Empty and invalid. It has not been initalized with a type. case(G_TYPE_STRING): return value.get_string().empty(); default: return false; //None of the other types can be empty. (An empty numeric, date, or time type shows up as a GDA_TYPE_NULL). } } Gnome::Gda::Value Conversions::get_empty_value(Field::glom_field_type field_type) { switch(field_type) { case(Field::TYPE_TEXT): return Gnome::Gda::Value( Glib::ustring() ); //Use an empty string instead of a null for text fields, because the distinction is confusing for users, and gives no advantages. default: return Gnome::Gda::Value(); //A NULL instance, because there is no suitable empty value for numeric, date, or time fields. } } Gnome::Gda::Value Conversions::get_example_value(Field::glom_field_type field_type) { switch(field_type) { case(Field::TYPE_BOOLEAN): return Gnome::Gda::Value(true); case(Field::TYPE_DATE): { bool success = false; return parse_value(field_type, "01/02/03", success, true /* iso_format */); } case(Field::TYPE_NUMERIC): { bool success = false; return parse_value(field_type, "1", success, true /* iso_format */); } case(Field::TYPE_TEXT): return Gnome::Gda::Value( Glib::ustring("example") ); //Use an empty string instead of a null for text fields, because the distinction is confusing for users, and gives no advantages. case(Field::TYPE_TIME): { bool success = false; return parse_value(field_type, "01:02", success, true /* iso_format */); } default: return Gnome::Gda::Value(); } } static bool vtype_is_numeric(GType vtype) { switch(vtype) { case G_TYPE_DOUBLE: case G_TYPE_INT: case G_TYPE_UINT: case G_TYPE_LONG: case G_TYPE_ULONG: case G_TYPE_INT64: case G_TYPE_UINT64: return true; default: return false; } } Gnome::Gda::Value Conversions::convert_value(const Gnome::Gda::Value& value, Field::glom_field_type target_glom_type) { const GType gvalue_type_target = Field::get_gda_type_for_glom_type(target_glom_type); const GType gvalue_type_source = value.get_value_type(); if(gvalue_type_source == gvalue_type_target) return value; //No conversion necessary, and no loss of precision. const Field::glom_field_type source_glom_type = Field::get_glom_type_for_gda_type(gvalue_type_source); if(source_glom_type == target_glom_type) { //Try to return the canonical type, //instead of just something of a similar GType: if((target_glom_type == Field::TYPE_NUMERIC) && (vtype_is_numeric(gvalue_type_source))) { const double number = get_double_for_gda_value_numeric(value); return parse_value(number); } } //Fallback for other conversions: const Glib::ustring text = get_text_for_gda_value(source_glom_type, value, std::locale::classic(), NumericFormat(), true /* iso_format */); bool test = false; return parse_value(target_glom_type, text, test, true /* iso_format */); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/fieldtypes.cc0000644000175000017500000002330712234776363024101 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include //For debug output #include // For gda_g_type_to_string #include namespace Glom { FieldTypes::FieldTypes(const Glib::RefPtr& gda_connection) { // These are documented here: // http://library.gnome.org/devel/libgda-4.0/3.99/connection.html#GdaConnectionMetaTypeHead enum GlomGdaDataModelTypesColumns { DATAMODEL_FIELDS_COL_NAME = 0, DATAMODEL_FIELDS_COL_GTYPE = 1, DATAMODEL_FIELDS_COL_COMMENTS = 2, DATAMODEL_FIELDS_COL_SYNONYMS = 3 }; if(gda_connection && gda_connection->is_opened()) { //Read the Types information, so that we can map the string representation of the type (returned by CONNECTION_META_FIELDS) to //the Gda::ValueType used by Glib::RefPtr. //This first call to update_meta_store() is also necessary for other calls to get_meta_store_data() elsewhere to succeed. Glib::RefPtr data_model_tables; if(true) //Already done in ConnectionPool::connect(): gda_connection->update_meta_store()) { data_model_tables = gda_connection->get_meta_store_data(Gnome::Gda::CONNECTION_META_TYPES); } if(!data_model_tables) std::cerr << G_STRFUNC << ": Couldn't get datamodel" << std::endl; if(data_model_tables && (data_model_tables->get_n_columns() == 0)) { std::cerr << G_STRFUNC << ": get_meta_store_data(Gnome::Gda::CONNECTION_META_TYPES) failed." << std::endl; } else if(data_model_tables) { const int rows = data_model_tables->get_n_rows(); if(!rows) { //This happens with our developer user when sharing is activated, and with other extra users. //TODO: Find out why. std::cout << G_STRFUNC << ": no rows from CONNECTION_META_TYPES. Using default type mappings." << std::endl; } for(int i = 0; i < rows; ++i) { const Gnome::Gda::Value value_name = data_model_tables->get_value_at(DATAMODEL_FIELDS_COL_NAME, i); //Get the types's string representation: Glib::ustring schema_type_string; if(value_name.get_value_type() == G_TYPE_STRING) schema_type_string = value_name.get_string(); if(!schema_type_string.empty()) { const Gnome::Gda::Value value_gdatype = data_model_tables->get_value_at(DATAMODEL_FIELDS_COL_GTYPE, i); if(value_gdatype.get_value_type() == G_TYPE_STRING) { Glib::ustring type_string = value_gdatype.get_string(); const GType gdatype = gda_g_type_from_string(type_string.c_str()); //std::cout << "debug: schema_type_string=" << schema_type_string << ", gda type=" << gdatype << "(" << g_type_name(gdatype) << ")" << std::endl; //Save it for later: const Glib::ustring gdatypestring = gda_g_type_to_string(gdatype); // TODO: What is this actually used for? //std::cout << G_STRFUNC << ": m_mapSchemaStringsToGdaTypes[\"" << schema_type_string << "\"] = " << gdatypestring << ";" << std::endl; m_mapSchemaStringsToGdaTypes[schema_type_string] = gdatype; //std::cout << "schema type: " << schema_type_string << " = gdatype " << (guint)gdatype << "(" << gdatypestring << ")" << std::endl; m_mapGdaTypesToSchemaStrings[gdatype] = schema_type_string; //We save it twice, to just to make searching easier, without using a predicate. //g_warning("debug: schema type: %s = gdatype %d", schema_type_string.c_str(), gdatype); } } } } } //Use some default mappings if we could not get them from the database server. //For instance, this can happen if the user does not have read access. if(m_mapSchemaStringsToGdaTypes.empty()) { fill_with_default_data(); } m_mapFallbackTypes[GDA_TYPE_BINARY] = GDA_TYPE_BLOB; m_mapFallbackTypes[GDA_TYPE_NUMERIC] = G_TYPE_DOUBLE; m_mapFallbackTypes[GDA_TYPE_TIME] = G_TYPE_STRING; m_mapFallbackTypes[G_TYPE_DATE] = G_TYPE_STRING; } FieldTypes::~FieldTypes() { } void FieldTypes::fill_with_default_data() { //This is based on the values normally retrieved from the database server, //in the constructor. //This is appropriate for PostgreSQL, but SQLite should never need these defaults anyway. //TODO: Make something like libgda's static postgres_name_to_g_type() method public? m_mapSchemaStringsToGdaTypes["abstime"] = G_TYPE_INT; m_mapSchemaStringsToGdaTypes["bit"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["bool"] = G_TYPE_BOOLEAN; m_mapSchemaStringsToGdaTypes["bpchar"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["bytea"] = GDA_TYPE_BINARY; m_mapSchemaStringsToGdaTypes["char"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["cidr"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["circle"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["date"] = G_TYPE_DATE; m_mapSchemaStringsToGdaTypes["float4"] = G_TYPE_FLOAT; m_mapSchemaStringsToGdaTypes["float8"] = G_TYPE_DOUBLE; m_mapSchemaStringsToGdaTypes["gtsvector"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["inet"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["int2"] = GDA_TYPE_SHORT; m_mapSchemaStringsToGdaTypes["int4"] = G_TYPE_INT; m_mapSchemaStringsToGdaTypes["int8"] = G_TYPE_INT64; m_mapSchemaStringsToGdaTypes["interval"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["macaddr"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["money"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["numeric"] = GDA_TYPE_NUMERIC; m_mapSchemaStringsToGdaTypes["path"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["pg_node_tree"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["polygon"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["regconfig"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["regdictionary"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["reltime"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["text"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["time"] = GDA_TYPE_TIME; m_mapSchemaStringsToGdaTypes["timestamp"] = GDA_TYPE_TIMESTAMP; m_mapSchemaStringsToGdaTypes["timestamptz"] = GDA_TYPE_TIMESTAMP; m_mapSchemaStringsToGdaTypes["timetz"] = GDA_TYPE_TIME; m_mapSchemaStringsToGdaTypes["tinterval"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["tsquery"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["tsvector"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["txid_snapshot"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["uuid"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["varbit"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["varchar"] = G_TYPE_STRING; m_mapSchemaStringsToGdaTypes["xml"] = G_TYPE_STRING; //Fill the reverse map too: for(type_mapSchemaStringsToGdaTypes::const_iterator iter = m_mapSchemaStringsToGdaTypes.begin(); iter != m_mapSchemaStringsToGdaTypes.end(); ++iter) { const Glib::ustring str = iter->first; const GType gtype = iter->second; m_mapGdaTypesToSchemaStrings[gtype] = str; } } guint FieldTypes::get_types_count() const { /* if(!m_mapSchemaStringsToGdaTypes.empty()) { const type_mapSchemaStringsToGdaTypes::const_iterator iter = m_mapSchemaStringsToGdaTypes.begin(); const Glib::ustring schema_type_string = iter->first; const GType gdatype = iter->second; std::cout << G_STRFUNC << ": debug: schema_type_string=" << schema_type_string << ", gdatype=" << g_type_name(gdatype) << std::endl; } */ return m_mapSchemaStringsToGdaTypes.size(); } Glib::ustring FieldTypes::get_string_name_for_gdavaluetype(GType field_type) const { //Special-case gchararray (G_TYPE_STRING) because Gda reports this GType for several //postgres field types (xml, inet, tinterval, etc), //though we only care about varchar: if(field_type == G_TYPE_STRING) return "varchar"; type_mapGdaTypesToSchemaStrings::const_iterator iterFind = m_mapGdaTypesToSchemaStrings.find(field_type); if(iterFind == m_mapGdaTypesToSchemaStrings.end()) { type_mapFallbackTypes::const_iterator iterFallback = m_mapFallbackTypes.find(field_type); if(iterFallback != m_mapFallbackTypes.end()) return get_string_name_for_gdavaluetype(iterFallback->second); std::cerr << G_STRFUNC << ": returning unknowntype for field_type=" << field_type << " (" << g_type_name(field_type) << ")" << std::endl; std::cerr << " possible types are: " << std::endl; for(type_mapGdaTypesToSchemaStrings::const_iterator iter = m_mapGdaTypesToSchemaStrings.begin(); iter != m_mapGdaTypesToSchemaStrings.end(); ++iter) { std::cerr << " gdatype=" << iter->first << " (" << g_type_name(iter->first) << "), sqltype=" << iter->second << std::endl; } return "unknowntype"; } else return iterFind->second; } GType FieldTypes::get_fallback_type_for_gdavaluetype(GType field_type) const { type_mapFallbackTypes::const_iterator iter = m_mapFallbackTypes.find(field_type); if(iter == m_mapFallbackTypes.end()) return G_TYPE_NONE; return iter->second; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/has_title_singular.cc0000644000175000017500000000511212234252646025574 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { HasTitleSingular::HasTitleSingular() { } HasTitleSingular::HasTitleSingular(const HasTitleSingular& src) : m_title_singular(src.m_title_singular) { } HasTitleSingular::~HasTitleSingular() { } HasTitleSingular& HasTitleSingular::operator=(const HasTitleSingular& src) { m_title_singular = src.m_title_singular; return *this; } bool HasTitleSingular::operator==(const HasTitleSingular& src) const { const bool bResult = (m_title_singular == src.m_title_singular); return bResult; } bool HasTitleSingular::operator!=(const HasTitleSingular& src) const { return !(operator==(src)); } Glib::ustring HasTitleSingular::get_title_singular(const Glib::ustring& locale) const { Glib::ustring result; if(m_title_singular) result = m_title_singular->get_title(locale); return result; } Glib::ustring HasTitleSingular::get_title_singular_original() const { Glib::ustring result; if(m_title_singular) result = m_title_singular->get_title_original(); return result; } Glib::ustring HasTitleSingular::get_title_singular_with_fallback(const Glib::ustring& locale) const { const Glib::ustring result = get_title_singular(locale); if(!result.empty()) return result; //If it this is also a regular TranslatableItem (usually it is), //then try getting the regular title instead. const TranslatableItem* translatable = dynamic_cast(this); if(translatable) return translatable->get_title_or_name(locale); return result; } void HasTitleSingular::set_title_singular(const Glib::ustring& title, const Glib::ustring& locale) { if(!m_title_singular) m_title_singular = sharedptr::create(); m_title_singular->set_title(title, locale); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/privileges.cc0000644000175000017500000000266012234252646024072 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { Privileges::Privileges() : m_view(false), m_edit(false), m_create(false), m_delete(false) { } Privileges::Privileges(const Privileges& src) { operator=(src); } Privileges::~Privileges() { } Privileges& Privileges::operator=(const Privileges& src) { m_view = src.m_view; m_edit = src.m_edit; m_create = src.m_create; m_delete = src.m_delete; return *this; } bool Privileges::operator==(const Privileges& src) const { return (m_view == src.m_view) && (m_edit == src.m_edit) && (m_create == src.m_create) && (m_delete == src.m_delete); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/privileges.h0000644000175000017500000000241012234252646023725 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATA_STRUCTURE_PRIVILEGES_H #define GLOM_DATA_STRUCTURE_PRIVILEGES_H #include namespace Glom { #define GLOM_STANDARD_GROUP_NAME_DEVELOPER "glom_developer" class Privileges { public: Privileges(); Privileges(const Privileges& src); virtual ~Privileges(); Privileges& operator=(const Privileges& src); bool operator==(const Privileges& src) const; bool m_view, m_edit, m_create, m_delete; }; } //namespace Glom #endif //GLOM_DATA_STRUCTURE_PRIVILEGES_H glom-1.22.4/glom/libglom/data_structure/database_title.cc0000644000175000017500000000223212234252645024660 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { DatabaseTitle::DatabaseTitle() { m_translatable_item_type = TRANSLATABLE_TYPE_DATABASE_TITLE; } DatabaseTitle::DatabaseTitle(const DatabaseTitle& src) : TranslatableItem(src) { } DatabaseTitle& DatabaseTitle::operator=(const DatabaseTitle& src) { TranslatableItem::operator=(src); return *this; } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/has_title_singular.h0000644000175000017500000000460112234252646025440 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_HAS_TITLE_SINGULAR_H #define GLOM_DATASTRUCTURE_HAS_TITLE_SINGULAR_H #include namespace Glom { /** HasTitleSingular instances may have a (translated) singular form of their title. * For instance, "Album" instead of "Albums". * This is useful in some generated UI strings. */ class HasTitleSingular { public: HasTitleSingular(); HasTitleSingular(const HasTitleSingular& src); virtual ~HasTitleSingular(); HasTitleSingular& operator=(const HasTitleSingular& src); bool operator==(const HasTitleSingular& src) const; bool operator!=(const HasTitleSingular& src) const; /** Get the (translation of the) singular form of the title, in the current locale, * if specified. */ Glib::ustring get_title_singular(const Glib::ustring& locale) const; /** Get the title's original (non-translated, usually English) text. */ Glib::ustring get_title_singular_original() const; /** Get the (translation of the) singular form of the title, in the current locale, * if specified, falling back to the non-singular title, and * then falling back to the table name. */ Glib::ustring get_title_singular_with_fallback(const Glib::ustring& locale) const; /** Set the singular title's translation for the current locale. */ void set_title_singular(const Glib::ustring& title, const Glib::ustring& locale); /** For instance, "Customer" if the table is titled "Customers". * This is useful in some UI strings. */ sharedptr m_title_singular; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_HAS_TITLE_SINGULAR_H glom-1.22.4/glom/libglom/data_structure/system_prefs.cc0000644000175000017500000000460312234252646024443 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { SystemPrefs::SystemPrefs() { } SystemPrefs::SystemPrefs(const SystemPrefs& src) : m_name(src.m_name), m_org_name(src.m_org_name), m_org_address_street(src.m_org_address_street), m_org_address_street2(src.m_org_address_street2), m_org_address_town(src.m_org_address_town), m_org_address_county(src.m_org_address_county), m_org_address_country(src.m_org_address_country), m_org_address_postcode(src.m_org_address_postcode), m_org_logo(src.m_org_logo) { } SystemPrefs& SystemPrefs::operator=(const SystemPrefs& src) { m_name = src.m_name; m_org_name =src.m_org_name; m_org_address_street = src.m_org_address_street; m_org_address_street2 = src.m_org_address_street2; m_org_address_town = src.m_org_address_town; m_org_address_county = src.m_org_address_county; m_org_address_country = src.m_org_address_country; m_org_address_postcode = src.m_org_address_postcode; m_org_logo = src.m_org_logo; return *this; } bool SystemPrefs::operator==(const SystemPrefs& src) const { return (m_name == src.m_name) && (m_org_name == src.m_org_name) && (m_org_address_street == src.m_org_address_street) && (m_org_address_street2 == src.m_org_address_street2) && (m_org_address_town == src.m_org_address_town) && (m_org_address_county == src.m_org_address_county) && (m_org_address_country == src.m_org_address_country) && (m_org_address_postcode == src.m_org_address_postcode) && (m_org_logo == src.m_org_logo); } bool SystemPrefs::operator!=(const SystemPrefs& src) const { return !(operator==(src)); } } //namespace Glom glom-1.22.4/glom/libglom/data_structure/choicevalue.h0000644000175000017500000000401512234252645024045 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DATASTRUCTURE_CHOICEVALUE_H #define GLOM_DATASTRUCTURE_CHOICEVALUE_H #include #include namespace Glom { /** A value of a custom choice, for a field or a layout item. * This is translatable, but that only make sense for text fields. * * Text-specific methods such as get/set_title() should be ignored. */ class ChoiceValue : public TranslatableItem { public: ChoiceValue(); ChoiceValue(const ChoiceValue& src); ~ChoiceValue(); ChoiceValue& operator=(const ChoiceValue& src); bool operator==(const ChoiceValue& src) const; bool operator!=(const ChoiceValue& src) const; ChoiceValue* clone() const; void set_value(const Gnome::Gda::Value& value); Gnome::Gda::Value get_value() const; /** This override makes sure that we can generically use * ChoiceValue like any other TranslatableItem, * assuming that the value is a title, * if it is a text value. */ virtual Glib::ustring get_title_original() const; /** Whether the value is of a type that can be translated. * This means that it must be a text type. */ bool is_translatable() const; private: Gnome::Gda::Value m_value; }; } //namespace Glom #endif //GLOM_DATASTRUCTURE_CHOICEVALUE_H glom-1.22.4/glom/libglom/sharedptr.h0000644000175000017500000002504512234252646020530 0ustar00murraycmurrayc00000000000000/* sharedptr.h * * Copyright (C) 2004 Glom developers * * Licensed under the GPL * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */ #ifndef GLOM_SHAREDPTR_H #define GLOM_SHAREDPTR_H //#include //Just for debugging. #include // For size_t. namespace Glom { /**A ref-counting smart-pointer for the underlying C++ object. * You can copy these smarpointers-of-C++-resources, and therefore the C++ classes can * have simple copy constructors which just share the underlying resources. * */ template< typename T_obj > class sharedptr { public: typedef size_t size_type; typedef T_obj object_type; sharedptr(); ///Take ownership explicit sharedptr(T_obj* pobj); /** Take ownership. * This is only for internal use. */ explicit sharedptr(T_obj* pobj, size_type* refcount); ///Share ownership sharedptr(const sharedptr& src); /** Swap the contents of two sharedptr<>. * This method swaps the internal pointers. This can be * done safely without involving a reference/unreference cycle and is * therefore highly efficient. */ inline void swap(sharedptr& other); /** Copy constructor (from different, but castable type). * * Increments the reference count. */ template inline sharedptr(const sharedptr& src); ///Share ownership sharedptr& operator=(const sharedptr& src); /** Copy from different, but castable type). * * Increments the reference count. */ template inline sharedptr& operator=(const sharedptr& src); virtual ~sharedptr(); inline bool operator==(const sharedptr& src) const; inline bool operator!=(const sharedptr& src) const; ///Forget the instance. virtual void clear(); /** Dereferencing. */ inline T_obj& operator*(); /** Dereferencing. */ inline const T_obj& operator*() const; /** Dereferencing. * * Use the methods of the underlying instance like so: * sharedptr->memberfun(). */ inline T_obj* operator->() const; /** Test whether the sharedptr<> points to any underlying instance. * * Mimics usage of ordinary pointers: * @code * if(ptr) * do_something(); * @endcode */ inline operator bool() const; /** Test whether the sharedptr<> points to any underlying instance. * * Mimics usage of ordinary pointers: * @code * if(!ptr) * do_something(); * @endcode */ inline bool operator!() const; /** Dynamic cast to derived class. * * The sharedptr can't be cast with the usual notation so instead you can use * @code * ptr_derived = sharedptr::cast_dynamic(ptr_base); * @endcode */ template static inline sharedptr cast_dynamic(const sharedptr& src); /** Static cast to derived class. * * Like the dynamic cast; the notation is * @code * ptr_derived = sharedptr::cast_static(ptr_base); * @endcode */ template static inline sharedptr cast_static(const sharedptr& src); /** Cast to non-const. * * The sharedptr can't be cast with the usual notation so instead you can use * @code * ptr_unconst = sharedptr::cast_const(ptr_const); * @endcode */ template static inline sharedptr cast_const(const sharedptr& src); static inline sharedptr create() { return sharedptr(new T_obj()); } ///Get the underlying instance: inline T_obj* obj(); ///Get the underlying instance: inline const T_obj* obj() const; ///This is for internal use. You never need to use it. inline size_type* _get_refcount() const { return m_pRefCount; } private: inline void ref(); inline void unref(); void init(); mutable size_type* m_pRefCount; //Shared between instances, by copying. T_obj* m_pobj; //The underlying instance. }; template< typename T_obj> sharedptr::sharedptr() : m_pRefCount(0), m_pobj(0) { init(); } template< typename T_obj> sharedptr::sharedptr(T_obj* pobj) : m_pRefCount(0), m_pobj(pobj) { //Start refcounting: ref(); } //This is only for use in the cast_*<> implementations: template< typename T_obj> sharedptr::sharedptr(T_obj* pobj, size_t* refcount) : m_pRefCount(refcount), m_pobj(pobj) { //Start refcounting: ref(); } template< typename T_obj> sharedptr::sharedptr(const sharedptr& src) : m_pRefCount(src.m_pRefCount), m_pobj(src.m_pobj) { ref(); } // The templated ctor allows copy construction from any object that's // castable. Thus, it does downcasts: // base_ref = derived_ref template template inline sharedptr::sharedptr(const sharedptr& src) : // A different sharedptr<> will not allow us access to pCppObject_. We need // to add a get_underlying() for this, but that would encourage incorrect // use, so we use the less well-known operator->() accessor: m_pRefCount(src._get_refcount()), m_pobj(src.operator->()) { if(m_pobj) ref(); } template inline void sharedptr::swap(sharedptr& other) { T_obj *const obj_temp = m_pobj; size_type* const count_temp = m_pRefCount; m_pobj = other.m_pobj; m_pRefCount = other.m_pRefCount; other.m_pobj = obj_temp; other.m_pRefCount = count_temp; } template< typename T_obj> sharedptr& sharedptr::operator=(const sharedptr& src) { if(this != &src) { sharedptr temp(src); //Increases ref this->swap(temp); //temp forgets everything and gives it to this. } return *this; } template template inline sharedptr& sharedptr::operator=(const sharedptr& src) { sharedptr temp(src); //Increases ref this->swap(temp); //temp forgets everything and gives it to this. return *this; } template< typename T_obj> sharedptr::~sharedptr() { unref(); } template inline bool sharedptr::operator==(const sharedptr& src) const { return m_pobj == src.m_pobj; } template inline bool sharedptr::operator!=(const sharedptr& src) const { return m_pobj != src.m_pobj; } template< typename T_obj> void sharedptr::clear() { sharedptr temp; // swap with an empty sharedptr<> to clear *this this->swap(temp); } template< typename T_obj> inline T_obj* sharedptr::obj() { return m_pobj; } template< typename T_obj> inline const T_obj* sharedptr::obj() const { return m_pobj; } template< typename T_obj> inline T_obj& sharedptr::operator*() { return *m_pobj; } template< typename T_obj> inline const T_obj& sharedptr::operator*() const { return *m_pobj; } template< typename T_obj> inline T_obj* sharedptr::operator->() const { return m_pobj; } template inline sharedptr::operator bool() const { return (m_pobj != 0); } template inline bool sharedptr::operator!() const { return (m_pobj == 0); } template inline void sharedptr::ref() { if(m_pobj) //Don't waste time on invalid instances. These would be very rare anyway, and intentionally created with (0,0) construction. { if(m_pRefCount == 0) { //std::cout << "debug: " << G_STRFUNC << ": first ref" << std::endl; //First ref, so allocate the shared count: m_pRefCount = new size_type(); *m_pRefCount = 1; } else { //std::cout << "debug: " << G_STRFUNC << ": starting at" << *m_pRefCount << std::endl; (*m_pRefCount)++; } } } template inline void sharedptr::unref() { if(m_pRefCount) { //std::cout << "debug: " << G_STRFUNC << ": starting at " << *m_pRefCount << std::endl; if( (*m_pRefCount) > 0 ) (*m_pRefCount)--; //Unalloc if this is the last user of the obj: if(*m_pRefCount == 0) { delete m_pobj; m_pobj = 0; //Clear ref count: delete m_pRefCount; m_pRefCount = 0; } } else { //std::cout << "debug: " << G_STRFUNC << ": ref not setup." << std::endl; } } template void sharedptr::init() { //Forget any previous instance: if(m_pobj) { unref(); } m_pobj = 0; m_pRefCount = 0; } template template inline sharedptr sharedptr::cast_dynamic(const sharedptr& src) { T_obj *const pCppObject = dynamic_cast(src.operator->()); if(pCppObject) return sharedptr(pCppObject, src._get_refcount()); else return sharedptr(); } template template inline sharedptr sharedptr::cast_static(const sharedptr& src) { T_obj *const pCppObject = static_cast(src.operator->()); if(pCppObject) return sharedptr(pCppObject, src._get_refcount()); else return sharedptr(); } template template inline sharedptr sharedptr::cast_const(const sharedptr& src) { T_obj *const pCppObject = const_cast(src.operator->()); if(pCppObject) return sharedptr(pCppObject, src._get_refcount()); else return sharedptr(); } template sharedptr glom_sharedptr_clone(const sharedptr& src) { if(src) { //std::cout << "glom_sharedptr_clone src.name=" << src->get_name() << std::endl; return sharedptr(static_cast(src->clone())); } else return sharedptr(); } template sharedptr glom_sharedptr_clone(const sharedptr& src) { if(src) { //std::cout << "glom_sharedptr_cloneconst src.name=" << src->get_name() << std::endl; return sharedptr(static_cast(src->clone())); } else return sharedptr(); } } //namespace Glom #endif //GLOM_SHAREDPTR_H glom-1.22.4/glom/libglom/connectionpool_backends/0000755000175000017500000000000012235000126023221 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/libglom/connectionpool_backends/postgres.cc0000644000175000017500000010124212234776363025424 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" // For POSTGRES_UTILS_PATH #include #include #include #include #include #include #include #include #include //For Glib::file_test(). #include #include #include /* For g_rename(). TODO: Wrap this in glibmm? */ #include #include // Uncomment to see debug messages //#define GLOM_CONNECTION_DEBUG namespace { static Glib::ustring create_auth_string(const Glib::ustring& username, const Glib::ustring& password) { if(username.empty() and password.empty()) return Glib::ustring(); else return "USERNAME=" + Glom::DbUtils::gda_cnc_string_encode(username) + ";PASSWORD=" + Glom::DbUtils::gda_cnc_string_encode(password); } } //anonymous namespace namespace Glom { namespace ConnectionPoolBackends { Postgres::Postgres() : m_port(0), m_postgres_server_version(0.0f) { } Glib::RefPtr Postgres::attempt_connect(const Glib::ustring& port, const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, bool fake_connection) { //We must specify _some_ database even when we just want to create a database. //This _might_ be different on some systems. I hope not. murrayc const Glib::ustring default_database = "template1"; //const Glib::ustring& actual_database = (!database.empty()) ? database : default_database;; const Glib::ustring cnc_string_main = "HOST=" + DbUtils::gda_cnc_string_encode(m_host) + ";PORT=" + DbUtils::gda_cnc_string_encode(port); const Glib::ustring cnc_string = cnc_string_main + ";DB_NAME=" + DbUtils::gda_cnc_string_encode(database); Glib::RefPtr connection; Glib::RefPtr data_model; const Glib::ustring auth_string = create_auth_string(username, password); #ifdef GLOM_CONNECTION_DEBUG std::cout << std::endl << "DEBUG: Glom: trying to connect on port=" << port << std::endl; std::cout << "debug: " << G_STRFUNC << ": cnc_string=" << cnc_string << std::endl; std::cout << " DEBUG: auth_string=" << auth_string << std::endl; #endif try { if(fake_connection) { connection = Gnome::Gda::Connection::create_from_string("PostgreSQL", cnc_string, auth_string, Gnome::Gda::CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE); } else { connection = Gnome::Gda::Connection::open_from_string("PostgreSQL", cnc_string, auth_string, Gnome::Gda::CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE); connection->statement_execute_non_select("SET DATESTYLE = 'ISO'"); data_model = connection->statement_execute_select("SELECT version()"); } } catch(const Glib::Error& ex) { #ifdef GLOM_CONNECTION_DEBUG std::cout << "debug: " << G_STRFUNC << ": Attempt to connect to database failed on port=" << port << ", database=" << database << ": " << "error code=" << ex.code() << ", error message: " << ex.what() << std::endl; std::cout << "debug: " << G_STRFUNC << ": Attempting to connect without specifying the database." << std::endl; #endif const Glib::ustring cnc_string = cnc_string_main + ";DB_NAME=" + DbUtils::gda_cnc_string_encode(default_database); Glib::RefPtr temp_conn; Glib::ustring auth_string = create_auth_string(username, password); try { temp_conn = Gnome::Gda::Connection::open_from_string("PostgreSQL", cnc_string, auth_string, Gnome::Gda::CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE); } catch(const Glib::Error& /* ex */) { //Show this on stderr because it can contain useful clues such as a hostname that cannot be resolved. //std::cerr << G_STRFUNC << ": Attempt to connect to default database failed on port=" << port << " : " << "error code=" << ex.code() << ", error message: " << ex.what() << std::endl; } #ifdef GLOM_CONNECTION_DEBUG if(temp_conn) std::cout << " (Connection succeeds, but not to the specific database, database=" << database << std::endl; else std::cerr << " (Could not connect even to the default database, database=" << database << std::endl; #endif throw ExceptionConnection(temp_conn ? ExceptionConnection::FAILURE_NO_DATABASE : ExceptionConnection::FAILURE_NO_SERVER); return Glib::RefPtr(); } if(data_model && data_model->get_n_rows() && data_model->get_n_columns()) { const Gnome::Gda::Value value = data_model->get_value_at(0, 0); if(value.get_value_type() == G_TYPE_STRING) { const Glib::ustring version_text = value.get_string(); //This seems to have the format "PostgreSQL 7.4.11 on i486-pc-linux" const Glib::ustring namePart = "PostgreSQL "; const Glib::ustring::size_type posName = version_text.find(namePart); if(posName != Glib::ustring::npos) { const Glib::ustring versionPart = version_text.substr(namePart.size()); m_postgres_server_version = strtof(versionPart.c_str(), 0); #ifdef GLOM_CONNECTION_DEBUG std::cout << " Postgres Server version: " << m_postgres_server_version << std::endl; #endif } } } return connection; } bool Postgres::change_columns(const Glib::RefPtr& connection, const Glib::ustring& table_name, const type_vec_const_fields& old_fields, const type_vec_const_fields& new_fields) throw() { static const char TRANSACTION_NAME[] = "glom_change_columns_transaction"; static const char TEMP_COLUMN_NAME[] = "glom_temp_column"; // TODO: Find a unique name. try { connection->begin_transaction(TRANSACTION_NAME, Gnome::Gda::TRANSACTION_ISOLATION_UNKNOWN); // TODO: What does the transaction isolation do? } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": begin_transaction failed: " << ex.what() << std::endl; } //Do this all in one big try/catch, block, //reverting the transaction if anything fails: try { for(unsigned int i = 0; i < old_fields.size(); ++ i) { // If the type did change, then we need to recreate the column. See // http://www.postgresql.org/docs/faqs.FAQ.html#item4.3 if(old_fields[i]->get_field_info()->get_g_type() != new_fields[i]->get_field_info()->get_g_type()) { // Create a temporary column sharedptr temp_field = glom_sharedptr_clone(new_fields[i]); temp_field->set_name(TEMP_COLUMN_NAME); // The temporary column must not be primary key as long as the original // (primary key) column is still present, because there cannot be two // primary key columns. temp_field->set_primary_key(false); const bool added = add_column(connection, table_name, temp_field); if(!added) { std::cerr << G_STRFUNC << ": add_column() failed." << std::endl; //TODO: Stop the transaction and return? } Glib::ustring conversion_command; const Glib::ustring field_name_old_quoted = DbUtils::escape_sql_id(old_fields[i]->get_name()); const Field::glom_field_type old_field_type = old_fields[i]->get_glom_type(); if(Field::get_conversion_possible(old_fields[i]->get_glom_type(), new_fields[i]->get_glom_type())) { //TODO: postgres seems to give an error if the data cannot be converted (for instance if the text is not a numeric digit when converting to numeric) instead of using 0. /* Maybe, for instance: http://groups.google.de/groups?hl=en&lr=&ie=UTF-8&frame=right&th=a7a62337ad5a8f13&seekm=23739.1073660245%40sss.pgh.pa.us#link5 UPDATE _table SET _bbb = to_number(substring(_aaa from 1 for 5), '99999') WHERE _aaa <> ' '; */ switch(new_fields[i]->get_glom_type()) { case Field::TYPE_BOOLEAN: { if(old_field_type == Field::TYPE_NUMERIC) { conversion_command = "(CASE WHEN " + field_name_old_quoted + " > 0 THEN true " "WHEN " + field_name_old_quoted + " = 0 THEN false " "WHEN " + field_name_old_quoted + " IS NULL THEN false END)"; } else if(old_field_type == Field::TYPE_TEXT) conversion_command = '(' + field_name_old_quoted + " !~~* \'false\')"; // !~~* means ! ILIKE else // Dates and Times: conversion_command = '(' + field_name_old_quoted + " IS NOT NULL)"; break; } case Field::TYPE_NUMERIC: // CAST does not work if the destination type is numeric { if(old_field_type == Field::TYPE_BOOLEAN) { conversion_command = "(CASE WHEN " + field_name_old_quoted + " = true THEN 1 " "WHEN " + field_name_old_quoted + " = false THEN 0 " "WHEN " + field_name_old_quoted + " IS NULL THEN 0 END)"; } else { //We use to_number, with textcat() so that to_number always has usable data. //Otherwise, it says //invalid input syntax for type numeric: " " // //We must use single quotes with the 0, otherwise it says "column 0 does not exist.". conversion_command = "to_number( textcat(\'0\', " + field_name_old_quoted + "), '999999999.99999999' )"; } break; } case Field::TYPE_DATE: // CAST does not work if the destination type is date. { conversion_command = "to_date( " + field_name_old_quoted + ", 'YYYYMMDD' )"; // TODO: Standardise date storage format. break; } case Field::TYPE_TIME: // CAST does not work if the destination type is timestamp. { conversion_command = "to_timestamp( " + field_name_old_quoted + ", 'HHMMSS' )"; // TODO: Standardise time storage format. break; } default: { // To Text: // bool to text: if(old_field_type == Field::TYPE_BOOLEAN) { conversion_command = "(CASE WHEN " + field_name_old_quoted + " = true THEN \'true\' " "WHEN " + field_name_old_quoted + " = false THEN \'false\' " "WHEN " + field_name_old_quoted + " IS NULL THEN \'false\' END)"; } else { // This works for most to-text conversions: conversion_command = "CAST(" + field_name_old_quoted + " AS " + new_fields[i]->get_sql_type() + ")"; } break; } } //TODO: Use SqlBuilder here? connection->statement_execute_non_select("UPDATE " + DbUtils::escape_sql_id(table_name) + " SET " + DbUtils::escape_sql_id(TEMP_COLUMN_NAME) + " = " + conversion_command); } else { // The conversion is not possible, so drop data in that column } drop_column(connection, table_name, old_fields[i]->get_name()); connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(table_name) + " RENAME COLUMN " + DbUtils::escape_sql_id(TEMP_COLUMN_NAME) + " TO " + DbUtils::escape_sql_id(new_fields[i]->get_name())); // Read primary key constraint if(new_fields[i]->get_primary_key()) { connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(table_name) + " ADD PRIMARY KEY (" + DbUtils::escape_sql_id(new_fields[i]->get_name()) + ")"); } } else { // The type did not change. What could have changed: The field being a // unique key, primary key, its name or its default value. // Primary key // TODO: Test whether this is able to remove unique key constraints // added via libgda's DDL API in add_column(). Maybe override // add_column() if we can't. bool primary_key_was_set = false; bool primary_key_was_unset = false; if(old_fields[i]->get_primary_key() != new_fields[i]->get_primary_key()) { if(new_fields[i]->get_primary_key()) { primary_key_was_set = true; // Primary key was added connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(table_name) + " ADD PRIMARY KEY (" + DbUtils::escape_sql_id(old_fields[i]->get_name()) + ")"); // Remove unique key constraint, because this is already implied in // the field being primary key. if(old_fields[i]->get_unique_key()) connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(table_name) + " DROP CONSTRAINT " + DbUtils::escape_sql_id(old_fields[i]->get_name() + "_key")); } else { primary_key_was_unset = true; // Primary key was removed connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(table_name) + " DROP CONSTRAINT " + DbUtils::escape_sql_id(table_name + "_pkey")); } } // Uniqueness if(old_fields[i]->get_unique_key() != new_fields[i]->get_unique_key()) { // Postgres automatically makes primary keys unique, so we do not need // to do that separately if we already made it a primary key if(!primary_key_was_set && new_fields[i]->get_unique_key()) { connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(table_name) + " ADD CONSTRAINT " + DbUtils::escape_sql_id(old_fields[i]->get_name() + "_key") + " UNIQUE (" + DbUtils::escape_sql_id(old_fields[i]->get_name()) + ")"); } else if(!primary_key_was_unset && !new_fields[i]->get_unique_key() && !new_fields[i]->get_primary_key()) { connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(table_name) + " DROP CONSTRAINT " + DbUtils::escape_sql_id(old_fields[i]->get_name() + "_key")); } } if(!new_fields[i]->get_auto_increment()) // Auto-increment fields have special code as their default values. { if(old_fields[i]->get_default_value() != new_fields[i]->get_default_value()) { connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(table_name) + " ALTER COLUMN " + DbUtils::escape_sql_id(old_fields[i]->get_name()) + " SET DEFAULT " + new_fields[i]->sql(new_fields[i]->get_default_value(), connection)); } } if(old_fields[i]->get_name() != new_fields[i]->get_name()) { connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(table_name) + " RENAME COLUMN " + DbUtils::escape_sql_id(old_fields[i]->get_name()) + " TO " + DbUtils::escape_sql_id(new_fields[i]->get_name())); } } } connection->commit_transaction(TRANSACTION_NAME); return true; } catch(const Glib::Error& ex) { std::cerr << "Exception: " << ex.what() << std::endl; std::cerr << "Reverting the transaction." << std::endl; try { connection->rollback_transaction(TRANSACTION_NAME); } catch(const Glib::Error& ex) { std::cerr << "Could not rollback the transaction: Exception: " << ex.what() << std::endl; } } return false; } bool Postgres::attempt_create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name, const Glib::ustring& host, const Glib::ustring& port, const Glib::ustring& username, const Glib::ustring& password) { slot_progress(); Glib::RefPtr op = Gnome::Gda::ServerOperation::prepare_create_database("PostgreSQL", database_name); slot_progress(); g_assert(op); try { op->set_value_at("/SERVER_CNX_P/HOST", host); op->set_value_at("/SERVER_CNX_P/PORT", port); op->set_value_at("/SERVER_CNX_P/ADM_LOGIN", username); op->set_value_at("/SERVER_CNX_P/ADM_PASSWORD", password); op->perform_create_database("PostgreSQL"); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; return false; } slot_progress(); return true; } bool Postgres::check_postgres_gda_client_is_available() { //This API is horrible. //See libgda bug http://bugzilla.gnome.org/show_bug.cgi?id=575754 Glib::RefPtr model = Gnome::Gda::Config::list_providers(); if(model && model->get_n_columns() && model->get_n_rows()) { Glib::RefPtr iter = model->create_iter(); do { //See http://library.gnome.org/devel/libgda/unstable/libgda-40-Configuration.html#gda-config-list-providers //about the columns of this DataModel: Gnome::Gda::Value name; try { name = iter->get_value_at(0); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; } if(name.get_value_type() != G_TYPE_STRING) continue; const Glib::ustring name_as_string = name.get_string(); //std::cout << "DEBUG: Provider name:" << name_as_string << std::endl; if(name_as_string == "PostgreSQL") return true; } while(iter->move_next()); } return false; } std::string Postgres::get_path_to_postgres_executable(const std::string& program, bool quoted) { #ifdef G_OS_WIN32 // Add the .exe extension on Windows: std::string real_program = program + EXEEXT; // Have a look at the bin directory of the application executable first. // The installer installs postgres there. postgres needs to be installed // in a directory called bin for its relocation stuff to work, so that // it finds the share data in share. Unfortunately it does not look into // share/postgresql which would be nice to separate the postgres stuff // from the other shared data. We can perhaps still change this later by // building postgres with another prefix than /local/pgsql. gchar* installation_directory = g_win32_get_package_installation_directory_of_module(0); std::string test; try { test = Glib::build_filename(installation_directory, Glib::build_filename("bin", real_program)); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception from Glib::build_filename(): " << ex.what() << std::endl; return std::string(); } g_free(installation_directory); if(Glib::file_test(test, Glib::FILE_TEST_IS_EXECUTABLE)) { if(quoted) test = Glib::shell_quote(test); return test; } // Look in PATH otherwise std::string path = Glib::find_program_in_path(real_program); if(quoted) path = Glib::shell_quote(path); return path; #else // G_OS_WIN32 // POSTGRES_UTILS_PATH is defined in config.h, based on the configure. try { std::string path = Glib::build_filename(POSTGRES_UTILS_PATH, program + EXEEXT); if(quoted) path = Glib::shell_quote(path); return path; } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception from Glib::build_filename(): " << ex.what() << std::endl; return std::string(); } #endif // !G_OS_WIN32 } Glib::ustring Postgres::port_as_string(unsigned int port_num) { Glib::ustring result; char* cresult = g_strdup_printf("%u", port_num); if(cresult) result = cresult; g_free(cresult); return result; } //Because ~/.pgpass is not an absolute path. static std::string get_absolute_pgpass_filepath() { return Glib::build_filename( Glib::get_home_dir(), ".pgpass"); } bool Postgres::save_password_to_pgpass(const Glib::ustring username, const Glib::ustring& password, std::string& filepath_previous, std::string& filepath_original) { //Initialize output variables: filepath_previous.clear(); filepath_original.clear(); const std::string filepath_pgpass = get_absolute_pgpass_filepath(); filepath_original = filepath_pgpass; //Move any existing file out of the way: if(file_exists_filepath(filepath_pgpass)) { //std::cout << "DEBUG: File exists: " << filepath_pgpass << std::endl; filepath_previous = filepath_pgpass + ".glombackup"; if(g_rename(filepath_pgpass.c_str(), filepath_previous.c_str()) != 0) { std::cerr << G_STRFUNC << "Could not rename file: from=" << filepath_pgpass << ", to=" << filepath_previous << std::endl; return false; } } //See http://www.postgresql.org/docs/8.4/static/libpq-pgpass.html //TODO: Escape \ and : characters. const Glib::ustring contents = m_host + ":" + port_as_string(m_port) + ":*:" + username + ":" + password; std::string uri; try { uri = Glib::filename_to_uri(filepath_pgpass); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception from Glib::filename_from_uri(): " << ex.what() << std::endl; g_rename(filepath_previous.c_str(), filepath_pgpass.c_str()); return false; } const bool result = create_text_file(uri, contents, true /* current user only */); if(!result) { std::cerr << G_STRFUNC << ": create_text_file() failed." << std::endl; g_rename(filepath_previous.c_str(), filepath_pgpass.c_str()); return false; } return result; } bool Postgres::save_backup(const SlotProgress& slot_progress, const Glib::ustring& username, const Glib::ustring& password, const Glib::ustring& database_name) { /* TODO: if(m_network_shared && !running) { std::cerr << G_STRFUNC << ": The self-hosted database is not running." << std::endl; return; } */ if(m_host.empty()) { std::cerr << G_STRFUNC << ": m_host is empty." << std::endl; return false; } if(m_port == 0) { std::cerr << G_STRFUNC << ": m_port is empty." << std::endl; return false; } //TODO: Remember the existing username and password? if(username.empty()) { std::cerr << G_STRFUNC << ": username is empty." << std::endl; return false; } if(password.empty()) { std::cerr << G_STRFUNC << ": password is empty." << std::endl; return false; } // Save the password to ~/.pgpass, because this is the only way to use // pg_dump without it asking for the password: std::string pgpass_backup, pgpass_original; const bool pgpass_created = save_password_to_pgpass(username, password, pgpass_backup, pgpass_original); if(!pgpass_created) { std::cerr << G_STRFUNC << ": save_password_to_pgpass() failed." << std::endl; return false; } const std::string path_backup = get_self_hosting_backup_path(std::string(), true /* create parent directory if necessary */); if(path_backup.empty()) return false; // Make sure to use double quotes for the executable path, because the // CreateProcess() API used on Windows does not support single quotes. const std::string command_dump = get_path_to_postgres_executable("pg_dump") + " --format=c " + // The default (plain) format cannot be used with pg_restore. " --create --file=" + Glib::shell_quote(path_backup) + " --host=" + Glib::shell_quote(m_host) + " --port=" + port_as_string(m_port) + " --username=" + Glib::shell_quote(username) + " " + database_name; //TODO: Quote database_name? //std::cout << "DEBUG: command_dump=" << command_dump << std::endl; const bool result = Glom::Spawn::execute_command_line_and_wait(command_dump, slot_progress); //Move the previously-existing .pgpass file back: //TODO: Really, we should just edit the file instead of completely replacing it, // because another application might try to edit it in the meantime. if(!pgpass_backup.empty()) { g_rename(pgpass_backup.c_str(), pgpass_original.c_str()); } if(!result) { std::cerr << "Error while attempting to call pg_dump." << std::endl; } return result; } bool Postgres::convert_backup(const SlotProgress& slot_progress, const std::string& base_directory, const Glib::ustring& username, const Glib::ustring& password, const Glib::ustring& database_name) { /* TODO: if(m_network_shared && !running) { std::cerr << G_STRFUNC << ": The self-hosted database is not running." << std::endl; return; } */ if(m_host.empty()) { std::cerr << G_STRFUNC << ": m_host is empty." << std::endl; return false; } if(m_port == 0) { std::cerr << G_STRFUNC << ": m_port is empty." << std::endl; return false; } //TODO: Remember the existing username and password? if(username.empty()) { std::cerr << G_STRFUNC << ": username is empty." << std::endl; return false; } if(password.empty()) { std::cerr << G_STRFUNC << ": password is empty." << std::endl; return false; } //Make sure the path exists: const std::string path_backup = get_self_hosting_backup_path(base_directory); if(path_backup.empty() || !file_exists_filepath(path_backup)) { std::cerr << G_STRFUNC << ": Backup file not found: " << path_backup << std::endl; return false; } // Save the password to ~/.pgpass, because this is the only way to use // pg_dump without it asking for the password: std::string pgpass_backup, pgpass_original; const bool pgpass_created = save_password_to_pgpass(username, password, pgpass_backup, pgpass_original); if(!pgpass_created) { std::cerr << G_STRFUNC << ": save_password_to_pgpass() failed." << std::endl; return false; } // Make sure to use double quotes for the executable path, because the // CreateProcess() API used on Windows does not support single quotes. const std::string command_restore = get_path_to_postgres_executable("pg_restore") + " -d " + database_name + //TODO: Quote database name? " --host=" + Glib::shell_quote(m_host) + " --port=" + port_as_string(m_port) + " --username=" + Glib::shell_quote(username) + " " + path_backup; std::cout << "DEBUG: command_restore=" << command_restore << std::endl; //TODO: Put the password in .pgpass const bool result = Glom::Spawn::execute_command_line_and_wait(command_restore, slot_progress); //Move the previously-existing .pgpass file back: //TODO: Really, we should just edit the file instead of completely replacing it, // because another application might try to edit it in the meantime. if(!pgpass_backup.empty()) { g_rename(pgpass_backup.c_str(), pgpass_original.c_str()); } if(!result) { std::cerr << "Error while attempting to call pg_restore." << std::endl; } return result; } std::string Postgres::get_self_hosting_path(bool create, const std::string& child_directory) { //Get the filepath of the directory that we should create: const std::string dbdir_uri = m_database_directory_uri; //std::cout << "debug: dbdir_uri=" << dbdir_uri << std::endl; std::string dbdir; try { dbdir = Glib::build_filename( Glib::filename_from_uri(dbdir_uri), child_directory); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception from Glib::build_filename(): " << ex.what() << std::endl; } if(file_exists_filepath(dbdir)) return dbdir; else if(!create) return std::string(); //Create the directory: //std::cout << "debug: dbdir=" << dbdir << std::endl; g_assert(!dbdir.empty()); if(create_directory_filepath(dbdir)) return dbdir; else return std::string(); } std::string Postgres::get_self_hosting_config_path(bool create) { return get_self_hosting_path(create, "config"); } std::string Postgres::get_self_hosting_data_path(bool create) { return get_self_hosting_path(create, "data"); } std::string Postgres::get_self_hosting_backup_path(const std::string& base_directory, bool create_parent_dir) { //This is a file, not a directory, so we don't use get_self_hosting_path("backup"); std::string dbdir; if(base_directory.empty()) dbdir = get_self_hosting_path(create_parent_dir); else { dbdir = base_directory; } if(dbdir.empty()) return std::string(); try { return Glib::build_filename(dbdir, "backup"); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception from Glib::build_filename(): " << ex.what() << std::endl; return std::string(); } } bool Postgres::create_directory_filepath(const std::string& filepath) { if(filepath.empty()) return false; const int mkdir_succeeded = g_mkdir_with_parents(filepath.c_str(), 0770); if(mkdir_succeeded == -1) { std::cerr << G_STRFUNC << ": Error from g_mkdir_with_parents() while trying to create directory: " << filepath << std::endl; perror(" perror(): Error from g_mkdir_with_parents()"); return false; } return true; } bool Postgres::file_exists_filepath(const std::string& filepath) { if(filepath.empty()) return false; const Glib::RefPtr file = Gio::File::create_for_path(filepath); return file && file->query_exists(); } bool Postgres::file_exists_uri(const std::string& uri) const { if(uri.empty()) return false; const Glib::RefPtr file = Gio::File::create_for_uri(uri); return file && file->query_exists(); } bool Postgres::create_text_file(const std::string& file_uri, const std::string& contents, bool current_user_only) { if(file_uri.empty()) return false; Glib::RefPtr file = Gio::File::create_for_uri(file_uri); Glib::RefPtr stream; //Create the file if it does not already exist: #ifdef GLIBMM_EXCEPTIONS_ENABLED try { if(file->query_exists()) { if(current_user_only) { stream = file->replace(std::string() /* etag */, false /* make_backup */, Gio::FILE_CREATE_PRIVATE); //Instead of append_to(). } else { stream = file->replace(); //Instead of append_to(). } } else { //By default files created are generally readable by everyone, but if we pass FILE_CREATE_PRIVATE in flags the file will be made readable only to the current user, to the level that is supported on the target filesystem. if(current_user_only) { //TODO: Do we want to specify 0660 exactly? (means "this user and his group can read and write this non-executable file".) stream = file->create_file(Gio::FILE_CREATE_PRIVATE); } else { stream = file->create_file(); } } } catch(const Gio::Error& ex) { #else std::auto_ptr error; stream.create(error); if(error.get()) { const Gio::Error& ex = *error.get(); #endif // If the operation was not successful, print the error and abort std::cerr << "ConnectionPool::create_text_file(): exception while creating file." << std::endl << " file uri:" << file_uri << std::endl << " error:" << ex.what() << std::endl; return false; // print_error(ex, output_uri_string); } if(!stream) return false; gssize bytes_written = 0; const std::string::size_type contents_size = contents.size(); #ifdef GLIBMM_EXCEPTIONS_ENABLED try { //Write the data to the output uri bytes_written = stream->write(contents.data(), contents_size); } catch(const Gio::Error& ex) { #else bytes_written = stream->write(contents.data(), contents_size, error); if(error.get()) { Gio::Error& ex = *error.get(); #endif // If the operation was not successful, print the error and abort std::cerr << "ConnectionPool::create_text_file(): exception while writing to file." << std::endl << " file uri:" << file_uri << std::endl << " error:" << ex.what() << std::endl; return false; //print_error(ex, output_uri_string); } if(bytes_written != (gssize)contents_size) { std::cerr << "ConnectionPool::create_text_file(): not all bytes written when writing to file." << std::endl << " file uri:" << file_uri << std::endl; return false; } return true; //Success. } bool Postgres::supports_remote_access() const { return true; } Gnome::Gda::SqlOperatorType Postgres::get_string_find_operator() const { // ILIKE is a PostgreSQL extension for locale-dependent case-insensitive matches. //See http://developer.postgresql.org/pgdocs/postgres/functions-matching.html return Gnome::Gda::SQL_OPERATOR_TYPE_ILIKE; } const char* Postgres::get_public_schema_name() const { return "public"; } } //namespace ConnectionPoolBackends } //namespace Glom glom-1.22.4/glom/libglom/connectionpool_backends/backend.h0000644000175000017500000002025112234252645024777 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BACKEND_BACKEND_H #define GLOM_BACKEND_BACKEND_H #include #include #include #include namespace Glom { class ConnectionPool; class ExceptionConnection : public std::exception { public: enum failure_type { FAILURE_NO_SERVER, //Either there was no attempt to connect to a specific database, or the connection failed both with and without specifying the database. FAILURE_NO_DATABASE, //Connection without specifying the database was possible. FAILURE_NO_BACKEND //No backend instance available. Should never happen. }; ExceptionConnection(failure_type failure); virtual ~ExceptionConnection() throw(); virtual const char* what() const throw(); virtual failure_type get_failure_type() const; private: failure_type m_failure_type; }; namespace ConnectionPoolBackends { /** This hides database specific functionality from the ConnectionPool, so * the ConnectionPool can be used without worrying about the actual database * backend in use. Use ConnectionPool::set_backend() to set the backend for * the connectionpool to use. */ class Backend { friend class Glom::ConnectionPool; public: virtual ~Backend() {} typedef std::vector > type_vec_const_fields; enum InitErrors { INITERROR_NONE, INITERROR_DIRECTORY_ALREADY_EXISTS, INITERROR_COULD_NOT_CREATE_DIRECTORY, INITERROR_COULD_NOT_START_SERVER, INITERROR_OTHER }; enum StartupErrors { STARTUPERROR_NONE, /*< The database is ready for use. */ STARTUPERROR_FAILED_NO_DATA, /*< There is no data for the database. */ STARTUPERROR_FAILED_NO_DATA_HAS_BACKUP_DATA, /*< There is no data for the database, but there is a backup file instead. */ STARTUPERROR_FAILED_UNKNOWN_REASON /*< Something else failed. */ }; protected: /* TODO: Merge create_database() and initialize() into a single function? */ /** Whether the database can be accessed from remote machines, once startup() * was called. */ virtual bool supports_remote_access() const = 0; /** The operator to use to compare strings in a case-insensitive way. This * is backend-dependent. For example, postgres uses ILIKE but SQLite uses * LIKE. */ virtual Gnome::Gda::SqlOperatorType get_string_find_operator() const = 0; /** This specifies the database schema which contains the non-internal * tables. This is used to speedup the libgda meta store update by only * updating the non-internal tables. libgda might later be able to do this * without us specifying it explicitely. See #575235. */ virtual const char* get_public_schema_name() const = 0; /** This specifies that Glom should start its own database server instance (if it's PostgreSQL) * for this database, using the database files stored at the specified uri, * or just use that file (if it's sqlite). * Or it can be used temporarily when calling save_backup() to provide the top-level directory path. */ void set_database_directory_uri(const std::string& directory_uri); std::string get_database_directory_uri() const; /** This callback should show UI to indicate that work is still happening. * For instance, a pulsing ProgressBar. */ typedef sigc::slot SlotProgress; /** This method is called for one-time initialization of the database * storage. There is no need to implement this function if the data is centrally * hosted rather than hosted by Glom. * * @param slot_progress A callback to call while the work is still happening. * @param network_shared Whether the database (and document) should be available to other users over the network, * if possible. */ virtual InitErrors initialize(const SlotProgress& slot_progress, const Glib::ustring& initial_username, const Glib::ustring& password, bool network_shared = false); /** This method is called before the backend is used otherwise. This can * be used to start a self-hosted database server. There is no need to implement * this function if there is no need for extra startup code. * * @param slot_progress A callback to call while the work is still happening. * @param network_shared Whether the database (and document) should be available to other users over the network, * if possible. */ virtual StartupErrors startup(const SlotProgress& slot_progress, bool network_shared = false); /** This method is called when the backend is no longer used. This can be * used to shut down a self-hosted database server. There is no need to * implement this function if there is no need for extra cleanup code. * * @param slot_progress A callback to call while the work is still happening. */ virtual bool cleanup(const SlotProgress& slot_progress); /** Change the database server's configration to allow or prevent access from * other users on the network. * * For current backends, you may use this only before startup(), * or after cleanup(). * * @param slot_progress A callback to call while the work is still happening. * @param network_shared Whether the database (and document) should be available to other users over the network, * if possible. */ virtual bool set_network_shared(const SlotProgress& slot_progress, bool network_shared = true); /** This method is called to create a connection to the database server. * * @param fake_connection Whether the connection should not actually be opened. * * @throws An ExceptionConnection if the correction failed. */ virtual Glib::RefPtr connect(const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, bool fake_connection = false) = 0; /** @throws Glib::Error (from libgdamm) */ virtual bool add_column(const Glib::RefPtr& connection, const Glib::ustring& table_name, const sharedptr& field); /** @throws Glib::Error (from libgdamm) */ virtual bool drop_column(const Glib::RefPtr& connection, const Glib::ustring& table_name, const Glib::ustring& field_name); virtual bool change_columns(const Glib::RefPtr& connection, const Glib::ustring& table_name, const type_vec_const_fields& old_fields, const type_vec_const_fields& new_fields) throw() = 0; /** This method is called to create a new database on the * database server. */ virtual bool create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name, const Glib::ustring& username, const Glib::ustring& password) = 0; /** Save a backup of the database in a tarball. * This backup can later be used to recreate the database, * for instance with a later version of PostgreSQL. */ virtual bool save_backup(const SlotProgress& slot_progress, const Glib::ustring& username, const Glib::ustring& password, const Glib::ustring& database_name) = 0; /** Use a backup of the database in a tarball to create the tables and data in an existing empty database. * The database (server) should already have the necessary groups and users. * See save_backup(). */ virtual bool convert_backup(const SlotProgress& slot_progress, const std::string& base_directory_uri, const Glib::ustring& username, const Glib::ustring& password, const Glib::ustring& database_name) = 0; protected: std::string m_database_directory_uri; }; } // namespace ConnectionPoolBackends } //namespace Glom #endif // GLOM_BACKEND_BACKEND_H glom-1.22.4/glom/libglom/connectionpool_backends/sqlite.cc0000644000175000017500000004227112234776363025065 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include namespace Glom { namespace ConnectionPoolBackends { Sqlite::Sqlite() { } Glib::RefPtr Sqlite::connect(const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, bool fake_connection) { Glib::RefPtr connection; if(m_database_directory_uri.empty()) return connection; // Check if the database file exists. If it does not, then we don't try to // connect. libgda would create the database file if necessary, but we need // to ensure slightly different semantics. Glib::RefPtr db_dir = Gio::File::create_for_uri(m_database_directory_uri); Glib::RefPtr db_file = db_dir->get_child(database + ".db"); const bool file_exists = Glom::Utils::file_exists(db_file); if(!file_exists) { //We don't warn here because the caller gets an exception anyway, //and only the caller knows if this failure might be expected, //for instance when checking for an unused database name. //std::cerr << G_STRFUNC << ": The db file does not exist at path: " << db_file->get_uri() << std::endl; //std::cerr << " as filepath: " << db_file->get_path() << std::endl; } else { if(db_file->query_file_type() != Gio::FILE_TYPE_REGULAR) { std::cerr << G_STRFUNC << ": The db file is not a regular file at path: " << db_file->get_uri() << std::endl; } else { // Convert URI to path, for GDA connection string const std::string database_directory = db_dir->get_path(); const Glib::ustring cnc_string = "DB_DIR=" + DbUtils::gda_cnc_string_encode(database_directory) + ";DB_NAME=" + DbUtils::gda_cnc_string_encode(database); const Glib::ustring auth_string = Glib::ustring::compose("USERNAME=%1;PASSWORD=%2", DbUtils::gda_cnc_string_encode(username), DbUtils::gda_cnc_string_encode(password)); if(fake_connection) { connection = Gnome::Gda::Connection::create_from_string("SQLite", cnc_string, auth_string, Gnome::Gda::CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE); } else { connection = Gnome::Gda::Connection::open_from_string("SQLite", cnc_string, auth_string, Gnome::Gda::CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE); } } } if(!connection) { // If the database directory is valid, then only the database (file) is // missing, otherwise we pretend the "server" is not running. if(Glom::Utils::file_exists(db_dir) && (db_dir->query_file_type() == Gio::FILE_TYPE_DIRECTORY)) { throw ExceptionConnection(ExceptionConnection::FAILURE_NO_DATABASE); } else throw ExceptionConnection(ExceptionConnection::FAILURE_NO_SERVER); } return connection; } bool Sqlite::create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name, const Glib::ustring& /* username */, const Glib::ustring& /* password */) { if(m_database_directory_uri.empty()) { std::cerr << G_STRFUNC << ": m_database_directory_uri was empty." << std::endl; return false; } slot_progress(); Glib::RefPtr file = Gio::File::create_for_uri(m_database_directory_uri); const std::string database_directory = file->get_path(); const Glib::ustring cnc_string = Glib::ustring::compose("DB_DIR=%1;DB_NAME=%2", DbUtils::gda_cnc_string_encode(database_directory), DbUtils::gda_cnc_string_encode(database_name)); slot_progress(); Glib::RefPtr cnc = Gnome::Gda::Connection::open_from_string("SQLite", cnc_string, "", Gnome::Gda::CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE); slot_progress(); return true; } bool Sqlite::add_column_to_server_operation(const Glib::RefPtr& operation, GdaMetaTableColumn* column, unsigned int i) { //TODO: Quote column name? const Glib::ustring name_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_NAME/%1", i); const Glib::ustring type_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_TYPE/%1", i); const Glib::ustring pkey_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_PKEY/%1", i); const Glib::ustring nnul_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_NNUL/%1", i); // TODO: Find out whether the column is unique. const Glib::ustring default_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_DEFAULT/%1", i); operation->set_value_at(name_path, column->column_name); operation->set_value_at(type_path, column->column_type); operation->set_value_at(pkey_path, column->pkey); operation->set_value_at(nnul_path, !column->nullok); if(column->default_value) { operation->set_value_at(default_path, column->default_value); } return true; } bool Sqlite::add_column_to_server_operation(const Glib::RefPtr& operation, const sharedptr& column, unsigned int i) { //TODO: Quote column name? const Glib::ustring name_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_NAME/%1", i); const Glib::ustring type_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_TYPE/%1", i); const Glib::ustring pkey_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_PKEY/%1", i); const Glib::ustring unique_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_UNIQUE/%1", i); const Glib::ustring default_path = Glib::ustring::compose("/FIELDS_A/@COLUMN_DEFAULT/%1", i); operation->set_value_at(name_path, column->get_name()); operation->set_value_at(type_path, column->get_sql_type()); operation->set_value_at(pkey_path, column->get_primary_key()); operation->set_value_at(unique_path, column->get_unique_key()); return true; } bool Sqlite::recreate_table(const Glib::RefPtr& connection, const Glib::ustring& table_name, const type_vec_strings& fields_removed, const type_vec_const_fields& fields_added, const type_mapFieldChanges& fields_changed) throw() { static const gchar TEMPORARY_TABLE_NAME[] = "GLOM_TEMP_TABLE"; // TODO: Make sure this is unique. static const gchar TRANSACTION_NAME[] = "GLOM_RECREATE_TABLE_TRANSACTION"; Glib::RefPtr store = connection->get_meta_store(); Glib::RefPtr metastruct = Gnome::Gda::MetaStruct::create(store, Gnome::Gda::META_STRUCT_FEATURE_NONE); GdaMetaDbObject* object = metastruct->complement(Gnome::Gda::META_DB_TABLE, Gnome::Gda::Value(), Gnome::Gda::Value(), Gnome::Gda::Value(table_name)); if(!object) return false; Glib::RefPtr operation = connection->get_provider()->create_operation(connection, Gnome::Gda::SERVER_OPERATION_CREATE_TABLE); if(!operation) return false; //TODO: Quote table name? operation->set_value_at("/TABLE_DEF_P/TABLE_NAME", TEMPORARY_TABLE_NAME); GdaMetaTable* table = GDA_META_TABLE(object); unsigned int i = 0; Glib::ustring trans_fields; for(GSList* item = table->columns; item != 0; item = item->next) { GdaMetaTableColumn* column = GDA_META_TABLE_COLUMN(item->data); // Don't add if field was removed if(std::find(fields_removed.begin(), fields_removed.end(), column->column_name) != fields_removed.end()) continue; #if 0 { // If it was removed, and added again, then it has changed, so use the // definition from the added_fields vector. type_vec_fields::const_iterator iter = std::find_if(fields_added.begin(), fields_added.end(), predicate_FieldHasName(column->column_name)); if(iter == fields_added.end()) continue; else added = *iter; } #endif if(!trans_fields.empty()) trans_fields += ','; const type_mapFieldChanges::const_iterator changed_iter = fields_changed.find(column->column_name); if(changed_iter != fields_changed.end()) { // Convert values to date or time, accordingly. switch(changed_iter->second->get_glom_type()) { case Field::TYPE_TEXT: if(column->gtype == G_TYPE_BOOLEAN) trans_fields += "(CASE WHEN "+ DbUtils::escape_sql_id(column->column_name) + " = 1 THEN 'true' " "WHEN " + DbUtils::escape_sql_id(column->column_name) + " = 0 THEN 'false' " "WHEN " + DbUtils::escape_sql_id(column->column_name) + " IS NULL THEN 'false' END)"; else if(column->gtype == GDA_TYPE_BLOB) trans_fields += "''"; else // Make sure we don't insert NULL strings, as we ignore that concept in Glom. trans_fields += "(CASE WHEN "+ DbUtils::escape_sql_id(column->column_name) + " IS NULL THEN '' " "WHEN " + DbUtils::escape_sql_id(column->column_name) + " IS NOT NULL THEN " + DbUtils::escape_sql_id(column->column_name) + " END)"; break; case Field::TYPE_NUMERIC: if(column->gtype == G_TYPE_BOOLEAN) trans_fields += "(CASE WHEN "+ DbUtils::escape_sql_id(column->column_name) + " = 0 THEN 0 " "WHEN " + DbUtils::escape_sql_id(column->column_name) + " != 0 THEN 1 " "WHEN " + DbUtils::escape_sql_id(column->column_name) + " IS NULL THEN 0 END)"; else if(column->gtype == GDA_TYPE_BLOB || column->gtype == G_TYPE_DATE || column->gtype == GDA_TYPE_TIME) trans_fields += '0'; else trans_fields += Glib::ustring("CAST(")+ DbUtils::escape_sql_id(column->column_name) + " AS real)"; break; case Field::TYPE_BOOLEAN: if(column->gtype == G_TYPE_STRING) trans_fields += "(CASE WHEN "+ DbUtils::escape_sql_id(column->column_name) + " = 'true' THEN 1 " "WHEN " + DbUtils::escape_sql_id(column->column_name) + " = 'false' THEN 0 " "WHEN " + DbUtils::escape_sql_id(column->column_name) + " IS NULL THEN 0 END)"; else if(column->gtype == G_TYPE_DOUBLE) trans_fields += "(CASE WHEN "+ DbUtils::escape_sql_id(column->column_name) + " = 0 THEN 0 " "WHEN " + DbUtils::escape_sql_id(column->column_name) + " != 0 THEN 1 " "WHEN " + DbUtils::escape_sql_id(column->column_name) + " IS NULL THEN 0 END)"; else if(column->gtype == G_TYPE_BOOLEAN) trans_fields += column->column_name; else trans_fields += Glib::ustring(column->column_name) + " IS NOT NULL"; break; case Field::TYPE_DATE: if(column->gtype == G_TYPE_BOOLEAN || column->gtype == GDA_TYPE_BLOB || column->gtype == G_TYPE_DOUBLE) trans_fields += "NULL"; else trans_fields += Glib::ustring("date(")+ DbUtils::escape_sql_id(column->column_name) + ')'; break; case Field::TYPE_TIME: if(column->gtype == G_TYPE_BOOLEAN || column->gtype == GDA_TYPE_BLOB || column->gtype == G_TYPE_DOUBLE) trans_fields += "NULL"; else trans_fields += Glib::ustring("time(")+ DbUtils::escape_sql_id(column->column_name) + ')'; break; case Field::TYPE_IMAGE: if(column->gtype == GDA_TYPE_BLOB) trans_fields += column->column_name; else trans_fields += "NULL"; break; default: trans_fields += column->column_name; break; }; add_column_to_server_operation(operation, changed_iter->second, i++); } else { trans_fields += column->column_name; add_column_to_server_operation(operation, column, i++); } } for(type_vec_const_fields::const_iterator iter = fields_added.begin(); iter != fields_added.end(); ++ iter) { // Add new fields to the table. Fields that have changed have already // been handled above. const sharedptr& field = *iter; type_vec_strings::const_iterator removed_iter = std::find(fields_removed.begin(), fields_removed.end(), field->get_name()); if(removed_iter == fields_removed.end()) { add_column_to_server_operation(operation, field, i++); if(!trans_fields.empty()) trans_fields += ','; const Gnome::Gda::Value default_value = field->get_default_value(); if(default_value.get_value_type() != G_TYPE_NONE && !default_value.is_null()) trans_fields += field->sql(default_value, connection); else { switch(field->get_glom_type()) { case Field::TYPE_NUMERIC: trans_fields += '0'; break; case Field::TYPE_BOOLEAN: trans_fields += '0'; break; case Field::TYPE_TEXT: trans_fields += "''"; break; default: trans_fields += "NULL"; break; } } } } try { connection->begin_transaction(TRANSACTION_NAME, Gnome::Gda::TRANSACTION_ISOLATION_UNKNOWN); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Could not begin transaction: exception=" << ex.what() << std::endl; return false; } //Do everything in one big try/catch block, //reverting the transaction if anything fail: try { connection->get_provider()->perform_operation(connection, operation); if(!trans_fields.empty()) { const Glib::ustring query_insert = "INSERT INTO " + DbUtils::escape_sql_id(TEMPORARY_TABLE_NAME) + " SELECT " + trans_fields + " FROM " + DbUtils::escape_sql_id(table_name); //std::cout << "debug: query_insert=" << query_insert << std::endl; connection->statement_execute_non_select(query_insert); connection->statement_execute_non_select("DROP TABLE " + DbUtils::escape_sql_id(table_name)); connection->statement_execute_non_select("ALTER TABLE " + DbUtils::escape_sql_id(TEMPORARY_TABLE_NAME) + " RENAME TO " + DbUtils::escape_sql_id(table_name)); connection->commit_transaction(TRANSACTION_NAME); return true; } } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception=" << ex.what() << std::endl; std::cerr << G_STRFUNC << ": Reverting the transaction." << std::endl; try { connection->rollback_transaction(TRANSACTION_NAME); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Could not revert the transaction. exception=" << ex.what() << std::endl; } } return false; } bool Sqlite::add_column(const Glib::RefPtr& connection, const Glib::ustring& table_name, const sharedptr& field) { // Sqlite does not support adding primary key columns. So recreate the table // in that case. if(!field->get_primary_key()) { return Backend::add_column(connection, table_name, field); } else { return recreate_table(connection, table_name, type_vec_strings(), type_vec_const_fields(1, field), type_mapFieldChanges()); } } bool Sqlite::drop_column(const Glib::RefPtr& connection, const Glib::ustring& table_name, const Glib::ustring& field_name) { return recreate_table(connection, table_name, type_vec_strings(1, field_name), type_vec_const_fields(), type_mapFieldChanges()); } bool Sqlite::change_columns(const Glib::RefPtr& connection, const Glib::ustring& table_name, const type_vec_const_fields& old_fields, const type_vec_const_fields& new_fields) throw() { type_mapFieldChanges fields_changed; for(type_vec_const_fields::size_type i = 0; i < old_fields.size(); ++ i) fields_changed[old_fields[i]->get_name()] = new_fields[i]; return recreate_table(connection, table_name, type_vec_strings(), type_vec_const_fields(), fields_changed); } bool Sqlite::save_backup(const SlotProgress& /* slot_progress */, const Glib::ustring& /* username */, const Glib::ustring& /* password */, const Glib::ustring& /* database_name */) { //TODO: std::cerr << G_STRFUNC << ": Not implemented."; return false; } bool Sqlite::convert_backup(const SlotProgress& /* slot_progress */, const std::string& /* base_directory */, const Glib::ustring& /* username */, const Glib::ustring& /* password */, const Glib::ustring& /* database_name */) { //TODO: std::cerr << G_STRFUNC << ": Not implemented."; return false; } bool Sqlite::supports_remote_access() const { return false; } Gnome::Gda::SqlOperatorType Sqlite::get_string_find_operator() const { return Gnome::Gda::SQL_OPERATOR_TYPE_LIKE; } const char* Sqlite::get_public_schema_name() const { return "main"; } } // namespace ConnectionPoolBackends } // namespace Glom glom-1.22.4/glom/libglom/connectionpool_backends/postgres.h0000644000175000017500000001133112234252645025255 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BACKEND_POSTGRES_H #define GLOM_BACKEND_POSTGRES_H #include #include #include namespace Glom { namespace ConnectionPoolBackends { class Postgres : public Backend { public: Postgres(); /** Check whether the libgda postgres provider is really available, * so we can connect to postgres servers, * in case the distro package has incorrect dependencies. * * @results True if everything is OK. */ static bool check_postgres_gda_client_is_available(); /** Save a backup file, using the same directory layout as used by self-hosting. */ virtual bool save_backup(const SlotProgress& slot_progress, const Glib::ustring& username, const Glib::ustring& password, const Glib::ustring& database_name); virtual bool convert_backup(const SlotProgress& slot_progress, const std::string& base_directory, const Glib::ustring& username, const Glib::ustring& password, const Glib::ustring& database_name); /** Return the quoted path to the specified PostgreSQL utility. */ static std::string get_path_to_postgres_executable(const std::string& program, bool quoted = true); private: virtual bool supports_remote_access() const; virtual Gnome::Gda::SqlOperatorType get_string_find_operator() const; virtual const char* get_public_schema_name() const; virtual bool change_columns(const Glib::RefPtr& connection, const Glib::ustring& table_name, const type_vec_const_fields& old_fields, const type_vec_const_fields& new_fields) throw(); protected: bool attempt_create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name, const Glib::ustring& host, const Glib::ustring& port, const Glib::ustring& username, const Glib::ustring& password); /** Attempt to connect to the database with the specified criteria. * @throws An ExceptionConnection if the correction failed. */ Glib::RefPtr attempt_connect(const Glib::ustring& port, const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, bool fake_connection); std::string get_self_hosting_path(bool create = false, const std::string& child_directory = std::string()); /** Get the path to the config sub-directory, optionally creating it. */ std::string get_self_hosting_config_path(bool create = false); /** Get the path to the data sub-directory, optionally creating it. */ std::string get_self_hosting_data_path(bool create = false); /** Get the path to the backup file, regardless of whether it exists. * @param base_directory Where to find the backup file, under a normal Glom directory structure. * If @a base_directory is empty then it uses get_database_directory_uri(). */ std::string get_self_hosting_backup_path(const std::string& base_directory = std::string(), bool create_parent_dir = false); bool create_directory_filepath(const std::string& filepath); bool file_exists_filepath(const std::string& filepath); bool file_exists_uri(const std::string& uri) const; /** * @param current_user_only If true then only the current user will be able to read or write the file. */ static bool create_text_file(const std::string& file_uri, const std::string& contents, bool current_user_only = false); /** * @param filepath_previous The path to which the previous .pgpass, if any was moved. * @param filepath_original The path to which filepath_previous should be moved back after the caller has finished. * @param result whether it succeeded. */ bool save_password_to_pgpass(const Glib::ustring username, const Glib::ustring& password, std::string& filepath_previous, std::string& filepath_original); protected: static Glib::ustring port_as_string(unsigned int port_num); Glib::ustring m_host; unsigned int m_port; private: float m_postgres_server_version; }; } //namespace ConnectionPoolBackends } //namespace Glom #endif //GLOM_BACKEND_POSTGRES_H glom-1.22.4/glom/libglom/connectionpool_backends/postgres_central.cc0000644000175000017500000001167512234252645027136 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include // Uncomment to see debug messages //#define GLOM_CONNECTION_DEBUG namespace Glom { namespace ConnectionPoolBackends { PostgresCentralHosted::PostgresCentralHosted() : m_try_other_ports(true) { m_list_ports.push_back("5432"); //Ubuntu Breezy seems to default to this for Postgres 7.4, and this is probably the default for most postgres installations, including Fedora. m_list_ports.push_back("5433"); //Ubuntu Dapper seems to default to this for Postgres 8.1, probably to avoid a clash with Postgres 7.4 m_list_ports.push_back("5434"); //Earlier versions of Ubuntu Feisty defaulted to this for Postgres 8.2. m_list_ports.push_back("5435"); //In case Ubuntu increases the port number again in future. m_list_ports.push_back("5436"); //In case Ubuntu increases the port number again in future. } void PostgresCentralHosted::set_host(const Glib::ustring& value) { if(value != m_host) { m_host = value; // Force us to try all ports again when connecting for the first time, then remember the working port again. Except when a specific port was set to be used. if(m_try_other_ports) m_port = 0; } } void PostgresCentralHosted::set_port(unsigned int port) { m_port = port; } void PostgresCentralHosted::set_try_other_ports(bool val) { m_try_other_ports = val; } Glib::ustring PostgresCentralHosted::get_host() const { return m_host; } unsigned int PostgresCentralHosted::get_port() const { return m_port; } bool PostgresCentralHosted::get_try_other_ports() const { return m_try_other_ports; } Glib::RefPtr PostgresCentralHosted::connect(const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, bool fake_connection) { Glib::RefPtr connection; //Try each possible network port: type_list_ports::const_iterator iter_port = m_list_ports.begin(); //Start with the remembered-as-working port: Glib::ustring port = port_as_string(m_port); if(m_port == 0) port = *iter_port ++; bool connection_possible = false; try { connection = attempt_connect(port, database, username, password, fake_connection); connection_possible = true; m_port = atoi(port.c_str()); } catch(const ExceptionConnection& ex) { // Remember port if only the database was missing connection_possible = false; if(ex.get_failure_type() == ExceptionConnection::FAILURE_NO_DATABASE) { connection_possible = true; m_port = atoi(port.c_str()); } } // Try more ports if so desired, and we don't have a connection yet if(m_try_other_ports && !connection) { while(!connection && iter_port != m_list_ports.end()) { port = *iter_port; try { connection = attempt_connect(port, database, username, password, fake_connection); connection_possible = true; m_port = atoi(port.c_str()); } catch(const ExceptionConnection& ex) { //Don't set this, because we might have previously set it to true to //show that a connection was possible with a previously-tried port: connection_possible = false; // Remember port if only the database was missing if(ex.get_failure_type() == ExceptionConnection::FAILURE_NO_DATABASE) { connection_possible = true; m_port = atoi(port.c_str()); } } // Skip if we already tried this port if(iter_port != m_list_ports.end() && *iter_port == port) ++ iter_port; } } if(connection) { //Remember working port: m_port = atoi(port.c_str()); } else { if(connection_possible) throw ExceptionConnection(ExceptionConnection::FAILURE_NO_DATABASE); else throw ExceptionConnection(ExceptionConnection::FAILURE_NO_SERVER); } return connection; } bool PostgresCentralHosted::create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name, const Glib::ustring& username, const Glib::ustring& password) { return attempt_create_database(slot_progress, database_name, get_host(), port_as_string(m_port), username, password); } } } glom-1.22.4/glom/libglom/connectionpool_backends/backend.cc0000644000175000017500000000703212234252645025137 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { ExceptionConnection::ExceptionConnection(failure_type failure) : m_failure_type(failure) { } ExceptionConnection::~ExceptionConnection() throw() { } const char* ExceptionConnection::what() const throw() { return "Glom database connection failed."; } ExceptionConnection::failure_type ExceptionConnection::get_failure_type() const { return m_failure_type; } namespace ConnectionPoolBackends { Backend::InitErrors Backend::initialize(const SlotProgress& /* slot_progress */, const Glib::ustring& /* initial_username */, const Glib::ustring& /* password */, bool /* network_shared */) { return INITERROR_NONE; } Backend::StartupErrors Backend::startup(const SlotProgress& /* slot_progress */, bool /* network_shared */) { return STARTUPERROR_NONE; } bool Backend::cleanup(const SlotProgress& /* slot_progress */) { return true; } bool Backend::set_network_shared(const SlotProgress& /* slot_progress */, bool /* network_shared */) { return true; //Success at doing nothing. } bool Backend::add_column(const Glib::RefPtr& connection, const Glib::ustring& table_name, const sharedptr& field) { Glib::RefPtr provider = connection->get_provider(); Glib::RefPtr operation = provider->create_operation(connection, Gnome::Gda::SERVER_OPERATION_ADD_COLUMN); //TODO: Quote table_name and field_name? operation->set_value_at("/COLUMN_DEF_P/TABLE_NAME", table_name); operation->set_value_at("/COLUMN_DEF_P/COLUMN_NAME", field->get_name()); operation->set_value_at("/COLUMN_DEF_P/COLUMN_TYPE", field->get_sql_type()); operation->set_value_at("/COLUMN_DEF_P/COLUMN_PKEY", field->get_primary_key()); operation->set_value_at("/COLUMN_DEF_P/COLUMN_UNIQUE", field->get_unique_key()); return provider->perform_operation(connection, operation); } bool Backend::drop_column(const Glib::RefPtr& connection, const Glib::ustring& table_name, const Glib::ustring& field_name) { Glib::RefPtr provider = connection->get_provider(); Glib::RefPtr operation = provider->create_operation(connection, Gnome::Gda::SERVER_OPERATION_DROP_COLUMN); //TODO: Quote table name and column name? operation->set_value_at("/COLUMN_DESC_P/TABLE_NAME", table_name); operation->set_value_at("/COLUMN_DESC_P/COLUMN_NAME", field_name); return provider->perform_operation(connection, operation); } void Backend::set_database_directory_uri(const std::string& directory_uri) { m_database_directory_uri = directory_uri; } std::string Backend::get_database_directory_uri() const { return m_database_directory_uri; } } // namespace ConnectionPoolBackends } // namespace Glom glom-1.22.4/glom/libglom/connectionpool_backends/postgres_self.h0000644000175000017500000000650512234252645026275 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BACKEND_POSTGRES_SELF_H #define GLOM_BACKEND_POSTGRES_SELF_H #include #include namespace Glom { namespace ConnectionPoolBackends { class PostgresSelfHosted : public Postgres { public: PostgresSelfHosted(); /** Return whether the self-hosted server is currently running. * * @result True if it is running, and false otherwise. */ bool get_self_hosting_active() const; /** Returns the port number the local postgres server is running on. * * @result The port number of the self-hosted server, or 0 if it is not * running. */ unsigned int get_port() const; /** Try to install postgres on the distro, though this will require a * distro-specific patch to the implementation. */ static bool install_postgres(const SlotProgress& slot_progress); private: virtual InitErrors initialize(const SlotProgress& slot_progress, const Glib::ustring& initial_username, const Glib::ustring& password, bool network_shared = false); virtual StartupErrors startup(const SlotProgress& slot_progress, bool network_shared = false); virtual bool cleanup(const SlotProgress& slot_progress); virtual bool set_network_shared(const SlotProgress& slot_progress, bool network_shared = true); virtual Glib::RefPtr connect(const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, bool fake_connection = false); virtual bool create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name, const Glib::ustring& username, const Glib::ustring& password); private: /** Examine ports one by one, starting at @a starting_port, in increasing * order, and return the first one that is available. */ static unsigned int discover_first_free_port(unsigned int start_port, unsigned int end_port); /** Run the command-line with the --version option to discover what version * of PostgreSQL is installed, so we can use the appropriate configuration * options when self-hosting. */ Glib::ustring get_postgresql_utils_version(const SlotProgress& slot_progress); float get_postgresql_utils_version_as_number(const SlotProgress& slot_progress); void show_active_connections(); bool m_network_shared; //These are only remembered in order to use them to provide debug //information when the PostgreSQL shutdown fails: Glib::ustring m_saved_database_name, m_saved_username, m_saved_password; }; } // namespace ConnectionPoolBackends } //namespace Glom #endif //GLOM_BACKEND_POSTGRES_SELF_H glom-1.22.4/glom/libglom/connectionpool_backends/postgres_self.cc0000644000175000017500000006230512234776363026443 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include // For g_remove #include #include #include #include #include #include #include #include #include //For stringstream #include #ifdef G_OS_WIN32 # include # include #else # include # include # include # include //For sockaddr_in #endif #include //To catch segfaults // Uncomment to see debug messages //#define GLOM_CONNECTION_DEBUG namespace Glom { namespace ConnectionPoolBackends { #define DEFAULT_CONFIG_PG_HBA_LOCAL \ "# TYPE DATABASE USER CIDR-ADDRESS METHOD\n" \ "\n" \ "# local is for Unix domain socket connections only\n" \ "# trust allows connection from the current PC without a password:\n" \ "local all all trust\n" \ "local all all md5\n" \ "\n" \ "# TCP connections from the same computer, with a password:\n" \ "host all all 127.0.0.1 255.255.255.255 md5\n" \ "# IPv6 local connections:\n" \ "host all all ::1/128 md5\n" #define DEFAULT_CONFIG_PG_HBA_REMOTE_EXTRA \ "\n" \ "# IPv4 local connections:\n" \ "host all all 0.0.0.0/0 md5\n" \ "# IPv6 local connections:\n" \ "host all all ::1/128 md5\n" #define DEFAULT_CONFIG_PG_HBA_REMOTE \ DEFAULT_CONFIG_PG_HBA_LOCAL \ DEFAULT_CONFIG_PG_HBA_REMOTE_EXTRA static const int PORT_POSTGRESQL_SELF_HOSTED_START = 5433; static const int PORT_POSTGRESQL_SELF_HOSTED_END = 5500; static const char FILENAME_DATA[] = "data"; static const char FILENAME_BACKUP[] = "backup"; PostgresSelfHosted::PostgresSelfHosted() : m_network_shared(false) { m_host = "localhost"; } bool PostgresSelfHosted::get_self_hosting_active() const { return m_port != 0; } unsigned int PostgresSelfHosted::get_port() const { return m_port; } /** Try to install postgres on the distro, though this will require a * distro-specific patch to the implementation. */ bool PostgresSelfHosted::install_postgres(const SlotProgress& /* slot_progress */) { #if 0 // This is example code for Ubuntu, and possibly Debian, // using code from the gnome-system-tools Debian/Ubuntu patches. // (But please, just fix the dependencies instead. PostgreSQL is not optional.) // // You will also need to remove the "ifdef 0"s around the code in gst-package.[h|c], // and define DISTRO_SPECIFIC_POSTGRES_INSTALL_IMPLEMENTED above. //Careful. Maybe you want a different version. //Also, Glom will start its own instance of PostgreSQL, on its own port, when it needs to, //so there is no need to start a Glom service after installation at system startup, //though it will not hurt Glom if you do that. const gchar *packages[] = { "postgresql-8.1", 0 }; const bool result = gst_packages_install(parent_window->gobj() /* parent window */, packages); if(result) { std::cout << "Glom: gst_packages_install() reports success." << std::endl; //Double-check, because gst_packages_install() incorrectly returns TRUE if it fails because //a) synaptic is already running, or //b) synaptic did not know about the package (no warning is shown in this case.) //Maybe gst_packages_install() never returns FALSE. return check_postgres_is_available_with_warning(); //This is recursive, but clicking Cancel will stop everything. } else { std::cout << "Glom: gst_packages_install() reports failure." << std::endl; return false; //Failed to install postgres. } #else return false; //Failed to install postgres because no installation technique was implemented. #endif // #if 0 } Backend::InitErrors PostgresSelfHosted::initialize(const SlotProgress& slot_progress, const Glib::ustring& initial_username, const Glib::ustring& password, bool network_shared) { m_network_shared = network_shared; if(m_database_directory_uri.empty()) { std::cerr << G_STRFUNC << ": initialize: m_self_hosting_data_uri is empty." << std::endl; return INITERROR_OTHER; } if(initial_username.empty()) { std::cerr << "PostgresSelfHosted::initialize(). Username was empty while attempting to create self-hosting database" << std::endl; return INITERROR_OTHER; } //Get the filepath of the directory that we should create: const std::string dbdir_uri = m_database_directory_uri; //std::cout << "debug: dbdir_uri=" << dbdir_uri << std::endl; if(file_exists_uri(dbdir_uri)) return INITERROR_DIRECTORY_ALREADY_EXISTS; const std::string dbdir = Glib::filename_from_uri(dbdir_uri); //std::cout << "debug: dbdir=" << dbdir << std::endl; g_assert(!dbdir.empty()); const bool dbdir_created = create_directory_filepath(dbdir); if(!dbdir_created) { std::cerr << "Couldn't create directory: " << dbdir << std::endl; return INITERROR_COULD_NOT_CREATE_DIRECTORY; } //Create the config directory: const std::string dbdir_config = get_self_hosting_config_path(true /* create */); if(dbdir_config.empty()) { std::cerr << "Couldn't create the config directory: " << dbdir << std::endl; return INITERROR_COULD_NOT_CREATE_DIRECTORY; } //Create these files: environment, pg_hba.conf, start.conf set_network_shared(slot_progress, m_network_shared); //Creates pg_hba.conf //Check that there is not an existing data directory: const std::string dbdir_data = get_self_hosting_data_path(true /* create */); if(dbdir_data.empty()) { std::cerr << "Couldn't create the data directory: " << dbdir << std::endl; return INITERROR_COULD_NOT_CREATE_DIRECTORY; } // initdb creates a new postgres database cluster: //Get file:// URI for the tmp/ directory: const std::string temp_pwfile = Utils::get_temp_file_path("glom_initdb_pwfile"); const Glib::ustring temp_pwfile_uri = Glib::filename_to_uri(temp_pwfile); const bool pwfile_creation_succeeded = create_text_file(temp_pwfile_uri, password); g_assert(pwfile_creation_succeeded); // Make sure to use double quotes for the executable path, because the // CreateProcess() API used on Windows does not support single quotes. const std::string command_initdb = get_path_to_postgres_executable("initdb") + " -D " + Glib::shell_quote(dbdir_data) + " -U " + initial_username + " --pwfile=" + Glib::shell_quote(temp_pwfile); //Note that --pwfile takes the password from the first line of a file. It's an alternative to supplying it when prompted on stdin. const bool result = Glom::Spawn::execute_command_line_and_wait(command_initdb, slot_progress); if(!result) { std::cerr << "Error while attempting to create self-hosting database." << std::endl; } const int temp_pwfile_removed = g_remove(temp_pwfile.c_str()); //Of course, we don't want this to stay around. It would be a security risk. g_assert(temp_pwfile_removed == 0); return result ? INITERROR_NONE : INITERROR_COULD_NOT_START_SERVER; } Glib::ustring PostgresSelfHosted::get_postgresql_utils_version(const SlotProgress& slot_progress) { Glib::ustring result; const std::string command = get_path_to_postgres_executable("pg_ctl") + " --version"; //The first command does not return, but the second command can check whether it succeeded: std::string output; const bool spawn_result = Glom::Spawn::execute_command_line_and_wait(command, slot_progress, output); if(!spawn_result) { std::cerr << "Error while attempting to discover the pg_ctl version." << std::endl; return result; } //Use a regex to get the version number: Glib::RefPtr regex; //We want the characters at the end: const gchar VERSION_REGEX[] = "pg_ctl \\(PostgreSQL\\) (.*)"; try { regex = Glib::Regex::create(VERSION_REGEX); } catch(const Glib::Error& ex) { std::cerr << "Glom: Glib::Regex::create() failed: " << ex.what() << std::endl; return result; } if(!regex) return result; typedef std::vector type_vec_strings; const type_vec_strings vec = regex->split(output, Glib::REGEX_MATCH_NOTEMPTY); //std::cout << "DEBUG: output == " << output << std::endl; //std::cout << "DEBUG: vec.size() == " << vec.size() << std::endl; // We get, for instance, "\n" and 8.4.1" and "\n". for(type_vec_strings::const_iterator iter = vec.begin(); iter != vec.end(); ++iter) { const Glib::ustring str = *iter; if(!str.empty()) return str; //Found. } return result; } float PostgresSelfHosted::get_postgresql_utils_version_as_number(const SlotProgress& slot_progress) { float result = 0; const Glib::ustring version_str = get_postgresql_utils_version(slot_progress); Glib::RefPtr regex; //We want the characters at the end: const gchar VERSION_REGEX[] = "^(\\d*)\\.(\\d*)"; try { regex = Glib::Regex::create(VERSION_REGEX); } catch(const Glib::Error& ex) { std::cerr << "Glom: Glib::Regex::create() failed: " << ex.what() << std::endl; return result; } if(!regex) return result; typedef std::vector type_vec_strings; const type_vec_strings vec = regex->split(version_str, Glib::REGEX_MATCH_NOTEMPTY); //std::cout << "DEBUG: str == " << version_str << std::endl; //std::cout << "DEBUG: vec.size() == " << vec.size() << std::endl; //We need to loop over the numbers because we get some "" items that we want to ignore: guint count = 0; //We want 2 numbers. for(type_vec_strings::const_iterator iter = vec.begin(); iter != vec.end(); ++iter) { //std::cout << "regex item: START" << *iter << "END" << std::endl; const Glib::ustring str = *iter; if(str.empty()) continue; const float num = atoi(str.c_str()); if(count == 0) result = num; else if(count == 1) { result += (0.1 * num); break; } ++count; } return result; } Backend::StartupErrors PostgresSelfHosted::startup(const SlotProgress& slot_progress, bool network_shared) { m_network_shared = network_shared; // Don't risk random crashes, although this really shouldn't be called // twice of course. //g_assert(!get_self_hosting_active()); if(get_self_hosting_active()) { std::cerr << G_STRFUNC << ": Already started." << std::endl; return STARTUPERROR_NONE; //Just do it once. } const std::string dbdir_uri = m_database_directory_uri; if(!(file_exists_uri(dbdir_uri))) { //TODO: Use a return enum or exception so we can tell the user about this: std::cerr << G_STRFUNC << ": The data directory could not be found: " << dbdir_uri << std::endl; return STARTUPERROR_FAILED_UNKNOWN_REASON; } const std::string dbdir = Glib::filename_from_uri(dbdir_uri); g_assert(!dbdir.empty()); const std::string dbdir_data = Glib::build_filename(dbdir, FILENAME_DATA); const Glib::ustring dbdir_data_uri = Glib::filename_to_uri(dbdir_data); if(!(file_exists_uri(dbdir_data_uri))) { const std::string dbdir_backup = Glib::build_filename(dbdir, FILENAME_BACKUP); const Glib::ustring dbdir_backup_uri = Glib::filename_to_uri(dbdir_backup); if(file_exists_uri(dbdir_backup_uri)) { std::cerr << G_STRFUNC << ": There is no data, but there is backup data." << std::endl; //Let the caller convert the backup to real data and then try again: return STARTUPERROR_FAILED_NO_DATA_HAS_BACKUP_DATA; } else { std::cerr << "ConnectionPool::create_self_hosting(): The data sub-directory could not be found." << dbdir_data_uri << std::endl; return STARTUPERROR_FAILED_NO_DATA; } } //Attempt to ensure that the config files are correct: set_network_shared(slot_progress, m_network_shared); //Creates pg_hba.conf const unsigned int available_port = discover_first_free_port(PORT_POSTGRESQL_SELF_HOSTED_START, PORT_POSTGRESQL_SELF_HOSTED_END); //std::cout << "debug: " << G_STRFUNC << ":() : debug: Available port for self-hosting: " << available_port << std::endl; if(available_port == 0) { //TODO: Use a return enum or exception so we can tell the user about this: std::cerr << G_STRFUNC << ": No port was available between " << PORT_POSTGRESQL_SELF_HOSTED_START << " and " << PORT_POSTGRESQL_SELF_HOSTED_END << std::endl; return STARTUPERROR_FAILED_UNKNOWN_REASON; } //TODO: Performance: const std::string port_as_text = Glib::Ascii::dtostr(available_port); // -D specifies the data directory. // -c config_file= specifies the configuration file // -k specifies a directory to use for the socket. This must be writable by us. // Make sure to use double quotes for the executable path, because the // CreateProcess() API used on Windows does not support single quotes. const std::string dbdir_config = Glib::build_filename(dbdir, "config"); const std::string dbdir_hba = Glib::build_filename(dbdir_config, "pg_hba.conf"); const std::string dbdir_pid = Glib::build_filename(dbdir, "pid"); const std::string listen_address = (m_network_shared ? "*" : "localhost"); const std::string command_postgres_start = get_path_to_postgres_executable("postgres") + " -D " + Glib::shell_quote(dbdir_data) + " -p " + port_as_text + " -h " + listen_address + " -c hba_file=" + Glib::shell_quote(dbdir_hba) + " -k " + Glib::shell_quote(dbdir) + " --external_pid_file=" + Glib::shell_quote(dbdir_pid); //std::cout << G_STRFUNC << ": debug: " << command_postgres_start << std::endl; // Make sure to use double quotes for the executable path, because the // CreateProcess() API used on Windows does not support single quotes. const std::string command_check_postgres_has_started = get_path_to_postgres_executable("pg_ctl") + " status -D " + Glib::shell_quote(dbdir_data); //For postgres 8.1, this is "postmaster is running". //For postgres 8.2, this is "server is running". //This is a big hack that we should avoid. murrayc. // //pg_ctl actually seems to return a 0 result code for "is running" and a 1 for not running, at least with Postgres 8.2, //so maybe we can avoid this in future. //Please do test it with your postgres version, using "echo $?" to see the result code of the last command. const std::string second_command_success_text = "is running"; //TODO: This is not a stable API. Also, watch out for localisation. //The first command does not return, but the second command can check whether it succeeded: const bool result = Glom::Spawn::execute_command_line_and_wait_until_second_command_returns_success(command_postgres_start, command_check_postgres_has_started, slot_progress, second_command_success_text); if(!result) { std::cerr << "Error while attempting to self-host a database." << std::endl; return STARTUPERROR_FAILED_UNKNOWN_REASON; } m_port = available_port; //Remember it for later. return STARTUPERROR_NONE; } void PostgresSelfHosted::show_active_connections() { Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field("*", "pg_stat_activity"); builder->select_add_target("pg_stat_activity"); Glib::RefPtr gda_connection = connect(m_saved_database_name, m_saved_username, m_saved_password); if(!gda_connection) std::cerr << G_STRFUNC << ": connection failed." << std::endl; Glib::RefPtr datamodel = DbUtils::query_execute_select(builder); if(!datamodel) std::cerr << G_STRFUNC << ": pg_stat_activity SQL query failed." << std::endl; const int rows_count = datamodel->get_n_rows(); if(datamodel->get_n_rows() < 1) std::cerr << G_STRFUNC << ": pg_stat_activity SQL query returned no rows." << std::endl; std::cout << "Active connections according to a pg_stat_activity SQL query:" << std::endl; const int cols_count = datamodel->get_n_columns(); for(int row = 0; row < rows_count; ++row) { for(int col = 0; col < cols_count; ++col) { if(col != 0) std::cout << ", "; std::cout << datamodel->get_value_at(col, row).to_string(); } std::cout << std::endl; } //Make sure that this connection does not stop a further attempt to stop the server. gda_connection->close(); } bool PostgresSelfHosted::cleanup(const SlotProgress& slot_progress) { // This seems to be called twice sometimes, so we don't assert here until // this is fixed. //g_assert(get_self_hosting_active()); if(!get_self_hosting_active()) return true; //Don't try to stop it if we have not started it. const std::string dbdir_uri = m_database_directory_uri; const std::string dbdir = Glib::filename_from_uri(dbdir_uri); g_assert(!dbdir.empty()); const std::string dbdir_data = Glib::build_filename(dbdir, FILENAME_DATA); // TODO: Detect other instances on the same computer, and use a different port number, // or refuse to continue, showing an error dialog. // -D specifies the data directory. // -c config_file= specifies the configuration file // -k specifies a directory to use for the socket. This must be writable by us. // We use "-m fast" instead of the default "-m smart" because that waits for clients to disconnect (and sometimes never succeeds). // TODO: Warn about connected clients on other computers? Warn those other users? // Make sure to use double quotes for the executable path, because the // CreateProcess() API used on Windows does not support single quotes. const std::string command_postgres_stop = get_path_to_postgres_executable("pg_ctl") + " -D " + Glib::shell_quote(dbdir_data) + " stop -m fast"; const bool result = Glom::Spawn::execute_command_line_and_wait(command_postgres_stop, slot_progress); if(!result) { std::cerr << "Error while attempting to stop self-hosting of the database. Trying again." << std::endl; //Show open connections for debugging: try { show_active_connections(); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": exception while trying to show active connections: " << ex.what() << std::endl; } //I've seen it fail when running under valgrind, and there are reports of failures in bug #420962. //Maybe it will help to try again: const bool result = Glom::Spawn::execute_command_line_and_wait(command_postgres_stop, slot_progress); if(!result) { std::cerr << "Error while attempting (for a second time) to stop self-hosting of the database." << std::endl; return false; } } m_port = 0; return true; } bool PostgresSelfHosted::set_network_shared(const SlotProgress& /* slot_progress */, bool network_shared) { //TODO: Use slot_progress, while doing async IO for create_text_file(). m_network_shared = network_shared; const std::string dbdir_uri = m_database_directory_uri; const std::string dbdir = Glib::filename_from_uri(dbdir_uri); const std::string dbdir_uri_config = dbdir_uri + "/config"; const char* default_conf_contents = 0; // Choose the configuration contents based on // whether we want to be network-shared: //const float postgresql_version = get_postgresql_utils_version_as_number(slot_progress); //std::cout << "DEBUG: postgresql_version=" << postgresql_version << std::endl; default_conf_contents = m_network_shared ? DEFAULT_CONFIG_PG_HBA_REMOTE : DEFAULT_CONFIG_PG_HBA_LOCAL; //std::cout << "DEBUG: default_conf_contents=" << default_conf_contents << std::endl; const bool hba_conf_creation_succeeded = create_text_file(dbdir_uri_config + "/pg_hba.conf", default_conf_contents); g_assert(hba_conf_creation_succeeded); if(!hba_conf_creation_succeeded) return false; return hba_conf_creation_succeeded; } static bool on_timeout_delay(const Glib::RefPtr& mainloop) { //Allow our mainloop.run() to return: if(mainloop) mainloop->quit(); return false; } Glib::RefPtr PostgresSelfHosted::connect(const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, bool fake_connection) { if(!get_self_hosting_active()) { throw ExceptionConnection(ExceptionConnection::FAILURE_NO_BACKEND); //TODO: But there is a backend. It's just not ready. return Glib::RefPtr(); } Glib::RefPtr result; bool keep_trying = true; guint count_retries = 0; const guint MAX_RETRIES_KNOWN_PASSWORD = 30; /* seconds */ const guint MAX_RETRIES_EVER = 60; /* seconds */ while(keep_trying) { try { result = attempt_connect(port_as_string(m_port), database, username, password, fake_connection); } catch(const ExceptionConnection& ex) { if(ex.get_failure_type() == ExceptionConnection::FAILURE_NO_SERVER) { //It must be using a default password, so any failure would not be due to a wrong password. //However, pg_ctl sometimes reports success before it is really ready to let us connect, //so in this case we can just keep trying until it works, with a very long timeout. count_retries++; const guint max_retries = m_network_shared ? MAX_RETRIES_EVER : MAX_RETRIES_KNOWN_PASSWORD; if(count_retries > max_retries) { keep_trying = false; continue; } std::cout << "debug: " << G_STRFUNC << ": Waiting and retrying the connection due to suspected too-early success of pg_ctl. retries=" << count_retries << ", max_retries=" << m_network_shared << std::endl; //Wait: Glib::RefPtr mainloop = Glib::MainLoop::create(false); sigc::connection connection_timeout = Glib::signal_timeout().connect( sigc::bind(sigc::ptr_fun(&on_timeout_delay), sigc::ref(mainloop)), 1000 /* 1 second */); mainloop->run(); connection_timeout.disconnect(); keep_trying = true; continue; } else { throw ex; } } keep_trying = false; } //Save the connection details _only_ for later debug use: m_saved_database_name = database; m_saved_username = username; m_saved_password = password; return result; } bool PostgresSelfHosted::create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name, const Glib::ustring& username, const Glib::ustring& password) { return attempt_create_database(slot_progress, database_name, "localhost", port_as_string(m_port), username, password); } unsigned int PostgresSelfHosted::discover_first_free_port(unsigned int start_port, unsigned int end_port) { //Open a socket so we can try to bind it to a port: const int fd = socket(AF_INET, SOCK_STREAM, 0); if(fd == -1) { #ifdef G_OS_WIN32 std::cerr << "Create socket: " << WSAGetLastError() << std::endl; #else perror("Create socket"); #endif //G_OS_WIN32 return 0; } //This code was originally suggested by Lennart Poettering. struct ::sockaddr_in sa; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; guint16 port_to_try = start_port; while (port_to_try <= end_port) { sa.sin_port = htons(port_to_try); const int result = bind(fd, (sockaddr*)&sa, sizeof(sa)); bool available = false; if(result == 0) available = true; else if(result < 0) { #ifdef G_OS_WIN32 available = (WSAGetLastError() != WSAEADDRINUSE); #endif // G_OS_WIN32 //Some BSDs don't have this. //But watch out - if you don't include errno.h then this won't be //defined on Linux either, but you really do need to check for it. #ifdef EADDRINUSE available = (errno != EADDRINUSE); #endif #ifdef EPORTINUSE //Linux doesn't have this. available = (errno != EPORTINUSE); #endif } else { //std::cout << "debug: " << G_STRFUNC << ": port in use: " << port_to_try << std::endl; } if(available) { #ifdef G_OS_WIN32 closesocket(fd); #else close(fd); #endif //G_OS_WIN32 //std::cout << "debug: " << G_STRFUNC << ": Found: returning " << port_to_try << std::endl; return port_to_try; } ++port_to_try; } #ifdef G_OS_WIN32 closesocket(fd); #else close(fd); #endif //G_OS_WIN32 std::cerr << G_STRFUNC << ": No port was available." << std::endl; return 0; } } // namespace ConnectionPoolBackends } // namespcae Glom glom-1.22.4/glom/libglom/connectionpool_backends/postgres_central.h0000644000175000017500000000370112234252645026767 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BACKEND_POSTGRES_CENTRAL_H #define GLOM_BACKEND_POSTGRES_CENTRAL_H #include #include namespace Glom { namespace ConnectionPoolBackends { class PostgresCentralHosted : public Postgres { public: PostgresCentralHosted(); /** 0 means any port * Other ports will be tried if the specified port fails. */ void set_host(const Glib::ustring& value); void set_port(unsigned int port); void set_try_other_ports(bool val); Glib::ustring get_host() const; unsigned int get_port() const; bool get_try_other_ports() const; private: virtual Glib::RefPtr connect(const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, bool fake_connection = false); virtual bool create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name, const Glib::ustring& username, const Glib::ustring& password); private: typedef std::vector type_list_ports; type_list_ports m_list_ports; bool m_try_other_ports; }; } //namespace ConnectionPoolBackends } //namespace Glom #endif //GLOM_BACKEND_POSTGRES_CENTRAL_H glom-1.22.4/glom/libglom/connectionpool_backends/sqlite.h0000644000175000017500000000643112234252645024715 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BACKEND_SQLITE_H #define GLOM_BACKEND_SQLITE_H #include #include #include namespace Glom { namespace ConnectionPoolBackends { class Sqlite : public Backend { public: Sqlite(); private: virtual bool supports_remote_access() const; virtual Gnome::Gda::SqlOperatorType get_string_find_operator() const; virtual const char* get_public_schema_name() const; bool add_column_to_server_operation(const Glib::RefPtr& operation, GdaMetaTableColumn* column, unsigned int i); bool add_column_to_server_operation(const Glib::RefPtr& operation, const sharedptr& column, unsigned int i); typedef std::vector type_vec_strings; //typedef std::vector > type_vec_fields; typedef std::map > type_mapFieldChanges; bool recreate_table(const Glib::RefPtr& connection, const Glib::ustring& table_name, const type_vec_strings& fields_removed, const type_vec_const_fields& fields_added, const type_mapFieldChanges& fields_changed) throw(); virtual bool add_column(const Glib::RefPtr& connection, const Glib::ustring& table_name, const sharedptr& field); virtual bool drop_column(const Glib::RefPtr& connection, const Glib::ustring& table_name, const Glib::ustring& field_name); virtual bool change_columns(const Glib::RefPtr& connection, const Glib::ustring& table_name, const type_vec_const_fields& old_fields, const type_vec_const_fields& new_fields) throw(); virtual Glib::RefPtr connect(const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, bool fake_connection = false); /** Creates a new database. */ virtual bool create_database(const SlotProgress& slot_progress, const Glib::ustring& database_name, const Glib::ustring& username, const Glib::ustring& password); virtual bool save_backup(const SlotProgress& slot_progress, const Glib::ustring& username, const Glib::ustring& password, const Glib::ustring& database_name); virtual bool convert_backup(const SlotProgress& slot_progress, const std::string& base_directory, const Glib::ustring& username, const Glib::ustring& password, const Glib::ustring& database_name); }; } //namespace ConnectionPoolBackends } //namespace Glom #endif //GLOM_BACKEND_SQLITE_H glom-1.22.4/glom/libglom/xml_utils.h0000644000175000017500000000672212234252646020555 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #ifndef GLOM_XML_UTILS_H #define GLOM_XML_UTILS_H namespace Glom { namespace XmlUtils { Glib::ustring get_node_attribute_value(const xmlpp::Element* node, const Glib::ustring& strAttributeName); void set_node_attribute_value(xmlpp::Element* node, const Glib::ustring& strAttributeName, const Glib::ustring& strValue); xmlpp::Element* get_node_child_named(const xmlpp::Element* node, const Glib::ustring& strName); xmlpp::Element* get_node_child_named_with_add(xmlpp::Element* node, const Glib::ustring& strName); /// If the attribute is not there, then the default will be returned. bool get_node_attribute_value_as_bool(const xmlpp::Element* node, const Glib::ustring& strAttributeName, bool value_default = false); guint get_node_attribute_value_as_decimal(const xmlpp::Element* node, const Glib::ustring& strAttributeName, guint value_default = 0); double get_node_attribute_value_as_decimal_double(const xmlpp::Element* node, const Glib::ustring& strAttributeName); float get_node_attribute_value_as_float(const xmlpp::Element* node, const Glib::ustring& strAttributeName); void set_node_attribute_value_as_bool(xmlpp::Element* node, const Glib::ustring& strAttributeName, bool value = true, bool value_default = false); void set_node_attribute_value_as_float( xmlpp::Element* node, const Glib::ustring& strAttributeName, float value ); void set_node_attribute_value_as_value(xmlpp::Element* node, const Glib::ustring& strAttributeName, const Gnome::Gda::Value& value, Field::glom_field_type field_type); void set_node_text_child_as_value(xmlpp::Element* node, const Gnome::Gda::Value& value, Field::glom_field_type field_type); Gnome::Gda::Value get_node_attribute_value_as_value(const xmlpp::Element* node, const Glib::ustring& strAttributeName, Field::glom_field_type field_type); ///If value is equal to the default then no attribute will be set, to save text space in the XML file. void set_node_attribute_value_as_decimal(xmlpp::Element* node, const Glib::ustring& strAttributeName, guint value, guint value_default = 0); // This is required by the report builder, so it cannot be disabled // in client only mode void set_node_attribute_value_as_decimal_double(xmlpp::Element* node, const Glib::ustring& strAttributeName, double value); Gnome::Gda::Value get_node_text_child_as_value(const xmlpp::Element* node, Field::glom_field_type field_type); Glib::ustring get_child_text_node(const xmlpp::Element* node, const Glib::ustring& child_node_name); void set_child_text_node(xmlpp::Element* node, const Glib::ustring& child_node_name, const Glib::ustring& text); } //namespace XmlUtils } //namespace Glom #endif //GLOM_XML_UTILS_H glom-1.22.4/glom/libglom/calcinprogress.cc0000644000175000017500000000166412234252645021710 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include namespace Glom { CalcInProgress::CalcInProgress() : m_calc_in_progress(false), m_calc_finished(false) { } } //namespace Glom glom-1.22.4/glom/libglom/filelist.am0000644000175000017500000002042212234776363020516 0ustar00murraycmurrayc00000000000000## Copyright (c) 2010 Openismus GmbH ## ## This file is part of Glom. ## ## Glom is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published ## by the Free Software Foundation, either version 2 of the License, ## or (at your option) any later version. ## ## Glom is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ## See the GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see . # Public header files by installation directory: libglom_toplevel_headers = \ glom/libglom/appstate.h \ glom/libglom/init.h \ glom/libglom/libglom_config.h \ glom/libglom/sharedptr.h \ glom/libglom/standard_table_prefs_fields.h \ glom/libglom/utils.h \ glom/libglom/db_utils.h \ glom/libglom/report_builder.h \ glom/libglom/translations_po.h libglom_data_structure_headers = \ glom/libglom/data_structure/database_title.h \ glom/libglom/data_structure/choicevalue.h \ glom/libglom/data_structure/field.h \ glom/libglom/data_structure/fieldtypes.h \ glom/libglom/data_structure/foundset.h \ glom/libglom/data_structure/has_title_singular.h \ glom/libglom/data_structure/glomconversions.h \ glom/libglom/data_structure/groupinfo.h \ glom/libglom/data_structure/numeric_format.h \ glom/libglom/data_structure/print_layout.h \ glom/libglom/data_structure/privileges.h \ glom/libglom/data_structure/relationship.h \ glom/libglom/data_structure/report.h \ glom/libglom/data_structure/system_prefs.h \ glom/libglom/data_structure/tableinfo.h \ glom/libglom/data_structure/translatable_item.h libglom_ds_layout_headers = \ glom/libglom/data_structure/layout/custom_title.h \ glom/libglom/data_structure/layout/formatting.h \ glom/libglom/data_structure/layout/layoutgroup.h \ glom/libglom/data_structure/layout/layoutitem.h \ glom/libglom/data_structure/layout/layoutitem_button.h \ glom/libglom/data_structure/layout/layoutitem_calendarportal.h \ glom/libglom/data_structure/layout/layoutitem_field.h \ glom/libglom/data_structure/layout/layoutitem_image.h \ glom/libglom/data_structure/layout/layoutitem_line.h \ glom/libglom/data_structure/layout/layoutitem_notebook.h \ glom/libglom/data_structure/layout/layoutitem_placeholder.h \ glom/libglom/data_structure/layout/layoutitem_portal.h \ glom/libglom/data_structure/layout/layoutitem_text.h \ glom/libglom/data_structure/layout/layoutitem_withformatting.h \ glom/libglom/data_structure/layout/usesrelationship.h libglom_ds_l_report_parts_headers = \ glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_footer.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_header.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_summary.h \ glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.h libglom_document_headers = \ glom/libglom/document/document.h \ glom/libglom/document/view.h libglom_d_bakery_headers = \ glom/libglom/document/bakery/document.h \ glom/libglom/document/bakery/document_xml.h libglom_d_b_view_headers = \ glom/libglom/document/bakery/view/view.h \ glom/libglom/document/bakery/view/view_composite.h \ glom/libglom/document/bakery/view/viewbase.h libglom_headers = \ $(libglom_toplevel_headers) \ $(libglom_data_structure_headers) \ $(libglom_ds_layout_headers) \ $(libglom_ds_l_report_parts_headers) \ $(libglom_document_headers) \ $(libglom_d_bakery_headers) \ $(libglom_d_b_view_headers) # Private source and header files: libglom_sources = \ glom/libglom/appstate.cc \ glom/libglom/calcinprogress.cc \ glom/libglom/calcinprogress.h \ glom/libglom/connectionpool.cc \ glom/libglom/connectionpool.h \ glom/libglom/db_utils.cc \ glom/libglom/db_utils.h \ glom/libglom/glom_postgres.cc \ glom/libglom/glom_postgres.h \ glom/libglom/gst-package.c \ glom/libglom/gst-package.h \ glom/libglom/init.cc \ glom/libglom/privs.cc \ glom/libglom/privs.h \ glom/libglom/report_builder.cc \ glom/libglom/report_builder.h \ glom/libglom/spawn_with_feedback.cc \ glom/libglom/spawn_with_feedback.h \ glom/libglom/translations_po.cc \ glom/libglom/translations_po.h \ glom/libglom/utils.cc \ glom/libglom/utils.h \ glom/libglom/xsl_utils.cc \ glom/libglom/xsl_utils.h \ glom/libglom/xml_utils.cc \ glom/libglom/xml_utils.h \ glom/libglom/connectionpool_backends/backend.cc \ glom/libglom/connectionpool_backends/backend.h \ glom/libglom/data_structure/database_title.cc \ glom/libglom/data_structure/choicevalue.cc \ glom/libglom/data_structure/field.cc \ glom/libglom/data_structure/fieldtypes.cc \ glom/libglom/data_structure/foundset.cc \ glom/libglom/data_structure/glomconversions.cc \ glom/libglom/data_structure/groupinfo.cc \ glom/libglom/data_structure/has_title_singular.cc \ glom/libglom/data_structure/numeric_format.cc \ glom/libglom/data_structure/print_layout.cc \ glom/libglom/data_structure/privileges.cc \ glom/libglom/data_structure/relationship.cc \ glom/libglom/data_structure/report.cc \ glom/libglom/data_structure/system_prefs.cc \ glom/libglom/data_structure/tableinfo.cc \ glom/libglom/data_structure/translatable_item.cc \ glom/libglom/data_structure/layout/custom_title.cc \ glom/libglom/data_structure/layout/formatting.cc \ glom/libglom/data_structure/layout/layoutgroup.cc \ glom/libglom/data_structure/layout/layoutitem.cc \ glom/libglom/data_structure/layout/layoutitem_button.cc \ glom/libglom/data_structure/layout/layoutitem_calendarportal.cc \ glom/libglom/data_structure/layout/layoutitem_field.cc \ glom/libglom/data_structure/layout/layoutitem_image.cc \ glom/libglom/data_structure/layout/layoutitem_line.cc \ glom/libglom/data_structure/layout/layoutitem_notebook.cc \ glom/libglom/data_structure/layout/layoutitem_placeholder.cc \ glom/libglom/data_structure/layout/layoutitem_portal.cc \ glom/libglom/data_structure/layout/layoutitem_text.cc \ glom/libglom/data_structure/layout/layoutitem_withformatting.cc \ glom/libglom/data_structure/layout/usesrelationship.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_footer.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_header.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_summary.cc \ glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc \ glom/libglom/document/document.cc \ glom/libglom/document/bakery/document.cc \ glom/libglom/document/bakery/document_xml.cc \ glom/libglom/document/bakery/view/view.cc \ glom/libglom/document/bakery/view/view_composite.cc \ glom/libglom/document/bakery/view/viewbase.cc \ glom/libglom/python_embed/py_glom_record.cc \ glom/libglom/python_embed/py_glom_record.h \ glom/libglom/python_embed/py_glom_related.cc \ glom/libglom/python_embed/py_glom_related.h \ glom/libglom/python_embed/py_glom_relatedrecord.cc \ glom/libglom/python_embed/py_glom_relatedrecord.h \ glom/libglom/python_embed/py_glom_ui.cc \ glom/libglom/python_embed/py_glom_ui.h \ glom/libglom/python_embed/py_glom_ui_callbacks.h \ glom/libglom/python_embed/pygdavalue_conversions.cc \ glom/libglom/python_embed/pygdavalue_conversions.h \ glom/libglom/connectionpool_backends/sqlite.cc \ glom/libglom/connectionpool_backends/sqlite.h \ glom/libglom/connectionpool_backends/postgres.cc \ glom/libglom/connectionpool_backends/postgres.h \ glom/libglom/connectionpool_backends/postgres_central.cc \ glom/libglom/connectionpool_backends/postgres_central.h if !GLOM_ENABLE_CLIENT_ONLY libglom_sources += \ glom/libglom/connectionpool_backends/postgres_self.cc \ glom/libglom/connectionpool_backends/postgres_self.h endif glom-1.22.4/glom/libglom/xsl_utils.h0000644000175000017500000000263512234252646020562 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_XSL_UTILS_H #define GLOM_XSL_UTILS_H #include #include #include #include namespace Glom { ///field, ascending typedef std::pair< sharedptr, bool> type_pair_sort_field; typedef std::vector type_sort_clause; namespace GlomXslUtils { /** * @result the generated HTML. */ Glib::ustring transform(const xmlpp::Document& xml_document, const std::string& xsl_file_path); } //namespace GlomXslUtils } //namespace Glom #endif //GLOM_XSL_UTILS_H glom-1.22.4/glom/libglom/report_builder.h0000644000175000017500000000775212234252646021562 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_REPORT_BUILDER_H #define GLOM_REPORT_BUILDER_H #include #include #include #include #include #include #include namespace Glom { class ReportBuilder { public: explicit ReportBuilder(const Glib::ustring& locale); virtual ~ReportBuilder(); static sharedptr create_standard_list_report(const Document* document, const Glib::ustring& table_name); //TODO: Remove set_document() and get_document()? void set_document(Document* document); //void set_report(const Glib::ustring& table_name, const sharedptr& report); //sharedptr get_report(); /** * @result The HTML of the generated report. */ Glib::ustring report_build(const FoundSet& found_set, const sharedptr& report); /** * @result The filepath of a temporary file containing the generated HTML file. */ std::string report_build_and_save(const FoundSet& found_set, const sharedptr& report); private: bool report_build_groupby(const FoundSet& found_set_parent, xmlpp::Element& parent_node, const sharedptr& group_by); bool report_build_groupby_children(const FoundSet& found_set, xmlpp::Element& nodeGroupBy, const sharedptr& group_by); bool report_build_summary(const FoundSet& found_set_parent, xmlpp::Element& parent_node, const sharedptr& summary); bool report_build_headerfooter(const FoundSet& found_set, xmlpp::Element& parent_node, const sharedptr& group); typedef std::vector< sharedptr > type_vecLayoutItems; typedef std::vector< sharedptr > type_vecLayoutFields; bool report_build_records(const FoundSet& found_set, xmlpp::Element& parent_node, const type_vecLayoutItems& items, bool one_record_only = false); bool report_build_records_get_fields(const FoundSet& found_set, const sharedptr& group, type_vecLayoutFields& items); bool report_build_records_field(const FoundSet& found_set, xmlpp::Element& nodeParent, const sharedptr& field, const Glib::RefPtr& datamodel, guint row, guint& colField, bool vertical = false); bool report_build_records_text(const FoundSet& found_set, xmlpp::Element& nodeParent, const sharedptr& textobject, bool vertical = false); bool report_build_records_image(const FoundSet& found_set, xmlpp::Element& nodeParent, const sharedptr& imageobject, bool vertical = false); bool report_build_records_vertical_group(const FoundSet& found_set, xmlpp::Element& vertical_group_node, const sharedptr& group, const Glib::RefPtr& datamodel, guint row, guint& field_index); Document* get_document(); Document* m_document; Glib::ustring m_locale; }; } //namespace Glom #endif // GLOM_REPORT_BUILDER_H glom-1.22.4/glom/libglom/privs.h0000644000175000017500000000735012234776363017705 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PRIVS_H #define GLOM_PRIVS_H #include namespace Glom { /** A class to get user/group information for a database. */ class Privs : public GlomPostgres { public: /** This is apparently undocumented in PostgreSQL, * but if we try to create a user or group * with more characters (or bytes?) than this then * a truncated version of it will be read back. */ enum constant { MAX_ROLE_SIZE = 63 }; /** Get the groups with access to the database. */ static type_vec_strings get_database_groups(); /** Get users with access to the database. * If the resuilt is empty even when @a group_name is empty then it was not possible to get the list of users, probably due to a permissions problem. * @param group_name Get only users in this group. */ static type_vec_strings get_database_users(const Glib::ustring& group_name = Glib::ustring()); /** Discover whether there is already a user with a real password, * instead of just a default glom user and default password, * The user should be forced to choose a user/password when network sharing is active. */ static bool get_developer_user_exists_with_password(); /** Discover whether the default developer user exists (which has a known password). * The user should be forced to choose a user/password when network sharing is active, * and this default user should no longer exist in that case. */ static bool get_default_developer_user_exists(); /** Get the standard username and password used for the no-password user, * which should only be used when network sharing is not active. */ static Glib::ustring get_default_developer_user_name(Glib::ustring& password); static Privileges get_table_privileges(const Glib::ustring& group_name, const Glib::ustring& table_name); static bool set_table_privileges(const Glib::ustring& group_name, const Glib::ustring& table_name, const Privileges& privs, bool developer_privs = false); static Glib::ustring get_user_visible_group_name(const Glib::ustring& group_name); /** Get the groups that the user is a member of. */ static type_vec_strings get_groups_of_user(const Glib::ustring& user); static bool get_user_is_in_group(const Glib::ustring& user, const Glib::ustring& group); /** Get the privileges (access rights) that the current user has. */ static Privileges get_current_privs(const Glib::ustring& table_name); private: static bool on_privs_privileges_cache_timeout(const Glib::ustring& table_name); typedef std::map type_map_privileges; //A map of table names to cached privileges: static type_map_privileges m_privileges_cache; // Store the cache for a few seconds in case it // is immediately requested again, to avoid // introspecting again, which is slow. typedef std::map type_map_cache_timeouts; static type_map_cache_timeouts m_map_cache_timeouts; }; } //namespace Glom #endif //GLOM_PRIVS_H glom-1.22.4/glom/libglom/privs.cc0000644000175000017500000004130312234776363020037 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "privs.h" #include #include #include //#include #include #include namespace Glom { Privs::type_map_privileges Privs::m_privileges_cache; Privs::type_map_cache_timeouts Privs::m_map_cache_timeouts; Privs::type_vec_strings Privs::get_database_groups() { type_vec_strings result; Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field("groname", "pg_group"); builder->select_add_target("pg_group"); Glib::RefPtr data_model = DbUtils::query_execute_select(builder); if(data_model) { const int rows_count = data_model->get_n_rows(); for(int row = 0; row < rows_count; ++row) { const Gnome::Gda::Value value = data_model->get_value_at(0, row); const Glib::ustring name = value.get_string(); result.push_back(name); } } return result; } bool Privs::get_default_developer_user_exists() { Glib::ustring default_password; const Glib::ustring default_user = get_default_developer_user_name(default_password); const type_vec_strings users = get_database_users(); type_vec_strings::const_iterator iterFind = std::find(users.begin(), users.end(), default_user); if(iterFind != users.end()) return true; //We assume that the password is what it should be and that it has developer rights. return false; //The default user is not there. } bool Privs::get_developer_user_exists_with_password() { Glib::ustring default_password; const Glib::ustring default_user = get_default_developer_user_name(default_password); const type_vec_strings users = get_database_users(); for(type_vec_strings::const_iterator iter = users.begin(); iter != users.end(); ++iter) { const Glib::ustring user = *iter; if(user == default_user) continue; if(get_user_is_in_group(user, GLOM_STANDARD_GROUP_NAME_DEVELOPER)) return true; } return false; } Glib::ustring Privs::get_default_developer_user_name(Glib::ustring& password) { password = "glom_default_developer_password"; return "glom_default_developer_user"; } Privs::type_vec_strings Privs::get_database_users(const Glib::ustring& group_name) { //TODO_Moved: BusyCursor cursor(AppWindow::get_appwindow()); //Note that these queries can fail with "permission denied for relation pg_shadow" if the user is not a superuser. //So the caller should interpret an empty result for group_name="" as an error, //because there should always be at least one user. type_vec_strings result; if(group_name.empty()) { //pg_shadow contains the users. pg_users is a view of pg_shadow without the password. Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field("usename", "pg_shadow"); builder->select_add_target("pg_shadow"); Glib::RefPtr data_model = DbUtils::query_execute_select(builder); if(data_model) { const int rows_count = data_model->get_n_rows(); for(int row = 0; row < rows_count; ++row) { const Gnome::Gda::Value value = data_model->get_value_at(0, row); const Glib::ustring name = value.get_string(); result.push_back(name); } } } else { Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field("groname", "pg_group"); builder->select_add_field("grolist", "pg_group"); builder->select_add_target("pg_group"); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id("groname", "pg_group"), builder->add_expr(group_name))); //TODO: Show SQL. Glib::RefPtr data_model = DbUtils::query_execute_select(builder); if(data_model && data_model->get_n_rows()) { const int rows_count = data_model->get_n_rows(); for(int row = 0; row < rows_count; ++row) { const Gnome::Gda::Value value = data_model->get_value_at(1, row); //Column 1 is the /* the user list. //pg_group is a string, formatted, bizarrely, like so: "{100, 101}". Glib::ustring group_list; if(!value.is_null()) group_list = value.get_string(); type_vec_strings vecUserIds = pg_list_separate(group_list); for(type_vec_strings::const_iterator iter = vecUserIds.begin(); iter != vecUserIds.end(); ++iter) { //TODO_Performance: Can we do this in one SQL SELECT? Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field("usename", "pg_user"); builder->select_add_target("pg_user"); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id("usesysid", "pg_user"), builder->add_expr(*iter))); Glib::RefPtr data_model = DbUtils::query_execute_select(builder); if(data_model && data_model->get_n_rows() && data_model->get_n_columns()) { const Gnome::Gda::Value value = data_model->get_value_at(0, 0); //std::cout << G_STRFUNC << "DEBUG: username=" << value.get_string() << std::endl; result.push_back(value.get_string()); } else { std::cerr << G_STRFUNC << ": user not found in pg_user table: " << *iter << std::endl; } } } } } return result; } bool Privs::set_table_privileges(const Glib::ustring& group_name, const Glib::ustring& table_name, const Privileges& privs, bool developer_privs) { if(group_name.empty() || table_name.empty()) { return false; } //Change the permission in the database: //Build the SQL statement: //Grant or revoke: Glib::ustring strQuery = "GRANT"; //TODO: Revoke the ones that are not specified. //What to grant or revoke: Glib::ustring strPrivilege; if(developer_privs) strPrivilege = "ALL PRIVILEGES"; else { if(privs.m_view) strPrivilege += "SELECT"; if(privs.m_edit) { if(!strPrivilege.empty()) strPrivilege += ", "; strPrivilege += "UPDATE"; } if(privs.m_create) { if(!strPrivilege.empty()) strPrivilege += ", "; strPrivilege += "INSERT"; } if(privs.m_delete) { if(!strPrivilege.empty()) strPrivilege += ", "; strPrivilege += "DELETE"; } } strQuery += " " + strPrivilege + " ON " + DbUtils::escape_sql_id(table_name) + " "; //This must match the Grant or Revoke: strQuery += "TO"; strQuery += " GROUP " + DbUtils::escape_sql_id(group_name); const bool test = DbUtils::query_execute_string(strQuery); if(!test) { std::cerr << G_STRFUNC << ": GRANT failed." << std::endl; return false; } if( (table_name != GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME) && privs.m_create ) { //To create a record, you will usually need write access to the autoincrements table, //so grant this too: Privileges priv_autoincrements; priv_autoincrements.m_view = true; priv_autoincrements.m_edit = true; if(!set_table_privileges(group_name, GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME, priv_autoincrements)) { std::cerr << G_STRFUNC << ": GRANT failed on autoincrements table." << std::endl; return false; } } return true; } static Glib::RefPtr get_connection() { sharedptr sharedconnection; try { sharedconnection = ConnectionPool::get_and_connect(); } catch (const Glib::Error& error) { std::cerr << G_STRFUNC << ": " << error.what() << std::endl; } if(!sharedconnection) { std::cerr << G_STRFUNC << ": No connection yet." << std::endl; return Glib::RefPtr(0); } Glib::RefPtr gda_connection = sharedconnection->get_gda_connection(); return gda_connection; } Privileges Privs::get_table_privileges(const Glib::ustring& group_name, const Glib::ustring& table_name) { Privileges result; if(group_name == GLOM_STANDARD_GROUP_NAME_DEVELOPER) { //Always give developers full access: result.m_view = true; result.m_edit = true; result.m_create = true; result.m_delete = true; return result; } //Get the permissions: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); const Glib::ustring function_name = "has_table_privilege"; std::vector args_base; Glib::RefPtr connection = get_connection(); if(!connection) { std::cerr << ": Could not get a connection." << std::endl; return result; } //TODO: Why doesn't this need to be quoted like table_name. //The group names are quoted when we create them: //For some reason, this is what PostgreSQL wants: SELECT has_table_privilege('Some Group', '"Some Table"', 'SELECT'); //However, note that libgda does seem to escape characters here (for instance, changing ' to ''). //const Glib::ustring group_name_for_arg = connection->quote_sql_identifier(group_name); const Glib::ustring group_name_for_arg = group_name; args_base.push_back(builder->add_expr(group_name_for_arg)); //The table name must be quoted if it needs to be quoted, //but not quoted if it is does not need to be quoted, //because it must match how it was created, and libgda probably did not quote it unless necessary. const Glib::ustring table_name_for_arg = connection->quote_sql_identifier(table_name); args_base.push_back(builder->add_expr(table_name_for_arg)); std::vector args = args_base; args.push_back(builder->add_expr("SELECT")); builder->add_field_value_id(builder->add_function(function_name, args)); args = args_base; args.push_back(builder->add_expr("UPDATE")); builder->add_field_value_id(builder->add_function(function_name, args)); args = args_base; args.push_back(builder->add_expr("INSERT")); builder->add_field_value_id(builder->add_function(function_name, args)); args = args_base; args.push_back(builder->add_expr("DELETE")); builder->add_field_value_id(builder->add_function(function_name, args)); //const Glib::ustring sql_debug = Utils::sqlbuilder_get_full_query(builder); //std::cout << "DEBUG: " << sql_debug << std::endl; Glib::RefPtr data_model = DbUtils::query_execute_select(builder); if(!data_model || (data_model->get_n_rows() <= 0)) { std::cerr << G_STRFUNC << ": The query returned no data." << std::endl; return result; } if(data_model->get_n_columns() < 4) { std::cerr << G_STRFUNC << ": The query did not return enough columns." << std::endl; return result; } Gnome::Gda::Value value = data_model->get_value_at(0, 0); result.m_view = value.get_boolean(); value = data_model->get_value_at(1, 0); result.m_edit = value.get_boolean(); value = data_model->get_value_at(2, 0); result.m_create = value.get_boolean(); value = data_model->get_value_at(3, 0); result.m_delete = value.get_boolean(); //std::cout << G_STRFUNC << ": group_name=" << group_name << ", table_name=" << table_name << ", returning create=" << result.m_create << std::endl; return result; } Glib::ustring Privs::get_user_visible_group_name(const Glib::ustring& group_name) { Glib::ustring result = group_name; //Remove the special prefix: const Glib::ustring prefix = "glom_"; if(result.substr(0, prefix.size()) == prefix) result = result.substr(prefix.size()); return result; } Privs::type_vec_strings Privs::get_groups_of_user(const Glib::ustring& user) { //TODO_Performance type_vec_strings result; //Look at each group: type_vec_strings groups = get_database_groups(); for(type_vec_strings::const_iterator iter = groups.begin(); iter != groups.end(); ++iter) { //See whether the user is in this group: if(get_user_is_in_group(user, *iter)) { //Add the group to the result: result.push_back(*iter); } } return result; } bool Privs::get_user_is_in_group(const Glib::ustring& user, const Glib::ustring& group) { const type_vec_strings users = get_database_users(group); type_vec_strings::const_iterator iterFind = std::find(users.begin(), users.end(), user); return (iterFind != users.end()); } bool Privs::on_privs_privileges_cache_timeout(const Glib::ustring& table_name) { //std::cout << "debug: " << G_STRFUNC << ": table=" << table_name << std::endl; //Forget the cached privileges after a few seconds: type_map_privileges::iterator iter = m_privileges_cache.find(table_name); if(iter != m_privileges_cache.end()) { //std::cout << "debug: " << G_STRFUNC << ": Cleared cache for table=" << table_name << std::endl; m_privileges_cache.erase(iter); } return false; //Don't call this again. } Privileges Privs::get_current_privs(const Glib::ustring& table_name) { if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name is empty." << std::endl; return Privileges(); } //TODO_Performance: There's lots of database access here. //We could maybe replace some with the postgres has_table_* function(). //TODO_Moved: BusyCursor cursor(AppWindow::get_appwindow()); //Return a cached value if possible. //(If it is in the cache then it's fairly recent) type_map_privileges::const_iterator iter = m_privileges_cache.find(table_name); if(iter != m_privileges_cache.end()) { //std::cout << "debug: " << G_STRFUNC << ": Returning cache." << std::endl; return iter->second; } //Get the up-to-date privileges from the database: Privileges result; //std::cout << "debug: " << G_STRFUNC << ": Getting non-cached." << std::endl; ConnectionPool* connection_pool = ConnectionPool::get_instance(); const Glib::ustring current_user = connection_pool->get_user(); //Is the user in the special developers group? /* type_vec_strings developers = get_database_users(GLOM_STANDARD_GROUP_NAME_DEVELOPER); type_vec_strings::const_iterator iterFind = std::find(developers.begin(), developers.end(), current_user); if(iterFind != developers.end()) { result.m_developer = true; } */ sharedptr sharedconnection = connection_pool->connect(); if(sharedconnection && sharedconnection->get_gda_connection()->supports_feature(Gnome::Gda::CONNECTION_FEATURE_USERS)) { //Get the "true" rights for any groups that the user is in: type_vec_strings groups = get_groups_of_user(current_user); for(type_vec_strings::const_iterator iter = groups.begin(); iter != groups.end(); ++iter) { Privileges privs = get_table_privileges(*iter, table_name); if(privs.m_view) result.m_view = true; if(privs.m_edit) result.m_edit = true; if(privs.m_create) result.m_create = true; if(privs.m_delete) result.m_delete = true; } } else { // If the database doesn't support users we have privileges to do everything result.m_view = true; result.m_edit = true; result.m_create = true; result.m_delete = true; } m_privileges_cache[table_name] = result; //Connect a timeout to invalidate the cache after a short time: //In theory, the privileges could change (via another client) //during this time, but it is fairly unlikely. //TODO: Make sure we handle the failure well in that unlikely case. //Stop the existing timeout if it has not run yet. type_map_cache_timeouts::iterator iter_connection = m_map_cache_timeouts.find(table_name); if(iter_connection != m_map_cache_timeouts.end()) iter_connection->second.disconnect(); m_map_cache_timeouts[table_name] = Glib::signal_timeout().connect_seconds( sigc::bind( sigc::ptr_fun(&Privs::on_privs_privileges_cache_timeout), table_name ), 30 /* seconds */); return result; } } //namespace Glom glom-1.22.4/glom/libglom/document/0000755000175000017500000000000012235000126020154 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/libglom/document/document.cc0000644000175000017500000057476512234776363022357 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2009 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include //#include //To get GLOM_DTD_INSTALL_DIR - dependent on configure prefix. #include //For std::find_if(). #include //For stringstream #include namespace Glom { static const char GLOM_NODE_CONNECTION[] = "connection"; static const char GLOM_ATTRIBUTE_CONNECTION_SELF_HOSTED[] = "self_hosted"; //deprecated. static const char GLOM_ATTRIBUTE_CONNECTION_HOSTING_MODE[] = "hosting_mode"; static const char GLOM_ATTRIBUTE_CONNECTION_HOSTING_POSTGRES_CENTRAL[] = "postgres_central"; static const char GLOM_ATTRIBUTE_CONNECTION_HOSTING_POSTGRES_SELF[] = "postgres_self"; static const char GLOM_ATTRIBUTE_CONNECTION_HOSTING_SQLITE[] = "sqlite"; static const char GLOM_ATTRIBUTE_CONNECTION_NETWORK_SHARED[] = "network_shared"; static const char GLOM_ATTRIBUTE_CONNECTION_SERVER[] = "server"; static const char GLOM_ATTRIBUTE_CONNECTION_PORT[] = "port"; static const char GLOM_ATTRIBUTE_CONNECTION_TRY_OTHER_PORTS[] = "try_other_ports"; static const char GLOM_ATTRIBUTE_CONNECTION_USER[] = "user"; static const char GLOM_ATTRIBUTE_CONNECTION_DATABASE[] = "database"; static const char GLOM_NODE_DATA_LAYOUT_GROUPS[] = "data_layout_groups"; static const char GLOM_NODE_DATA_LAYOUT_GROUP[] = "data_layout_group"; static const char GLOM_ATTRIBUTE_COLUMNS_COUNT[] = "columns_count"; static const char GLOM_ATTRIBUTE_BORDER_WIDTH[] = "border_width"; static const char GLOM_NODE_DATA_LAYOUTS[] = "data_layouts"; static const char GLOM_NODE_DATA_LAYOUT[] = "data_layout"; static const char GLOM_ATTRIBUTE_LAYOUT_PLATFORM[] = "platform"; static const char GLOM_ATTRIBUTE_PARENT_TABLE_NAME[] = "parent_table"; static const char GLOM_NODE_DATA_LAYOUT_NOTEBOOK[] = "data_layout_notebook"; static const char GLOM_NODE_DATA_LAYOUT_PORTAL[] = "data_layout_portal"; static const char GLOM_NODE_DATA_LAYOUT_PORTAL_NAVIGATIONRELATIONSHIP[] = "portal_navigation_relationship"; static const char GLOM_ATTRIBUTE_PORTAL_ROWS_COUNT_MIN[] = "portal_rows_count_min"; static const char GLOM_ATTRIBUTE_PORTAL_ROWS_COUNT_MAX[] = "portal_rows_count_max"; static const char GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE[] = "navigation_type"; static const char GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE_AUTOMATIC[] = "automatic"; static const char GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE_SPECIFIC[] = "specific"; static const char GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE_NONE[] = "none"; static const char GLOM_NODE_DATA_LAYOUT_CALENDAR_PORTAL[] = "data_layout_calendar_portal"; static const char GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_ROW_HEIGHT[] = "row_height"; static const char GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_ROW_LINE_WIDTH[] = "row_line_width"; static const char GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_ROW_LINE_COLOR[] = "column_line_color"; static const char GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_COLUMN_LINE_WIDTH[] = "row_line_width"; static const char GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_LINE_COLOR[] = "line_color"; static const char GLOM_ATTRIBUTE_PORTAL_CALENDAR_DATE_FIELD[] = "date_field"; static const char GLOM_NODE_DATA_LAYOUT_ITEM[] = "data_layout_item"; //A field. static const char GLOM_NODE_LAYOUT_ITEM_CUSTOM_TITLE[] = "title_custom"; static const char GLOM_NODE_TABLE_TITLE_SINGULAR[] = "title_singular"; //such as "Customer" instead of "Customers". static const char GLOM_ATTRIBUTE_LAYOUT_ITEM_CUSTOM_TITLE_USE[] = "use_custom"; static const char GLOM_ATTRIBUTE_LAYOUT_ITEM_COLUMN_WIDTH[] = "column_width"; static const char GLOM_NODE_DATA_LAYOUT_BUTTON[] = "data_layout_button"; static const char GLOM_NODE_DATA_LAYOUT_TEXTOBJECT[] = "data_layout_text"; static const char GLOM_NODE_DATA_LAYOUT_TEXTOBJECT_TEXT[] = "text"; static const char GLOM_NODE_DATA_LAYOUT_IMAGEOBJECT[] = "data_layout_image"; static const char GLOM_ATTRIBUTE_DATA_LAYOUT_IMAGEOBJECT_IMAGE[] = "text"; static const char GLOM_NODE_DATA_LAYOUT_LINE[] = "data_layout_line"; static const char GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_START_X[] = "start_x"; static const char GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_START_Y[] = "start_y"; static const char GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_END_X[] = "end_x"; static const char GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_END_Y[] = "end_y"; static const char GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_WIDTH[] = "line_width"; static const char GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_COLOR[] = "color"; static const char GLOM_ATTRIBUTE_DATA_LAYOUT_ITEM_FIELD_USE_DEFAULT_FORMATTING[] = "use_default_formatting"; static const char GLOM_NODE_DATA_LAYOUT_ITEM_GROUPBY[] = "data_layout_item_groupby"; static const char GLOM_NODE_DATA_LAYOUT_GROUP_SECONDARYFIELDS[] = "secondary_fields"; static const char GLOM_NODE_DATA_LAYOUT_ITEM_VERTICALGROUP[] = "data_layout_item_verticalgroup"; static const char GLOM_NODE_DATA_LAYOUT_ITEM_SUMMARY[] = "data_layout_item_summary"; static const char GLOM_NODE_DATA_LAYOUT_ITEM_FIELDSUMMARY[] = "data_layout_item_fieldsummary"; static const char GLOM_NODE_DATA_LAYOUT_ITEM_HEADER[] = "data_layout_item_header"; static const char GLOM_NODE_DATA_LAYOUT_ITEM_FOOTER[] = "data_layout_item_footer"; static const char GLOM_NODE_TABLE[] = "table"; static const char GLOM_NODE_FIELDS[] = "fields"; static const char GLOM_NODE_FIELD[] = "field"; static const char GLOM_ATTRIBUTE_PRIMARY_KEY[] = "primary_key"; static const char GLOM_ATTRIBUTE_DEFAULT_VALUE[] = "default_value"; static const char GLOM_ATTRIBUTE_UNIQUE[] = "unique"; static const char GLOM_ATTRIBUTE_AUTOINCREMENT[] = "auto_increment"; static const char GLOM_DEPRECATED_ATTRIBUTE_CALCULATION[] = "calculation"; static const char GLOM_NODE_CALCULATION[] = "calculation"; static const char GLOM_ATTRIBUTE_TYPE[] = "type"; static const char GLOM_NODE_FIELD_LOOKUP[] = "field_lookup"; static const char GLOM_NODE_RELATIONSHIPS[] = "relationships"; static const char GLOM_NODE_RELATIONSHIP[] = "relationship"; static const char GLOM_ATTRIBUTE_KEY[] = "key"; static const char GLOM_ATTRIBUTE_OTHER_TABLE[] = "other_table"; static const char GLOM_ATTRIBUTE_OTHER_KEY[] = "other_key"; static const char GLOM_ATTRIBUTE_AUTO_CREATE[] = "auto_create"; static const char GLOM_ATTRIBUTE_ALLOW_EDIT[] = "allow_edit"; static const char GLOM_NODE_GROUPS[] = "groups"; static const char GLOM_NODE_GROUP[] = "group"; static const char GLOM_ATTRIBUTE_DEVELOPER[] = "developer"; static const char GLOM_NODE_TABLE_PRIVS[] = "table_privs"; static const char GLOM_ATTRIBUTE_TABLE_NAME[] = "table_name"; static const char GLOM_ATTRIBUTE_PRIV_VIEW[] = "priv_view"; static const char GLOM_ATTRIBUTE_PRIV_EDIT[] = "priv_edit"; static const char GLOM_ATTRIBUTE_PRIV_CREATE[] = "priv_create"; static const char GLOM_ATTRIBUTE_PRIV_DELETE[] = "priv_delete"; static const char GLOM_ATTRIBUTE_FORMAT_VERSION[] = "format_version"; static const char GLOM_ATTRIBUTE_IS_EXAMPLE[] = "is_example"; static const char GLOM_ATTRIBUTE_IS_BACKUP[] = "is_backup"; static const char GLOM_DEPRECATED_ATTRIBUTE_CONNECTION_DATABASE_TITLE[] = "database_title"; //deprecated in favour of GLOM_ATTRIBUTE_TITLE. static const char GLOM_NODE_STARTUP_SCRIPT[] = "startup_script"; static const char GLOM_ATTRIBUTE_TRANSLATION_ORIGINAL_LOCALE[] = "translation_original_locale"; static const char GLOM_ATTRIBUTE_NAME[] = "name"; static const char GLOM_ATTRIBUTE_TITLE[] = "title"; static const char GLOM_ATTRIBUTE_HIDDEN[] = "hidden"; static const char GLOM_ATTRIBUTE_DEFAULT[] = "default"; static const char GLOM_ATTRIBUTE_OVERVIEW_X[] = "overview_x"; static const char GLOM_ATTRIBUTE_OVERVIEW_Y[] = "overview_y"; static const char GLOM_ATTRIBUTE_FIELD[] = "field"; static const char GLOM_ATTRIBUTE_EDITABLE[] = "editable"; static const char GLOM_NODE_EXAMPLE_ROWS[] = "example_rows"; static const char GLOM_NODE_EXAMPLE_ROW[] = "example_row"; static const char GLOM_NODE_VALUE[] = "value"; static const char GLOM_ATTRIBUTE_COLUMN[] = "column"; static const char GLOM_DEPRECATED_ATTRIBUTE_BUTTON_SCRIPT[] = "script"; static const char GLOM_NODE_BUTTON_SCRIPT[] = "script"; static const char GLOM_ATTRIBUTE_SORT_ASCENDING[] = "sort_ascending"; static const char GLOM_ATTRIBUTE_RELATIONSHIP_NAME[] = "relationship"; static const char GLOM_ATTRIBUTE_RELATED_RELATIONSHIP_NAME[] = "related_relationship"; static const char GLOM_NODE_REPORTS[] = "reports"; static const char GLOM_NODE_REPORT[] = "report"; static const char GLOM_ATTRIBUTE_REPORT_SHOW_TABLE_TITLE[] = "show_table_title"; static const char GLOM_NODE_REPORT_ITEM_GROUPBY_GROUPBY[] = "groupby"; static const char GLOM_NODE_REPORT_ITEM_GROUPBY_SORTBY[] = "sortby"; static const char GLOM_ATTRIBUTE_LAYOUT_ITEM_FIELDSUMMARY_SUMMARYTYPE[] = "summarytype"; static const char GLOM_NODE_PRINT_LAYOUTS[] = "print_layouts"; static const char GLOM_NODE_PRINT_LAYOUT[] = "print_layout"; static const char GLOM_ATTRIBUTE_PRINT_LAYOUT_SHOW_GRID[] = "show_grid"; static const char GLOM_ATTRIBUTE_PRINT_LAYOUT_SHOW_RULES[] = "show_rules"; static const char GLOM_ATTRIBUTE_PRINT_LAYOUT_SHOW_OUTLINES[] = "show_outlines"; static const char GLOM_ATTRIBUTE_PRINT_LAYOUT_PAGE_COUNT[] = "page_count"; static const char GLOM_NODE_HORIZONTAL_RULE[] = "horizonal_rule"; static const char GLOM_NODE_VERTICAL_RULE[] = "vertical_rule"; static const char GLOM_ATTRIBUTE_RULE_POSITION[] = "position"; static const char GLOM_NODE_FORMAT[] = "formatting"; static const char GLOM_ATTRIBUTE_FORMAT_THOUSANDS_SEPARATOR[] = "format_thousands_separator"; static const char GLOM_ATTRIBUTE_FORMAT_DECIMAL_PLACES_RESTRICTED[] = "format_decimal_places_restricted"; static const char GLOM_ATTRIBUTE_FORMAT_DECIMAL_PLACES[] = "format_decimal_places"; static const char GLOM_ATTRIBUTE_FORMAT_CURRENCY_SYMBOL[] = "format_currency_symbol"; static const char GLOM_ATTRIBUTE_FORMAT_USE_ALT_NEGATIVE_COLOR[] = "format_use_alt_negative_color"; //Just a bool, not a color. static const char GLOM_ATTRIBUTE_FORMAT_TEXT_MULTILINE[] = "format_text_multiline"; static const char GLOM_ATTRIBUTE_FORMAT_TEXT_MULTILINE_HEIGHT_LINES[] = "format_text_multiline_height_lines"; static const guint GLOM_ATTRIBUTE_FORMAT_TEXT_MULTILINE_HEIGHT_LINES_DEFAULT = 6; static const char GLOM_ATTRIBUTE_FORMAT_TEXT_FONT[] = "font"; static const char GLOM_ATTRIBUTE_FORMAT_TEXT_COLOR_FOREGROUND[] = "color_fg"; static const char GLOM_ATTRIBUTE_FORMAT_TEXT_COLOR_BACKGROUND[] = "color_bg"; static const char GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT[] = "alignment_horizontal"; static const char GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT_AUTO[] = "auto"; static const char GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT_LEFT[] = "left"; static const char GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT_RIGHT[] = "right"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_RESTRICTED[] = "choices_restricted"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_RESTRICTED_AS_RADIO_BUTTONS[] = "choices_restricted_radiobuttons"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_CUSTOM[] = "choices_custom"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_CUSTOM_LIST[] = "custom_choice_list"; static const char GLOM_NODE_FORMAT_CUSTOM_CHOICE[] = "custom_choice"; static const char GLOM_ATTRIBUTE_VALUE[] = "value"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED[] = "choices_related"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_RELATIONSHIP[] = "choices_related_relationship"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_FIELD[] = "choices_related_field"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_EXTRA_LAYOUT[] = "choices_related_extra_layout"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_SECOND[] = "choices_related_second"; //deprecated static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_SHOW_ALL[] = "choices_related_show_all"; static const char GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_SORTBY[] = "choices_related_sortby"; static const char GLOM_NODE_TRANSLATIONS_SET[] = "trans_set"; static const char GLOM_NODE_TRANSLATION[] = "trans"; static const char GLOM_ATTRIBUTE_TRANSLATION_LOCALE[] = "loc"; static const char GLOM_ATTRIBUTE_TRANSLATION_VALUE[] = "val"; static const char GLOM_NODE_POSITION[] = "position"; static const char GLOM_ATTRIBUTE_POSITION_X[] = "x"; static const char GLOM_ATTRIBUTE_POSITION_Y[] = "y"; static const char GLOM_ATTRIBUTE_POSITION_WIDTH[] = "width"; static const char GLOM_ATTRIBUTE_POSITION_HEIGHT[] = "height"; static const char GLOM_NODE_PAGE_SETUP[] = "page_setup"; //Its text child is the keyfile for a GtkPageSetup static const char GLOM_NODE_LIBRARY_MODULES[] = "library_modules"; static const char GLOM_NODE_LIBRARY_MODULE[] = "module"; static const char GLOM_ATTRIBUTE_LIBRARY_MODULE_NAME[] = "name"; static const char GLOM_ATTRIBUTE_LIBRARY_MODULE_SCRIPT[] = "script"; //deprecated //A built-in relationship that is available for every table: static const char GLOM_RELATIONSHIP_NAME_SYSTEM_PROPERTIES[] = "system_properties"; /// Can be used with std::find_if() to find a layout with the same parent_table and layout_name. template class predicate_Layout { public: predicate_Layout(const Glib::ustring& parent_table, const Glib::ustring& layout_name, const Glib::ustring& layout_platform) : m_parent_table(parent_table), m_layout_name(layout_name), m_layout_platform(layout_platform) { } bool operator() (const T_Element& element) { return (element.m_parent_table == m_parent_table) && (element.m_layout_name == m_layout_name) && (element.m_layout_platform == m_layout_platform); } private: Glib::ustring m_parent_table, m_layout_name, m_layout_platform; }; Document::Document() : m_hosting_mode(HOSTING_MODE_DEFAULT), m_network_shared(false), m_connection_port(0), m_connection_try_other_ports(false), m_block_cache_update(false), m_block_modified_set(false), m_allow_auto_save(true), //Save all changes immediately, by default. m_is_example(false), m_is_backup(false), m_opened_from_browse(false) { m_database_title = sharedptr::create(); //Prevent autosaving during the constructor: set_allow_autosave(false); //Prevent saving while we modify the document. m_document_format_version = get_latest_known_document_format_version(); //Default to this for new documents. //Conscious use of virtual methods in a constructor: set_file_extension("glom"); set_dtd_name("glom_document.dtd"); //set_DTD_Location(GLOM_DTD_INSTALL_DIR); //Determined at configure time. It still looks in the working directory first. //The xmlns URI does not need to be something that actually exists. //I think it is just a unique ID. murrayc. //It helps the MIME-type system to recognize the file type. set_dtd_root_node_name("glom_document", "http://glom.org/glom_document" /* xmlns ID */); //We don't use set_write_formatted() because it doesn't handle text nodes well. //We use add_indenting_white_space_to_node() instead later. //Set default database name: //This is also the XML attribute default value, //but that isn't available for new documents. if(get_connection_server().empty()) set_connection_server("localhost"); m_app_state.signal_userlevel_changed().connect( sigc::mem_fun(*this, &Document::on_app_state_userlevel_changed) ); set_modified(false); set_allow_autosave(true); } Document::~Document() { } Document::HostingMode Document::get_hosting_mode() const { return m_hosting_mode; } void Document::set_network_shared(bool shared) { if(shared != m_network_shared) { m_network_shared = shared; set_modified(); } } bool Document::get_network_shared() const { bool shared = m_network_shared; //Enforce constraints: const HostingMode hosting_mode = get_hosting_mode(); if(hosting_mode == HOSTING_MODE_POSTGRES_CENTRAL) shared = true; //Central hosting means that it must be shared on the network. else if(hosting_mode == HOSTING_MODE_SQLITE) shared = false; //sqlite does not allow network sharing. return shared; } std::string Document::get_connection_self_hosted_directory_uri() const { const std::string uri_file = get_file_uri(); if(uri_file.empty()) { std::cerr << G_STRFUNC << ": file_uri is empty." << std::endl; return std::string(); } else { //Use Gio::File API to construct the URI: Glib::RefPtr file = Gio::File::create_for_uri(uri_file); Glib::RefPtr parent = file->get_parent(); Glib::RefPtr datadir; if(parent) { switch(m_hosting_mode) { case HOSTING_MODE_POSTGRES_SELF: datadir = parent->get_child("glom_postgres_data"); break; case HOSTING_MODE_POSTGRES_CENTRAL: datadir = parent; break; case HOSTING_MODE_SQLITE: datadir = parent; break; default: g_assert_not_reached(); break; } if(datadir) return datadir->get_uri(); } } std::cerr << G_STRFUNC << ": returning empty string." << std::endl; return std::string(); } Glib::ustring Document::get_connection_user() const { return m_connection_user; } Glib::ustring Document::get_connection_server() const { return m_connection_server; } Glib::ustring Document::get_connection_database() const { return m_connection_database; } unsigned int Document::get_connection_port() const { return m_connection_port; } bool Document::get_connection_try_other_ports() const { return m_connection_try_other_ports; } void Document::set_connection_user(const Glib::ustring& strVal) { if(strVal != m_connection_user) { m_connection_user = strVal; //We don't call set_modified(), because this is not saved in the document: set_modified(); } } void Document::set_hosting_mode(HostingMode mode) { if(mode != m_hosting_mode) { m_hosting_mode = mode; set_modified(); } } void Document::set_connection_server(const Glib::ustring& strVal) { if(strVal != m_connection_server) { m_connection_server = strVal; set_modified(); } } void Document::set_connection_database(const Glib::ustring& strVal) { if(strVal != m_connection_database) { m_connection_database = strVal; set_modified(); } } void Document::set_connection_port(unsigned int port_number) { if(port_number != m_connection_port) { m_connection_port = port_number; set_modified(); } } void Document::set_connection_try_other_ports(bool val) { if(val != m_connection_try_other_ports) { m_connection_try_other_ports = val; set_modified(); } } void Document::set_relationship(const Glib::ustring& table_name, const sharedptr& relationship) { //Find the existing relationship: type_tables::iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { DocumentTableInfo& info = iterFind->second; //Look for the relationship with this name: bool existing = false; const Glib::ustring relationship_name = glom_get_sharedptr_name(relationship); for(type_vec_relationships::iterator iter = info.m_relationships.begin(); iter != info.m_relationships.end(); ++iter) { if((*iter)->get_name() == relationship_name) { *iter = relationship; //Changes the relationship. All references (sharedptrs) to the relationship will get the informatin too, because it is shared. existing = true; } } if(!existing) { //Add a new one if it's not there. info.m_relationships.push_back(relationship); } } } sharedptr Document::create_relationship_system_preferences(const Glib::ustring& table_name) { sharedptr relationship = sharedptr::create(); relationship->set_name(GLOM_RELATIONSHIP_NAME_SYSTEM_PROPERTIES); relationship->set_title_original(_("System Preferences")); relationship->set_from_table(table_name); relationship->set_to_table(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); relationship->set_allow_edit(false); return relationship; } sharedptr Document::create_table_system_preferences() { type_vec_fields fields_ignored; return create_table_system_preferences(fields_ignored); } sharedptr Document::create_table_system_preferences(type_vec_fields& fields) { sharedptr prefs_table_info = sharedptr::create(); prefs_table_info->set_name(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); prefs_table_info->set_title_original(_("System Preferences")); prefs_table_info->set_hidden(true); fields.clear(); sharedptr primary_key(new Field()); //It's not used, because there's only one record, but we must have one. primary_key->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_ID); primary_key->set_glom_type(Field::TYPE_NUMERIC); fields.push_back(primary_key); sharedptr field_name(new Field()); field_name->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_NAME); field_name->set_title_original(_("System Name")); field_name->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_name); sharedptr field_org_name(new Field()); field_org_name->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_NAME); field_org_name->set_title_original(_("Organisation Name")); field_org_name->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_org_name); sharedptr field_org_logo(new Field()); field_org_logo->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_LOGO); field_org_logo->set_title_original(_("Organisation Logo")); field_org_logo->set_glom_type(Field::TYPE_IMAGE); fields.push_back(field_org_logo); sharedptr field_org_address_street(new Field()); field_org_address_street->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_STREET); field_org_address_street->set_title_original(_("Street")); field_org_address_street->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_org_address_street); sharedptr field_org_address_street2(new Field()); field_org_address_street2->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_STREET2); field_org_address_street2->set_title_original(_("Street (line 2)")); field_org_address_street2->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_org_address_street2); sharedptr field_org_address_town(new Field()); field_org_address_town->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_TOWN); field_org_address_town->set_title_original(_("City")); field_org_address_town->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_org_address_town); sharedptr field_org_address_county(new Field()); field_org_address_county->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_COUNTY); field_org_address_county->set_title_original(_("State")); field_org_address_county->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_org_address_county); sharedptr field_org_address_country(new Field()); field_org_address_country->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_COUNTRY); field_org_address_country->set_title_original(_("Country")); field_org_address_country->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_org_address_country); sharedptr field_org_address_postcode(new Field()); field_org_address_postcode->set_name(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_POSTCODE); field_org_address_postcode->set_title_original(_("Zip Code")); field_org_address_postcode->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_org_address_postcode); return prefs_table_info; } bool Document::get_relationship_is_system_properties(const sharedptr& relationship) { return relationship && (relationship->get_name() == GLOM_RELATIONSHIP_NAME_SYSTEM_PROPERTIES); } sharedptr Document::get_relationship(const Glib::ustring& table_name, const Glib::ustring& relationship_name) const { sharedptr result; if(relationship_name == GLOM_RELATIONSHIP_NAME_SYSTEM_PROPERTIES) { return create_relationship_system_preferences(table_name); } type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { const DocumentTableInfo& info = iterFind->second; //Look for the relationship with this name: for(type_vec_relationships::const_iterator iter = info.m_relationships.begin(); iter != info.m_relationships.end(); ++iter) { if(*iter && ((*iter)->get_name() == relationship_name)) { result = *iter; } } } return result; } Document::type_vec_relationships Document::get_relationships(const Glib::ustring& table_name, bool plus_system_prefs) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { type_vec_relationships result = iterFind->second.m_relationships; //Add the system properties if necessary: if(plus_system_prefs) { if(std::find_if(result.begin(), result.end(), predicate_FieldHasName(GLOM_RELATIONSHIP_NAME_SYSTEM_PROPERTIES)) == result.end()) result.push_back(create_relationship_system_preferences(table_name)); } return result; } else return type_vec_relationships(); } void Document::set_relationships(const Glib::ustring& table_name, const type_vec_relationships& vecRelationships) //TODO_shared_relationships { if(!table_name.empty()) { DocumentTableInfo& info = get_table_info_with_add(table_name); info.m_relationships = vecRelationships; set_modified(); } } void Document::remove_relationship(const sharedptr& relationship) { //Get the table that this relationship is part of: type_tables::iterator iter = m_tables.find(relationship->get_from_table()); if(iter != m_tables.end()) { DocumentTableInfo& info = iter->second; const Glib::ustring relationship_name = glom_get_sharedptr_name(relationship); //Find the relationship and remove it: type_vec_relationships::iterator iterRel = std::find_if(info.m_relationships.begin(), info.m_relationships.end(), predicate_FieldHasName(relationship_name)); if(iterRel != info.m_relationships.end()) { info.m_relationships.erase(iterRel); set_modified(); } //Remove relationship from any layouts: DocumentTableInfo::type_layouts::iterator iterLayouts = info.m_layouts.begin(); while(iterLayouts != info.m_layouts.end()) { LayoutInfo& layout_info = *iterLayouts; type_list_layout_groups::iterator iterGroups = layout_info.m_layout_groups.begin(); while(iterGroups != layout_info.m_layout_groups.end()) { //Remove any layout parts that use this relationship: sharedptr group = *iterGroups; sharedptr uses_rel = sharedptr::cast_dynamic(group); if(uses_rel && uses_rel->get_has_relationship_name()) { if(*(uses_rel->get_relationship()) == *relationship) //TODO_Performance: Slow when there are many translations. { layout_info.m_layout_groups.erase(iterGroups); iterGroups = layout_info.m_layout_groups.begin(); //Start again because we changed the structure. continue; } } if(group) group->remove_relationship(relationship); ++iterGroups; } ++iterLayouts; } //Remove relationshp from any reports: for(DocumentTableInfo::type_reports::iterator iterReports = info.m_reports.begin(); iterReports != info.m_reports.end(); ++iterReports) { sharedptr report = iterReports->second; sharedptr group = report->get_layout_group(); //Remove the field wherever it is a related field: group->remove_relationship(relationship); } } } void Document::remove_field(const Glib::ustring& table_name, const Glib::ustring& field_name) { //Remove the field itself: type_tables::iterator iterFindTable = m_tables.find(table_name); if(iterFindTable != m_tables.end()) { type_vec_fields& vecFields = iterFindTable->second.m_fields; type_vec_fields::iterator iterFind = std::find_if( vecFields.begin(), vecFields.end(), predicate_FieldHasName(field_name) ); if(iterFind != vecFields.end()) //If it was found: { //Remove it: vecFields.erase(iterFind); set_modified(); } } //Remove any relationships that use this field: for(type_tables::iterator iter = m_tables.begin(); iter != m_tables.end(); ++iter) { DocumentTableInfo& info = iter->second; if(!(info.m_relationships.empty())) { type_vec_relationships::iterator iterRel = info.m_relationships.begin(); bool something_changed = true; while(something_changed && !info.m_relationships.empty()) { sharedptr relationship = *iterRel; if( ((relationship->get_from_table() == table_name) && (relationship->get_from_field() == field_name)) || ((relationship->get_to_table() == table_name) && (relationship->get_to_field() == field_name)) ) { //Loop again, because we have changed the structure: remove_relationship(relationship); //Also removes anything that uses the relationship. something_changed = true; iterRel = info.m_relationships.begin(); } else { ++iterRel; if(iterRel == info.m_relationships.end()) something_changed = false; //We've looked at them all, without changing things. } } } //Remove field from any layouts: for(DocumentTableInfo::type_layouts::iterator iterLayouts = info.m_layouts.begin(); iterLayouts != info.m_layouts.end(); ++iterLayouts) { LayoutInfo& layout_info = *iterLayouts; for(type_list_layout_groups::iterator iter = layout_info.m_layout_groups.begin(); iter != layout_info.m_layout_groups.end(); ++iter) { sharedptr group = *iter; if(!group) continue; //Remove regular field from the layout: const Glib::ustring layout_table_name = info.m_info->get_name(); group->remove_field(layout_table_name, table_name, field_name); } } //Remove field from any reports: for(DocumentTableInfo::type_reports::iterator iterReports = info.m_reports.begin(); iterReports != info.m_reports.end(); ++iterReports) { sharedptr report = iterReports->second; sharedptr group = report->get_layout_group(); //Remove regular fields if the field is in this layout's table: const Glib::ustring layout_table_name = info.m_info->get_name(); group->remove_field(layout_table_name, table_name, field_name); } } } void Document::remove_table(const Glib::ustring& table_name) { type_tables::iterator iter = m_tables.find(table_name); if(iter != m_tables.end()) { m_tables.erase(iter); set_modified(); } //Remove any relationships that use this table: for(type_tables::iterator iter = m_tables.begin(); iter != m_tables.end(); ++iter) { DocumentTableInfo& info = iter->second; if(!(info.m_relationships.empty())) { type_vec_relationships::iterator iterRel = info.m_relationships.begin(); bool something_changed = true; while(something_changed && !info.m_relationships.empty()) { sharedptr relationship = *iterRel; if(relationship->get_to_table() == table_name) { //Loop again, because we have changed the structure: remove_relationship(relationship); //Also removes anything that uses the relationship. something_changed = true; iterRel = info.m_relationships.begin(); } else { ++iterRel; if(iterRel == info.m_relationships.end()) something_changed = false; //We've looked at them all, without changing things. } } } } } Document::type_vec_fields Document::get_table_fields(const Glib::ustring& table_name) const { type_vec_fields result; if(!table_name.empty()) { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { if(iterFind->second.m_fields.empty()) { std::cerr << G_STRFUNC << ": table found, but m_fields is empty. table_name=" << table_name << std::endl; } return iterFind->second.m_fields; } else { //It's a standard table, not saved in the document: if(table_name == GLOM_STANDARD_TABLE_PREFS_TABLE_NAME) { type_vec_fields fields; create_table_system_preferences(fields); result = fields; } else { //std::cerr << G_STRFUNC << ": table not found in document: " << table_name << std::endl; } } } else { //std::cerr << G_STRFUNC << ": table name is empty." << std::endl; } //Hide any system fields: type_vec_fields::iterator iterFind = std::find_if(result.begin(), result.end(), predicate_FieldHasName(GLOM_STANDARD_FIELD_LOCK)); if(iterFind != result.end()) result.erase(iterFind); return result; } void Document::set_table_fields(const Glib::ustring& table_name, const type_vec_fields& vecFields) { if(!table_name.empty()) { if(vecFields.empty()) { std::cerr << ": vecFields is empty: table_name=" << table_name << std::endl; } DocumentTableInfo& info = get_table_info_with_add(table_name); const bool will_change = true; //This won't work because we didn't clone the fields before changing them: (info.m_fields != vecFields); //TODO: Does this do a deep comparison? info.m_fields = vecFields; set_modified(will_change); } } sharedptr Document::get_field(const Glib::ustring& table_name, const Glib::ustring& strFieldName) const { type_vec_fields vecFields = get_table_fields(table_name); type_vec_fields::iterator iterFind = std::find_if( vecFields.begin(), vecFields.end(), predicate_FieldHasName(strFieldName) ); if(iterFind != vecFields.end()) //If it was found: { return *iterFind; //A reference, not a copy. } return sharedptr(); } sharedptr Document::get_field_primary_key(const Glib::ustring& table_name) const { type_vec_fields vecFields = get_table_fields(table_name); for(type_vec_fields::const_iterator iter = vecFields.begin(); iter != vecFields.end(); ++iter) { sharedptr field = *iter; if(field && field->get_primary_key()) return field; } return sharedptr(); } void Document::change_field_name(const Glib::ustring& table_name, const Glib::ustring& strFieldNameOld, const Glib::ustring& strFieldNameNew) { type_tables::iterator iterFindTable = m_tables.find(table_name); if(iterFindTable != m_tables.end()) { //Fields: type_vec_fields& vecFields = iterFindTable->second.m_fields; type_vec_fields::iterator iterFind = std::find_if( vecFields.begin(), vecFields.end(), predicate_FieldHasName(strFieldNameOld) ); if(iterFind != vecFields.end()) //If it was found: { //Change it: (*iterFind)->set_name(strFieldNameNew); } //Find any relationships, layouts, or formatting that use this field //Look at each table: for(type_tables::iterator iter = m_tables.begin(); iter != m_tables.end(); ++iter) { //Fields: type_vec_fields& vecFields = iter->second.m_fields; for(type_vec_fields::iterator iterField = vecFields.begin(); iterField != vecFields.end(); ++iterField) { sharedptr field = *iterField; if(!field) continue; //Formatting: Formatting& formatting = field->m_default_formatting; formatting.change_field_item_name(table_name, strFieldNameOld, strFieldNameNew); } //Look at each relationship in the table: for(type_vec_relationships::iterator iterRels = iter->second.m_relationships.begin(); iterRels != iter->second.m_relationships.end(); ++iterRels) { sharedptr relationship = *iterRels; if(relationship->get_from_table() == table_name) { if(relationship->get_from_field() == strFieldNameOld) { //Change it: relationship->set_from_field(strFieldNameNew); } } if(relationship->get_to_table() == table_name) { if(relationship->get_to_field() == strFieldNameOld) { //Change it: relationship->set_to_field(strFieldNameNew); } } } const bool is_parent_table = (iter->second.m_info->get_name() == table_name); //Look at each layout: for(DocumentTableInfo::type_layouts::iterator iterLayouts = iter->second.m_layouts.begin(); iterLayouts != iter->second.m_layouts.end(); ++iterLayouts) { //Look at each group: for(type_list_layout_groups::iterator iterGroup = iterLayouts->m_layout_groups.begin(); iterGroup != iterLayouts->m_layout_groups.end(); ++iterGroup) { sharedptr group = *iterGroup; if(group) { //Change the field if it is in this group: if(is_parent_table) group->change_field_item_name(table_name, strFieldNameOld, strFieldNameNew); else group->change_related_field_item_name(table_name, strFieldNameOld, strFieldNameNew); } } } //Look at each report: for(DocumentTableInfo::type_reports::iterator iterReports = iter->second.m_reports.begin(); iterReports != iter->second.m_reports.end(); ++iterReports) { //Change the field if it is in this group: sharedptr report = iterReports->second; if(report) { if(is_parent_table) report->get_layout_group()->change_field_item_name(table_name, strFieldNameOld, strFieldNameNew); else report->get_layout_group()->change_related_field_item_name(table_name, strFieldNameOld, strFieldNameNew); } } } set_modified(); } } void Document::change_table_name(const Glib::ustring& table_name_old, const Glib::ustring& table_name_new) { type_tables::iterator iterFindTable = m_tables.find(table_name_old); if(iterFindTable != m_tables.end()) { //Change it: //We can't just change the key of the iterator (I think), //so we copy the whole thing and put it back in the map under a different key: //iterFindTable->first = table_name_new; DocumentTableInfo doctableinfo = iterFindTable->second; m_tables.erase(iterFindTable); doctableinfo.m_info->set_name(table_name_new); m_tables[table_name_new] = doctableinfo; //Find any relationships or layouts that use this table //Look at each table: for(type_tables::iterator iter = m_tables.begin(); iter != m_tables.end(); ++iter) { //Look at each relationship in the table: for(type_vec_relationships::iterator iterRels = iter->second.m_relationships.begin(); iterRels != iter->second.m_relationships.end(); ++iterRels) { sharedptr relationship = *iterRels; if(relationship->get_from_table() == table_name_old) { //Change it: relationship->set_from_table(table_name_new); } if(relationship->get_to_table() == table_name_old) { //Change it: relationship->set_to_table(table_name_new); } } } //TODO: Remember to change it in layouts when we add the ability to show fields from other tables. set_modified(); } } void Document::change_relationship_name(const Glib::ustring& table_name, const Glib::ustring& name, const Glib::ustring& name_new) { type_tables::iterator iterFindTable = m_tables.find(table_name); if(iterFindTable != m_tables.end()) { //Change the relationship name: type_vec_relationships::iterator iterRelFind = std::find_if( iterFindTable->second.m_relationships.begin(), iterFindTable->second.m_relationships.end(), predicate_FieldHasName(name) ); if(iterRelFind != iterFindTable->second.m_relationships.end()) (*iterRelFind)->set_name(name_new); //Any layouts, reports, etc that use this relationship will already have the new name via the sharedptr. //Look at each table: for(type_tables::iterator iter = m_tables.begin(); iter != m_tables.end(); ++iter) { /* //Look at all field formatting: for(type_vec_fields::iterator iterFields = iter->second.m_fields.begin(); iterFields != iter->second.m_fields.end(); ++iterFields) { (*iterFields)->m_default_formatting.change_relationship_name(table_name, name, name_new); } const bool is_parent_table = (iter->second.m_info->get_name() == table_name); //Look at each layout: for(DocumentTableInfo::type_layouts::iterator iterLayouts = iter->second.m_layouts.begin(); iterLayouts != iter->second.m_layouts.end(); ++iterLayouts) { //Look at each group: for(type_list_layout_groups::iterator iterGroup = iterLayouts->m_layout_groups.begin(); iterGroup != iterLayouts->m_layout_groups.end(); ++iterGroup) { //Change the field if it is in this group: if(is_parent_table) iterGroup->second.change_relationship_name(table_name, name, name_new); else iterGroup->second.change_related_relationship_name(table_name, name, name_new); } } //Look at each report: for(DocumentTableInfo::type_reports::iterator iterReports = iter->second.m_reports.begin(); iterReports != iter->second.m_reports.end(); ++iterReports) { //Change the field if it is in this group: if(is_parent_table) iterReports->second->get_layout_group()->change_relationship_name(table_name, name, name_new); else iterReports->second->get_layout_group()->change_related_relationship_name(table_name, name, name_new); } */ //TODO_SharedRelationshipCheck lookups. } set_modified(); } } Document::type_listTableInfo Document::get_tables(bool plus_system_prefs) const { type_listTableInfo result; for(type_tables::const_iterator iter = m_tables.begin(); iter != m_tables.end(); ++iter) { result.push_back(iter->second.m_info); //std::cout << "debug: " << G_STRFUNC << ": title=" << iter->second.m_info->get_title() << std::endl; } //Add the system properties if necessary: if(plus_system_prefs) { if(std::find_if(result.begin(), result.end(), predicate_FieldHasName(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME)) == result.end()) result.push_back(create_table_system_preferences()); } return result; } std::vector Document::get_table_names(bool plus_system_prefs) const { type_listTableInfo list_full = get_tables(plus_system_prefs); std::vector result; for(type_listTableInfo::iterator iter = list_full.begin(); iter != list_full.end(); ++iter) { sharedptr info = *iter; if(info) result.push_back(info->get_name()); } return result; } sharedptr Document::get_table(const Glib::ustring& table_name) const { type_tables::const_iterator iterfind = m_tables.find(table_name); if(iterfind != m_tables.end()) return iterfind->second.m_info; else return sharedptr(); } void Document::add_table(const sharedptr& table_info) { if(!table_info) return; type_tables::const_iterator iterfind = m_tables.find(table_info->get_name()); if(iterfind == m_tables.end()) { DocumentTableInfo item; item.m_info = table_info; m_tables[table_info->get_name()] = item; set_modified(); } } bool Document::get_table_overview_position(const Glib::ustring& table_name, float& x, float& y) const { type_tables::const_iterator it = m_tables.find(table_name); if(it != m_tables.end()) { if( it->second.m_overviewx == std::numeric_limits::infinity() || it->second.m_overviewy == std::numeric_limits::infinity() ) { return false; } x = it->second.m_overviewx; y = it->second.m_overviewy; return true; } else { return false; } } void Document::set_table_overview_position(const Glib::ustring &table_name, float x, float y) { type_tables::iterator it = m_tables.find(table_name); if(it != m_tables.end()) { it->second.m_overviewx = x; it->second.m_overviewy = y; } } void Document::set_tables(const type_listTableInfo& tables) { //We avoid adding information about tables that we don't know about - that should be done explicitly. //Look at each "table": bool something_changed = false; for(type_tables::iterator iter = m_tables.begin(); iter != m_tables.end(); ++iter) { const DocumentTableInfo& doctableinfo = iter->second; const Glib::ustring table_name = doctableinfo.m_info->get_name(); //If the table is also in the supplied list: type_listTableInfo::const_iterator iterfind = std::find_if(tables.begin(), tables.end(), predicate_FieldHasName(table_name)); if(iterfind != tables.end()) { sharedptr info = doctableinfo.m_info; sharedptr infoFound = *iterfind; *info = *infoFound; //TODO: Check that it has really changed, to avoid calling set_modified() unnecessarily? something_changed = true; } } if(something_changed) set_modified(); } void Document::fill_sort_field_details(const Glib::ustring& parent_table_name, Formatting::type_list_sort_fields& sort_fields) const { for(Formatting::type_list_sort_fields::iterator iter = sort_fields.begin(); iter != sort_fields.end(); ++iter) { sharedptr sort_field = iter->first; if(!sort_field) continue; //TODO: Avoid this unconst? sharedptr unconst_sort_field = sharedptr::cast_const(sort_field); sharedptr field = get_field( sort_field->get_table_used(parent_table_name), sort_field->get_name() ); unconst_sort_field->set_full_field_details(field); } } void Document::fill_layout_field_details(const Glib::ustring& parent_table_name, const sharedptr& layout_group) const { if(!layout_group) return; //Get the full field information for the LayoutItem_Fields in this group: for(LayoutGroup::type_list_items::iterator iter = layout_group->m_list_items.begin(); iter != layout_group->m_list_items.end(); ++iter) { sharedptr layout_item = *iter; //Check custom Field Formatting: sharedptr layout_withformatting = sharedptr::cast_dynamic(layout_item); if(layout_withformatting) { sharedptr choice_relationship; sharedptr choice_layout_first; sharedptr choice_extra_layouts; Formatting::type_list_sort_fields choice_sort_fields; bool choice_show_all = false; layout_withformatting->m_formatting.get_choices_related(choice_relationship, choice_layout_first, choice_extra_layouts, choice_sort_fields, choice_show_all); const Glib::ustring table_name = (choice_relationship ? choice_relationship->get_to_table() : Glib::ustring()); if(choice_layout_first) choice_layout_first->set_full_field_details( get_field(table_name, choice_layout_first->get_name()) ); fill_layout_field_details(parent_table_name, choice_extra_layouts); //recurse fill_sort_field_details(table_name, choice_sort_fields); } sharedptr layout_field = sharedptr::cast_dynamic(layout_item); if(layout_field) { const sharedptr field = get_field(layout_field->get_table_used(parent_table_name), layout_field->get_name()); layout_field->set_full_field_details(field); if(field) { //Check default Field Formatting: sharedptr choice_relationship; sharedptr choice_layout_first; sharedptr choice_extra_layouts; Formatting::type_list_sort_fields choice_sort_fields; bool choice_show_all = false; field->m_default_formatting.get_choices_related(choice_relationship, choice_layout_first, choice_extra_layouts, choice_sort_fields, choice_show_all); const Glib::ustring table_name = (choice_relationship ? choice_relationship->get_to_table() : Glib::ustring()); if(choice_layout_first) choice_layout_first->set_full_field_details( get_field(table_name, choice_layout_first->get_name()) ); fill_layout_field_details(parent_table_name, choice_extra_layouts); //recurse fill_sort_field_details(table_name, choice_sort_fields); } } else { sharedptr layout_portal_child = sharedptr::cast_dynamic(layout_item); if(layout_portal_child) fill_layout_field_details(layout_portal_child->get_table_used(parent_table_name), layout_portal_child); //recurse else { sharedptr layout_group_child = sharedptr::cast_dynamic(layout_item); if(layout_group_child) fill_layout_field_details(parent_table_name, layout_group_child); //recurse } } } } void Document::fill_layout_field_details(const Glib::ustring& parent_table_name, type_list_layout_groups& groups) const { for(type_list_layout_groups::iterator iterGroups = groups.begin(); iterGroups != groups.end(); ++iterGroups) { sharedptr group = *iterGroups; if(group) fill_layout_field_details(parent_table_name, group); } } Document::type_list_layout_groups Document::get_data_layout_groups_default(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& /* layout_platform */) const { type_list_layout_groups result; //Add one if necessary: sharedptr overview; sharedptr details; if(layout_name == "details") //The Details default layout is a bit more complicated. { overview = sharedptr::create();; overview->set_name("overview"); overview->set_title_original(_("Overview")); overview->set_columns_count(2); result.push_back(overview); details = sharedptr::create(); details->set_name("details"); details->set_title_original(_("Details")); details->set_columns_count(2); result.push_back(details); } //If, for some reason, we didn't create the-subgroups, add everything to a top level group: if(!overview && !details) { overview = sharedptr::create(); overview->set_name("main"); overview->set_columns_count(1); result.push_back(overview); details = overview; //Adding anything to details adds it to the overview, which is the only group. } //Discover new fields, and add them: type_vec_fields all_fields = get_table_fields(parent_table_name); for(type_vec_fields::const_iterator iter = all_fields.begin(); iter != all_fields.end(); ++iter) { const Glib::ustring field_name = (*iter)->get_name(); if(!field_name.empty()) { //See whether it's already in the result: //TODO_Performance: There is a lot of iterating and comparison here: bool found = false; //TODO: This is horrible. for(type_list_layout_groups::const_iterator iterFind = result.begin(); iterFind != result.end(); ++iterFind) { sharedptr group = *iterFind; if(group && group->has_field(parent_table_name, parent_table_name, field_name)) { found = true; break; } } if(!found) { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(*iter); //layout_item.set_table_name(child_table_name); //TODO: Allow viewing of fields through relationships. //layout_item.m_sequence = sequence; add_item() will fill this. //std::cout << "debug: " << G_STRFUNC << ": " << layout_item.get_name() << std::endl; if(overview && layout_item->get_full_field_details()->get_primary_key()) overview->add_item(layout_item); else if(details) details->add_item(layout_item); } } } return result; } Document::type_list_layout_groups Document::get_data_layout_groups_plus_new_fields(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform) const { type_list_layout_groups result = get_data_layout_groups(layout_name, parent_table_name, layout_platform); //If there are no fields in the layout, then add a default: bool create_default = false; if(result.empty() && !layout_name.empty()) { //Fall back to a general layout instead of one for a specific platform: result = get_data_layout_groups(layout_name, parent_table_name, Glib::ustring()); } if(result.empty()) { create_default = true; } //TODO: Also set create_default if all groups have no fields. if(create_default) { std::cout << "debug: " << G_STRFUNC << ": Creating a default layout." << std::endl; result = get_data_layout_groups_default(layout_name, parent_table_name, layout_platform); /* //Make the default layout suitable for the special platform: if(layout_platform == "maemo") { for(type_list_layout_groups::iterator iter = result.begin(); iter != result.end(); ++iter) { sharedptr layout_group = *iter; if(!layout_group) continue; if(layout_name == "list") { //Don't try to show more than 3 items on the list view: if(layout_group->get_items_count() >= 2) layout_group->m_list_items.resize(2); } maemo_restrict_layouts_to_single_column_group(layout_group); } */ //Store this so we don't have to recreate it next time: Document* nonconst_this = const_cast(this); //TODO: This is not ideal. nonconst_this->set_data_layout_groups(layout_name, parent_table_name, layout_platform, result); nonconst_this->set_modified(false); //This might have happened in operator mode, but in that case we don't really need to save it, or mark the document as unsaved. } return result; } Document::type_list_layout_groups Document::get_data_layout_groups(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform) const { //std::cout << "debug: " << G_STRFUNC << ": layout_name=" << layout_name << ", parent_table_name=" << parent_table_name << ", layout_platform=" << layout_platform << std::endl; type_tables::const_iterator iterFind = m_tables.find(parent_table_name); if(iterFind != m_tables.end()) { const DocumentTableInfo& info = iterFind->second; //Look for the layout with this name: DocumentTableInfo::type_layouts::const_iterator iter = std::find_if(info.m_layouts.begin(), info.m_layouts.end(), predicate_Layout(parent_table_name, layout_name, layout_platform)); if(iter != info.m_layouts.end()) { return iter->m_layout_groups; //found } } return type_list_layout_groups(); //not found } bool Document::get_data_layout_groups_have_any_fields(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform) const { //TODO_Performance: This could make the response to some button slow, such as the Add button, which does a check for this. type_list_layout_groups layout_groups = get_data_layout_groups(layout_name, parent_table_name, layout_platform); for(type_list_layout_groups::iterator iter = layout_groups.begin(); iter != layout_groups.end(); ++iter) { sharedptr layout_group = *iter; if(layout_group && layout_group->has_any_fields()) return true; } return false; } void Document::set_data_layout_groups(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform, const type_list_layout_groups& groups) { //std::cout << "debug: " << G_STRFUNC << ": layout_name=" << layout_name << ", parent_table_name=" << parent_table_name << ", layout_platform=" << layout_platform << std::endl; const Glib::ustring child_table_name = parent_table_name; //TODO: Remove this cruft. //std::cerr << G_STRFUNC << ": ADDING layout for table " << parent_table_name << " (child_table=" << child_table_name << "), for layout " << layout_name << std::endl; if(!parent_table_name.empty()) { DocumentTableInfo& info = get_table_info_with_add(parent_table_name); LayoutInfo layout_info; layout_info.m_parent_table = child_table_name; layout_info.m_layout_name = layout_name; layout_info.m_layout_groups = groups; DocumentTableInfo::type_layouts::iterator iter = std::find_if(info.m_layouts.begin(), info.m_layouts.end(), predicate_Layout(child_table_name, layout_name, layout_platform)); if(iter == info.m_layouts.end()) info.m_layouts.push_back(layout_info); else *iter = layout_info; set_modified(); } } Document::DocumentTableInfo& Document::get_table_info_with_add(const Glib::ustring& table_name) { type_tables::iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { return iterFind->second; } else { m_tables[table_name] = DocumentTableInfo(); m_tables[table_name].m_info->set_name(table_name); return get_table_info_with_add(table_name); } } Glib::ustring Document::get_table_title(const Glib::ustring& table_name, const Glib::ustring& locale) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) return iterFind->second.m_info->get_title(locale); else return Glib::ustring(); } Glib::ustring Document::get_table_title_original(const Glib::ustring& table_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) return iterFind->second.m_info->get_title_original(); else return Glib::ustring(); } Glib::ustring Document::get_table_title_singular(const Glib::ustring& table_name, const Glib::ustring& locale) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) return iterFind->second.m_info->get_title_singular_with_fallback(locale); else return Glib::ustring(); } Glib::ustring Document::get_table_title_singular_original(const Glib::ustring& table_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) return iterFind->second.m_info->get_title_singular_original(); else return Glib::ustring(); } void Document::set_table_title(const Glib::ustring& table_name, const Glib::ustring& value, const Glib::ustring& locale) { //std::cout << "debug: " << G_STRFUNC << ": table_name=" << table_name << ", value=" << value << std::endl; if(!table_name.empty()) { DocumentTableInfo& info = get_table_info_with_add(table_name); if(info.m_info->get_title(locale) != value) { info.m_info->set_title(value, locale); set_modified(); } } } void Document::set_table_example_data(const Glib::ustring& table_name, const type_example_rows& rows) { if(!table_name.empty()) { DocumentTableInfo& info = get_table_info_with_add(table_name); if(info.m_example_rows != rows) { info.m_example_rows = rows; set_modified(); } } } Document::type_example_rows Document::get_table_example_data(const Glib::ustring& table_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) return iterFind->second.m_example_rows; else return type_example_rows(); } bool Document::get_table_is_known(const Glib::ustring& table_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); return (iterFind != m_tables.end()); } bool Document::get_table_is_hidden(const Glib::ustring& table_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) return iterFind->second.m_info->get_hidden(); else return false; //It's not even known. } AppState::userlevels Document::get_userlevel() const { userLevelReason reason; return get_userlevel(reason); } AppState::userlevels Document::get_userlevel(userLevelReason& reason) const { //Initialize output parameter: reason = USER_LEVEL_REASON_UNKNOWN; if(get_read_only()) { reason = USER_LEVEL_REASON_FILE_READ_ONLY; return AppState::USERLEVEL_OPERATOR; //A read-only document cannot be changed, so there's no point in being in developer mode. This is one way to control the user level on purpose. } else if(get_opened_from_browse()) { reason = USER_LEVEL_REASON_OPENED_FROM_BROWSE; return AppState::USERLEVEL_OPERATOR; //Developer mode would require changes to the original document. } else if(m_file_uri.empty()) //If it has never been saved then this is a new default document, so the user created it, so the user can be a developer. { return AppState::USERLEVEL_DEVELOPER; } else { return m_app_state.get_userlevel(); } } Document::type_signal_userlevel_changed Document::signal_userlevel_changed() { return m_signal_userlevel_changed; } void Document::on_app_state_userlevel_changed(AppState::userlevels userlevel) { m_signal_userlevel_changed.emit(userlevel); } bool Document::set_userlevel(AppState::userlevels userlevel) { //Prevent incorrect user level: if((userlevel == AppState::USERLEVEL_DEVELOPER) && get_read_only()) { std::cout << "debug: " << G_STRFUNC << ": Developer mode denied because get_read_only() returned true." << std::endl; std::cout << " DEBUG: get_read_only()=" << get_read_only() << std::endl; std::cout << " DEBUG: get_file_uri()=" << get_file_uri() << std::endl; m_app_state.set_userlevel(AppState::USERLEVEL_OPERATOR); return false; } else if(get_opened_from_browse()) { m_app_state.set_userlevel(AppState::USERLEVEL_OPERATOR); return false; } { m_app_state.set_userlevel(userlevel); return true; } } void Document::emit_userlevel_changed() { m_signal_userlevel_changed.emit(m_app_state.get_userlevel()); } Glib::ustring Document::get_active_layout_platform() const { return m_active_layout_platform; } void Document::set_active_layout_platform(const Glib::ustring& layout_platform) { m_active_layout_platform = layout_platform; } Glib::ustring Document::get_default_table() const { for(type_tables::const_iterator iter = m_tables.begin(); iter != m_tables.end(); ++iter) { const sharedptr info = iter->second.m_info; if(info && info->get_default()) return info->get_name(); } //If there is only one table then pretend that is the default: if(m_tables.size() == 1) { type_tables::const_iterator iter = m_tables.begin(); return iter->second.m_info->get_name(); } return Glib::ustring(); } Glib::ustring Document::get_first_table() const { if(m_tables.empty()) return Glib::ustring(); type_tables::const_iterator iter = m_tables.begin(); return iter->second.m_info->get_name(); } void Document::set_allow_autosave(bool value) { if(m_allow_auto_save == value) return; m_allow_auto_save = value; //Save changes that have been waiting for us to call this function: if(m_allow_auto_save && get_modified()) { save_changes(); } } void Document::save_changes() { //Save changes automatically //(when in developer mode - no changes should even be possible when not in developer mode) if(get_userlevel() == AppState::USERLEVEL_DEVELOPER) { //This rebuilds the whole XML DOM and saves the whole document, //so we need to be careful not to call set_modified() too often. bool test = save_before(); if(test) { //std::cout << "debug: " << G_STRFUNC << ": calling write_to_disk()." << std::endl; test = write_to_disk(); if(test) { set_modified(false); } } } else { //std::cout << "debug: " << G_STRFUNC << ": Not saving, because not AppState::USERLEVEL_DEVELOPER" << std::endl; } } void Document::set_modified(bool value) { //std::cout << "Document::set_modified()" << std::endl; if(value && m_block_modified_set) //For instance, don't save changes while loading. { //std::cout << " Document::set_modified() m_block_modified_set" << std::endl; return; } if(get_userlevel() != AppState::USERLEVEL_DEVELOPER) { //Some things can be legitimately changed by the user, //such as field information from the server, //but only for the duration of the session. //There's no way that save_changes() can work for the user, //so we don't use set_modified(). return; } //if(value != get_modified()) //Prevent endless loops //{ GlomBakery::Document_XML::set_modified(value); if(value) { //std::cout << " Document::set_modified() save_changes" << std::endl; //TODO: Combine m_allow_auto_save and m_block_modified_set? if(!m_allow_auto_save) //For instance, don't save changes while making many changes. return; save_changes(); } //} } void Document::load_after_layout_item_formatting(const xmlpp::Element* element, const sharedptr& layout_item, const Glib::ustring& table_name) { if(!layout_item) return; Formatting& format = layout_item->m_formatting; sharedptr field = sharedptr::cast_dynamic(layout_item); Field::glom_field_type field_type = Field::TYPE_INVALID; if(field) field_type = field->get_glom_type(); Glib::ustring field_name; if(field) field_name = field->get_name(); load_after_layout_item_formatting(element, format, field_type, table_name, field_name); } void Document::load_after_layout_item_formatting(const xmlpp::Element* element, Formatting& format, Field::glom_field_type field_type, const Glib::ustring& table_name, const Glib::ustring& field_name) { //Numeric formatting: if(!field_name.empty() && (field_type == Field::TYPE_NUMERIC)) { format.m_numeric_format.m_use_thousands_separator = XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_FORMAT_THOUSANDS_SEPARATOR); format.m_numeric_format.m_decimal_places_restricted = XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_FORMAT_DECIMAL_PLACES_RESTRICTED); format.m_numeric_format.m_decimal_places = XmlUtils::get_node_attribute_value_as_decimal(element, GLOM_ATTRIBUTE_FORMAT_DECIMAL_PLACES); format.m_numeric_format.m_currency_symbol = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_FORMAT_CURRENCY_SYMBOL); format.m_numeric_format.m_alt_foreground_color_for_negatives = XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_FORMAT_USE_ALT_NEGATIVE_COLOR); } //Text formatting: if(field_type == Field::TYPE_TEXT) { format.set_text_format_multiline( XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_FORMAT_TEXT_MULTILINE) ); format.set_text_format_multiline_height_lines( XmlUtils::get_node_attribute_value_as_decimal(element, GLOM_ATTRIBUTE_FORMAT_TEXT_MULTILINE_HEIGHT_LINES, GLOM_ATTRIBUTE_FORMAT_TEXT_MULTILINE_HEIGHT_LINES_DEFAULT) ); } format.set_text_format_font( XmlUtils::get_node_attribute_value (element, GLOM_ATTRIBUTE_FORMAT_TEXT_FONT) ); format.set_text_format_color_foreground( XmlUtils::get_node_attribute_value (element, GLOM_ATTRIBUTE_FORMAT_TEXT_COLOR_FOREGROUND) ); format.set_text_format_color_background( XmlUtils::get_node_attribute_value (element, GLOM_ATTRIBUTE_FORMAT_TEXT_COLOR_BACKGROUND) ); //Alignment. Not-specified means auto. Formatting::HorizontalAlignment alignment = Formatting::HORIZONTAL_ALIGNMENT_AUTO; const Glib::ustring alignment_str = XmlUtils::get_node_attribute_value (element, GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT); if(alignment_str == GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT_LEFT) alignment = Formatting::HORIZONTAL_ALIGNMENT_LEFT; else if(alignment_str == GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT_RIGHT) alignment = Formatting::HORIZONTAL_ALIGNMENT_RIGHT; format.set_horizontal_alignment(alignment); //Choices: if(!field_name.empty()) { format.set_choices_restricted( XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_RESTRICTED), XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_RESTRICTED_AS_RADIO_BUTTONS) ); format.set_has_custom_choices( XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_CUSTOM) ); if(format.get_has_custom_choices()) { const xmlpp::Element* nodeChoiceList = XmlUtils::get_node_child_named(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_CUSTOM_LIST); if(nodeChoiceList) { Formatting::type_list_values list_values; xmlpp::Node::NodeList listNodesCustomChoices = nodeChoiceList->get_children(GLOM_NODE_FORMAT_CUSTOM_CHOICE); for(xmlpp::Node::NodeList::iterator iter = listNodesCustomChoices.begin(); iter != listNodesCustomChoices.end(); ++iter) { const xmlpp::Element* element = dynamic_cast(*iter); if(element) { if(field_type == Field::TYPE_INVALID) { //Discover the field type, so we can interpret the text as a value. //Not all calling functions know this, so they don't all supply the correct value. //TODO_Performance. sharedptr field_temp = get_field(table_name, field_name); if(field_temp) field_type = field_temp->get_glom_type(); } sharedptr value = sharedptr::create(); load_after_choicevalue(element, value, field_type); list_values.push_back(value); } } format.set_choices_custom(list_values); } } format.set_has_related_choices( XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED) ); const Glib::ustring relationship_name = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_RELATIONSHIP); if(!relationship_name.empty()) { sharedptr relationship = get_relationship(table_name, relationship_name); bool show_all = XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_SHOW_ALL); if(get_document_format_version() < 6) { show_all = true; //This was the behaviour before this checkbox existed. } const Glib::ustring field_first = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_FIELD); sharedptr layout_field_first = sharedptr::create(); layout_field_first->set_name(field_first); sharedptr extra_layouts; //Previous versions just saved a single extra field name, instead of a whole set of layoutgroups: if(m_document_format_version < 6) { //The deprecated way: const Glib::ustring field_second = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_SECOND); if(!field_second.empty()) { extra_layouts = sharedptr::create(); sharedptr item = sharedptr::create(); item->set_name(field_second); extra_layouts->add_item(item); } } else { //Get the extra layout for related choices: xmlpp::Element* nodeExtraLayout = XmlUtils::get_node_child_named(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_EXTRA_LAYOUT); if(nodeExtraLayout) { xmlpp::Element* nodeGroups = XmlUtils::get_node_child_named(nodeExtraLayout, GLOM_NODE_DATA_LAYOUT_GROUPS); if(nodeGroups) { sharedptr layout_group = sharedptr::create(); load_after_layout_group(nodeGroups, relationship->get_to_table(), layout_group); if(layout_group && !(layout_group->m_list_items.empty())) { //We actually want the sub-group: extra_layouts = sharedptr::cast_dynamic( layout_group->m_list_items[0] ); } } } } //Sort fields: Formatting::type_list_sort_fields sort_fields; xmlpp::Element* elementSortBy = XmlUtils::get_node_child_named(element, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_SORTBY); if(elementSortBy) { load_after_sort_by(elementSortBy, table_name, sort_fields); } format.set_choices_related(relationship, layout_field_first, extra_layouts, sort_fields, show_all); //Full details are updated in filled-in (). } } } void Document::load_after_layout_item_usesrelationship(const xmlpp::Element* element, const Glib::ustring& table_name, const sharedptr& item) { if(!element || !item) return; const Glib::ustring relationship_name = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_RELATIONSHIP_NAME); sharedptr relationship; if(!relationship_name.empty()) { //std::cout << " debug in : table_name=" << table_name << ", relationship_name=" << relationship_name << std::endl; relationship = get_relationship(table_name, relationship_name); item->set_relationship(relationship); if(!relationship) { std::cerr << G_STRFUNC << ": relationship not found: " << relationship_name << ", in table:" << table_name << std::endl; } } const Glib::ustring related_relationship_name = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_RELATED_RELATIONSHIP_NAME); if(!related_relationship_name.empty() && relationship) { sharedptr related_relationship = get_relationship(relationship->get_to_table(), related_relationship_name); if(!related_relationship) std::cerr << G_STRFUNC << ": related relationship not found in table=" << relationship->get_to_table() << ", name=" << related_relationship_name << std::endl; item->set_related_relationship(related_relationship); } } void Document::load_after_layout_item_field(const xmlpp::Element* element, const Glib::ustring& table_name, const sharedptr& item) { const Glib::ustring name = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_NAME); item->set_name(name); load_after_layout_item_usesrelationship(element, table_name, item); //Needed to decide what formatting to load/save: const sharedptr field = get_field(item->get_table_used(table_name), name); // This is not unusual, because tables often refer to tables that have not been loaded yet. // Code should sometimes check this before returning the layout items. // //if(!field) //{ // std::cerr << G_STRFUNC << ": Could not find field details for field=" << name << ", table=" << table_name << std::endl; //} item->set_full_field_details(field); item->set_editable( XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_EDITABLE) ); item->set_formatting_use_default( XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_DATA_LAYOUT_ITEM_FIELD_USE_DEFAULT_FORMATTING) ); const xmlpp::Element* nodeCustomTitle = XmlUtils::get_node_child_named(element, GLOM_NODE_LAYOUT_ITEM_CUSTOM_TITLE); if(nodeCustomTitle) { sharedptr custom_title = sharedptr::create(); custom_title->set_use_custom_title( XmlUtils::get_node_attribute_value_as_bool(nodeCustomTitle, GLOM_ATTRIBUTE_LAYOUT_ITEM_CUSTOM_TITLE_USE) ); load_after_translations(nodeCustomTitle, custom_title); item->set_title_custom(custom_title); } } void Document::load_after_sort_by(const xmlpp::Element* node, const Glib::ustring& table_name, LayoutItem_GroupBy::type_list_sort_fields& list_fields) { list_fields.clear(); if(!node) return; xmlpp::Node::NodeList listNodes = node->get_children(GLOM_NODE_DATA_LAYOUT_ITEM); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { const xmlpp::Element* element = dynamic_cast(*iter); if(element) { sharedptr item = sharedptr::create(); //item.set_full_field_details_empty(); load_after_layout_item_field(element, table_name, item); item->set_full_field_details( get_field(item->get_table_used(table_name), item->get_name()) ); const bool ascending = XmlUtils::get_node_attribute_value_as_bool(element, GLOM_ATTRIBUTE_SORT_ASCENDING); list_fields.push_back( LayoutItem_GroupBy::type_pair_sort_field(item, ascending) ); } } } void Document::load_after_layout_group(const xmlpp::Element* node, const Glib::ustring& table_name, const sharedptr& group, bool with_print_layout_positions) { if(!node || !group) { //std::cerr << G_STRFUNC << ": node is NULL" << std::endl; return; } //Get the group details: group->set_name( XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_NAME) ); group->set_title_original( XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_TITLE) ); group->set_columns_count( XmlUtils::get_node_attribute_value_as_decimal(node, GLOM_ATTRIBUTE_COLUMNS_COUNT, 1)); //default to 1, because 0 is meaningless. group->set_border_width( XmlUtils::get_node_attribute_value_as_decimal_double(node, GLOM_ATTRIBUTE_BORDER_WIDTH) ); //Translations: sharedptr temp = group; load_after_translations(node, temp); //Get the child items: xmlpp::Node::NodeList listNodes = node->get_children(); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { sharedptr item_added; //Create the layout item: const xmlpp::Element* element = dynamic_cast(*iter); if(element) { if(element->get_name() == GLOM_NODE_DATA_LAYOUT_ITEM) //TODO: Rename this to GLOM_NODE_DATA_LAYOUT_ITEM_FIELD { sharedptr item = sharedptr::create(); //item.set_full_field_details_empty(); load_after_layout_item_field(element, table_name, item); item_added = item; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_BUTTON) { sharedptr item = sharedptr::create(); item->set_script( XmlUtils::get_child_text_node(element, GLOM_NODE_BUTTON_SCRIPT) ); if(!(item->get_has_script())) //Try the deprecated attribute instead item->set_script( XmlUtils::get_node_attribute_value(element, GLOM_DEPRECATED_ATTRIBUTE_BUTTON_SCRIPT) ); load_after_translations(element, item); item_added = item; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_TEXTOBJECT) { sharedptr item = sharedptr::create(); load_after_translations(element, item); //The text can be translated too, so it has its own node: const xmlpp::Element* element_text = XmlUtils::get_node_child_named(element, GLOM_NODE_DATA_LAYOUT_TEXTOBJECT_TEXT); if(element_text) { sharedptr translatable_text = sharedptr::create(); load_after_translations(element_text, translatable_text); item->m_text = translatable_text; //std::cout << " DEBUG: text: " << item->m_text->get_title_or_name() << std::endl; } item_added = item; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_IMAGEOBJECT) { sharedptr item = sharedptr::create(); load_after_translations(element, item); item->set_image(XmlUtils::get_node_attribute_value_as_value(element, GLOM_ATTRIBUTE_DATA_LAYOUT_IMAGEOBJECT_IMAGE, Field::TYPE_IMAGE)); item_added = item; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_LINE) { sharedptr item = sharedptr::create(); //Has no translations: load_after_translations(element, item); item->set_coordinates( XmlUtils::get_node_attribute_value_as_decimal_double(element, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_START_X), XmlUtils::get_node_attribute_value_as_decimal_double(element, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_START_Y), XmlUtils::get_node_attribute_value_as_decimal_double(element, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_END_X), XmlUtils::get_node_attribute_value_as_decimal_double(element, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_END_Y) ); item->set_line_width( XmlUtils::get_node_attribute_value_as_decimal_double(element, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_WIDTH) ); item->set_line_color( XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_COLOR) ); item_added = item; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_ITEM_FIELDSUMMARY) { sharedptr item = sharedptr::create(); //item.set_full_field_details_empty(); load_after_layout_item_field(element, table_name, item); item->set_full_field_details( get_field(item->get_table_used(table_name), item->get_name()) ); item->set_summary_type_from_sql( XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_LAYOUT_ITEM_FIELDSUMMARY_SUMMARYTYPE) ); item_added = item; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_ITEM_HEADER) { sharedptr child_group = sharedptr::create(); //Recurse: load_after_layout_group(element, table_name, child_group, with_print_layout_positions); item_added = child_group; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_ITEM_FOOTER) { sharedptr child_group = sharedptr::create(); //Recurse: load_after_layout_group(element, table_name, child_group, with_print_layout_positions); item_added = child_group; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_GROUP) { sharedptr child_group = sharedptr::create(); //Recurse: load_after_layout_group(element, table_name, child_group, with_print_layout_positions); item_added = child_group; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_NOTEBOOK) { sharedptr notebook = sharedptr::create(); load_after_layout_group(element, table_name, notebook, with_print_layout_positions); item_added = notebook; } else if( (element->get_name() == GLOM_NODE_DATA_LAYOUT_PORTAL) || (element->get_name() == GLOM_NODE_DATA_LAYOUT_CALENDAR_PORTAL) ) { sharedptr portal; sharedptr calendar_portal; if(element->get_name() == GLOM_NODE_DATA_LAYOUT_PORTAL) portal = sharedptr::create(); else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_CALENDAR_PORTAL) { calendar_portal = sharedptr::create(); portal = calendar_portal; } load_after_layout_item_usesrelationship(element, table_name, portal); xmlpp::Element* elementNavigationRelationshipSpecific = XmlUtils::get_node_child_named(element, GLOM_NODE_DATA_LAYOUT_PORTAL_NAVIGATIONRELATIONSHIP); if(elementNavigationRelationshipSpecific) { const Glib::ustring navigation_type_as_string = XmlUtils::get_node_attribute_value(elementNavigationRelationshipSpecific, GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE); if(navigation_type_as_string.empty() || navigation_type_as_string == GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE_AUTOMATIC) { portal->set_navigation_type(LayoutItem_Portal::NAVIGATION_AUTOMATIC); } else if(navigation_type_as_string == GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE_NONE) { portal->set_navigation_type(LayoutItem_Portal::NAVIGATION_NONE); } else if(navigation_type_as_string == GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE_SPECIFIC) { //Read the specified relationship name: sharedptr relationship_navigation_specific = sharedptr::create(); load_after_layout_item_usesrelationship(elementNavigationRelationshipSpecific, portal->get_table_used(table_name), relationship_navigation_specific); portal->set_navigation_relationship_specific(relationship_navigation_specific); } } load_after_layout_group(element, portal->get_table_used(table_name), portal, with_print_layout_positions); //Get the calendar portal's date field: if(calendar_portal) { const Glib::ustring date_field_name = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_PORTAL_CALENDAR_DATE_FIELD); sharedptr date_field = get_field(calendar_portal->get_table_used(table_name), date_field_name); calendar_portal->set_date_field(date_field); } if(!calendar_portal) { const gulong rows_count_min = XmlUtils::get_node_attribute_value_as_decimal_double(element, GLOM_ATTRIBUTE_PORTAL_ROWS_COUNT_MIN); const gulong rows_count_max = XmlUtils::get_node_attribute_value_as_decimal_double(element, GLOM_ATTRIBUTE_PORTAL_ROWS_COUNT_MAX); if(rows_count_min || rows_count_max) //Ignore useless 0, 0 values. portal->set_rows_count(rows_count_min, rows_count_max); //Print Layout specific stuff: portal->set_print_layout_row_height( XmlUtils::get_node_attribute_value_as_decimal(element, GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_ROW_HEIGHT) ); portal->set_print_layout_row_line_width( XmlUtils::get_node_attribute_value_as_decimal(element, GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_ROW_LINE_WIDTH) ); portal->set_print_layout_column_line_width( XmlUtils::get_node_attribute_value_as_decimal(element, GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_COLUMN_LINE_WIDTH) ); portal->set_print_layout_line_color( XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_LINE_COLOR) ); } item_added = portal; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_ITEM_GROUPBY) { sharedptr child_group = sharedptr::create(); //Recurse: load_after_layout_group(element, table_name, child_group, with_print_layout_positions); //Group-By field: sharedptr field_groupby = sharedptr::create(); xmlpp::Element* elementGroupBy = XmlUtils::get_node_child_named(element, GLOM_NODE_REPORT_ITEM_GROUPBY_GROUPBY); if(elementGroupBy) { load_after_layout_item_field(elementGroupBy, table_name, field_groupby); field_groupby->set_full_field_details( get_field(field_groupby->get_table_used(table_name), field_groupby->get_name()) ); } child_group->set_field_group_by(field_groupby); //field_groupby.set_full_field_details_empty(); //Sort fields: xmlpp::Element* elementSortBy = XmlUtils::get_node_child_named(element, GLOM_NODE_REPORT_ITEM_GROUPBY_SORTBY); if(elementSortBy) { LayoutItem_GroupBy::type_list_sort_fields sort_fields; load_after_sort_by(elementSortBy, table_name, sort_fields); child_group->set_fields_sort_by(sort_fields); } //Secondary fields: xmlpp::Element* elementSecondary = XmlUtils::get_node_child_named(element, GLOM_NODE_DATA_LAYOUT_GROUP_SECONDARYFIELDS); if(elementSecondary) { xmlpp::Element* elementGroup = XmlUtils::get_node_child_named(elementSecondary, GLOM_NODE_DATA_LAYOUT_GROUP); if(elementGroup) { load_after_layout_group(elementGroup, table_name, child_group->get_secondary_fields(), with_print_layout_positions); fill_layout_field_details(table_name, child_group->get_secondary_fields()); //Get full field details from the field names. } } item_added = child_group; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_ITEM_VERTICALGROUP) { sharedptr child_group = sharedptr::create(); //Recurse: load_after_layout_group(element, table_name, child_group, with_print_layout_positions); item_added = child_group; } else if(element->get_name() == GLOM_NODE_DATA_LAYOUT_ITEM_SUMMARY) { sharedptr child_group = sharedptr::create(); //Recurse: load_after_layout_group(element, table_name, child_group, with_print_layout_positions); item_added = child_group; } } //Load formatting for any layout type that uses it: sharedptr withformatting = sharedptr::cast_dynamic(item_added); if(withformatting) { const xmlpp::Element* elementFormatting = XmlUtils::get_node_child_named(element, GLOM_NODE_FORMAT); if(elementFormatting) { //TODO: Provide the name of the relationship's table if there is a relationship: load_after_layout_item_formatting(elementFormatting, withformatting, table_name); } } //Add the new layout item to the group: if(item_added) { group->add_item(item_added); //Attributes that all items could have: item_added->set_display_width( XmlUtils::get_node_attribute_value_as_decimal(element, GLOM_ATTRIBUTE_LAYOUT_ITEM_COLUMN_WIDTH) ); if(with_print_layout_positions) load_after_print_layout_position(element, item_added); } } //for } void Document::load_after_translations(const xmlpp::Element* element, const sharedptr& item) { if(!element) return; const sharedptr choicevalue = sharedptr::cast_dynamic(item); if(!choicevalue) //This item does not use the title, but uses the title translations to translate its value, if it is of type text. { item->set_title_original( XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_TITLE)); } const xmlpp::Element* nodeTranslations = XmlUtils::get_node_child_named(element, GLOM_NODE_TRANSLATIONS_SET); if(nodeTranslations) { xmlpp::Node::NodeList listNodesTranslations = nodeTranslations->get_children(GLOM_NODE_TRANSLATION); for(xmlpp::Node::NodeList::iterator iter = listNodesTranslations.begin(); iter != listNodesTranslations.end(); ++iter) { const xmlpp::Element* element = dynamic_cast(*iter); if(element) { const Glib::ustring locale = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_TRANSLATION_LOCALE); const Glib::ustring translation = XmlUtils::get_node_attribute_value(element, GLOM_ATTRIBUTE_TRANSLATION_VALUE); item->set_title(translation, locale); //Remember any new translation locales in our cached list: if(std::find(m_translation_available_locales.begin(), m_translation_available_locales.end(), locale) == m_translation_available_locales.end()) { m_translation_available_locales.push_back(locale); } } } } //If it has a singular title, then load that too: const sharedptr has_title_singular = sharedptr::cast_dynamic(item); if(has_title_singular) { const xmlpp::Element* nodeTitleSingular = XmlUtils::get_node_child_named(element, GLOM_NODE_TABLE_TITLE_SINGULAR); if(!has_title_singular->m_title_singular) has_title_singular->m_title_singular = sharedptr::create(); load_after_translations(nodeTitleSingular, has_title_singular->m_title_singular); } } void Document::load_after_print_layout_position(const xmlpp::Element* nodeItem, const sharedptr& item) { if(!nodeItem) return; const xmlpp::Element* child = XmlUtils::get_node_child_named(nodeItem, GLOM_NODE_POSITION); if(child) { const double x = XmlUtils::get_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_POSITION_X); const double y = XmlUtils::get_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_POSITION_Y); const double width = XmlUtils::get_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_POSITION_WIDTH); const double height = XmlUtils::get_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_POSITION_HEIGHT); item->set_print_layout_position(x, y, width, height); } } void Document::load_after_choicevalue(const xmlpp::Element* element, const sharedptr& item, Field::glom_field_type field_type) { const Gnome::Gda::Value value = XmlUtils::get_node_attribute_value_as_value(element, GLOM_ATTRIBUTE_VALUE, field_type); item->set_value(value); sharedptr nonconst_item = item; //TODO: Avoid this. load_after_translations(element, nonconst_item); } bool Document::load_after(int& failure_code) { //Initialize the output variable: failure_code = 0; //TODO: Use some callback UI to show a busy cursor? /* //Use a std::auto_ptr<> to avoid even unncessarily instantiating a BusyCursor, //which would require GTK+ to be initialized: std::auto_ptr auto_cursor; if(m_parent_window) auto_cursor = std::auto_ptr( new BusyCursor(m_parent_window) ); */ m_block_modified_set = true; //Prevent the set_ functions from triggering a save. bool result = GlomBakery::Document_XML::load_after(failure_code); m_block_cache_update = true; //Don't waste time repeatedly updating this until we have finished. if(result) { m_translation_available_locales.clear(); const xmlpp::Element* nodeRoot = get_node_document(); if(nodeRoot) { m_document_format_version = XmlUtils::get_node_attribute_value_as_decimal(nodeRoot, GLOM_ATTRIBUTE_FORMAT_VERSION); if(m_document_format_version > get_latest_known_document_format_version()) { std::cerr << G_STRFUNC << ": Loading failed because format_version=" << m_document_format_version << ", but latest known format version is " << get_latest_known_document_format_version() << std::endl; failure_code = LOAD_FAILURE_CODE_FILE_VERSION_TOO_NEW; return false; } m_is_example = XmlUtils::get_node_attribute_value_as_bool(nodeRoot, GLOM_ATTRIBUTE_IS_EXAMPLE); m_is_backup = XmlUtils::get_node_attribute_value_as_bool(nodeRoot, GLOM_ATTRIBUTE_IS_BACKUP); load_after_translations(nodeRoot, m_database_title); //"database_title" is deprecated in favour of "title", loaded in //load_after_translations(), but load this from old documents if //if it is present, and the only thing present: const Glib::ustring database_title_deprecated = XmlUtils::get_node_attribute_value(nodeRoot, GLOM_DEPRECATED_ATTRIBUTE_CONNECTION_DATABASE_TITLE); if(!database_title_deprecated.empty() && get_database_title_original().empty()) m_database_title->set_title_original(database_title_deprecated); m_startup_script = XmlUtils::get_child_text_node(nodeRoot, GLOM_NODE_STARTUP_SCRIPT); m_translation_original_locale = XmlUtils::get_node_attribute_value(nodeRoot, GLOM_ATTRIBUTE_TRANSLATION_ORIGINAL_LOCALE); m_translation_available_locales.push_back(m_translation_original_locale); //Just a cache. const xmlpp::Element* nodeConnection = XmlUtils::get_node_child_named(nodeRoot, GLOM_NODE_CONNECTION); if(nodeConnection) { //Connection information: m_network_shared = XmlUtils::get_node_attribute_value_as_bool(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_NETWORK_SHARED, false /* default */); //Older documents always defaulted to network-sharing with self-hosting. if(!m_network_shared && !m_is_example && (get_document_format_version() < 4)) { //Otherwise we would assume that the default user already exists, //and fail to ask for the user/password: m_network_shared = true; } m_connection_server = XmlUtils::get_node_attribute_value(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_SERVER); m_connection_port = XmlUtils::get_node_attribute_value_as_decimal(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_PORT); m_connection_try_other_ports = XmlUtils::get_node_attribute_value_as_bool(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_TRY_OTHER_PORTS, true /* default */); m_connection_database = XmlUtils::get_node_attribute_value(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_DATABASE); const Glib::ustring attr_mode = XmlUtils::get_node_attribute_value(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_HOSTING_MODE); HostingMode mode = HOSTING_MODE_DEFAULT; if(attr_mode.empty()) { // If no hosting mode is set, then try the self_hosted flag which // was used before sqlite support was implemented. const bool self_hosted = XmlUtils::get_node_attribute_value_as_bool(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_SELF_HOSTED); mode = self_hosted ? HOSTING_MODE_POSTGRES_SELF : HOSTING_MODE_POSTGRES_CENTRAL; } else { if(attr_mode == GLOM_ATTRIBUTE_CONNECTION_HOSTING_POSTGRES_CENTRAL) mode = HOSTING_MODE_POSTGRES_CENTRAL; else if(attr_mode == GLOM_ATTRIBUTE_CONNECTION_HOSTING_POSTGRES_SELF) mode = HOSTING_MODE_POSTGRES_SELF; else if(attr_mode == GLOM_ATTRIBUTE_CONNECTION_HOSTING_SQLITE) mode = HOSTING_MODE_SQLITE; else { std::cerr << G_STRFUNC << ": Hosting mode " << attr_mode << " is not supported" << std::endl; return false; //TODO: Provide more information so the application (or Bakery) can say exactly why loading failed. } } m_hosting_mode = mode; } //Tables: m_tables.clear(); //Look at each "table" node. xmlpp::Node::NodeList listNodes = nodeRoot->get_children(GLOM_NODE_TABLE); for(xmlpp::Node::NodeList::const_iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* nodeTable = dynamic_cast(*iter); if(nodeTable) { const Glib::ustring table_name = XmlUtils::get_node_attribute_value(nodeTable, GLOM_ATTRIBUTE_NAME); m_tables[table_name] = DocumentTableInfo(); DocumentTableInfo& doctableinfo = m_tables[table_name]; //Setting stuff directly in the reference is more efficient than copying it later: sharedptr table_info(new TableInfo()); table_info->set_name(table_name); table_info->set_hidden( XmlUtils::get_node_attribute_value_as_bool(nodeTable, GLOM_ATTRIBUTE_HIDDEN) ); table_info->set_default( XmlUtils::get_node_attribute_value_as_bool(nodeTable, GLOM_ATTRIBUTE_DEFAULT) ); doctableinfo.m_info = table_info; doctableinfo.m_overviewx = XmlUtils::get_node_attribute_value_as_float(nodeTable, GLOM_ATTRIBUTE_OVERVIEW_X); doctableinfo.m_overviewy = XmlUtils::get_node_attribute_value_as_float(nodeTable, GLOM_ATTRIBUTE_OVERVIEW_Y); //Translations: load_after_translations(nodeTable, doctableinfo.m_info); //Relationships: //These should be loaded before the fields, because the fields use them. const xmlpp::Element* nodeRelationships = XmlUtils::get_node_child_named(nodeTable, GLOM_NODE_RELATIONSHIPS); if(nodeRelationships) { const xmlpp::Node::NodeList listNodes = nodeRelationships->get_children(GLOM_NODE_RELATIONSHIP); for(xmlpp::Node::NodeList::const_iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { const xmlpp::Element* nodeChild = dynamic_cast(*iter); if(nodeChild) { sharedptr relationship = sharedptr::create(); const Glib::ustring relationship_name = XmlUtils::get_node_attribute_value(nodeChild, GLOM_ATTRIBUTE_NAME); relationship->set_from_table(table_name); relationship->set_name(relationship_name);; relationship->set_from_field( XmlUtils::get_node_attribute_value(nodeChild, GLOM_ATTRIBUTE_KEY) ); relationship->set_to_table( XmlUtils::get_node_attribute_value(nodeChild, GLOM_ATTRIBUTE_OTHER_TABLE) ); relationship->set_to_field( XmlUtils::get_node_attribute_value(nodeChild, GLOM_ATTRIBUTE_OTHER_KEY) ); relationship->set_auto_create( XmlUtils::get_node_attribute_value_as_bool(nodeChild, GLOM_ATTRIBUTE_AUTO_CREATE) ); relationship->set_allow_edit( XmlUtils::get_node_attribute_value_as_bool(nodeChild, GLOM_ATTRIBUTE_ALLOW_EDIT) ); //Translations: load_after_translations(nodeChild, relationship); doctableinfo.m_relationships.push_back(relationship); } } } //Fields: const xmlpp::Element* nodeFields = XmlUtils::get_node_child_named(nodeTable, GLOM_NODE_FIELDS); if(nodeFields) { const Field::type_map_type_names type_names = Field::get_type_names(); //Loop through Field child nodes: xmlpp::Node::NodeList listNodes = nodeFields->get_children(GLOM_NODE_FIELD); for(xmlpp::Node::NodeList::const_iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { const xmlpp::Element* nodeChild = dynamic_cast(*iter); if(nodeChild) { sharedptr field(new Field()); const Glib::ustring strName = XmlUtils::get_node_attribute_value(nodeChild, GLOM_ATTRIBUTE_NAME); field->set_name( strName ); field->set_primary_key( XmlUtils::get_node_attribute_value_as_bool(nodeChild, GLOM_ATTRIBUTE_PRIMARY_KEY) ); field->set_unique_key( XmlUtils::get_node_attribute_value_as_bool(nodeChild, GLOM_ATTRIBUTE_UNIQUE) ); field->set_auto_increment( XmlUtils::get_node_attribute_value_as_bool(nodeChild, GLOM_ATTRIBUTE_AUTOINCREMENT) ); //Get lookup information, if present. xmlpp::Element* nodeLookup = XmlUtils::get_node_child_named(nodeChild, GLOM_NODE_FIELD_LOOKUP); if(nodeLookup) { const Glib::ustring lookup_relationship_name = XmlUtils::get_node_attribute_value(nodeLookup, GLOM_ATTRIBUTE_RELATIONSHIP_NAME); sharedptr lookup_relationship = get_relationship(table_name, lookup_relationship_name); field->set_lookup_relationship(lookup_relationship); field->set_lookup_field( XmlUtils::get_node_attribute_value(nodeLookup, GLOM_ATTRIBUTE_FIELD) ); } field->set_calculation( XmlUtils::get_child_text_node(nodeChild, GLOM_NODE_CALCULATION) ); if(!(field->get_has_calculation())) //Try the deprecated attribute instead field->set_calculation( XmlUtils::get_node_attribute_value(nodeChild, GLOM_DEPRECATED_ATTRIBUTE_CALCULATION) ); //Field Type: const Glib::ustring field_type = XmlUtils::get_node_attribute_value(nodeChild, GLOM_ATTRIBUTE_TYPE); //Get the type enum for this string representation of the type: Field::glom_field_type field_type_enum = Field::TYPE_INVALID; for(Field::type_map_type_names::const_iterator iter = type_names.begin(); iter !=type_names.end(); ++iter) { if(iter->second == field_type) { field_type_enum = iter->first; break; } } //We set this after set_field_info(), because that gets a glom type from the (not-specified) gdatype. Yes, that's strange, and should probably be more explicit. field->set_glom_type(field_type_enum); field->set_default_value( XmlUtils::get_node_attribute_value_as_value(nodeChild, GLOM_ATTRIBUTE_DEFAULT_VALUE, field_type_enum) ); //Default Formatting: const xmlpp::Element* elementFormatting = XmlUtils::get_node_child_named(nodeChild, GLOM_NODE_FORMAT); if(elementFormatting) load_after_layout_item_formatting(elementFormatting, field->m_default_formatting, field_type_enum, table_name, strName); //Translations: load_after_translations(nodeChild, field); doctableinfo.m_fields.push_back(field); } } } //Fields // Load Example Rows after fields have been loaded, because they // need the fields to be able to associate a value to a named field. const xmlpp::Element* nodeExampleRows = XmlUtils::get_node_child_named(nodeTable, GLOM_NODE_EXAMPLE_ROWS); if(nodeExampleRows) { //Loop through example_row child nodes: xmlpp::Node::NodeList listExampleRows = nodeExampleRows->get_children(GLOM_NODE_EXAMPLE_ROW); for(xmlpp::Node::NodeList::const_iterator iter = listExampleRows.begin(); iter != listExampleRows.end(); ++ iter) { const xmlpp::Element* nodeChild = dynamic_cast(*iter); if(nodeChild) { type_row_data field_values(doctableinfo.m_fields.size()); //Loop through value child nodes xmlpp::Node::NodeList listNodes = nodeChild->get_children(GLOM_NODE_VALUE); for(xmlpp::Node::NodeList::const_iterator iter = listNodes.begin(); iter != listNodes.end(); ++ iter) { const xmlpp::Element* nodeChild = dynamic_cast(*iter); if(nodeChild) { const xmlpp::Attribute* column_name = nodeChild->get_attribute(GLOM_ATTRIBUTE_COLUMN); if(column_name) { //std::cout << "DEBUG: column_name = " << column_name->get_value() << " fields size=" << doctableinfo.m_fields.size() << std::endl; // TODO_Performance: If it's too many rows we could // consider a map to find the column more quickly. for(unsigned int i = 0; i < doctableinfo.m_fields.size(); ++i) { sharedptr field = doctableinfo.m_fields[i]; //std::cout << " DEBUG: searching: field i=" << i << " =" << field->get_name() << std::endl; if(field && (field->get_name() == column_name->get_value())) { field_values[i] = XmlUtils::get_node_text_child_as_value(nodeChild, field->get_glom_type()); //std::cout << " DEBUG: document example value: field=" << field->get_name() << ", value=" << field_values[i].to_string() << std::endl; break; } } } } } // Append line to doctableinfo.m_example_rows doctableinfo.m_example_rows.push_back(field_values); } } } // Example Rows //std::cout << " debug: loading: table=" << table_name << ", m_example_rows.size()=" << doctableinfo.m_example_rows.size() << std::endl; } //if(table) } //Tables. //Look at each "table" node. //We do load the layouts separately, because we needed to load all the tables' relationships and tables //before we can load layouts that can use them. for(xmlpp::Node::NodeList::const_iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* nodeTable = dynamic_cast(*iter); if(nodeTable) { const Glib::ustring table_name = XmlUtils::get_node_attribute_value(nodeTable, GLOM_ATTRIBUTE_NAME); DocumentTableInfo& doctableinfo = m_tables[table_name]; //Setting stuff directly in the reference is more efficient than copying it later: //Layouts: const xmlpp::Element* nodeDataLayouts = XmlUtils::get_node_child_named(nodeTable, GLOM_NODE_DATA_LAYOUTS); if(nodeDataLayouts) { xmlpp::Node::NodeList listNodes = nodeDataLayouts->get_children(GLOM_NODE_DATA_LAYOUT); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* node = dynamic_cast(*iter); if(node) { const Glib::ustring layout_name = XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_NAME); const Glib::ustring layout_platform = XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_LAYOUT_PLATFORM); Glib::ustring parent_table = XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_PARENT_TABLE_NAME); if(parent_table.empty()) parent_table = table_name; //Deal with the earlier file format that did not include this. type_list_layout_groups layout_groups; const xmlpp::Element* nodeGroups = XmlUtils::get_node_child_named(node, GLOM_NODE_DATA_LAYOUT_GROUPS); if(nodeGroups) { //Look at all its children: xmlpp::Node::NodeList listNodes = nodeGroups->get_children(GLOM_NODE_DATA_LAYOUT_GROUP); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { const xmlpp::Element* node = dynamic_cast(*iter); if(node) { const Glib::ustring group_name = XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_NAME); if(!group_name.empty()) { sharedptr group(new LayoutGroup()); load_after_layout_group(node, table_name, group); layout_groups.push_back(group); } } } } LayoutInfo layout_info; layout_info.m_parent_table = parent_table; layout_info.m_layout_name = layout_name; layout_info.m_layout_platform = layout_platform; layout_info.m_layout_groups = layout_groups; doctableinfo.m_layouts.push_back(layout_info); } } } //if(nodeDataLayouts) //Reports: const xmlpp::Element* nodeReports = XmlUtils::get_node_child_named(nodeTable, GLOM_NODE_REPORTS); if(nodeReports) { xmlpp::Node::NodeList listNodes = nodeReports->get_children(GLOM_NODE_REPORT); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* node = dynamic_cast(*iter); if(node) { const Glib::ustring report_name = XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_NAME); const bool show_table_title = XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_REPORT_SHOW_TABLE_TITLE); //type_list_layout_groups layout_groups; sharedptr report(new Report()); report->set_name(report_name); report->set_show_table_title(show_table_title); const xmlpp::Element* nodeGroups = XmlUtils::get_node_child_named(node, GLOM_NODE_DATA_LAYOUT_GROUPS); if(nodeGroups) { //Look at all its children: xmlpp::Node::NodeList listNodes = nodeGroups->get_children(GLOM_NODE_DATA_LAYOUT_GROUP); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { const xmlpp::Element* node = dynamic_cast(*iter); if(node) { sharedptr group = report->get_layout_group(); group->remove_all_items(); load_after_layout_group(node, table_name, group); fill_layout_field_details(table_name, group); //Get full field details from the field names. } } } //Translations: load_after_translations(node, report); doctableinfo.m_reports[report->get_name()] = report; } } } //if(nodeReports) //Print Layouts: const xmlpp::Element* nodePrintLayouts = XmlUtils::get_node_child_named(nodeTable, GLOM_NODE_PRINT_LAYOUTS); if(nodePrintLayouts) { xmlpp::Node::NodeList listNodes = nodePrintLayouts->get_children(GLOM_NODE_PRINT_LAYOUT); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* node = dynamic_cast(*iter); if(node) { const Glib::ustring name = XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_NAME); const bool show_table_title = XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_REPORT_SHOW_TABLE_TITLE); sharedptr print_layout(new PrintLayout()); print_layout->set_name(name); print_layout->set_show_table_title(show_table_title); print_layout->set_show_grid( XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_PRINT_LAYOUT_SHOW_GRID) ); print_layout->set_show_rules( XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_PRINT_LAYOUT_SHOW_RULES) ); print_layout->set_show_outlines( XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_PRINT_LAYOUT_SHOW_OUTLINES) ); //Get the horizontal and vertical rules: PrintLayout::type_vec_doubles vec_rules_h; xmlpp::Node::NodeList listRules = node->get_children(GLOM_NODE_HORIZONTAL_RULE); for(xmlpp::Node::NodeList::iterator iter = listRules.begin(); iter != listRules.end(); ++iter) { const xmlpp::Element* node = dynamic_cast(*iter); if(!node) continue; const double pos = XmlUtils::get_node_attribute_value_as_decimal(node, GLOM_ATTRIBUTE_RULE_POSITION); vec_rules_h.push_back(pos); } print_layout->set_horizontal_rules(vec_rules_h); PrintLayout::type_vec_doubles vec_rules_v; listRules = node->get_children(GLOM_NODE_VERTICAL_RULE); for(xmlpp::Node::NodeList::iterator iter = listRules.begin(); iter != listRules.end(); ++iter) { const xmlpp::Element* node = dynamic_cast(*iter); if(!node) continue; const double pos = XmlUtils::get_node_attribute_value_as_decimal(node, GLOM_ATTRIBUTE_RULE_POSITION); vec_rules_v.push_back(pos); } print_layout->set_vertical_rules(vec_rules_v); //Page Setup: const Glib::ustring key_file_text = XmlUtils::get_child_text_node(node, GLOM_NODE_PAGE_SETUP); print_layout->set_page_setup(key_file_text); print_layout->set_page_count( XmlUtils::get_node_attribute_value_as_decimal(node, GLOM_ATTRIBUTE_PRINT_LAYOUT_PAGE_COUNT, 1)); //Layout Groups: const xmlpp::Element* nodeGroups = XmlUtils::get_node_child_named(node, GLOM_NODE_DATA_LAYOUT_GROUPS); if(nodeGroups) { //Look at all its children: xmlpp::Node::NodeList listNodes = nodeGroups->get_children(GLOM_NODE_DATA_LAYOUT_GROUP); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { const xmlpp::Element* node = dynamic_cast(*iter); if(node) { sharedptr group = print_layout->get_layout_group(); group->remove_all_items(); load_after_layout_group(node, table_name, group, true /* load positions too. */); fill_layout_field_details(table_name, group); //Get full field details from the field names. } } } //Translations: load_after_translations(node, print_layout); doctableinfo.m_print_layouts[print_layout->get_name()] = print_layout; } } } //if(nodePrintLayouts) //Groups: //These are only used when recreating the database, for instance from an example file. m_groups.clear(); const xmlpp::Element* nodeGroups = XmlUtils::get_node_child_named(nodeRoot, GLOM_NODE_GROUPS); if(nodeGroups) { xmlpp::Node::NodeList listNodes = nodeGroups->get_children(GLOM_NODE_GROUP); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* node = dynamic_cast(*iter); if(node) { GroupInfo group_info; group_info.set_name( XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_NAME) ); group_info.m_developer = XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_DEVELOPER); xmlpp::Node::NodeList listTablePrivs = node->get_children(GLOM_NODE_TABLE_PRIVS); for(xmlpp::Node::NodeList::iterator iter = listTablePrivs.begin(); iter != listTablePrivs.end(); ++iter) { xmlpp::Element* node = dynamic_cast(*iter); if(node) { const Glib::ustring table_name = XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_TABLE_NAME); Privileges privs; privs.m_view = XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_PRIV_VIEW); privs.m_edit = XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_PRIV_EDIT); privs.m_create = XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_PRIV_CREATE); privs.m_delete = XmlUtils::get_node_attribute_value_as_bool(node, GLOM_ATTRIBUTE_PRIV_DELETE); group_info.m_map_privileges[table_name] = privs; } } m_groups[group_info.get_name()] = group_info; } } } //Library Modules: m_map_library_scripts.clear(); const xmlpp::Element* nodeModules = XmlUtils::get_node_child_named(nodeRoot, GLOM_NODE_LIBRARY_MODULES); if(nodeModules) { xmlpp::Node::NodeList listNodes = nodeModules->get_children(GLOM_NODE_LIBRARY_MODULE); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) { xmlpp::Element* node = dynamic_cast(*iter); if(node) { //The name is in an attribute: const Glib::ustring module_name = XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_LIBRARY_MODULE_NAME); //The string is in a child text node: Glib::ustring script; const xmlpp::TextNode* text_child = node->get_child_text(); if(text_child) script = text_child->get_content(); //Fall back to the deprecated attribute: if(script.empty()) script = XmlUtils::get_node_attribute_value(node, GLOM_ATTRIBUTE_LIBRARY_MODULE_SCRIPT); m_map_library_scripts[module_name] = script; } } } } //root } } } m_block_cache_update = false; m_block_modified_set = false; return result; } void Document::save_before_layout_item_formatting(xmlpp::Element* nodeItem, const sharedptr& layout_item) { if(!layout_item) return; const Formatting& format = layout_item->m_formatting; sharedptr field = sharedptr::cast_dynamic(layout_item); Field::glom_field_type field_type = Field::TYPE_INVALID; if(field) field_type = field->get_glom_type(); save_before_layout_item_formatting(nodeItem, format, field_type); } void Document::save_before_layout_item_formatting(xmlpp::Element* nodeItem, const Formatting& format, Field::glom_field_type field_type) { //Numeric format: if(field_type != Field::TYPE_INVALID) //These options are only for fields: { if(field_type == Field::TYPE_NUMERIC) { XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_FORMAT_THOUSANDS_SEPARATOR, format.m_numeric_format.m_use_thousands_separator); XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_FORMAT_DECIMAL_PLACES_RESTRICTED, format.m_numeric_format.m_decimal_places_restricted); XmlUtils::set_node_attribute_value_as_decimal(nodeItem, GLOM_ATTRIBUTE_FORMAT_DECIMAL_PLACES, format.m_numeric_format.m_decimal_places); XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_FORMAT_CURRENCY_SYMBOL, format.m_numeric_format.m_currency_symbol); XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_FORMAT_USE_ALT_NEGATIVE_COLOR, format.m_numeric_format.m_alt_foreground_color_for_negatives); } bool as_radio_buttons = false; const bool choices_restricted = format.get_choices_restricted(as_radio_buttons); XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_FORMAT_CHOICES_RESTRICTED, choices_restricted); XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_FORMAT_CHOICES_RESTRICTED_AS_RADIO_BUTTONS, as_radio_buttons); XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_FORMAT_CHOICES_CUSTOM, format.get_has_custom_choices()); } //Text formatting: if(field_type == Field::TYPE_TEXT) { XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_FORMAT_TEXT_MULTILINE, format.get_text_format_multiline()); XmlUtils::set_node_attribute_value_as_decimal(nodeItem, GLOM_ATTRIBUTE_FORMAT_TEXT_MULTILINE_HEIGHT_LINES, format.get_text_format_multiline_height_lines(), GLOM_ATTRIBUTE_FORMAT_TEXT_MULTILINE_HEIGHT_LINES_DEFAULT); } XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_FORMAT_TEXT_FONT, format.get_text_format_font()); XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_FORMAT_TEXT_COLOR_FOREGROUND, format.get_text_format_color_foreground()); XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_FORMAT_TEXT_COLOR_BACKGROUND, format.get_text_format_color_background()); //Alignment: const Formatting::HorizontalAlignment alignment = format.get_horizontal_alignment(); if(alignment != Formatting::HORIZONTAL_ALIGNMENT_AUTO) //Save file-size by not even writing this. { const Glib::ustring alignment_str = (alignment == Formatting::HORIZONTAL_ALIGNMENT_LEFT ? GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT_LEFT : GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT_RIGHT); XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_FORMAT_HORIZONTAL_ALIGNMENT, alignment_str); } //Choices: if(field_type != Field::TYPE_INVALID) { if(format.get_has_custom_choices()) { xmlpp::Element* child = nodeItem->add_child(GLOM_ATTRIBUTE_FORMAT_CHOICES_CUSTOM_LIST); const Formatting::type_list_values list_values = format.get_choices_custom(); for(Formatting::type_list_values::const_iterator iter = list_values.begin(); iter != list_values.end(); ++iter) { const sharedptr value = *iter; xmlpp::Element* childChoice = child->add_child(GLOM_NODE_FORMAT_CUSTOM_CHOICE); save_before_choicevalue(childChoice, value, field_type); } } XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED, format.get_has_related_choices() ); sharedptr choice_relationship; sharedptr choice_layout_first; sharedptr choice_extra_layouts; Formatting::type_list_sort_fields choice_sort_fields; bool choice_show_all = false; format.get_choices_related(choice_relationship, choice_layout_first, choice_extra_layouts, choice_sort_fields, choice_show_all); if(choice_relationship) { Glib::ustring choice_field; if(choice_layout_first) choice_field = choice_layout_first->get_name(); XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_RELATIONSHIP, glom_get_sharedptr_name(choice_relationship)); XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_FIELD, choice_field); XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_SHOW_ALL, choice_show_all); //Save the extra fields to show for related choices: if(choice_extra_layouts) { xmlpp::Element* nodeExtraLayout = nodeItem->add_child(GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_EXTRA_LAYOUT); xmlpp::Element* nodeGroups = nodeExtraLayout->add_child(GLOM_NODE_DATA_LAYOUT_GROUPS); save_before_layout_group(nodeGroups, choice_extra_layouts); } if(!choice_sort_fields.empty()) { xmlpp::Element* nodeSortBy = nodeItem->add_child(GLOM_ATTRIBUTE_FORMAT_CHOICES_RELATED_SORTBY); save_before_sort_by(nodeSortBy, choice_sort_fields); } } } } void Document::save_before_layout_item_usesrelationship(xmlpp::Element* nodeItem, const sharedptr& item) { if(!item) return; XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_RELATIONSHIP_NAME, item->get_relationship_name()); XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_RELATED_RELATIONSHIP_NAME, item->get_related_relationship_name()); } void Document::save_before_layout_item_field(xmlpp::Element* nodeItem, const sharedptr& field) { if(!field) return; XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_NAME, field->get_name()); save_before_layout_item_usesrelationship(nodeItem, field); XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_EDITABLE, field->get_editable()); XmlUtils::set_node_attribute_value_as_bool(nodeItem, GLOM_ATTRIBUTE_DATA_LAYOUT_ITEM_FIELD_USE_DEFAULT_FORMATTING, field->get_formatting_use_default()); sharedptr custom_title = field->get_title_custom(); if(custom_title) { xmlpp::Element* elementCustomTitle = nodeItem->add_child(GLOM_NODE_LAYOUT_ITEM_CUSTOM_TITLE); XmlUtils::set_node_attribute_value_as_bool(elementCustomTitle, GLOM_ATTRIBUTE_LAYOUT_ITEM_CUSTOM_TITLE_USE, custom_title->get_use_custom_title()); save_before_translations(elementCustomTitle, custom_title); } } void Document::save_before_sort_by(xmlpp::Element* node, const LayoutItem_GroupBy::type_list_sort_fields& list_fields) { if(!node) return; for(LayoutItem_GroupBy::type_list_sort_fields::const_iterator iter = list_fields.begin(); iter != list_fields.end(); ++iter) { sharedptr field = iter->first; xmlpp::Element* nodeChild = node->add_child(GLOM_NODE_DATA_LAYOUT_ITEM); save_before_layout_item_field(nodeChild, field); XmlUtils::set_node_attribute_value_as_bool(nodeChild, GLOM_ATTRIBUTE_SORT_ASCENDING, iter->second); } } void Document::save_before_layout_group(xmlpp::Element* node, const sharedptr& group, bool with_print_layout_positions) { if(!node || !group) return; //g_warning("save_before_layout_group"); xmlpp::Element* child = 0; sharedptr group_by = sharedptr::cast_dynamic(group); if(group_by) //If it is a GroupBy report part. { child = node->add_child(GLOM_NODE_DATA_LAYOUT_ITEM_GROUPBY); if(group_by->get_has_field_group_by()) { xmlpp::Element* nodeGroupBy = child->add_child(GLOM_NODE_REPORT_ITEM_GROUPBY_GROUPBY); save_before_layout_item_field(nodeGroupBy, group_by->get_field_group_by()); } //Sort fields: if(group_by->get_has_fields_sort_by()) { xmlpp::Element* nodeSortBy = child->add_child(GLOM_NODE_REPORT_ITEM_GROUPBY_SORTBY); save_before_sort_by(nodeSortBy, group_by->get_fields_sort_by()); } //Secondary fields: if(!group_by->get_secondary_fields()->m_list_items.empty()) { xmlpp::Element* secondary_fields = child->add_child(GLOM_NODE_DATA_LAYOUT_GROUP_SECONDARYFIELDS); save_before_layout_group(secondary_fields, group_by->get_secondary_fields(), with_print_layout_positions); } } else { sharedptr summary = sharedptr::cast_dynamic(group); if(summary) //If it is a GroupBy report part. { child = node->add_child(GLOM_NODE_DATA_LAYOUT_ITEM_SUMMARY); //TODO: summary_type. } else { sharedptr verticalgroup = sharedptr::cast_dynamic(group); if(verticalgroup) //If it is a GroupBy report part. { child = node->add_child(GLOM_NODE_DATA_LAYOUT_ITEM_VERTICALGROUP); } else { sharedptr headerGroup = sharedptr::cast_dynamic(group); if(headerGroup) //If it is a GroupBy report part. { child = node->add_child(GLOM_NODE_DATA_LAYOUT_ITEM_HEADER); } else { sharedptr footerGroup = sharedptr::cast_dynamic(group); if(footerGroup) //If it is a GroupBy report part. { child = node->add_child(GLOM_NODE_DATA_LAYOUT_ITEM_FOOTER); } else { sharedptr portal = sharedptr::cast_dynamic(group); if(portal) //If it is a related records portal { sharedptr calendar_portal = sharedptr::cast_dynamic(portal); if(calendar_portal) { child = node->add_child(GLOM_NODE_DATA_LAYOUT_CALENDAR_PORTAL); sharedptr date_field = calendar_portal->get_date_field(); if(date_field) XmlUtils::set_node_attribute_value(child, GLOM_ATTRIBUTE_PORTAL_CALENDAR_DATE_FIELD, date_field->get_name()); } else child = node->add_child(GLOM_NODE_DATA_LAYOUT_PORTAL); save_before_layout_item_usesrelationship(child, portal); //Portal navigation details: Glib::ustring navigation_type_string; sharedptr relationship_navigation_specific; switch(portal->get_navigation_type()) { case LayoutItem_Portal::NAVIGATION_AUTOMATIC: //We leave this blank to use the default. break; case LayoutItem_Portal::NAVIGATION_NONE: navigation_type_string = GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE_NONE; break; case LayoutItem_Portal::NAVIGATION_SPECIFIC: navigation_type_string = GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE_SPECIFIC; break; default: break; } //Empty means the default ("automatic") //In that case we don't even write the node, to keep the XML small: if(!navigation_type_string.empty()) { xmlpp::Element* child_navigation_relationship = child->add_child(GLOM_NODE_DATA_LAYOUT_PORTAL_NAVIGATIONRELATIONSHIP); save_before_layout_item_usesrelationship(child_navigation_relationship, relationship_navigation_specific); XmlUtils::set_node_attribute_value(child_navigation_relationship, GLOM_ATTRIBUTE_PORTAL_NAVIGATION_TYPE, navigation_type_string); } if(!calendar_portal) { gulong rows_count_min = 0; gulong rows_count_max = 0; portal->get_rows_count(rows_count_min, rows_count_max); XmlUtils::set_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_PORTAL_ROWS_COUNT_MIN, rows_count_min); XmlUtils::set_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_PORTAL_ROWS_COUNT_MAX, rows_count_max); //Print Layout specific stuff: XmlUtils::set_node_attribute_value_as_decimal(child, GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_ROW_HEIGHT, portal->get_print_layout_row_height()); XmlUtils::set_node_attribute_value_as_decimal(child, GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_ROW_LINE_WIDTH, portal->get_print_layout_row_line_width()); XmlUtils::set_node_attribute_value(child, GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_ROW_LINE_COLOR, portal->get_print_layout_line_color()); XmlUtils::set_node_attribute_value(child, GLOM_ATTRIBUTE_PORTAL_PRINT_LAYOUT_LINE_COLOR, portal->get_print_layout_line_color()); } } else { sharedptr notebook = sharedptr::cast_dynamic(group); if(notebook) //If it is a notebook. { child = node->add_child(GLOM_NODE_DATA_LAYOUT_NOTEBOOK); } else if(group) { child = node->add_child(GLOM_NODE_DATA_LAYOUT_GROUP); } } } } } } } if(!child) return; XmlUtils::set_node_attribute_value(child, GLOM_ATTRIBUTE_NAME, group->get_name()); XmlUtils::set_node_attribute_value_as_decimal(child, GLOM_ATTRIBUTE_COLUMNS_COUNT, group->get_columns_count(), 1); //Default to 1 because 0 is meaningless. XmlUtils::set_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_BORDER_WIDTH, group->get_border_width()); //Translations: save_before_translations(child, group); //Print layout position: if(with_print_layout_positions) save_before_print_layout_position(child, group); //Add the child items: LayoutGroup::type_list_const_items items = group->get_items(); for(LayoutGroup::type_list_const_items::const_iterator iterItems = items.begin(); iterItems != items.end(); ++iterItems) { sharedptr item = *iterItems; //g_warning("save_before_layout_group: child part type=%s", item->get_part_type_name().c_str()); sharedptr child_group = sharedptr::cast_dynamic(item); if(child_group) //If it is a group, portal, summary, or groupby. { //recurse: save_before_layout_group(child, child_group, with_print_layout_positions); } else { xmlpp::Element* nodeItem = 0; sharedptr fieldsummary = sharedptr::cast_dynamic(item); if(fieldsummary) //If it is a summaryfield { nodeItem = child->add_child(GLOM_NODE_DATA_LAYOUT_ITEM_FIELDSUMMARY); save_before_layout_item_field(nodeItem, fieldsummary); XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_LAYOUT_ITEM_FIELDSUMMARY_SUMMARYTYPE, fieldsummary->get_summary_type_sql()); //The SQL name is as good as anything as an identifier for the summary function. } else { sharedptr field = sharedptr::cast_dynamic(item); if(field) //If it is a field { nodeItem = child->add_child(GLOM_NODE_DATA_LAYOUT_ITEM); save_before_layout_item_field(nodeItem, field); } else { sharedptr button = sharedptr::cast_dynamic(item); if(button) //If it is a button { nodeItem = child->add_child(GLOM_NODE_DATA_LAYOUT_BUTTON); XmlUtils::set_child_text_node(nodeItem, GLOM_NODE_BUTTON_SCRIPT, button->get_script()); save_before_translations(nodeItem, button); } else { sharedptr textobject = sharedptr::cast_dynamic(item); if(textobject) //If it is a text object. { nodeItem = child->add_child(GLOM_NODE_DATA_LAYOUT_TEXTOBJECT); save_before_translations(nodeItem, textobject); //The text is translatable too, so we use a node for it: xmlpp::Element* element_text = nodeItem->add_child(GLOM_NODE_DATA_LAYOUT_TEXTOBJECT_TEXT); save_before_translations(element_text, textobject->m_text); } else { sharedptr imageobject = sharedptr::cast_dynamic(item); if(imageobject) //If it is an image object. { nodeItem = child->add_child(GLOM_NODE_DATA_LAYOUT_IMAGEOBJECT); save_before_translations(nodeItem, imageobject); XmlUtils::set_node_attribute_value_as_value(nodeItem, GLOM_ATTRIBUTE_DATA_LAYOUT_IMAGEOBJECT_IMAGE, imageobject->get_image(), Field::TYPE_IMAGE); } else { sharedptr line = sharedptr::cast_dynamic(item); if(line) //If it is a line { nodeItem = child->add_child(GLOM_NODE_DATA_LAYOUT_LINE); //This has no translations: save_before_translations(nodeItem, line); double start_x = 0; double start_y = 0; double end_x = 0; double end_y = 0; line->get_coordinates(start_x, start_y, end_x, end_y); XmlUtils::set_node_attribute_value_as_decimal_double(nodeItem, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_START_X, start_x); XmlUtils::set_node_attribute_value_as_decimal_double(nodeItem, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_START_Y, start_y); XmlUtils::set_node_attribute_value_as_decimal_double(nodeItem, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_END_X, end_x); XmlUtils::set_node_attribute_value_as_decimal_double(nodeItem, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_END_Y, end_y); XmlUtils::set_node_attribute_value_as_decimal_double(nodeItem, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_WIDTH, line->get_line_width()); XmlUtils::set_node_attribute_value(nodeItem, GLOM_ATTRIBUTE_DATA_LAYOUT_LINE_COLOR, line->get_line_color()); } } } } } if(nodeItem) { //Save formatting for any layout items that use it: sharedptr withformatting = sharedptr::cast_dynamic(item); if(withformatting) { xmlpp::Element* elementFormat = nodeItem->add_child(GLOM_NODE_FORMAT); save_before_layout_item_formatting(elementFormat, withformatting); } } } if(nodeItem) { //Attributes that any layout item could have: const guint column_width = item->get_display_width(); XmlUtils::set_node_attribute_value_as_decimal(nodeItem, GLOM_ATTRIBUTE_LAYOUT_ITEM_COLUMN_WIDTH, column_width); if(with_print_layout_positions) save_before_print_layout_position(nodeItem, item); } } //g_warning("save_before_layout_group: after child part type=%s", item->get_part_type_name().c_str()); } } void Document::save_before_translations(xmlpp::Element* element, const sharedptr& item) { if(!element) return; const sharedptr choicevalue = sharedptr::cast_dynamic(item); if(!choicevalue) //This item does not use the title, but uses the title translations to translate its value, if it is of type text. { XmlUtils::set_node_attribute_value(element, GLOM_ATTRIBUTE_TITLE, item->get_title_original()); } if(!item->get_has_translations()) return; xmlpp::Element* child = element->add_child(GLOM_NODE_TRANSLATIONS_SET); const TranslatableItem::type_map_locale_to_translations& map_translations = item->_get_translations_map(); for(TranslatableItem::type_map_locale_to_translations::const_iterator iter = map_translations.begin(); iter != map_translations.end(); ++iter) { xmlpp::Element* childItem = child->add_child(GLOM_NODE_TRANSLATION); XmlUtils::set_node_attribute_value(childItem, GLOM_ATTRIBUTE_TRANSLATION_LOCALE, iter->first); XmlUtils::set_node_attribute_value(childItem, GLOM_ATTRIBUTE_TRANSLATION_VALUE, iter->second); } //If it has a singular title, then save that too: const sharedptr has_title_singular = sharedptr::cast_dynamic(item); if(has_title_singular && has_title_singular->m_title_singular && !(has_title_singular->m_title_singular->get_title_original().empty())) { xmlpp::Element* nodeTitleSingular = element->add_child(GLOM_NODE_TABLE_TITLE_SINGULAR); save_before_translations(nodeTitleSingular, has_title_singular->m_title_singular); } } void Document::save_before_print_layout_position(xmlpp::Element* nodeItem, const sharedptr& item) { xmlpp::Element* child = nodeItem->add_child(GLOM_NODE_POSITION); double x = 0; double y = 0; double width = 0; double height = 0; item->get_print_layout_position(x, y, width, height); XmlUtils::set_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_POSITION_X, x); XmlUtils::set_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_POSITION_Y, y); XmlUtils::set_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_POSITION_WIDTH, width); XmlUtils::set_node_attribute_value_as_decimal_double(child, GLOM_ATTRIBUTE_POSITION_HEIGHT, height); //Avoid having an empty (or useless) XML element: if(child->get_attributes().empty()) nodeItem->remove_child(child); } void Document::save_before_choicevalue(xmlpp::Element* nodeItem, const sharedptr& item, Field::glom_field_type field_type) { if(!item) return; XmlUtils::set_node_attribute_value_as_value(nodeItem, GLOM_ATTRIBUTE_VALUE, item->get_value(), field_type); save_before_translations(nodeItem, item); } bool Document::save_before() { //TODO: Use some callback UI to show a busy cursor? /* //Use a std::auto_ptr<> to avoid even unncessarily instantiating a BusyCursor, //which would require GTK+ to be initialized: std::auto_ptr auto_cursor; if(m_parent_window) auto_cursor = std::auto_ptr( new BusyCursor(m_parent_window) ); */ //TODO: Add xmlpp::Document::remove_root_node() to libxml++ xmlpp::Element* nodeRoot = get_node_document(); if(nodeRoot) { // Remove existing child nodes: xmlpp::Node::NodeList listNodesToRemove = nodeRoot->get_children(); for(xmlpp::Node::NodeList::iterator iter = listNodesToRemove.begin(); iter != listNodesToRemove.end(); ++iter) nodeRoot->remove_child(*iter); //Always save as the latest format, //possibly making it impossible to open this document in older versions of Glom: m_document_format_version = get_latest_known_document_format_version(); XmlUtils::set_node_attribute_value_as_decimal(nodeRoot, GLOM_ATTRIBUTE_FORMAT_VERSION, m_document_format_version); XmlUtils::set_node_attribute_value_as_bool(nodeRoot, GLOM_ATTRIBUTE_IS_EXAMPLE, m_is_example); XmlUtils::set_node_attribute_value_as_bool(nodeRoot, GLOM_ATTRIBUTE_IS_BACKUP, m_is_backup); XmlUtils::set_node_attribute_value(nodeRoot, GLOM_ATTRIBUTE_TRANSLATION_ORIGINAL_LOCALE, m_translation_original_locale); save_before_translations(nodeRoot, m_database_title); XmlUtils::set_child_text_node(nodeRoot, GLOM_NODE_STARTUP_SCRIPT, m_startup_script); xmlpp::Element* nodeConnection = XmlUtils::get_node_child_named_with_add(nodeRoot, GLOM_NODE_CONNECTION); switch(m_hosting_mode) { case HOSTING_MODE_POSTGRES_CENTRAL: XmlUtils::set_node_attribute_value(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_HOSTING_MODE, GLOM_ATTRIBUTE_CONNECTION_HOSTING_POSTGRES_CENTRAL); break; case HOSTING_MODE_POSTGRES_SELF: XmlUtils::set_node_attribute_value(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_HOSTING_MODE, GLOM_ATTRIBUTE_CONNECTION_HOSTING_POSTGRES_SELF); break; case HOSTING_MODE_SQLITE: XmlUtils::set_node_attribute_value(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_HOSTING_MODE, GLOM_ATTRIBUTE_CONNECTION_HOSTING_SQLITE); break; default: g_assert_not_reached(); break; } XmlUtils::set_node_attribute_value_as_bool(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_NETWORK_SHARED, m_network_shared); XmlUtils::set_node_attribute_value(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_SERVER, m_connection_server); XmlUtils::set_node_attribute_value_as_decimal(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_PORT, m_connection_port); XmlUtils::set_node_attribute_value_as_bool(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_TRY_OTHER_PORTS, m_connection_try_other_ports, true /* default */); XmlUtils::set_node_attribute_value(nodeConnection, GLOM_ATTRIBUTE_CONNECTION_DATABASE, m_connection_database); //Remove existing tables: xmlpp::Node::NodeList listNodes = nodeRoot->get_children(GLOM_NODE_TABLE); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) nodeRoot->remove_child(*iter); //Add tables: for(type_tables::const_iterator iter = m_tables.begin(); iter != m_tables.end(); ++iter) { const DocumentTableInfo& doctableinfo = iter->second; const Glib::ustring table_name = doctableinfo.m_info->get_name(); if(table_name.empty()) std::cerr << G_STRFUNC << ": table name is empty." << std::endl; if(!table_name.empty()) { xmlpp::Element* nodeTable = nodeRoot->add_child(GLOM_NODE_TABLE); XmlUtils::set_node_attribute_value(nodeTable, GLOM_ATTRIBUTE_NAME, table_name); XmlUtils::set_node_attribute_value_as_bool(nodeTable, GLOM_ATTRIBUTE_HIDDEN, doctableinfo.m_info->get_hidden()); XmlUtils::set_node_attribute_value_as_bool(nodeTable, GLOM_ATTRIBUTE_DEFAULT, doctableinfo.m_info->get_default()); XmlUtils::set_node_attribute_value_as_float(nodeTable, GLOM_ATTRIBUTE_OVERVIEW_X, doctableinfo.m_overviewx); XmlUtils::set_node_attribute_value_as_float(nodeTable, GLOM_ATTRIBUTE_OVERVIEW_Y, doctableinfo.m_overviewy); if(m_is_example) //The example data is useless to non-example files (and is big): { xmlpp::Element* nodeExampleRows = nodeTable->add_child(GLOM_NODE_EXAMPLE_ROWS); for(type_example_rows::const_iterator iter = doctableinfo.m_example_rows.begin(); iter != doctableinfo.m_example_rows.end(); ++iter) { xmlpp::Element* nodeExampleRow = nodeExampleRows->add_child(GLOM_NODE_EXAMPLE_ROW); const type_row_data& row_data = *iter; if(!row_data.empty()) { for(unsigned int i = 0; i < row_data.size(); ++i) //TODO_Performance: don't call size() so much. { sharedptr field = doctableinfo.m_fields[i]; if(!field) break; xmlpp::Element* nodeField = nodeExampleRow->add_child(GLOM_NODE_VALUE); XmlUtils::set_node_attribute_value(nodeField, GLOM_ATTRIBUTE_COLUMN, field->get_name()); XmlUtils::set_node_text_child_as_value(nodeField, row_data[i], field->get_glom_type()); } // for each value } // !row_data.empty } // for each row } // m_is_example //Translations: save_before_translations(nodeTable, doctableinfo.m_info); //Fields: xmlpp::Element* elemFields = nodeTable->add_child(GLOM_NODE_FIELDS); const Field::type_map_type_names type_names = Field::get_type_names(); for(type_vec_fields::const_iterator iter = doctableinfo.m_fields.begin(); iter != doctableinfo.m_fields.end(); ++iter) { sharedptr field = *iter; xmlpp::Element* elemField = elemFields->add_child(GLOM_NODE_FIELD); XmlUtils::set_node_attribute_value(elemField, GLOM_ATTRIBUTE_NAME, field->get_name()); XmlUtils::set_node_attribute_value_as_bool(elemField, GLOM_ATTRIBUTE_PRIMARY_KEY, field->get_primary_key()); XmlUtils::set_node_attribute_value_as_bool(elemField, GLOM_ATTRIBUTE_UNIQUE, field->get_unique_key()); XmlUtils::set_node_attribute_value_as_bool(elemField, GLOM_ATTRIBUTE_AUTOINCREMENT, field->get_auto_increment()); XmlUtils::set_node_attribute_value_as_value(elemField, GLOM_ATTRIBUTE_DEFAULT_VALUE, field->get_default_value(), field->get_glom_type()); XmlUtils::set_child_text_node(elemField, GLOM_NODE_CALCULATION, field->get_calculation()); Glib::ustring field_type; Field::type_map_type_names::const_iterator iterTypes = type_names.find( field->get_glom_type() ); if(iterTypes != type_names.end()) field_type = iterTypes->second; XmlUtils::set_node_attribute_value(elemField, GLOM_ATTRIBUTE_TYPE, field_type); //Add Lookup sub-node: if(field->get_is_lookup()) { xmlpp::Element* elemFieldLookup = elemField->add_child(GLOM_NODE_FIELD_LOOKUP); sharedptr lookup_relationship = field->get_lookup_relationship(); XmlUtils::set_node_attribute_value(elemFieldLookup, GLOM_ATTRIBUTE_RELATIONSHIP_NAME, glom_get_sharedptr_name(lookup_relationship)); XmlUtils::set_node_attribute_value(elemFieldLookup, GLOM_ATTRIBUTE_FIELD, field->get_lookup_field()); } //Default Formatting: xmlpp::Element* elementFormat = elemField->add_child(GLOM_NODE_FORMAT); save_before_layout_item_formatting(elementFormat, field->m_default_formatting, field->get_glom_type()); //Translations: save_before_translations(elemField, field); } /* fields */ //Relationships: //Add new node: xmlpp::Element* elemRelationships = nodeTable->add_child(GLOM_NODE_RELATIONSHIPS); //Add each node: for(type_vec_relationships::const_iterator iter = doctableinfo.m_relationships.begin(); iter != doctableinfo.m_relationships.end(); ++iter) { sharedptr relationship = *iter; if(relationship) { xmlpp::Element* elemRelationship = elemRelationships->add_child(GLOM_NODE_RELATIONSHIP); XmlUtils::set_node_attribute_value(elemRelationship, GLOM_ATTRIBUTE_NAME, relationship->get_name()); XmlUtils::set_node_attribute_value(elemRelationship, GLOM_ATTRIBUTE_KEY, relationship->get_from_field()); XmlUtils::set_node_attribute_value(elemRelationship, GLOM_ATTRIBUTE_OTHER_TABLE, relationship->get_to_table()); XmlUtils::set_node_attribute_value(elemRelationship, GLOM_ATTRIBUTE_OTHER_KEY, relationship->get_to_field()); XmlUtils::set_node_attribute_value_as_bool(elemRelationship, GLOM_ATTRIBUTE_AUTO_CREATE, relationship->get_auto_create()); XmlUtils::set_node_attribute_value_as_bool(elemRelationship, GLOM_ATTRIBUTE_ALLOW_EDIT, relationship->get_allow_edit()); //Translations: save_before_translations(elemRelationship, relationship); } } //Layouts: xmlpp::Element* nodeDataLayouts = nodeTable->add_child(GLOM_NODE_DATA_LAYOUTS); //Add the groups: //Make sure that we always get these _after_ the relationships. for(DocumentTableInfo::type_layouts::const_iterator iter = doctableinfo.m_layouts.begin(); iter != doctableinfo.m_layouts.end(); ++iter) { xmlpp::Element* nodeLayout = nodeDataLayouts->add_child(GLOM_NODE_DATA_LAYOUT); XmlUtils::set_node_attribute_value(nodeLayout, GLOM_ATTRIBUTE_NAME, iter->m_layout_name); XmlUtils::set_node_attribute_value(nodeLayout, GLOM_ATTRIBUTE_LAYOUT_PLATFORM, iter->m_layout_platform); XmlUtils::set_node_attribute_value(nodeLayout, GLOM_ATTRIBUTE_PARENT_TABLE_NAME, iter->m_parent_table); xmlpp::Element* nodeGroups = nodeLayout->add_child(GLOM_NODE_DATA_LAYOUT_GROUPS); const type_list_layout_groups& groups = iter->m_layout_groups; for(type_list_layout_groups::const_iterator iterGroups = groups.begin(); iterGroups != groups.end(); ++iterGroups) { save_before_layout_group(nodeGroups, *iterGroups); } } //Reports: xmlpp::Element* nodeReports = nodeTable->add_child(GLOM_NODE_REPORTS); //Add the groups: for(DocumentTableInfo::type_reports::const_iterator iter = doctableinfo.m_reports.begin(); iter != doctableinfo.m_reports.end(); ++iter) { xmlpp::Element* nodeReport = nodeReports->add_child(GLOM_NODE_REPORT); sharedptr report = iter->second; XmlUtils::set_node_attribute_value(nodeReport, GLOM_ATTRIBUTE_NAME, report->get_name()); XmlUtils::set_node_attribute_value_as_bool(nodeReport, GLOM_ATTRIBUTE_REPORT_SHOW_TABLE_TITLE, report->get_show_table_title()); xmlpp::Element* nodeGroups = nodeReport->add_child(GLOM_NODE_DATA_LAYOUT_GROUPS); save_before_layout_group(nodeGroups, report->get_layout_group()); //Translations: save_before_translations(nodeReport, report); } //Print Layouts: xmlpp::Element* nodePrintLayouts = nodeTable->add_child(GLOM_NODE_PRINT_LAYOUTS); //Add the print : for(DocumentTableInfo::type_print_layouts::const_iterator iter = doctableinfo.m_print_layouts.begin(); iter != doctableinfo.m_print_layouts.end(); ++iter) { xmlpp::Element* nodePrintLayout = nodePrintLayouts->add_child(GLOM_NODE_PRINT_LAYOUT); sharedptr print_layout = iter->second; XmlUtils::set_node_attribute_value(nodePrintLayout, GLOM_ATTRIBUTE_NAME, print_layout->get_name()); XmlUtils::set_node_attribute_value_as_bool(nodePrintLayout, GLOM_ATTRIBUTE_REPORT_SHOW_TABLE_TITLE, print_layout->get_show_table_title()); XmlUtils::set_node_attribute_value_as_bool(nodePrintLayout, GLOM_ATTRIBUTE_PRINT_LAYOUT_SHOW_GRID, print_layout->get_show_grid()); XmlUtils::set_node_attribute_value_as_bool(nodePrintLayout, GLOM_ATTRIBUTE_PRINT_LAYOUT_SHOW_RULES, print_layout->get_show_rules()); XmlUtils::set_node_attribute_value_as_bool(nodePrintLayout, GLOM_ATTRIBUTE_PRINT_LAYOUT_SHOW_OUTLINES, print_layout->get_show_outlines()); //Save the rule lines: const PrintLayout::type_vec_doubles h_rules = print_layout->get_horizontal_rules(); for(PrintLayout::type_vec_doubles::const_iterator iter = h_rules.begin(); iter != h_rules.end(); ++iter) { xmlpp::Element* child = nodePrintLayout->add_child(GLOM_NODE_HORIZONTAL_RULE); XmlUtils::set_node_attribute_value_as_decimal(child, GLOM_ATTRIBUTE_RULE_POSITION, *iter); } const PrintLayout::type_vec_doubles v_rules = print_layout->get_vertical_rules(); for(PrintLayout::type_vec_doubles::const_iterator iter = v_rules.begin(); iter != v_rules.end(); ++iter) { xmlpp::Element* child = nodePrintLayout->add_child(GLOM_NODE_VERTICAL_RULE); XmlUtils::set_node_attribute_value_as_decimal(child, GLOM_ATTRIBUTE_RULE_POSITION, *iter); } //Page Setup: const std::string page_setup = print_layout->get_page_setup(); if(!page_setup.empty()) { xmlpp::Element* child = nodePrintLayout->add_child(GLOM_NODE_PAGE_SETUP); child->add_child_text( Utils::string_clean_for_xml(page_setup) ); } XmlUtils::set_node_attribute_value_as_decimal(nodePrintLayout, GLOM_ATTRIBUTE_PRINT_LAYOUT_PAGE_COUNT, print_layout->get_page_count(), 1); xmlpp::Element* nodeGroups = nodePrintLayout->add_child(GLOM_NODE_DATA_LAYOUT_GROUPS); save_before_layout_group(nodeGroups, print_layout->get_layout_group(), true /* x,y positions too. */); //Translations: save_before_translations(nodePrintLayout, print_layout); } } } //for m_tables //Remove existing groups: listNodes = nodeRoot->get_children(GLOM_NODE_GROUPS); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) nodeRoot->remove_child(*iter); //Add groups: xmlpp::Element* nodeGroups = nodeRoot->add_child(GLOM_NODE_GROUPS); nodeGroups->add_child_comment("These are only used when recreating a database from an example file. The actual access-control is on the server, of course."); for(type_map_groups::const_iterator iter = m_groups.begin(); iter != m_groups.end(); ++iter) { const GroupInfo& group_info = iter->second; const Glib::ustring group_name = group_info.get_name(); if(group_name.empty()) { //I saw this in at least one .glom file. murrayc. std::cerr << G_STRFUNC << ": The group name is empty." << std::endl; continue; } xmlpp::Element* nodeGroup = nodeGroups->add_child(GLOM_NODE_GROUP); XmlUtils::set_node_attribute_value(nodeGroup, GLOM_ATTRIBUTE_NAME, group_name); XmlUtils::set_node_attribute_value_as_bool(nodeGroup, GLOM_ATTRIBUTE_DEVELOPER, group_info.m_developer); //The privileges for each table, for this group: for(GroupInfo::type_map_table_privileges::const_iterator iter = group_info.m_map_privileges.begin(); iter != group_info.m_map_privileges.end(); ++iter) { xmlpp::Element* nodeTablePrivs = nodeGroup->add_child(GLOM_NODE_TABLE_PRIVS); XmlUtils::set_node_attribute_value(nodeTablePrivs, GLOM_ATTRIBUTE_TABLE_NAME, iter->first); const Privileges& privs = iter->second; XmlUtils::set_node_attribute_value_as_bool(nodeTablePrivs, GLOM_ATTRIBUTE_PRIV_VIEW, privs.m_view); XmlUtils::set_node_attribute_value_as_bool(nodeTablePrivs, GLOM_ATTRIBUTE_PRIV_EDIT, privs.m_edit); XmlUtils::set_node_attribute_value_as_bool(nodeTablePrivs, GLOM_ATTRIBUTE_PRIV_CREATE, privs.m_create); XmlUtils::set_node_attribute_value_as_bool(nodeTablePrivs, GLOM_ATTRIBUTE_PRIV_DELETE, privs.m_delete); } } //Remove existing library modules:: listNodes = nodeRoot->get_children(GLOM_NODE_LIBRARY_MODULES); for(xmlpp::Node::NodeList::iterator iter = listNodes.begin(); iter != listNodes.end(); ++iter) nodeRoot->remove_child(*iter); //Add groups: xmlpp::Element* nodeModules = nodeRoot->add_child(GLOM_NODE_LIBRARY_MODULES); for(type_map_library_scripts::const_iterator iter = m_map_library_scripts.begin(); iter != m_map_library_scripts.end(); ++iter) { const Glib::ustring& name = iter->first; const Glib::ustring& script = iter->second; xmlpp::Element* nodeModule = nodeModules->add_child(GLOM_NODE_LIBRARY_MODULE); //The name is in an attribute: XmlUtils::set_node_attribute_value(nodeModule, GLOM_ATTRIBUTE_LIBRARY_MODULE_NAME, name); //The script is in a child text node: xmlpp::TextNode* text_child = nodeModule->get_child_text(); if(!text_child) nodeModule->add_child_text( Utils::string_clean_for_xml(script) ); else text_child->set_content( Utils::string_clean_for_xml(script) ); } } //We don't use set_write_formatted() because it doesn't handle text nodes well. add_indenting_white_space_to_node(); return GlomBakery::Document_XML::save_before(); } Glib::ustring Document::get_database_title_original() const { return m_database_title->get_title_original(); } Glib::ustring Document::get_database_title(const Glib::ustring& locale) const { return m_database_title->get_title(locale); } void Document::set_database_title_original(const Glib::ustring& title) { if(get_database_title_original() != title) { m_database_title->set_title_original(title); set_modified(); } } Glib::ustring Document::get_name() const { //Show the database title in the window title bar: const Glib::ustring title = get_database_title_original(); if(title.empty()) return GlomBakery::Document_XML::get_name(); else return title; } Document::type_list_groups Document::get_groups() const { type_list_groups result; for(type_map_groups::const_iterator iter = m_groups.begin(); iter != m_groups.end(); ++iter) { result.push_back(iter->second); } return result; } ///This adds the group if necessary. void Document::set_group(GroupInfo& group) { const Glib::ustring name = group.get_name(); type_map_groups::iterator iter = m_groups.find(name); if(iter == m_groups.end()) { //Add it if necesary: m_groups[name] = group; set_modified(); } else { const GroupInfo this_group = iter->second; if(this_group != group) { iter->second = group; set_modified(); } } } void Document::remove_group(const Glib::ustring& group_name) { type_map_groups::iterator iter = m_groups.find(group_name); if(iter != m_groups.end()) { m_groups.erase(iter); set_modified(); } } std::vector Document::get_report_names(const Glib::ustring& table_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { std::vector result; for(DocumentTableInfo::type_reports::const_iterator iter = iterFind->second.m_reports.begin(); iter != iterFind->second.m_reports.end(); ++iter) { result.push_back(iter->second->get_name()); } return result; } else return std::vector(); } void Document::set_report(const Glib::ustring& table_name, const sharedptr& report) { type_tables::iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { iterFind->second.m_reports[report->get_name()] = report; set_modified(); } } sharedptr Document::get_report(const Glib::ustring& table_name, const Glib::ustring& report_name) const { type_tables::const_iterator iterFindTable = m_tables.find(table_name); if(iterFindTable != m_tables.end()) { DocumentTableInfo::type_reports::const_iterator iterFindReport = iterFindTable->second.m_reports.find(report_name); if(iterFindReport != iterFindTable->second.m_reports.end()) { return iterFindReport->second; } } return sharedptr(); } void Document::remove_report(const Glib::ustring& table_name, const Glib::ustring& report_name) { type_tables::iterator iterFindTable = m_tables.find(table_name); if(iterFindTable != m_tables.end()) { DocumentTableInfo::type_reports::iterator iterFindReport = iterFindTable->second.m_reports.find(report_name); if(iterFindReport != iterFindTable->second.m_reports.end()) { iterFindTable->second.m_reports.erase(iterFindReport); set_modified(); } } } std::vector Document::get_print_layout_names(const Glib::ustring& table_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { std::vector result; for(DocumentTableInfo::type_print_layouts::const_iterator iter = iterFind->second.m_print_layouts.begin(); iter != iterFind->second.m_print_layouts.end(); ++iter) { result.push_back(iter->second->get_name()); } return result; } else return std::vector(); } void Document::set_print_layout(const Glib::ustring& table_name, const sharedptr& print_layout) { type_tables::iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { iterFind->second.m_print_layouts[print_layout->get_name()] = print_layout; set_modified(); } } sharedptr Document::get_print_layout(const Glib::ustring& table_name, const Glib::ustring& print_layout_name) const { type_tables::const_iterator iterFindTable = m_tables.find(table_name); if(iterFindTable != m_tables.end()) { DocumentTableInfo::type_print_layouts::const_iterator iterFindPrintLayout = iterFindTable->second.m_print_layouts.find(print_layout_name); if(iterFindPrintLayout != iterFindTable->second.m_print_layouts.end()) { return iterFindPrintLayout->second; } } return sharedptr(); } void Document::remove_print_layout(const Glib::ustring& table_name, const Glib::ustring& print_layout_name) { type_tables::iterator iterFindTable = m_tables.find(table_name); if(iterFindTable != m_tables.end()) { DocumentTableInfo::type_print_layouts::iterator iterFindPrintLayout = iterFindTable->second.m_print_layouts.find(print_layout_name); if(iterFindPrintLayout != iterFindTable->second.m_print_layouts.end()) { iterFindTable->second.m_print_layouts.erase(iterFindPrintLayout); set_modified(); } } } bool Document::get_relationship_is_to_one(const Glib::ustring& table_name, const Glib::ustring& relationship_name) const { sharedptr relationship = get_relationship(table_name, relationship_name); if(relationship) { sharedptr field_to = get_field(relationship->get_to_table(), relationship->get_to_field()); if(field_to) return (field_to->get_primary_key() || field_to->get_unique_key()); } return false; } sharedptr Document::get_field_used_in_relationship_to_one(const Glib::ustring& table_name, const sharedptr& layout_field) const { sharedptr result; if(!layout_field) { std::cerr << G_STRFUNC << ": layout_field was null" << std::endl; return result; } const Glib::ustring table_used = layout_field->get_table_used(table_name); type_tables::const_iterator iterFind = m_tables.find(table_used); if(iterFind == m_tables.end()) { //This table is special. We would not create a relationship to it using a field: if(table_used == GLOM_STANDARD_TABLE_PREFS_TABLE_NAME) return result; std::cerr << G_STRFUNC << ": table not found:" << table_used << std::endl; return result; } //Look at each relationship: const DocumentTableInfo& table_info = iterFind->second; const Glib::ustring field_name = layout_field->get_name(); for(type_vec_relationships::const_iterator iterRel = table_info.m_relationships.begin(); iterRel != table_info.m_relationships.end(); ++iterRel) { sharedptr relationship = *iterRel; if(relationship) { //If the relationship uses the field if(relationship->get_from_field() == field_name) { //if the to_table is not hidden: if(!get_table_is_hidden(relationship->get_to_table())) { //TODO_Performance: The use of this convenience method means we get the full relationship information again: if(get_relationship_is_to_one(table_name, relationship->get_name())) { result = relationship; } } } } } return result; } void Document::forget_layout_record_viewed(const Glib::ustring& table_name) { type_tables::iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { iterFind->second.m_map_current_record.clear(); } } void Document::set_layout_record_viewed(const Glib::ustring& table_name, const Glib::ustring& layout_name, const Gnome::Gda::Value& primary_key_value) { type_tables::iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { iterFind->second.m_map_current_record[layout_name] = primary_key_value; } } Gnome::Gda::Value Document::get_layout_record_viewed(const Glib::ustring& table_name, const Glib::ustring& layout_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { const DocumentTableInfo& info = iterFind->second; DocumentTableInfo::type_map_layout_primarykeys::const_iterator iterLayoutKeys = info.m_map_current_record.find(layout_name); if(iterLayoutKeys != info.m_map_current_record.end()) return iterLayoutKeys->second; } return Gnome::Gda::Value(); //not found. } void Document::set_layout_current(const Glib::ustring& table_name, const Glib::ustring& layout_name) { type_tables::iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { DocumentTableInfo& table_info = iterFind->second; table_info.m_layout_current = layout_name; } } void Document::set_criteria_current(const Glib::ustring& table_name, const FoundSet& found_set) { type_tables::iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { DocumentTableInfo& table_info = iterFind->second; table_info.m_foundset_current = found_set; } } Glib::ustring Document::get_layout_current(const Glib::ustring& table_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { const DocumentTableInfo& table_info = iterFind->second; return table_info.m_layout_current; } return Glib::ustring(); //not found. } FoundSet Document::get_criteria_current(const Glib::ustring& table_name) const { type_tables::const_iterator iterFind = m_tables.find(table_name); if(iterFind != m_tables.end()) { const DocumentTableInfo& table_info = iterFind->second; return table_info.m_foundset_current; } return FoundSet(); } bool Document::get_is_example_file() const { return m_is_example; } void Document::set_is_example_file(bool value) { if(m_is_example != value) { m_is_example = value; set_modified(); } } bool Document::get_is_backup_file() const { return m_is_backup; } void Document::set_is_backup_file(bool value) { if(m_is_backup != value) { m_is_backup = value; set_modified(); } } void Document::set_translation_original_locale(const Glib::ustring& locale) { if(m_translation_original_locale == locale) return; m_translation_original_locale = locale; set_modified(); } Glib::ustring Document::get_translation_original_locale() const { return m_translation_original_locale; } std::vector Document::get_translation_available_locales() const { return m_translation_available_locales; } template static void translatable_items_append_with_hint(Document::type_list_translatables& result, T_List& list_items, const Glib::ustring& hint) { for(typename T_List::iterator iter = list_items.begin(); iter != list_items.end(); ++iter) { result.push_back( Document::pair_translatable_item_and_hint(*iter, hint) ); } } Document::type_list_translatables Document::get_translatable_items() { type_list_translatables result; result.push_back( pair_translatable_item_and_hint(m_database_title, "") ); //Add tables: type_listTableInfo tables = get_tables(); for(type_listTableInfo::const_iterator iter = tables.begin(); iter != tables.end(); ++iter) { sharedptr tableinfo = *iter; if(!tableinfo) continue; result.push_back( pair_translatable_item_and_hint(tableinfo, "") ); const Glib::ustring table_name = tableinfo->get_name(); //The table's field titles: const Glib::ustring hint = "Parent table: " + table_name; type_vec_fields fields = get_table_fields(table_name); for(type_vec_fields::iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr field = *iter; if(!field) continue; result.push_back( pair_translatable_item_and_hint(field, hint) ); //Custom Choices, if any: if(field->get_glom_type() == Field::TYPE_TEXT) //Choices for other field types could not be translated. { const Glib::ustring this_hint = hint + ", Parent Field: " + field->get_name(); type_list_translatables list_choice_items; Document::fill_translatable_custom_choices(field->m_default_formatting, list_choice_items, this_hint); result.insert(result.end(), list_choice_items.begin(), list_choice_items.end()); } } //The table's relationships: type_vec_relationships relationships = get_relationships(table_name); translatable_items_append_with_hint(result, relationships, hint); //The table's report titles: std::vector listReports = get_report_names(table_name); for(std::vector::iterator iter = listReports.begin(); iter != listReports.end(); ++iter) { const Glib::ustring report_name = *iter; sharedptr report = get_report(table_name, report_name); if(!report) continue; result.push_back( pair_translatable_item_and_hint(report, hint) ); //Translatable report items: const Glib::ustring this_hint = hint + ", Parent Report: " + report->get_name(); type_list_translatables list_layout_items = get_translatable_report_items(table_name, report_name, this_hint); result.insert(result.end(), list_layout_items.begin(), list_layout_items.end()); } //The table's translatable layout items: type_list_translatables list_layout_items = get_translatable_layout_items(table_name, hint); result.insert(result.end(), list_layout_items.begin(), list_layout_items.end()); } //for return result; } Document::type_list_translatables Document::get_translatable_layout_items(const Glib::ustring& table_name, const Glib::ustring& hint) { type_list_translatables result; type_tables::iterator iterFindTable = m_tables.find(table_name); if(iterFindTable != m_tables.end()) { //Look at each layout: for(DocumentTableInfo::type_layouts::iterator iterLayouts = iterFindTable->second.m_layouts.begin(); iterLayouts != iterFindTable->second.m_layouts.end(); ++iterLayouts) { //Look at each group: for(type_list_layout_groups::iterator iterGroup = iterLayouts->m_layout_groups.begin(); iterGroup != iterLayouts->m_layout_groups.end(); ++iterGroup) { sharedptr group = *iterGroup; if(group) { fill_translatable_layout_items(group, result, hint); } } } } return result; } Document::type_list_translatables Document::get_translatable_report_items(const Glib::ustring& table_name, const Glib::ustring& report_title, const Glib::ustring& hint) { Document::type_list_translatables the_list; sharedptr report = get_report(table_name, report_title); if(report) fill_translatable_layout_items(report->get_layout_group(), the_list, hint); return the_list; } void Document::fill_translatable_custom_choices(Formatting& formatting, type_list_translatables& the_list, const Glib::ustring& hint) { if(!formatting.get_has_custom_choices()) return; Formatting::type_list_values values = formatting.get_choices_custom(); for(Formatting::type_list_values::iterator iter = values.begin(); iter != values.end(); ++iter) { sharedptr value = *iter; the_list.push_back( pair_translatable_item_and_hint(value, hint) ); } } void Document::fill_translatable_layout_items(const sharedptr& layout_field, type_list_translatables& the_list, const Glib::ustring& hint) { //LayoutItem_Field items do not have their own titles. //They use either the field's title or a custom title: sharedptr custom_title = layout_field->get_title_custom(); if(custom_title) { the_list.push_back( pair_translatable_item_and_hint(custom_title, hint) ); } //The field will be added separately. //Custom Choices, if any: //Only text fields can have translated choice values: if(layout_field->get_glom_type() == Field::TYPE_TEXT) { const Glib::ustring choice_hint = hint + ", Parent Field: " + layout_field->get_name(); fill_translatable_custom_choices(layout_field->m_formatting, the_list, hint); } } void Document::fill_translatable_layout_items(const sharedptr& group, type_list_translatables& the_list, const Glib::ustring& hint) { //Portals don't have their own titles - they use the relationship title (though we might want to allow custom titles) sharedptr portal = sharedptr::cast_dynamic(group); if(!portal) { the_list.push_back( pair_translatable_item_and_hint(group, hint) ); } const Glib::ustring group_name = group->get_name(); Glib::ustring this_hint = hint; if(!group_name.empty()) this_hint += ", Parent Group: " + group_name; //Look at each item: LayoutGroup::type_list_items items = group->get_items(); for(LayoutGroup::type_list_items::const_iterator iterItems = items.begin(); iterItems != items.end(); ++iterItems) { sharedptr item = *iterItems; sharedptr child_group = sharedptr::cast_dynamic(item); if(child_group) //If it is a group, portal, summary, or groupby. { sharedptr group_by = sharedptr::cast_dynamic(child_group); if(group_by) { sharedptr field = group_by->get_field_group_by(); fill_translatable_layout_items(field, the_list, hint); fill_translatable_layout_items(group_by->get_secondary_fields(), the_list, this_hint); } //recurse: fill_translatable_layout_items(child_group, the_list, this_hint); } else { //Buttons too: sharedptr button = sharedptr::cast_dynamic(item); if(button) the_list.push_back( pair_translatable_item_and_hint(button, this_hint) ); else { sharedptr layout_field = sharedptr::cast_dynamic(item); if(layout_field) { fill_translatable_layout_items(layout_field, the_list, hint); } } } } } void Document::set_file_uri(const Glib::ustring& file_uri, bool bEnforceFileExtension /* = false */) { Glib::ustring file_uri_used = file_uri; //Enforce file extension: if(bEnforceFileExtension) file_uri_used = get_file_uri_with_extension(file_uri); //const bool changed = (file_uri_used != m_file_uri); //We override this because set_modified() triggers a save (to the old filename) in this derived class. //I'm not sure why this is in the base class's method anyway. murrayc: //if(file_uri != m_file_uri) // set_modified(); //Ready to save() for a Save As. m_file_uri = file_uri_used; //Put this here instead. In the base class it's at the start: //Actually, we do not call this, because it would trigger a save, when using autosave, //and that could cause an empty document to be saved to a URL before calling load() to load the real document that was there. //if(changed) // set_modified(); //Ready to save() for a Save As. } guint Document::get_document_format_version() { return m_document_format_version; } guint Document::get_latest_known_document_format_version() { // History: // Version 0: The first document format. (And the default version number when no version number was saved in the .XML) // Version 1: Saved scripts and other multiline text in text nodes instead of attributes. Can open Version 1 documents. // Version 2: hosting_mode="postgres-central|postgres-self|sqlite" instead of self_hosted="true|false". Can open Version 1 documents, by falling back to the self_hosted attribute if hosting_mode is not set. // Version 3: (Glom 1.10). Support for the old one-big-string example_rows format was removed, and we now use (unquoted) non-postgres libgda escaping. // Version 4: (Glom 1.12). Portal navigation options were simplified, with a "none" option. network_sharing was added, defaulting to off. // Version 5: (Glom 1.14). Extra layout item formatting options were added, plus a startup script. // Version 6: (Glom 1.16). Extra show_all option for choices that show related records. Extra related choice fields are now a layout group instead of just a second field name. // Version 7: (Glom 1.20). New print layout details. Related records: Number of rows can be specified. All colors can now be in CSS3 string format (via GdkRGBA) // Version 8: (Glom 1.22). The database_title attribute is replaced by the title attribute. return 8; } std::vector Document::get_library_module_names() const { std::vector result; for(type_map_library_scripts::const_iterator iter = m_map_library_scripts.begin(); iter != m_map_library_scripts.end(); ++iter) { result.push_back(iter->first); } return result; } void Document::set_library_module(const Glib::ustring& name, const Glib::ustring& script) { if(name.empty()) return; type_map_library_scripts::iterator iter = m_map_library_scripts.find(name); if(iter != m_map_library_scripts.end()) { //Change the existing script, if necessary: if(iter->second != script) { iter->second = script; set_modified(); } } else { //Add the script: m_map_library_scripts[name] = script; set_modified(); } } Glib::ustring Document::get_library_module(const Glib::ustring& name) const { type_map_library_scripts::const_iterator iter = m_map_library_scripts.find(name); if(iter != m_map_library_scripts.end()) { return iter->second; } return Glib::ustring(); } void Document::remove_library_module(const Glib::ustring& name) { type_map_library_scripts::iterator iter = m_map_library_scripts.find(name); if(iter != m_map_library_scripts.end()) { m_map_library_scripts.erase(iter); set_modified(); } } Glib::ustring Document::get_startup_script() const { return m_startup_script; } void Document::set_startup_script(const Glib::ustring& script) { if(m_startup_script == script) return; m_startup_script = script; set_modified(); } Glib::ustring Document::build_and_get_contents() const { //save_before() probably should be const because it doesn't change much of the external behaviour: Document* unconst = const_cast(this); unconst->save_before(); //This is the part of the Document_XML overrides that sets the contents string from the XML tree. return get_contents(); } void Document::set_opened_from_browse(bool val) { m_opened_from_browse = val; //This should stop developer mode from being possible, //because we don't have access to the document: if(!val) m_app_state.set_userlevel(AppState::USERLEVEL_OPERATOR); } bool Document::get_opened_from_browse() const { return m_opened_from_browse; } bool Document::load(int& failure_code) { return GlomBakery::Document_XML::load(failure_code); } Glib::ustring Document::save_backup_file(const Glib::ustring& uri, const SlotProgress& slot_progress) { //Save a copy of the .glom document, //with the same name as the directory: //For instance /chosendirectory/chosendirectory.glom const std::string path_dir = Glib::filename_from_uri(uri); const std::string basename = Glib::path_get_basename(path_dir); const std::string& filepath_document = Glib::build_filename(path_dir, basename + ".glom"); const Glib::ustring uri_document = Glib::filename_to_uri(filepath_document); const Glib::ustring fileuri_old = get_file_uri(); set_allow_autosave(false); //Prevent saving while we modify the document: set_file_uri(uri_document, true); //true = enforce file extension; set_is_backup_file(true); const bool saved = save(); set_file_uri(fileuri_old); set_is_backup_file(false); set_allow_autosave(true); if(!saved) { std::cerr << G_STRFUNC << ": Saving of the backup .glom file failed with URI:" << uri_document << std::endl; return Glib::ustring(); } //Save the data: ConnectionPool* connection_pool = ConnectionPool::get_instance(); const bool data_saved = connection_pool->save_backup(slot_progress, path_dir); if(!data_saved) { std::cerr << G_STRFUNC << ": Saving of the backup data failed with path_dir=" << path_dir << std::endl; return Glib::ustring(); } //Compress the backup in a .tar.gz, so it is slightly more safe from changes: const std::string path_tar = Glib::find_program_in_path("tar"); if(path_tar.empty()) { std::cerr << G_STRFUNC << ": The tar executable could not be found." << std::endl; return Glib::ustring(); } else { Glib::RefPtr gio_file = Gio::File::create_for_path(path_dir); const std::string basename = gio_file->get_basename(); Glib::RefPtr gio_file_parent = gio_file->get_parent(); const std::string parent_dir = gio_file_parent->get_path(); if(parent_dir.empty() || basename.empty()) { std::cerr << G_STRFUNC << "parent_dir or basename are empty." << std::endl; return Glib::ustring(); } else { const std::string tarball_path = path_dir + ".tar.gz"; //TODO: Find some way to do this without using the command-line, //which feels fragile: const std::string command_tar = Glib::shell_quote(path_tar) + " --force-local --no-wildcards" + //Avoid side-effects of special characters. " --remove-files" + " -czf" " " + Glib::shell_quote(tarball_path) + " --directory " + Glib::shell_quote(parent_dir) + //This must be right before the mention of the file name: " " + Glib::shell_quote(basename); //std::cout << "DEBUG: command_tar=" << command_tar << std::endl; const bool tarred = Glom::Spawn::execute_command_line_and_wait(command_tar, slot_progress); if(!tarred) { std::cerr << G_STRFUNC << "tar failed with command:" << command_tar << std::endl; return Glib::ustring(); } return Glib::filename_to_uri(tarball_path); } } } Glib::ustring Document::restore_backup_file(const Glib::ustring& backup_uri, const SlotProgress& slot_progress) { // We cannot use an uri here, because we cannot untar remote files. const std::string filename_tarball = Glib::filename_from_uri(backup_uri); const std::string path_tar = Glib::find_program_in_path("tar"); if(path_tar.empty()) { std::cerr << G_STRFUNC << ": The tar executable could not be found." << std::endl; return Glib::ustring(); } //Create a temporary directory into which we will untar the tarball: const std::string path_tmp = Utils::get_temp_directory_path( Glib::path_get_basename(filename_tarball) + "_extracted"); //Untar into the tmp directory: //TODO: Find some way to do this without using the command-line, //which feels fragile: const std::string command_tar = Glib::shell_quote(path_tar) + " --force-local --no-wildcards" + //Avoid side-effects of special characters. " -xzf" " " + Glib::shell_quote(filename_tarball) + " --directory " + Glib::shell_quote(path_tmp); //std::cout << "DEBUG: command_tar=" << command_tar << std::endl; const bool untarred = Glom::Spawn::execute_command_line_and_wait(command_tar, slot_progress); if(!untarred) { std::cerr << G_STRFUNC << ": tar failed with command:" << command_tar << std::endl; return Glib::ustring(); } //Open the .glom file that is in the tmp directory: const Glib::ustring uri_tmp = Glib::filename_to_uri(path_tmp); const Glib::ustring untarred_uri = Utils::get_directory_child_with_suffix(uri_tmp, ".glom", true /* recurse */); if(untarred_uri.empty()) { std::cerr << G_STRFUNC << ": There was an error while restoring the backup. The .glom file could not be found."; return Glib::ustring(); } //Delete the temporary untarred directory: //Actually, we just leave this here, where the system will clean it up anyway, //because open_document() starts a new process, //so we don't know when we can safely delete the files. //Utils::delete_directory(uri_tmp); return untarred_uri; } Document::type_list_lookups Document::get_lookup_fields(const Glib::ustring& table_name, const Glib::ustring& field_name) const { type_list_lookups result; //Examine all fields for this table: const type_vec_fields fields = get_table_fields(table_name); //TODO_Performance: Cache this? for(type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr field = *iter; //Examine each field that looks up its data from a relationship: if(field && field->get_is_lookup()) { //Get the relationship information: sharedptr relationship = field->get_lookup_relationship(); if(relationship) { //If the relationship is triggererd by the specified field: if(relationship->get_from_field() == field_name) { //Add it: sharedptr item = sharedptr::create(); item->set_full_field_details(field); result.push_back( type_pairFieldTrigger(item, relationship) ); } } } } return result; } } //namespace Glom glom-1.22.4/glom/libglom/document/bakery/0000755000175000017500000000000012235000126021431 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/libglom/document/bakery/view/0000755000175000017500000000000012235000126022403 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/libglom/document/bakery/view/viewbase.h0000644000175000017500000000254512234252646024406 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_BAKERY_VIEWBASE_H #define GLOM_BAKERY_VIEWBASE_H #include namespace GlomBakery { /** This is a base class for View. * This allows the App to call load_from_document() and save_to_document(), * without knowing exactly what type of document the view uses. */ class ViewBase : virtual public sigc::trackable { public: ViewBase(); virtual ~ViewBase(); virtual void load_from_document(); virtual void save_to_document(); //Override these: virtual void clipboard_copy(); virtual void clipboard_paste(); virtual void clipboard_clear(); }; } //namespace #endif glom-1.22.4/glom/libglom/document/bakery/view/view_composite.h0000644000175000017500000000543612234252646025637 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_BAKERY_VIEW_COMPOSITE_H #define GLOM_BAKERY_VIEW_COMPOSITE_H #include #include #include //For std::find namespace GlomBakery { /** This View delegates to sub-views. * It is very simplistic - maybe your View should be more intelligent. */ template< class T_Document > class View_Composite : public View { public: View_Composite() { } virtual ~View_Composite() { } typedef View type_view; virtual void add_view(type_view* pView) { //Ensure that the view has the same document: //This should be unnecessary. if(pView) { pView->set_document(View::get_document()); //Add it to the list of child views: m_vecViews.push_back(pView); } } virtual void remove_view(type_view* pView) { typename type_vec_views::iterator iter = std::find(m_vecViews.begin(), m_vecViews.end(), pView); if(iter != m_vecViews.end()) m_vecViews.erase(iter); } virtual void set_document(T_Document* pDocument) { //Call base class: View::set_document(pDocument); //Change the document in the child views. for(typename type_vec_views::iterator iter = m_vecViews.begin(); iter != m_vecViews.end(); ++iter) { type_view* pView = *iter; if(pView) pView->set_document(pDocument); } } virtual void load_from_document() { //Delegate to the child views: for(typename type_vec_views::iterator iter = m_vecViews.begin(); iter != m_vecViews.end(); ++iter) { type_view* pView = *iter; if(pView) pView->load_from_document(); } } virtual void save_to_document() { //Delegate to the child views: for(typename type_vec_views::iterator iter = m_vecViews.begin(); iter != m_vecViews.end(); ++iter) { type_view* pView = *iter; if(pView) pView->save_to_document(); } } protected: typedef std::vector type_vec_views; type_vec_views m_vecViews; }; } //namespace #endif glom-1.22.4/glom/libglom/document/bakery/view/view.cc0000644000175000017500000000152412234252646023705 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include namespace GlomBakery { } //namespace glom-1.22.4/glom/libglom/document/bakery/view/view.h0000644000175000017500000000402512234252646023546 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_BAKERY_VIEW_H #define GLOM_BAKERY_VIEW_H #include #include #include namespace GlomBakery { /** This is a base class which should be multiple-inherited with gtkmm widgets. * You should override save_to_document() and load_from_document(). */ template< class T_Document > class View : public ViewBase { public: View() : m_pDocument(0) { } virtual ~View() { } typedef View type_self; //typedef typename T_Document type_document; virtual T_Document* get_document() { return m_pDocument; } virtual const T_Document* get_document() const { return m_pDocument; } virtual void set_document(T_Document* pDocument) { m_pDocument = pDocument; if(m_pDocument) m_pDocument->signal_forget().connect( sigc::mem_fun(*this, &type_self::on_document_forget) ); } ///Just a convenience, instead of get_docuement()->set_modified(). virtual void set_modified(bool val = true) { if(m_pDocument) m_pDocument->set_modified(val); } protected: void on_document_forget() { //This should prevent some segfaults: m_pDocument = 0; } T_Document* m_pDocument; }; } //namespace #endif //BAKERY_VIEW_H glom-1.22.4/glom/libglom/document/bakery/view/view_composite.cc0000644000175000017500000000153712234252646025773 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include namespace GlomBakery { } //namespace glom-1.22.4/glom/libglom/document/bakery/view/viewbase.cc0000644000175000017500000000211512234252646024535 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include namespace GlomBakery { ViewBase::ViewBase() { } ViewBase::~ViewBase() { } void ViewBase::load_from_document() { } void ViewBase::save_to_document() { } void ViewBase::clipboard_copy() { } void ViewBase::clipboard_paste() { } void ViewBase::clipboard_clear() { } } //namespace glom-1.22.4/glom/libglom/document/bakery/document.cc0000644000175000017500000003077712234776363023622 0ustar00murraycmurrayc00000000000000/* * Copyright 2002 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include namespace GlomBakery { const guint BYTES_TO_PROCESS = 256; Document::Document() { m_bIsNew = true; m_bModified = false; m_bReadOnly = false; m_pView = 0; } Document::~Document() { //Tell views to forget the document - to null their pointers to it. We should maybe use the Document via a sharing smartpointer instead. signal_forget_.emit(); } Glib::ustring Document::get_file_uri() const { return m_file_uri; } Glib::ustring Document::get_file_uri_with_extension(const Glib::ustring& uri) { Glib::ustring result = uri; //Enforce file extension: if(!m_file_extension.empty()) //If there is an extension to enforce. { bool bAddExt = false; const Glib::ustring strExt = '.' + get_file_extension(); if(result.size() < strExt.size()) //It can't have the ext already if it's not long enough. { bAddExt = true; //It isn't there already. } else { const Glib::ustring strEnd = result.substr(result.size() - strExt.size()); if(strEnd != strExt) //If it doesn't already have the extension bAddExt = true; } //Add extension if necessay. if(bAddExt) result += strExt; //Note that this does not replace existing extensions, so it could be e.g. 'something.blah.theext' } return result; } void Document::set_file_uri(const Glib::ustring& file_uri, bool bEnforceFileExtension /* = false */) { if(file_uri != m_file_uri) set_modified(); //Ready to save() for a Save As. m_file_uri = file_uri; //Enforce file extension: if(bEnforceFileExtension) m_file_uri = get_file_uri_with_extension(m_file_uri); } Glib::ustring Document::get_contents() const { return m_strContents; } void Document::set_modified(bool bVal /* = true */) { m_bModified = bVal; if(m_bModified) { m_bIsNew = false; //Can't be new if it's been modified. } //Allow the application or view to update it's UI accordingly: signal_modified().emit(m_bModified); } bool Document::get_modified() const { return m_bModified; } bool Document::load(int& failure_code) { //Initialize the output parameter: failure_code = LOAD_FAILURE_CODE_NONE; bool bTest = read_from_disk(failure_code); if(bTest) { bTest = load_after(failure_code); //may be overridden. if(bTest) { //Tell the View to show the new data: if(m_pView) m_pView->load_from_document(); } } set_is_new(false); return bTest; } bool Document::load_from_data(const guchar* data, std::size_t length, int& failure_code) { if(!data || !length) return false; //Initialize the output parameter: failure_code = 0; m_strContents = Glib::ustring((char*)data, length); const bool bTest = load_after(failure_code); //may be overridden. if(bTest) { //Tell the View to show the new data: if(m_pView) m_pView->load_from_document(); } set_is_new(false); return bTest; } bool Document::load_after(int& failure_code) { //Called after text is read from disk, but before updating view. //Override this if necessary. //For instance, Document_XML parses the XML. failure_code = 0; return true; } bool Document::save() { //Tell the view to update the data in this document. if(m_pView) m_pView->save_to_document(); const bool bTest = save_before(); //This could be overridden. if(bTest) return write_to_disk(); return bTest; } bool Document::save_before() { //Called after view saves itself to document, but before writing to disk. //Override this if necessary. //For instance, Document_XML serializes its XML to text. return true; } bool Document::read_from_disk(int& failure_code) { failure_code = LOAD_FAILURE_CODE_NONE; m_strContents.erase(); // Open the input file for read access: if(m_file_uri.empty()) return false; Glib::RefPtr file = Gio::File::create_for_uri(m_file_uri); Glib::RefPtr stream; try { stream = file->read(); } catch(const Gio::Error& ex) { std::cerr << G_STRFUNC << ": Error: " << ex.what() << std::endl; std::cerr << " with m_file_uri=" << m_file_uri << std::endl; if(ex.code() == Gio::Error::NOT_FOUND) failure_code = LOAD_FAILURE_CODE_NOT_FOUND; // std::cout << " File not found: " << m_file_uri << std::endl; // If the operation was not successful, print the error and abort return false; //print_error(ex, input_uri_string); } // Read data from the input uri: guint buffer[BYTES_TO_PROCESS] = {0, }; // For each chunk. gsize bytes_read = 0; std::string data; //We use a std::string because we might not get whole UTF8 characters at a time. This might not be necessary. try { bool bContinue = true; while(bContinue) { bytes_read = stream->read(buffer, BYTES_TO_PROCESS); if(bytes_read == 0) bContinue = false; //stop because we reached the end. else { // Add the text to the string: data += std::string((char*)buffer, bytes_read); } } } catch(const Gio::Error& ex) { // If the operation was not successful, print the error and abort return false; //print_error(ex, input_uri_string); } m_strContents = data; set_modified(false); return true; //Success. } bool Document::write_to_disk() { if(m_file_uri.empty()) { std::cerr << G_STRFUNC << ": m_file_uri is empty." << std::endl; return false; } //Write the changed data to disk: if(get_modified()) { Glib::RefPtr file = Gio::File::create_for_uri(m_file_uri); Glib::RefPtr stream; //Create the file if it does not already exist: if(file->query_exists()) { try { stream = file->replace(); //Instead of append_to(). } catch(const Gio::Error& ex) { std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; return false; } } else { //Make sure that all the parent directories exist, creating them if necessary: Glib::RefPtr parent = file->get_parent(); try { if(parent) //It will be empty if file was the root node of the filesystem. parent->make_directory_with_parents(); } catch(const Gio::Error& ex) { //If it exists already then that's good. //Otherwise something unexpected happened. if(ex.code() == Gio::Error::EXISTS) { if(parent->query_file_type() != Gio::FILE_TYPE_DIRECTORY) { std::cerr << G_STRFUNC << ": This part of the URI is not a directory: " << parent->get_uri() << std::endl; std::cerr << " using m_file_uri = " << m_file_uri << std::endl; return false; } } else { std::cerr << G_STRFUNC << ": parent of uri=" << m_file_uri << "error=" << ex.what() << std::endl; return false; } } //Create the file: //By default files created are generally readable by everyone, but if we pass FILE_CREATE_PRIVATE in flags the file will be made readable only to the current user, to the level that is supported on the target filesystem. //TODO: Do we want to specify 0660 exactly? (means "this user and his group can read and write this non-executable file".) try { stream = file->create_file(); } catch(const Gio::Error& ex) { std::cerr << G_STRFUNC << ": " << m_file_uri << ", error=" << ex.what() << std::endl; return false; } } if(!stream) return false; try { //Write the data to the output uri stream->write(m_strContents.data(), m_strContents.bytes()); //Close the stream to make sure that the write really happens //even with glibmm 2.16.0 which had a refcount leak that stopped it. stream->close(); stream.reset(); } catch(const Gio::Error& ex) { // If the operation was not successful, print the error and abort std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; return false; //print_error(ex, output_uri_string); } return true; //Success. (At doing nothing, because nothing needed to be done.) } else return true; //Success. (At doing nothing, because nothing needed to be done.) } Glib::ustring Document::get_name() const { return util_file_uri_get_name(m_file_uri, m_file_extension); } //Note that Glib::filename_display_basename() shows %20 for spaces so it isn't very useful. static Glib::ustring get_file_display_name(const Glib::ustring& uri) { Glib::ustring result; if(uri.empty()) return result; Glib::RefPtr file = Gio::File::create_for_uri(uri); Glib::RefPtr file_info; try { file_info = file->query_info(G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": uri=" << uri << "): error: " << ex.what() << std::endl; return result; } if(!file_info) return result; return file_info->get_display_name(); } Glib::ustring Document::util_file_uri_get_name(const Glib::ustring& file_uri, const Glib::ustring& file_extension) { Glib::ustring strResult = get_file_display_name(file_uri); //Remove the file extension: //TODO: Maybe g_filename_display_basename() and g_file_info_get_display_name() should do this. if(!strResult.empty() && !file_extension.empty()) { const Glib::ustring strExt = '.' + file_extension; if(strResult.size() >= file_extension.size()) //It can't have the ext already if it's not long enough. { const Glib::ustring strEnd = strResult.substr(strResult.size() - strExt.size()); if(strEnd == strExt) //If it has the extension { strResult = strResult.substr(0, strResult.size() - strExt.size()); } } } //Show untitled explicitly: //Also happens for file_uris with path but no name. e.g. /sub/sub/, which shouldn't happen. if(strResult.empty()) strResult = _("Untitled"); return strResult; } void Document::set_view(ViewBase* pView) { m_pView = pView; } ViewBase* Document::get_view() { return m_pView; } bool Document::get_read_only() const { if(m_bReadOnly) { //An application might have used set_read_only() to make this document explicitly read_only, regardless of the positions of the storage location. return true; } else { if(m_file_uri.empty()) return false; //It must be a default empty document, not yet saved, so it is not read-only. else { Glib::RefPtr file = Gio::File::create_for_uri(m_file_uri); Glib::RefPtr info; try { Glib::RefPtr info = file->query_info(G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); } catch(const Gio::Error& ex) { return false; //We should at least be able to read the permissions, so maybe the location is invalid. I'm not sure what the best return result here is. } if(!info) return false; const bool read_only = info->get_attribute_boolean(G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); return read_only; } } return m_bReadOnly; } void Document::set_read_only(bool bVal) { m_bReadOnly = bVal; } bool Document::get_is_new() const { return m_bIsNew; } void Document::set_is_new(bool bVal) { if(bVal) set_modified(false); //can't be modified if it is new. m_bIsNew = bVal; } void Document::set_file_extension(const Glib::ustring& strVal) { m_file_extension = strVal; } Glib::ustring Document::get_file_extension() const { return m_file_extension; //TODO: get it from the mime-type system? } Document::type_signal_modified& Document::signal_modified() { return signal_modified_; } Document::type_signal_forget& Document::signal_forget() { return signal_forget_; } } //namespace glom-1.22.4/glom/libglom/document/bakery/document.h0000644000175000017500000001146612234252646023447 0ustar00murraycmurrayc00000000000000/* * Copyright 2000 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_BAKERY_DOCUMENT_H #define GLOM_BAKERY_DOCUMENT_H #include #include #include namespace GlomBakery { /** The Document is like the 'Model' in the Model-View-Controller framework. * Each App should have a Document. * Each View gets and sets data in its document. */ class Document { public: Document(); virtual ~Document(); /* Saves the data to disk. * Asks the View to update this document before saving to disk, * but you should probably ensure that the document is updated more regularly than this, * so that different parts of the GUI are synchronized. * Only saves if the document has been modified. * bool indicates success. */ bool save(); enum LoadFailureCodes { LOAD_FAILURE_CODE_NONE = 0, LOAD_FAILURE_CODE_NOT_FOUND = 1, LOAD_FAILURE_CODE_LAST = 20 //arbitrary large number. Anything after this is for the application's custom codes. }; /* Loads data from disk, using the URI (set with set_file_uri()) then asks the View to update itself. * bool indicates success. * @param failure_code Used to return an error code that is understood by your application. * Custom error codes should be greater than LOAD_FAILURE_CODE_LAST. */ bool load(int& failure_code); /* Loads data from disk, using the URI (set with set_file_uri()) then asks the View to update itself. * bool indicates success. * @param failure_code Used to return a custom error code that is understood by your application. This must be greater than zero. */ bool load_from_data(const guchar* data, std::size_t length, int& failure_code); bool get_modified() const; virtual void set_modified(bool bVal = true); ///Whether this just a default document. bool get_is_new() const; ///Called by AppWindow_WithDoc::init_create_document(). void set_is_new(bool bVal); Glib::ustring get_contents() const; Glib::ustring get_file_uri_with_extension(const Glib::ustring& uri); Glib::ustring get_file_uri() const; virtual void set_file_uri(const Glib::ustring& file_uri, bool bEnforceFileExtension = false); ///Gets filename part of file_uri, or 'untitled'. virtual Glib::ustring get_name() const; static Glib::ustring util_file_uri_get_name(const Glib::ustring& file_uri, const Glib::ustring& file_extension); bool get_read_only() const; void set_read_only(bool bVal); ///If you don't want to use a View, then don't use set_view(). void set_view(ViewBase* pView); ViewBase* get_view(); void set_file_extension(const Glib::ustring& strVal); Glib::ustring get_file_extension() const; //Signals /** For instance, void on_document_modified(bool modified); */ typedef sigc::signal type_signal_modified; /** This signal is emitted when the document has been modified. * It allows the view to update itself to show the new information. */ type_signal_modified& signal_modified(); typedef sigc::signal type_signal_forget; /** This signal is emitted when the view should forget the document. * This is used internally, and you should not need to use it yourself. */ type_signal_forget& signal_forget(); ///Allow app to update icons/title bar. protected: /** overrideable. * Does anything which should be done after the data has been loaded from disk, but before updating the View. * @param failure_code Used to return a custom error code that is understood by your application. This must be greater than zero. */ virtual bool load_after(int& failure_code); /** overrideable. * Does anything which should be done before the view has saved its data, before writing to disk.. */ virtual bool save_before(); bool read_from_disk(int& failure_code); bool write_to_disk(); Glib::ustring m_strContents; Glib::ustring m_file_uri; Glib::ustring m_file_extension; ViewBase* m_pView; type_signal_modified signal_modified_; type_signal_forget signal_forget_; bool m_bModified; bool m_bIsNew; //see get_is_new(). bool m_bReadOnly; }; } //namespace #endif //GNOME_APPWITHDOCS_DOCUMENT_H glom-1.22.4/glom/libglom/document/bakery/document_xml.h0000644000175000017500000000543512234252646024326 0ustar00murraycmurrayc00000000000000/* * Copyright 2000-2002 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_BAKERY_DOCUMENT_XML_H #define GLOM_BAKERY_DOCUMENT_XML_H #include #include //Features: //- Read/Write to the Document in terms of XML DOM. //Future features: //- Parse the document from disk instad of memory - This *might* allow for very large documents. namespace GlomBakery { class Document_XML : public GlomBakery::Document { public: Document_XML(); virtual ~Document_XML(); //overrides: virtual bool load_after(int& failure_code); virtual bool save_before(); void set_dtd_name(const std::string& strVal); //e.g. "glom.dtd" std::string get_dtd_name() const; /** Set the root node name and (optionally) the xmlns ID to be written * when writing the document. * The root node name is also used when reading documents. */ void set_dtd_root_node_name(const Glib::ustring& strVal, const Glib::ustring& xmlns = Glib::ustring()); Glib::ustring get_dtd_root_node_name() const; Glib::ustring get_xml() const; //Get the text for the XML. protected: const xmlpp::Element* get_node_document() const; //e.g. (root name) xmlpp::Element* get_node_document(); //e.g. (root name) void Util_DOM_Write(Glib::ustring& refstrXML) const; /** Put each node on its own line and add white space for indenting, * even if there are child text nodes. * set_write_formatted() does not cause nodes to be indented if there are child text nodes, * because it assumes that the white space is then significant. */ void add_indenting_white_space_to_node(xmlpp::Node* node = 0, const Glib::ustring& start_indent = Glib::ustring()); typedef GlomBakery::Document type_base; //XML Parsing bits: xmlpp::DomParser m_DOM_Parser; //Could be mutable to allow us to guarantee a root node. xmlpp::Document* m_pDOM_Document; //1-to-1 with the m_DOM_Parser. std::string m_strDTD_Name; Glib::ustring m_strRootNodeName, m_root_xmlns; bool m_write_formatted; }; } //namespace GlomBakery. #endif // GLOM_BAKERY_DOCUMENT_XML_H glom-1.22.4/glom/libglom/document/bakery/document_xml.cc0000644000175000017500000001376612234776363024501 0ustar00murraycmurrayc00000000000000/* * Copyright 2000-2002 Murray Cumming * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include namespace GlomBakery { Document_XML::Document_XML() : m_pDOM_Document(0), m_write_formatted(false) { } Document_XML::~Document_XML() { //m_pDOM_Document is owned by m_DOM_Document; } bool Document_XML::load_after(int& failure_code) { //Initialize the output parameter: failure_code = 0; const bool bTest = type_base::load_after(failure_code); if(!bTest) return false; //Failed. #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED try #endif { //Link the parser to the XML text that was loaded: //m_DOM_Parser.setDoValidation(true); if(m_strContents.empty()) std::cerr << G_STRFUNC << ": parsing empty document." << std::endl; m_DOM_Parser.parse_memory(m_strContents); m_pDOM_Document = m_DOM_Parser.get_document(); if(!m_pDOM_Document) return false; return true; //Success. } #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED catch(const std::exception& ex) { std::cerr << "XML Parser error: \n" << ex.what() << std::endl; return false; //Failed. } #endif } bool Document_XML::save_before() { if(get_modified()) { //Write XML to string: m_strContents.erase(); Util_DOM_Write(m_strContents); } //Write the file even if nothing was modified, //to make sure that we write empty documents that have only default values, //when save() is explicitly called. // //Save the XML string: return type_base::save_before(); } Glib::ustring Document_XML::get_xml() const { //Write XML to string: Glib::ustring strXML; Util_DOM_Write(strXML); return strXML; } void Document_XML::Util_DOM_Write(Glib::ustring& refstrXML) const { #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED try #endif { if(m_write_formatted) refstrXML = m_pDOM_Document->write_to_string_formatted(); else refstrXML = m_pDOM_Document->write_to_string(); } #ifdef LIBXMLCPP_EXCEPTIONS_ENABLED catch(xmlpp::exception& ex) { std::cerr << G_STRFUNC << ": exception caught: " << ex.what() << std::endl; } #endif } void Document_XML::set_dtd_name(const std::string& strVal) { m_strDTD_Name = strVal; } std::string Document_XML::get_dtd_name() const { return m_strDTD_Name; } void Document_XML::set_dtd_root_node_name(const Glib::ustring& strVal, const Glib::ustring& xmlns) { m_strRootNodeName = strVal; m_root_xmlns = xmlns; } Glib::ustring Document_XML::get_dtd_root_node_name() const { return m_strRootNodeName; } const xmlpp::Element* Document_XML::get_node_document() const { //Call the non-const overload: return const_cast(this)->get_node_document(); } xmlpp::Element* Document_XML::get_node_document() { if(!m_pDOM_Document) m_pDOM_Document = m_DOM_Parser.get_document(); //Make sure that it has the DTD declaration: //TODO: Put this in a better place, where it's more guaranteed to always be set? //TODO: Add API to specify the PUBLIC URI, if the document should write this: //SYSTEM (local) DTDs do not seem very useful. //- means non-registered, which is commonly used. //m_pDOM_Document->set_internal_subset(m_strRootNodeName, "-//glom/" + m_strDTD_Name, m_strDTD_Name); xmlpp::Element* nodeRoot = m_pDOM_Document->get_root_node(); if(!nodeRoot) { //Add it if it isn't there already: nodeRoot = m_pDOM_Document->create_root_node(m_strRootNodeName, m_root_xmlns); } //Make sure that it has the root name name and xmlns: nodeRoot->set_namespace_declaration(m_root_xmlns); return nodeRoot; } void Document_XML::add_indenting_white_space_to_node(xmlpp::Node* node, const Glib::ustring& start_indent) { if(!node) node = get_node_document(); //Remove any previous indenting: { xmlpp::Node::NodeList list = node->get_children(); for(xmlpp::Node::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter) { xmlpp::Node* child = *iter; if(!child) continue; xmlpp::ContentNode* text = dynamic_cast(child); if(text) { if(text->is_white_space()) node->remove_child(text); } } } //All indents have a newline, //and we add spaces each time we recurse: Glib::ustring indent = start_indent; if(indent.empty()) indent = "\n "; else indent += " "; //Add indenting text items: bool had_children = false; xmlpp::Element* node_as_element = dynamic_cast(node); xmlpp::Node::NodeList list = node_as_element->get_children(); for(xmlpp::Node::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter) { xmlpp::Node* child = *iter; if(!child) continue; xmlpp::ContentNode* text = dynamic_cast(child); if(text) { if(!text->is_white_space()) continue; //Don't change content items. } //Add a text item for the indenting, before the child: //std::cout << " Adding indent after node=" << child->get_name() << ": START" << indent << "END" << std::endl; node_as_element->add_child_text_before(child, indent); had_children = true; //Recurse into the children: add_indenting_white_space_to_node(child, indent); } //If it has children then add an indent before the closing tag: if(had_children) node_as_element->add_child_text(start_indent); } } //namespace GlomBakery. glom-1.22.4/glom/libglom/document/document.h0000644000175000017500000007160212234776363022177 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2009 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DOCUMENT_H #define GLOM_DOCUMENT_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // for numeric_limits namespace Gtk { class Window; } namespace Glom { class Document : public GlomBakery::Document_XML { public: Document(); virtual ~Document(); virtual void set_modified(bool value = true); /** Set the file URI that will be used in future calls to load() and save(). * Note that the document will not be saved immediately to the new URI. It will * be saved either after the next change (if using autosave) or when calling save() explicitly. * Likewise, the document at the URI will not be loaded until load() is called explicitly. * That is unlike in the base class's implementation. */ virtual void set_file_uri(const Glib::ustring& file_uri, bool bEnforceFileExtension = false); /* Loads data from disk, using the URI (set with set_file_uri()) then asks the View to update itself. * bool indicates success. * This is just here so the SWIG Java API generator does not need to wrap methods from the base classes. */ bool load(int& failure_code); /** Whether the document was opened from another networked glom instance, * instead of via a URI. */ void set_opened_from_browse(bool val = true); bool get_opened_from_browse() const; /** The document usually saves itself when you call set_modified(). * Pass false to this function to prevent that temporarily. * The document will be saved, if necessary, after you call this function with true. */ void set_allow_autosave(bool value = true); bool get_is_example_file() const; void set_is_example_file(bool value = true); bool get_is_backup_file() const; void set_is_backup_file(bool value = true); /* Get version of the document format used for this document. * This can increase when the file has been re-saved. * See get_latest_known_document_format_version(). * Old versions of the application cannot open documents with a newer document format, * so saving with a version of the application that has a newer document format will * make it impossible to open the document in a version of the application with an older document format. */ guint get_document_format_version(); static guint get_latest_known_document_format_version(); /// How the database is hosted. enum HostingMode { HOSTING_MODE_POSTGRES_CENTRAL, /*!< The database is hosted on an external postgresql server. */ HOSTING_MODE_POSTGRES_SELF, /*!< A new postgres database process is spawned that hosts the data. */ HOSTING_MODE_SQLITE, /*!< A sqlite database file is used. */ HOSTING_MODE_DEFAULT = HOSTING_MODE_POSTGRES_SELF /*!- Arbitrary default. */ }; /** Set the hosting mode of the database. */ void set_hosting_mode(HostingMode mode); /** This returns how the database is hosted. */ HostingMode get_hosting_mode() const; /** Whether the database (and document) is shared over the network. * This setting is saved in the file, allowing the database to be * shared immediately after opening the document. * @param shared true if the database should be shared. */ void set_network_shared(bool shared = true); /** See set_network_shared(). * @result true if the database is (or should be) shared over the network. */ bool get_network_shared() const; void set_connection_server(const Glib::ustring& strVal); void set_connection_database(const Glib::ustring& strVal); void set_connection_port(unsigned int port_number); void set_connection_try_other_ports(bool val); /** Temporarily set a username in the document. * Note that this is not saved in the document's file. * * TODO: Remove this, and just store it in ConnectionPool? */ void set_connection_user(const Glib::ustring& strVal); /** If the database should be hosted, this provides the * path to the directory that contains all the files needed to do that. * This is usually a specifically-named directory at the same level as the .glom file. * If the database is a sqlite database, this specifies the directory in * which the database file is in. */ std::string get_connection_self_hosted_directory_uri() const; Glib::ustring get_connection_server() const; Glib::ustring get_connection_database() const; unsigned int get_connection_port() const; bool get_connection_try_other_ports() const; /** Retrieve a username previously set in the document. * Note that this is not saved in the document's file. * * TODO: Remove this, and just store it in ConnectionPool? */ Glib::ustring get_connection_user() const; /** Set the language/locale used by original titles. * Title translations are translations of the text in this language. * @param locale: For instance, "en_US.UTF-8". */ void set_translation_original_locale(const Glib::ustring& locale); /** Get the language/locale used by original titles. * Title translations are translations of the text in this language. */ Glib::ustring get_translation_original_locale() const; /** Get a list of locales for which at least one string is translated. * The result will include the original, from get_translation_original_locale(). */ std::vector get_translation_available_locales() const; typedef std::vector< sharedptr > type_vec_relationships; type_vec_relationships get_relationships(const Glib::ustring& table_name, bool plus_system_prefs = false) const; void set_relationships(const Glib::ustring& table_name, const type_vec_relationships& vecRelationships); sharedptr get_relationship(const Glib::ustring& table_name, const Glib::ustring& relationship_name) const; void set_relationship(const Glib::ustring& table_name, const sharedptr& relationship); void remove_relationship(const sharedptr& relationship); /** Returns whether the relationship's to-field is a primary key or unique field, meaning * that there can be only one related record for each value of the from-field. */ bool get_relationship_is_to_one(const Glib::ustring& table_name, const Glib::ustring& relationship_name) const; /** Returns whether the field is the from-field in a to-one relationship. * @see get_relationship_is_to_one(). Ignores hidden tables. */ sharedptr get_field_used_in_relationship_to_one(const Glib::ustring& table_name, const sharedptr& layout_field) const; typedef std::vector< sharedptr > type_vec_fields; type_vec_fields get_table_fields(const Glib::ustring& table_name) const; void set_table_fields(const Glib::ustring& table_name, const type_vec_fields& vecFields); sharedptr get_field(const Glib::ustring& table_name, const Glib::ustring& strFieldName) const; sharedptr get_field_primary_key(const Glib::ustring& table_name) const; /** Use this after removing a field from a table, * so that it is not used anymore in relationships, layouts, reports, etc. */ void remove_field(const Glib::ustring& table_name, const Glib::ustring& field_name); typedef std::pair< sharedptr, sharedptr > type_pairFieldTrigger; typedef std::vector type_list_lookups; /** Get the fields whose values should be looked up when @a field_name changes, with * the relationship used to lookup the value. */ type_list_lookups get_lookup_fields(const Glib::ustring& table_name, const Glib::ustring& field_name) const; typedef std::vector< sharedptr > type_list_layout_groups; /** Get the layout groups for a layout. * @param layout_name The name of the layout, such as list or details. * @param parent_table_name The name of the table for which this layout should appear. * @param layout_platform The platform for which this layout should be used. Possible values are an empty string (meaning normal platforms) or "maemo" meaning "normal". * @result A list of layout groups at the top-level of the requested layout. */ type_list_layout_groups get_data_layout_groups(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform = Glib::ustring()) const; /** Discover whether there are any fields in the layout. * @param layout_name The name of the layout, such as list or details. * @param parent_table_name The name of the table for which this layout should appear. * @param layout_platform The platform for which this layout should be used. Possible values are an empty string (meaning normal platforms) or "maemo" meaning "normal". * @result true if there is at least one field in the layout group or its sub groups. */ bool get_data_layout_groups_have_any_fields(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform = Glib::ustring()) const; /** Set the layout groups for a layout. * @param layout_name The name of the layout, such as list or details. * @param parent_table_name The name of the table for which this layout should appear. * @param layout_platform The platform for which this layout should be used. Possible values are an empty string (meaning normal platforms) or "maemo" meaning "normal". * @param groups A list of layout groups at the top-level of the requested layout. */ void set_data_layout_groups(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform, const type_list_layout_groups& groups); /** * @para The layout_name, such as "details", "list". * @para parent_table_name The name of the table on whose layout the layout appears. * @param layout_platform The platform for which this layout should be used. Possible values are an empty string (meaning normal platforms) or "maemo" meaning "normal". */ type_list_layout_groups get_data_layout_groups_plus_new_fields(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform = Glib::ustring()) const; type_list_layout_groups get_data_layout_groups_default(const Glib::ustring& layout_name, const Glib::ustring& parent_table_name, const Glib::ustring& layout_platform = Glib::ustring()) const; /// The translatable item and a hint about what it is. typedef std::pair< sharedptr, Glib::ustring> pair_translatable_item_and_hint; typedef std::vector type_list_translatables; type_list_translatables get_translatable_items(); static void fill_translatable_custom_choices(Formatting& formatting, type_list_translatables& the_list, const Glib::ustring& hint); void fill_layout_field_details(const Glib::ustring& parent_table_name, const sharedptr& layout_group) const; void fill_layout_field_details(const Glib::ustring& parent_table_name, type_list_layout_groups& groups) const; ///When a field name is changed, change it in the relationships, layouts, reports, and fields data: void change_field_name(const Glib::ustring& table_name, const Glib::ustring& strFieldNameOld, const Glib::ustring& strFieldNameNew); ///When a table name is changed, change it in the relationships and tables data: void change_table_name(const Glib::ustring& table_name_old, const Glib::ustring& table_name_new); ///When a relationship name is changed, change it in layouts and reports: void change_relationship_name(const Glib::ustring& table_name, const Glib::ustring& name, const Glib::ustring& name_new); typedef std::vector< sharedptr > type_listTableInfo; type_listTableInfo get_tables(bool plus_system_prefs = false) const; std::vector get_table_names(bool plus_system_prefs = false) const; void set_tables(const type_listTableInfo& tables); sharedptr get_table(const Glib::ustring& table_name) const; void add_table(const sharedptr& table_name); /** Use this after DROPing the table. * It removes information about the table, including fields and layouts, * and any place that parts of the table are used. */ void remove_table(const Glib::ustring& table_name); bool get_table_is_known(const Glib::ustring& table_name) const; bool get_table_is_hidden(const Glib::ustring& table_name) const; Glib::ustring get_table_title(const Glib::ustring& table_name, const Glib::ustring& locale) const; Glib::ustring get_table_title_original(const Glib::ustring& table_name) const; void set_table_title(const Glib::ustring& table_name, const Glib::ustring& value, const Glib::ustring& locale); Glib::ustring get_table_title_singular(const Glib::ustring& table_name, const Glib::ustring& locale) const; Glib::ustring get_table_title_singular_original(const Glib::ustring& table_name) const; typedef std::vector< Gnome::Gda::Value > type_row_data; typedef std::vector< type_row_data > type_example_rows; /** Save example data into the document, for use when creating the example database on the server. * Don't use this for large amounts of data. * @param table_name The table that should contain this example data. * @param rows Each row is separated by a newline. Each line has comma-separated field values, in SQL format. */ void set_table_example_data(const Glib::ustring& table_name, const type_example_rows& rows); type_example_rows get_table_example_data(const Glib::ustring& table_name) const; virtual Glib::ustring get_name() const; //override. Glib::ustring get_default_table() const; Glib::ustring get_first_table() const; Glib::ustring get_database_title_original() const; Glib::ustring get_database_title(const Glib::ustring& locale) const; void set_database_title_original(const Glib::ustring& title); std::vector get_library_module_names() const; void set_library_module(const Glib::ustring& name, const Glib::ustring& script); Glib::ustring get_library_module(const Glib::ustring& name) const; void remove_library_module(const Glib::ustring& name); /** Get a Python script that should be run when the document is opened. */ Glib::ustring get_startup_script() const; /** See get_startup_script(). */ void set_startup_script(const Glib::ustring& script); /// These are only used when recreating a database from an example file. The actualy access-control is on the server, of course. typedef std::vector type_list_groups; type_list_groups get_groups() const; /// This adds the group if necessary. void set_group(GroupInfo& group); void remove_group(const Glib::ustring& group_name); std::vector get_report_names(const Glib::ustring& table_name) const; void set_report(const Glib::ustring& table_name, const sharedptr& report); sharedptr get_report(const Glib::ustring& table_name, const Glib::ustring& report_name) const; void remove_report(const Glib::ustring& table_name, const Glib::ustring& report_name); //Print Layouts are precisely positioned layouts for printing to a printer: std::vector get_print_layout_names(const Glib::ustring& table_name) const; void set_print_layout(const Glib::ustring& table_name, const sharedptr& print_layout); sharedptr get_print_layout(const Glib::ustring& table_name, const Glib::ustring& print_layout_name) const; void remove_print_layout(const Glib::ustring& table_name, const Glib::ustring& print_layout_name); void set_layout_record_viewed(const Glib::ustring& table_name, const Glib::ustring& layout_name, const Gnome::Gda::Value& primary_key_value); void forget_layout_record_viewed(const Glib::ustring& table_name); Gnome::Gda::Value get_layout_record_viewed(const Glib::ustring& table_name, const Glib::ustring& layout_name) const; //TODO: Rename set_layout_current() and set_criteria_current(). /** Temporarily save (but not in the document) the last-viewed layout for the table, * so we can show the same layout when navigating back to this table later. * * @param table_name The table. * @param layout_name The layout name, such as "list" or "details". */ void set_layout_current(const Glib::ustring& table_name, const Glib::ustring& layout_name); /** Temporarily save (but not in the document) the last-viewed criteria for the table, * so we can show the same criteria (sort order, where clause) when navigating back to this table later. * * @param table_name The table. * @param found_set Additional information about the last use of that layout, such as the sort order or where clause. */ void set_criteria_current(const Glib::ustring& table_name,const FoundSet& found_set); Glib::ustring get_layout_current(const Glib::ustring& table_name) const; FoundSet get_criteria_current(const Glib::ustring& table_name) const; #ifndef SWIG //Hide this API from swig. // Used by Relationship Overview dialog to preserve table locations accross instantiations: /** Retrieve the x and y coordinates for the given table position in the relationship overview dialog. * * @param table_name The name of the table to query. * @param x The x coordinate of the table position. * @param y The y coordinate of the table position. * @return false if the table does not have any position for this table. */ bool get_table_overview_position( const Glib::ustring& table_name, float &x, float &y ) const; /** Set the position of a table in the relationship overview dialog. * * @param table_name The name of the table to modify. * @param x The x coordinate of the table position. * @param y The y coordinate of the table position. */ void set_table_overview_position( const Glib::ustring& utable_name, float x, float y ); enum userLevelReason { USER_LEVEL_REASON_UNKNOWN, USER_LEVEL_REASON_FILE_READ_ONLY, USER_LEVEL_REASON_DATABASE_ACCESS_LEVEL, USER_LEVEL_REASON_OPENED_FROM_BROWSE }; /** * @param reason The reason that the user is not a developer, if he is not. * @result Whether the user is a developer. */ AppState::userlevels get_userlevel(userLevelReason& reason) const; AppState::userlevels get_userlevel() const; /** This is transitory information, not saved to disk. */ bool set_userlevel(AppState::userlevels userlevel); typedef sigc::signal type_signal_userlevel_changed; type_signal_userlevel_changed signal_userlevel_changed(); //TODO: This is a rather indirect way for application.cc to request the UI to update for the userlevel. void emit_userlevel_changed(); #endif //SWIG /** This is transitory information, not saved to disk. */ Glib::ustring get_active_layout_platform() const; /** This is transitory information, not saved to disk. */ void set_active_layout_platform(const Glib::ustring& layout_platform = Glib::ustring()); #ifndef SWIG //Hide this API from swig. Glib::ustring build_and_get_contents() const; /** This callback should show UI to indicate that work is still happening. * For instance, a pulsing ProgressBar. */ typedef sigc::slot SlotProgress; /** Save a copy of the document as a backup. * This document (and its URI) will not be changed. * @param The location at which to save the backup Glom file. * @result The URI of the .tar.gz tarball. */ Glib::ustring save_backup_file(const Glib::ustring& uri, const SlotProgress& slot_progress); /** * @param backup_uri: The URI of a .tar.gz backup file. * @result The URI of the restored .glom file. */ static Glib::ustring restore_backup_file(const Glib::ustring& backup_uri, const SlotProgress& slot_progress); protected: #endif //SWIG #ifndef SWIG public: static sharedptr create_table_system_preferences(); static sharedptr create_table_system_preferences(type_vec_fields& fields); static sharedptr create_relationship_system_preferences(const Glib::ustring& table_name); static bool get_relationship_is_system_properties(const sharedptr& relationship); #endif //SWIG /// Failure codes that could be returned by load_after() enum load_failure_codes { LOAD_FAILURE_CODE_FILE_VERSION_TOO_NEW = LOAD_FAILURE_CODE_LAST + 1 }; private: //Overrides: virtual bool save_before(); void save_before_layout_group(xmlpp::Element* node, const sharedptr& group, bool with_print_layout_positions = false); void save_before_sort_by(xmlpp::Element* node, const LayoutItem_GroupBy::type_list_sort_fields& list_fields); void save_before_layout_item_usesrelationship(xmlpp::Element* nodeItem, const sharedptr& item); void save_before_layout_item_field(xmlpp::Element* nodeItem, const sharedptr& item); void save_before_layout_item_formatting(xmlpp::Element* nodeItem, const Formatting& format, Field::glom_field_type field_type = Field::TYPE_INVALID); void save_before_layout_item_formatting(xmlpp::Element* nodeItem, const sharedptr& layout_item); void save_before_translations(xmlpp::Element* nodeItem, const sharedptr& item); void save_before_print_layout_position(xmlpp::Element* nodeItem, const sharedptr& item); void save_before_choicevalue(xmlpp::Element* nodeItem, const sharedptr& item, Field::glom_field_type field_type); void save_changes(); virtual bool load_after(int& failure_code); void load_after_layout_group(const xmlpp::Element* node, const Glib::ustring& table_name, const sharedptr& group, bool with_print_layout_positions = false); void load_after_sort_by(const xmlpp::Element* node, const Glib::ustring& table_name, LayoutItem_GroupBy::type_list_sort_fields& list_fields); void load_after_layout_item_usesrelationship(const xmlpp::Element* element, const Glib::ustring& table_name, const sharedptr& item); void load_after_layout_item_field(const xmlpp::Element* element, const Glib::ustring& table_name, const sharedptr& item); void load_after_layout_item_formatting(const xmlpp::Element* element, Formatting& format, Field::glom_field_type field_type = Field::TYPE_INVALID, const Glib::ustring& table_name = Glib::ustring(), const Glib::ustring& field_name = Glib::ustring()); void load_after_layout_item_formatting(const xmlpp::Element* element, const sharedptr& layout_item, const Glib::ustring& table_name = Glib::ustring()); void load_after_translations(const xmlpp::Element* element, const sharedptr& item); void load_after_print_layout_position(const xmlpp::Element* nodeItem, const sharedptr& item); void load_after_choicevalue(const xmlpp::Element* element, const sharedptr& item, Field::glom_field_type field_type); void on_app_state_userlevel_changed(AppState::userlevels userlevel); static void fill_translatable_layout_items(const sharedptr& layout_field, type_list_translatables& the_list, const Glib::ustring& hint); static void fill_translatable_layout_items(const sharedptr& group, type_list_translatables& the_list, const Glib::ustring& hint); void fill_sort_field_details(const Glib::ustring& parent_table_name, Formatting::type_list_sort_fields& sort_fields) const; type_list_translatables get_translatable_layout_items(const Glib::ustring& table_name, const Glib::ustring& hint); type_list_translatables get_translatable_report_items(const Glib::ustring& table_name, const Glib::ustring& report_title, const Glib::ustring& hint); AppState m_app_state; type_signal_userlevel_changed m_signal_userlevel_changed; HostingMode m_hosting_mode; bool m_network_shared; Glib::ustring m_connection_server, m_connection_database; Glib::ustring m_connection_user; //Don't save the user. unsigned int m_connection_port; //0 means any port. Ignored when self-hosting (which may use a different port each time). bool m_connection_try_other_ports; //Set to false for self-hosted or browsed-from-network documents. class LayoutInfo { public: Glib::ustring m_layout_name; Glib::ustring m_layout_platform; //Empty string (meaning normal platforms), or "maemo", or something else. Glib::ustring m_parent_table; type_list_layout_groups m_layout_groups; }; class DocumentTableInfo { public: DocumentTableInfo() : m_overviewx ( ), m_overviewy ( std::numeric_limits::infinity () ) { m_info = sharedptr(new TableInfo()); //Avoid a null sharedptr. } //TODO: Avoid the use of this: DocumentTableInfo(const DocumentTableInfo& src) : m_info(src.m_info), m_fields(src.m_fields), m_relationships(src.m_relationships), m_layouts(src.m_layouts), m_reports(src.m_reports), m_print_layouts(src.m_print_layouts), m_example_rows(src.m_example_rows), m_map_current_record(src.m_map_current_record), m_layout_current(src.m_layout_current), m_foundset_current(src.m_foundset_current), m_overviewx(src.m_overviewx), m_overviewy(src.m_overviewy) { } //TODO: Avoid the use of this: DocumentTableInfo& operator=(const DocumentTableInfo& src) { m_info = src.m_info; m_fields = src.m_fields; m_relationships = src.m_relationships; m_layouts = src.m_layouts; m_reports = src.m_reports; m_print_layouts = src.m_print_layouts; m_example_rows = src.m_example_rows; m_map_current_record = src.m_map_current_record; m_layout_current = src.m_layout_current; m_foundset_current = src.m_foundset_current; m_overviewx = src.m_overviewx; m_overviewy = src.m_overviewy; return *this; } sharedptr m_info; type_vec_fields m_fields; type_vec_relationships m_relationships; typedef std::vector< LayoutInfo > type_layouts; type_layouts m_layouts; typedef std::map< Glib::ustring, sharedptr > type_reports; //map of report names to reports type_reports m_reports; typedef std::map< Glib::ustring, sharedptr > type_print_layouts; //map of print layout names to print layouts type_print_layouts m_print_layouts; //Example data, used when creating a database from an example. type_example_rows m_example_rows; //Per-session, not saved in document: typedef std::map type_map_layout_primarykeys; type_map_layout_primarykeys m_map_current_record; //The record last viewed in each layout. Glib::ustring m_layout_current; FoundSet m_foundset_current; float m_overviewx, m_overviewy; }; DocumentTableInfo& get_table_info_with_add(const Glib::ustring& table_name); typedef std::map type_tables; type_tables m_tables; //User groups: typedef std::map type_map_groups; type_map_groups m_groups; sharedptr m_database_title; Glib::ustring m_translation_original_locale; std::vector m_translation_available_locales; //Just a cache, based on other data. typedef std::map type_map_library_scripts; type_map_library_scripts m_map_library_scripts; Glib::ustring m_startup_script; bool m_block_cache_update; //For efficiency. bool m_block_modified_set; bool m_allow_auto_save; bool m_is_example; bool m_is_backup; guint m_document_format_version; bool m_opened_from_browse; Glib::ustring m_active_layout_platform; //empty (means normal), or "maemo". }; } //namespace Glom #endif // GLOM_DOCUMENT_H glom-1.22.4/glom/libglom/document/view.h0000644000175000017500000000220312234252646021313 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2009 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DOCUMENT_VIEW_H #define GLOM_DOCUMENT_VIEW_H #include #include namespace Glom { ///The base View for the document. typedef GlomBakery::View View_Glom; typedef GlomBakery::View_Composite View_Composite_Glom; } //namespace Glom #endif // GLOM_DOCUMENT_VIEW_H glom-1.22.4/glom/libglom/standard_table_prefs_fields.h0000644000175000017500000000435212234252646024226 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_STANDARD_TABLE_PREFS_FIELDS_H #define GLOM_STANDARD_TABLE_PREFS_FIELDS_H namespace Glom { //Define these to avoid entering the string literals repeatedly. #define GLOM_STANDARD_TABLE_PREFS_TABLE_NAME "glom_system_preferences" #define GLOM_STANDARD_TABLE_PREFS_FIELD_ID "system_prefs_id" #define GLOM_STANDARD_TABLE_PREFS_FIELD_NAME "name" #define GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_NAME "org_name" #define GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_LOGO "org_logo" #define GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_STREET "org_address_street" #define GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_STREET2 "org_address_street2" #define GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_TOWN "org_address_town" #define GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_COUNTY "org_address_county" #define GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_COUNTRY "org_address_country" #define GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_POSTCODE "org_address_postcode" #define GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME "glom_system_autoincrements" #define GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_ID "system_autoincrements_id" #define GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_TABLE_NAME "table_name" #define GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_FIELD_NAME "field_name" #define GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_NEXT_VALUE "next_value" //Numeric #define GLOM_STANDARD_FIELD_LOCK "glom_lock" //Text. In every table. Not used yet. } //namespace Glom #endif //GLOM_STANDARD_TABLE_PREFS_FIELDS_H glom-1.22.4/glom/libglom/calcinprogress.h0000644000175000017500000000223712234252645021547 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DATA_CALCINPROGRESS_H #define GLOM_MODE_DATA_CALCINPROGRESS_H #include namespace Glom { class CalcInProgress { public: CalcInProgress(); sharedptr m_field; Gnome::Gda::Value m_value; //If it's been calculated. bool m_calc_in_progress; bool m_calc_finished; }; } //namespace Glom #endif //GLOM_MODE_DATA_CALCINPROGRESS_H glom-1.22.4/glom/libglom/init.h0000644000175000017500000000575012234776363017507 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2009 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_LIBGLOM_INIT_H #define GLOM_LIBGLOM_INIT_H /** @mainpage libglom Reference Manual * * @section description Description * * libglom provides API to access Glom's XML-based Glom::Document structure. * AppWindows may use it to load a .glom document and then call methods * on the document to discover the connection details and the data structure, including: * - The list of tables * - The list of fields in each table * - The details of each field, such as field type, title, default value, formatting, etc. * - The relationships between tables. * - The layout of fields on list and details views. * - The layout of print layouts. * - The layout of reports. * * libglom also contains utility functions, such as * Glom::Utils::build_sql_select_with_where_clause(), to build the complicated SQL queries * used by Glom to retrieve information from the database. * * See http://git.gnome.org/browse/glom/tree/glom/libglom/example_document_load.cc * for a small working example. * * @section warning Warning * * libglom is not yet API stable, not properly documented, not thoroughly tested, * and not yet really intended for serious use by applications other than * Glom and * Qlom. * * @section basics Basic Usage * * Include the individual libglom headers. For instance: * @code * #include * @endcode * * If your source file is @c program.cc, you can compile it with: * @code * g++ program.cc -o program `pkg-config --cflags --libs glom-1.22` * @endcode * * Alternatively, if using autoconf, use the following in @c configure.ac: * @code * PKG_CHECK_MODULES([DEPS], [glom-1.22]) * @endcode * Then use the generated @c DEPS_CFLAGS and @c DEPS_LIBS variables in the * project @c Makefile.am files. For example: * @code * program_CPPFLAGS = $(DEPS_CFLAGS) * program_LDADD = $(DEPS_LIBS) * @endcode */ namespace Glom { /** This must be used by applications other than Glom, * which are unlikely to otherwise initialize the libraries used by libglom. * Glom uses it too, just to avoid duplicating code. */ void libglom_init(); void libglom_deinit(); } //namespace Glom #endif //GLOM_LIBGLOM_INIT_H glom-1.22.4/glom/libglom/db_utils.cc0000644000175000017500000023433212234776363020507 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include // For gda_g_type_from_string #include #include namespace Glom { namespace DbUtils { static Glib::RefPtr get_connection() { sharedptr sharedconnection; try { sharedconnection = ConnectionPool::get_and_connect(); } catch (const Glib::Error& error) { std::cerr << G_STRFUNC << ": " << error.what() << std::endl; } if(!sharedconnection) { std::cerr << G_STRFUNC << ": No connection yet." << std::endl; return Glib::RefPtr(0); } Glib::RefPtr gda_connection = sharedconnection->get_gda_connection(); return gda_connection; } /** Update GDA's information about the table structure, such as the * field list and their types. * Call this whenever changing the table structure, for instance with an ALTER query. * This may take a few seconds to return. */ static bool update_gda_metastore_for_table(const Glib::ustring& table_name) { Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": No gda_connection." << std::endl; return false; } if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name is empty." << std::endl; return false; } //std::cout << "debug: " << G_STRFUNC << ": Calling Gda::Connection::update_meta_store_table(" << table_name << ") ..." << std::endl; //TODO: This doesn't seem to quite work yet: try { gda_connection->update_meta_store_table(table_name); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": update_meta_store_table() failed: " << ex.what() << std::endl; return false; } //This does work, though it takes ages: gda_connection->update_meta_store(); //std::cout << "debug: " << G_STRFUNC << ": ... Finished calling Gda::Connection::update_meta_store_table()" << std::endl; return true; } bool create_database(Document* document, const Glib::ustring& database_name, const Glib::ustring& title, const sigc::slot& progress) { #if 1 // This seems to increase the chance that the database creation does not // fail due to the "source database is still in use" error. armin. //std::cout << "Going to sleep" << std::endl; Glib::usleep(500 * 1000); //std::cout << "Awake" << std::endl; #endif progress(); try { ConnectionPool::get_instance()->create_database(progress, database_name); } catch(const Glib::Exception& ex) // libgda does not set error domain { std::cerr << G_STRFUNC << ": Gnome::Gda::Connection::create_database(" << database_name << ") failed: " << ex.what() << std::endl; return false; } progress(); //Connect to the actual database: ConnectionPool* connection_pool = ConnectionPool::get_instance(); connection_pool->set_database(database_name); progress(); sharedptr sharedconnection; try { sharedconnection = connection_pool->connect(); } catch(const Glib::Exception& ex) { std::cerr << G_STRFUNC << ": Could not connect to just-created database. exception caught:" << ex.what() << std::endl; return false; } catch(const std::exception& ex) { std::cerr << G_STRFUNC << ": Could not connect to just-created database. exception caught:" << ex.what() << std::endl; return false; } if(sharedconnection) { progress(); bool test = add_standard_tables(document); //Add internal, hidden, tables. if(!test) { std::cerr << G_STRFUNC << ": add_standard_tables() failed." << std::endl; return false; } progress(); //Create the developer group, and make this user a member of it: //If we got this far then the user must really have developer privileges already: test = add_standard_groups(document); if(!test) { std::cerr << G_STRFUNC << ": add_standard_groups() failed." << std::endl; return false; } progress(); //std::cout << "debug: " << G_STRFUNC << ": Creation of standard tables and groups finished." << std::endl; //Set the title based on the title in the example document, or the user-supplied title when creating new documents: SystemPrefs prefs = get_database_preferences(document); if(prefs.m_name.empty()) { //std::cout << "debug: " << G_STRFUNC << ": Setting title in the database." << std::endl; prefs.m_name = title; set_database_preferences(document, prefs); } else { //std::cout << "debug: " << G_STRFUNC << ": database has title: " << prefs.m_name << std::endl; } progress(); //Save the port, if appropriate, so the document can be used to connect again: Glom::ConnectionPool::Backend* backend = connection_pool->get_backend(); Glom::ConnectionPoolBackends::PostgresCentralHosted* central = dynamic_cast(backend); if(central) { document->set_connection_port( central->get_port() ); } return true; } else { std::cerr << G_STRFUNC << ": Could not connect to just-created database." << std::endl; return false; } } bool recreate_database_from_document(Document* document, const sigc::slot& progress) { ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(!connection_pool) return false; //Impossible anyway. //Check whether the database exists already. const Glib::ustring db_name = document->get_connection_database(); if(db_name.empty()) return false; connection_pool->set_database(db_name); try { connection_pool->set_ready_to_connect(); //This has succeeded already. sharedptr sharedconnection = connection_pool->connect(); std::cerr << G_STRFUNC << ": Failed because database exists already." << std::endl; return false; //Connection to the database succeeded, because no exception was thrown. so the database exists already. } catch(const ExceptionConnection& ex) { if(ex.get_failure_type() == ExceptionConnection::FAILURE_NO_SERVER) { std::cerr << G_STRFUNC << ": AppWindow::recreate_database(): Failed because connection to server failed even without specifying a database." << std::endl; return false; } //Otherwise continue, because we _expected_ connect() to fail if the db does not exist yet. } //Create the database: progress(); connection_pool->set_database( Glib::ustring() ); const bool db_created = create_database(document, db_name, document->get_database_title_original(), progress); if(!db_created) { return false; } else connection_pool->set_database(db_name); //Specify the new database when connecting from now on. progress(); sharedptr sharedconnection; try { //Check that we can connect: sharedconnection = connection_pool->connect(); } catch(const ExceptionConnection& ex) { std::cerr << G_STRFUNC << ": Failed to connect to the newly-created database." << std::endl; return false; } progress(); //Create each table: Document::type_listTableInfo tables = document->get_tables(); for(Document::type_listTableInfo::const_iterator iter = tables.begin(); iter != tables.end(); ++iter) { sharedptr table_info = *iter; //Create SQL to describe all fields in this table: Glib::ustring sql_fields; Document::type_vec_fields fields = document->get_table_fields(table_info->get_name()); progress(); const bool table_creation_succeeded = create_table(table_info, fields); progress(); if(!table_creation_succeeded) { std::cerr << G_STRFUNC << ": CREATE TABLE failed with the newly-created database." << std::endl; return false; } } //Note that create_database() has already called add_standard_tables() and add_standard_groups(document). //Add groups from the document: progress(); if(!add_groups_from_document(document)) { std::cerr << G_STRFUNC << ": add_groups_from_document() failed." << std::endl; return false; } //Set table privileges, using the groups we just added: progress(); if(!DbUtils::set_table_privileges_groups_from_document(document)) { std::cerr << G_STRFUNC << ": set_table_privileges_groups_from_document() failed." << std::endl; return false; } for(Document::type_listTableInfo::const_iterator iter = tables.begin(); iter != tables.end(); ++iter) { sharedptr table_info = *iter; //Add any example data to the table: progress(); //try //{ progress(); const bool table_insert_succeeded = insert_example_data(document, table_info->get_name()); if(!table_insert_succeeded) { std::cerr << G_STRFUNC << ": INSERT of example data failed with the newly-created database." << std::endl; return false; } //} //catch(const std::exception& ex) //{ // std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; //HandleError(ex); //} } //for(tables) return true; //All tables created successfully. } SystemPrefs get_database_preferences(Document* document) { //if(get_userlevel() == AppState::USERLEVEL_DEVELOPER) // add_standard_tables(document); SystemPrefs result; //Check that the user is allowed to even view this table: //TODO_moved: //Privileges table_privs = Glom::Privs::get_current_privs(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); //if(!table_privs.m_view) // return result; const bool optional_org_logo = get_field_exists_in_database(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME, GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_LOGO); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_target(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_PREFS_FIELD_NAME, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_NAME, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_STREET, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_STREET2, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_TOWN, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_COUNTY, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_COUNTRY, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->select_add_field(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_POSTCODE, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); if(optional_org_logo) { builder->select_add_field(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_LOGO, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); } int attempts = 0; while(attempts < 2) { bool succeeded = true; try { //const std::string full_query = Utils::sqlbuilder_get_full_query(builder); Glib::RefPtr datamodel = query_execute_select(builder); if(datamodel && (datamodel->get_n_rows() != 0)) { result.m_name = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(0, 0)); result.m_org_name = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(1, 0)); result.m_org_address_street = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(2, 0)); result.m_org_address_street2 = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(3, 0)); result.m_org_address_town = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(4, 0)); result.m_org_address_county = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(5, 0)); result.m_org_address_country = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(6, 0)); result.m_org_address_postcode = Conversions::get_text_for_gda_value(Field::TYPE_TEXT, datamodel->get_value_at(7, 0)); //We need to be more clever about these column indexes if we add more new fields: if(optional_org_logo) result.m_org_logo = datamodel->get_value_at(8, 0); } else succeeded = false; } catch(const Glib::Exception& ex) { std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; succeeded = false; } catch(const std::exception& ex) { std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; succeeded = false; } //Return the result, or try again: if(succeeded) return result; else { const bool test = add_standard_tables(document); if(!test) { std::cerr << G_STRFUNC << ": add_standard_tables() failed." << std::endl; } ++attempts; //Try again now that we have tried to create the table. } } return result; } void set_database_preferences(Document* document, const SystemPrefs& prefs) { //The logo field was introduced in a later version of Glom. //If the user is not in developer mode then the new field has not yet been added: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder->set_table(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_NAME, prefs.m_name); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_NAME, prefs.m_org_name); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_STREET, prefs.m_org_address_street); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_STREET2, prefs.m_org_address_street2); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_TOWN, prefs.m_org_address_town); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_COUNTY, prefs.m_org_address_county); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_COUNTRY, prefs.m_org_address_country); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_ADDRESS_POSTCODE, prefs.m_org_address_postcode); if(get_field_exists_in_database(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME, GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_LOGO)) { builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_ORG_LOGO, prefs.m_org_logo); } builder->set_where(builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(GLOM_STANDARD_TABLE_PREFS_FIELD_ID, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME), builder->add_expr(1))); const bool test = query_execute(builder); if(!test) std::cerr << G_STRFUNC << ": UPDATE failed." << std::endl; //Set some information in the document too, so we can use it to recreate the database: document->set_database_title_original(prefs.m_name); } bool add_standard_tables(Document* document) { try { Document::type_vec_fields pref_fields; sharedptr prefs_table_info = Document::create_table_system_preferences(pref_fields); //Name, address, etc: if(!get_table_exists_in_database(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME)) { const bool test = create_table(prefs_table_info, pref_fields); if(test) { //Add the single record: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_INSERT); builder->set_table(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_ID, 1); const bool test = query_execute(builder); if(!test) std::cerr << G_STRFUNC << ": INSERT failed." << std::endl; //Use the database title from the document, if there is one: const Glib::ustring system_name = document->get_database_title_original(); if(!system_name.empty()) { Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder->set_table(GLOM_STANDARD_TABLE_PREFS_TABLE_NAME); builder->add_field_value(GLOM_STANDARD_TABLE_PREFS_FIELD_NAME, system_name); builder->set_where(builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(GLOM_STANDARD_TABLE_PREFS_FIELD_ID, GLOM_STANDARD_TABLE_PREFS_TABLE_NAME), builder->add_expr(1))); const bool test = query_execute(builder); if(!test) std::cerr << G_STRFUNC << ": UPDATE failed." << std::endl; } } else { std::cerr << G_STRFUNC << ": add_standard_tables(): create_table(prefs) failed." << std::endl; return false; } } else { //Make sure that it has all the fields it should have, //because we sometimes add some in new Glom versions: create_table_add_missing_fields(prefs_table_info, pref_fields); } //Auto-increment next values: if(!get_table_exists_in_database(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME)) { sharedptr table_info(new TableInfo()); table_info->set_name(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); table_info->set_title_original(_("System: Auto Increments")); table_info->set_hidden(true); Document::type_vec_fields fields; sharedptr primary_key(new Field()); //It's not used, because there's only one record, but we must have one. primary_key->set_name(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_ID); primary_key->set_glom_type(Field::TYPE_NUMERIC); fields.push_back(primary_key); sharedptr field_table_name(new Field()); field_table_name->set_name(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_TABLE_NAME); field_table_name->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_table_name); sharedptr field_field_name(new Field()); field_field_name->set_name(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_FIELD_NAME); field_field_name->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_field_name); sharedptr field_next_value(new Field()); field_next_value->set_name(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_NEXT_VALUE); field_next_value->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_next_value); const bool test = create_table(table_info, fields); if(!test) { std::cerr << G_STRFUNC << ": add_standard_tables(): create_table(autoincrements) failed." << std::endl; return false; } return true; } else { return false; } } catch(const Glib::Exception& ex) { std::cerr << G_STRFUNC << ": caught exception: " << ex.what() << std::endl; return false; } catch(const std::exception& ex) { std::cerr << G_STRFUNC << ": caught exception: " << ex.what() << std::endl; return false; } } bool add_standard_groups(Document* document) { //Add the glom_developer group if it does not exist: const Glib::ustring devgroup = GLOM_STANDARD_GROUP_NAME_DEVELOPER; Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": No connection yet." << std::endl; } // If the connection doesn't support users we can skip this step if(gda_connection->supports_feature(Gnome::Gda::CONNECTION_FEATURE_USERS)) { const type_vec_strings vecGroups = Glom::Privs::get_database_groups(); type_vec_strings::const_iterator iterFind = std::find(vecGroups.begin(), vecGroups.end(), devgroup); if(iterFind == vecGroups.end()) { //TODO: Escape and quote the user and group names here? //The "SUPERUSER" here has no effect because SUPERUSER is not "inherited" to member users. //But let's keep it to make the purpose of this group obvious. bool test = query_execute_string( DbUtils::build_query_create_group(GLOM_STANDARD_GROUP_NAME_DEVELOPER, true /* superuser */)); if(!test) { std::cerr << G_STRFUNC << ": CREATE GROUP failed when adding the developer group." << std::endl; return false; } //Make sure the current user is in the developer group. //(If he is capable of creating these groups then he is obviously a developer, and has developer rights on the postgres server.) const Glib::ustring current_user = ConnectionPool::get_instance()->get_user(); const Glib::ustring strQuery = build_query_add_user_to_group(GLOM_STANDARD_GROUP_NAME_DEVELOPER, current_user); test = query_execute_string(strQuery); if(!test) { std::cerr << G_STRFUNC << ": ALTER GROUP failed when adding the user to the developer group." << std::endl; return false; } //std::cout << "DEBUG: Added user " << current_user << " to glom developer group on postgres server." << std::endl; Privileges priv_devs; priv_devs.m_view = true; priv_devs.m_edit = true; priv_devs.m_create = true; priv_devs.m_delete = true; Document::type_listTableInfo table_list = document->get_tables(true /* including system prefs */); for(Document::type_listTableInfo::const_iterator iter = table_list.begin(); iter != table_list.end(); ++iter) { sharedptr table_info = *iter; if(table_info) { const Glib::ustring table_name = table_info->get_name(); if(get_table_exists_in_database(table_name)) //Maybe the table has not been created yet. Glom::Privs::set_table_privileges(devgroup, table_name, priv_devs, true /* developer privileges */); } } //Make sure that it is in the database too: GroupInfo group_info; group_info.set_name(GLOM_STANDARD_GROUP_NAME_DEVELOPER); group_info.m_developer = true; document->set_group(group_info); } } else { std::cout << "DEBUG: Connection does not support users" << std::endl; } return true; } bool add_groups_from_document(Document* document) { Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": add_standard_groups(): No connection yet." << std::endl; } // If the connection doesn't support users we can skip this step if(!(gda_connection->supports_feature(Gnome::Gda::CONNECTION_FEATURE_USERS))) return true; //Get the list of groups from the database server: const type_vec_strings database_groups = Privs::get_database_groups(); //Get the list of groups from the document: const Document::type_list_groups document_groups = document->get_groups(); //Add each group if it doesn't exist yet: for(Document::type_list_groups::const_iterator iter = document_groups.begin(); iter != document_groups.end(); ++iter) { const GroupInfo& group = *iter; const Glib::ustring name = group.get_name(); //std::cout << G_STRFUNC << ": DEBUG: group=" << name << std::endl; //See if the group exists in the database: type_vec_strings::const_iterator iterFind = std::find(database_groups.begin(), database_groups.end(), name); if(!name.empty() && iterFind == database_groups.end()) { if(!add_group(document, name, group.m_developer)) { std::cerr << G_STRFUNC << ": add_group() failed when adding the group with name=" << name << std::endl; return false; } } } return true; } bool set_table_privileges_groups_from_document(Document* document) { Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": add_standard_groups(): No connection yet." << std::endl; } // If the connection doesn't support users we can skip this step if(!(gda_connection->supports_feature(Gnome::Gda::CONNECTION_FEATURE_USERS))) return true; //Get the list of groups from the database server: const type_vec_strings database_groups = Privs::get_database_groups(); //Get the list of groups from the document: const Document::type_list_groups document_groups = document->get_groups(); //Get the list of tables: const Document::type_listTableInfo table_list = document->get_tables(); bool result = true; for(Document::type_list_groups::const_iterator iter = document_groups.begin(); iter != document_groups.end(); ++iter) { const GroupInfo& group_info = *iter; const Glib::ustring group_name = group_info.get_name(); //See if the group exists in the database: type_vec_strings::const_iterator iterFind = std::find(database_groups.begin(), database_groups.end(), group_name); if(!group_name.empty() && iterFind == database_groups.end()) { std::cerr << G_STRFUNC << ": group does not exist in the database. group name=" << group_name << std::endl; result = false; continue; } //Look at each table privilege for this group: for(GroupInfo::type_map_table_privileges::const_iterator iter = group_info.m_map_privileges.begin(); iter != group_info.m_map_privileges.end(); ++iter) { const Glib::ustring table_name = iter->first; const Privileges& privs = iter->second; //Set the table privilege for the group: Privs::set_table_privileges(group_name, table_name, privs, group_info.m_developer); } } return result; } namespace { //anonymous //If the string has quotes around it, remove them static Glib::ustring remove_quotes(const Glib::ustring& str) { const gchar* quote = "\""; const Glib::ustring::size_type posQuoteStart = str.find(quote); if(posQuoteStart != 0) return str; const Glib::ustring::size_type size = str.size(); const Glib::ustring::size_type posQuoteEnd = str.find(quote, 1); if(posQuoteEnd != (size - 1)) return str; return str.substr(1, size - 2); } } //anonymous namespace static bool meta_table_column_is_primary_key(GdaMetaTable* meta_table, const Glib::ustring column_name) { if(!meta_table) return false; for(GSList* item = meta_table->columns; item != 0; item = item->next) { GdaMetaTableColumn* column = GDA_META_TABLE_COLUMN(item->data); if(!column) continue; if(column->column_name && (column_name == remove_quotes(column->column_name))) return column->pkey; } return false; } bool handle_error() { return ConnectionPool::handle_error_cerr_only(); } void handle_error(const Glib::Exception& ex) { std::cerr << G_STRFUNC << ": Internal Error (handle_error()): exception type=" << typeid(ex).name() << ", ex.what()=" << ex.what() << std::endl; //TODO_Moved: //Gtk::MessageDialog dialog(Utils::bold_message(_("Internal error")), true, Gtk::MESSAGE_WARNING ); //dialog.set_secondary_text(ex.what()); //TODO: dialog.set_transient_for(*get_appwindow()); //dialog.run(); } void handle_error(const std::exception& ex) { std::cerr << G_STRFUNC << ": Internal Error (handle_error()): exception type=" << typeid(ex).name() << ", ex.what()=" << ex.what() << std::endl; //TODO_Moved: //Gtk::MessageDialog dialog(Utils::bold_message(_("Internal error")), true, Gtk::MESSAGE_WARNING ); //dialog.set_secondary_text(ex.what()); //TODO: dialog.set_transient_for(*get_appwindow()); //dialog.run(); } bool get_field_exists_in_database(const Glib::ustring& table_name, const Glib::ustring& field_name) { type_vec_fields vecFields = get_fields_for_table_from_database(table_name); type_vec_fields::const_iterator iterFind = std::find_if(vecFields.begin(), vecFields.end(), predicate_FieldHasName(field_name)); return iterFind != vecFields.end(); } type_vec_fields get_fields_for_table_from_database(const Glib::ustring& table_name, bool /* including_system_fields */) { type_vec_fields result; if(table_name.empty()) return result; // These are documented here: // http://library.gnome.org/devel/libgda-4.0/3.99/connection.html#GdaConnectionMetaTypeHead enum GlomGdaDataModelFieldColumns { DATAMODEL_FIELDS_COL_NAME = 0, DATAMODEL_FIELDS_COL_TYPE = 1, DATAMODEL_FIELDS_COL_GTYPE = 2, DATAMODEL_FIELDS_COL_SIZE = 3, DATAMODEL_FIELDS_COL_SCALE = 4, DATAMODEL_FIELDS_COL_NOTNULL = 5, DATAMODEL_FIELDS_COL_DEFAULTVALUE = 6, DATAMODEL_FIELDS_COL_EXTRA = 6 // Could be auto-increment }; //TODO: BusyCursor busy_cursor(get_appwindow()); { Glib::RefPtr connection = get_connection(); if(!connection) { std::cerr << G_STRFUNC << ": connection is null" << std::endl; return result; } Glib::RefPtr holder_table_name = Gnome::Gda::Holder::create(G_TYPE_STRING, "name"); gchar* quoted_table_name_c = gda_meta_store_sql_identifier_quote(table_name.c_str(), connection->gobj()); g_assert(quoted_table_name_c); Glib::ustring quoted_table_name(quoted_table_name_c); g_free (quoted_table_name_c); quoted_table_name_c = 0; holder_table_name->set_value(quoted_table_name); std::vector< Glib::RefPtr > holder_list; holder_list.push_back(holder_table_name); Glib::RefPtr data_model_fields; try { //This should work because we called update_meta_store_table_names() in ConnectionPool, //and that gets the tables' fields too. data_model_fields = connection->get_meta_store_data(Gnome::Gda::CONNECTION_META_FIELDS, holder_list); } catch(const Gnome::Gda::MetaStoreError& ex) { std::cerr << G_STRFUNC << ": MetaStoreError: " << ex.what() << std::endl; } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Error: " << ex.what() << std::endl; } if(!data_model_fields) { std::cerr << G_STRFUNC << ": libgda reported empty fields schema data_model for the table." << std::endl; } else if(data_model_fields->get_n_columns() == 0) { std::cerr << G_STRFUNC << ": libgda reported 0 fields for the table." << std::endl; } else if(data_model_fields->get_n_rows() == 0) { std::cerr << G_STRFUNC << ": table_name=" << table_name << ": data_model_fields->get_n_rows() == 0: The table probably does not exist in the specified database, or the user does not have SELECT rights." << std::endl; } else { //We also use the GdaMetaTable to discover primary keys. //Both these libgda APIs are awful, and it's awful that we must use two APIs. murrayc. Glib::RefPtr store = connection->get_meta_store(); Glib::RefPtr metastruct = Gnome::Gda::MetaStruct::create(store, Gnome::Gda::META_STRUCT_FEATURE_NONE); GdaMetaDbObject* meta_dbobject = 0; try { meta_dbobject = metastruct->complement(Gnome::Gda::META_DB_TABLE, Gnome::Gda::Value(), /* catalog */ Gnome::Gda::Value(), /* schema */ Gnome::Gda::Value(quoted_table_name)); //It's a static instance inside the MetaStore. } catch(const Glib::Error& ex) { handle_error(ex); //TODO: Really fail. } GdaMetaTable* meta_table = GDA_META_TABLE(meta_dbobject); //Examine each field: guint row = 0; const gulong rows_count = data_model_fields->get_n_rows(); while(row < rows_count) { Glib::RefPtr field_info = Gnome::Gda::Column::create(); //Get the field name: const Gnome::Gda::Value value_name = data_model_fields->get_value_at(DATAMODEL_FIELDS_COL_NAME, row); if(value_name.get_value_type() == G_TYPE_STRING) { if(value_name.get_string().empty()) g_warning("get_fields_for_table_from_database(): value_name is empty."); Glib::ustring field_name = value_name.get_string(); //TODO: get_string() is a dodgy choice. murrayc. field_name = remove_quotes(field_name); field_info->set_name(field_name); //std::cout << " debug: field_name=" << field_name << std::endl; } //Get the field type: const Gnome::Gda::Value value_fieldtype = data_model_fields->get_value_at(DATAMODEL_FIELDS_COL_GTYPE, row); if(value_fieldtype.get_value_type() == G_TYPE_STRING) { const Glib::ustring type_string = value_fieldtype.get_string(); const GType gdatype = gda_g_type_from_string(type_string.c_str()); field_info->set_g_type(gdatype); } //Get the default value: /* libgda does not return this correctly yet. TODO: check bug http://bugzilla.gnome.org/show_bug.cgi?id=143576 const Gnome::Gda::Value value_defaultvalue = data_model_fields->get_value_at(DATAMODEL_FIELDS_COL_DEFAULTVALUE, row); if(value_defaultG_VALUE_TYPE(value.gobj()) == G_TYPE_STRING) field_info->set_default_value(value_defaultvalue); */ //Get whether it can be null: const Gnome::Gda::Value value_notnull = data_model_fields->get_value_at(DATAMODEL_FIELDS_COL_NOTNULL, row); if(value_notnull.get_value_type() == G_TYPE_BOOLEAN) field_info->set_allow_null(value_notnull.get_boolean()); sharedptr field = sharedptr::create(); //TODO: Get glom-specific information from the document? field->set_field_info(field_info); //Get whether it is a primary key: field->set_primary_key( meta_table_column_is_primary_key(meta_table, field_info->get_name()) ); result.push_back(field); ++row; } } } if(result.empty()) { //g_warning("get_fields_for_table_from_database(): returning empty result."); } //Hide system fields. type_vec_fields::iterator iterFind = std::find_if(result.begin(), result.end(), predicate_FieldHasName(GLOM_STANDARD_FIELD_LOCK)); if(iterFind != result.end()) result.erase(iterFind); return result; } //TODO: This is very inefficient, because it is type_vec_fields get_fields_for_table(const Document* document, const Glib::ustring& table_name, bool /* including_system_fields */) { //We could also get the field definitions from the database: //But that is inefficient because this method is called so often, //and that meta information is not even available if the user does not have SELECT rights. //Therefore we just assume that the Document has been updated from the database already. //type_vec_fields fieldsDatabase = get_fields_for_table_from_database(table_name, including_system_fields); if(!document) { std::cerr << G_STRFUNC << ": document is null" << std::endl; return type_vec_fields(); //This should never happen. } type_vec_fields result = document->get_table_fields(table_name); //Look at each field in the database: /* for(type_vec_fields::iterator iter = fieldsDocument.begin(); iter != fieldsDocument.end(); ++iter) { sharedptr field = *iter; const Glib::ustring field_name = field->get_name(); //Get the field info from the database: //This is in the document as well, but it _might_ have changed. type_vec_fields::const_iterator iterFindDatabase = std::find_if(fieldsDatabase.begin(), fieldsDatabase.end(), predicate_FieldHasName(field_name)); if(iterFindDatabase != fieldsDatabase.end() ) //Ignore fields that don't exist in the database anymore. { Glib::RefPtr field_info_document = field->get_field_info(); //Update the Field information that _might_ have changed in the database. Glib::RefPtr field_info = (*iterFindDatabase)->get_field_info(); //libgda does not tell us whether the field is auto_incremented, so we need to get that from the document. field_info->set_auto_increment( field_info_document->get_auto_increment() ); //libgda does not tell us whether the field is auto_incremented, so we need to get that from the document. //TODO_gda:field_info->set_primary_key( field_info_document->get_primary_key() ); //libgda does yet tell us correct default_value information so we need to get that from the document. field_info->set_default_value( field_info_document->get_default_value() ); field->set_field_info(field_info); result.push_back(*iter); } } //Add any fields that are in the database, but not in the document: for(type_vec_fields::iterator iter = fieldsDatabase.begin(); iter != fieldsDatabase.end(); ++iter) { const Glib::ustring field_name = (*iter)->get_name(); //Look in the result so far: type_vec_fields::const_iterator iterFind = std::find_if(result.begin(), result.end(), predicate_FieldHasName(field_name)); //Add it if it is not there: if(iterFind == result.end() ) result.push_back(*iter); } */ return result; } sharedptr get_fields_for_table_one_field(const Document* document, const Glib::ustring& table_name, const Glib::ustring& field_name) { //Initialize output parameter: sharedptr result; if(field_name.empty() || table_name.empty()) return result; type_vec_fields fields = get_fields_for_table(document, table_name); //TODO_Performance type_vec_fields::iterator iter = std::find_if(fields.begin(), fields.end(), predicate_FieldHasName(field_name)); if(iter != fields.end()) //TODO: Handle error? { return *iter; } return sharedptr(); } //TODO_Performance: Avoid calling this so often. //TODO: Put this in libgdamm. type_vec_strings get_table_names_from_database(bool ignore_system_tables) { type_vec_strings result; { Glib::RefPtr gda_connection = get_connection(); Glib::RefPtr data_model_tables; try { //This should work because we called update_meta_store_tables() in ConnectionPool. data_model_tables = gda_connection->get_meta_store_data(Gnome::Gda::CONNECTION_META_TABLES); } catch(const Gnome::Gda::MetaStoreError& ex) { std::cerr << G_STRFUNC << ": MetaStoreError: " << ex.what() << std::endl; } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Error: " << ex.what() << std::endl; } if(!data_model_tables) { std::cerr << G_STRFUNC << ": libgda returned an empty tables GdaDataModel for the database." << std::endl; } else if(data_model_tables->get_n_columns() <= 0) { std::cerr << G_STRFUNC << ": libgda reported 0 tables for the database." << std::endl; } else { //std::cout << "debug: data_model_tables refcount=" << G_OBJECT(data_model_tables->gobj())->ref_count << std::endl; const int rows = data_model_tables->get_n_rows(); for(int i = 0; i < rows; ++i) { const Gnome::Gda::Value value = data_model_tables->get_value_at(0, i); //Get the table name: Glib::ustring table_name; if(G_VALUE_TYPE(value.gobj()) == G_TYPE_STRING) { table_name = value.get_string(); //The table names have quotes sometimes. See http://bugzilla.gnome.org/show_bug.cgi?id=593154 table_name = remove_quotes(table_name); //TODO: Unescape the string with gda_server_provider_unescape_string()? //std::cout << "DEBUG: Found table: " << table_name << std::endl; if(ignore_system_tables) { //Check whether it's a system table: const Glib::ustring prefix = "glom_system_"; const Glib::ustring table_prefix = table_name.substr(0, prefix.size()); if(table_prefix == prefix) continue; } //Ignore the pga_* tables that pgadmin adds when you use it: if(table_name.substr(0, 4) == "pga_") continue; //Ignore the pg_* tables that something (Postgres? libgda?) adds: //Not needed now that this was fixed again in libgda-4.0. //if(table_name.substr(0, 14) == "pg_catalog.pg_") // continue; //Ignore the information_schema tables that something (libgda?) adds: //Not needed now that this was fixed again in libgda-4.0. //if(table_name.substr(0, 23) == "information_schema.sql_") // continue; result.push_back(table_name); } } } } return result; } bool get_table_exists_in_database(const Glib::ustring& table_name) { //TODO_Performance const type_vec_strings tables = get_table_names_from_database(); type_vec_strings::const_iterator iterFind = std::find(tables.begin(), tables.end(), table_name); return (iterFind != tables.end()); } bool create_table_with_default_fields(Document* document, const Glib::ustring& table_name) { if(table_name.empty()) return false; Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": No connection yet." << std::endl; return false; } bool created = false; //Primary key: sharedptr field_primary_key(new Field()); field_primary_key->set_name(table_name + "_id"); field_primary_key->set_title_original( Glib::ustring::compose("%1 ID", table_name) ); field_primary_key->set_primary_key(); field_primary_key->set_auto_increment(); Glib::RefPtr field_info = field_primary_key->get_field_info(); field_info->set_allow_null(false); field_primary_key->set_field_info(field_info); field_primary_key->set_glom_type(Field::TYPE_NUMERIC); //std::cout << "debug: " << G_STRFUNC << ":" << field_primary_key->get_auto_increment() << std::endl; type_vec_fields fields; fields.push_back(field_primary_key); //Description: sharedptr field_description(new Field()); field_description->set_name("description"); field_description->set_title_original(_("Description")); //Use a translation, because the original locale will be marked as non-English if the current locale is non-English. field_description->set_glom_type(Field::TYPE_TEXT); fields.push_back(field_description); //Comments: sharedptr field_comments(new Field()); field_comments->set_name("comments"); field_comments->set_title_original(_("Comments")); field_comments->set_glom_type(Field::TYPE_TEXT); field_comments->m_default_formatting.set_text_format_multiline(); fields.push_back(field_comments); sharedptr table_info(new TableInfo()); table_info->set_name(table_name); table_info->set_title_original( Utils::title_from_string( table_name ) ); //Start with a title that might be appropriate. created = create_table(table_info, fields); if(created) { //Save the changes in the document: if(document) { document->add_table(table_info); document->set_table_fields(table_info->get_name(), fields); } } return created; } bool create_table(const sharedptr& table_info, const Document::type_vec_fields& fields_in) { //std::cout << "debug: " << G_STRFUNC << ": " << table_info->get_name() << ", title=" << table_info->get_title() << std::endl; bool table_creation_succeeded = false; Document::type_vec_fields fields = fields_in; //Create the standard field too: //(We don't actually use this yet) if(std::find_if(fields.begin(), fields.end(), predicate_FieldHasName(GLOM_STANDARD_FIELD_LOCK)) == fields.end()) { sharedptr field = sharedptr::create(); field->set_name(GLOM_STANDARD_FIELD_LOCK); field->set_glom_type(Field::TYPE_TEXT); fields.push_back(field); } //Create SQL to describe all fields in this table: Glib::ustring sql_fields; for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { //Create SQL to describe this field: sharedptr field = *iter; //The field has no gda type, so we set that: //This usually comes from the database, but that's a bit strange. Glib::RefPtr info = field->get_field_info(); info->set_g_type( Field::get_gda_type_for_glom_type(field->get_glom_type()) ); field->set_field_info(info); //TODO_Performance Glib::ustring sql_field_description = escape_sql_id(field->get_name()) + " " + field->get_sql_type(); if(field->get_primary_key()) sql_field_description += " NOT NULL PRIMARY KEY"; //Append it: if(!sql_fields.empty()) sql_fields += ", "; sql_fields += sql_field_description; } if(sql_fields.empty()) { std::cerr << G_STRFUNC << ": sql_fields is empty." << std::endl; } //Actually create the table try { //TODO: Escape the table name? //TODO: Use GDA_SERVER_OPERATION_CREATE_TABLE instead? table_creation_succeeded = query_execute_string( "CREATE TABLE " + escape_sql_id(table_info->get_name()) + " (" + sql_fields + ");" ); if(!table_creation_succeeded) std::cerr << G_STRFUNC << ": CREATE TABLE failed." << std::endl; } catch(const ExceptionConnection& ex) { std::cerr << G_STRFUNC << "CREATE TABLE failed: " << ex.what() << std::endl; table_creation_succeeded = false; } if(table_creation_succeeded) { // Update the libgda meta store, so that get_fields_for_table_from_database() // returns the fields correctly for the new table. if(!update_gda_metastore_for_table(table_info->get_name())) return false; // TODO: Maybe we should create the table directly via libgda instead of // executing an SQL query ourselves, so that libgda has the chance to // do this meta store update automatically. // (Yes, generally it would be nice to use libgda API instead of generating SQL. murrayc) } return table_creation_succeeded; } bool create_table_add_missing_fields(const sharedptr& table_info, const Document::type_vec_fields& fields) { const Glib::ustring table_name = table_info->get_name(); for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { sharedptr field = *iter; if(!get_field_exists_in_database(table_name, field->get_name())) { const bool test = add_column(table_name, field, 0); /* TODO: parent_window */ if(!test) return test; } } return true; } bool add_column(const Glib::ustring& table_name, const sharedptr& field, Gtk::Window* /* parent_window */) { ConnectionPool* connection_pool = ConnectionPool::get_instance(); try { connection_pool->add_column(table_name, field); } catch(const Glib::Error& ex) { handle_error(ex); // Gtk::MessageDialog window(*parent_window, Utils::bold_message(ex.what()), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); // window.run(); return false; } return true; } bool drop_column(const Glib::ustring& table_name, const Glib::ustring& field_name) { ConnectionPool* connection_pool = ConnectionPool::get_instance(); try { return connection_pool->drop_column(table_name, field_name); } catch(const Glib::Error& ex) { handle_error(ex); // Gtk::MessageDialog window(*parent_window, Utils::bold_message(ex.what()), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); // window.run(); return false; } return true; } static void builder_set_where_autoincrement(const Glib::RefPtr& builder, const Glib::ustring& table_name, const Glib::ustring& field_name) { if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name is empty" << std::endl; return; } if(field_name.empty()) { std::cerr << G_STRFUNC << ": field_name is empty" << std::endl; return; } builder->set_where(builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_AND, builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_TABLE_NAME, GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME), builder->add_expr(table_name)), builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_FIELD_NAME, GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME), builder->add_expr(field_name)))); } Gnome::Gda::Value get_next_auto_increment_value(const Glib::ustring& table_name, const Glib::ustring& field_name) { if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name is empty" << std::endl; return Gnome::Gda::Value(); } if(field_name.empty()) { std::cerr << G_STRFUNC << ": field_name is empty" << std::endl; return Gnome::Gda::Value(); } const Gnome::Gda::Value result = DbUtils::auto_increment_insert_first_if_necessary(table_name, field_name); double num_result = Conversions::get_double_for_gda_value_numeric(result); //Increment the next_value: ++num_result; const Gnome::Gda::Value next_value = Conversions::parse_value(num_result); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder->set_table(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder->add_field_value_as_value(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_NEXT_VALUE, next_value); builder_set_where_autoincrement(builder, table_name, field_name); const bool test = query_execute(builder); if(!test) std::cerr << G_STRFUNC << ": Increment failed." << std::endl; return result; } Gnome::Gda::Value auto_increment_insert_first_if_necessary(const Glib::ustring& table_name, const Glib::ustring& field_name) { if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name is empty" << std::endl; return Gnome::Gda::Value(); } if(field_name.empty()) { std::cerr << G_STRFUNC << ": field_name is empty" << std::endl; return Gnome::Gda::Value(); } Gnome::Gda::Value value; //Check that the user is allowd to view and edit this table: Privileges table_privs = Privs::get_current_privs(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); if(!table_privs.m_view || !table_privs.m_edit) { //This should not happen: std::cerr << G_STRFUNC << ": The current user may not edit the autoincrements table. Any user who has create rights for a table should have edit rights to the autoincrements table." << std::endl; } Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field("next_value", GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder->select_add_target(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder_set_where_autoincrement(builder, table_name, field_name); const Glib::RefPtr datamodel = query_execute_select(builder); if(!datamodel || (datamodel->get_n_rows() == 0)) { //Start with zero: //Insert the row if it's not there. builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_INSERT); builder->set_table(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder->add_field_value(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_TABLE_NAME, table_name); builder->add_field_value(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_FIELD_NAME, field_name); builder->add_field_value(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_NEXT_VALUE, 0); const bool test = query_execute(builder); if(!test) std::cerr << G_STRFUNC << ": INSERT of new row failed." << std::endl; //GdaNumeric is a pain, so we take a short-cut: bool success = false; value = Conversions::parse_value(Field::TYPE_NUMERIC, "0", success, true /* iso_format */); } else { //Return the value so that a calling function does not need to do a second SELECT. const Gnome::Gda::Value actual_value = datamodel->get_value_at(0, 0); //But the caller wants a numeric value not a text value //(our system_autoincrements table has it as text, for future flexibility): const std::string actual_value_text = actual_value.get_string(); bool success = false; value = Conversions::parse_value(Field::TYPE_NUMERIC, actual_value_text, success, true /* iso_format */); } //std::cout << "auto_increment_insert_first_if_necessary: returning value of type=" << value.get_value_type() << std::endl; return value; } /** Set the next auto-increment value in the glom system table, by examining all current values. * Use this, for instance, after importing rows. * Add a row for this field in the system table if it does not exist already. */ static void recalculate_next_auto_increment_value(const Glib::ustring& table_name, const Glib::ustring& field_name) { if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name is empty" << std::endl; return; } if(field_name.empty()) { std::cerr << G_STRFUNC << ": field_name is empty" << std::endl; return; } //Make sure that the row exists in the glom system table: auto_increment_insert_first_if_necessary(table_name, field_name); //Get the max key value in the database: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); std::vector args; args.push_back(builder->add_field_id(field_name, table_name)); builder->add_field_value_id(builder->add_function("MAX", args)); builder->select_add_target(table_name); Glib::RefPtr datamodel = query_execute_select(builder); if(datamodel && datamodel->get_n_rows() && datamodel->get_n_columns()) { //Increment it: const Gnome::Gda::Value value_max = datamodel->get_value_at(0, 0); // A GdaNumeric. //TODO: This happens with MySQL. Maybe it is OK, when there are no records or no values: if(Glom::Conversions::value_is_empty(value_max)) { std::cerr << G_STRFUNC << ": The MAX() value is null for query: " << Utils::sqlbuilder_get_full_query(builder) << std::endl; } double num_max = Conversions::get_double_for_gda_value_numeric(value_max); ++num_max; //Set it in the glom system table: const Gnome::Gda::Value next_value = Conversions::parse_value(num_max); builder.reset(); builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder->set_table(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder->add_field_value_as_value(GLOM_STANDARD_TABLE_AUTOINCREMENTS_FIELD_NEXT_VALUE, next_value); builder_set_where_autoincrement(builder, table_name, field_name); const bool test = query_execute(builder); if(!test) std::cerr << G_STRFUNC << ": UPDATE failed." << std::endl; } else std::cerr << G_STRFUNC << ": SELECT MAX() failed." << std::endl; } void remove_auto_increment(const Glib::ustring& table_name, const Glib::ustring& field_name) { if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name is empty" << std::endl; return; } if(field_name.empty()) { std::cerr << G_STRFUNC << ": field_name is empty" << std::endl; return; } Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_DELETE); builder->set_table(GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME); builder_set_where_autoincrement(builder, table_name, field_name); const bool test = query_execute(builder); if(!test) std::cerr << G_STRFUNC << ": UPDATE failed." << std::endl; } bool insert_example_data(Document* document, const Glib::ustring& table_name) { //TODO_Performance: Avoid copying: const Document::type_example_rows example_rows = document->get_table_example_data(table_name); if(example_rows.empty()) { //std::cout << "debug: " << G_STRFUNC << ": No example data available." << std::endl; return true; } Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": connection is null" << std::endl; return false; } //std::cout << "debug: inserting example_rows for table: " << table_name << std::endl; bool insert_succeeded = true; //Get field names: Document::type_vec_fields vec_fields = document->get_table_fields(table_name); //Actually insert the data: //std::cout << "debug: " << G_STRFUNC << ": number of rows of data: " << vec_rows.size() << std::endl; //std::cout << "DEBUG: example_row size = " << example_rows.size() << std::endl; for(Document::type_example_rows::const_iterator iter = example_rows.begin(); iter != example_rows.end(); ++iter) { //Check that the row contains the correct number of columns. //This check will slow this down, but it seems useful: //TODO: This can only work if we can distinguish , inside "" and , outside "": const Document::type_row_data& row_data = *iter; if(row_data.empty()) break; //std::cout << "DEBUG: row_data size = " << row_data.size() << ", (fields size= " << vec_fields.size() << " )" << std::endl; Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_INSERT); builder->set_table(table_name); for(unsigned int i = 0; i < row_data.size(); ++i) //TODO_Performance: Avoid calling size() so much. { //std::cout << " DEBUG: i=" << i << ", row_data.size()=" << row_data.size() << std::endl; sharedptr field = vec_fields[i]; if(!field) { std::cerr << G_STRFUNC << ": field was null for field num=" << i << std::endl; break; } builder->add_field_value(field->get_name(), row_data[i]); } //Create and parse the SQL query: //After this, the Parser will know how many SQL parameters there are in //the query, and allow us to set their values. insert_succeeded = query_execute(builder); if(!insert_succeeded) { std::cerr << G_STRFUNC << ": The INSERT query failed: " << Utils::sqlbuilder_get_full_query(builder) << std::endl; break; } } for(Document::type_vec_fields::const_iterator iter = vec_fields.begin(); iter != vec_fields.end(); ++iter) { if((*iter)->get_auto_increment()) recalculate_next_auto_increment_value(table_name, (*iter)->get_name()); } return insert_succeeded; } //static: Glib::RefPtr query_execute_select(const Glib::RefPtr& builder, bool use_cursor) { Glib::RefPtr result; //TODO: BusyCursor busy_cursor(get_app_window()); Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": No connection yet." << std::endl; return result; } //Debug output: if(builder && ConnectionPool::get_instance()->get_show_debug_output()) { const std::string full_query = Utils::sqlbuilder_get_full_query(builder); std::cout << "debug: " << G_STRFUNC << ": " << full_query << std::endl; } //TODO: Use DbUtils::query_execute(). try { if(use_cursor) { //Specify the STATEMENT_MODEL_CURSOR, so that libgda only gets the rows that we actually use. result = gda_connection->statement_execute_select_builder(builder, Gnome::Gda::STATEMENT_MODEL_CURSOR_FORWARD); } else result = gda_connection->statement_execute_select_builder(builder); } catch(const Gnome::Gda::ConnectionError& ex) { std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; } catch(const Gnome::Gda::ServerProviderError& ex) { if(ex.code() == Gnome::Gda::ServerProviderError::SERVER_PROVIDER_STATEMENT_EXEC_ERROR) { std::cerr << G_STRFUNC << ": code=SERVER_PROVIDER_STATEMENT_EXEC_ERROR, message=" << ex.what() << std::endl; } else { std::cerr << G_STRFUNC << ": code=" << ex.code() << "message=" << ex.what() << std::endl; } } catch(const Gnome::Gda::SqlError& ex) //TODO: Make sure that statement_execute_select_builder() is documented as throwing this. { std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; } if(!result) { const std::string full_query = Utils::sqlbuilder_get_full_query(builder); std::cerr << G_STRFUNC << ": Error while executing SQL: " << std::endl << " " << full_query << std::endl << std::endl; handle_error(); } return result; } bool query_execute_string(const Glib::ustring& strQuery, const Glib::RefPtr& params) { Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": No connection yet." << std::endl; return false; } Glib::RefPtr parser = gda_connection->create_parser(); Glib::RefPtr stmt; try { stmt = parser->parse_string(strQuery); } catch(const Gnome::Gda::SqlParserError& error) { std::cerr << G_STRFUNC << ": SqlParserError: " << error.what() << std::endl; return false; } //Debug output: if(stmt && ConnectionPool::get_instance()->get_show_debug_output()) { try { //TODO: full_query still seems to contain ## parameter names, //though it works for our SELECT queries in query_execute_select(): const Glib::ustring full_query = stmt->to_sql(params); std::cerr << G_STRFUNC << ": " << full_query << std::endl; } catch(const Glib::Exception& ex) { std::cerr << G_STRFUNC << ": Debug: query string could not be converted to std::cout: " << ex.what() << std::endl; } } int exec_retval = -1; try { exec_retval = gda_connection->statement_execute_non_select(stmt, params); } catch(const Glib::Error& error) { std::cerr << G_STRFUNC << ": ConnectionError: " << error.what() << std::endl; const Glib::ustring full_query = stmt->to_sql(params); std::cerr << " full_query: " << full_query << std::endl; return false; } //Note that only -1 means an error, not all negative values. //For instance, it can return -2 for a successful CREATE TABLE query, to mean that the backend (SQLite) does not report how many rows were affected. if(exec_retval == -1) { const Glib::ustring full_query = stmt->to_sql(params); std::cerr << G_STRFUNC << "Gnome::Gda::Connection::statement_execute_non_select() failed with SQL: " << full_query << std::endl; return false; } return true; } bool query_execute(const Glib::RefPtr& builder) { Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": No connection yet." << std::endl; return false; } //Debug output: if(builder && ConnectionPool::get_instance()->get_show_debug_output()) { const std::string full_query = Utils::sqlbuilder_get_full_query(builder); std::cerr << G_STRFUNC << ": " << full_query << std::endl; } int exec_retval = -1; try { exec_retval = gda_connection->statement_execute_non_select_builder(builder); } catch(const Gnome::Gda::ConnectionError& ex) { std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; const std::string full_query = Utils::sqlbuilder_get_full_query(builder); std::cerr << " full_query: " << full_query << std::endl; return false; } catch(const Gnome::Gda::ServerProviderError& ex) { std::cerr << G_STRFUNC << ": code=" << ex.code() << "message=" << ex.what() << std::endl; const std::string full_query = Utils::sqlbuilder_get_full_query(builder); std::cerr << " full_query: " << full_query << std::endl; return false; } catch(const Gnome::Gda::SqlError& ex) //TODO: Make sure that statement_execute_non_select_builder() is documented as throwing this. { std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; const std::string full_query = Utils::sqlbuilder_get_full_query(builder); std::cerr << " full_query: " << full_query << std::endl; return false; } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; return false; } return (exec_retval >= 0); } void layout_item_fill_field_details(Document* document, const Glib::ustring& parent_table_name, sharedptr& layout_item) { if(!document) { std::cerr << G_STRFUNC << ": document was null." << std::endl; return; } if(!layout_item) { std::cerr << G_STRFUNC << ": layout_item was null." << std::endl; } const Glib::ustring table_name = layout_item->get_table_used(parent_table_name); layout_item->set_full_field_details( document->get_field(table_name, layout_item->get_name()) ); } bool layout_field_should_have_navigation(const Glib::ustring& table_name, const sharedptr& layout_item, const Document* document, sharedptr& field_used_in_relationship_to_one) { //Initialize output parameter: field_used_in_relationship_to_one = sharedptr(); if(!document) { std::cerr << G_STRFUNC << ": document was null." << std::endl; return false; } if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name was empty." << std::endl; return false; } if(!layout_item) { std::cerr << G_STRFUNC << ": layout_item was null." << std::endl; return false; } //Check whether the field controls a relationship, //meaning it identifies a record in another table. sharedptr const_relationship = document->get_field_used_in_relationship_to_one(table_name, layout_item); field_used_in_relationship_to_one = sharedptr::cast_const(const_relationship); //This is just because we can't seem to have a sharedptr& output parameter. // std::cout << "DEBUG: table_name=" << table_name << ", table_used=" << layout_item->get_table_used(table_name) << ", layout_item=" << layout_item->get_name() << ", field_used_in_relationship_to_one=" << field_used_in_relationship_to_one << std::endl; //Check whether the field identifies a record in another table //just because it is a primary key in that table: const sharedptr field_info = layout_item->get_full_field_details(); const bool field_is_related_primary_key = layout_item->get_has_relationship_name() && field_info && field_info->get_primary_key(); // std::cout << "DEBUG: layout_item->get_has_relationship_name()=" << layout_item->get_has_relationship_name() << ", field_info->get_primary_key()=" << field_info->get_primary_key() << ", field_is_related_primary_key=" << field_is_related_primary_key << std::endl; return field_used_in_relationship_to_one || field_is_related_primary_key; } Glib::ustring get_unused_database_name(const Glib::ustring& base_name) { Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); if(!connection_pool) return Glib::ustring(); bool keep_trying = true; size_t extra_num = 0; while(keep_trying) { Glib::ustring database_name_possible; if(extra_num == 0) { //Try the original name first, //removing any characters that are likely to cause problems when used in a SQL identifier name: database_name_possible = Utils::trim_whitespace(base_name); database_name_possible = Utils::string_replace(database_name_possible, "\"", ""); database_name_possible = Utils::string_replace(database_name_possible, "'", ""); database_name_possible = Utils::string_replace(database_name_possible, "\t", ""); database_name_possible = Utils::string_replace(database_name_possible, "\n", ""); } else { //Create a new database name by appending a number to the original name: const Glib::ustring pchExtraNum = Glib::ustring::compose("%1", extra_num); database_name_possible = (base_name + pchExtraNum); } ++extra_num; connection_pool->set_database(database_name_possible); connection_pool->set_ready_to_connect(); Glom::sharedptr connection; try { connection = ConnectionPool::get_and_connect(); } catch(const ExceptionConnection& ex) { if(ex.get_failure_type() == ExceptionConnection::FAILURE_NO_SERVER) { //We couldn't even connect to the server, //regardless of what database we try to connect to: std::cerr << G_STRFUNC << ": Could not connect to the server." << std::endl; return Glib::ustring(); } else { //We assume that the connection failed because the database does not exist. //std::cout << "debug: " << G_STRFUNC << ": unused database name successfully found: " << database_name_possible << std::endl; return database_name_possible; } } } return Glib::ustring(); } int count_rows_returned_by(const Glib::RefPtr& sql_query) { if(!sql_query) { std::cerr << G_STRFUNC << ": sql_query was null." << std::endl; return 0; } const Glib::RefPtr builder = Utils::build_sql_select_count_rows(sql_query); int result = 0; Glib::RefPtr datamodel = DbUtils::query_execute_select(builder); if(datamodel && datamodel->get_n_rows() && datamodel->get_n_columns()) { const Gnome::Gda::Value value = datamodel->get_value_at(0, 0); //This showed me that this contains a gint64: std::cerr << "DEBUG: value type=" << G_VALUE_TYPE_NAME(value.gobj()) << std::endl; //For sqlite, this is an integer if(value.get_value_type() == G_TYPE_INT64) //With the PostgreSQL backend. result = (int)value.get_int64(); else if(value.get_value_type() == G_TYPE_INT) //With the PostgreSQL backend. { result = value.get_int(); //With the SQLite backend. } else { std::cerr << G_STRFUNC << ": The COUNT query returned an unexpected value type: " << g_type_name(value.get_value_type()) << std::endl; result = -1; } } //std::cout << "debug: " << G_STRFUNC << ": Returning " << result << std::endl; return result; } bool rename_table(const Glib::ustring& table_name, const Glib::ustring& new_table_name) { //TODO: Escape the table names: return query_execute_string( "ALTER TABLE " + escape_sql_id(table_name) + " RENAME TO " + escape_sql_id(new_table_name)); } bool drop_table(const Glib::ustring& table_name) { //TODO: Escape the table names: return DbUtils::query_execute_string( "DROP TABLE " + escape_sql_id(table_name)); } Glib::ustring escape_sql_id(const Glib::ustring& id) { if(id.empty()) { std::cerr << G_STRFUNC << ": id is empty." << std::endl; return id; } Glib::RefPtr gda_connection = get_connection(); if(!gda_connection) { std::cerr << G_STRFUNC << ": No gda_connection." << std::endl; return id; } //Always put it in quotes even if return gda_connection->quote_sql_identifier(id); } Glib::ustring gda_cnc_string_encode(const Glib::ustring& str) { char* pch = gda_rfc1738_encode(str.c_str()); if(!pch) return Glib::ustring(); else return Glib::ustring(pch); } Glib::ustring build_query_create_group(const Glib::ustring& group, bool superuser) { if(group.empty()) { std::cerr << G_STRFUNC << ": group is empty" << std::endl; } Glib::ustring query = "CREATE GROUP " + escape_sql_id(group); //The "SUPERUSER" here has no effect because SUPERUSER is not "inherited" to member users. //But let's keep it to make the purpose of this group obvious. if(superuser) query += " WITH SUPERUSER"; return query; } Glib::ustring build_query_add_user_to_group(const Glib::ustring& group, const Glib::ustring& user) { if(group.empty()) { std::cerr << G_STRFUNC << ": group is empty" << std::endl; } if(user.empty()) { std::cerr << G_STRFUNC << ": user is empty" << std::endl; } return "ALTER GROUP " + escape_sql_id(group) + " ADD USER " + escape_sql_id(user); } static Glib::ustring build_query_add_user(const Glib::ustring& user, const Glib::ustring& password, bool superuser) { if(user.empty()) { std::cerr << G_STRFUNC << ": user is empty" << std::endl; } if(password.empty()) { std::cerr << G_STRFUNC << ": password is empty" << std::endl; } //Note that ' around the user fails, so we use ". Glib::ustring strQuery = "CREATE USER " + DbUtils::escape_sql_id(user) + " PASSWORD '" + password + "'" ; //TODO: Escape the password. if(superuser) strQuery += " SUPERUSER CREATEDB CREATEROLE"; //Because SUPERUSER is not "inherited" from groups to members. return strQuery; } bool add_user(const Document* document, const Glib::ustring& user, const Glib::ustring& password, const Glib::ustring& group) { if(!document) { std::cerr << G_STRFUNC << ": document is null." << std::endl; return false; } if(user.empty()) { std::cerr << G_STRFUNC << ": user is empty." << std::endl; return false; } if(password.empty()) { std::cerr << G_STRFUNC << ": password is empty." << std::endl; return false; } if(group.empty()) { std::cerr << G_STRFUNC << ": group is empty." << std::endl; return false; } //Create the user: const bool superuser = (group == GLOM_STANDARD_GROUP_NAME_DEVELOPER); const Glib::ustring query_add = build_query_add_user(user, password, superuser); bool test = DbUtils::query_execute_string(query_add); if(!test) { std::cerr << G_STRFUNC << ": CREATE USER failed." << std::endl; return false; } //Add it to the group: const Glib::ustring query_add_to_group = build_query_add_user_to_group(group, user); test = DbUtils::query_execute_string(query_add_to_group); if(!test) { std::cerr << G_STRFUNC << ": ALTER GROUP failed." << std::endl; return false; } //Remove any user rights, so that all rights come from the user's presence in the group: Document::type_listTableInfo table_list = document->get_tables(); for(Document::type_listTableInfo::const_iterator iter = table_list.begin(); iter != table_list.end(); ++iter) { const Glib::ustring table_name = (*iter)->get_name(); const Glib::ustring strQuery = "REVOKE ALL PRIVILEGES ON " + DbUtils::escape_sql_id(table_name) + " FROM " + DbUtils::escape_sql_id(user); const bool test = DbUtils::query_execute_string(strQuery); if(!test) std::cerr << G_STRFUNC << ": REVOKE failed." << std::endl; } return true; } bool add_group(const Document* document, const Glib::ustring& group, bool superuser) { if(!document) { std::cerr << G_STRFUNC << ": document is null." << std::endl; return false; } if(group.empty()) { std::cerr << G_STRFUNC << ": group is empty." << std::endl; return false; } const Glib::ustring strQuery = DbUtils::build_query_create_group(group, superuser); //std::cout << "DEBUGCREATE: " << strQuery << std::endl; const bool test = DbUtils::query_execute_string(strQuery); if(!test) { std::cerr << G_STRFUNC << ": CREATE GROUP failed." << std::endl; return false; } //Give the new group some sensible default privileges: Privileges priv; priv.m_view = true; priv.m_edit = true; const type_vec_strings table_list = get_table_names_from_database(true /* plus system prefs */); for(type_vec_strings::const_iterator iter = table_list.begin(); iter != table_list.end(); ++iter) { if(!Privs::set_table_privileges(group, *iter, priv)) { std::cerr << G_STRFUNC << "Privs::set_table_privileges() failed." << std::endl; return false; } } //Let them edit the autoincrements too: if(!Privs::set_table_privileges(group, GLOM_STANDARD_TABLE_AUTOINCREMENTS_TABLE_NAME, priv)) { std::cerr << G_STRFUNC << "Privs::set_table_privileges() failed." << std::endl; return false; } return true; } bool remove_user(const Glib::ustring& user) { if(user.empty()) return false; const Glib::ustring strQuery = "DROP USER " + DbUtils::escape_sql_id(user); const bool test = DbUtils::query_execute_string(strQuery); if(!test) { std::cerr << G_STRFUNC << ": DROP USER failed" << std::endl; return false; } return true; } bool remove_user_from_group(const Glib::ustring& user, const Glib::ustring& group) { if(user.empty() || group.empty()) return false; const Glib::ustring strQuery = "ALTER GROUP " + DbUtils::escape_sql_id(group) + " DROP USER " + DbUtils::escape_sql_id(user); const bool test = DbUtils::query_execute_string(strQuery); if(!test) { std::cerr << G_STRFUNC << ": ALTER GROUP failed." << std::endl; return false; } return true; } void set_fake_connection() { //Allow a fake connection, so sqlbuilder_get_full_query() can work: Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); Glom::ConnectionPoolBackends::Backend* backend = new Glom::ConnectionPoolBackends::PostgresCentralHosted(); connection_pool->set_backend(std::auto_ptr(backend)); connection_pool->set_fake_connection(); } Gnome::Gda::Value get_lookup_value(Document* document, const Glib::ustring& /* table_name */, const sharedptr& relationship, const sharedptr& source_field, const Gnome::Gda::Value& key_value) { Gnome::Gda::Value result; sharedptr to_key_field = get_fields_for_table_one_field(document, relationship->get_to_table(), relationship->get_to_field()); if(to_key_field) { //Convert the value, in case the from and to fields have different types: const Gnome::Gda::Value value_to_key_field = Conversions::convert_value(key_value, to_key_field->get_glom_type()); const Glib::ustring target_table = relationship->get_to_table(); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field(source_field->get_name(), target_table ); builder->select_add_target(target_table ); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(to_key_field->get_name(), target_table), builder->add_expr(value_to_key_field))); Glib::RefPtr data_model = query_execute_select(builder); if(data_model && data_model->get_n_rows()) { //There should be only 1 row. Well, there could be more but we will ignore them. result = data_model->get_value_at(0, 0); } else { handle_error(); } } return result; } } //namespace DbUtils } //namespace Glom glom-1.22.4/glom/libglom/example_document_load.cc0000644000175000017500000001250312234252646023215 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2009 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ // Compile this like so: // g++ test_document.cc `pkg-config glom-1.0 --libs --cflags` #include #include #include #include void print_layout_group(const Glom::sharedptr& layout_group, const Glib::ustring& indent) { if(!layout_group) return; //Look at each child item: const Glom::LayoutGroup::type_list_items items = layout_group->get_items(); for(Glom::LayoutGroup::type_list_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { Glom::sharedptr layout_item = *iter; if(!layout_item) continue; std::cout << indent << "Layout Item: title=" << layout_item->get_title_or_name(Glib::ustring() /* locale */) << ", item type=" << layout_item->get_part_type_name(); const Glib::ustring display_name = layout_item->get_layout_display_name(); if(!display_name.empty()) std::cout << " (" << layout_item->get_layout_display_name() << ")"; std::cout << std::endl; //Recurse into child groups: Glom::sharedptr group = Glom::sharedptr::cast_dynamic(layout_item); if(group) { print_layout_group(group, indent + " "); } } } void print_layout(const Glom::Document::type_list_layout_groups& layout_groups) { for(Glom::Document::type_list_layout_groups::const_iterator iter = layout_groups.begin(); iter != layout_groups.end(); ++iter) { Glom::sharedptr layout_group = *iter; if(!layout_group) continue; std::cout << " Layout Group: title=" << layout_group->get_title_or_name(Glib::ustring() /* locale */) << std::endl; print_layout_group(layout_group, " "); } } int main() { Glom::libglom_init(); // Get a URI for a test file: Glib::ustring uri; try { uri = Glib::filename_to_uri("/usr/share/glom/doc/examples/example_music_collection.glom"); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": " << ex.what(); return 1; } std::cout << "URI=" << uri << std::endl; // Load the document: Glom::Document document; document.set_file_uri(uri); int failure_code = 0; const bool test = document.load(failure_code); std::cout << "Document load result=" << test << std::endl; if(!test) return 1; std::cout << "Database Title: " << document.get_database_title_original() << std::endl; std::cout << "Default Table: " << document.get_default_table() << std::endl; // Look at each table: typedef std::vector type_vecstrings; const type_vecstrings table_names = document.get_table_names(); for(type_vecstrings::const_iterator iter = table_names.begin(); iter != table_names.end(); ++iter) { const Glib::ustring table_name = *iter; std::cout << "Table: " << table_name << std::endl; // List the fields for this table: Glom::Document::type_vec_fields fields = document.get_table_fields(table_name); for(Glom::Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { const Glom::sharedptr field = *iter; if(!field) continue; const Glom::Field::glom_field_type field_type = field->get_glom_type(); std::cout << " Field: name=" << field->get_name() << ", title=" << field->get_title_or_name(Glib::ustring() /* locale */) << ", type=" << Glom::Field::get_type_name_ui(field_type) << std::endl; } // List the relationships for this table: Glom::Document::type_vec_relationships relationships = document.get_relationships(table_name); for(Glom::Document::type_vec_relationships::const_iterator iter = relationships.begin(); iter != relationships.end(); ++iter) { const Glom::sharedptr relationship = *iter; if(!relationship) continue; std::cout << " Relationship: from field=" << relationship->get_from_field() << ", to table=" << relationship->get_to_table() << ", to field=" << relationship->get_to_field() << std::endl; } //Show the layouts for this table: const Glom::Document::type_list_layout_groups layout_list = document.get_data_layout_groups("list", table_name); std::cout << " Layout: List:" << std::endl; print_layout(layout_list); const Glom::Document::type_list_layout_groups layout_details = document.get_data_layout_groups("details", table_name); std::cout << " Layout: Details:" << std::endl; print_layout(layout_details); } Glom::libglom_deinit(); return 0; } glom-1.22.4/glom/libglom/gst-package.h0000644000175000017500000000252112234252646020714 0ustar00murraycmurrayc00000000000000/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */ /* * Copyright (C) 2004 Vincent Untz * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Authors: Carlos Garnacho Parro * Authors: Vincent Untz * Authors: Guillaume Desmottes */ /* Commented-out because this is only useful when * using the example code while patching ConnectionPool::install_postgres(). */ #if 0 #ifndef __GST_PACKAGES_H__ #define __GST_PACKAGES_H__ #include G_BEGIN_DECLS gboolean gst_packages_install (GtkWindow *window, const char **packages); G_END_DECLS #endif /* __GST_PACKAGES_H__ */ #endif /* if 0 */ glom-1.22.4/glom/libglom/test_sharedptr_layoutitem.cc0000644000175000017500000000674112234252646024203 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include int main() { Glom::sharedptr field_copy; { Glom::sharedptr group; { Glom::sharedptr group_inscope = Glom::sharedptr::create(); std::cout << "group_inscope refcount = " << *(group_inscope._get_refcount()) << std::endl; //Should be 1. group_inscope->set_name("grouptestname"); Glom::sharedptr itemgroup = group_inscope; std::cout << "itemgroup refcount = " << *(itemgroup._get_refcount()) << std::endl; //Should be 2. Glom::sharedptr group_casted = Glom::sharedptr::cast_dynamic(itemgroup); std::cout << "itemgroup refcount = " << *(itemgroup._get_refcount()) << std::endl; //Should be 3. std::cout << "group_casted refcount = " << *(group_casted._get_refcount()) << std::endl; //Should be 3 group = group_casted; std::cout << "group refcount = " << *(group._get_refcount()) << std::endl; //Should be 4. Glom::sharedptr field_inscope = Glom::sharedptr::create(); std::cout << "field_inscope refcount = " << *(field_inscope._get_refcount()) << std::endl; //Should be 1. group->add_item(field_inscope); std::cout << "field_inscope refcount = " << *(field_inscope._get_refcount()) << std::endl; //Should be 2. field_inscope->set_name("fieldname"); } std::cout << "group refcount = " << *(group._get_refcount()) << std::endl; //should be 1. std::cout << "groupname=" << group->get_name() << std::endl; group = Glom::glom_sharedptr_clone(group); //Test cloning. Glom::LayoutGroup::type_list_items items = group->get_items(); for(Glom::LayoutGroup::type_list_items::iterator iter = items.begin(); iter != items.end(); ++iter) { Glom::sharedptr item = *iter; std::cout << "group item refcount = " << *(item._get_refcount()) << std::endl; //Should be 3 (1 in the group, 1 in the map from get_items(), 1 for item). Glom::sharedptr item_casted = Glom::sharedptr::cast_dynamic(item); std::cout << "group item_casted refcount = " << *(item_casted._get_refcount()) << std::endl; //Should be 4. std::cout << "group item_casted name = " << item_casted->get_name() << std::endl; field_copy = item_casted; } } std::cout << "field_copy refcount=" << *(field_copy._get_refcount()) << std::endl; //should be 1. std::cout << "field_copy name = " << field_copy->get_name() << std::endl; return 0; } glom-1.22.4/glom/libglom/xml_utils.cc0000644000175000017500000002172012234776363020715 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include // for numeric_limits namespace Glom { namespace XmlUtils { Glib::ustring get_node_attribute_value(const xmlpp::Element* node, const Glib::ustring& strAttributeName) { if(node) { const xmlpp::Attribute* attribute = node->get_attribute(strAttributeName); if(attribute) { Glib::ustring value = attribute->get_value(); //Success. return value; } } return ""; //Failed. } void set_node_attribute_value(xmlpp::Element* node, const Glib::ustring& strAttributeName, const Glib::ustring& strValue) { if(node) { xmlpp::Attribute* attribute = node->get_attribute(strAttributeName); if(attribute) attribute->set_value(strValue); else { if(!strValue.empty()) //Don't add an attribute if the value is empty, to keep the document smaller. node->set_attribute(strAttributeName, strValue); } } } xmlpp::Element* get_node_child_named(const xmlpp::Element* node, const Glib::ustring& strName) { xmlpp::Element* nodeResult = 0; if(node) { xmlpp::Node::NodeList list = node->get_children(strName); //We check all of them, instead of just the first, until we find one, //because get_children() returns, for instance, TextNodes (which are not Elements) for "text", //as well as Elements with the name "text". for(xmlpp::Node::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter) { nodeResult = dynamic_cast(*iter); if(nodeResult) return nodeResult; } } return nodeResult; } xmlpp::Element* get_node_child_named_with_add(xmlpp::Element* node, const Glib::ustring& strName) { xmlpp::Element* nodeResult = get_node_child_named(node, strName); if(!nodeResult) nodeResult = node->add_child(strName); return nodeResult; } bool get_node_attribute_value_as_bool(const xmlpp::Element* node, const Glib::ustring& strAttributeName, bool value_default) { bool result = value_default; const Glib::ustring value_string = get_node_attribute_value(node, strAttributeName); //Get number for string: if(!value_string.empty()) { result = (value_string == "true"); } return result; } void set_node_attribute_value_as_bool(xmlpp::Element* node, const Glib::ustring& strAttributeName, bool value, bool value_default) { if((value == value_default) && !node->get_attribute(strAttributeName)) return; //Use the non-existance of an attribute to mean zero, to save space. Glib::ustring strValue = (value ? "true" : "false"); set_node_attribute_value(node, strAttributeName, strValue); } void set_node_attribute_value_as_decimal(xmlpp::Element* node, const Glib::ustring& strAttributeName, guint value, guint value_default) { if((value == value_default) && !node->get_attribute(strAttributeName)) return; //Use the non-existance of an attribute to mean zero, to save space. //Get text representation of int: std::stringstream thestream; thestream.imbue( std::locale::classic() ); //The C locale. thestream << value; const Glib::ustring value_string = thestream.str(); set_node_attribute_value(node, strAttributeName, value_string); } void set_node_attribute_value_as_decimal_double(xmlpp::Element* node, const Glib::ustring& strAttributeName, double value) { if(!value && !node->get_attribute(strAttributeName)) return; //Use the non-existance of an attribute to mean zero, to save space. //Get text representation of int: std::stringstream thestream; thestream.imbue( std::locale::classic() ); //The C locale. thestream << value; const Glib::ustring value_string = thestream.str(); set_node_attribute_value(node, strAttributeName, value_string); } guint get_node_attribute_value_as_decimal(const xmlpp::Element* node, const Glib::ustring& strAttributeName, guint value_default) { guint result = value_default; const Glib::ustring value_string = get_node_attribute_value(node, strAttributeName); //Get number for string: if(!value_string.empty()) { std::stringstream thestream; thestream.imbue( std::locale::classic() ); //The C locale. thestream.str(value_string); thestream >> result; } return result; } double get_node_attribute_value_as_decimal_double(const xmlpp::Element* node, const Glib::ustring& strAttributeName) { double result = 0; const Glib::ustring value_string = get_node_attribute_value(node, strAttributeName); //Get number for string: if(!value_string.empty()) { std::stringstream thestream; thestream.imbue( std::locale::classic() ); //The C locale. thestream.str(value_string); thestream >> result; } return result; } void set_node_attribute_value_as_float(xmlpp::Element* node, const Glib::ustring& strAttributeName, float value) { if(value == std::numeric_limits::infinity() && !node->get_attribute(strAttributeName)) return; //Use the non-existance of an attribute to mean "invalid"/infinity, to save space. //Get text representation of float: std::stringstream thestream; thestream.imbue( std::locale::classic() ); //The C locale. thestream << value; const Glib::ustring value_string = thestream.str(); set_node_attribute_value(node, strAttributeName, value_string); } float get_node_attribute_value_as_float(const xmlpp::Element* node, const Glib::ustring& strAttributeName) { float result = std::numeric_limits::infinity(); const Glib::ustring value_string = get_node_attribute_value(node, strAttributeName); //Get number for string: if(!value_string.empty()) { std::stringstream thestream; thestream.imbue( std::locale::classic() ); //The C locale. thestream.str(value_string); thestream >> result; } return result; } void set_node_attribute_value_as_value(xmlpp::Element* node, const Glib::ustring& strAttributeName, const Gnome::Gda::Value& value, Field::glom_field_type field_type) { NumericFormat format_ignored; //Because we use ISO format. const Glib::ustring value_as_text = Field::to_file_format(value, field_type); set_node_attribute_value(node, strAttributeName, value_as_text); } void set_node_text_child_as_value(xmlpp::Element* node, const Gnome::Gda::Value& value, Field::glom_field_type field_type) { if(!node) return; const Glib::ustring value_as_text = Field::to_file_format(value, field_type); node->set_child_text( Utils::string_clean_for_xml(value_as_text) ); } Gnome::Gda::Value get_node_attribute_value_as_value(const xmlpp::Element* node, const Glib::ustring& strAttributeName, Field::glom_field_type field_type) { const Glib::ustring value_string = get_node_attribute_value(node, strAttributeName); bool success = false; const Gnome::Gda::Value result = Field::from_file_format(value_string, field_type, success); if(success) return result; else return Gnome::Gda::Value(); } Gnome::Gda::Value get_node_text_child_as_value(const xmlpp::Element* node, Field::glom_field_type field_type) { const xmlpp::TextNode* text_child = node->get_child_text(); if(!text_child) return Gnome::Gda::Value(); const Glib::ustring value_string = text_child->get_content(); bool success = false; const Gnome::Gda::Value result = Field::from_file_format(value_string, field_type, success); if(success) return result; else return Gnome::Gda::Value(); } Glib::ustring get_child_text_node(const xmlpp::Element* node, const Glib::ustring& child_node_name) { const xmlpp::Element* child = get_node_child_named(node, child_node_name); if(child) { const xmlpp::TextNode* text_child = child->get_child_text(); if(text_child) return text_child->get_content(); } return Glib::ustring(); } void set_child_text_node(xmlpp::Element* node, const Glib::ustring& child_node_name, const Glib::ustring& text) { xmlpp::Element* child = get_node_child_named(node, child_node_name); if(!child) { if(text.empty()) return; //Keep the document smaller by avoiding empty nodes. child = node->add_child(child_node_name); } const Glib::ustring text_used = Utils::string_clean_for_xml(text); xmlpp::TextNode* text_child = child->get_child_text(); if(!text_child) child->add_child_text(text_used); else text_child->set_content(text_used); } } //namespace XmlUtils } //namespace Glom glom-1.22.4/glom/libglom/spawn_with_feedback.cc0000644000175000017500000004775012234776363022677 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include //For auto_ptr. #include #include #ifdef G_OS_WIN32 # include #endif // Uncomment to see debug messages //#define GLOM_SPAWN_DEBUG namespace Glom { namespace Spawn { class CommandLineThreadData { public: std::string m_command; Glib::Threads::Cond* m_cond; Glib::Threads::Mutex* m_mutex; bool* m_result; }; static void on_spawn_info_finished(const Glib::RefPtr& mainloop) { //Allow our mainloop.run() to return: if(mainloop) mainloop->quit(); } // This is a simple-process launching API wrapping g_spawn_async on linux and // CreateProcess() on Windows. We need to use CreateProcess() on Windows to be // able to suppress the console window. // TODO: File a bug about the console window on Windows. namespace Impl { static const unsigned int REDIRECT_STDOUT = 1; static const unsigned int REDIRECT_STDERR = 2; class SpawnError: public std::runtime_error { public: explicit SpawnError(const std::string& error_message) : std::runtime_error(error_message) {} }; class SpawnInfo: public sigc::trackable { private: // Private platform-dependant helper functions #ifdef G_OS_WIN32 static std::string win32_error_message() { gchar* message = g_win32_error_message(GetLastError()); std::string msg = message; g_free(message); return msg; } // We redirect stdout and stderr output into a file, and read that file later. // I would prefer to read child stderr directly, without using a temporary // file, but that is probably not so easy since Glib::IOChannel does not // support Windows file HANDLEs, but we need to pass a HANDLE to // CreateProcess() for redirection. static HANDLE create_redirect_file(std::string& filename) { static unsigned int redirect_seq = 0; const gchar* appdata = getenv("APPDATA"); filename = Glib::ustring::compose("%1\\glom_spawn_redirect_%2.txt", std::string(appdata), ++ redirect_seq); // Allow the redirect file to be inherited by the child process, so // it can write to it. SECURITY_ATTRIBUTES security_attr; security_attr.nLength = sizeof(security_attr); security_attr.lpSecurityDescriptor = 0; security_attr.bInheritHandle = true; HANDLE result = CreateFile(filename.c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, &security_attr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if(!result) throw SpawnError(win32_error_message()); return result; } #else // G_OS_WIN32 bool on_io(Glib::IOCondition cond, Glib::RefPtr channel, std::string& result) { if(cond != Glib::IO_IN) { // Perhaps the pipe was closed or something. Ignore & Disconnect. If the // this was because the child exited, then the on_child_watch() callback // will be called anyway. return false; } else { char buffer[1024 + 1]; gsize bytes_read; Glib::IOStatus status = Glib::IO_STATUS_NORMAL; try { status = channel->read(buffer, 1024, bytes_read); } catch(const Glib::Exception& ex) { std::cerr << "Glom::Spawn::Impl::SpawnInfo::on_io: Error while reading from pipe: " << ex.what() << std::endl; return false; } buffer[bytes_read] = '\0'; result += buffer; return status == Glib::IO_STATUS_NORMAL || status == Glib::IO_STATUS_AGAIN; } } void redirect_to_string(int fd, std::string& string) { Glib::RefPtr channel = Glib::IOChannel::create_from_fd(fd); channel->set_flags(Glib::IO_FLAG_NONBLOCK); channel->set_encoding(""); channel->set_buffered(false); Glib::signal_io().connect(sigc::bind(sigc::mem_fun(*this, &SpawnInfo::on_io), channel, sigc::ref(string)), channel, Glib::IO_IN); } #endif // !G_OS_WIN32 public: typedef sigc::signal SignalFinished; /** TODO: Document the redirect parameter. */ SpawnInfo(const Glib::ustring& command_line, int redirect): running(false), return_status(0) { #ifdef G_OS_WIN32 startup_info.cb = sizeof(startup_info); startup_info.dwFlags = STARTF_USESTDHANDLES; startup_info.lpReserved = 0; startup_info.lpDesktop = 0; startup_info.lpTitle = 0; startup_info.cbReserved2 = 0; startup_info.lpReserved2 = 0; startup_info.hStdInput = INVALID_HANDLE_VALUE; if(redirect & REDIRECT_STDOUT) startup_info.hStdOutput = create_redirect_file(stdout_file); else startup_info.hStdOutput = INVALID_HANDLE_VALUE; if(redirect & REDIRECT_STDERR) startup_info.hStdError = create_redirect_file(stderr_file); else startup_info.hStdError = INVALID_HANDLE_VALUE; // CreateProcess needs a non-const string, so we copy command_line to provide one. std::vector command(command_line.length() + 1); std::copy(command_line.data(), command_line.data() + command_line.length(), command.begin()); command[command_line.length()] = '\0'; if(!CreateProcess(0, &command[0], 0, 0, true, CREATE_NO_WINDOW, 0, 0, &startup_info, &process_info)) { throw SpawnError(win32_error_message()); } #else // G_OS_WIN32 try { std::vector arguments = Glib::shell_parse_argv(command_line); int child_stdout; int child_stderr; Glib::spawn_async_with_pipes(Glib::get_current_dir(), arguments, Glib::SPAWN_DO_NOT_REAP_CHILD, sigc::slot(), &pid, 0, redirect & REDIRECT_STDOUT ? &child_stdout : 0, redirect & REDIRECT_STDERR ? &child_stderr : 0); if(redirect & REDIRECT_STDOUT) redirect_to_string(child_stdout, stdout_text); if(redirect & REDIRECT_STDERR) redirect_to_string(child_stderr, stderr_text); } catch(const Glib::Exception& ex) { throw SpawnError(ex.what()); } #endif // !G_OS_WIN32 Glib::signal_child_watch().connect(sigc::mem_fun(*this, &SpawnInfo::on_child_watch), get_pid()); } ~SpawnInfo() { #ifdef G_OS_WIN32 // TODO: Is it allowed to close the process handle while the process is still running? CloseHandle(process_info.hProcess); CloseHandle(process_info.hThread); if(!stdout_file.empty()) { CloseHandle(startup_info.hStdOutput); DeleteFile(stdout_file.c_str()); } if(!stderr_file.empty()) { CloseHandle(startup_info.hStdError); DeleteFile(stderr_file.c_str()); } #else // TODO: What happens with the process if the child exits, but the mainloop // is not run anymore (and therefore our callback is not called) before // Glom exits itself? Is the child properly closed, or does it remain as // a zombie? if(running) Glib::signal_child_watch().connect(sigc::hide<1>(sigc::ptr_fun(Glib::spawn_close_pid)), pid); #endif } Glib::Pid get_pid() { #ifdef G_OS_WIN32 return process_info.hProcess; #else return pid; #endif } bool is_running() const { return running; } int get_return_status() const { g_assert(!running); return return_status; } void get_stdout(std::string& out) const { #ifdef G_OS_WIN32 out = Glib::file_get_contents(stdout_file); #else out = stdout_text; #endif } void get_stderr(std::string& err) const { #ifdef G_OS_WIN32 err = Glib::file_get_contents(stderr_file); #else err = stderr_text; #endif } SignalFinished signal_finished() const { return m_signal_finished; } private: void on_child_watch(Glib::Pid /* pid */, int returned) { running = false; return_status = returned; m_signal_finished.emit(); } bool running; int return_status; SignalFinished m_signal_finished; #ifdef G_OS_WIN32 PROCESS_INFORMATION process_info; STARTUPINFO startup_info; std::string stderr_file; std::string stdout_file; #else Glib::Pid pid; std::string stdout_text; std::string stderr_text; #endif }; static std::auto_ptr spawn_async(const Glib::ustring& command_line, int redirect) { return std::auto_ptr(new SpawnInfo(command_line, redirect)); } /** * @param return_status: The return value of the command. * @result Whether we successfully ended the async spawn. */ static bool spawn_async_end(std::auto_ptr info, std::string* stdout_text = 0, std::string* stderr_text = 0, int* return_status = 0) { if(stdout_text) info->get_stdout(*stdout_text); if(stderr_text) info->get_stderr(*stderr_text); if(return_status) *return_status = info->get_return_status(); return !info->is_running(); } static int spawn_sync(const Glib::ustring& command_line, std::string* stdout_text, std::string* stderr_text) { int redirect_flags = 0; if(stdout_text) redirect_flags |= REDIRECT_STDOUT; if(stderr_text) redirect_flags |= REDIRECT_STDERR; Glib::RefPtr mainloop = Glib::MainLoop::create(false); std::auto_ptr info = spawn_async(command_line, redirect_flags); //This could throw info->signal_finished().connect( sigc::bind(sigc::ptr_fun(&on_spawn_info_finished), sigc::ref(mainloop) ) ); // Block until signal_finished is emitted: mainloop->run(); int return_status = 0; const bool returned = spawn_async_end(info, stdout_text, stderr_text, &return_status); g_assert(returned); return return_status; } } // namespace Impl bool execute_command_line_and_wait(const std::string& command, const SlotProgress& slot_progress) { //Show UI progress feedback while we wait for the command to finish: std::auto_ptr info; try { info = Impl::spawn_async(command, 0); } catch(const Impl::SpawnError& ex) { std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; return false; } Glib::RefPtr mainloop = Glib::MainLoop::create(false); info->signal_finished().connect( sigc::bind(sigc::ptr_fun(&on_spawn_info_finished), sigc::ref(mainloop) ) ); // Pulse two times a second: sigc::connection timeout_connection = Glib::signal_timeout().connect( sigc::bind_return( slot_progress, true), 500); slot_progress(); //Make sure it is called at least once. //Block until signal_finished is called. mainloop->run(); //Stop the timeout callback: timeout_connection.disconnect(); int return_status = false; const bool returned = Impl::spawn_async_end(info, 0, 0, &return_status); if(!returned) return false; // User closed the dialog prematurely? return (return_status == EXIT_SUCCESS); } bool execute_command_line_and_wait(const std::string& command, const SlotProgress& slot_progress, std::string& output) { //Initialize output parameter: output = std::string(); //Show UI progress feedback while we wait for the command to finish: std::auto_ptr info; try { info = Impl::spawn_async(command, Impl::REDIRECT_STDOUT | Impl::REDIRECT_STDERR); } catch(const Impl::SpawnError& ex) { std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; return false; } Glib::RefPtr mainloop = Glib::MainLoop::create(false); info->signal_finished().connect( sigc::bind(sigc::ptr_fun(&on_spawn_info_finished), sigc::ref(mainloop) ) ); // Pulse two times a second: sigc::connection timeout_connection = Glib::signal_timeout().connect( sigc::bind_return( slot_progress, true), 500); slot_progress(); //Make sure it is called at least once. //Block until signal_finished is called. mainloop->run(); //Stop the timeout callback: timeout_connection.disconnect(); int return_status = false; std::string stdout_text, stderr_text; const bool returned = Impl::spawn_async_end(info, &stdout_text, &stderr_text, &return_status); if(!returned) return false; // User closed the dialog prematurely? //std::cout << "DEBUG: command=" << command << std::endl; //std::cout << " DEBUG: stdout_text=" << stdout_text << std::endl; //std::cout << " DEBUG: stderr_text=" << stderr_text << std::endl; output = stdout_text; if(!stderr_text.empty()) { std::cerr << G_STRFUNC << ": command produced stderr text: " << std::endl << " command: " << command << std::endl << " error text: " << stderr_text << std::endl; } return (return_status == EXIT_SUCCESS); } // Callback handlers for execute_command_line_and_wait_until_second_command_returns_success namespace { bool second_command_on_timeout(const std::string& second_command, const std::string& success_text, const SlotProgress& slot_progress, const Glib::RefPtr& mainloop) { Glib::ustring stored_env_lang; Glib::ustring stored_env_language; if(!success_text.empty()) { // If we are going to check the text output of the second command, // then we should make sure that we get a fairly canonical version of that text, // so we set the LANG for this command. // We have to set LANGUAGE (a GNU extension) as well as LANG, because it // is probably defined on the system already and that definition would override our LANG: // (Note that we can not just do "LANG=C;the_command", as on the command line, because g_spawn() does not support that.) #ifdef GLOM_SPAWN_DEBUG std::cout << std::endl << "debug: temporarily setting LANG and LANGUAGE environment variables to \"C\"" << std::endl; #endif //GLOM_SPAWN_DEBUG stored_env_lang = Glib::getenv("LANG"); stored_env_language = Glib::getenv("LANGUAGE"); Glib::setenv("LANG", "C", true /* overwrite */); Glib::setenv("LANGUAGE", "C", true /* overwrite */); } #ifdef GLOM_SPAWN_DEBUG std::cout << std::endl << "debug: command_line (second): " << second_command << std::endl << std::endl; #endif //GLOM_SPAWN_DEBUG int return_status = 0; std::string stdout_output; try { return_status = Impl::spawn_sync(second_command, &stdout_output, 0); } catch(const Impl::SpawnError& ex) { // TODO: We should cancel the whole call if this fails three times in std::cerr << G_STRFUNC << ": Exception while calling Glib::spawn_command_line_sync(): " << ex.what() << std::endl; // a row or so. } if(!success_text.empty()) { // Restore the previous environment variable values: #ifdef GLOM_SPAWN_DEBUG std::cout << std::endl << "debug: restoring the LANG and LANGUAGE environment variables." << std::endl; #endif //GLOM_SPAWN_DEBUG Glib::setenv("LANG", stored_env_lang, true /* overwrite */); Glib::setenv("LANGUAGE", stored_env_language, true /* overwrite */); } if(return_status == EXIT_SUCCESS) { bool success = true; //Just check the return code. if(!success_text.empty()) //Check the output too. { #ifdef GLOM_SPAWN_DEBUG std::cout << " debug: output=" << stdout_output << ", waiting for=" << success_text << std::endl; #endif //GLOM_SPAWN_DEBUG if(stdout_output.find(success_text) == std::string::npos) success = false; } if(success) { #ifdef GLOM_SPAWN_DEBUG std::cout << "debug: Success, do response" << std::endl; #endif //GLOM_SPAWN_DEBUG // Exit from run() in execute_command_line_and_wait_until_second_command_returns_success(). mainloop->quit(); // Cancel timeout. Actually, we also could return true here since // the signal is disconnect explicetely after run() anyway. return false; } } else { #ifdef GLOM_SPAWN_DEBUG std::cout << " debug: second command failed. output=" << stdout_output << std::endl; #endif //GLOM_SPAWN_DEBUG } slot_progress(); //Show UI progress feedback. return true; } } //Anonymous namespace /* static bool on_timeout_delay(const Glib::RefPtr& mainloop) { //Allow our mainloop.run() to return: if(mainloop) mainloop->quit(); return false; } */ bool execute_command_line_and_wait_until_second_command_returns_success(const std::string& command, const std::string& second_command, const SlotProgress& slot_progress, const std::string& success_text) { #ifdef GLOM_SPAWN_DEBUG std::cout << "debug: Command: " << command << std::endl; #endif //GLOM_SPAWN_DEBUG std::auto_ptr info; try { info = Impl::spawn_async(command, Impl::REDIRECT_STDERR); } catch(const Impl::SpawnError& ex) { std::cerr << G_STRFUNC << ": exception: " << ex.what() << std::endl; return false; } // While we wait for the second command to finish we // a) check whether the first command finished. If it did, and has a // negative error code, we assume it failed and return directly. // b) Get stderr data, to display an error message in case the command // fails: Glib::RefPtr mainloop = Glib::MainLoop::create(false); sigc::connection watch_conn = info->signal_finished().connect( sigc::bind(sigc::ptr_fun(&on_spawn_info_finished), sigc::ref(mainloop) ) ); // Call the second command once every second sigc::connection timeout_conn = Glib::signal_timeout().connect(sigc::bind(sigc::ptr_fun(&second_command_on_timeout), sigc::ref(second_command), sigc::ref(success_text), slot_progress, sigc::ref(mainloop)), 1000); slot_progress(); //Make sure it is called at least once. // Block until signal_finished is emitted: mainloop->run(); timeout_conn.disconnect(); watch_conn.disconnect(); std::string stderr_text; int return_status = 0; const bool success = Impl::spawn_async_end(info, 0, &stderr_text, &return_status); if(success && (return_status == EXIT_SUCCESS)) { /* Don't sleep here. Instead we just keep trying to connect until it succeeds, * timing out during that if necessary. * * //Sleep for a bit more, because I think that pg_ctl sometimes reports success too early. Glib::RefPtr mainloop = Glib::MainLoop::create(false); sigc::connection connection_timeout = Glib::signal_timeout().connect( sigc::bind(sigc::ptr_fun(&on_timeout_delay), sigc::ref(mainloop)), 8000); mainloop->run(); connection_timeout.disconnect(); */ return true; } else { // The user either cancelled, or the first command failed, or exited prematurely if(true) //response == Gtk::RESPONSE_REJECT) { /* TODO: Allow the caller to show a dialog? // Command failed std::auto_ptr error_dialog; if(parent_window) error_dialog.reset(new Gtk::MessageDialog(*parent_window, "Child command failed", false, Gtk::MESSAGE_ERROR)); else error_dialog.reset(new Gtk::MessageDialog("Child command failed", false, Gtk::MESSAGE_ERROR)); // TODO: i18n error_dialog->set_secondary_text("The command was:\n\n" + Glib::Markup::escape_text(command) + (stderr_text.empty() ? Glib::ustring("") : ("\n\n" + Glib::Markup::escape_text(stderr_text) + "")), true); error_dialog->run(); */ std::cerr << G_STRFUNC << ": Child command failed. The command was: " << command << std::endl << "and the error was: " << stderr_text << std::endl; } else { // User cancelled or closed pulse window // TODO: Terminate/Kill first command? We probably don't need // it any longer. } return false; } } } //Spawn } //Glom glom-1.22.4/glom/libglom/utils.cc0000644000175000017500000014274412234776363020047 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include // for strchr #include //For stringstream #include #include #include // for locale, time_put #include // for struct tm #include // for cout, endl #include #include #include //For close(). This include is needed in mingw on MS Windows. namespace Glom { template class predicate_UsesRelationshipHasRelationships { public: predicate_UsesRelationshipHasRelationships(const Glib::ustring& relationship_name, const Glib::ustring& related_relationship_name = Glib::ustring()) : m_relationship_name(relationship_name), m_related_relationship_name(related_relationship_name) { } predicate_UsesRelationshipHasRelationships(const sharedptr uses_relationship_name, bool first_level_only = false) : m_relationship_name(uses_relationship_name->get_relationship_name()), m_related_relationship_name(uses_relationship_name->get_related_relationship_name()) { //If first_level_only, search for relationships that have the same top-level relationship, but have no related relationship. if(first_level_only) m_related_relationship_name = Glib::ustring(); } virtual ~predicate_UsesRelationshipHasRelationships() { } bool operator() (const T_Element& element) { return (element.get_relationship_name() == m_relationship_name) && (element.get_related_relationship_name() == m_related_relationship_name); } bool operator() (const sharedptr& element) { return (element->get_relationship_name() == m_relationship_name) && (element->get_related_relationship_name() == m_related_relationship_name); } bool operator() (const sharedptr& element) { return (element->get_relationship_name() == m_relationship_name) && (element->get_related_relationship_name() == m_related_relationship_name); } private: Glib::ustring m_relationship_name, m_related_relationship_name; }; Glib::ustring Utils::trim_whitespace(const Glib::ustring& text) { //TODO_Performance: Glib::ustring result = text; //Find non-whitespace from front: Glib::ustring::size_type posFront = Glib::ustring::npos; Glib::ustring::size_type pos = 0; for(Glib::ustring::iterator iter = result.begin(); iter != result.end(); ++iter) { if(!Glib::Unicode::isspace(*iter)) { posFront = pos; break; } ++pos; } //Remove the white space from the front: result = result.substr(posFront); //Find non-whitespace from back: Glib::ustring::size_type posBack = Glib::ustring::npos; pos = 0; for(Glib::ustring::reverse_iterator iter = result.rbegin(); iter != result.rend(); ++iter) { if(!Glib::Unicode::isspace(*iter)) { posBack = pos; break; } ++pos; } //Remove the white space from the front: result = result.substr(0, result.size() - posBack); return result; } Glib::ustring Utils::string_replace(const Glib::ustring& src, const Glib::ustring& search_for, const Glib::ustring& replace_with) { if(search_for.empty()) { std::cerr << G_STRFUNC << ": search_for was empty." << std::endl; return src; } //std::cout << "debug: " << G_STRFUNC << ": src=" << src << ", search_for=" << search_for << ", replace_with=" << replace_with << std::endl; std::string result = src; std::string::size_type pos = 0; const std::string::size_type len_search = search_for.size(); const std::string::size_type len_replace = replace_with.size(); std::string::size_type pos_after_prev = 0; while((pos = result.find(search_for, pos_after_prev)) != std::string::npos) { //std::cout << " debug: pos=" << pos << ", found=" << search_for << ", in string: " << result.substr(pos_after_prev, 20) << std::endl; //std::cout << " debug: before: result =" << result << ", pos_after_prev=pos_after_prev" << std::endl; result.replace(pos, len_search, replace_with); //std::cout << " after: before: result = result" << std::endl; pos_after_prev = pos + len_replace; } return result; /* //TODO_Performance: Glib::ustring result; const size_t src_length = src.size(); const size_t search_for_length = search_for.size(); //const size_t replace_with_length = replace_with.size(); size_t src_index = 0; size_t src_index_section_start = 0; while(src_index < src_length) { const bool found = (src.find(search_for.c_str(), src_index) == src_index); if(found) { result += src.substr(src_index_section_start, src_index - src_index_section_start); result += replace_with; src_index_section_start = src_index + search_for_length; src_index = src_index_section_start; } else ++src_index; } if(src_index_section_start < src_length) { result += src.substr(src_index_section_start); } return result; */ } Glib::ustring Utils::string_clean_for_xml(const Glib::ustring& src) { // The form feed character may not be in XML, even if escaped. // So lets just lose it. // Other unusual characters, such as &, are escaped by libxml later. // TODO_Performance: Find a quicker way to do this. return string_replace(src, "\f", Glib::ustring()); } Glib::RefPtr Utils::build_sql_select_with_where_clause(const Glib::ustring& table_name, const type_vecLayoutFields& fieldsToGet, const Gnome::Gda::SqlExpr& where_clause, const sharedptr& extra_join, const type_sort_clause& sort_clause, guint limit) { //TODO_Performance: type_vecConstLayoutFields constFieldsToGet; for(type_vecLayoutFields::const_iterator iter = fieldsToGet.begin(); iter != fieldsToGet.end(); ++iter) { constFieldsToGet.push_back(*iter); } return build_sql_select_with_where_clause(table_name, constFieldsToGet, where_clause, extra_join, sort_clause, limit); } /** Build a SQL query to discover how many rows a SQL query would return if it was run. * * This uses a COUNT * on a the @a sql_query as a sub-statement. * Be careful not to include ORDER BY clauses in the supplied SQL query, because that would make it unnecessarily slow. * * @sql_query A SQL query. * @result The number of rows. */ Glib::RefPtr Utils::build_sql_select_count_rows(const Glib::RefPtr& sql_query) { Glib::RefPtr result; if(!sql_query) { std::cerr << G_STRFUNC << ": sql_query was null." << std::endl; return result; } result = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); //Note that the alias is just because the SQL syntax requires it - we get an error if we don't use it. //Be careful not to include ORDER BY clauses in this, because that would make it unnecessarily slow: const guint target_id = result->add_sub_select( sql_query->get_sql_statement() ); result->select_add_target_id(target_id, "glomarbitraryalias"); const Gnome::Gda::SqlBuilder::Id id_function = result->add_function("COUNT", result->add_id("*")); result->add_field_value_id(id_function); return result; } typedef std::list< sharedptr > type_list_relationships; static void add_to_relationships_list(type_list_relationships& list_relationships, const sharedptr& layout_item) { g_return_if_fail(layout_item); if(!(layout_item->get_has_relationship_name())) return; //If this is a related relationship, add the first-level relationship too, so that the related relationship can be defined in terms of it: type_list_relationships::const_iterator iterFind = std::find_if(list_relationships.begin(), list_relationships.end(), predicate_UsesRelationshipHasRelationships(layout_item, true /* top_level_only */) ); if(iterFind == list_relationships.end()) //If the table is not yet in the list: { sharedptr uses_rel = sharedptr::create(); uses_rel->set_relationship(layout_item->get_relationship()); list_relationships.push_front(uses_rel); //These need to be at the front, so that related relationships can use them later in the SQL statement. } //Add the relationship to the list: iterFind = std::find_if(list_relationships.begin(), list_relationships.end(), predicate_UsesRelationshipHasRelationships(layout_item) ); if(iterFind == list_relationships.end()) //If the table is not yet in the list: { sharedptr uses_rel = sharedptr::create(); uses_rel->set_relationship(layout_item->get_relationship()); uses_rel->set_related_relationship(layout_item->get_related_relationship()); list_relationships.push_back(uses_rel); } } static void builder_add_join(const Glib::RefPtr& builder, const sharedptr& uses_relationship) { sharedptr relationship = uses_relationship->get_relationship(); if(!relationship->get_has_fields()) //TODO: Handle related_record has_fields. { if(relationship->get_has_to_table()) { //It is a relationship that only specifies the table, without specifying linking fields: builder->select_add_target(relationship->get_to_table()); } return; } // Define the alias name as returned by get_sql_join_alias_name(): // Specify an alias, to avoid ambiguity when using 2 relationships to the same table. const Glib::ustring alias_name = uses_relationship->get_sql_join_alias_name(); // Add the JOIN: if(!uses_relationship->get_has_related_relationship_name()) { const guint to_target_id = builder->select_add_target(relationship->get_to_table(), alias_name); builder->select_join_targets( builder->select_add_target(relationship->get_from_table()), to_target_id, Gnome::Gda::SQL_SELECT_JOIN_LEFT, builder->add_cond( Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(relationship->get_from_field(), relationship->get_from_table()), builder->add_field_id(relationship->get_to_field(), alias_name))); } else { UsesRelationship parent_relationship; parent_relationship.set_relationship(relationship); sharedptr related_relationship = uses_relationship->get_related_relationship(); const guint to_target_id = builder->select_add_target(related_relationship->get_to_table(), alias_name); builder->select_join_targets( builder->select_add_target(relationship->get_from_table()), //TODO: Must we use the ID from select_add_target_id()? to_target_id, Gnome::Gda::SQL_SELECT_JOIN_LEFT, builder->add_cond( Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(related_relationship->get_from_field(), parent_relationship.get_sql_join_alias_name()), builder->add_field_id(related_relationship->get_to_field(), alias_name) ) ); } } void Utils::build_sql_select_add_fields_to_get(const Glib::RefPtr& builder, const Glib::ustring& table_name, const type_vecConstLayoutFields& fieldsToGet, const type_sort_clause& sort_clause, bool extra_join) { //Get all relationships used in the query: typedef std::list< sharedptr > type_list_relationships; type_list_relationships list_relationships; for(type_vecConstLayoutFields::const_iterator iter = fieldsToGet.begin(); iter != fieldsToGet.end(); ++iter) { sharedptr layout_item = *iter; add_to_relationships_list(list_relationships, layout_item); } for(type_sort_clause::const_iterator iter = sort_clause.begin(); iter != sort_clause.end(); ++iter) { sharedptr layout_item = iter->first; add_to_relationships_list(list_relationships, layout_item); } //LEFT OUTER JOIN will get the field values from the other tables, //and give us our fields for this table even if there is no corresponding value in the other table. for(type_list_relationships::const_iterator iter = list_relationships.begin(); iter != list_relationships.end(); ++iter) { sharedptr uses_relationship = *iter; builder_add_join(builder, uses_relationship); } bool one_added = false; for(type_vecConstLayoutFields::const_iterator iter = fieldsToGet.begin(); iter != fieldsToGet.end(); ++iter) { Glib::ustring one_sql_part; sharedptr layout_item = *iter; if(!layout_item) { g_warn_if_reached(); continue; } //Get the parent, such as the table name, or the alias name for the join: const Glib::ustring parent = layout_item->get_sql_table_or_join_alias_name(table_name); const LayoutItem_FieldSummary* fieldsummary = dynamic_cast(layout_item.obj()); if(fieldsummary) { const Gnome::Gda::SqlBuilder::Id id_function = builder->add_function( fieldsummary->get_summary_type_sql(), builder->add_field_id(layout_item->get_name(), table_name)); builder->add_field_value_id(id_function); } else { const Glib::ustring field_name = layout_item->get_name(); if(!field_name.empty()) { const Gnome::Gda::SqlBuilder::Id id = builder->select_add_field(field_name, parent); //Avoid duplicate records with doubly-related fields: if(extra_join) builder->select_group_by(id); } } one_added = true; } if(!one_added) { std::cerr << G_STRFUNC << ": No fields added: fieldsToGet.size()=" << fieldsToGet.size() << std::endl; return; } } Glib::RefPtr Utils::build_sql_select_with_where_clause(const Glib::ustring& table_name, const type_vecConstLayoutFields& fieldsToGet, const Gnome::Gda::SqlExpr& where_clause, const sharedptr& extra_join, const type_sort_clause& sort_clause, guint limit) { Glib::RefPtr builder; //Build the whole SQL statement: try { builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_target(table_name); //Add the fields to SELECT, plus the tables that they are selected FROM. //We tell it whether extra_join is empty, so it can do an extra GROUP BY if necessary. //TODO: Try to use DISTINCT instead, with a proper test case. Utils::build_sql_select_add_fields_to_get(builder, table_name, fieldsToGet, sort_clause, extra_join /* bool */); if(extra_join) { sharedptr uses_relationship = sharedptr::create(); uses_relationship->set_relationship(extra_join); builder_add_join(builder, uses_relationship); } //Add the WHERE clause: if(!where_clause.empty()) { const int id = builder->import_expression(where_clause); builder->set_where(id); } //Sort clause: if(!sort_clause.empty()) { for(type_sort_clause::const_iterator iter = sort_clause.begin(); iter != sort_clause.end(); ++iter) { sharedptr layout_item = iter->first; if(layout_item) { const bool ascending = iter->second; //TODO: Avoid the need for the "." builder->select_order_by( builder->add_field_id(layout_item->get_name(), layout_item->get_sql_table_or_join_alias_name(table_name)), ascending); } } } //LIMIT clause: if(limit > 0) { builder->select_set_limit(limit); } } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Exception: " << ex.what() << std::endl; } return builder; } Glib::RefPtr Utils::build_sql_select_with_key(const Glib::ustring& table_name, const type_vecLayoutFields& fieldsToGet, const sharedptr& key_field, const Gnome::Gda::Value& key_value, const type_sort_clause& sort_clause, guint limit) { //TODO_Performance: type_vecConstLayoutFields constFieldsToGet; for(type_vecLayoutFields::const_iterator iter = fieldsToGet.begin(); iter != fieldsToGet.end(); ++iter) { constFieldsToGet.push_back(*iter); } return build_sql_select_with_key(table_name, constFieldsToGet, key_field, key_value, sort_clause, limit); } Gnome::Gda::SqlExpr Utils::build_simple_where_expression(const Glib::ustring& table_name, const sharedptr& key_field, const Gnome::Gda::Value& key_value) { if(!key_field) { std::cerr << G_STRFUNC << ": key_field was empty" << std::endl; return Gnome::Gda::SqlExpr(); } Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_target(table_name); //This might not be necessary. const Gnome::Gda::SqlBuilder::Id id = builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(key_field->get_name(), table_name), builder->add_expr(key_value)); builder->set_where(id); //This might not be necessary. return builder->export_expression(id); } Gnome::Gda::SqlExpr Utils::build_combined_where_expression(const Gnome::Gda::SqlExpr& a, const Gnome::Gda::SqlExpr& b, Gnome::Gda::SqlOperatorType op) { Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); const Gnome::Gda::SqlBuilder::Id id = builder->add_cond(op, builder->import_expression(a), builder->import_expression(b)); builder->set_where(id); return builder->export_expression(id); } Glib::RefPtr Utils::build_sql_select_with_key(const Glib::ustring& table_name, const type_vecConstLayoutFields& fieldsToGet, const sharedptr& key_field, const Gnome::Gda::Value& key_value, const type_sort_clause& sort_clause, guint limit) { //We choose instead to have no where clause in this case, //because that is useful to some callers: //if(Conversions::value_is_empty(key_value)) //If there is a record to show: // return Glib::RefPtr(); Gnome::Gda::SqlExpr where_clause; if(!Conversions::value_is_empty(key_value) && key_field) { where_clause = build_simple_where_expression(table_name, key_field, key_value); } return Utils::build_sql_select_with_where_clause(table_name, fieldsToGet, where_clause, sharedptr(), sort_clause, limit); } Utils::type_list_values_with_second Utils::get_choice_values_all(const Document* document, const sharedptr& field) { return get_choice_values(document, field, Gnome::Gda::Value() /* means get all with no WHERE clause */); } Utils::type_list_values_with_second Utils::get_choice_values(const Document* document, const sharedptr& field, const Gnome::Gda::Value& foreign_key_value) { //TODO: Reduce duplication between this and get_choice_values(field). type_list_values_with_second result; //We allows this, so this method can be used to get all records in a related table: /* if(Conversions::value_is_empty(foreign_key_value)) { std::cout << G_STRFUNC << "debug: foreign_key_value is empty." << std::endl; return result; } */ const Formatting& format = field->get_formatting_used(); sharedptr choice_relationship; sharedptr layout_choice_first; sharedptr layout_choice_extra; Formatting::type_list_sort_fields choice_sort_fields; bool choice_show_all = false; format.get_choices_related(choice_relationship, layout_choice_first, layout_choice_extra, choice_sort_fields, choice_show_all); if(!choice_relationship) { std::cerr << G_STRFUNC << ": !choice_relationship." << std::endl; return result; } Utils::type_vecConstLayoutFields fields; fields.push_back(layout_choice_first); if(layout_choice_extra) { const LayoutGroup::type_list_const_items extra_fields = layout_choice_extra->get_items_recursive(); for(LayoutGroup::type_list_const_items::const_iterator iter = extra_fields.begin(); iter != extra_fields.end(); ++iter) { const sharedptr item = *iter; const sharedptr item_field = sharedptr::cast_dynamic(item); if(item_field) fields.push_back(item_field); //TODO: Don't ignore other usable items such as static text. } } const Glib::ustring to_table = choice_relationship->get_to_table(); const sharedptr to_field = document->get_field(to_table, choice_relationship->get_to_field()); if(!to_field) { std::cerr << G_STRFUNC << ": to_field is null." << std::endl; } //Default to some sort order rather than none: if(choice_sort_fields.empty()) { choice_sort_fields.push_back( type_pair_sort_field(layout_choice_first, true /* ascending */)); } //TODO: Support related relationships (in the UI too): Glib::RefPtr builder = Utils::build_sql_select_with_key( to_table, fields, to_field, foreign_key_value, choice_sort_fields); if(!builder) { std::cerr << G_STRFUNC << ": builder is null." << std::endl; return result; } //TODO: builder->select_order_by(choice_field_id); //Connect to database and get the related values: sharedptr connection = ConnectionPool::get_instance()->connect(); if(!connection) { std::cerr << G_STRFUNC << ": connection is null." << std::endl; return result; } const std::string sql_query = Utils::sqlbuilder_get_full_query(builder); //std::cout << "debug: sql_query=" << sql_query << std::endl; Glib::RefPtr datamodel = connection->get_gda_connection()->statement_execute_select(sql_query); if(datamodel) { const guint count = datamodel->get_n_rows(); const guint cols_count = datamodel->get_n_columns(); for(guint row = 0; row < count; ++row) { std::pair itempair; itempair.first = datamodel->get_value_at(0, row); if(layout_choice_extra && (cols_count > 1)) { type_list_values list_values; for(guint i = 1; i < cols_count; ++i) { list_values.push_back(datamodel->get_value_at(i, row)); } itempair.second = list_values; } result.push_back(itempair); } } else { std::cerr << G_STRFUNC << ": Error while executing SQL" << std::endl << " " << sql_query << std::endl; return result; } return result; } Glib::ustring Utils::create_name_from_title(const Glib::ustring& title) { Glib::ustring result = string_replace(title, " ", ""); return result.lowercase(); //TODO: Maybe they need to be ASCII (not UTF8)? } Glib::ustring Utils::string_escape_underscores(const Glib::ustring& text) { Glib::ustring result; for(Glib::ustring::const_iterator iter = text.begin(); iter != text.end(); ++iter) { if(*iter == '_') result += "__"; else result += *iter; } return result; } /** Get just the first part of a locale, such as de_DE, * ignoring, for instance, .UTF-8 or \@euro at the end. */ Glib::ustring Utils::locale_simplify(const Glib::ustring& locale_id) { Glib::ustring result = locale_id; //At least Ubuntu Natty provides a long string such as this: LC_CTYPE=en_US.UTF-8;LC_NUMERIC=en_US.UTF-8;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_AG.utf8;LC_PAPER=en_US.UTF-8;LC_NAME=en_US.UTF-8;LC_ADDRESS=en_US.UTF-8;LC_TELEPHONE=en_US.UTF-8;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=en_US.UTF-8 //In Ubuntu Maverick, and earlier, it was apparently a simple string such as en_US.UTF-8. //Look for LC_ALL or LC_COLLATE //(We use the locale name only to identify translations //Otherwise just start with the whole string. Glib::ustring::size_type posCategory = result.find("LC_ALL="); if(posCategory != Glib::ustring::npos) { result = result.substr(posCategory); } else { posCategory = result.find("LC_COLLATE="); if(posCategory != Glib::ustring::npos) { result = result.substr(posCategory); } } //Get everything before the .: const Glib::ustring::size_type posDot = result.find('.'); if(posDot != Glib::ustring::npos) { result = result.substr(0, posDot); } //Get everything before the @: const Glib::ustring::size_type posAt = result.find('@'); if(posAt != Glib::ustring::npos) { result = result.substr(0, posAt); } //Get everything after the =, if any: const Glib::ustring::size_type posEquals = result.find('='); if(posEquals != Glib::ustring::npos) { result = result.substr(posEquals + 1); } return result; } Glib::ustring Utils::locale_language_id(const Glib::ustring& locale_id) { const Glib::ustring::size_type posUnderscore = locale_id.find('_'); if(posUnderscore != Glib::ustring::npos) { return locale_id.substr(0, posUnderscore); } else { //We assume that this locale ID specifies a language but no specific country. return locale_id; } } Glib::ustring Utils::create_local_image_uri(const Gnome::Gda::Value& value) { static guint m_temp_image_uri_number = 0; Glib::ustring result; if(value.get_value_type() == GDA_TYPE_BINARY) { long size = 0; gconstpointer pData = value.get_binary(size); if(size && pData) { // Note that this is regular binary data, not escaped text representing the data: //Save the image to a temporary file and provide the file URI. char pchExtraNum[10]; sprintf(pchExtraNum, "%d", m_temp_image_uri_number); result = ("/tmp/glom_report_image_" + Glib::ustring(pchExtraNum) + ".png"); ++m_temp_image_uri_number; std::fstream the_stream(result.c_str(), std::ios_base::out | std::ios_base::trunc | std::ios_base::binary); if(the_stream) { the_stream.write((char*)pData, size); } } else std::cerr << G_STRFUNC << ": binary GdaValue contains no data." << std::endl; } //else // std::cerr << G_STRFUNC << ": type != BINARY" << std::endl; if(result.empty()) result = "/tmp/glom_report_image_invalid.png"; return ("file://" + result); } Glib::ustring Utils::string_from_decimal(guint decimal) { //TODO_Performance: std::stringstream stream; stream.imbue(std::locale("")); //Use the user's current locale. stream << decimal; Glib::ustring result; stream >> result; return result; } Glib::ustring Utils::title_from_string(const Glib::ustring& text) { Glib::ustring result; bool capitalise_next_char = true; for(Glib::ustring::const_iterator iter = text.begin(); iter != text.end(); ++iter) { const gunichar& ch = *iter; if(ch == '_') //Replace _ with space. { capitalise_next_char = true; //Capitalise all words. result += " "; } else { if(capitalise_next_char) result += Glib::Unicode::toupper(*iter); else result += *iter; capitalise_next_char = false; } } return result; } Utils::type_vec_strings Utils::string_separate(const Glib::ustring& str, const Glib::ustring& separator, bool ignore_quoted_separator) { //std::cout << "debug: " << G_STRFUNC << ": separator=" << separator << std::endl; type_vec_strings result; const Glib::ustring::size_type size = str.size(); const Glib::ustring::size_type size_separator = separator.size(); //A stack of quotes, so that we can handle nested quotes, whether they are " or ': typedef std::stack type_queue_quotes; type_queue_quotes m_current_quotes; Glib::ustring::size_type unprocessed_start = 0; Glib::ustring::size_type item_start = 0; while(unprocessed_start < size) { //std::cout << "while unprocessed: un_processed_start=" << unprocessed_start << std::endl; Glib::ustring::size_type posComma = str.find(separator, unprocessed_start); Glib::ustring item; if(posComma != Glib::ustring::npos) { //Check that the separator was not in quotes: bool in_quotes = false; if(ignore_quoted_separator) { //std::cout << " debug: attempting to ignore quoted separators: " << separator << std::endl; Glib::ustring::size_type posLastQuote = unprocessed_start; //std::cout << " debug: posLastQuote=" << posLastQuote << std::endl; //std::cout << " debug: posComma=" << posComma << std::endl; bool bContinue = true; while(bContinue && (posLastQuote < posComma)) { //std::cout << " continue" << std::endl; Glib::ustring closing_quote; if(!m_current_quotes.empty()) closing_quote = m_current_quotes.top(); //std::cout << " posLastQuote=" << posLastQuote << std::endl; const Glib::ustring::size_type posSingleQuote = str.find("'", posLastQuote); const Glib::ustring::size_type posDoubleQuote = str.find("\"", posLastQuote); // std::cout << " posSingleQuote=" << posSingleQuote << "posDoubleQuote=" << posDoubleQuote << std::endl; //Which quote, if any, is first: Glib::ustring::size_type posFirstQuote = posSingleQuote; if( (posDoubleQuote != Glib::ustring::npos) && (posDoubleQuote < posFirstQuote) ) posFirstQuote = posDoubleQuote; //Ignore quotes that are _after_ the separator: if( posFirstQuote >= posComma) posFirstQuote = Glib::ustring::npos; //std::cout << " posFirstQuote=" << posFirstQuote << std::endl; //If any quote character was found: if(posFirstQuote != Glib::ustring::npos) { //std::cout << "quote found: posFirstQuote=" << posFirstQuote << std::endl; //Which quote was it? const Glib::ustring first_quote = (posFirstQuote == posSingleQuote ? "'" : "\""); //std::cout << " first_quote=" << first_quote << std::endl; //Was it an expected closing quote, if we expected any: if(first_quote == closing_quote) { //std::cout << " popping quote" << std::endl; //Yes, so remove that quote from our stack, because we found the closing quote: m_current_quotes.pop(); } else { //std::cout << " pushing quote" << std::endl; //This must be an opening quote, so remember it: m_current_quotes.push(first_quote); } posLastQuote = posFirstQuote + 1; //Do the next find after the quote. } else { //There were no quotes, or no closing quotes: bContinue = false; } } //while(bContinue) //If there were any unclosed quotes then this separator must have been in quotes: if(!m_current_quotes.empty()) in_quotes = true; } //If ignore_quoted_separator if(!in_quotes) //or if we don't care about quotes. { //std::cout << "!in_quotes" << std::endl; //Store this item, and start the next item after it: item = str.substr(item_start, posComma - item_start); //std::cout << " ITEM. pos_comma=" << posComma << ", ITEM= " << item << std::endl; item_start = posComma + size_separator; } else { //std::cout << "in quotes." << std::endl; // Continue behind separator unprocessed_start = posComma + size_separator; // Do not add this item to the result, because it was quoted. continue; } unprocessed_start = posComma + size_separator; //The while loops stops when this is empty. } else //if no separator found: { item = str.substr(item_start); unprocessed_start = size; //Stop. } item = string_trim(item, " "); result.push_back(item); } //while return result; } Glib::ustring Utils::string_trim(const Glib::ustring& str, const Glib::ustring& to_remove) { Glib::ustring result = str; //Remove from the start: Glib::ustring::size_type posOpenBracket = result.find(to_remove); if(posOpenBracket == 0) { result = result.substr(to_remove.size()); } //Remove from the end: Glib::ustring::size_type posCloseBracket = result.rfind(to_remove); if(posCloseBracket == (result.size() - to_remove.size())) { result = result.substr(0, posCloseBracket); } return result; } Glib::ustring Utils::string_remove_suffix(const Glib::ustring& str, const Glib::ustring& suffix, bool case_sensitive) { //There is also g_string_has_suffix(), but I assume that is case sensitive. murrayc. const Glib::ustring::size_type size = str.size(); const Glib::ustring::size_type suffix_size = suffix.size(); if(size < suffix_size) return str; const Glib::ustring possible_suffix = str.substr(size - suffix_size); if(case_sensitive) { if(possible_suffix == suffix) return str.substr(0, size - suffix_size); } else { if(g_ascii_strcasecmp(possible_suffix.c_str(), suffix.c_str()) == 0) //TODO: I don't understand the warnings about using this function in the glib documentation. murrayc. return str.substr(0, size - suffix_size); } return str; } bool Utils::file_exists(const Glib::ustring& uri) { if(uri.empty()) return false; //Check whether file exists already: // Try to examine the input file. Glib::RefPtr file = Gio::File::create_for_uri(uri); return file_exists(file); } bool Utils::file_exists(const Glib::RefPtr& file) { try { return file->query_exists(); } catch(const Gio::Error& /* ex */) { return false; //Something went wrong. It does not exist. } } //TODO: This is a duplicate of the one in db_utils.cc: //Merge all db utilities into db_utils in glom 1.22: static Glib::RefPtr get_connection() { sharedptr sharedconnection; try { sharedconnection = ConnectionPool::get_and_connect(); } catch (const Glib::Error& error) { std::cerr << G_STRFUNC << ": " << error.what() << std::endl; } if(!sharedconnection) { std::cerr << G_STRFUNC << ": No connection yet." << std::endl; return Glib::RefPtr(0); } Glib::RefPtr gda_connection = sharedconnection->get_gda_connection(); return gda_connection; } std::string Utils::sqlbuilder_get_full_query( const Glib::RefPtr& builder) { Glib::RefPtr connection = get_connection(); if(!connection) { //TODO: Just use the correct provider, without an actual connection? std::cerr << G_STRFUNC << ": There is no connection, so the SQL statement might not be created correctly." << std::endl; } Glib::ustring result = "glom_query_not_parsed"; try { Glib::RefPtr stmt = builder->get_statement(); if(!stmt) { std::cerr << G_STRFUNC << ": builder->get_statement() failed." << std::endl; return result; } if(connection) { result = connection->statement_to_sql(stmt, Gnome::Gda::STATEMENT_SQL_PARAMS_AS_VALUES | Gnome::Gda::STATEMENT_SQL_PRETTY); } else result = stmt->to_sql(); } catch(const Gnome::Gda::SqlError& ex) { std::cerr << G_STRFUNC << ": SqlError exception while getting query: " << ex.what() << std::endl; } catch(const Glib::Exception& ex) { std::cerr << G_STRFUNC << ": exception (" << typeid(ex).name() << ") while getting query: " << ex.what() << std::endl; } catch(const std::exception& ex) { std::cerr << G_STRFUNC << ": exception (" << typeid(ex).name() << ") while getting query: " << ex.what() << std::endl; } //Convert to something that std::cout should be able to handle. const Glib::ScopedPtr buf(g_convert_with_fallback( result.raw().data(), result.raw().size(), "ISO-8859-1", "UTF-8", (char*)"?", 0, 0, 0)); const Glib::ustring str = std::string(buf.get()); if(str.empty()) { std::cerr << G_STRFUNC << ": Returning an empty string." << std::endl; } return str; } Gnome::Gda::SqlExpr Utils::get_find_where_clause_quick(const Document* document, const Glib::ustring& table_name, const Gnome::Gda::Value& quick_search) { if(table_name.empty()) { std::cerr << G_STRFUNC << ": table_name is empty." << std::endl; return Gnome::Gda::SqlExpr(); } if(Conversions::value_is_empty(quick_search)) return Gnome::Gda::SqlExpr(); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_target(table_name); //We need to add some fields to select, //because otherwise the SqlBuilder would not contain a valid query. builder->select_add_field("*", table_name); if(!document) { std::cerr << G_STRFUNC << ": document was null." << std::endl; return Gnome::Gda::SqlExpr(); } //We need the connection to generate the correct SQL syntax: Glib::RefPtr connection = get_connection(); if(!connection) { std::cerr << G_STRFUNC << ": connection was null." << std::endl; return Gnome::Gda::SqlExpr(); } //TODO: Cache the list of all fields, as well as caching (m_Fields) the list of all visible fields: const Document::type_vec_fields fields = document->get_table_fields(table_name); guint previous_id = 0; typedef std::vector< sharedptr > type_vecLayoutFields; type_vecLayoutFields fieldsToGet; for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { Glib::ustring strClausePart; sharedptr field = *iter; bool use_this_field = true; if(field->get_glom_type() != Field::TYPE_TEXT) { use_this_field = false; } if(use_this_field) { //std::cout << "Using field: " << field->get_name() << std::endl; const guint eq_id = builder->add_cond(field->sql_find_operator(), builder->add_field_id(field->get_name(), table_name), builder->add_expr( field->sql_find(quick_search, connection) )); //sql_find() modifies the value for the operator. if(previous_id) { const guint or_id = builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_OR, previous_id, eq_id); previous_id = or_id; } else previous_id = eq_id; } } if(previous_id) { builder->set_where(previous_id); //This might be unnecessary. //std::cout << G_STRFUNC << ": builder: " << sqlbuilder_get_full_query(builder) << std::endl; return builder->export_expression(previous_id); } else { std::cerr << G_STRFUNC << ": Returning null SqlExpr" << std::endl; return Gnome::Gda::SqlExpr(); } } Glib::RefPtr Utils::build_sql_update_with_where_clause( const Glib::ustring& table_name, const sharedptr& field, const Gnome::Gda::Value& value, const Gnome::Gda::SqlExpr& where_clause) { Glib::RefPtr builder; if(!field || field->get_name().empty()) { std::cerr << "field was null or its name was empty." << std::endl; return builder; } if(table_name.empty()) { std::cerr << "table_name was empty." << std::endl; return builder; } //Build the whole SQL statement: try { builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder->set_table(table_name); builder->add_field_value_as_value(field->get_name(), value); //Add the WHERE clause: if(!where_clause.empty()) { const int id = builder->import_expression(where_clause); builder->set_where(id); } } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Exception: " << ex.what() << std::endl; } return builder; } bool Utils::delete_directory(const Glib::RefPtr& directory) { if(!(directory->query_exists())) return true; //(Recursively) Delete any child files and directories, //so we can delete this directory. Glib::RefPtr enumerator = directory->enumerate_children(); Glib::RefPtr info = enumerator->next_file(); while(info) { Glib::RefPtr child = directory->get_child(info->get_name()); bool removed_child = false; if(child->query_file_type() == Gio::FILE_TYPE_DIRECTORY) removed_child = delete_directory(child); else removed_child = child->remove(); if(!removed_child) return false; info = enumerator->next_file(); } //Delete the actual directory: if(!directory->remove()) return false; return true; } bool Utils::delete_directory(const std::string& uri) { Glib::RefPtr file = Gio::File::create_for_uri(uri); return delete_directory(file); } /** For instance, to find the first file in the directory with a .glom extension. */ Glib::ustring Utils::get_directory_child_with_suffix(const Glib::ustring& uri_directory, const std::string& suffix, bool recursive) { Glib::RefPtr directory = Gio::File::create_for_uri(uri_directory); Glib::RefPtr enumerator = directory->enumerate_children(); Glib::RefPtr info = enumerator->next_file(); while(info) { Glib::RefPtr child = directory->get_child(info->get_name()); const Gio::FileType file_type = child->query_file_type(); if(file_type == Gio::FILE_TYPE_REGULAR) { //Check the filename: const std::string basename = child->get_basename(); if(string_remove_suffix(basename, suffix) != basename) return child->get_uri(); } else if(recursive && file_type == Gio::FILE_TYPE_DIRECTORY) { //Look in sub-directories too: const Glib::ustring result = get_directory_child_with_suffix(child->get_uri(), suffix, recursive); if(!result.empty()) return result; } info = enumerator->next_file(); } return Glib::ustring(); } Glib::ustring Utils::get_file_uri_without_extension(const Glib::ustring& uri) { if(uri.empty()) return uri; Glib::RefPtr file = Gio::File::create_for_uri(uri); if(!file) return uri; //Actually an error. const Glib::ustring filename_part = file->get_basename(); const Glib::ustring::size_type pos_dot = filename_part.rfind("."); if(pos_dot == Glib::ustring::npos) return uri; //There was no extension, so just return the existing URI. else { const Glib::ustring filename_part_without_ext = filename_part.substr(0, pos_dot); //Use the Gio::File API to manipulate the URI: Glib::RefPtr parent = file->get_parent(); Glib::RefPtr file_without_extension = parent->get_child(filename_part_without_ext); return file_without_extension->get_uri(); } } std::string Utils::get_file_path_without_extension(const std::string& filepath) { if(filepath.empty()) return filepath; Glib::RefPtr file = Gio::File::create_for_path(filepath); if(!file) return filepath; //Actually an error. const Glib::ustring filename_part = file->get_basename(); const Glib::ustring::size_type pos_dot = filename_part.rfind("."); if(pos_dot == Glib::ustring::npos) return filepath; //There was no extension, so just return the existing URI. else { const Glib::ustring filename_part_without_ext = filename_part.substr(0, pos_dot); //Use the Gio::File API to manipulate the URI: Glib::RefPtr parent = file->get_parent(); Glib::RefPtr file_without_extension = parent->get_child(filename_part_without_ext); return file_without_extension->get_path(); } } Glib::ustring Utils::get_list_of_layout_items_for_display(const LayoutGroup::type_list_items& list_layout_fields) { Glib::ustring result; for(LayoutGroup::type_list_items::const_iterator iter = list_layout_fields.begin(); iter != list_layout_fields.end(); ++iter) { const sharedptr item = *iter; if(item) { if(!result.empty()) result += ", "; result += item->get_layout_display_name(); } } return result; } Glib::ustring Utils::get_list_of_layout_items_for_display(const sharedptr& layout_group) { if(layout_group) return get_list_of_layout_items_for_display(layout_group->m_list_items); else return Glib::ustring(); } Glib::ustring Utils::get_list_of_sort_fields_for_display(const Formatting::type_list_sort_fields& sort_fields) { Glib::ustring text; for(Formatting::type_list_sort_fields::const_iterator iter = sort_fields.begin(); iter != sort_fields.end(); ++iter) { const sharedptr item = iter->first; if(!item) continue; if(!text.empty()) text += ", "; text += item->get_layout_display_name(); //TODO: Show Ascending/Descending? } return text; } std::string Utils::get_temp_file_path(const std::string& prefix, const std::string& extension) { //Get a temporary file path: std::string filepath; try { const std::string prefix_pattern = prefix + "XXXXXX" + extension; const int filehandle = Glib::file_open_tmp(filepath, prefix); ::close(filehandle); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Glib::file_open_tmp() failed" << std::endl; return filepath; } if(filepath.empty()) { std::cerr << G_STRFUNC << ": Glib::file_open_tmp() returned an empty filepath" << std::endl; } return filepath; } Glib::ustring Utils::get_temp_file_uri(const std::string& prefix, const std::string& extension) { try { const std::string filepath = get_temp_file_path(prefix, extension); return Glib::filename_to_uri(filepath); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Exception from filename_to_uri(): " << ex.what() << std::endl; return std::string(); } } std::string Utils::get_temp_directory_path(const std::string& prefix) { std::string result; const std::string pattern = Glib::build_filename( Glib::get_tmp_dir(), prefix + "XXXXXX"); //We must copy the pattern, because mkdtemp() modifies it: char* c_pattern = g_strdup(pattern.c_str()); const char* filepath = g_mkdtemp(c_pattern); if(filepath) result = filepath; return result; } Glib::ustring Utils::get_temp_directory_uri(const std::string& prefix) { try { const std::string filepath = get_temp_directory_path(prefix); return Glib::filename_to_uri(filepath); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Exception from filename_to_uri(): " << ex.what() << std::endl; return Glib::ustring(); } } LayoutGroup::type_list_const_items Utils::get_layout_items_plus_primary_key(const LayoutGroup::type_list_const_items& items, const Document* document, const Glib::ustring& table_name) { if(!document) { std::cerr << G_STRFUNC << ": document was null." << std::endl; return items; } const sharedptr field_primary_key = document->get_field_primary_key(table_name); if(!field_primary_key) { std::cerr << G_STRFUNC << ": Could not find the primary key." << std::endl; return items; } sharedptr pk_layout_item = sharedptr::create(); pk_layout_item->set_hidden(); pk_layout_item->set_full_field_details(field_primary_key); const LayoutGroup::type_list_const_items::const_iterator iterFind = std::find_if(items.begin(), items.end(), predicate_LayoutItem_Field_IsSameField(pk_layout_item)); if(iterFind != items.end()) return items; //It is already in the list: LayoutGroup::type_list_const_items items_plus_pk = items; items_plus_pk.push_back(pk_layout_item); return items_plus_pk; } //TODO: Avoid the horrible code duplication with the const version. LayoutGroup::type_list_items Utils::get_layout_items_plus_primary_key(const LayoutGroup::type_list_items& items, const Document* document, const Glib::ustring& table_name) { if(!document) { std::cerr << G_STRFUNC << ": document was null." << std::endl; return items; } const sharedptr field_primary_key = document->get_field_primary_key(table_name); if(!field_primary_key) { std::cerr << G_STRFUNC << ": Could not find the primary key." << std::endl; return items; } sharedptr pk_layout_item = sharedptr::create(); pk_layout_item->set_hidden(); pk_layout_item->set_full_field_details(field_primary_key); const LayoutGroup::type_list_items::const_iterator iterFind = std::find_if(items.begin(), items.end(), predicate_LayoutItem_Field_IsSameField(pk_layout_item)); if(iterFind != items.end()) return items; //It is already in the list: LayoutGroup::type_list_items items_plus_pk = items; items_plus_pk.push_back(pk_layout_item); return items_plus_pk; } bool Utils::script_check_for_pygtk2(const Glib::ustring& script) { //There are probably other code that this will not catch, //but this is better than nothing. //TODO: Instead override python's import mechanism somehow? if(script.find("import pygtk") != std::string::npos) return false; return true; } } //namespace Glom glom-1.22.4/glom/libglom/glom_postgres.cc0000644000175000017500000000231212234252646021546 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2006 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "glom_postgres.h" #include namespace Glom { GlomPostgres::type_vec_strings GlomPostgres::pg_list_separate(const Glib::ustring& str) { //Remove the first { and the last }: Glib::ustring without_brackets = Utils::string_trim(str, "{"); without_brackets = Utils::string_trim(without_brackets, "}"); //Get the comma-separated items: return Utils::string_separate(without_brackets, ","); } } //namespace Glom glom-1.22.4/glom/dialog_invalid_data.h0000644000175000017500000000311312234252645021034 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_INVALIDDATA_H #define GLOM_DIALOG_INVALIDDATA_H #include #include #include #include namespace Glom { /** Show the dialog. * @result true if the data in the field should be reverted. */ bool glom_show_dialog_invalid_data(Field::glom_field_type glom_type); class Dialog_InvalidData : public Gtk::Dialog { public: static const char glade_id[]; static const bool glade_developer; Dialog_InvalidData(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_InvalidData(); /** Show appropriate example data for this field type. */ void set_example_data(Field::glom_field_type glom_type); private: Gtk::Label* m_label; }; } //namespace Glom #endif //GLOM_DIALOG_INVALIDDATA_H glom-1.22.4/glom/onlineglom_strings.cc0000644000175000017500000000257112234776363021167 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include // These strings are not actually used by Glom. // I am putting them here so that GNOME's translators can translate them // without dealing with the awkward (not gettext) system here: // http://www.murrayc.com/blog/permalink/2012/01/27/online-glom-more-translation/ // murrayc const char* online_glom_search = _("Search"); const char* online_glom_backToList = _("Back to List"); const char* online_glom_details = _("Details"); const char* online_glom_open = _("Open"); const char* online_glom_reports = _("Reports"); const char* online_glom_generating_report = _("Generating the report..."); glom-1.22.4/glom/base_db_table_data_readonly.h0000644000175000017500000000406612234252645022522 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef BASE_DB_TABLE_DATA_READONLY_H #define BASE_DB_TABLE_DATA_READONLY_H #include "base_db_table.h" #include #include //find_if used in various places. namespace Glom { /** A base class some database functionality * for use with a specific database table, showing data from the table. */ class Base_DB_Table_Data_ReadOnly : public Base_DB_Table { public: Base_DB_Table_Data_ReadOnly(); virtual ~Base_DB_Table_Data_ReadOnly(); virtual bool refresh_data_from_database(); protected: //TODO: Move these to Base_DB_Table_Data too? virtual sharedptr get_field_primary_key() const = 0; //TODO: Document whether these get the primary key in an existing record, //or the primary key value as it is entered in the UI, even before a record exists, //or both. virtual Gnome::Gda::Value get_primary_key_value_selected() const = 0; virtual Gnome::Gda::Value get_primary_key_value(const Gtk::TreeModel::iterator& row) const = 0; FoundSet m_found_set; type_vec_fields m_TableFields; //A cache, so we don't have to repeatedly get them from the Document. type_vecConstLayoutFields m_FieldsShown; //And any extra keys needed by shown fields. //TODO: Move to the non-read-only class? }; } //namespace Glom #endif //BASE_DB_TABLE__DATA_READONLY_H glom-1.22.4/glom/glom_export_po_all.cc0000644000175000017500000001620212234776363021134 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ // For instance: // glom_export_po_all /opt/gnome30/share/doc/glom/examples/example_music_collection.glom --output-path="/home/someone/po_files/" #include "config.h" #include #include #include #include #include #include #include #include #include class GlomCreateOptionGroup : public Glib::OptionGroup { public: GlomCreateOptionGroup(); //These instances should live as long as the OptionGroup to which they are added, //and as long as the OptionContext to which those OptionGroups are added. std::string m_arg_filepath_output; bool m_arg_version; }; GlomCreateOptionGroup::GlomCreateOptionGroup() : Glib::OptionGroup("glom_export_po_all", _("Glom options"), _("Command-line options")), m_arg_version(false) { Glib::OptionEntry entry; entry.set_long_name("output-path"); entry.set_short_name('o'); entry.set_description(_("The directory path at which to save the created .po files, such as /home/someuser/po_files/ .")); add_entry_filename(entry, m_arg_filepath_output); entry.set_long_name("version"); entry.set_short_name('V'); entry.set_description(_("The version of this application.")); add_entry(entry, m_arg_version); } int main(int argc, char* argv[]) { bindtextdomain(GETTEXT_PACKAGE, GLOM_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); // Set the locale for any streams to the user's current locale, // We should not rely on the default locale of // any streams (we should always do an explicit imbue()), // but this is maybe a good default in case we forget. try { std::locale::global(std::locale("")); } catch(const std::runtime_error& ex) { //This has been known to throw an exception at least once: //https://bugzilla.gnome.org/show_bug.cgi?id=619445 //This should tell us what the problem is: std::cerr << G_STRFUNC << ": exception from std::locale::global(std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } Glom::libglom_init(); Glib::OptionContext context; GlomCreateOptionGroup group; context.set_main_group(group); try { context.parse(argc, argv); } catch(const Glib::OptionError& ex) { std::cout << _("Error while parsing command-line options: ") << std::endl << ex.what() << std::endl; std::cout << _("Use --help to see a list of available command-line options.") << std::endl; return 0; } catch(const Glib::Error& ex) { std::cout << "Error: " << ex.what() << std::endl; return 0; } if(group.m_arg_version) { std::cout << PACKAGE_STRING << std::endl; return 0; } // Get a URI for a glom file: Glib::ustring input_uri; // The GOption documentation says that options without names will be returned to the application as "rest arguments". // I guess this means they will be left in the argv. Murray. if(input_uri.empty() && (argc > 1)) { const char* pch = argv[1]; if(pch) input_uri = pch; } if(input_uri.empty()) { std::cerr << _("Please specify a glom file.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Get a URI (file://something) from the filepath: Glib::RefPtr file_input = Gio::File::create_for_commandline_arg(input_uri); //Make sure it is really a URI: input_uri = file_input->get_uri(); if(!file_input->query_exists()) { std::cerr << _("The Glom file does not exist.") << std::endl; std::cerr << "uri: " << input_uri << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } Gio::FileType file_type = file_input->query_file_type(); if(file_type == Gio::FILE_TYPE_DIRECTORY) { std::cerr << _("The Glom file path is a directory instead of a file.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Check the output path: if(group.m_arg_filepath_output.empty()) { std::cerr << _("Please specify an output path.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Get a URI (file://something) from the filepath: Glib::RefPtr file_output = Gio::File::create_for_commandline_arg(group.m_arg_filepath_output); //Create the directory, if necessary: if(!(file_output->query_exists())) { if(!(file_output->make_directory_with_parents())) { std::cerr << _("The ouput directory could not be created.") << std::endl; return EXIT_FAILURE; } } file_type = file_output->query_file_type(); if(file_type != Gio::FILE_TYPE_DIRECTORY) { std::cerr << _("Glom: The output file path is not a directory.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } // Load the document: Glom::Document document; document.set_file_uri(input_uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } const std::vector locales = document.get_translation_available_locales(); if(locales.empty()) { std::cerr << _("The Glom document has no translations.") << std::endl; return EXIT_FAILURE; } const Glib::ustring original_locale_id = document.get_translation_original_locale(); for(std::vector::const_iterator iter = locales.begin(); iter != locales.end(); ++iter) { const Glib::ustring locale_id = *iter; if(locale_id == original_locale_id) continue; const Glib::RefPtr file_output_full = file_output->get_child(locale_id + ".po"); const Glib::ustring output_uri = file_output_full->get_uri(); const bool succeeded = Glom::write_translations_to_po_file(&document, output_uri, locale_id); if(!succeeded) { std::cerr << _("Po file creation failed.") << std::endl; return EXIT_FAILURE; } std::cout << Glib::ustring::compose(_("Po file created at: %1"), output_uri) << std::endl; } Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/glom/box_reports.cc0000644000175000017500000001771712234252645017621 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include //For bold_message()). #include #include #include #include #include namespace Glom { const char* Box_Reports::glade_id("box_reports"); const bool Box_Reports::glade_developer(true); Box_Reports::Box_Reports(BaseObjectType* cobject, const Glib::RefPtr& builder) : Box_DB_Table(cobject, builder), m_colReportName(0), m_colTitle(0) { //Get the Glade-instantiated widgets, and connect signal handlers: Gtk::Button* pButtonCancel = 0; builder->get_widget("button_cancel", pButtonCancel); set_button_cancel(*pButtonCancel); Gtk::Alignment* pAligmentPlaceholder = 0; builder->get_widget("alignment_placeholder_adddel", pAligmentPlaceholder); pAligmentPlaceholder->add(m_AddDel); m_AddDel.signal_user_added().connect(sigc::mem_fun(*this, &Box_Reports::on_adddel_Add)); m_AddDel.signal_user_requested_delete().connect(sigc::mem_fun(*this, &Box_Reports::on_adddel_Delete)); m_AddDel.signal_user_requested_edit().connect(sigc::mem_fun(*this, &Box_Reports::on_adddel_Edit)); m_AddDel.signal_user_changed().connect(sigc::mem_fun(*this, &Box_Reports::on_adddel_changed)); show_all_children(); } Box_Reports::~Box_Reports() { } void Box_Reports::fill_row(const Gtk::TreeModel::iterator& iter, const sharedptr& report) { if(iter) { const Glib::ustring report_name = report->get_name(); m_AddDel.set_value_key(iter, report_name); m_AddDel.set_value(iter, m_colReportName, report_name); m_AddDel.set_value(iter, m_colTitle, item_get_title(report)); } } bool Box_Reports::fill_from_database() { BusyCursor busy_cursor(get_app_window()); bool result = Box_DB_Table::fill_from_database(); //Enable/Disable extra widgets: bool developer_mode = (get_userlevel() == AppState::USERLEVEL_DEVELOPER); //Developers see more columns, so make it bigger: if(developer_mode) set_size_request(400, -1); else set_size_request(-1, -1); m_AddDel.remove_all(); //Add the columns: m_AddDel.remove_all_columns(); const bool editable = developer_mode; const bool visible_extras = developer_mode; m_colReportName = m_AddDel.add_column(_("Name"), AddDelColumnInfo::STYLE_Text, editable, visible_extras); m_AddDel.prevent_duplicates(m_colReportName); //Don't allow a relationship to be added twice. m_AddDel.set_prevent_duplicates_warning(_("This report already exists. Please choose a different report name")); m_colTitle = m_AddDel.add_column(_("Title"), AddDelColumnInfo::STYLE_Text, editable, true); std::vector listTableReports; Document* document = get_document(); if(document) { listTableReports = document->get_report_names(m_table_name); for(std::vector::const_iterator iter = listTableReports.begin(); iter != listTableReports.end(); ++iter) { sharedptr report = document->get_report(m_table_name, *iter); if(report) { Gtk::TreeModel::iterator row = m_AddDel.add_item(report->get_name()); fill_row(row, report); } } } else std::cerr << G_STRFUNC << ": document is null" << std::endl; //TODO: m_AddDel.set_allow_add(developer_mode); m_AddDel.set_allow_delete(developer_mode); return result; } void Box_Reports::on_adddel_Add(const Gtk::TreeModel::iterator& row) { sharedptr report = sharedptr::create(); const Glib::ustring report_name = m_AddDel.get_value(row, m_colReportName); if(!report_name.empty()) { report->set_name(report_name); m_AddDel.set_value_key(row, report_name); //Set a suitable starting title, if there is none already: Glib::ustring title = m_AddDel.get_value(row, m_colTitle); if(title.empty()) { title = Utils::title_from_string(report_name); m_AddDel.set_value(row, m_colTitle, title); } report->set_title(title, AppWindow::get_current_locale()); get_document()->set_report(m_table_name, report); } } void Box_Reports::on_adddel_Delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& /* TODO: rowEnd */) { const Glib::ustring name = m_AddDel.get_value_key(rowStart); if(!name.empty()) { get_document()->remove_report(m_table_name, name); m_AddDel.remove_item_by_key(name); } } void Box_Reports::on_adddel_Edit(const Gtk::TreeModel::iterator& row) { Glib::ustring report_name = m_AddDel.get_value_key(row); Document* document = get_document(); if(document) { save_to_document(); //Emit the signal: signal_selected.emit(report_name); } } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Reports::save_to_document() { if(get_userlevel() == AppState::USERLEVEL_DEVELOPER) { //Add any reports that are not in the document: std::vector listReports = get_document()->get_report_names(m_table_name); bool modified = false; for(Gtk::TreeModel::iterator iter = m_AddDel.get_model()->children().begin(); iter != m_AddDel.get_model()->children().end(); ++iter) { const Glib::ustring report_name = m_AddDel.get_value(iter, m_colReportName); if(!report_name.empty() && std::find(listReports.begin(), listReports.end(), report_name) == listReports.end()) { sharedptr report(new Report()); report->set_name(report_name); report->set_title( m_AddDel.get_value(iter, m_colTitle) , AppWindow::get_current_locale()); //TODO: Translations: Store the original in the TreeView. get_document()->set_report(m_table_name, report); modified = true; } } if(modified) get_document()->set_modified(true); } } #endif //GLOM_ENABLE_CLIENT_ONLY void Box_Reports::on_adddel_changed(const Gtk::TreeModel::iterator& row, guint column) { if(get_userlevel() == AppState::USERLEVEL_DEVELOPER) { const Glib::ustring report_name = m_AddDel.get_value_key(row); Document* document = get_document(); sharedptr report = document->get_report(m_table_name, report_name); if(report) { if(column == m_colTitle) { report->set_title( m_AddDel.get_value(row, m_colTitle) , AppWindow::get_current_locale()); //TODO: Unnecessary: document->set_report(m_table_name, report); } else if(column == m_colReportName) { const Glib::ustring report_name_new = m_AddDel.get_value(row, m_colReportName); if(!report_name.empty() && !report_name_new.empty()) { const Glib::ustring strMsg = _("Are you sure that you want to rename this report?"); //TODO: Show old and new names? Gtk::MessageDialog dialog(_("Rename Report")); dialog.set_secondary_text(strMsg); int iButtonClicked = dialog.run(); //Rename the report: if(iButtonClicked == Gtk::RESPONSE_OK) { m_AddDel.set_value_key(row, report_name_new); document->remove_report(m_table_name, report_name); report->set_name(report_name_new); document->set_report(m_table_name, report); } } } } } } void Box_Reports::on_userlevel_changed(AppState::userlevels /* userlevel */) { fill_from_database(); } } //namespace Glom glom-1.22.4/glom/variablesmap.h0000644000175000017500000000544612234252646017560 0ustar00murraycmurrayc00000000000000/* variablesmap.h * * Copyright (C) 2002 The libglademm Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GLOM_VARIABLESMAP_H #define GLOM_VARIABLESMAP_H #include #include #include namespace Glom { /** Associates named Glade widgets with member variables. * Use connect_widget() to link the widgets with variables that will contain their data. * Then use transfer_widgets_to_variables() and transfer_variables_to_widgets() to get or set all of the variables at once. * * This is meant to be a bit like MFC's "Dialog Data Exchange and Validation". * * The association of widget and member varables follow this mapping: * * Gtk::Entry --> Glib::ustring * Gtk::SpinBox --> Glib::ustring * Gtk::ComboBox --> Glib::ustring * Gtk::Scale --> double * Gtk::Calendar --> Glib::Date * Gtk::CheckBox --> bool * Gtk::RadioButton --> bool * */ class VariablesMap { public: explicit VariablesMap(const Glib::RefPtr& builder); virtual ~VariablesMap(); ///For ToggleButton (CheckBox and RadioButton) void connect_widget(const Glib::ustring& widget_name, bool& variable); ///For Entry, ComboBox and SpinBox void connect_widget(const Glib::ustring& widget_name, Glib::ustring& variable); ///For Scale (HScale and VScale) void connect_widget(const Glib::ustring& widget_name, double& variable); ///For Calendar void connect_widget(const Glib::ustring& widget_name, Glib::Date& variable); ///Transfer data from the widget to the variable. void transfer_widgets_to_variables(); ///Transfer data from the variable to the widget. void transfer_variables_to_widgets(); protected: /** Override this to validate the data that the user enters into the widgets. * The return value indicates whether the widgets' data is valid. */ virtual bool validate_widgets(); void transfer_one_widget(Gtk::Widget* pWidget, bool to_variable); typedef std::map type_mapWidgetsToVariables; type_mapWidgetsToVariables m_mapWidgetsToVariables; Glib::RefPtr m_builder; }; } /* namespace Glom */ #endif /* GLOM_VARIABLESMAP_H */ glom-1.22.4/glom/glade_utils.h0000644000175000017500000001307312234776363017410 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_GLADE_UTILS_H #define GLOM_GLADE_UTILS_H #include // For std::cerr #include #include #include #include #include #include namespace Glom { namespace Utils { inline std::string get_glade_file_path(const std::string& filename) { #ifdef G_OS_WIN32 gchar* directory = g_win32_get_package_installation_directory_of_module(0); const std::string result = Glib::build_filename(directory, Glib::build_filename("share/glom/glade", filename)); g_free(directory); directory = 0; #else const std::string result = Glib::build_filename(GLOM_PKGDATADIR, Glib::build_filename("glade", filename)); #endif // Check that it exists: const Glib::RefPtr file = Gio::File::create_for_path(result); if(file && file->query_exists()) return result; // Try to fall back to the uninstalled file in the source tree, // for instance when running "make distcheck", which doesn't install to _inst/ // before running check. std::cout << "Glade file not found: " << result << std::endl; std::cout << "Falling back to the local file." << std::endl; return Glib::build_filename(GLOM_PKGDATADIR_NOTINSTALLED, filename); } /** This assumes that there are no other top-level windows in the glade file. * This allows us to get all object, including any necessary secondary objects, * such as a GtkSpinButton's GtkAdjustment. */ template void helper_get_glade_widget_derived_with_warning(const std::string& filename, const Glib::ustring& id, T_Widget*& widget, bool load_all) { Glib::RefPtr refXml; try { const std::string filepath = Utils::get_glade_file_path(filename); if(load_all) refXml = Gtk::Builder::create_from_file(filepath); else refXml = Gtk::Builder::create_from_file(filepath, id); } catch(const Gtk::BuilderError& ex) { std::cerr << G_STRFUNC << ": BuilderError Exception: " << ex.what() << std::endl; } catch(const Glib::MarkupError& ex) { std::cerr << G_STRFUNC << ": MarkupError exception:" << ex.what() << std::endl; } catch(const Glib::FileError& ex) { std::cerr << G_STRFUNC << ": FileError: exception" << ex.what() << std::endl; } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Exception of unexpected type: " << ex.what() << std::endl; } if(refXml) { refXml->get_widget_derived(id, widget); } } /** This should be used with classes that have a static glade_id member. * This loads only the widget's own object, as specified by its ID. */ template void get_glade_child_widget_derived_with_warning(T_Widget*& widget) { widget = 0; // Check the path to the installed .glade file: // The id is the same as the filename, in a developer/operator sub-directory: const std::string filename = Glib::build_filename( (T_Widget::glade_developer ? "developer" : "operator"), std::string(T_Widget::glade_id) + ".glade"); helper_get_glade_widget_derived_with_warning(filename, T_Widget::glade_id, widget, false /* load just this */); } /** This should be used with classes that have a static glade_id member. * This assumes that there are no other top-level windows in the glade file. * This allows us to get all object, including any necessary secondary objects, * such as a GtkSpinButton's GtkAdjustment. */ template void get_glade_widget_derived_with_warning(T_Widget*& widget) { widget = 0; // Check the path to the installed .glade file: // The id is the same as the filename, in a developer/operator sub-directory: const std::string filename = Glib::build_filename( (T_Widget::glade_developer ? "developer" : "operator"), std::string(T_Widget::glade_id) + ".glade"); helper_get_glade_widget_derived_with_warning(filename, T_Widget::glade_id, widget, true /* load_all */); } template void get_glade_widget_with_warning(const std::string& filename, const Glib::ustring& id, T_Widget*& widget) { Glib::RefPtr refXml; try { refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path(filename), id); } catch(const Gtk::BuilderError& ex) { std::cerr << ex.what() << std::endl; } catch(const Glib::MarkupError& ex) { std::cerr << ex.what() << std::endl; } catch(const Glib::FileError& ex) { std::cerr << ex.what() << std::endl; } if(refXml) { refXml->get_widget(id, widget); } // Make sure that all windows have the Glom icon. // TODO: Though shouldn't all transient windows have this by default, // or should they even be visible in the task list? murrayc Gtk::Window* window = dynamic_cast(widget); if(window) window->set_icon_name("glom"); } } //namespace Utils } //namespace Glom #endif //GLOM_GLADE_UTILS_H glom-1.22.4/glom/dialog_existing_or_new.h0000644000175000017500000001552612234776363021643 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_EXISTING_OR_NEW_H #define GLOM_DIALOG_EXISTING_OR_NEW_H #include "config.h" #include #include // for time_t #include #include #include #include #include #include #include #include #include #include #ifndef G_OS_WIN32 # include #endif namespace Glom { class Dialog_ExistingOrNew : public Gtk::Dialog { public: static const char glade_id[]; static const bool glade_developer; enum Action { NONE, NEW_EMPTY, NEW_FROM_TEMPLATE, OPEN_URI, OPEN_REMOTE }; Dialog_ExistingOrNew(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Dialog_ExistingOrNew(); Action get_action() const; Glib::ustring get_uri() const; // Only when get_action is NEW_FROM_TEMPLATE or OPEN_URI #ifndef G_OS_WIN32 EpcServiceInfo* get_service_info() const; // Only when get_action is OPEN_REMOTE Glib::ustring get_service_name() const; // Only when get_action is OPEN_REMOTE #endif private: Action get_action_impl(Gtk::TreeModel::iterator& iter) const; std::auto_ptr create_dummy_item_existing(const Gtk::TreeModel::iterator& parent, const Glib::ustring& text); void existing_icon_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void existing_title_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void on_switch_page(Gtk::Widget* page, guint page_num); void on_existing_selection_changed(); bool on_existing_select_func(const Glib::RefPtr& model, const Gtk::TreeModel::Path& path, bool path_currently_selected); void update_ui_sensitivity(); #ifndef GLOM_ENABLE_CLIENT_ONLY std::auto_ptr create_dummy_item_new(const Gtk::TreeModel::iterator& parent, const Glib::ustring& text); void on_new_selection_changed(); void new_icon_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void new_title_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); bool on_new_select_func(const Glib::RefPtr& model, const Gtk::TreeModel::Path& path, bool path_currently_selected); void on_new_row_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column); void on_new_button_clicked(const Gtk::TreeModel::Path& path); bool list_examples_at_path(const std::string& path); Glib::ustring get_title_from_example(const Glib::RefPtr& info, const Glib::RefPtr& examples_dir); void append_example(const Glib::ustring& title, const Glib::RefPtr& file); #endif /* !GLOM_ENABLE_CLIENT_ONLY */ #ifndef G_OS_WIN32 static void on_service_found_static(EpcServiceMonitor* monitor, gchar* name, EpcServiceInfo* info, gpointer user_data); static void on_service_removed_static(EpcServiceMonitor* monitor, gchar* name, gchar* type, gpointer user_data); void on_service_found(const Glib::ustring& name, EpcServiceInfo* info); void on_service_removed(const Glib::ustring& name, const Glib::ustring& type); #endif void on_existing_row_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column); void on_existing_button_clicked(const Gtk::TreeModel::Path& path); void on_select_clicked(); Gtk::Notebook* m_notebook; Gtk::Button* m_select_button; class ExistingModelColumns : public Gtk::TreeModel::ColumnRecord { public: ExistingModelColumns() { add(m_col_title); add(m_col_time); #ifndef G_OS_WIN32 add(m_col_service_name); add(m_col_service_info); #endif add(m_col_recent_info); } Gtk::TreeModelColumn m_col_title; Gtk::TreeModelColumn m_col_time; // Sort criteria #ifndef G_OS_WIN32 // For service discovery: Gtk::TreeModelColumn m_col_service_name; Gtk::TreeModelColumn m_col_service_info; #endif // For recently used resources: Gtk::TreeModelColumn< Glib::RefPtr > m_col_recent_info; }; ExistingModelColumns m_existing_columns; Glib::RefPtr m_existing_model; Gtk::TreeView* m_existing_view; #ifndef GLOM_ENABLE_CLIENT_ONLY class NewModelColumns : public Gtk::TreeModel::ColumnRecord { public: NewModelColumns() { add(m_col_title); add(m_col_template_uri); } Gtk::TreeModelColumn m_col_title; Gtk::TreeModelColumn m_col_template_uri; }; NewModelColumns m_new_columns; Gtk::TreeView* m_new_view; Glib::RefPtr m_new_model; Gtk::TreeViewColumn m_new_column_title; Gtk::TreeViewColumn m_new_column_button; Gtk::CellRendererPixbuf m_new_icon_renderer; Gtk::CellRendererText m_new_title_renderer; Gtk::TreeModel::iterator m_iter_new_empty; Gtk::TreeModel::iterator m_iter_new_template; std::auto_ptr m_iter_new_template_dummy; #endif //GLOM_ENABLE_CLIENT_ONLY Gtk::TreeViewColumn m_existing_column_title; Gtk::TreeViewColumn m_existing_column_button; Gtk::CellRendererPixbuf m_existing_icon_renderer; Gtk::CellRendererText m_existing_title_renderer; //Iterators to the parent nodes: Gtk::TreeModel::iterator m_iter_existing_recent; #ifndef G_OS_WIN32 Gtk::TreeModel::iterator m_iter_existing_network; #endif Gtk::TreeModel::iterator m_iter_existing_other; // Dummy children to indicate that a parent item has no (real) children #ifndef G_OS_WIN32 std::auto_ptr m_iter_existing_network_dummy; #endif std::auto_ptr m_iter_existing_recent_dummy; #ifndef GLOM_ENABLE_CLIENT_ONLY struct buffer { static const guint SIZE = 1024; char buf[SIZE]; }; std::auto_ptr m_current_buffer; #endif /* !GLOM_ENABLE_CLIENT_ONLY */ #ifndef G_OS_WIN32 EpcServiceMonitor* m_service_monitor; #endif // URI chosen in the file chooser Glib::ustring m_chosen_uri; }; } //namespace Glom #endif //GLOM_DIALOG_EXISTING_OR_NEW_H glom-1.22.4/glom/navigation/0000755000175000017500000000000012235000127017051 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/navigation/box_tables.cc0000644000175000017500000004401312234776363021531 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include //For bold_message()). #include #include #include #include #include namespace Glom { const char* Box_Tables::glade_id("box_navigation_tables"); const bool Box_Tables::glade_developer(false); Box_Tables::Box_Tables(BaseObjectType* cobject, const Glib::RefPtr& builder) : Box_WithButtons(cobject, builder), m_pCheckButtonShowHidden(0), m_colTableName(0), m_colHidden(0), m_colTitle(0), m_colDefault(0), m_colTitleSingular(0) { //Get the Glade-instantiated widgets, and connect signal handlers: Gtk::Button* pButtonCancel = 0; builder->get_widget("button_cancel_tables", pButtonCancel); set_button_cancel(*pButtonCancel); // Set a name for the AddDel TreeView, so it can be accessed by LDTP m_AddDel.set_treeview_accessible_name("Tables"); Gtk::Alignment* pAligmentPlaceholder = 0; builder->get_widget("alignment_placeholder_adddel", pAligmentPlaceholder); pAligmentPlaceholder->add(m_AddDel); builder->get_widget("checkbutton_show_hidden", m_pCheckButtonShowHidden); m_pCheckButtonShowHidden->signal_toggled().connect(sigc::mem_fun(*this, &Box_Tables::on_show_hidden_toggled)); #ifndef GLOM_ENABLE_CLIENT_ONLY m_AddDel.signal_user_added().connect(sigc::mem_fun(*this, &Box_Tables::on_adddel_Add)); m_AddDel.signal_user_requested_delete().connect(sigc::mem_fun(*this, &Box_Tables::on_adddel_Delete)); m_AddDel.signal_user_changed().connect(sigc::mem_fun(*this, &Box_Tables::on_adddel_changed)); #endif //GLOM_ENABLE_CLIENT_ONLY m_AddDel.signal_user_requested_edit().connect(sigc::mem_fun(*this, &Box_Tables::on_adddel_Edit)); show_all_children(); } Box_Tables::~Box_Tables() { } void Box_Tables::fill_table_row(const Gtk::TreeModel::iterator& iter, const sharedptr& table_info) { if(!table_info) { std::cerr << G_STRFUNC << ": table_info was null." << std::endl; return; } if(iter) { const bool developer_mode = (get_userlevel() == AppState::USERLEVEL_DEVELOPER); m_AddDel.set_value_key(iter, table_info->get_name()); m_AddDel.set_value(iter, m_colTableName, table_info->get_name()); m_AddDel.set_value(iter, m_colHidden, table_info->get_hidden()); if(developer_mode) { //std::cout << "debug: " << G_STRFUNC << ": dev title=" << table_info->get_title(AppWindow::get_current_locale()) << std::endl; m_AddDel.set_value(iter, m_colTitle, item_get_title(table_info)); m_AddDel.set_value(iter, m_colTitleSingular, table_info->get_title_singular(AppWindow::get_current_locale())); } else { //std::cout << "debug: " << G_STRFUNC << ": op get_title_or_name=" << table_info->get_title_or_name(AppWindow::get_current_locale()) << std::endl; m_AddDel.set_value(iter, m_colTitle, item_get_title_or_name(table_info)); } m_AddDel.set_value(iter, m_colDefault, table_info->get_default()); } } bool Box_Tables::fill_from_database() { BusyCursor busy_cursor(AppWindow::get_appwindow()); bool result = Base_DB::fill_from_database(); //Enable/Disable extra widgets: const bool developer_mode = (get_userlevel() == AppState::USERLEVEL_DEVELOPER); //Developers see more columns, so make it bigger: if(developer_mode) set_size_request(400, -1); else set_size_request(-1, -1); m_pCheckButtonShowHidden->set_sensitive(developer_mode); //Operators have no choice - they can't see hidden tables ever. if(!developer_mode) m_pCheckButtonShowHidden->set_active(false); //Operators have no choice - they can't see hidden tables ever. m_AddDel.remove_all(); //Add the columns: m_AddDel.remove_all_columns(); const bool editable = developer_mode; const bool visible_extras = developer_mode; m_colTableName = m_AddDel.add_column(_("Table"), AddDelColumnInfo::STYLE_Text, editable, visible_extras); m_AddDel.prevent_duplicates(m_colTableName); //Prevent two tables with the same name from being added. m_AddDel.set_prevent_duplicates_warning(_("This table already exists. Please choose a different table name")); m_colHidden = m_AddDel.add_column(_("Hidden"), AddDelColumnInfo::STYLE_Boolean, editable, visible_extras); m_colTitle = m_AddDel.add_column(_("Title"), AddDelColumnInfo::STYLE_Text, editable, true); //TODO: This should really be a radio, but the use of AddDel makes it awkward to change that CellRenderer property. m_colDefault = m_AddDel.add_column(_("Default"), AddDelColumnInfo::STYLE_Boolean, editable, visible_extras); if(developer_mode) m_colTitleSingular = m_AddDel.add_column(_("Title (Singular Form)"), AddDelColumnInfo::STYLE_Text, editable, true); //Get the list of hidden tables: Document::type_listTableInfo listTablesDocument; Document* document = get_document(); if(document) { listTablesDocument = document->get_tables(); } else std::cerr << G_STRFUNC << ": document is null" << std::endl; //Get the list of tables in the database, from the server: sharedptr sharedconnection = connect_to_server(AppWindow::get_appwindow()); if(sharedconnection) { m_AddDel.remove_all(); Glib::RefPtr connection = sharedconnection->get_gda_connection(); const type_vec_strings vecTables = DbUtils::get_table_names_from_database(); for(type_vec_strings::const_iterator iter = vecTables.begin(); iter != vecTables.end(); ++iter) { const Glib::ustring strName = *iter; sharedptr table_info; //Check whether it should be hidden: Document::type_listTableInfo::const_iterator iterFind = std::find_if(listTablesDocument.begin(), listTablesDocument.end(), predicate_FieldHasName(strName)); if(iterFind != listTablesDocument.end()) { table_info = *iterFind; //std::cout << "debug: " << G_STRFUNC << ": name=" << (*iterFind)->get_name() << ", item_get_title(table_info)=" << item_get_title(*iterFind) << std::endl; } else { //This table is in the database, but not in the document. //Show it as hidden: table_info = sharedptr(new TableInfo()); table_info->set_name(strName); table_info->set_hidden(true); } const bool hidden = table_info->get_hidden(); bool bAddIt = true; if(hidden && !developer_mode) //Don't add hidden tables unless we are in developer mode: bAddIt = false; if(hidden && !m_pCheckButtonShowHidden->get_active()) //Don't add hidden tables if that checkbox is unset. { bAddIt = false; } //Check whether it's a system table, though they should never be in this list: const Glib::ustring prefix = "glom_system_"; const Glib::ustring table_prefix = strName.substr(0, prefix.size()); if(table_prefix == prefix) bAddIt = false; if(bAddIt) { Gtk::TreeModel::iterator iter = m_AddDel.add_item(strName); fill_table_row(iter, table_info); } } } m_AddDel.set_allow_add(developer_mode); m_AddDel.set_allow_delete(developer_mode); return result; } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Tables::on_adddel_Add(const Gtk::TreeModel::iterator& row) { //TODO: Handle cell renderer changes to prevent illegal table names (e.g. starting with numbers.). const Glib::ustring table_name = m_AddDel.get_value(row, m_colTableName); if(table_name.empty()) return; bool created = false; //Check whether it exists already. (Maybe it is somehow in the database but not in the document. That shouldn't happen.) const bool exists_in_db = DbUtils::get_table_exists_in_database(table_name); if(exists_in_db) { //Ask the user if they want us to try to cope with this: Gtk::MessageDialog dialog(Utils::bold_message(_("Table Already Exists")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); dialog.set_secondary_text(_("This table already exists on the database server, though it is not mentioned in the .glom file. This should not happen. Would you like Glom to attempt to use the existing table?")); dialog.set_transient_for(*AppWindow::get_appwindow()); const int response = dialog.run(); dialog.hide(); if(response == Gtk::RESPONSE_OK) { //Maybe Glom will cope with whatever fields are there. Let's see. created = true; } } else { created = DbUtils::create_table_with_default_fields(get_document(), table_name); } if(created) { //Show the new information for this whole row: Document* document = get_document(); if(document) { sharedptr table_info = document->get_table(table_name); fill_table_row(row, table_info); //Save the field information directly into the database, because we cannot get all the correct information from the database. //Otherwise some information would be forgotten: type_vec_fields fields = document->get_table_fields(table_name); document->set_table_fields(table_name, fields); //TODO: Just let create_table_with_default_fields() update the document, and then reload the row. } save_to_document(); //fill_from_database(); //We should not modify the model structure in a cellrenderer signal handler. } } void Box_Tables::on_adddel_Delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& rowEnd) { Gtk::TreeModel::iterator iterAfter = rowEnd; ++iterAfter; bool something_changed = false; for(Gtk::TreeModel::iterator iter = rowStart; iter != iterAfter; ++iter) { const Glib::ustring table_name = m_AddDel.get_value_key(iter); if(!table_name.empty()) { Document* document = get_document(); if(document) { //Don't open a table that the document does not know about, because we need information from the document: if(!document->get_table_is_known(table_name)) { //TODO: Do not show tables that are not in the document. Gtk::MessageDialog dialog(_("You cannot delete this table, because there is no information about this table in the document.")); dialog.set_transient_for(*AppWindow::get_appwindow()); dialog.run(); } else { //Ask the user to confirm: const Glib::ustring strMsg = Glib::ustring::compose(_("Are you sure that you want to delete this table?\nTable name: %1"), table_name); Gtk::MessageDialog dialog(Utils::bold_message(_("Delete Table")), true); dialog.set_secondary_text(strMsg); dialog.set_transient_for(*AppWindow::get_appwindow()); const int iButtonClicked = dialog.run(); //Get a list of autoincrementing fields in the table: const Glom::Document::type_vec_fields fields = document->get_table_fields(table_name); //Delete the table: if(iButtonClicked == Gtk::RESPONSE_OK) { const bool test = DbUtils::drop_table(table_name); if(!test) std::cerr << G_STRFUNC << ": DROP TABLE failed." << std::endl; else { //Forget about it in the document too. get_document()->remove_table(table_name); something_changed = true; } //Remove the auto-increment rows. //Otherwise it would not start at 0 if a table with the same name, and same field, is added again later. for(Glom::Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++iter) { const Glom::sharedptr field = *iter; if(!field || !field->get_auto_increment()) continue; const Glib::ustring field_name = field->get_name(); if(!field_name.empty()) DbUtils::remove_auto_increment(table_name, field_name); else { std::cerr << G_STRFUNC << ": field_name is empty" << std::endl; } } } } } } } if(something_changed) { save_to_document(); fill_from_database(); } } void Box_Tables::on_adddel_changed(const Gtk::TreeModel::iterator& row, guint column) { if(get_userlevel() == AppState::USERLEVEL_DEVELOPER) { if(column == m_colHidden) { save_to_document(); //TODO: This causes a crash. fill_from_database(); //Hide/show the table. } else if(column == m_colTitle) { save_to_document(); } else if(column == m_colTitleSingular) { save_to_document(); } else if(column == m_colDefault) { //Only one table can be the default, so ensure that: const bool is_default = m_AddDel.get_value_as_bool(row, m_colDefault); if(is_default) { //Set all the other rows to false: Glib::RefPtr model = m_AddDel.get_model(); for(Gtk::TreeModel::iterator iter = model->children().begin(); iter != model->children().end(); ++iter) { if(iter != row) m_AddDel.set_value(iter, m_colDefault, false); } } save_to_document(); } else if(column == m_colTableName) { Glib::ustring table_name = m_AddDel.get_value_key(row); Glib::ustring table_name_new = m_AddDel.get_value(row, m_colTableName); if(!table_name.empty() && !table_name_new.empty()) { Glib::ustring strMsg = _("Are you sure that you want to rename this table?"); //TODO: Show old and new names? Gtk::MessageDialog dialog(_("Rename Table"), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE ); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Rename"), Gtk::RESPONSE_OK); dialog.set_secondary_text(strMsg); int iButtonClicked = dialog.run(); //Rename the table: if(iButtonClicked == Gtk::RESPONSE_OK) { const bool test = DbUtils::rename_table(table_name, table_name_new); if(test) { //Change the AddDel item's key: m_AddDel.set_value_key(row, table_name_new); set_modified(); //Tell the document that this table's name has changed: Document* document = get_document(); if(document) document->change_table_name(table_name, table_name_new); //fill_from_database(); //We should not modify the model structure in a cellrenderer signal handler. } } } } } } #endif //GLOM_ENABLE_CLIENT_ONLY void Box_Tables::on_adddel_Edit(const Gtk::TreeModel::iterator& row) { Glib::ustring table_name = m_AddDel.get_value_key(row); Document* document = get_document(); if(document) { //Don't open a table that the document does not know about, because we need information from the document: //This should never happen, because we never show them in the list: if(false) //Let's see if we can adapt. (!document->get_table_is_known(table_name)) { Gtk::MessageDialog dialog(Utils::bold_message(_("Unknown Table")), true); dialog.set_secondary_text(_("You cannot open this table, because there is no information about this table in the document.")); dialog.set_transient_for(*AppWindow::get_appwindow()); dialog.run(); } else { //Go ahead: save_to_document(); //Emit the signal: signal_selected.emit(table_name); } } } #ifndef GLOM_ENABLE_CLIENT_ONLY void Box_Tables::save_to_document() { if(get_userlevel() == AppState::USERLEVEL_DEVELOPER) { //Save the hidden tables. TODO_usermode: Only if we are in developer mode. Document::type_listTableInfo listTables; Document* document = get_document(); for(Gtk::TreeModel::iterator iter = m_AddDel.get_model()->children().begin(); iter != m_AddDel.get_model()->children().end(); ++iter) { const Glib::ustring table_name = m_AddDel.get_value(iter, m_colTableName); //The name has already been changed in the document. sharedptr table_info = document->get_table(table_name); //Start with the existing table_info, to preserve extra information, such as translations. if(table_info) { table_info->set_name( m_AddDel.get_value(iter, m_colTableName) ); if(!table_info->get_name().empty()) { table_info->set_hidden( m_AddDel.get_value_as_bool(iter, m_colHidden) ); table_info->set_title( m_AddDel.get_value(iter, m_colTitle) , AppWindow::get_current_locale()); //TODO_Translations: Store the TableInfo in the TreeView. table_info->set_title_singular( m_AddDel.get_value(iter, m_colTitleSingular), AppWindow::get_current_locale()); //TODO_Translations: Store the TableInfo in the TreeView. //std::cout << "debug: " << G_STRFUNC << ": title=" << item_get_title(table_info) << std::endl; table_info->set_default( m_AddDel.get_value_as_bool(iter, m_colDefault) ); listTables.push_back(table_info); } } } if(document) document->set_tables(listTables); //TODO: Don't save all new tables - just the ones already in the document. } } #endif //GLOM_ENABLE_CLIENT_ONLY void Box_Tables::on_show_hidden_toggled() { fill_from_database(); } void Box_Tables::on_userlevel_changed(AppState::userlevels /* userlevel */) { fill_from_database(); } } //namespace Glom glom-1.22.4/glom/navigation/box_tables.h0000644000175000017500000000453112234252646021365 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef BOX_TABLES_H #define BOX_TABLES_H #include #include #include #include #include namespace Glom { /** This widget offers a list of tables in the database, * allowing the user to select a table, * or add or delete a table. */ class Box_Tables : public Box_WithButtons, public Base_DB { public: static const char* glade_id; static const bool glade_developer; Box_Tables(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Box_Tables(); private: bool fill_from_database(); //override void fill_table_row(const Gtk::TreeModel::iterator& iter, const sharedptr& table_info); //Signal handlers: #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void save_to_document(); void on_adddel_Add(const Gtk::TreeModel::iterator& row); void on_adddel_Delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& rowEnd); void on_adddel_changed(const Gtk::TreeModel::iterator& row, guint column); #endif //GLOM_ENABLE_CLIENT_ONLY void on_adddel_Edit(const Gtk::TreeModel::iterator& row); void on_show_hidden_toggled(); virtual void on_userlevel_changed(AppState::userlevels userlevel); Gtk::CheckButton* m_pCheckButtonShowHidden; guint m_colTableName; guint m_colHidden; guint m_colTitle; guint m_colDefault; guint m_colTitleSingular; mutable AddDel_WithButtons m_AddDel; //mutable because its get_ methods aren't const. }; } //namespace Glom #endif //BOX_TABLES_H glom-1.22.4/glom/base_db.h0000644000175000017500000003320012234252645016455 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef BASE_DB_H #define BASE_DB_H #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Glom { class LayoutItem_GroupBy; class LayoutItem_Summary; class LayoutItem_VerticalGroup; /** A base class that is a Bakery View with some database functionality. */ class Base_DB : public View_Composite_Glom { public: Base_DB(); virtual ~Base_DB(); /// Specify the structure of what will be shown, and fill it. bool init_db_details(); /** Returns whether we are in developer mode. * Some functionality will be deactivated when not in developer mode. */ virtual AppState::userlevels get_userlevel() const; virtual void set_userlevel(AppState::userlevels value); static sharedptr connect_to_server(Gtk::Window* parent_window = 0); virtual void set_document(Document* pDocument); //View override virtual void load_from_document(); //View override sharedptr change_column(const Glib::ustring& table_name, const sharedptr& field_old, const sharedptr& field, Gtk::Window* parent_window) const; typedef std::vector< sharedptr > type_vec_fields; typedef std::vector< sharedptr > type_vec_const_fields; #ifndef GLOM_ENABLE_CLIENT_ONLY bool change_columns(const Glib::ustring& table_name, const type_vec_const_fields& old_fields, type_vec_fields& fields, Gtk::Window* parent_window) const; #endif //GLOM_ENABLE_CLIENT_ONLY //TODO: This is not a very good place for this function. /// Get the active layout platform for the document, or get a suitable default. static Glib::ustring get_active_layout_platform(Document* document); typedef std::vector< sharedptr > type_vecLayoutFields; typedef std::vector< sharedptr > type_vecConstLayoutFields; protected: typedef std::list< sharedptr > type_list_field_items; typedef std::list< sharedptr > type_list_const_field_items; #ifndef GLOM_ENABLE_CLIENT_ONLY /** Allow the user to select a field from the list of fields for the table. */ sharedptr offer_field_list_select_one_field(const Glib::ustring& table_name, Gtk::Window* transient_for = 0); /** Allow the user to select a field from the list of fields for the table, * with @a start_field selected by default. */ sharedptr offer_field_list_select_one_field(const sharedptr& start_field, const Glib::ustring& table_name, Gtk::Window* transient_for = 0); /** Allow the user to select fields from the list of fields for the table. */ type_list_field_items offer_field_list(const Glib::ustring& table_name, Gtk::Window* transient_for = 0); sharedptr offer_field_formatting(const sharedptr& start_field, const Glib::ustring& table_name, Gtk::Window* transient_for, bool show_editable_options = true); /** Offer generic formatting for a @a layout_item, starting with its current options. * @result true if the user changed some formatting for the items. */ bool offer_non_field_item_formatting(const sharedptr& layout_item, Gtk::Window* transient_for = 0); sharedptr offer_textobject(const sharedptr& start_textobject, Gtk::Window* transient_for = 0, bool show_title = true); sharedptr offer_imageobject(const sharedptr& start_imageobject, Gtk::Window* transient_for = 0, bool show_title = true); sharedptr offer_notebook(const sharedptr& start_notebook, Gtk::Window* transient_for = 0); #endif // !GLOM_ENABLE_CLIENT_ONLY bool get_relationship_exists(const Glib::ustring& table_name, const Glib::ustring& relationship_name); sharedptr get_field_primary_key_for_table(const Glib::ustring& table_name) const; //Methods to be overridden by derived classes: virtual void set_entered_field_data(const sharedptr& field, const Gnome::Gda::Value& value); virtual void set_entered_field_data(const Gtk::TreeModel::iterator& row, const sharedptr& field, const Gnome::Gda::Value& value); class FieldInRecord { public: FieldInRecord() {} FieldInRecord(const Glib::ustring& table_name, const sharedptr& field, const sharedptr& key, const Gnome::Gda::Value& key_value) : m_table_name(table_name), m_field(field), m_key(key), m_key_value(key_value) { } FieldInRecord(const sharedptr& layout_item, const Glib::ustring& parent_table_name, const sharedptr& parent_key, const Gnome::Gda::Value& key_value, const Document& document) : m_key_value(key_value) { m_field = layout_item->get_full_field_details(); m_table_name = layout_item->get_table_used(parent_table_name); //The key: if(layout_item->get_has_relationship_name()) { //The field is in a related table. sharedptr rel = layout_item->get_relationship(); if(rel) { if(layout_item->get_has_related_relationship_name()) //For doubly-related fields { sharedptr rel = layout_item->get_related_relationship(); if(rel) { //Actually a foreign key in a doubly-related table: m_key = document.get_field(m_table_name, rel->get_to_field()); } } else { //Actually a foreign key: m_key = document.get_field(m_table_name, rel->get_to_field()); } } } else { m_key = parent_key; } } //Identify the field: Glib::ustring m_table_name; sharedptr m_field; //Identify the record: sharedptr m_key; Gnome::Gda::Value m_key_value; }; class LayoutFieldInRecord { public: LayoutFieldInRecord() {} LayoutFieldInRecord(const sharedptr& layout_item, const Glib::ustring& parent_table_name, const sharedptr& parent_key, const Gnome::Gda::Value& key_value) : m_key_value(key_value) { m_field = layout_item; m_table_name = parent_table_name; m_key = parent_key; } FieldInRecord get_fieldinrecord(const Document& document) const { return FieldInRecord(m_field, m_table_name, m_key, m_key_value, document); } //Identify the field: Glib::ustring m_table_name; sharedptr m_field; //Identify the record: sharedptr m_key; Gnome::Gda::Value m_key_value; }; /** Calculate values for fields, set them in the database, and show them in the layout. * @param field_changed The field that has changed, causing other fields to be recalculated because they use its value. * @param primary_key The primary key field for this table. * @param priamry_key_value: The primary key value for this record. * @param first_calc_field: false if this is called recursively. */ void do_calculations(const LayoutFieldInRecord& field_changed, bool first_calc_field); typedef std::map type_field_calcs; /** Get the fields whose values should be recalculated when @a field_name changes. */ type_list_const_field_items get_calculated_fields(const Glib::ustring& table_name, const sharedptr& field); /** Get the fields used, if any, in the calculation of this field. */ type_list_const_field_items get_calculation_fields(const Glib::ustring& table_name, const sharedptr& field); void calculate_field(const LayoutFieldInRecord& field_in_record); void calculate_field_in_all_records(const Glib::ustring& table_name, const sharedptr& field); void calculate_field_in_all_records(const Glib::ustring& table_name, const sharedptr& field, const sharedptr& primary_key); typedef std::map type_map_fields; //TODO: Performance: This is massively inefficient: type_map_fields get_record_field_values_for_calculation(const Glib::ustring& table_name, const sharedptr primary_key, const Gnome::Gda::Value& primary_key_value); void do_lookups(const LayoutFieldInRecord& field_in_record, const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& field_value); virtual void refresh_related_fields(const LayoutFieldInRecord& field_in_record_changed, const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& field_value); bool set_field_value_in_database(const LayoutFieldInRecord& field_in_record, const Gnome::Gda::Value& field_value, bool use_current_calculations = false, Gtk::Window* parent_window = 0); bool set_field_value_in_database(const LayoutFieldInRecord& field_in_record, const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& field_value, bool use_current_calculations = false, Gtk::Window* parent_window = 0); ///Get a single field value from the database. Gnome::Gda::Value get_field_value_in_database(const LayoutFieldInRecord& field_in_record, Gtk::Window* parent_window); ///Get a single field value from the database. Gnome::Gda::Value get_field_value_in_database(const sharedptr& field, const FoundSet& found_set, Gtk::Window* parent_window); bool get_field_value_is_unique(const Glib::ustring& table_name, const sharedptr& field, const Gnome::Gda::Value& value); bool check_entered_value_for_uniqueness(const Glib::ustring& table_name, const sharedptr& field, const Gnome::Gda::Value& value, Gtk::Window* parent_window); bool check_entered_value_for_uniqueness(const Glib::ustring& table_name, const Gtk::TreeModel::iterator& /* row */, const sharedptr& field, const Gnome::Gda::Value& value, Gtk::Window* parent_window); //TODO: Make this private? /** Fill the UI with information (data or structure, depending on the widget). * Overridden by derived widgets to provide implementation. */ virtual bool fill_from_database(); virtual void on_userlevel_changed(AppState::userlevels userlevel); type_vecConstLayoutFields get_table_fields_to_show_for_sequence(const Glib::ustring& table_name, const Document::type_list_layout_groups& mapGroupSequence) const; void get_table_fields_to_show_for_sequence_add_group(const Glib::ustring& table_name, const Privileges& table_privs, const type_vec_fields& all_db_fields, const sharedptr& group, type_vecConstLayoutFields& vecFields) const; bool get_primary_key_is_in_foundset(const FoundSet& found_set, const Gnome::Gda::Value& primary_key_value); /** A utility function to set the where_clause, even for doubly-related records. * * @param found_set The FoundSet to change. * @param portal The related records portal whose records should be selected by the SQL query. * @param foreign_key_value The value of the from field in the parent table. */ void set_found_set_where_clause_for_portal(FoundSet& found_set, const sharedptr& portal, const Gnome::Gda::Value& foreign_key_value); static Glib::RefPtr get_connection(); static bool get_field_primary_key_index_for_fields(const type_vec_fields& fields, guint& field_column); static bool get_field_primary_key_index_for_fields(const type_vecLayoutFields& fields, guint& field_column); typedef std::vector type_vec_strings; static type_vec_strings util_vecStrings_from_Fields(const type_vec_fields& fields); bool set_database_owner_user(const Glib::ustring& user); /** Revoke any login rights from the user and remove it from any groups. * This is a workaround for these problems: * 1. We can only specify a superuser _user_, not a role, to initdb (because it needs a password, but groups have no password), * so that user is then the owner of various objects. * 2. Even when changing the owner of these objects we still get this error "cannot drop role glom_default_developer_user because it is required by the database system" */ bool disable_user(const Glib::ustring& user); static void handle_error(const Glib::Exception& ex); static void handle_error(const std::exception& ex); //TODO_port: This is probably useless now. static bool handle_error(); protected: type_field_calcs m_FieldsCalculationInProgress; //Prevent circular calculations and recalculations. }; } //namespace Glom #endif //BASE_DB_H glom-1.22.4/glom/base_db_table_data.cc0000644000175000017500000005204312234776363020771 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include "base_db_table_data.h" #include #include #include #include #include #include #include #include #include namespace Glom { Base_DB_Table_Data::Base_DB_Table_Data() { } Base_DB_Table_Data::~Base_DB_Table_Data() { } Gnome::Gda::Value Base_DB_Table_Data::get_entered_field_data_field_only(const sharedptr& field) const { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(field); return get_entered_field_data(layout_item); } Gnome::Gda::Value Base_DB_Table_Data::get_entered_field_data(const sharedptr& /* field */) const { //Override this to use Field::set_data() too. return Gnome::Gda::Value(); //null } Gtk::TreeModel::iterator Base_DB_Table_Data::get_row_selected() { //This in meaningless for Details, //but is overridden for list views. return Gtk::TreeModel::iterator(); } bool Base_DB_Table_Data::record_new(bool use_entered_data, const Gnome::Gda::Value& primary_key_value) { //std::cout << G_STRFUNC << ": debug: use_entered_data=" << use_entered_data << std::endl; Document* document = get_document(); sharedptr fieldPrimaryKey = get_field_primary_key(); const Glib::ustring primary_key_name = fieldPrimaryKey->get_name(); type_vecConstLayoutFields fieldsToAdd = m_FieldsShown; if(m_TableFields.empty()) m_TableFields = DbUtils::get_fields_for_table(document, m_table_name); //Add values for all fields, not just the shown ones: //For instance, we must always add the primary key, and fields with default/calculated/lookup/auto-incremented values: for(type_vec_fields::const_iterator iter = m_TableFields.begin(); iter != m_TableFields.end(); ++iter) { //TODO: Search for the non-related field with the name, not just the field with the name: type_vecConstLayoutFields::const_iterator iterFind = std::find_if(fieldsToAdd.begin(), fieldsToAdd.end(), predicate_FieldHasName((*iter)->get_name())); if(iterFind == fieldsToAdd.end()) { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(*iter); fieldsToAdd.push_back(layout_item); } } //Get all entered field name/value pairs: Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_INSERT); builder->set_table(m_table_name); //Avoid specifying the same field twice: typedef std::map type_map_added; type_map_added map_added; Glib::RefPtr params = Gnome::Gda::Set::create(); for(type_vecConstLayoutFields::const_iterator iter = fieldsToAdd.begin(); iter != fieldsToAdd.end(); ++iter) { sharedptr layout_item = *iter; const Glib::ustring field_name = layout_item->get_name(); if(!layout_item->get_has_relationship_name()) //TODO: Allow people to add a related record also by entering new data in a related field of the related record. { type_map_added::const_iterator iterFind = map_added.find(field_name); if(iterFind == map_added.end()) //If it was not added already { Gnome::Gda::Value value; const sharedptr& field = layout_item->get_full_field_details(); if(!field) continue; //Use the specified (generated) primary key value, if there is one: if(primary_key_name == field_name && !Conversions::value_is_empty(primary_key_value)) { value = primary_key_value; } else { if(use_entered_data) value = get_entered_field_data(layout_item); } if(Conversions::value_is_empty(value)) //This deals with empty strings too. { //If the default value should be calculated, then calculate it: if(field->get_has_calculation()) { const Glib::ustring calculation = field->get_calculation(); const type_map_fields field_values = get_record_field_values_for_calculation(m_table_name, fieldPrimaryKey, primary_key_value); //We need the connection when we run the script, so that the script may use it. // TODO: Is this function supposed to throw an exception? sharedptr sharedconnection = connect_to_server(AppWindow::get_appwindow()); Glib::ustring error_message; //TODO: Check this. value = glom_evaluate_python_function_implementation( field->get_glom_type(), calculation, field_values, document, m_table_name, fieldPrimaryKey, primary_key_value, sharedconnection->get_gda_connection(), error_message); } } //Use default values (These are also specified in postgres as part of the field definition, //so we could theoretically just not specify it here.) //TODO_Performance: Add has_default_value()? if(Conversions::value_is_empty(value)) { value = field->get_default_value(); } //Use auto-increment values: if(field->get_auto_increment() && Conversions::value_is_empty(value)) { value = DbUtils::get_next_auto_increment_value(m_table_name, field->get_name()); } /* //TODO: This would be too many small queries when adding one record. //Check whether the value meets uniqueness constraints: if(field->get_primary_key() || field->get_unique_key()) { if(!get_field_value_is_unique(m_table_name, layout_item, value)) { //Ignore this field value. TODO: Warn the user about it. } } */ if(!value.is_null()) { builder->add_field_value(field_name, value); map_added[field_name] = true; } else { std::cerr << G_STRFUNC << ": value is null for field: " << field_name << std::endl; } } } } //Put it all together to create the record with these field values: if(!map_added.empty()) { const bool test = DbUtils::query_execute(builder); if(!test) std::cerr << G_STRFUNC << ": INSERT failed." << std::endl; else { Gtk::TreeModel::iterator row = get_row_selected(); //Null and ignored for details views. set_primary_key_value(row, primary_key_value); //Needed by Box_Data_List::on_adddel_user_changed(). //Update any lookups, related fields, or calculations: for(type_vecConstLayoutFields::const_iterator iter = fieldsToAdd.begin(); iter != fieldsToAdd.end(); ++iter) { sharedptr layout_item = *iter; //TODO_Performance: We just set this with set_entered_field_data() above. Maybe we could just remember it. const Gnome::Gda::Value field_value = get_entered_field_data(layout_item); const LayoutFieldInRecord field_in_record(layout_item, m_table_name, fieldPrimaryKey, primary_key_value); //Get-and-set values for lookup fields, if this field triggers those relationships: do_lookups(field_in_record, row, field_value); //Update related fields, if this field is used in the relationship: refresh_related_fields(field_in_record, row, field_value); //TODO: Put the inserted row into result, somehow? murrayc return true; //success } } } else std::cerr << G_STRFUNC << ": Empty field names or values." << std::endl; return false; //Failed. } bool Base_DB_Table_Data::add_related_record_for_field(const sharedptr& layout_item_parent, const sharedptr& relationship, const sharedptr& primary_key_field, const Gnome::Gda::Value& primary_key_value_provided, Gnome::Gda::Value& primary_key_value_used) { Gnome::Gda::Value primary_key_value = primary_key_value_provided; const bool related_record_exists = get_related_record_exists(relationship, primary_key_value); if(related_record_exists) { //No problem, the SQL command below will update this value in the related table. primary_key_value_used = primary_key_value; //Let the caller know what related record was created. return true; } //To store the entered data in the related field, we would first have to create a related record. if(!relationship->get_auto_create()) { //Warn the user: //TODO: Make the field insensitive until it can receive data, so people never see this dialog. const Glib::ustring message = _("Data may not be entered into this related field, because the related record does not yet exist, and the relationship does not allow automatic creation of new related records."); Gtk::MessageDialog dialog(Utils::bold_message(_("Related Record Does Not Exist")), true); dialog.set_secondary_text(message); dialog.set_transient_for(*AppWindow::get_appwindow()); dialog.run(); //Clear the field again, discarding the entered data. set_entered_field_data(layout_item_parent, Gnome::Gda::Value()); return false; } else { const bool key_is_auto_increment = primary_key_field->get_auto_increment(); //If we would have to set an otherwise auto-increment key to add the record. if( key_is_auto_increment && !Conversions::value_is_empty(primary_key_value) ) { //Warn the user: //TODO: Make the field insensitive until it can receive data, so people never see this dialog. const Glib::ustring message = _("Data may not be entered into this related field, because the related record does not yet exist, and the key in the related record is auto-generated and therefore can not be created with the key value in this record."); Gtk::MessageDialog dialog(Utils::bold_message(_("Related Record Cannot Be Created")), true); //TODO: This is a very complex error message: dialog.set_secondary_text(message); dialog.set_transient_for(*AppWindow::get_appwindow()); dialog.run(); //Clear the field again, discarding the entered data. set_entered_field_data(layout_item_parent, Gnome::Gda::Value()); return false; } else { //TODO: Calculate values, and do lookups? //Create the related record: if(key_is_auto_increment) { primary_key_value = DbUtils::get_next_auto_increment_value(relationship->get_to_table(), primary_key_field->get_name()); //Generate the new key value; } Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_INSERT); builder->set_table(relationship->get_to_table()); builder->add_field_value(primary_key_field->get_name(), primary_key_value); const bool test = DbUtils::query_execute(builder); if(!test) { std::cerr << G_STRFUNC << ": INSERT failed." << std::endl; return false; } if(key_is_auto_increment) { //Set the key in the parent table sharedptr item_from_key = sharedptr::create(); item_from_key->set_name(relationship->get_from_field()); //Show the new from key in the parent table's layout: set_entered_field_data(item_from_key, primary_key_value); //Set it in the database too: Document* document = get_document(); sharedptr field_from_key = DbUtils::get_fields_for_table_one_field(document, relationship->get_from_table(), relationship->get_from_field()); //TODO_Performance. if(!field_from_key) { std::cerr << G_STRFUNC << ": get_fields_for_table_one_field() failed." << std::endl; return false; } sharedptr parent_primary_key_field = get_field_primary_key(); if(!parent_primary_key_field) { std::cerr << G_STRFUNC << ": get_field_primary_key() failed. table = " << get_table_name() << std::endl; return false; } else { const Gnome::Gda::Value parent_primary_key_value = get_primary_key_value_selected(); if(parent_primary_key_value.is_null()) { std::cerr << G_STRFUNC << ": get_primary_key_value_selected() failed. table = " << get_table_name() << std::endl; return false; } else { const Glib::ustring target_table = relationship->get_from_table(); Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE); builder->set_table(target_table); builder->add_field_value_as_value(relationship->get_from_field(), primary_key_value); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(parent_primary_key_field->get_name(), target_table), builder->add_expr(parent_primary_key_value)) ); const bool test = DbUtils::query_execute(builder); if(!test) { std::cerr << G_STRFUNC << ": UPDATE failed." << std::endl; return false; } } } } primary_key_value_used = primary_key_value; //Let the caller know what related record was created. return true; } } } void Base_DB_Table_Data::on_record_added(const Gnome::Gda::Value& /* primary_key_value */, const Gtk::TreeModel::iterator& /* row */) { //Overridden by some derived classes. signal_record_changed().emit(); } void Base_DB_Table_Data::on_record_deleted(const Gnome::Gda::Value& /* primary_key_value */) { //Overridden by some derived classes. signal_record_changed().emit(); } bool Base_DB_Table_Data::confirm_delete_record() { //Ask the user for confirmation: const Glib::ustring message = _("Are you sure that you would like to delete this record? The data in this record will then be permanently lost."); Gtk::MessageDialog dialog(Utils::bold_message(_("Delete record")), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE); dialog.set_secondary_text(message); dialog.set_transient_for(*AppWindow::get_appwindow()); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::DELETE, Gtk::RESPONSE_OK); const int response = dialog.run(); return (response == Gtk::RESPONSE_OK); } bool Base_DB_Table_Data::record_delete(const Gnome::Gda::Value& primary_key_value) { sharedptr field_primary_key = get_field_primary_key(); if(field_primary_key && !Conversions::value_is_empty(primary_key_value)) { Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_DELETE); builder->set_table(m_table_name); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(field_primary_key->get_name(), m_table_name), builder->add_expr(primary_key_value)) ); return DbUtils::query_execute(builder); } else { return false; //no primary key } } Base_DB_Table_Data::type_signal_record_changed Base_DB_Table_Data::signal_record_changed() { return m_signal_record_changed; } bool Base_DB_Table_Data::get_related_record_exists(const sharedptr& relationship, const Gnome::Gda::Value& key_value) { BusyCursor cursor(AppWindow::get_appwindow()); bool result = false; //Don't try doing a NULL=NULL or ""="" relationship: if(Glom::Conversions::value_is_empty(key_value)) return false; //TODO_Performance: It's very possible that this is slow. //We don't care how many records there are, only whether there are more than zero. const Glib::ustring to_field = relationship->get_to_field(); const Glib::ustring related_table = relationship->get_to_table(); //TODO_Performance: Is this the best way to just find out whether there is one record that meets this criteria? Glib::RefPtr builder = Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT); builder->select_add_field(to_field, related_table); builder->select_add_target(related_table); builder->set_where( builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ, builder->add_field_id(to_field, related_table), builder->add_expr(key_value))); Glib::RefPtr records = DbUtils::query_execute_select(builder); if(!records) handle_error(); else { //Field contents: if(records->get_n_rows()) result = true; } return result; } /** Get the shown fields that are in related tables, via a relationship using @a field_name changes. */ Base_DB_Table_Data::type_vecConstLayoutFields Base_DB_Table_Data::get_related_fields(const sharedptr& field) const { type_vecConstLayoutFields result; const Document* document = dynamic_cast(get_document()); if(document) { const Glib::ustring field_name = field->get_name(); //At the moment, relationships can not be based on related fields on the from side. for(type_vecConstLayoutFields::const_iterator iter = m_FieldsShown.begin(); iter != m_FieldsShown.end(); ++iter) { const sharedptr layout_field = *iter; //Examine each field that looks up its data from a relationship: if(layout_field->get_has_relationship_name()) { //Get the relationship information: sharedptr relationship = document->get_relationship(m_table_name, layout_field->get_relationship_name()); if(relationship) { //If the relationship uses the specified field: if(relationship->get_from_field() == field_name) { //Add it: result.push_back(layout_field); } } } } } return result; } void Base_DB_Table_Data::refresh_related_fields(const LayoutFieldInRecord& field_in_record_changed, const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& /* field_value */) { //std::cout << "DEBUG: Base_DB_Table_Data::refresh_related_fields()" << std::endl; if(field_in_record_changed.m_table_name != m_table_name) return; //TODO: Handle these too? //Get values for lookup fields, if this field triggers those relationships: //TODO_performance: There is a LOT of iterating and copying here. //const Glib::ustring strFieldName = field_in_record_changed.m_field->get_name(); type_vecConstLayoutFields fieldsToGet = get_related_fields(field_in_record_changed.m_field); if(!fieldsToGet.empty()) { Glib::RefPtr query = Utils::build_sql_select_with_key(field_in_record_changed.m_table_name, fieldsToGet, field_in_record_changed.m_key, field_in_record_changed.m_key_value); //std::cout << "debug: " << G_STRFUNC << ": query=" << query << std::endl; Glib::RefPtr result = DbUtils::query_execute_select(query); if(!result) { std::cerr << G_STRFUNC << ": no result." << std::endl; handle_error(); } else { //Field contents: if(result->get_n_rows()) { type_vecConstLayoutFields::const_iterator iterFields = fieldsToGet.begin(); const guint cols_count = result->get_n_columns(); if(cols_count <= 0) { std::cerr << G_STRFUNC << ": The result had 0 columns" << std::endl; } for(guint uiCol = 0; uiCol < cols_count; ++uiCol) { const Gnome::Gda::Value value = result->get_value_at(uiCol, 0 /* row */); sharedptr layout_item = *iterFields; if(!layout_item) std::cerr << G_STRFUNC << ": The layout_item was null." << std::endl; else { //std::cout << "debug: " << G_STRFUNC << ": field_name=" << layout_item->get_name() << std::endl; //std::cout << "debug: " << G_STRFUNC << ": value_as_string=" << value.to_string() << std::endl; //m_AddDel.set_value(row, layout_item, value); set_entered_field_data(row, layout_item, value); //g_warning("addedel size=%d", m_AddDel.get_count()); } ++iterFields; } } else std::cerr << G_STRFUNC << ": no records found." << std::endl; } } } } //namespace Glom glom-1.22.4/glom/dialog_invalid_data.cc0000644000175000017500000000547612234252645021210 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_invalid_data.h" #include #include #include namespace Glom { const char Dialog_InvalidData::glade_id[] = "dialog_data_invalid_format"; const bool Dialog_InvalidData::glade_developer(false); /** Show the dialog. * @result true if the data in the field should be reverted. */ bool glom_show_dialog_invalid_data(Field::glom_field_type glom_type) { Dialog_InvalidData* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return false; dialog->set_example_data(glom_type); //dialog->set_transient_for(*this); const int response = Glom::Utils::dialog_run_with_help(dialog); delete dialog; return (response == 2); //The glade file has a response of 2 for the Revert button. } Dialog_InvalidData::Dialog_InvalidData(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_label(0) { builder->get_widget("label_example_data", m_label); } Dialog_InvalidData::~Dialog_InvalidData() { } void Dialog_InvalidData::set_example_data(Field::glom_field_type glom_type) { Glib::ustring example_text; switch(glom_type) { case(Field::TYPE_DATE): { Glib::Date date(31, Glib::Date::JANUARY, 2005); example_text = Conversions::get_text_for_gda_value(glom_type, Gnome::Gda::Value(date)); break; } case(Field::TYPE_TIME): { Gnome::Gda::Time time = {0, 0, 0, 0, 0}; time.hour = 13; time.minute = 02; time.second = 03; example_text = Conversions::get_text_for_gda_value(glom_type, Gnome::Gda::Value(time)); break; } case(Field::TYPE_NUMERIC): { Gnome::Gda::Value gda_value(12345678.91); example_text = Conversions::get_text_for_gda_value(glom_type, gda_value); break; } case(Field::TYPE_TEXT): default: { example_text = "Abcdefghi jklmnopq lmnopqr"; break; } } if(m_label) m_label->set_text(example_text); } } //namespace Glom glom-1.22.4/glom/import_csv/0000755000175000017500000000000012235000126017076 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/import_csv/file_encodings.cc0000644000175000017500000001011512234252645022371 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2009 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ //#include "config.h" //For ISO_CODES_PREFIX. #include #include #include namespace Glom { namespace FileEncodings { Encoding::Encoding(const char* name, const char* charset) : m_name(name), m_charset(charset) { } Glib::ustring Encoding::get_charset() const { if(m_charset) return m_charset; else return Glib::ustring(); } Glib::ustring Encoding::get_name() const { if(m_name) return m_name; else return Glib::ustring(); } /** A predicate for use with std::find_if() to find an Encoding with the charset. */ template class predicate_EncodingHasCharset { public: predicate_EncodingHasCharset(const Glib::ustring& charset) { m_charset = charset; } virtual ~predicate_EncodingHasCharset() { } bool operator() (const T_Element& element) { return (element.get_charset() == m_charset); } private: Glib::ustring m_charset; }; static type_list_encodings list_encodings; static void add_encoding(const gchar* name, const gchar* encoding) { list_encodings.push_back(Encoding(name, encoding)); } type_list_encodings get_list_of_encodings() { if(!list_encodings.empty()) return list_encodings; //TODO: Can we get this from anywhere else, such as iso-codes? murrayc //TODO: Make this generally more efficient. add_encoding(_("Unicode"), "UTF-8"); add_encoding(_("Unicode"), "UTF-16"); add_encoding(_("Unicode"), "UTF-16BE"); add_encoding(_("Unicode"), "UTF-16LE"); add_encoding(_("Unicode"), "UTF-32"); add_encoding(_("Unicode"), "UTF-7"); add_encoding(_("Unicode"), "UCS-2"); add_encoding(_("Unicode"), "UCS-4"); add_encoding(0, 0); // This just adds a separator in the combo box add_encoding(_("Western"), "ISO-8859-1"); add_encoding(_("Central European"), "ISO-8859-2"); add_encoding(_("South European"), "ISO-8859-3"); add_encoding(_("Baltic"), "ISO-8859-4"); add_encoding(_("Cyrillic"), "ISO-8859-5"); add_encoding(_("Arabic"), "ISO-8859-6"); add_encoding(_("Greek"), "ISO-8859-7"); add_encoding(_("Hebrew Visual"), "ISO-8859-8"); add_encoding(_("Hebrew"), "ISO-8859-8-I"); add_encoding(_("Turkish"), "ISO-8859-9"); add_encoding(_("Nordic"), "ISO-8859-10"); add_encoding(_("Baltic"), "ISO-8859-13"); add_encoding(_("Celtic"), "ISO-8859-14"); add_encoding(_("Western"), "ISO-8859-15"); add_encoding(_("Romanian"), "ISO-8859-16"); add_encoding(0, 0); // This just adds a separator in the combo box add_encoding(_("Central European"), "WINDOWS-1250"); add_encoding(_("Cyrillic"), "WINDOWS-1251"); add_encoding(_("Western"), "WINDOWS-1252"); add_encoding(_("Greek"), "WINDOWS-1253"); add_encoding(_("Turkish"), "WINDOWS-1254"); add_encoding(_("Hebrew"), "WINDOWS-1255"); add_encoding(_("Arabic"), "WINDOWS-1256"); add_encoding(_("Baltic"), "WINDOWS-1257"); add_encoding(_("Vietnamese"), "WINDOWS-1258"); return list_encodings; } Glib::ustring get_name_of_charset(const Glib::ustring& charset) { //Make sure that the list is full: get_list_of_encodings(); type_list_encodings::const_iterator iter = std::find_if(list_encodings.begin(), list_encodings.end(), predicate_EncodingHasCharset(charset)); if(iter != list_encodings.end()) return iter->get_name(); else return Glib::ustring(); } } //namespace FileEncodings; } //namespace Glom glom-1.22.4/glom/import_csv/dialog_import_csv_progress.cc0000644000175000017500000002462412234776363025073 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_import_csv_progress.h" #include #include #include #include #include #include #include #include namespace Glom { const char* Dialog_Import_CSV_Progress::glade_id("dialog_import_csv_progress"); const bool Dialog_Import_CSV_Progress::glade_developer(false); Dialog_Import_CSV_Progress::Dialog_Import_CSV_Progress(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_data_source(0), m_current_row(0) { builder->get_widget("import_csv_progress_progress_bar", m_progress_bar); builder->get_widget("import_csv_progress_textview", m_text_view); if(!m_progress_bar || !m_text_view) throw std::runtime_error("Missing widgets from glade file for Dialog_Import_CSV_Progress"); } bool Dialog_Import_CSV_Progress::init_db_details(const Glib::ustring& table_name) { const bool result = Base_DB_Table_Data::init_db_details(table_name); m_field_primary_key = get_field_primary_key_for_table(table_name); return result; } void Dialog_Import_CSV_Progress::import(Dialog_Import_CSV& data_source) { // Cancel any running operations clear(); // Begin with first row from source m_data_source = &data_source; m_current_row = 0; switch(data_source.get_parser_state()) { case CsvParser::STATE_PARSING: { // Wait for the parsing to finish. We do not start importing before the file has been // parsed completely since we would not to rollback our changes in case of a // parsing error. std::string filename; try { filename = Glib::filename_from_uri(data_source.get_file_uri()); } catch(const Glib::ConvertError& ex) { std::cerr << "Glib::filename_from_uri() failed: " << ex.what() << std::endl; } m_progress_bar->set_text(Glib::ustring::compose(_("Parsing CSV file %1"), filename)); m_ready_connection = data_source.signal_state_changed().connect(sigc::mem_fun(*this, &Dialog_Import_CSV_Progress::on_data_source_state_changed)); break; } case CsvParser::STATE_PARSED: begin_import(); break; default: // This function should not be called with data_source being in other states g_assert_not_reached(); break; } set_response_sensitive(Gtk::RESPONSE_CANCEL, true); set_response_sensitive(Gtk::RESPONSE_OK, false); } void Dialog_Import_CSV_Progress::clear() { // Cancel any running import m_progress_connection.disconnect(); m_ready_connection.disconnect(); m_data_source = 0; m_current_row = 0; } void Dialog_Import_CSV_Progress::add_text(const Glib::ustring& text) { m_text_view->get_buffer()->insert(m_text_view->get_buffer()->end(), text); m_text_view->scroll_to(m_text_view->get_buffer()->get_insert()); } void Dialog_Import_CSV_Progress::begin_import() { m_progress_bar->set_text("0"); m_progress_bar->set_fraction(0.0); m_progress_connection = Glib::signal_idle().connect(sigc::mem_fun(*this, &Dialog_Import_CSV_Progress::on_idle_import)); } void Dialog_Import_CSV_Progress::on_data_source_state_changed() { switch(m_data_source->get_parser_state()) { case CsvParser::STATE_ENCODING_ERROR: // Cancel on error response(Gtk::RESPONSE_CANCEL); break; case CsvParser::STATE_PARSED: // Begin importing when fully parsed begin_import(); //m_progress_connection = Glib::signal_idle().connect(sigc::mem_fun(*this, &Dialog_Import_CSV_Progress::on_idle_import)); break; default: // We only install the signal in state PARSING, and we should not change // back to NONE state, so we must have changed to one of the states handled // above, otherwise something went wrong. g_assert_not_reached(); break; } } bool Dialog_Import_CSV_Progress::on_idle_import() { //Note to translators: This is a progress indication, showing how many rows have been imported. //TODO: Have a heuristic based on file size or total rows count. const Glib::ustring status_text = Glib::ustring::format(m_current_row); m_progress_bar->set_text(status_text); m_progress_bar->pulse(); std::cout << "debug: status_text=" << status_text << std::endl; //Allow GTK+ to process events, so that the UI is responsive. //TODO: This does not seem to actually work. //TODO: Make sure that gtkmm has some non-Gtk::Main API for this: while(gtk_events_pending()) gtk_main_iteration_do(true); const CsvParser::type_row_strings row = m_data_source->get_parser().fetch_next_row(); //If there are no more rows to import, then stop, by returning false: // TODO: Perhaps abort on 0 == row instead, so that we do not stop import on // empty rows that are in between other rows. if(row.empty()) { // Don't do the response immediately, so the user has a chance to read the // warnings and errors, if any. set_response_sensitive(Gtk::RESPONSE_CANCEL, false); set_response_sensitive(Gtk::RESPONSE_OK, true); add_text(_("Import complete\n")); return false; } // Update the current row values map: guint col_index = 0; for(CsvParser::type_row_strings::const_iterator iter = row.begin(); iter != row.end(); ++iter) { sharedptr field = m_data_source->get_field_for_column(col_index++); if(field) { // We always assume exported data is in standard CSV format, since // we export it this way. bool success = false; Gnome::Gda::Value value = field->from_file_format(*iter, success); if(success) { // Make the value empty if the value is not unique. if(field->get_unique_key()) { sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(field); if(!get_field_value_is_unique(m_table_name, layout_item, value)) { value = Gnome::Gda::Value(); const Glib::ustring message(Glib::ustring::compose(_("Warning: Importing row %1: The value for field %2 must be unique, but is already in use. The value will not be imported.\n"), m_current_row + 1, field->get_name())); add_text(message); } } m_current_row_values[field->get_name()] = value; } else { const Glib::ustring message(Glib::ustring::compose(_("Warning: Importing row %1: The value for field %2, \"%3\" could not be converted to the field's type. The value will not be imported.\n"), m_current_row + 1, field->get_name(), *iter)); add_text(message); } } } // Choose the primary key value Gnome::Gda::Value primary_key_value; if(m_field_primary_key->get_auto_increment()) { primary_key_value = DbUtils::get_next_auto_increment_value(m_table_name, m_field_primary_key->get_name()); } else { // No auto-increment primary key: Check for uniqueness Gnome::Gda::Value primary_key_value = m_current_row_values[m_field_primary_key->get_name()]; sharedptr layout_item = sharedptr::create(); layout_item->set_full_field_details(m_field_primary_key); if(!get_field_value_is_unique(m_table_name, layout_item, primary_key_value)) primary_key_value = Gnome::Gda::Value(); } if(Glom::Conversions::value_is_empty(primary_key_value)) { const Glib::ustring message(Glib::ustring::compose(_("Error importing row %1: Cannot import the row because the primary key is empty.\n"), m_current_row + 1)); add_text(message); } else { //std::cout << "debug: " << G_STRFUNC << ": Calling record_new() with primary_key_value=" << primary_key_value.to_string() << " ..." << std::endl; record_new(true /* use_entered_data */, primary_key_value); //std::cout << "debug: " << G_STRFUNC << ": ... Finished calling record_new()" << std::endl; } m_current_row_values.clear(); ++m_current_row; return true; } void Dialog_Import_CSV_Progress::on_response(int /* response_id */) { // Don't continue importing when the user already cancelled, or closed the // window via delete event. clear(); } Gnome::Gda::Value Dialog_Import_CSV_Progress::get_entered_field_data(const sharedptr& field) const { type_mapValues::const_iterator iter = m_current_row_values.find(field->get_name()); if(iter == m_current_row_values.end()) return Gnome::Gda::Value(); return iter->second; } void Dialog_Import_CSV_Progress::set_entered_field_data(const sharedptr& field, const Gnome::Gda::Value& value) { m_current_row_values[field->get_name()] = value; } sharedptr Dialog_Import_CSV_Progress::get_field_primary_key() const { return m_field_primary_key; } Gnome::Gda::Value Dialog_Import_CSV_Progress::get_primary_key_value_selected() const { type_mapValues::const_iterator iter = m_current_row_values.find(m_field_primary_key->get_name()); if(iter == m_current_row_values.end()) return Gnome::Gda::Value(); return iter->second; } // These don't make sense in Dialog_Import_CSV_Progress, and thus should not // be called. We need to implement them though, because they are pure abstract // in Base_DB_Table_Data. void Dialog_Import_CSV_Progress::set_primary_key_value(const Gtk::TreeModel::iterator& /* row */, const Gnome::Gda::Value& /* value */) { // This is actually called by Base_DB_Table_Data::record_new(), but we can safely ignore it. //throw std::logic_error("Dialog_Import_CSV_Progress::set_primary_key_value() called"); } Gnome::Gda::Value Dialog_Import_CSV_Progress::get_primary_key_value(const Gtk::TreeModel::iterator& /* row */) const { throw std::logic_error("Dialog_Import_CSV_Progress::get_primary_key_value() called"); return Gnome::Gda::Value(); } } //namespace Glom glom-1.22.4/glom/import_csv/dialog_import_csv_progress.h0000644000175000017500000000606412234252645024723 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_IMPORT_CSV_PROGRESS_H #define GLOM_DIALOG_IMPORT_CSV_PROGRESS_H #include "base_db_table_data.h" #include "dialog_import_csv.h" #include #include namespace Glom { class Dialog_Import_CSV_Progress : public Gtk::Dialog, public Base_DB_Table_Data { public: static const char* glade_id; static const bool glade_developer; Dialog_Import_CSV_Progress(BaseObjectType* cobject, const Glib::RefPtr& builder); bool init_db_details(const Glib::ustring& table_name); // Reads the data from the Dialog_Import_CSV. We might want to wrap the // parsed data within a separate class. void import(Dialog_Import_CSV& data_source); private: void clear(); void add_text(const Glib::ustring& text); void begin_import(); void on_data_source_state_changed(); bool on_idle_import(); virtual void on_response(int response_id); // Override from Gtk::Dialog virtual Gnome::Gda::Value get_entered_field_data(const sharedptr& field) const; // Override from Base_DB_Table_Data virtual void set_entered_field_data(const sharedptr& field, const Gnome::Gda::Value& value); // Override from Base_DB virtual sharedptr get_field_primary_key() const; // Override from Base_DB_Table_Data virtual Gnome::Gda::Value get_primary_key_value_selected() const; // Override from Base_DB_Table_Data virtual void set_primary_key_value(const Gtk::TreeModel::iterator& row, const Gnome::Gda::Value& value); // Override from Base_DB_Table_Data virtual Gnome::Gda::Value get_primary_key_value(const Gtk::TreeModel::iterator& row) const; // Override from Base_DB_Table_Data sharedptr m_field_primary_key; Dialog_Import_CSV* m_data_source; unsigned int m_current_row; // We use this for implementing get_entered_field_data and // set_entered_field_data, required by Base_DB_Table_Data::record_new(). // It just holds the values for the fields in the current row. typedef std::map type_mapValues; type_mapValues m_current_row_values; Gtk::ProgressBar* m_progress_bar; Gtk::TextView* m_text_view; sigc::connection m_progress_connection; sigc::connection m_ready_connection; }; } //namespace Glom #endif //GLOM_DIALOG_IMPORT_CSV_PROGRESS_H glom-1.22.4/glom/import_csv/csv_parser.cc0000644000175000017500000003706412234776363021614 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * Copyright (C) 2009 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "csv_parser.h" #include #include #include #include // On Windows, "iconv" seems to be a define for "libiconv", breaking the Glib::IConv::iconv() call. #ifdef iconv #undef iconv #endif namespace Glom { bool CsvParser::next_char_is_quote(const Glib::ustring::const_iterator& iter, const Glib::ustring::const_iterator& end) { if(iter == end) return false; // Look at the next character to see if it's really "" (an escaped "): Glib::ustring::const_iterator iter_next = iter; ++iter_next; if(iter_next != end) { const gunichar c_next = *iter_next; if(c_next == CsvParser::QUOTE) { return true; } } return false; } CsvParser::CsvParser(const std::string& encoding_charset) : m_raw(0), m_encoding(encoding_charset), m_input_position(0), m_in_quotes(false), m_idle_connection(), m_line_number(0), m_state(STATE_NONE), m_stream(), m_rows(), m_row_index(0) { } void CsvParser::set_file_and_start_parsing(const std::string& file_uri) { // TODO: Check URI validity? g_return_if_fail(!file_uri.empty()); Glib::RefPtr file = Gio::File::create_for_uri(file_uri); set_state(CsvParser::STATE_PARSING); //TODO Get a rough estimate of the number of rows (for showing progress), //by counting the number of lines: //guint lines_count = 0; // Query the display name of the file to set in the title: file->query_info_async(sigc::bind(sigc::mem_fun(*this, &CsvParser::on_file_query_info), file), G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME); file->read_async(sigc::bind(sigc::mem_fun(*this, &CsvParser::on_file_read), file)); } CsvParser::~CsvParser() { m_idle_connection.disconnect(); } CsvParser::State CsvParser::get_state() const { return m_state; } bool CsvParser::get_rows_empty() const { return m_rows.empty(); } const Glib::ustring& CsvParser::get_data(guint row, guint col) { static Glib::ustring empty_result; // TODO: Why do we complain here? We cannot (and don't need to) restrict // our clients to only call this method with valid rows & cols, it falls in // our responsibility to check the access, which we do. Handing out an // empty result is perfectly fine! if(row >= m_rows.size()) { //std::cerr << G_STRFUNC << ": get_data(): row out of range." << std::endl; return empty_result; } const type_row_strings& row_data = m_rows[row]; if(col >= row_data.size()) { //std::cerr << G_STRFUNC << ": get_data(): col out of range." << std::endl; return empty_result; } return row_data[col]; } const CsvParser::type_row_strings CsvParser::fetch_next_row() { const type_row_strings empty; g_return_val_if_fail(m_state == (CsvParser::STATE_PARSING | CsvParser::STATE_PARSED), empty); // We cannot fetch the next row, but since we are still parsing we might just have to parse a bit more! if(m_state == CsvParser::STATE_PARSING && m_row_index >= m_rows.size()) { on_idle_parse(); // The final recursion guard is m_state == CsvParser::STATE_PARSING return fetch_next_row(); } if(m_state == CsvParser::STATE_PARSED && m_row_index >= m_rows.size()) { return empty; } if(m_row_index < m_rows.size()) { return m_rows[m_row_index++]; } g_return_val_if_reached(empty); } void CsvParser::reset_row_index() { m_row_index = 0; } CsvParser::type_signal_file_read_error CsvParser::signal_file_read_error() const { return m_signal_file_read_error; } CsvParser::type_signal_file_read_error CsvParser::signal_have_display_name() const { return m_signal_have_display_name; } CsvParser::type_signal_encoding_error CsvParser::signal_encoding_error() const { return m_signal_encoding_error; } CsvParser::type_signal_finished_parsing CsvParser::signal_finished_parsing() const { return m_finished_parsing; } CsvParser::type_signal_line_scanned CsvParser::signal_line_scanned() const { return m_signal_line_scanned; } CsvParser::type_signal_state_changed CsvParser::signal_state_changed() const { return m_signal_state_changed; } void CsvParser::set_encoding(const Glib::ustring& encoding_charset) { if(m_encoding == encoding_charset) return; m_encoding = encoding_charset; //Stop parsing if the encoding changes. //The caller should restart the parsing when wanted. clear(); set_state(STATE_NONE); } // Parse the field in a comma-separated line, returning the field including the quotes: // (But can it operate on non-UTF, read: binary, data?) Glib::ustring::const_iterator CsvParser::advance_field(const Glib::ustring::const_iterator& iter, const Glib::ustring::const_iterator& end, Glib::ustring& field) { bool inside_quotes = false; //bool string_finished = false; //Ignore anything after "something", such as "something"else, field.clear(); Glib::ustring::const_iterator walk; for(walk = iter; walk != end; ++walk) { const gunichar c = *walk; //if(string_finished) // continue; if(inside_quotes) { // End of quoted string? if(c == CsvParser::QUOTE) { if(CsvParser::next_char_is_quote(walk, end)) { // This is "" so it's not an end quote. Just add one quote: field += c; ++walk; //Skip the second ". } else { inside_quotes = false; //string_finished = true; //Ignore anything else before the next comma. } continue; } } else { // Start of quoted string: if((c == CsvParser::QUOTE)) { inside_quotes = true; continue; } // End of field: else if(!inside_quotes && c == CsvParser::DELIMITER) { break; } } field += c; // Just so that we don't need to iterate through the field again, since there is no Glib::ustring::substr(iter, iter) } // TODO: Throw error if still inside a quoted string? //std::cout << "debug: field=" << field << std::endl; return walk; } void CsvParser::clear() { m_buffer.reset(0); //m_stream.reset(); //m_raw.clear(); m_rows.clear(); m_in_quotes = false; // Set to current encoding I guess ... //m_conv("UTF-8", encoding), m_input_position= 0; // Disconnect signal handlers, too. m_idle_connection.disconnect(); m_line_number = 0; set_state(STATE_NONE); } bool CsvParser::on_idle_parse() { Glib::IConv conv("UTF-8", m_encoding); // The amount of bytes to process in one pass of the idle handler: static const guint CONVERT_BUFFER_SIZE = 1024; const char* inbuffer = &m_raw[m_input_position]; char* inbuf = const_cast(inbuffer); g_return_val_if_fail(m_input_position <= m_raw.size(), true); gsize inbytes = m_raw.size() - m_input_position; char outbuffer[CONVERT_BUFFER_SIZE]; char* outbuf = outbuffer; gsize outbytes = CONVERT_BUFFER_SIZE; const std::size_t result = conv.iconv(&inbuf, &inbytes, &outbuf, &outbytes); bool more_to_process = (inbytes != 0); if(result == static_cast(-1)) { if(errno == EILSEQ) { // Invalid text in the current encoding. set_state(STATE_ENCODING_ERROR); signal_encoding_error().emit(); return false; //Stop calling the idle handler. } // If EINVAL is set, this means that an incomplete multibyte sequence was at // the end of the input. We might have some more bytes, but those do not make // up a whole character, so we need to wait for more input. if(errno == EINVAL) { if(!m_stream) { // This means that we already reached the end of the file. The file // should not end with an incomplete multibyte sequence. set_state(STATE_ENCODING_ERROR); signal_encoding_error().emit(); return false; //Stop calling the idle handler. } else { more_to_process = false; } } } m_input_position += (inbuf - inbuffer); // We now have outbuf - outbuffer bytes of valid UTF-8 in outbuffer. const char* prev_line_end = outbuffer; const char* prev = prev_line_end; // Identify the record rows in the .csv file. // We can't just search for newlines because they may be inside quotes too. // TODO: Use a regex instead, to more easily handle quotes? while(true) { //std::cout << "debug: checking start: " << std::string(prev, 10) << std::endl; // Note that, unlike std::string::find*, std::find* returns an iterator (char*), not a position. // It returns outbuf if none is found. const char newline_to_find[] = { '\r', '\n', '\0' }; const char* pos_newline = std::find_first_of(prev, outbuf, newline_to_find, newline_to_find + sizeof(newline_to_find)); const char quote_to_find[] = {(char)QUOTE}; const char* pos_quote = std::find_first_of(prev, outbuf, quote_to_find, quote_to_find + sizeof(quote_to_find)); // Examine the first character (quote or newline) that was found: const char* pos = pos_newline; if((pos_quote != outbuf) && pos_quote < pos) pos = pos_quote; if(pos == outbuf) { //std::cout << "debug: not found. stopping" << std::endl; break; } char ch = *pos; //std::cout << "debug: ch=START" << ch << "END" << std::endl; if(ch == '\0') { // There is a null byte in the conversion. Because normal text files don't // contain null bytes this only occurs when converting, for example, a UTF-16 // file from ISO-8859-1 to UTF-8 (note that the UTF-16 file is valid ISO-8859-1 - // it just contains lots of nullbytes). We therefore produce an error here. //std::cerr << G_STRFUNC << ": on_idle_parse(): Encoding error" << std::endl; set_state(STATE_ENCODING_ERROR); signal_encoding_error().emit(); return false; //Stop calling the idle handler. } else if(m_in_quotes) { // Ignore newlines inside quotes. // End quote: if(ch == (char)QUOTE) { m_in_quotes = false; /* const size_t len = pos - prev; std::string quoted_text; if(len) quoted_text = std::string(prev, len); std::cout << "DEBUG: Quoted=" << quoted_text << std::endl; */ } //else // std::cout << "Ignoring a newline in quotes." << std::endl; prev = pos + 1; continue; } else { // Start quote: if(ch == (char)QUOTE) { m_in_quotes = true; prev = pos + 1; continue; } // Found a newline (outside of quotes) that marks the end of the line: m_current_line.append(prev_line_end, pos - prev_line_end); ++m_line_number; if(!m_current_line.empty()) { //std::cout << "debug: intermediate chunk" << std::endl; do_line_scanned(m_current_line, m_line_number); } m_current_line.clear(); // Skip linebreak prev = pos + 1; // Skip DOS-style linebreak (\r\n) if(ch == '\r' && prev != outbuf && *prev == '\n') { ++prev; } prev_line_end = prev; } } // We reached the end of buffer (instead of ending with a newline): m_current_line.append(prev_line_end, outbuf - prev_line_end); if(!m_stream && m_raw.size() == m_input_position) { ++m_line_number; // Handle last line, if nonempty if(!m_current_line.empty()) { //std::cout << "debug: last chunk" << std::endl; do_line_scanned(m_current_line, m_line_number); } // We have parsed the whole file. We have finished. // TODO: To only emit signal_finished_parsing here is *not* enough. set_state(STATE_PARSED); signal_finished_parsing().emit(); } else { //TODO: Make in_quotes static, so that quotes work across calls to this chunk parser. //std::cout << "Waiting for next read: so far size=" << m_current_line.size() << ", start=" << m_current_line.substr(0, 40) << std::endl; } // Continue if there are more bytes to process return more_to_process; //false means stop calling the idle handler. } void CsvParser::do_line_scanned(const Glib::ustring& line, guint line_number) { //std::cout << "debug: on_line_scanned=" << line_number << ", line start=" << line.substr(0, 40) << std::endl; if(line.empty()) return; m_rows.push_back(CsvParser::type_row_strings()); type_row_strings& row = m_rows.back(); Glib::ustring field; //Gtk::TreeModelColumnRecord record; // Parse first field: Glib::ustring::const_iterator line_iter = CsvParser::advance_field(line.begin(), line.end(), field); row.push_back(field); // Parse more fields: while(line_iter != line.end()) { // Skip delimiter: ++line_iter; // Read field: line_iter = advance_field(line_iter, line.end(), field); // Add field to current row: row.push_back(field); } signal_line_scanned().emit(row, line_number); } void CsvParser::ensure_idle_handler_connection() { if(!m_idle_connection.connected()) { m_idle_connection = Glib::signal_idle().connect( sigc::mem_fun(*this, &CsvParser::on_idle_parse), Glib::PRIORITY_DEFAULT_IDLE - 20); } } void CsvParser::on_file_read(const Glib::RefPtr& result, const Glib::RefPtr& source) { ensure_idle_handler_connection(); try { m_stream = source->read_finish(result); m_buffer.reset(new Buffer); m_stream->read_async(m_buffer->buf, sizeof(m_buffer->buf), sigc::mem_fun(*this, &CsvParser::on_buffer_read)); } catch(const Glib::Exception& ex) { signal_file_read_error().emit(ex.what()); clear(); } } void CsvParser::copy_buffer_and_continue_reading(gssize size) { if(size > 0) { m_raw.insert(m_raw.end(), m_buffer->buf, m_buffer->buf + size); m_buffer.reset(new Buffer); m_stream->read_async(m_buffer->buf, sizeof(m_buffer->buf), sigc::mem_fun(*this, &CsvParser::on_buffer_read)); } else // When size == 0 we finished reading. { //TODO: put in proper data reset method? m_buffer.reset(0); m_stream.reset(); } //In case it has been disconnected too early due to timing problems: ensure_idle_handler_connection(); } void CsvParser::on_buffer_read(const Glib::RefPtr& result) { try { const gssize size = m_stream->read_finish(result); copy_buffer_and_continue_reading(size); } catch(const Glib::Exception& ex) { signal_file_read_error().emit(ex.what()); clear(); } } void CsvParser::on_file_query_info(const Glib::RefPtr& result, const Glib::RefPtr& source) { try { Glib::RefPtr info = source->query_info_finish(result); if(info) signal_have_display_name().emit(info->get_display_name()); } catch(const Glib::Exception& ex) { std::cerr << "Failed to fetch display name of uri " << source->get_uri() << ": " << ex.what() << std::endl; } } void CsvParser::set_state(State state) { if(m_state == state) return; m_state = state; signal_state_changed().emit(); } } // namespace Glom glom-1.22.4/glom/import_csv/dialog_import_csv.cc0000644000175000017500000006361112234776363023146 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "dialog_import_csv.h" #include #include #include #include #include #include #include #include #include #include #include #include namespace { // When auto-detecting the encoding, we try to read the file in these // encodings, in order: const char* AUTODETECT_ENCODINGS_CHARSETS[] = { "UTF-8", "ISO-8859-1", "ISO-8859-15", "UTF-16", "UCS-2", "UCS-4" }; const guint N_AUTODETECT_ENCODINGS_CHARSETS = sizeof(AUTODETECT_ENCODINGS_CHARSETS)/sizeof(AUTODETECT_ENCODINGS_CHARSETS[0]); Glib::ustring encoding_display(const Glib::ustring& name, const Glib::ustring& charset) { if(charset.empty()) return name; else return name + " (" + charset + ')'; } } //anonymous namespace namespace Glom { const char* Dialog_Import_CSV::glade_id("dialog_import_csv"); const bool Dialog_Import_CSV::glade_developer(false); Dialog_Import_CSV::Dialog_Import_CSV(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Dialog(cobject), m_auto_detect_encoding(), m_cols_count(-1) { builder->get_widget("import_csv_fields", m_sample_view); builder->get_widget("import_csv_target_table", m_target_table); builder->get_widget("import_csv_encoding", m_encoding_combo); builder->get_widget("import_csv_encoding_info", m_encoding_info); builder->get_widget("import_csv_first_line_as_title", m_first_line_as_title); builder->get_widget("import_csv_sample_rows", m_sample_rows); builder->get_widget("import_csv_advice_label", m_advice_label); builder->get_widget("import_csv_error_label", m_error_label); if(!m_sample_view || !m_encoding_combo || !m_target_table || !m_encoding_info || !m_first_line_as_title || !m_sample_rows || !m_error_label) throw std::runtime_error("Missing widgets from glade file for Dialog_Import_CSV"); //Set the adjustment details, to avoid a useless 0-to-0 range and a 0 incremenet. //We don't do this the Glade file because GtkBuilder wouldn't find the //associated adjustment object unless we specified it explictly: //See http://bugzilla.gnome.org/show_bug.cgi?id=575714 m_sample_rows->set_range(0, 100); m_sample_rows->set_increments(1, 10); m_sample_rows->set_value(2); //A sensible default. //Fill the list of encodings: m_encoding_model = Gtk::ListStore::create(m_encoding_columns); Gtk::TreeModel::iterator iter = m_encoding_model->append(); (*iter)[m_encoding_columns.m_col_name] = _("Auto Detect"); // Separator: m_encoding_model->append(); const FileEncodings::type_list_encodings list_encodings = FileEncodings::get_list_of_encodings(); for(FileEncodings::type_list_encodings::const_iterator encodings_iter = list_encodings.begin(); encodings_iter != list_encodings.end(); ++encodings_iter) { const FileEncodings::Encoding encoding = *encodings_iter; if(encoding.get_name().empty()) continue; iter = m_encoding_model->append(); Gtk::TreeModel::Row row = *iter; row[m_encoding_columns.m_col_name] = encoding.get_name(); row[m_encoding_columns.m_col_charset] = encoding.get_charset(); } Gtk::CellRendererText* renderer = Gtk::manage(new Gtk::CellRendererText); m_encoding_combo->set_model(m_encoding_model); m_encoding_combo->pack_start(*renderer); m_encoding_combo->set_cell_data_func(*renderer, sigc::bind(sigc::mem_fun(*this, &Dialog_Import_CSV::encoding_data_func), sigc::ref(*renderer))); m_encoding_combo->set_row_separator_func(sigc::mem_fun(*this, &Dialog_Import_CSV::row_separator_func)); m_encoding_combo->set_active(0); m_encoding_combo->signal_changed().connect(sigc::mem_fun(*this, &Dialog_Import_CSV::on_combo_encoding_changed)); // TODO: Reset parser encoding on selection changed. m_parser = std::auto_ptr(new CsvParser(get_current_encoding().c_str())); m_parser->signal_file_read_error().connect(sigc::mem_fun(*this, &Dialog_Import_CSV::on_parser_file_read_error)); m_parser->signal_have_display_name().connect(sigc::mem_fun(*this, &Dialog_Import_CSV::on_parser_have_display_name)); m_parser->signal_encoding_error().connect(sigc::mem_fun(*this, &Dialog_Import_CSV::on_parser_encoding_error)); m_parser->signal_line_scanned().connect(sigc::mem_fun(*this, &Dialog_Import_CSV::on_parser_line_scanned)); m_parser->signal_state_changed().connect(sigc::mem_fun(*this, &Dialog_Import_CSV::on_parser_state_changed)); m_first_line_as_title->set_active(false); m_first_line_as_title->signal_toggled().connect(sigc::mem_fun(*this, &Dialog_Import_CSV::on_first_line_as_title_toggled)); m_sample_rows->signal_changed().connect(sigc::mem_fun(*this, &Dialog_Import_CSV::on_sample_rows_changed)); m_sample_view->set_headers_visible(m_first_line_as_title->get_active()); //Warn the user about the numeric and date formats expected: //A date that is really really the date that we mean: tm the_c_time; memset(&the_c_time, 0, sizeof(the_c_time)); //We mean 22nd November 2008: the_c_time.tm_year = 2008 - 1900; //C years start are the AD year - 1900. So, 01 is 1901. the_c_time.tm_mon = 11 - 1; //C months start at 0. the_c_time.tm_mday = 22; //starts at 1 //Get the ISO (not current locale) text representation: const Glib::ustring date_text = Glom::Conversions::format_date(the_c_time, std::locale::classic() /* ignored */, true /* iso_format */); const Glib::ustring advice = Glib::ustring::compose(_("Note that the source file should contain numbers and dates in international ISO format. For instance, 22nd November 2008 should be %1."), date_text); m_advice_label->set_text(advice); //std::cout << "DEBUG: advice=" << advice << std::endl; clear(); } CsvParser::State Dialog_Import_CSV::get_parser_state() const { return m_parser->get_state(); } Glib::ustring Dialog_Import_CSV::get_target_table_name() const { return m_target_table->get_text(); } const Glib::ustring& Dialog_Import_CSV::get_file_uri() const { return m_file_uri; } void Dialog_Import_CSV::import(const Glib::ustring& uri, const Glib::ustring& into_table) { clear(); Document* document = get_document(); if(!document) { show_error_dialog(_("No Document Available"), _("You need to open a document to import the data into a table.")); } else { // Make the relevant widgets sensitive. We will make them insensitive // again when a (non-recoverable) error occurs. m_sample_view->set_sensitive(); m_encoding_combo->set_sensitive(); m_first_line_as_title->set_sensitive(); m_sample_rows->set_sensitive(); set_title(_("Import From CSV File")); m_target_table->set_markup("" + Glib::Markup::escape_text(into_table) + ""); m_field_model = Gtk::ListStore::create(m_field_columns); Gtk::TreeModel::iterator tree_iter = m_field_model->append(); (*tree_iter)[m_field_columns.m_col_field_name] = _(""); const Document::type_vec_fields fields(document->get_table_fields(into_table)); for(Document::type_vec_fields::const_iterator iter = fields.begin(); iter != fields.end(); ++ iter) { sharedptr field = *iter; if(!field) continue; // Don't allow the primary key to be selected when it is an auto // increment key, since the value for the primary key is chosen // automatically anyway. if(!field->get_primary_key() || !field->get_auto_increment()) { Gtk::TreeModel::iterator tree_iter = m_field_model->append(); (*tree_iter)[m_field_columns.m_col_field] = *iter; (*tree_iter)[m_field_columns.m_col_field_name] = (*iter)->get_name(); } } // Create the sorted version of this model, // so the user sees the fields in alphabetical order: m_field_model_sorted = Gtk::TreeModelSort::create(m_field_model); m_field_model_sorted->set_sort_column(m_field_columns.m_col_field_name, Gtk::SORT_ASCENDING); m_file_uri = uri; m_parser->set_file_and_start_parsing(uri); } } sharedptr Dialog_Import_CSV::get_field_for_column(guint col) const { if(col >= m_fields.size()) return sharedptr(); return m_fields[col]; } const Glib::ustring& Dialog_Import_CSV::get_data(guint row, guint col) { if(m_first_line_as_title->get_active()) ++row; return m_parser->get_data(row, col); } CsvParser& Dialog_Import_CSV::get_parser() { return *(m_parser.get()); } void Dialog_Import_CSV::clear() { // TODO: Do we explicitely need to cancel async operations? // TODO: Disconnect idle handlers m_sample_model.reset(); Utils::treeview_delete_all_columns(m_sample_view); m_sample_view->set_model(m_sample_model); m_field_model.reset(); m_field_model_sorted.reset(); m_fields.clear(); m_file_uri.clear(); m_parser->clear(); //m_parser.reset(0); m_encoding_info->set_text(""); m_sample_view->set_sensitive(false); m_encoding_combo->set_sensitive(false); m_first_line_as_title->set_sensitive(false); m_sample_rows->set_sensitive(false); validate_primary_key(); } void Dialog_Import_CSV::show_error_dialog(const Glib::ustring&, const Glib::ustring& secondary) { Utils::show_ok_dialog(_("Error Importing CSV File"), secondary, *this, Gtk::MESSAGE_ERROR); } void Dialog_Import_CSV::encoding_data_func(const Gtk::TreeModel::iterator& iter, Gtk::CellRendererText& renderer) { const Glib::ustring name = (*iter)[m_encoding_columns.m_col_name]; const Glib::ustring charset = (*iter)[m_encoding_columns.m_col_charset]; renderer.set_property("text", encoding_display(name, charset)); } bool Dialog_Import_CSV::row_separator_func(const Glib::RefPtr& /* model */, const Gtk::TreeModel::iterator& iter) const { return (*iter)[m_encoding_columns.m_col_name] == ""; } void Dialog_Import_CSV::on_combo_encoding_changed() { const int active = m_encoding_combo->get_active_row_number(); switch(active) { case -1: // No active item g_assert_not_reached(); break; case 0: // Auto-Detect // Begin with first encoding m_auto_detect_encoding = 0; break; default: // Some specific encoding m_auto_detect_encoding = -1; break; } // Parse from beginning with new encoding: m_parser->set_encoding(get_current_encoding()); m_parser->set_file_and_start_parsing(m_file_uri); } void Dialog_Import_CSV::on_first_line_as_title_toggled() { // Ignore if we don't have a model yet, we will take care of the option // later when inserting items into it. if(!m_sample_model) return; if(m_first_line_as_title->get_active()) { m_sample_view->set_headers_visible(true); Gtk::TreeModel::Path path("1"); Gtk::TreeModel::iterator iter = m_sample_model->get_iter(path); // Remove the first row from the view if(iter && (*iter)[m_sample_columns.m_col_row] == 0) { m_sample_model->erase(iter); // Add another row to the end, if one is loaded. const guint last_index = m_sample_model->children().size(); iter = m_sample_model->append(); (*iter)[m_sample_columns.m_col_row] = last_index; } } else { m_sample_view->set_headers_visible(false); // Check whether row 0 is displayed Gtk::TreeModel::Path path("1"); Gtk::TreeModel::iterator iter = m_sample_model->get_iter(path); //if((!iter || (*iter)[m_sample_columns.m_col_row] != 0) && !m_parser->get_rows_empty() && m_sample_rows->get_value_as_int() > 0) if((!iter || (*iter)[m_sample_columns.m_col_row] != 0) && m_sample_rows->get_value_as_int() > 0) { // Add first row to model if(!iter) iter = m_sample_model->append(); else iter = m_sample_model->insert(iter); (*iter)[m_sample_columns.m_col_row] = 0; // Remove last row if we hit the limit const guint sample_rows = m_sample_model->children().size() - 1; if(sample_rows > static_cast(m_sample_rows->get_value_as_int())) { //m_sample_model->erase(m_sample_model->children().rbegin()); path[0] = sample_rows; iter = m_sample_model->get_iter(path); m_sample_model->erase(iter); } } } } void Dialog_Import_CSV::on_sample_rows_changed() { // Ignore if we don't have a model yet, we will take care of the option // later when inserting items into it. if(!m_sample_model) return; const guint current_sample_rows = m_sample_model->children().size() - 1; const guint new_sample_rows = m_sample_rows->get_value_as_int(); if(current_sample_rows > new_sample_rows) { // +1 for the "target field" row Gtk::TreeModel::Path path(1); path[0] = new_sample_rows + 1; Gtk::TreeModel::iterator iter = m_sample_model->get_iter(path); while(iter != m_sample_model->children().end()) iter = m_sample_model->erase(iter); } else { // Find index of first row to add guint row_index = current_sample_rows; if(m_first_line_as_title->get_active()) ++row_index; for(guint i = current_sample_rows; i < new_sample_rows; ++i, ++row_index) { Gtk::TreeModel::iterator iter = m_sample_model->append(); (*iter)[m_sample_columns.m_col_row] = row_index; } } } Glib::ustring Dialog_Import_CSV::get_current_encoding() const { Gtk::TreeModel::iterator iter = m_encoding_combo->get_active(); const Glib::ustring encoding = (*iter)[m_encoding_columns.m_col_charset]; if(encoding.empty()) { // Auto-Detect: g_assert(m_auto_detect_encoding != -1); return AUTODETECT_ENCODINGS_CHARSETS[m_auto_detect_encoding]; } return encoding; } void Dialog_Import_CSV::begin_parse() { if(m_auto_detect_encoding != -1) { const char* encoding_charset = AUTODETECT_ENCODINGS_CHARSETS[m_auto_detect_encoding]; const Glib::ustring encoding_name = FileEncodings::get_name_of_charset(encoding_charset); m_encoding_info->set_text(Glib::ustring::compose(_("Encoding detected as: %1"), encoding_display(encoding_name, encoding_charset))); } else m_encoding_info->set_text(""); // Clear sample preview since we reparse everything, perhaps with // another encoding. m_sample_model.reset(); Utils::treeview_delete_all_columns(m_sample_view); m_sample_view->set_model(m_sample_model); // Empty model m_parser->clear(); m_parser->set_encoding(get_current_encoding().c_str()); // Allow the Import button to be pressed when a field for the primary key // field is set. When the import button is pressed without the file being // fully loaded, the import progress waits for us to load the rest. validate_primary_key(); } void Dialog_Import_CSV::on_parser_encoding_error() { m_parser->clear(); // Clear sample preview (TODO: Let it visible, and only remove when reparsing?) m_sample_model.reset(); Utils::treeview_delete_all_columns(m_sample_view); m_sample_view->set_model(m_sample_model); // Empty model // Don't allow the import button to be pressed when an error occured. This // would not make sense since we cleared all the parsed row data anyway. validate_primary_key(); // If we are auto-detecting the encoding, then try the next one if(m_auto_detect_encoding != -1) { ++ m_auto_detect_encoding; if(static_cast(m_auto_detect_encoding) < N_AUTODETECT_ENCODINGS_CHARSETS) begin_parse(); else m_encoding_info->set_text(_("Encoding detection failed. Please manually choose one from the box.")); } else { m_encoding_info->set_text(_("The file contains data not in the specified encoding. Please choose another one, or try \"Auto Detect\".")); } } void Dialog_Import_CSV::on_parser_line_scanned(CsvParser::type_row_strings row, unsigned int row_number) { // This is the first line read if there is no model yet: if(!m_sample_model) { setup_sample_model(row); Gtk::TreeModel::iterator iter = m_sample_model->append(); // -1 means the row to select target fields (see special handling in cell data funcs) (*iter)[m_sample_columns.m_col_row] = -1; } // Add the row to the treeview if there are not yet as much sample rows // as the user has chosen (note the first row is to choose the target fields, // not a sample row, which is why we do -1 here). const guint sample_rows = m_sample_model->children().size() - 1; // Don't add if this is the first line and m_first_line_as_title is active: if(row_number > 1 || !m_first_line_as_title->get_active()) { if(sample_rows < static_cast(m_sample_rows->get_value_as_int())) { Gtk::TreeModel::iterator tree_iter = m_sample_model->append(); (*tree_iter)[m_sample_columns.m_col_row] = row_number; } } } void Dialog_Import_CSV::setup_sample_model(const CsvParser::type_row_strings& row) { m_sample_model = Gtk::ListStore::create(m_sample_columns); m_sample_view->set_model(m_sample_model); // Create field vector that contains the fields into which to import // the data. m_fields.resize(row.size()); // Start with a column showing the line number. Gtk::CellRendererText* text = Gtk::manage(new Gtk::CellRendererText); Gtk::TreeViewColumn* col = Gtk::manage(new Gtk::TreeViewColumn(_("Line"))); col->pack_start(*text, false); col->set_cell_data_func(*text, sigc::mem_fun(*this, &Dialog_Import_CSV::line_data_func)); m_sample_view->append_column(*col); m_cols_count = row.size(); for(guint i = 0; i < m_cols_count; ++ i) { const Glib::ustring& data = row[i]; m_sample_view->append_column(*Gtk::manage(create_sample_column(data, i))); } } Gtk::TreeViewColumn* Dialog_Import_CSV::create_sample_column(const Glib::ustring& title, guint index) { Gtk::TreeViewColumn* col = new Gtk::TreeViewColumn(title); Gtk::CellRendererCombo* cell = create_sample_cell(index); col->pack_start(*Gtk::manage(cell), true); col->set_cell_data_func(*cell, sigc::bind(sigc::mem_fun(*this, &Dialog_Import_CSV::field_data_func), index)); col->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE); return col; } Gtk::CellRendererCombo* Dialog_Import_CSV::create_sample_cell(guint index) { Gtk::CellRendererCombo* cell = new Gtk::CellRendererCombo; cell->property_model() = m_field_model_sorted; cell->property_text_column() = 0; cell->property_has_entry() = false; cell->signal_edited().connect(sigc::bind(sigc::mem_fun(*this, &Dialog_Import_CSV::on_field_edited), index)); return cell; } void Dialog_Import_CSV::line_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter) { const int row = (*iter)[m_sample_columns.m_col_row]; Gtk::CellRendererText* renderer_text = dynamic_cast(renderer); if(!renderer_text) throw std::logic_error("CellRenderer is not a CellRendererText in line_data_func"); if(row == -1) renderer_text->set_property("text", Glib::ustring(_("Target Field"))); else renderer_text->set_property("text", Glib::ustring::compose("%1", row + 1)); } void Dialog_Import_CSV::field_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, guint column_number) { const int row = (*iter)[m_sample_columns.m_col_row]; Gtk::CellRendererCombo* renderer_combo = dynamic_cast(renderer); if(!renderer_combo) throw std::logic_error("CellRenderer is not a CellRendererCombo in field_data_func"); Glib::ustring text; bool editable = false; if(row == -1) { sharedptr field = m_fields[column_number]; if(field) text = field->get_name(); else text = _(""); editable = true; } else { // Convert to currently chosen field, if any, and back, too see how it // looks like when imported: if(column_number < m_fields.size()) { sharedptr field = m_fields[column_number]; if(row != -1) // && static_cast(row) < m_parser->get_rows_count()) { const Glib::ustring& orig_text = m_parser->get_data(row, column_number); if(field) { if(field->get_glom_type() != Field::TYPE_IMAGE) { /* Exported data is always stored in postgres format */ bool success = false; const Gnome::Gda::Value value = field->from_file_format(orig_text, success); if(!success) text = _(""); else text = Glom::Conversions::get_text_for_gda_value(field->get_glom_type(), value); } else { // TODO: It is too slow to create the picture here. Maybe we should // create it once and cache it. We could also think about using a // GtkCellRendererPixbuf to show it, then. if(!orig_text.empty() && orig_text != "NULL") text = _(""); } } else { // TODO: Should we unescape the field's content? text = orig_text; } if(text.length() > 32) { text.erase(32); text.append("…"); } editable = false; } } } renderer_combo->set_property("text", text); renderer_combo->set_property("editable", editable); } /** Parse a row from a .cvs file. Note that this "line" might have newline * characters inside one field value, inside quotes. **/ void Dialog_Import_CSV::on_field_edited(const Glib::ustring& path, const Glib::ustring& new_text, guint column_number) { Gtk::TreeModel::Path treepath(path); Gtk::TreeModel::iterator iter = m_sample_model->get_iter(treepath); // Lookup field indicated by new_text const Gtk::TreeNodeChildren& children = m_field_model->children(); for(Gtk::TreeModel::iterator field_iter = children.begin(); field_iter != children.end(); ++ field_iter) { if( (*field_iter)[m_field_columns.m_col_field_name] == new_text) { sharedptr field = (*field_iter)[m_field_columns.m_col_field]; // Check whether another column is already using that field type_vec_fields::iterator vec_field_iter = std::find(m_fields.begin(), m_fields.end(), field); // Reset the old column since two different columns cannot be imported into the same field if(vec_field_iter != m_fields.end()) *vec_field_iter = sharedptr(); m_fields[column_number] = field; // Update the rows, so they are redrawn, doing a conversion to the new type. const Gtk::TreeNodeChildren& sample_children = m_sample_model->children(); // Create a TreeModel::Path with initial index 0. We need a TreeModel::Path for the row_changed() call Gtk::TreeModel::Path path("0"); for(Gtk::TreeModel::iterator sample_iter = sample_children.begin(); sample_iter != sample_children.end(); ++ sample_iter) { if(sample_iter != iter) m_sample_model->row_changed(path, sample_iter); path.next(); } validate_primary_key(); break; } } } void Dialog_Import_CSV::validate_primary_key() { if(get_parser_state() == (CsvParser::STATE_NONE | CsvParser::STATE_ENCODING_ERROR)) { m_error_label->hide(); set_response_sensitive(Gtk::RESPONSE_ACCEPT, false); } else { // Allow the import button to be pressed when the value for the primary key // has been chosen: sharedptr primary_key = get_field_primary_key_for_table(get_target_table_name()); bool primary_key_selected = false; if(primary_key && !primary_key->get_auto_increment()) { // If m_rows is empty, then no single line was read from the file yet, // and the m_fields array is not up to date. It is set in handle_line() // when the first line is parsed. primary_key_selected = false; if(!m_parser->get_rows_empty()) { for(type_vec_fields::iterator iter = m_fields.begin(); iter != m_fields.end(); ++ iter) { if(*iter == primary_key) { primary_key_selected = true; break; } } } if(!primary_key_selected) m_error_label->set_markup(Glib::ustring::compose(_("One column needs to be assigned the table's primary key (%1) as target field before importing"), Glib::Markup::escape_text(primary_key->get_name()))); } else { // auto_increment primary keys always work since their value is // assigned automatically. primary_key_selected = true; } set_response_sensitive(Gtk::RESPONSE_ACCEPT, primary_key_selected); if(primary_key_selected) m_error_label->hide(); else m_error_label->show(); } } void Dialog_Import_CSV::on_parser_file_read_error(const Glib::ustring& error_message) { std::string filename; try { filename = Glib::filename_from_uri(m_file_uri); } catch(const Glib::ConvertError& ex) { std::cerr << "Glib::filename_from_uri() failed: " << ex.what() << std::endl; show_error_dialog(_("Could Not Open file"), Glib::ustring::compose(_("The file at \"%1\" could not be opened: %2"), filename, error_message) ); } } void Dialog_Import_CSV::on_parser_have_display_name(const Glib::ustring& display_name) { set_title( Glib::ustring::compose(_("Import From CSV File: %1"), display_name) ); } void Dialog_Import_CSV::on_parser_state_changed() { //Remit (via our similarly-named signal) this so that the progress dialog can respond: signal_state_changed().emit(); } Dialog_Import_CSV::type_signal_state_changed Dialog_Import_CSV::signal_state_changed() const { return m_signal_state_changed; } } //namespace Glom glom-1.22.4/glom/import_csv/csv_parser.h0000644000175000017500000001663412234252645021446 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * Copyright (C) 2009 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_CSV_PARSER_H #define GLOM_CSV_PARSER_H //#include "base_db.h" #include #include #include #include //#include namespace Glom { // We use the low-level Glib::IConv routines to progressively convert the // input data in an idle handler. // TODO: Kill the caching of complete files within m_rows (too costly for big // files) and instead only fill it with n rows (and stop parsing until the row // buffer has some room again). For accessing parsed rows, one could have two // methods: fetch_next_row/take_next_row. The first would use an index, whereas // the latter would return the first row in the row buffer and delete it from // the buffer. /** Parses .csv (comma-separated values) text files. * See http://en.wikipedia.org/wiki/Comma-separated_values for the file format. * * set_file_and_start_parsing() to start parsing. * The data can then be read via get_date(), with get_rows_count() and get_cols_count(). * * The signals offer feedback while the parsing is happening. */ class CsvParser { public: typedef std::vector type_row_strings; typedef std::vector type_rows; //TODO: Avoid having to specify an initial encoding. explicit CsvParser(const std::string& encoding_charset); ~CsvParser(); enum State { STATE_NONE, STATE_PARSING, /**< Parsing is in progress. */ STATE_ENCODING_ERROR, /**< An error happened while parsing. */ STATE_PARSED /**< Finished parsing. */ }; /// Get the current state of the parser. State get_state() const; bool get_rows_empty() const; // The nasty reference return is for performance. const Glib::ustring& get_data(guint row, guint col); /** Fetches the next row from the parser's cache. It will block until enough * data was parsed to return a row. An empty row indicates the last row was * fetched. */ // TODO: Fix to cope with valid empty rows in between, without requiring the // client of this method to check for the parser's state/cache size. const type_row_strings fetch_next_row(); /// Resets the internal row index used for fetch_next_row(). void reset_row_index(); // Signals: typedef sigc::signal type_signal_file_read_error; /** This signal will be emitted if the parser encounters an error while trying to open the file for reading. */ type_signal_file_read_error signal_file_read_error() const; typedef sigc::signal type_signal_have_display_name; /** This signal will be emitted when the parser has discovered the * display name for the file. This does not require any parsing of the contents, * but it is asynchronous, so CsvParser signals this as a convenience. */ type_signal_have_display_name signal_have_display_name() const; typedef sigc::signal type_signal_encoding_error; /** This signal will be emitted when the parser encounters an error while parsing. * TODO: How do we discover what the error is? */ type_signal_encoding_error signal_encoding_error() const; typedef sigc::signal type_signal_line_scanned; /** This signal will be emitted each time the parser has scanned a line. TODO: Do we mean row instead of line? - A row contain a newline. */ type_signal_line_scanned signal_line_scanned() const; typedef sigc::signal type_signal_finished_parsing; /** This signal will be emitted when the parser successfully finished to parse a file. */ type_signal_finished_parsing signal_finished_parsing() const; typedef sigc::signal type_signal_state_changed; /** This signal will be emitted when the state changes. */ type_signal_state_changed signal_state_changed() const; /// Make parser object reusable. void clear(); /** Change the encoding used when reading the file. * This stop parsing. Call set_file_and_start_parsing() to restart the parser * with the specified encoding. * See the FileEncoding namespace. */ void set_encoding(const Glib::ustring& encoding_charset); //TODO: Add @result A rough estimate of the number of rows that will be parsed. /** Open the file and start parsing the rows. * signal_line_scanned() will then be emitted when a row has been parsed. * signal_finished_parsing() will be emitted when there are no more rows to parse. * signal_file_read_error() will be emitted if there is a problem while parsing. * * @param uri The URI of the file containing the CSV data to parse. */ void set_file_and_start_parsing(const std::string& uri); private: // In order to not make the UI feel sluggish during larger imports we parse // on chunk at a time in the idle handler. bool on_idle_parse(); void begin_parse(); static const gunichar DELIMITER = ','; static const gunichar QUOTE = '\"'; static bool next_char_is_quote(const Glib::ustring::const_iterator& iter, const Glib::ustring::const_iterator& end); void do_line_scanned(const Glib::ustring& current_line, guint line_number); //TODO: Document this: static Glib::ustring::const_iterator advance_field(const Glib::ustring::const_iterator& iter, const Glib::ustring::const_iterator& end, Glib::ustring& field); void ensure_idle_handler_connection(); void on_file_read(const Glib::RefPtr& result, const Glib::RefPtr& source); void copy_buffer_and_continue_reading(gssize size); void on_buffer_read(const Glib::RefPtr& result); void on_file_query_info(const Glib::RefPtr& result, const Glib::RefPtr& source); void set_state(State state); // The raw data in the original encoding. We keep this so we can convert // from the user-selected encoding to UTF-8 every time the user changes // the encoding. std::vector m_raw; std::string m_encoding; std::vector::size_type m_input_position; std::string m_current_line; bool m_in_quotes; sigc::connection m_idle_connection; unsigned int m_line_number; State m_state; Glib::RefPtr m_stream; // Parsed data: type_rows m_rows; // Indicates which row to fetch next: guint m_row_index; type_signal_file_read_error m_signal_file_read_error; type_signal_have_display_name m_signal_have_display_name; type_signal_encoding_error m_signal_encoding_error; type_signal_line_scanned m_signal_line_scanned; type_signal_finished_parsing m_finished_parsing; type_signal_state_changed m_signal_state_changed; struct Buffer { char buf[1024]; }; std::auto_ptr m_buffer; }; } //namespace Glom #endif //GLOM_CSV_PARSER_H glom-1.22.4/glom/import_csv/file_encodings.h0000644000175000017500000000304512234252645022237 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2009 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_IMPORT_CSV_FILE_ENCODINGS_H #define GLOM_IMPORT_CSV_FILE_ENCODINGS_H #include #include namespace Glom { namespace FileEncodings { class Encoding { public: Encoding(const char* name, const char* charset); Glib::ustring get_charset() const; Glib::ustring get_name() const; private: const char* m_name; const char* m_charset; }; typedef std::list type_list_encodings; /** Get a list of file encodings to offer to the user. */ type_list_encodings get_list_of_encodings(); /** Discover the human-readable name (such as "Western") of a charset * (such as "ISO-8859-1") */ Glib::ustring get_name_of_charset(const Glib::ustring& charset); } //namespace FileEncodings } //namespace Glom #endif //GLOM_IMPORT_CSV_FILE_ENCODINGS_H glom-1.22.4/glom/import_csv/dialog_import_csv.h0000644000175000017500000001266512234252645023003 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_DIALOG_IMPORT_CSV_H #define GLOM_DIALOG_IMPORT_CSV_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include namespace Glom { class Dialog_Import_CSV : public Gtk::Dialog, public Base_DB { public: static const char* glade_id; static const bool glade_developer; Dialog_Import_CSV(BaseObjectType* cobject, const Glib::RefPtr& builder); void import(const Glib::ustring& uri, const Glib::ustring& into_table); CsvParser::State get_parser_state() const; Glib::ustring get_target_table_name() const; const Glib::ustring& get_file_uri() const; sharedptr get_field_for_column(unsigned int col) const; const Glib::ustring& get_data(unsigned int row, unsigned int col); // TODO: perhaps it would be safer to just wrap the needed parser API here. CsvParser& get_parser(); typedef sigc::signal type_signal_state_changed; /** This signal will be emitted when the parser's state changes. */ type_signal_state_changed signal_state_changed() const; private: void clear(); void show_error_dialog(const Glib::ustring& primary, const Glib::ustring& secondary); Glib::ustring get_current_encoding() const; void begin_parse(); void setup_sample_model(const CsvParser::type_row_strings& row); Gtk::TreeViewColumn* create_sample_column(const Glib::ustring& title, guint index); Gtk::CellRendererCombo* create_sample_cell(guint index); //CellRenderer cell_data_func callbacks: void line_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter); void field_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, unsigned int column_number); void on_field_edited(const Glib::ustring& path, const Glib::ustring& new_text, unsigned int column_number); void encoding_data_func(const Gtk::TreeModel::iterator& iter, Gtk::CellRendererText& renderer); bool row_separator_func(const Glib::RefPtr& model, const Gtk::TreeModel::iterator& iter) const; void on_parser_file_read_error(const Glib::ustring& error_message); void on_parser_have_display_name(const Glib::ustring& display_name); void on_parser_encoding_error(); void on_parser_line_scanned(CsvParser::type_row_strings row, unsigned int row_number); void on_parser_state_changed(); void on_combo_encoding_changed(); void on_first_line_as_title_toggled(); void on_sample_rows_changed(); void validate_primary_key(); class EncodingColumns: public Gtk::TreeModelColumnRecord { public: EncodingColumns() { add(m_col_name); add(m_col_charset); } Gtk::TreeModelColumn m_col_name; Gtk::TreeModelColumn m_col_charset; }; class FieldColumns: public Gtk::TreeModelColumnRecord { public: FieldColumns() { add(m_col_field_name); add(m_col_field); } Gtk::TreeModelColumn m_col_field_name; Gtk::TreeModelColumn > m_col_field; }; class SampleColumns: public Gtk::TreeModelColumnRecord { public: SampleColumns() { add(m_col_row); } Gtk::TreeModelColumn m_col_row; }; std::auto_ptr m_parser; EncodingColumns m_encoding_columns; Glib::RefPtr m_encoding_model; FieldColumns m_field_columns; Glib::RefPtr m_field_model; Glib::RefPtr m_field_model_sorted; SampleColumns m_sample_columns; Glib::RefPtr m_sample_model; Gtk::TreeView* m_sample_view; Gtk::Label* m_target_table; Gtk::ComboBox* m_encoding_combo; Gtk::Label* m_encoding_info; Gtk::CheckButton* m_first_line_as_title; Gtk::SpinButton* m_sample_rows; Gtk::Label* m_advice_label; Gtk::Label* m_error_label; Glib::ustring m_file_uri; // Index into the ENCODINGS array (see dialog_import_csv.cc) for the // encoding that we currently try to read the data with, or -1 if // auto-detection is disabled. int m_auto_detect_encoding; // The first row decides the amount of columns in our model, during model // setup. We implicitly fill up every row that is shorter, and cut longer // rows. guint m_cols_count; // The fields into which to import the data: typedef std::vector< sharedptr > type_vec_fields; type_vec_fields m_fields; type_signal_state_changed m_signal_state_changed; }; } //namespace Glom #endif //GLOM_DIALOG_IMPORT_CSV_H glom-1.22.4/glom/glom_create_from_example.cc0000644000175000017500000003674312234776363022302 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ // For instance: // glom_create_from_example /opt/gnome30/share/doc/glom/examples/example_music_collection.glom --output-path=/home/murrayc/ --output-name="something.glom" #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //For getpass(). #include class GlomCreateOptionGroup : public Glib::OptionGroup { public: GlomCreateOptionGroup(); //These instances should live as long as the OptionGroup to which they are added, //and as long as the OptionContext to which those OptionGroups are added. std::string m_arg_filename_input; std::string m_arg_filepath_dir_output; std::string m_arg_filepath_name_output; bool m_arg_version; //If not using self-hosting: Glib::ustring m_arg_server_hostname; double m_arg_server_port; Glib::ustring m_arg_server_username; Glib::ustring m_arg_server_password; }; GlomCreateOptionGroup::GlomCreateOptionGroup() : Glib::OptionGroup("glom_create_from_example", _("Glom options"), _("Command-line options")), m_arg_version(false), m_arg_server_port(0) { Glib::OptionEntry entry; entry.set_long_name("input"); entry.set_short_name('i'); entry.set_description(_("The example .glom file to open.")); add_entry_filename(entry, m_arg_filename_input); entry.set_long_name("output-path"); entry.set_short_name('o'); entry.set_description(_("The directory in which to save the created .glom file, or sub-directory if necessary, such as /home/someuser/ .")); add_entry_filename(entry, m_arg_filepath_dir_output); entry.set_long_name("output-name"); entry.set_short_name('n'); entry.set_description(_("The name for the created .glom file, such as something.glom .")); add_entry_filename(entry, m_arg_filepath_name_output); entry.set_long_name("version"); entry.set_short_name('V'); entry.set_description(_("The version of this application.")); add_entry(entry, m_arg_version); entry.set_long_name("server-hostname"); entry.set_short_name('h'); entry.set_description(_("The hostname of the PostgreSQL server, such as localhost. If this is not specified then a self-hosted database will be created.")); add_entry(entry, m_arg_server_hostname); entry.set_long_name("server-port"); entry.set_short_name('p'); entry.set_description(_("The port of the PostgreSQL server, such as 5434.")); add_entry(entry, m_arg_server_port); entry.set_long_name("server-username"); entry.set_short_name('u'); entry.set_description(_("The username for the PostgreSQL server.")); add_entry(entry, m_arg_server_username); } static void on_initialize_progress() { std::cout << "Database initialization progress" << std::endl; } static void on_startup_progress() { std::cout << "Database startup progress" << std::endl; } static void on_recreate_progress() { std::cout << "Database re-creation progress" << std::endl; } static void on_cleanup_progress() { std::cout << "Database cleanup progress" << std::endl; } /** Delete a directory, if it exists, and its contents. * Unlike g_file_delete(), this does not fail if the directory is not empty. */ static bool delete_directory(const Glib::RefPtr& directory) { if(!(directory->query_exists())) return true; //(Recursively) Delete any child files and directories, //so we can delete this directory. Glib::RefPtr enumerator = directory->enumerate_children(); Glib::RefPtr info = enumerator->next_file(); while(info) { Glib::RefPtr child = directory->get_child(info->get_name()); bool removed_child = false; if(child->query_file_type() == Gio::FILE_TYPE_DIRECTORY) removed_child = delete_directory(child); else removed_child = child->remove(); if(!removed_child) return false; info = enumerator->next_file(); } //Delete the actual directory: if(!directory->remove()) return false; return true; } /** Delete a directory, if it exists, and its contents. * Unlike g_file_delete(), this does not fail if the directory is not empty. */ static bool delete_directory(const std::string& uri) { if(uri.empty()) return true; Glib::RefPtr file = Gio::File::create_for_uri(uri); return delete_directory(file); } std::string filepath_dir; static Glib::ustring convert_filepath_to_uri(const std::string& filepath) { try { return Glib::filename_to_uri(filepath); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": Could not convert filepath to URI: " << filepath << std::endl; return Glib::ustring(); } } static void cleanup() { Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); const bool stopped = connection_pool->cleanup( sigc::ptr_fun(&on_cleanup_progress) ); g_assert(stopped); //Make sure the directory is removed at the end, { const Glib::ustring uri = convert_filepath_to_uri(filepath_dir); delete_directory(uri); } } int main(int argc, char* argv[]) { bindtextdomain(GETTEXT_PACKAGE, GLOM_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); // Set the locale for any streams to the user's current locale, // We should not rely on the default locale of // any streams (we should always do an explicit imbue()), // but this is maybe a good default in case we forget. try { std::locale::global(std::locale("")); } catch(const std::runtime_error& ex) { //This has been known to throw an exception at least once: //https://bugzilla.gnome.org/show_bug.cgi?id=619445 //This should tell us what the problem is: std::cerr << G_STRFUNC << ": exception from std::locale::global(std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } Glom::libglom_init(); Glib::OptionContext context; GlomCreateOptionGroup group; context.set_main_group(group); try { context.parse(argc, argv); } catch(const Glib::OptionError& ex) { std::cout << _("Error while parsing command-line options: ") << std::endl << ex.what() << std::endl; std::cout << _("Use --help to see a list of available command-line options.") << std::endl; return 0; } catch(const Glib::Error& ex) { std::cout << "Error: " << ex.what() << std::endl; return 0; } if(group.m_arg_version) { std::cout << PACKAGE_STRING << std::endl; return 0; } // Get a URI for a test file: Glib::ustring input_uri = group.m_arg_filename_input; // The GOption documentation says that options without names will be returned to the application as "rest arguments". // I guess this means they will be left in the argv. Murray. if(input_uri.empty() && (argc > 1)) { const char* pch = argv[1]; if(pch) input_uri = pch; } if(!input_uri.empty()) { //Get a URI (file://something) from the filepath: Glib::RefPtr file = Gio::File::create_for_commandline_arg(input_uri); if(!file->query_exists()) { std::cerr << _("Glom: The file does not exist.") << std::endl; std::cerr << "uri: " << input_uri << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } const Gio::FileType file_type = file->query_file_type(); if(file_type == Gio::FILE_TYPE_DIRECTORY) { std::cerr << _("Glom: The file path is a directory instead of a file.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } input_uri = file->get_uri(); } if(input_uri.empty()) { std::cerr << "Please specify a glom example file." << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //Check the output directory path: if(group.m_arg_filepath_dir_output.empty()) { std::cerr << "Please specify an output directory path." << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } else { //Get a URI (file://something) from the filepath: Glib::RefPtr file = Gio::File::create_for_commandline_arg(group.m_arg_filepath_dir_output); if(!file->query_exists()) { std::cerr << _("Glom: The output directory does not exist.") << std::endl; std::cerr << "uri: " << group.m_arg_filepath_dir_output << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } const Gio::FileType file_type = file->query_file_type(); if(file_type != Gio::FILE_TYPE_DIRECTORY) { std::cerr << _("Glom: The output path is not a directory.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } } //Check the output name path: if(group.m_arg_filepath_name_output.empty()) { std::cerr << "Please specify an output name." << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } // Load the document: Glom::Document document; document.set_file_uri(input_uri); int failure_code = 0; const bool test = document.load(failure_code); //std::cout << "Document load result=" << test << std::endl; if(!test) { std::cerr << "Document::load() failed with failure_code=" << failure_code << std::endl; return EXIT_FAILURE; } g_assert(document.get_is_example_file());; Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); //Save a copy, specifying the path to file in a directory: filepath_dir = Glom::Utils::get_file_path_without_extension( Glib::build_filename( group.m_arg_filepath_dir_output, group.m_arg_filepath_name_output)); const std::string filepath = Glib::build_filename(filepath_dir, group.m_arg_filepath_name_output); //Make sure that the file does not exist yet: { const Glib::ustring uri = convert_filepath_to_uri(filepath_dir); if(uri.empty()) return EXIT_FAILURE; Glib::RefPtr file = Gio::File::create_for_commandline_arg(uri); if(file->query_exists()) { std::cerr << "The output path already exists: " << filepath_dir << std::endl; return EXIT_FAILURE; } } //Save the example as a real file: const Glib::ustring file_uri = convert_filepath_to_uri(filepath); if(file_uri.empty()) return EXIT_FAILURE; document.set_file_uri(file_uri); const bool self_hosting = group.m_arg_server_hostname.empty(); if(self_hosting) { std::cout << "Using self-hosting instead of a central PostgreSQL server." << std::endl; document.set_hosting_mode(Glom::Document::HOSTING_MODE_POSTGRES_SELF); } else { std::cout << "Using the PostgreSQL server with host: " << group.m_arg_server_hostname << std::endl; document.set_hosting_mode(Glom::Document::HOSTING_MODE_POSTGRES_CENTRAL); } document.set_is_example_file(false); document.set_network_shared(false); const bool saved = document.save(); g_assert(saved); //Specify the backend and backend-specific details to be used by the connectionpool. connection_pool->setup_from_document(&document); //We must specify a default username and password: if(self_hosting) { Glib::ustring password; const Glib::ustring user = Glom::Privs::get_default_developer_user_name(password); connection_pool->set_user(user); connection_pool->set_password(password); } else { //Get the password from stdin. //This is not a command-line option because then it would appear in logs. //Other command-line utilities such as psql don't do this either. //TODO: Support alternatives such as using a file. const Glib::ustring prompt = Glib::ustring::compose( _("Please enter the PostgreSQL server's password for the user %1: "), group.m_arg_server_username); #ifdef G_OS_WIN32 const char* password = ""; std::cerr << _("Error: getpass() is not implemented in the Windows build. The connection will fail.") << std::endl; #else const char* password = ::getpass(prompt.c_str()); #endif //Central hosting: connection_pool->set_user(group.m_arg_server_username); connection_pool->set_password(password); //TODO: Take this from stdin instead. Glom::ConnectionPool::Backend* backend = connection_pool->get_backend(); Glom::ConnectionPoolBackends::PostgresCentralHosted* central = dynamic_cast(backend); g_assert(central); central->set_host(group.m_arg_server_hostname); if(group.m_arg_server_port) { central->set_port(group.m_arg_server_port); central->set_try_other_ports(false); } else { //Try all ports: central->set_try_other_ports(false); } const Glib::ustring database_name = Glom::DbUtils::get_unused_database_name(document.get_connection_database()); if(database_name.empty()) { std::cerr << G_STRFUNC << ": Could not find an unused database name" << std::endl; } else document.set_connection_database(database_name); } //Startup. For instance, create the self-hosting files if necessary: const Glom::ConnectionPool::InitErrors initialized_errors = connection_pool->initialize( sigc::ptr_fun(&on_initialize_progress) ); g_assert(initialized_errors == Glom::ConnectionPool::Backend::INITERROR_NONE); //Start self-hosting: //TODO: Let this happen automatically on first connection? const Glom::ConnectionPool::StartupErrors started = connection_pool->startup( sigc::ptr_fun(&on_startup_progress) ); if(started != Glom::ConnectionPool::Backend::STARTUPERROR_NONE) { std::cerr << "connection_pool->startup(): result=" << started << std::endl; cleanup(); } g_assert(started == Glom::ConnectionPool::Backend::STARTUPERROR_NONE); const bool recreated = Glom::DbUtils::recreate_database_from_document(&document, sigc::ptr_fun(&on_recreate_progress) ); if(!recreated) cleanup(); g_assert(recreated); //Tell the user where the file is: std::string output_path_used; try { output_path_used = Glib::filename_from_uri(document.get_file_uri()); } catch(const Glib::ConvertError& ex) { std::cerr << G_STRFUNC << ": Could not convert URI to output filepath: " << document.get_file_uri() << std::endl; } std::cout << "Glom file created at: " << output_path_used << std::endl; Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/glom/glom_document.dtd0000644000175000017500000004530712234776363020301 0ustar00murraycmurrayc00000000000000 glom-1.22.4/glom/application.cc0000644000175000017500000001500012234776363017545 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include namespace Glom { // We use Gio::APPLICATION_NON_UNIQUE because we have some singletons and other static data, // to simplify our code. // We also want to prevent all instances from crashing when one instance crashes. Application::Application() : Gtk::Application("org.glom.application", Gio::APPLICATION_HANDLES_OPEN | Gio::APPLICATION_HANDLES_COMMAND_LINE | Gio::APPLICATION_NON_UNIQUE) { } Glib::RefPtr Application::create() { return Glib::RefPtr( new Application() ); } void Application::create_window(const Glib::RefPtr& file) { //std::cout << G_STRFUNC << ": debug" << std::endl; AppWindow* window = 0; Glom::Utils::get_glade_widget_derived_with_warning(window); g_assert(window); window->set_show_sql_debug(m_remote_option_group.m_arg_debug_sql); window->set_stop_auto_server_shutdown(m_remote_option_group.m_arg_stop_auto_server_shutdown); //Make sure that the application runs for as long this window is still open: add_window(*window); //Delete the window when it is hidden: window->signal_hide().connect(sigc::bind(sigc::mem_fun(*this, &Application::on_window_hide), window)); Glib::ustring input_uri; if(file) //If it's empty then this is a new empty file, as a result of an activation rather than an open. { input_uri = file->get_uri(); } const bool test = window->init_with_document(input_uri, m_remote_option_group.m_arg_restore); //Sets it up and shows it. if(!test) //The user could cancel the offer of a new or existing database. { window->hide(); //This will cause it to be deleted by on_window_hide. } } void Application::on_window_hide(Gtk::Window* window) { delete window; } void Application::on_activate() { //std::cout << G_STRFUNC << ": debug" << std::endl; // The application has been started, so let's show a window: create_window(); } void Application::on_open(const Gio::Application::type_vec_files& files, const Glib::ustring& hint) { //std::cout << G_STRFUNC << ": debug" << std::endl; // The application has been asked to open some files, // so let's open a new window for each one. //std::cout << "debug: files.size()=" << files.size() << std::endl; for(guint i = 0; i < files.size(); i++) { Glib::RefPtr file = files[i]; if(!file) { std::cerr << G_STRFUNC << ": file is null." << std::endl; } else create_window(file); } Gtk::Application::on_open(files, hint); } int Application::on_command_line(const Glib::RefPtr& command_line) { //std::cout << G_STRFUNC << ": debug" << std::endl; //Parse command-line arguments that were passed either to the main (first) instance //or to subsequent instances. //Note that this parsing is happening in the main (not remote) instance. int argc = 0; char** argv = command_line->get_arguments(argc); Glib::OptionContext context; context.set_main_group(m_remote_option_group); //Note that these options should really be parsed in main(), //but we do it here because of glib bug: https://bugzilla.gnome.org/show_bug.cgi?id=634990#c6 //Handling the two groups together here is possible due to our use of Gio::APPLICATION_NON_UNIQUE . LocalOptionGroup local_group; context.add_group(local_group); try { context.parse(argc, argv); } catch(const Glib::OptionError& ex) { std::cout << _("Error while parsing command-line options: ") << std::endl << ex.what() << std::endl; std::cout << _("Use --help to see a list of available command-line options.") << std::endl; return EXIT_FAILURE; } catch(const Glib::Error& ex) { std::cout << "Error: " << ex.what() << std::endl; return EXIT_FAILURE; } //Get command-line parameters, if any: if(!local_group.handle_options()) return EXIT_FAILURE; bool stop = false; const bool date_check_ok = local_group.get_debug_date_check_result(stop); if(stop) { //This command-line option is documented as stopping afterwards. return date_check_ok ? EXIT_SUCCESS : EXIT_FAILURE; } Glib::ustring input_uri = m_remote_option_group.m_arg_filename; // The GOption documentation says that options without names will be returned to the application as "rest arguments". // I guess this means they will be left in the argv. Murray. if(input_uri.empty() && (argc > 1)) { const char* pch = argv[1]; if(pch) input_uri = pch; } Glib::RefPtr file; if(!input_uri.empty()) { //Get a URI (file://something) from the filepath: file = Gio::File::create_for_commandline_arg(input_uri); if(!file->query_exists()) { std::cerr << _("Glom: The file does not exist.") << std::endl; std::cerr << "uri: " << input_uri << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } const Gio::FileType file_type = file->query_file_type(); if(file_type == Gio::FILE_TYPE_DIRECTORY) { std::cerr << _("Glom: The file path is a directory instead of a file.") << std::endl; std::cerr << std::endl << context.get_help() << std::endl; return EXIT_FAILURE; } //std::cout << "URI = " << input_uri << std::endl; } //debugging: //input_uri = "file:///home/murrayc/cvs/gnome212/glom/examples/example_smallbusiness.glom"; if(file) { open(file); //TODO: Find out why calling open() with a null File causes an infinite loop. } else { //Open a new "document" instead: activate(); } //The local instance will eventually exit with this status code: return EXIT_SUCCESS; } } //namespace Glom glom-1.22.4/glom/glom_test_connection.cc0000644000175000017500000001671612234776363021475 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the 71 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ // For instance: // glom_test_connection --server-hostname=localhost --server-port=5433 --server-username=someuser #include "config.h" #include #include #include #include #include #include #include #include #include #include #include class GlomCreateOptionGroup : public Glib::OptionGroup { public: GlomCreateOptionGroup(); //These instances should live as long as the OptionGroup to which they are added, //and as long as the OptionContext to which those OptionGroups are added. bool m_arg_version; Glib::ustring m_arg_server_hostname; double m_arg_server_port; Glib::ustring m_arg_server_username; Glib::ustring m_arg_server_password; Glib::ustring m_arg_server_database; }; GlomCreateOptionGroup::GlomCreateOptionGroup() : Glib::OptionGroup("glom_create_from_example", _("Glom options"), _("Command-line options")), m_arg_version(false), m_arg_server_port(0) { Glib::OptionEntry entry; entry.set_long_name("version"); entry.set_short_name('V'); entry.set_description(_("The version of this application.")); add_entry(entry, m_arg_version); entry.set_long_name("server-hostname"); entry.set_short_name('h'); entry.set_description(_("The hostname of the PostgreSQL server, such as localhost.")); add_entry(entry, m_arg_server_hostname); entry.set_long_name("server-port"); entry.set_short_name('p'); entry.set_description(_("The port of the PostgreSQL server, such as 5434.")); add_entry(entry, m_arg_server_port); entry.set_long_name("server-username"); entry.set_short_name('u'); entry.set_description(_("The username for the PostgreSQL server.")); add_entry(entry, m_arg_server_username); //Optional: entry.set_long_name("server-database"); entry.set_short_name('d'); entry.set_description(_("The specific database on the PostgreSQL server (Optional).")); add_entry(entry, m_arg_server_database); } static void print_options_hint() { //TODO: How can we just print them out? std::cout << _("Use --help to see a list of available command-line options.") << std::endl; } int main(int argc, char* argv[]) { bindtextdomain(GETTEXT_PACKAGE, GLOM_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); // Set the locale for any streams to the user's current locale, // We should not rely on the default locale of // any streams (we should always do an explicit imbue()), // but this is maybe a good default in case we forget. try { std::locale::global(std::locale("")); } catch(const std::runtime_error& ex) { //This has been known to throw an exception at least once: //https://bugzilla.gnome.org/show_bug.cgi?id=619445 //This should tell us what the problem is: std::cerr << G_STRFUNC << ": exception from std::locale::global(std::locale(\"\")): " << ex.what() << std::endl; std::cerr << " This can happen if the locale is not properly installed or configured." << std::endl; } Glom::libglom_init(); Glib::OptionContext context; GlomCreateOptionGroup group; context.set_main_group(group); try { context.parse(argc, argv); } catch(const Glib::OptionError& ex) { std::cout << _("Error while parsing command-line options: ") << std::endl << ex.what() << std::endl; print_options_hint(); return EXIT_FAILURE; } catch(const Glib::Error& ex) { std::cerr << "Error: " << ex.what() << std::endl; return EXIT_FAILURE; } if(group.m_arg_version) { std::cout << PACKAGE_STRING << std::endl; return EXIT_SUCCESS; } if(group.m_arg_server_hostname.empty()) { std::cerr << "Please provide a database hostname." << std::endl; print_options_hint(); return EXIT_FAILURE; } if(group.m_arg_server_username.empty()) { std::cerr << _("Please provide a database username.") << std::endl; print_options_hint(); return EXIT_FAILURE; } //Get the password from stdin. //This is not a command-line option because then it would appear in logs. //Other command-line utilities such as psql don't do this either. //TODO: Support alternatives such as using a file. const Glib::ustring prompt = Glib::ustring::compose( _("Please enter the PostgreSQL server's password for the user %1: "), group.m_arg_server_username); #ifdef G_OS_WIN32 const char* password = ""; std::cerr << _("Error: getpass() is not implemented in the Windows build. The connection will fail.") << std::endl; #else const char* password = ::getpass(prompt.c_str()); #endif //Setup the connection, assuming that we are testing central hosting: Glom::ConnectionPool* connection_pool = Glom::ConnectionPool::get_instance(); //Specify the backend and backend-specific details to be used by the connectionpool. //This is usually done by ConnectionPool::setup_from_document(): Glom::ConnectionPoolBackends::PostgresCentralHosted* backend = new Glom::ConnectionPoolBackends::PostgresCentralHosted; backend->set_host(group.m_arg_server_hostname); //Use a specified port, or try all suitable ports: if(group.m_arg_server_port) { backend->set_port(group.m_arg_server_port); backend->set_try_other_ports(false); } else { backend->set_try_other_ports(true); } connection_pool->set_user(group.m_arg_server_username); connection_pool->set_password(password); connection_pool->set_backend(std::auto_ptr(backend)); if(group.m_arg_server_database.empty()) { //Prevent it from trying to connect to a database with the same name as the user, //which is more likely to exist by chance than this silly name: connection_pool->set_database("somenonexistantdatbasename"); } else { connection_pool->set_database(group.m_arg_server_database); } connection_pool->set_ready_to_connect(); try { connection_pool->connect(); } catch(const Glom::ExceptionConnection& ex) { if(ex.get_failure_type() == Glom::ExceptionConnection::FAILURE_NO_SERVER) { std::cerr << _("Error: Could not connect to the server even without specifying a database.") << std::endl; return EXIT_FAILURE; } else if(ex.get_failure_type() == Glom::ExceptionConnection::FAILURE_NO_DATABASE) { //We expect this exception if we did not specify a database: if(!(group.m_arg_server_database.empty())) { std::cerr << _("Error: Could not connect to the specified database.") << std::endl; return EXIT_FAILURE; } } } std::cout << _("Successful connection.") << std::endl; Glom::libglom_deinit(); return EXIT_SUCCESS; } glom-1.22.4/glom/glom.rc0000644000175000017500000000010712234252645016211 0ustar00murraycmurrayc00000000000000A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "../icons/win32/glom.ico" glom-1.22.4/glom/print_layout/0000755000175000017500000000000012235000126017442 5ustar00murraycmurrayc00000000000000glom-1.22.4/glom/print_layout/canvas_print_layout.h0000644000175000017500000001450212234776363023727 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2007 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PRINT_LAYOUT_CANVAS_PRINT_LAYOUT_H #define GLOM_PRINT_LAYOUT_CANVAS_PRINT_LAYOUT_H #include #include #include #include #include #include #include #include namespace Glom { class Dialog_TextFormatting; class LayoutItem_Portal; /// A canvas that contains CanvasLayoutItem items. class Canvas_PrintLayout : public CanvasEditable, public Base_DB { public: Canvas_PrintLayout(); virtual ~Canvas_PrintLayout(); void set_print_layout(const Glib::ustring& table_name, const sharedptr& print_layout); sharedptr get_print_layout(); void set_page_setup(const Glib::RefPtr& page_setup); Glib::RefPtr get_page_setup(); Glib::RefPtr get_page_setup() const; void set_page_count(guint count); guint get_page_count() const; void set_zoom_percent(guint percent); /** Hide the bounds rectangle and the margin lines: */ void hide_page_bounds(); void add_canvas_layout_item(const Glib::RefPtr& item); void remove_canvas_layout_item(const Glib::RefPtr& item); /** If the item is a field from the System Preferences table, * show the content instead of the field name, * because it will be the same for all records. */ void fill_with_data_system_preferences(const Glib::RefPtr& canvas_item, Document* document); void fill_with_data(const FoundSet& found_set, bool avoid_page_margins); virtual void set_grid_gap(double gap = 20.0); void set_outlines_visibility(bool visible = true); /** Get any items that have get_selected()==true. */ virtual type_vec_items get_selected_items(); /** Set all items as selected or unselected. * @param selected Use false to unselect all. */ void select_all(bool selected = true); Goocanvas::Bounds get_page_bounds(guint page_num) const; /** Look for any items that overlap the @a canvas_item and move them down so that the no longer overlap. * @param y_start Ignore any items whose y position is less than this. * @param offset Move items down by this amount * @param result The highest item that should be moved down to the start of the next page, if any: */ Glib::RefPtr move_items_down(double y_start, double offset); private: #ifndef GLOM_ENABLE_CLIENT_ONLY void setup_context_menu(); #endif void add_layout_group(const sharedptr& group, bool is_top_level = false); void add_layout_group_children(const sharedptr& group); void fill_layout_group(const sharedptr& group); //These are not static, because they need access to the document: void fill_with_data(const Glib::RefPtr& canvas_group, const FoundSet& found_set, bool avoid_page_margins); void fill_with_data_portal(const Glib::RefPtr& canvas_item, const Gnome::Gda::Value& foreign_key_value); static void set_canvas_item_field_value(const Glib::RefPtr& canvas_item, const sharedptr& field, const Gnome::Gda::Value& value); type_vecConstLayoutFields get_portal_fields_to_show(const sharedptr& portal); void create_canvas_layout_item_and_add(const sharedptr& layout_item); #ifndef GLOM_ENABLE_CLIENT_ONLY sharedptr offer_related_records(const sharedptr& portal, Gtk::Window* parent); sharedptr offer_line(const sharedptr& portal, Gtk::Window* parent); //TODO: Make the signal send the item, so we can pass it by const reference: void on_item_show_context_menu(guint button, guint32 activate_time, Glib::RefPtr item); void on_context_menu_edit(); void on_context_menu_formatting(); void on_context_menu_delete(); bool on_background_button_press_event(const Glib::RefPtr& target, GdkEventButton* event); void on_dialog_format_hide(); #endif void update_page_bounds(); Glib::RefPtr create_margin_line(double x1, double y1, double x2, double y2); double get_page_height() const; double get_page_height(double& margin_top, double& margin_bottom) const; Glib::ustring m_table_name; bool m_modified; //TODO: Actually check this? //A group containing the layout items, so we can remove them without removing anything else: Glib::RefPtr m_items_group; //A rectangle to show the bounds: Glib::RefPtr m_bounds_group; //the page and its margins. Glib::RefPtr m_bounds_rect; Glib::RefPtr m_margin_left, m_margin_right; typedef std::vector< Glib::RefPtr > type_vec_margins; type_vec_margins m_vec_margin_tops; type_vec_margins m_vec_margin_bottoms; //Context menu for existing items: Gtk::Menu* m_context_menu; Glib::RefPtr m_context_menu_action_group; Glib::RefPtr m_context_menu_uimanager; Glib::RefPtr m_action_edit, m_action_formatting, m_action_delete; Glib::RefPtr m_context_item; //The selected item when showing the context menu., Glib::RefPtr m_page_setup; Dialog_TextFormatting* m_dialog_format; bool m_outline_visibility; guint m_page_count; }; } //namespace Glom #endif // GLOM_PRINT_LAYOUT_CANVAS_PRINT_LAYOUT_H glom-1.22.4/glom/print_layout/canvas_layout_item.h0000644000175000017500000000746712234252646023536 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_MODE_DESIGN_PRINT_LAYOUTS_CANVAS_LAYOUT_ITEM_H #define GLOM_MODE_DESIGN_PRINT_LAYOUTS_CANVAS_LAYOUT_ITEM_H #include #include #include #include namespace Glom { class CanvasTextMovable; class CanvasTableMovable; class Formatting; class LayoutItem_Portal; /** This has the appropriate child canvas item, depending on the type of the child LayoutItem. * You should call set_layout_item() after instantiating a CanvasLayoutItem via create(), * and after adding the CanvasLayoutItem to a parent CanvasItem that is already in a Goocanvas::Canvas. * * If the CanvasLayoutItem is not already (indirectly) in a GooCanvas::Canvas then * Goocanvas::Image items will show over-scaled images, due to goocanvas bug: * https://bugzilla.gnome.org/show_bug.cgi?id=657592#c16 */ class CanvasLayoutItem : public CanvasGroupResizable { private: CanvasLayoutItem(); virtual ~CanvasLayoutItem(); public: static Glib::RefPtr create(); //Creates a new canvas item, with an appropriate child canvas item, //and sets the position and size of this canvas item to the position in the LayoutItem. static Glib::RefPtr create(const sharedptr& layout_item); sharedptr get_layout_item(); //Create an appropriate child canvas item, //and sets the position and size of this canvas item to the position in the LayoutItem. void set_layout_item(const sharedptr& layout_item); /// Make the canvas item show actual data instead of, for instance, a field name. void set_db_data(const Gnome::Gda::Value& value); /// Hide the missing-image pixbuf from images, for instance. void remove_empty_indicators(); static int get_rows_count_for_portal(const sharedptr& portal, double& row_height); /** Make sure that the LayoutItem has the same position info as the CanvasItem that represents it. */ void update_layout_position_from_canvas(); /* Add table child items if any are missing, * for instance if the table has been made bigger. */ void add_portal_rows_if_necessary(guint rows_count); static Glib::RefPtr get_canvas_table_cell_child(const Glib::RefPtr& table, int row, int col); //TODO: Add this to Goocanvas::Table. private: /// Create the appropriate inner canvas item to represent the layout item. static Glib::RefPtr create_canvas_item_for_layout_item(const sharedptr& layout_item); static void apply_formatting(const Glib::RefPtr& canvas_item, const sharedptr& layout_item); static void add_portal_rows_if_necessary(const Glib::RefPtr& canvas_table, const sharedptr& portal, guint rows_count); void on_resized(); sharedptr m_layout_item; }; } //namespace Glom #endif //GLOM_MODE_DESIGN_PRINT_LAYOUTS_CANVAS_LAYOUT_ITEM_H glom-1.22.4/glom/print_layout/printoperation_printlayout.h0000644000175000017500000000337412234252646025370 0ustar00murraycmurrayc00000000000000/* gtkmm example Copyright (C) 2006 gtkmm development team * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef GLOM_PRINT_OPERATION_PRINT_LAYOUT_H #define GLOM_PRINT_OPERATION_PRINT_LAYOUT_H #include #include #include namespace Glom { //We derive our own class from PrintOperation, //so we can put the actual print implementation here. class PrintOperationPrintLayout : public Gtk::PrintOperation { public: static Glib::RefPtr create(); virtual ~PrintOperationPrintLayout(); void set_canvas(Canvas_PrintLayout* canvas); private: PrintOperationPrintLayout(); //PrintOperation default signal handler overrides: virtual bool on_paginate(const Glib::RefPtr& context); //Comment this out if GTK+ bug #345345 has not been fixed yet. virtual void on_begin_print(const Glib::RefPtr& context); virtual void on_draw_page(const Glib::RefPtr& context, int page_nr); //Not owned by this instance: Canvas_PrintLayout* m_canvas; }; } //namespace Glom #endif // GLOM_PRINT_OPERATION_PRINT_LAYOUT_H glom-1.22.4/glom/print_layout/canvas_layout_item.cc0000644000175000017500000004344512234252646023670 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include "canvas_layout_item.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //For std::max(). #include namespace Glom { CanvasLayoutItem::CanvasLayoutItem() { //Rescale images when the canvas item is resized: signal_resized().connect( sigc::mem_fun(*this, &CanvasLayoutItem::on_resized) ); } CanvasLayoutItem::~CanvasLayoutItem() { } Glib::RefPtr CanvasLayoutItem::create() { return Glib::RefPtr(new CanvasLayoutItem()); } sharedptr CanvasLayoutItem::get_layout_item() { return m_layout_item; } void CanvasLayoutItem::apply_formatting(const Glib::RefPtr& canvas_item, const sharedptr& layout_item) { if(!canvas_item) return; if(!layout_item) return; //Horizontal alignment: const Formatting::HorizontalAlignment alignment = layout_item->get_formatting_used_horizontal_alignment(); const Pango::Alignment x_align = (alignment == Formatting::HORIZONTAL_ALIGNMENT_LEFT ? Pango::ALIGN_LEFT : Pango::ALIGN_RIGHT); canvas_item->property_alignment() = x_align; const Formatting& formatting = layout_item->get_formatting_used(); Glib::ustring font = formatting.get_text_format_font(); if(font.empty()) { //Just a sanity-check default that should never actually be used: font = "Serif 9"; } canvas_item->set_font_points(font); //TODO: Handle horizontal alignment. //TODO: Are these sensible properties? Maybe we need to use markup: //TODO: Use the negative color. const Glib::ustring fg = formatting.get_text_format_color_foreground(); if(!fg.empty()) { //GooCanvasText uses fill-color for the text foreground color. //Presumably stroke-color would be an outline, if we had a line-width of >0 width. canvas_item->property_fill_color() = fg; } const Glib::ustring bg = formatting.get_text_format_color_background(); if(!bg.empty()) { //TODO: Add a filled rectangle. } } void CanvasLayoutItem::on_resized() { Glib::RefPtr canvas_image = Glib::RefPtr::cast_dynamic(get_child()); if(canvas_image) canvas_image->scale_to_size(); } void CanvasLayoutItem::set_layout_item(const sharedptr& layout_item) { //TODO: If we can ever avoid this the also update the CanvasLayoutItem class documentation. if(!get_canvas()) { std::cerr << G_STRFUNC << ": get_canvas() returned null. This should not be called before the CanvasLayoutItem is in a canvas due to goocanvas bug https://bugzilla.gnome.org/show_bug.cgi?id=657592#c16 ." << std::endl; } //Add the new child: m_layout_item = layout_item; if(!m_layout_item) std::cerr << G_STRFUNC << ": item was NULL." << std::endl; Glib::RefPtr child_item = create_canvas_item_for_layout_item(m_layout_item); if(child_item) { //child_item->property_pointer_events() = // (Goocanvas::PointerEvents)(Goocanvas::EVENTS_VISIBLE_FILL & GOO_CANVAS_EVENTS_VISIBLE_STROKE); //Set the position and dimensions of this group to match the child: double x = 0; double y = 0; double width = 0; double height = 0; m_layout_item->get_print_layout_position(x, y, width, height); set_xy(x, y); set_width_height(width, height); //std::cout << "debug: " << G_STRFUNC << ": item x=" << x << std::endl; set_child(child_item); } //Scale images. //This can only be done after setting the size: Glib::RefPtr canvas_image = Glib::RefPtr::cast_dynamic(child_item); if(canvas_image) { canvas_image->scale_to_size(); } } //TODO: Remove this? int CanvasLayoutItem::get_rows_count_for_portal(const sharedptr& portal, double& row_height) { if(!portal) { row_height = 0; return 0; } row_height = std::max(portal->get_print_layout_row_height(), (double)1); //Avoid 0, because that makes the whole thing zero sized. double ignore_x = 0; double ignore_y = 0; double total_width = 0; double total_height = 0; portal->get_print_layout_position(ignore_x, ignore_y, total_width, total_height); const double max_rows_fraction = total_height / row_height; double max_rows = 0; modf(max_rows_fraction, &max_rows); std::cout << "debug: max_rows=" << max_rows << ", for total_height=" << total_height << ", row_height=" << row_height << std::endl; return max_rows; } Glib::RefPtr CanvasLayoutItem::create_canvas_item_for_layout_item(const sharedptr& layout_item) { Glib::RefPtr child; Glib::RefPtr child_item; sharedptr text = sharedptr::cast_dynamic(layout_item); if(text) { Glib::RefPtr canvas_item = CanvasTextMovable::create(); canvas_item->property_line_width() = 0; apply_formatting(canvas_item, text); canvas_item->set_text(text->get_text(AppWindow::get_current_locale())); child = canvas_item; child_item = canvas_item; } else { sharedptr image = sharedptr::cast_dynamic(layout_item); if(image) { Glib::RefPtr canvas_item = CanvasImageMovable::create(); Glib::RefPtr pixbuf = Utils::get_pixbuf_for_gda_value(image->m_image); if(pixbuf) canvas_item->set_image(pixbuf); else canvas_item->set_image_empty(); //show a no-image picture. //canvas_item->property_fill_color() = "white"; //This makes the whole area clickable, not just the outline stroke. //canvas_item->property_fill_color_rgba() = 0xFFFFFF00; child = canvas_item; child_item = canvas_item; } else { sharedptr line = sharedptr::cast_dynamic(layout_item); if(line) { double start_x = 0; double start_y = 0; double end_x = 0; double end_y = 0; line->get_coordinates(start_x, start_y, end_x, end_y); Glib::RefPtr canvas_item = CanvasLineMovable::create(); canvas_item->property_line_width() = line->get_line_width(); canvas_item->property_stroke_color() = line->get_line_color(); Goocanvas::Points points(2); points.set_coordinate(0, start_x, start_y); points.set_coordinate(0, end_x, end_y); canvas_item->property_points() = points; child = canvas_item; child_item = canvas_item; } else { sharedptr field = sharedptr::cast_dynamic(layout_item); if(field) { //Create an appropriate canvas item for the field type: if(field->get_glom_type() == Field::TYPE_IMAGE) { Glib::RefPtr canvas_item = CanvasImageMovable::create(); canvas_item->set_image_empty(); child = canvas_item; child_item = canvas_item; } else //text, numbers, date, time, boolean: { Glib::RefPtr canvas_item = CanvasTextMovable::create(); canvas_item->property_line_width() = 0; apply_formatting(canvas_item, field); Glib::ustring name = field->get_name(); if(name.empty()) name = _("Choose Field"); canvas_item->set_text(name); child = canvas_item; child_item = canvas_item; } } else { sharedptr portal = sharedptr::cast_dynamic(layout_item); if(portal) { Glib::RefPtr canvas_item = CanvasTableMovable::create(); canvas_item->set_lines_details( portal->get_print_layout_row_line_width(), portal->get_print_layout_column_line_width(), portal->get_print_layout_line_color()); gulong rows_count_min = 0; gulong rows_count_max = 0; portal->get_rows_count(rows_count_min, rows_count_max); add_portal_rows_if_necessary(canvas_item, portal, rows_count_min); child = canvas_item; child_item = canvas_item; } else if(layout_item) { std::cerr << G_STRFUNC << ": Unhandled LayoutItem type. part type=" << layout_item->get_part_type_name() << std::endl; } else { std::cerr << G_STRFUNC << ": NULL LayoutItem type." << std::endl; } } } } } return child; } Glib::RefPtr CanvasLayoutItem::get_canvas_table_cell_child(const Glib::RefPtr& table, int row, int col) { Glib::RefPtr result; if(!table) return result; const int count = table->get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = table->get_child(i); if(!child) continue; int column_value = 0; table->get_child_property(child, "column", column_value); int row_value = 0; table->get_child_property(child, "row", row_value); //This assumes that all items occupy only one cell: if( (column_value == col) && (row_value == row) ) { return child; } } return result; } void CanvasLayoutItem::add_portal_rows_if_necessary(guint rows_count) { Glib::RefPtr child = get_child(); Glib::RefPtr canvas_table = Glib::RefPtr::cast_dynamic(child); if(!canvas_table) return; sharedptr portal = sharedptr::cast_dynamic(get_layout_item()); if(!portal) { std::cerr << G_STRFUNC << ": The layout item was not a portal." << std::endl; return; } add_portal_rows_if_necessary(canvas_table, portal, rows_count); } void CanvasLayoutItem::add_portal_rows_if_necessary(const Glib::RefPtr& canvas_table, const sharedptr& portal, guint rows_count) { const double row_height = portal->get_print_layout_row_height(); const LayoutGroup::type_list_items child_items = portal->get_items(); for(guint row = 0; row < rows_count; ++row) { guint col = 0; const guint num_cols = child_items.size(); bool something_expanded = false; for(LayoutGroup::type_list_items::const_iterator iter = child_items.begin(); iter != child_items.end(); ++iter) { //std::cout << " row=" << row << ", col=" << col << std::endl; sharedptr layout_item = *iter; //Check if a child already exists: Glib::RefPtr existing_child = get_canvas_table_cell_child(canvas_table, row, col); if(existing_child) { //std::cout << " existing child" << std::endl; col++; continue; } //We use create_canvas_item_for_layout_item() instead of just //creating another CanvasLayoutItem, because that would be a group, //but goocanvas cannot yet support Groups inside Tables. murrayc. //TODO: Bug number. Glib::RefPtr cell = create_canvas_item_for_layout_item(layout_item); Glib::RefPtr cell_as_item = CanvasItemMovable::cast_to_item(cell); if(cell && cell_as_item) { const guint width = layout_item->get_display_width(); bool expand = (width == 0); //If this is the last item, and no other item has expanded, //let this one expand, //Otherwise, we could allocate less space than the table has left. //TODO: Prevent the user from allocating _more_ space than the table has. if(!something_expanded && (col == (num_cols - 1))) { expand = true; } if(expand) { //Let the table allocate the width automatically: cell->set_width_height(-1, row_height); canvas_table->attach(cell_as_item, col /* left_attach */, col + 1 /* right_attach */, row /* top_attach */, row + 1 /* right_attach */, (Gtk::AttachOptions)(Gtk::FILL | Gtk::EXPAND), (Gtk::AttachOptions)(Gtk::FILL | Gtk::EXPAND)); something_expanded = true; } else { //Enforce a width: //TODO: Add/Remove rows when resizing, instead of resizing the rows: cell->set_width_height(width, row_height); canvas_table->attach(cell_as_item, col /* left_attach */, col + 1 /* right_attach */, row /* top_attach */, row + 1 /* right_attach */, (Gtk::FILL), (Gtk::AttachOptions)(Gtk::FILL | Gtk::EXPAND)); //Add a second item (an invisible rect) to make sure that the size is really used: Glib::RefPtr rect = Goocanvas::Rect::create(0, 0, width, row_height); //TODO: Find out why this doesn't work: rect->property_stroke_pattern() = Cairo::RefPtr(); g_object_set(rect->gobj(), "stroke-pattern", (void*)0, (void*)0); canvas_table->attach(rect, col /* left_attach */, col + 1 /* right_attach */, row /* top_attach */, row + 1 /* right_attach */, Gtk::SHRINK, Gtk::SHRINK); } } ++col; } } } void CanvasLayoutItem::set_db_data(const Gnome::Gda::Value& value) { sharedptr field = sharedptr::cast_dynamic(m_layout_item); if(!field) return; Glib::RefPtr child = get_child(); if(!child) return; const Field::glom_field_type field_type = field->get_glom_type(); switch(field->get_glom_type()) { case(Field::TYPE_TEXT): case(Field::TYPE_NUMERIC): case(Field::TYPE_BOOLEAN): case(Field::TYPE_TIME): case(Field::TYPE_DATE): { Glib::RefPtr canvas_item = Glib::RefPtr::cast_dynamic(child); if(!canvas_item) return; Glib::ustring text_value = Conversions::get_text_for_gda_value(field_type, value, field->get_formatting_used().m_numeric_format); //The Postgres summary functions return NULL when summarising NULL records, but 0 is more sensible: if(text_value.empty() && sharedptr::cast_dynamic(field) && (field_type == Field::TYPE_NUMERIC)) { //Use get_text_for_gda_value() instead of "0" so we get the correct numerical formatting: const Gnome::Gda::Value value = Conversions::parse_value(0); text_value = Conversions::get_text_for_gda_value(field_type, value, field->get_formatting_used().m_numeric_format); } canvas_item->set_text(text_value); break; } case(Field::TYPE_IMAGE): { Glib::RefPtr canvas_item = Glib::RefPtr::cast_dynamic(child); if(!canvas_item) return; //Get the height of the item (not of the pixbuf), //so we can scale the pixbuf: double width = 0; double height = 0; canvas_item->get_width_height(width, height); Glib::RefPtr pixbuf = Utils::get_pixbuf_for_gda_value(value); if(pixbuf) canvas_item->set_image(pixbuf); else canvas_item->set_image_empty(); break; } default: std::cerr << G_STRFUNC << ": unhandled field type." << std::endl; } } void CanvasLayoutItem::remove_empty_indicators() { Glib::RefPtr child = get_child(); Glib::RefPtr canvas_image = Glib::RefPtr::cast_dynamic(child); if(canvas_image) { //Clear the no-image pixbuf from images: if(canvas_image->get_image_empty()) { Glib::RefPtr really_empty; canvas_image->property_pixbuf() = really_empty; } } } void CanvasLayoutItem::update_layout_position_from_canvas() { sharedptr layout_item = get_layout_item(); if(!layout_item) return; //Get the actual position: double x = 0; double y = 0; get_xy(x, y); //std::cout << "debug: " << G_STRFUNC << ": x=" << x << std::endl; double width = 0; double height = 0; get_width_height(width, height); layout_item->set_print_layout_position(x, y, width, height); } } //namespace Glom glom-1.22.4/glom/print_layout/print_layout_utils.cc0000644000175000017500000003657612234776363023771 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2011 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include #include #include namespace Glom { namespace PrintLayoutUtils { double get_page_height(const Glib::RefPtr& page_setup, Gtk::Unit units) { double margin_top = 0; double margin_bottom = 0; return get_page_height(page_setup, units, margin_top, margin_bottom); } double get_page_height(const Glib::RefPtr& page_setup, Gtk::Unit units, double& margin_top, double& margin_bottom) { //Initialize output parameters: margin_top = 0; margin_bottom = 0; const Gtk::PaperSize paper_size = page_setup->get_paper_size(); double page_height = 0; if(page_setup->get_orientation() == Gtk::PAGE_ORIENTATION_PORTRAIT) //TODO: Handle the reverse orientations too? { page_height = paper_size.get_height(units); margin_top = page_setup->get_top_margin(units); margin_bottom = page_setup->get_bottom_margin(units); } else { page_height = paper_size.get_width(units); margin_top = page_setup->get_left_margin(units); margin_bottom = page_setup->get_right_margin(units); } return page_height; } /* Get the start and end of the page, inside the margins. */ static void get_page_y_start_and_end(const Glib::RefPtr& page_setup, Gtk::Unit units, guint page_number, double& y1, double& y2) { y1 = 0; y2 = 0; const Gtk::PaperSize paper_size = page_setup->get_paper_size(); double margin_top = 0; double margin_bottom = 0; const double page_height = get_page_height(page_setup, units, margin_top, margin_bottom); //y1: y1 = page_height * (page_number); double y_border = margin_top; while(y1 <= y_border) y1 += GRID_GAP; //y2: y2 = page_height * (page_number + 1); y2 -= margin_bottom; //std::cout << G_STRFUNC << "page_number=" << page_number << ", y1=" << y1 << "y2=" << y2 << std::endl; } double get_offset_to_move_fully_to_next_page(const Glib::RefPtr& page_setup, Gtk::Unit units, double y, double height) { double top_margin = 0; double bottom_margin = 0; const double page_height = get_page_height(page_setup, units, top_margin, bottom_margin); const guint current_page = PrintLayoutUtils::get_page_for_y(page_setup, units, y); const double usable_page_start = current_page * page_height + top_margin + GRID_GAP; //std::cout << G_STRFUNC << ": debug: current_page=" << current_page << ", usable_page_start =" << usable_page_start << std::endl; if(y < usable_page_start) //If it is in the top margin: { return usable_page_start - y; } const double usable_page_end = (current_page + 1) * page_height - bottom_margin - GRID_GAP; if((y + height) > usable_page_end) //If it is in the bottom margin: { //Move it to the start of the next page: const double start_next_page_y = (current_page + 1) * page_height + top_margin + GRID_GAP; return start_next_page_y - y; } return 0; } static double move_fully_to_page(const Glib::RefPtr& page_setup, Gtk::Unit units, double y, double height) { double top_margin = 0; double bottom_margin = 0; const double page_height = get_page_height(page_setup, units, top_margin, bottom_margin); //Ignore items that would not overlap even if they had the same y: //Note that we try to keep an extra GRID_GAP from the edge of the margin: const double usable_page_height = page_height - top_margin - bottom_margin - GRID_GAP * 2; if(height > usable_page_height) return y; //It will always be in a margin because it is so big. We could never move it somewhere where it would not be. const double offset = get_offset_to_move_fully_to_next_page(page_setup, units, y, height); return y + offset; } bool needs_move_fully_to_page(const Glib::RefPtr& page_setup, Gtk::Unit units, const Glib::RefPtr& item) { double x = 0; double y = 0; item->get_xy(x, y); double width = 0; double height = 0; item->get_width_height(width, height); //We don't actually move it, because items would then group together //at the top of pages. //Instead, the caller will discover an offset to apply to all items: const double y_new = move_fully_to_page(page_setup, units, y, height); if(y_new != y) return true; return false; } /* static double move_fully_to_page(const Glib::RefPtr& page_setup, Gtk::Unit units, const sharedptr& item) { double x = 0; double y = 0; double width = 0; double height = 0; item->get_print_layout_position(x, y, width, height); const double y_new = move_fully_to_page(page_setup, units, y, height); if(y_new != y) item->set_print_layout_position(x, y_new, width, height); return y_new; } */ static void create_standard(const sharedptr& layout_group, const sharedptr& print_layout_group, const Glib::RefPtr& page_setup, Gtk::Unit units, double x, double& y, bool avoid_page_margins) { if(!layout_group || !print_layout_group) { return; } const double gap = GRID_GAP; const Gtk::PaperSize paper_size = page_setup->get_paper_size(); const double item_width = paper_size.get_width(units) - x - page_setup->get_right_margin(units) - gap; const double field_height = ITEM_HEIGHT; //Show the group's title //(but do not fall back to the name, because unnamed groups are really wanted sometimes.) const Glib::ustring title = item_get_title(layout_group); if(!title.empty()) { sharedptr text = sharedptr::create(); text->set_text(title, AppWindow::get_current_locale()); text->m_formatting.set_text_format_font("Sans Bold 10"); if(avoid_page_margins) y = move_fully_to_page(page_setup, units, y, field_height); text->set_print_layout_position(x, y, item_width, field_height); //TODO: Enough and no more. y += field_height + gap; //padding. print_layout_group->add_item(text); } //Deal with a portal group: const sharedptr portal = sharedptr::cast_dynamic(layout_group); if(portal) { sharedptr portal_clone = glom_sharedptr_clone(portal); portal_clone->set_print_layout_row_height(field_height); //Otherwise it will be 0, which is useless. //We ignore the rows count for the details layout's portal, //because that is only suitable for the on-screen layout, //and because, on the print layout, we want to show (almost) all rows: portal_clone->set_rows_count(1 /* min */, 100 /* max */); //Set an initial default height, though this will be changed //when we fill it with data: if(avoid_page_margins) y = move_fully_to_page(page_setup, units, y, field_height); portal_clone->set_print_layout_position(x, y, item_width, field_height); y += field_height + gap; //padding. print_layout_group->add_item(portal_clone); return; } //Deal with a regular group: //Recurse into the group's child items: for(LayoutGroup::type_list_items::const_iterator iter = layout_group->m_list_items.begin(); iter != layout_group->m_list_items.end(); ++iter) { const sharedptr item = *iter; if(!item) continue; const sharedptr group = sharedptr::cast_dynamic(item); if(group && !portal) { //Recurse: create_standard(group, print_layout_group, page_setup, units, x, y, avoid_page_margins); } else { //Add field titles, if necessary: sharedptr text_title; const double title_width = ITEM_WIDTH_WIDE; //TODO: Calculate it based on the widest in the column. Or just halve the column to start. const sharedptr field = sharedptr::cast_dynamic(item); if(field) { text_title = sharedptr::create(); const Glib::ustring field_title = item_get_title_or_name(field); text_title->set_text(field_title + ":", AppWindow::get_current_locale()); if(avoid_page_margins) y = move_fully_to_page(page_setup, units, y, field_height); text_title->set_print_layout_position(x, y, title_width, field_height); //TODO: Enough and no more. text_title->m_formatting.set_text_format_font("Sans 10"); print_layout_group->add_item(text_title); } //Add the item, such as a field: sharedptr clone = glom_sharedptr_clone(item); double item_x = x; if(field) item_x += (title_width + gap); const double field_width = item_width - title_width - gap; //Make multi-line fields bigger: //TODO: Add an auto-expand feature: double this_field_height = field_height; if(field) { const Formatting& formatting = field->get_formatting_used(); if(formatting.get_text_format_multiline()) { const guint lines = formatting.get_text_format_multiline_height_lines(); if(lines) this_field_height = field_height * lines; } } if(avoid_page_margins) y = move_fully_to_page(page_setup, units, y, this_field_height); //TODO: Move the title down too, if this was moved. clone->set_print_layout_position(item_x, y, field_width, this_field_height); //TODO: Enough and no more. //Make sure that the title is still aligned, even if this was moved by move_fully_to_page(). if(text_title) text_title->set_print_layout_position_y(y); y += this_field_height + gap; //padding. print_layout_group->add_item(clone); } } } guint get_page_for_y(const Glib::RefPtr& page_setup, Gtk::Unit units, double y) { const double page_height = get_page_height(page_setup, units); if(!page_height) return 0; //Avoid a division by zero. const double pages = y / (double)page_height; double pages_integral = 0; modf(pages, &pages_integral); return pages_integral; } sharedptr create_standard(const Glib::RefPtr& page_setup, const Glib::ustring& table_name, const Document* document, bool avoid_page_margins) { const Gtk::Unit units = Gtk::UNIT_MM; sharedptr print_layout = sharedptr::create(); //Start inside the border, on the next grid line: double y = 0; double max_y = 0; //ignored get_page_y_start_and_end(page_setup, units, 0, y, max_y); double x = 0; double x_border = 0; if(page_setup) x_border = page_setup->get_left_margin(units); while(x <= x_border) x += GRID_GAP; //The table title: const Glib::ustring title = document->get_table_title_singular(table_name, AppWindow::get_current_locale()); if(!title.empty()) { sharedptr text = sharedptr::create(); text->set_text(title, AppWindow::get_current_locale()); text->m_formatting.set_text_format_font("Sans Bold 12"); const double field_height = ITEM_HEIGHT; text->set_print_layout_position(x, y, ITEM_WIDTH_WIDE, field_height); //TODO: Enough and no more. y += field_height + GRID_GAP; //padding. print_layout->get_layout_group()->add_item(text); } //The layout: //TODO: Use fill_layout_group_field_info()? const Document::type_list_layout_groups layout_groups = document->get_data_layout_groups("details", table_name); //TODO: layout_platform. for(Document::type_list_layout_groups::const_iterator iter = layout_groups.begin(); iter != layout_groups.end(); ++iter) { const sharedptr group = *iter; if(!group) continue; create_standard(group, print_layout->get_layout_group(), page_setup, units, x, y, avoid_page_margins); } //Add extra pages if necessary: //y is probably _after_ the last item, not exactly at the bottom of the last item, so we subtract gap. //TODO: However, this might not be reliable, //so this could lead to an extra blank page. const guint page_number = get_page_for_y(page_setup, units, y - GRID_GAP); if(page_number >= print_layout->get_page_count()) { print_layout->set_page_count(page_number + 1); } return print_layout; } void do_print_layout(const sharedptr& print_layout, const FoundSet& found_set, bool preview, const Document* document, bool avoid_page_margins, Gtk::Window* transient_for) { if(!print_layout) { std::cerr << G_STRFUNC << ": print_layout was null" << std::endl; return; } if(!document) { std::cerr << G_STRFUNC << ": document was null" << std::endl; return; } //TODO: All this to be null when we allow that in Gtk::PrintOperation::run(). if(!transient_for) { std::cerr << G_STRFUNC << ": transient_for was null" << std::endl; return; } Canvas_PrintLayout canvas; canvas.set_document(const_cast(document)); //We const_cast because, for this use, it will not be changed. //We cast to unconst because we know that the layout will not be changed by this use: sharedptr unconst = sharedptr::cast_const(print_layout); canvas.set_print_layout(found_set.m_table_name, unconst); //Do not show things that are only for editing the print layout: canvas.remove_grid(); canvas.set_rules_visibility(false); canvas.set_outlines_visibility(false); //Create a new PrintOperation with our PageSetup and PrintSettings: //(We use our derived PrintOperation class) Glib::RefPtr print = PrintOperationPrintLayout::create(); print->set_canvas(&canvas); print->set_track_print_status(); //TODO: Put this in a utility function. Glib::RefPtr page_setup; const Glib::ustring key_file_text = print_layout->get_page_setup(); if(!key_file_text.empty()) { Glib::KeyFile key_file; key_file.load_from_data(key_file_text); page_setup = Gtk::PageSetup::create_from_key_file(key_file); } print->set_default_page_setup(page_setup); //print->set_print_settings(m_refSettings); //print->signal_done().connect(sigc::bind(sigc::mem_fun(*this, // &ExampleWindow::on_printoperation_done), print)); canvas.fill_with_data(found_set, avoid_page_margins); try { print->run( (preview ? Gtk::PRINT_OPERATION_ACTION_PREVIEW : Gtk::PRINT_OPERATION_ACTION_PRINT_DIALOG), *transient_for); } catch (const Gtk::PrintError& ex) { //See documentation for exact Gtk::PrintError error codes. std::cerr << "An error occurred while trying to run a print operation:" << ex.what() << std::endl; } } } //namespace PrintLayoutUtils } //namespace Glom glom-1.22.4/glom/print_layout/print_layout_utils.h0000644000175000017500000000573412234252646023614 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2011 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_PRINT_LAYOUT_UTILS_H #define GLOM_PRINT_LAYOUT_UTILS_H #include "config.h" #include #include #include #include namespace Glom { namespace PrintLayoutUtils { //TODO: Add get_grid_gap(units) instead. const double GRID_GAP = 6.0f; //Roughly the right height for 12 point text. //Base the default item sizes on the grid gap, instead of being arbitrary: const double ITEM_HEIGHT = GRID_GAP; const double ITEM_WIDTH_WIDE = GRID_GAP * 10; //TODO: Move this into libglom, by replacing Gtk::PageSetup with a custom class. //However, this also uses goocanvas, which would need to have its GTK+ widget split away too. /** Create a print layout based on the on-screen details layout. * @param avoid_page_margins If true then do skip page margins. */ sharedptr create_standard(const Glib::RefPtr& page_setup, const Glib::ustring& table_name, const Document* document, bool avoid_page_margins); void do_print_layout(const sharedptr& print_layout, const FoundSet& found_set, bool preview, const Document* document, bool avoid_page_margins, Gtk::Window* transient_for); double get_page_height(const Glib::RefPtr& page_setup, Gtk::Unit units); double get_page_height(const Glib::RefPtr& page_setup, Gtk::Unit units, double& margin_top, double& margin_bottom); /** Discover what page the y position is on: */ guint get_page_for_y(const Glib::RefPtr& page_setup, Gtk::Unit units, double y); /** See if the item needs to move to the start of a page, past the top margin, * or if it is currently in the bottom margin of a page, or in the top margin of a page. * * @result Whether the item needs to be moved. */ bool needs_move_fully_to_page(const Glib::RefPtr& page_setup, Gtk::Unit units, const Glib::RefPtr& item); double get_offset_to_move_fully_to_next_page(const Glib::RefPtr& page_setup, Gtk::Unit units, double y, double height); } //namespace PrintLayoutUtils } //namespace Glom #endif //GLOM_PRINT_LAYOUT_UTILS_H glom-1.22.4/glom/print_layout/canvas_print_layout.cc0000644000175000017500000012334212234776363024070 0ustar00murraycmurrayc00000000000000 /* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "canvas_print_layout.h" #include //For bold_message()). #include #include #include #include //TODO: Remove these when we can just use a CanvasLayoutItem in a GooCanvasTable: #include #include #include #include #include #include #include #include #include namespace Glom { Canvas_PrintLayout::Canvas_PrintLayout() : m_modified(false), m_dialog_format(0), m_outline_visibility(false), m_page_count(1) //Sensible default { #ifndef GLOM_ENABLE_CLIENT_ONLY setup_context_menu(); #endif //Use millimeters, because that's something that is meaningful to the user, //and we can use it with Gtk::PageSetup too: property_units() = Gtk::UNIT_MM; m_items_group = Goocanvas::Group::create(); //m_items_group->signal_button_press_event().connect( sigc::ptr_fun(&on_group_button_press_event), false ); //TODO: How does this have any effect?: m_items_group->property_pointer_events() = Goocanvas::EVENTS_NONE; Glib::RefPtr root = get_root_item(); if(root) root->add_child(m_items_group); Glib::RefPtr page_setup = Gtk::PageSetup::create(); //start with something sensible. set_page_setup(page_setup); } Canvas_PrintLayout::~Canvas_PrintLayout() { } void Canvas_PrintLayout::set_print_layout(const Glib::ustring& table_name, const sharedptr& print_layout) { m_table_name = table_name; m_modified = false; remove_all_items(m_items_group); add_layout_group(print_layout->get_layout_group(), true /* is top-level */); //Use the page setup: const Glib::ustring key_file_text = print_layout->get_page_setup(); if(!key_file_text.empty()) { Glib::KeyFile key_file; //TODO: Catch an exception key_file.load_from_data(key_file_text); Glib::RefPtr page_setup = Gtk::PageSetup::create_from_key_file(key_file); set_page_setup(page_setup); } set_page_count(print_layout->get_page_count()); //Add the rule lines: remove_rules(); const PrintLayout::type_vec_doubles h_rules = print_layout->get_horizontal_rules(); for(PrintLayout::type_vec_doubles::const_iterator iter = h_rules.begin(); iter != h_rules.end(); ++iter) { add_horizontal_rule(*iter); } const PrintLayout::type_vec_doubles v_rules = print_layout->get_vertical_rules(); for(PrintLayout::type_vec_doubles::const_iterator iter = v_rules.begin(); iter != v_rules.end(); ++iter) { add_vertical_rule(*iter); } //TODO: This needs a number, but that is decided in WindowPrintLayoutEdit: set_grid_gap( print_layout->get_show_grid() ); set_rules_visibility( print_layout->get_show_rules() ); set_outlines_visibility( print_layout->get_show_outlines() ); m_modified = false; } sharedptr Canvas_PrintLayout::get_print_layout() { sharedptr result = sharedptr::create(); fill_layout_group(result->get_layout_group()); //Page Setup: Glib::KeyFile key_file; if(m_page_setup) m_page_setup->save_to_key_file(key_file); Glib::ustring data; //TODO: Catch an exception data = key_file.to_data(); result->set_page_setup(data); result->set_page_count(get_page_count()); result->set_horizontal_rules( get_horizontal_rules() ); result->set_vertical_rules( get_horizontal_rules() ); return result; } /* Glib::RefPtr Canvas_PrintLayout::create_canvas_item(const sharedptr& item) { Glib::RefPtr result = CanvasLayoutItem::create(); //TODO: Add to the canvas. result->set_layout_item(item); return result; } */ void Canvas_PrintLayout::add_layout_group_children(const sharedptr& group) { //TODO: Add them inside the group item (when we actually use this code): for(LayoutGroup::type_list_items::const_iterator iter = group->m_list_items.begin(); iter != group->m_list_items.end(); ++iter) { sharedptr item = *iter; sharedptr portal = sharedptr::cast_dynamic(item); sharedptr group = sharedptr::cast_dynamic(item); if(group && !portal) { add_layout_group(group); continue; } else { create_canvas_layout_item_and_add(item); } } m_modified = true; } void Canvas_PrintLayout::create_canvas_layout_item_and_add(const sharedptr& layout_item) { Glib::RefPtr canvas_item = CanvasLayoutItem::create(); add_canvas_layout_item(canvas_item); canvas_item->set_layout_item(layout_item); canvas_item->set_outline_visible(m_outline_visibility); } void Canvas_PrintLayout::add_canvas_layout_item(const Glib::RefPtr& item) { if(!item) return; CanvasEditable::add_item(item, m_items_group); item->raise(); #ifndef GLOM_ENABLE_CLIENT_ONLY //Connect signals handlers: //TODO: Avoid the bind of a RefPtr. It has been known to cause memory/ref-counting problems: item->signal_show_context().connect( sigc::bind( sigc::mem_fun(*this, &Canvas_PrintLayout::on_item_show_context_menu), item) ); #endif //GLOM_ENABLE_CLIENT_ONLY if(item->get_child()) item->set_outline_visible(m_outline_visibility); fill_with_data_system_preferences(item, get_document()); } void Canvas_PrintLayout::remove_canvas_layout_item(const Glib::RefPtr& item) { if(!item) return; CanvasEditable::remove_item(item, m_items_group); } void Canvas_PrintLayout::add_layout_group(const sharedptr& group, bool is_top_level) { //row[model_parts->m_columns.m_col_item] = sharedptr(static_cast(group->clone())); //Add the group item: if(!is_top_level) { create_canvas_layout_item_and_add(group); } //Add the group's children. add_layout_group_children(group); m_modified = true; } void Canvas_PrintLayout::fill_layout_group(const sharedptr& group) { const int count = m_items_group->get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr base_canvas_item = m_items_group->get_child(i); Glib::RefPtr canvas_item = Glib::RefPtr::cast_dynamic(base_canvas_item); if(canvas_item) { //Get the actual position: /* double x = 0; double y = 0; canvas_item->get_xy(x, y); double width = 0; double height = 0; canvas_item->get_width_height(width, height); if((width != 0)) //Allow height to be 0, because text items currently have no height. TODO: && (height != 0)) //Avoid bogus items. { */ canvas_item->update_layout_position_from_canvas(); group->add_item(canvas_item->get_layout_item()); //} } //TODO: Recurse. } } #ifndef GLOM_ENABLE_CLIENT_ONLY void Canvas_PrintLayout::setup_context_menu() { m_context_menu_action_group = Gtk::ActionGroup::create(); m_context_menu_action_group->add(Gtk::Action::create("ContextMenu", "Context Menu") ); /* Glib::RefPtr action = Gtk::Action::create("ContextInsertField", _("Field")); m_context_menu_action_group->add(action, sigc::mem_fun(*this, &Canvas_PrintLayout::on_context_menu_insert_field) ); action = Gtk::Action::create("ContextInsertText", _("Text")); m_context_menu_action_group->add(action, sigc::mem_fun(*this, &Canvas_PrintLayout::on_context_menu_insert_text) ); */ m_action_edit = Gtk::Action::create("ContextMenuEdit", Gtk::Stock::EDIT); m_context_menu_action_group->add(m_action_edit); m_action_formatting = Gtk::Action::create("ContextMenuFormatting", _("_Formatting")); m_context_menu_action_group->add(m_action_formatting); m_action_delete = Gtk::Action::create("ContextMenuDelete", Gtk::Stock::DELETE); m_context_menu_action_group->add(m_action_delete); m_action_edit->signal_activate().connect( sigc::mem_fun(*this, &Canvas_PrintLayout::on_context_menu_edit) ); m_action_formatting->signal_activate().connect( sigc::mem_fun(*this, &Canvas_PrintLayout::on_context_menu_formatting) ); m_action_delete->signal_activate().connect( sigc::mem_fun(*this, &Canvas_PrintLayout::on_context_menu_delete) ); m_context_menu_uimanager = Gtk::UIManager::create(); m_context_menu_uimanager->insert_action_group(m_context_menu_action_group); try { Glib::ustring ui_info = "" " " " " " " " " " " ""; m_context_menu_uimanager->add_ui_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menus failed: " << ex.what(); } //Get the menu: m_context_menu = dynamic_cast( m_context_menu_uimanager->get_widget("/ContextMenu") ); } void Canvas_PrintLayout::on_item_show_context_menu(guint button, guint32 activate_time, Glib::RefPtr item) { if(!m_context_menu || !item) return; m_context_item = item; //Do not enable the Formatting menu item for all types of items: sharedptr layout_item = m_context_item->get_layout_item(); bool enable_formatting = false; if(sharedptr::cast_dynamic(layout_item)) { enable_formatting = true; } m_action_formatting->set_sensitive(enable_formatting); m_context_menu->popup(button, activate_time); } bool Canvas_PrintLayout::on_background_button_press_event(const Glib::RefPtr& /* target */, GdkEventButton* /* event */) { //A click on empty space should deselect any selected items: select_all(false); return false; } sharedptr Canvas_PrintLayout::offer_related_records(const sharedptr& portal, Gtk::Window* parent) { sharedptr result = portal; Dialog_Layout_List_Related* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; add_view(dialog); //Give it access to the document. dialog->init_with_portal("layout_name_unused_for_portals", "", /* layout_platform */ get_document(), portal, m_table_name, true /* for print layout */); if(parent) dialog->set_transient_for(*parent); Utils::show_window_until_hide(dialog); result = dialog->get_portal_layout(); delete dialog; dialog = 0; return result; } sharedptr Canvas_PrintLayout::offer_line(const sharedptr& line, Gtk::Window* parent) { sharedptr result = line; Dialog_Line* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return result; if(parent) dialog->set_transient_for(*parent); dialog->set_line(line); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { //Get the chosen relationship: result = dialog->get_line(); } delete dialog; return result; } void Canvas_PrintLayout::on_context_menu_edit() { Gtk::Window* parent = dynamic_cast(get_toplevel()); m_context_item->update_layout_position_from_canvas(); sharedptr layout_item = m_context_item->get_layout_item(); sharedptr field = sharedptr::cast_dynamic(layout_item); if(field) { sharedptr field_chosen = offer_field_list_select_one_field(field, m_table_name, parent); if(field_chosen) { //Never use the default formatting for print layouts: field_chosen->set_formatting_use_default(false); m_context_item->set_layout_item(field_chosen); fill_with_data_system_preferences(m_context_item, get_document()); } } else { sharedptr text = sharedptr::cast_dynamic(layout_item); if(text) { text = Base_DB::offer_textobject(text, parent, false /* don't show title */); m_context_item->set_layout_item(text); } else { sharedptr image = sharedptr::cast_dynamic(layout_item); if(image) { image = Base_DB::offer_imageobject(image, parent, false /* don't show title */); m_context_item->set_layout_item(image); } else { sharedptr portal = sharedptr::cast_dynamic(layout_item); if(portal) { portal = offer_related_records(portal, parent); m_context_item->set_layout_item(portal); } else { sharedptr line = sharedptr::cast_dynamic(layout_item); if(line) { line = offer_line(line, parent); m_context_item->set_layout_item(line); } } } } } m_modified = true; m_context_item.reset(); } void Canvas_PrintLayout::on_context_menu_formatting() { if(!m_context_item) return; m_context_item->update_layout_position_from_canvas(); sharedptr layout_item = m_context_item->get_layout_item(); sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); sharedptr layout_item_text = sharedptr::cast_dynamic(layout_item); if(!layout_item_field && !layout_item_text) return; if(m_dialog_format) { remove_view(m_dialog_format); delete m_dialog_format; m_dialog_format = 0; } Utils::get_glade_widget_derived_with_warning(m_dialog_format); add_view(m_dialog_format); Gtk::Window* window = dynamic_cast(get_toplevel()); if(window) m_dialog_format->set_transient_for(*window); m_dialog_format->signal_hide().connect( sigc::mem_fun(*this, &Canvas_PrintLayout::on_dialog_format_hide) ); //We need an if here, because they have no common base class. //TODO: Maybe they should. TODO: Maybe they already do. if(layout_item_field) { const Formatting& formatting = layout_item_field->m_formatting; m_dialog_format->m_box_formatting->set_formatting_for_field(formatting, m_table_name, layout_item_field->get_full_field_details()); } else { const Formatting& formatting = layout_item_text->m_formatting; m_dialog_format->m_box_formatting->set_formatting_for_non_field( formatting, false /* don't show numeric options */); } m_dialog_format->m_box_formatting->set_is_for_non_editable(); m_dialog_format->show(); } void Canvas_PrintLayout::on_context_menu_delete() { //If the item to be deleted was not selected then just delete it: if(!m_context_item->get_selected()) { m_context_item->remove(); m_context_item.reset(); return; } //Requesting deletion of a selected item should delete all selected items: //TODO: If there are multiple items, ask the user for confirmation? m_context_item.reset(); const type_vec_items items = get_selected_items(); for(type_vec_items::const_iterator iter = items.begin(); iter != items.end(); ++iter) { const Glib::RefPtr selected_item = *iter; if(!selected_item) continue; const Glib::RefPtr canvas_layout_item = Glib::RefPtr::cast_dynamic(selected_item); if(canvas_layout_item) remove_canvas_layout_item(canvas_layout_item); } signal_selection_changed().emit(); } void Canvas_PrintLayout::on_dialog_format_hide() { if(!m_dialog_format || !m_context_item) return; sharedptr layout_item = m_context_item->get_layout_item(); sharedptr layout_item_field = sharedptr::cast_dynamic(layout_item); sharedptr layout_item_text = sharedptr::cast_dynamic(layout_item); if(!layout_item_field && !layout_item_text) return; if(layout_item_field) { m_dialog_format->m_box_formatting->get_formatting(layout_item_field->m_formatting); //Never use the default formatting for print layouts: layout_item_field->set_formatting_use_default(false); } else if(layout_item_text) m_dialog_format->m_box_formatting->get_formatting(layout_item_text->m_formatting); m_context_item->set_layout_item(layout_item); //Redraw the child item with the new formatting. delete m_dialog_format; m_dialog_format = 0; } #endif //GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr Canvas_PrintLayout::create_margin_line(double x1, double y1, double x2, double y2) { Glib::RefPtr line = Goocanvas::Polyline::create(x1, y1, x2, y2); line->property_line_width() = 0.5; line->property_stroke_color() = "light gray"; //Interpret a click on the line like a click on the background behind it: //TODO: Do this for grid lines and rules too: line->signal_button_press_event().connect( sigc::mem_fun(*this, &Canvas_PrintLayout::on_background_button_press_event)); m_bounds_group->add_child(line); return line; } void Canvas_PrintLayout::update_page_bounds() { //Change the scroll extents to match the page size: const Gtk::PaperSize paper_size = m_page_setup->get_paper_size(); Goocanvas::Bounds bounds; bounds.set_x1(0); bounds.set_y1(0); const Gtk::Unit units = property_units(); //std::cout << "debug: " << G_STRFUNC << ": width=" << paper_size.get_width(units) << ", height=" paper_size.get_height(units) << std::endl; double page_width = 0; double page_height = 0; if(m_page_setup->get_orientation() == Gtk::PAGE_ORIENTATION_PORTRAIT) //TODO: Handle the reverse orientations too? { page_width = paper_size.get_width(units); page_height = paper_size.get_height(units); } else { page_width = paper_size.get_height(units); page_height = paper_size.get_width(units); } bounds.set_x2( page_width ); bounds.set_y2( page_height * m_page_count ); set_bounds(bounds); //Show the bounds with a rectangle, because the scrolled window might contain extra empty space. property_background_color() = "light gray"; if(m_bounds_group) { m_bounds_group->remove(); m_bounds_group.reset(); } Glib::RefPtr root = get_root_item(); m_bounds_group = Goocanvas::Group::create(); root->add_child(m_bounds_group); m_bounds_rect = Goocanvas::Rect::create(bounds.get_x1(), bounds.get_y1(), bounds.get_x2(), bounds.get_y2()); m_bounds_rect->property_fill_color() = "white"; m_bounds_rect->property_line_width() = 0; m_bounds_rect->signal_button_press_event().connect( sigc::mem_fun(*this, &Canvas_PrintLayout::on_background_button_press_event)); m_bounds_group->add_child(m_bounds_rect); //Make sure that the bounds rect is at the bottom, //and that the grid and margins are just above it: if(m_grid) m_grid->lower(); m_margin_left = create_margin_line(m_page_setup->get_left_margin(units), bounds.get_y1(), m_page_setup->get_left_margin(units), bounds.get_y2()); m_margin_right = create_margin_line(bounds.get_x2() - m_page_setup->get_right_margin(units), bounds.get_y1(), bounds.get_x2() - m_page_setup->get_right_margin(units), bounds.get_y2()); m_vec_margin_tops.clear(); m_vec_margin_bottoms.clear(); for(guint page = 0; page < m_page_count; ++page) { const double top_y = paper_size.get_height(units) * page + m_page_setup->get_top_margin(units); Glib::RefPtr margin_top = create_margin_line( bounds.get_x1(), top_y, bounds.get_x2(), top_y); m_vec_margin_tops.push_back(margin_top); const double bottom_y = paper_size.get_height(units) * (page + 1) - m_page_setup->get_bottom_margin(units); Glib::RefPtr margin_bottom = create_margin_line( bounds.get_x1(), bottom_y, bounds.get_x2(), bottom_y); m_vec_margin_bottoms.push_back(margin_bottom); } m_bounds_group->lower(); //Try to show the whole thing, by (indirectly) making the parent window big enough: /* TODO: This doesn't seem to work double width_pixels = bounds.get_x2() - bounds.get_x1(); double height_pixels = bounds.get_y2() - bounds.get_y1(); convert_to_pixels(width_pixels, height_pixels); std::cout << "DEBUG: width_pixels=" << width_pixels << ", height_pixels=" << height_pixels << std::endl; set_size_request(width_pixels, height_pixels); */ //Update the grid lines: m_grid->update_grid_for_new_size(); } void Canvas_PrintLayout::set_page_setup(const Glib::RefPtr& page_setup) { m_page_setup = page_setup; if(!m_page_setup) return; update_page_bounds(); m_modified = true; } Glib::RefPtr Canvas_PrintLayout::get_page_setup() { return m_page_setup; } Glib::RefPtr Canvas_PrintLayout::get_page_setup() const { return m_page_setup; } void Canvas_PrintLayout::set_page_count(guint count) { if(count < 1) { std::cerr << G_STRFUNC << ": count was less than 1" << std::endl; return; } m_page_count = count; update_page_bounds(); m_modified = true; } guint Canvas_PrintLayout::get_page_count() const { return m_page_count; } void Canvas_PrintLayout::fill_with_data(const FoundSet& found_set, bool avoid_page_margins) { if(found_set.m_where_clause.empty()) { //This might help a developer/debugger: //This is not an error. std::cout << G_STRFUNC << ": Not attempting to show real data because the where_clause is empty, maybe because there are no records in the database yet." << std::endl; return; } fill_with_data(m_items_group, found_set, avoid_page_margins); } void Canvas_PrintLayout::fill_with_data_system_preferences(const Glib::RefPtr& canvas_item, Document* document) { sharedptr layoutitem_field = sharedptr::cast_dynamic( canvas_item->get_layout_item()); if(!layoutitem_field) return; bool empty = true; if(!layoutitem_field->get_name().empty()) { const sharedptr relationship = layoutitem_field->get_relationship(); if(!document) { std::cerr << G_STRFUNC << ": document is null" << std::endl; return; } if(document->get_relationship_is_system_properties(relationship)) empty = false; } if(!empty) { LayoutFieldInRecord field_in_record; field_in_record.m_field = layoutitem_field; field_in_record.m_table_name = m_table_name; const Gnome::Gda::Value value = get_field_value_in_database( field_in_record, 0 /* TODO: parent window */); if(!Glom::Conversions::value_is_empty(value)) { canvas_item->set_db_data(value); //TODO: canvas_item->expand_text_vertically(); } } } void Canvas_PrintLayout::fill_with_data(const Glib::RefPtr& canvas_group, const FoundSet& found_set, bool avoid_page_margins) { //A map of the text representation (e.g. field_name or relationship::field_name) to the index: typedef std::map type_map_layout_fields_index; type_map_layout_fields_index map_fields_index; typedef std::list< sharedptr > type_list_portals; type_list_portals list_portals; //Get list of fields to get from the database. Utils::type_vecLayoutFields fieldsToGet; const int count = canvas_group->get_n_children(); guint field_i = 0; for(int i = 0; i < count; ++i) { Glib::RefPtr base_canvas_item = canvas_group->get_child(i); Glib::RefPtr canvas_item = Glib::RefPtr::cast_dynamic(base_canvas_item); if(!canvas_item) continue; sharedptr layout_item = canvas_item->get_layout_item(); if(!layout_item) continue; sharedptr layoutitem_field = sharedptr::cast_dynamic(layout_item); if(layoutitem_field && !(layoutitem_field->get_name().empty())) { fieldsToGet.push_back(layoutitem_field); //Remember the index so we can use it later, //to get the data for this column from the query results: map_fields_index[ layoutitem_field->get_layout_display_name() ] = field_i; ++field_i; } else { sharedptr layoutitem_portal = sharedptr::cast_dynamic(layout_item); if(layoutitem_portal) { //Fill the related records table: sharedptr relationship = layoutitem_portal->get_relationship(); if(relationship) { const Document* document = get_document(); const sharedptr from_field = DbUtils::get_fields_for_table_one_field(document, relationship->get_from_table(), relationship->get_from_field()); const Gnome::Gda::Value from_key_value = get_field_value_in_database(from_field, found_set, 0 /* TODO: window */); fill_with_data_portal(canvas_item, from_key_value); } } } } if(fieldsToGet.empty()) return; const Glib::RefPtr sql_query = Utils::build_sql_select_with_where_clause(found_set.m_table_name, fieldsToGet, found_set.m_where_clause, sharedptr() /* extra_join */, found_set.m_sort_clause, 1); bool records_found = false; Glib::RefPtr datamodel; try { datamodel = DbUtils::query_execute_select(sql_query); } catch(const Glib::Exception& ex) { std::cout << "Canvas_PrintLayout::fill_with_data: exception: " << ex.what() << std::endl; } catch(const std::exception& ex) { std::cout << "Canvas_PrintLayout::fill_with_data: exception: " << ex.what() << std::endl; } if(datamodel) { const guint rows_count = datamodel->get_n_rows(); if(rows_count > 0) records_found = true; } if(!records_found) return; //Set all the data for the fields in the canvas //(and clear the no-image pixbuf from images): for(int i = 0; i < count; ++i) { Glib::RefPtr base_canvas_item = canvas_group->get_child(i); Glib::RefPtr canvas_item = Glib::RefPtr::cast_dynamic(base_canvas_item); if(!canvas_item) continue; sharedptr layout_item = canvas_item->get_layout_item(); if(!layout_item) continue; sharedptr layoutitem_field = sharedptr::cast_dynamic(layout_item); if(layoutitem_field) { type_map_layout_fields_index::const_iterator iterFind = map_fields_index.find( layoutitem_field->get_layout_display_name() ); if(iterFind != map_fields_index.end()) { //Set the data from the database: const guint col_index = iterFind->second; //TODO: Actually catch exception: const Gnome::Gda::Value value = datamodel->get_value_at(col_index, 0); canvas_item->set_db_data(value); } } else { //Clear the no-image pixbuf from images: canvas_item->remove_empty_indicators(); } if(avoid_page_margins) { const Glib::RefPtr page_setup = get_page_setup(); const Gtk::Unit units = property_units(); const bool needs_moving = PrintLayoutUtils::needs_move_fully_to_page(page_setup, units, canvas_item); if(needs_moving) { double x = 0; double y = 0; canvas_item->get_xy(x, y); double width = 0; double height = 0; canvas_item->get_width_height(width, height); const double offset = PrintLayoutUtils::get_offset_to_move_fully_to_next_page(page_setup, units, y, height); move_items_down(y, offset); } } } } void Canvas_PrintLayout::fill_with_data_portal(const Glib::RefPtr& canvas_item, const Gnome::Gda::Value& foreign_key_value) { if(!canvas_item) return; sharedptr layout_item = canvas_item->get_layout_item(); sharedptr portal = sharedptr::cast_dynamic(layout_item); if(!portal) return; Glib::RefPtr canvas_table = Glib::RefPtr::cast_dynamic(canvas_item->get_child()); if(!canvas_table) return; //TODO: When goocanvas supports groups (and therefore Glom::CanvasLayoutItem) //in table cells, simplify this code by just setting the values of those //existing items: // //Remove all existing cells, so we can recreate them: //TODO: Add a function to goocanvas for this. //TODO: Move the child stuff into group in goocanvas. const LayoutGroup::type_list_items child_layout_items = portal->get_items(); //Build and run the SQL query for this portal: const type_vecConstLayoutFields fields_shown = get_portal_fields_to_show(portal); FoundSet found_set; found_set.m_table_name = portal->get_table_used(Glib::ustring() /* parent table_name, not used. */); set_found_set_where_clause_for_portal(found_set, portal, foreign_key_value); const Glib::RefPtr sql_query = Utils::build_sql_select_with_where_clause(found_set.m_table_name, fields_shown, found_set.m_where_clause, found_set.m_extra_join, found_set.m_sort_clause); //std::cout << "DEBUG: sql_query=" << sql_query << std::endl; const Glib::RefPtr datamodel = DbUtils::query_execute_select(sql_query); if(!(datamodel)) return; const int db_rows_count = datamodel->get_n_rows(); //TODO: Performance? COUNT them instead? const int db_columns_count = datamodel->get_n_columns(); //Show as many rows as needed, but not more than the maximum: gulong rows_count_min = 0; gulong rows_count_max = 0; portal->get_rows_count(rows_count_min, rows_count_max); int rows_count = std::min((int)rows_count_max, db_rows_count); //Do not use less than the minimum: rows_count = std::max(rows_count, (int)rows_count_min); // TODO: Remove this method and/or change it to recalc the min when changing the height: //CanvasLayoutItem::get_rows_count_for_portal(portal, row_height_ignored); const double portal_height = rows_count * portal->get_print_layout_row_height(); double old_width = 0; double old_height = 0; canvas_item->get_width_height(old_width, old_height); canvas_item->set_width_height(old_width, portal_height); //Move other items down if the portal table became bigger: double x = 0; double y = 0; canvas_item->get_xy(x, y); const double offset = portal_height - old_height; move_items_down(y + old_height, offset); canvas_item->add_portal_rows_if_necessary(rows_count); //TODO: Move everything else down. const int cols_count = child_layout_items.size(); //Set the DB value for each cell: for(int row = 0; row < rows_count; ++row) { int db_col = 0; LayoutGroup::type_list_items::const_iterator iter_child_layout_items = child_layout_items.begin(); for(int col = 0; col < cols_count; ++col) { //Glib::RefPtr canvas_child = base_item->get_cell_child(row, col); //TODO: Add this to Goocanvas::Table. Glib::RefPtr canvas_child = CanvasLayoutItem::get_canvas_table_cell_child(canvas_table, row, col); //TODO: Add this to Goocanvas::Table. if(!canvas_child) { std::cerr << G_STRFUNC << ": canvas_child is NULL for row=" << row << ", col=" << col << std::endl; continue; } if(iter_child_layout_items == child_layout_items.end()) continue; sharedptr child_layout_item = *iter_child_layout_items; sharedptr field = sharedptr::cast_dynamic(child_layout_item); if(field) { Gnome::Gda::Value db_value; //This default also wipes the placeholder field name text of empty rows. if( (row < db_rows_count) && (db_col < db_columns_count) ) { //TODO: Actually catch exception. db_value = datamodel->get_value_at(db_col, row); } set_canvas_item_field_value(canvas_child, field, db_value); ++db_col; } ++iter_child_layout_items; } } } void Canvas_PrintLayout::set_canvas_item_field_value(const Glib::RefPtr& canvas_item, const sharedptr& field, const Gnome::Gda::Value& value) { if(!field) return; //Expect the appropriate canvas item, depending on the field type: if(field->get_glom_type() == Field::TYPE_IMAGE) { Glib::RefPtr canvas_image = Glib::RefPtr::cast_dynamic(canvas_item); if(!canvas_image) return; Glib::RefPtr pixbuf = Utils::get_pixbuf_for_gda_value(value); canvas_image->property_pixbuf() = pixbuf; } else //text, numbers, date, time, boolean: { Glib::RefPtr canvas_text = Glib::RefPtr::cast_dynamic(canvas_item); if(!canvas_text) { std::cerr << G_STRFUNC << ": The canvas item is not of the expected type. Instead it is of type." << std::endl; return; } Glib::ustring text; sharedptr with_formatting = sharedptr::cast_dynamic(field); if(with_formatting) { const Formatting& formatting = with_formatting->get_formatting_used(); text = Conversions::get_text_for_gda_value(field->get_glom_type(), value, formatting.m_numeric_format); } else { text = Conversions::get_text_for_gda_value(field->get_glom_type(), value); } canvas_text->set_text(text); } } void Canvas_PrintLayout::set_zoom_percent(guint percent) { if(percent == 0) return; const double scale = (double)percent / 100; if(scale == 0) return; set_scale(scale); } void Canvas_PrintLayout::hide_page_bounds() { m_bounds_group->property_visibility() = Goocanvas::ITEM_HIDDEN; } void Canvas_PrintLayout::set_grid_gap(double gap) { CanvasEditable::set_grid_gap(gap); //Make sure that the bounds rect is at the bottom, //and that the grid and margins are just above it: if(m_grid) m_grid->lower(); if(m_bounds_group) m_bounds_group->lower(); } Base_DB::type_vecConstLayoutFields Canvas_PrintLayout::get_portal_fields_to_show(const sharedptr& portal) { const Document* document = get_document(); if(!document) std::cerr << G_STRFUNC << ": document is NULL." << std::endl; if(document && portal) { Document::type_list_layout_groups mapGroups; mapGroups.push_back(portal); sharedptr relationship = portal->get_relationship(); if(relationship) { type_vecConstLayoutFields result = get_table_fields_to_show_for_sequence(portal->get_table_used(Glib::ustring() /* not relevant */), mapGroups); //If the relationship does not allow editing, then mark all these fields as non-editable: /* TODO: Find a better way to do this. if(!(portal->get_relationship_used_allows_edit())) { for(type_vecConstLayoutFields::iterator iter = result.begin(); iter != result.end(); ++iter) { sharedptr item = *iter; if(item) item->set_editable(false); } } */ return result; } } return type_vecConstLayoutFields(); } Canvas_PrintLayout::type_vec_items Canvas_PrintLayout::get_selected_items() { type_vec_items result; //TODO: Do this recursively. Glib::RefPtr root = m_items_group; if(!root) return result; const int count = root->get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = root->get_child(i); Glib::RefPtr derived = Glib::RefPtr::cast_dynamic(child); if(!derived) continue; if(derived->get_selected()) result.push_back(derived); } return result; } void Canvas_PrintLayout::set_outlines_visibility(bool visible) { //Remember this so we can apply it to items added later: m_outline_visibility = visible; //TODO: Do this recursively. Glib::RefPtr root = m_items_group; if(!root) return; const int count = root->get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = root->get_child(i); Glib::RefPtr derived = Glib::RefPtr::cast_dynamic(child); if(!derived) continue; derived->set_outline_visible(visible); } } void Canvas_PrintLayout::select_all(bool selected) { Glib::RefPtr root = m_items_group; if(!root) return; const int count = root->get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = root->get_child(i); Glib::RefPtr derived = Glib::RefPtr::cast_dynamic(child); if(!derived) continue; derived->set_selected(selected); } signal_selection_changed().emit(); } Goocanvas::Bounds Canvas_PrintLayout::get_page_bounds(guint page_num) const { Goocanvas::Bounds bounds; //Change the scroll extents to match the page size: const Gtk::PaperSize paper_size = m_page_setup->get_paper_size(); const Gtk::Unit units = property_units(); //std::cout << "debug: " << G_STRFUNC << ": width=" << paper_size.get_width(units) << ", height=" paper_size.get_height(units) << std::endl; double page_width = 0; double page_height = 0; if(m_page_setup->get_orientation() == Gtk::PAGE_ORIENTATION_PORTRAIT) //TODO: Handle the reverse orientations too? { page_width = paper_size.get_width(units); page_height = paper_size.get_height(units); } else { page_width = paper_size.get_height(units); page_height = paper_size.get_width(units); } bounds.set_x1(0); bounds.set_y1( page_height * page_num); bounds.set_x2( page_width ); bounds.set_y2( page_height * (page_num + 1) ); return bounds; } Glib::RefPtr Canvas_PrintLayout::move_items_down(double y_start, double offset) { //Keep track of the top-most item that needs to be moved all the way on to a new page: Glib::RefPtr needs_moving_top; double y_needs_moving_top = 0; double needs_moving_top_height = 0; Glib::RefPtr root = m_items_group; if(!root) return needs_moving_top; double bottom_max = 0; const Glib::RefPtr page_Setup = get_page_setup(); const int count = root->get_n_children(); for(int i = 0; i < count; ++i) { Glib::RefPtr child = root->get_child(i); Glib::RefPtr derived = Glib::RefPtr::cast_dynamic(child); if(!derived) { std::cout << "debug: not derived" << std::endl; continue; } //Ignore items above y_start: double x = 0; double y = 0; derived->get_xy(x, y); if(y < y_start) continue; //Ignore items that would not overlap even if they had the same y: double width = 0; double height = 0; derived->get_width_height(width, height); //if( (x + width) < item_x) // continue; //if( x > (item_x + item_width)) // continue; //Move it down: y += offset; derived->set_xy(x, y); //Move it some more if necessary: //See if it should be moved down (but do that later): const bool needs_moving = PrintLayoutUtils::needs_move_fully_to_page(page_Setup, property_units(), derived); if(needs_moving) { if(!needs_moving_top || (y <= y_needs_moving_top)) { y_needs_moving_top = y; needs_moving_top = derived; needs_moving_top_height = height; } } //Check where the bottom is: const double bottom = y + height; bottom_max = std::max(bottom_max, bottom); } //Add extra pages if necessary: const guint last_page_needed = PrintLayoutUtils::get_page_for_y(page_Setup, property_units(), bottom_max); if((last_page_needed + 1) > get_page_count()) { set_page_count(last_page_needed + 1); } //Now move everything further, completely on to the next page //and then do that again for the next page until all the pages are done: if(needs_moving_top && (y_needs_moving_top > y_start)) { std::cout << "extra move: y_needs_moving_top=" << y_needs_moving_top << std::endl; const double extra_offset = PrintLayoutUtils::get_offset_to_move_fully_to_next_page( page_Setup, property_units(), y_needs_moving_top, needs_moving_top_height); if(extra_offset) { needs_moving_top = move_items_down(y_needs_moving_top, extra_offset); } else needs_moving_top.reset(); } return needs_moving_top; } double Canvas_PrintLayout::get_page_height() const { const Glib::RefPtr page_setup = get_page_setup(); return PrintLayoutUtils::get_page_height(page_setup, property_units()); } double Canvas_PrintLayout::get_page_height(double& margin_top, double& margin_bottom) const { const Glib::RefPtr page_setup = get_page_setup(); return PrintLayoutUtils::get_page_height(page_setup, property_units(), margin_top, margin_bottom); } } //namespace Glom glom-1.22.4/glom/print_layout/printoperation_printlayout.cc0000644000175000017500000000615712234252646025530 0ustar00murraycmurrayc00000000000000/* gtkmm example Copyright (C) 2006 gtkmm development team * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include namespace Glom { PrintOperationPrintLayout::PrintOperationPrintLayout() : m_canvas(0) { set_unit(Gtk::UNIT_MM); set_use_full_page(true); //Because we show the margins on our canvas. set_n_pages(1); //There is always at least one page. } PrintOperationPrintLayout::~PrintOperationPrintLayout() { } Glib::RefPtr PrintOperationPrintLayout::create() { return Glib::RefPtr(new PrintOperationPrintLayout()); } void PrintOperationPrintLayout::on_begin_print( const Glib::RefPtr& print_context) { //Call base class: Gtk::PrintOperation::on_begin_print(print_context); set_n_pages( m_canvas->get_page_count() ); //std::cout << G_STRFUNC << ": n pages =" << m_canvas->get_page_count() << std::endl; } bool PrintOperationPrintLayout::on_paginate(const Glib::RefPtr& print_context) { //std::cout << "PrintOperationPrintLayout::on_paginate" << std::endl; if(!m_canvas) return false; //on_draw_page() will be called for any new pages. set_n_pages( m_canvas->get_page_count() ); //std::cout << G_STRFUNC << ": n pages =" << m_canvas->get_page_count() << std::endl; //Call base class: Gtk::PrintOperation::on_paginate(print_context); return true; //Pagination has finished. Don't call this again. } void PrintOperationPrintLayout::on_draw_page( const Glib::RefPtr& print_context, int page_nr) { //Note that page_nr is 0-based, so the first page is page 0. if(!m_canvas) return; //Get a Cairo Context, which is used as a drawing board: m_canvas->hide_page_bounds(); Cairo::RefPtr cairo_context = print_context->get_cairo_context(); //Render the canvas onto the cairo context: const Goocanvas::Bounds bounds = m_canvas->get_page_bounds(page_nr); //std::cout << G_STRFUNC << ": page_nr=" << page_nr << ", bounds: x1=" << bounds.get_x1() << ", y1=" << bounds.get_y1() << ", x2=" << bounds.get_x2() << ", y2=" << bounds.get_y2() << std::endl; //Shift the renderer context up into the page: cairo_context->translate(0, - bounds.get_y1()); m_canvas->render(cairo_context, bounds); //Call base class: Gtk::PrintOperation::on_draw_page(print_context, page_nr); } void PrintOperationPrintLayout::set_canvas(Canvas_PrintLayout* canvas) { m_canvas = canvas; } } //namespace Glom glom-1.22.4/glom/main_local_options.cc0000644000175000017500000000600312234776363021116 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" #include #include // For sanity checks: #include #include #include #include namespace Glom { LocalOptionGroup::LocalOptionGroup() : Glib::OptionGroup("glom-extra", _("Extra Glom options"), _("Extra command-line options for glom")), m_arg_version(false), m_arg_debug_date_check(false), m_debug_date_check_result(false) { Glib::OptionEntry entry; entry.set_long_name("version"); entry.set_short_name('V'); entry.set_description(_("The version of this application.")); add_entry(entry, m_arg_version); entry.set_long_name("debug-date-check"); entry.set_short_name(0); entry.set_description(_("Show how Glom outputs a date in this locale, then stop.")); add_entry(entry, m_arg_debug_date_check); } bool LocalOptionGroup::handle_options() { if(m_arg_version) { std::cout << PACKAGE_STRING << std::endl; return false; //Then stop. } // Some more sanity checking: // These print errors to the stdout if they fail. // In future we might refuse to start if they fail. m_debug_date_check_result = true; const bool test1 = Glom::Conversions::sanity_check_date_text_representation_uses_4_digit_years(m_arg_debug_date_check /* show debug output */); if(!test1) { std::cerr << "Glom: ERROR: Date presentation sanity checks failed. Glom will not display dates correctly. This needs attention from a translator. Please file a bug. See http://www.glom.org." << std::endl; m_debug_date_check_result = false; } const bool test2 = Glom::Conversions::sanity_check_date_parsing(); if(!test2) { std::cerr << "Glom: ERROR: Date parsing sanity checks failed. Glom will not interpret dates correctly. This needs attention from a translator. Please file a bug. See http://www.glom.org." << std::endl; m_debug_date_check_result = false; } return true; } bool LocalOptionGroup::get_debug_date_check_result(bool& stop) const { //This command-line option is documented as stopping executing after checking, //so that the execution result can be checked: stop = m_arg_debug_date_check; return m_debug_date_check_result; } } //namespace Glom glom-1.22.4/glom/box_withbuttons.cc0000644000175000017500000000634512234776363020520 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include //AppWindow. #include #include #include #include //For stringstream namespace Glom { Box_WithButtons::Box_WithButtons() : Gtk::Box(Gtk::ORIENTATION_VERTICAL), m_Box_Buttons(Gtk::ORIENTATION_HORIZONTAL, Utils::DEFAULT_SPACING_SMALL), m_Button_Cancel(Gtk::Stock::CANCEL) { //m_pDocument = 0; //set_border_width(Utils::DEFAULT_SPACING_SMALL); set_spacing(Utils::DEFAULT_SPACING_SMALL); //Connect signals: m_Button_Cancel.signal_clicked().connect(sigc::mem_fun(*this, &Box_WithButtons::on_Button_Cancel)); } Box_WithButtons::Box_WithButtons(BaseObjectType* cobject, const Glib::RefPtr& /* builder */) : Gtk::Box(cobject), m_Box_Buttons(Gtk::ORIENTATION_HORIZONTAL, Utils::DEFAULT_SPACING_SMALL), m_Button_Cancel(Gtk::Stock::CANCEL) { //m_pDocument = 0; //set_border_width(Utils::DEFAULT_SPACING_SMALL); set_spacing(Utils::DEFAULT_SPACING_SMALL); //Connect signals: m_Button_Cancel.signal_clicked().connect(sigc::mem_fun(*this, &Box_WithButtons::on_Button_Cancel)); } Box_WithButtons::Box_WithButtons(BaseObjectType* cobject) : Gtk::Box(cobject), m_Box_Buttons(Gtk::ORIENTATION_HORIZONTAL, Utils::DEFAULT_SPACING_SMALL), m_Button_Cancel(Gtk::Stock::CANCEL) { } Box_WithButtons::~Box_WithButtons() { } void Box_WithButtons::on_Button_Cancel() { //Tell the parent dialog that the user has clicked [Cancel]: signal_cancelled.emit(); } const Gtk::Window* Box_WithButtons::get_app_window() const { Box_WithButtons* nonconst = const_cast(this); return nonconst->get_app_window(); } Gtk::Window* Box_WithButtons::get_app_window() { return dynamic_cast(get_toplevel()); /* Gtk::Widget* pWidget = get_parent(); while(pWidget) { //Is this widget a Gtk::Window?: Gtk::Window* pWindow = dynamic_cast(pWidget); if(pWindow) { //Yes, return it. return pWindow; } else { //Try the parent's parent: pWidget = pWidget->get_parent(); } } return 0; //not found. */ } /* void Box_WithButtons::show_hint() { hint_set(m_strHint); } */ void Box_WithButtons::set_button_cancel(Gtk::Button& button) { button.signal_clicked().connect(sigc::mem_fun(*this, &Box_WithButtons::on_Button_Cancel)); } Gtk::Widget* Box_WithButtons::get_default_button() { return 0; //Override this if the box has a default button. } } //namespace Glom glom-1.22.4/glom/show_progress_message.cc0000644000175000017500000000255112234252646021652 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2011 Openismus GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" // For GLOM_ENABLE_CLIENT_ONLY #include #include namespace Glom { ShowProgressMessage::ShowProgressMessage(const Glib::ustring& message) : m_app(dynamic_cast(AppWindow::get_appwindow())), m_message(message) { g_return_if_fail(m_app); m_app->set_progress_message(message); }; ShowProgressMessage::~ShowProgressMessage() { g_return_if_fail(m_app); m_app->clear_progress_message(); }; void ShowProgressMessage::pulse() { g_return_if_fail(m_app); m_app->set_progress_message(m_message); }; } //namespace Glom glom-1.22.4/glom/base_db_table.cc0000644000175000017500000000251712234252645017771 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "base_db_table.h" #include #include #include #include namespace Glom { Base_DB_Table::Base_DB_Table() { } Base_DB_Table::~Base_DB_Table() { } Glib::ustring Base_DB_Table::get_table_name() const { return m_table_name; } bool Base_DB_Table::init_db_details(const Glib::ustring& table_name) { m_table_name = table_name; if(!ConnectionPool::get_instance()->get_ready_to_connect()) return false; return fill_from_database(); } } //namespace Glom glom-1.22.4/glom/main_remote_options.cc0000644000175000017500000000364312234252646021317 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2012 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include #include namespace Glom { RemoteOptionGroup::RemoteOptionGroup() : Glib::OptionGroup("glom", _("Main Glom options"), _("Main command-line options for glom")), m_arg_restore(false), m_arg_stop_auto_server_shutdown(false), m_arg_debug_sql(false) { Glib::OptionEntry entry; entry.set_long_name("file"); entry.set_short_name('f'); entry.set_description(_("The Filename")); add_entry_filename(entry, m_arg_filename); entry.set_long_name("restore"); entry.set_short_name(0); entry.set_description(_("Whether the filename is a .tar.gz backup to be restored.")); add_entry(entry, m_arg_restore); entry.set_long_name("stop-auto-server-shutdown"); entry.set_short_name(0); entry.set_description(_("Do not automatically stop the database server if Glom quits. This is helpful for debugging with gdb.")); add_entry(entry, m_arg_stop_auto_server_shutdown); entry.set_long_name("debug_sql"); entry.set_short_name(0); entry.set_description(_("Show the generated SQL queries on stdout, for debugging.")); add_entry(entry, m_arg_debug_sql); } } //namespace Glom glom-1.22.4/glom/signal_reemitter.h0000644000175000017500000000551212234252646020441 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2008 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_SIGNAL_REEMITTER_H #define GLOM_SIGNAL_REEMITTER_H #include namespace Glom { template void reemit_0args(const T_sig_to_emit& sig_to_emit) { sig_to_emit.emit(); } template void reemit_1arg(T_arg1 arg1, const T_sig_to_emit& sig_to_emit) { sig_to_emit.emit(arg1); } template void reemit_2args(T_arg1 arg1, T_arg2 arg2, const T_sig_to_emit& sig_to_emit) { sig_to_emit.emit(arg1, arg2); } //Note that sig_to_catch is by-value instead of const-reference, //because connect() is a non-const method, //and a non-const-reference could not be used with a temporary instance. /** Emit a signal when another signal is emitted. * @param sig_to_catch The signal to handle. * @param sig_to_emit The signal to emit when @a sig_to_catch is handled. */ template void signal_connect_for_reemit_0args(T_sig_to_catch sig_to_catch, const T_sig_to_emit& sig_to_emit) { sig_to_catch.connect( sigc::bind( sigc::ptr_fun(&reemit_0args), sig_to_emit) ); } /** Emit a signal when another signal is emitted. * @param sig_to_catch The signal to handle. * @param sig_to_emit The signal to emit when @a sig_to_catch is handled. */ template void signal_connect_for_reemit_1arg(sigc::signal1 sig_to_catch, const T_sig_to_emit& sig_to_emit) { sig_to_catch.connect( sigc::bind( sigc::ptr_fun(&reemit_1arg), sig_to_emit) ); } /** Emit a signal when another signal is emitted. * @param sig_to_catch The signal to handle. * @param sig_to_emit The signal to emit when @a sig_to_catch is handled. */ template void signal_connect_for_reemit_2args(sigc::signal2 sig_to_catch, const T_sig_to_emit& sig_to_emit) { sig_to_catch.connect( sigc::bind( sigc::ptr_fun(&reemit_2args), sig_to_emit) ); } } //namespace Glom #endif //GLOM_SIGNAL_REEMITTER_H glom-1.22.4/glom/window_boxholder.h0000644000175000017500000000237512234252646020465 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_WINDOW_BOXHOLDER_H #define GLOM_WINDOW_BOXHOLDER_H #include #include #include namespace Glom { /** A window that can hold a Box_WithButtons. */ class Window_BoxHolder : public Gtk::Window { public: explicit Window_BoxHolder(Box_WithButtons* pBox, const Glib::ustring& title = Glib::ustring()); virtual ~Window_BoxHolder(); private: //Signal handlers: void on_box_cancelled(); }; } //namespace Glom #endif glom-1.22.4/glom/appwindow.cc0000644000175000017500000031012212234776363017255 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2010 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include "config.h" //For VERSION, GLOM_ENABLE_CLIENT_ONLY, GLOM_ENABLE_SQLITE #include #include #ifndef GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #endif // !GLOM_ENABLE_CLIENT_ONLY #include #include #include #include #include #include #include #include #include #include #include #include //For std::auto_ptr<> #include #include #include #include //For stringstream. #ifndef G_OS_WIN32 #include #include #endif // !G_OS_WIN32 #ifndef G_OS_WIN32 # include //For gethostbyname(). #endif #include namespace Glom { //static const int GLOM_RESPONSE_BROWSE_NETWORK = 1; // Global application variable AppWindow* global_appwindow = 0; Glib::ustring AppWindow::m_current_locale; Glib::ustring AppWindow::m_original_locale; const char* AppWindow::glade_id("window_main"); const bool AppWindow::glade_developer(false); AppWindow::AppWindow(BaseObjectType* cobject, const Glib::RefPtr& builder) : type_base(cobject, "Glom"), m_pBoxTop(0), m_pFrame(0), m_bAboutShown(false), m_pAbout(0), #ifndef GLOM_ENABLE_CLIENT_ONLY m_window_translations(0), #endif // !GLOM_ENABLE_CLIENT_ONLY m_menu_tables_ui_merge_id(0), m_menu_reports_ui_merge_id(0), m_menu_print_layouts_ui_merge_id(0), #ifndef GLOM_ENABLE_CLIENT_ONLY m_ui_save_extra_showextras(false), m_ui_save_extra_newdb_hosting_mode(Document::HOSTING_MODE_DEFAULT), m_avahi_progress_dialog(0), #endif // !GLOM_ENABLE_CLIENT_ONLY m_show_sql_debug(false) { Gtk::Window::set_default_icon_name("glom"); //Load widgets from glade file: builder->get_widget("bakery_vbox", m_pBoxTop); builder->get_widget_derived("vbox_frame", m_pFrame); //This one is derived. There's a lot happening here. builder->get_widget_derived("infobar_progress", m_infobar_progress); add_mime_type("application/x-glom"); //TODO: make this actually work - we need to register it properly. #ifndef GLOM_ENABLE_CLIENT_ONLY #ifndef G_OS_WIN32 //Install UI hooks for this: ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(connection_pool) { connection_pool->set_avahi_publish_callbacks( sigc::mem_fun(*this, &AppWindow::on_connection_avahi_begin), sigc::mem_fun(*this, &AppWindow::on_connection_avahi_progress), sigc::mem_fun(*this, &AppWindow::on_connection_avahi_done) ); } #endif #endif // !GLOM_ENABLE_CLIENT_ONLY global_appwindow = this; } AppWindow::~AppWindow() { #ifndef GLOM_ENABLE_CLIENT_ONLY if(m_window_translations) { m_pFrame->remove_view(m_window_translations); delete m_window_translations; } delete m_avahi_progress_dialog; m_avahi_progress_dialog = 0; #endif // !GLOM_ENABLE_CLIENT_ONLY delete m_pAbout; m_pAbout = 0; //This was set in the constructor: global_appwindow = 0; } #ifndef GLOM_ENABLE_CLIENT_ONLY void AppWindow::on_connection_avahi_begin() { //Create the dialog: delete m_avahi_progress_dialog; m_avahi_progress_dialog = 0; m_avahi_progress_dialog = new Gtk::MessageDialog(Utils::bold_message(_("Glom: Generating Encryption Certificates")), true, Gtk::MESSAGE_INFO); m_avahi_progress_dialog->set_secondary_text(_("Please wait while Glom prepares your system for publishing over the network.")); m_avahi_progress_dialog->set_transient_for(*this); m_avahi_progress_dialog->show(); } void AppWindow::on_connection_avahi_progress() { //Allow GTK+ to process events, so that the UI is responsive: while(Gtk::Main::events_pending()) Gtk::Main::iteration(); } void AppWindow::on_connection_avahi_done() { //Delete the dialog: delete m_avahi_progress_dialog; } #endif // !GLOM_ENABLE_CLIENT_ONLY bool AppWindow::init_with_document(const Glib::ustring& document_uri, bool restore) { type_base::init(); //calls init_menus() and init_toolbars() //m_pFrame->set_shadow_type(Gtk::SHADOW_IN); if(document_uri.empty()) { Document* pDocument = static_cast(get_document()); if(pDocument && pDocument->get_connection_database().empty()) //If it is a new (default) document. { return offer_new_or_existing(); } } else { if(restore) return do_restore_backup(document_uri); else { const bool test = open_document(document_uri); if(!test) return offer_new_or_existing(); } } return true; //show_all(); } bool AppWindow::get_show_sql_debug() const { return m_show_sql_debug; } void AppWindow::set_show_sql_debug(bool val) { m_show_sql_debug = val; ConnectionPool::get_instance()->set_show_debug_output(val); } void AppWindow::set_stop_auto_server_shutdown(bool val) { ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(connection_pool) connection_pool->set_auto_server_shutdown(!val); } void AppWindow::init_layout() { //We override this method so that we can put everything in the vbox from the glade file, instead of the vbox from AppWindow_Gtk. //Add menu bar at the top: //These were defined in init_uimanager(). Gtk::MenuBar* pMenuBar = static_cast(m_refUIManager->get_widget("/Bakery_MainMenu")); m_pBoxTop->pack_start(*pMenuBar, Gtk::PACK_SHRINK); add_accel_group(m_refUIManager->get_accel_group()); //Add placeholder, to be used by add(): //m_pBoxTop->pack_start(m_VBox_PlaceHolder); //m_VBox_PlaceHolder.show(); } void AppWindow::init_toolbars() { //We override this because //a) We don't want a toolbar, and //b) The default toolbar layout has actions that we don't have. /* //Build part of the menu structure, to be merged in by using the "PH" placeholders: static const Glib::ustring ui_description = "" " " " " " " " " " " " " " " ""; add_ui_from_string(ui_description); */ } void AppWindow::init_menus_file() { //Overridden to remove the Save and Save-As menu items, //because all changes are saved immediately and automatically. // File menu //Build actions: m_refFileActionGroup = Gtk::ActionGroup::create("BakeryFileActions"); m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_Menu_File", _("_File"))); m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_Menu_File_RecentFiles", _("_Recent Files"))); //File actions m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_File_New", Gtk::Stock::NEW), sigc::mem_fun((AppWindow&)*this, &AppWindow::on_menu_file_new)); m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_File_Open", Gtk::Stock::OPEN), sigc::mem_fun((AppWindow_WithDoc&)*this, &AppWindow_WithDoc::on_menu_file_open)); Glib::RefPtr action = Gtk::Action::create("BakeryAction_File_SaveAsExample", _("_Save as Example")); m_listDeveloperActions.push_back(action); #ifndef GLOM_ENABLE_CLIENT_ONLY m_refFileActionGroup->add(action, sigc::mem_fun((AppWindow&)*this, &AppWindow::on_menu_file_save_as_example)); action = Gtk::Action::create("BakeryAction_Menu_File_Export", _("_Export")); m_refFileActionGroup->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_file_export)); m_listTableSensitiveActions.push_back(action); action = Gtk::Action::create("BakeryAction_Menu_File_Import", _("I_mport")); m_refFileActionGroup->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_file_import)); m_listTableSensitiveActions.push_back(action); #endif // !GLOM_ENABLE_CLIENT_ONLY m_toggleaction_network_shared = Gtk::ToggleAction::create("BakeryAction_Menu_File_Share", _("S_hared on Network")); m_refFileActionGroup->add(m_toggleaction_network_shared); m_listTableSensitiveActions.push_back(m_toggleaction_network_shared); #ifndef GLOM_ENABLE_CLIENT_ONLY m_connection_toggleaction_network_shared = m_toggleaction_network_shared->signal_toggled().connect( sigc::mem_fun(*this, &AppWindow::on_menu_file_toggle_share) ); m_listDeveloperActions.push_back(m_toggleaction_network_shared); #endif //!GLOM_ENABLE_CLIENT_ONLY action = Gtk::Action::create("GlomAction_Menu_File_Print", Gtk::Stock::PRINT); m_refFileActionGroup->add(action); m_listTableSensitiveActions.push_back(action); m_refFileActionGroup->add(Gtk::Action::create("GlomAction_File_Print", _("_Standard")), sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_file_print) ); #ifndef GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr action_print_edit = Gtk::Action::create("GlomAction_File_PrintEdit", _("_Edit Print Layouts")); m_refFileActionGroup->add(action_print_edit, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_file_print_edit_layouts)); m_listDeveloperActions.push_back(action_print_edit); #endif // !GLOM_ENABLE_CLIENT_ONLY m_refFileActionGroup->add(Gtk::Action::create("BakeryAction_File_Close", Gtk::Stock::CLOSE), sigc::mem_fun((AppWindow_WithDoc&)*this, &AppWindow_WithDoc::on_menu_file_close)); m_refUIManager->insert_action_group(m_refFileActionGroup); //Build part of the menu structure, to be merged in by using the "PH" placeholders: static const Glib::ustring ui_description = "" " " " " " " " " " " " " " " #ifndef GLOM_ENABLE_CLIENT_ONLY " " " " " " " " " " #endif // !GLOM_ENABLE_CLIENT_ONLY " " " " " " " " #ifndef GLOM_ENABLE_CLIENT_ONLY " " #endif //GLOM_ENABLE_CLIENT_ONLY " " " " " " " " " " " " ""; //Add menu: add_ui_from_string(ui_description); //Add recent-files submenu: init_menus_file_recentfiles("/Bakery_MainMenu/Bakery_MenuPH_File/BakeryAction_Menu_File/BakeryAction_Menu_File_RecentFiles"); } void AppWindow::init_menus() { init_menus_file(); init_menus_edit(); //Build actions: m_refActionGroup_Others = Gtk::ActionGroup::create("GlomOthersActions"); //"Tables" menu: m_refActionGroup_Others->add( Gtk::Action::create("Glom_Menu_Tables", _("_Tables")) ); // Glib::RefPtr action = Gtk::Action::create("GlomAction_Menu_Navigate_Database", _("_Database")); // m_listDeveloperActions.push_back(action); // m_refActionGroup_Others->add(action, // sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_Navigate_Database) ); Glib::RefPtr action; #ifndef GLOM_ENABLE_CLIENT_ONLY action = Gtk::Action::create("GlomAction_Menu_EditTables", _("_Edit Tables")); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_Tables_EditTables) ); m_listDeveloperActions.push_back(action); /* Commented out because it is useful but confusing to new users: action = Gtk::Action::create("GlomAction_Menu_AddRelatedTable", _("Add _Related Table")); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_Tables_AddRelatedTable) ); m_listDeveloperActions.push_back(action); */ #endif // !GLOM_ENABLE_CLIENT_ONLY //"Reports" menu: m_refActionGroup_Others->add( Gtk::Action::create("Glom_Menu_Reports", _("_Reports")) ); #ifndef GLOM_ENABLE_CLIENT_ONLY action = Gtk::Action::create("GlomAction_Menu_EditReports", _("_Edit Reports")); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_Reports_EditReports) ); m_listDeveloperActions.push_back(action); m_listTableSensitiveActions.push_back(action); #endif //We remember this action, so that it can be explicitly activated later. m_action_mode_find = Gtk::ToggleAction::create("GlomAction_Menu_Edit_Find", _("_Find"), "", false); m_refActionGroup_Others->add(m_action_mode_find, Gtk::AccelKey("F"), sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_Edit_Find) ); m_listTableSensitiveActions.push_back(m_action_mode_find); #ifndef GLOM_ENABLE_CLIENT_ONLY action = Gtk::Action::create("Glom_Menu_Developer", C_("Developer menu title", "_Developer")); m_refActionGroup_Others->add(action); Gtk::RadioAction::Group group_userlevel; m_action_menu_developer_developer = Gtk::RadioAction::create(group_userlevel, "GlomAction_Menu_Developer_Developer", _("_Developer Mode")); m_refActionGroup_Others->add(m_action_menu_developer_developer, sigc::mem_fun(*this, &AppWindow::on_menu_developer_developer) ); m_action_menu_developer_operator = Gtk::RadioAction::create(group_userlevel, "GlomAction_Menu_Developer_Operator", _("_Operator Mode")); m_refActionGroup_Others->add(m_action_menu_developer_operator, sigc::mem_fun(*this, &AppWindow::on_menu_developer_operator) ); action = Gtk::Action::create("GlomAction_Menu_Developer_Database_Preferences", _("_Database Preferences")); m_listDeveloperActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_developer_database_preferences) ); action = Gtk::Action::create("GlomAction_Menu_Developer_Fields", _("_Fields")); m_listDeveloperActions.push_back(action); m_listTableSensitiveActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_developer_fields) ); action = Gtk::Action::create("GlomAction_Menu_Developer_RelationshipsOverview", _("Relationships _Overview")); m_listDeveloperActions.push_back(action); m_listTableSensitiveActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_developer_relationships_overview) ); action = Gtk::Action::create("GlomAction_Menu_Developer_Relationships", _("_Relationships for this Table")); m_listDeveloperActions.push_back(action); m_listTableSensitiveActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_developer_relationships) ); m_action_developer_users = Gtk::Action::create("GlomAction_Menu_Developer_Users", _("_Users")); m_listDeveloperActions.push_back(m_action_developer_users); m_refActionGroup_Others->add(m_action_developer_users, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_developer_users)); action = Gtk::Action::create("GlomAction_Menu_Developer_PrintLayouts", _("_Print Layouts")); //TODO: Rename? This looks like an action rather than a noun. It won't actually start printing. m_listDeveloperActions.push_back(action); m_listTableSensitiveActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_developer_print_layouts)); action = Gtk::Action::create("GlomAction_Menu_Developer_Reports", _("R_eports")); m_listDeveloperActions.push_back(action); m_listTableSensitiveActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_developer_reports)); action = Gtk::Action::create("GlomAction_Menu_Developer_Script_Library", _("Script _Library")); m_listDeveloperActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_developer_script_library)); action = Gtk::Action::create("GlomAction_Menu_Developer_Layout", _("_Layout")); m_listDeveloperActions.push_back(action); m_listTableSensitiveActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_developer_layout)); action = Gtk::Action::create("GlomAction_Menu_Developer_ChangeLanguage", _("Test Tra_nslation")); m_listDeveloperActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*this, &AppWindow::on_menu_developer_changelanguage)); action = Gtk::Action::create("GlomAction_Menu_Developer_Translations", _("_Translations")); m_listDeveloperActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*this, &AppWindow::on_menu_developer_translations)); //"Active Platform" menu: action = Gtk::Action::create("Glom_Menu_Developer_ActivePlatform", _("_Active Platform")); m_listDeveloperActions.push_back(action); m_refActionGroup_Others->add(action); Gtk::RadioAction::Group group_active_platform; action = Gtk::RadioAction::create(group_active_platform, "GlomAction_Menu_Developer_ActivePlatform_Normal", _("_Normal"), _("The layout to use for normal desktop environments.")); m_listDeveloperActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*this, &AppWindow::on_menu_developer_active_platform_normal)); action = Gtk::RadioAction::create(group_active_platform, "GlomAction_Menu_Developer_ActivePlatform_Maemo", _("_Maemo"), _("The layout to use for Maemo devices.")); m_listDeveloperActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*this, &AppWindow::on_menu_developer_active_platform_maemo)); action = Gtk::Action::create("GlomAction_Menu_Developer_ExportBackup", _("_Export Backup")); m_listDeveloperActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*this, &AppWindow::on_menu_developer_export_backup)); action = Gtk::Action::create("GlomAction_Menu_Developer_RestoreBackup", _("_Restore Backup")); m_listDeveloperActions.push_back(action); m_refActionGroup_Others->add(action, sigc::mem_fun(*this, &AppWindow::on_menu_developer_restore_backup)); //TODO: Think of a better name for this menu item, //though it mostly only exists because it is not quite ready to be on by default: //Note to translators: Drag and Drop is part of the name, not a verb or action: m_action_enable_layout_drag_and_drop = Gtk::ToggleAction::create("GlomAction_Menu_Developer_EnableLayoutDragAndDrop", _("_Drag and Drop Layout")); m_listDeveloperActions.push_back(m_action_enable_layout_drag_and_drop); m_refActionGroup_Others->add(m_action_enable_layout_drag_and_drop, sigc::mem_fun(*this, &AppWindow::on_menu_developer_enable_layout_drag_and_drop)); #endif // !GLOM_ENABLE_CLIENT_ONLY m_refUIManager->insert_action_group(m_refActionGroup_Others); action = Gtk::Action::create("Glom_Menu_Help", C_("Help menu title", "_Help")); m_refActionGroup_Others->add(action); m_refHelpActionGroup = Gtk::ActionGroup::create("GlomHelpActions"); m_refHelpActionGroup->add(Gtk::Action::create("GlomAction_Menu_Help", _("_Help"))); m_refHelpActionGroup->add( Gtk::Action::create("GlomAction_Menu_Help_About", _("_About"), _("About the application")), sigc::mem_fun(*this, &AppWindow::on_menu_help_about) ); m_refHelpActionGroup->add( Gtk::Action::create("GlomAction_Menu_Help_Contents", _("_Contents"), _("Help with the application")), sigc::mem_fun(*this, &AppWindow::on_menu_help_contents) ); m_refUIManager->insert_action_group(m_refHelpActionGroup); //Build part of the menu structure, to be merged in by using the "Bakery_MenuPH_Others" placeholder: static const Glib::ustring ui_description = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " #ifndef GLOM_ENABLE_CLIENT_ONLY " " /* Commented out because it is useful but confusing to new users: " " */ #endif // !GLOM_ENABLE_CLIENT_ONLY " " " " " " #ifndef GLOM_ENABLE_CLIENT_ONLY " " " " #endif // !GLOM_ENABLE_CLIENT_ONLY " " #ifndef GLOM_ENABLE_CLIENT_ONLY " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " #endif // !GLOM_ENABLE_CLIENT_ONLY " " " " ""; /* " " */ //Add menu: add_ui_from_string(ui_description); update_table_sensitive_ui(); fill_menu_tables(); } #ifndef GLOM_ENABLE_CLIENT_ONLY void AppWindow::on_menu_help_about() { if(m_pAbout && m_bAboutShown) // "About" box hasn't been closed, so just raise it { m_pAbout->set_transient_for(*this); Glib::RefPtr about_win = m_pAbout->get_window(); about_win->show(); about_win->raise(); } else { //Re-create About box: delete m_pAbout; m_pAbout = 0; m_pAbout = new Gtk::AboutDialog; m_pAbout->set_program_name(m_strAppName); m_pAbout->set_version(m_strVersion); m_pAbout->set_comments(_("A Database GUI")); m_pAbout->set_version(PACKAGE_VERSION); m_pAbout->set_copyright(_("© 2000-2011 Murray Cumming, Openismus GmbH")); std::vector vecAuthors; vecAuthors.push_back("Murray Cumming "); m_pAbout->set_authors(vecAuthors); Glib::RefPtr logo = Gdk::Pixbuf::create_from_file(GLOM_ICONPATH); if(logo) m_pAbout->set_logo(logo); else std::cout << G_STRFUNC << ": Could not load icon from path=" << GLOM_ICONPATH << std::endl; m_pAbout->signal_hide().connect( sigc::mem_fun(*this, &AppWindow::on_about_close) ); m_bAboutShown = true; static_cast(m_pAbout)->run(); //show() would be better. see below: m_pAbout->hide(); //m_pAbout->show(); //TODO: respond to the OK button. } } void AppWindow::on_about_close() { m_bAboutShown = false; } void AppWindow::on_menu_file_toggle_share() { if(!m_pFrame) return; m_pFrame->on_menu_file_toggle_share(m_toggleaction_network_shared); } void AppWindow::on_menu_developer_developer() { if(!m_pFrame) return; m_pFrame->on_menu_developer_developer(m_action_menu_developer_developer, m_action_menu_developer_operator); m_pFrame->set_enable_layout_drag_and_drop(m_action_enable_layout_drag_and_drop->get_active()); } void AppWindow::on_menu_developer_operator() { if(m_pFrame) { m_pFrame->on_menu_developer_operator(m_action_menu_developer_operator); m_pFrame->set_enable_layout_drag_and_drop(false); } } #endif // !GLOM_ENABLE_CLIENT_ONLY static bool hostname_is_localhost(const Glib::ustring& hostname) { if(hostname.empty()) return false; //Quick short cut: if(hostname == "localhost") return true; else if(hostname == "localhost.localdomain") return true; else if(hostname == "127.0.0.1") //Standard IP address for localhost. return true; //TODO: Is there some way to compare hostents? /* hostent* a = gethostbyname("localhost"); hostent* b = gethostbyname(hostname.c_str()); if(!a || !b) { return a == b; } //TODO: return are_equal(a, b); */ return true; } void AppWindow::ui_warning_load_failed(int failure_code) { if(failure_code == Document::LOAD_FAILURE_CODE_NOT_FOUND) { //TODO: Put this in the generic bakery code. ui_warning(_("Open Failed"), _("The document could not be found.")); //TODO: Glom::Bakery::AppWindow_WithDoc removes the file from the recent history, //but the initial/welcome dialog doesn't yet update its list when the //recent history changes. } else if(failure_code == Document::LOAD_FAILURE_CODE_FILE_VERSION_TOO_NEW) { ui_warning(_("Open Failed"), _("The document could not be opened because it was created or modified by a newer version of Glom.")); } else GlomBakery::AppWindow_WithDoc_Gtk::ui_warning_load_failed(); } #ifndef G_OS_WIN32 void AppWindow::open_browsed_document(const EpcServiceInfo* server, const Glib::ustring& service_name) { gsize length = 0; gchar *document_contents = 0; bool keep_trying = true; while(keep_trying) { //Request a password to attempt retrieval of the document over the network: Dialog_Connection* dialog_connection = 0; //Load the Glade file and instantiate its widgets to get the dialog stuff: Utils::get_glade_widget_derived_with_warning(dialog_connection); if(!dialog_connection) { std::cerr << G_STRFUNC << ": dialog_connection is null." << std::endl; return; } dialog_connection->set_transient_for(*this); dialog_connection->set_connect_to_browsed(); dialog_connection->set_database_name(service_name); const int response = Glom::Utils::dialog_run_with_help(dialog_connection); dialog_connection->hide(); if(response != Gtk::RESPONSE_OK) keep_trying = false; else { //Open the document supplied by the other glom instance on the network: EpcConsumer* consumer = epc_consumer_new(server); Glib::ustring username, password; dialog_connection->get_username_and_password(username, password); epc_consumer_set_username(consumer, username.c_str()); epc_consumer_set_password(consumer, password.c_str()); GError *error = 0; document_contents = (gchar*)epc_consumer_lookup(consumer, "document", &length, &error); if(error) { std::cout << "debug: " << G_STRFUNC << ": " << std::endl << " " << error->message << std::endl; const int error_code = error->code; g_clear_error(&error); if(error_code == SOUP_STATUS_FORBIDDEN || error_code == SOUP_STATUS_UNAUTHORIZED) { //std::cout << " SOUP_STATUS_FORBIDDEN or SOUP_STATUS_UNAUTHORIZED" << std::endl; Utils::show_ok_dialog(_("Connection Failed"), _("Glom could not connect to the database server. Maybe you entered an incorrect user name or password, or maybe the postgres database server is not running."), *this, Gtk::MESSAGE_ERROR); //TODO: Add help button. } } else { //Store the username and password (now known to be correct) temporarily, //so we can use them when connecting directly to the database later: //(We can't just put them in the temp document instance, because these are not saved to disk.) m_temp_username = username; m_temp_password = password; keep_trying = false; //Finished. } } delete dialog_connection; dialog_connection = 0; } if(document_contents && length) { //Create a temporary Document instance, so we can manipulate the data: Document document_temp; int failure_code = 0; const bool loaded = document_temp.load_from_data((const guchar*)document_contents, length, failure_code); if(loaded) { // Connection is always remote-hosted in client only mode: #ifndef GLOM_ENABLE_CLIENT_ONLY #ifdef GLOM_ENABLE_POSTGRESQL //Stop the document from being self-hosted (it's already hosted by the other networked Glom instance): if(document_temp.get_hosting_mode() == Document::HOSTING_MODE_POSTGRES_SELF) document_temp.set_hosting_mode(Document::HOSTING_MODE_POSTGRES_CENTRAL); #endif //GLOM_ENABLE_POSTGRESQL #endif // !GLOM_ENABLE_CLIENT_ONLY // TODO: Error out in case this is a sqlite database, since we probably // can't access it from this host? //If the publisher thinks that it's using a postgres database on localhost, //then we need to use a host name that means the same thing from the client's PC: const Glib::ustring host = document_temp.get_connection_server(); if(hostname_is_localhost(host)) document_temp.set_connection_server( epc_service_info_get_host(server) ); //Make sure that we only use the specified port instead of connecting to some other postgres instance //on the same server: document_temp.set_connection_try_other_ports(false); } else { std::cerr << "Could not parse the document that was retrieved over the network: failure_code=" << failure_code << std::endl; } g_free(document_contents); document_contents = 0; //TODO_Performance: Horribly inefficient, but happens rarely: const Glib::ustring temp_document_contents = document_temp.build_and_get_contents(); //This loads the document and connects to the database (using m_temp_username and m_temp_password): open_document_from_data((const guchar*)temp_document_contents.c_str(), temp_document_contents.bytes()); //Mark the document as opened-from-browse //so we don't think that opening has failed because it has no URI, //and to stop us from allowing developer mode //(that would require changes to the original document). Document* document = dynamic_cast(get_document()); if(document) { document->set_opened_from_browse(); document->set_userlevel(AppState::USERLEVEL_OPERATOR); //TODO: This should happen automatically. document->set_network_shared(true); //It is shared by the computer that we opened this from. update_network_shared_ui(); #ifndef GLOM_ENABLE_CLIENT_ONLY update_userlevel_ui(); #endif // !GLOM_ENABLE_CLIENT_ONLY } } } #endif // !G_OS_WIN32 #ifndef GLOM_ENABLE_CLIENT_ONLY //Copied from bakery: static bool uri_is_writable(const Glib::RefPtr& uri) { if(!uri) return false; Glib::RefPtr file_info; try { file_info = uri->query_info(G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); } catch(const Glib::Error& /* ex */) { return false; } if(file_info) { return file_info->get_attribute_boolean(G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); } else return true; //Not every URI protocol supports access rights, so assume that it's writable and complain later. } #endif // !GLOM_ENABLE_CLIENT_ONLY //TODO: Use Gio::AppWindow? Is this even used? void AppWindow::new_instance(const Glib::ustring& uri) //Override { Glib::ustring command = "glom"; if(!uri.empty()) command += ' ' + uri; try { Glib::spawn_command_line_sync( command.c_str()); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; } } void AppWindow::init_create_document() { if(!m_pDocument) { Document* document_glom = new Document(); //By default, we assume that the original is in the current locale. document_glom->set_translation_original_locale(AppWindow::get_current_locale()); m_pDocument = document_glom; //document_glom->set_parent_window(this); //So that it can show a BusyCursor when loading and saving. //Tell document about view: m_pDocument->set_view(m_pFrame); //Tell view about document: //(This calls set_document() in the child views too.) m_pFrame->set_document(static_cast(m_pDocument)); } type_base::init_create_document(); //Sets window title. Doesn't recreate doc. } bool AppWindow::check_document_hosting_mode_is_supported(Document* document) { //If it's an example then the document's hosting mode doesn't matter, //because the user will be asked to choose one when saving anyway. if(document->get_is_example_file()) return true; //Check that the file's hosting mode is supported by this build: Glib::ustring error_message; switch(document->get_hosting_mode()) { case Document::HOSTING_MODE_POSTGRES_SELF: { #ifdef GLOM_ENABLE_CLIENT_ONLY error_message = _("The file cannot be opened because this version of Glom does not support self-hosting of databases."); break; #endif //GLOM_ENABLE_CLIENT_ONLY #ifndef GLOM_ENABLE_POSTGRESQL error_message = _("The file cannot be opened because this version of Glom does not support PostgreSQL databases."); break; #endif //GLOM_ENABLE_POSTGRESQL break; } case Document::HOSTING_MODE_POSTGRES_CENTRAL: { #ifndef GLOM_ENABLE_POSTGRESQL error_message = _("The file cannot be opened because this version of Glom does not support PostgreSQL databases."); #endif //GLOM_ENABLE_POSTGRESQL break; } case Document::HOSTING_MODE_SQLITE: { #ifndef GLOM_ENABLE_SQLITE error_message = _("The file cannot be opened because this version of Glom does not support SQLite databases."); #endif //GLOM_ENABLE_SQLITE break; } default: { //on_document_load() should have checked for this already, informing the user. std::cerr << G_STRFUNC << ": Unhandled hosting mode: " << document->get_hosting_mode() << std::endl; g_assert_not_reached(); break; } } if(error_message.empty()) return true; //Warn the user. Frame_Glom::show_ok_dialog(_("File Uses Unsupported Database Backend"), error_message, *this, Gtk::MESSAGE_ERROR); return false; } bool AppWindow::on_document_load() { //Link to the database described in the document. //Need to ask user for user/password: //m_pFrame->load_from_document(); Document* pDocument = static_cast(get_document()); if(!pDocument) return false; //Set this so that AppWindow::get_current_locale() works as expected: AppWindow::set_original_locale(pDocument->get_translation_original_locale()); if(!pDocument->get_is_new() && !check_document_hosting_mode_is_supported(pDocument)) return false; #ifndef GLOM_ENABLE_CLIENT_ONLY //Connect signals: pDocument->signal_userlevel_changed().connect( sigc::mem_fun(*this, &AppWindow::on_userlevel_changed) ); //Disable/Enable actions, depending on userlevel: pDocument->emit_userlevel_changed(); #endif // !GLOM_ENABLE_CLIENT_ONLY if(pDocument->get_connection_database().empty()) //If it is a new (default) document. { //offer_new_or_existing(); } else { #ifndef GLOM_ENABLE_CLIENT_ONLY //Prevent saving until we are sure that everything worked. //This also stops us from losing the example data as soon as we say the new file (created from the example) is not an example. pDocument->set_allow_autosave(false); #endif // !GLOM_ENABLE_CLIENT_ONLY // Example files and backup files are not supported in client only mode because they // would need to be saved, but saving support is disabled. #ifndef GLOM_ENABLE_CLIENT_ONLY const bool is_example = pDocument->get_is_example_file(); const bool is_backup = pDocument->get_is_backup_file(); #endif // !GLOM_ENABLE_CLIENT_ONLY const std::string original_uri = pDocument->get_file_uri(); if(is_example || is_backup) { #ifndef GLOM_ENABLE_CLIENT_ONLY // Remember the URI to the example file to be able to prevent // adding the URI to the recently used files in document_history_add. // We want to add the document that is created from the example // instead of the example itself. // TODO: This is a weird hack. Find a nicer way. murrayc. m_example_uri = original_uri; pDocument->set_file_uri(Glib::ustring()); //Prevent it from defaulting to the read-only examples directory when offering saveas. //m_ui_save_extra_* are used by offer_saveas() if it's not empty: m_ui_save_extra_showextras = true; if(is_example) { m_ui_save_extra_title = _("Creating From Example File"); m_ui_save_extra_message = _("To use this example file you must save an editable copy of the file. A new database will also be created on the server."); } else if(is_backup) { m_ui_save_extra_title = _("Creating From Backup File"); m_ui_save_extra_message = _("To use this backup file you must save an editable copy of the file. A new database will also be created on the server."); } m_ui_save_extra_newdb_title = "TODO"; m_ui_save_extra_newdb_hosting_mode = Document::HOSTING_MODE_DEFAULT; // Reinit cancelled state set_operation_cancelled(false); offer_saveas(); // Note that bakery will try to add the example file itself to the // recently used documents, which is not what we want. m_ui_save_extra_message.clear(); m_ui_save_extra_title.clear(); if(!get_operation_cancelled()) { //Get the results from the extended save dialog: pDocument->set_database_title_original(m_ui_save_extra_newdb_title); pDocument->set_hosting_mode(m_ui_save_extra_newdb_hosting_mode); m_ui_save_extra_newdb_hosting_mode = Document::HOSTING_MODE_DEFAULT; pDocument->set_is_example_file(false); pDocument->set_is_backup_file(false); // For self-hosting, we will choose a port later. For central // hosting, try several default ports. Don't use the values that // are set in the example file. pDocument->set_connection_port(0); pDocument->set_connection_try_other_ports(true); // We have a valid uri, so we can set it to !new and modified here } m_ui_save_extra_newdb_title.clear(); m_ui_save_extra_showextras = false; if(get_operation_cancelled()) { pDocument->set_modified(false); pDocument->set_is_new(true); pDocument->set_allow_autosave(true); //Turn this back on. std::cout << "debug: user cancelled creating database" << std::endl; return false; } #else // !GLOM_ENABLE_CLIENT_ONLY // TODO_clientonly: Tell the user that opening example files is // not supported. This could alternatively also be done in // Document_after::load_after, I am not sure which is better. ui_warning_load_failed(0); return false; #endif // GLOM_ENABLE_CLIENT_ONLY } #ifndef GLOM_ENABLE_CLIENT_ONLY //Warn about read-only files, because users will otherwise wonder why they can't use Developer mode: Document::userLevelReason reason = Document::USER_LEVEL_REASON_UNKNOWN; const AppState::userlevels userlevel = pDocument->get_userlevel(reason); if( (userlevel == AppState::USERLEVEL_OPERATOR) && (reason == Document::USER_LEVEL_REASON_FILE_READ_ONLY) ) { Gtk::MessageDialog dialog(Utils::bold_message(_("Opening Read-Only File.")), true, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE); dialog.set_secondary_text(_("This file is read only, so you will not be able to enter Developer mode to make design changes.")); dialog.set_transient_for(*this); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(_("Continue without Developer Mode"), Gtk::RESPONSE_OK); //arbitrary response code. const int response = dialog.run(); dialog.hide(); if((response == Gtk::RESPONSE_CANCEL) || (response == Gtk::RESPONSE_DELETE_EVENT)) return false; } #endif // !GLOM_ENABLE_CLIENT_ONLY //Read the connection information from the document: ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(!connection_pool) return false; //Impossible anyway. else { #ifndef GLOM_ENABLE_CLIENT_ONLY connection_pool->set_get_document_func( sigc::mem_fun(*this, &AppWindow::on_connection_pool_get_document) ); #endif connection_pool->set_ready_to_connect(true); //connect_to_server() will now attempt the connection-> Shared instances of m_Connection will also be usable. //Attempt to connect to the specified database: bool test = false; #ifndef GLOM_ENABLE_CLIENT_ONLY if(is_example || is_backup) { //The user has already had the chance to specify a new filename and database name. test = m_pFrame->connection_request_password_and_choose_new_database_name(); } else #endif // !GLOM_ENABLE_CLIENT_ONLY { //Ask for the username/password and connect: //Note that m_temp_username and m_temp_password are set if //we already asked for them when getting the document over the network: //Use the default username/password if opening as non network-shared: if(!(pDocument->get_network_shared())) { // If the document is centrally hosted, don't pretend to know the // username or password, because we don't. The user will enter // the login credentials in a dialog. if(pDocument->get_hosting_mode() != Document::HOSTING_MODE_POSTGRES_CENTRAL) m_temp_username = Privs::get_default_developer_user_name(m_temp_password); } bool database_not_found = false; test = m_pFrame->connection_request_password_and_attempt(database_not_found, m_temp_username, m_temp_password); m_temp_username = Glib::ustring(); m_temp_password = Glib::ustring(); if(!test && database_not_found) { #ifndef GLOM_ENABLE_CLIENT_ONLY if(!is_example) { //The connection to the server is OK, but the database is not there yet. Frame_Glom::show_ok_dialog(_("Database Not Found On Server"), _("The database could not be found on the server. Please consult your system administrator."), *this, Gtk::MESSAGE_ERROR); } else #endif // !GLOM_ENABLE_CLIENT_ONLY std::cerr << G_STRFUNC << ": unexpected database_not_found error when opening example." << std::endl; } else if(!test) { //std::cerr might show some hints, but we don't want to confront the user with them: //TODO: Actually complain about specific stuff such as missing data, because the user might really play with the file system. Frame_Glom::show_ok_dialog(_("Problem Loading Document"), _("Glom could not load the document."), *this, Gtk::MESSAGE_ERROR); std::cerr << G_STRFUNC << ": unexpected error." << std::endl; } } if(!test) return false; //Failed. Close the document. #ifndef GLOM_ENABLE_CLIENT_ONLY if(is_example || is_backup) { //Create the example database: //connection_request_password_and_choose_new_database_name() has already change the database name to a new unused one: bool user_cancelled = false; bool test = false; if(is_example) test = recreate_database_from_example(user_cancelled); else test = recreate_database_from_backup(original_uri, user_cancelled); if(!test) { // TODO: Do we need to call connection_pool->cleanup() here, for // stopping self-hosted databases? armin. connection_pool->cleanup( sigc::mem_fun(*this, &AppWindow::on_connection_close_progress) ); //If the database was not successfully recreated: return false; } else { //Make sure that the changes (mark as non example, and save the new database name) are really saved: //Change the user level temporarily so that save_changes() actually saves: const AppState::userlevels user_level = pDocument->get_userlevel(); pDocument->set_userlevel(AppState::USERLEVEL_DEVELOPER); pDocument->set_modified(true); pDocument->set_allow_autosave(true); //Turn this back on. pDocument->set_userlevel(user_level); //Change it back. } } #endif // !GLOM_ENABLE_CLIENT_ONLY //Switch to operator mode when opening new documents: pDocument->set_userlevel(AppState::USERLEVEL_OPERATOR); //Make sure that it's saved in history, even if it was saved from an example file: document_history_add(pDocument->get_file_uri()); //Open default table, or show list of tables instead: m_pFrame->do_menu_Navigate_Table(true /* open the default if there is one */); } } //List the non-hidden tables in the menu: fill_menu_tables(); update_network_shared_ui(); //Run any startup script: const Glib::ustring script = pDocument->get_startup_script(); if(!script.empty()) { Glib::ustring error_message; //TODO: Check this and tell the user. ConnectionPool* connection_pool = ConnectionPool::get_instance(); sharedptr sharedconnection = connection_pool->connect(); AppPythonUICallbacks callbacks; glom_execute_python_function_implementation(script, type_map_fields(), //only used when there is a current table and record. pDocument, Glib::ustring() /* table_name */, sharedptr(), Gnome::Gda::Value(), // primary key - only used when there is a current table and record. sharedconnection->get_gda_connection(), callbacks, error_message); if(!error_message.empty()) { std::cerr << "Python Error: " << error_message << std::endl; } } #ifndef GLOM_ENABLE_CLIENT_ONLY pDocument->set_allow_autosave(true); #endif // !GLOM_ENABLE_CLIENT_ONLY return true; //Loading of the document into the application succeeded. } void AppWindow::on_connection_create_database_progress() { pulse_progress_message(); } void AppWindow::on_connection_close_progress() { //TODO_murrayc } void AppWindow::on_connection_save_backup_progress() { pulse_progress_message(); } void AppWindow::on_connection_convert_backup_progress() { pulse_progress_message(); } void AppWindow::on_document_close() { #ifndef GLOM_ENABLE_CLIENT_ONLY //TODO: It would be better to do this in a AppWindow::on_document_closed() virtual method, //but that would need an ABI break in Bakery: ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(!connection_pool) return; connection_pool->cleanup( sigc::mem_fun(*this, &AppWindow::on_connection_close_progress) ); #endif // !GLOM_ENABLE_CLIENT_ONLY } /* void AppWindow::statusbar_set_text(const Glib::ustring& strText) { m_pStatus->set_text(strText); } void AppWindow::statusbar_clear() { statusbar_set_text(""); } */ void AppWindow::update_network_shared_ui() { Document* document = dynamic_cast(get_document()); if(!document) return; if(!m_connection_toggleaction_network_shared) return; //Show the status in the UI: //(get_network_shared() already enforces constraints). const bool shared = document->get_network_shared(); //TODO: Our use of block() does not seem to work. The signal actually seems to be emitted some time later instead. m_connection_toggleaction_network_shared.block(); //Prevent signal handling. m_toggleaction_network_shared->set_active(shared); //Do not allow impossible changes: const Document::HostingMode hosting_mode = document->get_hosting_mode(); if( (hosting_mode == Document::HOSTING_MODE_POSTGRES_CENTRAL) //Central hosting means that it must be shared on the network. || (hosting_mode == Document::HOSTING_MODE_SQLITE) ) //sqlite does not allow network sharing. { m_toggleaction_network_shared->set_sensitive(false); } m_connection_toggleaction_network_shared.unblock(); } #ifndef GLOM_ENABLE_CLIENT_ONLY void AppWindow::on_userlevel_changed(AppState::userlevels /* userlevel */) { update_userlevel_ui(); } void AppWindow::update_table_sensitive_ui() { AppState::userlevels userlevel = get_userlevel(); bool has_table = false; if(m_pFrame) has_table = !m_pFrame->get_shown_table_name().empty(); for(type_listActions::iterator iter = m_listTableSensitiveActions.begin(); iter != m_listTableSensitiveActions.end(); ++iter) { Glib::RefPtr action = *iter; bool sensitive = has_table; const bool is_developer_item = (std::find(m_listDeveloperActions.begin(), m_listDeveloperActions.end(), action) != m_listDeveloperActions.end()); if(is_developer_item) sensitive = sensitive && (userlevel == AppState::USERLEVEL_DEVELOPER); action->set_sensitive(sensitive); } } void AppWindow::update_userlevel_ui() { AppState::userlevels userlevel = get_userlevel(); //Disable/Enable developer actions: for(type_listActions::iterator iter = m_listDeveloperActions.begin(); iter != m_listDeveloperActions.end(); ++iter) { Glib::RefPtr action = *iter; action->set_sensitive( userlevel == AppState::USERLEVEL_DEVELOPER ); } //Ensure table sensitive menus stay disabled if necessary. update_table_sensitive_ui(); // Hide users entry from developer menu for connections that don't // support users if(userlevel == AppState::USERLEVEL_DEVELOPER) { if(ConnectionPool::get_instance_is_ready()) { sharedptr connection = ConnectionPool::get_and_connect(); if(connection && !connection->get_gda_connection()->supports_feature(Gnome::Gda::CONNECTION_FEATURE_USERS)) m_action_developer_users->set_sensitive(false); } } //Make sure that the correct radio menu item is activated (the userlevel might have been set programmatically): //We only need to set/unset one, because the others are in the same radio group. if(userlevel == AppState::USERLEVEL_DEVELOPER) { if(!m_action_menu_developer_developer->get_active()) m_action_menu_developer_developer->set_active(); } else if(userlevel == AppState::USERLEVEL_OPERATOR) { if(!m_action_menu_developer_operator->get_active()) m_action_menu_developer_operator->set_active(); // Remove the drag layout toolbar } } #endif // !GLOM_ENABLE_CLIENT_ONLY Glib::RefPtr AppWindow::get_ui_manager() { return m_refUIManager; } bool AppWindow::offer_new_or_existing() { //Offer to load an existing document, or start a new one. Dialog_ExistingOrNew* dialog_raw = 0; Utils::get_glade_widget_derived_with_warning(dialog_raw); std::auto_ptr dialog(dialog_raw); dialog->set_transient_for(*this); /* dialog->signal_new().connect(sigc::mem_fun(*this, &AppWindow::on_existing_or_new_new)); dialog->signal_open_from_uri().connect(sigc::mem_fun(*this, &AppWindow::on_existing_or_new_open_from_uri)); dialog->signal_open_from_remote().connect(sigc::mem_fun(*this, &AppWindow::on_existing_or_new_open_from_remote)); */ bool ask_again = true; while(ask_again) { const int response_id = Utils::dialog_run_with_help(dialog_raw); dialog->hide(); if(response_id == Gtk::RESPONSE_ACCEPT) { switch(dialog->get_action()) { #ifndef GLOM_ENABLE_CLIENT_ONLY case Dialog_ExistingOrNew::NEW_EMPTY: existing_or_new_new(); break; case Dialog_ExistingOrNew::NEW_FROM_TEMPLATE: #endif // !GLOM_ENABLE_CLIENT_ONLY case Dialog_ExistingOrNew::OPEN_URI: open_document(dialog->get_uri()); break; #ifndef G_OS_WIN32 case Dialog_ExistingOrNew::OPEN_REMOTE: open_browsed_document(dialog->get_service_info(), dialog->get_service_name()); break; #endif case Dialog_ExistingOrNew::NONE: default: std::cerr << G_STRFUNC << ": Unhandled action: " << dialog->get_action() << std::endl; g_assert_not_reached(); break; } //Check that a document was opened: Document* document = dynamic_cast(get_document()); if(!document) { std::cerr << G_STRFUNC << ": document was NULL." << std::endl; return false; } if(!document->get_file_uri().empty() || (document->get_opened_from_browse())) ask_again = false; } else if((response_id == Gtk::RESPONSE_CLOSE) || (response_id == Gtk::RESPONSE_DELETE_EVENT)) { return false; //close the window to close the application, because they need to choose a new or existing document. } else if((response_id == Gtk::RESPONSE_NONE) || (response_id == 0)) { //For instance, the file-open dialog was cancelled after Dialog_ExistingOrNew opened it, //so just ask again. //TODO: Stop Dialog_ExistingOrNew from emitting a response in this case. } else { // This would mean that we got a unhandled response from the dialog g_return_val_if_reached(false); } } return true; } #ifndef GLOM_ENABLE_CLIENT_ONLY void AppWindow::existing_or_new_new() { // New empty document //Each document must have a location, so ask the user for one. //This will use an extended save dialog that also asks for the database title and some hosting details: Glib::ustring db_title; m_ui_save_extra_showextras = true; //Offer self-hosting or central hosting, and offer the database title. m_ui_save_extra_newdb_hosting_mode = Document::HOSTING_MODE_DEFAULT; /* Default to self-hosting */ m_ui_save_extra_newdb_title.clear(); offer_saveas(); //Check that the document was given a location: Document* document = dynamic_cast(get_document()); if(!document->get_file_uri().empty()) { //Get details from the extended save dialog: const Glib::ustring db_title = m_ui_save_extra_newdb_title; Document::HostingMode hosting_mode = m_ui_save_extra_newdb_hosting_mode; m_ui_save_extra_newdb_title.clear(); m_ui_save_extra_newdb_hosting_mode = Document::HOSTING_MODE_DEFAULT; //Make sure that the user can do something with his new document: document->set_userlevel(AppState::USERLEVEL_DEVELOPER); // Try various ports if connecting to an existing database server instead // of self-hosting one: document->set_connection_try_other_ports(m_ui_save_extra_newdb_hosting_mode == Document::HOSTING_MODE_DEFAULT); //Each new document must have an associated new database, //so choose a name //Create a database name based on the title. //The user will (almost) never see this anyway but it's nicer than using a random number: Glib::ustring db_name = Utils::create_name_from_title(db_title); //Prefix glom_ to the database name, so it's more obvious //for the system administrator. //This database name should never be user-visible again, either prefixed or not prefixed. db_name = "glom_" + db_name; //Connect to the server and choose a variation of this db_name that does not exist yet: document->set_connection_database(db_name); document->set_hosting_mode(hosting_mode); //Tell the connection pool about the document: ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(connection_pool) connection_pool->set_get_document_func( sigc::mem_fun(*this, &AppWindow::on_connection_pool_get_document) ); const bool connected = m_pFrame->connection_request_password_and_choose_new_database_name(); if(!connected) { // Unset URI so that the offer_new_or_existing does not disappear // so the user can make a different choice about what document to open. // TODO: Show some error message? document->set_file_uri(""); } else { const bool db_created = m_pFrame->create_database(document->get_connection_database(), db_title); if(db_created) { const Glib::ustring database_name_used = document->get_connection_database(); ConnectionPool::get_instance()->set_database(database_name_used); document->set_database_title_original(db_title); m_pFrame->set_databases_selected(database_name_used); // Add the document to recent files document_history_add(document->get_file_uri()); } else { // Unset URI so that the offer_new_or_existing does not disappear // so the user can make a different choice about what document to open. // TODO: Show some error message? document->set_file_uri(""); } } } } #endif // !GLOM_ENABLE_CLIENT_ONLY void AppWindow::set_mode_data() { if (!m_pFrame) return; if (m_pFrame->m_Mode == Frame_Glom::MODE_Find) m_action_mode_find->activate(); } void AppWindow::set_mode_find() { if (!m_pFrame) return; if (m_pFrame->m_Mode == Frame_Glom::MODE_Data) m_action_mode_find->activate(); } void AppWindow::on_menu_help_contents() { Glom::Utils::show_help(); } #ifndef GLOM_ENABLE_CLIENT_ONLY void AppWindow::on_recreate_database_progress() { //Show the user that something is happening, because the INSERTS might take time. pulse_progress_message(); //Ensure that the infobar is shown, instead of waiting for the application to be idle. while(Gtk::Main::events_pending()) Gtk::Main::iteration(); } bool AppWindow::recreate_database_from_example(bool& user_cancelled) { ShowProgressMessage progress_message(_("Creating Glom database from example file.")); //Create a database, based on the information in the current document: Document* pDocument = static_cast(get_document()); if(!pDocument) return false; ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(!connection_pool) return false; //Impossible anyway. //Check whether the database exists already. const Glib::ustring db_name = pDocument->get_connection_database(); if(db_name.empty()) return false; connection_pool->set_database(db_name); #ifdef GLIBMM_EXCEPTIONS_ENABLED try #else std::auto_ptr error; #endif // GLIBMM_EXCEPTIONS_ENABLED { connection_pool->set_ready_to_connect(); //This has succeeded already. #ifdef GLIBMM_EXCEPTIONS_ENABLED sharedptr sharedconnection = connection_pool->connect(); #else sharedptr sharedconnection = connection_pool->connect(error); if(!error.get()) { #endif // GLIBMM_EXCEPTIONS_ENABLED std::cerr << G_STRFUNC << ": Failed because database exists already." << std::endl; return false; //Connection to the database succeeded, because no exception was thrown. so the database exists already. #ifndef GLIBMM_EXCEPTIONS_ENABLED } #endif // !GLIBMM_EXCEPTIONS_ENABLED } #ifdef GLIBMM_EXCEPTIONS_ENABLED catch(const ExceptionConnection& ex) { #else if(error.get()) { const ExceptionConnection* exptr = dynamic_cast(error.get()); if(exptr) { const ExceptionConnection& ex = *exptr; #endif // GLIBMM_EXCEPTIONS_ENABLED if(ex.get_failure_type() == ExceptionConnection::FAILURE_NO_SERVER) { user_cancelled = true; //Eventually, the user will cancel after retrying. std::cerr << G_STRFUNC << ": Failed because connection to server failed, without specifying a database." << std::endl; return false; } #ifndef GLIBMM_EXCEPTIONS_ENABLED } #endif // !GLIBMM_EXCEPTIONS_ENABLED //Otherwise continue, because we _expected_ connect() to fail if the db does not exist yet. } //Show the user that something is happening, because the INSERTS might take time. pulse_progress_message(); //Ensure that the infobar is shown, instead of waiting for the application to be idle. while(Gtk::Main::events_pending()) Gtk::Main::iteration(); //Create the database: (This will show a connection dialog) connection_pool->set_database( Glib::ustring() ); const bool db_created = m_pFrame->create_database(db_name, pDocument->get_database_title_original()); if(!db_created) { return false; } else connection_pool->set_database(db_name); //Specify the new database when connecting from now on. pulse_progress_message(); BusyCursor busy_cursor(this); sharedptr sharedconnection; #ifdef GLIBMM_EXCEPTIONS_ENABLED try #endif // GLIBMM_EXCEPTIONS_ENABLED { #ifdef GLIBMM_EXCEPTIONS_ENABLED sharedconnection = connection_pool->connect(); #else sharedconnection = connection_pool->connect(error); if(!error.get()) #endif // GLIBMM_EXCEPTIONS_ENABLED connection_pool->set_database(db_name); //The database was successfully created, so specify it when connecting from now on. } #ifdef GLIBMM_EXCEPTIONS_ENABLED catch(const ExceptionConnection& ex) { #else if(error.get()) { const std::exception& ex = *error.get(); #endif // GLIBMM_EXCEPTIONS_ENABLED std::cerr << G_STRFUNC << ": Failed to connect to the newly-created database." << std::endl; return false; } //Create the developer group, and make this user a member of it: pulse_progress_message(); bool test = DbUtils::add_standard_groups(pDocument); if(!test) return false; //Add any extra groups from the example file: pulse_progress_message(); test = DbUtils::add_groups_from_document(pDocument); if(!test) return false; //Create each table: Document::type_listTableInfo tables = pDocument->get_tables(); for(Document::type_listTableInfo::const_iterator iter = tables.begin(); iter != tables.end(); ++iter) { sharedptr table_info = *iter; //Create SQL to describe all fields in this table: Glib::ustring sql_fields; Document::type_vec_fields fields = pDocument->get_table_fields(table_info->get_name()); pulse_progress_message(); const bool table_creation_succeeded = DbUtils::create_table(table_info, fields); pulse_progress_message(); if(!table_creation_succeeded) { std::cerr << G_STRFUNC << ": CREATE TABLE failed with the newly-created database." << std::endl; return false; } } pulse_progress_message(); DbUtils::add_standard_tables(pDocument); //Add internal, hidden, tables. //Set table priviliges, using the groups we just added: pulse_progress_message(); test = DbUtils::set_table_privileges_groups_from_document(pDocument); if(!test) return false; for(Document::type_listTableInfo::const_iterator iter = tables.begin(); iter != tables.end(); ++iter) { sharedptr table_info = *iter; //Add any example data to the table: pulse_progress_message(); //try //{ const bool table_insert_succeeded = DbUtils::insert_example_data(pDocument, table_info->get_name()); if(!table_insert_succeeded) { std::cerr << G_STRFUNC << ": INSERT of example data failed with the newly-created database." << std::endl; return false; } //} //catch(const std::exception& ex) //{ // std::cerr << "AppWindow::recreate_database_from_example(): exception: " << ex.what() << std::endl; //HandleError(ex); //} } //for(tables) return true; //All tables created successfully. } bool AppWindow::recreate_database_from_backup(const Glib::ustring& backup_uri, bool& user_cancelled) { ShowProgressMessage progress_message(_("Creating Glom database from backup file.")); //Create a database, based on the information in the current document: Document* pDocument = static_cast(get_document()); if(!pDocument) return false; ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(!connection_pool) return false; //Impossible anyway. //Check whether the database exists already. const Glib::ustring db_name = pDocument->get_connection_database(); if(db_name.empty()) return false; connection_pool->set_database(db_name); #ifdef GLIBMM_EXCEPTIONS_ENABLED try #else std::auto_ptr error; #endif // GLIBMM_EXCEPTIONS_ENABLED { connection_pool->set_ready_to_connect(); //This has succeeded already. #ifdef GLIBMM_EXCEPTIONS_ENABLED sharedptr sharedconnection = connection_pool->connect(); #else sharedptr sharedconnection = connection_pool->connect(error); if(!error.get()) { #endif // GLIBMM_EXCEPTIONS_ENABLED std::cerr << G_STRFUNC << ": Failed because database exists already." << std::endl; return false; //Connection to the database succeeded, because no exception was thrown. so the database exists already. #ifndef GLIBMM_EXCEPTIONS_ENABLED } #endif // !GLIBMM_EXCEPTIONS_ENABLED } #ifdef GLIBMM_EXCEPTIONS_ENABLED catch(const ExceptionConnection& ex) { #else if(error.get()) { const ExceptionConnection* exptr = dynamic_cast(error.get()); if(exptr) { const ExceptionConnection& ex = *exptr; #endif // GLIBMM_EXCEPTIONS_ENABLED if(ex.get_failure_type() == ExceptionConnection::FAILURE_NO_SERVER) { user_cancelled = true; //Eventually, the user will cancel after retrying. std::cerr << G_STRFUNC << ": Failed because connection to server failed, without specifying a database." << std::endl; return false; } #ifndef GLIBMM_EXCEPTIONS_ENABLED } #endif // !GLIBMM_EXCEPTIONS_ENABLED //Otherwise continue, because we _expected_ connect() to fail if the db does not exist yet. } //Show the user that something is happening, because the INSERTS might take time. pulse_progress_message(); //Ensure that the infobar is shown, instead of waiting for the application to be idle. while(Gtk::Main::events_pending()) Gtk::Main::iteration(); pulse_progress_message(); //Create the database: (This will show a connection dialog) connection_pool->set_database( Glib::ustring() ); try { ConnectionPool::get_instance()->create_database( sigc::mem_fun(*this, &AppWindow::on_connection_convert_backup_progress), db_name); } catch(const Glib::Exception& ex) // libgda does not set error domain { std::cerr << G_STRFUNC << ": Gnome::Gda::Connection::create_database(" << db_name << ") failed: " << ex.what() << std::endl; //Tell the user: Gtk::Dialog* dialog = 0; Utils::get_glade_widget_with_warning("glom_developer.glade", "dialog_error_create_database", dialog); dialog->set_transient_for(*this); Glom::Utils::dialog_run_with_help(dialog, "dialog_error_create_database"); delete dialog; return false; } connection_pool->set_database(db_name); //Specify the new database when connecting from now on. //Create the developer group, and make this user a member of it: pulse_progress_message(); bool test = DbUtils::add_standard_groups(pDocument); if(!test) return false; //Add any extra groups from the example file: pulse_progress_message(); test = DbUtils::add_groups_from_document(pDocument); if(!test) return false; //m_pFrame->add_standard_tables(); //Add internal, hidden, tables. //Restore the backup into the database: std::string original_dir_path; Glib::RefPtr gio_file = Gio::File::create_for_uri(backup_uri); if(gio_file) { Glib::RefPtr parent = gio_file->get_parent(); if(parent) { try { original_dir_path = Glib::filename_from_uri(parent->get_uri()); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": Glib::filename_from_uri() failed: " << ex.what() << std::endl; } } } if(original_dir_path.empty()) { std::cerr << G_STRFUNC << ": original_dir_path is empty." << std::endl; return false; } //Restore the database from the backup: //std::cout << "DEBUG: original_dir_path=" << original_dir_path << std::endl; const bool restored = connection_pool->convert_backup( sigc::mem_fun(*this, &AppWindow::on_connection_convert_backup_progress), original_dir_path); if(!restored) { std::cerr << G_STRFUNC << ": Restore failed." << std::endl; return false; } return true; //Restore successfully. } #endif // !GLOM_ENABLE_CLIENT_ONLY AppState::userlevels AppWindow::get_userlevel() const { const Document* document = dynamic_cast(get_document()); if(document) { return document->get_userlevel(); } else g_assert_not_reached(); //return AppState::USERLEVEL_DEVELOPER; //This should never happen. } #ifndef GLOM_ENABLE_CLIENT_ONLY void AppWindow::add_developer_action(const Glib::RefPtr& refAction) { //Prevent it from being added twice: remove_developer_action(refAction); m_listDeveloperActions.push_back(refAction); } void AppWindow::remove_developer_action(const Glib::RefPtr& refAction) { for(type_listActions::iterator iter = m_listDeveloperActions.begin(); iter != m_listDeveloperActions.end(); ++iter) { if(*iter == refAction) { m_listDeveloperActions.erase(iter); break; } } } #endif // !GLOM_ENABLE_CLIENT_ONLY void AppWindow::fill_menu_tables() { //TODO: There must be a better way than building a ui_string like this: m_listNavTableActions.clear(); if(m_menu_tables_ui_merge_id) m_refUIManager->remove_ui(m_menu_tables_ui_merge_id); if(m_refNavTablesActionGroup) { m_refUIManager->remove_action_group(m_refNavTablesActionGroup); m_refNavTablesActionGroup.reset(); } m_refNavTablesActionGroup = Gtk::ActionGroup::create("NavTablesActions"); Glib::ustring ui_description = "" " " " " " " " "; Document* document = dynamic_cast(get_document()); const Document::type_listTableInfo tables = document->get_tables(); for(Document::type_listTableInfo::const_iterator iter = tables.begin(); iter != tables.end(); ++iter) { sharedptr table_info = *iter; if(!table_info->get_hidden()) { const Glib::ustring action_name = "NavTableAction_" + table_info->get_name(); ui_description += ""; Glib::RefPtr refAction = Gtk::Action::create(action_name, Utils::string_escape_underscores(item_get_title_or_name(table_info))); m_refNavTablesActionGroup->add(refAction, sigc::bind( sigc::mem_fun(*m_pFrame, &Frame_Glom::on_box_tables_selected), table_info->get_name()) ); m_listNavTableActions.push_back(refAction); //m_refUIManager->add_ui(merge_id, path, table_info->m_title, refAction, UI_MANAGER_MENUITEM); } } m_refUIManager->insert_action_group(m_refNavTablesActionGroup); ui_description += " " " " " " " " ""; //Add menus: try { m_menu_tables_ui_merge_id = m_refUIManager->add_ui_from_string(ui_description); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": building menus failed: " << ex.what() << std::endl; std::cerr << " The ui_description was: " << ui_description << std::endl; } } void AppWindow::fill_menu_reports(const Glib::ustring& table_name) { //TODO: There must be a better way than building a ui_string like this: m_listNavReportActions.clear(); if(m_menu_reports_ui_merge_id) m_refUIManager->remove_ui(m_menu_reports_ui_merge_id); if(m_refNavReportsActionGroup) { m_refUIManager->remove_action_group(m_refNavReportsActionGroup); m_refNavReportsActionGroup.reset(); } m_refNavReportsActionGroup = Gtk::ActionGroup::create("NavReportsActions"); Glib::ustring ui_description = "" " " " " " " " "; Document* document = dynamic_cast(get_document()); const std::vector reports = document->get_report_names(table_name); for(std::vector::const_iterator iter = reports.begin(); iter != reports.end(); ++iter) { sharedptr report = document->get_report(table_name, *iter); if(report) { const Glib::ustring report_name = report->get_name(); if(!report_name.empty()) { const Glib::ustring action_name = "NavReportAction_" + report_name; ui_description += ""; Glib::RefPtr refAction = Gtk::Action::create( action_name, Utils::string_escape_underscores(item_get_title_or_name(report)) ); m_refNavReportsActionGroup->add(refAction, sigc::bind( sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_report_selected), report->get_name()) ); m_listNavReportActions.push_back(refAction); //m_refUIManager->add_ui(merge_id, path, table_info->m_title, refAction, UI_MANAGER_MENUITEM); } } } m_refUIManager->insert_action_group(m_refNavReportsActionGroup); ui_description += " " " " " " " " ""; //Add menus: try { m_menu_reports_ui_merge_id = m_refUIManager->add_ui_from_string(ui_description); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": building menus failed: " << ex.what(); } } void AppWindow::enable_menu_print_layouts_details(bool enable) { if(m_refNavPrintLayoutsActionGroup) m_refNavPrintLayoutsActionGroup->set_sensitive(enable); } void AppWindow::fill_menu_print_layouts(const Glib::ustring& table_name) { //TODO: This is copy/pasted from fill_menu_print_reports. Can we generalize it? //TODO: There must be a better way than building a ui_string like this: m_listNavPrintLayoutActions.clear(); if(m_menu_print_layouts_ui_merge_id) m_refUIManager->remove_ui(m_menu_print_layouts_ui_merge_id); if(m_refNavPrintLayoutsActionGroup) { m_refUIManager->remove_action_group(m_refNavPrintLayoutsActionGroup); m_refNavPrintLayoutsActionGroup.reset(); } m_refNavPrintLayoutsActionGroup = Gtk::ActionGroup::create("NavPrintLayoutsActions"); Glib::ustring ui_description = "" " " " " " " " " " "; Document* document = dynamic_cast(get_document()); const std::vector tables = document->get_print_layout_names(table_name); // TODO_clientonly: Should this be available in client only mode? We need to // depend on goocanvas in client only mode then: #ifndef GLOM_ENABLE_CLIENT_ONLY for(std::vector::const_iterator iter = tables.begin(); iter != tables.end(); ++iter) { sharedptr print_layout = document->get_print_layout(table_name, *iter); if(print_layout) { const Glib::ustring name = print_layout->get_name(); if(!name.empty()) { const Glib::ustring action_name = "NavPrintLayoutAction_" + name; ui_description += ""; Glib::RefPtr refAction = Gtk::Action::create( action_name, Utils::string_escape_underscores(item_get_title(print_layout)) ); m_refNavPrintLayoutsActionGroup->add(refAction, sigc::bind( sigc::mem_fun(*m_pFrame, &Frame_Glom::on_menu_print_layout_selected), print_layout->get_name()) ); m_listNavPrintLayoutActions.push_back(refAction); //m_refUIManager->add_ui(merge_id, path, table_info->m_title, refAction, UI_MANAGER_MENUITEM); } } } #endif m_refUIManager->insert_action_group(m_refNavPrintLayoutsActionGroup); ui_description += " " " " " " " " " " ""; //Add menus: try { m_menu_print_layouts_ui_merge_id = m_refUIManager->add_ui_from_string(ui_description); } catch(const Glib::Error& ex) { std::cerr << G_STRFUNC << ": building menus failed: " << ex.what(); } } #ifndef GLOM_ENABLE_CLIENT_ONLY void AppWindow::on_menu_file_save_as_example() { //Based on the implementation of GlomBakery::AppWindow_WithDoc::on_menu_file_saveas() //Display File Save dialog and respond to choice: //Bring document window to front, to make it clear which document is being saved: //This doesn't work: TODO. ui_bring_to_front(); //Show the save dialog: Document* document = dynamic_cast(get_document()); const Glib::ustring& file_uriOld = document->get_file_uri(); m_ui_save_extra_showextras = false; m_ui_save_extra_title.clear(); m_ui_save_extra_message.clear(); m_ui_save_extra_newdb_title.clear(); m_ui_save_extra_newdb_hosting_mode = Document::HOSTING_MODE_DEFAULT; Glib::ustring file_uri = ui_file_select_save(file_uriOld); //Also asks for overwrite confirmation. if(!file_uri.empty()) { //Enforce the file extension: file_uri = document->get_file_uri_with_extension(file_uri); bool bUseThisFileUri = true; //We previously checked whether the file existed, //but The FileChooser checks that already, //so Bakery doesn't bother checking anymore, //and our old test always set bUseThisFileUri to true anyway. murryac. //TODO: So remove this bool. murrayc. //Save to this filepath: if(bUseThisFileUri) { //Prevent saving while we modify the document: document->set_allow_autosave(false); document->set_file_uri(file_uri, true); //true = enforce file extension document->set_is_example_file(); //Save all data from all tables into the document: Document::type_listTableInfo list_table_info = document->get_tables(); for(Document::type_listTableInfo::const_iterator iter = list_table_info.begin(); iter != list_table_info.end(); ++iter) { const Glib::ustring table_name = (*iter)->get_name(); //const type_vec_fields vec_fields = document->get_table_fields(table_name); //export_data_to_*() needs a type_list_layout_groups; Document::type_list_layout_groups sequence = document->get_data_layout_groups_default("list", table_name, "" /* layout_platform */); //std::cout << "debug: table_name=" << table_name << std::endl; Document::type_example_rows example_rows; FoundSet found_set; found_set.m_table_name = table_name; m_pFrame->export_data_to_vector(example_rows, found_set, sequence); //std::cout << " debug after row_text=" << row_text << std::endl; document->set_table_example_data(table_name, example_rows); } const bool bTest = document->save(); document->set_is_example_file(false); document->set_is_backup_file(false); document->set_file_uri(file_uriOld); document->set_allow_autosave(true); if(!bTest) { ui_warning(_("Save failed."), _("There was an error while saving the example file.")); } else { //Disable Save and SaveAs menu items: after_successful_save(); } update_window_title(); //Close if this save was a result of a File|Close or File|Exit:. //if(bTest && m_bCloseAfterSave) //Don't close if the save failed. //{ // on_menu_file_close(); //This could be the second time, but now there are no unsaved changes. //} } else { //Let the user choose a different file path, //because he decided not to overwrite the 1st one. on_menu_file_save_as_example(); //recursive. } } else { cancel_close_or_exit(); } } Glib::ustring AppWindow::ui_file_select_save(const Glib::ustring& old_file_uri) //override { //Reimplement this whole function, just so we can use our custom FileChooserDialog class: AppWindow& app = *this; std::auto_ptr fileChooser_Save; Glom::FileChooserDialog_SaveExtras* fileChooser_SaveExtras = 0; //Create the appropriate dialog, depending on how the caller set m_ui_save_extra_showextras: if(m_ui_save_extra_showextras) { fileChooser_SaveExtras = new Glom::FileChooserDialog_SaveExtras(_("Save Document"), Gtk::FILE_CHOOSER_ACTION_SAVE); fileChooser_Save.reset(fileChooser_SaveExtras); } else { fileChooser_Save.reset(new Gtk::FileChooserDialog(gettext("Save Document"), Gtk::FILE_CHOOSER_ACTION_SAVE)); } fileChooser_Save->set_do_overwrite_confirmation(); //Ask the user if the file already exists. Gtk::Window* pWindow = dynamic_cast(&app); if(pWindow) fileChooser_Save->set_transient_for(*pWindow); fileChooser_Save->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); fileChooser_Save->add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); fileChooser_Save->set_default_response(Gtk::RESPONSE_OK); //This is the reason that we override this method: if(!m_ui_save_extra_title.empty()) fileChooser_Save->set_title(m_ui_save_extra_title); if(fileChooser_SaveExtras) { fileChooser_SaveExtras->set_extra_message(m_ui_save_extra_message); //Start with something suitable: Document* document = dynamic_cast(get_document()); g_assert(document); const Glib::ustring filename = document->get_name(); //Get the filename without the path and extension. //Avoid ".". TODO: Find out why it happens: if(filename == ".") m_ui_save_extra_newdb_title = Glib::ustring(); else m_ui_save_extra_newdb_title = Utils::title_from_string( filename ); //Start with something suitable. fileChooser_SaveExtras->set_extra_newdb_title(m_ui_save_extra_newdb_title); fileChooser_SaveExtras->set_extra_newdb_hosting_mode(m_ui_save_extra_newdb_hosting_mode); } //Make the save dialog show the existing filename, if any: if(!old_file_uri.empty()) { //Just start with the parent folder, //instead of the whole name, to avoid overwriting: Glib::RefPtr gio_file = Gio::File::create_for_uri(old_file_uri); if(gio_file) { Glib::RefPtr parent = gio_file->get_parent(); if(parent) { const Glib::ustring uri_parent = parent->get_uri(); fileChooser_Save->set_uri(uri_parent); } } } //bool tried_once_already = false; bool try_again = true; while(try_again) { try_again = false; const int response_id = fileChooser_Save->run(); fileChooser_Save->hide(); if((response_id != Gtk::RESPONSE_CANCEL) && (response_id != Gtk::RESPONSE_DELETE_EVENT)) { const Glib::ustring uri_chosen = fileChooser_Save->get_uri(); //Change the URI, to put the file (and its data folder) in a folder: const Glib::ustring uri = Utils::get_file_uri_without_extension(uri_chosen); //Check whether the file exists, and that we have rights to it: Glib::RefPtr file = Gio::File::create_for_uri(uri); if(!file) return Glib::ustring(); //Failure. //If the file exists (the FileChooser offers a "replace?" dialog, so this is not possible.): if(AppWindow_WithDoc::file_exists(uri)) { //Check whether we have rights to the file to change it: //Really, GtkFileChooser should do this for us. if(!uri_is_writable(file)) { //Warn the user: ui_warning(gettext("Read-only File."), _("You may not overwrite the existing file, because you do not have sufficient access rights.")); try_again = true; //Try again. continue; } } //Check whether we have rights to the directory, to create a new file in it: //Really, GtkFileChooser should do this for us. Glib::RefPtr parent = file->get_parent(); if(parent) { if(!uri_is_writable(parent)) { //Warn the user: ui_warning(gettext("Read-only Directory."), _("You may not create a file in this directory, because you do not have sufficient access rights.")); try_again = true; //Try again. continue; } } if(!try_again && fileChooser_SaveExtras) { //Get the extra details from the extended save dialog: m_ui_save_extra_newdb_title = fileChooser_SaveExtras->get_extra_newdb_title(); #ifndef GLOM_ENABLE_CLIENT_ONLY m_ui_save_extra_newdb_hosting_mode = fileChooser_SaveExtras->get_extra_newdb_hosting_mode(); #endif // !GLOM_ENABLE_CLIENT_ONLY if(m_ui_save_extra_newdb_title.empty()) { Frame_Glom::show_ok_dialog(_("Database Title missing"), _("You must specify a title for the new database."), *this, Gtk::MESSAGE_ERROR); try_again = true; continue; } } bool is_self_hosted = false; #ifdef GLOM_ENABLE_POSTGRESQL if(m_ui_save_extra_newdb_hosting_mode == Document::HOSTING_MODE_POSTGRES_SELF) is_self_hosted = true; #endif //GLOM_ENABLE_POSTGRESQL #ifdef GLOM_ENABLE_SQLITE if(m_ui_save_extra_newdb_hosting_mode == Document::HOSTING_MODE_SQLITE) is_self_hosted = true; #endif // GLOM_ENABLE_SQLITE // Create a directory for self-hosted databases (sqlite or self-hosted // postgresql). if(!try_again && fileChooser_SaveExtras && is_self_hosted) { //Check that the directory does not exist already. //The GtkFileChooser could not check for that because it could not know that we would create a directory based on the filename: //Note that uri has no extension at this point: Glib::RefPtr dir = Gio::File::create_for_uri(uri); if(dir->query_exists()) { ui_warning(_("Directory Already Exists"), _("There is an existing directory with the same name as the directory that should be created for the new database files. You should specify a different filename to use a new directory instead.")); try_again = true; //Try again. continue; } //Create the directory, so that file creation can succeed later: //0770 means "this user and his group can read and write this "executable" (can add child files) directory". //The 0 prefix means that this is octal. try { //TODO: ensure that we use 0770? murrayc. dir->make_directory(); } catch(const Gio::Error& ex) { std::cerr << G_STRFUNC << ": " << ex.what() << std::endl; } //Add the filename (Note that the caller will add the extension if necessary, so we don't do it here.) Glib::RefPtr file_with_ext = Gio::File::create_for_uri(uri_chosen); const Glib::ustring filename_part = file_with_ext->get_basename(); //Add the filename part to the newly-created directory: Glib::RefPtr file_whole = dir->get_child(filename_part); return file_whole->get_uri(); } if(!try_again) { return uri_chosen; } } else return Glib::ustring(); //The user cancelled. } return Glib::ustring(); } void AppWindow::stop_self_hosting_of_document_database() { Document* pDocument = static_cast(get_document()); if(pDocument) { ConnectionPool* connection_pool = ConnectionPool::get_instance(); if(!connection_pool) return; connection_pool->cleanup( sigc::mem_fun(*this, &AppWindow::on_connection_close_progress )); } } void AppWindow::on_menu_developer_changelanguage() { Dialog_ChangeLanguage* dialog = 0; Utils::get_glade_widget_derived_with_warning(dialog); if(!dialog) //Unlikely and it already warns on stderr. return; dialog->set_transient_for(*this); const int response = Glom::Utils::dialog_run_with_help(dialog); dialog->hide(); if(response == Gtk::RESPONSE_OK) { AppWindow::set_current_locale(dialog->get_locale()); //Get the translations from the document (in Operator mode, we only load the necessary translations.) //This also updates the UI, so we show all the translated titles: int failure_code = 0; get_document()->load(failure_code); m_pFrame->show_table_refresh(); //load() doesn't seem to refresh the view. } delete dialog; } void AppWindow::on_menu_developer_translations() { if(!m_window_translations) { Utils::get_glade_widget_derived_with_warning(m_window_translations); if(m_window_translations) { m_pFrame->add_view(m_window_translations); m_window_translations->set_transient_for(*this); m_window_translations->set_document(static_cast(m_pDocument)); m_window_translations->load_from_document(); m_window_translations->show(); m_window_translations->signal_hide().connect(sigc::mem_fun(*this, &AppWindow::on_window_translations_hide)); } } else { m_window_translations->show(); m_window_translations->load_from_document(); } } void AppWindow::on_menu_developer_active_platform_normal() { Document* document = dynamic_cast(get_document()); if(document) document->set_active_layout_platform(""); m_pFrame->show_table_refresh(); } void AppWindow::on_menu_developer_active_platform_maemo() { Document* document = dynamic_cast(get_document()); if(document) document->set_active_layout_platform("maemo"); m_pFrame->show_table_refresh(); } void AppWindow::on_menu_developer_export_backup() { Document* document = dynamic_cast(get_document()); if(!document) return; // Ask the user to choose a new directory name. // Start with a name based on the existing name. const Glib::ustring fileuri_old = document->get_file_uri(); const Glib::RefPtr file_old = Gio::File::create_for_uri( Utils::get_file_uri_without_extension(fileuri_old) ); const std::string old_basename = file_old->get_basename(); Glib::TimeVal timeval; timeval.assign_current_time(); std::string starting_name = old_basename + "-backup-" + timeval.as_iso8601(); //Replace : because that confuses (makes it fail) tar (and file-roller) when opening the file, //and --force-local is not relevant to opening files. starting_name = Utils::string_replace(starting_name, ":", "-"); // This actually creates the directory: Gtk::FileChooserDialog dialog(*this, _("Save Backup"), Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); dialog.set_local_only(); //Because pg_dump, pg_restore and tar can't use URIs. dialog.set_current_name(starting_name); const int result = dialog.run(); dialog.hide(); if(result != Gtk::RESPONSE_ACCEPT) return; //Get the path to the directory in which the .glom and data files will be created. //The .tar.gz will then be created next to it: const std::string& path_dir = dialog.get_filename(); if(path_dir.empty()) return; ShowProgressMessage progress_message(_("Exporting backup")); const Glib::ustring tarball_uri = document->save_backup_file( Glib::filename_to_uri(path_dir), sigc::mem_fun(*this, &AppWindow::on_connection_save_backup_progress)); if(tarball_uri.empty()) ui_warning(_("Export Backup failed."), _("There was an error while exporting the backup.")); //TODO: Offer to show the tarball file in the file manager? } void AppWindow::on_menu_developer_restore_backup() { Gtk::FileChooserDialog file_dlg(_("Choose a backup file"), Gtk::FILE_CHOOSER_ACTION_OPEN); file_dlg.set_transient_for(*this); file_dlg.set_local_only(); //Because we can't untar remote files. Glib::RefPtr filter = Gtk::FileFilter::create(); filter->set_name(_(".tar.gz Backup files")); filter->add_pattern("*.tar.gz"); filter->add_pattern("*.tgz"); file_dlg.add_filter(filter); file_dlg.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); file_dlg.add_button(_("Restore"), Gtk::RESPONSE_OK); const int result = file_dlg.run(); file_dlg.hide(); if(result != Gtk::RESPONSE_OK) return; const std::string uri_tarball = file_dlg.get_uri(); if(uri_tarball.empty()) return; do_restore_backup(uri_tarball); } void AppWindow::do_print_layout(const Glib::ustring& print_layout_name, bool preview, Gtk::Window* transient_for) { m_pFrame->do_print_layout(print_layout_name, preview, transient_for); } bool AppWindow::do_restore_backup(const Glib::ustring& backup_uri) { Document* document = dynamic_cast(get_document()); if(!document) return false; ShowProgressMessage progress_message(_("Restoring backup")); const Glib::ustring restored_file = Glom::Document::restore_backup_file( backup_uri, sigc::mem_fun(*this, &AppWindow::on_connection_convert_backup_progress)); if(restored_file.empty()) { ui_warning(_("Restore Backup failed."), _("There was an error while restoring the backup.")); return false; } open_document(restored_file); return true; } void AppWindow::on_menu_developer_enable_layout_drag_and_drop() { m_pFrame->set_enable_layout_drag_and_drop(m_action_enable_layout_drag_and_drop->get_active()); } void AppWindow::on_window_translations_hide() { if(m_window_translations) { m_pFrame->on_developer_dialog_hide(); } } #endif // !GLOM_ENABLE_CLIENT_ONLY AppWindow* AppWindow::get_appwindow() { return global_appwindow; } void AppWindow::document_history_add(const Glib::ustring& file_uri) { // We override this so we can prevent example files from being saved in the recently-used list: bool prevent = false; if(!file_uri.empty()) { prevent = (file_uri == m_example_uri); if(prevent) return; } GlomBakery::AppWindow_WithDoc_Gtk::document_history_add(file_uri); } #ifndef GLOM_ENABLE_CLIENT_ONLY void AppWindow::do_menu_developer_fields(Gtk::Window& parent, const Glib::ustring table_name) { m_pFrame->do_menu_developer_fields(parent, table_name); } void AppWindow::do_menu_developer_relationships(Gtk::Window& parent, const Glib::ustring table_name) { m_pFrame->do_menu_developer_relationships(parent, table_name); } Document* AppWindow::on_connection_pool_get_document() { return dynamic_cast(get_document()); } #endif //GLOM_ENABLE_CLIENT_ONLY //overridden to show the current table name in the window's title: void AppWindow::update_window_title() { //Set application's main window title: Document* document = dynamic_cast(get_document()); if(!document) return; if(!m_pFrame) return; //Show the table title: const Glib::ustring table_name = m_pFrame->get_shown_table_name(); Glib::ustring table_label = document->get_table_title(table_name, AppWindow::get_current_locale()); if(!table_label.empty()) { #ifndef GLOM_ENABLE_CLIENT_ONLY if(document->get_userlevel() == AppState::USERLEVEL_DEVELOPER) table_label += " (" + table_name + ")"; //Show the table name as well, if in developer mode. #endif // GLOM_ENABLE_CLIENT_ONLY } else //Use the table name if there is no table title. table_label = table_name; Glib::ustring strTitle = document->get_name(); if(!table_label.empty()) strTitle += ": " + table_label; #ifndef GLOM_ENABLE_CLIENT_ONLY //Indicate unsaved changes: if(document->get_modified()) strTitle += " *"; //Indicate read-only files: if(document->get_read_only()) strTitle += _(" (read-only)"); #endif //GLOM_ENABLE_CLIENT_ONLY strTitle += " - " + m_strAppName; set_title(strTitle); } void AppWindow::show_table_details(const Glib::ustring& table_name, const Gnome::Gda::Value& primary_key_value) { if(!m_pFrame) return; m_pFrame->show_table(table_name, primary_key_value); } void AppWindow::show_table_list(const Glib::ustring& table_name) { if(!m_pFrame) return; m_pFrame->show_table(table_name); } void AppWindow::print_report(const Glib::ustring& report_name) { if(!m_pFrame) return; m_pFrame->on_menu_report_selected(report_name); } void AppWindow::print_layout() { if(!m_pFrame) return; m_pFrame->on_menu_file_print(); } void AppWindow::start_new_record() { m_pFrame->on_menu_add_record(); } void AppWindow::set_progress_message(const Glib::ustring& message) { const Glib::ustring title = _("Processing"); const std::string collate_key = (title + message).collate_key(); if(collate_key != m_progress_collate_key) { // New progress message. m_progress_collate_key = collate_key; m_infobar_progress->set_message(title, message); m_infobar_progress->show(); } // Pulse the progress bar regardless of whether the message is new or not. m_infobar_progress->pulse(); //Block interaction with the rest of the UI. Gtk::MenuBar* pMenuBar = static_cast(m_refUIManager->get_widget("/Bakery_MainMenu")); if(pMenuBar) pMenuBar->set_sensitive(false); m_pFrame->set_sensitive(false); } void AppWindow::pulse_progress_message() { m_infobar_progress->pulse(); } void AppWindow::clear_progress_message() { m_progress_collate_key.clear(); m_infobar_progress->hide(); Gtk::MenuBar* pMenuBar = static_cast(m_refUIManager->get_widget("/Bakery_MainMenu")); if(pMenuBar) pMenuBar->set_sensitive(); m_pFrame->set_sensitive(); } void AppWindow::set_current_locale(const Glib::ustring& locale) { if(locale.empty()) return; m_current_locale = locale; } void AppWindow::set_original_locale(const Glib::ustring& locale) { if(locale.empty()) return; m_original_locale = locale; } Glib::ustring AppWindow::get_original_locale() { //Default to English: if(m_original_locale.empty()) m_original_locale = "en"; return m_original_locale; } bool AppWindow::get_current_locale_not_original() { if(m_original_locale.empty()) get_original_locale(); if(m_current_locale.empty()) get_current_locale(); return m_original_locale != m_current_locale; } Glib::ustring AppWindow::get_current_locale() { //Return a previously-set current locale, if any: if(!m_current_locale.empty()) return m_current_locale; //Get the user's current locale: const char* cLocale = setlocale(LC_ALL, 0); //Passing NULL means query, instead of set. if(cLocale) { //std::cout << "debug1: " << G_STRFUNC << ": locale=" << cLocale << std::endl; return Utils::locale_simplify(cLocale); //std::cout << "debug2: " << G_STRFUNC << ": m_current_locale=" << m_current_locale << std::endl; } else return "C"; } Glib::ustring item_get_title(const sharedptr& item) { if(!item) return Glib::ustring(); return item->get_title(AppWindow::get_current_locale()); } Glib::ustring item_get_title_or_name(const sharedptr& item) { if(!item) return Glib::ustring(); return item->get_title_or_name(AppWindow::get_current_locale()); } } //namespace Glom glom-1.22.4/glom/test_pyembed.cc0000644000175000017500000000531412234776363017735 0ustar00murraycmurrayc00000000000000#include #include //For g_warning(). #include #include #include std::list ustring_tokenize(const Glib::ustring& msg, const Glib::ustring& separators, int maxParts) { std::list result; Glib::ustring str = msg; bool nocount = false; if(maxParts == -1) nocount = true; int count = 0; while(str.find(separators) != Glib::ustring::npos && (nocount? true : count!=maxParts)) { unsigned int pos = str.find(separators); Glib::ustring tmp = str.substr(0,pos); str=str.erase(0, pos+separators.size()); result.push_back(tmp); count++; } result.push_back(str); return result; } void evaluate_function_implementation(const Glib::ustring& func_impl) { Glib::ustring func_def; typedef std::list type_listStrings; type_listStrings listStrings = ustring_tokenize(func_impl, "\n", -1); for(type_listStrings::const_iterator iter = listStrings.begin(); iter != listStrings.end(); ++iter) { func_def += " " + *iter + '\n'; } //Indent the function implementation (required by python syntax): //prefix the def line: func_def = "def glom_calc_field_value():\n" + func_def; std::cout << func_def << std::endl; Py_Initialize(); //PyDateTime_IMPORT; //A macro, needed to use PyDate_Check(), PyDateTime_Check(), etc. PyObject* pMain = PyImport_AddModule((gchar*)"__main__"); PyObject* pDict = PyModule_GetDict(pMain); //Create the function definition: PyObject* pyValue = PyRun_String(func_def.c_str(), Py_file_input, pDict, pDict); if(pyValue) { Py_DECREF(pyValue); pyValue = 0; } //Call the function: { Glib::ustring call_func = "glom_calc_field_value()"; PyObject* pyValue = PyRun_String(call_func.c_str(), Py_eval_input, pDict, pDict); if(!pyValue) { g_warning("pyValue was null"); PyErr_Print(); } else { PyObject* pyStringObject = PyObject_Str(pyValue); if(pyStringObject) { if(PyString_Check(pyStringObject)) { const char* pchResult = PyString_AsString(pyStringObject); if(pchResult) g_warning("result is %s", pchResult); else g_warning("pchResult is null"); } else g_warning("PyString_Check returned false"); } else g_warning("pyStringObject is null"); Py_DECREF(pyValue); } } Py_FlushLine(); PyErr_Clear(); Py_Finalize(); } int main () { //Glib::ustring func_impl = "import time\nreturn time.clock()"; Glib::ustring func_impl = "count = 0\nfor i in range(0, 100): count += i\nreturn count"; evaluate_function_implementation(func_impl); return EXIT_SUCCESS; } glom-1.22.4/glom/glade_utils.cc0000644000175000017500000000162112234252645017532 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #include #include namespace Glom { namespace Utils { } //namespace Utils } //namespace Glom glom-1.22.4/glom/box_reports.h0000644000175000017500000000372312234252645017453 0ustar00murraycmurrayc00000000000000/* Glom * * Copyright (C) 2001-2004 Murray Cumming * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ #ifndef GLOM_BOX_REPORTS_H #define GLOM_BOX_REPORTS_H #include "box_db_table.h" #include namespace Glom { class Box_Reports : public Box_DB_Table { public: static const char* glade_id; static const bool glade_developer; Box_Reports(BaseObjectType* cobject, const Glib::RefPtr& builder); virtual ~Box_Reports(); private: virtual bool fill_from_database(); //override virtual void fill_row(const Gtk::TreeModel::iterator& iter, const sharedptr& report); #ifndef GLOM_ENABLE_CLIENT_ONLY virtual void save_to_document(); #endif //Signal handlers: virtual void on_adddel_Add(const Gtk::TreeModel::iterator& row); virtual void on_adddel_Delete(const Gtk::TreeModel::iterator& rowStart, const Gtk::TreeModel::iterator& rowEnd); virtual void on_adddel_Edit(const Gtk::TreeModel::iterator& row); virtual void on_adddel_changed(const Gtk::TreeModel::iterator& row, guint column); virtual void on_userlevel_changed(AppState::userlevels userlevel); guint m_colReportName; guint m_colTitle; mutable AddDel_WithButtons m_AddDel; //mutable because its get_ methods aren't const. }; } //namespace Glom #endif // GLOM_BOX_REPORTS_H glom-1.22.4/doc-reference.am0000644000175000017500000002200612234777071017016 0ustar00murraycmurrayc00000000000000## Copyright (c) 2009, 2011 Openismus GmbH ## ## This file is part of mm-common. ## ## mm-common is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published ## by the Free Software Foundation, either version 2 of the License, ## or (at your option) any later version. ## ## mm-common is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with mm-common. If not, see . ## Parameters: book_name ## Overrides: pubdocbase, htmlrefpub, book_title, htmlref_patterns, ## doc_outdir, doc_config, doc_postprocess, doc_install, ## tagfile_to_devhelp2, doxytagfile, devhelpfile ## Files: doc_input ## Output: dist_noinst_DATA, DISTCLEANFILES, MAINTAINERCLEANFILES # The name of the sub-directory where the generated documentation # will be placed. doc_outdir ?= reference # The name of the Doxygen configuration file. doc_config ?= $(doc_outdir)/Doxyfile # The base URL where the online documentation for C++ binding modules # is located, including the trailing slash. pubdocbase ?= http://library.gnome.org/devel/ # The URL of the module's online HTML reference documentation, which # may or may not end in a trailing slash. htmlrefpub ?= $(pubdocbase)$(PACKAGE_TARNAME)/unstable/ # The title of the generated Devhelp book. book_title ?= $(PACKAGE_NAME) Reference Manual # A list of wildcard patterns matching the files from the HTML directory # generated by Doxygen which should be distributed and installed. htmlref_patterns ?= $(addprefix $(doc_outdir)/html/*.,css gif html png js) # Locations of utilities shipped with glibmm. Made overridable # in case the installed utilities cannot be used for some reason. doc_postprocess ?= $(PERL) -- "$(MMDOCTOOLDIR)/doc-postprocess.pl" doc_install ?= $(PERL) -- "$(MMDOCTOOLDIR)/doc-install.pl" tagfile_to_devhelp2 ?= "$(MMDOCTOOLDIR)/tagfile-to-devhelp2.xsl" # Names of the main output files. doxytagfile ?= $(doc_outdir)/$(book_name).tag devhelpfile ?= $(doc_outdir)/$(book_name).devhelp2 # Function: $(call vpath_listall,PATTERN ...) # Get all filenames which match a PATTERN from the list. Look for files # relative to either the current directory or $(srcdir). Strip $(srcdir)/ # again before returning and remove any duplicates. vpath_srclist = $(patsubst $(srcdir)/%,%,$(wildcard $(addprefix $(srcdir)/,$(1)))) vpath_listall = $(sort $(wildcard $(1)) $(if $(srcdir:.=),$(vpath_srclist))) # Installation directories. libdocdir = $(datarootdir)/doc/$(book_name) referencedir = $(libdocdir)/reference htmlrefdir = $(referencedir)/html devhelpdir = $(datadir)/devhelp/books/$(book_name) if ENABLE_DOCUMENTATION doc_inst_targets = install-htmlref install-devhelp doc_inst_files = $(doxytagfile) doc_dist_files = $(devhelpfile) $(call vpath_listall,$(htmlref_patterns)) else doc_inst_targets = doc_inst_files = doc_dist_files = endif if DIST_DOCTOOLS doc_dist_files += $(MMDOCTOOLDIR)/doc-postprocess.pl $(MMDOCTOOLDIR)/doc-install.pl $(MMDOCTOOLDIR)/tagfile-to-devhelp2.xsl $(MMDOCTOOLDIR)/doxygen.css endif dist_reference_DATA = $(strip $(doc_inst_files)) dist_noinst_DATA = $(strip $(doc_dist_files)) DISTCLEANFILES = $(doc_outdir)/doxygen.log MAINTAINERCLEANFILES = $(doxytagfile) $(devhelpfile) $(doc_outdir)/html/* # The generic bit of the doc-install.pl command line. doc_install_cmd = $(doc_install) --verbose --mode=0644 # Transform $(datarootdir) into a URI to match MM_ARG_WITH_TAGFILE_DOC(). datarootdir_esc = $(subst $(subst ,, ),%20,$(subst \,/,$(datarootdir))) docdir_base_uri = file:///$(patsubst /%,%,$(datarootdir_esc:/=))/doc # The command and options used to install the files from the HTML reference # documentation. The $(subst) magic translates external tag references from # absolute to relative paths if the destination is on the local file system # and installed under the same prefix as the package being built. htmlref_relinst = $(subst @$(docdir_base_uri)/,@../../../,$(DOCINSTALL_FLAGS)) htmlref_install = $(doc_install_cmd) $(htmlref_relinst) # The command and options used to install the Devhelp file. devhelp_install = $(doc_install_cmd) --book-base='$(htmlrefdir:/=)' # Helper variables to replicate each pattern with a $(srcdir)/ prefix. # Also add quoting to prevent the shell from expanding the patterns. htmlref_patterns_dup = $(foreach item,$(htmlref_patterns),'$(item)' '$(srcdir)/$(item)') htmlref_patterns_quote = $(patsubst %,'%',$(htmlref_patterns)) htmlref_patterns_vpath = $(if $(srcdir:.=),$(htmlref_patterns_dup),$(htmlref_patterns_quote)) # Expand to a list of -name 'PATTERN' arguments for use with 'find'. htmlref_find_patterns = $(patsubst %,-name '%' -o,$(notdir $(htmlref_patterns))) -false # The parameters to the Doxygen-to-Devhelp XSLT script dh_xsl_params = --stringparam book_title '$(book_title)' \ --stringparam book_name '$(book_name)' \ --stringparam book_base html # Generated configuration files which, when updated, should cause the # reference documentation to be rebuilt. doc_config_deps = $(CONFIG_HEADER) $(srcdir)/$(doc_config).in $(srcdir)/Makefile.in # Regenerate the documentation automatically only in maintainer mode. # Depend on the generated configuration header files to trigger a rebuild # if a configuration value changed. The configuration header files only # have their timestamp modified when the content actually changed, which # is not the case for any other files generated by configure. if MAINTAINER_MODE doc_dependencies = $(doc_config_deps) $(doc_input) else doc_dependencies = endif # Explicitly depend on the files to be distributed or installed. all-local: $(doc_inst_files) $(doc_dist_files) # Hook up custom rules for translating references to external documentation # to the actual location at install time. install-data-local: $(doc_inst_targets) # Hook up corresponding custom uninstall rules. uninstall-local: $(addprefix un,$(doc_inst_targets)) # Install the HTML reference documentation files with just one invocation # of doc-install.pl to speed up the build process. Make use of the --glob # option, which tells it to perform filename globbing itself, like 'find'. # This helps to avoid excessively long command lines, as some platforms # have rather restrictive limits. install-htmlref: $(doc_outdir)/html/index.html @$(NORMAL_INSTALL) $(MKDIR_P) '$(DESTDIR)$(htmlrefdir)' $(htmlref_install) -t '$(DESTDIR)$(htmlrefdir)' --glob -- $(htmlref_patterns_vpath) # Delete files from the html installation directory. Avoid recursive # directory removal, and apply the same wildcard pattern as was used to # select files for installation. uninstall-htmlref: @$(NORMAL_UNINSTALL) (cd '$(DESTDIR)$(htmlrefdir)' 2>/dev/null || exit 0; \ find . -type f '(' $(htmlref_find_patterns) ')' -exec rm -f '{}' '+') -test ! -r '$(DESTDIR)$(htmlrefdir)' || rmdir '$(DESTDIR)$(htmlrefdir)' # Install the Devhelp file, translating the base path on the fly. install-devhelp: $(devhelpfile) @$(NORMAL_INSTALL) $(MKDIR_P) '$(DESTDIR)$(devhelpdir)' $(devhelp_install) -t '$(DESTDIR)$(devhelpdir)' -- $^ # Remove the installed Devhelp file and directory. uninstall-devhelp: @$(NORMAL_UNINSTALL) rm -f '$(DESTDIR)$(devhelpdir)/$(notdir $(devhelpfile))' -test ! -r '$(DESTDIR)$(devhelpdir)' || rmdir '$(DESTDIR)$(devhelpdir)' # Regenerate the Doxygen configuration file automatically. In the # top-level build directory Automake already takes care of this. ifneq ($(subdir),.) $(doc_config): $(srcdir)/$(doc_config).in $(top_builddir)/config.status $(AM_V_GEN)cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ endif # Make sure that the documentation will always have been generated before # executing commands of a rule that depends on files in $(doc_outdir)/html/. $(doc_outdir)/html/%: | $(doxytagfile) # Run Doxygen to build the reference documentation. The generated tag file # also functions as time stamp target for the documentation as a whole. # Quote $(DOXYGEN) so that this still works if this is a path containing # spaces such as "/c/Program Files (x86)/Doxygen/bin/doxygen" # The doc_config file may contain "$(MMDOCTOOLDIR)". Export MMDOCTOOLDIR to Doxygen. $(doxytagfile): $(doc_dependencies) | $(doc_config) -$(AM_V_at)rm -f $@ -$(AM_V_at)rm -fr $(doc_outdir)/html $(AM_V_GEN)(echo '@INCLUDE =' $(doc_config) && echo 'INPUT =' $(doc_input)) | MMDOCTOOLDIR="$(MMDOCTOOLDIR)" "$(DOXYGEN)" - $(AM_V_at)$(doc_postprocess) '$(doc_outdir)/html/*.html' # Run XSL transformation to generate a Devhelp book from a Doxygen tag file. %.devhelp2: %.tag $(AM_V_GEN)$(XSLTPROC) $(dh_xsl_params) -o $@ $(tagfile_to_devhelp2) $< .PHONY: install-htmlref uninstall-htmlref install-devhelp uninstall-devhelp # Instruct GNU make to delete the targets of a rule after it failed, in # order to avoid the complication of handling that situation manually. .DELETE_ON_ERROR: glom-1.22.4/config.h.in0000644000175000017500000000710112234777114016016 0ustar00murraycmurrayc00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define to the file extension of executables on the target. */ #undef EXEEXT /* Define to the gettext package name. */ #undef GETTEXT_PACKAGE /* Define to the Glom ABI version string. */ #undef GLOM_ABI_VERSION /* Define to the Glom ABI version with '.' replaced by '_'. */ #undef GLOM_ABI_VERSION_UNDERLINED /* Define to disable support for self-hosting and developer mode. */ #undef GLOM_ENABLE_CLIENT_ONLY /* Whether to enable support for PostgreSQL databases. */ #undef GLOM_ENABLE_POSTGRESQL /* Whether to enable support for SQLite databases. */ #undef GLOM_ENABLE_SQLITE /* Define to the location of the msgfmt gettext utility. */ #undef GLOM_MSGFMT /* define if the Boost::Python headers and library are available */ #undef HAVE_BOOST_PYTHON /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define if libgettextpo provides the new po_xerror_handler struct. */ #undef HAVE_GETTEXTPO_XERROR /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strptime' function. */ #undef HAVE_STRPTIME /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the installation prefix of the iso-codes module. */ #undef ISO_CODES_PREFIX /* Major version number of libglom. */ #undef LIBGLOM_MAJOR_VERSION /* Micro version number of libglom. */ #undef LIBGLOM_MICRO_VERSION /* Minor version number of libglom. */ #undef LIBGLOM_MINOR_VERSION /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to the location of the PostgreSQL utilities. */ #undef POSTGRES_UTILS_PATH /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS glom-1.22.4/intltool-extract.in0000644000175000017500000000000012234777073017632 0ustar00murraycmurrayc00000000000000glom-1.22.4/examples/0000755000175000017500000000000012235000126015571 5ustar00murraycmurrayc00000000000000glom-1.22.4/examples/example_film_manager.glom0000644000175000017500000120040412234776363022634 0ustar00murraycmurrayc00000000000000
        0 BMW E60 1 BMW Z4 2 Mercedes M111
        1 Bar Owner 5 FALSE 2 Mysterious McEvil 4 FALSE 3 Sherif Heavypants Would rather have late-night talk show. 6 FALSE 0 Hero Protagonist 3 TRUE
        0 Openismus GmbH Creators of Glom Software Development 1 Wombles Catering Ltd 2 Scooby Snack Catering Ltd 3 Management International Agents and Managers 4 Talent Schmalent Agents and Managers 5
        0 Murray Cumming Munich Bavaria Germany 80400 Murray Cumming 0 Falschstrasse 123 1 Jerry Maguire Jerry Maguire 3 2 Johnny McAgent Johnny McAgent 4 3 Andrew O'Actor Andrew O'Actor 4 Sharon Von Schauspieler Sharon Von Schauspieler 5 Mook Mookity Mook Mookity 6 Rupert Pupkin Rupert Pupkin 7 Cal McCamera Cal McCamera 2 8 Sol McSound Sol McSound 2 return record["name_first"] + " " + record["name_last"] [Page Setup] PPDName=Letter DisplayName=US Letter Width=215.89999389648438 Height=279.39999389648438 MarginTop=6.3499999999999996 MarginBottom=14.224 MarginLeft=6.3499999999999996 MarginRight=6.3499999999999996 Orientation=portrait
        0 Spangled Leather Poncho 1 Black Hat 2 Denim Dungarees 3 Yellow Shirt
        0 Main Camera Man 1 7 1 Chief Sound Man 0 8
        0 Sound 1 Camera 2 Set Design 3 Lighting 4 Makeup 5 Costume 6 Stunts 7 Effects
        0 Smoke Machine 1 Jump Rig 2 Cardboard Boxes
        0 Andrew from the Airport 2009-12-10 09:30:00 Main Street, Munich 2009-12-10 08:00:00 Munich Airport 3
        0 Main Street Spielzeugstrasse 1 Toy Town Bavaria Germany 1 Tavern Keg Strasse 1 Munich Bavaria Germany
        0 Gatling Gun 1 Safety Glass Whiskey Bottle 2 Ceramic Flower Pot
        0 0 0 2 2 0 1 3 0 3 1 1 4 0 1 5 2 1 0 1 1 0 0 2 0 1 3 0 3 0 1 0 0 0 1 2 0 2 1 1 0 0 0 1 0 1 2 0 2 0 0 2009-12-10 3 Day Exterior Mexican Standoff Mexican Standoff 4 21 1 1 2009-12-11 Night Interior Tavern 3 if(record["name"]): return record["name"] else: return record.related["location"]["name"]
        glom-1.22.4/examples/example_lesson_planner.glom0000644000175000017500000157430512234776363023253 0ustar00murraycmurrayc00000000000000 0 abc 1 2 Sprocket 1 2.99 1 1 2.99 16 0.4784 3 Widget 2 3.5 0 22 77 16 12.32 1 Brezl 0 0.99 1 1 0.99 16 0.1584 4 Brezl 0 0.99 0 1 0.99 16 0.1584 5 Brezl 0 0.99 1 1 0.99 16 0.1584 return record["count"] * record["product_price"]; return record["total_price"] * (record["vat_percentage"] / 100); 0 0 1 2008-04-22 10:00:00 2 3 1 1 1 2008-04-24 09:00:00 1 4 2 4 0 2008-04-25 12:00:00 1 0 3 5 0 2008-04-28 11:00:00 2
        0 Physics Lab 1 Science Block 1 Chemistry Lab 1 0 Science Block 2 Chemistry Lab 2 1 Science Block 3 0 Main Building 4 1 Main Building
        1 English 2 German 3 French 4 Physics 5 Chemistry 6 Biology 7 History 8 Geology 9 Sport 10 Woodwork 11 Music 0 Maths
        3 Bob McBob Mr Germany Bob McBob 4 Yadda McYadda Mr Italy Yadda McYadda 5 Jane Doe UK Jane Doe 6 Jo JoJo USA Jo JoJo 7 Aardvark Example UK Possibly a made-up name. Aardvark Example 123 0 Murray Cumming Mr Falschstrasse 123 Munich Bavaria Germany D-80798 1973-05-11 Murray Cumming \\211PNG\\015\012\\032\012\\000\\000\\000\\015IHDR\\000\\000\\000\\360\\000\\000\\001@\\010\\002\\000\\000\\000\\015\\212f\\004\\000\\000\\000\\003sBIT\\010\\010\\010\\333\\341O\\340\\000\\000 \\000IDATx\\234\\304\\275\\333\\256$Ir ff\\356\\036\\021y=\\227:\\247\\352TuW\\367ts\\206=\\034.\\207\\344R\042H\\002\\242\\010\\351\\201+a\\005\\001\\202\\004A\\300J\\330\\027}\\201V\\372\\017\\351\\013\\364&\\010\\320\\003\\337EA\\334%\\227\\344\\354\\222\\273\\340r8\\354\\231\\236\\276Lw]\\3175O^\042\\343\\342n\\246\\207\\210\\214\\214\\214[F\\236jI\\336\\247\\2632-\\334\\315\\315\\335\\315\\315\\315\\315\\315-\\360\\037\\375\\367\\377\\033\\000`-e\\300\\342\\321\\366\\247\\242\\362#\\330$\\245\\024\\224R\\371Q#\\220\\210\\2723\\364\\306\\223\\177\\027\\221\\266<{\\221\\264\\321SF[\\311_\\374\\254\\364U\\231\\214r\\021f\\256\\344\\354\\316\\277\\227\\236\\376Mk\\243\\277N\\017\\000\\000rc\\275m\\364T\\2207V\\275\\233S\\232\\200\\255\\245*\\355-\\200\\025\\270l\\222.\\010-X\\271\\014)\\303sH\\215\\364n.\\354`\\254\\236\\375\\2767O\\031\\270w\\274{\\316\\231\\372\\323\\275CU\\251\\275\\317\\204\\021\\221>\\355\\355\\310P\\374l\\233xm\\220\\326>l!\\240\\215\\260r\\023\\372\\365\\325\\376\\011\\331\\226\\241\\334\\306z\\3033\\270.OP\042*\\263oQrg\\02271\\350\\203\\231\\373a\\014\\267\\013i\\356\\240C%t[j\\2433\\353\\307\\275\\324V\\350)\\367~\\366\\275\\302\\350\\017f\\350\\356lm\\300\\306E\\243\\203\\376\\275\\204\\355\\315\\237u\\300\\241b\\245\\255\\267a\\263\\312\\025k\\235n\\224\\307\\225\\237}\\030zoG\\037\\232\\341\\301x\\372g\\333\\313\\364\\337\012\\236\\236\\353UOz\\372\\224=\\210\\324\\332g\\203\\244\\357 \\346@\\361|\\330\\212\\327\\221\\255\\2622\\024\\222BC\\241\\203f\\017\\020 \\343[\\312\\331W\\000\\000\\001\\021\\245\\306\\270\\3659\\335Aee\\222\\325\\347\\\\\\343,\\254/\\312\\207\\212\\306n`\\317n\\255g\\356\\256\\256Q\\242W\\306\\262Qf\\367\\220p\\015:eG\\275}\\246M\\333*\\324MI7\\266\\216\\022=1Wp\\366l\\270\\256\\020T\\225\\3075`\\237\\006\\364\\351\\232\\007K\\350:\\260QH\\364\\344\\373\\016j\\273\\363\\324u\\342J\\215\\035\\235\\320\\306\\320\\017\\240\\344\\335\\273q\\347\\223v\\330\\246\\215\\3166\\344\\337\012\\375}(\\207\\226\\355\\307\\316\\246\\260\\200V\\332\\331\\310\\342\\365/}\\030h\\257,\\177\\300\\360\\024_\\333\\210<\\010sc]\\215e\\333V\\222C\\353\\335\\333'\\325\\342T\\231\\000u>k\\034\\210f`\\206\\241\\364\\231\\345a\\000\\300\\315\\376\\260XS\\233\\351\\3012\\362*\\223\\265\\266\\342@!Xg\\337\\212\\252\\\\\\344\\251J\\350\\362g#O\\327w\\323\\035\\023\\264Q\\242w\\267\\341\\360<\\333\\241j\\224(\\357\042\\303\\240\\335\\274X\\356\\307>8\\013<\\005a\\215\\005{\\010\\370f\\374\\335\\222\\376\\020A\\2705/6N\\346\\216\\342\\207N\\316C\\263\\325\\333X\\257\\261kSX\\347\\022(\\331}+\\004\\021Qc}m:\042\\264*\\315\\315\\343\\324(\\377\\240\\335J\\320m7\\255\\347oc\\202\\306\\211Q\\267\\2036\\016L\\271\\275{U\\213n\\021U\\306\\332A\\355\\303\\360\\267\\361n\\271\\231{'vGz\\000\\2437j8u\\306\\250gk\\220\\320\\035\\204\\342\\356\\032\\267W\\372v\\364{;'u\\251(\\335\\335qh\\347v\\024\\351\\036\\203>\\355\\352\\300\\177\\350\\322\\264\\363\\350\\241\\375P\\023\\034\\275\\026\\226>\\360\\275\\231\\0370.\\017\\316\\257\\031\\26792;\\006\\344_v\\200\\305'\\311\\001\\343\\321\\221\\363a\\014\\335\\224\\277\\257\\336\\326R|\\217\\212\\32260}\\276\\177[\\220:C7\\026\\351\\300\\326\\235\\2771[\\377\\001\\335KC\\343\\222\\333\\223\\274C\\363\\267Z9`\\267\\015\\305g\\031M\\275\\315\\335\\266\\225\\306\042\\3753\\274c\\346nz\\276\\025\\311\\335\\235\\277OE\\017\\346\\376\\216=CO$u\\370\\241\\023u/\\302\\203Ju\\254!\\035\\360\\006\\206\\206\\3320\\327?\\333\\252\\337\\233\\352jt\\177q\\322h\\272\\256\\350\\364\\035\\305\\373\\320S/{\\320@\\326\\037\\365\\267\\243\\267\\001\\373`\\250\\037@\\326\\213\\364i&\042\\002\\310\\306\\312\\201\\345\\325O\\204\\241Z)@\\327^E\\312\\331J\\005{\\355mz\\262S=5[9ps\\234\\010unn\\331\\334\\364\\344\\351\\007\\013\\2446\\326o+\\373\\355J\\350nl\\357\\276\\372\\037\\204\\341\\240~\\350\\206\\324\\206\\214\\353{\\244Cedw\\316oKB\\267%]G\\324&\\225\\037\\260\\372wdk\\343\\244\\356\\023\\304o\\267s\\273)\\254\\377\\354/V\\373\\027):\\274\\222\\241U\\205@,,k\\355\\225\\326auq\\300\\2739\\245\\314\\342u!rh\\333\\017e\\342\\275KJ\\317\\252uY\\030\\227s\\267\\231\\245\\3328\\340\\333c\\350\\346\\366\\264#\\2546\\351\\240\\216(-\\251\\207il\\335#\\335ML\\031\\330\\307\\215v\\373\\023\\031\\000\\263Y\\360.\\225\\026?\\233\\026U\\312x\\275\\247'`\\237\\036\\333\\315\\363\\256\042\\251;\\177\\307Ia\\245\\244l\\2634\042\\025\\241\\372\\250\\357\\024k\\246\\240\\322q\\245z+\\015\\200]2\\366\\010\\327\\236\\254\\331_B\\367U\\036\\250\\302\042\\215\\276>\\345\\307\\256\\236!\\363\\237\\201\\206\\316\\317 ;\\256\\347M\\370\\3673G\\331\\023\\263\\004fD\\254\\034\\267m\\230\\242\\255?\\233\\005\\0373W \\365\\266\\354\\322\\323\\354\\207\\335\\236\\232\\307E\\327\\307\\257{\\214i\\237Y\\255\\002i\\313\\363m-\\345\\007\\341\\354\\250b/\\375\\275\\3519\\240\\322\\007@\\366\\266\\253\\217X\\205\\2265\\035Qe\\342\\371a\\251\\261?\\313\\335X_\\371\\213\\324\\363BC\\033\\376\042\\035\\314\\320\\330\\303[\\352P&~\\360\\022Y\\241\\266\\377\\262\\325\\221\\263\\247\\204\\356\\357\\374\\324\\237\\200\\207\\361z7\\376C'v\\031X\\264\\261s\\222t\\365\\303\\203\\347\\341\\026\\373\\241\\014\\275\\027iu 7\\262\\276\\347\\332\\275W\\3458H<w\\260\\357\\3038\\351[a\\254\\372\\000?\\014\\347A\\300\\207\\341o{Z\\372\\271U0\\372-\\024\\207\\365g\\177\\241\\323'\\177\\375\\351\\016C7.C\\015v\\320\\015\\274\\021c\\001\\251\\352\\222-\\373\\326\\203\\354\\246\\035\\026\\217\\236\\336\\233mO\\273\\031\\275{\\207\\324\\207\\241{\\326\\333\\023\\322\\037\\377\\241\\224\\224\\315\\306Y\\253\\263\\324\\356\\317\\275\\277\\336C]d\\273\\351\\254`~W\\011\\335\\366\\250\\275\\203\\272N\\260\\272\\313\\036D\\314^z\\272\\363t\\323\\177\\000\\333\\355\\253\\367\\035\\327\\204C\\227\\340\\007\\\\\\010hDU\\347\\346\\015\\244\\271\\017\\017=\\262>\\224\\321\\333\\306e\\277\\016]\\375\\371P\\035\\272\\267\\204k\\251\\267iz<L\\353\\350\\316Y\\305\\231[-j\\313\\013Vw\\361m\\332d3\\332\\207\\352\\033\\357\\202\\277-\\303.#n\\201e\\035\\272\\2626\\356\\255.\\333\\344\\365?\\360k#\\370\\377\\377MaO\\306=\\224\\241\\013`\\343\\021fG\\221>\\230\\033\\247G%\\363\\336!\\354@\\322\\223\\200C!}\\360\\367_\\323\\032\\341{\\213K\\223\\263Z#\\027u\\247C\\363\\267\\025\\324\\207:\\265\\224S\\343IR\\245H\\317x\\016uH\\333\\322\\331($\\312\\363\\270\\373\\036\\365\\241\\364@\\323\\255rl?x\\332\\253b\\265M\\214C9\\357\\035\\327\\356\\366\\211\\272\\225\\254\\305\\252(\042\\345~+\\236V\\340\\345\\224\\331\\241\\353\\304\\224\\343\\267\\324]Pz\\322\\334\\221\\241\\325\\037\\272\\015\\027\\266\\354j{\\016L\\007\\225\\335\\273\\272\\275\\253^[\\331\\203\\006\\270\\236YjO\\273E\\365\\003\\244ccC\\016ug\\355\\300\\337?\\003\042\\302\\276\\361-~nzc\\007\\303\\336\\013\\001\\225\\237}\\266X\\215\\305\\333\\004\\212.fa\\237\\321\\002\\000\\331\\365n\\223\042O\\221\\263\\202\\241e\\342\\265)\\014}&\\025\\3542t\\231\\370w\\327Cj\\371w\\340{\\311k\\253\\372]\\374\\255\\337\\005\\177[\\352Yo\\007CC\\336\\341[`\\207\\357G\\035\\336\\323\\367\\250\\273\\275\\365\\342]w\012\\333\\032\\331V_c\\316\\275e{\\216J1\\361\\352E\\372\\223\\327\\207\\236\\032\\244\\327\\004\\333\\213\\355P\\006:\\324;\\347\\3209\\334^\\274\\257\\211\\255\\261Cz\\016w\\037\\337\\311\\236\\004W\\340\\333\\310I\\265\\005\\275\\213\\364\042\\365\\364on\\244\\257qM\\350\\306\\203Mg\\247\\215\\036\\303\\017\\350\\270\\346\\331B{\\030\\245\\015\\177\\315G\\245\\327xt\\344|\\030\\376\\266\\324.2Z\\253\\350 \\240NI\\267\\355\\271\\217\\254-?\\255gkk{\\325\\312\\001\\2733\\251\\016o\\323]\\372\\220\\336VK\\235\\371:j\\357F\\270\\027x\\220\\204\\336K\\177\\375{\\037\\325\\242\\033\\303\\377\\033\\370\\333\\322\\2412\\270\\355i]e\\355\\311Wm\\272n9Cc\\215m\\315\\257\\352\\320\\335tw\\374\\354hI\\007\\332\\3762\\246\\262\\222\\024\\220\\362iV7a\\207\\322\\263\\201C\\243\\277Ne\\\\Je\\367\\324\\333\\321\\314\\203\\330\\353\\240\\211\\335\\235m\\267H3\\274^\\373\\006\\262\\377\\000\\245\\361\\373;\\352\\320m\\220\\255?te*\\364\\234\\361\\373\\031\\272\\207e\\275\\316\\246u<\\2250\\011e:\\353\\014\\275\\3273\\275\\255!\\325\\314\\310\\210\\004\\3207\\016U\\307\\367nJ\\372\\263\\362\\241\\370\\021\\021\\2007^\\316\\345O\\004\\340\\215{\\3356OO\\271Pt8\\363\\326\\204\\327H[\\376\\005\\031\\244jN=\\364H\\274O\\0076\\330\\241\\273W\\215B.V\\036\\225u\\2352sH\\213\\016\\272\\021z\\033\\327_\\3143P\\323\\2353D,:n\\227*QJ\\001rV\\3256?@\\341\\247\\333\\335Q\\0056\\242\\314\\340\\272=\\377CD\\314ccaNc\\017\\235\\344P\\211\\322\\007g\\031\042\\342J?wF\\241|\\310W.\\272\\351\\354\\235OD\\204\\374\\372 \\213Hq\\371\\252\\217 (?\\322J\\025\\220\\015\\234\\013:3\\252\\020\\263\\233{\\002\\000\\202P\\312_\\306\\331R\\327\\316\\257\\006\\261R\\351\\212\\255\\312Q~\\334$\\240\\017\\0200\\345\\346\\365\\226\042\\233G\\322\\360\\250\\003\\017\0426\\223\\333\\302\\026\\017>H:\\210;\\333\\036\\355\\225C{k\\331\\333\\237\\265\\014\\331\\204\\254~\\266\\3003\\004\\315\\202\\254q\\205\\314\\234\\002v[W\\277\\003\\225M\\225\\274L\\007\\361\\007\\245F:u\\375Yw\\037\\325\\027\\227z\\221\\322\\2548\\234\\011:\\275\\267\\232\\213\\357\\343\\225\\236\\255+\\346\\366\\303&d\\317\\357\\025\\014\\207:?\\265y\\267\\265\\317\\245\\303t\\\\\\221\\326\\276\\252\\024\\251\\214rw'o\\201\\375\\326\\250\\203\\322\\316\\212\\321.KZ\\213\\325\\345\\\\\\333\\234\\356\\250\\270\\216\\263\\355K\\375\\347\\316#l\\2701\\332\\001\\331k\\310+\\037q\\365\\227\\342\\007\\223}\\340\\323\\275E\\332\\353=\\214]\\016\\235\\300\\375Q\\301f]8\\010IO\\344\\305\\317\\035\\225c\\227;{-\\315E\\221>g\\361}\\254\\302ea\\261;`\\215y0\\3635\\250\\320\\331\\350c\\320s\\355\\3569\\204\\355\\202\\240\\271x\\346\\021Q\\247\\263\\257`+\\001\\272\\363\\357\\245s_\\325\\275\\332U\\022XR\\030\\025\\016Z\\251\\372\\020\\331\\221\\332\\372\\277z\\353\\273{T\\352\\217\\212\\2065\\356X\\261}'\\333&\\222\\367\\372\\212T\\036Igw\\034$\\024\\353\\015\\334k-i\\253\\372\\001\\242\\275w\\2366U\\244\\257}\\272\\015\\377\\006\\317\\376R;}\\262O\\216!bY\\355iT\\261\\036ppX\\241\\244H\\272\\016\\355\\271\\366\\301\\256\\376T6\\253\\225\\341mx\\332\\030\\272[\\207n\\303y\\350j\\336\\221\\263\\370YX\\270;jo\\302\\220\\373O\\327\\036I\\203S5@)L\\021\\264\\024\\204\\262\\375\\241\\305\\224\\321!\\211Z9\\256\\334\\363\\215\\022\\272{\\362\\327\\205`\\205\\302\\274z\\221:Qu\\266>\\224\\241\\333\\312\\352F!\\212=\\334\\240:\\204z\\033C\\327K5\\340\\331\\227\\277\\372\\250}I\\351\\2007>\\335\\333\\247\\375\\247z\\033\\362\\275\\030zL\\230\\303\\246nG\\233\\032\\031\\272\\217\\204\\256 \\2514\\255^\\266M\\000?X0\\227k\\257@r\\011\\335b\\221i.S\\206\\024\\252\\241R\\252\\274\\366\\025\\237\\035x*\\010\\363\\342\\273~\\264=W\\322\\272i\\242LF9s\\317\\367#6\\346\\334\\313m\\320\\302@e\\235\\276\\255!=\\207\\366\\320\\270\\327m\\022\\272\\202\\247\\350\\250b\\205\\251\\321S\\351\\311|d\\220v\\002\\221 \\346V\\324*Gm\012R\\313&\\265\\273\\371%\\362\\212u\\240\\331&\\335e\\266kc\\345\\236B\\242\\333u\\256Q\\300g\\335\\261\\267\\212\\235Z\\032\\221\\354[.\\2413\\365c\\334\\346^\\312\\365\\246\\316p\\013\\345\\202\\2072tO\\232K?{\\241\\355X9\\273\\363\\367\\333\\350?\\\\\\265h,U\\2370E\\206V\\225\\243\\015]O\\271\\325\\210\\252\\376\\275\\241\\037)\\177\\345G\\005U9B\\317N\\006\\331\\301\\260w`\\332\\346d\\033\\375m\\300\\366\\201\\337\\343\\242\\320sb\\364\\261\\032uS\\273\\221d\\017)\\325\\25064\\302\\241\\305\\333q7\\363aG\\334\\035\\024\\356\\225M\\325Ma7\\037tT\\326\\315\\326\\335\\370\\373|\\337KC\\245\\340\\241\\313\\313\\241\\007\\034\\035$\\355%\\376\\320Z\\372\\300\\333\\262\\035\\272\\034\\035:\\356\\035\\216\\276\\335H\\272\\311h\\313\\260W\\240<\\344`\\245\\203\\202\\007\\344\\201\\2124ji\\327\\267\\322k\\320\\304\\270\\035\\216\\266{\\221\\267\\034\\232f\\376\\022\\255v\\364\\335G\\231\\256\\337W/\\312\\356\\374\\355M{\\3352\\373\\325\\325K\\320\\300.\\2675\\325\\273\\3776\\315\\241\\014\\335Vv\\313\\320\\265.8Lb\\265\\251\\023=\\275\\004\\373T\\321\\370\\363\\035%\\020\\264\\323\\337\\215\\247\\245]\\231\\347Z\\037\\315\\344\\340\\225\\241\\033\\336\\246S\\036*\\321\\037\\266RAiU\\334+\012\\017M\\215\\254\\334\\366s\\253C\\267O\\257\\303\\324\\200\\362r\\337\\221\\271-nC=\042\\177\\333Z\\323F@\\005\\336\\177\\321x\\230&\\260\\013\\251\\222\\332\\177r~+\\243\\336\\364\\263\\257\\343k\\001i\\004\\35657U\\030zwb<\\\\\\207n\\243\\252m\\342\\355\\230\\355\\372\\310\\252\\266\\366t\\233\\312\\017\\221@\\015\\215\\201\\366\\201\\257\\020P\\207\\367\\254\\272?\\337w\\342o^\\334\\260\\311\\243k/\\235\\215\\251g6\\241<B\\316.u\\\\\\271\\263,(\\231\\2332\0422\\022\\000\\250\\252\\273#\\003\\200`\\321\\275T`(V\\230\\232(\\354\\222\\361\\375W\\036\\024\\020l\\310\\323\\310\\312[\\011\\335\\344\\376\\227\\347i\\251i\\017\\313\\2268\\014\\0002\\373+\\227\\375\\214!\\037\\340\\206\\270\\310\\000\\3005\\374\\033\\303\\334\\316\\265\\221\\242\\224\\332\\004K\\256\\020\\360.\\334\\263\\333\\256\\362\\0007\\036\\357W\\212b\\366\\032\\221\\215!\\034\\262O\042U\\311W\\301\\337g\\232\\001\\200\\003\\301M\\223\\251\\344\\342\\234\\345,\\336i&(\\014\\031\\247\\022\\000\\223\\000 \\323\\266\\033\\2319\\243U\\011\\011\\202r\\200\\002$\042F)v)\\220 b\\352\\234\\326J)\\225Z\\313\\371\\010\\212l\\372\\034\\205\\000\\200H\\362\\241\\224\\014!\\346_Zz\\230\\313\\307\\311\\235[\\247\\315\\323\\274\\007\\013\\017\\324&\\266\\336\\276)E7\\216q\\233D9H\\354u\\317\\305>\\262|\\027\\303;m,\\366\012\\370v\\372[\\343%\\367\\\\\\257\\367\\325\\333\\212\\2551\\277\\022\\024\\022\\022*\\3354\\331V\\252\012\\236\\306\\315\\377\\210\\000\012\\201\\001w\\336\\217\\223\\253|Y\\006\\311F<\\243_\\000Q)\\022\\304l\\3028f\\307\\251R*\\227\\345\\202\\010B\\240@0\\223\\337}\\026\\267\\246\\206\\267\\346\\333.\\0025!]\\241\\277(Q`n\\010\\005V'\\253\\277\042Q\\007\\026=U~Z\\031\\370^\\370\\333\\226\\260\\026g\\235\\016\012;\\340\\335\\217\\372\\324Rni\\307\\025\\243\\275\\014\\335\\246#f|\\210 \\260s\\244'\042\042\\010 \\371\\301\\035o>\\262\\2633A\\205\\234\\273\\311\\000\\000\\200\\3320t\\246r\\020\042*\\314\\353\\025p\\031c \\020\\013 \\000\\010!\\250\\214\\026\\002@\\001\\002\\001t9)5\\367\\222\\236\\222eG\\\\\\265]\\276\\256i\\035\\331\\243\\266\\023\\323\\006\\263]#M{%\\\\;\\220\\2739\\254?\\317\\035\\304\\205}\\010nD\\330\\307\\212\\327\\215\\266\\017U\\007\\345\\334\\371\\016\\260\\321\\313\\262\\216\\335\\341\\217\\302\\017(SJ\\030\\267\\013\\264\\220\\002\\000)^gA$\042$, \\210B\\031\\006\\022f'\\222\\253\\210\\002\\014\\214H\\250I\\243 \\240\\220\\000Jv\\271\\205I\\200\\021P\\010v\\373\\252\\276\\002\\227S\\371d\\267\\255\\311X\\376N9\\375\\025\\344mF\\205\\276\\014]\\302\\325@a-s\\241\\256`\\315\\034[+\\337/nt+\\203\\266\\350\\372\\017^a*H\\332\\262\\264\\365\\317\\303\\374\\310\\272/\\001\\355<\\022\\207 \\322p\\233UAI\\234e\\343\\254\\000P\\030\\000\\262\\015\\237\\000\\001@\\246[\\203\\000\\0003\\346\\2128\\002+D\\0041F@\\034!\042\\212c'\\202D\\204\\231+\\245 \\001\\002fZ@\\246\\332\\010\\022\\301\\356\\266\\347\\301\\355- T\\236\\022\\273\\202\\270qm/\\263u\\225\\241[%\\377n\\352#{J<\\275\\235X\\035^P\\335\\265\\264K\\254^\\314\\332!q\\333$\\312\\006\\322\\365\\316\\221=\\222f_\\245\\000p\\250\\275\\037\\266W\\212\\005\\000\\005\\2012\\025\\240\\222\\271\\220\\205\\300\\202@\\002B\012\\000\\031r\\201*\\271\\316\\222q\\263#f\\024\\001tA\\240\\221-\\200\\0030,i\\352\\000\\011\\2214\\010 *DA$\\200\\\\JS\\256M\\036\\300\\320\\322\\322\\336\\262\\363\\026\\225\\255\\237-\\014]\\271\\224-\\365MaY\\264\\364\\274}\\320HY#\\2442\\264\\035^x\\355\\365V\\260n\\236JYV\\2257\\216m\\356\\004\\365z\\245\\023\\336\\234\\272ep\\367\\342\\273\\013ie\\372f8m\\325\\014\\020\\002B\\020\\020\\244]\\213\\001o\\3602\\202C\\001\\001AA&D@\\314X\\207\\231\\020\\210\\005\\221\\221Sd\\013\\354P\0424\012\\223\\025\\221\\207\\312s,\\342\\004\\011\\011\\220\\031\\200@H!f\\212<\\332\\\\\\003i\\350\\207F\\311U\\317\\2035x\\376\\271y\\210\\210\\202\\322\\354g\\217\\305\\273\\347\\266.\\327\042\\262s\\260R7\\236\\367\\024\\237{3\\227\\237\\366\\267X\\357\042l\\336`\\365\\224\\304{\\205e\\333\\000<,\\034\\360\\2733tk\\251\\255\\375\\222\\000\\001P\\011f\\306\\016\\001\\000\\332\\010\\335\\255\\350\\225\\004\\021%7\\030l_\\275'(\\010N!\\243X\\342\\224]\\014\\234\\242D\\034\\2561\\215H\\373J\\217\\230\\001\\234\042E\\200(\\016X\\014\\2108$a\\005\\004\\016\\200\\000\\014\\355Z\\337\\366r\\016ns\\366b\\350j\\250\\206\\326#\\375\\354\\221\\356^#z\\362(t\\371\\031W\\307\\251{\\230\\313|\\277\\003i\\261C\\267\\351\\320\\335\\255\\350^\\362v\\341\\315\\005\\235sP\\362\\301(\\340\\273\\375P\\030O+\\316\\264\\215\\366\\354^]\\235:!\\255\\020\\321Y\\021\\021\\324H\\002\042\\242\\0249k\\025!)\\024\\347\\024\\221\\210K\\327a\\232.<\\243\\000\\265\\200\\016\\023\\253\\374\\341x4]\\255VA\\0208\\233\\214\\002\\015\042i\\032\\271dn\\223\\350xD\\321\\335\\033\\302\\204\\225\\257\\314Hc\\300Ns\\234*\\303q\\354\\234\\220\\032N\\003\\177\\264\\212\\223\\301h\\022\\307\\2211\012\\2307\\356(\\371BGD\\210U\\001Q\\374$\\265}\\013\012\\3262d\\203\\316\\345p\\262*c\\231\\355\\245L@\\206\\255\\360-\\277\\017W\\240\\376j\\344z\\017V~\\366\\364\\315x\\230\\374\\356^\\307\\273\\011\\353\\0119Tr\\267\\255\\014{/\\207w\\327\\333\\257\\352*\\204\\021\\024*R\\312\\011\0129\\021@`F\\020\\347\\374\\300WD(,6\\265I\\304 \\332\\250\\300\\360r5\\277\\272\\272}\\375\\352\\362\\364\\361\\323_\\376\\376?`\\224pqe\\000<\\221\\324\\205\\034\\023I\\252%\\262\\034\\336\\335\\274\\232\\275\\272\\377\\340\\311@qJ\\344\\024Cl\\243x\\355R\\347\\203Y\\204)\\016\\217\\317\\002-\\276\\247P\\015\\030%\\010\\002D\\004\\233 sv\\203\\241\\340\\274l\\266\\343&eM\\350\\343\\020[_\\331\\352\\332/\\342V\\233\\250\\213\\277V\\206n\\357\\331\\262\\371\\263\\234\\372\\334\\215\\253\\022\\0155I\\\\V\\000v%\\364\\036^\\357\\317\\251m\\300n\\202+\\351P\\277\\360>N?{\\277\\027\\302\\2362\\213\\003Rv\\225S\\000\\222p\\251\\225\\030\\243\\274\\000E\\2518ZE\\367K\\033/\\336\\276\\374\\354\\253/?\\033\\217\\247'\\037>\\231\\275\\371\\271\\037\\014\\317\\216\\317\\256n\\256\\343D\\3314\\001\\222$\\016\\243\\345\\335jy\\177\\177w\\205ny\\242\\246\012R\\245}\\355O@\\0175kg\\243(^-\\327vz4\\364\\324$\\234\\337\\212\\362-*e|k\\355PoOj\\353\\246\\264\\202\\247e\\223\\032\\273\\010*\\343U\\312\\325v3e\\367\\204\\225\\013~\\353e\\266\\333\\315\\363@%\\265\\021X\\347fl\\273\\205\\3366\\330\\007\\276\\331\\266O\\033w\\2777\\347\\257\\277\\242\\241O]{\\251\\352n\\002\\0110Jq\\212\\202\\200 L,\\000\\251\\357\\243\\270T\\342\\220\\011\\224\\330ty}\\365\\352\\345\\374\\356\\315O\\376\\335_<\\177\\357\\342\\351i\\000\\311\\255K\\227\\353\\025Q<\\323\\014\\000\\354\\326k\\253@\\322\\304F\\367ix'\\3512\\360\\334\\354\\346\\2228f@2\\303\\361\\364l0:FQQ\\230\\020\\033\\216\\357\\307\\346lvw\\257\\007\\223`4\\001I\\215\042q\\0166b\\270x\\035\\262R\\212\\231qwW\\226\\217\\370\\316\\3305$\\021\\331\\234\\\\\012l\\254\042\\345\\247\\330 \\357\\260\\310\\337K\\345\\2503\\364A\\313z#\\260\\215q\\033\\007\\270\\223\\241w|-\\352KD\\007\\345\\273\\314Z\\316yX\\364\\202F\\031\\334\\301\\251\\035\\230;\\340\\000\\200$\\036\\0223K\\276\\307wbE\\304\\0220\\262\\363\\010\\000\042\\262\\211\\213\\302\\333\\327\\237}\\363\\331O\\347w\\227vu\\255y\\354\\326\\267\\2637KvB\\244\\347\\306\\017\\303p\\261X\\334\\335\\335\\014<\\377\\344\\364(\\010L\\270^\\336\\317n#-\\326\\303\\241O\\326\\361:\\236\\315\\347\\363\\343\\263'B~\\024\\246\\312\\237\\276\\376\\346\\247\\307'G\\003r\\2017\\322\\344\\346\\213\\345\\364\\364l\\0353\\222\042\042fv\\316\\211\\210R*_7\\262\\211\\207\\230\\011\\357L'i\\023\\321\\025\\325bk\\225\\203\\355\\277\\033\\013]\\271\\227x+a\\011\\340\\001\\007+}\\030\\2721Cw\\236\\216\\371P\\227m\\273\\014\\335\\\\\\313^w\\307\\016\\374\\3359\\333\\322\\036:[\\260\\365\\331\\223l'\\211\\210\\210%q\\210\\331\\346\\211\\031\\254\\022\\326\012\\226\\3677\\344\\351$\\232\\257\\357\\257\\226wW\\257\\277\\371*Y\\\\\\237\\014\\361\\342{\\317\\215J\\311-\\015y\\263\\331\\\\\\241R\\243\\321\\362\\372\\366\\331\\323\\247\\236\\363E\\234$\\363\\331\042\\272\\276\\273\\272\\271\\271\\3614\\036\\217\\374\\223\\243\\211\\347y\\253u<_.\\2424>:>\\017\\274\\000T|\\371\\346\\315\\354\\355\\305\\331\\343\\347\\200q8\\017\\227w\\253\\3210@\\360DT\\261\\245+\\204t\\246F\\303\\256\\326Q\\021X]mnO\\205\\341\\271*;\\020Dd\\217\\016\\015\\275\\271\\360PH\\001\\357\\320\\241\\241$\\263+h\\266h{\\370\\351\\366iW7\\274Kj\\356V\\364.N]{\\253F\\000d\\007bE\\300\\261M\\243u\\234\\254I\\234\\247!\\215\\026\\263y\\370\\362\\313\\317\\276\\376\\362\\323\\325\\354\\332%\\253\\307\\247G\\037}\\374\\361ju\\363K\\037}0\\237\\317\\343u\\364\\311w\\236\\315f\\263\\345\\374\\356\\243g\\247\\367\\367\\227\\236\\304\\3323q\\032\\272$\\364\\224\\234L\\207A\\020\\334\\\\\\275M\\022;\\032\\215H\\243s2\\273\\275F\\304\\323\\363'\\032\\255O\\366\\356\\362\\027\\343a\\260\\274\\342\\304Q\\340\\215\\243\\331M\\254\\307\\254\\002\\255uv\\355?\\223\\315i\\232\\026\\333\\304L`\\327\\327\\336J\\332\\331\\223pI\\013\\247\\254`\\203d\\337\\232\\2377\\347\\246\\270y\\013VC\\374\\340:<\\213%\\334s\\274\\373\\263\\305\\203\\031\\250'\\206\\376K\\377\\241M+\\177\\331;=\\332\\310\\020\\021@FP\\200\\014\\273\\207\\024\\234\\237\\360a\\3465A\\002\\200\\244\\224\\001'.\\211\\323\\365|qw\\275\\274\\277v6\\322$\\353p\\316\\311\\372\\325\\327_\\275}\\365M\\024\\336\\2718\\224d~<V\\200\\351\\354v\\244\\224\\032\\370&M\042\\255p\\020x\\363\\373[vB\\204D\\010(\\236\\347\\011a\\030\\256//\\257\\216\\306GI\\022\\257\\243d<\\031\\022\\361r\\271\\314\\204\\256\\322\\276X\\370\\372\\363\\277\\217V\\313\\233\\273\\345\\361\\351\\305\\367~\\371W\\3467\\013\\031>b5`\\255\\375\\341(\\010\\206Hd\\255\\213]\\252\\310\\020*\\255=e\\024\\241\\226\\315\\276p'\\214A&X\\263S\\237r\\377\\250\\272\\362\\275\\345i\\004\\002\\220\\022g\012H\\276\\223\\312\\016V\\004P\\204\\0312w,d\\004\\004\\024\\000\\336~\\317\\316I\\2053\\023`\\323\\010\\325&\\320\\346\\251\\331\\365\\003.\0126\\251\\004\\231\\003uu\\3103x\\233U\\241\\034\\025\\242\042\\355\\352\\316n\\215\\234\\267\\007\\322\\362\\306\\330\\354\\313\\006\\270\\255\\011\\2537n\\212\\365\\247\\202\\274P\\016\\013{\\252p\\311\\033S@\\030\\304x\\201 \\304\\353H{\\306\\030/JbP&\\215\\223\\241\\302\\305\\362f\\365\\366\\363\\241\\346\\333\\313\\327\\243\\223\\351\\233\\227_\\277|\\363\\352\\365\\3337\\321z\\341+\\234\\216\\007\\203q0[\\314\\236={\\272XFq\\034\\037M\\247\\347\\347\\247\\242\\364\\364\\344\\354\\325\\253WI\\224\\374\\374\\253\\317\\317\\036=~\\361\\372\\325dz\\034%\\361\\361\\361\\023\\255G\\353p\\356\\033\\217Y\\302U\\344\\031\\243\\311x\\332\\267q\\262Z\\205\\263\\2739)\\377\\255\\015\\023\\013\\353\\305\\333x\\3612\\030\\035\\257-\\261\\0320\\231\\243\\323\\363\\321\\321\\351\\364\\364,\\212\\323\\363\\307\\317\\030-;k\\223\\3249\\217L\\000d\\220<R\\000.\\301]K(\\001\\010m\\354\\320\\305\\003\\202\\354\\366$n\\303\\244\\0271\\255\\2138'9\\257#\\242p\\246\\341dvy\\310\\247?`\\346\\037\\273\\375\\314\\217\\235\\262\\010\\2379\\374\\341\\272f/\\235\\362@\\005\\275\\003gE\\007x\\3602\\362\\340&\\367[\\034d\\243Lb~\\375l#\\247\\011\\221\\331\\002\\000\\242\\260M#g-\\273\\304\\322\\321x\\374\\372\\363\\037\\2334\\276z\\365\\225\\017\\311\\352\\376z~\\253~\\361\\342\\325|\\265\\214\\242\\320\\011'\\226\\347\\253Xd\\235\\306\\203\\333\\273\\273\\263G\\217\\214\\366\\255H0\\030/\\303p\\365\\352\\355_\\377\\333\\277\\031\\016\\207\\263\\331Ly\\303p\\235\\204\\321M\\030\\206\\367\\213(Y\\207\\342\042q\\2511\\352\\344\\344D\\241\\002\\301(\\212\\222$\\321\\306K\\242\\020(\\361\\014\\032m\\010%Y\\337\\332t\\025\\014\\216\\206C\\215\\276\\022{\\277\\270^\\212]\\201\\366l\\344\\243\\362\\020\\215F\\217Y\\234%!A\042D\\361PhG\\320\\200\\000\\203\\003T\\031\\343\\346\\336\\261\\010 \\371;@\\213\\274\\205\\013\\270l\\304\\036\\225\\316t\\262\\247\\355\\267\\276;\\306\\251c\\264\\372\\217\\375\\273\\330ewjl\\257\\253n\\314\\356)\\241w\\200\\007\\322\\323\\006l+[^y2\\007\\266B\\306#\0428F\\304a\\340;\\347\\234M\\002\\255\\022\\307\\010\\226]\\022.g\\263\\331\\214\\322\\305\\354\\356\\3129{}w\\037\\332$N\\254\\265V8\\361\\024\\023\\004\\2766\\314\\374\\345W_+e>p\\357{f\\370\\372\\355\\233\\273\\233\\333\\313\\253\\033\\346+\\347\\034)/\\014\\303\\324\\262s.I\\222h\\275:?;q\\342\\2141Zk$\\030\\015Gq\\034\\337\\334\\334L\\306\\3238\\216\\005-\042\\002)\\021\\321\\306WJ\\237\\236\\241\\2656aH\\231T0\\366HR\\200\\027\\353\\305h|4\\030\\216\\203\\341\\021\\252\\201&\\322\\332h_\\021Q\\022ER2u\\024V\\271\\334\\333:\\327B`\\243f\\024\\375\\317\\333\\247YA\\311\\315\\202\\345\\316\\334\\372rt\\313\\222>Lv\\350`\\267M\\000\\350MI\\317*\\336\\221\\3026z\\276=U\\276\\274[\\337>E\\026E`\\305\\211\\260R\\236\\343\\010lj\\274\\001\\002\\317n\\256\\246\\343\\340\\323\\237\\275N\\222\\310\\205\\253\\253\\253+\042\\212\\222\\330fV\\017a\\261\\014\\354\\322\\204\\327\\261SJ\\015'\\307b\\3357/\\336\\304\\011k\\255M0\\020\\204(I\\330\\2727o\\336\\020\\021)3\\032\\21526\\230\\315f\\232\\300\\030\\025E\\221M\\223\\323\\323\\323lK\\227\\246\\251Q\\232\\001\\3438NS\\347\\204\\207\\203\\361p<\\272\\273z3\\236\\034\\015\\247'\\354\\222d\\261\\276\\225\\324\\013\\002O\\254\\203Ti\\361\\207\\001\\000Z\\247\\310\\222#\\261\\240\\025Q\\325\\203n\\333\\021\\000U\\357\\275,\\225\\275\\036Z\\217f\\036h\\207\\356\\317\\372\\025H\\317\\234\\274\\353\\263Q\\323Ak6\\204\\255.\\272\\3071\\2772\\205\\336Q\\3378T\\017i\\177Z\\202\\013\\000\\200\\312\\026Uq\\010$\\234\\270$\\201t\\355\\222\\030D\\224\\017\\316\\331\\365\\362\\316.\\256\\257\\336\\276\\234\\335^\\333\\365\\375j\\265BE\\353$uHLJ)\\003\\200\\302\\3112L\\222\\304\\032\\243\\276y\\361\\332\\323f:\\235\012\\336^__3\\263c\\207\\312\\220\\320*\\214|\\337\\367\\010\\221\\204\\004\\264V\\236AqiF[\\030\\206\\253\\325\\31297\\030\\014\\3428f\\341$\\265\\211\\2636\\345\\314\\027\012I\\006~\\220D\\213\\311x\\020\\220\\000p\\272\\274\\226\\310SvM\\3614\\3064Pb\\206\\307\\312\\010*D+\\214>\\030#@E\\037n\\264\\205b\\307\\307\\200\\270\\321\\233e\\323=\\345]G&e\\270~\\200\\230\\341l\\010\\326\\330=`\\007\\011\\302\\216A}\\350\\360\\327\\236\\266\\\\s\\252+6u\\372\\373\\361\\364\\241\\376\\312\\207A\\032\\023\\002;\\266\\010Z#\\3324\012WkE0\\032\\370\\201\\222\\333\\233K\\227,?\\375\\273\\277Y.\\356\\256\\257/]\\0322\\010\\247)\\202\\022\\006\\353\\234\\023F\\020%\\224\\200M\\322\\024\\343d2\\232\\216F\\243\\305r\\231\\360R\\371\\201!Z\\334\\337\\013\\210\\361=\\007b\\214\\001\\220\\345r\\351\\033O)\\365\\376\\263\\213\\371|6\\030\\014\\216\\217\\217\\357gwQ\\024EQtzz:\\237\\317\\255\\265I\\234\\202\\343\\300\\363,\\363z\\025\\206\\313\\305\\307\\037<\\017\\347w\\276Q\\306\\230\\201? \\002\\200$]^EnE\\022\\221\\3301[5\\026 RJ)\\243R&@\\001P%\\236\\336n\\234\\212\\336)u\\024V\\374{\\001K\\207)%\\0352c\\204\\3467\\311\\366\\031\\203:\\343\\366\\314Y\\206\\324\\037\\251\\302y\\275\\302|\\345\\330B\\033\\036FD\\241\\255D\\337A\\206;~X\\210\\270\\373\\271\\203h\\227\\214J?\\364]\\235\\036\\226\\247l\\355\\311\\354A(\\002\\010\\212\\200D\\020\\\\\\024.n\\256^{\\006\\361\\344\\204\\323\\3457_~:\\273\\275\\372\\305\\227\\237\\255f\\227\\253p\\311i$\\342\\020\\021\\224r\\314ij\\2350\\001\\002\\241\\240B\\201\\300\\363f\\367\\2138\\261\\210H\\212\\3030TJ\\015\\202\\341j\\265\042\\002\\000b\\004O\\251\\365z\\355im<\\265X,\\222$1J\\263uZ\\353 \\010\\322h=\\360\\014\\017\\002\\007BD\\251\\265A0\\260\\302\\313E\\350\\234[,\\347\\236\\322\\201\\257\\3234\\261\\261\\013\\202\\340\\354\\344\\330\\030_k\\303\\010\\332\\256!]q\\354\\245\\226!\\211\\301\\237\\004\\223sF\\024d$*$/Bf\\214+\\372\\247t@.\\2052]\\014\\364V\\253\\336\\364\\344\\366{\\257K\\262{\\037A\\273Y\\255r\\326\\271W\\003\\221\\032+w\\347\\357^\\001\\366zY\\274\\243\\342q\\020\\222>\\2303\\251\\200\\200D\\212PR\\227\\314g\\327/\\177\\361\\271\042\\016\\037\\035\\033\\205_}\\366\\263\\237\\375\\354'\\310\\351\\313_|\\351k\\3414\\011\\303\\345`0\\212lD\\312\\000\\031\\255u\\366\\206\\2728\\211m\\032[a\\266V\\245\\234\\244\\221c\\024\\304\\324\\271\\370~ADa\\224\\244Q\\314\\354\\005\\223qvdm\\224\\216\\3438\\010\\002\\337\\367\\223$a\\346\\341p8\\277\\273\\275\\277\\277_.\\227A\\020 \\013\\002($\\255\\265\\236j\\255i~?\\013\\303\\345\\355\\325e\\024E\\307'\\323\\343\\261\\357\\033\\\\\\257\\357\\217\\316/b\\313\\310k\\344\\265\\2221H\\002\\340k\\005\\0006;~\\001\\314\\202\012\\241\\223\\214O\\266\\375@\\345\\011\\277\\357\\326}\\336aYf\\021\\315\\245x\\314\\335\\237\\2332\\256q\\025\\336}\\177^\\366\\245\\221\\231\\362\\262\\265\\221-\\340\\3246\\360\\215L,\\315a\\361\\363<\\375\\335\\363\\333'L\\303\\323\\002^!\\276\\322\\242&\\302\\332\\202\\3176\\340\\027\\233.\\027\\367\\353p\\376\\362\\305Wb\\327\\036}\\207\\204_\\376\\342\\347i\\264Z\\334]+\\015\\314,\\000\\306\\013Rk\\215\\361\\004\\210\\001\\254\\265\042\\202\\002\\244\\364\\300xF#k\\035[\\307\\202\\213p\\235\\235\\231+@\\227\\306\\004y4\\356\\214\\211\\263C>\\337\\363\\3224=}\\366\\336\\335\\335\\335\\371\\351\\243\\373\\333\\233\\017\\236?\\237\\315f\\316Z\\347\\\\\\232\\306\\313u\\350\\373\\376\\263\\213g\\213\\3712\\014\\303\\357}\\357{Q\\024\\336\\335\\335e/\\244\\274\\273\\273\\273x\\362x::\\263i\\344yA\\224F\\222F\\236r\\241\\213\\300*\\346\\201\\006\\227\\035\\354\\025\\036x\\200\01272ys\\252\\300P\\210\\302\\026\\035m\\303'R\\262{\\002\042\\352C_\\372\\324&c\\352\\314Q\\321\\212\\032s\\326\\321\\356\\225\\304\\265/]\\022\\272\\376s\\257\\357Dw{\\277Ea\\274\\013)Q\\016\\230\\371\\307\\033\\255'\\243\\301\\300\\363\\006\\201\\371\\372\\313/\\242\\305\\315bq\\037\\256\\227\\253\\325\042\\027\\003\\2420\\000\\000 \\000IDATZ\\207\\340,\042\\2028A\\000T\\231R!\\350x\\363\\336[%$\\342P\\262\\013\\000\\222q\\213\\010\\242\\200\\023\\026\\313\\203\\241\\317\\000\\226\\035\\243\\231\\014\\207A\\020\\254\\303\\345h\\340\\017\\207\\201\\210|\\357\\227\\277\\273\\232\\337\\0333\\272\\272\\272\\262\\326\042\\342\\365\\325\\325p4:=:^/WA\\020$Irs{\\375\\366\\355\\333\\247O\\237L\\247\\3230\\014\\215Q\\327\\227o^\\276|\\371\\353\\277\\366\\253i\\232\\372\\203\\321\\300\\242?\\031\\006\\003\\255\\255f\\217\\320\\240\\023\\213b0\\273\\331\\015\\000H\\010\\274\\275\\213\\016\\220\\037\\360m\042\\016m\\024\\261\\266TU\\032u\\233\\014k\\227\\320\\315c\\003-L\\331\\306\\210\\255\\214U\\215]\\262\\325\\2277\\360\\355\\371\\034\\300\\301q9\\366\\316\\234\\356R\\007A\\372\\00039\\224\\257\\267B\\345\\2139\\231\\177\\017\\213=9\\232\\274&\\\\-g\\313\\305l\\271Z\\244i\\312i\\262AB\\002\\202\\250\\230\\023\042\\022d*\\202\\344\\023\\002\\210s\\216r\\267\\005\\311\\334wX\\004@P+c\\214 \\222\\260\\0102\\263R*\\010\\202\\351tJ\\004\\244\\360\\372\\372\\372\\321\\361\\221\\357\\373G\\323\\361\\327_\\177\\2555\\031\\243\\336{v\\361\\371\\227_\\274\\367\\354\\371bvw~v6\\235N\\337\\276}\\373\\243\\177\\365W\042r|2=??\\037M\\216\\220\\324\\347_\\376\\342h2:\\321\\336`0\\236\\214\\002\\023\\030#\\2362~\\252p\\011\\016%\\267D3\\000\\022\012 !r\\356\\364\\306\\333E\\021\\000@:T\\216\\306\\356\\355\\272\\365]psY\\274\\265I\\3316\\225\\240\\262\\275\\353\\370\\262\\371\\331Ln\\245\\336\\376\042\\266-sO\\206n\\243\\347] e\\340f\\225\\311tH\\004P\\210\\214\\240\\002_\\331\\310&I2\\237\\317\\225R\\002\\034\\206\\313(\\\\\\200\\263\\032\\201\\265ff+\\234\\277'3\\333\\027\\002 n\\217\\033\\005\\005\\004\\220\\004\\005\\011\\221\\021E\\204\\3637F(E \\214\\200\\244\\214J\\323\\344\\346f\\245\\220\\216O&\\203\\301`8\\014.\\337\\276y\\362\\344\\311j\\265\\372\\360\\303\\017\\347\\367w\\317\\236=\\373\\352\\253\\257\\316\\316\\316\\346\\363y\\340\\371\\367\\263\\231\\357\\373i\\232\\236\\036\\037\\277}\\3736M\\323\\361x\\034%\\366\\323\\277\\377\\331\\311\\351\\321G\\317\\337\\367}?\\261\\034\\206!\\263x\\376(\\030L\\246\\203\\201\\362\\325\042u\\036@J\\031'\\261\\312/;fkR\\271{\\362\\260cm\\275\\327\\321\\303U;t\\231c\\032u\\211z|\\3426\\225#\\377\\342\\232gX\\033\\003\\355\\006x\\302\\352\\367\\302\\326\\261\\371\042\\273\\273\\316\\026\\356\\351\\252\\275\\222\\347 \\311\\335\\037\\330\\256\\252eou\\317\\227\\036\\310U\\016\\020akm\\232\\246I\\222\\020\\2011*I\\222(\\212\\262\\353\\335\\314\\220\\262K\\035K\\026\\242\\216@\\021\\001\\212\\022&\\001Dt\\010\\231\\246A\\200\\010,\\231\\232\\301\\010\\220\\0372#\0423\\263\\263\\212\\024;g\\223x\\265Z)\\015\\217OO\\2309\\010\\202\\347\\317\\237/\\357g\\227\\227\\227\\313\\305\\375d299\\236:\\347V\\253\\365\\363\\347\\357]_\\337j\\205F\\353\\257\\277\\376\\032\\200/\\236>Nbk\\255}\\372\\376{'\\323\\243\\305j\\2455\\275\\377\\3363\042J\\2228\012g\\236\\347\\215\\011<_\\373\\210\\011\012\\0001 H\\366\\212vt\\210\\002\\234\\353\\304\\271\\331\\271PV\\271\\345\\020\\006\\240\\351\\26694\\276\\326m\\267\\273\\2616\\300\\2559\\353\\025 n\\035\\363+\\302\\265]W\\356\\213?\\207`C\\346\\306\\364\\356\\252H\\177H\\177`\\026\\272%\\267\\\\\\345\\003\\251\\000\\\\\\222\\3308\\216W\\253\\325|>\\013\\357oEDi\\032\\016\\374\\325\\342\\236P3\\240s\042\\014\\250H!!\\242\042\\004`BA\\024\042D\\206<\\202\\242d*\\251\\240\\210c\\021\\021B \042\\021 \\317\\2008f\\326\\236\\011\\006S\\255\\365l6[>:\\2656\\031\\004\\301\\375\\375\\375\\311t\\372\\365\\327_\\023\\312\\333\\267o=\\317\\363<o4\\032i\\255\\237?\\177\\276^\\257\\223$\\321J\\335\\\\^1\\202g\\314x<\\366\\006\\203\\311\\361\\021\\360H\\203\\314\\346\\367g\\307G\\247\\247\\307\\243\\321(\\211\\026\\367I\\354+\\034\\014\\037'\\250\\\\\\346/GHH\\216\\204\\000Y@\\321\\326\\274\\234\\271\\304\\241\\310fv7\\246\\346Qh\\010\\326X\\350\\270\\215B\\272{!\\330\\303\\334\\265A=Hs\\330\\213\\255B\\177c\\206v\\325\\342`I\\374\\355\\360z\\315\\260\\230m\\332\\021\\221\\221\\302(\\272\\271\\271\\371\\346\\213\\237\\205\\213\\353\\345|\\216.!\042BR\\230]\\255&\\310\\356X\\263\\303\\342*\\2070\042\\242B\\021B@\\022V\\010@\\212X\\201\\023f\\306\\354\\346H\\266qTJ+2J\\264\\022\\337\\367\\265\\301\\331l\\366\\344\\311\\371\\315\\315\\315`0\\320\\010\\247''\\341r\\261^\\205\\226$;^q\\316%qh\\214\\371\\364\\323\\237|\\362\\311'G\\323qb\\3238u\\276\\357\\307I\\002\\000gggi\\034\\245q\\222$\\211\\2078\\011\\202\\220\\243u\\022\\271h\\301\\340\\233\\311S\\017\\225\\005\\024@F\\004$\\024\\024\\004(\\355\\376\\260\\370\\257\\343\\244{\\263\\371\\250\\364p\\356y]\\244\\354\\340>\\373\\334\\355\\375<\\332\\003\042n\\356\\321\\344\\273\\267r\\202]V\\333\\233\\312c\\214\\210\\331\\033\\203\\232\\037\\225\\200\\245/UF\\251\\327\\336\\210\\007\\221\\260\\211\\203w[\\307\\000\\214(\\331\\337.\\244\\332\\217\\273\\220m_\\225\\243d4\\364^\\216\\263\\3016\\025\\247)\\000h\\255Q\\231U\\264v J)/\\360\\265\\3622\\317!\\2434\\021(Dfk\\255M\\235\\315T\\024\\313\\3169\\307\\314(\\016\\304iM\\306\\030\\337\\350\\300W\\003_\\005\\036\\371\\212|\\005\\310\\216\\223X\\330y\\212\\330\\272p\\261\\004\\200'\\347\\217\\235K\\027\\363\\373\\321h\\344\\222\\370\\342\\311\\223\\345\\374~2\\231\\034O\\247\\027\\347\\217o.\\257.\\316/\\222u2\\364\\207\\311:Ic\\373\\3157/\\227\\253\\365\\361\\351\\231\\265\\274X,5R\\262\\216\\\\j?\\372\\360\\303\\217?\\376X!\\275y\\363f6\\233\\005\\201w~z\\342i5\\277\\275\\014T\\342\\341\\332@D\\230f!F\\030\\261\\3204Q\\000\\2053f\\025$i\\177\\377F\\333\\370j\\255ui#\\310\\033\\001\\\\\\304\\243(\\316l2\\203\\237\\350m\\344\\236\\214}\\013t\\005f\\331\\201\\250\\0358\042v\\330\\247\\001\\262\\270>{\\324\\342\\302\\366\\27492-\\324\\364\\256\\273\\200\\210\\000@\\371\\036`\\307\\236 %$\\262\\365\\377\\316J5Xc\\032\\375\\2637>\\215\\310E_e\\334_\\372Y\\314\012(>\\263\\373\\244\\000B\\244P)\\316\\3313\\325Z\\317\\357W\\244\\325\\321\\321\\321\\364\\370(Z\\271pq\\253\\2651\\301@D$M\\235KQ\\020\\025\\020\\002\\243 \\002\\022e\\321\\272\\254e\\266)\042\\032R\\011[\\362\\215\\321\\276\\227\\007\\3040\\314\\300i\\342\\210\\330\\245\\236\\361\\002\\215\\214:q&\\211\\3428\\\\\\237\\236\\034\\017}\\317%\\361\\344\\311\\331j\\265\\270\\270\\270\\270\\276\\274\\034\\015\\206Q\\024\\235\\034\\235\\306ar<y\\264\\\\\\256\\\\*G\\203\\223\\333\\253\\373\\225KV\\366\\345\\361\\321\\351\\311\\321d2\\231\\214G\\303\\241\\357\\315n\\357\\314\\311\\221\\347\\017\\236=}\\362\\372\\365ko0\\034h?Mb\\337W\\263W\\237\\246zt\\372\\364\\243\\353\\325R\\374SG(\\030(mD\\004\\2011\\327;D\\362x\\355\\275\\2742\\313\\251\\247sR\\266\\014\\026\\237\\000;\\266\\263\\207\\350\\224\\355y\\232}3\\332\\201u\\007\\374}Ed\\313\\323\\325\\011\\220uh\\311\\027|S\\262\\254\\300T\\247\\\\\\251&\\336\\025\\317\\345\\245\\254\\322\\207\\270\\231\\217\\331\\265\\245\\314:\\014\\314\\342\\234s\\234\042\\312\\355\\355\\365\\333\\027_\\275~\\363r:\\235^\\276\\376*\\013\\341\\225\\011 f6N13\\013\\203\\010\\000\\213\\313\\242|\\221RD\\200\\226\\204\\004\\020\\330\\030\\3179\\267^\\257|\\337\\037\\006\\001\\021\\331$M\\300\\022[\\243\\225\\247\\000\\304\\021\\210\\357\\373\\236\\326\\354\\234!e]\\242IEQ\\204\\300I\\034\\015\\374`2\\231h$f\\230\\014'\\340\\026f\\352]^^\\372\\332W\\312\\014\\214\\271\\235\\335\\277\\370\\346\\225\\037\\230\\367\\036_|\\370\\374\\331\\305\\223'\\301d\\254\\265I\\323d\\265Z\\257\\327\\361:J\\216O\\036\\245i\\272\\\\\\206\\221K\\357\\243k\\345\\007z\\360\\010<tL\\214\\310\\270\\015oN\\300\\233X\\300\\3045\\023D\\307(gi\\257sR\\225]\\312\\0107\\300\\206M\\336\\377g\\220>V\\227\\206R\\324y\\014\\325\\243\\366\\215\\346P\\252=g\\331f]\\274\\365\\314\\022\\031 \\013\\271H\\002\\220\\355\\242\\211 I\\342G\\247'\\363\\353W\\316\\245\\361:\\264I:\\360}q\\2111\\03633\\223\\023\\262\\226Q\\204\\205\\011\\204@\\010I\\023($&0\012Q\\200\\010\\215&\\227\\246\\010\\250\\211\\024\\002;\\013\\316*@@4\\232\\214\\322\\302B\\000Jk\\205\\230$\\211\\265\\3263\\312(=\\237\\335/Fcf\\036\\015\\206J\\251\\301`d\\255\\325Z\\237\\234\\234,\\303X{^b#\\337\\367\\027\\213\\3734M\\225R\\223\\311d2\\231(\\245\\254\\315\\267\\263\\243\\321\\310\\017\\002\\245\\365\\2337o\\2141\\376p`\\214Y\\306\\311\\355\\355\\234\\2067g\\317\\317\\200H\\234\\000\\262\\210\\020\042\\202 l\\314\\010\\2331l;gh\\013\\361Q\\361\\207\\336\\277okz\\324\\265\\235\\352@\\325\\010y\\000\\236\\003ds\\336I\\345ULvt\\247\\235\\374Y\\307\\2661t\\265\\355\\345R{\\011+R~tKH\\010\\220o\\354\\224(MB\\303\\223\\243\\350\\351\\223\\367\\237=\\375\\333\\177\\363\\365\\3007\\310\\011\\002(@\\0044\\244Xi\\024`f\\006TH\\314\\214(\\006\\210P\\024\\002\\223\042@\\245I\\241\\220Q\\2017\\030\\014|\\021I\\326\\221\\265\\326hR\\236\\326\\244\\210(\\013\\265\\225\\007\\374d\\211\\302\\365\\340\\364\\010Q-\\026\\367o\\336\\274\\231N\\247\\201\\347GQ\\344)\\317\\363\\2744M\\037?}:\\377\\352\\233\\321ht\\177\\277\\360<\\357\\342\\342\\002o\\257g\\267w\\367\\267\\367i\\030\\305\\311\\305\\351\\311\\311{\\317\\337G`O\\2334M\\2151\\331\\235\\3318\\216\\243\\330\\0323B\\2264\\216\\001\\330%)\\013\\222\\016,\\013\\252\\354\\335\\000Pc\\350\\375cZNz\\243\\344\\355\\014\\006\042\\346>\\\\Pe\\235n\\006\\255\\373*\\224\\224\\354F\\375\\241\\0169\\364\\235\\330{\\254\\031\\355\\334/\\245\\006nt\\217\\203\\031\\272&\\247\\233\\204B\\023\\331%\\372\\263\\240\\370\\230]\042\\022E \\200\\203\\321\\360\\365\\213\\327\\303\\300\\177tr\\354\\033m\\024E\\353\\304hp6\\021\\021\\004\\3614)T\\314(B\\220\\037+\\346\\301\\370\\201@\\2212\\244<\\243DR@\012\\214\\036\\370FD8Q\\302\\026\\005<\\317\\003v\012a\\340\\373\\210(\\316\\021\\221\\326$\\302.\\345$M\\002\\023\\204\\213\\365\\300\\033F*\\232L&ND)\\022\\332D\\330P\\032\\010\\001q\\261X\\001\\313(\\0308\\326\\354\\354\\375\\375\\375\\345\\345\\345\\321\\321\\344\\364\\344h<\\036\\217'\\023\\007psss}w7\\032\\215F\\343\\351|\\025\\021\\201s)\04223)RZ\\333\\304B\\345\\364\\033\\266lP\\351\\270b\\373\\324\\230\\362`\\215M*\\307\\001\\007(\\2159+\\337\\373)\\304\\255\\370\\273\\361\\364,\\273\\371\\276\\32576\\333A|(Cos\\002\\300N\\334\\223\\036\\342\\031\\200Qeb\\010\\0018\\217k\\301\\002\\342\\004\\204\\255;\\236\\214W\\313%\\2018\\233\\372\\236f\\233\\244\\251CD\\245\\224\\321\\332#m9\\363\\011\\003\\233E\\016\\020@\\024`B\\022\\255U`43\\260K\\331\\245\\342<\\317\\363h4\\326\\244l\\222d\\327R\\011P\\023\\021\\221\\025QJ\\371\\306(\\3428\\216\\025\\340\\331\\331Y\\022\\305\\326\\3324q\\2767\\210\\242\\310\012\\237\\234\\234.\\226\\241?\\030Fww\\301h\\270\012C\\245\\224\\326\\036z\\310\\254\\011%\\360\\203$u\\267\\267\\263\\363Gg\\313\\345r6\\233\\305q\\234\\251\042q\\034\\257\\302\\313(\\005g9\\211\\327\\340\\2542\\350\\031\\215\\212T\\266D \\252|[Ql0\\032^v\\277WB\\347\\303S\\332N\\362\\246\\340n\\311\\314\\\\\\265#\\215\\266\\362\\270)\\036\\005\\347\\253Y')=\\225\\346>\\023\\251\\362\\264\\005s\\245\\231\\205\\257H\\371D\\2639\\322i;\\260\\262\\3045\\276I\\266\\221f\\002\\314.\\351\\240\\210`\\026h\\202\\200X\\3420\\234\\216\\207\\263\\353\\327\\337|\\371E\\270\\\\\\200c\\243T\\314\\234\\332\\324\\220\042EF+\\215\\344\\034\\001\\200R\\030:\\013y\\020\\013AF\\000\\326\\212\\264B@r\\250\\000\\304\\246\\211\042\\364\\264R\\303\\201\\325\\3329g<\\245\\265&@`\\321\\244\\010I\\230Q)t\\316\\017|`\\360\\265\\247@y\\236\\317,\\016\\300(\\035\\370\\303\\325:\\314fT\\340\\017\\227\\353\\310\\245\\016Y\\010\\320x\\236\\357\\233\\3410 \\242\\371b\\361\\305W_^\\\\\\\\\\020\\321\\345\\325M\\234\\330$IF\\243\\321h4Im\\304\\214\\253\\325\042\\265\\211&`\\024\\347R\\245\\020A\\362#\\246\\322\\353\\037\\262\\341\\352'\\032\\362\\244\\013\\025\\273\\302\\007\\015\\203\\221\\233\\262\\233G\\250\\351\\347a\\332s\\243V\\272o\\341n5\\360uj \\334\\244\\2504/bM8;\\372\\267\\325\\344\\3228*\\202\\331\\033z0O \\231\\011N)\\305\\261$\\361\\372_\\376\\331\\277x\\365\\352\\2258\\247I\\255\\226wF+p,H\\210hH)\\245\\010\\020\\220\\015\\251\\024\\011\\200\\025\042\\221\\022\\024\\021T\\220k\\306\\306x(\\340\\034\\247a\\204\\236\\347y\\336`\\344\\245i:\\030\\014\\024R\\034\\307\\3169\\245\\224Br\\316\\011\\212\\361\\274\\321p\\262Z\\255\\206\\376P)\\035\\004\\301r\\271T\\236\\011\\202\\200A\\2141\\213p\\035\\004A\\222\\256\\210(\\010\\002\\225\\252\\210#g\\035\\033\\360\\274`<\\236\\214\\307\\243\\273\\331\\375\\351\\351)\042\\336\\334\\334d\\342Yk\\255\\215\\037\\030/\\266.\\\\G6\\211=\\310l:Vy\\201\\270\\352;\\0243\\305\\243\\277 \\313\\222.\\2028\\225\\306c;\\366He,\\270\\211\\207\\3200T\\033\\235\\273\\\\q\\366\\036;\\204\\246=i\\231\\266\\262>J\\2658\\036PZ@j\\347\\224X\\222\\265\\025\\234\\025\\0349\\001TR\\300J\\352G\\321\\352\\352\\352\\324$\\357\\245\\011\\177\\226!3E7Z\\036\\033\\201\\350\\034{\\003O\\221\\271\\277\\277\\037\\017\\207\\232\\274\\253\\327\\257\\216F\\003\\002\\371\\263\\177\\376\\317\\377\\356\\357~,6M\\243\\365by?\\031\\004i\\022#b\\340\\371\\276\\3614)\\243\\015\\240JmL\\200F\\021\\242\042\\304\\315\\253\\000Q\\001\\2408\\2435\042j\\242l\\025@\\000\\266\\326!)\\2444N\\254\\0003\\0133\\013(C\\276\\357+@\\317\\363\\254e\\255<\\233r\\242\\354b\\261\\032\\014\\006\\316\\212V\\0363\\254\\327\\361b\\276\\002\\200\\341ptuu\\355Rg\\235%\\242 \\360\\203\\201\\027\\307\\361\\365\\355-\\243\\234=>_\\256\\326\\326Z\\026\\274\\233\\315/..\\220\\264\\265\\026\\321\\271\\304-V\\341d2Q\\236\\2272\\030\\255X8\\033\\027\\004\\331\\034}d\\234'\\345\\223\\324\\266\\330\\245eF\\257x\\333mes}ft_\\016\\357\\344\\200\\355\\367\012g\\357\\235s\\373Tp\\351\\357\\223\\005\\000\\200\\231e\\263A|~[\\261\\360\\244\\323.^E\\016\\340\\373~\\270\\016\\205\\243\\243\\311\\344\\366\\372&\\211\\327g\\307GwWo\\377\\350\\377\\370\\337o._\\372\\306\\304\\011\\234\\234\\234\\210]{\\036)\\302\\304\\255=\\317\\033\\014\\006\\201\\361\\2141\\316ZBA\\201\\321p\\010\\216\\231m\\346\\262 \042,V\\234(\\255\\263`\\\\\\272\\320*K#P\\034\\014Sv\\347O)\\005h\\264\\357y^\\034\\257\\3438\\006\\200\\311\\230\\202 P\\306\\370\\276o\\264\\241\\311d1_\\255\\242u\\232Z\\337\\367\\323$T\\240\\234u\\261$Z\\353\\301\\320\\367\\375\\001\\241z\\371\\362\\365x<<99\\361<\\357\\352\\352\\312\\030sqq1\\237\\317\\217\\246SR\\200\\354\\376\\376'?\\376\\225\\337zD\\344)R\\016\\265KmF[\\366F\\030G\\\\\\0136\\337\\334\\223\\225.\\315\\232Y\\034\\007\\356\\310f\\330U^\\363\\201\\334\\341\\206-3\\345\\216\\004T\\326\\201r\\317\\321]:*_\\372\\306\\231n\\244>\\207d\\246\\334\\226\\212*\\331\\263*\\352\\252K\\271\\007v\\237\\226\\255.\\345\\373\\213%5\\254\\\\\\244\\305\\013\\254\\015\\210\\210\\236\\362@\\201Rj8\\360=\\302\\233\\313\\253\\377\\373\\217\\377\\370\\353\\257~qq~\\274v\\311@\\037\\335\\274}9\\030\\014no\\336\\016\\002_\\004\\2646C\\177\\340\\373\\276g\\264MR`'\\316i\\035\\270\\324Z\\227\\341\\024\\000p\\016\\263\\333+\\300B\\224\\275)e[\\2518Q\\264\\215:\\207\\210z\\303\\372\\214\\310\\002\\306\\013\\202`\\350y\\032\\021\\027\\363\\325t:U\\312\\014\\207c?\\010n\\256g7\\263\\331:\\214\\265\\362\\210\\022M\\230$\\211\\215\\223\\304\\350`\\3401H\\352l0\\030\\\\]\\337~\\363\\342\\325x4\\032M\\217\\254\\300\\325\\355\\335\\374\\356\\226\\020\\311\\004\\323\\311\\350\\313/?\\377\\356\\017\\177\\327\\252\\0040fpy$\\244\\302j\\207\\233\\261\\330\\235\\201\\245\\201\\304\\312\\227,\\365\\275\\365]\\032\\260\\346\\241\\302-\\035;\\031\\366\\352@\\265\\2126N'$\\371\\001u\\351\\023\\241\\006)Z\\276O\\262\\002@\\021\\313\\245[\\242\\267\\321\\334\\223A\\017\\312\\357\\234\\363}\\237\\210\\302\\345j<\\030^/\\027\\377\\327\\377\\371\\307?\\373\\351\\247\\377\\360\\267~\\303FK9\\036\\177\\371\\363\\037O&\\223\\331\\315\\233 \\010\\3224Q\\212<\\317\\013\\202\\300\\030\\343)\\245\\220P\\234\\265\\026\\330\\201R\\200\\331\\200\012\042*\\245\\264\\326\\222\\246\\262\\011\\251_\\304\\264\\005\\310\\243i\\225#)\\022j\\004\\322\\312 \\020\\000y\\236\\036\\006\\003\\3177b]\\232\\306\\217\\036=:\\231\\036)\\317\\037\\217\\307\\247\\307'q\\034\\317`\\316\\000I\\224&6UH\\026 M\\355j\\271\\006Dc\\214\\210L\\247\\323\\371|\\276\\0048>>^,\\026\\263\\331\\354dz\\364\\366\\355\\353\\351\\311\\343\\343\\247O\\226w1[\\347\\017<V\\332\\201\\026\\021\\312\\374d\\362\\010]\\000 \\273\\257H\\352\\325\\355\\272\\370\\335\\021\\327\\242\\314\\342\\355\\3574\\311\\245\\362F\\222\\025W\\001\\272\\254\\034-\\220\\314=\\205\\2210w\\256\\330|b\\351\\373\\006R\\224\\252\\310\\362\\246n\\310e\\2004<m\\221\\254\\273\\024\\226\\326\\201\\006\\271Q}Op\\213\\236\\275SP\\001\\211\\3434\\265l\\335]x\\367\\327\\177\\375\\327\\257^\\275\\372\\215_\\373\\341\\361\\304\\177\\273\\272_\\314\\347\\247\\247\\247?\\377\\364\\325p8\\276\\273\\015\\011\\225\\247\\375\\300\\037fW\\0005)\\255\\265&`\\353\\302\\345\\234\\224\\322\\004\\314,\\342@\\0003\\206\\336nds\\267\\224|\\001\\316^?\\210\\212\\260\\010\\015J\042\\310\\200Z+T\\312\\201\\304i\\002\\004\\201\\357\\373\\303\\201\\347\\005\\316I8\\233\\207\\253u\\232:M\\206\\000\\243h\\035\\004\\201\\015\\363\\331\\342\\234[\\255V^`\\202 x}\\371\\372\\342\\342b8\\231\\\\__\\343\\253\\327\\276\\357\\023`\\250\\303\\331\\315\\345\\354~\\225\\342@\\274\\3437o_\\275?y\\244\\0249fU\\214\\016\\010\\344\\357\\252\\313\\374\\360\\252\\301\\002\\273S\\337[\\337\\205\\356\\321\\0261?g\\3502\\353\\267k\\325\\365\\371S\\302Y\\366v(<\042pc\\230l\\360\\205h\\301\\323\\312\\321-\\022\\272\\017C\\227\\352\\332E\\200\\210\\365\\205\\242\\017U\042\\242\\265^\\257\\302\\321`\\360\\342\\352\\232\\023\\376\\203\\337\\377\\017?|\\376\\354\\352\\315\\327\\327\\227/\\237?\\177\\376\\367?\\376\\253\\301`\\364\\346\\365\\327\\223\\221\\037G\\2411\\306\\363<\\255533\\263\\326\\232\\224\\307h\\215\\366\\001Y\\204\\234s\\316\\345q\\232\\025\\240\\031\\014\\230\\231Y*\\035\\236E\\277\\315e3m]z\\2309M\\035\012y\\244\\215\\361}\\337'\\244\\314\\217\\357\\350\\350h2\\231\\246i\\252\\265\\227_\\002G\\265\\216\\2225\\306DZ\\2010[+\\214\\210\\201?||~quu\\225\\255?\\271)\\032i\\261Xx\\236\\027\\206\\341\\213\\027/\\246O\\203\\027/^<\\375\\350\\007\\032\\300Z\\353k\\223\\275\\3716\\353\\333\\342\\037\\222\\246\\323Bhu\\017\\336\\336)\\3346\\270t2\\274\\333\\013\\214\\250v\\355\\202\\262\\201W\\342\\2527\\033\\001;fK\\231\\324]\\205\\270Bw\\233\\256\\\\\\235\\036m:E\\033\\015\\305\\002\\323\\374\\264\\304\\262M\\031\\016\\323|v\\200\\214(4\012F\\244`2\\231\\374\\326o\\375\\326\\323\\307\\347q\\2708\\032\\232\\243\\241\\027G\\2537/?\\277\\275\\271<::\\002\\266\\203\\301Hkm\\214Q\\3128\\227\\260\\344^\\020\\000\\340\\373>\\273\\3249\\001\\024P\\206(\\363\\354\\003\\2454\042#\\362vO/$\042\\2503\\345\\204pGB\\013\\242r\\302\\251\\263\\276\\362\\374\\301`0\\360m\\222Fa\\264^G\\276\\037|\\370\\341\\207\\313\\345\\322\\246\\374\\223Uhc\\233!4\\306\\004A\\220:r\\216\\304&\\326\\332\\373\\345\\342\\331\\263\\213\\313\\313\\313\\361d\\034\\004\\301\\362~\\036E\\221Q\\372\\361\\343\\307\\342\\326\\251\\303\\245U\\306\\030k\\023\\245Hk\\035\\344\\241\\222\\266\\033\\231\\202\\241\\373+\\207Y\\322D$\\300y\\250\\307B\\201\\331r0\\2118\\200\\354\\025\\242\\231\\310\\334\\3615\\333\\210\\314-\\303A\\215i\\232\\204V\\206\\247\\210?]\\341\\332\\006\\276i\\223v}\\364\\324\\356G\\345\\251\\333\\224![%\\250\\343\\264\\245~\\252Z\\307\\323J\\247\\302\\345ryzz\\342\\322\\344\\350\\350hp~\\026G\\241\\037\\014\\303p>99\\033\\247\\303\\371b5\\036\\217\\323xI\\314\\321zmFC\\317\\327\\236\\3471[p@D\\010@\\242A\\261\\210\\200s@\\240Q\\003\\000\\263ef\\3532\\273\\013\\321\\366\\245>X\\216]\\001\\333\\345\\027\\201\\220\\224Q\012\\265R\042\\270^\\307\\232\\3107\\372\\350\\350\\350\\331\\263g\\343\\361(\\010\\202(\\212\\216\\216'\\301\\300c\\347\\034\\363\\332\\331\\201\\321\\310\\203\\330R\\342\\320\\001\\257\\327\\353\\2537o\\317\\037\\235(\\245\\242U\\370\\352\\325\\253L;\\272]\\255\\246\\343Q\\234\\204\\223\\243\\023\\355\\210\\\\B6J\\3263T\\304\\350\\2132(\\244\\030\\262-\\276dQI!\\367\\362%!F.\\177*\\330~\\226\\341Z2\\017\\335\\234q)\\273\\254\\230\\275~o\\023,\\241\\020\\215\\200\\210\\310\\273\\252\\352&\\222\\302.Cl\\304\\246\\000\\355\\332=\\212Wgl\\264~\\336\\035hQ\\325\\367\\002n\\037\\2259c\\363\\251\\230\\271~m\\241\\343x\\011\\353\\217\\262\\265%\\233\\306X\\036`\\200\\315\\013-A\\244\042-\\032\\324\\255,;\\300\\256\\357\\350\\246\\222\\246\\255\\272\\010\\000)\\177\\344\\257\\3435\\241(C\\211\\263\\240\\015\\213\\323\\203\\251?\\010f7\\311\\232!N\\222\\3410\\210\\026k\\203\\242\\265\\032\\016\\007i\\032+E\\3169f\\347\\222\\024\\001\\004\\011\\2651\\210(\\234\\305\\273@TD\\222yHg\\021<@\\262m\\241\\200\\002\\021!$\\2555\\021\\001!33[\\347@i\\337Zak\\235sl\\235\\270t2\\032\\216\\306Cc\\364\\371\\331i\\340yg\\247\\247\\201\\347}\\360\\376\\373\\257^\\274Z\\255V\\206\\220D\\320h\\243a\\035K\\030\\256,\\247\\251\\347\\255\\026\\313\\307gg\\367w\\263\\367\\237=GD\\022\\270\\277\\275\\277\\273\\237\\377\\340\\327\\177\\260^\\307ON\\217\\347a\\374\\315\\347\\177\\363\\361\\367?x:\\372\\304\\037\\236\\255\\234\\001Q\\232\\001\\231\\254\\266\\254,\\240A\\001t\\231\\037\\2544\\377\\011\\0230\012\\024\\237\\205urg\\014\012a\\234\\011`\\221\\222\\271\\212v\\031z\\237\\026QyML\\241\\023\\227\\246\012\\354\\206.h\\025\\311P\\345\\346\\342\\263A'n\\245\\247)\\324K\\247N_h\\314\\255\\313N9{\\271\\011\\355\\331\\266i3\\335%o\\204Ba\\020@o4$\\326oonI\\231\\324\\261$\\211\\2003\\236\\312n\\0206\\320\\003 \042\\214\\331\\265+q(\012\\320\\002+ A!\\302\\314I\\0251\\353\\000$B$\\311\\274GP0s\\015'\\302L\\335\\316t\\310<\\306\\256\042$X\\255\\026o\\336\\274999\\321F\\235\\237\\235\\376\\352\\017\\276\\237&\\311\\375\\317g\\247\\247\\307\\353\\365:N\\023'\\232\\305\\015\\374 \\214\\334j\\276\\270\\275\\272\\016F\\303\\311dBD\\231\\213\\337\\321tz||\\374\\257\\376\\352_\\177\\357\\227~\\371\\321\\221>\\036\\252\\267\\313\\353\\233\\027\\237}\\362\\275\\357\\336\\2073\012\\206\042@\\222\\351\\031\\254\\000\\031\\230\\200T>\\302\\222\\357\\346\\367}n/\\311\\356\\372r\\354\\372!P~6\\206X\\216\\250\\276\\313(\\255,U\\275\\365\\275Y\\240\\313\\014\\2446\\000\\300}\\357\\377\\253\\253\\343\\265\\240\\371\\235\\373Qi\\316|\\270DoN\\210\\325{\\235\\035<]tk6)\\211PD\\224\\002\\021\\362<\\217\\000g\\263\\031\042\\3066\\3054\\005\\007\\244\\020\\025)\\245\\231\\263s\\256\\374\\220({\\275T\\036\\241fs\\351FP4\\200&\\312\\3053\\212\\002\\312\\242\\214\\002\\344,.\\314Y`\\003A\\316\\\\IK&\\371\\374%@i\\232R\\214?\\372\\321\\217\\336\\276}\\213\\210\\357\\277\\377\\276o\\274O>\\371\\204\\031\\246\\323\\351\\337\\375\\370'\\306\\367\\200\\340~1_\\257\\327C?\\360\\003s7\\233\\335\\317f\\236\\347\\2216\\353\\345\\312Z{vvf\\214\\271\\275\\275\\375\\350\\371\\007\\217O\\037}\\365\\371\\227O/\\336\\377'\\377\\325\\177\\371\\233\\277\\375;_~\\363&\\360\\217\\256\\331\\331\\374\\034\\027\\264\\240\\023!P(\\325\\205noj\\264r\\344\\003\\\\\\254\\274u\\224\\375%b}\\350\\333\\027\\356^\\300\\216\\342\\215\\217\\252\\374\\332\\031\\255to\\352\\230\\3009\\230\\244\\322\\344=\\230\\021\\021\\212\\350*\\005\\265\\302\\016\\264\\326\\323\\311\\021i\\305\\314Z\\033\\266k\\021D$ \\004\\322$\\016p;RD\\010\\300\\010\\304\\234E\\244u\\331\\302\\2470\\013N\\224\\343V\\220SG(\\234\\355\\235\\304eK\\246\\010\\003\\011\\002g\\372\\212\\010\\002\\242\\003aP\\314|\\361\\336\\263\\323\\323\\323\\325j\\025\\206\\341O\\177\\361\\351w\\277\\373\\335\\361x\\374\\203\\037\\374 \\212\\223\\317>\\377\\271\\240|\\360\\321w\\216\\356\\357\\337\\274}\\233\\256c\\317\\230\\353\\313\\253\\351t\\372\\350\\364\\324Z;\\237\\317onn\\000 \\\\.?\\373\\351\\335\\374\\346\\376t\\362\\004\\330\\2067\\267\\377\\353\\377\\362?\\377\\007\\277\\367\\037\\237\\276\\177\\262F\\267\042&E\042\\2542\\211\\233\\375\\365\\032\\226m\\322YD\\263\\222.\\273c\\013\\313\\025\\014\\331v\\034H5\\226z\\363\\030m\\265\\227\\262oF9\\216^)\\006py,w\\177B\\355gO\\316kO\\345\\243\\351r\\355-Q\\270\\253\\233E\\351\\314\\237\\345\\252l\\037\\333i\\301<\\022=H\\271T\\0367\\203\\010\\237\\177\\347\\303\\300\\037dq\\216,)\\004`\\007\\302\\305\\252D\\270\\211\\320B\\004\\010\\304,\\230\\305\\021C@\\002\\006T\\220y?\\345\\274\\221G\\241\\021\\001\\347${\\377<\\262l\\342)1\\202\\244\\251\\223\\314<\\202\\2361\\036kD@\\222\\353\\353k\042\\362}\\377\\364\\321#\\317\\037\\254\\302\\350\\351\\305\\005 ~w\\265\\\\\\306\\341\\253W\\257\\3020t.=9\\236\\016\\007\\376\\315\\335-\\214'\\327\\227WF\\321\\331\\343s\\243\\351\\366\\3666u\\3269{z|4\\273\\271=\\235\\236\\017\\206\\336\\277\\373\\313\\277\\010H\\377\\370\\217\\377\\370\\277\\370\\247\\337\\273\\345$%O\\320 \\242\\320\\346\\315\\024\\200\\016\\245\\266\\246v\\245BBW\\271\\247-\\204Rex:dd\\023\\244\\252\\001\\327sb\\015\\322\\206\\271O\\245\\265G\\015o\\361\\352V9\\332ji\\316\\217\\\\\\230}\\366\\344\\314\\036m&\\006\\356\\274\\232(\\347>\\347\\344\\374\\374\\374\\361\\323\\213\\257\\277\\360m\\272\\262\\014JQ\\342\\230\\031\\010@\\262\\373\\261 \\210\\244\\000\\010\\301m\\356\\245\\253L\\205\\004Q\\000\042)\\212\\000R\\036\\336 \\223G\042\\226m\\326!\\202\\302\\331mFf\\007\\022\\247\\251c\\006\\000c\\2145\\332z\\236\\200c\\361\\304\\2720\\014\\255\\265\\000\\360\\361w~\\351\\372\\372\\372\\351\\305\\005\\021=~z\\361+\\316\\216'\\223\\327\\257_\\337\\335:\\317\\363\\2141\\326\\332G'\\307/_\\277z\\375\\342\\245s\\356\\354\\354\\354\\350h\\352\\234K\\223\\265\\215\\326\\217\\037\\235\\206\\341rv{s\\352\\351\\233_\\374\\342\\354\\354\\303\\364\\355\\333\\341\\371{\\021\\272T!\\003\\022l\\305(\\343aBZ\\375\\343\\177\\362?P\\276Y\\310f0\\022\012\\202\\020B\\006'\\310\\226\\037\\240\\315\\2130ps\\363+;F\\335\\374\\345\\003\\227})\\001\\313\\221\\022\\352\\232\\000U\\340;\\271\\241@\\330\\232\\210\\240T\\335\\226\\252]\\332\\000\\362\\273N@\\230\\005KhhB~8E\\245G\\331w\\002\\244\\315\\317\\315\\037\\344Q\\254v\\377\\240hu\\357V\\220BD\\312Ke\\001*\\020\\021\\201@D\\214F\\022\\376\\346\\213\\317\\027\\263[\\227FFiB:>y\\224\\025ag\\011A\\230)\\223\\365\\316\\201c\\000\\006v9*\\000f'\\302\\031\\337\042\\0100\\013\\263d:8\\210\\010[N\\035\\263s\\251ek\\035;`'L\\010Z+\\245\\025)E\\204\\2048=>BDg\\345\\352\\346\\3069\\027\\305\\361\\243G\\217\\336\\373\\370\\243\\323GGf\\340]<\\273\\370\\207\\277\\371\\033\\037\\177\\364q\\034\\307\\263\\233[\\002t.\\035\\215\\306\\276\\357\\255\\226\\313U\\264\\212\\343x:\\235\\022@\\262\\\\\\205\\313\\345\\344\\370\\344\\275\\307\\347\\3637\\257\\3748\\035F\\356\\350\\344\\334\\177\\376|\\355\\031K\\304(Y\\357\\022\\352l\\013\\237\\235\\354\\366\\374S\\377\\370\\277\\375\\037\\313=\\016\\331\\324(\\211\\344\\306A\\352H\\273\\203\\267U\\312;\\006{\\247HY\\200\\225\\000m/o$\\302\\356T\\313\\337\\334\\226:%m\\\\H\\245@-\\265\\304\\225h\\256mdl\\351Q\\032)\\013\\272\\\\l@\\021\\000\\264\\316\\334,\\370\\361\\331\\351\\317~\\372wWo_\\263M\\002\\317g\\206G\\247\\247\\212\\210\\020\\3302\\241\\0103\\001\\003\\200\\260\\023\\261\\314\\2668\\360\\002\\020\\347\\030\\0000\\277I-E\\302,\\324\\010[\\313\\216\\3319a\\021a`\\343\\373\\244\\224g\\214\\357\\373\\231\\307\\210\\322F+\\245\\265w~\\376\\370\\370\\350\\3103\\346\\366\\372&\\216\\343\\253\\313\\313G''\\307\\347\\247\\323G\\217\\206A\\300\042\\217\\317\\317\\177\\351\\343\\2175\\2517o\\336\\010\\260g\\214\\240\\200\\2101z\\275Z a\\272\\016\\207\\306\\034O\\217Qi%\\374\\207\\277\\367\\273_\\375\\355\\217\\247\\254\\301\\033\\234\\377\\360\\207K\\243\\035iFD`\\002\\312\\3742\\204\\000\\016a?\\365\\237\\375w\\377\\254\\306\\346\\331\\230m\\345nyHT\\231\\203J\\002\\2256\\203]a0\\002\\332\\010~\\330\\240\\004\\314\\3659\\334\\326\\002\\200\\300\\010\\222a\\252\\241\\331\\022P}\\224\\277\\306\\035\\212\\025\\246X\\263K_\\2202;\\025b\\376\012\\306\\255\\337\\255\\224\\377*\\020\\021n{T\\026\\355\\231W\\004\\021n\\270\\271\\320\\263+\\223\\263A\\242\\344\\261nsS+\\000p\\326;\\236\\347E\\353p2\\031\\023\\310j>\\373\\333\\177\\373o$\\213X\\300@H\\317\\236^dq\\357\\234M\\264R\\342,\\210\\260s\\271D\\003p.-<\\310\\231\\035pf\\271\\312[\\204\\004N\\234\\010\\213\\210\\023\\316\\356\\312\\020*\\324\\032\\020<\\337\\017\\006\\003\\245u\\266\\342d\\035\\201\\250\\220\\360\\350\\350\\350\\361\\371\\343\\331\\375\\375\\353\\227\\257\\342(>>\\231\\236?}\\354\\015\\003m\\3140\\360=\\343\\215\\036\\235>\\177\\366L\\000^\\276\\370\\306\\363<B\\360=o\\261X\\034\\037\\035\\261u\\034'\\217\\246\\323\\361h\\024\\306\\311\\351\\321\\364w~\\370\\017\\216\\224y\\363\\3457\\354\\371O\\377\\375\\337^\\032\\223*\\355\\262u\\036\\020Q\\223\\312\\206\\260*\\241+\\375_\\221\\320\\377\\254\042?\\262\\237\\025\\266)\\371d5\\000+<\\267+\\234*\\210\\240%s\\0213)\\243\\0307W\\3752\\026\\337~n\\356\\355m\\314\\344\\262Sc\\245\\025U\\370&nF%3\\264\\010\\343\\216\\324X\\351\\366\\370\\251\\3269\\320\\222\\024)B\\310\\257^ca\042\\3064M\\375\\300_\\334\\337!\\342\\007\\357=\\375\\213?\\377\\263\\273\\233\\353\\223\\243\\2518\\036\\004\\301\\321t\\032G\\021\\273\\024@\\024\\222c\\213\\200\042\\226Y@\\234cvl\\205\\005\\363H\\035\\231\\343\\377\\3062\\013\\340\\230\\211\\310\012[\\347\\254\\023\\001@\\255\\224\\321\\3063\\3063Jk\\347\\\\\\024E\\313\\345j\\261Z\\205\\253p\\261\\\\Eq|\\371\\366r\\261X\\210\\210BL\\342x1\\237\\257\\302\\245\\000\\037M\\307\\303\\341\\010\\210D\\300E\\221\\347{\\317?\\370\\340\\213/\\276X\\256V\\323\\3118\\014W\\201\\247\\305\\331\\307gg\\036\\341\\207\\317\\236E\\253U\\024\\245\\003R\\237<\\177\\376\\233?\\374\\365\\277\\374\\223?\\205\\341\\364\\375\\337\\375\\275\\265\\027\\210\\322\\2444a6\\177T\\036\\272'\\177;rYeh\\355\\322\\212\\267]\\376\\026\\022(n\\216l7+\\233\\201\\3379\\200(o\\034+\\230\\267o\\257\\252\\014y\\251\\2722\\220\\31387dH)\\316\\020\\226\042\\266\\024\\217\\270dl\\250\\334\\341k\\204gR\\273\\342.\\002Mt\\346\\335\\262q2h\\343\\310\\312q\\014n(\\204\\212\\001\\247QE\\314\\275IY\\000\\000 \\000IDAT\\341\\315\\354E\\310B`aAz\\266\042\\370\\376\\200\\300\\016F\\343_\\373\\341o\\\\\\277y\\035\\256c\\0171\\213\\256\\224\\035_3sb]\\022\\257\\025 H\012\\000\\010\\216\\231Y\\234!\\005\\204NX)\\005\\240\\035\\247\\222\\255o\\002\\016\\004\\220D\\3301\\270,f\\010\042\\0038\\353\\026\\3639\\000$6\\015\\3030\\216R\\007\\342)MD\\223\\361Xl\\212\\000I\\024\\237\\035\\037sj\\331\\245o\\336\\276\\372\\351\\247?yrqf\\343\\304\\033\\004'\\027\\317\\3640\\200\\304\\006\\203\\340\\037\\375\\247\\377\\311\\037\\375\\321\\037=y|6\\277\\237\\251\\300\\277x|\\366\\346\\325\\353\\221\\361\\237\\234\\236\\316./\\037\\015\\206\\036\\300\\227\\237\\177\\361\\311/\\177\\377\\351\\307\\037\\275N\\034#\\000\\220\\022E\\202L\\004\\244\\262\\3251c\\303\\314n\\223\\337\\256\\202j\\367\\226\\323\\276;\\205\\273@8\\304\012\\261\\301\\2231_\\361\\376\\3602\\302\\302\\227#\\003\\2241T\\243\\015\\225\\276\\357\\302{\\320S\\372\\276\\2659\\326%t\\237v\\265qv\\255\\212^\\005\\025\\344f\\216-7C\\336&\\317\\363\\322$\\032\\217G\\034\\2057\\3277\\277\\375\\333\\277\\363\\347\\177\\362'.Y\\2118\\026+\\342\\030\\234s.\\216\042\\233&I\\024\\212\\263\012\\205\\210\\264B\\000\\021qNk\\017\\201\\231}!D\\310BIg\\342\\237\\362`g(D \\314\\202.M\\323\\324%.ISGD\\3269v\\000J\\007F\\371\\376@k\\362\\2147:9\\231\\216\\306\\2677Wi\\024\\005\\276?\\036\\0046I_\\277x\\031\\205\\353\\351d\\202D`S\\030\\014 \\360\\201\\350\\343\\037|\\377\\017\\223?\\374\\213?\\375\\263'O\\316\\303\\371\\375\\310\\367\\336\\277x\\262\\270\\271\\215\\227\\213\\365\\375\\375hx\\354k\\357\\263\\317>;;\\376\\227\\377\\336\\037\\374\\376\\037\\375\\351_\\2621\\010J11\\020\\020pf\\216\\334:\\217\\346\\3774\\335\\305\\336IZ\\021\\212\\310\\2467\\263OF\\304\\314\\026\\277u\\212\\330\\032J[\\337\\201\\262o\\214\\267W\\374\\363\\247\\245(r\\305\\312\\260\\213\\241\\371{Y\\276\\026'\\353\\025\\014-e\\263Y\\332\\340k\\261\\363sw\\232\\354\\266\\250\\315\\207\\251hECwwk\\035\\245|e\\0036!b\\034\\307\\006\\340\\344\\344D\\301w\\216O\\037-\\357\\330Es\\347Rk\\223$I\\322(\\212\\243\\0106\\316\\033\\026\\230\\004\\300\\201\\000\\213\\210\\345\\324\\262($BVJ\\241\\326$\\000J! j`\\007\\016\\231\\005\\255\\223\\324\\331\\324%Ib\\3234\\036\\017'Zk t\\3161\\220\\366\\224\\357\\017\\214\\246\\321h\\244@\\002\\343e\\316\\253\042\\222$\\011\\202\\265\\351pv}\\305\\354\\002\\337_.\\026c\\000\\030O\\000\\021\\264\\372\\344W\\276\\377\\325\\317?G\\227B\\024\\235\\237<\\212\\314\\362\\304\\367_\\374\\374gv\\276X\\336\\305\\301\\343\\307k\\225\\376\\365\\337\\376\\355\\177\\375\\337\\374\\346\\360\\311\\0232\\276B#\\016\\311I\\242\\031\\020\\262\\240\\006\\000@\\331\\361g&\\2333flgk\\365\\237\\377\\323\\377\\251\\254\\227lT\\270F\\345OrMo7\\177\\243\\312\\270I\\262)\\265+\\366H6\\312t\\227\\362Z\\346\\206\\372\\243\\315\\267\\016\\004\\015\\345\\332\\312\\224+\\332a\\304\\026\\216\\304\\246N\\2503q\\001o\\351\\037\\304\\215\\206X\\020\\226\\351\\214\\222\\275\042\\231\\301h\\345\\033m\\223\\010\\234\\375\\253\\177\\375#O\\203Q4\\032\\016\\2438tI\042\\300\\276\\247\\215\\347\\035\\035M|/\\320Z\\221\042@\\342\\354\\264L\\262\\270\\226\\250(\\273\\326\\235y\\333\\021\\020\\261\\260\\023NR\\027\\2476u\\326e\\256\\036J{^`\\264g<_\\031\\317\\370^\\020\\014|\\177`<o2\\236\\246I\042 \\201\\347\\015\\206\\003O\\253\\351d\\364\\321w\\276\\363\\341\\007\\037 \\300tz4\\234\\214\\004I\\373\\036*\\345\\342\\230\\002?\\015W\\357]<[\\336\\335\\275\\367\\370\\361o\\374\\352\\017^}\\375M4\\277\\177\\365\\345\\027G\\376@[\\245I\\263\\2265spr:\\270xv\\362\\341\\2570\\370\\312\\022\\21002(\\024 \\004,\\2166\\3338\\241\\222\\362\\223\\302\\335\\301\\310\\337\\242\\014[9T^\\251w\\257\\014\\356\\226\\332\\205d\\2728\\355\012\\036(\\206o\\027\\303&\\240h\\203\\033g\\263;\\324F(\\322&N\\345\\356\\234)K\\312\\342\\321\\346\\014\\270\\206\\252]e:p9j\\305\\323*\\2411\\247\\266\\034\\360\\033\\000\\001\\265\\322(@\\310\\213\\305\\375`4\\372\\375?\\370\\217~\\364\\347\\377\\342\\355\\213\\3173\\255\\203\\210\\264\\357\\213\\230\\354eiF\\241\\2656I\\323$\\215\\234sY %D\\324Bi\\352$\\300\\341\\320\\020Q\\232\\246\\000b\\214\\311\\256\\323\012*TZ!!\\000\\031\042\\242,\\020\\2076&;\\211PJ)m\\024\\341z\\275ffF\\034x\\236V\\352dr\\374\\344\\374\\321\\017\\276\\377\\311(0\\236\\347\\035\\037\\035\\005\\303a\\030\\247Q\\022+D?\\010$\\376\\177X{\\263_]\\262\\353>l\\015{\\357\\032\\276\\361\\234s\\317\\271c\\367\\355\\271E\\212\\242\\006j\\262l\\302\012\\005\\303OA\\004:A\\342WG/A\\3362\\374\\011y\\313C\\214$\\017yL\\202\\0300\\020\\3002\\220\\310\\262$\\313\\032,\\212\\244\\310f\\223l\\252\\311\\236\\330\\303\\235\\317\\360\\315_U\\355a\\255<\\354\\372\\316=wd\\333H\\241P\\250S\\247\\276\\032v\\355\\275\\366\\032~\\353\\267\\272b<\\346\\250_\\371\\312W\\246e\\011m\\363\\033_\\371\\325\\177\\376\\177\\376\\357$2\\255\\207\\226\\335\\262\\335v\\006\\233\\266{\\367\\247\\037\\375\\306?\\374\\272\\000\\242\\222Qdd%\\010\\210\\010\\230rsh\\3775/\\266\\341s\\270\\355\\364\\211\\256\\211;%\\365\\334\\237\\360\\360B}\\007}$\\317\\217\\001\\005\\024\\2378r\\236\\363\\007\\347*\\357\\005\\273\\363\\363b*\\236\\327W\\024\\000U\\020\\030HPQAPIQP\\0310\\357+A>B\\212\\002\\360$\\326\\342\\251W>?H\\317\\370\\327\\347\\314\\022\\177\\316\\303\\357^A\\241\\257\\230\\243\\2449gC\\001@%\\225\\245[\\257\\266l\\220\\014\\217'\\023M\\351?\\375\\317\\377\\361\\377\\372?\\376\\017\\000HD\\245s\\226X%\042H\\362\\341\\354l\\261\\331l\\026\\353\\225\\367>SJ \042\\021\\015\\212\\2220!rQ\\325\\000\\230\\201\\036\\210\\034\\223\042\\260\\265\\214dr\\214\\260\\237{\\223(d\\250\\235h\\324\\204\\211(\042\\002j\\252\012\\2471\\011\\2421\\366\\350\\350h4\\254SJ\\204UY\\327\\314\\350\\267M\\322\\304h\\333\\316\\247\\246AQ\\006\\265\012\\373\\227.C\012PV\\327\\212\\352\\332\\265k\\315\\361q\\267\\332\\220\\321\\315v\\025\\\\\\325@\\362\\312\\340JUTU%\\203\\010\\206,\\000D\\200\\034\\345\\277\\320\\206\\017\\225AI\\217\\351\\221\\220\\343\\213\\346\042\\276\\376b3\\023r\\226\\033\\360\\350\\260\\340'Ja >~d\\007H\\313\\001L\\2758\\000\\220\\262\\336,\\217\\312\\255'\\265\\347\\207\\023\\372\\371\\255\\237\\321%\\264\\037\\034\\250\\252x\\276M\042\012\\242\\231\\372\\026YQ\\004\\010\\350\\341\\270~d\\270?\\255\\303\\235w\\374\\247d\\017\\252\\302y\\375\\244\\307\\256\\246\\351\\361\\207\\313'<#'\\237\\036zr\\000\\373\\024s\\001\\000c(vm\\351\\010UmQ\\315\\266[t\\325\\227\\177\\375\\267n\\276\\372\\306'\\357\\275\\033\\273T\\025\\306\\031\\320\\250\\213\\371\\354\\376\\375\\373\012&\\252\\0002\\260\\221\\310*JD\\240\\260\\355Ra)\\002\\006\\005B\\213\\004\042\\322\\371hm)\042\\220\\222\042\\250\042HRP$\\224D\\276\\023\\221\\230\\311\\375\\031\\011@I\\240p\\205\\3376\\223\\321\\000D\\010QB\\214Af\\213eYW/\\\\:\\214\\240\\363\\305\\211AJD\042\\200dc\\343\\367\\017\\217\\266g3k\\330\\326\\025\\224E{\\362\\340\\357|\\365\\357\\335}\\367\\307\\332\\264\\251\\320b:X\\247\\010E\\025\\204W\\353f\\377P\\311\\260\\330\\236\\233\\003E\\215DFHld\\307\\326\\225eo\\217\\300\\3335'*\\260\\002+\\200\012\\202\\230,D\\237Dn\\354\\372\\\\\\357\\265\\275\\240\\201<t\\232\\340\\305\\356\\373\\214mO\\022K\\260{\\004|4)\\346\\321\\233>\\373\\310s\\244x~*\\352\\253\\316d\\356gT\\352\\217\\344;>\\334\\177by\\2662\\320\\377\\367\\251\\377~L\\364><\\353g\\273A..B\\217\\030\\243\\027\\260Y\\273\\006\\357\\343\\365j\\024\\025A\\277\\362k\\277\\371\\301\\273\\357 \\233\\341`\\260\\236\\237n7\\213{\\267\\357\\010\\202uV\\225\\015\\030r\\005\\003\\365!\\036\\025\\306\\\\d\\273 \\354\\013g\\201(b\\237S\\250\\202\\014\\220P\\011\\020\\221\\021\\0209g\\301dR1@P\\024\\005\\224\\330$\\002\\330\\254\\326\\373\\373\\323\\253G\\227\\217\\216\\216\\256_\\2736\\034\\215|\\362\\313\\315\\032\\015\\026\\226\\025\\001\\222h\\002%;\\256\\307\\247\\237\\336\\252\\213\\322V\\025\\010\\300z\\375\\301\\007\\037^?\\330G2QA\\014mC\\230\\257\\327/\\275\\374\\352\\336\\301\\341h\\262\\247\\252AB\\204B\\261\\007Y03\\242\\236SD#d\042\\245<\\313\\357\\376\\206]_C\\311\\220\\177C;\\231\\366\\260Y{\\254y\\217\\343B\\354i\\307\\236\\365a\\236\\337!\\210\\236\\371\\303\\247^\\347<\\177\\340\\242\\314\\177|\\331=\\230\\340#\\277=\\327\\302\\363t\\373\\330\\225\\363\\366\\261\\354\\243\\317\\361\\026\\362\\324G\\270p\\315\\363\\261\\275{\\360g\\277\\335S\\016?\\343'O\\350*y\\202J\\277\\364\\313_\\371\\277\\377\\331\\377\\221\\024s\\317i}\\207\\206\\307\\203AQ\\326>IL(\\252L\\224}\\325)\\304\\242\\260D\\344\\014)\\344R\\025\\221\\200\\020\\301\\030\\026AEL\\220\\030\\260\\007\\270\\0000\\032\\314\\312\\207*BO\\253\\005\\240)\\311x<\\364]c\\255\\265\\326\\001\\320\\0137n\\276\\376\\346k\\237\\335\\371l\\333\\254\\266\\353u\\262\\006AH\\2414\\2052\\257V\\253\\344\\003\\270B\\332NU\\271\\266\\333\\325z]\\224\\021\\330\\215\\366^|\\355\\225\\027\\253\\362\\007\\037~\\370\\312\\033o\\330\\351\\004\\362\\214\\224}\\341Yg\\240<\\237&\\310:4)\\251f\\365\\262od\\354=\\276\\304 \\240\\252\\212*\\250\\372T\\200\\377#\\315\\372\\350\\221g9\\255\\236\\361\\301pW\\256\\353s8\\255\\236>\\203?G\\373\\314\\325$U\\005\\241\\327>\\345\\341>g\\026\\017\\355\\325\\234\\307\\216\\237\\377\\367\\311\\363/n\\001\\344\\251:\\364s\\236\\360\\363\\274\\351\\305\\245O\\343\\374Y\\313N\\2417\\007W\\256\\274\\362\\306\\233\\355j\\276i\\310\\330\\302\\331\\362\\305\\027_RU6.\\306\\330\\205\\024\\222\\244\\224\\242\\017 \\252\\232\\000\\271\\247p\\354}_\\331\\254\\357\\223\\261\\200%\\343\\261r0FD2UP\\236!\\264\\367\\005\\003\012\\251\\246\\034\\000o[\\177v:W\\325\\007\\017\\216\\337x\\343\\215\\303\\203\\203{\\367\\272\\266\\331z\\351P\\264,\\254!\\006\\325\\315z\\265?\\335\\337l6(\\302\\314\\214\\305d2999\\231\\257\\267\\277\\360\\305\\237\\377{\\277\\363\\017\\366_}e\\375\\317\\376\\257\\331r1\\031\\354\\015\\207\\265\\2002\\212\\366\\276\\015P\\205( \012\\226\\000PI\\373\\270D\\306\042\\013\\3665+pgp\\350\\316\\244\\246\\235\\242\\255?s';\\225\\030\\221Q\\011\\204Q\\177\\366\012\\310\\200\\014J*\\347+\\203>g%\\312\\370!}\\254Z\\317\\305#\\210z\\361\\034\\006%T\\006e\\202\\363\\375\\363-\\251 \\310\\371\\226\\011\\014\\002=\\372\\253\\307\\216<\\374m\\036\\320\\217\\336\\372\\311\\032B\\347\\373\\377\\376k\\337\\247?\\317\\232\\321\\217\\365`\\364\\037\\375\\203\\177\\330x\\341\\242\\026%[\\014\\352\\301\\240(\012\\334E\\2713h\\232@\\234\\241\\272t\\244\\300\\200\\206\\262>\\241\\224\\263\\232H\\005\\005\\015Z\\313\\316\\031[\\030S\\030\\262\\031\\247\\223E]BM \012\\271\\217\\021\\345Z\\310\\306\\030U$2\\326\\024\\247\\247\\263\\331l\\216J\\205u\\205u(\012\\242\\006\\211\\221b\\347\\007U\\035\\273.\\264\\035\\3479z\\263e\042k\\234\\232\\342l\\323\\374\\370\\303\\237BU\\277\\362\\372\\033EQ\\354\\355O\\306\\203\\022b\\003\\261Q\\351v\\365\\271\\000\\014\\220cD\\340,WI\\011\\025IvkD\\212H\\011)\\011\\251\\020\012adz<c\\345I\\031\\363\\210\\220\\356'\\371\\247h\\021\\317\\233\\262\\237v\\316\\263\\356\\373\\034y\\374\\324?i\\367x\\275\\014\\273\\350\\370{\\332\\366\\374e\\036;\\242;\\034\\371\\305-\\000<\\211o\\376\\377wy\\316\\373>i\\330\\010\\202\\261\\356W\\276\\362k\\177\\362\\207\\1778\\335\\337\\277\\367\\351\\302\\026e\\323t\\2053I$\\213\\233\\234\\243\\217\\010\\231\\321ND\\\\QX[\\020\\201\\010\\250\\006\\310c|\\347\\032\\027P\\003\\231\\3117zU\\022\\355s\\004TuG\\266\\224\\031\\227BH\\266\\266\\231P\\306\\332bP\\217\\246\\323\\375\\2420\\316\\342r6\\233\\235\\235\\204\\330HLh\\325Y\\036\\224\\305b\\276\\232\\214\\306\\336\\373\\030\\375x4\\000\\321\\020\\302\\177\\374\\237\\374\\356g\\237\\336\\372\\311{\\037\\375\\362\\203\\343\\337\\374\\352\\337\\277\\364\\342O\\251\\032l\\227\\263\\301p\\3370z\\020\\2571\\010E d\\264\\004\\032\\341\\274`\\241\\356\\276\\310CM\\032D\\200\\262\\362\\251@\\000\\300_\\377/\\377\\333\\307\\320L\\347\\350\\336\\213\\330\\337\\035J\\030\\361\\374\\212\\010\\347\\320\\263\\213?\\177b}\\270\\000\\300S\\367/\\216\\031~\\002\\337\\234Wz\\354\\010h>\\302\\260\\333\\317[U\\002x\\376\\332\\243\\275/\\374\\211\\360\\234_!\\002<\\271\\362\\216T\\353\\002F\\032\\011\\220\\031vP\\362\\317\\267>\\027\\377z\\336J\\375\\016 i2\\3064\\315z\\265\\\\\\370f\\353\\230S\\014\\226\\215\012\\252@\\306\\201\042\\210!\\312\\242\\321\\330\\302\\331\\302\\332\\002\\0215\\252\\212 2\0429\\343\\014\\033 \\212QT\\200\\330`\\016\042\\366\\005\\0052\\002\\036\\231(_\\312\\267\\255\\2122\\022(4\\233&\\2064\\235\\356M&\\243\\275\\351\\330\\032\\243\042m\\263\\215\\301\\203\\212a*\\213\012\\001Q\\265.\\253\\315z\\243\\222\\352\\262l\\267\\333o}\\353[\\037}\\364\\351\\235{\\367N\\346g\\256(_z\\345E\\005\\030\\015\\007\\226)\\370\\300*\\226\\331\\020d\\014\042# \\220\\252\\366\\023\\024\\002 \\002\\365\\265\\203\\011\\204@13\\242#\\236\\303L\\371\\037\\375\\336\\177\\377,\\221\\374do\\003\\220\\307\\022R/\\236\\374TI\\363$\\350\\354\\211k^\\270\\021\\351\\005f\\252gJ\\262GNx\\242\\374x\\026l\\317\\353(\\331\\025\\235\\353\\244\\223\042dg\\342.\\264\\361\\350\\266g\\323{\\3428\\021#)b\\317\\270w~\\235\\347w\\320\\247<\\3133\\316\\317n\\212\\307Z,\\177S\\337u/\\\\\\275\\362\\255\\277\\376\\206%B\\215\\226\\311w>\\204\\020B\\310\\031%\\226\\311Z\\313\\010\\204Lh\\3308&\\026\\021M\\031\\345@D\\344\\\\\\301L\\010\\030ST\\005d\042d\\000`\\321sR\\307\\374dLDD\\205\\353\\311N\\313\\262\\224$\\233\\315\\206\\210\\356\\335\\275\\2677\\036\\252F\\020\\021M\\014\\020\\275\\227\\224\\2345\\216\\2141v\\275Z[\\313\\323\\321\\330\\373&\\245\\364\\373\\277\\377\\373\\233u\\253\\010lx\\333n\\256\\\\\\275\\272Z\\317\\333f\\263<\\233u\\353%\\304`\\031\\013\\203\\206\\224T\\031\\022\\235\\303a\\317\\3638\\000\\220\\010s6x/{\\021\\200z/\\026\\002\\177\\375\\237\\3747\\347\\202\\366\\342z\\256=g\\273k\\267*#\\365\\300\\345\\013l\\276\\273\\373\\352\\343rt'M{)\\370\\350\\237\\027/\\262\\273N\\376\\204r.\\365\\237\\005{}(\\271\\011v\\264\\225\\273\\273P\\306^?r\\213\\363\\007\\243\\376.\\347\\333<\\370\\317\\357\\236\\241\\333\\330g\\353\\340S\\216\\234\\037\\177Dp\\\\8\\347\\\\\\212\\303\\243X\\355\\247\\256\\360LU\\355\\361%\\247\\230\\030kT\\305\\031^\\234\\235\\335\\277\\373\\231E\\204$\\336w\\220\\004\\0250{\\225Tb\\210\\022\\243\\002\\0020 W\\256\\014\\336\\307.\\021\\241&\\264\\326\\030rl8\\006\\0111\\020\\032\\025\\211>iJ\\311\\267\\226\\331\\030VI\\244j\\015\\023\\241H\\002\\325\\224\\222a\\026\\021I\\202\\2101\\306\\020|\\350\\332\\256m\\2151\\235\\357@RY\\024\\222b\\014\\261.kfc\\330\\226e\\3215\\255\\265|vv\\366\\366\\333o#\\222\\2616D?\\331\\033_\\332\\237\\374\\253?\\370\\177>\\371\\340\\203\\033W\\2170\\264\\030\\374\\307\\357\\375xo8\\030\\227\\245\\201\\0101\\3468}\\312\\210\\273\\236\\331\\033U\\000D\\031\\210\\025\\010\\210\\220\\011\\210\\362\\253*\\360?\\372\\275\\377\\3569\\362\\343\\021\\361\\220\\315\\301\\013\\355\\177~\\316EY\\362|\\311\\372\\234\\017\\226\\273\\362c\\247<\\365'\\347\\007{\\225\\340g\\011\\274\\013\\007\\341\\321\\235\\247l/\\274\\332#G.4\\305\\223\\323\\3053\\337\\367b\\373<}\\241g=\\014=\\361`YB\\223\\304XX\\263^\\234\\335\\372\\370\\247\\321\\267\\276\\353@\\024\\001E\\222H\\216\\235\012\\200\\0222\\033\\007`\\2627D\\222\\006\\037D\\024\\021\\313\\262J)\\025\\266(\\213\\302\\032\\013\\252M\\333umK*!t\\222BJ\042\042\\270\\323\\241\\001\\200\\211E\\243$\\001\\310\\265\\021\\223*\\244\\024\\233v+)\\261A\\325d-1S\012\\001T\\211\\330Y\\223\\215\\023\\037;C\\264Z\\255\\336~\\373\\355m\\3234\\276\\033M\\206\\200\\272X,\\276\\373\\235o\\265\\333\\025\\204\\356\\205\\313\\207i\\273\\271~x\\351\\335\\357\\277U\\0324*\\323a]\\224&\\200&\\314\\206\\014\\235\\3672\\002\\262\\200\\210J\\210\\244\\324\\353\\305\\000\\010`\\370\\031N\\243\\013\\237\\366\\261\\276\\204\\027\\354\\274\\213^\\274^e\\177\\362J\\317\\330\\177\\354v\\375\\025\\350\\302e\\237~\\271\\207\\367:\\377\\363)\\217\\375\\324\\377\\356l\\274\\307\\251B\\236s\\035\\275PS\\346Y\\003\\362\\321\\036\\375$\\017\\311\\356JO[\\372\\2712{\\357.l\\021\\340\\261#;}\\036\\224\\260(\\313\\233/\\275lm\\341\\3232\\370\\344\\230T\\024\\225PE{\\017\\0272\\261aCE\\025{\\025\\314\\030\\343RJ\\010j\\230}J*\\2222\\015c\\347\\325GL\\021\\311\\020`\\334\\025\\251\\000c\\020\\025\\30103\\243\\212J\\022\\245>\\235I\\274oE=d\\357\\006\\204K\\007\\323+G\\373{\\223\\261!\\252\\312*\\204\\340c@%kmYU\\314\\270\\334\\254Of\\247\\227\\257^m\\273\\260\\015\\335\\301\\360\\322\\367~\\360\\375\\365z\\275\\236\\235`\\333\\014A~\\365W\\276\\262\\274\\375\\323)\\371O\\337\\371\\356\\253?\\367E`\\241jT\\015'B\\020\\300\\004\\001!\\233\\025fR@\\005R&\\020\\300]\\355^\\004|\\222\\227\\343\\251\\037\\351\\321s\\236\\356\\265\\370\\017^\\236\\270\\3103\\275\\262O\\336\\356\\211^\\370\\274\\331\\000\\021\\001s!\\217\\347I\\375'\\216<\\363\\026O\\275\\376\\303X\\367\\277W\\343\\344a\\3609\\266\\212\\234\\253\\252\\035\\034\\035\\352y\\205\\020E\\020\\335M\\0109\\331M\\372d6\\206\\330z\\017\\252\\252\\224\\015($K8\\336\\2332\\363f\\263iVK\\000\\030\\226\\205\\240\\003\\000\\265\\264J\\321{\\237)\\224b\\214bmQX\\224\\014x\\002@@RU\\021\\215!`\\327u'\\247g\\000\\262\\331,E\\274H\\034\\224eQ\\024\\231\\241\\306\\030\\207\\210D\\230D\\201\\360\\332\\215\\353[\\357\\367\\256\\\\J\012\\327_~\\371{?\\374\\301\\351l\\301\\022\\016F\\253\\017~\\374\\356W\\276\\360f{z\\372\\205/|\\341;\\337\\177\\007V\\247\\353\\344\\207\\327_\\252J\\253\\026<V\\250\\024\\324\\010\\344\\364\\341\\035Qi\\217j~(t\\370?\\373\\275\\347\\351\\320O\\331\\277 \\336/\\352\\213\\237\\347\\310\\347:\\037\\020\\361\\241\\216~\\256\\034?\\246\\026\\237k\\261\\272[{\\333\\370\\341\\237\\017\\217g\\333!\\227\\353\\310\\335\\356i9\\333p\\356\\333\\331=Moq<b\\033<\\315G|Q\\245\\006\\005\\332\\375j\\367\\330\\317_\\237\\356w\\276\\360*\\017\\257\\006\\210\012\\310\\214\\006\\2004\\376\\325\\277\\375SV\\320\\030P\\245\\347\\207\\001\\356S\\033s\\210\\017\\241\\353|\\222T8\\013\\2501x\\320T\\025\\356\\322\\376\\376\\313/\\277t\\365\\312\\225\\252r1z&\\034\\016\\353\\252(\\014CY\\226!t\\336w\042I%\\245\\030 %BM)\\212\\246\\374F\\252\042\\222DDU|\\210\\235oc\0121\\005\042\\025\\225\\030Bne\\353\012\\347JDh\\332m\\347\\273\\252\\256^x\\351\\245\\177\\374_\\377Wo\\274\\371\\306;?yo\\266Z}v\\347\\356\\335\\373\\367*g\\013&N^\\332\\346\\345\\027\\256\\336\\376\\370#M\\361\\344\\376\\335\\320m\\313\\322\\331\\035\\0236\\240\\021\\260\\347*/\\367\\216/97b\\262\\257\\352b\\345\\372g\012\\236\\213\\347\\\\\\214\\234=\\233\\261\\363g/\\317\\220\\210\\237#h\\366\\350o\\317\\003\\234\\217\\275\\310\\3719OD@\\237\\242o\\374\\254\\247z\\312\\221\\213\\267{4\\337\\347qu\\350\\371\\215\\363y\\332\\377\\341\\016\\252\\2520s\\014\\236T\\211\\014\\031c\\255M\\222\\262\\317X\\001\\021Y4\\252\\202$U\\011!\\306\\242\\256\\206\\303\\312{\\357\\233\\004\\004U\\341F\\343\\352\\360`rppp\\371p\\2171\\335\\277w\\257\\363>\\305\\2501f\\375\\302\\230\\314_*\042\\022\\301\\267\\255Xk\\231\\0110\\223\\337%\\205\\204\\300\\310Dh$\\351f\\273\\215\\261E\\212\\200\\011\\322\\245\\321h@\\310\\256\\333\\032c\\022YAP\\302\\341p8\\275|\\010\\220\\366\\257_Y\\005\\277\\\\o\\336\\373\\3643\\0178o\\232\\353G\\007\\304\\334v\\333\\351pp\\353\\343\\217^{\\375\\215o}\\367\\255\\227^\\274\\321\\315\\217\\251\\2560\\251\\033\\0331.P\\024\\265q\\327\\234\\002Y\\335\\020\\315\\361\\025d\\205\\317\\321\\241\\037\\377\\000OS9\\236\\233\\030\\363\\271\\372\\372\\347\\037\\022\\237\\247\\317\\375\\007_\\374\\311\\027\\351\\341\\004\\217\\014\\241\\376Lx\\244\\005\\036\\277\\327\\347\\351\\315\\000\\360,\\033F\\037\\272#\\317\\257\\246\\002\\2243\\207E\\304\\020UU\\325\\205\\026\\262\\217\\222\\254\\210d\\342:\\020\\022\\221$\\011T\\352Ai\\013\\307\\006\\325\\247\\034^\\025\\365\\233\\315\\352\\356\\335\\333]\\273\\2161\\256W\\213\\305\\354l\\261ZJ\\212\\304L\\354Z\\337!\\242\\265\\0265\\305\\010Y\\315F\\004\\311\\214\\265\\224so\\001\\020$\\251-\\230\\210\\022\\304\\325f\\215\\307\\241t\\354\\214\\235\\356\\215+7\\350B\\340\\246\\2616VU\\005\\000]\\014)\\0317\\034rQ\\034\\275\\370\\302\\367\\377\\315\\237\\336\\233\\315\\256\\037\\036\\232\\256\\361\012\\333\\316\\023\\321\\307\\037\\377t<\\254S\\354\\272\\355j=?N\\315&YS\\223\\265\\305\\320bi\\300E\\264\\310\\000\\224\\365\\014M=\\367n\\022\\220D\\240@\\206D\\316\\321\\013\\217\\266\\350\\316\\017\\232\\001*\\270\\203\\034\\360S\\244\\343\\363\\277\\331\\263\\026\\274(\\340\\317{\\004=G\\202f\\356\\237Gz\\300\\3052m\\027\\037\\346!\\235\\033\\234\\237@\\031\\005\\220\\337\\344Q\\026U\\300\\363\\033+\\300\\205\\322r9~\\330'~<\\321\\367.\\016\\200'\\333\\360\\261\\316\\375\\324%\\307\\274\\340\\031\\333\\314\\306M9z\\240\\210\\250I\\025\\204P\\305\\222-\\313\\262\\235\\003\\210X$aQ\\320^\\246JT\\025\\021Q\\224\\361x\\030\\243o\\233U\\263\\335\\210\\306\\202\\355f\\273l\\273\\315r~\\352\\214\\365\\336\\317f\\263\\305b\\261\\331l\\020q0\\030\0121 \\233^H\\013\\002K\\202\\020\\273\\256\\353\\023\\332\\231\\321\\032bk\\020E\\0057\\233UYW\\2451^q\\333\\204\\263\\371\\212\\311X\\342\\203\\275K\\226\\231\\030|\\327 \\210-\\034 8\\347\\266\\247\\247\\365\\341\\341\\357\\376\\356\\357\\376\\213\\177\\361/\\307\\343\\361\\203\\343\\373_\\274y\\0034\\215\\352\\341b6\\337\\256\\016\\366\\246\\303\\325b1\\034\\326\\037\\177\\374\\361K_\\370b\\2638+\\206c3\\331\\307\\242t\\311D\\242\\004ED\\020\\004P`P\\002\\021\\005Bb\\201\\204`*\\346\\306w\\220\\304X\\203\\210Y\\3617\\306d_\\3219\\255X\\002\\315\\251\\366\0429\\213\\270\\207\\255\\365(D\\325\\224\\322Eg\\324\\205\\036G\\271:\\236\\252f42\\365\\0351\\377N\\001\\200. \\340Rz\\010\\251\\202\\236M#w&QMl\\271\\264N%\\206\\266\\313O\\022U\\3210\\000\\244\\224T\\373\\022e\\271\\203\\306\\030\\213\\242\\360\\3363\\263\\265\\326\\373H\\220.\\035\\214B\\354\\006e\\025:\\257\\252\\314\\274Ym\\231\\231\\214\\015Q\\272\\030Rv\\2023\\205$!\\004\\347v\\211\\361\\200\\347d\\000\\252\\312hT\\225\\264\\217\\354\\364\\3765\\000&\\316\\244\\235\\240\\231\\341\\023\\362\\263\\347\\267\\273\\230\\244\\016\\220[1\\021\\001>\\202\\027\\317\\305\\215\\0312I\\003*\\251\\212\012*\\251\\202#\\262\\004m\\214\\\\U\\373{\\227\\326'\\247\\200\\226\\240\\003\\365\\232|\\010^U4\\245\\030bP\\005\\220\\3305\\022\\333(b\\021\\330h\\360\\033U\\025\\241\\343\\263-)\\250j\\214\\302\\326\\324\\303\\241\\252\\006\\005F\\313\\266p\\326\\252\\252HDf[\\022%\\327\\266[\\225D\\214\\252\\210\\2421&k\\255+]6^\\332.\\000P\\002\\263\\\\\\266L[\\313g'\\017\\216\\213+d@\\0205z1\\026\\207\\243i\\273\\355\\214q t\\355\\362\\325\\221\\261\\247\\022$\\371!\\301\\245\\252\\2764\\036\\225\\244\\261\\363G{\\207\\337|\\353\\255K\\327\\257\\375\\315\\017~0\\271q#\\254\\027\\311q9\\252\\001B9R4\\246\\015\\232\\212\\022\\000\\030\\225D\\011\\304(\\200R\\002J\\210f<\\032\\270\\226\\275\\367\\210\\230$GO2\\303\\273 \042\\222\\001\\000\\311\\240j\\354eRJ\\201\\240\\317\\010\\351\\367I\\011r\\276\\010+$TV\\024\\002V\\004\\020\\3319\\013\\024`\\207\\205\\006\\201\\214\\367\\003\\330\\341C\\262\\254\\002\\026\\326\\235$T\\004\\004\\001\\021@t\\226\\211\\270p\\246rV\\022w\\2324%d\\356R\\020\\025\\021aU\\316\\356\\245\\014\\224L\\336\\020\\031\\200z8\\\\.\\227\\235\\367\\210T\\324nvzl\\015Z\\225\\024\\202sn\\\\\\325\\020\\302v\\273\\255KWX\\307\\035\\314\\327\\233\\020\\205K\\307=\\0358\\251\\212&\\005R\\005\\312\\205l\\020\\220\\263\\035);|\\001\\364\\014\\362)&\\331%\\314\\212\\366\\305:\\316\\001\\272\\242\\017K\\243^\\320I\\364\\\\\\372\\367\\004];\\023\\234v\\177f\\260\\\\\\036O\\276\\335\\326u\\015\\252GG\\227\\357\\374\\364\\303\\371z=r\\010\\301kh4t\\252\\242\\002\\232RR@\\324\\315j!1\\364TI\\2521\\371L{n\\255\\025@Q\\025\\004dc\\310\042\\242\\002%ef\\243y`!k\\306m\\022U\\325 \\245 \\022U\\305\\307\\210\\242\\242\\232D\\006\\325\\020Q\\001H\\201\\001(&\\014!v]\\330n\\267\\276k\\002\\023\\023(kJIS\\002\\000\\211\012]\\004k_\\275y\\363\\223\\367\\337=\\234\\216'U\\2657\\252.M'W&\\203\\375\\311\\024\\200&\\223iY\\326\\333\\316\\037\\037\\037\\217\\366\\246\\363\\007\\367\\313\\262\\332\\177\\301\\226\\325\\324\\267\\033T\\035M\\313u\\333\\317\\212\\250\\312\\273\\316\\205\012\\3069\\227\\3376\\245\\244@\\210\\222@H\\025\\224\\2240SHi\\257\\306\\021\\000\\020jV+\\255e\\020\\014)\\001\\000\\023\\365\\375^e\\247t\\356>a\\212\\275\\366\\222I\\246\\263Q\\272#\\236\\312\\237\\226\\241/^\\016\\212\\004\\021\\225\\263B\\240\\347\012\\203B\\352<Y6\\016-\\033f\\266\\340 \\011\\032\\346`\\342\\316\\243d\\255e\\346\\030\\244K\\021\\021TR\012\\335x\\177,\\321{\\357c\\224\\355r1\\030\\024\\241\\353f\\335Bc\\032\\016\\252\\222\\255\\306\\200\\242\\315j\\005\\304H8,\\255\\002%$\\221<\\251\\345@\\002@\\022\\000\\355\\245)\\000\\210\\3009\\026J5\\233k\\200z\\356\\267\\353\\351\\2472\\310G\\317g\\235\\324\\207G\\260\\207\\233\\023\\322\\3160\\314t\\006\\331\\272\\355A\\267z\\016\\221\\354\\267\012\\252Q\\305Z\\0336\\2537\\276\\360\\346\\337\\374\\273\\177\\013\\014IER\\222\\024%\\245()\012\\304\\230\\024\\010\\031\\332\\306\\253D\\310&c?#\\346\\033&\\021\\220t\\216\\0367D\\004\\310\\214L\\206\\251g\\225&PE D e \\305\\314\\266\\200F5\\3451\\210L\\310\\224\\225-Q\\015\\222\\332\\266\\335n\\355b\\261h\\366'\\216\\015\\023X\\227+\\004\\010\\022G\\337v\\313Eq\\351\\322\\301\\376\\224\\024\\206\\365`2\\032\\215\\206\\245\\212T\\345@D\\227\\313eQ\\024\\242\\272\\3314\\267?\\275}S\\271\\242\\222\\326\\241;Y\\231\\242\\033\\035\\024\\215\\026\\355\\022\\014\\003 \\221\042\\352\\316\\253\\004\\000\\000\\246i\\232\\030c\\214qW'\\251_\\222\012\\355\\270\\315u\\347F @&\\226\\220\\210\\324!\\003\\203F\\004\\020\\013F@HQ$1\\000@BE\\304\\224Y\\342\\005\\023))(i\\037\\312\\006$\\225\\010}\\350\\027\\021v\\2636\\241\\311t\\212\\304=S\\030\\364.\\330\\320EHQ\\203\\007\\313hLa\\254bT\\244A\\301AAb\\022PC\\214L$A\\014\\201pH\\221A%\\245\\272(\\0151\\023-\\227\\311\\262k\\342\\326 \\035\\354\\357\\357O&\\000\\240\\011,\\273\\341p8_.V\\233\\255\042$E/\\021\\224\\330YL\\200\042\\271\\020\\007\\242@\\312\\235V\\373\\014\\352^q\\310\\005\\343\\031I\\015a\\202\\244\\212\\242Q\\205\\261\\017\\210\\010(\\366\\231\\215\\200Y\\262#\\000()?B\\361#\\273\\212\\037;4\\362\\243[PD1\\206|\\354|\\360/\\275\\364\\022\\020V\\203:n\\027y\\354'P\\021\\311e\\260\\224\\030\\200\\231\\0152\\367\\332\\370\\005\\247J\\010A\\222\\212\\000\0423S\\206\\340\\011$2\\234\\025\\310\\236\\312_A\\021\\372\\3007\\200!c\\0141g\\022\\336,\\2712\\271\\010\\346\\221!\\222B\\010M\\323\\254\\327\\353\\256\\353:\\353\\014#\\033\\227;4\\221i\\332\\016`a\\231\\026\\247'\\216\\320\\021W\\205+\\255\\313\\205\\352\\330Z\\266n8\\236F\\242\\321p\\342\\3330\\177p6r\\303\\324\\204\\270je\\333\\325\\373T\\210n\\232\\216\\007\\305\\271\\351$\\240\\240\\232\\223\\177\\314l\\276<\\267lT1\\244\\014\\013O\\212 \042\\310|>?\042* \\222\\210\\244\\200\\300\\222\\010\\000\\362\\350\\227\\204\\272\\023E}\\223\\365n[\\344\\014\\201Q\\000\\352\\3137g\\333\042]\\250\\320z\\256v\\023\\002\\001\\031\\002\042\\004\\276\\210R\\302\\322T\\232\042*$\\037H\\001Ub\\214))\\030\\243\\214\\231@6\\327\\350CUC\\254\\232\\320pU\\024\\353\\345\\202\\224\\004aP\\014RY\\335\\273s\\357\\370\\370x\\271\\230\\015\\006\\203\\203\\351\\336x4\\230\\216'u]uM[\\272\\3029\\227@c\\222 I\\005\\201p\\273ms&\\375\\303raITEE\\316\\213X\042\\202\\240\\032\\314j\\035\\242B\\212\042\\0325g8)!)\\001\\013(\\201&\\225\\363\\330\\237\\240\\212\\240\\234sv\\001\\252\\364a\\275\\276q\\340\\221\\345\\\\-\\2111\\032\\307\\002\\372\\332\\233o\\274\\365\\215\\277DI\\346!7^o\\032\\002\\220\\222\\032\\223cg;\\204~\\206\\346\\210 qNK!4D&W\\253I\042\\242\\001%\\363((\\366l}\\006\\010\\201QSL)\\366\\301\\201\\236\\314w'\\376@wV\\021\\304\\\\\\310\\242m\\263{D\\022\\024\\345\\256\\354\\013\\210\\246\\200j\\337\\177\\367o\\037\\334\\271K\\252\\243\\272B\\321\\354%\\234\\317\\227foZ\\017\\301\\007=]\\315\\025x>[\\025\\311\\334\\247\\373u=>\\252\\247\\024\\202_\\255\\305\\342h2\\331&H\\244\012\\2202p\\024)\\001$\\004\\263\\3314\\210Jdz*\\277\\235\\216\\321w&\\221\\363\\301\\207\\210\\011@4\\242$%\\205$\\252\\230R\\000 H\\202\\310\\320\\263\\363H/\\223\\220\\023\\246|\\301\\213\\035\\027{\\343\\022v\\022\\253\\027\\324\\204\\230T\\022@\\314$v9\\271\\255\\247\\241Q\\313\\234\\353\\245\\206\\300\\205\\211\\304(1gjn\\331\\272~\\212T%\\354c\\237\\371\\2661H\\327t\\271\\260\\351\\273\\237\\374\\344\\364\\364\\364\\376\\361iUU\\004\\326w\\262\\230or\\376\\305v\\273\\355|\\363\\352\\253\\257^\\273~\\035PSL\\316\\230\\210i\\265\\336Z[\\000\\000\\221!\\002DVM@\\220RH)\\021 !\\365y\\332\\2309\\352\\210\\255\\211\\202\\210Q\\344a6P\\226\\003\\004\\000(yx\\364[U\\004Hz\\236-\\327\\007\\272\\211Qr\\2016}\\314\\357\\001\\252)Fo\\234+]yv|\\362\\033\\277\\365w\\376\\346\\257\\376<\\3231\\252H\\224\\224RL)\\244$\\200D`BR\\306\\235\\373X\\025\\261\\357\\356\\314\\026\\000\\240\\317a\\340s\\313\\226\\031\\2201\\263\\355\\365\\305\\277\\001RJ\\010\\002m\\333\\211\\204\\230sx\\231\\220\\211\\010\\224\\022\\234\\177\\303|\\247\\024%\\205\\230\\222@\\2141\\242\\324IU5\\244\\304D\\004\\0101\\375\\315_\\177s\\273\\\\\\262\\300\\301t\042!\\030b\\000\\360)\\3462\\\\\\266\\344\\346\\344\\264\\032\\014\\267m\\267j\\332q\\212\\235\\367\\363\\371\\234\\346\\263\\311\\376\\025k&yR\\024\\224\\330'e\\212\\002&\\204\\204`B\\022\\242\\3765Uu\\007\\230G\\021A\\246^\\207\\336\\271\\347\\010@$\\021*\\312N\\206\\241 `\\202\\324\\347r\\367\\251Lx\\276UM\\347\\212\\314\\305\\016\\255\\212\\273R\\\\\\017\\223\\240\\000\\300d\\274+\\312E\\177\\011b\\316\\262\\316J\\0135\\034\\211\\010\\225\\024R\\210\\021c\\236\\354Ds\\254a\\007\\274\\024\\021iZ\\347\\\\\\033\042\\021\\375\\273o|\\363\\364\\364t\\377\\340\\312x\\214\\241\\363>\\264(\\251\\256\\312\\203\\351Y\\177,\\364\\000\\000 \\000IDAT$\\306h,-W\\233\\301be\012\\323\\263q\\032\\036TU\\014Y\\345\\3113\\010av\\030\\261\\212(\\022\\357\\362U\\004\\000\\023`.\042\\206\\300\\206\\373Z&Y\\244_\\230\\267\\360\\274\\035\\000\\000\\220\\263\\367\\022\\021M\\306?J\\257\\222 \\000\\3509UZv8\\022\\200\\210*3\\253\\252O\\221\\255\\271z\\343\\372ko\\274\\361\\343\\357\\377M\\224\\244 Q%\\252\\234W\\335$\\242\\030\\2432#i\\226\\270\\230\\261\\210I5\\373\\216\\000\\001HT\\024\\020\\030\\330\\220q\\014\\334;m\\0255A\\022\\201\\230\\242o\\332\\266\\333\\206\\020\\214!\\242\\3222\\2631D\\250\\200\\224s\\256\\021\\224P{S\\266\\177\\341\\030c\\222\\220yBB\\010\\002\\240)=\\270w\\372\\203\\267\\276\\233\\272nP8\\003\\210\\252\\301\\267\\017\\316V{\\203\\301lU\\005\\340r8\\236/6\\353U\\263\\\\7\\336\\371C\\322\\016B\\\\\\237\\361v>\\346HV\\232\\260US(JB\\321\\254\\360\\001%\\214\012\\375|\\204\\332\\323\\252*)\\345L\\236\\220\\342\\271o\\370\\\\\\361R\\300\\244Hd\\0001\\366\\346\\240\\005DQ\\310f\\031\\366\\035Qw\\345\\014\\021@\\317s\\373vq\\350~\\246\\026\\245\\004\\000\012\\011\\0204\\323\\333d\\344+\\200\\344\\004I\\315>\\273\\354\\365\\263\\304\\314\\254\\242\\022\\025 eRd\\353\\034*\\250h\\214\\031\\256\\220\\362\\350\\3140\\261\\266\\365\\326Ug\\263\\263\\272\\256o\\335\\271\\303\\306}\\372\\331\\035W\\316\\333\\355V5!\\350\\260\\256\\214-\\247\\323\\361O?\\372\\360\\370tv\\343l\\361\\312+/\\215\\307\\343\\365\\246\\361)2[\\004V\\005\\200\\200\\210D\\001\\231v\\015B\\242HH\\002\\2324{\\244\\201\\022&\\211\\273.\\333\\237)}]\\327\\363y(\\233\\213\\212\\310\\330\\2234\\003@\042\\312\\257\\234\\375KF{\\226\\025yd\\213 \\222\\252\\252j\\267\\353\\246\\363W\\016\\016\\266g\\017~\\371\\327\\177\\365\\335w\\276\\027\\261\\205^\\031\\007 D\\0016\\310L\\000\\202D\\314\\254*\\371\\313\\002@J$\\222\\277\\024\\250\\246\\334\\364\\314\\026\\231\\004Rvh\\247\\224\\307\\241\\206\\220\\274\\367\\307\\307\\3071FC0\\032\\215\\252\\242&4\\204\\006wYj\\002\\217\\240\\322\\263\\011,\\010AR\\214\\022$\\305\\244>F\\213\\010\042wn\\335\\272w\\347nh\\332q=hW\\233\\361\\336\\250Yo \\204\\262\\256\\200p\\333\\265\\203\\203KQa\\333\\372&D\\257\\376\\356\\331\\311`:<\\032\\216\\254\\203\\024\\232\\340\\327\\256\\332\\213\\340\\005\\200@X\\263\\276\\003\\254(\\010\\346\\370\\344\\254,K\\000\\310n]\\201\\276\\246yo\\244\\321C\\306\\347\\204@\\252\\206\\214O\\331\\251\\324\\353`\\204DD\042X\\024E\\036\\213L\\014\\210)%cL\\222\\300L\\250\\220$\\211\\010\\021\\346\\036\\233RR\\004\\347\\034\\021\\005\\237\\020\\321X\\253\\252]H\\000\\275;,3\\201g\\367n\\256W\\266i\\275\\210\\224eED]\\024\\221\\350\\272\\336\\353\\002\\200DLJ=h\\017\\271\\363\\201mu2[\\031[\\335?\\231\\373\\204\\226M\\020m6\\036\\005\\025\\020Ug\\233\\355w\\177\\360#b8\\272t\\260],\\375\\247\\267\\022\\362\\365\\353\\327\\006\\203\\001\\242\\211\\011\\0101s\\240\\000\\241&\\201 \\210\\312\\314!\\004\\310Sn\\326\\016\\0211&\\000\\220\\020\\313\\262\\024M\042\\342\\234\\013!\\244\\020\\213\\242PMD\\224\\351\\307\\2114F\\257\\212e] C\\222.g\\202\\250\\010\\241 \\242\\244\\256,\\212\\305ba\\255\\265\\326\\3668\\241\\224\\220\\310Z\\327\\266mQT\\022\\323|\\2610@o\\274\\371\\205\\242\\254\\201\\3226\\264\\031\\244\042\042EQ\\225u\\335\\372X\\226eF+1\\365n\\310\\030c\\014!wq\\300\\014\\342\\206\\224R\\212\\002\\021\\220ID6m\\003\\000\\365`\\204\\200\\333\\325z\\265Z\\265\\276\\233N\\247\\203\\2526\\206\\214\\263\\002\\232\\2475\\314\\227\\355\\343\\022(\\011\\020T\\011\\007\\243a\\2141\\2458\\034\\016\\327\\353\\365\\225\\253\\327\\005P\\025}\\327\\375\\353\\177\\365\\207\\214 1\\225u\\355\\254]-\\026\\365\\336dX\\327w\\036\\334\\277\\214p\\351\\360r5\\0306m\\327\\372\\260m\\272\\351\\301\\320\\213?\\235\\237QQN\\256^\\035\\256\\347\\352\\006\\021IMY\\024\\3162\\245\\316[\\306\\365rY\\016\\247I\\305|\\373\\333\\337YoW\\231_h0\\030}\\355k\\277\\375\\307\\177\\374\\307\\333\\355\\266,\\313\\213\\032B\\257\\370\\003d\\271\\302\\300Jz\\276\\025\\024\\203\\206,\\221\\222O\\376\\325\\227^\\275w|\\257\\335\\264EaU\\323\\336\\376dX\\215\\242\\206\\340\\263\\034\\322\\020BY\\226)%\\354=D\\220GQJ\\251,j\\344\\276,;\\0334\\330\\303\\211RJ\\326\\024\\210\\250\\304\\246\\361\\204\\206\\331\\026\\226\\275\\370\\3542\\317\\021\\025\\3329\\301\\244\\013D4\\252+\\203\\024B<\\236\\315WM\\327\\315\\327\\223\\311\\021\\000)\\223*\\003\\210\\202D\\020H\\262\\330\\264\\227.\\355w\\021\\336\\376\\341\\273\\037|\\374\\311k\\257\\275vxx\\230\\242\\346j\\304\\314\\006R\\357\\020f\\244\\010\\222\\222B\\357fN\\210=\\3419\\000\\240\\261\\314V#\\346\\304kDbr\\252\\340}*K\\023C\\330n\\267EQTu\\221\\242\\256\\026Kd)\\353\\022P\\327\\233\\025\\000Xk\\001 \\204\\360\\321\\207\\037 b\\010\\341\\364\\364\\224\\231\\317\\316\\316D\\344\\353_\\377z\\002hV\\015\\001\\030c\\206U\\205\\261kSx\\345\\3157\\336\\177\\347{h,\\245(Jh8WP\\0062Q\\2223\\3069\\253\\252>\\2641FDd\\303\\231\\021=E\\037c\\334y\\356\\010\\221\\272&\\356\\355\\355\\325\\243aJI\\024\\227\\313\\345j\\263\\211\042\\323\\351t4\\032\\025\\326e\\335:\\317\\275Y\\263\\210\\222zo @~\\205\\301`\\000\\000\\306\\230\\266\\363ggg\\227\\016/\\233\\302\\235\\236\\234\\035^\\276\\362\\247\\177\\372'\\367\\356\\335\\333\\254\\267\\210XZg\\211I9\\306\\010\\340\\272\\340\\025\\301\\213\012\\361|\\271\\350\\332\\200\\3101FI\\260\\267\\2677\\035\\017f\\017\\356\\\\}\\371\\365\\377\\355\\177\\371\\247\\037\\235\\256\\264\\034\\275\\374\\346\\353\\245\\345\\353W/_\\232N~\\351\\027\\177\\245\\331l\012\\343L\\024M\\200\\245+\\022\\244\\220\\324UuT\\00069\\333a\\267f\\356?P\\305\\030<\\0202\\032\\344\\354\\245\\024\\220\\250(\\206$5\\261\\260\\245\\217\\335h\\262\\367\\351\\235\\333\\333\\326\\013@\\222`6M\\333\\304\\263\\305Y\\333\\372\\272\\256sd\\377\\356\\203\\343\\020B.\\020\\221#vD\\024\\243\\370\\220\\02493\\303\\366>\\306\\013s\\031\042\\213\\242\\010\\344\\002\\262l\\210UP%\\347\\345\\363\\316'\\223/\\230c\\204>\\264u5\\004\\224\\3537^\\034\\214\\306\\363\\331\\246g*\\003\\005M\\252\\011D\\025R\\323n\\227\\333\\246*\\212\\220\\344\\301\\361\\354l\\366\\275\\314\\261\\371\\306\\353o\\226e\\351\\\\\\011 \\210\\214\\006\\015R\\002\\031\\326\\331\\324Q\\244\\376\\341\\211\\310 \\225\\2568~p{:\\235:\\347\\216\\217OF\\243\\301\\336\\336\\301\\203\\007\\367\\234\\261\\236\\2023v:\\335\\2131.\\027k\042\\036O\\306\\255_\\305\\320u]g\\255\\035\\217\\307w\\356\\334\\371\\223?\\372\\343o~\\363\\233\\371\\341U\\365\\301\\203\\007\\207\\007\\007\\326\\332\\275\\275\\275\\257~\\365\\253?\\371\\311{\\037\\375\\364\\223\\365z}||\\337\\0219\\326\\2015\\237}\\360\\001\\2621e\\211L\\3341\\2221\\3262\\263\042\\264\\333&$\\337\\372\\316Z\\026\\021\\037\\202B2\\306\\264m\\313\\314\\010\\014\\004\\316\\272\\341pX\\327\\2651\\356\\370\\301\\331x<\\015)-\\233\\245\\217i\\273mUq4\\232\\324u]\\027%\\023\\244\\224\\020!W\\336!\\300,\\321{\\1779\\202\\200\\262u\\343\\361\\330\\030\\323\\353\\315\\251\\027^\\316\\271\\273w\\357\\276\\365\\326\\333\\253\\315:\\205PXk\\230C\\347IC\\323\\210aqeY\\215\\206\\313\\315z\\3336Q\\305\\030\\3235m\\210\\233\\343{\\267M\\360\\305/\\374\\374h\\212\\246m\\333\\223\\023]\\007C\\305\\342\\366\\375\\243\\227o~\\362\\316O\\026\\303\\301\\017\\376\\352;e5\\272r\\345\\252i\\275w\\266\\004\\242\\214\\271\\375\\363?\\373K\\025\\314x\\326\\335\\250\\305\\013\\004\\215\\304\\006\\263\\220>wZ\\235\\033|\\352\\301\\026\\216\\014\\207\\024\\021\\331\\225\\2051\\334\\027\\015\\023\\261\\326\\222\\222c\\202\\024E\\2440\\314\\240\\231)/\\306H\\250\\206\\221\\201\\353\\272N\\331\\016\\327\\230+\\207d\\227\\0343\\307\\030Q\\321X\\007\\310\\000\\244\\0021\\005g\\035\\252\\2363<aO@\\241\\002`\\234\\255\\252\\252\\322\\232\\231g\\263\\231\\265v6\\2339[+Qv\\261+\\220*\\241\\202j\\032M\\206m\\333n\\333\\256\\256kW\\352f\\263\\011\\235\\257\\252\\352\\373\\357\\374\\250(\\212\\354EADk\\031\\021c\\014\\347\\036!\\342\\034\\377W\\006&\\242\\256\\013\\245+T\\225\\210\\352\\322\\345\\217Z\\024\\326\\020\\207\\020>\\372\\360\\375\\367\\337\\177\\277,\\313\\2337o\\026E\\261\\\\\\315\\226\\353\\323\\375\\203=cL\\214\\321{\\177\\373\\366\\355\\263\\223\\323\\262,\\327\\353u\\010a<\\036\\023\\231\\345b]\\024\\305z\\265\\375\\237\\377\\247\\177\\372\\356\\273\\357u!\\\\\\275z5\\204\\340\\014I\\362F\\242\\203X\\0228\\347\\2343\\201\\021\\015#rRL\\232\\214+f\\263\\323\\331l\\326\\266\\255\\210\\224\\245\\273|\\371\\362\\344\\362\\344`\\377\\3209\\227g\\003\\000\\332\\221\\344\042\042n6\\233\\323\\323\\323\\371rYT5\042\\326u\\275\\267\\267GD\\306ZLQ$\\307~\\022B\\257\\221\\212h\\022a\\242\\336!\\210h\\013\\207l\\227\\353Mh\\232\\375\\203\\251s\\245\\367\\236\\214\\375\\213\\277\\370\\343\\331bNh\\202xW9Dl\\332uI\\230\\014t\\301\\227u\\341SL\012M\\327\\001b\\033b\\214R\\227\\356\\346k\\327\\367&\\243\\305\\331l2\\336_\\235\\234|\\351\\365\\327?\\374\\363o\\036\\356_\\271\\367\\331\\355\\303\\311\\370\\235\\267\\277\\377\\353\\277\\366\\025\\213D\012\\177\\375\\227\\177e\\246\\323}\\000\\350\\272\\016\\000\\206\\303\\341lv:\\032\\215\\316\\353\\343\\022?\\342'\\006\\000\\271@\\335\\366\\230N\\302\\010\\245\\263\\000\\366\\356\\355[ \\251.\\013\\000\\320\\256k6+\\024B\\003\\205\\265D\\220\\015q\\006$FcX\\2250D\\024u\\240j\\330\\373\\006\\020LvTaRM\\230T!Ab\\004-\\334\\200\\015\\372\\020\\230-:\\313Q\\013\\313\042\\2623`\\362\\222\\000\\200\\231c\\224\\246i\\024\\0223+\\244\\341h\\3226>\\204\\240\\3316\\206>\\242\\251\\000\\310\\332u\\035\042$\\221\\371r\\301d\\213\\242\\312\\371s\\303\\361\\240\\267\\3265\\222b\\276Q\\010\\241t.\\273\\024\\015\\021\\202f/\\257\\0009gV\\233\\265\\265\\\\\\226\\345\\331|\\036B(\\235\\211\\321\\317\\347\\363\\373\\367\\357\\336\\271}\\273\\353:\\221\\364\\336{?QU\\353\\270m\\327\\233\\365:\\306\\230\\223D\\346\\363\\371z\\275\\021\\321\\361`\\344\\275wl\\367\\306\\323\\254'\\210\\310\\267\\277\\375\\335\\351tZ\\002K\\220\\371\\331YJ\\0114\\262\\306\\313\\373\\343\\220\\232I\\351\\2541\\354\\212\\202\\214\\252\\306(\012X\\026\\325\\336\\301QQ\\015\\227\\313\\305|>\\217*J\\\\\\326\\303\\315\\246\\021$\\347\\034\\273B\\005\\005\\250\\013I\\243\\334\\272u\\207\\311n\\267[%\\034\\216\\212\\242(\\004!\\017iD\\324\\335\\347W\\355Y\\2511\\023\\206\\001\\211\\200J\\312\\301\\201\\224\\022\\021y\\357}\\327UU\\025B(\\212\\342;\\337}\\373{\\337\\177\\273\\355B\\020\\015!\\330\\321\\010\\000RJ@\\246(\012ch\\3236\\307\\247'\\327\\256\\337\\314\\212\\376\\351\\351\\251\\261v\\265ncP\\357\\203\012VE\\355\\333\\360\\233\\277\\361\\033[\\036\\374\\360\\223;\\325p0\\335?\\370\\273\\177\\377\\267g\\247\\307u9\\000\\346W^\\177\\303\\204\\320W\\227\\011!l\\267\\333\\361x\\332\\266[\\352\\253q\\002J\\217\\001\\200\\235\\306\\224\\275\\031*\\230\\021\\261\\304\\220#d\\220\\235h!\\020\\303\\355\\333\\267\\313\\3129[\\202\\304\\341\\240h\\032\\037}$\\312\\272\\027\\240*\\021HL\\210(\\216U\\265\\3336\\252*\\205\\005&@F\\303\\316X\\316\\211\\0111\\005\\011)\\372\\246i\\312\\262v\\316E\\037\\332\\365\\326\\225\\365x<I\\330\\263/\\242\\202\\202\\364\\016\\034Q\\301\\024\\266^I\\030\\211\\014I\\004Dh6\\333\\256\\353\\014\\273\\214I\\311^\\341\\234\\002\\205\\2101\\305\\341ph\\255m\\333.\\006A\\304\\\\\\351\\332\\202\\331\\345\\352)\\000$\\011\\252J \\336\\267\\222\\002\042\\366A\\245\\024\\021\\210\\235%.\\016\\016\\366\\346\\363\\371|>\\337\\237\\356\\305\\344W\\253\\325\\313/\\337\\334lV?\\367\\2057/\\037\\035\\275\\367\\336O\\226\\363\\205u\\\\\\225\\303\\\\\\363e4\\234d\\324\\233\\357BY\\014\\253\\243\\221\\265\\026E\\207\\203\\351|>o)Zk}\\347G\\243\\321\\3137\\207\\307\\307\\307D\\024Bp\\266\\264\\2655\\254\\335f\\025S\\202\\220R\\251QEU\\214a\\000RHH2_\\255\\235s{{\\007\\223\\311d<\\236\\314fg\\263\\263\\305z\\265=<<\\364]4\\306\\210H\\327\\371\\246i\\274\\367\\032\\025\\004\\221`<\\036\\273\\252\\254\\353\\241\\261\\226\\254\\311\\346>\\000\\304\\030z\\362\\270\\244\\240I\\204e\\347\\330\\025\\021\\225\\036\\240\\246\\002\\306\\030B\\021\\204\\024\\265\\213\\301\\307\\360g\\177\\366g]\\033BH\\235\\217\\002\\224u\\302\\036\\036\\250\\302\\200uU!\\021;F\\246\\272\\256\\001 %\\031\\037\\034\\234,\\326\\026\\365\\362\\345\\313\\353mc\\266\\233Kl\\277\\372\\265\\2575\\337z\\353\\257\\276\\373\\326w\\177\\364\\316\\253/\\277\\364\\341\\355\\333\\253\\325&E\\270tt\\331\\314\\346\\013f.J\\327\\005\\337t\\355t:].\\327UU\\305\\350\\2635\\366X\\207\\266\\304\\347\\236Q\\310\\361A\\310\\23620\\206B\\210D\\200\\232 E\\237\\266\\314\\270\\230m\\331\\240e\\243\\232|\\333u]\\023C\\2101\\316OO\\000\\300Y\\003\\000]\\323\\002\\200u\\254\\000\\266p\\3149u\\036Tb\\362>g\\347\\237\\235\\235\\271\\252\\232N.)P\\022\\274r\\375Fi\\270\\013Q\\200{\\267>i\\246\\314\\225\\230\\004\\244\\260\\205\042JL1\\004\\011jK\\3235\\2151F%@\\306`dg\\212\\200hO\\216\\266X\\316\\030L\\366E\\304\\030\\235+\\353\\272\\354\\272V!Yv\\326\\261\\306\\324\\266\\333\\030#\\347\\230gJ\\242\012\\202)%\\211\\301\\332\\302\\241\\255\\352\\322'?\\231\\214B\\010\\313\\365\\002I\\367\\017\\3677\\355v8\\032\\250\\246\\375\\375\\275\\257}\\355\\267\\313\\262\\014\\261\\363m\\310\\037u8\\0342s\\306 \\020\\021\\212f)S\\024\\305b\\261\\360\\336\\247\\224NOOC\\347\\313\\262\\334\\237LU\\025\\331\042\\003;kH\\272\\315\\312hX\\235\\335\\037\\015K\\015m\\347\\003\\364\\325\\310\\204\\254\\273tp\\224]O\\204n:\\335\\257\\252j\\273\\3356Ms||\\202\\210\\3169\\347\\234*\\206\\220\\214qeUVE\\035\\203\\270\\2620\\205\\213!!RQ\\024\\331^\\177\\030\\216@\\352\\3477\\331\\301\\260\\020bJ\\014P\\224E]\\327eY\\212H\\343\\233l\\3272\\3637\\276\\361\\215;w\\356\\270\\242\012\\222D\\244(\012%\\336\\254\\026\\225\\201(\\251\\353:c\\213\\311d2\\034M\\262YY\\015\\007\\203\\301`\\266\\\\\\3167\\315\\341\\321~1\\031m\\222\\036\\257\\026\\207\\203AGx\\353\\344\\344K\\277\\372k\\345\\265\\033I\\243\\246\\370\\333\\257\\276\\214\\210e=\\3366\\235\\031\\324Uv\\364:\\303\\326\\226]\\263-\012K\\004\\205e%d0\\272\\253A\\324\\253\\034\\301g\\232\\364\\363\\203\\371=\\215\\341\\242\\260Yu9<<\\220\\230\\232\\246\\251J'\\036\\2343)\\245\\305|\\331n\\326\\314\\\\W\\245\\033\\024\\0206 \\321\\262A\\324\\340*\\000\\261\\304Qe\\033\\332$\\220@Q4\\033\\243\\014\\211\\015\\214\\206\\265*\\206n\\003@\\256\\254\\367\\206\\345\\250\\266a\\266a[\\00313e\\313,\\317!Y\\216\\032c\\310\\022\\200\\365\\344\\253\\262\\\\\\205U\\351\\334\\005\\264'\\212\\352\\271\\204\\260\\266\\024P\\004f6y\012\\022\\221\\324\\327\\210gc\\214a\\273m\\226\\263\\331\\242i\\032f,\\213\042\\003\\036\\000 F/\042uQ\\326\042\\253\\246)\\313\\262(\\212\\325bqrrB\\014\\245uM\\263y\\351\\346\\315\\262,\\001R\\263]\\266\\315*#\\002\\021\\270r\\325j\\2760\\3068g\\2200\\245HD\\316\\262\\265\\266\\353\\272\\275\\351\\330w\\221\\231_z\\361f\\256~B\\004\042\\022\\001m\\341Db\\014]\012\\215\\205\\370\\376\\273?\\034\\225f\\273\\2325M\\027AIr\\011\\357\\324u>\\243\\244H\\001\\221\\\\UW\\246\\364u\\227R\\352b@Dc\\234$0\\034J[\\216\\206\\303\\020\\202\\367\\033\\004k\\011\\275&\\020\\320\\024\\266]\\303} \\271\\317\\027A\\304\\236\\324\\023\\021\\021\\031\\242\\250\\260\\345\\242\\260u]\\226u\\331\\372\\356\\354\\364t\\1772\\351D\\210\\315\\377\\373\\007\\377\\272\\252\\207\\313\\3156\\206\\244\012\\256p\042\\261i\\232\\301t\\204\\226\\224\\014\\273*\\011\\024\\31696\\303A\\021;/\\220\\220-s\\211`\\326\\333nX7\\303\\311x\\276\\234\\035^\\213\\247\\263\\263\\361\\364\\322\\265\\23377\\276\\235-f\\242xvz\\252\\363m\\362\\311\\220\\004\042r\\316\\255\\273\\226\\030XSQ\\024>\\006\\334\\031Z\\204\\224c?\\210L\\004\\306\\330\\3167\\306T\\331\\254'\\242\\306w\\326Z\\006N)\\226\\256*\\212\\002Q#\\004;\\032\\024\\306jQ\\244\\340\\013g,NG/\\\\\\307\\344\\013g\\242on^\\236~v\\353\\223\\355z\\265\\177\\260\\3276\\335d:\\256\\\\A\\316E\\300\\034\\312f\\244\\374\\316\\2528\\030\\014\\254\\265ggg{{\\007\\314\\334y_\\327\\003\\0211GS\\245b\\353\\023\\000\\020Q\\362\\0014U\\205E4IB\\327u{{\\373m\\333\\326Ua\\214i\\266+\\215\\035c\\317\\020\\223R\\002Dg\\034\\227%\\222\\361Q\\264\\017\\367\\364\\2122Z\\353\\214e\042\\223\\345\\177\\204z\\270\\367\\332\\376eD\\2141\\342\\005\042\\230s\\223\\203I\\021\\272\\341\\240<>\\276\\277?\\035\\276x\\343\\212\\017\\255e\\303\\234\\023\\361\\2221v\\265\\230}\\360\\301\\007\\313\\345\\362\\340\\340\\340\\340\\340\\320o7m\\353\\037<\\270w\\362\\340\\376\\301\\301^a\\335b~v\\355\\332\\265\\037\\377\\370\\275\\243\\243\\243\\321pr\\365\\352\\265\\262\\032\\2005\\355zc\\312*\\250\\332\\262\\010!$&\042Z6\\376\\370\\376\\203\\217?|\\357\\354\\370^lW\\224\\302\\215\\243K\\265!\\206TWe\\033\\032\\265\\001\\220P\\024\042\\260\\2605\\3062[t\\321\\251\\021\\233\\235\\307d]]\\324\\020\\261Y\\267\\326\\351h\\\\ jL[g0A\\352\\232\\204LH\\274\\013\\264\\211*\\210HF\\177K\\202\\2424m\\263-\\0347\\355\\346\\362\\341\\230\\254\\354\\037M\\357\\337\\271}\\274\\230\\015&\\323u\\320\\177\\363\\027\\177\\335x\\3344]\\010\\022c\\346\\232\\222\\256Y\\273\\222\\227\\333\\015\042\\006\\034\\372\\263\\225s\\316\\252\\336\\270~\\275]-\\256]=\\372\\301\\273\\037$\\001\\007\\305v\\326\\214\\271d\042\\337m\\274_\\243\\304\\350\\273\\263\\223\\331I8}\\375\\027\\276tg\\266Z\\236\\234-\\037\\234\\305E\\363\\341\\217?0\\203\\302\\210\\010J\\2704\\035\\305\\024\\274O\\3017\\205s\\332C\\2562\\216\\206\\021\\221\\011\\235\\261\\306\\230\\252\\342\\262\\250\\273\\256\\363>\\000Rm\\355`0h\\333\\226\\214UM\\261\\335 \\001#\\251&\\337t\\252\\351\\340`\\357\\354\\364\\304\\032\\370\\341\\333\\337\\276r\\371\\322v9\\033T\\345\\374\\354\\370{o}\\307\\030\\372\\235\\337\\371\\235\\325\\374\\364\\303\\367~\\370\\302\\013/\\\\\\276zm\\271\\355\\356\\336\\273\\267Z\\255\\307\\343qUU\\313\\345\\322{\\237\\215\\375\\263\\263\\263\\272\\256\\263\\272vtttxx8\\030\\355\\011\\266\\276ishPs\\314\\255\\003\\021a\\202kW\\256\\224%\\335\\376\\344\\343\\037\\375\\340\\207\\323\\351\\024\\021._\\276\\002\\202\\336\\307\\242,\\217\\216\\216\\252j\\320tAb(*\\027}\\3108;$\\262\\314\\271jN\\327l\\013&\\303\\206z\\202\\332\\324\\206\\255\\346H\\022\\363\\271Q\\204l\\220(\\211\\370\\256\\333.\\216\\377\\342\\235\\357\\357\\355\\355\\275\\372\\352\\313'\\307\\307\\314\\250In\\337\\371LB<==\\231/\\316\\274\\367\\022\\003\\021\\335\\372\\364\\263\\224\\322f\\323\\214F\\243\\350[cHd\\353\\333&\\245\\024\\272\\265o\\027g'\\351\\356\\355O\\036\\034\\337!tW\\257_\\277q\\375\\305\\020\\272\\375\\313\\327O\\027\\313\\301p\\272i\\266\\326\\362\\265\\353/\\325\\203\\361\\027~\\376\\313\\251k|\\263\\032\\227\\366\\364\\336\\355\\343;\\267\\226\\307\\367?\\271u\\353\\372\\215C/^)eN`\\003\\306h\\246\\311a\\205h\\021\\003\\202\\002r\\206k\\367(\\354\\224\\242\\250j\\366\\305\\021\\031\\262@\\000)\\2011\\306\\020\\244\\240\\304\\\\\\024\\205h\\024\\021\\222\\030=XC\042\\321\\031.\\313\\362\\360\\350`\\275\\335\\334}pL\\256X7\\355\\362\\223\\317\\336\\377\\311\\007\\255\\217\\3146C\\240PDR\\020\\011\\375\\367\\002\\016B\\345p\\234\042\\004\\357\\035\\241z\\317\\020\\327\\233%Q\\025\\332`\\313\\242.\\007\\261\\363\\206\\207\\004zr\\357\\356\\260\\034\\314c\\234L\\016>\\275u\\367\\305\\233\\257\\274s\\266X.\\266\\357\\277\\365\\216Ij|\\327\\226e\\271\\335\\256ch\\221\\364\\372\\265k\\336\\267M\\323\\204\\020\\023\\244\\034\\245\\316\\000+f5\\034)\\345\\342\\273\\011c(\\020\\221\\270m\\267+\\277J)U\\256\\260\\226\\025%\\206\\240\\200\\326\\261\\255l\\3234\\233\\325Ih\\347\\237\\334\\2765;~pv\\377\\223\\256\\335l\\327K\\3134\\031\\325M\\263\\371\\370\\243\\367\\221t8\\260\\222\\232\\267\\277\\367\\355\\316\\247\\355v\\353}\\364\\233\\321t:\\015\\336\\317g\\263{\\237\\375t8\\030\\267m\\353\\207C\\312d\\201\\032\\035$\\215\\355l6\\233\\315f\\353\\365:\\306\\2501\\021\\0211\\204\\020\\252\\242|G5\\204\\316Z\\013M3\\330\\263\\237}\\362\\311\\235\\017~X\\324{1aY\\226w\\247\\023P\\\\\\254WI\\241\\250\\006\\257\\275\\376&[g\\2153\\205+\\253\\201u.Fj\\305k\\354\\272N\\310\\260\\265\\326\\261I)\\211\\002\\0037\\333uQ\\024l\\234BJ!\\250\\252\\217!t\\376\\217\\376\\350ON\\037\\034\\227e\\371\\243w~<\\235Lb\\014\\367\\357\\336\\253\\007\\245c\\303\\314\042\\240js\\204(\\204\\000J@\\333(\\335\\266\\333L\\334\\240\\365\\233\\266\\333LF\\343\\204\\276\\036\\027\\326b\\033\\342\\246]\\234\\234\\234\\335?\\273}2\\273w\\353\\366\\351\\227~\\351\\357\\336\\270\\371Z\\333\\244\\321p\\277i\\232[\\237\\335?88h\\266[\\277\\015W\\017\\257-\\317N\\016\\016^\\230\\324\\373?\\\\}\\347\\340\\2107\\2335\\262\\321\\030!\\347\\001!f\\334 \\003\\204\\024s\\230=\\373+ %\\020\\025\\021\\020\\220\\276\\256VV5\\211\\224H)\\204\\300\\210\\232z\\037\\25336%\\222$\\365\\240PH)(\\212N\\206\\243\\311p4\\032\\356}\\370\\341\\373\\363\\305j<\\236\\336?>\\333,7\\267\\357\\334\\033\\016\\006 \\242\\240\\032\\003\\244\\030#\\210\\004MBD\\011\\241\\023\\001\\344\\305js\\355\\340\\352\\311\\311\\311\\336\\245+D\\344\\214\\335tB,\\242\\361\\326\\255O\\335\\313\\227\\327kW\\227\\345b\\271z\\353\\375wo\\376\\352Wg\\017\\356\\357\\337x\\341\\316\\355\\333\\277\\364\\345_\\234\\332\\352\\301\\207\\237\\235\\334\\273\\317\\277\\373_\\374\\223_\\374\\362\\317\\377\\352\\257\\374\\322\\227\\277\\364\\205/\\376\\334\\233o\\274\\366rU\\270\\256]\\317\\317N@\042#8F\\313@*\\022=\\204m\\263>\\363\\333e\\327\\255\\333\\3652\\370\\215\\370v\\2638\\335,\\317\\232\\365|1{\\2608}\\260^\\234\\254\\316\\216\\317N\\356,N\\036,\\347\\017\\232fu\\357\\316\\247\\250\\376\\316\\255\\217_\\274q%\\245\\356\\372\\225K\\0001\\370\\355\\013/\\\\\\215\\276k\\332\\325\\341\\245}\\325t\\347\\366g\\233\\365\\252*\\\\Y\\030g\\020E2'l\\351\\314\\260.\\207uQW\\305d4\\250+G(1\\264\\315v\\2658\\275\\317\\352\\303v\\016\\261)X\\352\\202\\306C7.\\2714\\032\\232\\245c\\251\\035\\016k\\303\\342k\\207\\244\\376\\322\\336x\\263\\336X\\313 a\\273\\232k\\362\\243A9\\250\\013\\215~\\275\\232G\\337\\020\\004F-\\035\\015\\007\\345\\260v\\203\\322]?:\\224\\350\\233\\3652%O\\230@#\\2512C\\351\\214a\\320\\330\\305\\320\\025\\006\\312\\3228C\\010\\351\\315\\327\\336x\\365\\345W~\\375\\327~\\375\\265W_\\233\\214F\\257\\277\\366\\372\\027\\277\\370\\305\\303\\203K\\227.\\035\\336\\270vc8\\030\\021RU\\015\\312\\262.\\270(\\353ro\\177_4um+\\2521\\204\\224\\022\\223\\361\\276#\042I\\031O\\204\\242\\230i\\306\\333.\\315\\347\\015\\001^\\271r\\205\\021\\211x\\177\\357R\\212\\001\\021\\252\\262j\\233\\256\\256*\\211i0\\030\\324\\325`6_,\\026sg\\000%e:b\\356\\253\\334\\243\\200\\010\\252\\202\012\\344\\215\\252\\010H&\\211\\006\\005Dbf\\313\\334#\\2752\\306\\232\\000S\\212 js.\\000qY\\026/\\334\\2706\\036\\015\\327\\253UQ\\226GG\\227\\367\\367\\367\\273\\266\\373\\321;\\177\\213@\\276\\213\\247g\\263\\365z\\253\\010\\316\\332\\316\\207\\024\\275\\206NS0\\2304EQ\\021\\342\\004\\310\\306\\305.\\014\\253\\002\\223\\337\\233N|\\347_\\270\\371\\3127\\276\\375\\035\\005\\223\\200\\230\\341\\306\\365\\203\\316o\\257\\\\9\\232\\2576_\\376\\225\\337\\372\\347\\377\\362\\0176\\211^|\\355\\315{'\\247\\314\\\\\\026\\305K/\\2748.\\007\\247''\\346'\\357\\274\\375\\336\\337~\\217\\2317\\233\\025\\000\\250\\312h84\\306\\204\\355\\032\\000\\204\\231\\255\\003\\242\\2244\\2437W\\263\\007\\206\\261(\\313v\\333n\\273\\026\\201D\\244,KM\\311\\267m\\3274)\\305\\322\\025u\\351\\000`\\263\\355\\320\\032\\037\\332\\355R\012N\\253\\371}\\203\\311o\\343d\\350\\034\\217\\013\\207\\327\\257\\037n\\266\\333A]\\244u\\033|\\363\\302\\365\\353\\247'3C4*\\313\\311xJD\\263\\331,4MY\\226\\265\\265\\021U\\27253\\227\\234\\035\\300I%-\\217OTSU\\024eY\\022\\001\\242\\227\\230\\244\\333^>\\030\042\\242o\\273\\263\\223;\\206\\230\\222+(\\236\\334\\377\\364\\215\\327\\277D\\256\\362]\\354\\202\\337\\337?\\270z\\375:\\000\\035\\237\\234\\275\\376\\372\\353\\256\\252\\2151\\231\\367Pe\\213\\036Y\\360\\355\\357\\276}\\347\\326\\355\\343\\343c\\266f2\\231\\214\\307\\343\\275\\275\\203\\321t2\\036\\217W\\353\\365r\\271\\024\\0047\\331\\253\\006S5\\212Q\\321\\271\\361\\360(\\363\\024\\035\\356\\217rR\\343\\275[\\237]\\277~\\375\\352\\321e\\347\\\\\\323n\\372\\210\\014`Q\\225A\\322b\\271,\\013\\233\\211\\231\\231\\261kZ\\321\\230\\375\\206\\203z\\024c\\264\\266$\\242\\246\\365e=\\236N\\016\\220MY\\017C\\010I\\201\\215\\261,\\252E]\\025\\213\\371\\331t4X\\316\\222O\\335\\370`\\357\\3257\\336\\214a\\023\\233STB\\005\\006\\026\\004\\312\\232$([\\006U$\\315aW\\351I=1\\212\\202\\022J/\\313\\373\\0240\\000CVDP\\241\\260\\326\\020\\242jU\\270\\203\\203\\275\\027o\\\\\\033\\215\\006]\\263\\261E5\\034\\016c\\204O?\\375l\\261\\352\\352\\232c\\354\\274\\367\\241\\355F\\243\\221\\367\\336'\\037\\333\\246\\000\\001\\010\\252\\2344C\\002)\\002\\267QI\\303\\331b=\\035\\354\\237\\234\\315\\367\\367/\\025\\306\\214\\352\\252\\235\\267Ip\\333u?z\\367\\366\\2137\\016\\356\\337\\277\\377\\305_\\274\\3216Mj\\375\\017\\276\\367\\326\\377G\\326\\233\\364Z\\266\\035gb\\021\\253\\335\\335io\\223\\335{/\\363\\345#\\037)6r\\225Tr\\015,\\270\\014\\030\\250\\032xb\\300@y\\346\\237\\341\\037\\340?axb\\030\\360\\310\\023\\303F\\215\\004\\253lH,\\241T\\204$\\212%\\212\\244\\310\\327d\\237\\267;\\375\\356V\\027\\341\\301:\\347fR\\265\\007\\231'o\\336{w\\267V\\254X\\021_\\323\\241\\376\\336\\037\\374a\\337\\035\\336\\275\\013\\363/\\352\\363\\207\\017\\376\\353\\177\\365/\\325'\\217\\226\\373\\375~\\034\\307\\261\\333\012\\001\\373\\375~uM\\30304M\\225B\\274\\307\\270\\011!\\004H\\024)\\216\\275\\024\\004\\223)\\022\\351\\024C\\212\\301{\\221l\\3234\\313\\213\\211\\037\\315\\352\\356\\216|[\\324\\263\\272\\256#+[\\227\\373\\375v\\265ZY#\\302\\270\\327Z\\035\\372^\\002\\002\\247\\253\\267/\\317\\317.\\373n\\367\\372e_TUi\\345v}3\\251\\312\\224\\222\\353\\366\\357\\273]\\241\\015H\\321\\224\\312Vz}{\\035\\211\\202s\\332\\332\\322Z\\020\\242*\012\\000*KK)\012\\201\\336\\035\\201\012\\314\\354\\234\\033o\\273\\302\\330\\242(\\346\\323\\211\\2242\\245P\\024\\346\\342ly}\\365\\272\\254&Rj\\027\\303\\333\\327\\233\\353\\253\\327\\314\\354|\\374\\331_\\375\\205\\224\\032\\244\\210!\\371\\030\\000@\\333\\322Z\\373\\370\\301\\343\\344\\017\\225\\005\\304\\344\\273\\315M\\2779\\354\\356\\232\\246\\011!\\234\\004\\245q\\375N\\241\\024\\031\\275\\\\\\024\\325\\276\\355\\013m.//\\017\\207\\003\\021I\\024\\277\\374\\273\\237~\\373U\\371\\275\\357}\\357\\371\\263/\\252\\252\\312\\243\012\\244L\\021\\256\\257nX\\310\\263\\331C\\346\\024\\203\\327J:\\036\\004`\\212\\251=\\3548\\321j\\2651\\306x\\027o\\356\\356\\316\\317\\317\\327\\253\\255\\266f\\034\\307\\307\\237~bl\\331;\\377\\354\\331\\263\\252\\256S\\212U\\2011\\365\\263yid\\303)|\\347\\273O\\203\\337~\\365\\367\\253\\243[\\016\012\\001\\2302`\\375\\230g\\034\\033QY\\330\\034\\000Y\\200QE\\342c]\\031\\370$\\364\\237\\2714)!1j\\220\\210\\014\\\\\\030;\\237\\315Jk\\026\\363\\331\\371\\362,\\022\\267m\\337v\\253o^\\274\\026\\250\\373\\316I\\255\\214.\\273\\256\\037\\203\\367\\301K\\231\\213}\\014\\300\\234\\2211(I\\210\\220\\000\\022k\\024\\011\\325\\273\\367\\327\\237\\374\\323\\037\\037\\272\\341\\371d\\342\\306\\021\\021|\\362V\\311'\\237=!\\032\\224\\326>\\244\\020\\302\\177\\377\\257\\377\\365\\377\\374\\177\\374\\337/~\\373\\365\\213\\367\\357\\377\\233\\377\\356\\277\\035\\016\\335O~\\362g<Rp\\036\\177\\377\\217\\376\\205\\367\\243\\367\\236(V\\205a\\346q\\350\\017\\207\\303|>\\215\\316\\207\\350$\\212\\214\\371\\262\\272PJT\\205\\212\\301\\327u\\243\\215\\3119~\\010\\241\\252\\252\\334\\015\\342D\\333\\335\\272\\335\\355\\205\\300\\246\\252Ma\\207\\350\\207\\241\\313\\205\\325\\246i\\264\\226BB\012q>\\237\\177\\373\\3557\\213\\30523Y\\\\\\360\\234\\010\\000\\306\\276\\237L&\\310\\340c\\250\\212\\262\\250J?\\370n\\350\\317\\026Ket\\337vBI \\354\\307\\301jC\\300R[\\027|J)\\333_\\027Ea\\214\\2121:\\347\\274s)\\245\\213\\213\\213\\\\\\227\\000\\200\\272\\256\\257\\257\\257'\\223IU61\\306\\266mG\\037\\264\\326\\332\\026!\\204\\321\\205\\224\\222\\020*\\227\\301\\013[\\225e\\271^\\335\012!\\212\\242(\\313\\022@\\370\\020r\\241\\224\\231\\205V\\326\\226(\\304\\320\\367\\3750()\\213\\262\\334\\037\\266\\323\\305\\274?\\264)\\245\\351d\\336\\266\\355~\\267+\\212\042\\2670T\\256\\000*\\225{\\335\\373\\266g\\320EU\\331\\30287@\042c\\025s\042Ju]\\257\\327k\\253\\355z\\275VF[k\\213\\242\\232L&\\233\\325\\272\\353\\016\\347\\227\\017BJ\\221\\030\\205:\\364\\335\\345\\345\\203\\363\\363\\363W\\257^~\\362\\350\\361f}\\267\\230\\315\\353\\322\\256n\\357^~\\365\\353\\007\\263\012\\243\\223\\244\\224P\\010\\0222\\316_\\344\\372\\373\\261\\201\\317\\211\\210\\000\\023\\022\\242\\321M\0428\\201\\313?\\024gS\\364\\210\\214\\304Jbiua\\314r\\261x\\364\\350b\\261\\234\\226\\245}\\371\\372\\315\\335j{}\\273\\331\\037\\332\\365\\266\\235\\316g!$\\245\\265\\024\\320\\367m\\242\\220\\2213\\311\\365e\012\\302\\373B\\347*\\223\\026\\272\\350\\003\\202\\0243k*I\\017'\\352\\223\\213\\345?\\377\\303?\\270x\\364\\344\\177\\371_\\377\\367\\257__w,A\\202\\021\\303\\243\\213\\305|\\332\\374\\361\\277\\370\\227\\315\\345w\\304\\374\\311_\\376\\372\\305\\377\\365g\\177\\246\\027\\263\\307\\317>\\373\\361\\217\\377\\263\\177\\377\\027\\177\\331\\256\\016\\207\\355A%\\327\\372\\261'\\242\\007\\017.\\202\\033\\000\\370\\301\\362\\362\\363\\347\\177\\364\\363\\237\\375\\255\\227)\\005-\\245\\314\\334$\\223\\025\\202\\303\\300\\2308\\215~\\030c$\\241\\324b\\261x\\366\\354\\351O\\177\\372W\\257_\\255\\220y\\271\\\\^^,\\307\\261\\007\012J\\3108v\\027\\213)\\200 \\212\\333\\355\\026\\301\\240'\\245\\324~\\273\\271<?WJ\\265}/$v\\355\\336*\\255\\265\\266V\\247\\340\\001\\300(\\005@\\273\\315\\332\\373\\250\\224\\272\\271\\275>\\326R\\204H1\\257!\\215)\\312\\365j\\355c$\\312\\010^R\\252'\\242\\276\\357\\205\\020eY\\016\\303 M5t\\235\\266\\266;\\034\\000\\310\\032\\345\\372.\\245\\024B\042\\004\\2555 \\306HZ\\353\\315\\356\\340\\234\\253\\252\\252i\\032m\\015B\\024\\340\\273\\375\\212(\\266R\\347\\333\\007\\200\\304\\200\\010\\027\\027\\227\\353\\233\\353}{\\020B(i\\244B\\243\\013\\244\\242\\220\\264z\\367\\325b\\261p\\311\\335\\274\\273\\235\\315f\\017\\316\012b\\226\\310\\336\\007\\245X\\010\\2420\\2000\\263\\252,L\\271\\331\\015\\205\\246\\365\\365\\353q\\354\\265\\326\\306\\252\\252*\\332v\\317\\261\\2460\\226\\215zx\\331\\313\\201\\316\\354\\000\\000 \\000IDAT\\244\\224\\020i1\\263\\233\\315uexV7\\335pW\\224\\345\\362\\341\\345l>\\027\\332\\334\\336\\256\\336\\276\\374\\225\\353\\373\\337\\374\\303u\\362\\001\\343\\303\\267\\335\\241\\251*\\251\\022%\\207\\024\\201I\\010)\\200\\022eE\\204\\023\\000\\370H.\\222\\230q5 B\\010'\\225<\\274\\317\\236\\023\\005%\\244RR`\\312yhUUUUH)SpW\\273M\\337\\367777w\\253\\235\\363I(M\\214Bj\\357c\\214\\276n\\312\\366\\340\\021ip\\275\\210\\001\\020\\000\\011@2sV7\\213\\200\\220x\\337\\367\\325\\254\012\\211\\017]\\027\042\\231\\302Ngszs\\035\\023\\245\\024\\233E1\\306\\324\\373\\364\\325\\213\\327\\377\\345w\\377\\363\\267\\273\\303\\363\\347\\317\\377+\\342\\177\\377\\213\\377\\030}x\\373\\372\\325\\305\\305\\331Y\\263t\\027N5\\245\\362\\203/\\255iw\\267Z\\312fRE\\327\\276\\372\\3467\\225\\025\\225\\265\\220tQ\\024\\223\\272\\031\\307q\\030\\006\\2518\\246X\\0256\\204\\240\\214n\\333}]\\327/\\277\\375\\332j\\371\\317\\376\\340\\237\\274y\\363*\\205\\370\\350\\321\\203\\227/^(\\211MS\\017~\\234Te\\212\\001A8\\347\\232\\252\\226Ze|p\\327u1\\306\\371t&\\245\\034\\373\\341\\331\\247\\3178\\221\\217\\001\\221\\307q\\234\\315f\\271\\232!zy\\361`z\\337r_\\236\\237\\015\\303P\\026U\\214Qk\\355b\\252\\246\\213H\\354}\\234N\\233q\\364\\000t\\350\\332<\\232SJZkk\\355n\\263\\265e\\021\\317\\316\\353\\272\\322\\2028y\\245\\324~w@%\\307q,\\313\\222\\030\\225R\\237&\\276\\357\\211\\202\\024\\205\\255\\232\\252\\250\\013\\334\\254\\356\\334\\350\\225H\\256\\357\\307q\\024\\332\\030\\243\\206V\\217\\335\\326 \\224\\205I1I\\304i\\251\\313B\\304\\024\\330b\\273\\271&\042A\\274[u\012\\205\\262\\306H\\243\\2242`)R\\362\\221\\330\\273\\350B\\242\\3537\\257uQV\\266\\260\042\\365\\355~s\\333)\\245\\312\\322\\036\\3267EQ\\274\\335\\255\\000\\300\\030\\023c\\274z\\365\\262*\\314|\\326\\014]\\250\\353\\346\\372\\335\\213\\355\\355\\373\\315~7\\233/\\205\\222\\000\042\\214\\3438\\270\\030\\343\\257n\\337\\305\\030\\004`i\\004\\031y\\330\\254\\317\\316\\0364\\365\\314\\350\\252\\254\\253\\241\\035\\206\\301U\\245%\\002N$A(\\224 Dd\\200\\004Zg\\325\\245\\017\\305u!A*\\003\\304\\336\\373B\\311\\334\\335t\\301\\013%Q\012\\002\\330\\355v_\\177\\375\\315\\325\\365]de\\313ZK3\\216^J\\305\\002\\245\\321\\343\\350sI\\007\\031\\0201\\004\\257\\031\\235\\217\\000@@\\344=\\240\\3150\\321\\256\\037g\\306\\216\\316\\375\\366\\3057\\017?{ZOg\\201aL\\001%\\034\\006O\\224\\226\\027\\017v\\275{\\277Zm\\235d\\326?\\370\\301\\017R\\241\\242\\026w\\267\\353\\272\\250YH\\347\\202\\232O\012\\0113c\\224s\\256\\353\\016\\207M\\257\\224*\\315L@\\312\\330b\\201\\204\\220\\264\\302\\244\\225@\\230L\\233a\\030la\\244V\\237}\\366I\\036j\\257_\\277~\\361\\342EUU@\\2119\\215\\343@D]\\3272\\363\\253\\267o\\346\\363\\371\\251}\012\\316\\271\\020\\302\\341p\\220R\\022Q\\327\\366\\211\042\\021QLD\\031\\206A\\031\\233\\222[\\246\\210\\270\\333\\355\\256\\257\\257\\037>|\\350\\275\\317\\0001k\012\042\\032\\206\\241\\357\\307\\304\\210R\\371\\321\\2450R\\244\\311l2\\257'\\306jJ<\\262/\\244VR\\371a\\\\\\257\\327\\024\\342\\203\\207\\227U)\\3758d\\354Je'Zk\\357}\\337\\367B\\352Lq\\310}>!\\004'\\327v\\243\\226\\342\\374l\\246\\244\\311\\027,\\2454\\246\\000\\301\\223zz\\273\\272s\\303XT\\245\\0049\\206\\321\\365\\256\\335vuc\\027u\\255f3\\200\\354ir\\244a\\027\\266\042\042D\\311\\314\\262@\\241ut\\276;\\264O.\\317mQe\\306\\300\\244\\262\\210\\213\\334\\357TJI)\\243w\\314\\\\UUJ\\251\\357:\042:l\\326\\000\\304\\211*\\243&\\223\\306h\\251\\224\\032]\\210L\\321\\215@qR\\227\\315\\3719\042r\042\\001\\021h\\270<\\237\\227\\365\\354\\325\\253\\267\\237<\\231\\367\\316I\\243\\027M=\\264\\035\\260\\224 \\230\\231R\\306\\010\\003\\340Q\\317\\216\\20193D3_\\235\\331(\\311,B\\2121\\222\\220\\330P\\235\\210B\\010\\253\\365\\346\\345\\313\\027\\267w+\\241\\214\\022\\252\\037\\035`,\\352&\\245\\004\\004\\210\\307flN\\327\\361$cr\\337\\223:\\3463\\300\\220\\222)\\353\\333\\273[\\2347!\\246\\316yG\\234\\000tQ\\026u\\025\\335v\\335\\216OMy\\366\\350\\261g\\371\\333o^>\\370NIb\\267^\\257=\\320v\\337\\352\\245.uS\\226\\245\\002\\016)\\216\\353C\\267\\337\\357S\\212\\027g\\213iS\\026Vz\\027\\225\\324B*\\243\\245\\261\\312\\026\\332jM\\000\\203\\033\\235\\033&\\263\\3710\\014UY\\203\\024\\337\\375\\376w\\363*\\177vv\\266\\271[!\\303\\362\\351SD\\014\\301\\025E\\361\\350\\321#\\0008\\364\\375l6#\\346\\353\\353k\\255mY\\2261\\306\\020\\\\\\306F3\\245\\314\\313\\000\\200C\\267\\027\\306\\030SdL\\243\\224\\322Z;\\235N_\\277~]\\327\\365|\\266@D\\347\\334\\315\\315Mn\\246\\314&\\323\\242P\\2441\\304\\330\\373a\\330\\371\\020RJ\\301\\230bp\\243+\\312z\\322\\030L\\363\\312P\\224F\\360\\346nU\\024\\305d2I&E\\242q\\0343\\244A)\\345\\234\\033\\207\\356\\260\\337f\\334\\202\\020BJ1)\\213\\262Pha\\034B\\346%D\\037\\3060\\254\\256o\\011X\\242\\210^\\010e)\\006%\\305t\\262\\270\\275\\276\\266\\326f\\205\\020\\255\\265\\024rpn\\277oo\\306;kmQ\\224\\314,\\000\\253fb\\224\\236T\\223\\333\\365&\\272VJ\\251\\215\\252\\213\\306\\026:'6\\031\\257\\234\\204I)\\025\\312\\010#\\014\\250\\020B5_\\206\\340\\023\\003\\001\\027\\322\\024\\363:K\\306\\274{\\367.\\222TRN\\313\\311\\254\\231\\022\\221\\367\\0368N\\247MJAH\\371\\354\\213\\347\\373\\326O'\\263\\241\\033\\267m\\247\\030% d6\\0161##\012\\205H\\220\\020\\031\\211D\\26699r\\2741R:\\356$)\\031\\245\\205V\\221\\251\\355\\273o\\276}qu{;\\014\\256\\231\\026B\\351\\301\\217\\304\\204\\022R\\214\\002\\2203a.%\\216\\001Sd\042`\\221\\371\\364\\022\\3561\\311 \\230\\264\\325\\3169\\021cYU7\\353\\315\\346\\320V\\263Y\\237\\370n\\2735C?\\251M\\222\\352\\333w\\327X_L\\236\\204$u\\357\\343\\325\\335\\353\\253\\333\\233\\313G\\017\\252\\302\\254\\327k+\\307\\371d\\251\\222wui\\264\\004\\240 \\2048;[H!noo\\347\\363\\251R\012\\031\\230\\251\\357\\373\\224\\3220\\014\\3438\\346\\004+\\303\\257\\306qL\\300\\223\\311$/\\323Z\\353\\345r)\\020\\004\\340\\315\\315U\\337\\367\\363\\371\\374\\260?<\\377\\356w\\354\\241\\355\\207\\301\\030\\363\\374\\371s\\255\\355\\267\\337~{qq1\\216=\042JuD$#\\013\\224\\362\\362\\341\\027m\\3371\\243s\\216\\231\\273\\256\\3130\\235/\\277\\374r\\034\\307\\214K,\\313\\362\\263\\317>\\253\\353z\\322\\324o_\\276\\230L\\312\\262\\254\\205\\020\\316\\271\\224\\222s.\\306\\030R\\232Dkm\\011\\000jZ\\227e\\231\\277\\376\\344\\321\\343~\\034\\272\\256\\013!h\\255\\353\\2620\\332\012\\211\\363\\331\\202\\201\\202\\217]\\337\\366\\335 $N\\247\\323\\331l\\342\\372.c\\240\\273\\256\\033G_\\226\\2451\\246p\\346\\213/\\276\\2101\\256W\\333\\315f\\323u\\207\\314\\361\\231M.\\302\\030b\\010\\321Gi\\225QV\\010\\341 p\\342\\305lQ\\226\\245\\326v\\034G\\347\\034\\020\\027E\\225\\373j]\\327e8\\177\\2024\\014\\207\\303>H)\\275\\213\\266\\320H8\\014\\335~\\035\\205\\020\\022\\021\\000\\264\\234\\2721\\356v\\273C\\337\\215\\336)c\\312\\262.\\353\\252*\\033QI!D\\251m\0121C\\235\\244\\202o_\\\\M\\347\\223zb\\226g\\313\\353\\315\\333\\317\\036<\\252\\372\\341\\372\\315\\025\\244\\3101\\013'\\035e\\372\\031\\005\\000$J\\231\\315\\231E\\262\\356\\245\\227c\\214\\000\\224m\\311\\023\\260\\363~\\265Y;\\347\\336\\337\\336\\021\\201*KO\\014!(\\253\\000e\\010\\356\\310k\\346D\\0249\\005N\\004\\211\\230(\\241@\\316\\036\\307\\010\\304(\\362_\\200\\002\\204\\200\\262\\251uYu\\316o\\272v}\\350X\\310\\345\\305\\243\\315n\\015\\272\\260\\272\\352I\\230\\351\\362\\374\\311gW\\203\\370\\273\\177\\370\\007\\331\\324\\304|ss\\323\\367Ci\\033\042\\336\\256\\366\\212)I!J[\\230\\345\\031\\235d\\273\\244\\304\\365zm\\214)\\313:\\367\\303l\\241\\212\\262\\366\\336\\207\\350\\234s\\267\\327W\\335\\320\\247\\304\\263\\331\\254\\253j\\000P(6w\\253\\340]]\\327\\363\\351\\354\\354\\354l6\\231x?\\216a|\\375\\372\\345~\\337\\326\\223\\3069\\367\\352\\315\\353\\311d&\\224\\\\m\\356\\216|\\273\\302\\030%9\\005\\211Bj\\265\\335\\255\\017]\\213 \\225R\\313\\345\\262\\264F)\\011\\000R`i\\0153f\\242\\3360\\014\\2677\\355f-\\352\\302\\004?\\246\\350\\235s\\207\\266_\\257\\327Y\\326,O\\263\\351|yz\\037\\322\\030U\\024\\006\\004\\032\\255\\230RYXD\\224\\022\\001\\204\\224\\330wmQ\\230\\252,\012\\253&u#\\0044U]\\325\\305\\240d\\366\\343A\\224\\306\\230\\242(\\232z\\212S|\\373\\346}.\\021^\\\\\\\\L&\\223a\\030\\016\\333C\\212\\374\\360\\341\\243\\334\\266,\\212\042_j\\325\\260)l\\323Ls\\202.\\2652\\2055\\3060\\222s\\275\\001\\026\\302\\333RH\\011 EQ\\225\\200\\225\\224R\\011%\\225\\220,\\206\\261\\036\\373\\201\\210$`J \\320H]\\232\\262:c\\006\\000]XkuF\\314y\\357s\\256\\002 \\312\\302\\022\\221\\020PT\\326V\\345\\276s\\233\\027o\\377\\331\\037\\375\\027?\\372\\321\\217o\\337__\\275\\277U\\214(\\002\\244$\\230\\204\\000\\220p\\344U\\304\\361\\270\\027\\314\\302\\324,\\356%\\3402|\\230\\211B\012\\314\\314\\333t8\\034RJ\\306\\226B\012\\027\042cR\\306\\010\\2011\\305\\254\\252\\312\\234\\230\\002\\247\\010\\024!\\245\\254\\321@\\014\\014\\307b\\013\\000I`FL\\301/\\036<\\344q\\267;\\354\\237|\\366t\\214\\374\\263_\\374*I\\275o{\\324\\3660\\270~\\333_\\\\>\\216\\322|\\373\\376\\372\\2337o=\\300~\\265\\356\\3758\\233M\\204\\020\\253\\333;\\315\\345lz\\246\\2141\\353\\365]\\327u\\213\\305\\242(\\015\\021\\031\\243\\346\\363y\\026_\\314\\214\\272\\340\\223\\217!;\\222\\326u\\275X,\\372n<\\027\\347\\233\\315.\\244\\370\\3657_\\265m\\373\\275/\\277\\357\\374\\330\\356\\017D\\361\\342\\354\\274(\\215\\026\\362\\372\\372z\\263;$\\246\\266\\355\\337\\337^{\\027B\\010y\\3037\\233\\315\\244\\022!x!\\331\\010\\023\\202K\\210\042\\211\\242*\\353\\311CN\\264;\\354S\\210RI\\253\\015#\\274~\\371J[#\\000A\\340n\\263'\\340\\302\\330\\305b\\026(y?\\032\\251\\022B5i\042\\262D\\241\\214.\\212\\342\\352\\352j\\364\\256\\254\\253\\034\\236CL\\205\\261\\335\\341P\\024\\305|:+\012\\323\\367}\\010\\001(YS\\224e)\\004 pb2\\202\\231y8\\354\\273\\303\\316\\224E\\337\\367\\3169\\357}\\316\\354S\\344\\3146]\\257\\327\\353\\365:\\337KQT\\202AJ\\351\\234\\013\\224\\214T \\261\\357\\273}\\327\\346\\207\\266=l\\230Y)\\215\\010\\201BtAF\\005\\0240\\221\\326\\022@\\364nH)I\\255\\004\\252\\\\\\314\\241\\224\\224RViSXd\\200D\\375\\030\\212\\252r!\012\\205\\211\\331Z\\2338\\206\\350\\272\\376\\360\\350\\321#\\024\\311{O\\354\\265\\326\\265\\321\\034\\331\\205\\240\\265ea/.\\317\\027\\027\\017\\233\\371r\\360d\\253\\311gO?\\177\\363\\365W\\222\\223\\000bH\\304\\211\\003\\207D\\211\\2174\\374,\\231\\304\\304\\004)\\233rd\012\\002\\037\\215\\2648\\313\\276\\371DV\\333\\014\\242\\025J\\022@\\244$\\021\\224\\2211\\004\\301\\211S\042\\212\\304\\021\\210\\005\\303Qo\\005\\2209\\233 \\203\\004\\004)P\\212f2\\003\\244\\262,\\200\\023(\\271\\336\\037nw\\273\\326q?\\246\\331r1\\206\\326\\224\\323\\317\\276\\363]G\\370\\323\\237\\375\\374\\020\\240\\015<YLu\\255\\267\\273\\365\\260o\\265,\\302\\030^\\275x\\241\\212\\302\\344\\202@3\\251\\352\\272v\\316%\\216\\273\\375\\216\\022\\244\\224\\352:Yk\\275\\217\\2148\\251kel\\327\\355$B\\014N[SU\\005\\000\\230\\263\\245R\\252\\353\\206G\\017/'\\317\\237\\217\\343\\210\\314\\267\\267\\327,d\\323T$q\\364\\203-\\315\\223O\\037K\\251\\337\\276\\177\\337\\367}\\325\\324\\355\\320\\315\\247S)Q\\033i\\214J$8Q\\214\\341p\\3236\\263\\251Bq\\330m\\307C\\227\\200\\027\\323Y=\\235<\\274<\\027ZqL\\322\\350\\312\\330\\220R\\273\\337\\257V+iu\\240Ph\\023(UU\\303JKc\\022\\363\\266\\033_\\275\\277\\321Z/\\316\\317\\036?z\\022\\263\\343]\\242\\351t:\\366\\335j\\267\\235LjD\\254\\212\0428\\017\\224\\242w\\200\\024\\0039?\\344\\304F0D&\\034\\207\\230\\230\\231}H\\3030v\\375\\330\\265\\216\\231?\\377\\374\\363\\242\\250f3\\016!\\264m\\337\\367\\256(\012\\255UL\\243P(\\244\\241\\030\\234\\037\\003\\215\\306\\030T\\321V\\242\\357\\373\\301\\217\\314\\311\\373\\210\\310M3\\255&E\012\\261\\037CJ\\021@\\204\\010\\203\\213Z\\313\\262\\254\\333C7\\366\\2431\\246*%\\244\\243\\377X\\214\\270>l\\0077*%\\274\\367\\313\\3452q\\254\\312Rh\\265\\332^\\003@\\364!o\\246\\265\\326\\034S7\\004\\222\\325\\372\\366p~!\\276\\377\\243O\\207\\030\\333\\336\\271\\256_\\2556}\\337[N\\006Hp\\214)d;\\240\\223L,\\023`\\002f\\302\\304\\224u\\373|\\212\\031\\256\\235Y\\032\\221\\310jmK!A\\271\\030\\230@*%%\\204\\024#E\\011\\020\\243\\027\\2240\\021\\307\\000\\211\\200\\351\\250#\\233\\325hS \\004\\005(%\\242\\022(\\304|>\\215}[L\\013%q\\267\\333_\\357\\2350\\246\\333\\267E5o;\\007\\022\\036?{rv\\371\\270\\015\\361\\325\\325\\032M\\025\\244Y\\275y\\213\0420\\2440\\370\\333\\315\\332\\267Q\\313B\\205\\350\\246\\263FHp\\3169\\347\\224\\326M\\323\\214\\306\\017\\203\\363)\\010\\357\\010D\\337\\367\\214 \\224\\254eqyyY\\024&1d\\332\\343v\\277\\033\\206\\201\\200\\337\\275y{{{]\\226\\345r\\271\\374\\316\\363/\\3060\042\\261\\255\\316\\213\\256\\355\\235O>\\214\\301Ol\\371\\370\\361\\3437o\\336\\254V\\253\\375~\\237R\\022@(X)\\345B\\204\\014|\\021\\312\\271\\000\\326.\\227\\347M\\323t]gtQ\\225\\315v\\273\\235\\326%)\\362\\336ov;\\245TY\\327\\323\\371,\\244\\350b`\\346q\\267#FSVuY\\217\\336KM\\363\\345\\231\\2242E\\332\\356w\\336{\\000\\020D\\253\\030\\253\\242\\254\012\\223\\363\\204q\\034\\333\\266UJ\\245\\350sqc\\030\\206a\\030\\210\\222B\\011R\\250\\242,\\312\\272\\252*\\255\\365=]\\327{\\337\\266\\255\\013cY\\226e]\\215\\375\\000\\002\\253\\242\\004\\201*\\343\\357P\\022%\\251\\325\\324N\\245VR)F\\270\\271\\273\\275\\271\\271\\021\\002\\233f2\\237\\317\\244F\\2555\\020\\336\\\\\\257c\\214\\213\\305\\231\\020\\342\\260\\333\\027E:[\\236\\317g\\213\\303\\341 Q\\000\\300f\\275\\356\\373\\2564V)\\265X,\\313\\261\\027\\032\\257\\257\\337ow\\267\\253\\365m]\\327)\\245\\307\\017\\2374\\365D\\326\\3150\\014!\\004\\245\\024jM\\322F9{v\\271X,/\\336\\276\\277y\\372\\364\\351\\330\\367\\335v\\367\\342\\233\\257E\\030@K\\241\\204`\0121\\204\\224X\\011%\\225\\033Gf\\316\\032yG>20\\000H)\\211\\222\\224B\\312\\014<\\214\\314\\014\\200\\011\\342}\\222\\235Mws\\205\\200\\023\\011J\\202\\022\\020!\\223\\000\\022\\014\\031\\272\\013\\304\\214\\022N\\202\\206R\\242P\042z\\327L\012\\201\\350}\\244\\204\\337\\274\\177\\277\\353FUUm\\210\\246(~\\360\\243\\177z\\361\\370\\301\\267\\357\\357:O\\272\\230\\313r2\\264\\3550\\214>\\014}\\277\\027\\304\\212uQ\\032-\\225\\374\\341\\357=QR*#\\001\\201\\010\\306\\321w\\335(\\265\\265E\\025\\022im\\245\\325\\243wBIe\\344\\325\\315\\325\\345\\345eU\\326\\323\\331\\314Z\\253\\264\\\\\\3576\\306X\\220\\342\\321\\303\\207\\3750Tuus{{}{s}s\\373\\376\\346\\206\\001#s\\327\\217J\\351f:\\325F\\373\\340\\001\\341\\374\\342\\334\\026\\305\\241m\\245T\\214\\362n\\265!\\224\\365dF(\\317\\316/\\001\\245\\367\\221\\010BHD\\320v\\375\\325\\365\\315\\350|\\333\\365\\333\\335n\\273\\333\\003b\042\\316-\\324al\\231Ra\012c\\355\\320\\217L,@\\306\\020\\203\\017\\317\\236>\\2738?SR\\372\\276\\357\\333]w\\330sp77\\327\\312\\250\\262,o\\356n\\367\\207\\203)l\\325\\324eU%\\006m\\013\\020\\262\\033\\306f:\\335\\267\\207f6\\217\\304\\315t2\\231N\\022\\245\\267\\357\\336Vu5\\235M\\356Vw\\2660\\327\\327\\327!\\371a\\030\\\\p\\233\\315z\\364\\243s\\243\\326J\\353\\342\\366vmT\\351}r.N&s\\357B\\327\\016\\3369&\\2304\\323I\\323|\\376\\354\\213\\371l\\326\\324\\215\\224\\022A\\030m\\213\\242\\350\\372=Q|\\364\\350\\301l\\332x\\337Y+\\253\\3128\\337\\316\\346\\365b9\\271x8W\\026\\225\\226\\313\\331Y\\212$\\200\\232\\332F\\267\\327\\222\\233\\302N\\353\\011\\005n\\312\\305v\\3352\\353\\311\\364\\254\\033\\334z\\263\\273kG\\207\\315\\362\\341SbQ\\025\\205 \\322L\\377\\356O\\377DD\\267_]\\005?\\246\\344{7\\202\\326\\250u7\\270\\301\\307\\220b\\310l*\\246\\230\\002\0120Z&\\212B\\010k\\264\\321\012\\205\\024Bd\\203\\023\\201\\210DY4V\\010`\\026\\000L\\211\\230AJ\\205\\314\\024#\\247 \\230$\\202D\\020\\002\\002')\\204\\021R\\002\012\\251\\225\\321\\250\\221!<\\274\\\\4\\2459\\237\\316\\027\\263\\305\\335\\266\\177{\\273m\\011\\017\\011\\242.\\237|\\361e\\263\\270\\274\\336v\\333.\\262(]\\302\\325j\\275\\331\\356\\207at\\303\\230+'\\200H\\234\\\\\\034\\345\\323OfJ\\013)\\204\\017\\001Q\\316f\\363\\242(\\373a|\\365\\352\\315\\247\\237}\\332\\266\\255P\\262i\\232\\353\\333+\\342\\330\\324ui\\355t6\\333\\356w\\277\\371\\352\\267\\357\\336\\277'\042\\224r\\265ZiclQH\\245@\\340\\243'\\217/./\\2452\\357\\336_\\035\\016\\3550\\016RH\\245\\265\\226\\352\\374\\342\\\\\\000\\376\\355\\317\\177.@\\020\\223\\222*1{\\347\\011\\3309\\277Z\\257\\275\\363\\3030\\206\\020G\\347\\332\\266;\\264\\355\\350\\\\\042r\\316\\307\\224|\\0101&)\\225\\261\\266\\252\\352\\331t\\252\\265\\030\\3726\\245T\\026\\025%\\272\\275\\275\\353\\373\\241,\\352\\024S\\333\\036Vw\\267Z\\210\\347\\237?\\375\\342\\363\\247MU\\000\\323\\017\\177\\370\\243\\242(la\\353\\2466\\326\\206\\030B\\014u\\323\\214\\316%J\\30382\\300\\350F\\037B3i\\232I\\003\\000\\253\\325\\212\\211\\312\\252\\242\\224\\366\\207\\303n\\273\\275\\276\\271\\201\\243&b\\324F[k\\026\\313E\\323TUY{\\037\\356nW\\300\\034B\\014>\\020\\323\\320\\015\\304$Q\\242\\310\\340x\\336mv\\303\\330\\247\\020\\021\\300\\373\\220R\\234M\\232\\263\\363\\345d\\322\\214c\\277\\337o\\245\\222\\336\\365\\332*\\245\\321X\\025\\323\\330\\217\\235R\\\\W\\225\\357Ct>\\221C`\\251\\300\\030m\\215\\265\\312v\\007'@i]jS\\205\\220\\016\\3038\\304\\344\\222j\\226O\\010\\355\\305b!\\220\\033c\\276\\371\\207\\277\\337^_\\355\\327\\267H)\\3721\\2040\\006\\357|l\\3071&\\232\\316g\\306X\\241\\204\\322F\\352\\243\\216\\277\\224\\210\\230+!Y\\025\\026\\216@\\246\\243 '@\\346\\263\\341\\321\\0253CD$\\000\\245\\310)!\\223`\\026G\\363\\015f)\\004\042F\\006\\000\\251dU\\225\\325\\264\\252\\353\\202\\311W\\266hl)d\\361\\017_\\277\\376\\315\\353w\\242\\236n\\306\\360\\345\\217\\377\\211\\256gc\\240v\\014cd\\227\\250\\353\\306}\\327\\001aJ\\221(ep`\\306\\207\\020\\223Z.f\\304X\\226\\365\\331\\362\\302\\373\\304 \\204Pe]\\307\\030\\177\\376\\363\\237\\327u\\335\\276>\\000\\300d>\\271z\\367~6\\237\\024J\\027\\332l6\\033?\\214\\321\\371f>W\\010\\205V\\207\\355\\346\\374\\374\\\\J\\241\\252\\022R\\354\\307\\0019\\011\\240\\303n\\227\\2009x\\024\\234\\334xv\\276xpq\\026\\374\\330\\356\\331\\226%P\\362\\301+\\201J\\010NQ\\000\\217n\\250\\313\\252\\256+!D\\316\\007\\356u,sW\\005\\000b\\360\\336\\215\\336\\215\\301\\017\\301\\367\\306\\030)\\344\\320\\365\\321\\007\\253tJ\\324\\267\\373\\276\\357\\353\\272\\256\\213\\2620\\326\\217\\216cPB.\\027\\363\\233\\253\\367\\210\\230\\353\\337\\326\\332iS\\217\\343x\\330m)F\042\\222\\210\\315\\244Y\\257\\327\\205\\321F\\311\\252\\260EQ\\314f\\0237\\214\\243wH\\330,\\347\\317>\\375d\\337\\036\\374\\350F\\357\\272C\\253\\225\\230Og\\363\\345b\\267\\331\\336\\336\\\\Q\\202\\303~'\\231\\213\\272\\202D\\335a\\217\\314\\365\\264\\256\\013\\353v\\335\\320\\036l]\\244\\024\\247\\223Ei\\254\\000\\236L\\232\\252\\252\\312\\242p\\3363\\363b6\\325Z?x\\374\\340\\352\\355\\273\\315~w{w\\333[\\373\\331\\323O\\036\\226\\017\\013k\\343\\030\\227\\365YY\\226\\2460\\322h\\037\\335\\315\\315\\325\\313\\227\\257\\267\\353\\315\\263g\\027\\343\\020\\337\\276}w\\350}\\275X^o\\366\\353\\266\\377\\316\\367~\\304\\214\\276\\357\\020\\316\\255T\\355a\\367\\342\\353\\257\\275\\037cp2\\003\\262\\201X {\\357\\022\\225ee\\255-\012\\353\\375\\230b$\042\\244c\\345#\\353\\336gx4\\035\\345\\252\\263M\\302\\007\042\\036\\021\\361\\221c\\312\\037X<'\\217\\261{\\036\\237\\026\\222\\031\\011\\230\\210\\005S\\240dRD%&\\365\\344\\335\\273w\\317\\376\\371\\363\\333\\365\\341f\\177\\250f\\213C\\204\\357|\\371\\203f2\\333\\367c\\327\\016\\331\\222<$\\362.%J\\0112\\377\\215\\217BqH\\220\\022sTY\\255\\202\042\\317\\027VJ$bd\\342\\224\\336\\275~#\\021\\333\\375\\276\\236T\\237}\\372\\251\\324b\\034\\027\\363\\371\\374\\356\\375\\355\\337\\337\\336um\\373\\350\\361\\343\\363\\2633@<\\354\\367UU]\\234\\237\\033k\\373\\256\\333\\354\\326\\224\\222)t\\014^\012x\\376\\371S\042\\322\\312>x\\360 \\204\\320\\357\\016eY^\\314\\227wwwF\\3511D\042\\322U\\225-0\\246\\315\\304Z[\\226v6\\231O\\347\\223\\322V\\221B\\337\\016\\375\\330ii\\224\\221\\234 $\\317\\011\\\\\\030)\\262\\2248\\271<[,\\347\\353\\325\\346W\\277\\371\\355~\\327\012\\245\\231\\240\\335\\357Rb7\\364\\326\\350\\316\\250\\261\\335Y\\253\\263\\262\\370\\330w\\313\\345\\262\\262\\305\\376\\260\\223\\200\\305t\\322\\355\\017o\\336\\274B\\020\\304i6\\235G\\357\\372C+\\225\\320BJ\\204\\027_\\177\\363\\343\\337\\377\\021U\\215\\220X\\026U\\327\\267)\\022\\3050\\020 \\223C\\0011R\\210\\034\\302\\330\\365\\273\\365\012\\010\\317f\\315\\263g\\237I)\\337\\275{\\327u\\335t\\326|\\372\\350\\241\\224b\\350\\017\\243\\222\\032@\\030\\251\\001\\242w\\233\\303\\341:]=\\177\\376\\374|>o\\232\\232\\2317\\233\\325\\353\\227/n\\256\\336\\237\\237\\237\\013\\006-\\244\\037\\306n\\177H>L\\036>\\234\\314\\233G\\347gJ\\232C?\\264]_\\327\\365\\323\\317\\277|\\372\\331w\\224\\224C\\3339\\027\\232z\\356\042\\266\\221W\\255\\373\\353\\277\\373\\365\\2537\\327\\005\\273\\363\\007\\013\\337wU]\\274}\\371\\262\\357\\016\\276;\\010\\201\\024<s\\222R\\262\\300\\2308Q\\030\\307\\241\\353\\332\\351t\042\\204p\\303\\2300H\\251b\\364\\271\\303p\\252\\334!Q\\026_\\317\\212\\364Y\\001\\377h:\\300\\367b\\357\\300\\314I0eeq!\\024\\002g\\361\\364\\034RY\\202\\224\\002\\205H)\\205\\321q\\300T\\024\\213\\345\\305\\313\\367\\327\\253}\\357\\244\\222u\\371\\305'\\237\\223\\255n\\356\\326\\203\\217)1\\243LL\\336\\205\\004\\230\\333\\357Y\\263\012\\000\\000\\211R\\344\\024\\210HA\042\\205\042\\214\\356\\366\\346\\206\\011\\214)\\366\\273\\366\\253o\\276\\236N&(EQ\\024>\\371\\367o\\336\\242\\302\\007\\017.\\316\\347\\213g\\217?\\373\\365\\257~s\\330\\034\\016\\2736:\\217R\\270\\241?\\277\\274\\250\012\\373\\331\\263\\247UQ\\376\\365\\317\\376\\372\\356\\346n\\261xT\\333\\362\\362\\374\\354\\341\\303\\207!\\204\\365z[\\026\\246\\251\\313\\242(\\276\\374\\362\\313\\037\\375\\360\\367\\2141\\205\\2552B\\343\\330/d\\256\\353Z)\\305\\220$H\\241\\205U6A\\212.\\016~\\320B\\243B\0124\\370!\\371\\324\\016\\255\\353\\035\0423\\205\\213\\213\\213\\242(\\2630A7\\214\\207}\\307\\002\\235\\363\\314$\\221\\265\\226\\205\\261Ei\\244\\0241\\372\\014sC\\224}\\3372\\243\\224\\270\\333\\035\\372\\276m\\333\\276m\\367EQ\\275~\\375\\262\\264E\\010n1\\2371\\247\\037\\377\\350\\207\\213\\331\\364\\366vU\\330\\002\\230\\206\\256\\255\\353\\311\\305\\331\\362\\301\\017\\036=|xY\\327\\023)\\261m\\373\\272.\\255-\\233\\262*\\254\\355\\332^\\252\\243t\\013\\000\\214c\\317\\314\\357\\337\\277_}\\357;\\271\\305\\355\\234K\\024\\252\\252\\032\\206a\\277kg\\213\\345\\343\\207\\217\\316.\\316\\205\\020_}\\365\\033\\001T\\327uY\\226\\017\\037]\\002|1\\216\\243\\326\\272\\357\\373\\272l\\246u\\025\\343h\\255.+\\313RkU\\003\\210D.\\022M\\247\\323\\242(\042\\0111\\262\\026\\325/\\277\\371\\305/\\177\\371m3YX\\251\\037\\235/\\272\\335v\\335m\\257\\337\\276!\\357\\206\\366\\240\\020S\\010\\002P\\010\\341\\223\\317lW\\347\\207\\233\\233\\233\\345r\\251\\224\\022JF\\037\\010\\201E&\\222\\252\\334\\303\\217\\004\\210\\304\\314\\002dV\\310G\\011\\234\\013\\313\\247>\\366\\311f\\212\\201Y\\002J\\024\012r7%{\\230\\020#\\243\\024B+\\241\\245T(Q)\\344\\375\\266;\\177\\370\\350\\3537o_^\\255{6\\315\\362\\302\\324\\263W\\357o\\307,\\257\\314\\234\\022\\305H!\\021\\021x\\357\\305I\\277\\235\\2311\\027\\007SL)\\341\\377\\364?\\376\\017\\200r6[4M\\223\\022Gb\012\\264o{\\245\\324\\353\\267o~\\370\\303\\037\\216\\256\\377\\325\\257~\\225Yw!\\204\\331d\\356]\\034\\272nw8\\0047\\350\\302j\\201g\\227\\027Z\\310\\242)\\227\\263\\371\\276k'U\\375\\305\\227_\\034\\266\\207\\\\\\031\\230O\\347\\316\\271\\262,\\265\\326C\\3572\\2202\\0033\\210H\\010\\225\\001\\0251\\306\\272.\\231Y(\\251\\245\\022Jf\\204\\261D\\001\\002\\273C+\\224L!\\372\\030\\2008\\244\\230B\\224\012+k\\245\\000>\\0268\\205\\217\\021Q\\026U\\331\\267\\203\\224X\\226\\0269u]\\007L\\326j)\\2451fp\\275\\022:\\273\\300\\200\\340\\340\\2422r\\350\\306\\301\\365\\363\\351\\342\\333\\227\\337\\010\\220\\004\\351\\342\\3542\\004\\027B\\352\\373\\266\\357\\307\\351\\264\\351\\272!\\245pvv\\361\\366\\355\\353\\305\\342,F?\\014n6\\233\\314f\\213\\213\\213\\263\\276\\037\\273\\256\\253\\313J\\347\\302V\\364\\367\\010LDVJy\\357g\\263Y\\210\\216\\231\\207a\\230\\317\\347!\\245#\\300\\215\\200(\\026EE\\314\\301\\373\\331|\\276\\337\\357\\225R!\\004\\224\\2420\\266\\033z%$qL\\311\\033c\\023)\\347\\001QK\\245\\005 J\\244\\344\\372\\321\\011]\\354\\272\\360\\323\\277\\371\\325\\377\\367\\223\\277\\271\\272\\351///\\237?9{\\362h\\271_\\257\\336\\274\\372\\246\\335\\254\\372\\375f\\350\\017\\222\\011(e\\025\\202n\\034@H\\024\\242\\033\\235\\322\\372\\331\\263\\347gg\\347\\000<\\216c>#\\307\\244\\265\\316\\350\\334\\220\\370\\230J0\\247\\0141\\225'\\225\\235\\017\\022\\265\\204\\304\\020\\003p\\022)I\\006\\315G\\225dfFT\\201!!\\010\\015V\012+\\241\\022\\252P\\022\\021{\\342\\233~\\\\\\365\\241:\\177R\\316.w;7$F\\253=%\\347\\202\\013)\\357Bc$\\357}Q\\030ff&\\206\\3041\\020\\021\\245\\300\\314\\352\\305\\327/@\\212\\351dSU\\325\\341\\320\\335\\334\\336\\001a3\\235<\\177\\376\\374\\373\\337\\373\\356o\\177\\363\\353\\252\\252~\\364\\203\\037\\266\\375\\241\\264E\\327u\\311\\247\\313\\317\\037~\\376\\364\\031\\010\\324R\\020\\260\\033{c-S\\002\\201Z*\\251\\305\\320\\365\\004)Zs~~\\336\\355\\273B\\353\\312Z\042\\322R\\332i\\223\\331\\377J\\200\\265\\026\\0213wM\\011C\\244\\224\\224Y\\365B\042\\307\\350\\3750\\016\\336qL,pR\\325\\300 \\200\\224D\\255\\225f\\011FK)9F\\001\\250\\264IL1D\\243\\0243\\3576k-\\3640\\216)8\\253\\225Da\\214\\321Zz\\357\\307\\324\\011\\011\\326\\250HA\\242\\320V\\005!\\011RS\\227\\266\\220\\323\\246\\376\\364\\223\\307Z\\032\\202\\304\\011\\310J!T\\234\\3259\\226\\367\\3758\\231\\324\\313\\345yae\\323L\\255\\325\\000Bk\\331\\367#S,\\254\\2367\\227n\\030Q\\260sN \\330\\302\\236\\034\\303\042\\000\\030-\\335\\330\\013\\201R\\210\\322Z?\\216\\314\\214(Jk\\264\\262\\303\\330\\011\\340\\272\\251\\\\\\217\\207\\375\\266\\260e\\356\\007)\\255)ri\\253|\\265\\221\\0353#\\330\\312\\242\\367D\\011A\\240\\013q\\014\\351\\374\\311g?\\377\\305?\\374?\\377\\366'\\337|{\\275\\336\\216\\323fq1[\\234M\\353\\325\\333\\327]w\\330\\337\\255\\274\\353R\\364Z\\011\\216\\011\\205\\3106p\\014$P\\2408\\032\\332\\334\\334\\334T\\315\\244\\251*\\231s\\0020\\211\\302I\\315\\376\\303\\250\\005\\3100\\020\\312\\226\\017\\307\\330, #\\2208\\021\\322\\311\\006\\367hu\\304L\\031\\260*\\210(b\\242\\3101\\222#\\212\\200^i\\024\\242c\\361~\\267\\177\\360\\305\\357\\311\\346\\354\\355\\325\\246\\264sJ\\201\\022\\373\\020\\275\\217\\304,\\262\\233\\212\\340\\354^\\300DD\\211S\\240\\024r\\306\\017\\000\\352\\217\\377\\370\\217\\2151\\214RJ\\231\\373\\202D\\314\\204J\\251z\\322|\\377\\273_\\306\\030\\245DTRKA\\211\\225\\320\\257^\\275Y\\255V\\210\\370\\311'\\217\\211\\310#\042@\\210\\261(\\212\\355v]\\024E\\242`\\255]\\236\\315\\013\\243\\212\\345\\234\\010\\2141\\3030tm+\\245\\004F!\\004'\\312[\\376a\\030R:\\366\\336\\372qPJ\\305\\350\\207\\223>\\261@D\\245r\\223Y\\001\\262\\224\042\\023w}\\364\\336\\013\\004\\362\\3169gt!\\215\\366>\\344\\244mpcY\\3261z%\\320C\\362\\243\\363JM\\352\\02291\\3610\\216)\\034\\253\\247\\330c\\214\\321\\030\\203\\210\\336\\271\\265\\277\\2131\\242\\006c\\314\\241;\\224e\\231\\274\\267Z\\247\\224\\224T\\272\\251\\373\\256\\277\\365\\357\\317\\346\\013\\000@\\342\\030\\235\\221\\245B\\020\\014!\\370\\300\\004\\024\\2551\012m&z87\012!\\264\\326\\316\\217Z\\251\\274R\\245\\350\\2551\\316\\271\\242(\\230\\261\\357z.HKED\\301\\015\\000\\320\\224UvO\\013\\243\\313\\371\\253\\226j\\034\\307\\321\\017\\2526\\343\\350\\254@\\215F\\304\\230\\273\\023\\300J\\225\\305\\337\\376\\342\\267\\377\\366\\317\\377\\303\\267oo7\\207\\241\\335u\\017\\237>z\\372\\340\\342l\\242\\336}\\375\\313\\241\\357\\024\\246}\\267\\023\\000\\024=sB\\200\\030\\343\\275\\341\\030\\021A\\002T\\260\\332n\\036{/\\232&\\353\\271\\002\\000\\235\\314\\354\\340?9r\\207\\374h\\230\\226]x\\030(\\021rb\\212\\202\\217\\336\\347|\\362J\\002\\342\\230b\\340\\024$!bB\\342\\024]\\004\012\\304\\322\\334\\016\\375'_|\\177\\317bs\\263\\266\\223\\305v\\3353\\010\\212)$\\317(\\224\\224\\221(8\\237\\241D!\\004\\342D\\024(FJ1\\237\\032\\221\\361\\317\\377\\315\\377\\006'\\217\\0048j:\\035\\013\\351\\221\\217\\210\\330\\254\\311\\022\\203\\2171\\001\\213B\\027G\\250;\\205\\020\\202s\\203s.\\327\\311\\245\\302\\242(\\254\\325\\271\\373\\340\\275\\337o\\017UQ\\036\\337\\212\\2669K\\316\\251sJ)\\306\\224K\\364GHy\\026\\273\\020G\\223\\221c\\206\\364\\221\\366E\\216\\356G\\210\\343\\321\\3430e\\206\\030\\001\\244\\304!\\305\\214\\332C\\020B\\2428j*\\001\\212l)\\004\\314,\\004d\\263\\205\\217\\317r\\312\\015\\216\\273\\361\\023t\\201\\265Rt\\232]\\367\\257\\215\\357]\\343\\263\\213\\353\\351\\213\\314,\\230\\360\\204#\\313_\\311\\227\\312\\307\\3042\\235nT\\010!P\\212\\243\\351\\016\\0108*\\230\\212\\243\\020:a<\\272\\377dIi\\001\\000$0j\\021B(X``r\\261\\260\\325\\365\\256\\265\\323\\263wm\\377o\\376\\364\\317\\376\\372?\\376R\\311\\342\\260\\332\\232\\004\\177\\370\\303\\337?\\237MV\\357\\277\\355\\272\\315n\\263\\356\\272\\003EG\\034)\\206D\\001\\000\\262\\026{\\002&\\206H)E\\216\\014\\021\\320\\330\\342\\007\\337\\377\\275\\311d\\242\\004\\266m[\\025e\\333\\266\042\\277/bfN\\211C\\01011@\\206|\\220\\200\\274\\314\0423\\013J\\234\\210R\\220\\200\\222\\011\\031\\0041\\020\\347\\230\\315$#\\245\\250AX\\311\\311\\307~4\\204\\205\\255P\\025r\\261\\364\\315t\\345i;P\\210R\\222\\004\\000\\2204\\370A+\\233\\343\\035\\000h\\255C8\\272\\0023\\334\\031a\\000\\000 \\000IDAT\\000'D\\344\\230\\230SY\\024u]\\253\\254\\276\\307\\034\\357\\037}~\\376\\031\\376\\233N\\355\\034\\000\\2101\\244D\\022\\244#\\227\\177cN\\007\\245\\304\\252\\252\\020!\\017\\221D\\241m{\\357\\307\\224\\030\\210s\\341\042\\203\\0342\\320,'\\326eY\\036G\\244\\020\\037\\0064\\342\\340\\006<9y\\346#\\277\\321\\\\\\263\\273\\277\\230c\\025)K\\357%\\3129\\\\\042\\020\\200\\331\\350(\\343Q3\\314:\\367\\005@\\260 !\\265`\\246\\374k?\\376m\\231\\217\\370\\237\\016\\350\\373O\\037\\377\\357\\375\\367d\\006\\032\\321\\375\\216\\010J\\243\\357\\343\\331\\375\\304\\273\\237~xt%\\314\\362\\255\012\\020\\255\\265\\000\\331^\\215\\323q\\346D\\000\\210!\\233\\335\\210\\373Y\\004\\000)A\\347\\306\\246ib?\\220\\363\\206E\\327\\015u3\\377\\346\\355\\365\\377\\371\\247\\177\\366f\\265gQ\\336\\255\\267\\334\\273'\\217\\036\\305v\\367\\342\\375\\213\\262\\304\\344\\372\\024\\034\\304\\300\\024\\021\\010\\005#c\\226\\205J'\\215\\347{\\223\\334\\224x\\030\\206\\253\\253+\\0240k&\\271\\236\\240\\224\\312.\\203\\037\\036\\313\\361^0\\333)0\\200<\\332>q\\226\\222?R\\007\\263\\217Q\\266t\\002FF\\243u\\030cpA\\260@`\\241\\314\\274\\231//\\0366\\313\\3137\\333\\366\\355v\\277M\\314\\262\\222F\\223\\207\\2341\\346\\035WV\\177\\314/B)U\\024\\305n\\267\\243\\256\\003c\\246\\223i]\\327V\\033!A\\035\\016\\355?\012$\\371r\\363\\200\\273\\037s\\000\\220\\371\\301\\200b\\267\\337\\016\\303\\220\\211\\025R\\312D\\234\\351\\264B\042\042\\346xFD9x\\001@\\006\\202r\\326-\\021\\342\\344\\353\\352\\177w\\300\\034\\317\\025)~<\\244r0\\273\\017\\204\\037\\217\\244\\224\\022\\020\\227V\\247\\224R6\\244\\310d@y\\\\+\\357\\003\\241\\226Z\\234l\\011\\272\\356\\360\\361\\351\\304\\351PJ\\235\\372\\004\\277c\\304\\221\\342\\011\\223\\216xz\\357x\\372Y)\\205\\024\\310\\204\\307 *$d\\376\\330\\351:!\\377\\010\012\\251\\325\\261\\224\\213\\002\\004J!1\\233\\356\\214\\203\\243\\274\\212\\334\\223eX\\000@\\244,\\007\\205\\037\\321T\\221\\200\\220\\020\\011\\275\\013\\032\\204.\\252\\024\\340\\3537o\\377\\364/\\376\\352\\315\\325f\\325\\215J\\227\\022dQ\\330Z\\203o\\357,$\\327\\271qh\\275\\353):\\201\\210\042\\023G\\220\\217\\366t\\247\\213\\344\\223q\042@`XmV\\227\\017.RJZ\\313q\\030\\244\\224>\\204\\220B\\360\\211\\031\\210\\340\\330\\372\\306\\243\\317Q6\\304B\\006q\\0144\\300\\014\\002N}s\\302\\243,\\025p?\\016\\326Z\\212\\274?\\354\\027\\213\\305\\227_~y~\\366\\320G\\274>\\014[GC\\022\\000\\222\\000)\\004N,\\005\\304\\350\\215\\024\\011 \\245\\240\\265\\314\\333\\323\\303j\\015\\004\\240\\224\\235/'\\223Ii\\013D\\2141R\\214*\\306l8'\\230\\351~5D\\304\\014D\\276\\237\\213x\\2246\\203\\302\\330\\276\\357\\307q\\254\\353:?\\350\\254&\\230w\\301\\314\\254\\215*lim\\311\\004\\304IJ}8\\354\\372\\276GDkK\\245T\\337\\367y\\005\\310g\\373x\\035gf\\251?\\210O\\253\\373A\\360Q\\032\\307'A\\272|\\272\\273\\365\\226\\242\\2171\\246\\354\\030\\244d\\376\\331\\020\\002\042f'\\000\\255\\245:\\332NrY\\226\\247M9\\177X\\372\\377Q\\340\\377\\335\\017\\367\\307\\307s>\\343%\\324)\\277?\\035\042$\\312X\\016!\\000\\205Dd\\204l\\300s\\232+|\\262\\030B\\202D(\\225\\270\\237\\256 \\217'\\025\\230\\231\\0079\\226\\343\\311D\\032\\031,b\\350\\006 \\024\\266\\034An\\234\\373\\223?\\377\\313_\\177\\373NUs\012\\343\\241\\335\\212\\230J\\003\\375n\\005\\034&\\213I\\267n\\3038p\\014\\220->\\020\\231\\216\\005\\212\\337\\011$\\000\\314 \\030\\224\\022!\\222R\\252\\231\\326m\\3276e\\225S\\304\\214\\337\\2101\\373\\027\\036\\3118\\210(\\344\\261`\\207\\3149<\\013&f\\300l\\026u\\224\\304d\\206lp\\313\\230\\342~?\\224\\245\\375\\342\\263gUSow\\207\\353U\\233Tu\\265\\353G4$5\\240\\212!\\206\\020\\004\\242P\\252k[\\242(\\245D\\245\\201y\\030\\206\\030\\002\\000\\324ggM\\323d\\253\\200\\261\\037\\234\\363y\\311U\\333\\315>\\273Lg\\241\\321\\373\\027,\\245d\\206\\343\\026\\025\\216\\205t`\\036\\307QkiL\\223E\\321s\\2405\\306\\000\\210c`fL\\211i\\364)q\\010\\356\\372\\372:\\003\\330\\255\\265\\263\\031\\225e\\231\\207\\362\\241\\355r\\\\\\3748\\235\\005\\304\\030\\022\\036y\\367\\037\\025\\352\\021\\373\\276\\3778p\\036\\277.`6\\233\\035\\023k\\370\\300\\271\\247\\373\\000|\\357MF9\\250\\207p47\\022(\\020\\020!\\233\\221B\\366_\\316\\002\\204\\377x(\\037\\207\\324q\\321\\310UVT\\306\012!@\\010b\\216t\\024\\372\\026L|T6\\025\\014\\200(\\0019g\\311\\037\\0379\\314\\177l#\\224\\327g\\310\\313`^\\026\\204\\312\\311\\312\\207\\237bFf\\031\042\\021\\010\\251\\035\\301\\301\\207\\177\\3677\\177\\377\\363\\257^Mf\\227\\327w\\033+\\224\\353\\267\\032R\\251\\225a*5\\356\\367k\\357\\006\\312~j\\310 \\216\\216\\256\\031\\033L\\031\\356\\234M\\235\\210\\004\\010\\002RJa\\364\\263\\331\\254\\252\\252W/^\\322\\331b\\3324a\\360G\\231%\\310\\356\\023\\367\\312~H\\214\\002)\\303\\222\\262R43\\003R\\016\\330\\247\\031\\203\\307\\275\\000\\223@R\\022\\215\\224\042\\322\\260o\\267\\316\\367\\254\\242M^\\225\\016\\364\\020h\\014#\0126Z\\021\\305\\321\\265R\\242\\017\\236A\\226\\205\\015!\\304\\303N4\\365\\247\\317\\276\\033\\211\\001\\240\\037\\306\\224\\222@4\\266\\314\\334\\016\\225s\\270\\0171\\3514\\230\\362\\033\\3728@\\302G\\373'f\\316\\302\\000y\\267\\224!\\360y\\2002\\347\\302E\\002\\020\\210<i\\246u]g\\263\\332\\224R\\327uy@\\027\\266\\274\\217\\304|R\\303\\007\\200Sd\\372\\035iSD\\314s\\361\\376\\237\\367a\\225)e\\254\\214<\\205\\300\\374=y\\017p\\304\\254\\347\\374\\230\\0011\\273\\232g\\3677\\020B\\235H\\031\\331g1}\\364'\\235\\376T(\\216vu\\300\\367\\006t$\\205\\006$J@\\234\\2300s\\277Qa\\214\\021\\220\\230\\005!\\023A\\306o\\374\\243\\271\\201(\\021\\030A\\002\\220\\033\\334\\375s\\346\\373\\265\\2039W\\353\\357\\3577/\\352\\222\\311\\244\\210\\240\\333@^\\250\\233n\\370\\311\\337\\376r\\237$\\004f\\222Za\\005T+l\\024j\\210J\\253\\276s)\\005d\\220\\022\\231%\\001\\247\\223Py6%\\3730UNn\\224\\211HJ(+KD\\233\\315\012\\200\012c\\362\\213\\316\\0073\\013T\\000\\037\\255c\\210\\010(\\362\\034=\\226=\\030\\216\\3501\\316\\302b\\221\\210\\030\\220\\211(M\\213\\022bZ\\337\\3344\\363\\345'\\237|\\326\\311\\342\\345\\366\\320;\\366 \0421E\\226\\212\\221\\201\\330;\\337\\025\\272\\250\\2122\\2040t\\007m\\313\\311\\305\\205),C*\\313\\232\\210\\034\\373\\020\\002\\242\\022Z\\020\\0013\\252L\\312\\005\\200\\223w\\0300di\\353(\\204P\042\\257\\340G\\373[\\000\\310\\252\\027y\\004k\\255\\205\\020)\\3610\\270,@/\\345\\261I\\004 \\004*!\\301\\005g\\214\\266E\\241R\\002@\\255\\365\\357.\\323\\230\\210\\370\\364\\346\\362D\\272\\317\\200?\\032\\001\\230\\361\\237\\037\\036\\342?\\036\042\\010\\300t\\362\\202!<Z\\015dV\\246\\000!\\004\012)\\205\\020\\306\\212\\234\\305b&\\013\\010\\310\\256\\256)fJ\\347\\261A\\203B@\\006\\357\\202\\000\\004@\\301\\307w\\204\\210\\200 \\206a\\300#\\340\\014\\360\\330\\010#\\01490!\\000r\\006\\030\\037\\313V\\220\\257\\377t\\255\\037\\316\\253\\245\\202\\373\\371y2\\017\\317\\036SDG\\005X\\201\\002O\\302\\237\\0050\\002u\\250\\222T?\\375\\305\\257\\257\\207\\350\\204\\275\\335\\266sc\\302a[p(\\230a\\034\\035\\215\\301\\037\\035\\015\\363\\371r\\353!Q`F!\\324)\\362\\323\\375\\\\\\222,\\0319\\244\\250\\214\\024J\\246\\024\\224R\\233\\315FK\\234\\315f\\361t|\\024\\3650\\277f\\310>\\356\\010|r\\252=\\365\012\\231\\021N\\231:gTEi\\3640t\\213\\262~\\366\\311\\363r:\\277\\352\\207\\327\\273\\315\\255\\243\\003kVB\\203Q\0120y7t\\021FD\\350\\017\\373\\242,c\\364\\024CQU\\313\\345\\334\\024\\245\\224\\362\\363\\347\\337UJu\\303x}}\\275]mc$@il\\251r\\256y\\032\\023\\224G3s\\312Y\\340}>\\220\\2239\\000pn\\310\\016K\\367\\267\\207(\\265\\326\\231\\367\\232B\\314\\355\\025\\224\\202b\0121\\372SU\\216\\210r}#\\223\\021s,\\007\\372`S\\233_\\252\\320\\372>B\\177\\\\\\360\\242\\223\\365\\240\\370]i\\352\\274z\\336\\207\\232\\374z\\024b\\236`\\312HD<\\372\\205#\042\\200\\024\042\\327\\372\\217O\\233X\\200``\\243\\025\\037-\\234?L$\\221_\\025@\\002f\\006:z\\275S^\\213\\024bN\\243s\\000s1\\204\\020O\\345\\274\\314-\\3153\\200\\021\\261\\264\\005d\042\\335G+\\017 \\347\\206\\350}\\212u\\2777\\220BH)\\356\\313|\\000\\202\\021$\\205\\224\\022\\010\\241\\253*\\260\\370\\223\\377\\367'fvI\\224\\346UA\\207=\\216\\343\\274)\\300\\2671\\270\\272*\\006\\327s\012\\214 N\\213\\377}\\311(\\203\\233\\341\\303A\\000H\\202\\0308E\\250\\214\\222\\022\\031\\241\\231N\\256\\256\\256\\256oW\\246\\250\\000\\362\\334\\226\\200\\210R\\310\\337\\311\\243\\004\\347\\232\\005s\\312I\\0070e\\247fb\\301\\000L\\222\\022\\022`JZ\\310\\371\\362\\342\\341\\331e=\\231\\255G\\177\\263\\357\\333\\300\\272lJ\\260\\235\\013\\243\\3535\\002BJiL\\030\\225\\022`t\\010Ij\\263<\\277(\\353\\011\\010\\371\\350\\321\\243?\\370\\303?z\\360\\340\\321\\331\\305\\305d2\\035\\206a\\265\\332\\354v\\273\\335\\366\\260\\337\\357\\025\\243`\\000fB@\\231[\\367\\002\\020E\012\\011\\001R\012\\314I \\336\\027\\252\\2018\\270c\\260\\021\\200L\\034\\223#\\242\\350\\363R\\212\\014\\300)0\\013-\\245\\326vb\\246 \\263J7\\305\\030CH@I\\011\\231-)\\004\\002\\212\\323/\\347\\314AKB\042\\236\\334H\\363\\320\\311q=Gt\\372(\\234#\\222\\2249O\\005\\000P\\250\\356\\237\\261\\221\\212\\231)\\021\\003\\250<\\033\\363}RB\\205JH\\220\\277cN'\\000R^\\207O\\266\\320\\314\\214\\034\\201\\2018\\346\\206\\2272\\352\\030x\\022Ye\\004\\262U\\022 \\371\\024\\245\\204ZK\\357\\331\\232:\\306\\024#i-\\363\\306\\261\\357\\332\\305b\\221\\210\\206aP\\326\\370\\030\\230Yi\\335\\367\\2751\\206\\262\\0036\\035wO\\000 \\200\\001AK\\225\\211\\267\\3169\042*\\313\\212\\022)U\\000\\361\\310\\330%\\372\\017?\\373\\033-U\\277Z\\237\\333\\211[\\255\\226Vy\\0141\\244\\024\\372\\302\\232\\266\\357\\032[{?\\002R\\342\\230\\275\\213\\322\\311\\222\\236\\031\\262\\262\\272P\\230\\255gAHfNDF\\303dRw\\335\\301\\230O\\272\\241O\\314\\235s\\267\\233\\315'\\217>e\\251dH\\307\\324\\310'\\310\\202!!\\300\\375\\014\\226\\002\\022\\021\\003\\021k\\243}\\337\\223\\013\\026Q\\021SLF\\310\\322\\326\\363z:;\\273,f\\363\\255\\017\\257v\\375\\373.\\366BQ\\204~\\354\\224\\326(\\301\\207\\201\\311\\013\\005\\210\\311;/e\\225\\030g\\263e=\\2352\\363t6_,\\317\\017\\335`\\367{\\226bw\\330\\013!\\246\\363\\311\\371\\345\\031\\000\\250\\234\\250\\301\\211\\317\\210\\230\\335\\031\\000\\021\\211\\023'D$\\316S\\023R\\036vy\\035\\021\\037I+\\344\\234\\370T\\326\\345,\\355\\0052\\227\\271\\360\\230U\\000\\360Q\\233\\207\\340\\330J\\370\\220<\\340\\207}\\036\\235*\\016\\277\\223\\276\\023Q\\327u\\000po\\300u\\312\\241\\205\\020\\331\\363\\343~;}\\337\\206\\025\\202I\\234\\222\\245|i\\214\\240\\265\\306\\274\\017d \\210H\\310\042\\347$\\3078\\006|\\254j\\023\\021\\0227\\205eV\\021\\230\\020P\\010F@\\026,\\250\\251\\253\\261\\037\\206\\241\\223R\012\\011)1%/D\\366\\254\\021Z\\353\\262\\264\\371q5M\\223{L|\\232f\\221\\022\042j\\255\\2151\\307T$_$\\243D>\\336;\\020SL\\321[\\243\\204P\\314<\\366\\003Z\\003R'@;\\231}\\375\\362e\\362\\201\\3064\\216\\251\\226\\010c'S`\\214B`\\214\\036\\231cL\\234\\200\\3451\\267\\243\\373\\224\\371\\264D|xX\\331\\017\\210\\231\\031b\\204\\252,BL)\\245\\262\\251\\267\\207=E~\\363~et1\\233\\315Kc\\333\\266\\015\\316\\033c$\\3420vVgL\\005\\247D\042\\021\\002!\\203F\\001!i\\020 \\025\\244\\0101i\\024\\263\\252\\231LfFV.\\322fsX\\005\\277\\213\\020M\\031\\001\042\\261R\\312;G\\321\\013d\\224@D\\211\\002DJ\\310\\217\\237|\\246\\265N)\\331\\262h\\333\\376\\027\\277\\370\\345\\305\\203\\325r\\271\\254'\\315\\027_|a\\255}\\177s]\\024\\305b\\261\\330\\355vJ\\234\012\\030y\\360d^;3g,:\\262d>q\\301\\363\\267I`\\004b\\020x\\362\\232d8Z\012\042\\212l\\233\\005\\271\\037\012\\000\\011O+[^y\\2458\\255\\271(\\356\\363\\260\\354\\020 \\216Z\\010\012>Rl8~`\\252\\253\\352\\343\\305\\372\\376\\035\\235\04273\\347z\\360\\361\\263\\000\\301\\247t\\346X\\271\\310>z\\247\\225\\235?*\\261\\003\\200s.\\317\\023)\\245\\306\\017\\271M\\364\\2011\\337\\004\\036\\353\\256\\000\\210\\270Z\\255\\2546\\322X!\\204\\224H)\\022\\241\\020\\306\\271`\\214M\\220\\266\\207\\275\\020\042\\004\\237\\007qU\\327}\\337\\357v\\2731\\370,\\334\\001\\314\\207\\375\\336\\232\\352\\270\\350\\037\\215\\3531\\347\\265!\\004c\\224\\3262\\245\\22451\\224\\205\\262)\\373\\316%U\\274|\\365\\366\\305\\267oB\\010\\314(8\\031\\255\\3428 '\\212^)\\341\\335`\\225\\3661\\342\\351i$\\376\\220\\274}\\374\\014\\351\\364\\020r*\\310\\014J\\201s\\256\\353\\007f\\276<[\\276}\\365Nj\\254\\225|\\363\\366-\042.\\347\\013)\\005ki\\254V(\\230)w\\000\\024 \\002)FAL1a\\212\\311\\207\\243\\267\\020\\010a\\224-\012\\254*oM\\353\\343\\320sK\\335.Q\\007\\340\\204N R\042fN\\024\\230H\\310\\254B\\355\\001A\\330\\352\\374\\374\\0213\\244DJi\\212\\344\\274WJ\\265m\\367\\354\\331\\347\\317\\236=k\\232\\311\\341p8\\233/\\333\\266\\275z\\177m\\255U9v!b^\\270\\221E\\016\\330Bd\\307\\252\\017\\303\\016Q\\000\\322\\361\\235b\\306\\231 \042\0421\\001K8\\326^3\\3212o\\364\\376\\177\\262\\336\\354I\\322\\353\\272\\023;\\347.\\337\\232{fe\\255\\275\\243\\321h\\200$@\012\\002\\001\\216H\\221\\216\\240%J\\036K\\226\\3063O~\\262'l\\277\\372\\301\\177\\214\\355\\211\\360h\\024a[\\036\\333\\243\\361\\230\\036k\\210\\221&DQ$\\261\\020\\013\\261\\366\\336\\325\\265e\\345\\376\\355w;~\\270Y\\205V\\250\\036P\\035\\205\\352\\310\\252\\316\\373\\235{\\316\\357\\374\\026 \\362\\343\\037\\002\\000\\003\\3018C\\360_\\022\\0271\\343\\210xy\\240\\001$1\\347C\\211\\236o\\224\\235seYx\\327b\\337\\323\\373k\\341\\262\\324\\374\\235\\323\\017\\0147\\357$\\342\\305\\010\\017\\000\\233[\\302\\021\\340W;\\302\\313\\371\\3013\\245./\\004?\\321#\\242&\\353\\037\\371\\313\\237\\326\\357WD\\020\\304I\\242\\265\\316\\213\\202\\241@\\301-A\\243j\\006x\\357\\336\\227[[\\343 \012\\242(\\022\\201\\004\\306\\310\\330\\307\\207O''\\247\\307\\307\\307u]\\357\\355\\355\\275x\\367\\245\\361x,{\\203,\\253`\\203pY\\237\\372\\002\\340\\317\\264\\363\042|\\3254B\\210 \\010\\210\\270&G\042\\316jz\\373\\257~\\226\\027\\265sD\\216\\342(\\322E\\011\\246\\011\\231\\265V\\003\\347M\\323\\004<p\\344\\030\\367T\\372\\213\\205%\\302%k\\2311\\346\\374/\\3066\\375\\225\\177\\306\\307\\333}\\000pd\\313\\252\\350\\367\\373\\275^\\272\\314\\212\\2461H0_L\\200\\264\\217y^\\257K$\\342\\310\\000\\230\\004\\3068\\017\\001\\031\\001\\0322\\215\\262J\\343E\\311\\340A\\030\\246\\011\\213\\202\\2651\\345bQkFa\\344\\002Y \\025\\326\\325\\216\\210\\011D\\256T\\303\\030\\212@XkM\\243\\201\\\\\\324N\\333\\235.\\022\\033\\014\\006\\213\\305b:\\235\\366z\\2750\\010\\266\\306\\343\\267\\336z+n\\245UU\\021QQ\\225~1\\022\\206\\341\\351\\351\\251\\340\\354B}\\200>Q}sF8\\373\\252\\037\\365\\326\\014\\210\\340\\220\\001\\342\\306I\\030\\375W\\210\\261\\315e\\346\\217\\344\\346\\312\\004\\237\\342\\007\\034\\2206$\\025\\342\\270\\001\\213\\010\\310\\277\\026\042Cd\\027\\013\\005\\006\\340\\220\\214_\\256\\301\\305\\364\\355\\034!\\022\\347\\210\\300\\030\042\\003@\\3173\\007p\\210\\036\\200\\206\\313\\003\\007\\210\\027\\227\\000\\300FS\\201\\027\\340 \\003\\306\\310\\317\\011_=0\\027\\365I?\\377\\010\\321\\005Z\\262\\021k0\\377H\042\\0200$@\\020L(c\\034a\\234\\266\\3030b\\234+e\\232\\246Z\\317\\347\\377\\313\\277\\370\\223\\177\\360\\333\\337\\377\\336\\367\\277\\253L\\023\\206a \\303Y6M\\222\\344\\332\\265k\\333\\333\\333\\344\\\\\\020\\210@\\260\042[)Ci\\253\\007\\304.\\326\\306\\326\\317\\237\\260\\311Y4\\215RB\\2628\\016\\011Qk]\\226\\025\\227\\243O\\357\\335\\273\\367\\370\\270\\261@\\204\\266\\256,\\343T\\345\\021\\031N\\316\\221#\\003\\276W\\346\\2343\\344\\3066\\366b\\023E\\317-A\\375u|Y\\005\\214s~\\361\\347\\234\\263V\\011\\301f\\263\\363\\376\\013\\375\\327\\276\\371\\352\\375\\373\\367\\037=\\232p\\001Y\\256\\214>\\353u\\332\\221\\014\\3019\\316x\\024\\005\\234\\030\\022H\\007\\350,\\327\\326)\\215\\312\\2002R\\004\\300\\2218\\203 P\\310U\\243\\227e\\261\\310+\\331\\0320\\306\\200\\361\\006\\251&R\\316\\201\\323\\010\\316Y\\315E\\010\\004Vip\\030\\244\\255N\\273\\227$m.\\343\\223\\243c\\316y\\257\\323\\215\\242\\350\\353_\\377\\372\\213w\\356\\030cTU\\317f\\263\\313\\005\\234w\\240%k\\305\\346\\276\\363o\\276\\377\\235.\\336\\343\\277\\363\\313_\\364$L0\\367\\374j\\003\\321\\203\\003\\326\\0372\\306\\020\\220\\030z\\266\012\\007Dg\\231\\257\\373~y|\\201\\311\\333\\213\\231\\017\\361\\253\\372\\212\\310\\244\\020\\227\\233\\210\\347G@\\317\\345p\\366\\253\\362\\351\\337$\\306\\270\\337\\305\\021\\363{9\\177\\3278\\006\\334\\241\\365c\\252\\377?D\\014\\001\\001\\210\\341\\206Zt\\321\\374y\\246\\324\\006\\215y~\\321c\\201\\214%`\\033\\254\\003\\374\\243\\011\\233\\222V\\024\\205\\224\\241\\227\\374\\024eM\\204\\314\\331\\363\\303g\\256V\\017~\\375\\311\\0137\\257\\277\\372\\033\\337Z\\347\\331\\323\\247Oo\\336\\270Q\\227\\025#h\\352\\232s.\\004\\003\\206a\\030jKJ\\177\\365/\\311\\320\\357b6\\251yM\\255\\000 JZ\\332\\230F\\3514M[Q\\362\\353O'\\177\\375\\213\\017A\\246e\\265\\000\\007\\316j[\\026-\\311Yc\\321i\\016dt\\3439C!c\\204\\233\\304:O\\313\\271\\274\\313\\274\\020\\317\\227g\\267\\341\\234\\370\\247\\010\\254\\265US\\245\\355\\2267\\325\\356v\\323\\353\\327\\257\\356\\354\\214\\036<x`\\264v\\306)]\\206\\222\\267\\332i(\\003\\311\\244d\\034j\\243\\252\\332\\324\\312*\\003\\306\\242#\\3169\\023\\034e@\\222W\\316\\255\\363\042k\\232\\322j\\315D\\330\\353+`\\2155\\312\\031K\\210\\2349K\\3164\\214s\\262\\272n\\014\\030\\033%I\\257?\\212\\242\\310Z\\227\\227+\042J\\222\\344\\356\\335\\273/\\275|7\\014\\303\\345rYU\\325t:\\215\\343\\270\\250+)e\\253\\325\\312\\262l\\235g\\303\\341P0\\330\\200\\235\\233k\\365\\342\\343\\371#\\353.\\360\\363\\315 \\006\\227,<\\006\\027\\345\\330\\371\\014\\217\\313\\225\\027\\200\\177(\\220\\010a\\263o\\244\\015\\325P\\370\\031\\004\\021\\035\\020\\0001\\334,\\316\\010\\010\\030\\363\\371\\336\\264\\201\\344\\310\\277l\\226e_u\\010\\300\\361b1n\\255c\\233>\\311\\241\\377\\241\\000\\035\\020\\337\\3049\\023cx\\221(\\016\\036z\\263\\200\\376\\020\\303\\3056\\007\\021\\2759\\311%\\010\\270\\301d\\234\\345B\\240\\273\\020\\203:\042\\262\\233G\\223\\320\\352fs\\356\\255\\035\\017\\372Q\\224\\024\\263\\371\\321lq\\320\\356\\275t\\375\\306\\335\\253\\327g'g \\370\\255\\2337\\275G\\231o\\231Z\\255\\0262VU\\225\\266V[\\267\\361\\263%\\000$\\007p\\371\\017o-\\241\\214\\244\\224<\\210\\313\\272\\260(\\035\\013N\\317\\327?{\\377\\327\\217\\216\\347i\\277\\253-\\242u!\\347N\\327A\\310\\235\\323@J\\004\\3204J\\010Ad\\031c\\236qqy\\232/\\337S\\242\\213\\375\\212\\277J}\\243\\303@J\\336j\\265\\010\\235\\020l0\\350i\\335\\224\\325\\232s\\271\\273\\267\\275\\277\\267\\343\\234Su\\243\\252\\032\\211\\011!\\030\\200Q\\272\\236\\227\\332\\030\\247\\224Q\\015i\\313\\000\\204\\024\\2141\\345\\3108\\255jSX\\273,\\353\\2024\\023\\241lu)H\\2145\\265\\326FY\\000\\000\\316\\0216\\255\\2511\\006\\210\\2024\\351t\\007Q\\222\\002\\200iL\\030F\\243\\321\\350\\225\\257\\177\\355\\340\\340`\\265Z=z\\364\\250i\\032D\\254\\352z\\275^\\207a\\230F\\361\\203\\007\\017\\222$\\341\\310N\\216\\216\\205\\307\\304/\\016\\250\\277\\237\\031^\\312h.\\346\\305M}\\276\\240}=WS7\\3739\\177\\274\\210<\\357z\\263\\260#\\004\\346\\034\\371\\003\\207@\\316w\\032D~\\230D\\377J>\\225hsI(e\\030w\\034\\320\\0029m\\0149\\201\\002\\030\\013\\303\\320\\301\\306r\\207\\203\\317P\\364/o\\000\\340\\002l\\335\\3748\\214\\200\\300\\241\\337\\352\\0011\\000\\002d\\340\\243\\373\\276\\032\\211\\330\\305\\322\\321\\347^n\\224\\007Bxz \042\\242ABb\\036+\\361\\350*l\\236\\032.\\003\\000\\010\\343\\024\\211B.Zq|\\357\\263/\\376\\365\\237\\375\\357\\331\\323g\\377\\360G\\277;<\\330\\207\\262I\\243p\\335\\324\\263\\363)\\227B0\\31697Z\\027E\\261Z\\257\\027\\353\\325pk\\324\\351v/v\\305\\340\\227c\\016\\300G;#\\343\\202\\013\\024\\201\\243PF\042\\215\\343\\331t\\361o\\377\\335O?\\277\\177.\\342\\366\\252h\\204\\014\\233r\\025!p\\253\\253,\\217@;\\247E\\0308\\347x \\375\\340b\\255\\205\\257\\006\\215\\015\\350\\344=\\276\\234s\\264\\331\\364\\373*\\016\\234#\\223b\\271^\\001\\270\\262,\\271@\\031p!cD<==\\341\\310\\030\\242@\\306\\000\\215\\325e\\2766\\306p\\213&\\327NiSkk-\\000\\021g\\310\\031\\011\\221\\327M^V\\225q\\032yMd@\\206A,\\243v\\321h\\215H \\300*p\\032\\214E\\301\\031c\\316X\\000\\313\\203\\250\\335\\351\\305i\\313\\001\\032c\\010\\331+\\257\\274\\362\\372\\353\\257kk>\\372\\350\\243\\345r\\351\\234\\253\\252\012\\000\\212\\262\\034\\014\\006gggggg\\225j\\204\\020\\353\\365ZJ)\\340\\242\\3245M\\223\\246iQ\\024A\\020Xc\\245\\014\\363|=\\034n\\025E\\301\\271\\337\\004\\201\\340\\274n\\252(\\010=\\006\\027\\206\\221R\\252i\\232 \\0149\\343Y\\226\\305q\\352k\\201\\224\\242\\256U\\034\\006\\204.\\214b\\243T\\243\\3530\\014\\205\\360\\204U\\014\\242 \\313\\363\\321h\\253\\252\\032G\\224\\246\\235\\325*Kc\\331\\324\\315\\240\\333+\\262\\334\\022\\311 \\262Z1\\036(\\243=D\\002\\000\\326Ym4\\343\\034\\245\\024\\202\\2031\\034\\010\\200\\2228R\\312X\\253\\30304\\344\\232\\246q\\316\\010\\021DQ\\210\\004Y\\2213\\300n\\277\\227\\227\\265'\042\\206aX\\327u\\024EF)\\277\\364\\011\\202@\\325M\\034\\305J)\\311\\2051V\\010f\\235\\216\\303P\\020\\326\\265b\\214'Ib,ee!$\\217\\222\\226\\325ZrQf\\353\\330\\301\\237\\376O\\377\\243Y\\256\\257\\306\\235\\374\\311\\321\\374t\\2625\\030F\\333a+\\214\\025@\\020G\\246\\321\\000\\030\\006\\321b\\265|\\357\\203\\017\\252\\246\\352\\234\\365\\243(\\032\\366\\372\\203a\\257\\333\\355r\\316\\233\\252IZ\\351\\371d\\035\\245\\011g\\354\\354x\\372\\354\\344\\304YV\\325\\272(\\325z\\235\\377\\362\\303/(\\332\\256\\034X\042\\347\\2001\\000g\\221\\\\$8\\252ZJ^\\325\\225\\347L\\010.\\253\\252b\\200\\326Y{\\361\\240o@h\\330tV\\312hK\\300\\330\\305\\335\\205\\233\\307\\273\\252\\252\\235\\3351\\003\\264\\326\042\\202`\\242\\225\\306\\0140\\3132@&\\030o\\312\\032\\001\\004\\343MQ\\201v\\272RJ\\031\\307Q$!1\\\\6*\\3173\\355X\\355L\\203h\\221YD\\207\\022e(d\\354\\230\\314\\326\\031\\370\\264jK\\200$8\\032m\\002\\0314J\\265\\372\\235 \\211Q\012\\243M\\230\\244\\337\\375\\356w\\343(\\370\\350\\327\\037\\257\\327\\353\\351t\\3526m\\236\\364:\\211\\331l\\346\\234\\253\\353z{{\\373\\311\\303G\\243\\321H\\327\\215\\000\\360\\234\\013\\020\\201\\004\\000\\021\\204L\\010\\031F\\326P\\020\\305\\004,N\\023k\\255\\266\\3261f\\311Ea\\314\\020\\214\\261Z\\033\\242\\032\\231\\220\042\\264\\226\\264V\\355\\316\\240\\252*cl\\247\\323i\\214\\016$\\023\\201\\324\\015\\025U\\335\\355v#H}\\310q\\234&\\336\\036\\356\\370\\354\\354\\337\\376\\305\\333\\237}\\366\\305\\335\\273w\\001\\371\\371dr\\355\\332\\225[7\\256l\\215\\007\\201\\010\\0011\\014\\202 \\014\\231\\340\\350,\\000\\313\\213\\022\\034%\\255\\264\\325N\\215\\263FYm\\232$\\010\\030RY\\326\\322Y\\013VF\\241q\\256,\\313~\\277Od\\313\\262\\254\\313\\312:\\315\\031\\223R<}\\372\\264\\335\\355_\\222\\3706\\331\\020\\214I)\\275~\\026\\011.\\301;\\316\\271sFrQ\\346y\\310d\\247\\335EbY\\221+my\\020-\\327\\371pkT\\226\\265 \\334\\033o\\375\\311\\377\\360\\317\\\\\\231\\207\\326E\\215\\241\\254BGO\\357\\337\\177u\\177\\317\\240\\011\\203\\240\\254jO\\023\\000\\306\\266\\266\\266~\\370\\303\\037\\002gES\\213H\012\\302(\012V\\253\\325\\361\\323\\247o\\277\\375\\366\\257~\\365\\341\\356\\336\\376\\316\\316^\\030\\267\\017\\237\\235T\\265m4\\355\\356]\\3432\\376\\362\\213\\007<\\3524\\216\\031\\353\\234\\277*\\3112r\\314\\331\\347h\\013\\027w\\335\\305\\207\\275$'\\372\\201\\301\\207^9\\362\\3353\\370\\357\\247\\347[\\035\\313\\005z\\322\\030\0420\\006\\214\\203\\224\\262\\251\\312^\\273e\\2653J\\265[- ,\\362\\\\+\\333\\344\\265`RD\\322 \\025\\246)\\215\\252\\215UH\012\\254b\\240\\211\\003!p\\211\\\\2\\021\\021\\240\\265V2n\\264&g8\\010\\301\\031\\030\042e\\033]v\\206[Q\\022\\247\\355\\326|\\231mo\\357~\\373\\215\\267\\216\\216\\216\\326\\313\\371b1s\\326\\226\\236\\305\\252\\024\\000\\370h{\\237t\\023\\206\\341\\323\\247O=%p\\177\\177_\\024U\\331\\211z\\340\\260\\321\\252i\\2120N\\033mA\\333\\341p\\253(\\262e\\226GI\\350\\0341.\\030\\347\\336U\\007\\311\\011\\021 \\243\\272i\\010l\\030\\004\\310x\\236\\255\\302\\264C\\214\\307\\255\\370\\361\\3413\\002\\030\\015F\\246\\322\\255V\\212\\214*\\255\\233\\246\\331\\332\\332r\\316\\017\\340\\370\\347\\377\\372_\\377\\331\\237\\375?\\275^\\310\\271\\374\\345;\\357\\355\\036\\034\\354l\\215\\377\\352?\\374\\365\\361\\361\\215 \\344\\355\\244Uk\\205\\216\\306\\273;\\327\\257\\\\\\335\\332\\331\\256\\362\0129o\\247)\\023\\201\\003\\324\\226\\000\\230\\010DV\\225\\355V\\312\\202\\240\\261N\\325J\\033\\227$I\\267\\3373\\3162\\306\\222V*\\204\\230\\317\\347eU\\017\\223\\326x<\\266\\204\\306Ym\\0153z\\343yb\\255\\326\\032\\361+A\\212\\037\012\\003.\\254#\\255\\3538\\014\\235v\\347gS@\\236\\266\\272I+\\250\\215\\335\\277\\262\\363\\370\\311\\303v\\232p.\\237<x\\370\\344\\301\\375q\\247{\\260\\327;\\020\\255X\\204\\017\\227\\323\\371\\344<\\211\\343\\343\\311\\351\\376\\255q~6\\221A\\244\\033\\325\\212\\343\\303\\343Cm\\215r6\\351\\266W\\363\\351\\331\\351\\311\\240\\333{\\377\\303\\017\\246\\323)c\\2543\\030\\334~\\371\\345\\363\\311B\\225\\252\\277\\265k\\027\\00558_\\353\\331b^*\\306\\001\\254\\264\\032\\010\\321\\001Y$B\\260\\200\\226\\300y\\336\\233\\275h\\005\\301C\\201\\340\\254\\265\\2266\\376\\032\\276\\017\\331p\\340.\\366\\255\\233\\006\\214m\\376\\226\\265\\226\\013\\356\\037?o\\215\\003\\000\\214A\\030\\206\\355$\\255\\313F\\003\\017eX\\344\\371z\\261n*c\\035#&\\020\\241r&\\327\\266\\320\\246&c\\020\\265#\\357\\001\\015\\026\\000Q\\204\\011\\223\\001\\021\\231\\272f^Bk\\254\\010C\\016\\\\\\033C\\204\\300\\330pk\\\\i\\263\\314\\213\\337\\374\\366\\033\\275\\356\\340W\\037~\\260\\230\\315\\035\\231\\252\\252$\\343\\215\\321\\000Z)%\\215\\365\\346\\256YY\\305q\\334\\030;\\332\\336\\261\\326\\032\\202\\343\\263\\211\\370W\\377\\346\\377\\036\\215FZ\\333<\\317\\203 z\\365\\325W\\273\\235~\\230\\304_\\276\\363K\\306\\230R\\372\\352\\325+\\000\\300%\\213\\242\\010\\0341Gdl\\302Q\\312@9$\\347\\034\\343\\332\\330\\355\\375+\\253<\\373\\237\\377\\371\\237\\236\\236\\236\\256\\327\\353\\361xL\\204w\\356\\334\\356tS\\255\\233\\203\\203\\203;w\\356\\224J\\267\\333\\355\\303\\303\\303\\237\\376\\364\\247\\357\\276\\373\\336\\033\\337\\371\\226`\\374\\360\\350\\270\\235\\266\\215\\265\\247\\223\\351\\213w\\357\012F\\313\\3252\\010\\223V\\273k\\255]\\255\\313\\277\\371\\305\\273\\2141k\\2557\\235I\\342\\326\\336\\336\\336x<\\216\\343\\230\\300no\\215\\237\\235\\236\\021Q\\253\\325\\272~\\365\\000\\000\\202(Ru\\223v\\332EQ 9$\\354\\017\\267\\224RUUq\\316\\011\\2011vi4\\241\\265\\276\\204\\311\\254\\265\\027\\216@X\\3275\\031\\353i\\220EQp\\220I\\332\\346\042V\\006TC \\344\\223\\223\\363?\\373W\\377\\246\\027G?\\372\\217\\276\\337\\024\\325?\\372\\303?x\\357/\\377*\\237\\314\\372/\\354Ym\\3428\\376\\336\\367\\276\\377\\311\\027\\237\\377\\345{\\277T\\377\\236\\337|\\361\\316\\365+W?\\377\\354\\263/>\\373\\362\\265\\327\\276\\361\\316{\\357\\356_;XV\\371\\207\\037}4\\350\\367\\337x\\343\\215\\305*\\277\\377\\360\\311`0xv2\\271\\236\\325 \\303u\\251\\270\\020Q\\322\\355m\\015\\036=9>_\\226\\243\\255m\\345@\\031k\\310q\\341\\000\\034G\\257\\370r~\\022\\367\\350\\223%D@\\211\\317\\245\\\\m\\266N~\\374'\\3320\\3406\\345\\031\\375\012\\354\\202O\\002\\000\\336\\255\\375rXr\\316\\221uq\\020jm9p\\231\\004V\\351\\371l\\271^\\345\\202\\307\042Ik\\345\\352\\252iHk \\313\\2055\\244\\255\\001\\002\\340\\236\\022\\014\\300\\004\\017B\\344B;k\\214b\\004\\344\\014\042\\223\\214[c\\255\\265Q\\332\\332\\271zp6\\233\\037\\\\\\277\\361\\265\\257\\177c:\\231}\\362\\363\\277e\\304\\232\\246q^K\\205\\340\\035 \\374\\345y\\271\\011\012\\202`\\261X\\244i\\352\\234\\3631@\\0028\\313\\312\\242itY\\324v]\\376\\372\\363/\\234\\2454Mwww\\353\\2728=\\235\\234\\236O\\226\\313e\\020\\312+W\\256\\214F\\243\\275\\361\\216HB'ea\\214!J[-c\\355t:\\377\\331/\\337\\371\\360\\343\\217\\236=;F\\316\\025\\260\\332\\001\\221\\373\\362\\361\\343V\\022q\\216\\357\\177\\370\\361\\325\\217?\\331?\\330\\353\\365z\\017\\036\\334\\253\\353\\032\\205\\254\\225~\\372\\370~^\\224E\\253\\034\\357\\354\\032\\245\\365bu\\345\\352^l-r\\231\\227u]\\327Q\\224\\204q\\352\\215;\\342\\264]UUQ\\224\\277\\376\\354\\263\\342\\335w\\203 h\\265\\333\\207\\207\\207\\210\\270\\263\\273\\035\\206\\341\\255\\0337\\237>}\\272\\275\\275\\325J\\222^\\257\\263\\275\\275\\275\\267\\273]\\226\\345\\260\\327\\037\\014\\006\\266\\252\\207\\303Q\\236\\255\\374}Z\\327uS\\325eYz\\256HS\\024\\276u\\216\\242(\\340\\242i\\032\\316y\\030I\\031\\305\\316\\201V\\224\\227&\\317g\\232D\\324\\356\\266\\006\\235\\177\\361'\\377\\353g\\237\\336\\357D\\241@\\261xx\\377J'y\\366\\370\\311\\353/\\336\\225\\222\\357\\356\\357S\\261~\\357\\343\\017\\377\\217\\237\\376\\345?\\375\\357\\377\\273\\277\\372\\371/\\036\\035\\035fU\\375\\263\\277\\371Y\\271\\312\\277\\366\\265\\257\\355\\355\\036\\274\\375\\366_vF\\203\\371|}v\\276||8\\011\\002\\321\\353\\215\\366\\256^?=_\\257\\313\\006\\231\\264$\\037?}\\266\\263w\\275\\312\\312\\274R\\016\\305\\323\\343I\\177kl\\214qh\\005\\021G\\213h=H\\345\\231\\232\\026\\230u>\\004\\331o\\001-Ywy\\232/\\367\\301\\364\\374\\274\\357g]\\330\\200x\\226\\034n\\250\\360d\\214\\361dup\\004\\300\\214qu]\\247A\\202\\210\\213yV\\024M\\030$\\204aM\\254 [\\032\\353\\215\\247\\034n\\256\\015@\\006\\216\\0010\\000\\006B\\242\\024\\216\\2431\\206\\013\\346\\264B\\004\\301\\031\\000(k\\230\\220\\235n\\277n\\354\\327^\\373\\346\\355\\027\\357\\274\\363\\336\\273\\347g\\323A\\257\\377\\354\\361\\023\\357\\253\\017\\210\\216\\010\\021\\225\\326\\2141\\2455\\021\\011\\242N\\267\\033\\204\\341\\213w\\356p\\316\\257_\\277\\3364\\315\\366\\3666\\376\\356\\017^].\\327\\202\\007q\\034s.\\215u\\313\\345r4\\032\\013!\\326EN\\306\\016\\307[\\210h\\234\\016e \\245\\340\\300\\372\\375\\276\\265\\366\\311\\223\\303\\331l\\026\\304\\221R\\352\\350\\370)\\355\\340\\260\\000\\000 \\000IDATt8\\034.\\026\\253\\301h\\264^g\\373\\373\\373GGG\\306\\322\\356\\316x4\\350\\316\\347s\\255\\365\\265kW\\362<\\347\\002\\255\\265\\335v[)\\315\\010\\216\\217\\217;\\235\\316d2m\\267\\333i\\332v\\316\\010\\301d B\\021\\256\\362U\\225Wq\\232\\004B\\022B\\277\\333;\\237M\\255v\\275A?\\020r\\235g\\316\\330\\244\\225\\236/\\226O\\217\\236i\\335\\220\\261/\\275\\364\\322\\347\\237}\\026\\206\\222\\003n\\215\\206\\316\\271N+m\\267\\333\\257~\\375\\353\\333\\333\\333\\247\\247\\307\\275n\\373\\033\\257\\274bt\\203\\210\\316\\2718\\214<\\211Okmu\\343\\235(\\030c\\241\\3300\\207d\\024\\326\\2522\\306\\251\\206\\220%\\255\\366\\250q\\374\\303/\\276|\\357\\343\\217\\213\\262\\374\\340\\303\\367\\376\\213\\177\\374G\\273\\255\\010\\027\\347q]\\376\\362/\\376\\342\\332`t\\320\\0337\\216&V]\\377\\315\\327\\356\\257g\\361\\356\\366\\356\\315[I\\332\\316\\027\\353\\233\\007W\\357}\\366\\271\\217\\0243\\350\\242V\\372\\213w\\337]d\\365\\027\\367\\036^\\331\\333\\335\\332\\331^\\257\\327\\357\\177\\360\\2538J5\\301b\\231\\367F;\\200\\301t\\2265\012jE\\332@\\1770\\254\\353\\212\\270\\015%\\230j\\305\\252,\\261\\215,\\362\\004\\000\\234A\\201\\2051\\025\\2310\\212\042!Q[g\\264\\002\\347\\300\\032\\272\\3507.\\326\\340\\306\\221G\\230,l\\326\\017\\2143!9c\\254\\335N\\007\\303^\\267\\333N\\222XJ\\351sW\\300:g(\\222a\\221\\225\\207O\\216u\\245$\\017\\326\\265\\236)0\\0308g\\234\\325\\326j\\317T#\\004@\\016\\214\\023p@\\206I'nu\\231\\220\\272\\251\\235U\\246\\256HY\\306$\\003\\346\\210\\247\\335\\336ho\\357\\352\\013\\267@\\360\\217?\\377\\224\\241`\\216\\226\\363\\305\\301\\326v]\\3272\012\\323Vk8\\034\\356\\356\\356\\246i\\272\\275\\275\\235\\246\\251\\307\\240\\222$\\271\\274Z\\3030\\234\\315f\\000 :\\335\\376t\\2660\\266QFw\\273}CN\\204Q\\322\\352 \\242Z\\256$\\027U]\\207aX\\326\\365z\\275f\\214\\035=;i\\267\\333\\2141\\245\\014pf\\265\\0212\\270r\\343\\246R*\\253\\317FR\\216w\\367D\\222\\004\\255V?i\\237\\317\\316\\247\\363Y\\034\\206UUU\\367\\356\\357\\354\\354\\314g\\013k\\355`0\\210x\\220g\\331\\371|a\\010\\230\\010,\\241\\2666\\317\\213\\275\\375\\035\\255\\233\\363\\331<J\\243\\233/\\034\\204IL\\306\\256\\213\\274?\\034\\311$Q\\225\\252\\225\\232\\316\\027\\253,\\013\\204 )\\307\\007\\007\\262\\335Y\\255VMY\\025\\332f\\265\\316\\252:M\\323\\253\\235^U\\226\\332\\001\\212\\340\\327\\237}\\371\\363w\\336o\\267\\322\\235\\361\\010\\254m\\352\\322O\\203{;\\273>\\202\\261\\256\\353Prk\\2553v\\275^\\013dM\\323\\004A`\\201\\034\\307\\262PQ\\330\\356v\\333_>x\\362\\336G\\237\\237,\\326a\\247sp\\363\\352\\321\\331\\344\\316+\\257m\\205l@M\\337\\232\\323\\317??{\\360\\310Vz\\264\\267\\367_\\375\\327\\377\\315O\\357}\\362[\\337\\376&v\\323\\277y\\357W\\277\\372\\340#P\\366\\345[/\\335>\\270FD\\343\\361\\370/~\\362\\027A\\022;\\007\\253eY\\024\\366\\323\\317\\0377\\037\\177\\276\\\\.\\221\\261V\\027\\206\\243\\361\\365\\233\\2737o\\277tx4i\\234\\324\\213\\242.\\326I\\253\\267\\312\\327\\202\\001\\222\\005\\001@\\226\\300;\\220[G>\\235\\007\\015\\0019$Br\\350-\\371\\011\\351rA\\370<\\016}\\201\\306\\302\\006\\241\\306Mw\\341\\327\\354\\376\\224h\\255\\001\\200!q\\316\\031\\227\\034)\\317\\313\\351\\371\\254*k2\\244\\352*S\\246\\204\\320\\010\\340\\310\\210\\300\\032G\\236cJ\\334\\333\\246\\033$\\220B\\010\\201\\234\\031 \\313\\321\\030\\015\\240\\001\\301Y\\345P\\366\\372\\203\\361\\225\\203V\\177ptv\\272\\314\\013@\\336\\351t\\372\\355\\316w\\337\\374\\316+/\\336\\356v\\273<\\214,n\\330\\344\\213\\305\\202\\020O\\317'~\\351\\335j\\265\\210h>\\2373\\202\\272\\256\\375\\261\\024\\307\\317NV\\253\\254\\335n7\\215nu\\210\\210\\3622{r\\3708\\212\\242U\\276\\332\\335\\335W\\326\\225\\353l\\271\\\\2\\306\\206\\303\\341\\235\\227_9<<\\234\\316\\346\\343\\361x8\\032\\317f\\263\\263\\351,\\216c\\325\\350\\376h\\250\\254\\353\\265[\\331\\272 `B\\210\\244\\335r\\332 \\003\\021\\004\\347\\323\\371\\326x\\207\\213HJz\\372\\354\\364\\345;/\\335\\276}g\\265\\314\\346\\363\\371\\225+W\\346\\363\\371\\361\\361)c\\320\\224U\\020\\004i\\232\\216\\266\\307\\001\\027O\\237>\\225R\\366\\373\\375\\243\\323\\223V\\253\\025D\\221!\\323\\356v\\323n'\\317\\363\\223\\311YT\\024\\204X\\226\\305\\240\\327K\\222\\344\\340\\352\\225\\223\\243\\343\\272\\321\\277\\372\\370S\\311\\205`\\260[\\251\\345|\\001\\000o\\276\\371\\346*\\257\\376\\362\\257\\377\\226\\241M\\222\\244,K\\311x]\\327I\\2220\\306\\302@J)\\243 \\\\\\255V\\355v;\\216\\343A\\267\\247\\254\\331\\331\\337\\313\\312z\\276\\254\\216\\317W\\263Y1\\235\\235UU\\203\\234\\276\\365\\352o\\277\\365\\255\\227%\\2304\\016\\205q\\340\\240\\273=>>=\\213\\367\\367o\\277\\361\\306IY\\334\\374\\332\\327\\037\\316\\247\\377\\347\\377\\365\\347\\357~\\364\\341:/\\177\\377\\207?\\372\\365\\347_\\374\\352\\275\\017B.Z\\255$+\\326a\\022\\017\\307\\273\\217\\236\\034\\366\\373\\303\\351tZV*\\216\\273q\\253\\015\\310_\\371\\306\\033\\217\\236<\\375wo\\377\\224\\0071\\240,\\353\\312\\241[\\256\\246i\\232\\032\\002\\011\\004\\016\\231\\263\\314Z\\346\\245e\\233\\305\\377W\\3323\\000p@\\226\\300\\341F\\332\\355\\231\\033\\344u\012t\\021\\235r\\201\\215x4\\032\\010I\\000\\0139\\027\\302\\222SJ9k%\\343L \042*e\\246\\347\\313\\305\\242@\\021WM\\225\\347%\\205\\251\\010cmMm\\024h\\205\\344\\020Px\\362\\036\042y/E&8\\223\\210\\034\\321+E\\030\\010\\001\\014A\\001J9\\334\\036\\037\\\\\\271\042\\343\\344\\326`\\264\\265\\273\\275wp\\025\\035q@\\346\\354\\364\\344l\\275::_\\316=\\363\\2261\\226eY\\034\\307u]\\373\\363\\235$\\311\\243G\\217z\\275\\236\\263\\266\\323\\351<~\\364h\\271\\\\\\342?x\\355\\345\\307O\\037\\205q\\324\\351\\266\\243$\\211\\222p\\231\\255\\225\\321@,\\313rk)\\216\\322\\242\\250\\214\\261{\\273W\\333\\3554\\212\\203\\252*\\213\\242\\250\\353Z)MDa\\030\\306q\\274ZfyY\\014\\207C!DQ\\024\\335A\\1775_x*\\334j\\265\\332\\031o\\257\\326\\213$I\\226\\313e\\022\\305\\275^\\257\\327\\353\\216\\307cU\\327J\\251\\371|\\276\\275\\275}r|\\352\\254!]\\357\\357\\357\\022\\321`4\\024\\214[r\\336\\220<J\\223\\325j\\225\\244\\355,_5\\265\\216\\322$\\3132)%Y\\275Z\\255V\\253\\225\\003\\026E\\321:+\\210\\260\\256k\042\\360\\006\\003A\\020\\030\\355^\\274\\363\\302j\\265\\352u:\\247\\317\\016\\257]\\331o\\232\\246\\335nO&\\023)\\345x4\\034\\217\\307\\363\\371\\374\\331\\263gQ\\030\\256\\327\\353\\203\\203\\003\\000XLg\\300qoo/I\\222aoP\\226u\\024EM\\255}\\227y\\345\\352~;M\\216\\237>\\355&\\241\\312\\263\\027\\256^YO\\247\\377\\357\\217\\377\\277\\301h\\373\\367\\376\\360\\217\\276x\\364h\\373\\332\\325\\237\\374\\364\\257\\027U\\363\\3627\\276\\361\\370\\351\\2238J?\\374\\340\\203\\273/\\336\\376\\362\\213/\\352\\272\\212\\343\\360\\366\\255\\033\\300D\\324\\351\\336\\270\\361\\322\\317\\177\\376\\313\\203\\2537\\376\\372\\247\\277`<\\351\\365\\307\\313\\274*\\312j\\231\\345\\373\\373\\373\\332\\252\\311t\\002\\340\\252\\252\\340A\\030\\006\\211\\000\\210\\311\\004\\324\\210\\246\\300\\272\\020\\246\\366\\3623\\203T4\\215\\014\\003\\301\\030\\031+\\0053\\306(4\\033\\210\\303}\\245\\363s@\\234sc\\255\\301\\215\\240\\305\\001\\021C\\342\\320\\352\\245\\203a/\\011\\242N\\022\\307B\\330Z\\005\\214s\\344\\344\\370\\371t1\\235\\255j\\015\\032d\\245\\255r\\344\\030\\267\\314)\\323\\270F\\2013\\340}\\333|_\\216\\234,\\001p\\236v\\222\\316\\200\\313X\\031\\262\\3164:\\007\\333\\000\\260\\244\\325z\\351\\245\\227\\177\\373{?\\270y\\363\\205\\252j\\252\\306\\030k\\363\\274\\\\\\257\\327MU\\227YYW\\025\\200c\\002\\327\\353\\245\\317@\\362\\024e\\237_\\345S\\026.7\\312\\227w\\216\\030\\217w\\222V\\252L\\343\\220\\2141\\225j\\3428\\326\\271\\031\\215GQ\\0227\\215\\262\\006#\\207J\\031\042\\\\.\\327[r\\250\\265\\251\\353\\246\\252j\\217p\\031c\\212\\242\\020B\\214\\006\\303v\\247\\263\\271\\247\\010\\274\\212\\326\\357/\\252\\252\\212\\302\\204\\034\\206A\\\\\\024\\025\\000s\\316\\255\\327Y(\\2441\\246\\325j\\251FK)\\225\\263w_~\\371\\372\\265+\\247gg\\253\\325\\312\\207\012\\254\\262u\\030\\206\\343\\335\\035\\0000V)\\245\\034Y\\347L\\236\\257'\\223I+\\016\\266G[i8^\\254V\\326\\031\\206d\\235\\253\\353\\272\\335\\356\\254\\3269c\\314\\221n\\267\\333\\307'gu]O\\247\\323v\\232>|z4\\036\\217Ke\\243V\\267\\252\\252\\321\\316~V\\024I\\247\\377\\326w_8:<$v&\\243\\264\\327\\353i\\207\\000n\\231\\025\\353,_,WR\\312\\027n\\335\\354v[\\316Z2:\\233\\237.'\\352\\345;/\\255\\226\\213@t>{\\362\\270\\327\\351\\006\\343\\321\\375\\351\\374\\331:{\\347\\323\\317\\327\\357\\274\\313\\303h\\274\\273\\373/\\377\\267\\177\\311e\\370\\237\\376\\341\\037\\274\\376\\3557\\233\\252\\344Q<\\032\\364\\312<\\237\\255rK\\224hS6\\237\\000\\343\\317\\216\\316\\266\\266\\367\\263L\\027\\265=\\233,\\230\\010\\265\\202F\\371q\\010\\211\\034\\201v\\206,\\01780@\\022\\016\\230\\363\\376Z\\033\\354\\371y\\216\\215\\303\\013\\005\\324\\206\\307\\273\\021\\356n\\336x\\002wy\\276\\021\\210\\3101`\\2141\\311\\230\\024(\\320\\201\\265\\326\\022\\023\\034\\030\\003\\006\\206-f\\313\\242h\\032\\355JE\\245s\\3322+\\204\\020\\334\\352\\206\\234\\0012\\036\\004w\\010\\233\\352O \\333m\\255\\254\\265\\300\\231$\\207M\\325p)\\002\\021\\363$y\\355\\265o\\375\\340\\007?\\330\\336\\336^\\255\\262\\303\\303#\\243\\355z\\235k\\255W\\253\\254(\012k\\250i\\032\\335h@B\\264uS\\372%\\256\\017\\330&\042\\037hv\\011\\263>\\257\\371\\020O\\237=A\\244\\331b\\316$o\\265Z\\355A\\257\\333\\3556\\312,\\026\\253,\\313\\215vZ\\3338L\\322$\\352\\367Zy\\236\\177\\374\\353\\017[\\255V\\024ERJ\\277\\204\\354\\367\\373\\303\\341p2\\231t\\273]\\301\\003-4Y\\327\\353t\\223(^\\255V\\004\\320n\\267\\233\\246\\021\\202\\257\\227\\253V\\253\\325\\250\\212\\320\\025Ea\\255\\365\\016\\216)\\303\\242\\256\\252\\252r\\326<|\\374\\250\\327\\353\\000\\000c,N\\023\\031\\006\\016\\310/\\207V\\253\\025\\347\\274\\325i{\\272\\367\\326p\\330\\353\\264\\317O\\216\\275\\363\\347:\\317\\273\\235\\216qs\\306\\204#d\\214w\\332\\351\\376\\376~\\024E\\243\\321\\350\\313/\\277\\334\\032\\015\\232\\252N\\343(\\317\\327\\316\\231^\\257\\323n\\267\\265\\326\\255N\\3338\\213\\344m\\335ZcD\\243\\324t:\\335\\331\\331y\\374\\370!c\\254\\327\\353x\\362\\300\\341\\263\\243\\272\\251t\\243\\004\\003\\262\\356\\354\\344(\\257\\352\\361h\\210\\210\\232\\341\\331b^\\030\\327\\352\\365~\\361\\356{<\\220WG\\327jm\\202 \\010$\\327d\\036>\\274\\277\\275\\275\\375\\356'\\277\\236\\317\\347o\\276\\371\\246\\252\\033D\\214\\242H\\306\\011\\262`0\\334\\373\\350\\343/\\264a\\263\\305\\274Q\\3204\\3325\\372\042}\\3132`\\004\\034\\034\\032c\\001\\025c\\3022\\347\\3101G\\270\\3214\\\\b\\027n\\223:x\\361E\\372\\212M\\303\\236\\373N\\334\\020\\376\\021/z\\020dR\\310@\\304R\\004\\310\\231#\\360:v\\021\\220\\303Z\\353y\\226\\325\\215m\\224\\321\\006\\011\\005\\223\\2023A\\033\\217~{A\\340\\361\\260\\006\\002\\020J\\251\\263\\002d\\034\\265[\\326R\\030\\007\\275^\\264\\\\\\257^\\274s\\373\\037\\375\\223?\\032\\217w\\036?~|\\370\\370\\3209899)\\362\\022\\221\\327u\\275Z\\254\\313\\262dLx.\\215\\277\\227\\034m\\204mu]_\\026\\351K\\021\\367\\363\\320$\042\\362\\027\\256\\357\012\\301\\255\\263\\202\\3638I\\202 X\\347\\331\\341\\3413\\004\\254k-\\205\\340L\\010\\301\\213\\242(\\362\\354\\341\\303\\207Q\\034\\373\\342\\037\\004A\\030n2\\300/\\377\\274X,}\\303\\356];\\252\\252\\342B\\214F#o\\2449\\233N\\203 @\\006B\\210\\272\\252\\275\\237\\235\\337\\367\\004APTe\\222\\304\\263\\363I\\247\\335\\366q\\256a\\024\\371\\307\\316\\030SVU\\257\\327\\223R\\256W\\353\\345b\\201\\014\\242 X\\257\\227\\203^\\347\\205[\\267f\\323\\371K/\\275\\270^g\\007\\007\\373E\\226\\337\\274u\\253,J\\306Y\\034\\306\\216\\0348:;=\\271u\\363\\326h\\320\\317\\363\\365\\316\\316N\\020\\004\\223\\311\\344\\255\\267\\336\\372\\342\\213/\\026\\213\\205\\224\\362|2\\261\\326>|\\370PJY\\026\\305\\336\\336^\\3234\\333{;\\265jn\\274ps0\\034r)\\200a\\243\\265s\\216IQ5*/\\353\\2537n,\\262\\234\\011\\371\\371\\375\\007\\333{\\007\\303\\361\\366g\\237\\337k\\264Y,\\026\\347\\363\\331`8\012\\302`w\\177\\317\\032c\\254Y\\2553\\306\\331\\356\\356\\376\\344lv6\\231\\022\\210/\\356?\\374\\354\\363{E\\245\\033e\\317g\\213\\371|])\\275\\316\\013\\021\\004uQ\042\\303\\264\\225 \\2026\\312\\271\\215g\\032\\021\0428\\011N8\\313\\214\\002\\243\\031Xo>n\\211\\2641\\036\\247u\\3161oZ\\340\\011w\\227\\002\\362\\213\\246\\331cx\\200\\350\\000\\254#B\\220A\\020\\2062M\\203HJp\\024\\006A\\022\\245\\210\\274\\252\\364r\\235/We\\325\\230J;\\213,L\\3220\\216\\035\\271\\262.\\235\\325`\\355%(\\270\\271,\\374\\302'J\\000\\205\\210\\242(\\356\\254\\363\\274\\327\\033\\376'\\377\\360\\367\\277\\377\\203\\337.\\212z>[\\324uszrzr|\\3324Jk\\275\\\\\\256\\362<_\\257\\326y\\2367\\215\\252\\353\\272\\256k\\255U\\323\\324\\306h\\337Wx\\025\\231\\037^\\341\\357}\\370\\363-NN\\2168\\347I+\\365ZW\\000\\314\\226k\\301\\244Q\\326\\031b\\222\\247\\3554\\014\\303$\\016\\333>\\267\\257VEQ\\372\\202\\357-b\\275\\237A\\277\\337WJ)]\\033c\\204\\020\\306*!D\\247\\333\\002\\3048\\016\\303P\012\\301\\224\\032)\\245\\030\\347\\0040\\334\\032\\005A`\\255\\255\\232\\3329\\307\\004\\007\\206\\332\\332\\301h\\\\5J6JJ\\251\\033\\245\\224\\351v\\273J\\251\\331|\\272Z\\314\\031c\\335v\\253\\011d^\\346\\002h\\324\\037\\010\\276\\261\\354899\\261Z\\177\\361\\331\\347\\253Uf-\\221\\325q\\0240\\240n\\267C\\206\\332i\\334T\\345d\\265\\030\\014\\006\\323\\305t\\320\\355}\\377\\373\\337\\373\\344\\223\\217\\215QJ\\271\\317?\\377\\364G?\\372Q\\3234W\\257\\035\\234\\234\\234\\354\\354\\216\\333\\2356/\\271\\326z8\\032Y\\302gO\\016\\227\\313e\\232\\246\\355v[tEU\\027Ggg\\2255?\\375\\345;\\203\\301\\340\\356\\335\\273\\2316\\377\\341\\235w\\036\\336{\\210N\\334\\274\\331\\031\\357\\355;\\347\\312\\2468=?\\271r\\355Z\\332J\\010\\331\\344|\\372\\370\\351!C!\\243\\330\\021;>[:d[\\343\\035\\031\\265\\316\\316\\227\\245\\262\\306\\323\\021\\235+\\263\\025\\020\\005Q\\3149\\022XO\\351\\025L\042pc\\235!\\247\\035Y\\264\\202,\\202\\003G\\304\\200\\300]z4\\273\\347\\312\\026\\\\\\224k\\272\\000\\234\\375\\237\\031c\\216]\\000\\321\\027\\007B0\\026\\002\\343\\316ZK\\034\\005g\\262j\\324\\252\\250\\247\\213<\\253\\215qd\\221\\203\\220\\310\\031\\021i\\255\\\\U\\002\\367}\\215/\\226\\0366A \\026$-eH\\204\\021\\0203\\306\\276\\366\\352\\267^{\\355[\\375\\341\\340\\364\\344\\254,\\313\\351tZ\\226\\245\\224R)\\343\\305ue^\\021\\321\\305q2\\236\\371\\350\\027a\\306Xwa\\261\\340\\031r\\356\\357B\\351\\227\\320\\015\\021\\361W^\\272\\006\\014\\204\\220Jid\\\\\\360 \\313\\2120\\210\\270\\220^\\232\\232$\\211R\\265W\\313\\326M\\345\\014X\\347\\274\\314\\333\\267/\\255Vk{{{\\271\\\\\\372!,\\276\\370\\360\\004 \\317^\\342\\234\\367z\\275\\235\\235\\035\\000\\360\\030\\302h4\\362\\323\\325\\361\\361\\261\\007\\024\\243(r\\326\\356n\\2179C\\272\\360\\372\\250\\252*M\\223$I\\010\\250\\327\\353u:\\035\\347\\\\\\253\\225\\334y\\361\\305\\335\\335]\\301\\370\\311\\321QS7\\367\\277\\274\\3374MY\\224\\303\\341@H\\331\\351t\\332\\355N\\257\\323e\\014\\007\\375~\\226\\255[i\\2745\\332\\212\\3430N\\3428M\\366\\367\\366\\352\\272>;;{\\374\\370\\361\\265k\\327\\366\\367\\367\\337~\\373\\355\\373\\367\\357\\327u\\015\\000\\237|\\362\\011\042\\256V\\253 \\014\\2255Z\\353\\363\\351\\\\\\006R\\006\\221%:>9}\\377\\203\\217\\346\\313u\\332\\356\\336{\\360\\210\\311\\340t2\\255\\265\\311\\253:\\351\\364:\\235n\\234\\246O\\016\\017'\\323s\\306\\2316\\346\\364\\364\\264\\333\\353\\037\\035>\\253\\032u\\353\\326\\235\\255\\355\\275\\345\\252\\\\e\\245v\\330\\351\\016\\373\\375\\255Z\\331\\351l9\\233/\\234\\203,/d\\024Xc0\\220\\235N;\\214\\002\\347\\234\\365\\016\\224\\204\\004h\\215!2\\322\\031AN8\\303\\311\\261\\315\\246\\220,\\2206\\226q\\357\\365x!\\303~\\236(z\\371\\336\\243\\267 \\207\\013v\\007 cA\\030F\\201lEB\\000\\202\\2050\\212\\021\\345b\\231\\317\\026\\353EVV\\3329&X\\020p\\031\\030rUS)\\325\\370\\216\\206! \042\\201\\227\\2721@\\001\\214\\023\\023BF\\206`\\357\\312\\265\\037\\376\\316\\357\\276\\370\\322\\313\\253Uv~>\\315\\363\\354\\376\\375\\007D\\020\\004\\341\\343\\307O\\246\\323)\042.\\227K\\243\\355\\345xw\\311V\\367\\317\\363\\245)\\327\\205n\\025\\237\\367\\272\\270\\340\\207n\\210\\237\\002\\0301\\311\\026\\313EU\\352\\216#D\\236\\246m\\316%c\\254\\323\\351\\004\\201\\330\\332\\032Ng\\023\042\\267\\\\\\316W\\371\\272\\327\\037\\342\\272\\360\\366_i\\232\\246i\012@''\\307\\323\\311\\371%\\247'\\010\\002\\311\\371\\344\\354,\\214#\\021HO\\234N[I\\222\\306\\203a\\2371\\3264\\2152J[\\315\\231\\340B\\304q\\034\\206a\\253\\325\042k\\223V\\332N[M\\323dY\\306\\005\\233\\257\\226Y\\266j\\267\\333W\\256\\\\999!g\\265\\326\\2713\\213\\331|\\261X(\\245\\366\\367v\\210h0\\030\\314\\026\\363 \\210\\016\\017\\017e\\030-\\227\\313\\341p\\313K\\2009\\003\\243\\2334\012\\3532\\257T\\223\\027\\305\\272\\310\\237<yr\\373\\366\\355\\244\\335\\272\\365\\342\\355\\351t\\372\\354\\3313\\255u\\257\\327k\\2249\\233<\\271v\\355\\332b\\271\\016\\202\\240\\327\\033T\\252!\\242(LZ\\355d\\271\\312\\224RB\\206;{\\373\\316\\2714Mo\\335\\211\\212\\242\\250V\\331d2a\\\\\\002\\021#\\210\\303hwgG8\\363\\350\\311\\323\\227^\\274}\\365\\352\\325\\303\\243\\343\\371|N<x\\360\\340Q\\245(iu\\323\\366\\3008\\034\\355\\034\\024eS\\327*\\010\\323\\310\\202\\3631d\\210`\\232\\244\\337\\211\\222\\3109\\253\\265\\002\\007\\014\\0301\\356\\214F\\306\\310\\222\\261\\306p\\007\\2146)i\\336\\320\\010\\377NC\\011>k\\360\\371\\026\\323\\327\\321\\013!\\226o\\267\\201y!\\020c\\214q@\\346\\220!9@2\\264V\\305\\344|\\276\\\\\\227\\3122\\224\\302:0\\026\\0319\\343\\264R\\3129'Ba\\224\\205\\215Q\\222?a\\202P \\027I\\332m\\264\\371\\372\\335\\257\\177\\347\\267\\276/\\203\\370\\323O?\\235M\\027Q\\232Ty\\3018\\314f\\013\\000h\\267\\273Q\\244\\327\\353\\265\\326\\226\\254F\\357O\\347\\234\\020\\3147\\030\\306 r0\\344<\\245\\331]\\362\\346\\031\\242\\340\\0272\\273\\315Q\\006\042t(\\214s\\373\\373\\373\\355v\\277\\2515\\347\\0019\\034\\216z\\210\\350OX\\236\\257\\3754\\326\\355\\266\\202PDQ4\\235Ne\\020w:\\235K\\3133\\337\\253yd\\327\\207\\374ydw\\275^G\\272\\036o\\357\\266:m\\245\\324j\\265Z\\257\\327D$\\245\\\\\\257\\327\\303\\341\\260\\325j\\001\\241s\\316Y\\013\\000\\036e|\\364\\350\\311\\0137o4MS\\024\\305\\316\\3568\\010\\002\\253t\\222$y\\2363\\306z\\275~\\226\\257\\265\\326R\\362\\311d\\262\\\\.\\235\\2617o\\336\\334\\335Mn\\335~\\361\\303\\017?\\004\\302\\242(\\206\\303\\341\\301\\301\\301\\361\\361\\361\\331\\331\\031cl1=\\027[[\\306\\230\\262\\251\\317&\\3230\\211\\253\\252\\372\\345/\\177\\331\\353\\365\\036?~,6\\276\\360\\306\\030\\223eY\\232\\246\\275^/\\212\\242\\371|\\376\\343\\037\\377\\230\\220w\\273\\335n\\267{pp\\220\\255\\313\\263\\263\\211\\2656\\313\\3138\\216\\317\\316\\347\\253e\\026\\247IQ\\024\\333\\333\\333\\213u\\346y\\275\\213,W\\346(\012d\\030\\310\\247\\307'q\\332Z\\255V\\327o\\275\\360\\360\\321aQ5\\026\\205\\260\\254\\323\\033t\\207\\243\\252\\324\\312\\300b\\225\\001\\200%\\247\\312\\022\\302\\220\\0052\\352\\264\\243(\\222\\222\\253Z\\033c\\020\\2201\\3469\\025\\2701\\3177\\016\\341\\322\\335\\371\\357\\177\\020\\202\\375{\\373\\024\\270\\304C\\020\\000\\310yn4\\301\\205&\\330\\253\\013\\031\\020\\002\\2012\\256(\\364l\\261*\\025\\205Q\\312e\\\\\\225\\245nJ&\\204\\177\\307\\001\\254\\337=z\\317W\\000\\006\\210\\3048\\343\\022\\231@.\\376\\340\\367\\377pw\\377\\332\\275\\007\\017NN'A\\020\\021\\303\\311\\344\\\\\\327\\265ww\\326Z\\023XO\\317\\350\\365zUQ^Bo\\276\\372\\032c\\034\\020\\330\\013#L\\266\\361\\263d\\027v\\265\\227\\235\\322e\\331FD\\276\\2677(\\253\\212\\010\\352\\246\\211\\242\\304X\\253\\265\\251\\312:\\211\\342\\217?\\372(\012C\\245*k\\214\\326\012\\031\\256\\263\\214\\034\\033\\016\\267\\262,\\353\\365z\\214a\\257\\327\\255\\313\012\\001\\214U\\275~Wk\\325j\\245i\\034q\\206a ;\\335\\366b\\271,\\213\\002\\310\\235\\034\\037#\\300h8d\\210\\373{\\273\\326\\270\\246n\\026\\253E\\030\\205\\223\\311\\371b\\271$\\200(\\212\\220(\\313\\363N\\273\\335\\351t\\030\\343Q\\024nm\\217\\255\\243\\262(\\203@\\226U\\271\\273\\273W\\325\\365\\316\\336\\356\\275\\373\\017\\002\\031\\010.\\017\\016\\256t:]\\000\\034\\016\\206/\\277\\3625.\\344\\225+W\\257_\\273\\231gE\\222\\304{{{\\267o\\335:88\\000r7\\256\\337\\210\\222T\\006AY\\226\\337\\374\\3467\\263,;??\\317r\\233\\264b\\031\\204\\353<W\\3126Js!\\213\\262\\272\\377\\340a\\247\\333\\333\\331\\332\\346\\214\\253F\\035\\237\\234\\224e\\015\\200u\\335(m\\262,W\\332p.\\235%.D]7\\004\\214\\034\\324\\215\\3422h\\224\\212\\342\\270\\327\\353q\\301\\205\\220\\213U\\266\\275\\275\\337j\\367\\332\\335\\321h{w\\274s\\305\\000\\227A\\222\\347UU\\326\\214\\241\\265\\266Q\\0158\\007\\222\\307I\\022E\\201\\020\\\\\\251\\306h\\355\\234%\\347=bhc\\266\\340\\014\\032\\035\\220\\225`\\231\\323H\\3069\\303\\004\\323V\\373S\\356\\2618\\177}{)\\341\\205\\016\\203.\\217\\265\\217\\026\\320\\206\\214\\005d\\024\\204a\\030E\\222\\013\\006\\224\\306\\011\\227\\361d\\26689\\235Y\\340\042H\\014\\361\\252\\326\\026|p\\233u\\316l\\374\\241\\300]*I\\343\\264mj\\025\\244m\\306\\303\\255\\355\\335\\337\\373\\375?\\320\\216\\236>;\\232\\315\\227\\3068eLYVeYZ\\347\\2641u\\323hc|D\\226\\263\\246\\256\\353F5\\\\p.\\020\\220\\310\\371\\010V\\226\\244\\211s\\226mR\\020\\034\\347\\334S\\177\\301[p\\010\\341W\\233\\236|\\342Ez<\\210P\\006\\241\\010BG X\\340\\233\\015 PM\\263\\267\\267\\327\\357\\367\\212\042\\003\\000@\\252\\233\\272\\335\\351\\266\\333}kioo/\\014\\303~\\277\\337j\\265&g\\223\\242(\\032U{\\324\\371\\372\\365\\353\\203^\\337\\213\\262\\007\\275\\376[\\337yK\\004B\\351\\206\\010\\256^\\275z\\355\\3325cLUU\\363\\371\042\\317\\363\\242,\\026\\213\\305\\311\\311)\042\\226ey~~^\\226\\245\\263\\266,r\\306X\\024EI\\2222\\344\\235n\\033Q\\324\\252i\\245-\\2078\\233\\316\\302$\\235\\234\\236n\\357\\354Xc\\253\\272^.WQ\\222fyQ5z>_<x\\364\\350W\\357\\277?\\237\\317\\037=z\\\\U\\245\\340\042\\010\\344x\\274\\275\\\\.\\213\\252z\\360\\360\\341\\366\\366\\366\\343\\307\\217\\037=z\\364\\346\\233o\\376\\316\\357\\374\\360\\352\\325\\253\\210\\270\\230\\257\\242(\\032\\217\\307>\\244'\\313r\\306\\370b\\271\\014\\203\\250\\337\\037H!W\\253\\374|r\\236\\345\\2715d\\214%G\\016\\320\\013Y\\234\\003rd\\211\\200\\241U\\212\\220\\001\\220R\\206\\000\\037=~r\\355\\346\\013\\306\\302\\366\\356\\225\\257\\275\\366\\033o\\274\\365=\\306\\203g\\307\\223\\363\\351\\322hk\\215\\266\\326Xk\\215\\265\\200\\310e \\245\\020b\\363\\026^X\\204\\320W\\237\\320\\200\\323\\222l\\200 \\321\\011p\\214\\034\042 C\\343\\234q\\344\\215\\305\\350\042\\323\\204\\340+\\277?_\\233\\375\\020\\007\\210\\304\\320\\222\\363\\006:RJdLr.\\205t\\016\\213\\252Y\\347u\\245\\255\\003A\\310-\\240\\336\\340$\\264\\221\\317\\243\\363\\202}!\\245\\220\\2415\\326(\\035v{*\\253\\276\\366\\255\\337\\370\\3157\\2763],\\227\\253,\\313\\313Z+ml\\3234MS\\333\\213r{Y\\\\\\2353\\306Z\\206\\350\\267\\026UUZk\\303(\\014\\243\\020\\0016\\016\\375\\306x_\\2560\\014\\363<\\337\\260\\352\\204H\\222d<\\036\\207a\\350\\243\\351G\\243Q\\253\\325\\302\\273\\257\\\\\\015\\202\\000\\221s&\\253\\262\\264\\206F\\203\\301\\315\\2337\\2556I\\022\\255\\263\\345\\321\\321a^\\346^\\226\\323\\356\\365\\233\\206\\254\\303\\333/\\334:99i\\265ZA\\020\\370\\205k\\236\\347\\213\\305\\342\\225\\227\\356\\274\\362\\312+g\\247\\247UU\\204a\\230\\227\\205WO\\265\\333\\355\\252j<\\036>\\231L\\245\\224B\\312,\\313\\332\\355\\356\\007\\037|0\\231L\\030c\\343\\3616\042\\036\\354\\355}\\355\\345\\227\\243(\\002\\200\\345rY\\327\\365\\371\\371y\\034\\207\\353u\\236$Q\\277\\333\\273~\\363\\306\\257?\\372\\370\\336\\203\\373\\253\\3052I\\022\\335T7n\\334899\\031nmGQt:9\\177\\366\\354Y\\224$H4\\030\\364\\346\\363y\\024\\005i\\222\\304qx\\367\\356]\\337-\\224\\215*\\212bww\\327#\\206;\\273\\373\\223\\311\\304\\030\\363\\263\\237\\375m\\020\\004\\203\\301`\\275^\\027EQ\\026\\265\\357\\314Zi'I\\022k\\355z\\235gYf\\311q&\\275Y\\014n\\334E\\374\\\\\\206\\016\\210\\254\\3010\\244\\246\\221I$\\245$\\242\\253W\\257ZC\\257\\275\\366z\\030\\245\\223\\371\\252,\\315\\361\\3514N\\332\\306b\\236ee\\261\\322\\036\\315q\\2061\\026\\004\\201\\014\\003!\\230/\\256\\336\\260\\375\\262\\023\\366,!0MhTL:\\005-\\254\\342d\\020\\211\\220\\325F+\\267\\361\\310\\006\\000\\260\\006\\200Y\\347\\000\\330\\005k\\364\\253\\306\\203\\210\\230\\024u\\3238\\200\\244\\235z\\0105I\\2224\\014Tc\\362\\262,\\032c\\034\\003\\024\\206\\270qN\\031\\007\\033\\323:\\007\\344\\000\\315\\006\\333\\260\\004\\\\\\310\\264\\005L8\\307\\336|\\353\\267n\\335\\276s\\377\\301\\023\\002,\\212\\252R\\015\\0203VUu\\355\\254\\345Ljk|e\\365\\203\\2357b\\026\\034\\375,\\350Q\\271\\215\\004\\316\\021\\223\\002\\221j\\325x\\323\\013!D]\\327q\\034'I\\342\\347\\2564M\\273\\335\\356h4b\\214\\245i\\252\\224\\022q\\273\\207\\210Z\\331n\\247\\233$-\\262\\256\\252\\252\\243\\243C\\262\\356\\370\\344\\031\\000\\304i\\364\\370\\361\\023\\3060I\\022m\\027I\\332O\\222$\\313\\262\\351t\\352\\223V^{\\365\\353\\306\\230n\\267\\333\\357w\\021\\361\\235w\\336I\\223\\250(\\2128\\216\\3234\\355\\015\\372\\347\\263\\331\\344\\364T[\\033\\311\\250\\335\\353\\266\\333mor\\267X,\\274I\\305x<\\276}\\373v\\267\\333\\213\\303\\360\\203\\367\\337\\367\\346w\\207\\207\\207O\\236<\\361\\027JU\\205\\263\\331\\354\\332\\215\\033A\\230\\234\\317\\226\\217\\237\\035\\337{\\360\\264\\333m7\\25358\\272\\377\\360\\2511\\206\\370b6\\235ge\\001\\000\\026\\253\\321`x|:\\361\\252\\202\\333\\267o\\367{\\235\\223\\223\\223\\243\\343\\343\\270\\325~\\371\\345\\227\\177\\374\\343\\037\\017\\006\\203\\321ht\\377\\336\\303\\331|)\\204PJ;\\347\\232\\2469zv\\262X,8\\347\\340\\231\\036Q<\\235/\\364\\331\\004\\0008\\347\\014\\005\\022j{\\031\\243q!\\254$r\\204\\004\\004\\204a\\234h&\\214u\\206\\354\\316\\366\\236\\014\\333\\257\\375\\3467~\\365\\376\\307\\200\\002H\\304i\\227\\361\\240\\252\\232\\252VuU\\2015\\340,8\\313\\000%\\027B\\010\\216l\\223T\\3466\\231S\\317\\215v\\226\\3002 \\237G@\\226\\274\\336\\202\\363\\257<\\252/\\305\\335\\004\\204d7\\006>\\317\\211)\\201\\241C\\237o\\2639\\342\\227\042\\177DV\\324\\266\\250\\232\\2422\\316\\0012N\\204^a\\017\\027\\316\\221\\2601q\\347\\000\\026\\0000IQ\\010K\\350V\\305\\177\\374\\307\\3778mw\\236\\036\\235v{\\375\\262Q\\026\\005VR\\031\\355\\224\\025B8D\\306\\020\\030\\007\\216\\250\\321'\\203q\\216\\214\\201'<^Z\\243\\370\\247\\213s\\036EQ\\273\\3332\\306,\\026\\213\\341pX\\327\\265\\377o\\034\\307\\376+\\234\\363\\235\\235\\235\\365z\\335\\353\\365\\020q<\\036\\213\\331,\\273v\\355\\232KL\\226\\027uY\\364:\\335\\252.\\216O\\236\\016{\\375\\252)\\367\\366\\366\\366\\367\\367g\\263\\331r\\275\\026A(e\\030\\004\\301j\\275\\\\\\257\\226\\036\\200\\013\\202`\\223\\267\\242\\232\\351\\331d\\274\\265\\265\\230O\\031\\016\\235sQ\\024\\026E\\3364\\265%\\027\\312 \\014q1\\233\\027e\\246\\032\\223\\246iU5i\\2320\\344;\\343\\355\\367\\337\\177\\377\\332\\225\\253\\317VO\\017\\016\\016\\266\\267\\267'\\223S)C\\255u\\332ns\\316\\333\\355\\316r\\271\\\\\\254\\326\\362\\364to\\357\\312\\317\\376\\366\\027_~\\371\\345\\326x\\274q2\\260v2\\237#\\362e^*e\\302(\\250keA\\237\\236\\235\\017\\206\\275\\275\\203\\203\\255\\361\\370\\370trzz\\372\\350\\321\\243,\\313\\230\\024\\263\\351bg{\\217\\241x\\370\\350\\311\\311\\331\\331\\352\\313/\\257]\\273vr|V\\226\\245%W\\327\012\\210$2\\201,\\220Q\\245\\015\\021\\372t\\002\\002\\264>\\316\\3149d\\354+\\021\\272?\\026\\340,\\241\\210\\223z\\261\\026\\255\\026\\251f\\264\\277\\373\\332\\353o\\274\\376\\033o\\376\\354\\027\\277\\230-+@\\336\\357\\017\\363\\242v\\016\\232F\\013\\316\\243((\\263\\334\\331\\006\\310xC\\177\\306\\030\\000\\222g\\321\\371N\\206\\034\\000\\220\\367\\213$\\353\\254\\365-\\003\\003G\\233\\357#\\3476\\324P_\\306/Wh\\033\\316\\350s\\3353\\\\\\262\\353.\\254\\2228\\377\\312p\\307\\021\\256K\\335(0\\216s.\\035\\202\\321N{\\213G\\037\\270\\211xa\\232\\342!m$c\\2506\\301p\\353\\367\\376\\370\\237\\324\\215M\\332\\375V\\177K5f\\034%\\016\\301*]\\024EU\\025J\\327>{\\02797\\316VEm\\214\\2222$\\332p\\372\\020Qr\\016\\304\\202 h\\265Z>Q\\204s\\336\\355\\265\\245\\224\\355v\\273\\323\\351TU5\\036\\217\\275\\376\\277\\333\\355z-\\222W\\031\\246i\\252\\265\\236\\317\\347\042nu\\225\\2052+ON\\216US5M%8\\246i\\374\\345\\275\\307;;=c\\314j\\265\\032\\357\\354\\365\\006\\243v\\273\\033\\305\\261\\014\\243\\371g\\237\\305a\\344o\\250(\\212\\036=z\\024\\307q]\\344A\\020\\224e\\256\\224\\272q\\343F\\236\\347\\223\\311\\331`00\\3060`\\225\\2529\\362\\246i\042\\214\\3743P\\226\\265U\\3322:<<l\\267\\333^}ptt\\324N\\343\\323\\323\\323\\255\\255\\355\\235\\235\\235V\\247\\363\\360\\341\\303\\263\\263\\311\\203GO\\245\\340EY\\223\\303g\\307'\\310Em\\310*\\333\\250\012\\011\\270\\210\\264\\326\\326\\232 \\210d\\030\\324\\265Ad\\332\\272\\242\\254\\227\\213\\247UU\\225yQU%\042\\312(\\014\\203\\270(\\212\\2337o\\336\\277\\177\\277\\254\\353\\305bQ\\327\\315r\\271\\234\\315f\\234sK\\3009\\027<\\260\\326*\\253d\\024\\272\\306y\\3479Bt\\236\\245\\200\\034\\354W\\246\\016p)yB$B\\3234I\\277_f\\371\\335W\\277\\371\\207\\177\\364\\307\\203\\321\\366l\\276\\374\\371/?p\\016D\\300\\015\\260\\365j\\235\\306\\255$I\\264\\326\\347\\223i(,\\200\\363\\261TH\\226\\374\\341\\201\\313j\\013\\316\\001\\240!\\262\\033x\\016\\254s\\006\\310>\\357\\032Ct\\341ty!\\261\\272\\370\\372\\246Zo\\020=\\330x\\253\\372\\343\\250\\225\\001\\004\\337\\027\\371\\323S\\251\\246Qd\\200\\243\\224\\336\\257\\3038\\3431(\\377J\\027'y\\363\\231P`\\224\\020\\212\\337\\375\\321\\357M\\246\\263Vgp\\367\\225W\\362\\262\\276r\\345Z\\221WA\\020 \\243\\246\\251tSi\\255\\312\\274\\310\\212\\334\\220S\\332\\254\\327\\353\\246i\\274\\016\\327{\\346WU\\025\\206\\241@\\341\\013\\263\\177\\266\\203 hT^)u\\307\\000\\000 \\000IDAT\\025\\307\\361`0\\250\\252\\252\\325jy\\260\\270,K\\377\\267\\372\\375~Y\\226q\\034\\237\\234\\234lmm\\005A \\332\\235\\376\\351\\331d\\265\\234\\007\\\\\\334\\270q\\203\\243#g\\220\\342\\027^\\020\\273\\273;y^\\234\\237\\237\\367\\207[\\3068\\245\\355\\371\\371,+\\362\\365z\\315\\273\\254,\\313^\\257\\023\\307!\\202\\343\\234\\007\\235\\216R\\252,Kk\\355\\247\\237~rpp\\000\\316-f\\2630\\014\\243(J\\242\\260\\325jyD\\017\\200q\\316\\277\\370\\342^\\247\\323\\351\\367\\373\\217\\037\\336\\337\\335\\277\\362\\321G\\037\\275\\370\\342\\213\\306\\230\\343gO\\217\\216\\216\\346\\363\\345\\356\\356\\356:/\\216\\216\\216\\213\\262f\\010a\\030;\\240O>\\375,\\210S\\031\\306\\313\\331\\242\\325\\355\\002\\013\\310\\232\\246n\\2428\\2168/\\362Ri\\025\\246\\255\\246\\314\\2038\\256\\032\\335mw\\226\\253\\014\\301\\345\\245B\\204P\\262\\365\\252\\371\\255\\337\\3726\042\\273w\\357q\\020\\3614M\\2430y\\372\\344X\\206\\001\\221O\\265\\011\\210\\361\\215\\333Z\\243A\012\\320\\332;x8!\\271\\020\\227\\2535o\\326\\200\\210\\354\\271e[ \\203\\262,\\277\\363\\275\\357\\375\\227\\377\\364\\277]d\\271u\\370\\317\\376\\371\\237\\202\\010t\\255\\253u\\231\\266\\364pk\\333*\\235eYS\\325\\243\\376\\240X\\2371\\260\\214\\034y\\340\\311y{\\276M\\250\\200\\363m3:\042G\\316\\\\\\216\\207Dt\\341\\247\\200\\033\\307\\021\\272\\370\\004h\\275\\221\\303sNv\\227\\365\\371\\022\\360b\\214Y\\000\\3111\\212\042s!0,\\213\\332b\\014<\\000\\002o\\025\\2739\\315\\264\\271\\0236\\326~\\276\\3523\\016\\210\\344\\340\\333\\337\\377\\356g\\367\\356\\277\\364\\362+W\\257\\334\\234L\\247\\375\\376\\326:+\\332\\355\\266\\020\042\\220\\274\\337\\357r$\\347\\254j\\252\\272i*\\243\\034aU\\226u]\\023\\221\\327Ms\\316\\347\\263E\\024EH`\\214qn\\203i$I\\222e+)e\\247\\323aB\\370\\2410\\212\\2420\\216\\333\\355\\266\\247v(\\245\\206\\303a\\32342\\014\\313\\262\\024\\367?\\273\\007\\340\\3428F0u]\\353\\246\\034\\016z\\243A\\377lr\\352\\341\\210<\\317\\343\\264[\\226e^T\\317\\236=s\\216\\366\\366\\266\\021\\261,s\\257\\355\\352\\367\\373_~\\371%\\007\\334\\337\\337G\\200 \\210\\202 \\274s\\347%\\255M]\\327\\235n_\\010QU\\025\\023\\241#\\314\\213\\352\\354\\354\\354\\374\\374\\274\\256\\025\\000\\314\\347s\\277\\000G\\304\\351t\\032E\\321\\361\\351\\244\\254\\325t~8\\235/\\252\\252r\\204J\\231(\\212\\362\042\\017\\302\\220\\311P\\325\\265\\021\\0010V\\026\\225\\263\\032\\234\\225APW\\225\\014\\002\\031G\\272.\\233\\246\\001\\306T\\323\\304I\\362\\372\\353\\257\\377\\344'?ArA\\300\\264v\\306\\271n\\277\\025D\\2211\\246\\335M\\262u)\\270&Ri\\032k\\353\\254\\265\\316\\202\\326\\332\\270\\232\\013!\\303\\270.\012\\000\\007\\202#\\223\\350\\343\\266\\214\\006\\353\\000\\220!\\273,[\\227\\322T\\002f\\034\\276\\372\\332\\353\\177\\360\\237\\375\\347G\\307\\247i\\267\\377\\366O~2\\237-\\231\\020\\306X.\\245R\\252\\304\\\\\\325u\\267\\3351JWU\\341m\\354<\\217\\3109\\303,#\\344D\\200\\310\\011\\254s\\366b\\331\\347\\3109 \\307\\000\\0318p\\0269\\370lc\\337\\331:\\004{\\341\\337'\\000,\\020\\333X\\022\\333\\347t\\340\\014\\301]z\\003\\371\\251@\\204\\201\\256\\033GL;^6\\215H%\\343\\322Z\\253\\255qZo\\220kF\\354b\\325\\350\\020\\274\\251\\241\\217\\337{\\3657\\336\\230\\234/\\342(\\235\\234\\315\\265aa\\030\\213 >:>\\335\\335\\335u\\316\\205\\201h\\265\\2228\\0169\\002\042\\205I,!\\341B\\330nWk\\355,\\031\\253\\2010\\010\\202kW\\215R*\\3132\\245\\224`\\322\\001\\351F9\\240\\375\\316\\276q\\226\\254\\353\\017\\007\\034Y\\247\\327e\\200\\310Y]Vi\\273e\\224F\\316\\310:`\\350\\211k\042\\346|\\177\\377JQf\\223\\311\\261i\\212 \\340\\331j\\035\\010\\256\\265^\\232uQU\\203\\321\\310\\243\\015\\014\\305\\366\\326\\270n\\312\\341\\240\\347\\034D\\341\\301\\260\\327\\277\\363\\322K\\367\\276|\\320J;\\247\\247\\247\\305\\375\\207\\313\\371\\334k\\007^\\274\\363u!\\343g\\017\\016\\313\\006\\006\\203\\301\\337\\376\\374\\275\\273w_JZ\\275\\255\\361\\360\\346\\355\\027\\031ceY\\376\\371\\237\\377y\\024&\\335\\376\\320\\030\\273\\277\\277\\277\\277\\277\\177vv\\236\\345UU5\\316\\301:+\\020\\321X\\013\\010J[ \\246\\032\\343\\30702\\026\\020\\300Y\\316\\270\\0032V!\\007m\\032\\320\\032\\031lB\\177\\211B\\311\\177\\362\\223\\237x\\300\\304\\030\\365\\342\\235\\353y\\236\\377\\377\\244\\275\\331\\217eir\\037\\026\\361-g\\275\\347\\256ys\\251\\314\\252\\352\\352\\352mz\\206\\213I\\233\\362pH\\212\\022$\\0336,A\\006\\014\\003\\362?\\340\\007\\303\\017~0\\340\\377\\310\\220a[\\260a\\200\\220\\036\\014K\\244Er8\\032M\\317h\\330\\323{um\\271\\347]\\317\\366-\\021~\\210{\\263\\252%J\\200\\245|\\350Fw\\336\\\\\\356\\3118q\\342\\213\\337\\366\\352\\345k@\\335;\\327v\\316\\246id\\350\\332.\\3152\\336E\\3400q0Z!P\\350;4\\300\\034\\300\\271\\244(\\373\\276\\263:)\\253A\\275\\3360\\357\\362\\323\\023\\233yb\012AYK\\214\\240l9:\\250\\306G\\177\\364\\217\\377\\311\\371\\345\\205\\353\\303r\\275\\212\\336+\\245\\200B\\344\\350]\\232\\031m\\255\\336n\\327\\240\\330\\373\\000\\300\\254\\020\\264\\002f\\206H\\354\\024\\030F \\016\\300\\214\\020\\366\\275\\231\\305M\\007\\0010\\262\\260\\341\\200#S\\024\\223\\035\\317\\354\\021\\234\\244R1hBq\\222\\321Vm\\034\\0152Q\\240P\\236\\252\\336\\023(h\\333\\300\\000EU\\3641\\262N\\030\\223\\316Q><\\334\\266\\256\\032'\\375zC1\\246e\\352\\\\\\007\\301\\013\\226A!\\244y\\011\\250\\373\\272\\0010\\203\\331\\264\\030O\\272\\200!\\352m\\323\\023l\\353\\326i\\255W\\253\\325\\321\\321\\311ru7\\235N\\211\\302{\\357\\275ww\\276\\030U\\203$I$8\\300ZN\\3234\\317\012\042\\360\\276\\027\\330D\\2365\\007\\007\\207.x\\327\\365>\\0061\\2377J\\373\\030\\200X\012\\327\\005\\257\\000Mb\\007\\003\\347cHm\\262X-#\\204\\331l\\342\\272\\276\\367N\\317&\\363\\323\\323\\007\\257_\\275\\334nW\\2115\\325\\240z\\370\\350t\\265Zn\\326\\233\\340\\303j\\265\\332n\\233\\355\\266\\216\\201\\267\\333\\355j\\265:=9\\276\\271\\276\\032\\224E\\221g/^\\274,\\262<I\\263\\027/^t]\\177}}\\275\\335\\264Lt8?\\254\\252\\2411\\006\\224.\\313\012\\320\\\\\\\\^\\216\\306\\223$K\\274\\017\\314\\260\\335n\\224R\\223\\351\\364\\323\\277\\3744I\\222,\\313\\230\\371\\305\\213W_~\\365U\\347<\\021\\201Bc\\255\\320\\230@r\\004\\214\\271\\337_\\336;f\\221d\\300\\335\\003f{k;\\371\\032y$\\015\\006\\203w\\337}\\367\\351\\323\\367\\332\\266{\\376\\374E\\222\\246\\207\\207G\\333\\272\\271\\276\\276\\221A-\\354\\017%\\374\\326\\344 \\337\\215\\230!\\022\\030\\203\\014\\024b\\231g\\223\\321D+\\3255\\235B\\244H\\306XF&\\006\\24551\\203\\322\\203\\321<+\\206m\\3476\\353:\\020y\\037\\272\\266%\\347\\344D\\225'I\\222Xf\\210\\024)\\306\\030<b \\332%\\352H\\307\\007\\204]\\220\\003\\323=\\027CV\012\\300\\254\\230t\\014\\206\\242A2LH\\201\\231HA\\000\\211\\315\\004T\\210\\250\\200A1#p\\037\\271\\310\\264\\0131IR`j<\\017\\207%(\\314\012\\303\\032j\\347\\225\\311TR\\266\\036\\210m`U\\014G\\353\\365&z\\007\012c]C\\364\\203Q\\345CO>\\252\\304\\206\\316G\\037\\322\\341\\224\\215ee\\347\\307\\017|DFE\\304]\\327\\213\\220$\\306\\270\\335n|p\\233\\315:\\306(3n$\\032\\215\\307!D\\000\\324\\332\\204\\020%\\267J\\272\\376.\\316\\001\\000\\2652\\306$i\\222\\347yQ\\226eY*\\255\\255\\265I\\232\\026E\\221f\\231\\2656I\\2234M\\213\\262\\000\\000m\\0143\\333\\304\\346y\\356\\203\\357\\272N\\177\\370\\321\\367>\\371\\371\\317\\267\\315v:\\233\\274\\367\\301{\\223\\351\\344\\323_\\375\\352\\342\\352\\262w\\336\\207\\260\\255\\233\\266\\355\\263\\2548<:f\\200,\\315\\230\\302`P\\035\\237\\236\\332$\\275\\276\\271[o\\266\\353\\365\\332{\\177||RU\\325t6y\\367\\351\\273\\177\\347\\357\\376\\335\\341h\\244\\000}\\014!\\304\\363\\213\\313\\305\\342.M\\323\\351t\\002\\000EQ\\020q\\323\\324y\\236\\277\\367\\376\\373\\200\\320\\365\\375\\365\\315\\315\\325\\325u\\337;\\336\\343\\234\\264\\317o\\025>\\231\\\\)\\226d\\230\\235\\327\\034\\002\\360w\012\\372\\315y\\005\\264\\326y\\236\\237\\236\\236\\302\\3361\\350\\331\\263g\\302=\042\\242\\273\\273\\273\\355fs\\377\\203\\336\\272U\\336|\\237\\375\\366\\013\\323\\242\\010>\\000\\303p0\\234N\\017\\022\\233.\\227KY(h\\253w8\\234\\002\\246\\240mz\\374\\340q\\004\\3254\\215\\367A\\274\\377:\\357\\271\\353\\305\\262%ISc-S\\014\\301\\023\\305Hq\\327iI\\254q\\305\\252W1\\334\\257\\341\\210\\231\\225\\304\\375\\011\\2579\\022r4L\\032HK\\223Fa&A \\216;\\323G\\205\\014\\212\\031\\200#\\2002X;f@\\233\\026!rP\\272vq\\335\\272\\301\\344\\000mV\\014'I6T&=<<=~pf\\322lP\\015\\233\\266e\\340\\341d\\302J\\267m\\303\\314J'6\\313T\\232\\222\\217\\321\\005]\\226\\247g\\017\\323|\\320z\\317{\\253XA\\362\\204G`\\023{|||zz\\372\\356\\273\\357\012\\010\\342\\275\\357\\272N\\224&\\242\\371x\\033\\262\\026\\373\\277\\030B\\360\\201\\004g\0121xOQ\\274\\237X\\241\\002\\006\\212D\\221\\230X!z\\347\\325\\016\\010@\\205*\\370\\300\\304\\346\\313/\\2774\\306\\370\\320\\367\\275\\277\\271\\276\\233LG\\217\\036\\275\\363\\331g\\237:\\347\\202\\247\\340!\\004 b\\004\\355\\372\\220$I^f\\243q%!)\\037~\\370a]\\327\\327\\327\\327R\\026UU\\001\\300z\\275\\376\\361\\217\\177\\\\\\327\\365\\373\\357\\277?\\030\\014?\\377\\342\\213\\237\\376\\364_\\304\\350\\233\\246\\031\\215\\253\\262,EN3\\030\\014.//\\265\\266/_\\276\\\\\\255\\326}\\3373c\\222X\\037I\\336\\344.\\321\\014\\021\\345yw\\177\\326~#\\304\\227\\377\\374+\\250\\261\\260\\367\\334\\220D\\271\\267\\317\\321}\\327\\275z\\365\\212\\366\\271\\250\\367J\\236x\\377\\375\\367_\\316\\314\\212\\025)\\264&\\365\\030\\264\\265Z[\\201dw\\274\\002%B\\022\\006\\231\\0270&YR\\226\\325\\266\\015\\336\\305{7\\325\\242(6!@\\010p\\017\\216H<\\315\\356\\366\\323\\000\\036A\\357\\010CD\\022\\235\\375\\257\\277!\\330\\305K\\275\\371=#31)&P:\\022\\335k]w\\267\\002\\260\\002e\\014\\327\\035\\245\\326\\204\\210\\024\\025$\\305\\272\\351\\017O\\317F\\223\\311\\357\\375\\341\\037\\234=z\\367\\360\\360(IK&\\2450I\\213r[\\327\\345 o\\353\\346\\253/>\\375\\247\\377\\344\\377\\371\\371\\317\\177j\\231#\\005f\\356\\2675\\000\\352jblZ\\215\\246*I7\\3656-\\253\\246s\\262\\244\\022\\357\\224,\\313\\252\\252\\372\\376\\367\\277\\177||,\\346oWWWeY\\312II\\232\\2130g\\004~\\017!\\364}\\277\\367F|s\\220\\025\\360\\345\\236\\313/\\267\\312}L\\214R\\020c\\224\\355\\236(\\262\\3445\\246\\355\\273\\371|>\\034W\\333z\\275\\\\\\257F\\223!\\001\\2576\\265\\\\\\322\\020\\301&F\\233\\304\\205\\310`\\252j\\024bw{\\267<88(\\322|\\273\\335\\326m3\\232L\\234s_?\\373f2\\231<~\\374\\330\\246\\311\\305\\345u\\337\\367\\017N\\273\\246iF\\243\\221\\370\\315I\\336\\346p8\\364\\336Yk\\373\\336\\003\\250?\\372\\243\\177$\\017[%\\305\\261\\223\\024\\355\\253\\025Q\\226\\334D\\024\\003\\354\\327\\264\\373V\\375o\\375\\020\\336\\326r\\271<88\\000\\200\\276\\357\\001\\300{\\257\\215\\211!\\000\\200M\\022y\\331\\375u|k\\373\\266\\207!\\230A) P\\250\\255\\261\\336\\207\\273\\273\\2051\\032\\024\\002\\0032\\306\\350\\003\\2232\\232\\230@cQf\\314\\034\\002\\361\\216\\360D\\021\\330\\3324+\\006]\\275\\2260\\034\\357=\\005\\037)\\252=\\031\\002P\\203B&\\006\\336eZ\\242\\0248\\2008M\\336/\\221\\221$\\331\\362\\255\\273n\\037zHD\\021\\344Y\\205\\367\\357\\210\\021\042\\261V\\220\\345e\\343\\270\\363\\240\\262\\354\\341{\\357\\377\\356_\\377\\375\\337\\374\\017\\177{8\\236\\204\\030{\\037\\352\\2153&\\271\\271z5\\250\\206\\253\\355\\346\\340`\\006D\\357\\274\\367\\341\\307?\\370\\365\\317\\277\\370\\364\\377\\376\\307\\377\\350\\307\\177\\376\\247\\200\\220\\317\\217\\332\\266\\217\\014\\007\\007\\007e5\\354}PI\\272\\335nA\\355\\204\\342J\\251\\311d\\362\\375\\357\\177\\377\\343\\217?\\016\\024E\\320\\364\\374\\371s\\301A\\206\\303\\341v\\273\\025\\241\\223\\024\\353\\256+G\\311\\314}\\223\\235~\\017\\364HW\\222\012\\226t+f\\361\\373\\304\\276\\017\\362\\035\\020\\261\\355\\032\\347\\\\\\222$J)\\375\\373\\177\\360\\207/_\\276\\364\\336\\255V\\353\\336\\365!\\204/\\277\\374R\\241\\362\\236\\231Ak5\\233\\315\\207\\303Q\\236\\225E18=;\\233\\214\\307\\233\\355\\3329\\227\\347\\371p8L\\323\\024Q={\\366\\014\\021\\347\\363y]\\327WWWi\\232\\311\\002[\\356\\252\\363\\363s\\347\\\\\\327\\271\\343\\343\\303\\311d\\322\\367]\\010\\3019\\367\\325W_\\255V+c4\\356\\002\\302T\\010\\3732\\305\\235K\\371\\233\\301c\\267j\\335u\\2717/\\373n/{\\233\\204%\\350\\350\\311\\311\\311r\\271\\274\\271\\271\\241\\030y\\237a\\216J\\231\\267R\\351w\\240\\356~\\015\\366V\\253@@\\305;\\3138\\014\\336\\267m+)>J\\251\\300\\022\\274\\306\\200\\032\\030\\320\\250\\331\\301\\261\\262U\\0202\\033\\203\\213^~\\226R\\312\\007bd\\255\\024\\000\\007\\371#\\261l\\216\\341M\\375\\335\\377P\\200]\\034\\2320\\226w\\030\012\\001D V@\\006\\330 \\003{\\342\\210\\200\\254\\301\\021G\\336\\015\\034(:+\\336\\215\\035i\\226\\255\\266\\015\\241UI1\\030\\317\\177\\367\\017\\377\\346o\\374\\326\\017\\301f\\213u\\275i\\035b\\262m\\332\\345r\\375/\\177\\361\\227\\327ww]\\037~\\366\\311'}\\357\\213\\301`\\271\\\\\\035\\037\\037\\377\\265\\037\\376p4\\235\\375\\362\\323\\317\\\\\\347\\200 \\033\\015\\207\\223i\\232\\025\\200:0\\017\\252\\341`P\\315f\\263\\017>\\370\\340G?\\372\\321\\357\\374\\316\\357\\014\\006\\203\\363\\363\\363\\266\\353\\266\\333-\\354\\363\\001\\345\\031.p\\240\\324\\250\\000\\335\\322\\260c\\214}\\337\\313\012O\\210x\\222j)\\037\\274\\227\\2538\\347\\274\\367\\342&'\\222\\226\\272\\256E\\000\\014\\000\\306\\230\\276\\357\\315\\237\\375\\305\\217\\2151!\\270\\242\\032t]\\363\\342\\371K\\225h\\362\\321\\244\\026A\\307\\030A\\231\\325\\246]\\255\\273<\\317\\315\\355\\335\\341\\301\\370\\364\\354\\341z\\275\\356z7\\237\\037\\206\\020\\231\\273\\371\\374\\340\\352\\352j4\\032\\022\\361\\305\\305\\305\\240\\032\\005\\212w\\313\\305l~\\340C\\377\\350\\361\\331g\\237}\\226fZ\\026\\325J\\251\\355v\\323\\365\\375\\257>\\373\042\\313\\362\\246n\\001@i4ZC\\214\\270\\263]gD\\240\\310\\000\\240\\367\\023X\\010ag*\\014;\\333\\364\\267\\026\\254\\377\\352\\207l!\\344\0426M#\\375C.\\223|\\341\\275\\212x\\327\\001\\337j\\322\\367x\\004\042!*\\357{k\\255\\017n\\327*\\034\\2411\\032\\201a\\347:\\014ZC``\\235\\330<\\204\\200h\\231\\331\\205\\300\\264S\\354\\001@\\236\\347\\275k\\211\\310{\\212\\3363G\\320F\\346\\026\\000\\004\\324\\250\\304\\364e\\357\\353%\042V\\330\\207\\035\\262\\340\\201\\244\\230\\200\042(\\216\\202]\\0233\\262f\\365\\366\\225\\330\\335\\366\\270\\263\\343\042\012\\014\\034\\003\\345e1?9-\\207\\007\\027\\267\\253\\361|\\246\\2632\\366.\\242\\276\\276]\\266\\333z\\333t\\333\\246\\253\\237\\277\\266i\\372\\372\\374\\232\\230\\307\\243\\252\\017\\376\\301\\321\\341_\\377\\233\\177\\353\\351\\007\\037\\375\\303\\177\\370\\277\\275xu\\376\\341\\367>>zp\\222g\\345l~8\\032\\216\\023\\223\\026E\\201\\210\\333\\355v\\273\\335^^^\\312\\205],\\026R\\246\\262\\220\\035\\217\\307\\302\\260\\007\\000\\301\\256\\263,\\023}\\212\\265\\326{o\\324.\\222\\212\\336\\352\\331\\002\\211K_s\\3169\\3271\\263\\332\\333\\037\\003\\200\\017.\\317\\363\\035\\331\\237\\241\\331\\326\\306\\030\\263^\\255\\2122_.\\026\\300\\234\\225eW\\3276\\313\\244\\265\\220wm\\333o75\\3058\\034M\\272\\256S\\020\\274\\357_\\274x\\301\\034\\023k\\225\\302$I\\252\\252*\\313\\262\\353\\272\\007\\017N\\357\\356\\356\\254\\265\\357\\277\\377\\376h4\\272\\273\\273k\\233v>\\237\\377\\362\\227\\237\\001\\304\\233\\233\\033f\\036\\014\\006\\257_\\277\\376\\374\\363\\257G\\343\\341j\\271N\\263\\004\\000\\372\\316\\271\\350\\363\042k\\333n\\237i\\002B\\034\\233L&\\363\\371\\\\6\\342\\353\\325\\3269\\367f\\352\\3757\\027\\264\\010x\\204\\267\\335J\\2542\\2769PKo~\\323\\321\\377*I\\017\\354D\\023\\024]\\000\\320\\344\\035 \\332\\254\\360\\261cT\\221\\324\\336\\353\\323 \\244\\214\\032\\320\\240N}d\\006\\356\\275\\227\\024\042\\000\\3601\\000@\\226%!:\012\\221c\\214\\301\\211\\017.3k\\260\\273\\250\\032\\301H\\344\\206\\346\\310D \\031H@Hq\\267\\350 \\231\\265X\\234\\353\\002\\223L\\326\\310H\\367\\027M~sd\\002P\\010!\\000\\307p8\\235\\335\\325\\221\\231\\313\\301\\370\\365\\371\\325\\371\\335\\366A\\357\\037\\276\\3638\\222\042\\202\\246\\351\\\\\\3579\\306\\257\\237=\\367!\\216\\246\\263\\347\\317_\\334.\\216~\\363\\327?\\256\\333f\\261\\\\\\177\\360\\301{\\243\\311\\354\\177\\370\\037\\377'\042ZmjP\\030\\011\\232\\246\\015!8\\357\\227\\257_\\313\\024\\021c\\254\\353\\272\\256k\\357\\375\\301\\341\\\\\\346\\275\\345r9\\235N\\273\\256\\033\\014\\006M\\323\\010\\205h0\\030\\024E!\\023\\2054\\227\\310A&\012\\351\\\\\\002\\254\\310\\343T\\272{\\327u]\\327H\\277\\327Z\\013Y\\2108v]'_\042f\\320:0*\\255C\\210\\240\\000\\024\\206Hh\\214p\\020C\\347\\307\\007\\363\\256w\\241\\357l\\236\\241R\\363\\303y\\333\\266&\\321\\233\\325\\272m\\033\\255\\224\\265\\366\\342\\365\\371ry\\227&\\326\\273>FZ\\255V\\000pss\\255\\254=9>^\\257W\\357\\274\\363\\370\\223O~1\\034\\016NNNnoo\\377\\345/?].W\\250\\260\\357= \\306H!\\356x\\002!D\\245vUj\\254I\\022\\213\\010\\336\\207\\233\\233\\233\\315f\\303\\314\\210\\020\\274c\\332%\\202R\\214\\270\\313\\010\\177\\363\\361v\\227\\022J\\352\\333\\237\\222\\351\\215\\367\\311\\365oF\\226\\357L\\032\\367\\337\\220\\011\\0105D\\016\\300\\014\\332\\020\042\\240\\201 \\316\\373\\032l\\256\\222\\202\\311\\200J\\252j\\242uF\\240\\211\\230)2Eq\\304P\\210\\300\\020\\243W\\010j\\277\\260\\003\\212D$q-D1\\006O1\\000\\221\\014\\315\012\\225\\340\\314H\\204 \\272m\\011\\323\\000C\\234(\\320\\310\\304\\0368*DI\\213\\2172K+#\\371\\034\\273w\\247\\030\\001\\210\\240w}\\004]\\215\\347\\263\\303\\007}\\240\\203\\243\\2234\\317\\233\\2465Z'\\211\\015\\336_]\\234\\177\\363\\325\\227Y\\232v.:\\357\\2656\\316\\365\\227\\327Wm\\327ic\\232\\256\\355Z\\227\\346y\\222f\\235\\363\\233\\315\\366\\342\\342\\362\\342\\342b\\261Xum{q~~{{\\033c\\024\\237N9\\364;\\357\\345,.r\\351\\373\\265\\201(\\203\\244\\357\\312u^/We\\261\\253r\\021y\\224Y\\356\\372>K\\323f[3\\207\\305\\335m\\360\\216b\\310\\263\\254\\357:`\\356\\273n6\\235,\\027w\\365f\\333\\265-\\020+\\300\\355z\\243QiP\\206w\\341g\012q\\037\\216\\202\\250\\225\\215!(c\\3458e\\223$I\\322\\303\\303\\271\\321\\252mZ\\246h\\214>=}\\360\\321G\\037\\244i\\362\\311'\\277\\034\\016\\007\\243\\321H)\\334l\\266\\333f\\273^\\255\\215Mn\\256/\\247\\223qUUm[{\\357\\237>}zuu\\005\\200m\\333!\\252\\357\\014\\216ofaF\\004ct\\024\\252p\\244\\270\\227\\264\\340}*\\370\\333\\275\\350\\337\\254\\332\\370\\253v\\005\\337\\371\\354_\\371\\202\\267\\377'\042\\330\\324\\304@ \\261'\\332@\\210@\\010\\332\\232\\262*\\253\\331\\361\\321\\351\\311\\331\\343\\331\\374\\270(\\207I\\232k\\223\\212W\042Qt\\316\\273\\276\\223\\232\\006$\042\\322\\000J#P\\214\\301Ap\\022\\336,\\020 \\202\\332\\305\\033\\355\\216\\202Q)\\004 \\265\\363\\357\\334\\305\\301k`\\025\\331 (d\\340\\310\\034\\367\\267!F\\011d\\336\\347\\330\\356e\\330\\302\\000\\004T\012u\\232\\024\\243\\321\\354 \\260\\312\\312\\301h4\\022\\310\\211\\231 x\\357\\334\\345\\371E]7\\221Qt\042>x\\347\\274L\\256M\\323T\\303\\321\\371\\371\\371r\\2659<<\\312\\262\\374\\352\\372\\352\\325\\253s\\347\\334j\\271j\\352F\\206\\007Q\\025\\311/\\324v-\042\\336s\\214\\206\\303aQ\\024\\222\\313(\\356\\2461\\306\\315f\\223\\246\\251\\321\\272m[!`\\356\\336\\014\\200\\034\\370\\210\\250n\\266\\342Z!\\335\\307{/>\\376WWW\\302\\365=??\\227\\024,q8\\322\\300Zv\\371\012w\\327\\024\\030\\201%y\\035\\215\\326!x\\004\\245\\225.\\362\\354\\235w\\036y\\357\\266\\333M\\236\\245\\307\\307GE\\221+\\004\\015\\230&\\252\\314\\363\\331|\\326\\367\\035 &iV\\224E\\226g_~\\376\\305d<\\236M\\246\\323\\331\\364\\365\\353s\\245\\324\\227_|\\315\\240\\202\\017JYDE;Y%\\310\\037TH4\\306h\\321#D\\212Ib\\2555\\014L\\221b\\0101\\004\\020\\253\\211\\267\\352\\376\\355B|{l\\370\\367)\\350\\375g\\031d\\011\\254\\024\\332\\004\\010\\001\\224\\035Lf\\307gO\\236|P\\016\\307\\250\\023\\347\\342z\\323l\\266M\\357\\202\\217\\024bd&`\\0161\\204\\340ao\\212\\201\\014F+\\2435\\002\\307\\030(x\\010\\0218\\002G\\031\\\\\\224\\004\\32431\\023D2J\\357\\325'\\362\\266H\\324\\035\\026\\330 \\001F\\022o\\227\\335\\213\\220\\031\\024j\\224\\3241\\336Y\\332\\261<\\023\\004\\022W\\251I\\213r4\\013\\021\\265M\\274\\367\\203A\\2515\\370\\276\\013\\336wm\\375\\372\\345K\\357\\275\\363\\001\\030\\004\\344\\227\\347F\\014\\276\\357\\372\\345j}pp\\220\\330\\364n\\261\\334l\\266?\\370\\376\\257M\\306\\323\\313\\213K\\253\\365\\365\\365\\365\\335\\335\\235\\330\\335:\\347\\020q:\\235\\002\\242\\254\\015\\212\\242\\020\\256\\234h\\256\\017\\217\\217V\\353\\0250\\314f3\\301\\272\\203\\017\\342\\212\\233$\\311\\355\\325u\\226\\246F\\353\\315z=\\034\\016\\373\\276\\317\\263\\264\\251\\233\\266i\\264R\\327W\\327i\\222\\246I\\022\\2747\\332x\\347\\202\\017\\336yD\\006\\246\\340\\235V\\250\\001\\315\\333\\017l\\330\\205\\244\\020\\207`\\254\\025Y\\013\042\\204\\340\\32349;;\\363\\336Er/\\237\\277\\370\\275\\037\\3750\\261\\372\\344p\\376\\345\\227_\\034\\237\\034\\236\\235\\236\\315\\2463`!ZbQ\\226!\\322\\305\\305\\353<\\313\\036=|T\\015\\207\\317\\236={\\361\\374u\\3279T*I\\022`d\\265{\\350\\263\\244]+\\245\\264J\\255af1\\031\\243\\310J+\042\\212\\201\\322,\\023\\252\\273\\274R\\212O\\036d\\377\\226\\222\\375w+\\3507s\\013*\\362\\021\\214\\005e!\\000\\250$\\033\\037\\034\\034\\234T\\303I\\337\\307\\246\\363M\\353\\232\\276o\\333\\276\\351\\273\\276\\355\\272\\276s\\276'\\366b\\267\\254w\\371q\\000\\200Z\\201\\331\\275\\333@1\\306\\030\\200#D\\002\\222\\314\\023V \\2030\\311\\340!~F \\034\\272\\035L\\030\\025\\200f\\326\\310\\200L\\024X6\\326\\022<\\303\\302\\377\\223\\230Id11\\332a\\352@\\240A'\\332\\346\\345h\012\\332(m:\\337\\217GCqp\\326\012\\272\\266}\\371\\342E\\214\\024\\\\D&\\205BAB\\211\\225\\214Dm\\323\\\\\\337\\334.\\026\\213a5t}o\\023\\233%\\331\\273O\\236\\204\\260[Y\\034\\034\\034\\210\\373m\\327u\\2108\\250*D\\024\\002\\276L\\035\\3169c\\214\\370\\222i\\245e\\323e\\214Il\042\\373\\334\\020B5\\0308\\347\\004\\273\\275\\270\\270\\2101\\306\\030\\212\\242\\220\\005\\337t:\\265\\326\\336\\334\\334\\304\\030\\207\\303\\341r\\271|\\371\\362eUU]\\327Zkooo\\263,\\323\\326\\024\\032\\265Q\\306(\\2435J\\217\\240H\\300\\234\\330D\\220\\030\\243t\\014\\216)fi\\322\\365\\355\\253\\327/\\221\\341\\325\\253\\027e\\221\\237\\277z5(sk\\364l<I\\263$+\\262\\246\\355^\\276z\\375\\362\\325\\213\\027/_z\\347\\307\\243\\321\\311\\311!1|\\366\\331g7\\327\\213\\242\\310\\0001\\006\\346\\375I\\210\\337\\312\\313S\042\\377\\002b\\206,\\313\\274\\017y\\236\\215F\\243\\343\\223cI\\230\\215\\221\\356q\\015\\331\\274\\277)\\312\\267F\\027|\\353\\237\\377\\277\012\\032\\277\\373\\345\\014J\\2459{\\204\\200`\\363\\361\\374d~x\\252m^wn\\261\\252\\235\\363\\014\\240\\2646F\\243\\226\\340:&\\337D\\362L\\221\\200\\224RFK\\344W4J\\013\\244\\022\\203c\042\\321\\006\\003\\211\\211\\000\\354<\\310\\005\\017\\001F\\000\\022\\211W$\\371\\2244\\032dN\\20052\\003\\211\\260\\017\\325N\\003&G\\350}AK\\260\\024\\000\\2022@\\250\\002)\\324)\\251t0\\234\\350$\\003\\205\\325`P\\224\\0053\\247iZ\\225U\\337\\273\\257\\237=k\\352v\\377\\240\\334G\\350\\021\\305\\340\\235\\367!\\004k\\214F\\205\\014\\227\\027W\\2218\\364.P|\\357\\275\\247gggBG\\356\\373^d\\023\\263\\331\\254\\032VEQ\\214\\307\\343\\301`\\220\\347y\\222$\\210\\230\\246\\251x<\\307\\020dHh\\232\\246\\336n\\211h\\275XZm\\256./\\023k\\205\\020RUU\\010\\241o\\232\\273\\333\\333AYfiJ\\024\\230h:\\231\\364]\\347\\372^+\\005\\034\\021x\\265Xfi\\332\\267\\0350\\353,\\033\\334g\\263*\\275;61\\263\\3144!\\004\\245 M\\023\\206\\350|\\277\\2557\\304\\274\\274\\273\\015\\336\\375\\360\\257\\375\\265\\371t\\372k?\\370^[o\\277}\\366\\354\\235w\\036\\347Yvtt<\\034\\016\\2224],\\226\\353\\365z0\\030\\314\\017f\\323\\311\\304\\030\\373\\371\\347\\237o\\267\\255\\230+\\304\\020`\\027\\204\\005,X\\302^\\257\\026B8\\234\\317OO\\317\\216\\217\\217\\373\\276\\313\\363\\274\\252\\252\\243\\243\\243\\353\\353\\353\\276\\357\\245s\\357\\253\\355\\257*\\334\\267\\312\\364\\337\\247\\240w\\237E\\303\\220@\\000\\320\\351\\360\\340d8\\232\\272\\200\\353MS7\\275\\265iD\\210!8\\337\\373\\020\\244\\274\\224\\006\\346\\000\\3001\\370\\340|\\334\\025\042\\020\\021\\002D\\357}\\337\\205\\350\\221\\230Y\\200\\303\\000@\\000\\021\\211\\031\\210)\\300N\\341\\312\\024\\367\\233\\015)Xf\\331\\337%\\210\012\\230\\230\\210\\002\\211\\031\\306n^V\012\\025\\356\\266\\346\\020\\221\\205\\356\\031\042D\\306@\\212\\224\\365Qge\\245m\\032\\210\\2541\\211\\265\\342!\\001\\210\\253\\345\\346\\371\\363\\027\\336\\007\012\\221c`\\212;\\227\\003f\\211\\242\\355\\332\\266i\\233\\246\\256\\001\\300\\367\\336h\\235\\030;\\254\\252W\\347\\257\\252\\252\\232\\317\\347\\247\\247\\247GGG\\017\\036<\\030\\215F\\263\\331\\354\\370\\344\\370\\370\\370x6\\233\\311\\205M\\222D6\\0306\\261\\316\\271\\276\\353\\205\\233pssSo\\353\\242(\\312\\242h\\333vP\\226\\242\\323\\323Z_^^j\\255GU%D\\347\\305b\\201\012///\\227\\313\\245L\\325\\306\\230\\321h\\007\\326\\310:\\257\\357{\\235\\246\\345\\233?!\\310sO\\314>\\204N\\020\\305A\\031\\0250s\\333\\326}\\327\\006\\037\\207\\303\\362\\321\\243\\323\\311h\\250\\265b\\212e\\236%\\326\\204\\350C\\214EY\\036\\035\\237\\234_\\274\\276\\275\\273k\\333\\346\\341\\331\\2315\\246i\\273W\\257^1\\261s\\236\\001\\263,\\013\\201`\\227\012\\013\\300\\021\\230A\\355\\320\\220\\217>\\374\\340\\361\\343Gi\\232|\\373\\355\\363\\272\\256\\327\\353\\365f\\263\\021J8\\334\\303\\020\\373\\010\\373\\357\\024\\356[\\263\\023\\277\\245t\\377w.hf\\315\\036\\301\\224\\325\\370p8\\232\\022\\351\\365\\272i{\\307\\312\\264}\\037(\\0100G\\020\\011b G\\321Y\\215\012\\230\\210!\\006\\016\\034v\\220\\010\\261\\204/\\204\\200D@\\214\\310@\\014\\310L^*\\025\\221%\\372N*\\030AR\\344\\344c\\017\\2700\\245J!\\004\\026\\330\\033y\\327\\027HNA\\210r \\001`$\\361\\257\\360\\021Xi\\000\\215i\\316\\021\\323b\\230d\\271\\013Q4\\310\\342\\036\\330\\365~\\275\\256\\257\\256o\\000\\3207\\015r\\004&\\226\\250_\\205J)@\\310\\363<\\3172\012\\274Zm\\372\\266m\\333n\\263\\334\\334\\334\\336\\254W\\313\\266\\357\\272\\256\\2737\\2053\\306\\034\\034\\034\\370\\340\\305\\226\\\\\\366\\323m\\333.\\227\\313\\365z]75\\021i\\245V\\253\\225\\030\\225\\217\\206\\303\\276\\357\\203\\363B3\\026\\227\\242\\020\\302\\260\\034dizww\\273X,\\030\\250(\\362\\335\\353G#9kz\\357\\3234\\351\\272Npu)\\006\\023\\001\\211#\\000(T\\010\\362\\267\\001b&\\357\\224\\265I\\232\\351\\304\\006&F\\235\\346%\\001\\004\\347lb\\372\\276\\377\\362\\213\\257?|\\372nU\\344\\261\\357-\\352\\243\\371qdZo7Y\\226\\317\\017\\216\\022c\\007E\\351\\234[\\257V\\253\\345\\362\\362\\352\\346\\356n\\243\\024(\\2051\\006\\346D\\355R\\213\\221a\\227\\242\\000\\000\012t\\231\\345\\243\\3410M\\222\\345r\\271YmQ\\003\\020lx#w\\244H\\334\\230H\\002\\223e\\360\\376\\327\\367\\307{\\344XHs\\337\\035\\262y\\0179\\313+w\\005\\004;\\332:\\313L\\257\\231\\021\\020Y\\245\\345\\344`8\\234\\217F#e\\023\\002.\\006#\\027\\274w1\\220gf\\037\\\\\\337\\267\\336G\\346(\\243\\0233k\\245\\264Q\\221\\001B\\204\\340\\242\012\\010\\232\\000\\220A\\213\\200I(GJ)4\\316\\357hG\\010\\010\\022_\\312\\001\\230\\225\\326\\270\\213\\221\\336S\\354\\205\\203d\\214\\260>\\342\\316O\\024\\000\\025cdP\\254\\014\\202f\\204\\210\\314h\\030\\211\\224\\006\\2550-\\200\\225\\315\\006=\\020\\030\\213\\312 \\301h<\\2251\\200\\231\\025`>\\310\\262\042\\2577+c\\025D\\2101\\356\\274L\\211\\002\\0213K\\311*\\245\\254\\265\\326\\346m\\275\\341\\030QqD\\002\\015\\213\\233\\333\\213\\213\\327\\263\\361l:?\\350\\352\\346\\374\\374\\\\\\2167\\022gJ!\\366}\\3376\\2152\\272\\310\\362\\333\\305]\\236f\\210\\270\\331l\\332\\266-\\363\\242i\\232a9h\\332\\255Qv\\263Y\\031\\223\\204\\340\\266\\253m\\226%\\307\\307\\307\\233\\315\\346\\372\\346\\252(\012\\241\\374\\367}/\\240\\314`0H\\022#S\\373\\301\\301\\201\\254\\007\\214G\\324Ib\\224\\016\\3019\\347\\264AL\\014D\\007\\021\\224\\326J\\353\\270\\263_B\\347\\275\\363\\000\\240\\254\\325e\\232/\\227\\253\\371\\301\\311\\315\\305\\371\\341\\344\\360\\037\\374\\203\\377\\371?\\371[\\177\\033\\265\\322\\250|\\347/\\316\\317\\213\\242\\260\\326~\\364\\321G\\303\\262\\020G\\335\\315j#S)\\021\\365]\\243\\224!\\347\\323,s\\336\\003\\2216\\006\\0304\\303\\343\\263\\207\\307\\207'\\316\\271\\256\\351\\255Q>\\220\\321\\030\\234WJ\\311\\006\\341\\276[\\355\\322\\302\\231x\\207}\012\\356\\253\\021\\020X\\031\\231\\263\\0052C\\324Z\\003\\0201F\\221\\202\\0002\\023\042h\\215\\202\\317h\\015\\250\\214\\017\\300\\244\\000\\222\\244\\254\\346\\207\\017\\036\\234<\\364\\216c\\344\\256\\3536\\233E\\2141\\313\\222\\331\\301l4\\032m\\267\\333\\365z}\\273\\350\\002`^\\016\\264\\326m\\337\\324\\3335)\\010\\024wC\\224V\\300\\021|\\317>`^\\252\\373\\364\\023\012\\260#\\305ZP\\0068\\002\\021C\\004\\245\\264B\\305\\310\\014@!RL\\263\\244\\357=he\\023\\355\\332\\316\\246\\2261\\266\\241SF\\243N\\0021\\023$I\\346\\221\042*kRB\\345zg\\363\\342\\370\\301\\203j4\\354\\273\\210:\\223s\\0073t}\\004\\200\\316\\021\\001o\\267\\2151&F&\\242\\247\\357<i\\232mY\\230\\327\\256Vb\\355\\010L\\314\\210\\264\\017n\\207\\304j\\201{\\274\\213\\353UH\\323\\224)x\\337fe\\321\\273F\\201::9z\\375\\374\\305d6\\235\\216'7w\\267\\342++>\\371Z\\353\\323\\323\\323f\\273\\236N\\24777W\\233\\315f\\203\\230e\\331\\321\\374\\260o\\233\\266\\336\\014\\253j8\\034\\\\\\\\l\\264U1\\206\\333\\253\\353\\303\\243\\271\\326\\010\\310_|\\375eQ\\024\\263\\371\\\\\\366}\\221\\271\\355{\\233\\246eU9\\347.\\256n\\362</\\006\\211\\344k2\\263\\220\\214y\\2677\\322\\022\\315.\\300\\206&|\\363h&\\202(\\273{&k\\212\\310\\364\\360\\301\\211A\\365\\341\\373\\037\\\\]\\274\\356\\333\\356\\356\\346&+s\\347\\303\\335b\\261\\355\\373W\\257^\\001\\300\\301\\301\\301\\243\\263\\207\\300<\\235\\036\\274|\\361\\177&IR\\327\\275\\261\\026\\021\\345\\2731\\221B\\214\\0001\\204$I\\346\\363\\331\\365\\325mt\\3369\\327\\324\\2651\\00612s\\226$n\\307Z\\376\\216\\035\\020\\213\\214\\016Ar_\\001\\014\\000HB\\016\\263d3#\\355h[A\\236\\001&-m\\0077\\204\\000\\000 \\000IDAT\\002E\\210\\001\\230\\210\\200\\220\\023\\255\\310\\200s\042I5y5y\\364\\316\\373\\263\\203\\243.\\360j\\323\\015\\313Ap\\235\\002\\234M\\246\\243q\\225Z\\323u\\335\\372\\346&\\317\\363A\\226\\206\\262\\200\\225\\357\\352\\026\\021\\225VU^\\365\\256&\\2434 \\0008\\347\\3309`\\206\\304\\260wa?\\344\\240\\274\\021\\346\\020\\002\\032\\315qO&!\\221\\341\\002s\\264\\306\\020G\\212^k$\\366\\256w\\240@'\\006\\021\\024fD\\344|L\\262<\\311\\362\\274\\254\\236<}\\357`~L\\240l\\222\\215g3m\\222o\\276}v\\376\\3722\\251\\262\\266\\021I\\023\\304\\030\\235'\\245Tb\\020\\001\\275\\367\\233M\\235$\\311f\\271\\332n\\267\\301ui\\226\\244i\\342\\243\\007F\\231\\275p_\\000\\374\\226\\337\\034\\0219\\327{\\357\\332\\266A\\255*_\\231$1\\306\\350+\\3254M\\214\\241\\331\\326m\\333\\302d\\222M&\\256\\353\\263,\\003\\344\\177\\371\\363_\\014\\207\\303\\365z\\035\\231\\363<\\037\\024\\345\\325\\325\\325\\302,\\256\\257\\257\\207\\203\\001\\021-\\026w\\210\\030\\234o\\232f<\\034v]\\327\\264\\365(\\031\\235\\234\\234\\254V\\253\\327\\257_3\\263\\264\\341\\246if\\263\\331j\\265\\222\\363\\225\\234\\000\\263,3\\306l\\267[c\\024\\002\\310\\331\\0305\\252\\335\\010\\246@)T@\\010\\244\\025\\002@\\010\\236\\202W\\200\\351`\\200\\210\\303a\\345\\275\\257\\273z<*\\215AT4\\030\\225UU\\265\\235[\\267\\365\\327\\237~\\371\\3457\\317\\232\\026\042\\323\\331\\203\\323,+z\\027\\030\\241\\355\\373rPl\\267\\015\\200Rh\\000T\\014\\302\\177\\336\\2114\\217\\216\\216\\2546\\333\\266\\371\\354\\263\\317\\276\\372\\352+\\357\\003\\010c\\222z\\341\\240\\275\\235*\\311{B\\374[\\377zC+e\\336=\\325\\2156D$y\\303J)\\357zDT\\010\\014F\\334\\205\\304\\375\\004\\301\\032\\223\\014G\\363\\007\\017\\337\\231\\315OB\\004\\013t<\\233+\\245\\2124\\223Sr\\232Z\\005\\3041rj)\\270*\\317F\\325\\320\\037\\036o\\352\\355f\\263Yo\\352\\256o\\024 \\305H\\000J)\\255T\\320\\032\\210\\2656\\321w\042\\223\\006\\245\\024*\\000\\022\\371\\200V\012\\224\012$\\207\\277\\035\\011\\213!\\202\\322\\210\\034\\202\\263i\\022{\\024V\\202M\\322\\315f\\303>\\230,\\373\\360\\343\\017~\\377\\017\\377\\306\\373\\037|\\010J\\037\\036?`P\\236\\350\\346v\\361\\343\\277\\370\\347\\377\\374g\\177\\256\\264\\035\\014\\252\\345bmu\042\\024\\237\\020\\202s^\\002s\\205\\270\\\\\\024\\005\\021\\215\\307\\323W\\257^\\015G\\003\\337\\365\\202\\252\\2759X\\013\\340\\006$\\353\\001\\334c\\253\\274\\367\\030\\347\\010\\233\\315\\306\\246\\351=1\\003\\000\\344\\320v}}U\\226\\345|>_.\\027\\243\\321\\250\\357\\273\\353\\353.\\337\\346\\214P\\016\\253\\273\\253\\253\\341pxuq~x0\\353\\2326O\\323\\272\\256ono$\\255oS\\327\\0000\\231\\315noo'J\\311\\362D<\\302%\\237D\\362\\201\\244fp\\317\\216\\024\\252\\223N\\212!\\200\\\\j\042\042\\245P#\\307\\030wveJ%Z\\013\\321\\214b\\324\012G\\343\\211\\261\\346\\344hn4><=\\035U%p\\270\\275\\271*\\212<P`\\315Y^~\\366\\305\\027M\\327)\\015>\\320z\\263=>>)\\213\\362\\371\\267/7\\233\\006\\000c\\344\\262,\\235\\363r\\345\\344\\2072\\2631\\346\\350\\350\\360\\275\\247Oo\\357n~\\365\\253_\\265m\\237\\347)\\000D\\342$\\261Rv\\36732\042(\\205J)\\243\\341~M\\202\\242\\305\\006a\\\\2\\363w5y\\262\\024c\\220-\\230\\354\\004\\200\\221A+\\264iV\\224\\203\\311l~|t|V\\346U\\327\\271\\340C\\232\\244\\326Z\\321\\371\\002\\220\\357[\\337;\\205P\\3449\\207\\310\\314\\034I\\001\\346YV\\225\\203\\301\\240\\032\\014J\\346\\210\012\\243\\363>\\006\\203*\\261\\211\\320\\312\\200vtA\\340\\373\\374mb\\216F\\335s\\241d\\003-\\301$\\314L\\250U\\214Q\\031\\023\\231\\201\\261\\034N\\002\\201\\357\\374\\351\\323\\367\\377\\363\\377\\342\\357\\375\\235\\277\\367_\\216f\\207\\325\\370`8\\233_\\336,n\\227\\233W\\257\\257\\376\\354/\\376\\305\\027_~\\223\\345\\025\\032\\273\\33646Ic\\240\\340\\275\\024t\\010Q\\206`\\245\\324f\\273\\001\\0001s[,o'\\223\\311\\365\\365\\325z\\265\\216\\201\\356u\\343\\322\\236El\\3606\\200\\265[\\260*\\245PE\042\\351I]\\327)\\245\\344`'\\034QYH\\177\\365\\325W\\342\\377-\\337\\304\\030\\\\-\\027\\300\\324\\365\\335\\240\\030l7\\033!l\\000\\300`0\\220\\345\\264\\354\\263\\205g'\\306H\\314,\\344\\015!X\\037\\034\\034H)+\\245\\304\\225Fv\\341EQh\\233\\025\\262\\033\\027\\200J\\266\\2321\\004\\305\\000\\314\\032\\225\\321\\232I\\200\\000\\322\\332t\\256GTF\\341\\351\\351I\\221\\333\\307\\217\\317\\226\\313[\\347\\232\\007\\247'\\306\\250$\\315ub\\177\\362\\317\\177z\\267\\354\\265QM\\355\\000x8\\231\\366\\235\\373\\344\\347\\277\\230\\316fm\\353\\322,\\023\\2238m\\214\\020y\\005u'\\216\\326\\232\\327\\257^}\\376\\305g\\333m\\2435\\372\\020B\\224\\233\\217\\264F\\245\\276\\003s\\3577kjw|Q\\250\\264F%\\375#\\246Y*e\\202\\032Q)\\006\\022\\372{n\\015Ff b9 jmR\\223\\016\\272\\316\\277\\363\\364\\243'O\\336\\263&s. +\\255\\214\\360\\212b\\214\\344\\0352\\230\\335b\\205)\\306\\324\\032f\\362\\316y\\327s\\214\\032\\001\\030\\230B^\\346eQhT\\3369\012\\321h\\215@\\3369c4\\313\\342\\202#\\320\\336\\203\\016\\242\\022\\312\\0363\\212\\035\\021\\022*@\\2051\\006\\225\\030\012\\221P\\001+P\\326\\246E\\353\\242\\035\\214\\376\\333\\377\\356\\277\\177\\362\\336\\207i9\\032M\\017\\352\\316\\257\\326\\315xzx\\273\\\\\\377\\277\\377\\354\\307_?\\177il\\321vn[w\012\\023\\347=\\307\\030|\\240\\375\\207\\326:I,\042\\026ea\\214y\\370\\360\\014\\200'\\223\\261<\\202n\\256\\257\\273\\266\\277\\227\\226\\337\\367if\\020\\274L\\032\\320\\236\\017\\003\\314\\214\012\\021H!\\364]\\233\\245\\211B\\350\\332\\306h\\265Y\\257&\\343\\321v\\263\\316\\2634Ml\\337\\265\012\\341\\325\\313\\027\\2515uS\\017\\313\\262\\353[\\253\\365\\355\\315u\\232X\\212!rD\\204\\355\\266\\226\\373\\337Z\\033\\343\\316\\341\\356\\331\\263g\\336\\373\\203\\203\\003\\221\\002h\\255\\357\\356\\356D\\266wO\\236\\026C\\242$I4\\332L\\370\\251L\\300;+5\\210a\\217u)\\005{B\\217\\002T\\250=\\221\\010i\\212<99:\\032\\216\\006m\\263^\\255WF\\241\\2626\\3133\\245\\355g\\237\\177\\261\\\\\\267Y\\226F\\242\\272n\\017\\217\\016\\027\\213\\365\\305\\345%\\005\\341k\\313\\220\\301j\\317xFDkm\\244\\020\\202\\277\\272\\272\\364>$\\211I\\323Tr\\311F\\243\\252\\357\\335n\\215\\370\\235\\001Z\\366\\261;\\232\\331\\233\\247\\241\\214\\020\\2101:\\000Vr'\\354GmE\\304$+lM\\200\\014\\232\\010#\\301\\361\\331\\273\\217\\036?\\031O\\217\\274\\217\\353M\\335\\267N)U\\346\\005#0G\\002\\006\\210\\242m\\022\\320\\201\\231\\023\\233\\024y\\231g\\231V:x\\337\\326m\\333\\324i\\222dij\\215\\365\\275\\353\\332.\\206\\200\\0102\\347\\001\\354O\\257\\314\\214\\264S@2\\003\\200F\\000\\210\\200\\274k\\317\012\\200\\243\\262\\011\\211e\\221N@[@\\235\\344\\203\\377\\352\\357\\3777g\\357<]\\327\\2352\\266\\355B\\222\\027\\353m\\363\\247?\\376\\311\\037\\377\\311\\237\\306\\210.\\304\\246\\351\\323,G0m\\337'&\\015}\\037\\367\042\\006)hA\\030\\322,\\265Vk\\2151F\\006\\222\\315\\332\\267\\317\\276\\225\\305\\312=\\315\\346\\376\\201\\376\\026~\\265\\253u\\024\\312\\272\\202{\\325E\\226e\\367\\204}\\031B\\326\\3535QX\\2577\\314\\021\\000'\\223\\321z\\263\\0244T\\241\\362\\336\\345yf\\214\\365\\336\\007\\347\\357\\026\\013\\255LUU\\313\\345R\\250\\366\\302\\316\\223\\3219\\306(\\222(9\\233-\\026\\013\\245T\\222$B\\364K\\323T\\262~4\\246%\\305(\\270)3\\200\\002\\004\\334\\305B\\033\\243P\\023q\\210\\264C\\241\\224\\312\\213Q\\014l\\214\\002\\200\\037\\374\\340\\243A\\221\\025\\231\\335n\\267\\267w7\\363\\371a\\232e\\000j[\\367\\257^\\277n\\333\\200J\\245y\\221g\\305\\227_~\\215\\250\\246\\007\\363\\017?\\372\\336\\315\\325\\215\\354*(F@`\\000\\233$EY\\030k\\264\\325E^\\210\\261U\\323\\366\\367\\2272\\204\\270#\\254k\\324Fk\\263\\213\\307UZ\\241\\322\\262\\376D\\334m\\364Lb\\322,u}\\007B\\2636\\206\\231%B\\017@\\030A\\000J+\\235\\020#\\240\\326\\305h8\\231\\377\\307?\\374\\021)\\263\\274\\333t\\2757\\332\\022Sp>0\\201\\022\\326\\017\\306\\030\\203\\367\\301{\\205\\250\\215\\356\\273\\2368r\\2141\\006&\\260\\306\\344YZ\\226e\\335\\326\\210\\240\\225B\\000\\357\\272\\256m\\230(1\\226)\\240\\\\\\335\\375\\360!\\303*0k\\301\\370p\\007\\023\\362n\\223\\211\\24440\\003(\\235\\025\\250\\2541\\331\\343w\\337\\377\\370?\\370\\255r0J\\263b:;\\320:\\331\\266\\335?\\375\\343\\177\\366\\351_~^\\226\\325\\365\\315\\242m;c\\222\\030\\011Q[c\\273\\246\\001\012\\034\\035\\020\\000q\\334u\\350D)E\\321\\017\\312r\\265^\\315f3@\\316\\262\\014\\021\\327\\253u\\337\\365\\300J&\\264\\267\\267\\362\\002\\354\\354\\007l\\324\\273\\017\\305DZ\\243V\\250\\024\\346Y\\332\\367]\\226\\245\\300\\324\\266\\315\\355\\355\\315\\240,D\\317^\\226\\371z\\275N\\022c\\215\\255\\267\\353jPn\\267\\333a5X.\\356\\322$Y\\256\\226\\314P\\225\\0039$\\210#\\327r\\275\\036\\215G\\26777r\\023\\2122@z\\366\\355\\355m\\232\\246\\326\\332,\\313\\210\\310\\030#Pe\\214\\321(%\\230-\042j\\241\\332i\\305D\\206\\310+\\245\\030U\\210\\236\\210\\022D\\320*2\\256V\\033\\233\\245\\353\\325\\346\\301\\321\\241\\353CQ\\224}\\273N\\323\\364\\366v\\361\\344\\0117M\\027\042>89\\033\\015~u}\\267\\262:Q\\000\\027\\027\\027\\342\\370trrTU\\0253\\005\\221B\\021\\021\\221\\034S\\362<U*\\327\\006\\037\\034\\2374\\315\\366\\346\\346\\346\\356\\356.M\\323\\325j\\343\\234\\323\\032cd\\245@^,B\\230\\375\\350\\251D\\216\\326\\266\\255\\367^i]\\226\\345p8\\354\\272F\\356`D\\334n\\327\\353\\365:FN\\022\\023\\\\\\020\\177-\\016\\001t\\222\\217\\017\\036?y\\377\\321\\343w\\033\\027\\225\\311L\\246\\232m\\355\\242\\347\\030#E\\337\\326n\\033\\224\\006kmj\\2155F\\001\\364\\241\\357\\373(\\\\\\234\\306\\265Dd\\215\\321&\\341H.\\364E\\232z\\212\\212aP\\224\\375\\240\\2527[\\337\\367\\310\\2404\\000\\242\\322\042\\307\\336?\\257\\021\\024+T\012\\221\\0004c`\\271q\\001@[`\\002\\324\\000h\\223\\202@\\333\\264|\\364\\344]\\327\\207\\272\\355F\\243\\311r\\275\\275\\271\\271{\\365\\352\\325\\217\\377\\374''''\\327\\327\\327Y\\232[\\235t]\\207\\250A\\307\\030\\243F\\214;\\3758\\355/\\327~2\\336k\\010\\332\\266=:\\236/\\227\\213$\\221\\257\\305=B\\360\\346\\000\\376Vq\\203|\\241\\264LD`\\216\\332$r\\004\\002\\200\\020B\\222$\\336{\\361S\\\\\\257\\227bT\\267^\\257\\313\\262\\274\\272\\272*\\213\\314;wwww|||yy\\351\\275\\217\\221g\\263Y5\\034\\257V\\253\\223\\203C\\241\012K\\217\\367\\336?z\\364\\210\\210^\\275zU\\024\\305\\321\\321\\221\\360\\372\\305\\020\\254\\256k\\371=\\345\\257\\274\\243\\277#\\262\\3222\\0301\\000p\\010\\001P)\\263w\\215 \\340\\010\\000\\216\\243\\001TFK\\267K\\222,F\\276\\274\\274\\371\\350\\275\\247Z\\247\\210&\\006\\350Z?\\236\\314\042\\341\\343\\307\\243'O\\236\\256V?\\217\\336\\035\\037?\\000\\205\\321\\367YU.n\\257\\313,\\177\\370\\360\\364\\253\\257\\276!\\212\\273\\023?\\242s\\335\\325U\\255\\224JR#o\\365\\370\\301\\351G\\037\\177_f\\246\\313\\313KQ|\\211\\241\\272\\374\\336\\203\\301@\\216\\336\\300j\\273\\335V\\303R\\372\\364\\353\\327\\257CpUU\\306\\350c\\214b\\264*x\\354g\\237}v~~>\\032O:\\327OfG`\\222\\272\\011\\247\\217\\236\\236<xx\\275X\\006\\017u\\335tM\\033B\\210}\\357\\273V+\\225e\\211\\311\\323$I\\010\\201(\\264-+\\344D\\033k\\264s\\275\\002bDP\\340\\243\\367\\024%\042\\315u\\035*\\205Z'\\332\\034L\\247BF[o\\326I\\226P\\214\\210l\\215\\221\\010\\245\\030\\243\\350\\276s[\\270\\030\\215\\261\\314\\336\\024Eh\\032@\\000k\\001\\020T\\372\\370\\235'g\\247\\357\\376\\366o\\377\\216\\321\\331\\363\\327\\347\\203A\\225Z\\353\\273\\236\\231\\377\\217\\377\\375\\037\\022\\321\\250\\2526\\253\\025\\202\\352\\233\\232\\031\\0250\\260PA\\010\\231\\310\\007Dd$\\242\\230h\\223hs_\\246\\333\\355v~8C\\200\\315j]d\\271\\217\\201h\\027\\311\\243\\224\\001\\240}X<\\312P\\252\\265V\\240\\231\\345\\314\\312\\322\\241\\235\\213\\211\\315\\210\\203\\210d\\017\\016\\016V\\253\\225\\367~0(\\352\\272\\226\\236b\\214,\\302cY\\346\\301\\373\\203\\203\\203\\213\\213\\013\\031\\202\\223$\\231L&m\\333.\\226\\353\\351t\\272\\\\.e\\307/\\317[\\341\\354\\267m\\373\\344\\311\\223\\253\\253+\\211\\334\\024\\263cf\\236N\\247\\210(\\203\\215\\374\\363\\350\\350\\310\\214G\\225\\310\\263\\202\\2203C\\000\\000\\322\\032\042\\201bP\\032\\255\\025\\222n\\240\\310=i[ s\\210AtMI\\222-\\357\\226}\\347\\347\\007G\\317\\276y~\\324\\205\\263\\323\\207\\250\\223<K\\312<#\\340,\\265\\214L\\321\\033\\215\\233\\325\\362R\\233\\253\\313sY\\033\\207\\020\\211\\2009\\356\\316Z;3\\377x{{{}}-\\362X\\3215\\210\\314A\\004gB\\274\\332n\\2671F\\261zq\\316-\\226\\267\\362\\364\\351\\272\\016\\200\\2141\\303\\341\\360\\372\\372\\372\\374\\374\\274\\252FI\\342\\212\042\\276\\367\\336\\007\\017\\036\\234=\\177\\371R\\207\\330G\\232\\214\\252\\343\\207\\207IZ.7\\353\\325j\\335\\265A\\322D\\221!\\325\\312XE!n\\233\\015\\272\\0165\\030\\245\\255\\325E\\222fYj\\265\042\\200\\276o\\021Q\\303\\316aQ\\254C\\020\\241\\032\\224\\262I\\020(\\347\\360\\360\\360\\364\\364\\264\\353\\272\\257\\277\\375\\272\\357{y\\027\\342Sjtb\\214AVm\\333\\002\\007Ph\\222\042\\004\\007huQ\\234=z\\364\\203_\\377\\215\\337\\374\\215\\337\\236\\036\\034\\022!E\\365\\313_~*\\315r\\265Z\\215G\\323\\237\\376\\364\\247]\\327m6\\033\\255\\255s\\256*\\253]\\017f\\205H\\314,\\016y\\360\\335\\017\\334\\223l\\2118M%i,Q\012\\263,\\323\\321UU\\265\\362kzce\\372\\246\\255\\277\\335\\324\\337PZ\\211\\263\\254\\350\\373\\276(\\263\\273\\273\\273\\341p\\270X,\\304\\244K\\016j\\242\\005\\364\\236\\2141;\\3063b\\3354GGGY^\\252\\276\\227\\310?b\\226\\206\\005\\312x\\357\\345\\317]V\\025\\021\\255\\226\\313\\351t*\\277@]\\327\\314,!R\\303\\341\\360\\346\\346F\\340\\033\\211\\373)\\212\\242\\353:\\243\\300[MlA#\\004T\\036\\220\\003C\\214h\\015S\\204\\3408\\260\\260\\353A+@\\245\\204=\\215L!z\\357\\257\\256\\256\\332z3\\032M\\006E\\365\\374\\371\\363\\304\\330\\315f\\023#\\037\\037\\316\\226g'\\317_\\275\\234\\215\\252\\363\\313\\327\\355\\246\\253\\261\\033V\\271\\3028\\031\\017\\233\\346Bk\\023w\\001y\\210F#!\\021\\372\\030\\203\\367\\320\\266\\256\\353\\004{\\310\\313\\322(U\\024\\205\\204\\017\\365}\\317\\314\\321\\007\\271\\203C\\014\\243\\221U\\3264\\315\\226\\000d\\263\\303\\300u\\327&Yq\\374\\340\\014\\000\\372\\336_\\337.\\332\\336\\217\\307\\323\\233\\233E\\327\\323\\354\\360p[\\267>\\200w\\361\\352\\372\\345r]\\273>\\204@\\326\\246e\\221\\216\\006\\325xT\\015\\362L!\\372\\020\\236\\275x\\351\\202\\247\\020C\\010Q\\033\\241\\020\\304\\010\\263\\331\\014\\225T\\017*ed\\205\\244\\001\\203\\367\012x\\317\\031d\\243\\264XZ\\376\\366\\354?\\352\\272nSo\\353z\\263\\331\\324\\233\\315j\\333v\\241\\353!F@\\223\\014\\206\\221(\\270\\026@=\\376\\350\\327>\\376\\301\\367\\177\\367\\367\\177O+K\\0047\\267\\313\\311dN\\314\\3277wRO\\321\\007\\327\\367_\\177\\365\\225B6\\032\\231\\242\\002\\216\\316\\355\\347]F\\331\\234\\020\\363\\016N\\332W\\263b@R@\\310P7-3\\217'\\303\\253\\253\\253\\351t\\322u]5,\\367\\000J\\274/dY\\347\\003(c\\336\\320\\315\\021\\264l?\\210\\010\\265\\325JM\\246\\007I\\232\\247iZ\\327\\2656\\246wN\\333,\\311\\322\\375I\\024\\263,\\313\\262Lk\\335\\266=3'i\\216\\312\\240\\212J[\\342X\\327\\315|>\\2208\\033\\361\\032\\365\\336'I\\032c,\\212\042M\\323\\273\\273;\\031{D\\332\\274^\\257\\001@\042~\\304\\235b\\261\\220\\320\\226\\312Xp\\210Ai&D6:&Z\\340P\\205\\246\\017\\3369'!\\027\\002\\264(T>\\324\\032\\225\\002v\\276y\\365\\374\\305\\351\\321\\374\\360`|y\\376\\272\\032\\224]\\3271\\307\\315z\\365\\374\\371\\363\\317\\277\\370r\\265\\332\\314gU\\236\\352\\027\\317\\257\\255\\001\\255\\3015\\255\\353\\332\\037|\\357\\243\\030\\343\\325\\36553\\203\\332\\211!I\\010=\\000 \\206kI\042Cj\\214\\261\\335n%\\270MD\\204J\\353\\373\\313\\255\\264n\\333\\326\\244\\211\\364\\217\\242(\\206\\303\\241M\\264s\\356\\233o\\276\\001PY\\226\\315f\\363,+\\352m\\007\\274yp\\372(\\340\\371\\343'\\037.\\026b0\\277\\331\\2567\\030\\331\042\\304\\350\\016\\346\\007\\017\\216\\016\\213\\242H\\254\\261\\326*\\0051\\362t~\\340\\234\\363]O\\0345*\\243Q\\003\\002\\261\\322\\000\\000H\\030\\231\\221\\200\\200\\311\\007B\\322\\260\\233>\\203\\363\\201\\242\\004\\2050\\263\\274\\315\\321h4\\231\\314\\000\\300\\357S\\367\\256ooV\\253u\\333\\266n\\275\\036\\035\\237\\276\\377\\341\\007?\\374\\275\\037=z\\364\\250wA'\\011\\006N3\\035\\003_]]\\325u\\355\\202\\277\\270\\270(\\212\\301\\371\\371\\345f\\263\\361\\336[k\\353u\\255\\224\\272OV\\325\\032$\\250\\227(\\022E\\241\\262\\274\\335\\252\\357\\327\\035\\250\\270i\\032k\\265\\030\\332\012G\\242^\\326\\367{\\014\\365\\226\\377\\316\\375\\266\\370\\355N\\017\\210M\\323$\\211\\271\\276\\276\\036\\016\\207\\267\\267\\267\\363\\371\\\\\\022\\317\\326\\353u\\232Y\\031)\\263,\\221V\\212\\210\\203\\201%P\\333\\365&\\311\\031\\010\\332\\266\\037\\016\\207\\233\\315f4\\235\\224!\\254\\226\\033\\000x\\361\\342\\305x<n\\232V)e\\255ADQ\\273\\210\\241\\270RJ$\\267777\\362v\\256\\257\\257\\313\\262,\\212\\342\\333o\\277\\325\\177\\377\\277\\376\\317\\346\\263I\\242U\\364]\\364\\235F\\316\\022\\223\\245\\011p\\260\\006\\023\\255M\\242\\265f\\202\\3101p\\360E\\231\\273v;\\034\\025\\037~\\370\\364\\333o\\276\\372\\344g\\377\\342\\351\\273O\\336}\\362d\\275^\\335\\\\]tm\\275^-\\212<Ms\\353}\\013H\\314\\341`Zd\\211F\\214\\203\042\\277\\270\\274}}\\376\\342\\370\\344\\370\\346\\366\\006\\000\\264\\3216\\265{\\306\\022\\0212\\020+\\243c\\330\\015s\\242\\325A\\255y\\217\\235(\\245\\020p\\267\\036B\\361\\022\042\\021\\013\\313\\366>I\\322\\333\\333;f\\234\\317\\347eY\\255W\\233\\331t>\\231L\\277\\371\\346\\333\\027/^\\227\\325(D\\276\\273[\\254V\\353zU\\267\\333::\\327l\\326\\307\\323\\351\\311|6\\237NR\\243\\243\\357\\242w\\3019\\037<\\210\\243\\021\\200\\006\\324 \\276\012\\204\\034\\203\\3631\\004\012\\201(p$\\242H1P$\\004\\320(\\314A\\240](\\004\\003\\200\\017\\024B\\364!\\270\\336\\367!\\210\\200\\237\\000F\\343\\261\\315\\362\\343\\007\\017\\236|\\360\\275\\337\\371\\335\\037}\\364\\361\\257W\\243\\351\\371\\3055\\203i\\273p{s\\367\\372\\342\\352g?\\373\\344\\307\\177\\361\\023\\347\\273\\276wJ[\\004\\375\\331g\\237\\327u\\003\\214\\301\\307\\020Yi\\263\\017\\326\\304]\\0342\\260D\\263\\0002P\\004\\006\\004PZ\\335\\237\\247\\023k\\363,\\365!<xp\\022c\\030\\014\\006u\\275\\365.lV\\033\\001h\\305\\005\\346~\\367\\254\\365\\033\\311\\334[GF\\254\\206U^\\226\\200j:;\\250\\233\\366\\301\\331\\003\\223\\330$M\\2109/JQAeya\\223\\224\\221\\001\\364\\240\\032\\345\\305 \\313\\213,/\\362\\274\\314\\213r<\\231\\246Y\\016\\200\\325`X\\226\\345`00\\306\\214F#k\\215\\326JLk\\305\\211&M\\323\\343\\343c\\261-\\355\\272n<\\036\\213\\305LQ\\024\\242\\300ED\\375\\237\\376\\301oN\\306\\325\\243\\223\\243w\\036\\235\\235\\235\\034We\\021\\202k7\\353\\030=0\\213(\\010\\220\\254V\\251\\325Yf\\233\\266)\\007\\311z\\325\\234\\235\\036\\376\\215?\\370\\275\\257\\276\\370\\374W\\177\\371\\313G\\017\\317>\\375\\345/\\006\\203\\342\\350hN\\034\\2122\\035\\217\\252\\361\\250\\034OF\\007\\223\\311h<\\034\\217\\206gggM]\\037\\036N\\225\\326\\213\\305\\002Q)\\255\\224Bm,1\\307\\030#\\260R\\212CT\\306D\\357\\001QN\\0361F\\245\\265\\332o\\214\\2141(\\335\\032@\\033\\235$)(\\264\\326\\310,%\\333\\312\\355v[\\024e\\214\\234\\330t<\\236>}\\372\\276B\\373\\362\\305\\253\\361db\\263\\301\\355r\\355:\\257\\000c\\010\\256\\251\\251\\357\\313\\324>}\\347\\361\\250*S\\253\\221\\243BH\\254\\326Z+Tm\\335\\022\\261\\006P\\210\\242\\324VL\\242\\033\\023\\365\\203\\2543\\245o)\\300\\350{\\026N\\276X}\\011 K\\244\\2155\\306(e@+D\\255\\224&\\206\\310l\\32242\\225e5\\232\\316\\262|\\220\\345e^\\016\\215\\315\\206\\303\\3517\\337<\\377\\343?\\371\\223O>\\371\\331\\257>\\373|\\271Z=<;\\015\\304Z\\233\\340\\343\\305\\305U\\010>I\\262\\355\\266\\276?\\037\\357({\012Q\\314*\\211\\010\\366~\\321\\002=i\\3756V\\354\\275+\\007\\005\\000L\\247\\223\\365z\\315@\\213\\305\\322w>\\2047a\\201\\367M}O+x\\323\\351\\205W h\\327\\275v\\320\\030\\2534:\\347\\007\\2032\\317s\\201o\\245\\277*\\215EQv}\\350C<>:\\356{\\007\\210J\\253\\345b\\231\\347\\371j\\265B\\304\\341p(\\033\\022iOD$\\241*\\243\\321H2\\312\\004\\2034\\306\\334\\237)\\017\\016\\016noo\\005\\214$\042\\203\\241C\\340\\350\\202\\2164*\\323\\341\\273\\017\\037\\236=\\350ZG\\200\\275w\\233\\365\\366fqw\\273\\270\\333l6.\\004&\\030\\217\\322\\246\\353'S\\373\\345W\\237\\236\\277x\\306\\020\\246\\323\\351\\317\\177\\376\\263\\341\\240\\330nV\\326\\360\\240*\\362<],n\\323\\024\\263<3*\\315\\213\\201s!0\\035\\037\\036u\\275\\177\\376\\372b\\271\\332\\334,\\226m\\347z\\347\\211\\002(T\\032\\024)\\024\\020B\\353h\\215\\326\\032C\\224Mm\\2141\\265v\\337\\203\\020\\367\\332-mL\\3277\\332Zk\\323\\303\\303C\\241\\222\\316\\347sc\\314\\353\\327\\027Y\\226v]\\267X\\254\\024&\\247\\247g\\037\\177\\374k>\\320\\345\\335\\262Y\\327i\\222\\364}\\037\\2726\\366\\216!\\234\\036=<\\232\\214\\2151H12\\001pt@\\214>D\\013\\026\\000U\\224*\\225\\020aBD\\263\\203\\257\\005\\230\\014\\201\\211\\011\\211(\\265\\032\\2008@\\004\\216r,c\\205\\000\\316yD$\\306\\300\\204\\240\\225\\321\\210\\032\\021\\352\\266\\3316\\235\\217\\230\\226\\303H\\230\\025C\\327\\323\\371\\305\\315\\237\\375\\331\\377ussS7[\\255\\261\\252*\\000\\256\\273vq\\267\\242\\250oa\\335v}\\244\\030b\\027\\211#\\261\\363\\001P\\261X\\352\\003\042(\\201|\\357\\263e\\377\\225\\323!\\357\\375\\207\\312,\\337,W\\017\\036\\234\\204\\020F\\343\\312\\030\\223$Y\\337Gf'\\203\\207@\\312\\367\\274s\\334\\0170;E\\210\\321Zk@4\\306n6\\333\\311d\\254\\265\\236\\317\\347\\210(\\201zJ)#\\217xf\\000\\225dy^\\345!R1\\250:\\347E\\223\\262\\340\\333\\341x|\\374\\340$\\204`\\224\\356\\272\\216\\004\\000\\267v8\\030\\310\\317\\222dx\\361Z\\221c\\361p8\\314\\363\\374\\352\\352j\\261XHV\\316\\365\\365u\\010\\301\\264}\\307;\\257\\261\\250\\320\\240\\261\\0269\\232\\340}\\034f\\311d8?;;\\014!\\204\\030\\0215\\032t\\3165];\\031\\2157\\313\\325\\311\\311\\251\\353\\372\\345\\342\\366\\243\\217>\\332\\256\\326\\314\\261(s\\357\\373\\246\\336hm'\\223\\321fS3id5\\233\\315\\356n\\027\\243\\351\\354\\177\\371\\007\\377\\353\\266\\353>\\374\\336\\307\\316wD\\301\\271\\210\\314H\\310\\310\\006\\011Ak\\213J\\001p\\244H\\221\\242A\\205\\006\\215\\321Z\\241\\370`\\313a\\21392+\\305\\021\\015f\\271I\\215\\232\\317F\\253\\345\042\\304\\320\\325\\253\\350\\373\\242(\\226\\253m\\277\\355\\301&\\327\\213\\005)c\\225}}ya\\223\\0048\\270>\\324\\213[\\004\\250\\212\\002\\210NO\\216\\203\\353\\220\\255\\266V#\\302\\256\\354\\330\\032M\042\\262\\014\\221$6\\033\\000\\020\\025\\003\\211\\353\\026\\357x\\335\\006T\\324\\254\\021Cp\\314\\034$\\021\\036\\025(\\203J\\261\\322\\256\\353\\210!rTh\\006\\243\\352\\360\\360p2;H\\362d\\265Y:\\347\\266u\\017\\214\\313\\365v\\270\\336\\\\^^\\376\\305\\217\\177\042\\036\\027\\250\\260\\255k\\316\\323$1}\\347\\213\\242\\330\\324[\042@\\304<+\\356uJ\\314\\3620\\005zc\\232\\364v\\005\\253]\\036\\312[\\036\\017\\002&\\313R\\342\\331\\263gGGG\\336\\273AQ\\270\\326\\353\\006C\\220\\026\\037\\357\\261-f\\226s/CdRJ\\2031F[\\325\\007_\\345\\203\\262,\\264V\\022\\034|}}\\015\\000\\262B\\321\\332\\022\\005\\211\\025&\\2424\\311\\003\\203\\002|\\376\\37493\\037\\315\\347\\333\\355v4\\032)\\245\\226w\\013\\351\\372\\207\\007\\007\\242\\316\\332n\\267EQp\\214&M\\305v\\303\\367\\275\\374\\302R\\312\\307\\307\\307\\262Wi\\333\\326\\3070\\036\\2156\\365V\\377\\306\\257\\277\\267\\252\\267IQ\\310\\256\\264\\2517\\332p\\242!\\261\\220gF\\003\\271\\276U\\034\\220)\\321\\252H\\222\\024y\\220$\\251\\302\042O8\\370\\363\\213W\\243\\321(\\315\\323\\273\\325j4\\231\\204@>\\220\\353\\343\\355\\365\\312\\365\\374\\321\\373\\037W\\325\\030\\300l\\267\\355h4i\\352\\346\\341\\243GV\\353\\353\\253\\213\\355f\\245\\201\\274\\357\\255\\241<U\\006B\\221@\\232h\\255u\\357\\273\\324\\352\\276\\013\\323\\311\\220\\242\\367}\\000\\2161\\004k5\\000{\\027Pq\\222X\\2554*\\000\\003I\\202\\301\\325\\212\\034\\370\\246o\\326]S\\217F\\223\\273\\333\\225#L\\207\\343\\343\\207O&\\363cO|\\273\\270\\355\\373Z\\263o67\\301\\327F3S\\354|\\373\\364\\351\\273E\\236eE\\016J1\\250\\210\\342 \\207D\\034\\231\\030(\\204\\336\\371.\\220\\003\\020Y:D\042Tz\\227\\324\\2677\\024\\004b\\346\\210bS\\016\\300\\332\\004\\255;\\206.rG\\334G\\354#\\351,\\377\\255\\337\\371\\341\\323\\217\\276g\\212\\362\\344\\321\\343\\351\\361\\321p4~\\370\\370\\311'\\277\\370y\\232\\347\\207GG\\257_\\277\\374\\351O\\177R\\327\\353\\266m\\200\042\\305`\\254.\\212\\242\\252\\206\\032\\300\\005\042\\006O!\\022\\005\\212\\332\\032\\037<QTZ\\3067\\221\\216\\213!\\347.t\\005\\031\\031Yi\\031yd\\200\\216\\242\\307\\324Z+\\205\\307\\307\\307\\336\\273\\311xl\\265\\025\\307\\202\\020\\305W\\214Q\\2016\012\\025\\370\\340lb\\031\\010\\025(\\243\\224RIj\\265\\326!\\372\\274L{\\327\\033\\253\\313A\\331\\273.I\\355\\240\\252\\224R\\014*\\313\\213\\246i\\213b\\340}\\264I\\026\\002M\\247\\263zS\\017\\253\\252\\310\\363\\262(\\\\\\327S\\214E\\236\\033\\255o\\256.\\207Ue\\264\\356\\333n\\265\\\\\\026yn\\215a\\342\\266i\\231x\\275Z\\017\\253\\241\\353\\272\\030\\243V\\252k[cm\\3234e5 \\346\\3369e\\315f\\275\\316\\007\\245)\\252\\011\\350\\244m]\\000}\\273\\\\\\025iR\\327ujt\\327\\266\\306\\030\\004\\215Z\\347Y\\031\\030\\272\\266\\367mc\\025&I\\242\\360\\377#\\354\\315\\232$;\\223+1\\367o\\271kl\\271gV\\326\\002\\024\012h4\\032\\335\\034J\\242\\214c\\032\\343P\\303\\007iL\\177@&\\375LI/\\032\\243\\031_zF#i\\310i\\016\\033\\354fcGUV.\\261\\307]\\277\\305]\\017~#*\\013h\\232\\302\\312\\322\\252\\242\042#\042#\\375\\372\\347~\\374\\3709\\340}\\310\\307\\243\\217?\\376\\010\\225\\2111~\\376\\313_fY\\366\\315W\\337\\376\\343\\357~\\373\\361\\007\\257\\214\\315\\2736~\\371\\325\\017E\\231\\207\\020\\332\\256s}\\250\\352\\255R\\352\\372\\372\\372\\323O?}{\\1773\\036\\217M\\242'\\223q\\232\\246m[\\273\\030|\\240\\331\\311\\2237on\\036\\036\\026\\277\\375\\355o\\253\\252\\022\\376s\\226\\350\\020\\342\\305\\371I\\232\\246\\333M\\345\\275\\227\\226\\205\\200\\327\\365z\\\\\\216G\\247\\263qj\\036no\\015\\352\\262\\310\\272\\246\\372\\354\\263\\317\\262\\311\\251\\311\\307\\253]\\363\\346\\315\\233\\371\\335=S(\\363\\264\\333-bh\\024\\032\\331[H\\255)\\212,\\311\\023\\022\\247\\352\\203\\373:\\211\\256(\\003\\020@\\220e\\002\\200w\\363\\337!\\317\\211K\\325@\\326\\211\\314l\\215\\330\\013A\\027\\275\\217*\\200\\366\\001B\\014J\\231?\\377\\227\\377\012\\224RYV\\036\\037O\\223\\013T\\252\\356[\\347=h\\025\\031\\026\\253\\325\\303b1\\237\\317w\\325\\306Z\\353]\\004dT\\254\\224\\336\\203\\307\\217W'\\205M\\373n\\003m\\200&d!\\006\\031a\\220 \\203\\001e{omG\\272\\272\\335n\\367\\374\\371\\323\\207\\207\\207\\323\\263\\223\\327\\257_\\237\\237\\237\\257V+\\245\\321X]\\232\\242i\\232\\375\\232S\\232\\240\\025\\321-\\357}\\226\\225Ro\\030c\042$i\\232f\\034\\362\042\\315\\362D\\350\\034\\322\\232\\217F\\223\\252\\252\\306\\343q\\226eu\\335$IZ\\226\\243\\335\\256\\232\\216'\\274g\\035\\221\\017\\000\\3203l\\267\\333\\243\\243\\243\\276\\357\\243\\017\\323\\351TPZ\\031\\254\\2446\\231M\\246DTWU\\323\\324eY\\216'\\223\\355v\\313\\210]\\327-\\347\\013P\\330\\266\\355\\361\\250\\334l6\\252\\256M\\357\\224\\302\\334\\232D\\241\\017\\001\\202R\\301#E\\232N\\217E:\\204\\373\\020<\\241\\261\\336GDLuR7]\\222\\245\\250\\355f\\263c\\205\\332\\330\\217\\177\\366I\\327u\\277\\376\\365\\177\\250w\\315lv\\374\\327\\177\\375\\327\\257^\\275z\\361\\354E\\333\\266\\363y\\235\\025i\\244\\020:\\027\\231\\265\\326\\300\\034B\\370\\253\\277\\372+\\347\\334\\335\\303\\255s}\\037<\\241*\\313\\2616\\266n\\353\\027\\317\\237%\\306\\316&\\343o\\277\\375v\\273\\335>}\\372Tk\\373\\374\\371\\363\042\\315b\\214!P\\226er\\272\\365}\\233\\224\\351\\333\\2337\\365fy~|\\324<{Q\\226\\343\\242\\230-w}\\325C\\345x\\376\\346v\\271\\331\\366m[\\246\\211k\\335n\\271\\011\\241\\225\\302\\226\\210\\214\\262E\\236\\227e\\231$\\011\\022\042\\014a\\273\\2574\\305\\202\\212\\244\\345\\227l'\\005\\274\\320\\266h?OV\\007+_\042\\037\\200\\025Fb\\037\\330\\001\\005E\\014\\206\\020\\376\\342_\\377E\\360\\324u\\356\\370\\364\\014Aw\\255\\033OGi6\\351\\255\\251\\266;\\031\\202\\206>\\364}oM\\252P1w\\314\\214\\240\\265\\262\012\\015\\260\\002\\331\\353\\344wCl\\305Q\\001\\211\\310\\344\\276`?\\324\\024\\357\\246\\334\\357\\343\\022\\303\\243\\210(\\313\\262\\252\\252NOO\\353\\272\\026\\365\\300\\311d\042B^\\314,E\\002\\357\\327\\245\\225R\042\\037Z\\024\\305\\341*\\262\\211\\2151\\032kx\\257\\247\\010\\0001FD\\\\\\255V\\314<\\231Lnoo_\\274xq{{\\233ey\\327u\\321\\007\\231\\351*\\2456uMDGyZ\\214KD\\024Py\\265Y\\023\\205\\351t\\032C\\270\\275\\275\\231M\\216\\372\\276c&\\255\\225\\3101\\352\\246\012\\301\\031cBt\\210H\\236\\254Q\\344\\235b\\362]k\\266\\233\\336\\030}y~\\341\\035M\\312\\243\\252^\\027EN\\321u\\216\\214I\\322\\244T\\3260\\2636\\306X\\310\\262\\254\\3365\\221`\\263k\\226\\253U\\323w\\247\\347g\\017\\363\\345\\233\\233\\333\\323\\323sD\\224\\005\\340\\377\\371\\177\\375_|\\327\\277\\376\\376\\265\\210\\340\\313\\020\\244i\\232$\\313\\212\\242\\010!\\324m\\363\\353_\\377\\032\\021\\273\\276\\237\\316\\306'gg\\323\\311L()U\\335+\\245.\\317\\316\\333\\266.\\32342%\\306\\236\\234\\234\\354v\\225\\353\\333\\301\\221{5\\257\\2736O\\362\\343\\263\\343\\004\\360\\351\\345E\\361\\374\\351\\345\\371\\331\\333\\267w\\213\\371f\\275\\255wU\\317\\246\\250\\253v\\275\\\\m\\267\\033\\337;&\\027\\373>\\366\\035\\260\\227\\252\\227\\211\\020@\\324O\\340G7:\\214\\025\\342\\241\\372DD\\334k/\\250G\\032b(z\\237\\217\\204\\235zO\\236\\3013;\\006B\\233\\345\\311d4n\\233~4\\232<y\\362\\364\\352\\372\\011#:\012Y\\226m\\267\\353\\262\\034/\\347\\213C@\\310\\353n6\\033\\255\\224\\\\<\\007\\\\b\\230\\322=\\032\\337=\\356\\364\\344\\177\\367\\024\\027\\332w~\\010\\010\\270\\260\\264\\000\\000 \\000IDAT{?\\305C(\\313W)?\\000\\3009g\\023#\\373\\177B\\212PJ5M3\\032\\215d '\\217\\001\\0001\\247\\222\\025\\353$I\\266\\333\\355t:\\335T\\033\\031\\213J\\316>\\350\\352\\206\\340\\236={\\266X,NNND\\254q\\273\\335\\235\\237\\237wM+]\\235\\330\\267\\275\\033@\\356\\327f\\363<W*\\225\\011\\332d6\\255\\353\\252i+\\347#Q\\350{\\357\\\\\\327\\366\\215\\367>\\3132\\327\\367\\347\\347\\347\\017\\313\\305\\244\\034\\255W+\\255T\\014A\\207\\216\\356\\357\\026\\276\\217\\253\\365:M3\\004\\314\\213\\2615\\226\\010\\264\\261!\\004\\233\\244\\221\\030Q\\365\\275\\007\\2557\\253\\015(\\243\\254\\255\\272v\\263\\253\\320\\030\\027\\342\\321\\311I\\236\\217\\306\\223i\\222\\330\\304\\332\\277\\375O\\1777\\031\\215\\265\\322'\\247'\\014\\260\\336m\\234\\367\\243\\361\\270(\\212\\365z\\275\\255vJ\\251\\276w\\223\\351\\354\\342\\342\\362\\351\\323\\247'\\247gJif\\360>\\244iR\\226\\305b>\\277~r\\231\\331\\244n\\352\\311\\250\\\\\\314\\037\\2624C\\340\\340]\\3276\\233\\325\\352\\341\\341\\276\\336\\356(\\206\\246\\336\\214\\262l\\263^\\177\\363\\315\\267_\\177\\365m\\3358V6\\311'\\27364u\\333\\264}p\\336\\367u\\267\\333Qh\\025\\022\\003\\001\\262V\\206\\210\\264\\302\\262,\\256\\316/\\264RC\\275\\301{K\\277\\275P\\306\\2607;Hu)D\\324\\250q\\257\\274-a$\\240\\257\\310\\230\\023\\252\\276\\367\\275\\017\\204\\350#\\004\\340\\321dz~q\\271\\336\\354./\\257l\\222P\\244\\331\\321\\221M\\223\\365z\\335u\\355?\\374\\3467o_\\337,\\346\\013\\212$\\362\\354J\\031\\361\\347\\006\\0304\\361\\215I\\324P\\262#1q$\\240\\241\\376`fdF\\200\\030\\007\\211\\222=*\\307B\\023\\334\\247\\347w\\225\\011\\014\\316\\310\\250\\2242F3\\263\\322J8\\022b\\023\\245\\224:\\220gF\\243\\221\\320\\331\\3224\\025\\006\\375\\201\\335\\3264\\315\\331\\331Y\\335\\324\\326$Zi\\255\\214\\364\\202\\3622\\032u\\3334\\247'\\247m\\323j\\245\\252\\335n6\\235\\256\\226K\\037\\343\\311\\351\\251ML\\244\\350\\203\\237/\\346]\\333\\216\\307\\343\\252\\256{\\347@1\\003\\007\\357\\253\\252\\032\\244\\273\\211\\323<\\321Z\\327\\315\\3169\\227\\027iY\\026\\336\\3651x\\021\\212i\\352J!l\\326k`\\362\\2567\\037\\275\\374\\244\\357\\273\\020(M\\312\\340y2\\235:\\337j\\245#\\240\\002De\\363r\\242\\332\\246\\363\\356\\346\\366.\\204\\360\\362\\243\\237-\\026+\\025\\341\\311\\365\\213\\247/>Z\\256Won~\\267X\\256\\377\\333\\377\\346\\317\\276\\372\\352\\253\\311h\\364\\333\\267o\\237=yv\\373p\\237\\032\\273\\336\\256M\\232\\310\\376\\214\\250E]?{\\332\\367\\375\\357~\\367\\273\\227\\257>:;;\\313\\363\\\\)\\263\\\\\\256\\267\\333m\\232\\344\\345(\\377\\346\\313o\\332\\266>>>\\375.\\370\\276\\367\\243\\274\\230\\317\\347\\326Z\\216!M\\022\\005\\251\\002.\\262\\\\\\364H\\203\\353\\251\\357W\\363\\207\\207\\207\\205I\\262\\331\\321i6:jz\\352\\003\\317\\027\\253\\273\\207\\345z\\275Fb\\205l\\015D/\\252.?\\236\\234\\275\\367k\\006P\\217\\340.\\0048\\030^HjF\\334\\003\\273\\007u\\234GY\\223PA\\204\\020\\331\\207\\310\\250\042\\252=\\3631\\237\\315JfN\\3234+\\213\\327\\257_\\377\\247\\337\\374\\335\\357\\177\\377\\273\\020B\\242\\025R\\024\\251\\322\\001\\213\\324:M\\323\\276\\355\\360\\221T\\203\\260\\306\\177\\202\\015\\003\\377\\010\\317x/\\015\\343\\001r~|?\042\\017\\211y/&/\\351_\\370<\\242\042 \\252\\255\\0000\\036\\217%\\202\\205\\314X\\226\\245\\024!\\362\\263\\014\\021\\214(\\254|\\341\\307\\015\\313#\\371\\010\\021\\337\\274y#D\042\\241w\\216F\\243@\\324\\367\\375r\\271`f\\021U\\362\\275\\253e\\347\\352\\350(I\\315j\\265R\\014eYZk\\333\\2666Z7M\\223\\246i\\222$i\\212D$\012\\274\\242[p\\177\\177\\217\\210\\313\\345\\322h\\335\\32453\\353_\\374\\3543\\037zT\\220\\346I\\236gY\\236\\242Ry\\221u\\275\\337\\355\\252\\257\\276\\372\\346\\315\\333\\233o\\276\\371\\256\\252\\233\\336\\271\\311\\344\\310&y6*\\2251\\353\\335.\\022\\025\\243\\321\\313\\217^\\275\\372\\370\\343\\020B\\226fV\\333\\253\\313+\\255\\364l6\\333U\\325\\223\\247\\327i\\232~\\377\\372{\\006\\276\\270\\274,G\\243\\252\\252&\\223\\311\\263\\027\\317\\327\\353\\2651\\246\\367\\261\\353\\335n[\\255V\\353\\266\\355\\272\\266\\363!fE\\336v\\356~\\376\\260\\\\nn\\357\\356\\023\\233X\\233|\\363\\355\\267\\2220\\235\\367\\316{bB\\300\\304\\232<\\265D\\221\\030\\306\\263\\343>\\300\\246\\356V\\333f\\271i\\356\\227+\\037\0420S\\364}S\\305\\330+ \\203\\030a/\\316\\302d\\264I\\323\\364\\374\\354\\\\k-\\3453\\002\\203\\202\\375\\232\\226hS\\014b\\002\012Q\\241V\\210\\000x8\\337\\017\\001-\\304\\022\042v>x\\346\\010\\340\\001\\215\\315\\362\\361x4\\236)\\223T\\333J)\\225\\246\\371\\037\\276\\372\\352\\337\\375\\273\\377\\363\\313\\257\\277\\222\\345\\021\\303\\303\\326\\225H&\\305@\\336\\271\\272\\252\\255M\\245\\365\\322\\332\\010\\276\\216\\250\\264V R\\243\042\\225\\004\\260w<\\200a\\211\\035\\024\\362~\\351\\371\\321\\376\\304\\201\\366)\\217<\\\\\\212\042\\354\\375\\354\\371P\\033TUEDR`\\210\\345\\244\\224\\305M\\323\\310\\342\\226pA\\363<\\337\\355veY\\206\\020&\\323\\011\042\012\\235Z\\270\\215\\322\\027.\\026\\363\\361xt|t\\222$\\311\\317\\177\\376\\363\\020B\\3234\\336\\373\\246m\\344\\371\\3234\\025\\221\\363\\321\\270H\\263d\\263Y=<\\334Kb\\326VUu\\025)&\\306z\\347\\226\\3139\\000\\313lm\\271\\\\4M\\035c\\340\\030)\\206\\315z\\255\\025\\312!\\320\\265m\\360^\\377\\367\\177\\361\\337\\331\\004\\257\\257\\257PqY\\244wwo\\333\\266\\256\\333z2\\235\\234\\034\\237\\236\\234\\236~\\364\\321\\307\\243\\361t<\\236\\022AQ\\216W\\333\\335vW\\371\\020\\255M\\224\\261\\337~\\373\\335f\\263m\\232\\266\\314Kq\\006\\310\\323\\354\\315\\3537?\\373\\364\\323,\\313\\2224\\373\\365\\277\\3775\042\\274|\\371\\022\\021ooo7\\233\\215\\266f\\261X\\010\\357l\\273\\223\\223\\005E\\347\\257\\252jF\\014\\221\\262<\\277\\275\\273G@c\\314\\256\\252B\\214\\223\\351\\314\\207\\260\\253\\252H\\224\\247\\271R\\350} \012\\210\042a\\257}\\204\\233\\207\\2452\\005$\\371\\335b\\271\\253\\353\\336\\371\\266\\255}\\263cv\\032\\031!\\0220*u\\310i\012u\\232\\246\\247'\\247J)\\255\\366\\223^\\201\\011\\366\\2226\012qP;E\\024\\300\\201y\\360\\0258\\024\\257{\\335y\\027\042\\365\\336\\2032\\0210\\002$y1=:\\311\\2132DZ-W\\000\\360\\375\\367?\\374\\343\\027_\\370\\350\\223$i\\273\\226(B\\214\\262\\034\\024\\367R\\365\\202!\\310i 1th\\354\\264V\042ZsX|9\\324\\312\\362\\3650\\263<\\024\\025\\303\\265\\247\\036g\\356\\341l\\231\\315fm\\333Xk\\273\\256\\025\\372\\274\\364\\205}\\337'IR\\327\\365l6#\\242$I6\\233\\015\\357{!\\361!^,\\026\\227\\227\\227m\\333\\346E.\\374\012\\347\\334t:\\025\\252\\220\\0342I\\222l7\\273$I\\376\\376\\357\\377\\236\\210\\204+\\222f\\351f\\263\\011!H@k\\255\\213\042_,\\026\\263\\351t4\\032I\\237\\232$V\\270\\037\\233\\325\\372h6\\221KHTze9\\005\\000\\326\\253\\225\\264\\2551Ffh\\333V\\300u\\375\\247\\377\\342ckqW\\255\\235k\\267\\273\\365d:\\006\\205G\\307\\307\\316\\373\\315f}\\377\\3600\\237/\\262\\274L\\323\\334{^,V\\236\\310\\0231\\342b\\265Z\\2577\\327\\327O/..\\215\\321\\321\\207<+\\326\\253\\365\\351\\371\\371\\027_\\374v\\275Yw]\\367\\342\\305\\213\\030\\351\\305\\207\\037D\\342\\345je\\023S\\216F\\203\\371\\000\\023(,\\362\\022\\000\\353\\272\\025\\370\\253\\353]^\\216\\210a\\265\\336\\344E\\231g\\27166\\317\\013\\037\042\\000&I\012\\200i\\226+\\255m\\222\\214\\306\\323\\345r\\341}O\\3106-\\002+\\235\\226M\\340\\373\\305\\252\\351}\\327\\371\\266ob\\327\\002y\\241\\224\\310oRv/\\200A\\030*E\\232\\235\\237\\235\\246\\211\\325 \\373D\\262\\215-rr\\204z\\300s\\201`\\330\\203\\000\\210\\004r\012\\037B\012\\007\\245n\\327\\365\\256\\357\\2038iFP\\343\\351\\364\\344\\354\\3349\\177{wo\\215\\335n\\253\\355z\\023b\\0101D\042\\245\\021\\0314\\213\\213\012\\003s\\210\\217in\\357\\271\\215H\\21033\\213\\214\\264\\274\\275a\\262\\015L$;20\\224KC\\247E{\\203/\\032\\030\\223\\270\\177J\\224\\212\\231\\231\\212\\242\\260\\326\\034\\037\\037\\357v;\\241L\\310\\340-\\016Zd <\\341\\227/_\\212\\266\\2134di\\232\\036\\035\\035eY\\3264\\235B\\335\\265\\375t:\\273y\\363v:\\231E\012\\022g\\307\\307\\307J\\341\\355\\335\\333'\\327WG\\307\\263\\311t\\334um\\214Ak5\\032\\225!\\370<\\317\\372\\276\\013\\336#\\000Q\\360\\336-\\026\\363\\213\\213\\363fW\\265u\\263^\\256\\254\\265\\313\\345B\\354(\\304\\030K)\\214\\221\\234si\\222\\010z\\213\\210u\\335\\210\\352)3\\353W\\037\\234)\\003e\\231-W\\363\\357\\276\\373\\346\\342\\362\\354\\364\\364t\\275^\\275y}3\\032\\217O\\216N\\362\\2744&\\001@\\212\\300J\\235\\236\\235\\205H]\\337^^^>y\\362$\\317\\363\\242(b$k\\364?\\375\\323?\\011\\347\\372\\351\\363\\247V\\23377ov\\325\\216A5uM\\304\\200ps\\363\\266\\252v\\322\\350\\010U#\\006\\016! \\252\\242(\\024\\232]Uow\\225MR\\212XUU\\323v\\306&YQ\\004\\242$\\315\\312\\361\\270,\\312\\256\\353\\275wJ\\351H4\\231L\\306\\343\\274\\353\\373\\266\\217&+\\213\\311i\\000=_n\\346\\213\\205\\017\\336\\273\\036|\\013\\020\\304\\252U\\016iF\\341\\300\\262RJ\\021\\026Eq~v\\226$\\011\\320^\\007\\014`\\320T\\026\\370\\202\\366\\206\\002\\210Ji\\200C?\\366.\\021\\3561\012\\027\042\\021c\\333\\367:\\315f\\307'6\\317\\026\\313\\365\\355\\335}\\327;\\255\\264s\\336;\\037\\243\\023\\341}DT\\310\\024\\342\\241\\275\\243}4\\003\\310\\022\\357;i\\262C\\205\\014\\3576\\330\\017\\265\\363O\\025\\317\\336W\\350\\223o|WI3\\000L&\\223$I\\214\\321J)@\\020[\\211<\\317\\267\\333mUU\\022\\273\\342\\255\\315\\314\\302\\236\\023\\316\\243\\324\\320\\202\\315\\305\\030C\\214\042- H\\\\\\214Q\\251\\301\\301[\\254'\\344\\354\\225\\025$Q\\322\\020\\017\\006)\\3427\\233\\215\\264\\323b\\036'\\365qS\\327!\\004c\\314h\\\\\\304\\340\\017fYr\\2068\\347\\373\\276\\227\\332Z,\\316b$AZ\\210H\\377\\331\\177\\365j\\267]o\\326K\\205hS\\323\\265\\355j\\265*\\212rT\\216\\333\\266\\275{x\\250\\333\\326\\032\\253\\2255\\312\\024y\\336\\272~2\\033\\313O\\3254\\315j\\265B\\342\\373\\333;\\357C\\337\\273\\373\\207\\373\\365z}qq\\231f\\371f\\273\\373\\317\\277\\371{TF4\\330\\362\\262\\214\\024\\263\\274\\350}\\177\\330\\246\\006P!\\004\\357\\003\\021\\325us{\\367\\360\\352\\325'\\014\\330;W\\024\\345\\361\\361\\2111\\266n\\332\\371|1\\035O\\373\\3365]\\363\\260\\2303\\240\\261\\311\\335\\303C\\333V]\\333,\\227\\253M\\323y\\320\\333\\306\\277\\271\\273\\333\\354*klU\\357\\300u\\020\\334\\273h\\226_4?\\002\\332\\230\\246\\323\\311\\331\\351\\231\\254r\\003\012b\\3000\\004\\277\\254\\034\\341>\\236\\207\\246\\020\\2053\\261\\217{\\271I@\\373\\020u\\222\\326]g\\2224\\311\\262]\\323\\334\\274\\275[\\2577\\243r\\204\\200!x\\016!\\262\\300\\021rNP\\364a\\220\\210F\\020=;Q\\251\\2134\\334)\\347\\31207!I\\3474p\\017\\031\\006\\205h\\020o\\226\\341\\235\\302\\300\\351`@\\336\\333\\030?^\\276z\\267\\372j\\214FDb:\\320$\\304qO\\226\\246\\204\\006\\004\\000\\322\\264\\035\\004=$/\\312\\2541KS\\212\\321\\032\\263Z.\\231\\250\\256\\252\042/\\020\\360\\370h\\026\\274\\177\\270\\273/\\362\\374xv\\3245m\\226\\244\\213\\345R\\340\\201\\266m\\275s\\326\\250\\276\\357\\2124-\\213<\\3172\\243t\\010\\275\\314;\\021Xk\\345z7\\350\\002\\2068\\354F\\020\\211Oi\\327\\367>x\\24152+@\\025B\\254\\233V\\377\\374\\223+\\357\\372\\272nz\\327\\037\\315\\216\\216\\216\\217\\021U\\232fM\\323^_?-\\212\\342\\376\\376\\241\\332VY\\226{\\347\\276\\377\\341\\207>\\364o\\336\\336\\354v\\273\\017?\\374\\360\\331\\263gb\\222.\\033\042/^\\274\\270\\274\\274\\370\\362\\313/\\317\\317\\317\\277\\377\\376{\\255\\3657_\\377\\260^oNNN7\\233m\\265\\253\\264\\321eY\\256V\\353\\262,\\000\\300\\030\\223\\246\\231R*FJ\\222d<\\232L\\2463\\245u\\333u\\273\\315\\316y\\3275m\\265\\333)TE\\221\\335\\337?\\240\\342I9\\322F!\\001S@\\300\\304j`\\002\\255\\363rr~\\365,\\315G\\353M\\275\\\\\\255V\\253%x\\007\\241\\003\\016\\3004\\330r?\\036\\264\\001\\312\\036\\373\\351\\351\\351\\361\\3211\\014\\353\\253\\260O\\226CN\\223\\251!\\354\\227\\354\\324`l\\363h\\331\\356Q\\206v\\256\\367!\\372H.\\2044+:\\347V\\333m\\323\\366\\0008\\233\\035\\355\\025\\365\\305_\\002\\230#s\\344\\030\\310\\373\\303\\340c\\217\042\\277{\\346\\375\\011px\\275hD\\362\\370\\275\\014\\375.\\243\\037\\226\\263\\017I]\\241\\376Q@\\037\\026]\\2151Y\\226*\\245df!\\311X\\212\012!\\257\\015\\3745c\\246\\323\\351v\\273\\225En\\000\\220\\325,qR[\\257\\327\\022\\356\\314,\\022\\321{\\366\\237_.\\227GGGu]\\213@LUU\012\\261\\351Z\\332k\\372\\003p\\214\\261\\336UM\\323\\204\\020\\272\\256k\\333\\306{\\257PIPy\\337+\\245\042\\305\\340\\205O$\\256Y\\000\\373B\\310\\332\\204\\001b\\240\\310\\024)\\022\\223\\231\\216\\217]?\\377\\331'/f\\307\\307m\\333\\006Oe\\211]\\353Lb\\277\\371\\356\\333\\246\\252\\213\\242\\230\\224\\243\\256o\\226\\363E\\3277\\026\\355tT\\002\\300?\\375\\343\\027EQ\\\\\\234\\237\\317\\246c\\255gi6\\014\\220>\\377\\374W\\255\\363\\323\\343\\223\\277\\371\\233\\277I\\363\\354\\371\\263\\027\\037\\177\\362s\\242`\\023\\303\\354m\\242\\233\\256\\231\\316\\216\\317\\316N\\274\\367\\253\\325\\346\\356\\315\\315\\315\\353\\267u]\\033\\235\\244i\\312\\010\\343\\331\\324\\240\\321\\211\\326I\\232%\\011G\\377\\3600\\007P\\344\\255w\\335l2\\352\\232^)\\270\\272\\2345\\273\\355\\333\\2337\\027\\327\\327\\263\\223+\\235\\215\\376\\360\\335\\353\\325bA!\\216\\362\\254\\3324\\242p\\254\\025 @<dS!\\332\\000\\000\\200\\326:\\3132\\245\\000)\\002h\\224\\314\\300\\274w#\\006F\\015B\\230\\227\\241\\370P\\006\\274g\\300\\365\\376\\244\\203\\267\\253\\265#\\032M\\217\\231\\031\\031\\222$\\221\\241\\200\\002-\\234N%\\015\\234@e\\034\\231\\231\\242'd\\243\\021A\\343\\340\\365\\306\042@CC\\223G\\303\\246\\310>\\036\\0056\\227\\027\\335\\027*\\002d\\010O\\364\\240=0\\240\\034{\\244\\221\\001\\006\\201\\036\\201\\333\\004\\323HR+\\240/\\000,\\227Ki\\362\\312\\262\\224RX\\222\\267\\344o\\000P{\\335\\014II\\247'g\\316\\271HAk-\\326\\020\\342\\177\\245\\024\\010G\\031\\000\\232\\246\\332l6WWWUUY\\245\\307\\305\\250i\\032\\244\\270X,\\212\\242\\240\\350\\255\\265\\273\\355\\272,\\313\042\\313\\231\\271o;\\357}9\\312\\2451\\3408\\030u\012;M\\362\\211\\261\\251\\322\\332\\007\\352\\203GB\\002@T&\\311\\314n\\323=}\\362\\374\\354\\364\\342\\253o\\276\\276{\\270\\317\\363r4\\231x\\037\\312\\321\\250(\\312&/\\272\\256\\213\\321+E\\323i9\\236\\026\\233\\252\\276\\271\\271!\\242\\213\\363\\363\\313\\213\\2134M\\357\\356\\356\\020Q\\233d\\275^\\213\\346\\315\\365\\363g_|\\361\\00537}\\367\\346\\315\\333\\246\\371\\365\\305\\305\\331\\313\\217^\\204\\340\\254\\327\\326&\\333\\355v>\\277\\317\\262l\\263\\331\\335\\335\\335\\266m\\273\\335n\\333\\306\\345y\\346\\27577\012A\\237\\235\\237\\\\__\\217\\312\\274,\\313Qf\\345\\027Sm\\326\\024\\304\\306KG\\337\\355\\266\\233\\253\\253+\\255\\354\\017?\\274\\216*\\335l[\\243tf\\364r\\276\\264\\242\\304 \\026:\\014\\007+m\\255u\\014\\203\\341\\222\\340\\011 \\226E?\\211Q\\220\\222\\233dK\\354\\275\\025\\350}\\342<,)\\0157y\\230(\\034\\213\\225\\201\\342H\\301\\031\\245\\243\\213\\264\\337\\350f\\221\\017\\246\\000D\\010\\003\\014,\\357\\366G\\371\\365'\\030s$R\\262\\302}x\\017\\373w\\373\\343w8\\2747QiU\\357\\336\\241\\264\\206\\262\\341\\002\\220\\034bT\\324\\225&\\223\\311a:HD\\202\\007\\213\\031\\237\\\\\\006\042\\311%O\\342\\234k\\352\\026\\021\\233\\266>h63\\363\\321\\321\\021s\\274\\277\\277/\\212\\242i\\232\\321\\2508>>^,\\026\\262X.\\223H\\331\\244\\222',\\313\\022\\021\\223$\\221\\032:8\\017\\000\\262\\340-\\257\042\\312\\206\\000\\212YtaQ!z\\212\\316\\005\\0000:\\211\\301\\273\\336!\\242iv\\375\\337~\\377_v\\333\\377\\353\\355\\335-#8\\347^\\375\\354\\223\\277\\374\\313\\277\\370\\346\\273o_\\277~\\275]\\257\\317\\317\\317\\257\\257\\256(D\\210:+\\362\\262,?\\370\\340yUU\\256\\355\\352\\355\\256\\342m;,\\373\\365EQ\\354v\\356\\350\\350\\250\\252\\252\\345j\\225f\\031\\203\\3236\\375\\341\\315\\233\\333\\333\\233\\357\\277\\3776RH\\022\\305\\020\\233\\246\\016\\301}\\372\\351\\247J\\231\\020\\302\\321\\321Q\\236\\347\\253\\345&\\313\\262O?y\\225\\2466M\\363\\351t\\354\\234[.\\227\\035pY\\344!\\204\\361x\\234\\245I\\333\\326\\306h\\212a\\273^M\\307\\243\\262\\034\\243Iw=C\\324\\321\\373\\256iC\\333\\223\\353\\0152R\\304=uR\\222\\013\\354\\007f\\202g\\011\\371F\\216N\\342\\260\\257\\221\\361QU\\201\\314J\\355\\025\042\\037\\237\\362C\\205@\\357\\302Q\\356\\317\\363\\274\\217Q\\243\\352{\\327u\\035\\037<E\\305G\\213x\\377D{@\\203\\231(\\016\\227\\207\042T\\254\\006\\024OJ\\010z\\364\\242\\010\\262\\263\\310$\\325\\265PF\\367M\\237\\314\\202\\324Ob\\372\\275\\316\\362\\300+\\222\\353Y\\360\\3434M\\017\\343\\025k\\355\\355\\355-\\000\\210\\000\\327v\\273\\225\\305\\266\\273\\273;A\\243\\373\\276\\227\\021\\214Rj\\267\\333\\031m\\255\\265F\\333\\304\\246l\\3119\\267\\337_\\356\\224R\\342\\234\\002\\000\\367\\367\\367\\022\\361]\\333z\\347\\2141F\\353\\351d\\322w]S\\3556\\253u\\226e\\256\\353w\\273\\335\\321\\321\\221\\363\\235\\326:\\364\\216\\231\\011\\3019\\027\\007\\2277\\301|\\024\\002\\366!\042\042\\023\\202B\\002\\216\\300I\\226\\037\\037\\037\\233\\333\\371\\342\\367\\177\\370\\203\\326\\272\\357\\035\\015\\243K\\375\\017\\277\\375\\375\\207\\037\\2768?\\273\\\\\\314\\34777\\257\\277\\372\\362\\353$\\265y\\2329\012\\221\\241D\\330\\355v\\323\\321Xk{{{k\\322D\\226\\321\\177\\363\\233\\337\\\\?}~ww\\367\\257\\376\\365_\\334\\335\\317\\253\\252i[w?\\177\\230\\214\\306D\\364\\360\\260(\\313\\334{t\\256\\213\\321\\037\\035O?\\372\\350\\223\\324&\\017\\017\\017\\223\\311L)\\325\\324\\335d2\\311\\022c\\214i\\252\\272\\251\\352\\030\\343\\250,\\212\\242\\210>tMm\\0246U\\325\\266\\355\\007\\237}\\230\\246\\351\\267\\337~;\\231\\236\\266\\236\\327\\363\\335\\357\\276\\374\\226@\\267\\236\\332\\266\\327\\210\\306\\030\\016\\356P\\020\\363\\020\\326\\004\\254DhF)\\203\\020bd\\327\\365\\202U\\211\\315\\013\\252\\367p\\\\\\030\\344\\253\\337\\303\\021\\220\\211Q)@\\002P\\014aH\\220\\303\\264\0420\\331,\\317\\313\\242\\366\\033\042J\\322\\254\\367\\354\\373\\336h\\305,z\\376\\221E<\\222#3!\\000\\021\\253\\275\\3351\042\\340\\240\\242\\035\\001X1\\007\\006Y\\306U\\254\\030(\\204\\010@\\0324+<(\\243\\261l\\206\\374$C\\003\\000*\\241\\354\\015?\\227\\326h\\036\\351(\\364}\\277\\335n{\\227\\300\\236\\200\\265^\\257\\005\\324\\223J\\332\\030\\023B\\270\\275\\275\\325Z{\\337#\\262\\367\\276\\357\\273$1y>b\\216Y\\232\\264}\\267\\335l\\010\\270\\3143\\027\\274\\353:\\321zU\012\\2141\\316uZO\\244\012\\227K\\250\\353:km\\327uY\\226\\325u\\235\\356\\351\\037rg\\222$\\273j\\203\\210\\276\\353m\\226j%[\\232\\232Q\\261hXq \\004\042\\320\\306\\020\\260\\363\\036\\003Zk_\\274x\\361\\313?\\371\\225\\3364\\233\\000\\274m\\234J\\2546\\266\\023\\207\\005\\027\\254\\315\\312\\321\\230\\031\\247\\323\\331\\233\\267w\\267w\\3634/\\215M\\376\\351\\017_\\206\\020?\\370\\340\\303\\020\\311$z<\\031\\023\\305\\256k\\215\\261i\\232~\\361\\305?\\316\\347\\313\\272n\\353\\252~\\375\\346\\215w1\\317\\213\\246mC\\214\\000\\230f\\205\\353C\\337\\271?\\371\\374O\\237?\\373\\340\\331\\323\\017\\\\\\353O\\317\\316\\273\\256WJG\\362\\326&\\213\\345\\206\\030\\027\\363U\\357\\275w\\375f\\273I\\214\\005\012\\256\\357\\231\\310\\007\\312\\363\\362a\\276\\332\\355Z\\243\\363\\305\\256\\333\\364\\372\\355\\262~X\\327U\\323\\243\\322D\\264\\2516\\250T\\010q8\\316a\\000\\220\\025\\210\\3248\\000*\\024\\361-\\300\\246\\252\\023\\223L\\307S\\221t4V3s\\357\\234\\261\\326Z\\333u=!*\\253\\265\\326\042\\323\\244\\224\\032p_\\021\\033\\227s\\\\xy!\\272\\350\\032\\027\\262\\321\\270\\367\\324\\007b\\324\\275\\2474M\\2551Z\\001E\\0071\\000\\304H1\\304\\300\\302\\223'TJ\\0032\\021!\\2021\012\\201]\\337+5`\\214\\010\\200\\342K\\026ao\\347\\215\\274/F\\030\\016?\\243\\\\\\217\\010\\003T\\302\\302\\2156Z\\355\\377\\211\\342\\230H\\221\\210\\274\\326*M\\023\042\\022jrb\\023&VZ\\031mAk@t\\336\\367\\316\\021\\263\\250\\005jDc\\0240Q\\014F\\003\042\\367}\\333\\266\\265\\353\\272\\336\\265\\2515JC\\3276\\332\\2504\\261MS\\033\\255\\000\\310\\032\\3236\\225\\367\\316\\365\\2355\\272ijy\\207\\210\\300L!\\370\\311dl\\223d\\275\\331di*}\\352n\\267\\003dc\\014*\\3254\\015*\\023\\210\\020\\215IR\\255L\\020\\230]\\351\\266mub{\\357\\225\\321\\263\\243\\331/\\177\\365\\313\\353g\\327i\\226\\232\\247/_\\226e\\271Z,\\357\\357\\357!\\362\\325\\365\\223\\027\\317\\236\\013'\\356\\353\\257\\276\\351\\373~<\\031)\\223\\364>.\\327[\\320*Ms\\357\\375b\\261`\\346\\262(\\362<-\\3132MSD=\\237\\317\\333\\266\\003\\300\\337\\376\\366\\013\\347\\0341\\346y\\336t\\355\\364h\\352{'+\\030\\323\\361\\370\\177\\372\\267\\377c\\222$\\325f\\013\\221\\352\\272\\366\\241\\237\\317\\347\\213\\345\\303|>_-7\\306\\244\\237}\\366\\331\\263gO)\\2702\\317\\336\\276}\\243\\224z\\230\\337\\347i\\332\\366^)}\\377\\260xz\\375\\201I\\022`\\343\\333\\366f\\271^\\327m\\335E\\006\\264\\240P+\\331\\222\\000\\245\\207\\236\\011\\010\\201\\024\\203\\022n>\\020\\202\\006\\216J)\\2101\\306\\270Y\\255_\\003_?y\\002\\003\\365\\221\\265\\326\\221<x\\000\\265\\027,\\304a\\336\\002\\240\\200\\210\\343 \\231\012\\002\\\\\\014\\321\\004J)\\324\\232\\325\\240Q\\267O\\272\\003\\310E\\024\\305=\\205d|-\\336y\\214\\210\\032\\006\\357cbF\\0304\\300\042\\0033\\313\\177\\015\\224\\222wH\\310O\\300g~\\244C\\3678I\\037\\030TRc0\\263\\322\\200\\254e\\275T\\022\\263\\367\\2034\\250R\\212,G`\\255\\337#\\215\\020Q\\353\\272\\020e\\023^\\314Q#\\002P\\014\\332&\\276\\363\\333\\272bfk\\255F\\010\\301\\005\\327[\\253\\245\\247t\\316\\015\\344[D!9\\311|[,\\215\\245k\\224T-\\020!\\021\\311\\\\\\023\\021m\\222u\\275/\\313RY\\343\\234\\353\\\\@D\\006\\010}\\257\\023\\333\\367\\2752\\346\\303\\017?\\274\\276\\276>==e\\001\\026?\\371\\331\\307\\343\\321X\\006\\225\\032\\001\\021\\214\\326!\\204\\257\\277\\376\\352\\253\\257\\277Z\\256\\226\\353\\365r\\275]7m}rr\\374\\374\\371\\363\\331d\\232\\347E\\214\\024\\202\\357\\332\\026\\000\\211\\270,GR\\217\\206\\020\\373\\336\\211\\323\\021\\003v\\235SZ5u\\013\\030\\213\042\\377\\374\\027\\237>\\271:_\\255\\036\\232fw}}\\011\\020\\226\\253y]o\\231B\\226$\\327WW\\223\\331\\364\\315\\353\\233\\252\\332\\275}\\3736M\\354\\333\\233\\233\\357\\277\\377n\\265^\\031\\233hm\\313\\321X\\353\\264\\252\\273M\\325\\020\\352\\233\\267w}\\240\\037\\336>TM\\353\\2343F'\\326\\020\\223w.R\\340\\030q\\200iip\012\\004`\\000\\245eG\\211\\020A1\\023\\304\\340\\272\\256kOO\\216\\265\\026\\032\\007)\\255\\210B\\214Qk\\205Z\\213Y\\0070#1\\210_\\000E\\200\\301.q\\200\\202\\231]\\014>\\306>F\\235$\\000\\350\\005Fb0\\306\\346Y\012\\303\\364\\361@\\023a\\030\\364M\\324\\036\\033\\206G\\177\\206I8\\017~\\203C\\0054\\2447\\305\\207\\307\\277\\203\\234a\\377u\\377\\347\\200a\\277+\\361\\221`o2\\033\\206\\316XV\\023X\\0201\\245T\\357z\\212A~^\\212^! \\203w~\\020e$\\212!\\020\\005\\032\\004\\247]\\360Q.WyB\\211`\\245\\024\\003\\357ac:\\004\\264\\264.2\\202\\021\\354\\357\\340\\267IL2\\311\\324\\306 (1\\035\\001D\\233\\244\\021\\270\\357}\\337;\\271\\374B\\214}\\337\\203\\302\\311dr\\365\\344\\372\\343\\217?\\236\\315f\\210\\030b\\034\\215Ff\\275\\336n\\267\\225\\367=\\022\\033c\\230#\\252\\210*\\366}\\215\\030\\263,\\337n\\327\\204 \\366\\211\\306\\230\\345\\303\\\\.\\364<\\317\\203\\363Z\\353<\\317\\205$>\\231L|\\240\\305ba\\214FT\\275\\363i\\246\\2151/>y\\336\\266\\355\\263\\247O\\372\\246\\376\\177\\376\\337\\277}v}\\365\\351\\317?\\371\\303\\227\\377P\\327\\265\\254\\365\\026E\\221\\347e\\210\\336\\265\\315\\371\\371\\351b\\261\\000\\240\\313\\353\\313D\\253$\\263MU\\247Y\\376\\365w?T\\325\\357?\\373\\374W\\363\\345\\346\\263\\317\\177\\331tN\\333\\354\\333\\233\\267]\\007A\\326\\231\\225\\021\\027\\002\\2555\\006\\315\\250Q\\001\\003\\241\\230r\\003I\\364i%\\355\\030D\\212\\022\\345\\004\\354\\\\\\267^/ONN\\264N\\230Yv\\007\\211\\202\\001\\005\\024Ak\\0050\\354X\\355G.Dq\\200\\245\\021\\200!\\356\\321\\016\\231,\\037\\024i\\037W\\344{\\320\\372\\300j\\032j\\364\\201\\205!\\357*\\262\\006\\224\\326m\\2105>\\214p\\020\\340`\\300\\373Gn?J\\317{$\\344qS\\370\\316\\020\\032\\021\\265\\330\\370\\211\\342\\374#\\230\\017\\366\\304& \\3468\\370\\340\\362\\260\\320E!\\004@:\\240\\357m\\350\\005x\\226W\\221\\312\\333Z\\033C`f!u\\010\\310-8U\\327u\\223\\311\\204\\367\\364\\356C\\254\\247i*\\217WJE\\037\\304FV\\031\\255\\215\\251\\332\\306\\373(\\241\\337\\365\\275\\200\\206W\\327\\327/_\\276<=\\277\\020 \\345pm\\350\\321dZ\\344\\345l<\\231\\316\\306E\\236\\025e\\022B\\377\\303w_\\003R\\222\\350\\223\\323\\243\\242\\310//.\\256..g\\307\\3071\\306\\304\\244\\343\\361$\\313\\362\\262,\\\\\\337WU}{\\373\\366\\315\\2337_\\177\\3755\\021\\035\\237\\234~\\362\\311'\\037|\\370\\322\\030\\015\\310GGG\\317\\236=\\375\\350\\345\\007\\210\\344\\373\\346\\357\\376\\363\\027\\223\\261\\376\\354\\347\\257\\372\\256\\316\\022\\363\\366\\346u\\014\\356\\346f\\231g\\372\\342\\374\042\\315\\262\\361h|qu\\271\\335n\\224\\306\\273\\273\\267g\\027\\347\\214puy\\271\\332\\356\\254\\315lZ\\234\\\\\\\\&\\331\\350\\367\\177\\370z\\261Z\\337\\274}\\250;\\2076\\005\\224\\317A\\211v\\200\\214R)\\006`\\002\\032\\200\\205G\\221\\005\\264\\237\\033*\\000a:+\\215\\336\\373rT\\246Y\\032)\\342 \\272'p\\235\\270m\\017@\\011\\356\\3770\\023\\242\\222\\271\042E\\212D\\336\\007\\037\\310\\021ie\\210\\301{\\212\\014\\014h\\214N\\223D\\354\\037\\207\\014=\\374:\\021P3\\035`\\345\\341e\\224\\222\\011\\216\\020\\375$C\\213Z\\025\\014w>\\272\\375\\350\\237?\012v\\02673 @>\\350\\336J\\360\\305\\030\\016\\235\\242\\304q\\214\\036\\200\\265\\322\\203\\337&0\\017{\\207@\\024\\233\\272\\011>P\\360\\024\\243l\\247\\251\\375\\340\\225\\231EaY\\260mi7\\225\\0366\\307\\366+\\337\\003\\003Vt)DL#\\317\\363\\256\\353\\004\\037;\\274\\023\\245\\0241\\207\\030\\210\\331\\030\\3234-1JR\\357\\235\\023`\\361\\352\\351\\365\\307\\037\\377\\354\\372\\372\\251M\\254\\014\\\\\\344\\031\\234s\\246(Fm\\333\\366m=\\032\\347F\\307Q\\231M.\\216O\\216\\212\\351t\\212\\210y^\\020A\\265k\\266\\333\\272\\253+\\027\\311*+\\007\\226\\367\\375\\341\\262\\333n\\267BP\\326&\\261\\326\\356\\352\\366\\352\\352\\352\\263\\317\\177\\201\\210\\353\\345j>\\237OG\\343\\242<}{\\363\\335\\256j\\276\\376\\372\\017\\377\\346\\257\\376\\262\\255\\233\\365fF\\004u]\\237\\236\\036\\217F\\243\\273\\207y\\333tI\\236}\\364\\321\\207\\347\\347\\347\\213\\305\\342\\346\\346\\006@\\215\\306\\323\\223\\323\\313,\\315\\177\\377\\207o\\272>\\276\\271\\275\\327i\\276^o\\363\\361\\264^\\256S\\020V\\232&\\212!x\\245\\224\\321\\2111I\\360.\012\\370\\240X\\310\\226$\\035\\224\\350@\\351\\201\\316\\017\\004\\021\\000\042o\\253j\\263\\331\\210\\207\\335\\241\\305\\332'\\335\\310\\210\\302\\244G\\3248L\\304\\211P\\034\\300\\201\\020\\010x\\357L\\002\\207\\324\\214\\270\\277(\\206R\\226\\304\\016\\3500\\346@u(|\\007\\034\\216!\\022\\001\\342\\201\\255\\377\\356\\357\\314\\003\\334\\362\\243\\334\\377\\356\\004x\\264v\\3658O\\277\\007K?\\272\\321#%\\244\\030c\\214\\236\\210\\254M)D\\326\\207\\232\\236E\\254Q\\236\\237\\230\\360\\021\\000\\017\\000\\203/\\0313\\021\\211:\\2430\\004\\345\\323\\220:D\\346\\216\\362B\\207\\245\\030Q\\221\\315\\363\\\\Jgi\\333\\016\\350\\241\\334\\\\\\360bw\\320u\\235\\363>M\\323\\347\\317\\237?\\377\\360\\203\\363\\363s\\245\\01437u\\243\\366\\272\\340\\003Q\\361\\362\\342\\322\\271N+.\\362\\224\\310y\\337)\\025\\332\\256\012\\256\\247\\3507\\233\\265w\\356\\356\\366\\356\\376\\341>\\304\\030}h\\3336\\313r\\245\\240\\353:&\\326\\006ONN\\222$\\011\\301eYzqyy||\\224d\\251\\265f\\271Z\\376\\375\\337\\377\\227\\207\\373\\373gO\\236\\356\\266\\353o\\277\\371\\272\\251\\327\\301\\303\\263\\247g\\325nS\\026y\\014~\\275\\331\\364\\275?::\\035\\217&i\\232\\027EA\\300I\\222\\254\\267\\233r4Z.7\\257>\\376Yd\\025\\001\\036\\346\\353\\361\\364\\330\\005R&[m\\253H\\260\\335\\265\\332\\244\\332$\\310`\\224\\246\\030z\\327+\\245\\264Q\\201\\3020\\372\\022z\\003\\310!+V>b\\277w` \\001\\014~l\\020b\\320\\306\\244Y\\246\\3200\\023\\242\\026\\207\\355C\\015\\015\\203w\\033\\0023\\355\\3732\\301\\031\\006i\\005\\000\\357\\274\\322:2\\207=\\366`\\264I\\022K1\\276WC\\223\\\\\\014\\250PI`\\354AV\\201\\377\\200\\007\\364\\202a\\257\\215\\270\\037\\207\\2777\\003:D\\352\\343T}\\350\\035\\017A,\\365\\267`\\013r\\217P2\\210\\202\\020\\251%\\212@>\\214\\020\\006\\231\\234\\340e\\242\\351{\\227eV\\334vp\\2774\\305\\2220\\230\\231y\\310\\240}O4l|\\372\\020d\\017@\\302Z\\2227\042&\\211I\\022\\233\\246\\211R\\010J\\025e\\231\\027y\\2101\\313s@\\214\\024\\235w\\316\\373\\020\\305\\3271\\332$\\363!\\020\\321d2\\371\\340\\203\\017^~\\374\\352\\311\\223\\247\\343\\361d\\270H\\020\\254\\265\\010Jk\\243P\\215\\312\\221Y\\255\\027e\\231k\\215\\313\\325\\334\\273\\372\\352\\311\\351x\\\\\\366n\\027\\251\\217\\304\\017\\363\\207\\361h\\332\\365\\265\\321\\010\\300\\253\\365\\242\\251\\335\\321\\321\\321\\361\\361\\271\\326\\303\\230\\370\\374\\374\\274,s)\\373\042\\015\\314\\324\\325jU\\325\\365\\253\\227\\037iP\\313\\345\\362\\305\\263g\\336w\\243\042)G\\331\\223\\253\\263\\276o\\001\\340\\303\\017?L\\263\\321\\263\\2478\\235\\234\\270>2s\\333\\366>\\370bT\\344:_-7?\\374\\360\\246\\034\\037\\225\\3431\\203\\311\\213IV\\214\\337~\\365\\315w?\\334\\244y\\021\\003\\24326\\221\\217I\\364\\361\\025E\\026\\356\\001\\202\\226+\\2305\\0033+\\331\\203\\2261\\011\\210\\323\\024\\211\042\\213B\\245\\214\\010\\027l\\252&\\315\\233\\331\\364\\224\\024r``Vz\\23032#3\\311\\256\\023\\003\\356Y\\365\012q\\030r(\\245\\224\\326f\\277\\021\\263\\007\\321\\024\\360P\\263*d\\032\\362\\265\042&\\245\\024\\311\\1771\\312\\332\042\\000\\240\\022\\373\\343A\\346\\217\\337_\\325\\006\\000\\301\\304\\177\012e\\374\\321\\014\\215\\217\\334G\\017\\225\\364\\341\\273\\016\\220\\202\\364\\202|(\\250hX\\003\\225\\217\\364p\\375\\310*\\312\\341\\311a?\\210\\267\\306\\310dT6s\\004\\344\\226\\310\\026\\226\\2344\\003\\302\\267\\226\\301MUUY\\226\\315f3F%\\337(Cr\\241s\\210\\272l\\224+\\201 :\\207\\210WWW\\037\\177\\374\\361\\3712O\\201\\224\\000\\000 \\000IDAT\\325%3\\313\\200\\375\\260\\310\\023B\\210\\201dj\\3234\\2156V{\\337k\\005\\227\\227\\247\\037~x\\355\\373\\212b\\037\\243\\313\\323\\244m\\252\\262\\310\\201x\\273\\253\\322,\\365\\316\\235\\237]\\354\\252j\\275^\\335\\336\\276\\275\\272\\272\\032\\217\\307/^<\\333n7MS\\257VK\042\\312\\313|\\263]\\337\\336\\335\\245i2\\036O\\020\\360\\366\\346\\016\\231\\233\\246\\231\\316\\306G\\263\\351\\331\\371i\\236eEQ\\354\\266\\325nW\\375\\303?\\374\\356\\366\\366^\\231\\304\\330Ta\\3224\\335hR\\000B\\333\\266o\\357\\356Q\\331\\331\\361\\361\\354\\350\\254s\\024Y\\375ps\\3670_\\022k\\332\\317\\356\\231\\331\\030\\013\\300\\322\\213\\020\\311\\332H\\264\\326\\212/\\014\\023\\031\\245P6\\264\\005YP\012@\\211\\242&\\200\\002\\320D\\300\\254\\264MB\\210]\\027\\020M\\226\\227F'\\342!\\257\\025\\357\\255\\002$\\2171\\023\\001\\2426&\\3123j\\315\\014!\\006\\037\\002\\001\\213l\\035\\023\\207\\020\\235\\013\\326\\232\\274(\\230\\031\\244\\331B\\224\\344\\316\\314\\003J2\\370\\301\\016\\3701\\014\\365=!\\200VZ!(T\\373<M\\370\\356Zz4\\210\\221J\\177`\\347\\275K\\303r\\217\\021\\277k\\206\\241\\360ET\\212\\021A\\326\\362`\\350\\007\\342`\\0360\\230E\\000\\034,\\307\\367\\2655\\014\\320!\\037J\\021\\301v$C[ke\\015\\361@+M\\322D\\312\\011\\221\\355\\222}D\\245\\324t:)\\212\\302\\307`\\2545F;\\327\\207\\0207\\233M1\\032\\001b\\210,\\250M\\347\\234\\3671\\3153&\\370\\360\\325G\\277\\370\\345\\347I\\226*e\\230a<\\036+\\245\\2645\\306\\332\042/\\023\\233 \\242,\\325\\002\\200\\311\\213\\244,\\363\\361(\\013\\276%\\237&\\211\\031\\215\012\\250}bM\\337+\\242h\\214\\235\\316J\\205I\\232\\002\\252h,\\212\\355}Uo\\217\\217&\\213\\305\\274\\353\\332,O\\216\\217\\237\\337\\335\\335}\\365\\325\\227\\267\\267w\\213\\325&\\313\\262,/S\\233\\271\\326\\2476\\331l\\326\\014G\\243\042-\\212\\354\\371G\\037z\\357\\242\\247\\242\\034g\\371\\354\\327\\377\\376\\377\\266&K\\222,K\\313\\373\\305\\242n\\2724\\263Y1z\\361\\301\\030Qe\\371\\270j\\334f[\\317\\227\\333\\252n\\272.\\200\\322\012\\025\\020E\\334\\177\\246\\303-\\020\\221\\020-\\345\\340\\003\\200\\2368R\\330Sv\\024*3\\030\\026\\036\\270\\020\\200\\210\\310\\210\\275\\213Y66\\306\\354\\352Z/\\227g'\\247i\\232\\006\\347\\264\\031Ji\\030\\010E<\\000\\276\\210\\0065)1\\246\\031\\216\\011\\216l\\264&bq\\202\\325\\304\\203\\344!\\037T2\\366\\016\\266\\250\\245\\263T\\022pC\\345r\\250!\\020\\265\\024\\022\\360~\\336\\225\\345\\331=\012\\361>\\240\\361\\323\042\\344q.\\377Q\\373\\370\\317\\335\\036?\\350\\247E\\371#\\212\\327\\360\\300\\303\\024]\\212cI\\374\\210(\\\\S\\3416I\\201+\\357\\341\\207\\037~8;;\\023\\316\\017\\263hT\\347\\221Y\\206\\352u]\\327m#y}z2=:=\\371\\340\\305\\3134Me9\\027\\000\\017\\224@\\027\\274sn\\327Ur\\011\\251\\275\\317\\213~\\362\\344\\250\\251\\267L}$\\2475\\275\\275}\\255\\024g\\326J\\321\\243\\265)\\212b:\\036+\\004@X\\255V\\316\\205\\246\\351F\\243\\334Z=\\036\\22777o\\234\\357\\001h\\273\\333~\\361\\305o\\337\\274\\2711F\\237\\235\\237\\217\\307\\243\\272\\251\\267\\233\\315j\\261)\\312\042\\004\\377\\352\\325\\253\\347O\\257\\263,\\377\\337\\377\\267\\377\\343\\362\\362r\\275\\336\\001\\250<\\033w]\\377\\344\\3113\\223d\\332\\244\\305hd\\023C\\004}\\037\\263<?=\\273R&[,7\\363\\345v\\275\\332x\\317\\210\\250\\215A\\300\\010,?\\266B`\\212!\012\\033K\\014\\256\\001\\020\\2555\\342\\305 A\\017\\250\\020\\265\\322\\006\\020\\0015*\\003\\312(e\\224\\266\\332\\030\\245\\0150fEa\\214\\355:\\347|0\\332Z\\233\\240\\002\\204\\250@\\2648\\364\\376\\270\\227\\224\\207\\362l\\221x@*\\000\\211\\310\\307\\300\\304\\2404\\0030hm\\214\\325\\366\\220/a\\020\\030P\\207\\212\\370\\340\\200\\274\\217\\236w\\251w\\037`xp<A\\304HC4\\037b\\372\\275p|\\024\\304r\\323Z\\272\\311w8\\367>R\\011\\377\\030r\\242\\336\\303\\260\\005T\\004\\341\\204\\323\\243\\370V\\222\\347\\245\\340\\323Z\\312h)\\315\\2452\\311\\213\\\\*\\031Y!\\223RPkM@\\250\\220\\231d=\\221\\210\\264Md\\303|WW\\233\\355\\216\\210f\\263\\331\\305\\223\\253\\353\\247\\317\\237>}6\\235\\036\\3314%\\006c\\223\\020\\243\\322jX*\\215l\\215\\025\\211\\350\\203v\\202RJ_]\\217F\\343|<.\\027\\313;\\215\\220X}<\\235\\326u%\\362\\324\\262\\327S\\2109\\270\\321w\\267\\267\\233m5\\233\\215/.O\\235\\357(\\372\\252\\332*\\005\\336\\273\\371|\\276X\\314\\207\\005\\301\\020\\275\\367I\\232=}\\372\\354\\374\\364\\014\\200OO\\216\\277\\371\\346\\353\\340\\275\\250\\032\\207@Z\\333\\242\\034WU}zq\\031#\\267}\\377\\360\\260H\\222\\244(\\213@\\334t]\\210\\010*\\331U\\355\\335\\303\\252\\252\\033\\000#~\\240\\000\\020\\367U`j\\254\\344g\\037B\\244\\000\\300\\210\\214J\\016v\\002\\020}\\375\\201\\324\042:\\263F\\033\\020\\320Zke\\2542V\\231D\\031\\235f91Pd@\\0161\\264m\\313\\000E\\226r\\214ra?F0\\244`\\260\\306*T!D&RJ#C\\2408l+\\200bT\\022\\320\0125C\\244H\\3144\\264\\035BO\\306\\341\\006\\373P>D-\\3567\\000\\366\\231\\362]^\\247w0\\366\\217C\\371\\247\\321\\374\\370\\201\\207g\\336\\343\\036\\357\\324g\\036=\\033\\251\\367G\\220\\270'\\214\\354\\277k\\210f\\330\\357r1\\263T\\311\042\\007*<'\\331H\\222\\002W\\302Z6P\\264\\306$M\\016X\\265@\\037>\\304\\020\\302f\\267\\365\\336+\\245\\317\\317\\317?\\370\\350\\345\\263g\\317f\\263\\243\\242(\\252\\2469\\350\\201\\300\\336\\313\\260i\\032Qv\\355\\373^<\\252E\\315\\021\\021\\365/\\377\\305\\213\\252\\332\\244\\251\\232\\315\\246\\247\\247G\\325n\\307\\024\\307\\343Q\\327\\266J\\251\\030B\\333t\\202\\350g\\251]\\256\\227M\\353\\257\\256.f\\263)\\021\\365}g\\023\\213\\010MS\\177\\377\\335w\\326&\\227WONO\\317\\362\\242 \\242\\266\\353c\\014\\367\\267\\367\\250\\360w\\277\\377\\375x2j\\332f\\261Z\\245I\\362\\3600\\337nw\\263\\351\\361\\037\\376\\360%1\\336\\335\\3351\\000\\003\\365\\336Uu\\235\\246\\205\\265\\271s\\274Z\\357\\356\\356\\026\\313\\325\\232H\\307\\310>D\\357<ER\\010\\326\\350\\304\\032\\253\\265\\300\\220!\\006\\346\\001?\\006D\\000\\0161\\242\\006\\2555\012\\275A~\\017Z!j\\324Z)\\203Z)\\245Q\\266Q\\225\\262\\326\\264}\\347C\\017\\210\\301\\373\\246\\255(\\006\\255Ub\\255Be\\214U\\332 \\340\\240\\220\\033\\243\\214\\000\\0011Db\\036\\266Pc\\214>z\\037\\003\\201\\006\\245\\021Pk+\\240r\\360A\\0159\\017x?R\\331\\247d\\2610\\217\\250\\006\\355\\010D\\224Vs_r\\240\\004\\322!2\\017\\270\\333\\341\\032x\\034\\205\\3575\\213\\217\\212\\004|o\\224\\370\\356\\236G\\371X.5\\032.^|7o\\217{\\314e\\370$\\215\\320\\307Q+-9Xj<\\311\\323\\302\\312\\227\\341\\261\\244\\341\\275z\\033ow[\\245Pk-\\266\\320\\305\\250\\2141\\2547+k\\223\\311drzqqu\\375\\344\\354\\364\042Ks\\341\\354km\\304\\275\\205\\210dQ \\006R\\250d\\232#A,\\316\\250\\242g\\242'\\307\\321X5\\036\\225@\\221B4\\3060\\305\\256\\353)\\2206\\312Zk\\214\\010\\375i\\357\\335z\\263\\271\\272</\\312\\\\)\\310\\262\\244m*\042\\332n7\\253\\325\\362\\342\\342b<\\036\\347E\\256\\265\\316\\212\\242\\310\\013Y\\371\\014\\301\\265uut4=;;\\375\\227\\177\\376\\347?\\374\\360\\303d<9;;\\277\\274\\274\\272xr\\365\\346\\346\\266\\367.\\022\\265\\256\\033O\\3071R\\333\\366\\250L\\210\\270\\255\\352\\315\\272\\331\\326\\215\\367L\\004\\221\\336\\375\\376d\\011H\\001\\304\\030\\210b\\0101\\016\\364.\\245\\224\\2222Zi8\\310\\216\\005\\357%\\243[kQ\\031\\255\\2156F\\031\\205j@\\344\\000\\311{\\037\\242\\217!\\206\\320S\\360\\000\\034):\\337\\215\\312\\211\\326*\\261\\251\\265\\203\\234\\3000+&V\012\\025hDFV\\314\\314\\304\\201(2\\371\\030\\207\\200V\\006\\225B\\324\\014D.H\\320\\020\\002\\202\\032TK\\0250\\311N\\341#\\017\\265=\\266p\\310\\323\\357\\327\\262\\357\\201\\025\\217\\356\\377#\\321\\014\\202\\000\\362!|\\337\\345\\332w'\\301\\243oW\\000\\200tx\\256\\003K\\005\\036\\235\\027J)\\324\\373U[D\\243\\315\\243Se\\270\\252\\211Hiu@9\\344~c\\014\\000\\013\\237Q\\364\\244\\343~48\\036\\217\\363\\242\\274\\270\\270\\270\\270\\272\\032\\217\\307\012\\265s\\216\\230\\32345\\306\\312z\\201\\\\\\030}\\337S\\034D\\314\\004\\237\\221\\313)\\204\\320u}\\327u\\372\\243W\\263\\266\\251\\023mNOO\\000\\250\\357\\273\\340\\343\\213\\027\\037 (\\255tQ\\224\\263\\351Q\\222\\350,K\\353\\246F\\255\\316N\\317\\252\\272&\\212eY\\324u\\325u]\\010\\236\\210\\257\\257\\237\\036\\037\\035\\217\\306\\023\\357C\\333\\365\\273\\355n\\265^\\207\\020v\\333\\215\\217\\376\\363\\317?\\2738\\277\\\\-\\227\\307\\307\\307]\\357\\353\\246\\035O\\246\\333\\315\\356\\333\\357\\276\\356\\272\\266(\\362\\272\\255G\\2432/\\013fUU\\355j\\265\\331l\\253\\256\\365\\214\012\\3018\\037\\224\\326\\210Zk\\231r+\\205\\300\\024(\\206H\\034c\\240\\030\\201A\\031\\324ZI\\337-\\275V\\240\\330\\366]\\354\\373xP\\322P\\342h>\\004P\\340\\030\\211B\\014\\241o\\231<p\\004\\362\\260\\257#c\\010\012\\0241he\\2145J\\312h\\212\\000\\020}\\004\\004\\205\\032\\225b\\306\\030\\002E\\022$\\302\\205@\\304\012\\325\\336\\344PE\012\\024\\206\\035A\\226\\200>\\354\\2350k`\\251\\374\\025H\\253\\202\\300\\274\\027\\021E\\220\\315@\\226h{G\\205\\372Qb\\376i\\021r\\010K\\305\\200@j\\330\\273\\031\\250\\037\012\\007:\\036\\356\\301\\271\\375\\367\\263\\3546\\362\\000\\241\\000\\213\\333\\237\\300\\317\\300\\250\\360\\260V\\010\\302\\035 \\222d)\\0237\\000\\010!\\310\\303\\340QYo\\255%\\212EY8\\347\\344\\031\\2641\\326\\332,\\317\\257\\256\\256\\2646\\223\\311$\\3112\\000\\210<X*\\246iJ\\0141F\\233$\\332\\030i%\\2156\\302\\372\\227g\\356\\373\\276\\256\\333\\276w\\262\\177\\240?\\372hj\\264\\312\\323$M\\323f\\267K\\255\\315\\323\\354\\371\\263gy\\236I\\335S\\024\\005\\000\\347E\\001\\000\\227\\347\\227\\363\\305\\342\\376\\376\\316\\032]\\226\\205s=q89=\\231\\035MONO\\224Q\\336\\373\\246\\357\\265\\3261\\362r\\265\\254\\353\\212\\230../\\274\\017\\333\\365Vk\\375\\360\\360\\340\\273\\356\\352\\362\\342\\374\\354\\324\\032\\335v]\\222$\\345hd\\223D)\\245M\\332\\365\\274\\3344M\\353B\\204\\246\\36712\\240\\212\\203\\016\\206(\\177\\212K(J\\212\\365\\301E\0121\\022*\\326\\303\\312\\2470n\\242\\006\\244\\020}\\337\\201s\\020\\243\\220\\344\\304\\177\\204\\231b\\014!\\272\\340\\035\\273\\026\\274\\003 \\010\\001\\230\\301\\210\\207L\\000\\004k\\315nS\\305@Jk\\253\\215RH\\024\\244j\\017\\301#\\210\\022\\214\\030{F\\212A\\226\\253\\234s\\024\\011\\304\\217\\020d\\271]\\346\\027\\357\\346\\207\\022\\201\\010\\240\\207E\\025u\\330\\354\\222\\032]\\022\\033\\354\\205\\236HF\\0362xAT\\200J+\\265\\347\\222\\022\\363\\341\\357\\362U06\\245X1<\\206\\306\\037g\\356?VCK\\212fd \\004\\005\\310\012\\367c)d\\351\\017\\025h\\224\\327\\036\\312\\031)\\232ezrXZi\\273N\\342;FO\\304\\000\\244\\265\\011\\301\\357\\252\\035\042\\224e\\031\\201\\363\\274\\270\\274\\274\\314\\362\\034Q[k\\2252.\\370\\340I\\234\\006\\210\\310\\373(v\\007\\2625\\203\\303\\350\\021D\\267@|8\\345\\304V\012\\373\\336\\355v\\033\\375\\352\\305\\270\\255\\352,I\\200\\350x:\\235M'\\010\\224\\347b\\010\\036\\325 \\017,{H\\352\\355\\333;\\203\\372\\374\\3644Il\\333\\324\\247g\\247GGGY\\221\\326]\\035)\\032k6\\273M\\240\\270\\331l\\377\\351\\313og\\3231\\001{\\342\\336\\323|\\276<>>\\212>\\034M\\306\\177\\362\\253\\317}\\327\\271\\272\\266V_]\\\\z\\347\\317/\\316\\255I\\313\\361\\270w\\324\\305d\\275\\353V\\333\\312\\023\\332$%@b\\326\\211\\011\\024\\030\\201\\004\\201S\\250P\\205\\030\\275\\017\\314D\\024d\\007Z\\272\\020&R(\\224g\\025\\202\\017}/\\344$\\210\\021\\265a\\306\\020#p\\324\012\\024\\004\\216\\036\\205W\\351\\203\\230cB$\\210Q\\266\\211\\203\\017Z\\333\\266k\\253\\252ffk\\005kc\\305D!\\030\\255\\215F\\004\\346@,\\022\\321LHd\\024*\\206\\340:\\000\\266V1P\\360\\016\\221\\003G\\002B\\004\\203\\250\\0001F\\362\\036\\006$F\\355\\341\\204A\\003\\225\\220#Gb\\212\\034\\017k\\350\\210\\250\\225\\031\\364C\\210\\245\\224VC\\265@ \\245\\017021\\260b\\036\\312`$T0H\\253\\342~P:\\324\\037\012A\\001\\343\\360GP\\030\\224l.\\257\\203\\200$F-\012A+\\004\\004\\210\\221cd\\242\\375\\301!K7B\\330Bf\\002dk\\015\\305 \\352hZk\\245Q\\272\\035c-!2\\342\\351\\351)\\202\\316\\313\\322\\332\\004QO\\216\\216\\332\\316%6-\\212Q\\333u!\\304$I\\211(A\\215L\\2129\\364= 0E\\255\\220\\211\\225\\302\\262,D\\326#\\304`\\255\\241\\030\\313Q\\241\\177\\361\\351\\331\\371\\331\\231\\326\\272,\\213\\311h4*\\213\\223\\343\\343\\315z\\035\\203\\337U\\273\\311tzww\\347|`\\346\\310\\330\\265\\255V\\332(M\\304\\247g\\247\\301\\373>\\364\\336\\273\\363\\313\\363\\325f\\335\\264M\\236\\217\\3224\\335nw\\333m\\265\\\\vM\\023~\\366\\331\\317\\232\\246?;9\\356\\332\\376\\343\\227/)\\204\\246\\252\\232]\\365\\373\\337\\377~\\271Xn\\267\\325\\266\\252\\265N\\211\\200\\001w\\255\\177{\\267\\336\\324\\275\\013\\204Z\\003*\\037\\203\\217\\3410\\243\\222_\\203\\222Y\\011@\\244\\010DD\\221\\007\\020\\352]\\365)\\366Z\\321\\373\\340=P\\024\\275-\\2555(\\003\\210J\\201R\\214\\024\\211<K\\356g\\324J!\\250\\241\\011\\033~\\375\\210`\\214N\\201\\251\\251k\\004.\\213\\002\\2016\\353\\265\\321\\232\\231\\024j\\243\\015\\210\\301}$`F\\305\\003\\224(!.\\031\\023%\\316\\020\\210\\345\\374\\2268\\002&dd<\\234\\371\\217xTr\\304?.\\210\\021\\001Q\\357\\001=\\265?\\361\\001D\\377k\\017\\256\\31310|\\017\\241\\342C\\016\\376ce\\311{i\\233p\\377Fp\\177\\202 \\014]\\306P\\353\\014\\351Z\\032l\\255\\324\\273\\205\\362}uq\\270\\201|\\254\\210\\373\\245cf\\204\\326\\271<\\317\\217\\216\\216NNN\\264\\265\\223\\311d4\\232\\214F\\243\\345jS\\226e\\214\\334u]Q\\226I\\222\\304@\\243\\242\\210>x\\3273Q\\214Q\\241r]\\317\\221(\\206\\254(d\\005}\\261X\\224E\\261\\331n\\255\\326\\304\\244\\377\\355\\377\\360g\\323\\331lT\\214\\246\\323Y\\3334\\017\\017\\363\\020B]\\3276M\\333\\266U\\332,\\227KD\\270\\2708\\3671\\264u+X\\225\\310\\201#b1\\032\\013S\\024@m\\267\\333\\321h\\262^\\357\\276\\377\\35653O\\247\\345\\347\\277\\374\\224Yi\\2438\\304\\377\\372O\\377\\364\\376\\356\\356\\344\\350\\244\\357\\272\\242,\\317\\316.\\363b\\314\\312D\\306\\252n\\253\\316\\255\\267\\315|\\271[Wm\\210,\\355\\235\\314K\\016M\\314\\201,\\246\\366\\252mD\\221c$\\212 \\214\\213}\\247\\2028\\310\\310\\206\\340\\243\\367\\003W\\003\\021\\225f\\324\\200(8\\036P\\014\\321s$f\\326\\312\\310\\363\\313\\221\\017\\342d\\005\\212\\010\\2142L1\\220\\347\\020\\313\042O\\323\\204\\001(\\222\\017\\201\\230\\2256\\210:F\\002@e\\014 \\313zK\\214\\344c$&%\\251N\\350\\253L{\\006\\263T\\253\\212\\206\\345)f\\034\\212\\327}t\\014p\\204\\024\\321CfE\\331\\353\\336\\377\\375\\035dA\\217\\376\\376\\210Z\\375n\\263\\353\\237\\011\\350A\\021{\\337h\\016\\244\\277}\\265-\\227\\0152H\\375\\275\\277\\015VI\\303\\357H\\352\\240\\307 #\\263\\320N\\001\\020\\025\\021\\373\\030\\203\\200A\\200E9\\236\\035\\035\\237\\234\\236\\035\\035\\035\\247i\\236\\246Y\\353\\372\\365vc\\214-\\313\\222\\021C\\014F[\\000\\261\\257\\215\\256\\357\\333\\256\\025n\\237\\265\\211\\367A)\\255\\224\\356\\232\\326(\\335T\\365\\371\\331Y\\360\\276,\\313\\355j\\035bTi\\232\\257\\327kk\\323\\030\\343f\\275\\333\\355v\\363\\371\\\\\\344\\311\\3046\\353\\364\\364Td7\\230#\042\\037\\037\\037\\277~}s{{{w{\\257\\224\\272\\275\\275\\025h\\231\\231\\235\\013\\306\\030\\271n\\210@$+\\235\\353\\242w\\177\\362\\253\\3177\\233\\325\\371\\371y\\232\\246\\377\\370\\273/Q%\\221\\224\\262i1:\\272x\\362\\201I\\307\\021\\354\\266q\\233]\\013\\254\\006Rl\\214\\342\\036\\362G[\\037A\\033\\006\\004\\355\\321\\026\\364\\343\\317t\\270_V\\254\\001\\000\\010\\2208\\372!\\177\\320\\341\\001\\014\\203\\242\\341#yOf\\340!\\034|t\\254@!v\\336\\335\\336\\337\\255\\267\\233\\274,X\\241\\247\\330y\\327\\207>0\\0212+\\326\\006\\215\\321\\326\\350\\304\\350$1\\231\\321\\026\\021c\\200\\3405\\200\\001VL\\260\\247JG\\004P\\014\\212\\207\\323\\376\\321\\355\\220\\341~\\364wq\\275`\\216\\357\\362)\\362;\\000\\020\\351\\275\\257\\370S*\\310\\377\\317M\\361?\\373_?mC\\371\\237\\271\\301;e\\005`\\346\\270\\247=\\031c\\222<;9;\\275\\272\\272\\272\\270\\270\\220\\311]`\\032\\215FW\\227\\327\\306\\230\\365z\\315\\314EQ\\210\\214]\\236\\347]\\357\\322\042\\027\\347\\322C\\272\\361\\3367M\\223\\347\\271H\\343\\255\\327k\\215\\252\\333\\325y\\232\\031F\\375\\213\\317\\256wU\\025<\\265][\\325\\255\\322\\332&\\251\\363a\\267\\253\\262,\\357\\235\\273\\274\\2744\\211\\266ib\\214N\\223l1_\\002\\303d:\\376\\376\\373\\357\\233\\2466\\211=::r\\336\\023s\\2144\\231L\\353\\272M\\3234\\2048;\\232\\316\\357\\347\\347\\347\\247\\313\\207\\2074MV\\313\\225F\\265\\333\\325\\343\\321\\364\\356\\356\\201P\\023XB\\213:\\271\\235oZGM\\037Y\\251@\\014\\3001\\006\\357\\235\\020\\301\\344\\2372\\027{\\234\\231\\204\\217\\005D\\314\\203\\324,\\356\\177fD\\004&D\\014\\336\\223\\037\\274Q\\020X)\\315\\201A\\241V\\21292Eb\\321\\330E\\301\\242$\\361\\357\\235(\\000\\000\\214I\\200\\001\\025j\\243\\202\\017uW\\365\\316\\311\\306\\224\\363\\236\\031\\2141J\\233(g\\011\\220\\321\0120\\362\\201\\323\\007L\\221(x\\2434\\000\\222|'\\016\\\\\\022\\306\\241\\026y\\367GH\\334\\370\\376e,%\\300^yCH\\247C\\366E\\202awF$\\365\\340\\360\\365\\361g\\265\\237\\010\\302\\243D\\276\\037E\\342^iI\\356\\031^f_\\266\\355?u\\031\\261)\\030\\264Xy\\377\\365\\261\\252%\\240V\\250y\\237\\304\\031\\221\\230#\\2036\\266\\034\\215O\\317\\316\\317\\316/\\256\\257\\237\\261R\\235s\\200\\352\\342\\342\\311lv\\344\\234\\277\\237/F\\343I\\210dMbm24|\\304\\256\\357\\264R\\240\\224QZ\\024\\207\\021Q\\243\\352\\273\\336h]W\\265w\\316;\\257\\000\\274s1\\204\\266i\\364\\317>9\\2636\\331l7\\223\\321$\\306\\370p\\3770\\032\\215\\333\\266y\\362\\344\\311h2\\266\\326\\246Y\\226\\217\\212\\333\\333[\042\\272\\237?\\214\\212Q\\210\\341\\344\\344\\370\\374\\362\\334\\246i^di\\232\\235\\235\\237\\373\\340\\363,\\263&\\025\\235\\221\\030\\303\\253W\\257\\312Q~{{\\2535\\006\\347mb\\266\\233\\315/>\\377\\325\\177\\370\\217\\377q4\\236\\345\\243\\031\\352\\244\\351\\302r[\\375\\360\\366n\\323t\\275'e\\222\\340\\335\\001o>\\024\\036\\002\\011=\\356\\312\\005\\357\\014\\301\\035\\226C\\344\\223\\177\\007\\331\\002\\003@\\010\\236\\235\\033\012@`\\024\\307\\\\3\\340\\025\\024\\375\\201\\322\\271G\\261\\225\\344n\\311A\\000\\240\\224\\225\\335\\332\\020=\\003)T!\\206\\355n\\327t]\\337u!\\222\\234\\276\\240\\215V\\032\\020\\000#p\\004\\000\\245\\224QZ3\\2008\\363*\\015\\302\\315\\000\\331\\011C\\032Z4\\251\\325\\325~\\273\\\\\\370t\\361\\300\\306~?M\\016\\371\\370\\321Q\\024\\231\\2019\\356k\\357\\203\\2749\\034F0\\360\\307K\\216G\\001\\375\\350\\036\\206w\\217W\\217G\\342\\203d\\302\\0006\\377\\344i\\006\\223h\\251\\270\\031!R\\014D\\014 \\352\\217'g\\247\\027\\227\\027\\247\\027\\347\\353\\355\\266,\\313\\243\\243#\\243\\023\\357\\375|>\\357\\234\\227)c\\226e\\242\\220$\\022MU]\\027y\\346:'\\313\\362\\262\\226\042\\037\\227\\010\\271D\\357\\353\\252\\032\\027e\\265\\253\\212\\274\\330,W\\233\\325Z\\177\\360\\341\\2616\\266i\\273\\311d\\002\\210\\273m5\\235\\035\\245i\\332\\264]\\333v!z\\037\\302h2\\362\\336\\027\\243\\302hM1\\344y\\376\\364\\351u\\357\\272\\310\\361\\370dV\\024E\\357\\373\\272\\251\\214\\265!\\270\\030\\203\\353;\\201\\032\\274\\353W\\313\\371xT\\316\\246\\323\\227/_\\256\\267[\\347=\\203\\276_\\254\\036\\026\\353\\252\\355\\267u\\273m:G\\010\\306FB!iJ\\253}\\260b8T\\035\\217O=f\\016!x\\3574\\016\\314\\037\\251\\233\\245\\0269\\374\\036\\274w\\020\\002\\240\\374B\\030P1je\\264V@\\3549\\204}\\365\\011bK)[UQ\\262\\020\\002 J\\257 $3\\245\\225\\265\\011#;\\037:\\201\\373}h\\373\\316\\307\\370\\377\\265\\366\\246M\\316$G\\232\\230\\273GD^8\012\\205\\252z\\217\\276f\\232M69\\324\\314\\254fl\\315\\2445\\223I\\372 }\\225~\\273\\366\\020wH\\016\\331\\354~\\357\\272p\\346\\021\\207\\273>xd\\002Uos\\245\\225mZ\\031\\014\\005$\\022\\211\\010\\017\\017?\\036\\177\\034\\015\\032c\\321\\200$\\317\\302\\010b\\214\\261H\\310\\000\\300\\226H\042\\347^>\\010\\214#\\230MMU\\234tmV\\342\\200lt\\005\\236\\375i\\330\\030\\362\\371\042\\271jW\\205\\376\\224\\377\\033\\345\\214\\317\\031\\236\\306\\004\\312\\271\\014f=}\\022\\350\\314\\205w\\252\\3129\\227\\370\\254ts\\216S\\306\\334e\\206\\270p\\376?[?\\254$>\\3266M\\263Z_^\\337\\274\\\\]]\\315\\026\\013\\347\\212Y\\263 cCL\\307\\266wE\\301\042\\313\\345\\362\\305\\213\\027?\\375\\370\\006\\0015\\022gm\\241\\227n\\232\\332\\220\\266W\\000\\305\\323u]\\327\\265\\335q\\277\\277\\\\\\255\\272c\\353,}\\374\\360\\336\\020>>>\\240\\360\\307\\017\\357\\315?\\375\\367\\337*\\256o\\267\\337\\033\\242\\353\\233\\033Bj\\333N\\004\\312\\272,\\312*\\001o\\267\\233a\\030\\216\\355\\261(\\2341\\364\\370p\\267X\\315\\377\\362\\227?\\037\\333\\303\\307O\\037\\\\\\355\\312\\322\\035\\217\\307\\276\\3577\\333m3\\253\\253\\262\\272\\\\_<<\\336?n\\356o^\\\\i\\355\\332\\335\\335\\375v\\2737\\326\\275x\\361\\372o\\177\\361\\335\\355\\375\\306\\224u7\\204\\315\\241\\325\\246\\221\\201\\031\\004\\255\\306}N\042\\033$'\\231\\236DRUCs\\014\\206\\220\\205\\247\\211y\042\\375 \\034\\274\\244\\224G[54\\032\\343,\\0210\\307,\\320\\252o\\204\\254\\265\\306X\\320\\227\\204Aq\\233\042\\000h\\010\\255\\265\\202\\022B`ak\\215\\261\\006\\014\\015>\\014\\276\\357;-,\\260\\211\\023\012#0e\\370\\010\\200\\010\\001:czM\\004d\\015\\315\\243\\377\\207Z\\326\\247\\337\\2448QR\\3770\\233\\007O\\374\\207\\261\\031\\027\\234\\0111L\\0032\\2112LZ<\\233\042\\247\\235\\355\\211R\\035\\257z\\366/\\234k\\364\\317\\237\\214\\217'\\327\\034\\221\\362v\\206\\000#\\277o\\022)\\253\\252\\231\\317\\326W\\353\\227/_\\257o\\256\\347\\363\\271\\210\\014\\303P\\325JkXh\\177\\330\\256\\353\\016\\207\\203v\\376U@\\010\042n6[\\005\\201\\334\\335\\335\\022A\\327u)\\306\\224RQ\\024\\300\\242\\015]\\252\\242\\264\\006c\\010\\205\\261\\333\\307\\215\\304\\364\\323\\217?\\376\\353\\037\\376h\\376\\217\\377\\363\\177\\0111j9]\\333vEY\\275}\\363\\326\\207P\\347\\3345\\207\\030>~\\374\\320\\373\\341\\352\\352JD8F\\255\\350_\\257/g\\213\\331\\362b\\031b\\010!\\334=\\334-\\0263\\337\\367~\\350\\277\\370\\342\\013k\\251;\\354\\352\\252t\\306\\366]\\267\\272\\274z\\334<v]\\0004o?|2\\256\\336\\354\\333!\\244\\310 DI!\\364\\004\\204 )\\201\\234\\263c!\042*\012\\361\\\\C\\347\\352 \\302\\030\\274\\24634l7\\271\\016\\205\\263)%NQ\\324.\\225\\204\\210\\002h\\214\\263\\316J\\2141\\014\\332\\035\\005\\024\\353\\211\\006\\0002%\\262\012\\264Z\\322Hp\\002\\001g\\003C\\353\\003\\000\\311X\\003\\0021q\\333u\\307\\356\\330w\\307\\371b\\256\\0115\\0044d\\010\\215\\372\\256\\306\\031\\001\\2150\012 2\\210\\240\\020\\212A\\344\\024\\201\\305Z$$NIxD\\010\\216V\\304\\364'\\332\\270\\015Nz\\024\\262\\261!\\232\\305\\237\\342\\311g\\322\\305\\250\042\\370D\\213\\313t\\311\\234\\214\\037\\337$\\243\\335\\0022U\\232\\356\\217*\\277*\\310,\\242\\325\\354\\200\\204dbJ\\014blN\\200\\013HU6\\315|\\376\\375\\367\\277\\276X\\255nn^\\254\\326\\327\\032\\352.\\253\\272,+\\355\\027\\363\\356\\335\\273\\353\\353\\353\\355v\\253\\320P\\304\\014\\222A\\304\\276\\357K\\347\\026\\363Y\\337u\\010\\030\\275\\2375M\\327uM\\323\\034\\366\\333\\241m\\273\\256=\\356\\367\\233\\307\\207\\375~?\\264\\335\\361\\260\\333l\\036\\337\\376\\370\\343\\307\\017\\357e\\350\\315\\337~\\267N\\302\\377\\362\\373\\337\\013\\363\\376p\\330m\\267\\316\\332O\\237>}\\370\\360A\\253l\\232\\246\\231/\\0271\\206\\020\\242\\265V\\200\\207\\256+\\313\\242\\250\\313n\\350b\\014!\\205\\273\\373[cm\\337wuU]\\\\,\\313\\242(\\313RRz\\375\\372\\213\\340#\\331\\262,\\253\\375\\241\\215\\014e=\\357{\\356}\\352\\206\\030\\223\\004\\221\\250\\221\\206\\254\\217D8>\\3319\\247\\270\\362\\231\\015}\012bp\\312\\225\\2479\\370tRE\\306\\0203\\247\\030\\204\\203^\\035\\325\\267!K\\326\\000s\\342\\000\\300\\220\\315e\\223\\275 4y\\247F\\034\\255\\221s\\0056\\006c\\307\\3440H\\356\\230\\305\\212aMq\\277\\337\\001`]U\\326\\331\\344\\343\\320\\367\\314\\342\\234\\025\\226L\\235\\231)y\\031R\\024a\\213\\204\\302\\212J\\222\\224\\022'\\021\\326v\\002\\237iS\\200\\223\\331\\240\\307\\317\\226\\264<\\327\\265\\210c\\252\\361\\354\\232\\370W\\364\\264\\262\\241M\\352\\203G\\337b*\\034\\314K\\236t\\200\\304\\025\\216\\254\\0111Z\\347\\310\\230\\365\\365\\365\\313\\327\\257\\277\\371\\346\\033\\262f\\265Z\\221-\\234sUU9\\347\\272\\276CD\042c\\214\\271\\270\\270\\010!h\\244b\\271\\\\\\276\\177\\377\\376\\372\\372F\\231\\360-\\0315<\\372\\276\\277X\\314\\225?$\\014>%\\237|\\2101\\372~\\360Cg\\255\\013}\\267\\337m\\267\\333\\307\\343\\356p8\\354\\206\\256\\203\\350-Y\\274\\\\\\257\\342\\037\\223-\\213\\355\\273\\367\\3169\\321\\376\\265\\256\\270y\\365\\322{\\177w\\373\\260\\276\\276\\274\\274\\274\\262\\245\\275\\\\.\\233\\272\\014C\\367\\227\\237\\336~\\370\\363'\\006\\351\\373\\336GFDf\\237R\\252\\257k\\357\\275\\357\\356\\277\\372\\352\\253fV1\\263)\\312\\365bF\\350\\352\\246\\013<\\260\\020P\\261\\331\\036XL\\022\\342\\021a|\\312\\242\\262Z\\230\\237Oa\\256>\\302\\314&\\221R\\2120\\306\\335\\220A\\025\\024\\234\\205\\367\\237\\011\\002\\212\\340\\030\\311\\022H\\360\\364[\\362G\\364\\221\\020\\031\\205\\010r\\217\\253'\\227R\\203}\\372\\313i;\\346\\304\\314C\\354\\207>\\204\\324\\367\\376ry1\\257\\033\\347lJi\\010\\036\\215!\\306\\002\\320\\020F@L\\024\\230\\243\\000\\246D\\010\\210\\202\\300 \\211\\200\\221\\320 h+\\346\\211\\253\\016N\\346\\005\\376\\025Q~\\362[\\316~\\370\\350\\340\\312\\364\\226\\250\\340\\002\\300\\024/\\234L5\\021Ac\\030\\000\\211\\224\\211\\206\\231\\321\\220q\\305\\271q\\242\\013]\\000\\366]\\3334M3\\237\\337\\334\\334\\030\\343\\226\\253\\013\\347\\\\YW\\213\\371\\305z\\275~\\330nRJZ#7t\\236\\300`\\211\\336{\\024X\\255Vm\\333\\206\\301\\037\\367\\007K\\346\\355\\233\\2374X,1r\\014MU\\366 \\367\\367\\367\\321\\207C\\330\\226\\326\\365m\\260\\326r\0121\\014)\\205\\375f{<\\354\\366\\373}\\034zM\042Wu\\021\\035Y\\357\\375\\357~\\367\\273\\365z\\365\\273\\177\\371\\3177\\353\\233\\366p\\270X\\254\\306\\236\\241\\215\\265\\205qv>_\\226\\245\\023\\022\\000\\274\\275\\275o\\367\\273\\224d6[|\\374\\364)\\245T\\317f\\267\\267\\267\\213\\305\\002\\000\\037\\037\\266\\326Z\\002\\330n\\267\\373\\335q\\010{\\201\\252\\252+\\021r\\345\\034\\016\\262?\\206\\304&&d\\215\\351KFH\\222@\\346/L\\021\\236\\230k'\\033.oj\\347\\007G\\001\\306\\247\\342x\\256\\310GA\\030\\355\\310\\363\\267N{\\372\\317\\034\\210\\212\\027:5\\377{&2\\347!B2\\206\\210TW\\0332\\307\\276\\353\\372\\241m\\333W7/.\\026K@\\010\\034\\014\\200HR\\276\\002C\\204\\002Dh\\222\\304\\224\\324\\233b\\000\\004%\\000\\003\\341\\010\\200\\312\\275}\\362p\\177&\\317\\367\\271\\034\\377\\027\042\\311\\254\\327\\232\042\\304\\360TO\\213\\210\\266\\3370\\222K3\\001\\300\\026n\\022k2\\306\\232\\234\\251T\\230\\0339\\373j\\371\\332U\\345\\254\\252\\347\\027\\313\\312U\\312\\244\\357\\234\\353\\272N\\031x\\025\\321\\241\\261dc\\014\\307t<\\036Q\\240i\\232\\335n\\247\\304\\202eY\\326u\\375\\351\\375\\007\\021Q\\372\\227w\\357\\336\\001\\300\\345j\\271\\355;\\337\\365\\325\\334\\015}+E\\341\\373\\356p8\\240\\310\\273\\267?\\015C\\227|0\\226\\234q\\245)\\234\\263\042\\311~\\365\\315\\227e]t\\335\\360\\345\\227_\\036w\\307\\233\\227/\\357?\\335\\307$\\363\\305\\305\\375\\303CQ\\024\\353\\253\\025\\000\\274y\\377.\\204PX\\212~\\270\\274\\2708\\036v\\273\\335\\316\\225\\025@\\350\\273\\370\\325\\227\\177\\253\\034\\013?\\375\\364\\323\\325\\325U]\\224o\\337\\274\\027\\301\\213\\313\\353\\335\\216\\017\\373ph\\373\\266\\363m\\317\\207\\243\\267\\256bpc\\177\\275Ly\\301ck\\341ga\\215\\223x}6y\\223\\032\\026IJ\\264\\212\\302\\023\\320\\367\\374\\004\\230\\034JD\\004F\\355\\311.2\\315\\246\\210\\320i\\227\\327\\257\\313\\316\\227\\306~O\\374.\04292%\\014\\000\\211\\005\\000\\014j\012\\223A0\\262\\000\\032\\026:\\364\\303\\273\\333\\217\\373\\366x1_\\324e\\025\\242\\327Jo\\022\\013\\211\\255b,\\325k\\033\\253\\270\\210\\300\\0202s\\210\\211\\254\\023\\004\\245I\\032e\\372t\\207\\243\\346~n`|\\376|t.\\263L\\203\\234T>\\234)\\346s\\271\\007\042f\\261\\2053b\\227\\253\\013\\315\\224!\\030W\\225MY\\221\\263D\\3269W\\327uY\\027\\256r\\014\\322T5\\020VE\\355\\275G\\264!I;\\364\\233\\375\\256r\\2251\\346xl=\\016\\006h\\273\\335\\256V+Iq\\261\\\\\\276y\\363c]\\224C{,\\327\\227\\233\\315\\3369\\267\\2307\042rw\\373\\361\\342\\342\\302\\0208\\347\\336\\277y\\333T5H\\342\\024|\\337\\365\\255\\312\\335\\016\\200\\373\\276eI\\306f\\376\\017\\305~!\\201\\375\\017\\377\\341\\377Rp\\234\\217\\276\\017\\375\\017?\\374\\320\\224s]\\202m\\333\\017C@\\304\\300\\241\\355\\216\\326\\332\\3560\\324Uu\\373\\351q\\261\\272\\250\\353\\305n\\1774T\\366>l\\036\\367\\263f\\271\\272\\230m\\036\\367\\2340%8\\034\\272\\233\\233\\233\\272Z\\264mx\\330\\034\\357\\037v\\2211&Ll8\\022\\210I\\323\\\\(\\011\\247\\362\\260L[\\343\\371\\010\\377\\025\\315\\364Lk\\236\\213\\357\\370\\234\\361\\251\\312\\302g\\032\\372\\277\\254\\362\\020U\\224\\201\\237f\\362$\\327\\213O:^\\361\\223\\372\\225\042\\244@\\207\\224x\\177\\354rk\\251\\331\\274(\\212\\261\\2001I\\002H\\311)\\204\\324\\231\\010\\310\\314\\221\\323X\\307B`2y\\207ZY2\\356\\022\\177m(\\316F\\343\\351\\230@\\302\\247}\\2612\\212\\356\\334\\222\\031\\253W\\246W\\224@\\253\\256kAX\\257\\327)%Al\\232yUUZ\\367\\212hP\\271\\242k7x\\237\\231\\210\\211\\324\\030S;{6\\233\\001\\000\\021\\365}\\257\\364\\273EQ8\\262\\026\\311\\0303\\014CY\\226\\312]}{{\\013\\000\\010p\\177\\177\\217\\210M\\323\\314f\\263\\333\\333[\\213\\024\\303\\260\\033\\372\\276o\\373\\366\\330\\266\\255\\357\\373\\335n\\323u\\235&\\255H\\362\\317\\210\\321\\013$\042\\262\\306\\232\\213\\027\\262\\\\\\2556\\017\\233\\327\\257\\277\\370\\313\\017\\177I\\314m7\\000a\\327\\366eY \\242\\367\\003\\013\\327u\\345\\234k\\017m\\341\\312\\256\\037\\016\\207\\366\\343\\207Oe\\331\\324\\365lw8|\\371\\345W\\273\\335\\021\\3218W\\356v\\207\\024\\030\\200./\\326\\233mw8\\360\\375c\\333\\266>%\\203X \\024>\\000\\013!Z\\021D!\\021P\\366N\\005\\342\\212v\\357yz\\267\\354\\346\\336\\000\\000 \\000IDAT\\300(\\326\\323v\\311\\314\\312tA\\240\\312\\363\\024\\250\\326Y!\\242\\224\\242\\342\\325t\\302\\014\\021 *\\350\\236S\\024\\216g^?e\\225\\254\\311\\034\\203\\210\\230\\306%\\201\\247e\\206\\323C\\266\\213\\210\\000\\321Lu\\037H\\222AG\\2425\\326\\200\\344\\203?\\266G@\\211\\301sbN1\\371\\300!\\030$g,\\030g\\234A\\220\\340\\275\\367\\2369\\351z\\340\\034\\207`\\300q\\345\\3456\\002\\347*v\\274\\273\\223@k\\254n\\324\\026\\247\\214\\243\\214\042\\215\\010#\\214\\356\\354\\307\\344\\021F\\210\\234\\212\\252\\004\\304f6\\023\\221\\325jE\\3266MS\\226\\225+\\013\\347*\\347\012\\305\\324\\247\\224\\2060\\\\\\335\\\\\\027eq8\\036\\253\\252:\\266\\355\\362\\342\\302\\030\\273\\272\\\\\\265\\307^\\004\\204e\\263\\331\\324e%,U\\331\\024\\245\\363~\\210\\301?><\\254W\\227Ji\\376\\351\\343\\373\\331\\254i\\367\\373\\302\\331\\335v\\243\\021\\014g\\215\\263\\246\\353\\272\\315\\343f\\350\\332\\207\\373\\373\\024}{8\\370a\\320\\374\\024\\262\\344V\\277\\310 \\214(\\326\\032\\347\\254m\\212\\352\\361\\366\\316\\021\\371\\266\\375\\376\\227\\337u\\335\\020<\\367\\275\\277\\271~m\\255}||\\354\\206\\001\\203\\277{x\\214\\321\\247\\020S\\244\\017\\357\\336\\257V+f\\002\\021k\\355\\320\\035\\357>}\\250\\312\\346\\335\\273w7\\327/\\013\\327\\030cc\\362\\355@\\267\\367\\355f\\307\\307.\\032[\042\\032\\001+$>\\016\\204\\266(*\\000\\001H\\232\\307\\030],\\223R\\204\\237\\333\012y\\202[\\000\\240\\010JB`\\341l\\000|\\246\\250\\362\\023\\036)/\\316\\265\\024d+\\005>\\377 I\\002@\\024\\003D\\026)\\242\\001\\011\\360\\374T\\000\\004\\210\\011\\000\\224\\312N\\220@\\222L\\242\\246)\\036B\\000\\211)EI \\022\\037\\2423\\266r\\205%\\003@\\004\\330\\224\\000\\326$f\\004\\233R\\360Cw8vDT53W\\226\\244\\244o \\014\\210\\220DW\\315\\377\\213\\025\\015\\237\\377\\264\\3636\\233\\343\\202\\314d\\004\\000\\000Z\\326%S\\343\\\\H1\\242.J\\2260\\344R\\021(\\212\\214<&\\247\\335\\321E\\304\\373\\350\\207\\370pw\\337\\314\\353\\024\\370z}3t~1[\\276}\\373\\226cR\\270\\275E\\303\\314\\363\\371\\374\\375\\373\\367\\217\\217[\\346h\\255\\261\\216\\010\\361\\335\\333\\267\\263\\331\\214S*\\214\\355\\016G\\357}]UC\\337__\\2577\\233M\\212p\\330o\\303\\3409\\366\\034\\323n\\3730\\237\\317\\007\\337'N\\306\\030\\000\\026\\322\\252Q&$2\\242\\264lI\\030\\377\\307\\177{\\371\\362\\345K\\343h6\\233m\\367{\\347\\312\\256\\217\\017\\233\\243\\260\\335\\356Zk\\212/\\277\\376*\\304\\356p\\330&\\036\\026\\263\\371~3\\334~\\270\\2355EY\\331\\020\\217\\363\\246\\234\\317\\233fV\\365>\\262\\230\\220(\\004\\023\042\\366\\003\\356\\366\\335\\346\\320\\0235It\\033Bu;t|Y\\005b\\324\\270\\310\042J\\312\\245Y\\356\\234&\\314\\376\\007\\021\\341\\210\\310Q\\337+qL!\\246\\224 EDMp\\215\\207!\\000\\260db\\214\\034\\275\\304\\010\\234\\000\\321\\030c\\214A\\343B\\362\\034\\242b|\\247\\010\\006\042\\002\\032DDc\\025\\\\\\237RJ\\354\\015&\\221\\261\\231\\304\\264\\237\\237\\366\\2033W\\225'\\337\\361\\304\\201\\004\\243y\\2434B\\2228q\\002\\000Brd\\254\\265\\313\\313\\225\\326\\212\\266m{8\\264\\203\\367\\244,\\315\\266\\004c\\255+\\215+\\324\\236N\012\\222 +\\234{\\302\\346\\004\\212r\\270\\343\\004\\001\\2203\\222\\003\\016\\234\\224\\024XM\\231\\361-dfN\\220]h\\316LNBHZ1E\\210HJ\\325\\265\\230_\\224uU\\327\\263\\020\\031\\321TM\\243-\\215\\211L\\344\\030%\\226\\225\\213\\201SJUU\\001\\220\\367\\2760V\\353\\243\\230E[[\\000\\200\\367\\276o\\273\\325\\352\\002\\230\\207\\241\\323\\256\\024\\306\\030\\341\\350\\275\\017aH!\\206\\020b\\312\\315\\270\\206a\\010}\\337\\037\\366\\276\\037RJu]\\027E\\321\\366]J\\251Y4\0422\\004\\257],\\204d\\267\\335~\\3637\\177\\363\\375\\367\\337\\233\\177\\367\\317\\277\\252\\352\\246\\251Jk\\315\\325\\325\\325n\\263\\003\\240\\262\\250?}\\332\\264m\\010!9W\\356v{F\\371x\\373\\341\\361qs\\330v\\034\\223!\\360\\241\\273\\276\\\\-\\226M\\327\\037///o^\\274\\\\\\257o\\232\\371:&\\363\\270\\363\\017\\233\\241\\035(I\\221\\200\\230)\\333\\023\\240\\331Z\\305\\213)\\034\\2145\\270\\301c\\260\\002\\262\\251\\007\\000@4M\\200\\246\\032$S2\\203\\010\\013h\\013J\\310\042\\004\\023[\\305hy\\210\\210p\\002\\355\\200F\\232BE\\3125Z\\332\\2260G\\223s:Fu\\257\\362\\034M(\\210\\023\\321\\363\\323\\343\\334\042\\022zf\\317?\\373\\210\\214\\264\\344J\\364\\242\\233Q\\002\\011\\234|\\350\\203\\367\\303\\320w]\\333\\367\\275HR\\246\\317\\3101D\\357\\007\\337u\\3350\\014\042`\\014\\221\\261\\2104\\232\\0179\\315L\\223\\336\\325\\005\\177\\372Vf\\231\\240\\252Y)O\\020E\\021\\020m!\\247\\230.\\024@&\\300\\024\\274\\000cn7\\312\\302\\242\\225\\354\\233\\307\\255\\265f1\\233\\033C\\207\\375a\\263\\335F?\\020Q\\351\\2545\\316\042\\241\\246\\2408A\\224\\304\\334\\035[\\026\\226\\224B\\014)\\304\\230B\\364!\\004\\237B\\210~\\360\\203\\217\\321\\003\\003\\021\\000K\\212a\\267\\335\\372\\320\\207\\241\\367C\\337\\267\\355a\\277\\337o\\267\\373\\335\\346\\260y\\000\\220\\252,\\252\\262\\020\\224\\276k\\023Gg\\255\\322\\205)\\036\\240\\033\\272o\\177\\361\\213\\277\\377\\207\\277\\277y\\361\\3026\\363\\245@\\272\\277\\277\\357\\206\\366\\365\\027_\\021\\331\\343\\376\\360\\376\\303\\303\\261\\215\\267w\\373\\353\\353\\353\\377\\374\\273\\337\\275xq\\315\\350\\027\\365\\242\\037\\332.\\266_~\\371ew\\334\\277x\\361\\372\\325\\313\\353\\020\\207W_~!\\202\\206*\\2062\\204x8\\246\\307\\315\\260\\333{\\021g\\2122\\205\\000\\220\\353\\366\\247@\\201<\\245AQ\\206M\\236\\244y,)SWC-f\\374\\354\012\\347\\021\\014\\371\\353\\276\\243\\2361\\311\\337i\\352\\001\\316c\\005\\0024\\231)\\312\\355\\005\\004\\230\\004A\\003U\\247\\304\\332(.O\\302\012\\323M\\375\\354mL.\\335\\364\\356\\224\\241\\350\\373\\024B\\322\\314\\005g8\\224d\\332\\003$H\\021\\2008\\006\\343l\\005\\205\\325\\272\\024\\314=\\011U\\327\\202\\310\\304o;\\336\\016\\253\\335\\315\042h\\307\\265-\\302\\302\\242\\021R\\021-\\3763\\306Zka\\342\\220&\\326\\222KB\\020\\002\\221\\244-\\\\\\251\\353V\\253\\325q\\277\\033\\272\\276\\2365\\213\\371EUj\\004mW\\226\\216\\234\\315\\321\\017\\001r\\2660EH\\311\\367-`U\\030\\013\\222\\200\\231%\\002\\263Ai\\017{\\004\\2161z\\337\\247$\\3141\\205\\320\\367mJ\\2119qJ!\\014\\336\\373a\\030\\274\\367\\022\\023\\250\\261>\\014DTTeY\\226\\275\\037\\274\\367e]\\033N\\207\\256].\\227__\\177\\363\\367\\277\\375\\207\\305r)\\014\\366p8\\254\\326\\227\\213\\345j\\016\\213\\273\\273\\007D\\323u\\203\\357\\207\\343\\276u\\0269\\246\\371|~\\177\\177\\277\\272\\\\<n\\036\\213\\322\\274xu\\205\\224\\376\\356\\357~UV.\\004\\177\\261Z\\027\\266\\350z\\177ww\\334w\\233\\273\\207\\376\\341\\261=\\034\\003\\263\\025t\\034\\263M1\\315\\262L\\311\\213\\361_Q\\014\\342\\323\\027'\\027p\\322\\331c\\234\\364\\311\\025\\236<\\236\\304+?\\344\\013\\216I\\233I\\260r\\210\\343L&9S'\\216\\267\\224Ae$H\\254\\315 D{\\017\\235\\226\\315\\371W?\\273\\332\\364\\374\\334\\235Ui\\316\\365\012\\331`@\\034\\261s\\323b\\236\\014\\030\\000\\264\\204\\011Q\\022\\303\\310\\272\\216\\302\\004,\\371\\204\\021\\235\\207y\\000\\307\\372\\303\\323hO\\036\\342\\244\\001\\246\\307\\314?\\315\\311\\373\\004\\0141e\\352\\272\\302\\225d\\2153\\026M\\256W\\007\\261\\302\\274\\333n\\220\\310\\030\\333\\365\\373\\355\\343\\203\\322\\264\\032g\\333#\\021\\221\\237\\315\\224\\372\\310Z[\\024\\225\\226\\301\\202\\244\\244\\337\\222\\200%r\\202\\224\\274Q\042lI\\211C\\364^M\\213\\276\\357b\\214\\211\\003\\307\\024\\243\\217\\221\\231\\243s\\306U\\005\\307B\\022\\207\\020\\272\\256\\023\\004%\\350Pe\\027\\006_\\271\\342\\253\\257\\276\\372\\352\\253\\257V\\253\\325\\340\\3750\\014\\266\\250\\252C{\\254\\252\\352\\325\\253\\027\\364\\346]\\333\\266\\263\\231\\314\\347\\036\\260\\350\\332\\360\\233\\357\\177yh\\333\\365\\325\\345\\273wo\\026\\363\\352\\330\\355\\001\\371\\345\\353\\353>\\364eS\\356\\217\\375\\273\\017\\367\\277\\370\\233_\\374\\364\\346\\016\\260\\330l\\273\\333\\373\\256\\355\\023C\\211\\256H\\311\\246\\024H{5i\\207?8\\213\\027\\360(X\\331\\2248\\311\\250\042\\233U7O\\300\\321)\\3215M\\313(\\307\\011\\000\\200\\011\\225L\\031\\021\\305\\000ft\\376\\271\\220it\\004P\\271\\271\\316\\357\\345\\274/'!\\032\\004\\303\\200\\214 B\\300I\\301\\021\\243\\2753]\\214\\024\\254&\\002\\200\\351t\\201\\263h\\3613\\205\\375\\364f\\306\\377\\015)\\375\\014\\2142\\255@\\026@9]J\\303z\\034\\011\\014(\\026\\013&\\201\\316K\\36248#\\206\\016\\201adI\\310\\325\\343y\\0311 \\024E\\241\\031\\346\\030c\\364)\\372\\036R\\002\\304\\010G\\260\\306\\230\\3028\\353\\2343\\326Z\\353\\210\\250\\037\\272\\242\\252\\014UC\\327w\\355\\000\\000c\\357d\\026\\302\\030\\006\\255\\355p\\316\\225E\\255\\215\\305\\316\\006\\301\\000pJ\\222Rh\\017\\273\\224r\\223cm\\236\\244\\267\\020BH)\\240\\210H\\022\\006\\220D\\006\\215\\261\\321sY\\024\\266p*\\372)%[\\270\\272\\256\\207\\020\\216\\373\\375o\\377\\361\\037\\276\\377\\356\\227\\246p!\\204\\253\\365\\372\\376\\376\\336\\374\\273\\377\\341\\357v\\373]\\214\\361p8*e\\357|q\\361\\370\\260\\265d\\221\\340\\366\\366\\266\\251\\233\\355f\\343\012\\227R\\252\\353\\312\\025\\3244u\\335\\314>~\\274\\363}\\024\\260?\\374\\370\\336\\230\\346\\341\\341\\270=\\244n\\340\\220l\\004\\233\\304\\260 \\241*\\266\\011\\242)\042ZM\\204Z\\3704N\\303\\223\\211V\\266#\\310\\212o4\\2115F\\223\\037E+R9O<\\300\\023\\377_\\355\\351<8S\\356Z\\261\\227d\\254^\\001G\\334\\032\\000\\320Xy\\007Hd\\015\\221\\001\\005~\012\\003\\247q-\\301\\223(/\\216\\274Z0:g\\331\\242xbrLJ\\227S\\202\\021\\341\\215#\\333\\347t\\006d\\241\\303\\011\\\\E\\306(y;\\010\\0003\\032*\\234\\265E)\\242A\\212s[9\\235\\215\\340\\231\\246\\317)\\356\\221o`\\262\\270\\020\\020Q\\367t\\357}J!\\305\\004\\034\\001\\001\\014\\20100\\013\\307\\024}\\010C\\210!\\014\\275\\367\\276\\252\\212\\340\\207\\241o\\201c]\\225UU\\220\\244\\256\\357\\273\\366\\030\\375\\220B\\014\\303\\220B@\\021\\340$)\\246\\350}\\327\\017]\\027\\206^\\377\\206\\256\\035\\272N$\\3050\\004?\\204\\320\\307\\350c\\014)\\305\\304\\236\\203\\327>!\\306\\020\042\\344\\352\\015\\221\\024#\\002e\\010\\310\\330\\325@)\\020~\\363w\\177\\327\\314fm\\333\\376\\352\\373\\357Ed\\263\\331\\254\\327k\\273o\\017\\227\\327\\227\\332\\021\\260\\361\\025\\000\\025\\216\\227\\027\\015\\202\\333n\\367w\\267\\367w\\367\\037\\234s\\303fx\\365\\305\\027\\211\\2030\\206\\010\\217\\357o\\373.\\224\\256\\361\\201\\001\\232\\355>\\335=\\366>BL\\304HQ8qD4h\\0208\\3018\\001\\0049\\367\012\\000\\271\\346L\\000\\306\\035^\\245Ec\\024\\032\\244\\233r~)%3y6O\\015\\006e\\372\\021\\004\\020-\\204\\233\\302\\264\\224\\003X\\343\\371\\352wkRa4\\025\\316$T\\323\\210\\031\\345Oz\\243\\220M\\221\\363p\\365t<\\003\\234\\374L\\364\\360g_\\234\\316\\037=\\000\\003H\\206\\204\\231\\011X\\233\\276\042\\200\\261\\030<\\203\\210F\\326\\202\\357\\373\\336\\330\\242\\022\\262\\272\\241M\\025VSX\\374d\\005a\\366\\006e\\364U\\246\\203\\231\\201\\023\\000\\264\\307}v\\251\\015\\020\\0300y\\261\\211=\\221\\351\\010G\\366z\\022\\335\\037\\017\\340lQT\\306\\230\\241\\353\\321\\220%\\203\\206\\254-\\010\\260?\\0364d\\321i\\343]\\242\\272\\256\\363}\\002\\350\\014fx\\223\\370\\020\\3020\\0141z\\255\\322O)\\011\\247\\371|\\236\\230\\021\\311\\020\042`B\\305\\353\\220s.1G\\237\\312\\262\\264\\205S7\\243\\252\\252\\357~\\365\\353\\303\\341@dg\\263\\305_~\\370\\351\\352\\352\\352j}\\363\\361\\343G\\233x0\\246\\332n\\037g\\263zV\\325\\207C\\373\\307\\177\\375\\003\\010~\\270\\275\\273X^\\206\\330\\177\\361\\362\\353\\335n\\357\\3122\\2454\\204\\210\\006\\377\\343\\377\\375\\207\\213\\331e\\357\\023\\263__\\276\\364!\\036\\216}\\022\\227\\230\\243\\022\\353\\240\\001\\342\\30411\\223\\246\\317\\262\\036\\316}\\333O\\036\\314g.\\326\\344\\005\\322\\310\\316\\243\\377\\032sF\\034?iud-M\\026\\000$\\0210\\360D\\206(\\203\\365\\263\\014?9\\316\\277\\224%\042\\030@1(\\244\\351fQ2\\200\\347\\202{&\\276\\237\\001<\\262\\215\\376\\231i\\241\\331?c`\\362\\005ET[\\203!\\346\\354!\\300\\371-f\\2271i\\344\\206\\005 \\305\\266m\\311\\026\\365|5\\212\\354\\023O\\343s\\333FKy\\264.S\\313\\215\\223bSS\\004\\021SXf\\006d\042\042\\001\\346\\321\\276\\037\\333B#b\\3160\\241\\001\\200\\020#\\244\\350\\273V\\005\\037(\\353\\216\\252\\254\\313\\262\\364>\\246\\024\\232f.\\226\\000\\250(\\212\\355\\346\\201\\210\\010- \\007\\237\\264O\\005\\000\\260\\370\\310Q\\243\\366\\306\\230\\242p V'\\201Y\\311\\266,\\214\\226\\247\\332\\312\\326f\\323K\\341x\\253\\325\\352\\213/\\276\\330l6\\327\\327\\327\\267\\367w)\\245oV+D\\374\\360\\341\\303\\315\\315\\215-k\\327\\015GA~\\334>\\364}\\365\\247?\\375\\360\\342\\352\\372\\366\\366\\376\\352j\\005\\000Ee\\272~\\017 \\326\\231\\303\\341\\000d\\332C$\\232w=U\\365\\222\\250x\\330\\366]\\233\\022S\\360\\211\\301\\200@\\214\\2211\\300\\204}\\0031\\200\\250H\\011T\\006\\030aa\\203$\\243\\337-\\271m\\016\\242\\241\\334X`\\204/\\352\\310Zk\\203\\357!\\227\\341=\\331\\3269%@\\311M\\334\\324\\202$\\003\\200\\022\\231\\000\\004\\221\\211 1\\200VUs\\364^q\\267\\314\\014\\220,\\031\\000\\210\\314\\326\\271\\020\\2431\\326\\026\\326\\017>\\011[\\343\0421\012I\\212\\222\\273\\001)fU\\353\\227\\237k\\337\\311\\231{&[\\347\\332z\\264.FALI\\233/k\\003\\024\\232$\\0361\\206PVU\\212\\022C\\000\\312j\\3179\\027cH#Qy^\\265\042\\210\\330\\367\\201\\317\\216\\311\042\\227\\224\\200H\\265u\\346\\250\\266\\326Z\\353\\207\\016\\211,\\222\\260d9\\262\\326Z\\033\\203\\327\\302\\261\\030#\\247\\200*\\357\\000 \\251(\012c\\\\JJ&M\\314)y\\217e\\365\\370p/!\\331\\252hY\\022GB\\243-\\220\\253\\252JIDRY\\326\\336\\373\\266m\\021\\305:c\\0349\\347\\222\\304\\024=\\216PU\\245oT\\246ju\\214c\\014\\210H\\326\\204\\020\\320\\2203\\204\\210UU-..\\347\\313U\\303\\374\\207?\\374\\341\\273_~\\237R\\332\\334o \\201\\001s\\373\\341\\326\\336>\\336z\\357%\\2106\\263\\332\\357\\367\\213\\331b>\\237\\357\\333\\343l\\266 K@nw\\330-\\353\\231\\037\\270\\353\\323\\340\\241\\254/\\312\\262N\\011\\367;\\337\\0171E\\255t3\012ZW4\\217\\210\\272U\\206Y\\020\\314Te\\364\\263\012\\362<t0\\3051\\364\\205s\\225sz\\376$\\302\\220r\\272k\\322\\221g\\3122cq\\220AX\\271\\\\\\2545\\252*\\\\a\\242\\347\\304\\201\\220\\312\\302z?\\314f5\\221\\351\\373\\003\\010\\211p\\010\\036\\210\\200\\223jPNaT\\266\\177\\275\\021\\325\\177\\345\\201g6\\217\\332R\\247\\267(7\\275Ui\\006c\\225\\2009\\246\\224\\224\\006d\\344x y\\242\\335y\012\\241L#\\202H\\032`9k\\0324\\332\\356\\010\\220\\020\\215\\002kE-\\034\\314$\\020\\347\\341t\\314\\314\\210F\\311s\\231\\031\\021\\\\U\\211$k\\255\\030c\\255UD\\267O\\276\\037:B3\\365LI)h\\346A\\227\\025\012\\211$M\\220M\\2679Q\\340\\361\\330Q@\\357\\3239\\227\\222\\017!\\224e\\271Z\\255\\234sM\\323\\030c\\274\\367\\277\\375\\355o\\377\\362\\343\\233\\345r\\3314\\315~\\277_\\257\\327\\000`]i\\023s\\344t<\\036\\207\\345P\\024\\325\\020\\207\\272\\256\\251\\007\\346\\330\\266mY/}J\\011\\355\\256\\335\\035\\3330\\233\\337X;\\007pm\\333\\355\\017Cb@\\260\\254\\215m\\262\\216b\\200\\010\\302\\000\\314\\302(F\\353\\232\\307\\011\\034e4iG\\217\\321t\\036\\225\\226*\\204Qb\\316D\\377\\314\\034\\034\\235\\302\\\\}\\010\042\\3002\\211\\262AD0\\271.\\344,f\\2476\\317\\340;\\225\\034\\016\\243e,\\214,\\213\\246d`\\302\\364\\313o\\277y\\361\\342\\325\\333w\\357~\\374\\361G\\262\\220\\022\\351\\024z\\357\\205\\031I\\253\\245r\\277\\373\\274`\\344<N\\362_/\\324c1d\\366\\350\\300\\000\\010!\\245\\224\\204\\014\\240\\201\\224LQTU\\203\\306B\\034!\\366St\\231\\247e\\240\\336p\\356:\\225#K\\247d\\023e\\017\\230\\020\\000\\214q\\220\\275u!\\244)\\222\\215\\210Bg\\365\\271D\\002FD\\320\\230\\304\\214\\271\\034\\2168\\004KT\\226e\\273?\\214\\251\\\\\\006\\001\\213\\200\\010\\314\\014\\002<v\\010\\000N\\006\\301\\231\\014\\260\\236\\004W9F\\204rA4\042\\262*EA\\205\\270\\013\\020\\020\\332\\302A\\304\\262,\\225\\273_w\\327\\272\\236\\375\\247\\377\\364\\273\\177\\374\\307\\177\\374\\363\\237\\377\\274X,_\\276\\274>\\036\\333\\242(\\254\\226jE\\337\\375\\364\\356\\003\\242\\275X\\254R\012\\316\\225!\\244\\256\\337w\\203\\267%\\220\\255\\266\\273c\\353\\031\\314\\254\\232]\\370\\004\\376\\330\\035\\332\\236\\023\\242R\\2103\\313\\230\\276\\023I\\004\\220\\220\\221\\223zjOq\\217\\347\\342\\365s\\223\\213\\271 h:'\\257\\3323\\353Y\\2624\\217\\321\\207\\214r\\030\\277%3{\\236\\265^\\325\\351\\025\\000\\020\\315\\350*\\341\\232\\263D\\004\\0229&Y\\315\\312\\357\\277\\377\\376\\365\\313W\\014\\342\\2757\\370\\002!}\\274\\375\\0241%\\016\\314L\\244:^8\\375\\267Q\\317\\343o\\316\\336\\356\\244\\255\\247\\300H\\212\\352\\217\\031`1\\256\\264E%\\332\\322k<GW\\332Y{\\362\\247z\\032a\\322sy\\034\\316\\366=-\\247\\027\\021DCh0\\307\\204\\022\042e\\322(\\320\\32505\\011w\\000A\\004\\231\\301Z\\322\\336\\301D\\010\\310\\306\\232I\\037O\\234*\\347\\373\\204\\352)\\345B\\177f\\2171k\\216\\370\\324\\375mz\\235\\031\\304\\3120\\014EQi\\245\\026\\021\\205\\020\\264\\212\\376\\361\\361\\376\\346\\346\\346_\\376\\345_~\\365\\253_\\015>\\334\\337\\337\\277x\\361\\342\\323\\247OVqB)\\010\\010\\245\\210U=\\033\\272\\036\\304\\222q\042i\\261\\\\\\013\\230\\262\\232m\\017a\\266\\270q\\266\\011\\221\\016m7t=\\013\\032gY@@\\320\\020\\237\\242\\0260\\322^i\\036K\\373\\334\\252h\\262\\212\\026\\214;\\243\\0164\\215@NF \042\\0363\\322\\347*\\371Tq1)\\217,\\020\\002c\\230\\3443Q\\301g\\242'c\\223\\007\\255\\014\\227\\310\\021\\300\\022\\254/\\353\\377\\375\\177\\373_\\001`V\\325\\214\\320\\367\\375\\315\\365\\305\\315\\365\\352\\367\\177\\264o\\336\\337\\356\\217m\\360\\254\\331C\\225f\\034\\263\\2129\\3240\\361\\313\\001\\374\\227kI>?h\\212\\011N\\271\\225\\361\\035\\200\\021jb\012\\347Jc\\234\\017\\221\\231\\005H\\224EL\\303<Y\\357\\25291Y\\355\\232NI\\014<\\272\\316\\220\\251\\021\\220\\222:\\321\\250_\\252=\\014\\325\\310FD\\002\\022\\021%\\216\\202\\\\\\307\\300\\271\\257\\0143\\014!\\002\\231\\262,\\205\\241\\367\\203-*WX\\000\\210\\022\\225;[\\0049FW\\226\\214\\331xH d\\210\\300r\\360\\006\\315\\310L\\231\\213\\201\\263>f\\000@\\026\\025\\007\\365z@\\265\\217s\\246\\252\\352\\252\\252\\030\\300\\307h\\014*\\015\\315v\\273\\275\\276\\272\\371\\351\\3077\\277\\371\\315o>|\\370\\320\\035\\373\\353\\353k\\363o\\376\\371\\033c\\254\\245\\252,\\353\\365\\345\\332P\\261\\337\\035X 0\\367>\\036\\016\\376q\\337U\\365eY]6\\263\\253c\\027\\266\\273\\203\\037\042 9\\347\\000I[\\033YkY->\\0319\\251d\\0343\\316\\351*f\\026`-\\004\\234\\034\\232,d\\023|\\221\\220\\314\\251]\\303\\011S\\301<\\242 \\247fg\\000\\232Q\\227\\321\\332\\311\\274(#\\017\\255\\236\\240S\\253m\\211s\\366\\001\\230#\\002X\\013M]\\030\\303\\257^]\\377\\363\\277\\371\\307\\327\\257_\\336~zO\\010\\263Y}\\373\\341\\375\\333\\267?:\\203\\3277\\327\\344\\214+J\\221\\310\\034Y/\\203\\332\\347!\\257\\232\\351q$$\\377y\\375\\375,\\204\\367\\344-\\030I\\000\\316\\265\\227\\332\042h\\000\\215-\\253\\272\\231\\021\\231\\240M\\014\\317\\\\\\216i\\327\\202Q\\261\\311\\024\\243@To\\020P\\306\\324\\377\\211\\330 \\037\\214\\232\\304\\302\\334]\\356TW&\\200\\306Xc\\254&\\377Sd\\324\\236_,D\\306Z\\307\\314\\203\\037\\314H\\300v\\332\\034\\022C\\214\\246(\\316Ld\\3246\\257\\312\\201;\\362\\237\\210\\300\\271\\2611\\2459I\\004Rb2f6\\233}\\371\\345\\227\\306\\230\\262\\254\\252\\252\\212)\\305\\0305\\366\\022\\243V\\324\\016\\257_\\277\\326\\234\\3130\\370\\305ba\\333\\266\\343\\004\\226\\312\\313\\325u\\345\\252\\276\\3671\\211\\370\\310LC\\237\\266\\207\\226\\261\042S\\0313\\357\\007~\\330\\034\\231\\023\\021\\220!FN\\234\\271/\\003G\\311]\\236T\\353\\344>;8\\262i\\345\\021O904\\311\\362$w\\223\\247\\242\\277S\\367\\246)\\313p20\\237\\212\\310\\004\\203\\206\\247\\033\\231\\266\\233\\032_xR\\243\\201\\006,9N\\241,\\313\\327\\257_\\255V\\313W/\\257~\\365\\335/,\\341\\365\\325%\\260t\\355\\256\\256lU\\277\\000\\226\\273\\373\\273o\\276\\376\\352\\352\\332/\\227\\363\\267o\\337n\\267{E\\261\\307\\317 \\245\\377\\277\\017\\004~\\206-Q\\030*\\213\\220\\265\\314\\204h\\252\\262v\\256L\\302\\351<\\000?.\\000T\\372\\203\\234m=\\2772\042!@\\304\\021\\233\\233\\353\\024\\3444\\011HF\\273x\\010\\000\\242Q])\\210\\310\042\\244\\275e\\014\\022I.\\302\\022M<\\001\\231\\220\\030\\000\\214u\\002)\\244\\210Z\\256\\243\\304\\335d\\330\\032\\006a\\321b\\002@H@Bh\\2000\\206D\\250$\\246DZN\\216\\204\\210\\201c\\306X\\011&\\001@\\343\\312\\252\\231/\\257_\\276\\270\\277\\277\\007! \\352\\373^+\\003\\001 \\204\\340\\275\\2375s\\000@4\\037?\\336~\\367\\335w\\307\\343\\321B\\020H\\020\\304\\233\\262\\330w\\335\\361\\330\\356[\\237\\030\\352f\\356*\\263X\\270\\305\\352e\\347q\\267ow\\007\\017\\000EQ\\020\\2016.WZ_\\021\\211\\203\\207\\321B@\\244\\3548\\213\\010\\310\\350\\261\\222\\3265L\\265\\256g\\302\\227\\373\\377\\002\\002\\022\\212\\010\\013\\353\\033\\247%.\\011\\2200\\003\\272\\025\\025'\\231\\034S\\257\\211\\232\\332e\\021\\255\\376T\\255\\014\\000@2\\346\\372\\364\\033\\023\\033W\\304\\020\\216\\307\\201\\210\\276x\\375r9k\\266\\217\\233\\307\\373\\273\\266;\\020\\321|\\336hIEJi\\271X\\024\\306\\226\\027\\025\\244\\270\\337l\\207\\266\\203\\022S\\224C\\360\\223\\253\\011Sx2O\\010\\375\\177\\262:\\220A\\010!\\227\\274\\343\\363\\005\\011\\200h\\214a\\001A\\260\\205#k\\206\\201E\\320\\373\\341\\231\\262\\327\\177\\247\\340\\303\\244\\244\\031\\001\\204G_\\020\\317\\314\\031\\022\\255\\017\\032_\\310\\276 \\020\\342H\\322\\253N\\010\\032AC\\000\\210\\0060\\002\\013Z\\322\\036\\233S/\\010$N\\301\\307\\030G\\177\\016\\214!\\347\\\\\\010\\032\\331\\310hU\0422\\306\\022QL~\\272C:\\357~\\024D2\\245\\260\\032<R\\024E3\\2538A\\014\\354\\234\\021\\021\\245\\210n\\232f>\\237?<l\\256\\256\\256\\372\\276\\277\\177\\270\\253\\253\\006Q>~|\\377\\355\\267\\337\\232o^\\227C\\327G\\037\\273\\326\\037\\217\\335\\3560\\014\\203D.\\217-\\027\\365z\\266x\\261?\\246\\207\\207\\303\\261\\0374\\347n\\0118s\\003\\003\\010s\\212\\302\\311`n\\266\\232Gg$\\207@\\2031\\006\\021\\226\\224\\204\\2432\\007\\023\\000a\\016\\013\\003\\022\\030Bc\\000QP\\3134\\020\\000\\265\\177\\000\\221\\350W(\\350y\\244UK\\310\\014\\312Y(\\011R\\000]\\345Z\\322A\\350\\2141\\206$%C\\302\\311'\\016D\042\\310\\000\\340\\234A\\244\\024\042\\000\\324%\\021\\310\\337~\\3737\\237>|H1Ve\\321u\\375\\254\\231[S8[\\266G\\037\\243<\\334o~\\370\\323\\237\\356?~\\272^_6E\\371o\\377\\351\\237.\\226\\213\\241o\\253\\312\\014\\203\\027\\000`\\000\\213d\\2146\\364\\004\\000\\343,\\234\\300\\323\\247\\010\\013\\344\\340\\015\\217\\353WN\\357\\242\\302kqd\\031U\\031\\300\\024\\0230\\270\\272Y./\\022\\363\\261\\355\\030\\004A+\\034T\\222IWF\\022N\\314IXF<(\\022\\011\\002\\001!i\\037\\357\\314\\005\012\\200,\\300\\211]UiG\\016c-\\022\\261\\260\\240\\2201)e*WK\\026\\001\\204Y\\323~\\256(|\\333\\222\\265eYv]g\\214\\231\\315f\\303\\320\\263$E\\006j&\\204\\310\\240\\262\\311\\373\\001B\\017\\204\\326\\232\\304\\014`\\014YCf\\350\\216\\246t\\234RU\\225D8\\014}\012\\011\\004\\014\\0213[\\223\\357\\304ZS5\\365\\253\\227//\\026\\313\\375\\366puy\\205\\200C7\\324e\\235B\\004\\226YS\\037v;\\037|Y\\0261\\205\\224\\202v\\3424\\277\\372\\366\\262\\252\\232\\246Y\\220q]\\237\\036\\267\\307\\335~\\330\\037\\375\\342\\342&\\211=\\264a\\267o\\333>(~\\330\\030\\222\\221\\337vR\\0174&\\250'Knb\\252?\\263bs\\330nzw\\234\\302\\363?\\035\\377\\323\\221\\275\\221\\214\\210\\327/\\324`\\337\\251 \\0218!IFjd\\3568\\240\\014\\011\\220\\020\\002\\214]%Ur8JQXI\\234\\222\\274~u\\363\\333\\377\\356\\327$rw\\367)\\305\\024B\\000\\200\\375~\\277\\337\\037\\037\\0377\\234\\300\\030j\\212\\262.\\253\\272\\252\\377\\343\\277\\377\\367\\233\\355f\\271\\\\|\\361\\352\\325\\267\\277\\370V\\331vz?\\210\\352\\177\\305~\\022\\201r\\205g\\030\\367$\\262O\\264\\352)\\224\\250\\221)\\325\\357\\2473\\306\\212.\\0210T4\\263\\242(\\243@J<\\255\\221i\\357\\232>u\\316[r\\322\\334Y\\321\\250\\0364S\\345\\225\\214\\031Y87]F\\260n6\\267G$\\272\\346\\271\\2309\\212h\\0035\\215f\\030cD\\230A\\371\\3715\\214\\222\\243#\042L\\204\\014l\\2541\\306J\\236\\023\\014!\\010\\241sF\\0038\042\\222Rr\\326iGCN\\214D\\312\\371\\015\\210\\266\\260\\027\\313\\213\\272\\254\\267\\217[2\\246\\357\\373\\335n\\2477\\243\\270~\\235\\376\\020\\274\\367\\003\\021*\\255\\227\\275X\\335\\200\\320\\020b\\327wC\\220\\252^\\324\\363\012lY\\327\\313c\\327k\\033Z\\315[\\352\\226^8\\363s\\202\\013\\347\\002}\\236\\0069\\333\\033Oa8\\235\\325\\311\\261\\312Q6\\314Z\\370t\\301\\224\\353\\300\\237\\245\\345\\236\\034gy\\343)\\341\\242\\351\\306)\\213K\\306\\2600\\010\\020\\221+M\\310=\\204\\340\\213/\\276xxx\\330\\357v\\3030TEi\\035y\\357\\217\\307#\\221\\365~\\320\\216\\355\\027\\363\\3710\\014u]\\277z\\365j\\273\\337\\375\\376\\367\\277/\\313\\362\\305\\027\\257\\257\\257\\257\\215-\\214+6\\273\\343\\340\\243\\020\042\\030\042J\\303\\300\\370$/\\230\\177o\\216\\204$\\200\\247\\370\\177}S\\255'y>d\\266(t\\362\\022\\2401\\206\\307\\372\\264g2\\255\\307\\344\\226\\235\\004z\\024\\323i\\202\\364\\230\\344\\036\\307X^\\266R\\230U^\\247\\353O\\036\\0333kF\\203\\231\\325\\303\\323\\014HbRq\\326\\221\\236*\\0314Q\\220\\022[{J\\321\\033c\\322\\321\\007\\224\\242(\\353\\272\\236\\256\\334u]Y\\226\\347w(\\314\\2222i<\042*\\034\\357dM1k-\\272\\214\\325\\030\\000\\300\\0141\\262\\371\\366\\233\\227\\200\\206lU\\327\\313\\371\\305z\\261X\\003\\271\\256\\217\\217\\333\\375\\303fw8\\366Q\\330\\220ED$C\\306\\234\\263\\300\\340(\\246O\\234\\2213\\327\\015\\021@\\341\\271S\\004t\\312\\005f\\363M\\015O\\302\\214\\000\\311]q\\306\\313\\262\\362b\\235i\\036u\\015\\247\\257\\023mj\\223=?\\034E#\\347\\2209\\027\\003[\\243\\205O\042\\302\\221_\\275\\272)\\034\\315f\\325z\\275bN)\\204\\355v\\263X\\314\\230y\\277?t]\\247A\042\\375]\\267\\237>\\375\\364\\323\\033\\026\\276\\271\\271\\251\\352\\352\\341\\361\\021\\021\\321\\330Y=[_]\\277|\\361\\252\\251k$\\024\\000fN\\303@D\\002I3\\372\\223\\254\\235\\215\\315\\331@\\011\\235\\206j\\244!\\315\\314\\016\\230\\331v]=\\253\\352Z\\001i@\\024B\\230\\306\\374\\\\\\224\\317\\245\\231\\237m\\241\\243\\303}na\\343\\0317\\322\\351vDd\\242\\377\\032m\\334I\\361\\247\\224T\\240\\225u\\016\\264m\\253\\241\\310\\011'\\216\\037M\\240\\211h\\252X\\313\\370\\211\\034\\240\\021\\001\\004c\\255\\321RK\\015\\255\\210H\\327ueYi\\017!\\000\\315\\2172\\013#QUU\\353\\365\\272\\264E\\337\\015HY\\2465?\\2577\\334\\367\\275\\000\\314\\347\\363\\252\\252\\024\012k\\214\\261C\\000STU='S\\370 \\307\\256\\375t\\267\\371\\370\\351^\\300\\0161\\262\\240q%\\021F\\026\\021\\246\\261\\327b\\2167\\237\\233\\031z\\234\\322XO07\\372\012\\215\\370g\\030\\303\\307\\243\\324\\303\\351\\204\\374am\\256r\\246lt\\210\\365\012\\347\\213\\007G7\042o\\262\\271\\376\\317Z;\\006Q@\\201\\210\\372\\374\\273\\357\\376\\366\\253\\257\\276j\\017\\373\\252*\012g\\366\\373}\\032\\006\\000\\270\\277\\277w\\316t}\\027cl\\333CY\\226\\306\\320l\\326\\030C\\266,D\\344\\342\\342\\342\\305\\253\\227\\363\\345\\302\\331\\342\\307\\367o\\037\\037\\037q\\177\\210I\\266\\273}\\273?D\\037\\233\\252l\\326\\227}\\333\\016C\\327\\367>/\\305,\\037\\214\\232\\367yB\\213q\\346>\\212VA\\301\\010\\245\\002\\000\\200q\\362b\\214Q\\373\\234(-\\357\\351\\207\\237d\\361\\374\\311\\244\\203EN \\350s\\255L\\237e\\357\\247\\023&\\365|\\276f\\364\\305)\\0273\\026\\0070\\200\\035C\\226\\000\\032\\035\\227\\010\042\\200\\344\\\\\\031\\000\\264\\276\\016DB\\360b\\251,\\313\\302\\225\\30764M\\271\\272\\2744H\\207\\303A\\327\\2571\\2244^\\000\\014\042$j\\342\\032a4\\306\\205\\020\\373\\3363k=\\0352\\003\\221\\311\\274\\226\\202D\\326\\271\\322{\\037#[\\264\\263$\\366x\\014mw|\\330\\034\\266\\273v\\337\\015@\\206\\214sd\\26503\\244(1\\202\\010\\223\\021\\363|\\367\\237v1\\231$h|}\\3024\\302\\231Ipz7W\\331\\347\\264\\236\\214r)rB\\223i\\254\\177\\344Z\\371,z \\272i>\\305r\\234\\002\\020Z\\337\\232\\263S\\256\\260\\027\\027\\027eY\\356v[\\224ts\\363\\332Y:\\036\\213\\202\\260\\252\\213\\273O\\037\\327\\353uY\\326\042\\262y\\334\\205\\020\\020\\315r\\271T\\362m\\015\\240>>>\\336\\337\\337;[\\334~\\374\\024\042?l\\367!@3+\\255u\\006\\245\\260\\264\\230\\325\\263\\272l[\\267\\337\\037\\373\\276?\\017\\267?=\\350\\354\\311SF\\262Q\\352\\000\\311\\270\\022\\215M,\\014\\304\\034\\001\\322\\271PN\042xnE\\374\\334\\343\\317\\330\\331\\232r;\\251\\247Qa\\213\\210VwO\\306\\200&\\253\\365\\004\\355\\251\\360L\\372E\\024\\253\\243;\\267\\022\\331\\210\\210rC\\203$`Tnlt\\316]\\\\\\\\\\264\\355a\\177\\330\\315f\\263o\\276\\371\\306\\222\\371\\364\\351\\223\\202\\375\\233\\2469-\\244\\311\\347\\0250\\306Xk\\367\\307\\303\\361x\\2141j\\271\\212\\336LQ\\024\\011\\344x\\3148\\376\\262,C\\010v\\030\\260\\367\\2019\\034\\332\\376qs\\334\\356\\217\\201\\221\\234\\033\\372\\000d$\\303T\\320h\\3335\\244\\350{|\\252#\\363\\020\\217\\314(O\\226\\276\\216\\365S\\233\\344\\244<\\246\\2419\\237\\030\\215\\\\'\\025u\\321\\356$\\317\\276)\\327\\324\\215I\\340'\\212\\034\\224\\247C\\273`*\\236\\030\\210H\\300\\324u}qq\\201\\210EQ4U\\361\\376\\375\\373\\262\\260\\363\\371\\254(\\2127o\\336\\224\\316j\\035\\362l6c\\211\\211\\303\\320\\267\\336\\367\\253\\325:\\306h\\234\\335\\037\\017\\267\\267\\267\\307\\256m\\352\\331/~\\361\\213?\\376\\353\\237g\\263\\312\\271\\362\\372\\346\\345l6k\\333n\\263\\331<>\\334\\275~\\375\\232\\024T(i\\030\\206\\224\\242JCF\\032=\\251\\216\\001x:\\224\\222I\\005P\\035\\014U\\317\\352\\017\\020Q\\322N\\3321\\235\\013\\364df\\234\\313\\372\\223\\025\\362Y\\350z:\\210\\236(\\002\\030U\\373)\\002\\230\\322t\\362T\\3412IsV\\363\012n\\220\\211=X7C\\0141j5\\241^S\\013\\310\\257\\3267_}\\363\\365\\376x\\340$\\206lY\\026z\\347M\\323\\244\\024\\230#\\032\\213\\210\\242\\013O\\341\\257\\3113\\307\\276o\\273\\356\\010\\000)\\225z\\237\\271\\025'B\\032\\035-\\035%\\333\\314.w\\307\\303v\\273;\\264\\335\\3768\\364>E\\000\\213\\006\\215%\042\\006J)%N \\222\\230Cb\\262D\\275VvT\\000\\000\012\\373IDAT\\360\\\\\\015\\000d\\364-\\234\\0114\042\\002\\347\\372\\212\\317\\344\\377L>\\247|\\312\\231W\\227\\015\\014MAAb\\226\\023+\\370\\023\\203C\\236)\\271\\247J\\013\\310\\030\\000f\\211\\302<\\014\\3030t\\273\\307\\207\\020\\374W_\\274\\352\\373\\366j\\275\\212i\\230\\225\\257\\212\\242\\010~\\370\\364\\351S\\337\\367/_\\276D4\\213\\305\\202\\320\\206\\020\\336\\274y\\243e\\227\\307\\343q\\273\\335Zk\\377\\374\\341SQW\\327\\327/X\\304\\3738\\364mY\\330\\233\\233\\365\\325\\325z\\267\\333\\304\\310\\306`\\341\\254u\\306\\017jH\\213\\265\\3449\\216dyO\\022=g\\322\\234\\177\\201B\\214\\000\\210\\254\\023\\300\\310\\311\\232B\\215.k\\255\\3779\\201>\\267\\020\\236_\\026d\\332(\\316\\365\\272\\232\\255\0422\\321\\212B6\\213\\315\\024\\353\\230\\226\\212\0421\\264\\365\\211\\326VM\\327\\001\\000\\255[\\033\\363eZ\\017\\301D\\004`N\\321(\\021\042*\\313r\\275^\\033\\343D\\260,\\313\\246\\251\\021Q\\021\\333:\\211\\032\\304\\240\\014\\326E\\0219\\034\\016\\332\042V%8\\214\\207\\006\\221\\311Ye\\343\\325Hb\\3234\\366as\\034|\\350z\\336\\035\\372\\301'cKR\\224\\032bH\\302\\034@;k \\202!!!Tn\\344\\223\\261Ec\\201\\361i\\3242\\223\\011\\013\\2625&\\347\\274\\247A\\317\\010$=\\361$\\210j{@.\\202C\\035_\\030]@\\312\\354\\312\\0112*\\032@3\\352y\\034\\031\\000x$]\\322n\\322\\352\\010\\253+h\\254%\\242\\273\\273;\\022\\250\\252\\362\\217\\177\\374\\323\\227_\\276\\374\\372\\353\\257/V\\363\\335\\375\\343\\303\\303\\303\\367\\277\\374N\\331\\266c\\214}\\357\\037\\036\\036R\\024\\347\\334r9_.\\347\\333\\375\\341\\342\\342\\342\\253/\\277>\\036\\217w\\367\\017\\333\\355\\276m\\373\\256\\017JI\\360\\227?A\\263pm\\033\\226\\313:F\\036\\206\\241i\\232\\276m5BVW\\345\\3610XK\\326Y\\026\\364\\336\\203 \\345\\260\\227\\344\\330\042\\022\\031\\313I\\200\\023\\000AQ\\024U-\\271\\030\\033\\2430\\032kI\\224\\376\\020\\316\\234\\026\\000\\320-Xu\\347$=g\\022|R=O\\354\\204\\3212\\236V\\205\\265\\266(\012\\357}Y\\226J\\227o\\234K!D\\357\\253\\305B\\331\\024\\312\\262t\\316\\251_\\350\\234;\\036\\217d\\213i\\223T\\343\\034D\\000\\010$\\245\\224\\327\\230\\376\012f>\\036\\217\\257\\355\\027\0422\\004\\377\\260y\\214)\\364~(\\013\\2537OD)x\\001\\375\\270\\250\\263H\\326\\034\\217\\307\\230<\\031\\250\\252\\002I\\016\\207\\235Z\\027EQ0\\200RG\\327u\\255\\305\\341v\\273;\\016!\\264m7\\370\\344c\\002\\0224\\2269\\031W\\236U\\021\\253\\315\\017\\331\\2448\\323\\304O\\255\\211\\2379x\\252\\321\\370\\271#o\\300\\212/\\322\\307\\363PW~\\246\\265D?\\343\\372\\214\\363\\361\\304\\360\\320#F%\\373RQ\\261\\3169\\000IIR\\212\\263YSU\\305|>\\337\\355v\\373\\375\\316\\267G\\245(^,\\026\\353\\365z\\267\\333\\035\\016\\255\\2108W\\224e\\311\\314EQl\\267\\333\\313\\313\\313\\256\\353nnn^\\277~\\315\\314`\\354\\343\\343#3\\373\\020nn.\\310\\200\\237\\373n\\030R\\030\\000\\240\\335\\267Ee\\332}\\232\\315\\014\\307h\\0358g4\\223\\346\012\\243\\016\\242\\367\\003\\210P\\306\\205\\010\\307\\010\\200\\000\\004\\2660\\256@2B\\352\\036\\010\\203\\234:]=\\335\\030\\237\\214\\325\\3230\\\\~~\\202+=Q\\253r6s\\223\\262\\327\\260\\235r\\006TU5\\014\\003\\032c\\313\\222s\\001\\321\\311\\346\\316\\323\\247\\325+\\343\\266\\222\\313\\330\\000\\247\\000\\217 \\013$\\020# !\\204\\276\\357g\\263\\331r\\261B\\304\\246\\231\\317\\232yQ\\024 <\\242\\373G\\013\\336\\020\\216\\354\\005\\205u\\303\\3201\\237x\\032\\214\\305\\251\\216A\\303%\\254=\\300\\265\\365\\367\\356\\320\\206\\024\\275\\0171\\011H\\256y&$d\\311\\177p\\0260\\226\\034c\\320\\327E\\236\\330\\023\\223\\312\\2251M c\\370\\014\\2631}\\022\\270sb+\\031\\243x(9\\373\\235\\303\\231\\254\\325J'\\326\\216\\334\\231\\376\\214_f\\034A\\2754OY4\\021\\311lZ\\244\\350s\\253em\\220\\340x<r\\214\\367\\367\\367\\263\\246\\2121\\260\\037\\\\a\\010\\344\\355\\333\\267\\357\\337\\177\\354\\373\\036\\301\\\\\\\\\\\\\\210\\340~\\177\\254g\\025\\261\\321l\\331c\\267\\361\\336\\177\\377\\375\\367777\\312\\006\\373\\366\\355\\333v\\350\\211h6k\\232\\246\\021\\204\\343\\376\\320\\366=\012\\314\\227\\213\\277\\374\\371\\307\\237\\336\\274\\333\\035\\007W\\222\\357C\\256\\3163\\250]\\217\\235%\\311\\345*\\271N\\015\\020\\3019[\\226\\306:\\314\\316.1\\260\\246\\353t\\240\\350\\331\\202\\177\\346\\215\\234\\035\\223\\026\\237l\\022\\034\\343\\312S\\274b:gR\\336\\326\\332\\276\\357\\225\\246H5\\261\\246\\006\\3613\\233[\\306*\\0368\\225')\\303\\002Op(\\275&\\241\\010\\213\\367\\375\\261\\335\\357\\367\\373!\\006H<\\014\\003.\\027DD\\200\\326\\022sdfN\\021\\246^\\246!\\016]\\317.\\035\\216\\373a\\350\\020\\321{6\\006\\255%\\037=3\\013$\\343Jk\\011\\200C\\360)%\\347\\2341\\345*\\206\\024\\265\\006\\333d\\340\\325\\371B\\027\\311<[\\343 \\346W\\236\\215\\351\\270R\\237\\034\\250-&&8\\350\\331p\\344e\\235\\237\\321\\031\\364H5\\307\\230c\\300)\\327\\010HBz\\033J\\356\\210\\210\\204\\243\\264?\\3377\\000\\3009\\207$\\323\\342ff\\000\\255\\036gC\\330u\\375\\253\\227/\\211\\260.+\\357\\375\\254i\\000\\344\\342b\\265^\\257g\\263\\2711\\006\\221\\232\\246\\0111\\334\\337\\337\\017\\203\\257\\252\\252,\\312\\373\\373\\373W\\257_\\317\\347sm\\021\\262\\335n_\\274\\270\\336\\355\\367\\313\\213y\\214\\001@\\014\\331\\253\\365\\372f}}8\\036\\257\\257\\257\\276\\371\\346\\233\\227/\\327m\\333\042$@ \\022BL)\\305\\230\\000X\\233\\263\\033c\\300\\030A\\002\\343lY\\271\\242\\002c\\224\\351_F*\\217\\317}\\225g\\307\\3476t\\266\\276\\360\\364\\326\\244e\\237}d\\352D?\\351u\\265\\260\\325tV\\351\\237V\\302\\363\\305\\243VMN\\017\\210(\\036O\\022\042\\000&V\\246L2\\002\\212\\347\\260\\277\\376\\3767w\\017\\217\\222\\322ju1k\\232\\337\\377\\376w\\0100\\245\\300X\\247\\036\\015\042\\026\\256\\250\\252\\212%=<\\334y\\037\\210(%\\355\\272I]\\327\\212\\232\\261 EQ:\\347T[\\031cl\\357\\203\\2100G\\335\\273\\231Y\\220G\\375\\232Eg\\354\\2126\\015\\031\\312y\\241\\353\\350\\377\\351\\263\\347\\2025I\\347\\323\\321?_\\356\\347R\\236\\230al\\351\\015\\271\\337\\022\\216\\302\\257q\\272\\374\\255\\010B2\\252~9\\361\\354\\313X\\016M\\306\\001S\\014!j\\212\\325\\271\\345r\\231\\374`\\014V\\205+K\\007\\032\\226\\267\\366\\372z}\\261\\234\\277\\177\\377>\\370\\004\\222\\234+\\235\\303\\335n\\337\\266\\333zV\\315\\347\\363\\327\\257\\277\\254\\252\012\\201noo\\233jf\\311\\315\\352\\306\\030SV\\305l6[-\\227\\363\\2729\\034\\016~\\360\\306\\270\\355\\343c\\357\\212\\322\\331\\272\\256v\\333\\375\\315\\372\\362\\365\\377\\374?\\375\\360\\303\\017m7\\364}\\037#\\267m\\273\\331\\355\\373^\\353^\\015\\201\\035[\\015[%\\366\\324\\242EA\\222\\224q\\317\\002\\230\\003\\363O\\005wz\\362,Dx\\376\\372\\271@O\\343\\217\\237\\035\\252\\024\\264\\330\\211\\231C\\010UU\\351\\276\\257\\022Cc\\375\\262&A\\000\\300\\030s\\342\\364\\036\\361\\005\\222\\313\\250\\316\\356\\007\\363\\016\\023\\302\\320\\266\\275snp\\271\\013TJI\\221\\002,\\321\\030\\002\\260)%I\\234\\375\\007\\225G\\024c\\321X\\224(\\314)\\306\\020\\202\\317\\331\\370\\004)\\005\\021\\2475\\266!\\210\\2251\\267DD9\\3320\012\\334t\\247\\272\\203\\347x\\205y\042\\262\\247\\001\\202\\323Vxz\\324\\324\\312_\\317[\\237\\217\\257\\376\\362\\323\\0028\\255\\004\\316o\\001*):\\214\\021\\326sC\\360\\331t\\252\\342\\001\\000\\355g#\042u]\\277|\\371\\222\\203\\337\\355v\\300\\351\\353\\257\\377f\\350\\332\\272\\256\\3230\\314\\347\\363\\302U\\353\\365\\272\\357\\374\\335\\335\\335v\\273_,\\026M\\3234M\\02396M#\\202]\\327um\\177qq\\241#\\263\\335n\\325\\357\\276\\277\\277\\027Iww\\237\\234s\\316R\\212\\361z}5\\014C\\214\\361\\376\\366\\256jj\\315o}\\375\\305\\227\\207\\256\\035\\206\\001\\3200\\363f\\263y\\363\\356\\303\\335\\335\\026X\\022$\\355=B\\306\\010\\2206bQ\\205\\361l\\354&\\223\\343\\231\\237\\007'\\342\\207\\347\\307\\024H>\\237\\027\\021Q\\005|\\376\\226\\212\\201*ce\\027\\300\\3215WG\\360\\374\\263\\372\\3349\\3079Fq\\222]\\235#fF\\022\\365\\345\\001,\\231,\\\\\\037\\357nC\\01012\\353\\026\\212'\\243\\021\\021\\211\\324U\\315;j\\2141\\245 \\2421.F\\304\\304a\\030D\\177\\224\\336\\177L\\336{;\\345\\306\\355t\\252\\356\\034\\252\\374\\211\\0108\\0013j\\027\\003~\\302\\217\\375\\371\\346\\016O\\345\\373\\3544\\015'O\\021\\251\\237\\011\\341e\\271\\377k\\307\\370u\\2318FSV\\240[\\301\\323\\264\\3054\\307$p\\326\\346P\\367\\331\\030\\243\\265\\366\\342\\342\\302\\002\\335\\335\\335\\031\\220\\261\\2053\\247\\224>~\\374\\270\\230\\315\\367\\373\\275\\206\\220\\346\\363\\371|\\2768\\036\\272\\355\\356q\\265^\\335\\335\\335}\\372t\\3274\\215\\263\\305\\353\\327\\257\\177\\370\\341\\207\\020\\002\\0210\\363\\352\\362\\002\\000,\\231>\\204\\030B\\3234\\205u\\037\\336\\275\\275\\277\\277\\177\\365\\352\\325zu\\211\\206\\266\\333mb\\227\\022\\033\\203UUh?\\316\\272.\\235s\\213\\305\\342\\323\\355&D\\0262\\326\\025h\\\\\\024`V\\016}\\006U1\\224;\\303\\344!}j\\033\\374\\254\\366\\325#\\377\\374\\263\\323&\\313a\\272\\202~j\\022e\\225\\022\\005\\261\\020\\221\\306:\\324\\375P\\363\\372\\231\\006!\\312\\375D\\307rH\\034k\\207\\230%Z4\\230\\203\\323'!q\\316\\315\\346\\363\\020\\202v\\256\\000\\000\\005\\232&\\326\\035`4\\224\\020SJ}\\337{\\337\\262D\\346\\010\\300\\210&\\245\\220 !\\201\\367\\203\\366K\\016!\\000(5\\236 \\242=\\377%\\372\\\\#\\275\\006\\317\\266\\2473\\351\\322\\356\\276\\237\\013\\3649\\250\\367\\354\\305\\323\\376\\370L\\243\\377U\\011FTk,\\177|\\3723$\\222\\013\\361G\\204%\\0103\\345\\355\\357<\\205\\226-~\\315\\360\\001\\200\\265V7*\\000P\\250\\356\\372\\372\\346\\341\\341\\341\\352r\\325\\266\\355\\262\\236\\275}\\367\\006\\005RJ\\313\\3452\\306\\270\\335\\036>~\\374X\\270\\352\\365\\353\\327\\207\\366PU\\325\\257\\177\\375\\353\\305b\\261\\335\\354\\266\\333m\\337\\373\\353\\353k\\021\\331\\357\\367\\375\\320-\\227s\042\\272\\274\\274l\\333\\303r9\\337\\336\\355\\256./\\227\\313\\345\\207\\017\\037bd\\000h\\3463\\024\\2101Z\\242\\200\\322\\367mb \\242\\331\\2546\\205\\353\\007\\356z\\037\\005\\254+\\004M\\364ID\\220P\\342\\331f\\365d\\340~&\\324\\243\\277\\353\\331\\310\\353s\\343\\3149\\204\\003F\\3056)`=w*_U\\212:e\\352\\327\\340nY\\226}\\337O\\353d\012\\327B&\\015A\\244\\\\2\\214\\360\\004w\\203$\\3108u\\032\\001d\\021>\\034\\016\\032\\321_\\255\\346\012:WIS\\240\\211\\214\\365\\205z\\207}\\337\\247\\024\\246\\215\\310Z\\253\\300k\\347\\\\\\337\\015EQ\\320X\\000/c\\302\\362\\377\\001NIU\\225\\016\\376\\034\\350\\000\\000\\000\\000IEND\\256B`\\202 www.murrayc.com 1 Yodda Yossarian Italy Yodda Yossarian \\211PNG\\015\012\\032\012\\000\\000\\000\\015IHDR\\000\\000\\000\\002\\000\\000\\000\\002\\010\\002\\000\\000\\000\\375\\324\\232s\\000\\000\\000\\003sBIT\\010\\010\\010\\333\\341O\\340\\000\\000\\000\\013IDAT\\010\\231c`@\\006\\000\\000\\016\\000\\001\\261\\232\\352\\006\\000\\000\\000\\000IEND\\256B`\\202 2 Mook McMookity Germany Mook McMookity return record["name_first"] + " " + record["name_last"];
        glom-1.22.4/examples/example_project_manager.glom0000644000175000017500000214431212234776363023361 0ustar00murraycmurrayc00000000000000 3 Bob McBob Mr Germany Bob McBob 4 Yadda McYadda Mr Italy Yadda McYadda 5 Jane Doe UK Jane Doe 6 Jo JoJo USA Jo JoJo 7 Aardvark Example UK Possibly a made-up name. Aardvark Example 123 1 Yodda Yossarian Italy Yodda Yossarian \\\\211PNG\\\\015\012\\\\032\012\\\\000\\\\000\\\\000\\\\015IHDR\\\\000\\\\000\\\\000\\\\002\\\\000\\\\000\\\\000\\\\002\\\\010\\\\002\\\\000\\\\000\\\\000\\\\375\\\\324\\\\232s\\\\000\\\\000\\\\000\\\\003sBIT\\\\010\\\\010\\\\010\\\\333\\\\341O\\\\340\\\\000\\\\000\\\\000\\\\013IDAT\\\\010\\\\231c`@\\\\006\\\\000\\\\000\\\\016\\\\000\\\\001\\\\261\\\\232\\\\352\\\\006\\\\000\\\\000\\\\000\\\\000IEND\\\\256B`\\\\202 2 Mook McMookity Germany Mook McMookity 0 Murray Cumming Mr Falschstrasse 123 Munich Bavaria Germany D-80798 1973-05-11 Murray Cumming \\\\211PNG\\\\015\012\\\\032\012\\\\000\\\\000\\\\000\\\\015IHDR\\\\000\\\\000\\\\000\\\\360\\\\000\\\\000\\\\001@\\\\010\\\\002\\\\000\\\\000\\\\000\\\\015\\\\212f\\\\004\\\\000\\\\000\\\\000\\\\003sBIT\\\\010\\\\010\\\\010\\\\333\\\\341O\\\\340\\\\000\\\\000 \\\\000IDATx\\\\234\\\\304\\\\275\\\\333\\\\256$Ir ff\\\\356\\\\036\\\\021y=\\\\227:\\\\247\\\\352TuW\\\\367ts\\\\206=\\\\034.\\\\207\\\\344R\042H\\\\002\\\\242\\\\010\\\\351\\\\201+a\\\\005\\\\001\\\\202\\\\004A\\\\300J\\\\330\\\\027}\\\\201V\\\\372\\\\017\\\\351\\\\013\\\\364&\\\\010\\\\320\\\\003\\\\337EA\\\\334%\\\\227\\\\344\\\\354\\\\222\\\\273\\\\340r8\\\\354\\\\231\\\\236\\\\276Lw]\\\\3175O^\042\\\\343\\\\342n\\\\246\\\\207\\\\210\\\\214\\\\214\\\\214[F\\\\236jI\\\\336\\\\247\\\\2632-\\\\334\\\\315\\\\315\\\\335\\\\315\\\\315\\\\315\\\\315\\\\315-\\\\360\\\\037\\\\375\\\\367\\\\377\\\\033\\\\000`-e\\\\300\\\\342\\\\321\\\\366\\\\247\\\\242\\\\362#\\\\330$\\\\245\\\\024\\\\224R\\\\371Q#\\\\220\\\\210\\\\2723\\\\364\\\\306\\\\223\\\\177\\\\027\\\\221\\\\266<{\\\\221\\\\264\\\\321SF[\\\\311_\\\\374\\\\254\\\\364U\\\\231\\\\214r\\\\021f\\\\256\\\\344\\\\354\\\\316\\\\277\\\\227\\\\236\\\\376Mk\\\\243\\\\277N\\\\017\\\\000\\\\000rc\\\\275m\\\\364T\\\\2207V\\\\275\\\\233S\\\\232\\\\200\\\\255\\\\245*\\\\355-\\\\200\\\\025\\\\270l\\\\222.\\\\010-X\\\\271\\\\014)\\\\303sH\\\\215\\\\364n.\\\\354`\\\\254\\\\236\\\\375\\\\2767O\\\\031\\\\270w\\\\274{\\\\316\\\\231\\\\372\\\\323\\\\275CU\\\\251\\\\275\\\\317\\\\204\\\\021\\\\221>\\\\355\\\\355\\\\310P\\\\374l\\\\233xm\\\\220\\\\326>l!\\\\240\\\\215\\\\260r\\\\023\\\\372\\\\365\\\\325\\\\376\\\\011\\\\331\\\\226\\\\241\\\\334\\\\306z\\\\3033\\\\270.OP\042*\\\\263oQrg\\\\02271\\\\350\\\\203\\\\231\\\\373a\\\\014\\\\267\\\\013i\\\\356\\\\240C%t[j\\\\2433\\\\353\\\\307\\\\275\\\\324V\\\\350)\\\\367~\\\\366\\\\275\\\\302\\\\350\\\\017f\\\\350\\\\356lm\\\\300\\\\306E\\\\243\\\\203\\\\376\\\\275\\\\204\\\\355\\\\315\\\\237u\\\\300\\\\241b\\\\245\\\\255\\\\267a\\\\263\\\\312\\\\025k\\\\235n\\\\224\\\\307\\\\225\\\\237}\\\\030zoG\\\\037\\\\232\\\\341\\\\301x\\\\372g\\\\333\\\\313\\\\364\\\\337\012\\\\236\\\\236\\\\353UOz\\\\372\\\\224=\\\\210\\\\324\\\\332g\\\\203\\\\244\\\\357 \\\\346@\\\\361|\\\\330\\\\212\\\\327\\\\221\\\\255\\\\2622\\\\024\\\\222BC\\\\241\\\\203f\\\\017\\\\020 \\\\343[\\\\312\\\\331W\\\\000\\\\000\\\\001\\\\021\\\\245\\\\306\\\\270\\\\3659\\\\335Aee\\\\222\\\\325\\\\347\\\\\\\\\\\\343,\\\\254/\\\\312\\\\207\\\\212\\\\306n`\\\\317n\\\\255g\\\\356\\\\256\\\\256Q\\\\242W\\\\306\\\\262Qf\\\\367\\\\220p\\\\015:eG\\\\275}\\\\246M\\\\333*\\\\324MI7\\\\266\\\\216\\\\022=1Wp\\\\366l\\\\270\\\\256\\\\020T\\\\225\\\\3075`\\\\237\\\\006\\\\364\\\\351\\\\232\\\\007K\\\\350:\\\\260QH\\\\364\\\\344\\\\373\\\\016j\\\\273\\\\363\\\\324u\\\\342J\\\\215\\\\035\\\\235\\\\320\\\\306\\\\320\\\\017\\\\240\\\\344\\\\335\\\\273q\\\\347\\\\223v\\\\330\\\\246\\\\215\\\\3166\\\\344\\\\337\012\\\\375}(\\\\207\\\\226\\\\355\\\\307\\\\316\\\\246\\\\260\\\\200V\\\\332\\\\331\\\\310\\\\342\\\\365/}\\\\030h\\\\257,\\\\177\\\\300\\\\360\\\\024_\\\\333\\\\210<\\\\010sc]\\\\215e\\\\333V\\\\222C\\\\353\\\\335\\\\333'\\\\325\\\\342T\\\\231\\\\000u>k\\\\034\\\\210f`\\\\206\\\\241\\\\364\\\\231\\\\345a\\\\000\\\\300\\\\315\\\\376\\\\260XS\\\\233\\\\351\\\\3012\\\\362*\\\\223\\\\265\\\\266\\\\342@!Xg\\\\337\\\\212\\\\252\\\\\\\\\\\\344\\\\251J\\\\350\\\\362g#O\\\\327w\\\\323\\\\035\\\\023\\\\264Q\\\\242w\\\\267\\\\341\\\\360<\\\\333\\\\241j\\\\224(\\\\357\042\\\\303\\\\240\\\\335\\\\274X\\\\356\\\\307>8\\\\013<\\\\005a\\\\215\\\\005{\\\\010\\\\370f\\\\374\\\\335\\\\222\\\\376\\\\020A\\\\2705/6N\\\\346\\\\216\\\\342\\\\207N\\\\316C\\\\263\\\\325\\\\333X\\\\257\\\\261kSX\\\\347\\\\022(\\\\331}+\\\\004\\\\021Qc}m:\042\\\\264*\\\\315\\\\315\\\\343\\\\324(\\\\377\\\\240\\\\335J\\\\320m7\\\\255\\\\347oc\\\\202\\\\306\\\\211Q\\\\267\\\\2036\\\\016L\\\\271\\\\275{U\\\\213n\\\\021U\\\\306\\\\332A\\\\355\\\\303\\\\360\\\\267\\\\361n\\\\271\\\\231{'vGz\\\\000\\\\2437j8u\\\\306\\\\250gk\\\\220\\\\320\\\\035\\\\204\\\\342\\\\356\\\\032\\\\267W\\\\372v\\\\364{;'u\\\\251(\\\\335\\\\335qh\\\\347v\\\\024\\\\351\\\\036\\\\203>\\\\355\\\\352\\\\300\\\\177\\\\350\\\\322\\\\264\\\\363\\\\350\\\\241\\\\375P\\\\023\\\\034\\\\275\\\\026\\\\226>\\\\360\\\\275\\\\231\\\\0370.\\\\017\\\\316\\\\257\\\\031\\\\26792;\\\\006\\\\344_v\\\\200\\\\305'\\\\311\\\\001\\\\343\\\\321\\\\221\\\\363a\\\\014\\\\335\\\\224\\\\277\\\\257\\\\336\\\\326R|\\\\217\\\\212\\\\32260}\\\\276\\\\177[\\\\220:C7\\\\026\\\\351\\\\300\\\\326\\\\235\\\\2771[\\\\377\\\\001\\\\335KC\\\\343\\\\222\\\\333\\\\223\\\\274C\\\\363\\\\267Z9`\\\\267\\\\015\\\\305g\\\\031M\\\\275\\\\315\\\\335\\\\266\\\\225\\\\306\042\\\\3753\\\\274c\\\\346nz\\\\276\\\\025\\\\311\\\\335\\\\235\\\\277OE\\\\017\\\\346\\\\376\\\\216=CO$u\\\\370\\\\241\\\\023u/\\\\302\\\\203Ju\\\\254!\\\\035\\\\360\\\\006\\\\206\\\\206\\\\3320\\\\327?\\\\333\\\\252\\\\337\\\\233\\\\352jt\\\\177q\\\\322h\\\\272\\\\256\\\\350\\\\364\\\\035\\\\305\\\\373\\\\320S/{\\\\320@\\\\326\\\\037\\\\365\\\\267\\\\243\\\\267\\\\001\\\\373`\\\\250\\\\037@\\\\326\\\\213\\\\364i&\042\\\\002\\\\310\\\\306\\\\312\\\\201\\\\345\\\\325O\\\\204\\\\241Z)@\\\\327^E\\\\312\\\\331J\\\\005{\\\\355mz\\\\262S=5[9ps\\\\234\\\\010unn\\\\331\\\\334\\\\364\\\\344\\\\351\\\\007\\\\013\\\\2446\\\\326o+\\\\373\\\\355J\\\\350nl\\\\357\\\\276\\\\372\\\\037\\\\204\\\\341\\\\240~\\\\350\\\\206\\\\324\\\\206\\\\214\\\\353{\\\\244Cedw\\\\316oKB\\\\267%]G\\\\324&\\\\225\\\\037\\\\260\\\\372wdk\\\\343\\\\244\\\\356\\\\023\\\\304o\\\\267s\\\\273)\\\\254\\\\377\\\\354/V\\\\373\\\\027):\\\\274\\\\222\\\\241U\\\\205@,,k\\\\355\\\\225\\\\326auq\\\\300\\\\2739\\\\245\\\\314\\\\342u!rh\\\\333\\\\017e\\\\342\\\\275KJ\\\\317\\\\252uY\\\\030\\\\227s\\\\267\\\\231\\\\245\\\\3328\\\\340\\\\333c\\\\350\\\\346\\\\366\\\\264#\\\\2546\\\\351\\\\240\\\\216(-\\\\251\\\\207il\\\\335#\\\\335ML\\\\031\\\\330\\\\307\\\\215v\\\\373\\\\023\\\\031\\\\000\\\\263Y\\\\360.\\\\225\\\\026?\\\\233\\\\026U\\\\312x\\\\275\\\\247'`\\\\237\\\\036\\\\333\\\\315\\\\363\\\\256\042\\\\251;\\\\177\\\\307Ia\\\\245\\\\244l\\\\2634\042\\\\025\\\\241\\\\372\\\\250\\\\357\\\\024k\\\\246\\\\240\\\\322q\\\\245z+\\\\015\\\\200]2\\\\366\\\\010\\\\327\\\\236\\\\254\\\\331_B\\\\367U\\\\036\\\\250\\\\302\042\\\\215\\\\276>\\\\345\\\\307\\\\256\\\\236!\\\\363\\\\237\\\\201\\\\206\\\\316\\\\317 ;\\\\256\\\\347M\\\\370\\\\3673G\\\\331\\\\023\\\\263\\\\004fD\\\\254\\\\034\\\\267m\\\\230\\\\242\\\\255?\\\\233\\\\005\\\\0373W \\\\365\\\\266\\\\354\\\\322\\\\323\\\\354\\\\207\\\\335\\\\236\\\\232\\\\307E\\\\327\\\\307\\\\257{\\\\214i\\\\237Y\\\\255\\\\002i\\\\313\\\\363m-\\\\345\\\\007\\\\341\\\\354\\\\250b/\\\\375\\\\275\\\\3519\\\\240\\\\322\\\\007@\\\\366\\\\266\\\\253\\\\217X\\\\205\\\\2265\\\\035Qe\\\\342\\\\371a\\\\251\\\\261?\\\\313\\\\335X_\\\\371\\\\213\\\\324\\\\363BC\\\\033\\\\376\042\\\\035\\\\314\\\\320\\\\330\\\\303[\\\\352P&~\\\\360\\\\022Y\\\\241\\\\266\\\\377\\\\262\\\\325\\\\221\\\\263\\\\247\\\\204\\\\356\\\\357\\\\374\\\\324\\\\237\\\\200\\\\207\\\\361z7\\\\376C'v\\\\031X\\\\264\\\\261s\\\\222t\\\\365\\\\303\\\\203\\\\347\\\\341\\\\026\\\\373\\\\241\\\\014\\\\275\\\\027iu 7\\\\262\\\\276\\\\347\\\\332\\\\275W\\\\3458H<w\\\\260\\\\357\\\\3038\\\\351[a\\\\254\\\\372\\\\000?\\\\014\\\\347A\\\\300\\\\207\\\\341o{Z\\\\372\\\\271U0\\\\372-\\\\024\\\\207\\\\365g\\\\177\\\\241\\\\323'\\\\177\\\\375\\\\351\\\\016C7.C\\\\015v\\\\320\\\\015\\\\274\\\\021c\\\\001\\\\251\\\\352\\\\222-\\\\373\\\\326\\\\203\\\\354\\\\246\\\\035\\\\026\\\\217\\\\236\\\\336\\\\233mO\\\\273\\\\031\\\\275{\\\\207\\\\324\\\\207\\\\241{\\\\326\\\\333\\\\023\\\\322\\\\037\\\\377\\\\241\\\\224\\\\224\\\\315\\\\306Y\\\\253\\\\263\\\\324\\\\356\\\\317\\\\275\\\\277\\\\336C]d\\\\273\\\\351\\\\254`~W\\\\011\\\\335\\\\366\\\\250\\\\275\\\\203\\\\272N\\\\260\\\\272\\\\313\\\\036D\\\\314^z\\\\272\\\\363t\\\\323\\\\177\\\\000\\\\333\\\\355\\\\253\\\\367\\\\035\\\\327\\\\204C\\\\227\\\\340\\\\007\\\\\\\\\\\\010hDU\\\\347\\\\346\\\\015\\\\244\\\\271\\\\017\\\\017=\\\\262>\\\\224\\\\321\\\\333\\\\306e\\\\277\\\\016]\\\\375\\\\371P\\\\035\\\\272\\\\267\\\\204k\\\\251\\\\267iz<L\\\\353\\\\350\\\\316Y\\\\305\\\\231[-j\\\\313\\\\013Vw\\\\361m\\\\332d3\\\\332\\\\207\\\\352\\\\033\\\\357\\\\202\\\\277-\\\\303.#n\\\\201e\\\\035\\\\272\\\\2626\\\\356\\\\255.\\\\333\\\\344\\\\365?\\\\360k#\\\\370\\\\377\\\\377MaO\\\\306=\\\\224\\\\241\\\\013`\\\\343\\\\021fG\\\\221>\\\\230\\\\033\\\\247G%\\\\363\\\\336!\\\\354@\\\\322\\\\223\\\\200C!}\\\\360\\\\367_\\\\323\\\\032\\\\341{\\\\213K\\\\223\\\\263Z#\\\\027u\\\\247C\\\\363\\\\267\\\\025\\\\324\\\\207:\\\\265\\\\224S\\\\343IR\\\\245H\\\\317x\\\\016uH\\\\333\\\\322\\\\331($\\\\312\\\\363\\\\270\\\\373\\\\036\\\\365\\\\241\\\\364@\\\\323\\\\255rl?x\\\\332\\\\253b\\\\265M\\\\214C9\\\\357\\\\035\\\\327\\\\356\\\\366\\\\211\\\\272\\\\225\\\\254\\\\305\\\\252(\042\\\\345~+\\\\236V\\\\340\\\\345\\\\224\\\\331\\\\241\\\\353\\\\304\\\\224\\\\343\\\\267\\\\324]Pz\\\\322\\\\334\\\\221\\\\241\\\\325\\\\037\\\\272\\\\015\\\\027\\\\266\\\\354j{\\\\016L\\\\007\\\\225\\\\335\\\\273\\\\272\\\\275\\\\253^[\\\\331\\\\203\\\\006\\\\270\\\\236YjO\\\\273E\\\\365\\\\003\\\\244ccC\\\\016ug\\\\355\\\\300\\\\337?\\\\003\042\\\\302\\\\276\\\\361-~nzc\\\\007\\\\303\\\\336\\\\013\\\\001\\\\225\\\\237}\\\\266X\\\\215\\\\305\\\\333\\\\004\\\\212.fa\\\\237\\\\321\\\\002\\\\000\\\\331\\\\365n\\\\223\042O\\\\221\\\\263\\\\202\\\\241e\\\\342\\\\265)\\\\014}&\\\\025\\\\3542t\\\\231\\\\370w\\\\327Cj\\\\371w\\\\340{\\\\311k\\\\253\\\\372]\\\\374\\\\255\\\\337\\\\005\\\\177[\\\\352Yo\\\\007CC\\\\336\\\\341[`\\\\207\\\\357G\\\\035\\\\336\\\\323\\\\367\\\\250\\\\273\\\\275\\\\365\\\\342]w\012\\\\333\\\\032\\\\331V_c\\\\316\\\\275e{\\\\216J1\\\\361\\\\352E\\\\372\\\\223\\\\327\\\\207\\\\236\\\\032\\\\244\\\\327\\\\004\\\\333\\\\213\\\\355P\\\\006:\\\\324;\\\\347\\\\3209\\\\334^\\\\274\\\\257\\\\211\\\\255\\\\261Cz\\\\016w\\\\037\\\\337\\\\311\\\\236\\\\004W\\\\340\\\\333\\\\310I\\\\265\\\\005\\\\275\\\\213\\\\364\042\\\\365\\\\364on\\\\244\\\\257qM\\\\350\\\\306\\\\203Mg\\\\247\\\\215\\\\036\\\\303\\\\017\\\\350\\\\270\\\\346\\\\331B{\\\\030\\\\245\\\\015\\\\177\\\\315G\\\\245\\\\327xt\\\\344|\\\\030\\\\376\\\\266\\\\324.2Z\\\\253\\\\350 \\\\240NI\\\\267\\\\355\\\\271\\\\217\\\\254-?\\\\255gkk{\\\\325\\\\312\\\\001\\\\2733\\\\251\\\\016o\\\\323]\\\\372\\\\220\\\\336VK\\\\235\\\\371:j\\\\357F\\\\270\\\\027x\\\\220\\\\204\\\\336K\\\\177\\\\375{\\\\037\\\\325\\\\242\\\\033\\\\303\\\\377\\\\033\\\\370\\\\333\\\\322\\\\2412\\\\270\\\\355i]e\\\\355\\\\311Wm\\\\272n9Cc\\\\215m\\\\315\\\\257\\\\352\\\\320\\\\335tw\\\\374\\\\354hI\\\\007\\\\332\\\\3762\\\\246\\\\262\\\\222\\\\024\\\\220\\\\362iV7a\\\\207\\\\322\\\\263\\\\201C\\\\243\\\\277Ne\\\\\\\\Je\\\\367\\\\324\\\\333\\\\321\\\\314\\\\203\\\\330\\\\353\\\\240\\\\211\\\\335\\\\235m\\\\267H3\\\\274^\\\\373\\\\006\\\\262\\\\377\\\\000\\\\245\\\\361\\\\373;\\\\352\\\\320m\\\\220\\\\255?te*\\\\364\\\\234\\\\361\\\\373\\\\031\\\\272\\\\207e\\\\275\\\\316\\\\246u<\\\\2250\\\\011e:\\\\353\\\\014\\\\275\\\\3273\\\\275\\\\255!\\\\325\\\\314\\\\310\\\\210\\\\004\\\\3207\\\\016U\\\\307\\\\367nJ\\\\372\\\\263\\\\362\\\\241\\\\370\\\\021\\\\021\\\\2007^\\\\316\\\\345O\\\\004\\\\340\\\\215{\\\\3356OO\\\\271Pt8\\\\363\\\\326\\\\204\\\\327H[\\\\376\\\\005\\\\031\\\\244jN=\\\\364H\\\\274O\\\\0076\\\\330\\\\241\\\\273W\\\\215B.V\\\\036\\\\225u\\\\2352sH\\\\213\\\\016\\\\272\\\\021z\\\\033\\\\327_\\\\3143P\\\\323\\\\2353D,:n\\\\227*QJ\\\\001rV\\\\3256?@\\\\341\\\\247\\\\333\\\\335Q\\\\0056\\\\242\\\\314\\\\340\\\\272=\\\\377CD\\\\314ccaNc\\\\017\\\\235\\\\344P\\\\211\\\\322\\\\007g\\\\031\042\\\\342J?wF\\\\241|\\\\310W.\\\\272\\\\351\\\\354\\\\235OD\\\\204\\\\374\\\\372 \\\\213Hq\\\\371\\\\252\\\\217 (?\\\\322J\\\\025\\\\220\\\\015\\\\234\\\\013:3\\\\252\\\\020\\\\263\\\\233{\\\\002\\\\000\\\\202P\\\\312_\\\\306\\\\331R\\\\327\\\\316\\\\257\\\\006\\\\261R\\\\351\\\\212\\\\255\\\\312Q~\\\\334$\\\\240\\\\017\\\\0200\\\\345\\\\346\\\\365\\\\226\042\\\\233G\\\\322\\\\360\\\\250\\\\003\\\\017\0426\\\\223\\\\333\\\\302\\\\026\\\\017>H:\\\\210;\\\\333\\\\036\\\\355\\\\225C{k\\\\331\\\\333\\\\237\\\\265\\\\014\\\\331\\\\204\\\\254~\\\\266\\\\3003\\\\004\\\\315\\\\202\\\\254q\\\\205\\\\314\\\\234\\\\002v[W\\\\277\\\\003\\\\225M\\\\225\\\\274L\\\\007\\\\361\\\\007\\\\245F:u\\\\375Yw\\\\037\\\\325\\\\027\\\\227z\\\\221\\\\322\\\\2548\\\\234\\\\011:\\\\275\\\\267\\\\232\\\\213\\\\357\\\\343\\\\225\\\\236\\\\255+\\\\346\\\\366\\\\303&d\\\\317\\\\357\\\\025\\\\014\\\\207:?\\\\265y\\\\267\\\\265\\\\317\\\\245\\\\303t\\\\\\\\\\\\221\\\\326\\\\276\\\\252\\\\024\\\\251\\\\214rw'o\\\\201\\\\375\\\\326\\\\250\\\\203\\\\322\\\\316\\\\212\\\\321.KZ\\\\213\\\\325\\\\345\\\\\\\\\\\\333\\\\234\\\\356\\\\250\\\\270\\\\216\\\\263\\\\355K\\\\375\\\\347\\\\316#l\\\\2701\\\\332\\\\001\\\\331k\\\\310+\\\\037q\\\\365\\\\227\\\\342\\\\007\\\\223}\\\\340\\\\323\\\\275E\\\\332\\\\353=\\\\214]\\\\016\\\\235\\\\300\\\\375Q\\\\301f]8\\\\010IO\\\\344\\\\305\\\\317\\\\035\\\\225c\\\\227;{-\\\\315E\\\\221>g\\\\361}\\\\254\\\\302ea\\\\261;`\\\\215y0\\\\3635\\\\250\\\\320\\\\331\\\\350c\\\\320s\\\\355\\\\3569\\\\204\\\\355\\\\202\\\\240\\\\271x\\\\346\\\\021Q\\\\247\\\\263\\\\257`+\\\\001\\\\272\\\\363\\\\357\\\\245s_\\\\325\\\\275\\\\332U\\\\022XR\\\\030\\\\025\\\\016Z\\\\251\\\\372\\\\020\\\\331\\\\221\\\\332\\\\372\\\\277z\\\\353\\\\273{T\\\\352\\\\217\\\\212\\\\2065\\\\356X\\\\261}'\\\\333&\\\\222\\\\367\\\\372\\\\212T\\\\036Igw\\\\034$\\\\024\\\\353\\\\015\\\\334k-i\\\\253\\\\372\\\\001\\\\242\\\\275w\\\\2366U\\\\244\\\\257}\\\\272\\\\015\\\\377\\\\006\\\\317\\\\376R;}\\\\262O\\\\216!bY\\\\355iT\\\\261\\\\036ppX\\\\241\\\\244H\\\\272\\\\016\\\\355\\\\271\\\\366\\\\301\\\\256\\\\376T6\\\\253\\\\225\\\\341mx\\\\332\\\\030\\\\272[\\\\207n\\\\303y\\\\350j\\\\336\\\\221\\\\263\\\\370YX\\\\270;jo\\\\302\\\\220\\\\373O\\\\327\\\\036I\\\\203S5@)L\\\\021\\\\264\\\\024\\\\204\\\\262\\\\375\\\\241\\\\305\\\\224\\\\321!\\\\211Z9\\\\256\\\\334\\\\363\\\\215\\\\022\\\\272{\\\\362\\\\327\\\\205`\\\\205\\\\302\\\\274z\\\\221:Qu\\\\266>\\\\224\\\\241\\\\333\\\\312\\\\352F!\\\\212=\\\\334\\\\240:\\\\204z\\\\033C\\\\327K5\\\\340\\\\331\\\\227\\\\277\\\\372\\\\250}I\\\\351\\\\2007>\\\\335\\\\333\\\\247\\\\375\\\\247z\\\\033\\\\362\\\\275\\\\030zL\\\\230\\\\303\\\\246nG\\\\233\\\\032\\\\031\\\\272\\\\217\\\\204\\\\256 \\\\2514\\\\255^\\\\266M\\\\000?X0\\\\227k\\\\257@r\\\\011\\\\335b\\\\221i.S\\\\206\\\\024\\\\252\\\\241R\\\\252\\\\274\\\\366\\\\025\\\\237\\\\035x*\\\\010\\\\363\\\\342\\\\273~\\\\264=W\\\\322\\\\272i\\\\242LF9s\\\\317\\\\367#6\\\\346\\\\334\\\\313m\\\\320\\\\302@e\\\\235\\\\276\\\\255!=\\\\207\\\\366\\\\320\\\\270\\\\327m\\\\022\\\\272\\\\202\\\\247\\\\350\\\\250b\\\\205\\\\251\\\\321S\\\\351\\\\311|d\\\\220v\\\\002\\\\221 \\\\346V\\\\324*Gm\012R\\\\313&\\\\265\\\\273\\\\371%\\\\362\\\\212u\\\\240\\\\331&\\\\335e\\\\266kc\\\\345\\\\236B\\\\242\\\\333u\\\\256Q\\\\300g\\\\335\\\\261\\\\267\\\\212\\\\235Z\\\\032\\\\221\\\\354[.\\\\2413\\\\365c\\\\334\\\\346^\\\\312\\\\365\\\\246\\\\316p\\\\013\\\\345\\\\202\\\\2072tO\\\\232K?{\\\\241\\\\355X9\\\\273\\\\363\\\\367\\\\333\\\\350?\\\\\\\\\\\\265h,U\\\\2370E\\\\206V\\\\225\\\\243\\\\015]O\\\\271\\\\325\\\\210\\\\252\\\\376\\\\275\\\\241\\\\037)\\\\177\\\\345G\\\\005U9B\\\\317N\\\\006\\\\331\\\\301\\\\260w`\\\\332\\\\346d\\\\033\\\\375m\\\\300\\\\366\\\\201\\\\337\\\\343\\\\242\\\\320sb\\\\364\\\\261\\\\032uS\\\\273\\\\221d\\\\017)\\\\325\\\\25064\\\\302\\\\241\\\\305\\\\333q7\\\\363aG\\\\334\\\\035\\\\024\\\\356\\\\225M\\\\325Ma7\\\\037tT\\\\326\\\\315\\\\326\\\\335\\\\370\\\\373|\\\\337KC\\\\245\\\\340\\\\241\\\\313\\\\313\\\\241\\\\007\\\\034\\\\035$\\\\355%\\\\376\\\\320Z\\\\372\\\\300\\\\333\\\\262\\\\035\\\\272\\\\034\\\\035:\\\\356\\\\035\\\\216\\\\276\\\\335H\\\\272\\\\311h\\\\313\\\\260W\\\\240<\\\\344`\\\\245\\\\203\\\\202\\\\007\\\\344\\\\201\\\\2124ji\\\\327\\\\267\\\\322k\\\\320\\\\304\\\\270\\\\035\\\\216\\\\266{\\\\221\\\\267\\\\034\\\\232f\\\\376\\\\022\\\\255v\\\\364\\\\335G\\\\231\\\\256\\\\337W/\\\\312\\\\356\\\\374\\\\355M{\\\\3352\\\\373\\\\325\\\\325K\\\\320\\\\300.\\\\2675\\\\325\\\\273\\\\3776\\\\315\\\\241\\\\014\\\\335Vv\\\\313\\\\320\\\\265.8Lb\\\\265\\\\251\\\\023=\\\\275\\\\004\\\\373T\\\\321\\\\370\\\\363\\\\035%\\\\020\\\\264\\\\323\\\\337\\\\215\\\\247\\\\245]\\\\231\\\\347Z\\\\037\\\\315\\\\344\\\\340\\\\225\\\\241\\\\033\\\\336\\\\246S\\\\036*\\\\321\\\\037\\\\266RAiU\\\\334+\012\\\\017M\\\\215\\\\254\\\\334\\\\366s\\\\253C\\\\267O\\\\257\\\\303\\\\324\\\\200\\\\362r\\\\337\\\\221\\\\271-nC=\042\\\\177\\\\333Z\\\\323F@\\\\005\\\\336\\\\177\\\\321x\\\\230&\\\\260\\\\013\\\\251\\\\222\\\\332\\\\177r~+\\\\243\\\\336\\\\364\\\\263\\\\257\\\\343k\\\\001i\\\\004\\\\35657U\\\\030zwb<\\\\\\\\\\\\207n\\\\243\\\\252m\\\\342\\\\355\\\\230\\\\355\\\\372\\\\310\\\\252\\\\266\\\\366t\\\\233\\\\312\\\\017\\\\221@\\\\015\\\\215\\\\201\\\\366\\\\201\\\\257\\\\020P\\\\207\\\\367\\\\254\\\\272?\\\\337w\\\\342o^\\\\334\\\\260\\\\311\\\\243k/\\\\235\\\\215\\\\251g6\\\\241<B\\\\316.u\\\\\\\\\\\\271\\\\263,(\\\\231\\\\2332\0422\\\\022\\\\000\\\\250\\\\252\\\\273#\\\\003\\\\200`\\\\321\\\\275T`(V\\\\230\\\\232(\\\\354\\\\222\\\\361\\\\375W\\\\036\\\\024\\\\020l\\\\310\\\\323\\\\310\\\\312[\\\\011\\\\335\\\\344\\\\376\\\\227\\\\347i\\\\251i\\\\017\\\\313\\\\2268\\\\014\\\\0002\\\\373+\\\\227\\\\375\\\\214!\\\\037\\\\340\\\\206\\\\270\\\\310\\\\000\\\\3005\\\\374\\\\033\\\\303\\\\334\\\\316\\\\265\\\\221\\\\242\\\\224\\\\332\\\\004K\\\\256\\\\020\\\\360.\\\\334\\\\263\\\\333\\\\256\\\\362\\\\0007\\\\036\\\\357W\\\\212b\\\\366\\\\032\\\\221\\\\215!\\\\034\\\\262O\042U\\\\311W\\\\301\\\\337g\\\\232\\\\001\\\\200\\\\003\\\\301M\\\\223\\\\251\\\\344\\\\342\\\\234\\\\345,\\\\336i&(\\\\014\\\\031\\\\247\\\\022\\\\000\\\\223\\\\000 \\\\323\\\\266\\\\033\\\\2319\\\\243U\\\\011\\\\011\\\\202r\\\\200\\\\002$\042F)v)\\\\220 b\\\\352\\\\234\\\\326J)\\\\225Z\\\\313\\\\371\\\\010\\\\212l\\\\372\\\\034\\\\205\\\\000\\\\200H\\\\362\\\\241\\\\224\\\\014!\\\\346_Zz\\\\230\\\\313\\\\307\\\\311\\\\235[\\\\247\\\\315\\\\323\\\\274\\\\007\\\\013\\\\017\\\\324&\\\\266\\\\336\\\\276)E7\\\\216q\\\\233D9H\\\\354u\\\\317\\\\305>\\\\262|\\\\027\\\\303;m,\\\\366\012\\\\370v\\\\372[\\\\343%\\\\367\\\\\\\\\\\\257\\\\367\\\\325\\\\333\\\\212\\\\2551\\\\277\\\\022\\\\024\\\\022\\\\022*\\\\3354\\\\331V\\\\252\012\\\\236\\\\306\\\\315\\\\377\\\\210\\\\000\012\\\\201\\\\001w\\\\336\\\\217\\\\223\\\\253|Y\\\\006\\\\311F<\\\\243_\\\\000Q)\\\\022\\\\304l\\\\3028f\\\\307\\\\251R*\\\\227\\\\345\\\\202\\\\010B\\\\240@0\\\\223\\\\337}\\\\026\\\\267\\\\246\\\\206\\\\267\\\\346\\\\333.\\\\0025!]\\\\241\\\\277(Q`n\\\\010\\\\005V'\\\\253\\\\277\042Q\\\\007\\\\026=U~Z\\\\031\\\\370^\\\\370\\\\333\\\\226\\\\260\\\\026g\\\\235\\\\016\012;\\\\340\\\\335\\\\217\\\\372\\\\324Rni\\\\307\\\\025\\\\243\\\\275\\\\014\\\\335\\\\246#f|\\\\210 \\\\260s\\\\244'\042\042\\\\010 \\\\371\\\\301\\\\035o>\\\\262\\\\2633A\\\\205\\\\234\\\\273\\\\311\\\\000\\\\000\\\\200\\\\3320t\\\\246r\\\\020\042*\\\\314\\\\353\\\\025p\\\\031c \\\\020\\\\013 \\\\000\\\\010!\\\\250\\\\214\\\\026\\\\002@\\\\001\\\\002\\\\001t9)5\\\\367\\\\222\\\\236\\\\222eG\\\\\\\\\\\\265]\\\\276\\\\256i\\\\035\\\\331\\\\243\\\\266\\\\023\\\\323\\\\006\\\\263]#M{%\\\\\\\\;\\\\220\\\\2739\\\\254?\\\\317\\\\035\\\\304\\\\205}\\\\010nD\\\\330\\\\307\\\\212\\\\327\\\\215\\\\266\\\\017U\\\\007\\\\345\\\\334\\\\371\\\\016\\\\260\\\\321\\\\313\\\\262\\\\216\\\\335\\\\341\\\\217\\\\302\\\\017(SJ\\\\030\\\\267\\\\013\\\\264\\\\220\\\\002\\\\000)^gA$\042$, \\\\210B\\\\031\\\\006\\\\022f'\\\\222\\\\253\\\\210\\\\002\\\\014\\\\214H\\\\250I\\\\243 \\\\240\\\\220\\\\000Jv\\\\271\\\\205I\\\\200\\\\021P\\\\010v\\\\373\\\\252\\\\276\\\\002\\\\227S\\\\371d\\\\267\\\\255\\\\311X\\\\376N9\\\\375\\\\025\\\\344mF\\\\205\\\\276\\\\014]\\\\302\\\\325@a-s\\\\241\\\\256`\\\\315\\\\034[+\\\\337/nt+\\\\203\\\\266\\\\350\\\\372\\\\017^a*H\\\\332\\\\262\\\\264\\\\365\\\\317\\\\303\\\\374\\\\310\\\\272/\\\\001\\\\355<\\\\022\\\\207 \\\\322p\\\\233UAI\\\\234e\\\\343\\\\254\\\\000P\\\\030\\\\000\\\\262\\\\015\\\\237\\\\000\\\\001@\\\\246[\\\\203\\\\000\\\\0003\\\\346\\\\2128\\\\002+D\\\\0041F@\\\\034!\042\\\\212c'\\\\202D\\\\204\\\\231+\\\\245 \\\\001\\\\002fZ@\\\\246\\\\332\\\\010\\\\022\\\\301\\\\356\\\\266\\\\347\\\\301\\\\355- T\\\\236\\\\022\\\\273\\\\202\\\\270qm/\\\\263u\\\\225\\\\241[%\\\\377n\\\\352#{J<\\\\275\\\\235X\\\\035^P\\\\335\\\\265\\\\264K\\\\254^\\\\314\\\\332!q\\\\333$\\\\312\\\\006\\\\322\\\\365\\\\316\\\\221=\\\\222f_\\\\245\\\\000p\\\\250\\\\275\\\\037\\\\266W\\\\212\\\\005\\\\000\\\\005\\\\2012\\\\025\\\\240\\\\222\\\\271\\\\220\\\\205\\\\300\\\\202@\\\\002B\012\\\\000\\\\031r\\\\201*\\\\271\\\\316\\\\222q\\\\263#f\\\\024\\\\001tA\\\\240\\\\221-\\\\200\\\\0030,i\\\\352\\\\000\\\\011\\\\2214\\\\010 *DA$\\\\200\\\\\\\\JS\\\\256M\\\\036\\\\300\\\\320\\\\322\\\\322\\\\336\\\\262\\\\363\\\\026\\\\225\\\\255\\\\237-\\\\014]\\\\271\\\\224-\\\\365MaY\\\\264\\\\364\\\\274}\\\\320HY#\\\\2442\\\\264\\\\035^x\\\\355\\\\365V\\\\260n\\\\236JYV\\\\2257\\\\216m\\\\356\\\\004\\\\365z\\\\245\\\\023\\\\336\\\\234\\\\272ep\\\\367\\\\342\\\\273\\\\013ie\\\\372f8m\\\\325\\\\014\\\\020\\\\002B\\\\020\\\\020\\\\244]\\\\213\\\\001o\\\\3602\\\\202C\\\\001\\\\001AA&D@\\\\314X\\\\207\\\\231\\\\020\\\\210\\\\005\\\\221\\\\221Sd\\\\013\\\\354P\0424\012\\\\223\\\\025\\\\221\\\\207\\\\312s,\\\\342\\\\004\\\\011\\\\011\\\\220\\\\031\\\\200@H!f\\\\212<\\\\332\\\\\\\\\\\\003i\\\\350\\\\207F\\\\311U\\\\317\\\\2035x\\\\376\\\\271y\\\\210\\\\210\\\\202\\\\322\\\\354g\\\\217\\\\305\\\\273\\\\347\\\\266.\\\\327\042\\\\262s\\\\260R7\\\\236\\\\367\\\\024\\\\237{3\\\\227\\\\237\\\\366\\\\267X\\\\357\042l\\\\336`\\\\365\\\\224\\\\304{\\\\205e\\\\333\\\\000<,\\\\034\\\\360\\\\2733tk\\\\251\\\\255\\\\375\\\\222\\\\000\\\\001P\\\\011f\\\\306\\\\016\\\\001\\\\000\\\\332\\\\010\\\\335\\\\255\\\\350\\\\225\\\\004\\\\021%7\\\\030l_\\\\275'(\\\\010N!\\\\243X\\\\342\\\\224]\\\\014\\\\234\\\\242D\\\\034\\\\2561\\\\215H\\\\373J\\\\217\\\\230\\\\001\\\\234\042E\\\\200(\\\\016X\\\\014\\\\2108$a\\\\005\\\\004\\\\016\\\\200\\\\000\\\\014\\\\355Z\\\\337\\\\366r\\\\016ns\\\\366b\\\\350j\\\\250\\\\206\\\\326#\\\\375\\\\354\\\\221\\\\356^#z\\\\362(t\\\\371\\\\031W\\\\307\\\\251{\\\\230\\\\313|\\\\277\\\\003i\\\\261C\\\\267\\\\351\\\\320\\\\335\\\\255\\\\350^\\\\362v\\\\341\\\\315\\\\005\\\\235sP\\\\362\\\\301(\\\\340\\\\273\\\\375P\\\\030O+\\\\316\\\\264\\\\215\\\\366\\\\354^]\\\\235:!\\\\255\\\\020\\\\321Y\\\\021\\\\021\\\\324H\\\\002\042\\\\242\\\\0249k\\\\025!)\\\\024\\\\347\\\\024\\\\221\\\\210K\\\\327a\\\\232.<\\\\243\\\\000\\\\265\\\\200\\\\016\\\\023\\\\253\\\\374\\\\341x4]\\\\255VA\\\\0208\\\\233\\\\214\\\\002\\\\015\042i\\\\032\\\\271dn\\\\223\\\\350xD\\\\321\\\\335\\\\033\\\\302\\\\204\\\\225\\\\257\\\\314Hc\\\\300Ns\\\\234*\\\\303q\\\\354\\\\234\\\\220\\\\032N\\\\003\\\\177\\\\264\\\\212\\\\223\\\\301h\\\\022\\\\307\\\\2211\012\\\\2307\\\\356(\\\\371BGD\\\\210U\\\\001Q\\\\374$\\\\265}\\\\013\012\\\\3262d\\\\203\\\\316\\\\345p\\\\262*c\\\\231\\\\355\\\\245L@\\\\206\\\\255\\\\360-\\\\277\\\\017W\\\\240\\\\376j\\\\344z\\\\017V~\\\\366\\\\364\\\\315x\\\\230\\\\374\\\\356^\\\\307\\\\273\\\\011\\\\353\\\\0119Tr\\\\267\\\\255\\\\014{/\\\\207w\\\\327\\\\333\\\\257\\\\352*\\\\204\\\\021\\\\024*R\\\\312\\\\011\0129\\\\021@`F\\\\020\\\\347\\\\374\\\\300WD(,6\\\\265I\\\\304 \\\\332\\\\250\\\\300\\\\360r5\\\\277\\\\272\\\\272}\\\\375\\\\352\\\\362\\\\364\\\\361\\\\323_\\\\376\\\\376?`\\\\224pqe\\\\000<\\\\221\\\\324\\\\205\\\\034\\\\023I\\\\252%\\\\262\\\\034\\\\336\\\\335\\\\274\\\\232\\\\275\\\\272\\\\377\\\\340\\\\311@qJ\\\\344\\\\024Cl\\\\243x\\\\355R\\\\347\\\\203Y\\\\204)\\\\016\\\\217\\\\317\\\\002-\\\\276\\\\247P\\\\015\\\\030%\\\\010\\\\002D\\\\004\\\\233 sv\\\\203\\\\241\\\\340\\\\274l\\\\266\\\\343&eM\\\\350\\\\343\\\\020[_\\\\331\\\\352\\\\332/\\\\342V\\\\233\\\\250\\\\213\\\\277V\\\\206n\\\\357\\\\331\\\\262\\\\371\\\\263\\\\234\\\\372\\\\334\\\\215\\\\253\\\\022\\\\0155I\\\\\\\\V\\\\000v%\\\\364\\\\036^\\\\357\\\\317\\\\251m\\\\300n\\\\202+\\\\351P\\\\277\\\\360>N?{\\\\277\\\\027\\\\302\\\\2362\\\\213\\\\003Rv\\\\225S\\\\000\\\\222p\\\\251\\\\225\\\\030\\\\243\\\\274\\\\000E\\\\2518ZE\\\\367K\\\\033/\\\\336\\\\276\\\\374\\\\354\\\\253/?\\\\033\\\\217\\\\247'\\\\037>\\\\231\\\\275\\\\371\\\\271\\\\037\\\\014\\\\317\\\\216\\\\317\\\\256n\\\\256\\\\343D\\\\3314\\\\001\\\\222$\\\\016\\\\243\\\\345\\\\335jy\\\\177\\\\177w\\\\205ny\\\\242\\\\246\012R\\\\245}\\\\355O@\\\\0175kg\\\\243(^-\\\\327vz4\\\\364\\\\324$\\\\234\\\\337\\\\212\\\\362-*e|k\\\\355PoOj\\\\353\\\\246\\\\264\\\\202\\\\247e\\\\223\\\\032\\\\273\\\\010*\\\\343U\\\\312\\\\325v3e\\\\367\\\\204\\\\225\\\\013~\\\\353e\\\\266\\\\333\\\\315\\\\363@%\\\\265\\\\021X\\\\347fl\\\\273\\\\205\\\\3366\\\\330\\\\007\\\\276\\\\331\\\\266O\\\\033w\\\\2777\\\\347\\\\257\\\\277\\\\242\\\\241O]{\\\\251\\\\352n\\\\002\\\\0110Jq\\\\212\\\\202\\\\200 L,\\\\000\\\\251\\\\357\\\\243\\\\270T\\\\342\\\\220\\\\011\\\\224\\\\330ty}\\\\365\\\\352\\\\345\\\\374\\\\356\\\\315O\\\\376\\\\335_<\\\\177\\\\357\\\\342\\\\351i\\\\000\\\\311\\\\255K\\\\227\\\\353\\\\025Q<\\\\323\\\\014\\\\000\\\\354\\\\326k\\\\253@\\\\322\\\\304F\\\\367ix'\\\\3512\\\\360\\\\334\\\\354\\\\346\\\\2228f@2\\\\303\\\\361\\\\364l0:FQQ\\\\230\\\\020\\\\033\\\\216\\\\357\\\\307\\\\346lvw\\\\257\\\\007\\\\223`4\\\\001I\\\\215\042q\\\\0166b\\\\270x\\\\035\\\\262R\\\\212\\\\231qwW\\\\226\\\\217\\\\370\\\\316\\\\3305$\\\\021\\\\331\\\\234\\\\\\\\\012l\\\\254\042\\\\345\\\\247\\\\330 \\\\357\\\\260\\\\310\\\\337K\\\\345\\\\2503\\\\364A\\\\313z#\\\\260\\\\215q\\\\033\\\\007\\\\270\\\\223\\\\241w|-\\\\352KD\\\\007\\\\345\\\\273\\\\314Z\\\\316yX\\\\364\\\\202F\\\\031\\\\334\\\\301\\\\251\\\\035\\\\230;\\\\340\\\\000\\\\200$\\\\036\\\\0223K\\\\276\\\\307wbE\\\\304\\\\0220\\\\262\\\\363\\\\010\\\\000\042\\\\262\\\\211\\\\213\\\\302\\\\333\\\\327\\\\237}\\\\363\\\\331O\\\\347w\\\\227vu\\\\255y\\\\354\\\\326\\\\267\\\\2637KvB\\\\244\\\\347\\\\306\\\\017\\\\303p\\\\261X\\\\334\\\\335\\\\335\\\\014<\\\\377\\\\344\\\\364(\\\\010L\\\\270^\\\\336\\\\317n#-\\\\326\\\\303\\\\241O\\\\326\\\\361:\\\\236\\\\315\\\\347\\\\363\\\\343\\\\263'B~\\\\024\\\\246\\\\312\\\\237\\\\276\\\\376\\\\346\\\\247\\\\307'G\\\\003r\\\\2017\\\\322\\\\344\\\\346\\\\213\\\\345\\\\364\\\\364l\\\\0353\\\\222\042\042fv\\\\316\\\\211\\\\210R*_7\\\\262\\\\211\\\\207\\\\230\\\\011\\\\357L'i\\\\023\\\\321\\\\025\\\\325bk\\\\225\\\\203\\\\355\\\\277\\\\033\\\\013]\\\\271\\\\227x+a\\\\011\\\\340\\\\001\\\\007+}\\\\030\\\\2721Cw\\\\236\\\\216\\\\371P\\\\227m\\\\273\\\\014\\\\335\\\\\\\\\\\\313^w\\\\307\\\\016\\\\374\\\\3359\\\\333\\\\322\\\\036:[\\\\260\\\\365\\\\331\\\\223l'\\\\211\\\\210\\\\210%q\\\\210\\\\331\\\\346\\\\211\\\\031\\\\254\\\\022\\\\326\012\\\\226\\\\3677\\\\344\\\\351$\\\\232\\\\257\\\\357\\\\257\\\\226wW\\\\257\\\\277\\\\371*Y\\\\\\\\\\\\237\\\\014\\\\361\\\\342{\\\\317\\\\215J\\\\311-\\\\015y\\\\263\\\\331\\\\\\\\\\\\241R\\\\243\\\\321\\\\362\\\\372\\\\366\\\\331\\\\323\\\\247\\\\236\\\\363E\\\\234$\\\\363\\\\331\042\\\\272\\\\276\\\\273\\\\272\\\\271\\\\271\\\\3614\\\\036\\\\217\\\\374\\\\223\\\\243\\\\211\\\\347y\\\\253u<_.\\\\2424>:>\\\\017\\\\274\\\\000T|\\\\371\\\\346\\\\315\\\\354\\\\355\\\\305\\\\331\\\\343\\\\347\\\\200q8\\\\017\\\\227w\\\\253\\\\3210@\\\\360DT\\\\261\\\\245+\\\\204t\\\\246F\\\\303\\\\256\\\\326Q\\\\021X]mnO\\\\205\\\\341\\\\271*;\\\\020Dd\\\\217\\\\016\\\\015\\\\275\\\\271\\\\360PH\\\\001\\\\357\\\\320\\\\241\\\\241$\\\\263+h\\\\266h{\\\\370\\\\351\\\\366iW7\\\\274Kj\\\\356V\\\\364.N]{\\\\253F\\\\000d\\\\007bE\\\\300\\\\261M\\\\243u\\\\234\\\\254I\\\\234\\\\247!\\\\215\\\\026\\\\263y\\\\370\\\\362\\\\313\\\\317\\\\276\\\\376\\\\362\\\\323\\\\325\\\\354\\\\332%\\\\253\\\\307\\\\247G\\\\037}\\\\374\\\\361ju\\\\363K\\\\037}0\\\\237\\\\317\\\\343u\\\\364\\\\311w\\\\236\\\\315f\\\\263\\\\345\\\\374\\\\356\\\\243g\\\\247\\\\367\\\\367\\\\227\\\\236\\\\304\\\\3323q\\\\032\\\\272$\\\\364\\\\224\\\\234L\\\\207A\\\\020\\\\334\\\\\\\\\\\\275M\\\\022;\\\\032\\\\215H\\\\243s2\\\\273\\\\275F\\\\304\\\\323\\\\363'\\\\032\\\\255O\\\\366\\\\356\\\\362\\\\027\\\\343a\\\\260\\\\274\\\\342\\\\304Q\\\\340\\\\215\\\\243\\\\331M\\\\254\\\\307\\\\254\\\\002\\\\255uv\\\\355?\\\\223\\\\315i\\\\232\\\\026\\\\333\\\\304L`\\\\327\\\\327\\\\336J\\\\332\\\\331\\\\223pI\\\\013\\\\247\\\\254`\\\\203d\\\\337\\\\232\\\\2377\\\\347\\\\246\\\\270y\\\\013VC\\\\374\\\\340:<\\\\213%\\\\334s\\\\274\\\\373\\\\263\\\\305\\\\203\\\\031\\\\250'\\\\206\\\\376K\\\\377\\\\241M+\\\\177\\\\331;=\\\\332\\\\310\\\\020\\\\021@FP\\\\200\\\\014\\\\273\\\\207\\\\024\\\\234\\\\237\\\\360a\\\\3465A\\\\002\\\\200\\\\244\\\\224\\\\001'.\\\\211\\\\323\\\\365|qw\\\\275\\\\274\\\\277v6\\\\322$\\\\353p\\\\316\\\\311\\\\372\\\\325\\\\327_\\\\275}\\\\365M\\\\024\\\\336\\\\2718\\\\224d~<V\\\\200\\\\351\\\\354v\\\\244\\\\224\\\\032\\\\370&M\042\\\\255p\\\\020x\\\\363\\\\373[vB\\\\204D\\\\010(\\\\236\\\\347\\\\011a\\\\030\\\\256//\\\\257\\\\216\\\\306GI\\\\022\\\\257\\\\243d<\\\\031\\\\022\\\\361r\\\\271\\\\314\\\\204\\\\256\\\\322\\\\276X\\\\370\\\\372\\\\363\\\\277\\\\217V\\\\313\\\\233\\\\273\\\\345\\\\361\\\\351\\\\305\\\\367~\\\\371W\\\\3467\\\\013\\\\031>b5`\\\\255\\\\375\\\\341(\\\\010\\\\206Hd\\\\255\\\\213]\\\\252\\\\310\\\\020*\\\\255=e\\\\024\\\\241\\\\226\\\\315\\\\276p'\\\\214A&X\\\\263S\\\\237r\\\\377\\\\250\\\\272\\\\362\\\\275\\\\345i\\\\004\\\\002\\\\220\\\\022g\012H\\\\276\\\\223\\\\312\\\\016V\\\\004P\\\\204\\\\0312w,d\\\\004\\\\004\\\\024\\\\000\\\\336~\\\\317\\\\316I\\\\2053\\\\023`\\\\323\\\\010\\\\325&\\\\320\\\\346\\\\251\\\\331\\\\365\\\\003.\0126\\\\251\\\\004\\\\231\\\\003uu\\\\3103x\\\\233U\\\\241\\\\034\\\\025\\\\242\042\\\\355\\\\352\\\\316n\\\\215\\\\234\\\\267\\\\007\\\\322\\\\362\\\\306\\\\330\\\\354\\\\313\\\\006\\\\270\\\\255\\\\011\\\\2537n\\\\212\\\\365\\\\247\\\\202\\\\274P\\\\016\\\\013{\\\\252p\\\\311\\\\033S@\\\\030\\\\304x\\\\201 \\\\304\\\\353H{\\\\306\\\\030/JbP&\\\\215\\\\223\\\\241\\\\302\\\\305\\\\362f\\\\365\\\\366\\\\363\\\\241\\\\346\\\\333\\\\313\\\\327\\\\243\\\\223\\\\351\\\\233\\\\227_\\\\277|\\\\363\\\\352\\\\365\\\\3337\\\\321z\\\\341+\\\\234\\\\216\\\\007\\\\203q0[\\\\314\\\\236={\\\\272XFq\\\\034\\\\037M\\\\247\\\\347\\\\347\\\\247\\\\242\\\\364\\\\364\\\\344\\\\354\\\\325\\\\253WI\\\\224\\\\374\\\\374\\\\253\\\\317\\\\317\\\\036=~\\\\361\\\\372\\\\325dz\\\\034%\\\\361\\\\361\\\\361\\\\023\\\\255G\\\\353p\\\\356\\\\033\\\\217Y\\\\302U\\\\344\\\\031\\\\243\\\\311x\\\\332\\\\267q\\\\262Z\\\\205\\\\263\\\\2739)\\\\377\\\\255\\\\015\\\\023\\\\013\\\\353\\\\305\\\\333x\\\\3612\\\\030\\\\035\\\\257-\\\\261\\\\0320\\\\231\\\\243\\\\323\\\\363\\\\321\\\\321\\\\351\\\\364\\\\364,\\\\212\\\\323\\\\363\\\\307\\\\317\\\\030-;k\\\\223\\\\3249\\\\217L\\\\000d\\\\220<R\\\\000.\\\\301]K(\\\\001\\\\010m\\\\354\\\\320\\\\305\\\\003\\\\202\\\\354\\\\366$n\\\\303\\\\244\\\\0271\\\\255\\\\2138'9\\\\257#\\\\242p\\\\246\\\\341dvy\\\\310\\\\247?`\\\\346\\\\037\\\\273\\\\375\\\\314\\\\217\\\\235\\\\262\\\\010\\\\2379\\\\374\\\\341\\\\272f/\\\\235\\\\362@\\\\005\\\\275\\\\003gE\\\\007x\\\\3602\\\\362\\\\340&\\\\367[\\\\034d\\\\243Lb~\\\\375l#\\\\247\\\\011\\\\221\\\\331\\\\002\\\\000\\\\242\\\\260M#g-\\\\273\\\\304\\\\322\\\\321x\\\\374\\\\372\\\\363\\\\037\\\\2334\\\\276z\\\\365\\\\225\\\\017\\\\311\\\\352\\\\376z~\\\\253~\\\\361\\\\342\\\\325|\\\\265\\\\214\\\\242\\\\320\\\\011'\\\\226\\\\347\\\\253Xd\\\\235\\\\306\\\\203\\\\333\\\\273\\\\273\\\\263G\\\\217\\\\214\\\\366\\\\255H0\\\\030/\\\\303p\\\\365\\\\352\\\\355_\\\\377\\\\333\\\\277\\\\031\\\\016\\\\207\\\\263\\\\331Ly\\\\303p\\\\235\\\\204\\\\321M\\\\030\\\\206\\\\367\\\\213(Y\\\\207\\\\342\042q\\\\2511\\\\352\\\\344\\\\344D\\\\241\\\\002\\\\301(\\\\212\\\\222$\\\\321\\\\306K\\\\242\\\\020(\\\\361\\\\014\\\\032m\\\\010%Y\\\\337\\\\332t\\\\025\\\\014\\\\216\\\\206C\\\\215\\\\276\\\\022{\\\\277\\\\270^\\\\212]\\\\201\\\\366l\\\\344\\\\243\\\\362\\\\020\\\\215F\\\\217Y\\\\234%!A\042D\\\\361PhG\\\\320\\\\200\\\\000\\\\203\\\\003T\\\\031\\\\343\\\\346\\\\336\\\\261\\\\010 \\\\371;@\\\\213\\\\274\\\\205\\\\013\\\\270l\\\\304\\\\036\\\\225\\\\316t\\\\262\\\\247\\\\355\\\\267\\\\276;\\\\306\\\\251c\\\\264\\\\372\\\\217\\\\375\\\\273\\\\330ewjl\\\\257\\\\253n\\\\314\\\\356)\\\\241w\\\\200\\\\007\\\\322\\\\323\\\\006l+[^y2\\\\007\\\\266B\\\\306#\0428F\\\\304a\\\\340;\\\\347\\\\234M\\\\002\\\\255\\\\022\\\\307\\\\010\\\\226]\\\\022.g\\\\263\\\\331\\\\214\\\\322\\\\305\\\\354\\\\356\\\\3129{}w\\\\037\\\\332$N\\\\254\\\\265V8\\\\361\\\\024\\\\023\\\\004\\\\2766\\\\314\\\\374\\\\345W_+e>p\\\\357{f\\\\370\\\\372\\\\355\\\\233\\\\273\\\\233\\\\333\\\\313\\\\253\\\\033\\\\346+\\\\347\\\\034)/\\\\014\\\\303\\\\324\\\\262s.I\\\\222h\\\\275:?;q\\\\342\\\\2141Zk$\\\\030\\\\015Gq\\\\034\\\\337\\\\334\\\\334L\\\\306\\\\3238\\\\216\\\\005-\042\\\\002)\\\\021\\\\321\\\\306WJ\\\\237\\\\236\\\\241\\\\2656aH\\\\231T0\\\\366HR\\\\200\\\\027\\\\353\\\\305h|4\\\\030\\\\216\\\\203\\\\341\\\\021\\\\252\\\\201&\\\\322\\\\332h_\\\\021Q\\\\022ER2u\\\\024V\\\\271\\\\334\\\\333:\\\\327B`\\\\243f\\\\024\\\\375\\\\317\\\\333\\\\247YA\\\\311\\\\315\\\\202\\\\345\\\\316\\\\334\\\\372rt\\\\313\\\\222>Lv\\\\350`\\\\267M\\\\000\\\\350MI\\\\317*\\\\336\\\\221\\\\3026z\\\\276=U\\\\276\\\\274[\\\\337>E\\\\026E`\\\\305\\\\211\\\\260R\\\\236\\\\343\\\\010lj\\\\274\\\\001\\\\002\\\\317n\\\\256\\\\246\\\\343\\\\340\\\\323\\\\237\\\\275N\\\\222\\\\310\\\\205\\\\253\\\\253\\\\253+\042\\\\212\\\\222\\\\330fV\\\\017a\\\\261\\\\014\\\\354\\\\322\\\\204\\\\327\\\\261SJ\\\\015'\\\\307b\\\\3357/\\\\336\\\\304\\\\011k\\\\255M0\\\\020\\\\204(I\\\\330\\\\2727o\\\\336\\\\020\\\\021)3\\\\032\\\\21526\\\\230\\\\315f\\\\232\\\\300\\\\030\\\\025E\\\\221M\\\\223\\\\323\\\\323\\\\323lK\\\\227\\\\246\\\\251Q\\\\232\\\\001\\\\3438NS\\\\347\\\\204\\\\207\\\\203\\\\361p<\\\\272\\\\273z3\\\\236\\\\034\\\\015\\\\247'\\\\354\\\\222d\\\\261\\\\276\\\\225\\\\324\\\\013\\\\002O\\\\254\\\\203Ti\\\\361\\\\207\\\\001\\\\000Z\\\\247\\\\310\\\\222#\\\\261\\\\240\\\\025Q\\\\325\\\\203n\\\\333\\\\021\\\\000U\\\\357\\\\275,\\\\225\\\\275\\\\036Z\\\\217f\\\\036h\\\\207\\\\356\\\\317\\\\372\\\\025H\\\\317\\\\234\\\\274\\\\353\\\\263Q\\\\323Ak6\\\\204\\\\255.\\\\272\\\\3071\\\\2772\\\\205\\\\336Q\\\\3378T\\\\017i\\\\177Z\\\\202\\\\013\\\\000\\\\200\\\\312\\\\026Uq\\\\010$\\\\234\\\\270$\\\\201t\\\\355\\\\222\\\\030D\\\\224\\\\017\\\\316\\\\331\\\\365\\\\362\\\\316.\\\\256\\\\257\\\\336\\\\276\\\\234\\\\335^\\\\333\\\\365\\\\375j\\\\265BE\\\\353$uHLJ)\\\\003\\\\200\\\\302\\\\3112L\\\\222\\\\304\\\\032\\\\243\\\\276y\\\\361\\\\332\\\\323f:\\\\235\012\\\\336^__3\\\\263c\\\\207\\\\312\\\\220\\\\320*\\\\214|\\\\337\\\\367\\\\010\\\\221\\\\204\\\\004\\\\264V\\\\236AqiF[\\\\030\\\\206\\\\253\\\\325\\\\31297\\\\030\\\\014\\\\3428f\\\\341$\\\\265\\\\211\\\\2636\\\\345\\\\314\\\\027\012I\\\\006~\\\\220D\\\\213\\\\311x\\\\020\\\\220\\\\000p\\\\272\\\\274\\\\226\\\\310SvM\\\\3614\\\\3064Pb\\\\206\\\\307\\\\312\\\\010*D+\\\\214>\\\\030#@E\\\\037n\\\\264\\\\205b\\\\307\\\\307\\\\200\\\\270\\\\321\\\\233e\\\\323=\\\\345]G&e\\\\270~\\\\200\\\\230\\\\341l\\\\010\\\\326\\\\330=`\\\\007\\\\011\\\\302\\\\216A}\\\\350\\\\360\\\\327\\\\236\\\\266\\\\\\\\s\\\\252+6u\\\\372\\\\373\\\\361\\\\364\\\\241\\\\376\\\\312\\\\207A\\\\032\\\\023\\\\002;\\\\266\\\\010Z#\\\\3324\012WkE0\\\\032\\\\370\\\\201\\\\222\\\\333\\\\233K\\\\227,?\\\\375\\\\273\\\\277Y.\\\\356\\\\256\\\\257/]\\\\0322\\\\010\\\\247)\\\\202\\\\022\\\\006\\\\353\\\\234\\\\023F\\\\020%\\\\224\\\\200M\\\\322\\\\024\\\\343d2\\\\232\\\\216F\\\\243\\\\305r\\\\231\\\\360R\\\\371\\\\201!Z\\\\334\\\\337\\\\013\\\\210\\\\361=\\\\007b\\\\214\\\\001\\\\220\\\\345r\\\\351\\\\033O)\\\\365\\\\376\\\\263\\\\213\\\\371|6\\\\030\\\\014\\\\216\\\\217\\\\217\\\\357gwQ\\\\024EQtzz:\\\\237\\\\317\\\\255\\\\265I\\\\234\\\\202\\\\343\\\\300\\\\363,\\\\363z\\\\025\\\\206\\\\313\\\\305\\\\307\\\\037<\\\\017\\\\347w\\\\276Q\\\\306\\\\230\\\\201? \\\\002\\\\200$]^EnE\\\\022\\\\221\\\\3301[5\\\\026 RJ)\\\\243R&@\\\\001P%\\\\236\\\\336n\\\\234\\\\212\\\\336)u\\\\024V\\\\374{\\\\001K\\\\207)%\\\\0352c\\\\204\\\\3467\\\\311\\\\366\\\\031\\\\203:\\\\343\\\\366\\\\314Y\\\\206\\\\324\\\\037\\\\251\\\\302y\\\\275\\\\302|\\\\345\\\\330B\\\\033\\\\036FD\\\\241\\\\255D\\\\337A\\\\206;~X\\\\210\\\\270\\\\373\\\\271\\\\203h\\\\227\\\\214J?\\\\364]\\\\235\\\\036\\\\226\\\\247l\\\\355\\\\311\\\\354A(\\\\002\\\\010\\\\212\\\\200D\\\\020\\\\\\\\\\\\024.n\\\\256^{\\\\006\\\\361\\\\344\\\\204\\\\323\\\\3457_~:\\\\273\\\\275\\\\372\\\\305\\\\227\\\\237\\\\255f\\\\227\\\\253p\\\\311i$\\\\342\\\\020\\\\021\\\\224r\\\\314ij\\\\2350\\\\001\\\\002\\\\241\\\\240B\\\\201\\\\300\\\\363f\\\\367\\\\2138\\\\261\\\\210H\\\\212\\\\3030TJ\\\\015\\\\202\\\\341j\\\\265\042\\\\002\\\\000b\\\\004O\\\\251\\\\365z\\\\355im<\\\\265X,\\\\222$1J\\\\263uZ\\\\353 \\\\010\\\\322h=\\\\360\\\\014\\\\017\\\\002\\\\007BD\\\\251\\\\265A0\\\\260\\\\302\\\\313E\\\\350\\\\234[,\\\\347\\\\236\\\\322\\\\201\\\\257\\\\3234\\\\261\\\\261\\\\013\\\\202\\\\340\\\\354\\\\344\\\\330\\\\030_k\\\\303\\\\010\\\\332\\\\256!]q\\\\354\\\\245\\\\226!\\\\211\\\\301\\\\237\\\\004\\\\223sF\\\\024d$*$/Bf\\\\214+\\\\372\\\\247t@.\\\\2052]\\\\014\\\\364V\\\\253\\\\336\\\\364\\\\344\\\\366{\\\\257K\\\\262{\\\\037A\\\\273Y\\\\255r\\\\326\\\\271W\\\\003\\\\221\\\\032+w\\\\347\\\\357^\\\\001\\\\366zY\\\\274\\\\243\\\\342q\\\\020\\\\222>\\\\2303\\\\251\\\\200\\\\200D\\\\212PR\\\\227\\\\314g\\\\327/\\\\177\\\\361\\\\271\042\\\\016\\\\037\\\\035\\\\033\\\\205_}\\\\366\\\\263\\\\237\\\\375\\\\354'\\\\310\\\\351\\\\313_|\\\\351k\\\\3414\\\\011\\\\303\\\\345`0\\\\212lD\\\\312\\\\000\\\\031\\\\255u\\\\366\\\\206\\\\2728\\\\211m\\\\032[a\\\\266V\\\\245\\\\234\\\\244\\\\221c\\\\024\\\\304\\\\324\\\\271\\\\370~ADa\\\\224\\\\244Q\\\\314\\\\354\\\\005\\\\223qvdm\\\\224\\\\216\\\\3438\\\\010\\\\002\\\\337\\\\367\\\\223$a\\\\346\\\\341p8\\\\277\\\\273\\\\275\\\\277\\\\277_.\\\\227A\\\\020 \\\\013\\\\002($\\\\255\\\\265\\\\236j\\\\255i~?\\\\013\\\\303\\\\345\\\\355\\\\325e\\\\024E\\\\307'\\\\323\\\\343\\\\261\\\\357\\\\033\\\\\\\\\\\\257\\\\357\\\\217\\\\316/b\\\\313\\\\310k\\\\344\\\\265\\\\2221H\\\\002\\\\340k\\\\005\\\\0006;~\\\\001\\\\314\\\\202\012\\\\241\\\\223\\\\214O\\\\266\\\\375@\\\\345\\\\011\\\\277\\\\357\\\\326}\\\\336aYf\\\\021\\\\315\\\\245x\\\\314\\\\335\\\\237\\\\2332\\\\256q\\\\025\\\\336}\\\\177^\\\\366\\\\245\\\\221\\\\231\\\\362\\\\262\\\\265\\\\221-\\\\340\\\\3246\\\\360\\\\215L,\\\\315a\\\\361\\\\363<\\\\375\\\\335\\\\363\\\\333'L\\\\303\\\\323\\\\002^!\\\\276\\\\322\\\\242&\\\\302\\\\332\\\\202\\\\3176\\\\340\\\\027\\\\233.\\\\027\\\\367\\\\353p\\\\376\\\\362\\\\305Wb\\\\327\\\\036}\\\\207\\\\204_\\\\376\\\\342\\\\347i\\\\264Z\\\\334]+\\\\015\\\\314,\\\\000\\\\306\\\\013Rk\\\\215\\\\361\\\\004\\\\210\\\\001\\\\254\\\\265\042\\\\202\\\\002\\\\244\\\\364\\\\300xF#k\\\\035[\\\\307\\\\202\\\\213p\\\\235\\\\235\\\\231+@\\\\227\\\\306\\\\004y4\\\\356\\\\214\\\\211\\\\263C>\\\\337\\\\363\\\\3224=}\\\\366\\\\336\\\\335\\\\335\\\\335\\\\371\\\\351\\\\243\\\\373\\\\333\\\\233\\\\017\\\\236?\\\\237\\\\315f\\\\316Z\\\\347\\\\\\\\\\\\232\\\\306\\\\313u\\\\350\\\\373\\\\376\\\\263\\\\213g\\\\213\\\\3712\\\\014\\\\303\\\\357}\\\\357{Q\\\\024\\\\336\\\\335\\\\335e/\\\\244\\\\274\\\\273\\\\273\\\\273x\\\\362x::\\\\263i\\\\344yA\\\\224F\\\\222F\\\\236r\\\\241\\\\213\\\\300*\\\\346\\\\201\\\\006\\\\227\\\\035\\\\354\\\\025\\\\036x\\\\200\01272ys\\\\252\\\\300P\\\\210\\\\302\\\\026\\\\035m\\\\303'R\\\\262{\\\\002\042\\\\352C_\\\\372\\\\324&c\\\\352\\\\314Q\\\\321\\\\212\\\\032s\\\\326\\\\321\\\\356\\\\225\\\\304\\\\265/]\\\\022\\\\272\\\\376s\\\\257\\\\357Dw{\\\\277Ea\\\\274\\\\013)Q\\\\016\\\\230\\\\371\\\\307\\\\033\\\\255'\\\\243\\\\301\\\\300\\\\363\\\\006\\\\201\\\\371\\\\372\\\\313/\\\\242\\\\305\\\\315bq\\\\037\\\\256\\\\227\\\\253\\\\325\042\\\\027\\\\003\\\\2420\\\\000\\\\000 \\\\000IDATZ\\\\207\\\\340,\042\\\\2028A\\\\000T\\\\231R!\\\\350x\\\\363\\\\336[%$\\\\342P\\\\262\\\\013\\\\000\\\\222q\\\\213\\\\010\\\\242\\\\200\\\\023\\\\026\\\\313\\\\203\\\\241\\\\317\\\\000\\\\226\\\\035\\\\243\\\\231\\\\014\\\\207A\\\\020\\\\254\\\\303\\\\345h\\\\340\\\\017\\\\207\\\\201\\\\210|\\\\357\\\\227\\\\277\\\\273\\\\232\\\\337\\\\0333\\\\272\\\\272\\\\272\\\\262\\\\326\042\\\\342\\\\365\\\\325\\\\325p4:=:^/WA\\\\020$Irs{\\\\375\\\\366\\\\355\\\\333\\\\247O\\\\237L\\\\247\\\\3230\\\\014\\\\215Q\\\\327\\\\227o^\\\\276|\\\\371\\\\353\\\\277\\\\366\\\\253i\\\\232\\\\372\\\\203\\\\321\\\\300\\\\242?\\\\031\\\\006\\\\003\\\\255\\\\255f\\\\217\\\\320\\\\240\\\\023\\\\213b0\\\\273\\\\331\\\\015\\\\000H\\\\010\\\\274\\\\275\\\\213\\\\016\\\\220\\\\037\\\\360m\042\\\\016m\\\\024\\\\261\\\\266TU\\\\032u\\\\233\\\\014k\\\\227\\\\320\\\\315c\\\\003-L\\\\331\\\\306\\\\210\\\\255\\\\214U\\\\215]\\\\262\\\\325\\\\2277\\\\360\\\\355\\\\371\\\\034\\\\300\\\\301q9\\\\366\\\\316\\\\234\\\\356R\\\\007A\\\\372\\\\00039\\\\224\\\\257\\\\267B\\\\345\\\\2139\\\\231\\\\177\\\\017\\\\213=9\\\\232\\\\274&\\\\\\\\-g\\\\313\\\\305l\\\\271Z\\\\244i\\\\312i\\\\262AB\\\\002\\\\202\\\\250\\\\230\\\\023\042\\\\022d*\\\\202\\\\344\\\\023\\\\002\\\\210s\\\\216r\\\\267\\\\005\\\\311\\\\334wX\\\\004@P+c\\\\214 \\\\222\\\\260\\\\0102\\\\263R*\\\\010\\\\202\\\\351tJ\\\\004\\\\244\\\\360\\\\372\\\\372\\\\372\\\\321\\\\361\\\\221\\\\357\\\\373G\\\\323\\\\361\\\\327_\\\\177\\\\2555\\\\031\\\\243\\\\336{v\\\\361\\\\371\\\\227_\\\\274\\\\367\\\\354\\\\371bvw~v6\\\\235N\\\\337\\\\276}\\\\373\\\\243\\\\177\\\\365W\042r|2=??\\\\037M\\\\216\\\\220\\\\324\\\\347_\\\\376\\\\342h2:\\\\321\\\\336`0\\\\236\\\\214\\\\002\\\\023\\\\030#\\\\2362~\\\\252p\\\\011\\\\016%\\\\267D3\\\\000\\\\022\012 !r\\\\356\\\\364\\\\306\\\\333E\\\\021\\\\000@:T\\\\216\\\\306\\\\356\\\\355\\\\272\\\\365]psY\\\\274\\\\265I\\\\3316\\\\225\\\\240\\\\262\\\\275\\\\353\\\\370\\\\262\\\\371\\\\331Ln\\\\245\\\\336\\\\376\042\\\\266-sO\\\\206n\\\\243\\\\347] e\\\\340f\\\\225\\\\311tH\\\\004P\\\\210\\\\214\\\\240\\\\002_\\\\331\\\\310&I2\\\\237\\\\317\\\\225R\\\\002\\\\034\\\\206\\\\313(\\\\\\\\\\\\200\\\\263\\\\032\\\\201\\\\265ff+\\\\234\\\\277'3\\\\333\\\\027\\\\002 n\\\\217\\\\033\\\\005\\\\005\\\\004\\\\220\\\\004\\\\005\\\\011\\\\221\\\\021E\\\\204\\\\3637F(E \\\\214\\\\200\\\\244\\\\214J\\\\323\\\\344\\\\346f\\\\245\\\\220\\\\216O&\\\\203\\\\301`8\\\\014.\\\\337\\\\276y\\\\362\\\\344\\\\311j\\\\265\\\\372\\\\360\\\\303\\\\017\\\\347\\\\367w\\\\317\\\\236=\\\\373\\\\352\\\\253\\\\257\\\\316\\\\316\\\\316\\\\346\\\\363y\\\\340\\\\371\\\\367\\\\263\\\\231\\\\357\\\\373i\\\\232\\\\236\\\\036\\\\037\\\\277}\\\\3736M\\\\323\\\\361x\\\\034%\\\\366\\\\323\\\\277\\\\377\\\\331\\\\311\\\\351\\\\321G\\\\317\\\\337\\\\367}?\\\\261\\\\034\\\\206!\\\\263x\\\\376(\\\\030L\\\\246\\\\203\\\\201\\\\362\\\\325\042u\\\\036@J\\\\031'\\\\261\\\\312/;fkR\\\\271{\\\\362\\\\260cm\\\\275\\\\327\\\\321\\\\303U;t\\\\231c\\\\032u\\\\211z|\\\\3426\\\\225#\\\\377\\\\342\\\\232gX\\\\033\\\\003\\\\355\\\\006x\\\\302\\\\352\\\\367\\\\302\\\\326\\\\261\\\\371\042\\\\273\\\\273\\\\316\\\\026\\\\356\\\\351\\\\252\\\\275\\\\222\\\\347 \\\\311\\\\335\\\\037\\\\330\\\\256\\\\252eou\\\\317\\\\227\\\\036\\\\310U\\\\016\\\\020akm\\\\232\\\\246I\\\\222\\\\020\\\\2011*I\\\\222(\\\\212\\\\262\\\\353\\\\335\\\\314\\\\220\\\\262K\\\\035K\\\\026\\\\242\\\\216@\\\\021\\\\001\\\\212\\\\022&\\\\001Dt\\\\010\\\\231\\\\246A\\\\200\\\\010,\\\\231\\\\232\\\\301\\\\010\\\\220\\\\0372#\0423\\\\263\\\\263\\\\212\\\\024;g\\\\223x\\\\265Z)\\\\015\\\\217OO\\\\2309\\\\010\\\\202\\\\347\\\\317\\\\237/\\\\357g\\\\227\\\\227\\\\227\\\\313\\\\305\\\\375d299\\\\236:\\\\347V\\\\253\\\\365\\\\363\\\\347\\\\357]_\\\\337j\\\\205F\\\\353\\\\257\\\\277\\\\376\\\\032\\\\200/\\\\236>Nbk\\\\255}\\\\372\\\\376{'\\\\323\\\\243\\\\305j\\\\2455\\\\275\\\\377\\\\3363\042J\\\\2228\012g\\\\236\\\\347\\\\215\\\\011<_\\\\373\\\\210\\\\011\012\\\\0001 H\\\\366\\\\212vt\\\\210\\\\002\\\\234\\\\353\\\\304\\\\271\\\\331\\\\271PV\\\\271\\\\345\\\\020\\\\006\\\\240\\\\351\\\\26694\\\\276\\\\326m\\\\267\\\\273\\\\2616\\\\300\\\\2559\\\\353\\\\025 n\\\\035\\\\363+\\\\302\\\\265]W\\\\356\\\\213?\\\\207`C\\\\346\\\\306\\\\364\\\\356\\\\252H\\\\177H\\\\177`\\\\026\\\\272%\\\\267\\\\\\\\\\\\345\\\\003\\\\251\\\\000\\\\\\\\\\\\222\\\\3308\\\\216W\\\\253\\\\325|>\\\\013\\\\357oEDi\\\\032\\\\016\\\\374\\\\325\\\\342\\\\236P3\\\\240s\042\\\\014\\\\250H!!\\\\242\042\\\\004`BA\\\\024\042D\\\\206<\\\\202\\\\242d*\\\\251\\\\240\\\\210c\\\\021\\\\021B \042\\\\021 \\\\317\\\\2008f\\\\326\\\\236\\\\011\\\\006S\\\\255\\\\365l6[>:\\\\2656\\\\031\\\\004\\\\301\\\\375\\\\375\\\\375\\\\311t\\\\372\\\\365\\\\327_\\\\023\\\\312\\\\333\\\\267o=\\\\317\\\\363<o4\\\\032i\\\\255\\\\237?\\\\177\\\\276^\\\\257\\\\223$\\\\321J\\\\335\\\\\\\\^1\\\\202g\\\\314x<\\\\366\\\\006\\\\203\\\\311\\\\361\\\\021\\\\360H\\\\203\\\\314\\\\346\\\\367g\\\\307G\\\\247\\\\247\\\\307\\\\243\\\\321(\\\\211\\\\026\\\\367I\\\\354+\\\\034\\\\014\\\\037'\\\\250\\\\\\\\\\\\346/GHH\\\\216\\\\204\\\\000Y@\\\\321\\\\326\\\\274\\\\234\\\\271\\\\304\\\\241\\\\310fv7\\\\246\\\\346Qh\\\\010\\\\326X\\\\350\\\\270\\\\215B\\\\272{!\\\\330\\\\303\\\\334\\\\265A=Hs\\\\330\\\\213\\\\255B\\\\177c\\\\206v\\\\325\\\\342`I\\\\374\\\\355\\\\360z\\\\315\\\\260\\\\230m\\\\332\\\\021\\\\221\\\\221\\\\302(\\\\272\\\\271\\\\271\\\\371\\\\346\\\\213\\\\237\\\\205\\\\213\\\\353\\\\345|\\\\216.!\042BR\\\\230]\\\\255&\\\\310\\\\356X\\\\263\\\\303\\\\342*\\\\2070\042\\\\242B\\\\021B@\\\\022V\\\\010@\\\\212X\\\\201\\\\023f\\\\306\\\\354\\\\346H\\\\266qTJ+2J\\\\264\\\\022\\\\337\\\\367\\\\265\\\\301\\\\331l\\\\366\\\\344\\\\311\\\\371\\\\315\\\\315\\\\315`0\\\\320\\\\010\\\\247''\\\\341r\\\\261^\\\\205\\\\226$;^q\\\\316%qh\\\\214\\\\371\\\\364\\\\323\\\\237|\\\\362\\\\311'G\\\\323qb\\\\3238u\\\\276\\\\357\\\\307I\\\\002\\\\000gggi\\\\034\\\\245q\\\\222$\\\\211\\\\2078\\\\011\\\\202\\\\220\\\\243u\\\\022\\\\271h\\\\301\\\\340\\\\233\\\\311S\\\\017\\\\225\\\\005\\\\024@F\\\\004$\\\\024\\\\024\\\\004(\\\\355\\\\376\\\\260\\\\370\\\\257\\\\343\\\\244{\\\\263\\\\371\\\\250\\\\364p\\\\356y]\\\\244\\\\354\\\\340>\\\\373\\\\334\\\\355\\\\375<\\\\332\\\\003\042n\\\\356\\\\321\\\\344\\\\273\\\\267r\\\\202]V\\\\333\\\\233\\\\312c\\\\214\\\\210\\\\331\\\\033\\\\203\\\\232\\\\037\\\\225\\\\200\\\\245/UF\\\\251\\\\327\\\\336\\\\210\\\\007\\\\221\\\\260\\\\211\\\\203w[\\\\307\\\\000\\\\214(\\\\331\\\\337.\\\\244\\\\332\\\\217\\\\273\\\\220m_\\\\225\\\\243d4\\\\364^\\\\216\\\\263\\\\3016\\\\025\\\\247)\\\\000h\\\\255Q\\\\231U\\\\264v J)/\\\\360\\\\265\\\\3622\\\\317!\\\\2434\\\\021(Dfk\\\\255M\\\\235\\\\315T\\\\024\\\\313\\\\3169\\\\307\\\\314(\\\\016\\\\304iM\\\\306\\\\030\\\\337\\\\350\\\\300W\\\\003_\\\\005\\\\036\\\\371\\\\212|\\\\005\\\\310\\\\216\\\\223X\\\\330y\\\\212\\\\330\\\\272p\\\\261\\\\004\\\\200'\\\\347\\\\217\\\\235K\\\\027\\\\363\\\\373\\\\321h\\\\344\\\\222\\\\370\\\\342\\\\311\\\\223\\\\345\\\\374~2\\\\231\\\\034O\\\\247\\\\027\\\\347\\\\217o.\\\\257.\\\\316/\\\\222u2\\\\364\\\\207\\\\311:Ic\\\\373\\\\3157/\\\\227\\\\253\\\\365\\\\361\\\\351\\\\231\\\\265\\\\274X,5R\\\\262\\\\216\\\\\\\\j?\\\\372\\\\360\\\\303\\\\217?\\\\376X!\\\\275y\\\\363f6\\\\233\\\\005\\\\201w~z\\\\342i5\\\\277\\\\275\\\\014T\\\\342\\\\341\\\\332@D\\\\230f!F\\\\030\\\\261\\\\3204Q\\\\000\\\\2053f\\\\025$i\\\\177\\\\377F\\\\333\\\\370j\\\\255ui#\\\\310\\\\033\\\\001\\\\\\\\\\\\304\\\\243(\\\\316l2\\\\203\\\\237\\\\350m\\\\344\\\\236\\\\214}\\\\013t\\\\005f\\\\331\\\\201\\\\250\\\\0358\042v\\\\330\\\\247\\\\001\\\\262\\\\270>{\\\\324\\\\342\\\\302\\\\366\\\\27492-\\\\324\\\\364\\\\256\\\\273\\\\200\\\\210\\\\000@\\\\371\\\\036`\\\\307\\\\236 %$\\\\262\\\\365\\\\377\\\\316J5Xc\\\\032\\\\375\\\\2637>\\\\215\\\\310E_e\\\\334_\\\\372Y\\\\314\012(>\\\\263\\\\373\\\\244\\\\000B\\\\244P)\\\\316\\\\3313\\\\325Z\\\\317\\\\357W\\\\244\\\\325\\\\321\\\\321\\\\321\\\\364\\\\370(Z\\\\271pq\\\\253\\\\2651\\\\301@D$M\\\\235KQ\\\\020\\\\025\\\\020\\\\002\\\\243 \\\\002\\\\022e\\\\321\\\\272\\\\254e\\\\266)\042\\\\032R\\\\011[\\\\362\\\\215\\\\321\\\\276\\\\227\\\\007\\\\3040\\\\314\\\\300i\\\\342\\\\210\\\\330\\\\245\\\\236\\\\361\\\\002\\\\215\\\\214:q&\\\\211\\\\3428\\\\\\\\\\\\237\\\\236\\\\034\\\\017}\\\\317%\\\\361\\\\344\\\\311\\\\331j\\\\265\\\\270\\\\270\\\\270\\\\270\\\\276\\\\274\\\\034\\\\015\\\\206Q\\\\024\\\\235\\\\034\\\\235\\\\306ar<y\\\\264\\\\\\\\\\\\256\\\\\\\\*G\\\\203\\\\223\\\\333\\\\253\\\\373\\\\225KV\\\\366\\\\345\\\\361\\\\321\\\\351\\\\311\\\\321d2\\\\231\\\\214G\\\\303\\\\241\\\\357\\\\315n\\\\357\\\\314\\\\311\\\\221\\\\347\\\\017\\\\236=}\\\\362\\\\372\\\\365ko0\\\\034h?Mb\\\\337W\\\\263W\\\\237\\\\246zt\\\\372\\\\364\\\\243\\\\353\\\\325R\\\\374SG(\\\\030(mD\\\\004\\\\2011\\\\327;D\\\\362x\\\\355\\\\275\\\\2742\\\\313\\\\251\\\\247sR\\\\266\\\\014\\\\026\\\\237\\\\000;\\\\266\\\\263\\\\207\\\\350\\\\224\\\\355y\\\\232}3\\\\332\\\\201u\\\\007\\\\374}Ed\\\\313\\\\323\\\\325\\\\011\\\\220uh\\\\311\\\\027|S\\\\262\\\\254\\\\300T\\\\247\\\\\\\\\\\\251&\\\\336\\\\025\\\\317\\\\345\\\\245\\\\254\\\\322\\\\207\\\\270\\\\231\\\\217\\\\331\\\\265\\\\245\\\\314:\\\\014\\\\314\\\\342\\\\234s\\\\234\042\\\\312\\\\355\\\\355\\\\365\\\\333\\\\027_\\\\275~\\\\363r:\\\\235^\\\\276\\\\376*\\\\013\\\\341\\\\225\\\\011 f6N13\\\\013\\\\203\\\\010\\\\000\\\\213\\\\313\\\\242|\\\\221RD\\\\200\\\\226\\\\204\\\\004\\\\020\\\\330\\\\030\\\\3179\\\\267^\\\\257|\\\\337\\\\037\\\\006\\\\001\\\\021\\\\331$M\\\\300\\\\022[\\\\243\\\\225\\\\247\\\\000\\\\304\\\\021\\\\210\\\\357\\\\373\\\\236\\\\326\\\\354\\\\234!e]\\\\242IEQ\\\\204\\\\300I\\\\034\\\\015\\\\374`2\\\\231h$f\\\\230\\\\014'\\\\340\\\\026f\\\\352]^^\\\\372\\\\332W\\\\312\\\\014\\\\214\\\\271\\\\235\\\\335\\\\277\\\\370\\\\346\\\\225\\\\037\\\\230\\\\367\\\\036_|\\\\370\\\\374\\\\331\\\\305\\\\223'\\\\301d\\\\254\\\\265I\\\\323d\\\\265Z\\\\257\\\\327\\\\361:J\\\\216O\\\\036\\\\245i\\\\272\\\\\\\\\\\\206\\\\221K\\\\357\\\\243k\\\\345\\\\007z\\\\360\\\\010<tL\\\\214\\\\310\\\\270\\\\015oN\\\\300\\\\233X\\\\300\\\\3045\\\\023D\\\\307(gi\\\\257sR\\\\225]\\\\312\\\\0107\\\\300\\\\206M\\\\336\\\\377g\\\\220>V\\\\227\\\\206R\\\\324y\\\\014\\\\325\\\\243\\\\366\\\\215\\\\346P\\\\252=g\\\\331f]\\\\274\\\\365\\\\314\\\\022\\\\031 \\\\013\\\\271H\\\\002\\\\220\\\\355\\\\242\\\\211 I\\\\342G\\\\247'\\\\363\\\\353W\\\\316\\\\245\\\\361:\\\\264I:\\\\360}q\\\\2111\\\\03633\\\\223\\\\023\\\\262\\\\226Q\\\\204\\\\205\\\\011\\\\204@\\\\010I\\\\023($&0\012Q\\\\200\\\\010\\\\215&\\\\227\\\\246\\\\010\\\\250\\\\211\\\\024\\\\002;\\\\013\\\\316*@@4\\\\232\\\\214\\\\322\\\\302B\\\\000Jk\\\\205\\\\230$\\\\211\\\\265\\\\3263\\\\312(=\\\\237\\\\335/Fcf\\\\036\\\\015\\\\206J\\\\251\\\\301`d\\\\255\\\\325Z\\\\237\\\\234\\\\234,\\\\303X{^b#\\\\337\\\\367\\\\027\\\\213\\\\3734M\\\\225R\\\\223\\\\311d2\\\\231(\\\\245\\\\254\\\\315\\\\267\\\\263\\\\243\\\\321\\\\310\\\\017\\\\002\\\\245\\\\365\\\\2337o\\\\2141\\\\376p`\\\\214Y\\\\306\\\\311\\\\355\\\\355\\\\234\\\\2067g\\\\317\\\\317\\\\200H\\\\234\\\\000\\\\262\\\\210\\\\020\042\\\\202 l\\\\314\\\\010\\\\2331l;gh\\\\013\\\\361Q\\\\361\\\\207\\\\336\\\\277okz\\\\324\\\\265\\\\235\\\\352@\\\\325\\\\010y\\\\000\\\\236\\\\003ds\\\\336I\\\\345ULvt\\\\247\\\\235\\\\374Y\\\\307\\\\2661t\\\\265\\\\355\\\\345R{\\\\011+R~tKH\\\\010\\\\220o\\\\354\\\\224(MB\\\\303\\\\223\\\\243\\\\350\\\\351\\\\223\\\\367\\\\237=\\\\375\\\\333\\\\177\\\\363\\\\365\\\\3007\\\\310\\\\011\\\\002(@\\\\0044\\\\244Xi\\\\024`f\\\\006TH\\\\314\\\\214(\\\\006\\\\210P\\\\024\\\\002\\\\223\042@\\\\245I\\\\241\\\\220Q\\\\2017\\\\030\\\\014|\\\\021I\\\\326\\\\221\\\\265\\\\326hR\\\\236\\\\326\\\\244\\\\210(\\\\013\\\\265\\\\225\\\\007\\\\374d\\\\211\\\\302\\\\365\\\\340\\\\364\\\\010Q-\\\\026\\\\367o\\\\336\\\\274\\\\231N\\\\247\\\\201\\\\347GQ\\\\344)\\\\317\\\\363\\\\2744M\\\\037?}:\\\\377\\\\352\\\\233\\\\321ht\\\\177\\\\277\\\\360<\\\\357\\\\342\\\\342\\\\002o\\\\257g\\\\267w\\\\367\\\\267\\\\367i\\\\030\\\\305\\\\311\\\\305\\\\351\\\\311\\\\311{\\\\317\\\\337G`O\\\\2334M\\\\2151\\\\331\\\\235\\\\3318\\\\216\\\\243\\\\330\\\\0323B\\\\2264\\\\216\\\\001\\\\330%)\\\\013\\\\222\\\\016,\\\\013\\\\252\\\\354\\\\335\\\\000Pc\\\\350\\\\375cZNz\\\\243\\\\344\\\\355\\\\014\\\\006\042\\\\346>\\\\\\\\Pe\\\\235n\\\\006\\\\255\\\\373*\\\\224\\\\224\\\\354F\\\\375\\\\241\\\\0169\\\\364\\\\235\\\\330{\\\\254\\\\031\\\\355\\\\334/\\\\245\\\\006nt\\\\217\\\\203\\\\031\\\\272&\\\\247\\\\233\\\\204B\\\\023\\\\331%\\\\372\\\\263\\\\240\\\\370\\\\230]\042\\\\022E \\\\200\\\\203\\\\321\\\\360\\\\365\\\\213\\\\327\\\\303\\\\300\\\\177tr\\\\354\\\\033m\\\\024E\\\\353\\\\304hp6\\\\021\\\\021\\\\004\\\\3614)T\\\\314(B\\\\220\\\\037+\\\\346\\\\301\\\\370\\\\201@\\\\2212\\\\244<\\\\243DR@\012\\\\214\\\\036\\\\370FD8Q\\\\302\\\\026\\\\005<\\\\317\\\\003v\012a\\\\340\\\\373\\\\210(\\\\316\\\\021\\\\221\\\\326$\\\\302.\\\\345$M\\\\002\\\\023\\\\204\\\\213\\\\365\\\\300\\\\033F*\\\\232L&ND)\\\\022\\\\332D\\\\330P\\\\032\\\\010\\\\001q\\\\261X\\\\001\\\\313(\\\\0308\\\\326\\\\354\\\\354\\\\375\\\\375\\\\375\\\\345\\\\345\\\\345\\\\321\\\\321\\\\344\\\\364\\\\344h<\\\\036\\\\217'\\\\023\\\\007psss}w7\\\\032\\\\215F\\\\343\\\\351|\\\\025\\\\021\\\\201s)\04223)RZ\\\\333\\\\304B\\\\345\\\\364\\\\033\\\\266lP\\\\351\\\\270b\\\\373\\\\324\\\\230\\\\362`\\\\215M*\\\\307\\\\001\\\\007(\\\\2159+\\\\337\\\\373)\\\\304\\\\255\\\\370\\\\273\\\\361\\\\364,\\\\273\\\\371\\\\276\\\\32576\\\\333A|(Cos\\\\002\\\\300N\\\\334\\\\223\\\\036\\\\342\\\\031\\\\200Qeb\\\\010\\\\0018\\\\217k\\\\301\\\\002\\\\342\\\\004\\\\204\\\\255;\\\\236\\\\214W\\\\313%\\\\2018\\\\233\\\\372\\\\236f\\\\233\\\\244\\\\251CD\\\\245\\\\224\\\\321\\\\332#m9\\\\363\\\\011\\\\003\\\\233E\\\\016\\\\020@\\\\024`B\\\\022\\\\255U`43\\\\260K\\\\331\\\\245\\\\342<\\\\317\\\\363h4\\\\326\\\\244l\\\\222d\\\\327R\\\\011P\\\\023\\\\021\\\\221\\\\025QJ\\\\371\\\\306(\\\\3428\\\\216\\\\025\\\\340\\\\331\\\\331Y\\\\022\\\\305\\\\326\\\\3324q\\\\2767\\\\210\\\\242\\\\310\012\\\\237\\\\234\\\\234.\\\\226\\\\241?\\\\030Fww\\\\301h\\\\270\012C\\\\245\\\\224\\\\326\\\\036z\\\\310\\\\254\\\\011%\\\\360\\\\203$u\\\\267\\\\267\\\\263\\\\363Gg\\\\313\\\\345r6\\\\233\\\\305q\\\\234\\\\251\042q\\\\034\\\\257\\\\302\\\\313(\\\\005g9\\\\211\\\\327\\\\340\\\\2542\\\\350\\\\031\\\\215\\\\212T\\\\266D \\\\252|[Ql0\\\\032^v\\\\277WB\\\\347\\\\303S\\\\332N\\\\362\\\\246\\\\340n\\\\311\\\\314\\\\\\\\\\\\265#\\\\215\\\\266\\\\362\\\\270)\\\\036\\\\005\\\\347\\\\253Y')=\\\\225\\\\346>\\\\023\\\\251\\\\362\\\\264\\\\005s\\\\245\\\\231\\\\205\\\\257H\\\\371D\\\\2639\\\\322i;\\\\260\\\\262\\\\3045\\\\276I\\\\266\\\\221f\\\\002\\\\314.\\\\351\\\\240\\\\210`\\\\026h\\\\202\\\\200X\\\\3420\\\\234\\\\216\\\\207\\\\263\\\\353\\\\327\\\\337|\\\\371E\\\\270\\\\\\\\\\\\200c\\\\243T\\\\314\\\\234\\\\332\\\\324\\\\220\042EF+\\\\215\\\\344\\\\034\\\\001\\\\200R\\\\030:\\\\013y\\\\020\\\\013AF\\\\000\\\\326\\\\212\\\\264B@r\\\\250\\\\000\\\\304\\\\246\\\\211\042\\\\364\\\\264R\\\\303\\\\201\\\\325\\\\3329g<\\\\245\\\\265&@`\\\\321\\\\244\\\\010I\\\\230Q)t\\\\316\\\\017|`\\\\360\\\\265\\\\247@y\\\\236\\\\317,\\\\016\\\\300(\\\\035\\\\370\\\\303\\\\325:\\\\314fT\\\\340\\\\017\\\\227\\\\353\\\\310\\\\245\\\\016Y\\\\010\\\\320x\\\\236\\\\357\\\\233\\\\3410 \\\\242\\\\371b\\\\361\\\\305W_^\\\\\\\\\\\\\\\\\\\\020\\\\321\\\\345\\\\325M\\\\234\\\\330$IF\\\\243\\\\321h4Im\\\\304\\\\214\\\\253\\\\325\042\\\\265\\\\211&`\\\\024\\\\347R\\\\245\\\\020A\\\\362#\\\\246\\\\322\\\\353\\\\037\\\\262\\\\341\\\\352'\\\\032\\\\362\\\\244\\\\013\\\\025\\\\273\\\\302\\\\007\\\\015\\\\203\\\\221\\\\233\\\\262\\\\233G\\\\250\\\\351\\\\347a\\\\332s\\\\243V\\\\272o\\\\341n5\\\\360uj \\\\334\\\\244\\\\2504/bM8;\\\\372\\\\267\\\\325\\\\344\\\\3228*\\\\202\\\\331\\\\033z0O \\\\231\\\\011N)\\\\305\\\\261$\\\\361\\\\372_\\\\376\\\\331\\\\277x\\\\365\\\\352\\\\2258\\\\247I\\\\255\\\\226wF+p,H\\\\210hH)\\\\245\\\\010\\\\020\\\\220\\\\015\\\\251\\\\024\\\\011\\\\200\\\\025\042\\\\221\\\\022\\\\024\\\\021T\\\\220k\\\\306\\\\306x(\\\\340\\\\034\\\\247a\\\\204\\\\236\\\\347y\\\\336`\\\\344\\\\245i:\\\\030\\\\014\\\\024R\\\\034\\\\307\\\\3169\\\\245\\\\224Br\\\\316\\\\011\\\\212\\\\361\\\\274\\\\321p\\\\262Z\\\\255\\\\206\\\\376P)\\\\035\\\\004\\\\301r\\\\271T\\\\236\\\\011\\\\202\\\\200A\\\\2141\\\\213p\\\\035\\\\004A\\\\222\\\\256\\\\210(\\\\010\\\\002\\\\225\\\\252\\\\210#g\\\\035\\\\033\\\\360\\\\274`<\\\\236\\\\214\\\\307\\\\243\\\\273\\\\331\\\\375\\\\351\\\\351)\042\\\\336\\\\334\\\\334d\\\\342Yk\\\\255\\\\215\\\\037\\\\030/\\\\266.\\\\\\\\G6\\\\211=\\\\310l:Vy\\\\201\\\\270\\\\352;\\\\0243\\\\305\\\\243\\\\277 \\\\313\\\\222.\\\\2028\\\\225\\\\306c;\\\\366He,\\\\270\\\\211\\\\207\\\\3200T\\\\033\\\\235\\\\273\\\\\\\\q\\\\366\\\\036;\\\\204\\\\246=i\\\\231\\\\266\\\\262>J\\\\2658\\\\036PZ@j\\\\347\\\\224X\\\\222\\\\265\\\\025\\\\234\\\\025\\\\0349\\\\001TR\\\\300J\\\\352G\\\\321\\\\352\\\\352\\\\352\\\\324$\\\\357\\\\245\\\\011\\\\177\\\\226!3E7Z\\\\036\\\\033\\\\201\\\\350\\\\034{\\\\003O\\\\221\\\\271\\\\277\\\\277\\\\037\\\\017\\\\207\\\\232\\\\274\\\\253\\\\327\\\\257\\\\216F\\\\003\\\\002\\\\371\\\\263\\\\177\\\\376\\\\317\\\\377\\\\356\\\\357~,6M\\\\243\\\\365by?\\\\031\\\\004i\\\\022#b\\\\340\\\\371\\\\276\\\\3614)\\\\243\\\\015\\\\240JmL\\\\200F\\\\021\\\\242\042\\\\304\\\\315\\\\253\\\\000Q\\\\001\\\\2408\\\\2435\042j\\\\242l\\\\025@\\\\000\\\\266\\\\326!)\\\\2444N\\\\254\\\\0003\\\\0133\\\\013(C\\\\276\\\\357+@\\\\317\\\\363\\\\254e\\\\255<\\\\233r\\\\242\\\\354b\\\\261\\\\032\\\\014\\\\006\\\\316\\\\212V\\\\0363\\\\254\\\\327\\\\361b\\\\276\\\\002\\\\200\\\\341ptuu\\\\355Rg\\\\235%\\\\242 \\\\360\\\\203\\\\201\\\\027\\\\307\\\\361\\\\365\\\\355-\\\\243\\\\234=>_\\\\256\\\\326\\\\326Z\\\\026\\\\274\\\\233\\\\315/..\\\\220\\\\264\\\\265\\\\026\\\\321\\\\271\\\\304-V\\\\341d2Q\\\\236\\\\2272\\\\030\\\\255X8\\\\033\\\\027\\\\004\\\\331\\\\034}d\\\\234'\\\\345\\\\223\\\\324\\\\266\\\\330\\\\245eF\\\\257x\\\\333mes}ft_\\\\016\\\\357\\\\344\\\\200\\\\355\\\\367\012g\\\\357\\\\235s\\\\373Tp\\\\351\\\\357\\\\223\\\\005\\\\000\\\\200\\\\231e\\\\263A|~[\\\\261\\\\360\\\\244\\\\323.^E\\\\016\\\\340\\\\373~\\\\270\\\\016\\\\205\\\\243\\\\243\\\\311\\\\344\\\\366\\\\372&\\\\211\\\\327g\\\\307GwWo\\\\377\\\\350\\\\377\\\\370\\\\337o._\\\\372\\\\306\\\\304\\\\011\\\\234\\\\234\\\\234\\\\210]{\\\\036)\\\\302\\\\304\\\\255=\\\\317\\\\033\\\\014\\\\006\\\\201\\\\361\\\\2141\\\\316ZBA\\\\201\\\\321p\\\\010\\\\216\\\\231m\\\\346\\\\262 \042,V\\\\234(\\\\255\\\\263`\\\\\\\\\\\\272\\\\320*K#P\\\\034\\\\014Sv\\\\347O)\\\\005h\\\\264\\\\357y^\\\\034\\\\257\\\\3438\\\\006\\\\200\\\\311\\\\230\\\\202 P\\\\306\\\\370\\\\276o\\\\264\\\\241\\\\311d1_\\\\255\\\\242u\\\\232Z\\\\337\\\\367\\\\323$T\\\\240\\\\234u\\\\261$Z\\\\353\\\\301\\\\320\\\\367\\\\375\\\\001\\\\241z\\\\371\\\\362\\\\365x<<99\\\\361<\\\\357\\\\352\\\\352\\\\312\\\\030sqq1\\\\237\\\\317\\\\217\\\\246SR\\\\200\\\\354\\\\376\\\\376'?\\\\376\\\\225\\\\337zD\\\\344)R\\\\016\\\\265KmF[\\\\366F\\\\030G\\\\\\\\\\\\0136\\\\337\\\\334\\\\223\\\\225.\\\\315\\\\232Y\\\\034\\\\007\\\\356\\\\310f\\\\330U^\\\\363\\\\201\\\\334\\\\341\\\\206-3\\\\345\\\\216\\\\004T\\\\326\\\\201r\\\\317\\\\321]:*_\\\\372\\\\306\\\\231n\\\\244>\\\\207d\\\\246\\\\334\\\\226\\\\212*\\\\331\\\\263*\\\\352\\\\252K\\\\271\\\\007v\\\\237\\\\226\\\\255.\\\\345\\\\373\\\\213%5\\\\254\\\\\\\\\\\\244\\\\305\\\\013\\\\254\\\\015\\\\210\\\\210\\\\236\\\\362@\\\\201Rj8\\\\360=\\\\302\\\\233\\\\313\\\\253\\\\377\\\\373\\\\217\\\\377\\\\370\\\\353\\\\257~qq~\\\\274v\\\\311@\\\\037\\\\335\\\\274}9\\\\030\\\\014no\\\\336\\\\016\\\\002_\\\\004\\\\2646C\\\\177\\\\340\\\\373\\\\276g\\\\264MR`'\\\\316i\\\\035\\\\270\\\\324Z\\\\227\\\\341\\\\024\\\\000p\\\\016\\\\263\\\\333+\\\\300B\\\\224\\\\275)e[\\\\2518Q\\\\264\\\\215:\\\\207\\\\210z\\\\303\\\\372\\\\214\\\\310\\\\002\\\\306\\\\013\\\\202`\\\\350y\\\\032\\\\021\\\\027\\\\363\\\\325t:U\\\\312\\\\014\\\\207c?\\\\010n\\\\256g7\\\\263\\\\331:\\\\214\\\\265\\\\362\\\\210\\\\022M\\\\230$\\\\211\\\\215\\\\223\\\\304\\\\350`\\\\3401H\\\\352l0\\\\030\\\\\\\\]\\\\337~\\\\363\\\\342\\\\325x4\\\\032M\\\\217\\\\254\\\\300\\\\325\\\\355\\\\335\\\\374\\\\356\\\\226\\\\020\\\\311\\\\004\\\\323\\\\311\\\\350\\\\313/?\\\\377\\\\356\\\\017\\\\177\\\\327\\\\252\\\\0040fpy$\\\\244\\\\302j\\\\207\\\\233\\\\261\\\\330\\\\235\\\\201\\\\245\\\\201\\\\304\\\\312\\\\227,\\\\365\\\\275\\\\365]\\\\032\\\\260\\\\346\\\\241\\\\302-\\\\035;\\\\031\\\\366\\\\352@\\\\265\\\\2126N'$\\\\371\\\\001u\\\\351\\\\023\\\\241\\\\006)Z\\\\276O\\\\262\\\\002@\\\\021\\\\313\\\\245[\\\\242\\\\267\\\\321\\\\334\\\\223A\\\\017\\\\312\\\\357\\\\234\\\\363}\\\\237\\\\210\\\\302\\\\345j<\\\\030^/\\\\027\\\\377\\\\327\\\\377\\\\371\\\\307?\\\\373\\\\351\\\\247\\\\377\\\\360\\\\267~\\\\303FK9\\\\036\\\\177\\\\371\\\\363\\\\037O&\\\\223\\\\331\\\\315\\\\233 \\\\010\\\\3224Q\\\\212<\\\\317\\\\013\\\\202\\\\300\\\\030\\\\343)\\\\245\\\\220P\\\\234\\\\265\\\\026\\\\330\\\\201R\\\\200\\\\331\\\\200\012\042*\\\\245\\\\264\\\\326\\\\222\\\\246\\\\262\\\\011\\\\251_\\\\304\\\\264\\\\005\\\\310\\\\243i\\\\225#)\\\\022j\\\\004\\\\322\\\\312 \\\\020\\\\000y\\\\236\\\\036\\\\006\\\\003\\\\3177b]\\\\232\\\\306\\\\217\\\\036=:\\\\231\\\\036)\\\\317\\\\037\\\\217\\\\307\\\\247\\\\307'q\\\\034\\\\317`\\\\316\\\\000I\\\\224&6UH\\\\026 M\\\\355j\\\\271\\\\006Dc\\\\214\\\\210L\\\\247\\\\323\\\\371|\\\\276\\\\0048>>^,\\\\026\\\\263\\\\331\\\\354dz\\\\364\\\\366\\\\355\\\\353\\\\351\\\\311\\\\343\\\\343\\\\247O\\\\226w1[\\\\347\\\\017<V\\\\332\\\\201\\\\026\\\\021\\\\312\\\\374d\\\\362\\\\010]\\\\000 \\\\273\\\\257H\\\\352\\\\325\\\\355\\\\272\\\\370\\\\335\\\\021\\\\327\\\\242\\\\314\\\\342\\\\355\\\\3574\\\\311\\\\245\\\\362F\\\\222\\\\025W\\\\001\\\\272\\\\254\\\\034-\\\\220\\\\314=\\\\205\\\\2210w\\\\256\\\\330|b\\\\351\\\\373\\\\006R\\\\224\\\\252\\\\310\\\\362\\\\246n\\\\310e\\\\2004<m\\\\221\\\\254\\\\273\\\\024\\\\226\\\\326\\\\201\\\\006\\\\271Q}Op\\\\213\\\\236\\\\275SP\\\\001\\\\211\\\\3434\\\\265l\\\\335]x\\\\367\\\\327\\\\177\\\\375\\\\327\\\\257^\\\\275\\\\372\\\\215_\\\\373\\\\341\\\\361\\\\304\\\\177\\\\273\\\\272_\\\\314\\\\347\\\\247\\\\247\\\\247?\\\\377\\\\364\\\\325p8\\\\276\\\\273\\\\015\\\\011\\\\225\\\\247\\\\375\\\\300\\\\037fW\\\\0005)\\\\255\\\\265&`\\\\353\\\\302\\\\345\\\\234\\\\224\\\\322\\\\004\\\\314,\\\\342@\\\\0003\\\\206\\\\336nds\\\\267\\\\224|\\\\001\\\\316^?\\\\210\\\\212\\\\260\\\\010\\\\015J\042\\\\310\\\\200Z+T\\\\312\\\\201\\\\304i\\\\002\\\\004\\\\201\\\\357\\\\373\\\\303\\\\201\\\\347\\\\005\\\\316I8\\\\233\\\\207\\\\253u\\\\232:M\\\\206\\\\000\\\\243h\\\\035\\\\004\\\\201\\\\015\\\\363\\\\331\\\\342\\\\234[\\\\255V^`\\\\202 x}\\\\371\\\\372\\\\342\\\\342b8\\\\231\\\\\\\\__\\\\343\\\\253\\\\327\\\\276\\\\357\\\\023`\\\\250\\\\303\\\\331\\\\315\\\\345\\\\354~\\\\225\\\\342@\\\\274\\\\3437o_\\\\275?y\\\\244\\\\0249fU\\\\214\\\\016\\\\010\\\\344\\\\357\\\\252\\\\313\\\\374\\\\360\\\\252\\\\301\\\\002\\\\273S\\\\337[\\\\337\\\\205\\\\356\\\\321\\\\0261?g\\\\3502\\\\353\\\\267k\\\\325\\\\365\\\\371S\\\\302Y\\\\366v(<\042pc\\\\230l\\\\360\\\\205h\\\\301\\\\323\\\\312\\\\321-\\\\022\\\\272\\\\017C\\\\227\\\\352\\\\332E\\\\200\\\\210\\\\365\\\\205\\\\242\\\\017U\042\\\\242\\\\265^\\\\257\\\\302\\\\321`\\\\360\\\\342\\\\352\\\\232\\\\023\\\\376\\\\203\\\\337\\\\377\\\\017?|\\\\376\\\\354\\\\352\\\\315\\\\327\\\\327\\\\227/\\\\237?\\\\177\\\\376\\\\367?\\\\376\\\\253\\\\301`\\\\364\\\\346\\\\365\\\\327\\\\223\\\\221\\\\037G\\\\2411\\\\306\\\\363<\\\\255533\\\\263\\\\326\\\\232\\\\224\\\\307h\\\\215\\\\366\\\\001Y\\\\204\\\\234s\\\\316\\\\345q\\\\232\\\\025\\\\240\\\\031\\\\014\\\\230\\\\231Y*\\\\035\\\\236E\\\\277\\\\315e3m]z\\\\2309M\\\\035\012y\\\\244\\\\215\\\\361}\\\\337'\\\\244\\\\314\\\\217\\\\357\\\\350\\\\350h2\\\\231\\\\246i\\\\252\\\\265\\\\227_\\\\002G\\\\265\\\\216\\\\2225\\\\306DZ\\\\2010[+\\\\214\\\\210\\\\201?||~quu\\\\225\\\\255?\\\\271)\\\\032i\\\\261Xx\\\\236\\\\027\\\\206\\\\341\\\\213\\\\027/\\\\246O\\\\203\\\\027/^<\\\\375\\\\350\\\\007\\\\032\\\\300Z\\\\353k\\\\223\\\\275\\\\3716\\\\353\\\\333\\\\342\\\\037\\\\222\\\\246\\\\323Bhu\\\\017\\\\336\\\\336)\\\\3346\\\\270t2\\\\274\\\\333\\\\013\\\\214\\\\250v\\\\355\\\\202\\\\262\\\\201W\\\\342\\\\2527\\\\033\\\\001;fK\\\\231\\\\324]\\\\205\\\\270Bw\\\\233\\\\256\\\\\\\\\\\\235\\\\036m:E\\\\033\\\\015\\\\305\\\\002\\\\323\\\\374\\\\264\\\\304\\\\262M\\\\031\\\\016\\\\323|v\\\\200\\\\214(4\012F\\\\244`2\\\\231\\\\374\\\\326o\\\\375\\\\326\\\\323\\\\307\\\\347q\\\\2708\\\\032\\\\232\\\\243\\\\241\\\\027G\\\\2537/?\\\\277\\\\275\\\\271<::\\\\002\\\\266\\\\203\\\\301Hkm\\\\214Q\\\\3128\\\\227\\\\260\\\\344^\\\\020\\\\000\\\\340\\\\373>\\\\273\\\\3249\\\\001\\\\024P\\\\206(\\\\363\\\\354\\\\003\\\\2454\042#\\\\362vO/$\042\\\\2503\\\\345\\\\204pGB\\\\013\\\\242r\\\\302\\\\251\\\\263\\\\276\\\\362\\\\374\\\\301`0\\\\360m\\\\222Fa\\\\264^G\\\\276\\\\037|\\\\370\\\\341\\\\207\\\\313\\\\345\\\\322\\\\246\\\\374\\\\223Uhc\\\\233!4\\\\306\\\\004A\\\\220:r\\\\216\\\\304&\\\\326\\\\332\\\\373\\\\345\\\\342\\\\331\\\\263\\\\213\\\\313\\\\313\\\\313\\\\361d\\\\034\\\\004\\\\301\\\\362~\\\\036E\\\\221Q\\\\372\\\\361\\\\343\\\\307\\\\342\\\\326\\\\251\\\\303\\\\245U\\\\306\\\\030k\\\\023\\\\245Hk\\\\035\\\\344\\\\241\\\\222\\\\266\\\\033\\\\231\\\\202\\\\241\\\\373+\\\\207Y\\\\322D$\\\\300y\\\\250\\\\307B\\\\201\\\\331r0\\\\2118\\\\200\\\\354\\\\025\\\\242\\\\231\\\\310\\\\334\\\\3615\\\\333\\\\210\\\\314-\\\\303A\\\\215i\\\\232\\\\204V\\\\206\\\\247\\\\210?]\\\\341\\\\332\\\\006\\\\276i\\\\223v}\\\\364\\\\324\\\\356G\\\\345\\\\251\\\\333\\\\224![%\\\\250\\\\343\\\\264\\\\245~\\\\252Z\\\\307\\\\323J\\\\247\\\\302\\\\345ryzz\\\\342\\\\322\\\\344\\\\350\\\\350hp~\\\\026G\\\\241\\\\037\\\\014\\\\303p>99\\\\033\\\\247\\\\303\\\\371b5\\\\036\\\\217\\\\323xI\\\\314\\\\321zmFC\\\\317\\\\327\\\\236\\\\3471[p@D\\\\010@\\\\242A\\\\261\\\\210\\\\200s@\\\\240Q\\\\003\\\\000\\\\263ef\\\\3532\\\\273\\\\013\\\\321\\\\366\\\\245>X\\\\216]\\\\001\\\\333\\\\345\\\\027\\\\201\\\\220\\\\224Q\012\\\\265R\042\\\\270^\\\\307\\\\232\\\\3107\\\\372\\\\350\\\\350\\\\350\\\\331\\\\263g\\\\343\\\\361(\\\\010\\\\202(\\\\212\\\\216\\\\216'\\\\301\\\\300c\\\\347\\\\034\\\\363\\\\332\\\\331\\\\201\\\\321\\\\310\\\\203\\\\330R\\\\342\\\\320\\\\001\\\\257\\\\327\\\\353\\\\2537o\\\\317\\\\037\\\\235(\\\\245\\\\242U\\\\370\\\\352\\\\325\\\\253L;\\\\272]\\\\255\\\\246\\\\343Q\\\\234\\\\204\\\\223\\\\243\\\\023\\\\355\\\\210\\\\\\\\B6J\\\\3263T\\\\304\\\\350\\\\2132(\\\\244\\\\030\\\\262-\\\\276dQI!\\\\367\\\\362%!F.\\\\177*\\\\330~\\\\226\\\\341Z2\\\\017\\\\335\\\\234q)\\\\273\\\\254\\\\230\\\\275~o\\\\023,\\\\241\\\\020\\\\215\\\\200\\\\210\\\\310\\\\273\\\\252\\\\352&\\\\222\\\\302.Cl\\\\304\\\\246\\\\000\\\\355\\\\332=\\\\212Wgl\\\\264~\\\\336\\\\035hQ\\\\325\\\\367\\\\002n\\\\037\\\\2259c\\\\363\\\\251\\\\230\\\\271~m\\\\241\\\\343x\\\\011\\\\353\\\\217\\\\262\\\\265%\\\\233\\\\306X\\\\036`\\\\200\\\\315\\\\013-A\\\\244\042-\\\\032\\\\324\\\\255,;\\\\300\\\\256\\\\357\\\\350\\\\246\\\\222\\\\246\\\\255\\\\272\\\\010\\\\000)\\\\177\\\\344\\\\257\\\\3435\\\\241(C\\\\211\\\\263\\\\240\\\\015\\\\213\\\\323\\\\203\\\\251?\\\\010f7\\\\311\\\\232!N\\\\222\\\\3410\\\\210\\\\026k\\\\203\\\\242\\\\265\\\\032\\\\016\\\\007i\\\\032+E\\\\3169f\\\\347\\\\222\\\\024\\\\001\\\\004\\\\011\\\\2651\\\\210(\\\\234\\\\305\\\\273@TD\\\\222yHg\\\\021<@\\\\262m\\\\241\\\\200\\\\002\\\\021!$\\\\2555\\\\021\\\\001!33[\\\\347@i\\\\337Zak\\\\235sl\\\\235\\\\270t2\\\\032\\\\216\\\\306Cc\\\\364\\\\371\\\\331i\\\\340yg\\\\247\\\\247\\\\201\\\\347}\\\\360\\\\376\\\\373\\\\257^\\\\274Z\\\\255V\\\\206\\\\220D\\\\320h\\\\243a\\\\035K\\\\030\\\\256,\\\\247\\\\251\\\\347\\\\255\\\\026\\\\313\\\\307gg\\\\367w\\\\263\\\\367\\\\237=GD\\\\022\\\\270\\\\277\\\\275\\\\277\\\\273\\\\237\\\\377\\\\340\\\\327\\\\177\\\\260^\\\\307ON\\\\217\\\\347a\\\\374\\\\315\\\\347\\\\177\\\\363\\\\361\\\\367?x:\\\\372\\\\304\\\\037\\\\236\\\\255\\\\234\\\\001Q\\\\232\\\\001\\\\231\\\\254\\\\266\\\\254,\\\\240A\\\\001t\\\\231\\\\037\\\\2544\\\\377\\\\011\\\\0230\012\\\\024\\\\237\\\\205urg\\\\014\012a\\\\234\\\\011`\\\\221\\\\222\\\\271\\\\212v\\\\031z\\\\237\\\\026QyML\\\\241\\\\023\\\\227\\\\246\012\\\\354\\\\206.h\\\\025\\\\311P\\\\345\\\\346\\\\342\\\\263A'n\\\\245\\\\247)\\\\324K\\\\247N_h\\\\314\\\\255\\\\313N9{\\\\271\\\\011\\\\355\\\\331\\\\266i3\\\\335%o\\\\204Ba\\\\020@o4$\\\\326oonI\\\\231\\\\324\\\\261$\\\\211\\\\2003\\\\236\\\\312n\\\\0206\\\\320\\\\003 \042\\\\214\\\\331\\\\265+q(\012\\\\320\\\\002+ A!\\\\302\\\\314I\\\\0251\\\\353\\\\000$B$\\\\311\\\\274GP0s\\\\015'\\\\302L\\\\335\\\\316t\\\\310<\\\\306\\\\256\042$X\\\\255\\\\026o\\\\336\\\\274999\\\\321F\\\\235\\\\237\\\\235\\\\376\\\\352\\\\017\\\\276\\\\237&\\\\311\\\\375\\\\317g\\\\247\\\\247\\\\307\\\\353\\\\365:N\\\\023'\\\\232\\\\305\\\\015\\\\374 \\\\214\\\\334j\\\\276\\\\270\\\\275\\\\272\\\\016F\\\\303\\\\311dBD\\\\231\\\\213\\\\337\\\\321tz||\\\\374\\\\257\\\\376\\\\352_\\\\177\\\\357\\\\227~\\\\371\\\\321\\\\221>\\\\036\\\\252\\\\267\\\\313\\\\353\\\\233\\\\027\\\\237}\\\\362\\\\275\\\\357\\\\336\\\\2073\012\\\\206\042@\\\\222\\\\351\\\\031\\\\254\\\\000\\\\031\\\\230\\\\200T>\\\\302\\\\222\\\\357\\\\346\\\\367}n/\\\\311\\\\356\\\\372r\\\\354\\\\372!P~6\\\\206X\\\\216\\\\250\\\\276\\\\313(\\\\255,U\\\\275\\\\365\\\\275Y\\\\240\\\\313\\\\014\\\\2446\\\\000\\\\300}\\\\357\\\\377\\\\253\\\\253\\\\343\\\\265\\\\240\\\\371\\\\235\\\\373Qi\\\\316|\\\\270DoN\\\\210\\\\325{\\\\235\\\\035<]tk6)\\\\211PD\\\\224\\\\002\\\\021\\\\362<\\\\217\\\\000g\\\\263\\\\031\042\\\\3066\\\\3054\\\\005\\\\007\\\\244\\\\020\\\\025)\\\\245\\\\231\\\\263s\\\\256\\\\374\\\\220({\\\\275T\\\\036\\\\241fs\\\\351FP4\\\\200&\\\\312\\\\3053\\\\212\\\\002\\\\312\\\\242\\\\214\\\\002\\\\344,.\\\\314Y`\\\\003A\\\\316\\\\\\\\IK&\\\\371\\\\374%@i\\\\232R\\\\214?\\\\372\\\\321\\\\217\\\\336\\\\276}\\\\213\\\\210\\\\357\\\\277\\\\377\\\\276o\\\\274O>\\\\371\\\\204\\\\031\\\\246\\\\323\\\\351\\\\337\\\\375\\\\370'\\\\306\\\\367\\\\200\\\\340~1_\\\\257\\\\327C?\\\\360\\\\003s7\\\\233\\\\335\\\\317f\\\\236\\\\347\\\\2216\\\\353\\\\345\\\\312Z{vvf\\\\214\\\\271\\\\275\\\\275\\\\375\\\\350\\\\371\\\\007\\\\217O\\\\037}\\\\365\\\\371\\\\227O/\\\\336\\\\377'\\\\377\\\\325\\\\177\\\\371\\\\233\\\\277\\\\375;_~\\\\363&\\\\360\\\\217\\\\256\\\\331\\\\331\\\\374\\\\034\\\\027\\\\264\\\\240\\\\023!P(\\\\325\\\\205noj\\\\264r\\\\344\\\\003\\\\\\\\\\\\254\\\\274u\\\\224\\\\375%b}\\\\350\\\\333\\\\027\\\\356^\\\\300\\\\216\\\\342\\\\215\\\\217\\\\252\\\\374\\\\332\\\\031\\\\255to\\\\352\\\\230\\\\3009\\\\230\\\\244\\\\322\\\\344=\\\\230\\\\021\\\\021\\\\212\\\\350*\\\\005\\\\265\\\\302\\\\016\\\\264\\\\326\\\\323\\\\311\\\\021i\\\\305\\\\314Z\\\\033\\\\266k\\\\021D$ \\\\004\\\\322$\\\\016p;RD\\\\010\\\\300\\\\010\\\\304\\\\234E\\\\244u\\\\331\\\\302\\\\2470\\\\013N\\\\224\\\\343V\\\\220SG(\\\\234\\\\355\\\\235\\\\304eK\\\\246\\\\010\\\\003\\\\011\\\\002g\\\\372\\\\212\\\\010\\\\002\\\\242\\\\003aP\\\\314|\\\\361\\\\336\\\\263\\\\323\\\\323\\\\323\\\\325j\\\\025\\\\206\\\\341O\\\\177\\\\361\\\\351w\\\\277\\\\373\\\\335\\\\361x\\\\374\\\\203\\\\037\\\\374 \\\\212\\\\223\\\\317>\\\\377\\\\271\\\\240|\\\\360\\\\321w\\\\216\\\\356\\\\357\\\\337\\\\274}\\\\233\\\\256c\\\\317\\\\230\\\\353\\\\313\\\\253\\\\351t\\\\372\\\\350\\\\364\\\\324Z;\\\\237\\\\317onn\\\\000 \\\\\\\\.?\\\\373\\\\351\\\\335\\\\374\\\\346\\\\376t\\\\362\\\\004\\\\330\\\\2067\\\\267\\\\377\\\\353\\\\377\\\\362?\\\\377\\\\007\\\\277\\\\367\\\\037\\\\237\\\\276\\\\177\\\\262F\\\\267\042&E\042\\\\2542\\\\211\\\\233\\\\375\\\\365\\\\032\\\\226m\\\\322YD\\\\263\\\\222.\\\\273c\\\\013\\\\313\\\\025\\\\014\\\\331v\\\\034H5\\\\226z\\\\363\\\\030m\\\\265\\\\227\\\\262oF9\\\\216^)\\\\006py,w\\\\177B\\\\355gO\\\\316kO\\\\345\\\\243\\\\351r\\\\355-Q\\\\270\\\\253\\\\233E\\\\351\\\\314\\\\237\\\\345\\\\252l\\\\037\\\\333i\\\\301<\\\\022=H\\\\271T\\\\0367\\\\203\\\\010\\\\237\\\\177\\\\347\\\\303\\\\300\\\\037dq\\\\216,)\\\\004`\\\\007\\\\302\\\\305\\\\252D\\\\270\\\\211\\\\320B\\\\004\\\\010\\\\304,\\\\230\\\\305\\\\021C@\\\\002\\\\006T\\\\220y?\\\\345\\\\274\\\\221G\\\\241\\\\021\\\\001\\\\347${\\\\377<\\\\262l\\\\342)1\\\\202\\\\244\\\\251\\\\223\\\\314<\\\\202\\\\2361\\\\036kD@\\\\222\\\\353\\\\353k\042\\\\362}\\\\377\\\\364\\\\321#\\\\317\\\\037\\\\254\\\\302\\\\350\\\\351\\\\305\\\\005 ~w\\\\265\\\\\\\\\\\\306\\\\341\\\\253W\\\\257\\\\3020t.=9\\\\236\\\\016\\\\007\\\\376\\\\315\\\\335-\\\\214'\\\\327\\\\227WF\\\\321\\\\331\\\\343s\\\\243\\\\351\\\\366\\\\3666u\\\\3269{z|4\\\\273\\\\271=\\\\235\\\\236\\\\017\\\\206\\\\336\\\\277\\\\373\\\\313\\\\277\\\\010H\\\\377\\\\370\\\\217\\\\377\\\\370\\\\277\\\\370\\\\247\\\\337\\\\273\\\\345$%O\\\\320 \\\\242\\\\320\\\\346\\\\315\\\\024\\\\200\\\\016\\\\245\\\\266\\\\246v\\\\245BBW\\\\271\\\\247-\\\\204Rex:dd\\\\023\\\\244\\\\252\\\\001\\\\327sb\\\\015\\\\322\\\\206\\\\271O\\\\245\\\\265G\\\\015o\\\\361\\\\352V9\\\\332ji\\\\316\\\\217\\\\\\\\\\\\230}\\\\366\\\\344\\\\314\\\\036m&\\\\006\\\\356\\\\274\\\\232(\\\\347>\\\\347\\\\344\\\\374\\\\374\\\\374\\\\361\\\\323\\\\213\\\\257\\\\277\\\\360m\\\\272\\\\262\\\\014JQ\\\\342\\\\230\\\\031\\\\010@\\\\262\\\\373\\\\261 \\\\210\\\\244\\\\000\\\\010\\\\301m\\\\356\\\\245\\\\253L\\\\205\\\\004Q\\\\000\042)\\\\212\\\\000R\\\\036\\\\336 \\\\223G\042\\\\226m\\\\326!\\\\202\\\\302\\\\331mFf\\\\007\\\\022\\\\247\\\\251c\\\\006\\\\000c\\\\2145\\\\332z\\\\236\\\\200c\\\\361\\\\304\\\\2720\\\\014\\\\255\\\\265\\\\000\\\\360\\\\361w~\\\\351\\\\372\\\\372\\\\372\\\\351\\\\305\\\\005\\\\021=~z\\\\361+\\\\316\\\\216'\\\\223\\\\327\\\\257_\\\\337\\\\335:\\\\317\\\\363\\\\2141\\\\326\\\\332G'\\\\307/_\\\\277z\\\\375\\\\342\\\\245s\\\\356\\\\354\\\\354\\\\354\\\\350h\\\\352\\\\234K\\\\223\\\\265\\\\215\\\\326\\\\217\\\\037\\\\235\\\\206\\\\341rv{s\\\\352\\\\351\\\\233_\\\\374\\\\342\\\\354\\\\354\\\\303\\\\364\\\\355\\\\333\\\\341\\\\371{\\\\021\\\\272T!\\\\003\\\\022l\\\\305(\\\\343aBZ\\\\375\\\\343\\\\177\\\\362?P\\\\276Y\\\\310f0\\\\022\012\\\\202\\\\020B\\\\006'\\\\310\\\\226\\\\037\\\\240\\\\315\\\\2130ps\\\\363+;F\\\\335\\\\374\\\\345\\\\003\\\\227})\\\\001\\\\313\\\\221\\\\022\\\\352\\\\232\\\\000U\\\\340;\\\\271\\\\241@\\\\330\\\\232\\\\210\\\\240T\\\\335\\\\226\\\\252]\\\\332\\\\000\\\\362\\\\273N@\\\\230\\\\005KhhB~8E\\\\245G\\\\331w\\\\002\\\\244\\\\315\\\\317\\\\315\\\\037\\\\344Q\\\\254v\\\\377\\\\240hu\\\\357V\\\\220BD\\\\312Ke\\\\001*\\\\020\\\\021\\\\201@D\\\\214F\\\\022\\\\376\\\\346\\\\213\\\\317\\\\027\\\\263[\\\\227FFiB:>y\\\\224\\\\025ag\\\\011A\\\\230)\\\\223\\\\365\\\\316\\\\201c\\\\000\\\\006v9*\\\\000f'\\\\302\\\\031\\\\337\042\\\\0100\\\\013\\\\263d:8\\\\210\\\\010[N\\\\035\\\\263s\\\\251ek\\\\035;`'L\\\\010Z+\\\\245\\\\025)E\\\\204\\\\2048=>BDg\\\\345\\\\352\\\\346\\\\3069\\\\027\\\\305\\\\361\\\\243G\\\\217\\\\336\\\\373\\\\370\\\\243\\\\323GGf\\\\340]<\\\\273\\\\370\\\\207\\\\277\\\\371\\\\033\\\\037\\\\177\\\\364q\\\\034\\\\307\\\\263\\\\233[\\\\002t.\\\\035\\\\215\\\\306\\\\276\\\\357\\\\255\\\\226\\\\313U\\\\264\\\\212\\\\343x:\\\\235\\\\022@\\\\262\\\\\\\\\\\\205\\\\313\\\\345\\\\344\\\\370\\\\344\\\\275\\\\307\\\\347\\\\3637\\\\257\\\\3748\\\\035F\\\\356\\\\350\\\\344\\\\334\\\\177\\\\376|\\\\355\\\\031K\\\\304(Y\\\\357\\\\022\\\\352l\\\\013\\\\237\\\\235\\\\354\\\\366\\\\374S\\\\377\\\\370\\\\277\\\\375\\\\037\\\\313=\\\\016\\\\331\\\\324(\\\\211\\\\344\\\\306A\\\\352H\\\\273\\\\203\\\\267U\\\\312;\\\\006{\\\\247HY\\\\200\\\\225\\\\000m/o$\\\\302\\\\356T\\\\313\\\\337\\\\334\\\\226:%m\\\\\\\\H\\\\245@-\\\\265\\\\304\\\\225h\\\\256mdl\\\\351Q\\\\032)\\\\013\\\\272\\\\\\\\l@\\\\021\\\\000\\\\264\\\\316\\\\334,\\\\370\\\\361\\\\331\\\\351\\\\317~\\\\372wWo_\\\\263M\\\\002\\\\317g\\\\206G\\\\247\\\\247\\\\212\\\\210\\\\020\\\\3302\\\\241\\\\0103\\\\001\\\\003\\\\200\\\\260\\\\023\\\\261\\\\314\\\\2668\\\\360\\\\002\\\\020\\\\347\\\\030\\\\0000\\\\277I-E\\\\302,\\\\324\\\\010[\\\\313\\\\216\\\\3319a\\\\021a`\\\\343\\\\373\\\\244\\\\224g\\\\214\\\\357\\\\373\\\\231\\\\307\\\\210\\\\322F+\\\\245\\\\265w~\\\\376\\\\370\\\\370\\\\350\\\\3103\\\\346\\\\366\\\\372&\\\\216\\\\343\\\\253\\\\313\\\\313G''\\\\307\\\\347\\\\247\\\\323G\\\\217\\\\206A\\\\300\042\\\\217\\\\317\\\\317\\\\177\\\\351\\\\343\\\\2175\\\\2517o\\\\336\\\\010\\\\260g\\\\214\\\\240\\\\200\\\\2101z\\\\275Z a\\\\272\\\\016\\\\207\\\\306\\\\034O\\\\217Qi%\\\\374\\\\207\\\\277\\\\367\\\\273_\\\\375\\\\355\\\\217\\\\247\\\\254\\\\301\\\\033\\\\234\\\\377\\\\360\\\\207K\\\\243\\\\035iFD`\\\\002\\\\312\\\\3742\\\\204\\\\000\\\\016a?\\\\365\\\\237\\\\375w\\\\377\\\\254\\\\306\\\\346\\\\331\\\\230m\\\\345nyHT\\\\231\\\\203J\\\\002\\\\2256\\\\203]a0\\\\002\\\\332\\\\010~\\\\330\\\\240\\\\004\\\\314\\\\3659\\\\334\\\\326\\\\002\\\\200\\\\300\\\\010\\\\222a\\\\252\\\\241\\\\331\\\\022P}\\\\224\\\\277\\\\306\\\\035\\\\212\\\\025\\\\246X\\\\263K_\\\\2202;\\\\025b\\\\376\012\\\\306\\\\255\\\\337\\\\255\\\\224\\\\377*\\\\020\\\\021n{T\\\\026\\\\355\\\\231W\\\\004\\\\021n\\\\270\\\\271\\\\320\\\\263+\\\\223\\\\263A\\\\242\\\\344\\\\261nsS+\\\\000p\\\\326;\\\\236\\\\347E\\\\353p2\\\\031\\\\023\\\\310j>\\\\373\\\\333\\\\177\\\\373o$\\\\213X\\\\300@H\\\\317\\\\236^dq\\\\357\\\\234M\\\\264R\\\\342,\\\\210\\\\260s\\\\271D\\\\003p.-<\\\\310\\\\231\\\\035pf\\\\271\\\\312[\\\\204\\\\004N\\\\234\\\\010\\\\213\\\\210\\\\023\\\\316\\\\356\\\\312\\\\020*\\\\324\\\\032\\\\020<\\\\337\\\\017\\\\006\\\\003\\\\245u\\\\266\\\\342d\\\\035\\\\201\\\\250\\\\220\\\\360\\\\350\\\\350\\\\350\\\\361\\\\371\\\\343\\\\331\\\\375\\\\375\\\\353\\\\227\\\\257\\\\342(>>\\\\231\\\\236?}\\\\354\\\\015\\\\003m\\\\3140\\\\360=\\\\343\\\\215\\\\036\\\\235>\\\\177\\\\366L\\\\000^\\\\276\\\\370\\\\306\\\\363<B\\\\360=o\\\\261X\\\\034\\\\037\\\\035\\\\261u\\\\034'\\\\217\\\\246\\\\323\\\\361h\\\\024\\\\306\\\\311\\\\351\\\\321\\\\364w~\\\\370\\\\017\\\\216\\\\224y\\\\363\\\\3457\\\\354\\\\371O\\\\377\\\\375\\\\337^\\\\032\\\\223*\\\\355\\\\262u\\\\036\\\\020Q\\\\223\\\\312\\\\206\\\\260*\\\\241+\\\\375_\\\\221\\\\320\\\\377\\\\254\042?\\\\262\\\\237\\\\025\\\\266)\\\\371d5\\\\000+<\\\\267+\\\\234*\\\\210\\\\240%s\\\\0213)\\\\243\\\\0307W\\\\3752\\\\026\\\\337~n\\\\356\\\\355m\\\\314\\\\344\\\\262Sc\\\\245\\\\025U\\\\370&nF%3\\\\264\\\\010\\\\343\\\\216\\\\324X\\\\351\\\\366\\\\370\\\\251\\\\3269\\\\320\\\\222\\\\024)B\\\\310\\\\257^ca\042\\\\3064M\\\\375\\\\300_\\\\334\\\\337!\\\\342\\\\007\\\\357=\\\\375\\\\213?\\\\377\\\\263\\\\273\\\\233\\\\353\\\\223\\\\243\\\\2518\\\\036\\\\004\\\\301\\\\321t\\\\032G\\\\021\\\\273\\\\024@\\\\024\\\\222c\\\\213\\\\200\042\\\\226Y@\\\\234cvl\\\\205\\\\005\\\\363H\\\\035\\\\231\\\\343\\\\377\\\\3062\\\\013\\\\340\\\\230\\\\211\\\\310\012[\\\\347\\\\254\\\\023\\\\001@\\\\255\\\\224\\\\321\\\\3063\\\\3063Jk\\\\347\\\\\\\\\\\\024E\\\\313\\\\345j\\\\261Z\\\\205\\\\253p\\\\261\\\\\\\\Eq|\\\\371\\\\366r\\\\261X\\\\210\\\\210BL\\\\342x1\\\\237\\\\257\\\\302\\\\245\\\\000\\\\037M\\\\307\\\\303\\\\341\\\\010\\\\210D\\\\300E\\\\221\\\\347{\\\\317?\\\\370\\\\340\\\\213/\\\\276X\\\\256V\\\\323\\\\3118\\\\014W\\\\201\\\\247\\\\305\\\\331\\\\307gg\\\\036\\\\341\\\\207\\\\317\\\\236E\\\\253U\\\\024\\\\245\\\\003R\\\\237<\\\\177\\\\376\\\\233?\\\\374\\\\365\\\\277\\\\374\\\\223?\\\\205\\\\341\\\\364\\\\375\\\\337\\\\375\\\\275\\\\265\\\\027\\\\210\\\\322\\\\2444a6\\\\177T\\\\036\\\\272'\\\\177;rYeh\\\\355\\\\322\\\\212\\\\267]\\\\376\\\\026\\\\022(n\\\\216l7+\\\\233\\\\201\\\\3379\\\\200(o\\\\034+\\\\230\\\\267o\\\\257\\\\252\\\\014y\\\\251\\\\2722\\\\220\\\\31387dH)\\\\316\\\\020\\\\226\042\\\\266\\\\024\\\\217\\\\270dl\\\\250\\\\334\\\\341k\\\\204gR\\\\273\\\\342.\\\\002Mt\\\\346\\\\335\\\\262q2h\\\\343\\\\310\\\\312q\\\\014n(\\\\204\\\\212\\\\001\\\\247QE\\\\314\\\\275IY\\\\000\\\\000 \\\\000IDAT\\\\341\\\\315\\\\354E\\\\310B`aAz\\\\266\042\\\\370\\\\376\\\\200\\\\300\\\\016F\\\\343_\\\\373\\\\341o\\\\\\\\\\\\277y\\\\035\\\\256c\\\\0171\\\\213\\\\256\\\\224\\\\035_3sb]\\\\022\\\\257\\\\025 H\012\\\\000\\\\010\\\\216\\\\231Y\\\\234!\\\\005\\\\204NX)\\\\005\\\\240\\\\035\\\\247\\\\222\\\\255o\\\\002\\\\016\\\\004\\\\220D\\\\3301\\\\270,f\\\\010\042\\\\0038\\\\353\\\\026\\\\3639\\\\000$6\\\\015\\\\3030\\\\216R\\\\007\\\\342)MD\\\\223\\\\361Xl\\\\212\\\\000I\\\\024\\\\237\\\\035\\\\037sj\\\\331\\\\245o\\\\336\\\\276\\\\372\\\\351\\\\247?yrqf\\\\343\\\\304\\\\033\\\\004'\\\\027\\\\317\\\\3640\\\\200\\\\304\\\\006\\\\203\\\\340\\\\037\\\\375\\\\247\\\\377\\\\311\\\\037\\\\375\\\\321\\\\037=y|6\\\\277\\\\237\\\\251\\\\300\\\\277x|\\\\366\\\\346\\\\325\\\\353\\\\221\\\\361\\\\237\\\\234\\\\236\\\\316./\\\\037\\\\015\\\\206\\\\036\\\\300\\\\227\\\\237\\\\177\\\\361\\\\311/\\\\177\\\\377\\\\351\\\\307\\\\037\\\\275N\\\\034#\\\\000\\\\220\\\\022E\\\\202L\\\\004\\\\244\\\\262\\\\3251c\\\\303\\\\314n\\\\223\\\\337\\\\256\\\\202j\\\\367\\\\226\\\\323\\\\276;\\\\205\\\\273@8\\\\304\012\\\\261\\\\301\\\\2231_\\\\361\\\\376\\\\3602\\\\302\\\\302\\\\227#\\\\003\\\\2241T\\\\243\\\\015\\\\225\\\\276\\\\357\\\\302{\\\\320S\\\\372\\\\276\\\\2659\\\\326%t\\\\237v\\\\265qv\\\\255\\\\212^\\\\005\\\\025\\\\344f\\\\216-7C\\\\336&\\\\317\\\\363\\\\322$\\\\032\\\\217G\\\\034\\\\2057\\\\3277\\\\277\\\\375\\\\333\\\\277\\\\363\\\\347\\\\177\\\\362'.Y\\\\2118\\\\026+\\\\342\\\\030\\\\234s.\\\\216\042\\\\233&I\\\\024\\\\212\\\\263\012\\\\205\\\\210\\\\264B\\\\000\\\\021qNk\\\\017\\\\201\\\\231}!D\\\\310BIg\\\\342\\\\237\\\\362`g(D \\\\314\\\\202.M\\\\323\\\\324%.ISGD\\\\3269v\\\\000J\\\\007F\\\\371\\\\376@k\\\\362\\\\2147:9\\\\231\\\\216\\\\306\\\\2677Wi\\\\024\\\\005\\\\276?\\\\036\\\\0046I_\\\\277x\\\\031\\\\205\\\\353\\\\351d\\\\202D`S\\\\030\\\\014 \\\\360\\\\201\\\\350\\\\343\\\\037|\\\\377\\\\017\\\\223?\\\\374\\\\213?\\\\375\\\\263'O\\\\316\\\\303\\\\371\\\\375\\\\310\\\\367\\\\336\\\\277x\\\\262\\\\270\\\\271\\\\215\\\\227\\\\213\\\\365\\\\375\\\\375hx\\\\354k\\\\357\\\\263\\\\317>;;\\\\376\\\\227\\\\377\\\\336\\\\037\\\\374\\\\376\\\\037\\\\375\\\\351_\\\\2621\\\\010J11\\\\020\\\\020pf\\\\216\\\\334:\\\\217\\\\346\\\\3774\\\\335\\\\305\\\\336IZ\\\\021\\\\212\\\\310\\\\2467\\\\263OF\\\\304\\\\314\\\\026\\\\277u\\\\212\\\\330\\\\032J[\\\\337\\\\201\\\\262o\\\\214\\\\267W\\\\374\\\\363\\\\247\\\\245(r\\\\305\\\\312\\\\260\\\\213\\\\241\\\\371{Y\\\\276\\\\026'\\\\353\\\\025\\\\014-e\\\\263Y\\\\332\\\\340k\\\\261\\\\363sw\\\\232\\\\354\\\\266\\\\250\\\\315\\\\207\\\\251hECwwk\\\\035\\\\245|e\\\\0036!b\\\\034\\\\307\\\\006\\\\340\\\\344\\\\344D\\\\301w\\\\216O\\\\037-\\\\357\\\\330Es\\\\347Rk\\\\223$I\\\\322(\\\\212\\\\243\\\\0106\\\\316\\\\033\\\\026\\\\230\\\\004\\\\300\\\\201\\\\000\\\\213\\\\210\\\\345\\\\324\\\\262($BVJ\\\\241\\\\326$\\\\000J! j`\\\\007\\\\016\\\\231\\\\005\\\\255\\\\223\\\\324\\\\331\\\\324%Ib\\\\3234\\\\036\\\\017'Zk t\\\\3161\\\\220\\\\366\\\\224\\\\357\\\\017\\\\214\\\\246\\\\321h\\\\244@\\\\002\\\\343e\\\\316\\\\253\042\\\\222$\\\\011\\\\202\\\\265\\\\351pv}\\\\305\\\\354\\\\002\\\\337_.\\\\026c\\\\000\\\\030O\\\\000\\\\021\\\\264\\\\372\\\\344W\\\\276\\\\377\\\\325\\\\317?G\\\\227B\\\\024\\\\235\\\\237<\\\\212\\\\314\\\\362\\\\304\\\\367_\\\\374\\\\374gv\\\\276X\\\\336\\\\305\\\\301\\\\343\\\\307k\\\\225\\\\376\\\\365\\\\337\\\\376\\\\355\\\\177\\\\375\\\\337\\\\374\\\\346\\\\360\\\\311\\\\0232\\\\276B#\\\\016\\\\311I\\\\242\\\\031\\\\020\\\\262\\\\240\\\\006\\\\000@\\\\331\\\\361g&\\\\2333flgk\\\\365\\\\237\\\\377\\\\323\\\\377\\\\251\\\\254\\\\227lT\\\\270F\\\\345OrMo7\\\\177\\\\243\\\\312\\\\270I\\\\262)\\\\265+\\\\366H6\\\\312t\\\\227\\\\362Z\\\\346\\\\206\\\\372\\\\243\\\\315\\\\267\\\\016\\\\004\\\\015\\\\345\\\\332\\\\312\\\\224+\\\\332a\\\\304\\\\026\\\\216\\\\304\\\\246N\\\\2503q\\\\001o\\\\351\\\\037\\\\304\\\\215\\\\206X\\\\020\\\\226\\\\351\\\\214\\\\222\\\\275\042\\\\231\\\\301h\\\\345\\\\033m\\\\223\\\\010\\\\234\\\\375\\\\253\\\\177\\\\375#O\\\\203Q4\\\\032\\\\016\\\\2438tI\042\\\\300\\\\276\\\\247\\\\215\\\\347\\\\035\\\\035M|/\\\\320Z\\\\221\042@\\\\342\\\\354\\\\264L\\\\262\\\\270\\\\226\\\\250(\\\\273\\\\326\\\\235y\\\\333\\\\021\\\\020\\\\261\\\\260\\\\023NR\\\\027\\\\2476u\\\\326e\\\\256\\\\036J{^`\\\\264g<_\\\\031\\\\317\\\\370^\\\\020\\\\014|\\\\177`<o2\\\\236\\\\246I\042 \\\\201\\\\347\\\\015\\\\206\\\\003O\\\\253\\\\351d\\\\364\\\\321w\\\\276\\\\363\\\\341\\\\007\\\\037 \\\\300tz4\\\\234\\\\214\\\\004I\\\\373\\\\036*\\\\345\\\\342\\\\230\\\\002?\\\\015W\\\\357]<[\\\\336\\\\335\\\\275\\\\367\\\\370\\\\361o\\\\374\\\\352\\\\017^}\\\\375M4\\\\277\\\\177\\\\365\\\\345\\\\027G\\\\376@[\\\\245I\\\\263\\\\2265spr:\\\\270xv\\\\362\\\\341\\\\2570\\\\370\\\\312\\\\022\\\\21002(\\\\024 \\\\004,\\\\2166\\\\3338\\\\241\\\\222\\\\362\\\\223\\\\302\\\\335\\\\301\\\\310\\\\337\\\\242\\\\014[9T^\\\\251w\\\\257\\\\014\\\\356\\\\226\\\\332\\\\205d\\\\2728\\\\355\012\\\\036(\\\\206o\\\\027\\\\303&\\\\240h\\\\203\\\\033g\\\\263;\\\\324F(\\\\322&N\\\\345\\\\356\\\\234)K\\\\312\\\\342\\\\321\\\\346\\\\014\\\\270\\\\206\\\\252]e:p9j\\\\305\\\\323*\\\\2411\\\\247\\\\266\\\\034\\\\360\\\\033\\\\000\\\\001\\\\265\\\\322(@\\\\310\\\\213\\\\305\\\\375`4\\\\372\\\\375?\\\\370\\\\217~\\\\364\\\\347\\\\377\\\\342\\\\355\\\\213\\\\3173\\\\255\\\\203\\\\210\\\\264\\\\357\\\\213\\\\230\\\\354eiF\\\\241\\\\2656I\\\\323$\\\\215\\\\234sY %D\\\\324Bi\\\\352$\\\\300\\\\341\\\\320\\\\020Q\\\\232\\\\246\\\\000b\\\\214\\\\311\\\\256\\\\323\012*TZ!!\\\\000\\\\031\042\\\\242,\\\\020\\\\2076&;\\\\211PJ)m\\\\024\\\\341z\\\\275ffF\\\\034x\\\\236V\\\\352dr\\\\374\\\\344\\\\374\\\\321\\\\017\\\\276\\\\377\\\\311(0\\\\236\\\\347\\\\035\\\\037\\\\035\\\\005\\\\303a\\\\030\\\\247Q\\\\022+D?\\\\010$\\\\376\\\\177X{\\\\263_]\\\\262\\\\353>l\\\\015{\\\\357\\\\032\\\\276\\\\361\\\\234s\\\\317\\\\271c\\\\367\\\\355\\\\271E\\\\212\\\\242\\\\006j\\\\262l\\\\302\012\\\\005\\\\303OA\\\\004:A\\\\342WG/A\\\\3362\\\\374\\\\011y\\\\313C\\\\214$\\\\017yL\\\\202\\\\0300\\\\020\\\\3002\\\\220\\\\310\\\\262$\\\\313\\\\032,\\\\212\\\\244\\\\310f\\\\223l\\\\252\\\\311\\\\236\\\\330\\\\303\\\\235\\\\317\\\\360\\\\315_U\\\\355a\\\\255<\\\\354\\\\372\\\\316=wd\\\\333H\\\\241P\\\\250S\\\\247\\\\276\\\\032v\\\\355\\\\275\\\\366\\\\032~\\\\353\\\\267\\\\272b<\\\\346\\\\250_\\\\371\\\\312W\\\\246e\\\\011m\\\\363\\\\033_\\\\371\\\\325\\\\177\\\\376\\\\177\\\\376\\\\357$2\\\\255\\\\207\\\\226\\\\335\\\\262\\\\335v\\\\006\\\\233\\\\266{\\\\367\\\\247\\\\037\\\\375\\\\306?\\\\374\\\\272\\\\000\\\\242\\\\222Qdd%\\\\010\\\\210\\\\010\\\\230rsh\\\\3775/\\\\266\\\\341s\\\\270\\\\355\\\\364\\\\211\\\\256\\\\211;%\\\\365\\\\334\\\\237\\\\360\\\\360B}\\\\007}$\\\\317\\\\217\\\\001\\\\005\\\\024\\\\2378r\\\\236\\\\363\\\\007\\\\347*\\\\357\\\\005\\\\273\\\\363\\\\363b*\\\\236\\\\327W\\\\024\\\\000U\\\\020\\\\030HPQAPIQP\\\\0310\\\\357+A>B\\\\212\\\\002\\\\360$\\\\326\\\\342\\\\251W>?H\\\\317\\\\370\\\\327\\\\347\\\\314\\\\022\\\\177\\\\316\\\\303\\\\357^A\\\\241\\\\257\\\\230\\\\243\\\\2449gC\\\\001@%\\\\225\\\\245[\\\\257\\\\266l\\\\220\\\\014\\\\217'\\\\023M\\\\351?\\\\375\\\\317\\\\377\\\\361\\\\377\\\\372?\\\\376\\\\017\\\\000HD\\\\245s\\\\226X%\042H\\\\362\\\\341\\\\354l\\\\261\\\\331l\\\\026\\\\353\\\\225\\\\367>SJ \042\\\\021\\\\015\\\\212\\\\2220!rQ\\\\325\\\\000\\\\230\\\\201\\\\036\\\\210\\\\034\\\\223\042\\\\260\\\\265\\\\214dr\\\\214\\\\260\\\\237{\\\\223(d\\\\250\\\\235h\\\\324\\\\204\\\\211(\042\\\\002j\\\\252\012\\\\2471\\\\011\\\\2421\\\\366\\\\350\\\\350h4\\\\254SJ\\\\204UY\\\\327\\\\314\\\\350\\\\267M\\\\322\\\\304h\\\\333\\\\316\\\\247\\\\246AQ\\\\006\\\\265\012\\\\373\\\\227.C\012PV\\\\327\\\\212\\\\352\\\\332\\\\265k\\\\315\\\\361q\\\\267\\\\332\\\\220\\\\321\\\\315v\\\\025\\\\\\\\\\\\325@\\\\362\\\\312\\\\340JUTU%\\\\203\\\\010\\\\206,\\\\000D\\\\200\\\\034\\\\345\\\\277\\\\320\\\\206\\\\017\\\\225AI\\\\217\\\\351\\\\221\\\\220\\\\343\\\\213\\\\346\042\\\\276\\\\376b3\\\\023r\\\\226\\\\033\\\\360\\\\350\\\\260\\\\340'Ja >~d\\\\007H\\\\313\\\\001L\\\\2758\\\\000\\\\220\\\\262\\\\336,\\\\217\\\\312\\\\255'\\\\265\\\\347\\\\207\\\\023\\\\372\\\\371\\\\255\\\\237\\\\321%\\\\264\\\\037\\\\034\\\\250\\\\252x\\\\276M\042\012\\\\242\\\\231\\\\372\\\\026YQ\\\\004\\\\010\\\\350\\\\341\\\\270~d\\\\270?\\\\255\\\\303\\\\235w\\\\374\\\\247d\\\\017\\\\252\\\\302y\\\\375\\\\244\\\\307\\\\256\\\\246\\\\351\\\\361\\\\207\\\\313'<#'\\\\237\\\\036zr\\\\000\\\\373\\\\024s\\\\001\\\\000c(vm\\\\351\\\\010UmQ\\\\315\\\\266[t\\\\325\\\\227\\\\177\\\\375\\\\267n\\\\276\\\\372\\\\306'\\\\357\\\\275\\\\033\\\\273T\\\\025\\\\306\\\\031\\\\320\\\\250\\\\213\\\\371\\\\354\\\\376\\\\375\\\\373\012&\\\\252\\\\0002\\\\260\\\\221\\\\310*JD\\\\240\\\\260\\\\355Ra)\\\\002\\\\006\\\\005B\\\\213\\\\004\042\\\\322\\\\371hm)\042\\\\220\\\\222\042\\\\250\042HRP$\\\\224D\\\\276\\\\023\\\\221\\\\230\\\\311\\\\375\\\\031\\\\011@I\\\\240p\\\\205\\\\3376\\\\223\\\\321\\\\000D\\\\010QB\\\\214Af\\\\213eYW/\\\\\\\\:\\\\214\\\\240\\\\363\\\\305\\\\211AJD\042\\\\200dc\\\\343\\\\367\\\\017\\\\217\\\\266g3k\\\\330\\\\326\\\\025\\\\224E{\\\\362\\\\340\\\\357|\\\\365\\\\357\\\\335}\\\\367\\\\307\\\\332\\\\264\\\\251\\\\320b:X\\\\247\\\\010E\\\\025\\\\204W\\\\353f\\\\377P\\\\311\\\\260\\\\330\\\\236\\\\233\\\\003E\\\\215DFHld\\\\307\\\\326\\\\225eo\\\\217\\\\300\\\\3335'*\\\\260\\\\002+\\\\200\012\\\\202\\\\230,D\\\\237Dn\\\\354\\\\372\\\\\\\\\\\\357\\\\265\\\\275\\\\240\\\\201<t\\\\232\\\\340\\\\305\\\\356\\\\373\\\\214mO\\\\022K\\\\260{\\\\004|4)\\\\346\\\\321\\\\233>\\\\373\\\\310s\\\\244x~*\\\\352\\\\253\\\\316d\\\\356gT\\\\352\\\\217\\\\344;>\\\\334\\\\177by\\\\2662\\\\320\\\\377\\\\367\\\\251\\\\377~L\\\\364><\\\\353g\\\\273A..B\\\\217\\\\030\\\\243\\\\027\\\\260Y\\\\273\\\\006\\\\357\\\\343\\\\365j\\\\024\\\\025A\\\\277\\\\362k\\\\277\\\\371\\\\301\\\\273\\\\357 \\\\233\\\\341`\\\\260\\\\236\\\\237n7\\\\213{\\\\267\\\\357\\\\010\\\\202uV\\\\225\\\\015\\\\030r\\\\005\\\\003\\\\365!\\\\036\\\\025\\\\306\\\\\\\\d\\\\273 \\\\354\\\\013g\\\\201(b\\\\237S\\\\250\\\\202\\\\014\\\\220P\\\\011\\\\020\\\\221\\\\021\\\\0209g\\\\301dR1@P\\\\024\\\\005\\\\224\\\\330$\\\\002\\\\330\\\\254\\\\326\\\\373\\\\373\\\\323\\\\253G\\\\227\\\\217\\\\216\\\\216\\\\256_\\\\2736\\\\034\\\\215|\\\\362\\\\313\\\\315\\\\032\\\\015\\\\026\\\\226\\\\025\\\\001\\\\222h\\\\002%;\\\\256\\\\307\\\\247\\\\237\\\\336\\\\252\\\\213\\\\322V\\\\025\\\\010\\\\300z\\\\375\\\\301\\\\007\\\\037^?\\\\330G2QA\\\\014mC\\\\230\\\\257\\\\327/\\\\275\\\\374\\\\352\\\\336\\\\301\\\\341h\\\\262\\\\247\\\\252AB\\\\204B\\\\261\\\\007Y03\\\\242\\\\236SD#d\042\\\\245<\\\\313\\\\357\\\\376\\\\206]_C\\\\311\\\\220\\\\177C;\\\\231\\\\366\\\\260Y{\\\\254y\\\\217\\\\343B\\\\354i\\\\307\\\\236\\\\365a\\\\236\\\\337!\\\\210\\\\236\\\\371\\\\303\\\\247^\\\\347<\\\\177\\\\340\\\\242\\\\314\\\\177|\\\\331=\\\\230\\\\340#\\\\277=\\\\327\\\\302\\\\363t\\\\373\\\\330\\\\225\\\\363\\\\366\\\\261\\\\354\\\\243\\\\317\\\\361\\\\026\\\\362\\\\324G\\\\270p\\\\315\\\\363\\\\261\\\\275{\\\\360g\\\\277\\\\335S\\\\016?\\\\343'O\\\\350*y\\\\202J\\\\277\\\\364\\\\313_\\\\371\\\\277\\\\377\\\\331\\\\377\\\\221\\\\024s\\\\317i}\\\\207\\\\206\\\\307\\\\203AQ\\\\326>IL(\\\\252L\\\\224}\\\\325)\\\\304\\\\242\\\\260D\\\\344\\\\014)\\\\344R\\\\025\\\\221\\\\200\\\\020\\\\301\\\\030\\\\026AEL\\\\220\\\\030\\\\260\\\\007\\\\270\\\\0000\\\\032\\\\314\\\\312\\\\207*BO\\\\253\\\\005\\\\240)\\\\311x<\\\\364]c\\\\255\\\\265\\\\326\\\\001\\\\320\\\\0137n\\\\276\\\\376\\\\346k\\\\237\\\\335\\\\371l\\\\333\\\\254\\\\266\\\\353u\\\\262\\\\006AH\\\\2414\\\\2052\\\\257V\\\\253\\\\344\\\\003\\\\270B\\\\332NU\\\\271\\\\266\\\\333\\\\325z]\\\\224\\\\021\\\\330\\\\215\\\\366^|\\\\355\\\\225\\\\027\\\\253\\\\362\\\\007\\\\037~\\\\370\\\\312\\\\033o\\\\330\\\\351\\\\004\\\\362\\\\214\\\\224}\\\\341Yg\\\\240<\\\\237&\\\\310:4)\\\\251f\\\\365\\\\262od\\\\354=\\\\276\\\\304 \\\\240\\\\252\\\\212*\\\\250\\\\372T\\\\200\\\\377#\\\\315\\\\372\\\\350\\\\221g9\\\\255\\\\236\\\\361\\\\301pW\\\\256\\\\353s8\\\\255\\\\236>\\\\203?G\\\\373\\\\314\\\\325$U\\\\005\\\\241\\\\327>\\\\345\\\\341>g\\\\026\\\\017\\\\355\\\\325\\\\234\\\\307\\\\216\\\\237\\\\377\\\\367\\\\311\\\\363/n\\\\001\\\\344\\\\251:\\\\364s\\\\236\\\\360\\\\363\\\\274\\\\351\\\\305\\\\245O\\\\343\\\\374Y\\\\313N\\\\2417\\\\007W\\\\256\\\\274\\\\362\\\\306\\\\233\\\\355j\\\\276i\\\\310\\\\330\\\\302\\\\331\\\\362\\\\305\\\\027_RU6.\\\\306\\\\330\\\\205\\\\024\\\\222\\\\244\\\\224\\\\242\\\\017 \\\\252\\\\232\\\\000\\\\271\\\\247p\\\\354}_\\\\331\\\\254\\\\357\\\\223\\\\261\\\\200%\\\\343\\\\261r0FD2UP\\\\236!\\\\264\\\\367\\\\005\\\\003\012\\\\251\\\\246\\\\034\\\\000o[\\\\177v:W\\\\325\\\\007\\\\017\\\\216\\\\337x\\\\343\\\\215\\\\303\\\\203\\\\203{\\\\367\\\\272\\\\266\\\\331z\\\\351P\\\\264,\\\\254!\\\\006\\\\325\\\\315z\\\\265?\\\\335\\\\337l6(\\\\302\\\\314\\\\214\\\\305d2999\\\\231\\\\257\\\\267\\\\277\\\\360\\\\305\\\\237\\\\377{\\\\277\\\\363\\\\017\\\\366_}e\\\\375\\\\317\\\\376\\\\257\\\\331r1\\\\031\\\\354\\\\015\\\\207\\\\265\\\\2002\\\\212\\\\366\\\\276\\\\015P\\\\205( \012\\\\226\\\\000PI\\\\373\\\\270D\\\\306\042\\\\013\\\\3665+pgp\\\\350\\\\316\\\\244\\\\246\\\\235\\\\242\\\\255?s';\\\\225\\\\030\\\\221Q\\\\011\\\\204Q\\\\177\\\\366\012\\\\310\\\\200\\\\014J*\\\\347+\\\\203>g%\\\\312\\\\370!}\\\\254Z\\\\317\\\\305#\\\\210z\\\\361\\\\034\\\\006%T\\\\006e\\\\202\\\\363\\\\375\\\\363-\\\\251 \\\\310\\\\371\\\\226\\\\011\\\\014\\\\002=\\\\372\\\\253\\\\307\\\\216<\\\\374m\\\\036\\\\320\\\\217\\\\336\\\\372\\\\311\\\\032B\\\\347\\\\373\\\\377\\\\376k\\\\337\\\\247?\\\\317\\\\232\\\\321\\\\217\\\\365`\\\\364\\\\037\\\\375\\\\203\\\\177\\\\330x\\\\341\\\\242\\\\026%[\\\\014\\\\352\\\\301\\\\240(\012\\\\334E\\\\2713h\\\\232@\\\\234\\\\241\\\\272t\\\\244\\\\300\\\\200\\\\206\\\\262>\\\\241\\\\224\\\\263\\\\232H\\\\005\\\\005\\\\015Z\\\\313\\\\316\\\\031[\\\\030S\\\\030\\\\262\\\\031\\\\247\\\\223E]BM \012\\\\271\\\\217\\\\021\\\\345Z\\\\310\\\\306\\\\030U$2\\\\326\\\\024\\\\247\\\\247\\\\263\\\\331l\\\\216J\\\\205u\\\\205u(\012\\\\242\\\\006\\\\211\\\\221b\\\\347\\\\007U\\\\035\\\\273.\\\\264\\\\035\\\\3479z\\\\263e\042k\\\\234\\\\232\\\\342l\\\\323\\\\374\\\\370\\\\303\\\\237BU\\\\277\\\\362\\\\372\\\\033EQ\\\\354\\\\355O\\\\306\\\\203\\\\022b\\\\003\\\\261Q\\\\351v\\\\365\\\\271\\\\000\\\\014\\\\220cD\\\\340,WI\\\\011\\\\025IvkD\\\\212H\\\\011)\\\\011\\\\251\\\\020\012adz<c\\\\345I\\\\031\\\\363\\\\210\\\\220\\\\356'\\\\371\\\\247h\\\\021\\\\317\\\\233\\\\262\\\\237v\\\\316\\\\263\\\\356\\\\373\\\\034y\\\\374\\\\324?i\\\\367x\\\\275\\\\014\\\\273\\\\350\\\\370{\\\\332\\\\366\\\\374e\\\\036;\\\\242;\\\\034\\\\371\\\\305-\\\\000<\\\\211o\\\\376\\\\377wy\\\\316\\\\373>i\\\\330\\\\010\\\\202\\\\261\\\\356W\\\\276\\\\362k\\\\177\\\\362\\\\207\\\\1778\\\\335\\\\337\\\\277\\\\367\\\\351\\\\302\\\\026e\\\\323t\\\\2053I$\\\\213\\\\233\\\\234\\\\243\\\\217\\\\010\\\\231\\\\321ND\\\\\\\\QX[\\\\020\\\\201\\\\010\\\\250\\\\006\\\\310c|\\\\347\\\\032\\\\027P\\\\003\\\\231\\\\3117zU\\\\022\\\\355s\\\\004TuG\\\\266\\\\224\\\\031\\\\227BH\\\\266\\\\266\\\\231P\\\\306\\\\332bP\\\\217\\\\246\\\\323\\\\375\\\\2420\\\\316\\\\342r6\\\\233\\\\235\\\\235\\\\204\\\\330HLh\\\\325Y\\\\036\\\\224\\\\305b\\\\276\\\\232\\\\214\\\\306\\\\336\\\\373\\\\030\\\\375x4\\\\000\\\\321\\\\020\\\\302\\\\177\\\\374\\\\237\\\\374\\\\356g\\\\237\\\\336\\\\372\\\\311{\\\\037\\\\375\\\\362\\\\203\\\\343\\\\337\\\\374\\\\352\\\\337\\\\277\\\\364\\\\342O\\\\251\\\\032l\\\\227\\\\263\\\\301p\\\\3370z\\\\020\\\\2571\\\\010E d\\\\264\\\\004\\\\032\\\\341\\\\274`\\\\241\\\\356\\\\276\\\\310CM\\\\032D\\\\200\\\\262\\\\362\\\\251@\\\\000\\\\300_\\\\377/\\\\377\\\\333\\\\307\\\\320L\\\\347\\\\350\\\\336\\\\213\\\\330\\\\337\\\\035J\\\\030\\\\361\\\\374\\\\212\\\\010\\\\347\\\\320\\\\263\\\\213?\\\\177b}\\\\270\\\\000\\\\300S\\\\367/\\\\216\\\\031~\\\\002\\\\337\\\\234Wz\\\\354\\\\010h>\\\\302\\\\260\\\\333\\\\317[U\\\\002x\\\\376\\\\332\\\\243\\\\275/\\\\374\\\\211\\\\360\\\\234_!\\\\002<\\\\271\\\\362\\\\216T\\\\353\\\\002F\\\\032\\\\011\\\\220\\\\031vP\\\\362\\\\317\\\\267>\\\\027\\\\377z\\\\336J\\\\375\\\\016 i2\\\\3064\\\\315z\\\\265\\\\\\\\\\\\370f\\\\353\\\\230S\\\\014\\\\226\\\\215\012\\\\252@\\\\306\\\\201\042\\\\210!\\\\312\\\\242\\\\321\\\\330\\\\302\\\\331\\\\302\\\\332\\\\002\\\\0215\\\\252\\\\212 2\0429\\\\343\\\\014\\\\033 \\\\212QT\\\\200\\\\330`\\\\016\042\\\\366\\\\005\\\\0052\\\\002\\\\036\\\\231(_\\\\312\\\\267\\\\255\\\\2122\\\\022(4\\\\233&\\\\2064\\\\235\\\\356M&\\\\243\\\\275\\\\351\\\\330\\\\032\\\\243\042m\\\\263\\\\215\\\\301\\\\203\\\\212a*\\\\213\012\\\\001Q\\\\265.\\\\253\\\\315z\\\\243\\\\222\\\\352\\\\262l\\\\267\\\\333o}\\\\353[\\\\037}\\\\364\\\\351\\\\235{\\\\367N\\\\346g\\\\256(_z\\\\345E\\\\005\\\\030\\\\015\\\\007\\\\226)\\\\370\\\\300*\\\\226\\\\331\\\\020d\\\\014\042# \\\\220\\\\252\\\\366\\\\023\\\\024\\\\002 \\\\002\\\\365\\\\265\\\\203\\\\011\\\\204@13\\\\242#\\\\236\\\\303L\\\\371\\\\037\\\\375\\\\336\\\\177\\\\377,\\\\221\\\\374do\\\\003\\\\220\\\\307\\\\022R/\\\\236\\\\374TI\\\\363$\\\\350\\\\354\\\\211k^\\\\270\\\\021\\\\351\\\\005f\\\\252gJ\\\\262GNx\\\\242\\\\374x\\\\026l\\\\317\\\\353(\\\\331\\\\025\\\\235\\\\353\\\\244\\\\223\042dg\\\\342.\\\\264\\\\361\\\\350\\\\266g\\\\323{\\\\3428\\\\021#)b\\\\317\\\\270w~\\\\235\\\\347w\\\\320\\\\247<\\\\3133\\\\316\\\\317n\\\\212\\\\307Z,\\\\177S\\\\337u/\\\\\\\\\\\\275\\\\362\\\\255\\\\277\\\\376\\\\206%B\\\\215\\\\226\\\\311w>\\\\204\\\\020B\\\\310\\\\031%\\\\226\\\\311Z\\\\313\\\\010\\\\204Lh\\\\3308&\\\\026\\\\021M\\\\031\\\\345@D\\\\344\\\\\\\\\\\\301L\\\\010\\\\030ST\\\\005d\042d\\\\000`\\\\321sR\\\\307\\\\374dLDD\\\\205\\\\353\\\\311N\\\\313\\\\262\\\\224$\\\\233\\\\315\\\\206\\\\210\\\\356\\\\335\\\\275\\\\2677\\\\036\\\\252F\\\\020\\\\021M\\\\014\\\\020\\\\275\\\\227\\\\224\\\\2345\\\\216\\\\2141v\\\\275Z[\\\\313\\\\323\\\\321\\\\330\\\\373&\\\\245\\\\364\\\\373\\\\277\\\\377\\\\373\\\\233u\\\\253\\\\010lx\\\\333n\\\\256\\\\\\\\\\\\275\\\\272Z\\\\317\\\\333f\\\\263<\\\\233u\\\\353%\\\\304`\\\\031\\\\013\\\\203\\\\206\\\\224T\\\\031\\\\022\\\\235\\\\303a\\\\317\\\\3638\\\\000\\\\220\\\\010s6x/{\\\\021\\\\200z/\\\\026\\\\002\\\\177\\\\375\\\\237\\\\3747\\\\347\\\\202\\\\366\\\\342z\\\\256=g\\\\273k\\\\267*#\\\\365\\\\300\\\\345\\\\013l\\\\276\\\\273\\\\373\\\\352\\\\343rt'M{)\\\\370\\\\350\\\\237\\\\027/\\\\262\\\\273N\\\\376\\\\204r.\\\\365\\\\237\\\\005{}(\\\\271\\\\011v\\\\264\\\\225\\\\273\\\\273P\\\\306^?r\\\\213\\\\363\\\\007\\\\243\\\\376.\\\\347\\\\333<\\\\370\\\\317\\\\357\\\\236\\\\241\\\\333\\\\330g\\\\353\\\\340S\\\\216\\\\234\\\\037\\\\177Dp\\\\\\\\8\\\\347\\\\\\\\\\\\212\\\\303\\\\243X\\\\355\\\\247\\\\256\\\\360LU\\\\355\\\\361%\\\\247\\\\230\\\\030kT\\\\305\\\\031^\\\\234\\\\235\\\\335\\\\277\\\\373\\\\231E\\\\204$\\\\336w\\\\220\\\\004\\\\0250{\\\\225Tb\\\\210\\\\022\\\\243\\\\002\\\\0020 W\\\\256\\\\014\\\\336\\\\307.\\\\021\\\\241&\\\\264\\\\326\\\\030rl8\\\\006\\\\0111\\\\020\\\\032\\\\025\\\\211>iJ\\\\311\\\\267\\\\226\\\\331\\\\030VI\\\\244j\\\\015\\\\023\\\\241H\\\\002\\\\325\\\\224\\\\222a\\\\026\\\\021I\\\\202\\\\2101\\\\306\\\\020|\\\\350\\\\332\\\\256m\\\\2151\\\\235\\\\357@RY\\\\024\\\\222b\\\\014\\\\261.kfc\\\\330\\\\226e\\\\3215\\\\255\\\\265|vv\\\\366\\\\366\\\\333o#\\\\222\\\\2616D?\\\\331\\\\033_\\\\332\\\\237\\\\374\\\\253?\\\\370\\\\177>\\\\371\\\\340\\\\203\\\\033W\\\\2170\\\\264\\\\030\\\\374\\\\307\\\\357\\\\375xo8\\\\030\\\\227\\\\245\\\\201\\\\0101\\\\3468}\\\\312\\\\210\\\\273\\\\236\\\\331\\\\033U\\\\000D\\\\031\\\\210\\\\025\\\\010\\\\210\\\\220\\\\011\\\\210\\\\362\\\\253*\\\\360?\\\\372\\\\275\\\\377\\\\3569\\\\362\\\\343\\\\021\\\\361\\\\220\\\\315\\\\301\\\\013\\\\355\\\\177~\\\\316EY\\\\362|\\\\311\\\\372\\\\234\\\\017\\\\226\\\\273\\\\362c\\\\247<\\\\365'\\\\347\\\\007{\\\\225\\\\340g\\\\011\\\\274\\\\013\\\\007\\\\341\\\\321\\\\235\\\\247l/\\\\274\\\\332#G.4\\\\305\\\\223\\\\323\\\\3053\\\\337\\\\367b\\\\373<}\\\\241g=\\\\014=\\\\361`YB\\\\223\\\\304XX\\\\263^\\\\234\\\\335\\\\372\\\\370\\\\247\\\\321\\\\267\\\\276\\\\353@\\\\024\\\\001E\\\\222H\\\\216\\\\235\012\\\\200\\\\0222\\\\033\\\\007`\\\\2627D\\\\222\\\\006\\\\037D\\\\024\\\\021\\\\313\\\\262J)\\\\025\\\\266(\\\\213\\\\302\\\\032\\\\013\\\\252M\\\\333umK*!t\\\\222BJ\042\042\\\\270\\\\323\\\\241\\\\001\\\\200\\\\211E\\\\243$\\\\001\\\\310\\\\265\\\\021\\\\223*\\\\244\\\\024\\\\233v+)\\\\261A\\\\325d-1S\012\\\\001T\\\\211\\\\330Y\\\\223\\\\215\\\\023\\\\037;C\\\\264Z\\\\255\\\\336~\\\\373\\\\355m\\\\3234\\\\276\\\\033M\\\\206\\\\200\\\\272X,\\\\276\\\\373\\\\235o\\\\265\\\\333\\\\025\\\\204\\\\356\\\\205\\\\313\\\\207i\\\\273\\\\271~x\\\\351\\\\335\\\\357\\\\277U\\\\0324*\\\\323a]\\\\224&\\\\200&\\\\314\\\\206\\\\014\\\\235\\\\3672\\\\002\\\\262\\\\200\\\\210J\\\\210\\\\244\\\\324\\\\353\\\\305\\\\000\\\\010`\\\\370\\\\031N\\\\243\\\\013\\\\237\\\\366\\\\261\\\\276\\\\204\\\\027\\\\354\\\\274\\\\213^\\\\274^e\\\\177\\\\362J\\\\317\\\\330\\\\177\\\\354v\\\\375\\\\025\\\\350\\\\302e\\\\237~\\\\271\\\\207\\\\367:\\\\377\\\\363)\\\\217\\\\375\\\\324\\\\377\\\\356l\\\\274\\\\307\\\\251B\\\\236s\\\\035\\\\275PS\\\\346Y\\\\003\\\\362\\\\321\\\\036\\\\375$\\\\017\\\\311\\\\356JO[\\\\372\\\\2712{\\\\357.l\\\\021\\\\340\\\\261#;}\\\\036\\\\224\\\\260(\\\\313\\\\233/\\\\275lm\\\\341\\\\3232\\\\370\\\\344\\\\230T\\\\024\\\\225PE{\\\\017\\\\0272\\\\261aCE\\\\025{\\\\025\\\\314\\\\030\\\\343RJ\\\\010j\\\\230}J*\\\\2222\\\\015c\\\\347\\\\325GL\\\\021\\\\311\\\\020`\\\\334\\\\025\\\\251\\\\000c\\\\020\\\\025\\\\30103\\\\243\\\\212J\\\\022\\\\245>\\\\235I\\\\274oE=d\\\\357\\\\006\\\\204K\\\\007\\\\323+G\\\\373{\\\\223\\\\261!\\\\252\\\\312*\\\\204\\\\340c@%kmYU\\\\314\\\\270\\\\334\\\\254Of\\\\247\\\\227\\\\257^m\\\\273\\\\260\\\\015\\\\335\\\\301\\\\360\\\\322\\\\367~\\\\360\\\\375\\\\365z\\\\275\\\\236\\\\235`\\\\333\\\\014A~\\\\365W\\\\276\\\\262\\\\274\\\\375\\\\323)\\\\371O\\\\337\\\\371\\\\356\\\\253?\\\\367E`\\\\241jT\\\\015'B\\\\020\\\\300\\\\004\\\\001!\\\\233\\\\025fR@\\\\005R&\\\\020\\\\300]\\\\355^\\\\004|\\\\222\\\\227\\\\343\\\\251\\\\037\\\\351\\\\321s\\\\236\\\\356\\\\265\\\\370\\\\017^\\\\236\\\\270\\\\3103\\\\275\\\\262O\\\\336\\\\356\\\\211^\\\\370\\\\274\\\\331\\\\000\\\\021\\\\001s!\\\\217\\\\347I\\\\375'\\\\216<\\\\363\\\\026O\\\\275\\\\376\\\\303X\\\\367\\\\277W\\\\343\\\\344a\\\\3609\\\\266\\\\212\\\\234\\\\253\\\\252\\\\035\\\\034\\\\035\\\\352y\\\\205\\\\020E\\\\020\\\\335M\\\\0109\\\\331M\\\\372d6\\\\206\\\\330z\\\\017\\\\252\\\\252\\\\224\\\\015($K8\\\\336\\\\2332\\\\363f\\\\263iVK\\\\000\\\\030\\\\226\\\\205\\\\240\\\\003\\\\000\\\\265\\\\264J\\\\321{\\\\237)\\\\224b\\\\214bmQX\\\\224\\\\014x\\\\002@@RU\\\\021\\\\215!`\\\\327u'\\\\247g\\\\000\\\\262\\\\331,E\\\\274H\\\\034\\\\224eQ\\\\024\\\\231\\\\241\\\\306\\\\030\\\\207\\\\210D\\\\230D\\\\201\\\\360\\\\332\\\\215\\\\353[\\\\357\\\\367\\\\256\\\\\\\\J\012\\\\327_~\\\\371{?\\\\374\\\\301\\\\351l\\\\301\\\\022\\\\016F\\\\253\\\\017~\\\\374\\\\356W\\\\276\\\\360f{z\\\\372\\\\205/|\\\\341;\\\\337\\\\177\\\\007V\\\\247\\\\353\\\\344\\\\207\\\\327_\\\\252J\\\\253\\\\026<V\\\\250\\\\024\\\\324\\\\010\\\\344\\\\364\\\\341\\\\035Qi\\\\217j~(t\\\\370?\\\\373\\\\275\\\\347\\\\351\\\\320O\\\\331\\\\277 \\\\336/\\\\352\\\\213\\\\237\\\\347\\\\310\\\\347:\\\\037\\\\020\\\\361\\\\241\\\\216~\\\\256\\\\034?\\\\246\\\\026\\\\237k\\\\261\\\\272[{\\\\333\\\\370\\\\341\\\\237\\\\017\\\\217g\\\\333!\\\\227\\\\353\\\\310\\\\335\\\\356i9\\\\333p\\\\356\\\\333\\\\331=Moq<b\\\\033<\\\\315G|Q\\\\245\\\\006\\\\005\\\\332\\\\375j\\\\367\\\\330\\\\317_\\\\237\\\\356w\\\\276\\\\360*\\\\017\\\\257\\\\006\\\\210\012\\\\310\\\\214\\\\006\\\\2004\\\\376\\\\325\\\\277\\\\375SV\\\\320\\\\030P\\\\245\\\\347\\\\207\\\\001\\\\356S\\\\033s\\\\210\\\\017\\\\241\\\\353|\\\\222T8\\\\013\\\\2501x\\\\320T\\\\025\\\\356\\\\322\\\\376\\\\376\\\\313/\\\\277t\\\\365\\\\312\\\\225\\\\252r1z&\\\\034\\\\016\\\\353\\\\252(\\\\014CY\\\\226!t\\\\336w\042I%\\\\245\\\\030 %BM)\\\\212\\\\246\\\\374F\\\\252\042\\\\222DDU|\\\\210\\\\235oc\0121\\\\005\042\\\\025\\\\225\\\\030Bne\\\\353\012\\\\347JDh\\\\332m\\\\347\\\\273\\\\252\\\\256^x\\\\351\\\\245\\\\177\\\\374_\\\\377Wo\\\\274\\\\371\\\\306;?yo\\\\266Z}v\\\\347\\\\356\\\\335\\\\373\\\\367*g\\\\013&N^\\\\332\\\\346\\\\345\\\\027\\\\256\\\\336\\\\376\\\\370#M\\\\361\\\\344\\\\376\\\\335\\\\320m\\\\313\\\\322\\\\331\\\\035\\\\0236\\\\240\\\\021\\\\260\\\\347*/\\\\367\\\\216/97b\\\\262\\\\257\\\\352b\\\\345\\\\372g\012\\\\236\\\\213\\\\347\\\\\\\\\\\\214\\\\234=\\\\233\\\\261\\\\363g/\\\\317\\\\220\\\\210\\\\237#h\\\\366\\\\350o\\\\317\\\\003\\\\234\\\\217\\\\275\\\\310\\\\3719OD@\\\\237\\\\242o\\\\374\\\\254\\\\247z\\\\312\\\\221\\\\213\\\\267{4\\\\337\\\\347qu\\\\350\\\\371\\\\215\\\\363y\\\\332\\\\377\\\\341\\\\016\\\\252\\\\2520s\\\\014\\\\236T\\\\211\\\\014\\\\031c\\\\255M\\\\222\\\\262\\\\317X\\\\001\\\\021Y4\\\\252\\\\202$U\\\\011!\\\\306\\\\242\\\\256\\\\206\\\\303\\\\312{\\\\357\\\\233\\\\004\\\\004U\\\\341F\\\\343\\\\352\\\\360`rppp\\\\371p\\\\2171\\\\335\\\\277w\\\\257\\\\363>\\\\305\\\\2501f\\\\375\\\\302\\\\230\\\\314_*\042\\\\022\\\\301\\\\267\\\\255Xk\\\\231\\\\0110\\\\223\\\\337%\\\\205\\\\204\\\\300\\\\310Dh$\\\\351f\\\\273\\\\215\\\\261E\\\\212\\\\200\\\\011\\\\322\\\\245\\\\321h@\\\\310\\\\256\\\\333\\\\032c\\\\022YAP\\\\302\\\\341p8\\\\275|\\\\010\\\\220\\\\366\\\\257_Y\\\\005\\\\277\\\\\\\\o\\\\336\\\\373\\\\3643\\\\0178o\\\\232\\\\353G\\\\007\\\\304\\\\334v\\\\333\\\\351pp\\\\353\\\\343\\\\217^{\\\\375\\\\215o}\\\\367\\\\255\\\\227^\\\\274\\\\321\\\\315\\\\217\\\\251\\\\2560\\\\251\\\\033\\\\0331.P\\\\024\\\\265q\\\\327\\\\234\\\\002Y\\\\335\\\\020\\\\315\\\\361\\\\025d\\\\205\\\\317\\\\321\\\\241\\\\037\\\\377\\\\000OS9\\\\236\\\\233\\\\030\\\\363\\\\271\\\\372\\\\372\\\\347\\\\037\\\\022\\\\237\\\\247\\\\317\\\\375\\\\007_\\\\374\\\\311\\\\027\\\\351\\\\341\\\\004\\\\217\\\\014\\\\241\\\\376Lx\\\\244\\\\005\\\\036\\\\277\\\\327\\\\347\\\\351\\\\315\\\\000\\\\360,\\\\033F\\\\037\\\\272#\\\\317\\\\257\\\\246\\\\002\\\\2243\\\\207E\\\\304\\\\020UU\\\\325\\\\205\\\\026\\\\262\\\\217\\\\222\\\\254\\\\210d\\\\342:\\\\020\\\\022\\\\221$\\\\011T\\\\352Ai\\\\013\\\\307\\\\006\\\\325\\\\247\\\\034^\\\\025\\\\365\\\\233\\\\315\\\\352\\\\356\\\\335\\\\333]\\\\273\\\\2161\\\\256W\\\\213\\\\305\\\\354l\\\\261ZJ\\\\212\\\\304L\\\\354Z\\\\337!\\\\242\\\\265\\\\0265\\\\305\\\\010Y\\\\315F\\\\004\\\\311\\\\214\\\\265\\\\224so\\\\001\\\\020$\\\\251-\\\\230\\\\210\\\\022\\\\304\\\\325f\\\\215\\\\307\\\\241t\\\\354\\\\214\\\\235\\\\356\\\\215+7\\\\350B\\\\340\\\\246\\\\2616VU\\\\005\\\\000]\\\\014)\\\\0317\\\\034rQ\\\\034\\\\275\\\\370\\\\302\\\\367\\\\377\\\\315\\\\237\\\\336\\\\233\\\\315\\\\256\\\\037\\\\036\\\\232\\\\256\\\\361\012\\\\333\\\\316\\\\023\\\\321\\\\307\\\\037\\\\377t<\\\\254S\\\\354\\\\272\\\\355j=?N\\\\315&YS\\\\223\\\\265\\\\305\\\\320bi\\\\300E\\\\264\\\\310\\\\000\\\\224\\\\365\\\\014M=\\\\367n\\\\022\\\\220D\\\\240@\\\\206D\\\\316\\\\321\\\\013\\\\217\\\\266\\\\350\\\\316\\\\017\\\\232\\\\001*\\\\270\\\\203\\\\034\\\\360S\\\\244\\\\343\\\\363\\\\277\\\\331\\\\263\\\\026\\\\274(\\\\340\\\\317{\\\\004=G\\\\202f\\\\356\\\\237Gz\\\\300\\\\3052m\\\\027\\\\037\\\\346!\\\\235\\\\033\\\\234\\\\237@\\\\031\\\\005\\\\220\\\\337\\\\344Q\\\\026U\\\\300\\\\363\\\\033+\\\\300\\\\205\\\\322r9~\\\\330'~<\\\\321\\\\367.\\\\016\\\\200'\\\\333\\\\360\\\\261\\\\316\\\\375\\\\324%\\\\307\\\\274\\\\340\\\\031\\\\333\\\\314\\\\306M9z\\\\240\\\\210\\\\250I\\\\025\\\\204P\\\\305\\\\222-\\\\313\\\\262\\\\235\\\\003\\\\210X$aQ\\\\320^\\\\246JT\\\\025\\\\021Q\\\\224\\\\361x\\\\030\\\\243o\\\\233U\\\\263\\\\335\\\\210\\\\306\\\\202\\\\355f\\\\273l\\\\273\\\\315r~\\\\352\\\\214\\\\365\\\\336\\\\317f\\\\263\\\\305b\\\\261\\\\331l\\\\020q0\\\\030\0121 \\\\233^H\\\\013\\\\002K\\\\202\\\\020\\\\273\\\\256\\\\353\\\\023\\\\332\\\\231\\\\321\\\\032bk\\\\020E\\\\0057\\\\233UYW\\\\2451^q\\\\333\\\\204\\\\263\\\\371\\\\212\\\\311X\\\\342\\\\203\\\\275K\\\\226\\\\231\\\\030|\\\\327 \\\\210-\\\\034 8\\\\347\\\\266\\\\247\\\\247\\\\365\\\\341\\\\341\\\\357\\\\376\\\\356\\\\357\\\\376\\\\213\\\\177\\\\361/\\\\307\\\\343\\\\361\\\\203\\\\343\\\\373_\\\\274y\\\\0034\\\\215\\\\352\\\\341b6\\\\337\\\\256\\\\016\\\\366\\\\246\\\\303\\\\325b1\\\\034\\\\326\\\\037\\\\177\\\\374\\\\361K_\\\\370b\\\\2638+\\\\206c3\\\\331\\\\307\\\\242t\\\\311D\\\\242\\\\004ED\\\\020\\\\004P`P\\\\002\\\\021\\\\005Bb\\\\201\\\\204`*\\\\346\\\\306w\\\\220\\\\304X\\\\203\\\\210Y\\\\3617\\\\306d_\\\\3219\\\\255X\\\\002\\\\315\\\\251\\\\366\0429\\\\213\\\\270\\\\207\\\\255\\\\365(D\\\\325\\\\224\\\\322Eg\\\\324\\\\205\\\\036G\\\\271:\\\\236\\\\252f42\\\\365\\\\0351\\\\377N\\\\001\\\\200. \\\\340Rz\\\\010\\\\251\\\\202\\\\236M#w&QMl\\\\271\\\\264N%\\\\206\\\\266\\\\313O\\\\022U\\\\3210\\\\000\\\\244\\\\224T\\\\373\\\\022e\\\\271\\\\203\\\\306\\\\030\\\\213\\\\242\\\\360\\\\3363\\\\263\\\\265\\\\326\\\\373H\\\\220.\\\\035\\\\214B\\\\354\\\\006e\\\\025:\\\\257\\\\252\\\\314\\\\274Ym\\\\231\\\\231\\\\214\\\\015Q\\\\272\\\\030Rv\\\\2023\\\\205$!\\\\004\\\\347v\\\\211\\\\361\\\\200\\\\347d\\\\000\\\\252\\\\312hT\\\\225\\\\264\\\\217\\\\354\\\\364\\\\3765\\\\000&\\\\316\\\\244\\\\235\\\\240\\\\231\\\\341\\\\023\\\\362\\\\263\\\\347\\\\267\\\\273\\\\230\\\\244\\\\016\\\\220[1\\\\021\\\\001>\\\\202\\\\027\\\\317\\\\305\\\\215\\\\0312I\\\\003*\\\\251\\\\212\012*\\\\251\\\\202#\\\\262\\\\004m\\\\214\\\\\\\\U\\\\373{\\\\227\\\\326'\\\\247\\\\200\\\\226\\\\240\\\\003\\\\365\\\\232|\\\\010^U4\\\\245\\\\030bP\\\\005\\\\220\\\\3305\\\\022\\\\333(b\\\\021\\\\330h\\\\360\\\\033U\\\\025\\\\241\\\\343\\\\263-)\\\\250j\\\\214\\\\302\\\\326\\\\324\\\\303\\\\241\\\\252\\\\006\\\\005F\\\\313\\\\266p\\\\326\\\\252\\\\252HDf[\\\\022%\\\\327\\\\266[\\\\225D\\\\214\\\\252\\\\210\\\\2421&k\\\\255+]6^\\\\332.\\\\000P\\\\002\\\\263\\\\\\\\\\\\266L[\\\\313g'\\\\017\\\\216\\\\213+d@\\\\0205z1\\\\026\\\\207\\\\243i\\\\273\\\\355\\\\214q t\\\\355\\\\362\\\\325\\\\221\\\\261\\\\247\\\\022$\\\\371!\\\\301\\\\245\\\\252\\\\2764\\\\036\\\\225\\\\244\\\\261\\\\363G{\\\\207\\\\337|\\\\353\\\\255K\\\\327\\\\257\\\\375\\\\315\\\\017~0\\\\271q#\\\\254\\\\027\\\\311q9\\\\252\\\\001B9R4\\\\246\\\\015\\\\232\\\\212\\\\022\\\\000\\\\030\\\\225D\\\\011\\\\304(\\\\200R\\\\002J\\\\210f<\\\\032\\\\270\\\\226\\\\275\\\\367\\\\210\\\\230$GO2\\\\303\\\\273 \042\\\\222\\\\001\\\\000\\\\311\\\\240j\\\\354eRJ\\\\201\\\\240\\\\317\\\\010\\\\351\\\\367I\\\\011r\\\\276\\\\010+$TV\\\\024\\\\002V\\\\004\\\\020\\\\3319\\\\013\\\\024`\\\\207\\\\205\\\\006\\\\201\\\\214\\\\367\\\\003\\\\330\\\\341C\\\\262\\\\254\\\\002\\\\026\\\\326\\\\235$T\\\\004\\\\004\\\\001\\\\021@t\\\\226\\\\211\\\\270p\\\\246rV\\\\022w\\\\2324%d\\\\356R\\\\020\\\\025\\\\021aU\\\\316\\\\356\\\\245\\\\014\\\\224L\\\\336\\\\020\\\\031\\\\200z8\\\\\\\\.\\\\227\\\\235\\\\367\\\\210T\\\\324nvzl\\\\015Z\\\\225\\\\024\\\\202sn\\\\\\\\\\\\325\\\\020\\\\302v\\\\273\\\\255KWX\\\\307\\\\035\\\\314\\\\327\\\\233\\\\020\\\\205K\\\\307=\\\\0358\\\\251\\\\212&\\\\005R\\\\005\\\\312\\\\205l\\\\020\\\\220\\\\263\\\\035);|\\\\001\\\\364\\\\014\\\\362)&\\\\331%\\\\314\\\\212\\\\366\\\\305:\\\\316\\\\001\\\\272\\\\242\\\\017K\\\\243^\\\\320I\\\\364\\\\\\\\\\\\372\\\\367\\\\004];\\\\023\\\\234v\\\\177f\\\\260\\\\\\\\\\\\036O\\\\276\\\\335\\\\326u\\\\015\\\\252GG\\\\227\\\\357\\\\374\\\\364\\\\303\\\\371z=r\\\\010\\\\301kh4t\\\\252\\\\242\\\\002\\\\232RR@\\\\324\\\\315j!1\\\\364TI\\\\2521\\\\371L{n\\\\255\\\\025@Q\\\\025\\\\004dc\\\\310\042\\\\242\\\\002%ef\\\\243y`!k\\\\306m\\\\022U\\\\325 \\\\245 \\\\022U\\\\305\\\\307\\\\210\\\\242\\\\242\\\\232D\\\\006\\\\325\\\\020Q\\\\001H\\\\201\\\\001(&\\\\014!v]\\\\330n\\\\267\\\\276k\\\\002\\\\023\\\\023(kJIS\\\\002\\\\000\\\\211\012]\\\\004k_\\\\275y\\\\363\\\\223\\\\367\\\\337=\\\\234\\\\216'U\\\\2657\\\\252.M'W&\\\\203\\\\375\\\\311\\\\024\\\\200&\\\\223iY\\\\326\\\\333\\\\316\\\\037\\\\037\\\\037\\\\217\\\\366\\\\246\\\\363\\\\007\\\\367\\\\313\\\\262\\\\332\\\\177\\\\301\\\\226\\\\325\\\\324\\\\267\\\\033T\\\\035M\\\\313u\\\\333\\\\317\\\\212\\\\250\\\\312\\\\273\\\\316\\\\205\012\\\\3069\\\\227\\\\3376\\\\245\\\\244@\\\\210\\\\222@H\\\\025\\\\224\\\\2240SHi\\\\257\\\\306\\\\021\\\\000\\\\020jV+\\\\255e\\\\020\\\\014)\\\\001\\\\000\\\\023\\\\365\\\\375^e\\\\247t\\\\356>a\\\\212\\\\275\\\\366\\\\222I\\\\246\\\\263Q\\\\272#\\\\236\\\\312\\\\237\\\\226\\\\241/^\\\\016\\\\212\\\\004\\\\021\\\\225\\\\263B\\\\240\\\\347\012\\\\203B\\\\352<Y6\\\\016-\\\\033f\\\\266\\\\340 \\\\011\\\\032\\\\346`\\\\342\\\\316\\\\243d\\\\255e\\\\346\\\\030\\\\244K\\\\021\\\\021TR\012\\\\335x\\\\177,\\\\321{\\\\357c\\\\224\\\\355r1\\\\030\\\\024\\\\241\\\\353f\\\\335Bc\\\\032\\\\016\\\\252\\\\222\\\\255\\\\306\\\\200\\\\242\\\\315j\\\\005\\\\304H8,\\\\255\\\\002%$\\\\221<\\\\251\\\\345@\\\\002@\\\\022\\\\000\\\\355\\\\245)\\\\000\\\\210\\\\3009\\\\026J5\\\\233k\\\\200z\\\\356\\\\267\\\\353\\\\351\\\\2472\\\\310G\\\\317g\\\\235\\\\324\\\\207G\\\\260\\\\207\\\\233\\\\023\\\\322\\\\3160\\\\314t\\\\006\\\\331\\\\272\\\\355A\\\\267z\\\\016\\\\221\\\\354\\\\267\012\\\\252Q\\\\305Z\\\\0336\\\\2537\\\\276\\\\360\\\\346\\\\337\\\\374\\\\273\\\\177\\\\013\\\\014IER\\\\222\\\\024%\\\\245()\012\\\\304\\\\230\\\\024\\\\010\\\\031\\\\332\\\\306\\\\253D\\\\310&c?#\\\\346\\\\033&\\\\021\\\\220t\\\\216\\\\0367D\\\\004\\\\310\\\\214L\\\\206\\\\251g\\\\225&PE D e \\\\305\\\\314\\\\266\\\\200F5\\\\3451\\\\210L\\\\310\\\\224\\\\225-Q\\\\015\\\\222\\\\332\\\\266\\\\335n\\\\355b\\\\261h\\\\366'\\\\216\\\\015\\\\023X\\\\227+\\\\004\\\\010\\\\022G\\\\337v\\\\313Eq\\\\351\\\\322\\\\301\\\\376\\\\224\\\\024\\\\206\\\\365`2\\\\032\\\\215\\\\206\\\\245\\\\212T\\\\345@D\\\\227\\\\313eQ\\\\024\\\\242\\\\272\\\\3314\\\\267?\\\\275}S\\\\271\\\\242\\\\222\\\\326\\\\241;Y\\\\231\\\\242\\\\033\\\\035\\\\024\\\\215\\\\026\\\\355\\\\022\\\\014\\\\003 \\\\221\042\\\\352\\\\316\\\\253\\\\004\\\\000\\\\000\\\\246i\\\\232\\\\030c\\\\214qW'\\\\251_\\\\222\012\\\\355\\\\270\\\\315u\\\\347F @&\\\\226\\\\220\\\\210\\\\324!\\\\003\\\\203F\\\\004\\\\020\\\\013F@HQ$1\\\\000@BE\\\\304\\\\224Y\\\\342\\\\005\\\\023))(i\\\\037\\\\312\\\\006$\\\\225\\\\010}\\\\350\\\\027\\\\021v\\\\2636\\\\241\\\\311t\\\\212\\\\304=S\\\\030\\\\364.\\\\330\\\\320EHQ\\\\203\\\\007\\\\313hLa\\\\254bT\\\\244A\\\\301AAb\\\\022PC\\\\214L$A\\\\014\\\\201pH\\\\221A%\\\\245\\\\272(\\\\0151\\\\023-\\\\227\\\\311\\\\262k\\\\342\\\\326 \\\\035\\\\354\\\\357\\\\357O&\\\\000\\\\240\\\\011,\\\\273\\\\341p8_.V\\\\233\\\\255\042$E/\\\\021\\\\224\\\\330YL\\\\200\042\\\\271\\\\020\\\\007\\\\242@\\\\312\\\\235V\\\\373\\\\014\\\\352^q\\\\310\\\\005\\\\343\\\\031I\\\\015a\\\\202\\\\244\\\\212\\\\242Q\\\\205\\\\261\\\\017\\\\210\\\\010(\\\\366\\\\231\\\\215\\\\200Y\\\\262#\\\\000()?B\\\\361#\\\\273\\\\212\\\\037;4\\\\362\\\\243[PD1\\\\206|\\\\354|\\\\360/\\\\275\\\\364\\\\022\\\\020V\\\\203:n\\\\027y\\\\354'P\\\\021\\\\311e\\\\260\\\\224\\\\030\\\\200\\\\231\\\\0152\\\\367\\\\332\\\\370\\\\005\\\\247J\\\\010A\\\\222\\\\212\\\\000\0423S\\\\206\\\\340\\\\011$2\\\\234\\\\025\\\\310\\\\236\\\\312_A\\\\021\\\\372\\\\3007\\\\200!c\\\\0141g\\\\022\\\\336,\\\\2712\\\\271\\\\010\\\\346\\\\221!\\\\222B\\\\010M\\\\323\\\\254\\\\327\\\\353\\\\256\\\\353:\\\\353\\\\014#\\\\033\\\\227;4\\\\221i\\\\332\\\\016`a\\\\231\\\\026\\\\247'\\\\216\\\\320\\\\021W\\\\205+\\\\255\\\\313\\\\205\\\\352\\\\330Z\\\\266n8\\\\236F\\\\242\\\\321p\\\\342\\\\3330\\\\177p6r\\\\303\\\\324\\\\204\\\\270je\\\\333\\\\325\\\\373T\\\\210n\\\\232\\\\216\\\\007\\\\305\\\\271\\\\351$\\\\240\\\\240\\\\232\\\\223\\\\177\\\\314l\\\\276<\\\\267lT1\\\\244\\\\014\\\\013O\\\\212 \042\\\\310|>?\042* \\\\222\\\\210\\\\244\\\\200\\\\300\\\\222\\\\010\\\\000\\\\362\\\\350\\\\227\\\\204\\\\272\\\\023E}\\\\223\\\\365n[\\\\344\\\\014\\\\201Q\\\\000\\\\352\\\\3137g\\\\333\042]\\\\250\\\\320z\\\\256v\\\\023\\\\002\\\\001\\\\031\\\\002\042\\\\004\\\\276\\\\210R\\\\302\\\\322T\\\\232\042*$\\\\037H\\\\001Ub\\\\214))\\\\030\\\\243\\\\214\\\\231@6\\\\327\\\\350CUC\\\\254\\\\232\\\\320pU\\\\024\\\\353\\\\345\\\\202\\\\224\\\\004aP\\\\014RY\\\\335\\\\273s\\\\357\\\\370\\\\370x\\\\271\\\\230\\\\015\\\\006\\\\203\\\\203\\\\351\\\\336x4\\\\230\\\\216'u]uM[\\\\272\\\\3029\\\\227@c\\\\222 I\\\\005\\\\201p\\\\273ms&\\\\375\\\\303raITEE\\\\316\\\\213X\042\\\\202\\\\240\\\\032\\\\314j\\\\035\\\\242B\\\\212\042\\\\0325g8)!)\\\\001\\\\013(\\\\201&\\\\225\\\\363\\\\330\\\\237\\\\240\\\\212\\\\240\\\\234sv\\\\001\\\\252\\\\364a\\\\275\\\\276q\\\\340\\\\221\\\\345\\\\\\\\-\\\\2111\\\\032\\\\307\\\\002\\\\372\\\\332\\\\233o\\\\274\\\\365\\\\215\\\\277DI\\\\346!7^o\\\\032\\\\002\\\\220\\\\222\\\\032\\\\223cg;\\\\204~\\\\206\\\\346\\\\210 qNK!4D&W\\\\253I\042\\\\242\\\\001%\\\\363((\\\\366l}\\\\006\\\\010\\\\201QSL)\\\\366\\\\301\\\\201\\\\236\\\\314w'\\\\376@wV\\\\021\\\\304\\\\\\\\\\\\310\\\\242m\\\\263{D\\\\022\\\\024\\\\345\\\\256\\\\354\\\\013\\\\210\\\\246\\\\200j\\\\337\\\\177\\\\367o\\\\037\\\\334\\\\271K\\\\252\\\\243\\\\272B\\\\321\\\\354%\\\\234\\\\317\\\\227foZ\\\\017\\\\301\\\\007=]\\\\315\\\\025x>[\\\\025\\\\311\\\\334\\\\247\\\\373u=>\\\\252\\\\247\\\\024\\\\202_\\\\255\\\\305\\\\342h2\\\\331&H\\\\244\012\\\\2202p\\\\024)\\\\001$\\\\004\\\\263\\\\3314\\\\210Jdz*\\\\277\\\\235\\\\216\\\\321w&\\\\221\\\\363\\\\301\\\\207\\\\210\\\\011@4\\\\242$%\\\\205$\\\\252\\\\230R\\\\000 H\\\\202\\\\310\\\\320\\\\263\\\\363H/\\\\223\\\\220\\\\023\\\\246|\\\\301\\\\213\\\\035\\\\027{\\\\343\\\\022v\\\\022\\\\253\\\\027\\\\324\\\\204\\\\230T\\\\022@\\\\314$v9\\\\271\\\\255\\\\247\\\\241Q\\\\313\\\\234\\\\353\\\\245\\\\206\\\\300\\\\205\\\\211\\\\304(1gjn\\\\331\\\\272~\\\\212T%\\\\354c\\\\237\\\\371\\\\2661H\\\\327t\\\\271\\\\260\\\\351\\\\273\\\\237\\\\374\\\\344\\\\364\\\\364\\\\364\\\\376\\\\361iUU\\\\004\\\\326w\\\\262\\\\230or\\\\376\\\\305v\\\\273\\\\355|\\\\363\\\\352\\\\253\\\\257^\\\\273~\\\\035PSL\\\\316\\\\230\\\\210i\\\\265\\\\336Z[\\\\000\\\\000\\\\221!\\\\002DVM@\\\\220RH)\\\\021 !\\\\365y\\\\332\\\\2309\\\\352\\\\210\\\\255\\\\211\\\\202\\\\210Q\\\\344a6P\\\\226\\\\003\\\\004\\\\000(yx\\\\364[U\\\\004Hz\\\\236-\\\\327\\\\007\\\\272\\\\211Qr\\\\2016}\\\\314\\\\357\\\\001\\\\252)Fo\\\\234+]yv|\\\\362\\\\033\\\\277\\\\365w\\\\376\\\\346\\\\257\\\\376<\\\\3231\\\\252H\\\\224\\\\224RL)\\\\244$\\\\200D`BR\\\\306\\\\235\\\\373X\\\\025\\\\261\\\\357\\\\356\\\\314\\\\026\\\\000\\\\240\\\\317a\\\\340s\\\\313\\\\226\\\\031\\\\2201\\\\263\\\\355\\\\365\\\\305\\\\277\\\\001RJ\\\\010\\\\002m\\\\333\\\\211\\\\204\\\\230sx\\\\231\\\\220\\\\211\\\\010\\\\224\\\\022\\\\234\\\\177\\\\303|\\\\247\\\\024%\\\\205\\\\230\\\\222@\\\\2141\\\\242\\\\324IU5\\\\244\\\\304D\\\\004\\\\0101\\\\375\\\\315_\\\\177s\\\\273\\\\\\\\\\\\262\\\\300\\\\301t\042!\\\\030b\\\\000\\\\360)\\\\3462\\\\\\\\\\\\266\\\\344\\\\346\\\\344\\\\264\\\\032\\\\014\\\\267m\\\\267j\\\\332q\\\\212\\\\235\\\\367\\\\363\\\\371\\\\234\\\\346\\\\263\\\\311\\\\376\\\\025k&yR\\\\024\\\\224\\\\330'e\\\\212\\\\002&\\\\204\\\\204`B\\\\022\\\\242\\\\3765Uu\\\\007\\\\230G\\\\021A\\\\246^\\\\207\\\\336\\\\271\\\\347\\\\010@$\\\\021*\\\\312N\\\\206\\\\241 `\\\\202\\\\324\\\\347r\\\\367\\\\251Lx\\\\276UM\\\\347\\\\212\\\\314\\\\305\\\\016\\\\255\\\\212\\\\273R\\\\\\\\\\\\017\\\\223\\\\240\\\\000\\\\300d\\\\274+\\\\312E\\\\177\\\\011b\\\\316\\\\262\\\\316J\\\\0135\\\\034\\\\211\\\\010\\\\225\\\\024R\\\\210\\\\021c\\\\236\\\\354Ds\\\\254a\\\\007\\\\274\\\\024\\\\021iZ\\\\347\\\\\\\\\\\\033\042\\\\021\\\\375\\\\273o|\\\\363\\\\364\\\\364t\\\\377\\\\340\\\\312x\\\\214\\\\241\\\\363>\\\\264(\\\\251\\\\256\\\\312\\\\203\\\\351Y\\\\177,\\\\364\\\\000\\\\000 \\\\000IDAT$\\\\306h,-W\\\\233\\\\301be\012\\\\323\\\\263q\\\\032\\\\036TU\\\\014Y\\\\345\\\\3113\\\\010av\\\\030\\\\261\\\\212(\\\\022\\\\357\\\\362U\\\\004\\\\000\\\\023`.\042\\\\206\\\\300\\\\206\\\\373Z&Y\\\\244_\\\\230\\\\267\\\\360\\\\274\\\\035\\\\000\\\\000\\\\220\\\\263\\\\367\\\\022\\\\021M\\\\306?J\\\\257\\\\222 \\\\000\\\\3509UZv8\\\\022\\\\200\\\\210*3\\\\253\\\\252O\\\\221\\\\255\\\\271z\\\\343\\\\372ko\\\\274\\\\361\\\\343\\\\357\\\\377M\\\\224\\\\244 Q%\\\\252\\\\234W\\\\335$\\\\242\\\\030\\\\2432#i\\\\226\\\\270\\\\230\\\\261\\\\210I5\\\\373\\\\216\\\\000\\\\001HT\\\\024\\\\020\\\\030\\\\330\\\\220q\\\\014\\\\334;m\\\\0255A\\\\022\\\\201\\\\230\\\\242o\\\\332\\\\266\\\\333\\\\206\\\\020\\\\214!\\\\242\\\\3222\\\\2631D\\\\250\\\\200\\\\224s\\\\256\\\\021\\\\224P{S\\\\266\\\\177\\\\341\\\\030c\\\\222\\\\220yBB\\\\010\\\\002\\\\240)=\\\\270w\\\\372\\\\203\\\\267\\\\276\\\\233\\\\272nP8\\\\003\\\\210\\\\252\\\\301\\\\267\\\\017\\\\316V{\\\\203\\\\301lU\\\\005\\\\340r8\\\\236/6\\\\353U\\\\263\\\\\\\\7\\\\336\\\\371C\\\\322\\\\016B\\\\\\\\\\\\237\\\\361v>\\\\346HV\\\\232\\\\260US(JB\\\\321\\\\254\\\\360\\\\001%\\\\214\012\\\\375|\\\\204\\\\332\\\\323\\\\252*)\\\\345L\\\\236\\\\220\\\\342\\\\271o\\\\370\\\\\\\\\\\\361R\\\\300\\\\244Hd\\\\0001\\\\366\\\\346\\\\240\\\\005DQ\\\\310f\\\\031\\\\366\\\\035Qw\\\\345\\\\014\\\\021@\\\\317s\\\\373vq\\\\350~\\\\246\\\\026\\\\245\\\\004\\\\000\012\\\\011\\\\0204\\\\323\\\\333d\\\\344+\\\\200\\\\344\\\\004I\\\\315>\\\\273\\\\354\\\\365\\\\263\\\\304\\\\314\\\\254\\\\242\\\\022\\\\025 eRd\\\\353\\\\034*\\\\250h\\\\214\\\\031\\\\256\\\\220\\\\362\\\\350\\\\3140\\\\261\\\\266\\\\365\\\\326Ug\\\\263\\\\263\\\\272\\\\256o\\\\335\\\\271\\\\303\\\\306}\\\\372\\\\331\\\\035W\\\\316\\\\333\\\\355V5!\\\\350\\\\260\\\\256\\\\214-\\\\247\\\\323\\\\361O?\\\\372\\\\360\\\\370tv\\\\343l\\\\361\\\\312+/\\\\215\\\\307\\\\343\\\\365\\\\246\\\\361)2[\\\\004V\\\\005\\\\200\\\\200\\\\210D\\\\001\\\\231v\\\\015B\\\\242HH\\\\002\\\\2324{\\\\244\\\\201\\\\022&\\\\211\\\\273.\\\\333\\\\237)}]\\\\327\\\\363y(\\\\233\\\\213\\\\212\\\\310\\\\330\\\\2234\\\\003@\042\\\\312\\\\257\\\\234\\\\375KF{\\\\226\\\\025yd\\\\213 \\\\222\\\\252\\\\252j\\\\267\\\\353\\\\246\\\\363W\\\\016\\\\016\\\\266g\\\\017~\\\\371\\\\327\\\\177\\\\365\\\\335w\\\\276\\\\027\\\\261\\\\205^\\\\031\\\\007 D\\\\0016\\\\310L\\\\000\\\\202D\\\\314\\\\254*\\\\371\\\\313\\\\002@J$\\\\222\\\\277\\\\024\\\\250\\\\246\\\\334\\\\364\\\\314\\\\026\\\\231\\\\004Rvh\\\\247\\\\224\\\\307\\\\241\\\\206\\\\220\\\\274\\\\367\\\\307\\\\307\\\\3071FC0\\\\032\\\\215\\\\252\\\\242&4\\\\204\\\\006wYj\\\\002\\\\217\\\\240\\\\322\\\\263\\\\011,\\\\010AR\\\\214\\\\022$\\\\305\\\\244>F\\\\213\\\\010\042wn\\\\335\\\\272w\\\\347nh\\\\332q=hW\\\\233\\\\361\\\\336\\\\250Yo \\\\204\\\\262\\\\256\\\\200p\\\\333\\\\265\\\\203\\\\203KQa\\\\333\\\\372&D\\\\257\\\\376\\\\356\\\\331\\\\311`:<\\\\032\\\\216\\\\254\\\\203\\\\024\\\\232\\\\340\\\\327\\\\256\\\\332\\\\213\\\\340\\\\005\\\\200@X\\\\263\\\\276\\\\003\\\\254(\\\\010\\\\346\\\\370\\\\344\\\\254,K\\\\000\\\\310n]\\\\201\\\\276\\\\246yo\\\\244\\\\321C\\\\306\\\\347\\\\204@\\\\252\\\\206\\\\214O\\\\331\\\\251\\\\324\\\\353`\\\\204DD\042X\\\\024E\\\\036\\\\213L\\\\014\\\\210)%cL\\\\222\\\\300L\\\\250\\\\220$\\\\211\\\\010\\\\021\\\\346\\\\036\\\\233RR\\\\004\\\\347\\\\034\\\\021\\\\005\\\\237\\\\020\\\\321X\\\\253\\\\252]H\\\\000\\\\275;,3\\\\201g\\\\367n\\\\256W\\\\266i\\\\275\\\\210\\\\224eED]\\\\024\\\\221\\\\350\\\\272\\\\336\\\\353\\\\002\\\\200DLJ=h\\\\017\\\\271\\\\363\\\\201mu2[\\\\031[\\\\335?\\\\231\\\\373\\\\204\\\\226M\\\\020m6\\\\036\\\\005\\\\025\\\\020Ug\\\\233\\\\355w\\\\177\\\\360#b8\\\\272t\\\\260],\\\\375\\\\247\\\\267\\\\022\\\\362\\\\365\\\\353\\\\327\\\\006\\\\203\\\\001\\\\242\\\\211\\\\011\\\\0101s\\\\240\\\\000\\\\241&\\\\201 \\\\210\\\\312\\\\314!\\\\004\\\\310Sn\\\\326\\\\016\\\\0211&\\\\000\\\\220\\\\020\\\\313\\\\262\\\\024M\042\\\\342\\\\234\\\\013!\\\\244\\\\020\\\\213\\\\242PMD\\\\224\\\\351\\\\307\\\\2114F\\\\257\\\\212e] C\\\\222.g\\\\202\\\\250\\\\010\\\\241 \\\\242\\\\244\\\\256,\\\\212\\\\305ba\\\\255\\\\265\\\\326\\\\3668\\\\241\\\\224\\\\220\\\\310Z\\\\327\\\\266mQT\\\\022\\\\323|\\\\2610@o\\\\274\\\\371\\\\205\\\\242\\\\254\\\\201\\\\3226\\\\264\\\\031\\\\244\042\042EQ\\\\225u\\\\335\\\\372X\\\\226eF+1\\\\365n\\\\310\\\\030c\\\\014!wq\\\\300\\\\014\\\\342\\\\206\\\\224R\\\\212\\\\002\\\\021\\\\220ID6m\\\\003\\\\000\\\\365`\\\\204\\\\200\\\\333\\\\325z\\\\265Z\\\\265\\\\276\\\\233N\\\\247\\\\203\\\\2526\\\\206\\\\214\\\\263\\\\002\\\\232\\\\2475\\\\314\\\\227\\\\355\\\\343\\\\022(\\\\011\\\\020T\\\\011\\\\007\\\\243a\\\\2141\\\\2458\\\\034\\\\016\\\\327\\\\353\\\\365\\\\225\\\\253\\\\327\\\\005P\\\\025}\\\\327\\\\375\\\\353\\\\177\\\\365\\\\207\\\\214 1\\\\225u\\\\355\\\\254]-\\\\026\\\\365\\\\336dX\\\\327w\\\\036\\\\334\\\\277\\\\214p\\\\351\\\\360r5\\\\0306m\\\\327\\\\372\\\\260m\\\\272\\\\351\\\\301\\\\320\\\\213?\\\\235\\\\237QQN\\\\256^\\\\035\\\\256\\\\347\\\\352\\\\006\\\\021IMY\\\\024\\\\3162\\\\245\\\\316[\\\\306\\\\365rY\\\\016\\\\247I\\\\305|\\\\373\\\\333\\\\337YoW\\\\231_h0\\\\030}\\\\355k\\\\277\\\\375\\\\307\\\\177\\\\374\\\\307\\\\333\\\\355\\\\266,\\\\313\\\\213\\\\032B\\\\257\\\\370\\\\003d\\\\271\\\\302\\\\300Jz\\\\276\\\\025\\\\024\\\\203\\\\206,\\\\221\\\\222O\\\\376\\\\325\\\\227^\\\\275w|\\\\257\\\\335\\\\264EaU\\\\323\\\\336\\\\376dX\\\\215\\\\242\\\\206\\\\340\\\\263\\\\034\\\\322\\\\020BY\\\\226)%\\\\354=D\\\\220GQJ\\\\251,j\\\\344\\\\276,;\\\\0334\\\\330\\\\303\\\\211RJ\\\\326\\\\024\\\\210\\\\250\\\\304\\\\246\\\\361\\\\204\\\\206\\\\331\\\\026\\\\226\\\\275\\\\370\\\\3542\\\\317\\\\021\\\\025\\\\3329\\\\301\\\\244\\\\013D4\\\\252+\\\\203\\\\024B<\\\\236\\\\315WM\\\\327\\\\315\\\\327\\\\223\\\\311\\\\021\\\\000)\\\\223*\\\\003\\\\210\\\\202D\\\\020H\\\\262\\\\330\\\\264\\\\227.\\\\355w\\\\021\\\\336\\\\376\\\\341\\\\273\\\\037|\\\\374\\\\311k\\\\257\\\\275vxx\\\\230\\\\242\\\\346j\\\\304\\\\314\\\\006R\\\\357\\\\020f\\\\244\\\\010\\\\222\\\\222B\\\\357fN\\\\210=\\\\3419\\\\000\\\\240\\\\261\\\\314V#\\\\346\\\\304kDbr\\\\252\\\\340}*K\\\\023C\\\\330n\\\\267EQTu\\\\221\\\\242\\\\256\\\\026Kd)\\\\353\\\\022P\\\\327\\\\233\\\\025\\\\000Xk\\\\001 \\\\204\\\\360\\\\321\\\\207\\\\037 b\\\\010\\\\341\\\\364\\\\364\\\\224\\\\231\\\\317\\\\316\\\\316D\\\\344\\\\353_\\\\377z\\\\002hV\\\\015\\\\001\\\\030c\\\\206U\\\\205\\\\261kSx\\\\345\\\\3157\\\\336\\\\177\\\\347{h,\\\\245(Jh8WP\\\\0062Q\\\\2223\\\\3069\\\\253\\\\252>\\\\2641FDd\\\\303\\\\231\\\\021=E\\\\037c\\\\334y\\\\356\\\\010\\\\221\\\\272&\\\\356\\\\355\\\\355\\\\325\\\\243aJI\\\\024\\\\227\\\\313\\\\345j\\\\263\\\\211\042\\\\323\\\\351t4\\\\032\\\\025\\\\326e\\\\335:\\\\317\\\\275Y\\\\263\\\\210\\\\222zo @~\\\\205\\\\301`\\\\000\\\\000\\\\306\\\\230\\\\266\\\\363ggg\\\\227\\\\016/\\\\233\\\\302\\\\235\\\\236\\\\234\\\\035^\\\\276\\\\362\\\\247\\\\177\\\\372'\\\\367\\\\356\\\\335\\\\333\\\\254\\\\267\\\\210XZg\\\\211I9\\\\306\\\\010\\\\340\\\\272\\\\340\\\\025\\\\301\\\\213\012\\\\361|\\\\271\\\\350\\\\332\\\\200\\\\3101FI\\\\260\\\\267\\\\2677\\\\035\\\\017f\\\\017\\\\356\\\\\\\\}\\\\371\\\\365\\\\377\\\\355\\\\177\\\\371\\\\247\\\\037\\\\235\\\\256\\\\264\\\\034\\\\275\\\\374\\\\346\\\\353\\\\245\\\\345\\\\353W/_\\\\232N~\\\\351\\\\027\\\\177\\\\245\\\\331l\012\\\\343L\\\\024M\\\\200\\\\245+\\\\022\\\\244\\\\220\\\\324UuT\\\\00069\\\\333a\\\\267f\\\\356?P\\\\305\\\\030<\\\\0202\\\\032\\\\344\\\\354\\\\245\\\\024\\\\220\\\\250(\\\\206$5\\\\261\\\\260\\\\245\\\\217\\\\335h\\\\262\\\\367\\\\351\\\\235\\\\333\\\\333\\\\326\\\\013@\\\\222`6M\\\\333\\\\304\\\\263\\\\305Y\\\\333\\\\372\\\\272\\\\256sd\\\\377\\\\356\\\\203\\\\343\\\\020B.\\\\020\\\\221#vD\\\\024\\\\243\\\\370\\\\220\\\\02493\\\\303\\\\366>\\\\306\\\\013s\\\\031\042\\\\213\\\\242\\\\010\\\\344\\\\002\\\\262l\\\\210UP%\\\\347\\\\345\\\\363\\\\316'\\\\223/\\\\230c\\\\204>\\\\264u5\\\\004\\\\224\\\\3537^\\\\034\\\\214\\\\306\\\\363\\\\331\\\\246g*\\\\003\\\\005M\\\\252\\\\011D\\\\025R\\\\323n\\\\227\\\\333\\\\246*\\\\212\\\\220\\\\344\\\\301\\\\361\\\\354l\\\\366\\\\275\\\\314\\\\261\\\\371\\\\306\\\\353o\\\\226e\\\\351\\\\\\\\\\\\011 \\\\210\\\\214\\\\006\\\\015R\\\\002\\\\031\\\\326\\\\331\\\\324Q\\\\244\\\\376\\\\341\\\\211\\\\310 \\\\225\\\\2568~p{:\\\\235:\\\\347\\\\216\\\\217OF\\\\243\\\\301\\\\336\\\\336\\\\301\\\\203\\\\007\\\\367\\\\234\\\\261\\\\236\\\\2023v:\\\\335\\\\2131.\\\\027k\042\\\\036O\\\\306\\\\255_\\\\305\\\\320u]g\\\\255\\\\035\\\\217\\\\307w\\\\356\\\\334\\\\371\\\\223?\\\\372\\\\343o~\\\\363\\\\233\\\\371\\\\341U\\\\365\\\\301\\\\203\\\\007\\\\207\\\\007\\\\007\\\\326\\\\332\\\\275\\\\275\\\\275\\\\257~\\\\365\\\\253?\\\\371\\\\311{\\\\037\\\\375\\\\364\\\\223\\\\365z}||\\\\337\\\\0219\\\\326\\\\2015\\\\237}\\\\360\\\\001\\\\2621e\\\\211L\\\\3341\\\\2221\\\\3262\\\\263\042\\\\264\\\\333&$\\\\337\\\\372\\\\316Z\\\\026\\\\021\\\\037\\\\202B2\\\\306\\\\264m\\\\313\\\\314\\\\010\\\\014\\\\004\\\\316\\\\272\\\\341pX\\\\327\\\\2651\\\\356\\\\370\\\\301\\\\331x<\\\\015)-\\\\233\\\\245\\\\217i\\\\273mUq4\\\\232\\\\324u]\\\\027%\\\\023\\\\244\\\\224\\\\020!W\\\\336!\\\\300,\\\\321{\\\\1779\\\\202\\\\200\\\\262u\\\\343\\\\361\\\\330\\\\030\\\\323\\\\353\\\\315\\\\251\\\\027^\\\\316\\\\271\\\\273w\\\\357\\\\276\\\\365\\\\326\\\\333\\\\253\\\\315:\\\\205PXk\\\\230C\\\\347IC\\\\323\\\\210aqeY\\\\215\\\\206\\\\313\\\\315z\\\\3336Q\\\\305\\\\030\\\\3235m\\\\210\\\\233\\\\343{\\\\267M\\\\360\\\\305/\\\\374\\\\374h\\\\212\\\\246m\\\\333\\\\223\\\\023]\\\\007C\\\\305\\\\342\\\\366\\\\375\\\\243\\\\227o~\\\\362\\\\316O\\\\026\\\\303\\\\301\\\\017\\\\376\\\\352;e5\\\\272r\\\\345\\\\252i\\\\275w\\\\266\\\\004\\\\242\\\\214\\\\271\\\\375\\\\363?\\\\373K\\\\025\\\\314x\\\\326\\\\335\\\\250\\\\305\\\\013\\\\004\\\\215\\\\304\\\\006\\\\263\\\\220>wZ\\\\235\\\\033|\\\\352\\\\301\\\\026\\\\216\\\\014\\\\207\\\\024\\\\021\\\\331\\\\225\\\\2051\\\\334\\\\027\\\\015\\\\023\\\\261\\\\326\\\\222\\\\222c\\\\202\\\\024E\\\\2440\\\\314\\\\240\\\\231)/\\\\306H\\\\250\\\\206\\\\221\\\\201\\\\353\\\\272N\\\\331\\\\016\\\\327\\\\230+\\\\207d\\\\227\\\\0343\\\\307\\\\030Q\\\\321X\\\\007\\\\310\\\\000\\\\244\\\\0021\\\\005g\\\\035\\\\252\\\\2363<aO@\\\\241\\\\002`\\\\234\\\\255\\\\252\\\\252\\\\322\\\\232\\\\231g\\\\263\\\\231\\\\265v6\\\\2339[+Qv\\\\261+\\\\220*\\\\241\\\\202j\\\\032M\\\\206m\\\\333n\\\\333\\\\256\\\\256kW\\\\352f\\\\263\\\\011\\\\235\\\\257\\\\252\\\\352\\\\373\\\\357\\\\374\\\\250(\\\\212\\\\354EADk\\\\031\\\\021c\\\\014\\\\347\\\\036!\\\\342\\\\034\\\\377W\\\\006&\\\\242\\\\256\\\\013\\\\245+T\\\\225\\\\210\\\\352\\\\322\\\\345\\\\217Z\\\\024\\\\326\\\\020\\\\207\\\\020>\\\\372\\\\360\\\\375\\\\367\\\\337\\\\177\\\\277,\\\\313\\\\2337o\\\\026E\\\\261\\\\\\\\\\\\315\\\\226\\\\353\\\\323\\\\375\\\\203=cL\\\\214\\\\321{\\\\177\\\\373\\\\366\\\\355\\\\263\\\\223\\\\323\\\\262,\\\\327\\\\353u\\\\010a<\\\\036\\\\023\\\\231\\\\345b]\\\\024\\\\305z\\\\265\\\\375\\\\237\\\\377\\\\247\\\\177\\\\372\\\\356\\\\273\\\\357u!\\\\\\\\\\\\275z5\\\\204\\\\340\\\\014I\\\\362F\\\\242\\\\203X\\\\0228\\\\347\\\\2343\\\\201\\\\021\\\\015#rRL\\\\232\\\\214+f\\\\263\\\\323\\\\331l\\\\326\\\\266\\\\255\\\\210\\\\224\\\\245\\\\273|\\\\371\\\\362\\\\344\\\\362\\\\344`\\\\377\\\\3209\\\\227g\\\\003\\\\000\\\\332\\\\221\\\\344\042\042n6\\\\233\\\\323\\\\323\\\\323\\\\371rYT5\042\\\\326u\\\\275\\\\267\\\\267GD\\\\306ZLQ$\\\\307~\\\\022B\\\\257\\\\221\\\\212h\\\\022a\\\\242\\\\336!\\\\210h\\\\013\\\\207l\\\\227\\\\353Mh\\\\232\\\\375\\\\203\\\\251s\\\\245\\\\367\\\\236\\\\214\\\\375\\\\213\\\\277\\\\370\\\\343\\\\331bNh\\\\202xW9Dl\\\\332uI\\\\230\\\\014t\\\\301\\\\227u\\\\341SL\012M\\\\327\\\\001b\\\\033b\\\\214R\\\\227\\\\356\\\\346k\\\\327\\\\367&\\\\243\\\\305\\\\331l2\\\\336_\\\\235\\\\234|\\\\351\\\\365\\\\327?\\\\374\\\\363o\\\\036\\\\356_\\\\271\\\\367\\\\331\\\\355\\\\303\\\\311\\\\370\\\\235\\\\267\\\\277\\\\377\\\\353\\\\277\\\\366\\\\025\\\\213D\012\\\\177\\\\375\\\\227\\\\177e\\\\246\\\\323}\\\\000\\\\350\\\\272\\\\016\\\\000\\\\206\\\\303\\\\341lv:\\\\032\\\\215\\\\316\\\\353\\\\343\\\\022?\\\\342'\\\\006\\\\000\\\\271@\\\\335\\\\366\\\\230N\\\\302\\\\010\\\\245\\\\263\\\\000\\\\366\\\\356\\\\355[ \\\\251.\\\\013\\\\000\\\\320\\\\256k6+\\\\024B\\\\003\\\\205\\\\265D\\\\220\\\\015q\\\\006$FcX\\\\2250D\\\\024u\\\\240j\\\\330\\\\373\\\\006\\\\020LvTaRM\\\\230T!Ab\\\\004-\\\\334\\\\200\\\\015\\\\372\\\\020\\\\230-:\\\\313Q\\\\013\\\\313\042\\\\2623`\\\\362\\\\222\\\\000\\\\200\\\\231c\\\\224\\\\246i\\\\024\\\\0223+\\\\244\\\\341h\\\\3226>\\\\204\\\\240\\\\3316\\\\206>\\\\242\\\\251\\\\000\\\\310\\\\332u\\\\035\042$\\\\221\\\\371r\\\\301d\\\\213\\\\242\\\\312\\\\371s\\\\303\\\\361\\\\240\\\\267\\\\3265\\\\222b\\\\276Q\\\\010\\\\241t.\\\\273\\\\024\\\\015\\\\021\\\\202f/\\\\257\\\\0009gV\\\\233\\\\265\\\\265\\\\\\\\\\\\226\\\\345\\\\331|\\\\036B(\\\\235\\\\211\\\\321\\\\317\\\\347\\\\363\\\\373\\\\367\\\\357\\\\336\\\\271}\\\\273\\\\353:\\\\221\\\\364\\\\336{?QU\\\\353\\\\270m\\\\327\\\\233\\\\365:\\\\306\\\\230\\\\223D\\\\346\\\\363\\\\371z\\\\275\\\\021\\\\321\\\\361`\\\\344\\\\275wl\\\\367\\\\306\\\\323\\\\254'\\\\210\\\\310\\\\267\\\\277\\\\375\\\\335\\\\351tZ\\\\002K\\\\220\\\\371\\\\331YJ\\\\0114\\\\262\\\\306\\\\313\\\\373\\\\343\\\\220\\\\232I\\\\351\\\\2541\\\\354\\\\212\\\\202\\\\214\\\\252\\\\306(\012X\\\\026\\\\325\\\\336\\\\301QQ\\\\015\\\\227\\\\313\\\\305|>\\\\217*J\\\\\\\\\\\\326\\\\303\\\\315\\\\246\\\\021$\\\\347\\\\034\\\\273B\\\\005\\\\005\\\\250\\\\013I\\\\243\\\\334\\\\272u\\\\207\\\\311n\\\\267[%\\\\034\\\\216\\\\212\\\\242(\\\\004!\\\\017iD\\\\324\\\\335\\\\347W\\\\355Y\\\\2511\\\\023\\\\206\\\\001\\\\211\\\\200J\\\\312\\\\301\\\\201\\\\224\\\\022\\\\021y\\\\357}\\\\327UU\\\\025B(\\\\212\\\\342;\\\\337}\\\\373{\\\\337\\\\177\\\\273\\\\355B\\\\020\\\\015!\\\\330\\\\321\\\\010\\\\000RJ@\\\\246(\012ch\\\\3236\\\\307\\\\247'\\\\327\\\\256\\\\337\\\\314\\\\212\\\\376\\\\351\\\\351\\\\251\\\\261v\\\\265ncP\\\\357\\\\203\012VE\\\\355\\\\333\\\\360\\\\233\\\\277\\\\361\\\\033[\\\\036\\\\374\\\\360\\\\223;\\\\325p0\\\\335?\\\\370\\\\273\\\\177\\\\377\\\\267g\\\\247\\\\307u9\\\\000\\\\346W^\\\\177\\\\303\\\\204\\\\320W\\\\227\\\\011!l\\\\267\\\\333\\\\361x\\\\332\\\\266[\\\\352\\\\253q\\\\002J\\\\217\\\\001\\\\200\\\\235\\\\306\\\\224\\\\275\\\\031*\\\\230\\\\021\\\\261\\\\304\\\\220#d\\\\220\\\\235h!\\\\020\\\\303\\\\355\\\\333\\\\267\\\\313\\\\3129[\\\\202\\\\304\\\\341\\\\240h\\\\032\\\\037}$\\\\312\\\\272\\\\027\\\\240*\\\\021HL\\\\210(\\\\216U\\\\265\\\\3336\\\\252*\\\\205\\\\005&@F\\\\303\\\\316X\\\\316\\\\211\\\\0111\\\\005\\\\011)\\\\372\\\\246i\\\\312\\\\262v\\\\316E\\\\037\\\\332\\\\365\\\\326\\\\225\\\\365x<I\\\\330\\\\263/\\\\242\\\\202\\\\202\\\\364\\\\016\\\\034Q\\\\301\\\\024\\\\266^I\\\\030\\\\211\\\\014I\\\\004Dh6\\\\333\\\\256\\\\353\\\\014\\\\273\\\\214I\\\\311^\\\\341\\\\234\\\\002\\\\205\\\\2101\\\\305\\\\341ph\\\\255m\\\\333.\\\\006A\\\\304\\\\\\\\\\\\351\\\\332\\\\202\\\\331\\\\345\\\\352)\\\\000$\\\\011\\\\252J \\\\336\\\\267\\\\222\\\\002\042\\\\366A\\\\245\\\\024\\\\021\\\\210\\\\235%.\\\\016\\\\016\\\\366\\\\346\\\\363\\\\371|>\\\\337\\\\237\\\\356\\\\305\\\\344W\\\\253\\\\325\\\\313/\\\\337\\\\334lV?\\\\367\\\\2057/\\\\037\\\\035\\\\275\\\\367\\\\336O\\\\226\\\\363\\\\205u\\\\\\\\\\\\225\\\\303\\\\\\\\\\\\363e4\\\\234d\\\\324\\\\233\\\\357BY\\\\014\\\\253\\\\243\\\\221\\\\265\\\\026E\\\\207\\\\203\\\\351|>o)Zk}\\\\347G\\\\243\\\\321\\\\3137\\\\207\\\\307\\\\307\\\\307D\\\\024Bp\\\\266\\\\264\\\\2655\\\\254\\\\335f\\\\025S\\\\202\\\\220R\\\\251QEU\\\\214a\\\\000RHH2_\\\\255\\\\235s{{\\\\007\\\\223\\\\311d<\\\\236\\\\314fg\\\\263\\\\263\\\\305z\\\\265=<<\\\\364]4\\\\306\\\\210H\\\\327\\\\371\\\\246i\\\\274\\\\367\\\\032\\\\025\\\\004\\\\221`<\\\\036\\\\273\\\\252\\\\254\\\\353\\\\241\\\\261\\\\226\\\\254\\\\311\\\\346>\\\\000\\\\304\\\\030z\\\\362\\\\270\\\\244\\\\240I\\\\204e\\\\347\\\\330\\\\025\\\\021\\\\225\\\\036\\\\240\\\\246\\\\002\\\\306\\\\030B\\\\021\\\\204\\\\024\\\\265\\\\213\\\\301\\\\307\\\\360g\\\\177\\\\366g]\\\\033BH\\\\235\\\\217\\\\002\\\\224u\\\\302\\\\036\\\\036\\\\250\\\\302\\\\200uU!\\\\021;F\\\\246\\\\272\\\\256\\\\001 %\\\\031\\\\037\\\\034\\\\234,\\\\326\\\\026\\\\365\\\\362\\\\345\\\\313\\\\353mc\\\\266\\\\233Kl\\\\277\\\\372\\\\265\\\\2575\\\\337z\\\\353\\\\257\\\\276\\\\373\\\\326w\\\\177\\\\364\\\\316\\\\253/\\\\277\\\\364\\\\341\\\\355\\\\333\\\\253\\\\325&E\\\\270tt\\\\331\\\\314\\\\346\\\\013f.J\\\\327\\\\005\\\\337t\\\\355t:].\\\\327UU\\\\305\\\\350\\\\2635\\\\366X\\\\207\\\\266\\\\304\\\\347\\\\236Q\\\\310\\\\361A\\\\310\\\\23620\\\\206B\\\\210D\\\\200\\\\232 E\\\\237\\\\266\\\\314\\\\270\\\\230m\\\\331\\\\240e\\\\243\\\\232|\\\\333u]\\\\023C\\\\2101\\\\316OO\\\\000\\\\300Y\\\\003\\\\000]\\\\323\\\\002\\\\200u\\\\254\\\\000\\\\266p\\\\3149u\\\\036Tb\\\\362>g\\\\347\\\\237\\\\235\\\\235\\\\271\\\\252\\\\232N.)P\\\\022\\\\274r\\\\375Fi\\\\270\\\\013Q\\\\200{\\\\267>i\\\\246\\\\314\\\\225\\\\230\\\\004\\\\244\\\\260\\\\205\042JL1\\\\004\\\\011jK\\\\3235\\\\2151F%@\\\\306`dg\\\\212\\\\200hO\\\\216\\\\266X\\\\316\\\\030L\\\\366E\\\\304\\\\030\\\\235+\\\\353\\\\272\\\\354\\\\272V!Yv\\\\326\\\\261\\\\306\\\\324\\\\266\\\\333\\\\030#\\\\347\\\\230gJ\\\\242\012\\\\202)%\\\\211\\\\301\\\\332\\\\302\\\\241\\\\255\\\\352\\\\322'?\\\\231\\\\214B\\\\010\\\\313\\\\365\\\\002I\\\\367\\\\017\\\\3677\\\\355v8\\\\032\\\\250\\\\246\\\\375\\\\375\\\\275\\\\257}\\\\355\\\\267\\\\313\\\\262\\\\014\\\\261\\\\363m\\\\310\\\\037u8\\\\0342s\\\\306 \\\\020\\\\021\\\\212f)S\\\\024\\\\305b\\\\261\\\\360\\\\336\\\\247\\\\224NOOC\\\\347\\\\313\\\\262\\\\334\\\\237LU\\\\025\\\\331\042\\\\003;kH\\\\272\\\\315\\\\312hX\\\\235\\\\335\\\\037\\\\015K\\\\015m\\\\347\\\\003\\\\364\\\\325\\\\310\\\\204\\\\254\\\\273tp\\\\224]O\\\\204n:\\\\335\\\\257\\\\252j\\\\273\\\\3356Ms||\\\\202\\\\210\\\\3169\\\\347\\\\234*\\\\206\\\\220\\\\214qeUVE\\\\035\\\\203\\\\270\\\\2620\\\\205\\\\213!!RQ\\\\024\\\\331^\\\\177\\\\030\\\\216@\\\\352\\\\3477\\\\331\\\\301\\\\260\\\\020bJ\\\\014P\\\\224E]\\\\327eY\\\\212H\\\\343\\\\233l\\\\3272\\\\3637\\\\276\\\\361\\\\215;w\\\\356\\\\270\\\\242\012\\\\222D\\\\244(\012%\\\\336\\\\254\\\\026\\\\225\\\\201(\\\\251\\\\353:c\\\\213\\\\311d2\\\\034M\\\\262YY\\\\015\\\\007\\\\203\\\\301`\\\\266\\\\\\\\\\\\3167\\\\315\\\\341\\\\321~1\\\\031m\\\\222\\\\036\\\\257\\\\026\\\\207\\\\203AGx\\\\353\\\\344\\\\344K\\\\277\\\\372k\\\\345\\\\265\\\\033I\\\\243\\\\246\\\\370\\\\333\\\\257\\\\276\\\\214\\\\210e=\\\\3366\\\\235\\\\031\\\\324Uv\\\\364:\\\\303\\\\326\\\\226]\\\\263-\012K\\\\004\\\\205e%d0\\\\272\\\\253A\\\\324\\\\253\\\\034\\\\301g\\\\232\\\\364\\\\363\\\\203\\\\371=\\\\215\\\\341\\\\242\\\\260Yu9<<\\\\220\\\\230\\\\232\\\\246\\\\251J'\\\\036\\\\2343)\\\\245\\\\305|\\\\331n\\\\326\\\\314\\\\\\\\W\\\\245\\\\033\\\\024\\\\0206 \\\\321\\\\262A\\\\324\\\\340*\\\\000\\\\261\\\\304Qe\\\\033\\\\332$\\\\220@Q4\\\\033\\\\243\\\\014\\\\211\\\\015\\\\214\\\\206\\\\265*\\\\206n\\\\003@\\\\256\\\\254\\\\367\\\\206\\\\345\\\\250\\\\266a\\\\266a[\\\\00313e\\\\313,\\\\317!Y\\\\216\\\\032c\\\\310\\\\022\\\\200\\\\365\\\\344\\\\253\\\\262\\\\\\\\\\\\205U\\\\351\\\\334\\\\005\\\\264'\\\\212\\\\352\\\\271\\\\204\\\\260\\\\266\\\\024P\\\\004f6y\012\\\\022\\\\221\\\\324\\\\327\\\\210gc\\\\214a\\\\273m\\\\226\\\\263\\\\331\\\\242i\\\\032f,\\\\213\042\\\\003\\\\036\\\\000 F/\042uQ\\\\326\042\\\\253\\\\246)\\\\313\\\\262(\\\\212\\\\325bqrrB\\\\014\\\\245uM\\\\263y\\\\351\\\\346\\\\315\\\\262,\\\\001R\\\\263]\\\\266\\\\315*#\\\\002\\\\021\\\\270r\\\\325j\\\\2760\\\\3068g\\\\2200\\\\245HD\\\\316\\\\262\\\\265\\\\266\\\\353\\\\272\\\\275\\\\351\\\\330w\\\\221\\\\231_z\\\\361f\\\\256~B\\\\004\042\\\\022\\\\001m\\\\341Db\\\\014]\012\\\\215\\\\205\\\\370\\\\376\\\\273?\\\\034\\\\225f\\\\273\\\\2325M\\\\027AIr\\\\011\\\\357\\\\324u>\\\\243\\\\244H\\\\001\\\\221\\\\\\\\UW\\\\246\\\\364u\\\\227R\\\\352b@Dc\\\\234$0\\\\034J[\\\\216\\\\206\\\\303\\\\020\\\\202\\\\367\\\\033\\\\004k\\\\011\\\\275&\\\\020\\\\320\\\\024\\\\266]\\\\303} \\\\271\\\\317\\\\027A\\\\304\\\\236\\\\324\\\\023\\\\021\\\\021\\\\031\\\\242\\\\250\\\\260\\\\345\\\\242\\\\260u]\\\\226u\\\\331\\\\372\\\\356\\\\354\\\\364t\\\\1772\\\\351D\\\\210\\\\315\\\\377\\\\373\\\\007\\\\377\\\\272\\\\252\\\\207\\\\313\\\\3156\\\\206\\\\244\012\\\\256p\042\\\\261i\\\\232\\\\301t\\\\204\\\\226\\\\224\\\\014\\\\273*\\\\011\\\\024\\\\31696\\\\303A\\\\021;/\\\\220\\\\220-s\\\\211`\\\\326\\\\333nX7\\\\303\\\\311x\\\\276\\\\234\\\\035^\\\\213\\\\247\\\\263\\\\263\\\\361\\\\364\\\\322\\\\265\\\\23377\\\\276\\\\235-f\\\\242xvz\\\\252\\\\363m\\\\362\\\\311\\\\220\\\\004\042r\\\\316\\\\255\\\\273\\\\226\\\\030XSQ\\\\024>\\\\006\\\\334\\\\031Z\\\\204\\\\224c?\\\\210L\\\\004\\\\306\\\\330\\\\3167\\\\306T\\\\331\\\\254'\\\\242\\\\306w\\\\326Z\\\\006N)\\\\226\\\\256*\\\\212\\\\002Q#\\\\004;\\\\032\\\\024\\\\306jQ\\\\244\\\\340\\\\013g,NG/\\\\\\\\\\\\307\\\\344\\\\013g\\\\242on^\\\\236~v\\\\353\\\\223\\\\355z\\\\265\\\\177\\\\260\\\\3276\\\\335d:\\\\256\\\\\\\\A\\\\316E\\\\300\\\\034\\\\312f\\\\244\\\\374\\\\316\\\\2528\\\\030\\\\014\\\\254\\\\265ggg{{\\\\007\\\\314\\\\334y_\\\\327\\\\003\\\\0211GS\\\\245b\\\\353\\\\023\\\\000\\\\020Q\\\\362\\\\0014U\\\\205E4IB\\\\327u{{\\\\373m\\\\333\\\\326Ua\\\\214i\\\\266+\\\\215\\\\035c\\\\317\\\\020\\\\223R\\\\002Dg\\\\034\\\\227%\\\\222\\\\361Q\\\\264\\\\017\\\\367\\\\364\\\\2122Z\\\\353\\\\214e\042\\\\223\\\\345\\\\177\\\\204z\\\\270\\\\367\\\\332\\\\376eD\\\\2141\\\\342\\\\005\042\\\\230s\\\\223\\\\203I\\\\021\\\\272\\\\341\\\\240<>\\\\276\\\\277?\\\\035\\\\276x\\\\343\\\\212\\\\017\\\\255e\\\\303\\\\234\\\\023\\\\361\\\\2221v\\\\265\\\\230}\\\\360\\\\301\\\\007\\\\313\\\\345\\\\362\\\\340\\\\340\\\\340\\\\340\\\\340\\\\320o7m\\\\353\\\\037<\\\\270w\\\\362\\\\340\\\\376\\\\301\\\\301^a\\\\335b~v\\\\355\\\\332\\\\265\\\\037\\\\377\\\\370\\\\275\\\\243\\\\243\\\\243\\\\321pr\\\\365\\\\352\\\\265\\\\262\\\\032\\\\2005\\\\355zc\\\\312*\\\\250\\\\332\\\\262\\\\010!$&\042Z6\\\\376\\\\370\\\\376\\\\203\\\\217?|\\\\357\\\\354\\\\370^lW\\\\224\\\\302\\\\215\\\\243K\\\\265!\\\\206TWe\\\\033\\\\032\\\\265\\\\001\\\\220P\\\\024\042\\\\260\\\\2605\\\\3062[t\\\\321\\\\251\\\\021\\\\233\\\\235\\\\307d]]\\\\324\\\\020\\\\261Y\\\\267\\\\326\\\\351h\\\\\\\\ jL[g0A\\\\352\\\\232\\\\204LH\\\\274\\\\013\\\\264\\\\211*\\\\210HF\\\\177K\\\\202\\\\2424m\\\\263-\\\\0347\\\\355\\\\346\\\\362\\\\341\\\\230\\\\254\\\\354\\\\037M\\\\357\\\\337\\\\271}\\\\274\\\\230\\\\015&\\\\323u\\\\320\\\\177\\\\363\\\\027\\\\177\\\\335x\\\\3344]\\\\010\\\\022c\\\\346\\\\232\\\\222\\\\256Y\\\\273\\\\222\\\\227\\\\333\\\\015\042\\\\006\\\\034\\\\372\\\\263\\\\225s\\\\316\\\\252\\\\336\\\\270~\\\\275]-\\\\256]=\\\\372\\\\301\\\\273\\\\037$\\\\001\\\\007\\\\305v\\\\326\\\\214\\\\271d\042\\\\337m\\\\274_\\\\243\\\\304\\\\350\\\\273\\\\263\\\\223\\\\331I8}\\\\375\\\\027\\\\276tg\\\\266Z\\\\236\\\\234-\\\\037\\\\234\\\\305E\\\\363\\\\341\\\\217?0\\\\203\\\\302\\\\210\\\\010J\\\\2704\\\\035\\\\305\\\\024\\\\274O\\\\3017\\\\205s\\\\332C\\\\2562\\\\216\\\\206\\\\021\\\\221\\\\011\\\\235\\\\261\\\\306\\\\230\\\\252\\\\342\\\\262\\\\250\\\\273\\\\256\\\\363>\\\\000Rm\\\\355`0h\\\\333\\\\226\\\\214UM\\\\261\\\\335 \\\\001#\\\\251&\\\\337t\\\\252\\\\351\\\\340`\\\\357\\\\354\\\\364\\\\304\\\\032\\\\370\\\\341\\\\333\\\\337\\\\276r\\\\371\\\\322v9\\\\033T\\\\345\\\\374\\\\354\\\\370{o}\\\\307\\\\030\\\\372\\\\235\\\\337\\\\371\\\\235\\\\325\\\\374\\\\364\\\\303\\\\367~\\\\370\\\\302\\\\013/\\\\\\\\\\\\276zm\\\\271\\\\355\\\\356\\\\336\\\\273\\\\267Z\\\\255\\\\307\\\\343qUU\\\\313\\\\345\\\\322{\\\\237\\\\215\\\\375\\\\263\\\\263\\\\263\\\\272\\\\256\\\\263\\\\272vtttxx8\\\\030\\\\355\\\\011\\\\266\\\\276ishPs\\\\314\\\\255\\\\003\\\\021a\\\\202kW\\\\256\\\\224%\\\\335\\\\376\\\\344\\\\343\\\\037\\\\375\\\\340\\\\207\\\\323\\\\351\\\\024\\\\021._\\\\276\\\\002\\\\202\\\\336\\\\307\\\\242,\\\\217\\\\216\\\\216\\\\252j\\\\320tAb(*\\\\027}\\\\3108;$\\\\262\\\\314\\\\271jN\\\\327l\\\\013&\\\\303\\\\206z\\\\202\\\\332\\\\324\\\\206\\\\255\\\\346H\\\\022\\\\363\\\\271Q\\\\204l\\\\220(\\\\211\\\\370\\\\256\\\\333.\\\\216\\\\377\\\\342\\\\235\\\\357\\\\357\\\\355\\\\355\\\\275\\\\372\\\\352\\\\313'\\\\307\\\\307\\\\314\\\\250In\\\\337\\\\371LB<==\\\\231/\\\\316\\\\274\\\\367\\\\022\\\\003\\\\021\\\\335\\\\372\\\\364\\\\263\\\\224\\\\322f\\\\323\\\\214F\\\\243\\\\350[cHd\\\\353\\\\333&\\\\245\\\\024\\\\272\\\\265o\\\\027g'\\\\351\\\\356\\\\355O\\\\036\\\\034\\\\337!tW\\\\257_\\\\277q\\\\375\\\\305\\\\020\\\\272\\\\375\\\\313\\\\327O\\\\027\\\\313\\\\301p\\\\272i\\\\266\\\\326\\\\362\\\\265\\\\353/\\\\325\\\\203\\\\361\\\\027~\\\\376\\\\313\\\\251k|\\\\263\\\\032\\\\227\\\\366\\\\364\\\\336\\\\355\\\\343;\\\\267\\\\226\\\\307\\\\367?\\\\271u\\\\353\\\\372\\\\215C/^)eN`\\\\003\\\\306h\\\\246\\\\311a\\\\205h\\\\021\\\\003\\\\202\\\\002r\\\\206k\\\\367(\\\\354\\\\224\\\\242\\\\250j\\\\366\\\\305\\\\021\\\\031\\\\262@\\\\000)\\\\2011\\\\306\\\\020\\\\244\\\\240\\\\304\\\\\\\\\\\\024\\\\205h\\\\024\\\\021\\\\222\\\\030=XC\042\\\\321\\\\031.\\\\313\\\\362\\\\360\\\\350`\\\\275\\\\335\\\\334}pL\\\\256X7\\\\355\\\\362\\\\223\\\\317\\\\336\\\\377\\\\311\\\\007\\\\255\\\\217\\\\3146C\\\\240PDR\\\\020\\\\011\\\\375\\\\367\\\\002\\\\016B\\\\345p\\\\234\042\\\\004\\\\357\\\\035\\\\241z\\\\317\\\\020\\\\327\\\\233%Q\\\\025\\\\332`\\\\313\\\\242.\\\\007\\\\261\\\\363\\\\206\\\\207\\\\004zr\\\\357\\\\356\\\\260\\\\034\\\\314c\\\\234L\\\\016>\\\\275u\\\\367\\\\305\\\\233\\\\257\\\\274s\\\\266X.\\\\266\\\\357\\\\277\\\\365\\\\216Ij|\\\\327\\\\226e\\\\271\\\\335\\\\256ch\\\\221\\\\364\\\\372\\\\265k\\\\336\\\\267M\\\\323\\\\204\\\\020\\\\023\\\\244\\\\034\\\\245\\\\316\\\\000+f5\\\\034)\\\\345\\\\342\\\\273\\\\011c(\\\\020\\\\221\\\\270m\\\\267+\\\\277J)U\\\\256\\\\260\\\\226\\\\025%\\\\206\\\\240\\\\200\\\\326\\\\261\\\\255l\\\\3234\\\\233\\\\325Ih\\\\347\\\\237\\\\334\\\\2765;~pv\\\\377\\\\223\\\\256\\\\335l\\\\327K\\\\3134\\\\031\\\\325M\\\\263\\\\371\\\\370\\\\243\\\\367\\\\221t8\\\\260\\\\222\\\\232\\\\267\\\\277\\\\367\\\\355\\\\316\\\\247\\\\355v\\\\353}\\\\364\\\\233\\\\321t:\\\\015\\\\336\\\\317g\\\\263{\\\\237\\\\375t8\\\\030\\\\267m\\\\353\\\\207C\\\\312d\\\\201\\\\032\\\\035$\\\\215\\\\355l6\\\\233\\\\315f\\\\353\\\\365:\\\\306\\\\2501\\\\021\\\\0211\\\\204\\\\020\\\\252\\\\242|G5\\\\204\\\\316Z\\\\013M3\\\\330\\\\263\\\\237}\\\\362\\\\311\\\\235\\\\017~X\\\\324{1aY\\\\226w\\\\247\\\\023P\\\\\\\\\\\\254WI\\\\241\\\\250\\\\006\\\\257\\\\275\\\\376&[g\\\\2153\\\\205+\\\\253\\\\201u.Fj\\\\305k\\\\354\\\\272N\\\\310\\\\260\\\\265\\\\326\\\\261I)\\\\211\\\\002\\\\0037\\\\333uQ\\\\024l\\\\234BJ!\\\\250\\\\252\\\\217!t\\\\376\\\\217\\\\376\\\\350ON\\\\037\\\\034\\\\227e\\\\371\\\\243w~<\\\\235Lb\\\\014\\\\367\\\\357\\\\336\\\\253\\\\007\\\\245c\\\\303\\\\314\042\\\\240js\\\\204(\\\\204\\\\000J@\\\\333(\\\\335\\\\266\\\\333L\\\\334\\\\240\\\\365\\\\233\\\\266\\\\333LF\\\\343\\\\204\\\\276\\\\036\\\\027\\\\326b\\\\033\\\\342\\\\246]\\\\234\\\\234\\\\234\\\\335?\\\\273}2\\\\273w\\\\353\\\\366\\\\351\\\\227~\\\\351\\\\357\\\\336\\\\270\\\\371Z\\\\333\\\\244\\\\321p\\\\277i\\\\232[\\\\237\\\\335?88h\\\\266[\\\\277\\\\015W\\\\017\\\\257-\\\\317N\\\\016\\\\016^\\\\230\\\\324\\\\373?\\\\\\\\}\\\\347\\\\340\\\\2107\\\\2335\\\\262\\\\321\\\\030!\\\\347\\\\001!f\\\\334 \\\\003\\\\204\\\\024s\\\\230=\\\\373+ %\\\\020\\\\025\\\\021\\\\020\\\\220\\\\276\\\\256VV5\\\\211\\\\224H)\\\\204\\\\300\\\\210\\\\232z\\\\037\\\\25336%\\\\222$\\\\365\\\\240PH)(\\\\212N\\\\206\\\\243\\\\311p4\\\\032\\\\356}\\\\370\\\\341\\\\373\\\\363\\\\305j<\\\\236\\\\336?>\\\\333,7\\\\267\\\\357\\\\334\\\\033\\\\016\\\\006 \\\\242\\\\240\\\\032\\\\003\\\\244\\\\030#\\\\210\\\\004MBD\\\\011\\\\241\\\\023\\\\001\\\\344\\\\305js\\\\355\\\\340\\\\352\\\\311\\\\311\\\\311\\\\336\\\\245+D\\\\344\\\\214\\\\335tB,\\\\242\\\\361\\\\326\\\\255O\\\\335\\\\313\\\\227\\\\327kW\\\\227\\\\345b\\\\271z\\\\353\\\\375wo\\\\376\\\\352Wg\\\\017\\\\356\\\\357\\\\337x\\\\341\\\\316\\\\355\\\\333\\\\277\\\\364\\\\345_\\\\234\\\\332\\\\352\\\\301\\\\207\\\\237\\\\235\\\\334\\\\273\\\\317\\\\277\\\\373_\\\\374\\\\223_\\\\374\\\\362\\\\317\\\\377\\\\352\\\\257\\\\374\\\\322\\\\227\\\\277\\\\364\\\\205/\\\\376\\\\334\\\\233o\\\\274\\\\366rU\\\\270\\\\256]\\\\317\\\\317N@\042#8F\\\\313@*\\\\022=\\\\204m\\\\263>\\\\363\\\\333e\\\\327\\\\255\\\\333\\\\3652\\\\370\\\\215\\\\370v\\\\2638\\\\335,\\\\317\\\\232\\\\365|1{\\\\2608}\\\\260^\\\\234\\\\254\\\\316\\\\216\\\\317N\\\\356,N\\\\036,\\\\347\\\\017\\\\232fu\\\\357\\\\316\\\\247\\\\250\\\\376\\\\316\\\\255\\\\217_\\\\274q%\\\\245\\\\356\\\\372\\\\225K\\\\0001\\\\370\\\\355\\\\013/\\\\\\\\\\\\215\\\\276k\\\\332\\\\325\\\\341\\\\245}\\\\325t\\\\347\\\\366g\\\\233\\\\365\\\\252*\\\\\\\\Y\\\\030g\\\\020E2'l\\\\351\\\\314\\\\260.\\\\207uQW\\\\305d4\\\\250+G(1\\\\264\\\\315v\\\\2658\\\\275\\\\317\\\\352\\\\303v\\\\016\\\\261)X\\\\352\\\\202\\\\306C7.\\\\2714\\\\032\\\\232\\\\245c\\\\251\\\\035\\\\016k\\\\303\\\\342k\\\\207\\\\244\\\\376\\\\322\\\\336x\\\\263\\\\336X\\\\313 a\\\\273\\\\232k\\\\362\\\\243A9\\\\250\\\\013\\\\215~\\\\275\\\\232G\\\\337\\\\020\\\\004F-\\\\035\\\\015\\\\007\\\\345\\\\260v\\\\203\\\\322]?:\\\\224\\\\350\\\\233\\\\3652%O\\\\230@#\\\\2512C\\\\351\\\\214a\\\\320\\\\330\\\\305\\\\320\\\\025\\\\006\\\\312\\\\3228C\\\\010\\\\351\\\\315\\\\327\\\\336x\\\\365\\\\345W~\\\\375\\\\327~\\\\375\\\\265W_\\\\233\\\\214F\\\\257\\\\277\\\\366\\\\372\\\\027\\\\277\\\\370\\\\305\\\\303\\\\203K\\\\227.\\\\035\\\\336\\\\270vc8\\\\030\\\\021RU\\\\015\\\\312\\\\262.\\\\270(\\\\353ro\\\\177_4um+\\\\2521\\\\204\\\\224\\\\022\\\\223\\\\361\\\\276#\042I\\\\031O\\\\204\\\\242\\\\230i\\\\306\\\\333.\\\\315\\\\347\\\\015\\\\001^\\\\271r\\\\205\\\\021\\\\211x\\\\177\\\\357R\\\\212\\\\001\\\\021\\\\252\\\\262j\\\\233\\\\256\\\\256*\\\\211i0\\\\030\\\\324\\\\325`6_,\\\\026sg\\\\000%e:b\\\\356\\\\253\\\\334\\\\243\\\\200\\\\010\\\\252\\\\202\012\\\\344\\\\215\\\\252\\\\010H&\\\\211\\\\006\\\\005Dbf\\\\313\\\\334#\\\\2752\\\\306\\\\232\\\\000S\\\\212 js.\\\\000qY\\\\026/\\\\334\\\\2706\\\\036\\\\015\\\\327\\\\253UQ\\\\226GG\\\\227\\\\367\\\\367\\\\367\\\\273\\\\266\\\\373\\\\321;\\\\177\\\\213@\\\\276\\\\213\\\\247g\\\\263\\\\365z\\\\253\\\\010\\\\316\\\\332\\\\316\\\\207\\\\024\\\\275\\\\206NS0\\\\2304EQ\\\\021\\\\342\\\\004\\\\310\\\\306\\\\305.\\\\014\\\\253\\\\002\\\\223\\\\337\\\\233N|\\\\347_\\\\270\\\\371\\\\3127\\\\276\\\\375\\\\035\\\\005\\\\223\\\\200\\\\230\\\\341\\\\306\\\\365\\\\203\\\\316o\\\\257\\\\\\\\9\\\\232\\\\2576_\\\\376\\\\225\\\\337\\\\372\\\\347\\\\377\\\\362\\\\0176\\\\211^|\\\\355\\\\315{'\\\\247\\\\314\\\\\\\\\\\\026\\\\305K/\\\\2748.\\\\007\\\\247''\\\\346'\\\\357\\\\274\\\\375\\\\336\\\\337~\\\\217\\\\2317\\\\233\\\\025\\\\000\\\\250\\\\312h84\\\\306\\\\204\\\\355\\\\032\\\\000\\\\204\\\\231\\\\255\\\\003\\\\242\\\\2244\\\\2437W\\\\263\\\\007\\\\206\\\\261(\\\\313v\\\\333n\\\\273\\\\026\\\\201D\\\\244,KM\\\\311\\\\267m\\\\3274)\\\\305\\\\322\\\\025u\\\\351\\\\000`\\\\263\\\\355\\\\320\\\\032\\\\037\\\\332\\\\355R\012N\\\\253\\\\371}\\\\203\\\\311o\\\\343d\\\\350\\\\034\\\\217\\\\013\\\\207\\\\327\\\\257\\\\037n\\\\266\\\\333A]\\\\244u\\\\033|\\\\363\\\\302\\\\365\\\\353\\\\247'3C4*\\\\313\\\\311xJD\\\\263\\\\331,4MY\\\\226\\\\265\\\\265\\\\021U\\\\27253\\\\227\\\\234\\\\035\\\\300I%-\\\\217OTSU\\\\024eY\\\\022\\\\001\\\\242\\\\227\\\\230\\\\244\\\\333^>\\\\030\042\\\\242o\\\\273\\\\263\\\\223;\\\\206\\\\230\\\\222+(\\\\236\\\\334\\\\377\\\\364\\\\215\\\\327\\\\277D\\\\256\\\\362]\\\\354\\\\202\\\\337\\\\337?\\\\270z\\\\375:\\\\000\\\\035\\\\237\\\\234\\\\275\\\\376\\\\372\\\\353\\\\256\\\\252\\\\2151\\\\231\\\\367Pe\\\\213\\\\036Y\\\\360\\\\355\\\\357\\\\276}\\\\347\\\\326\\\\355\\\\343\\\\343c\\\\266f2\\\\231\\\\214\\\\307\\\\343\\\\275\\\\275\\\\203\\\\321t2\\\\036\\\\217W\\\\353\\\\365r\\\\271\\\\024\\\\0047\\\\331\\\\253\\\\006S5\\\\212Q\\\\321\\\\271\\\\361\\\\360(\\\\363\\\\024\\\\035\\\\356\\\\217rR\\\\343\\\\275[\\\\237]\\\\277~\\\\375\\\\352\\\\321e\\\\347\\\\\\\\\\\\323n\\\\372\\\\210\\\\014`Q\\\\225A\\\\322b\\\\271,\\\\013\\\\233\\\\211\\\\231\\\\231\\\\261kZ\\\\321\\\\230\\\\375\\\\206\\\\203z\\\\024c\\\\264\\\\266$\\\\242\\\\246\\\\365e=\\\\236N\\\\016\\\\220MY\\\\017C\\\\010I\\\\201\\\\215\\\\261,\\\\252E]\\\\025\\\\213\\\\371\\\\331t4X\\\\316\\\\222O\\\\335\\\\370`\\\\357\\\\3257\\\\336\\\\214a\\\\023\\\\233STB\\\\005\\\\006\\\\026\\\\004\\\\312\\\\232$([\\\\006U$\\\\315aW\\\\351I=1\\\\212\\\\202\\\\022J/\\\\313\\\\373\\\\0240\\\\000CVDP\\\\241\\\\260\\\\326\\\\020\\\\242jU\\\\270\\\\203\\\\203\\\\275\\\\027o\\\\\\\\\\\\033\\\\215\\\\006]\\\\263\\\\261E5\\\\034\\\\016c\\\\204O?\\\\375l\\\\261\\\\352\\\\352\\\\232c\\\\354\\\\274\\\\367\\\\241\\\\355F\\\\243\\\\221\\\\367\\\\336'\\\\037\\\\333\\\\246\\\\000\\\\001\\\\010\\\\252\\\\2344C\\\\002)\\\\002\\\\267QI\\\\303\\\\331b=\\\\035\\\\354\\\\237\\\\234\\\\315\\\\367\\\\367/\\\\025\\\\306\\\\214\\\\352\\\\252\\\\235\\\\267Ip\\\\333u?z\\\\367\\\\366\\\\2137\\\\016\\\\356\\\\337\\\\277\\\\377\\\\305_\\\\274\\\\3216Mj\\\\375\\\\017\\\\276\\\\367\\\\326\\\\377G\\\\326\\\\233\\\\364Z\\\\266\\\\035gb\\\\021\\\\253\\\\335\\\\335io\\\\223\\\\335{/\\\\363\\\\345#\\\\037)6r\\\\225Tr\\\\015,\\\\270\\\\014\\\\030\\\\250\\\\032xb\\\\300@y\\\\346\\\\237\\\\341\\\\037\\\\340?axb\\\\030\\\\360\\\\310\\\\023\\\\303F\\\\215\\\\004\\\\253lH,\\\\241T\\\\204$\\\\212%\\\\212\\\\244\\\\310\\\\327d\\\\237\\\\267;\\\\375\\\\356V\\\\027\\\\341\\\\301:\\\\347fR\\\\265\\\\007\\\\231'o\\\\336{w\\\\267V\\\\254X\\\\021_\\\\323\\\\241\\\\376\\\\336\\\\037\\\\374a\\\\337\\\\035\\\\336\\\\275\\\\013\\\\363/\\\\352\\\\363\\\\207\\\\017\\\\376\\\\353\\\\177\\\\365/\\\\325'\\\\217\\\\226\\\\373\\\\375~\\\\034\\\\307\\\\261\\\\333\012\\\\001\\\\373\\\\375~uM\\\\30304M\\\\225B\\\\274\\\\307\\\\270\\\\011!\\\\004H\\\\024)\\\\216\\\\275\\\\024\\\\004\\\\223)\\\\022\\\\351\\\\024C\\\\212\\\\301{\\\\221l\\\\3234\\\\313\\\\213\\\\211\\\\037\\\\315\\\\352\\\\356\\\\216|[\\\\324\\\\263\\\\272\\\\256#+[\\\\227\\\\373\\\\375v\\\\265ZY#\\\\302\\\\270\\\\327Z\\\\035\\\\372^\\\\002\\\\002\\\\247\\\\253\\\\267/\\\\317\\\\317.\\\\373n\\\\367\\\\372e_TUi\\\\345v}3\\\\251\\\\312\\\\224\\\\222\\\\353\\\\366\\\\357\\\\273]\\\\241\\\\015H\\\\321\\\\224\\\\312Vz}{\\\\035\\\\211\\\\202s\\\\332\\\\332\\\\322Z\\\\020\\\\242*\012\\\\000*KK)\012\\\\201\\\\336\\\\035\\\\201\012\\\\314\\\\354\\\\234\\\\033o\\\\273\\\\302\\\\330\\\\242(\\\\346\\\\323\\\\211\\\\2242\\\\245P\\\\024\\\\346\\\\342ly}\\\\365\\\\272\\\\254&Rj\\\\027\\\\303\\\\333\\\\327\\\\233\\\\353\\\\253\\\\327\\\\314\\\\354|\\\\374\\\\331_\\\\375\\\\205\\\\224\\\\032\\\\244\\\\210!\\\\371\\\\030\\\\000@\\\\333\\\\322Z\\\\373\\\\370\\\\301\\\\343\\\\344\\\\017\\\\225\\\\005\\\\304\\\\344\\\\273\\\\315M\\\\2779\\\\354\\\\356\\\\232\\\\246\\\\011!\\\\234\\\\004\\\\245q\\\\375N\\\\241\\\\024\\\\031\\\\275\\\\\\\\\\\\024\\\\325\\\\276\\\\355\\\\013m.//\\\\017\\\\207\\\\003\\\\021I\\\\024\\\\277\\\\374\\\\273\\\\237~\\\\373U\\\\371\\\\275\\\\357}\\\\357\\\\371\\\\263/\\\\252\\\\252\\\\312\\\\243\012\\\\244L\\\\021\\\\256\\\\257nX\\\\310\\\\263\\\\331C\\\\346\\\\024\\\\203\\\\327J:\\\\036\\\\004`\\\\212\\\\251=\\\\3548\\\\321j\\\\2651\\\\306x\\\\027o\\\\356\\\\356\\\\316\\\\317\\\\317\\\\327\\\\253\\\\255\\\\266f\\\\034\\\\307\\\\307\\\\237~bl\\\\331;\\\\377\\\\354\\\\331\\\\263\\\\252\\\\256S\\\\212U\\\\2011\\\\365\\\\263yid\\\\303)|\\\\347\\\\273O\\\\203\\\\337~\\\\365\\\\367\\\\253\\\\243[\\\\016\012\\\\001\\\\2302`\\\\375\\\\230g\\\\034\\\\033QY\\\\330\\\\034\\\\000Y\\\\200QE\\\\342c]\\\\031\\\\370$\\\\364\\\\237\\\\2714)!1j\\\\220\\\\210\\\\014\\\\\\\\\\\\030;\\\\237\\\\315Jk\\\\026\\\\363\\\\331\\\\371\\\\362,\\\\022\\\\267m\\\\337v\\\\253o^\\\\274\\\\026\\\\250\\\\373\\\\316I\\\\255\\\\214.\\\\273\\\\256\\\\037\\\\203\\\\367\\\\301K\\\\231\\\\213}\\\\014\\\\300\\\\234\\\\2211(I\\\\210\\\\220\\\\000\\\\022k\\\\024\\\\011\\\\325\\\\273\\\\367\\\\327\\\\237\\\\374\\\\323\\\\037\\\\037\\\\272\\\\341\\\\371d\\\\342\\\\306\\\\021\\\\021|\\\\362V\\\\311'\\\\237=!\\\\032\\\\224\\\\326>\\\\244\\\\020\\\\302\\\\177\\\\377\\\\257\\\\377\\\\365\\\\377\\\\374\\\\177\\\\374\\\\337/~\\\\373\\\\365\\\\213\\\\367\\\\357\\\\377\\\\233\\\\377\\\\356\\\\277\\\\035\\\\016\\\\335O~\\\\362g<Rp\\\\036\\\\177\\\\377\\\\217\\\\376\\\\205\\\\367\\\\243\\\\367\\\\236(V\\\\205a\\\\346q\\\\350\\\\017\\\\207\\\\303|>\\\\215\\\\316\\\\207\\\\350$\\\\212\\\\214\\\\371\\\\262\\\\272PJT\\\\205\\\\212\\\\301\\\\327u\\\\243\\\\215\\\\3119~\\\\010\\\\241\\\\252\\\\252\\\\334\\\\015\\\\342D\\\\333\\\\335\\\\272\\\\335\\\\355\\\\205\\\\300\\\\246\\\\252Ma\\\\207\\\\350\\\\207\\\\241\\\\313\\\\205\\\\325\\\\246i\\\\264\\\\226BB\012q>\\\\237\\\\177\\\\373\\\\3557\\\\213\\\\30523Y\\\\\\\\\\\\360\\\\234\\\\010\\\\000\\\\306\\\\276\\\\237L&\\\\310\\\\340c\\\\250\\\\212\\\\262\\\\250J?\\\\370n\\\\350\\\\317\\\\026Ket\\\\337vBI \\\\354\\\\307\\\\301jC\\\\300R[\\\\027|J)\\\\333_\\\\027Ea\\\\214\\\\2121:\\\\347\\\\274s)\\\\245\\\\213\\\\213\\\\213\\\\\\\\\\\\227\\\\000\\\\200\\\\272\\\\256\\\\257\\\\257\\\\257'\\\\223IU61\\\\306\\\\266mG\\\\037\\\\264\\\\326\\\\332\\\\026!\\\\204\\\\321\\\\205\\\\224\\\\222\\\\020*\\\\227\\\\301\\\\013[\\\\225e\\\\271^\\\\335\012!\\\\212\\\\242(\\\\313\\\\022@\\\\370\\\\020r\\\\241\\\\224\\\\231\\\\205V\\\\326\\\\226(\\\\304\\\\320\\\\367\\\\3750()\\\\213\\\\262\\\\334\\\\037\\\\266\\\\323\\\\305\\\\274?\\\\264)\\\\245\\\\351d\\\\336\\\\266\\\\355~\\\\267+\\\\212\042\\\\2670T\\\\256\\\\000*\\\\225{\\\\335\\\\373\\\\266g\\\\320EU\\\\331\\\\30287@\042c\\\\025s\042Ju]\\\\257\\\\327k\\\\253\\\\355z\\\\275VF[k\\\\213\\\\242\\\\232L&\\\\233\\\\325\\\\272\\\\353\\\\016\\\\347\\\\227\\\\017BJ\\\\221\\\\030\\\\205:\\\\364\\\\335\\\\345\\\\345\\\\203\\\\363\\\\363\\\\363W\\\\257^~\\\\362\\\\350\\\\361f}\\\\267\\\\230\\\\315\\\\353\\\\322\\\\256n\\\\357^~\\\\365\\\\353\\\\007\\\\263\012\\\\243\\\\223\\\\244\\\\224P\\\\010\\\\0222\\\\316_\\\\344\\\\372\\\\373\\\\261\\\\201\\\\317\\\\211\\\\210\\\\000\\\\023\\\\022\\\\242\\\\321M\0428\\\\201\\\\313?\\\\024gS\\\\364\\\\210\\\\214\\\\304Jbiua\\\\314r\\\\261x\\\\364\\\\350b\\\\261\\\\234\\\\226\\\\245}\\\\371\\\\372\\\\315\\\\335j{}\\\\273\\\\331\\\\037\\\\332\\\\365\\\\266\\\\235\\\\316g!$\\\\245\\\\265\\\\024\\\\320\\\\367m\\\\242\\\\220\\\\2213\\\\311\\\\365e\012\\\\302\\\\373B\\\\347*\\\\223\\\\026\\\\272\\\\350\\\\003\\\\202\\\\0243k*I\\\\017'\\\\352\\\\223\\\\213\\\\345?\\\\377\\\\303?\\\\270x\\\\364\\\\344\\\\177\\\\371_\\\\377\\\\367\\\\257__w,A\\\\202\\\\021\\\\303\\\\243\\\\213\\\\305|\\\\332\\\\374\\\\361\\\\277\\\\370\\\\227\\\\315\\\\345w\\\\304\\\\374\\\\311_\\\\376\\\\372\\\\305\\\\377\\\\365g\\\\177\\\\246\\\\027\\\\263\\\\307\\\\317>\\\\373\\\\361\\\\217\\\\377\\\\263\\\\177\\\\377\\\\027\\\\177\\\\331\\\\256\\\\016\\\\207\\\\355A%\\\\327\\\\372\\\\261'\\\\242\\\\007\\\\017.\\\\202\\\\033\\\\000\\\\370\\\\301\\\\362\\\\362\\\\363\\\\347\\\\177\\\\364\\\\363\\\\237\\\\375\\\\255\\\\227)\\\\005-\\\\245\\\\314\\\\334$\\\\223\\\\025\\\\202\\\\303\\\\300\\\\2308\\\\215~\\\\030c$\\\\241\\\\324b\\\\261x\\\\366\\\\354\\\\351O\\\\177\\\\372W\\\\257_\\\\255\\\\220y\\\\271\\\\\\\\^^,\\\\307\\\\261\\\\007\012J\\\\3108v\\\\027\\\\213)\\\\200 \\\\212\\\\333\\\\355\\\\026\\\\301\\\\240'\\\\245\\\\324~\\\\273\\\\271<?WJ\\\\265}/$v\\\\355\\\\336*\\\\255\\\\265\\\\266V\\\\247\\\\340\\\\001\\\\300(\\\\005@\\\\273\\\\315\\\\332\\\\373\\\\250\\\\224\\\\272\\\\271\\\\275>\\\\326R\\\\204H1\\\\257!\\\\215)\\\\312\\\\365j\\\\355c$\\\\312\\\\010^R\\\\252'\\\\242\\\\276\\\\357\\\\205\\\\020eY\\\\016\\\\303 M5t\\\\235\\\\266\\\\266;\\\\034\\\\000\\\\310\\\\032\\\\345\\\\372.\\\\245\\\\024B\042\\\\004\\\\2555 \\\\306HZ\\\\353\\\\315\\\\356\\\\340\\\\234\\\\253\\\\252\\\\252i\\\\032m\\\\015B\\\\024\\\\340\\\\273\\\\375\\\\212(\\\\266R\\\\347\\\\333\\\\007\\\\200\\\\304\\\\200\\\\010\\\\027\\\\027\\\\227\\\\353\\\\233\\\\353}{\\\\020B(i\\\\244B\\\\243\\\\013\\\\244\\\\242\\\\220\\\\264z\\\\367\\\\325b\\\\261p\\\\311\\\\335\\\\274\\\\273\\\\235\\\\315f\\\\017\\\\316\012b\\\\226\\\\310\\\\336\\\\007\\\\245X\\\\010\\\\2420\\\\2000\\\\263\\\\252,L\\\\271\\\\331\\\\015\\\\205\\\\246\\\\365\\\\365\\\\353q\\\\354\\\\265\\\\326\\\\306\\\\252\\\\252*\\\\332v\\\\317\\\\261\\\\2460\\\\226\\\\215zx\\\\331\\\\313\\\\201\\\\316\\\\354\\\\000\\\\000 \\\\000IDAT\\\\244\\\\224\\\\020i1\\\\263\\\\233\\\\315uexV7\\\\335pW\\\\224\\\\345\\\\362\\\\341\\\\345l>\\\\027\\\\332\\\\334\\\\336\\\\256\\\\336\\\\276\\\\374\\\\225\\\\353\\\\373\\\\337\\\\374\\\\303u\\\\362\\\\001\\\\343\\\\303\\\\267\\\\335\\\\241\\\\251*\\\\251\\\\022%\\\\207\\\\024\\\\201I\\\\010)\\\\200\\\\022eE\\\\204\\\\023\\\\000\\\\370H.\\\\222\\\\230q5 B\\\\010'\\\\225<\\\\274\\\\317\\\\236\\\\023\\\\005%\\\\244RR`\\\\312yhUUUUH)SpW\\\\273M\\\\337\\\\367777w\\\\253\\\\235\\\\363I(M\\\\214Bj\\\\357c\\\\214\\\\276n\\\\312\\\\366\\\\340\\\\021ip\\\\275\\\\210\\\\001\\\\020\\\\000\\\\011@2sV7\\\\213\\\\200\\\\220x\\\\337\\\\367\\\\325\\\\254\012\\\\211\\\\017]\\\\027\042\\\\231\\\\302Ngszs\\\\035\\\\023\\\\245\\\\024\\\\233E1\\\\306\\\\324\\\\373\\\\364\\\\325\\\\213\\\\327\\\\377\\\\345w\\\\377\\\\363\\\\267\\\\273\\\\303\\\\363\\\\347\\\\317\\\\377+\\\\342\\\\177\\\\377\\\\213\\\\377\\\\030}x\\\\373\\\\372\\\\325\\\\305\\\\305\\\\331Y\\\\263t\\\\027N5\\\\245\\\\362\\\\203/\\\\255iw\\\\267Z\\\\312fRE\\\\327\\\\276\\\\372\\\\3467\\\\225\\\\025\\\\225\\\\265\\\\220tQ\\\\024\\\\223\\\\272\\\\031\\\\307q\\\\030\\\\006\\\\2518\\\\246X\\\\0256\\\\204\\\\240\\\\214n\\\\333}]\\\\327/\\\\277\\\\375\\\\332j\\\\371\\\\317\\\\376\\\\340\\\\237\\\\274y\\\\363*\\\\205\\\\370\\\\350\\\\321\\\\203\\\\227/^(\\\\211MS\\\\017~\\\\234Te\\\\212\\\\001A8\\\\347\\\\232\\\\252\\\\226Ze|p\\\\327u1\\\\306\\\\371t&\\\\245\\\\034\\\\373\\\\341\\\\331\\\\247\\\\3178\\\\221\\\\217\\\\001\\\\221\\\\307q\\\\234\\\\315f\\\\271\\\\232!zy\\\\361`z\\\\337r_\\\\236\\\\237\\\\015\\\\303P\\\\026U\\\\214Qk\\\\355b\\\\252\\\\246\\\\213H\\\\354}\\\\234N\\\\233q\\\\364\\\\000t\\\\350\\\\332<\\\\232SJZkk\\\\355n\\\\263\\\\265e\\\\021\\\\317\\\\316\\\\353\\\\272\\\\322\\\\2028y\\\\245\\\\324~w@%\\\\307q,\\\\313\\\\222\\\\030\\\\225R\\\\237&\\\\276\\\\357\\\\211\\\\202\\\\024\\\\205\\\\255\\\\232\\\\252\\\\250\\\\013\\\\334\\\\254\\\\356\\\\334\\\\350\\\\225H\\\\256\\\\357\\\\307q\\\\024\\\\332\\\\030\\\\243\\\\206V\\\\217\\\\335\\\\326 \\\\224\\\\205I1I\\\\304i\\\\251\\\\313B\\\\304\\\\024\\\\330b\\\\273\\\\271&\042A\\\\274[u\012\\\\205\\\\262\\\\306H\\\\243\\\\2242`)R\\\\362\\\\221\\\\330\\\\273\\\\350B\\\\242\\\\3537\\\\257uQV\\\\266\\\\260\042\\\\365\\\\355~s\\\\333)\\\\245\\\\312\\\\322\\\\036\\\\3267EQ\\\\274\\\\335\\\\255\\\\000\\\\300\\\\030\\\\023c\\\\274z\\\\365\\\\262*\\\\314|\\\\326\\\\014]\\\\250\\\\353\\\\346\\\\372\\\\335\\\\213\\\\355\\\\355\\\\373\\\\315~7\\\\233/\\\\205\\\\222\\\\000\042\\\\214\\\\3438\\\\270\\\\030\\\\343\\\\257n\\\\337\\\\305\\\\030\\\\004`i\\\\004\\\\031y\\\\330\\\\254\\\\317\\\\316\\\\0364\\\\365\\\\314\\\\350\\\\252\\\\254\\\\253\\\\241\\\\035\\\\206\\\\301U\\\\245%\\\\002N$A(\\\\224 Dd\\\\200\\\\004Zg\\\\325\\\\245\\\\017\\\\305u!A*\\\\003\\\\304\\\\336\\\\373B\\\\311\\\\334\\\\335t\\\\301\\\\013%Q\012\\\\002\\\\330\\\\355v_\\\\177\\\\375\\\\315\\\\325\\\\365]de\\\\313ZK3\\\\216^J\\\\305\\\\002\\\\245\\\\321\\\\343\\\\350sI\\\\007\\\\031\\\\0201\\\\004\\\\257\\\\031\\\\235\\\\217\\\\000@@\\\\344=\\\\240\\\\3150\\\\321\\\\256\\\\037g\\\\306\\\\216\\\\316\\\\375\\\\366\\\\3057\\\\017?{ZOg\\\\201aL\\\\001%\\\\034\\\\006O\\\\224\\\\226\\\\027\\\\017v\\\\275{\\\\277Zm\\\\235d\\\\326?\\\\370\\\\301\\\\017R\\\\241\\\\242\\\\026w\\\\267\\\\353\\\\272\\\\250YH\\\\347\\\\202\\\\232O\012\\\\0113c\\\\224s\\\\256\\\\353\\\\016\\\\207M\\\\257\\\\224*\\\\315L@\\\\312\\\\330b\\\\201\\\\204\\\\220\\\\264\\\\302\\\\244\\\\225@\\\\230L\\\\233a\\\\030la\\\\244V\\\\237}\\\\366I\\\\036j\\\\257_\\\\277~\\\\361\\\\342EUU@\\\\2119\\\\215\\\\343@D]\\\\3272\\\\363\\\\253\\\\267o\\\\346\\\\363\\\\371\\\\251}\012\\\\316\\\\271\\\\020\\\\302\\\\341p\\\\220R\\\\022Q\\\\327\\\\366\\\\211\042\\\\021QLD\\\\031\\\\206A\\\\031\\\\233\\\\222[\\\\246\\\\210\\\\270\\\\333\\\\355\\\\256\\\\257\\\\257\\\\037>|\\\\350\\\\275\\\\317\\\\0001k\012\042\\\\032\\\\206\\\\241\\\\357\\\\307\\\\304\\\\210R\\\\371\\\\321\\\\2450R\\\\244\\\\311l2\\\\257'\\\\306jJ<\\\\262/\\\\244VR\\\\371a\\\\\\\\\\\\257\\\\327\\\\024\\\\342\\\\203\\\\207\\\\227U)\\\\3758d\\\\354Je'Zk\\\\357}\\\\337\\\\367B\\\\352Lq\\\\310}>!\\\\004'\\\\327v\\\\243\\\\226\\\\342\\\\374l\\\\246\\\\244\\\\311\\\\027,\\\\2454\\\\246\\\\000\\\\301\\\\223zz\\\\273\\\\272s\\\\303XT\\\\245\\\\0049\\\\206\\\\321\\\\365\\\\256\\\\335vuc\\\\027u\\\\255f3\\\\200\\\\354ir\\\\244a\\\\027\\\\266\042\042D\\\\311\\\\314\\\\262@\\\\241ut\\\\276;\\\\264O.\\\\317mQe\\\\306\\\\300\\\\244\\\\262\\\\210\\\\213\\\\334\\\\357TJI)\\\\243w\\\\314\\\\\\\\UUJ\\\\251\\\\357:\042:l\\\\326\\\\000\\\\304\\\\211*\\\\243&\\\\223\\\\306h\\\\251\\\\224\\\\032]\\\\210L\\\\321\\\\215@qR\\\\227\\\\315\\\\3719\042r\042\\\\001\\\\021h\\\\270<\\\\237\\\\227\\\\365\\\\354\\\\325\\\\253\\\\267\\\\237<\\\\231\\\\367\\\\316I\\\\243\\\\027M=\\\\264\\\\035\\\\260\\\\224 \\\\230\\\\231R\\\\306\\\\010\\\\003\\\\340Q\\\\317\\\\216\\\\20193D3_\\\\235\\\\331(\\\\311,B\\\\2121\\\\222\\\\220\\\\330P\\\\235\\\\210B\\\\010\\\\253\\\\365\\\\346\\\\345\\\\313\\\\027\\\\267w+\\\\241\\\\214\\\\022\\\\252\\\\037\\\\035`,\\\\352&\\\\245\\\\004\\\\004\\\\210\\\\307flN\\\\327\\\\361$cr\\\\337\\\\223:\\\\3463\\\\300\\\\220\\\\222)\\\\353\\\\333\\\\273[\\\\2347!\\\\246\\\\316yG\\\\234\\\\000tQ\\\\026u\\\\025\\\\335v\\\\335\\\\216OMy\\\\366\\\\350\\\\261g\\\\371\\\\333o^>\\\\370NIb\\\\267^\\\\257=\\\\320v\\\\337\\\\352\\\\245.uS\\\\226\\\\245\\\\002\\\\016)\\\\216\\\\353C\\\\267\\\\337\\\\357S\\\\212\\\\027g\\\\213iS\\\\026Vz\\\\027\\\\225\\\\324B*\\\\243\\\\245\\\\261\\\\312\\\\026\\\\332jM\\\\000\\\\203\\\\033\\\\235\\\\033&\\\\263\\\\3710\\\\014UY\\\\203\\\\024\\\\337\\\\375\\\\376w\\\\363*\\\\177vv\\\\266\\\\271[!\\\\303\\\\362\\\\351SD\\\\014\\\\301\\\\025E\\\\361\\\\350\\\\321#\\\\0008\\\\364\\\\375l6#\\\\346\\\\353\\\\353k\\\\255mY\\\\2261\\\\306\\\\020\\\\\\\\\\\\306F3\\\\245\\\\314\\\\313\\\\000\\\\200C\\\\267\\\\027\\\\306\\\\030SdL\\\\243\\\\224\\\\322Z;\\\\235N_\\\\277~]\\\\327\\\\365|\\\\266@D\\\\347\\\\334\\\\315\\\\315Mn\\\\246\\\\314&\\\\323\\\\242P\\\\2441\\\\304\\\\330\\\\373a\\\\330\\\\371\\\\020RJ\\\\301\\\\230bp\\\\243+\\\\312z\\\\322\\\\030L\\\\363\\\\312P\\\\224F\\\\360\\\\346nU\\\\024\\\\305d2I&E\\\\242q\\\\0343\\\\244A)\\\\345\\\\234\\\\033\\\\207\\\\356\\\\260\\\\337f\\\\334\\\\202\\\\020BJ1)\\\\213\\\\262Pha\\\\034B\\\\346%D\\\\037\\\\3060\\\\254\\\\256o\\\\011X\\\\242\\\\210^\\\\010e)\\\\006%\\\\305t\\\\262\\\\270\\\\275\\\\276\\\\266\\\\326f\\\\205\\\\020\\\\255\\\\265\\\\024rpn\\\\277oo\\\\306;kmQ\\\\224\\\\314,\\\\000\\\\253fb\\\\224\\\\236T\\\\223\\\\333\\\\365&\\\\272VJ\\\\251\\\\215\\\\252\\\\213\\\\306\\\\026:'6\\\\031\\\\257\\\\234\\\\204I)\\\\025\\\\312\\\\010#\\\\014\\\\250\\\\020B5_\\\\206\\\\340\\\\023\\\\003\\\\001\\\\027\\\\322\\\\024\\\\363:K\\\\306\\\\274{\\\\367.\\\\222TRN\\\\313\\\\311\\\\254\\\\231\\\\022\\\\221\\\\367\\\\0368N\\\\247MJAH\\\\371\\\\354\\\\213\\\\347\\\\373\\\\326O'\\\\263\\\\241\\\\033\\\\267m\\\\247\\\\030% d6\\\\0161##\012\\\\205H\\\\220\\\\020\\\\031\\\\211D\\\\26699r\\\\2741R:\\\\356$)\\\\031\\\\245\\\\205V\\\\221\\\\251\\\\355\\\\273o\\\\276}qu{;\\\\014\\\\256\\\\231\\\\026B\\\\351\\\\301\\\\217\\\\304\\\\204\\\\022R\\\\214\\\\002\\\\2203a.%\\\\216\\\\001Sd\042`\\\\221\\\\371\\\\364\\\\022\\\\3561\\\\311 \\\\230\\\\264\\\\325\\\\3169\\\\021cYU7\\\\353\\\\315\\\\346\\\\320V\\\\263Y\\\\237\\\\370n\\\\2735C?\\\\251M\\\\222\\\\352\\\\333w\\\\327X_L\\\\236\\\\204$u\\\\357\\\\343\\\\325\\\\335\\\\353\\\\253\\\\333\\\\233\\\\313G\\\\017\\\\252\\\\302\\\\254\\\\327k+\\\\307\\\\371d\\\\251\\\\222wui\\\\264\\\\004\\\\240 \\\\2048;[H!noo\\\\347\\\\363\\\\251R\012\\\\031\\\\230\\\\251\\\\357\\\\373\\\\224\\\\3220\\\\014\\\\3438\\\\346\\\\004+\\\\303\\\\257\\\\306qL\\\\300\\\\223\\\\311$/\\\\323Z\\\\353\\\\345r)\\\\020\\\\004\\\\340\\\\315\\\\315U\\\\337\\\\367\\\\363\\\\371\\\\374\\\\260?<\\\\377\\\\356w\\\\354\\\\241\\\\355\\\\207\\\\301\\\\030\\\\363\\\\374\\\\371s\\\\255\\\\355\\\\267\\\\337~{qq1\\\\216=\042JuD$#\\\\013\\\\224\\\\362\\\\362\\\\341\\\\027m\\\\3371\\\\243s\\\\216\\\\231\\\\273\\\\256\\\\3130\\\\235/\\\\277\\\\374r\\\\034\\\\307\\\\214K,\\\\313\\\\362\\\\263\\\\317>\\\\253\\\\353z\\\\322\\\\324o_\\\\276\\\\230L\\\\312\\\\262\\\\254\\\\205\\\\020\\\\316\\\\271\\\\224\\\\222s.\\\\306\\\\030R\\\\232Dkm\\\\011\\\\000jZ\\\\227e\\\\231\\\\277\\\\376\\\\344\\\\321\\\\343~\\\\034\\\\272\\\\256\\\\013!h\\\\255\\\\353\\\\2620\\\\332\012\\\\211\\\\363\\\\331\\\\202\\\\201\\\\202\\\\217]\\\\337\\\\366\\\\335 $N\\\\247\\\\323\\\\331l\\\\342\\\\372.c\\\\240\\\\273\\\\256\\\\033G_\\\\226\\\\2451\\\\246p\\\\346\\\\213/\\\\276\\\\2101\\\\256W\\\\333\\\\315f\\\\323u\\\\207\\\\314\\\\361\\\\231M.\\\\302\\\\030b\\\\010\\\\321Gi\\\\225QV\\\\010\\\\341 p\\\\342\\\\305lQ\\\\226\\\\245\\\\326v\\\\034G\\\\347\\\\034\\\\020\\\\027E\\\\225\\\\373j]\\\\327e8\\\\177\\\\2024\\\\014\\\\207\\\\303>H)\\\\275\\\\213\\\\266\\\\320H8\\\\014\\\\335~\\\\035\\\\205\\\\020\\\\022\\\\021\\\\000\\\\264\\\\234\\\\2721\\\\356v\\\\273C\\\\337\\\\215\\\\336)c\\\\312\\\\262.\\\\353\\\\252*\\\\033QI!D\\\\251m\0121C\\\\235\\\\244\\\\202o_\\\\\\\\M\\\\347\\\\223zb\\\\226g\\\\313\\\\353\\\\315\\\\333\\\\317\\\\036<\\\\252\\\\372\\\\341\\\\372\\\\315\\\\025\\\\244\\\\3101\\\\013'\\\\035e\\\\372\\\\031\\\\005\\\\000$J\\\\231\\\\315\\\\231E\\\\262\\\\356\\\\245\\\\227c\\\\214\\\\000\\\\224m\\\\311\\\\023\\\\260\\\\363~\\\\265Y;\\\\347\\\\336\\\\337\\\\336\\\\021\\\\201*KO\\\\014!(\\\\253\\\\000e\\\\010\\\\356\\\\310k\\\\346D\\\\0249\\\\005N\\\\004\\\\211\\\\230(\\\\241@\\\\316\\\\036\\\\307\\\\010\\\\304(\\\\362_\\\\200\\\\002\\\\204\\\\200\\\\262\\\\251uYu\\\\316o\\\\272v}\\\\350X\\\\310\\\\345\\\\305\\\\243\\\\315n\\\\015\\\\272\\\\260\\\\272\\\\352I\\\\230\\\\351\\\\362\\\\374\\\\311gW\\\\203\\\\370\\\\273\\\\177\\\\370\\\\007\\\\331\\\\324\\\\304|ss\\\\323\\\\367Ci\\\\033\042\\\\336\\\\256\\\\366\\\\212)I!J[\\\\230\\\\345\\\\031\\\\235d\\\\273\\\\244\\\\304\\\\365zm\\\\214)\\\\313:\\\\367\\\\303l\\\\241\\\\212\\\\262\\\\366\\\\336\\\\207\\\\350\\\\234s\\\\267\\\\327W\\\\335\\\\320\\\\247\\\\304\\\\263\\\\331\\\\254\\\\253j\\\\000P(6w\\\\253\\\\340]]\\\\327\\\\363\\\\351\\\\354\\\\354\\\\354l6\\\\231x?\\\\216a|\\\\375\\\\372\\\\345~\\\\337\\\\326\\\\223\\\\3069\\\\367\\\\352\\\\315\\\\353\\\\311d&\\\\224\\\\\\\\m\\\\356\\\\216|\\\\273\\\\302\\\\030%9\\\\005\\\\211Bj\\\\265\\\\335\\\\255\\\\017]\\\\213 \\\\225R\\\\313\\\\345\\\\262\\\\264F)\\\\011\\\\000R`i\\\\0153f\\\\242\\\\3360\\\\014\\\\2677\\\\355f-\\\\352\\\\302\\\\004?\\\\246\\\\350\\\\235s\\\\207\\\\266_\\\\257\\\\327Y\\\\326,O\\\\263\\\\351|yz\\\\037\\\\322\\\\030U\\\\024\\\\006\\\\004\\\\032\\\\255\\\\230RYXD\\\\224\\\\022\\\\001\\\\204\\\\224\\\\330wmQ\\\\230\\\\252,\012\\\\253&u#\\\\0044U]\\\\325\\\\305\\\\240d\\\\366\\\\343A\\\\224\\\\306\\\\230\\\\242(\\\\232z\\\\212S|\\\\373\\\\346}.\\\\021^\\\\\\\\\\\\\\\\L&\\\\223a\\\\030\\\\016\\\\333C\\\\212\\\\374\\\\360\\\\341\\\\243\\\\334\\\\266,\\\\212\042_j\\\\325\\\\260)l\\\\323Ls\\\\202.\\\\2652\\\\2055\\\\3060\\\\222s\\\\275\\\\001\\\\026\\\\302\\\\333RH\\\\011 EQ\\\\225\\\\200\\\\225\\\\224R\\\\011%\\\\225\\\\220,\\\\206\\\\261\\\\036\\\\373\\\\201\\\\210$`J \\\\320H]\\\\232\\\\262:c\\\\006\\\\000]XkuF\\\\314y\\\\357s\\\\256\\\\002 \\\\312\\\\302\\\\022\\\\221\\\\020PT\\\\326V\\\\345\\\\276s\\\\233\\\\027o\\\\377\\\\331\\\\037\\\\375\\\\027?\\\\372\\\\321\\\\217o\\\\337__\\\\275\\\\277U\\\\214(\\\\002\\\\244$\\\\230\\\\204\\\\000\\\\220p\\\\344U\\\\304\\\\361\\\\270\\\\027\\\\314\\\\302\\\\324,\\\\356%\\\\3402|\\\\230\\\\211B\012\\\\314\\\\314\\\\333t8\\\\034RJ\\\\306\\\\226B\012\\\\027\042cR\\\\306\\\\010\\\\2011\\\\305\\\\254\\\\252\\\\312\\\\234\\\\230\\\\002\\\\247\\\\010\\\\024!\\\\245\\\\254\\\\321@\\\\014\\\\014\\\\307b\\\\013\\\\000I`FL\\\\301/\\\\036<\\\\344q\\\\267;\\\\354\\\\237|\\\\366t\\\\214\\\\374\\\\263_\\\\374*I\\\\275o{\\\\324\\\\3660\\\\270~\\\\333_\\\\\\\\>\\\\216\\\\322|\\\\373\\\\376\\\\372\\\\2337o=\\\\300~\\\\265\\\\356\\\\3758\\\\233M\\\\204\\\\020\\\\253\\\\333;\\\\315\\\\345lz\\\\246\\\\2141\\\\353\\\\365]\\\\327u\\\\213\\\\305\\\\242(\\\\015\\\\021\\\\031\\\\243\\\\346\\\\363y\\\\026_\\\\314\\\\214\\\\272\\\\340\\\\223\\\\217!;\\\\222\\\\326u\\\\275X,\\\\372n<\\\\027\\\\347\\\\233\\\\315.\\\\244\\\\370\\\\3657_\\\\265m\\\\373\\\\275/\\\\277\\\\357\\\\374\\\\330\\\\356\\\\017D\\\\361\\\\342\\\\354\\\\274(\\\\215\\\\026\\\\362\\\\372\\\\372z\\\\263;$\\\\246\\\\266\\\\355\\\\337\\\\337^{\\\\027B\\\\010y\\\\3037\\\\233\\\\315\\\\244\\\\022!x!\\\\331\\\\010\\\\023\\\\202K\\\\210\042\\\\211\\\\242*\\\\353\\\\311CN\\\\264;\\\\354S\\\\210RI\\\\253\\\\015#\\\\274~\\\\371J[#\\\\000A\\\\340n\\\\263'\\\\340\\\\302\\\\330\\\\305b\\\\026(y?\\\\032\\\\251\\\\022B5i\042\\\\262D\\\\241\\\\214.\\\\212\\\\342\\\\352\\\\352j\\\\364\\\\256\\\\254\\\\253\\\\034\\\\236CL\\\\205\\\\261\\\\335\\\\341P\\\\024\\\\305|:+\012\\\\323\\\\367}\\\\010\\\\001(YS\\\\224e)\\\\004 pb2\\\\202\\\\231y8\\\\354\\\\273\\\\303\\\\316\\\\224E\\\\337\\\\367\\\\3169\\\\357}\\\\316\\\\354S\\\\344\\\\3146]\\\\257\\\\327\\\\353\\\\365:\\\\337KQT\\\\202AJ\\\\351\\\\234\\\\013\\\\224\\\\214T \\\\261\\\\357\\\\273}\\\\327\\\\346\\\\207\\\\266=l\\\\230Y)\\\\215\\\\010\\\\201BtAF\\\\005\\\\0240\\\\221\\\\326\\\\022@\\\\364nH)I\\\\255\\\\004\\\\252\\\\\\\\\\\\314\\\\241\\\\224\\\\224RViSXd\\\\200D\\\\375\\\\030\\\\212\\\\252r!\012\\\\205\\\\211\\\\331Z\\\\2338\\\\206\\\\350\\\\272\\\\376\\\\360\\\\350\\\\321#\\\\024\\\\311{O\\\\354\\\\265\\\\326\\\\265\\\\321\\\\034\\\\331\\\\205\\\\240\\\\265ea/.\\\\317\\\\027\\\\027\\\\017\\\\233\\\\371r\\\\360d\\\\253\\\\311gO?\\\\177\\\\363\\\\365W\\\\222\\\\223\\\\000bH\\\\304\\\\211\\\\003\\\\207D\\\\211\\\\2174\\\\374,\\\\231\\\\304\\\\304\\\\004)\\\\233rd\012\\\\002\\\\037\\\\215\\\\2648\\\\313\\\\276\\\\371DV\\\\333\\\\014\\\\242\\\\025J\\\\022@\\\\244$\\\\021\\\\224\\\\2211\\\\004\\\\301\\\\211S\042\\\\212\\\\304\\\\021\\\\210\\\\005\\\\303Qo\\\\005\\\\2209\\\\233 \\\\203\\\\004\\\\004)P\\\\212f2\\\\003\\\\244\\\\262,\\\\200\\\\023(\\\\271\\\\336\\\\037nw\\\\273\\\\326q?\\\\246\\\\331r1\\\\206\\\\326\\\\224\\\\323\\\\317\\\\276\\\\363]G\\\\370\\\\323\\\\237\\\\375\\\\374\\\\020\\\\240\\\\015<YLu\\\\255\\\\267\\\\273\\\\365\\\\260o\\\\265,\\\\302\\\\030^\\\\275x\\\\241\\\\212\\\\302\\\\344\\\\202@3\\\\251\\\\352\\\\272v\\\\316%\\\\216\\\\273\\\\375\\\\216\\\\022\\\\244\\\\224\\\\352:Yk\\\\275\\\\217\\\\2148\\\\251kel\\\\327\\\\355$B\\\\014N[SU\\\\005\\\\000\\\\230\\\\263\\\\245R\\\\252\\\\353\\\\206G\\\\017/'\\\\317\\\\237\\\\217\\\\343\\\\210\\\\314\\\\267\\\\267\\\\327,d\\\\323T$q\\\\364\\\\203-\\\\315\\\\223O\\\\037K\\\\251\\\\337\\\\276\\\\177\\\\337\\\\367}\\\\325\\\\324\\\\355\\\\320\\\\315\\\\247S)Q\\\\033i\\\\214J$8Q\\\\214\\\\341p\\\\3236\\\\263\\\\251Bq\\\\330m\\\\307C\\\\227\\\\200\\\\027\\\\323Y=\\\\235<\\\\274<\\\\027ZqL\\\\322\\\\350\\\\312\\\\330\\\\220R\\\\273\\\\337\\\\257V+iu\\\\240Ph\\\\023(UU\\\\303JKc\\\\022\\\\363\\\\266\\\\033_\\\\275\\\\277\\\\321Z/\\\\316\\\\317\\\\036?z\\\\022\\\\263\\\\343]\\\\242\\\\351t:\\\\366\\\\335j\\\\267\\\\235LjD\\\\254\\\\212\0428\\\\017\\\\224\\\\242w\\\\200\\\\024\\\\0039?\\\\344\\\\304F0D&\\\\034\\\\207\\\\230\\\\230\\\\231}H\\\\3030v\\\\375\\\\330\\\\265\\\\216\\\\231?\\\\377\\\\374\\\\363\\\\242\\\\250f3\\\\016!\\\\264m\\\\337\\\\367\\\\256(\012\\\\255UL\\\\243P(\\\\244\\\\241\\\\030\\\\234\\\\037\\\\003\\\\215\\\\306\\\\030T\\\\321V\\\\242\\\\357\\\\373\\\\301\\\\217\\\\314\\\\311\\\\373\\\\210\\\\310M3\\\\255&E\012\\\\261\\\\037CJ\\\\021@\\\\204\\\\010\\\\203\\\\213Z\\\\313\\\\262\\\\254\\\\333C7\\\\366\\\\2431\\\\246*%\\\\244\\\\243\\\\377X\\\\214\\\\270>l\\\\0077*%\\\\274\\\\367\\\\313\\\\3452q\\\\254\\\\312Rh\\\\265\\\\332^\\\\003@\\\\364!o\\\\246\\\\265\\\\326\\\\034S7\\\\004\\\\222\\\\325\\\\372\\\\366p~!\\\\276\\\\377\\\\243O\\\\207\\\\030\\\\333\\\\336\\\\271\\\\256_\\\\2556}\\\\337[N\\\\006Hp\\\\214)d;\\\\240\\\\223L,\\\\023`\\\\002f\\\\302\\\\304\\\\224u\\\\373|\\\\212\\\\031\\\\256\\\\235Y\\\\032\\\\221\\\\310jmK!A\\\\271\\\\030\\\\230@*%%\\\\204\\\\024#E\\\\011\\\\020\\\\243\\\\027\\\\2240\\\\021\\\\307\\\\000\\\\211\\\\200\\\\351\\\\250#\\\\233\\\\325hS \\\\004\\\\005(%\\\\242\\\\022(\\\\304|>\\\\215}[L\\\\013%q\\\\267\\\\333_\\\\357\\\\2350\\\\246\\\\333\\\\267E5o;\\\\007\\\\022\\\\036?{rv\\\\371\\\\270\\\\015\\\\361\\\\325\\\\325\\\\032M\\\\025\\\\244Y\\\\275y\\\\213\0420\\\\2440\\\\370\\\\333\\\\315\\\\332\\\\267Q\\\\313B\\\\205\\\\350\\\\246\\\\263FHp\\\\3169\\\\347\\\\224\\\\326M\\\\323\\\\214\\\\306\\\\017\\\\203\\\\363)\\\\010\\\\357\\\\010D\\\\337\\\\367\\\\214 \\\\224\\\\254eqyyY\\\\024&1d\\\\332\\\\343v\\\\277\\\\033\\\\206\\\\201\\\\200\\\\337\\\\275y{{{]\\\\226\\\\345r\\\\271\\\\374\\\\316\\\\363/\\\\3060\042\\\\261\\\\255\\\\316\\\\213\\\\256\\\\355\\\\235O>\\\\214\\\\301Ol\\\\371\\\\370\\\\361\\\\3437o\\\\336\\\\254V\\\\253\\\\375~\\\\237R\\\\022@(X)\\\\345B\\\\204\\\\014|\\\\021\\\\312\\\\271\\\\000\\\\326.\\\\227\\\\347M\\\\323t]gtQ\\\\225\\\\315v\\\\273\\\\235\\\\326%)\\\\362\\\\336ov;\\\\245TY\\\\327\\\\323\\\\371,\\\\244\\\\350b`\\\\346q\\\\267#FSVuY\\\\217\\\\336KM\\\\363\\\\345\\\\231\\\\2242E\\\\332\\\\356w\\\\336{\\\\000\\\\020D\\\\253\\\\030\\\\253\\\\242\\\\254\012\\\\223\\\\363\\\\204q\\\\034\\\\333\\\\266UJ\\\\245\\\\350sqc\\\\030\\\\206a\\\\030\\\\210\\\\222B\\\\011R\\\\250\\\\242,\\\\312\\\\272\\\\252*\\\\255\\\\365=]\\\\327{\\\\337\\\\266\\\\255\\\\013cY\\\\226e]\\\\215\\\\375\\\\000\\\\002\\\\253\\\\242\\\\004\\\\201*\\\\343\\\\357P\\\\022%\\\\251\\\\325\\\\324N\\\\245VR)F\\\\270\\\\271\\\\273\\\\275\\\\271\\\\271\\\\021\\\\002\\\\233f2\\\\237\\\\317\\\\244F\\\\2555\\\\020\\\\336\\\\\\\\\\\\257c\\\\214\\\\213\\\\305\\\\231\\\\020\\\\342\\\\260\\\\333\\\\027E:[\\\\236\\\\317g\\\\213\\\\303\\\\341 Q\\\\000\\\\300f\\\\275\\\\356\\\\373\\\\2564V)\\\\265X,\\\\313\\\\261\\\\027\\\\032\\\\257\\\\257\\\\337ow\\\\267\\\\253\\\\365m]\\\\327)\\\\245\\\\307\\\\017\\\\2374\\\\365D\\\\326\\\\3150\\\\014!\\\\004\\\\245\\\\024jM\\\\322F9{v\\\\271X,/\\\\336\\\\276\\\\277y\\\\372\\\\364\\\\351\\\\330\\\\367\\\\335v\\\\367\\\\342\\\\233\\\\257E\\\\030@K\\\\241\\\\204`\0121\\\\204\\\\224X\\\\011%\\\\225\\\\033Gf\\\\316\\\\032yG>20\\\\000H)\\\\211\\\\222\\\\224B\\\\312\\\\014<\\\\214\\\\314\\\\014\\\\200\\\\011\\\\342}\\\\222\\\\235Mws\\\\205\\\\200\\\\023\\\\011J\\\\202\\\\022\\\\020!\\\\223\\\\000\\\\022\\\\014\\\\031\\\\272\\\\013\\\\304\\\\214\\\\022N\\\\202\\\\206R\\\\242P\042z\\\\327L\012\\\\201\\\\350}\\\\244\\\\204\\\\337\\\\274\\\\177\\\\277\\\\353FUUm\\\\210\\\\246(~\\\\360\\\\243\\\\177z\\\\361\\\\370\\\\301\\\\267\\\\357\\\\357:O\\\\272\\\\230\\\\313r2\\\\264\\\\3550\\\\214>\\\\014}\\\\277\\\\027\\\\304\\\\212uQ\\\\032-\\\\225\\\\374\\\\341\\\\357=QR*#\\\\001\\\\201\\\\010\\\\306\\\\321w\\\\335(\\\\265\\\\265E\\\\025\\\\022im\\\\245\\\\325\\\\243wBIe\\\\344\\\\325\\\\315\\\\325\\\\345\\\\345eU\\\\326\\\\323\\\\331\\\\314Z\\\\253\\\\264\\\\\\\\\\\\3576\\\\306X\\\\220\\\\342\\\\321\\\\303\\\\207\\\\3750Tuus{{}{s}s\\\\373\\\\376\\\\346\\\\206\\\\001#s\\\\327\\\\217J\\\\351f:\\\\325F\\\\373\\\\340\\\\001\\\\341\\\\374\\\\342\\\\334\\\\026\\\\305\\\\241m\\\\245T\\\\214\\\\362n\\\\265!\\\\224\\\\365dF(\\\\317\\\\316/\\\\001\\\\245\\\\367\\\\221\\\\010BHD\\\\320v\\\\375\\\\325\\\\365\\\\315\\\\350|\\\\333\\\\365\\\\333\\\\335n\\\\273\\\\333\\\\003b\042\\\\316-\\\\324al\\\\231Ra\012c\\\\355\\\\320\\\\217L,@\\\\306\\\\020\\\\203\\\\017\\\\317\\\\236>\\\\2738?SR\\\\372\\\\276\\\\357\\\\333]w\\\\330sp77\\\\327\\\\312\\\\250\\\\262,o\\\\356n\\\\367\\\\207\\\\203)l\\\\325\\\\324eU%\\\\006m\\\\013\\\\020\\\\262\\\\033\\\\306f:\\\\335\\\\267\\\\207f6\\\\217\\\\304\\\\315t2\\\\231N\\\\022\\\\245\\\\267\\\\357\\\\336Vu5\\\\235M\\\\356Vw\\\\2660\\\\327\\\\327\\\\327!\\\\371a\\\\030\\\\\\\\p\\\\233\\\\315z\\\\364\\\\243s\\\\243\\\\326J\\\\353\\\\342\\\\366vmT\\\\351}r.N&s\\\\357B\\\\327\\\\016\\\\3369&\\\\2304\\\\323I\\\\323|\\\\376\\\\354\\\\213\\\\371l\\\\326\\\\324\\\\215\\\\224\\\\022A\\\\030m\\\\213\\\\242\\\\350\\\\372=Q|\\\\364\\\\350\\\\301l\\\\332x\\\\337Y+\\\\253\\\\3128\\\\337\\\\316\\\\346\\\\365b9\\\\271x8W\\\\026\\\\225\\\\226\\\\313\\\\331Y\\\\212$\\\\200\\\\232\\\\332F\\\\267\\\\327\\\\222\\\\233\\\\302N\\\\353\\\\011\\\\005n\\\\312\\\\305v\\\\3352\\\\353\\\\311\\\\364\\\\254\\\\033\\\\334z\\\\263\\\\273kG\\\\207\\\\315\\\\362\\\\341SbQ\\\\025\\\\205 \\\\322L\\\\377\\\\356O\\\\377DD\\\\267_]\\\\005?\\\\246\\\\344{7\\\\202\\\\326\\\\250u7\\\\270\\\\301\\\\307\\\\220b\\\\310l*\\\\246\\\\230\\\\002\0120Z&\\\\212B\\\\010k\\\\264\\\\321\012\\\\205\\\\024Bd\\\\203\\\\023\\\\201\\\\210DY4V\\\\010`\\\\026\\\\000L\\\\211\\\\230AJ\\\\205\\\\314\\\\024#\\\\247 \\\\230$\\\\202D\\\\020\\\\002\\\\002')\\\\204\\\\021R\\\\002\012\\\\251\\\\225\\\\321\\\\250\\\\221!<\\\\274\\\\\\\\4\\\\2459\\\\237\\\\316\\\\027\\\\263\\\\305\\\\335\\\\266\\\\177{\\\\273m\\\\011\\\\017\\\\011\\\\242.\\\\237|\\\\361e\\\\263\\\\270\\\\274\\\\336v\\\\333.\\\\262(]\\\\302\\\\325j\\\\275\\\\331\\\\356\\\\207at\\\\303\\\\230+'\\\\200H\\\\234\\\\\\\\\\\\034\\\\345\\\\323OfJ\\\\013)\\\\204\\\\017\\\\001Q\\\\316f\\\\363\\\\242(\\\\373a|\\\\365\\\\352\\\\315\\\\247\\\\237}\\\\332\\\\266\\\\255P\\\\262i\\\\232\\\\353\\\\333+\\\\342\\\\330\\\\324ui\\\\355t6\\\\333\\\\356w\\\\277\\\\371\\\\352\\\\267\\\\357\\\\336\\\\277'\042\\\\224r\\\\265ZiclQH\\\\245@\\\\340\\\\243'\\\\217/./\\\\2452\\\\357\\\\336_\\\\035\\\\016\\\\3550\\\\016RH\\\\245\\\\265\\\\226\\\\352\\\\374\\\\342\\\\\\\\\\\\000\\\\376\\\\355\\\\317\\\\177.@\\\\020\\\\223\\\\222*1{\\\\347\\\\011\\\\3309\\\\277Z\\\\257\\\\275\\\\363\\\\3030\\\\206\\\\020G\\\\347\\\\332\\\\266;\\\\264\\\\355\\\\350\\\\\\\\\042r\\\\316\\\\307\\\\224|\\\\0101&)\\\\225\\\\261\\\\266\\\\252\\\\352\\\\331t\\\\252\\\\265\\\\030\\\\3726\\\\245T\\\\026\\\\025%\\\\272\\\\275\\\\275\\\\353\\\\373\\\\241,\\\\352\\\\024S\\\\333\\\\036Vw\\\\267Z\\\\210\\\\347\\\\237?\\\\375\\\\342\\\\363\\\\247MU\\\\000\\\\323\\\\017\\\\177\\\\370\\\\243\\\\242(la\\\\353\\\\2466\\\\326\\\\206\\\\030B\\\\014u\\\\323\\\\214\\\\316%J\\\\30382\\\\300\\\\350F\\\\037B3i\\\\232I\\\\003\\\\000\\\\253\\\\325\\\\212\\\\211\\\\312\\\\252\\\\242\\\\224\\\\366\\\\207\\\\303n\\\\273\\\\275\\\\276\\\\271\\\\201\\\\243&b\\\\324F[k\\\\026\\\\313E\\\\323TUY{\\\\037\\\\356nW\\\\300\\\\034B\\\\014>\\\\020\\\\323\\\\320\\\\015\\\\304$Q\\\\242\\\\310\\\\340x\\\\336mv\\\\303\\\\330\\\\247\\\\020\\\\021\\\\300\\\\373\\\\220R\\\\234M\\\\232\\\\263\\\\363\\\\345d\\\\322\\\\214c\\\\277\\\\337o\\\\245\\\\222\\\\336\\\\365\\\\332*\\\\245\\\\321X\\\\025\\\\323\\\\330\\\\217\\\\235R\\\\\\\\W\\\\225\\\\357Ct>\\\\221C`\\\\251\\\\300\\\\030m\\\\215\\\\265\\\\312v\\\\007'@i]jS\\\\205\\\\220\\\\016\\\\3038\\\\304\\\\344\\\\222j\\\\226O\\\\010\\\\355\\\\305b!\\\\220\\\\033c\\\\276\\\\371\\\\207\\\\277\\\\337^_\\\\355\\\\327\\\\267H)\\\\3721\\\\2040\\\\006\\\\357|l\\\\3071&\\\\232\\\\316g\\\\306X\\\\241\\\\204\\\\322F\\\\352\\\\243\\\\216\\\\277\\\\224\\\\210\\\\230+!Y\\\\025\\\\026\\\\216@\\\\246\\\\243 '@\\\\346\\\\263\\\\341\\\\321\\\\0253CD$\\\\000\\\\245\\\\310)!\\\\223`\\\\026G\\\\363\\\\015f)\\\\004\042F\\\\006\\\\000\\\\251dU\\\\225\\\\325\\\\264\\\\252\\\\353\\\\202\\\\311W\\\\266hl)d\\\\361\\\\017_\\\\277\\\\376\\\\315\\\\353w\\\\242\\\\236n\\\\306\\\\360\\\\345\\\\217\\\\377\\\\211\\\\256gc\\\\240v\\\\014cd\\\\227\\\\250\\\\353\\\\306}\\\\327\\\\001aJ\\\\221(ep`\\\\306\\\\207\\\\020\\\\223Z.f\\\\304X\\\\226\\\\365\\\\331\\\\362\\\\302\\\\373\\\\304 \\\\204Pe]\\\\307\\\\030\\\\177\\\\376\\\\363\\\\237\\\\327u\\\\335\\\\276>\\\\000\\\\300d>\\\\271z\\\\367~6\\\\237\\\\024J\\\\027\\\\332l6\\\\033?\\\\214\\\\321\\\\371f>W\\\\010\\\\205V\\\\207\\\\355\\\\346\\\\374\\\\374\\\\\\\\J\\\\241\\\\252\\\\022R\\\\354\\\\307\\\\0019\\\\011\\\\240\\\\303n\\\\227\\\\2009x\\\\024\\\\234\\\\334xv\\\\276xpq\\\\026\\\\374\\\\330\\\\356\\\\331\\\\226%P\\\\362\\\\301+\\\\201J\\\\010NQ\\\\000\\\\217n\\\\250\\\\313\\\\252\\\\256+!D\\\\316\\\\007\\\\356u,sW\\\\005\\\\000b\\\\360\\\\336\\\\215\\\\336\\\\215\\\\301\\\\017\\\\301\\\\367\\\\306\\\\030)\\\\344\\\\320\\\\365\\\\321\\\\007\\\\253tJ\\\\324\\\\267\\\\373\\\\276\\\\357\\\\353\\\\272\\\\256\\\\213\\\\2620\\\\326\\\\217\\\\216cPB.\\\\027\\\\363\\\\233\\\\253\\\\367\\\\210\\\\230\\\\353\\\\337\\\\326\\\\332iS\\\\217\\\\343x\\\\330m)F\042\\\\222\\\\210\\\\315\\\\244Y\\\\257\\\\327\\\\205\\\\321F\\\\311\\\\252\\\\260EQ\\\\314f\\\\0237\\\\214\\\\243wH\\\\330,\\\\347\\\\317>\\\\375d\\\\337\\\\036\\\\374\\\\350F\\\\357\\\\272C\\\\253\\\\225\\\\230Og\\\\363\\\\345b\\\\267\\\\331\\\\336\\\\336\\\\\\\\Q\\\\202\\\\303~'\\\\231\\\\213\\\\272\\\\202D\\\\335a\\\\217\\\\314\\\\365\\\\264\\\\256\\\\013\\\\353v\\\\335\\\\320\\\\036l]\\\\244\\\\024\\\\247\\\\223Ei\\\\254\\\\000\\\\236L\\\\232\\\\252\\\\252\\\\312\\\\242p\\\\3363\\\\363b6\\\\325Z?x\\\\374\\\\340\\\\352\\\\355\\\\273\\\\315~w{w\\\\333[\\\\373\\\\331\\\\323O\\\\036\\\\226\\\\017\\\\013k\\\\343\\\\030\\\\227\\\\365YY\\\\226\\\\2460\\\\322h\\\\037\\\\335\\\\315\\\\315\\\\325\\\\313\\\\227\\\\257\\\\267\\\\353\\\\315\\\\263g\\\\027\\\\343\\\\020\\\\337\\\\276}w\\\\350}\\\\275X^o\\\\366\\\\353\\\\266\\\\377\\\\316\\\\367~\\\\304\\\\214\\\\276\\\\357\\\\020\\\\316\\\\255T\\\\355a\\\\367\\\\342\\\\353\\\\257\\\\275\\\\037cp2\\\\003\\\\262\\\\201X {\\\\357\\\\022\\\\225ee\\\\255-\012\\\\353\\\\375\\\\230b$\042\\\\244c\\\\345#\\\\353\\\\336gx4\\\\035\\\\345\\\\252\\\\263M\\\\302\\\\007\042\\\\036\\\\021\\\\361\\\\221c\\\\312\\\\037X<'\\\\217\\\\261{\\\\036\\\\237\\\\026\\\\222\\\\031\\\\011\\\\230\\\\210\\\\005S\\\\240dRD%&\\\\365\\\\344\\\\335\\\\273w\\\\317\\\\376\\\\371\\\\363\\\\333\\\\365\\\\341f\\\\177\\\\250f\\\\213C\\\\204\\\\357|\\\\371\\\\203f2\\\\333\\\\367c\\\\327\\\\016\\\\331\\\\222<$\\\\362.%J\\\\0112\\\\377\\\\215\\\\217BqH\\\\220\\\\022sTY\\\\255\\\\202\042\\\\317\\\\027VJ$bd\\\\342\\\\224\\\\336\\\\275~#\\\\021\\\\333\\\\375\\\\276\\\\236T\\\\237}\\\\372\\\\251\\\\324b\\\\034\\\\027\\\\363\\\\371\\\\374\\\\356\\\\375\\\\355\\\\337\\\\337\\\\336um\\\\373\\\\350\\\\361\\\\343\\\\363\\\\2633@<\\\\354\\\\367UU]\\\\234\\\\237\\\\033k\\\\373\\\\256\\\\333\\\\354\\\\326\\\\224\\\\222)t\\\\014^\012x\\\\376\\\\371S\042\\\\322\\\\312>x\\\\360 \\\\204\\\\320\\\\357\\\\016eY^\\\\314\\\\227wwwF\\\\3511D\042\\\\322U\\\\225-0\\\\246\\\\315\\\\304Z[\\\\226v6\\\\231O\\\\347\\\\223\\\\322V\\\\221B\\\\337\\\\016\\\\375\\\\330ii\\\\224\\\\221\\\\234 $\\\\317\\\\011\\\\\\\\\\\\030)\\\\262\\\\2248\\\\271<[,\\\\347\\\\353\\\\325\\\\346W\\\\277\\\\371\\\\355~\\\\327\012\\\\245\\\\231\\\\240\\\\335\\\\357Rb7\\\\364\\\\326\\\\350\\\\316\\\\250\\\\261\\\\335Y\\\\253\\\\263\\\\262\\\\370\\\\330w\\\\313\\\\345\\\\262\\\\262\\\\305\\\\376\\\\260\\\\223\\\\200\\\\305t\\\\322\\\\355\\\\017o\\\\336\\\\274B\\\\020\\\\304i6\\\\235G\\\\357\\\\372C+\\\\225\\\\320BJ\\\\204\\\\027_\\\\177\\\\363\\\\343\\\\337\\\\377\\\\021U\\\\215\\\\220X\\\\026U\\\\327\\\\267)\\\\022\\\\3050\\\\020 \\\\223C\\\\0011R\\\\210\\\\034\\\\302\\\\330\\\\365\\\\273\\\\365\012\\\\010\\\\317f\\\\315\\\\263g\\\\237I)\\\\337\\\\275{\\\\327u\\\\335t\\\\326|\\\\372\\\\350\\\\241\\\\224b\\\\350\\\\017\\\\243\\\\222\\\\032@\\\\030\\\\251\\\\001\\\\242w\\\\233\\\\303\\\\341:]=\\\\177\\\\376\\\\374|>o\\\\232\\\\232\\\\2317\\\\233\\\\325\\\\353\\\\227/n\\\\256\\\\336\\\\237\\\\237\\\\237\\\\013\\\\006-\\\\244\\\\037\\\\306n\\\\177H>L\\\\036>\\\\234\\\\314\\\\233G\\\\347gJ\\\\232C?\\\\264]_\\\\327\\\\365\\\\323\\\\317\\\\277|\\\\372\\\\331w\\\\224\\\\224C\\\\3339\\\\027\\\\232z\\\\356\042\\\\266\\\\221W\\\\255\\\\373\\\\353\\\\277\\\\373\\\\365\\\\2537\\\\327\\\\005\\\\273\\\\363\\\\007\\\\013\\\\337wU]\\\\274}\\\\371\\\\262\\\\357\\\\016\\\\276;\\\\010\\\\201\\\\024<s\\\\222R\\\\262\\\\300\\\\2308Q\\\\030\\\\307\\\\241\\\\353\\\\332\\\\351t\042\\\\204p\\\\303\\\\2300H\\\\251b\\\\364\\\\271\\\\303p\\\\252\\\\334!Q\\\\026_\\\\317\\\\212\\\\364Y\\\\001\\\\377h:\\\\300\\\\367b\\\\357\\\\300\\\\314I0eeq!\\\\024\\\\002g\\\\361\\\\364\\\\034RY\\\\202\\\\224\\\\002\\\\205H)\\\\205\\\\321q\\\\300T\\\\024\\\\213\\\\345\\\\305\\\\313\\\\367\\\\327\\\\253}\\\\357\\\\244\\\\222u\\\\371\\\\305'\\\\237\\\\223\\\\255n\\\\356\\\\326\\\\203\\\\217)1\\\\243LL\\\\336\\\\205\\\\004\\\\230\\\\333\\\\357Y\\\\263\012\\\\000\\\\000\\\\211R\\\\344\\\\024\\\\210HA\042\\\\205\042\\\\214\\\\356\\\\366\\\\346\\\\206\\\\011\\\\214)\\\\366\\\\273\\\\366\\\\253o\\\\276\\\\236N&(EQ\\\\024>\\\\371\\\\367o\\\\336\\\\242\\\\302\\\\007\\\\017.\\\\316\\\\347\\\\213g\\\\217?\\\\373\\\\365\\\\257~s\\\\330\\\\034\\\\016\\\\2736:\\\\217R\\\\270\\\\241?\\\\277\\\\274\\\\250\012\\\\373\\\\331\\\\263\\\\247UQ\\\\376\\\\365\\\\317\\\\376\\\\372\\\\356\\\\346n\\\\261xT\\\\333\\\\362\\\\362\\\\374\\\\354\\\\341\\\\303\\\\207!\\\\204\\\\365z[\\\\026\\\\246\\\\251\\\\313\\\\242(\\\\276\\\\374\\\\362\\\\313\\\\037\\\\375\\\\360\\\\367\\\\2141\\\\205\\\\2552B\\\\343\\\\330/d\\\\256\\\\353Z)\\\\305\\\\220$H\\\\241\\\\205U6A\\\\212.\\\\016~\\\\320B\\\\243B\0124\\\\370!\\\\371\\\\324\\\\016\\\\255\\\\353\\\\035\0423\\\\205\\\\213\\\\213\\\\213\\\\242(\\\\2630A7\\\\214\\\\207}\\\\307\\\\002\\\\235\\\\363\\\\314$\\\\221\\\\265\\\\226\\\\205\\\\261Ei\\\\244\\\\0241\\\\372\\\\014sC\\\\224}\\\\3372\\\\243\\\\224\\\\270\\\\333\\\\035\\\\372\\\\276m\\\\333\\\\276m\\\\367EQ\\\\275~\\\\375\\\\262\\\\264E\\\\010n1\\\\2371\\\\247\\\\037\\\\377\\\\350\\\\207\\\\213\\\\331\\\\364\\\\366vU\\\\330\\\\002\\\\230\\\\206\\\\256\\\\255\\\\353\\\\311\\\\305\\\\331\\\\362\\\\301\\\\017\\\\036=|xY\\\\327\\\\023)\\\\261m\\\\373\\\\272.\\\\255-\\\\233\\\\262*\\\\254\\\\355\\\\332^\\\\252\\\\243t\\\\013\\\\000\\\\214c\\\\317\\\\314\\\\357\\\\337\\\\277_}\\\\357;\\\\271\\\\305\\\\355\\\\234K\\\\024\\\\252\\\\252\\\\032\\\\206a\\\\277kg\\\\213\\\\345\\\\343\\\\207\\\\217\\\\316.\\\\316\\\\205\\\\020_}\\\\365\\\\033\\\\001T\\\\327uY\\\\226\\\\017\\\\037]\\\\002|1\\\\216\\\\243\\\\326\\\\272\\\\357\\\\373\\\\272l\\\\246u\\\\025\\\\343h\\\\255.+\\\\313RkU\\\\003\\\\210D.\\\\022M\\\\247\\\\323\\\\242(\042\\\\0111\\\\262\\\\026\\\\325/\\\\277\\\\371\\\\305/\\\\177\\\\371m3YX\\\\251\\\\037\\\\235/\\\\272\\\\335v\\\\335m\\\\257\\\\337\\\\276!\\\\357\\\\206\\\\366\\\\240\\\\020S\\\\010\\\\002P\\\\010\\\\341\\\\223\\\\317lW\\\\347\\\\207\\\\233\\\\233\\\\233\\\\345r\\\\251\\\\224\\\\022JF\\\\037\\\\010\\\\201E&\\\\222\\\\252\\\\334\\\\303\\\\217\\\\004\\\\210\\\\304\\\\314\\\\002dV\\\\310G\\\\011\\\\234\\\\013\\\\313\\\\247>\\\\366\\\\311f\\\\212\\\\201Y\\\\002J\\\\024\012r7%{\\\\230\\\\020#\\\\243\\\\024B+\\\\241\\\\245T(Q)\\\\344\\\\375\\\\266;\\\\177\\\\370\\\\350\\\\3537o_^\\\\255{6\\\\315\\\\362\\\\302\\\\324\\\\263W\\\\357o\\\\307,\\\\257\\\\314\\\\234\\\\022\\\\305H!\\\\021\\\\021x\\\\357\\\\305I\\\\277\\\\235\\\\2311\\\\027\\\\007SL)\\\\341\\\\377\\\\364?\\\\376\\\\017\\\\200r6[4M\\\\223\\\\022Gb\012\\\\264o{\\\\245\\\\324\\\\353\\\\267o~\\\\370\\\\303\\\\037\\\\216\\\\256\\\\377\\\\325\\\\257~\\\\225Yw!\\\\204\\\\331d\\\\356]\\\\034\\\\272nw8\\\\0047\\\\350\\\\302j\\\\201g\\\\227\\\\027Z\\\\310\\\\242)\\\\227\\\\263\\\\371\\\\276k'U\\\\375\\\\305\\\\227_\\\\034\\\\266\\\\207\\\\\\\\\\\\031\\\\230O\\\\347\\\\316\\\\271\\\\262,\\\\265\\\\326C\\\\3572\\\\2202\\\\0033\\\\210H\\\\010\\\\225\\\\001\\\\0251\\\\306\\\\272.\\\\231Y(\\\\251\\\\245\\\\022Jf\\\\204\\\\261D\\\\001\\\\002\\\\273C+\\\\224L!\\\\372\\\\030\\\\2008\\\\244\\\\230B\\\\224\012+k\\\\245\\\\000>\\\\0268\\\\205\\\\217\\\\021Q\\\\026U\\\\331\\\\267\\\\203\\\\224X\\\\226\\\\0269u]\\\\007L\\\\326j)\\\\2451fp\\\\275\\\\022:\\\\273\\\\300\\\\200\\\\340\\\\340\\\\2422r\\\\350\\\\306\\\\301\\\\365\\\\363\\\\351\\\\342\\\\333\\\\227\\\\337\\\\010\\\\220\\\\004\\\\351\\\\342\\\\3542\\\\004\\\\027B\\\\352\\\\373\\\\266\\\\357\\\\307\\\\351\\\\264\\\\351\\\\272!\\\\245pvv\\\\361\\\\366\\\\355\\\\353\\\\305\\\\342,F?\\\\014n6\\\\233\\\\314f\\\\213\\\\213\\\\213\\\\263\\\\276\\\\037\\\\273\\\\256\\\\253\\\\313J\\\\347\\\\302V\\\\364\\\\367\\\\010LDVJy\\\\357g\\\\263Y\\\\210\\\\216\\\\231\\\\207a\\\\230\\\\317\\\\347!\\\\245#\\\\300\\\\215\\\\200(\\\\026EE\\\\314\\\\301\\\\373\\\\331|\\\\276\\\\337\\\\357\\\\225R!\\\\004\\\\224\\\\2420\\\\266\\\\033z%$qL\\\\311\\\\033c\\\\023)\\\\347\\\\001QK\\\\245\\\\005 J\\\\244\\\\344\\\\372\\\\321\\\\011]\\\\354\\\\272\\\\360\\\\323\\\\277\\\\371\\\\325\\\\377\\\\367\\\\223\\\\277\\\\271\\\\272\\\\351///\\\\237?9{\\\\362h\\\\271_\\\\257\\\\336\\\\274\\\\372\\\\246\\\\335\\\\254\\\\372\\\\375f\\\\350\\\\017\\\\222\\\\011(e\\\\025\\\\202n\\\\034@H\\\\024\\\\242\\\\033\\\\235\\\\322\\\\372\\\\331\\\\263\\\\347gg\\\\347\\\\000<\\\\216c>#\\\\307\\\\244\\\\265\\\\316\\\\350\\\\334\\\\220\\\\370\\\\230J0\\\\247\\\\0141\\\\225'\\\\225\\\\235\\\\017\\\\022\\\\265\\\\204\\\\304\\\\020\\\\003p\\\\022)I\\\\006\\\\315G\\\\225dfFT\\\\201!!\\\\010\\\\015V\012+\\\\241\\\\022\\\\252P\\\\022\\\\021{\\\\342\\\\233~\\\\\\\\\\\\365\\\\241:\\\\177R\\\\316.w;7$F\\\\253=%\\\\347\\\\202\\\\013)\\\\357Bc$\\\\357}Q\\\\030ff&\\\\206\\\\3041\\\\020\\\\021\\\\245\\\\300\\\\314\\\\352\\\\305\\\\327/@\\\\212\\\\351dSU\\\\325\\\\341\\\\320\\\\335\\\\334\\\\336\\\\001a3\\\\235<\\\\177\\\\376\\\\374\\\\373\\\\337\\\\373\\\\356o\\\\177\\\\363\\\\353\\\\252\\\\252~\\\\364\\\\203\\\\037\\\\266\\\\375\\\\241\\\\264E\\\\327u\\\\311\\\\247\\\\313\\\\317\\\\037~\\\\376\\\\364\\\\031\\\\010\\\\324R\\\\020\\\\260\\\\033{c-S\\\\002\\\\201Z*\\\\251\\\\305\\\\320\\\\365\\\\004)Zs~~\\\\336\\\\355\\\\273B\\\\353\\\\312Z\042\\\\322R\\\\332i\\\\223\\\\331\\\\377J\\\\200\\\\265\\\\026\\\\0213wM\\\\011C\\\\244\\\\224\\\\224Y\\\\365B\042\\\\307\\\\350\\\\3750\\\\016\\\\336qL,pR\\\\325\\\\300 \\\\200\\\\224D\\\\255\\\\225f\\\\011FK)9F\\\\001\\\\250\\\\264IL1D\\\\243\\\\0243\\\\3576k-\\\\3640\\\\216)8\\\\253\\\\225Da\\\\214\\\\321Zz\\\\357\\\\307\\\\324\\\\011\\\\011\\\\326\\\\250HA\\\\242\\\\320V\\\\005!\\\\011RS\\\\227\\\\266\\\\220\\\\323\\\\246\\\\376\\\\364\\\\223\\\\307Z\\\\032\\\\202\\\\304\\\\011\\\\310J!T\\\\234\\\\3259\\\\226\\\\367\\\\3758\\\\231\\\\324\\\\313\\\\345yae\\\\323L\\\\255\\\\325\\\\000Bk\\\\331\\\\367#S,\\\\254\\\\2367\\\\227n\\\\030Q\\\\260sN \\\\330\\\\302\\\\236\\\\034\\\\303\042\\\\000\\\\030-\\\\335\\\\330\\\\013\\\\201R\\\\210\\\\322Z?\\\\216\\\\314\\\\214(Jk\\\\264\\\\262\\\\303\\\\330\\\\011\\\\340\\\\272\\\\251\\\\\\\\\\\\217\\\\207\\\\375\\\\266\\\\260e\\\\356\\\\007)\\\\255)ri\\\\253|\\\\265\\\\221\\\\0353#\\\\330\\\\312\\\\242\\\\367D\\\\011A\\\\240\\\\013q\\\\014\\\\351\\\\374\\\\311g?\\\\377\\\\305?\\\\374?\\\\377\\\\366'\\\\337|{\\\\275\\\\336\\\\216\\\\323fq1[\\\\234M\\\\353\\\\325\\\\333\\\\327]w\\\\330\\\\337\\\\255\\\\274\\\\353R\\\\364Z\\\\011\\\\216\\\\011\\\\205\\\\3106p\\\\014$P\\\\2408\\\\032\\\\332\\\\334\\\\334\\\\334T\\\\315\\\\244\\\\251*\\\\231s\\\\0020\\\\211\\\\302I\\\\315\\\\376\\\\303\\\\250\\\\005\\\\3100\\\\020\\\\312\\\\226\\\\017\\\\307\\\\330, #\\\\2208\\\\021\\\\322\\\\311\\\\006\\\\367hu\\\\304L\\\\031\\\\260*\\\\210(b\\\\242\\\\3101\\\\222#\\\\212\\\\200^i\\\\024\\\\242c\\\\361~\\\\267\\\\177\\\\360\\\\305\\\\357\\\\311\\\\346\\\\354\\\\355\\\\325\\\\246\\\\264sJ\\\\201\\\\022\\\\373\\\\020\\\\275\\\\217\\\\304,\\\\262\\\\233\\\\212\\\\340\\\\354^\\\\300DD\\\\211S\\\\240\\\\024r\\\\306\\\\017\\\\000\\\\352\\\\217\\\\377\\\\370\\\\217\\\\2151\\\\214RJ\\\\231\\\\373\\\\202D\\\\314\\\\204J\\\\251z\\\\322|\\\\377\\\\273_\\\\306\\\\030\\\\245DTRKA\\\\211\\\\225\\\\320\\\\257^\\\\275Y\\\\255V\\\\210\\\\370\\\\311'\\\\217\\\\211\\\\310#\042@\\\\210\\\\261(\\\\212\\\\355v]\\\\024E\\\\242`\\\\255]\\\\236\\\\315\\\\013\\\\243\\\\212\\\\345\\\\234\\\\010\\\\2141\\\\3030tm+\\\\245\\\\004F!\\\\004'\\\\312[\\\\376a\\\\030R:\\\\366\\\\336\\\\372qPJ\\\\305\\\\350\\\\207\\\\223>\\\\261@D\\\\245r\\\\223Y\\\\001\\\\262\\\\224\042\\\\023w}\\\\364\\\\336\\\\013\\\\004\\\\362\\\\3169gt!\\\\215\\\\366>\\\\344\\\\244mpcY\\\\3261z%\\\\320C\\\\362\\\\243\\\\363JM\\\\352\\\\02291\\\\3610\\\\216)\\\\034\\\\253\\\\247\\\\330c\\\\214\\\\321\\\\030\\\\203\\\\210\\\\336\\\\271\\\\265\\\\277\\\\2131\\\\242\\\\006c\\\\314\\\\241;\\\\224e\\\\231\\\\274\\\\267Z\\\\247\\\\224\\\\224T\\\\272\\\\251\\\\373\\\\256\\\\277\\\\365\\\\357\\\\317\\\\346\\\\013\\\\000@\\\\342\\\\030\\\\235\\\\221\\\\245B\\\\020\\\\014!\\\\370\\\\300\\\\004\\\\024\\\\2551\012m&z87\012!\\\\264\\\\326\\\\316\\\\217Z\\\\251\\\\274R\\\\245\\\\350\\\\2551\\\\316\\\\271\\\\242(\\\\230\\\\261\\\\357z.HKED\\\\301\\\\015\\\\000\\\\320\\\\224UvO\\\\013\\\\243\\\\313\\\\371\\\\253\\\\226j\\\\034\\\\307\\\\321\\\\017\\\\2526\\\\343\\\\350\\\\254@\\\\215F\\\\304\\\\230\\\\273\\\\023\\\\300J\\\\225\\\\305\\\\337\\\\376\\\\342\\\\267\\\\377\\\\366\\\\317\\\\377\\\\303\\\\267oo7\\\\207\\\\241\\\\335u\\\\017\\\\237>z\\\\372\\\\340\\\\342l\\\\242\\\\336}\\\\375\\\\313\\\\241\\\\357\\\\024\\\\246}\\\\267\\\\023\\\\000\\\\024=sB\\\\200\\\\030\\\\343\\\\275\\\\341\\\\030\\\\021A\\\\002T\\\\260\\\\332n\\\\036{/\\\\232&\\\\353\\\\271\\\\002\\\\000\\\\235\\\\314\\\\354\\\\340?9r\\\\207\\\\374h\\\\230\\\\226]x\\\\030(\\\\021rb\\\\212\\\\202\\\\217\\\\336\\\\347|\\\\362J\\\\002\\\\342\\\\230b\\\\340\\\\024$!bB\\\\342\\\\024]\\\\004\012\\\\304\\\\322\\\\334\\\\016\\\\375'_|\\\\177\\\\317bs\\\\263\\\\266\\\\223\\\\305v\\\\3353\\\\010\\\\212)$\\\\317(\\\\224\\\\224\\\\221(8\\\\237\\\\241D!\\\\004\\\\342D\\\\024(FJ1\\\\237\\\\032\\\\221\\\\361\\\\317\\\\377\\\\315\\\\377\\\\006'\\\\217\\\\0048j:\\\\035\\\\013\\\\351\\\\221\\\\217\\\\210\\\\330\\\\254\\\\311\\\\022\\\\203\\\\2171\\\\001\\\\213B\\\\027G\\\\250;\\\\205\\\\020\\\\202s\\\\203s.\\\\327\\\\311\\\\245\\\\302\\\\242(\\\\254\\\\325\\\\271\\\\373\\\\340\\\\275\\\\337o\\\\017UQ\\\\036\\\\337\\\\212\\\\2669K\\\\316\\\\251sJ)\\\\306\\\\224K\\\\364GHy\\\\026\\\\273\\\\020G\\\\223\\\\221c\\\\206\\\\364\\\\221\\\\366E\\\\216\\\\356G\\\\210\\\\343\\\\321\\\\3430e\\\\206\\\\030\\\\001\\\\244\\\\304!\\\\305\\\\214\\\\332C\\\\020B\\\\2428j*\\\\001\\\\212l)\\\\004\\\\314,\\\\004d\\\\263\\\\205\\\\217\\\\317r\\\\312\\\\015\\\\216\\\\273\\\\361\\\\023t\\\\201\\\\265Rt\\\\232]\\\\367\\\\257\\\\215\\\\357]\\\\343\\\\263\\\\213\\\\353\\\\351\\\\213\\\\314,\\\\230\\\\360\\\\204#\\\\313_\\\\311\\\\227\\\\312\\\\307\\\\3042\\\\235nT\\\\010!P\\\\212\\\\243\\\\351\\\\016\\\\0108*\\\\230\\\\212\\\\243\\\\020:a<\\\\272\\\\377dIi\\\\001\\\\000$0j\\\\021B(X``r\\\\261\\\\260\\\\325\\\\365\\\\256\\\\265\\\\323\\\\263wm\\\\377o\\\\376\\\\364\\\\317\\\\376\\\\372?\\\\376R\\\\311\\\\342\\\\260\\\\332\\\\232\\\\004\\\\177\\\\370\\\\303\\\\337?\\\\237MV\\\\357\\\\277\\\\355\\\\272\\\\315n\\\\263\\\\356\\\\272\\\\003EG\\\\034)\\\\206D\\\\001\\\\000\\\\262\\\\026{\\\\002&\\\\206H)E\\\\216\\\\014\\\\021\\\\320\\\\330\\\\342\\\\007\\\\337\\\\377\\\\275\\\\311d\\\\242\\\\004\\\\266m[\\\\025e\\\\333\\\\266\042\\\\277/bfN\\\\211C\\\\01011@\\\\206|\\\\220\\\\200\\\\274\\\\314\0423\\\\013J\\\\234\\\\210R\\\\220\\\\200\\\\222\\\\011\\\\031\\\\0041\\\\020\\\\347\\\\230\\\\315$#\\\\245\\\\250AX\\\\311\\\\311\\\\307~4\\\\204\\\\205\\\\255P\\\\025r\\\\261\\\\364\\\\315t\\\\345i;P\\\\210R\\\\222\\\\004\\\\000\\\\2204\\\\370A+\\\\233\\\\343\\\\035\\\\000h\\\\255C8\\\\272\\\\0023\\\\334\\\\031a\\\\000\\\\000 \\\\000IDAT\\\\000'D\\\\344\\\\230\\\\230SY\\\\024u]\\\\253\\\\254\\\\276\\\\307\\\\034\\\\357\\\\037}~\\\\376\\\\031\\\\376\\\\233N\\\\355\\\\034\\\\000\\\\2101\\\\244D\\\\022\\\\244#\\\\227\\\\177cN\\\\007\\\\245\\\\304\\\\252\\\\252\\\\020!\\\\017\\\\221D\\\\241m{\\\\357\\\\307\\\\224\\\\030\\\\210s\\\\341\042\\\\203\\\\0342\\\\320,'\\\\326eY\\\\036G\\\\244\\\\020\\\\037\\\\0064\\\\342\\\\340\\\\006<9y\\\\346#\\\\277\\\\321\\\\\\\\\\\\263\\\\273\\\\277\\\\230c\\\\025)K\\\\357%\\\\3129\\\\\\\\\042\\\\020\\\\200\\\\331\\\\350(\\\\343Q3\\\\314:\\\\367\\\\005@\\\\260 !\\\\265`\\\\246\\\\374k?\\\\376m\\\\231\\\\217\\\\370\\\\237\\\\016\\\\350\\\\373O\\\\037\\\\377\\\\357\\\\375\\\\367d\\\\006\\\\032\\\\321\\\\375\\\\216\\\\010J\\\\243\\\\357\\\\343\\\\331\\\\375\\\\304\\\\273\\\\237~xt%\\\\314\\\\362\\\\255\012\\\\020\\\\255\\\\265\\\\000\\\\331^\\\\215\\\\323q\\\\346D\\\\000\\\\210!\\\\233\\\\335\\\\210\\\\373Y\\\\004\\\\000)A\\\\347\\\\306\\\\246ib?\\\\220\\\\363\\\\206E\\\\327\\\\015u3\\\\377\\\\346\\\\355\\\\365\\\\377\\\\371\\\\247\\\\177\\\\366f\\\\265gQ\\\\336\\\\255\\\\267\\\\334\\\\273'\\\\217\\\\036\\\\305v\\\\367\\\\342\\\\375\\\\213\\\\262\\\\304\\\\344\\\\372\\\\024\\\\034\\\\304\\\\300\\\\024\\\\021\\\\010\\\\005#c\\\\226\\\\205J'\\\\215\\\\347{\\\\223\\\\334\\\\224x\\\\030\\\\206\\\\253\\\\253+\\\\0240k&\\\\271\\\\236\\\\240\\\\224\\\\312.\\\\203\\\\037\\\\036\\\\313\\\\361^0\\\\333)0\\\\200<\\\\332>q\\\\226\\\\222?R\\\\007\\\\263\\\\217Q\\\\266t\\\\002FF\\\\243u\\\\030cpA\\\\260@`\\\\241\\\\314\\\\274\\\\231//\\\\0366\\\\313\\\\3137\\\\333\\\\366\\\\355v\\\\277M\\\\314\\\\262\\\\222F\\\\223\\\\207\\\\2341\\\\346\\\\035WV\\\\177\\\\314/B)U\\\\024\\\\305n\\\\267\\\\243\\\\256\\\\003c\\\\246\\\\223i]\\\\327V\\\\033!A\\\\035\\\\016\\\\355?\012$\\\\371r\\\\363\\\\200\\\\273\\\\037s\\\\000\\\\220\\\\371\\\\301\\\\200b\\\\267\\\\337\\\\016\\\\303\\\\220\\\\211\\\\025R\\\\312D\\\\234\\\\351\\\\264B\042\042\\\\346xFD9x\\\\001@\\\\006\\\\202r\\\\326-\\\\021\\\\342\\\\344\\\\353\\\\352\\\\177w\\\\300\\\\034\\\\317\\\\025)~<\\\\244r0\\\\273\\\\017\\\\204\\\\037\\\\217\\\\244\\\\224\\\\022\\\\020\\\\227V\\\\247\\\\224R6\\\\244\\\\310d@y\\\\\\\\+\\\\357\\\\003\\\\241\\\\226Z\\\\234l\\\\011\\\\272\\\\356\\\\360\\\\361\\\\351\\\\304\\\\351PJ\\\\235\\\\372\\\\004\\\\277c\\\\304\\\\221\\\\342\\\\011\\\\223\\\\216xz\\\\357x\\\\372Y)\\\\205\\\\024\\\\310\\\\204\\\\307 *$d\\\\376\\\\330\\\\351:!\\\\377\\\\010\012\\\\251\\\\325\\\\261\\\\224\\\\213\\\\002\\\\004J!1\\\\233\\\\356\\\\214\\\\203\\\\243\\\\274\\\\212\\\\334\\\\223eX\\\\000@\\\\244,\\\\007\\\\205\\\\037\\\\321T\\\\221\\\\200\\\\220\\\\020\\\\011\\\\275\\\\013\\\\032\\\\204.\\\\252\\\\024\\\\340\\\\3537o\\\\377\\\\364/\\\\376\\\\352\\\\315\\\\325f\\\\325\\\\215J\\\\227\\\\022dQ\\\\330Z\\\\203o\\\\357,$\\\\327\\\\271qh\\\\275\\\\353):\\\\201\\\\210\042\\\\023G\\\\220\\\\217\\\\366t\\\\247\\\\213\\\\344\\\\223q\042@`XmV\\\\227\\\\017.RJZ\\\\313q\\\\030\\\\244\\\\224>\\\\204\\\\220B\\\\360\\\\211\\\\031\\\\210\\\\340\\\\330\\\\372\\\\306\\\\243\\\\317Q6\\\\304B\\\\006q\\\\0144\\\\300\\\\014\\\\002N}s\\\\302\\\\243,\\\\025p?\\\\016\\\\326Z\\\\212\\\\274?\\\\354\\\\027\\\\213\\\\305\\\\227_~y~\\\\366\\\\320G\\\\274>\\\\014[GC\\\\022\\\\000\\\\222\\\\000)\\\\004N,\\\\005\\\\304\\\\350\\\\215\\\\024\\\\011 \\\\245\\\\240\\\\265\\\\314\\\\333\\\\323\\\\303j\\\\015\\\\004\\\\240\\\\224\\\\235/'\\\\223Ii\\\\013D\\\\2141R\\\\214*\\\\306l8'\\\\230\\\\351~5D\\\\304\\\\014D\\\\276\\\\237\\\\213x\\\\2246\\\\203\\\\302\\\\330\\\\276\\\\357\\\\307q\\\\254\\\\353:?\\\\350\\\\254&\\\\230w\\\\301\\\\314\\\\254\\\\215*lim\\\\311\\\\004\\\\304IJ}8\\\\354\\\\372\\\\276GDkK\\\\245T\\\\337\\\\367y\\\\005\\\\310g\\\\373x\\\\035gf\\\\251?\\\\210O\\\\253\\\\373A\\\\360Q\\\\032\\\\307'A\\\\272|\\\\272\\\\273\\\\365\\\\226\\\\242\\\\2171\\\\246\\\\354\\\\030\\\\244d\\\\376\\\\331\\\\020\\\\002\042f'\\\\000\\\\255\\\\245:\\\\332NrY\\\\226\\\\247M9\\\\177X\\\\372\\\\377Q\\\\340\\\\377\\\\335\\\\017\\\\367\\\\307\\\\307s>\\\\343%\\\\324)\\\\277?\\\\035\042$\\\\312X\\\\016!\\\\000\\\\205Dd\\\\204l\\\\300s\\\\232+|\\\\262\\\\030B\\\\202D(\\\\225\\\\270\\\\237\\\\256 \\\\217'\\\\025\\\\230\\\\231\\\\0079\\\\226\\\\343\\\\311D\\\\032\\\\031,b\\\\350\\\\006 \\\\024\\\\266\\\\034An\\\\234\\\\373\\\\223?\\\\377\\\\313_\\\\177\\\\373NUs\012\\\\343\\\\241\\\\335\\\\212\\\\230J\\\\003\\\\375n\\\\005\\\\034&\\\\213I\\\\267n\\\\3038p\\\\014\\\\220->\\\\020\\\\231\\\\216\\\\005\\\\212\\\\337\\\\011$\\\\000\\\\314 \\\\030\\\\224\\\\022!\\\\222R\\\\252\\\\231\\\\326m\\\\3276e\\\\225S\\\\304\\\\214\\\\337\\\\2101\\\\373\\\\027\\\\036\\\\3118\\\\210(\\\\344\\\\261`\\\\207\\\\3149<\\\\013&f\\\\300l\\\\026u\\\\224\\\\304d\\\\206lp\\\\313\\\\230\\\\342~?\\\\224\\\\245\\\\375\\\\342\\\\263gUSow\\\\207\\\\353U\\\\233Tu\\\\265\\\\353G4$5\\\\240\\\\212!\\\\206\\\\020\\\\004\\\\242P\\\\252k[\\\\242(\\\\245D\\\\245\\\\201y\\\\030\\\\206\\\\030\\\\002\\\\000\\\\324ggM\\\\323d\\\\253\\\\200\\\\261\\\\037\\\\234\\\\363y\\\\311U\\\\333\\\\315>\\\\273Lg\\\\241\\\\321\\\\373\\\\027,\\\\245d\\\\206\\\\343\\\\026\\\\025\\\\216\\\\205t`\\\\036\\\\307QkiL\\\\223E\\\\321s\\\\2405\\\\306\\\\000\\\\210c`fL\\\\211i\\\\364)q\\\\010\\\\356\\\\372\\\\372:\\\\003\\\\330\\\\255\\\\265\\\\263\\\\031\\\\225e\\\\231\\\\207\\\\362\\\\241\\\\355r\\\\\\\\\\\\3748\\\\235\\\\005\\\\304\\\\030\\\\022\\\\036y\\\\367\\\\037\\\\025\\\\352\\\\021\\\\373\\\\276\\\\3778p\\\\036\\\\277.`6\\\\233\\\\035\\\\023k\\\\370\\\\300\\\\271\\\\247\\\\373\\\\000|\\\\357MF9\\\\250\\\\207p47\\\\022(\\\\020\\\\020!\\\\233\\\\221B\\\\366_\\\\316\\\\002\\\\204\\\\377x(\\\\037\\\\207\\\\324q\\\\321\\\\310UVT\\\\306\012!@\\\\010b\\\\216t\\\\024\\\\372\\\\026L|T6\\\\025\\\\014\\\\200(\\\\0019g\\\\311\\\\037\\\\0379\\\\314\\\\177l#\\\\224\\\\327g\\\\310\\\\313`^\\\\026\\\\204\\\\312\\\\311\\\\312\\\\207\\\\237bFf\\\\031\042\\\\021\\\\010\\\\251\\\\035\\\\301\\\\301\\\\207\\\\177\\\\3677\\\\177\\\\377\\\\363\\\\257^Mf\\\\227\\\\327w\\\\033+\\\\224\\\\353\\\\267\\\\032R\\\\251\\\\225a*5\\\\356\\\\367k\\\\357\\\\006\\\\312~j\\\\310 \\\\216\\\\216\\\\256\\\\031\\\\033L\\\\031\\\\356\\\\234M\\\\235\\\\210\\\\004\\\\010\\\\002RJa\\\\364\\\\263\\\\331\\\\254\\\\252\\\\252W/^\\\\322\\\\331b\\\\3324a\\\\360G\\\\231%\\\\310\\\\356\\\\023\\\\367\\\\312~H\\\\214\\\\002)\\\\303\\\\222\\\\262R43\\\\003R\\\\016\\\\330\\\\247\\\\031\\\\203\\\\307\\\\275\\\\000\\\\223@R\\\\022\\\\215\\\\224\042\\\\322\\\\260o\\\\267\\\\316\\\\367\\\\254\\\\242M^\\\\225\\\\016\\\\364\\\\020h\\\\014#\0126Z\\\\021\\\\305\\\\321\\\\265R\\\\242\\\\017\\\\236A\\\\226\\\\205\\\\015!\\\\304\\\\303N4\\\\365\\\\247\\\\317\\\\276\\\\033\\\\211\\\\001\\\\240\\\\037\\\\306\\\\224\\\\222@4\\\\266\\\\314\\\\334\\\\016\\\\225s\\\\270\\\\0171\\\\3514\\\\230\\\\362\\\\033\\\\3728@\\\\302G\\\\373'f\\\\316\\\\302\\\\000y\\\\267\\\\224!\\\\360y\\\\2002\\\\347\\\\302E\\\\002\\\\020\\\\210<i\\\\246u]g\\\\263\\\\332\\\\224R\\\\327uy@\\\\027\\\\266\\\\274\\\\217\\\\304|R\\\\303\\\\007\\\\200Sd\\\\372\\\\035iSD\\\\314s\\\\361\\\\376\\\\237\\\\367a\\\\225)e\\\\254\\\\214<\\\\205\\\\300\\\\374=y\\\\017p\\\\304\\\\254\\\\347\\\\374\\\\230\\\\0011\\\\273\\\\232g\\\\3677\\\\020B\\\\235H\\\\031\\\\331g1}\\\\364'\\\\235\\\\376T(\\\\216vu\\\\300\\\\367\\\\006t$\\\\205\\\\006$J@\\\\234\\\\2300s\\\\277Qa\\\\214\\\\021\\\\220\\\\230\\\\005!\\\\023A\\\\306o\\\\374\\\\243\\\\271\\\\201(\\\\021\\\\030A\\\\002\\\\220\\\\033\\\\334\\\\375s\\\\346\\\\373\\\\265\\\\2039W\\\\353\\\\357\\\\3577/\\\\352\\\\222\\\\311\\\\244\\\\210\\\\240\\\\333@^\\\\250\\\\233n\\\\370\\\\311\\\\337\\\\376r\\\\237$\\\\004f\\\\222Za\\\\005T+l\\\\024j\\\\210J\\\\253\\\\276s)\\\\005d\\\\220\\\\022\\\\231%\\\\001\\\\247\\\\223Py6%\\\\3730UNn\\\\224\\\\211HJ(+KD\\\\233\\\\315\012\\\\200\012c\\\\362\\\\213\\\\316\\\\0073\\\\013T\\\\000\\\\037\\\\255c\\\\210\\\\010(\\\\362\\\\034=\\\\226=\\\\030\\\\216\\\\3501\\\\316\\\\302b\\\\221\\\\210\\\\030\\\\220\\\\211(M\\\\213\\\\022bZ\\\\337\\\\3344\\\\363\\\\345'\\\\237|\\\\326\\\\311\\\\342\\\\345\\\\366\\\\320;\\\\366 \0421E\\\\226\\\\212\\\\221\\\\201\\\\330;\\\\337\\\\025\\\\272\\\\250\\\\2122\\\\2040t\\\\007m\\\\313\\\\311\\\\305\\\\205),C*\\\\313\\\\232\\\\210\\\\034\\\\373\\\\020\\\\002\\\\242\\\\022Z\\\\020\\\\0013\\\\252L\\\\312\\\\005\\\\200\\\\223w\\\\0300di\\\\353(\\\\204P\042\\\\257\\\\340G\\\\373[\\\\000\\\\310\\\\252\\\\027y\\\\004k\\\\255\\\\205\\\\020)\\\\3610\\\\270,@/\\\\345\\\\261I\\\\004 \\\\004*!\\\\301\\\\005g\\\\214\\\\266E\\\\241R\\\\002@\\\\255\\\\365\\\\357.\\\\323\\\\230\\\\210\\\\370\\\\364\\\\346\\\\362D\\\\272\\\\317\\\\200?\\\\032\\\\001\\\\230\\\\361\\\\237\\\\037\\\\036\\\\342?\\\\036\042\\\\010\\\\300t\\\\362\\\\202!<Z\\\\015dV\\\\246\\\\000!\\\\004\012)\\\\205\\\\020\\\\306\\\\212\\\\234\\\\305b&\\\\013\\\\010\\\\310\\\\256\\\\256)fJ\\\\347\\\\261A\\\\203B@\\\\006\\\\357\\\\202\\\\000\\\\004@\\\\301\\\\307w\\\\204\\\\210\\\\200 \\\\206a\\\\300#\\\\340\\\\014\\\\360\\\\330\\\\010#\\\\01490!\\\\000r\\\\006\\\\030\\\\037\\\\313V\\\\220\\\\257\\\\377t\\\\255\\\\037\\\\316\\\\253\\\\245\\\\202\\\\373\\\\371y2\\\\017\\\\317\\\\036SDG\\\\005X\\\\201\\\\002O\\\\302\\\\237\\\\0050\\\\002u\\\\250\\\\222T?\\\\375\\\\305\\\\257\\\\257\\\\207\\\\350\\\\204\\\\275\\\\335\\\\266sc\\\\302a[p(\\\\230a\\\\034\\\\035\\\\215\\\\301\\\\037\\\\035\\\\015\\\\363\\\\371r\\\\353!Q`F!\\\\324)\\\\362\\\\323\\\\375\\\\\\\\\\\\222,\\\\0319\\\\244\\\\250\\\\214\\\\024J\\\\246\\\\024\\\\224R\\\\233\\\\315FK\\\\234\\\\315f\\\\361t|\\\\024\\\\3650\\\\277f\\\\310>\\\\356\\\\010|r\\\\252=\\\\365\012\\\\231\\\\021N\\\\231:gTEi\\\\3640t\\\\213\\\\262~\\\\366\\\\311\\\\363r:\\\\277\\\\352\\\\207\\\\327\\\\273\\\\315\\\\255\\\\243\\\\003kVB\\\\203Q\0120y7t\\\\021FD\\\\350\\\\017\\\\373\\\\242,c\\\\364\\\\024CQU\\\\313\\\\345\\\\334\\\\024\\\\245\\\\224\\\\362\\\\363\\\\347\\\\337UJu\\\\303x}}\\\\275]mc$@il\\\\251r\\\\256y\\\\032\\\\023\\\\224G3s\\\\312Y\\\\340}>\\\\220\\\\2239\\\\000pn\\\\310\\\\016K\\\\367\\\\267\\\\207(\\\\265\\\\326\\\\231\\\\367\\\\232B\\\\314\\\\355\\\\025\\\\224\\\\202b\0121\\\\372SU\\\\216\\\\210r}#\\\\223\\\\021s,\\\\007\\\\372`S\\\\233_\\\\252\\\\320\\\\372>B\\\\177\\\\\\\\\\\\360\\\\242\\\\223\\\\365\\\\240\\\\370]i\\\\352\\\\274z\\\\336\\\\207\\\\232\\\\374z\\\\024b\\\\236`\\\\312HD<\\\\372\\\\205#\042\\\\200\\\\024\042\\\\327\\\\372\\\\217O\\\\233X\\\\200``\\\\243\\\\025\\\\037-\\\\234?L$\\\\221_\\\\025@\\\\002f\\\\006:z\\\\275S^\\\\213\\\\024bN\\\\243s\\\\000s1\\\\204\\\\020O\\\\345\\\\274\\\\314-\\\\3153\\\\200\\\\021\\\\261\\\\264\\\\005d\042\\\\335G+\\\\017 \\\\347\\\\206\\\\350}\\\\212u\\\\2777\\\\220BH)\\\\356\\\\313|\\\\000\\\\202\\\\021$\\\\205\\\\224\\\\022\\\\010\\\\241\\\\253*\\\\260\\\\370\\\\223\\\\377\\\\367'fvI\\\\224\\\\346UA\\\\207=\\\\216\\\\343\\\\274)\\\\300\\\\2671\\\\270\\\\272*\\\\006\\\\327s\012\\\\214 N\\\\213\\\\377}\\\\311(\\\\203\\\\233\\\\341\\\\303A\\\\000H\\\\202\\\\0308E\\\\250\\\\214\\\\222\\\\022\\\\031\\\\241\\\\231N\\\\256\\\\256\\\\256\\\\256oW\\\\246\\\\250\\\\000\\\\362\\\\334\\\\226\\\\200\\\\210R\\\\310\\\\337\\\\311\\\\243\\\\004\\\\347\\\\232\\\\005s\\\\312I\\\\0070e\\\\247fb\\\\301\\\\000L\\\\222\\\\022\\\\022`JZ\\\\310\\\\371\\\\362\\\\342\\\\341\\\\331e=\\\\231\\\\255G\\\\177\\\\263\\\\357\\\\333\\\\300\\\\272lJ\\\\260\\\\235\\\\013\\\\243\\\\3535\\\\002BJiL\\\\030\\\\225\\\\022`t\\\\010Ij\\\\263<\\\\277(\\\\353\\\\011\\\\010\\\\371\\\\350\\\\321\\\\243?\\\\370\\\\303?z\\\\360\\\\340\\\\321\\\\331\\\\305\\\\305d2\\\\035\\\\206a\\\\265\\\\332\\\\354v\\\\273\\\\335\\\\366\\\\260\\\\337\\\\357\\\\025\\\\243`\\\\000fB@\\\\231[\\\\367\\\\002\\\\020E\012\\\\011\\\\001R\012\\\\314I \\\\336\\\\027\\\\252\\\\2018\\\\270c\\\\260\\\\021\\\\200L\\\\034\\\\223#\\\\242\\\\350\\\\363R\\\\212\\\\014\\\\300)0\\\\013-\\\\245\\\\326vb\\\\246 \\\\263J7\\\\305\\\\030CH@I\\\\011\\\\231-)\\\\004\\\\002\\\\212\\\\323/\\\\347\\\\314AKB\042\\\\236\\\\334H\\\\363\\\\320\\\\311q=Gt\\\\372(\\\\234#\\\\222\\\\2249O\\\\005\\\\000P\\\\250\\\\356\\\\237\\\\261\\\\221\\\\212\\\\231)\\\\021\\\\003\\\\250<\\\\033\\\\363}RB\\\\205JH\\\\220\\\\277cN'\\\\000R^\\\\207O\\\\266\\\\320\\\\314\\\\214\\\\034\\\\201\\\\2018\\\\346\\\\206\\\\2272\\\\352\\\\030x\\\\022Ye\\\\004\\\\262U\\\\022 \\\\371\\\\024\\\\245\\\\204ZK\\\\357\\\\331\\\\232:\\\\306\\\\024#i-\\\\363\\\\306\\\\261\\\\357\\\\332\\\\305b\\\\221\\\\210\\\\206aP\\\\326\\\\370\\\\030\\\\230Yi\\\\335\\\\367\\\\2751\\\\206\\\\262\\\\0036\\\\035wO\\\\000 \\\\200\\\\001AK\\\\225\\\\211\\\\267\\\\3169\042*\\\\313\\\\212\\\\022)U\\\\000\\\\361\\\\310\\\\330%\\\\372\\\\017?\\\\373\\\\033-U\\\\277Z\\\\237\\\\333\\\\211[\\\\255\\\\226Vy\\\\0141\\\\244\\\\024\\\\372\\\\302\\\\232\\\\266\\\\357\\\\032[{?\\\\002R\\\\342\\\\230\\\\275\\\\213\\\\322\\\\311\\\\222\\\\236\\\\031\\\\262\\\\262\\\\272P\\\\230\\\\255gAHfNDF\\\\303dRw\\\\335\\\\301\\\\230O\\\\272\\\\241O\\\\314\\\\235s\\\\267\\\\233\\\\315'\\\\217>e\\\\251dH\\\\307\\\\324\\\\310'\\\\310\\\\202!!\\\\300\\\\375\\\\014\\\\226\\\\002\\\\022\\\\021\\\\003\\\\021k\\\\243}\\\\337\\\\223\\\\013\\\\026Q\\\\021SLF\\\\310\\\\322\\\\326\\\\363z:;\\\\273,f\\\\363\\\\255\\\\017\\\\257v\\\\375\\\\373.\\\\366BQ\\\\204~\\\\354\\\\224\\\\326(\\\\301\\\\207\\\\201\\\\311\\\\013\\\\005\\\\210\\\\311;/e\\\\225\\\\030g\\\\263e=\\\\2352\\\\363t6_,\\\\317\\\\017\\\\335`\\\\367{\\\\226bw\\\\330\\\\013!\\\\246\\\\363\\\\311\\\\371\\\\345\\\\031\\\\000\\\\250\\\\234\\\\250\\\\301\\\\211\\\\317\\\\210\\\\230\\\\335\\\\031\\\\000\\\\021\\\\211\\\\023'D$\\\\316S\\\\023R\\\\036vy\\\\035\\\\021\\\\037I+\\\\344\\\\234\\\\370T\\\\326\\\\345,\\\\355\\\\0052\\\\227\\\\271\\\\360\\\\230U\\\\000\\\\360Q\\\\233\\\\207\\\\340\\\\330J\\\\370\\\\220<\\\\340\\\\207}\\\\036\\\\235*\\\\016\\\\277\\\\223\\\\276\\\\023Q\\\\327u\\\\000po\\\\300u\\\\312\\\\241\\\\205\\\\020\\\\331\\\\363\\\\343~;}\\\\337\\\\206\\\\025\\\\202I\\\\234\\\\222\\\\245|i\\\\214\\\\240\\\\265\\\\306\\\\274\\\\017d \\\\210H\\\\310\042\\\\347$\\\\3078\\\\006|\\\\254j\\\\023\\\\021\\\\0227\\\\205eV\\\\021\\\\230\\\\020P\\\\010F@\\\\026,\\\\250\\\\251\\\\253\\\\261\\\\037\\\\206\\\\241\\\\223R\012\\\\011)1%/D\\\\366\\\\254\\\\021Z\\\\353\\\\262\\\\264\\\\371q5M\\\\223{L|\\\\232f\\\\221\\\\022\042j\\\\255\\\\2151\\\\307T$_$\\\\243D>\\\\336;\\\\020SL\\\\321[\\\\243\\\\204P\\\\314<\\\\366\\\\003Z\\\\003R'@;\\\\231}\\\\375\\\\362e\\\\362\\\\201\\\\3064\\\\216\\\\251\\\\226\\\\010c'S`\\\\214B`\\\\214\\\\036\\\\231cL\\\\234\\\\200\\\\3451\\\\267\\\\243\\\\373\\\\224\\\\371\\\\264D|xX\\\\331\\\\017\\\\210\\\\231\\\\031b\\\\204\\\\252,BL)\\\\245\\\\262\\\\251\\\\267\\\\207=E~\\\\363~et1\\\\233\\\\315Kc\\\\333\\\\266\\\\015\\\\316\\\\033c$\\\\3420vVgL\\\\005\\\\247D\042\\\\021\\\\002!\\\\203F\\\\001!i\\\\020 \\\\025\\\\244\\\\0101i\\\\024\\\\263\\\\252\\\\231LfFV.\\\\322fsX\\\\005\\\\277\\\\213\\\\020M\\\\031\\\\001\042\\\\261R\\\\312;G\\\\321\\\\013d\\\\224@D\\\\211\\\\002DJ\\\\310\\\\217\\\\237|\\\\246\\\\265N)\\\\331\\\\262h\\\\333\\\\376\\\\027\\\\277\\\\370\\\\345\\\\305\\\\203\\\\325r\\\\271\\\\254'\\\\315\\\\027_|a\\\\255}\\\\177s]\\\\024\\\\305b\\\\261\\\\330\\\\355vJ\\\\234\012\\\\030y\\\\360d^;3g,:\\\\262d>q\\\\301\\\\363\\\\267I`\\\\004b\\\\020x\\\\362\\\\232d8Z\012\042\\\\212l\\\\233\\\\005\\\\271\\\\037\012\\\\000\\\\011O+[^y\\\\2458\\\\255\\\\271(\\\\356\\\\363\\\\260\\\\354\\\\020 \\\\216Z\\\\010\012>Rl8~`\\\\252\\\\253\\\\352\\\\343\\\\305\\\\372\\\\376\\\\035\\\\235\04273\\\\347z\\\\360\\\\361\\\\263\\\\000\\\\301\\\\247t\\\\346X\\\\271\\\\310>z\\\\247\\\\225\\\\235?*\\\\261\\\\003\\\\200s.\\\\317\\\\023)\\\\245\\\\306\\\\017\\\\271M\\\\364\\\\2011\\\\337\\\\004\\\\036\\\\353\\\\256\\\\000\\\\210\\\\270Z\\\\255\\\\2546\\\\322X!\\\\204\\\\224H)\\\\022\\\\241\\\\020\\\\306\\\\271`\\\\214M\\\\220\\\\266\\\\207\\\\275\\\\020\042\\\\004\\\\237\\\\007qU\\\\327}\\\\337\\\\357v\\\\2731\\\\370,\\\\334\\\\001\\\\314\\\\207\\\\375\\\\336\\\\232\\\\352\\\\270\\\\350\\\\037\\\\215\\\\3531\\\\347\\\\265!\\\\004c\\\\224\\\\3262\\\\245\\\\22451\\\\224\\\\205\\\\262)\\\\373\\\\316%U\\\\274|\\\\365\\\\366\\\\305\\\\267oB\\\\010\\\\314(8\\\\031\\\\255\\\\3428 '\\\\212^)\\\\341\\\\335`\\\\225\\\\3661\\\\342\\\\351i$\\\\376\\\\220\\\\274}\\\\374\\\\014\\\\351\\\\364\\\\020r*\\\\310\\\\014J\\\\201s\\\\256\\\\353\\\\007f\\\\276<[\\\\276}\\\\365Nj\\\\254\\\\225|\\\\363\\\\366-\042.\\\\347\\\\013)\\\\005ki\\\\254V(\\\\230)w\\\\000\\\\024 \\\\002)FAL1a\\\\212\\\\311\\\\207\\\\243\\\\267\\\\020\\\\010a\\\\224-\012\\\\254*oM\\\\353\\\\343\\\\320sK\\\\335.Q\\\\007\\\\340\\\\204N R\042fN\\\\024\\\\230H\\\\310\\\\254B\\\\355\\\\001A\\\\330\\\\352\\\\374\\\\374\\\\0213\\\\244DJi\\\\212\\\\344\\\\274WJ\\\\265m\\\\367\\\\354\\\\331\\\\347\\\\317\\\\236=k\\\\232\\\\311\\\\341p8\\\\233/\\\\333\\\\266\\\\275z\\\\177m\\\\255U9v!b^\\\\270\\\\221E\\\\016\\\\330Bd\\\\307\\\\252\\\\017\\\\303\\\\016Q\\\\000\\\\322\\\\361\\\\235b\\\\306\\\\231 \042\0421\\\\001K8\\\\326^3\\\\3212o\\\\364\\\\376\\\\177\\\\262\\\\336\\\\354I\\\\322\\\\353\\\\272\\\\023;\\\\347.\\\\337\\\\232{fe\\\\255\\\\275\\\\243\\\\321h\\\\200$@\012\\\\002\\\\001\\\\216H\\\\221\\\\216\\\\240%J\\\\036K\\\\226\\\\3063O~\\\\262'l\\\\277\\\\372\\\\301\\\\177\\\\214\\\\355\\\\211\\\\360h\\\\024a[\\\\036\\\\333\\\\243\\\\361\\\\230\\\\036k\\\\210\\\\221&DQ$\\\\261\\\\020\\\\013\\\\261\\\\366\\\\336\\\\325\\\\265e\\\\345\\\\376\\\\355w;~\\\\270Y\\\\205V\\\\250\\\\036P\\\\035\\\\205\\\\352\\\\310\\\\252\\\\316\\\\373\\\\235{\\\\316\\\\357\\\\374\\\\026 \\\\362\\\\343\\\\037\\\\002\\\\000\\\\003\\\\3018C\\\\360_\\\\022\\\\0271\\\\343\\\\210xy\\\\240\\\\001$1\\\\347C\\\\211\\\\236o\\\\224\\\\235seYx\\\\327b\\\\337\\\\323\\\\373k\\\\341\\\\262\\\\324\\\\374\\\\235\\\\323\\\\017\\\\0147\\\\357$\\\\342\\\\305\\\\010\\\\017\\\\000\\\\233[\\\\302\\\\021\\\\340W;\\\\302\\\\313\\\\371\\\\3013\\\\245./\\\\004?\\\\321#\\\\242&\\\\353\\\\037\\\\371\\\\313\\\\237\\\\326\\\\357WD\\\\020\\\\304I\\\\242\\\\265\\\\316\\\\213\\\\202\\\\241@\\\\301-A\\\\243j\\\\006x\\\\357\\\\336\\\\227[[\\\\343 \012\\\\242(\\\\022\\\\201\\\\004\\\\306\\\\310\\\\330\\\\307\\\\207O''\\\\247\\\\307\\\\307\\\\307u]\\\\357\\\\355\\\\355\\\\275x\\\\367\\\\245\\\\361x,{\\\\203,\\\\253`\\\\203pY\\\\237\\\\372\\\\002\\\\340\\\\317\\\\264\\\\363\042|\\\\3254B\\\\210 \\\\010\\\\210\\\\270&G\042\\\\316jz\\\\373\\\\257~\\\\226\\\\027\\\\265sD\\\\216\\\\342(\\\\322E\\\\011\\\\246\\\\011\\\\231\\\\265V\\\\003\\\\347M\\\\323\\\\004<p\\\\344\\\\030\\\\367T\\\\372\\\\213\\\\205%\\\\302%k\\\\2311\\\\346\\\\374/\\\\3066\\\\375\\\\225\\\\177\\\\306\\\\307\\\\333}\\\\000pd\\\\313\\\\252\\\\350\\\\367\\\\373\\\\275^\\\\272\\\\314\\\\212\\\\2461H0_L\\\\200\\\\264\\\\217y^\\\\257K$\\\\342\\\\310\\\\000\\\\230\\\\004\\\\3068\\\\017\\\\001\\\\031\\\\001\\\\0322\\\\215\\\\262J\\\\343E\\\\311\\\\340A\\\\030\\\\246\\\\011\\\\213\\\\202\\\\2651\\\\345bQkFa\\\\344\\\\002Y \\\\025\\\\326\\\\325\\\\216\\\\210\\\\011D\\\\256T\\\\303\\\\030\\\\212@XkM\\\\243\\\\201\\\\\\\\\\\\324N\\\\333\\\\235.\\\\022\\\\033\\\\014\\\\006\\\\213\\\\305b:\\\\235\\\\366z\\\\2750\\\\010\\\\266\\\\306\\\\343\\\\267\\\\336z+n\\\\245UU\\\\021QQ\\\\225~1\\\\022\\\\206\\\\341\\\\351\\\\351\\\\251\\\\340\\\\354B}\\\\200>Q}sF8\\\\373\\\\252\\\\037\\\\365\\\\326\\\\014\\\\210\\\\340\\\\220\\\\001\\\\342\\\\306I\\\\030\\\\375W\\\\210\\\\261\\\\315e\\\\346\\\\217\\\\344\\\\346\\\\312\\\\004\\\\237\\\\342\\\\007\\\\034\\\\2206$\\\\025\\\\342\\\\270\\\\001\\\\213\\\\010\\\\310\\\\277\\\\026\042Cd\\\\027\\\\013\\\\005\\\\006\\\\340\\\\220\\\\214_\\\\256\\\\301\\\\305\\\\364\\\\355\\\\034!\\\\022\\\\347\\\\210\\\\300\\\\030\042\\\\003@\\\\3173\\\\007p\\\\210\\\\036\\\\200\\\\206\\\\313\\\\003\\\\007\\\\210\\\\027\\\\227\\\\000\\\\300FS\\\\201\\\\027\\\\340 \\\\003\\\\306\\\\310\\\\317\\\\011_=0\\\\027\\\\365I?\\\\377\\\\010\\\\321\\\\005Z\\\\262\\\\021k0\\\\377H\042\\\\0200$@\\\\020L(c\\\\034a\\\\234\\\\266\\\\3030b\\\\234+e\\\\232\\\\246Z\\\\317\\\\347\\\\377\\\\313\\\\277\\\\370\\\\223\\\\177\\\\360\\\\333\\\\337\\\\377\\\\336\\\\367\\\\277\\\\253L\\\\023\\\\206a \\\\303Y6M\\\\222\\\\344\\\\332\\\\265k\\\\333\\\\333\\\\333\\\\344\\\\\\\\\\\\020\\\\210@\\\\260\042[)Ci\\\\253\\\\007\\\\304.\\\\326\\\\306\\\\326\\\\317\\\\237\\\\260\\\\311Y4\\\\215RB\\\\2628\\\\016\\\\011Qk]\\\\226\\\\025\\\\227\\\\243O\\\\357\\\\335\\\\273\\\\367\\\\370\\\\270\\\\261@\\\\204\\\\266\\\\256,\\\\343T\\\\345\\\\021\\\\031N\\\\316\\\\221#\\\\003\\\\276W\\\\346\\\\2343\\\\344\\\\3066\\\\366b\\\\023E\\\\317-A\\\\375u|Y\\\\005\\\\214s~\\\\361\\\\347\\\\234\\\\263V\\\\011\\\\301f\\\\263\\\\363\\\\376\\\\013\\\\375\\\\327\\\\276\\\\371\\\\352\\\\375\\\\373\\\\367\\\\037=\\\\232p\\\\001Y\\\\256\\\\214>\\\\353u\\\\332\\\\221\\\\014\\\\3019\\\\316x\\\\024\\\\005\\\\234\\\\030\\\\022H\\\\007\\\\350,\\\\327\\\\326)\\\\215\\\\312\\\\2002R\\\\004\\\\300\\\\2218\\\\203 P\\\\310U\\\\243\\\\227e\\\\261\\\\310+\\\\331\\\\0320\\\\306\\\\200\\\\361\\\\006\\\\251&R\\\\316\\\\201\\\\323\\\\010\\\\316Y\\\\315E\\\\010\\\\004Vip\\\\030\\\\244\\\\255N\\\\273\\\\227$m.\\\\343\\\\223\\\\243c\\\\316y\\\\257\\\\323\\\\215\\\\242\\\\350\\\\353_\\\\377\\\\372\\\\213w\\\\356\\\\030cTU\\\\317f\\\\263\\\\313\\\\005\\\\234w\\\\240%k\\\\305\\\\346\\\\276\\\\363o\\\\276\\\\377\\\\235.\\\\336\\\\343\\\\277\\\\363\\\\313_\\\\364$L0\\\\367\\\\374j\\\\003\\\\321\\\\203\\\\003\\\\326\\\\0372\\\\306\\\\020\\\\220\\\\030z\\\\266\012\\\\007Dg\\\\231\\\\257\\\\373~y|\\\\201\\\\311\\\\333\\\\213\\\\231\\\\017\\\\361\\\\253\\\\372\\\\212\\\\310\\\\244\\\\020\\\\227\\\\233\\\\210\\\\347G@\\\\317\\\\345p\\\\366\\\\253\\\\362\\\\351\\\\337$\\\\306\\\\270\\\\337\\\\305\\\\021\\\\363{9\\\\177\\\\3278\\\\006\\\\334\\\\241\\\\365c\\\\252\\\\377?D\\\\014\\\\001\\\\001\\\\210\\\\341\\\\206Zt\\\\321\\\\374y\\\\246\\\\324\\\\006\\\\215y~\\\\321c\\\\201\\\\214%`\\\\033\\\\254\\\\003\\\\374\\\\243\\\\011\\\\233\\\\222V\\\\024\\\\205\\\\224\\\\241\\\\227\\\\374\\\\024eM\\\\204\\\\314\\\\331\\\\363\\\\303g\\\\256V\\\\017~\\\\375\\\\311\\\\0137\\\\257\\\\277\\\\372\\\\033\\\\337Z\\\\347\\\\331\\\\323\\\\247Oo\\\\336\\\\270Q\\\\227\\\\025#h\\\\352\\\\232s.\\\\004\\\\003\\\\206a\\\\030jKJ\\\\177\\\\365/\\\\311\\\\320\\\\357b6\\\\251yM\\\\255\\\\000 JZ\\\\332\\\\230F\\\\3514M[Q\\\\362\\\\353O'\\\\177\\\\375\\\\213\\\\017A\\\\246e\\\\265\\\\000\\\\007\\\\316j[\\\\026-\\\\311Yc\\\\321i\\\\016dt\\\\3439C!c\\\\204\\\\233\\\\304:O\\\\313\\\\271\\\\274\\\\313\\\\274\\\\020\\\\317\\\\227g\\\\267\\\\341\\\\234\\\\370\\\\247\\\\010\\\\254\\\\265US\\\\245\\\\355\\\\2267\\\\325\\\\356v\\\\323\\\\353\\\\327\\\\257\\\\356\\\\354\\\\214\\\\036<x`\\\\264v\\\\306)]\\\\206\\\\222\\\\267\\\\332i(\\\\003\\\\311\\\\244d\\\\034j\\\\243\\\\252\\\\332\\\\324\\\\312*\\\\003\\\\306\\\\242#\\\\3169\\\\023\\\\034e@\\\\222W\\\\316\\\\255\\\\363\042k\\\\232\\\\322j\\\\315D\\\\330\\\\353+`\\\\2155\\\\312\\\\031K\\\\210\\\\2349K\\\\3164\\\\214s\\\\262\\\\272n\\\\014\\\\030\\\\033%I\\\\257?\\\\212\\\\242\\\\310Z\\\\227\\\\227+\042J\\\\222\\\\344\\\\356\\\\335\\\\273/\\\\275|7\\\\014\\\\303\\\\345rYU\\\\325t:\\\\215\\\\343\\\\270\\\\250+)e\\\\253\\\\325\\\\312\\\\262l\\\\235g\\\\303\\\\341P0\\\\330\\\\200\\\\235\\\\233k\\\\365\\\\342\\\\343\\\\371#\\\\353.\\\\360\\\\363\\\\315 \\\\006\\\\227,<\\\\006\\\\027\\\\345\\\\330\\\\371\\\\014\\\\217\\\\313\\\\225\\\\027\\\\200\\\\177(\\\\220\\\\010a\\\\263o\\\\244\\\\015\\\\325P\\\\370\\\\031\\\\004\\\\021\\\\035\\\\020\\\\0001\\\\334,\\\\316\\\\010\\\\010\\\\030\\\\363\\\\371\\\\336\\\\264\\\\201\\\\344\\\\310\\\\277l\\\\226e_u\\\\010\\\\300\\\\361b1n\\\\255c\\\\233>\\\\311\\\\241\\\\377\\\\241\\\\000\\\\035\\\\020\\\\337\\\\3049\\\\023cx\\\\221(\\\\016\\\\036z\\\\263\\\\200\\\\376\\\\020\\\\303\\\\3056\\\\007\\\\021\\\\2759\\\\311%\\\\010\\\\270\\\\301d\\\\234\\\\345B\\\\240\\\\273\\\\020\\\\203:\042\\\\262\\\\233G\\\\223\\\\320\\\\352fs\\\\356\\\\255\\\\035\\\\017\\\\372Q\\\\224\\\\024\\\\263\\\\371\\\\321lq\\\\320\\\\356\\\\275t\\\\375\\\\306\\\\335\\\\253\\\\327g'g \\\\370\\\\255\\\\2337\\\\275G\\\\231o\\\\231Z\\\\255\\\\0262VU\\\\225\\\\266V[\\\\267\\\\361\\\\263%\\\\000$\\\\007p\\\\371\\\\017o-\\\\241\\\\214\\\\244\\\\224<\\\\210\\\\313\\\\272\\\\260(\\\\035\\\\013N\\\\317\\\\327?{\\\\377\\\\327\\\\217\\\\216\\\\347i\\\\277\\\\253-\\\\242u!\\\\347N\\\\327A\\\\310\\\\235\\\\323@J\\\\004\\\\3204J\\\\010Ad\\\\031c\\\\236qqy\\\\232/\\\\337S\\\\242\\\\213\\\\375\\\\212\\\\277J}\\\\243\\\\303@J\\\\336j\\\\265\\\\010\\\\235\\\\020l0\\\\350i\\\\335\\\\224\\\\325\\\\232s\\\\271\\\\273\\\\267\\\\275\\\\277\\\\267\\\\343\\\\234Su\\\\243\\\\252\\\\032\\\\211\\\\011!\\\\030\\\\200Q\\\\272\\\\236\\\\227\\\\332\\\\030\\\\247\\\\224Q\\\\015i\\\\313\\\\000\\\\204\\\\024\\\\2141\\\\345\\\\3108\\\\255jSX\\\\273,\\\\353\\\\2024\\\\023\\\\241lu)H\\\\2145\\\\265\\\\326FY\\\\000\\\\000\\\\316\\\\0216\\\\255\\\\2511\\\\006\\\\210\\\\2024\\\\351t\\\\007Q\\\\222\\\\002\\\\200iL\\\\030F\\\\243\\\\321\\\\350\\\\225\\\\257\\\\177\\\\355\\\\340\\\\340`\\\\265Z=z\\\\364\\\\250i\\\\032D\\\\254\\\\352z\\\\275^\\\\207a\\\\230F\\\\361\\\\203\\\\007\\\\017\\\\222$\\\\341\\\\310N\\\\216\\\\216\\\\205\\\\307\\\\304/\\\\016\\\\250\\\\277\\\\237\\\\031^\\\\312h.\\\\346\\\\305M}\\\\276\\\\240}=WS7\\\\3739\\\\177\\\\274\\\\210<\\\\357z\\\\263\\\\260#\\\\004\\\\346\\\\034\\\\371\\\\003\\\\207@\\\\316w\\\\032D~\\\\230D\\\\377J>\\\\225hsI(e\\\\030w\\\\034\\\\320\\\\0029m\\\\0149\\\\201\\\\002\\\\030\\\\013\\\\303\\\\320\\\\301\\\\306r\\\\207\\\\203\\\\317P\\\\364/o\\\\000\\\\340\\\\002l\\\\335\\\\3748\\\\214\\\\200\\\\300\\\\241\\\\337\\\\352\\\\0011\\\\000\\\\002d\\\\340\\\\243\\\\373\\\\276\\\\032\\\\211\\\\330\\\\305\\\\322\\\\321\\\\347^n\\\\224\\\\007Bxz \042\\\\242ABb\\\\036+\\\\361\\\\350*l\\\\236\\\\032.\\\\003\\\\000\\\\010\\\\343\\\\024\\\\211B.Zq|\\\\357\\\\263/\\\\376\\\\365\\\\237\\\\375\\\\357\\\\331\\\\323g\\\\377\\\\360G\\\\277;<\\\\330\\\\207\\\\262I\\\\243p\\\\335\\\\324\\\\263\\\\363)\\\\227B0\\\\31697Z\\\\027E\\\\261Z\\\\257\\\\027\\\\353\\\\325pk\\\\324\\\\351v/v\\\\305\\\\340\\\\227c\\\\016\\\\300G;#\\\\343\\\\202\\\\013\\\\024\\\\201\\\\243PF\042\\\\215\\\\343\\\\331t\\\\361o\\\\377\\\\335O?\\\\277\\\\177.\\\\342\\\\366\\\\252h\\\\204\\\\014\\\\233r\\\\025!p\\\\253\\\\253,\\\\217@;\\\\247E\\\\0308\\\\347x \\\\375\\\\340b\\\\255\\\\205\\\\257\\\\006\\\\215\\\\015\\\\350\\\\344=\\\\276\\\\234s\\\\264\\\\331\\\\364\\\\373*\\\\016\\\\234#\\\\223b\\\\271^\\\\001\\\\270\\\\262,\\\\271@\\\\031p!cD<==\\\\341\\\\310\\\\030\\\\242@\\\\306\\\\000\\\\215\\\\325e\\\\2766\\\\306p\\\\213&\\\\327NiSkk-\\\\000\\\\021g\\\\310\\\\031\\\\011\\\\221\\\\327M^V\\\\225q\\\\032yMd@\\\\206A,\\\\243v\\\\321h\\\\215H \\\\300*p\\\\032\\\\214E\\\\301\\\\031c\\\\316X\\\\000\\\\313\\\\203\\\\250\\\\335\\\\351\\\\305i\\\\313\\\\001\\\\032c\\\\010\\\\331+\\\\257\\\\274\\\\362\\\\372\\\\353\\\\257kk>\\\\372\\\\350\\\\243\\\\345r\\\\351\\\\234\\\\253\\\\252\012\\\\000\\\\212\\\\262\\\\034\\\\014\\\\006gggggg\\\\225j\\\\204\\\\020\\\\353\\\\365ZJ)\\\\340\\\\242\\\\3245M\\\\223\\\\246iQ\\\\024A\\\\020Xc\\\\245\\\\014\\\\363|=\\\\034n\\\\025E\\\\301\\\\271\\\\337\\\\004\\\\201\\\\340\\\\274n\\\\252(\\\\010=\\\\006\\\\027\\\\206\\\\221R\\\\252i\\\\232 \\\\0149\\\\343Y\\\\226\\\\305q\\\\352k\\\\201\\\\224\\\\242\\\\256U\\\\034\\\\006\\\\204.\\\\214b\\\\243T\\\\243\\\\3530\\\\014\\\\205\\\\360\\\\204U\\\\014\\\\242 \\\\313\\\\363\\\\321h\\\\253\\\\252\\\\032G\\\\224\\\\246\\\\235\\\\325*Kc\\\\331\\\\324\\\\315\\\\240\\\\333+\\\\262\\\\334\\\\022\\\\311 \\\\262Z1\\\\036(\\\\243=D\\\\002\\\\000\\\\326Ym4\\\\343\\\\034\\\\245\\\\024\\\\202\\\\2031\\\\034\\\\010\\\\200\\\\2228R\\\\312X\\\\253\\\\30304\\\\344\\\\232\\\\246q\\\\316\\\\010\\\\021DQ\\\\210\\\\004Y\\\\2213\\\\300n\\\\277\\\\227\\\\227\\\\265'\042\\\\206aX\\\\327u\\\\024EF)\\\\277\\\\364\\\\011\\\\202@\\\\325M\\\\034\\\\305J)\\\\311\\\\2051V\\\\010f\\\\235\\\\216\\\\303P\\\\020\\\\326\\\\265b\\\\214'Ib,ee!$\\\\217\\\\222\\\\226\\\\325ZrQf\\\\353\\\\330\\\\301\\\\237\\\\376O\\\\377\\\\243Y\\\\256\\\\257\\\\306\\\\235\\\\374\\\\311\\\\321\\\\374t\\\\2625\\\\030F\\\\333a+\\\\214\\\\025@\\\\020G\\\\246\\\\321\\\\000\\\\030\\\\006\\\\321b\\\\265|\\\\357\\\\203\\\\017\\\\252\\\\246\\\\352\\\\234\\\\365\\\\243(\\\\032\\\\366\\\\372\\\\203a\\\\257\\\\333\\\\355r\\\\316\\\\233\\\\252IZ\\\\351\\\\371d\\\\035\\\\245\\\\011g\\\\354\\\\354x\\\\372\\\\354\\\\344\\\\304YV\\\\325\\\\272(\\\\325z\\\\235\\\\377\\\\362\\\\303/(\\\\332\\\\256\\\\034X\042\\\\347\\\\2001\\\\000g\\\\221\\\\\\\\$8\\\\252ZJ^\\\\325\\\\225\\\\347L\\\\010.\\\\253\\\\252b\\\\200\\\\326Y{\\\\361\\\\240o@h\\\\330tV\\\\312hK\\\\300\\\\330\\\\305\\\\335\\\\205\\\\233\\\\307\\\\273\\\\252\\\\252\\\\235\\\\3351\\\\003\\\\264\\\\326\042\\\\202`\\\\242\\\\225\\\\306\\\\0140\\\\3132@&\\\\030o\\\\312\\\\032\\\\001\\\\004\\\\343MQ\\\\201v\\\\272RJ\\\\031\\\\307Q$!1\\\\\\\\6*\\\\3173\\\\355X\\\\355L\\\\203h\\\\221YD\\\\207\\\\022e(d\\\\354\\\\230\\\\314\\\\326\\\\031\\\\370\\\\264jK\\\\200$8\\\\032m\\\\002\\\\0314J\\\\265\\\\372\\\\235 \\\\211Q\012\\\\243M\\\\230\\\\244\\\\337\\\\375\\\\356w\\\\343(\\\\370\\\\350\\\\327\\\\037\\\\257\\\\327\\\\353\\\\351t\\\\3526m\\\\236\\\\364:\\\\211\\\\331l\\\\346\\\\234\\\\253\\\\353z{{\\\\373\\\\311\\\\303G\\\\243\\\\321H\\\\327\\\\215\\\\000\\\\360\\\\234\\\\013\\\\020\\\\201\\\\004\\\\000\\\\021\\\\204L\\\\010\\\\031F\\\\326P\\\\020\\\\305\\\\004,N\\\\023k\\\\255\\\\266\\\\3261f\\\\311Ea\\\\314\\\\020\\\\214\\\\261Z\\\\033\\\\242\\\\032\\\\231\\\\220\042\\\\264\\\\226\\\\264V\\\\355\\\\316\\\\240\\\\252*cl\\\\247\\\\323i\\\\214\\\\016$\\\\023\\\\201\\\\324\\\\015\\\\025U\\\\335\\\\355v#H}\\\\310q\\\\234&\\\\336\\\\036\\\\356\\\\370\\\\354\\\\354\\\\337\\\\376\\\\305\\\\333\\\\237}\\\\366\\\\305\\\\335\\\\273w\\\\001\\\\371\\\\371dr\\\\355\\\\332\\\\225[7\\\\256l\\\\215\\\\007\\\\201\\\\010\\\\0011\\\\014\\\\202 \\\\014\\\\231\\\\340\\\\350,\\\\000\\\\313\\\\213\\\\022\\\\034%\\\\255\\\\264\\\\325N\\\\215\\\\263FYm\\\\232$\\\\010\\\\030RY\\\\326\\\\322Y\\\\013VF\\\\241q\\\\256,\\\\313~\\\\277Od\\\\313\\\\262\\\\254\\\\313\\\\312:\\\\315\\\\031\\\\223R<}\\\\372\\\\264\\\\335\\\\355_\\\\222\\\\3706\\\\331\\\\020\\\\214I)\\\\275~\\\\026\\\\011.\\\\301;\\\\316\\\\271sFrQ\\\\346y\\\\310d\\\\247\\\\335EbY\\\\221+my\\\\020-\\\\327\\\\371pkT\\\\226\\\\265 \\\\334\\\\033o\\\\375\\\\311\\\\377\\\\360\\\\317\\\\\\\\\\\\231\\\\207\\\\326E\\\\215\\\\241\\\\254BGO\\\\357\\\\337\\\\177u\\\\177\\\\317\\\\240\\\\011\\\\203\\\\240\\\\254jO\\\\023\\\\000\\\\306\\\\266\\\\266\\\\266~\\\\370\\\\303\\\\037\\\\002gES\\\\213H\012\\\\302(\012V\\\\253\\\\325\\\\361\\\\323\\\\247o\\\\277\\\\375\\\\366\\\\257~\\\\365\\\\341\\\\356\\\\336\\\\376\\\\316\\\\316^\\\\030\\\\267\\\\017\\\\237\\\\235T\\\\265m4\\\\355\\\\356]\\\\3432\\\\376\\\\362\\\\213\\\\007<\\\\3524\\\\216\\\\031\\\\353\\\\234\\\\277*\\\\3112r\\\\314\\\\331\\\\347h\\\\013\\\\027w\\\\335\\\\305\\\\207\\\\275$'\\\\372\\\\201\\\\301\\\\207^9\\\\362\\\\3353\\\\370\\\\357\\\\247\\\\347[\\\\035\\\\313\\\\005z\\\\322\\\\030\0420\\\\006\\\\214\\\\203\\\\224\\\\262\\\\251\\\\312^\\\\273e\\\\2653J\\\\265[- ,\\\\362\\\\\\\\+\\\\333\\\\344\\\\265`RD\\\\322 \\\\025\\\\246)\\\\215\\\\252\\\\215UH\012\\\\254b\\\\240\\\\211\\\\003!p\\\\211\\\\\\\\2\\\\021\\\\021\\\\240\\\\265V2n\\\\264&g8\\\\010\\\\301\\\\031\\\\030\042e\\\\033]v\\\\206[Q\\\\022\\\\247\\\\355\\\\326|\\\\231mo\\\\357~\\\\373\\\\215\\\\267\\\\216\\\\216\\\\216\\\\326\\\\313\\\\371b1s\\\\326\\\\226\\\\236\\\\305\\\\252\\\\024\\\\000\\\\370h{\\\\237t\\\\023\\\\206\\\\341\\\\323\\\\247O=%p\\\\177\\\\177_\\\\024U\\\\331\\\\211z\\\\340\\\\260\\\\321\\\\252i\\\\2120N\\\\033mA\\\\333\\\\341p\\\\253(\\\\262e\\\\226GI\\\\350\\\\0341.\\\\030\\\\347\\\\336U\\\\007\\\\311\\\\011\\\\021 \\\\243\\\\272i\\\\010l\\\\030\\\\004\\\\310x\\\\236\\\\255\\\\302\\\\264C\\\\214\\\\307\\\\255\\\\370\\\\361\\\\3413\\\\002\\\\030\\\\015F\\\\246\\\\322\\\\255V\\\\212\\\\214*\\\\255\\\\233\\\\246\\\\331\\\\332\\\\332r\\\\316\\\\017\\\\340\\\\370\\\\347\\\\377\\\\372_\\\\377\\\\331\\\\237\\\\375?\\\\275^\\\\310\\\\271\\\\374\\\\345;\\\\357\\\\355\\\\036\\\\034\\\\354l\\\\215\\\\377\\\\352?\\\\374\\\\365\\\\361\\\\361\\\\215 \\\\344\\\\355\\\\244Uk\\\\205\\\\216\\\\306\\\\273;\\\\327\\\\257\\\\\\\\\\\\335\\\\332\\\\331\\\\256\\\\362\0129o\\\\247)\\\\023\\\\201\\\\003\\\\324\\\\226\\\\000\\\\230\\\\010DV\\\\225\\\\355V\\\\312\\\\202\\\\240\\\\261N\\\\325J\\\\033\\\\227$I\\\\267\\\\3373\\\\3162\\\\306\\\\222V*\\\\204\\\\230\\\\317\\\\347eU\\\\017\\\\223\\\\326x<\\\\266\\\\204\\\\306Ym\\\\0153z\\\\343yb\\\\255\\\\326\\\\032\\\\361+A\\\\212\\\\037\012\\\\003.\\\\254#\\\\255\\\\3538\\\\014\\\\235v\\\\347gS@\\\\236\\\\266\\\\272I+\\\\250\\\\215\\\\335\\\\277\\\\262\\\\363\\\\370\\\\311\\\\303v\\\\232p.\\\\237<x\\\\370\\\\344\\\\301\\\\375q\\\\247{\\\\260\\\\327;\\\\020\\\\255X\\\\204\\\\017\\\\227\\\\323\\\\371\\\\344<\\\\211\\\\343\\\\343\\\\311\\\\351\\\\376\\\\255q~6\\\\221A\\\\244\\\\033\\\\325\\\\212\\\\343\\\\303\\\\343Cm\\\\215r6\\\\351\\\\266W\\\\363\\\\351\\\\331\\\\351\\\\311\\\\240\\\\333{\\\\377\\\\303\\\\017\\\\246\\\\323)c\\\\2543\\\\030\\\\334~\\\\371\\\\345\\\\363\\\\311B\\\\225\\\\252\\\\277\\\\265k\\\\027\\\\00558_\\\\353\\\\331b^*\\\\306\\\\001\\\\254\\\\264\\\\032\\\\010\\\\321\\\\001Y$B\\\\260\\\\200\\\\226\\\\300y\\\\336\\\\233\\\\275h\\\\005\\\\301C\\\\201\\\\340\\\\254\\\\265\\\\2266\\\\376\\\\032\\\\276\\\\017\\\\331p\\\\340.\\\\366\\\\255\\\\233\\\\006\\\\214m\\\\376\\\\226\\\\265\\\\226\\\\013\\\\356\\\\037?o\\\\215\\\\003\\\\000\\\\214A\\\\030\\\\206\\\\355$\\\\255\\\\313F\\\\003\\\\017eX\\\\344\\\\371z\\\\261n*c\\\\035#&\\\\020\\\\241r&\\\\327\\\\266\\\\320\\\\246&c\\\\020\\\\265#\\\\357\\\\001\\\\015\\\\026\\\\000Q\\\\204\\\\011\\\\223\\\\001\\\\021\\\\231\\\\272f^Bk\\\\254\\\\010C\\\\016\\\\\\\\\\\\033C\\\\204\\\\300\\\\330pk\\\\\\\\i\\\\263\\\\314\\\\213\\\\337\\\\374\\\\366\\\\033\\\\275\\\\356\\\\340W\\\\037~\\\\260\\\\230\\\\315\\\\035\\\\231\\\\252\\\\252$\\\\343\\\\215\\\\321\\\\000Z)%\\\\215\\\\365\\\\346\\\\256YY\\\\305q\\\\334\\\\030;\\\\332\\\\336\\\\261\\\\326\\\\032\\\\202\\\\343\\\\263\\\\211\\\\370W\\\\377\\\\346\\\\377\\\\036\\\\215FZ\\\\333<\\\\317\\\\203 z\\\\365\\\\325W\\\\273\\\\235~\\\\230\\\\304_\\\\276\\\\363K\\\\306\\\\230R\\\\372\\\\352\\\\325+\\\\000\\\\300%\\\\213\\\\242\\\\010\\\\0341Gdl\\\\302Q\\\\312@9$\\\\347\\\\034\\\\343\\\\332\\\\330\\\\355\\\\375+\\\\253<\\\\373\\\\237\\\\377\\\\371\\\\237\\\\236\\\\236\\\\236\\\\256\\\\327\\\\353\\\\361xL\\\\204w\\\\356\\\\334\\\\356tS\\\\255\\\\233\\\\203\\\\203\\\\203;w\\\\356\\\\224J\\\\267\\\\333\\\\355\\\\303\\\\303\\\\303\\\\237\\\\376\\\\364\\\\247\\\\357\\\\276\\\\373\\\\336\\\\033\\\\337\\\\371\\\\226`\\\\374\\\\360\\\\350\\\\270\\\\235\\\\266\\\\215\\\\265\\\\247\\\\223\\\\351\\\\213w\\\\357\012F\\\\313\\\\3252\\\\010\\\\223V\\\\273k\\\\255]\\\\255\\\\313\\\\277\\\\371\\\\305\\\\273\\\\2141k\\\\2557\\\\235I\\\\342\\\\326\\\\336\\\\336\\\\336x<\\\\216\\\\343\\\\230\\\\300no\\\\215\\\\237\\\\235\\\\236\\\\021Q\\\\253\\\\325\\\\272~\\\\365\\\\000\\\\000\\\\202(Ru\\\\223v\\\\332EQ 9$\\\\354\\\\017\\\\267\\\\224RUUq\\\\316\\\\011\\\\2011vi4\\\\241\\\\265\\\\276\\\\204\\\\311\\\\254\\\\265\\\\027\\\\216@X\\\\3275\\\\031\\\\353i\\\\220EQp\\\\220I\\\\332\\\\346\042V\\\\006TC \\\\344\\\\223\\\\223\\\\363?\\\\373W\\\\377\\\\246\\\\027G?\\\\372\\\\217\\\\276\\\\337\\\\024\\\\325?\\\\372\\\\303?x\\\\357/\\\\377*\\\\237\\\\314\\\\372/\\\\354Ym\\\\3428\\\\376\\\\336\\\\367\\\\276\\\\377\\\\311\\\\027\\\\237\\\\377\\\\345{\\\\277T\\\\377\\\\236\\\\337|\\\\361\\\\316\\\\365+W?\\\\377\\\\354\\\\263/>\\\\373\\\\362\\\\265\\\\327\\\\276\\\\361\\\\316{\\\\357\\\\356_;XV\\\\371\\\\207\\\\037}4\\\\350\\\\367\\\\337x\\\\343\\\\215\\\\305*\\\\277\\\\377\\\\360\\\\311`0xv2\\\\271\\\\236\\\\325 \\\\303u\\\\251\\\\270\\\\020Q\\\\322\\\\355m\\\\015\\\\036=9>_\\\\226\\\\243\\\\255m\\\\345@\\\\031k\\\\310q\\\\341\\\\000\\\\034G\\\\257\\\\370r~\\\\022\\\\367\\\\350\\\\223%D@\\\\211\\\\317\\\\245\\\\\\\\m\\\\266N~\\\\374'\\\\3320\\\\3406\\\\345\\\\031\\\\375\012\\\\354\\\\202O\\\\002\\\\000\\\\336\\\\255\\\\375rXr\\\\316\\\\221uq\\\\020jm9p\\\\231\\\\004V\\\\351\\\\371l\\\\271^\\\\345\\\\202\\\\307\042Ik\\\\345\\\\352\\\\252iHk \\\\313\\\\2055\\\\244\\\\255\\\\001\\\\002\\\\340\\\\236\\\\022\\\\014\\\\300\\\\004\\\\017B\\\\344B;k\\\\214b\\\\004\\\\344\\\\014\042\\\\223\\\\214[c\\\\255\\\\265Q\\\\332\\\\332\\\\271zp6\\\\233\\\\037\\\\\\\\\\\\277\\\\361\\\\265\\\\257\\\\177c:\\\\231}\\\\362\\\\363\\\\277e\\\\304\\\\232\\\\246q^K\\\\205\\\\340\\\\035 \\\\374\\\\345y\\\\271\\\\011\012\\\\202`\\\\261X\\\\244i\\\\352\\\\234\\\\3631@\\\\0028\\\\313\\\\312\\\\242itY\\\\324v]\\\\376\\\\372\\\\363/\\\\234\\\\2454Mwww\\\\353\\\\2728=\\\\235\\\\234\\\\236O\\\\226\\\\313e\\\\020\\\\312+W\\\\256\\\\214F\\\\243\\\\275\\\\361\\\\216HB'ea\\\\214!J[-c\\\\355t:\\\\377\\\\331/\\\\337\\\\371\\\\360\\\\343\\\\217\\\\236=;F\\\\316\\\\025\\\\260\\\\332\\\\001\\\\221\\\\373\\\\362\\\\361\\\\343V\\\\022q\\\\216\\\\357\\\\177\\\\370\\\\361\\\\325\\\\217?\\\\331?\\\\330\\\\353\\\\365z\\\\017\\\\036\\\\334\\\\253\\\\353\\\\032\\\\205\\\\254\\\\225~\\\\372\\\\370~^\\\\224E\\\\253\\\\034\\\\357\\\\354\\\\032\\\\245\\\\365bu\\\\345\\\\352^l-r\\\\231\\\\227u]\\\\327Q\\\\224\\\\204q\\\\352\\\\215;\\\\342\\\\264]UUQ\\\\224\\\\277\\\\376\\\\354\\\\263\\\\342\\\\335w\\\\203 h\\\\265\\\\333\\\\207\\\\207\\\\207\\\\210\\\\270\\\\263\\\\273\\\\035\\\\206\\\\341\\\\255\\\\0337\\\\237>}\\\\272\\\\275\\\\275\\\\325J\\\\222^\\\\257\\\\263\\\\275\\\\275\\\\275\\\\267\\\\273]\\\\226\\\\345\\\\260\\\\327\\\\037\\\\014\\\\006\\\\266\\\\252\\\\207\\\\303Q\\\\236\\\\255\\\\374}Z\\\\327uS\\\\325eYz\\\\256HS\\\\024\\\\276u\\\\216\\\\242(\\\\340\\\\242i\\\\032\\\\316y\\\\030I\\\\031\\\\305\\\\316\\\\201V\\\\224\\\\227&\\\\317g\\\\232D\\\\324\\\\356\\\\266\\\\006\\\\235\\\\177\\\\361'\\\\377\\\\353g\\\\237\\\\336\\\\357D\\\\241@\\\\261xx\\\\377J'y\\\\366\\\\370\\\\311\\\\353/\\\\336\\\\225\\\\222\\\\357\\\\356\\\\357S\\\\261~\\\\357\\\\343\\\\017\\\\377\\\\217\\\\237\\\\376\\\\345?\\\\375\\\\357\\\\377\\\\273\\\\277\\\\372\\\\371/\\\\036\\\\035\\\\035fU\\\\375\\\\263\\\\277\\\\371Y\\\\271\\\\312\\\\277\\\\366\\\\265\\\\257\\\\355\\\\355\\\\036\\\\274\\\\375\\\\366_vF\\\\203\\\\371|}v\\\\276||8\\\\011\\\\002\\\\321\\\\353\\\\215\\\\366\\\\256^?=_\\\\257\\\\313\\\\006\\\\231\\\\264$\\\\037?}\\\\266\\\\263w\\\\275\\\\312\\\\312\\\\274R\\\\016\\\\305\\\\323\\\\343I\\\\177kl\\\\214qh\\\\005\\\\021G\\\\213h=H\\\\345\\\\231\\\\232\\\\026\\\\230u>\\\\004\\\\331o\\\\001-Ywy\\\\232/\\\\367\\\\301\\\\364\\\\374\\\\274\\\\357g]\\\\330\\\\200x\\\\226\\\\034n\\\\250\\\\360d\\\\214\\\\361dup\\\\004\\\\300\\\\214qu]\\\\247A\\\\202\\\\210\\\\213yV\\\\024M\\\\030$\\\\204aM\\\\254 [\\\\032\\\\353\\\\215\\\\247\\\\034n\\\\256\\\\015@\\\\006\\\\216\\\\0010\\\\000\\\\006B\\\\242\\\\024\\\\216\\\\2431\\\\206\\\\013\\\\346\\\\264B\\\\004\\\\301\\\\031\\\\000(k\\\\230\\\\220\\\\235n\\\\277n\\\\354\\\\327^\\\\373\\\\346\\\\355\\\\027\\\\357\\\\274\\\\363\\\\336\\\\273\\\\347g\\\\323A\\\\257\\\\377\\\\354\\\\361\\\\023\\\\357\\\\253\\\\017\\\\210\\\\216\\\\010\\\\021\\\\225\\\\326\\\\2141\\\\2455\\\\021\\\\011\\\\242N\\\\267\\\\033\\\\204\\\\341\\\\213w\\\\356p\\\\316\\\\257_\\\\277\\\\3364\\\\315\\\\366\\\\3666\\\\376\\\\356\\\\017^].\\\\327\\\\202\\\\007q\\\\034s.\\\\215u\\\\313\\\\345r4\\\\032\\\\013!\\\\326EN\\\\306\\\\016\\\\307[\\\\210h\\\\234\\\\016e \\\\245\\\\340\\\\300\\\\372\\\\375\\\\276\\\\265\\\\366\\\\311\\\\223\\\\303\\\\331l\\\\026\\\\304\\\\221R\\\\352\\\\350\\\\370)\\\\355\\\\340\\\\260\\\\000\\\\000 \\\\000IDATt8\\\\034.\\\\026\\\\253\\\\301h\\\\264^g\\\\373\\\\373\\\\373GGG\\\\306\\\\322\\\\356\\\\316x4\\\\350\\\\316\\\\347s\\\\255\\\\365\\\\265kW\\\\362<\\\\347\\\\002\\\\255\\\\265\\\\335v[)\\\\315\\\\010\\\\216\\\\217\\\\217;\\\\235\\\\316d2m\\\\267\\\\333i\\\\332v\\\\316\\\\010\\\\301d B\\\\021\\\\256\\\\362U\\\\225Wq\\\\232\\\\004B\\\\022B\\\\277\\\\333;\\\\237M\\\\255v\\\\275A?\\\\020r\\\\235g\\\\316\\\\330\\\\244\\\\225\\\\236/\\\\226O\\\\217\\\\236i\\\\335\\\\220\\\\261/\\\\275\\\\364\\\\322\\\\347\\\\237}\\\\026\\\\206\\\\222\\\\003n\\\\215\\\\206\\\\316\\\\271N+m\\\\267\\\\333\\\\257~\\\\375\\\\353\\\\333\\\\333\\\\333\\\\247\\\\247\\\\307\\\\275n\\\\373\\\\033\\\\257\\\\274bt\\\\203\\\\210\\\\316\\\\2718\\\\214<\\\\211Okmu\\\\343\\\\235(\\\\030c\\\\241\\\\3300\\\\207d\\\\024\\\\326\\\\2522\\\\306\\\\251\\\\206\\\\220%\\\\255\\\\366\\\\250q\\\\374\\\\303/\\\\276|\\\\357\\\\343\\\\217\\\\213\\\\262\\\\374\\\\340\\\\303\\\\367\\\\376\\\\213\\\\177\\\\374G\\\\273\\\\255\\\\010\\\\027\\\\347q]\\\\376\\\\362/\\\\376\\\\342\\\\332`t\\\\320\\\\0337\\\\216&V]\\\\377\\\\315\\\\327\\\\356\\\\257g\\\\361\\\\356\\\\366\\\\356\\\\315[I\\\\332\\\\316\\\\027\\\\353\\\\233\\\\007W\\\\357}\\\\366\\\\271\\\\217\\\\0243\\\\350\\\\242V\\\\372\\\\213w\\\\337]d\\\\365\\\\027\\\\367\\\\036^\\\\331\\\\333\\\\335\\\\332\\\\331^\\\\257\\\\327\\\\357\\\\177\\\\360\\\\2538J5\\\\301b\\\\231\\\\367F;\\\\200\\\\301t\\\\2265\012jE\\\\332@\\\\1770\\\\254\\\\353\\\\212\\\\270\\\\015%\\\\230j\\\\305\\\\252,\\\\261\\\\215,\\\\362\\\\004\\\\000\\\\234A\\\\201\\\\2051\\\\025\\\\2310\\\\212\042!Q[g\\\\264\\\\002\\\\347\\\\300\\\\032\\\\272\\\\3507.\\\\326\\\\340\\\\306\\\\221G\\\\230,l\\\\326\\\\017\\\\2143!9c\\\\254\\\\335N\\\\007\\\\303^\\\\267\\\\333N\\\\222XJ\\\\351sW\\\\300:g(\\\\222a\\\\221\\\\225\\\\207O\\\\216u\\\\245$\\\\017\\\\326\\\\265\\\\236)0\\\\0308g\\\\234\\\\325\\\\326j\\\\317T#\\\\004@\\\\016\\\\214\\\\023p@\\\\206I'nu\\\\231\\\\220\\\\272\\\\251\\\\235U\\\\246\\\\256HY\\\\306$\\\\003\\\\346\\\\210\\\\247\\\\335\\\\336ho\\\\357\\\\352\\\\013\\\\267@\\\\360\\\\217?\\\\377\\\\224\\\\241`\\\\216\\\\226\\\\363\\\\305\\\\301\\\\326v]\\\\3272\012\\\\323Vk8\\\\034\\\\356\\\\356\\\\356\\\\246i\\\\272\\\\275\\\\275\\\\235\\\\246\\\\251\\\\307\\\\240\\\\222$\\\\271\\\\274Z\\\\3030\\\\234\\\\315f\\\\000 :\\\\335\\\\376t\\\\2660\\\\266QFw\\\\273}CN\\\\204Q\\\\322\\\\352 \\\\242Z\\\\256$\\\\027U]\\\\207aX\\\\326\\\\365z\\\\275f\\\\214\\\\035=;i\\\\267\\\\333\\\\2141\\\\245\\\\014pf\\\\265\\\\0212\\\\270r\\\\343\\\\246R*\\\\253\\\\317FR\\\\216w\\\\367D\\\\222\\\\004\\\\255V?i\\\\237\\\\317\\\\316\\\\247\\\\363Y\\\\034\\\\206UUU\\\\367\\\\356\\\\357\\\\354\\\\354\\\\314g\\\\013k\\\\355`0\\\\210x\\\\220g\\\\331\\\\371|a\\\\010\\\\230\\\\010,\\\\241\\\\2666\\\\317\\\\213\\\\275\\\\375\\\\035\\\\255\\\\233\\\\363\\\\331<J\\\\243\\\\233/\\\\034\\\\204IL\\\\306\\\\256\\\\213\\\\274?\\\\034\\\\311$Q\\\\225\\\\252\\\\225\\\\232\\\\316\\\\027\\\\253,\\\\013\\\\204 )\\\\307\\\\007\\\\007\\\\262\\\\335Y\\\\255VMY\\\\025\\\\332f\\\\265\\\\316\\\\252:M\\\\323\\\\253\\\\235^U\\\\226\\\\332\\\\001\\\\212\\\\340\\\\327\\\\237}\\\\371\\\\363w\\\\336o\\\\267\\\\322\\\\235\\\\361\\\\010\\\\254m\\\\352\\\\322O\\\\203{;\\\\273>\\\\202\\\\261\\\\256\\\\353Prk\\\\2553v\\\\275^\\\\013dM\\\\323\\\\004A`\\\\201\\\\034\\\\307\\\\262PQ\\\\330\\\\356v\\\\333_>x\\\\362\\\\336G\\\\237\\\\237,\\\\326a\\\\247sp\\\\363\\\\352\\\\321\\\\331\\\\344\\\\316+\\\\257m\\\\205l@M\\\\337\\\\232\\\\323\\\\317??{\\\\360\\\\310Vz\\\\264\\\\267\\\\367_\\\\375\\\\327\\\\377\\\\315O\\\\357}\\\\362[\\\\337\\\\376&v\\\\323\\\\277y\\\\357W\\\\277\\\\372\\\\340#P\\\\366\\\\345[/\\\\335>\\\\270FD\\\\343\\\\361\\\\370/~\\\\362\\\\027A\\\\022;\\\\007\\\\253eY\\\\024\\\\366\\\\323\\\\317\\\\0377\\\\037\\\\177\\\\276\\\\\\\\.\\\\221\\\\261V\\\\027\\\\206\\\\243\\\\361\\\\365\\\\233\\\\2737o\\\\277tx4i\\\\234\\\\324\\\\213\\\\242.\\\\326I\\\\253\\\\267\\\\312\\\\327\\\\202\\\\001\\\\222\\\\005\\\\001@\\\\226\\\\300;\\\\220[G>\\\\235\\\\007\\\\015\\\\0019$Br\\\\350-\\\\371\\\\011\\\\351rA\\\\370<\\\\016}\\\\201\\\\306\\\\302\\\\006\\\\241\\\\306Mw\\\\341\\\\327\\\\354\\\\376\\\\224h\\\\255\\\\001\\\\200!q\\\\316\\\\031\\\\227\\\\034)\\\\317\\\\313\\\\351\\\\371\\\\254*k2\\\\244\\\\352*S\\\\246\\\\204\\\\320\\\\010\\\\340\\\\310\\\\210\\\\300\\\\032G\\\\236cJ\\\\334\\\\333\\\\246\\\\033$\\\\220B\\\\010\\\\201\\\\234\\\\031 \\\\313\\\\321\\\\030\\\\015\\\\240\\\\001\\\\301Y\\\\345P\\\\366\\\\372\\\\203\\\\361\\\\225\\\\203V\\\\177ptv\\\\272\\\\314\\\\013@\\\\336\\\\351t\\\\372\\\\355\\\\316w\\\\337\\\\374\\\\316+/\\\\336\\\\356v\\\\273<\\\\214,n\\\\330\\\\344\\\\213\\\\305\\\\202\\\\020O\\\\317'~\\\\351\\\\335j\\\\265\\\\210h>\\\\2373\\\\202\\\\272\\\\256\\\\375\\\\261\\\\024\\\\307\\\\317NV\\\\253\\\\254\\\\335n7\\\\215nu\\\\210\\\\210\\\\3622{r\\\\3708\\\\212\\\\242U\\\\276\\\\332\\\\335\\\\335W\\\\326\\\\225\\\\353l\\\\271\\\\\\\\2\\\\306\\\\206\\\\303\\\\341\\\\235\\\\227_9<<\\\\234\\\\316\\\\346\\\\343\\\\361x8\\\\032\\\\317f\\\\263\\\\263\\\\351,\\\\216c\\\\325\\\\350\\\\376h\\\\250\\\\254\\\\353\\\\265[\\\\331\\\\272 `B\\\\210\\\\244\\\\335r\\\\332 \\\\003\\\\021\\\\004\\\\347\\\\323\\\\371\\\\326x\\\\207\\\\213HJz\\\\372\\\\354\\\\364\\\\345;/\\\\335\\\\276}g\\\\265\\\\314\\\\346\\\\363\\\\371\\\\225+W\\\\346\\\\363\\\\371\\\\361\\\\361)c\\\\320\\\\224U\\\\020\\\\004i\\\\232\\\\216\\\\266\\\\307\\\\001\\\\027O\\\\237>\\\\225R\\\\366\\\\373\\\\375\\\\243\\\\323\\\\223V\\\\253\\\\025D\\\\221!\\\\323\\\\356v\\\\323n'\\\\317\\\\363\\\\223\\\\311YT\\\\024\\\\204X\\\\226\\\\305\\\\240\\\\327K\\\\222\\\\344\\\\340\\\\352\\\\225\\\\223\\\\243\\\\343\\\\272\\\\321\\\\277\\\\372\\\\370S\\\\311\\\\205`\\\\260[\\\\251\\\\345|\\\\001\\\\000o\\\\276\\\\371\\\\346*\\\\257\\\\376\\\\362\\\\257\\\\377\\\\226\\\\241M\\\\222\\\\244,K\\\\311x]\\\\327I\\\\2220\\\\306\\\\302@J)\\\\243 \\\\\\\\\\\\255V\\\\355v;\\\\216\\\\343A\\\\267\\\\247\\\\254\\\\331\\\\331\\\\337\\\\313\\\\312z\\\\276\\\\254\\\\216\\\\317W\\\\263Y1\\\\235\\\\235UU\\\\203\\\\234\\\\276\\\\365\\\\352o\\\\277\\\\365\\\\255\\\\227%\\\\2304\\\\016\\\\205q\\\\340\\\\240\\\\273=>>=\\\\213\\\\367\\\\367o\\\\277\\\\361\\\\306IY\\\\334\\\\374\\\\332\\\\327\\\\037\\\\316\\\\247\\\\377\\\\347\\\\377\\\\365\\\\347\\\\357~\\\\364\\\\341:/\\\\177\\\\377\\\\207?\\\\372\\\\365\\\\347_\\\\374\\\\352\\\\275\\\\017B.Z\\\\255$+\\\\326a\\\\022\\\\017\\\\307\\\\273\\\\217\\\\236\\\\034\\\\366\\\\373\\\\303\\\\351tZV*\\\\216\\\\273q\\\\253\\\\015\\\\310_\\\\371\\\\306\\\\033\\\\217\\\\236<\\\\375wo\\\\377\\\\224\\\\0071\\\\240,\\\\353\\\\312\\\\241[\\\\256\\\\246i\\\\232\\\\032\\\\002\\\\011\\\\004\\\\016\\\\231\\\\263\\\\314Z\\\\346\\\\245e\\\\233\\\\305\\\\377W\\\\3323\\\\000p@\\\\226\\\\300\\\\341F\\\\332\\\\355\\\\231\\\\033\\\\344u\012t\\\\021\\\\235r\\\\201\\\\215x4\\\\032\\\\010I\\\\000\\\\0139\\\\027\\\\302\\\\222SJ9k%\\\\343L \042*e\\\\246\\\\347\\\\313\\\\305\\\\242@\\\\021WM\\\\225\\\\347%\\\\205\\\\251\\\\010cmMm\\\\024h\\\\205\\\\344\\\\020Px\\\\362\\\\036\042y/E&8\\\\223\\\\210\\\\034\\\\321+E\\\\030\\\\010\\\\001\\\\014A\\\\001J9\\\\334\\\\036\\\\037\\\\\\\\\\\\271\042\\\\343\\\\344\\\\326`\\\\264\\\\265\\\\273\\\\275wp\\\\025\\\\035q@\\\\346\\\\354\\\\364\\\\344l\\\\275::_\\\\316=\\\\363\\\\2261\\\\226eY\\\\034\\\\307u]\\\\373\\\\363\\\\235$\\\\311\\\\243G\\\\217z\\\\275\\\\236\\\\263\\\\266\\\\323\\\\351<~\\\\364h\\\\271\\\\\\\\\\\\342?x\\\\355\\\\345\\\\307O\\\\037\\\\205q\\\\324\\\\351\\\\266\\\\243$\\\\211\\\\222p\\\\231\\\\255\\\\225\\\\321@,\\\\313rk)\\\\216\\\\322\\\\242\\\\250\\\\214\\\\261{\\\\273W\\\\333\\\\3554\\\\212\\\\203\\\\252*\\\\213\\\\242\\\\250\\\\353Z)MDa\\\\030\\\\306q\\\\274ZfyY\\\\014\\\\207C!DQ\\\\024\\\\335A\\\\1775_x*\\\\334j\\\\265\\\\332\\\\031o\\\\257\\\\326\\\\213$I\\\\226\\\\313e\\\\022\\\\305\\\\275^\\\\257\\\\327\\\\353\\\\216\\\\307cU\\\\327J\\\\251\\\\371|\\\\276\\\\275\\\\275}r|\\\\352\\\\254!]\\\\357\\\\357\\\\357\\\\022\\\\321`4\\\\024\\\\214[r\\\\336\\\\220<J\\\\223\\\\325j\\\\225\\\\244\\\\355,_5\\\\265\\\\216\\\\322$\\\\3132)%Y\\\\275Z\\\\255V\\\\253\\\\225\\\\003\\\\026E\\\\321:+\\\\210\\\\260\\\\256k\042\\\\360\\\\006\\\\003A\\\\020\\\\030\\\\355^\\\\274\\\\363\\\\302j\\\\265\\\\352u:\\\\247\\\\317\\\\016\\\\257]\\\\331o\\\\232\\\\246\\\\335nO&\\\\023)\\\\345x4\\\\034\\\\217\\\\307\\\\363\\\\371\\\\374\\\\331\\\\263gQ\\\\030\\\\256\\\\327\\\\353\\\\203\\\\203\\\\003\\\\000XLg\\\\300qoo/I\\\\222aoP\\\\226u\\\\024EM\\\\255}\\\\227y\\\\345\\\\352~;M\\\\216\\\\237>\\\\355&\\\\241\\\\312\\\\263\\\\027\\\\256^YO\\\\247\\\\377\\\\357\\\\217\\\\377\\\\277\\\\301h\\\\373\\\\367\\\\376\\\\360\\\\217\\\\276x\\\\364h\\\\373\\\\332\\\\325\\\\237\\\\374\\\\364\\\\257\\\\027U\\\\363\\\\3627\\\\276\\\\361\\\\370\\\\351\\\\2238J?\\\\374\\\\340\\\\203\\\\273/\\\\336\\\\376\\\\362\\\\213/\\\\352\\\\272\\\\212\\\\343\\\\360\\\\366\\\\255\\\\033\\\\300D\\\\324\\\\351\\\\336\\\\270\\\\361\\\\322\\\\317\\\\177\\\\376\\\\313\\\\203\\\\2537\\\\376\\\\372\\\\247\\\\277`<\\\\351\\\\365\\\\307\\\\313\\\\274*\\\\312j\\\\231\\\\345\\\\373\\\\373\\\\373\\\\332\\\\252\\\\311t\\\\002\\\\340\\\\252\\\\252\\\\340A\\\\030\\\\006\\\\211\\\\000\\\\210\\\\311\\\\004\\\\324\\\\210\\\\246\\\\300\\\\272\\\\020\\\\246\\\\366\\\\3623\\\\203T4\\\\215\\\\014\\\\003\\\\301\\\\030\\\\031+\\\\0053\\\\306(4\\\\033\\\\210\\\\303}\\\\245\\\\363s@\\\\234sc\\\\255\\\\301\\\\215\\\\240\\\\305\\\\001\\\\021C\\\\342\\\\320\\\\352\\\\245\\\\203a/\\\\011\\\\242N\\\\022\\\\307B\\\\330Z\\\\005\\\\214s\\\\344\\\\344\\\\370\\\\371t1\\\\235\\\\255j\\\\015\\\\032d\\\\245\\\\255r\\\\344\\\\030\\\\267\\\\314)\\\\323\\\\270F\\\\2013\\\\340}\\\\333|_\\\\216\\\\234,\\\\001p\\\\236v\\\\222\\\\316\\\\200\\\\313X\\\\031\\\\262\\\\3164:\\\\007\\\\333\\\\000\\\\260\\\\244\\\\325z\\\\351\\\\245\\\\227\\\\177\\\\373{?\\\\270y\\\\363\\\\205\\\\252j\\\\252\\\\306\\\\030k\\\\363\\\\274\\\\\\\\\\\\257\\\\327MU\\\\227YYW\\\\025\\\\200c\\\\002\\\\327\\\\353\\\\245\\\\317@\\\\362\\\\024e\\\\237_\\\\345S\\\\026.7\\\\312\\\\227w\\\\216\\\\030\\\\217w\\\\222V\\\\252L\\\\343\\\\220\\\\2141\\\\225j\\\\3428\\\\326\\\\271\\\\031\\\\215GQ\\\\0227\\\\215\\\\262\\\\006#\\\\207J\\\\031\042\\\\\\\\.\\\\327[r\\\\250\\\\265\\\\251\\\\353\\\\246\\\\252j\\\\217p\\\\031c\\\\212\\\\242\\\\020B\\\\214\\\\006\\\\303v\\\\247\\\\263\\\\271\\\\247\\\\010\\\\274\\\\212\\\\326\\\\357/\\\\252\\\\252\\\\212\\\\302\\\\204\\\\034\\\\206A\\\\\\\\\\\\024\\\\025\\\\000s\\\\316\\\\255\\\\327Y(\\\\2441\\\\246\\\\325j\\\\251FK)\\\\225\\\\263w_~\\\\371\\\\372\\\\265+\\\\247gg\\\\253\\\\325\\\\312\\\\207\012\\\\254\\\\262u\\\\030\\\\206\\\\343\\\\335\\\\035\\\\0000V)\\\\245\\\\034Y\\\\347L\\\\236\\\\257'\\\\223I+\\\\016\\\\266G[i8^\\\\254V\\\\326\\\\031\\\\206d\\\\235\\\\253\\\\353\\\\272\\\\335\\\\356\\\\254\\\\3269c\\\\314\\\\221n\\\\267\\\\333\\\\307'gu]O\\\\247\\\\323v\\\\232>|z4\\\\036\\\\217Ke\\\\243V\\\\267\\\\252\\\\252\\\\321\\\\316~V\\\\024I\\\\247\\\\377\\\\326w_8:<$v&\\\\243\\\\264\\\\327\\\\353i\\\\207\\\\000n\\\\231\\\\025\\\\353,_,WR\\\\312\\\\027n\\\\335\\\\354v[\\\\316Z2:\\\\233\\\\237.'\\\\352\\\\345;/\\\\255\\\\226\\\\213@t>{\\\\362\\\\270\\\\327\\\\351\\\\006\\\\343\\\\321\\\\375\\\\351\\\\374\\\\331:{\\\\347\\\\323\\\\317\\\\327\\\\357\\\\274\\\\313\\\\303h\\\\274\\\\273\\\\373/\\\\377\\\\267\\\\177\\\\311e\\\\370\\\\237\\\\376\\\\341\\\\037\\\\274\\\\376\\\\3557\\\\233\\\\252\\\\344Q<\\\\032\\\\364\\\\312<\\\\237\\\\255rK\\\\224hS6\\\\237\\\\000\\\\343\\\\317\\\\216\\\\316\\\\266\\\\266\\\\367\\\\263L\\\\027\\\\265=\\\\233,\\\\230\\\\010\\\\265\\\\202F\\\\371q\\\\010\\\\211\\\\034\\\\201v\\\\206,\\\\01780@\\\\022\\\\016\\\\230\\\\363\\\\376Z\\\\033\\\\354\\\\371y\\\\216\\\\215\\\\303\\\\013\\\\005\\\\324\\\\206\\\\307\\\\273\\\\021\\\\356n\\\\336x\\\\002wy\\\\276\\\\021\\\\210\\\\3101`\\\\2141\\\\311\\\\230\\\\024(\\\\320\\\\201\\\\265\\\\326\\\\022\\\\023\\\\034\\\\030\\\\003\\\\006\\\\206-f\\\\313\\\\242h\\\\032\\\\355JE\\\\245s\\\\3322+\\\\204\\\\020\\\\334\\\\352\\\\206\\\\234\\\\0012\\\\036\\\\004w\\\\010\\\\233\\\\352O \\\\333m\\\\255\\\\254\\\\265\\\\300\\\\231$\\\\207M\\\\325p)\\\\002\\\\021\\\\363$y\\\\355\\\\265o\\\\375\\\\340\\\\007?\\\\330\\\\336\\\\336^\\\\255\\\\262\\\\303\\\\303#\\\\243\\\\355z\\\\235k\\\\255W\\\\253\\\\254(\012k\\\\250i\\\\032\\\\335h@B\\\\264uS\\\\372%\\\\256\\\\017\\\\330&\042\\\\037hv\\\\011\\\\263>\\\\257\\\\371\\\\020O\\\\237=A\\\\244\\\\331b\\\\316$o\\\\265Z\\\\355A\\\\257\\\\333\\\\3556\\\\312,\\\\026\\\\253,\\\\313\\\\215vZ\\\\3338L\\\\322$\\\\352\\\\367Zy\\\\236\\\\177\\\\374\\\\353\\\\017[\\\\255V\\\\024ERJ\\\\277\\\\204\\\\354\\\\367\\\\373\\\\303\\\\341p2\\\\231t\\\\273]\\\\301\\\\003-4Y\\\\327\\\\353t\\\\223(^\\\\255V\\\\004\\\\320n\\\\267\\\\233\\\\246\\\\021\\\\202\\\\257\\\\227\\\\253V\\\\253\\\\325\\\\250\\\\212\\\\320\\\\025Ea\\\\255\\\\365\\\\016\\\\216)\\\\303\\\\242\\\\256\\\\252\\\\252r\\\\326<|\\\\374\\\\250\\\\327\\\\353\\\\000\\\\000c,N\\\\023\\\\031\\\\006\\\\016\\\\310/\\\\207V\\\\253\\\\025\\\\347\\\\274\\\\325i{\\\\272\\\\367\\\\326p\\\\330\\\\353\\\\264\\\\317O\\\\216\\\\275\\\\363\\\\347:\\\\317\\\\273\\\\235\\\\216qs\\\\306\\\\204#d\\\\214w\\\\332\\\\351\\\\376\\\\376~\\\\024E\\\\243\\\\321\\\\350\\\\313/\\\\277\\\\334\\\\032\\\\015\\\\232\\\\252N\\\\343(\\\\317\\\\327\\\\316\\\\231^\\\\257\\\\323n\\\\267\\\\265\\\\326\\\\255N\\\\3338\\\\213\\\\344m\\\\335ZcD\\\\243\\\\324t:\\\\335\\\\331\\\\331y\\\\374\\\\370!c\\\\254\\\\327\\\\353x\\\\362\\\\300\\\\341\\\\263\\\\243\\\\272\\\\251t\\\\243\\\\004\\\\003\\\\262\\\\356\\\\354\\\\344(\\\\257\\\\352\\\\361h\\\\210\\\\210\\\\232\\\\341\\\\331b^\\\\030\\\\327\\\\352\\\\365~\\\\361\\\\356{<\\\\220WG\\\\327jm\\\\202 \\\\010$\\\\327d\\\\036>\\\\274\\\\277\\\\275\\\\275\\\\375\\\\356'\\\\277\\\\236\\\\317\\\\347o\\\\276\\\\371\\\\246\\\\252\\\\033D\\\\214\\\\242H\\\\306\\\\011\\\\262`0\\\\334\\\\373\\\\350\\\\343/\\\\264a\\\\263\\\\305\\\\274Q\\\\3204\\\\3325\\\\372\042}\\\\3132`\\\\004\\\\034\\\\034\\\\032c\\\\001\\\\025c\\\\3022\\\\347\\\\3101G\\\\270\\\\3214\\\\\\\\b\\\\027n\\\\223:x\\\\361E\\\\372\\\\212M\\\\303\\\\236\\\\373N\\\\334\\\\020\\\\376\\\\021/z\\\\020dR\\\\310@\\\\304R\\\\004\\\\310\\\\231#\\\\360:v\\\\021\\\\220\\\\303Z\\\\353y\\\\226\\\\325\\\\215m\\\\224\\\\321\\\\006\\\\011\\\\005\\\\223\\\\2023A\\\\033\\\\217~{A\\\\340\\\\361\\\\260\\\\006\\\\002\\\\020J\\\\251\\\\263\\\\002d\\\\034\\\\265[\\\\326R\\\\030\\\\007\\\\275^\\\\264\\\\\\\\\\\\257^\\\\274s\\\\373\\\\037\\\\375\\\\223?\\\\032\\\\217w\\\\036?~|\\\\370\\\\370\\\\3209899)\\\\362\\\\022\\\\221\\\\327u\\\\275Z\\\\254\\\\313\\\\262dLx.\\\\215\\\\277\\\\227\\\\034m\\\\204mu]_\\\\026\\\\351K\\\\021\\\\367\\\\363\\\\320$\042\\\\362\\\\027\\\\256\\\\357\012\\\\301\\\\255\\\\263\\\\202\\\\3638I\\\\202 X\\\\347\\\\331\\\\341\\\\3413\\\\004\\\\254k-\\\\205\\\\340L\\\\010\\\\301\\\\213\\\\242(\\\\362\\\\354\\\\341\\\\303\\\\207Q\\\\034\\\\373\\\\342\\\\037\\\\004A\\\\030n2\\\\300/\\\\377\\\\274X,}\\\\303\\\\356];\\\\252\\\\252\\\\342B\\\\214F#o\\\\2449\\\\233N\\\\203 @\\\\006B\\\\210\\\\272\\\\252\\\\275\\\\237\\\\235\\\\337\\\\367\\\\004APTe\\\\222\\\\304\\\\263\\\\363I\\\\247\\\\335\\\\366q\\\\256a\\\\024\\\\371\\\\307\\\\316\\\\030SVU\\\\257\\\\327\\\\223R\\\\256W\\\\353\\\\345b\\\\201\\\\014\\\\242 X\\\\257\\\\227\\\\203^\\\\347\\\\205[\\\\267f\\\\323\\\\371K/\\\\275\\\\270^g\\\\007\\\\007\\\\373E\\\\226\\\\337\\\\274u\\\\253,J\\\\306Y\\\\034\\\\306\\\\216\\\\0348:;=\\\\271u\\\\363\\\\326h\\\\320\\\\317\\\\363\\\\365\\\\316\\\\316N\\\\020\\\\004\\\\223\\\\311\\\\344\\\\255\\\\267\\\\336\\\\372\\\\342\\\\213/\\\\026\\\\213\\\\205\\\\224\\\\362|2\\\\261\\\\326>|\\\\370PJY\\\\026\\\\305\\\\336\\\\336^\\\\3234\\\\333{;\\\\265jn\\\\274ps0\\\\034r)\\\\200a\\\\243\\\\265s\\\\216IQ5*/\\\\353\\\\2537n,\\\\262\\\\234\\\\011\\\\371\\\\371\\\\375\\\\007\\\\333{\\\\007\\\\303\\\\361\\\\366g\\\\237\\\\337k\\\\264Y,\\\\026\\\\347\\\\363\\\\331`8\012\\\\302`w\\\\177\\\\317\\\\032c\\\\254Y\\\\2553\\\\306\\\\331\\\\356\\\\356\\\\376\\\\344lv6\\\\231\\\\022\\\\210/\\\\356?\\\\374\\\\354\\\\363{E\\\\245\\\\033e\\\\317g\\\\213\\\\371|])\\\\275\\\\316\\\\013\\\\021\\\\004uQ\042\\\\303\\\\264\\\\225 \\\\2026\\\\312\\\\271\\\\215g\\\\032\\\\021\0428\\\\011N8\\\\313\\\\214\\\\002\\\\243\\\\031Xo>n\\\\211\\\\2641\\\\036\\\\247u\\\\3161oZ\\\\340\\\\011w\\\\227\\\\002\\\\362\\\\213\\\\246\\\\331cx\\\\200\\\\350\\\\000\\\\254#B\\\\220A\\\\020\\\\2062M\\\\203HJp\\\\024\\\\006A\\\\022\\\\245\\\\210\\\\274\\\\252\\\\364r\\\\235/We\\\\325\\\\230J;\\\\213,L\\\\3220\\\\216\\\\035\\\\271\\\\262.\\\\235\\\\325`\\\\355%(\\\\270\\\\271,\\\\374\\\\302'J\\\\000\\\\205\\\\210\\\\242(\\\\356\\\\254\\\\363\\\\274\\\\327\\\\033\\\\376'\\\\377\\\\360\\\\367\\\\277\\\\377\\\\203\\\\337.\\\\212z>[\\\\324uszrzr|\\\\3324Jk\\\\275\\\\\\\\\\\\256\\\\362<_\\\\257\\\\326y\\\\2367\\\\215\\\\252\\\\353\\\\272\\\\256k\\\\255U\\\\323\\\\324\\\\306h\\\\337Wx\\\\025\\\\231\\\\037^\\\\341\\\\357}\\\\370\\\\363-NN\\\\2168\\\\347I+\\\\365ZW\\\\000\\\\314\\\\226k\\\\301\\\\244Q\\\\326\\\\031b\\\\222\\\\247\\\\3554\\\\014\\\\303$\\\\016\\\\333>\\\\267\\\\257VEQ\\\\372\\\\202\\\\357-b\\\\275\\\\237A\\\\277\\\\337WJ)]\\\\033c\\\\204\\\\020\\\\306*!D\\\\247\\\\333\\\\002\\\\3048\\\\016\\\\303P\012\\\\301\\\\224\\\\032)\\\\245\\\\030\\\\347\\\\0040\\\\334\\\\032\\\\005A`\\\\255\\\\255\\\\232\\\\3329\\\\307\\\\004\\\\007\\\\206\\\\332\\\\332\\\\301h\\\\\\\\5J6JJ\\\\251\\\\033\\\\245\\\\224\\\\351v\\\\273J\\\\251\\\\331|\\\\272Z\\\\314\\\\031c\\\\335v\\\\253\\\\011d^\\\\346\\\\002h\\\\324\\\\037\\\\010\\\\276\\\\261\\\\354899\\\\261Z\\\\177\\\\361\\\\331\\\\347\\\\253Uf-\\\\221\\\\325q\\\\0240\\\\240n\\\\267C\\\\206\\\\332i\\\\334T\\\\345d\\\\265\\\\030\\\\014\\\\006\\\\323\\\\305t\\\\320\\\\355}\\\\377\\\\373\\\\337\\\\373\\\\344\\\\223\\\\217\\\\215QJ\\\\271\\\\317?\\\\377\\\\364G?\\\\372Q\\\\3234W\\\\257\\\\035\\\\234\\\\234\\\\234\\\\354\\\\354\\\\216\\\\333\\\\2356/\\\\271\\\\326z8\\\\032Y\\\\302gO\\\\016\\\\227\\\\313e\\\\232\\\\246\\\\355v[tEU\\\\027Ggg\\\\2255?\\\\375\\\\345;\\\\203\\\\301\\\\340\\\\356\\\\335\\\\273\\\\2316\\\\377\\\\341\\\\235w\\\\036\\\\336{\\\\210N\\\\334\\\\274\\\\331\\\\031\\\\357\\\\355;\\\\347\\\\312\\\\2468=?\\\\271r\\\\355Z\\\\332J\\\\010\\\\331\\\\344|\\\\372\\\\370\\\\351!C!\\\\243\\\\330\\\\021;>[:d[\\\\343\\\\035\\\\031\\\\265\\\\316\\\\316\\\\227\\\\245\\\\262\\\\306\\\\323\\\\021\\\\235+\\\\263\\\\025\\\\020\\\\005Q\\\\3149\\\\022XO\\\\351\\\\025L\042pc\\\\235!\\\\247\\\\035Y\\\\264\\\\202,\\\\202\\\\003G\\\\304\\\\200\\\\300]z4\\\\273\\\\347\\\\312\\\\026\\\\\\\\\\\\224k\\\\272\\\\000\\\\234\\\\375\\\\237\\\\031c\\\\216]\\\\000\\\\321\\\\027\\\\007B0\\\\026\\\\002\\\\343\\\\316ZK\\\\034\\\\005g\\\\262j\\\\324\\\\252\\\\250\\\\247\\\\213<\\\\253\\\\215qd\\\\221\\\\203\\\\220\\\\310\\\\031\\\\021i\\\\255\\\\\\\\U\\\\002\\\\367}\\\\215/\\\\226\\\\0366A \\\\026$-eH\\\\204\\\\021\\\\0203\\\\306\\\\276\\\\366\\\\352\\\\267^{\\\\355[\\\\375\\\\341\\\\340\\\\364\\\\344\\\\254,\\\\313\\\\351tZ\\\\226\\\\245\\\\224R)\\\\343\\\\305ue^\\\\021\\\\321\\\\305q2\\\\236\\\\371\\\\350\\\\027a\\\\306Xwa\\\\261\\\\340\\\\031r\\\\356\\\\357B\\\\351\\\\227\\\\320\\\\015\\\\021\\\\361W^\\\\272\\\\006\\\\014\\\\204\\\\220Jid\\\\\\\\\\\\360 \\\\313\\\\2120\\\\210\\\\270\\\\220^\\\\232\\\\232$\\\\211R\\\\265W\\\\313\\\\326M\\\\345\\\\014X\\\\347\\\\274\\\\314\\\\333\\\\267/\\\\255Vk{{{\\\\271\\\\\\\\\\\\372!,\\\\276\\\\370\\\\360\\\\004 \\\\317^\\\\342\\\\234\\\\367z\\\\275\\\\235\\\\235\\\\035\\\\000\\\\360\\\\030\\\\302h4\\\\362\\\\323\\\\325\\\\361\\\\361\\\\261\\\\007\\\\024\\\\243(r\\\\326\\\\356n\\\\2179C\\\\272\\\\360\\\\372\\\\250\\\\252*M\\\\223$I\\\\010\\\\250\\\\327\\\\353u:\\\\035\\\\347\\\\\\\\\\\\253\\\\225\\\\334y\\\\361\\\\305\\\\335\\\\335]\\\\301\\\\370\\\\311\\\\321QS7\\\\367\\\\277\\\\274\\\\3374MY\\\\224\\\\303\\\\341@H\\\\331\\\\351t\\\\332\\\\355N\\\\257\\\\323e\\\\014\\\\007\\\\375~\\\\226\\\\255[i\\\\2745\\\\332\\\\212\\\\3430N\\\\3428M\\\\366\\\\367\\\\366\\\\352\\\\272>;;{\\\\374\\\\370\\\\361\\\\265k\\\\327\\\\366\\\\367\\\\367\\\\337~\\\\373\\\\355\\\\373\\\\367\\\\357\\\\327u\\\\015\\\\000\\\\237|\\\\362\\\\011\042\\\\256V\\\\253 \\\\014\\\\2255Z\\\\353\\\\363\\\\351\\\\\\\\\\\\006R\\\\006\\\\221%:>9}\\\\377\\\\203\\\\217\\\\346\\\\313u\\\\332\\\\356\\\\336{\\\\360\\\\210\\\\311\\\\340t2\\\\255\\\\265\\\\311\\\\253:\\\\351\\\\364:\\\\235n\\\\234\\\\246O\\\\016\\\\017'\\\\323s\\\\306\\\\2316\\\\346\\\\364\\\\364\\\\264\\\\333\\\\353\\\\037\\\\035>\\\\253\\\\032u\\\\353\\\\326\\\\235\\\\255\\\\355\\\\275\\\\345\\\\252\\\\\\\\e\\\\245v\\\\330\\\\351\\\\016\\\\373\\\\375\\\\255Z\\\\331\\\\351l9\\\\233/\\\\234\\\\203,/d\\\\024Xc0\\\\220\\\\235N;\\\\214\\\\002\\\\347\\\\234\\\\365\\\\016\\\\224\\\\204\\\\004h\\\\215!2\\\\322\\\\031AN8\\\\303\\\\311\\\\261\\\\315\\\\246\\\\220,\\\\2206\\\\226q\\\\357\\\\365x!\\\\303~\\\\236(z\\\\371\\\\336\\\\243\\\\267 \\\\207\\\\013v\\\\007 cA\\\\030F\\\\201lEB\\\\000\\\\202\\\\2050\\\\212\\\\021\\\\345b\\\\231\\\\317\\\\026\\\\353EVV\\\\3329&X\\\\020p\\\\031\\\\030rUS)\\\\325\\\\370\\\\216\\\\206! \042\\\\201\\\\227\\\\2721@\\\\001\\\\214\\\\023\\\\023BF\\\\206`\\\\357\\\\312\\\\265\\\\037\\\\376\\\\316\\\\357\\\\276\\\\370\\\\322\\\\313\\\\253Uv~>\\\\315\\\\363\\\\354\\\\376\\\\375\\\\007D\\\\020\\\\004\\\\341\\\\343\\\\307O\\\\246\\\\323)\042.\\\\227K\\\\243\\\\355\\\\345xw\\\\311V\\\\367\\\\317\\\\363\\\\245)\\\\327\\\\205n\\\\025\\\\237\\\\367\\\\272\\\\270\\\\340\\\\207n\\\\210\\\\237\\\\002\\\\0301\\\\311\\\\026\\\\313EU\\\\352\\\\216#D\\\\236\\\\246m\\\\316%c\\\\254\\\\323\\\\351\\\\004\\\\201\\\\330\\\\332\\\\032Ng\\\\023\042\\\\267\\\\\\\\\\\\316W\\\\371\\\\272\\\\327\\\\037\\\\342\\\\272\\\\360\\\\366_i\\\\232\\\\246i\012@''\\\\307\\\\323\\\\311\\\\371%\\\\247'\\\\010\\\\002\\\\311\\\\371\\\\344\\\\354,\\\\214#\\\\021HO\\\\234N[I\\\\222\\\\306\\\\203a\\\\2371\\\\3264\\\\2152J[\\\\315\\\\231\\\\340B\\\\304q\\\\034\\\\206a\\\\253\\\\325\042k\\\\223V\\\\332N[M\\\\323dY\\\\306\\\\005\\\\233\\\\257\\\\226Y\\\\266j\\\\267\\\\333W\\\\256\\\\\\\\999!g\\\\265\\\\326\\\\2713\\\\213\\\\331|\\\\261X(\\\\245\\\\366\\\\367v\\\\210h0\\\\030\\\\314\\\\026\\\\363 \\\\210\\\\016\\\\017\\\\017e\\\\030-\\\\227\\\\313\\\\341p\\\\313K\\\\2009\\\\003\\\\243\\\\2334\012\\\\3532\\\\257T\\\\223\\\\027\\\\305\\\\272\\\\310\\\\237<yr\\\\373\\\\366\\\\355\\\\244\\\\335\\\\272\\\\365\\\\342\\\\355\\\\351t\\\\372\\\\354\\\\3313\\\\255u\\\\257\\\\327k\\\\2249\\\\233<\\\\271v\\\\355\\\\332b\\\\271\\\\016\\\\202\\\\240\\\\327\\\\033T\\\\252!\\\\242(LZ\\\\355d\\\\271\\\\312\\\\224RB\\\\206;{\\\\373\\\\316\\\\2714Mo\\\\335\\\\211\\\\212\\\\242\\\\250V\\\\331d2a\\\\\\\\\\\\002\\\\021#\\\\210\\\\303hwgG8\\\\363\\\\350\\\\311\\\\323\\\\227^\\\\274}\\\\365\\\\352\\\\325\\\\303\\\\243\\\\343\\\\371|N<x\\\\360\\\\340Q\\\\245(iu\\\\323\\\\366\\\\3008\\\\034\\\\355\\\\034\\\\024eS\\\\327*\\\\010\\\\323\\\\310\\\\202\\\\3631d\\\\210`\\\\232\\\\244\\\\337\\\\211\\\\222\\\\3109\\\\253\\\\265\\\\002\\\\007\\\\014\\\\0301\\\\356\\\\214F\\\\306\\\\310\\\\222\\\\261\\\\306p\\\\007\\\\2146)i\\\\336\\\\320\\\\010\\\\377NC\\\\011>k\\\\360\\\\371\\\\026\\\\323\\\\327\\\\321\\\\013!\\\\226o\\\\267\\\\201y!\\\\020c\\\\214q@\\\\346\\\\220!9@2\\\\264V\\\\305\\\\344|\\\\276\\\\\\\\\\\\227\\\\3122\\\\224\\\\302:0\\\\026\\\\0319\\\\343\\\\264R\\\\3129'Ba\\\\224\\\\205\\\\215Q\\\\222?a\\\\202P \\\\027I\\\\332m\\\\264\\\\371\\\\372\\\\335\\\\257\\\\177\\\\347\\\\267\\\\276/\\\\203\\\\370\\\\323O?\\\\235M\\\\027Q\\\\232Ty\\\\3018\\\\314f\\\\013\\\\000h\\\\267\\\\273Q\\\\244\\\\327\\\\353\\\\265\\\\326\\\\226\\\\254F\\\\357O\\\\347\\\\234\\\\020\\\\3147\\\\030\\\\306 r0\\\\344<\\\\245\\\\331]\\\\362\\\\346\\\\031\\\\242\\\\340\\\\0272\\\\273\\\\315Q\\\\006\042t(\\\\214s\\\\373\\\\373\\\\373\\\\355v\\\\277\\\\2515\\\\347\\\\0019\\\\034\\\\216z\\\\210\\\\350OX\\\\236\\\\257\\\\3754\\\\326\\\\355\\\\266\\\\202PDQ4\\\\235Ne\\\\020w:\\\\235K\\\\3133\\\\337\\\\253yd\\\\327\\\\207\\\\374ydw\\\\275^G\\\\272\\\\036o\\\\357\\\\266:m\\\\245\\\\324j\\\\265Z\\\\257\\\\327D$\\\\245\\\\\\\\\\\\257\\\\327\\\\303\\\\341\\\\260\\\\325j\\\\001\\\\241s\\\\316Y\\\\013\\\\000\\\\036e|\\\\364\\\\350\\\\311\\\\0137o4MS\\\\024\\\\305\\\\316\\\\3568\\\\010\\\\002\\\\253t\\\\222$y\\\\2363\\\\306z\\\\275~\\\\226\\\\257\\\\265\\\\326R\\\\362\\\\311d\\\\262\\\\\\\\.\\\\235\\\\2617o\\\\336\\\\334\\\\335Mn\\\\335~\\\\361\\\\303\\\\017?\\\\004\\\\302\\\\242(\\\\206\\\\303\\\\341\\\\301\\\\301\\\\301\\\\361\\\\361\\\\361\\\\331\\\\331\\\\031cl1=\\\\027[[\\\\306\\\\230\\\\262\\\\251\\\\317&\\\\3230\\\\211\\\\253\\\\252\\\\372\\\\345/\\\\177\\\\331\\\\353\\\\365\\\\036?~,6\\\\276\\\\360\\\\306\\\\030\\\\223eY\\\\232\\\\246\\\\275^/\\\\212\\\\242\\\\371|\\\\376\\\\343\\\\037\\\\377\\\\230\\\\220w\\\\273\\\\335n\\\\267{pp\\\\220\\\\255\\\\313\\\\263\\\\263\\\\211\\\\2656\\\\313\\\\3138\\\\216\\\\317\\\\316\\\\347\\\\253e\\\\026\\\\247IQ\\\\024\\\\333\\\\333\\\\333\\\\213u\\\\346y\\\\275\\\\213,W\\\\346(\012d\\\\030\\\\310\\\\247\\\\307'q\\\\332Z\\\\255V\\\\327o\\\\275\\\\360\\\\360\\\\321aQ5\\\\026\\\\205\\\\260\\\\254\\\\323\\\\033t\\\\207\\\\243\\\\252\\\\324\\\\312\\\\300b\\\\225\\\\001\\\\200%\\\\247\\\\312\\\\022\\\\302\\\\220\\\\0052\\\\352\\\\264\\\\243(\\\\222\\\\222\\\\253Z\\\\033c\\\\020\\\\2201\\\\3469\\\\025\\\\2701\\\\3177\\\\016\\\\341\\\\322\\\\335\\\\371\\\\357\\\\177\\\\020\\\\202\\\\375{\\\\373\\\\024\\\\270\\\\304C\\\\020\\\\000\\\\310yn4\\\\301\\\\205&\\\\330\\\\253\\\\013\\\\031\\\\020\\\\002\\\\2012\\\\256(\\\\364l\\\\261*\\\\025\\\\205Q\\\\312e\\\\\\\\\\\\225\\\\245nJ&\\\\204\\\\177\\\\307\\\\001\\\\254\\\\337=z\\\\317W\\\\000\\\\006\\\\210\\\\3048\\\\343\\\\022\\\\231@.\\\\376\\\\340\\\\367\\\\377pw\\\\377\\\\332\\\\275\\\\007\\\\017NN'A\\\\020\\\\021\\\\303\\\\311\\\\344\\\\\\\\\\\\327\\\\265ww\\\\326Z\\\\023XO\\\\317\\\\350\\\\365zUQ^Bo\\\\276\\\\372\\\\032c\\\\034\\\\020\\\\330\\\\013#L\\\\266\\\\361\\\\263d\\\\027v\\\\265\\\\227\\\\235\\\\322e\\\\331FD\\\\276\\\\2677(\\\\253\\\\212\\\\010\\\\352\\\\246\\\\211\\\\242\\\\304X\\\\253\\\\265\\\\251\\\\312:\\\\211\\\\342\\\\217?\\\\372(\012C\\\\245*k\\\\214\\\\326\012\\\\031\\\\256\\\\263\\\\214\\\\034\\\\033\\\\016\\\\267\\\\262,\\\\353\\\\365z\\\\214a\\\\257\\\\327\\\\255\\\\313\012\\\\001\\\\214U\\\\275~Wk\\\\325j\\\\245i\\\\034q\\\\206a ;\\\\335\\\\366b\\\\271,\\\\213\\\\002\\\\310\\\\235\\\\034\\\\037#\\\\300h8d\\\\210\\\\373{\\\\273\\\\326\\\\270\\\\246n\\\\026\\\\253E\\\\030\\\\205\\\\223\\\\311\\\\371b\\\\271$\\\\200(\\\\212\\\\220(\\\\313\\\\363N\\\\273\\\\335\\\\351t\\\\030\\\\343Q\\\\024nm\\\\217\\\\255\\\\243\\\\262(\\\\203@\\\\226U\\\\271\\\\273\\\\273W\\\\325\\\\365\\\\316\\\\336\\\\356\\\\275\\\\373\\\\017\\\\002\\\\031\\\\010.\\\\017\\\\016\\\\256t:]\\\\000\\\\034\\\\016\\\\206/\\\\277\\\\3625.\\\\344\\\\225+W\\\\257_\\\\273\\\\231gE\\\\222\\\\304{{{\\\\267o\\\\335:88\\\\000r7\\\\256\\\\337\\\\210\\\\222T\\\\006AY\\\\226\\\\337\\\\374\\\\3467\\\\263,;??\\\\317r\\\\233\\\\264b\\\\031\\\\204\\\\353<W\\\\3126Js!\\\\213\\\\262\\\\272\\\\377\\\\340a\\\\247\\\\333\\\\333\\\\331\\\\332\\\\346\\\\214\\\\253F\\\\035\\\\237\\\\234\\\\224e\\\\015\\\\200u\\\\335(m\\\\262,W\\\\332p.\\\\235%.D]7\\\\004\\\\214\\\\034\\\\324\\\\215\\\\3422h\\\\224\\\\212\\\\342\\\\270\\\\327\\\\353q\\\\301\\\\205\\\\220\\\\213U\\\\266\\\\275\\\\275\\\\337j\\\\367\\\\332\\\\335\\\\321h{w\\\\274s\\\\305\\\\000\\\\227A\\\\222\\\\347UU\\\\326\\\\214\\\\241\\\\265\\\\266Q\\\\0158\\\\007\\\\222\\\\307I\\\\022E\\\\201\\\\020\\\\\\\\\\\\251\\\\306h\\\\355\\\\234%\\\\347=bhc\\\\266\\\\340\\\\014\\\\032\\\\035\\\\220\\\\225`\\\\231\\\\323H\\\\3069\\\\303\\\\004\\\\323V\\\\373S\\\\356\\\\2618\\\\177}{)\\\\341\\\\205\\\\016\\\\203.\\\\217\\\\265\\\\217\\\\026\\\\320\\\\206\\\\214\\\\005d\\\\024\\\\204a\\\\030E\\\\222\\\\013\\\\006\\\\224\\\\306\\\\011\\\\227\\\\361d\\\\26689\\\\235Y\\\\340\042H\\\\014\\\\361\\\\252\\\\326\\\\026|p\\\\233u\\\\316l\\\\374\\\\241\\\\300]*I\\\\343\\\\264mj\\\\025\\\\244m\\\\306\\\\303\\\\255\\\\355\\\\335\\\\337\\\\373\\\\375?\\\\320\\\\216\\\\236>;\\\\232\\\\315\\\\227\\\\3068eLYVeYZ\\\\347\\\\2641u\\\\323hc|D\\\\226\\\\263\\\\246\\\\256\\\\353F5\\\\\\\\p.\\\\020\\\\220\\\\310\\\\371\\\\010V\\\\226\\\\244\\\\211s\\\\226mR\\\\020\\\\034\\\\347\\\\334S\\\\177\\\\301[p\\\\010\\\\341W\\\\233\\\\236|\\\\342Ez<\\\\210P\\\\006\\\\241\\\\010BG X\\\\340\\\\233\\\\015 PM\\\\263\\\\267\\\\267\\\\327\\\\357\\\\367\\\\212\042\\\\003\\\\000@\\\\252\\\\233\\\\272\\\\335\\\\351\\\\266\\\\333}kioo/\\\\014\\\\303~\\\\277\\\\337j\\\\265&g\\\\223\\\\242(\\\\032U{\\\\324\\\\371\\\\372\\\\365\\\\353\\\\203^\\\\337\\\\213\\\\262\\\\007\\\\275\\\\376[\\\\337yK\\\\004B\\\\351\\\\206\\\\010\\\\256^\\\\275z\\\\355\\\\3325cLUU\\\\363\\\\371\042\\\\317\\\\363\\\\242,\\\\026\\\\213\\\\305\\\\311\\\\311)\042\\\\226ey~~^\\\\226\\\\245\\\\263\\\\266,r\\\\306X\\\\024EI\\\\2222\\\\344\\\\235n\\\\033Q\\\\324\\\\252i\\\\245-\\\\2078\\\\233\\\\316\\\\302$\\\\235\\\\234\\\\236n\\\\357\\\\354Xc\\\\253\\\\272^.WQ\\\\222fyQ5z>_<x\\\\364\\\\350W\\\\357\\\\277?\\\\237\\\\317\\\\037=z\\\\\\\\U\\\\245\\\\340\042\\\\010\\\\344x\\\\274\\\\275\\\\\\\\.\\\\213\\\\252z\\\\360\\\\360\\\\341\\\\366\\\\366\\\\366\\\\343\\\\307\\\\217\\\\037=z\\\\364\\\\346\\\\233o\\\\376\\\\316\\\\357\\\\374\\\\360\\\\352\\\\325\\\\253\\\\210\\\\270\\\\230\\\\257\\\\242(\\\\032\\\\217\\\\307>\\\\244'\\\\313r\\\\306\\\\370b\\\\271\\\\014\\\\203\\\\250\\\\337\\\\037H!W\\\\253\\\\374|r\\\\236\\\\345\\\\2715d\\\\214%G\\\\016\\\\320\\\\013Y\\\\234\\\\003rd\\\\211\\\\200\\\\241U\\\\212\\\\220\\\\001\\\\220R\\\\206\\\\000\\\\037=~r\\\\355\\\\346\\\\013\\\\306\\\\302\\\\366\\\\356\\\\225\\\\257\\\\275\\\\366\\\\033o\\\\274\\\\365=\\\\306\\\\203g\\\\307\\\\223\\\\363\\\\351\\\\322hk\\\\215\\\\266\\\\326Xk\\\\215\\\\265\\\\200\\\\310e \\\\245\\\\020b\\\\363\\\\026^X\\\\204\\\\320W\\\\237\\\\320\\\\200\\\\323\\\\222l\\\\200 \\\\321\\\\011p\\\\214\\\\034\042 C\\\\343\\\\234q\\\\344\\\\215\\\\305\\\\350\042\\\\323\\\\204\\\\340+\\\\277?_\\\\233\\\\375\\\\020\\\\007\\\\210\\\\304\\\\320\\\\222\\\\363\\\\006:RJdLr.\\\\205t\\\\016\\\\213\\\\252Y\\\\347u\\\\245\\\\255\\\\003A\\\\310-\\\\240\\\\336\\\\340$\\\\264\\\\221\\\\317\\\\243\\\\363\\\\202}!\\\\245\\\\220\\\\2415\\\\326(\\\\035v{*\\\\253\\\\276\\\\366\\\\255\\\\337\\\\370\\\\3157\\\\2763],\\\\227\\\\253,\\\\313\\\\313Z+ml\\\\3234MS\\\\333\\\\213r{Y\\\\\\\\\\\\2353\\\\306Z\\\\206\\\\350\\\\267\\\\026UUZk\\\\303(\\\\014\\\\243\\\\020\\\\0016\\\\016\\\\375\\\\306x_\\\\2560\\\\014\\\\363<\\\\337\\\\260\\\\352\\\\204H\\\\222d<\\\\036\\\\207a\\\\350\\\\243\\\\351G\\\\243Q\\\\253\\\\325\\\\302\\\\273\\\\257\\\\\\\\\\\\015\\\\202\\\\000\\\\221s&\\\\253\\\\262\\\\264\\\\206F\\\\203\\\\301\\\\315\\\\2337\\\\2556I\\\\022\\\\255\\\\263\\\\345\\\\321\\\\321a^\\\\346^\\\\226\\\\323\\\\356\\\\365\\\\233\\\\206\\\\254\\\\303\\\\333/\\\\334:99i\\\\265ZA\\\\020\\\\370\\\\205k\\\\236\\\\347\\\\213\\\\305\\\\342\\\\225\\\\227\\\\356\\\\274\\\\362\\\\312+g\\\\247\\\\247UU\\\\204a\\\\230\\\\227\\\\205WO\\\\265\\\\333\\\\355\\\\252j<\\\\036>\\\\231L\\\\245\\\\224B\\\\312,\\\\313\\\\332\\\\355\\\\356\\\\007\\\\037|0\\\\231L\\\\030c\\\\343\\\\3616\042\\\\036\\\\354\\\\355}\\\\355\\\\345\\\\227\\\\243(\\\\002\\\\200\\\\345rY\\\\327\\\\365\\\\371\\\\371y\\\\034\\\\207\\\\353u\\\\236$Q\\\\277\\\\333\\\\273~\\\\363\\\\306\\\\257?\\\\372\\\\370\\\\336\\\\203\\\\373\\\\253\\\\3052I\\\\022\\\\335T7n\\\\334899\\\\031nmGQt:9\\\\177\\\\366\\\\354Y\\\\224$H4\\\\030\\\\364\\\\346\\\\363y\\\\024\\\\005i\\\\222\\\\304qx\\\\367\\\\356]\\\\337-\\\\224\\\\215*\\\\212bww\\\\327#\\\\206;\\\\273\\\\373\\\\223\\\\311\\\\304\\\\030\\\\363\\\\263\\\\237\\\\375m\\\\020\\\\004\\\\203\\\\301`\\\\275^\\\\027EQ\\\\026\\\\265\\\\357\\\\314Zi'I\\\\022k\\\\355z\\\\235gYf\\\\311q&\\\\275Y\\\\014n\\\\334E\\\\374\\\\\\\\\\\\206\\\\016\\\\210\\\\254\\\\3010\\\\244\\\\246\\\\221I$\\\\245$\\\\242\\\\253W\\\\257ZC\\\\257\\\\275\\\\366z\\\\030\\\\245\\\\223\\\\371\\\\252,\\\\315\\\\361\\\\3514N\\\\332\\\\306b\\\\236ee\\\\261\\\\322\\\\036\\\\315q\\\\2061\\\\026\\\\004\\\\201\\\\014\\\\003!\\\\230/\\\\256\\\\336\\\\260\\\\375\\\\262\\\\023\\\\366,!0MhTL:\\\\005-\\\\254\\\\342d\\\\020\\\\211\\\\220\\\\325F+\\\\267\\\\361\\\\310\\\\006\\\\000\\\\260\\\\006\\\\200Y\\\\347\\\\000\\\\330\\\\005k\\\\364\\\\253\\\\306\\\\203\\\\210\\\\230\\\\024u\\\\3238\\\\200\\\\244\\\\235z\\\\0105I\\\\2224\\\\014Tc\\\\362\\\\262,\\\\032c\\\\034\\\\003\\\\024\\\\206\\\\270qN\\\\031\\\\007\\\\033\\\\323:\\\\007\\\\344\\\\000\\\\315\\\\006\\\\333\\\\260\\\\004\\\\\\\\\\\\310\\\\264\\\\005L8\\\\307\\\\336|\\\\353\\\\267n\\\\335\\\\276s\\\\377\\\\301\\\\023\\\\002,\\\\212\\\\252R\\\\015\\\\0203VUu\\\\355\\\\254\\\\345Ljk|e\\\\365\\\\203\\\\2357b\\\\026\\\\034\\\\375,\\\\350Q\\\\271\\\\215\\\\004\\\\316\\\\021\\\\223\\\\002\\\\221j\\\\325x\\\\323\\\\013!D]\\\\327q\\\\034'I\\\\342\\\\347\\\\2564M\\\\273\\\\335\\\\356h4b\\\\214\\\\245i\\\\252\\\\224\\\\022q\\\\273\\\\207\\\\210Z\\\\331n\\\\247\\\\233$-\\\\262\\\\256\\\\252\\\\252\\\\243\\\\243C\\\\262\\\\356\\\\370\\\\344\\\\031\\\\000\\\\304i\\\\364\\\\370\\\\361\\\\023\\\\3060I\\\\022m\\\\027I\\\\332O\\\\222$\\\\313\\\\262\\\\351t\\\\352\\\\223V^{\\\\365\\\\353\\\\306\\\\230n\\\\267\\\\333\\\\357w\\\\021\\\\361\\\\235w\\\\336I\\\\223\\\\250(\\\\2128\\\\216\\\\3234\\\\355\\\\015\\\\372\\\\347\\\\263\\\\331\\\\344\\\\364T[\\\\033\\\\311\\\\250\\\\335\\\\353\\\\266\\\\333mor\\\\267X,\\\\274I\\\\305x<\\\\276}\\\\373v\\\\267\\\\333\\\\213\\\\303\\\\360\\\\203\\\\367\\\\337\\\\367\\\\346w\\\\207\\\\207\\\\207O\\\\236<\\\\361\\\\027JU\\\\205\\\\263\\\\331\\\\354\\\\332\\\\215\\\\033A\\\\230\\\\234\\\\317\\\\226\\\\217\\\\237\\\\035\\\\337{\\\\360\\\\264\\\\333m7\\\\25358\\\\272\\\\377\\\\360\\\\2511\\\\206\\\\370b6\\\\235ge\\\\001\\\\000\\\\026\\\\253\\\\321`x|:\\\\361\\\\252\\\\202\\\\333\\\\267o\\\\367{\\\\235\\\\223\\\\223\\\\223\\\\243\\\\343\\\\343\\\\270\\\\325~\\\\371\\\\345\\\\227\\\\177\\\\374\\\\343\\\\037\\\\017\\\\006\\\\203\\\\321ht\\\\377\\\\336\\\\303\\\\331|)\\\\204PJ;\\\\347\\\\232\\\\2469zv\\\\262X,8\\\\347\\\\340\\\\231\\\\036Q<\\\\235/\\\\364\\\\331\\\\004\\\\0008\\\\347\\\\014\\\\005\\\\022j{\\\\031\\\\243q!\\\\254$r\\\\204\\\\004\\\\004\\\\204a\\\\234h&\\\\214u\\\\206\\\\354\\\\316\\\\366\\\\236\\\\014\\\\333\\\\257\\\\375\\\\3467~\\\\365\\\\376\\\\307\\\\200\\\\002H\\\\304i\\\\227\\\\361\\\\240\\\\252\\\\232\\\\252VuU\\\\2015\\\\340,8\\\\313\\\\000%\\\\027B\\\\010\\\\216l\\\\223T\\\\3466\\\\231S\\\\317\\\\215v\\\\226\\\\3002 \\\\237G@\\\\226\\\\274\\\\336\\\\202\\\\363\\\\257<\\\\252/\\\\305\\\\335\\\\004\\\\204d7\\\\006>\\\\317\\\\211)\\\\201\\\\241C\\\\237o\\\\2639\\\\342\\\\227\042\\\\177DV\\\\324\\\\266\\\\250\\\\232\\\\2422\\\\316\\\\0012N\\\\204^a\\\\017\\\\027\\\\316\\\\221\\\\2601q\\\\347\\\\000\\\\026\\\\0000IQ\\\\010K\\\\350V\\\\305\\\\177\\\\374\\\\307\\\\3778mw\\\\236\\\\036\\\\235v{\\\\375\\\\262Q\\\\026\\\\005VR\\\\031\\\\355\\\\224\\\\025B8D\\\\306\\\\020\\\\030\\\\007\\\\216\\\\250\\\\321'\\\\203q\\\\216\\\\214\\\\201'<^Z\\\\243\\\\370\\\\247\\\\213s\\\\036EQ\\\\273\\\\3332\\\\306,\\\\026\\\\213\\\\341pX\\\\327\\\\265\\\\377o\\\\034\\\\307\\\\376+\\\\234\\\\363\\\\235\\\\235\\\\235\\\\365z\\\\335\\\\353\\\\365\\\\020q<\\\\036\\\\213\\\\331,\\\\273v\\\\355\\\\232KL\\\\226\\\\027uY\\\\364:\\\\335\\\\252.\\\\216O\\\\236\\\\016{\\\\375\\\\252)\\\\367\\\\366\\\\366\\\\366\\\\367\\\\367g\\\\263\\\\331r\\\\275\\\\026A(e\\\\030\\\\004\\\\301j\\\\275\\\\\\\\\\\\257\\\\226\\\\036\\\\200\\\\013\\\\202`\\\\223\\\\267\\\\242\\\\232\\\\351\\\\331d\\\\274\\\\265\\\\265\\\\230O\\\\031\\\\016\\\\235sQ\\\\024\\\\026E\\\\3364\\\\265%\\\\027\\\\312 \\\\014q1\\\\233\\\\027e\\\\246\\\\032\\\\223\\\\246iU5i\\\\2320\\\\344;\\\\343\\\\355\\\\367\\\\337\\\\177\\\\377\\\\332\\\\225\\\\253\\\\317VO\\\\017\\\\016\\\\016\\\\266\\\\267\\\\267'\\\\223S)C\\\\255u\\\\332ns\\\\316\\\\333\\\\355\\\\316r\\\\271\\\\\\\\\\\\254\\\\326\\\\362\\\\364to\\\\357\\\\312\\\\317\\\\376\\\\366\\\\027_~\\\\371\\\\345\\\\326x\\\\274q2\\\\260v2\\\\237#\\\\362e^*e\\\\302(\\\\250keA\\\\237\\\\236\\\\235\\\\017\\\\206\\\\275\\\\275\\\\203\\\\203\\\\255\\\\361\\\\370\\\\370trzz\\\\372\\\\350\\\\321\\\\243,\\\\313\\\\230\\\\024\\\\263\\\\351bg{\\\\217\\\\241x\\\\370\\\\350\\\\311\\\\311\\\\331\\\\331\\\\352\\\\313/\\\\257]\\\\273vr|V\\\\226\\\\245%W\\\\327\012\\\\210$2\\\\201,\\\\220Q\\\\245\\\\015\\\\021\\\\372t\\\\002\\\\002\\\\264>\\\\316\\\\3149d\\\\354+\\\\021\\\\272?\\\\026\\\\340,\\\\241\\\\210\\\\223z\\\\261\\\\026\\\\255\\\\026\\\\251f\\\\264\\\\277\\\\373\\\\332\\\\353o\\\\274\\\\376\\\\033o\\\\376\\\\354\\\\027\\\\277\\\\230-+@\\\\336\\\\357\\\\017\\\\363\\\\242v\\\\016\\\\232F\\\\013\\\\316\\\\243((\\\\263\\\\334\\\\331\\\\006\\\\310xC\\\\177\\\\306\\\\030\\\\000\\\\222g\\\\321\\\\371N\\\\206\\\\034\\\\000\\\\220\\\\367\\\\213$\\\\353\\\\254\\\\365-\\\\003\\\\003G\\\\233\\\\357#\\\\3476\\\\324P_\\\\306/Wh\\\\033\\\\316\\\\350s\\\\3353\\\\\\\\\\\\262\\\\353.\\\\254\\\\2228\\\\377\\\\312p\\\\307\\\\021\\\\256K\\\\335(0\\\\216s.\\\\035\\\\202\\\\321N{\\\\213G\\\\037\\\\270\\\\211xa\\\\232\\\\342!m$c\\\\2506\\\\301p\\\\353\\\\367\\\\376\\\\370\\\\237\\\\324\\\\215M\\\\332\\\\375V\\\\177K5f\\\\034%\\\\016\\\\301*]\\\\024EU\\\\025J\\\\327>{\\\\02797\\\\316VEm\\\\214\\\\2222$\\\\332p\\\\372\\\\020Qr\\\\016\\\\304\\\\202 h\\\\265Z>Q\\\\204s\\\\336\\\\355\\\\265\\\\245\\\\224\\\\355v\\\\273\\\\323\\\\351TU5\\\\036\\\\217\\\\275\\\\376\\\\277\\\\333\\\\355z-\\\\222W\\\\031\\\\246i\\\\252\\\\265\\\\236\\\\317\\\\347\042nu\\\\225\\\\2052+ON\\\\216US5M%8\\\\246i\\\\374\\\\345\\\\275\\\\307;;=c\\\\314j\\\\265\\\\032\\\\357\\\\354\\\\365\\\\006\\\\243v\\\\273\\\\033\\\\305\\\\261\\\\014\\\\243\\\\371g\\\\237\\\\305a\\\\344o\\\\250(\\\\212\\\\036=z\\\\024\\\\307q]\\\\344A\\\\020\\\\224e\\\\256\\\\224\\\\272q\\\\343F\\\\236\\\\347\\\\223\\\\311\\\\331`00\\\\3060`\\\\225\\\\2529\\\\362\\\\246i\042\\\\214\\\\3743P\\\\226\\\\265U\\\\3322:<<l\\\\267\\\\333^}ptt\\\\324N\\\\343\\\\323\\\\323\\\\323\\\\255\\\\255\\\\355\\\\235\\\\235\\\\235V\\\\247\\\\363\\\\360\\\\341\\\\303\\\\263\\\\263\\\\311\\\\203GO\\\\245\\\\340EY\\\\223\\\\303g\\\\307'\\\\310Em\\\\310*\\\\333\\\\250\012\\\\011\\\\270\\\\210\\\\264\\\\326\\\\326\\\\232 \\\\210d\\\\030\\\\324\\\\265Ad\\\\332\\\\272\\\\242\\\\254\\\\227\\\\213\\\\247UU\\\\225yQU%\042\\\\312(\\\\014\\\\203\\\\270(\\\\212\\\\2337o\\\\336\\\\277\\\\177\\\\277\\\\254\\\\353\\\\305bQ\\\\327\\\\315r\\\\271\\\\234\\\\315f\\\\234sK\\\\3009\\\\027<\\\\260\\\\326*\\\\253d\\\\024\\\\272\\\\306y\\\\3479Bt\\\\236\\\\245\\\\200\\\\034\\\\354W\\\\246\\\\016p)yB$B\\\\3234I\\\\277_f\\\\371\\\\335W\\\\277\\\\371\\\\207\\\\177\\\\364\\\\307\\\\203\\\\321\\\\366l\\\\276\\\\374\\\\371/?p\\\\016D\\\\300\\\\015\\\\260\\\\365j\\\\235\\\\306\\\\255$I\\\\264\\\\326\\\\347\\\\223i(,\\\\200\\\\363\\\\261TH\\\\226\\\\374\\\\341\\\\201\\\\313j\\\\013\\\\316\\\\001\\\\240!\\\\262\\\\033x\\\\016\\\\254s\\\\006\\\\310>\\\\357\\\\032Ct\\\\341ty!\\\\261\\\\272\\\\370\\\\372\\\\246Zo\\\\020=\\\\330x\\\\253\\\\372\\\\343\\\\250\\\\225\\\\001\\\\004\\\\337\\\\027\\\\371\\\\323S\\\\251\\\\246Qd\\\\200\\\\243\\\\224\\\\336\\\\257\\\\3038\\\\3431(\\\\377J\\\\027'y\\\\363\\\\231P`\\\\224\\\\020\\\\212\\\\337\\\\375\\\\321\\\\357M\\\\246\\\\263Vgp\\\\367\\\\225W\\\\362\\\\262\\\\276r\\\\345Z\\\\221WA\\\\020 \\\\243\\\\246\\\\251tSi\\\\255\\\\312\\\\274\\\\310\\\\212\\\\334\\\\220S\\\\332\\\\254\\\\327\\\\353\\\\246i\\\\274\\\\016\\\\327{\\\\346WU\\\\025\\\\206\\\\241@\\\\341\\\\013\\\\263\\\\177\\\\266\\\\203 hT^)u\\\\307\\\\000\\\\000 \\\\000IDAT\\\\025\\\\307\\\\361`0\\\\250\\\\252\\\\252\\\\325jy\\\\260\\\\270,K\\\\377\\\\267\\\\372\\\\375~Y\\\\226q\\\\034\\\\237\\\\234\\\\234lmm\\\\005A \\\\332\\\\235\\\\376\\\\351\\\\331d\\\\265\\\\234\\\\007\\\\\\\\\\\\334\\\\270q\\\\203\\\\243#g\\\\220\\\\342\\\\027^\\\\020\\\\273\\\\273;y^\\\\234\\\\237\\\\237\\\\367\\\\207[\\\\3068\\\\245\\\\355\\\\371\\\\371,+\\\\362\\\\365z\\\\315\\\\273\\\\254,\\\\313^\\\\257\\\\023\\\\307!\\\\202\\\\343\\\\234\\\\007\\\\235\\\\216R\\\\252,Kk\\\\355\\\\247\\\\237~rpp\\\\000\\\\316-f\\\\2630\\\\014\\\\243(J\\\\242\\\\260\\\\325jyD\\\\017\\\\200q\\\\316\\\\277\\\\370\\\\342^\\\\247\\\\323\\\\351\\\\367\\\\373\\\\217\\\\037\\\\336\\\\337\\\\335\\\\277\\\\362\\\\321G\\\\037\\\\275\\\\370\\\\342\\\\213\\\\306\\\\230\\\\343gO\\\\217\\\\216\\\\216\\\\346\\\\363\\\\345\\\\356\\\\356\\\\356:/\\\\216\\\\216\\\\216\\\\213\\\\262f\\\\010a\\\\030;\\\\240O>\\\\375,\\\\210S\\\\031\\\\306\\\\313\\\\331\\\\242\\\\325\\\\355\\\\002\\\\013\\\\310\\\\232\\\\246n\\\\2428\\\\2168/\\\\362Ri\\\\025\\\\246\\\\255\\\\246\\\\314\\\\2038\\\\256\\\\032\\\\335mw\\\\226\\\\253\\\\014\\\\301\\\\345\\\\245B\\\\204P\\\\262\\\\365\\\\252\\\\371\\\\255\\\\337\\\\3726\042\\\\273w\\\\357q\\\\020\\\\3614M\\\\2430y\\\\372\\\\344X\\\\206\\\\001\\\\221O\\\\265\\\\011\\\\210\\\\361\\\\215\\\\333Z\\\\243A\012\\\\320\\\\332;x8!\\\\271\\\\020\\\\227\\\\2535o\\\\326\\\\200\\\\210\\\\354\\\\271e[ \\\\203\\\\262,\\\\277\\\\363\\\\275\\\\357\\\\375\\\\227\\\\377\\\\364\\\\277]d\\\\271u\\\\370\\\\317\\\\376\\\\371\\\\237\\\\202\\\\010t\\\\255\\\\253u\\\\231\\\\266\\\\364pk\\\\333*\\\\235eYS\\\\325\\\\243\\\\376\\\\240X\\\\2371\\\\260\\\\214\\\\034y\\\\340\\\\311y{\\\\276M\\\\250\\\\200\\\\363m3:\042G\\\\316\\\\\\\\\\\\216\\\\207Dt\\\\341\\\\247\\\\200\\\\033\\\\307\\\\021\\\\272\\\\370\\\\004h\\\\275\\\\221\\\\303sNv\\\\227\\\\365\\\\371\\\\022\\\\360b\\\\214Y\\\\000\\\\3111\\\\212\042s!0,\\\\213\\\\332b\\\\014<\\\\000\\\\002o\\\\025\\\\2739\\\\315\\\\264\\\\271\\\\0236\\\\326~\\\\276\\\\3523\\\\016\\\\210\\\\344\\\\340\\\\333\\\\337\\\\377\\\\356g\\\\367\\\\356\\\\277\\\\364\\\\362+W\\\\257\\\\334\\\\234L\\\\247\\\\375\\\\376\\\\326:+\\\\332\\\\355\\\\266\\\\020\042\\\\220\\\\274\\\\337\\\\357r$\\\\347\\\\254j\\\\252\\\\272i*\\\\243\\\\034aU\\\\226u]\\\\023\\\\221\\\\327Ms\\\\316\\\\347\\\\263E\\\\024EH`\\\\214qn\\\\203i$I\\\\222e+)e\\\\247\\\\323aB\\\\370\\\\2410\\\\212\\\\2420\\\\216\\\\333\\\\355\\\\266\\\\247v(\\\\245\\\\206\\\\303a\\\\32342\\\\014\\\\313\\\\262\\\\024\\\\367?\\\\273\\\\007\\\\340\\\\3428F0u]\\\\353\\\\246\\\\034\\\\016z\\\\243A\\\\377lr\\\\352\\\\341\\\\210<\\\\317\\\\343\\\\264[\\\\226e^T\\\\317\\\\236=s\\\\216\\\\366\\\\366\\\\266\\\\021\\\\261,s\\\\257\\\\355\\\\352\\\\367\\\\373_~\\\\371%\\\\007\\\\334\\\\337\\\\337G\\\\200 \\\\210\\\\202 \\\\274s\\\\347%\\\\255M]\\\\327\\\\235n_\\\\010QU\\\\025\\\\023\\\\241#\\\\314\\\\213\\\\352\\\\354\\\\354\\\\354\\\\374\\\\374\\\\274\\\\256\\\\025\\\\000\\\\314\\\\347s\\\\277\\\\000G\\\\304\\\\351t\\\\032E\\\\321\\\\361\\\\351\\\\244\\\\254\\\\325t~8\\\\235/\\\\252\\\\252r\\\\204J\\\\231(\\\\212\\\\362\042\\\\017\\\\302\\\\220\\\\311P\\\\325\\\\265\\\\021\\\\0010V\\\\026\\\\225\\\\263\\\\032\\\\234\\\\225APW\\\\225\\\\014\\\\002\\\\031G\\\\272.\\\\233\\\\246\\\\001\\\\306T\\\\323\\\\304I\\\\362\\\\372\\\\353\\\\257\\\\377\\\\344'?ArA\\\\300\\\\264v\\\\306\\\\271n\\\\277\\\\025D\\\\2211\\\\246\\\\335M\\\\262u)\\\\270&Ri\\\\032k\\\\353\\\\254\\\\265\\\\316\\\\202\\\\326\\\\332\\\\270\\\\232\\\\013!\\\\303\\\\270.\012\\\\000\\\\007\\\\202#\\\\223\\\\350\\\\343\\\\266\\\\214\\\\006\\\\353\\\\000\\\\220!\\\\273,[\\\\227\\\\322T\\\\002f\\\\034\\\\276\\\\372\\\\332\\\\353\\\\177\\\\360\\\\237\\\\375\\\\347G\\\\307\\\\247i\\\\267\\\\377\\\\366O~2\\\\237-\\\\231\\\\020\\\\306X.\\\\245R\\\\252\\\\304\\\\\\\\\\\\325u\\\\267\\\\3351JWU\\\\341m\\\\354<\\\\217\\\\3109\\\\303,#\\\\344D\\\\200\\\\310\\\\011\\\\254s\\\\366b\\\\331\\\\347\\\\3109 \\\\307\\\\000\\\\0318p\\\\0269\\\\370lc\\\\337\\\\331:\\\\004{\\\\341\\\\337'\\\\000,\\\\020\\\\333X\\\\022\\\\333\\\\347t\\\\340\\\\014\\\\301]z\\\\003\\\\371\\\\251@\\\\204\\\\201\\\\256\\\\033GL;^6\\\\215H%\\\\343\\\\322Z\\\\253\\\\255qZo\\\\220kF\\\\354b\\\\325\\\\350\\\\020\\\\274\\\\251\\\\241\\\\217\\\\337{\\\\3657\\\\336\\\\230\\\\234/\\\\342(\\\\235\\\\234\\\\315\\\\265aa\\\\030\\\\213 >:>\\\\335\\\\335\\\\335u\\\\316\\\\205\\\\201h\\\\265\\\\2228\\\\0169\\\\002\042\\\\205I,!\\\\341B\\\\330nWk\\\\355,\\\\031\\\\253\\\\2010\\\\010\\\\202kW\\\\215R*\\\\3132\\\\245\\\\224`\\\\322\\\\001\\\\351F9\\\\240\\\\375\\\\316\\\\276q\\\\226\\\\254\\\\353\\\\017\\\\007\\\\034Y\\\\247\\\\327e\\\\200\\\\310Y]Vi\\\\273e\\\\224F\\\\316\\\\310:`\\\\350\\\\211k\042\\\\346|\\\\177\\\\377JQf\\\\223\\\\311\\\\261i\\\\212 \\\\340\\\\331j\\\\035\\\\010\\\\256\\\\265^\\\\232uQU\\\\203\\\\321\\\\310\\\\243\\\\015\\\\014\\\\305\\\\366\\\\326\\\\270n\\\\312\\\\341\\\\240\\\\347\\\\034D\\\\341\\\\301\\\\260\\\\327\\\\277\\\\363\\\\322K\\\\367\\\\276|\\\\320J;\\\\247\\\\247\\\\247\\\\305\\\\375\\\\207\\\\313\\\\371\\\\334k\\\\007^\\\\274\\\\363u!\\\\343g\\\\017\\\\016\\\\313\\\\006\\\\006\\\\203\\\\301\\\\337\\\\376\\\\374\\\\275\\\\273w_JZ\\\\275\\\\255\\\\361\\\\360\\\\346\\\\355\\\\027\\\\031ceY\\\\376\\\\371\\\\237\\\\377y\\\\024&\\\\335\\\\376\\\\320\\\\030\\\\273\\\\277\\\\277\\\\277\\\\277\\\\277\\\\177vv\\\\236\\\\345UU5\\\\316\\\\301:+\\\\020\\\\321X\\\\013\\\\010J[ \\\\246\\\\032\\\\343\\\\30702\\\\026\\\\020\\\\300Y\\\\316\\\\270\\\\0032V!\\\\007m\\\\032\\\\320\\\\032\\\\031lB\\\\177\\\\211B\\\\311\\\\177\\\\362\\\\223\\\\237x\\\\300\\\\304\\\\030\\\\365\\\\342\\\\235\\\\353y\\\\236\\\\377\\\\377\\\\244\\\\275\\\\331\\\\217eir\\\\037\\\\026\\\\361-g\\\\275\\\\347\\\\256ys\\\\251\\\\314\\\\252\\\\352\\\\352\\\\352mz\\\\206\\\\213I\\\\233\\\\362pH\\\\212\\\\022$\\\\0336,A\\\\006\\\\014\\\\003\\\\362?\\\\340\\\\007\\\\303\\\\017~0\\\\340\\\\377\\\\310\\\\220a[\\\\260a\\\\200\\\\220\\\\036\\\\014K\\\\244Er8\\\\032M\\\\317h\\\\330\\\\323{um\\\\271\\\\347]\\\\317\\\\366-\\\\021~\\\\210{\\\\263\\\\252%J\\\\200\\\\245|\\\\350Fw\\\\336\\\\\\\\\\\\356\\\\3118q\\\\342\\\\213\\\\337\\\\366\\\\352\\\\345k@\\\\335;\\\\327v\\\\316\\\\246id\\\\350\\\\332.\\\\3152\\\\336E\\\\3400q0Z!P\\\\350;4\\\\300\\\\034\\\\300\\\\271\\\\244(\\\\373\\\\276\\\\263:)\\\\253A\\\\275\\\\3360\\\\357\\\\362\\\\323\\\\023\\\\233yb\012AYK\\\\214\\\\240l9:\\\\250\\\\306G\\\\177\\\\364\\\\217\\\\377\\\\311\\\\371\\\\345\\\\205\\\\353\\\\303r\\\\275\\\\212\\\\336+\\\\245\\\\200B\\\\344\\\\350]\\\\232\\\\031m\\\\255\\\\336n\\\\327\\\\240\\\\330\\\\373\\\\000\\\\300\\\\254\\\\020\\\\264\\\\002f\\\\206H\\\\354\\\\024\\\\030F \\\\016\\\\300\\\\214\\\\020\\\\366\\\\275\\\\231\\\\305M\\\\007\\\\0010\\\\262\\\\260\\\\341\\\\200#S\\\\024\\\\223\\\\035\\\\317\\\\354\\\\021\\\\234\\\\244R1hBq\\\\222\\\\321Vm\\\\034\\\\0152Q\\\\240P\\\\236\\\\252\\\\336\\\\023(h\\\\333\\\\300\\\\000EU\\\\3641\\\\262N\\\\030\\\\223\\\\316Q><\\\\334\\\\266\\\\256\\\\032'\\\\375zC1\\\\246e\\\\352\\\\\\\\\\\\007\\\\301\\\\013\\\\226A!\\\\244y\\\\011\\\\250\\\\373\\\\272\\\\0010\\\\203\\\\331\\\\264\\\\030O\\\\272\\\\200!\\\\352m\\\\323\\\\023l\\\\353\\\\326i\\\\255W\\\\253\\\\325\\\\321\\\\321\\\\311ru7\\\\235N\\\\211\\\\302{\\\\357\\\\275ww\\\\276\\\\030U\\\\203$I$8\\\\300ZN\\\\3234\\\\317\012\042\\\\360\\\\276\\\\027\\\\330D\\\\2365\\\\007\\\\007\\\\207.x\\\\327\\\\365>\\\\0061\\\\2377J\\\\373\\\\030\\\\200X\012\\\\327\\\\005\\\\257\\\\000Mb\\\\007\\\\003\\\\347cHm\\\\262X-#\\\\204\\\\331l\\\\342\\\\272\\\\276\\\\367N\\\\317&\\\\363\\\\323\\\\323\\\\007\\\\257_\\\\275\\\\334nW\\\\2115\\\\325\\\\240z\\\\370\\\\350t\\\\265Zn\\\\326\\\\233\\\\340\\\\303j\\\\265\\\\332n\\\\233\\\\355\\\\266\\\\216\\\\201\\\\267\\\\333\\\\355j\\\\265:=9\\\\276\\\\271\\\\276\\\\032\\\\224E\\\\221g/^\\\\274,\\\\262<I\\\\263\\\\027/^t]\\\\177}}\\\\275\\\\335\\\\264Lt8?\\\\254\\\\252\\\\2411\\\\006\\\\224.\\\\313\012\\\\320\\\\\\\\\\\\\\\\^\\\\216\\\\306\\\\223$K\\\\274\\\\017\\\\314\\\\260\\\\335n\\\\224R\\\\223\\\\351\\\\364\\\\323\\\\277\\\\3744I\\\\222,\\\\313\\\\230\\\\371\\\\305\\\\213W_~\\\\365U\\\\347<\\\\021\\\\201Bc\\\\255\\\\320\\\\230@r\\\\004\\\\214\\\\271\\\\337_\\\\336;f\\\\221d\\\\300\\\\335\\\\003f{k;\\\\371\\\\032y$\\\\015\\\\006\\\\203w\\\\337}\\\\367\\\\351\\\\323\\\\367\\\\332\\\\266{\\\\376\\\\374E\\\\222\\\\246\\\\207\\\\207G\\\\333\\\\272\\\\271\\\\276\\\\276\\\\221A-\\\\354\\\\017%\\\\374\\\\326\\\\344 \\\\337\\\\215\\\\230!\\\\022\\\\030\\\\203\\\\014\\\\024b\\\\231g\\\\223\\\\321D+\\\\3255\\\\235B\\\\244H\\\\306XF&\\\\006\\\\24551\\\\203\\\\322\\\\203\\\\321<+\\\\206m\\\\3476\\\\353:\\\\020y\\\\037\\\\272\\\\266%\\\\347\\\\344D\\\\225'I\\\\222Xf\\\\210\\\\024)\\\\306\\\\030<b \\\\332%\\\\352H\\\\307\\\\007\\\\204]\\\\220\\\\003\\\\323=\\\\027CV\012\\\\300\\\\254\\\\230t\\\\014\\\\206\\\\242A2LH\\\\201\\\\231HA\\\\000\\\\211\\\\315\\\\004T\\\\210\\\\250\\\\200A1#p\\\\037\\\\271\\\\310\\\\264\\\\0131IR`j<\\\\017\\\\207%(\\\\314\012\\\\303\\\\032j\\\\347\\\\225\\\\311TR\\\\266\\\\036\\\\210m`U\\\\014G\\\\353\\\\365&z\\\\007\012c]C\\\\364\\\\203Q\\\\345CO>\\\\252\\\\304\\\\206\\\\316G\\\\037\\\\322\\\\341\\\\224\\\\215ee\\\\347\\\\307\\\\017|DFE\\\\304]\\\\327\\\\213\\\\220$\\\\306\\\\270\\\\335n|p\\\\233\\\\315:\\\\306(3n$\\\\032\\\\215\\\\307!D\\\\000\\\\324\\\\332\\\\204\\\\020%\\\\267J\\\\272\\\\376.\\\\316\\\\001\\\\000\\\\2652\\\\306$i\\\\222\\\\347yQ\\\\226eY*\\\\255\\\\255\\\\265I\\\\232\\\\026E\\\\221f\\\\231\\\\2656I\\\\2234M\\\\213\\\\262\\\\000\\\\000m\\\\0143\\\\333\\\\304\\\\346y\\\\356\\\\203\\\\357\\\\272N\\\\177\\\\370\\\\321\\\\367>\\\\371\\\\371\\\\317\\\\267\\\\315v:\\\\233\\\\274\\\\367\\\\301{\\\\223\\\\351\\\\344\\\\323_\\\\375\\\\352\\\\342\\\\352\\\\262w\\\\336\\\\207\\\\260\\\\255\\\\233\\\\266\\\\355\\\\263\\\\2548<:f\\\\200,\\\\315\\\\230\\\\302`P\\\\035\\\\237\\\\236\\\\332$\\\\275\\\\276\\\\271[o\\\\266\\\\353\\\\365\\\\332{\\\\177||RU\\\\325t6y\\\\367\\\\351\\\\273\\\\177\\\\347\\\\357\\\\376\\\\335\\\\341h\\\\244\\\\000}\\\\014!\\\\304\\\\363\\\\213\\\\313\\\\305\\\\342.M\\\\323\\\\351t\\\\002\\\\000EQ\\\\020q\\\\323\\\\324y\\\\236\\\\277\\\\367\\\\376\\\\373\\\\200\\\\320\\\\365\\\\375\\\\365\\\\315\\\\315\\\\325\\\\325u\\\\337;\\\\336\\\\343\\\\234\\\\264\\\\317o\\\\025>\\\\231\\\\\\\\)\\\\226d\\\\230\\\\235\\\\327\\\\034\\\\002\\\\360w\012\\\\372\\\\315y\\\\005\\\\264\\\\326y\\\\236\\\\237\\\\236\\\\236\\\\302\\\\3361\\\\350\\\\331\\\\263g\\\\302=\042\\\\242\\\\273\\\\273\\\\273\\\\355fs\\\\377\\\\203\\\\336\\\\272U\\\\336|\\\\237\\\\375\\\\366\\\\013\\\\323\\\\242\\\\010>\\\\000\\\\303p0\\\\234N\\\\017\\\\022\\\\233.\\\\227KY(h\\\\253w8\\\\234\\\\002\\\\246\\\\240mz\\\\374\\\\340q\\\\004\\\\3254\\\\215\\\\367A\\\\274\\\\377:\\\\357\\\\271\\\\353\\\\305\\\\262%ISc-S\\\\014\\\\301\\\\023\\\\305Hq\\\\327iI\\\\254q\\\\305\\\\252W1\\\\334\\\\257\\\\341\\\\210\\\\231\\\\225\\\\304\\\\375\\\\011\\\\2579\\\\022r4L\\\\032HK\\\\223Fa&A \\\\216;\\\\323G\\\\205\\\\014\\\\212\\\\031\\\\200#\\\\2002X;f@\\\\233\\\\026!rP\\\\272vq\\\\335\\\\272\\\\301\\\\344\\\\000mV\\\\014'I6T&=<<=~pf\\\\322lP\\\\015\\\\233\\\\266e\\\\340\\\\341d\\\\302J\\\\267m\\\\303\\\\314J'6\\\\313T\\\\232\\\\222\\\\217\\\\321\\\\005]\\\\226\\\\247g\\\\017\\\\323|\\\\320z\\\\317{\\\\253XA\\\\362\\\\204G`\\\\023{|||zz\\\\372\\\\356\\\\273\\\\357\012\\\\010\\\\342\\\\275\\\\357\\\\272N\\\\224&\\\\242\\\\371x\\\\033\\\\262\\\\026\\\\373\\\\277\\\\030B\\\\360\\\\201\\\\004g\0121xOQ\\\\274\\\\237X\\\\241\\\\002\\\\006\\\\212D\\\\221\\\\230X!z\\\\347\\\\325\\\\016\\\\010@\\\\205*\\\\370\\\\300\\\\304\\\\346\\\\313/\\\\2774\\\\306\\\\370\\\\320\\\\367\\\\275\\\\277\\\\271\\\\276\\\\233LG\\\\217\\\\036\\\\275\\\\363\\\\331g\\\\237:\\\\347\\\\202\\\\247\\\\340!\\\\004 b\\\\004\\\\355\\\\372\\\\220$I^f\\\\243q%!)\\\\037~\\\\370a]\\\\327\\\\327\\\\327\\\\327R\\\\026UU\\\\001\\\\300z\\\\275\\\\376\\\\361\\\\217\\\\177\\\\\\\\\\\\327\\\\365\\\\373\\\\357\\\\277?\\\\030\\\\014?\\\\377\\\\342\\\\213\\\\237\\\\376\\\\364_\\\\304\\\\350\\\\233\\\\246\\\\031\\\\215\\\\253\\\\262,EN3\\\\030\\\\014.//\\\\265\\\\266/_\\\\276\\\\\\\\\\\\255\\\\326}\\\\3373c\\\\222X\\\\037I\\\\336\\\\344.\\\\321\\\\014\\\\021\\\\345yw\\\\177\\\\326~#\\\\304\\\\227\\\\377\\\\374+\\\\250\\\\261\\\\260\\\\367\\\\334\\\\220D\\\\271\\\\267\\\\317\\\\321}\\\\327\\\\275z\\\\365\\\\212\\\\366\\\\271\\\\250\\\\367J\\\\236x\\\\377\\\\375\\\\367_\\\\316\\\\314\\\\212\\\\025)\\\\264&\\\\365\\\\030\\\\264\\\\265Z[\\\\201dw\\\\274\\\\002%B\\\\022\\\\006\\\\231\\\\0270&YR\\\\226\\\\325\\\\266\\\\015\\\\336\\\\305{7\\\\325\\\\242(6!@\\\\010p\\\\017\\\\216H<\\\\315\\\\356\\\\366\\\\323\\\\000\\\\036A\\\\357\\\\010CD\\\\022\\\\235\\\\375\\\\257\\\\277!\\\\330\\\\305K\\\\275\\\\371=#31)&P:\\\\022\\\\335k]w\\\\267\\\\002\\\\260\\\\002e\\\\014\\\\327\\\\035\\\\245\\\\326\\\\204\\\\210\\\\024\\\\025$\\\\305\\\\272\\\\351\\\\017O\\\\317F\\\\223\\\\311\\\\357\\\\375\\\\341\\\\037\\\\234=z\\\\367\\\\360\\\\360(IK&\\\\2450I\\\\213r[\\\\327\\\\345 o\\\\353\\\\346\\\\253/>\\\\375\\\\247\\\\377\\\\344\\\\377\\\\371\\\\371\\\\317\\\\177j\\\\231#\\\\005f\\\\356\\\\2675\\\\000\\\\352jblZ\\\\215\\\\246*I7\\\\3656-\\\\253\\\\246s\\\\262\\\\244\\\\022\\\\357\\\\224,\\\\313\\\\252\\\\252\\\\372\\\\376\\\\367\\\\277\\\\177||,\\\\346oWWWeY\\\\312II\\\\232\\\\2130g\\\\004~\\\\017!\\\\364}\\\\277\\\\367F|s\\\\220\\\\025\\\\360\\\\345\\\\236\\\\313/\\\\267\\\\312}L\\\\214R\\\\020c\\\\224\\\\355\\\\236(\\\\262\\\\3445\\\\246\\\\355\\\\273\\\\371|>\\\\034W\\\\333z\\\\275\\\\\\\\\\\\257F\\\\223!\\\\001\\\\2576\\\\265\\\\\\\\\\\\322\\\\020\\\\301&F\\\\233\\\\304\\\\205\\\\310`\\\\252j\\\\024bw{\\\\267<88(\\\\322|\\\\273\\\\335\\\\326m3\\\\232L\\\\234s_?\\\\373f2\\\\231<~\\\\374\\\\330\\\\246\\\\311\\\\305\\\\345u\\\\337\\\\367\\\\017N\\\\273\\\\246iF\\\\243\\\\221\\\\370\\\\315I\\\\336\\\\346p8\\\\364\\\\336Yk\\\\373\\\\336\\\\003\\\\250?\\\\372\\\\243\\\\177$\\\\017[%\\\\305\\\\261\\\\223\\\\024\\\\355\\\\253\\\\025Q\\\\226\\\\334D\\\\024\\\\003\\\\354\\\\327\\\\264\\\\373V\\\\375o\\\\375\\\\020\\\\336\\\\326r\\\\271<88\\\\000\\\\200\\\\276\\\\357\\\\001\\\\300{\\\\257\\\\215\\\\211!\\\\000\\\\200M\\\\022y\\\\331\\\\375u|k\\\\373\\\\266\\\\207!\\\\230A) P\\\\250\\\\255\\\\261\\\\336\\\\207\\\\273\\\\273\\\\2051\\\\032\\\\024\\\\002\\\\0032\\\\306\\\\350\\\\003\\\\2232\\\\232\\\\230@cQf\\\\314\\\\034\\\\002\\\\361\\\\216\\\\360D\\\\021\\\\330\\\\3324+\\\\006]\\\\275\\\\2260\\\\034\\\\357=\\\\005\\\\037)\\\\252=\\\\031\\\\002P\\\\203B&\\\\006\\\\336eZ\\\\242\\\\0248\\\\2008M\\\\336/\\\\221\\\\221$\\\\331\\\\362\\\\255\\\\273n\\\\037zHD\\\\021\\\\344Y\\\\205\\\\367\\\\357\\\\210\\\\021\042\\\\261V\\\\220\\\\345e\\\\343\\\\270\\\\363\\\\240\\\\262\\\\354\\\\341{\\\\357\\\\377\\\\356_\\\\377\\\\375\\\\337\\\\374\\\\017\\\\177{8\\\\236\\\\204\\\\030{\\\\037\\\\352\\\\2153&\\\\271\\\\271z5\\\\250\\\\206\\\\253\\\\355\\\\346\\\\340`\\\\006D\\\\357\\\\274\\\\367\\\\341\\\\307?\\\\370\\\\365\\\\317\\\\277\\\\370\\\\364\\\\377\\\\376\\\\307\\\\377\\\\350\\\\307\\\\177\\\\376\\\\247\\\\200\\\\220\\\\317\\\\217\\\\332\\\\266\\\\217\\\\014\\\\007\\\\007\\\\007e5\\\\354}PI\\\\272\\\\335nA\\\\355\\\\204\\\\342J\\\\251\\\\311d\\\\362\\\\375\\\\357\\\\177\\\\377\\\\343\\\\217?\\\\016\\\\024E\\\\320\\\\364\\\\374\\\\371s\\\\301A\\\\206\\\\303\\\\341v\\\\273\\\\025\\\\241\\\\223\\\\024\\\\353\\\\256+G\\\\311\\\\314}\\\\223\\\\235~\\\\017\\\\364HW\\\\222\012\\\\226t+f\\\\361\\\\373\\\\304\\\\276\\\\017\\\\362\\\\035\\\\020\\\\261\\\\355\\\\032\\\\347\\\\\\\\\\\\222$J)\\\\375\\\\373\\\\177\\\\360\\\\207/_\\\\276\\\\364\\\\336\\\\255V\\\\353\\\\336\\\\365!\\\\204/\\\\277\\\\374R\\\\241\\\\362\\\\236\\\\231Ak5\\\\233\\\\315\\\\207\\\\303Q\\\\236\\\\225E18=;\\\\233\\\\214\\\\307\\\\233\\\\355\\\\3329\\\\227\\\\347\\\\371p8L\\\\323\\\\024Q={\\\\366\\\\014\\\\021\\\\347\\\\363y]\\\\327WWWi\\\\232\\\\311\\\\002[\\\\356\\\\252\\\\363\\\\363s\\\\347\\\\\\\\\\\\327\\\\271\\\\343\\\\343\\\\303\\\\311d\\\\322\\\\367]\\\\010\\\\3019\\\\367\\\\325W_\\\\255V+c4\\\\356\\\\002\\\\302T\\\\010\\\\3732\\\\305\\\\235K\\\\371\\\\233\\\\301c\\\\267j\\\\335u\\\\2717/\\\\373n/{\\\\233\\\\204%\\\\350\\\\350\\\\311\\\\311\\\\311r\\\\271\\\\274\\\\271\\\\271\\\\241\\\\030y\\\\237a\\\\216J\\\\231\\\\267R\\\\351w\\\\240\\\\356~\\\\015\\\\366V\\\\253@@\\\\305;\\\\3138\\\\014\\\\336\\\\267m+)>J\\\\251\\\\300\\\\022\\\\274\\\\306\\\\200\\\\032\\\\030\\\\320\\\\250\\\\331\\\\301\\\\261\\\\262U\\\\0202\\\\033\\\\203\\\\213^~\\\\226R\\\\312\\\\007bd\\\\255\\\\024\\\\000\\\\007\\\\371#\\\\261l\\\\216\\\\341M\\\\375\\\\335\\\\377P\\\\200]\\\\034\\\\2320\\\\226w\\\\030\012\\\\001D V@\\\\006\\\\330 \\\\003{\\\\342\\\\210\\\\200\\\\254\\\\301\\\\021G\\\\336\\\\015\\\\034(:+\\\\336\\\\215\\\\035i\\\\226\\\\255\\\\266\\\\015\\\\241UI1\\\\030\\\\317\\\\177\\\\367\\\\017\\\\377\\\\346o\\\\374\\\\326\\\\017\\\\301f\\\\213u\\\\275i\\\\035b\\\\262m\\\\332\\\\345r\\\\375/\\\\177\\\\361\\\\227\\\\327ww]\\\\037~\\\\366\\\\311'}\\\\357\\\\213\\\\301`\\\\271\\\\\\\\\\\\035\\\\037\\\\037\\\\377\\\\265\\\\037\\\\376p4\\\\235\\\\375\\\\362\\\\323\\\\317\\\\\\\\\\\\347\\\\200 \\\\033\\\\015\\\\207\\\\223i\\\\232\\\\025\\\\200:0\\\\017\\\\252\\\\341`P\\\\315f\\\\263\\\\017>\\\\370\\\\340G?\\\\372\\\\321\\\\357\\\\374\\\\316\\\\357\\\\014\\\\006\\\\203\\\\363\\\\363\\\\363\\\\266\\\\353\\\\266\\\\333-\\\\354\\\\363\\\\001\\\\345\\\\031.p\\\\240\\\\324\\\\250\\\\000\\\\335\\\\322\\\\260c\\\\214}\\\\337\\\\313\012O\\\\210x\\\\222j)\\\\037\\\\274\\\\227\\\\2538\\\\347\\\\274\\\\367\\\\342&'\\\\222\\\\226\\\\272\\\\256E\\\\000\\\\014\\\\000\\\\306\\\\230\\\\276\\\\357\\\\315\\\\237\\\\375\\\\305\\\\217\\\\2151!\\\\270\\\\242\\\\032t]\\\\363\\\\342\\\\371K\\\\225h\\\\362\\\\321\\\\244\\\\026A\\\\307\\\\030A\\\\231\\\\325\\\\246]\\\\255\\\\273<\\\\317\\\\315\\\\355\\\\335\\\\341\\\\301\\\\370\\\\364\\\\354\\\\341z\\\\275\\\\356z7\\\\237\\\\037\\\\206\\\\020\\\\231\\\\273\\\\371\\\\374\\\\340\\\\352\\\\352j4\\\\032\\\\022\\\\361\\\\305\\\\305\\\\305\\\\240\\\\032\\\\005\\\\212w\\\\313\\\\305l~\\\\340C\\\\377\\\\350\\\\361\\\\331g\\\\237}\\\\226fZ\\\\026\\\\325J\\\\251\\\\355v\\\\323\\\\365\\\\375\\\\257>\\\\373\042\\\\313\\\\362\\\\246n\\\\001@i4ZC\\\\214\\\\270\\\\263]gD\\\\240\\\\310\\\\000\\\\240\\\\367\\\\023X\\\\010ag*\\\\014;\\\\333\\\\364\\\\267\\\\026\\\\254\\\\377\\\\352\\\\207l!\\\\344\0426M#\\\\375C.\\\\223|\\\\341\\\\275\\\\212x\\\\327\\\\001\\\\337j\\\\322\\\\367x\\\\004\042!*\\\\357{k\\\\255\\\\017n\\\\327*\\\\034\\\\2411\\\\032\\\\201a\\\\347:\\\\014ZC``\\\\235\\\\330<\\\\204\\\\200h\\\\231\\\\331\\\\205\\\\300\\\\264S\\\\354\\\\001@\\\\236\\\\347\\\\275k\\\\211\\\\310{\\\\212\\\\3363G\\\\320F\\\\346\\\\026\\\\000\\\\004\\\\324\\\\250\\\\304\\\\364e\\\\357\\\\353%\042V\\\\330\\\\207\\\\035\\\\262\\\\340\\\\201\\\\244\\\\230\\\\200\042(\\\\216\\\\202]\\\\0233\\\\262f\\\\365\\\\366\\\\225\\\\330\\\\335\\\\366\\\\270\\\\263\\\\343\042\012\\\\014\\\\034\\\\003\\\\345e1?9-\\\\207\\\\007\\\\027\\\\267\\\\253\\\\361|\\\\246\\\\2632\\\\366.\\\\242\\\\276\\\\276]\\\\266\\\\333z\\\\333t\\\\333\\\\246\\\\253\\\\237\\\\277\\\\266i\\\\372\\\\372\\\\374\\\\232\\\\230\\\\307\\\\243\\\\252\\\\017\\\\376\\\\301\\\\321\\\\341_\\\\377\\\\233\\\\177\\\\353\\\\351\\\\007\\\\037\\\\375\\\\303\\\\177\\\\370\\\\277\\\\275xu\\\\376\\\\341\\\\367>>zp\\\\222g\\\\345l~8\\\\032\\\\216\\\\023\\\\223\\\\026E\\\\201\\\\210\\\\333\\\\355v\\\\273\\\\335^^^\\\\312\\\\205],\\\\026R\\\\246\\\\262\\\\220\\\\035\\\\217\\\\307\\\\302\\\\260\\\\007\\\\000\\\\301\\\\256\\\\263,\\\\023}\\\\212\\\\265\\\\326{o\\\\324.\\\\222\\\\212\\\\336\\\\352\\\\331\\\\002\\\\211K_s\\\\3169\\\\3271\\\\263\\\\332\\\\333\\\\037\\\\003\\\\200\\\\017.\\\\317\\\\363\\\\035\\\\331\\\\237\\\\241\\\\331\\\\326\\\\306\\\\030\\\\263^\\\\255\\\\2122_.\\\\026\\\\300\\\\234\\\\225eW\\\\3276\\\\313\\\\244\\\\265\\\\220wm\\\\333o75\\\\3058\\\\034M\\\\272\\\\256S\\\\020\\\\274\\\\357_\\\\274x\\\\301\\\\034\\\\023k\\\\225\\\\302$I\\\\252\\\\252*\\\\313\\\\262\\\\353\\\\272\\\\007\\\\017N\\\\357\\\\356\\\\356\\\\254\\\\265\\\\357\\\\277\\\\377\\\\376h4\\\\272\\\\273\\\\273k\\\\233v>\\\\237\\\\377\\\\362\\\\227\\\\237\\\\001\\\\304\\\\233\\\\233\\\\033f\\\\036\\\\014\\\\006\\\\257_\\\\277\\\\376\\\\374\\\\363\\\\257G\\\\343\\\\341j\\\\271N\\\\263\\\\004\\\\000\\\\372\\\\316\\\\271\\\\350\\\\363\042k\\\\333n\\\\237i\\\\002B\\\\034\\\\233L&\\\\363\\\\371\\\\\\\\6\\\\342\\\\353\\\\325\\\\3269\\\\367f\\\\352\\\\3757\\\\027\\\\264\\\\010x\\\\204\\\\267\\\\335J\\\\2542\\\\2769PKo~\\\\323\\\\321\\\\377*I\\\\017\\\\354D\\\\023\\\\024]\\\\000\\\\320\\\\344\\\\035 \\\\332\\\\254\\\\360\\\\261cT\\\\221\\\\324\\\\336\\\\353\\\\323 \\\\244\\\\214\\\\032\\\\320\\\\240N}d\\\\006\\\\356\\\\275\\\\227\\\\024\042\\\\000\\\\3601\\\\000@\\\\226%!:\012\\\\221c\\\\214\\\\301\\\\211\\\\017.3k\\\\260\\\\273\\\\250\\\\032\\\\301H\\\\344\\\\206\\\\346\\\\310D \\\\031H@Hq\\\\267\\\\350 \\\\231\\\\265X\\\\234\\\\353\\\\002\\\\223L\\\\326\\\\310H\\\\367\\\\027M~sd\\\\002P\\\\010!\\\\000\\\\307p8\\\\235\\\\335\\\\325\\\\221\\\\231\\\\313\\\\301\\\\370\\\\365\\\\371\\\\325\\\\371\\\\335\\\\366A\\\\357\\\\037\\\\276\\\\3638\\\\222\042\\\\202\\\\246\\\\351\\\\\\\\\\\\3579\\\\306\\\\257\\\\237=\\\\367!\\\\216\\\\246\\\\263\\\\347\\\\317_\\\\334.\\\\216~\\\\363\\\\327?\\\\256\\\\333f\\\\261\\\\\\\\\\\\177\\\\360\\\\301{\\\\243\\\\311\\\\354\\\\177\\\\370\\\\037\\\\377'\042ZmjP\\\\030\\\\011\\\\232\\\\246\\\\015!8\\\\357\\\\227\\\\257_\\\\313\\\\024\\\\021c\\\\254\\\\353\\\\272\\\\256k\\\\357\\\\375\\\\301\\\\341\\\\\\\\\\\\346\\\\275\\\\345r9\\\\235N\\\\273\\\\256\\\\033\\\\014\\\\006M\\\\323\\\\010\\\\205h0\\\\030\\\\024E!\\\\023\\\\2054\\\\227\\\\310A&\012\\\\351\\\\\\\\\\\\002\\\\254\\\\310\\\\343T\\\\272{\\\\327u]\\\\327H\\\\277\\\\327Z\\\\013Y\\\\2108v]'_\042f\\\\320:0*\\\\255C\\\\210\\\\240\\\\000\\\\024\\\\206Hh\\\\214p\\\\020C\\\\347\\\\307\\\\007\\\\363\\\\256w\\\\241\\\\357l\\\\236\\\\241R\\\\363\\\\303y\\\\333\\\\266&\\\\321\\\\233\\\\325\\\\272m\\\\033\\\\255\\\\224\\\\265\\\\366\\\\342\\\\365\\\\371ry\\\\227&\\\\326\\\\273>FZ\\\\255V\\\\000pss\\\\255\\\\254=9>^\\\\257W\\\\357\\\\274\\\\363\\\\370\\\\223O~1\\\\034\\\\016NNNnoo\\\\377\\\\345/?].W\\\\250\\\\260\\\\357= \\\\306H!\\\\356x\\\\002!D\\\\245vUj\\\\254I\\\\022\\\\213\\\\010\\\\336\\\\207\\\\233\\\\233\\\\233\\\\315f\\\\303\\\\314\\\\210\\\\020\\\\274c\\\\332%\\\\202R\\\\214\\\\270\\\\313\\\\010\\\\177\\\\363\\\\361v\\\\227\\\\022J\\\\352\\\\333\\\\237\\\\222\\\\351\\\\215\\\\367\\\\311\\\\365oF\\\\226\\\\357L\\\\032\\\\367\\\\337\\\\220\\\\011\\\\0105D\\\\016\\\\300\\\\014\\\\332\\\\020\042\\\\240\\\\201 \\\\316\\\\373\\\\032l\\\\256\\\\222\\\\202\\\\311\\\\200J\\\\252j\\\\242uF\\\\240\\\\211\\\\230)2Eq\\\\304P\\\\210\\\\300\\\\020\\\\243W\\\\010j\\\\277\\\\260\\\\003\\\\212D$q-D1\\\\006O1\\\\000\\\\221\\\\014\\\\315\012\\\\225\\\\340\\\\314H\\\\204 \\\\272m\\\\011\\\\323\\\\000C\\\\234(\\\\320\\\\310\\\\304\\\\0368*DI\\\\213\\\\2172K+#\\\\371\\\\034\\\\273w\\\\247\\\\030\\\\001\\\\210\\\\240w}\\\\004]\\\\215\\\\347\\\\263\\\\303\\\\007}\\\\240\\\\203\\\\243\\\\2234\\\\317\\\\233\\\\2465Z'\\\\211\\\\015\\\\336_]\\\\234\\\\177\\\\363\\\\325\\\\227Y\\\\232v.:\\\\357\\\\2656\\\\316\\\\365\\\\227\\\\327Wm\\\\327ic\\\\232\\\\256\\\\355Z\\\\227\\\\346y\\\\222f\\\\235\\\\363\\\\233\\\\315\\\\366\\\\342\\\\342\\\\362\\\\342\\\\342b\\\\261Xum{q~~{{\\\\033c\\\\024\\\\237N9\\\\364;\\\\357\\\\345,.r\\\\351\\\\373\\\\265\\\\201(\\\\203\\\\244\\\\357\\\\312u^/We\\\\261\\\\253r\\\\021y\\\\224Y\\\\356\\\\372>K\\\\323f[3\\\\207\\\\305\\\\335m\\\\360\\\\216b\\\\310\\\\263\\\\254\\\\357:`\\\\356\\\\273n6\\\\235,\\\\027w\\\\365f\\\\333\\\\265-\\\\020+\\\\300\\\\355z\\\\243QiP\\\\206w\\\\341g\012q\\\\037\\\\216\\\\202\\\\250\\\\225\\\\215!(c\\\\3458e\\\\223$I\\\\322\\\\303\\\\303\\\\271\\\\321\\\\252mZ\\\\246h\\\\214>=}\\\\360\\\\321G\\\\037\\\\244i\\\\362\\\\311'\\\\277\\\\034\\\\016\\\\007\\\\243\\\\321H)\\\\334l\\\\266\\\\333f\\\\273^\\\\255\\\\215Mn\\\\256/\\\\247\\\\223qUUm[{\\\\357\\\\237>}zuu\\\\005\\\\200m\\\\333!\\\\252\\\\357\\\\014\\\\216ofaF\\\\004ct\\\\024\\\\252p\\\\244\\\\270\\\\227\\\\264\\\\340}*\\\\370\\\\333\\\\275\\\\350\\\\337\\\\254\\\\332\\\\370\\\\253v\\\\005\\\\337\\\\371\\\\354_\\\\371\\\\202\\\\267\\\\377'\042\\\\330\\\\324\\\\304@ \\\\261'\\\\332@\\\\210@\\\\010\\\\332\\\\232\\\\262*\\\\253\\\\331\\\\361\\\\321\\\\351\\\\311\\\\331\\\\343\\\\331\\\\374\\\\270(\\\\207I\\\\232k\\\\223\\\\212W\042Qt\\\\316\\\\273\\\\276\\\\223\\\\232\\\\006$\042\\\\322\\\\000J#P\\\\214\\\\301Ap\\\\022\\\\336,\\\\020 \\\\202\\\\332\\\\305\\\\033\\\\355\\\\216\\\\202Q)\\\\004 \\\\265\\\\363\\\\357\\\\334\\\\305\\\\301k`\\\\025\\\\331 (d\\\\340\\\\310\\\\034\\\\367\\\\267!F\\\\011d\\\\336\\\\347\\\\330\\\\356e\\\\330\\\\302\\\\000\\\\004T\012u\\\\232\\\\024\\\\243\\\\321\\\\354 \\\\260\\\\312\\\\312\\\\301h4\\\\022\\\\310\\\\211\\\\231 x\\\\357\\\\334\\\\345\\\\371E]7\\\\221Qt\042>x\\\\347\\\\274L\\\\256M\\\\323T\\\\303\\\\321\\\\371\\\\371\\\\371r\\\\2659<<\\\\312\\\\262\\\\374\\\\352\\\\372\\\\352\\\\325\\\\253s\\\\347\\\\334j\\\\271j\\\\352F\\\\206\\\\007Q\\\\025\\\\311/\\\\324v-\042\\\\336s\\\\214\\\\206\\\\303aQ\\\\024\\\\222\\\\313(\\\\356\\\\2461\\\\306\\\\315f\\\\223\\\\246\\\\251\\\\321\\\\272m[!`\\\\356\\\\336\\\\014\\\\200\\\\034\\\\370\\\\210\\\\250n\\\\266\\\\342Z!\\\\335\\\\307{/>\\\\376WWW\\\\302\\\\365=??\\\\227\\\\024,q8\\\\322\\\\300Zv\\\\371\012w\\\\327\\\\024\\\\030\\\\201%y\\\\035\\\\215\\\\326!x\\\\004\\\\245\\\\225.\\\\362\\\\354\\\\235w\\\\036y\\\\357\\\\266\\\\333M\\\\236\\\\245\\\\307\\\\307GE\\\\221+\\\\004\\\\015\\\\230&\\\\252\\\\314\\\\363\\\\331|\\\\326\\\\367\\\\035 &iV\\\\224E\\\\226g_~\\\\376\\\\305d<\\\\236M\\\\246\\\\323\\\\331\\\\364\\\\365\\\\353s\\\\245\\\\324\\\\227_|\\\\315\\\\240\\\\202\\\\017JYDE;Y%\\\\310\\\\037TH4\\\\306h\\\\321#D\\\\212Ib\\\\2555\\\\014L\\\\221b\\\\0101\\\\004\\\\020\\\\253\\\\211\\\\267\\\\352\\\\376\\\\355B|{l\\\\370\\\\367)\\\\350\\\\375g\\\\031d\\\\011\\\\254\\\\024\\\\332\\\\004\\\\010\\\\001\\\\224\\\\035Lf\\\\307gO\\\\236|P\\\\016\\\\307\\\\250\\\\023\\\\347\\\\342z\\\\323l\\\\266M\\\\357\\\\202\\\\217\\\\024bd&`\\\\0161\\\\204\\\\340ao\\\\212\\\\201\\\\014F+\\\\2435\\\\002\\\\307\\\\030(x\\\\010\\\\0218\\\\002G\\\\031\\\\\\\\\\\\224\\\\004\\\\32431\\\\023D2J\\\\357\\\\325'\\\\362\\\\266H\\\\324\\\\035\\\\026\\\\330 \\\\001F\\\\022o\\\\227\\\\335\\\\213\\\\220\\\\031\\\\024j\\\\224\\\\3241\\\\336Y\\\\332\\\\261<\\\\023\\\\004\\\\022W\\\\251I\\\\213r4\\\\013\\\\021\\\\265M\\\\274\\\\367\\\\203A\\\\2515\\\\370\\\\276\\\\013\\\\336wm\\\\375\\\\372\\\\345K\\\\357\\\\275\\\\363\\\\001\\\\030\\\\004\\\\344\\\\227\\\\347F\\\\014\\\\276\\\\357\\\\372\\\\345j}pp\\\\220\\\\330\\\\364n\\\\261\\\\334l\\\\266?\\\\370\\\\376\\\\257M\\\\306\\\\323\\\\313\\\\213K\\\\253\\\\365\\\\365\\\\365\\\\365\\\\335\\\\335\\\\235\\\\330\\\\335:\\\\347\\\\020q:\\\\235\\\\002\\\\242\\\\254\\\\015\\\\212\\\\242\\\\020\\\\256\\\\234h\\\\256\\\\017\\\\217\\\\217V\\\\353\\\\0250\\\\314f3\\\\301\\\\272\\\\203\\\\017\\\\342\\\\212\\\\233$\\\\311\\\\355\\\\325u\\\\226\\\\246F\\\\353\\\\315z=\\\\034\\\\016\\\\373\\\\276\\\\317\\\\263\\\\264\\\\251\\\\233\\\\266i\\\\264R\\\\327W\\\\327i\\\\222\\\\246I\\\\022\\\\2747\\\\332x\\\\347\\\\202\\\\017\\\\336yD\\\\006\\\\246\\\\340\\\\235V\\\\250\\\\001\\\\315\\\\333\\\\017l\\\\330\\\\205\\\\244\\\\020\\\\207`\\\\254\\\\025Y\\\\013\042\\\\204\\\\340\\\\32349;;\\\\363\\\\336Er/\\\\237\\\\277\\\\370\\\\275\\\\037\\\\3750\\\\261\\\\372\\\\344p\\\\376\\\\345\\\\227_\\\\034\\\\237\\\\034\\\\236\\\\235\\\\236\\\\315\\\\2463`!ZbQ\\\\226!\\\\322\\\\305\\\\305\\\\353<\\\\313\\\\036=|T\\\\015\\\\207\\\\317\\\\236={\\\\361\\\\374u\\\\3279T*I\\\\022`d\\\\265{\\\\350\\\\263\\\\244]+\\\\245\\\\264J\\\\255af1\\\\031\\\\243\\\\310J+\042\\\\212\\\\201\\\\322,\\\\023\\\\252\\\\273\\\\274R\\\\212O\\\\036d\\\\377\\\\226\\\\222\\\\375w+\\\\3507s\\\\013*\\\\362\\\\021\\\\214\\\\005e!\\\\000\\\\250$\\\\033\\\\037\\\\034\\\\034\\\\234T\\\\303I\\\\337\\\\307\\\\246\\\\363M\\\\353\\\\232\\\\276o\\\\333\\\\276\\\\351\\\\273\\\\276\\\\355\\\\272\\\\276s\\\\276'\\\\366b\\\\267\\\\254w\\\\371q\\\\000\\\\200Z\\\\201\\\\331\\\\275\\\\333@1\\\\306\\\\030\\\\200#D\\\\002\\\\222\\\\314\\\\023V \\\\2030\\\\311\\\\340!~F \\\\034\\\\272\\\\035L\\\\030\\\\025\\\\200f\\\\326\\\\310\\\\200L\\\\024X6\\\\326\\\\022<\\\\303\\\\302\\\\377\\\\223\\\\230Id11\\\\332a\\\\352@\\\\240A'\\\\332\\\\346\\\\345h\012\\\\332(m:\\\\337\\\\217GCqp\\\\326\012\\\\272\\\\266}\\\\371\\\\342E\\\\214\\\\024\\\\\\\\D&\\\\205BAB\\\\211\\\\225\\\\214Dm\\\\323\\\\\\\\\\\\337\\\\334.\\\\026\\\\213a5t}o\\\\023\\\\233%\\\\331\\\\273O\\\\236\\\\204\\\\260[Y\\\\034\\\\034\\\\034\\\\210\\\\373m\\\\327u\\\\2108\\\\250*D\\\\024\\\\002\\\\276L\\\\035\\\\3169c\\\\214\\\\370\\\\222i\\\\245e\\\\323e\\\\214Il\042\\\\373\\\\334\\\\020B5\\\\0308\\\\347\\\\004\\\\273\\\\275\\\\270\\\\270\\\\2101\\\\306\\\\030\\\\212\\\\242\\\\220\\\\005\\\\337t:\\\\265\\\\326\\\\336\\\\334\\\\334\\\\304\\\\030\\\\207\\\\303\\\\341r\\\\271|\\\\371\\\\362eUU]\\\\327Zkooo\\\\263,\\\\323\\\\326\\\\024\\\\032\\\\265Q\\\\306(\\\\2435J\\\\217\\\\240H\\\\300\\\\234\\\\330D\\\\220\\\\030\\\\243t\\\\014\\\\216)fi\\\\322\\\\365\\\\355\\\\253\\\\327/\\\\221\\\\341\\\\325\\\\253\\\\027e\\\\221\\\\237\\\\277z5(sk\\\\364l<I\\\\263$+\\\\262\\\\246\\\\355^\\\\276z\\\\375\\\\362\\\\325\\\\213\\\\027/_z\\\\347\\\\307\\\\243\\\\321\\\\311\\\\311!1|\\\\366\\\\331g7\\\\327\\\\213\\\\242\\\\310\\\\0001\\\\006\\\\346\\\\375I\\\\210\\\\337\\\\312\\\\313S\042\\\\377\\\\002b\\\\206,\\\\313\\\\274\\\\017y\\\\236\\\\215F\\\\243\\\\343\\\\223cI\\\\230\\\\215\\\\221\\\\356q\\\\015\\\\331\\\\274\\\\277)\\\\312\\\\267F\\\\027|\\\\353\\\\237\\\\377\\\\277\012\\\\032\\\\277\\\\373\\\\345\\\\014J\\\\2459{\\\\204\\\\200`\\\\363\\\\361\\\\374d~x\\\\252m^wn\\\\261\\\\252\\\\235\\\\363\\\\014\\\\240\\\\2646F\\\\243\\\\226\\\\340:&\\\\337D\\\\362L\\\\221\\\\200\\\\224RFK\\\\344W4J\\\\013\\\\244\\\\022\\\\203c\042\\\\321\\\\006\\\\003\\\\211\\\\211\\\\000\\\\354<\\\\310\\\\005\\\\017\\\\001F\\\\000\\\\022\\\\211W$\\\\371\\\\2244\\\\032dN\\\\20052\\\\003\\\\211\\\\260\\\\017\\\\325N\\\\003&G\\\\350}AK\\\\260\\\\024\\\\000\\\\2022@\\\\250\\\\002)\\\\324)\\\\251t0\\\\234\\\\350$\\\\003\\\\205\\\\325`P\\\\224\\\\0053\\\\247iZ\\\\225U\\\\337\\\\273\\\\257\\\\237=k\\\\352v\\\\377\\\\240\\\\334G\\\\350\\\\021\\\\305\\\\340\\\\235\\\\367!\\\\004k\\\\214F\\\\205\\\\014\\\\227\\\\027W\\\\2218\\\\364.P|\\\\357\\\\275\\\\247gggBG\\\\356\\\\373^d\\\\023\\\\263\\\\331\\\\254\\\\032VEQ\\\\214\\\\307\\\\343\\\\301`\\\\220\\\\347y\\\\222$\\\\210\\\\230\\\\246\\\\251x<\\\\307\\\\020dHh\\\\232\\\\246\\\\336n\\\\211h\\\\275XZm\\\\256./\\\\023k\\\\205\\\\020RUU\\\\010\\\\241o\\\\232\\\\273\\\\333\\\\333AYfiJ\\\\024\\\\230h:\\\\231\\\\364]\\\\347\\\\372^+\\\\005\\\\034\\\\021x\\\\265Xfi\\\\332\\\\267\\\\0350\\\\353,\\\\033\\\\334g\\\\263*\\\\275;61\\\\263\\\\3144!\\\\004\\\\245 M\\\\023\\\\206\\\\350|\\\\277\\\\2557\\\\304\\\\274\\\\274\\\\273\\\\015\\\\336\\\\375\\\\360\\\\257\\\\375\\\\265\\\\371t\\\\372k?\\\\370^[o\\\\277}\\\\366\\\\354\\\\235w\\\\036\\\\347Yvtt<\\\\034\\\\016\\\\2224],\\\\226\\\\353\\\\365z0\\\\030\\\\314\\\\017f\\\\323\\\\311\\\\304\\\\030\\\\373\\\\371\\\\347\\\\237o\\\\267\\\\255\\\\230+\\\\304\\\\020`\\\\027\\\\204\\\\005,X\\\\302^\\\\257\\\\026B8\\\\234\\\\317OO\\\\317\\\\216\\\\217\\\\217\\\\373\\\\276\\\\313\\\\363\\\\274\\\\252\\\\252\\\\243\\\\243\\\\243\\\\353\\\\353\\\\353\\\\276\\\\357\\\\245s\\\\357\\\\253\\\\355\\\\257*\\\\334\\\\267\\\\312\\\\364\\\\337\\\\247\\\\240w\\\\237E\\\\303\\\\220@\\\\000\\\\320\\\\351\\\\360\\\\340d8\\\\232\\\\272\\\\200\\\\353MS7\\\\275\\\\265iD\\\\210!8\\\\337\\\\373\\\\020\\\\244\\\\274\\\\224\\\\006\\\\346\\\\000\\\\3001\\\\370\\\\340|\\\\334\\\\025\042\\\\020\\\\021\\\\002D\\\\357}\\\\337\\\\205\\\\350\\\\221\\\\230Y\\\\200\\\\303\\\\000@\\\\000\\\\021\\\\211\\\\031\\\\210)\\\\300N\\\\341\\\\312\\\\024\\\\367\\\\233\\\\015)Xf\\\\331\\\\337%\\\\210\012\\\\230\\\\230\\\\210\\\\002\\\\211\\\\031\\\\306n^V\012\\\\025\\\\356\\\\266\\\\346\\\\020\\\\221\\\\205\\\\356\\\\031\042D\\\\306@\\\\212\\\\224\\\\365Qge\\\\245m\\\\032\\\\210\\\\2541\\\\211\\\\265\\\\342!\\\\001\\\\210\\\\253\\\\345\\\\346\\\\371\\\\363\\\\027\\\\336\\\\007\012\\\\221c`\\\\212;\\\\227\\\\003f\\\\211\\\\242\\\\355\\\\332\\\\266i\\\\233\\\\246\\\\256\\\\001\\\\300\\\\367\\\\336h\\\\235\\\\030;\\\\254\\\\252W\\\\347\\\\257\\\\252\\\\252\\\\232\\\\317\\\\347\\\\247\\\\247\\\\247GGG\\\\017\\\\036<\\\\030\\\\215F\\\\263\\\\331\\\\354\\\\370\\\\344\\\\370\\\\370\\\\370x6\\\\233\\\\311\\\\205M\\\\222D6\\\\0306\\\\261\\\\316\\\\271\\\\276\\\\353\\\\205\\\\233pssSo\\\\353\\\\242(\\\\312\\\\242h\\\\333vP\\\\226\\\\242\\\\323\\\\323Z_^^j\\\\255GU%D\\\\347\\\\305b\\\\201\012///\\\\227\\\\313\\\\245L\\\\325\\\\306\\\\230\\\\321h\\\\007\\\\326\\\\310:\\\\257\\\\357{\\\\235\\\\246\\\\345\\\\233?!\\\\310sO\\\\314>\\\\204N\\\\020\\\\305A\\\\031\\\\0250s\\\\333\\\\326}\\\\327\\\\006\\\\037\\\\207\\\\303\\\\362\\\\321\\\\243\\\\323\\\\311h\\\\250\\\\265b\\\\212e\\\\236%\\\\326\\\\204\\\\350C\\\\214EY\\\\036\\\\035\\\\237\\\\234_\\\\274\\\\276\\\\275\\\\273k\\\\333\\\\346\\\\341\\\\331\\\\2315\\\\246i\\\\273W\\\\257^1\\\\261s\\\\236\\\\001\\\\263,\\\\013\\\\201`\\\\227\012\\\\013\\\\300\\\\021\\\\230A\\\\355\\\\320\\\\220\\\\217>\\\\374\\\\340\\\\361\\\\343Gi\\\\232|\\\\373\\\\355\\\\363\\\\272\\\\256\\\\327\\\\353\\\\365f\\\\263\\\\021J8\\\\334\\\\303\\\\020\\\\373\\\\010\\\\373\\\\357\\\\024\\\\356[\\\\263\\\\023\\\\277\\\\245t\\\\377w.hf\\\\315\\\\036\\\\301\\\\224\\\\325\\\\370p8\\\\232\\\\022\\\\351\\\\365\\\\272i{\\\\307\\\\312\\\\264}\\\\037(\\\\0100G\\\\020\\\\011b G\\\\321Y\\\\215\012\\\\230\\\\210!\\\\006\\\\016\\\\034v\\\\220\\\\010\\\\261\\\\204/\\\\204\\\\200D@\\\\214\\\\310@\\\\014\\\\310L^*\\\\025\\\\221%\\\\372N*\\\\030AR\\\\344\\\\344c\\\\017\\\\2700\\\\245J!\\\\004\\\\026\\\\330\\\\033y\\\\327\\\\027HNA\\\\210r \\\\001`$\\\\361\\\\257\\\\360\\\\021Xi\\\\000\\\\215i\\\\316\\\\021\\\\323b\\\\230d\\\\271\\\\013Q4\\\\310\\\\342\\\\036\\\\330\\\\365~\\\\275\\\\256\\\\257\\\\256o\\\\000\\\\3207\\\\015r\\\\004&\\\\226\\\\250_\\\\205J)@\\\\310\\\\363<\\\\3172\012\\\\274Zm\\\\372\\\\266m\\\\333n\\\\263\\\\334\\\\334\\\\334\\\\336\\\\254W\\\\313\\\\266\\\\357\\\\272\\\\256\\\\2737\\\\2053\\\\306\\\\034\\\\034\\\\034\\\\370\\\\340\\\\305\\\\226\\\\\\\\\\\\366\\\\323m\\\\333.\\\\227\\\\313\\\\365z]75\\\\021i\\\\245V\\\\253\\\\225\\\\030\\\\225\\\\217\\\\206\\\\303\\\\276\\\\357\\\\203\\\\363B3\\\\026\\\\227\\\\242\\\\020\\\\302\\\\260\\\\034dizww\\\\273X,\\\\030\\\\250(\\\\362\\\\335\\\\353G#9kz\\\\357\\\\3234\\\\351\\\\272Npu)\\\\006\\\\023\\\\001\\\\211#\\\\000(T\\\\010\\\\362\\\\267\\\\001b&\\\\357\\\\224\\\\265I\\\\232\\\\351\\\\304\\\\006&F\\\\235\\\\346%\\\\001\\\\004\\\\347lb\\\\372\\\\276\\\\377\\\\362\\\\213\\\\257?|\\\\372nU\\\\344\\\\261\\\\357-\\\\352\\\\243\\\\371qdZo7Y\\\\226\\\\317\\\\017\\\\216\\\\022c\\\\007E\\\\351\\\\234[\\\\257V\\\\253\\\\345\\\\362\\\\362\\\\352\\\\346\\\\356n\\\\243\\\\024(\\\\2051\\\\006\\\\346D\\\\355R\\\\213\\\\221a\\\\227\\\\242\\\\000\\\\000\012t\\\\231\\\\345\\\\243\\\\3410M\\\\222\\\\345r\\\\271YmQ\\\\003\\\\020lx#w\\\\244H\\\\334\\\\230H\\\\002\\\\223e\\\\360\\\\376\\\\327\\\\367\\\\307{\\\\344XHs\\\\337\\\\035\\\\262y\\\\0179\\\\313+w\\\\005\\\\004;\\\\332:\\\\313L\\\\257\\\\231\\\\021\\\\020Y\\\\245\\\\345\\\\344`8\\\\234\\\\217F#e\\\\023\\\\002.\\\\006#\\\\027\\\\274w1\\\\220gf\\\\037\\\\\\\\\\\\337\\\\267\\\\336G\\\\346(\\\\243\\\\0233k\\\\245\\\\264Q\\\\221\\\\001B\\\\204\\\\340\\\\242\012\\\\010\\\\232\\\\000\\\\220A\\\\213\\\\200I(GJ)4\\\\316\\\\357hG\\\\010\\\\010\\\\022_\\\\312\\\\001\\\\230\\\\225\\\\326\\\\270\\\\213\\\\221\\\\336S\\\\354\\\\205\\\\203d\\\\214\\\\260>\\\\342\\\\316O\\\\024\\\\000\\\\025cdP\\\\254\\\\014\\\\202f\\\\204\\\\210\\\\314h\\\\030\\\\211\\\\224\\\\006\\\\2550-\\\\200\\\\225\\\\315\\\\006=\\\\020\\\\030\\\\213\\\\312 \\\\301h<\\\\2251\\\\200\\\\231\\\\025`>\\\\310\\\\262\042\\\\2577+c\\\\025D\\\\2101\\\\356\\\\274L\\\\211\\\\002\\\\0213K\\\\311*\\\\245\\\\254\\\\265\\\\326\\\\346m\\\\275\\\\341\\\\030QqD\\\\002\\\\015\\\\213\\\\233\\\\333\\\\213\\\\213\\\\327\\\\263\\\\361l:?\\\\350\\\\352\\\\346\\\\374\\\\374\\\\\\\\\\\\2167\\\\022gJ!\\\\366}\\\\3376\\\\2152\\\\272\\\\310\\\\362\\\\333\\\\305]\\\\236f\\\\210\\\\270\\\\331l\\\\332\\\\266-\\\\363\\\\242i\\\\232a9h\\\\332\\\\255Qv\\\\263Y\\\\031\\\\223\\\\204\\\\340\\\\266\\\\253m\\\\226%\\\\307\\\\307\\\\307\\\\233\\\\315\\\\346\\\\372\\\\346\\\\252(\012\\\\241\\\\374\\\\367}/\\\\240\\\\314`0H\\\\022#S\\\\373\\\\301\\\\301\\\\201\\\\254\\\\007\\\\214G\\\\324Ib\\\\224\\\\016\\\\3019\\\\347\\\\264AL\\\\014D\\\\007\\\\021\\\\224\\\\326J\\\\353\\\\270\\\\263_B\\\\347\\\\275\\\\363\\\\000\\\\240\\\\254\\\\325e\\\\232/\\\\227\\\\253\\\\371\\\\301\\\\311\\\\315\\\\305\\\\371\\\\341\\\\344\\\\360\\\\037\\\\374\\\\203\\\\377\\\\371?\\\\371[\\\\177\\\\033\\\\265\\\\322\\\\250|\\\\347/\\\\316\\\\317\\\\213\\\\242\\\\260\\\\326~\\\\364\\\\321G\\\\303\\\\262\\\\020G\\\\335\\\\315j#S)\\\\021\\\\365]\\\\243\\\\224!\\\\347\\\\323,s\\\\336\\\\003\\\\2216\\\\006\\\\0304\\\\303\\\\343\\\\263\\\\207\\\\307\\\\207'\\\\316\\\\271\\\\256\\\\351\\\\255Q>\\\\220\\\\321\\\\030\\\\234WJ\\\\311\\\\006\\\\341\\\\276[\\\\355\\\\322\\\\302\\\\231x\\\\207}\012\\\\356\\\\253\\\\021\\\\020X\\\\031\\\\231\\\\263\\\\0052C\\\\324Z\\\\003\\\\0201F\\\\221\\\\202\\\\0002\\\\023\042h\\\\215\\\\202\\\\317h\\\\015\\\\250\\\\214\\\\017\\\\300\\\\244\\\\000\\\\222\\\\244\\\\254\\\\346\\\\207\\\\017\\\\036\\\\234<\\\\364\\\\216c\\\\344\\\\256\\\\3536\\\\233E\\\\2141\\\\313\\\\222\\\\331\\\\301l4\\\\032m\\\\267\\\\333\\\\365z}\\\\273\\\\350\\\\002`^\\\\016\\\\264\\\\326m\\\\337\\\\324\\\\3335)\\\\010\\\\024wC\\\\224V\\\\300\\\\021|\\\\317>`^\\\\252\\\\373\\\\364\\\\023\012\\\\260#\\\\305ZP\\\\0068\\\\002\\\\021C\\\\004\\\\245\\\\264B\\\\305\\\\310\\\\014@!RL\\\\263\\\\244\\\\357=he\\\\023\\\\355\\\\332\\\\316\\\\246\\\\2261\\\\266\\\\241SF\\\\243N\\\\0021\\\\023$I\\\\346\\\\221\042*kRB\\\\345zg\\\\363\\\\342\\\\370\\\\301\\\\203j4\\\\354\\\\273\\\\210:\\\\223s\\\\0073t}\\\\004\\\\200\\\\316\\\\021\\\\001o\\\\267\\\\2151&F&\\\\242\\\\247\\\\357<i\\\\232mY\\\\230\\\\327\\\\256Vb\\\\355\\\\010L\\\\314\\\\210\\\\264\\\\017n\\\\207\\\\304j\\\\201{\\\\274\\\\213\\\\353UH\\\\323\\\\224)x\\\\337fe\\\\321\\\\273F\\\\201::9z\\\\375\\\\374\\\\305d6\\\\235\\\\216'7w\\\\267\\\\342++>\\\\371Z\\\\353\\\\323\\\\323\\\\323f\\\\273\\\\236N\\\\24777W\\\\233\\\\315f\\\\203\\\\230e\\\\331\\\\321\\\\374\\\\260o\\\\233\\\\266\\\\336\\\\014\\\\253j8\\\\034\\\\\\\\\\\\\\\\l\\\\264U1\\\\206\\\\333\\\\253\\\\353\\\\303\\\\243\\\\271\\\\326\\\\010\\\\310_|\\\\375eQ\\\\024\\\\263\\\\371\\\\\\\\\\\\366}\\\\221\\\\271\\\\355{\\\\233\\\\246eU9\\\\347.\\\\256n\\\\362</\\\\006\\\\211\\\\344k2\\\\263\\\\220\\\\214y\\\\2677\\\\322\\\\022\\\\315.\\\\300\\\\206&|\\\\363h&\\\\202(\\\\273{&k\\\\212\\\\310\\\\364\\\\360\\\\301\\\\211A\\\\365\\\\341\\\\373\\\\037\\\\\\\\]\\\\274\\\\356\\\\333\\\\356\\\\356\\\\346&+s\\\\347\\\\303\\\\335b\\\\261\\\\355\\\\373W\\\\257^\\\\001\\\\300\\\\301\\\\301\\\\301\\\\243\\\\263\\\\207\\\\300<\\\\235\\\\036\\\\274|\\\\361\\\\177&IR\\\\327\\\\275\\\\261\\\\026\\\\021\\\\345\\\\2731\\\\221B\\\\214\\\\0001\\\\204$I\\\\346\\\\363\\\\331\\\\365\\\\325mt\\\\3369\\\\327\\\\324\\\\2651\\\\00612s\\\\226$n\\\\307Z\\\\376\\\\216\\\\035\\\\020\\\\213\\\\214\\\\016Ar_\\\\001\\\\014\\\\000HB\\\\016\\\\263d3#\\\\355h[A\\\\236\\\\001&-m\\\\0077\\\\204\\\\000\\\\000 \\\\000IDAT\\\\002E\\\\210\\\\001\\\\230\\\\210\\\\200\\\\220\\\\023\\\\255\\\\310\\\\200s\042I5y5y\\\\364\\\\316\\\\373\\\\263\\\\203\\\\243.\\\\360j\\\\323\\\\015\\\\313Ap\\\\235\\\\002\\\\234M\\\\246\\\\243q\\\\225Z\\\\323u\\\\335\\\\372\\\\346&\\\\317\\\\363A\\\\226\\\\206\\\\262\\\\200\\\\225\\\\357\\\\352\\\\026\\\\021\\\\225VU^\\\\365\\\\256&\\\\2434 \\\\0008\\\\347\\\\3309`\\\\206\\\\304\\\\260wa?\\\\344\\\\240\\\\274\\\\021\\\\346\\\\020\\\\002\\\\032\\\\315qO&!\\\\221\\\\341\\\\002s\\\\264\\\\306\\\\020G\\\\212^k$\\\\366\\\\256w\\\\240@'\\\\006\\\\021\\\\024fD\\\\344|L\\\\262<\\\\311\\\\362\\\\274\\\\254\\\\236<}\\\\357`~L\\\\240l\\\\222\\\\215g3m\\\\222o\\\\276}v\\\\376\\\\3722\\\\251\\\\262\\\\266\\\\021I\\\\023\\\\304\\\\030\\\\235'\\\\245Tb\\\\020\\\\001\\\\275\\\\367\\\\233M\\\\235$\\\\311f\\\\271\\\\332n\\\\267\\\\301ui\\\\226\\\\244i\\\\342\\\\243\\\\007F\\\\231\\\\275p_\\\\000\\\\374\\\\226\\\\337\\\\034\\\\0219\\\\327{\\\\357\\\\332\\\\266A\\\\255*_\\\\231$1\\\\306\\\\350+\\\\3254M\\\\214\\\\241\\\\331\\\\326m\\\\333\\\\302d\\\\222M&\\\\256\\\\353\\\\263,\\\\003\\\\344\\\\177\\\\371\\\\363_\\\\014\\\\207\\\\303\\\\365z\\\\035\\\\231\\\\363<\\\\037\\\\024\\\\345\\\\325\\\\325\\\\325\\\\302,\\\\256\\\\257\\\\257\\\\207\\\\203\\\\001\\\\021-\\\\026w\\\\210\\\\030\\\\234o\\\\232f<\\\\034v]\\\\327\\\\264\\\\365(\\\\031\\\\235\\\\234\\\\234\\\\254V\\\\253\\\\327\\\\257_3\\\\263\\\\264\\\\341\\\\246if\\\\263\\\\331j\\\\265\\\\222\\\\363\\\\225\\\\234\\\\000\\\\263,3\\\\306l\\\\267[c\\\\024\\\\002\\\\310\\\\331\\\\0305\\\\252\\\\335\\\\010\\\\246@)T@\\\\010\\\\244\\\\025\\\\002@\\\\010\\\\236\\\\202W\\\\200\\\\351`\\\\200\\\\210\\\\303a\\\\345\\\\275\\\\257\\\\273z<*\\\\215AT4\\\\030\\\\225UU\\\\265\\\\235[\\\\267\\\\365\\\\327\\\\237~\\\\371\\\\3457\\\\317\\\\232\\\\026\042\\\\323\\\\331\\\\203\\\\323,+z\\\\027\\\\030\\\\241\\\\355\\\\373rPl\\\\267\\\\015\\\\200Rh\\\\000T\\\\014\\\\302\\\\177\\\\336\\\\2114\\\\217\\\\216\\\\216\\\\2546\\\\333\\\\266\\\\371\\\\354\\\\263\\\\317\\\\276\\\\372\\\\352+\\\\357\\\\003\\\\010c\\\\222z\\\\341\\\\240\\\\275\\\\235*\\\\311{B\\\\374[\\\\377zC+e\\\\336=\\\\325\\\\2156D$y\\\\303J)\\\\357zDT\\\\010\\\\014F\\\\334\\\\205\\\\304\\\\375\\\\004\\\\301\\\\032\\\\223\\\\014G\\\\363\\\\007\\\\017\\\\337\\\\231\\\\315OB\\\\004\\\\013t<\\\\233+\\\\245\\\\2124\\\\223Sr\\\\232Z\\\\005\\\\3041rj)\\\\270*\\\\317F\\\\325\\\\320\\\\037\\\\036o\\\\352\\\\355f\\\\263Yo\\\\352\\\\256o\\\\024 \\\\305H\\\\000J)\\\\255T\\\\320\\\\032\\\\210\\\\2656\\\\321w\042\\\\223\\\\006\\\\245\\\\024*\\\\000\\\\022\\\\371\\\\200V\012\\\\224\012$\\\\207\\\\277\\\\035\\\\011\\\\213!\\\\202\\\\322\\\\210\\\\034\\\\202\\\\263i\\\\022{\\\\024V\\\\202M\\\\322\\\\315f\\\\303>\\\\230,\\\\373\\\\360\\\\343\\\\017~\\\\377\\\\017\\\\377\\\\306\\\\373\\\\037|\\\\010J\\\\037\\\\036?`P\\\\236\\\\350\\\\346v\\\\361\\\\343\\\\277\\\\370\\\\347\\\\377\\\\374g\\\\177\\\\256\\\\264\\\\035\\\\014\\\\252\\\\345bmu\042\\\\024\\\\237\\\\020\\\\202s^\\\\002s\\\\205\\\\270\\\\\\\\\\\\024\\\\005\\\\021\\\\215\\\\307\\\\323W\\\\257^\\\\015G\\\\003\\\\337\\\\365\\\\202\\\\252\\\\2759X\\\\013\\\\340\\\\006$\\\\353\\\\001\\\\334c\\\\253\\\\274\\\\367\\\\030\\\\347\\\\010\\\\233\\\\315\\\\306\\\\246\\\\351=1\\\\003\\\\000\\\\344\\\\320v}}U\\\\226\\\\345|>_.\\\\027\\\\243\\\\321\\\\250\\\\357\\\\273\\\\353\\\\353.\\\\337\\\\346\\\\214P\\\\016\\\\253\\\\273\\\\253\\\\253\\\\341pxuq~x0\\\\353\\\\2326O\\\\323\\\\272\\\\256ono$\\\\255oS\\\\327\\\\0000\\\\231\\\\315noo'J\\\\311\\\\362D<\\\\302%\\\\237D\\\\362\\\\201\\\\244fp\\\\317\\\\216\\\\024\\\\252\\\\223N\\\\212!\\\\200\\\\\\\\j\042\042\\\\245P#\\\\307\\\\030wveJ%Z\\\\013\\\\321\\\\214b\\\\324\012G\\\\343\\\\211\\\\261\\\\346\\\\344hn4><=\\\\035U%p\\\\270\\\\275\\\\271*\\\\212<P`\\\\315Y^~\\\\366\\\\305\\\\027M\\\\327)\\\\015>\\\\320z\\\\263=>>)\\\\213\\\\362\\\\371\\\\267/7\\\\233\\\\006\\\\000c\\\\344\\\\262,\\\\235\\\\363r\\\\345\\\\344\\\\2072\\\\2631\\\\346\\\\350\\\\350\\\\360\\\\275\\\\247Oo\\\\357n~\\\\365\\\\253_\\\\265m\\\\237\\\\347)\\\\000D\\\\342$\\\\261Rv\\\\36732\042(\\\\205J)\\\\243\\\\341~M\\\\202\\\\242\\\\305\\\\006a\\\\\\\\2\\\\363w5y\\\\262\\\\024c\\\\220-\\\\230\\\\354\\\\004\\\\200\\\\221A+\\\\264iV\\\\224\\\\203\\\\311l~|t|V\\\\346U\\\\327\\\\271\\\\340C\\\\232\\\\244\\\\326Z\\\\321\\\\371\\\\002\\\\220\\\\357[\\\\337;\\\\205P\\\\3449\\\\207\\\\310\\\\314\\\\034I\\\\001\\\\346YV\\\\225\\\\203\\\\301\\\\240\\\\032\\\\014J\\\\346\\\\210\012\\\\243\\\\363>\\\\006\\\\203*\\\\261\\\\211\\\\320\\\\312\\\\200vtA\\\\340\\\\373\\\\374mb\\\\216F\\\\335s\\\\241d\\\\003-\\\\301$\\\\314L\\\\250U\\\\214Q\\\\031\\\\023\\\\231\\\\201\\\\261\\\\034N\\\\002\\\\201\\\\357\\\\374\\\\351\\\\323\\\\367\\\\377\\\\363\\\\377\\\\342\\\\357\\\\375\\\\235\\\\277\\\\367_\\\\216f\\\\207\\\\325\\\\370`8\\\\233_\\\\336,n\\\\227\\\\233W\\\\257\\\\257\\\\376\\\\354/\\\\376\\\\305\\\\027_~\\\\223\\\\345\\\\025\\\\032\\\\273\\\\33646Ic\\\\240\\\\340\\\\275\\\\024t\\\\010Q\\\\206`\\\\245\\\\324f\\\\273\\\\001\\\\0001s[,o'\\\\223\\\\311\\\\365\\\\365\\\\325z\\\\265\\\\216\\\\201\\\\356u\\\\343\\\\322\\\\236El\\\\3606\\\\200\\\\265[\\\\260*\\\\245PE\042\\\\351I]\\\\327)\\\\245\\\\344`'\\\\034QYH\\\\177\\\\365\\\\325W\\\\342\\\\377-\\\\337\\\\304\\\\030\\\\\\\\-\\\\027\\\\300\\\\324\\\\365\\\\335\\\\240\\\\030l7\\\\033!l\\\\000\\\\300`0\\\\220\\\\345\\\\264\\\\354\\\\263\\\\205g'\\\\306H\\\\314,\\\\344\\\\015!X\\\\037\\\\034\\\\034H)+\\\\245\\\\304\\\\225Fv\\\\341EQh\\\\233\\\\025\\\\262\\\\033\\\\027\\\\200J\\\\266\\\\2321\\\\004\\\\305\\\\000\\\\314\\\\032\\\\225\\\\321\\\\232I\\\\200\\\\000\\\\322\\\\332t\\\\256GTF\\\\341\\\\351\\\\351I\\\\221\\\\333\\\\307\\\\217\\\\317\\\\226\\\\313[\\\\347\\\\232\\\\007\\\\247'\\\\306\\\\250$\\\\315ub\\\\177\\\\362\\\\317\\\\177z\\\\267\\\\354\\\\265QM\\\\355\\\\000x8\\\\231\\\\366\\\\235\\\\373\\\\344\\\\347\\\\277\\\\230\\\\316fm\\\\353\\\\322,\\\\023\\\\2238m\\\\214\\\\020y\\\\005u'\\\\216\\\\326\\\\232\\\\327\\\\257^}\\\\376\\\\305g\\\\333m\\\\2435\\\\372\\\\020B\\\\224\\\\233\\\\217\\\\264F\\\\245\\\\276\\\\003s\\\\3577kjw|Q\\\\250\\\\264F%\\\\375#\\\\246Y*e\\\\202\\\\032Q)\\\\006\\\\022\\\\372{n\\\\015Ff b9 jmR\\\\223\\\\016\\\\272\\\\316\\\\277\\\\363\\\\364\\\\243'O\\\\336\\\\263&s. +\\\\255\\\\214\\\\360\\\\212b\\\\214\\\\344\\\\0352\\\\230\\\\335b\\\\205)\\\\306\\\\324\\\\032f\\\\362\\\\316y\\\\327s\\\\214\\\\032\\\\001\\\\030\\\\230B^\\\\346eQhT\\\\3369\012\\\\321h\\\\215@\\\\3369c4\\\\313\\\\342\\\\202#\\\\320\\\\336\\\\203\\\\016\\\\242\\\\022\\\\312\\\\0363\\\\212\\\\035\\\\021\\\\022*@\\\\2051\\\\006\\\\225\\\\030\012\\\\221P\\\\001+P\\\\326\\\\246E\\\\353\\\\242\\\\035\\\\214\\\\376\\\\333\\\\377\\\\356\\\\277\\\\177\\\\362\\\\336\\\\207i9\\\\032M\\\\017\\\\352\\\\316\\\\257\\\\326\\\\315xzx\\\\273\\\\\\\\\\\\377\\\\277\\\\377\\\\354\\\\307_?\\\\177il\\\\321vn[w\012\\\\023\\\\347=\\\\307\\\\030|\\\\240\\\\375\\\\207\\\\326:I,\042\\\\026ea\\\\214y\\\\370\\\\360\\\\014\\\\200'\\\\223\\\\261<\\\\202n\\\\256\\\\257\\\\273\\\\266\\\\277\\\\227\\\\226\\\\337\\\\367if\\\\020\\\\274L\\\\032\\\\320\\\\236\\\\017\\\\003\\\\314\\\\214\012\\\\021H!\\\\364]\\\\233\\\\245\\\\211B\\\\350\\\\332\\\\306h\\\\265Y\\\\257&\\\\343\\\\321v\\\\263\\\\316\\\\2634Ml\\\\337\\\\265\012\\\\341\\\\325\\\\313\\\\027\\\\2515uS\\\\017\\\\313\\\\262\\\\353[\\\\253\\\\365\\\\355\\\\315u\\\\232X\\\\212!rD\\\\204\\\\355\\\\266\\\\226\\\\373\\\\337Z\\\\033\\\\343\\\\316\\\\341\\\\356\\\\331\\\\263g\\\\336\\\\373\\\\203\\\\203\\\\003\\\\221\\\\002h\\\\255\\\\357\\\\356\\\\356D\\\\266wO\\\\236\\\\026C\\\\242$I4\\\\332L\\\\370\\\\251L\\\\300;+5\\\\210a\\\\217u)\\\\005{B\\\\217\\\\002T\\\\250=\\\\221\\\\010i\\\\212<99:\\\\032\\\\216\\\\006m\\\\263^\\\\255WF\\\\241\\\\2626\\\\3133\\\\245\\\\355g\\\\237\\\\177\\\\261\\\\\\\\\\\\267Y\\\\226F\\\\242\\\\272n\\\\017\\\\217\\\\016\\\\027\\\\213\\\\365\\\\305\\\\345%\\\\005\\\\341k\\\\313\\\\220\\\\301j\\\\317xFDkm\\\\244\\\\020\\\\202\\\\277\\\\272\\\\272\\\\364>$\\\\211I\\\\323Tr\\\\311F\\\\243\\\\252\\\\357\\\\335n\\\\215\\\\370\\\\235\\\\001Z\\\\366\\\\261;\\\\232\\\\331\\\\233\\\\247\\\\241\\\\214\\\\020\\\\2101:\\\\000Vr'\\\\354GmE\\\\304$+lM\\\\200\\\\014\\\\232\\\\010#\\\\301\\\\361\\\\331\\\\273\\\\217\\\\036?\\\\031O\\\\217\\\\274\\\\217\\\\353M\\\\335\\\\267N)U\\\\346\\\\005#0G\\\\002\\\\006\\\\210\\\\242m\\\\022\\\\320\\\\201\\\\231\\\\023\\\\233\\\\024y\\\\231g\\\\231V:x\\\\337\\\\326m\\\\333\\\\324i\\\\222dij\\\\215\\\\365\\\\275\\\\353\\\\332.\\\\206\\\\200\\\\0102\\\\347\\\\001\\\\354O\\\\257\\\\314\\\\214\\\\264S@2\\\\003\\\\200F\\\\000\\\\210\\\\200\\\\274k\\\\317\012\\\\200\\\\243\\\\262\\\\011\\\\211e\\\\221N@[@\\\\235\\\\344\\\\203\\\\377\\\\352\\\\357\\\\3777g\\\\357<]\\\\327\\\\2352\\\\266\\\\355B\\\\222\\\\027\\\\353m\\\\363\\\\247?\\\\376\\\\311\\\\037\\\\377\\\\311\\\\237\\\\306\\\\210.\\\\304\\\\246\\\\351\\\\323,G0m\\\\337'&\\\\015}\\\\037\\\\367\042\\\\006)hA\\\\030\\\\322,\\\\265Vk\\\\2151F\\\\006\\\\222\\\\315\\\\332\\\\267\\\\317\\\\276\\\\225\\\\305\\\\312=\\\\315\\\\346\\\\376\\\\201\\\\376\\\\026~\\\\265\\\\253u\\\\024\\\\312\\\\272\\\\202{\\\\325E\\\\226e\\\\367\\\\204}\\\\031B\\\\326\\\\3535QX\\\\2577\\\\314\\\\021\\\\000'\\\\223\\\\321z\\\\263\\\\0244T\\\\241\\\\362\\\\336\\\\345yf\\\\214\\\\365\\\\336\\\\007\\\\347\\\\357\\\\026\\\\013\\\\255LUU\\\\313\\\\345R\\\\250\\\\366\\\\302\\\\316\\\\223\\\\3219\\\\306(\\\\222(9\\\\233-\\\\026\\\\013\\\\245T\\\\222$B\\\\364K\\\\323T\\\\262~4\\\\246%\\\\305(\\\\270)3\\\\200\\\\002\\\\004\\\\334\\\\305B\\\\033\\\\243P\\\\023q\\\\210\\\\264C\\\\241\\\\224\\\\312\\\\213Q\\\\014l\\\\214\\\\002\\\\200\\\\037\\\\374\\\\340\\\\243A\\\\221\\\\025\\\\231\\\\335n\\\\267\\\\267w7\\\\363\\\\371a\\\\232e\\\\000j[\\\\367\\\\257^\\\\277n\\\\333\\\\200J\\\\245y\\\\221g\\\\305\\\\227_~\\\\215\\\\250\\\\246\\\\007\\\\363\\\\017?\\\\372\\\\336\\\\315\\\\325\\\\215\\\\354*(F@`\\\\000\\\\233$EY\\\\030k\\\\264\\\\325E^\\\\210\\\\261U\\\\323\\\\366\\\\367\\\\2272\\\\204\\\\270#\\\\254k\\\\324Fk\\\\263\\\\213\\\\307UZ\\\\241\\\\322\\\\262\\\\376D\\\\334m\\\\364Lb\\\\322,u}\\\\007B\\\\2636\\\\206\\\\231%B\\\\017@\\\\030A\\\\000J+\\\\235\\\\020#\\\\240\\\\326\\\\305h8\\\\231\\\\377\\\\307?\\\\374\\\\021)\\\\263\\\\274\\\\333t\\\\2757\\\\332\\\\022Sp>0\\\\201\\\\022\\\\326\\\\017\\\\306\\\\030\\\\203\\\\367\\\\301{\\\\205\\\\250\\\\215\\\\356\\\\273\\\\2368r\\\\2141\\\\006&\\\\260\\\\306\\\\344YZ\\\\226e\\\\335\\\\326\\\\210\\\\240\\\\225B\\\\000\\\\357\\\\272\\\\256m\\\\230(1\\\\226)\\\\240\\\\\\\\\\\\335\\\\375\\\\360!\\\\303*0k\\\\301\\\\370p\\\\007\\\\023\\\\362n\\\\223\\\\211\\\\24440\\\\003(\\\\235\\\\025\\\\250\\\\2541\\\\331\\\\343w\\\\337\\\\377\\\\370?\\\\370\\\\255r0J\\\\263b:;\\\\320:\\\\331\\\\266\\\\335?\\\\375\\\\343\\\\177\\\\366\\\\351_~^\\\\226\\\\325\\\\365\\\\315\\\\242m;c\\\\222\\\\030\\\\011Q[c\\\\273\\\\246\\\\001\012\\\\034\\\\035\\\\020\\\\000q\\\\334u\\\\350D)E\\\\321\\\\017\\\\312r\\\\265^\\\\315f3@\\\\316\\\\262\\\\014\\\\021\\\\327\\\\253u\\\\337\\\\365\\\\300J&\\\\264\\\\267\\\\267\\\\362\\\\002\\\\354\\\\354\\\\007l\\\\324\\\\273\\\\017\\\\305DZ\\\\243V\\\\250\\\\024\\\\346Y\\\\332\\\\367]\\\\226\\\\245\\\\300\\\\324\\\\266\\\\315\\\\355\\\\355\\\\315\\\\240,D\\\\317^\\\\226\\\\371z\\\\275N\\\\022c\\\\215\\\\255\\\\267\\\\353jPn\\\\267\\\\333a5X.\\\\356\\\\322$Y\\\\256\\\\226\\\\314P\\\\225\\\\0039$\\\\210#\\\\327r\\\\275\\\\036\\\\215G\\\\26777r\\\\023\\\\2122@z\\\\366\\\\355\\\\355m\\\\232\\\\246\\\\326\\\\332,\\\\313\\\\210\\\\310\\\\030#Pe\\\\214\\\\321(%\\\\230-\042j\\\\241\\\\332i\\\\305D\\\\206\\\\310+\\\\245\\\\030U\\\\210\\\\236\\\\210\\\\022D\\\\320*2\\\\256V\\\\033\\\\233\\\\245\\\\353\\\\325\\\\346\\\\301\\\\321\\\\241\\\\353CQ\\\\224}\\\\273N\\\\323\\\\364\\\\366v\\\\361\\\\344\\\\0117M\\\\027\042>89\\\\033\\\\015~u}\\\\267\\\\262:Q\\\\000\\\\027\\\\027\\\\027\\\\342\\\\370trrTU\\\\0253\\\\005\\\\221B\\\\021\\\\021\\\\221\\\\034S\\\\362<U*\\\\327\\\\006\\\\037\\\\034\\\\2374\\\\315\\\\366\\\\346\\\\346\\\\346\\\\356\\\\356.M\\\\323\\\\325j\\\\343\\\\234\\\\323\\\\032cd\\\\245@^,B\\\\230\\\\375\\\\350\\\\251D\\\\216\\\\326\\\\266\\\\255\\\\367^i]\\\\226\\\\345p8\\\\354\\\\272F\\\\356`D\\\\334n\\\\327\\\\353\\\\365:FN\\\\022\\\\023\\\\\\\\\\\\020\\\\177-\\\\016\\\\001t\\\\222\\\\217\\\\017\\\\036?y\\\\377\\\\321\\\\343w\\\\033\\\\027\\\\225\\\\311L\\\\246\\\\232m\\\\355\\\\242\\\\347\\\\030#E\\\\337\\\\326n\\\\033\\\\224\\\\006kmj\\\\2155F\\\\001\\\\364\\\\241\\\\357\\\\373(\\\\\\\\\\\\234\\\\306\\\\265Dd\\\\215\\\\321&\\\\341H.\\\\364E\\\\232z\\\\212\\\\212aP\\\\224\\\\375\\\\240\\\\2527[\\\\337\\\\367\\\\310\\\\2404\\\\000\\\\242\\\\322\042\\\\307\\\\336?\\\\257\\\\021\\\\024+T\012\\\\221\\\\0004c`\\\\271q\\\\001@[`\\\\002\\\\324\\\\000h\\\\223\\\\202@\\\\333\\\\264|\\\\364\\\\344]\\\\327\\\\207\\\\272\\\\355F\\\\243\\\\311r\\\\275\\\\275\\\\271\\\\271{\\\\365\\\\352\\\\325\\\\217\\\\377\\\\374''''\\\\327\\\\327\\\\327Y\\\\232[\\\\235t]\\\\207\\\\250A\\\\307\\\\030\\\\243F\\\\214;\\\\3758\\\\355/\\\\327~2\\\\336k\\\\010\\\\332\\\\266=:\\\\236/\\\\227\\\\213$\\\\221\\\\257\\\\305=B\\\\360\\\\346\\\\000\\\\376Vq\\\\203|\\\\241\\\\264LD`\\\\216\\\\332$r\\\\004\\\\002\\\\200\\\\020B\\\\222$\\\\336{\\\\361S\\\\\\\\\\\\257\\\\227bT\\\\267^\\\\257\\\\313\\\\262\\\\274\\\\272\\\\272*\\\\213\\\\314;wwww|||yy\\\\351\\\\275\\\\217\\\\221g\\\\263Y5\\\\034\\\\257V\\\\253\\\\223\\\\203C\\\\241\012K\\\\217\\\\367\\\\336?z\\\\364\\\\210\\\\210^\\\\275zU\\\\024\\\\305\\\\321\\\\321\\\\221\\\\360\\\\372\\\\305\\\\020\\\\254\\\\256k\\\\371=\\\\345\\\\257\\\\274\\\\243\\\\277#\\\\262\\\\3222\\\\0301\\\\000p\\\\010\\\\001P)\\\\263w\\\\215 \\\\340\\\\010\\\\000\\\\216\\\\243\\\\001TFK\\\\267K\\\\222,F\\\\276\\\\274\\\\274\\\\371\\\\350\\\\275\\\\247Z\\\\247\\\\210&\\\\006\\\\350Z?\\\\236\\\\314\042\\\\341\\\\343\\\\307\\\\243'O\\\\236\\\\256V?\\\\217\\\\336\\\\035\\\\037?\\\\000\\\\205\\\\321\\\\367YU.n\\\\257\\\\313,\\\\177\\\\370\\\\360\\\\364\\\\253\\\\257\\\\276!\\\\212\\\\273\\\\023?\\\\242s\\\\335\\\\325U\\\\255\\\\224JR#o\\\\365\\\\370\\\\301\\\\351G\\\\037\\\\177_f\\\\246\\\\313\\\\313KQ|\\\\211\\\\241\\\\272\\\\374\\\\336\\\\203\\\\301@\\\\216\\\\336\\\\300j\\\\273\\\\335V\\\\303R\\\\372\\\\364\\\\353\\\\327\\\\257CpUU\\\\306\\\\350c\\\\214b\\\\264*x\\\\354g\\\\237}v~~>\\\\032O:\\\\327OfG`\\\\222\\\\272\\\\011\\\\247\\\\217\\\\236\\\\236<xx\\\\275X\\\\006\\\\017u\\\\335tM\\\\033B\\\\210}\\\\357\\\\273V+\\\\225e\\\\211\\\\311\\\\323$I\\\\010\\\\201(\\\\264-+\\\\344D\\\\033k\\\\264s\\\\275\\\\002bDP\\\\340\\\\243\\\\367\\\\024%\042\\\\315u\\\\035*\\\\205Z'\\\\332\\\\034L\\\\247BF[o\\\\326I\\\\226P\\\\214\\\\210l\\\\215\\\\221\\\\010\\\\245\\\\030\\\\243\\\\350\\\\276s[\\\\270\\\\030\\\\215\\\\261\\\\314\\\\336\\\\024Eh\\\\032@\\\\000k\\\\001\\\\020T\\\\372\\\\370\\\\235'g\\\\247\\\\357\\\\376\\\\366o\\\\377\\\\216\\\\321\\\\331\\\\363\\\\327\\\\347\\\\203A\\\\225Z\\\\353\\\\273\\\\236\\\\231\\\\377\\\\217\\\\377\\\\375\\\\037\\\\022\\\\321\\\\250\\\\2526\\\\253\\\\025\\\\202\\\\352\\\\233\\\\232\\\\031\\\\0250\\\\260PA\\\\010\\\\231\\\\310\\\\007Dd$\\\\242\\\\230h\\\\223hs_\\\\246\\\\333\\\\355v~8C\\\\200\\\\315j]d\\\\271\\\\217\\\\201h\\\\027\\\\311\\\\243\\\\224\\\\001\\\\240}X<\\\\312P\\\\252\\\\265V\\\\240\\\\231\\\\345\\\\314\\\\312\\\\322\\\\241\\\\235\\\\213\\\\211\\\\315\\\\210\\\\203\\\\210d\\\\017\\\\016\\\\016V\\\\253\\\\225\\\\367~0(\\\\352\\\\272\\\\226\\\\236b\\\\214,\\\\302cY\\\\346\\\\301\\\\373\\\\203\\\\203\\\\203\\\\213\\\\213\\\\013\\\\031\\\\202\\\\223$\\\\231L&m\\\\333.\\\\226\\\\353\\\\351t\\\\272\\\\\\\\.e\\\\307/\\\\317[\\\\341\\\\354\\\\267m\\\\373\\\\344\\\\311\\\\223\\\\253\\\\253+\\\\211\\\\334\\\\024\\\\263cf\\\\236N\\\\247\\\\210(\\\\203\\\\215\\\\374\\\\363\\\\350\\\\350\\\\310\\\\214G\\\\225\\\\310\\\\263\\\\202\\\\2203C\\\\000\\\\000\\\\322\\\\032\042\\\\201bP\\\\032\\\\255\\\\025\\\\222n\\\\240\\\\310=i[ s\\\\210AtMI\\\\222-\\\\357\\\\226}\\\\347\\\\347\\\\007G\\\\317\\\\276y~\\\\324\\\\205\\\\263\\\\323\\\\207\\\\250\\\\223<K\\\\312<#\\\\340,\\\\265\\\\214L\\\\321\\\\033\\\\215\\\\233\\\\325\\\\362R\\\\233\\\\253\\\\313sY\\\\033\\\\207\\\\020\\\\211\\\\2009\\\\356\\\\316Z;3\\\\377x{{{}}-\\\\362X\\\\3215\\\\210\\\\314A\\\\004gB\\\\274\\\\332n\\\\2671F\\\\261zq\\\\316-\\\\226\\\\267\\\\362\\\\364\\\\351\\\\272\\\\016\\\\200\\\\2141\\\\303\\\\341\\\\360\\\\372\\\\372\\\\372\\\\374\\\\374\\\\274\\\\252FI\\\\342\\\\212\042\\\\276\\\\367\\\\336\\\\007\\\\017\\\\036\\\\234=\\\\177\\\\371R\\\\207\\\\330G\\\\232\\\\214\\\\252\\\\343\\\\207\\\\207IZ.7\\\\353\\\\325j\\\\335\\\\265A\\\\322D\\\\221!\\\\325\\\\312XE!n\\\\233\\\\015\\\\272\\\\0165\\\\030\\\\245\\\\255\\\\325E\\\\222fYj\\\\265\042\\\\200\\\\276o\\\\021Q\\\\303\\\\316aQ\\\\254C\\\\020\\\\241\\\\032\\\\224\\\\262I\\\\020(\\\\347\\\\360\\\\360\\\\360\\\\364\\\\364\\\\264\\\\353\\\\272\\\\257\\\\277\\\\375\\\\272\\\\357{y\\\\027\\\\342Sjtb\\\\214AVm\\\\333\\\\002\\\\007Ph\\\\222\042\\\\004\\\\007huQ\\\\234=z\\\\364\\\\203_\\\\377\\\\215\\\\337\\\\374\\\\215\\\\337\\\\236\\\\036\\\\034\\\\022!E\\\\365\\\\313_~*\\\\315r\\\\265Z\\\\215G\\\\323\\\\237\\\\376\\\\364\\\\247]\\\\327m6\\\\033\\\\255\\\\255s\\\\256*\\\\253]\\\\017f\\\\205H\\\\314,\\\\016y\\\\360\\\\335\\\\017\\\\334\\\\223l\\\\2118M%i,Q\012\\\\263,\\\\323\\\\321UU\\\\265\\\\362kzce\\\\372\\\\246\\\\255\\\\277\\\\335\\\\324\\\\337PZ\\\\211\\\\263\\\\254\\\\350\\\\373\\\\276(\\\\263\\\\273\\\\273\\\\273\\\\341p\\\\270X,\\\\304\\\\244K\\\\016j\\\\242\\\\005\\\\364\\\\236\\\\2141;\\\\3063b\\\\3354GGGY^\\\\252\\\\276\\\\227\\\\310?b\\\\226\\\\206\\\\005\\\\312x\\\\357\\\\345\\\\317]V\\\\025\\\\021\\\\255\\\\226\\\\313\\\\351t*\\\\277@]\\\\327\\\\314,!R\\\\303\\\\341\\\\360\\\\346\\\\346F\\\\340\\\\033\\\\211\\\\373)\\\\212\\\\242\\\\353:\\\\243\\\\300[MlA#\\\\004T\\\\036\\\\220\\\\003C\\\\214h\\\\015S\\\\204\\\\3408\\\\260\\\\260\\\\353A+@\\\\245\\\\204=\\\\215L!z\\\\357\\\\257\\\\256\\\\256\\\\332z3\\\\032M\\\\006E\\\\365\\\\374\\\\371\\\\363\\\\304\\\\330\\\\315f\\\\023#\\\\037\\\\037\\\\316\\\\226g'\\\\317_\\\\275\\\\234\\\\215\\\\252\\\\363\\\\313\\\\327\\\\355\\\\246\\\\253\\\\261\\\\033V\\\\271\\\\3028\\\\031\\\\017\\\\233\\\\346Bk\\\\023w\\\\001y\\\\210F#!\\\\021\\\\372\\\\030\\\\203\\\\367\\\\320\\\\266\\\\256\\\\353\\\\004{\\\\310\\\\313\\\\322(U\\\\024\\\\205\\\\204\\\\017\\\\365}\\\\317\\\\314\\\\321\\\\007\\\\271\\\\203C\\\\014\\\\243\\\\221U\\\\3264\\\\315\\\\226\\\\000d\\\\263\\\\303\\\\300u\\\\327&Yq\\\\374\\\\340\\\\014\\\\000\\\\372\\\\336_\\\\337.\\\\332\\\\336\\\\217\\\\307\\\\323\\\\233\\\\233E\\\\327\\\\323\\\\354\\\\360p[\\\\267>\\\\200w\\\\361\\\\352\\\\372\\\\345r]\\\\273>\\\\204@\\\\326\\\\246e\\\\221\\\\216\\\\006\\\\325xT\\\\015\\\\362L!\\\\372\\\\020\\\\236\\\\275x\\\\351\\\\202\\\\247\\\\020C\\\\010Q\\\\033\\\\241\\\\020\\\\304\\\\010\\\\263\\\\331\\\\014\\\\225T\\\\017*ed\\\\205\\\\244\\\\001\\\\203\\\\367\012x\\\\317\\\\031d\\\\243\\\\264XZ\\\\376\\\\366\\\\354?\\\\352\\\\272nSo\\\\353z\\\\263\\\\331\\\\324\\\\233\\\\315j\\\\333v\\\\241\\\\353!F@\\\\223\\\\014\\\\206\\\\221(\\\\270\\\\026@=\\\\376\\\\350\\\\327>\\\\376\\\\301\\\\367\\\\177\\\\367\\\\367\\\\177O+K\\\\0047\\\\267\\\\313\\\\311dN\\\\314\\\\3277wRO\\\\321\\\\007\\\\327\\\\367_\\\\177\\\\365\\\\225B6\\\\032\\\\231\\\\242\\\\002\\\\216\\\\316\\\\355\\\\347]F\\\\331\\\\234\\\\020\\\\363\\\\016N\\\\332W\\\\263b@R@\\\\310P7-3\\\\217'\\\\303\\\\253\\\\253\\\\253\\\\351t\\\\322u]5,\\\\367\\\\000J\\\\274/dY\\\\347\\\\003(c\\\\336\\\\320\\\\315\\\\021\\\\264l?\\\\210\\\\010\\\\265\\\\325JM\\\\246\\\\007I\\\\232\\\\247iZ\\\\327\\\\2656\\\\246wN\\\\333,\\\\311\\\\322\\\\375I\\\\024\\\\263,\\\\313\\\\262Lk\\\\335\\\\266=3'i\\\\216\\\\312\\\\240\\\\212J[\\\\342X\\\\327\\\\315|>\\\\2208\\\\033\\\\361\\\\032\\\\365\\\\336'I\\\\032c,\\\\212\042M\\\\323\\\\273\\\\273;\\\\031{D\\\\332\\\\274^\\\\257\\\\001@\042~\\\\304\\\\235b\\\\261\\\\220\\\\320\\\\226\\\\312Xp\\\\210Ai&D6:&Z\\\\340P\\\\205\\\\246\\\\017\\\\3369'!\\\\027\\\\002\\\\264(T>\\\\324\\\\032\\\\225\\\\002v\\\\276y\\\\365\\\\374\\\\305\\\\351\\\\321\\\\374\\\\360`|y\\\\376\\\\272\\\\032\\\\224]\\\\3271\\\\307\\\\315z\\\\365\\\\374\\\\371\\\\363\\\\317\\\\277\\\\370r\\\\265\\\\332\\\\314gU\\\\236\\\\352\\\\027\\\\317\\\\257\\\\255\\\\001\\\\255\\\\3015\\\\255\\\\353\\\\332\\\\037|\\\\357\\\\243\\\\030\\\\343\\\\325\\\\36553\\\\203\\\\332\\\\211!I\\\\010=\\\\000 \\\\206kI\042Cj\\\\214\\\\261\\\\335n%\\\\270MD\\\\204J\\\\353\\\\373\\\\313\\\\255\\\\264n\\\\333\\\\326\\\\244\\\\211\\\\364\\\\217\\\\242(\\\\206\\\\303\\\\241M\\\\264s\\\\356\\\\233o\\\\276\\\\001PY\\\\226\\\\315f\\\\363,+\\\\352m\\\\007\\\\274yp\\\\372(\\\\340\\\\371\\\\343'\\\\037.\\\\026b0\\\\277\\\\331\\\\2567\\\\030\\\\331\042\\\\304\\\\350\\\\016\\\\346\\\\007\\\\017\\\\216\\\\016\\\\213\\\\242H\\\\254\\\\261\\\\326*\\\\0051\\\\362t~\\\\340\\\\234\\\\363]O\\\\0345*\\\\243Q\\\\003\\\\002\\\\261\\\\322\\\\000\\\\000H\\\\030\\\\231\\\\221\\\\200\\\\200\\\\311\\\\007B\\\\322\\\\260\\\\233>\\\\203\\\\363\\\\201\\\\242\\\\004\\\\2050\\\\263\\\\274\\\\315\\\\321h4\\\\231\\\\314\\\\000\\\\300\\\\357S\\\\367\\\\256ooV\\\\253u\\\\333\\\\266n\\\\275\\\\036\\\\035\\\\237\\\\276\\\\377\\\\341\\\\007?\\\\374\\\\275\\\\037=z\\\\364\\\\250wA'\\\\011\\\\006N3\\\\035\\\\003_]]\\\\325u\\\\355\\\\202\\\\277\\\\270\\\\270(\\\\212\\\\301\\\\371\\\\371\\\\345f\\\\263\\\\361\\\\336[k\\\\353u\\\\255\\\\224\\\\272OV\\\\325\\\\032$\\\\250\\\\227(\\\\022E\\\\241\\\\262\\\\274\\\\335\\\\252\\\\357\\\\327\\\\035\\\\250\\\\270i\\\\032k\\\\265\\\\030\\\\332\012G\\\\242^\\\\326\\\\367{\\\\014\\\\365\\\\226\\\\377\\\\316\\\\375\\\\266\\\\370\\\\355N\\\\017\\\\210M\\\\323$\\\\211\\\\271\\\\276\\\\276\\\\036\\\\016\\\\207\\\\267\\\\267\\\\267\\\\363\\\\371\\\\\\\\\\\\022\\\\317\\\\326\\\\353u\\\\232Y\\\\031)\\\\263,\\\\221V\\\\212\\\\210\\\\203\\\\201%P\\\\333\\\\365&\\\\311\\\\031\\\\010\\\\332\\\\266\\\\037\\\\016\\\\207\\\\233\\\\315f4\\\\235\\\\224!\\\\254\\\\226\\\\033\\\\000x\\\\361\\\\342\\\\305x<n\\\\232V)e\\\\255ADQ\\\\273\\\\210\\\\241\\\\270RJ$\\\\267777\\\\362v\\\\256\\\\257\\\\257\\\\313\\\\262,\\\\212\\\\342\\\\333o\\\\277\\\\325\\\\177\\\\377\\\\277\\\\376\\\\317\\\\346\\\\263I\\\\242U\\\\364]\\\\364\\\\235F\\\\316\\\\022\\\\223\\\\245\\\\011p\\\\260\\\\006\\\\023\\\\255M\\\\242\\\\265f\\\\202\\\\3101p\\\\360E\\\\231\\\\273v;\\\\034\\\\025\\\\037~\\\\370\\\\364\\\\333o\\\\276\\\\372\\\\344g\\\\377\\\\342\\\\351\\\\273O\\\\336}\\\\362d\\\\275^\\\\335\\\\\\\\]tm\\\\275^-\\\\212<Ms\\\\353}\\\\013H\\\\314\\\\341`Zd\\\\211F\\\\214\\\\203\042\\\\277\\\\270\\\\274}}\\\\376\\\\342\\\\370\\\\344\\\\370\\\\346\\\\366\\\\006\\\\000\\\\264\\\\3216\\\\265{\\\\306\\\\022\\\\0212\\\\020+\\\\243c\\\\330\\\\015s\\\\242\\\\325A\\\\255y\\\\217\\\\235(\\\\245\\\\020p\\\\267\\\\036B\\\\361\\\\022\042\\\\021\\\\013\\\\313\\\\366>I\\\\322\\\\333\\\\333;f\\\\234\\\\317\\\\347eY\\\\255W\\\\233\\\\331t>\\\\231L\\\\277\\\\371\\\\346\\\\333\\\\027/^\\\\227\\\\325(D\\\\276\\\\273[\\\\254V\\\\353zU\\\\267\\\\333::\\\\327l\\\\326\\\\307\\\\323\\\\351\\\\311|6\\\\237NR\\\\243\\\\243\\\\357\\\\242w\\\\3019\\\\037<\\\\210\\\\243\\\\021\\\\200\\\\006\\\\324 \\\\276\012\\\\204\\\\034\\\\203\\\\3631\\\\004\012\\\\201(p$\\\\242H1P$\\\\004\\\\320(\\\\314A\\\\240](\\\\004\\\\003\\\\200\\\\017\\\\024B\\\\364!\\\\270\\\\336\\\\367!\\\\210\\\\200\\\\237\\\\000F\\\\343\\\\261\\\\315\\\\362\\\\343\\\\007\\\\017\\\\236|\\\\360\\\\275\\\\337\\\\371\\\\335\\\\037}\\\\364\\\\361\\\\257W\\\\243\\\\351\\\\371\\\\3055\\\\203i\\\\273p{s\\\\367\\\\372\\\\342\\\\352g?\\\\373\\\\344\\\\307\\\\177\\\\361\\\\023\\\\347\\\\273\\\\276wJ[\\\\004\\\\375\\\\331g\\\\237\\\\327u\\\\003\\\\214\\\\301\\\\307\\\\020Yi\\\\263\\\\017\\\\326\\\\304]\\\\0342\\\\260D\\\\263\\\\0002P\\\\004\\\\006\\\\004PZ\\\\335\\\\237\\\\247\\\\023k\\\\363,\\\\365!<xp\\\\022c\\\\030\\\\014\\\\006u\\\\275\\\\365.lV\\\\033\\\\001h\\\\305\\\\005\\\\346~\\\\367\\\\254\\\\365\\\\033\\\\311\\\\334[GF\\\\254\\\\206U^\\\\226\\\\200j:;\\\\250\\\\233\\\\366\\\\301\\\\331\\\\003\\\\223\\\\330$M\\\\2109/JQAeya\\\\223\\\\224\\\\221\\\\001\\\\364\\\\240\\\\032\\\\345\\\\305 \\\\313\\\\213,/\\\\362\\\\274\\\\314\\\\213r<\\\\231\\\\246Y\\\\016\\\\200\\\\325`X\\\\226\\\\345`00\\\\306\\\\214F#k\\\\215\\\\326JLk\\\\305\\\\211&M\\\\323\\\\343\\\\343c\\\\261-\\\\355\\\\272n<\\\\036\\\\213\\\\305LQ\\\\024\\\\242\\\\300ED\\\\375\\\\237\\\\376\\\\301oN\\\\306\\\\325\\\\243\\\\223\\\\243w\\\\036\\\\235\\\\235\\\\235\\\\034We\\\\021\\\\202k7\\\\353\\\\030=0\\\\213(\\\\010\\\\220\\\\254V\\\\251\\\\325Yf\\\\233\\\\266)\\\\007\\\\311z\\\\325\\\\234\\\\235\\\\036\\\\376\\\\215?\\\\370\\\\275\\\\257\\\\276\\\\370\\\\374W\\\\177\\\\371\\\\313G\\\\017\\\\317>\\\\375\\\\345/\\\\006\\\\203\\\\342\\\\350hN\\\\034\\\\2122\\\\035\\\\217\\\\252\\\\361\\\\250\\\\034OF\\\\007\\\\223\\\\311h<\\\\034\\\\217\\\\206gggM]\\\\037\\\\036N\\\\225\\\\326\\\\213\\\\305\\\\002Q)\\\\255\\\\224Bm,1\\\\307\\\\030#\\\\260R\\\\212CT\\\\306D\\\\357\\\\001QN\\\\0361F\\\\245\\\\265\\\\332o\\\\214\\\\2141(\\\\335\\\\032@\\\\033\\\\235$)(\\\\264\\\\326\\\\310,%\\\\333\\\\312\\\\355v[\\\\024e\\\\214\\\\234\\\\330t<\\\\236>}\\\\372\\\\276B\\\\373\\\\362\\\\305\\\\253\\\\361db\\\\263\\\\301\\\\355r\\\\355:\\\\257\\\\000c\\\\010\\\\256\\\\251\\\\251\\\\357\\\\313\\\\324>}\\\\347\\\\361\\\\250*S\\\\253\\\\221\\\\243BH\\\\254\\\\326Z+Tm\\\\335\\\\022\\\\261\\\\006P\\\\210\\\\242\\\\324VL\\\\242\\\\033\\\\023\\\\365\\\\203\\\\2543\\\\245o)\\\\300\\\\350{\\\\026N\\\\276X}\\\\011 K\\\\244\\\\2155\\\\306(e@+D\\\\255\\\\224&\\\\206\\\\310l\\\\32242\\\\225e5\\\\232\\\\316\\\\262|\\\\220\\\\345e^\\\\016\\\\215\\\\315\\\\206\\\\303\\\\3517\\\\337<\\\\377\\\\343?\\\\371\\\\223O>\\\\371\\\\331\\\\257>\\\\373|\\\\271Z=<;\\\\015\\\\304Z\\\\233\\\\340\\\\343\\\\305\\\\305U\\\\010>I\\\\262\\\\355\\\\266\\\\276?\\\\037\\\\357({\012Q\\\\314*\\\\211\\\\010\\\\366~\\\\321\\\\002=i\\\\3756V\\\\354\\\\275+\\\\007\\\\005\\\\000L\\\\247\\\\223\\\\365z\\\\315@\\\\213\\\\305\\\\322w>\\\\2047a\\\\201\\\\367M}O+x\\\\323\\\\351\\\\205W h\\\\327\\\\275v\\\\320\\\\030\\\\2534:\\\\347\\\\007\\\\2032\\\\317s\\\\201o\\\\245\\\\277*\\\\215EQv}\\\\350C<>:\\\\356{\\\\007\\\\210J\\\\253\\\\345b\\\\231\\\\347\\\\371j\\\\265B\\\\304\\\\341p(\\\\033\\\\022iOD$\\\\241*\\\\243\\\\321H2\\\\312\\\\004\\\\2034\\\\306\\\\334\\\\237)\\\\017\\\\016\\\\016noo\\\\005\\\\214$\042\\\\203\\\\241C\\\\340\\\\350\\\\202\\\\2164*\\\\323\\\\341\\\\273\\\\017\\\\037\\\\236=\\\\350ZG\\\\200\\\\275w\\\\233\\\\365\\\\366fqw\\\\273\\\\270\\\\333l6.\\\\004&\\\\030\\\\217\\\\322\\\\246\\\\353'S\\\\373\\\\345W\\\\237\\\\236\\\\277x\\\\306\\\\020\\\\246\\\\323\\\\351\\\\317\\\\177\\\\376\\\\263\\\\341\\\\240\\\\330nV\\\\326\\\\360\\\\240*\\\\362<],n\\\\323\\\\024\\\\263<3*\\\\315\\\\213\\\\201s!0\\\\035\\\\037\\\\036u\\\\275\\\\177\\\\376\\\\372b\\\\271\\\\332\\\\334,\\\\226m\\\\347z\\\\347\\\\211\\\\002(T\\\\032\\\\024)\\\\024\\\\020B\\\\353h\\\\215\\\\326\\\\032C\\\\224Mm\\\\2141\\\\265v\\\\337\\\\203\\\\020\\\\367\\\\332-mL\\\\3277\\\\332Zk\\\\323\\\\303\\\\303C\\\\241\\\\222\\\\316\\\\347sc\\\\314\\\\353\\\\327\\\\027Y\\\\226v]\\\\267X\\\\254\\\\024&\\\\247\\\\247g\\\\037\\\\177\\\\374k>\\\\320\\\\345\\\\335\\\\262Y\\\\327i\\\\222\\\\364}\\\\037\\\\2726\\\\366\\\\216!\\\\234\\\\036=<\\\\232\\\\214\\\\2151H12\\\\001pt@\\\\214>D\\\\013\\\\026\\\\000U\\\\224*\\\\225\\\\020aBD\\\\263\\\\203\\\\257\\\\005\\\\230\\\\014\\\\201\\\\211\\\\011\\\\211(\\\\265\\\\032\\\\2008@\\\\004\\\\216r,c\\\\205\\\\000\\\\316yD$\\\\306\\\\300\\\\204\\\\240\\\\225\\\\321\\\\210\\\\032\\\\021\\\\352\\\\266\\\\3316\\\\235\\\\217\\\\230\\\\226\\\\303H\\\\230\\\\025C\\\\327\\\\323\\\\371\\\\305\\\\315\\\\237\\\\375\\\\331\\\\377ussS7[\\\\255\\\\261\\\\252*\\\\000\\\\256\\\\273vq\\\\267\\\\242\\\\250oa\\\\335v}\\\\244\\\\030b\\\\027\\\\211#\\\\261\\\\363\\\\001P\\\\261X\\\\352\\\\003\042(\\\\201|\\\\357\\\\263e\\\\377\\\\225\\\\323!\\\\357\\\\375\\\\207\\\\312,\\\\337,W\\\\017\\\\036\\\\234\\\\204\\\\020F\\\\343\\\\312\\\\030\\\\223$Y\\\\337Gf'\\\\203\\\\207@\\\\312\\\\367\\\\274s\\\\334\\\\0170;E\\\\210\\\\321Zk@4\\\\306n6\\\\333\\\\311d\\\\254\\\\265\\\\236\\\\317\\\\347\\\\210(\\\\201zJ)#\\\\217xf\\\\000\\\\225dy^\\\\345!R1\\\\250:\\\\347E\\\\223\\\\262\\\\340\\\\333\\\\341x|\\\\374\\\\340$\\\\204`\\\\224\\\\356\\\\272\\\\216\\\\004\\\\000\\\\267v8\\\\030\\\\310\\\\317\\\\222dx\\\\361Z\\\\221c\\\\361p8\\\\314\\\\363\\\\374\\\\352\\\\352j\\\\261XHV\\\\316\\\\365\\\\365u\\\\010\\\\301\\\\264}\\\\307;\\\\257\\\\261\\\\250\\\\320\\\\240\\\\261\\\\0269\\\\232\\\\340}\\\\034f\\\\311d8?;;\\\\014!\\\\204\\\\030\\\\0215\\\\032t\\\\3165];\\\\031\\\\2157\\\\313\\\\325\\\\311\\\\311\\\\251\\\\353\\\\372\\\\345\\\\342\\\\366\\\\243\\\\217>\\\\332\\\\256\\\\326\\\\314\\\\261(s\\\\357\\\\373\\\\246\\\\336hm'\\\\223\\\\321fS3id5\\\\233\\\\315\\\\356n\\\\027\\\\243\\\\351\\\\354\\\\177\\\\371\\\\007\\\\377\\\\353\\\\266\\\\353>\\\\374\\\\336\\\\307\\\\316wD\\\\301\\\\271\\\\210\\\\314H\\\\310\\\\310\\\\006\\\\011Ak\\\\213J\\\\001p\\\\244H\\\\221\\\\242A\\\\205\\\\006\\\\215\\\\321Z\\\\241\\\\370`\\\\313a\\\\21392+\\\\305\\\\021\\\\015f\\\\271I\\\\215\\\\232\\\\317F\\\\253\\\\345\042\\\\304\\\\320\\\\325\\\\253\\\\350\\\\373\\\\242(\\\\226\\\\253m\\\\277\\\\355\\\\301&\\\\327\\\\213\\\\005)c\\\\225}}ya\\\\223\\\\0048\\\\270>\\\\324\\\\213[\\\\004\\\\250\\\\212\\\\002\\\\210NO\\\\216\\\\203\\\\353\\\\220\\\\255\\\\266V#\\\\302\\\\256\\\\354\\\\330\\\\032M\042\\\\262\\\\014\\\\221$6\\\\033\\\\000\\\\020\\\\025\\\\003\\\\211\\\\353\\\\026\\\\357x\\\\335\\\\006T\\\\324\\\\254\\\\021Cp\\\\314\\\\034$\\\\021\\\\036\\\\025(\\\\203J\\\\261\\\\322\\\\256\\\\353\\\\210!rTh\\\\006\\\\243\\\\352\\\\360\\\\360p2;H\\\\362d\\\\265Y:\\\\347\\\\266u\\\\017\\\\214\\\\313\\\\365v\\\\270\\\\336\\\\\\\\^^\\\\376\\\\305\\\\217\\\\177\042\\\\036\\\\027\\\\250\\\\260\\\\255k\\\\316\\\\323$1}\\\\347\\\\213\\\\242\\\\330\\\\324[\042@\\\\304<+\\\\356uJ\\\\314\\\\3620\\\\005zc\\\\232\\\\364v\\\\005\\\\253]\\\\036\\\\312[\\\\036\\\\017\\\\002&\\\\313R\\\\342\\\\331\\\\263gGGG\\\\336\\\\273AQ\\\\270\\\\326\\\\353\\\\006C\\\\220\\\\026\\\\037\\\\357\\\\261-f\\\\226s/CdRJ\\\\2031F[\\\\325\\\\007_\\\\345\\\\203\\\\262,\\\\264V\\\\022\\\\034|}}\\\\015\\\\000\\\\262B\\\\321\\\\332\\\\022\\\\005\\\\211\\\\025&\\\\2424\\\\311\\\\003\\\\203\\\\002|\\\\376\\\\37493\\\\037\\\\315\\\\347\\\\333\\\\355v4\\\\032)\\\\245\\\\226w\\\\013\\\\351\\\\372\\\\207\\\\007\\\\007\\\\242\\\\316\\\\332n\\\\267EQp\\\\214&M\\\\305v\\\\303\\\\367\\\\275\\\\374\\\\302R\\\\312\\\\307\\\\307\\\\307\\\\262Wi\\\\333\\\\326\\\\3070\\\\036\\\\2156\\\\365V\\\\377\\\\306\\\\257\\\\277\\\\267\\\\252\\\\267IQ\\\\310\\\\256\\\\264\\\\2517\\\\332p\\\\242!\\\\261\\\\220gF\\\\003\\\\271\\\\276U\\\\034\\\\220)\\\\321\\\\252H\\\\222\\\\024y\\\\220$\\\\251\\\\302\042O8\\\\370\\\\363\\\\213W\\\\243\\\\321(\\\\315\\\\323\\\\273\\\\325j4\\\\231\\\\204@>\\\\220\\\\353\\\\343\\\\355\\\\365\\\\312\\\\365\\\\374\\\\321\\\\373\\\\037W\\\\325\\\\030\\\\300l\\\\267\\\\355h4i\\\\352\\\\346\\\\341\\\\243GV\\\\353\\\\353\\\\253\\\\213\\\\355f\\\\245\\\\201\\\\274\\\\357\\\\255\\\\241<U\\\\006B\\\\221@\\\\232h\\\\255u\\\\357\\\\273\\\\324\\\\352\\\\276\\\\013\\\\323\\\\311\\\\220\\\\242\\\\367}\\\\000\\\\2161\\\\004k5\\\\000{\\\\027Pq\\\\222X\\\\2554*\\\\000\\\\003I\\\\202\\\\301\\\\325\\\\212\\\\034\\\\370\\\\246o\\\\326]S\\\\217F\\\\223\\\\273\\\\333\\\\225#L\\\\207\\\\343\\\\343\\\\207O&\\\\363cO|\\\\273\\\\270\\\\355\\\\373Z\\\\263o67\\\\301\\\\327F3S\\\\354|\\\\373\\\\364\\\\351\\\\273E\\\\236eE\\\\016J1\\\\250\\\\210\\\\342 \\\\207D\\\\034\\\\231\\\\030(\\\\204\\\\336\\\\371.\\\\220\\\\003\\\\020Y:D\042Tz\\\\227\\\\324\\\\2677\\\\024\\\\004b\\\\346\\\\210bS\\\\016\\\\300\\\\332\\\\004\\\\255;\\\\206.rG\\\\334G\\\\354#\\\\351,\\\\377\\\\255\\\\337\\\\371\\\\341\\\\323\\\\217\\\\276g\\\\212\\\\362\\\\344\\\\321\\\\343\\\\351\\\\361\\\\321p4~\\\\370\\\\370\\\\311'\\\\277\\\\370y\\\\232\\\\347\\\\207GG\\\\257_\\\\277\\\\374\\\\351O\\\\177R\\\\327\\\\353\\\\266m\\\\200\042\\\\305`\\\\254.\\\\212\\\\242\\\\252\\\\206\\\\032\\\\300\\\\005\042\\\\006O!\\\\022\\\\005\\\\212\\\\332\\\\032\\\\037<QTZ\\\\3067\\\\221\\\\216\\\\213!\\\\347.t\\\\005\\\\031\\\\031Yi\\\\031yd\\\\200\\\\216\\\\242\\\\307\\\\324Z+\\\\205\\\\307\\\\307\\\\307\\\\336\\\\273\\\\311xl\\\\265\\\\025\\\\307\\\\202\\\\020\\\\305W\\\\214Q\\\\2016\012\\\\025\\\\370\\\\340lb\\\\031\\\\010\\\\025(\\\\243\\\\224RIj\\\\265\\\\326!\\\\372\\\\274L{\\\\327\\\\033\\\\253\\\\313A\\\\331\\\\273.I\\\\355\\\\240\\\\252\\\\224R\\\\014*\\\\313\\\\213\\\\246i\\\\213b\\\\340}\\\\264I\\\\026\\\\002M\\\\247\\\\263zS\\\\017\\\\253\\\\252\\\\310\\\\363\\\\262(\\\\\\\\\\\\327S\\\\214E\\\\236\\\\033\\\\255o\\\\256.\\\\207Ue\\\\264\\\\356\\\\333n\\\\265\\\\\\\\\\\\026yn\\\\215a\\\\342\\\\266i\\\\231x\\\\275Z\\\\017\\\\253\\\\241\\\\353\\\\272\\\\030\\\\243V\\\\252k[cm\\\\3234e5 \\\\346\\\\3369e\\\\315f\\\\275\\\\316\\\\007\\\\245)\\\\252\\\\011\\\\350\\\\244m]\\\\000}\\\\273\\\\\\\\\\\\025iR\\\\327ujt\\\\327\\\\266\\\\306\\\\030\\\\004\\\\215Z\\\\347Y\\\\031\\\\030\\\\272\\\\266\\\\367mc\\\\025&I\\\\242\\\\360\\\\377#\\\\354\\\\315\\\\232$;\\\\223+1\\\\367o\\\\271kl\\\\271gV\\\\326\\\\002\\\\024\012h4\\\\032\\\\335\\\\034J\\\\242\\\\214c\\\\032\\\\343P\\\\303\\\\007iL\\\\177@&\\\\375LI/\\\\032\\\\243\\\\031_zF#i\\\\310i\\\\016\\\\033\\\\354fcGUV.\\\\261\\\\307]\\\\277\\\\305]\\\\017~#*\\\\013h\\\\232\\\\302\\\\312\\\\322\\\\252\\\\242\042#\042#\\\\375\\\\372\\\\347~\\\\374\\\\3709\\\\340}\\\\310\\\\307\\\\243\\\\217?\\\\376\\\\010\\\\225\\\\2111~\\\\376\\\\313_fY\\\\366\\\\315W\\\\337\\\\376\\\\343\\\\357~\\\\373\\\\361\\\\007\\\\257\\\\214\\\\315\\\\2736~\\\\371\\\\325\\\\017E\\\\231\\\\207\\\\020\\\\332\\\\256s}\\\\250\\\\352\\\\255R\\\\352\\\\372\\\\372\\\\372\\\\323O?}{\\\\1773\\\\036\\\\217M\\\\242'\\\\223q\\\\232\\\\246m[\\\\273\\\\030|\\\\240\\\\331\\\\311\\\\2237on\\\\036\\\\036\\\\026\\\\277\\\\375\\\\355o\\\\253\\\\252\\\\022\\\\376s\\\\226\\\\350\\\\020\\\\342\\\\305\\\\371I\\\\232\\\\246\\\\333M\\\\345\\\\275\\\\227\\\\226\\\\205\\\\200\\\\327\\\\365z\\\\\\\\\\\\216G\\\\247\\\\263qj\\\\036no\\\\015\\\\352\\\\262\\\\310\\\\272\\\\246\\\\372\\\\354\\\\263\\\\317\\\\262\\\\311\\\\251\\\\311\\\\307\\\\253]\\\\363\\\\346\\\\315\\\\233\\\\371\\\\335=S(\\\\363\\\\264\\\\333-bh\\\\024\\\\032\\\\331[H\\\\255)\\\\212,\\\\311\\\\023\\\\022\\\\247\\\\352\\\\203\\\\373:\\\\211\\\\256(\\\\003\\\\020@\\\\220e\\\\002\\\\200w\\\\363\\\\337!\\\\317\\\\211K\\\\325@\\\\326\\\\211\\\\314l\\\\215\\\\330\\\\013A\\\\027\\\\275\\\\217*\\\\200\\\\366\\\\001B\\\\014J\\\\231?\\\\377\\\\227\\\\377\012\\\\224RYV\\\\036\\\\037O\\\\223\\\\013T\\\\252\\\\356[\\\\347=h\\\\025\\\\031\\\\026\\\\253\\\\325\\\\303b1\\\\237\\\\317w\\\\325\\\\306Z\\\\353]\\\\004dT\\\\254\\\\224\\\\336\\\\203\\\\307\\\\217W'\\\\205M\\\\373n\\\\003m\\\\200&d!\\\\006\\\\031a\\\\220 \\\\203\\\\001e{omG\\\\272\\\\272\\\\335n\\\\367\\\\374\\\\371\\\\323\\\\207\\\\207\\\\207\\\\323\\\\263\\\\223\\\\327\\\\257_\\\\237\\\\237\\\\237\\\\257V+\\\\245\\\\321X]\\\\232\\\\242i\\\\232\\\\375\\\\232S\\\\232\\\\240\\\\025\\\\321-\\\\357}\\\\226\\\\225Ro\\\\030c\042$i\\\\232f\\\\034\\\\362\042\\\\315\\\\362D\\\\350\\\\034\\\\322\\\\232\\\\217F\\\\223\\\\252\\\\252\\\\306\\\\343q\\\\226eu\\\\335$IZ\\\\226\\\\243\\\\335\\\\256\\\\232\\\\216'\\\\274g\\\\035\\\\221\\\\017\\\\000\\\\3203l\\\\267\\\\333\\\\243\\\\243\\\\243\\\\276\\\\357\\\\243\\\\017\\\\323\\\\351TPZ\\\\031\\\\254\\\\2446\\\\231M\\\\246DTWU\\\\323\\\\324eY\\\\216'\\\\223\\\\355v\\\\313\\\\210]\\\\327-\\\\347\\\\013P\\\\330\\\\266\\\\355\\\\361\\\\250\\\\334l6\\\\252\\\\256M\\\\357\\\\224\\\\302\\\\334\\\\232D\\\\241\\\\017\\\\001\\\\202R\\\\301#E\\\\232N\\\\217E:\\\\204\\\\373\\\\020<\\\\241\\\\261\\\\336GDLuR7]\\\\222\\\\245\\\\250\\\\355f\\\\263c\\\\205\\\\332\\\\330\\\\217\\\\177\\\\366I\\\\327u\\\\277\\\\376\\\\365\\\\177\\\\250w\\\\315lv\\\\374\\\\327\\\\177\\\\375\\\\327\\\\257^\\\\275z\\\\361\\\\354E\\\\333\\\\266\\\\363y\\\\235\\\\025i\\\\244\\\\020:\\\\027\\\\231\\\\265\\\\326\\\\300\\\\034B\\\\370\\\\253\\\\277\\\\372+\\\\347\\\\334\\\\335\\\\303\\\\255s}\\\\037<\\\\241*\\\\313\\\\2616\\\\266n\\\\353\\\\027\\\\317\\\\237%\\\\306\\\\316&\\\\343o\\\\277\\\\375v\\\\273\\\\335>}\\\\372Tk\\\\373\\\\374\\\\371\\\\363\042\\\\315b\\\\214!P\\\\226er\\\\272\\\\365}\\\\233\\\\224\\\\351\\\\333\\\\2337\\\\365fy~|\\\\324<{Q\\\\226\\\\343\\\\242\\\\230-w}\\\\325C\\\\345x\\\\376\\\\346v\\\\271\\\\331\\\\366m[\\\\246\\\\211k\\\\335n\\\\271\\\\011\\\\241\\\\225\\\\302\\\\226\\\\210\\\\214\\\\262E\\\\236\\\\227e\\\\231$\\\\011\\\\022\042\\\\014a\\\\273\\\\2574\\\\305\\\\202\\\\212\\\\244\\\\345\\\\227l'\\\\005\\\\274\\\\320\\\\266h?OV\\\\007+_\042\\\\037\\\\200\\\\025Fb\\\\037\\\\330\\\\001\\\\005E\\\\014\\\\206\\\\020\\\\376\\\\342_\\\\377E\\\\360\\\\324u\\\\356\\\\370\\\\364\\\\014Aw\\\\255\\\\033OGi6\\\\351\\\\255\\\\251\\\\266;\\\\031\\\\202\\\\206>\\\\364}oM\\\\252P1w\\\\314\\\\214\\\\240\\\\265\\\\262\012\\\\015\\\\260\\\\002\\\\331\\\\353\\\\344wCl\\\\305Q\\\\001\\\\211\\\\310\\\\344\\\\276`?\\\\324\\\\024\\\\357\\\\246\\\\334\\\\357\\\\343\\\\022\\\\303\\\\243\\\\210(\\\\313\\\\262\\\\252\\\\252NOO\\\\353\\\\272\\\\026\\\\365\\\\300\\\\311d\042B^\\\\314,E\\\\002\\\\357\\\\327\\\\245\\\\225R\042\\\\037Z\\\\024\\\\305\\\\341*\\\\262\\\\211\\\\2151\\\\032kx\\\\257\\\\247\\\\010\\\\0001FD\\\\\\\\\\\\255V\\\\314<\\\\231Lnoo_\\\\274xq{{\\\\233ey\\\\327u\\\\321\\\\007\\\\231\\\\351*\\\\2456uMDGyZ\\\\214KD\\\\024Py\\\\265Y\\\\023\\\\205\\\\351t\\\\032C\\\\270\\\\275\\\\275\\\\231M\\\\216\\\\372\\\\276c&\\\\255\\\\225\\\\3101\\\\352\\\\246\012\\\\301\\\\031cBt\\\\210H\\\\236\\\\254Q\\\\344\\\\235b\\\\362]k\\\\266\\\\233\\\\336\\\\030}y~\\\\341\\\\035M\\\\312\\\\243\\\\252^\\\\027EN\\\\321u\\\\216\\\\214I\\\\322\\\\244T\\\\3260\\\\2636\\\\306X\\\\310\\\\262\\\\254\\\\3365\\\\221`\\\\263k\\\\226\\\\253U\\\\323w\\\\247\\\\347g\\\\017\\\\363\\\\345\\\\233\\\\233\\\\333\\\\323\\\\323sD\\\\224\\\\005\\\\340\\\\377\\\\371\\\\177\\\\375_|\\\\327\\\\277\\\\376\\\\376\\\\265\\\\210\\\\340\\\\313\\\\020\\\\244i\\\\232$\\\\313\\\\212\\\\242\\\\010!\\\\324m\\\\363\\\\353_\\\\377\\\\032\\\\021\\\\273\\\\276\\\\237\\\\316\\\\306'gg\\\\323\\\\311L()U\\\\335+\\\\245.\\\\317\\\\316\\\\333\\\\266.\\\\32342%\\\\306\\\\236\\\\234\\\\234\\\\354v\\\\225\\\\353\\\\333\\\\301\\\\221{5\\\\257\\\\2736O\\\\362\\\\343\\\\263\\\\343\\\\004\\\\360\\\\351\\\\345E\\\\361\\\\374\\\\351\\\\345\\\\371\\\\331\\\\333\\\\267w\\\\213\\\\371f\\\\275\\\\255wU\\\\317\\\\246\\\\250\\\\253v\\\\275\\\\\\\\m\\\\267\\\\033\\\\337;&\\\\027\\\\373>\\\\366\\\\035\\\\260\\\\227\\\\252\\\\227\\\\211\\\\020@\\\\324O\\\\340G7:\\\\214\\\\025\\\\342\\\\241\\\\372DD\\\\334k/\\\\250G\\\\032b(z\\\\237\\\\217\\\\204\\\\235zO\\\\236\\\\3013;\\\\006B\\\\233\\\\345\\\\311d4n\\\\233~4\\\\232<y\\\\362\\\\364\\\\352\\\\372\\\\011#:\012Y\\\\226m\\\\267\\\\353\\\\262\\\\034/\\\\347\\\\213C@\\\\310\\\\353n6\\\\033\\\\255\\\\224\\\\\\\\<\\\\007\\\\\\\\b\\\\230\\\\322=\\\\032\\\\337=\\\\356\\\\364\\\\344\\\\177\\\\367\\\\024\\\\027\\\\332w~\\\\010\\\\010\\\\270\\\\260\\\\264\\\\000\\\\000 \\\\000IDAT{?\\\\305C(\\\\313W)?\\\\000\\\\3009g\\\\023#\\\\373\\\\177B\\\\212PJ5M3\\\\032\\\\215d '\\\\217\\\\001\\\\0001\\\\247\\\\222\\\\025\\\\353$I\\\\266\\\\333\\\\355t:\\\\335T\\\\033\\\\031\\\\213J\\\\316>\\\\350\\\\352\\\\206\\\\340\\\\236={\\\\266X,NNND\\\\254q\\\\273\\\\335\\\\235\\\\237\\\\237wM+]\\\\235\\\\330\\\\267\\\\275\\\\033@\\\\356\\\\327f\\\\363<W*\\\\225\\\\011\\\\332d6\\\\255\\\\353\\\\252i+\\\\347#Q\\\\350{\\\\357\\\\\\\\\\\\327\\\\366\\\\215\\\\367>\\\\3132\\\\327\\\\367\\\\347\\\\347\\\\347\\\\017\\\\313\\\\305\\\\244\\\\034\\\\255W+\\\\255T\\\\014A\\\\207\\\\216\\\\356\\\\357\\\\026\\\\276\\\\217\\\\253\\\\365:M3\\\\004\\\\314\\\\213\\\\2615\\\\226\\\\010\\\\264\\\\261!\\\\004\\\\233\\\\244\\\\221\\\\030Q\\\\365\\\\275\\\\007\\\\2557\\\\253\\\\015(\\\\243\\\\254\\\\255\\\\272v\\\\263\\\\253\\\\320\\\\030\\\\027\\\\342\\\\321\\\\311I\\\\236\\\\217\\\\306\\\\223i\\\\222\\\\330\\\\304\\\\332\\\\277\\\\375O\\\\1777\\\\031\\\\215\\\\265\\\\322'\\\\247'\\\\014\\\\260\\\\336m\\\\234\\\\367\\\\243\\\\361\\\\270(\\\\212\\\\365z\\\\275\\\\255vJ\\\\251\\\\276w\\\\223\\\\351\\\\354\\\\342\\\\342\\\\362\\\\351\\\\323\\\\247'\\\\247gJif\\\\360>\\\\244iR\\\\226\\\\305b>\\\\277~r\\\\231\\\\331\\\\244n\\\\352\\\\311\\\\250\\\\\\\\\\\\314\\\\037\\\\2624C\\\\340\\\\340]\\\\3276\\\\233\\\\325\\\\352\\\\341\\\\341\\\\276\\\\336\\\\356(\\\\206\\\\246\\\\336\\\\214\\\\262l\\\\263^\\\\177\\\\363\\\\315\\\\267_\\\\177\\\\365m\\\\3358V6\\\\311'\\\\27364u\\\\333\\\\264}p\\\\336\\\\367u\\\\267\\\\333Qh\\\\025\\\\022\\\\003\\\\001\\\\262V\\\\206\\\\210\\\\264\\\\302\\\\262,\\\\256\\\\316/\\\\264RC\\\\275\\\\301{K\\\\277\\\\275P\\\\306\\\\2607;Hu)D\\\\324\\\\250q\\\\257\\\\274-a$\\\\240\\\\257\\\\310\\\\230\\\\023\\\\252\\\\276\\\\367\\\\275\\\\017\\\\204\\\\350#\\\\004\\\\340\\\\321dz~q\\\\271\\\\336\\\\354./\\\\257l\\\\222P\\\\244\\\\331\\\\321\\\\221M\\\\223\\\\365z\\\\335u\\\\355?\\\\374\\\\3467o_\\\\337,\\\\346\\\\013\\\\212$\\\\362\\\\354J\\\\031\\\\361\\\\347\\\\006\\\\0304\\\\361\\\\215I\\\\324P\\\\262#1q$\\\\240\\\\241\\\\376`fdF\\\\200\\\\030\\\\007\\\\211\\\\222=*\\\\307B\\\\023\\\\334\\\\247\\\\347w\\\\225\\\\011\\\\014\\\\316\\\\310\\\\250\\\\2242F3\\\\263\\\\322J8\\\\022b\\\\023\\\\245\\\\224:\\\\220gF\\\\243\\\\221\\\\320\\\\331\\\\3224\\\\025\\\\006\\\\375\\\\201\\\\335\\\\3264\\\\315\\\\331\\\\331Y\\\\335\\\\324\\\\326$Zi\\\\255\\\\214\\\\364\\\\202\\\\3622\\\\032u\\\\3334\\\\247'\\\\247m\\\\323j\\\\245\\\\252\\\\335n6\\\\235\\\\256\\\\226K\\\\037\\\\343\\\\311\\\\351\\\\251ML\\\\244\\\\350\\\\203\\\\237/\\\\346]\\\\333\\\\216\\\\307\\\\343\\\\252\\\\256{\\\\347@1\\\\003\\\\007\\\\357\\\\253\\\\252\\\\032\\\\244\\\\273\\\\211\\\\323<\\\\321Z\\\\327\\\\315\\\\3169\\\\227\\\\027iY\\\\026\\\\336\\\\3651x\\\\021\\\\212i\\\\352J!l\\\\326k`\\\\362\\\\2567\\\\037\\\\275\\\\374\\\\244\\\\357\\\\273\\\\020(M\\\\312\\\\340y2\\\\235:\\\\337j\\\\245#\\\\240\\\\002De\\\\363r\\\\242\\\\332\\\\246\\\\363\\\\356\\\\346\\\\366.\\\\204\\\\360\\\\362\\\\243\\\\237-\\\\026+\\\\025\\\\341\\\\311\\\\365\\\\213\\\\247/>Z\\\\256Won~\\\\267X\\\\256\\\\377\\\\333\\\\377\\\\346\\\\317\\\\276\\\\372\\\\352\\\\253\\\\311h\\\\364\\\\333\\\\267o\\\\237=yv\\\\373p\\\\237\\\\032\\\\273\\\\336\\\\256M\\\\232\\\\310\\\\376\\\\214\\\\250E]?{\\\\332\\\\367\\\\375\\\\357~\\\\367\\\\273\\\\227\\\\257>:;;\\\\313\\\\363\\\\\\\\)\\\\263\\\\\\\\\\\\256\\\\267\\\\333m\\\\232\\\\344\\\\345(\\\\377\\\\346\\\\313o\\\\332\\\\266>>>\\\\375.\\\\370\\\\276\\\\367\\\\243\\\\274\\\\230\\\\317\\\\347\\\\326Z\\\\216!M\\\\022\\\\005\\\\251\\\\002.\\\\262\\\\\\\\\\\\364H\\\\203\\\\353\\\\251\\\\357W\\\\363\\\\207\\\\207\\\\207\\\\205I\\\\262\\\\331\\\\321i6:jz\\\\352\\\\003\\\\317\\\\027\\\\253\\\\273\\\\207\\\\345z\\\\275Fb\\\\205l\\\\015D/\\\\252.?\\\\236\\\\234\\\\275\\\\367k\\\\006P\\\\217\\\\340.\\\\0048\\\\030^HjF\\\\334\\\\003\\\\273\\\\007u\\\\234GY\\\\223PA\\\\204\\\\020\\\\331\\\\207\\\\310\\\\250\042\\\\252=\\\\3631\\\\237\\\\315JfN\\\\3234+\\\\213\\\\327\\\\257_\\\\377\\\\247\\\\337\\\\374\\\\335\\\\357\\\\177\\\\377\\\\273\\\\020B\\\\242\\\\025R\\\\024\\\\251\\\\322\\\\001\\\\213\\\\324:M\\\\323\\\\276\\\\355\\\\360\\\\221T\\\\203\\\\260\\\\306\\\\177\\\\202\\\\015\\\\003\\\\377\\\\010\\\\317x/\\\\015\\\\343\\\\001r~|?\042\\\\017\\\\211y/&/\\\\351_\\\\370<\\\\242\042 \\\\252\\\\255\\\\0000\\\\036\\\\217%\\\\202\\\\205\\\\314X\\\\226\\\\245\\\\024!\\\\362\\\\263\\\\014\\\\021\\\\214(\\\\254|\\\\341\\\\307\\\\015\\\\313#\\\\371\\\\010\\\\021\\\\337\\\\274y#D\042\\\\241w\\\\216F\\\\243@\\\\324\\\\367\\\\375r\\\\271`f\\\\021U\\\\362\\\\275\\\\253e\\\\347\\\\352\\\\350(I\\\\315j\\\\265R\\\\014eYZk\\\\333\\\\2666Z7M\\\\223\\\\246i\\\\222$i\\\\212D$\012\\\\274\\\\242[p\\\\177\\\\177\\\\217\\\\210\\\\313\\\\345\\\\322h\\\\335\\\\32453\\\\353_\\\\374\\\\3543\\\\037zT\\\\220\\\\346I\\\\236gY\\\\236\\\\242Ry\\\\221u\\\\275\\\\337\\\\355\\\\252\\\\257\\\\276\\\\372\\\\346\\\\315\\\\333\\\\233o\\\\276\\\\371\\\\256\\\\252\\\\233\\\\336\\\\271\\\\311\\\\344\\\\310&y6*\\\\2251\\\\353\\\\335.\\\\022\\\\025\\\\243\\\\321\\\\313\\\\217^\\\\275\\\\372\\\\370\\\\343\\\\020B\\\\226fV\\\\333\\\\253\\\\313+\\\\255\\\\364l6\\\\333U\\\\325\\\\223\\\\247\\\\327i\\\\232~\\\\377\\\\372{\\\\006\\\\276\\\\270\\\\274,G\\\\243\\\\252\\\\252&\\\\223\\\\311\\\\263\\\\027\\\\317\\\\327\\\\353\\\\2651\\\\246\\\\367\\\\261\\\\353\\\\335n[\\\\255V\\\\353\\\\266\\\\355\\\\272\\\\266\\\\363!fE\\\\336v\\\\356~\\\\376\\\\260\\\\\\\\nn\\\\357\\\\356\\\\023\\\\233X\\\\233|\\\\363\\\\355\\\\267\\\\2220\\\\235\\\\367\\\\316{bB\\\\300\\\\304\\\\232<\\\\265D\\\\221\\\\030\\\\306\\\\263\\\\343>\\\\300\\\\246\\\\356V\\\\333f\\\\271i\\\\356\\\\227+\\\\037\0420S\\\\364}S\\\\305\\\\330+ \\\\203\\\\030a/\\\\316\\\\302d\\\\264I\\\\323\\\\364\\\\374\\\\354\\\\\\\\k-\\\\3453\\\\002\\\\203\\\\202\\\\375\\\\232\\\\226hS\\\\014b\\\\002\012Q\\\\241V\\\\210\\\\000x8\\\\337\\\\017\\\\001-\\\\304\\\\022\042v>x\\\\346\\\\010\\\\340\\\\001\\\\215\\\\315\\\\362\\\\361x4\\\\236)\\\\223T\\\\333J)\\\\225\\\\246\\\\371\\\\037\\\\276\\\\372\\\\352\\\\337\\\\375\\\\273\\\\377\\\\363\\\\313\\\\257\\\\277\\\\222\\\\345\\\\021\\\\303\\\\303\\\\326\\\\225H&\\\\305@\\\\336\\\\271\\\\272\\\\252\\\\255M\\\\245\\\\365\\\\322\\\\332\\\\010\\\\276\\\\216\\\\250\\\\264V R\\\\243\042\\\\225\\\\004\\\\260w<\\\\200a\\\\211\\\\035\\\\024\\\\362~\\\\351\\\\371\\\\321\\\\376\\\\304\\\\201\\\\366)\\\\217<\\\\\\\\\\\\212\042\\\\354\\\\375\\\\354\\\\371P\\\\033TUEDR`\\\\210\\\\345\\\\244\\\\224\\\\305M\\\\323\\\\310\\\\342\\\\226pA\\\\363<\\\\337\\\\355veY\\\\206\\\\020&\\\\323\\\\011\042\012\\\\235Z\\\\270\\\\215\\\\322\\\\027.\\\\026\\\\363\\\\361xt|t\\\\222$\\\\311\\\\317\\\\177\\\\376\\\\363\\\\020B\\\\3234\\\\336\\\\373\\\\246m\\\\344\\\\371\\\\3234\\\\025\\\\221\\\\363\\\\321\\\\270H\\\\263d\\\\263Y=<\\\\334Kb\\\\326VUu\\\\025)&\\\\306z\\\\347\\\\226\\\\3139\\\\000\\\\313lm\\\\271\\\\\\\\4M\\\\035c\\\\340\\\\030)\\\\206\\\\315z\\\\255\\\\025\\\\312!\\\\320\\\\265m\\\\360^\\\\377\\\\367\\\\177\\\\361\\\\337\\\\331\\\\004\\\\257\\\\257\\\\257PqY\\\\244wwo\\\\333\\\\266\\\\256\\\\333z2\\\\235\\\\234\\\\034\\\\237\\\\236\\\\234\\\\236~\\\\364\\\\321\\\\307\\\\243\\\\361t<\\\\236\\\\022AQ\\\\216W\\\\333\\\\335vW\\\\371\\\\020\\\\255M\\\\224\\\\261\\\\337~\\\\373\\\\335f\\\\263m\\\\232\\\\266\\\\314Kq\\\\006\\\\310\\\\323\\\\354\\\\315\\\\3537?\\\\373\\\\364\\\\323,\\\\313\\\\2224\\\\373\\\\365\\\\277\\\\3775\042\\\\274|\\\\371\\\\022\\\\021ooo7\\\\233\\\\215\\\\266f\\\\261X\\\\010\\\\357l\\\\273\\\\223\\\\223\\\\005E\\\\347\\\\257\\\\252jF\\\\014\\\\221\\\\262<\\\\277\\\\275\\\\273G@c\\\\314\\\\256\\\\252B\\\\214\\\\223\\\\351\\\\314\\\\207\\\\260\\\\253\\\\252H\\\\224\\\\247\\\\271R\\\\350} \012\\\\210\042a\\\\257}\\\\204\\\\233\\\\207\\\\2452\\\\005$\\\\371\\\\335b\\\\271\\\\253\\\\353\\\\336\\\\371\\\\266\\\\255}\\\\263cv\\\\032\\\\031!\\\\0220*u\\\\310i\012u\\\\232\\\\246\\\\247'\\\\247J)\\\\255\\\\366\\\\223^\\\\201\\\\011\\\\366\\\\2226\012qP;E\\\\024\\\\300\\\\201y\\\\360\\\\0258\\\\024\\\\257{\\\\335y\\\\027\042\\\\365\\\\336\\\\2032\\\\0210\\\\002$y1=:\\\\311\\\\2132DZ-W\\\\000\\\\360\\\\375\\\\367?\\\\374\\\\343\\\\027_\\\\370\\\\350\\\\223$i\\\\273\\\\226(B\\\\214\\\\262\\\\034\\\\024\\\\367R\\\\365\\\\202!\\\\310i 1th\\\\354\\\\264V\042ZsX|9\\\\324\\\\312\\\\362\\\\3650\\\\263<\\\\024\\\\025\\\\303\\\\265\\\\247\\\\036g\\\\356\\\\341l\\\\231\\\\315fm\\\\333Xk\\\\273\\\\256\\\\025\\\\372\\\\274\\\\364\\\\205}\\\\337'IR\\\\327\\\\365l6#\\\\242$I6\\\\233\\\\015\\\\357{!\\\\361!^,\\\\026\\\\227\\\\227\\\\227m\\\\333\\\\346E.\\\\374\012\\\\347\\\\334t:\\\\025\\\\252\\\\220\\\\0342I\\\\222l7\\\\273$I\\\\376\\\\376\\\\357\\\\377\\\\236\\\\210\\\\204+\\\\222f\\\\351f\\\\263\\\\011!H@k\\\\255\\\\213\042_,\\\\026\\\\263\\\\351t4\\\\032I\\\\237\\\\232$V\\\\270\\\\037\\\\233\\\\325\\\\372h6\\\\221KHTze9\\\\005\\\\000\\\\326\\\\253\\\\225\\\\264\\\\2551Ffh\\\\333V\\\\300u\\\\375\\\\247\\\\377\\\\342ckqW\\\\255\\\\235k\\\\267\\\\273\\\\365d:\\\\006\\\\205G\\\\307\\\\307\\\\316\\\\373\\\\315f}\\\\377\\\\3600\\\\237/\\\\262\\\\274L\\\\323\\\\334{^,V\\\\236\\\\310\\\\0231\\\\342b\\\\265Z\\\\2577\\\\327\\\\327O/..\\\\215\\\\321\\\\321\\\\207<+\\\\326\\\\253\\\\365\\\\351\\\\371\\\\371\\\\027_\\\\374v\\\\275Yw]\\\\367\\\\342\\\\305\\\\213\\\\030\\\\351\\\\305\\\\207\\\\037D\\\\342\\\\345je\\\\023S\\\\216F\\\\203\\\\371\\\\000\\\\023(,\\\\362\\\\022\\\\000\\\\353\\\\272\\\\025\\\\370\\\\253\\\\353]^\\\\216\\\\210a\\\\265\\\\336\\\\344E\\\\231g\\\\27166\\\\317\\\\013\\\\037\042\\\\000&I\012\\\\200i\\\\226+\\\\255m\\\\222\\\\214\\\\306\\\\323\\\\345r\\\\341}O\\\\3106-\\\\002+\\\\235\\\\226M\\\\340\\\\373\\\\305\\\\252\\\\351}\\\\327\\\\371\\\\266ob\\\\327\\\\002y\\\\241\\\\224\\\\310oRv/\\\\200A\\\\030*E\\\\232\\\\235\\\\237\\\\235\\\\246\\\\211\\\\325 \\\\373D\\\\262\\\\215-rr\\\\204z\\\\300s\\\\201`\\\\330\\\\203\\\\000\\\\210\\\\004r\012\\\\037B\012\\\\007\\\\245n\\\\327\\\\365\\\\256\\\\357\\\\2038iFP\\\\343\\\\351\\\\364\\\\344\\\\354\\\\3349\\\\177{wo\\\\215\\\\335n\\\\253\\\\355z\\\\023b\\\\0101D\042\\\\245\\\\021\\\\0314\\\\213\\\\213\012\\\\003s\\\\210\\\\217in\\\\357\\\\271\\\\215H\\\\21033\\\\213\\\\214\\\\264\\\\274\\\\275a\\\\262\\\\015L$;20\\\\224KC\\\\247E{\\\\203/\\\\032\\\\030\\\\223\\\\270\\\\177J\\\\224\\\\212\\\\231\\\\231\\\\212\\\\242\\\\260\\\\326\\\\034\\\\037\\\\037\\\\357v;\\\\241L\\\\310\\\\340-\\\\016Zd <\\\\341\\\\227/_\\\\212\\\\266\\\\2134di\\\\232\\\\036\\\\035\\\\035eY\\\\3264\\\\235B\\\\335\\\\265\\\\375t:\\\\273y\\\\363v:\\\\231E\012\\\\022g\\\\307\\\\307\\\\307J\\\\341\\\\355\\\\335\\\\333'\\\\327WG\\\\307\\\\263\\\\311t\\\\334um\\\\214Ak5\\\\032\\\\225!\\\\370<\\\\317\\\\372\\\\276\\\\013\\\\336#\\\\000Q\\\\360\\\\336-\\\\026\\\\363\\\\213\\\\213\\\\363fW\\\\265u\\\\263^\\\\256\\\\254\\\\265\\\\313\\\\345B\\\\354(\\\\304\\\\030K)\\\\214\\\\221\\\\234si\\\\222\\\\010z\\\\213\\\\210u\\\\335\\\\210\\\\352)3\\\\353W\\\\037\\\\234)\\\\003e\\\\231-W\\\\363\\\\357\\\\276\\\\373\\\\346\\\\342\\\\362\\\\354\\\\364\\\\364t\\\\275^\\\\275y}3\\\\032\\\\217O\\\\216N\\\\362\\\\2744&\\\\001@\\\\212\\\\300J\\\\235\\\\236\\\\235\\\\205H]\\\\337^^^>y\\\\362$\\\\317\\\\363\\\\242(b$k\\\\364?\\\\375\\\\323?\\\\011\\\\347\\\\372\\\\351\\\\363\\\\247V\\\\23377ov\\\\325\\\\216A5uM\\\\304\\\\200ps\\\\363\\\\266\\\\252v\\\\322\\\\350\\\\010U#\\\\006\\\\016! \\\\252\\\\242(\\\\024\\\\232]Uow\\\\225MR\\\\212XUU\\\\323v\\\\306&YQ\\\\004\\\\242$\\\\315\\\\312\\\\361\\\\270,\\\\312\\\\256\\\\353\\\\275wJ\\\\351H4\\\\231L\\\\306\\\\343\\\\274\\\\353\\\\373\\\\266\\\\217&+\\\\213\\\\311i\\\\000=_n\\\\346\\\\213\\\\205\\\\017\\\\336\\\\273\\\\036|\\\\013\\\\020\\\\304\\\\252U\\\\016iF\\\\341\\\\300\\\\262RJ\\\\021\\\\026Eq~v\\\\226$\\\\011\\\\320^\\\\007\\\\014`\\\\320T\\\\026\\\\370\\\\202\\\\366\\\\206\\\\002\\\\210Ji\\\\200C?\\\\366.\\\\021\\\\3561\012\\\\027\042\\\\021c\\\\333\\\\367:\\\\315f\\\\307'6\\\\317\\\\026\\\\313\\\\365\\\\355\\\\335}\\\\327;\\\\255\\\\264s\\\\336;\\\\037\\\\243\\\\023\\\\341}DT\\\\310\\\\024\\\\342\\\\241\\\\275\\\\243}4\\\\003\\\\310\\\\022\\\\357;i\\\\262C\\\\205\\\\014\\\\3576\\\\330\\\\017\\\\265\\\\363O\\\\025\\\\317\\\\336W\\\\350\\\\223o|WI3\\\\000L&\\\\223$I\\\\214\\\\321J)@\\\\020[\\\\211<\\\\317\\\\267\\\\333mUU\\\\022\\\\273\\\\342\\\\255\\\\315\\\\314\\\\302\\\\236\\\\023\\\\316\\\\243\\\\324\\\\320\\\\202\\\\315\\\\305\\\\030C\\\\214\042- H\\\\\\\\\\\\214Q\\\\251\\\\301\\\\301[\\\\254'\\\\344\\\\354\\\\225\\\\025$Q\\\\322\\\\020\\\\017\\\\006)\\\\3427\\\\233\\\\215\\\\264\\\\323b\\\\036'\\\\365qS\\\\327!\\\\004c\\\\314h\\\\\\\\\\\\304\\\\340\\\\017fYr\\\\2068\\\\347\\\\373\\\\276\\\\227\\\\332Z,\\\\316b$AZ\\\\210H\\\\377\\\\331\\\\177\\\\365j\\\\267]o\\\\326K\\\\205hS\\\\323\\\\265\\\\355j\\\\265*\\\\212rT\\\\216\\\\333\\\\266\\\\275{x\\\\250\\\\333\\\\326\\\\032\\\\253\\\\2255\\\\312\\\\024y\\\\336\\\\272~2\\\\033\\\\313O\\\\3254\\\\315j\\\\265B\\\\342\\\\373\\\\333;\\\\357C\\\\337\\\\273\\\\373\\\\207\\\\373\\\\365z}qq\\\\231f\\\\371f\\\\273\\\\373\\\\317\\\\277\\\\371{TF4\\\\330\\\\362\\\\262\\\\214\\\\024\\\\263\\\\274\\\\350}\\\\177\\\\330\\\\246\\\\006P!\\\\004\\\\357\\\\003\\\\021\\\\325us{\\\\367\\\\360\\\\352\\\\325'\\\\014\\\\330;W\\\\024\\\\345\\\\361\\\\361\\\\2111\\\\266n\\\\332\\\\371|1\\\\035O\\\\373\\\\3365]\\\\363\\\\260\\\\2303\\\\240\\\\261\\\\311\\\\335\\\\303C\\\\333V]\\\\333,\\\\227\\\\253M\\\\323y\\\\320\\\\333\\\\306\\\\277\\\\271\\\\273\\\\333\\\\354*klU\\\\357\\\\300u\\\\020\\\\334\\\\273h\\\\226_4?\\\\002\\\\332\\\\230\\\\246\\\\323\\\\311\\\\331\\\\351\\\\231\\\\254r\\\\003\012b\\\\3000\\\\004\\\\277\\\\254\\\\034\\\\341>\\\\236\\\\207\\\\246\\\\020\\\\2053\\\\261\\\\217{\\\\271I@\\\\373\\\\020u\\\\222\\\\326]g\\\\2224\\\\311\\\\262]\\\\323\\\\334\\\\274\\\\275[\\\\2577\\\\243r\\\\204\\\\200!x\\\\016!\\\\262\\\\300\\\\021rNP\\\\364a\\\\220\\\\210F\\\\020=;Q\\\\251\\\\2134\\\\334)\\\\347\\\\31207!I\\\\3474p\\\\017\\\\031\\\\006\\\\205h\\\\020o\\\\226\\\\341\\\\235\\\\302\\\\300\\\\351`@\\\\336\\\\333\\\\030?^\\\\276z\\\\267\\\\372j\\\\214FDb:\\\\320$\\\\304qO\\\\226\\\\246\\\\204\\\\006\\\\004\\\\000\\\\322\\\\264\\\\035\\\\004=$/\\\\312\\\\2541KS\\\\212\\\\321\\\\032\\\\263Z.\\\\231\\\\250\\\\256\\\\252\042/\\\\020\\\\360\\\\370h\\\\026\\\\274\\\\177\\\\270\\\\273/\\\\362\\\\374xv\\\\3245m\\\\226\\\\244\\\\213\\\\345R\\\\340\\\\201\\\\266m\\\\275s\\\\326\\\\250\\\\276\\\\357\\\\2124-\\\\213<\\\\3172\\\\243t\\\\010\\\\275\\\\314;\\\\021Xk\\\\345z7\\\\350\\\\002\\\\2068\\\\354F\\\\020\\\\211Oi\\\\327\\\\367>x\\\\24152+@\\\\025B\\\\254\\\\233V\\\\377\\\\374\\\\223+\\\\357\\\\372\\\\272nz\\\\327\\\\037\\\\315\\\\216\\\\216\\\\216\\\\217\\\\021U\\\\232fM\\\\323^_?-\\\\212\\\\342\\\\376\\\\376\\\\241\\\\332VY\\\\226{\\\\347\\\\276\\\\377\\\\341\\\\207>\\\\364o\\\\336\\\\336\\\\354v\\\\273\\\\017?\\\\374\\\\360\\\\331\\\\263gb\\\\222.\\\\033\042/^\\\\274\\\\270\\\\274\\\\274\\\\370\\\\362\\\\313/\\\\317\\\\317\\\\317\\\\277\\\\377\\\\376{\\\\255\\\\3657_\\\\377\\\\260^oNNN7\\\\233m\\\\265\\\\253\\\\264\\\\321eY\\\\256V\\\\353\\\\262,\\\\000\\\\300\\\\030\\\\223\\\\246\\\\231R*FJ\\\\222d<\\\\232L\\\\2463\\\\245u\\\\333u\\\\273\\\\315\\\\316y\\\\3275m\\\\265\\\\333)TE\\\\221\\\\335\\\\337?\\\\240\\\\342I9\\\\322F!\\\\001S@\\\\300\\\\304j`\\\\002\\\\255\\\\363rr~\\\\365,\\\\315G\\\\353M\\\\275\\\\\\\\\\\\255V\\\\253%x\\\\007\\\\241\\\\003\\\\016\\\\3004\\\\330r?\\\\036\\\\264\\\\001\\\\312\\\\036\\\\373\\\\351\\\\351\\\\351\\\\361\\\\3211\\\\014\\\\353\\\\253\\\\260O\\\\226CN\\\\223\\\\251!\\\\354\\\\227\\\\354\\\\324`l\\\\363h\\\\331\\\\356Q\\\\206v\\\\256\\\\367!\\\\372H.\\\\2044+:\\\\347V\\\\333m\\\\323\\\\366\\\\0008\\\\233\\\\035\\\\355\\\\025\\\\365\\\\305_\\\\002\\\\230#s\\\\344\\\\030\\\\310\\\\373\\\\303\\\\340c\\\\217\042\\\\277{\\\\346\\\\375\\\\011px\\\\275hD\\\\362\\\\370\\\\275\\\\014\\\\375.\\\\243\\\\037\\\\226\\\\263\\\\017I]\\\\241\\\\376Q@\\\\037\\\\026]\\\\2151Y\\\\226*\\\\245df!\\\\311X\\\\212\012!\\\\257\\\\015\\\\3745c\\\\246\\\\323\\\\351v\\\\273\\\\225En\\\\000\\\\220\\\\325,qR[\\\\257\\\\327\\\\022\\\\356\\\\314,\\\\022\\\\321{\\\\366\\\\237_.\\\\227GGGu]\\\\213@LUU\012\\\\261\\\\351Z\\\\332k\\\\372\\\\003p\\\\214\\\\261\\\\336UM\\\\323\\\\204\\\\020\\\\272\\\\256k\\\\333\\\\306{\\\\257PIPy\\\\337+\\\\245\042\\\\305\\\\340\\\\205O$\\\\256Y\\\\000\\\\373B\\\\310\\\\332\\\\204\\\\001b\\\\240\\\\310\\\\024)\\\\022\\\\223\\\\231\\\\216\\\\217]?\\\\377\\\\331'/f\\\\307\\\\307m\\\\333\\\\006Oe\\\\211]\\\\353Lb\\\\277\\\\371\\\\356\\\\333\\\\246\\\\252\\\\213\\\\242\\\\230\\\\224\\\\243\\\\256o\\\\226\\\\363E\\\\3277\\\\026\\\\355tT\\\\002\\\\300?\\\\375\\\\343\\\\027EQ\\\\\\\\\\\\234\\\\237\\\\317\\\\246c\\\\255gi6\\\\014\\\\220>\\\\377\\\\374W\\\\255\\\\363\\\\323\\\\343\\\\223\\\\277\\\\371\\\\233\\\\277I\\\\363\\\\354\\\\371\\\\263\\\\027\\\\037\\\\177\\\\362s\\\\242`\\\\023\\\\303\\\\354m\\\\242\\\\233\\\\256\\\\231\\\\316\\\\216\\\\317\\\\316N\\\\274\\\\367\\\\253\\\\325\\\\346\\\\356\\\\315\\\\315\\\\315\\\\353\\\\267u]\\\\033\\\\235\\\\244i\\\\312\\\\010\\\\343\\\\331\\\\324\\\\240\\\\321\\\\211\\\\326I\\\\232%\\\\011G\\\\377\\\\3600\\\\007P\\\\344\\\\255w\\\\335l2\\\\352\\\\232^)\\\\270\\\\272\\\\2345\\\\273\\\\355\\\\333\\\\2337\\\\027\\\\327\\\\327\\\\263\\\\223+\\\\235\\\\215\\\\376\\\\360\\\\335\\\\353\\\\325bA!\\\\216\\\\362\\\\254\\\\3324\\\\242p\\\\254\\\\025 @<dS!\\\\332\\\\000\\\\000\\\\200\\\\326:\\\\3132\\\\245\\\\000)\\\\002h\\\\224\\\\314\\\\300\\\\274w#\\\\006F\\\\015B\\\\230\\\\227\\\\241\\\\370P\\\\006\\\\274g\\\\300\\\\365\\\\376\\\\244\\\\203\\\\267\\\\253\\\\265#\\\\032M\\\\217\\\\231\\\\031\\\\031\\\\222$\\\\221\\\\241\\\\200\\\\002-\\\\234N%\\\\015\\\\234@e\\\\034\\\\231\\\\231\\\\242'd\\\\243\\\\021A\\\\343\\\\340\\\\365\\\\306\042@CC\\\\223G\\\\303\\\\246\\\\310>\\\\036\\\\0056\\\\227\\\\027\\\\335\\\\027*\\\\002d\\\\010O\\\\364\\\\240=0\\\\240\\\\034{\\\\244\\\\221\\\\001\\\\006\\\\201\\\\036\\\\201\\\\333\\\\004\\\\323HR+\\\\240/\\\\000,\\\\227Ki\\\\362\\\\312\\\\262\\\\224RX\\\\222\\\\267\\\\344o\\\\000P{\\\\335\\\\014II\\\\247'g\\\\316\\\\271HAk-\\\\326\\\\020\\\\342\\\\177\\\\245\\\\024\\\\010G\\\\031\\\\000\\\\232\\\\246\\\\332l6WWWUUY\\\\245\\\\307\\\\305\\\\250i\\\\032\\\\244\\\\270X,\\\\212\\\\242\\\\240\\\\350\\\\255\\\\265\\\\273\\\\355\\\\272,\\\\313\042\\\\313\\\\231\\\\271o;\\\\357}9\\\\312\\\\2451\\\\3408\\\\030u\012;M\\\\362\\\\211\\\\261\\\\251\\\\322\\\\332\\\\007\\\\352\\\\203GB\\\\002@T&\\\\311\\\\314n\\\\323=}\\\\362\\\\374\\\\354\\\\364\\\\342\\\\253o\\\\276\\\\276{\\\\270\\\\317\\\\363r4\\\\231x\\\\037\\\\312\\\\321\\\\250(\\\\312&/\\\\272\\\\256\\\\213\\\\321+E\\\\323i9\\\\236\\\\026\\\\233\\\\252\\\\276\\\\271\\\\271!\\\\242\\\\213\\\\363\\\\363\\\\313\\\\213\\\\2134M\\\\357\\\\356\\\\356\\\\020Q\\\\233d\\\\275^\\\\213\\\\346\\\\315\\\\365\\\\363g_|\\\\361\\\\00537}\\\\367\\\\346\\\\315\\\\333\\\\246\\\\371\\\\365\\\\305\\\\305\\\\331\\\\313\\\\217^\\\\204\\\\340\\\\254\\\\327\\\\326&\\\\333\\\\355v>\\\\277\\\\317\\\\262l\\\\263\\\\331\\\\335\\\\335\\\\335\\\\266m\\\\273\\\\335n\\\\333\\\\306\\\\345y\\\\346\\\\27577\012A\\\\237\\\\235\\\\237\\\\\\\\__\\\\217\\\\312\\\\274,\\\\313Qf\\\\345\\\\027Sm\\\\326\\\\024\\\\304\\\\306KG\\\\337\\\\355\\\\266\\\\233\\\\253\\\\253+\\\\255\\\\354\\\\017?\\\\274\\\\216*\\\\335l[\\\\243tf\\\\364r\\\\276\\\\264\\\\242\\\\304 \\\\026:\\\\014\\\\007+m\\\\255u\\\\014\\\\203\\\\341\\\\222\\\\340\\\\011 \\\\226E?\\\\211Q\\\\220\\\\222\\\\233dK\\\\354\\\\275\\\\025\\\\350}\\\\342<,)\\\\0157y\\\\230(\\\\034\\\\213\\\\225\\\\201\\\\342H\\\\301\\\\031\\\\245\\\\243\\\\213\\\\264\\\\337\\\\350f\\\\221\\\\017\\\\246\\\\000D\\\\010\\\\003\\\\014,\\\\357\\\\366G\\\\371\\\\365'\\\\030s$R\\\\262\\\\302}x\\\\017\\\\373w\\\\373\\\\343w8\\\\2747QiU\\\\357\\\\336\\\\241\\\\264\\\\206\\\\262\\\\341\\\\002\\\\220\\\\034bT\\\\324\\\\225&\\\\223\\\\311a:HD\\\\202\\\\007\\\\213\\\\031\\\\237\\\\\\\\\\\\006\042\\\\311%O\\\\342\\\\234k\\\\352\\\\026\\\\021\\\\233\\\\266>h63\\\\363\\\\321\\\\321\\\\021s\\\\274\\\\277\\\\277/\\\\212\\\\242i\\\\232\\\\321\\\\2508>>^,\\\\026\\\\262X.\\\\223H\\\\331\\\\244\\\\222',\\\\313\\\\022\\\\021\\\\223$\\\\221\\\\032:8\\\\017\\\\000\\\\262\\\\340-\\\\257\042\\\\312\\\\206\\\\000\\\\212YtaQ!z\\\\212\\\\316\\\\005\\\\0000:\\\\211\\\\301\\\\273\\\\336!\\\\242iv\\\\375\\\\337~\\\\377_v\\\\333\\\\377\\\\353\\\\355\\\\335-#8\\\\347^\\\\375\\\\354\\\\223\\\\277\\\\374\\\\313\\\\277\\\\370\\\\346\\\\273o_\\\\277~\\\\275]\\\\257\\\\317\\\\317\\\\317\\\\257\\\\257\\\\256(D\\\\210:+\\\\362\\\\262,?\\\\370\\\\340yUU\\\\256\\\\355\\\\352\\\\355\\\\256\\\\342m;,\\\\373\\\\365EQ\\\\354v\\\\356\\\\350\\\\350\\\\250\\\\252\\\\252\\\\345j\\\\225f\\\\031\\\\203\\\\3236\\\\375\\\\341\\\\315\\\\233\\\\333\\\\333\\\\233\\\\357\\\\277\\\\3776RH\\\\022\\\\305\\\\020\\\\233\\\\246\\\\016\\\\301}\\\\372\\\\351\\\\247J\\\\231\\\\020\\\\302\\\\321\\\\321Q\\\\236\\\\347\\\\253\\\\345&\\\\313\\\\262O?y\\\\225\\\\2466M\\\\363\\\\351t\\\\354\\\\234[.\\\\227\\\\035pY\\\\344!\\\\204\\\\361x\\\\234\\\\245I\\\\333\\\\326\\\\306h\\\\212a\\\\273^M\\\\307\\\\243\\\\262\\\\034\\\\243Iw=C\\\\324\\\\321\\\\373\\\\256iC\\\\333\\\\223\\\\353\\\\0152R\\\\304=uR\\\\222\\\\013\\\\354\\\\007f\\\\202g\\\\011\\\\371F\\\\216N\\\\342\\\\260\\\\257\\\\221\\\\361QU\\\\201\\\\314J\\\\355\\\\025\042\\\\037\\\\237\\\\362C\\\\205@\\\\357\\\\302Q\\\\356\\\\317\\\\363\\\\274\\\\217Q\\\\243\\\\352{\\\\327u\\\\035\\\\037<E\\\\305G\\\\213x\\\\377D{@\\\\203\\\\231(\\\\016\\\\227\\\\207\042T\\\\254\\\\006\\\\024OJ\\\\010z\\\\364\\\\242\\\\010\\\\262\\\\263\\\\310$\\\\325\\\\265PF\\\\367M\\\\237\\\\314\\\\202\\\\324Ob\\\\372\\\\275\\\\316\\\\362\\\\300+\\\\222\\\\353Y\\\\360\\\\3434M\\\\017\\\\343\\\\025k\\\\355\\\\355\\\\355-\\\\000\\\\210\\\\000\\\\327v\\\\273\\\\225\\\\305\\\\266\\\\273\\\\273;A\\\\243\\\\373\\\\276\\\\227\\\\021\\\\214Rj\\\\267\\\\333\\\\031m\\\\255\\\\265F\\\\333\\\\304\\\\246l\\\\3119\\\\267\\\\337_\\\\356\\\\224R\\\\342\\\\234\\\\002\\\\000\\\\367\\\\367\\\\367\\\\022\\\\361]\\\\333z\\\\347\\\\2141F\\\\353\\\\351d\\\\322w]S\\\\3556\\\\253u\\\\226e\\\\256\\\\353w\\\\273\\\\335\\\\321\\\\321\\\\221\\\\363\\\\235\\\\326:\\\\364\\\\216\\\\231\\\\011\\\\3019\\\\027\\\\007\\\\2277\\\\301|\\\\024\\\\002\\\\366!\042\042\\\\023\\\\202B\\\\002\\\\216\\\\300I\\\\226\\\\037\\\\037\\\\037\\\\233\\\\333\\\\371\\\\342\\\\367\\\\177\\\\370\\\\203\\\\326\\\\272\\\\357\\\\035\\\\015\\\\243K\\\\375\\\\017\\\\277\\\\375\\\\375\\\\207\\\\037\\\\2768?\\\\273\\\\\\\\\\\\314\\\\34777\\\\257\\\\277\\\\372\\\\362\\\\353$\\\\265y\\\\2329\012\\\\221\\\\241D\\\\330\\\\355v\\\\323\\\\321Xk{{{k\\\\322D\\\\226\\\\321\\\\177\\\\363\\\\233\\\\337\\\\\\\\?}~ww\\\\367\\\\257\\\\376\\\\365_\\\\334\\\\335\\\\317\\\\253\\\\252i[w?\\\\177\\\\230\\\\214\\\\306D\\\\364\\\\360\\\\260(\\\\313\\\\334{t\\\\256\\\\213\\\\321\\\\037\\\\035O?\\\\372\\\\350\\\\223\\\\324&\\\\017\\\\017\\\\017\\\\223\\\\311L)\\\\325\\\\324\\\\335d2\\\\311\\\\022c\\\\214i\\\\252\\\\272\\\\251\\\\352\\\\030\\\\343\\\\250,\\\\212\\\\242\\\\210>tMm\\\\0246U\\\\325\\\\266\\\\355\\\\007\\\\237}\\\\230\\\\246\\\\351\\\\267\\\\337~;\\\\231\\\\236\\\\266\\\\236\\\\327\\\\363\\\\335\\\\357\\\\276\\\\374\\\\226@\\\\267\\\\236\\\\332\\\\266\\\\327\\\\210\\\\306\\\\030\\\\016\\\\356P\\\\020\\\\363\\\\020\\\\326\\\\004\\\\254DhF)\\\\203\\\\020bd\\\\327\\\\365\\\\202U\\\\211\\\\315\\\\013\\\\252\\\\367p\\\\\\\\\\\\030\\\\344\\\\253\\\\337\\\\303\\\\021\\\\220\\\\211Q)@\\\\002P\\\\014aH\\\\220\\\\303\\\\264\0420\\\\331,\\\\317\\\\313\\\\242\\\\366\\\\033\042J\\\\322\\\\254\\\\367\\\\354\\\\373\\\\336h\\\\305,z\\\\376\\\\221E<\\\\222#3!\\\\000\\\\021\\\\253\\\\275\\\\3351\042\\\\340\\\\240\\\\242\\\\035\\\\001X1\\\\007\\\\006Y\\\\306U\\\\254\\\\030(\\\\204\\\\010@\\\\0324+<(\\\\243\\\\261l\\\\206\\\\374$C\\\\003\\\\000*\\\\241\\\\354\\\\015?\\\\227\\\\326h\\\\036\\\\351(\\\\364}\\\\277\\\\335n{\\\\227\\\\300\\\\236\\\\200\\\\265^\\\\257\\\\005\\\\324\\\\223J\\\\332\\\\030\\\\023B\\\\270\\\\275\\\\275\\\\325Z{\\\\337#\\\\262\\\\367\\\\276\\\\357\\\\273$1y>b\\\\216Y\\\\232\\\\264}\\\\267\\\\335l\\\\010\\\\270\\\\3143\\\\027\\\\274\\\\353:\\\\321zU\012\\\\2141\\\\316uZO\\\\244\012\\\\227K\\\\250\\\\353:km\\\\327uY\\\\226\\\\325u\\\\235\\\\356\\\\351\\\\037rg\\\\222$\\\\273j\\\\203\\\\210\\\\276\\\\353m\\\\226j%[\\\\232\\\\232Q\\\\261hXq \\\\004\042\\\\320\\\\306\\\\020\\\\260\\\\363\\\\036\\\\003Zk_\\\\274x\\\\361\\\\313?\\\\371\\\\225\\\\3364\\\\233\\\\000\\\\274m\\\\234J\\\\2546\\\\266\\\\023\\\\207\\\\005\\\\027\\\\254\\\\315\\\\312\\\\321\\\\230\\\\031\\\\247\\\\323\\\\331\\\\233\\\\267w\\\\267w\\\\3634/\\\\215M\\\\376\\\\351\\\\017_\\\\206\\\\020?\\\\370\\\\340\\\\303\\\\020\\\\311$z<\\\\031\\\\023\\\\305\\\\256k\\\\215\\\\261i\\\\232~\\\\361\\\\305?\\\\316\\\\347\\\\313\\\\272n\\\\353\\\\252~\\\\375\\\\346\\\\215w1\\\\317\\\\213\\\\246mC\\\\214\\\\000\\\\230f\\\\205\\\\353C\\\\337\\\\271?\\\\371\\\\374O\\\\237?\\\\373\\\\340\\\\331\\\\323\\\\017\\\\\\\\\\\\353O\\\\317\\\\316\\\\273\\\\256WJG\\\\362\\\\326&\\\\213\\\\345\\\\206\\\\030\\\\027\\\\363U\\\\357\\\\275w\\\\375f\\\\273I\\\\214\\\\005\012\\\\256\\\\357\\\\231\\\\310\\\\007\\\\312\\\\363\\\\362a\\\\276\\\\332\\\\355Z\\\\243\\\\363\\\\305\\\\256\\\\333\\\\364\\\\372\\\\355\\\\262~X\\\\327U\\\\323\\\\243\\\\322D\\\\264\\\\2516\\\\250T\\\\010q8\\\\316a\\\\000\\\\220\\\\025\\\\210\\\\3248\\\\000*\\\\024\\\\361-\\\\300\\\\246\\\\252\\\\023\\\\223L\\\\307S\\\\221t4V3s\\\\357\\\\234\\\\261\\\\326Z\\\\333u=!*\\\\253\\\\265\\\\326\042\\\\323\\\\244\\\\224\\\\032p_\\\\021\\\\033\\\\227s\\\\\\\\xy!\\\\272\\\\350\\\\032\\\\027\\\\262\\\\321\\\\270\\\\367\\\\324\\\\007b\\\\324\\\\275\\\\2474M\\\\2551Z\\\\001E\\\\0071\\\\000\\\\304H1\\\\304\\\\300\\\\302\\\\223'TJ\\\\0032\\\\021!\\\\2021\012\\\\201]\\\\337+5`\\\\214\\\\010\\\\200\\\\342K\\\\026ao\\\\347\\\\215\\\\274/F\\\\030\\\\016?\\\\243\\\\\\\\\\\\217\\\\010\\\\003T\\\\302\\\\302\\\\2156Z\\\\355\\\\377\\\\211\\\\342\\\\230H\\\\221\\\\210\\\\274\\\\326*M\\\\023\042\\\\022jrb\\\\023&VZ\\\\031mAk@t\\\\336\\\\367\\\\316\\\\021\\\\263\\\\250\\\\005jDc\\\\0240Q\\\\014F\\\\003\042\\\\367}\\\\333\\\\266\\\\265\\\\353\\\\272\\\\336\\\\265\\\\2515JC\\\\3276\\\\332\\\\2504\\\\261MS\\\\033\\\\255\\\\000\\\\310\\\\032\\\\3236\\\\225\\\\367\\\\316\\\\365\\\\2355\\\\272ijy\\\\207\\\\210\\\\300L!\\\\370\\\\311dl\\\\223d\\\\275\\\\331di*}\\\\352n\\\\267\\\\003dc\\\\014*\\\\3254\\\\015*\\\\023\\\\210\\\\020\\\\215IR\\\\255L\\\\020\\\\230]\\\\351\\\\266mub{\\\\357\\\\225\\\\321\\\\263\\\\243\\\\331/\\\\177\\\\365\\\\313\\\\353g\\\\327i\\\\226\\\\232\\\\247/_\\\\226e\\\\271Z,\\\\357\\\\357\\\\357!\\\\362\\\\325\\\\365\\\\223\\\\027\\\\317\\\\236\\\\013'\\\\356\\\\353\\\\257\\\\276\\\\351\\\\373~<\\\\031)\\\\223\\\\364>.\\\\327[\\\\320*Ms\\\\357\\\\375b\\\\261`\\\\346\\\\262(\\\\362<-\\\\3132MSD=\\\\237\\\\317\\\\333\\\\266\\\\003\\\\300\\\\337\\\\376\\\\366\\\\013\\\\347\\\\0341\\\\346y\\\\336t\\\\355\\\\364h\\\\352{'+\\\\030\\\\323\\\\361\\\\370\\\\177\\\\372\\\\267\\\\377c\\\\222$\\\\325f\\\\013\\\\221\\\\352\\\\272\\\\366\\\\241\\\\237\\\\317\\\\347\\\\213\\\\345\\\\303|>_-7\\\\306\\\\244\\\\237}\\\\366\\\\331\\\\263gO)\\\\2702\\\\317\\\\336\\\\276}\\\\243\\\\224z\\\\230\\\\337\\\\347i\\\\332\\\\366^)}\\\\377\\\\260xz\\\\375\\\\201I\\\\022`\\\\343\\\\333\\\\366f\\\\271^\\\\327m\\\\335E\\\\006\\\\264\\\\240P+\\\\331\\\\222\\\\000\\\\245\\\\207\\\\236\\\\011\\\\010\\\\201\\\\024\\\\203\\\\022n>\\\\020\\\\202\\\\006\\\\216J)\\\\2101\\\\306\\\\270Y\\\\255_\\\\003_?y\\\\002\\\\003\\\\365\\\\221\\\\265\\\\326\\\\221<x\\\\000\\\\265\\\\027,\\\\304a\\\\336\\\\002\\\\240\\\\200\\\\210\\\\343 \\\\231\012\\\\002\\\\\\\\\\\\014\\\\321\\\\004J)\\\\324\\\\232\\\\325\\\\240Q\\\\267O\\\\272\\\\003\\\\310E\\\\024\\\\305=\\\\205d|-\\\\336y\\\\214\\\\210\\\\032\\\\006\\\\357cbF\\\\0304\\\\300\042\\\\0033\\\\313\\\\177\\\\015\\\\224\\\\222wH\\\\310O\\\\300g~\\\\244C\\\\3678I\\\\037\\\\030TRc0\\\\263\\\\322\\\\200\\\\254e\\\\275T\\\\022\\\\263\\\\367\\\\2034\\\\250R\\\\212,G`\\\\255\\\\337#\\\\215\\\\020Q\\\\353\\\\272\\\\020e\\\\023^\\\\314Q#\\\\002P\\\\014\\\\332&\\\\276\\\\363\\\\333\\\\272bfk\\\\255F\\\\010\\\\301\\\\005\\\\327[\\\\253\\\\245\\\\247t\\\\316\\\\015\\\\344[D!9\\\\311|[,\\\\215\\\\245k\\\\224T-\\\\020!\\\\021\\\\311\\\\\\\\\\\\023\\\\021m\\\\222u\\\\275/\\\\313RY\\\\343\\\\234\\\\353\\\\\\\\@D\\\\006\\\\010}\\\\257\\\\023\\\\333\\\\367\\\\2752\\\\346\\\\303\\\\017?\\\\274\\\\276\\\\276>==e\\\\001\\\\026?\\\\371\\\\331\\\\307\\\\343\\\\321X\\\\006\\\\225\\\\032\\\\001\\\\021\\\\214\\\\326!\\\\204\\\\257\\\\277\\\\376\\\\352\\\\253\\\\257\\\\277Z\\\\256\\\\226\\\\353\\\\365r\\\\275]7m}rr\\\\374\\\\374\\\\371\\\\363\\\\331d\\\\232\\\\347E\\\\214\\\\024\\\\202\\\\357\\\\332\\\\026\\\\000\\\\211\\\\270,GR\\\\217\\\\206\\\\020\\\\373\\\\336\\\\211\\\\323\\\\021\\\\003v\\\\235SZ5u\\\\013\\\\030\\\\213\042\\\\377\\\\374\\\\027\\\\237>\\\\271:_\\\\255\\\\036\\\\232fw}}\\\\011\\\\020\\\\226\\\\253y]o\\\\231B\\\\226$\\\\327WW\\\\223\\\\331\\\\364\\\\315\\\\353\\\\233\\\\252\\\\332\\\\275}\\\\3736M\\\\354\\\\333\\\\233\\\\233\\\\357\\\\277\\\\377n\\\\265^\\\\031\\\\233hm\\\\313\\\\321X\\\\353\\\\264\\\\252\\\\273M\\\\325\\\\020\\\\352\\\\233\\\\267w}\\\\240\\\\037\\\\336>TM\\\\353\\\\2343F'\\\\326\\\\020\\\\223w.R\\\\340\\\\030q\\\\200iip\012\\\\004`\\\\000\\\\245eG\\\\211\\\\020A1\\\\023\\\\304\\\\340\\\\272\\\\256kOO\\\\216\\\\265\\\\026\\\\032\\\\007)\\\\255\\\\210B\\\\214Qk\\\\205Z\\\\213Y\\\\0070#1\\\\210_\\\\000E\\\\200\\\\301.q\\\\200\\\\202\\\\231]\\\\014>\\\\306>F\\\\235$\\\\000\\\\350\\\\005Fb0\\\\306\\\\346Y\012\\\\303\\\\364\\\\361@\\\\023a\\\\030\\\\364M\\\\324\\\\036\\\\033\\\\206G\\\\177\\\\206I8\\\\017~\\\\203C\\\\0054\\\\2447\\\\305\\\\207\\\\307\\\\277\\\\203\\\\234a\\\\377u\\\\377\\\\347\\\\200a\\\\277+\\\\361\\\\221`o2\\\\033\\\\206\\\\316XV\\\\023X\\\\0201\\\\245T\\\\357z\\\\212A~^\\\\212^! \\\\203w~\\\\020e$\\\\212!\\\\020\\\\005\\\\032\\\\004\\\\247]\\\\360Q.WyB\\\\211`\\\\245\\\\024\\\\003\\\\357ac:\\\\004\\\\264\\\\264.2\\\\202\\\\021\\\\354\\\\357\\\\340\\\\267IL2\\\\311\\\\324\\\\306 (1\\\\035\\\\001D\\\\233\\\\244\\\\021\\\\270\\\\357}\\\\337;\\\\271\\\\374B\\\\214}\\\\337\\\\203\\\\302\\\\311dr\\\\365\\\\344\\\\372\\\\343\\\\217?\\\\236\\\\315f\\\\210\\\\030b\\\\034\\\\215Ff\\\\275\\\\336n\\\\267\\\\225\\\\367=\\\\022\\\\033c\\\\230#\\\\252\\\\210*\\\\366}\\\\215\\\\030\\\\263,\\\\337n\\\\327\\\\204 \\\\366\\\\211\\\\306\\\\230\\\\345\\\\303\\\\\\\\.\\\\364<\\\\317\\\\203\\\\363Z\\\\353<\\\\317\\\\205$>\\\\231L|\\\\240\\\\305ba\\\\214FT\\\\275\\\\363i\\\\246\\\\2151/>y\\\\336\\\\266\\\\355\\\\263\\\\247O\\\\372\\\\246\\\\376\\\\177\\\\376\\\\337\\\\277}v}\\\\365\\\\351\\\\317?\\\\371\\\\303\\\\227\\\\377P\\\\327\\\\265\\\\254\\\\365\\\\026E\\\\221\\\\347e\\\\210\\\\336\\\\265\\\\315\\\\371\\\\371\\\\351b\\\\261\\\\000\\\\240\\\\313\\\\353\\\\313D\\\\253$\\\\263MU\\\\247Y\\\\376\\\\365w?T\\\\325\\\\357?\\\\373\\\\374W\\\\363\\\\345\\\\346\\\\263\\\\317\\\\177\\\\331tN\\\\333\\\\354\\\\333\\\\233\\\\267]\\\\007A\\\\326\\\\231\\\\225\\\\021\\\\027\\\\002\\\\2555\\\\006\\\\315\\\\250Q\\\\001\\\\003\\\\241\\\\230r\\\\003I\\\\364i%\\\\355\\\\030D\\\\212\\\\022\\\\345\\\\004\\\\354\\\\\\\\\\\\267^/ONN\\\\264N\\\\230Yv\\\\007\\\\211\\\\202\\\\001\\\\005\\\\024Ak\\\\0050\\\\354X\\\\355G.Dq\\\\200\\\\245\\\\021\\\\200!\\\\356\\\\321\\\\016\\\\231,\\\\037\\\\024i\\\\037W\\\\344{\\\\320\\\\372\\\\300j\\\\032j\\\\364\\\\201\\\\205!\\\\357*\\\\262\\\\006\\\\224\\\\326m\\\\2105>\\\\214p\\\\020\\\\340`\\\\300\\\\373Gn?J\\\\317{$\\\\344qS\\\\370\\\\316\\\\020\\\\032\\\\021\\\\265\\\\330\\\\370\\\\211\\\\342\\\\374#\\\\230\\\\017\\\\366\\\\304& \\\\3468\\\\370\\\\340\\\\362\\\\260\\\\320E!\\\\004@:\\\\240\\\\357m\\\\350\\\\005x\\\\226W\\\\221\\\\312\\\\333Z\\\\033C`f!u\\\\010\\\\310-8U\\\\327u\\\\223\\\\311\\\\204\\\\367\\\\364\\\\356C\\\\254\\\\247i*\\\\217WJE\\\\037\\\\304FV\\\\031\\\\255\\\\215\\\\251\\\\332\\\\306\\\\373(\\\\241\\\\337\\\\365\\\\275\\\\200\\\\206W\\\\327\\\\327/_\\\\276<=\\\\277\\\\020 \\\\345pm\\\\350\\\\321dZ\\\\344\\\\345l<\\\\231\\\\316\\\\306E\\\\236\\\\025e\\\\022B\\\\377\\\\303w_\\\\003R\\\\222\\\\350\\\\223\\\\323\\\\243\\\\242\\\\310//.\\\\256..g\\\\307\\\\3071\\\\306\\\\304\\\\244\\\\343\\\\361$\\\\313\\\\362\\\\262,\\\\\\\\\\\\337WU}{\\\\373\\\\366\\\\315\\\\2337_\\\\177\\\\3755\\\\021\\\\035\\\\237\\\\234~\\\\362\\\\311'\\\\037|\\\\370\\\\322\\\\030\\\\015\\\\310GGG\\\\317\\\\236=\\\\375\\\\350\\\\345\\\\007\\\\210\\\\344\\\\373\\\\346\\\\357\\\\376\\\\363\\\\027\\\\223\\\\261\\\\376\\\\354\\\\347\\\\257\\\\372\\\\256\\\\316\\\\022\\\\363\\\\366\\\\346u\\\\014\\\\356\\\\346f\\\\231g\\\\372\\\\342\\\\374\042\\\\315\\\\262\\\\361h|qu\\\\271\\\\335n\\\\224\\\\306\\\\273\\\\273\\\\267g\\\\027\\\\347\\\\214puy\\\\271\\\\332\\\\356\\\\254\\\\315lZ\\\\234\\\\\\\\\\\\\\\\&\\\\331\\\\350\\\\367\\\\177\\\\370z\\\\261Z\\\\337\\\\274}\\\\250;\\\\2076\\\\005\\\\224\\\\317A\\\\211v\\\\200\\\\214R)\\\\006`\\\\002\\\\032\\\\200\\\\205G\\\\221\\\\005\\\\264\\\\237\\\\033*\\\\000a:+\\\\215\\\\336\\\\373rT\\\\246Y\\\\032)\\\\342 \\\\272'p\\\\235\\\\270m\\\\017@\\\\011\\\\356\\\\3770\\\\023\\\\242\\\\222\\\\271\042E\\\\212D\\\\336\\\\007\\\\037\\\\310\\\\021ie\\\\210\\\\301{\\\\212\\\\014\\\\014h\\\\214N\\\\223D\\\\354\\\\037\\\\207\\\\014=\\\\374:\\\\021P3\\\\035`\\\\345\\\\341e\\\\224\\\\222\\\\011\\\\216\\\\020\\\\375$C\\\\213Z\\\\025\\\\014w>\\\\272\\\\375\\\\350\\\\237?\012v\\\\02673 @>\\\\350\\\\336J\\\\360\\\\305\\\\030\\\\016\\\\235\\\\242\\\\304q\\\\214\\\\036\\\\200\\\\265\\\\322\\\\203\\\\337&0\\\\017{\\\\207@\\\\024\\\\233\\\\272\\\\011>P\\\\360\\\\024\\\\243l\\\\247\\\\251\\\\375\\\\340\\\\225\\\\231EaY\\\\260mi7\\\\225\\\\0366\\\\307\\\\366+\\\\337\\\\003\\\\003Vt)DL#\\\\317\\\\363\\\\256\\\\353\\\\004\\\\037;\\\\274\\\\023\\\\245\\\\0241\\\\207\\\\030\\\\210\\\\331\\\\030\\\\3234-1JR\\\\357\\\\235\\\\023`\\\\361\\\\352\\\\351\\\\365\\\\307\\\\037\\\\377\\\\354\\\\372\\\\372\\\\251M\\\\254\\\\014\\\\\\\\\\\\344\\\\031\\\\234s\\\\246(Fm\\\\333\\\\366m=\\\\032\\\\347F\\\\307Q\\\\231M.\\\\216O\\\\216\\\\212\\\\351t\\\\212\\\\210y^\\\\020A\\\\265k\\\\266\\\\333\\\\272\\\\253+\\\\027\\\\311*+\\\\007\\\\226\\\\367\\\\375\\\\341\\\\262\\\\333n\\\\267BP\\\\326&\\\\261\\\\326\\\\356\\\\352\\\\366\\\\352\\\\352\\\\352\\\\263\\\\317\\\\177\\\\201\\\\210\\\\353\\\\345j>\\\\237OG\\\\343\\\\242<}{\\\\363\\\\335\\\\256j\\\\276\\\\376\\\\372\\\\017\\\\377\\\\346\\\\257\\\\376\\\\262\\\\255\\\\233\\\\365fF\\\\004u]\\\\237\\\\236\\\\036\\\\217F\\\\243\\\\273\\\\207y\\\\333tI\\\\236}\\\\364\\\\321\\\\207\\\\347\\\\347\\\\347\\\\213\\\\305\\\\342\\\\346\\\\346\\\\006@\\\\215\\\\306\\\\323\\\\223\\\\323\\\\313,\\\\315\\\\177\\\\377\\\\207o\\\\272>\\\\276\\\\271\\\\275\\\\327i\\\\276^o\\\\363\\\\361\\\\264^\\\\256S\\\\020V\\\\232&\\\\212!x\\\\245\\\\224\\\\321\\\\2111I\\\\360.\012\\\\370\\\\240X\\\\310\\\\226$\\\\035\\\\224\\\\350@\\\\351\\\\201\\\\316\\\\017\\\\004\\\\021\\\\000\042o\\\\253j\\\\263\\\\331\\\\210\\\\207\\\\335\\\\241\\\\305\\\\332'\\\\335\\\\310\\\\210\\\\302\\\\244G\\\\3248L\\\\304\\\\211P\\\\034\\\\300\\\\201\\\\020\\\\010x\\\\357L\\\\002\\\\207\\\\324\\\\214\\\\270\\\\277(\\\\206R\\\\226\\\\304\\\\016\\\\3500\\\\346@u(|\\\\007\\\\034\\\\216!\\\\022\\\\001\\\\342\\\\201\\\\255\\\\377\\\\356\\\\357\\\\314\\\\003\\\\334\\\\362\\\\243\\\\334\\\\377\\\\356\\\\004x\\\\264v\\\\3658O\\\\277\\\\007K?\\\\272\\\\321#%\\\\244\\\\030c\\\\214\\\\236\\\\210\\\\254M)D\\\\326\\\\207\\\\232\\\\236E\\\\254Q\\\\236\\\\237\\\\230\\\\360\\\\021\\\\000\\\\017\\\\000\\\\203/\\\\0313\\\\021\\\\211:\\\\2430\\\\004\\\\345\\\\323\\\\220:D\\\\346\\\\216\\\\362B\\\\207\\\\245\\\\030Q\\\\221\\\\315\\\\363\\\\\\\\Jgi\\\\333\\\\016\\\\350\\\\241\\\\334\\\\\\\\\\\\360bw\\\\320u\\\\235\\\\363>M\\\\323\\\\347\\\\317\\\\237?\\\\377\\\\360\\\\203\\\\363\\\\363s\\\\245\\\\01437u\\\\243\\\\366\\\\272\\\\340\\\\003Q\\\\361\\\\362\\\\342\\\\322\\\\271N+.\\\\362\\\\224\\\\310y\\\\337)\\\\025\\\\332\\\\256\012\\\\256\\\\247\\\\3507\\\\233\\\\265w\\\\356\\\\356\\\\366\\\\356\\\\376\\\\341>\\\\304\\\\030}h\\\\3336\\\\313r\\\\245\\\\240\\\\353:&\\\\326\\\\006ONN\\\\222$\\\\011\\\\301eYzqyy||\\\\224d\\\\251\\\\265f\\\\271Z\\\\376\\\\375\\\\337\\\\377\\\\227\\\\207\\\\373\\\\373gO\\\\236\\\\356\\\\266\\\\353o\\\\277\\\\371\\\\272\\\\251\\\\327\\\\301\\\\303\\\\263\\\\247g\\\\325nS\\\\026y\\\\014~\\\\275\\\\331\\\\364\\\\275?::\\\\035\\\\217&i\\\\232\\\\027EA\\\\300I\\\\222\\\\254\\\\267\\\\233r4Z.7\\\\257>\\\\376Yd\\\\025\\\\001\\\\036\\\\346\\\\353\\\\361\\\\364\\\\330\\\\005R&[m\\\\253H\\\\260\\\\335\\\\265\\\\332\\\\244\\\\332$\\\\310`\\\\224\\\\246\\\\030z\\\\327+\\\\245\\\\264Q\\\\201\\\\3020\\\\372\\\\022z\\\\003\\\\310!+V>b\\\\277w` \\\\001\\\\014~l\\\\020b\\\\320\\\\306\\\\244Y\\\\246\\\\3200\\\\023\\\\242\\\\026\\\\207\\\\355C\\\\015\\\\015\\\\203w\\\\033\\\\0023\\\\355\\\\3732\\\\301\\\\031\\\\006i\\\\005\\\\000\\\\357\\\\274\\\\322:2\\\\207=\\\\366`\\\\264I\\\\022K1\\\\276WC\\\\223\\\\\\\\\\\\014\\\\250PI`\\\\354AV\\\\201\\\\377\\\\200\\\\007\\\\364\\\\202a\\\\257\\\\215\\\\270\\\\037\\\\207\\\\2777\\\\003:D\\\\352\\\\343T}\\\\350\\\\035\\\\017A,\\\\365\\\\267`\\\\013r\\\\217P2\\\\210\\\\202\\\\020\\\\251%\\\\212@>\\\\214\\\\020\\\\006\\\\231\\\\234\\\\340e\\\\242\\\\351{\\\\227eV\\\\334vp\\\\2774\\\\305\\\\2220\\\\230\\\\231y\\\\310\\\\240}O4l|\\\\372\\\\020d\\\\017@\\\\302Z\\\\2227\042&\\\\211I\\\\022\\\\233\\\\246\\\\211R\\\\010J\\\\025e\\\\231\\\\027y\\\\2101\\\\313s@\\\\214\\\\024\\\\235w\\\\316\\\\373\\\\020\\\\305\\\\3271\\\\332$\\\\363!\\\\020\\\\321d2\\\\371\\\\340\\\\203\\\\017^~\\\\374\\\\352\\\\311\\\\223\\\\247\\\\343\\\\361d\\\\270H\\\\020\\\\254\\\\265\\\\010Jk\\\\243P\\\\215\\\\312\\\\221Y\\\\255\\\\027e\\\\231k\\\\215\\\\313\\\\325\\\\334\\\\273\\\\372\\\\352\\\\311\\\\351x\\\\\\\\\\\\366n\\\\027\\\\251\\\\217\\\\304\\\\017\\\\363\\\\207\\\\361h\\\\332\\\\365\\\\265\\\\321\\\\010\\\\300\\\\253\\\\365\\\\242\\\\251\\\\335\\\\321\\\\321\\\\321\\\\361\\\\361\\\\271\\\\326\\\\303\\\\230\\\\370\\\\374\\\\374\\\\274,s)\\\\373\042\\\\015\\\\314\\\\324\\\\325jU\\\\325\\\\365\\\\253\\\\227\\\\037iP\\\\313\\\\345\\\\362\\\\305\\\\263g\\\\336w\\\\243\042)G\\\\331\\\\223\\\\253\\\\263\\\\276o\\\\001\\\\340\\\\303\\\\017?L\\\\263\\\\321\\\\263\\\\2478\\\\235\\\\234\\\\270>2s\\\\333\\\\366>\\\\370bT\\\\344:_-7?\\\\374\\\\360\\\\246\\\\034\\\\037\\\\225\\\\3431\\\\203\\\\311\\\\213IV\\\\214\\\\337~\\\\365\\\\315w?\\\\334\\\\244y\\\\021\\\\003\\\\24326\\\\221\\\\217I\\\\364\\\\361\\\\025E\\\\026\\\\356\\\\001\\\\202\\\\226+\\\\2305\\\\0033+\\\\331\\\\203\\\\2261\\\\011\\\\210\\\\323\\\\024\\\\211\042\\\\213B\\\\245\\\\214\\\\010\\\\027l\\\\252&\\\\315\\\\233\\\\331\\\\364\\\\224\\\\024r``Vz\\\\23032#3\\\\311\\\\256\\\\023\\\\003\\\\356Y\\\\365\012q\\\\030r(\\\\245\\\\224\\\\326f\\\\277\\\\021\\\\263\\\\007\\\\321\\\\024\\\\360P\\\\263*d\\\\032\\\\362\\\\265\042&\\\\245\\\\024\\\\311\\\\1771\\\\312\\\\332\042\\\\000\\\\240\\\\022\\\\373\\\\343A\\\\346\\\\217\\\\337_\\\\325\\\\006\\\\000\\\\301\\\\304\\\\177\012e\\\\374\\\\321\\\\014\\\\215\\\\217\\\\334G\\\\017\\\\225\\\\364\\\\341\\\\273\\\\016\\\\220\\\\202\\\\364\\\\202|(\\\\250hX\\\\003\\\\225\\\\217\\\\364p\\\\375\\\\310*\\\\312\\\\341\\\\311a?\\\\210\\\\267\\\\306\\\\310dT6s\\\\004\\\\344\\\\226\\\\310\\\\026\\\\226\\\\2344\\\\003\\\\302\\\\267\\\\226\\\\301MUUY\\\\226\\\\315f3F%\\\\337(Cr\\\\241s\\\\210\\\\272l\\\\224+\\\\201 :\\\\207\\\\210WWW\\\\037\\\\177\\\\374\\\\361\\\\3712O\\\\201\\\\224\\\\000\\\\000 \\\\000IDAT\\\\325%3\\\\313\\\\200\\\\375\\\\260\\\\310\\\\023B\\\\210\\\\201dj\\\\3234\\\\2156V{\\\\337k\\\\005\\\\227\\\\227\\\\247\\\\037~x\\\\355\\\\373\\\\212b\\\\037\\\\243\\\\313\\\\323\\\\244m\\\\252\\\\262\\\\310\\\\201x\\\\273\\\\253\\\\322,\\\\365\\\\316\\\\235\\\\237]\\\\354\\\\252j\\\\275^\\\\335\\\\336\\\\276\\\\275\\\\272\\\\272\\\\032\\\\217\\\\307/^<\\\\333n7MS\\\\257VK\042\\\\312\\\\313|\\\\263]\\\\337\\\\336\\\\335\\\\245i2\\\\036O\\\\020\\\\360\\\\366\\\\346\\\\016\\\\231\\\\233\\\\246\\\\231\\\\316\\\\306G\\\\263\\\\351\\\\331\\\\371i\\\\236eEQ\\\\354\\\\266\\\\325nW\\\\375\\\\303?\\\\374\\\\356\\\\366\\\\366^\\\\231\\\\304\\\\330Ta\\\\3224\\\\335hR\\\\000B\\\\333\\\\266o\\\\357\\\\356Q\\\\331\\\\331\\\\361\\\\361\\\\354\\\\350\\\\254s\\\\024Y\\\\375ps\\\\3670_\\\\022k\\\\332\\\\317\\\\356\\\\231\\\\331\\\\030\\\\013\\\\300\\\\322\\\\213\\\\020\\\\311\\\\332H\\\\264\\\\326\\\\212/\\\\014\\\\023\\\\031\\\\245P6\\\\264\\\\005YP\012@\\\\211\\\\242&\\\\200\\\\002\\\\320D\\\\300\\\\254\\\\264MB\\\\210]\\\\027\\\\020M\\\\226\\\\227F'\\\\342!\\\\257\\\\025\\\\357\\\\255\\\\002$\\\\2171\\\\023\\\\001\\\\2426&\\\\3123j\\\\315\\\\014!\\\\006\\\\037\\\\002\\\\001\\\\213l\\\\035\\\\023\\\\207\\\\020\\\\235\\\\013\\\\326\\\\232\\\\274(\\\\230\\\\031\\\\244\\\\331B\\\\224\\\\344\\\\316\\\\314\\\\003J2\\\\370\\\\301\\\\016\\\\3701\\\\014\\\\365=!\\\\200VZ!(T\\\\373<M\\\\370\\\\356Zz4\\\\210\\\\221J\\\\177`\\\\347\\\\275K\\\\303r\\\\217\\\\021\\\\277k\\\\206\\\\241\\\\360ET\\\\212\\\\021A\\\\326\\\\362`\\\\350\\\\007\\\\342`\\\\0360\\\\230E\\\\000\\\\034,\\\\307\\\\367\\\\2655\\\\014\\\\320!\\\\037J\\\\021\\\\301v$C[ke\\\\015\\\\361@+M\\\\322D\\\\312\\\\011\\\\221\\\\355\\\\222}D\\\\245\\\\324t:)\\\\212\\\\302\\\\307`\\\\2545F;\\\\327\\\\207\\\\0207\\\\233M1\\\\032\\\\001b\\\\210,\\\\250M\\\\347\\\\234\\\\3671\\\\3153&\\\\370\\\\360\\\\325G\\\\277\\\\370\\\\345\\\\347I\\\\226*e\\\\230a<\\\\036+\\\\245\\\\2645\\\\306\\\\332\042/\\\\023\\\\233 \\\\242,\\\\325\\\\002\\\\200\\\\311\\\\213\\\\244,\\\\363\\\\361(\\\\013\\\\276%\\\\237&\\\\211\\\\031\\\\215\012\\\\250}bM\\\\337+\\\\242h\\\\214\\\\235\\\\316J\\\\205I\\\\232\\\\002\\\\252h,\\\\212\\\\355}Uo\\\\217\\\\217&\\\\213\\\\305\\\\274\\\\353\\\\332,O\\\\216\\\\217\\\\237\\\\337\\\\335\\\\335}\\\\365\\\\325\\\\227\\\\267\\\\267w\\\\213\\\\325&\\\\313\\\\262,/S\\\\233\\\\271\\\\326\\\\2476\\\\331l\\\\326\\\\014G\\\\243\042-\\\\212\\\\354\\\\371G\\\\037z\\\\357\\\\242\\\\247\\\\242\\\\034g\\\\371\\\\354\\\\327\\\\377\\\\376\\\\377\\\\266&K\\\\222,K\\\\313\\\\373\\\\305\\\\242n\\\\2724\\\\263Y1z\\\\361\\\\301\\\\030Qe\\\\371\\\\270j\\\\334f[\\\\317\\\\227\\\\333\\\\252n\\\\272.\\\\200\\\\322\012\\\\025\\\\020E\\\\334\\\\177\\\\246\\\\303-\\\\020\\\\221\\\\020-\\\\345\\\\340\\\\003\\\\200\\\\2368R\\\\330Sv\\\\024*3\\\\030\\\\026\\\\036\\\\270\\\\020\\\\200\\\\210\\\\310\\\\210\\\\275\\\\213Y66\\\\306\\\\354\\\\352Z/\\\\227g'\\\\247i\\\\232\\\\006\\\\347\\\\264\\\\031Ji\\\\030\\\\010E<\\\\000\\\\276\\\\210\\\\0065)1\\\\246\\\\031\\\\216\\\\011\\\\216l\\\\264&bq\\\\202\\\\325\\\\304\\\\203\\\\344!\\\\037T2\\\\366\\\\016\\\\266\\\\250\\\\245\\\\263T\\\\022pC\\\\345r\\\\250!\\\\020\\\\265\\\\024\\\\022\\\\360~\\\\336\\\\225\\\\345\\\\331=\012\\\\361>\\\\240\\\\361\\\\323\042\\\\344q.\\\\377Q\\\\373\\\\370\\\\317\\\\335\\\\036?\\\\350\\\\247E\\\\371#\\\\212\\\\327\\\\360\\\\300\\\\303\\\\024]\\\\212cI\\\\374\\\\210(\\\\\\\\S\\\\3416I\\\\201+\\\\357\\\\341\\\\207\\\\037~8;;\\\\023\\\\316\\\\017\\\\263hT\\\\347\\\\221Y\\\\206\\\\352u]\\\\327m#y}z2=:=\\\\371\\\\340\\\\305\\\\3134Me9\\\\027\\\\000\\\\017\\\\224@\\\\027\\\\274sn\\\\327Ur\\\\011\\\\251\\\\275\\\\317\\\\213~\\\\362\\\\344\\\\250\\\\251\\\\267L}$\\\\2475\\\\275\\\\275}\\\\255\\\\024g\\\\326J\\\\321\\\\243\\\\265)\\\\212b:\\\\036+\\\\004@X\\\\255V\\\\316\\\\205\\\\246\\\\351F\\\\243\\\\334Z=\\\\036\\\\22777o\\\\234\\\\357\\\\001h\\\\273\\\\333~\\\\361\\\\305o\\\\337\\\\274\\\\2711F\\\\237\\\\235\\\\237\\\\217\\\\307\\\\243\\\\272\\\\251\\\\267\\\\233\\\\315j\\\\261)\\\\312\042\\\\004\\\\377\\\\352\\\\325\\\\253\\\\347O\\\\257\\\\263,\\\\377\\\\337\\\\377\\\\267\\\\377\\\\343\\\\362\\\\362r\\\\275\\\\336\\\\001\\\\250<\\\\033w]\\\\377\\\\344\\\\3113\\\\223d\\\\332\\\\244\\\\305hd\\\\023C\\\\004}\\\\037\\\\263<?=\\\\273R&[,7\\\\363\\\\345v\\\\275\\\\332x\\\\317\\\\210\\\\250\\\\215A\\\\300\\\\010,?\\\\266B`\\\\212!\012\\\\033K\\\\014\\\\256\\\\001\\\\020\\\\2555\\\\342\\\\305 A\\\\017\\\\250\\\\020\\\\265\\\\322\\\\006\\\\020\\\\0015*\\\\003\\\\312(e\\\\224\\\\266\\\\332\\\\030\\\\245\\\\0150fEa\\\\214\\\\355:\\\\347|0\\\\332Z\\\\233\\\\240\\\\002\\\\204\\\\250@\\\\2648\\\\364\\\\376\\\\270\\\\227\\\\224\\\\207\\\\362l\\\\221x@*\\\\000\\\\211\\\\310\\\\307\\\\300\\\\304\\\\2404\\\\0030hm\\\\214\\\\325\\\\366\\\\220/a\\\\020\\\\030P\\\\207\\\\212\\\\370\\\\340\\\\200\\\\274\\\\217\\\\236w\\\\251w\\\\037`xp<A\\\\304HC4\\\\037b\\\\372\\\\275p|\\\\024\\\\304r\\\\323Z\\\\272\\\\311w8\\\\367>R\\\\011\\\\377\\\\030r\\\\242\\\\336\\\\303\\\\260\\\\005T\\\\004\\\\341\\\\204\\\\323\\\\243\\\\370V\\\\222\\\\347\\\\245\\\\340\\\\323Z\\\\312h)\\\\315\\\\2452\\\\311\\\\213\\\\\\\\*\\\\031Y!\\\\223RPkM@\\\\250\\\\220\\\\231d=\\\\221\\\\210\\\\264Md\\\\303|WW\\\\233\\\\355\\\\216\\\\210f\\\\263\\\\331\\\\305\\\\223\\\\253\\\\353\\\\247\\\\317\\\\237>}6\\\\235\\\\036\\\\3314%\\\\006c\\\\223\\\\020\\\\243\\\\322jX*\\\\215l\\\\215\\\\025\\\\211\\\\350\\\\203v\\\\202RJ_]\\\\217F\\\\343|<.\\\\027\\\\313;\\\\215\\\\220X}<\\\\235\\\\326u%\\\\362\\\\324\\\\262\\\\327S\\\\2109\\\\270\\\\321w\\\\267\\\\267\\\\233m5\\\\233\\\\215/.O\\\\235\\\\357(\\\\372\\\\252\\\\332*\\\\005\\\\336\\\\273\\\\371|\\\\276X\\\\314\\\\207\\\\005\\\\301\\\\020\\\\275\\\\367I\\\\232=}\\\\372\\\\354\\\\374\\\\364\\\\014\\\\200OO\\\\216\\\\277\\\\371\\\\346\\\\353\\\\340\\\\275\\\\250\\\\032\\\\207@Z\\\\333\\\\242\\\\034WU}zq\\\\031#\\\\267}\\\\377\\\\360\\\\260H\\\\222\\\\244(\\\\213@\\\\334t]\\\\210\\\\010*\\\\331U\\\\355\\\\335\\\\303\\\\252\\\\252\\\\033\\\\000#~\\\\240\\\\000\\\\020\\\\367U`j\\\\254\\\\344g\\\\037B\\\\244\\\\000\\\\300\\\\210\\\\214J\\\\016v\\\\002\\\\020}\\\\375\\\\201\\\\324\042:\\\\263F\\\\033\\\\020\\\\320Zke\\\\2542V\\\\231D\\\\031\\\\235f91Pd@\\\\0161\\\\264m\\\\313\\\\000E\\\\226r\\\\214ra?F0\\\\244`\\\\260\\\\306*T!D&RJ#C\\\\2408l+\\\\200bT\\\\022\\\\320\0125C\\\\244H\\\\3144\\\\264\\\\035BO\\\\306\\\\341\\\\006\\\\373P>D-\\\\3567\\\\000\\\\366\\\\231\\\\362]^\\\\247w0\\\\366\\\\217C\\\\371\\\\247\\\\321\\\\374\\\\370\\\\201\\\\207g\\\\336\\\\343\\\\036\\\\357\\\\324g\\\\036=\\\\033\\\\251\\\\367G\\\\220\\\\270'\\\\214\\\\354\\\\277k\\\\210f\\\\330\\\\357r1\\\\263T\\\\311\042\\\\007*<'\\\\331H\\\\222\\\\002W\\\\302Z6P\\\\264\\\\306$M\\\\016X\\\\265@\\\\037>\\\\304\\\\020\\\\302f\\\\267\\\\365\\\\336+\\\\245\\\\317\\\\317\\\\317?\\\\370\\\\350\\\\345\\\\263g\\\\317f\\\\263\\\\243\\\\242(\\\\252\\\\2469\\\\350\\\\201\\\\300\\\\336\\\\313\\\\260i\\\\032Qv\\\\355\\\\373^<\\\\252E\\\\315\\\\021\\\\021\\\\365/\\\\377\\\\305\\\\213\\\\252\\\\332\\\\244\\\\251\\\\232\\\\315\\\\246\\\\247\\\\247G\\\\325n\\\\307\\\\024\\\\307\\\\343Q\\\\327\\\\266J\\\\251\\\\030B\\\\333t\\\\202\\\\350g\\\\251]\\\\256\\\\227M\\\\353\\\\257\\\\256.f\\\\263)\\\\021\\\\365}g\\\\023\\\\213\\\\010MS\\\\177\\\\377\\\\335w\\\\326&\\\\227WONO\\\\317\\\\362\\\\242 \\\\242\\\\266\\\\353c\\\\014\\\\367\\\\267\\\\367\\\\250\\\\360w\\\\277\\\\377\\\\375x2j\\\\332f\\\\261Z\\\\245I\\\\362\\\\3600\\\\337nw\\\\263\\\\351\\\\361\\\\037\\\\376\\\\360%1\\\\336\\\\335\\\\3351\\\\000\\\\003\\\\365\\\\336Uu\\\\235\\\\246\\\\205\\\\265\\\\271s\\\\274Z\\\\357\\\\356\\\\356\\\\026\\\\313\\\\325\\\\232H\\\\307\\\\310>D\\\\357<ER\\\\010\\\\326\\\\350\\\\304\\\\032\\\\253\\\\265\\\\300\\\\220!\\\\006\\\\346\\\\001?\\\\006D\\\\000\\\\0161\\\\242\\\\006\\\\2555\012\\\\275A~\\\\017Z!j\\\\324Z)\\\\203Z)\\\\245Q\\\\266Q\\\\225\\\\262\\\\326\\\\264}\\\\347C\\\\017\\\\210\\\\301\\\\373\\\\246\\\\255(\\\\006\\\\255Ub\\\\255Be\\\\214U\\\\332 \\\\340\\\\240\\\\220\\\\033\\\\243\\\\214\\\\000\\\\0011Db\\\\036\\\\266Pc\\\\214>z\\\\037\\\\003\\\\201\\\\006\\\\245\\\\021Pk+\\\\240r\\\\360A\\\\0159\\\\017x?R\\\\331\\\\247d\\\\2610\\\\217\\\\250\\\\006\\\\355\\\\010D\\\\224Vs_r\\\\240\\\\004\\\\322!2\\\\017\\\\270\\\\333\\\\341\\\\032x\\\\034\\\\205\\\\3575\\\\213\\\\217\\\\212\\\\004|o\\\\224\\\\370\\\\356\\\\236G\\\\371X.5\\\\032.^|7o\\\\217{\\\\314e\\\\370$\\\\215\\\\320\\\\307Q+-9Xj<\\\\311\\\\323\\\\302\\\\312\\\\227\\\\341\\\\261\\\\244\\\\341\\\\275z\\\\033ow[\\\\245Pk-\\\\266\\\\320\\\\305\\\\250\\\\2141\\\\2547+k\\\\223\\\\311drzqqu\\\\375\\\\344\\\\354\\\\364\042Ks\\\\341\\\\354km\\\\304\\\\275\\\\205\\\\210dQ \\\\006R\\\\250d\\\\232#A,\\\\316\\\\250\\\\242g\\\\242'\\\\307\\\\321X5\\\\036\\\\225@\\\\221B4\\\\3060\\\\305\\\\256\\\\353)\\\\2206\\\\312Zk\\\\214\\\\010\\\\375i\\\\357\\\\335z\\\\263\\\\271\\\\272</\\\\312\\\\\\\\)\\\\310\\\\262\\\\244m*\042\\\\332n7\\\\253\\\\325\\\\362\\\\342\\\\342b<\\\\036\\\\347E\\\\256\\\\265\\\\316\\\\212\\\\242\\\\310\\\\013Y\\\\371\\\\014\\\\301\\\\265uut4=;;\\\\375\\\\227\\\\177\\\\376\\\\347?\\\\374\\\\360\\\\303d<9;;\\\\277\\\\274\\\\274\\\\272xr\\\\365\\\\346\\\\346\\\\266\\\\367.\\\\022\\\\265\\\\256\\\\033O\\\\3071R\\\\333\\\\366\\\\250L\\\\210\\\\270\\\\255\\\\352\\\\315\\\\272\\\\331\\\\326\\\\215\\\\367L\\\\004\\\\221\\\\336\\\\375\\\\376d\\\\011H\\\\001\\\\304\\\\030\\\\210b\\\\0101\\\\016\\\\364.\\\\245\\\\224\\\\2222Zi8\\\\310\\\\216\\\\005\\\\357%\\\\243[kQ\\\\031\\\\255\\\\2156F\\\\031\\\\205j@\\\\344\\\\000\\\\311{\\\\037\\\\242\\\\217!\\\\206\\\\320S\\\\360\\\\000\\\\034):\\\\337\\\\215\\\\312\\\\211\\\\326*\\\\261\\\\251\\\\265\\\\203\\\\234\\\\3000+&V\012\\\\025hDFV\\\\314\\\\314\\\\304\\\\201(2\\\\371\\\\030\\\\207\\\\200V\\\\006\\\\225B\\\\324\\\\014D.H\\\\320\\\\020\\\\002\\\\202\\\\032TK\\\\0250\\\\311N\\\\341#\\\\017\\\\265=\\\\266p\\\\310\\\\323\\\\357\\\\327\\\\262\\\\357\\\\201\\\\025\\\\217\\\\356\\\\377#\\\\321\\\\014\\\\202\\\\000\\\\362!|\\\\337\\\\345\\\\332w'\\\\301\\\\243oW\\\\000\\\\200tx\\\\256\\\\003K\\\\005\\\\036\\\\235\\\\027J)\\\\324\\\\373U[D\\\\243\\\\315\\\\243Se\\\\270\\\\252\\\\211Hiu@9\\\\344~c\\\\014\\\\000\\\\013\\\\237Q\\\\364\\\\244\\\\343~48\\\\036\\\\217\\\\363\\\\242\\\\274\\\\270\\\\270\\\\270\\\\270\\\\272\\\\032\\\\217\\\\307\012\\\\265s\\\\216\\\\230\\\\32345\\\\306\\\\312z\\\\201\\\\\\\\\\\\030}\\\\337S\\\\034D\\\\314\\\\004\\\\237\\\\221\\\\313)\\\\204\\\\320u}\\\\327u\\\\372\\\\243W\\\\263\\\\266\\\\251\\\\023mNOO\\\\000\\\\250\\\\357\\\\273\\\\340\\\\343\\\\213\\\\027\\\\037 (\\\\255tQ\\\\224\\\\263\\\\351Q\\\\222\\\\350,K\\\\353\\\\246F\\\\255\\\\316N\\\\317\\\\252\\\\272&\\\\212eY\\\\324u\\\\325u]\\\\010\\\\236\\\\210\\\\257\\\\257\\\\237\\\\036\\\\037\\\\035\\\\217\\\\306\\\\023\\\\357C\\\\333\\\\365\\\\273\\\\355n\\\\265^\\\\207\\\\020v\\\\333\\\\215\\\\217\\\\376\\\\363\\\\317?\\\\2738\\\\277\\\\\\\\-\\\\227\\\\307\\\\307\\\\307]\\\\357\\\\353\\\\246\\\\035O\\\\246\\\\333\\\\315\\\\356\\\\333\\\\357\\\\276\\\\356\\\\272\\\\266(\\\\362\\\\272\\\\255G\\\\2432/\\\\013fUU\\\\355j\\\\265\\\\331l\\\\253\\\\256\\\\365\\\\214\012\\\\3018\\\\037\\\\224\\\\326\\\\210Zk\\\\231r+\\\\205\\\\300\\\\024(\\\\206H\\\\034c\\\\240\\\\030\\\\201A\\\\031\\\\324ZI\\\\337-\\\\275V\\\\240\\\\330\\\\366]\\\\354\\\\373xP\\\\322P\\\\342h>\\\\004P\\\\340\\\\030\\\\211B\\\\014\\\\241o\\\\231<p\\\\004\\\\362\\\\260\\\\257#c\\\\010\012\\\\0241he\\\\2145J\\\\312h\\\\212\\\\000\\\\020}\\\\004\\\\004\\\\205\\\\032\\\\225b\\\\306\\\\030\\\\002E\\\\022$\\\\302\\\\205@\\\\304\012\\\\325\\\\336\\\\344PE\012\\\\024\\\\206\\\\035A\\\\226\\\\200>\\\\354\\\\2350k`\\\\251\\\\374\\\\025H\\\\253\\\\202\\\\300\\\\274\\\\027\\\\021E\\\\220\\\\315@\\\\226h{G\\\\205\\\\372Qb\\\\376i\\\\021r\\\\010K\\\\305\\\\200@j\\\\330\\\\273\\\\031\\\\250\\\\037\012\\\\007:\\\\036\\\\356\\\\301\\\\271\\\\375\\\\367\\\\263\\\\3546\\\\362\\\\000\\\\241\\\\000\\\\213\\\\333\\\\237\\\\300\\\\317\\\\300\\\\250\\\\360\\\\260V\\\\010\\\\302\\\\035 \\\\222d)\\\\0237\\\\000\\\\010!\\\\310\\\\303\\\\340QYo\\\\255%\\\\212EY8\\\\347\\\\344\\\\031\\\\2641\\\\326\\\\332,\\\\317\\\\257\\\\256\\\\256\\\\2646\\\\223\\\\311$\\\\3112\\\\000\\\\210<X*\\\\246iJ\\\\0141F\\\\233$\\\\332\\\\030i%\\\\2156\\\\302\\\\372\\\\227g\\\\356\\\\373\\\\276\\\\256\\\\333\\\\276w\\\\262\\\\177\\\\240?\\\\372hj\\\\264\\\\312\\\\323$M\\\\323f\\\\267K\\\\255\\\\315\\\\323\\\\354\\\\371\\\\263gy\\\\236I\\\\335S\\\\024\\\\005\\\\000\\\\347E\\\\001\\\\000\\\\227\\\\347\\\\227\\\\363\\\\305\\\\342\\\\376\\\\376\\\\316\\\\032]\\\\226\\\\205s=q89=\\\\231\\\\035MONO\\\\224Q\\\\336\\\\373\\\\246\\\\357\\\\265\\\\3261\\\\362r\\\\265\\\\254\\\\353\\\\212\\\\230../\\\\274\\\\017\\\\333\\\\365Vk\\\\375\\\\360\\\\360\\\\340\\\\273\\\\356\\\\352\\\\362\\\\342\\\\374\\\\354\\\\324\\\\032\\\\335v]\\\\222$\\\\345hd\\\\223D)\\\\245M\\\\332\\\\365\\\\274\\\\3344M\\\\353B\\\\204\\\\246\\\\36712\\\\240\\\\212\\\\203\\\\016\\\\206(\\\\177\\\\212K(J\\\\212\\\\365\\\\301E\0121\\\\022*\\\\326\\\\303\\\\312\\\\2470n\\\\242\\\\006\\\\244\\\\020}\\\\337\\\\201s\\\\020\\\\243\\\\220\\\\344\\\\304\\\\177\\\\204\\\\231b\\\\014!\\\\272\\\\340\\\\035\\\\273\\\\026\\\\274\\\\003 \\\\010\\\\001\\\\230\\\\301\\\\210\\\\207L\\\\000\\\\004k\\\\315nS\\\\305@Jk\\\\253\\\\215RH\\\\024\\\\244j\\\\017\\\\301#\\\\210\\\\022\\\\214\\\\030{F\\\\212A\\\\226\\\\253\\\\234s\\\\024\\\\011\\\\304\\\\217\\\\020d\\\\271]\\\\346\\\\027\\\\357\\\\346\\\\207\\\\022\\\\201\\\\010\\\\240\\\\207E\\\\025u\\\\330\\\\354\\\\222\\\\032]\\\\022\\\\033\\\\354\\\\205\\\\236HF\\\\0362xAT\\\\200J+\\\\265\\\\347\\\\222\\\\022\\\\363\\\\341\\\\357\\\\362U06\\\\245X1<\\\\206\\\\306\\\\037g\\\\356?VCK\\\\212fd \\\\004\\\\005\\\\310\012\\\\367c)d\\\\351\\\\017\\\\025h\\\\224\\\\327\\\\036\\\\312\\\\031)\\\\232ezrXZi\\\\273N\\\\342;FO\\\\304\\\\000\\\\244\\\\265\\\\011\\\\301\\\\357\\\\252\\\\035\042\\\\224e\\\\031\\\\201\\\\363\\\\274\\\\270\\\\274\\\\274\\\\314\\\\362\\\\034Q[k\\\\2252.\\\\370\\\\340I\\\\234\\\\006\\\\210\\\\310\\\\373(v\\\\007\\\\2625\\\\203\\\\303\\\\350\\\\021D\\\\267@|8\\\\345\\\\304V\012\\\\373\\\\336\\\\355v\\\\033\\\\375\\\\352\\\\305\\\\270\\\\255\\\\352,I\\\\200\\\\350x:\\\\235M'\\\\010\\\\224\\\\347b\\\\010\\\\036\\\\325 \\\\017,{H\\\\352\\\\355\\\\333;\\\\203\\\\372\\\\374\\\\3644Il\\\\333\\\\324\\\\247g\\\\247GGGY\\\\221\\\\326]\\\\035)\\\\032k6\\\\273M\\\\240\\\\270\\\\331l\\\\377\\\\351\\\\313og\\\\3231\\\\001{\\\\342\\\\336\\\\323|\\\\276<>>\\\\212>\\\\034M\\\\306\\\\177\\\\362\\\\253\\\\317}\\\\327\\\\271\\\\272\\\\266V_]\\\\\\\\z\\\\347\\\\317/\\\\316\\\\255I\\\\313\\\\361\\\\270w\\\\324\\\\305d\\\\275\\\\353V\\\\333\\\\312\\\\023\\\\332$%@b\\\\326\\\\211\\\\011\\\\024\\\\030\\\\201\\\\004\\\\201S\\\\250P\\\\205\\\\030\\\\275\\\\017\\\\314D\\\\024d\\\\007Z\\\\272\\\\020&R(\\\\224g\\\\025\\\\202\\\\017}/\\\\344$\\\\210\\\\021\\\\265a\\\\306\\\\020#p\\\\324\012\\\\024\\\\004\\\\216\\\\036\\\\205W\\\\351\\\\203\\\\230cB$\\\\210Q\\\\266\\\\211\\\\203\\\\017Z\\\\333\\\\266k\\\\253\\\\252ffk\\\\005kc\\\\305D!\\\\030\\\\255\\\\215F\\\\004\\\\346@,\\\\022\\\\321LHd\\\\024*\\\\206\\\\340:\\\\000\\\\266V1P\\\\360\\\\016\\\\221\\\\003G\\\\002B\\\\004\\\\203\\\\250\\\\0001F\\\\362\\\\036\\\\006$F\\\\355\\\\341\\\\204A\\\\003\\\\225\\\\220#Gb\\\\212\\\\034\\\\017k\\\\350\\\\210\\\\250\\\\225\\\\031\\\\364C\\\\210\\\\245\\\\224VC\\\\265@ \\\\245\\\\017021\\\\260b\\\\036\\\\312`$T0H\\\\253\\\\342~P:\\\\324\\\\037\012A\\\\001\\\\343\\\\360GP\\\\030\\\\224l.\\\\257\\\\203\\\\200$F-\012A+\\\\004\\\\004\\\\210\\\\221cd\\\\242\\\\375\\\\301!K7B\\\\330Bf\\\\002dk\\\\015\\\\305 \\\\352hZk\\\\245Q\\\\272\\\\035c-!2\\\\342\\\\351\\\\351)\\\\202\\\\316\\\\313\\\\322\\\\332\\\\004QO\\\\216\\\\216\\\\332\\\\316%6-\\\\212Q\\\\333u!\\\\304$I\\\\211(A\\\\215L\\\\2129\\\\364= 0E\\\\255\\\\220\\\\211\\\\225\\\\302\\\\262,D\\\\326#\\\\304`\\\\255\\\\241\\\\030\\\\313Q\\\\241\\\\177\\\\361\\\\351\\\\331\\\\371\\\\331\\\\231\\\\326\\\\272,\\\\213\\\\311h4*\\\\213\\\\223\\\\343\\\\343\\\\315z\\\\035\\\\203\\\\337U\\\\273\\\\311tzww\\\\347|`\\\\346\\\\310\\\\330\\\\265\\\\255V\\\\332(M\\\\304\\\\247g\\\\247\\\\301\\\\373>\\\\364\\\\336\\\\273\\\\363\\\\313\\\\363\\\\325f\\\\335\\\\264M\\\\236\\\\217\\\\3224\\\\335nw\\\\333m\\\\265\\\\\\\\vM\\\\023~\\\\366\\\\331\\\\317\\\\232\\\\246?;9\\\\356\\\\332\\\\376\\\\343\\\\227/)\\\\204\\\\246\\\\252\\\\232]\\\\365\\\\373\\\\337\\\\377~\\\\271Xn\\\\267\\\\325\\\\266\\\\252\\\\265N\\\\211\\\\200\\\\001w\\\\255\\\\177{\\\\267\\\\336\\\\324\\\\275\\\\013\\\\204Z\\\\003*\\\\037\\\\203\\\\217\\\\3410\\\\243\\\\222_\\\\203\\\\222Y\\\\011@\\\\244\\\\010DD\\\\221\\\\007\\\\020\\\\352]\\\\365)\\\\366Z\\\\321\\\\373\\\\340=P\\\\024\\\\275-\\\\2555(\\\\003\\\\210J\\\\201R\\\\214\\\\024\\\\211<K\\\\356g\\\\324J!\\\\250\\\\241\\\\011\\\\033~\\\\375\\\\210`\\\\214N\\\\201\\\\251\\\\251k\\\\004.\\\\213\\\\002\\\\2016\\\\353\\\\265\\\\321\\\\232\\\\231\\\\024j\\\\243\\\\015\\\\210\\\\301}$`F\\\\305\\\\003\\\\224(!.\\\\031\\\\023%\\\\316\\\\020\\\\210\\\\345\\\\374\\\\2268\\\\002&dd<\\\\234\\\\371\\\\217xTr\\\\304?.\\\\210\\\\021\\\\001Q\\\\357\\\\001=\\\\265?\\\\361\\\\001D\\\\377k\\\\017\\\\256\\\\31310|\\\\017\\\\241\\\\342C\\\\016\\\\376ce\\\\311{i\\\\233p\\\\377Fp\\\\177\\\\202 \\\\014]\\\\306P\\\\353\\\\014\\\\351Z\\\\032l\\\\255\\\\324\\\\273\\\\205\\\\362}uq\\\\270\\\\201|\\\\254\\\\210\\\\373\\\\245cf\\\\204\\\\326\\\\271<\\\\317\\\\217\\\\216\\\\216NNN\\\\264\\\\265\\\\223\\\\311d4\\\\232\\\\214F\\\\243\\\\345jS\\\\226e\\\\214\\\\334u]Q\\\\226I\\\\222\\\\304@\\\\243\\\\242\\\\210>x\\\\3273Q\\\\214Q\\\\241r]\\\\317\\\\221(\\\\206\\\\254(d\\\\005}\\\\261X\\\\224E\\\\261\\\\331n\\\\255\\\\326\\\\304\\\\244\\\\377\\\\355\\\\377\\\\360g\\\\323\\\\331lT\\\\214\\\\246\\\\323Y\\\\3334\\\\017\\\\017\\\\363\\\\020B]\\\\3276M\\\\333\\\\266U\\\\332,\\\\227KD\\\\270\\\\2708\\\\3671\\\\264u+X\\\\225\\\\310\\\\201#b1\\\\032\\\\013S\\\\024@m\\\\267\\\\333\\\\321h\\\\262^\\\\357\\\\276\\\\377\\\\35653O\\\\247\\\\345\\\\347\\\\277\\\\374\\\\224Yi\\\\2438\\\\304\\\\377\\\\372O\\\\377\\\\364\\\\376\\\\356\\\\356\\\\344\\\\350\\\\244\\\\357\\\\272\\\\242,\\\\317\\\\316.\\\\363b\\\\314\\\\312D\\\\306\\\\252n\\\\253\\\\316\\\\255\\\\267\\\\315|\\\\271[Wm\\\\210,\\\\355\\\\235\\\\314K\\\\016M\\\\314\\\\201,\\\\246\\\\366\\\\252mD\\\\221c$\\\\212 \\\\214\\\\213}\\\\247\\\\2028\\\\310\\\\310\\\\206\\\\340\\\\243\\\\367\\\\003W\\\\003\\\\021\\\\225f\\\\324\\\\200(8\\\\036P\\\\014\\\\321s$f\\\\326\\\\312\\\\310\\\\363\\\\313\\\\221\\\\017\\\\342d\\\\005\\\\212\\\\010\\\\2142L1\\\\220\\\\347\\\\020\\\\313\042O\\\\323\\\\204\\\\001(\\\\222\\\\017\\\\201\\\\230\\\\2256\\\\210:F\\\\002@e\\\\014 \\\\313zK\\\\214\\\\344c$&%\\\\251N\\\\350\\\\253L{\\\\006\\\\263T\\\\253\\\\212\\\\206\\\\345)f\\\\034\\\\212\\\\327}t\\\\014p\\\\204\\\\024\\\\321CfE\\\\331\\\\353\\\\336\\\\377\\\\375\\\\035dA\\\\217\\\\376\\\\376\\\\210Z\\\\375n\\\\263\\\\353\\\\237\\\\011\\\\350A\\\\021{\\\\337h\\\\016\\\\244\\\\277}\\\\265-\\\\227\\\\0152H\\\\375\\\\275\\\\277\\\\015VI\\\\303\\\\357H\\\\352\\\\240\\\\307 #\\\\263\\\\320N\\\\001\\\\020\\\\025\\\\021\\\\373\\\\030\\\\203\\\\200A\\\\200E9\\\\236\\\\035\\\\035\\\\237\\\\234\\\\236\\\\035\\\\035\\\\035\\\\247i\\\\236\\\\246Y\\\\353\\\\372\\\\365vc\\\\214-\\\\313\\\\222\\\\021C\\\\014F[\\\\000\\\\261\\\\257\\\\215\\\\256\\\\357\\\\333\\\\256\\\\025n\\\\237\\\\265\\\\211\\\\367A)\\\\255\\\\224\\\\356\\\\232\\\\326(\\\\335T\\\\365\\\\371\\\\331Y\\\\360\\\\276,\\\\313\\\\355j\\\\035bTi\\\\232\\\\257\\\\327kk\\\\323\\\\030\\\\343f\\\\275\\\\333\\\\355v\\\\363\\\\371\\\\\\\\\\\\344\\\\311\\\\3046\\\\353\\\\364\\\\364Td7\\\\230#\042\\\\037\\\\037\\\\037\\\\277~}s{{{w{\\\\257\\\\224\\\\272\\\\275\\\\275\\\\025h\\\\231\\\\231\\\\235\\\\013\\\\306\\\\030\\\\271n\\\\210@$+\\\\235\\\\353\\\\242w\\\\177\\\\362\\\\253\\\\3177\\\\233\\\\325\\\\371\\\\371y\\\\232\\\\246\\\\377\\\\370\\\\273/Q%\\\\221\\\\224\\\\262i1:\\\\272x\\\\362\\\\201I\\\\307\\\\021\\\\354\\\\266q\\\\233]\\\\013\\\\254\\\\006Rl\\\\214\\\\342\\\\036\\\\362G[\\\\037A\\\\033\\\\006\\\\004\\\\355\\\\321\\\\026\\\\364\\\\343\\\\317t\\\\270_V\\\\254\\\\001\\\\000\\\\010\\\\2208\\\\372!\\\\177\\\\320\\\\341\\\\001\\\\014\\\\203\\\\242\\\\341#yOf\\\\340!\\\\034|t\\\\254@!v\\\\336\\\\335\\\\336\\\\337\\\\255\\\\267\\\\233\\\\274,X\\\\241\\\\247\\\\330y\\\\327\\\\207>0\\\\0212+\\\\326\\\\006\\\\215\\\\321\\\\326\\\\350\\\\304\\\\350$1\\\\231\\\\321\\\\026\\\\021c\\\\200\\\\3405\\\\200\\\\001VL\\\\260\\\\247JG\\\\004P\\\\014\\\\212\\\\207\\\\323\\\\376\\\\321\\\\355\\\\220\\\\341~\\\\364wq\\\\275`\\\\216\\\\357\\\\362)\\\\362;\\\\000\\\\020\\\\351\\\\275\\\\257\\\\370S*\\\\310\\\\377\\\\317M\\\\361?\\\\373_?mC\\\\371\\\\237\\\\271\\\\301;e\\\\005`\\\\346\\\\270\\\\247=\\\\031c\\\\222<;9;\\\\275\\\\272\\\\272\\\\272\\\\270\\\\270\\\\220\\\\311]`\\\\032\\\\215FW\\\\227\\\\327\\\\306\\\\230\\\\365z\\\\315\\\\314EQ\\\\210\\\\214]\\\\236\\\\347]\\\\357\\\\322\042\\\\027\\\\347\\\\322C\\\\272\\\\361\\\\3367M\\\\223\\\\347\\\\271H\\\\343\\\\255\\\\327k\\\\215\\\\252\\\\333\\\\325y\\\\232\\\\031F\\\\375\\\\213\\\\317\\\\256wU\\\\025<\\\\265][\\\\325\\\\255\\\\322\\\\332&\\\\251\\\\363a\\\\267\\\\253\\\\262,\\\\357\\\\235\\\\273\\\\274\\\\2744\\\\211\\\\266ib\\\\214N\\\\223l1_\\\\002\\\\303d:\\\\376\\\\376\\\\373\\\\357\\\\233\\\\2466\\\\211=::r\\\\336\\\\023s\\\\2144\\\\231L\\\\353\\\\272M\\\\3234\\\\2048;\\\\232\\\\316\\\\357\\\\347\\\\347\\\\347\\\\247\\\\313\\\\207\\\\2074MV\\\\313\\\\225F\\\\265\\\\333\\\\325\\\\343\\\\321\\\\364\\\\356\\\\356\\\\201P\\\\023XB\\\\213:\\\\271\\\\235oZGM\\\\037Y\\\\251@\\\\014\\\\3001\\\\006\\\\357\\\\235\\\\020\\\\301\\\\344\\\\2372\\\\027{\\\\234\\\\231\\\\204\\\\217\\\\005D\\\\314\\\\203\\\\324,\\\\356\\\\177fD\\\\004&D\\\\014\\\\336\\\\223\\\\037\\\\274Q\\\\020X)\\\\315\\\\201A\\\\241V\\\\21292Eb\\\\321\\\\330E\\\\301\\\\242$\\\\361\\\\357\\\\235(\\\\000\\\\000\\\\214I\\\\200\\\\001\\\\025j\\\\243\\\\202\\\\017uW\\\\365\\\\316\\\\311\\\\306\\\\224\\\\363\\\\236\\\\031\\\\2141J\\\\233(g\\\\011\\\\220\\\\321\0120\\\\362\\\\201\\\\323\\\\007L\\\\221(x\\\\2434\\\\000\\\\222|'\\\\016\\\\\\\\\\\\022\\\\306\\\\241\\\\026y\\\\367GH\\\\334\\\\370\\\\376e,%\\\\300^yCH\\\\247C\\\\366E\\\\202awF$\\\\365\\\\340\\\\360\\\\365\\\\361g\\\\265\\\\237\\\\010\\\\302\\\\243D\\\\276\\\\037E\\\\342^iI\\\\356\\\\031^f_\\\\266\\\\355?u\\\\031\\\\261)\\\\030\\\\264Xy\\\\377\\\\365\\\\261\\\\252%\\\\240V\\\\250y\\\\237\\\\304\\\\031\\\\221\\\\230#\\\\2036\\\\266\\\\034\\\\215O\\\\317\\\\316\\\\317\\\\316/\\\\256\\\\257\\\\237\\\\261R\\\\235s\\\\200\\\\352\\\\342\\\\342\\\\311lv\\\\344\\\\234\\\\277\\\\237/F\\\\343I\\\\210dMbm24|\\\\304\\\\256\\\\357\\\\264R\\\\240\\\\224QZ\\\\024\\\\207\\\\021Q\\\\243\\\\352\\\\273\\\\336h]W\\\\265w\\\\316;\\\\257\\\\000\\\\274s1\\\\204\\\\266i\\\\364\\\\317>9\\\\2636\\\\331l7\\\\223\\\\321$\\\\306\\\\370p\\\\3770\\\\032\\\\215\\\\333\\\\266y\\\\362\\\\344\\\\311h2\\\\266\\\\326\\\\246Y\\\\226\\\\217\\\\212\\\\333\\\\333[\042\\\\272\\\\237?\\\\214\\\\212Q\\\\210\\\\341\\\\344\\\\344\\\\370\\\\374\\\\362\\\\334\\\\246i^di\\\\232\\\\235\\\\235\\\\237\\\\373\\\\340\\\\363,\\\\263&\\\\025\\\\235\\\\221\\\\030\\\\303\\\\253W\\\\257\\\\312Q~{{\\\\2535\\\\006\\\\347mb\\\\266\\\\233\\\\315/>\\\\377\\\\325\\\\177\\\\370\\\\217\\\\377q4\\\\236\\\\345\\\\243\\\\031\\\\352\\\\244\\\\351\\\\302r[\\\\375\\\\360\\\\366n\\\\323t\\\\275'e\\\\222\\\\340\\\\335\\\\001o>\\\\024\\\\036\\\\002\\\\011=\\\\356\\\\312\\\\005\\\\357\\\\014\\\\301\\\\035\\\\226C\\\\344\\\\223\\\\177\\\\007\\\\331\\\\002\\\\003@\\\\010\\\\236\\\\235\\\\033\012@`\\\\024\\\\307\\\\\\\\3\\\\340\\\\025\\\\024\\\\375\\\\201\\\\322\\\\271G\\\\261\\\\225\\\\344n\\\\311A\\\\000\\\\240\\\\224\\\\225\\\\335\\\\332\\\\020=\\\\003)T!\\\\206\\\\355n\\\\327t]\\\\337u!\\\\222\\\\234\\\\276\\\\240\\\\215V\\\\032\\\\020\\\\000#p\\\\004\\\\000\\\\245\\\\224QZ3\\\\2008\\\\363*\\\\015\\\\302\\\\315\\\\000\\\\331\\\\011C\\\\032Z4\\\\251\\\\325\\\\325~\\\\273\\\\\\\\\\\\370t\\\\361\\\\300\\\\306~?M\\\\016\\\\371\\\\370\\\\321Q\\\\024\\\\231\\\\2019\\\\356k\\\\357\\\\203\\\\2749\\\\034F0\\\\360\\\\307K\\\\216G\\\\001\\\\375\\\\350\\\\036\\\\206w\\\\217W\\\\217G\\\\342\\\\203d\\\\302\\\\0006\\\\377\\\\344i\\\\006\\\\223h\\\\251\\\\270\\\\031!R\\\\014D\\\\014 \\\\352\\\\217'g\\\\247\\\\027\\\\227\\\\027\\\\247\\\\027\\\\347\\\\353\\\\355\\\\266,\\\\313\\\\243\\\\243#\\\\243\\\\023\\\\357\\\\375|>\\\\357\\\\234\\\\227)c\\\\226e\\\\242\\\\220$\\\\022MU]\\\\027y\\\\346:'\\\\313\\\\362\\\\262\\\\226\042\\\\037\\\\227\\\\010\\\\271D\\\\357\\\\353\\\\252\\\\032\\\\027e\\\\265\\\\253\\\\212\\\\274\\\\330,W\\\\233\\\\325Z\\\\177\\\\360\\\\341\\\\2616\\\\266i\\\\273\\\\311d\\\\002\\\\210\\\\273m5\\\\235\\\\035\\\\245i\\\\332\\\\264]\\\\333v!z\\\\037\\\\302h2\\\\362\\\\336\\\\027\\\\243\\\\302hM1\\\\344y\\\\376\\\\364\\\\351u\\\\357\\\\272\\\\310\\\\361\\\\370dV\\\\024E\\\\357\\\\373\\\\272\\\\251\\\\214\\\\265!\\\\270\\\\030\\\\203\\\\353;\\\\201\\\\032\\\\274\\\\353W\\\\313\\\\371xT\\\\316\\\\246\\\\323\\\\227/_\\\\256\\\\267[\\\\347=\\\\203\\\\276_\\\\254\\\\036\\\\026\\\\353\\\\252\\\\355\\\\267u\\\\273m:G\\\\010\\\\306FB!iJ\\\\253}\\\\260b8T\\\\035\\\\217O=f\\\\016!x\\\\3574\\\\016\\\\314\\\\037\\\\251\\\\233\\\\245\\\\0269\\\\374\\\\036\\\\274w\\\\020\\\\002\\\\240\\\\374B\\\\030P1je\\\\264V@\\\\3549\\\\204}\\\\365\\\\011bK)[UQ\\\\262\\\\020\\\\002 J\\\\257 $3\\\\245\\\\225\\\\265\\\\011#;\\\\037:\\\\201\\\\373}h\\\\373\\\\316\\\\307\\\\370\\\\377\\\\265\\\\366\\\\246M\\\\316$G\\\\232\\\\230\\\\273GD^8\012\\\\205\\\\252z\\\\217\\\\276f\\\\232M69\\\\324\\\\314\\\\254fl\\\\315\\\\2445\\\\223I\\\\372 }\\\\225~\\\\273\\\\366\\\\020wH\\\\016\\\\331\\\\354~\\\\357\\\\272p\\\\346\\\\021\\\\207\\\\273>xd\\\\002Uos\\\\245\\\\225mZ\\\\031\\\\014\\\\005$\\\\022\\\\211\\\\010\\\\017\\\\017?\\\\036\\\\177\\\\034\\\\015\\\\032c\\\\321\\\\200$\\\\317\\\\302\\\\010b\\\\214\\\\261H\\\\310\\\\000\\\\300\\\\226H\042\\\\347^>\\\\010\\\\214#\\\\230MMU\\\\234tmV\\\\342\\\\200lt\\\\005\\\\236\\\\375i\\\\330\\\\030\\\\362\\\\371\042\\\\271jW\\\\205\\\\376\\\\224\\\\377\\\\033\\\\345\\\\214\\\\317\\\\031\\\\236\\\\306\\\\004\\\\312\\\\271\\\\014f=}\\\\022\\\\350\\\\314\\\\205w\\\\252\\\\3129\\\\227\\\\370\\\\254ts\\\\216S\\\\306\\\\334e\\\\206\\\\270p\\\\376?[?\\\\254$>\\\\3266M\\\\263Z_^\\\\337\\\\274\\\\\\\\]]\\\\315\\\\026\\\\013\\\\347\\\\212Y\\\\263 cCL\\\\307\\\\266wE\\\\301\042\\\\313\\\\345\\\\362\\\\305\\\\213\\\\027?\\\\375\\\\370\\\\006\\\\0015\\\\022gm\\\\241\\\\227n\\\\232\\\\332\\\\220\\\\266W\\\\000\\\\305\\\\323u]\\\\327\\\\265\\\\335q\\\\277\\\\277\\\\\\\\\\\\255\\\\272c\\\\353,}\\\\374\\\\360\\\\336\\\\020>>>\\\\240\\\\360\\\\307\\\\017\\\\357\\\\315?\\\\375\\\\367\\\\337*\\\\256o\\\\267\\\\337\\\\033\\\\242\\\\353\\\\233\\\\033Bj\\\\333N\\\\004\\\\312\\\\272,\\\\312*\\\\001o\\\\267\\\\233a\\\\030\\\\216\\\\355\\\\261(\\\\2341\\\\364\\\\370p\\\\267X\\\\315\\\\377\\\\362\\\\227?\\\\037\\\\333\\\\303\\\\307O\\\\037\\\\\\\\\\\\355\\\\312\\\\322\\\\035\\\\217\\\\307\\\\276\\\\3577\\\\333m3\\\\253\\\\253\\\\262\\\\272\\\\\\\\_<<\\\\336?n\\\\356o^\\\\\\\\i\\\\355\\\\332\\\\335\\\\335\\\\375v\\\\2737\\\\326\\\\275x\\\\361\\\\372o\\\\177\\\\361\\\\335\\\\355\\\\375\\\\306\\\\224u7\\\\204\\\\315\\\\241\\\\325\\\\246\\\\221\\\\201\\\\031\\\\004\\\\255\\\\306}N\042\\\\033$'\\\\231\\\\236DRUCs\\\\014\\\\206\\\\220\\\\205\\\\247\\\\211y\042\\\\375 \\\\034\\\\274\\\\244\\\\224G[54\\\\032\\\\343,\\\\0210\\\\307,\\\\320\\\\252o\\\\204\\\\254\\\\265\\\\306X\\\\320\\\\227\\\\204Aq\\\\233\042\\\\000h\\\\010\\\\255\\\\265\\\\202\\\\022B`ak\\\\215\\\\261\\\\006\\\\014\\\\015>\\\\014\\\\276\\\\357;-,\\\\260\\\\211\\\\023\012#0e\\\\370\\\\010\\\\200\\\\010\\\\001:czM\\\\004d\\\\015\\\\315\\\\243\\\\377\\\\207Z\\\\326\\\\247\\\\337\\\\2448QR\\\\3770\\\\233\\\\007O\\\\374\\\\207\\\\261\\\\031\\\\027\\\\234\\\\0111L\\\\0032\\\\2112LZ<\\\\233\042\\\\247\\\\235\\\\355\\\\211R\\\\035\\\\257z\\\\366/\\\\234k\\\\364\\\\317\\\\237\\\\214\\\\217'\\\\327\\\\034\\\\221\\\\362v\\\\206\\\\000#\\\\277o\\\\022)\\\\253\\\\252\\\\231\\\\317\\\\326W\\\\353\\\\227/_\\\\257o\\\\256\\\\347\\\\363\\\\271\\\\210\\\\014\\\\303P\\\\325JkXh\\\\177\\\\330\\\\256\\\\353\\\\016\\\\207\\\\203v\\\\376U@\\\\010\042n6[\\\\005\\\\201\\\\334\\\\335\\\\335\\\\022A\\\\327u)\\\\306\\\\224RQ\\\\024\\\\300\\\\242\\\\015]\\\\252\\\\242\\\\264\\\\006c\\\\010\\\\205\\\\261\\\\333\\\\307\\\\215\\\\304\\\\364\\\\323\\\\217?\\\\376\\\\353\\\\037\\\\376h\\\\376\\\\217\\\\377\\\\363\\\\177\\\\0111j9]\\\\333vEY\\\\275}\\\\363\\\\326\\\\207P\\\\347\\\\3345\\\\207\\\\030>~\\\\374\\\\320\\\\373\\\\341\\\\352\\\\352JD8F\\\\255\\\\350_\\\\257/g\\\\213\\\\331\\\\362b\\\\031b\\\\010!\\\\334=\\\\334-\\\\0263\\\\337\\\\367~\\\\350\\\\277\\\\370\\\\342\\\\013k\\\\251;\\\\354\\\\352\\\\252t\\\\306\\\\366]\\\\267\\\\272\\\\274z\\\\334<v]\\\\0004o?|2\\\\256\\\\336\\\\354\\\\333!\\\\244\\\\310 DI!\\\\364\\\\004\\\\204 )\\\\201\\\\234\\\\263c!\042*\012\\\\361\\\\\\\\C\\\\347\\\\352 \\\\302\\\\030\\\\274\\\\24634l7\\\\271\\\\016\\\\205\\\\263)%NQ\\\\324.\\\\225\\\\204\\\\210\\\\002h\\\\214\\\\263\\\\316J\\\\2141\\\\014\\\\332\\\\035\\\\005\\\\024\\\\353\\\\211\\\\006\\\\0002%\\\\262\012\\\\264Z\\\\322Hp\\\\002\\\\001g\\\\003C\\\\353\\\\003\\\\000\\\\311X\\\\003\\\\0021q\\\\333u\\\\307\\\\356\\\\330w\\\\307\\\\371b\\\\256\\\\0115\\\\0044d\\\\010\\\\215\\\\372\\\\256\\\\306\\\\031\\\\001\\\\2150\012 2\\\\210\\\\240\\\\020\\\\212A\\\\344\\\\024\\\\201\\\\305Z$$NIxD\\\\010\\\\216V\\\\304\\\\364'\\\\332\\\\270\\\\015Nz\\\\024\\\\262\\\\261!\\\\232\\\\305\\\\237\\\\342\\\\311g\\\\322\\\\305\\\\250\042\\\\370D\\\\213\\\\313t\\\\311\\\\234\\\\214\\\\037\\\\337$\\\\243\\\\335\\\\0022U\\\\232\\\\356\\\\217*\\\\277*\\\\310,\\\\242\\\\325\\\\354\\\\200\\\\204dbJ\\\\014blN\\\\200\\\\013HU6\\\\315|\\\\376\\\\375\\\\367\\\\277\\\\276X\\\\255nn^\\\\254\\\\326\\\\327\\\\032\\\\352.\\\\253\\\\272,+\\\\355\\\\027\\\\363\\\\356\\\\335\\\\273\\\\353\\\\353\\\\353\\\\355v\\\\253\\\\320P\\\\304\\\\014\\\\222A\\\\304\\\\276\\\\357K\\\\347\\\\026\\\\363Y\\\\337u\\\\010\\\\030\\\\275\\\\2375M\\\\327uM\\\\323\\\\034\\\\366\\\\333\\\\241m\\\\273\\\\256=\\\\356\\\\367\\\\233\\\\307\\\\207\\\\375~?\\\\264\\\\335\\\\361\\\\260\\\\333l\\\\036\\\\337\\\\376\\\\370\\\\343\\\\307\\\\017\\\\357e\\\\350\\\\315\\\\337~\\\\267N\\\\302\\\\377\\\\362\\\\373\\\\337\\\\013\\\\363\\\\376p\\\\330m\\\\267\\\\316\\\\332O\\\\237>}\\\\370\\\\360A\\\\253l\\\\232\\\\246\\\\231/\\\\0271\\\\206\\\\020\\\\242\\\\265V\\\\200\\\\207\\\\256+\\\\313\\\\242\\\\250\\\\313n\\\\350b\\\\014!\\\\205\\\\273\\\\373[cm\\\\337wuU]\\\\\\\\,\\\\313\\\\242(\\\\313RRz\\\\375\\\\372\\\\213\\\\340#\\\\331\\\\262,\\\\253\\\\375\\\\241\\\\215\\\\014e=\\\\357{\\\\356}\\\\352\\\\206\\\\030\\\\223\\\\004\\\\221\\\\250\\\\221\\\\206\\\\254\\\\217D8>\\\\3319\\\\247\\\\270\\\\362\\\\231\\\\015}\012bp\\\\312\\\\225\\\\2479\\\\370tRE\\\\306\\\\0203\\\\247\\\\030\\\\204\\\\203^\\\\035\\\\325\\\\267!K\\\\326\\\\000s\\\\342\\\\000\\\\300\\\\220\\\\315e\\\\223\\\\275 4y\\\\247F\\\\034\\\\255\\\\221s\\\\0056\\\\006c\\\\307\\\\3440H\\\\356\\\\230\\\\305\\\\212aMq\\\\277\\\\337\\\\001`]U\\\\326\\\\331\\\\344\\\\343\\\\320\\\\367\\\\314\\\\342\\\\234\\\\025\\\\226L\\\\235\\\\231)y\\\\031R\\\\024a\\\\213\\\\204\\\\302\\\\212J\\\\222\\\\224\\\\022'\\\\021\\\\326v\\\\002\\\\237iS\\\\200\\\\223\\\\331\\\\240\\\\307\\\\317\\\\226\\\\264<\\\\327\\\\265\\\\210c\\\\252\\\\361\\\\354\\\\232\\\\370W\\\\364\\\\264\\\\262\\\\241M\\\\352\\\\203G\\\\337b*\\\\034\\\\314K\\\\236t\\\\200\\\\304\\\\025\\\\216\\\\254\\\\0111Z\\\\347\\\\310\\\\230\\\\365\\\\365\\\\365\\\\313\\\\327\\\\257\\\\277\\\\371\\\\346\\\\033\\\\262f\\\\265Z\\\\221-\\\\234sUU9\\\\347\\\\272\\\\276CD\042c\\\\214\\\\271\\\\270\\\\270\\\\010!h\\\\244b\\\\271\\\\\\\\\\\\276\\\\177\\\\377\\\\376\\\\372\\\\372F\\\\231\\\\360-\\\\0315<\\\\372\\\\276\\\\277X\\\\314\\\\225?$\\\\014>%\\\\237|\\\\2101\\\\372~\\\\360Cg\\\\255\\\\013}\\\\267\\\\337m\\\\267\\\\333\\\\307\\\\343\\\\356p8\\\\354\\\\206\\\\256\\\\203\\\\350-Y\\\\274\\\\\\\\\\\\257\\\\342\\\\037\\\\223-\\\\213\\\\355\\\\273\\\\367\\\\3169\\\\321\\\\376\\\\265\\\\256\\\\270y\\\\365\\\\322{\\\\177w\\\\373\\\\260\\\\276\\\\276\\\\274\\\\274\\\\274\\\\262\\\\245\\\\275\\\\\\\\.\\\\233\\\\272\\\\014C\\\\367\\\\227\\\\237\\\\336~\\\\370\\\\363'\\\\006\\\\351\\\\373\\\\336GFDf\\\\237R\\\\252\\\\257k\\\\357\\\\275\\\\357\\\\356\\\\277\\\\372\\\\352\\\\253fV1\\\\263)\\\\312\\\\365bF\\\\350\\\\352\\\\246\\\\013<\\\\260\\\\020P\\\\261\\\\331\\\\036XL\\\\022\\\\342\\\\021a|\\\\312\\\\242\\\\262Z\\\\230\\\\237Oa\\\\256>\\\\302\\\\314&\\\\221R\\\\2120\\\\306\\\\335\\\\220A\\\\025\\\\024\\\\234\\\\205\\\\367\\\\237\\\\011\\\\002\\\\212\\\\340\\\\030\\\\311\\\\022H\\\\360\\\\364[\\\\362G\\\\364\\\\221\\\\020\\\\031\\\\205\\\\010r\\\\217\\\\253'\\\\227R\\\\203}\\\\372\\\\313i;\\\\346\\\\304\\\\314C\\\\354\\\\207>\\\\204\\\\324\\\\367\\\\376ry1\\\\257\\\\033\\\\347lJi\\\\010\\\\036\\\\215!\\\\306\\\\002\\\\320\\\\020F@L\\\\024\\\\230\\\\243\\\\000\\\\246D\\\\010\\\\210\\\\202\\\\300 \\\\211\\\\200\\\\221\\\\320 h+\\\\346\\\\211\\\\253\\\\016N\\\\346\\\\005\\\\376\\\\025Q~\\\\362[\\\\316~\\\\370\\\\350\\\\340\\\\312\\\\364\\\\226\\\\250\\\\340\\\\002\\\\300\\\\024/\\\\234L5\\\\021Ac\\\\030\\\\000\\\\211\\\\224\\\\211\\\\206\\\\231\\\\321\\\\220q\\\\305\\\\271q\\\\242\\\\013]\\\\000\\\\366]\\\\3334M3\\\\237\\\\337\\\\334\\\\334\\\\030\\\\343\\\\226\\\\253\\\\013\\\\347\\\\\\\\YW\\\\213\\\\371\\\\305z\\\\275~\\\\330nRJZ#7t\\\\236\\\\300`\\\\211\\\\336{\\\\024X\\\\255Vm\\\\333\\\\206\\\\301\\\\037\\\\367\\\\007K\\\\346\\\\355\\\\233\\\\2374X,1r\\\\014MU\\\\366 \\\\367\\\\367\\\\367\\\\321\\\\207C\\\\330\\\\226\\\\326\\\\365m\\\\260\\\\326r\0121\\\\014)\\\\205\\\\375f{<\\\\354\\\\366\\\\373}\\\\034zM\042Wu\\\\021\\\\035Y\\\\357\\\\375\\\\357~\\\\367\\\\273\\\\365z\\\\365\\\\273\\\\177\\\\371\\\\3177\\\\353\\\\233\\\\366p\\\\270X\\\\254\\\\306\\\\236\\\\241\\\\215\\\\265\\\\205qv>_\\\\226\\\\245\\\\023\\\\022\\\\000\\\\274\\\\275\\\\275o\\\\367\\\\273\\\\224d6[|\\\\374\\\\364)\\\\245T\\\\317f\\\\267\\\\267\\\\267\\\\213\\\\305\\\\002\\\\000\\\\037\\\\037\\\\266\\\\326Z\\\\002\\\\330n\\\\267\\\\373\\\\335q\\\\010{\\\\201\\\\252\\\\252+\\\\021r\\\\345\\\\034\\\\016\\\\262?\\\\206\\\\304&&d\\\\215\\\\351KFH\\\\222@\\\\346/L\\\\021\\\\236\\\\230k'\\\\033.oj\\\\347\\\\007G\\\\001\\\\306\\\\247\\\\342x\\\\256\\\\310GA\\\\030\\\\355\\\\310\\\\363\\\\267N{\\\\372\\\\317\\\\034\\\\210\\\\212\\\\027:5\\\\377{&2\\\\347!B2\\\\206\\\\210TW\\\\0332\\\\307\\\\276\\\\353\\\\372\\\\241m\\\\333W7/.\\\\026K@\\\\010\\\\034\\\\014\\\\200HR\\\\276\\\\002C\\\\204\\\\002Dh\\\\222\\\\304\\\\224\\\\324\\\\233b\\\\000\\\\004%\\\\000\\\\003\\\\341\\\\010\\\\200\\\\312\\\\275}\\\\362p\\\\177&\\\\317\\\\367\\\\271\\\\034\\\\377\\\\027\042\\\\311\\\\254\\\\327\\\\232\042\\\\304\\\\360TO\\\\213\\\\210\\\\266\\\\3370\\\\222K3\\\\001\\\\300\\\\026n\\\\022k2\\\\306\\\\232\\\\234\\\\251T\\\\230\\\\0339\\\\373j\\\\371\\\\332U\\\\345\\\\254\\\\252\\\\347\\\\027\\\\313\\\\312U\\\\312\\\\244\\\\357\\\\234\\\\353\\\\272N\\\\031x\\\\025\\\\321\\\\241\\\\261dc\\\\014\\\\307t<\\\\036Q\\\\240i\\\\232\\\\335n\\\\247\\\\304\\\\202eY\\\\326u\\\\375\\\\351\\\\375\\\\007\\\\021Q\\\\372\\\\227w\\\\357\\\\336\\\\001\\\\300\\\\345j\\\\271\\\\355;\\\\337\\\\365\\\\325\\\\334\\\\015}+E\\\\341\\\\373\\\\356p8\\\\240\\\\310\\\\273\\\\267?\\\\015C\\\\227|0\\\\226\\\\234q\\\\245)\\\\234\\\\263\042\\\\311~\\\\365\\\\315\\\\227e]t\\\\335\\\\360\\\\345\\\\227_\\\\036w\\\\307\\\\233\\\\227/\\\\357?\\\\335\\\\307$\\\\363\\\\305\\\\305\\\\375\\\\303CQ\\\\024\\\\353\\\\253\\\\025\\\\000\\\\274y\\\\377.\\\\204PX\\\\212~\\\\270\\\\274\\\\2708\\\\036v\\\\273\\\\335\\\\316\\\\225\\\\025@\\\\350\\\\273\\\\370\\\\325\\\\227\\\\177\\\\253\\\\034\\\\013?\\\\375\\\\364\\\\323\\\\325\\\\325U]\\\\224o\\\\337\\\\274\\\\027\\\\301\\\\213\\\\313\\\\353\\\\335\\\\216\\\\017\\\\373ph\\\\373\\\\266\\\\363m\\\\317\\\\207\\\\243\\\\267\\\\256bpc\\\\177\\\\275Ly\\\\301ck\\\\341ga\\\\215\\\\223x}6y\\\\223\\\\032\\\\026IJ\\\\264\\\\212\\\\302\\\\023\\\\320\\\\367\\\\374\\\\004\\\\230\\\\034JD\\\\004F\\\\355\\\\311.2\\\\315\\\\246\\\\210\\\\320i\\\\227\\\\327\\\\257\\\\313\\\\316\\\\227\\\\306~O\\\\374.\04292%\\\\014\\\\000\\\\211\\\\005\\\\000\\\\014j\012\\\\223A0\\\\262\\\\000\\\\032\\\\026:\\\\364\\\\303\\\\273\\\\333\\\\217\\\\373\\\\366x1_\\\\324e\\\\025\\\\242\\\\327Jo\\\\022\\\\013\\\\211\\\\255b,\\\\325k\\\\033\\\\253\\\\270\\\\210\\\\300\\\\0202s\\\\210\\\\211\\\\254\\\\023\\\\004\\\\245I\\\\032e\\\\372t\\\\207\\\\243\\\\346~n`|\\\\376|t.\\\\263L\\\\203\\\\234T>\\\\234)\\\\346s\\\\271\\\\007\042f\\\\261\\\\2053b\\\\227\\\\253\\\\013\\\\315\\\\224!\\\\030W\\\\225MY\\\\221\\\\263D\\\\3269W\\\\327uY\\\\027\\\\256r\\\\014\\\\322T5\\\\020VE\\\\355\\\\275G\\\\264!I;\\\\364\\\\233\\\\375\\\\256r\\\\2251\\\\346xl=\\\\016\\\\006h\\\\273\\\\335\\\\256V+Iq\\\\261\\\\\\\\\\\\276y\\\\363c]\\\\224C{,\\\\327\\\\227\\\\233\\\\315\\\\3369\\\\267\\\\2307\042rw\\\\373\\\\361\\\\342\\\\342\\\\302\\\\0208\\\\347\\\\336\\\\277y\\\\333T5H\\\\342\\\\024|\\\\337\\\\365\\\\255\\\\312\\\\335\\\\016\\\\200\\\\373\\\\276eI\\\\306f\\\\376\\\\017\\\\305~!\\\\201\\\\375\\\\017\\\\377\\\\341\\\\377Rp\\\\234\\\\217\\\\276\\\\017\\\\375\\\\017?\\\\374\\\\320\\\\224s]\\\\202m\\\\333\\\\017C@\\\\304\\\\300\\\\241\\\\355\\\\216\\\\326\\\\332\\\\3560\\\\324Uu\\\\373\\\\351q\\\\261\\\\272\\\\250\\\\353\\\\305n\\\\1774T\\\\366>l\\\\036\\\\367\\\\263f\\\\271\\\\272\\\\230m\\\\036\\\\367\\\\2340%8\\\\034\\\\272\\\\233\\\\233\\\\233\\\\272Z\\\\264mx\\\\330\\\\034\\\\357\\\\037v\\\\2211&Ll8\\\\022\\\\210I\\\\323\\\\\\\\(\\\\011\\\\247\\\\362\\\\260L[\\\\343\\\\371\\\\010\\\\377\\\\025\\\\315\\\\364Lk\\\\236\\\\213\\\\357\\\\370\\\\234\\\\361\\\\251\\\\312\\\\302g\\\\032\\\\372\\\\277\\\\254\\\\362\\\\020U\\\\224\\\\201\\\\237f\\\\362$\\\\327\\\\213O:^\\\\361\\\\223\\\\372\\\\225\042\\\\244@\\\\207\\\\224x\\\\177\\\\354rk\\\\251\\\\331\\\\274(\\\\212\\\\261\\\\2001I\\\\002H\\\\311)\\\\204\\\\324\\\\231\\\\010\\\\310\\\\314\\\\221\\\\323X\\\\307B`2y\\\\207ZY2\\\\356\\\\022\\\\177m(\\\\316F\\\\343\\\\351\\\\230@\\\\302\\\\247}\\\\2612\\\\212\\\\356\\\\334\\\\222\\\\031\\\\253W\\\\246W\\\\224@\\\\253\\\\256kAX\\\\257\\\\327)%Al\\\\232yUUZ\\\\367\\\\212hP\\\\271\\\\242k7x\\\\237\\\\231\\\\210\\\\211\\\\324\\\\030S;{6\\\\233\\\\001\\\\000\\\\021\\\\365}\\\\257\\\\364\\\\273EQ8\\\\262\\\\026\\\\311\\\\0303\\\\014CY\\\\226\\\\312]}{{\\\\013\\\\000\\\\010p\\\\177\\\\177\\\\217\\\\210M\\\\323\\\\314f\\\\263\\\\333\\\\333[\\\\213\\\\024\\\\303\\\\260\\\\033\\\\372\\\\276o\\\\373\\\\366\\\\330\\\\266\\\\255\\\\357\\\\373\\\\335n\\\\323u\\\\235&\\\\255H\\\\362\\\\317\\\\210\\\\321\\\\013$\042\\\\262\\\\306\\\\232\\\\213\\\\027\\\\262\\\\\\\\\\\\2556\\\\017\\\\233\\\\327\\\\257\\\\277\\\\370\\\\313\\\\017\\\\177I\\\\314m7\\\\000a\\\\327\\\\366eY \\\\242\\\\367\\\\003\\\\013\\\\327u\\\\345\\\\234k\\\\017m\\\\341\\\\312\\\\256\\\\037\\\\016\\\\207\\\\366\\\\343\\\\207Oe\\\\331\\\\324\\\\365lw8|\\\\371\\\\345W\\\\273\\\\335\\\\021\\\\3218W\\\\356v\\\\207\\\\024\\\\030\\\\200./\\\\326\\\\233mw8\\\\360\\\\375c\\\\333\\\\266>%\\\\203X \\\\024>\\\\000\\\\013!Z\\\\021D!\\\\021P\\\\366N\\\\005\\\\342\\\\212v\\\\357yz\\\\267\\\\354\\\\346\\\\336\\\\000\\\\000 \\\\000IDAT\\\\300(\\\\326\\\\323v\\\\311\\\\314\\\\312tA\\\\240\\\\312\\\\363\\\\024\\\\250\\\\326Y!\\\\242\\\\224\\\\242\\\\342\\\\325t\\\\302\\\\014\\\\021 *\\\\350\\\\236S\\\\024\\\\216g^?e\\\\225\\\\254\\\\311\\\\034\\\\203\\\\210\\\\230\\\\306%\\\\201\\\\247e\\\\206\\\\323C\\\\266\\\\213\\\\210\\\\000\\\\321Lu\\\\037H\\\\222AG\\\\2425\\\\326\\\\200\\\\344\\\\203?\\\\266G@\\\\211\\\\301sbN1\\\\371\\\\300!\\\\030$g,\\\\030g\\\\234A\\\\220\\\\340\\\\275\\\\367\\\\2369\\\\351z\\\\340\\\\034\\\\207`\\\\300q\\\\345\\\\3456\\\\002\\\\347*v\\\\274\\\\273\\\\223@k\\\\254n\\\\324\\\\026\\\\247\\\\214\\\\243\\\\214\042\\\\215\\\\010#\\\\214\\\\356\\\\354\\\\307\\\\344\\\\021F\\\\210\\\\234\\\\212\\\\252\\\\004\\\\304f6\\\\023\\\\221\\\\325jE\\\\3266MS\\\\226\\\\225+\\\\013\\\\347*\\\\347\012\\\\305\\\\324\\\\247\\\\224\\\\2060\\\\\\\\\\\\335\\\\\\\\\\\\027eq8\\\\036\\\\253\\\\252:\\\\266\\\\355\\\\362\\\\342\\\\302\\\\030\\\\273\\\\272\\\\\\\\\\\\265\\\\307^\\\\004\\\\204e\\\\263\\\\331\\\\324e%,U\\\\331\\\\024\\\\245\\\\363~\\\\210\\\\301?><\\\\254W\\\\227Ji\\\\376\\\\351\\\\343\\\\373\\\\331\\\\254i\\\\367\\\\373\\\\302\\\\331\\\\335v\\\\243\\\\021\\\\014g\\\\215\\\\263\\\\246\\\\353\\\\272\\\\315\\\\343f\\\\350\\\\332\\\\207\\\\373\\\\373\\\\024}{8\\\\370a\\\\320\\\\374\\\\024\\\\262\\\\344V\\\\277\\\\310 \\\\214(\\\\326\\\\032\\\\347\\\\254m\\\\212\\\\352\\\\361\\\\366\\\\316\\\\021\\\\371\\\\266\\\\375\\\\376\\\\227\\\\337u\\\\335\\\\020<\\\\367\\\\275\\\\277\\\\271~m\\\\255}||\\\\354\\\\206\\\\001\\\\203\\\\277{x\\\\214\\\\321\\\\247\\\\020S\\\\244\\\\017\\\\357\\\\336\\\\257V+f\\\\002\\\\021k\\\\355\\\\320\\\\035\\\\357>}\\\\250\\\\312\\\\346\\\\335\\\\273w7\\\\327/\\\\013\\\\327\\\\030cc\\\\362\\\\355@\\\\267\\\\367\\\\355f\\\\307\\\\307.\\\\032[\042\\\\032\\\\001+$>\\\\016\\\\204\\\\266(*\\\\000\\\\001H\\\\232\\\\307\\\\030],\\\\223R\\\\204\\\\237\\\\333\012y\\\\202[\\\\000\\\\240\\\\010JB`\\\\341l\\\\000|\\\\246\\\\250\\\\362\\\\023\\\\036)/\\\\316\\\\265\\\\024d+\\\\005>\\\\377 I\\\\002@\\\\024\\\\003D\\\\026)\\\\242\\\\001\\\\011\\\\360\\\\374T\\\\000\\\\004\\\\210\\\\011\\\\000\\\\224\\\\312N\\\\220@\\\\222L\\\\242\\\\246)\\\\036B\\\\000\\\\211)EI \\\\022\\\\037\\\\2423\\\\266r\\\\205%\\\\003@\\\\004\\\\330\\\\224\\\\000\\\\326$f\\\\004\\\\233R\\\\360Cw8vDT53W\\\\226\\\\244\\\\244o \\\\014\\\\210\\\\220DW\\\\315\\\\377\\\\213\\\\025\\\\015\\\\237\\\\377\\\\264\\\\3636\\\\233\\\\343\\\\202\\\\314d\\\\004\\\\000\\\\000Z\\\\326%S\\\\343\\\\\\\\H1\\\\242.J\\\\2260\\\\344R\\\\021(\\\\212\\\\214<&\\\\247\\\\335\\\\321E\\\\304\\\\373\\\\350\\\\207\\\\370pw\\\\337\\\\314\\\\353\\\\024\\\\370z}3t~1[\\\\276}\\\\373\\\\226cR\\\\270\\\\275E\\\\303\\\\314\\\\363\\\\371\\\\374\\\\375\\\\373\\\\367\\\\217\\\\217[\\\\346h\\\\255\\\\261\\\\216\\\\010\\\\361\\\\335\\\\333\\\\267\\\\263\\\\331\\\\214S*\\\\214\\\\355\\\\016G\\\\357}]UC\\\\337__\\\\2577\\\\233M\\\\212p\\\\330o\\\\303\\\\3409\\\\366\\\\034\\\\323n\\\\3730\\\\237\\\\317\\\\007\\\\337'N\\\\306\\\\030\\\\000\\\\026\\\\322\\\\252Q&$2\\\\242\\\\264lI\\\\030\\\\377\\\\307\\\\177{\\\\371\\\\362\\\\345K\\\\343h6\\\\233m\\\\367{\\\\347\\\\312\\\\256\\\\217\\\\017\\\\233\\\\243\\\\260\\\\335\\\\356Zk\\\\212/\\\\277\\\\376*\\\\304\\\\356p\\\\330&\\\\036\\\\026\\\\263\\\\371~3\\\\334~\\\\270\\\\2355EY\\\\331\\\\020\\\\217\\\\363\\\\246\\\\234\\\\317\\\\233fV\\\\365>\\\\262\\\\230\\\\220(\\\\004\\\\023\042\\\\366\\\\003\\\\356\\\\366\\\\335\\\\346\\\\320\\\\0235It\\\\033Bu;t|Y\\\\005b\\\\324\\\\270\\\\310\042J\\\\312\\\\245Y\\\\356\\\\234&\\\\314\\\\376\\\\007\\\\021\\\\341\\\\210\\\\310Q\\\\337+qL!\\\\246\\\\224 EDMp\\\\215\\\\207!\\\\000\\\\260db\\\\214\\\\034\\\\275\\\\304\\\\010\\\\234\\\\000\\\\321\\\\030c\\\\214A\\\\343B\\\\362\\\\034\\\\242b|\\\\247\\\\010\\\\006\042\\\\002\\\\032DDc\\\\025\\\\\\\\\\\\237RJ\\\\354\\\\015&\\\\221\\\\261\\\\231\\\\304\\\\264\\\\237\\\\237\\\\366\\\\2033W\\\\225'\\\\337\\\\361\\\\304\\\\201\\\\004\\\\243y\\\\2434B\\\\2228q\\\\002\\\\000Brd\\\\254\\\\265\\\\313\\\\313\\\\225\\\\326\\\\212\\\\266m{8\\\\264\\\\203\\\\367\\\\244,\\\\315\\\\266\\\\004c\\\\255+\\\\215+\\\\324\\\\236N\012\\\\222 +\\\\234{\\\\302\\\\346\\\\004\\\\212r\\\\270\\\\343\\\\004\\\\001\\\\2203\\\\222\\\\003\\\\016\\\\234\\\\224\\\\024XM\\\\231\\\\361-dfN\\\\220]h\\\\316LNBHZ1E\\\\210HJ\\\\325\\\\265\\\\230_\\\\224uU\\\\327\\\\263\\\\020\\\\031\\\\321TM\\\\243-\\\\215\\\\211L\\\\344\\\\030%\\\\226\\\\225\\\\213\\\\201SJUU\\\\001\\\\220\\\\367\\\\2760V\\\\353\\\\243\\\\230E[[\\\\000\\\\200\\\\367\\\\276o\\\\273\\\\325\\\\352\\\\002\\\\230\\\\207\\\\241\\\\323\\\\256\\\\024\\\\306\\\\030\\\\341\\\\350\\\\275\\\\017aH!\\\\206\\\\020b\\\\312\\\\315\\\\270\\\\206a\\\\010}\\\\337\\\\037\\\\366\\\\276\\\\037RJu]\\\\027E\\\\321\\\\366]J\\\\251Y4\0422\\\\004\\\\257],\\\\204d\\\\267\\\\335~\\\\3637\\\\177\\\\363\\\\375\\\\367\\\\337\\\\233\\\\177\\\\367\\\\317\\\\277\\\\252\\\\352\\\\246\\\\251Jk\\\\315\\\\325\\\\325\\\\325n\\\\263\\\\003\\\\240\\\\262\\\\250?}\\\\332\\\\264m\\\\010!9W\\\\356v{F\\\\371x\\\\373\\\\341\\\\361qs\\\\330v\\\\034\\\\223!\\\\360\\\\241\\\\273\\\\276\\\\\\\\-\\\\226M\\\\327\\\\037///o^\\\\274\\\\\\\\\\\\257o\\\\232\\\\371:&\\\\363\\\\270\\\\363\\\\017\\\\233\\\\241\\\\035(I\\\\221\\\\200\\\\230)\\\\333\\\\023\\\\240\\\\331Z\\\\305\\\\213)\\\\034\\\\2145\\\\270\\\\301c\\\\260\\\\002\\\\262\\\\251\\\\007\\\\000@4M\\\\200\\\\246\\\\032$S2\\\\203\\\\010\\\\013h\\\\013J\\\\310\042\\\\004\\\\023[\\\\305hy\\\\210\\\\210p\\\\002\\\\355\\\\200F\\\\232BE\\\\3125Z\\\\332\\\\2260G\\\\223s:Fu\\\\257\\\\362\\\\034M(\\\\210\\\\023\\\\321\\\\363\\\\323\\\\343\\\\334\042\\\\022zf\\\\317?\\\\373\\\\210\\\\214\\\\264\\\\344J\\\\364\\\\242\\\\233Q\\\\002\\\\011\\\\234|\\\\350\\\\203\\\\367\\\\303\\\\320w]\\\\333\\\\367\\\\275HR\\\\246\\\\317\\\\3101D\\\\357\\\\007\\\\337u\\\\3350\\\\014\042`\\\\014\\\\221\\\\261\\\\2104\\\\232\\\\0179\\\\315L\\\\223\\\\336\\\\325\\\\005\\\\177\\\\372Vf\\\\231\\\\240\\\\252Y)O\\\\020E\\\\021\\\\020m!\\\\247\\\\230.\\\\024@&\\\\300\\\\024\\\\274\\\\000cn7\\\\312\\\\302\\\\242\\\\225\\\\354\\\\233\\\\307\\\\255\\\\265f1\\\\233\\\\033C\\\\207\\\\375a\\\\263\\\\335F?\\\\020Q\\\\351\\\\2545\\\\316\042\\\\241\\\\246\\\\2408A\\\\224\\\\304\\\\334\\\\035[\\\\026\\\\226\\\\224B\\\\014)\\\\304\\\\230B\\\\364!\\\\004\\\\237B\\\\210~\\\\360\\\\203\\\\217\\\\321\\\\003\\\\003\\\\021\\\\000K\\\\212a\\\\267\\\\335\\\\372\\\\320\\\\207\\\\241\\\\367C\\\\337\\\\267\\\\355a\\\\277\\\\337o\\\\267\\\\373\\\\335\\\\346\\\\260y\\\\000\\\\220\\\\252,\\\\252\\\\262\\\\020\\\\224\\\\276k\\\\023Gg\\\\255\\\\322\\\\205)\\\\036\\\\240\\\\033\\\\272o\\\\177\\\\361\\\\213\\\\277\\\\377\\\\207\\\\277\\\\277y\\\\361\\\\3026\\\\363\\\\245@\\\\272\\\\277\\\\277\\\\357\\\\206\\\\366\\\\365\\\\027_\\\\021\\\\331\\\\343\\\\376\\\\360\\\\376\\\\303\\\\303\\\\261\\\\215\\\\267w\\\\373\\\\353\\\\353\\\\353\\\\377\\\\374\\\\273\\\\337\\\\275xq\\\\315\\\\350\\\\027\\\\365\\\\242\\\\037\\\\332.\\\\266_~\\\\371ew\\\\334\\\\277x\\\\361\\\\372\\\\325\\\\313\\\\353\\\\020\\\\207W_~!\\\\202\\\\206*\\\\2062\\\\204x8\\\\246\\\\307\\\\315\\\\260\\\\333{\\\\021g\\\\2122\\\\205\\\\000\\\\220\\\\353\\\\366\\\\247@\\\\201<\\\\245AQ\\\\206M\\\\236\\\\244y,)SWC-f\\\\374\\\\354\012\\\\347\\\\021\\\\014\\\\371\\\\353\\\\276\\\\243\\\\2361\\\\311\\\\337i\\\\352\\\\001\\\\316c\\\\005\\\\0024\\\\231)\\\\312\\\\355\\\\005\\\\004\\\\230\\\\004A\\\\003U\\\\247\\\\304\\\\332(.O\\\\302\012\\\\323M\\\\375\\\\354mL.\\\\335\\\\364\\\\356\\\\224\\\\241\\\\350\\\\373\\\\024B\\\\322\\\\314\\\\005g8\\\\224d\\\\332\\\\003$H\\\\021\\\\2008\\\\006\\\\343l\\\\005\\\\205\\\\325\\\\272\\\\024\\\\314=\\\\011U\\\\327\\\\202\\\\310\\\\304o;\\\\336\\\\016\\\\253\\\\335\\\\315\042h\\\\307\\\\265-\\\\302\\\\302\\\\242\\\\021R\\\\021-\\\\3763\\\\306Zka\\\\342\\\\220&\\\\326\\\\222KB\\\\020\\\\002\\\\221\\\\244-\\\\\\\\\\\\251\\\\353V\\\\253\\\\325q\\\\277\\\\033\\\\272\\\\276\\\\2365\\\\213\\\\371EUj\\\\004mW\\\\226\\\\216\\\\234\\\\315\\\\321\\\\017\\\\001r\\\\2660EH\\\\311\\\\367-`U\\\\030\\\\013\\\\222\\\\200\\\\231%\\\\002\\\\263Ai\\\\017{\\\\004\\\\2161z\\\\337\\\\247$\\\\3141\\\\205\\\\320\\\\367mJ\\\\2119qJ!\\\\014\\\\336\\\\373a\\\\030\\\\274\\\\367\\\\022\\\\023\\\\250\\\\261>\\\\014DTTeY\\\\226\\\\275\\\\037\\\\274\\\\367e]\\\\033N\\\\207\\\\256].\\\\227__\\\\177\\\\363\\\\367\\\\277\\\\375\\\\207\\\\305r)\\\\014\\\\366p8\\\\254\\\\326\\\\227\\\\213\\\\345j\\\\016\\\\213\\\\273\\\\273\\\\007D\\\\323u\\\\203\\\\357\\\\207\\\\343\\\\276u\\\\0269\\\\246\\\\371|~\\\\177\\\\177\\\\277\\\\272\\\\\\\\<n\\\\036\\\\213\\\\322\\\\274xu\\\\205\\\\224\\\\376\\\\356\\\\357~UV.\\\\004\\\\177\\\\261Z\\\\027\\\\266\\\\350z\\\\177ww\\\\334w\\\\233\\\\273\\\\207\\\\376\\\\341\\\\261=\\\\034\\\\003\\\\263\\\\025t\\\\034\\\\263M1\\\\315\\\\262L\\\\311\\\\213\\\\361_Q\\\\014\\\\342\\\\323\\\\027'\\\\027p\\\\322\\\\331c\\\\234\\\\364\\\\311\\\\025\\\\236<\\\\236\\\\304+?\\\\344\\\\013\\\\216I\\\\233I\\\\260r\\\\210\\\\343L&9S'\\\\216\\\\267\\\\224Ae$H\\\\254\\\\315 D{\\\\017\\\\235\\\\226\\\\315\\\\371W?\\\\273\\\\332\\\\364\\\\374\\\\334\\\\235Ui\\\\316\\\\365\012\\\\331`@\\\\034\\\\261s\\\\323b\\\\236\\\\014\\\\030\\\\000\\\\264\\\\204\\\\011Q\\\\022\\\\303\\\\310\\\\272\\\\216\\\\302\\\\004,\\\\371\\\\204\\\\021\\\\235\\\\207y\\\\000\\\\307\\\\372\\\\303\\\\323hO\\\\036\\\\342\\\\244\\\\001\\\\246\\\\307\\\\314?\\\\315\\\\311\\\\373\\\\004\\\\0141e\\\\352\\\\272\\\\302\\\\225d\\\\2153\\\\026M\\\\256W\\\\007\\\\261\\\\302\\\\274\\\\333n\\\\220\\\\310\\\\030\\\\333\\\\365\\\\373\\\\355\\\\343\\\\203\\\\322\\\\264\\\\032g\\\\333#\\\\021\\\\221\\\\237\\\\315\\\\224\\\\372\\\\310Z[\\\\024\\\\225\\\\226\\\\301\\\\202\\\\244\\\\244\\\\337\\\\222\\\\200%r\\\\202\\\\224\\\\274Q\042lI\\\\211C\\\\364^M\\\\213\\\\276\\\\357b\\\\214\\\\211\\\\003\\\\307\\\\024\\\\243\\\\217\\\\221\\\\231\\\\243s\\\\306U\\\\005\\\\307B\\\\022\\\\207\\\\020\\\\272\\\\256\\\\023\\\\004%\\\\350Pe\\\\027\\\\006_\\\\271\\\\342\\\\253\\\\257\\\\276\\\\372\\\\352\\\\253\\\\257V\\\\253\\\\325\\\\340\\\\3750\\\\014\\\\266\\\\250\\\\252C{\\\\254\\\\252\\\\352\\\\325\\\\253\\\\027\\\\364\\\\346]\\\\333\\\\266\\\\263\\\\231\\\\314\\\\347\\\\036\\\\260\\\\350\\\\332\\\\360\\\\233\\\\357\\\\177yh\\\\333\\\\365\\\\325\\\\345\\\\273wo\\\\026\\\\363\\\\352\\\\330\\\\355\\\\001\\\\371\\\\345\\\\353\\\\353>\\\\364eS\\\\356\\\\217\\\\375\\\\273\\\\017\\\\367\\\\277\\\\370\\\\233_\\\\374\\\\364\\\\346\\\\016\\\\260\\\\330l\\\\273\\\\333\\\\373\\\\256\\\\355\\\\023C\\\\211\\\\256H\\\\311\\\\246\\\\024H{5i\\\\207?8\\\\213\\\\027\\\\360(X\\\\331\\\\2248\\\\311\\\\250\042\\\\233U7O\\\\300\\\\321)\\\\3215M\\\\313(\\\\307\\\\011\\\\000\\\\200\\\\011\\\\225L\\\\031\\\\021\\\\305\\\\000ft\\\\376\\\\271\\\\220it\\\\004P\\\\271\\\\271\\\\316\\\\357\\\\345\\\\274/'!\\\\032\\\\004\\\\303\\\\200\\\\214 B\\\\300I\\\\301\\\\021\\\\243\\\\2753]\\\\214\\\\024\\\\254&\\\\002\\\\200\\\\351t\\\\201\\\\263h\\\\3613\\\\205\\\\375\\\\364f\\\\306\\\\377\\\\015)\\\\375\\\\014\\\\2142\\\\255@\\\\026@9]J\\\\303z\\\\034\\\\011\\\\014(\\\\026\\\\013&\\\\201\\\\316K\\\\36248#\\\\206\\\\016\\\\201adI\\\\310\\\\325\\\\343y\\\\0311 \\\\024E\\\\241\\\\031\\\\346\\\\030c\\\\364)\\\\372\\\\036R\\\\002\\\\304\\\\010G\\\\260\\\\306\\\\230\\\\3028\\\\353\\\\2343\\\\326Z\\\\353\\\\210\\\\250\\\\037\\\\272\\\\242\\\\252\\\\014UC\\\\327w\\\\355\\\\000\\\\000c\\\\357d\\\\026\\\\302\\\\030\\\\006\\\\255\\\\355p\\\\316\\\\225E\\\\255\\\\215\\\\305\\\\316\\\\006\\\\301\\\\000pJ\\\\222Rh\\\\017\\\\273\\\\224r\\\\223cm\\\\236\\\\244\\\\267\\\\020BH)\\\\240\\\\210H\\\\022\\\\006\\\\220D\\\\006\\\\215\\\\261\\\\321sY\\\\024\\\\266p*\\\\372)%[\\\\270\\\\272\\\\256\\\\207\\\\020\\\\216\\\\373\\\\375o\\\\377\\\\361\\\\037\\\\276\\\\377\\\\356\\\\227\\\\246p!\\\\204\\\\253\\\\365\\\\372\\\\376\\\\376\\\\336\\\\374\\\\273\\\\377\\\\341\\\\357v\\\\373]\\\\214\\\\361p8*e\\\\357|q\\\\361\\\\370\\\\260\\\\265d\\\\221\\\\340\\\\366\\\\366\\\\266\\\\251\\\\233\\\\355f\\\\343\012\\\\227R\\\\252\\\\353\\\\312\\\\025\\\\3244u\\\\335\\\\314>~\\\\274\\\\363}\\\\024\\\\260?\\\\374\\\\370\\\\336\\\\230\\\\346\\\\341\\\\341\\\\270=\\\\244n\\\\340\\\\220l\\\\004\\\\233\\\\304\\\\260 \\\\241*\\\\266\\\\011\\\\242)\042ZM\\\\204Z\\\\3704N\\\\303\\\\223\\\\211V\\\\266#\\\\310\\\\212o4\\\\2115F\\\\223\\\\037E+R9O<\\\\300\\\\023\\\\377_\\\\355\\\\351<8S\\\\356Z\\\\261\\\\227d\\\\254^\\\\001G\\\\334\\\\032\\\\000\\\\320Xy\\\\007Hd\\\\015\\\\221\\\\001\\\\005~\012\\\\003\\\\247q-\\\\301\\\\223(/\\\\216\\\\274Z0:g\\\\331\\\\242xbrLJ\\\\227S\\\\202\\\\021\\\\341\\\\215#\\\\333\\\\347t\\\\006d\\\\241\\\\303\\\\011\\\\\\\\E\\\\306(y;\\\\010\\\\0003\\\\032*\\\\234\\\\265E)\\\\242A\\\\212s[9\\\\235\\\\215\\\\340\\\\231\\\\246\\\\317)\\\\356\\\\221o`\\\\262\\\\270\\\\020\\\\020Q\\\\367t\\\\357}J!\\\\305\\\\004\\\\034\\\\001\\\\001\\\\014\\\\20100\\\\013\\\\307\\\\024}\\\\010C\\\\210!\\\\014\\\\275\\\\367\\\\276\\\\252\\\\212\\\\340\\\\207\\\\241o\\\\201c]\\\\225UU\\\\220\\\\244\\\\256\\\\357\\\\273\\\\366\\\\030\\\\375\\\\220B\\\\014\\\\303\\\\220B@\\\\021\\\\340$)\\\\246\\\\350}\\\\327\\\\017]\\\\027\\\\206^\\\\377\\\\206\\\\256\\\\035\\\\272N$\\\\3050\\\\004?\\\\204\\\\320\\\\307\\\\350c\\\\014)\\\\305\\\\304\\\\236\\\\203\\\\327>!\\\\306\\\\020\042\\\\344\\\\352\\\\015\\\\221\\\\024#\\\\002e\\\\010\\\\310\\\\330\\\\325@)\\\\020~\\\\363w\\\\177\\\\327\\\\314fm\\\\333\\\\376\\\\352\\\\373\\\\357Ed\\\\263\\\\331\\\\254\\\\327k\\\\273o\\\\017\\\\227\\\\327\\\\227\\\\332\\\\021\\\\260\\\\361\\\\025\\\\000\\\\025\\\\216\\\\227\\\\027\\\\015\\\\202\\\\333n\\\\367w\\\\267\\\\367w\\\\367\\\\037\\\\234s\\\\303fx\\\\365\\\\305\\\\027\\\\211\\\\2030\\\\206\\\\010\\\\217\\\\357o\\\\373.\\\\224\\\\256\\\\361\\\\201\\\\001\\\\232\\\\355>\\\\335=\\\\366>BL\\\\304HQ8qD4h\\\\0208\\\\3018\\\\001\\\\0049\\\\367\012\\\\000\\\\271\\\\346L\\\\000\\\\306\\\\035^\\\\245Ec\\\\024\\\\032\\\\244\\\\233r~)%3y6O\\\\015\\\\006e\\\\372\\\\021\\\\004\\\\020-\\\\204\\\\233\\\\302\\\\264\\\\224\\\\003X\\\\343\\\\371\\\\352wkRa4\\\\025\\\\316$T\\\\323\\\\210\\\\031\\\\345Oz\\\\243\\\\220M\\\\221\\\\363p\\\\365t<\\\\003\\\\234\\\\374L\\\\364\\\\360g_\\\\234\\\\316\\\\037=\\\\000\\\\003H\\\\206\\\\204\\\\231\\\\011X\\\\233\\\\276\042\\\\200\\\\261\\\\030<\\\\203\\\\210F\\\\326\\\\202\\\\357\\\\373\\\\336\\\\330\\\\242\\\\022\\\\262\\\\272\\\\241M\\\\025VSX\\\\374d\\\\005a\\\\366\\\\006e\\\\364U\\\\246\\\\203\\\\231\\\\201\\\\023\\\\000\\\\264\\\\307}v\\\\251\\\\015\\\\020\\\\0300y\\\\261\\\\211=\\\\221\\\\351\\\\010G\\\\366z\\\\022\\\\335\\\\037\\\\017\\\\340lQT\\\\306\\\\230\\\\241\\\\353\\\\321\\\\220%\\\\203\\\\206\\\\254-\\\\010\\\\260?\\\\0364d\\\\321i\\\\343]\\\\242\\\\272\\\\256\\\\363}\\\\002\\\\350\\\\014fx\\\\223\\\\370\\\\020\\\\3020\\\\0141z\\\\255\\\\322O)\\\\011\\\\247\\\\371|\\\\236\\\\230\\\\021\\\\311\\\\020\042`B\\\\305\\\\353\\\\220s.1G\\\\237\\\\312\\\\262\\\\264\\\\205S7\\\\243\\\\252\\\\252\\\\357~\\\\365\\\\353\\\\303\\\\341@dg\\\\263\\\\305_~\\\\370\\\\351\\\\352\\\\352\\\\352j}\\\\363\\\\361\\\\343G\\\\233x0\\\\246\\\\332n\\\\037g\\\\263zV\\\\325\\\\207C\\\\373\\\\307\\\\177\\\\375\\\\003\\\\010~\\\\270\\\\275\\\\273X^\\\\206\\\\330\\\\177\\\\361\\\\362\\\\353\\\\335n\\\\357\\\\3122\\\\2454\\\\204\\\\210\\\\006\\\\377\\\\343\\\\377\\\\375\\\\207\\\\213\\\\331e\\\\357\\\\023\\\\263__\\\\276\\\\364!\\\\036\\\\216}\\\\022\\\\227\\\\230\\\\243\\\\022\\\\353\\\\240\\\\001\\\\342\\\\30411\\\\223\\\\246\\\\317\\\\262\\\\036\\\\316}\\\\333O\\\\036\\\\314g.\\\\326\\\\344\\\\005\\\\322\\\\310\\\\316\\\\243\\\\377\\\\032sF\\\\034?iud-M\\\\026\\\\000$\\\\0210\\\\360D\\\\206(\\\\203\\\\365\\\\263\\\\014?9\\\\316\\\\277\\\\224%\042\\\\030@1(\\\\244\\\\351fQ2\\\\200\\\\347\\\\202{&\\\\276\\\\237\\\\001<\\\\262\\\\215\\\\376\\\\231i\\\\241\\\\331?c`\\\\362\\\\005ET[\\\\203!\\\\346\\\\354!\\\\300\\\\371-f\\\\2271i\\\\344\\\\206\\\\005 \\\\305\\\\266m\\\\311\\\\026\\\\365|5\\\\212\\\\354\\\\023O\\\\343s\\\\333FKy\\\\264.S\\\\313\\\\215\\\\223bSS\\\\004\\\\021SXf\\\\006d\042\042\\\\001\\\\346\\\\321\\\\276\\\\037\\\\333B#b\\\\3160\\\\241\\\\001\\\\200\\\\020#\\\\244\\\\350\\\\273V\\\\005\\\\037(\\\\353\\\\216\\\\252\\\\254\\\\313\\\\262\\\\364>\\\\246\\\\024\\\\232f.\\\\226\\\\000\\\\250(\\\\212\\\\355\\\\346\\\\201\\\\210\\\\010- \\\\007\\\\237\\\\264O\\\\005\\\\000\\\\260\\\\370\\\\310Q\\\\243\\\\366\\\\306\\\\230\\\\242p V'\\\\201Y\\\\311\\\\266,\\\\214\\\\226\\\\247\\\\332\\\\312\\\\326f\\\\323K\\\\341x\\\\253\\\\325\\\\352\\\\213/\\\\276\\\\330l6\\\\327\\\\327\\\\327\\\\267\\\\367w)\\\\245oV+D\\\\374\\\\360\\\\341\\\\303\\\\315\\\\315\\\\215-k\\\\327\\\\015GA~\\\\334>\\\\364}\\\\365\\\\247?\\\\375\\\\360\\\\342\\\\352\\\\372\\\\366\\\\366\\\\376\\\\352j\\\\005\\\\000Ee\\\\272~\\\\017 \\\\326\\\\231\\\\303\\\\341\\\\000d\\\\332C$\\\\232w=U\\\\365\\\\222\\\\250x\\\\330\\\\366]\\\\233\\\\022S\\\\360\\\\211\\\\301\\\\200@\\\\214\\\\2211\\\\300\\\\204}\\\\0031\\\\200\\\\250H\\\\011T\\\\006\\\\030aa\\\\203$\\\\243\\\\337-\\\\271m\\\\016\\\\242\\\\241\\\\334X`\\\\204/\\\\352\\\\310Zk\\\\203\\\\357!\\\\227\\\\341=\\\\331\\\\3269%@\\\\311M\\\\334\\\\324\\\\202$\\\\003\\\\200\\\\022\\\\231\\\\000\\\\004\\\\221\\\\211 1\\\\200VUs\\\\364^q\\\\267\\\\314\\\\014\\\\220,\\\\031\\\\000\\\\210\\\\314\\\\326\\\\271\\\\020\\\\2431\\\\326\\\\026\\\\326\\\\017>\\\\011[\\\\343\0421\012I\\\\212\\\\222\\\\273\\\\001)fU\\\\353\\\\227\\\\237k\\\\337\\\\311\\\\231{&[\\\\347\\\\332z\\\\264.FALI\\\\233/k\\\\003\\\\024\\\\232$\\\\0361\\\\206PVU\\\\212\\\\022C\\\\000\\\\312j\\\\3179\\\\027cH#Qy^\\\\265\042\\\\210\\\\330\\\\367\\\\201\\\\317\\\\216\\\\311\042\\\\227\\\\224\\\\200H\\\\265u\\\\346\\\\250\\\\266\\\\326Z\\\\353\\\\207\\\\016\\\\211,\\\\222\\\\260d9\\\\262\\\\326Z\\\\033\\\\203\\\\327\\\\302\\\\261\\\\030#\\\\247\\\\200*\\\\357\\\\000 \\\\251(\012c\\\\\\\\JJ&M\\\\314)y\\\\217e\\\\365\\\\370p/!\\\\331\\\\252hY\\\\022GB\\\\243-\\\\220\\\\253\\\\252JIDRY\\\\326\\\\336\\\\373\\\\266m\\\\021\\\\305:c\\\\0349\\\\347\\\\222\\\\304\\\\024=\\\\216PU\\\\245oT\\\\246ju\\\\214c\\\\014\\\\210H\\\\326\\\\204\\\\020\\\\320\\\\2203\\\\204\\\\210UU-..\\\\347\\\\313U\\\\303\\\\374\\\\207?\\\\374\\\\341\\\\273_~\\\\237R\\\\332\\\\334o \\\\201\\\\001s\\\\373\\\\341\\\\326\\\\336>\\\\336z\\\\357%\\\\2106\\\\263\\\\332\\\\357\\\\367\\\\213\\\\331b>\\\\237\\\\357\\\\333\\\\343l\\\\266 K@nw\\\\330-\\\\353\\\\231\\\\037\\\\270\\\\353\\\\323\\\\340\\\\241\\\\254/\\\\312\\\\262N\\\\011\\\\367;\\\\337\\\\0171E\\\\255t3\012ZW4\\\\217\\\\210\\\\272U\\\\206Y\\\\020\\\\314Te\\\\364\\\\263\012\\\\362<t0\\\\3051\\\\364\\\\205s\\\\225sz\\\\376$\\\\302\\\\220r\\\\272k\\\\322\\\\221g\\\\3122cq\\\\220AX\\\\271\\\\\\\\\\\\2545\\\\252*\\\\\\\\a\\\\242\\\\347\\\\304\\\\201\\\\220\\\\312\\\\302z?\\\\314f5\\\\221\\\\351\\\\373\\\\003\\\\010\\\\211p\\\\010\\\\036\\\\210\\\\200\\\\223jPNaT\\\\266\\\\177\\\\275\\\\021\\\\325\\\\177\\\\345\\\\201g6\\\\217\\\\332R\\\\247\\\\267(7\\\\275Ui\\\\006c\\\\225\\\\2009\\\\246\\\\224\\\\224\\\\006d\\\\344x y\\\\242\\\\335y\012\\\\241L#\\\\202H\\\\032`9k\\\\0324\\\\332\\\\356\\\\010\\\\220\\\\020\\\\215\\\\002kE-\\\\034\\\\314$\\\\020\\\\347\\\\341t\\\\314\\\\314\\\\210F\\\\311s\\\\231\\\\031\\\\021\\\\\\\\U\\\\211$k\\\\255\\\\030c\\\\255UD\\\\267O\\\\276\\\\037:B3\\\\365LI)h\\\\346A\\\\227\\\\025\012\\\\211$M\\\\220M\\\\2679Q\\\\340\\\\361\\\\330Q@\\\\357\\\\3239\\\\227\\\\222\\\\017!\\\\224e\\\\271Z\\\\255\\\\234sM\\\\323\\\\030c\\\\274\\\\367\\\\277\\\\375\\\\355o\\\\377\\\\362\\\\343\\\\233\\\\345r\\\\3314\\\\315~\\\\277_\\\\257\\\\327\\\\000`]i\\\\023s\\\\344t<\\\\036\\\\207\\\\345P\\\\024\\\\325\\\\020\\\\207\\\\272\\\\256\\\\251\\\\007\\\\346\\\\330\\\\266mY/}J\\\\011\\\\355\\\\256\\\\335\\\\035\\\\3330\\\\233\\\\337X;\\\\007pm\\\\333\\\\355\\\\017Cb@\\\\260\\\\254\\\\215m\\\\262\\\\216b\\\\200\\\\010\\\\302\\\\000\\\\314\\\\302(F\\\\353\\\\232\\\\307\\\\011\\\\034e4iG\\\\217\\\\321t\\\\036\\\\225\\\\226*\\\\204Qb\\\\316D\\\\377\\\\314\\\\034\\\\034\\\\235\\\\302\\\\\\\\}\\\\010\042\\\\3002\\\\211\\\\262AD0\\\\271.\\\\344,f\\\\2476\\\\317\\\\340;\\\\225\\\\034\\\\016\\\\243e,\\\\214,\\\\213\\\\246d`\\\\302\\\\364\\\\313o\\\\277y\\\\361\\\\342\\\\325\\\\333w\\\\357~\\\\374\\\\361G\\\\262\\\\220\\\\022\\\\351\\\\024z\\\\357\\\\205\\\\031I\\\\253\\\\245r\\\\277\\\\373\\\\274`\\\\344<N\\\\362_/\\\\324c1d\\\\366\\\\350\\\\300\\\\000\\\\010!\\\\245\\\\224\\\\204\\\\014\\\\240\\\\201\\\\224LQTU\\\\203\\\\306B\\\\034!\\\\366St\\\\231\\\\247e\\\\240\\\\336p\\\\356:\\\\225#K\\\\247d\\\\023e\\\\017\\\\230\\\\020\\\\000\\\\214q\\\\220\\\\275u!\\\\244)\\\\222\\\\215\\\\210Bg\\\\365\\\\271D\\\\002FD\\\\320\\\\230\\\\304\\\\214\\\\271\\\\034\\\\2168\\\\004KT\\\\226e\\\\273?\\\\214\\\\251\\\\\\\\\\\\006\\\\001\\\\213\\\\200\\\\010\\\\314\\\\014\\\\002<v\\\\010\\\\000N\\\\006\\\\301\\\\231\\\\014\\\\260\\\\236\\\\004W9F\\\\204rA4\042\\\\262*EA\\\\205\\\\270\\\\013\\\\020\\\\020\\\\332\\\\302A\\\\304\\\\262,\\\\225\\\\273_w\\\\327\\\\272\\\\236\\\\375\\\\247\\\\377\\\\364\\\\273\\\\177\\\\374\\\\307\\\\177\\\\374\\\\363\\\\237\\\\377\\\\274X,_\\\\276\\\\274>\\\\036\\\\333\\\\242(\\\\254\\\\226jE\\\\337\\\\375\\\\364\\\\356\\\\003\\\\242\\\\275X\\\\254R\012\\\\316\\\\225!\\\\244\\\\256\\\\337w\\\\203\\\\267%\\\\220\\\\255\\\\266\\\\273c\\\\353\\\\031\\\\314\\\\254\\\\232]\\\\370\\\\004\\\\376\\\\330\\\\035\\\\332\\\\236\\\\023\\\\242R\\\\2103\\\\313\\\\230\\\\276\\\\023I\\\\004\\\\220\\\\220\\\\221\\\\223zjOq\\\\217\\\\347\\\\342\\\\365s\\\\223\\\\213\\\\271 h:'\\\\257\\\\3323\\\\353Y\\\\2624\\\\217\\\\321\\\\207\\\\214r\\\\030\\\\277%3{\\\\236\\\\265^\\\\325\\\\351\\\\025\\\\000\\\\020\\\\315\\\\350*\\\\341\\\\232\\\\263D\\\\004\\\\0229&Y\\\\315\\\\312\\\\357\\\\277\\\\377\\\\376\\\\365\\\\313W\\\\014\\\\342\\\\2757\\\\370\\\\002!}\\\\274\\\\375\\\\0241%\\\\016\\\\314L\\\\244:^8\\\\375\\\\267Q\\\\317\\\\343o\\\\316\\\\336\\\\356\\\\244\\\\255\\\\247\\\\300H\\\\212\\\\352\\\\217\\\\031`1\\\\256\\\\264E%\\\\332\\\\322k<GW\\\\332Y{\\\\362\\\\247z\\\\032a\\\\322sy\\\\034\\\\316\\\\366=-\\\\247\\\\027\\\\021DCh0\\\\307\\\\204\\\\022\042e\\\\322(\\\\320\\\\32505\\\\011w\\\\000A\\\\004\\\\231\\\\301Z\\\\322\\\\336\\\\301D\\\\010\\\\310\\\\306\\\\232I\\\\037O\\\\234*\\\\347\\\\373\\\\204\\\\352)\\\\345B\\\\177f\\\\2171k\\\\216\\\\370\\\\324\\\\375mz\\\\235\\\\031\\\\304\\\\3120\\\\014EQi\\\\245\\\\026\\\\021\\\\205\\\\020\\\\264\\\\212\\\\376\\\\361\\\\361\\\\376\\\\346\\\\346\\\\346_\\\\376\\\\345_~\\\\365\\\\253_\\\\015>\\\\334\\\\337\\\\337\\\\277x\\\\361\\\\342\\\\323\\\\247OVqB)\\\\010\\\\010\\\\245\\\\210U=\\\\033\\\\272\\\\036\\\\304\\\\222q\042i\\\\261\\\\\\\\\\\\013\\\\230\\\\262\\\\232m\\\\017a\\\\266\\\\270q\\\\266\\\\011\\\\221\\\\016m7t=\\\\013\\\\032gY@@\\\\320\\\\020\\\\237\\\\242\\\\0260\\\\322^i\\\\036K\\\\373\\\\334\\\\252h\\\\262\\\\212\\\\026\\\\214;\\\\243\\\\0164\\\\215@NF \042\\\\0363\\\\322\\\\347*\\\\371Tq1)\\\\217,\\\\020\\\\002c\\\\230\\\\3443Q\\\\301g\\\\242'c\\\\223\\\\007\\\\255\\\\014\\\\227\\\\310\\\\021\\\\300\\\\022\\\\254/\\\\353\\\\377\\\\375\\\\177\\\\373_\\\\001`V\\\\325\\\\214\\\\320\\\\367\\\\375\\\\315\\\\365\\\\305\\\\315\\\\365\\\\352\\\\367\\\\177\\\\264o\\\\336\\\\337\\\\356\\\\217m\\\\360\\\\254\\\\331C\\\\225f\\\\034\\\\263\\\\2129\\\\3240\\\\361\\\\313\\\\001\\\\374\\\\227kI>?h\\\\212\\\\011N\\\\271\\\\225\\\\361\\\\035\\\\200\\\\021jb\012\\\\347Jc\\\\234\\\\017\\\\221\\\\231\\\\005H\\\\224EL\\\\303<Y\\\\357\\\\25291Y\\\\355\\\\232NI\\\\014<\\\\272\\\\316\\\\220\\\\251\\\\021\\\\220\\\\222:\\\\321\\\\250_\\\\252=\\\\014\\\\325\\\\310FD\\\\002\\\\022\\\\021%\\\\216\\\\202\\\\\\\\\\\\307\\\\300\\\\271\\\\257\\\\0143\\\\014!\\\\002\\\\231\\\\262,\\\\205\\\\241\\\\367\\\\203-*WX\\\\000\\\\210\\\\022\\\\225;[\\\\0049FW\\\\226\\\\214\\\\331xH d\\\\210\\\\300r\\\\360\\\\006\\\\315\\\\310L\\\\231\\\\213\\\\201\\\\263>f\\\\000@\\\\026\\\\025\\\\007\\\\365z@\\\\265\\\\217s\\\\246\\\\252\\\\352\\\\252\\\\252\\\\030\\\\300\\\\307h\\\\014*\\\\015\\\\315v\\\\273\\\\275\\\\276\\\\272\\\\371\\\\351\\\\3077\\\\277\\\\371\\\\315o>|\\\\370\\\\320\\\\035\\\\373\\\\353\\\\353k\\\\363o\\\\376\\\\371\\\\033c\\\\254\\\\245\\\\252,\\\\353\\\\365\\\\345\\\\332P\\\\261\\\\337\\\\035X 0\\\\367>\\\\036\\\\016\\\\376q\\\\337U\\\\365eY]6\\\\263\\\\253c\\\\027\\\\266\\\\273\\\\203\\\\037\042 9\\\\347\\\\000I[\\\\033YkY->\\\\0319\\\\251d\\\\0343\\\\316\\\\351*f\\\\026`-\\\\004\\\\234\\\\034\\\\232,d\\\\023|\\\\221\\\\220\\\\314\\\\251]\\\\303\\\\011S\\\\301<\\\\242 \\\\247fg\\\\000\\\\232Q\\\\227\\\\321\\\\332\\\\311\\\\274(#\\\\017\\\\255\\\\236\\\\240S\\\\253m\\\\211s\\\\366\\\\001\\\\230#\\\\002X\\\\013M]\\\\030\\\\303\\\\257^]\\\\377\\\\363\\\\277\\\\371\\\\307\\\\327\\\\257_\\\\336~zO\\\\010\\\\263Y}\\\\373\\\\341\\\\375\\\\333\\\\267?:\\\\203\\\\3277\\\\327\\\\344\\\\214+J\\\\221\\\\310\\\\034Y/\\\\203\\\\332\\\\347!\\\\257\\\\232\\\\351q$$\\\\377y\\\\375\\\\375,\\\\204\\\\367\\\\344-\\\\030I\\\\000\\\\316\\\\265\\\\227\\\\332\042h\\\\000\\\\215-\\\\253\\\\272\\\\231\\\\021\\\\231\\\\240M\\\\014\\\\317\\\\\\\\\\\\216i\\\\327\\\\202Q\\\\261\\\\311\\\\024\\\\243@To\\\\020P\\\\306\\\\324\\\\377\\\\211\\\\330 \\\\037\\\\214\\\\232\\\\304\\\\302\\\\334]\\\\356TW&\\\\200\\\\306Xc\\\\254&\\\\377Sd\\\\324\\\\236_,D\\\\306Z\\\\307\\\\314\\\\203\\\\037\\\\314H\\\\300v\\\\332\\\\034\\\\022C\\\\214\\\\246(\\\\316Ld\\\\3246\\\\257\\\\312\\\\201;\\\\362\\\\237\\\\210\\\\300\\\\271\\\\2611\\\\2459I\\\\004Rb2f6\\\\233}\\\\371\\\\345\\\\227\\\\306\\\\230\\\\262\\\\254\\\\252\\\\252\\\\212)\\\\305\\\\0305\\\\366\\\\022\\\\243V\\\\324\\\\016\\\\257_\\\\277\\\\326\\\\234\\\\3130\\\\370\\\\305ba\\\\333\\\\266\\\\343\\\\004\\\\226\\\\312\\\\313\\\\325u\\\\345\\\\252\\\\276\\\\3671\\\\211\\\\370\\\\310LC\\\\237\\\\266\\\\207\\\\226\\\\261\042S\\\\0313\\\\357\\\\007~\\\\330\\\\034\\\\231\\\\023\\\\021\\\\220!FN\\\\234\\\\271/\\\\003G\\\\311]\\\\236T\\\\353\\\\344>;8\\\\262i\\\\345\\\\021O904\\\\311\\\\362$w\\\\223\\\\247\\\\242\\\\277S\\\\367\\\\246)\\\\313p20\\\\237\\\\212\\\\310\\\\004\\\\203\\\\206\\\\247\\\\033\\\\231\\\\266\\\\233\\\\032_xR\\\\243\\\\201\\\\006,9N\\\\241,\\\\313\\\\327\\\\257_\\\\255V\\\\313W/\\\\257~\\\\365\\\\335/,\\\\341\\\\365\\\\325%\\\\260t\\\\355\\\\256\\\\256lU\\\\277\\\\000\\\\226\\\\273\\\\373\\\\273o\\\\276\\\\376\\\\352\\\\352\\\\332/\\\\227\\\\363\\\\267o\\\\337n\\\\267{E\\\\261\\\\307\\\\317 \\\\245\\\\377\\\\277\\\\017\\\\004~\\\\206-Q\\\\030*\\\\213\\\\220\\\\265\\\\314\\\\204h\\\\252\\\\262v\\\\256L\\\\302\\\\351<\\\\000?.\\\\000T\\\\372\\\\203\\\\234m=\\\\2772\042!@\\\\304\\\\021\\\\233\\\\233\\\\353\\\\024\\\\3444\\\\011HF\\\\273x\\\\010\\\\000\\\\242Q])\\\\210\\\\310\042\\\\244\\\\275e\\\\014\\\\022I.\\\\302\\\\022M<\\\\001\\\\231\\\\220\\\\030\\\\000\\\\214u\\\\002)\\\\244\\\\210Z\\\\256\\\\243\\\\304\\\\335d\\\\330\\\\032\\\\006a\\\\321b\\\\002@H@Bh\\\\2000\\\\206D\\\\250$\\\\246DZN\\\\216\\\\204\\\\210\\\\201c\\\\306X\\\\011&\\\\001@\\\\343\\\\312\\\\252\\\\231/\\\\257_\\\\276\\\\270\\\\277\\\\277\\\\007! \\\\352\\\\373^+\\\\003\\\\001 \\\\204\\\\340\\\\275\\\\2375s\\\\000@4\\\\037?\\\\336~\\\\367\\\\335w\\\\307\\\\343\\\\321B\\\\020H\\\\020\\\\304\\\\233\\\\262\\\\330w\\\\335\\\\361\\\\330\\\\356[\\\\237\\\\030\\\\352f\\\\356*\\\\263X\\\\270\\\\305\\\\352e\\\\347q\\\\267ow\\\\007\\\\017\\\\000EQ\\\\020\\\\2016.WZ_\\\\021\\\\211\\\\203\\\\207\\\\321B@\\\\244\\\\3548\\\\213\\\\010\\\\310\\\\350\\\\261\\\\222\\\\3265L\\\\265\\\\256g\\\\302\\\\227\\\\373\\\\377\\\\002\\\\002\\\\022\\\\212\\\\010\\\\013\\\\353\\\\033\\\\247%.\\\\011\\\\2200\\\\003\\\\272\\\\025\\\\025'\\\\231\\\\034S\\\\257\\\\211\\\\232\\\\332e\\\\021\\\\255\\\\376T\\\\255\\\\014\\\\000@2\\\\346\\\\372\\\\364\\\\033\\\\023\\\\033W\\\\304\\\\020\\\\216\\\\307\\\\201\\\\210\\\\276x\\\\375r9k\\\\266\\\\217\\\\233\\\\307\\\\373\\\\273\\\\266;\\\\020\\\\321|\\\\336hIEJi\\\\271X\\\\024\\\\306\\\\226\\\\027\\\\025\\\\244\\\\270\\\\337l\\\\207\\\\266\\\\203\\\\022S\\\\224C\\\\360\\\\223\\\\253\\\\011Sx2O\\\\010\\\\375\\\\177\\\\262:\\\\220A\\\\010!\\\\227\\\\274\\\\343\\\\363\\\\005\\\\011\\\\200h\\\\214a\\\\001A\\\\260\\\\205#k\\\\206\\\\201E\\\\320\\\\373\\\\341\\\\231\\\\262\\\\327\\\\177\\\\247\\\\340\\\\303\\\\244\\\\244\\\\031\\\\001\\\\204G_\\\\020\\\\317\\\\314\\\\031\\\\022\\\\255\\\\017\\\\032_\\\\310\\\\276 \\\\020\\\\342H\\\\322\\\\253N\\\\010\\\\032AC\\\\000\\\\210\\\\0060\\\\002\\\\013Z\\\\322\\\\036\\\\233S/\\\\010$N\\\\301\\\\307\\\\030G\\\\177\\\\016\\\\214!\\\\347\\\\\\\\\\\\010\\\\032\\\\331\\\\310hU\0422\\\\306\\\\022QL~\\\\272C:\\\\357~\\\\024D2\\\\245\\\\260\\\\032<R\\\\024E3\\\\2538A\\\\014\\\\354\\\\234\\\\021\\\\021\\\\245\\\\210n\\\\232f>\\\\237?<l\\\\256\\\\256\\\\256\\\\372\\\\276\\\\277\\\\177\\\\270\\\\253\\\\253\\\\006Q>~|\\\\377\\\\355\\\\267\\\\337\\\\232o^\\\\227C\\\\327G\\\\037\\\\273\\\\326\\\\037\\\\217\\\\335\\\\3560\\\\014\\\\203D.\\\\217-\\\\027\\\\365z\\\\266x\\\\261?\\\\246\\\\207\\\\207\\\\303\\\\261\\\\0374\\\\347n\\\\0118s\\\\003\\\\003\\\\010s\\\\212\\\\302\\\\311`n\\\\266\\\\232Gg$\\\\207@\\\\2031\\\\006\\\\021\\\\226\\\\224\\\\204\\\\2432\\\\007\\\\023\\\\000a\\\\016\\\\013\\\\003\\\\022\\\\030Bc\\\\000QP\\\\3134\\\\020\\\\000\\\\265\\\\177\\\\000\\\\221\\\\350W(\\\\350y\\\\244UK\\\\310\\\\014\\\\312Y(\\\\011R\\\\000]\\\\345Z\\\\322A\\\\350\\\\2141\\\\206$%C\\\\302\\\\311'\\\\016D\042\\\\310\\\\000\\\\340\\\\234A\\\\244\\\\024\042\\\\000\\\\324%\\\\021\\\\310\\\\337~\\\\3737\\\\237>|H1Ve\\\\321u\\\\375\\\\254\\\\231[S8[\\\\266G\\\\037\\\\243<\\\\334o~\\\\370\\\\323\\\\237\\\\356?~\\\\272^_6E\\\\371o\\\\377\\\\351\\\\237.\\\\226\\\\213\\\\241o\\\\253\\\\312\\\\014\\\\203\\\\027\\\\000`\\\\000\\\\213d\\\\2146\\\\364\\\\004\\\\000\\\\343,\\\\234\\\\300\\\\323\\\\247\\\\010\\\\013\\\\344\\\\340\\\\015\\\\217\\\\353WN\\\\357\\\\242\\\\302kqd\\\\031U\\\\031\\\\300\\\\024\\\\0230\\\\270\\\\272Y./\\\\022\\\\363\\\\261\\\\355\\\\030\\\\004A+\\\\034T\\\\222IWF\\\\022N\\\\314IXF<(\\\\022\\\\011\\\\002\\\\001!i\\\\037\\\\357\\\\314\\\\005\012\\\\200,\\\\300\\\\211]UiG\\\\016c-\\\\022\\\\261\\\\260\\\\240\\\\2201)e*WK\\\\026\\\\001\\\\204Y\\\\323~\\\\256(|\\\\333\\\\222\\\\265eYv]g\\\\214\\\\231\\\\315f\\\\303\\\\320\\\\263$E\\\\006j&\\\\204\\\\310\\\\240\\\\262\\\\311\\\\373\\\\001B\\\\017\\\\204\\\\326\\\\232\\\\304\\\\014`\\\\014YCf\\\\350\\\\216\\\\246t\\\\234RU\\\\225D8\\\\014}\012\\\\011\\\\004\\\\014\\\\0213[\\\\223\\\\357\\\\304ZS5\\\\365\\\\253\\\\227//\\\\026\\\\313\\\\375\\\\366puy\\\\205\\\\200C7\\\\324e\\\\235B\\\\004\\\\226YS\\\\037v;\\\\037|Y\\\\0261\\\\205\\\\224\\\\202v\\\\3424\\\\277\\\\372\\\\366\\\\262\\\\252\\\\232\\\\246Y\\\\220q]\\\\237\\\\036\\\\267\\\\307\\\\335~\\\\330\\\\037\\\\375\\\\342\\\\342&\\\\211=\\\\264a\\\\267o\\\\333>(~\\\\330\\\\030\\\\222\\\\221\\\\337vR\\\\0174&\\\\250'Knb\\\\252?\\\\263bs\\\\330nzw\\\\234\\\\302\\\\363?\\\\035\\\\377\\\\323\\\\221\\\\275\\\\221\\\\214\\\\210\\\\327/\\\\324`\\\\337\\\\251 \\\\0218!IFjd\\\\3568\\\\240\\\\014\\\\011\\\\220\\\\020\\\\002\\\\214]%Ur8JQXI\\\\234\\\\222\\\\274~u\\\\363\\\\333\\\\377\\\\356\\\\327$rw\\\\367)\\\\305\\\\024B\\\\000\\\\200\\\\375~\\\\277\\\\337\\\\037\\\\037\\\\0377\\\\234\\\\300\\\\030j\\\\212\\\\262.\\\\253\\\\272\\\\252\\\\377\\\\343\\\\277\\\\377\\\\367\\\\233\\\\355f\\\\271\\\\\\\\|\\\\361\\\\352\\\\325\\\\267\\\\277\\\\370V\\\\331vz?\\\\210\\\\352\\\\177\\\\305~\\\\022\\\\201r\\\\205g\\\\030\\\\367$\\\\262O\\\\264\\\\352)\\\\224\\\\250\\\\221)\\\\325\\\\357\\\\2473\\\\306\\\\212.\\\\0210T4\\\\263\\\\242(\\\\243@J<\\\\255\\\\221i\\\\357\\\\232>u\\\\316[r\\\\322\\\\334Y\\\\321\\\\250\\\\0364S\\\\345\\\\225\\\\214\\\\031Y87]F\\\\260n6\\\\267G$\\\\272\\\\346\\\\271\\\\2309\\\\212h\\\\0035\\\\215f\\\\030cD\\\\230A\\\\371\\\\3715\\\\214\\\\222\\\\243#\042L\\\\204\\\\014l\\\\2541\\\\306J\\\\236\\\\023\\\\014!\\\\010\\\\241sF\\\\0038\042\\\\222Rr\\\\326iGCN\\\\214D\\\\312\\\\371\\\\015\\\\210\\\\266\\\\260\\\\027\\\\313\\\\213\\\\272\\\\254\\\\267\\\\217[2\\\\246\\\\357\\\\373\\\\335n\\\\2477\\\\243\\\\270~\\\\235\\\\376\\\\020\\\\274\\\\367\\\\003\\\\021*\\\\255\\\\227\\\\275X\\\\335\\\\200\\\\320\\\\020b\\\\327wC\\\\220\\\\252^\\\\324\\\\363\012lY\\\\327\\\\313c\\\\327k\\\\033Z\\\\315[\\\\352\\\\226^8\\\\363s\\\\202\\\\013\\\\347\\\\002}\\\\236\\\\0069\\\\333\\\\033Oa8\\\\235\\\\325\\\\311\\\\261\\\\312Q6\\\\314Z\\\\370t\\\\301\\\\224\\\\353\\\\300\\\\237\\\\245\\\\345\\\\236\\\\034gy\\\\343)\\\\341\\\\242\\\\351\\\\306)\\\\213K\\\\306\\\\2600\\\\010\\\\020\\\\221+M\\\\310=\\\\204\\\\340\\\\213/\\\\276xxx\\\\330\\\\357v\\\\3030TEi\\\\035y\\\\357\\\\217\\\\307#\\\\221\\\\365~\\\\320\\\\216\\\\355\\\\027\\\\363\\\\3710\\\\014u]\\\\277z\\\\365j\\\\273\\\\337\\\\375\\\\376\\\\367\\\\277/\\\\313\\\\362\\\\305\\\\027\\\\257\\\\257\\\\257\\\\257\\\\215-\\\\214+6\\\\273\\\\343\\\\340\\\\243\\\\020\042\\\\030\042J\\\\303\\\\300\\\\370$/\\\\230\\\\177o\\\\216\\\\204$\\\\200\\\\247\\\\370\\\\177}S\\\\255'y>d\\\\266(t\\\\362\\\\022\\\\2401\\\\206\\\\307\\\\372\\\\264g2\\\\255\\\\307\\\\344\\\\226\\\\235\\\\004z\\\\024\\\\323i\\\\202\\\\364\\\\230\\\\344\\\\036\\\\307X^\\\\266R\\\\230U^\\\\247\\\\353O\\\\036\\\\0333kF\\\\203\\\\231\\\\325\\\\303\\\\323\\\\014HbRq\\\\326\\\\221\\\\236*\\\\0314Q\\\\220\\\\022[{J\\\\321\\\\033c\\\\322\\\\321\\\\007\\\\224\\\\242(\\\\353\\\\272\\\\236\\\\256\\\\334u]Y\\\\226\\\\347w(\\\\314\\\\2222i<\042*\\\\034\\\\357dM1k-\\\\272\\\\214\\\\325\\\\030\\\\000\\\\300\\\\0141\\\\262\\\\371\\\\366\\\\233\\\\227\\\\200\\\\206lU\\\\327\\\\313\\\\371\\\\305z\\\\261X\\\\003\\\\271\\\\256\\\\217\\\\217\\\\333\\\\375\\\\303fw8\\\\366Q\\\\330\\\\220ED$C\\\\306\\\\234\\\\263\\\\300\\\\340(\\\\246O\\\\234\\\\2213\\\\327\\\\015\\\\021@\\\\341\\\\271S\\\\004t\\\\312\\\\005f\\\\363M\\\\015O\\\\302\\\\214\\\\000\\\\311]q\\\\306\\\\313\\\\262\\\\362b\\\\235i\\\\036u\\\\015\\\\247\\\\257\\\\023mj\\\\223=?\\\\034E#\\\\347\\\\2209\\\\027\\\\003[\\\\243\\\\205O\042\\\\302\\\\221_\\\\275\\\\272)\\\\034\\\\315f\\\\325z\\\\275bN)\\\\204\\\\355v\\\\263X\\\\314\\\\230y\\\\277?t]\\\\247A\042\\\\375]\\\\267\\\\237>\\\\375\\\\364\\\\323\\\\033\\\\026\\\\276\\\\271\\\\271\\\\251\\\\352\\\\352\\\\341\\\\361\\\\021\\\\021\\\\321\\\\330Y=[_]\\\\277|\\\\361\\\\252\\\\251k$\\\\024\\\\000fN\\\\303@D\\\\002I3\\\\372\\\\223\\\\254\\\\235\\\\215\\\\315\\\\331@\\\\011\\\\235\\\\206j\\\\244!\\\\315\\\\314\\\\016\\\\230\\\\331v]=\\\\253\\\\352Z\\\\001i@\\\\024B\\\\230\\\\306\\\\374\\\\\\\\\\\\224\\\\317\\\\245\\\\231\\\\237m\\\\241\\\\243\\\\303}na\\\\343\\\\0317\\\\322\\\\351vDd\\\\242\\\\377\\\\032m\\\\334I\\\\361\\\\247\\\\224T\\\\240\\\\225u\\\\016\\\\264m\\\\253\\\\241\\\\310\\\\011'\\\\216\\\\037M\\\\240\\\\211h\\\\252X\\\\313\\\\370\\\\211\\\\034\\\\240\\\\021\\\\001\\\\004c\\\\255\\\\321RK\\\\015\\\\255\\\\210H\\\\327ueYi\\\\017!\\\\000\\\\315\\\\2172\\\\013#QUU\\\\353\\\\365\\\\272\\\\264E\\\\337\\\\015HY\\\\2465?\\\\2577\\\\334\\\\367\\\\275\\\\000\\\\314\\\\347\\\\363\\\\252\\\\252\\\\024\012k\\\\214\\\\261C\\\\000STU='S\\\\370 \\\\307\\\\256\\\\375t\\\\267\\\\371\\\\370\\\\351^\\\\300\\\\0161\\\\262\\\\240q%\\\\021F\\\\026\\\\021\\\\246\\\\261\\\\327b\\\\2167\\\\237\\\\233\\\\031z\\\\234\\\\322XO07\\\\372\012\\\\215\\\\370g\\\\030\\\\303\\\\307\\\\243\\\\324\\\\303\\\\351\\\\204\\\\374am\\\\256r\\\\246lt\\\\210\\\\365\012\\\\347\\\\213\\\\007G7\042o\\\\262\\\\271\\\\376\\\\317Z;\\\\006Q@\\\\201\\\\210\\\\372\\\\374\\\\273\\\\357\\\\376\\\\366\\\\253\\\\257\\\\276j\\\\017\\\\373\\\\252*\012g\\\\366\\\\373}\\\\032\\\\006\\\\000\\\\270\\\\277\\\\277w\\\\316t}\\\\027cl\\\\333CY\\\\226\\\\306\\\\320l\\\\326\\\\030C\\\\266,D\\\\344\\\\342\\\\342\\\\342\\\\305\\\\253\\\\227\\\\363\\\\345\\\\302\\\\331\\\\342\\\\307\\\\367o\\\\037\\\\037\\\\037q\\\\177\\\\210I\\\\266\\\\273}\\\\273?D\\\\037\\\\233\\\\252l\\\\326\\\\227}\\\\333\\\\016C\\\\327\\\\367>/\\\\305,\\\\037\\\\214\\\\232\\\\367yB\\\\213q\\\\346>\\\\212VA\\\\301\\\\010\\\\245\\\\002\\\\000\\\\200q\\\\362b\\\\214Q\\\\373\\\\234(-\\\\357\\\\351\\\\207\\\\237d\\\\361\\\\374\\\\311\\\\244\\\\203EN \\\\350s\\\\255L\\\\237e\\\\357\\\\247\\\\023&\\\\365|\\\\276f\\\\364\\\\305)\\\\0273\\\\026\\\\0070\\\\200\\\\035C\\\\226\\\\000\\\\032\\\\035\\\\227\\\\010\042\\\\200\\\\344\\\\\\\\\\\\031\\\\000\\\\264\\\\276\\\\016DB\\\\360b\\\\251,\\\\313\\\\302\\\\225\\\\30764M\\\\271\\\\272\\\\2744H\\\\207\\\\303A\\\\327\\\\2571\\\\2244^\\\\000\\\\014\042$j\\\\342\\\\032a4\\\\306\\\\205\\\\020\\\\373\\\\3363k=\\\\0352\\\\003\\\\221\\\\311\\\\274\\\\226\\\\202D\\\\326\\\\271\\\\322{\\\\037#[\\\\264\\\\263$\\\\366x\\\\014mw|\\\\330\\\\034\\\\266\\\\273v\\\\337\\\\015@\\\\206\\\\214sd\\\\26503\\\\244(1\\\\202\\\\010\\\\223\\\\021\\\\363|\\\\367\\\\237v1\\\\231$h|}\\\\3024\\\\302\\\\231Ipz7W\\\\331\\\\347\\\\264\\\\236\\\\214r)rB\\\\223i\\\\254\\\\177\\\\344Z\\\\371,z \\\\272i>\\\\305r\\\\234\\\\002\\\\020Z\\\\337\\\\232\\\\263S\\\\256\\\\260\\\\027\\\\027\\\\027eY\\\\356v[\\\\224ts\\\\363\\\\332Y:\\\\036\\\\213\\\\202\\\\260\\\\252\\\\213\\\\273O\\\\037\\\\327\\\\353uY\\\\326\042\\\\262y\\\\334\\\\205\\\\020\\\\020\\\\315r\\\\271T\\\\362m\\\\015\\\\240>>>\\\\336\\\\337\\\\337;[\\\\334~\\\\374\\\\024\042?l\\\\367!@3+\\\\255u\\\\006\\\\245\\\\260\\\\264\\\\230\\\\325\\\\263\\\\272l[\\\\267\\\\337\\\\037\\\\373\\\\276?\\\\017\\\\267?=\\\\350\\\\354\\\\311SF\\\\262Q\\\\352\\\\000\\\\311\\\\270\\\\022\\\\215M,\\\\014\\\\304\\\\034\\\\001\\\\322\\\\271PN\042xnE\\\\374\\\\334\\\\343\\\\317\\\\330\\\\331\\\\232r;\\\\251\\\\247Qa\\\\213\\\\210VwO\\\\306\\\\200&\\\\253\\\\365\\\\004\\\\355\\\\251\\\\360L\\\\372E\\\\024\\\\253\\\\243;\\\\267\\\\022\\\\331\\\\210\\\\210rC\\\\203$`Tnlt\\\\316]\\\\\\\\\\\\\\\\\\\\264\\\\355a\\\\177\\\\330\\\\315f\\\\263o\\\\276\\\\371\\\\306\\\\222\\\\371\\\\364\\\\351\\\\223\\\\202\\\\375\\\\233\\\\2469-\\\\244\\\\311\\\\347\\\\0250\\\\306Xk\\\\367\\\\307\\\\303\\\\361x\\\\2141j\\\\271\\\\212\\\\336LQ\\\\024\\\\011\\\\344x\\\\3148\\\\376\\\\262,C\\\\010v\\\\030\\\\260\\\\367\\\\2019\\\\034\\\\332\\\\376qs\\\\334\\\\356\\\\217\\\\201\\\\221\\\\234\\\\033\\\\372\\\\000d$\\\\303T\\\\320h\\\\3335\\\\244\\\\350{|\\\\252#\\\\363\\\\020\\\\217\\\\314(O\\\\226\\\\276\\\\216\\\\365S\\\\233\\\\344\\\\244<\\\\246\\\\2419\\\\237\\\\030\\\\215\\\\\\\\'\\\\025u\\\\321\\\\356$\\\\317\\\\276)\\\\327\\\\324\\\\215I\\\\340'\\\\212\\\\034\\\\224\\\\247C\\\\273`*\\\\236\\\\030\\\\210H\\\\300\\\\324u}qq\\\\201\\\\210EQ4U\\\\361\\\\376\\\\375\\\\373\\\\262\\\\260\\\\363\\\\371\\\\254(\\\\2127o\\\\336\\\\224\\\\316j\\\\035\\\\362l6c\\\\211\\\\211\\\\303\\\\320\\\\267\\\\336\\\\367\\\\253\\\\325:\\\\306h\\\\234\\\\335\\\\037\\\\017\\\\267\\\\267\\\\267\\\\307\\\\256m\\\\352\\\\331/~\\\\361\\\\213?\\\\376\\\\353\\\\237g\\\\263\\\\312\\\\271\\\\362\\\\372\\\\346\\\\345l6k\\\\333n\\\\263\\\\331<>\\\\334\\\\275~\\\\375\\\\232\\\\024T(i\\\\030\\\\206\\\\224\\\\242JCF\\\\032=\\\\251\\\\216\\\\001x:\\\\224\\\\222I\\\\005P\\\\035\\\\014U\\\\317\\\\352\\\\017\\\\020Q\\\\322N\\\\3321\\\\235\\\\013\\\\364df\\\\234\\\\313\\\\372\\\\223\\\\025\\\\362Y\\\\350z:\\\\210\\\\236(\\\\002\\\\030U\\\\373)\\\\002\\\\230\\\\322t\\\\362T\\\\3412IsV\\\\363\012n\\\\220\\\\211=X7C\\\\0141j5\\\\241^S\\\\013\\\\310\\\\257\\\\3267_}\\\\363\\\\365\\\\376x\\\\340$\\\\206lY\\\\026z\\\\347M\\\\323\\\\244\\\\024\\\\230#\\\\032\\\\213\\\\210\\\\242\\\\013O\\\\341\\\\257\\\\3113\\\\307\\\\276o\\\\273\\\\356\\\\010\\\\000)\\\\225z\\\\237\\\\271\\\\025'B\\\\032\\\\035-\\\\035%\\\\333\\\\314.w\\\\307\\\\303v\\\\273;\\\\264\\\\335\\\\3768\\\\364>E\\\\000\\\\213\\\\006\\\\215%\042\\\\006J)%N \\\\222\\\\230Cb\\\\262D\\\\275VvT\\\\000\\\\000\012\\\\373IDAT\\\\360\\\\\\\\\\\\015\\\\000d\\\\364-\\\\234\\\\0114\042\\\\002\\\\347\\\\372\\\\212\\\\317\\\\344\\\\377L>\\\\247|\\\\312\\\\231W\\\\227\\\\015\\\\014MAAb\\\\226\\\\023+\\\\370\\\\023\\\\203C\\\\236)\\\\271\\\\247J\\\\013\\\\310\\\\030\\\\000f\\\\211\\\\302<\\\\014\\\\3030t\\\\273\\\\307\\\\207\\\\020\\\\374W_\\\\274\\\\352\\\\373\\\\366j\\\\275\\\\212i\\\\230\\\\225\\\\257\\\\212\\\\242\\\\010~\\\\370\\\\364\\\\351S\\\\337\\\\367/_\\\\276D4\\\\213\\\\305\\\\202\\\\320\\\\206\\\\020\\\\336\\\\274y\\\\243e\\\\227\\\\307\\\\343q\\\\273\\\\335Zk\\\\377\\\\374\\\\341SQW\\\\327\\\\327/X\\\\304\\\\3738\\\\364mY\\\\330\\\\233\\\\233\\\\365\\\\325\\\\325z\\\\267\\\\333\\\\304\\\\310\\\\306`\\\\341\\\\254u\\\\306\\\\017jH\\\\213\\\\265\\\\3449\\\\216dyO\\\\022=g\\\\322\\\\234\\\\177\\\\201B\\\\214\\\\000\\\\210\\\\254\\\\023\\\\300\\\\310\\\\311\\\\232B\\\\215.k\\\\255\\\\3779\\\\201>\\\\267\\\\020\\\\236_\\\\026d\\\\332(\\\\316\\\\365\\\\272\\\\232\\\\255\0422\\\\321\\\\212B6\\\\213\\\\315\\\\024\\\\353\\\\230\\\\226\\\\212\0421\\\\264\\\\365\\\\211\\\\326VM\\\\327\\\\001\\\\000\\\\255[\\\\033\\\\363eZ\\\\017\\\\301D\\\\004`N\\\\321(\\\\021\042*\\\\313r\\\\275^\\\\033\\\\343D\\\\260,\\\\313\\\\246\\\\251\\\\021Q\\\\021\\\\333:\\\\211\\\\032\\\\304\\\\240\\\\014\\\\326E\\\\0219\\\\034\\\\016\\\\332\042V%8\\\\214\\\\207\\\\006\\\\221\\\\311Ye\\\\343\\\\325Hb\\\\3234\\\\366as\\\\034|\\\\350z\\\\336\\\\035\\\\372\\\\301'cKR\\\\224\\\\032bH\\\\302\\\\034@;k \\\\202!!!Tn\\\\344\\\\223\\\\261Ec\\\\201\\\\361i\\\\3242\\\\223\\\\011\\\\013\\\\2625&\\\\347\\\\274\\\\247A\\\\317\\\\010$=\\\\361$\\\\210j{@.\\\\202C\\\\035_\\\\030]@\\\\312\\\\354\\\\312\\\\0112*\\\\032@3\\\\352y\\\\034\\\\031\\\\000x$]\\\\322n\\\\322\\\\352\\\\010\\\\253+h\\\\254%\\\\242\\\\273\\\\273;\\\\022\\\\250\\\\252\\\\362\\\\217\\\\177\\\\374\\\\323\\\\227_\\\\276\\\\374\\\\372\\\\353\\\\257/V\\\\363\\\\335\\\\375\\\\343\\\\303\\\\303\\\\303\\\\367\\\\277\\\\374N\\\\331\\\\266c\\\\214}\\\\357\\\\037\\\\036\\\\036R\\\\024\\\\347\\\\334r9_.\\\\347\\\\333\\\\375\\\\341\\\\342\\\\342\\\\342\\\\253/\\\\277>\\\\036\\\\217w\\\\367\\\\017\\\\333\\\\355\\\\276m\\\\373\\\\256\\\\017JI\\\\360\\\\227?A\\\\263pm\\\\033\\\\226\\\\313:F\\\\036\\\\206\\\\241i\\\\232\\\\276m5BVW\\\\345\\\\3610XK\\\\326Y\\\\026\\\\364\\\\336\\\\203 \\\\345\\\\260\\\\227\\\\344\\\\330\042\\\\022\\\\031\\\\313I\\\\200\\\\023\\\\000AQ\\\\024U-\\\\271\\\\030\\\\033\\\\2430\\\\032kI\\\\224\\\\376\\\\020\\\\316\\\\234\\\\026\\\\000\\\\320-Xu\\\\347$=g\\\\022|R=O\\\\354\\\\204\\\\3212\\\\236V\\\\205\\\\265\\\\266(\012\\\\357}Y\\\\226J\\\\227o\\\\234K!D\\\\357\\\\253\\\\305B\\\\331\\\\024\\\\312\\\\262t\\\\316\\\\251_\\\\350\\\\234;\\\\036\\\\217d\\\\213i\\\\223T\\\\343\\\\034D\\\\000\\\\010$\\\\245\\\\224\\\\327\\\\230\\\\376\012f>\\\\036\\\\217\\\\257\\\\355\\\\027\0422\\\\004\\\\377\\\\260y\\\\214)\\\\364~(\\\\013\\\\2537OD)x\\\\001\\\\375\\\\270\\\\250\\\\263H\\\\326\\\\034\\\\217\\\\307\\\\230<\\\\031\\\\250\\\\252\\\\002I\\\\016\\\\207\\\\235Z\\\\027EQ0\\\\200RG\\\\327u\\\\255\\\\305\\\\341v\\\\273;\\\\016!\\\\264m7\\\\370\\\\344c\\\\002\\\\0224\\\\2269\\\\031W\\\\236U\\\\021\\\\253\\\\315\\\\017\\\\331\\\\2448\\\\323\\\\304O\\\\255\\\\211\\\\2379x\\\\252\\\\321\\\\370\\\\271#o\\\\300\\\\212/\\\\322\\\\307\\\\363PW~\\\\246\\\\265D?\\\\343\\\\372\\\\214\\\\363\\\\361\\\\304\\\\360\\\\320#F%\\\\373RQ\\\\261\\\\3169\\\\000IIR\\\\212\\\\263YSU\\\\305|>\\\\337\\\\355v\\\\373\\\\375\\\\316\\\\267G\\\\245(^,\\\\026\\\\353\\\\365z\\\\267\\\\333\\\\035\\\\016\\\\255\\\\2108W\\\\224e\\\\311\\\\314EQl\\\\267\\\\333\\\\313\\\\313\\\\313\\\\256\\\\353nnn^\\\\277~\\\\315\\\\314`\\\\354\\\\343\\\\343#3\\\\373\\\\020nn.\\\\310\\\\200\\\\237\\\\373n\\\\030R\\\\030\\\\000\\\\240\\\\335\\\\267Ee\\\\332}\\\\232\\\\315\\\\014\\\\307h\\\\0358g4\\\\223\\\\346\012\\\\243\\\\016\\\\242\\\\367\\\\003\\\\210P\\\\306\\\\205\\\\010\\\\307\\\\010\\\\200\\\\000\\\\004\\\\2660\\\\256@2B\\\\352\\\\036\\\\010\\\\203\\\\234:]=\\\\335\\\\030\\\\237\\\\214\\\\325\\\\3230\\\\\\\\~~\\\\202+=Q\\\\253r6s\\\\223\\\\262\\\\327\\\\260\\\\235r\\\\006TU5\\\\014\\\\003\\\\032c\\\\313\\\\222s\\\\001\\\\321\\\\311\\\\346\\\\316\\\\323\\\\247\\\\325+\\\\343\\\\266\\\\222\\\\313\\\\330\\\\000\\\\247\\\\000\\\\217 \\\\013$\\\\020# !\\\\204\\\\276\\\\357g\\\\263\\\\331r\\\\261B\\\\304\\\\246\\\\231\\\\317\\\\232yQ\\\\024 <\\\\242\\\\373G\\\\013\\\\336\\\\020\\\\216\\\\354\\\\005\\\\205u\\\\303\\\\3201\\\\237x\\\\032\\\\214\\\\305\\\\251\\\\216A\\\\303%\\\\254=\\\\300\\\\265\\\\365\\\\367\\\\356\\\\320\\\\206\\\\024\\\\275\\\\0171\\\\011H\\\\256y&$d\\\\311\\\\177p\\\\0260\\\\226\\\\034c\\\\320\\\\327E\\\\236\\\\330\\\\023\\\\223\\\\312\\\\2251M c\\\\370\\\\014\\\\2631}\\\\022\\\\270sb+\\\\031\\\\243x(9\\\\373\\\\235\\\\303\\\\231\\\\254\\\\325J'\\\\326\\\\216\\\\334\\\\231\\\\376\\\\214_f\\\\034A\\\\2754OY4\\\\021\\\\311lZ\\\\244\\\\350s\\\\253em\\\\220\\\\340x<r\\\\214\\\\367\\\\367\\\\367\\\\263\\\\246\\\\2121\\\\260\\\\037\\\\\\\\a\\\\010\\\\344\\\\355\\\\333\\\\267\\\\357\\\\337\\\\177\\\\354\\\\373\\\\036\\\\301\\\\\\\\\\\\\\\\\\\\\\\\\\\\210\\\\340~\\\\177\\\\254g\\\\025\\\\261\\\\321l\\\\331c\\\\267\\\\361\\\\336\\\\177\\\\377\\\\375\\\\367777\\\\312\\\\006\\\\373\\\\366\\\\355\\\\333v\\\\350\\\\211h6k\\\\232\\\\246\\\\021\\\\204\\\\343\\\\376\\\\320\\\\366=\012\\\\314\\\\227\\\\213\\\\277\\\\374\\\\371\\\\307\\\\237\\\\336\\\\274\\\\333\\\\035\\\\007W\\\\222\\\\357C\\\\256\\\\3163\\\\250]\\\\217\\\\235%\\\\311\\\\345*\\\\271N\\\\015\\\\020\\\\3019[\\\\226\\\\306:\\\\314\\\\316.1\\\\260\\\\246\\\\353t\\\\240\\\\350\\\\331\\\\202\\\\177\\\\346\\\\215\\\\234\\\\035\\\\223\\\\026\\\\237l\\\\022\\\\034\\\\343\\\\312S\\\\274b:gR\\\\336\\\\326\\\\332\\\\276\\\\357\\\\225\\\\246H5\\\\261\\\\246\\\\006\\\\3613\\\\233[\\\\306*\\\\0368\\\\225')\\\\303\\\\002Op(\\\\275&\\\\241\\\\010\\\\213\\\\367\\\\375\\\\261\\\\335\\\\357\\\\367\\\\373!\\\\006H<\\\\014\\\\003.\\\\027DD\\\\200\\\\326\\\\022sdfN\\\\021\\\\246^\\\\246!\\\\016]\\\\317.\\\\035\\\\216\\\\373a\\\\350\\\\020\\\\321{6\\\\006\\\\255%\\\\037=3\\\\013$\\\\343Jk\\\\011\\\\200C\\\\360)%\\\\347\\\\2341\\\\345*\\\\206\\\\024\\\\265\\\\006\\\\333d\\\\340\\\\325\\\\371B\\\\027\\\\311<[\\\\343 \\\\346W\\\\236\\\\215\\\\351\\\\270R\\\\237\\\\034\\\\250-&&8\\\\350\\\\331p\\\\344e\\\\235\\\\237\\\\321\\\\031\\\\364H5\\\\307\\\\230c\\\\300)\\\\327\\\\010HBz\\\\033J\\\\356\\\\210\\\\210\\\\204\\\\243\\\\264?\\\\3377\\\\000\\\\3009\\\\207$\\\\323\\\\342ff\\\\000\\\\255\\\\036gC\\\\330u\\\\375\\\\253\\\\227/\\\\211\\\\260.+\\\\357\\\\375\\\\254i\\\\000\\\\344\\\\342b\\\\265^\\\\257g\\\\263\\\\2711\\\\006\\\\221\\\\232\\\\246\\\\0111\\\\334\\\\337\\\\337\\\\017\\\\203\\\\257\\\\252\\\\252,\\\\312\\\\373\\\\373\\\\373W\\\\257_\\\\317\\\\347sm\\\\021\\\\262\\\\335n_\\\\274\\\\270\\\\336\\\\355\\\\367\\\\313\\\\213y\\\\214\\\\001@\\\\014\\\\331\\\\253\\\\365\\\\372f}}8\\\\036\\\\257\\\\257\\\\257\\\\276\\\\371\\\\346\\\\233\\\\227/\\\\327m\\\\333\042$@ \\\\022BL)\\\\305\\\\230\\\\000X\\\\233\\\\263\\\\033c\\\\300\\\\030A\\\\002\\\\343lY\\\\271\\\\242\\\\002c\\\\224\\\\351_F*\\\\217\\\\317}\\\\225g\\\\307\\\\3476t\\\\266\\\\276\\\\360\\\\364\\\\326\\\\244e\\\\237}d\\\\352D?\\\\351u\\\\265\\\\260\\\\325tV\\\\351\\\\237V\\\\302\\\\363\\\\305\\\\243VMN\\\\017\\\\210(\\\\036O\\\\022\042\\\\000&V\\\\246L2\\\\002\\\\212\\\\347\\\\260\\\\277\\\\376\\\\3767w\\\\017\\\\217\\\\222\\\\322ju1k\\\\232\\\\337\\\\377\\\\376w\\\\0100\\\\245\\\\300X\\\\247\\\\036\\\\015\042\\\\026\\\\256\\\\250\\\\252\\\\212%=<\\\\334y\\\\037\\\\210(%\\\\355\\\\272I]\\\\327\\\\212\\\\232\\\\261 EQ:\\\\347T[\\\\031cl\\\\357\\\\203\\\\2100G\\\\335\\\\273\\\\231Y\\\\220G\\\\375\\\\232Eg\\\\354\\\\2126\\\\015\\\\031\\\\312y\\\\241\\\\353\\\\350\\\\377\\\\351\\\\263\\\\347\\\\2025I\\\\347\\\\323\\\\321?_\\\\356\\\\347R\\\\236\\\\230al\\\\351\\\\015\\\\271\\\\337\\\\022\\\\216\\\\302\\\\257q\\\\272\\\\374\\\\255\\\\010B2\\\\252~9\\\\361\\\\354\\\\313X\\\\016M\\\\306\\\\001S\\\\014!j\\\\212\\\\325\\\\271\\\\345r\\\\231\\\\374`\\\\014V\\\\205+K\\\\007\\\\032\\\\226\\\\267\\\\366\\\\372z}\\\\261\\\\234\\\\277\\\\177\\\\377>\\\\370\\\\004\\\\222\\\\234+\\\\235\\\\303\\\\335n\\\\337\\\\266\\\\333zV\\\\315\\\\347\\\\363\\\\327\\\\257\\\\277\\\\254\\\\252\012\\\\201noo\\\\233jf\\\\311\\\\315\\\\352\\\\306\\\\030SV\\\\305l6[-\\\\227\\\\363\\\\2729\\\\034\\\\016~\\\\360\\\\306\\\\270\\\\355\\\\343c\\\\357\\\\212\\\\322\\\\331\\\\272\\\\256v\\\\333\\\\375\\\\315\\\\372\\\\362\\\\365\\\\377\\\\374?\\\\375\\\\360\\\\303\\\\017m7\\\\364}\\\\037#\\\\267m\\\\273\\\\331\\\\355\\\\373^\\\\353^\\\\015\\\\201\\\\035[\\\\015[%\\\\366\\\\324\\\\242EA\\\\222\\\\224q\\\\317\\\\002\\\\230\\\\003\\\\363O\\\\005wz\\\\362,Dx\\\\376\\\\372\\\\271@O\\\\343\\\\217\\\\237\\\\035\\\\252\\\\024\\\\264\\\\330\\\\211\\\\231C\\\\010UU\\\\351\\\\276\\\\257\\\\022Cc\\\\375\\\\262&A\\\\000\\\\300\\\\030s\\\\342\\\\364\\\\036\\\\361\\\\005\\\\222\\\\313\\\\250\\\\316\\\\356\\\\007\\\\363\\\\016\\\\023\\\\302\\\\320\\\\266\\\\275snp\\\\271\\\\013TJI\\\\221\\\\002,\\\\321\\\\030\\\\002\\\\260)%I\\\\234\\\\375\\\\007\\\\225G\\\\024c\\\\321X\\\\224(\\\\314)\\\\306\\\\020\\\\202\\\\317\\\\331\\\\370\\\\004)\\\\005\\\\021\\\\2475\\\\266!\\\\210\\\\2251\\\\267DD9\\\\3320\012\\\\334t\\\\247\\\\272\\\\203\\\\347x\\\\205y\042\\\\262\\\\247\\\\001\\\\202\\\\323Vxz\\\\324\\\\324\\\\312_\\\\317[\\\\237\\\\217\\\\257\\\\376\\\\362\\\\323\\\\0028\\\\255\\\\004\\\\316o\\\\001*):\\\\214\\\\021\\\\326sC\\\\360\\\\331t\\\\252\\\\342\\\\001\\\\000\\\\355g#\042u]\\\\277|\\\\371\\\\222\\\\203\\\\337\\\\355v\\\\300\\\\351\\\\353\\\\257\\\\377f\\\\350\\\\332\\\\272\\\\256\\\\3230\\\\314\\\\347\\\\363\\\\302U\\\\353\\\\365\\\\272\\\\357\\\\374\\\\335\\\\335\\\\335v\\\\273_,\\\\026M\\\\3234M\\\\02396M#\\\\202]\\\\327um\\\\177qq\\\\241#\\\\263\\\\335n\\\\325\\\\357\\\\276\\\\277\\\\277\\\\027Iww\\\\237\\\\234s\\\\316R\\\\212\\\\361z}5\\\\014C\\\\214\\\\361\\\\376\\\\366\\\\256jj\\\\315o}\\\\375\\\\305\\\\227\\\\207\\\\256\\\\035\\\\206\\\\001\\\\3200\\\\363f\\\\263y\\\\363\\\\356\\\\303\\\\335\\\\335\\\\026X\\\\022$\\\\355=B\\\\306\\\\010\\\\2206bQ\\\\205\\\\361l\\\\354&\\\\223\\\\343\\\\231\\\\237\\\\007'\\\\342\\\\207\\\\347\\\\307\\\\024H>\\\\237\\\\027\\\\021Q\\\\005|\\\\376\\\\226\\\\212\\\\201*ce\\\\027\\\\300\\\\3215WG\\\\360\\\\374\\\\263\\\\372\\\\3349\\\\3079Fq\\\\222]\\\\235#fF\\\\022\\\\365\\\\345\\\\001,\\\\231,\\\\\\\\\\\\037\\\\357nC\\\\01012\\\\353\\\\026\\\\212'\\\\243\\\\021\\\\021\\\\211\\\\324U\\\\315;j\\\\2141\\\\245 \\\\2421.F\\\\304\\\\304a\\\\030D\\\\177\\\\224\\\\336\\\\177L\\\\336{;\\\\345\\\\306\\\\355t\\\\252\\\\356\\\\034\\\\252\\\\374\\\\211\\\\0108\\\\0013j\\\\027\\\\003~\\\\302\\\\217\\\\375\\\\371\\\\346\\\\016O\\\\345\\\\373\\\\3544\\\\015'O\\\\021\\\\251\\\\237\\\\011\\\\341e\\\\271\\\\377k\\\\307\\\\370u\\\\2318FSV\\\\240[\\\\301\\\\323\\\\264\\\\3054\\\\307$p\\\\326\\\\346P\\\\367\\\\331\\\\030\\\\243\\\\265\\\\366\\\\342\\\\342\\\\302\\\\002\\\\335\\\\335\\\\335\\\\031\\\\220\\\\261\\\\2053\\\\247\\\\224>~\\\\374\\\\270\\\\230\\\\315\\\\367\\\\373\\\\275\\\\206\\\\220\\\\346\\\\363\\\\371|\\\\2768\\\\036\\\\272\\\\355\\\\356q\\\\265^\\\\335\\\\335\\\\335}\\\\372t\\\\3274\\\\215\\\\263\\\\305\\\\353\\\\327\\\\257\\\\177\\\\370\\\\341\\\\207\\\\020\\\\002\\\\0210\\\\363\\\\352\\\\362\\\\002\\\\000,\\\\231>\\\\204\\\\030B\\\\3234\\\\205u\\\\037\\\\336\\\\275\\\\275\\\\277\\\\277\\\\177\\\\365\\\\352\\\\325zu\\\\211\\\\206\\\\266\\\\333mb\\\\227\\\\022\\\\033\\\\203UUh?\\\\316\\\\272.\\\\235s\\\\213\\\\305\\\\342\\\\323\\\\355&D\\\\0262\\\\326\\\\025h\\\\\\\\\\\\024`V\\\\016}\\\\006U1\\\\224;\\\\303\\\\344!}j\\\\033\\\\374\\\\254\\\\366\\\\325#\\\\377\\\\374\\\\263\\\\323&\\\\313a\\\\272\\\\202~j\\\\022e\\\\225\\\\022\\\\005\\\\261\\\\020\\\\221\\\\306:\\\\324\\\\375P\\\\363\\\\372\\\\231\\\\006!\\\\312\\\\375D\\\\307rH\\\\034k\\\\207\\\\230%Z4\\\\230\\\\203\\\\323'!q\\\\316\\\\315\\\\346\\\\363\\\\020\\\\202v\\\\256\\\\000\\\\000\\\\005\\\\232&\\\\326\\\\035`4\\\\224\\\\020SJ}\\\\337{\\\\337\\\\262D\\\\346\\\\010\\\\300\\\\210&\\\\245\\\\220 !\\\\201\\\\367\\\\203\\\\366K\\\\016!\\\\000(5\\\\236 \\\\242=\\\\377%\\\\372\\\\\\\\#\\\\275\\\\006\\\\317\\\\266\\\\2473\\\\351\\\\322\\\\356\\\\276\\\\237\\\\013\\\\3649\\\\250\\\\367\\\\354\\\\305\\\\323\\\\376\\\\370L\\\\243\\\\377U\\\\011FTk,\\\\177|\\\\3723$\\\\222\\\\013\\\\361G\\\\204%\\\\0103\\\\345\\\\355\\\\357<\\\\205\\\\226-~\\\\315\\\\360\\\\001\\\\200\\\\265V7*\\\\000P\\\\250\\\\356\\\\372\\\\372\\\\346\\\\341\\\\341\\\\341\\\\352r\\\\325\\\\266\\\\355\\\\262\\\\236\\\\275}\\\\367\\\\006\\\\005RJ\\\\313\\\\3452\\\\306\\\\270\\\\335\\\\036>~\\\\374X\\\\270\\\\352\\\\365\\\\353\\\\327\\\\207\\\\366PU\\\\325\\\\257\\\\177\\\\375\\\\353\\\\305b\\\\261\\\\335\\\\354\\\\266\\\\333m\\\\337\\\\373\\\\353\\\\353k\\\\021\\\\331\\\\357\\\\367\\\\375\\\\320-\\\\227s\042\\\\272\\\\274\\\\274l\\\\333\\\\303r9\\\\337\\\\336\\\\355\\\\256./\\\\227\\\\313\\\\345\\\\207\\\\017\\\\037bd\\\\000h\\\\3463\\\\024\\\\2101Z\\\\242\\\\200\\\\322\\\\367mb \\\\242\\\\331\\\\2546\\\\205\\\\353\\\\007\\\\356z\\\\037\\\\005\\\\254+\\\\004M\\\\364ID\\\\220P\\\\342\\\\331f\\\\365d\\\\340~&\\\\324\\\\243\\\\277\\\\353\\\\331\\\\310\\\\353s\\\\343\\\\3149\\\\204\\\\003F\\\\3056)`=w*_U\\\\212:e\\\\352\\\\327\\\\340nY\\\\226}\\\\337O\\\\353d\012\\\\327B&\\\\015A\\\\244\\\\\\\\2\\\\214\\\\360\\\\004w\\\\203$\\\\3108u\\\\032\\\\001d\\\\021>\\\\034\\\\016\\\\032\\\\321_\\\\255\\\\346\012:WIS\\\\240\\\\211\\\\214\\\\365\\\\205z\\\\207}\\\\337\\\\247\\\\024\\\\246\\\\215\\\\310Z\\\\253\\\\300k\\\\347\\\\\\\\\\\\337\\\\015EQ\\\\320X\\\\000/c\\\\302\\\\362\\\\377\\\\001NIU\\\\225\\\\016\\\\376\\\\034\\\\350\\\\000\\\\000\\\\000\\\\000IEND\\\\256B`\\\\202 www.murrayc.com return record["name_first"] + " " + record["name_last"];
        1 Sprocket Version 2 0 Like the previous X, but big. Project Big X
        1 1 0 0 0 0 3 0 0 Tester 4 2 0 Quality Manager 0 Quality Assurance 1 New features and bug fixing. Software Development
        glom-1.22.4/examples/example_smallbusiness.glom0000644000175000017500000307651612234776363023120 0ustar00murraycmurrayc00000000000000 8 Polar Bear Mr 123 Zoo Street Zooville Netherlands Z123 ABC 1987-03-08 Thanks to Marieke IJsendoorn-Kuijpers for the CC-licensed picture from http://www.flickr.com/photos/mape_s/350700095/ Polar Bear \377\330\377\340\000\020JFIF\000\001\001\001\000H\000H\000\000\377\333\000C\000\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\003\002\002\002\002\002\004\003\003\002\003\005\004\005\005\005\004\004\004\005\006\007\006\005\005\007\006\004\004\006\011\006\007\010\010\010\010\010\005\006\011\012\011\010\012\007\010\010\010\377\333\000C\001\001\001\001\002\002\002\004\002\002\004\010\005\004\005\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\377\300\000\021\010\001T\001\364\003\001\021\000\002\021\001\003\021\001\377\304\000\036\000\000\002\003\001\001\001\001\001\001\000\000\000\000\000\000\000\006\007\005\010\011\004\003\002\012\001\000\377\304\000G\020\000\001\003\003\003\002\004\004\003\006\003\007\004\001\003\005\001\002\003\004\005\006\021\000\022!\0071\023\042AQ\010\024aq2\201\221\025#B\241\261\360Rb\301\011\026$3\321\341\361\027Sr\202C\030%s\222&45T\377\304\000\034\001\000\002\003\001\001\001\001\000\000\000\000\000\000\000\000\000\003\004\001\002\005\006\000\007\010\377\304\000:\021\000\001\004\001\003\002\004\003\010\003\001\000\002\002\002\003\001\000\002\003\021!\004\0221\005A\023\042Qaq\221\360\006\0242\201\241\261\301\321#B\341\361\0253$R\026b\007r\222\377\332\000\014\003\001\000\002\021\003\021\000?\000\251\326\204**)\351q\330n\204\220\011\337\234\234\216\330\317\367\203\257\320 \200r\276y\367`\017\227\205\376\252M\263bH\010R\344\262\254\235\300d\244\372\363\337\353\253=\341]\372`\320/\026\247[\273\355\272TD\226YT\242?\016P\221\317\334\375\364\263\346\003\205gh\232\352#\2055G\276\340\270\004\235\261X\000\347i<\000>\335\316\274\311\303\2068^\020\026\022=Q\002\372\264\226\320~Y\001HH\307\015q\372\223\375\376z\360x\245'K\346\252\375\320\314\236\270\252\022\224J\337m\037\210\004\266\007\037\221:\033\365G\270Pt\240\345\307\010fO\304K\341\344\243l\365$\020\001\333\263\003\362\007\337C\373\343A\277U\007N\336W\253\335t}\330\245\037/5\265`s\277w\347\375\373\350\207S\301\010\202\006l\313r\227K\275\352\025\231\213q\022\237a\325`\250\2207(\372\344\215P\276\312]\316\027LSK\252N\217\021\331\016\312j<n\344\255~c\377\000N\332\363\310\002\311S\024\217\310\003\011x\273\266\015RS\321 \327\025\343\201\222[s\204\375\375?/\256\222:\316\301Y\260\177\270\302\236\245\326nj;\254\270\212\232\344\303\000d\2579\317\377\000\037\314\377\000\333Gf\241\325e\005\254\0154\344\316\207\361\010\365\037\303\216\344\345<\242\220\010\011\310\321\206\261\275\371Dv\221\271$\242\237\375x\254Ml.\031\220\244\0368H\307\257m\027\307\364ClL\002\234\215m\256\250U\237\330\353\305\267\232\340\020\244\234\376\243\373:\360v,\241x \376\024\370\244uN\230C-\312a,\273\337\003#\037\237\372\352\315}\214*\273JpHMx\375D\267\035\212\013\216\005g\203\365\357\355\375\361\250\245Q\011\007\205\017\376\373\331\016\270\242\363M\310#\370N\337/~u\002\357\012\316\210\372)\352mR\322\237!?&\321o\266x\311\375{\372\377\000-C\354\205F\260\002\215\345\305\267\374\004\255l)jP\307#\225{h@\225}\204\345\001J\246\323&\272\2445OIo\334\247#\277\276\2448\257\030\333Y\010F\265n\2426T\206\2667\2160q\264j9\345x\000\015vPQm95M\315\227[\216\2022I\356F}3\375\363\353\241\206VB\215\304\225\326\217\207\244\325\335\016\374\304g\225\216J\260FtB[\267\314\244\274\251V\276\031\250\360\234\361&5M\310\344\022\220\243\374\377\000>t&\311\037\242\251\244\306\267:unR\210m/4\333i\343\204\214\037\347\333\365\325\234k\205W\012\340\042z\305\275h3\035%N\266\245\177\224\347\337\270\374\373j\003\237\302\363XOd\274\024\333\016.J\212\012\3018;\010\373\363\357\351\242\357p+\316\212\312)\242U\254$\274\032\013\206\240\010\374\\\021\371s\257\0268\345TD\340)\024\276,)JS\261Q\005\011\340\214\201\203\337Un\360@+\336\036mE>\233\005\242\224,AR\277\312\241\375t[r\260h\265\353\022]\200\225'+J~\231\007\371\343\353\252\222\352\312\247\202\001\264L\335B\320\217\207#\250\251=\371 g\371\375\365A\270\362\250b'\013\255\273\322\327mE\245\210\304z\356\301\317\345\216\335\273\352\301\245@\211\177\\\275-\224/1\327\035\012\307`\006?\226\256\030NP\014.\031]\002\372\2428\202D\250\333\200\364<'\362\3216\000U\004D\250*\357Vm\032<e\027\244D}\315\271\362\270<\277\221\365\320\232\322\0128\323\244\034\257\212;65@\307xFR\263\334\343\324\343\260\037N\374h\273{\332\273!\011\221E\352\345\275r\260\225\307\371D#\031\030X\343\362\347PG\242\203\016Q+U\250n\235\315\230\356\023\316\022\240?O~\307R\320\245\354\007\220\244\022\344y\030IA\3062y\377\000]{\225B+\200\276UnB{\367\316)j\037\210\247\217o\177\357\376\226k\224?w!t3C\2447\302#\247w\257\004\237\246u\000\252=\275\324l\272\025\276\342\362\354vG<\005d\343\364\377\000\246\245\257*Lw\225\317*\334\240.1i\250T\366\210\035\366\366\375u\000\233\262\256\007b\226\362m(\361]R\320\250\250OpR\201\372\352\344\251\332\000\256\353\252<\012z\206\304DK\213H\374j\365\375?\277\347\252\233R\030\332\300\\R\255\210O,8\364o'r\001\004}\261\333^k\251x\264\025\346iTX@\237\001 \366%G\031\373\373\352l\234\257\006\200\276T\266\026\012\032BP\214q\201\375\216?\327^\026\212(\340\256\346\251\341\344\347h?S\334}\265;\227\214`\205\346\375\031\304p\204\255(=\210\347\364\367\325,U\250\241Hbl\042\204\2049\205\244\361\366>\335\365v\233CtC\224\0136\237\011\305\251\307\031P\347\004\344\034\237\323VUkH\031CuJ\023\012o\306[\022\213x\356I\000\377\000O\177\345\253o<\251\221\240\232B\250n;M\370m\271\340!<\376\363#\034h\205\307\277(\316e\265G<\354W\226[[\361\335G#pV\001?\237\367\306\245N\301TJ\351\214\277\010%\014%\241\2168\306\001>\347\327^\272\024\202\332\354\273d\246Z\230\302>Y\265\355\312\210\3118\367\340cV\257UP\340l\367Q\021\3231\325\004\225\227\217|\224\340\017\266?MT\343(\255\354J\211\256Q*N'\305B\202\221\216x\306~\331\374\365Wday\322Y\302\035\215\036\\&\312^S\2539\316Bv\361\367\032\250q\273D\361\005`\256'\253a\265\224\251\3073\377\000\311'^/!F\326\234\205_\345R\352\346\223\276#\223%,\034\002\20003\3669\376\306\224sH\024\026\260\222\315\221\351\302\030\245X\227%q\364\255\352\202\351\315\205`\357N\342NG\276\200b.\345y\323\227\034~\251\275\037\247\321\331\204\226fK\221%\304\247$\2363\355\234~Z?\200+(\206R[w\205-O\266\233\222\244\304\205\031\2044\007*R\011\317\347\355\251\014\000P\341T\275\277\023\352\273\345\332\016\267\206Ze\325\373\237A\251\256\311\212a\000\332\212U\200\354\267\202\024N\354\343g\257?\330\320|+\031Ut\235\302\363\223\321y\211V\361\026V\323\316\012\300\376^\377\000\256\240\351\301A\206B\001\025\312\361g\244\023\337u-4\314\237L%)+\300\373\343P\330p\253#\366\237O\222*\201\321\247`#\307^\324\254\363\310\307\353\307\333Dd`e\015\222\200\275*]\033\231Y\203)\202\016\026\234\036N\007\333\373\364\325$\2148lVc\250\373\025\\b\374/\327-\373\234U\241\273-iq^v\312\360\2272G>\343\267\277\345\337Y\255\351\364l\042\3115\253iL\351\274F(\251\\\370\252/\354;\212s\221\352\177-hx \004/)4\253\365\315iSY\254(3\021\324\371\200\330I\311\317\333\3754\224\2147i\275\215<&\215\245\323\327\347\262\217\226\212\021\201\333fH\374\376\372g\303\007!)\342\013\244\305GO\237\247 \251\346\335lc\361y\223\375\367\323\033I\024PK\232\012\356\205hMt\203\026c\273\001\367\335\317\337U\360\310\3023\236\006-N9e\327&6\226\304\211`\002<\244`\035x]\322\363\334=W\227\373\215R\245\2058\357\210\321\003\222\011\012=\373\352YA\012G\036\017e'\022\347\250\320\323\261\217\025\334\215\251O>c\367\366\325]1\005\032-0p\262\273M\375y\310\334[fZ=v\224(\237\351\375\347C2^iX\304\320\332\265\0357\251\027\374\026\367\267\002c\214\247\205\257j\266\243\327'\003\216\376\276\372\013\244p\031^\014` \016\352E\253\303\252\265KZ\257x1oNv\331\200\373\021%\314K%M\307u\340\257\015+#\266\355\212\307\333P\355H\275\243\223\374*\230\030\011\254\200\231\035\035\351\347\\:\243j\365#\250\226\315\271*\243i\332q[\231[}.\245\277\226m\\\344%D\025\220\204\225\024\216v\202t9\372\204q\271\261\274\321w\012\260\301\274\323B\271\026\257\303\247\304%N\037J'R\250LH\245\335Q\330\233\031\345\311)\371F\027\030\311.\272=\033KII*\367ZS\334\3519:\344\000\270\023\370\177u\177\271\2277p\026\025\255\351?\3007Q:\267f\322n\213\266\357~\317MB\210\335E\206#\260^z\012\335\013[!\324\253\205e\010\012)N\017\230\014\353\013]\366\272\030\\v\213\243I\250\272c\203\266\221\335\001t\373\375\230\337\020\327\005\227z\325\356\233\222\213j\335lS\030\227L\246+y(\224\265)\317\225\222\241\224\245\177.\020U\264\2506\267\220<\333U\243\317\366\276\006\271\241\246\305\366\375\320\207M>&\177\017\257\327e\225\225\336\225|E1\026}^\342\264.\252\014h\365\005\323\337m\346\226\014w\223\264\341X\364!\304\020\254\224\253#\007[\377\000z\016\341\326\225\360\213I\306RB\357\245\365\042\202\033ndZ\303>)p6T\332\200wb\366,$\220\002\266\250\024\234v<\034j\366NAUc\217\024\200b\275\177\264\265\254D\251\270\336r\034R\202\177\327\372\177\327E\215\316j\363\362(|\324\35375\336\310(zT\344\000q\2659\300\375;\177\333Gl\356\272\244 \007u\331\032\265q\313uKzd\244\366\332T\257O\357\236tf\223Ho6\345(\365\307X\216\244l\253H\317\030!Y\317\337Pe<\200\275U@\256\326o\212\370ob\246Js\035\312O\037}N\363YC\305Y_\303sU\335\313\212\232\372\325\337\033\312s\377\000M\\\274R\266\361\302\346n\354\2574\260\025%C\003\361\003\236u \250q\274\016T\333\227\315\312\354\177\012:\235Z\370\355\273\276?OMK\216U\016;$M\346\317Q*E\365\255RB\010\306\304\253\323>\377\000\227\367\215\012F8\213\010\042R\011\265X\356\010\367\014'\226\207\242MS\231\302\2249?bG\365\326s\237%\322&\3667\202\213lk\307\250\321^j,(\363\022\336{\255d`zq\337\320i\250\367\332\243&!hoF\345_S\222\334\332\316\364\263\201\2659<\377\000~\377\000\370\323\304\342\273\253\211/*\310\314\271\345\323\033\0009\341\270?\200\367?\337\372\352\202\256\324\227\342\212\341\035I\254-+gj\207~\000\335\316\254Z\025j\315\025\365\036\373\250\207B\245\255ho$\376\036\337\237\367\337V\015\302\271\253R\013\272\035\232\221\261\305\220\000\372`\367\324\034*\330^m]\316DRQ%o:=\263\370\277\277\327V\013\304\016\024\377\000\373\361N\\@\237\225l\2578\3109\374\216F\2404\332\033\331\213QK\254:\363\211v\033Ii\007\374 \177\323\235{\034\025q}\202\363\221V\222Z-\270\370B\273\214\363\317\3665 \213P\361MC\322\323!\305%\305=\270\375;\237\373\352\312\001\340\036T\234\020\353\211\330\204\247\216\376\234\352\327\267\225\005\273\205\042\312u6v\177x|\243\262}\276\332\016\354+G`Q(\234\301V\302\215\201j\3079\003\2365Ev\226\335\005\016\345\025N\250\205\260\321\037O\323\376\232\2618\302\3619Q\257[0YQ\220\240ZJy)(\030\307\324\352-\017\272\027\271j6\335=\205;\042tv\026\0066\3419Q\301\343\036\277\323Wo\012_\030*\260\\\227\275\251\021+u\303\011\344$\020J\260\237\357\277\364\321\014\225\205Q\010\252!\007\321z\201\323\252\263\310an\323|L\371\260\3708\301\355\203\307\3764\026\314\011\253L\266\027\236\311\267I\211i\324\335\315:AR\001\310\332\177\327\2351\266\302\021i\034\242\211\026\2740\221\341\207\300\307\003q\301\325\332\015*8\320\265\312\305\250\234x\210N\300>\204\237\357\353\253\221\331@&\260\274\252\024,4J\363\214`(\216u\340\322p\025\000\000XA\022(\012Vw\245\3257\330\234q\377\000\237\357\355T\310\000e\015I\242\262\207J|\004/\036\247^6\275\262\362\020d\313V3h\371H\311R\220\241\330z~\177\317C\360\226\251\266\233\344\257\232m\270\3659h\331I\007\035\312\310V?_\357\215C[\\\257\000\327\012\002\321|\032J\344\254\211Q\3436\330\364\306s\307\337\237\373\353\305\300\233E\330\335\274\042\210\024\230\321\335@-2\333^\200$\022O\035\265\004\332\011\204\020\002\235D\030\001K+\217\343dz\2229\373\352\0020\006\324\031\215\0364\320\340\332\322r\010 \203\317\320j\244Z\251\316J+Cm\316\360\226\025\224\216\337\273\035\377\000\274\350j\216\300\302.\2471\022\012\333T\2246\274w\0339O\323\372k\337\004\002\342]n]\216\273\016|\221\377\000\014\022\337|\224$c\330\221\375\377\000\246\274\252\362-}\312U=\014~\341\264\366\355\217\357\365\372j\000W\336+<\240V\250*\22748\353IR7\036w\343\214\377\000\177\240\325Z\017u2\221\300E2-\346\203%\010|\025\355\306O!X\325\216P\303M\340\240\371\235,\241\325\225\343H\214\265\254+v\364\253\000\237\240\301\320\334\306\253x\2628/h\226\23342\224S\325%\266\370\376,\202?\274\177cDT\310\310F\324\250\202k\250\214\362\244,\0209$\022~\244\353\312\277\024\352\241Y\360\226\220Y\247.d\204\215\352\033J\324\007\276\3203\201\357\240\276J5j\271(\216m\254a\246\032\252\024Y0c\311N\370\3169\031m\042@\355\226\326p\225\216\377\000\207K\011\332\342C\015\322`\3569w\013\245\035:\266\244\273\036<\366\332\200\027\267\016I%-\245'\370\324\2428N9\335\333\031\366\327\2353\277\020\315!\206_\010\256\253\360\346\305\257zS-+\272\336r\227>Z\320c\347\012L\246\225\370]e`\355u'\202\010$\036\007r4\243:\203\037\031|d\032\3450t\322\264\200p\255\323\377\000\002-[\266\245\327S\235\006\235.M5\014Kc\303\003\302\237\030\362\357?\211\01667\0221\317}s?\377\000-\210\275\254\007\233\037\002\264\242\350r8\202;\247\347M\276\011lj,\256\253-\251\021\345B\251QeQ\241\307X\004\277\026SHR\026\243\214\005\266\353x\310\3566\221\203\337\226\352_n\013\242n\314\020s\371\034\374\302\331\322}\237k&k\237\220\247\355\376\206\330\227W\302\225B\226\325\263\002\222\375N\334B\252(m\260\220\231\360<R\026\241\216\026\227B\301=\361\244\265\235vf\3656\344\226\203\217\203\226\204\0351\215\214\307\301\310\372\374\221W\303\217\302\235\251\323\356\200\336]:\204\334\330H\275\250L\032\312\204\222\267S0\302\360\\Z\024s\265$\251$$q\334\201\316\220\353\337i\035'Pep\303\205N\233\323\304-\337\311*\362\3334\0125&\333\241[\215\323\2433\036\0059\024\310\315%\000\006\331\014!\245%?t\243\037mf\235t\217s\336O&\320\316\221\254 7\262=\243\210\260\332\371h\221\033b#ICa)H\003\204\340$}\200\003Y\376#\234\010>\252\316h\017\334T\256Y}\225\251\266\200\317\235\304\202?\027\035\317\277m?\001$\002\220\232;4\020uZ\317\265\252\224\367aM\242Ay\207]iK@l`)\265\005 \201\350B\200\355\2558\265\2624\330rT\351\275\225Q\353\237\301\017J\272\307H\207\032M>5\012Lz\224\272\214Y\015\262\237\370_\231Z\025!\264\340p\205\224\023\217E\020\256\340ks\246\375\243\226#g\042\200\371%&\323\207\012\245\230\367g\373/\3578s(\260\350\264!5\247\345;\032[\356-%\270\351\371\317\015\267A<\024\026U\342\234\340\371H\365\306\273\035/\332\230H\267\032\377\000\305\233.\200\213!T\016\247|\037\324\372{]\375\223Z\243\310\211\031\305\251P\336u\242\237\231l\036\024\0008\007\005$\247\323v\267\364]M\223\015\315)Y\264\356o<$\335\301\360\324W\030.\237\035\031\306IO\007\372\177\327O7R8)\177t\013A\370r\257\267(\242R\374H\343\261RA\307?\337\345\243\027\012\265\036)\3410\327\360\344\217\010\355\360\334_n[\347\353\333\276\205\342\016\341x\272\302\037s\341\332\241\274\224\341\000v=\370\373j\355\224r\024\336T\354_\207\265xa\2654\302\227\300$d\237\323?MT\314\016W\254\017\212\220\203\360\336\310y\013[i8>\203\355\371\377\000\347W\373\300P\021\244~\204EJ<3\015\225\014~%$\177O}S\306U-P\025\037\205\233j\244\262\271t\330./\334\001\345\376\270\321D\275\3206\236\341wQ\376\031mjS\311u\212<\000\264\236\373R?\363\252\031k\011\226\260\016yG\256t\3625:6\310\360\231g\003#`\034{\375\265\001\327\335y\240\001\204\264\253\331qK\252[\252.\023\330p1\371\350\315we&\271*\0256\204&\362\2642\264`\217q\375\216\375\3656\007*\254\256\024<\273m2\210C)\222\011\343\201\317\267}M\250}Z\227\203f=\021\217\025\300\022\202\017\337\030\3249\342\327\205!\351\366\314\231o(\306y\004n\347#\277:\260wuc\352\242\336\265\337\246\200\343\262\234*\356\244\355\007\333\216\337mN\345S\352\244h\322\243g\302J\017\034\003\264\214\352\244\2534\202\027\275Z\254\324RT\270\355\257\236y\007\214\347\324g\3755 z(#\013\375\032\354\243\006\374'#\004/\201\346JF5&\325\232\017\012~\233_\246,\247\301n;\207\331*\030\003SD\250\034\246M2k/%\265\354Ki\307\2578\374\364\042W\213\002\357\231^\242\304i^<\206\222\241\366\032\360\272^k+\224\273\227\324\012\012$\026\324\245\004\203\370\211\000\016}s\366\321v*\200-C\327\356\332;\320\260\324\201\273\270I c\373\373j\013HWh\241\225Gz\277V\227=\211i\201\222\222\222@H\316O|\343\277\327\277\365\325\211 *\200\263\376\361\207q\317\212\373*\230\347\207\203\204$\220@\340\372z\372\353\036v\275\310\216\223\262\255\226\017M\357'\257G\245\263T\2567\031J\362$9\270\017B1\355\377\000L\351=&\216O\022\356\221c\326\026\326\303\312\325\276\231\261P\266\042\303K\362\244)X\312\367+\003\007\035\275\377\000\353\256\235\204\205G=\3169\031OY\235Nn+hm\244:\352F9\335\306\177=\020\023V\250\000\341vRz\233\363m\345\326Z w\347\372\352\333\202\013\342$\343\205:\357Qi\251do)i>\273\371\317\337V\012\376\023B\205\377\000\177\250N%d\313\214\234\036\333\217\353\366\325\015\336\021\002\021\223u\321\237y\307\023**\206q\234\367\324\227\036\301P\304\241WT\210\224\031\000\244$\020NT8\300\376Z\021\221k\230\366\267+\2117\034w\234!\327\302@\035\267g?\3365;\232U\0316\323\265\031[\365X\322\037\015\220\322\274\303\267q\367\375u\006\251{S!x\240\217Z\021\317\242T\277\363\037_\323\371\353\330\264\0334-H1LfZV\026\245'<\216G'\323\363\325I\256T\266B\204\2530$\307C\276\002|E\245$\204\216\347\373\307\365\366\324\012\034\246Zh\321U\270\365\006\346\215w\012Ba<\333%X8J\210\034\377\000\257?\313J\273PK\366RjV7e\367V\206\204&U\003~/\214\026F\016G\323\372\372\350\307\321g\274\206\341\036\042\337\220\316\317\003\007\216\352\374 }56\202\033y\013\277\366\023\376\021R\317\210\347l\002?\027\260\343\032\204;6mr\302\247Ke\335\251mINFR\025\220\007\034j\011\245%\037E\245\244\247/\204\001\365\356>\377\000l\352\006B\263\\{.\247i1\222\242c\201\317`x\031\374\377\000\277\266\205\273\012\342@.\224\225\273\322\213\223\250\265\003m[\252\246\213\222B\024i\361$\310\014*\250\350\347\300aj\033\013\304\005\024\241JI^0\011W\032\026\247T\042o\212\376\025\364\246\335\260rU\215\350\217\301\255\327>\014k\312\241\006\257_f\235!l\\6z\332v\235W\216R@X\216\265\371\036P\0048\215\2748<\271\012\310\034\376\273\355\0341\217\014\036xw#\363O\263\245H\367Y\306xW*\251\360gB\245\324(\335G\350\345\337yB\214\312\323)1\224\2249>\224\241\310z>\375\202BS\346\016GZ\222\262\222\240\225,\371U\315\263\355\235\223\006\245\243\343\330\374k\217c\363Z\237\374\023\215\026\236\025\237\254Z\022_\265\243\335\266\005\016\322\352u\251Pg\305\257\332\215)2`T\\\003\016J\246%\\5#;\2676\002\024\262\0008s:\346\346\327\273{\241s\213\034?\013\273\217gW->\275\226\304:v`H\337\212\224\240\364\257\245\025\236\234\177\273M\333\215W-7V\340b\015D\005\312\243x\204\250\264\303\344\007[@QQFrS\222\017\003\032\347\345\373c\255\022\356q\333#pk\203\356\233w@\205\230\253\007\205\023ft\252\331\247Zc\247\275Few\375\225Ex\256\337\231%\302\212\245\042:\201Id<\016\340\246\217\341 \224\251\033A\036\\\003j\376\325\274\311\367\250<\256v\036\007\004\372\376\177\242,] \006\210\273r\023\256\243SDd\026\004\267\247\304R\020\302\2448\221\373\374\214\0059\200\006\345z\372\034\372g\\\224\232\247:C Z\254\322P\333\301C\222j\237\260fR^x\272\3055\360\031C\351\0311\327\376\022{`\343\371\035F\245\304\273wb\217\014;\330Ey\207\352\021\177O\3439nT.\310QBd\323\344K]E\014\221\224\241N\201\343%#\331K\312\361\376b5\253>\240\277k\273\201_.\022\023\2648\002Q\325!\370\262\233\214\270\250Dh\261\007\200\333H\033F\010\302R>\203\032U\356\016~\347r\227sv\215\2416\042Q\233e\366\235}\302|4\225\355#\030$c\031\372\177\256\236k\201m,'\352\016WZ\334\313Je\224\340\356JG8\301=\365f\264 \207\346\312\351q\350\264\350>\010W\343<\221\334\250\236N\233\204\212\302\202\355\305y\306}\247Q\220\255\247v\000\307 \375~\272\273\035\270\341R[oe\303T\250\275\005\037(\202\231./\234\214p\007\247\323\357\246C\012\254Mk\217\240]_\267\022\312R%\230\3038\000o\031\372\344j\346\351\0146\317\224%\355\365\323{\033\250n\304v\343\206\211M\267\006u=\010)\033\024\334\226\322\225\023\236A\033B\201\035\216\233\321\365)a\007a\356\017\311\002H\001\374C\013 \257.\204\334\3265\006\2355\350\222j\216\204,\316Sm\225!\202\036SiN\357\\\341'\337\237lk\351zN\252\311\035\264c\321c\3534\244\022Z\252mR\341\246E\230#\251l\007;\362@\310\317}t\321\267\313k\035\306\370SL\324\343\270\332V\204x\251\306@\3161\240+\264.\303=\217\010\251Q\306\000\3078\310\324m\243\205t=Q\272`SZ[\2562\244\241<\236q\371c\032\270m\250\263\302\211\243u2\227SQi\260\206\327\333\314\243\317\344tgAJ\013\221\014\233\201$nk\302q=\363\273\003\373\343C\021\2579\324\242M\314\362N0\3119\317 \220~\307\266\212\030\207#\363\302\373f\347.\201\342!\000\343#\012\340}}8\327\215vR\335\303\225\037T\256x\255(\004\204\023\234a\\~\232\360\030\245\342/\204\231\256\325$4\342\322\332\322\243\236\356'\217\327\323\357\243\3061\225\346\261\325\2244\273\215\011d\226\337m\331\030\341\001x\335\366\367\324\030\325\232\354Q*\032\225tNrzS%\206#'v<\251\311\374\363\372h\233E/m\264\352&<\332pq\2472\350\034\344\036\376\377\000\366\320\\\334\252^r\202$Gy*R\266\0223\333\000\222\177\256\211Jw\202-s\042\226\354\324\255\247r\320\343\223\317\330\353\313\316!p\275k1\015\2658\302\324\245w$g\333\217s\237\247\327^m\252\267\224<\345\261.\244\026\020\323\307\214v\003\364\317\337R\354r\257`\240*\205\234\352dxhiI9\344\224\222\177#\375\377\000-H#\225W\002xD4\013]\270\252.&3\241I\347 \022\007\345\333\337\365\324\271\345Y\215<\224K>\240\3555\220\333A\345\257\007\361'8\343\270\376Z\242 #\272\256w\235n\270\\Q@\226\255\312$\216I\307\241\036\303\353\253\261T\276\215$4\252\235\300\374\322\250\306`Y\307\004\023\217\317\235Y\326\246\307\010\236$\013\356\244\2244\227\2457\034aAG)?\337mx;\325y\246\376\010\2656\\\224F[\265\031jq^\241c\217\323\217\354\352\034\356\312I\244\237\273-\372\000S\351Ra\370\2308R\010\007\037\226\243j\2507\204\211\234\246)\217)Q\226\0202FS\203\353\375{\372\350E\240p\027\234\352\356\270\015n\274\366\325\042MElz`+o\177\267\003\235\020;\325x\033\310*Y\213\311M\260\030}R\002\207\030+$\016\376\200j\373\302\200\373]\020\357v\330\375\343Jy\246\361\334\023\223\371~Z\256\372V\301\026\024\304\216\241C\250\306[h\223\275\323\307\231d\237\323E\334\017%Wwt\250\253\325+\250[\213\210\024\342O<\253>\207\214~\272\244\204\327\225C\034A\363 7\256\213\2622\374'\345\206W\214\355S\2308\374\306\225|\217\274\042Z\277h\245=%[\010\312xI*\335\311\366\306\216\032n\226\203\332\356\012\226\026xu\326\224\207\031i\034\025\016r\254\375{j\001\305!\311V\034\217\250v\2534\347R\360\360\224\242\220\001O\240\327\257\325xP\310F\202\032XRJ\334I!<mWoL\177-KI\354\231\026\0155wDx\241@\202\217\010s\273\334k\316*\257v(\362\244Jb>\275\253'v9\012\030\376\177\256\254\017r\204^hz\256\023a\320\244\314\371\364@l\312Wu\177\213=\311\327\233\\\240\235\334\267\364GTj\034x\212\013Xk#\360\204\340c\355\377\000]z\200P78\345\025\207X\012\003\303l\343\327\276\252\352^\015\332\272\236z\010d\2002\256\336\\\377\000\343^+\315\347+\312\003m\270C\251*\010\317\250)\325x^uv(\316%=RG\221* \014\234\377\000\010\035\376\337\367\322\356\033yT/\244\334\261\372?{\335s\223\376\357YU\352\371F\307\235C\014\022V\321<\220U\204\362\001\003\320\347\357\244\265:\370b\036w\322\273a\221\377\000\204-b\351\367\301\277E\243\323*\237\267\355\372\375j-Q(\377\000\206\253\266cK\245)$(x/6R\2648\2222\025\311\310\005$\002s\363~\241\366\256}\333Z@\257L\203\371z.\217K\322\000\001\305[8v\362\250\020b\306b\2556\270\303M!\237\022r\202\244\253o\001kp\000\026\254w8\031<\360u\304K#\234\375\302\205\366\355\371.\226\026\202)\303>\253\3735\204>\244\255\231\214\265/>\042\003\307\205\034\344\215\337\\iy\341/\026\324x\244\333\207\014(\032U\016\015\273T\253K\246\301b2*\216\374\314\277\005{P\353\330\301qM\216\003\204cr\2067pNH\321\\\371\234\320\302l\014\013D%\216\363\036Wz\350IL\247\252\021<T\310q\261\2744p\034 \344d\0367\177\233\277q\244u:-\346\317\342Gf\250m\014\355\373!Z\235\271*EU\233\2122B\251R\020\0236\036\017\212\011\362\251h\364\340\367\007\2223\254\306\350\\N\357N\313B=h\014\360\217# \377\000\005u[\264E/\307\266\347\312\314w\037K\213Y\031\011`\014\014\244\366Q8\036\334\352\360A\267\313\330\241\353\265e\337\344h\343\373^\213\215Fis\355Y\351fk\233\274\251^J\035I>U\247\333\261\307\261\0328i\030o\010!\304\324\234 ?\032\267h\326\345T\037\220M.;\311jC\253P(n)h\254<O\266R\022~\272\004\221\020l\036S\316-{6\326O\037\024uhO\232n\212\224d\251\017R\032\331%NzeY\010\306x9PW\350t74\212\276R\223\264\026\013\347\204\357\227x&+o\273%\341\204\022I\034s\214\014\237\\\023\2364\323%\310j\311: \343J\012E\316\226[\247\272\202\245\227P\225(\366\015dg\237\2560\177=k\303N\363\004\241\323\362=\012\202\252^R&\324\341R)Jn\2419\300C{O\224\034\037\304O\011JFI>\203Vs\266\004X\264\340\002\343\200\021\232n\312\005\031\321\025O.\245-)\312\235Q\302?\372'\333\352y:>\234_)-D\017v\002\217z\362\213=\251r\021\021\372\202\306\033A\214\202\242\225dy{`\037\277:y\221\373\245]\246\247\006\223K\22247\336\335\042_\204\225\250\357\330\227\001)?~9\364\325\231\037\252\263\245\003\015^`\206\\}\347\245-\316HJ\022\222\242O\034v\306\243\3017j\340\332\366\224\343\022\351N\323$\263\030F\224\242\342\367\266\010\012\364R\222{\340\200y\372h\321JZ\355\327\302\003\342i6\263\363\342\013\340\262\303\3525\265f\323:{\340\333\365:9p\311\252\274\242]}\206a\257\207\226\236\343rQ\300Orq\337:\351\372?\332w\261\3562\233\036\237\232\317\326\364\254]d\254\316\266,{\236\3371\251\267\042e\306\224\250\355KKN\034\222\313\210\012B\361\334\005$\2023\333:\372\007\336\232\354\263\272\347\034\307\002A\302`K\2464\206Jw\234\343\003\337:\210\301(n(\012\263l\303\233\035\306d-\302\205{\177\343G\026\323j\201\310\011\233&\223Kyo3(\003\273'q': \230\234($\234#\010\015#\300\360\323!\227H\031\310 \377\000}\265\340U\333`\345\014V\233\230\255\301\010+<\214\347\237\317V\211\241\242\312\234!\310\263\246F\363-\265\2419\311\344\023\337\277\246?\355\253\272\212\255_\301w\265?\307PQuiFpr3\376\237o\323T,\245;\020\255\351>\034Zc\362\022\215\347h9\330|\277\336\016\257\0306\241\265e$,\253\3355\272\277\354\311\020\033\021\303\205%c\234\343\337=\217m\030\267\0126\321VJ=\251E\036\003\261c!\022@\030\344\340\237\327C\016qA\220\347\010\222\235Axe'\010H\311\357\306\254W\267\257E\333O2\362\022\224\205\223\306vv:\200n\325\333MR\216Q\035n:xG\256\001<\017o\357\353\371h9%\024\212\345p\263DR\325\373\305\266S\374X\036\236\332)\024\252\011\341I|\2648\214\255\265\006I \356\310\003\327\333C$\222\244\264] \212\205\011\231\362\226\342R\224\223\330\244\340\376c\337\266\210\321B\220\332\\9Q\222\350N\306B[C\244$r\001\310\037~\377\000mN\337Uv\312n\222\376\345\216\246\042\274\255\315m\301\354I#\373\307}K[\350\274\347\341,\340\333\261\253\262\316\367\334\033\270\003\004`\037l\350\215\024\0257\017Tr:eo\301h:\363\015\272\263\202IV\011\372\237\246\243q8W\005$oIR\350\222\324\232|\027K\011\310\004'>\276\236\375\365%\245K\036\017u\022\204U\3530\232\025\031)e%<\005\000\017\362\376\3065m\241\\\270 \012\227H\230\230\362\344\341\371K9*P'\237\313Wp\356\206\323HrwK\330\247\2408\3355\225s\374`\237\247lq\306\253\266\324\027\001\300@\325{u\330\211P\371F\362<\276^\331\374\277]P\0124\256\010\030)s\042\212\321Z\227\3739)<\341AY\3179\354\177-I\000\252\270\016P\215\303L[\014\273\271[\010\031\332\023\214q\366\372\177\256\250\350\355Q\262\321\242\253U~\035\300\334\3259\026C\214\241'\204\202y\357\244\237\033\301\301^l\240f\221M\275q\315\212P\314\344\310Z\317%J;\201?\337\337F\217Q\232(\276\030\344#\345O\247\312!\347\042\260VG$\236O\363\321\311iPC\273-$\235\026\034V\322\270\301N(\023\312\200\3062=}\270\321\017\242\334\331b\273.d<\347\206\247\234*m\3000\236I\037\337\032\031>\210{\207\035\224{\265\032\363[\\\216\343\356\2621\370x\306=\361\257mP\362\000]mM\250M\332\225\2448}w\0209\373c\371\177b-Em\030\302<\210\207\331\216\217\334\266\222\007\031\364\324wTm\014\042JE&D\304\241\362\360RR\006\0108\317\036\237\250\327\202\254\244vG\220\320\323\011\014\234\223\200\242x\3565+\302,)6\230![\312\200\004\015Q\256\276U\2740?5(\315<I\033Z>n\331\357\351\353\253;\034\240\275\273{\332\230\205n\020\244\370\256\241c<\371~\335\276\237\365\327\234{\240\027\221\225b:S\322ZGR\036\237m\265T\247\321k!\262\374I\016\036r\237\304\205\265\214\270\331\007\361\240\225!C\314\222\225da\365\216\250t\215\361^-\243\237\341ht\355\011\324?`\345Z>\231\374\036\365\036\231sn~i\243\275\034&T\012\325=\364K\206\372\222A\360_d\355u \363\335*\035\322\244\340\205k\234\325\375\257\322\276+\214\356\276G\007\342\023\254\350\222\266O\362\212\036\253U-z2(\324F\322\272%2\213So\313\340\266\322|4\217_\015h\000l<\221\200\234p\010\310\327\3155\332\247=\344\003m]F\236\026\212\240\245S!\300\240\231\021\234\214\341\374\004\002R\243\236\300\214\203\377\000}f\272@\006S\255e\225\316\333\250q\371\021\335~C-%^o\021[\266\177C\217\327\032&\341\302#\232pG(}\372s_8\343\202\242\227S\220JT\236O\327\003\327\266\200\326\235\326\023\042[fWS\362\233\216\204\231l\270\206w\177\011\311A\316\001\004\3439\375F\232|\300\001\270$\331\021$\355+\236L\351\324\366\035Z\033\223=\036\021~;\355\020R\340\377\000\333P?\201G\266{\035\015\316-\367\010\314k\\k\203\334\177K\305uW\237\227\015P\303\216\205%$1\330\200q\223\337\323\337I\265\356\275\303\224c\020\014 \240\373\336\350\250[5[n\241\006\022\036T\211&\034\205\272\346\302\324r\012\324\244\344y\324\012S\344\357\334\372j\034\3277\314\320\231\322\304\331\030\346\270\377\000\352\340U\354\313\233\256&\042\211Q\230w%(\306\364\220y\344\016\016\177\230\320\342\224\026\356\035\325\276\356\007\220\036W\235\305[\247K\266\235\237KC\017\267.\032\224\246\334NP\353}\312\024\0109Opr={ii\033\270R\366\235\224\352+\375e]\260.\032\042\026\204\042\013\312Fv\266\340P\336\236;\202s\200\257s\334\373\353\304\366w\010\272\230Hv2\206\256\356\240N\267YZ+L\226c:R\230\353+\310Z\023\264\257\004\237e\003\223\364\320\344\002:y\341\022\035(\220\3239F\367\005\320\324+e5eL\004\313!0\300#\360\237\\{\361\330{\353OD\373m\024\223t\267/\030\010w\245sf\256\231v\\\3254\265\030\231\016\305\210d\272\032J\232N\335\313*V6\247<\023\353\203\337\325\367\266\232\033\352\275\256\000\310\3267\267=\321\255*c\225)\252t\206\345%g\036 $\007\000\377\000\333O\342)\317\251\0038\355\246\364\370\042\326V\254m\3412\251\325Z\304&\374\024S\376F\230\322v\241.HB\022\257\243l\247\237\315@i\226\203xY3G\031\367?\005\322oO\025O4\374zz\323\307\356\231s\304V?\314A\343\337\0328\005\010\351@\256W\217\355v_ea?+\036F\006Y[\204\250\003\236A<\016\337~\017\266\256\016U<-\271P2*\021\320\324\245\316\237&(\000\204\345\0347\365N{\375\375\365\342\315\3010\306\233\302\376\320\3059\020\334\210\332\313\261T\010QuC.\005pr3\330\216\344\372i)\242\333\370xM\331q\334\356U\177\370\253\244R\335\350\375\365W\267cP Wc\302D\271R\332d\005\030\361\310QgzFpp\221\201\376\021\355\256\207\354\377\000Pq\324\307\033\315\202\177U\217\255\351\337\343q\254\326\026\030\326\257\253\261\230\021k)\243\317r\227$\255,;\342\024\245\302\237\305\202A\343\234{k\353Q\355\275\240\345q\374e\005L\352\245VJ\014\177\226\222\312\361\216^\3163\337\375tP\305L\023i%}\336\267t8\357?N2\234Zy\036px\344\372\376|\037o\276\254Mp\255\332\325e\245|Mu\036\231]\375\231R\212\353\211R\360\214\205\035\343\337?\364\325Z\373<*\027\205h(]Q\273k\321\332uq%aX\301\360\325\333\036\377\000\247<w\321>\013\316=\273\24652\273P\220R\271L\2579\301\344\376\277\367\327\266\327\012\273\251\027\313\251-\270\301q\320R\366\001\031\307?|\372j\225eIaQq\034b\246\323\255U\326\317\230`\344\360y\355\300\036\372#\210\354\206\346\236W\315&\325\267\340\317\022i\354Fmd\347\313\214\217\347\237\327=\365\002\353*\371 \000\231\314\326\340\322\322\014\245%(\003\004\356\347\353\351\257 \354R\321:\201B\302KKK\203\000\347x\034\377\000MY\315\240\275\341\256\227\357\252>R\240\261\277\3628\373\373\352\003=\024\206\020\272\323|P\224\237<\204\347\333\037\367\324l!^\263\225\002\347Q(\010q\306\223.\036\341\307\231G'\323\267\353\374\265\342\313\345Wo8Q5+\302\236p\242\341\332\243\335'\271\376\371\374\365m\207\262\363^m|\242\363\246\304`\255\302\205\204\343\033\326\023\237\353\250\003*\357m\225\303\376\376\301\253$\0242\333M\016s\342\244\347\327\223\257l\312\033b=\320\275fK\025$\370!\015\021\237\361\002\011\367\317\346t@\314e\020\001\302\204\207\015\024\222\251+\226\316\007\247u\177|w\325\013k\012\300\016;\250z\335\316\362ASo-\341\334$c\003\357\235Y\241O\262\004\227[bc\211C\314%\345\377\000\355\251 \377\000\347Di\004eT\264\203hF\345UM\310\201Th\2154\257]\251#o\362\327\234\000Aa \360\200aV\356Zz\\57\024\0208\306\302\000\376|\376\272\260m\204}\326iuN\352\014\005\306\015\272\310Y)\364\030\317\271 \352CB\240e\212\005+f\336Ti\017?\272\013\341\242H\312\016\177\327\236\177\246\274\334\335\2539\255#<!\227\3149/)\350\220\236A'\234\347\277\276=\377\000\256\274[\225Q\204\274\271\351U9k\3031\326\362\211\343\012\344\177y\376\177m\017a'\012\257\223\375\251\011\304\351\205jj\261-\255\210'\262\222I?s\215X\307\352\274\030\177$N:C\015\230\212T\306\2268\317\340\306On\343\362\3256\345\024\320\302[\324,\372\\YKa\245\355J}\226\007?\230:\251\210*\031\010\3006\264\016\031q\325\266\312\301p\223\202}\025\365\343F\220\255\263no\224\251I\260\233\214\322\224\337\214\332x\007\234\350\033\254*\306A\005\247\205/\011\267\025N\330\220\227PG\007\031\347\337\350;j\244\332\021kA\245)M\246n\334\363\255\005c\000\367\343\327\266\274)C\254pT\333r\022\022\244\245\220\274w\302s\364\311\324\220\021\033\223jbUjU:\234T\333\012\344\340\034\016\017\271\372j-Lm\004\322\213\242\327\327!\337\022@V\362\256\374c\324\373j\025\345i\000VQ\230\270\343>\363l6\350\007\277\323\373\347U\330\012\021\222\202`S\247\307C \370\210*\036\244\216\377\000\336ur\227\002\3557\272X\325\022\340\274(\324Z\344I\323\251\363\034\360T\230\244\227[\340\376\361 d\220\234d\343$\014\236@ \241\324e|P\227\260\344|\221\264\321\265\317\015w\004\255;\351\377\000\301\235\200\207MF\247p\3353XnKr\243.\023\301\247\342\251\004\2202\224\347#?\215$d\177\010\356~i\254\373h\367\263n\321\234\020x\371.\256.\214\330\335\271\206\253\205~-\312\004j#IS\025E\324\203c\010[\255\024\271\267\037\305\216\011\355\234\217\313_;ci\304\264P]\004\323\027\212pRUj\360JB\020\204\270\356?\207\030?p1\316\256\351E\252G\011<(\304\315\221\031\264\311\237JaT\325~\357\306\363\024\225z$\224\347\037L\201\367\364\320\344\2234\002'\204\016\001\310SN\300\200\360\215-\247\035C|\020\035P;\323\216\301C\234c\327\365\325\343\003\222\205\342\273\205&\327\3124\303\221\334\204\324\326\321\302v#s\211\007\333\327\364\357\354t\303k\224\264\2557`\250\331\2540\246\034\214\323kR\012xC\250\311H\372\003\311\034\366\321(\021J\255yi\016C\324\370\037\262\011\014\262\342S\346\334\3319I\007\223\214\347\373:\240\000`&$\237q\267%\214\272\243\220\257\270T\227R\343\0368_\202T\010\360\226\221\234g\3529\366 }\264\263a7\216V\2517\006\356}W\225\375E\213U\244\326\350U\227]o\305-\274\303\350W,\2749\012A\356\205\244\216\343\270'T{6\201jtR\235\301\314\370!\306^\205o\320\377\000c\255\237\230)O\204\372\326\215\336&\374rq\333;\271\375t\213\334\003\251\274&\014e\316\336\201\327q3*\2366\202\307\200\263\024\225\002\244y1\221\217\266y\366\325\3037{&\2742\323\361G\242\215M\213\032\255:\224\360\211\001\226\020\344t\205e\006A\013+\374\217\227\035\361\253N\326\221A.\331\034M9p\365\026\235>\364\350\305J\335\205\362p.y0w\306\\\246\367|\263\2458@_\007\313\273j\225\301\341$\020t\031!%\245\207\202\021tr\206N\034r\001D\360m\346\033\244\323\330q\270\252\267h\364\330\250\371\207\310X\361\031@\332\244\202\006\343\344J\207\034\222\011\034\244j:S\\$8\302SU/a\370\211(\036\2516\025F-\036<V\347L[\233\227\036\013(*\012\302\361\271dp\024O<\344\360\243\351\256\221\260Y.8B\022\026`\237\3155hOQ)\021\303uI\364\307*\273v\226\033|\225\017\362\220\2170\037\377\000O\345\235T\223\312\316\235\256y\343\010\301u\233}\306\322\332\251\364\245LR@q\300\331\334\2161\200\215\333\261\337\2763\246\242\220\377\000\262E\332w\017\302\276U^\267\233qP\333\243Omj\316\322\201\341\272\277^\311\031\316?\276\332`\276\271A:w\034\356^uz\205/\345R\332]\225I*\377\000\362M\345`}\025\350\256\335\307\246\211\024\200\225\346\302\340o\237\202\003\250\325\035\247 ;\263\366\314,\000\242\226\362\244\375\360\235\312\317\344>\232!q&\221\232\313\347\005E\303z\211R\337S\2428\227\337Z\306\341\342\025\204(q\302s\217\313C\2220\361]\321\001sM9z\254C\231\032U\032\254\031\223\012RU\035\346V\220\240\342\0240R\257NG\276\263\332\3471\3269\011\3074<XK\017\212\017\207\264\365B\327\260h\2359\240\260\334\2502\024\322!2\244\262\326\327v\215\307\215\240\014d\250\360\000\343\276\272\177\263\235\177\303\225\347Py\034\374\027-\324\372`\360\377\000\307\352\251\025\343\3600\355\006\265bYT\345\242\251u\324\232rMFXZ\204J|t\0373\252Q\307\356\300\0139?\213h\000r5\327i~\323\262F\276C\206\216=\326\014\335:F\200Gt\242\250\374\027]\225\251U\331T{6\271\032\332\214\211\022\220\251\315af#i\317\212\242H\341\\\021\236\345X\035\263\255\026u\330\203@{\205\237\334\241K\241x$R\255\025_\206\352m\022\255\034\324\351\002\003\253B_m.\261\341\251m\253\224\253\352\223\334k^-C\\-\253=\36188vS\261zv\334b\3331#\264\206\3061\2679\377\000\247\367\367\321L\230C\361\216\352E\316X1[`*Dt\243\030\311'\323\355\215\015\223+\237~\027\032l\372k\310J0\231)\317\370x\376\377\000/MX\274\250\337J\032\251i<\303J\371\006\366\001\317q\307\367\306\245\256\3121x!rQ\355I\315\202\354\206\013\307\031'o\007\363\317n\372,\217@\0261\352\272\352v\252\252M\226\3676\313\235\260}x\372}\206\252\327\257\026\376\252\002\227\323\324%jC\217/\004\360\020\235\277\353\316\244\313|\005\0022\007*u]-mY[R\312}\302\275\276\272\201?\250T\334I\245\374\035+w\005\002Z=\007n>\330\376\3755c7\242\235\365\200\206\247\364\246cNx\301\326\326r\007\000\216\337\256\254%\013\305\333\205\251\270]1q\306\223\275\355\252O=\277\237\267\277\352uWL\274\034\332\367B\267\025\217)h\\T\272\261\203\214\266\220\177\251\325\233\\\242\007^B\033\247X\346\230\0266\272\363\352<\002\234\034\375\271\357\217\374\352I\265\355\301}\275f\325\324~e\230\213@\364!9\335\371\372v\307\345\242\370\200\012Rr\246\231\267jR\231\015)\012e_\220\355\371\377\000y\325w\005W\272\212\031\251X5S\342\222\224/\036\3039\373\375\017mA<R\251q-@rm\031\221\224J\342\020\262{\2201\375\372\177\343Dh\263\225!\364\325\317-\331\024\350\251Z\300\332\222\017\225%D}\270\357\375\3755 \013^s\306\334 \271\225\310\362\223\373\305\251\262\0060\264\020{zj\273U\332\373\036\3500S\350\225E\023\343\305ueX<`\217\347\221\372h\255\364^\2144\345\021\307\351\325\015\364o,6W\376,dzv\307\246\252\341\205[$S\227\323}?\200\225\340\251\012\307\371F\244aZ\3014\275\315\275H\207\221\340\264\\\317* \023\236\376\275\207:\360nl\251\016\016\345\015\324\237n\236\275\251m\205$v\012\030\317\333W\331|)s\300\302V]\225\351N\306z4m\210t\214\214')\035\377\000\363\252l\024\241\262\012\311U\322u\225s\324\244*Yv;\201C\203\202?\227\246\207\341\332Z@\353\302\320Z\\T\276\204<\363HD\221\316T9\374\217\367\376\232\033\211\356\266\004y'\262\361\270\350\023*\221\222\210a{\273\201\273\031\036\272\244\202\370S\034\265\345Q\216Rk\364\330Ij:\020\343\371\335\204\234\363\364\316\240\002\005\042\222\302\271\244\334\267%\001\226\303\311\222\200\256U\345\311\365\367\032\251$\032\001_n7\016\021E\036\351[\320\324\343M>\207\266\376\020\221\225\036F@\036\243Q\273\026\274 \004\363AC\327/\311\320\030P~,\3257\234\356\011 \003\365\343R2\256\34647\005\013\310\272j56\021\0422\035O\036Eg\267=\211\373\216\307Wc\275\0257\021\345S\266\205zL\207\326f\266\302$$\367S\211\357\217\247\353\317\372\353\310D\022,\246\244*\275T\315l\226\042\252&A\344\343?BRA\374\375\007\345\257\005B\341\360Z\301\360\323\323\256\234\365B5\016\347\247Q.\276\237\\\020\266?\271\331\011\252Sg\251\012\033\202U\344q\267\002\200\343\367N \341I\335\214\236\013\355\027Z\233H\342\307\020Z\177'|\270#\362]\027K\351QN\320\340\016\341\362Z\331\026\340\375\233\005\230\323\326\032\236\204\200\333\350o\367n\214c\004\021\220~\270\327\307\365z\240\\KWg\016\210\367]\255\326+\262\210\002\022\2465\335N\241>c\351\333\373\032Q\263\020\214\375;\001\364]\260\327\021\222\2039\366\231\224\265))\302v\357\340\373\366#\337\034\350\233\202\033\255\334\042\272s\254\035\252m\327\035\000\3409\220\2409\3749\364\367\344\350\261\313a)+)\021S\330\216\2677\312D\007\316\012\220\353\250\364\367\003\234~Y\373\350\273I6\224\221\325\200\270*\325\310\320\336\005\365>\042\362B\332m\263\263\003<\366\357\217^\332#\036\007+\315\201\305\264\336P]j\360\247\2463n\266\271&\232\341\012AP\036PG\246\007\003\373\347Es\3009G\217F\342k\270J\372\235\341P\210\341\020\346+\305\007rT\203\346)\372\377\000\177\256\250\302V\214zF8[\205\005\001?\250P\252b<\252\204I\006|W\012R\372\233\302\343\254$\360x\030\007 \347\364\321\207\262\2634$yA\302\217\250\335\013\237L\\\367_~]9\344\014\251\222V\224g\217\020$d\343\327#<\034\363\254\371\307r\234\202\026\264\355\034\204.\305\323(U\035\021\333T\200\244\240\277\263$\264\331\310\012\307\252\011\365\355\221\214\353?i\016\2609L\276!IKv\335\321-Z\235`Ay\362\231\373\034K\012l\223\342\002\020\262\000\347\003\313\220>\372\244\372\237\014\012\344\360\234\212-\315\370.n\225\337r_b\340j\255Pr\217oR\344.\236\2658\024ym\266\324\257\015=\211\313\207\315\214\001\216\347\202\030\034\340\342\351\017\224(\324\303N\033rJ\177[\365HW=\277\026\2416|\272]\264\352\323\340\264\214\2312\032\310\001n\253\220\200\254`'$\355\007\202t\364\032\233m\221\312\314\23271\364\321\237\3212k\325\370\025zeJ\0258|\244\030\330`\371I\005\336<\251H\356y\000\372\223\306}C\035>K~\325\233$[|\316\345$\350\024'\335a\352L\232\255M\266\320\247\031\226\250\344)\322\356I1\320P<\312FR\222\022\010\007\313\205\224\222z\031\262i\243\312\255.\2404\357\377\000o\330.\311O*\205!\024j-\011\212:\024\200\227\024\267\267?\200\006\022@\005I\035\312\2163\310\340`\01564\241\315\262\225\361\0116\342\245\2515\232\204W\033\212\302\342@\232\350R\222\033`\367\356U\267\013R\216=\361\306>\203K\230(\347\205\022\310\3222\2305k\252\237e\262\313\365\352\214\346\345,\245+\304g\022w\251;\266\251\266\220\245$\343\222\025\346\030\347\007\215\\\335X\011H\241\3610\020\354\033\326\227p<\334\212Mf\340\222\343\253\306QKyAg\330\356\302\260?,j\321\363\220\211$\005\274\326=\321,zb\301pT\033bJ\226\222\264oaq\234\007\2226\343v\257\274\023\224\263\235\377\000\352\243\325\026\013.|\265)\326\331\251\355\361\026\302\274\256\201\333!#\033\207\324g\371\353\317`R\327\270\376!K\266\235&4\324\260\313\357*$\314\343\302t)\001D\037\341\317#KIE\025\266\023\016\005\317\016\225-1e\316)|\250,0P\240v\343\216H\347\362\326<\364\333u\246\243\201\3227\001O.\355zI\250\315\211Ln\243Q\177-\245o4\017\227\320v\341\011\036\236\272M\372\311C6\263\000/\177\361\321\335\310\217-\353\226\216\3559\370\265\030\254N\\\265\226\236\013\001_1\221\346\337\236\351\306x\355\351\240\277\251\310\327\267(2t\306\347\011Q{|7\364\217\254\027d\273\232\256\303\314\312D\026\251\2550\312\3744!\010Q)X\307\256\011H\003\2005\330t\277\265sE\021h<\233\\\326\277\243\015\300RM\321\177\331\375F\201\324Isj\225\366\247\364\261\000\275\026 R\204\325\223\2342\341\306\335\211\357\274r\256\330\034\347{U\366\336O\272\371\033\347\365\355\361\377\000\237$\244\177g\367?'\011C\361)\360o\036\330\241\314\272\272a%\351\224\270\261\303\222\251\317//6\200<\316\240\372\216\347o\260\343N\375\232\373^';&\301=\322\235O\243\226\017*\316:4\0240\342\2271\344'q$d\214\017\246\276\212\363\212\013\236`&\211R\365\027\351q\300\0131U\236\000$`\376\247U\014r\263\210\273\034\250\341P\242\374\261Hz3J\377\000)\031\367\365?_\345\250\263v\275\264\001^\250\027\347b*b\203\012\017\034\343;\271\306}\277=\036\201\012\036(\012D\3553\037%\334%\274z\205c:\036+\012\2144\012\344\220\362T\340m\275\256\017|gWcG%\004\271vAmd\247!G\330\253'\037\331\376\272!(\254\243\361*BIi\011\345('\034\356\035\276\343CkmH\220\325!\3315G\331\313m\241)I\343#\214\352C\002\030\272\260\242\276G\347\225\3428\200\240{\2022O\323W\272\341M\013QR\250\300\310NBs\236\311\365>\331#\357\253\013Sjx\323\220#\006\010I\300\301\032\363E\250\221\346\224J)+a\300HH\031\307ljKiF\342FW\254\264 4\221\2759\317\367\375uE\350\334\201*\336\013\301\300\246\232p\201\306\341\235\031\215\302`\232\370\244\345i\306\222\343\250S\007\037\303\317\177\357\007E\242\006\025h\0371@\022i,\310R\274D\306ZT;8\214\217\314\343P\320{\251\361\033\302\377\000Sl&\037\232\034\021b\002\242\006\344\036\3439\325\203\360\252\011\272\011\261\036\323\213\021\224\227\001\317b\220\017\351\364\357\251\016\265-\273\265\375j\337\247\202\012\032Cg\323q\340\361\337\372jO\012\034\3420;(J\215\262\332\227\273b\017\271\376\377\000\277\347\2534Z\246\353B\322\355\332C\273\222\354\026\302\361\334g\237\313\221\375\376\226$\214\022\252\012\026\223f\321\222\356D&\217\347\376\204s\252\271\316\244V\220\273\343\332tD4\224\2301\201\035\377\000\274\350`W*\\\357D\020\335\322\303\014!m\354*\007\004\221\302\177-\004\205\272 #\003\205\042\325\343\0307\343\272\264\237S\220O\347\216?\236\251\265\001\321\234\326TZ\372\253CrG\205\035\227T\342;\014%'\271\372\352\256\024h\242xu\205\3177\250\321\235\210\247^\216\2052\221\331C$\376`\375?\246\253\271K\017f\232Q\366\317Sir\244\370H\201\035\247yIs\225`z\017\247\247\257\364\324\200\332\2447X;\217\366\244\353\210\025'\327\042k\212)\034\202\017\037\313\2364\007\0022S\254}\012\001A\211\315\321\242Hu\257\011l\250v\033FG\364:;\016\020\\\301`\337\346\273\354\224R\253.-\325\264\2248N<0Q\277\357\264\220\017\352>\372\260(\022\206\337\225j\327F>\013\354\336\242\322\351\363b\337\367\235>Z\331m\327\251\365[=\372{\233U\352\333\345Ki\324\363\370\333+\372\201\330\360\375_\355k\364\256\332\350\301\367\016\376\026\377\000O\350#P\335\301\377\000\222\322>\216\3740\331\375\014T\252\235\036\377\000\270&5-\011\017\323d\255\016DJ\361\200\340IBV\227{y\2708\0309\035\276s\327\376\325\263X\003f`\366=\327M\323zL\232w\037\014\232\357\350\254\031\246I\220\244\225\374\234\346A\001Iq\325e8\344\021\267\261\347\267\035\365\307\222\011\302\350\011h\366]\245\352\224e4\303\223f\314s8\302\266\204\264=\224TFq\367\317\246\245\241P4\021e\032Q)r\244)\365\325\327M[\005>Fc\264\266\267\377\000\363X9?\256=\264x\243\035\322\023\317Xe\375z\042*\224\030ILwT\324\366\230m m\371\255\214\347<\017\017\036nO|\217\345\246\233\204\243%w\026\271\\\225Pf M\021\310\222\042\244\376\365\267\026|B3\370\201Q98\347\277\276\240\007\022\011R\320\317\366\347\331\016\310\371\305>%Js\303\204\326\034PSk(q \344\244)?L\340\367\036\274j\357\212\373\242G \002\233\312\201E\321A\247\306?%\012C4\227\324\\CE\005im=\212S\221\330\021\370~\276\330\323,\300\245G\351\234\367Y9\011[V\272\250\025% m\213\031\346r\226\312\002\233X\036\203#\2663\300\376\272\263di)\370\364\2224`\362\203*\265F*\254\307i3b\316S\010\360\216\3346\352s\350\244p~\271\000\214\373i\217\012\305\205x\335\262\332\344&\322\247\231\210a\025:4\232{+G\206\322\022\246\337H\356\260G\0109\030\3060{\203\221\214-$D\346\260\231d\254\003\011\210`\370\365\230mDCt\347\024\316\370rP\237*\3018R\007#9\362\222\203\353\365\322\244y\251\013\305\377\000\035\234\372\244oT\354\025^4\317\016]a4\372\324w\212\230\251\3028 \366\303\255(\016\010\310 \371}r\010\007@\223D\035[\271\035\326\206\213]\267\201\217D\003@\246\324\036n\035\262\374Q!\300\261\024\217\015^\014\245%!Kx\344d)Y\033\301\341;\002}\201s\377\000\214\025\346E~\2644\227+1>\024\233b\207Fe\346\252\022\356GV\226\0422\324u;\3419\264\356u\230\303\314\343\301\000\204\005y\033H\334pT\242V\227M\345\300H\307\251\017q\263\345\037\\\366\037\272\231\244*\343\223.55\330\261\255\252s@4\224\007<I\\\222CMc\215\352'*X\302\211'\266Fk\026\225\3156P\347\32406\333\237\333\353\331z]\267\010\261(\021\240\242\233]\245\301\337\362\311DfN\351\007\225\251\030N\324!\261\374Gq**$\245G\235t\272&\031\011\265\212\3573\256\355A\321\205\325%\231H\204\323\366\363\017%!\345\204)\251\017 \366A\360\202\224\241\223\222\202\352R\012\271\301\343Z\216h\036\350/\256Jl\320(\323\331\212\324\350\360\337B\223\346l\255\335\312@\3167\251\302p\011\367\012?\177|\375L\342\225A\276S\006\234\303%\322\374\267\323\036Q\362\222\207\234Y\343\323j\210\030\372$\001\222~\372\314l\347\205W\264\325\005-\042\215MIm\310\363\332\010P\312\267\262\001\037O(\035\377\000?\276\234a\274\224\261y\340\362\200\256(u\210+q\332e\275P\257\244\234\204\235\301\030\343\236\312<\363\370F?\321\221\033OzW\211\300\341\305\007\377\000\274\021\352\021\335\217U\207S\242\000\242>Zr0\032>\350p`\216\374v\374\265\001\204#m\356\325\306\212\245!M.$\231\017\314\010\000%e\335\312A\3668\003\323\365\032\023\2328(\373\\xL\373Z\277\025\247\233\214\3634\371\310\000\341.\245*\337\377\000\304+\324{\016t\234\221\201\312\033\332H\301\244k\026\263F\252\374\302 \034\274II\033J\000 \343\005<\022\006\225,\274\025\347\265\314\311P\355\255\346\352\256\302ktX\321\320\024\343\205;w\225\016\002\007\266\001\344\353&m#\215\320O\263P6[\271F\264\212\334f\024\330\212\242\264\214\022\254c\356t\364\032`\326\355)I\311y\262\216?\365\016\014d\355ztg\3228\330\321\004\037\272\275\265\350\336\320v$\337\240\220\015\310\012\347\270a|\273\253Y\022b\251$\024\000pA\364#\333Z\032h6\276\330\250\366\227\266\235\205\371\335\352\264\312\2553\251W%*\206\265\265Lj\240\362\032\001c\001\033\216\007\177\277\351\257\273h)\3605\317\356\276{\253\015d\256h\365QSY\251\275\010-\342\265,\016r7m\367\343L5\347\262NC\307t\231\250I\270C\353\214\323\311\311;pv\366\377\000\317\257m2)Ip\354\246h\020+\021e6\373\356%\021\311\347b\2223\365\307\257\256\254\342\3243!\254\246,\352\212\332\202\247\033\334\204\201\330\236\337_\345\2404\222UYN\310I\304\337\363)\365'S3\345\230\214\017t\344\021\367\363}\264\320e\360\210\\\001\3121\225\324f\214]\361\237uj\367J@\003\353\234\373\377\000\256\251\341\013T\300\317*6\233\324\031\016\257\016(\355\036\245 \340g\337\215\021\321\201\312\202pQs\367\2455\270^2\222\333\236\274+\267\037}\0142\312\226\260\200\204\336\352\354\010\316\024xiBG`\027\205\017\357\037\337}[\302V\266\326\024\275+\250\260\352;V\333Om\036\212P\317\266\017\367\351\251{)U\255\316\024\350\275\042\370\241\267T\031\354FV\011?\227\345\374\365\003\331D\221\216J\377\000Tnh\001\202C\252\347\323nO\327\235V\215\253m\254\004\205\274z\2212\234\267\014t \214\221\205\003\217\345\353\242\006vV\017\015\344%\324n\260\370\222\0032\030C\001D\216TS\273\3548\032;E\014\251\337\270SQ\233\325\210U\006Q#\010\031\363\345C#\371k\304\366\012\201\235\273\250\347\312\037a_,\302T\357\324\221\236\332\237B\207k\232\221Rr\034\257\011\324,,\237Ed+\373\366\327\266\337<)\276\3414\025W\217%\264\245+F0\011\347\237\357\376\337m@\207\272#\236A\240\241g\254\263\227\033R\324\254p1\333\373\347Sf\250!\000{\257:r\236u\265\251\364\226\301\030\344`\377\000\333\327\333V/8W\003\026\024=ML6\2458VU\267$\201\316\177^\335\361\253\006\336U\001\312ZW.\030\221\234@\313\211Q\316\011\034\036=\201\324\201\315\253\265\266r\275a\327Z\225\035\016\266\363iOnV?\353\251\017\001X\260\205S\025P\224\304\226\241%J^\322\022\240\0018\3751\377\000\215!\232[q8\013<#IL\272\323!nHi\306\324\234yG\230\177\327\327U6\024\264\347rH\311\253\265F\256\355TYr^q\\c\004\214\372\237\247mU\355\004\252\274\215\266]\222\254\035$\306\250\323\230\361b\266\300 \025%\354\177_\373j@Q\037\031E\011\377\000si\255\227`3ID\274\017\3009\317\345\367\324\230\310S\030\334\203g\\\353\022C\316-^\0208RJ\262;\375\207\327Cs\0025\371\260T\\\373\305U\204\242,\012R\234o!;[N\012\271\300\340\003\237O}E\200\252\352\002\301\265y>\037zM\361\006\270\002e\023\243\267\205^\212\227\022\353\321\252v\323r\242,+\374lLk;O\370\233)?Ppu\221\324:\216\222\252Y\003H\367\242>I\2154:\201\2264\233[\033\360\365L\352}\263Iv\232\327E->\233Qe\270\265\276\335\002\240\230\355%\361\307\357in\275\275\222\241\316\366\274D\2220\255\247\235|W\355k\316\373\212\177\020{\363\360\335\335}\037\244G\036\317<{\034?;\376\225\246\231X\255*\0334\226\253\024K~b\312R\\\236\317\217\273\350\220\216\344\372$\347\237]p3x\216\033C\200\370\255\250\243\214y\334\322G\261\244I\026\273\362\261\330\216\211iL\324\017\3368\333E\005\325\0167x{\224@\372d\363\255\030\2160\225|W\312\340n\244\247\262\364\270-G\334\242\222\363\312V\002s\300\010 '\2764kF\256\311\211m\205H\212\366\322\027\024\225\005\272\200T\201\366\340g\036\270\316\217\003\260B\307\326\001\273\030+\3550a\207$\204\302\200\032RHZ\312\226\331'\335%9#\357\365\357\246#\001\243%\011\3628\367Q\262\353\265\000\313pif\2133a\011\374E\305`v\374IN\017\324\022>\276\232\273\315\237)VlM\345\366\242'U+3_\204\324\351\264\331-\347.#qkh'\000\2222\220\240\177\213##\276\212\326\326W\210m`!\232\275=\252x\2335K\251.\012\311_\205\200\342\002\377\000\305\2370\317\007\236;\236}\210\007eh\335f\225{\254M\266\303\362%\303r\355\247\370!_2\217\2213\033\216\001\347~|\376\037$\3569 \034\023\306\215\034\035\300Z&g\217) \376tT\335\255o\321\356f\033\2519S\2032bI\021$EG\206BOb\222\265,\247<\017\042\316u\246\322[\202\026d\323\220\352\034|\324\333U\010\210}\352Ei\232\265F\242\312?\341\234u9'\035\320\026@'\237\271\036\244\347KOe\270V\216<\207\003A\006\311\272\233na\217\276KQXZ\312\330\220\311V\327\010\341I\377\000\012\263\301\031\344\035d\200\373\276\313l\304\332\276\345\023\267\025\027\\&\2212$\210ht\205\303\250\307R\234\371w\377\000\016\035\334\220\264\225\022RP\260R{\205\003\2159\341\356\240xY\205\336\0314o\331\034Qi\315\333\264\230\263\342S\015z\345gz\031b:\002\202\326U\345-\214\200T\242p\011#\034\362=.\367\2226\245O\235\376cAO\313\246\327\251\250\227Q\276\2531dN|\251\221\016\235!J-\266HN\315\350\300;\212\260Oc\310\033\200'T\007\260U\017k\216\330\360=J\032M\305o\272\344\312m\277A\211H\222\264\226]\226\304@\247[@O9yD\253'\034 \034\221\310O%C\315\217\031E-{Hs\315\373\024'/\302\247\276\304xi\254=4\200\246\236\250\307Z\366\371r\247\033JHV\324\367\302\\l\002F\345\244\362\035\205\2406\273(\225\305\346\311\371aw\323\233\250s\025\212\323\264\266^h\270\020\312\322$\274\265r\227\036q\257\020\245$\344%\015\270P\000\300+\345Z!sI\244\002k\314FW|;\012\022\200\223R\271\305]\204\022]i\231\317\243\303X\031\345kS\233\217=\267\034z\3438\024\231\227\206\212W\032\267\3361\371\042\370\302\235Ha\331&\021j3\015\225\251-\370\222\234P\003\276\001\306O\260N\177.t\217\206I\256\027\236K\273\331)o\017\342\376\317b\260\365\271m\321\246\277Vm\305\266\341\251\301z*\012\223\214\235\205)qH\344r1\273\276q\316\235\217NZ\352<!K\322\367\0171\375Tef\355\370\232\255O]B\314\255tf\336\2459\346TX\326\353\356?\353\346/:J\312\361\201\352;\361\333\015\275\266<\270\370\345R8\364\314\036v\223\371\243\032\035\343|T\0427\013\250\177\262ku\006\200\012}\206\013JW\377\0004,q\355\236\307P\3069\243\314m\015\320\304\035\272!ArV\250\360%%\351\264h\362 \310H\302\330q\264a\301\376\0368\374\275x\301\324\271\241\330*\361\310\346\340\225!mIm\200\314i*JP\221\224\264\356T\244\376}\370\307\257#\323K\314\300\025\356\315\204\337\215X@\246\274\245\316\224Zm9;\010\030\036\371\3018\032\317y\245\0023`(\277\367\332\200\353\014\374\375\303F\230\227r\033i\265eI\300\356\256\304\217\251\037\256\225d\355&\2550\375\034\200a\247\010z\255Yz\242\343q\251K\220\344?U6\017\230{`\360\007\365\327\245\320n;\270E\323\314\031\370\371RH\234\374X\361\324\343K\211Oo\001`\341JZ\276\240\022\000\372j\321\304\326\034eRy\013\360\244k\027\245\276\232D\246P\264\262\240\331R\224\000*O\363\326\317N\247\034,M^\235\374\205\212w\215\311M~\356\270\245Ehxfk\312B\311\035\267w\334Ny\306u\366\215\023?\302\333\364_4\325\222eq\367(Uu\3211~\023\301\246\321\214\001\337\003\373\373w:e\300\004'4\325\2043R\237FK\201HDgd\360\011IF@\374\377\000\276\372\277\233\272\220\333\030\345{\323\252\036'\221\015\000\234\360\002FA\376\377\000\323P\341Y\265.i#*a\324\356i\335\351\347\237.{~\177\351\252(a\015Iz\365\022\235P\230\260P\320|\014p\256\337o_m4\307\343\010\216\215F\265c\270\246AbhAQ\354\246\362\023\375s\333\373\316\245\322\344\252\026\342\327\366u\266\370`\262\321.\002N8\037\314\017\313U\022\002\247\303\364Ij\235\277x4\373\245\244Lm\220\256JI\031\347\371z\350\266\020\267\322\203\222\232\334\002\217\233v^\365+\272\234\004\203\217\257?\370\327\234i]\201\245\024Z\325)\005\322\330~C\312\011\332\254\220@?\365\325H\265.}c\225-W\251\324\02180\230\262\336\030\007rv\340\017\364\003\032;\015\004\042A\302<\247\225=\031\265:\362R\234\004\214\344\001\306\204J6\373(V\243\006\005E\327\030\220\200\357\233\236O\003\354}\177O\345\2534\250tt,\241\372\315\251J\216\337\3141\021i_p7\201\264\352\024m!s\321f\344\210J`<\203\306\355\375\317\003>\370\377\000\266\254\007{UL\042\310\215\004)\264m\035\263\273\223\375\377\000\323D\002\271Tp\364A\257-\275\357<\247\012\012Fx\003\267\327\327\333^m\242\355\000\344\257zl\240\373\201#q{ \344\037\374s\253\211=\020\334\0017\335\023\311\232\206\222\002\274\230\364Q\030\037\367\325l\005\343\236\027\264z\243rc\000\322\200=\270:\273\032\011\311S&\240\201\266\220}U\271N8Y\013\306O$v\003\357\257XW\016\305\0049:\322i\364\274\247e\250\272R3\350\017\347\235P\213^/\305!6\3553\035>\022eER\001;rOl\375\365p\352\341Z7\264\014\254\376\253\365\015\312\235w\300\244\256s\3621\202\2046\000G<\372\347=\273\177\246\262\304\236jj\327\221\304\012S\326\335\327s.\274\304J\203\323\274\025~$\224\343\003\327$\367\364\376Z\263]n\242\250\335\307 +9Lv\325m\306\234\250\276\201#g`\240\024I\364\317\267\257\345\246\002\241\334\341\220\274\252\260_\254x\255\321\037L6\360HR\335*\000v\364\347\362\375t'\224\300}45\001E\265\352\024\271\353\371\333\204J{;\277\012\202\001\037s\251\274Q*\261\325\224\335\266k\221Y\360\351\365$\303\222\222q\235\271\343\337\327\373:\220AC#4S6\337\240\316\274n\026m\253b\312z\342\250\274\223\340\304\214\333JzOs\206\333R\222\\8\007\204\344\360x\322\363\352Y\030\334\363H\261\300]\206\255W\370S\260o\345R\242C\254\365n\354\263\351\360]\360\225f\\V\334\206\236goq\021\351KAK~\207\301*BNr\237]|\177\355\346\233A\252\033\344\216\317g1\324p{\325\337\346\276\201\366V]l\026\326\234z\020\264\362\226\355\267\016\013\021\244\305\255=QA\011uO\313Xk\036\213\344\245\005?\\\361\374\265\362\231\313G\225\200\256\304\231]\222E\037D|\370\213\362\212\225JM:VS\346\220\227\222\266\222\007p\026=~\203'\334jZ\320F2\223\004\336p\200$\262\347\210\364\266\322\245 \220\016\3362>\207\034i\2264\014\004`{\005\341\016E&\032\203\356\322\243T\035\337\373\265\357\306=\011$\200;z\344\236\016\017m\023m/:2{\322i\321\242\232\303N|\304T\267OJ\222\010e\305\225/\236\003\203\220\201\354\024y\347\203\253\002\263\346\362q\312/\221\016\241!\230\314\256\033\264\326\225\346\360Auk=\370*A\000\203\337\220G\256\231l\216&\200H\035\255<\256\257\367b\213M\214\340\222\245\324^W%\245G\334\007\036\347\033\200\347\270\343Gu]\224\026N\367\034p\204*\012\262\230q\017\314\241\301\022\320\223\347\001\266\202S\365J\011WoN3\252\015E`'Y\247\221\335\322\312\361\276\343Eam\305H\207\010`#\367\012\374?M\333x\354y\007?M]\231<\224\374\032:\031\345\004\241\230ux\015\324k\022\025E\245#\012\017*SqT\347#\005\012\005a^\235\200\343\327:\330\202`\301E!(yykE\376J\002\251z\331v\373R\012\25245\323\311)rB\222\316\346\277\376W\024\274+\236rq\201\334q\247\332\366\311A\245\001\332I;\205\325C\270`\334\014\246\243O\257F\253\306Z\367\203\025\304\312\015\257\003\012HiX)8\355\216\371\347\215\031\320\212\300Cx-\024Q?\355\370\263#|\242\276^|E'v\347XH.s\2006\220x\347\324\234{c\235-\262\354p\2400\362\270\340\\\356/\347`R\231\\7P\340)\013G\224\016\307)\340\244\024\372\344\361\357\350#\001\255\310\216\015\037\211\030\331\327\003U\011Q\231\203\031\226j\340-\013K\253H\024\344\204\247s\244\214\214d\204\244\363\312\210\034r\026\232:e\225\351\000\007<!\013\342\262\304\011\310C\365\251NSc>@\216\337\356\376e\360\222\224\227\226I\376,\354ds\204\225)X\030\014i \004dr\256\001\355\217\341FZ\023\234B\330\042 \213\224xIB\225\343% \220J\032J\210.(\235\205n\245\012\311\332\012\262xcQ\010\254` \275\310\356U\026\342\2371o\313\250*\226\227\007\206\313qa\260\211\012X$\225)ox\356)@m\377\000\361%\266\366\344#r\201\002dC\323\037\025C#G\226\224Dki\352R\035v=\016urk\216\200\271u7\235\237\042b\317\342\013S\247\201\204\214\357sr\273\024\355\000\022N\010<\253\011\20195^\230LZ\015\251r\324!\025H\233\012\002P\200\226\333e\226P#'v|\2156\2056\025\333\225n\003<$\036B\316\231\255w\252^I[\330}|\323)\273:J\241\354\253\311nz\300\306\365%\012Z\011\317>:\310V\357\260\037~u>+^(\245]5\037*\007\257\333\357G\206\266f\276\355\307\014z=\035.\024\217\246\012\202\207\261\032v\026c\312\245\232\200\347c\010**iqJ\221\012'\354\247\207-<\323\1770\331\347\261kzN{\360\024\017\351\257\002n\216Q\334,.\271s\037\251\262\241&%\022\260\244\237\015\022\251\352W\211\267\374\314\224\356I\367\000\250\014\343\2350\350\301\030K\306h\341\002|\303\355!\303Br\025D \222\343Kt\241A<\347h\306P\240{\202\000\364\300\316\227\334\177\011O\325\340\241\357\367\215U\007T\314\310\262D\306\216\320\227\032\011R\007\267\177\372\217Q\245e\004\341\031\215\333\220\211\342\315\270i\312\2132\334\253\266\230\330H~\014\306\011h\234\344\251.\217:U\317\257\034zs\254\351X\340p\233\335\021\303\333\371\204\332\267m\313^\\\217\333\017Z\0248\225\227\023\225\270\322@\013Y\367\004\341G<\347\032\206\300\007\341\301HjuO\003iq!\033HJ\035g\366{)CN\241$\226\203A\260\223\237Ld\037\327\032#\036\342)\3517\020\016\346\245=U\372m&S\306M\327\022\013\210\034\307x\241\033s\356A\306t\273\240\247XZZy\334[\2645-\353U+:\233\006}a\343L\252DX>6^Sm\250c\236H\331\203\237\267\363\326\327Kd\245\340F\022\032\327y|\370Y\031\326\031\224\264^\262\252\024\252,\272|\007\226r\267\036\017x\270?\302p\002R0\000\300\003\267~\372\373/L\335\341\006\270\331_1\325V\363\\(X\311\211.2\\F\335\3308#\031\036\231\343M9\244`\244C\217\010\016\241O\205\032\177\314\314\234[h\022\0079\347\277#\324\350\340\371p\275\213\262\270Qq.\023\314\245\014-\306\267%9\301\030\373\215MR!\3126\215|&[i\216\373m2H\340\224\037\323\350{\373\177]\004\304\006B\260\007\220\205%\265\031\331\312y\012\033\317\003\314=\373s\371\234\375tQ\302\206\236\352n%\012\242\356\325$nh'8\334O>\331\372j\246@\2405\300\222\345\301[Z\350\261\324\343\310u\034\376\021\214\343\032\210\300\042\225\332\352\310@\361n\027j+u\266r\312\011\034\025yH\373q\317om\023m*\270n\347\012^u\257*\266\320Q\214\016Q\301$\002\177_\365\324o\001C\232\033\302\376S-\226(\216\004\276\206|Bs\200\006\017s\307o\276\275\276\370V\015\261j*\351\250\321P\342<f\3434\240wg\003\007\277\000\016u-\265\004V\012\360\245\325isc\341\245<\010\004\025~x\340j\304\220\250X\020\244\301\031\211@\247\001\323\311\012V\025\364\317\3755.r\270h\274\256Y\025t\251\245x\255-E'iG$\221\220?\351\251a'\225i\015\034.x2\3427\346f:\323\223\222N\020N\254}\0245\300\014.\311\227\023\252a\3209\3649\306>\344\376z\220\354R\207\214\240\366\244\276\347\211\205\226\220\256\011\3321\237|\372\237\246\210$\010E\247\262\214f\252\252L\207\334Q{`\030\343\214zd\034}G\3663\252\326m]\243\325s\273p\313\234\370e^#jW\266\012S\364\316\213J<22TkW3\264w\313*y\354r\012\267\344\021\237_\257\246\240\232\013\303\321L?\324\012\\f\326\267\347\270I9 \244\375}\3646\270\332\271m\214%m\321\324\366\234Xf\014\265-$\367Fx\373\177\323\327Vq=\225\032\002\022\377\000}+d\002%xc\320\022\274\343\323\261\325E\234\242\214a\301-\352\364[.3N\314\244\263%\371\312\031\312p\222\243\356@\003\353\245\000\027\205\246YB\225p\273\035\274\230\226\353\324\330\225W\007t\240d\034}1\216\177\353\254\371\235 q '\032\370\3036\223\224U\323\232uy\351(\237r\2717\303Q\300K\357\021\217\257rO\367\317}\022\011\034\177\026\022\247\031\006\302\2714xM\274\334V\351\257\266\371P\310ZS\302~\304\347\371}=\364\353\210\001z,\340\241\353\226\325\201JR\346H\254\311zQ \224!I\333\237\276y\344io\02077i\307\304\\1\300^\024\212\314O\032*\002\331qIP\344c\371\221\300\343\032\250\234\034Z\017\204\007d\345\231\006-g\366KM\326&\320&\262\373O\265&#\301\267\3428\225n\0164\276v,`\020q\301\003\323C\224\227\003\204\324D\263\216W\351\273\242\327U>\374\260\3559L^\027M\341Pj\013\005\371\225zk\360\235\225\204\204\370\252ii\010\302\210**`\255\242s\265^\337\236\276\322h\035\006\245\300\012\027\353\217\257\216W\323\272N\247~\234_\327\327\252k\312\271WGq\250^\012g>\242\022[n(x\023\376T\255<\367\343\215r\272\215Y\260\320.\377\0005\256\315!x\334M\0059:\265.TF\230U:l'\324p\343*CI}|\372\204\235\255\244\360{\225h\215v\354wJ\210\300$\335\240\311\365\012\272\002\333\360\304v\023\370\031@''?N\376\347\320z\236\332;\030y\264v4\037\212\346\267Z\232\343\315T\253\223>fb\037>\004\010-%\334\016\333\2262\234\343>\252\332>\244\001\246\017\225\271C\224\362\326\214z\246\233t\272{\210aN\210\320]*S\210iR\300yJ\367\033T6\234wV\374c\351\2533\326\351$dwa\371\256\312}\022\347\206\351r\205]\227\0262U\373\317\025(|l\003\376XZ\362\244\247\261\3119\372\216\332e\222\021\312\004\356\215\330p\312\005\257ZW\015\304\271\255\252\342\2506\264\036V\313\256!\230\351\365R\327\275\264\216}r?=Q\363n4Bj\011\233\020\300\375\024e\275gQ\350usLk\2507U\347V}\265-\020]\252\252LX\350\340\0257\031$\255x\367Q)\031\365>mN\226&\356;U\265\032\227\354\336\346\355\003\333?4\316\035>\241De\364\277H\211\271j.?\363)D\227\035\373\264\255\310BO|\224\3759\300\326\274\033X\261\244\326H\376\016\022\336\271l\322\220\036B\250\361]o\267\204\343A\304\2458\343\011e@$`q\345\003\266\265t\356a\031Cl\257\273\007\344\202\351\2750\242\315\222\355J4\216\234Dx\266[Z\215$\242bS\237Gv\251a#\214\201\264s\370\206\264D\200\014\004\031\347u\371\257\347\2053M\265-\232Tw\2514\326(R*n\222\350\221\022?\312\272\2428*\334\234\025\237\376\304\372\221\337>'\272\037\210\342m\330\010J\256\334(r\262\354\332\3447\326R\020\266\346!\304\221\310\332\266\334H\310>\243 \361\200pt\303Zk<)l\236\212>\277Q~\014\270\217\327\333Dh\256\220\031\232\312\226\220\332\202F\007\004\251\245s\234\022G<j\205\203 \042\302\353\341<\355%CD\033\202\246\303\214;R,\260\0215\267\033Z&<\032^\340R\223\234\264<\036\376U\227RS\334\343;T\300hR\033\211\016\256\311'{\265\323\350\355[3*\262*\016\317\202\353\217\242,v|w\236X\312BH\004\227_q\347\022\245\253i\332\032(H!z6\225\204\330hL\202\363\360L\312k\225\252$E\310\254\267\016\337g\303\361\032\2473%-H}\303\310m\331\004\254\241ED\005\254\370\213\007p\310\306\012\246\236\355\250Nh<|\320\323w-\344\245~\304\240[\202\253S\220\265\011R\230\224c\264\200\025\312\032\013W\212G o$''%H\033J\233!\215\026M)\360\333v\342\211\003\223\251\355\252}}\312\037\355\010\371K\213\215\270\306\210\202HI\361\224\002\260@\306\340\020\245\372'\034\025\334\333\024\325 \207p\274M\337\016\254\334\270\324j\355R@\214\254\313\024\370hDv\0108\375\353\205y\034\2200T\222N\001H\343I\267H\340Ir-\355\311\013\266\233)\264\272$\265Q\236\373\313\007w\211\224\241G\352\240TU\366\340}}5Q\010\274\241\3135\212\254&]6\243:[\042\025U\270H\200\264\225\042KJ%\326O\270\307\241\356Fx\372kGL\010<,\215V\321\221\312V]\351\275(rZ\227L\247\323+P\362\202\244\207V\333\312G\361-*9J\300\004+\035\306O|\003\246e\214U\201\224m,\354w&\220\325\325j\324/6\243V\355+\276\251l\335\015\200\350\2171;\330\226\214y\232V0\342\011\340\205\244\251 \362PA'R\327;m\032W\023\010\335\265\302\302\017\244\327$]\255<\353\310E\042\362\202\357\312OINT\034H\300K\330\316\341\217\302\240y\034\021\350\024- \345>\341C\034/u\311}\307KR\323\036<\246Q\271\301\265X\333\356\225`\034v>\240\177=\005\326\323e\021\201\023S\244\242\240\206V\304\244\266\362\220J_\007\312\241\377\000\324\234\217\2564\007\275\204\340)s\013\0159\0247>\251\003\345R\335\034OJ\3072\042>\217(\377\0002s\237\247\037\313@1\027aT\275\274\360\272\225\\\272\347\274\303\021\033r\023`\020<C\260\221\365 \223\307\370{\363\337^\225\341\244\016\352b\201\244Y^\325z\035jU\026h3)\262\022xS?$\363\212q\\yw\024\340\375\373h\260\314\327\341\301\003\360;\312\222mVz\217O}\306\234\260\353\316FmxB\231\202B\020\007\324\363\333\007 kF-9g\007\365J\317$G\361\020\251\177\304$\213R\352\237\342\265`\365\356\362\273\032\377\000\234R\247\221\001\221\317\012um(\204\203\311\010\037\230\311\327\321:\033\344ki\316k[\371Z\341z\250\216\355\206\312\252P\247\252\003\246#\361Z\245\274\236\361\220\262\257\007\374\244\222Nq\214\344\347]>\034,\033X\257m\032]U\323J\020\003\206kJ|\216|\340\367\366#\201\252\304N\345A]\320\245\036;R\236\017nC\254\005\0172pA\372g\337\355\243\023ACH&\324\365R\231Dx\2056\333Ks\000m\310$\352\214qDkNJ\376&=1\266\220\343\357\241N\003\224\247p\375y\317\367\236u \233\302\212EPn\330T\370\201\013X \361\377\0001'\035\375\207\363\372h&\0339QhB\351\233\002\265\031G\346T07-+I\332\237\270\356{\352\354in\024\325\346\320;\022\343\320\340;1#r\300\343;x\307~>\271\3219E\240W\362\225\325ET\330-\026\036Y\007\001!x\3301\365\032\206\306\002\241 \212CU{\361\217\037\016\272\332\211\356\234\344\204\344\367$\361\371\376\232\261*\000<%e\341P\217Wa\271,\255\267R\010\004n\300\003\267$\177|}5v\273\262\261a\253F\026\\\352DJZ\222\344\2246\342R\243\264\034s\216\016}\265W<\223\225\177\016\222\336\245q>\355L\252\042\\xrT\255\370\003\362\364\374\364M\270Ac\263\346^?\372\213\030\273\362\253`8\244\343+\311%J\366\347\031\320C\250\3229kH\265\313T\274\337B|&\222\353o\024\356\334\220\220\254\372\177M\027\034\250;F\012\017\225\3249\264\366H\226v\264\236\023\352I\367\034\000\177\277\246\274\036\252\030\006JPJ\352\335\330\305AF\033\017\224\022v\2203\307\334v?\177\365\325Z\3572\251x\374!\023P\272\233>\250\342WZ*i\374\222\002\300<\367\372\034\375\016\211\276\227\203\203\371_\332\337U!RTK \274\376pT2\010\037A\375\372\352\013\254/x\200`\250\007\357\011w<E>\314\227\032e$\344\244\224\234~Z\220\241\316i\030U\372\372\272\252\254\241\346\277l\311C[\260RR\257\320\361\356?\247:^W\273\375P|F\205\025C\252Iq\037\277}j\307\011\312\210\311\367\307\257\347\253\261\304\014\242=\355<&t9O\271\035\012T\351I>\3119\0320$&/\324\322\237\352\024j\027O\222\354\311\025\326\336x\234\024\356\310N}1\357\372\353:W\206w[\245\204\266\312\344\351\347S\354:\314\226!\310~\004\267\012\300Kn$d\372\366Ry\372zj\354\324\306\346\362\222\254\322wu^\331\251\303\262\341W\351V\255R-\026[E\370S\2055\301\031\3208\312^\011\360\225\217\241\343Kjeh4\015\037\256\313GI\247\335\036\352D]!\370<\370\365\215o1\324\213\227\240]H_Od0\231q\247\010i\330\042\253\005/)\244(\253\303!IP^\334\020s\234k2\036\255\016\375\217\220_\305Y\232G;,\027\360W\032\321\370\032\352\337S\354\232\345\321\032\316\257N\253Sd\255\212\215\274\270NA\252\204\001\377\0002\033S\003LK\343#j]\012\004`\355\316u]w\\\322\304\355\262;\236\017o\316\262>H\332}\036\242C\266\252\277U\245?\015?\354\344\350\277L\221K\272.y\337\357CuzkN\273I\270mI\264\372\225&I\031So<\315Mm\002\222\245$\247\302'\325.\024\236~{\326\376\333\030\334c\214Q\035\301\004~\313\244\320t\027H7\271\277_\252\277*\217kZ\210n\217F\241P!\272\310\360\330C\0152\202\244\217@\265\002H#\324\223\372\353\204\325u\271&\260\347\347\343K\253\323t\230\330\001\015\307\301\022QP\354\226\022\034\204\3355\264\345m\306mH\333\271\\\223\261 %$\372\234{i6\272B\335\322\331\370\362\230\221\254i\246d)\244\325\253\2548\206Z\266\334u\236\336&\342q\367\004\204\016\340\202x\372gY\262>K\275\250{\031\266\313\250\256)%\000\271%\337\223D\200U\271[\222\226\320\263\334\025\037\\i\2263\375\212\3633\202\2275\204\264\333\200|\362d\272\347f!\262T\342\363\333\223\311\007\376\375\271\321w\013\240\230e\327\012Z;\217\304\211\340S\232`\311\332\237\021\260F\304r\011\012\332\260p8\344\235y\356\263\264*U\234\242\232\025\024O~4\252\223\024\311o,%ht4\211jm\000\202\012\017#=\361\214\201\3379\344\025\215\000\332VihP]\267=\333[LZ]\016\336Df\246\274\360\212\312\344\224\270\374\225\347*\0150\327\206\202\255\274\225\014!\000eD\362tg[\3157\262\014:h\331oyQ\324\233>m\300UN\270\342\322\253u\004\250)\326\231[\213\215\024\036\001u\325m\016/\215\304\245\015\240p\224\245\177\210\3054\232\345\026MN\321\270`v\365L\3100\254\236\236\261&\035\012\213m\322\324\342w>\353Q\320\332\344/\276\345%8$\361\306{{z\351\34647\015\024\262\\d\227/6Pj\3578u\306_\251E\235\363\015\245\3257\204\2146q\234\371\363\264\216;\017\327L63\370\212\263\342\015;\012U\\\327\203\365D\276\324\252d)\220R\260\220\332\233i\3021\35223\371g\333\276\217\023\234M\004s\246c\000;\222\336\213\\\016\313\250L\267\242\265\024\245Jm~\003.!\266\226\001\004\341\004\000\274\214+\360\343\324\037]\306@\342\336R\323\220)\256_\027\025\327C\205M\217O\257\303\205\002\257)%m\270\245\226\336Wm\313\001$(\355#*\011\3540q\311\323\021\0020PZ\317\366\011]x\327n)4)\006\230\212\265\305\021\222\264\313m\223\342\310m\274\003\275\005^r8>\204c\276\334\214\352\351\266\223D\322]\355\027j7\246\225\250u\330H\270\351uY\027\005\026$\265\304\252B\211;\316\303\211\000\370oBy\000\262\346\006\344\216\001\007!'\361h\232\230\303y\302\202H\033k*\330\331uz4#!\312L\230\315\333S\310.\266\031J\011R\\\007v\007\341PRP6g\036\240\014\234\344L73h\345T\207]\273\262E[\263\350\351\353U\353=\270\365J\355\375N\205\006\337\202\325I\262\230\261$\315%\304\042\022Rr\264\374\264\177\021\305c \226\232F\337\025el>\027\010@\034\037\343\353\010\357;\200\334i\243?\322.\024')\263[\257\334usX\250\2710Gzw\317\374\273M\005\003\344i\340w\025\235\256dGJ\022\204#o\2161\202\203*\210\011\217\022\360>__\312\202\247\365\242\015\300\331\211\321\213*\346\272(\015 (T\232\204\343T\251N/p\005\022\334\362<\204\243+[\251+m\266\310\011Z\326\351\0043D\342<\306\221\231\003\000\271\035\371wP\027\365\303\042,\212L\373\322\276.9{c\271L\243S#\251\341\016R\224P\247R\206\224\362\344<\341Z\033o\303orB<\241\315\304\264],4H\345T\274Q\000PL\273*\246\362\2403:\347\256E\265hM\270\324h\320\242!\267\204w\224\274m\015\307\005\247%)JW\356\331\017\250\022@+;\234Q\247x\272h\262\263v\366\011\237S\3525\253\011\270\024\232\\\204\327e:\326\367W2RXn\033c\225<\373\347\011'\0058m\224,\345@\015\376\236\217H\347\015\325\365\351I\042\342\323n\302@\365\013\342yv\034\232%\247\323>\232\303\277\356\031\353Z\247\277.\242\3248\024\210\271\003\346\0362P\350R\324\274!\0146\323\212;\\R\266\004\000\275]?Lq6\363A\015\315\016\363<\343\353\272\2606\225\300\365\337\022#\362\034\243\246\260B@n#\251s\223\214\035\210i\264\367\343\011H\306>\274\304\214\015\260xY\327X\034/\253\322\335\273i\224\265\212+?#VB\223\042*V\330\014IP$\226J\2260\220\256\301C\005\012\372di\032m\330\340\247\264\232\206?\005&\247\263\017\250\341\213\266\225\021\376\234\365\226#E\016)\364'\303\252%\035\343\312H#x\306\002\\\031\307\257\003\032\004\261\207\005\251\024\256\210\321\313\017\350\226\037\372\247N\271\003\2546UF\275)\345i\227Kp\241n!c\271m@\220\276?\203\223\351\355\254\362\341\270\261\307!j\2151h\017\345\247\272\233\262\356\032eJ,\247i*\243B\236V\245\252*]\015\246S\303\374 \371P\263\306A#\007\271\322\261\0265\324Qdk\310\363Y\012M\233\362\355W\216\265\320]\200\363.m\011i\344\2552\275\374D\220\024\331\007\320)AG\267\276\231\220\355\026\020\231\247a4J\364\240u\376\333\246T\374*\315z7\317\344%Q\031in\255\035\306\024\224\356 \372s\203\301\3266\257\251C\274\011\015\037E\241\377\000\303K\262\3301\353\302i?wD\273\312WA\254\326\351\371N\3440\363>\013`\363\301\037\210\347\330\217\327N\301\247l\200\0335\362Y\262o\206\332\340\011\371\252u\325\236\255\365\212\334\2356\236\335p\307Kd\245\267\234\245\022\246\206H\005>*J\006;\367\317=\265\364^\217\321\241 \036G\305p\335c\252\2723Mh\007\335S+\232\267\324\233\362Fn\316\242^\327\034@B\221\036MA_.\203\376V\023\206\307\334\014\361\256\306\015,P\212\211\200}{\256V}T\222\235\316rFN\267\253i\252\374\243NJ\360\320\177\013k\357\355\234\361\236\337\247\347\247\203\205Z\001\000\034\024\037wR\356X\322\321\024\277\362\261R\256Q\270nW\003\214$\234{z\352#\220\034\205\351\030I\027\302\223\267*\263\042\264\032}\304\251^\230!8\307\266y\366\321\036\252\327\002\027\215n\351\246S\034Ix\251\305\223\201\350\017\266\017\346u\015\265j]\364\373\306\224\266\225%\345)|\023\224 q\301\344\237\357\371j\267\330(1\321\\\265K\332<\310\257\263OK\301\236B\224U\310\343\266\022?<k\303\324\242<\017\365J\271u\372\252T\244\304\361\\F}[ \201\354\011\376\377\000MZ\320\243i\312\366fu~\251\011H]-n\205\371BQ\200U\223\216I\373\367\376\307\212#>\012et:\244(%\266#\275\363K\030)la \037\267\257?\337\257\200U{\201\341\006\326\354\252\233\314&T\267\016\300S\201\205(\221\337\201\333^k\225\007\011\201J\264\042\242\212\205\310\223\035K8\3438P\300\003\031\035\265<\224Z\354\274\027mSR\331e\033\002\010\005^\252O\353\217\247\277\375|[\335y\256\306\324]F\260(\351iN\002\267\224\341\031*X>\334\037\247\323P\012\211\033AC\334\035 \243\241j\252*\042\034RARR@\301?`G\266\250\343xR\3209I[\261\230\224\370\3573\035\246\333\227\306\355\240'\011\372\236\347\377\000: j\364\234YH\012\224w\237y\365\272\371FN\320\242\240F?\274\352\245\3242\275\033EXR\224\031PikR~Q\227\224x+V\010W\323\221\316\210\303b\325\234\002\343\255\3325j\243\251\227F\360\342\265\235\312\010\005!?oA\250-C\006\262\201\346[\221\331\224!L}n?\216J\222\016O\367\375\361\251hCk-N5\032\0356(\207\342\004\251I\311(\004\037\323\266\211\337\012\306\253\011qW\201Ja\305\312R\302_Q\000\344\022?C\301\320\213}U\0105j2\245l%\264\042lu\245k\374E#(\012\365\343\270>\376\236\232\366\337Er\335\270\245\343\032\231\031\326\202\334ZR\274\340\347\007:\260VQ\225\036\231\243\251NL\227Y\257\222\312I8Z\206q\306{c=\275s\333X\303L\307\345\304\332\352&t\273\266\216\023C\341k\242V\262\372\363\323\333:\013.\334_3Pd\276\321i\307\000h,\025\027\003jJ\222\330\365P>Q\317\247+\276!\021;N\002WQ&\366\323\271_\264\212u\345\016\331eV\304V\223\002\230\322\177\345\307@K\005=\271m!)W\377\000,s\3529\327\306:\226\251\317\231\305\305}K\244t\266\262\006\320\305z&\275\277\324\012k\264\341\036<\306\332\332<\205\030J6\3668\034\001\337\030\343\276\225\017\274\222\254\375\016\323a\252H\334\205\326\034\203\022\241K\224\220\220KN\270\2456\224\366\34198\036\234\020?\226\227\236\334\322\002\274\032}\247s\232B[?&Z&\276\211\224\212#\260\016J?gK\036>~\313?\207\377\000\216~\332\346\214\016\017!\300W\265\332\351\0310\3306\223~\374~\213\211\326\355\266\335(R\227\002qN\022\231Il\226\275\374\374}9\306\232lL\031\307\305\011\363H\341G\204]J\230\267\213p\005\331J\330A\333\034)\012u\314\016JJH\340w$\2164'\276\316\300\354%\036\334n\332~+\336\251[\223\0311cS\343\271[e)\362\242;\315\245\011\030\311Qq\\\016\375\317a\234gK\312\362\307\2002\252\306\007g\204\035R\257\306\230\352\231\2175O\241\274\356\014\267\373\2261\335 \362\024\257\251\343C\361\306\342FQ\331\021\037YP\301\306\220\333\225\007\023\205\347c($\005\023\236\352\364\031\372\362\177\220\260y\036gaX\234\320DQ#6\226\343\265R\215L}\322\235\351\214\266B\230l\253\272\266\253!K\347\227\010'\330\216\345\246\014e\001\317\302$\201P\307\216\343\012~.\351%JS\211!\351\252H\345 \271\222\334t\001\2259\265(JS\337\234\251\210\242.5\331\012cYr$\225>\207b\322eW+\325(\221\347\244\026'U\\iEm!K\310\217\025\204\205:\265\255jm)i;\224\255\243v\345lN\213\253\231\221\267h4\022\261\306\371\237u\201\300\354=\317\242 \211p\324!Q\321C\265\250\256G\255\370\1771-2\020\022\252b\2243\262Fy2\007\361\2022\025\2718\362\371I\033|\333\000K\311\033wx\222\234v\367\377\000\211\033rU#Z\323)s/\016\241\324\346\326e\277\341\307\240RX\022\344\317Q\004\245\226Y\335\370\325\202\245+fBR\000Sh\013Y\335\322\260\214\201j7\031\001,n\326\216\347\010\022\372\353\265\263`B\215Z\271\254+\262\233\001\325\354v\250\032ro\354\375\275\276`\306[\201\226\306rV76=TpH\3201\275\337\204\002R\321\351\267\177\267\010e\236\272\330w\025L\322_.\305C\241\030\224\313M\277\025\004\200At\214`(\0207\362<\303\327\0314\014 \222\341J\262\304\346wD\265K\276$j\253T\332q\254\032\242\220]\002$\224\241\304\261\234x\211\005\004\251\003\217E\014pA\030\032\323\206\002\354\360\220\227\001%:\257\376\363U\232\217R\211\036\221vR\202\212\346\333\362\326\331\220\3260\004\210n\001\341\276F\334\251\274\266\245\003\217*\306\322\330kZ,\032\372\371\253\300\353;]\363C6]\345l\337\014\326)v\261q\333\326\220\370f\243I\215/\302\223\021\340\320u(\001\305\243j\213g\304HQHRA\033\270RE\030M\226\234R$\300\266\211\340\251j\223\364\236\231\317k\252\225\0125F,YM1\012\270\266c!\211\177*\256\033\2226\255L\313K+Rw7\220\360\005e\262\262\235\2167\034{\206\316\305/\274\273\312\025\223\351-\012\222\325>\243P\247\252\235U\203Z\232\231\361\234q%Q)\353a\241\347H 9\271\3472\237\014\205\024\224\021\221\200S\233;v\323}\020%\230\227|\007\327\311u\334\326\275\012\271Yf\261\034\244\335\255F\215Jv\245\341|\274\271\221\243\227R\374\200@\362\255\335\322[\317\360\266\361\344\204%\016\\I\266=\277Y\376\227\230M\327\003\366\366\375\225v\352=\301N\277\357\313*\357\256R\337\253t\356\332\2132\025\247dQ#&jn\011\356\006P\272\334\335\274\241\246S\3431\0322\211\335\211\022\034)\332\313F\361B\366\264\201\311\344\377\000\011\335\3026\226\023\361\376\277\2659\324\230\225\227\250\362*}O\246Wi\253\024\364\272\3732%\266\332`GIN\323\362~*\226\224\025a\264x\273\221\220\346\001K_\274U\3205\327F\376\275xW\323H.\230\251k\235v\351\373,?D\025j\364\231\265)\217R\003T\351f4\271\216#\001\370l\276F\344\221\220\207\226\330R\221\271M\022\225\025\245&\212'\003`|\323N\200\362MRn\3347\315\301Q\260\251\321\356\366k=*\351*\031MB\242\305\025\317\004T`\022\240\212{\257,\374\312\231|%)q\014\004\271!\033\233\336\226\335q\013f=3w\331\313\226s\335_\207>\352\273\\\275Ye\333\256\015\315\036\241\363\266\305e\250\201\361Ri\363\362\261\331s\304[yJ\333J\003\241!-\305i\010@!KZ\226v\226:-6\232\231G\237\257\257U\217\254\262p\251\374\377\000\211\305\243\252\325\2303^\\\233\250G\020\250\357Cy\244\275H\014\002\222\340+%\266\313\312\220V\245\000\024\206\333\011@\000m:\215\322\201@\252D\327\026\200\337\222}\364c\342.\304\227\016\250\365\315Rj\366}\014F\021\244\277t\325\351\324\007\230}\3148\242\230\205\245H\001;\207\202\224\253%\011IZAS\206\332\275%\001\267\037\220'\365\037_\222]\321\271\307\313\225\260]\026\352gOn\006\225N\262\256\010\323i\376\032\012c\310\232\371o\302\300 %+\336Rx\362\235\345C\000\345^\274\366\277\247\276\267<%L\222\003\224\334\254\323\250\365\011/\311\214\364\307\036d\356u\304\266\2448\330\377\000\334)\007\234g\314G\246\017\035\265\316\276\0077+kK\250v\3377u\237\335}\261\3477r\377\000\276\226\304P\273\266\022\002\3451\031\011\361\253\021\300\312KAx\005\320\2366\2027\247\200s\200qu\360\237\306\027_\322u\200\003\033\277\011K\032\005\315\323{\202m2\260\214\306\254\006\374\262\032W\313:@\354\211(P\312V\223\270d\344\203\221\273\034k\236\235\214s\203\234h\217u\266\3214`\264d\037\254+GB\255\261q~\376,\224A\270R\214(\250y\345\240\017\304\026\222RT\001\345>\275\360;\353GK\251\337\3767r\262\2651\010\2622?e\331*\344\261\337\2553\032\352\231hN\271\032\005\244\314\216\320D\350\334\014\0070\012\207q\370\270<cJj$do\016y\012\360\307!g\370\301\003\364LH\264\273\345\226\032\231A\231o^t\264\2448\332\211K/\343?\204\266p?\373\005\021\307\246\2302L[mp\244\273\335\005\323\330A\365\354\216\243\324(\262\232J\356\273Et\252\260l\237\233\231JbZ\030\000c \2360>\372\177E\252\2248\000\342}\203\210X\372\355\034dv?\020\2637\256\026\317PUV\252\3346\027Q\376\021\357()\336\343\310\246\334T\333z\240\022\222N\035\211)\360\217\023\270*mC>\303_U\351:\266\355\332\370\344\037\020\\>`~\377\0005\363\316\243\242-q\332Z~\030\375-Q\227\372\235s1pE\247T\251\305\371\005[|H\265\006\2465\370\260G\210\311R;\377\000\233\037}t\254\015#\013\015\342\235T\233\365\373REZ\224\305U\024\345#rB\225\275c\237\177\257\267\363\320\242\220\017-\253U(\012%\250\312\343\270\251\355%\245\221\306\305\355\343\353\337\372\350\217$p\202\006x@7GJ\323Rqn\210\301\324\000q\265<\366\365>\275\365\342\353\024\217@\232\010:\227h\376\313Xe\306%0\310\306\345\355\347\203\333<\376\232\030\000w\262\245\255\356S*\0052\334L\022\334f\333\222\366\342\024v\355\312\275\360q\317\036\277\313D!\327Jp\320\210\255\253\002\215U\220\343\262\031\214\342s\317\224\017\327\037\226\241\356\245M\325\302\342\257R)\324J\202Q\0128u\244\363\270\221\220s\355\333\266\255b\254\241\262\354\222\203+\267\375\002\232\266 \274\363L\356)\0059\363\037\271\306\007\337P\323h\266\275\344HMu\224\2469y\014(\000\200rp?\227~up;\250&\216B\355\205mI}\227\030vCh@\363\022s\333\333\267\333^\277E\341.\354R\023\254\323\351t\314\306\330\2059\311\316\376\376\231\367?m]\271Rq\331\020[\365\224\266\206\203\216\022\200vm\012\376\\z\350n\024U\353\272\233\253\326\042Gg{\256)\300\0223\200\017\037\323\037O\266\245\242\360\204\\-T\333\332\351\241\042t\206\331{|\205\023\204\24589\373\363\375\347W\332\246\307\027\224\207\014\273\\\250<\250\355\214\005\024\254\257\033S\364\317\241\343B\315\321W'\3210\351\326\340\202\30274\333\310N\024\243\202A \373{\177y\323\001\265J\244\216\301L\042\340\206\312]\214\222\324uc\315\205\371\223\353\252\273\331x\037UW/\216\262S\350\027Rb\257l\310\200\234\255mn\000\373\216\330\316\177\261\244\335\250\0154U\204\265\200\273\344^t*\373H1\237CJW\360\3609\366\000\363\372i\300\361\331\005\344\025\030\364vTR<p\352\3067,(\020\277_\303\316~\372\216M\042\032\333a\023\321`L\251\264)\252ya\205\016\022[)$\017\341\365\317a\330s\242\006aU\222n\024Qs=+\213\260)\271\201\000\362G<\035Wg\240Glm\256\177d):\223H\245\263:Y{\345b\274\012\212\202\260{\017rpy\036\232\314{\0009\341t\003\360\340y\222\353\244\321.+;\251\324\276\251X\367\015B\233[\246\310\022\340\312\330\324\237\005C\324!\344-\265g>\251 \347@\032@\342{\204\244\257'\004U/\322=\251\361@\325\341@\265*\357\325-\247\352s\202#8\363\015\255\220&\021\313N\265\331\033\261\345RN2pR8\317\305\276\325t\347\301\251\246\212\007\217u\365\357\263:\306M\006\342\353!]{\022\367\224\314_\225\213\011R\324\361\335\260\244\026\363\376e\036=\010\311\357\254\246\2275\224\321w\372-\011bk\235\275\306\227d\373\252c3\002\205\267l\232\226H\334\314\344\014\016\331>pA\347\320{\353\236\324K(\222\332\005\374V\224q\263m\222k\340\276\243J\257=4\316/@l\234mC\012q\325)]\260\000\004\177=\020G 6\372\277e/\331T\021\2455\373\226\240\342\241M\241GRpyt\205>8\357\341\343#\327\2761\364\321FE< <0pQ\035\027\247\364F\333\177\305\241\274_|\204\251\267G\314-\344\016@PO\227fy\010;\200\316Nu\207.\225\214q,nO\177\207eW\353^qx\037_E}_u8\324ZUJ\247:\242\210\264\266P\013\356o8N?\200$w'\003\201\366\322:\371\304Q\231\011\300\347\353\325\037\247i\335$\201\240Y\355\377\000P\025\271)2[\211%\346j\014\362\205\307\206\342\012\236mk$%KH\335\207\025\236\022x@\316prG\2642nh4G\261\344_\252&\260S\210i\374\375~\036\303\365S\356\324\322\365]\252B\341\376\320\230\312\212\237q\206\300f3\235\322\332I#+\377\000(\345 \025+h#N\267R\322\360\300,\217\220K\010\310f\376\307\353\352\324\232UP\244\204?6D6\346Nx\245\240\247J\202\310\307\225\000\014\257\000d\253\030\036\344\353B8\236\011.<\240\200\0341\300D\235>[U*\352\222%\256\246\364O4\231kA\360|@\240\244%\004\360\022\225m!)\311% \225\035\240\226\364\323\203\226\233\003\365@\325\262\233^\275\275\221\254\032m^\354\256*U\025?)*)\360\341Lq;\333\204\245~9\015\201\214\255)$%\\\022\265\022\010\301\042Y\015\235\305/4\254\211\273]\233\355\353\361R\211\267i\326\365\031\213B\222%*\216\227K\356x\212\311\231$\250\022\353\352N7\250\224\205{mJR\234\015\270\327\320i\234M,\255N\263s\267\270\347\370\364IN\243\334\221\372eG\227_\213C\224\374\300\332\303\302\014T-\327\022{\241\307IHCy\302\212\020\026?\012F\017\233]\216\217\246o\302\316:\206\234\223\200\263/\250?\030\267\005\012|\347js\253\216AC\355*J\026\2054\032\216\245\004\251HZ[\010Z\333\336\225x\031J\324\235\373w\024\200z-?D\015\302\261\220\021mP2nkN\264\335\016\373\263k\361,\310\363\012\207\317Cg\305\206\304\200\202\244\212\234,\206\336\216\342<`\2454\343.c\262\034\000mi\235=\243\004$\235\254p\260\357\257\202\023\247\337\027\374Z-6\217>\232\216\254GJ\367GU:\\\244\204\243z\324\306&\026\232J$\265\261Hi{\274WR\330'\203\271B\233D\032q\217\212b9\201\347\2243yu\026\373\256\322\351\227\015N\220l\232\202\026\225\270%OC\017\027\006\006\020\346\000|\251%$\251'\033\267#$\243$m\322\327(\201\340\215\251\235\322\272\315y\027\205&\340\255\323c\305\255]T\226\355\212M\314\362\024\\\2119\307V\3548\023\035mA*e\307\333s\302qY\332\352\2740\242\211\003^\226!\333\262\011{N8\256S\243\245\235R\201|tq]C\250S\243\314\262\337\207Tb\371\266j\200\250\321g0\347\312L\212\330 )m\027\232\232\331I\306\000B\223\346\007!\360\363\357\331Y\361\355ye\344p}Sw\242\327}\275a\334\254t\036\004\331\217A\225GUr\201'\304zS\221\351\351Zc Hu\302U\342\266\2451\271j?\275\001a'p\300\215\\^ \361\000\366)S\201\276\363\350\215\357K\247\346\2505+\015\352\275\301I\251W\250\023\042\314\253\323\236i\022!\205\2523O*\042V0\205xo\272\004\205'k{rRIB\024\257\335\350\330\030\037YL\304\010p}dvC\235>\353\215\273m\306\256\364w\244M\277e\322\350\026\274Y\352\2534\207\247~\310L\237\031\020c\272\374\205n\223Py(T\345\227\325\342,>\332\260[\012\011WS\021't\306\363Y\357\362\354\214t\302\332\3512M\376~\245W\273\326\352\245\310\351\015\307I\242\336\325:\305\347:l\372T\332\204\305\201!UX\356\0424\332\234\267\\-\224\246\023I\220\264\200\266\333F[X;8V\2640S\301p\300\375\275\276*\205\344\033\372\370*\277\036\247ht\216\330\267?\364c\243\357_\235Mb\013T\010\027\\\224\241\010\207\021r_[\321\232\224\022\264\262\020\013\256\274\3046\022\220dFd\205\272V\224\260t\256>W`_\013\300\227\233~{\244\015&\361\352\005z\247P\252u\027\250=;\274\241C}\372\204\232E!\211\254\315e\367\011B\2660\312V\364\207\022\222p\353\352.\202\242F\315\336V`\322\006\253\352\\\314\006\266\226{u\237\252\235I\264e\324$3Zfu\003\306}\212=DHm\341%\247RF\022\204\000\342]\011V\305\005\015\333\2067+9:\216\266\214\362\220,\364\012\223u\007\253\365\332d\205&\343}{WOb\042\234d\200\362\212Y-9\214\001\264r\244\203\3062U\236r\007>\256\271Vn\231\333\250\360\221L\374Wx+n$\251\013\222\302\012\033j;o\247c-\244m\010\302\322Q\220\221\215\370Q\306q\267'Yo\352\315\006\311Z\021\350\234\341\265\203\037\227\362\264/\375\237\177\030\235E\272\376#zQd\267-\227,\245M\3716\3742\353.5\274(\002\000wf\302R\020RA$\234\360F\235\323\353L\300\200,RG[\245k\001\274\020\277Q\012\267ny\327\214\336\244\364\312\373\270m;\245\304\245\016\304\\\265\252;\241 a*I\362)9\335\370\220\2409\036\272\345u\272g\370\233\330k\366W\203T\337\004E+\001\001sV\272\277*\275\006\243ou\032,z\035\375N\336\302\230\237\005\306\304\200FR\343+e\012IQ\000\343i(p\036;q\225&\240\220C\305\020\2654\332J\363Bl\037\323\346\263\311\367\251Tk\356dvQ9\272\025H%\366C\312\300a\342s\265\012\316\354\177\225\\\202G<\353\214\326\302\320\373\354\273\335).\214z\205il\207+\264'\251WM\2551u\3122\024>~\032|\3570\007\005\300\244\234\340\023\2021\271'\203\307aiI\017\016nk\262G\2505\245\205\257\024{\024\327\273:\201\022\216\343w\005a\252-b\214\242\002\226\245\004\276\201\376$\036\353I\034\021\222S\355\255-ye\357\240B\313\320\302\3477\303\026\012oX\235I\266j\324\266\353\264\006Li\253N\346\336\216\366\314\023\350Q\311?\236\0069\326@\325D\346\334c+I\332Y\032v8\343\346\2336\347Pn*\334\244E\\\332-8$\360\363\352X\004g\031!!{\277A\371hQx\256v\352\2449\342\215\243\213\366]\335d\351+7\365\263\232Y\350\264\231\213\001R\246\325-\304)\327\024\007\343nPK\236\031\036\212 \037\257\032\372O\331\336\270\330H\361K\317\300\343\345`\225\363~\267\322\014\337\375-kO\352\250}\311\360\343.\313\244\246\270\2706\205j+i\007\346`\326\243\312Q\030\354\022V\034>\275\223\201\257\243\301\325\33162> \205\302\317\323\344\210\371\222\242\251TyQ6)IF\316\315\216\011\300\366\376\373\353A\244\014\245\304v\203\351\223\343!\320\267g\266\333h\316\374\253\003\277\260\347\327\337\324j\357\224\025G\302{!;\327\2544\272\033\017Fe\3456\244 \215\330\316\341\355\374\377\000,\372w\324\260\202,\225\347\262\270T\271\356\250\\7\215\326)\320\224\261\014\250\224 \272\244\202\011\356Oo\327\267\345\251\022\264*\263&\210VJ\326A\245\266\312'8\333jV7\204\003\333\356O\327\371\352\355\220\021azCG(\336e\320\272\013AqV\342YR\277\031 \034w\377\000OM\024\004:K\013\253\2516\313T\367\247M\255\260\247\310!\264$\245$pq\352s\365\376z\031\263\204V\271\240Z\251F\342\246]W\032\235L\265:\224\222\255\371\343>\300\347\034\177\177H`\302\030x'*\304\333\367c\364\346\321\031\022\034)J@\311W\000c\323\277\267}\027\025\224G]\3220\217yEu\225)\311\012\300\316\354\221\217\353\237\246\256xB\242\012]\326\257\253y\351\201\227\224\372\244\004\355V\034Q\357\365\035\273\343U\031Vs\257\205\363:\227*\247G\\\253~{\314\3419\0309Q$}0O\247\007\320\352{\345Z7\371h$P\223\177\211S)r\205T\016\351u\011R\207\320q\250$\360\253\236\330_\353s\245\365\271U\005J\236\373\206?\343s\305d\217\257\251\343\337\377\000\032\366\343\302\270h\031Gse[\324\210\246\033P)\213\333\224\205\004`\236\371#\351\353\251\242\253c\266R\372\243\324\006\250p]s\30022T@l\202\020\007\036\235\3656\241\356\332,\2453\325Z\315\352~v\217\022dvJ\270)K\200\237\345\333\237^>\332\226\264\224'da'z\215\323;\216\240\025,\322\036\225+\3500s\367\364\316\220\325h\213\263j\036I7Hz\317\267*\324pL\327\026\303\310\003\367o\204\224\217\247<\343\215\016(\334\320-\031\216$[y\367O\352\004W\037\012\022\232\012\010F\345\035\330H\372\214\372\037\177\246\264Fr\245\240^xG\324\004E\371\241\035\211(\212\263\330dz\036\300g\215X\033*\342?T\317J\036\210\2244\372C\316\343$\356\003\372\235\020_b\214Y\350?ED\272\207]\253V \275L\214\314Y\015\205\2056J\212w\363\374@k\027PIn\325\250\331\215\034a/Z\254\336\226\372\251\361\3514'\235i_\363R\333\244\024\217\\z{\376\232S|\215\241\331R\230F9Z\265\360\237\327\236\242\323`\256\312\221.\220\345\243QJ\022\374;\205F/\200\240\254\245q\2474\202\246\026\024\006\003\236#j\340\020\223\346\322\335s\2453W\001a\260{W\364\265\272.\265\372y\204\227\361\007\202\266\262\300a\231t\006\253\352\225-\0176T\222\350\250\256,uz\024\371r\026\223\217A\217^5\360\355~\220\306\0118\374\350/\254h\365!\347c\177e%*gO\346H\375\367Qe\301}\037\215\024\372\253\273\301\364\001D\014s\236}~\272\346\032\330\013\201.?\221[\327%~\034{\247-\233NK-\242TZ\245rD7@Sh\230\352\324\353\343\320\370i\011$z\345D\016\334kE\360\330\362\032\375\322\222Ix)\225N\233>\221*\241%.\246L\247\020\022\210\215\360\266\324F<\330$\014\366\302\271\325Y'\206\327\007y\212\004\215\016\257E\325U\275\257\253v\212\313\265H,@\200T]y3\035\312\324\337\177\042\022\012\277\376\265\004\217c\256w\251u\017\015\233\234?\264\316\227B\311\035\3457\373%\015\236\272\317Q*S\272\223_u\305Sb>Z\243\323\324p\313*\035\336VrT\240\2420\022\236\343\236\330\327;\322\264\362\352^usp?\013{\017u\263\325&\216\006\215$>\236c\337\340\231F\250\246 M\2513]j\205KJv\313\2518\342c\251)\376 \316RBG\004*B\324H\354\224\250\353{\306p\300?\237\037/\354\2546\3067\013\026}9\372\370p\225w\367\304]\273\323*4g\227\032\235U\255\251\244\030\261\326\035C1\230*\306\357\227\301u\327THKl\360V\245\202\341\000\035-'U\216&\206\362\357\316\207\345\311ZZ.\202\375A.8`\357\353\371\372z\372b\220oI*\035K\271\234\252u\007\253U\004\267]\236\013T\252@F\327i\321\212\212\212\334\334xq@m\306\022\020\221\311%d$\332g\310\354\310\353%GPlM>\034#\312\336\376\245\\;^\241\014\321\343Si)a\250\257\227G\356\363\225%'b\225\270\200\245d\344p\012\224=\267\355\327Y\244\215\257n8\013\233\325>\215\236S\222\321\272\314\352$\352\215\0323T\2336\033\213\210\251\217\200\0259\344\001\342\024\036\006\001\033I\3163\221\234$\353Z\006\2020\026\016\265\273_D\333\275\273(\036\244_\314P-\230\265\324\\\024\373b\204\313\0364\312\224\227\320\202\254\376\037\000\253\004\005\034r\221\271Y\011N\0065\322\364\275=8b\311Y\245\273\311\034\254\005\370\232\370\322z\3047<\212\005\371W\25359n0cK~\232\333E)\311\015\242Y\204\313\214\310 +>4\247\320\012\271\333\220Gs\004A\265\270}|\353\364L\305\242$\027\037\257\232\306\256\260\374D\306\276f\265&\015^\201\042kl<\343NK}L\316\224R\331>\033\353J\312\022\351\332pRT\332\310)\362\202\223\255C#@\362\252\221\264\355\252C\275\027\370\230\235D\233r\364\376\342\257\316\247\332\362\230\371\230\322K\351*\2070\266\227X\332\023\345PB\324\2279\340\355ZNA\325\003\201)\177\010n;\223v\177\\g\335\016\323-\010k\264hV+\022\033*\250\332\264WcF\216\313\340\266\363\337*\034t\251\365\344\355m\235\245\325\254\244\020\220\254]\333J\034 \202k\205i\352=p\264nvm\353z\344\215\026\311\241Fm\270\224*-\326\360L\305\371v\205;%Iy.-i\302\202\013\353P\374`\004\355R\325c\010&\373\2426 \326\343\011\317\323j\213\3353\251Y\213\264\344\\\020m\346g\370\265\373Z\244\353s\235\211\037\307I\\\332\\\226\216\025\263\033\326\333\210\036@O\374\304\215y\321\335\332\034\315/a\016\026U\232\231_\025\372\005\375\323\212\2035J#\027=fS\325:\215\035\201Qy\312C\222d\272\333\2176\215\251C\356\266T\242\021\3416\237\025\215\313\012^\355)$`\020\340E\205B\034\016\341\312\262\235/\276,kuQY\2421O\251U\351\260\242\246\024z\263\345\231s\234\360\220\333m-\255\256\251(\012\220\022\332\2221\265j\360\222\350qo%I\230\\\333\365\364\343\353\352\320h\336W<\226*\251\263\031\264n\232R\237\252\301f\005F\232\270\253,-\370\354\274]\220\353\356\253\012i\267\035$\204\224~\355-6\342[[\211B\001C\332M\267\353\377\000?Uw\310w\027|~\276K\306\344\267\335\263lg\251ve\255\\\257\252T%<\313\264\324\267\035\021\320\332\022\267\036R\366\251\264x\241\215\316:\013\312m\206\033\005k\0156\205&\375\256}\273\267\327\350\257\024\346\257\362H\2535\213\017\252W\004j-)\252UV(K\025K\235\354\316.\312e\367c\274\270NBR\033j\042]]6\022\235i{|d\007\001@^\344#`o\215\226\354\036\336\337_\242Fi\310q\026\231]G\240\322f\273Q\251\325i\365I\355\267\035\366\230\2238)\306\251\310\332\025\342\275\031%,6NIf+m\354Hm `a\002\042v\003G\327\303\277\305L\017\042\300+4\256\333\026\340\250[\377\000\357SP\372c\326\312\222j\014E\251K\267*\0023\260\340\225\020_\\r\2458|\035\255o\000!i_#;\010\323\261H.\212zG\232\310U\273\256_\013\023z\253\026\225\177\024-\241\012+\315\321\276Y\307\243N\230\342\022\035\016=\031\365\020\352\223\275i(*\012R\024\265yN\236l,x\317)\023\250%\326W\347\253\342\237\246=e\351\265\3676\215\324\210\365:]RZ>j:\337!-\312\212@(-\220H\015\204\250\000\017\270\317q\256W\251C+]V\265]\250\006\210\341T\307!\327')\257\012\216\372d\266\222\024\264:\337\207\333\271Y^\000\367\317\267\256\271\2714\022\275\334\343\362O\177\362q1\264F~\273\255\332\377\000c\227\303\245\323;\251-u6\252\237\226\246Ev+t\342\353*\011\236\371x)KaJ\301\330\332[J|C\370\313\212\300#\201\330t\330\014q\037E\213>\247&W\375\177\342\3759\327\246\\4\373\216\337S\263\336\2461\022B\223-\210N\270\342'\001\331K@\300IH \356\000\236\000\343\220q\365\357\363\201\331{B\007\206H\000\225\321tT-+\345\371LT\027Aj\365C[#L[\356\227\214Q\271Kie\013N\001\340\244,\341$\344\001\234k'\250lw#+{\247\266H\306\357\365T/\250NU\343\0312\025L\221Sa\235\212%\325\224\272\32227:R\264\035\344z\362\011\306~\232\342\265\345\334R\355\364 ]\332pt2\366\223E\275\205*D\311\221\241\313 \266\372\225\346mD`,g)X\364\301\306q\317\246\271\250\265\206\015M\236\012\177\250i\004\221c*\304]\366UV\367nZ)\010\213O\35252@T\261\025~\001\224\322\271.\264\332\206<7\023\264\220\016A>\243\235tR;\304n\301\312\300\321\274D\360\343\370\017\350\214\355\033\003\250I\330\224\327\327JZ\302B\330\225\015\012\007\216v\250\015\252\037D\253#\333H\030\001u\023KJmK\010\300\264\363\264\354;\371\271\311\215\026\251N\252 \376'Cm\240\244z\205\025\021\267\363\003ZPh\2348z\304\326kX?\325+\372\271\325?\210\336\225T]\217jt\246\274\312\222J\177lM`\313\214\3523\215\310\021\225\205$\217\361\254\037\362\353\271\350\177e\340\226\2374\367\354\010\013\207\353_h\314v\330\341\374\310*\275+\251=y\276\\\221Q\271\352\355R\331p\024\255\270\020\031\2101\236RKm\245\302~\212Q\032\372V\233\247i\341\0000Y\367$\377\0004\276w\251\327\313+\255\302\207\260\003\376\252\365\324A:;o|\375\301**\025\200\013c.\036\376\247\276\264ZG`\227\336\252X\252\255\212\223\3415z\253\314%G\316\363\312\313\247\327\271\3679\307\267\246\251!<R\037\214A\302Luf\370\375\240\227it\312\214\207j*\0059B\325\344\3648\347\371\177\347H:\207\012\317\233\027IaeP\257\032S\312\250\300\232\344\225\222v\241;\211\037@s\300\367?\366\3245\206\224@\367\013$&\333=O\275\255\225|\324\330\001\2647\204\347b\224\242I\356J\371\321[+\232)\025\317\007%;l\216\247\013\375\011\246Kr[\222B@W\224\201\273\035\206G\240\357\377\000\203\255\030\246\334-\005\266I\256\313\266\346\370vEvZ\246T.9\020\341c>\022\024\234\243\351\234\014{\373\375u\343(\354\253$n=\320\204\313\016\303\351\373A\264]O,'\203\225\245\\\217\177.}\373\350A\340vF}\000\0118M;B\335\243Wi\246m*\257\036\242\220\214\227\035w\030\036\231 v\375=4w>\224`\033E\221lH\256D\224\352\026\264?\216\024\242v\237\313\037\366\324\270\225\346\264\014\204\224\252\364\262\213O\222\364\352\364\207\344\266W\342\222\026x\347\2009\000\362s\372j\216\273\265\001\230'\222\231\264\212\315\271\036\226cFx0\332A(J\226?\237\327>\377\000\317F\004\236W\2346\251{}\333vO\210\357\214\225\310'\0128\007<\366\343\004j\312\244\021\205\317T\2072\242\245\261\032c1\331qX\000\243\0118\365\031\357\366\325]@\250\026E\024\250\254\332\321\003\356\242\260\314B\254\340\253x\031\000\362q\234\236\337\313V\335k\333-G\323m\353\022\177\211JS-7\204\341'x\312\300\343\234\236?\323PI#\335\027\303\276\021\205\275G\244[s\214(\350d\307>T\247`\031\300\365=\373\373k\300vQ\331L\334\264jT\330\345(\214\337\224d\2026\357\374\317\367\316\210\341\302\020>\252\262\3346\023\363dxLAai\336U\265Dp}\274\303\371\3754\042\334\242\001M\245\343\022\332\250\303c\366Q\212Yo\272\3602?#\214z\177-\033f2\245\262v\354\274\342\364\252\246\335N4\270r\202\032*\030o\304\316=\210\003\357\252l\254\205!\342\360\236M\332\201\244!\0220\035\000gr\271\374\370\321\232\342B\261\334?\012\247\367\247C\3303\021\042\233Q\226\207\313c\016x\200n\036\231I\316;}\260~\272\310\324@\013\260\266LE\242\373\243\213\013\247\202\236\333bb\377\000iKH%!\344\347?]\330\363\177\343\362\273!#\016A\214\321L\270N\314\246V#%\266\327\011\315\300\245g\337\276S\375\377\000MK\231\232Oo\362Y\311ZM\322\267\257\013\252\333\227*\343\352\353\223\035B\022\226P\251\35495(\343\011,/\370\000\355\204\356\031\357\257\226}\273\351\221\210\374P\303~\243\217\315w\177dz\223\267\010\234E{\246\237K\272_x\232\317\373\351\036\275kE\244\264\222\246\245\325\2502\324\344\205g\033\231k\305i\265v\374d\372\344{\217\224\351\340`\005\340Q\375W\320\265z\253\042 >G\376&\244\370\325K\256s\215\012\313w\005LdH\236\343\346\013h\317\007pJ\326\244'\323\001\\\366\035\364\220\351D\312e\263g\275\253\215`\215\273@\241\350\255\257J\251\026\247N-v%C\216\232\235] \270\251!\327|\006U\223\303m\255\325\216\0179\011\334{\234k_Q\341i\340\026xY.t\223K\355\350\225\257U.\236\256_NS\353s\245\233F\042\214\227\3430\234*i\310\332\322\335\004lI'\234g\312\010\034\234\217\224\307,\372\335O\230\221\030\355\353\236?5\330I\341\350\364\300\260\017\020\367\364\367\257\254\246\035\365v\256\333U\026\335\242S\240\275xT\317\312R\3406\220\302c\241\003'\010\036Tq\267\327\312\025\271G\235t\332\2279\245\260\306\337;\370\364\000{,\015\036\230=\256\226Bv7\223\352JX\365E\024KF\234\305\353z\306\211p\334-\245)\2472J\313\010}\003\225Fg8J\002\277\211AJ\300N\010\300\032K\254I\3413\304\253s\260\000\366\366\364O\364\226\272w\370L4\301\223\377\000\252\241\364\372\242\335\361\324Go\252\374\264\324\252>\042\376X\276\234\374\216\336\034u\244~\004\001\237\015*\313\216\025\025aI\001@\363\372`\013\267\023g\366]7P\266\305\3414SF>>\337\312\260\362:\211CE\341nXT\372\364\037\367\242\242\025'\303q\315\253i\2442\267\213\244\034mJ[mk\012^3\200R\237\302\241\322\364\362\302\360\337\366?_\242\346\246\201\346?\030\217(\302\177[w}\251.\321\253\327!\275Yn\224T\250j\230Z[\0379\025\260S\206\001\375\342\302\316\375\252\011NRr\220\240\240\342\273\275+\232c%\253\226\3251\342`1\217\320\373\240\312\327Pnj\315Z\207)l5Q\270j3Y\247\332\266\332\333\015S\255\232KKI.\2568\341\305\254\245KQ\300\012-\241\031\011B\324X\323\027Xq\371z\017\355C\341\2166\220\0154\014\236\356qY\371\376\327\017\211\336\261t[\247\211=!\232\345\303x\274\321v\247SV\365\212ZK\200oRZ) \022T\011\334\220\235\252\011\005AJGu\3235\024,\217D\206\217D\014e\300dp\027\343_\252_\021W]\337-\002\266\340|8\302L\204GsbP\342\271q)Jp\001+*'\266\017\324\225\035-OR\363\354!x@Kl\234\224\221=Q\2520\363\256 \0304\227\020[1P\265\255\012A\030)PY\311\030\300\343\037\226\251\036\264\034\245\246%\277\004\327\267:\263G\2537.%nl\310/,%\304\310k\012J\226\222v\245d\216\020\002\211\333\300\003\237MhG\253\004\026\222\262\3162\264+\240]6\352\215z\012#Q\2535\313Y\247\042\037\022\242\355%\014\311\216\225'tTD\017\356\301|8]T\235\243\015\241\264';\226u\263\024N\333\223\365\354\203\024\366x?\025\251=-\350\205\323m\332V\202a[\002=\317\036,\204\265[\237)\362\361D\2258\267\346IyE\265=%\360\220\237\025~V\232d\245\266\373\250x\220\321\236\002\236h\205e\272k\321\276\237W\240\3352\255\356\251\334\2275\310iSDZl8\212m\307\344%\265\262\034\217.<p\225\261\342,4\026\263\222\2448\204m%GJ?R\306`*\217\020\274\007\017\325\027M\264\274\012\007H\326\343\325\010M\327\032h\324(P\242\302e\312\235A\0157\275\320\267Av\240\353mGr2\323\267j\003=\320\037RT=4\273\234\340><\375R\364\222\367\012\320\364J\007\373\2719\326Ye\203-\347~Sc\254\031\322\360\260I\010u^*\231+\300\001\302w'qV\321\302H5qc\011s!'*\322\305\351\355\277`\315\2312\254hU\012\343r\341%1\335u\324\305\240\022\220\363\257\006\236R\202\235\313o:\035t\251kR\020\254\200\214i(gs\374\255\343\367\364\377\000\305I\343\261g\377\000W?],Je\336d[\263\2507/Qh\325t%\332\233nJ\\Z\215iHJ\322\325>\034\305\251NS\243\247\377\000\362V\370\336\363\312W$~\355IcF+\314M\021\307z\367\355g\366@\223RZ\313\375\222\223\366\024~\235O\267$S\250\027\265&\273Ii\332Af<\230\253fqyEM\374\353\250+\220\264\245e\304\217\031\340\341P*[c*@\320a\361\001\262(\347\277\374I\271\376\252uS\015.\227U\211Wi\347\344\324\022\242\251\310\222\021$\022\215\207\013ch\013\033R\220F\010\332\236\330\325\037\021<p\020\242\325\020p\022\222\247\320~\2023~I\352b\372emH\353\034\206\024\324\373\2024\026Z\237_\216\264\004\025JZR\202\267\261\220\262\256Ny\317m^0\3735\200\216\375q\252P\227\005\247B\254V\314\225S\335]=\254|\251\232T\352\342\274\000\011S\240\367\336\222P\\\344\340\343<i\366\2274U\362\226\023\002\253\237Y\272]au\316\231I\244]\375=0\3534\322\337\356\347\306C\251-8\360i\326\233\223\370T\201\225\220|\252\003a\3307`z<\034\345:5\007n\336\311'r|\016|>\332\356\272\344\356\235Y\223\341F\000\304\251=H\212\251\010\004 \244\254\241\224\345\007\010\334y(\000\036\331\323\002H\3348\317\301*\355I\274|\223G\242\324\332E\207w\275\032\035>U%\262\367\200\373!\010xS\011G\356\334BF6\260\264\200\234'\001*\317\227\007:[R\377\000*#\3678e6/K\262\022\256\370\360k\245\362\352\324\333\331K/\006]Q\340\022\244\360\023\301\300>RrO\260\3445\26348\002\267z~\235\305\276L\250N\242\310jU\263qV\254\3139\021\356\350\351T\2045E\231\032\2376\252\352\033\312P\265l>1$\201\202\264\367\335\225c\032\303\352\022FA5\221\363]'K\216V\2705\316\261\356\250U\223\3610\335\327S6]\303m^\226\365\332\302JV\334\267\333u\013W\3614]@\012J\360s\302@\310\307\270\327\3165\035q\246\177\002PC\277C\371\256\366\036\233\344\361\031\377\000\212\303\331\201\307j%\250\317\310v3n\177\302-\323\225\224\236pO\370\206pGc\200F3\245g;\335\346\310<+9\330\242\237\366\017])\335ME\315D\211\016}3\342\006\306R\324h\304\004K\257\323\220\012\227\362\251p\240\272\264'\316\033\357\202G!i:{JC\3672\355\315\371\254\215F\233\302!\304\177\215\337\241L{;\255\324\276\241\266+\2351\274n\272,\32236\226\374O\032+\253\307*KN+{*<g\031\037M+)~\240\356\201\304\036\377\000\037\202c\356\246\037,\315\004v*\333\332\267\317P\\\207\022eR\334\243V\342\221\265.xjJ\324G\030J\206\354+\323\004\2157\014\332\310\333o\214\021\352\262\345\323i\337mc\215\247\335\243Rzc\025\011T{\226\351\267k\011@\337L\371x\316\000q\374%\345'9>\212\300\373k\256\350\375SJ\3607\266\234=\310\\\247U\320j\032|\246\333\360Tc\342v\355\266\251\320\037j\241:\355\351M\374\363\345m\324\356\313\026\253O\242W\020H\030\025F\024\374\026\234\365\013\336R}Bs\307\323:\026\275\217p\021\270=\276\215p$~F\211_;\353\032\042/s\013]\360T\042\255\323\372\257P\022\343\263\252\021d\257i\334\364)\255\310e\344\237\3608\202R\244\377\000\246>\232\355[+x\\\261%\246\212X\177\372c\005\307\004\026\201QH\012S\212'\003\362=\276\375\3625\351\013G%T\020\022r\340\370x\241\321\252.\042ME\210\322Vp\\\374G?\247\372\372\215,\342\010\302;\0328\003%\030\330\275?\215lI\016\275%\312\214B1\222\234{w\030\317\256\241\2156\256x\301M\372\225\023\2465v<\007\033d\315R?\012p\245\017\251\307\037\323E\360\334\250\351\033I?\012\035\016\320\270\320\2101\226\322\011\336P\0308\301 \016G\320j\033\025\344/2n\312?\256\327=\306\375(\271MrLv\266\225\341\220\011\333\307\177l\215TD\341\302\231\236\342\334\254\341\256\324\356\372\321y\206\331\255\276\242H\311.+\201\354s\201\235-;^BE\223\027\032+\222\333\277\272\343hJi\015\323\346\310\243d(\241\342\260N=\002G~\376\377\000\314\350m\236V\224H\234H\240\255B~-.XTVa\314\200\354W\373\224!\012>\032@\367\376_\237m65c\232\312+\345\307\301yE\353R:\204\206\033\252*kM(\200\023\310\301\355\317o\246\231\216P\341\205V\310\035\302q\305\254t\352\201\003\305y\016')\363-KP\001Y\311\007\221\317\036\232+\211\354\2566\024\234\273z\323\006\337jB\355\306\026\340\356\025\342\034s\372\367\034\363\241?P\033\312Z]A\030\012:\315\353u\303q\004\226Q1\017\203\312\200\300\007\333<\361\2165x\345i\026\025\331#\235\3319^j\273p2\037\2217\301Y\030Z\334Q\034{v\316\177\256\213\272\202>R\222\275\022}\275QEC\366\240p\245^Q\343\224\356\356\177\017s\306t\042\372*\\]\331\020Z\335J~\257P1\213\303\306i c\276\010\372\361\3754M\367\225X\235\350S\0025\356\201=Q\245\312qa<\235\300\200\007\277?\365\377\000\246\275\275\031\265V\204k\035@\245\275ZL&_Kn(\371Jv\376]\371?\220\325C\320\336F\345\3413\251\024\2103cR\345\272\024\352\271HS\200\343\374\330\357\216\376\372\270\324\264a\312G\240P\027OY\251p\037Lx5\006\234(\357\225\214\223\355\374\316=ui%o\252\206\310F\020s\335o\252<\275\3553\042J}V\016r\177>uQ7\242+f &\235z\343ym\245\272KK\250\035\230Qm\235\311O\324\253\337\032\003\213\257\034-\206J\010\312\020\245O\272\240\310nc\364\247\034aj\036f\011R1\351\301\354y\366\307\267\246\243v-Q\2556o\010\336\233}\332\323\252(E~\013\354\311iA\007\304*@X\372\355\364\357\374\277%\345\230&6\032\256\337\272\322\016\200L\210\334\206\245X\321zIP\252\000\037[\317J\203\031p\033\035\335\\\272\214\207V\331\035\310i\215\335\373`c\235\352\320\231\031N.\003\333\372\001lh\236\326\020\352\004\205j/\216\234\334\335Kn/\354\232\265\022\350\226\265l\223P\201[S\364\230\330\316s%\303\346\307l!9'\262}u\371\357\256\364`\315EF\035C\273\217\013\354=\027\250\003\025\311\317\240\345\031Pm\336\235t\372\0256\317\242C\250\365&\362B\002\335}\327\024\324F^\307+\015\251e\015\266\2360\247=9''\032\\u\002\320!\204\027\037^\310\242'<\231%\246\217A\351\374\247Bi\327\035}H\265\251\242#\225\0066\256w\200\360\371x\205\\\377\000\304<R\025\300\354\200\020O\030I\035\353\256\210\312\004N\026G?]\325#{c\267\245\337S\372\263m\364*\222hv\221\215P\253\272\347\211%\366|\316\324$\355\300\317\004\204\203\306\324\347\003)\000d\223\300\365\177\2641i\036\3304\243\217\324\372.\237\245t)5\200\313\250&\275\373\005\013\321kr\271\006\217;\253\275N\2232U\371\\iI\247\242C\312u\332|\003\205-J\311RZR\310\317\206\200\022\224\343 \251Gn\347F\322\311\341\035V\250\237\021\374_ z\373|;\004\217\\\326E$\237v\322\377\000\365\263\323\271\372\357\335W\376\267^5\033\276\264\2725\277\026\004f\320\330C\362\022\024\246\340\265\374k*Q\311R\211\036\276b\240\2201\254n\247\250\361e\250\376\202\325\351ZA\013\004\217\344\360=O\272^\033\356\323\351%\207r\365\032\272L\272\015*\236\323\024\330jR\020\345fc\201A\244(\214\000\204\241\005\325\2209\361\022\0078\032\014M\021\306e<~\345\036X\244\236Q\013q\334\237A\375\223\205[\376\025.\306z\237v_\335Y\3524\366\251N\325U\042#\323\237y%\021\351^\042\034\220\333h\360\220\226\324\372\243\261\037rJ\325\261\262\006N3\251\322@-/8'\237\207\326\020\272\275\323c\214^\334\001\356\255}3\342\242\340\352d\352\225\027\244\260\243#\246\224\342\337\314\312\371/<\206\302\312\022\314v\300\302R\341F\335\345X\307\225-\257f\341\323\351z\301#kx\013\236\233\243\265\247\317\370\224\317\303\365~\261q\3367\335\371p\326\032]M\330O&\025BL\264\230\21467\264\363\355\204\024\241\2646\011i\000\000\234\245{A\010\316\265\264Z\262ZH\344\244:\246\2347c\0320\017\376/\216\260Z\226\347^\372)u\321-\352|J\2132\022\304\306\337Lr\343\325f\332Z\203L\264\017\004\254\344$\014\234\251G\030o#\264\351\332\203\264\005\203\024\246)\310\177\031_\213\237\212\037\205\016\242t~\352\253\324\333\246\256}\262\373\356;\032DV\325%\246\271\033\231wf\010ZI\332\0248R@ c[\323@\036\322Ufc\343%\315\343\346\251\375*\311\275.i\2556\325&\255Ri$\024\263\015\205aC\270\312\217\003\277s\241\351\364\204\340\005\223,\257x\334F\002\320\217\205\337\201n\245\365;\252T\273n\352\243\314\264m\306\233L\271S\026\204),a\306\302Z\000\234)\305\370\204\014d\014+<\247\032\330\217LX\353\223\001V8\315\344P[\377\000\322O\207X\3355\251Z\264\013J}v\257G\201$T*\025\012\346\331NKm\220\246\312\034 $)'(B\022\234y\022\260\225\014\005k`\352\032\031\204\254\214\257/ub\351\177\012]8\205qV\336\251S\356.\245\365\016\347r\010\270*w\005^C\252u\013Q-\261\225\222\230\254\015\334Fa\011\362\240\014\004\002Jq4\220J\244\272\263v\334-\034\252X\365\011\220\2516\335\231\015\253B\307\244\245\010\216!Ij\014*|H\310\333\220\307\010R\024\023\341\241\224\215\312\334T@\311\007\037P3\270\2248\244\001\264rR\213\253\226E\253\\\205e\260\324h\316\\\321\331vTj\204g\336\214\260\331\232\333{\031$\205\024x-\314\344\341\001IA\302v).\273\323\237\266\3118\372\377\000\212dq\272\365\376\221u\225On\203&\217H\244\276\252\203\250q\277\222C\323\031mjB\222\255\256(:\2442\362\202\220RR|\347)\310\302\264y\237\270\027\024\012\332\021WZ\257\272\312\251\325\010\266\304Ipjt7\230aqRP\324\211-\207Z\007\303*K\211\361V\247\031\334\264\005\255)Z\316w\354\325zv\234\013.\356\203,\364\007\242\366\250\365\013\251\023\336r%*\311E\310\203!NT\341F\2551&W\214HSFkd\245\270\250\033\203\211\371\227w\000J\213Aj\306\233\020\260f\376\030\375\222.-\042\220\275:\256%\334/[\327\035\223u\364\372\224\252{\201\347\245)\224x\255\225\222Im\205\272\323a8J\266\220\225\340\236\307\220W6\206\366\233\312\243\205a\027H\267\344K\265\345T\2256|\270\255\214\246M:\042%\255n\004\3764\200\027\264(\004\222v\250r\0162\006!\362y\200\356\200\031N\244\011[o\304\360\345U\247\324\351\212y\260\022\310%\323\342\004\014:\033I\317;y[|\216<\276\232<\016\0345RH\027]\217>\217Qu\250W\014\200d9\377\000\010c\276\202\332\327\273\360\270\225\340\216U\214\361\301 \021\310:\235[\\\033\204\010\\8\356\024\247RmXs-\264\323\205$\307s\300+q \341\342\255\311%\260S\306{\214\372\343IC1\335ehDM\244-^\265N\231K\247\324\351\3255?\031\371+\210\364\2042\244\230n\355\011\010[x$\034\005\247v6\234\036pt\354`\216T\276,\361\225\363i\323\342S_Dz\24355\316u~\004:\213(F\307\\\007w\206\245\0220\342A\012\360\226\001)\345'\271\002\325>\202\033\030\355\340\366B\025\230\267D\031f\343n\307z\354Z\307\313\316\024\365mz*\001\306\347Y^J\332\306|\301^RpA\327)\3243\220-u\33544\235\245\333W\\\267)\325\2504\357\330\324\312\335\016o*\375\245\006\240\207Z\212S\310Ig\225\025\014\020\244\203\221\331I\366\345\372\213\2672\252\234\272m\023\034\327\222\362\010\364\365T\223\342[\2473\352\262i\275[\266\233\216\315\353Ku)\250 \370#\347[\004(\025-I\362\255)%I\316\001O\007n28>\265\2402\001 \303\307\177U\326\364\355N\303\264pW\267Fz\275fW\247?\002L\232{W\013N\022\246C\273\222\262\017\231l+$\037S\214\373\3609\322\232}Cwl~\017\326m\027S\013\352\333\302\320\331]\020\351\307_\251\226\365\361\035\226\251\235V\2446\204G\254\301QjC\255$a\011q\304\035\330\344\355^\025\267\224\221\267\360\364\021i\243\224\207\217\304;\205\317\016\243&\235\3067e\247\261J*oK%\331\227T\227\340\337T\004\327P\376]\205V\214\272\\\244\275\234\344<\200[V\356\371\332\220\243\316NN\260uq\0354\273\367U\255\230\265\042x\370\307\315^\216\235\\w\0051\304\242\346\247\312n\230\372B\\\220\224%\306\326H\376-\204\266\340\340r\222\025\353\255>\237\325\344w\222Z-=\302\306\326\350\2434\350\371\037E]\373=\366Z\210\304\224.\237>\226\346<\007V\237\0205\376]\304n\003\357\333ZRi\032\352w\352\260g\224\376\0223\365\363U\343\342g\242]E\270\332\221s\3742u\006WM\272\240\343\013UF\211\032\265\042\237\012\350\216;\222\224(\262\227\207m\313h\241@\341Dpu\324t\036\263\034$A\255`s\017\016\240H\372\375\0271\325\272\\\222\260\313\003\210#\265\363\355\355\355\205\212\266\305k\254\326\304\372\335\027\251\224*\225\261[a\367\033y\271\336\036\340\240pp\244%(P\365\312s\334w\316\276\307\014\361\020\035\037\013\346\322\303&Z\341T\206$u\016\360]et\350\212\223\362d\355\361\016\324\244s\214\344\236\007\030\326\230-p\264\210a\274\360\273\252\275,\213q\244V\356;\272%=\340\235\301\266\216U\365\311'\030\367\355\244\335\250#\312\0023\241\342\312]\326/\253\026\333mT8\325I5\267\201\330\026\024\220\017\277\031\301>\230\357\243D\353\242p\2073\253\214\2578/[0\240\310\256/\305i\303\225\354.d\250\372}=\277M\021\362\023\200\252\330\250Y**\235sR\253\217\310\222q\031-\215\301%\304\034\253\377\000\210\357\376\232\266\360\005(\330We\006\374\265\353\016\312\245T\322\227\331k\314\265\257\314\330\003\260\347\034q\2363\351\353\253^h\2570\203\335E?wt\306\214\353\216|\245,\260\\\347`O\240<\347\034}\265\342\334\332\360h\010\315\250}-\273)H\226\312(m-I\310\316\315\307\267\247\351\364\340\215X4\360\206\350\261a*\356\376\225Z\223\342-\210\216Cd(\023\271-\347#\323\224\340{\366\376y\320\237\023o\204A\023HP\226\317G,\373J\223\042\255*[R\344!\012t\020\240Q\366\3078\007\357\240}\330\014\265]\261\264\014*k|\365N,\233\321\273r=\261Sn\226\027\217\027g\031\317\267\372\377\000M+\343\020\375\245+\270\034\000\214\335WO\230\212?lS\324]pnQ)*N\177\370\223\201\375t\301\003\222\214X\323\331(j}d\266,\252\363\024\352E6\255\205(\235\315 mH#\036\244\372zi_\2765\256\341P]\355hGU>\265\252\263\005\226\350\363_\207%c\312\245(\341?P8\357\246\306\254\021a^Y\010f9U\252\353\257^q&\277P\231rJ\226\214\203\220\257)\317\333\372\016\332\315\226y/\234*7OB\217(&\037Y\356zJ\336\024YkD\274g\177\207\234\237\177\177\351\245\233\257x\3417\340\020)N\320\276\042ot\316H\254;%\367\011\036s\224\240\376\244\350\260\365'n\242\027\217\000Zd\307\257]\327T\341Y\2111\021A\344a mO\334\217\266\236l\217w\012\217\026J\234\213l\315\251T\177j\325%*\243Q\011%E\327r\022\007\323\377\000\037mO\203gu\345LM!\324r\226\327\3535G\353\360\042C/a\030\310\004\354\003<\223\334z\237\353\244\246s\267a\025\260\203\370\262\234\366\365\340\355\277J\217N\\8\316\250eD\251\007#\351\310\372kB-Y\015\242\025\303\000O\326\232\230\227#\212*\\\251!\316A\371\200Kj\307\327\270\377\000\256\230\232\357\034-H\350\262\273\372)\333V\243sB\232\2307\0032>I+\344'hF\017\330\361\337\267\256\253\037\377\000\331\030\276\357\034\257K\216e\211]\2575Aa\2053PI\337\370\211\301\354w\037\277\240\322\363\006\271\324\336Q\3545\236cF\221\263\265EZ\362 ;\013\346$:\321K\215\241,%\325,\216\330\013\343E\225\233[EU\216'\316\016\002\327\337\205\256\250\374S\336Q\350\324*\357G\357\003`\370I[U\332\254FcF\014\221\217\0422\225:\017\271P\000\347\312F\006\276o\366\247\246\350\214e\362:\235\350;\256\313\241k\244\017h`\260}U\231\265l$B\256\370\314\321\323\026\216\336\371\013z2P\226\320\3418\036\026\321\312\371$+\220;\215|cI\027\3717\177\250\265\364\251\346\266\325\345?\243\317\246Sh1-+V\222\325\274\320\012\0150\322\322\247\026I\312\235\300\004\251j9\334\265\022I\311'E\326\310\302\315\221\340\220\222c\016\355\3176\252ej\231b\377\000\276Q\3514\250\214V\252\251uK\253V\244\276V\343M\244\025-\230\274\201\273\320\355\300\0319>\232\371\254PiD\207\300\033\210\273u\337\311v\317:\217\004:cW[Z?s\360\375}\020%\361\32684{v\263\324;\322\242\365\022#\257\032}\042\033o\027T\031lyZi\216\012\326\001I+P\332\234\247r\223\234+I\272\307:/\036WQ8\003\320zR]\275;\374\203O\000\275\271&\273\372\223\351|*\327P\375\271R\246\266\3031R\227*\363T\226\203\256\215\251O!D\234\355!;\210+#\031\335\214\343U\032K\362\236\350\347R\007\234vT\223\342\247\250\324+\362\245\023\243\375<\2276\355\251\306\227\362s\335e\322\313LHJ\212\034qkJN\002R\310HByO\031P9\032\266\257\303\223\374,\315z't\021\311\003|G\012'\353\371Aw5\311N\264m\231\226E\012A\213\013\366st\366\322\322RK\021\320\022\227\034\011^B\334_\235)\0079\336\243\203\236J\307\015\244}R\2272\251\335\325\346\2035\373\356\325\265:%JP\266z\\\314v\027q7\016\240a\032\223\216\015\251\202\227[N\341\265\240\022\267U\312\316\377\000(!\266\365\323E\247c\206\312\362\217\325s\223\027\307rU\274\376u\356\227\337\020}Z\261z>\246m\012\001\266\030e\210\201\230\324hE+j+(N\326\322\343<\226\232JR0\207\022TF\321\261G:\264\222\206>\207\036\201DP\2276\335\312\267_\014\016N\227\323H5\367f\274\245\256\024H\231Z\3744\277&C\200\254\251\225\023\302RO\225G\204\222\025\200H\327_\323f\001\253\214\353\015\377\000'\314\252\235\327\356\231\305\256\334u\212#P[4e\252L\247\253\016\266\251.8\205-^u\002T\220\222\255\252\316\010V\344!;A\011Ow\323\265\033\230\223~\241\315\0034U\177\351\227\302e\273C\272\320\355bZ\247\312\013\361\332u\310\355\011\022]S\376\036p\204\206\322AB\0209V\334c\222F7\231#@\260\2203:\354\205r#\364\223\300\231\323*\335\016\2416\336L\241\363q\022v9\363Ghe\227\226\2429SA\307_\3166\370\230\340\224\2003uz\312\260yF\211\305\300\222p\025\310\370c\370w\231mI\247B\256|\335R\213\012\002\327\015\2512\\}\365!\267\002\324\343\256\257\222r\353\316)J\345JX\035\263\245N\274\226\322\317\324\200N0\027\207R\350\322\353\265\372sm!)\235-(\212\324Z|ex\312y\307\022\224\224\025g\030N]R\324\017\011l\235\250iy\333\320IM\312GP\300\006S\217\245\260d\\\026\354\352,\031\306}\026\236\3330#\255\267\274y\017Ix\251+\223\342\270J[\217\035\264ll\035\312un>\351P\330\322S\223\324\250\273q\357\365\363W\323S|\250J\246\333\367%YV\373H\2236\035'r\026\343/\207\3446\316\345(\272\267\270\337\265m\345C>\032P\204\240#q;\230\3234\201n\356\2553\366\272\202\235\264\350\267\234V/\032\217OSc\246\370]0\213|\327\350\356T!\261$7\222\322\327\271>\037\211\340:\326\346\226\026\224y\201V\355\253\276\241\354\000\003\305\366\302\240hy\005\334*!\035\356\241\336\326\215\012\335\213\036\346g\252\021\022)u\226\355I\216=\011\224\355.\004\245\322\350i\244\270\322\004\224\217\021\245\245\245 \205\356Z\010\326\216v\214\223\217t\234\272zu\225mm:=\231\017\243\326M\311@\352_Sa\322ex\015D\242[p\230\210n\012\213\345;\234i\246Zu\345:\256AyN\017\015\242\245\357\334\240\363\213\311+\214\204\026\217\211\354>\277\361\011\260\3209\252Eu\033\012\343\267\355\333q\273s\375\325\351\205\035\2256\325N=%\246\242\317F\026\237\004*L\207\037q\367\333$\005lYVA>d\356\032#&k\211.\263\372\217\222\013\031e. u\372\360\266\352L\333\325\364\311\243\256$\204!R\247\307B\224\332\0009[\205\260\012\202\2179\332\243\205'%$\021\2556\364\346J\315\301g\314K\035a\031\316\352=\006\340\214\034n\221\002[\213}\347\016\335\2576\214\214\024\244\236ZI\374[H\316s\203\215(\335+\2439*\346r\354\250\353aR\252w}\036\012\224\334%\006\367\305y\301\373\222R\011-\254\216\331\034\003\214\345#\236\330fR\004f\322y.\367V\026\276T\334:\363Qi\3378\230\215\042\242\312\024\356\301&)H.\206\327\376$\356\3348\347\216\371\326@g\037YL2S\276\216\026i^r\243]\013\255\321l\332\235^\300\352\205\217\\z\242c\310\011\021n*3\345HD\244\2667!\346\035JB\210\341m\272\323\251=\322KFa\\\362\266\343ai\005\303\312~\202(\261z\307\\\251S\356+f\374\263\351\3645!X}\266\036[\2552\220w%A\263\236\001\301I\012)\302\211O\034k'\357\201\307i\354\230\223AT\366\024\007\324\373\232}\031\326\256\232U\273>\277D\214\244\357CM\027\237\216\244\214%\366\320\242\012\022{yB\224\011\3439\300\302\327H\342|\274.\213\246B?\003\277\342\002\235]\267\372\303@~\365\263dM\262\2578\331C\265\332d\247D\346\021\214\224JaGd\226\317\256\002\024\002O'\\\246\247\\\311ZCNG\350\272\315>\204\351\3347\233j\005\351\275F\255>\233\\\262\257\347\243\325kP\326\270\222\036\012\310\231\015@\200\244\205\014\224\371\2163\331*\307ms\361J\3674\262Cd-\211Z\326\220\366\012TZ\251\321j\317M\257\272\235\036\202\034\221O\016\0111Y'\001L\250\371V\331\035\260B\222q\203\224\375N\270\255ON\222)\311a\260V\263u-sE\362\257\347\303\377\000[*\266j\243\252s\323 =\023\310\260\352J\324P?\026v\235\304s\223\3521\355\337oI\2521d\225\227\256\3216V\220B\323z\205v\321\353\335\232\323\360\377\000e\032\372\033\331\032[\216\240%.c\376Z\037\310\033U\333b\261\203\372\353zw\351\365\360\354#+\231\323\211t2\356\263^\311M\323z\215Z\337\253K\267\344@\225I\223\025\362\324\210\257\241iZH#\202\222\000 \372\020H=\301:\341\035\242v\236]\205t\323\270J7\223\202\257\365\233Q\267Z(z{\225\210\014<\000T\210\005L\244\253\003\207\343\3622}\361\223\337'\276\273\330\335\030\215\273\206>\273.WS\034\244\235\204X\365\317\310\253\003>\235b\334TzL\372\200\210\373\260\034\361\351\265H\350\012\221M|\240\243\305ea'b\212I\004~\025\003\310#\266\376\223P\003m\231\034\020{\217u\314O\024\233\374\303*\263\374@\3742\364\323\255\315\265s\321\356j-/\250hBZrY!\226\352\210H\341/\240p\225\017E\240z\340\347]\017G\373L\3157\221\377\000\203\366\377\000\213#\252\364\031g\3635\244\037U\230\375N\370d\353\015\204\310\223/\246U\351\364\340U\262u(|\364P\000\345E\326\211\333\377\000\330\003\364\032\372\037N\373C\243\324b)E\372\034\037\312\327\025\253\350\363\303\222\317\345f\357W\355.\262\334\315H\244\332S+1[QPq\306\220RR\017q\234g>\231\364\364\307}m>/.\012\301{_t\325MQ\321~\243X\253r\2450\324\352\325#\311[\312R\210\354{\237\251\372\177\325v\351^2\012]\321\276\301\2647S\257\365\266C\345\2052\370\203\237\371HH\034v\356I\343\267\277\246\204\343 \345]\217\221\346\212\202\225w^\224\224\270\204!\020d\3559\306W\267\323\324\201\237\345\252\271\317\254\252\023\264\355\265\343K\352\005U\014\272\313\311v|\254\234 \220rs\366\307\267\345\250d\216*\254\224p\356\023\032\214\253\322\340\210QP\242\250\306\316\022\3360\002O\241?\247\327\217\246\214\302\364`\327\021\221\205(\313\362\255\307\233\216\334\325@\226\331\036@\352\274\275\275\207\247\327Gl\317\365^k\005\320R\3277Xg\303\2474\210\265\347\325$\220\205-\030 \016\006\006s\237\257\246;j\277xspS\016\220\037\301\204\007\033\256\365\372x\360\253\025\300\363\012^\000sw9\366H<\236?\227\353\037~\256P^\367\012\356\232\366]w\247\265\331\221f\324\231\207\042Z\216\012\225\370\225\317\035\371\364\343L5\355?\232\264%\247)\275t\364\256\323\270)\355\313\247\277\016,\200\024\240|@\214\014{\223\307oo\247:+\230\327\014\242H\332u\214*\327S\370}bj\227=_:\374t+\001\300G\230\347\214\361\311\372~zU\3326\034\005M\216\004\270\022o\335\007C\350\233\257\324G\313Jp8\223\200\225\247\000r;\343\217nu\037vk\\\274\042y\033\212\233\256\364\215\230P\366U\320\260\202\003{\220\274\202H\364\007\237L\366\321%\200U\025\3472\210!%a\364b\336b\253\343\256R\226\312\310\362\257\216?\227\323J7@\333\260\214\327\222\321\274\360\2334\276\215[\016<\225;\035\2646\017\034\204\357\036\340\236\177=1\026\215\243\262\361$\214\225\317w\321h\366\274w\023N\252%+@\340%`\004\247>\243\362\032\215@k\005\014*\201\331\251\030\307^h\264U\272\303\025`\351\013\363\000\322\226\247\010\364\340c\372\353=\272\346\267\026\212K\207\341C\377\000\372\323\022]m\271\306\003\357\002B\212\316\0220O`\000\320\035\253\016u\246\243\016\241k\276\255\324\310\225\031fC\220\203 $%)-\344\340~z\2038*L%\334\253Aa]\220\350\356?I\012\236\312T\011i\311\015\344\023\364R{\377\000,kj7\200\010L\261\364\376\027\362\235{\275A\257J\233rH\203R\206\247\212P\220\265\015\234\366\347\372ha\345\256!\310\263\027<\356ch\016r\233\262\032f\277\037\375\353\243\263\042\232\363i\033J\033\011.\214\366\3162G\256\255\263;\206\021<P\361\201\237\335Y\316\202\374 \365S\342~\033\025\026\347G\266\355\210\316beQ\311\204\226\361\335(e<\225}\011\030\366\355\234^\267\366\203O\246e\312s\350\264zgK\232wxm\030+c:\031\360-\320\016\226@B&\306E\377\000%\275\257\270\354\365\025\260\225\214y\226\3218 `\340\253\261\355\215|\313\251}\266\221\355;\006\326\372\256\367E\366o\303 \272\355:z\215\325\353z\232\304\033:\304f;\362\267\206b\307i\275\251p\347\003$p\333C\320$\025+\034{\353\342\335O\355'\212\377\000\017O\315\374\327\320\364=\030\206\370\272\2344}W\305x^\263\352\0267L\252T\212\022\244\325z\223%\242\345JP\332\205y\273\204\214\345\010H\340$\221\265 \025ru\035zW\307\247:v\033\221\303\314Q\372,1\311\251\022\313\206\016\002\240\3357\267k\257\\\327\037Q\257\033\205\266\250\364\230\0166\304V\226Ka\327\274\211\316\321\225\250\200\274\001\3019=\222\016\270},F\010\335,\316\2400\007l\256\277\250\352\004\256d\0216\311 \237\311!.\351\014\335\367u*mE\222\373n\324X\247\322!\270\200U%\3058\000Yo8\0157\222\342\262NJy:\177\247\334\233dw\027\201\353\357HZ\271|&\2726\363^o\351H|B\3656='\366\2636\257\212\304\326#\0304\207\034\001\006*\000\332\036JA\345X\005yV\006q\214\361\207\246\3268\275\316\037\217\262KA\242\005\255\337\370y>\353:zAG\246\321\031\275n\021\275\331M:\314&\224\2678J\310R\326\256\304\251[r01\370\2119'Q\245\250\232Cy+J}I\231\366x\010\202\336\263*u\353\242\236\\A5yN70\241KV|\000\264\270\241\222ICa%\240\2429\301\300\301^t\304\017\0156Ny\372\376P\3656\346\327e\247\026}\267N\267\355w\25356[yq\320\374\222\350N\026\002\221\200\313dmK@\340np\253q\033\200!9\306\234Z\373m\376k\021\360n~\320\250}\315i\333\227\015u\332\015\042\217N\227Ws\306\252\326&\264\342\026\313-\015\307\303m@\006\261\201\271\307\3678\204\001\341\266\245\371\2264\3641\2076\353\034\223\365\373\345_S\332\312\320\236\212\\\326\245\262,KF\2436\346n\231\031\2615\352}+r\033y\225 \245\011p\201\263\012\310#9;xN\011\335\256\263J\340\037\222\270\276\247\247yi \014\246\325\373n\275T\266\253W\335F-\036\205fCq\272\237\310Ky.\037\031\254fL\311%)\216\220\322\000\015\240\027v\254\251[\220\254\005\365\232\011\300\033\201\\\324\221\357x\214d\375}Z\252\265\311\361)\366|K\332\241u[\322niF%\326\344H\240\241\230t\260\245\042\003\036\032\216Ya\315\257\226\324\352\202\237qo8\322]\332W\256\2127\026\345\307\037\332XQq\015\343\205\315`uAT\310\224\207\235\207S\352\177R\252r\346H\223\042C\376\014JLvW\025\226\343\262\214$\245\244n\010l!\015\244\251N+h\302\211\246\255\301\330\264h\243\240\342p\002\331Z\325\016\245\026\237\011\025\251HJ\335\010\212\266ZQ\332\352\326\022C)\011\357\274\345X8\300;\3166\347Yq:\226{\006\341\204\255\256\334U\013b\247:4\232s\265)ri2c\342#\337/\343\220\312w9!\315\205i/I,6\002H\011C\257\250\356-\245\012\335\200no\225-;\000!\305\021Y\223]E:\315\261\255Z\314\312\305\300\353\217\301u,Cf\033s\232\360KM)\305m;\021\373\260\371\310\005\010\316rR2I\000\242\367p\224.\243\177_A\032S\372<\305>\211U\245\305\252B0\003\213\2050\206\002\227UZ\226\333E\235\216+c{\226\002v\253r\360Bp\223\235/\367\321\350\210\346\222m(\256n\224\334\365\312\2352\234\315c\2537WO\221.\014z\273\024Z\202\340H\234\303\213e\247[~@RH\247!\217\031\017x`\251\244:\225\034);\232\223\253a\311\240s\365\361)\226\267h9\372\376\320\014\276\231t\363\246\375D\210\233\322\353a?\265ir-\311u\247K\221b\324_ql\310b\023%\0176\226\3662\324\227I(\\\227#\260\026\373\255\262<\021\247\004\316|[\200\367\376/\366\366\2762\220\227\233<\257v:\331h\265oNf\343\207\006\360\250\333\265#HT\272\035\015tw\232o\011\360\034jk\252Q,9\273\305q\322R0\205\000\332\3122Y\032G\232sq\273\336\377\000D\022)\345\252\305t\336\364\3515\343Hmv\255~\025f\350rCn!\252\245C\346\2462\215\311\312[\012i)\010)A\332\235\230\030=\373\225g\206V\233p\307\260\240\225|\236l\250\033\266\320\240\256\251uD~\205[\217r\313\216\362\226\24776\267\303\315\250\245i\222\262\244)+ZQ\277\2020\023\220I\003Li\365\016\025\234!\314\320N\025B\350\374:|\233\211\353\036\355jm\277r\223\265Q\237R\032\010P\033\226\310;\374\216\244\340\204\015\311#\221\306\267z\203\210o\210\334\204\236\321x\3418\235\266\035\244\273*m\032L\372\254\252{\345C|s\200B\325\202NH$\226\306ZP\316\007\031\031:M\316\007\221H-\034\246\365\012\277\012\347\262\334\213L\242F\242\265\035a\222\301\311\015!@\222\327$\355@I\331\214\343\030\036\340&\370v\277u\332\226y\260\252OTm\232}.\263C\253\307Dv\252\021[\\7\012\216\024c(\207\033\334@\311N\002\320R}T\223\330\347J\312\007#\272\3514\362\222\010<*\362\327Oj\326\235j\347\271:z\266|\344\311Dh\313\360\333\224\207\020T\244' \355\306H#\004d\177\233\214\031\230Z\362\340\266c\325F\346\006\311\331-\347u\216k\027*\355&\243\310\244\314Cis\345\344)q\3359IP[+J\200X;q\271<d\024\224\217L]~\261\321\237*\350t\0359\257e\273)]k\\w\005\241X\270\253\213\252A\253YsY/\025\252\017\207*\011Q\3409\260\000\352w\025\214\221\273\007\277}sRL\\\363!\340\362\272\011b\300o\247\012&\341\270#\322o\273N\245I}\203\012C\006\001)^S\275\220\225\266\244\234gj\331p\2177b\202\017mbj\335\376f\271\234\025\243\246i\330XQ\007^!Q)\226\325\257\324\311\223\234\247\267F\220\226%\311Bw)\246$`'pO%\260\340O\004\036\371\030\325\265\332F\206\007\270\360\226\322j\256M\256\010\342\321\266\042\3656\335n\267b&\203r\317Ciq\037!)\264\312B\202x(\344o\007\374$\245Y\316\007\003\031\316\322x\215;\010G\223W\341\237?\005zY\375v\264zmZ\231E\352\000\223o\307R\327\026j\346\300\303*p~6\244%CiV\017)p\005c\004{\353\0369\237\245\223\374\242\202<\232\177\030\177\214\332\273\220*\375+zU\042\357\265\245\333\022\033y\266\302\025\211Q\026\021\376\020\266R\264\255\035\366\357I\365\032\327\326\351a{\204\354w!eBu\031\216F\234w\302\2656\035\375\323j\244\250\364\331\362\232\211Th\370h{/!\326\376\201\305\262\326\344g\323\004}5\247\246\352Zm\276\034\246\212\317\324\351u\014\033\243\252\364\372*\337[\002\223Qu\002\233]TZ\272|\310y#\301qg\331\304\014\007\001\372s\255\255;\032\017\224\335\256\177T\367\201\347n>c\376.\212\245\243A}\347\321_\216\364I\373J\233\225\024e\303\365B\361\346\037E\002u\015\323\026>\350\037\212\201\254{\233\345$|?\244\203\201[\277\230Uf-\213\325^\230^\024\230\301A\306\352L;E\252\303\301\365q\245\245\265c\266\362\326=\365\337\351\372>\214\200f\201\314\276\355;\232~\177\265\374\027\035\256\352\272\235\3042f\272\273;\005V\236\242\326*5\267]\205uS\255Z\224\241\220$2#8\342\217=\344F\010K\237\375\202\216u\335t\355\004Q\266\342'\365\375\215\376\213\210\326\353d\221\307}Z\251\327\315\203\012S+}\021\222\352FIN\001\307\367\377\000Mm\306MR\317s\354QH\350=*\245\311\222\372\336\2450\206\310\312\212\333\347\364\373{\373\352\357n)U\256#%+\256\257\206\313~\341S\342\014T\307\011\004\034#\004\367\365\310\327\213\001\024U\013\001\312\026\266\376\025\250\224yE\371\264\346J\270\316\326\371<\361\337\327\353\237}Pi\300\310E\214\260vN\264tr\034x\012f\014Hh\013@Jr\214\220\237\362\201\375{\352\341\200\341[\307&\253\012\255\365\003\341\273\346\235vJ\042\354^\343\202\246\371\373zj\016\235\250n6\253]s\341\322r\312K\221\235B\002\260\225\215\311\306;\236H\355\245\237\243\265\346\305\\ \225|2\252\2559%\017\255N\203\302\235s\011\000}1\333\235\007\377\000\217\274\332\254L;\250#V\276\033*4\270\350\232\324\206\024\244\017)Np\234\017\247\351\234z\350\207E]\325\333\001\262O)EY\241\365\042\004\3653O\2311\266\202\306\304(\235\215\240v\355\317?\317\351\350\253\243\220\034+6\306\012 \245]\035]a\207Q:\217P\237\025\035\203D\240\177\337\373\374\336\213p\031\010~+\313\270\3024\267\353\267C\361\334m\024yT\251D\204\222\276NO\240$v\377\000\276\231$\362\24678\212\245\033qZ\025\332\304u\312\252\311\234\370\335\300m\342\235\240z\236\340\376\203\376\225so\225\022BO=\273%\327\373\247p)*n\2239\346\024\223\306\342\222U\201\333\004\177\347\363\322{\035\300Wde\303\233\245\317\032\313\352\004\272\252)\325\033\216[1\326@\010J\371\347\351\301\307\345\353\253\006<\032\265}\226\352\354\231\325~\206\374\265\042H\252\324\351\362[\010*V\024B\224q\334\363\237\317\327E\2361\267*\346\037\365\012\201\3364K\016\331\2548\314\252\254&\327\270\367^\000\377\000]sr5\200\345^\042A\240\212-\012OJ\353\241n\246ty\016d\355p\250\004\217\327\357\217\313\276\213\014q\270\214\246\000p6xG\377\000\372yg\313\001\346\376Ki\036\270V~\332w\356-\355\374)\336\377\000\202\261U\006\305.56e>\227OBx\334\333r\001*\031\035\200\347\337[\016f\001Ln\305\2053\\\225F\2535\025\207(\361U%)\334\024\2462\274\375\375\007\327\376\272\004\336\200#\267k\331n4\214~\035c&\347\271jtK\366\312\275\257\212Ke\042\005\026\222\332\231\2171\314\340&K\251\012w\303<\002\206\200Z\271\033\200\347Y\222\276B\322\011\244\346\2000\277k\333\205\275=\017\3517[\257\266\242\324:\311O\256t\223\2440\322\204P\354\350\254\012\024\00509J\030\244EuR\024\006\001/\315x\2272\177vy\003\343\377\000h\272\216\222\007\2704\357\177s\316~+\351\3351\222\271\241\254\362\217l|\317r\255\005\371Q\247\303\2439I\245R\225K\2464\200\221\026,D\304B\2168S\241!%j\343\327:\3707\332\217\264\246bX\316\007\326}\375\227\322z\037H\015p'\223\334\345\011\364\326\217\006\330i\353\366\344n\024/\034\201O@d\370\213H\316\\\007\324\237C\330\000O\266\253\366ZA\003~\363\250\241\273\217_\2127]p\225\343O\006k\361g\027\351\371)\333\332\254\325Z\020\220\365\006u9\251\313C0\241\272\224\370\222\224\263\345Z\307\360\356\306BO8\347\35255\332\226I-\226\221\273\217_\315g\351bs\001- \201\311\354>\011\027\326:\\{V\215K\263\355t\275^\231%\300\267\031\216\310O\315H_\227\356\0201\260(\360@>\203\236\177\355\026\225\276#!`\335]\275\375\376\013w\241N\342\037\250\220\355\367\366\377\000\252\233[V\205Q\316\251\322#\325\036fc\260\014\211R\336e\242\3530P\323J\361<2\000\030N\340\215\377\000\204\025\361\222ykC\031i\335&H\037\020\213\257\225\246*`\240}{\252\233\327\032\235F\356\270j\337\262\032\333\030:P\344\223\221\346\354\224\247\276U\310\030\035\276\343H\351c|\222\027\366+P\271\221\304\0329A\261:h\375\271n\332\326\334W\324\272\205V\254\364\311\216-G\261JZ\310\000\372$-#\237M3\250\203d\254cO\251(1J\317\015\357\257\202\261\216\252\025\225:sT\244:\355\3135\246\251\376+H\361\014VS\222\275\247\034\020B\224I\340\004\244\3438\032\211\232K\2663\375\271\245Xe\266\207\274`~I\255]\352\003f\211\023\246v\2532]\257\311\202&\311\253\271M.\265D\214V\226\320P\207\225\262D\215\301!\005Cg\210\260va\031;\272h\333\033h\216;\327\037\331YQ\265\316&B\177/_\177\202\023\270m\233V\317\267\352\224ZD\321T\257Jm\207\356\031\216\311QC\034x\211i\351\016\340\225! )\305\270\240\245,)\305\006\223\261)}\356s\210h\340s\365\360B\210\234\271\375\370\372\372\302\220\267.(4\347\355\332\215\032\251Q\251\313\254\264\334\230\214\241\246\324\314Jkh\331\363\356o\000%$(x{\200\356\214\004\251\300\255t\221<\207\001|\347\340=J\312\2360\341\221\200\217\230z\351\353}n\243\377\000\250u\211\021:Al\267\026\005\012\327X-\323\023%\304x\213y\366\222I\223#\303\015ej\312\267>FGd\350iu\017$\337\003\205\207\250\205\220\200\330G\230\362{\250\373\236\317\261.dL\265\256\253\206\334\351\325\222\314\357\333\367\024\364H*\256W\222\332\022\224\260\222\326LT=\265-xh\036'\203\341\264V\222\367\207\256\257K\252\337\213\312\305\324G#\011p\2738\370\016\352k\341\335\252|\256\257\324%Rm\264\326\0421S\215H\200\333\273R\315BZ\345\370\325\011+W\377\000\3634\220\266P\224\214a\254\347\017\002\206\235%\335\236\022\332\330\313[\236\367\177\025\2574\030\261b]V\267\3550\252\263\254\227\345\251\351J\307\315\324^K\313[\253<\377\000\002\236\347\370|\251\004yt\273]l%gI\305\361iQ~\306~-rar\013\022\353NmB\332RRZ\206\326A\303\211\374% \356Pl\3762\245\003\345:\337\321\021\266\202Vle7l\005Cz\237\026\266)\321\231\254;9T\320\3345\251\307\237S\313[\316\255\345\253\012y\340\322F\345\234#*t\004!\001#U\325\337\011v\3204xL\013}\371\262\354\352]f\260\353\021jR\247Td<\333\356\014\262\227\024[f3$y|\210S\233\334=\266\257\234\257!'\260\007m\035\253\376\253\227\035\347\011.\273N\362\247\307\352M\351\363\365Z\205\005M6\206-\364\302\217&D\270\360\227!O\264\337\214\264\242*\346\272\042\006\233\003\304PB\012\3745(%\273L\346\235\254\003?\337\007\362\347\331\035\216\363Q\307\327\360\253\377\000Z\272\321ht\246E\036\2216\310\267\356\373\266\263P\024\304S\245\311\025\004\252R\326\\!nH\334\332X2\022\237\0202\001yIm%E!\264\016\303\246\364\347L\333\340}}es\322\312\013\211q\307\327\360\261\322\035\337y\333\367%\337k\\\235\022\207ku\020\374\375\300\365\006\233X\224\327\3101\271o9\042O\214\362\233u\315\312~R\301u\377\000\011\311\0147\220R\3325\272\3758\301\007\036\250\215\225\265\333*\300|'|C\317\351}\377\000\011\373\316C\324\273e~(\2219P\230\250\276\225\274\244\006\303\323\024\260\246\230HJ\274\215\0172\2243\301Q4\326\350|X\350r\2011\007\314\026\314ToWnJ\035n\271\026\223\005\230S\330K\224\027\242U\002\330\255 4\260\016\306\371\212\352\212\324\240\200\265n\030\302\202\207\034\250\323\355pi<s\216?\2643(w\341U\336\251@\351\317Q.jey\217\235\201Wj4w\237jG\235\225\370\011(\316\354\035\316'y\311%+\300O\004\014\353Ot\2614\267\220\275\014\254p#\272\015\250\317\256\331}G\250@r\202\365B\2139\326\345Av;\356n\226\316\322v\270S\2256\244\270\026R\276q\235\271<+G\205\315|y\354\227\324\260\201mL\330S\353&\245Q\252C\244\317\204^m\265T\242\255%\010J\322\222K\270\343\012X\334\263\201\264\253*\035\365W\261\273v\223h`q\214\244O\304\253\224\353b\263\376\363\311\016\213U\312\030\237*@\3451\374'\003e\3169\011\010u\033\260\0166$\343\323X\222K\264g\013\243\320\003 \000sih\365J\257N\247\304\206\334\352LZ\243O\220\314\267\034[q\352\021\325\202\205n\036P\341\033A\367=\262\024\000FG\020,'\303\032\3571\376\220\017W-x\227\305\211>\260\365\273C\257V \251\017\000\211!\267\3222H\\Y(9i\334\377\000\012\301\004\202\016A\343\234\3272\3436-o\364\231vJ\033t\0252\243U\344R\234KsL\210MU~b\236\376\374\245lN-\251\324\035\200\376%\2048H\035\224\0109\007\\\177\206\355\301v\257sv\332\036\273Z}\351\215\313eq\321%\260\324\306Lp\237\335\251%HX\000~\037N\000\3748\321&\323\335m\031Al\346\215\247M\261s=_\233\\\267%\312a\206f4!\266\353\315%\364Gp\243jJ\320\257*\323\270\015\311<\020=\365\237>\240\260\213\341\025\260\016UV\260:\362\253N\360\251\322no\206\273\256\311\272)\323\\\207*m\0300\320\361\233V\325--\265+iI\306\355\2459 \214\367\340!\355$\220\302>\012\3049\315\333\234|\225\324\231z\374:\365\3562\231\352,g\351\367Rc%\0379*)\207Pq\244\344'\306F\025\3436\203\234)I%?\302\255K\231\014\303\303\227\203\352\201\030\236\023\276%5m\364\356\277\322\312L\227\372s]\201\324\373\031)\361\234\245\311\354\204\343\273n\263\2740\257_8JN3\333\221\316\352\3724\2614\2359\261\350\177\202\264\343\352M\230\324\303k\275U\204\262\257\276\235_4\350\260!=tY\227\042\000\013\212\265\241\305GWn\022\262K\250\317\242\025\307\267\270Y3$`k\215\025I\242{\035|\205v\272iR\270i\360\350\361\256j\223\265HI)\021\246\262\265\034\247\320\034\000\244\367\354~\276\332\351\272k%k@~[\330\372.\177Z\030I,\024{\205z(\265Y.SM9\3276\251i\012C\252Hq*?\375\271\316\272\346\345\270\\s\330\032\375\312\273u\267\243\223n\272k\367m\265Mr-\361\017\316\353Q\216\005A\254r\240\202xp\016r\017\230d\034\361\256\237\354\257_\226\023\367mO\340<\037OE\201\366\217\2452a\343A\227\217^\376\3138\035\242\325D\365T\032il\220\243\342e\030Z\325\355\264\363\236\375\365\365\310\344\004R\371\211>l\177H\256C\013\221\025\010y\016xX\034\362\011\035\277]X<*\214p\202\\\242F\214\372\222\334\307\320\024xJ\216O\333\364\376\272\265\367Vc\305eC\376\302U2B\234/8\352\226s\346H\030\036\270\377\000\256\255\274 \274\345I!T\306XX\222\344f]\0039Y\306\1773\250.%\021\354\246\325.\212\035z\232$\210\305\326\010Q\374C\031\037\177\317\037\330\327\266\232Uo\030\345L\334\211\2437\031+\015\307R\234N\344\035\234\377\000\177o\313P\001<+5\345\241U\213\342?\214\372\226\232O\3155\236\010A\311\376^\372&\300\247\306KSl\306\313\222\231\2428\333\273B\206U\267\007\327>\375\301\324\327dA\214\256J]\245p\270\344\207*OS!3\377\000\343g\305\311\347\327\237\372\373\352,\005v\233\012&\271\323kq\246\\}\374L\232\341\000\0059\341\355\343\350>\207\373:\200\015\251q\025\205\303\037\2463Z\212$\302\211\031m\034\354N\376F=\261\235\024\021\334 \222{)86Z\374\015\325\210\014\266\224\250\014-D\024\373\340\217\313B\220&\030r\225\327<\213\007\377\000\364\355\266\3049KV\304\027\034R\024\274w)O\005^\235\363\2527+\317\343\003\011%\324\012,\373>\214\251\266\3359\023\002\206B\212\316I\307ns\357\366\355\252\313\033\210\362\362\241\216\015\030\312\242\325\016\257u&\233W\361\235\242\255\267\002\211\013\361\211\012\347\324\340q\365\372\376\230\357\324\310\323\220\242\042\011\013\252GW\272\201qGz\005aqXe\336\013m$\247\217\246\017=\375r\177\226\274u\217p\247\042xy%\307\011\023p\364\316M\305(HKA\033\274\304\340\343\237\257o_\351\244e\320\271\371Vd\315\036R\276\343tJ|\037\005\325Mz\042TIR[IN~\231\365\032\260\351n\034aY\363\212\011\341E\260j,\300i\260\363\203\036\212_#\364\355\255(4\347o*\316\316B\364\351\2653\250\022\340\042E{\345[,\371\220\020\202\200\241\236q\375\363\250\322\272R\321\274\360\235t4v\204\341\245u&\345b\\\312)\240<\322\270AuQ\306\017\323p\344\377\000O\277m\030\352\011q\004#\230\013@6>\013E~\015'\271kU^\273\242]\335#\351\225\327%a\206n+\236h\225&\234\332\210\312\251t6V\245K\221\236<I\010\360\221\302\212N\260z\323$|E\254iu\366\030\277\317\262\333\351\005\240\324\200s\371\177kt\272ct9S\227\362\3756M\351\325U\022WZ\352\025\315-\304\303i\177\306\230\205ck\213\311\377\000\225\035\033\021\214\025\014`|_\257\350\246kI\221\315\210zr\341\365\352J\372\227O\324Fhe\307\320\012\010\256\341\250\321\004\241\001\270U;\306nw7\031\265\000\207\025\376'\234\301\302{\034\015|\216s\245\334b\000\310{\016\327\352\342\273(b\230\217\025\316\021\267\271\376\202\364\243)\227%?q^3\250\356\030\010N\346\222\235\315\207\310\312\031@\366H\364\356{\343\323W\3222\334u\023\221\345\300\003\366\003\331\003R*\240\200\0377\316\275\1774\271\251\302\270\030\230\367Yn\024\314Ui\021\034]\012\015I\202\031\247\245D\247\346U\025$+\304Zr\020\222R\255\247'h#\002\202\011Z\357\276\312m\346\352\373\003\216?d\364\222\261\355\032(\177\0009\256Mv\277A\337\265\340$\265>\225w\315Z.\373\262\252\207\356\332\213O5L\361\2663\032\211\013i\361e\250yr\362\233%\264\236B\021\200\237\304\243\252\315#\316][\235\372\017_\211G\042+1\304<\215?\377\000\323\273\017`\025)\3527[\355+\016\203\324i\324$\275*\273T\214\212<7\231HBm\352Sn\357y\324\241I*vT\214%\266\300\341#\314B\225\265!}<\355\014s\234m\307\037\001\317\314\2557t\347I#A\374,\346\373\272\275}\007\352\221\361\251\225:u2\305\247]\260L;\246\2453\366\245V\036\343\212RJr\314\000U\3300\3367z\227V\351$\253:1\230\207\210\217=\375\275\277$\0276\203\244\355\300\367\367\374\327\\I\006\2457\244uV\014g\032r\244\344\307\037\332U\210\310ug\201\306H\333\307\007\371\215)4\216\361XG\320Mi\353\300}\363\302\023\255\334\256\273^\206LP\344e\255\300\255\352\33264\333\217-K\307\230\344\200\010\376z~\007\331\004\257J\335\255\253V\002\316\267\252\237\262\227(\277Mn\253v\311jL\231K}\021V\250\215\307\011o\305tlSL\345\342\206\321\270)E\345\204\224\205\214=\253\005\333X2]\223\331fD\366\260\227\016\302\225^\353C\222\272\265\3258\035\037\266\234`Z\262'\042\227:lV\266\307Ld\202\267\321\031\001A\001\003\301'\305P\363\024'jT\022\225i\2755=\304;\001Zs\341\306=U\240v\325\245\303\267\3507!B\042\231\304\242\221\0302|c\006:\224\330\227\265gr\320\225\007\033e\302\224\262\222\222\264)k\332\342w\364\304\212\221\374\225\220\343\270\226zr\231\364\376\267t\367\243=\037\252\334wa\252V\346\3170\333\243\333\021&\240\312\251T$+cCz\306\306\220\224lR\237Y!(\011)J\267\202\255\350\310\021\331Xs@\367\314+\201\311\376>%%b\331\214\365#\250\2265\233\002#\222io\325Y\254\33558cj'\000\244l\203\013w>\022Ht\227W\271N\253b\317\003\032\253g\332\360\326q\311G\236/\361\271\307\236\007\262\275Vu\0222\272\226\345\211i\303\014\327R)\317\325\3433\270\307\245R\214\206\324\353n\257\272L\2046YK`\356Z\026\011!\001\305+_E\252.$|\327;\255\210\006o>\365\375\376KD.\032\377\000\376\234F\243]\265\250\214\324ju\253\212\025\035\244\270R\002\037\233$\245*Vx\360\220w)@\002\255\250H\301\335\215ji\274\3044.v^\011\364\377\000\305\367C\263k\375@a\327\351R\344\246,\351-\312S\353V\324\222\256N\321\316\347T\236\001 \354J[\306\022\202U\267\034\255\217%)<\255\006\212\343\240\304M&\353\223\026\024\365\310a\014\314\217!\346\025\3416\320-\224)\015+\361grv\360s\302F@\012\3232\352\003\231\302\241\204\212?\004\300\201k\224\3074\373^\011C\220\351NF\212\333o\200\3259\255\373C\255\225\002V\351ua{\216J\334@W\011a:Q\276c\275\347\026\275,\315\217\310\012U]\026uZ\025\257\376\351\334\235V\275\240\312\226\277\032O\354\004\264\271\360i*h\262cS\224\336\323\035\325\272\026\226\237;\226\024\224\271\225)*R\235\212=\323\007\306\005\017\\\013\377\000\236\236\210Fp\031d|\326=u\366\374\264nk\306\326b5\211Z\266\335\2441\002\233\0023g\302\217I\232\227A\021X\220\344u)\266\332i-\370\262\002O\212\270\353\332Ki@\327\321\272>\235\302/1\026o\337\036\253\231\324\016J\266\020\355\233\306\302\352\337I\337\274z\203s\337\022n\010\017\332\262g)\366!1p\0044\363\311vz\231J\326\246\302\024\245\266\312R\235\305\005n-\260\302\022\254\335c\332\366\022\306\326\334\374;c\320\376\312\372&\015\231\354\252\015\377\000\323\312\274\353\215\312}\245\\\351\025\315:\014\347\042\032U\233X\0259P\222\247\245)\266\327\025\012p\274\350\217\035N-\322\226\313A\245\000\234#*gE\250\025\346\261\361\030N<SU\256\370b\352\345\042\321\267U\323~\247\325\355\232\265\270\246\322\3648\317\025\252d\327\022\267\034B\003[\002\022\224\0006\024\251\004%h\341C\007U\352Z\003-K\020\317\257e\217\274\265\331\341XJ\007V\3503\252oW\335\243V\351\362\036\246L\202\272t\206\233\312\337m\357 }\320\240<p\2055\337\320\034\025\004\035#&\205\341\273.\350\214\375vP\351\000p!}\336I\021\351\324\353\326\237D\255\321\025Ix3!3\001mp\035Z\022P\262\244\202\222\311V\325\022\006\303\307>\272V8\313]\260\233\007\204\341~\361\205\007M\352\254\013\232\265N~\220\305Q\212\343i\371\025CuAiS\\\270Xt+!\3170x!\304\343\033\300 \215\030\351K[NJ\275\325D\250>\243Y\217\335\226\324w\243\301n\254 \2679*\201\312L\332l\206\366Jc8<-\2770\035\212\233I\0308:\311\3260\023Kw\245\315\264\0229\376{,\352\264\257\246,\2323}$\352\233\023+0bI\024X\263e\015\342\243\011IO\313(\236p\264\244\241!\\+ g\224\347XM\231\265\262N\313\251\223J\\\357\022#\312E\365J\341\352/K|I\226]}5\032+\3131\302\334>2$\264\262\222\217\031\033|\241\304\025%kN\325!\306\311\363\005\035bk^X\322FA[z(\231!\007\277\362\201\253\227\024\252\274{\202z\203>2\341@\230\224\277\205\206\2452\340\303\251\003\262\302\024\244\023\236r}5\316\0269\257\335\332\226\3632\335\275\322\372C\325YT\252\225>\012\246~\322j\237!\306\326\024B\301 m\001X\033JA\037N>\343J\310H\033[\350\234lU\224K\323j\275\301:\211\026\255[J\330\253)E2\002\320AJ\322r\017\364\347X\223\011\037\021.\031\011\2668Z\200\370\264\370d\237\327*+\035l\351\035&\024\376\244S\242\251\0275%\265!.\\T\364'\011y!X\016Hd\014+\224\225\265\203\273-\363h\364\276<A\354\036oE\233<\3467\321\341S\336\225O\225gCU\042\274\305~\217C\212\242\2656\237\021\331\024Bq\373\366\022\340\361Y\003\004\224e\306\226\011#\266\355\042\366\010\331R`\017\321i\302\010\024\025\374\351]\375\361\021\002\024[\213\247\013\263:\315j\025\370l\324\351rR\267\333W\242^\215\274<\332\361\374 \237\247\246\263\036u\214g\213\247!\355=\377\000\260\232\331\025\206\312\255\205\263\325F\252\357%\336\254\364|S+{\202\223!\330\212\212\341P9\312V\255\244\237\272\217\347\254\260\371\036\177\312\332(\222i\332\007\370\237a]\253\016\376\271\234\204\334\2335u\233f\230I\001\311\256\242C\000c\374\010R\317\277\342\035\207}m\351%\224\013\210\327\354\261\365:v\023\376A\177\241Wv\301\273\344\323\341F\225p\327\231\220\342\200\312\242\245L\264\263\377\000\305D\201\337\267\362\327k\323\344\360\343\271\234\011\\\247P\322\0078\370aY\030\367|J\205\035/\274\347\201\025`\204\272\207Hu\237r\205\000@\307~F=\3065\262uuOo\013\237\373\253\257ouM:\265\321\27158u\033\316\301\270\332\277\244\005\027%\303\217\001\015JJ=\\\375\332\266<}\366!$\377\000\204\235v\335\013\355\266\235\316\032y|\276\367\217\207\267\354\271N\267\366Rfn\231\231\274\327u\233W\277SkV\334y-E`Ou\031\303iiEG\270\354\006G\266=9\372\353\351Q4\020\270\042\334*\355\003\342\031\372\254\262\314\306\344\323&!{HC\207<q\312H\355\246C{\250\015\357\331X+F\362M\306\266\012\244\252J\200\302\202\326\222@\366#\237mQ\315\302\023\230K\257\262\022\352\355\275]\254\261)\024:\233\320\037\015a\015\264\201\214\367\3562G\367\365\325\340\246\257I\033\237\302H\364\262\235~\304yt\272\273\216L\232\225\224\241C)>\275\217\034\375\270\034\366\301\321\367\016Ucm\212\042\323j\346\240u\034!R\344\042\253\341\241;\267=#v@\364\374G\364\3246FvW1\223\346\010\016/V\343\301[4\213\205QL\264\345 o\302\301\3750t\042=\025\313l\203\302\234{\252\275:aH\213!\326\031\222\264\340e\\\250\372\200q\374\2754F]R\031a\274\257\271\313\025h\353v\004\306\231`\362s\222H\373\347\373\343R#V\022\020\015\205\313K\267\231\2532!\270\032u@\205\015\352\356s\301\320\344\024p\215\035\001h\365\312+\264\272Xmr\031J\222\016\324'\320~\237S\2514T\201\213\034\244\354\327\353jy\357\011\310\256$\023\303\240\345#\372g\003\327S\205\014\2602\253\315V\301\241\\\027O\355\232\303\252~\240\202\022\222\2228\372\361\317\364\357\240\276<\330EcZ\354\273\262n\042\331\2427ORe\314\2175E8\332P\000l{\021\353\376\232 \007\006\225^\005*\331wt\212\326\255\311\220\2656\313I\004\222\274l\317\037Q\301\374\265\022\302\011\262\025\031\030?\207\010&\207\360\375m\227x\221\035\226\3078\000\234\217\251#\357\372io\273\001\331\035\215\357v\246\025\321\253w\346\034(\232\342\302\007\012\360\301\011\375t\177\001\264\274\314yJ\362s\245v\351-\042\\\271>\031\344\224m\031\374\306;jv\213^0\201\312\200\237n\320)RW\006\233(\374\252;e\275\307>\271<k\302\020x^\017\015\300)kkt\337\253\024\031\223|\042\354\350\212W\223\310\225%#\320\017_n\377\000\367\322\032x$c\210\344-\231\232\017\231\2459iV\265v|9\020j\361\042F\250`\205\004\371\024\223\333\260\365\377\000\246\230-\261\346\354\252\347\026\233\245\244?\002\037\0125\013\226\246\355\355Y\213\032\207a\301}\010UQ\370\355\272\272\213\300\344\307\214\227\001\012P\354\245\221\265\000\343\223\306\270\177\265\235~\035\024e\256\313\317\003\272\351\272\017L|\356\2401\213+k\256\013\205\321\026%\255M\203\340\322\243\266\226\231\016\254\000\323c\236\311\000\001\317\341\000}1\330~R\373G\327]\253\225\321\221VW\333z7Nd\015\334?d\022\344\232\225]I\245Z\261\232\215N\004\267.{\212\360\213\234y\266\016H\031\340\014i=,n#\302\3237k{\236/\371Z\0239\214\377\000$\306\335\330r\023Z\321\266\033\202\333\020\026\343\212\247\260\277\021\266\013\011i\015\223\370\225\267\272\234=\312\324\242}\361\333]N\2140\017\005\270h\\\376\252W;\316y=\376\275\022\227\251\320d\335\265\007^\232\354\3106tE\245o\264\310\0113\266\234\206\213\235\300Q\003w\270\372\035s\232\377\000\022y\034\341a\203\037\232\332\351\362\010X\000\313\317\351\356\253\337Z*\025\327\350s+\022\317\354\263\042/\313\300`\237\336x(\363)\315\247!;\224\006\007`\220\237mS]\270F7`\221\373':`i\220P\266\267\237\211Y\213i\364\332u\361\177\252\277R\204\227-\272\023\315\310\210\323\271S\265\032\222\224\003k<\022T\222w$\014\220\023\236\011\316\263zdT\343!\344q\361]'R\325\323<6\377\000\267\354\225?\022\227cVS\363*\012\224\331\226\2248\226\3268\334\362\306\022\022\0179\356\007?\352t\264sm\220\372\347\346T3Oq\202x\034\376H\202\301\201\042\027Izk>o\226ct\207\242\004\3579\361\267\204,\002}\022\243\334{i\371\364\341\2635\2038\375R\220\274\2727\023\316\357\334%\365\012\272\325F\254\330y~\0247\276j\022\361\2026-\245\245\314\343\220\011V\016=\011\365\326\214-!\245\307\201iI%\027\264\204G\326^\254\263l\364\352\205s\305au\272\273\212\226\354`B\267I\232\0361\243\220\202ACI;JP1\204\247=\310\000O\325\334\254ky \237\314\032\037\272b\030i\217\177\241\376-\0161M\223C\352m\032\233Cq\331\351\266i\216M\256L-\241L;=\306T\320F;\004\245J+\307 \250$eA':\004l$\267\375G\353\307\375@u\226\200\357\366?\2421\256u\022\374\257Z\260\2514\362\365\243I\220\261\015R\343\250\231\023\036\010\000\370{\362<L\225\200\265\227\034>o3i\010i\032\360k\237(\015f-#\367p\323j\267\241\252\225\331\324\032\3549\325\267\227\006\216\373p\341\301/\0257\004\270U\263\236w\274\242\322\234[\252%j)$\221\274\015j\211\274\331)gD\015\255\247\350\274\364\332\015=\\n\237\022]\316\252\\j=!\0175\342\006\346\251\004x\256'8\332\204\241\012\010\310\334P\254\341'\227\330\343\311XZ\326\356-\004\371n\312r|\042_q\021\324\213\332\314\226\2117\005a\332\243\265\352\304\364\251\012S\221\242\2444\217\031e9qn<^\330\200v%,:\263\264\020\225\273\323'hc\211\345g\365\330\034v\273\330\000\212\2767\257\312\363\375*\260%S\252\361\254\331Rz\223a0\324\237\011.\032s\013\256\261\343+j\270$\307L\276{\221\205ppu\320\364\327\202ZZ\271\215t&69\243\221\375\205u\352W\042h/\320\355\333q\312\244;b\233Mu.!\245lu\365(9\260\025+\261[\236\032A#\325\\mo\011\324`.\004\236\351A\000\240{\240;z\310\234\305\302\3046\220f^-\301\371)3^Y-S\332\312\014\243\031\254\347\204\004\241!X[\204\262\026R\207\226\024\323\346\016\031\343\352\224>\307\231Eu\337\250\002\002\244[V\343\254S\204XO8\266\2251h\017\370d$x\257\017\304\013\212\360P\220\223\342-J\3008 kt\330|\273\217u\2353\\\015\367U\226\315\353\005B\354g\252u+\321\332C\024\263\032=6\034\331.\374\243Q~J;\255)\245%\221\226\021\342\313|\006\320J\322#\244)D\245JN\227\335v9\273\005\216\365\356\177\240\223}\360\263\233\252\324\231V\335\360\314\026_\274\247\332\362*+\226\324\231\255\006$V\025\224\005:\364O\021N%\2742\323\212C\205)CI!\303\271.\006\273\015\034\326\300q\373\217\237t\264\354\334\322\017%X(\375A\370y\353\323\226\254~\264\322%G\351|\032\264\033j\250US\230\305 \246sF#\245\244\307\302\211C*i_2\244\251.\270\363\214\022\323\017\341\030\272\330\345\215\2440\3319\030\027\214\376\377\000,\036E\252i\342,\300\372\377\000\212A\256\252\320c\364\373\366=\253m[=\011\221K\220\345\022\235o.\324X]\340\343\015\245\327\237D\310\255\260\3451\227V\352\226>_\021\201\220\\\301\016\267\241\301\021\361-\326\340}\370\374\273\376\351\331\033\376\275\325er\274\374j\3052\256\325\335&uI\260\313/\311a\323-\204\004\214\200\363\313B\226\361\012Jp\341\003 \034\234 \021\322\306\001\024Vl\220\227e=hWT\371J\247U\353\010J)\362[q\200\353n\357\334\353hN\340\205\020\022\245\2448\224\344c-\255 \347o\036|`]r\263L'!^\177\207\232eVm\025\352\245f\260\314\252l\306\217\314Sb\023\211\355\345M\370+I8R\2226\250\020G\012\030\007\261\346\372\251\027\264\014\216\377\000\312\230n\367!k\202\326\271,\373\225\250v\2547\036\267c\324\021>3\210B\012\332|\002\224\214\2370A\030\012\0038\362\257\260:\004S\0072\337\317\011\271\015\242ZM\322\352i\365\032\3746\245\227\251n\251\311\221T\274\370\255\220\240\244\021\376\022\012\210#\261\003\2169SV\336\023Z\033\335K*\276\042*\024i\324{\211\371\360\343-\326\334m\324\270\247\022V\332<L\244\201\334,\3418#\266\377\000nG;\324\242i;\206\027i\323\313\200\015\012\246\\\327\3335\273n\0351.\251e1W=\200\264\245.\026U\267-\3478V\012\270\030\377\000\020\366\3271\324\235\272\003\\\220\272>\235\037\371\003\236\202g\\\361\232\246<\313\241\031Sn\241e\003pP\012\004n\037t'\217\247ms\262\352\251\265\335o\305\010$\332aYsZb[\016\312\330\354t\276\226\226\010\312\224\225\022\332\371\306;s\365#\266\203\246\237c\203\217di\031`\265<\337\247\265\015\351\013\246S`\270\242\2579iX\022\032P\306\354+\004\254\177\022\007)#\214\215lk4\355swF\026<38\272\211\245\352\246n\273\006\237\012\366\267Xr\251E\210\242\252\224d\235\257Fo<Hm@d\004\366P\3060A\354\011\031-\323\030\374\315D\226p\363\261\305U\376\274\326\350q\256(\027\325\255O\217[\242KHu\370\012k\344*V\374\223\311\360\037JK3\042\270IRI\303\215\022B\312\222A\031\275jv\006on\177\205\255\322X\3606;\262\207\260\232\262\353\016\042\253o\307r\333\253\312H\022\036m>\000w?\373\250d\355P\317\361 \375v\347\\7\210\015\230\360O\311n\2708\000\035\224\351U\315\327\213\031\326\023-\333q\026$\202\220$\274\373\365\210\322\223\376\022\333\255\370-\253\267\225i\317?])>\257Q\017\230d|\323\272]6\236bl\321\364\341Y\353\007\2515\266\330lAul6\244\017,&\304T\221\354\224\202\023\217Lp1\300\322\343\252\275\306\232\020\247\320F\303\346?5m:]W\270*5X\322\353\015\315\245S\016B\026\354u=\265^\212_$\244\023\2371\034w\000\367\326\227N\212}\341\356\024\337\237\362\261u\376\030\036C\225\244V\005A\252R\330\360\232G\216\266\360|g\013\311\224\237\3616\347\372\0168\355\257\245\350\331\261\200\014\205\303\353X\034\247o\353~\344\272\336\245]\035(\3524\036\234]Q2\205\323jt\324\310\244\326>\217)\260\231\021\334\036\216\266\2621\335\012\032\320\215\332j\251\231c\325\246\234?B\017\300\374\326n\311\343\260\303\363\310Y\015\361\207t.\207_fw]\372\013\324\016\201\365H\225|\205\325@\251&\251h^\340c\011\222\264\245\037.\376;9\264\253<,(r>\247\366SP\337\017d\023x\214\377\000\365p\363\267\373\0375\363\257\264\021\222wI\036\303\3522\017\307\030?\025\237H\277\372Es\324\010\255\266\364J\222N\035qMyA\377\000+\240\015w,\324\216\027%\260r\345\303\376\370\233R\240d\331\025\346\246\323\317%\010\363+\036\331\317\323\327\235\034I\377\000\354\202I\275\255E\264\237\211%\322\335nEr<\344\003\200VS\302>\375\377\000\274k\305\300\341]\204\014Z\236k\257\266\324iB\342f\257\021H$\253as\327\277<{c\376\272\260p\340\252\270\017\\)\310\037\022\025\033\315\325\267N\212\211P\261\215\310#\220?^;\376\247\353\2535\254(D:\350p\276\245\322\251\027P\371\332\305-)i'r\367\263\234\343\234g\376\372\222v\376\024O\010\237\304\227\363\272M\323;\336\244\210\320\230\207\016k$\024\253\305\312\270\036\243\323\323\355\251\022\021\222\252\350\301\002\323\362\332\351T\253m\210\355\246\273\021\350y\000!*QH\007\330\237\267\323\034\352\302p\015\020\256\347b\207\374F3)\221)n7\275\306\220\225\016T\221\234c\324\214\201\355\372j\034\355\307\012\214\033\0205}\210N:\247\325[/,\216\304c\003\035\200\037\331\325\273U/n\334R^]\237)O\314\226\325d\0429\005HJ\302\212\261\311\036_~\017''P\322E\253\027\213\244\242\022\215\2578\011T\207\252Cy*}M\223\264\023\335 \177_\266\254c\277\212\363\\\016Qt\332\2447i\355TX\205Pg#\204\362r1\337\267\333\323W.=\225\260\322\242\250WU\257-\307MR4\207\235\003\310\216\330\366%>\276\232\030i\356Q7\212\260\243+\024*\364\327\227*\203N\205\362\212V\011[\301\0019\355\201\237\365\324\226\264\012^k\2343V\270\017H\257\312\253\013\226\355B-?\033\2746\333!Y\373\3629\373\352\204\000\024\226\236R\226\257m_\226\243\317-\372|\272\342\001\363\255\007'\035\277\016O\367\235Si\354\241\2476xP\010\256T\036\313\202\224\373J'\314\225E\334\240~\247\035\373j,wRI\274\005\376\203\324+\331\270\262\245M~\004F\220\275\250\303i\033\223\365\347\236>\272\000\231m4\226\223\264\247\357Cm\356\230\335\327u\263#\251\025\336\243V.IO\206\351\266}\265\013.W\034*\033[vR\336Bc\266pw\021\346\301'<\035c\365-K\332\013\233_\237e\253\016\225\222\226\356r\375\032\274\365>\320\242PbD\267\250\266\355\310\3241\036$X*mLQ\231\333\313,%\264\245\260}\324\220J\216IZ\206\277*}\271\373E,\223\030t\316\267\236Ou\366\377\000\263=)\214\210\031\0054v\367\\\256\320\356\026)\361\035\231S\215\0263\243\307\231.b\013\317\272\265\017+L\243p\034w*9\347\034k\210=2x\230\327=\334\344\223\315\372\005\322\307\256\205\356pk}\200\034\001\352~(\362\230\335\315Of\013nD/:\022\023\005\202\342T\2670\006\036x\200\002q\236\337|cO\207\317\013C*\335\333\373)\027\010d%\327\216\377\000\3612\340R\352\224\332t\204\2739\212\305\3230\005Ju[\212a\267\234\354H\035\2223\237L\223\316\265\340\322H\310\274\316\335#\271'\201\354\007\326V\\\363\306\3518\246\016\007\362\224w\202\030\246\323\344\376\323\226\344ka\207\025!\307\337PO\314\253>g\012}\177\010\003>\336\303:P4\304\302\327\232\214z\367\367Z\014\036#\200`\267\237N\336\3134.^\256R:\251\324\027\255j\014\305\325nY0\336\250=\035\225o\024\252#\004!\260\243\331\005\327\027\311<\250\220\022\010\316q\306\265\263\310d\344\221\177\001t\027O\367\007ic\027\200\015|O$\376JB\255\012\231\322zM\022\025f\\h3cSg\\\0255\305 |\232J\177\022\374\300\244!\265%\264\203\312\224\260\007|\350m\033Ho4,\244\355\323\002\352\301 g\323\327\373Y\005)\231\375]\275$u\012\366mt\233F\032\337\233\012;\255\020\020\322O\220\354<\251J\302U\346\306p?\010\343T\321i\300>#\315\177\013WS5\273\303n@Vj\276\332bt\036\304\360P\3555\357\015\365\266\323\256\356Tt8\361t$\237}\2708\354\012\217~\345\235Lm\005\244`\375\037\372\224\202Cn\371\252\323n4\250Siq\042\250\370\376\024\207\306Gg\033%x\343\260)\307\323]\016\217NLU\354\221\225\376u\341\327\010\322n\332\357A\255\2527\206\3748\225\026\220\226\274\035\311_\213,<J\222xQ\033\321\214\360\012\001\364\326K\264\237\376C\034\336By\222\003\033\232\356\012?UZU*\352\272\251nCZ\244\310\253/bP\362v\273 \250\247\225\214\205\340 d\214\344\253\032b\006\227n\367%y\343\315ew\025\042\205K\257\365\010\325i\362\352\024\212i\243\3331\244\015\311f\245,\224\207\233BRJ\234JC\257\022\220Tr\220\242\220\255\332\325\351pm\267\023\354>)\035K\354\322\377\000t\246\311\242[\320\350\224d31\371\263g\271%\351O)?4Y\207\034\207$,\347bV\343\3578\204r@%Gr\212J\224\366\255\340mc=\177o\372\200\033B\273\2552\264/\333g\244=\042\270/{\331\262SI\217\042\242\266\032\363.K\313\031b3+P\003\305un\260\3223\370S\271G<\247[\032yA\214\270\363K\003Q\003\2370\003\217\3410>\026\351\323:wj\326\356{\271\227\231\276\257\253\242\237n0\033%)/Hkr\231kh%-\266\034\3178<\2668:\210\234!\246wq\257\257\325S\250Hdy#\210\305\376\252\356^6\315\205\324\204\324)\377\000\262\241\\\221\251u\007\023Ll\266\220\334J\264$\241\014\311\360\201 \370+\334\246\301\312w\262\205\221\345\032\350\364E\256\343\200\177e\312j\343p\332$\030\357\371\243\266\353M\333\261\037\235Xm\311\367\025'\303\252\307y\327\001Y[\215\355`\250(\344\250$\002\002\363\264\025\036\374k|<8c\216\026xgn\313\316\304\233R\221*\374\272\341\272c.\0231\351m\270\352\226\024\336\360\207$g\320\355Q\345Y\345M\367\312p\2321\355s\200*\363\266\200h\344\252\233\324\031\261\352\245\353\236\333\247Tj\033\322\333t\247\374\037\011o\255M\025!\325\207\000J\024\226\\p6\024\001\360\274WT\022\207w+\255\320\272\274\256Yz\201\232*\242\334\025\027a\267Qy\321&e5\226\220\230M8\265l\003\015\277\3439\223\271iJ\036ae<oT\306\001\033\316\016\364b\315wII\031\274*\335\177U\034\224\365F\240\365\177\366Z\344\245O>\343kC\356\265\347\336\030R\324\234\275 m\017<\240<\026Ca%!E\015\353gN6\267\204\032\365\345'-\327\242[\227B.\250\264\267\236\224\303R\042Ee\327\334\016-i\217+\004\245Eo+\303S\345d)H\005n#!%\001\264\251\252{^\335\211\230\341;\270M\311\367\375\351:\205A\265\357{\342\341\273M\005\245R\240N\235T/\310m\010f:\320\246\260R\222\265\307\014\006\324\352V\222\024\351!D\360\254a\240\333{\242\277L[\232\302\257\027g\304\015&\331(]9qb\317QSB;\015\026\003N\014!\315\330H\333\274)\315\330\004n$`d\015lF\342yI\020\3336\271\350\277\021\226\305\300\213j4\032\315N4\211N:\231- \250\306fR\367\006T\300\344(\251\246\331PY\011\011Z\324\326?vIv#\352\221\236\020\354\205\247\177\016?\020.\333V\223\222c\325\347\263@rI\247\267Ta\224H\215O}\001J`\370g$\357O\011p\360\346\340\000\302I\010\365\035\013d+\035\316\332p\025\256\277+\224\212\234\273~\352\245\326\251\017K\252\303L\310/DV\030\226V\026\2052Z9)Jx8\316H)\036\234`1\225m#\214#\356.\030\365P\177\264\302.\353\256\212\333\305\232\254\270\251fKiQ!E-e\013O\035\366/\036\271\307\257:\004\361\377\000\213\177\242wL\372x\013\030~*L\250\364\353\246\212&6\247\337\214\352X}\247\012W\035\3058\323{2;\253\312\265n\343\004\016\330\327#\326\245\250\234\337U\364\016\233\026\363w\205\237\222\256\032\213\027U\224\304\205\370\321\230\245\241\001\307\011\000\225`\253\216\331\302\3203\377\000\313\356~}\255\325\274\000\027_\247\3234\276\312gW\226\343\223%S\330K\201IBpNyP\000+\037M\305_\327YZ\231r@\013b8\023\246\302\251\304\254\305\250\371\000J\274V\322W\237#\241y\007\355\270\177>5\020N\036-\016fm*\355\320\351P\257Kb\042d\007\342J\033w\006\216\322\207@\317\004\347ny\031\377\000\256\272\255\023\203\333\225\314\353O\206\364\027>\376\273m\250U\326\350\364\372cU(\351\222\313q\237\312\312\224\316\011mJp\025(\355\356\242\016\340yN\010#7Q\254\332K@\3415\037Ok\200u\362\250\275\325z\324fPf\335\264:M\016\215Q\247\357\226\3755\335\302\024\250\331\312\322\234\005)\011Nw\014\344\266r9I'\\gV\230\363^U\321\351\243\000\0129P6\325s\244\225\367\042U\340\365\032OB\256\251\016\021\020\261Pbm\042\244\341\354\012U\225\306^U\202rS\330\366<r\2571\023{\266\237\310\332\326\215\317\034\266\302\260\221]\353\015\253$\265.\357\224\334u\240\021%\0142\230\362[\301 \207\320<7\007>\244\360t\224\332MP$\2111\372&b\232\023\370\230\254gKnz\343\262\240\212\334\230\265Jz\325\346y\250\354\341\257c\316\300\261\371\214\372\021\253\350\341\221\271y\265]k\030\346\333E\177*\365\332\021\256\252@5\332-N\015F\236N\367$E+(R\017\253\214\254\250\240\214\363\205\021\353\306\272\246H\360\335\314\\\344\241\207\312\345o-[\206eJ\223\341\265>E-\355\241JJ\007\210\303\252\307|s\203\354\244\363\350w\0025\321t\335q\225\205\204\355p\375~k\023Q\010k\262,&e\036uv\\f\224\271\354\025(\355C\311PSo\216\337\210p\025\367\003\3525p&?\354\017\355\363@{X\016\002Wuw\252\367oM\255\353\251\273\2622o\213\015,\005\325mj\325\213>[S\042\024\220\247#J\212O\210\236\304\255->[\376$\244\020Ge\320\372i{\201i\243\330\207\001\372.G\254\352\330\326\223V>\013\362\315\361\225\177|%\245\363q\374.\325o\212P}\302*\2665\327G\230\302\3409\334\252\233=M\006\337\216;xn)/'\217!\035\276\226u\032\230\243\251\200$w\030\277\313\327\326\260\276G\324>\355\274\210\015_\372\237\341S\216\233|G\333T\227\237j\246\335f\215\037\031>\024\177\037\362N\336\337\337mN\223\256\260\232v\022\261\323\001M\001\361i\323\230\314\275\031\312\265R_\212\010%p\024\342\332\007\323\012\307\277\277\032}\335R\000l\271xI\3305\0111\326n\237U&\274)\325F\244\207\024v\007\022\022\244\202}S\214\003\364\007\276\257\037Q\215\337\205\326\226x\267'\025\265\325;\236\326[\017\332\250\233R\216\242\012\203^`\023\236\303\031:\323\213UB\212\206HG\002\302\274\366\257^\251\265\253u,\324\347\307\243K)\033\204\227\002T\245\037d\221\372i\340\340s\312`\271\244\331P\226\345V\336\247K\235p~\3232\344\222Hp:\220\243\236x\301\344h\205\326\027\232\005Z\233\243uvMvC\321 \315\360_\012\000\017\023\3143\330\234\361\372\373{\352\300\212U\015\263\204\340\242\\\222j\360\314z\222d8\363chR\227\237\023\003\277\367\215\\W*\356\217\025h\032\273pI\246Ju\342\334w\223\236\337\341\030\364\347\036\237\323:\222A\013\316\2176\275\255Yq\352/;PuU4\272\341\347\305\374\000\014z\014\017O_\365\325\233 \252T\221\2641\335\027\326.;B\237\015\301P\216\324\345\347\313\373\224\251D\377\000\224~~\237\256\274x\253R\302i/\034\277cV)\313\247\323b\255\246\216wme8\037ld\017\364\324\320\354\255V\275!Rm\231\360]nlH\353\232\011YX\030W~9\037\177_\345\2528vV$p\207\325\022S\262\032\211\376\360\374\214\006\262\023\035j\034\014\372c\223\351\337?LjF,\220\254\001\342\324\225N\257>\211Nq(?0\327\001K.\025\225~X:\202\001^\042\205\0245J\273\255\231\214\227\252\017\370\252Nw!\305\004\343\352O\266\240\272\321\243p\001G\271pt\335N\270\246\346\270\220O!\225\215\240\343\356u\036n\312i\207\222\250\225\2236\203Z\271\235\215[E\311M\267\032W)\2450\205I)\365\360\213\312KG\351\273\216?=c1\356$\206\362\2647\000@\355\372\255C\370{\370\222\350\327F\351\202oO\372\021Z\246]\015!Q\336\270\356*\273\023\252\313I\034\206\222\323ij*U\333\010Wn\344\363\236?\255\375\230\326u\006\230\235\250\360\333\350\033\373\347\371]wJ\353\372]+\203\274\022\342;\222?\352\322\376\216\365\256\377\000\273m\206nY=>\245\312\257\316J\235\267\350\306W\206\352\330\031\335P\252\310RS\362\260\021\300\004\371\334\354\204\222A\327\3135\277e4\3756Z\022\330\034\235\277\267$\225\364]\037Z\373\320\334Y\267\320]\223\360\300W\012\303\246I4\212}\357\324J\224\033\306x\013q\247\343\304Tv]s<\210\254(\235\254'\360\245J%J\306\342u\363>\245;b\234\352\236\322\031\376\240\345\307\334\214\001\354\2728\303\244g\201\021\243\337\320~}\312=\247T\027S\361\356Y\254\242\233M\306\031`\002\247$\036xH\377\000/}\337\204}N\247D\357\020}\362Q^\201\007R\003*\006\033\365P\025\013\266\253&\034\266\250r%\322\343\221\377\000\021),\245A\244\177\205\260\241\346p\373\237\317:\366\253_'\206\\\316\374\377\000C\335[M\245`\177\237>\201g\007\305\335\327uT\250\221\355\032\031\231N\205%\315\323\036m\342dL\307\001+y^\270\004\223\220\000\372k\205\352\356\237P\032\300\010i\347\335w\337g!\206\020\351\\m\300c\320~IU\360\361N\266\272Wi^2\355+lu\013\2545\331\014\266\312\026\350\375\234\303\215\360\333r\\N\034,\264V\247]\330r\242\020\214\205,m\352:?O\212\0359\333\227\037\353\277\260Y]sQ&\242v\231M0{g\362\367< \236\250P*\267\035\333\027\244\346\347z\354\253-\224\324\356\312\271\000\011/\245iR#\266\200HCI)R\266\202B@Jrv\235\014i\217\211\260\237\212\206N\004^%W4=\007\257\360\251\345\301:\203]\275\236\263\230\\SCb\261\036\221-D\250\245\345#\367\256!JO\230\250\204\371\200\347\234g^k\267\020\321\305\322\274\215\332>\273\243\373\302L\312\345\207\026C\217\245NI\254Jw`AAd\026\367\204/\370B\222\201\273jI\302V\234\351\371tN,l\337\037\257\222N9\010v\320\251u\006\370j]\343D\227N\220fEf\250\034JT<\257!+\014\224\014\177\007\231J#\324\375\261\256\213B<\241\211r\343~T\311\021\366^\024P\363\203\304\247\325\030\212\336\3222\264\027\233)%@\366\333\277\277l\035e\271\236s\355i\226\274\206\3225\\jzz\223sC\232\332_\246SG\355(\240\360TP\303\233\202\201\035\224\343\315\250\347\333J\350\350\007\007r\337\3519+I \372\362\270\355\246\3513\202\252\365*\244\007#\304t\310\011x\247\302ok+uN\254\236\001\005\264\237\240m$\200\002p\354.-\001\367\307\364\226p\363\020\207\3721\325Z5\315\325U\311So;J\220\226!2\352\220Aj\016R\353\256\204\347\202\240\224\245?\304N\357p5\263\241cdv}\226~\252B\032HN.\267\365\262\225\325\333\326\235A\267[K\366U\032z\332\205\035\267w3W\250\265\202\374\245/8q\015/dvS\215\273\222\265\223\311N\237y`u7\201\374 i\330vy\271Z\271K\273\355\304\273H\274n\227&\314\244\330\337=s.\0240<E\312\371O\335\354Z\210JJ\224\245\371\261\307\206=\006N|\323\356\227\305'\014\264\223t\236_\011\277\357C\362\006\323c\341\221\352\352\272eZ\272+\352\227\016L\333\202UnK(_\222\003j\214\302\326\3122\001\3300\342pFTJ\324\255\271\300\350~\3144xf\371$\376\253\037\355\037\232lz\001\373\247\027R\272\201h\331&\263~\\\257\241\207Y\206\345UT\246\331.9!l\206\327\341\200\022V\262\332\266\2176\020\225\244)\\\355I\353\34346\205\31622\360\000\341\025tZ\313\256\323zYH\246U\353MI\274j\225\006n\012\304x\255\370i\2212[\352\230\344e\251\315\333P\002\023\037$\035\255\241K\011\036\\\231\245\255\042\206\022R\310^\362\363\217\252\012\246\374e\365\265\213r\361\250\305\216\307\377\000\332\3648\363Y^\306\220\035\255N\360]K\241(Z\200LD\226\233t\270\242\221\262\033\215nP\337\263\240\351p\343q\344\376\310b\042X\001X\307\326O\213\012%9\205\321\230\232\365Jz^lK\221\343+\367\262JV\363\230t\200\245\255\015\264\373M\000\220\013\257\241\355\277\272B\025\321\306\375\271CsY[{\225\231w\227\305U\3452\2515\326>J#\316\254-ja>\012c\2448\034m\206RwxL\241[N\336T\242\204\025)X%L\377\000\362E\242\222N\206\362\243)?\022U\212u1\350,\2676\022\214Y\021Zq\271{\274\024<\303Q\324TH\312\210e\017\014\2371T\251\012\316\347J\264\031\036\016B\264O{xDw\237\305\265F\267F\272\333\242\323\304DNW\200\227\347\355[\251G\210\026\225\272\222H\361\322\240\242\222\222\002\003\200\014\354\031\244s4&\2653\022-\270T\276\353\352m\307U\250;[\223qT\214\345\270\267K\255/\303\302\211%Dm\307\031$\343\334\237}\012Mk\201\266\024\211`\345\313\332\305\352M\305\026\261\015q\352&XmaM\246B\312U\224\250\254%*\030#\314\245\037^\372cG\324\336]\267\237\335\011\361\201\220V\217|:\365\356\251:\252\305\274\373\023 JK*ba\216\372\202#$\254\245\005\314~!\265dv\306<\270\031\033\272\010'\334\335\244ecO\030q\275\267\374-\243\247_5i\326e\012\335\251\317\225\036r\022\204@\234\364t\006\226\204\311JP\220\370P\375\343N\270\323h%$\024\271\205(\2364\274\232v\370\207\365J4\032\317\011\245A\273\352u\012\225\006\257U\371U\310\201%T\371\352H\332J\306\002\220\342\263\270\255;\2109\301\300\307t\235fjt\276R\007t\306\226B\035\\\322\307\236\275\\\206\343\272.\232+\362T\203\026W\213\275J)<8\342\024\242\236\375\301\037\220\327\311\272\374\245\3171\335/\255\364h\032\306\207\034\340*\227\324\307dS\257\232E?\010\360D\004\241\245\244cpQ\030$g\214a#=\216\006\270~\2619\016\014\013\245\3224;\314\255Z(\255H\250\323\326Ys\367\211iNnG#$n\034w\035\375\263\337\353\252\230\354\202\264\243\016\354\211h0\3152\253_I@\204\362d8\314\224s\267p\3636\352G\037\215\004\037^A:\024@o%RL\213r\271\0354\231.]\247\035\370\022\267MJ\020\\SK\317\230\023\317\034\020FA\317\032\333\320\314[\335`\365\010F\357dOs\321\342\335Q\3219\246\234\217-\0176\353\353G\227.%%\030q$\021\264\240\355\3349\306\334\3604\035u\312\334r\207\244q\210\373*^\357K\245Z\275H\254\320\213NI\244\316t\315\212\0203\340!c\314\222\010#g\007\036\231\312O\246\271\256\243\241q7\310]&\226`[c\0113|\374;]\226\373\025I\375\035\201\036C\014\356zm\034\305\336\342\321\301/E8\363\355\035\321\220\240\000#r{b\353zY\015\377\000\020\374\226\306\223Z\333\363\360\226V\015n\365\252IE-w-\315\005\245\022\025\015/\2242\350\355\265L(\226\234\031\344z\214zz\363-t\333\313\011\307\247o\222\3341\300[`-\007\350\3556\241n%\257\231\217\\\212\223\2052b\301\362+\267\360\245~\036~\236\271\326\266\233GM\243\217\311fju\0158m\020\264\237\244\325\210\216\275\027\346#\325\250\223\324\002\226ZaM\207{wh\376\022}pq\364\326\266\211\262\264\323\305\217\222\346\265\215my~\2775wh\024\253zhfm8G\207U\300J\313I\330\211\177\377\000#<\000\257\250\327W\246lRd\264\265\301s3O#NM\267\366]\222\350\362-\227\235\253\321L\350\321\325\222\374E\201\260\236\347\031\300#\327j\260Fx$j\332\215\003\331\376X\263\354\252\315S\037\345z<\241u:\214\321\205mTn\025[\325\011\243|h\017\312\014\256N;\251\204\250\371\310\372\003\307\337E\322NO\232\210\366\244\246\257H\037\300\277u\216?\355f\350\017P\250\326Uc\251\323\272\007\321\216\273t\314$=*\265J\266\\\240]\326\203\177\373\257=\001E\211\214g\377\000\312\344U\001\221\274\2439?Y\350\035F)\032\031d\037K\266\237\205\367\366_+\373G\240\222\367\000\010\370d/\313\013TK~\253\042T\212;\342\023K\345\010q\003x\007\321D\036\374\367\032\325wNk\256\260\270\302\366\360\323\204\256\254\330\365\010\323\035R\221\342\305\317\225I\037\213\277\267\035\277\261\254\231\272S\301\245x\244ot\042,\232\267\214%B\371\260\264\220RrG\351\316\225=:PF\333\265g<pS\242\306\276\272\277o)\270\021\322&\305\007\011m\366\260O\247'\375~\272\350t2\352\233\345x\261\352\202\\xa\277e`Sx\334\025h[nKQ\372d\265~\007\021\347l\2369VG\363\032\330l\246\262\206\330\301\347\005\024P/\213\346\305\202\251\006\326j\255OQ*\011\012 (\177?O\247\365\321[\250{B\031qi\006\221\265?\342\042R\267;\037\247u6\345\001\302\032w\361\036\374\344\001\375=4\324z\320\005wF\022\222n\260\271\377\000\375a\\\224z\240\211T\351\374\272}5]\335\361\212\317>\252H\340\377\000=@\352Y\2475{\305}_\242\232\273z\372\342[\215]\244T%\303\216\263\274\241\250\373\226\257a\203\222\177Q\242\313\255\333\221\302\013\245q\000\216S;\246\375~\242\334\360A\233Wu\231}\202\245$\265\237l\247\323\327\373\032gO\252k\305\204v\270\217)L9\027|j\357\217Ny\322\264\253\310\247\222\200\022\007\337?\351\246I\264P/\205;K\255\331\366\204\006\232\223v\303J\335;C\005c\314~\303\202y\372\352Z\352V\004\014\204k\006\361\2407\031\305G\021f#\031\005\035\307\353\337\276\256\036\027\2342\204+t\012]\315L\250\246\201Vr\2051\300\177z\204\202\244\237\251$\377\000?M]\304\326\020\314c\266\022n\035R\342\263)\356\321*\365\357\333L\253(K\252Q@\357\216\011\376\232\240\220\251\000\264Q_\024\252e\016{\017\242\245.\\t\270w\255Jx(\034\367\003\266\007\327:\250m\242\003\214\246\3652\223\323\232|\010\321b\276\313\250J|\305E9\335\355\333\260\340j\342\321w\023\370R\322\265\026\235*dI\224\013\232\215\005\265\200]iX!9\377\000(\316\017}%tp\265\034\333hqN\216\221t\332\365\255\335\264\332}\221NE\353QY\016\224R\240\374\313\210\000\376-\244y\006x\334\256\007\345\220\226\256h\3307\314C[\337)\275.\231\356?\343\026V\324t\007\340\316\366\240U%\365\033\256\227\224\370\366\2621-\273T\324\211nL\234\344J\250\024\020\227\224\201\302\020\341ZS\350\221\306\276O\366\257\355^\231\221\221\246\252\356\357E\337t~\231;\334<A\237OU})\256\300\272a*\244\343+\217k\262@\216\343\331\304\255\247\031\000\362P1\351\301\355\366\370{5\015\327Jep\362\014\331\357_\302\357d\214\351\377\000\306\323\346=\207o\315,z\201\324\226ZmM\302\015\242\022\024\226S\265\031q\365\223\204\244\004\373\343\204\017\317Y}K\255\002\375\214\027\331i\350:f7Hr\210aRf\305\265#\311\270\200\245\255IS\202\020\333\271\234\216K\276\353\307\360\202\0028\3479\307E\244\323\226i\256qG\232\357\371\254\311\037\272Z\217?\312\313.\261\305\272\272\367{J\266:w\016\246\232<\177\334;-\204\355\217\005\005X\311t\215\245J\301$\214\237\303\201\200\016\270\255Xv\246C\260SG\247e\364n\234c\320B\014\307\314sG\272\042\203L\211\320\312\023]>\3514QX\276D'\020\335FC?\271\214\362\202\274Y\362J\274\250Ci*\360\333\311 \202\265n\326\226\236O\015\205\254\372\367+\027S)\324\311\367\215A\305\360;\3724\177%Uxw\215&\326\351/Qo\013\011\306*rdT\205\026-v{\200\271Py\264o\223=[|\301\244\356\036\033GiV\306\370\0119)\007\203\036\366w<\3749)\347@\343?\3710Z.\207\277\001 `Z\355\322\344\322.\012\244\367\351\326\255\255\007\366\234\347\236ZK\225z\244\244\250\266\3018\363+j\213\253#\2762\242\022\016\2654\2617\236\003y>\347\352\322z\207\022v\372\225\235\335Y\370\216\250\322z{\325\273\342\022\223M\251U\2316\345\262\331IR\332B\236\001\371\230\356V\002\026\022\006\000\011Orx\323\321\275\262DX\334n?\316O\262\317\236]\226\343\333\367B\275)\205\042\324WK-\345\271-\211h\243\252[\350t\341bS\213\361\226\027\236T\244\245JI\372\235?\034\300\314CEa-\033v\264+\263x6\315;\250\016\275\237\021\005)X)\340)@\002\234\217\345\366\326,s\003;\232\026\314\254;\003\273\251\033\362\264\304\033\306\320\232\344\262\205U\213\214\275\265`\255\340\363j@*\030\343\367\211O\323\000\350\032\210\036%\016o\007\371W\216v\355\247*\235P\275S@\351\237P)3\347\252*ZS\320\347\024\340\256Lp\002\313iW\240Z\200I\355\224\344c\031\032\364\016t\221\010\307<!\315 a.Q\226m^\004J\\\253\226\005C\303}NE-\243$l\011g\304\334\024}\001J8\372\017mt\000\230\217\305!\273u\270\256\033\027\250\360\255\351\266\035g\305v%\031\252\234\272jR\260T\215\200\204!C\271\333\271\375\370 \367$\344\250\2356\334\006\270|\020\014\270[\035.\376MZ\343\274)\224z\234\007)\025\212Ct\354\247%)y\246w\204\204\3478R\311A$\372{s\242;J\326\265\355\037\354\274\327\320k\375\026\251\331S\345D\351\224\270lNj5ZCm\026\302\022w-\322\275\256,'\035\3628\035\362F1\200u\245\366m\377\000\344->\253\230\352\334\202>\275\020wVk\024Z\265\217W\265j*JjUf\346>\370[\315\007X\204\333\201Ek\011W\225'\303qa\031\312\224\246\2203\261j\035\270\217\315a`i\315d\360\230\366/R\213\225\012\022+\225\367\351\311\217j\2315\026\036+DV\035J\032\361\224V\224\214\226\231fZHH#{\231\034'\000\373k>\351B\303[HXu\361\321\361/X\274\337\272c\324\330}\265B\213P\223_\224\342\003)\242Ai\363&\0259\034\000\344\227\225!\246\327\335Y\014\266\001\332\346\272m\003Z\033\221\361W\225\215h5\331b\003\365\212\325Z\331\250\324#&Zj\323\024\343\222\037}eii\260\336R\304\\\015\305\011K~\023\217\250\200\245\245Y$\004\245N\356.\030\356\225\021\2223\312\256\027D\307(\323\344Cv[\216\255\265\024\270V1\273o\012\347\276\001\030\374\261\307m$\363X\364Bt\030\244\027.\374C-%iu\320\224\250`\205aG\354\007\247\323\365\325\016\241.\366R\342]\376\303\221\200~Ce\011V\356W\306q\334\216~\272\241\324\012\265@\335\306\255F=u\263).\177\304$\266\242N0=\360?\256\207\367\233F\020\213\265!@\270\025\022{R|d$\205\003\200\177\207\333\217\246\233\323\35268\024\244\261\222i]ZT\207\352\260\254~\247Y\365\007$V(U8\222\247\306C\276\023\223c\265!\016\255\245\024\214\250--m;\202\200V\325\020\254\015t\3627\306ke\214\344\024\243\300\005i\007\302\217\304\025\353\327z?Q#\337p\350\001q\253\312\244\262\300J\304X\021Lv\233C(C\212V\306\316\366\337Y\316\003\313R\307\011\306\247E\250t\244\227r\011A\324\302\326\202qe_\373\311\273\257\247\364\313\177\252\322\353W\025N\015\310\265\376\333\247K\246\220\272|\260\0002\024\362\011\016\000\022\034\336\236\034*W\034\353FH\211%\204q\302\310\323=\244\373\234W\327\352\263\007\343&\257P\203\324n\254E\247\017\226\220\252\264\230\3158\303\241~R\220B\201\004\216yQ\000\361\273\030\327\347\337\265\232\203\026\242@9\354\276\327\320\343\335\003\017\260\371\244\245Rs\325\352\305\042eC\016\316f\013-/\315\223\224\204\225\0223\306x$c\036\272\342u\322\357\000\273\361\000\272xakp\334+\345\001\206d\320\343J\214\352>m\2101\334\036\343\357\356>\276\230\323D\223\025\204\313[\264\335\253mF\263h\035K\264Yef\025&\355B\020\270\362\211\301\310\004)\013?\304\234\366\317o|\035?\245{%f\327r\2625o|O\334\015\265\007\321S]\351e\310\375\271\\\214\212uQ\0012U\033\360\227\221\270~\371\241\370\\iX\374i\312r0Nr4\031\313\2437\350\240\026\3140\236\364\333\204G\271\241\302n\013NRjh\336\332\216\000 \244\237(\365\301\033JO)\334\010\343F|\207n\366\216R\314\212\301\007\262\015\352\324\030\255?o\\\264\330I\220\322$\2524\205\244\244\277\004\367\030\031\005\\\356\007\007\362#Y\372\271m\213OB\3325v\271\343\316\212$Q\344\317\224\3442\244\217\226\226\322\202w+9\003\304\376\200\375\275\010\326/\337\3104\356\026\216\312\024\024/R\376\030\355\276\241;&\351\244\227\250W\272\025\342\271\042(KLLQ\034)\346\322<\253=\212\306rpH\347v\213\252\350\361\316\320\366s\331N\233\250:'m<z!\2736\217\324n\237T \323\245\314\210\235\300)1\352(\361\031\224\001\301\307\230}F\344\234\217\\k6\035<\220\276\211N\3154R\202G\350\257\375\201w\\$\307J-HT\346\325\204\272i5\302\330\007\276\364\304\220\235\252\364\341'?S\235tQ\352\373\225\314\352\264`\362\177Eo\355\333\272\344\200\304rh\357\334\303nT\227!%\267\010\377\000\343\273\012\034z\037\313Z\272~\240H\240-s\332\235\033l\201\204\342\201\\\211rC\360\352V\355b\212\332Ama(\336\337\324-\012\344\017\317\037\323ZL\324\007\012\341$t\245\235\301I^\264\3741t\343\250\375\035\255t\336\271\002\253S\351\341.O4\352{?7\042\236\357\343/\303\216\352_RV\016T\022\300B\262N88\323\272I\365Q?\304\204\202}\377\000\264\216\263M\247\231\236\024\300\217\202\305i]\023\370\331\370}\243\334\227\317\301\017\305\225\365\325\316\203\323\367\242\251\022\336\253\252{\366\350\307\231\252\245\273'\346\033\216v\360p\330\317\250\036\237D\321k!\324\320\325E\341\277\334w\365\016\357\363_6\352\032\015N\225\307\356\363ni\367\310\374\263\372,\231\277*\216\337\267D\373\242\360]-\313\205\325\225Jr\025\026\035!\222\257U|\264V\231e'\350\0205\320\2065\242\273.cw\210\355\3179B\313r\326T\027\232\214\343\316\271\203\222Z\001_p=F\177\226\275\271\212\224\346\233nR\241\327e\302y\311\360i\377\000;\015$\207<^1\317=\276\304~Z\021'\220\243\304\3347\014\243\373v\271O\273\370\246R\234EE\274gb\373\021\317o\323\237\257\032+\036\034(+0\346\200G5\213\332\277\036\003\024\007SK\215\224\341%h\0168q\352;\377\000!\2429\346\251L\233\234i\004\315\377\000\3246\251n\311D\324\312\211\306\3244\200\336\354g\351\237mU\333\271BsH6J\352\264.\353\265\346\204 \312a\357W+u\204,\347\377\000\226~\337\226\257\003\211\305+o\246\363\312w\304\241S+\022\340\267]\247\307\224\340H!H`\354\374\2118\347\355\3524\370\201\204\345z9\015\323\2026\256\364\246\225r6\314J\010\247C\030\316\036\001\033\216y\307\035\364it\340\266\221\314a\331bR+\246\225[b\254\34490\231y\340\255\336\030;\267\014p=\307\365\300\322,\323\274\002Z\207\020;\303]\224KX\272\255x\355G\247\324\255y\260$)!;\320\255\311R\261\216I\034g\333\237\256\234\206k\024U\247kZM\004#J\240[\367\015y\206\037\377\000yY\012;\233;\362\022\017\267\367\377\000MY\361\007:\357\205\021;\333\037\222\2601\355\033\236L\0314\333i\351m\304\216\235\241\327BAX\306|\200\223\3754v\270R;\343w\372\244=\335#\253\220\2344\3525X!A@\020\264\225\250\216\370\357\240\315+\311\246\240\360i,\357\327z\243-\232\023\222\305JK\210q%\322\323\205(\374\307\347\217\267\362\317\325\231p\233\323\263k\375\275\325\205\246\324f\275K\242\235\342+e\003\305J\243\247\333\266\342\001\326\244O%\266\245\302\211\367]\362\353o\027\326 \315\247Fa'n\034d\005(\347\361\037\276\212\037|\024?\016\260\251\315\247u\302\245\324\303\362.J\345}k^\3256\343e\341\337\266\3078$\340w\343\\\314R\265\246\355n\312Iu\201\365\373/\322\247\373;\372\262\313\322\251\366bo\2132\221QSBp\263,\250\306\245Q\224\244\244\220\252\324\366Y\371xM\001\311\216\321\335\300\336\264\005\020x\357\265\232}\340\270\366\356N\007\300rJ\354\272\014\216mX\003\341\237\371\371\366[\\\325\036\237^\212+\267\242\314\332b\000q\021\027\345\216\341\034\203\341\237\306\007<\234\217o}|S\253i4\367\272o0\037/\222\372\026\236y\000\333\026\011\371\374\377\000\244\246\277\372\206\212\362\227I\243\311}\270-\220\332\221\014\204n\307\001\033\361\204\214p\002}\306\270\216\245\324\304\303\301\217\003\321t:\016\236b\363\270g\337\372\376\321\007J\354t\323%\267t]&\017\355\226\223\230\214\203\271\232\023D~<\253\361\311P#*\376\020p;\353W\241\364\306F\375\362\2170\340z_\362R\235[\250x\203\303\214y{\236\356?\300\035\227e\365A\250\337\251\221\036\263%\353F\304G\2202\225\177\305TP\017*Y\376\004\023\331=\325\353\255\275V\225\372\223RyX>g\343\350\227\322jD\007s<\317\365\354\022\012\370\272-{\017\366OO\3556\342Q\244IJ\322\333,#.0\330N\\p\216\352u@\014\254\347h\340s\333#[0o\377\000\217\006\007\177a\365\317\242\322\323\304\371A\324\314o\371*\220u\012\326\275\372\2652\261fQ\235r\302\261\013'\366\325M\031\361\231\246\244eiK\247\2258\342\260\011=\362\224\200\022\222\016&\252W\313\3766\015\254\034\375{\256\227K\341\351\300\225\336iN\000\367\365\374\225^\2559g1P\243\364\352-5\324t\236\320\215&\241:4u\000\305=\220\257\021_0\274a\311\222^,\205\025eJ*\031\300\003\003\201\301\362\000G\221\236\234\017\375L\352[\2623G\316\343\223\334\377\000\300\226\377\000\026\253z\215\323\251)\2508i\3568\247_\236\275\205;\234 )\300\224\236NV\003i\365\332\221\357\253\365mAh\330\336\007)=\014!\344\273\267o\331c_O\354J\217Yz\237\012\255r\306Q\263\350\310i\306\230x\345\244\200\2544\326;rw-G\267\007[}\032\042<\307\200?\363\373Yz\306\356~\321\300G\366\364\207./\211f\337c\376=\244On\013-\225\204\241\010\011*\010H\377\0001\363+\350\002u\247\323\335o\334}R2e\366U\366\352<P\373\354KB\267JK\201.-#\205w\004\017\247\007\362\375u\203+6jI\034\022\265Z\373\216\275\022\206E!\231\364\273\212\371zS\356V\342\312S\320\211J\217\206\324B\032m\010\007\214ll\270\025\352TO:ny\003\252A\333*\220Gd\252\211\325\250\010\237U\254S\220\362\333b\242\320\222\241\222@\361\006B\217\242\271\037\246t\367K\322\354'ot\206\255\333\215)\332\215(Z\275%i\246^\021\352b\023O\251\265\362Q\224%$\254\372yJ\200\031\372}\233\324\260o\276\010Th\332\304\252b\234\252\244\025\321X*K(Yz.\337\340J\260\234\376c\222}\207\320kB8\356\257\262]\316\260\255g@\272\335Zb\261M\247V\252OI~\231\042+\252y\012\307\214\202xsp\354\255\273\333'\323\312}N\231, \337ex\335`\205\372K\264\272\201N\257X\324\213\246=ER!\246\216\343\261\320\312\206\344\225>V\274\234\216B\222\022>\334\023\223\227\272<\001\272\225\205\325\201\360\310\035\312w\330\266T:\275\026\342\277\202\030rT\207Cp\031\036\022\302\024\244\244\2412\034tm\217\025\266[\017<\371\005A\262\260\322T\247\032K\235\364m\026/\353\376\372{\2562W\321\307eT\372\354\252\267I)=R\254\261tU\244LER=\032\226U\224:\334y\221P\374\262\201\335\033\226\333\253QQP\033\3203\300V\232t\015!\256hNh\274\356\242\277$\275R\370\212\352WTmK\373\246\027Rhj\254\321.`\212}@\311\332f\260e;\342GKA?\274u\006#\356\027\211\312\204\225\222\256\033J\237\202W\030\350\214\377\000\324\254\357p.e\360q\375)\276\253\\\326\237CzeC\242\325\346\306\250_s\340\245\366Zt\025$0\357\231D\000\255\251h8\205+\031W\210S\214\004\251y4\223\2661E7#\003#\036\245fE\177\252F\247&C\352y\311\016\255eJPVrs\352\177?\346u\223.\267r\317t\200s\312\012v\270\374\345\002\205(\216\344g\003\037\227\037\353\240x\233\216P\237&pr\276\233}\365\004\222\024q\370FO\007\276u`W\267\233\312\364]Em`eH@\344\000s\223\356uP\360\241\347\272\370\375\265%J\012\361]h\003\220\001?\337\266\244?8C\221\305\306\312gX\335o\275\272{Pju\012P\224\327\340v2\323\345}<\371O\327\330\372\036t\376\227\251I\016ZP&\001\374\014\255\332\370\005\274b\310\274:\271\006\213\005Uj=B\215E\270i\254FJ\026\262fA\222\341J\226\274\245$!\226\222\346y\375\320NRy\035\327L\231\262n#\214\037\230X\032\322Z6\037o\326\326\347t\232\342\244\334}\015\261m\012\375V\277:\232\343O\226\347\267\005\006\242\324u\243\301AB\320B\037mK\360\333SjIZT\204\253\236\343WT\303\270\271\274\322\303/-\313yY\003\361So\301\246\365\357\251\264\007\314&\244G\250\22764\337\206\331\377\000\207A\013@\031\003r@V3\216}\265\371\313\355\201\007\\\373_\241~\314\272\364Q\237`\252-9\245.\2535\304+\303uJXm'\270\034\0003\357\217\345\257\237\352,\335.\221\204\003j\376\330\023\335\225\016\234\245)@\030\214\241@\361\200\0060}\275F\266 \036A\360\010/w6\237\266\362\352\364\245\245\332Z\331iiV\364\242Z\224\032w\314<\205C\360\022\011H_!'\004\214k[E\241\267nY:\315`#m&}\371\326\252\005\261*\334\261z\347e\032\267Lj\210C\364j\277\315\204\313\247\274\244\355p\306\220\200Lw\222A\005HQJ\366\341hq9\032\331\235\261\3066\311\301YZx%\221\333\340u8}d%U\377\000z\334=\025\2465&\244\226\372\261\323\012\233\333\355\313\276\202\031S\321\026\023\221\022\253N*\303\022\023\350\373+\010t\034\204#\030NWP\213\356\314\260<\275\210ZZ)D\347\3146\270r?\257_\335\037\332}F\264\272\263k\2452W\035\011\232\337\207%\363\373\265\305\232\006Q\275\007\012J\311\001IX\031\316Rs\216p\011\217S\030{l-\230\343tG\325\011\333\225Z\202\342\312\247H\250\333\365\312\042\362\227ZC\215\251I\302\210+\012\004\244\340\340\0209\007#\351\256kQ\247x$]\205\243\271\244Z9\265\376\042(\026\015b=\263q?\362\014-\0000\341\033\333q\254\360P\341\005+G\035\211\030\311\034k6>\271&\225\333H%\251\227t\217\031\273\233\312\264\257\325\272ey\333\314\376\331v\002\250\022\226\032L\247\322\247\240n=\222\267\200>\002\217a\277\007<%Z\350\331\324\231;<\341b>\031cv\012_V~\036h\264f\230\252\323\355\264\334\024&\227\3434\206Iq\306G\370\332Sk\005h\307\252I>\343\335Izd\177\2123I\226uW\023\264\343\362\376\027m7\251\321:[>\0151-\334\024\226\036\307\200\225TgIa\320{)(u*JG\271\012\030<iw\353\035\247vM|\310\375\221\177\370\347j\032@\027\\\360\025\265\260\272\323T\225\0423\265J\254\266)\216\343\301pr\332\217l)X8\364\344v\365\306\265t\235\\\356\033\235\205\203?Kh\033@\262\025\343\264.\026d\010\223\3428\036\015\343z\026\275\373\016;\245c\267s\316\272\350\265n\024[\225\316O\242i\260\354*)\376\320\337\204\316\253\365\326\014^\255\3746Uj\364\276\272\302d\266\212\205\016\246\250\025y\254\036\361\236\317\226[$q\265K\333\214\202\332\363\256\353\242}\244\210\267\300\224\320\375\027\007\327~\317\312|\361a\336\267G\372_\221n\270\364[\342R\315\276jT~\261\364\366\357\263n48W!\022\351\237,\227\026\177\214\006\220\226\206{\371\022\224\363\330v\327],\022J-\206\301\364+\347sC4rT\255 \373\377\000a,(v\265\371O\253ov\231$\304\333\235\245\265\005)_\237'\323\373:\246\223K3\0158a\007}\234&\273o\037\226~=Y\217\330\251\003\0128\332\007a\223\375\372k`\221TU\032(\022\220\2257\353\326\235Y\352\205\2439\000\270\254\205%\\\016Oq\254\215I\221\206\343\356\217\005\026\320\345C.\353\272f\272\272\205r[\213\251\216J\322\3363\364\300\373\366\322'Y'\342r0\037\354\254?Kz\201%2\342\301\275\352\033\231'%\267YQ\312s\334\221\306;v\3061\256\207C=\200^\201#(\345_\3736\320\262\356\346\334\231J\213\026Tp\220K\214\250%)\317\327p\343\271\340kr2\320U]\020vG(f\257\323\212;\223\245\267M\272#@\225\311KkV\354\340v\341G\030\376y\321]\037\242\243bh8C\326\237N/\026\253/I\2443\026l\265\000\200\270\357`\253\007\374\370\306\250\330\217tFFA\307\0122\375\351}\307O\222\362\352\025\211\224\313\205k*;\234QJ\375\262F9?N4\037?\001V]=\033=\327\255\227e\3352_Dj\344\312#\351H\005Jq\305\022\244\343\234\202>\334z\344i\210n\362\255\024v-\312\327\322\272{Gr\0232\225O\202\206\330l\222\350o\012Q\377\000\372{q\246\017\2421\2147\216\020Z\352tx\313\250S\2502\224\211\312'r\222\216\017\272R{\014s\337?MA\206\306\0246z\341(\336\262\256\246$\312\252\324P\314\334\356)\005{\\\373s\217|\373v\325|<\252\270\027q\205[..\253]6\222\324\232\375\257]}\224\222\204!\240\245\224'<\004\257\261\377\000\311\373fj'||\265\0269\032l\036~\260\2207\277\304\033\2174Z\243Qn\2702\277\300\264\250\204\363\356\237_\177^5\223\251\352G\375AFh\263\224\214s\251=_}e\350(\271\033\216\2570\010\216\220\221\366\334r~\347I\267Y1\342\325\237\003o\314\264\016\231\360\334j\225\250\214\252\023\361\340\225\000\351\2166)c\374\204\347\007\216\011\316\017\241\355\255\207h\363\271m=\201\242\273\255\354\370s\262\272U\360\373E\243P]\252Si\021f\252<\270\3756\262W!\345\327\345`\026\334\270\252`%\331a*\302\204E-\246\002\207-\021\220x\337\264\2756i\333p4\015\277\354\343@z\320]wE\324\305\035\022v\217l\222\265j\276\252\325j\234\310\255\256J&:\220\247b\205%-F$gj\266\360H\366\034q\257\316\277h\264\217q\331\272\376\013\351\375.f\266\235\266\220\223\261\242\364\322\237\032\244\3252Ez\376\227\373\252%8\215\305\265\221\200\341l\366<\360\017?mr2D:x\005\243t\356\374#\323\334\377\000\013~7\035]\231\016\330[\370\217\257\262xR\042\213\036\331\244\261qT\037\251\\n~\372R\322\257\021rf,\345a\003\370\225\236\000\354\002s\300\306\273\015\004CE\247o\214nC\317\377\000\354W;\252\231\332\211\211\214S{{\016\312\252u{\342J\015:\343\240\364\376\306\202\216\243\365\306\260\265G\240\3331dyb2\203\211\025I\316\247\210\360#\015\305o/\033\325\345@Q\355\355GU\016\246E\227\236\336\203\271>\303\367\302\320\323t\335\2542\317\345\214r{\237F\217R~@%-6\327\246\364\332\241t]W%rWSz\225Qp5*\245\341)\224\006\267\017\016\014\006TO\205\034\021\222N\\qG*\307\011N\033\335\034{\203rO\177_\350-7H\375F\321\370X8\036\236\347\324\376\211a\326\273\251\353r\313\252P_\255E\240?\263\347\353\222cyL$\343\367l\267\337\314\200F3\335J\316\011\306\262\246\216I\034,\323\007+W\246\206\265\333\352\335\300\371\362V}t\256\232\375\371\010W\253Q\246Pz)\032k\025&)\241+\361\256\311-H\335\021\235\213#\305\016H\332B\225\303\212\012Q\312RT\033\322=\246;\3543^\265\305\2465\300\356\042\363\301>\203\271\377\000\211\177\361\243r\324nI\316S%3\036S\361\320\026\363ee\306\322\351\03189\301\011$\371\273\034g\032\313l\246m@eY\011\210\264\215d\027\352\252/NYf\215\322\272\305\303M,\324\344K\230\244x\250I\330\363\201;[i*\354P\201\342,\201\333p\365:\352\274S\024\000f\311X^\005\270\244WN\376z\233\325j\005e\324)\266\0210\310\033\217'\312\243\236\337\211J\301>\230\307\323Oh\245-hs\2222\305O\031VB\225\324\246/k\323\250\035-\251\315DI\221\352\015V\2428N\024\370/\266\247YO<\214\204\234w\332U\334iI\042\004\027z\037\375Vl\236b\302\273\357\013\205t\272\275\315k\314\222\226\224\364U\251\011W\012S{pT\221\355\205l?o\256\256\37175\340\243\376\022\250\337SnyV|k\032\342S+\252)\311\262`\272\0178a\262\223\264\375J\027\224\366\3065\255\322\244\334\033\273\232\375\212\314\325\235\224yM\233\212\\J\2447`\251\305!\207i\315!\0319\312\024\235\273\207\330\200\177\357\243NG\210AW<$c\225eShr\343A#\367\261\276]\225\372\200|\275\377\000\274~\272/\336\010\254\241\033\254(\352[\265\033}N\374\232\335\213)l!\016\355;T\336Z\333\221\334g\261\036\234\037\315\377\000\023\262\016\322\026\330\377\000\263\257\255\314^V\325C\244\265\372\232\223rA\312\343\205\217+\361]\360\312\027\225w\001\302\340 \222\000P\034\353W\244\277\374\241\337T\263:\215\354$\374V\310\364\267\251\324\333*\306\217wuF$\210\364\013N\270\2512\323Yy\042%:;q>l\324\036\016\037\015\036@\227\022\247\012\234[\200+\003\015\245\277\2431\226<\275\302\341&e\274\264\237uE\376+\276!\242\335\264\272=\347\042\320ER\253Q\240A\270\234\240SYu\310T\264\256\232\246\343.b\312\202\233\360\304\304\274\244\000T\352\224\200\275\252\362\247Z=(\331C\265\362\257\245\334\3026\257\314'P\350\021\254\217\212y\357\324i\322M\275[\246\033\232\032\\YVKl:\334\325dq\273\307bA \023\216\006I\004i\026\273k\252\261D\255#\000t\326F\016\1770\262\376\355\273\356\016\240\327g\334\325\231\322e\314\230\341\177+^|&\325\222\226\207\262P\222\224\201\350\000\326+\236^w,\311\345/6x\376\024l:K\256\250\251@\201\221\352x\372h\215\215g\220{\042\370\024\306\330\033\210\003'\214\367?m4\310\202\036\362\005\322#\\x\270ohIH\344\361\351\367\321v\217Dg\274\341y;E\203$2P\262\321);\202\307\361}1\375\363\372{\302k\206\020\334E\361Ar\377\000\272\312\312\324[*By\030\007\237\317U\360=\025\030\342O\242\3614vXw\225\0003\330\362G\333\376\237]O\204\006\025$\222\235k_\377\000\331\341\032\261M\260\372\345T\2012\243K\203R\211\002\327\216\374d\376\371\266\333\017-kh\224\250\015\233\011R\216\000J\226\006On\327\354\314?\343s\275x\374\277\365d\365\001f\234\277@?\014\325U\326m\213;\246\027+\360hV\344yo\270\353>\042\033/\314Z\313\201\264,'{I[kS\201M\022\215\351B\262\255\345\263\275\252'.\002\312\306\2304;\034*{\361\343g\213s\257\362\245|\334i\306e\275\001ju\016\356T\205\241\242\301Z\322@Sk!\240\245$\217\305\222\016\010\327\347\257\267\260\355\326x\203\375\202\373\177\330\271I\320\266\373XT]\330ND\270c\273\346W\213\373\305\220\177\210\214\036=5\363\331\031\346\277U\327\234+w\323\031\214\023N\202\352\221\341\270\302R\200G<\347\360\237pF5\267\000\0332\223\231\306\351[Zj\343\242\231=\207W!\227\030\212\227\274F\230\361K_\303\274\240rF}=pu\321\364\367\000\302\034\260\365m;\201\010j\233X\264\272\263h\210u%G\221&:\022\375F\002\034\013\371r\025\264T\030mXPl\360\227\022\000Zp\202S\245\246f\366m\007\0013\247i\211\373\275\177UN\357\273\332\360\370N\274\305\275\177t\335\353\377\000\241\267\011XK\224\365#\300q\012\301\335\340\254\204\265%;\267e\245\204\257\203\260\357\343\226\325\365Gi\016\331\233l+z\010D\371\214\323\275}\023\177\2455n\237U%?7\245\027Ty\364\347\371z\225PR\030\232\332{\204)\265\036H\356\016\024\223\267\223\355\227\007T\323\345\332s\217~\337\222\321\233M#1 \372\366L\332\225\243P\265.\37178\215\036U\021\360\343\315KB[bC\3168J\324\303\314\017*\226\222p\016\323\270c\355\254\355C\234d\361Z>\276\010\321\312\335\233P\325\036\015>\2732\242,$[\027LO\231.\326-\244MLiQ\037<\227\342\262\347\225*W\233s\177\272\335\267\205+\322t\354l\2158\277Qu\362R\371\034\332\364O+\020P(\217&U\032\273V\351\225T\345+i\375\321B\201\341Hw\004\241@\343\234\360~\243Q\340\2663l5\354\253<\316~\036-]k\016\241\042\022P\322SN\210\\N\364\026\325\341\303\226}\316\300[Ny\344$\177\323KL\366\273\016\301X\332\250\361\214\376\351\242\252E\275\324\010\025\013~\347\240~\315\2541\207<)\354\371\342\022|\257!`\341\310\3528\036*\025\200p\016\322\000;P\351\004\215\332\374\205\230e|.\017a\372\367\367K\223\323+\307\2475\246\025hT\236\241\225,\251\310R\332\371\330\222\0169\012eX\013A\377\000\022p\254c\2163\254}WI~\235\333\340u\003\330\344|\277\352\325\217\251G\250mL\333\257\310\253\201\322\033\212\033J\216\267\3421A}^W\223\025\325\275\023\177\251l+\012lg\272\025\310\355\223\215n\364\235|@\334\236S\372.{\251\351\335\264\326}=U\231~L\252k\206\265GuO\300PI[*B^e'\335\262\000RA\356A*\036\330\355\255\371\303Y\347\037\242\346bc\2366;\224\227\370\201\274\323^\261&\300\257M\256\302\265\314u\246Pz\305j\345\2444\225\002?\342\020\235\222\230\031\347{K\343\333\333\256\3733\252c\334\000\240\357rZ\177,\321\\\307\\\3219\215$~u\225\371\205\352\257Ml\012mN\240\272\005\321N\021|u\006\236\204\333\310o\000\236\020\323\356-\304$\360v\251J#\214\2365\365h\343=\305|W\315gc{\225_+\035\012\375\271\021\017\311\272[\231\031G\312\257\227\311\037^\343\215Vm8v\012\257\201C\22437\341\232\231@m\207>yS|O\302\255\205\011o\323\234\375\306\2024m8\034\252\2153\275Pt\217\206\207\232\235\032\250\343\353\222\321Z9\007)H\335\374\316\224\227\2464\233r4Q\220\177\022gu\007\242\226}\016\335\247\313\202\312bU\036o;\224\262\026\245s\334\036>\236\372c\356\2007\001^j\007qJ\012=\303_\263\355\232\243-\2372r\031\361\221\275(Q\355\204q\234g\327\201\245\332\347\263\214)f\322\302O+\222=F\005\343\011\021j_\265\221Wq \027\330o\345\322\017\260\035\361\364\364\321\2331\223\007\224\243\343h\037\361<\272M\323K\232\234\362M\006\351\223\042F\354\237\025\345\2506O\324\347\236\335\273kN\030\334\301\3466\210\310\354\333\023v\347\215\3268\223\027*\241:\322\253xcr\225!AX\343\201\225s\355\307\3764K=\202\263\374K\261J\277_\266\017[\353\204U-\352\343\220\244\2558\333\022@N\337p\000\373\351\031a\230\235\314\301^\330w\007\036\021GK/\377\000\210~\224>\334[\242\005Z\344\246\254\004\345m\370\216\023\364\364\034{\350\260\317 ;e\026\212\326\271\243![\2327Z-\011\2559S\271\250f\333sis\022\012\020\241\217R9\343\362\373\351\360\361V\275\201\227p\202*\235V\351\375f\243\373F\035\340\202\024\254\370JHZ\017~3\330\016=\265-8Q\3433$\250\313\231\373r\256aHz%\261P\206\276\371w\315\217\3768\317\333^\225\270\317\013\3156l\241y6oJ\335\232\323F\332\244\251\012HS\216\255%)\306;\020F@\372\343\323Ct,v)\020\012\310_.\312\351\255\025j\201\012\314\207.:;8\203\345W\377\000\0377n5\037wg\242\363\3659\341:)\221\252\350\\W\005F#1\236\001h\317\225y=\276\271\355\214}=\2647s\205\274\326\356\027\330-|\370-\351R\331\204\347P%B\240\007\331;\005vf\327\035\017\0220\304dd\206\300\316V\2627\251@$`g\0373\373m\324Z\0420\337\345\375\372\256\277\354\356\212\336$!hiT*\006#5\377\000\023V)S\315\266\361%\302Ow\226\016HN\177\320\015|\033^'\026\360\334\366_H\210\007\320v\002\010\222\374\016\233\265T\277\353\323ER\350\222Kh\227-)\042\020#\312\333i\377\000\027\320\016?]s{\033\323\332u2\235\322\277\271\376?\245\260D\232\307\010#mF\336\303\367+9\272\301\327\356\257\365*\354{\246\035\022\244\324'\3362\320\244J\250\015\357;\001\225~%\345)\375\312N\177\010\000\237U\021\306\2718\365\372\255~\243\301\323d\367>\237\322\354a\351Zm\024\042}UW`\233\335\030\350\303\277\016\326]\314\335N\244\272\205\353S\015\256\346\270\252R\274Y\363\220<\311\216\235\304\374\2446\311\362\266HR\325\225\224\243\011\032\357\364\3751\272=1i6{\223\311\376\202\344\265\272\303\253\2348\014\177\250\354?\262RJ\340\353\374g\345J\223b*\214\3448o\3545\312\211A\203\011x9[m\356\337%\334\022\020\332\006\011\363(\204\215e\351#t\326\346\376\037U\250t\033\032\004\227g\267\327\036\352\254\310\371.\2532\252\355e\351\325.\210R\346\255\371\223\247\243\301]\3439\012\317\206\312A)(\337\222\343\271)BRR\222J\367\004\265\323\301\247g\026\017\027\337\376z\255H!\224\273e\323\310\317\377\000\324\177\336\027\025C\253t8\224\367\372\273T\225N\213D\210\227#\333y\332\206\\uI\360\225!\241\214\006\233NZmC\277!#\000\223\231\253\327\026\303\377\000\367w\363\375& \320\333\366\017\302\336~\277u\230\375I\256=\326\232\204\252tj\235U\372\034\231Im\340\312J\0279j\347\303\336Fpx%#\323\271\344\351\376\215\246\246\363h\272\371\035\221\3317\253&\336\201gS\351\026\332\342\033&\210\307\354\330\2428\005\271O'\211/!C\2727\004\266\010\316HQ\317mm\3110.\334\177\017\003\371X\241\241\270\013?\340\\F\253\326\026+mH[tf\376b\034d\203\265/<S\225`\021\310HF2?\213\377\000\216\232\007t{\217%g\312\034\0361\217\335\013\3345\012\355\275\324\252?R \270#\314\023\333px\212 ))V\026\225\001\335*\003\007\357\364\3214l\025\270\367IO\273xx<+O\326z\273\365\271\264k\272\230\207>JT\004I\214\022\256\031p\251%m(z\344d\021\356\237\256\221\000\264\226\036\007\011\331e.\242\025z\277\250\255\325\351\311)K\242\230\366\327\222\024\222K\013\031\332\254w\365(>\343\035\3605\251\247\0063\354R\223\015\334\243\252\215,?k\305[E,\272\226P\364g7r\022\240\024S\237\241\355\351\366\321\2466\342B\276\321\260\341.\223j&}\242\271\010Im\370\313RU\267$\224\250g\037l\361\253H\312\000\366Ucl\020\207\335\360\337i>.T\373\254\245\2571\357\214\247\277\344\017\330\351\275\300\233\366A#\325X\217\205:\312:]\327\216\207\337\227\035j\261Heu\232|Fa\306k2+l8\372\030\360\325\270\204\263\010)\304\255\311+\316B62\207V\245)\255n\227(l\215s\215v\370\366\371$u\3618\304k\321~\237>(W\376\356\252\233G\273.\313.\231k\265\377\000\367arLT\312e\252\212\337v+\325yq\210Zd\374\232XaM%\316\034rBc\261\271\325%\007\351\235>L\356\034\256\016@\323\031#\353\320,\266\353\004\212U\2331\352\\\377\000\026\307\215wTY\206!\032\201\251V\002_KoL\233R\234\242\205<\373\252D8ku\001-\207\021'\303\332\323EOu1\371\232\033\177\024\213\\A$\217\257\351a\217\305m5\373\273\247\026\345\345d5Z\253\334\026=n\251O\2538\222\036\216\335.Z\\*R\0249S/\255r\035R\224J\325\342\253\200\021\306V\273Km\016h\3412u$\262\231\313M\254\265\205n\266\330\360\331R\303[F\012\277\020\034w\367\366\326[t\367\233H9\364\332\365S\251\245\006\002?|\332\322r\017\220\347\333\237M\033\301\240\206\011?\002\274\346\272\264\035\316\204\204\203\263\000v\032\211\034G\012\354e\234\205\302\212\213\351Z[\016\355\374\371\037o\357\364\320<R0\232\360\352\202\355L\307\202\234N\027\217Q\365\032\273\036\340\345I\340\260\275WQu\244\014\251\307\0228\340c\362\316\210\351\220\006\224r\243$U\244\274\343,\262\333\317>\243\261\015\241%JqG\320\001\334\235F\362\347m\003\225Y\032#n\357E\277\035%\201\037\241\035'\351\337C\327.Ln\240:\032\272+/\241[X\216\271hm\246\242\004\272\002\025\226\313\256\024\356\375\340*)\302\223\260}GE\000\202&\305\334\014\374O+\230\230\027\331\342\312\330n\215\334\224\367\254\353\032ti\366\334\250\316\273\035\017\304K\013ZcKJT\241\3416\260\024\333\205Ea\306\260\006\024T0\244\244\350\332\214\203\\\254\341\021.\245D>-n\232\235c\256\327\202\213\342\\\025\267\020\241\207\010}\014\000\302N\320H\340\344\347#oq\300\327\347\337\266\223;\357\305\235\200\037\365}\313\354\244!\272\026\355\302\254\363_D\212\204\211\250i\246\033d(\204'8\012\333\330g>\277\366\327\024\370\303\215\256\224;\262bt\022\366\243u*7\354:l\225\321\257\330.\250\307\201'\005\325\371\216\342\310\004x\31189Jr\244\234\022\234\034\351\316\211\260\222\333\317\241\376\022:\307yw\016\313B-\364J\225\011\311\364\364Fz\346K\016\007\351\317!IZJpIKg\225\243 \020\256\305*#\320\353\250\322\351\015\360\261u\022\222(*]Lv}\263r=}t\262}f\217\035\251\257\273:\320\250\310.\263Mp\257l\230\212B\202\212\030Y;\207\240\013\012B\277\205<\316\262\007\261\333\3408\364?\250]\026\234\334t\376\352\341\322.;'\2516\364\233\002\257\011\3506\274\304\370\324\205U\020\227WF\177'lw\224\000\012\332r\011\030\004\020S\370\260\023\325mx\330\341\203\352\230ln`\335\365\361U\222\277\320\233^\205^\225B\270m\330v\305}\214\0257K\253\035\251'\220\264%\306N\022x \202Gmr\032\276\215\010}\271\264~+j\036\245#\233mv\023F\331\256;\323\272<\272=Z\360\253\326,\305\241\003\302\257UXS\221\210<)\211JJ3\216\006\305e<v\003\265\340-\210\020\015\217\256\352\200\027)\313\233\245\224^\240D\213\\\271\027\034A*C\224\233\252\223\021\307_`\216s\042;\030S g\361\0072;\205\014\340\353\036\223\034\261\357'\007\202?\240\2525O\211\305\243\344\207a\325\372\275\322'\343R\357k\261\373\206\325\224\024\212}^s\016M\207%=\323\377\000\027\260<\313\230\376\027\212\310'\324\034\353\002x\265\020y%;\231\330\325\343\342\264\017\2010\270\305;\270VZ\302\272k1!G\233\031\272\32562\374\355\273\017\303~3\200\347%.7\204\255=\377\000\204}G}.\307H\334\214~\311Y\340h\301\245u\354n\241>\344(t\372\274\221Q\246d\255\207<0\205\305V0KG\222\234\372\216\307\261\004q\255=?S\226#\315\205\207\250\3224\234+I\036\237C\276m\361G\\\211m\025\240|\233\355(o\216\261\330\244\373\0028\356\000\343\201\300\3554\017\217U\035\002\271\371\234\370\035\270\214\177\012!\233f\241\035\321\006s\357\312\270\233\011J\235h\030\356\312O`\243\261@\2070\006\0243\237\256t\201\323\27691\370\307\267)\223\250l\214\261\370QDk\277\254\026<|\332\324$uV\022\001/S\346Jj\005S\030\356\322\303im\342=AHQ\366'\235w\035\033W\243\230xS\217\010\373d|ir=KI<c|~q\356s\363U\267\251_\024\026m\335M\250\042X\257\364\033\251\320J\320\322d\317v\217Pix\347\301\235\030\256;\211Q\300(\222\323 \361\311$\035}7\245\364S\033C\201\017g\344G\310\344/\237u>\246\367\022\3074\264\375pVNu \316\352EU\333\216\374t\335\025F\225\2613d\300f4\205\363\311qq\333m.\237\363\250\025\037s\256\266\006\260a\202\202\346di?\215,\347\330\377\000\272\216\344;\206]\026.\360\245\2447\342\014w\356\177\276}u\352\267*\265\270\253\302=\207\322\272\235xELK\212\015R\230\220\236VV\332\206\007`9\037\226\214\346\330\310^o>\310\202\263H\267i\221!\306\250Ff\234\246\024\226\302\373\3569\340s\355\357\257\001\234/=\265\312\223\227b\042\346n)\230\212l\232H\011\332\247\210PW\377\000\024\217\177\277>\272\270\000\005W7w)\011\324\036\235C\201Tb\013V\342\234\217\235\251(\202v\244c\276S\234\017\323\323@\222\020r\256\034ZN9M\036\237\364O\246\0011\025S\244\267&J\323\222\350QB\202\217s\203\333\267\353\215Z8\003M\205\340\032NQ\355^\217K\263i\363)\366\344\011\2655mQh6\373D\360;z~\237_\266\212s\204@\343X\026\251\204\253W\255\327|\312\260n\237wS`x\230K\2363Gj\177\310{\347\037_\327P\032\356\0224\3562\024,\217\375s\263\3439\002\227J\233We\007\317\271\255\356\253\323\262\270A\376\376\232\033\203\261H\216t\200yB\227\263.\016\254I\251\304n\251Jn\237\024\221\275J@R\360{\3602s\222\177M\\\223\311\010\272wHM9q\365\022Z'\313[Sh\255T\333\310K\215\226\222\225(\016\333\267v\325\236\300FW\236\343t\200\242[UJ\367\020-\210p\340\001\377\000%\015%G\037\374\223\216>\272 \012\2422J\236\247ZL-\042\210\345:\\y\252\004\266\244x\204$\223\353\364\007\330\352\300vR#\377\000P\201.\016\207\365\025\272\216\367\356\266\231iG\014\264\323\005\262@\354\011$\222py\311\322R\351\234\343{\227\230KN\321\335X\353#\240ws\226\3543V\223J2\362yq*J\224\237BG:pDk\224w\306\006\012\200\245\374G\364\252\370\371j\213RhR\222\306\322)\365\007\\`\272x;N\3377\351\351\306\221\373\304r\267\310V\323&\332v\020\266{\341>\245\361\177\177\323\350I\257B\265\272i\323\221\260QQ\036\212\212y\205\030gh\247\323\302IS\212\316~i\323\236r\236N5\363\016\277\324\372d\0171\270o\224\346\271\257\211\364]\307I\322j\2347\017#?\177\212\322*\003\366\325\277C\250=D\236\375\307+\306Z'U\035{\346\027*Bx#\305\311\013RNA\003\204\020A\347\215|\227\355\037Qs\274\317\025\3508\371.\347G\247\042\231v\226\365\310\263.\211\321\033\371\025L\231\265J\375\353\252K4\366\317\370P9.\037RH\307\251\366\371\251\3227S.[g\275\360\007\260\365\365]tZ\243\004V\035^\230\311?>\022VT\352\275\305*\251iX\325\007zs\322Jg\232\340\256\322\300\204j\016\377\000\354\262\340\312\326\245`\215\300\251@d\347\266Y\032\303\2260\370p7\223\305\373\012G\020\010\300t\243\304\235\334\003\235\276\352\224\374Eubm~;\026\325\262\337\310X\361\227\340G\202\300\346R\317\224-\304\234\227\026\243\306VT}\362ru\225\253\353\022j\3150Tc\201\353\356\272^\233\323Y\247f\367e\347\223\374$\005\245\323\332u\350\375^u\373[\375\211\322\252\001\016\\w\042VvIx+\230pG>)\310\330\012\0227,\223\346\300Rz=\036\234xE\247\360\267\223\352}\275\207\011\035V\261\302O\361\213\221\334\017A\357\365\307\272\344~\341\253\374M\323\221|~\303o\244\377\000\010\2246\015:\331\245\245\357\370\213\225\015(\244)[p\220\306S\214\240\250\270\341X\012!*X\306|6~\3630\366\003\332\370F\323\274F<\010\215\270\2373\275\322v\265a\325\372\343Y\251W+\017\261F\351\255\272\362c6\303%)j2\322\200C`~\022\350F\017\263`\214d\221\244a\322\031\344\361\337\200\026\244\232\226@\301\247g\342?5Zj5\266.\016\245R\372ib\342\033\322\234T(\357\244\200(\3616\225\311\236\240{\0242\227\012J\273\255H\366:\334\322H\327\035\243\334~]\377\000?E\227\32474n*?\342J\372\266,\353q4H/\377\000\273\226\214\006\222\332\324\242K\245\200\002[B@\031R\325\307\224\014\250\234\3603\251s\304\263xl\011\031\034#\217{\316\025>\351}\032}\351uX\327Ct\227iT\264<U\0323\207\226\230\332w\025'\261%\031?\230\347\266\266\242\210\207Y\354\262_7\212\001\372\374\321\237Q\042\2632\263O\202\314u\275Mu\362\247T\223\302R\205\0176Gs\335 \217\256\236\323\300\016\017\011Y\371Nk\212\243\012\207e\333\261j\334R\234\230Ymx\316\337\027\262\210\355\264s\333\337\351\243M\247i\307\251F\335B\373 \332\202b\303\223C\2071\300a\312\304\035\313 \245/n%\263\223\350G\227?A\353\241\230\250\206\024\042le3'Z-3g\323\326\257\021\242\200YW9\003\031\000{\363\300\324\235=\000Q\300\246\322Zt\276\220\335f\241\\\266%\310e\267_B\213%\322BV\023\223\205\020\017\261\3543\354\017mD\2608\266\257(1sH\036u\001\212%\301\030 \242\244\320x\024\252K\003\303o\315\302\374\005gq\310\030\016q\333-\372hPJ\321\307\374\371){M\332f[6\224\252\257R\251W#\365'YL\011-LrR\320\247\234i\301!\012K\331\365 \244\220\017}\200\016\000\325\364\262\226\313\3428\326\177dY[\270m\370\205\372`\250\3346\027\305\017N\230\352\365\251E\271\256X\341\020(4\210\012\002\022\027RUI\264\246+\252*8R\2746\262\352J\324\224\274\343\236!\0008\257\254t\255{^\306\275\207\034\377\000k\346\362\302\370$0\311\361XU\361%\322\233\241\024\307\354\316\235U\323q,V*\016\327nd\304j\027\355\206\021\0059\223\015\214\245,S\302Q4\006\210J[\214\270\277\363T\247\334=\264.t\214\024y\371\254\266\266\211\260\253\317@\3524\373N\364\257Zw\365*\223pX5\010o\307\252\323*\220\034\221\021-\270\2045\363\362\036h\200\207\306\340\206\322\265wZ@\004\007T\206a\202\201a)95[]\271\201e\347\305?\303e\317\360\371{\272\365*c7'I\352\322e?k\326\343n1\346DK\353@mD\214\241\304\204\217\042\360\242\235\212 \022R0u\3327Fo\261W\026|\300\340\252\235\042\2475\254%E#\034\234\223\375\377\000-g\271\344*\2172\033\252\327$<\336\346R\033Wb\220x\037_\365\374\364\0079\027y\012\013\366\324\266\203jVH\354\236\3438\3257\025B\372\026T\233w4\206\260\247\020wg\260\357\2536B\024\031\361Et~\335\237(\2041\035\345\273\350\000\340\017\364\327\267\227\025S?\226\225\221\350\255:\227o]P.;\262\235\022\251Q\217\211\020a>O\206]\310).\244rP9R\223\352\224\221\351\255\256\227\033X\360\367\363\350\225\325>\333\263\271Z\277\321\252\373\375I\255\\\017]\313f\\\245\005?X\226\343\276+O6\343\312K@\343\312\240\337t\377\000\010m$\214\034\235w\332\031\313\301.X.\224\003\265j\357\303\265Z\314\200^\243Rc\300\243:\354\207)\363\032vW\214\210m\220\264\374\324u\253\016\022\200\023\270n9\374G9\3106\241\303m\335\000\201\021\016p\240O\354\251\247R\252\355\334]_\276\245\254\301~ \222\353P\2470\260C\254\202R\237\031\244\2001\265 x\210\030<\236G#\363\227\332-O\213\257\220\372/\270\364vxzf7\331V\332\215\320\3359\232\007\217\011\344\252\\\271\220\034q\012\334\204\251*\313/\037\362\250\355FG\034\203\333Y\021\2704\213\356\234t\204\233K\007f\302\246\337\337\3605fR\352\313O \262\225x\221\334\300P9#n\364\234`\203\223\215f\353\230\031/\224\3451\023\367`\255\030\351\307S:\252\325\240\345^\206(\335E\252\301ao\304\247\324\334qH\222\342HQ\014JiI\221\035k\001h\333\271IJ\210\313j\344\035\376\235\324\036\326\331\363\021\365\317\360\223\327\364\366\277#\037\005[.\376\274Q\253\027\237\373\376-K\222\320\256K\361\031\231\014\313\017>\301\311Hi\367\320\226\222\351R<\273\266\2479 \244v\031\275O\2530\274\314\313\027\310\356\236\322@\34641\371\244\340\351\317Z,\311{\334i\353\204\272\330\013\021\244\303+}\224\372\240\004\177\315H\3061\203\333\202\0061\220:\304\004\362~K[\301\224\015\325\204\312\271z\271n\365\242\326\225n\364\277\250\266\203\335A\247\260\352\342S$H\360*\221\323\234\224\262\304\215\256)\262r\013[IB\200)\343)\323SB\335T$D\354\366\372\302R\031[\033\305\360\252\355\221X\251bE:\374\202\335\300\303\312\360\346F\252\307\013.\340\362\225\205p{\036F0{c_<\217|o-~}A]#\235\031\026\316}\225\257\351\325\263qX\237=\\\350\325\303Z\231d\274\022\251\226\333o:\251\020}\325\031\304\022\024\220{n\332@<\237]t\235=\217\216\337\003\274\275\307\365\377\000igj\245\022~1\225em\256\265\335\011\333\363P\251\027}\254\244\0424\332eP\010\023\320\257^\034Ia\323\217\341Z\3008<\202s\2557u:\036f\356o\310\376\270Y\257\323\177\372\032>\251\263m\253\247\363\241I\270l\333b\341\266)\234;!\024\350\352R\033\347\005\305GA[e\031\307\357\033+O<\253\270\320\316\2369\006\366\015\243\345\372*\276Y\001\247\233)\211\012\346\202\204a\211\042\246\312\374\312A`\266\265s\201\345#\203\371iY\264\330\241\225\015u\344\247]\207\177\315\246Kb3q\2460\302\3247\262R\266\226F\177\0227vP\343\221\355\351\2355\323\364\257k\274\211-n\322<\312\340R+\224\213\210\306\221\373q\267\324\321\375\332\336\377\000\230\3361\224)@\220@\317 +#\203\256\245\301\222Q{\350\217^~k\235\033\231\226\267\224z\211MD[S_\235\006\245OZ\200K\336\042IB\277\302U\236\377\000\317E\236\022\332\223u\217T\010\345\016\266Q\007\321\002u\213\245\3355\353u\274\374\033\306\337\256\031m\260\2455Y\246\265\211\321\0068-)9\361\223\333\310r\017n5\326}\231\35221\367\023\250\372\037\302~+\233\353\232\026\226T\202\307\257p\260\026\365\370|\352\325\257wT\341[\035F\265\257\036\236\241\365&=N9u\017\001\236\033\227\025`.3\243\261B\200\347\220H9?g\321\270\271\240\271\273O\247\375\356\276S6\034@u\265/:\217\031\233~\216\323\025\373\215*s!8h\253{\307\320 \2021\2369\372\0350\366\326BQ\3624\013%\025\364\216\367\266-\352r\245\271\042\247\034\201\220\204\2258\245\0161\337#=\365v\276\360QIkF\024gS\372\212\315ql\312\246H\265R\317\211\312&Mm\016\237\247\220\361\334\236G\246\244\272\220\314\300\340\242\366i\220*\226|J\215:\2552Uco\225\2305f\303\177\232x\310\343\323?mz\3119FvG\225-d\321\256h\264\377\000\332\267-V5>B\006Z\017N[\210\317\241\332\245\014\343?m\016@{\252\355\025\272\362\222\027\177Y\257\333v\021b\225\\r\265\271de\235\276\033c\260\354\234\223\3758\322\007P\346\2538\223\356T<O\212*\215-\206\240N\205T\251ORr\263\340%`}\016\341\372\3755'\250W*#\335[\177u`l\317\210\264\271F\177\346\324\230\316\020K~4m\301\012\317\252S\371r\016\235d\341\342\324\227P\244;e\365Z\256\355\333Q7Mm\025JIZ\210&\226\266\320\204\355\317\251\344\217\251\320\3339\2772\226\035\266\342W'R~,,\032s\217P\254V\251\225\012\221\362\270>_\303I\372nBO\327\327\327\362\325_\255h\036\352\276 %AZW\2552\240\003s\205\015\352\263\344<c\042rV\277q\344W\231#\353\216t\324\0235\303\335T\234\347\224\314\237[\270\351\326\324\232\275Z\025\257n\300G\231\015\255\265\272\267@\340m\015\372\234\016?\262b@L\002y)j\307\304\335\251\023/\226\234z\252\306\000c\302\316@\354A\343h\373s\240\375\346>-S\305' %\235\365\361[*\342\210\036\241S\042\300\224\332\2602\246\310Q\317\031*9H\374\211\322\317\352\015o\272\243\213\234-\252Z\007\305U\371\002\014H\357\321\335.l\004\224-j\012\372\202\0203\367\321\016\260\372\042\007\372\204\027\323\252\315\253\320\032\204K\262\317\351U\255q_#\036\025f\241G\375\256\2729\377\000\336\205\025\305|\272\037\0318[\215\273\2022\006F\2615\032\030\234\335\265\362]$Z\347\261\336!\003\342r\265_\341\313\342\006\344\353\355\042\341\261\372\213\327N\257Y\326\002\312&]\227\024\224>\355z\343k#\024\230\013 \230\3558v\205\026\321\274\344\200P\223\264\362\332\376\205\247\215\273\340g\233\353\223\334.\243A\326\247\221\364\0115\362\036\244-\335\265\251\266\373V\375\271H\240PQm\333Q\0424\315\036\216\304`\302!\306\003\312T\330\003b\216Nw`\225\025\023\316N\276;\326\343\361'\247:\335\373\005\335\350)\261\015\242\207\277\257t5sWm\371lV-j}A\014\322\343$\032\314\326\235\011\007?\376\004\271\334\023\330\343\223\222\007\327\212\325j\364\356c\264\261\037(\374Dw\366\007\367]\016\232\011X[+\207\230\376\037\355g\277[z\245R\257M\217\323\316\234@\216\360e'\301k\226\341\322Y\030\005\347\375\325\334\343\277\324\236\017\027\324\036\371\336\042`\362\216=\007\277\277\321]\307K\322\307\0003\314|\307\237S\360U\346\261g\333\226\235\031}B\352m\300\252\035\253\002:\334nd\265\226\2251g!o\241=\367+\005)\011\034'\204\343$\353\177C\244d-\361\037\200\022\263k\337)\360\241\026\356\376\311O\323\216\234\335\037\032U\272]n\271I\255t\323\340\322\210\274\267\025\260Y\231v\015\276H\314\250\020\030\016\376'\026\220\247\022\316pPV\024^\330\347\264I8\246v\035\317\365\375%'\3257N<8\215\310y?_\242~\3656\005W\250w\015?\245]1\244Si0cGm\257\025\264\245\232u\271\011\011\010\005 d\000\204$%\011\003\200\000\033\216p\234\232C)\271O\360\007\327`\257\246\324\267N\313\034\237\231*\235\374F\3656\320\261\354\326:=\323G\326\315\241J\013m\351{\211~\2631d\027\236Q'*R\325\311Q<\000\007\003\003Y\323\352\203\301lCk\007\352\266\364Z2\323\342\313\370\335\237\207\267\327uL::hv\275\006\373\353\005\331\037\345(\315\245Q\042\312x\225\011\312I\012q\226I\345\304\003\261+P\310R\260\330\316\025\255\015\011\021\306\\FO\011Mw\371\037\264\034\016U%\270\345T> \272\227\373F\274$\376\310\204\352\245\276\301\031j\013j\374%\303\352\352\206\006y\300\340`k\240\351\232\177\015\273\335\311\344\256\177X\377\000\036]\243\360\267\345\364U\253\246\303M\271K\237[\246Du4\366hH\215\004%\003x\227!\302\200\240\243\333\011\031\374\263\316\237\217\314O\272\011io\035\220}.\234\252\233\3247\033\216\247c\240|\264v\363\273j\002H$\236\344\234d\253\327'\355\247I\003hB\215\200\214\251\232\273\261o\216\2330\312Yp~\315\254\226\010\316BP\332\212S\220=?\353\316\244<8\007v\265R-\264{(\312\235.M\311cHohjx^\366\026\261\237\015IR\\i[}\222{\217\2464\333[\347\017*\262pi0.\312\265a\216\234[5W\203--\367S\036pJ\211HXJ\323\224\340\361\373\304$\363\350\241\244ur\020\375\275\225\306\032\253\024k\312m\006\253\016\346\244IN\370\262R\353X\374\005h'sk\343\033T\002\322O\246}q\245\230\363u\335\010>\274\311\331\3246!\313Sw\015\031G\366\\\266\033\231\035c\037\362\234\363\017\314\023\372\216\372\312\230\0068\247\2307\013\011\215\322\241\022\263J\2514\322\2355\206ZS\317v\011-\200\217\015@\344\225\022\257\024\036\300\014s\311\325\365\022T\005\303\234+i\216h\253\247\376\317^\252Q\250\264^\272t\356\342\223LU\020UU\021\217\231S\257\026\\\221\015\344\312SM\004:\242KIy\224!(J\001\220\373\247\013m.\247\256\373\025\253-\200G)\3118\\\337\332\215\010\221\333\242\034r\244>#)\335@\256\325\252\275A\231*\034\000\242\206\341Bq\365!\025(\316\004\270\2246\327\376\320\331\005n`\020\341J\022r\331 \375o\247I\266\202\342\344\2148XYa{\261\002\327\352dz\273\023\247\303\206\212|:\334\251sZ\330\206V\352\012\022\032k\005> T\206\266\270w8V\342\324\242T\207\027\256\201\216\263k5\304\007X\302N^\235H\377\000y,\266\254+\325\3512lF$*DX\013\300D\004\251\326\311\021\012\216R\202\206Zl(\222\\\361\024\262HZ2)\236\034)\334!\304\341\267j\314\033\332\213@vC\216\322d;\0129R\362\333\216\005ci\356\025\352\234\361\237|\343\201\256gP\306\335\264\251!\244\322N=Oe\205:\332\235qN\200J\210P\332?,i\035\252\233;Z\346\226\320\360\032\302\212\202V2s\301\311\366\374\200\325H\305\250\025T\244\341\302\013h\311\360V\255\251\306I$z\236?C\2534/\0066\223\026\336\361)\251\216\353M4\227\216\026\242\244\005)\003\370JI\366$\036x\357\246\341\266\252H\340\031\271?\272z\267\250\313\375\242\344\307aT\332}inBP\026\031q!\012) \202\000\330\267\011I\310P\012O\266\2664\247i\273\310HHwe^{\013\252\377\000\356\305:\267\025\253q\232dEl\012f3cd\2458\215\241hF\011H\004\241\320\201\220RH=\316\272H5\246\210\252Y\246\012\312\320\333j\240\315\231k]\022*\323h\323o\030L.\034*\245=\340\3435IN\266\207\245\312\207%\000$%I\220\202R\006\325\004c\374Y\316\373[\326\006\237J\350\301\363\220\272\037\262\2757|\241\356\374-?_\222\256\324\311\330\244\327\244\325\336\022\235\014\310\221\035\302\000R\034\301$\017t\257\325>\204\202;\234\374\022-\307s\244\317+\352\256\220p\324\232\244W\251u\231\024\373>\272\304\252r\326\037\223\025\326\370N\026\357\010J\275\025\344\335\237\\\343\003\261\023cs\210=\202\200\361\266\216\022K\250\020.\013Z\371\250\336q\224*\326\224\311\312\013R8\3717I\317\206\264\214\000\011>R\000\356\006\017\007J\365=9\377\000\354o\005\005\216xv\363\302\274\335\000\276`%M\\\264O\032\252\313E\266\3530P\255\257\241\007\217\024\240\377\000\020\034\347\370\261\214\2364\277O\325\226;sx\034\255m\241\361\330V\253\250=2\351gR+/\031rWH\271\333@+\250Gi.\267)\223\370~n6C\200w)y=\275I\034\016\213\250h\340\324\321\037\211-\004\217\213\007)#P\351\0353\246\352\247\271v\255\270TY*?\263\256:t\217\036#\213\003\224\245\321\201\221\202Kk\011X\356\007s\256\007[\321\374\027n\223\217_E\276\315qx\332\012`^\177\012\266\267X\3558\327e6-\002\275r\302mN5)\225$\267<g \202\177\003\240\214\036\307#9=\264\367\377\000\032\311Y\270\034\217O\256P\276\363\264\355<\025N\042\331\024\004V\245\304\250\317\352\277M\356\230\313\360\236m\227\326\021\224\237\342d\222\203\355\221\202G\257ms\263\275\304\221%\376i\370\213pY\365\371+u\323\312:\342\304\212)\235R\271X\232\234\0214Ai.%_\\\222\223\366#:\2158-\026\327\020\251+\332l\020\257\005\273q\323$\322\304;\352}&\355\220\031\015\256\244\206\025\002A8\356\245\266{\372\372\200F\272}\027Q\025\265\355\334\261\346\214\203\2723K\3456\205\275\032\343\2052\017\\j\026\264\325\020\3546\352u\205DuDq\345Q\033]\340\343>\276\240\352\316\216\234,\221\371\253x\342\270\264\366\205b?.lj\217\354\247\246\326\223\275I\252\304!\330\26203\237\025\214\206TrF\325\024\266\257\241\340\3537F\035\220\262\235\255\301\354\023\006\2253\344\241T\033M\026\256\273\2722\024\351Z\300[\263\233H\311HQP\334\221\330\000p\017\004\017U\306\230\265\304\325\251$<\203xJ\332'Y\342Vj\351\250\323\255\352t2\265mv\241\002z\030}J\007\030}\015\022VF1\2279\030\357\256r}F\351h~\353Q\272]\255\257\343\012\362\364\336\355]}\225S.\031\037\265)\316\341M\311\343\304i@\377\000\031I\311\037\346\3563\337]\037M\027\376\027\033i\365X\035Dl\377\000#FB\266\252u\332E\266\250\024\012dZ\223\341\242\033c\302\016!\320F\177\026NA\317\242TO\261\355\257\244t(a\206\243\224\343\327\376\256\017\254\313,\200\311\027+\030:\213\325+5\256\244\327\042\300\223\016\313\255x\352\2172\221)\302\205\266\340\357\2648\224\356l\236@)I\036\240\035}\257D\034b\031\334;\037\256\353\344\272\307\264>\306\011\355\365\331-\357\3132\313\276\240%\332\265\015\272\243\250\005^A\267\177\320\355\364\373i\262p\227\240\343d!z\025\271\322\267\355i\326\3534\367i\012l\220\353\001*.8?>\343\237\357\266\274\350\253!H\227p\242\253\265\305\320\276\214]\2257cG]Z\227$\254\241\001\270+'w\337n\000\355\337\032\023\264\367\336\325_\024v\017\012\042\223\360}N\267_ri\352\004\332LA\222\224Ih\220G|\235\244\217~q\217\267\250[\011a\362\234+\370Mp\311\312\376\252\213\320\3446\375\016\354\276m\312\363\351X\033\262\240\246\377\0000\256?\324\351\262o\224\017\361VQTJ\257@\251\354\265F\266%\305\250`\004\207[\216\024\220\256s\271\345\217\351\375t&\265\227\204F\312\322\000\034()\026u\273_5)I\254\323`\254\215\3006\353`\363\333\204eG\327\373\357G@\010E\337\311\005.\342\330\226\213\323dCp\326\036\222\2022\373H\360\301\003\270J\224I\0038\311\307\333\337K\370A\271)\246\354qOj\005\253\321\271Q\231\265\2525\035\265wRK\314\2627<\244\343\261Y\031\000\177\337V\016\007\224B\032\357(KN\251t\206\322\267\230\221\027\247\224jB\334\011R\234\361e\005\270\245\023\350Gc\367\347L\235;+\001f\310\375\230j\316wzW\324Zu\311>\357\217Pr\221=\242\245\004\021\273#\356\006\017\330\353\014\350\245c\267\203I\306=\256\033\227\025g\342\023\257\324\346\235\245\242\344\201)\244\035\212B\241\267\215\240r\0008?\2363\240K\257\235\242\260\274\010)\031X\370\210\352zd\222\365\032\327\361\325\307\212\335<\245\302=|\311P\311\326T\235R`\353\333h\333hR=\242\337\365[\232\225\006Ef\332\010\251\266\260R\343N\006\263\371\355<\375>\243N\263R\347\264\022\024\206\000/\272\263\021\376'\351\324X\261i\263\355{\316d\246\233\011R\320\204\272\017\377\000c\337[\014\327\307Y\277\222\003\235!?\204\237\227\362\243\272b\345\347y\326\343\241T\013N\320\265\332\011C\365Ir\337O\206=\220\333~\042\335^1\204%$\234\373s\245\264\363>\370\302\337v\227s\352\353\353\321~\215\277\331\375\320\233^\231Oj\356\215L\271k4\326\334\022Qr]\221\321\015*P\376\032e;%h\311\340\312\220w`yR\235p_m5s\026xe\364\017a\317\304\225\332\375\235\2020\342\340\333>\353M.\352\312#\263P\241\321j\010\247\242G3\347\241j.\311Q\030\011i\\\344$q\220x\347\353\257\200}\240\2141\216\205\216\333\273\361\021\311\374\375\027\322\272w\342\017sn\270\035\225?\276\2524\332<\010\326\3652\244(T4\255N\272\342r\354\271\253'\222\204\014\225,\362\002\217\011\376G\221\213L\326F\042\210\323G\346J\353\031)s\2353\305\270\376@|}\276\012\273u?\252\026gJ($\271\035\204\324\022\217\035\252Hsj[V2\227&9\311'\234\355\031Z\277\312\236t\314\272\230\364\315\005\334\372\177h\232]4\232\222H8\365\365\370\016\312\236t\232\315\254\374k\3651\213\303\252\357\273r\364\362\223!+\203o\272\245\042%MhP*z\241\341\235\321\351\215\341 \266\220\035\222\262\033AB\003\216\015N\215\241v\251\247[\252>Q\370G\257\271\366\366\356U:\266\265\272X\376\355\247\024O'\372\367\375\207\272\323n\245uB\324\242A4\2124\372|hl#\345\230[q\221\0324T\372\246<f\374\251Nx\011\000\377\000\366\306I5z\260\371\213\335\220\262tzG\006\331\307\362\252\217_\272\224\216\233Y\324\276\221\330\317H~\361\2524\325N\346\230\246\222\323\310S\250\334\333+ \014( \247\310p\022\016NJ\206\027\352n{\300\204\037\212\327\3510o>;\376\015\376\377\000\352\303~\255\335\364\223q\376\316\233.\245Z\212\314\257\003\344\351\353\002MjIP\037.\312\324\012[o<)\334\023\334%*<\3537M\013\\\374\344\017N\345t:\302\346\304H\302\013\353gP\257J\373\226\245\216\230\024\252\275\361-I\203D\267\251\350RaA)\343jA$\370,\244\220\247\024N\345\005(\340\036:}.\230\315){\215\376\303\341\354\271\255l\346&\000\321n<|SF\317\351,;z\235kt\332\231 \325\252R\344\032\225\301Qo\221Pu#.\021\307\374\244m\330\221\366:\177P\346\271\315c8\375\322\332f\2264\270\344\224_=\343S\262h\353m\220\035\226\316\325\206\375\026\207V\204\216{\020\017\177r4\006j\333\201|\253:3\237e*)\021i\224\226\230\201\035)\250=\031hh\245?\3623\204\225\014v c\371\353M\316\0174\020CCBP\305\203I\264i\367}=\305\240G\021\332|$+\205\254\270A\357\353\202\006u2\314\0306\267\262\025]\372\241\213.\362L\312S\316\310~H\232\333rV\012\321\306\302\225)\003\323!*N1\364\3231j\006\3371\312]\2660W\335\245]~\356\3515\323eT\303\212\253\241\263Qkz\316\340\225\021\274{\202\225n\343<\025`v\322s\200M(\211\370\247*\375oAy\371WU\032R\034\010J\233}\244\355\030\334\244\235\330\367\335\214\237\256x\347E\021\2076\373\204\006\335\270&\207A\256\350\025\312M\177\246U\271([\264\267\334r\215\273\001K\204\245y\331\036\207b\316\360;\204\270\177\303\3055\332!$[\273\200\247E=\022\303\333\205gzS\002=\265{L/Hi\210\206\231/\306\013\341!\010Hp\025}\212\011\373\003\357\254H\216\340b<\321Z`\323\203\273.o\204Ij\267i\027\365E\352\212\233\022X\023T\247V<gB^!\327\360A %\016\272\235\344c{\203\001E$\016\207M\031\216 Zh\212\371wI5\273\367_\005_\273\262\352\255\365\306\275B\270\250tX\363j\365\011\001\267\232\223$F\216\211r7 \262\351QR\203!\351,!|\225\020\331llO\235?J\350}]\223[Oe\311\365.\225\340S\233\370VVu\366\345\233oF\221\341Mp\335ki\331NK1P\342[\220HdDi*IJ\235.8\\*# 2R\000\004\235vcRChr\271}C\010u\021\365\350\263\246\347\270h\353z\355\241\324&8\247V\227\225\042Zr\373\223\236S\311m\305\027\025\225`\007\034\001X\357\2022B@]\323Y-qH\310\032\333\354\222\267\205\001OOUA+\210\3155.\245\266\022\204\341,\264\032\3366\016\333PV\021\307\361%}\361\222\254\321\027\035\310\000\3268J\272\225\264\250\273\226\373\314\245\327T\342\3243\310\343<\376g\030\372i\031!\333\312\255;w\250B\225\030a\266ZK.\241\306\367\347hV\012U\234~c\276\227\332F\021\236\332\030Rp\344)\227\243\305|\025D\300\363\025p\222;\037\310\235]\200wW\334E5\020\246\266\354\042\036\332\245GCe\237)\344\267\330~`\177]0\311\250\360\2074w\311E\026\267P\332\023\323>Ly\217Ma\326\337R\033^\337\030\240\022\016?\213!\275\204z\225}thub\354\204\241\200\223kd\276\000z!j\365\3165R\344\223^[\366\365\021\337\002E\275!\204\356\222\245<\255\250K\271 5\261.%X\031(q)\030\301:\350t\272\212\213x\343\214\257G\241k\235\346?\020\255\257[o\015\320\234\207\035\227`5NepX\216\333hKq\362\342\301\015\245#\003\312v\224\2168\034k\346=k\250\031\246;\217\262\372.\202!\0344\321\302\253\027\217\317S-G\331\211&<\247\336Z6\254\244+\367N(y\226}A\306=\373c\353\231.\233\374e\243\2727\212wSJ\002E2\233\177\304\203\022\233%\212'Q\351\216)l\307ue&J\022\177x\224\347\001\301\345$'\2021\221\312H*\303\036\341\267\202\026\213\263U\312\013\272b\326\355;\201\212\223\360\213\026\365Q\242\305B\024\214\204<\260|\311\332y9\357\345\363!C8\301:\312\327G#Ev\364Ec\250\337\001\022\331\225:\247J\253\361n[~\231R\255Q\033\312\322\332\224\013\336\022\216V\311\354I\306\0169J\206\025\214\366\346#\237\302\226\353\011\346\203T\025\346\255\335\226\007W\254\3107]\267\032\247]\245Ei%\366\340\244\267V\240\253\000\357h!hp\2458\345(RU\200\010$\015l\317\254\336\300\370r?P\255\034G!\301*\252\335Q\352\357K\251LK\246N\244\365\233\245U4xRc\325P\251l\324R<\336\013\212;\037m\344\362RJ\226\264\236FF\200\376\243&\333>f\236o\277\363\372\341N\302\3370BV\307^\251\224\331Q*\275.E\305k\324\221\271\331T\032\274\275\212\214\254\366b[XD\246\316\007\0166\323\230\300)Ws\234\003\001\270\034G\261\376\306\017\310\042\227\335Z7\273\276&\243\334\364\326%uc\243\025i\021W'\3015*%f;2!\022\011B\320\352\230\302\322\241\274xnde%;\263\205imC\201n\347\214~I\210\332\356\0236\301\270\272;P\205\0314{\372\344.:\001\014W\251\277.\34398\330\251L\025\243\003\374E;x\374CL\364\367i\232h\036}T\352Z\361\331XJ\217K\256i\360\340\314\261*\020e\334\314\215\301\211*If\245\024\367Fs\264\234d\203\235\252\31688:\337v\225\262Q\217\237OU\236esr\356\024lj\24375=\336\221uR\233\022\307\272\031*4!P\012p\305\220@\360\374\025\000\225*3\271\332\246T\254\244\355-\251X)\006\237O\275\246)\200\261\302\026\361{\231\301C6\215\017\253\366\225I\350\255G\247!L:P\241NY\012^8>G\016\000\307\2409\372\372k\022=\033\343w\234\327\245p\232.\004\022E\225h\254^\274\317\244\315r\235*\251B\231W\213\373\307\351\265\031\212\205!\030\034\251\001h^\0169\364\367\3165\277\243\324\015\267{\253\335dM\244i\305R\376u\022\364\350\025\322\351\276\372YX\247\326nG\213nT\251-\224!\310\262\017\016:\024<\216\264H\311R\011\301\373\353\237\353\355\321<x\361\021\273\270\013S\247I\252m\305 \362\366>\277\370\233\335\032\237v'\345\252\320\236R\216\340\246\321\011\365/a\364\031\007#\363?\310\350]\012\003\274<\025\035M\3400\207\013Ze\323+\372S\215\246\221z[\216\2102\022Ys\306\033J\2629\007n1\367\004\037\267s\365>\232\331A\016\007\217E\363.\240\366\023\266\362U\030\370\276\350\015\313*\340\211&\336\352\215\251yZ\354 \251\210\325\3653T\254[)W!\264Jw3</\360oqi\003\216;\353\354}\017T\327\306\016\332>\302\201\376\027\312:\276\2346R\003\261\357\225Vm[B\367\265\2428\314\213\276\221_q'\011u\344\251\244'\337\314\016?\372\366\377\000N\200\276\326`ah\240W\223\366\337R\352U/\026\227{[\3154\264\021\205@\361\233G\036\212\004}\177\261\242a\013c\271\005O\322-\016\244E\030\252\\\364)\251\004\223\340%\310\204\375\325\222>\371\325\332\326\2220\246\335\267'?%#V\244U\322R\271\226\3052\2701\261\011L\204/#\324\253$\003\253\026\003\302\210A\003\325\003]]#\265\346B\0253c\331Qj\004\205\253\307\214\034\003\216s\263\363\372\350\033\033\272\312!\036\330\\\225\373+\241\350\264\213W\313\026\325\247\021(%s\021\035M#\030\364\306\024~\303\362\320\334+\205w\275\244y\325Z\262\272m\360\333vW\337\207a\310\237p\241+V\304\272%0\036\347\272\020\274n\373\352\342 E\252@\340|\240&\274\273j\211gT\333\245F\351\255\3175\260B@\031\010\343\007%9'\031\367\347\351\251-\016\031LF\3474m\013\312\250\375\211GL\231q\251pm\373\201\364\000|Y\033\\Q\355\202\016O\352{j\207L;/\011@)Mj\364\226\262\315^U\310\345\327G\214e-N\006\312\326\352G9\000\367\036\271\357\251\204P\312\203\010'u\362\213n~\227;=*}\252\315:d\241\335!xJ\277$\372\376Z.;\240\276/B\251\317Qz\021n\325%\250\241\012]ED\005\006\236\310\375\017#\334k7U\240c\362\024\302\013xH\331\375\000\207A\234\300\236\353\241j$\200\244+\000\177C\217\347\254\317\3762\212dHA\366O^\234\364\373\247\355\206\331\256H\0166\007\015 \245\012p\373{\372\377\000\337M\351\364\215\340\243\370\342\210\035\2215N\321K3\035n\207\026\225\022\234?\002\035\200\343\252\374\3244\331\323\372\013K\230w\371\266\337\344\210\353f\322\241]\324\246-Z\272\243\322\010\336\352\243\247\346\230H<\000C$\2700pv\204\214\372\035 \360/\313\302\351\214\355\0048\212?\252\375&|\036TkwWHbO\270+\023k\324\266\202[f\\\346\341GS\353\003\272\042\307l)\010\036P\024\352\334qX\312\266\343'\346\177m\264\376\2304\273O\263r\267v\326\243N\2402-\210\265)\355VvUe\244\354\300\004\305o\335$\360\223\217S\310\327\346~\263\246\2227\022\333s\335\353\300\013\353\375%\321\310Z\327\212h\371\222\263\342\366\276\352\224i\016\013b\244\342\247\255\012\3375\334)\340}J=\200\354\0169\357\254\366j\335\020\333\021\317\257\364\272Fh\333!\334\374\017EQk=\042=@J\356\036\241\3355\032\025\226\035R\344\312\306\371s\311\345H\216\225g\314Nr\341\007\004\360\011\034)\036\205\217\042I\316?R\265$\327xm\360`\036o\3313\335\370\222\351\237O:{L\351'F\3514\256\235\330\221T\037\254>\210\322$L\251\034\362\022\204\204\207] \037\306\360\034\222\245q\267]\344z\275?\200#f\031\337\037\302\344N\206WJe\223.?\242\317>\251\374x\334\365\233\362\035\037\341\372\307e\252\303o!\226gT\302*R|n\002[i\264\345\206\211Q\004\355\013\300\356\242\006\243I\244\017x\225\242\200\342\363\177\227\012\272\231\3664F2S\323\2501\253}\033\350\300\271\272\203rJ\271:\225S\012]B\255-\362\354\232\204\347N_t\250\234\234)[\023\217\240\030\3064.\264\317\014\2067\223\373\367+W\244>\354\274\376\025P\355{j\233\322\373I}w\276\351\012r\351\233\230v\265/~\347\302\234V\300\244\244\340%\305\344\200\242<\211*Q:.\213\247\230@\003\361\236\020\365:\300\377\0003\277\010\376\353\346\242:KDv\353\276\246I\205\035\211\267\225ee\212\205}\245)!\230\210\301\\JrO\340\214\017\225N\237;\252%\\\0025\260\370\204m\360\232y\345\042\302\034\363+\271+G\350]=\245YU\3246ay\323FT(AI\332\033J\020\247\010\373\222\220\237\345\253h\242\014y\0074\025\246~\340+\325U\376\234\320\340\336\026E;`\0379\022|\230\374\235\331\334\356RG\321Cw\007\330\367\326O\201\031cOum\326HC\302\275\021\336\264\305\241\245\326\234\241\252K4_2\260\226\300\316\\\357\214\227v\216}\001\036\272s@\355\262\222x4\020g\340*\225\324\352\323\263/z\345\272\322\334jL\332\224X\211m \202\210\311Z\235R\273c* '\234p\257\246\205\001\334\367\331\340\204\266\245\304\026\257\213v\204\353\027=\333\031\247\334v2_-\204\001\370P[N\341\367\302\271\007\267\365\211\042%\273\201\356\210\360\003\316\337E\015E\215:\315\352\255\301O\232\271-\042[\256\261\013\305\030\013\037*\205\2418\357\205d\237|\201\216\372;\030^<\303\042\3222G\265\327\352\200\372\307[v\317\253\331s\350e\267\243.\264\320\236\242\262\240\204\245#sJ\000\347;]Q\347\374#:\331\320\351\330\341D\343+?Y!eW\252W\327\2505:=\357\373N\237>DG\033\220$\306u\263\264\245Y'#\034v$c\324\034\036\372\220\302\321\265\334\245\345\210\207\356\012\373[WS\227\245\216\335\315\012S\021\35640\354\032\213\010$lp\240\203\201\334\245a[\200\365\007\036\232\307\227A\341\313\3427\202\265\3316\346{\256^\217\276\365\255w&\225&J\330n\253\023\366f\344\203\234-YG#\007\033\302~\304\347\203\242\321\026\323\334)\217\006\212\267\226\265\3476\326\265:|\375\006{Q\253/\302~\246\210\345D:\221\363%\262\274\360N\305\245\260?\302\240\010\321<yt\3469#?\037\315\022F\262F\354p\345\017\335\337\017\260\376$\247DON\2536\375\013\250\321\336L\327i\325G\\\217\026S\214\370\352\375\312\322\026B\216\350\3528IR\234*O\001`k\351=;\3553F\321\042\345z\227E\017\004\203T\261\363\256=\020\271\376\036\356>\241Xw\305\256\206n\252}I4S\271^+q\374?\023z\035p\014%A\324\355\000\025\005\024\250\202q\307F\335K\003\013\233\236\027'\251\320l9\030\355\371\252\2616-^\275\035\224\277S0P\211A2P<\251l\022I\302@$\366I=\277\204\001\333D\313\232\262&\210\027R\002\252\333uI/!\346\335u\360<\276u\220@\004\345D\020\016>\247\2764\254\261\271\031\261\225\321M\351\325R`C\216\004\042)\334K\331\007\303\011\316J\271\340\017S\371\014\223\2537H\342\206\035\354\275\221e>\210\315\311B\325$\004\257q\000\3418\031\030=\263\364\317\351\330O\335\305n\354\241\205\367U\225\367I\247Qf\356\210\344\24514\270\313-!AC\005[\202\324\254\020\220\220BS\311\356\241\234\000T<\310\243\341y\357w~S\025\336\204\313\223Q\267\025i\323\253U\251\265\025\2463T\350N\0113_yK\001\010m(HA[\211\363!)'!i\347\327M\377\000\361\331\005\271\264\254\217'\037\372\277L\037\016}\003\242\374\042\374>\377\000\2717\360\240L\352=\314\333\222\352\222\351u%<#\272\016#\262[SM\226T\332F\307R\264\235\376b\205\003\202\015\325\365,\323\351\374\027g\334z\255^\213\244s\237\274d\203\224\210\352\303\322\302#\324k\321\036\250S\276u\014\311\220\234(\306\337\220\205\272\257\342h\224\224\225\036\304\244\347\216>V\351\262|OU\3648\340\260),z\205N\270\251\320(\225\310\214\261Q\264a\305\371*\232\243GK\216\010\273JP\343\201>G\000\335\313\204y\374\273\224\017%\231\365\016\240{\0048\341k]g\272P\377\000\270\317\325\266F\247\317\211C\277\030H\237Mq\205\355D\366\321\202\207b\225$\207P@\001M\3764\347i\004\000\263\231#<F\320>a\220\234lg\266\027\304{\361J\205\042\327\352\315\272j6\274\364\355~\234\343 \241\227s\377\0006\024\216B\0268%\2478\317e\016N\260\037\324\\\016\311\005\203\365\202\230\333\177\210.G:oR\262Y]\313\322\272\360\352/K\326\220\2510\034x\255t\376\001\317\012\334\321\031\031\034\024\375F\025\244uZ\023\377\000\330\3173\177dh\030Y\206\242\312}>C\013E\377\000\323\312\244\252u\305\031%\311M\340-r\232\306T\207C$\0071\311\016\240\005q\346I>}, \333\346\217\004~\277\024\347\212\347\001e\036\332\035Cj\250\227\214\3301c\246_\231\344\245ITY\307\374\311\341%_\346\0309\347\277:\323\323\352\003r\341\317\311\016\203\207\272\211\272,\033>\262\374Z\241\042\331\226TQ\036s\016\360\312\363\235\216%]\323\236\301Y\307$\034dhZ\210\230r\334\022\243h\261\273\262\234\205h\311\267\343I\371\353\226\203I\202\353E\017\374\342\233TYC\270^\322\260Rx\316PH g\004\352\037\242~\332<{\375_\311]\256\332l\0242\355\223i\325\232q\272d\250LIX\312d\322\326\267YJ\275\3606(\017\261\037MsN\2041\373o\344\231\226w<QM\036\237u\033\251\335\023nKt\031r\357\253U\036O\223q\367\036K.\177\211~8K\261\216@\302\222\341\316y\007].\223\\bm\001\270}w\344,\331\264\345\302\225\271\205\325~\206u\366\337\201lu\202%:\213\\YS4\347\253\021\322\343t\347\224\254`,\024\245Cwb\026\235\331\316\002\265\272\315\\S05\347\347\365\374\204\224\220\230\315\263\344\226\035aJ\354\243\027\244\367\317\355\273Z\252\343\0365\042\261\021\351/\261>>@\304Y\033\313\240$\343-\255\334\240\234\004\2479\327\272\203\332\306l~=\321 6.\354\244\315\262\317P,\012\265>efM\321\324\013\026\033\245\340\374\215\325&`\225vP2B\237g>\273V\007\247:\345\214S\261\336#\001s\007z\277\372\264\331@y\225\253\240\332v}\3252=r\304\213J\236\314\205%f\033r\224\311C\252\356\220\034>ROd\344{\017}-.\215\223\273v\230_\260\347\365L\266}\202\234\257\207Km\310Tw\213\017\242\346\266*L\220\227\243Hk\314\214z\034\340\201\371\034\353wE\241\360i\256\266\221\330\205\205\256\324\227\217-8z\255+\351\323\264\252\214F\330\375\246\314\225\370`)\267p\026\222>\212\341]\273s\366\032\372W\331\371[Uv\276o\325\231\315\360\263\313\343B\367\205]\256&\332\213\036\334\246\325 \244\306Mn3{e\306A\347\303u\222\002\324\214\034\245i%>\335\370\373\007I\217cw\003\317\311|\267\251N^\352\177\037\014\252iK\267h\327\0153\366<\013\362\343}\350\350\303\222<\014\027\2169\375\362\370'\234`\023\337[\255vVY\030D\366m\255[\2468X\221s\334\365X\255\234 \311S9O>\205\000+\323\277?\351\242\332\243p2QU\345Xn\217I2$U'0\342RU\265\215\310R\306y\340\022O\337V\334/\012\255\272S}\026\277:e|\305y\231w\315\273ALs\265\347\353\263\232\200\206\275\311T\202\201\307l\237oL\353\316s\271\345XH\323b\321\247\\\225f\330\222it\332'UmY5\371\314\370\354&*\304\344)\003<\205\260\245\264\220Bs\234\217\267\256\206\327\0228\2441\250\005\330TB\370\276\355]\3553\324\031\024\332\233\011\037\363\\\375\343d\361\370PO'\266\206\352&\312`H\332\267.\313F\351\351+p\037\250\331\277\263#W\0201\271\016\266\225\237b\003AJ\373g\035\264F\234aA\220\023h\026\243X\253\302\253\246\343\252\365f\257Gm\345\344\2675_\273\373 \251IH\037\221\325<J4Q\205~\042h\243\251\325\204\032\034\252\375f\273H\2572\220\255\356\264\204-\325'\035\307\203\353\333\202}t]\343n\025\\KM\225Z\245\365\022u\311\036Z(\211\272\351\326\340V\323(>\323A8\365-\223\223\355\244\342\234:\312\254\207s}>K\211\352Mf\341\202\206:k\325:\223\3657\217\206\367\2221P\367\007$\023\2169\310\324\311\271\330aQ\034y\260\357\331ORzU\177\332\316$V\253\220\353\262\\N\365\252B\3745\344\363\235\311\317\247\246\210\306\221\311\264v\356i\242\272.\227\352\364\350Qi\225\250\264\244\207U\265\011L\237\023h\367%@\034\375\007\375\2649\\\000D\267n\370\252\321p\256=\217pM&]\015\317\021\001H-\310*p\347\234\025wH\032\312\222O=\214*\200\032\012\207o\253wS\000\267\032\241n\245\234\344\005Lw#\371\017\351\250~\245\300\325\2535\330\030\375U\257\350\267M\351=D\251\310\227\320\273Z\221_\251\000\003\322\251\315+\302B\011\306d8xi \237\304\346\334i\215\321\006nmR\337\205\341\356\333Y\367_\240^\220\320\350\377\000\016\035\030\217s\365b\353\265\305j0\360\231\371w\334v$U\250yc\307\336\240$:s\370\302v\363\200q\311\371\037\332\235|\332\311\014\0326\022\3562?_\202\372G\331\355\023!g\211)\000s\317\011'#\253\256u\273\366\244\272L\232\272a2\222\363\317<\337\221\224\356\300IW)\012Q\316\020\236\300d\366\327\313\276\320\375\217\237I\017\217\324^3\330~\313\274\351=f)_\341\351\233~\350>\221m\323#\376\327\255\326\342\205\323\342(8\353\257\222P\265pR\223\352\265dv\347\034\0165\305\350\264\261\371\244p\000\017\257\232\351\3653?\021\203\312\256\275Y\253\275XT\233\216\277.E6\222\201\210\355\275\204\004\264\006\000m\264\360\007n}}\364\256\242\026\222e\227\001i\300\340)\221\214\254\230\353\037Rf\334\365\017\3672\314m\350\264\367\011h\255\277\306\356~\335\223\214}\375N\255\242>#\254~\020\213\251n\306\347\222\256\307\300'\302\274\032Q\237\325\333\375\217\222\244S\226\264\262N2\245\201\317\377\000bT3\216q\201\256\313J\366\307\021\220\256bPC\2746\362~\255\037\365&\235D\353\005\327W\352WSj\022,\376\200ZD\341\256\033\017-'r\031\0129\313\252\356\2407+\220\000\004\215eF\301+\316\246cL\034\004\375\354`\212?\304yYq\325\316\261V>!z\230\375Z$\027\35065%\2455N\207\267o\312\261\215\241J\307\001\325\200\006\321\302G\003$i\377\000\037kL\317\374]\275\220X\317\025\341\237\352\337\335^\177\205k\031tz\225\367u>\303JU\016\215\006\225\001\223\215\256T&>\225,\2368\332\224\266\234w\306~\272\247\211\2649\335\360\002,\315\016x\003\337\366\377\000\212\366u\026$V.Z\212H@m\231\222\342F[\270\345\325#h\003\320d+\003\353\217Q\313Q?\314\034\343Y!(\321@\021\350\012\317H3)\375\023\350\205J\363\225)J\253\255x\204\322\316\323&PACm\201\374>b\265\023\350\001?|y]\260ni\370'#\267;\315\331(\372gn\312\226\345\225V\222\361v\245 \261Py\354\355\001G\016\251g \343\324\235\025\204okG\305E\022\017\311)\372\177o&\370\277\356k\366Tu3\011\331n9\021\013\031\312A\330\331\037R\022\016~\247F\321\203#\\iD\254o\342)\231n\332m\321\357\033\324\251-\022\354\301! $\2344\204,w\363(\004\003\221\3501\351\242@\342\346\220{*\317\020\007x\357\373\240\317\210\012*Eg\245\225$-(\236*m!K\347\033[q)\336x\377\000\333\376\371\340\260KN\277b\224\324\303l\003\275\205S\257\272\033o\335\3275>K(v\235R\250\256Q\307\377\000\211\340\025\261\304\237\267\224\2162?-kt\247\356m\003\334\254\215V\234\356 \367]\210~5F\307f\343\214S1\310\245\270\216\250\253'r\024\032Z\217\261\362\347\032r\177\307j\215}\262\307e\335\323\312\354\333z\346\253\304\017f\014\366Zh4\0266\270\367\342o>\203\205+\237L\343U\360\332\341Ey\216!\325\352\233\324\252\313\365\231H\221\013>4%\244\245\302JU\271\013\301J\3622\225\005'\214g\320\215-4x\264\303\035e6/\213\364\304\247t\316u\005/3.<\372\213kJ\222<5\307|!\304\262}s\342)\316\017\252A\364\320eu\355\244G8\340\243\233\013\251\253\266n\372-\377\000\002\2452\011\246\254T\230v*\213r[\361\006\337\334\254y\233q$\020\034A\012A\033\222R|\351j\022\005\022\253-8e_\006h\275/\377\000h\015\2039\216\247\332\026}\245s[TV\350v\365q\351\222\024\362c\262\312\024\314(\320C\300*+@\022\353\211l\251\244\272\321S\215\015\345\316\273\242\365\032u\236;\205\316\353\243\332v\234\337\351\352o\353\331a\307U\376\017o\376\231\301D\351p\241I\014\246+\357\2469\336\227L\224\255\344\015\207\004\253\302CaI\034\245[\322H>Q\332G\250c\262\325\314\315\241x\026\252\005r\313\224\367\313\270Y}\211.\024\251\302P\033J\367\254mW\333\007\324\017\177mC\251\306\355+#]\266\312\023r\333\225\005\365\266\036_\201\362\350V\016F\344\250$\255\030\367\003\000\352Z=\022\3620Q\245\306\\u{aE\204\264\023\341\344\245D\241\324\2270\024A\354\224\222{}\177)\222@\005%\303KN\023N\301\3505v\347\2529\002\237kVn\253\225\304\257\345\243\307Pm\001\177\362\306\3658v\253\316Rv\0027%C\324\350\272xZ\3572\235\216\276\026\325\374#\364.\334\351\325vWW+\367%\265\\\271\350\217\011\010\245*\225\363\016@;\222\020\353M\270\353HyH\220\234,\244%\326\221 \255\004\370d%\347\365X!c\234\035nP\316\233$\216\000\216}\270V\342u2E\363\006}^R~M\364:\245\354R\374B\320\377\000\011_upBw\036U\334\222N\276y\3245\277y>e\331\350\340\360[\345Y\267\324>\246I\265z\331V\267X\253\322i\260&R\241\260\246*)y\244g\303.6\347\2162\330\001d\244\205\201\302\224wq\215r\2639\315\221\315\006\257\325n\302\3744\034b\321\025\265\324^\233\2656\236\315\324\233\253\341\366\374q\240\250\265\306\033\361\350\262\222\256\305\345\240)\266\220\240xqa\015\020\254\205\200J\264\316\215\303\207\371\017oO\315D\363m\345\266\232W\007K\356\232d&\240u\036\304\244\315\2419 K\245]V\322KlC\220\241\345q\350\245E-\005\205rZ^\307\002\260\006Jt\306\243D\366\371^\334\036\010\372\302\210\265m&\357\373\372\364Tb\265}\305\351\357P\256\036\222uv\202\365\301\022<\200\204KR<A-\225\341m:\027\302\210RT\234,\200\240\177\217\203\256CP\014Ntrd'[\251\033\266\270\024\302\267m(U\027^\272:\013x8\273\205\206\366\232z\222\030\232\264'\273\016\266\240\021%\277\305\214\203\203\217|\351\030\036C\256\027e4c\037\210)\233ZR\335\\\232\204\030)\266/\010\347|\372z\032-\264\245'\2258\323j\317\204\240\177\033]\223\370\223\345\310L\351@/\334\336}\021\001<\216Sf\231H\266\256\330\353\221LBh\327\001qN\277\004\015\251\227\306\024[\030)'\214\224\367=\3755\262\335<s\212\042\220\237-\033K\371]J\211l\325WK\217H\206\3244e\017\231O\2508\362\201\344\010\373\016R8\345G\320c\035\365\225\256\250\216\326\034{\345\031\222\027b\221c}@\246\326il0\236\235\323+/\022v79\206\224\226\363\217\371kRU\200}\201\317\270'\235.\335s\213(6\321\274+4B\217\020\323Wq-\273a\321\242\2539J[a^B=\201\332\023\300\364\032\011\226G\232\331D\374T\275\200a\030\322\351\257\260\307\311R.\210\224Z\302pY\216\354\345\002\260}0\342\216\007\177)\323p\304\373\015\340\2419\324-\016\336we\263f.<;\3216\340\255\2746\307j,4\242C\253\335\312\324S\201\267\334\254c\260\311\326\263\234\330\305I\365\374%\236\345?H\353\225b=\225\376\351V\021l^\366\271\224$\302\2478\323Hz\224q\202\250\3577\2256q\350\0068\307\000\220K\027T\246\370r\266\332\201\340\323\267\260\321Z?\360\341!\373\357\246\265+B\227_\257\252\321\236\321R\274F\230\223*\032\361\214x\336\021*\333\364\343\201\300\364\352:\003\244d\241\360dzU\341s\337h\304O\217t\334\2162\222\264\036\233\013N\347\237o\323\253\224\273\202Yqi\216\374\024\024\251\326\201\301K\250HRs\350\177\017>\234kg\355\007\377\000\343&\314\323\253\351\303d\207\226\366'\333\321s=\013\355\371\200\375\327_\346\035\235\337\363\365\370\253\343\323w\353\323\345\320\245\265T\234\325\301J\036\014\232|\244\227\031\253C\037\211\262\016\012\036@\031I\316\025\330\343#X_g\372\253\310\373\217RnF3\310?\036im\365\316\237\031\377\000\362\264\207\007\323\203i\265P\353\205\263o\335*\266o\353}R,\032\223>\032'\323\313\211~\000<\022\373(;\302\001\007\367\215\035\310\306v\377\000\020\372D\037e\232\346\370\332sO\035\271\007\340\276s\250\353\216c\266L,\037\321eg\373J[\353wISh7l\365*\363\274\372SSB\234\243\325j\225e\324\324Y\310P\214$8\245\251iNI\000(\2020}\306\272\0356\251\305\225\267k\207\042\227-\325t\355a\336\302v\037\316\275\222[\341\372\376\231^\203M\201v\376\317\2151)\030zdV\336i\304\343\221\265aC\007\277 \353\242\322H\\\333<\254f\270\201\264\362\256\014;\011\306$\256\251m\334\223\342\301{\004\262\304\255\351O\000e %\011NH9\0018\355\337Z!\353\336\036,(z\275\265[\265\025\042\341\253]WeZ\022\001_\310|\243Ndq\215\251YNq\216\375\377\000\246\252]b\373\2570m\356\200\233\250\332\335]\247U\027X\351\015A\230\315\366\\\312V\307\\\000p@NFN\0169\317\333R\326\330\312\366\320\361n\011glt\357\244q\027%\210\026\225\313L1\301\331\031P\334Al\377\000\211\015\244\200\177.5R\302\345H\343cx\013\332\247\321\304Lg\347\250\367\003\361\335w;\033\223\007\301u9\355\20588?O\246\250\350\354QL\006\367\005\016\333?\017\365\006k_\377\000\207]\237R<\370\216\247+\003\276R\353g8\376\376\272\226B\006U6_\342R\325o\204\032-j\276\324\313\216\244\271\217=\316\311u']SG\374\271I#\031\307\177_\257\002\223D\307\0339F\204\265\240\236\377\0005\326\276\210\267\323\026$9h\326\342T\244\271\214B3\212\033#\324\023\264\344~\237}\03044\000\025m\243-\344\241\330\235>\276\356\252|\204\335\325\013j\331\242\370\233\313,4\227P\352y\000\002\261\277\324\372\363\372j\206 W\234\335\337\210\341\001\324(=\023\261\032O\313u\012\244\355T/r\233\211\261+\317s\267#\000~~\332\240\215\243\272\227M\035c\225\0037\251\324z|\223^\242\324\353\367=8 n\022\235C\357\002;\204\356 \005v\365:\033\365\015`V\003w\230\014%\005s\253\264\253\302\240\251?\260:\201I|\220\020dmu\254v\312\202\177\017\323\004\343I\263W\342\032-*\036\\\010*B\201L\206\364\367\252\022(\214W\225\214\255iZ\322\266\307\247\343V\007\347\3544X\342\002K\245v;\312{\204e#\247\266\265u\317\332\015\303}\215\303\012K\321w\250\037_0<\2156\355;]\222\025\030\327W\224\243\273+\250\335\015\350}uu\271\222[\213O\336\225\032q\222\246c\310_pd4\331\012u?\345\3179\3564\204\306\006\342\350.\215\367\273s\005\225\250\035\021\270m\177\215*\352ju\036\250\242\343f\230\312\034r\237\025\224\266\335&\042xKm\261\2607\031\037\302\0067(\222IQ\347\\\357U\352:]\004&x\306O\276J\332\351\321\315\252w\204\356\007\326V\207\216\231\265 \376\307f\224\213n\330\247\355\037.\311l8\342\302|\245\341\214\205c\007*\035\261\2165\371\347\355$\323kd\373\327Pu\177\372\263\323\342\276\303\321\337\036\225\276\016\234Y5eW\236\2525\002\210\322\341Be\023\313\011/!\225'\313\236\341J\000\014\375\316\007\003\237~'\250\316\031\345oe\324t\350\334\374\236\012\312\216\264\324j\267\023\362\314\371nxD\226\200\301)$\223\344H\030*>\200\016\372\345_4\222\272\235\302\354`\215\2212\302\342\351\007\303\005I\373\246\333\244.\232c^\325C\3424\314\204g\366402\344\331\203\200\204!>d\267\234\250\220\010$\201\256\257E\247t`2\250\236}\275\312\303\352\032\366\2377`\255\017[\372\220\211\225\373/\340\327\341\331\011a\250\020D\373\232\277#\002=\261HFK\325J\211\007\005\347\010Qm\216\353R\2221\333Z\000\035K\366]1\243?\005\231\023|&\357v^\356\007\326VO|\\\374BF\352E~-\211b\252\241L\350\335\260\014:,'p\034\250\311\34496HO\012yd\234\017\341*\356I\310\226j\2333\374A\206\214\017\207\257\346\233|f&\354'\315\337\353\331\016\364\316\301L9\326]\2455\226\231\256\324\246\265&\242\217\305\261C+KX\377\000\042S\310\367*\327\245\324\211flm\030iEd~\0346yu~\353a>\025\350\024\004\3317T\331\251\005\231\027\253%I<x\216\241\244-)$\372$\224q\356>\247Wd\254\015\027\305\245u\315!\364=>\276jC\251\350\211t\336\224\012s\225\005S\351\214\334*\256L\224\254\245\010b:\0240\347\007\311\273\315\216\376_\270\321\0313^|\347\313\312]\255sF;\212YE\361\021w\304\352\025y\212m\272\334\206\372{Em\306)\211[e\012\223\224\200_R\011\362\251@\034\003\330+\334\221\2549&l\257\335\376\243\217\355nE\033\330*\262\177\361:*t5S\272UN\203\015\324G\257?\022%)\247\022HSM\026\221\342\254v;\261\345\037Ug\323\032\322/\006\23095\373$\366\2257n\364\356<[n\216\335:3P\322\333\2376\371l\221\340\266\321\004$\217]\345IN>\372\335\216\026\305\020!(\371\013\316\020\217P\350hMN\273&\211$\007\034\005\350\357\006\316<E aX\366\335\2364\276\226\001\270\355D\324LK)):\372\300\250/\246\211L\246T\342i\1776\351iy\332\342\266'#\374\247j\361\366\372\015+4U1pP\331<\240\025Y\356\003Jv\373\250[\316\227\177m&\034j\222R\254\000Zwr\011\347\324\025\001\377\000\330k_\2464\010\334\006(\376\353/_#|P;\325\244\337A\342?S\213\325\033\032S\3446\333\312}\245\253\370J\311B\201\366\302\220\214\017\363zcG\352O\3624\254\216\236,\275\205\021\324-\352\215\036\327UA\326\035\217Pk\302ajG\342h\201\222G\324\001\234\376~\232\215\034\333\271G\2262\326\3322\350\225\367K\256\322\256\012\202\331u\367X[\357\276N\007\314\255\244\021\275?p\330\374\371\323R\220\321\345\012\232I\203\232HPvoP_\274h\377\000\264\246,\272\332\036S\350\360\222p\331\361B@\031\364\005I\031<\343\357\241\277L\000\242\242-@x\260\210Wr;\373\330t\331G\345\030\227 6Q\234\007\002\310_\247 \023\307\323?RD\323\\\242\203x\012\317t\272\347nm*\243m\261R~\005E-!\251j\214\351K\2068t:\244\003\216\305\360\203\203\224\220\313d\205n\3003\037\330\042\202\010\242\235\325\356\247\271x\322\343X\227\033\004U\035\232\353\342IYq\270\313S-G\214\323h_\177\227i\206\360\265\034\255N\274x\334A~.\260\341\345<\245\037\243\007*\260\365W\244TyhCT\330/;I\001\033^iiZ\326FG\357\027\214\025\025\037n\020\224\004\343\032m\335y\355x=\222\023\364\326\271\276\352\241O\351y\221:C\215\311\230\343\240)!\266\320J\\F\010W\257\034\216\335\210\321#\373Pn\253+>n\2106\341HY\235+\245&Lv\236bB\320\244\026\335\360\322T\244$\022\243\351\220\234\363\216\331\355\337V\377\000\371\030\260\020\042\350\237\222\267}%\245\\\326\342\351\253\241\322\033\250-\312\241\371x\362\030R\324\247\024\330J\226\216F\322\346\355\304\002\010(\335\330gC\037h\2657Q\014]\3458\316\205\027\373\234\253q\323jO\201p\263NK\352\230\245\370\3370\340QP\\\2000p\010\343\005\007\007\0038Q\034\035\042\307\177\230\310\363\227r\264\200\250\303\031\300\341YN\227Wh\227|\273\262%\022|Y2i\262\234\213%\261\302\220\353g\316\302\307%+\333\205\244\237*\323\312}Bu\340\213\304\217\304o\0132Y\313]NX\355\376\322*m\177\245}[\240\334\021\251\006E\016u)\264;5@\356m\306\334R\001)\003\323r3\310\301\373\215eu=)i\004\367\037\2629\325\235\273\207\012\241\364\313\342;\251\226\205E\026\275\321kY\367\335\232?\342\241S\236\361\343\026B\362K\220f4\242\343\005x\363\004\202\202A*I9\312zmhg\221\343s}\373|\012\020\226]\327\362W\303\246\337\032\335/\242\376\313\201Q\207\325\036\230\266\302T\304)\015\204Hf:T\242LIn0\342Q&)%[T\364b[\334\254\341\004\224\350E\325\242#hy\004q\177\261\254|\011\312\276C\267\026\362\254u\317K\350\177\306U\205:\352\212\343\257\365\026\332\216\246_\227M`\304\250Ci9Pjt\002\225x\215\376\042\227\031\310>m\205Y\332R\324\307\016\244\020\377\000\3049\257\353\321h\351\303\232hd~\312\215P\325R\262\253\215lHu\304\024\371\226\224\270\231\015\340\355P)\341IRp\240\244\360A\310\327(tnd\241\303\262\327\373\301\042\212\260\216\311\217|P\333\257R\234r\242\353$\273\032R\\\3356\012\323\202\266P\362\210*\011\311\375\314\200\264`\341%\254\205kv\030\301n\357\375\372\370\252\006\222\027\265\262\250\265\011/\324\337\270bD(R\024\267\271\216XP8)}\012\377\000\226\240v\220\261\350G'\276\240\001{\203\277\217\232\226\373\256\376\245t\222=J\033\327\354wc%\366\322WQ}\214)\242\237\375\340\2401\267\2170\030\003\323\202u\223\3264E\354\361\001Z\032Iv:\353\225\005h\206\033\214\332\313\361w\204\215\2174\347\374\314\016\017\036\372\346t\332\311\030\355\243\204\304\315i\026\012qPj5f\336m\324|\313\221\011*Z]@-\237\242\201\354\223\333\214}\306\272\016\237\250\234\277q\310H?*\022\354\240S\244\311\023X\204\3059\367\027\204\226\210_=\316;\001\350?=l\316\326~2\204\330\327\313\266Lj\344V\221!\366D\300\234e\306\202\311\000v\334s\203\367\3223\315\273\010\254mp\240\323\323\357\221w\345\345\267\035\346\226@IB\024\225 \375\0108#\362\325t\240\227m(r\307V\267o\375\235\224{K\247};\251\302\271\351\350\225\032c\376!\220\275\351R\0068I\332\2406\347=\373\373\363\215}S\354\363^\326\200\316W\315\376\325=\256\374G\001w\365\317\342\017\341\232\302\223[\242\332\322\351t\352\342\334Q\224\005 S\333\335\236J\3456JU\216<\3059\357\316\276\255\242d\264<O\335|s\250N\315\306\212\250\0353\370\243\266c\365B\203\032\363\272,\0125\265R&$y\021\244\006\304G\217\374\242\267\024\242\026\225\037)9\004\034\034{`}\247\3737\036\254\370\214\374c\365\366[?g\376\322\272\023\340<\371\035\361\301R\237\355\005\270\253VU2\315\250\320g\326!&{\257D}Pb\264\357\210pT\012\224HZRy\311A\347\327\353_\263:\227\260:'\012-W\373Q\001xl\215<\232?\005Qza\325\373\302\237\323\272\255\215x\312\217W\351\224\247\304\245\322\226\372\3748\362A?\276i./jVx\3349\012\307<\340\353\267\2105\364\367\0177\252\344t\357,i\017\343\321Y{\0216\205\313IfC\026\355\274\212j\022\024\333\262\035\015(\017\377\000\227jv\366\364\316\232\004vFsAm\236\024\205\335\324\233\026\337a\326\005\325\323*+HIO\357nT\266\342H\373$\377\000?mI\230\016R\201\355\365UV?UT\334\367WL\273\250\025\2523\216\345e\022\223'\007?\373\276!\316\177\370\375\265-\234\023Ay\257\254\216\025\205\217|\337k\371\010t\0104\232\275%\306\302\234R\033Z\012\007\251\333\273\004~\235\2754\313\036\254\360\342pQ\332))\270\330i5Zt\031\017\343\206\331*\013\034z\002\002\277\236\254q\220\255\261E\323\272s\006,\267\337\214\302#\274\006\001S\253}m\361\214\251\005\303\317?\337\245\035%\251`\256\024l\230\225\013bCR\253\367\005)\330\241G%\352|\206\211\377\000\354N\314\217o\246\274\035\212\013\302\201\262\2247/^\254+r\341T\311\020\352UW0Z\016\207\233Sh\364*J\026F1\236\370\343Tt\255\002\234W\235%\035\300(\324[VWR\317\355\233b\341\206j.\021\342\370\315\007x\365\007\007\2023\351\251m;!z\203\263J6\247\320\304\262\245Km\347+\316$\035\255\042C\221\332W\276\023\342\021\237\270\347\032\235\230\265%\215\007\335(\253\022*v\350\220Z\350\014\352\232RJTU!\207\024\017l\371\302\217\267\2564\022k\262\253wn\036\\!\332d\372}T\252EJ\327\252\331\203\031Kk\2470\260y\355\275\037}Ch\344\212F\222\216-vGv\302e\377\000\031n\326%>\203\235\212@a\031\364\341I\365\301\354s\37554\254\327P\362\250{\242\361}\2449\002\221c\322\232q\334\004J\361\001W|\205\036y?N\336\274\361\241\311\355\312\240\220\270\320\356\225j\256\365N\236K\015\324P[>t\205F\361\010\007\323v4\240\232V\340\224c\0309\034'\333\3755\265*\0141:\273A\266T\331\302S&2\202\224\264{)\016d\247\036\235\300\321\035\246f\323`q\312\332\216_0u\255\006\370Q\264\272\237x\376\315\351\207Ei\360\372_\321&]T\252\334\272pl)g\003t\251\363\302C\216\277\201\204 a\010\310\011Ou\036[\254\263I\013<i\232\015q\365\205\321t\351\345y\015\207\276\026\226\273L\261\3729i5l\330t\312\235\251\323\210+rD\272\345Jk\216\256[\252\301[\353~J\312\236yj\307\235j#$\0000\000\327\346\376\270%\236c+\254\013\300\037\300_^\351\220\2666\000H'\353\364U\256\353\214\357P\036\215J\265\335g\344\344\177\304<\342\026\\q(\317/Kw\262\011#\204\236O\030\030\347\\^\243\247K\342\370$Q\357\377\000WS\016\2501\233\311\263\365\300I\213\336/N\272;l\316\275\251\221a\335\327\023\005\306#\317t\371>h\177\370\230\007$c#+\000`g\236u\242\375+4qx\333q\330\372\374\025\364\262\311\252\223\303\016\257T\262\242\365!\035\017\351\305J\347\275+\320\\\353}\354\310\252T_-.B-\2327x\361\231\216\337\235\327^)\316\301\311'$\204\240d\232ZcC\2464\347d\373\016\301VXw\277\312<\2154=\325]\271\257\024[]\036\253\301\240\333\316\3337\275\367QT\351\257Iw}F\275\234\250\316\250\004y\033m\261\204\265\035%I@\306T\245(\220Mf\253\374>\023\005\027d\373\217S\373\004hb\247\2319\256>*\262\364\227\242p\247\325\246\336u\246R\365\275DV\346\013\311\312fO>d\347=\322\330\313\252\364\311@:N\042\032\322\357L\017\217\374\031V\221\205\306\217)\321\320\3135\253\247\254\220\256i\250w\366dx\362\237\217\344\316\304\355\333\343\237rw\355H8\357\367:\177\246iCO\210\341\330\237\372\205<\345\316\330\336\313H,\250\264\273[\244}:y\310p\343G~|\333\200\260\000IR\034x\206K\212\037\211e(A'\267\266\000\326f\265\355\270\332\336\326k\342k\366^m\275\322\0223\201\362U\306\367\271\2469bM\236\324P\232\315\301.w\204\254\356X\210\222\226P\275\334a\030\3616\361\334\376\2144\324\033\033\313\225\342\255\345\327\370\177uR\177\364\352*\332\213\005\257\015\371\357\2544\010H\011\336|\243\217a\221\372}t\366\237\246\000\300\336\345D\332\335\304\236\345Y\012\365\006\233X\254\374\254w\030\225L\200\321\204\332\220\274\245n2J\026}\263\271\012O\377\000]\\i\177\313\274!\031\261\265/\272\305\324&\254\253J\271A\240|\313\227\001\010\202]\012\302Xt\247>\032\000\345N\244\034\250\366F\356Nt\327R.#k>\012\220\220\011.\372*\252|B\365.WN$\321]\206\343u).R\330g\344\324\255\242Qq \270\262\256v\354@\004\034`\251C\353\253\210\013&\241\305\017\372\201<\345\261\012\345)\345^T\371t$W\023&X\266c[\320L?\232#\305e\2045\265ax$\003\271'\261<\216\374\353/V\010\220\355\026\211\247\220\026]\343\225[WQ\255Uz\315G\275\235\227!\352C\326\304\030-\253\321\305,n \017d\224\244\376\177\230\350!/\206\022\323\315\375\177+\002R_\250\022\016)\035\331\026\342\355[\327\250/\341E\225\265)\307r\222Nw%\3006\347\2220\243\357\307\032\253X\\\302\327\242\301\020l\204\204[\326\231L\302\351\265\335V\245\310\012\216\266\261\034n\307\210\343\270m*\007\330o'\3759\324h\242\015v\333^\3268\370n*\264\364\252\252l\233z\220\265\246D\302\363\246+\215\266\222T\350p\025\220>\245;\360~\207Z\315\216\337\345\341f\351\235\261\241D\364f\341\205o\303\272(\2626\314\371G\036v8\011\312%\265\270\340\201\236\010RPx\310\344\037s\246'\201\304nC\321H\032\013}\021\235\271Y~\237S\242\022\246\200\233 .2^\000\245k$x\215g\266\376\352\036\212R1\353\254\360\333;{\246Y&\337\315;\355\212\225B\333\272\337Tu!\251\245%)x\362\024<D\223\221\376a\202=\371\032^;\016 &\210\012\310\273T~\340\245\261rS\030Bf\005%3c\347\262\200\000\201\216G\246\017\333U\224\026\235\301\027u\341\030P.w[\247!\245D~K~*\237e\007\001)\0058\334R9.\003\310Q8\030\306\016I\324}\343kh\205\002\023|\247\005\251\323\353\012\370\251Vb\271o\323\244\245%3\031\010J\232q\266\217\000nN\010 \236\336\207\032\016\340\371(+\227m\031F\324^\213t\372-BU5\250N2\367\206\024\210\353spx\003\225\025\022w$\000\0226\344\205eG>\\\027\214,\002\231\310I\266k\354\255\267N,\033zKT\311\237,\333\216\267\015\370\200\204\247\014\0071\274'\034\000\244\247nx;TS\3008\326\226\210\321\265\233\253\231\300\252\335&\201\042\321\352\335\302%(8\333\21579$v\003\033\016\017ln@?\231\355\255)4@H\\\202\315V\346\362\250\343\325\252\277M:\307p_65\320\357N\256\366\252\311~R\037\217%\332U\305\030<\255\314\311\360\320\265\264T\227\027\265\301\275\001{O\220\025\005\017A7\335\3446k\366#\370(\263\306%m\253G\361\263j\267\361\013\321\013_\254\335$\231D\270\323Fuk\254S\342\274\314\346\245Fq)m\364\0256\245%\016\264\244\266T2<\270\316\010\347O\255\351D\261n\204\335}\025\231\323\265\017c\314o\340\254R\203jG\244\334\020\255\301\025i\247`\324(nm\316\326\362|h\235\363\224\224\222\007\323\353\215|\372[\004\023\315.\2128\300v\336\334\204d)v\352T\362j\022\330\375\230\361-\207\324\237 '\260Y\307\224\347\200}\177\236\250\310\303\371)\242[T{\243\236\235\267w\364>\353\242\337\366\022\3444\374g\274\256\267\225!\306\373\256;\210J\274\315\255=\323\353\302\223\310I\013\274\311\246x\231\270\037\\\373#\305\003j\202\270=A\244Y\227\372\341\365g\246P\232\213I})\231pP7o\375\236\353\204\025K\212=XR\371V\320\000Q\311\036c\215\311\337\033\333\342C\221\334|P!\017i\331'#\365\037\332\012\261h\362\2515\371\025:\033\014?H\224\326&4\205a\271\230$mX\034o\301;\\\037Q\356\012\020\304n\333\307\177t\340\004p\235\252\351\257\355e7q\331\363\032}\033\027\032}9\320\017\314\260x[.\001\346C\250\317\007\261\375\010gQ\245/\026\323\354G\252\274d\017\304\270\255\2332\275i\310\250\033u\365\313\212\301(Lb\240R\342;\024\036@X \343\012\340\202A\307:\344\264\356\222\011\2139\256\313A\355ih!\016\242\227\032C\342E\265o.\327\222\333\204\2523EH\330\254\371\202\020\255\310@\317\360\215\243\333\032\004\262\266W\\l\332\204\346\020\021\314:=\303\031\325U*2\034\217\004c*SiAs\234\004\361\312y\343\337\221\255\355\006\236wS\235\206\241n\027I\201P\2416\303\2155=\370\321\036Z\006\337\021\344\244$\237@N\001\357\247\265\257\333M\354\246\307\013\304P<&\321\362r\003\204gq\016\007\021\234\367I\007\037\226\227n\233vB\235\325\224\313\242ZMW`2\373\253a\013c*\336\225\014\023\236>\277\\\034\035k\351\264>\213?Q\251\242\264\177\242U\030\324Kn\003\263\231m\206\000\015<\224\244\204\340\340n\357\333\237~u\3354\206\304\0360B\371\367Pi|\244\016\353\000\277\332A\322\336\253\331\235{\253\324\026\335e\024*\216&\322g\260\351S.\264I\341+\033H#8) \220}N\272h\265o\324\304\327B\354\201\225\362\316\263\323L3\227H\334\036\017\360\253oM\355\232\375\357J~\221s0\272\310N@\\\350n8\200x\031+\012H\376\277\317[\335:\031\\\332\227%s\304\007\202\337\335j}\3076\037U\376\027\354\356\224^\265k\307\377\000R(\025\006\223\002lhfD'\351\310\033R\034w\306\361P\342G\223j\220A\000\035\377\000\303\255c\323O\211\3427\270\312\322v\254\272\001\014\235\2169I\233?\244\215QT\252\205>\330\250\325\034\2142\353\223 \274\336\354}\026\222\007\2560y\323\261B\031\361H:0M\264q\352\275\257\011\365\016\254H\217g\256\307T\032ln\022\230\316\255\264\023\333**so\247\242{\366\366\325^\322\363@!\275\333\374\275\202\340O\301M\226\244D\256Ui\225\2311V\342R\2444\342\026\200x\311\334\247\007\031\317\351\351\252\016\226\302r\231\2161\030\362b\323\346\245\360\353J\241Q\214\313\025\367i\321b2\227]J\2463\373\343\220\012\026\002\024\264\366\036\240\177-\034AUX\370\042\310\301\227 \2722\357\251\365\264\275\032\320\207L1\332>\014\230\317-H@\365>.q\376\232v78s\302\316\033\236\354\016\021\365v\350\277\330\212\304Z\235\311\014\307RJ^C\016\204\274\204\221\353\216q\203\337:1q\252D\360N\355\307\367P\3355\267-\033z\277&\243\042\355\274\350\323\237Q[l= \206\034=\370\005J\340\203\236;\373jX\0241\201\244\366M\212\377\000Nm[\251\341=O\316\247\325\\\001\042[R\025\347\035\274\310Q)P\372j\346?DG\201VR\006\340\370_\201Wrw\316_\356F}`\0144\013{\323\364'\224\237\376'\355\245\246\322\266Np\253\033H62\223\022>\036/\353Fs2,\033\252\342D\206\224\024V\225\011\0370\237PR\346\001\316;g\353\240}\324\263\021\225;\0116S\0125\321ySd\261\036\365\266\352Ym#2\032eq\235'\267)%IW\036\200\363\247\032\343\302\207\207px]\227\205\365@b\233\016\242\335\253U\256\306I\375\357)\000\372\034(r\203\337\277\267\247mz\\\014\005\033\354{$\244{\242\325\270\256\322\363\335>\274-\252;\201)L\224JL\200\225c\222\3522v\214\377\000\204\350\014$\233!\031\227\302\237\254\331\326\373U\007\\\245\265\006\243L{\376b\333u\324\254\037u6r\001\343\036\234\350\273U\036h\371xP\253\260\350V\313?\265\255\252]m\351\216\177\012\\sf\343\356\220;}\317\247\2464/\273\006\222\341\335]\204m\033yS\310b\344\247!\014\325 DvY\033\316\346\026JA\364\317\345\252\013\030M\006\236\350\000|FGr\262\315\042\342\263UQy\005!\303\016C1\203\230<\240!\336s\351\375\347Y\003\250\235\324\341knM\036,\177\342\274\235\021\370\334\235Z\251\322zOE\203/\243v<5\376\320\375\221%\326i\364u\276\001!\371\252l\370\217%?\213j\225\261j\003 \3604\244\261\3013\211\221\244\224\376\226Y\031\264\014{\253\271\322\316\273\364\253\254W\314.\217\331\375O\217\327[\271\300\252\335^\262\363\2121\351\201\200F\031mI\302\022\200p\220\224\2419P#\236G\316\376\321\364\301,NsH\215\203\260\313\212\355\272\027Q\014\223h\267<\343\330\013\\\327\227\\:{V\231\007\244\035%\226\272\325B\2415m\310\\\011\0363\212\003\205)\367\020q\273\011Q\360\323\214 \022p;\362\3757\354\236\223N\337\274k<\2617$Y\267\236\300\376\345u:\236\2673\335\340\301\231\016/\263}O\304v\010+\2511\254Z\003\226\3537\003f\241C\246\255\005\024\344\021\231x9)\365\000\254\216O8\035\365\363\037\264\275r-f\264O(\250\332|\255\355C\200\273\256\203\323\344\213Nc\217\361;\222Ua6\263\267eJ\344\353\277Y\343\273\006\335\361\334~\024\023\220\252\243\270\303l\266\236\341\204\004\245%^\240`q\223\254\326\022\362\355L\242\207a\373~KST[CO\021\343\234\241Z=\203tub\375\210\354\270\222\225rV\343\376\320}N\020\226-\332\032\011Km'\331o(g\337b}24\316\237L\351<\317\345\331\370\016\311ML\354h\241\300\300\367=\312\357\353\0136\255\012\333\205m\322%\252-\225\037(\012a\314.\246\351^V\022Fw\357P\363(p\022\000\3161\2579\254\024O\341\034!\014\264\337*3\243\222\252-\271\177\334\257\276\201\012\035\270\362Y@\362\356uK\004\004\244\037*@l\217\257\256\2645Z\202 s\317\247\352\201\034{e\003\225t\252\260e\325!Y\226\344\305&\217\026%\002\236\211;N\341\020\026S\274{\344d\201\333<\017]s\336\014\256\324S\261\200\210\307\265\261X\344\332C\365*](L\225X\232S\012\227\021\244\304\204\310\332\220\334f\362\020=\006O**$\001\311$\000H\354\264ZF\227\332M\307\313j\232Sz\235j\\\267\323\027\002n\270\216\364\362\327Rk+\207\000\207?nLi\177\270e\311\012\362-\277\027b\303Mn\317\206T\245`cZN\221\233\215\232\015A\205\306GST\215\275\3267\255\276\206]\235[\273\3423j\260\252\234\330\26445\030\274\343\316-c\303\360\320\242<e\357S\207$\204\225%D\341#:\317\216*k@\377\000bT\276J\334\347b\225\026v\356\270z\245z\332V\364\251\262\240Z(uJ~;\222\267\270#\244\027\245\274\373\347\005o8\224:T\254\201\225\015\240\0005f\017\362\006\366\037V\227l\205\365\330%\335\367T\252\365\032\353\253\\\325$\241\225\273\211(i?\202;G\376K\011\007\200\224\247\003\037Me\357\177\210dwu]A\017\366\\7\374\317\227\263\250V\224U\376\361\346\331\214\343{\006\022\313J*;\2069*p\216\377\000\341?Mj\303D\217T\246\245\304G\263\327\013\226\234\371\213\373.\332a?5[\217\005E\260\022T\206\302yHs\035\217#\003\324\0153\251\210\213z\244O\310ot\305\264fTE\337{V\252\311K\313q\300\352\333P\302\022\214)$c\320m$w\325\304\236RQ\032\323\275\305AW\346&\267\322#CRR\247\042\327>I*\316|V\020\024\353j$q\222\017\177\247\271\320\341\217enU\220\357\214\217t\272\240Q_h\260\317\312\245\365\263\340Mi\245~\027\024\312\225\2718\366(q\301\357\367\326\230up\226\021z\240\232U S\353\012\224\304R\200\035P\015\2367\266\254\2056O\177\302\254{\347\235\020\352\015\000\022\342/5\246-\303E\211:\236-s\263l\230MT\2512\223\335\267\302\225\345\343\261PN\017\262\222=\365H\344\033\267\267\221\372\243M\030\333\260q\312\236\223\\\223\017\366\035rTT\273V1\031L\224\005\355/$\371\202\200\347\331X>\343\236\347P`nZ1|\042\357\042\211\364OKZ\3704J\204\352\234\026S>\014\330-\316m2\026[fS(q\010u\012=\232y\001\323\311\030 \000{\014#\000!\305\216G.\025\270+\207\012\205\031\331\261\320\266R\226\267\247'\271\011\317\177\267c\366:jF6\366\205 8\033D\364^\240P\272S\324jCuW\314hO\270\230RV\244e\021[y#\303qd\177\313F\354y\210\333\224\343##4f\234o\261\312\024\322\032\272\302{T+t\372\025\372\314i\216!\327Ki}\277>\325\006\362Q\345^\010\356\234v?\314\035U\361\355\223u*1\24001X\256\232\327\004\030\261\334\001\231Q\324\254%`\234$\372\214\377\000\247\247\270\321\372{di\310Hu\030\303\262\324\017\361 \334{f\251i\337\353j2\355Y\317\271C\226\371;M=\331\010\375\330>\212\012u\274'#?\274\357\307\035\230m1\247\267\013\033N\360\353aY\223D\251*\374\270+\266\024\247QI\277\231+4io'\3672\007$0\350?\210\035\270\301\035\363\265Y\034\345\030\367\222\333\363vZmqk}\227-\231\\\252t\372\375z\355\265ij\266\256X\377\000\270\277-\005;\377\000\017r\322\035\375\332\2461\220\240\352\021\311\334\244\0256RA\367\\\3037\204K\232*\277\023}\275U\246\211\317\033O=\212Mu\266\327\242uN\035\325v\364\212\004\373j\347\246TD\267\250\352\011\361`I\306\302\3538Q\012\216\346\306\311\307!C8\343%.\242\330u \272\014\021\333\321\022\010\336\326S\371\035\322.\313\274\221|[u4\265\022\223\012\341i\245\012\225\042K#c\201<.C9>vG!\326\360T\327\342 \266\012\223\201\037\004\016{\202\237\203Q\274\021Y^\266?U\245\331U\005P%R\3423Oi\362\027\000K\303#\007\005\245\266\363n\020\200s\202\225%I\356\222\001\306\222:\267\262\332\366\330\364\377\000\320U\243}\032\343\363WO\246u\032\015\371\042ek\246\317H\266\356H\355)\351\0249%\017/8\302\335\212\244yd4\241\220\266\306\325\347\222\222\025\235\033K\033\036\355\320`\216\307\370\355_\257\262x\315B\312)\262\356\233b\227p\324\202\005-LH9}0\344\004-\247\301\357\341\221\224\253 \344c\221\234\347\2357\245sD\231\252S\272\377\000\017)\250Ul\263p\271q@\257\242\336aO%\326\325\275I\312U\214\347n\340H?N\304\344w\327\265\255\203\305\022o\333\307th\\KHvS\252\005P\326d\261>c4\207g(y\336e\242\204J\300\341^Up\277\\\201\264\216\330\355\256c\250\203$\233\200\363~\351\250\3156\273\042\264t\361\211q\347\\\324Zs\256|\272w\312a\016\220v\204\362\264\2020q\216FG\276}5\275\3224-\3243s\271\013?W\253\0218_t&.\233N\355\243?B\207\016\242\227\260V\324\340\313.1\035~\213Z\202\211\301?\341\317~\304\215o\302\320\346\226w\365\244\243\336\346\270;\262T\325\350\251\267\246\246=B\232\315N\260\352\203\236*\337S\303j\277\2139\310\007\320\014c\2365\317\352\372i\007\042\312~)\232xS\224\213\177\346\035Z\351R\032jV\002\334\210O$\177\213\034\2203\306\177\\\035\023K\242\014\341^I\032\005\246=\263N|\317o\345\220\247+\0018Z\322\361\011)'\214\217S\372\353oL\3175\005\217\252p\036c\302\275]%\361&\306\231i\315\224\3127\260\224\270H\336\234\376c\035\217\266x\372\353\250l;\342,\365\013\220\325\2741\341\343\201\312o|J\3304\011?\016\262\350WLX\265\250m8\321\212\343\251V\350\216\222\006\366\324\220\245#\203\3506\236\304{\023\3546\222Fj<\307\233X?jul|g\030Y\361`\364\323\246t\330B\224\3251\365\273\370\224\261\035m\356'\200I\300'<\375~\332\373\214l\3320\276X\034\007\3010 t\302'\212\036\245[\341\246J\366\245\307\020\222q\333?\274\336\007\337W\305eV\315\360\247\335\350\354\253\205\365\3045zTxA9q\231S\345\270P\256\334\206\224\332R?\372\236\332\251\003\224C\216\012'\260~\036\255\333:D\212\205^\245B\251\247vv4\302\366(d\360\245:\342\211\003\350;\376\232\243\311<\005V80P\012v\350\377\000\322z{m56\223Hm[\207\206\033\210\025\277\236\311\302O\3755,\265W\310}\022\272\354\252\331\225\230\362i\352\213H\232\226\322<8\317H?\270X\374;\220\234m\036\370'\030\325\3068R\343\273\005U\252\332\247\271L\251.\215\\\262\356\347Q\271r#R\216\033\214\330>\216(\035\370\000\360}\273\363\253\217T\000\\[\344\312\004\240W\304\272\204y\324H\263\357v\200\303\351m\226\020\334Ed\003\261!9$z\344\236\374{j\003\301\310W\020\221^\352^\367\262\256)\362\223^\2468\304\267\036H&;\211\333&9\364 d\002\236\334c\214w\340h\233J\033\333e\177)U;\272\234\332)\025V*\216-\244\025\241J%l\257\000\360T\016Ry\365\032\263Ij0w\372\020\277\212\257S\356\245*4\271\025;jZTN\324\311\336\333\234w\001\301\316~\372\365_\012\015]\025\033-\267\331yQa\042{N\240\355m\366\337e\326\326}\366\005(\217\3178\376B\036\323\352\274\001\274\004cf\335\027\205)\022\241_\037\262\246\264\243\206\236p4\222\264\236\006B\266\363\365\301\365\357\351f_\005\020\200\032{\256K\226\251Gd;-\026\351\223\345*\042#\010\016(}\201\3479\377\000]N\007(o8\260\022!\216\262t\322\221Xp.\303\272\033y?\302\354D\360}\302\363\345\365\355\355\241\231[\330*6K\344ZT\325z\303\323\232}\305&\255\042\201z\313e\3077q!\305\264\216x\012mK\300\003\267\034zz\015#\367\240\016A\371\042\267\031(\354|W\364=\232c\261\252\363\025N\343\367-G\216|V\375Gt\360x\367\325\235\324\340\025nR\036\356\341{\177\352wM.$7UZ\356\331\241\304\215\2568\354|\224\372zv\321~\361\031\312\226\227\236-<\242X\0263\021V\372\255Jl\210\212s*rt_\035\225\257\036\205[\202O=\262>\232\007\200\000+\245\023n!\334\037\337\376/\364\313;\246\016.D\267)T\252|\224'c\310a\0166\034l\014\340\245\035\377\000-.\370\233WI\306M\235\244r\254\337C+6\305\032\205;\244}#\261b.\277v\217\227\253J\212\200\304\267#\204\225\010\255\273\214\241\202\001[\213W\246x\356u\317\353\341\201\247\357\032\237\302\314\373~kgI,\200\355\203\016?\312\2716o\303\355\007\244\364\027_\242Q-\332m\325%\217\016T\350l\244\204\241]\333\216\242\001\331\330\025q\234{k\340\277o\276\326K\257>\034#lc\217S\332\327\324>\313t\306\351\274\362\035\316<\252\371_\266lF\356\026>z|j\245Y\005OL\225)\322\250\360\231O\342)O\361\257\333\000\344\366\327\312\364\272(\337 \027\236\344\256\371\372\311vyp=\007\351j\214u\017\256\364.\263\374AY\035,d\324\334\267[u\3057\0022p!SXmN<\364\205\236\022\343\201\260\200\224\202S\275#\216Is\307\032\235Hc0\306\337\310g\347\352\241\332\177\002\034\362\345j\352\364\307z;\322\271\222.V\042;\325;\345\341U\251\303B\212D\012r\222Dx[\207\2304\204`\0200T\242\241\330gOH\3675\233]\370\235\223\360\354?$\213<\362\027\267\360\267\003\373T\202\241kU\257\033\2225R\251'|\227\224\244CO\036\014F\221\335Hm8J[@\034\000\000\316\323\316\242=9|\233\234\214\347\206\212\010\203\010g\242=X\272i\362\225\026\2251\015\321i\213Z?\030\013-\255\320R|\345JP \017a\357\240\365S\342F\030\016\011\037\272\266\225\333\\^yh*\375\337u;f\304\261*\367\255\335Y6\375\253\022\236\314\231\222\336\302R\226\322\330\010N1\225-D\004\245\003\314\265\034\014\347OI\007\371\035YYa\325\317\003\364_\227?\210?\211+\333\342\202\360S-9:\333\351SRP\212u\014;\204\312\001\177\363\246\343\376k\247\277\206r\332\006\000\004\202\255t\332X<(\374\377\000\210\376\236\313\234\326j\214\357\332\337\303\373\253\033kP\031\243\333n\2750\042E6\237\000\225\266N\023*[\252\033\224\243\334\204\244%\000z\014\377\000\210\353\022g\362{\005\325\351c\333@vP\277\0207,\3316\257A\372w*C\337'\026\233\042\342\250$\221\227%\315uJH v\330\323i@Od\202@\035\365\247\247i\261\273\375G\357\225\227\256\227\312\030;\233) \232\204\252s\023\235\204PeHh\303a\013ARp\263\205\255Cp\316\324\347\003\221\223\317\032V\021\277s\220]&\321C\272\237\2478\314\006\222\247\235[\276*\313\252B\262<R\237U\036\017\037OL\351FH\017dv\212\000%\003\267\014\232\265vEQ\015\007Kj\303%\302ANI\300\003\260\007?\370\311:\324\323\032\031YsK\271\326\233\366\014ED\257CJ\2332$\310C\317L\220\264\361\273o\037\314\000\006\275\252\220\270SxMi\333\264\202G<\243\226\343\276\225\\NF\377\000\3634\246\222\201\234\2707\247?s\214\377\000?}g\011\035T\264X\306\331B\220\251\316\242\2276\022[y\021\324\342^\332{nH \034\373`\237\357\215:\307\220\324\257\207\232h\302\361\207\011\266\345\303p$\245\306\334\334\203\236\307\375~\337M0u\203o9V\032b\010*:\243E\214\322\327%\262\023\227\222r\236F9\317\363\376\373hn\3248VU\035\246\004\037e\033rGn\\\013U\370\254\272\024\321\223\034\020I\312\203\241\301\267\237@\261\372i\2759\243a)+n\220\305j-Q\332dy\013[\242[.xK\363d)$\225##\320\362\256}tr\343hRn\253)\275d\251S\255\026\042\314g\305\212\342\247\307\220V0R\312\331I\316\356\343\361\221\365\374\264\031\037N\244\324t[KG*\022\334\217\006\227U\2473\272d8\360\334-\253\004\251\005\260\024\222\007\241\302\206}\365:\207\273\226d\242\264\023\202\251\277\306\264\265B\277-\232\334u\273\037\346i-\277\200JK\254(\247\312q\366\301\364\343\351\247\241;_g\320$54Y\2251b\374AT\253\020\350V\375q-\324\212O\313R\246)J\013\212\352\312T\333K\000\034\202\266\333\332G~Ry\000\233o\017v\332\370!\200@\334\026\201[\267\365=\272\005\273\325\013^\250\042\323\014f*\263c\310*\021\246\300\3636\372]\004e\2254\260\244\227p\013jG\230\355*\326\276\216\006\320q\343\370Y\272\251\255\270V\262\372\251t\273\254\2351\251\364\322y\252C\245\327\351\313K\245\262]K\000\024\251\017\015\245KAB\203N\245\324d$\243\220F\016\272\246\351\242tE\2565c\344\271\317\362G p\037\370\261.]\042\341\250\336sm\231/\272:\345k\270\345R\213-8\216\345\325\021\243\377\000\024\320\364[\300\243\305\332?\026\355\351\034\253\\\224\320\222\362\007\343o\353\353\375\256\245\256\306\323\301O\256\242\365\026\025\032]\205\325:\233\015\042\332\231!\230\317\315\015xj\241Oq\242\266\334\013G\0424\206\320\255\301A^\033\255;\237'\011\266\266v\202$\355\373\177\352\364L\365\372\364G4\376\232\321\252w\245\255\325n\2345\012\035m\001Pn\013}E!\212\234e\247j^c<%iRY\012Br\2056\022\244mRpC\030a\042X\377\000\027\004z\243\331\007c\307*\221\365C\242J\240]\362.\353\011\307\345\322\244\324\036\224\312\020\255\257\307\220\223\275l\022\236Z\222\321V}\324\214(d\022\007/\257d\215ysN\017\036\251\350\342\034\205\003X\351\315'\254V\214\372\325\260\304ZwQ\350\273[\251\323K\001\241>?d\276\332q\204\2559\010ZA\333\312\024\237)(I\243{%a\261\346\034\377\000\007\376+I\016\354\016R\202\302\205[\265.&f\322\344T\255\352\244I\001A\306T\246\234i\304\340\034r0A\340\202\010\367\030<\344\352t\356\215\302F\036;\250\3234\336\322\264\232\232h]n\2461P\251\323\241D\352|8\312K\353\216\002\025[\2162T\373\011\355\363\015\221\271ma@\244\225\243\200\240\235x\213u-\335T\361\372\373\217\344&K\203Nx(z%\263[\266)\022\326\272Uv\360\266\321\271\346\327M\217\276LP;\241M\234\037\363\014g\262\261\216\006\262u\275$8\035\227I\250\247-\312~\364\302\342\215U[t\272\025Ab\252\266\363\035\022\231q\262\205c\360\251\016\004\215\303\374$\244\237C\252t\315>\320cp\260\256\347\203\233V\216\234\365U\230\324\267&\355\240V< \034M=\347\001|\247\271\306A\000w9\310\031\356}z\015&\225\355x,\301\366Y\362\352\032\360Z\354\240\032\342\242\323\011\254\313\244UcEB\024\227_`Gz;\245J\356\245oJ\224\277BO#\034d\036t\013\313M\237\370\202\306\002*\322\315\351\264\233\2055\007\230\252\265Sa^f\331J\\\216\363G\003\314\331<\014\017A\220q\317|\350\005\341\374\224]\245\270Q\020\346\334\024\307\223\032D\031\025$ \245\330\217\244\200\370\037\342J\207~8\367\340\2024\246\307\207e\\\274\234\247\015\002\351\361v.DYi\332@Z\224\331C\2129\317 w\347?N\371\326\204Nun\001/3\033\301W?\247\365\267\0321\347Ax\2719H\005$\236\343\327 \236u\325i$\334\333\\\226\272\034\321O.\264\337J\251t\2165\001\347*\361*O\276\007\213\020(8\2202@\311\004\014\200\0078\357\256\323\354\316\231\256\224\273\272\371\357\332M\301\230\340\254\305U:\363\242J\235Qz\325\352ljO\001\223O\234\036S\352<\022\264\026\332J\007>\253'\036\372\356X\3074\373.!\315\261\177\312\264\2665\032\337\200\213q\035@\273\243Z\364j\212\374/\016\246T]me=\226\246\267\251\004\3622\006\0229*\003S,\245\240\355\026B+b\306Uq\353?\306\355\227\360\353r\334\375<\351GK\251\267\264H\317\026^\255K\254\316Re\220|\3063A8J3\270\005\236TFx\007J\267XFdJj\234\340\355\214\013\241\037\031\035#\253Tm\323i^\227!\247T)\377\0001PnE\261!\246`J*#\345\303\3139q@\014\225xA\003 \002Np\304\032\200\363C\262\203!\274]z\242\227\372\231\006\276\266\342\332\260\253fK\237\201F\237\035\264HWq\275XZ\266\363\351\263L5\271E\243\330/Z\355J\374b\202\344*\227MiU'\024\222\227\242\266\342[m\304\020y\362\240\244\223\307\342)\003Ww\240R\001\253\356\250\345\371\327\231\326;\214\332\223\372\027s\333\364\360\263\3429\022\\f\324\023\352\226\313m\001\217\241W\277q\244f\325\271\206\213J\363\011&\300\0018\272\027\324+z\352\245\256\005\022\203Y\266\343\273\227\026\341KlJB\271\356\264\244\216\376\271\347\276\235\323\310\327\014\012W\026B\262\264\224Q\250\355\313\235MjuBZ\363\342;.@u\327\025\217\3428\030\377\000\\\351\242k\005\0142\202\257WU\332\335.\263P\2237\247\017H|\245IL\2650\225!I\347\202\257\\}\365Y\012\033\234\342xJ\006\253\260\356\272i\245\307\260\255\271a\307\216\\\216\332\235q\223\237\302\266\367\245\300\177\370\347\236\300`hm\005\\\273p\252Gv\2555\3100\327F\233b\307qx*K\223\241HR\177\017\001.\223\220\007\003\337\357\235X\214#\306\303D\021K\375:\336\273+\353n2\355\372\214\037\227\342$\310\323\336\014\270\016|\245;\2709\356\010\375uo5\2525\266=\302\232\215j_)\024\366\\\220\252uH\250\020\222\362J^NO\272O\035\375\275u}\246\357\262\2276\260J;\237\323$O\230\312\245T 9=\321\260\266\031B\307\330\223\317\323\217\373\352\000\004\2535\203\261K\273\266\314\247\302\377\000\366\310\361(q\244\247\361\0051\260\021\216\331\000\363\375\373j\357\214+\262o.\324\235\237\323\373b\255\025\317\005iMCqJ\220a\003\341\237\362\225\347\372ic\247iC\017x\312\035{\341\246k\352K\254W$\276\332\206r\342YI\037L\000\006\007o_\276\227=9\276\250\355\310\267\034\256\333\217\256\3758\266+\312\267\242_4\231\350Lt:\353\220[|\260\002\220\012P\245\004cx'\005$d\036\370\355\254\251\272\223C\250\025\322\010\361\274\214\250w.\216\262\335\356Fo\247\364\033m\332T\214\024.T\217\015\347G\242\222\205\000A\347\357\364\320\234\367\236\025M\327\224\345m\327\302=\233|\364\242\233C\264\236\243\333s\372\237RlL\273\353\321\300Tkf\007\012E>!\013R\244Mp\340\251D%\246\301\3762\000\327\023\366\255\333\243\3357\340ooS\353\360]gA\2105\367v\362\023\207\253w\\\373\256\271N\351\245\215\373\332\304\225|\261p,)(\377\000\022\224\243\350\007rp\00603\257\316\235E\322\353\246,\323\267\035\317`>+\353\272\0073L\3014\307\340\252\237[\255\313_\240v-`<\323WOV\352\315-\206'\270\361)\2444x+\010<n\365\005]\270<\014g\017V\031\245a\215\231y\034\256\217\247\023\250\227\304v\030;z\252\241\360=\360\377\000\022\221~H\352\375\303\0155\012\254\270\257\316q\307\222v\307\204\016\022\202N0]P\317\276\000\343\032'\331\255(k\314\207\320\237\313\376\237\321\027\257jAf\301\3114\245:\313}\016\240\365>TD\272\252\225vB\3676\206\325\373\266\221\275(\360\323\223\312P\225z{\036\372r\035K\035=\014\224\030\364\306(Ap\240\203\372\225L\223J\217*\233N\013\025*\203\177\263\320\226\374\313\217\031'\012\332\237\363\253\276;\201\364\326\226\254f\243\344\341&\301b\335\300Lx\275,\237\013\246\335\032\351}]4\330\223\205I\332\223\361^ \241\264\207\024\260W\214\347hQ_<\002\223\334\2025\215\251\351\362x\221\306\323\233\312\274\032\220\326\274\270]\254x\377\000i\317\304\375o\255}D\247\364\256\316\255x\335(\267e)\212c\021TCu\027\2226\031\256\036\013\213>d7\236\022\234\340\002I\326\366\216B\351K\301\362\267\217\357\372X=Q\205\254\014o'\237\217\374U\003\246\026\232\344\334\210\244x\310qq\231\361\335\011@%N\347\003\237NU\247u:\263\264\227\024\226\227MO\015\035\225\301\352}E\026\257O)6\360qbuA\360\342\212Nw\264\204\366\307\261$~\232\306k\334\352\013rIK\033^\251%rUaU\252\254\334\225\0047%\326c3\031\235\352\300!\264\004$\343=\200G\333\355\255\042\347\346\273\244\210\217\361\236\311Yo\326\\\256\327&T\326\245\010\361\224\266\242\020\257+\200\376%\014\236G\034\034i\343\037\207\025W<\254\310\237\276K\364S\327%QL\022\323e!H` \236\370+8!'\373\376Z\313`\242@N\3178\024\270\255jLY\022 \031/\006\374W\203l\267\2373\256w\302~\303$\347\266\234ypm\000\207\013Z\\\0118V\022\274\270V\005\272\365Y\365\263\035\325\2542\300P\377\000\232\263\374 \016{\014\376_]\023G%\222\302\235\325\323\033\270.\276\222U\031\275\231\254?\035\266[n<\267\030JW\370\226\330JJVG\246w}\2605\035F\015\203s2\275\323\265;\276k\212\205]\247W*u\370\260\303\311[n\354o?\306\234\221\270{\017O\260\372\351s=\304\032\231`\377\0001%\015,\312\005\004\247\300\012x\247<\002JO\260\365\355\374\264\254O.4\232\232\266\330]\225% \323\330b;iL\214\371\300\030\004\223\311\007\333W\221\366\340\223\215\324\013G(!\367K\022#AHq;W\270\014\235\243)\031\377\000\247\351\355\246\243\230\206\320H\276\301\245\365NR\34592\024\240\265\005\244)# \236\027\214\201\355\317s\255!-\262\320\032\333$\025\327\323\313\232-m\273\326\200\016\370\361\334O\204\244\347\012AqA\305\247\234\367JF4MP\005\240\217\253C\323\314\011pW\273\377\000R\034\245u2\306\265\252\2023\024z\205\257%\252\242\227\370\231\224\313\215\004}9\361q\203\352\243\253\261\266\373q\254~\250\357\220\212\241\352\224\377\000\026\246\005N\225\323\272\203\211e\261\016\004\210\256\272\242\016@ZU\377\000\364\204\223\377\000M==P\244\263\315\367\302\256VE\270+p\247\320]\333\035\365\305\361\233\033\206q\374$}\002\261\366\317\333I62J\263\033\212Ws\244W|{\027\247].\243\326&\302\202\211U:\272\320\265\247\367\221T\247\300^}\024\312\311\312\222F\025\347\007\361k\243\323\313\261\255\316r\221t@\202\231w\375B\245gVlzCU&-j\232\230tAC/\341\020\337aJob\012\225\205\262\353Ik\313\234\355N\336p\2224'{\232ZA\243\365\372$\343`\341.\272\301bU\357\213q\356\260t\3649A\275`\2415'\343\307'0\352,\214\0311\301\354\225\204\214\244c\224\343\220\254k3[\033\336<X\371\376S\220\3106\370G\347\365\302\223]j\211\361\005\320\232\254\032\033LSkw\005(\270\250HH\360\243T\342\310\336\342\020\2360\022\357\210\244\372\204?\364:\211\346d\232\177(\311\037\250U`qp.<\341\016|#\365\032m\042\226\375\245q&CU\032;\211CYV\034r)V\301\267=\313J;\010\377\000\011GnF\263\372d\341\355\256\355W\324n\000nL\236\264Q'\333=O\253]\361\243\012\205\205v\266\324\267\230S\205\015=%\010JV\220\241\222\323\310!.!`e;\3167$\251:_\251B\346\313\342W\225\337_E;\243\233sv\367\011MC\256R\255\313\216\005\324+U96\240qq*\022\003aHe\247\001mlNB\002\266\034\037+\315\341\005I\031\015\222S\244\343>\033\367]\264\363\377\000\177\276\351\243\225\001zY\010\2555Pb\354\242\317\205=\207\026\230u\252,\246\324\371h~\007Tv\355q\265$\244\354^\322=\307}Q\2609\204\265\302\375\355Z_7?\241B6\365f\257e\325\241\241wd\307[eH[o\246\205%GxW\012K\2146\340\334;\341X?~\372S\3562\306\360cuW\262\217\030\001E\\\312\367T\255\2706\234\233\362:\252t\271\011\204\265UbFiQ\344\374\302RJ\226\303+HPB\307\235)\307\227\315\306\006GY,\027\017\212\006{\343?\227\305g\215H\017\332\252\264O\217\225\275\272\235B\263/\006\2202\237\332\025)Q\345\276\241\333\206\333)@\343\325E}\273\035rz\216\241#[\345o\347\377\000\021\242\234<\321\005>\372S\327\252Mu\251uS2\364\244\\N\215\346K\215\007D\205\001\204\205\015\313N;\216\3018=\206\231\351\272\360\177\025\202\233s\001\036P\2304\016\244\327*\262\347\300\256Ee@e.1\341%\277\030\023\370\212AV\177_\313L\307\252\224;\316\275\340\264\340.z\303\353\246:\231\264\3304\365A'\305mie*[G\037M\244~\276\274\347\276\231|\344\233\240\205]\211P\321:\202\304\204l\223L\246\264\362W\275\0173\3426\263\333\234\356\340\217\266\016\240\353\367\012!Cc\034\253+b]\224\372\304,.2_\230\204nC.+)R\273s\221\367\357\367\366\326\256\216v\277\024\224\324yE\205f\272|\364f\324\310\254G\211I\334<\355%{JO|\247\201\333>\236\332\323\213\313\236\026,\300\337\272\264t\267\250\225Jl\252Dy2\024\342\223\206\235\332\010mC\234\221\234\353\177\247u#\033\204\214<.s\250\3507\202\327\214\024\255\352-\232\315\215Ib\356\252\335\024\370p\216\003\2361\360ZR\261\350\262\254\003\301\340\3568\032\372f\203\253G0\260\276_\256\351o\201\3449\000t\337\343\207\240\366\254y\364\210n\323\027\325&I\371Z\324Z\223S[\211\376\037\015\200\322\203\252\035\360\262\204g\031\335\310\321&g\212\352\007\036\211\030\365\001\247jL\365s\257\326\365\3412\273p\335\035\032\352'U\256\207\020\336\311\357\323)\340TS\333(\015\245\010F\001$\244$\237\327:\230\346s\016\300\333\036\312\304<\202[\307\307(\237\247\324\273^\353\260\351\365\210\3750\245t\275!\342\264&\344\213\362\353l\214v\336N\007\261I\307?\226\2647\342\325D\217 \007a\021\\}P\351\265\260\267\027\\\353U\221l\026\220\257\011\225\324\002>m`n\330\313C\314\342\210\306\023\306w\017R4\037\2750\032*\034\347z\232\365Jh\235[\246^s\344U\254\273\345\312\353\221\223\373\372{m\272\207\012\363\334%JH\317\323n~\331\323Lp!\014\207\234\322\\J\270!\336wr\042\275q\305\235R\330B\3512#8\334\222\234\036S\275\033O\240\343:\266\010Bc\216\353\005\021\336\025kN\305\265\027)\0351\275\037\202\330\042R!D.>\0243\2228Js\364\307\345\316\207#v\217d\323\246!\267V\251\245\017\342\257\240\361+\223\242H\272\272\217FB\226@b\273\010\247\345\227\236@)\355\366\310\037M)\037X\203\360\270\327\304\024&\261\334\321O\370\375U\242\261\0165z\336\256D\257\321\245\001\265\327\246\005\244\037\360\244m\340\236\330\311\037m9\343\013\265p\303[\202\361\231p\335\3259\264\311mS\272U\3731/\005\025\317\016\307\220\330\316r\026\332|\377\000c\357\242\007\033\307\013\333I<\341\034\325\372\375B\263\244?\026\346z\233I\177\302\361<V\325\261\2470\006\022\222\265%D\343\037\303\353\311\032\254\263\006ey\362\221\311\245Z.\217\215r)3\244P:}z\011H{\315\3406\323\251}\260s\273y^\320\010\307\031Q\367\364\3222\3650\321`\025o9\247p\022\232\233\376\322P\365Yp.\236\233\334V\345-#\302ns\273]i\007\267\231\010\000\201\237bF\220\213\355\0137\355sH\036\252\316\214\233qM\321\327X\322\251\212\254R/\212\004\266\012\024\342\203aN8\022}{\3458\316y\032\330\032\310\334-\245\001\267\273\333\225]\347Ua\316~}\377\000\027\251Q\032\252\276\262\224HMBF\304(\344a\324$\354G\330\340q\301\036\210I0$\275\257DcN\3577%\0141\325^\261Zw\007\214\253\246\302\274XW\341Q\3628\256\011\036d\035\304\373\344\034`\351v\353\246c\250\220\344\177\014;\360\224O'\257W\342\334\361+\035:\257\2771@(\252\014\275\355\021\364'\327\276\216z\253\3071\237\232\363t\367\370\235\225ao\332\337L\355:1\271\357\212\315\265N\205\032H\202]>\024\207\242:?\205\306\233\363\243\007\374X\320g\226\010\333o\042\275p\272\037\032BH\003\360\343\353\373B6\007X\347u*\374\243Y\375\010E'\2517S\373R\302\033d\240\251#\272\222\312\001qe<\035\247\267\363\326\026\257\253\261\215%\206\323\332@e!\215\344-\215\272>1\376\034>\016:Q}\364\376\206\224u\033\255T\206\230]\326\3254\207\022\305ZK`\267\011\307\224v\231\004\035\336\022U\206[B\226\260\221\214\374\307\355\026\266]m\264\003\264}P\367]\347H\211\232Wo\224\215\336\236\337\305\374\375\225u\377\000g]\333|uF\361\270~#:\261[\251\276\365U\267\351v56LE\206\374@\243\363\322R\240\022\331e\244\251\015#\320\250\250\202x\326LzQ\016\224\304\306\355i\365\347\335\035\232\267\352f\022\274\371A\307\262\266\235T\351\303\035V\352\001\201!\265\311\2462\224\042\240\276\355\204`\225e}\271\003\371\343\323_5\327t\306\370\344\274|W\3224}@\262\037/t\011\324\312\372-[v\243g\330\314\265\013\346\320\224\316\226O\0142\221\204\264\332\2750\011\004\217|{\353\037\252k\335\267\302\322\340w?\302\325\351\232v\275\376,\347#\201\372\331T\323\245h\241\312\352\343\024\232#\016\\5f\331zD\351\333?u\025\010\003\367`\237R\242\000?\345\372in\207\033D\237\343\311\356S\275Vw\230\374\342\217\247u\341\177\365\002\336\247\325\356*\344\271R_\371%!n1\031\033\033Z\0008mo\036F\342\221\345@$\203\234\215t,\224\022\347\203D,v7sCG\011E\326\236\261\337\224\316\232\333\316V\037E/\2515\332BY}\250\210-\376\317\214\356T\264\267\311)\033T\021\223\346<\347\276\261u\375U\346@\301\370\210\317\327\272\321\351\3721\264\275\303\013\042\223k\031\265\351\3673\221\303\3166\263\032\003{07\201\370\216=\023\223\377\000}o\350\246\015\213h\013\013U\245.\220\277\260V\203\241}\034r\005\006}\303SP\217U\250~\371N\272\254\004GA\340\363\310\311$\343\355\333T\327j\013\250p+\346\243I\244\331w\370\212_\365\036CWM\3252\250\225\354\245Dk\345#\025\214\004\2459\334\262\017bNO\367\310\264\007$\225\355c[A\042k\216&\255\022t:pq\226\222\202\333o\251 x\200\361\274\037n\375\307\257\337]\004Zg\021\271\313\017Q p\332>k\342\313\263\345\370h\233\341\270\335 \002N\357\307)`\361\365\010\3169\365\3544Mv\240\006PS\242\322\002\357dll\205\315\377\000\210\222YC\252\005g\305\001!\011\3658>\272\314\202Lg\225\245.\204\034\224\316\351\255\246*w}=Q\351\356Kf8-3\267\263\007o\231_E(q\364\326\203\031m.\034\225A\025\020\002\367\370\226\263*\022)\326\314\261\210\361#\324\012@VyR\3062O\320$\015)\242s\204\300\271\023_\010|8\355\377\000\210G\245\364\243o\231\251i\301\0363\261\034B6\244enm\300<{\015\332\321\352@\030\366\367A\351\361\355u\366Pt\226WG\256\306\2544\2273\035\364\370\251\003\202\202pA\373\217\276\261\264\177\206\234\231\234\022\355\375\323Y\352{O\232\203\317\205,\262\373\301$w\007 `}\277\2464\3534\266F\304\037\020\321\276WL\332\033p\246\266\313\255\376\355-\371\262\001\312\200'\362\3564=D\004d+\264\213\242\204\021Jin|\313\243(F\355\244\247;x\300\376\30648\236}\024\277!xF\244\261\021\232\325uq\333J\232\246\0254O\012\012IZ\263\354\007\341\323\354u\306G\272U\315\242]\354\203\372\007E\333~C\244\267OJ\\\233nLua9P\361R\352\024\336\337r\177x\000\357\316\266\266oi\007\225\231\246\362\277\362L\316\253]f\265\325\213\312cI\006\0059*\215\035\011\300\361\033\332\331<\216\011\336\2003\234\177\242\257\247\023\351\3314\367\333\317\262du\312\011\235ft\302hDWf\274\211qV\336\360\245\024\015\237\211\007\324'w\036\243$k^Hm\255q\364\376\220o&\206m-\272d\314d]\257E\220\313m\201\025\326\333!Y\345\003~\300y<\204\253\362\373\350:\020\013\210V\224\220\021/Wf3\022\005\271X\212\225\275B\246S\374T\255\265\215\2174\343\333\226\341\367>q\234\177\207\357\2465Q\223Dz \261\376]\3055\272\221N\237\326\216\231\330\016\333\367\013\351\352\255\270\321\216\324\025<\226\315\313\011\000(\006\011\316\347\220\220\0248$\371\201\030V\340\344\304\313\020\317\231\277\250@l!\257 |B,\350\177W\005\267T\201K\270f\251Tw\367D3]#\301i\316\002\241\314\335\313YB\201C\212\362\360P\242\000\012\321t\032\222\016\327c\337\370\366@\324\306\032\353n\022\307\3427\247\265o\207\304\325\246t\272a}\207.$W\251p\034+l\262\313\255\357u\244\221\330\007#\244\205\217\361\020A\301\302=N\023\020\004c?/ef<\274\022\006TE\347]\267\347U:y\325:4)Ql\353\306\220j$\262\222\026\314\236X\235\035HH\341@\205e#\327\012\306S\220\216\246\001\034\241\354\341\303\377\000Sq;|`H\237}<\273+\365\324\320\2729y\325[\256\321kM~\314\242\324\3464T\031\256\264\235\361\037K\311\003tym\014+\325\016\207;\022F\265a\323\231\007\200\374\203\307\304q\237B\226\335\341\021#F\006\017\303\325U\311WE\033\366\313\213i\345\364\243\251\015>\3649\324\332\203\310E\032\266\342VP\343\006R\260\333.\222\234\004\310\011A y\311:\346\335\007\230\206\232w\247c\365\357\363Z\2368\3018\375\223b|\213\221\352Rj\226\313U+V\352\202\332X\237G\230\331em\004\217\302{\341*A\005\013I(P\307$\034\351\2065\304P\024\341\331\026\311\313P[W\015\345\362\205\343Ua\264'\310\361LV\233[\2108\307\357@\016$\2021\302\261\317o]D\032\351Ym'\012\222i\332\374\220\273Q\002\252\233^\343\243Qj\325\310-T\230H\235\025\271+\377\000\3675 \251I\017$\235\256\355\336\346\322\260H\336\254cq\313\221k\017\206\3467\277(n\3227x4\220\224KJ\004y\001m\206\225\2376\012Br\1772\000?\230\031\365\327=4\000\225x\232\320\254\005\251k\272\266\314\232su\212S\336\251u!M8\177\312\264\222\234\237\251\317\365\325\231\2435\270`\246\305\005\326\355J\255L\250)O\256@P\001^'\207\274$\343\324\244\034\034}H \3755W\351_x\345A\230\016Q\324+\252{\250N\026\245`\340\002\242R~\207=\307\367\2355\016\366\325\240\312\340m\026&\206\231\322\030\252\301\001\350\313\031z\031\374M\347\217*\373\021\237\177\267:\320n\232\306\356P<|\200S\326\306\204\375\025\310\256\265?\3666T\0128\316\374\372(\022?\236\264\264\332m\246\370@\236`\005\021j\335P\352n\272\324AxR\042&\022\371\016\305s~9\356?\210c\324q\353\371\351\020\340?\310>K1\336\255O\233o\301\214\3332h\362\337\234\332T<\312\332\2056\007`s\306~\276\332<;E\226\245\244`\177\224\247\263\002\334\272\350\277#Yi\247!\022\012Vc\264\377\000\204\346\007\005\267\022\264\376E?n5\255\240\327\272\023c\205\203\324zh\220UeU\276\241tw\251\024J\314\332\227C\354>\236\\\361C^+\350q\363G\236\351\036\214\224\243\303\343=\207\035\3065\333\351z\245\200B\340\365\3355\340\342\207\305U\211]W\370\354E[\345\346\374%\301\231JW\356\223\343U\336\223!\224'\370\224pN>\241 \017q\2558z\203\311\313G\315a\273\247j\016M\042eu\032\324\243)\232\337Q\355)v\025\307\024%\245F.\273)\327\334R\270e\246V\255\304\223\330\001\217\323Zl\3252\274\330K\370\017\364\341{\365\013\341\216\265\325\366)\027\015\231\001\253v\277]i(\243\261P\206\372W!\345v\013\213\342\003\270\343<s\307\323T|Q\277#\221\335\020\271\316n\302\177/\355&m\336\231\365\247\244\235C\255tk\2565+z\221]\2476\332\236\210\314\347\342Ni\265 -\260\031Z\024\353i)ZH$\372\360=tM#\2676\301\007\340\201D\032qE\027'Q\342\333T9\302m\251X\270\314\\\370o\320]vR\332A\364q\367\277\031\343\360\343\337E\222m\247\214)\334\342)\242\324T.\251\330\357\300\247Si\2656h5\371\036t\305\254\007b\274\240\242;!X\031\031\3544Q\250\016\030Tsh\355\356\243z\231S\261)\266\373\016W\254\032\004\332\272\235\332\037M?\304\371\245\223\370T\255\252\301\366$\201\307\246\242X\331Vr~\012\376!\340\251Kn\277\360\213h\364\335\312\357^m\353\263\246\2607\004\301\244\300\244\374\303\325\007\225\316\377\000\004a(m<\022\245m\317a\270\361\245'\324\370T(R\274\226\033u\237D\253\272\372\241\321\036\244\327\205\225\321\012\025\355\324\272Rb!\367\346&\223\206\042\273\223\373\224\203\207\001BBI%\000d\221\223\214\350\272}c%$7?\262\361c\213n\221\245\006\303\213\373\011\330uj+\265\031K\345\020*M\253s~\303\016d\343\355\307\246\234\360\301\031\034\251\200\320\256\351cU\3513\223c\246\212\305\211h@R\220T\343\220e\341\306\371\307 \245 \037^\010\373j\256\200\034R\035\274\232)M7\341\331\021c\276\371\241\334n0\177\037\312H/\371\277\376?1?\2461\372iGt\326\233\244F\270\263'\224\000\257\206F&\327\036U2\361r\204\026\002^i\332RP\342\210\307\225gg?}\275\364\253\272(s\2674\322\274r\232\312\234\205\360mB\203Yj\241:\242\330l\340:c\264v\275\364Z\001\003\371}\017\246\274\316\205\033]e\033wr\217\247|$Z\225I\261%G\231O\245N\030XpS\317`r\006\012\360\0178$\0158zTg %\337'\236\323>\037C\335\211\035\270\357\233i\367\023\306\364\272\3427\017r\011\357\366\343L\030\253\262\363\005\016V\014Z\266e\353Y\223P\215\042\232\345U\271\316\205IX^\351\022\210$\347r\210\000\234\223\257\213\351:\024\306]\357q#\321v\322\352\301\005\264,\367<\255$\350\247K\272\207e[\265\032oM\331\245\330\027\025E#\366\315Jk\2512\327\011\034\246!w\263Q\324\261\271\304\244\345\314m>\\\244\365?\374@\333\201\361\274\375\017U]6\240\306KA\000\375}Zn\275\320\212c\275!n\207i_pnz\352\352\013~\242T\206\214F\347I?\275}\320\202H@\306\335\304c\036\207\276\207.\2166\260C\037&\376\026\264`\006F\227\227_\252\272_\004\364.\274\321jT\010\325z\277Mk\024\013y\267iT\306\351\263$\241P\334P!jK-'f\355\253*\012\365!$\361\256s[\0141\265\322j\034(\012\245\243\245d\316-\2122*\371Z\331]\211.\317\263\234\203-o\376\325q\222\267\212\216V\313^\211\334yR\224yR\311\347\200=\317\300>\323k$$\200(\372z\017O\372\276\267\322!\004\372\322\312\036\276\335\365\225>\315\273l:\227k\322\336\021Y\031\302\031Z\2167\237\250\347\355\257\234\352$\222G\010b<\257\241h\331\033\032dwdE\322\213~7J\3507D(\222\3236\254\374\035\217\310Q\001\307y\031R\317'\012YQ\003\203\353\256\367\247h[\246\204\264r\271~\243\251\361e\335\331T\026\246\302\271oYrf\274\227-z4\264U*\311\011\334d-)W\206\317\330\253\276s\333\266H\032\\n>\177O\335]\365{-/z\200\345B\375\255\324k5\247\232/:H@\306\003 \003\204\217@\001\300\374\206\263\243\321\323\314\217\311%6uT6\267\204\251\265lX\265\032\305\022\235\031\246\344J\233#\300l6J\222\323g\314\265\220;\347\012\344s\310\355\316\272 \366\265\242\216J\313c\315\223\3319\372\254\271t\250\355Ri8\215\024\244GB\023\217+h\362\344\375Oa\330\367\357\254y\374I$\345\033p\015\265\237\335E5\027\244*\221\015\267Z\214\225%\005\000\341R\027\337g\276\320{\373\377\000^\217\245\300\335\326\345\217\324_+\274\275\2242\250\241\012\215o\241\242\363\221\320\205I\330\224\345K<\355\344\366\3678\364\307\032\323\0239\316$p\022^\030\255\211\367mZ[a\232\345yN4\312\033\304f\322\203\205\366\374\000\376\042v\216@\340\003\333\327/T\377\000).ZzQ\220\244\021\002\223<\312\227r\271T\267\351\371\011Cm\241\245\227Q\354<\371H\307rFt\260v\301\346N\201\274\042\310\327\325\237j6\304+zcT\352\222\333SL5\202\222\326\357\343Z\3246\005z\214\221\357\247\243\325\236\032(\244\236\365\025u\327\\\270\354Y\324I\262`TZ\377\000\206\\W[}.:\026\203\225\255kH\306\336?\\\366\032\222\363\266\207eB\373m%\3356\225&\024V\235[j\334[!\261\274e9\356Js\237\247\347\242\273s\205\271Dd\003MP\216\024\306K\310V\335\352\357\200\016\356O\351\216\377\000\337!\003\024\021\032<\266\345\3372\343M9\370TI\356;\031\367\002\236\223!\261\270\022\262\235\255\2518>\211\344\377\000\233ZZ7\326\012OQ{\227\366=\366\335j\035\310\375U\226\351H\210p\205\250\376$\251e)\374\370\376}\275\234\225\201\315.\354\200\331o\036\212Y\212\203r\251\211\371r\332\336[Ei\364\336;q\237s\307\323:\311\222\002?\012`K\212^\215\241*\243\326P\363A\0159\007\005+;q\203\346\372\343\2204X\254\002\017\012\216\242\027\037N\324\232M\361\011\274\210\262\330\247\000\200\224\341Ca.o$\372d$\217\256\265\042\324oa\036\210!\264B\035\225\006%J\355\253D\204\245\025\315\224V\022T\010IQ\004\340\237@s\366\300\324\306\320\006U][\215wM^\250W\333\252\312\265\351\015)\205\300\211P\221\035\205\241\001+C\241\266\002\202\210\356\011Y\003\333q\364\326\261\2308\012A\333\233B4\230\377\000!Tz\245%\012i\266\236qj)9-\244\244\202F>\207K\300C^W\236\011m/\344(S\252\275\021\274\350\223\236\371\271\224\007\330\251\304t\035\341p\344:[\220\32099d\225x\203\320nW\323\015\2708\306\346\236\337\262\003Z\005\265|\331\222\042\310\351J\230\237\0013\042Q'\266\312w\225+kY%\225\225\002\026\205\241Y\011ZT\024\234'\034q\241\306E\002{+\264[v\221au\334uiU\212\363\327}\006\251\016\037Pr\304Z\245:Ckf\015\333\035m\356G\210\351\332\206\245\340\020\012\212K\234\020\255\373\222\266\034\360\3570\374]\307c\371\372\376\351o\015\300\201\333\327\277\300\253\241B\247R\272\313\321\330v=b\246\2717;\001N\332\362jn\240LCi@_\313:\241\377\00047\346iJ\031!;\026r\002\216\236\0217Q\026\307s\333\325(d\360\244\263\370~\177\262\247\352\245\374\237A\257n\235\326\242\314\242\336\035=\352J\343I\214\350)\\xU&\213\254\255\004\036\020\242H\007\266Q\301<iIt\373`h\177-*\360L\014\216`\343\352\210I\376\224u\312\267e^\024j5\314\271*\246\212\334d\004-\226\236\214\224\370\303k\205\013\363\264\346y\361\033\344d\235+\243\3269\222\000\341`\237\257p\2553\311\005\247\272\261=H\253H\221\325\256\256\261\002\233l3%\332\202\245!S)\255Hyn-\011*Z\303\276#d\222HP\010\030\356G9\320\372\234\245\272\227\355\003\344\233\320\002\370\200(b\324\353\245\365eHeW\224c\324;f\042\013-E\360#\261&\003<\371\042-\244!\001\003<2\261\260\361\202\203\311\006\237Z\355\300?\314?_\311C\342s\033mD\227\273\266\3556\343\267\356+V\012\244\331W\024\006\337\016\277!\3059!\2477~\355L\215\250iM+ry\005D\014n\325\372\216\231\201\301\315\340\243\301#\310\267wI\321~\317\264\224\3246B\337\243\356\332\322&>\247CD\036\012W\264-\262\006\177\012\261\333\215e\357\331D\016\021\235%a\035\252}\255rC]QTz\311\253\004\025\230\360\252m6\334\205z\225%m(\344\363\234\036~\271\316\274\335L2XsM\373\024R/!{t\363\251\265\232=U1\232\232(\260Tp\226\021\214,\177\205e^e\234g\214\203\3544\203\365\322Fj\350{/\007^\012\261\327d\230?/\002\277K\211O,>\002\202\220\220R\027\334\347\035\275H#\363\347\235nG\251\016\036#9A\231\245\242\257\011g.\273\024\2671\311\021\233\206\342\270R\224\275\251\366\340\236\001<\372\376\232\241%\304\341,'\015\007\321uX\327\234\370\016.2\026\364\230\250Q\330\205\343\036\231\332~\237N\016\177=\033H\\\327Q\341zB\322-\252\310Sk\016Nl\274\354\266\237h\015\3405\225))\367#\037~?\351\235ml\306\012@JK\254\214&\335\243{N\214\246\031\212\2313\331W\374\265\222pq\316\335\276\370\366?\226\255\034\216\030\010\217\211\246\215\362\254u\227\324yL\270\271\212\242H\225\011\261\272O\206\010\014\2478\316\007\033y\354\177\226\213\034\256\273\244)4\315<\025j\255\252\274)A\272\25546\232{\201!M\241$\014\3679\007\221\237\323Z\315-\177\230,w\260\203\264\246\324\272\223o\263\031\364Io\030\001\265\003\261H8\343\267<v=\306\265z|\373]\264\360V\026\263H\327\264\337!'\257~\242J\246\272\333h\247\315%\224\250/\306i\345\252H\035\313n2\227?<\247?\313],r\006\256cS\2455~\212\226uV\363\245\3371\247\323g\311\207B\250%\277\021H\232\224\310\336\237\361 \2047%\245\017E\004\271\203\335:\321\213P\010\245\212\346\226\223\232Yi\324\364PiW\204\213\252\314\353\025&\247t\245\011\360\345\302\252\255\211\314(`\014(\004\253#h\301\004\034'\266\250\346\006\017+\250\237u\232\371\031#\350\033\374\276\255vt\253\342b\277\322\010\027M\333rP\243u\336\374\223$9\025W\015bK\360\341\223\222\247\312T\277\035\367\017\036T\270\330$\223\2361\254\330\265\023i\333\2170=\357\204\351\014|g\303\240\377\000ZU\335_\021\335o\352?U*U\326\354{&$\211\262\227%\021\032\202\270Q\243\264q\300\332\340%8H;\211'\352uhz\306\242I\251\315\011(\364F\356\363\360Vy\236\276\332\314J\205\026\341\267iL\335\221[\330e=RT\310\023\345\014\354h\240\221\204\203\316\364\234\200\236Omm\267\250\206\232<\242n\007\373V\302\225v^\265\226)\265\2514z-J\336-$\251q\243>\327\007\000\251\033\367\225\000s\310\317o\323j\011\355\266P\345\200\264Zc\263f\364\253\252\324\325&\271I\241U\347\306\005~\014\222\240\237\261\336v\216\300d\000{\367\323\022D\307~!j\215~\022\322\261rZ\226 4J\245\207nZ\324\206\010\015\263M\230\353\222\244\0002\013~\030@W\247\033\2163\240\313(\217\221\204}\305\330w)h\377\000W\351\322-\372\355n\330\254\326\250h\214\376\327\033\256\333\323\026\270-\236\312Hin,\347\337pO\257\032\363\246;w7\365Ao\226\360iJC\352']\3514g\032\211)\312\375\032pK\353y\273VPK\355\355\004\000\260\343\252\035\301\374\001D\014\035PI!\344~\205C\340#\202\244m*\305\274\314w\2443\\\244\321\244\276w\311\210\033#\303w\235\312\301\011Ry\307\030\007\216y\323Q\313\\),\260\246\243uj\201I\220\323UN\245\322\2458r\322U.FZ\036\240o\001(\364\307'U\361\252\215\241\264\200HDTN\247\333U*\323\326\324\012\265\243U\226R\\)\214\264\274\336\017s\270\000\0063\357\253\015K\\}Q\342\005\300\200\244o*\235\016\316\250D\202\357P\2515\204\255\261 \307\244Se\277\0366\354~\355\311^\031B\\\031\3749\340c\357\250f\242\370P\340\003\261g\362\302\200\232\257\332\357&m6E\300\270jH\010SE\001*\372\200RH\321H\265v\351\354X+7\254\372\214KJ\324n\241D\351\325\002\366\352\313\215-\371n\024\042(d\023\235\250\3067\202N7\001\300\316I\355\257\234\356\232\030\274\2409\377\000*\037\237+\270\015\215\356\267s\373\225\357r\\\335L\271aS\3507\215\233y[T\3640\207.\030.\241\330\253iaAIm\263\222W\035Cn\025\220\256\340\214cH\235N\246LH(|\277/q\365H2\302\003KC|\335\373\343\327\331XN\220\365\326\325\214\207\272\177>\305\257[\217LV)u\010\0156\344\032ZBrJ\343\253hZ\216A\334\254\373s\234\225d\353\021\301\377\000\333\345\364<\246\264\001\305\333\000\260y\036\353f\377\000\331\305\022\271v\256\355\235r\311\215v;k\244Cl\304\246\242\023\022\3448J\322\363\250O\224\251\010\003\3102\220W\223\3165\301\313\325\344\326o/\003h8\305|\327g\247\322\2159lmu\253\017\327\332\213\2254\325\322\334\225\245\277\000\272\372\221\331`z \363\301\300\037RN5\362\216\277R=\316\013\350\235#\312\007\252\315jm\266\305B\364\225sT\233Q\020[T\204%C\312\205\250mI\007\355\234\037\247\323X\275\037D\326\311\343;\262\336\326\353\313\243\021\017\315!z\323\326a\322~\235\365\002\373\217O\025J\372\237\211\002\023\013qHh\274\352\226\020V@$6\216Tp3\351\352\016\272\226\2702\042\\,\222\007\317\376,\223\335\336\231T\327\246f\005\3733\2474J\034\271\352\241\305\022\356\212\273\263^\313\365i\333\203m\251\300\237/\204\331\345\011W9$\373a\202\330\2540p\320O\346\206\307\227\000O$\224\360\253R\230y\023\230\216\322\374U\254\306e@\022GpU\201\364\317\362\327:\306\207\272\275S\341\342\356\323*\311\242\322\254\032T\252\372\341!\271\316G\371X-\355\033\231d~%'\330\234c\216\344~zcRZ\317\302\252\334\237eW.z\275g\250w\302\354\332Crb\302\360\0252\261Um\335\206\014$\360P\302\260p\243\220\013\247\360\347\313\223\214{\2453s\235|w>\310z\332\303B\254=J\2515oU\274H\221\220\212\243\212&\032\025\346LfG\036*\30798\001 \036\347\327\031\326\256\215\245\302\370\274\374\026~\252R\015}{&\017I\272b\263FM\315t\241\366\343<\262\352\022\257*\266\347%K<)KQ\377\000\306\236\3259\214\001\274\241\351c'.N\352\272\021:\034p\206\026\314T#k\014\025ajO\271\343\011\007\217\313Y\217\363\321+J\300\024\225\225h\217\266\211M\306l0\361V\3260\201\267\2767$v\333\337\031\307mY\321\022r\206\371\015\020\324+>\203J\205\031\270\357@\237R\220\240\245a\244\202I\365\316x\306=\216t\313\236.\300K\266&\234^T-\006\236\325\012uM\3704\270\364\304\0102\002\323\267*\312\323\352I\3019\003D\226@x\024\227\212:**\220\246\306\306$O\237%\\\356q\307\2678\274\177\205G \036\343\2001\215]\256\033}\324\014ev\300\360EIH\022\0420\246S\335K\311O\035\216\007mU\305\243\314QZ\367\034/\355Z\235\006D\361S@\217P\220RB\234Y\3342q\236\375\317nuH^o\342\256\370\3076\207_\246\346\2376:P\333o>\343\\\204\361\204d\362}y'\333O\011\301\033R\357`\245\017v\321%7Eq\230\262\344\266\353\214\307(-\345$ \034\250q\371\177\256\257\015\033\026\227\235\236\\{)\252M\303^E\012\263\373J#5$GDD6\350R\222\343\241n\020\260\261\330\371G\320\344s\221\221\246\031\247hi*\255{\253(\3524\3101\344\322+\361\037Lj\213\221\020\247\220\277\371\214\307)'\004v\311#\034d\017\345\252\210\300u\204m\335\320wO\346\006\237\235q\312S\305\330M\255\360\220\017\235n\022\021\217\261?\226\006\231\015\016\006\320#x\036b\272\231Dk\205\327\235bR\026\323\215\011l87\017\021Ej\361\001\004\014\020\244\247\357\371gN\307\246\241\345B3\016\\\216 \276\357\216`\310a\267<f\034IZ\362\002\202\220N\376?\274\015P6\244\243\312(\310\263\302\371\351%B\025%M\333U\327[\231G\252\264\212#\217\255\003\376\031\271'\303Oo\377\000\037\210\264\253\036\204\344q\2204\264\200\017+\373\343\372I\275\333@?5\017G\266k6\335\241\326[b{\254\246Bc\370\005HP[n>\314\256\022\024\011\302\260\026y\347\355\215D\232b\326\271\243\262\201-\037\216\022\222\270\375\307>\333\206\354\005\265!\346b\306\217SB\333\335\343-\004\245*\3658(\300\007\276B\201<i\031\303\313l)iu`\247\207J\357\324&\205R\246J\245\240\327\241\270+L\370N\254.<\250\376g\034\216\353e*fG\204\341XRA\007\013\012\012J\324\222\357Oq8\003#)Mi\261U\225v:\207N\207\326>\224\335\327\235\273H\245T\251wWOe\266\335}\250\376\023\321\252\264\345\011\221cLP)\303N\245J,\2222\323\250\220\214\354q\001\035v\243Hf\200\330\315]\375~\213\026\015@\277/\024k\327\353\333\262\307\344\042\237U\270P*\216!\210\205\206\246=\271?\274\212\237\014\025\254\340v\035\361\215q\376\010\274\255\266\312\035\236\311\241\036\374E\301\324K\276\235T\042Me)n\241G\231\035\004\011\314\251\264\225)+$\356\340\241C\324\244\222A\034\351-De\363\035\334\246\264\332\200F\316\303\217\257Tm\006\247\002\344\242T_f\236\364%\225\245\247\023\200\025\002H\357\264\362\2256\342I8\3649\301\366\013Z\011\266\204\333+e#\012,\272}O\245\020b\042@\375\263B\255\274\337\204W\274\030\257\245+(>\244%\304\250\3757gN\315 :}\247\226\224\274m\377\000%\216\022z\360\\iPc\243\305Sk\012\004\267\337\031\007\237\310\347\365\326=\016J<\202\302\215\266\352oEd\006_J\\o \237_\241\343\362\3755\223#\000\177\225Z7\342\227\245}\347\334\250\261=\344\241\246]H'\313\200\265c''\337\373\365\325\265ZG8\332\253\235D\022\233\326\345\365S\211DL\025>\244\263\214\200\3418\301\365\343\203\217\327L\364\350^<\235\224O5R\345\213[\025o\032\021e\306\320|\241X\000+\3529\340\237O\261\326\373\042\354RN\210\034\204\316\265\251\201*\217\206\226\275\276d\020\2570>\244q\317\365\376\272u\232a| \211\010\340\247\365\264\343\011u\226\023\021p$'\220\245\022\200\342\375\0108\307\277\031\037c\246\331\012\363O\226\200\302\2606\271i*u\020\211\2150\220]\215\214\241^\273\366\236@8=\271\316\236\205\215\273\034\241\227\342\217\011\355hTg\207\324\354T2%%$)X%e\265\016B\261\217\021\034v9\355\316\231\042\306yA>\211\220\304\272\225\001_\264)\214\266\322\022A~(\300mc<\355\034\361\216\331\375F\226s\034\314\200\274C]\202\233\264;\276\235=\275\361\\u\245(e\310\356+%\012\003\031\004s\377\000o\346\344s6\302CQ\245p\031P=G\256\006\351*\252R.yv\314\210\350\334\353\254<\240BH\307\357R\220w#\267\230`\214\353\242f\2449\267t\271\3114\331\242\026vU\272\251>e\316\272u\315C\211s\324b)^\0133\353K-\201\236\034\012\332V\033 \250\362q\334\025`h=7Z\340\363f\377\000>\313\003_\031\262\320\332>\352\246\365~\334\370n\274\023\022\347\207j\365\212\334\251\311'\366\203\024B\304\210(^pV\2048\260\342\301\340\3418\355\306x\326\237\215\013\337\265\300\217\331bK\031\000H\326\337\256x\374\227U\277\360\265lI\262\236\255Rjtk\201*A}\226\222V\323\31461\313\210;\224\225\215\303!XNO\327Z\314\321\306\341A-,[\006\361\301\365HJ\357\303\377\000P\272t\247n\213J\275Zn<\326\335k\345\034R\301Z\025\337\302\3068\357\2023\235gjzC\306cq\265h\316\323g\203\212O\217\206\256\210\332\026\225\042M\341\325*\247Lin%)y\227n\331;\022\302\311\316\306\362\205\225\253\271)\011*8 p2\\\321\351\333\013G\212E\372\224\343\232#f\341\335$z\355\361\017N\272.\027i=5fMi1\300e\372\254t6\230\317\257\370P\302\026\002\222\320\030\300)G\257\032\254\375B\334[\025\237~\313-\267!\335X\367]\0354\353w]-\250\324\332tk\212\327\250\301Vw\321g\2244\332s\333\007$\340\344\371\273\015;\246\352\0236\201#\340\257&\2307\360\363\372+\271\323hwWSY\227.\251IE9L(\222\315\026cU8\353'<\234!\240\2029\316\325d`\363\255\340\342\361n\301\371\2454\315=\325\223\205M\271\355\212;\020\223NS\036\042<?\032;\210K\256 \237\302\\Z\234\037Lg\003'Fp7\204\300!\270*\036\350\271o\232k.FGM\337d%9L\351\365V\020\332Q\351\265,\357Q\037A\203\311\373\350.\221\367@\042\026cp\042\322\032\255\325\037\210\356\237\322n\232m\241\002\322\214\345F2\320\334\261kG[\260\226\241\200[\224\373n+g\276\341\237P\244\351\031L\342\310\374\275\225$\212\300\002\302\241\022\353_\033\265\231\262\237\2014\273\000\034>\210\310\212\246\236\343\222\342\0120\254\217q\254\267\235y8\343\362D\032V\221\227\020\214\354\373\237\342V\305fm\307W\265\355\331\024\362\301\022\025\006\003\0044\237r\206\024\010VG}\277\324i\370d\325\263\377\000\260X\372\364C\2464\020\323\375/%\374W[Q\243\376\320\252R\256\313\212j\036\337\042\014j\314\230\314\251c\200U\025K\360\327\203\352R=\263\241\273\252F\323\276\211S\030{\200\000r\246Q\361OE\250\244M\377\000u\244\302\016y\203^8AG\320\200\225\014\375\211\0328\353~\215?4'D\360j\307\352\205\272\245q\277e\327mhqi\264j\310\252\266\370}\312\203\036#\214\204\253p\015\251%'\031\364V\341\256o\251NX\333\000f\327F'7~\364\274\242u\036\344\251N\254\305\224\353n\277!\246\326\374\265\255\327$=\204\014%N-j;G\000\016\300\000=4\227O\224I\310\375\377\000\264\304\232\351\001\031\345=~\022\254J\027P\256[\322\025\324$\324a\323b\267\3407\224\244,\271\270\251K\302r\243\307\034\361\256W\250\351C\245s\034I\002\375?\245\322t\207nxoa_\252\375\027t\012\233\023\246\235\031\266\355;I\277\221\242\276T]A\345K$\225\222\245\214\025\022R?\026x\032\346\272\207\370\343\332\314\005\323\350#\016\220\275\334\217\351/:\2416K\221jK[\204\256B\220\\?C\203\264{$n8\032\371N\274\344\205\337i\200\240\253\334\252dh\226\255\322X.\241BPh\034\347\000%'?\1771\323\0020\042 #\227\227;+\034~%\356)\325J\265^\305\222\334ABT\227f,%\037\274ql0<0TO\341\005\325(\343\004\234s\306\225:\227>\020\303\305\377\000\011\2070\003^\250\277\240\324Zu>\317\254U\2420\032\227\341F\204\222;!\237\305\264\017\270\032b8\301\204\270\362P\344\362\020\033\350\254\035\223\021\232\245\301K\215-%m8\346\025\374\307\257\333C\323\362]\350\240\265Q\037\366\200\365V\370\267n\251v\235\275Yz\205G\210\331\224\023\020\226\326\371i\337\042\034P9-\345 \224\214\003\353\221\306\226\320\023$\305\357\344 \365i\013 \005\230\261j\354\326\230\205\023\246\366\274\370t\3701\037\270\334jES\303ohp%\200\352ZO\252Z\012Q;~\331\316\272]m0mh\240\343\237\222\230\374\315\004\254\244\242\262\213\263\256N\304\254\225=\035\351K\361\022\223\214\245*\341?D\214\016?\357\257@<\200\372\254\307\222\375E\025\240Ri\361\345\334tky{\232\245\261\034:\226\321\201\271A\033\206\357\240\3061\355\245\365\021\003.V\255\355\300J\272\265BMB\270\374%\251\021\242\240\022\2244\220\007\003\0039\316u\233\033\311\226\211E\221\243\312=W\325a\037%\036+\251[\217\276\372\360\343\216\250\255X\003<\023\255)^A\0117\273\010\016\2515\344\272\357\206\033eJ$e\003\033BHH\003\320\0165X\\]v\202\036v\250X\364\366%O\360\244)\347\221\201\302\225\221\217o\267\032sh\005S\275.%!\015Hp%\011(#hI\034\000H\355\250'*\032\325\330\304V\2445!K.\015\204\004\200\243\204\375\275\277-\0221\202}\024\001\346\245\032\364\026\032K\245;\311\361U\214\236\330\377\000\306\251\376\252k%G\255\244\042\246\372H.$\002\000Q8\0018\306\202\323\264\227\016U\335\311\012\036\271!\327\253pYY\036\002XJB\000\343\004\363\375\007\350=\264\326\220\371\220&9RQ\020\225D\250\266\274\255\261%\010\301\376!\341(\363\357\311?\251\323\362\274\216\025X0\206\2579.\305\211\014\261\265\012m-FJ\261\310A\334q\253Bn\212\014\346\220\262j\222\350\360\340\277\011I\033\236\330\264(nK\211\034mP\366!G\371{h\361:\262\250\016\027\005\032\247:\225]\213\016,\207\014S \205!d\251*\375\340O#\364?p4\314S9\273@\356\227v2\025\221\244\200\335\321\362\011\317\312\376\375HI$\370G?\303\3549<v\323\021e\313\3179\001#ise2\325um\276\342T\231-)'\374;J\210\003\330\014\015X\362]\365\312\206\0220\231=K\250\272\230\027\345E\0150\211\263\356h\253\222\264\202<M\354-\325\214g\030R\325\223\307\240\355\247\247u\261\316<\332[uIC\272H\241n\301D\301\016C\361\212\330)Qme$\347j\275>\240\037\313\352r\2014\323I\206\242\236\233\326g\323z\221dJa\300\267\035\230\332V\0262\010SJ\012\355\216\010\310 \360A \214i\316\232\352\221\264\224\3264\006\023\334-\000\266\252F\203\360\207\361\033iS\342DM.=5\323\025K\012S\221\200\250\272\316\020s\217\301%\304\344\202q\201\234p{f\274\375\334\374?\225\3129\276zY\023p\317\224\345\306\266\234uJ(e\021\267\377\000\022\232O\220$\237l$\017\257s\316\271}k@\222\326\354/\362\355B\265\024~\307\217O\\W\035W\203\005M5\275D\226\322\037!;Ot\224\347) \202\2228\326n\250e\0266\355i\245klz\224\267\253\326\224\247\334\017\012\344(\277\264\332 \006\337p\225\002\350H\300K\204\240+p\307\233'\324\3478\2378>\265ka\231;\221\214F\233\203U\352#l$lS\244(\037]\250V;\177\362:3F\346\270\025;\263h\016SMTX\010\224\332U\204\002\010\340\216\001\377\000S\244\330\301t\216E\212P4\206\033D\207\332H\341\004\020N\011\344\343\375t\007D\322\374\204\013\256\023\025q\331R\232mI$\005\226?\021\3748\317n\331\343O\354\033x^$\356\036\350\316\211O\214\334X\316%'w\315%<\340\340d\0155\243\214%\346\313\250\247j(4\344\230\352-\0058Rp\262\224\356N\007\241\003>\272\351b`<\245\\\332\300]\266\313\200\313Kn4\333\310.\255\030V{\0021\310\365\347W1\2649P\016\352\300\206\3334\230\323\026\332\035R\312\222\244(e\012\003\003\224\376zh\266\305\224\036\326\233\321\042\306\247R\250s\241\262\031\013J2\316\345)\261\273 \355\311%=\275\010\320\344\2145\303j&\354Z1\253\264\324Y*Cm\205-\242\022\332\311;\323\2229\310\307?]\002q\2240r\216-\233\206\246\364\021\343-\207\200+k\316\322U\306\007bFGs\333A\322\312\\h\243K\0304Q\005\002C\251\236\327\230\250-X \236\307\334{\035]\321\215\326\254M\307EG_3\346\302a5HRW\032J\267\241`%%\013H\343\012J\201\007>\276\372d\274\216\026T\3214\345Pn\247\334r\355\306#\365Z\235\016\216oH\025(q\243\310z\042\034Hak\301h\241CiH\307\036\243\337S\241\324\2729<F\201|~K\231\353\354\015\204\3109\037\332\260ug)\035M\266\341\316\273\255krT\347\273\275\035\245\307Sg\335>\032\322\007\351\215wZQ\276\232\356\027#4\316p\334\356Q\027M\354;n\231l\336\026\265&<\312e*[n\031!\022\235qo\034\000IS\212V\016\011\355\214zcZ\206&\263\360\341\042|\3141\273\204'l|\255\215.S,S\341\\\220b\307u\266b\325\302\244\262\204\3438\011\310\306{d`\375}ui\030\032\334'4\316\362\207\036xI\216\235\324\031\353\345~\003w\015*\005\245\005\271\245\226\242\333\353z3-\002\254\025%\016-\3176=t8\232$e\273\325\013NK\345-q\300J\177\210.\205\330\026\004\372\244KV\011\246\241\224\357\335\340\260\265\270\245\025\022\245)M\222Nu\351\364\354h\016h\244\251'qe\341\023t\277\244}6\265-\310\227\323\366u\026\357\270T\313\216\205\326Z\361\333B\223\267\005-\247b\177\213\333E\203N\300\322\352\262\212\363\261\247f\020\365\177\342#\252\223%\326\251\221\253\254\321)\352h6\3334\370\351\216\230\310\340mko\340\373\216y<\3502j\037\352\2222\222\360\012qQ\372\331\324\350p\347Hv\351\221R\245\212{iM2C-\230\251ZA!\320\022\220\260\346@\312\202\371\321b\325\310\015\332nM;r\340\240\221\325\253\252\367\217%\333\201\232\034\246\230J\\K\042\032v\025\203\302\2119VF\0069\300\364\032\3203\270\205\233\020\356W\265\204\321\352\213\223&\334R\252q\\eXB`\314y\221\264g\313\370\211\003\217B5\340\342\341\225\241\024B\213\316WGT/\012\215\026\273L\260)\321\241\261D(P+\334\357\214\255\250\030\312\367\340\376c^\226b\037\260$\037){\350\250\336\232\321\042u#\246/\3347*\3459S2\036i\012e{R\322\020\242\022\022\223\221\330w9'\236uf\270\230\354\247\274\026\330(\347\240\2354\350\315\355\361\257`|>\335\375\027\260.\016\237;M\371\351a\3431\022\247<[\337\271\327\333\220\223\214\377\000\012v\244\372\203\244\213\033o\033F\005\2537V\346\271\304V\023\237\257=7\350\315\277\325\013\216\217i\364Z\303\263\350\021\312\033b\0059\352\202Yd\004\214\340.J\225\222y9'\364\300\323\272w\356`.\001f\3505rO\037\210\363\233</\377\331 http://www.flickr.com/photos/mape_s/350700095/ +012345678 1 Yodda Yossarian Mr Rome Italy Yodda Yossarian \377\330\377\340\000\020JFIF\000\001\001\001\000H\000H\000\000\377\376\000\003\012\377\333\000C\000\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\003\002\002\002\002\002\004\003\003\002\003\005\004\005\005\005\004\004\004\005\006\007\006\005\005\007\006\004\004\006\011\006\007\010\010\010\010\010\005\006\011\012\011\010\012\007\010\010\010\377\333\000C\001\001\001\001\002\002\002\004\002\002\004\010\005\004\005\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\377\300\000\021\010\001\364\001w\003\001\021\000\002\021\001\003\021\001\377\304\000\037\000\000\000\006\003\001\001\001\000\000\000\000\000\000\000\000\000\002\003\004\005\006\007\000\001\010\011\012\013\377\304\000C\020\000\002\001\003\003\002\004\003\006\004\006\002\002\001\002\007\001\002\003\004\005\021\006\022!\0001\007\023\042A\024Qa\0102q\201\221\360\025#\241\261\011B\301\321\341\361\0263$Rb\027%Cr\202\222\012\0304\377\304\000\035\001\000\002\003\001\001\001\001\001\000\000\000\000\000\000\000\000\002\003\001\004\005\000\006\007\010\011\377\304\000?\021\000\001\003\002\004\003\006\005\004\002\002\001\003\004\003\001\001\000\002\021\003!\004\0221A\005Qa\023\042q\201\221\360\006\241\261\301\321\0242\341\361\007B\025#R3br\010\026$\242\027\030\222C\377\332\000\014\003\001\000\002\021\003\021\000?\000\362A\230\306\306L\000\000'\324pOn\374\016?\343\257\353C\00006\321~\024\251,9\206\232\242\011\302\302\341\013`\223\237o\236\000\037\217E\022\350\331,T\2101u\275\246\042\011\004\003\367?\3740\270\375{\034\376=\003\332M\300L\246\354\266:l\216x\333\327\265D,T`\003\300\367\377\000o\324u\314y\261\231L\026\006-\323\352\267\032\310\003\034\026\\\236\010\355\316?\333\375:\032\235\021\341\330Kn\026\032FPFr\304\343\260\332\007b?\260\374\372!U\2469\376\027\034$\033\243\0312\2546\356\332\273[\214\002;c\352q\307B\326\221\002S\035Q\244\310\032Y\0032\026*\255\03288\000/8\007\346\177?\327\243.\015\273\222\315G8\306\204#\004\016\322a\2220\314B\200@\365\034\377\000\300\350K\300\260\352\211\264\234\\A\362C\021\006\330<\335\317\237J\221\355\357\333\267a\311\357\237\241\350E\354B\202\300\323b\265 'b\226`C\002\007 \344\003\333>\335\377\000\257D\3213\035P\031i\021c#\356\266\252\204(\332\031p6s\364\000\037~N?~\340\362F\252@\315\335\002\337\3027\312ef\014\031\316J\347\260\374\363\370\376=p2\230\372YA']\021A2\243\313r\030\020\017\266\007\313\372c\243pq\274$\265\215\000\011G:\023#<q\250\221\3626\343\030$\001\237\357\320\200Ka\307D\330\005\316,\032\255\010\335\266(Q\236Gp0q\363\366\375\374\370\007\030\222\271\244:\0336\367(L\233\231\267\345\2169`8<r\177\267\365\371u\015yh\312\021\275\255$\223\342\264P/\224c\362\335s\215\240}O\357\363\350\330\014\020\353\025^r\220[u\245\313\220\002\260\365e\261\333\030\371}~}\013\251\345\020\024\261\315q\236H@1%\220\042\221\333\003'\203\234\223\357\310\350`\237\335\242\234\306\340\013\241\004\000\344\263>\010 7\271\335\363\374\007\357\277Fg\366\246\020\000\231\321\010\204\004nP3\203\273\034g\267\347\357\237\303\333\240\004\215\322\303\232\343\000]h#*\303\211\003/\000\372O<\037\237=\272\026\270\031(\3152!\245\003i\012\010P\354N\340\017\007\267\323\351\373\030\317V\003w\331U{\373\274\356\207\261\317\000\266\320B\374\377\000\247\267\177\257a\320\006\202%0\027@C\031 2\226\3302y\366\317\277\320v\352\013r\213\335\033\252L\200\200\020\304[x\010T\236\376\347'\337\260\366\355\321\306m\022i\222\333\233\020\204\361\037/qd\\p\307\007\012}\271\355\365\374\007P\016\2419\355&\014\373\362F\230\337p\334\024\344\347\267|\236\300\373s\237\257Ks\244[DM\244f\353l\234\372\342G-\316\012\344\343<w\367\377\000\277~\211\255\356\233\256\023\235\275Q\254X\354Wr\317\223\334n\317=\217\323\351\217\227A\021$'\324qv\246\367\366P|\222YJ\310\207\223\202\007\266=\377\000/\364\371\364\374\335\3229\252\275\201\315c(\325\214\227Ezde\366\030\3168\355\237c\364\374z\000\362\033o\302i\247\336\313\013\004\005X)*\212\027-\334\015\276\337\337\003'\375\372\202\371\006Q\262\200\324\033\204s\244\2312\027i\033'\237\272[\353\216\177\034\373\017\303\240\016\264\025\317gfd\031(\004Fd~\011$\215\217\214\357\355\3563\217\337~\234i\270\001\177\343\301$\325\016y\314/\365F\262\026\210l\004\223\333\007\237\364\300\340\367\035\013\036C\245\311\217h,\001\243_\177dtk\210\325\360#\003'<\363\330\347\333\333\364\3522\220a[\016\031/\342\200\212Y\031\301\0216C\001\221\372\347\030\367\372\366\350\334\340\327BChv\227\006\313J\201@\2260\012\214\253)\344\221\377\000\344>}I.\321\336\374\022\230@6\320\373\272\020\200&\354\355#\030\310\035\306y?,}\007\373tN|\331N\036\236RG\275}\317U\212\214\305\336]\3621 \355+\352\030\371\221\371s\355\221\3205\377\000%%\216 \315\345\007n\343\031\220+\0001\222\0078\355\333\216?,\036\236\323b\002MG\034\301\310\342\\\251g\013\220\315\214\256\335\303=\307?\262:P\200\350\011\220^\334\347_\255\322\204\217\313\334\033\226\013\200\243\333\367\377\000\035C\211%\033\\X\322E\320\206v\234\225*\003\036\006H\317'?\327\251hB\352\223{@@x\311f\001Ps\215\241{\237\177\365?\237M\242f.\252\325\244\011.\371|\272\250s/\255\233\314\317\343\214g\361>\330\351La\020\335\022\353\022Ni[1\310\276XQ\205\317<w\340\017\337\341\371u\305\200\\j\245\216tX[\334\255\307\020b@\007p8\034\234\257\036\347=uGr*\3057\010\222\204\321\042,yR=!\371\365q\234g\376\276\275\310\3502\271\300\311M\314\326\273\366\335`>\270\302\235\275\324\344\377\000\230q\364\031\377\000\277n\245\364-\257$\226b\337\262\302\203lcr\006=\261\235\254{q\214|\307G\224\211<\223\011\314\004\235}\021\206\024\015\200\344\234g `\037\237\277\267\357\267A\235\320!\011h\317\000\333\356\204b\000\235\230\302\235\331+\222\0109\355\373\376\275\010\023\373\265Q\236\0147\336\353m\024\2172\306de\177\377\000!\2168\366\366\372~]4\000\326\312c\303\237V\306\012\026\307*\200\036p2\027\270##\267\260\344\376\307K'Q\034\321\023\377\000\221\367\272/\313g\330\251\033\020P\002\200\363\311\034g\330t\303\000D\353\277\200\372\252\346\244\277\272\021\23088yU\211\316\340q\237\237\035\276\237^\375 \262\014\352\211\265\211\004i\356\020\266\261\332\252K\215\305I\030\343\347\223\364\350\313-;\251s\\\342/e\247\204H\2730\033\015\270\2229\366\343\376\177\267R\001\360\225\014\005\342\033\267\315\010*\344\340rX\021\357\201\217\177\364\317\317\241\313i*s\014\307/?K-yi\270\017[/\253\324\240\234\363\201\307\373u\331I\020\0278\260:V\334pq#0\306\3206\360\017\3428\317?\274\365=\234@\012\035ZA3u\214\234\314}E\007a\333\034\366\037\247R\322d4\245\2074f!\015c\373\247x\007=\312\237n\330\377\000n\220$\231\344\232Z\337\333:\2426b2N\321\311\000|\261\357\236\340\177O\323\2469\306bR\362\210\323_\1774\241\220\251!\302\006\007i\005q\221\3205\240\350eYuBIq\013I\036$d]\352K)'\234c<\340|\261\236\235T@\020\221A\367XUJ\256\351\034\223\235\303\030\037\217\317\376\372\347\003\005Fv\310\032k\357\344\204#8xY\035\307\250g\221\216;\363\370\216\241\304\021\230\030B\307j\010\220\267\261\235\225v*\234\345\200\367\300\343\373\036\272Z\321!\033;\304\004b\307\345\230\370R\000\354\253\307o\237p~\275\003n\021\007e1\013\0320AV\334\341FG>\331\301\316{\373\361\377\000\035N\321\315\014F\243D/,)FVR;d\234\203\354\177\327\216\203\305=\344\037\333\242\315\254r\2147\247\013\333<q\337\266\177\323\236\375\272\202Z\323\335D\306\310\207i\375{\350\266a\373\307\033\234\2366\251\316\017\030\317o\317\361\374z6\231\026@\376\355\316\277d`@@U!\020eH^\000\311\347\237\317\372u\001\361\336r\042\360\356\350\260[X\361\224.\204\362=X\312\341{\000=\372\042LICJ\211\233\0045YU\206#\013\306FW\277\373s\324\22644ISL\325\234\321\001\035\344\354\316\302\331oP\007\214\037o\365\343\345\362\307B\327\203w)hp&4\325b\251\042>\011A\352\340\347`\347\325\372g\351\324\220\001\204\035\245\203\234%mb\363$\337\204,\001\\\234\202\007\310~\037Q\365\352_P\213.\246\004u\321\030\224\344\025\011\265\213\006\300\307\244\374\217\314\014{~\035\015Z\240\236\211\324)9\202'Y\262\030S\204\220\225W99\301\371\223\376\243\352rq\3277\337\242\027\275\306\016\307\354\264\261*\310B\000[`\313\023\200\271\343$|\262\011\374\010\350\314\230+\251\345i \015~\350\300\001\310!a\301$\016y\300\367o\177n\207\274\010p\2726U\006C\200@\020\214\031\024\262F\240g\030\005N\354\343?\357\365\352\\\347I\012h\261\266q\320-\210\345$\205,\213\273o\244\034\217\177\367\343\241h\032\024.\252\360\331\215\015\226\302\007T\363 -\270/\003\220\244d\221\214`v#8\366\035\024\006\332T\200\011\222?\204\021\012*vP\000*y\300\347\261\366\307l\376\177\\t\300\011&\017\275\022\336\326\206\345\042\343\357tti\026\001h\244U\377\0006W\202~\271\371`\340|\317Ps\223\010\207g\004\220@#\346\215UPW\000\356\3342\010$\251\343\203\236Gc\316?\017\250\226\270\241\226L\013\236\250\242HB\024>\345;I\015\206\317\035\375\307\037Q\355\325\212TD\335\015Z\304\331\221k\177>\367QYbL\270\220\306\011\316x\307\364\3743\372\364\266f\000\025F\250\023}V\374\265\011)\221\025@8\310\340\347\200;\236H\343\361\350\034\322\014\002\210T\031$\331\001\343\300\22172(8b\017\364\037\257a\363\350\333N\362wB\367\030\200l\261i\335\262\300l\003\374\303\203\234\366\357\337\375\372\227\274\013&R\246\347\031\210Gm\001\206\342\254I\316\010\030\311$`\014\376\035\011\005\300#\016\001\320\263a#\356\251\347\0047\244\343>\377\000?\227E\255\202\202\353LH\010J\246@\003e\020\200\330\034\020\330\007\000|\376_S\363\351y\240wu\013\232\340\353\233\005\201\010c\261\203HrNH\0308\316q\370c\3659\352\035$K\2216\234:\031\252\031V\222S\202\350\240)'=\371\317\177\367\300\374\272*\206\300\035\324\012\216\314vZ\362\362K\220\252\204v\\\372\261\377\000d\375\010\352\034\341\023\027\374\251\006I\235\012\334\320\344\341C9l\343p\312\366=\271\343\360\372u-2\017$U)\303\255\251Y\264\271\221w\276\354\347\205\3119\034s\333\375\372\027\000\014\241\245v\330\335c \337\276L1\333\234\0020\331#\237\317\277#\375:\026\223\242\347DI\327\227\335\010\247\030\215\206\340p9\332rG<\016\335\317\\\011\270v\212M-\332}\302\031\210o\0046F;\250\333\201\216\370\371\363\307QL\310\222\271\314-04\204X@\354\310\016\361\234\200I\335\237\303\334\034\343=\031q\327u\001\263cxB(\212\210$\\\246{\216>C\223\236G\007\250vhP\350\312\006\310_r<\310\261\240\300\007p\365c\234\217\357\371|\372Q\005\316\261D\327\0066\\\026\316\033`WYH?t\0360;\347\337\375\261\321\000E\315\277\225\005\341\321\027#\355\374}\020\006\365Y\030\361\351\333\214d~g\345\217\364\350\262\007\033\240eS\223\344\215u\012\204\020\254\245\202\220\006\355\253\236\335\363\365\357\3205\242eX\253V\004\033\373\321`,\010\001\203\034\214\001\301\007<g\351\372w\351\220\015\302H\250\342`\240\230\3751\360\212\370\355\270\225\030\343\277\314|\272\031\211\222\245\364\363E\265\036HB\020\207\004\006@N\341\301*1\216\375C\333\232y\245\202[cq\272\032\252\357\337\271P\220Tzp9#\344\177\017\353\333\035Ik\264:\004Mp\027n\245\011?\231\220\021w\034\200\010\343v0q\362\357\333\245D\030'\372M\243Pr\272\311T1d`\301rw\001\355\364\301\371\361\323)\264\233\312\212\306u\323\337\366\264QO\226\024\251\220\222\270n1\317n\007|\220?\353\251\222\032I\321-\245\240\2005G:z\216\323\345\206\006>y.3\354{\216\177~\335\015\023;'\327\000x{\364Z1#\027\004\230\310$\344\021\205\317\365'\237\353\370\364Y\2101\032\244\2006\331\034\274\225\334c-\273\030\343\015\307\347\307l~\177\207B@\362V\015`o\270[\215%Ns\261\210\340\237~\307\236\304\367^:#\016=\024\202X'O\343t$\030|\267\031\3650\007<\200x\347\337\216\205\304\302&<\314\237\024,(\\\024`\012\0220F\027\236q\375?\247R\032w*\015pZ@\032\211CTa\201\346\025\034\236\373\231r{dds\317\\\\5D\3268\002\331\321\030cb\3146\302\0167\260\004\362\177\357\372\222~\235\023\010\327\311)\371\211\344\020J\231U\034\252;\223\357\236\001\354\177_\357\355\32044X)\250\342\341\230#Q\0121\231\334*m\306Y\261\237a\203\333\345\327\027\222@\032\246Sh\273\211\267?~(\242\002\372\002\261\031\301\014q\273\037\\\036\375\276\203\253\014m\256\252DXL%\042(\306\322\003\310\303p\313\002I\034}{\177^\226\\\342\011\230\012\300\240\334\320nn\204\210\203\004\356>\234\234\016\340\363\317\351\322\210\233\202\236\036\033hEyj\355\264\262\344aN\006;\347\323\236\377\000\364>X\351\371H\270\022R\236s\210\007O\272\336\320\027\202\002\343\000d\222\007\030=qm\364\\\307\226\203'_^AlF\013\003\210\336,q\264\214\344\036O=\217\035\377\000\333\245\237\375\245\020\001\347\274-\315\012(\224eG\363\006\010\364\375I\344g\333\234~]\033\363L\270\250\000~\300&\310\005\024\200B\272\266\011S\267\015\234c?3\306x9\343\337\2464\215\322\003E\314~Q\215\345\254\200\260\016\204\022r8l\340\367\307\340\177g\256k\014H*\035\220\274\203\241\344\243\215\007\226\034\243\000\314xc\301,\011\344\217\337\277@*_\275\262\247U\241\267\346\213j\1775\027\237-I\302\225`6\016\371\317a\357\333\246\202\032b.\221\031\300$\307\275VG\003*\276\003&=\266\220}\263\200?g\245\311$A\225m\223\220\201b\264Whu\\\222\010%\267}\334\034\216{|\377\000^\210\201\352\205\225.@\2724R\225t\015\0230\3678\310#\330\377\000\267\320\364=\250\042\332'd\312A+K\036\315\337\314\031\3346\246\354\214{\361\356?\333\256,;\013\363Jc\303m+\014J\316\330.0F1\303\017\236~\274\217\247\341\317]\231\321\0055\331K\211\032\373\2244C\277r\344\200\370;{\257\177\237\036\347\367\317@\000\002\034\230\332\367\226-2\222\376f\010\0012$\034\201\317?_\220\372\364`\267@\224\360\\K\266Fyjv\246\031\244PI\033{\016\017\341\217\177\317\365\026\036\354\354\230\346w\272\204\003\022\220\354\002\247\327n\017l\377\000\271\347\256\223\241KsA3\311\010\251\002F#|K\300\301\373\277\211\347\236\377\000>\335\013D\220\006\251\200\303K\201\376\021~S\015\301Y\237!H#\277\267\357\353\324\227\304\020\022\\\3100Q\221\304J\004S\275s\237l\367>\375\277/\313\245\271\323%Y\246v'D \024\345\200\002\035\334\373\347\361\355\217\227\345\365\353\233:\015W:\246RIZ0\224\344\260\004\036\344\000O~;`c\363\355\371\364b\014\332Us\042\014\242\2326\012\3302l*\011b9\300\301\317\036\335\375\375\272a\002\003\202[\263L\023dj\205\030\334\244\235\303!\227#\036\374\375z@ik\223j8d\201\252\301\026\3241\200\\\347\234\257\310\177\321\344tO2|\020\323\260\322wF*\006fU\011\200O\007\235\277\201\375\347\276z\033\310\224\343L\311\215\021xVR\010uM\335\231r\007|\000~]\023\201\006\311\015x %&\026\022\022cw`@\330{\203\216\300\376\037\227\035-\257$+.\245\254j\267\024\\\250PD`g'\345\2162\017~\303\365\372t\247<\221#T\004^\021q\302\011'\222\016T\363\217\257\277M\250KD\240a\314\356\210\347\203\001\201\210\373\372\203}\341\307\177o~\337.\205\265I \264\253Ui6n9\242\366\250\022!c\205\316\365$\235\300\016\337\217\320\363\321\231\201k\225V\235\301\275\206\250\331)\306\001\364\260\354\274\360Fx\310\355\216\334u\315\000\350\210\2111\350\262H\311e;T\363\216\303\237\327\234d\365\031\304eEV$;\177r\206\361\312\356\006K\201\220Fs\273\004p~~\375Nq\227\252\207\323{\234f\343\371X\261\202\030\022\242C\200x\347\351\307\323w\357\035CI\0059\35507;\375\220\3021!\227\000`\203\270\340\002A\340}3\217\327\250\221\027B\332`\037\025\210\261oV*\002\023\351\003\235\274\037\3508\377\000\216\230^@C\001\3036\305\014\002U0=J\011?<\023\370\177\277B\013D\306\212EB\350<\276\345\014\300\353\270\371c$\234\340q\201\217or9\352EBDrP)\233\307\275\221\213\033\2560#'\034\260\3109\366\003\035\275\217\341\363\350\005\314\247v\256\035\331\277\335\026 \015\042n\316\007\335b8#\334\223\370q\236\236\3536\002\257D\202\360\015\341\032\022M\255\220\314\003\022s\362\311\317\036\336\337N\220\347\014\312\323\\\346\264\000\217Q\210\334\243\0226\222\300\177\224g\364\317\373~\035q\022\353\251g\354\356\351\277O\004Re\011T\011$A\213\000\303\214v8\310\347\277\341\333\236\234\366nUJ\025\236\016V\365GH\201\330\371\257\260\340`\340)\316\0078\374\001\307\276s\363\342\030`I\335>\241\314u\267\335\013`f*\350\257\037\013\226\003\223\355\221\363\355\371t:Lj\272\233\313\214<k\247\316\020\004l\\\004f\016I \221\270\237|\003\372v\351\255\250\010\332\027\032w!\266+B?JBG\226\243\000\215\270'\345\217\323\266z\200N\241A\312\\\004\300\035>\236\210l\236\240\312\312Xdo#'v\177\267~\374q\327Sw553\031\274\331j8\202\260\010I\364c\031 \023\330\367\357\371\361\337\251\250\3753%\260\0019w\037$2\2543\345\237NK\200\271\364\362~\\\347\034\376>\335\010cOu\310]P\203 \240\203\350,U\224\006\030\007\205`Fr>\235>\233 \304\242\025\001\022\361\241L\205\030\020\250\310\361\356\347\030\365\347\361\367\366\316\017\341\324\022\010\222\026is\234\350\331i\342a\033p\314\271$l\300=\362\177>\335\020h\335Aykm\264\351\364Z\2222\353\300\331\2360\016s\364\347\346F1\376\335E(\006\351\22538\005\211\001\333\0336w\025\376`$\347\260\317\323\334s\377\000}\003\2357)\224\350\345\202\015\355\343\240[x\211\300\331\273\222@88\340\2368\343=A \013\225\316=\354\321\325lF\021\214\205w\315\264\343?_o\247\277\341\371\361\016$\201:'4\206\222@\223\362@\222\002YAA\222\331\007'#\3463\375:0\333x*\344\367\242\020YYK\221\271\027\000\222~\367\342?N\337\323\256\201`\244:\361\247\345\032\361\020\373B\313\351^H\301 \236\001\372\376\377\000\036\205\266\272'\0210\203\034{\235\325\335Y\033-\264\017\303\361\357\307\353\3208\015\264L\244fZ\355P\210 \221\042\272\034\225\311\373\304\373\343\353\300\357\376\2351\240\010!EB\\b.l\264)\331\310%\033b\235\315\201\214\361\363?\217\367\374z\012\216\201dL\031\256l\026\204HA2\020p@%\200\311>\335\317~\303\360?^\270\274\201mP\006n\355,\266aL\225([8#\2021\317\267\313\333\2417\012](R&\306B\347kw9\030\355\373\376\336\375\010i\202\032\245\325.'T\042\210\244\025\332\252\033\202rJ\216\303\267\317\216}\372\346\264\335\025J\202A@0\202\247|j\254\006@\034\367\372\221\317\267\353\321\022A\326\336\375\022\203\200\035\341\247\277\262\331]\240!\003q8_lw\307>\347\217\337\031\201\314\025\025\034\331\0025F\010\312\204%cu/\236;c<\360;\366\343\376:\031\233rD\327\220\341\233t\023\020\334\341K)\031%X\203\217\257\\\341k\251\246\353\330\331\010\300\300\253\230}#\001\301>\331\3669\371\365-\253b\011\\\366\231\260\260\001\034\261I\330,\204\256\010\000\375\357\304\236\226[&\333\243c\362\305\256\202\2000\033[\335NW \001\370\374\216\007\357=@l\022\245\227\270\331\014FT\222@1g\005\201\344\347\222{\360z\202ZD\315\324A\004\264i\356V\030X\026\317\272\340(>\334p\017\327\337\242\016\012\034I=\344\030\342R\301Tn\\c\345\307\375\177n\230\367\300\222R\231J\177m\354\204\364\374\354\330$>\303\276\0168?\217=\013\\\350\344\027<\375P\235\017\226\303\3249\003##\007\276H'\261\311\347\250\246H(\352A\325\032\042@\314\003lo~;\022y \363\362\367\377\000^\204;\230O-\003\273\244\255\025\362\303\002\241\020)!\263\215\303\334c\367\337\360\350\200\236\360]\236\001\036\372\241\024\313\025\000\340\034\201\237q\306\177\323\216z+\001u.\246\\L]\011!uU'\320\000\357\2163\356\010\3161\337\345\320\227L\215T\323h\313\231\326#\346\215Xd\005L\216\254\000+\364\375q\337\221\355\376\375\000q&\032\021\012}\320\034V\226\020\273v\250n\304\344\362\177\003\330{\364\307\223\034\222)\265\240\306\241\035\360\345r0\241\216>\367\001x\340\360{\340t\266\231\271V\203\042\315A0\222\355\224%q\331G\251\276}\373\367\355\333\365\351\215t\005[(\314IF\004h\324a\233h8\355\223\364\367\340\343\375z\214\262S\211\206\353m\320\325\000a\301f\007\000\261\007w\036\377\000\250\353\257\027K\002\361\277\325\004!\336\034\223\014\231\300m\277w'\276=\377\000\177>\234\014\330h\226\330\315\230\230>\3129\222\\F\301\243F\003h\300\373\253\334~=\317?On\253\202\320.\211\371\313\301i\350\263\313\363\006\322\251\220IQ\3628\306ry\374:&\270\003-\335<\2738\001\303IZ\362@\334\036w\335\273$\023\300\035\307\177\337\267E\237Y\026AL\022!\256\272\303\031`\020\345\212\362~L\007$\347\034\366\376\2350>4\335\007d\016\372!\004Te$\356\030+\234\366\347\330{\237\337\317\240\027\022\270\022\307\022Q\242\042\352\020e\201\214\016\336\330\367\372\344\374\275\372\206\264\215\002uB\035$\364\032\042\274\201\205\217l\215\031\3161\217W=\277\037\355\216\230\011$\220\251\272\221\322=\224\236H\310b\177\366\360\017\007>\376\313\330\017\370\351\314hp\201d\272\204\207\363M\337\016Y\316\325]\247!\233'*=\310\343\217s\323\244X*\216\004\233\215}al\304\254AtR\203<\347\356\220=\377\000\267K \213\015SA\004I\026B\021\011\002\262\340\026\000\362;\256>\236\300\377\000~\226\033\227]\023K\263FTA\210\310\042\336\002\340\036G\371\200\343\364\004\376y\371tg\273\242]\021\234\311\345\364G\030\201\220\235\243\313\007\223\357\264\363\317\317\215\275\003\204\016\250\201\227\364@1\020W\003pa\300\036\340c=\375\270\372~\035\003`\204n\263\241\267\007\355\252+aFF\034\272\343\036\333\277y'??\307\2479\245\302\016\210X\362\323\230j\204\0220\025\312\1770a\260\007c\311\374\273\364\246\023\004\354\232\346\266\004j\026,J\205\021\302o\000\001\270\0340\371\036x=\277N\2704\233\215\020\270C\243u\215\024\214\343.C\034\347\277<\376\243\376z\226\275\271ou\304\231\220aa\2152\210dG\223\267\342q\362?L\361\370\363\327\006\230\270\262\207Tk\211\023%\003\312,\376\2251\256\000\030n\027#\267\365\375\236\240\221\225t\336\332{\2629c'\322]\207%s\216\000\357\203\371s\376\374\364\004A\221\3111\244\272\004\364@\303\027P\270%\270?\345\347\035\363\330\373\366\376\2750\262\327Iui0\324#\225h\371X\333<( `\377\000\257\374~\035%\314\032\2565\006\3136\006,\214P\020\273\006\006x\371`\377\000\177\247G$\000B \342\351\235Q\273\011\365\005i\010\3441\340\343\363\351N\033\243o\356\262\305O/\010v\202;\234\000Xs\217\240\367\371\373\365\005\223\336\\]\020\017\270X\211\301\003\030\310$)8\003\367\375z\022\322tD\307\260\033,d\\\262\022\214s\236T\200\303\237\337\351\333\330\362\300\225\035\250\375\276\375\205\202\025\332X.NG\251W\344{\017\327=@;\024@\023q\314h\206b!e/\207a\333q\3543\214~9\3078\355\375`\\\2004M&\032K\257\343\325\013\311\334T\005,\030\002v\203\352\317\271\375\375;\363\322\232\004JS\234C\242d#B\202\271\306\024d\234\017\241\301\375\376=Hh\233\241s\345\261\357\331ZJ|pT\3627\023\354>G\237\337\351\321g\222\011D\302\001\215\010\367\356\020\202m%\367\260<\014\237on\336\374\237\324\036\271\316\004\001\311\024\314\272d\177\010\037\014\035\261#er0\247<\214\3479\367\354?^\247\265 wR\333@\021.[1\216\313\337\220}\363\237\247\035\361\337\372\3653\006\353\262\230\200\215\330\3562Q\330g<\217P\367\3439\357\317\373u\000\211\200n\233P\222\336\237\205\221\306CwG>\305A\347\007\004\361\370\373\365\016\225\324\210\006vF\004%\207\362\303`\343\357g<c\217~\303\372t9I\270*\323\253A\230AX\224JJ\006<d\261P3\307\177\357\333\347\3218\234\241%\244g7\262\030\214\200\221eB\217s\234\347\271#\365=NkJ!r\006\310~J\262d$\210\271 \260\003\267\317\031\347\003\277\323=\013I\320\233\377\000\011`\264\263H\331oj6\3451\251'\324\017$\347\344O\341\214\364`E\247\222\207W\264B\323F\204\355\301b9\332\240\035\307\353\333>\377\000\363\323\304\356\224\347\001q\250C\012q\351(\352\252x\003\353\355\364\350\0150\344\306\270\345\221\240\2620Fw\025m\316\275\211\031\007\007\270\037_~\201\215P\372\232\312\002(&2TJ\334\001\365\372~G\246\270\030!C\036\303\026\231\267\277\004hL\005#vrH\012H\375\007\374\367\035\006L\312X\374\246a\017huA\263\234n\332q\301?\217\345\324D\034\274\223\2048[R\203\345\210\210 &\322\177\372\356\003\364\374?~\346\326\007\011*\273\334X\012\331\207+\034\255\264\036\333\273\343\031\347=\376}\371\352d\023\224\354\230\302 T%c\262\377\000\235\011\031\343\323\356O\373\017\355\3215\204\023\032B\212\330\220\355F\350\177\012NX#\260#\356\367,\011\3679\317\310\376\177\211\350]Z\014#\024KFk\335b\243+d\235\316H\301\340\260?\247\372\373\023\327=\267\206\350\243\017S-\237\321\001\220\002T\01688@3\333\344\177\016\347\036\375\0233@\215z\250{@wO/\350$Ev\235\304\355\014pNpI\374?C\325\202\315\013vY\216x\016\276\353<\235\240\201\222\277\345\302\362T\376\311\352%H\260\042Q\013\0327$.\012\3479\355\370{\236\307\372|\372\227H\270R\3103;\217D%OR\005dU\356\254}\207\341\372v\355\322\352\220[(\250\227f\3124\367\365Bx\307\004!;\211\301>\337<\374\373\017\323\337\240e\202h\022\3517\005\001\242;\360\211\223\234\360=\207\270\371\373tb\042P>\307\301\001\242W\333\026\350\317%\024\253\020FO\372`t\027m\341\016`\350\022\265\344\261^\024\205$s\237\274\177\260\367\347=D\200\023\232\323b,\265$Q\356\310*\2438$\362[\236\343\217\303\277\317\243i Ys\303sB\333B\304\256Wx\347\030'\217\337\351\355\320\221\015\221\252\027\\\350\264\042\341\201\002U\343\357\014~x\367\306H\372t\000\230\235\027\023\0065[0\271#l~\274\251%A8\366\030\374\206:0\000\020W\022I\356\255\030\324\261\344\266HR\254\271\335\362\3438\355\376\275Av\336\213\2634\222%o\311\311\364\243\031\001\034\343\267\345\362\372|\207Pf\322\211\320.\026\204h\\\020\023\216\343\266\006~C\352\017\367\352\033)E\2435\221\215\021\0425\335\275\261\201\223\237\257\367\035.\233\240\022\254\026A\023\354-$jIM\270\\n;\223\357\017\237\327\373u\3033J\000\346\223\246\210m\020\364*\016A\334r23\217\227\277\375\365\3236*\035\000\310\010\317$6\347h\324\276}D{\037\257Q\234\3516\321?( \332\350\241\010vQ\202\277A\237\323\217\313\277\327\256\315b\253\271\201\304l\266)\360AB\030\205\000\344r\006{\374\263\307R\347\332\010La3#\247\341\036cQ\273\012\240\226\031!x\377\000\276?O\307\244\202M\32336|ao\312\014\304\200\322H{\200\277\207<~\\\036\210\351\321s\013n@\357-\2258\311q\261I9a\337\236\303\037\231\347\344z\214\200\240.#B\264!\334\025\214xlg\352\017\317\364\352K`j\241\240\2211\357\177T5B\000\302l%}\317\177s\320=\267\266\210\332\330\235\245\013\311\001\011\334\314\231\003\237ns\3548\366\347\362\351\205\333\200\240\227@\022\213h\320\035\213\215\330\367]\271?O\221\3479\366\374\272\346\202BA\003D-\214\253\227.\031\217\003i\3118\316@\371\367\375: \330V\013\310\020V\312z\016\364\3341\200\010\347\037\217\030\366\352\003I\360P\327\220\204\261\347s\371aH\343<\340\034g\000\367\317\035\010\264\020WCI\357\010CH\306\025#(U\273\261\007\217nq\330u\304\356\344\362vh\262\303\033?\222\204\023\220W\203\237\372\307\351\321\027\006\217\232\021M\306 \243\031\033\001\233\316.\252>\361\341\207p2{\347\237\250\352\033\007E\004@\221\262\031\033w\007\302\2618\340\002T\374\371\357\357\317\323\035pf\350\334\363\241\324 \230\230\225\016\254\330M\277w\220\010\375\366\351\241\300\011H-\222g\224##\211\316\310\344pG\261\344dd}y\366\374\261\320\275\343P\230\306\0202\223\262\020\214}\366\016\307\000\234\014\214c\277\357\347\320\202H@\3425Z\362\362\241\006\323\376r\271\373\274w\007\334v\375\343\246\264\301\222\224\373\300\036(\345I\003\203\226\366\033\230\202\007\346?/\353\322\310\020\025\206K_u\263\036r\317\311\301'\214\377\000\257=\276}\261\357\320\264\011M3\2270E\371o\260\344\221\202\033,y\034s\317\271\307?\274\365c8\333U\\\322y\020\353\016\250\325\246\362\316U\2673\014\015\313\313s\300\375\377\000\247J}P\353\220\2140\263\272\333\312\022F\217\271\032&E-\205\340\261\316y\374\206y\367\350\213\210 \315\221\000\034\016a\027\262\337\222\315\313\006$\256r\307\226\343\223\376\277.z\202DB\2275\377\000\273\242\303\020#\313\364\006,p['\031\030\034\177\\}:kX@\222\020\007\317q\246\012 \305!$\206U8\357\236\033\267\372\347\365\351\315\000\350\025C[,\222Q&\000\314L\204\200\030\344\373\036}\301\375\177\247L\000h\012\246Y'3\221F\001\226\314eB\372\271\307\007\216\017\314`\217\337i-R\301\006\\\012\001\213{1@\001\007\236F}\273\377\000\260\355\320A\026(\205@\351\205\263\026\025\231w\251\013\270\340\345\235\261\363\3759\376\275D\334\002\214D\0226\371\254\021\024\010v\0007\034\0220\177>\226\353\350S\034\034\016\210\246\211\237+\261\211\301\340\034\234\374\277\1771\321St\013\356\226$\354\213\362\262\356\201cW\377\000)$`\237\317\034`\365\317#Y\262\352`\203\000_\305k\313\001\210!\302\221\264\003\334\036\377\000\357\320\271\240\015\021\323&uCe\303\310\215 E\367\371\343=\363\357\310\347\360\352\013s\000B\042\350\220vAh\224\243d\273.I$\256N>\247\375\177\323\250\014\223tO\322\020\212ma\034\212\035\211\031$\014~$\343\236\347\241\211B\343\006\021e2B\230\367ev\376<\177c\2201\370tRbe\016i\331\017\341\261\205b\021x\037w\270\307\375\366\350)\222tL\250\300 \202\266\324\352\313 e%1\237\237\343\217\257\374u\021\230\250s@i.\026B\021\222\314YB\237\363s\316\007\317\003\376z\022\302.J\346I\270\010M\024\217*\252\357a\221\273h\317\034\347\217~\337\323\242\003K\251/qwui |\014)\034r\2438>\377\000\241\371t\256\321\247U!\262V\030\214a\325\231\225\262\011\030\340\216\335\276]LM\324\021\271(k\000\300 y\216=X\007\033\200\317\007\364\352\034I\221\2620\320\000#U\263\012\241F,;\340\023\220\033\267\177\257L\022\353 \210:\241\371%\367#\362A\012w\021\203\317\323\376\272\007\015\3020I\260A\222\020\273\203\221\313\003\203\337\271\367\307<\377\000~\244\\r\262\012\226\260\034\226\374\260\307\320\212\322c\261\037x\363\334\373\237\307\345\3245\202 \332\024\366\244;\273\252\301\033\222\305w\026\306r\270\3162y\374x\350\336\321!\000\274\243\226\034\225F\347\217~\336\374\344~\237Nz\257\230\001;+4\314\272=\364F\244m\207\012O9%A\340\037\231\036\343\367\357\324:\234\024\266\325%\245\005#_K)8\371\222p3\316\177\003\363\377\000n\2408\215Q\2153\015\2264\004\215\331\220\356;W\234\202>_\337\372t\340\360\017@\200\267}\312\320\210\000\025B\247'\031\354\276\377\000\363\307R\341\346\215\220\006S\250B\021\241\012\027\312\022\034`\036\347\031\317\341\357\372t0\340o\242\234\340\353\010F0\356\035\326Bv\3603\311?\042~|\036\271\254:\002\272\243\332\\_\020\202\200\222N\321&q\203\236\377\000\210\371{c\351\327v6\276\212YW0\200.Q\202\035\245Waw%\260\000\317\034\367\307\342:\022\011\020\015\223\036Z\323\004-\210\306\032@7{`\021\351\371\034\376>\375\372\020\342\014\004\240\320[\232\177\204#\016\006\334\231\023 \015\247\270\371\037\247~\270<\370\025\301\260 \225\277!A;\0078\332\020\017~\336\377\000_\257\266:6\324\320\224F\001$\015Q\236Q\021\252\002\012\347p\000d7\357\267\317\242\032\331EW\311\215\226\2258,\310\333\310\317nN0y\035\363\355\221\321\226\315\246\312\030@n\227B\021)W\215Fs\201\203\301<\377\000C\355\321\026\235\\\205\257\0327xCX\326B\262*\023\036Cd\362I\300<\014}?\277\327\240\026\262\227\264\223\232 -\354(\255\207\2126@\030\200{\363\317\323\261<\237\323\242q\223\010\363\344ip\264 \030\370*\354\033-\351/\222q\203\214\376y\374z&X\367v\011E\331\204<\311[1\371,\002\205D-\267\007\203\365\374\277\337\037N\244\262OU\002\241owm\021\2462\001Q\346\372\216\016}\211\347\337\373|\261\3232\377\000\261Me\200i\320\243\212\205\222@\300\354 \362{c\030\344\374\272Pi\032'\366\242\355:\037\351\026\3200\306\300]\301\340\216Y\2161\306{{\376G\353\321\002\015\266UH\042\366\221\277\224|\256\202bW\334\012\264dc\3243\317\327\201\375=\272:e\240\334\331\005Ix\222\324S$l\314b\177,\250\311\033\316\323\234c\337?3\237\357\325\252b\301f\326p.$\035?\205\243\011\012\240\243\254lAq\222@\034\344|\317\007\351\337\251\002o\012L\201\227o^h\223\024\215\202IUn\010lz\2608\374\277\271\374z\347e\363\012r\270\031\330\240\274cj\261\000n\013\215\337\333\236\344d}:\002\3302\231\234\001}\341a\204\202\034\037,rpI\347\360\007\271\367\351:\230\011\244@\224\\\221e\200\004\224\306T\237\220\367\301\347\367\337\251,\000B\342\351u\321m\031\337\267\0126\202\006\033\236\334s\371\377\000~\202\243`!k\263~\343\242\337\224\031\366\356\012\017<\361\203\357\307\277\317\351\355\365\347\210\011\264\233.!\011\341pX\221\260\006\311\310<\021\376\337>\205\255\226\304\242{ot\017%Kg\013\200N\0008\332\177\037\303\267D\307e\010\014\037$\023\012\002J\354\343\001G>\376\377\000_\303\353\3278\354\204\033\255\371D\222S\013\3540=\261\355\370\374\375\263\320\221\002\0271\306%\015)\224\0111\021*rF8\307\353\301\343\236\205\317$\243\2206X\260\207\022\026a\032g\007<\347\221\223\3751\217\353\323\034\321\241@\302L\225\211\010,\333\311v\307\250s\220\177x\350\036\310\026\262\032N3st3\021\377\000\330\253\234\347\226\306\006\001\347\353\357\372u\004\011\272<\360$-\010C6\331r\330\007\333\000\016\334|\273\377\000\257Bd\213h\241\244\\\022\214\362\210(\240,d\214q\306=\261\234q\363\355\362\353\203\240&\227f\042\026\215.\322\361\220\230#\007\236G\373~=\033\256g\222[\233h\331\011\343\310\030\316@\372\214\017\303\344\006\177c\250\220?qD\010\021\221a\205\231J\371`\203\2161\215\276\301G\351\237\257P\322&e\003\311\323T!\010g\302\2316`\236\007\261\377\000\277\353\327<\026\213\256\004ODg\303}\327\005\360\270<\234\343\203\377\000\034\364.y\323\232\223O-\306\313\026,;\020\330R3\214\363\221\3568\377\000~\375I\230\262\346T\010\317+\371\236\223\207\354\006\011'\345\317\347\375:\346\331\260vD\323.ZX\202\214\024 g\214\214\001\307\365\030\007\277n\225\254^\310\332\370\226\302\333D\345\031\345l&\177\312\277{\352}\376]D\002r\267U\001\307(\316\261\351\302\260\005\024\203\307<\343\351\223\355\337\347\321\261\262\024\271\320n\202\321\223\346&\310\370\031\301=\275\207\367=\376\235\021\035T\346&\345\032\261\026y\002\200@\354@\310\377\000\217o\257n\202\302\011\324\242\231%\243\337\273,\362\0129r\012zA \247\320q\370\177\267\343\327<\000\325!\275\377\000$#\021$\023\030v\343\003\000\234\201\333\3508\351li\210:&\207\003.\002\376\376H&!\205\337\273h\344\344\374\317\266?|\375z \012Y\326\\Q\213\013\035\240\362\207\035\317\353\373\375\223s\240Y1\264\340w\326\222,\2632\243*\360\312q\234\367\356O\2762\177.\241\355\260I\216[{\272\305\204\2530h\344\337\376l\237V\017\351\217\337\327\246\226\022\001Kc\262:\015\217\321\011!\014#\312\234\266\010\007\030\317\341\216>_\227=\013\251\345&Q\313KB\021\005D\212\013H\347\360\347\351\333\360\376\375pn\204\331vc%\242\345l\307\211\011P\300\002=\031\030<\177\260?\207=5\315\226\220P\203\337\315\262\031\205el\224T \201\365\007\361\371\216\371\351M\004\002\023\011\314\340H\213\241\354R\235\306wc\216B\375\011\375\366\353\262\346qF\013\003o\252\315\245Wj\261\343#\014\334\220;*\361\373\307R\332P\343+\273A\227.\376\354\261a*T2+\000F\320\177\315\337\373~\276\376\375Hh&\312\034\356\354\035\241\014D\311\202\0240\003s\202\017\253\344s\365$\367\347\216\212o}\324\266\000\226\337\247\341\015`\3637.\321\302\222\271;\210\347=\376_O\257F_q\011q9\244\350\020v.0\345\345B\333[\267\313\261\037\227B\372Pd(\025F\223dY\214\017[\020\200\201\236;\237\246G\357\216\230\032\3312&\022+9\345\263\244\241M\013\025\301\015 \015\201\225<g\221\316>c\267=[\021\265\225<F\240 \371xWr\276\240yb\0062~_.\240\265\010\220\334\323\354\244\376H\\\306\254\231\0148\306q\362\377\000S\362\353\210\006\352L\221\224s@`\024\340\201\030\000c\333\000v\317\314d\216\177\337\250\354w\233)m[\337\337E\202\0279\033C\034m>\373F{\016;\373t%\240\031\011\304\270\353\357\336\2119\211\343&\026V@\000\015\220\011\007?\360>}\272\216\314\000\226+\020r\220\214X\3013F\310\274\002_\003\322\331n3\307~3\325z\264\356\035\317\371Nc\301$\021\356l\265$~\202P\022~\360%q\236I\034~'<\365,o4E\307\375v[\370r\316I\214>\0161\356\007\357\217\323\241!\332\004FM\312\002\302\001\021\204\334\3079\340\014{~C\277=\277N\211\355 \353\242\012n\021\316Q\236Ab\273@8#\267\003?\237\260$\377\000N\203.k\2711\306\014-\010\303\263\271b_\003\271\355\307|\374\277\014\365\316i\200\012\006\324nn\250\177\016Q\216\310\301\221[\030#\0006@\031\375z\346\200\177r\347\223p\335\226\314\001\210\336\330\301\0319\340\234\360q\307\271\307Lq\264\200\212\231\275\320\226\015\314\333\220\263\014\3407||\363\376\335C\306\303u\314n\244\254h\021[\323\0322\222On;\177Q\234t=\230\347u. X\013#\032\237dl\314\013\021\206\001G\335\366\377\000n\224\322I\201e/\031[&\345\004\3001\032mU\366\003'\201\363\037\261\321\3046\373\256:\302\003A\376g\332\336\240\337 \243\352q\307\372~\275\034\211\200\025z\200\356Q\202\223\001\200gR9r0\0119\367\367\372\343\375\272\027\000\010\220\230)\365[Xc\301%I\347<\214\340g\003\037O|\364!\226\262\214\240\031\335\030)W\206,\020\226\316G~\374\034~\235\272\010 \301\276\211\243(l\356V|>KJS9\343\205'p9\375r?\257D\303\042\313\263\002Iu\320\214>\206\336\006y\031\306{\343\237\241\372\237\227R\001\231b\032\216\000ABX},\011\036Fq\300\355\307c\371\343\360=(\266<a\030t\231:,x\202\220\273e\213\000\361\236\374v8=\270\317D\326\367aEG\011\201hB\362\303\357\300,>C\2619\354~\\\374\277\324t\002\231\035\021\232\215 ,ja\264d\000{\214\014\251\35601\330\367\350\357\266\205A\247o\177U\246\207\033I\215\224\023\355\307\177\177\351\337\360\352C\024\023;!|>\010\\\226n\370\031\316\011\374{\361\324\023;#\015\335g\222\024\253\025\301\037C\217\237#\277\037O\227\\\005\210\013\241\245\300\2248\341@\321\224;\210\031\033N@\372\017\230\306:\2076\360S)@9\232n\026\222\022H>Yg\317u\000\373\373\237s\306\177\247\323\246d\265\364\\\3024\032\205\277)\312\253mwpJ\355\317\177\257\323\261\037\367\324\026G\202\034\345\320u+f\020L\247;}\230\026\356;\362\177\036\240\014\306\0279\331ZI\323\370BXP\357\335\264c\205\377\000\355\355\317\323\037\276\335\010\220S)\000\371.(\006\026h\334md||\207\004\363\217\351\323\303$\311\272C\336`\270[\334\255<(\334\017J\266N\033\202\275\273\377\000O\371\353\233k\302\207C\200<\320\204j\030\262\372\017\034\001\334\363\371\017\317\376z\222\320L\2415!\304\204b\306Y\374\275\276\2569\3178\300\000\251?<\177N\271\322\330)\2549\317A\252\322\302\254HLv!@PG\037,\034\214\363\3208\235\3211\242\367\215V\314\012>\352\2027\014\225\034p?\337'\250k\214].\253@6\321\015\240b\033p\335\201\306\341\216~\247\333\376\270\352A\015\327t0N\236\345dQ*\027\362O*\334\023\200Fpr~\277\323\2420\177re;\\\037s\365G\254A\303\256\315\361\260 \347\361\371\347\267lt1\006B\226\206\220A\032\373\376\220<\245M\310\371\215U\210V$\036~C\035\376x\374za\357\031\027U\332\313A\264Yh\306X\225Fb\024n\0318\030?\323\277\372u\335\231u\264Rk\0159!=12\263\356V\221N\001\0078\347\276>\\\376\277\227VZ\341\020\025\012\224\334\035\233p\201\360\315\345\202\315\271A\364\220\331\000q\221\364<\037\307\242\221\240P\320\354\262Qb&*\215\265\320\253\015\300v\003\003\375\207~;|\372\342\042\305:\211\320\254h\033qe\014[\030\3562>\271=\375\216?\277P\015\257\242\352\217\203mPL.\314\300)\177\274A\343'\362\366\355\357\362\374\372]\2412]&\021F\000\245Z>J\217e\340\034\234\376\036\337\365\324\270\310\272\206\030\263PL\004\346=\354\350I\013\354s\237o\323\214u\015r\347S\000\334\331\010\304\322\020\014EA'>\256\374g\363?\217\271\374z\002\301\032\243\017$\351d) \307\250\211\030\003\225N\377\000_~\271\232B\352\206\004\242R\000\213\270\002\315\202C/\000{\2203\355\357\324\226\311H\2024\335\030iU\2162\273\001\334\033\236\340w\375\007\277\034\366\353\234\376I\245\227\203\242\322@\011oH\210+\021\316N?\3279\352\011\353\252\2067\230\210+\0153\006\2200e\377\000\361\317n\334\037\247\000g\363\352]P\022\270\264\211\205\266\247\033\3001;\372\210`Gn\337\327\234\343\2420ZH+\2009\240\350\2174\376Z\002\026m\207-\3019'\216s\337\031\375\367\351l\357\\\24685\2426B4\315\216\371\307\336a\202A\3668\375?\016:X\033\004\327\210\272\332\302\212\304\251\302d\373d\0029\366\374\270\372\365&J[b`\024X\200*`3\026\000\347\007\261\343\333\360\306?\323\242\2317\321\000\210\2722:p\304*\266\321\216T`\200q\311\317\267]%\267\204Lk\\\203\360\311\030\000\242\204\030\000\373\201\354H\371u\001\310\\\306\201\005\010\300Idl\217W\2678\374~\275\272\202o`\214\035\2125\240\000\263\027b\271\015\234\3400\366\355\364\350\005\2022\3503+mM\223!$mO\274Xv9\371~g\333\276z\351\033jT9\240\313\266ZJ~\013 \016\000\332\013)\355\370\377\000\257E\027\272\220f\341\010\300HV\014Y\033</\3358'\270?\207P\326\301\272\002\034\000+b\023 !\233k\362\017\037N\377\000\337\217\357\324\002\002,\331\220\226\015\347\005\023\226\306\012\347#\375\376\275\272\214\201\272\256\316H\200\026\204>\205eRA<\222pK|\277>\375D^\012\226\274\344\007E\206\020\353\264`\341x\030\301\355\377\000?\327\242cr\335App\225\215\011\334\004\204&q\351\333\365\356?\037\307\242n]\027I\032\240\212|\024uM\271$\201\273 \361\363\371\016{\365\017p\211([3`\207\024$\340fU\371\344p\336\374\237o\313\375:\007\352l\254\264\010\261A\020\251r\010\005\271\031\034\340\376\310?\327\2468\272\311!\242V\304C\206%P(' m\347\361\037\\\214\343\353\320\221\254\356\215\216\264\373\225\236H\306\3249\307l\0201\317\313\330\377\000~\271\266\020P=\342\011\032\005\250\342@X\252&\314\017l\001\357\372r\016>\276\335\272\227\266H\213\251\242@\006\326\321\015b@\250\023k\376|\343\037/\177\365\353\2570\244@\002.\267\360\342@\305\212p{\020;\373\347\353\330c\241\017:)\000\026\311Z0('\220$\340q\316s\363\355\370\363\307R\327\035J\\4\200Q\251\022\014*yJ\303\223\226\347\333\337?\207\353\320\274\022e\310\351\2219Z\261\242S\226\002&%\260\006\336\024\234\374\277?\327\256\000\314\246\2264\231\036\354\202\260\242\214\220\025y\310 n\036\374\367\031\307\267\364\351\227\231K\200\001\004\254\020m\014p\261\356\033T('\350}_\237\007\376:\342\3510v]\224\001\003\177wF\030X(m\213\037\000\203\214\343\217\355\355\307P\016i\001s\315\2020\304\354KyD\034`d\344|\207\347\317\372u,\026\005\336\371\245\275\344\222G\276K\0322\025\317\362\367v8\343\007o\371\272\226\264\003e\300\346\035PZ\015\312cd\334\230\301\312\347\266=\207\267o\370\355\327Rpi\226\252\365\200u<\245(x\216\347\012\025\316rT\257\336\371c\236\375\377\000c\035Z\004\224\252\232\300\325\026\361(PN\301\202\010\001\275;s\333<\344}G\313\3379\352\007 \205\306\327(\243L\002\311\263pV\355\220\001?\227lw\375\367\231\235Q<\010\200\201%?\230\212]\042$\003\351\343$c\221\365\343?\247PH\205&\234\357([\016Q\324J[w\031\366\034\220{\374\371\372\000;\364&\023[\377\000\220I\374\202\010r\002\250Q\207l\347\277`=\262}\377\000\016\215\303\222Y|\231v\210B\022A\332\210\270<{c\203\221\337\361\037\207\343\322\264>(\234e\271\202-\242S\037\224\027\034v\357\237\310|\276\177\207n\212\010t\240\02537\2420\323\0042\020\011\005\275\271\300\366\307\373\375O=\000t\204d\020\264 \334}c\271 s\372\203\364\377\000\237\237G\233\222\226\231\022\342\264 .\021c\212A\222\245\227h\014\276\331\374\177\337\241\323U\316l\230n\350\341L@p\350\341W\323\352ln\372\177\177\331\350\011L-\020C\220\214\0143\265$s\221\234\366\343\266G\342{\236\210IK2\015\256\261au\035\334+0\300\014p}\375\377\000\036\241\304\037$bt;\254Zu\001\363\030\010\304.0G\344>\235\277\347\256x;\024\021\027+\014'%\220>\322\016}\267\017\307\363\034~\035\023\230@\262\002\371\270\321o\312\013\271\225A\344\221\273\260\030\300\307\372~\035@\246M\266M\355Z\331$\373\321m\240\221\221\362\256N6\345\273\216s\317\364\374\272\340\350rQ\026'\247\345k\310\217q \372C\022>x\343\277\317\250v\221\012Z@6(\306\205\233v\3059#9\374Fy\007\277s\333\241\015\334\246\020\177\325lA#\024RYAl`\343\324\011\367\317\345\324\310\032)iq0Q\211\021U\331\313\022I$\216G\347\371t\2476Ne,vV\345\204&\200\261\303\243\016\006\337v'\360\352\016\226F$\230+mN\260\272\204\377\000\330\271\3079=\276_\257\374u\314$\334\251#+\241\275P<\211\030\347-\222\0067'l{\177N\244\270\015PK\201\325\032\360\312XH\006\345\365eH\366\307\336\317\372\177\307]b \042.t\203\357DY\204\362\002\2208\367\347\236F\017\351\307P\001\042\310k8\204/\207S\206dT\003;q\334\223\216\377\000\367\320\211\004\242\000\015V\215?<\022\001$dp[\031\357\362\374~\243\2466/*\034\323\376\245\004\300K\026\333\226\000\340\034\363\317|\373|\263\375\272\347\230\262\0062L\255\265?\250E\271\310\301\007\270=\21798\307q\370\347\241c\340N\351\206\230&\020\322\0242\023\263\323\2678\306q\3061\362\007\360\357\371\365\320HSM\342\350+\032\267\251#,\334\343nN;g\217\307\214|\272\340H\324\243i\004\346\010+\001BT\002\304\234r2A\377\000L\364z\231J\322\305\014S\270\311\000,\244\022Fr{\363\307\261\340t\004\200.\232\032N\213b\231\267\262?\230\247\214\222F\011>\307\037\333\267\007\351\221.\377\000\305\033i\311 \230+\004\014\301\344\340\222y d\237\220\300\376\335qv\312)\202\033$\333\346\204i\275d\235\353\306\334c\267=\261\370u\324\315\224\275\223\322PDJ\211\312($`\201\355\362\037^H\347\217\3667\264\314\362CH\345\020wBXO}\2439\031\310\003\330\014\347\266r\177<\365\016q\230\3311\207t#\004\236`Eu\316\010\365`c'\271<\036\376\336\335\016h\271\350\205\315\2744\255\010\334\014z\225H\334@\357\237\237=\207\277\373\365'X*C\273\260}\225\221\304\273\010T\362A\311$\020q\2169\317\277\373{\366\350H \316\250\001\026n\210\317\206\030\365\375\345'\215\244\003\203\217s\237n\337!\365=\024\231\216h\303\032[$\350\213\362\311*\341\033n\007\335\037\226\001\030\301\372\376\301\264$f\002\346\341\032\261\253a\202\246\356\331\366^1\302\347\236\227}\323$j>~\010\271#\331\274\264q\251$\343v6\367\357\234\216H\307\353\323\031\004\363K\003,\202!-zc\346\015\341\012\362NO'\277s\354?\247\346:\272\010\205\235R\233\263z\242\274\206\012\236je\225\210U=\217\377\000\322{q\203\317D\353\314\025\324\233\000f\036\374\026\012R\001g\036[\002pXcy\357\310\374\217\365\351Y\306\20142\033&\337tX\200\266\355\333\267\034g'\2228 };g\363\350\236`Y\003\031?\277_\341\003\311!c(\301\271\005\262\274\237\313\337\037_o\303\240-\004\311E\244\001\242,\323n\313\005\300\034v\3109\343\003\347\362\307\323\256\017\032!xv\241\0128\0301\302\020\240\343h=\276\230?\\~\275uH$\002\246\206a\341\356\313>\034\0251\222\261\3627c\2009\375\374\307\364\352\010\335Hh\202&9\254\216\021\200\254\273\261'9n\307#\237\257\277\\\351\027L\244\356|\320\314B4V \252\214\216\017\320\234\376\177O\372\006I2\246\253\362\001(B\224\356\022\345\273\344\034g\366=\372\222\340l\245\214\203<\326\3153\002\373\2320A\340\237\362g\337o\277|r}\376\235A \0249]\271Z\024\247*6p\200\215\277#\333\277l\367\352\034A\021\271R\033\006\332\017\312\020\215\362\373\324\200\016F\354\014\036\377\000\334\236\377\000\351\324\026\266\320\244=\322K\220\314\014\322\007\000\0312\304\003\354;w\374\377\000>>]0\201\020\020\220\342g\337$\037\207!\301\332\030\016\030\225=\361\307>\376\337\323\251$\256\004M\302\033S\205\333\221\346I\270n\004\375\303\316\011\317\341\373\347\250l\336t]P\000\004\\\242\374\217VS\324\331c\2200H\307\267<{\361\307\327\243\276\342\3116\315\335\353\357\301\036 \005\260\312\212\331\302\372{q\362\376\277\247U\314\350\025\215L\302(@F#S\265\216\337\272s\355\337'\376\307L-\347\325-\255\266PwF,JY\2208\335\355\202q\217\307\362\356z[\206\211\2147\215\320\332\235AU\310u\000.\326\036\331\371w#\217\353\327\021\230N\350\335\001\011)\211\377\000\325\033\042\0201\337\221\316?\277\364\035.@\264\335K)\346\375\272--8Q\301^\371R8\317\317\223\333\376\272,\323\242\006\300C\020\251%\201P[\261\355\223\216\337A\357\371\216\226\346\231\202\234\0107\033\254\370F`\300zI\340m=\317\372g\366z\042\340\010\005C(\222\014 \264d\246\366\031\365`\236s\337\222q\377\000|u \005.v\375V\376\031\301Ue;\262G\004\361\370|\271?\323\240\016\264\204A\256h\202\206\260)\330\250@\347\225'\000\001\377\000~\335vx&T\206l\021kLU\227\226,x\311\343#\347\237\365\374:7\011\004\224\015\031H\203u\264\246f\012NV@\271\003>\336\377\000\367\320\027&8Z\332\242\222\034\226\365\226\\\005\030\007q^9\300\375?^\230I\001&\220\235\365C0\017\363\010\317`\011\035\271\300\034\374\211\374z\026\216I\317\004,\024\347k\256\012G\267\357\0259\307\342{{~\235qj\201&z-yjAf\021\217W '\030\357\317\313\337\256kN\312X\346\210%a\204\223\351\332\037\352\243\361\310\317\277\003\353\324\300\013\200$@\325jH\\),\312\340\256\024\201\301\031\343\2779\376\335\3723L\033\240.\042g\325\015\341 \226\014\346?\376\244g\267<\214v\307\343\357\320R\270\312\211\340\346 \233 y\004a\010,A\034q\301\371\216\334\362N:,\300\241\023\2721\242S\271\230m\301$\373|\277\333\2451\320r\246\324\322\310\264\200\2170\262 q\216v\373\237\307\373\376>\370\351\257\350P\264\022\323\233_\2723\310F\332$\012\362\023\2361\333\347\201\364\366\351D\336\033\242#E\244w\305\326*\015\300\344\262\246}#\004/\320\375\007DA\210P\035y\345(+\007\244\345C\2766\340\251\347\221\236?N\245\320M\324\323\022 \\\243\314\033w\355\014O\276F\012\222\007=\263\356}\373~]\006RE\364F\346\206\202\002\324\213\270;6\326\035\223\007\347\333\237\337s\300\352Z\016\312+\233\031Ah\210\303\030\213\223\203\267\356\340\363\217c\3541\324\260D\301\204\247\274\236\361\023>Id\264\346F!T(\007v\017a\301\306{\340\234\177^\264\232`,\212\242O(\224\021J\311\264\005S\271\361\216\300\023\362\307~\335t\202L\2466\231l\035n\203\360\262\001#\272\342F^p\330\331\237\227\317\237\355\320\210\333dY\015\313\275\373(\243\023\014\200\201\011\034c\200G\327\345\357\372\217\227\\\005\343d\247\314\300\325\010\3026\206\220\241u\004\020yc\371\217\304\036\225\226M\254\254v\226\004\255\010[z>\344\310%x# \375}\275\361\370tP\010\200\242Ht\224\017%\3676\326p\204\226%N\355\277\231\367\372~\275\031\015\042\351`\220\343\006\313kLC)\012\254\270\366<\014\216\331\377\000N:\022fN\350\331\255\356\026\332\020\314J\253\223\301\307<{w?\357\330t-d\013\243x\227CF\250\301FP\1775L\254\017,8\310\317nz^k\310E\220\264w\204\225\243\032\005]\333\203\022[\0078\355\337\217\304\016\2100\314\241uF\201\325mb\000H\021@\000rN0>\244\177\247R\0327+\203\214\020\006\210b\227\326\221\205\010\247*pFI\344\355\371\347\236\204D\022\177\244]\231\016\201\242\331\211\224\253yM\031\012\274\217n\000?\227 w\307]\331\242s\316i\042\026-0\364\343\226'#\324s\234\347\214w\371~G\250 \302\346\265\240\310F\264\005\344RSr\021\200\000\003o\277\313>\335H\321K\201\315\321`\246bT(\301\333\223\203\312\234c\373\177O\237]\020!\006Y(&\2320\247lL\025A\332\017s\376\377\000\276\375D\316\253\262\264~\320\215\024\347\022\214\015\234\347\000s\300\343??\357\364\350\\\330!\033\014\311\205\263N\010\364\200\244\217Q\007\356\234|\277C\377\000\035@\230\223tf\011\206\255\0302\035\007\246L\214\036\011?\227\277o\353\327Dk\242\022&\301\030)\300\300eo\272H\00501\364\372\363\375:\007\211\357l\232\306\217\332PM8Ub\321\252\221\367\200\035\376\247\361\300\350\200\220\201\303r\204iKd\025\300\307!\262N\177x\3527\266\250\215\030\375\310&\026M\243\313fPp\010Pv\214\374\307\343\217\303\251\015B\352\240@\331lR\251\300U\012\344\177\227\334\036\177\333\367\336\013w*Z/\001`\207\004\214\026n1\236\303\353\317PZ\021O\252\021\2478\030\334\312pNy\347\360\372c\250-\000&\3017\331\003\312`\373\231\0247\335$\016\016~g\277~\177\247\\@\213%\311&\350\265\203\0146\371lwgw\031\357\316;s\365\372t\307\011@\301\006\000B\362w\004\214\206\017\216x\343\217o\227ls\3209\207Q\242 \351\000\015V\2026\001\332P\222\270>\371\372\023\355\301\352K,W1\303\222\027\226\003\002\305\230\214g\377\000\256~\247\361\307'\251\002\004\246v\227\352\212\226\234\214\276\315\362\236\027<{\373\223\3270\316\366Hx11(F6vB\312$c\203\2162;\177nz\033\015,\234Iq\270\231Ah\004lB\214\201\221\274\260\364\2369\347\367\317B/tNkA\313\363Ax\325A\013\303\021\214\377\000\366\344q\300\374\277\357\2475\204\301@\347\201+F4R2\357\317\336\347\033Gl\217\227>\334\364\014f\341C\334\331\203\272\011\247Pp\021\260\243s\020x\310>\340\367\037\327\243\223\035T5\200\023\033#\233\001\325\2356\250>\226'\030>\304\177\277\324t\015\246\010\356\247\276\264\272\\!\004\300\254\031v\312J\366$\347\337\234\034rI\300\375:\346\222\024\0264\235\354\266\350\371l\010\374\260\333s\220\000'\366?\250\353\233\002\307T/.\222F\210\006%%~\346\360\010\347\260\357\337\351\357\365\347\25037D\003M\305\217\277\252\030\204`0W`X\355\0120@\317n=\273\363\371s\317B\360I\200\241\220 \365F\010\021\245\001\020;\000H\371g<\234\017c\357\371\376]\230\345\022S{>\374\266\366\225\255\233\306\361\226 \205$/\2660\001\355\236}\273w\371\365\035\002\022\3719\302&\2428\214{\302\2509\347\216\010\371\377\000Q\373\317M\242\313\221\252\251\210\250$8Y>\264\012dr\321\371\204w\334228\306=\2709\372\366\352\331\020\004\025\233\332I9\304\376QrB\031Q\243b\253\223\202\343 \375\017n\375\363\324\304j\024\027H\226\240\232p\000R\254F02s\273\345\216\270\015\302kj\022r\240<\014K\015\255\333hc\357\223\236O\317\337\376\372\2229%\212\222r\224\024\247m\216\200n\217iQ\363\301\371\017\227\357\360\027k*[X5\260\264\260\371\230@\221\3101\206\311\344\363\333\036\374\201\363\367\350\013H\022\231\332\207:\004\037z#V\235\303\020\321\222\007\310\340\216>\367\037\207@GT\346T\346.=\312\012\323\222C,BF\3160x\007\037\323\367\365\353\235-SD\207\011\032\254Zb\010\362\302\005\343\234\373\347\200s\362\306:\222\321\252\026T \222\021\221\300\362m#\324\307$\214d\216{\037\257\357\216\201\300h4F\312\244\216\250\042\237\004\253c\030\012IQ\311\372\217\227\341\357\321\273\230K\016\000\301\350\2154\314p\242&\227\035\361\356\010\343\217\366\350A\264\2567\356\213\255\212y\000A\031\030<\034g\360\357\372\364v:\251qx\206\267E\277\207p\016\360y\034\001\363\357\301\367?\361\320\307%\316y\026\335\004\323\340\006e\000\356\335\2162G>\337\353\324\264\311\312\022\313\240\007:\327\371\177hb\221|\314\202\373y\300#\030\036\376\375\271\352\011 \042\020L\222\206h\375\016@P~y\345N\177\267\007\363\350\011\032\235\023\262\223\274!IJ\341\230a\327=\224\344\366\036\336\371\372u \310\262\207Y\322M\326\012ouR?\315\234\373\217\307\333\237\307\256.\211%s\177\361\013\032\225Xyd\225<\343'\334\216A\372w\347\360\353\201\042\352\035\336\267$$\247\311H\310\340\362p1\216\336\377\000\327\363\035@\000]\023\252I\312m\010\042\022\000\302g'\007<\223\317\271\374\307FX6J\247P\304\235\326|:\020HI\011S\222r=_\274~\037\217J\276\351\331\30126\371\3120S>\000$\261\036\340\234g\031\374\317C\236\015\2218\230\352\202\224\250\020\347*@\343h\300\037\200\307\341\324\202e\003^\320\010\233\004!K\224\3360Cd\034\034\344c\216{|\277\017\247B\004\024\314\247^a\024i\224\241^\003\036\347\035\317\323\345\236\337Ltb\345vf\213J\021\247pC.;\344\366\0319<\376\035\217=\030 \370\250\250\363\022\213\216\020Jl\301\347o\003\277\261=\003\300\230QF\247\373\005\261\023\272\202\255\351'\320H9\036\374c\362\353\201\201\242\354\304\213\371z\255%8 2\371\211\307\247\0039?\357\370t\005\244&5\300\211\022\265\025>\035Ib\274n\303\022p\275\275\373\003\307\357=\025M4\272&\211\270:\240\232l\250$e\206pH\316}\277^\377\000\207A\230\352\211\235}\335\015\340~y\012A\302\202\270\014\177\017\3363\327Xh\027U.2\011E\210\012mB\252\244)\004g\005\201\307\007>\337^\212\005\367]\333\020\335#e\241NpY\366/\037\345\343'\345\372\376\370\353\203\240\300\012r\367nl\213jP\212\305\3326\364\000v\236\347\037\257s\321\007r@m9\210(k\036\025\211W {\340s\357\214|\373\376\235\010\005\033\2362\233$\242&\037u\025\344\012\006W\215\337\230\344~\035\372ao2\202N\332\243\314%w +\300\007\234\016{\361\364\343\245\0025\011\317y=\320\264\260\223'\017\217V\024\344\034\367\307\367\317P\327@\220\024v\302fV\214 a\201p\331\367?L`|\373{\343=\026\272\241\004E\220V2$\332\\\004-\334v\300\374??\320u$\222$.\317\016\203\317\311mUx_,\042\340\234\036\353\236\377\000\217\267\341\324\226E\334\247\365\023`!\030\220\273\253\304\312T\205\007\203\201\310\366?.\337>\205\360\036\011\321\035'\027S \352\002\317!\202o]\240!\301\030\004\361\317>\347\364\371\374\272\211\032%\323\221\336\233r[\222\006ps\261Wq\000\202G\271\367=\263\321\261\304u*\256(5\315\207X'\366\201\235\234,3`w\347<\373q\377\000\367c\337\253@\2005Y\300\346\223\006\020%\203\220\314\025\324\206\013\356\270\036\330\374\263\370g\347\324\207\015\021T\000;1D\274#8E\3300Yw\021\236\336\334v\316?_\247P\034\225Q\240\351e\223R\200B\234\000F6\203\267?\227\277o\237o\303\250k\355*j\264g\325\005\351\312\226\005\006q\357\334\214\343\037\207\357=v`E\321\271\231v\376\226\032f\000\356\015\270\016\343\236\017\177\313\236\244B\207\022\005\304x#>\034!,\201\362N2F2~d\361\364<|\272Vo\374\223\200o\377\000\363CJ\\+\002\233\230\344\200\007\343\317\313\035\376_\323\241u\314\204\340\003G\212\333R\356v \025\204\2258=\330\366\375\361\324\366\226\352\243/z\346\313f\230\266\321\261K\234\366\007\221\236@\350ZO\222\347\235,\204i\006\320\340\000\017\3368\376\207\333\030\367\352EBlW5\215\261B\370Ff%S\325\216\335\261\364\307\357\277]\042$\251k\265\205\206\025%\2123\025\371giF\357\370|\372\340N\207T.\2525\032-\2552\223\346\311\012\203\222\013v\300<r?.\211\304\304\002\225M\355=\362?\204$\245\300\311\363Us\3069\366\343\237\241\037\257B_&\002fP\321(b\231\230\004\355\031\007p\003\037\2769\352\0070.\217=\240\350\265\360\254X\215\234\001\237\272;\036O\364\307\037!\362\350\211\260I$\227G\276k\177\013\267\211\021\225py\307l{d|\370\350d\021\0010\353\016Czi^L\371a\234\202\270c\370\373\373s\317]M\303,\042s\234\\\264i\263\273b\261$\023\223\357\3061\364\035\372\000\353\2410f=V\226\233\222\247\313b\033\222Tg\031\036\337\327\360\352I\213\004Mt\2041H\314\317\221\301b6\250'\236\177\247\323\250\315\272<\246\340\350PM3\006A\042\357`\0018\366>\334\0163\362\350ZA\375\250\034\342\010&\360\200 -\206\316\016Fy<7\366\375\347\251\016\200\245\244\227_\331C4\250\256x\313\020\007'\324\334\237~\347\367\370\365%\344\241`\000\255\232V$n@\023\260\306\006\356\375\277\333\241\016\323\252ce\3276E\230\017\255\210\005\001\031 \036\016}\271\355\333\337\246\233X\024\266;r,\206`\220\002W\013\355\214\361\217\351\237\313\347\322{\273\247\027\233B\321\247fV,<\257\330\343\361\347\037\237\\\034%\033\307vM\221&\225\267\253yD\037\362\347\277\313\035\031}\210K\000\022\011Z4\312|\266\002I\001l\022}\216;\237\370\350C\311\224E\215$F\205\015\251\236<\020\245\0068\343\206\354{\376\004\237\323\256\017\005\267(\362\333\272-\010\006\234\206!Sxc\225$\347\030?\323\223\371u\000\317\335C\217{/\242\321\246\005\366\262\2437$\344w\035\375\373\016\017\\D\004M\002V\232\000\310N\325\030<\347\214v\355\364\375\374\372\346[u.=\330\010\257\207*\344\003\032\203\234)\357\236}\276\274\376\275\026yB\306\226\213-\311\006\305,\210\001]\3167\016T{\366\036\376\330\352\032d\304\330\250wq\271\206\323\357\315\001\2517\224\036[2\360\313\202\006y\340~\361\3271\343\2327\264Hv\261\242/\311\221\204\215\367\231A9\000p3\330v\311\347\364\0358\000-\262H. \221\250B\362F\027%\367\373\363\330q\236=\217\327\353\322MI\236J\303v(+\012\235\313\260+\0059P~\340\307\327\217~\272\\\012\211\031}V\226\214g\200\214q\200H\003w\343\234s\317B\347\235\355*\030\300$\205\246\247b9\012\255\234\015\307\260\307\003?\257\327?\247Li\033\025\004M\316\310+J\245H\011\2616\343\003\235\247\271\344\377\000_\237\353\324\022I\275\321Sc\032\014\013rG\212vg\316B\3678#8\035\373w\317\357=\013LY\033\304\311\013KL\347h\344\26088\344\251\343\007\267\267o\367\307P\362\004\215\220\265\356\220w@\232\022\376\205\022\225\035\276\351\034\343\360<\363\363\355\323\250\276\004\215ULk\013\247\227\311I\214\014\316\371N\374\214pNs\217\303\277VH\000,\326\264\222G\275\321m\002\266\350\220I\306FJ\014\023\365\034`\360:\220\014\335K\234\323\335\013\014\001\267\225\336\244\234\023\216\\\366\316N?O\257B\302A\011\317pp\265\245\003\341IA\271w\005\033r02A\3062z\234\327\204\220\321\031\271|\326\336\042\025\000Uh\206[\277$\362{\347\237\250\350\0051'\232g\352\042\001\270B1\042\225\364\270\204dv\311\036\335\376|\373|\272\010q'.\251\246\263E\216\227Z\024\243q H\030\035\231\317\270\371\267o\237\036\375\011x\201(Z\300L\217q\315\017\310\221\021\233*F6\251\311?\337\362\352,\350\011\216{\232\334\307D\023N\231\0044\254S\235\276\344\374\217\313\347\372~\0357\244j\200\265\262\034\016\210\345\245V\334F\321\317`\017\266\177\333\240.\006\311\321iB1&\325\014\236\254\234\020;\016\177\330\365\305\204\350W6\263l\020\3154j3/\245G\031\316C\034\376\036\334\177o\257B\001\324.\017h\020\177\2646\245v\227\001I\036\300\362\007\357\373u \305\322\3373\033\042\322\234\014\250%\227o \257=\276G\217\337\323\2469\266\023d\024\234.\320l\206i\042\316\326E\301oby\366\307\327\250\207l\212\241l\335\016Jp\333\337\001\310\347\236\343\214\037\355\375z\006\230\266\350\213\3012=\354\206\364h\250\346D\0122NH\340\363\333\372\373v\310=\011.&\312k5\240I\013f\224\207\000\006c\214c\276}<\202}\377\000\337\240\325D\311Y\360\261\260*\042\343\037\210\300\340\034\373{\216\2171\033\242\001\256\006\313mK\205'\030b\240\221\202p1\373\376\235C@\2255\000\210\346\202)\2225f 3d\037\275\214\014\373\3758<\373u\304^4\\\000\002Q\237\013\271\366\36202\006\011\307lg\364?\327\345\327H!1\333\312)`ln\013\270\221\201\223\337\217|u\316\312,\226\332\207P\260S\356u\312\344\340s\316\017q\371w\376\243\245\221\272\042A1\013\0051n\010\3362\011\311\356>\277N\211\304\250\020J\331\244\302\215\210\212\344pH'\363=\010\000j\230\350\324-\255\033e\2101\361\300#\214\034\3439\366\356:\342\361\242\341\257T\006\246\0008Tm\371\354\001\303v\343\351\337\251\004h\245\304k\274\242\376\037\012\024\215\300\000\274\214g\351\373\371\364m\022P\265\360\330\005\026\260\206b\330\031\333\236G|\376\376\237\237PA\021(C\301t\216HMO\3676\002\212}\363\357\214\363\217\364\351b\302Jt\020@\013B\000\000\0046\360wn\316\334\234w\340u$sD\034,7\013~A;\316D\303\272\257\374\373\036:\031\023e$\022\015\345\000\322\252zQ]\217\007$~\243\364\376\335K\316ct-cF\210\251i\262\001lc\357z\207l\177q\324\322u\254}\352\201\315\334 \265>\375\34068\030\332s\307\341\372\364Y\206\311\240f(MN0\276\235\371\354\304\375\177>\226\347\013\222\215\331H\204P\245\316\376]\316w\006#\221\214\366\007\333\367\357\321\270\354\226\300\000\346\200\364\352\346@T\262\216G\007\277\267\320\376=I\004\011P#B\204\320\230\335\310\030\001r0yn}\275\375\307\034\343\245[m\312s\335\006\326E\274\003nX\306\042<s\357\307\277\343\317?^\2131\363Ky\003{\042\374\262\034\225\037x\0007\016s\234\201\217\365\376\375\033\331\244\241mgL\213\373\374\241\230?\232\271\336\244\355\300;H\007\270S\371\003\307\323\250\000e\224nh\314\016\207\370Y\344;\341\230\203\273\216\375\227?/~\242F\210\335\314\356\265\0254a\202\006\000wc\376P1\223\364\357\376\235\013\217\242\212z\345\230FE\014\2338\005\237';F\010\357\363\375\367\374z\212\200\023\321\003j\034\262.\212h\231\316\325$\235\271\034\014\021\237\370\03540\317T\236\327R\245&\235U\334\007V\034\262m9nO\037\330\365p\002\346\310\262\313}@\327\034\247\301\026\364\362\020\014\205\243R2@\034{\034\037\231\365\177\277n\271\255\213\000\271\3163}:-\3749F\312\231\004k\223\352\347vx\374\177/\257R[\042\350\330\342\015\264\352\261\251\366\000#\031\214(\316\001\340\363\310\036\375\361\3270\356uSQ\246K[\247\275\026\236\227\001T\005\031b0\034\260\306O\037?~\204\023\272\207\000#/\361\010\323K$\333\234\243\2663\222O$dg\361\357\376\335\272\000D\247T&\011\330 \212i\012\006\010\252\033\276\300y\307$\002s\370}~\235\020p\006\016\310\032\034E\267\367\365J\022\214\240\231\212\263*\221\220\007p\007o\247\375t\227>LB\266\326\330\335\007\341\227\326\034\223\310\344\016[\361?\327\246I\331*\0012uCZc\042\236W#\030\004\236~\237\337\241/ \256\311\230k\2421h\370`\033# \202\027'\363\372\365\323&Jki\215\001AZR\340\250\031\354v\340\361\363\034}\007S\373D\244\261\322=\371\243\376\020\223\270G\030;C`w\004\021\3063\364?\276z\006\201\010\315\344\201\267\341jJB\317\210\231\330\003\356{{`|\375\272cH\002\350j\002M\256\021\242\225\224\222\241v\360\303'9\031\371\364\023\272\227\014\256\267\273\243>\011\177\365l\225\200\030\300\357\223\362\037.\334}zNq\251Np\015\021\356P\005\033\000\273\302\037\236\356s\365\300\371\361\323\263\003\242I\021\000\235~h_\004\3040;s\214\005\037t\017c\375?\250\3503\204A\246Lk\366B\370b\373\224\002#\373\330\356\017\357\221\320\272\024\202M\247\360\262J\\\002\024\356_\274\307\221\217\303\353\307\177\257\\\306\2209%\324x\004\003\242\317\205-\222\020\016{\236\304\177\300\343\333\375:<\301\035C\233\337\275\026|;(*\312\313\301\366\312\250\377\000_\307\2504\301\323D-\253\000\312(\323\243\005`\216\303\260n\371\372~\235NB5Q\235\2560?\264!LP\027\007q\347i \037o\273\370\216:\211\315\262ca\272\224\037\206P\\\204\335\351%N{\177\277\277DF\305s@\023\225g\303erV0\275\307\250q\333\362\351$w\221\002 J\320\246>\201\235\331\310\364\360\270\372\021\364\035\272,\240I\331\023\0006\224'\245\0040m\313\317pH\316\177\323\221\320o\010\234\006\262\2104\214\177\230\003\250\344v\300\015\377\000\330\214{\036\343\375zu7\001b\220F\355\352\203\360X\001\211#\031^;\250\034\377\000\247\367\350Z\351\260R\346ZJ\306\246f\214\262\246\346\003 c\203\330\366\375F>\275sH\230\010\213\210l\204\021O\302\224\337\031\366b2O\343\375?O\257@H\203\272ap \020V\276\034\034\345\233y%\201\000v\347\223\333\347\370\365\006uD\010\042\001\272/\341\316R6\030##?\200\037\357\217\367\352b\362\022\333P\223\036+\0053pG\243\000\347\361\371q\317\271\375z\034\24090:.4\013b\221\275>\220\230\031\313\003\300\301\377\000\203\333\345\364\351e\326M\015\330\042|\203\030h\370V\037\346\367\343\347\375:75\252ES\021+\0151v\035\342b\002\347\034\256\177\267\277\357\035ve,9\204\356\212\370]\341\320G\261\206\321\270\177\234\344\177\327\347\317n\210\030\270\274\245\027f\021\246\236k\177\014\333\\r\034\036x\344\360;c\346?_\353\320\227C\223\013\016\247TS\323\250o1\302\363\311*;\017\226~\231\375\017B\037'.\350\003\001\327t[Ryj\255\261$\300\003\276Fs\375\376\237\357\323\033P8B\352\264\362\337P\264!d\021\274m\221\201\337\333\214\001\375q\371\364%\262\013aq\251\000F\253F\231\303a\300e!\224\220\017'\346\017\177\372\374\372\3478j6P\340\350\203\275\226%#\026\0140\330#\014\331\340\3668\372g\337\243\355\006\233\245\206C\220\243\246\314a\230\216\373y#\034\237\366=\376\203\245\271\346\342\023\351\261\244\011\325\025-<a\337\315 \256\007\004\360O\327<|\372\267@\276\001\026U\252\266\230'2\2305#o\316\320P\372I\317\177\177\251\347\375\372\042L,\307w]\267\216\310\206\2007\230\307\324['+\364?\361\370s\363\351\315\034\222\034E\314\314\255\212d@\020F\312\336\331\343\203\217a\371\376\275\013\204\312\266\327\000Cb\350\321J\256Wk\035\273\200\035\301Q\317\365\357\320M\240\256\024\363\337e\257\206\0332\251\2703`\373\344\216p\007\277P\351\230%K\034\005\3325C\370TeO1\042\312d\202F0~y\035,M\362\224P\323\031\207\360\261 \012\321\371[\024\014\266\025rs\216\376\374\022?|\364f7\3252L\214\272-\371\013\265Pz@\345Gs\237\237\267Q\027\2249\301\000\021\242\032\321`\200P\251\355\337\200x\034\037\337\367\350\013\223^\311\027\327\362\214jm\331\014\341\217|\200\001=\306s\307\351\321f\213%\274\222J0\322+\225\302F\010\345\2179\036\300|\263\365\350M\265Lt;\242\331\243\012\244\205\312\200O\030\000{\347?\217Q\230\312K\330G\202;\341\024\261\012\016\322\243\330\340~\237\200\374\372\214\3451\340-\012_/q\012\344\0023\222\016\024{q\355\363\377\000\216\214\2732L\271\202\310\325\245W \036YI\034\237~\0068\374O\351\322\313\317\252t\003s\250X)r\252\317\270\251\030 \367\007?\346??\303\216\244\273\222\026\233I\323\336\253>\004\220\207\313P\017\253\220A?\217\364\374\361\324\032\242\350\0157D\201\325\015i\2718'!\261\365\374O\343\216\242\006\352A\337\337\262\264(C\007\012\222n\356\000\375p\007\267\277\351\321\027B\220\300\340H\036\371\004'\247\335\222\352\312\333\271\372\034\361\306?\353\216\2072\200\331\027\325b\323\006e\336\214\000l\235\247 {\344\217\307\237\327\345\327\022F\211\255\001\304N\236\312\327\302\017R\202\341{g\030\352K\240u@\035\376\273!|6\342d\332\021H\306C`\223\237\227\342=\272\000\344l\022\011:\024_\301\225}\252\203h\344\037\2262{\377\000_\247\035\021\1774,\0077@\266\324\201\231\200EPq\270\021\337<\036\337\200\352\003\311\035Qd\031\311\333\362\203-(t$\306\024w8\343h\372\037\323\372\365\324\336d\2045D\201\033\240\2559e\001T\005$\373\367\371\377\000\277P\343\271M\002l,\204i\033<'\034\214\253r\274\373c\367\375:\211\032\2502-\026D5\037i2C\036\001#\007\223\373\374s\317Mk\245,\264\215=\312\337\302s\260\211\012\344\001\206\371p{\017\221\350\034\375\302c\265\203\357\237\345`\245\311\010\025\310\310\300'\031\306\177^\335\013\237\251\011\240\310\002\021\037\004p\213\263\012}\316}\260@\316;\361\375:<\302\022K\035\2472\202\324n\354\270\211\213d\034c\267\374\216\24087DP\347\033\241\264\030V\030@\333\260\010\030\335\363\374{c\240\026)\323\021\020\200\324\245\033\323\034r\020\001\372\220H\343??\303>\375\013Hu\375\377\000H\335\232`]\022)X\344\214\026<\234\014\023\317\266;\361\216\271\371@\200\201\241\304\255\3742\005\033RA\200\304\014c\217\370\347\256\031\246S\000\221m\220V\227iv\005\267\034\344\001\267\237\307\365\375\363\324\271\322\246\234\201!\024)C\260\332\006\305\000dq\365\307Dm\001E6I\272\010\242\\\221\030\003\220O\244\363\333\260\000\236\016OB^ HL\033\345E|&@\007\033\017\0079\034s\337\345\307\354ty\342\360\225\224\350V\012\042\206#\352g|\202s\367q\330\376<\364\266\234\323!1\322\000\000\242\032\233r\205\362\300^F\012n$|\376g\333\367\236\217\274\011\022\242\001\042\336\371\241\032r\035\021\004\310\271\303\002\330\307\342G\030\377\000~\205\272I\324.\250\343\237(\321\016:VS\026Q\2031+\234\026\371`\236\206\243\2573dMa\000\003\272-\351\225Q#x\267\340\002\252N\001\357\316O\345\317n:u0\343\241\211Ix\313g\004L\264\255\227\012\336R\261\030}\234\343\373c\267D\010#0H\252\322\342A \013)\207\303\203&Y\042\343\234\037a\234\367\357\216\233& ,\374\215.\023\247\362\264\3249Q\266=\301\217\013\236\010\037O\353\337\337\243k\344\352\205\324\204\346\333\360\260S\014\310\251\275rv\357n\002\374\362?_\351\320\227nJs]\000\206\352y\243\376\032w`w\276J\214\014w<\366\377\000~\335\373t\262\360\321\010\313\\I;\362X\324~\247l{s\221\3009\317\037\247\357\277P*l\204\264\202HY\360\254\010%\233`\3118\366\377\000\201\221\327\003k\004\031F\346\336\312\332R\262\345\221\202\250\007\200\337w\237\227\267D\\\042\351\354\235AB\024\3451\316\374\234\253\021\234\234\016r;\237\241\371\375z\202\331\277$\015\250\001\275\320\305#\202=*\034\222\255\333\216x\366\343\362\371\3652\006\210L\233\221tlt\244\000H2d\006\300>\330\343\234}?\277Kq\264#\242/:\373\2246\244l\371j\020\023\3178\007\000\361\307\351\327\000&P=\331\206]\020\326\227,Q\2216g\036\307o\177\337\375\365\006\302F\250\330d\345:!\0320J\240@\354@\334N\007'\351\372\366\350\003\267ST\033\006\353\272\031\242\333\204UU\014}\317\270\0371\3215\340\311(\235L\216\350\337\360\205\360\245\225w&\371\010'\034\372\277\0361\317\\\037\314\256\042[\245\320\332\232A\350\012\0060H\034\234\017\226~\235,DN\350\352\346&\006\233\255\232 \024\224\014G#\260\317\357\277R\327\222P\271\266%\005i\235\2256\240dS\200Y\260\007\351\324\300\233\356\240I\210\026\013B\214\341\266*\226\3548\357\337\337\367\355\321\027\010K\014;!\374&$\301'\003\330\036T\376\037>\334w\347\351\327f\265\224\220A\277\262\205\0253:\020\240\3568\306\007\357\366:[\217y2\210%\266A4m\205\036\202\000\310\301\340|\377\000\023\321f\003E\031\0351+F\232B\303%\267\226\301\033q\223\333\251\020\020\002Qf\225\301\363T\200\304\002\240\017\241\374~\237\276z\222\006\222\206\363\230k\357\252\021\244q&\354\0346x^1\3109\374:\007<E\216\211\246\231\315}\326%*\252G\270\257\227\234\034\016\347\345\373\372\364.&\340\042\246E\211\323E\247\244'\000\034\260'v\357\177\227\375\347\337\240\236H\334]\026\262\337\302e\3063\270\236\0068'??\353\307\323\250/$]\036Q\232wE\265#\226\334\274\215\241\267g\202;\363\363\344\364\301P%\344t\333D\006\244\335\346n\213\315\214\002X\016\303\373g\214u\305\342\327\202\2404\352\341+>\027r\355q\205#9#<\374\206\1771\375s\320\271\301\0253\042\012\011\244\014\376\227,\344{g9\307\374~_\337\232\355S\\\333j\264)2#VOH]\247\003\031\035\217~\204\230GM\322\007$\026\243\022\256T\202\245\217\266\003r{\365\002\251\335\016@D\215\026-1\016v\200\033\271\364\343\037\3528\034\365\031\240\3356B\320\241\220\340\0071 \034c\203\202{~\376\235p\252\243!\027%\020\364\262\034\020\033k\022H\3078\3179?\276\335\030#d\004\270\335\005\351Y\3316\272p\331\301\031\310\367\317\352:\342\340\0020o \350\212jWp\370,\274\214\200>\360\316}\307\357\351\321g\033\204.\227\011\010\015\007\371\021A;\201\316\011\333\355\357\337\203\377\000}H\203r\210T\236\350@jY7G\236\001;p\030\234v\366=\272\202\353\042\016va:-5/;\3269\0310ps\300\343\271\367\371\340~\035\010wTN\203p%hZ\246\235P\303Le'\271\000\343\037\207\037\356?\257@\334SA2Q7\016\\\333\015RsFV5\0048\000\216\011\355\355\307\352\177N\2545\367\225^2\201\010\305\247\336\316\213(e\301'\260\307\364\376\377\000/\325D\304\035\012\260\311y0V\226\220\355dA\270gkm\300\301\3750;\366\352]RJX`\213\004D\324\252\354\347\312\016{}\343\337\351\375z\263\207&\301\306\312\226(\330\2205\374\251\211\205I_B.y\364\256H\3478\037\277\236}\272\220cB\251\027\334O\347u\206\217\0103\042\204\311,\027\007$\236\370\366\366\031\375\236\317'DA\266\200m}>\253$\245Y\031S9RA\300'\003\202q\317\177n\210;(%\015GH\276\235\026\315*\241\012\354\031;\273/\313\3521\370\177^\202\347\275\027R\367\200r\223a\257\362\264\324eT\344l\007\220@\317n{\001\337\333\361\374z \361\242\012\231\200\2720\3222 8\216%\003 \005\000/\341\363\350A\233n\234\340b\342\336\376\210\344\244]\373\225U\0009 \367\317\3279\317q\237\307\245\271\323b\210\010t\266\337_z--\023\020\034\226l\236\347'\004\214dg\031\340\343<tb\242\014\246'\335\321\321\320\214\215\2100\000\0078%\201\367\317\260\344t\254\363\256\351\314\020,=}\350\2245.c\336\341\216q\303.q\337 \003\364\377\000N\270<h\021Tm\201\347\010MD\273\204j\252\2478\003o\251\201\317\373\236\335Hw4\267S$\3024\321\202\354\373aU\003\203\216\370\034\347\351\322\005X\011\346\230$\235\007\275P\336\214\001\264\042\223\310\013\200y#?\356?\267~\245\216\032\225\325A6\367\325i(Y\224\252\354#\031\355\216q\364\035\371\037\333\2435\0337J\024\334\341\010i@\240\215\270\334\255\334\344\205\035s\237:\246\266\214A(\301HP1 \201\355\236q\307a\355\365\350I\032\251.\216\350C4L\352\236`*\006B\223\334q\317\277\037^\241\256\274\004U3\021t\025\242T\001\261\2747$\217\364\036\375\024\311J\015\213\215\012\317\204\003a\334J\340\360Gn;\217\351\327\002I\\\341\020\204)Xp\301YI\373\241\201\374\300\350\\d\205 \033\207]\000\322\002\312\002\231\007\3368\031?\257\317\256\237\222\341\260B\370?\273\351T9\000.2\017\357\236\2436\311\232D\372-\032%c\270\022\274\037n\006~\277\237Pj\035\012\354\215\231\010B\2157>\304P\244\206\333\312\234\367\316{\344s\3279\304\376\345\314h\004\345\013MJ\010,\004`c\334\343\333\267\367\343\353\3207\222\2205<\326\205 \301b\003\014m\311<\221\370{\366\371~\275\272\342\350\262\214\267\223\242\324t\212FG\254\203\3179\347\277?\327\372u.q\233\243\247\244\033\240\374\037\254aN\354\344\237\177\237\357\351\327\027\241\0153e\206\336\030\261!Yy\033w\001\372t\005\333'd&\353MD\214\002\221\274g#\036\307\250\016\335\001\203d[[\213\004\307\243\007%\266\203\203\216\377\000\257<t\316\325@\303\227\031\323\337\321g\300:\260\312(\0142\177<\177\247@^\012k)\305\220\177\206\260\017\225\303\347\005\225F\177_\327\362\353\273A\027S\330k\012Cf\323\023\334\244*\360\355\246\\\206n\303'\346?!\326\037\021\342\254\245f\233\255\274\027\015u]E\224\262\257ERP\303$\314\014i\316\346b2\007\343\354?\017\364\353+\015\306\237Q\320.\264\261\034\035\224\333{(-m\002\310\024*H\345r\030\2362=\272\364TkF\253\022\273\001\320\030L\322[N\366\005YO$p?3\375\277\337\253\255\253k*\025(\311)\031\243\330\205\332/,0\340d\343\277\036\377\000\216>Y\374:au\365B\372p\011\210\224K\321\022\314\025w.\011\357\234{\343=\370\375\3759\265#T\0316\013>\010\264\217\036\340[\214\017\227\276\000\307n\240\276\002ha$\202n\224\307b\251\232\001\042\030\202\234\256s\223\216\377\000\237~\253;\036\306\331>\236\011\356\022\023\272i\211\303\206\331$k\265O\036\371\366?\323\366z\315\251\304\333\020\265)\360\327jT\336\331jE\246tZR\007#\012\271\013\337\334\217\241\353\317\327\306\177\3313e\273\207\302\203OE\006\254\323\02552\324\310\260>\363&\001\377\000\354;{\216\335\377\000\257^\216\227\025`\000N\313\317\324\341\217q&/*7-\262X\244\335\345\020\010\312\363\316G\267\367\375:\324f%\204L\254\332\270W\207Xj\260\332j\200\016\320L\204\222\007$\026\000r=\275\372\341\211d\330\2408z\261p\210\376\023+\023\210T\234\234\003\334~^\337t\376\235H\3064\011%\007\374{\334\354\240]J\276\010I+\310C\020I\012Tw\007\214\376\376\277N\2553\024\321\015%d\232.s\213\243\301b\322\017\344\206\213f[\000\223\234\016\371?\201\007\216\334~=\030\254f\001\224\254\215\000\022 \373\325\004\322\261r\322ar\006{cn\334\367\371\375>\237.\232j7-\275\2249]\236_\277\244#\005\033\026\004\362\330\356G||\307\276\177\343\250{\306\352i\264\235\020E+\017(\205\344\023\273+\376c\365\356s\300\353\234F\212\032\343k\177edt\301\000(\3569*T\234p>]C\336I\357.\244\350\270(\325\246}\250Ub\013\367\307\030=\270\374\373\037\372\350\013\333\020n\232\003\211\220\217\216\205\025I\373\334\234(\003\007\277o\230<~x\350\034\371\320Y6\2350\321s>\341\033\035(\000\221\260(\343\003\214g\216\177\257\353\324\223$(e\277\036)B\323\007<$\207o\031\300S\370\037\221\372t\220\254\213\334-\374)\364\215\240*\214\261'\337\373{\366\352\\\344\266\023kh\2140`\260!\201\357\300'#\037_a\375\317P\342\2135\240\2041M\226\021\000\003\251\005\206\336@\375\177\177\336E\202\233\027en\310mJx\300\344\001\307p\011\355\221\372tMu\222\335>\210KH\301\2067\354#\214r{\377\000^\205\304E\223CN\372#\032\224\015\305\224g\035\271\300>\337\217\347\324\015!\023\314\011X\264\244e\306\336y\317\366\377\000N>]q$\354\205\243e\215I\303\234 nF~\177\211\366\374:\354\345\011i\363Y\360L\245w\231\031wp\002\362\334q\371\236\330\352K\271\0041\021'T%\245\332D\21279\340\363\354{\223\217\303\250s\266*Z\330\202\026-\036\346\033\021\211=\201\371v\317\323\251~\227F\300\034P\376\020\355\300B\333O9\037^\330\034\177\337C\232\014\243v\202\021b\221\206\334\252\305\306N8\371\367\375\374\272\222E\322\330\010\202l\263\340\324\306\300)<d\344\374\271\347=\011w4\306\206\213\005\246\245pr\001n0T\236z\340A\012\014\312\030\245$\035\276\2629\355\357\365\037\237@HLkI6E\212\\\267*w\234\340\017\177\237\177\317\256%@\027\224cQ\206\015\303l$\016\330$\375}\363\236?>\204\024ni2\021MK\271I(\243\325\236;7\357\037\361\324Ln\270\241\032B\305\\\216I\003\203\334u\322\246\006\353\022\224\261S\260\003\2208\356\177\333\337\245\270\015\012&\337\305\034)\0132\201\036\336\334(\347\267\365\350*>\005\323)\211)\366\335cJ\206\031\214l'\001\210\300^\375\317X\230\274qh\261[\270|\010q\210\262\260l\266x\342q\036\341\020\\6\322\017o\377\000/\257~;\365\344\270\205bD\235\327\247\341\364r\300\032\243\365-\024\263$a\010v\007;~|\177\337M\341\025\232\323t\276/I\356\022\025^\366\3171ZB\030\261\35402\017\374\377\000\267^\250V\222!y\276\304\001%3\317\012\026|\010\331\260p\304~\247\347\356z\323\2431u\237Q\3232\023kR\003\231\013\0023\220O\277=\370\375\375:\260*D\005P\301\271\327\371D\377\000\015+\270\222\252F\345\340v\034\036}\363\317\365\352;p\211\264\210\274\363\036\371\243\243\2670*\3732\335\211\013\301\301\311\343\037\207\351\325z\265\301\020\254\323\240I\220\023\335\272\203{\357}\205\324\356\031\003\031\355\337\351\326.2\266Q\001m\340\250\002{\305Ytv\270R4\223\313RN\007+\303q\362>\375x\372\330\227\022@+\323P\240\000\224\271)\350iD\254\220\357\014\230TP0\300\201\330|\272Q/s\204\224\303\225\272\013(\364O\004\322\371\013\031\004\372P\220F>\234\375}\276]iTc\230\334\312\225:\215{\340#\033M[Q\233\315X\210\223\0308\310c\337\217\257\327\241\034N\261\035\324\317\320\322i\270H\342\264C+\230V\2129\017\335\033A\306\334\237\355\321\324\306\026\011\224\232tZ\353B}\032\022\232\242\030\345jd\336\277t\2258\036\331\376\235P\037\020<\022%Z\377\000\206k\210$*\234E\265\216\370\302w\316\007c\237\337\353\364\353\351\225)8\223\013\346-\257\032\255\030\042\332\312\350\000>\254\343?\236{u\024i<\031\224\272\217fX!h\321\251\031\220\010\344c\214\000\027\003\345\362\377\000\257\307\253\354\253\011\025i4\353\251E\374'\226\340\355\313\366\340w?\277\337\267V\330\351\027T\336 \300X\264\216I\354\254\244\000Cc-\362\355\337\277\327\030\350\263\2004@\032I\360A\370>\361\371`\202v\217NI\347=\373\361\220z\222\340\220\001&6\367\272P\224\336Y\334NI9\030\037?\353\362\357\3249\300\235,\236;\267&\350\344\243\005\000\33022\001#\357t\267\033\246\260\000\337\005\264\205\024\203\214\203\337p\034\214q\376\237\327\2502Q\271\315\006\0028RJH\012\035\030ay<};\376\177\257RH\012!\304\332\310\301\016\324\033\203\025\007;r0\0061\355\3738\374z\020/e\316q\345e\213J\025\021\202\225P\013\002}\217s\371\373}z\342\3510W\001\000\021\262P)\010h\366&\033\030\003\202\001\367\377\000|\373d\364\000\363F\360F\213#\244\\4\252\256T\000\000\000\222\277_\257\317\003\353\363\351\205\363d\014l\004`\243V*\356=-\316\321\316I\357\217\227B\037\026\011\271\001\271G=\010\377\0008\310\316\334\021\307\323\347\307\037\323\250\017\224E\203t\021G\275\203\004'\261\004\014\226\035\377\000g\256\007e\016\247rP\305\037\253\335y\310\035\360\006=\301\372\364%\322\244\021:\241\012Gl\022\247g`\247\345\237\227\327\347\327J\200\011\272\303Fq\264(\021\214\201\217\251\037\361\324\223\272\200>_\225\241E\301rB\362\011\316F\011\371\017l\376\373\365\001\351\214n\341\010\322w\005wg\346\243\267\267\367\035@u\327\027H@\370]\336c\006S\300\371`\021\334u\322\204\011$\202\203\360\\\261\331\205\300\004\343\033~\237\277\237P\037\026E\224\334\363X\364\254\374mUa\307$v\354\000\371u \205\316\004\354\204\324[\267o\015\267<\217\357\370\3649\345si\270\210r\027\301\215\307 3\021\312\343\270\372\361\320fN3\262)\251#\030\001~\207\013\311\3743\370\3652\243,\330l\204\324\304\371\230\340\016\016\006}\273\001\357\377\000=,;\236\250\203w(&\220gpM\333x\306O?\237\\\037;\242&/\010\305\244\302\256rx$dz\201\355\373\374>\275%\356\324&Sf\200j\235!\247\247\211G\234\240\261\311?!\337\217\357\307\327\254\332\217q\321ja\300\032\2058\264,\013\031TP\273W\333\272\236q\370u\345q\201\331\304\356\2756\021\355,\201\262I\276x\352\334\226c\277\017\214\366\347\277\375tu)\0071-\225\235\234\302}\270\310&H\304j\011?\327#\351\326f\025\241\222J\324\252\3478\002\002\210\336)>\035\210\2150\245F\355\243\337\347\327\240\341\365\003\256J\363\374B\236W\000\321\252\207UP\030\202\201\202s\317\034\250\372\037\324\365\277N\254\254j\264\210\213HHM.]\177\226\011\311\340\216\011\357\372\366\376\2755\316\200\224\321.$#\351\355E\337\371\221\035\243\2206\362G\341\373\357\325LF$\001\335V\360\264\014\367\202\221\315D\237\013\013*\252\246N0\000\311\306?\256:\305\243\211\202elT\245`R\212;tJr\301W\313\035\366\201\223\325<^ \2232\256ah\200\333\251,\224\350\321,gh\003\325\267\034\267\267\373\365\225H\220\342ai<\202\320\331H+(\305\042\310`\225A\371\206\373\247\203\237\337\323\253xz\231\356B\257\210fK4\335\025C\034!\303\254BG\310\004\355\310\374q\363\372\374\372\034c]\225E\002\334\3225R\361o\025!UYU\200\310o\232\374\210\307n\377\000\274\365\212k\344+Q\264\313\310FQZ~\030\210\345;\323\272\373\356?3\322qx\254\302B:Xr\313B\234\010\304\250# \244\213\214\220\271\347\037/\303\254AS!\222\264\010.\323P\271g\310\012\356\201B\000\300\340r[\375z\373\377\000h\015\374\227\302\334\\\014\035\220\205.\350\206S\236\011\036\347\376>\275\013\\6*\\\336\354\302\323S\202\03561\036\331\035\276\2758T\015\271J2\351\265\321\202\205I \254m\316s\234d\343\216O\341\217\337$\314N\210{\035\342\353\026\224\206Pc\313\037\240\343\337\277\267\341\362?^\254\207H\225Y\305\332nQ\221\321\261\004\355\343\214`s\333\330u\316re\020F\245l\321\021\214+1#\030\007\373\177n\214<\350\020\232q\262\032\320\235\301\227#\322Ts\310\357\307\372c\376:\347>D\042\245Ku\261JF\334)S\214\250\003\236\347#=\376]B\002{\302\310\341J\2569BS\356\340|\261\376\230\3523\220S\\A\027F\212W@\030l\030\\\2361\217\327\266;\363\320\203\262\042\356\355\264B4\201\212\234\001\236O\007\237\227\035N`\242\253f\310\337\204*V6Q#s\220[\271\371\177^\200\270j\270\274\010\032\243\276\014\267\336v\311\340{g\250\005\036h\262\330\243\363\016\020.\0163\317\267P\347 \317?\264#\332\220o\303(\007<\220\006\177_\303=s]\311\031x\314\264\264{\220\200\213\337-\307o\247\037\353\327g\274(\022\267\360!\207\334<\022\016?\017n}\361\324\012\212\013Zm\010\301E\202\200\252\0008\031\367\353\273E\300\221r\201\360!v\355POa\217n~\275\027i\272\0274L\201tX\2428C\265I\004\014\347\267Pj]D\346\003\352\214\370\037\272pX\001\214\216\303\344>\234\343\250\314\235\277\202\327\301\235\314B\235\331\300\364\343\237\256:\227\021\013\211#E\241J9$\022\303\276x\003\245\232\267DJ\021\244\000\03600A\\\376]vy\262\340H\026A\024d\001\275\267\023\317oq\356?\247\323\250\316\006\213\203\367(b\230\344\225\005\224\214{\362}\275\377\000|t\031\223C\377\000\330\042M$\217 \2165gb\300(\036\242\315\355\307\277\267o~\240\326\000I\3669\241\207\270\303}\376Q\321Yk\352\222\236jZ)e\212W1\304\351\352\0238R\305\020\363\275\202\253\022\243-\200\307\030\007\030\030\237\213x]#\222\256&\230=^\336q\317\235\226\365\037\206x\213\373\364\350<\217\376'\227\202\020\261\334\211ukm\307\314\012\356\300\323\276U\020\006bx\354\240\206?!\311\307~\231[\217`\251\263;\353\2607b^\3303\347\371J\241\301qovQI\304\377\000\3613o$T\226\371\321\367=<\252\213\301;2\243\234}\341\3068<\373\365b\227\022\303\324si\266\243K\234$\000\341$n@\231 nvCW\207\342)\202\367Sph\2610`\023\261:ODO\224S\016{)\034\037\362\347\366:yf\311\002\256\345-\247\250\232&\013\204_n1\311\310\375~]Q\257\204k\204\225v\2161\355J\253\365%\262\313n\254\270]\001\362\242\205\345e\215Av\013\334\250\357\356\243=\206\341\223\317^/\216c\231\203huC\022m\324\257[\3020\356\304\202\0304\324\362N\266+\252UY\252\257\327:#k\241\022\302c\214\271\226S\034\312^\027p\203\001]\025r\024\226\036|9P7\036\276U\305?\310\025\015l\224\032\04257\361\267\217\225\227\321\360\037\0115\254\016\250I>\237\235\223\325\326\326\3633\311OK0\246\334v?}\207q\001N{\223\351e`\012\262\236\340\344u\350>\020\370\366\236.\277\351j@|OC\032\374\256\260~$\370E\364Y\333\262\355\230\360\225\011\212\334*\251\2766\210\255U6\347\033\241;\300+!C\310\310\373\300\216~\207\221\317_B\301|Y\203\255T\341\331P\032\202llm\254N\276K\306c~\036\305P\246+=\235\323}~\251\004\326\354H\254\250p@<\363\202\017$~G\257B\334h\205\216\374,:\023\205=\242S\234\256Tp\030\034\377\000_\303\362\374z\306\251\305\230\341,3\346\265h\360\327\2138G+)]\276\320\302\235RY\035\323\272\361\316\357\251\366\353\317b\270\244>[\252\337\302\360\361\223\274\236\251\3551\254%\025\207\227\234\200FH\372\347\367\333\254\363\304\235\236J\274\314\020kr\315\222G\263H\305\206\326+\234\234\217\177\247?\237O\034LD\252\377\000\361\356&\0022kDM\026\035\224q\264\023\3378\366\376\275\025\036\042sH\\\374\031\313\005\042\244\265I\004\311*@\345\360O\037\277\247N\304\343\232\341\016r\256\3143\204@Rjk]c\237]!\214\036\340\374\273u\205\210\342\024\364\225\251\207\303;q\012B\266I\030\211Y{s\3509\343\353\217\310\365\233\377\000$\337\332\256\273\004N\245\035OL\360\312|\346.[\276\006@\343\334~\237\323\245\327~v\331\013Z\366\272[\252\346\266\246 \250\220\022\331\301\317\313\004\237\373\372u\367\034=bu_\033\305\260\022#\336\350/J\\3\217@<\216py\366\317\353\325\321P\215\025\026\200nN\210\277'j\256\342\305\001\316N\017o|\376\035&\255c\006\025\206R\004\301G\2456d\334\273\267q\203\337\237\257\313\242\302\325\004\303\220\342i\026\214\315\325*4\256\002\006\214\355\356y\340\363\237\366\353i\260?j\303\254\362H\016\026\373\254Z@N1 \301\365\0203\203\237\177\366\350\313\267EM\304\230\335\035\360\271\036[D\357\306\342\240w<\236\377\000\230\307\343\364\352\034\370\274\243q'\272B\031\245\013\220\251\265\210\316\001\311=\377\000\323\256\316\034\242\241\313`\204(\330\206\021\227Q\300\312\377\000\227\365\352;A\272[A3\032%)B\307,r\374{\236\337\210\367\355\320\366\301Xk\034'yB\3702\010W\3061\273\344G\266G\366\352{M\302K\217\376h\305\244\302\005T*\335\210=\327\267\357\362\350\015ni\316k\200\200\215\376\036A8\334=\261\214d\363\234\377\000S\372\365\003\020\200\321\275\2126:\035\261\205\012\031}\362s\237\240=-\325\244\3310S\2628R\035\307<\347\214\021\307\323\2505y\242\022&\350KB\310\001#\007 \017\377\000!\372u\335\260+\203\000\325a\241*\271\016\307o\033\261\236~\275Gh\016\253\234\300\005\212\337\300\343\200\210\240\0202G'\3460z\016\324j\273\263\042\007$w\302\015\315\271H\030\003\014N\000\372~\235sj@M jP>\005\202\250\317\227\362\347\000\016\244U\001/\263\265\254\202)@\013\224\000\036p\307\000\363\327\032\274\227\006\314\005\263D]\213\020\256GrH\372\361\324v\326\204]\2217@4\2009c\264\266A\014\303\337\375\370\352\015[.\200\012\327\301\343<\276=\260x\035\011\252tL,\042N\3102S$h\322K\210\321T\226l\200\000^I? \000=\013\253@\223\262\226P'mS\233i\253\311]7W\036\234\3267K]\332\347Ik\247\251\265Z&\270\042\231\252<\206\230\210\206\014P>\3631\3101yn\2547\215\235x.%\376P\340\370|)\304\267\020\312\220$48f;\213\033\311\027\022\027\270\341\337\343\236)_\020(:\223\2304\314Zr\216\262,o\310\253*\365\340n\244\260%L\365\327}&m\321\002\322T\212\267U \002\331+\042#\016\006y\343\036\374\216\274G\377\000\330\016\020\366M*u\013\371CG\316H^\247\377\000\341\236 \312\231jT`o>\367\322\001\372.o\361v\236\223Mi\252\270\352u\234\372\032\372\226\371\265M\005D5\015O\276\321\002H\237\031$\241\010\225L\276f\332X\\;\210\242x\313\313\037\224\377\000=\342\377\000\344\216!\305j\366E\240Qq\313\220^N\260N\247\2516\326\320\275\337\012\370/\007\303i\347a\232\242\371\216\261\314\015\007@\014\365\\\343u\326\336.\350{\366\237\361>1wZk\252K\250h\364\315\302\026\251\202\341ojjx\324\334)\331Li,\361\324\324\310\315\271\232(\314+\273z\276\377\0003K\005\206\305\346\3014w\232@$s\222Lo\000\210\353u\351j\342*a\343\020L\202&:[\346d\251\226\207\373F^\365\367\212z\222\323j\212\216\246\272\371*\307m\323\366\352j\233\275J\311\347\202\265\023\251\1775%\220yRM;H\031\210\247\247\216\224 i\222\277\025\370f\236\023\016*\021\373nI\2016\320F\273\300\216few\016\343.\304V\311?\273N\223\314xj~JF\236\042\353m\021\242u\345\333R\350\012\335K\256.\232\214i\213u\236)\022\235\355\364\337\027\017\300\274\322\204gf\235\322IW`a\211Y\012\262\242\272\277\341\016,\334?\032\243\213\240\177\353\246\302]\254\034\315!\343\244H\351iK\370\247\207~\243\206\324\302\324\375\317t\010\211\020e\247\316>eM\364\225^\261\276i\353\345\342\253G\333*\255\360X\341\274\355\265I$\265T\225\222NS\370l\233\373\311\014j\313!\010\240\310\014\236\225\007o\270\300\377\000\226\2614\370\313\252\270\227\320y\313\220\2334\001g6\332\223s:\203\007A\036K\031\3767\303?\2076\223\000mV\3370\027$\352\035{\200-\255\242U\033\2555\327\217zR\323\242\365\225\177\203\320\350\035\025}J\211m\362_7K(U\236(PW\004tjY_\316\206H\342\330\013\211\343R\303\277^\267\023\376]5+T\245\206\312C\000\330\270\233\022`\330\020\010\211\026\352\260p\237\343:l\246\327V.\222y\200\042mh&N\252-\342\024\267\217\025<\\\243\360\253L]\356\366\315?5\342\013]}}=2<\224\263\221,\224\224\002/;2\324N\324\322HUw\004\376ItFWN\274>?\342\334Uz\037\3628\340\034\360\336\350\026\020c1\320\300\270\271\271^\263\001\360\366\037\017[\364\270k0\233\235o\026\036pz\011]\275\006\243\226\246\276\353}\240\240\263\336\364^\254\275%\355$Y\304pG?\306y\262\300\016\002GU\033\030\341E\0061\272\234\307\235\344y\237&\030\2274dt\346h\217(\327\316\376\253\334\366m#\272l\177)_\332Ri\351\274\004\327R\350\367\271\317s\236Kx\242h\313n\223\314\250\211f\205\220\200\361\314\313+G\354_{p\002\207i\370w\020\321\217eJ\256\200\3313\340\014Lm\317\242\356$\302\354;\251\264I1o1?%\024\267\350\253\276\220\360\353HZm\353n\232x\255\011A_\037\305$1F\370\005\307\305G\202C\311S+\206c\300+\202\241\210*\304\361\367:\263\3536FgH\333\345\265\241:\216\005\255`\246\341\240\277\275\3255\256\356Tp\335\253\364\235-\346\363m\253H\042\206\232\217\313T\212\024\214H\314\011\015\226;}\000\020r\221\200\247\325\317\277\300q\254K\260l\025\036K\032\014I<\364\367\242\362u\360\024\006%\345\255\001\316\326\303\336\226]'j\261\301l\261G\245\353|\273uTc\317\244d\227&\206w\211<\305f\340\274g\263\020p\012n\300\303\003\213\303q\325\031S\267\246\342'\225\245hc0\355x,xQ\370/\276eB\374%\352\206h\276\021\236%\215\333i*\007\015&\000f \203\223\301\317\004}\336\275\2338\325w\304\223\311y\367p\372m&\000R\033E\364TY\355\325\006\245d\222H\245r\210C\266\021{\223\354G<\036\370='\376j\240ql\356\230xu2\320aI\341\250\206\242\031\234\015\337\312\363\020\260\012\030\340\014\023\371\203\371\201\324\267\217\327$5\247T\267\360\272bI\036\3418[,5\265\317\037\230\276\214\215\333\273\216\001\377\000\\~\\g\255Z\034v\253l\343 \254\372\334>\231\260\027\012\307\202\313MC\022\210\321A\306I\307?\257\351\322\252q\007Tt\222\232\314;X<\021\036@V\013\345.\010\367\347\037\207B\352\223pP\201\022a\011\343\011\2020\300\376\031\371d\017\177\366\350\251\020u\325\003\235\011\242\262\026iU\204h\304\016\304\343\255J5r\215U\012\214.7\\\330\264\305\230\306\212\010\014r\007??\351\316:\375\003@\304\002\276\027\210h|\226\354Qf\235\302\251\332\312G#\214\016~\177\257\364\372ua\357-U\351\000D\000\211h\224\002$\005N\000P8?/\364\357\377\000]-\325D\302a\007\317\350\214H#f\014J\021\2678\034\347\351\377\000=+\016\343*\306 @NK\022a\021N\025\201;Gv'\034\343\365=k~\253(\231Y_\247.t\015\320\304\021\224\302\2633v\036\344\037\351\364\035U\177\020\275\325\326p\342\002S\0354`\025UN1\216>\351\371\375:S1\241\304'\273\012\032\3041D\033\016\321\250v\340\202;\037\307\345\333\253\224q\004\332U\032\364\000\357\021\252P\264\\\306U2\337>\330\366\351\342\244\252N\200[\010\370\351\327\270@H\031#\037\323\376z\027=1\204\017\024%\244\000\022T\022G>\371\372\036\211\317:!k$f\213\243>\014\035\312\240\026\355\200G\365\374\372Y\1775 \202\022\225\243;\225\200\3179\347\375>}\016s\2728\274\241\0127\331\036\000a\306@\003\267s\370\364!\312K\255t`\240`p\240n\306\007q\223\357\327\027\363Q\227\222\037\302#\015\301\010\317'\036\340\363\237\251\307\035At\033\250\220\014!\232%\332\033\007w\327\330|\372\200\373\250\220\020\305\027\271\005pq\203\363\374z\342\345\042\244\020B\022P\256\025\266\223\362\366\311\367\374\276\235q~\310\347\242\017\300*\355Q\264\017n9=wh\205\247b\261\250P\021\205\312\234\177\227\216\377\000\357\324f*Z\346\356\020E\026\030\372T\234\356\374\272\222\364\314\315\230\331\026(Hb\000l\374\373\234\201\324gB\330\211\010+I\260\214\026*\033#\214\344\373\375?>\241\316B\307\035vU\207\211\263\336.&\303\341&\210\2437\257\022u\214\246\331EF8\370kyu\216\276\276g\306\310\240\212)L{\337\203$\250\006\342\245O\211\370\347\342Z|;\001R\2410\350 s\222-\037o]\027\276\370'\200\273\033\216d\216\343L\237+\307\232\364\317JJ\366\215I{\321\342\012+\276\231\255\247\244\256\215\342\201\226J\206\024\352\262\315Q\033c\317y\005<jf\301\220\313\011\016\371\021\260\374\023^\200-\017n\243\337\311~\261mB$sT\247\2173x\203g\267\311\250<4\274\370w{\212\201#\254\235.\013X\353T\2572&7G\353\205\017\231\037\363_$\005pNG:\234)\264M\252\002'\373\337T\214^}ZeS\376%\352\217\013\374D\360\246\365f\325\327{U\257\303z\352\311(\353\356\026\252\237\206X#X\342\234\011\3421\221\025O\236b\303\300\252\357\345\260uh\334\226\322\341xLU,Kja\3335\033q\277O\242\247\212\251I\324\210\252{\247\311y\321\366\275:sG\370S\243\264M\006\264{\275\326\236\262\225\264\375\207u5K\032)b\215 H<\262\337\313\305<r\324<\271\006\246a\022\242\030\333\036\373\340J\016v*\245w2\031\0073\257\373\247y\336\346\007+\257;\361%v\366-\244\307w\244@\266\232m\363]E\247<6\325?g\373o\205\365~\030\323\331b\265[\257\266Kf\251\206J\212:f\276AUF\261\325\374D\222\237\346)\253\025\317\033\011\001\304\243g\226\310J\370\\O\021g\020\253X\342w\016-\237\365\203h\033w`-\366\320\3753\030\332;@=m\177Su]\353\237\017\374r\361\337\355UF\376)j\246\036\020i\255[\025\015(\246\215nT\226Hd\246J\211\314p\304&\215$\005\375MZ\346D.\006\321\267g^\237\015\217\300\341x^L8\212\325\033y\261=\350\002\373E\373\260\026+\360\265\353c3\3253M\206\335:\333\357(~/V\336\254\236\037\334V\216\247Tio\010.\272\232\272\222\362U%\013l\242\370\003G-=l\321K\232j?\216\215<\335\212\240\3054,\357\021gW\255\303\035J\245`\000\006\246P\032-s3ng/\316@\233'\343MF\266\344\345\233\370F\347\224\373\033p6\273\373CP\353\315\031\341\316\214\240\236\244\370\225>\246{\264\365\325\361CK\015\246\235*$[ZMTF\311\374\210@bJ\005F\215\013\031\033\201\354\360?\012\034.&\266%\355\377\000\2503(\032\227\022\006km>3\2575\203\210\343\202\265\026Pk\216r\351\233\000.b\3759\021\013\321\377\000\263'\200\232#\301\333\336\240\232\3615\303Rke\255\236j{\315U\042\254\324\300\312|\264\245\245\225\217\227R\310\011j\2207:\2310UI\307\314\276&\370\212\276;)\035\326@\031G\226\246\326\235\007\341{\016\021\302\351\341\301\006\347Y\337\247\366\257=;_^\357\241\364\326\242\256J:\032\253\244\226{\262E\014\365\264\3255\025\025\322fi\042b\030>\371\213+)8F*]\327\004aU/\015{\333}\365\3444\013I\254\004\206\236\211/\213\206\343\242\364F\207\322\261\213\225\342\367WS\247oS\026\256c%-$4\277\023:<\252\205\367RM\270\253\310\241^$\200\273\026\014Z\236\007\021\231\316{\354 \217S\002\335U\314E\000\306\344\006\366\367\344\232^\346+\350\236\222H\251+L\224\263W\313\300\235\342i\231\223&8\302\211U\035P\224\037u\\(\007`\017i\224\005\234t\321P\314f7T\235\306\232\377\000\377\000\236P\337\256\263Y\256V\351\241\246\246\240\247\226\337\266GjX\244\332\215\261\011vh\341\336\0312\354\024\202\255\265\217^\266\235v\273\017\331\264\020F\267\346\261\335O%R\367\231\012\312\272\352\032\372\332\013\244\265\261\334\255\223\327GCm\2061\010\015E\346\264qy\311\222I\304l\305\260\006\031I\301\340\213\230*!\241\255\345>\374\322q\225]%\352#\250\342\240\254\324u5PT#\330\253 t\252\2069p\224\363\243F\303!T6\306EN\340\020]\263\306\010\332ap\246 \334}\026is{B\322\024\243LY.\027J8c\265K-\276\006\205d\206M\241\212dd\215\307<\374\306}[G\313\252\030\232\231]\016\276\305[\242\300[e\320\326\233L\026\373M\276\2344\376TP*\2370\345\212\203\217Vy'\271\317\317=Yi\007\305P\207\237\0057\323\322\247\303\203\033F ,v\363\317\034s\357\362\351\2641\002K'D\025\251\030\016\215T\221\212\324#\230\312\311\307\177\247\323\253\224\261\015\235Uj\254q\021\011\266J}\331\221[\203\237~\017\0373\325\201\211n\312\271\246o)+\210\230\256\354\206\347\0149\335\365\037\276\377\000>\256R\250\341`\223Q\240\000\343\252\312zZi\237\013\267\035\306{(\374?>\206\256!\302\305)\255k\256\271\226x\024H\301\225\042oc\333=\377\000C\214\376]~\235\255W(\021\242\374\375N\233I\207Y6\312\3202H\314\321\205\307\243n2F;~\234~\317T\253c\2666*\305\034\010\333I\372$\353$d\227$4_!\223\221\370\014\376\363\3257q\006\354\264\231\303N\245\0169QHE|\021\220s\376\376\335,\361&\314\224\323\303\310\031BZ\222;\240a\353|\3601\334\217\354z\207\361!\232%\020\341n\015\236hbU+\033(\343\203\235\337{\360\371\236\337\257H\030\371%3\364YZ\034\236\343\200mB\312Y\200\356Go\323\253\364+rU\353S\215R\370\340n@Fc\365\037\220\031?^\265iT\032\312\304\304\002FR\022\244\2429\373\244\363\236FF=\361\357\363\353@U\344\262\036\307\215R\305\243,Uvn\030\317\034\361\365\375z\354\366S$Y\014Q\036\017\2260Gls\372~\373\365\335\242\202\011\325\014Qml`n\366\307\313\353\355\363\350MIR\031\036(kF\233\267\024\006=\244\223\237\177\373\352]P\201\001Ky\243\326\211_#h$\360x\035\272\027T\215T7\275\242\030\241$\020\312>\207\035\275\301\352\005@\247\263\274\024r\321\340\220\250W\234g\007\3663\216\240\324D\030\011\204!DG\271$\034\017\355\376\235q\251u\001\244\017\0041E\367\213)\316r\001\356\177?\314t&\252&\323\032\255\275/\250\005\004\014\343?Lt\001\326\272\235]\001\013\340\230\372\2121V\340\201\216O\314\343\363\352MA\2426\323v\247t\037\203\016X\355\001\033\277\327\034\364\006\246\352\\:--\0309\001U\200\317c\217\351\372\365=\252\221L\024KQ\205l\375\336;g<g\242\025%,\262\374\222[ttW=Wl\320\364\325\364\243UV\321\324\\i\250\233~\351i\241\221\022YC*\225\033w\375\326!\234,\2020\345\030\017\035\361w\306\370^\017\207\355\261\022I\320\015I\345:\001;\235:\257[\360\267\301\370\236)T\323\244@\003Rt\036[\230\331I\247\260^\2745\324\323j{\256\201\261]\264\3435<q\352:\032ye\250\247\212)%e\202\260\207!#\015,\217\264\201\023;\344\223\273+\371C\342\177\212\352\361\227\232\325\235\021`\335\200\350\042\376&\347\344\277Lp/\207\351\360\332B\215\001mI\334\236g\227\200\262\231\377\000\346q\377\000\344\0245i\024\360\012I\343\253\266WSOQ55tr\304\340l\236(\310\204\223\024\261H\204\223\377\000\245\210\310(|c\360\3402\333\255\374\327\272\265\3524\317\206\376'\334\255\332\341\345\324\036\033\353\352SSY_GA\030\335\034\202\031\022@c\001\343gP\222\277\235I\042\3571\276\370\316\345\333\226jU`\354\305\302\270\300\302d\352\274\311\373s\353\013\317\205:V\343\247\255UZj\256\035IQp\026\332:{j\311\346Q5Df:\274\030\223\322\264\25159b\3441\250\310\034\201\327\326\377\000\307\370\006\327\256*\021f\011&w\274|\376\213\304\374U\215\354\331\224jM\275W\233\336\007x\177\342\016\252\326\032#\304\351 \234\351;n\241\267\333\026\262\276C\024S?\232\261\210`gS\027j\215\201\267\005W\220\252\200\314\314=\267\305\274S\015G\017S\004\337\334Z\343\003o\037;\306\245y\376\001\203\255R\263q'@F\277e\354V\264\326\232\262\323m\361\017W\333\274\033\324\336$\013\325u\222\203G\333\253(\250\242\245\247\324N\263\324\324\033\254\262<s\322\323Di\025\244l\007Wx\3267BL\213\361~\033\201\240\3674T\250)\265\241\305\306\363\226@\031@\231&`\000\275\336/\021T\002\030\322I\2004\327\257 -*\220g\266}\223\3748\323z\377\000\306\217\024\357\366\317\023\357\372\206\355p\275S\322SR\334\253uU|\261\302\265\360\032\015\220\254P$\220y2L'Q\003UoGc2\306\373\324\250W\342\330\227R\302S\002\233\000\002d\006\264i'\231\345y\216\226\314\255Z\226\006\203]Y\335\347\023\246\347{r^w\353\217\264V\272\277x\031y\323\225\372\246\361}\361\317ZW,oO\034\314\222\321i\210)\374\331<\266W\036U<\215\011\213\015\263ts\3251\016\0130\366\274?\200R\247\304[\\\2660\364\205\211\335\363\002z\211\237&\257=\211\342\317v\030\322\006j\277^\215\211>\272z\250\377\000\330\277\301\032/\021<`\266\335\312C}\265\331i(\256\227E\255\265GQ\015\300\231!\337EJ\255\271@1\223\266I2Ay\035U\012\306U\237\036q\267\263\015\331\350\\H\261\203\034\317\340(\370k\000\327U\314\34107\372\005\3545A\370}cj\264\264\365\220\325\334'\243\246\245\177\207f\212%@\360I\270\355\042\042Z\256r\3219\340S\253\021\264z~\042\361\000\316\203\363#\350\027\321D\332R*\033\3655\025\217P\352mg{\203BT\311w\244\274Q\255s\305\032U\324\255%1Jt\221\234\243Ty\324\262@bm\254Kga2F\356\307P/\042\233\006kA\267Sx\360\272\026\277)%\306=\204\207\355\007\256\353\264\025F\237\361\007WWi\272\177\377\000x\206\216\357G_^\025\253c\230\0015<P\205?\021\014\033g\336\340\035\204L\\\340\221\325n\021\303\252\342\\\3524\306\326\267\247\257\335Z\306\343)\323gh\363\010\2357Q\341\266\256\360\326\353\251,\225V:\355-Op\267\333\336\272\355AQCYq\266\324\324%E'\235\007\225,\337\024Z\266\235\042GU\222e\332\245\310\010\313m\370*\324\253\012dK\240\350A\026\231\276\220\042\347A\344\2522\2757\2630\323\250\275\364\352\231\257\232b\351\243\357-\341\015\366M\017\257\353\241\236*\370\255PK\024\300Q\324\254\200U\251\251?\374Y\214\233e\\L\300\277\230\350\233U\201\333\303V\006\227mv\264\357\327\311g\325\007>]O\276j\237\260\370\205_j\361OQ\370e\2514N\252\216\321i\2329db<\271\355wE\210\002(\342\251\022\277\225\360\365\010\3468\326D\332\356\341\014r)OH\374 4\031Z\233\244\273\351=:\254\201Vj\032n\032}T\266\373QMl\264\326S\332\322*\352'\274O'\2255+\302\363\261\312\3465W o\033\013/\247a\214\221\301\353C\012\327<\311;\005N\270k[\021\272\271< \240\252\245\323SCz\247D\252y\313\220\000\015\3543\273\271\030\310\343\035\216F\017+\305\323gh\0346\012)=\305\246l\027B\265M(\214\201\267z\257\334\004\035\270\343\261\3568\307U\213\306\203D\346\202\015\375\204\335\0035\034\251\042L\310\200\340)\037\3459\310\030\372\203\364\301\350\033\003]\323*\0078Y)\270Vy1K\034\025\016\031\320:*\276I\003\234(\371\341On\271\265\206hKu\016\357T\337.\242\206\226*\2178\264R.6\0222\256J\367\357\310\343\365\317Wp\325f\352\225Z\020HQ7\324\265\036T5\006]\260\271X\322%#-\272O,\020\017\324w\354\177^\255\340\270\273\032\362\327\334\004\234W\017youS\376>}\256<\010\373)h:/\021\274t\361\032\331\2414\335eW\300\320\006\246\232\256\262\351Q\301h\251h\340W\232s\030%\244e]\261\001\353e,\212\333\370\354v\015\224\373Z\317\021\363\364\027X\370\\.%\304\323\246\333\363\320-T\334\346\236IX\022\343\001rF2?>\276\310\376*]\242\371\203xsX$\3357M2\261\344\235\330\003y\034\237a\237\337\313\254\374N6E\225\274>\027-\366A\217\022\251\303\021\036\356px\007\353\326=\\[\265\013N\235\000E\320\322\232Iq\226\356\2709\307|v\375\377\000N\223\372\267\213\253m\3020\334\033%P\251 \355\007frN>\367\347\324\262\273\263\337T5(\2603\272\244\020 \223\312T\012\204\363\201\373\3168\352\375\007\234\322\253V\000\264\205-\206\034\235\2403\017bGo\226Gs\355\326\3531$\001+\032\245\020Ln\235\251\251\367\251\0126\201\220p\334q\373?\327\255\254. \221%y\356#J\015\254\236#\241\364\250## \000\007n\331\031\353TV\272\303\2511p\215Z,\201\230\331[\003\221\372~\274te\361\241I \021p\224-\000\312\3402\016\330\034\366?\277\237K\355\323{+\243\005\007>Z/'\362\037N\204\327\\)\202cB\2154\200\237J\355\3108\030\366\371\365\002\261\347(\234\3310\004!\212E\217\030\014\213\334\220?\333\237\237@*\023r\244\200\0129)\030\357+\271\201\030#frq\333\361\352]RT\363<\321\253H2N\000`\000\004\376\373q\327\032\307\325\014\003}\020V\223\013\312\225\031\356}\360z\341S\222\200\000\325lQ\214\246\023h\307\335\307\357\330u\306\261!\030`\220B\037\301w\036\245\366\310\037\323\372\365\001\345GfI\360Y\360\247\324\016O>\376\307\337\035@\250\210\013D\350\202h\212\220\2520\001\317\267\341\373\374\272\206\324&\350\262e6Z\370n{\250#\206\343\267\\j\030\205-\344Q-D\314\312\2024\357\217W\000}I=\200\356O\260\004\373\036\271\325{\245\003C\203\201\325x\303\342\257\214\372\262\353\343N\244\361\203Fj\012\335;k\261T\301k\262]\255\225\3427\216\2329\332*r\256\216\256\346\251\232\246\240\205\005\014l\345\201T\014\337\037\370\231\364\361\317u\032\202s\003\003\240\274\362\345\346B\373\247\3038g`i5\355\261\324\236d\354\276\210\374\007\361~\331\343?\207\372S\304\205\265W\330/u\326\330n3\333>)EE(\2342l\332\314\022h%\330\333\033#*QY\021\201\035~P\342\230\027\341k\276\214\310i\042y\302\373\236\023\020\332\254k\342$'\333\267\207\376\016\334\353'\252k\025\242\301{g\221\\\304\262Q\254\236h\304\221T\322\243\244R,\236\215\300\355f*\215\273z\206\025\251bk\264k!9\364\351\235T&\277\300\275'\246\256\226\255S\020\272\377\000\3446\346\251\250\265\012\273\233[\351\030\010\262\260\325L\210\354\264\210\361C!\224\206t\2160\012\260\022\006\346Ws\316S\241\326.|\264\272c\230\326\266u_;\037j\237\264\337\211\037h\355Yg\273\353\232}'\246\322\311E-\252\323h\260\314j\250\255\360\031L\2228\251YeZ\226f\003\371\321\020\216\261\306\021v\201\237\324?\014|;\205\341XW\012\016.\017\202K\254M\255h\021\034\227\305\370\317\027\257\215\257\377\000`\003-\200\027\337\235\346y\253f\335u\272xY\340W\204\226\352ma\247t\315\336;\255]\302\260\327U\275\246j+o\302\261\012cY>&K\220\232\242Xc\2461\377\0005\333\324p\214\253\341*\377\000\371\330\352\3164\313\231\000\177\3443O=2\300\277 \2753A\303a\351\214\360\351:\330\304r\326faY>\033\370\311\242<3\320B\345\256'\361\367]\337\351eKM--\216\351\015\336\254\305WSQW\031\216\226\2442\325\315Q\035;UU\3110\220\217\376:\246\345\0309\370\316\017W\023\2134\351dc\017z]\335\003(\000\370\000l\337P\254\323\306\262\215\014\306\\E\255\004\334\230\351\246\253\316\335ux\326z\262\263[\353\253\356\217\324\224\232J\311AU\246\250`\273GF\213ij\271$\311\226\010\0228@\337[W6 \217j\223J\205\362Q\233\351\234:\206\036\223)\341\250<K\316b[\233\275\224^&\373\001s\377\000\222\361\270\372\325j=\325\3524\303FQ1i\351n\273N\234\202\254\233T\326S\331\253/\323\324\321=\306\262\330\226\370\247\227\006QD\0424\312\236a\311\007l\225\012{g\315brpN\203\360t\303\341\202\032\014\236S\251\373$2\261\313%\327#\345\242\365\033\3545\002\351\217\010\365\245\276\205j\254:\255*\347\251\212w\2441\275|\031\2023\207\225p\314\035\004\001A\014\251\022\202P\2623|_\343\252\375\246<<\231\020=\375\374J\372\017\303\324#\017\224\010\367\357\321v\006\266\327\266\2735EV\252\276%\256v\266SV7\305p\315HM,\217#T\004\002G]\242\031V1\3539l\001\352\333\343\251p\272\265\377\000\353e\246<\357\267\275\226\360\3066\221\355\016\201P\237i\032j+\206\225\241\361B\323u\264\\\255\272WW\351\375Es\033|\310\25641\263\230LjU\330\247\235:J\250\034+4e\367;l\307\242\370^\241\246\367\321p\273\330\346\216\204\377\000\001fqf\007\265\257\006\315p>1)\233\355eKQ\342o\205\026\375\035O\025\257P\335!\326\242\\%9Wjj\230\356Q\306!y\016\370\222H\022\007\231\027i0\2554\214\000L\206\3740?O\211s\235`Y\363\226\375\346\022\270\243\263\322\201x?%8\320z\222\315Ym\252\245\324\021]\377\000\360\213\212\351\317\023\350\256\261\264\222R\333+ \255.\224F\035\310\357G\031X\274\335\214\306(Z U|\324n\250\324\302\324mB\366\33232:\021\004\371\311\203\315YeV\226x\301\363\345\344\254/\022\365\377\000\206\232\217\305]\037c\327Z\023\316\361\012\261+\350i\2566\244hh\252m-I[OQ\023\310&\016\315\024!\244PSq\220\256\315\205\244\215Y\202\302b\006\025\325)\273\270\322$o\232\304E\271\304\362\011\025\261t{qM\302\\f9o\277\202\212\370]\246t\315\363S\350\317\0145M=]]\276\335/\225K\015m\216!=\333NR'\302PS\311X\252\244T*\323%Tf\042\013\011Jd\244EAc\252\324\243M\325i\233\036\246\304\334\333C\254(\240\326\275\301\207n\202\343k\252\262\017\023m^%\352\352\335)\245t\375\306\237N\332\256\2654\324M\010g\250\253\211j^\023=MD\204\264q\266\3061\250\\\235\333N\011b\276\300\321v\026\200\252\363\336x\007\302D\330}V\010\256+T\312\321-i\365\352~\313\266t\205\274\\t\375\\v\370\244\203\340*\343\242\236\005b|\201\351\220\222\307$\261RN\177\373\001\327\233\251\2179\256uZ\255\303\230\350\024g\370\315N\2304\215v\225\350\256\025\042Y\3327\303\015\201\213(\031\357\200F@\310\300\374z\320eN\320\022\0222\001\251O\324\032\231u\246\220\246\324V\232_2V\215\212\205\220)\224\243*\227\\\014(\336Xc\036\307\007\254\252\370\201N\241\246N\205Z\245JX\035\011\232\272\3575\312\213\025\317\035\252\344\034\313\361\021\267\242\030\342PY\237#\214\223\202\00603\333\003\241\303\214\257\314M\212*\217\017d\000\232/\022\334!\215)\352\251'J\250\336*h\202H\035\214\344\005de\007\276\366\333\216\371#\035\372\336\303Uim\226MVw\271/'\377\000\304+\374T\264/\331V\220\370U\340Kho\021<|\202\005[\324\325\225b{>\203#;\022\265b9\253\270\261\363qoV_+\357N\310\017\222\336S\027Z3\020w\367\347\321j\265\2404\027\217~\367_#\0360x\337\342\227\332\013]\336|G\361\253_\352\257\021uEAdZ\213\225K;Q\300\316\322\012zh@\362\251iU\211+O\012\254i\306\001#wX\025*\272\243\346e\011\357Z`/\320a\342\214\2730\214\243\036\024\017\363\036\371\003\257\331\256\247:\005\360\034\374\312I4.\256\331\003orA\344\361\234g\352:\247Z\2307)\324\352\220,\225\323S\310V0S g \036\307\277o\303\252\335\237\242\264j\031\015)r\304\206ER\240\205\004\003\376\277\217\372t=\231\346\232\312\220,\022\266\203\220\350Fq\236\335\277\177\351\320\222[tM3`Q\261Hc\231J\202\250x$\017\337\035\272\226b\216\243U50\367\272\232\333\007\236\212J.pr\314>\274\236\267\260\365\203\202\306\2542\350\246t\224\321\025\012\2523\236\011\347\037\237\357\277[T\234?\325y\334C\211\011\372*,\2566\341;\343\031 \375\007\341\325\366T\213\254\2070\224\245h\224\262\341\216\001\356G'\270\352\177Q\026B\334\021\234\300\243\276\007\356!H\231\007\243\221\334\017\337\035A\254\205\324\011 \354\205\360x\355\220\017l\021\217\323\236\243\267i\3215\270w\201u\257\202\347\205f \343$v\352{C\272\017\323\010\262X\224\200*\200\240\270<{s\337\277Q\231\031\243\313Tp\242\334\305vn\0309\3349\374:\021PB\223N\360\020\326\211\210\316\302G\343\333\221\333\351\324:\250\321KiE\320\322\205\2078M\271\007\356\234\376\377\000\327\2515B*t\244\335m(\016\356\317\222x\003\223\373\367\352\015Q\012F\032\362\207\360 )\364\253\260\031\004\034d\374\277\016\244T\331K\230\000@4\004\023\3518 rG\004\365\302\240\\\326A\220\213j& \266\320\252H<\373u\335\252\027R\221!`\241y]#\215%\226G!UTr\344\360\000\371\344\343\365\350MP\002&\341\345y\017\366\256\373^\325j\207\324\336\017\370OP\264\332BaQk\273j\032iU\345\275E\215\222\307D\340\221\015+a\323\316\004\311:\223\267\313\215\275x\030\354i{Hm\207\315{\036\017\301\033O-Z\267:\370/?\257\367h$\226\322\031\350\250m\361U4\223;\204\205d\220\246\335\303v\000P\250\220\240=\2259\031v\353\3146\230\000\263s\364\367u\356C\211x o\363^\376}\232\251\250\217\201>\011\017\020\252\351\274?\325\251C$\024\262\335\231)\341\232!,\263Dk\231\316\350|\350dW_3\313!B\222P\020\033\363\037\304\215\037\256\254(\367\233'Nv\230\363\225\365\336\032O`\314\3661\375.\247\272\301UQj\323\264U\272r\341\252m\377\000\016\215[T\3635k#\264_\314\247r\024L\221\022\320\267\230\3526\223\030\012\303qo:\001\004\270\030*\373\246\334\223U\263\\xc\341\251\223N\321\322^,ni\240\232\226\222\251&\250\204U\316\026(^\245\230\227\215%ybR\354\200l|\260\356K\033\206\251P\012\216\323\354\210bZ\313/\005~\321\021x!\015^\215\361\263\302\213\3356\241\202\347r\234\335\364\335-\332\244I\015\304\310\325\024\362n\235\014\213M,Q\316\262S\302\307\312\042\015\214\251*\216\276\361\360\366/\035V\225L\0163\273\225\242\035\037\353\020t\264\202A\004\353y\222\027\315\370\265\014;\034\334]\016\366c\004L__K\020@\322\320\271\272\373z\325\376*\370\243O}\325\321\311x\3277\013\304k<1\025+\014a\300\024T\310\343lpC\006\370\2213\267j\216\011$\037M\206\302Q\300p\356\316\201\356\006\330\363'\375\214nM\317\341c\342151X\336\322\247\356'N\234\207@4]SU\342\276\231O\016\223U\350\377\000\015lZ\003\302\215/UQE\243$\246\271TT\327j+\264\3467\370\312\227\235W\371QN\015Z:&\321,N\002\217)S\257\022\336\011Q\330\301\207\251P\276\253\307~@\206\264M\204n@\015;\351u\275\377\000*\321@\325\014\312\301\373`\335\304\363\235\206\276\253\220\255\364z\203\307\257\022/\024\2114Ox\222\317R\362M[R\363\326\335\032\226\326\301\003I!$\324\317\345\205S\351\2122Pp\2503\357j>\217\014\240\317\374A\032\013\000]\364\034\2657\272\363MeLeB,]\033\315\340}O\311[?g\375\015\240u\036\233\277jG\263\\.\336#\331\344\245\271\351{b_\022\331K]O\003\302\323cr\026\232a\346\253\242\253)\036Ia\352\000\034n?\304+\263\020(\222;7H&$\202g\345k\255\036\015\206\246\352}\240\035\361\240\351o\315\227\241\277f\2315\326\257\322:\366\367c\322UZ\323W\331\255\367X \270\\@\236\222\365Qt\226\011^)\212\005YY&\370\252\227Td\332\225;\260\241\243Q\363.9\206\245O\020\3069\321L\226\310\032\200\320`\370\021\021\271\362^\277\205\325{\251\022\007x\003s\241$\351\343\364\224V\250\360S_Z\351m\224\232\332\202\351<\032\226K\042^\347\266\225\211f\236)\351~-v\302\031Q\244JYY6\215\216\2234lSnY\354\306P\022\352f\003\003\242z\203\037[\365\272X\247T\216\376\256\211\373\253r\267\303\275V\232\002%j\375[_5]\216\347Aq\376\035\266\031.\024\362\311!\306\325\005\221\\m;\025\261\2604x;\267/\231\245\212i\304\027\213A\004N\305k\325\240K *\376\2154\274\332\363\307\013\274\264V\232{L\226\025\233S\305\014\263+S\317;\311n\022R\251Ft\220CTL\261\260\333\032\010\313\022]\210\326\251\207x\245E\202d\033i\240\357_\314YP\355\332^\363\264\031\372)>\221\360oLiJ\215?\240.W\035e%\236\345#9\246\236\206\025\251\221$\011\004\325\024\322,\214\222yo4\313\042\205\227r\243\306r\241sZ\2666\243\232\352\240\013x\373\272x\240\031\015P\237\013\364\035}\377\000Wx\235W\025\346\337}\327v\035i5m\210\327K\033\322Kn\240K\205--;JKyqM$\367\011D\345\212\264\256\342E\332\352WO\211\342\231O\263`l5\314\023\034\314\027[\320*XJN{\\\347\031 \310\360\022\007\335(\360;\302{\307\210\325U\002\262\375q\321Z\352\375\007\360\313\325-}0\252[Y\241\210R,\301\303\220K\035\353\034h\353\203\031\220\022\240\227\234c\3057\206\200\013XdF\363x\374\241\244\322\351.'1\347\321z?\246~\311z'\303;e\246\313\240\364\325\035-\205\031%\225\035\025\332\342\303`/U1\006I$c\0126\347,F\016\017=fc8\233\261\016\317U\344\273\351\320\005v\206\020S\0000@\367\346\254\255#\2404\305\241.\261\313\243\036\313x\317\246H\343\342\241H\377\0001'-\215\243%\276C\007\000\016\251\275\371\242\362\023?d\305\211\\\341\366\202\360\352\361s\240\376/a\323T\267}\207\377\000\223\034\254U\231q\201\345\250\340\260\317|\366\343\037-.\033\\6\304\302\253\213k\210\220\025+\340\205uV\212\322\226J\372\235=q\236\305I\013PUy\352\253+\302\013M$\210\200`\223;\037O\033\210\031\035#\212`\332\372\316-77\374|\227a+\221Lf\320(W\332S\355\005\247|\027\261k\257\035\256\024&\343\341\376\227\262\3135\302*=\311\361\260\312\361\242m*\030\026\221\336%R\336\221\274\026#\031\025\3525\264\350\367\315\345\033\352\222e\242\313\346C\374E?\305?Tx\343\246F\226\373,\177\346^\015x'^\263%\333Q\335!\216\333\250\265#\011\035\232\032\032H\346y))\202\307&\372\215\302I\310\2222\321\252\230\344\317\257\361\004\016\315\203\242\201B%\313\305\033M\252\323r\246\241\267YiR\242H\334\307AG\036\347\022J\347\2228\365\310\304.X\017\220\366\307^G\033\305\252\023&\315BZ\\`\352\273w\303\357\261,\346\330\372\257\307\013\335\207H\332%\012#\246j\275\361\302\3142\277\020\322\004R\374\020\020\022\027\034\234\200:\032\025^\373\266c\346\257\214\013\001\227\025\366\330,\341\323\315\343y9 \037\357\372\017\247_\320\020\300u_\226jU\202Cu\372\241\013C9%\2418\300\013\270\034\221\363\037O\357\325wR\220\255\366\304\015n\213\232\337$@\252\006\210\001\2006\363\333\346?\036\251W\247\000\036J\376\026\261&\023G\255\034\345\343'\000\000G\343\317Y\325jA\265\226\206\035\263st\365F\301\341F1\306\233W\007>\303\351\317n\2708\021t0AY\014k<\354\261\251-\222{\177P?>\205\255\275\223\014\000\006\352\177m\240x\326%\220\251#\267\004\343\345\373\377\000~\264\250\274\304\005\235Q\255\231*_MG8\010\273\012\220\003\003\273\237\373\353J\225@\262\361,\027\331I\241\216@W\322U\261\362\366\307WY\210\264,\303\205\203)\312\032}\344\025B\001\03703\201\375:\206\327Bi\307{\301\013\340\235v\205\214\022A<\214g\237\227\347\322j:o\262{)\265\243\231F\212GW\005\306\321\216p{c\334\3654\237\224\352\247\022\001\271\011j[\200\307\014}\207|\347\353\325\201\\*5i\270\224\261(\230\202\0028\340\361\317n\337\237n\240\327\200\226\312.\321\015h\227$m\334=\306;~\371=\003\261\011\314\245\037\265\030(\216\335\335\324\361\300\356y\377\000~\210\326\224\016\244N\250\301o*\002\252\014{\217\317\241\355\371\250u+\331\014P\000\010\011\200{\023\355\370\365\035\264\246\266\234h\260\320\014\002\024\257\340{\216\244V;\245\272\236\341\001\250p\001\330G9\013\354\007DkJ\222\315\021&\215}{\266\251\000\362x\343\351\324\366\312C\011\230\\\031\366\326\361\346\305\242\264N\240\360\223M\352:f\3612\357\002\322\\`\245s\346\331\255\222\306ZV\225\307\020\315:m\2128\311\363<\271er\25263g\342qY\210ct\367o\312\337\341\034<\311\253S@\027\213\020F\377\000\023\014kM%ET\205!\212\236\010Y\335\211#\010\221\250\311c\351\033@\311\316\007p:\312\307Tm6\346q\361+\330`\251\232\216\206\356\275Q\373'x\015>\217\267\323\352;\245\256\361Q\254\253j\015\236\355\347S\302\337\303c\211\242\225\351aW\014\010&9<\351\217-$q\304\252\246#\277\363\377\000\306_\021\034c\313X@\246\335\042{\323\042I\345\310/\251p^\022(\264\023\373\216\263\267\202\354\213\226\236\324WM)|\246\265\3364\374\327j\2521-\025Mc\232\201\025B0\337M-*\372g\246\036Ye\010\352\371\252\330r\001\003\305\340\2532\225A\234\030\364\363\350\267j\2079\2065S\037\012.\027;o\2066\253~\245kv\225\325\026\312\351\250\222Z8\312*\274oP\231M\341\244R\361 ,\241Ll\03296\343\004Q\342\214gn{3-\376$\374\323\250<\344\031\254\252-|\365\247\304;^\251\323z\202\262\323l\255\247K\035U)\2663Gq\212\252\245Qe\215\231w\007\215H\012B\272\342\235\225\221\216\011\277E\323C+\233\244\235t\204\267\376\354\300\373\225\346O\212Z\217Hh\375Kf\361\317O\305V.UT\367\272Km\242\261)\042\251:\226(\026\327Sr4T\354V\226\234\324\323KTw(\222VDp\371a\022\3757\204p\374N3\014xs\300\015\005\222\353\335\223\2344\023\251\202\007\201\363^;\033\215\241\206\254\334SI\315\016\312-gFY z\256<\360\223O\351\033\276\261\267\3315\212^nZv\232\000\265T\324\212Z\242\262%9\220I(`\353\266\025\250\223r\356g\221b@\000r\303\350\277\020bj\321\303\227\341\310k\266\230\201\366\345\345+\312\360\2545:\225\262\325\031\207\275WP\375\273|8\227Ak/\013\3744\260\301Wn\322\366}#\022AdR\365+bg\254\250&1,\212\032G\177$\215\357\352\376A\003\012B\365\345\177\306\330\321Z\205|U_\375J\217\222\357\374\2546\351\323r\265>.\302d\253N\215?\332\006\234\257\367\266\253\231<1\322\272\253Y_\255\332\017HU\317emD\351m\270Vo+\024t\322\262\251J\202\031A\207\013\0311\356\334\344*\216\375z\2361\213\245\207\242k\326\000\344\270\036\037u\215\303(>\263\3056\2223k\341\313\301{y\242\376\300u46/\210\360\216\315qD\256\266Ki\251[\334\257-DK,\260\024\252x\233j\357\211b-\345\252\202X\005\007\337\257\214\361?\211\352U\000T\375\300\315\272\003o\011_H\300\360\232t\254\301b7\353\367^\266xs\366Y\322:\013\370\025E\226\321K\247\354\024V\344\266R\333\225Ax)\325\025\021e\227\357K)T\014\3627\252I\031\335\213\026\353\302\277\020\3678\276\241\227:\344\373\333\246\313t5\240\006\264@\026\003\242\262\365\027\206\272n\236\212\256\345\005%1\270\2520\244,\200\225\233a\012G\310\363\334v\037.z\357\325\035\027dUn\222\320T\263\237.\255\315M\\LIf\354\330\001wc\330\214\016\335s\252\305\341Cou'o\263V\231\254\252\254\254\246\250\024/]\315bQ\304\221\275P \347|\240n\317<\267s\363\343\243\030\303i\032 \354\365)\312\243\354\341g\252\251\216\256\035\260\2659&\225\241%d\246bw\022\033\276I\301\371p:\226\342\216\213\213\002\246\264\247\331\017\303\257\014$\277\213\036\231H\244\257\233\317\225]\231\323r\347`\000\236\0213\205\035\300\012?\3121j\246=\365\213]P\314$6\210d\345\012Wh\360gN\332\356\260\334(\355\222\253\205 \261%\331\024\262\222\027-\225\004\216\007\313>\304\203\3251N\042%\013iD\222\256Ih((\242\216\2468\3415\003\325\301$\223\214~\203\034\001\363\352\250|\334\247x*\217\304\315}\243\274=\322\267]u\342V\257\321\376\032h{s\254W\033\275\366\261(\351(\263\042\240I%l\004b\356\211\267\276\342\006:\223\211\205\017`\213\256)\373S\375\274\376\312\377\000gZ/\011e\361\003\305\335\011G`\325U\363Q\301t\216\355\023Cn\215)\340\230\324M\012o\235\242\333UM\235\221\222\206X\367\355\336\240\255\270\346\213\035\022\2529\255\023\252\360;\355\203\3767\337e\332\035\007\256|;\360\013J\370\257\343^\246\271S\313A\025\346\231\245\323V\232y\031\324\227\212y\327\370\214\321\347y>\\0\026\031Q*\006\334+\326\343,\230\006J\254\352\355\015\200\276n\376\321_m\377\000\264\357\332v\004\262x\335\342\306\267\237E$\2614\026\032\011E\266\307\033\042\260FZ\012l$\256\2133\001$\346IH>\247|g\254\372\270\252\316:\314\2456\261\321\272.*\274k:{h\216*\032\272\232\211\243 )\212FV\330\016F\347bY\273\260\366\366\310\340t\372\030'T\324D\246Qi#\242q\360\363\304O\024\264\306\245\265k\0353x\227MIG:UG4\210\254$\301\340\025`w\002\011\311\307<\365\255K\200Qw\376\243l\247\264\015\2707S\335Q\342N\262\327\365b\277X\352\213\346\244\224\002\3135|\345\225I<\224L\205\311\377\000\355\214\236\267ia\030\317\3751\022\252T\250Lf_\241f\230\361K\303{\326\244\321:f\237V\333\252\356w\366\270\245\241#\311[\201\243\0214\301[\003\003l\350S?\373?\313\236\307\364A\343\3540\312o\222f<\265_\021<$\200^\341\021\037\302\352*+\035\024\364\222*\204\220\236T\214\014\021\363\351\314\342\216\220J\007`\032[\314\250Em\211~\042X\232(\210\034\003\234\222=\361\333\344OZ\254\304g\214\312\231fBB\255n\326\361\024\330\212!\346\003\306O\367\347\216\253b\033*\316\031\320s&\344\2430\251\213&D9\340s\372uQ\355t[Uz\203\233b\237\355\266\331w\252\252\262\257\277\271\357\217\227SF\226[\256\253\\\023\007Ei[\250\203@\251\263\015\2003\236GZ\224A\032\352\262k\221$rS\032j6ER\374}G\267\343\370\034ue\325\013D*\3405\306S\322S\240P\350\024\023\333\351\307\351\327~\244e\224\247Q\222\235\354\366\232\253\225H\206\216\226J\2316\347\322\243\201\3543\370|\375\372\316\305\361\272Tn\363\012\346\033\202>\261\356\205,\253\321WZZs:\306'\221\023t\321\257\251\223\237lw\340\363\376\275d\321\370\236\225Z\231E\226\275O\207_N\236mN\351\256\013\005X*\315M0\211\273dpO\341\372\364\352\374v\233t2PP\340\325\035b,z),\026\344H\314M\036\326\340\237\377\000\037\337\357\267X\257\343\246fV\357\374\033r\304%\260\333\251\312\207\021\214{\217\364\375\374\272\232|i\344\301)U\270\0350\016P\232\346\265\342R\310\245\025\216p\001\343\3463\326\3738\251\311\233\222\363\216\341?\366e\331\037\374-H$+\037a\362\374\272\032|l\346\202\246\247\001\031K\232Ry(\0009`\010';\276_\263\326\325,Na+\317W\303\026:\012\317\202<\340\026^}\271\350\216 \004\241I\304\330Y+\202\311[X\353\0355\024\365\014\330UDBs\362\340\177\177\257T\353\361j4\273\325\036\004uW\250\360\214E[1\204\371+\036\325\340\335\376\242\026\252\272\210\255\324\2527\205c\271\337\362\035\272\361\230\377\000\362\015\000\354\230q\233\256\336K\331`>\003\252\006|A\216\232\256\003\373Z}\240\241\3737\351\370\015\272\323Kz\327\225\2552\333\341\252\317\302[\222#\206\254\253\307,\252\304*B\01038 \225Dr}\245<wj\301\225\332\211'x\351\327\351\342\274\375>\012\356\327\274,\012\361V\365\340\237\215Tu\342\257Qx\177\342\017\361J\370\315\352\246\272\351Jc7\0179\274\306\251i\030\200\345\336M\315\214\267\250\222\027\034)\274[\014Z2\274\037\002\275\031\341\325\003\240\264\251\357\204_d\277\037|Q\270\333\357:+@^\277\201\3158\211\265\034\306\236\236\232\333\037)%DF\240\215\362\250\336\321\341\033/\260\366\031>S\217\361\374=*n\031\201p\032k=<9\364^\213\204\360\272\216p$CN\353\330\332\017\016it\322i+\006\203\323\225\232Z+-\274\320\322J\310+\032\334\213\023\204w\225\267\031fg\362\203\271-\346\270\231\270f\022\017\317N\247^\253\336\352\246K\214\237\037\307%\365 \3664\000\313B\261m\276\020\353\032\272\012\313\235e\034v\007\250\202G\024\357\374\326\205d^\042bX\226t]\241\3300\017 n6\204\305\307p\362n\343uY\270\201\232\302\310\353\017\205:\222\232\266\242\246\303\374n\325\013\314g3\324\025>\240\354TD\000\014\023\016\353\264\226R\204'\000.+\376\220\223\0053\265\021\242|\257\360n\242\242\251j\345\254w\272G2\325\323MV\206U\212e\363v\311\260\236J\231\316\001>\303\222y\3501\0344T\001\263m\341M\034ai\3145\013\224\365\207\370q\370]\250t_\207Z&\313d\246\241\236\323Z&\254\324+\030[\305\332\031\035\346\252Z\212\205!dy\245\220\035\316\247\312U\333\036\305\340\373n\037\361\036'\017U\365\003\2148F_\365\020 \030\350\007\236\353\317b\370E\032\255\001\302\340\353\2772\256\233\217\331\277\302\315!\243it\037\206\376\036h\335-\026\362\347\341\350#\370\205v\005\014\246s\2272\200\344\206$\343\333\007\004db\370\225j\356.\254\362OU{\017\205\247I\2405\250z\233\354\217\240\256\355\250\253\253i]\356\267\200^\266i\267\324<\217\345\252\014\002\303\204EUL\021\214n\316rK0\\a\364\203YOF\351\267\276\251u\360,y.;\2507\203\337c\215\027\341\005L\372\232\323Cs\275\325<\217,\215(1E\220\341\220\210\001 \220\024\015\337\217>\242:\236-\306\237\212\206\325:.\300\360\366P\273\004J\357\355\027\252\253\255\3469\352D\022\031\327\371qE\202we\267\034{c\234\037\377\000.\274\245zb\012\330c\217%!\270\353K\324\365\277\007\003\311\014E\307\227\270\0221\221\317\343\317\372\365\236Jy\002eG\274@\270TG@\265\0257P\264\351\026\335\301\366\242\223\376c\357\357\337=X\245@\021}R\315H\326\301V\266M}CD\266\272kR\270 z\377\000\233\277\316`y9'${\223\323]\204;\241\025\006\313\250\264\347\210QT\321\302\251$\017Vx,\3078=Wu\022\035\010\332\351I\365\037\211\206\311_H\255X\202\031F|\266#9\371\220=\276\277^\240P$J\216\320\005\000\276x\263\004\226\332\233\205=d2\310\201\266\220\010\334\331\373\243\337\201\375\372e<9\315t.x*\271\240\361E\357TV\301M<\316kn4\226\330\200\346F\252\251\235b\211J\344\022\0136\0169\0038\014x\350\352\2646\307U\015;*7\307\377\000\361\022\373\042}\220\256\332\226\301\366\222\361\222\337\240\365\245\226\310\227\371lu4\025\022Oz^H\241\267\025FI\256\007\012\246\225\231\0360\352\316Urz\240\352\342bP\366\215h\357\025\360u\342/\370\274x\317\342o\204:\317\301*\371t\364~\037^<O\274x\235Sq\232\221\340\270U\326UT\031\322\012\210\274\311ahQ\331\333c\231\004\214Wy!v\234\376&k\277\270\323\012\211!\331\2175\302\036+}\2455o\215o[\251\274_\327\372\203Z\353\025\220EKr\256\254i%\024\254\013\010a>\220\220\251o\375j\250\021\317\003\035\251\214\005WT.:\024\242\307\335\343U\311\367\217\022*\263$4RU\314\203\036\271$8,8\335\264q\237\257\276Nz\331\303\360\246\210.F\3348\213\250\0357\361\233\365G\303\3234\323JG;F\006\007\034\237n\266\231\206\223\015\011\3045\262\246\324\326+-\206\230\324\336\005-UZ\372\211bZ8\317\341\356{w\375=\372\324\245E\264\206b\222\332\245\366\011\246\343\252\252\356\022\303Mji\221r\003;(!\263\201\330\347\214\216\347\237\303\035Vv!\317p\310T\266\230ka\311\344\\\252\254\360K\374F\352\225\355\270\020|\245\\{c \363\325\274\345\215\202n\200\2633\2635{?\340\367\332\372\343\341?\211\376\017\370\201Y\024\267(\364\255u-r\306\323H\036\272E\226J\207G!\211Eb\312\207n\334\345\213w\3533\206|AZ\235juI\375\240\371\257;\210\341\215xp'U\355\277\370f\177\211\255\337\304\273\357\211\332K\355Q\342\354\217]S\015\276\277N\\n\011\004T\264\2251\307\345\325PF\264\361*\305\346\211c\231W\204\315<\240\000_\237w\360\227\306/\252\367\322\306\272I\202\017\205\243\316\307\311y\354o\010\210\354F\237Nk\333M/\251\364\236\270\260\322\352\315?\251(\256\266Z\213Y\274G*\270Y#\242/<fi#\373\350\236e\035\\y#\005\351\345Q\222\247\257\242a\270\333\010\314\327\010\361\361\374,LO\013x\261\011\240\352/\015*\257\232KJS\353\235\031U\251\257\264\224\327\033M\262\013\204RU\334(g\246\232\242\032\244\205I\177\042H\251\246e\224\200\254T\014\345\200;\324\370\245\011\014\3163\033\306\3761\313\252\306\375\015a$\013\005 \252\321\320\247d\014\271\300\310\372\217\313\376\372\320`i\357J\256j9\243)\011]\035\233\341\245T0\345\027<\367\004\364M\215\020\022M\312\236\333t\373L\025\241XW\323\203\270\362\017\320uS\021\217e+\225w\017\200}YO\223\330\353\221J4,[y\030<\034\343\366z\247W\216R\015\261V\350\360J\256q\344\254\375\017\341\344\365\321\273T\304\2239\003h<\205\031\316?\036\274G\027\370\225\371\262\264\300^\267\207\360\006\001.\022U\345n\321&\221\336Ic\212\023\377\000\255W\001y\307\277\267\353\327\225\253\304\334\363s!z\026`\003E\223%\342\276\337\247C\304\042j\262\355\206P\334\361\365=X\242\342\363\231\003\310\002\025Ms\275-mB\224\005C\200\0265\035\207\266z\267\333\303a,P3t\351jSP\255\036\017\007\007\214\037\307\252\265+\036i\254\247xR\352{=/\226\236p%\211\003\000\022{{\374\372#\216w5\307\010\331\203\272_%\212\223z)1yD\344\034v<{\364\326\361z\215\320\245;\206\265\305,\242\322\220SJ\242\262\022\321\277\012\373\260\006}\377\000\257CW\216<\216\351\205\314\341,\007\275t\361\377\000\211\331\344!\347U\2217l\\\016\007\372uc\017\3616!\215\312\327*\230\237\2070\365]\235\355\321 \241\264\331 \252z\027\246\200\027m\245\267\222\034|\301\353\261\177\020b^$\271\036\037\341\374-9\001\252\330\242\256\206\332\014-n\247\244T\215Q\033\037x\016\001\310\356G^J\261/9\246J\364t\206K\000\245Tz\212\337So\250\266\315\000\236\266@\313\033\252\215\240\021\357\363=\372\241\225\324\337\332M\202\272\036\036\330:\225L_~\316\376\036j\013\304z\272\361\245\351oU\320\264{Mg\363\243B\204\024\0427\310R\010\317\034\034\365\257\377\000\334\330\234\275\226{tT\233\301\351\003\234\265?\335|\036\322\032\322\212\013n\252\260\332\257\326\324\224H\260\324\304$@\341\203\003\203\337\225\\\203\301\307 \216:\316<Y\3150\325u\2709\375\312\311\252\322`E\030\212\236\234\250M\270e\316\321\200\006\337a\370}:\246q\222n\2340\361\245\224!\364D6\362\223\210\351\301L\201\205\300\306s\200=\273\365\316\305\315\202\236\310\204\261hh\246\201\\\303\033\266F\321\362\347\346:WnM\212\220\310\012=p\267F\316\360\323D\210\344\366\307 \364\301TjT\026\250\325m\256D\252Da\031\223>\256\374\217\227\347\321\366\227\350\2043\325.\222\307[\0354\222A\006\345Q\221\201\217\257~\201\325F\222\2144\250]\273J\324W\326W\324IN\210\352\241\225\210\317\250\343+\364\031\351o\252@\211R\320\203u\245\206\216\032\266\256\221p\023\007$\340c\333\347\320\007\235\2279\200M\225Us\325u\327%\0244\342Xiw\005C\030*\305F\001\031\3741\333\347\327>\032%\033\001:\247\375\031\177\255\263U\321\333j#\264\311n\345w\312s<'\235\240\214m\000\363\317\276:\317\252s]\245<\015\224\214\324\245N\260H\015t\242\225\243'lk\302>p\003w\347'\330\017n\224\335%\031\012Y\251\264\225=\342\204\322\314\347\312\333\226\340\020\330\3669\030\351\264jE\322\236\012\343\333n\202\273\332/\367\257.\031\244\217\006(\323\314\337\270\217e\015\200\027\004|\275\277\036\266\235\210\005\242\025\022\302\327\024\303[\342\005m\256\337U%#$U\264\363y>Ir\245[<\226\317\266F\010\034\364L\303\202\356\213\235T\305\327\031ko\035\265\275U\372y\246\276\\\252\347X\312$h\002\341\324\366-\201\221\3529\306\006\001\353B\236\015\215\002\326U\235\210&ot\321/\332\242\301g\323z\226\367\257\3654\226*\013\025,u\327z\221\023\277\360\352s\301\222\246(\301x\343\356K\260\000*\263\022\002\223\325L_eK\275\267\345Ck;U\340\177\370\240\177\213\337\205Z\242\305S\340\017\331\363RjK\215\362\327t\246\256o\020l\027\371(\255\320VD\315\206\267\254\003\315\2551\022\257\025g\231\014q\314\233\343I\302\244\235y\214fj\216\226\011F\367\222\006\373\257\230\315E\257\345\257\250\272\225\222\266\242\276\246w\226\242\244\310$z\267c\270\274\22202H\344\362^Ff>\347\223\324Q\301e\35799\255pvbT\002\236\363tD\222\236\012\307\012\376\242\011\310\317\317\350x\035h:\213lwR\346N\211\025]T\263I\206\236i\010\345\235\273\203\375\273\365\314\260\205-\026I|\306.%*\245\260\010f\035\317\341\371u\323\006\350\346\320\244\364:\226\252\004J\013U\025\022O/\244\310\023\327+\374\311\355\363\300\354:\262qp\334\242\337\322Q\246'1L5\327K\235J\230\253*&*\244\372\002\355\311\371\034\016{u]\325I\272c\030\006\213v\207\222\236Y\353\213L\251\022\220\301H\005\201\343\034\376\373t\352Ok\006e\325\004\331#\254\254\251\256\230\3156@=\2060\024}>\235Ts\203\267E\021\242\355=]si\355\264\320S\307$\227\031.\012\221\252\214d\262\221\205;\260A\302{\361\357\216:\255\202-\354\344\354\026 h\331X6k\311\266x}-}\003\231\231\2263,ev\004\007\337cc\034wQ\234\360Ga\232t^[^\034R\015 \\H\037\312\355\237\011~\332\2762\350\3751\342\026\216\321\272\312\272\323\2475\016\2336\032\370V(\335jh\221\345\225\340\247~Z\042\365\023\263\277\226U\344v\344\220X5S\307\253\321\315K<\002 \363\347\363\335Mzt\307\356\033\373\371.\235\373\000}\244i\354_n/\261\316\254\361Z\376\226\375)C=\267I\327\317Q4t\361\332-\211\023P#3)\031\212(j\225\330\234\346,\222I\317M\370\177\342\267R\305\262\265c9{\272\355\026\362\012\245l#*\0077b\027\272\177b?\361(\263\370\375\361vO\020\2566\333v\243\252\324\3253\005x\232?\341\232z;\024\322\244\261\204M\217\272\272\236\236-\241\235\211\252\224\366\000\217\254\360\037\362_\352%\225\034,~Q\371Xu~\031\2479\230.=\225\352>\223\271Y5\336\236\323:\323MO\035F\236\273[\351\3564\222+\207\006)Sr\345\207\031\036\2458\367V\036\335{\312\\t\324`{L\203\364Y\357\340\215k\262\220\255\253\032EI<QL\004\216\330\373\313\351\343\334~\270\374\217Tx\206=\325\004\205{\011\202k\012\232]|\266EuT\227\004\014\205\317\351\326\023k\230\202V\257b\004\024\355f\273MA\034/\034\322\307\042\3626q\372\221\325\012\314\314 \253t\354d)\332_e\256\206\030\352*\245p3\222_\037\323\216q\325\003O.\212\330t\350\222\334e\267T\004\376|\022\276\301\301P\177\000=\317~\233H\220\241\315k\264U\213\323S|d\252\2016\002\017\003\031?!\372\364\352\217\201)`\022\024\272\202\322\355\345\313\032G\264\234\217n\017\323\244\276\263D\302k(\223\252\220\313J)`i6\207 \221\310\355\307\327\333\277JmL\306\0232\006\211\367\242\257\356\332\242jv\332\230U\310\003#q'\036\377\000\206:\272\326H\202\220$\231\321%\377\000\313\356\023\264r\232\211\042\331\201\264\362\017\323\037\276:\343L\015\021\222\350\224\357Q\252&\254\245\304l`F\031e\015\330\375\017\267R\032\006\213\213\214\303\22347\212\250fR\222H\356\247\273\034\021\236\375s\200:\250-\213\253\312\325|\247\270Z\341\246\250\250\315B/\244\037\363\003\370\365\216\366\345wEy\222B|\323\256\022i$i\035\2367\014\247#\324q\316\177\277Uq&D\004\346@\272\260\005\304M\020A,\276Y8 e\272\315u2\014B\270\332\243\232~\241\011\034@\010\247H\301\030,\207\267\314\347\267\343\325g\202\014\035U\200\341\022\244\020\324\231\302H\261\253\303\202\016[\037\323\347\325wH0\210\204\202\367GKp\2434\355\001\362@\310`p\312\3370}\272&<\315\324*M\247[EL\264rI2\276\354.}\372d\241\0151\022\267-\346\030\245Fl\00027{\177\317B\2103\321\031GSCWPd\225\321\344bB\226<\363\321\275\304\010\344\2048o\252\261\250\351a\222\224\042A\347\214\021\205\000\340\365Q\325cD\310\262e\236\3338\236XE9\205\035p0q\317D\332\253\210\215W\014x\353\252\357\332rj\373um\232\266\236\231p\321\314q\266\\\2229>\335\211\037\327\216\264\260\215\016*\265s\012\222\321\336\042\321H\261\032\330.4\324\250\241Vi\241a\014\354FIY\017\245\230\344\223\203\330u\030\332y\005\267SA\344\330\352\235\365f\257\243\240\215n4kU5$g\314\250\232\235\327v\001\003\201\356\271l\363\362\353:\214\033nU\227\202\014\243|#\326WMm\252\250n6\212\306\251\265CQ\262c3\025\033\224g\004c\004\355l\361\376\235M@\033 \243\006B\364&\033<\223Z\235\340\002f~B\003\303\022;~\035V\005An\352%E\243\252\3563TS\232\002\225\022e\025\330\344\202x\300S\355\333\365\350\305S\272\002\301+\210\274U\360#PUZ.Z\317K\254Z\222\204\031g_ \210\235\243F`Z%\343{\003\031R\017$\203\201\306:\332\302cA\031]eN\276\034\023!y\201\2505U\202\315xJ\215}{\323zwMF\2655\025\227*\211\005==\014)\003\314\323\313;\035\261\042\307\034\204\273\020\243\003\236T\035\214E\\\264\313\201\362T\030\331t\021\252\371\002\377\000\022\377\000\267\036\233\373A\370\367\342\015'\200\272\237P\\\374\0054\266\233m=C\212\333h\326\022Q\322\341.u\224\316\350\373\221\346\226(RH\324\010\241\216B\213$\214G\226\3751uCX\332}\350\235R\220\026j\362z\266\343Q]:5T\347`\340\001\316\321\364\356\1773\325\232l\015\031BnX\026MM;n}\251\030\004\237Wbz\022cD@\031D\002r\370\022\034\360\177O~\270\235\321\027\020\204\024\000C\246\033>\3478\352\011\221*3#\241\211\246q\034eO\004\202\335\233\003=\372Qv\222\204\270\001tu\035_\360\351V\247lBe9R\304\202>_\361\357\317K\254f\333\025\316`\042\350\212\311\242\250\230\314\273\001\356\002\234{\237\237P\011m\221\261\226\360EM_)\215\042\363jf@8R\331\332@\350\334\034\353\024Mf\345\007\370ml\214\217P\202\2207b\300\226o\301@'\035\027c\002\353\211\037\352\273\253QZ\354\365\366\255-\250,\306\241\252\350\353\251\042\272S`\215\314\311'\227*\372~K\265\220\020\010!\200\007v|?\015\307\325\001\330w\351r\017\333\360\262\351\202\036Z\355Tj\361|\255\272\331-vz\037\201\253\234\303%T\262\321rR\230 d2E\235\361\002\274\000\340{\250$\347;\024\236\032\354\311Th\232`\271\301L4\215b\245\216\3135L\024\324\322\042\230\211\236\250B\330r$(_\234na\032\235\253\356=J\001'\314b\311\251U\302~R\224\343/\313\252\231[u}=\005\362\315E-\304\231\353\251j+\303\006\000G\036R=\247`)\354\334\355P\314\251\226\004\364\212\370r)\347\002\300\302s\377\000h +;Jk\335g\240hn\263\351\335W_d\324\023H\266\251j(\347\362&4\322\235\256\271\310;[\313S\225!\267\042\234)Q\265x\014K\233\210.a\042\307\322\336\374\224aD\233\335{o\376\030\037o\313\377\000\207\276'x\007\340\326\256\325\372\226\363\341L\332V-\023Eg\256\251qMo\270\264\2624/J$\363[\314yc\245F\033\243V\014{l;\276\233\360\337\304/mF\321s\273\261\247(\374\250\304aAs\240/_\243\373}x}M\366\344\272\375\236\357\372\312\363\243\343\263\370\301}\260\324\265d\217\025\025}%\016\213\242\267\305\0208\365\304\367\312\352\206\362Wq\015\024u\017\265Ad\365T\270\340uw4\230\207u\323,}R\035\206\001\222\321\267\335{\035\031\212\252\232)\240\236\011!\226!,\017\034\212\313$d)\016\244p\312C\241\3342=k\377\000\330g\320\212\331\205\225&6&S\325\213A\337.u1H\252h)]\\\253\260\373\244\0200W\270\357\333\3763V\266-\240uV\031D\221\310';\227\206\367\365,\221\334\035\330e\262#\343on\335\370=)\270\346F\210\316\035\322\2434\3722\357KPF\371'\233\216\305\271\377\000o\313\345\324\277\024\012\236\300\352\236\305\206Q\033\223\034H\374d\250\344\034w\355\325~\330\356\230i\035\223\245\262\341\3744$5\323l\221\324\024$\015\271\316\006z\002\336I\315|X\240\\\257\255L\216\263y\022\2668da\215\277\261\324\261\267\225\325*Z\012\246\356\222\303%D\204\272nf\310\000\347\333=^i(Z\023W\234\254\002\205~9\311\344~\373\365!\345\034];\323\312\3428P\017\345\344\022H\307\267Js\310\272Y\221\252w\215D\354\350\253\201\354G\357\361\035\001\252eHh)\376\222\340(\225EAdE\355\216\337\237P\004\200T\202\024\312\333\253V4R\270x\325H \257\000\376=!\364\021\232\263\262\363\217\355A\366\361\361\013\354\365\343\005f\213\255\267[o\376\035_,\333\242\253\264\307SU_\244O0AR)\342\215\227\317y\346%\222c\265\232\010J\017,\310G\224\342x\223F\256W\033\021\347\311Z\242\346\305\327\030\177\206g\211\3767io\031\332\307\256\356\236?Y\274#\257\270\326QY\316\272\324\227-J)k\340zv[\177\304\305'\301\303,\213 \215\310\247\204<\322\242\007o,\302<\377\000\001\303\271\265\\\300\322\032\014\\\223\326D\223\362V\003\217\356_M\020^\351O\224\306\177)\213\014.pI\372\216\275Y\303\277XM\355B\234\321\\\376)@t\022\344\036:\250\352wN\316\015\323]\317HS^\204\2225+\254\247\377\000\342+z\224\347\330\376]H\035P\270\231 *\033W\351}E\247&V\222H\036\201\330\371r\377\000\230\237`\303\260=\376\234q\321\006\202%K\234B\247n\332\272\347`Wdd\271\342@\003S\375\365'\220\012w\307\004d~\235Xm\034\341)\316\213+\257\302\237\022F\247\3236\255I\032\313MKW\020\235b\227\211#\004\221\352\003\201\310#\271\355\326v\042\206W\026\356\023\250\325\005\262\256\321y\242\256\204:\272\261\307\263\016\252\246\215\025\037\343\025\313O\325\330*i\357t4\227\033k\344:\272\344\014\036y\034\203\355\3063\325\2341p2\324\017h\\\257\253\265U\006\242\235\254\211`\222Y\014\253\020\201\342\333\270\363\367C`\014.\343\2161\2228\350\353\323q\022.\205\217\012\266\325\337gZ\251\014SS\331j\255R1\004TRI\273r\202s\275p\003\241\340\220FF\1773J\215J\264\314\033\205q\355c\264Q\033=\203W\370Y\024\317=5E\256\3375SU\227\037\372e\221\360\277\312n\341N\000\012O\005\210\036\33179\316\027K\200.\275\001\360\203W\325\326G\024\025\325\0218\362\376\353}\360s\301\007'\217\352:I;\251S\357\032\276\320>\016\375\231|8\276x\361\343\216\275\322^\035xsc0\313Uq\273\327\305G\004\263\026\036U4rH@z\211H\333\034K\226c\330`\022\004<\224.\201u\361\203\343\267\377\000\345G\245|%\320\032_\302_\261\177\200Qx\241q\267\324V5\307X\370\220\365\024T5\220Ir\253\250\362\350\255T\223-Ii#\236#\347\3174^[\027QL\333C\035*8rH.T\231\\e\365\372\257\230O\266/\370\214}\244~\333\372\233PW\370\301\250lv]\027[u\232\355\006\224\323\264\177\003h\240\221\376\342\010\311i'\021\341\202\274\357#\203$\247>\263\213\262@\027\230P]\272\340\351\252\211\212\023\264\027\014\301\260\274\223\236\344\236\241\306\367)yF\240\246\246<\310Y9\340r;\364\031\212\351J\326(\225\346\370\304\250!G\244&9l\003\311\371s\320\007\015PI\331(\202\327]P\216\321ST\220@u\312\034\262\236\344\023\334q\355\363\357\325j\270\2466\305C\352\015J\225Y4\035\376\361\347Km\264OsX[\324Y\343\2068\261\317\257{\002=\271>\236y=gb8\2256\210\230\225\004\310\220S\305\326\302\250\337\304jkl\326\332y\031\215@YA\304\237\375AL\250'\004\216\343\035V\243\212q\356\200I@3\021mT\032\345Qf\210L(\344J\267\371\256\342I\356NYFG8\366\344|\272\321\247M\372\271Xk\010\262l\205g\272\274\301)\245fs\351e\001cS\365\343\236\375^\247D\224m\356\213'jzW\262\246\3574M[\316\010Q\210\207\271\307ry\357\325\332,\014\223\252\007\0316Hjjb\220,mPRC\3130'$\376>\375\317K}F\223{\042\015\213\025\333\272j\225\215\016\245\202\236\341\005}\316\256\2428\326\024v\215\246\362\0122\243\034\200\030\264l\333rIP9Rz\371\036?\022C\301\210\000}VI\256X\363\335\201\357\356\2727\304J\335\023q\242\323\266}5O`\023\275/\304I\025;A\004\202\250S\262\377\000\352\\\210\330\207\331\264\355\031\307'h=gp\374]f\011\2519}\335:\275g\027\013\332\336\354\252\330\350.v;5\312\266T\274Z\256T\301^1,\312)\302\371j\256b\310\033\235C\227\0330N\016\322\307\203b\226)\265+\001b\017\260\224(\313\211\0012\351\273=CV\322\327\2745\021\323\304\263[\323\371h\254%iU\201&2\031\3021,7\025\311/\303\023\305\256'\212\021\331\003\274\373\361K\304\227~\326\251Xo\374\263MWT\333\344cq\336\265\010\201Wj\262>\340\001*9>\243\352\001\211\300\373\333z\247E\306\225b\327~\335\023(\367j\006\203`\227\331+\352-\372\306\246jX\252\250\345\247\255Q\034\360I\345<\022\002\214\217\036\302\011`\304a\271\3018;r:\275\372\242\314\256\006\376\367F*\020d\035B\220\315\343\326\274:\263\\x\303\253/z\216\373\255\253\253f\274\334\247\271W=d\265\315Vs;T\324>\032R\315\034,\377\000\377\000 \345\261\223\271\207\305U8\254\314t\314\373\376Q\001\336\217~\213\326\017\261\217\370\320x\315\341o\332{\301?\020\276\321\272\313Y\353\277\010m:j\015\015S@\001\231\242\263\206z\263S\024M\217\376CIO@\234\025\314tt\252HX\263\327\241\300|@YQ\245\307\272=\225f\245&\271\204{\220\272w\3749\277\305\333\304\303\366\256\321U\2760j;\273\350\027\323\226\233]\266\202\353|\220\321[)\350g\226Y\374\311e}\262T\230\353\356\3625]C\227i\030n`\213\030C\300\361\254\365\247h\376\220\012`\207\003h\367+\327\037\360\215\377\000\031\037\263\336\260\360\226\267\301\317\037\274B\217\303\315A\247\322\212\203D\301SAW]-\346\327\006\237\243\254\2552\324G\033\226\253Z\331k\320G+ov1\306\205\317\002\345\036\042\300H\026\376U\227\006\270f%{\311\340\257\213>\023\375\2434]\273^\370]~\212\365k\257\264\331\356\263R\264{j\355\313q\267Cp\245\216\241F@\221\251\352\242r\021\230\003\275s\271\030\015*X\274\3008j\224\3548\026\032*\017\3559\342T^\030xE\2555W\207\327\3553~\361\013\340\214\272j\215\352!h\256\265+;\304\042\211p\306\253\371\260\311\014\220\301\276q\316\325\335\264\364\274w\022,\247\231\206\352\253\231\006!y\333\241\377\000\305\023\354\271\343F\237\267TC\254!\323\032\334F\015\303O\371SOQK[\207&\222\025\013\346J\330\211\210\302\343\012\354J\252\226\350\270g\304\370j\314\227\230v\341W{\240\256\277\271]kYY\022\250\262\3400\011\225\310\356\0178<\344|\273\216\275c`\011\010\034\323\027Q\310\352'\251\221\022B|\262{\347\337\367\355\327\032\227!L\022.\245t\361\242*\222\352N>],\270\356\232\006\301<F\200)b@\003\333\035\277\177\351\322\363\005%\247T\353B\2233\362\000\317\271\343\037\353\322\363Y\031\021u\042JD\230\010\245\332\2039\030Q\317R\037\262Pi)\222\345KQC$\302\230\263\300\3708C\214\037\303\345\325\201P\021u\004r^\\}\277\274P\360\356\331\246\257^\037\327=\233N\3520\264\367\213\345\326\375\244\357\025\366xi\214\022GN\262\311A\036\352\312\242\242e\206\221\013\261\221\2242\355'\036K\342W\2642\332\363\042B\261B\214\031r\363\027\374??\304\023GxC\342%\323K\3314F\267\255\3207]\346\202:Z\252\032Z\235'K\005\272\021R-t\211\022Sn\220\001$\351#\250EX\335\244r\262\027\371\347\303?\033T5]L\322.f\344\015:\371\221q\371O}\042\005\312\372[\3734\375\244\264o\332o\303\013?\213\032\006\227TQZef\206zK\305 \206jIP)$H\205\240\250\201\225\222D\251\201\336\031\021\225\225\206v\217\253p\374}<]\036\325\200\266\361\016\020}\022\301pq\225\330ZkVy3C\015d\255L\275\203g\201\307s\364\351x\254!\214\315\272\265J\240\005t\245\206\242\012\270A\247\251\206\253\013\222\312s\355\337\254\032\244\202\2574$\372\257H\331\265}\262Ku\336\237\343)\230\206e\334\310w\016A\014\244\020G\007#\256mB\012\2229/0<H\321\325\376\012jke.\252\324\021\352]!q\226H\255\227*\220\260U\323N\243{APP\204`QX\244\252\253\3670\313\222\011\331\242\354\315.m\210T\237\335t\035\325\257\243lV*M=-\303J\264\277\007\273\002<n`O'\007\216=Y\307T\252\270\270\311N\2466N\221\352\226\247z\252uy\250PG\367\330\022\205\263\214g\237\247\327\252\257\2465(\303\201I!\222\276\347H\324\267\177\204Z\267'\031\033\321\275\303a\200\347#\372u\026\320.\272\211Z\264\003C\255\253uUE-\252\255\\\371\235\210m\340\0147\276N\024\003\355\300>\335Zs\310e\222\203Nk\256\321\263\321[\2566\332y\332\2369)\210\030$q\316\001\034\375H\030\372\201\356:\243\332\031O\003\232\203\370\205\341$Z\312\236{e,4\225tU\205#j6\364\027ue\303)^A\004\241<\034\015\244\367\352;E%\245x\357A\366\332\373?\351_\263\247\212\037k]\011\254*\365\326\203\260Q\335\345JI\240j\032\212\231ikf\240Q\345\316\310\302\236j\252f\011?\013*+l\314\203\313\020\352y\264\\\307\216z/\202/\361>\377\000\025\377\000\033\277\304\313\304\255=\2545\375\276\323\240|;\262Z\226\217Jh\233=\306\256\246\203O\264\254\355=T\262L@\250\270L\031RJ\235\211\210\322(UU#;\255Q\303\206\234\312\265W\227\333`\274\232\225\244\231\310R\244\221\236\017\351\337\253D\302Nr.\234k\364\325\326\232\005\255\225bjS\030\224\310\262\016\374\002\270\357\234\260\366\307\327\252\254\306\260\356\205\225\201\323T]\252\301[|\226\246\032WS\345(v\334{\237\226\007\277\035\276\207\245b\270\203i\211;\25656\205\323\266\275\031\241\3524u\005$3\333\3547\350$h\253\245\226\006\2535\321\230\323yV\000\267\245\327*\002\340d\340\217o\020x\256!\270\2037i\323\242\246\372\2072\213A\242\255\377\000\303\347\236\212\321Cw\216\014\257\237\035#\266\314\256F\342\307\324~d\022FGn:\2701\265\\\357\335\010\232I:\244\310R\216\226\241\240\265Z'\244\227\020D\250\255\205l`\207iy\004\356?\212\257\031\350\\\314\306\346\352M8\004\250^\251\325\265q5\023IIcZ\270\274\304\245h\203<\261\306\307$\356e\036\203\316;\340\3620y\352\376\007\002\010:\302u\026\270n\252\212\272\351\353g\363\252d\004\026,B\014 brx\034{\347\255\246Q\015\020\025\250\346\212\210\321\301\374\367\232I\\\036\025r6\364\366\223\232\012\222\013\264R\233u\325*c\2268\221\274\320>\340\\\002;\361\203\214\376\371\352\3757\022-\252^R&tI%\216\245\230\3110`C\022q\301^\211\300E\224\203)\262h\036Fr\024\002\177\001\223\370\374\272\253[-\2452\011\272\355_\015\344K\375\026\333|\226\330\0054\351\021Y\252\226\027\250U\221<\311\042W,\247f\334\354R\204\2068\004v\371G\035{i8\346\032\203\326\373\002\274\326-\307<x\374\377\000\225\320z\267KA_T\267\213\015\357x\252\240\362\245\247\257\247\363\266\310\001\334\3601\225\235\203\025\377\000\326\273G\230\257\357\221\327\232\341\334S0m\002/?}\375\350\244\022\346@\365\367\356\022\255\035B\276(PPi\252}^\326\007\255Ii`\224\241\251\370$\221\011eX\243\365:\270\0001\373\301I\014C\021\233\235\263p@\325sf6\347\252\277\200\315\336i7\376\024\026[6\241\322\211t\323\372\256\202\025\273\333\352TOSJ\306HjP\310A\221J\251\001\010\021\225\031\016\273y\001\227\006\375G2\263\203\350\231\004Y\042\240\042\246Y\327d\212\306\341\356S\335j.Q\23262A\346J\356\255\026\340H\313\243\030\312\022=\207<\236\374\222\304\223`\005\375\374\320\346\021\015H\015M%\277PEx \307\005U\022\324\026\206\235\321\246\225X\203#\006'\327\265\025C\020\277\344Ps\325\307\261\317`i\032YXqioP\245\242\313n\273[\257\226\257\202\245\232\206\341H\363\264,\3711\226\311a\0309d\332\312\254\025p\243i\33221\325\026\343\335N\243j\015E\264\362QD\027\034\300h\205\250\355U\027\275=\245\352m\023Q\232\250\235\226*w\033\236\241@f\333\020\007\226>c1P0\307n;c\246\360\372\341\265^\307\013sV(T\015qk\212l\216\266\266\216\256\024\024e\251\027\022\305$\216#2\253\007dR\013\002\331\330{\343\234\236\0008\276\314\271!\247\334\302[Y\231\320=\354\225X\365\005U\236\277T\035\035Wt\266F\313\034\363\010\344\334eY\212OS\032\261$\200\303'\031\340e~\353\001\327W\30484g:\217\3518<\306]5\374/E\274\002\377\000\020\377\000\264\177\331\263Ex\215\341?\205\032\256\266\335\244u\035\023\264\364\320\334\036\232jy<\250a\015L\361\377\000\3530\307\024\312\210\000\003\342\335\362\330]\272\230.<i\341\341\327P\352\340y+\302\237\374]~\321\032S\300\257\005\274\005\245\240\3207\017\015\364^\216\242\322,\272\232\314\2679\247\236\012\352\231\205\306\233\317\234\371\025M\024\324\361y\273\012\230\340\341cS\325'|GV\250\024\251\201\327\363\351>h\015N\320\335\252Iq\373Dh\232\2157\2455\015\303L\350\357\374\272\357\255*\244\323Z\202\033e\036\234\222\013f<\331\322\241\340\201\236\012\042\042\210\037\376D\223\311\347\306]\012\356Qs\027\214\246)\000Gx\237\003\357\317\242\253V\243\263w\042\337\225\352\217\330\317\374Am\027K\037\212\272\017\305{\364\242\357\244\354I\251\277\210=\305j\350i\255q|\015+\303\361\205C<\255U\\d\354U#\332\247n\000>\317\341?\211\331\212/\243R\001`\237->\250\034\307m\254\302\365z\337\253-\027t\251\232\311v\261\336b\212cO$\364UQ\324D\262\200\247ix\331\206\355\256\215\214\366u=\210\353\333\207\202,}\302Pv\244j\246\324\025\354\243\371\2042\344\000@\343?\217\344\177C\322\335\003Ee\262T\332\325R\223zN\320x\036\243\310\375\377\000\257Ks\256\234\0075+I\304`\023&\300\006?d\376\235&W\026\242WQ\307FXy\212Wv9\347'\366:76PvcB\225T\337\255\323\303\024\214\376S\014\036\374\362@\034\374\363\201\217\257\\C\200\272\222H\013\307\357\361@\326\036\036\337|*\254\320Z\233Z\335\264\275L\265T\027\030\336+d\365\013ML*U$\253G\215\220\034;\244,\316\330E\363\021P\3112I\037\231\370\233\007O\021K\262\250a6\213\344\302\361\227\354U\340F\211\361\267]x\247\340\227\207Rj\313\345L\223Y\2524u\366\325|\370\213MU\276u\362+\232\355n\200\322WT\320\306\361\325#\374*\311\037\231\004Q\311\260Le_\025\3008-*U\334)\223<\364\265\365\023\2775e\355 \203\013\327\255\031\342\317\212_fo\264\265\213\354\371\366\235\373A\337\374G\322\026\212T\274\351\270\356sS\333*\3575(\214)\252.\323\314\305\313\342\031\344U\022\262\3466U\217\010\013z|?\022\0241\035\215g[o\347\337E^\244\223\021u\356u\227Zi\353\375\276\013\245\222\375\247\365\035\261\224\025\254\266\326\305U\004\300\250 \253\304H \202\010>\340\203\357\327\266k\332\341 \331,:\012\272t\006\274\370j\343\002\270\250\246|\042\242px?\363\326V7\015\042B\273B\260\002\353\247\026\270U\322-U2I\024\252\010 \236\006z\303}0\014\005t\205G\370\325\3414\336,\350\233\205\212\242X \220\272TSK\042\222\261O\031\312\026\367\333\234g\036\337\247V\260\325\2053d\025\030\\!p5\207\305:\357\013\250`\323Z\366aAZ\362\311\023\324J\331Vu\220\241\363\010\341{\023\273\260\030\311\371\266\275,\316\314\335\222\030K[\336\264\255i\257\265\007\204\232\207I\331\365\375\213T\331.\372f\365O\025e\005t[\222:\310\237\3560W\001\2018\306\031A\310\355\322\233\206q\320&\012\355\213*\267H}\255\264\017\210\236.\352o\012,w_\203\276[m\024\367dw\252\2123Z\036Y\026Zxa$H\357\002\254\023;*\262\210\352P\344ma\324\266\224\034\245\000\256\013\272\253\243^\375\2424\227\201\376\035\353O\025\265\334\325\365ZKO\332\352n\327#I\027\2337\303\302\233\330F\234ns\300\013\306I\035\272Mr\032\011%q\255\0277\\\205\366\256\373\\xO\3427\214\376\032\370Y\242\365\375\004\206=?\251\364\364\2405CSU^\343\270i\232\323l4\350\240\274\337\013\262u\220\225V\010QdF\005\272U*\200\031&w\362\270F\347\207\000\007\276\213\347\213\374b\277\304k\307\367\377\000\030\033\226\255\270^u\277\206\236\030x\017\252\247\322zn\313n\233\370-\302\272\337S\000\216\365U\014\323\253\371\262\3273\021\024\245\014oL \021\243\025l\324f5\215\177dD\222\017\360\253\326{\215hn\201|\361\370\253\366\244\326\236)Y/\036\006\350\277\021\265\322x\035S\250.\032\205\254R\327\004\245\270K4\246\252\236\222X#TY\243\025)\347\004+\345,\3234\212\210[wD\314Gf\320\352\232\245R\315.\233{\367+\224lZ\032\341S{\242}Oc\274E`\363b\222\2428Y\022U\212RHm\271\310^\312H\345\011\\\216@\352\276;\214\261\264\317b{\337t\303Ps\331>\326xWo\257\272\316\361\336\245\265[\247\313RG%>\347\300\000m\221\201\333\222Fp\271\3118\035\261\325!\307]\222\042\352\273\036\343\335\002T\343OY\356\326X \226\226\012J\302\206X\344\201\351Q\225\375\007*$r[\322F7\216}\2601\306\036#\026\036\353\331@\244A\272&Ke\357Q\213\202W\334\255R\272RK\032\244\264r%W\014?\3142\256\330\003\0078b9\300$\364\037\254e7hf|\225\212ni\220\353\024\276\333n\247\222[\032IC\2464E<\324\355\013T\312\012\255S4\216\361\023\036\354\306\333\243\332I$\200xlv\245W\020\3437.\336\006\332\0174\200\362\363\035Tr\343r\240\217\341\336)kd\250HN\026\216/6\042\205\262\273\230z@<\257\004`\201\363\352\325\012nv\243}\320\261\202L\354\242\367\233\315\312k%\312\246:[\325<\250\215\022\237T)\011\015\223\201\346d\225<\3559#\003\2761\326\306\012\203\005P\034U\206S\357F\313\236\244wpez\227\224\344\006\334I\333\216\007>\375z\234\260\336\352\271hE(\221\324\272\2432\223\3169\350\032\340\017U%\274\226,\023\316\376ZF\331\007\036\241\200:1}\020\211\012sm\247\216\226\014\242B\030\203\237^O\327\361\355\375z\322\240\301\373BS\334H\224\222H\310\224a\235\262@\301$\347\375O\177\353\327\027\000'@\2477D\205'-(p\240(\310!Ns\377\000\035V\220\355T\231\005z\011i\212\345[i\265\335\355\232.\342e\212$\240\234\275P\200<\240\2619PG\225&T2\220\276cn$\261\007\007\3428\226\313\2157T\220\014\351:\365\373J\310\255@I\237\242\261\364f\254\200\317\360p\317S,\265P\252\244\250\250\321K\275[\012\031\200\363\025\260\333[`a\214z\200\007\254\034g\012\253I\301\361\241\366}\225\3250\3447Mz\363L6[\356\234\216\376\326\353f\243\2752\321H\324\353\266\250\2641\345\210\022A\042\030\366\236\000\340\344\020\024s\216\275\026+\005\\\321\002\243A\233\350\242\245\027\264\020,\237)\265\265\036\355F*V\365\250f\226IfHnM+\374L\201\324\221$\354\021\273\251\303\343\201\264l=\332\256#\207\324\355\233\035\321\322,\241\224\232\300*\020\224h\367\360\226\272mQA\251\255\222QRU\300\2254\324\261T\232\201\013\347s\004\204\005\362\343;\244*1\271L19#\3151\245\234S+\347c\251;\306\311\324@\330H\372.`\327\372\203NX/54v\221z\253\202R\260G\015bB#\2161\352\005\246\214\250~FXyk\2001\222G^\337\013\200s\351K\204z\250k\034\340\007%ni\015On\255\025\025>CyqK:LC\356\231\207\224\215\214\005f8\347#i#h\306\006G^K\027\204s\035\007\247\2774\272, \345\376\256\244\026YR\012kut\254\225tT\214\317(\000\027Zv\312\253HN\335\355\214/`2\006{g\245\271\304\310m\211\372\253\270\212\005\216%\267\321,\254\206\305p\322\325\261\321\324\322\245\0146\310\344eH\3023\030\313\341\335\236\\\254\2029DF2\307\004\020\331+\267\245`\261/ep\3025>\366\27749\313_a\311Gt\345\032Y5\014\254\220\325VZ'\247H\344h\201\002`)\314\\\361\215\316\2065\306rx\306rq\247\212\312\366\007\316\207\357\366AY\371\234A\3319\323\335j_Q\337i\3563\327\313c\265<\224\317,1\2228\2050\323\250\344\266\0349+\202\002\340\203\200J8\206V\321\002\237\356tD\371\350\227R\006\273\251\315\332+\314\025\261\177\005\323UW\007\023\232\232Yf\215Y*c\332\250\336\266\306\365\344?\271+\3163\200<\335:\324\203\263V|\015\341(V`\031\212m\324\272\376Y\247\360\363L\352[\014\220\323Z-\245-\264\263\244\352m\246\246\242I\3441:(2o\222C( \2619\036\240\017[|A\317\251H:\235Y\003M7:+5\214\030\006\352y\245<H\250\266V\\\264\365\206H\332\317v\264\245\256\263\312\222^!\226\272\236BJ\206\031\220IM\023a\367\0002q\270#\213\034\037\023S\010\307\326?\271\300\213\370\202\224\307\033O5\334?f\357\361\036\327\037gS\252f\205*\3573^\255\3254\322RG\012\024\206\246\032I\342\243\235#`\024ys\315Lq\316\022\031F\033~:\367\2343\215;\016\332\231\267\374)\251H\\\256\355\320\337\342\223\250g\324\237g\015a~\273\\\340\266\351\275\015t\244\325\024\025\005\210\325U\316\264\233\331\374\267b\354A\245zy\031C,\261N3\261\333\026xw\304\375\243i\275\346\014\031\035t\\\032\322m\252\364\323\304O\361/\360\337\303\237\010\374-\361z\315\035\026\273\267]k\222\232\365\005\276\341M\037\360\211\243J\027\252\242\224L\3132\325\042] u1\243\343a\336\247v\316\275\036+\2145\214\355\005\302'4\264\334$?h\277\361+\360\326\177\0064\235\307\354\361\342e\302\253^\352\207\266UZ\266R\032\031\351-\362\317(w\235\253!?\017+|.\325M\205\331j\042,\025%\352\275~.\3077\376\263p\204<h\275\032\261k\013^\265\264X\365\225\215\344\222\307r\243\212\345O\224(R)\020>\322\204\002\254\234\251R\006\031Xc\216\267\031\\9\271\271\243$\256,\361\343\355\331\340>\234\276\370\231\340\274\232\312\347I\342\005\233\342(+\304\232Z\353YC\034\220\371_\023\344\324\321\256\013\323\264\320\207r\361\244R\025\3130\036\257%\305~)\240\314\364\316`[\251\312H\323\247\210BH\215W\314O\333O\355Y\366\231\361GP\037\012o\237h{\177\213\036\025\324\333\253\255\365\365\026\227\267\245\252\355\033>\346\246\226\272\225#\250\236\020\201\2444\362\312d\001\010p\217\2725\361\034k\216U\246\007iW1\351\037?\347\352\257\341\231h\002\352\214\254\361{\355\031\255\365\014\336\013X/\226M\021Ys\323V\333<\326\352\333,\224uz\212\202\212\265\347\242\211\351\304&X\321|\262B\323\254{\243\2162\003\222|\313\014\306Wpk*~\347[\303\220\224U\200\002J\367\373\354m\376\036\223j\235+\250\356\3366\325\015G\250\351.2\\n\372\334\352\251\332\266\236DH\363\015U-L&tEH\226\240+\316\253\031\335\274\357\215\242_O\201\340\024\234\331v\234\377\000\224\207k<\327\272\332\042\337`\320\226\213g\206\232v{t\017e\240\247Yi\367D\225B&y\025g\232$\306\3371\342\237\004(M\312\352\241@U\036\357\016\3264\012m\274*\345\247\311Z6\233\305T\225\364\263PTK\004\252\331\\{\177\337F\360\010\204mz\357\017\013u\314\227\010M\266\363WO\035I\301\005\260\241\307\034d\236\377\000N\274\3563\013\224\2075ha\352\227\016\366\252\355\251\324\032b\033t\365\0257*$\205Q\203\341\3018\003\234\177C\236\251v.&\002\260\\\000^B\375\263|\026\360wVxo\343\036\274\233\304\255C\247i\251\254\365\367E\216\246\242\010h\015H\211\266\304e#x\016\335\224d\361\306@8\322~%\324Y\016\001Q\253M\265\015\227\306\006\267\361\317WZ<>\360KC\305\342e \321\325\324vk\244U\262\326G\034\326\212w\254\215d\216\275P\267\225\266\005\334\0036\346\210\254\230O5GH\300|a\207eV\322slw\231\323\362\260ka\252~\331\367\357\356\241\243\355-U\366g\361\337\\\353\3337\211zS\305+\345\0054/m\270\321KI[Ov\234UbX\335UY\351\243\362#\226%`\3513)V,Q\200\\\216-\307\030\334S\273\000`\213\177*\333)85\271\210\225Zx\265\376+~1\370\205\340\215\343\300\353\365\307\303\375_\016\245\256K\256\243\2718qY,\242T\220%<Q0\216%\006(S\014\016\022\020\252\243q'\314b\370\216\042\255\023I\302:\253=\244\202\331^xj\337\0325\335>\260{\226\215\324\232\222\321WL\355WCs\266\326|8\330 UQ\346\241GVP\362\372\224\206!\230\036\335V\341\365\013i\202\363sb\271\325,\3206U\245\317Y^\265\205\306\226\373|\274\335\365>\240z\261w{\225\336\276Yg\376!\275\223y\252wi\270\363\003(|\222Kg9\351\265+<\022f\346\335a\001y\000\233\3352\263\334,u\324\355f\202\010ayXHi\002\3074/\271A\033H\334b\333\337#\030\035\206\0015\232\376\331\262\363tN \234\322\243w\235K\015\226\242\256\235\251*\322\030\243TF\010\345$\363\000fDb\010\004\002\207n\356\347\360=X\245\202\316\334\340\334\247\0148\027\005>Q^m\354*\353b\244\271E*\200\351$\220\261Og\345FHu,\273@\035\217<\000:C\250\272\315\224\025\033\0153\250Z\266\333\356\272\212\242z[ex\225Y\210\247Ha3\3054\214X\270;F\042\363\016\335\231\004n\000\035\273\211\006\367Sc{\372\247\320\246\342\320N\2507\257\343\366\233\205\342\335-:|\025-9\226\232I\014\205\346UDrr8bb\235\011\000\3451\202\000Q\320\266\235'\303\201\326>k\273\003\233\311F\357\276#\324S\307Kn\253\247\376\026\202\216%\252@#\250\212\252D!\303\015\331n\031\344\332s\221\277\277\336\035X\303p\233\313n|\302\036\313K\356\251k\276\270\272\327H\251A$\226\332(\321\341H\303\357;\033\357d\234\220\033\217Np\000\035oP\341\264\330;\302Jm:-\032\005\013\251\256\253\252\014\325\023\313U\226\334\312\355\334\375Gc\333\255\006S\000\330Bqd\031\224@(Y\204\253\042/\336!q\201\372\366\0358\270(\002R\332z\222d\225\274\351\022\005\301\011\260e\276C\350O\317\256ii7\\@\313\034\323\305\0105\274\255;\323D\030\214\006\3131\371\016;\365e\231u)A\267\202\235g\363\042E_)\243\0079\014\010\013\364\366\377\000~\255\012\240\216\352\341\255\323\216\221\202\242\243RX\314p\327\311\024u\260\2734Py\276Y\336\030dp\274\343\214\221\362\353\023\215cCh\270M\341-\372N\210\355m\244o\032f\360\346\343nJ:*\331%\232\224\243\243+\000\307r\200\000\332W\261\004g\202y\357\3228?\023\245\211d\322t\306\250\333Q\257\357\002\275\302\373R\350/\005l\362Ri\355/\241\304\032\252\276t\254\226\246\216Y\315\013\217$\007\251\246i\342\211\042\243\025\006e\012\306m\353NA(\025:\371+\035\330\274\2647\320\315\340h\223X\304\300T\366\207\360\356\321\255,\227\273\225\276\267LX/\236{-\206\331[M,\215t\266\244'\315\237\342\340\206H\320\243o\033\211\330T\240m\244\263\014\372X\\\365Gf\362H\271\004\372\252.\303\310\020o%q\355\342\301GE\246\357\232\252\331j\232\246\010\232\232\347p\245\272\263`\267\233\0034\015QN\001]\345\325v\207R\244\367\001\362~\201\303q\257s\373:\220L\030#\300\354\265)\260\266\230\221!Y\226\333\205&\261\325\327\032\353\037\206\311\247\254\225\225\023\326S\351\373-\302\250GK\023\271\002\012y\352\314\323N\213\202\001b\316\02398@z\310\342\365\005.\374\200z\245\206_\336\372)\0356\255\242\320\027=Qo\3224\226\252:A\024\326\352\251.(k\331i\333z\371m#\253\252\000$h\313\242\345\235\003\006]\330\351/c\352\015\373\334\276\336*\263\352\226\274\265\202\305Uz\337M\370{\256f\243\277My\321\366!\021U\226;*\023\222\356B\311*\311!.\340\360I\303z\271\015\200:\327\300\361lM\026\232.a1\317xAR\263\301%\255\3253\0358\3723LB\365rZ\225\246\257\222\337g\272A\223\025\304!\345*$'1\026\0229\007n\3261\221\237~\232\367v\3165\006\232\221\310\377\000\011\224)\223\007IV\275\034\326\263`\266\334e\246H\331\251\376\036Z\350g\363\213\217\362\302\321\357;\030:\276\331\024`\235\300\223\260u\346j<\264\345\352}\376S\213%\332\334\243\364\2455\226\351b\325\232[[C\250\251\036ZCI5\035\276\032W\271\305;m\020ysn\2169\271\042M\314IV\211q\225|\2420\330\2063\026\332\304\330^o\007\235\265\026\365\262\012BHq\277%.\252\360\277Ui\331j.\325\366\235io\244\266B\322\031\356\026\351\254\225PR\304#Xjki$\302\301\005@\251Y\003\3034\211!A\261\216@\352\307\020\304\266M\032w\314$o\255\355\034\274\021>\223\331\242\015\026\247i\251j\255)\247\353d\256h\222\252\013\270\271\374'\302C\012\343\371~|fJ\226f\007\012\234\2342\250\003=dRe6\274\032\256\221\244k\345m\020~\241\256lT\022B\243\356\224\366\023i\252\271K]y\274\336mv\365\222J*\005\230S\326\026u\036`\2316\035\256\314X\0142\202\233T\221\214\357Q\244C\362\345\001\207s\026\266\232\237}Q5\220\370\007\272wW%\227Rj\225\276S\331\357\025\321\324Yw\311,1\326[\252)\204\353\270\252\355\363\0240\004\200\334\344\225\300_\273\317\216\3438\014-6\272\255\011\022v3\362Uk\325\246\327i~i\326\315\2455\005\307[\311s\216\266[\361\2027\257\212\236\027\222\256\261 \216]\336QEEfTR\270'\015\2649\301\010\335n7\210\262\246\034Q\246\333\304\035\201\265\317\212\261\031\200h\027\337\337\242\246\351\245\247\236\272\373o\267\325\307Sp\216z\250\210\2032KN\253,\262,\236X\031\333\264;r\002\341\003\023\264\365\357*f\250\300c\221\365\000)\305\322qd\363R\012}[YOt\376!-\342\232\361l\222\232\020\022=\222D\222\347o\362\331\037\322=!\201\012Wq|\023\203\212\037\247\000\014\242\010?%N\223\011\035Sd\332\253P\333,V\375;Y\025\302\337\013OQ1g\244R\323,\362\011dr\354\010 \371H\244\000\030\340\202N051\031\234\011n\237\322sZK\274\002\264\377\000\375T\226\222\216\2068\252\251h/\326\352h\251\341\221%\216#\266\006S\277\313\332\032Va\022\256\342\217&\0008!K\214\212=\253A\265\210U\205\0275\307\221^\251\375\232\377\000\304\353\305\177\004\274&\360\363\303\333M\305/\326+\013W\320\331\342\230\251\221\250*\016\370\341\231\345\030hi\036Id\214\023\270\226\000\222\252\007Zx\037\211\237N\206J\206KtW\373F\345\211\357\020\242\376!\377\000\210\357\210\232\216\357\003i\255c\177\320\227\004\025\364\025s\333\356\023K\377\000\222\323T\327\275q\246\255!\341gE\362\351\325\222&\2171\247\252L\260n\263q?\031\275\317\232,\237T\326\227]\260\274\354\275\\\265>\241K}e\346z\352\355OE\247\347\262\321IYh\203\310\216\337\033\201\034t\360G\266\030\010,\303j\226\220\356\313\226\013\271\274\227\023\306T\251T:\2744H6\3507\360\360\352\226K\332ob%X\364\372j\223I\353\235's\247\327\032\212\246\212\276\337\025\302\367-\204<5\326\232\321\344\025\226\242Y]^V(%\362\231\\\210\202D\205\020\200\026\367\021\375\033\234\332\225j\3476\364\3446\272x\020\350\324\256\327\256\361:\315\244\364N\204\320^\010x\256+\264\006\242\325\306\236\367\3748\\)\036\246\212J?&\232\252\361g\003\313\177-k\252\013H\273\326Y\0207\251\202\221\245\204\342m\025\005:Ub\015\3671\032r\364\373*\205\315\273Z\275y\373\001\375\246\340\361\023\355S\366\263\276k/\021\351m\336\037T\351\2759\026\232\257\325\267\010\255\311\035\272\222FJqO%D\2468`t\253\222c\017\232Y\2112\000\340\022\277O\340\334Hv\217mGXDO\202\226\202\343\005z\315\240\274s\360\337\304[-&\242\360\323Y\3315=\257\370\223\332\014\261\313\202kV\224\326|>\01679\244\006\251B\026\017\017\363\001*\033\036\232\227\020\246\361-(Ko\001\\\332\177\305\2355]O,\264\372\307N\314`\256\244\266T\223p\215E\015eDi-==C\023\210ft\2326\011!S\207\\\375\341\2208\232Yfl\021\212N\027+\307\337\361E\377\000\025\255\037\341o\205\237fx\274\020\361\006\203W\335u\036\274\323\232\276\363-\004\315\035M.\222\267\\\215[\003\034\201\031~:\252\335\360\352\247\014b\202rWl\200\365\347\270\207\033\245L\200\313\246\007\220%\313\311\217\266?\370\332_~\321>\027Z\264\337\205\036\026k=/\252\310\270\320\334%\0069m\253k\251\247\244Y\3364\015\347\212\227\226\222D\021\276R:y\330\023#d\365\347\370\207\304\215\256\330\234\247D\202\346\216\341^\004\327\353/\021\365\\+\374R\375Gf\264\310\251\030\246\226\0172jX\301e\021\223\205\000\004R0s\367W\201\301\036s\376\212.0\011#\177O\312\002\347:\307\311WR\333\341I\340\213P\\\246u\226U\206\031\274\371\243\212\251\360\344p\200\250\300\033\227'v\326\371\203\324\3421\356\214\364\307\217E-\243\315Njt\375l6{M\342\021\241\351Y\023}$r]\274\3174(\033\340\226EF\215\031_\030- \306\003\035\273\230\014\352x\326\227:\233\211\276\266\376t\216\212\350\3025\254\314]\250\367)\252\331_w\323\325\377\000\302uE\267D\307\250\243\217\342\042\2465\360\311$\306_\\ER\042\0241\3348r\011\003\030\005\200\350\261\030vT\207\323q\312||\375\2054\250\206:M\354\231d\273SWW\301=\322\206\316\260I!\042\010\350`\203\340\216\3371\243T\215U\006\320\313\2200\336\257s\222YV\203\332;\244\237S?t\232\3653\270\346\374&bt\351\274C-\322\216G\252tsOWMXc\025\261`\203\265cb$tV%\211\003\001Nwv\027X\332\205\204\263A\250\364\262*t\310\221\250C\241Z\2535\025L\027=]l\256c(\212\211\245I\242\222\241\216\011\007\000\363\235\233Yr\017\003\216p\272\244T9\251\264\306\351\242\230>\010\021[\356\367\253\305m\005\312[E\034\022<\222\311W5m(\215\002\250-\042\254\207{n\303.\320\274\226\331\202x\3515\252\266\223\003\251\334\362\277\226\321\363\352\201\224\032{\316*\332\321\326\2753\245\315-\356\335]%e\312\2467\254\250xee\2244M\265c\012\236\210\304j\0241\332FY\230\034eG\232\3428\254Uri\221\003H?\235\347eh\271\255\375\246\312\321\212\373h\272CSn\025\327h\252\347\222\236j\212\226ED\255q\353B\312pX\210\301\006B\006q\354Fz\301\307W\3040\346\042lm\312-\365OerI!q/\216\376\035\334mz\226\347\253\251a\265\325i\251\352\342G\212\202\231)\232\235\031\003E\272\025f\303I\022\263o\0343$\215\354q\365\017\204x\375,M\001F\341\355\033\311\235\214\035\340\355\265\222\253\020]!sUN\324\226a\022\311\344\227c\031a\202S'i?\226:\366\246\240\200J\000\3412\244\226\215\017\253/\225\227\033}\272\315X\323\321d\327\261M\251@\001\301i\217\371\024w'\330uW\021\304\250S\000\271\300f\323\257\207\360\243K\025\320\236\010Z\254\366\033\231\271W\330\351\356ut\247&\341QG3\305C#\302\313\3451\001\223c\003\201\2727l\215\312\012\356^\2747\305X\372\257fJ/\211\213\002\0017\332\340\333x\042\332\254\234F)\363\225\251\306?\013\264\234\032\366\276\236JY$\260^ \305\033S\220\361PO,y\362\312\024\211\266\222d\331\205\001@\214d\036\247\377\000\270\361\007\012\332\255\035\366\033\215\310\007Qs\347'\232\321\017$\003\271\365\352\231*d\240\360\377\000\343\3555\324v\352\273\225\005d\355GP\273Vj~P\201\034\321\223\222\244+\205-\307?\375\2607_Q\370\240\036\323\015p\026\362\344U\3745P\333\220\237\322\365\244\274E\323u\313\251im\220\352\310\243\370\212i\241i\242\221\242\363T,r\355WX\313\310\305|\306\033p\331\302zz\315\302~\253\007\210\016c\246\211\324\0307\215\264\236\243\352\250\325\252\\gb\224\370Ud\245\243\247\274|R\\h\005J4S\315\346\315\002\323B\312\240\261\362\311\022lfS\234\022\025\203q\202:\245\361&8\324x,\270\036\177\315\374n\2631 \271\336*\3070Y$\244\227J\353H\346\236\211)\3267\246\226\215\344v\331&3\272@2\025\343\300#\007\014H,\256\000\305\302\324\255F\247iD\353\326\336\236\005gv\025\3518\324e\212\267\374\\\271\336\365\246\262\247\255[\255\312\346\321,qUT\336+\342\232\010\360v\371\353\002\252o 1\310>\251\016\375\333\367\226\353S\033\225\224\300|\305\274\374\326\223\261B\011\324\377\000\010\335/\257\356\332rzz\273a\267R\311\025=\\5T\221SG*8\226\232He\2163\334F\321\271;=\004\031\014\243\005A\036J\211c+\214\216-\023\254uG\210\305S\310\0135\353\310\377\000)\243B\353\013\376\217\320Z\213C\305\242\364\230\266\352*\370\226\266\212\242\001]\023\010r\277\315\211\344;\221L\214\204\202\010\007\030;\272\3648\2361DU\355);\366\201\323\355\270\320)n:\247g\0227\376\021\372^\347MGr\272\325\323\350-\001\247\252j%i\250\346\241\267\260\222\2266UI\205\0424\377\000\310\033W$\042\261 \313\206\001\272\316\342\330\312u\333\001\306\361#i\353\315Tv>\243Gz:\246\375k~\266\335.\365\357u\260\350\261_5;\303%O\233=\007\305\006%I\227\313\231\042vu\001\216W\337\036\374\357\340\036\312T\232\3478\307\276\210*c\252\307p\002\007\277T\327\242-\024\024t\237\370\255\233\303\335?5\302\347U\004\242\252\202\256I\253\333\031\021D\214\256\322\034\277\245\024\016\\\216\370=[\257^\235S\231\217.\351\247\331^\245\212\250\370k\232\042z\253\017Cxg\342g\213\332\037V\337\264\277\201Z\336\371\240l\224\337\307\205u\025\255\331*DrG\021\225s\010y\212=U*\277\220$1\232\204i\025c>cfU\317J\243^]\334u\276\233\373\260Z\325\203\362K\032$.\373\373=}\201\276\321\377\000hj\015\021\341\015eF\202\360\377\000L\325Yu\035\326\331C\251n55\2641U\323T\323\307[k\270W\332)\352\315\216\260*\305R\242\241P4[Z2\316\350F\266\033\005H\027T\355\001\277\217\277\302U6\326\214\256\201\013\312o\0244\247\213\336\023\320\324]u'\206w\275\015\341\325\276\364\264i\251\250\355\365\302\3231yj#\246xj\352#C)\224Z\252f\203\314\333$\321E#\355\344\344\177\340\231Q\3163 \371\333\331U\352\3227suW^\225\325u\024\364\023\351\311\254\267\013\345\014\326\377\000\206\236\226f\250\023Hf\031\211\236\002\042u1\257e\300W\017#\222\255\036O\205\255\301\252\322\304KA&m\340=\177\213\005-\304\220!\303k\335S\260\333\365\012\303=\226\321\255\325\240\2275F\325E\024\262\275\012\313\265\231\243;1\271\324\226\354#e$\015\200g\255\252\324\232]\235\324\214\231\022w\351\370\334uYU\252\202s\021\370\344\224U^t\305%\205\227P\334hB\343\313+\035sJ\316\311\301y\342%|\247*\25668\00466\224\003sU\303\360\254C\252\226\264\236Zi\357\350\237E\257w\355\272{\261I]|t\256w\321\251\031\210KI[S]\346E[O\026\042\363S\322\222(b\214U\235\206\345\012v\340\223\324\361O\207\205\036\353\211\213\351\027\371\375\225,I\210\032\235}\376\027x\375\217!\244\326\332\262\307Gm\263i\312\3359\346\037\342\365SP\037\212\232\223n'JYg\004#\272\277\3370\271\031\311\005F\336\233\360\177\302\0258\207\020\375.x\213\337\220\345{\230GK\214\273\017g7\313\307\311z\323\255tW\206\207\303\235K\026\226\263\336,\325\206\212]\326\372\373\2247K}\307\024\355\000Z\270j)wN\246\002\321\225w+\264\225\012\250\305z\373]\177\361Mj-/f \310\006\361\267\204\302i\370\251\256\230\247\363\376\027\006\336,\232\033\304MU\244t\364>\012xi=\022%%u\273\341,0\320Zi\214\323.\365J:W\215\004i\012F|\267V\005\224\241P\244\257Y8\177\361\256>\254V\247\210%\256\000\314\1776\3529\242w\305\01452\366\177?\341>}\243\274'\373>xs\254\264\326\242\246\373\031}\237\274Ai\250\304m-\212\317\377\000\217\265<\377\000\020\304\201I\024\255LC\200\031\211B\303y@\312\230^\264\361_\343\0162Y\377\000N$\033\356\324\317\376\356\3035\360\372s\347\374+/\303J\377\000\003\376\317\024\027\015n\377\000f\255\037oK\325\266$k\\\021Ku\232\256Yce\222\026\236y\221\340\214y\214\007\226\3418RQ\202\205\353&\247\370\313\215\260f\025\032\342zG\360\254\320\370\237\002\014:\234y\317\331q\177\212\236\025\375\236\254\0216\247o\0155\207\204\265\224\326\350'\236\202\317}\257\255\021FS\314\022O\004\3645\020J\302\0202\3110,q\235\314\033\254\274W\300\270\366\315:\317i;\303L\2179\217\222EN!\206\255\006\2352\017\377\000/\341p\273h\273N\252\361\042[U\203G>\242Yb\022[-\323\273\322\256\012fw\231v\316\313 d}\341\237j\260\222<\023\033l\306\307|;\216\246\000\240\322t$\201>H\252b)\265\2630|B\217\334\264}\327O\325<TTonj\270\245\250\262\205\270\026dG\330\261=:\205;\244<\000\030\2466\224\3349\003\317bj\026\276+7k\333\326Q\266\247v\033\354+\222\333\245\350\355\372:\303\252-\325:\242\305-\332\266\252\230U\264'\312\271>\310@XI\013/\304#\031K\237X\021\310\253\200F\356\274\267\020\257Y\322\005,\316\371\0009'\324\250rK[ut\337<<\252\253\260x}Q\250\257\225\026\212\031\347\232\327l\246\244\245\370\232\331+\021\003:\205F\214\253\020\351\205s\2003\203\270\025\352\367\301\330\032\325\251v\356\032\223\343c\310\362\371\244T\250\310\314\351\315\321PZ\223F\350*[]\3227\326\232\236\363\250#\223\377\000\201k\223JA!YY\003\306jfz\275\261\241\311_10\350\312\011\014\254@\365\365\034\332N\312\366\221\316\351!\264H\016\314}>\250\275\021\342\346\246\360\245#\267]\265W\212\276\022\352\370\037\315\262\307ig\241\254\247\270MH\3026S\033\225dx'\234,\321\026f\216g\012\305X\241M'\325\245T\324\246\342Y\023ch\346\257=\215\203N/\357\362\272ON\375\241?\304\016}\001\257\274,\323\032\262\343\242\374<\326\013\014\227\353\232\320[\250\256w\350cX\2224\250\272\324\250\270\253\205\211T2\201.\305 \273\005\000\016#\343\372t\251\032y\301v\343S\343k|\3230\374;\024\360\013F\274\325\003S\366e\273KS[t\325\372\243LPQL\361\230\353\355\345\352\352i\300\001\274\331\245\252\2368\273.\334\015\343\220prG^y\377\000\031\012\215\006\233K\216\340\230\034\266\222\257\322\340yH\025\035\357\316\021\232\277\303\375\017\247\251\254Z~\307\255ij*o\257,\024W{\322\231\242\226d\215\277\227\014\024\376R\007p\371\303\310F@\034v!\3011\370\212\2175jS9Zto\216\344\315\274\224bx]\012n\005\247\337%\307\320\350\006\247\245\323\366\252\213\335M]\354K%/\232\302Jx\351YN\0145h\212\301\007.\300,\204\250V`\0066\237\\\376\04239\301\266\345\367\013$SiwD\357Ek\275T\351\233\366\240\263\353?\013\277\203S*\231\232g\253ig(\336\270\351\025bv\231\266\2509\177,(b>\361\035@\253A\325K\036\034\034t\037\235\202\260p\315\022\342}\364N\232\003\340\256Z\253L\275\316\242?\023\342\251\253\212\226k\035\0254\226\306\252\210\344\3545\022\324\306B\0167\354U\220\344\021\356\302\246>\273X\322Gs-\373\306A\364\004\337d\332T\232\\\032eZ\025\267/\006\265\335\232\246\315y\261i\335 \336a\250\250\241\3236\310\255\262\325\326#\026\014\322\304\217 \2023\275TI-C\020w\0268\035V\253\305x\233\035\331\264\014\274\310\230\037/\265\325\352\235\236X;r\366W6\333d\323\2652\352O\206\321\232^fi$h\243\256V\254\250\243\230.\345\215\232`\333\311\013\260\261A\273q;P\201\215Z\317\250\3274\347 GAnv\365\211Ym.q\042#\352\203\246\246\273Es\266\035[c\243\263N\202)\351\314\361\323AR\216Tv\2125b\240\311\271FB\214\021\351\3008\036 @\005\324\037 \353\006\336\277\332\212\264\213{\316\272\2635\245\304V\331h\365V\231\260\275\332)7\323\024d\025\017m\220!g-!r\025^Df\340\361\274`\214\016\250p\307\022\357\323\274\345-\034\365\360B\334Ah\310\321p=\371\250\006\237K=e\302\201-\236RQG:GW\024\224\314c\252\310\363\012\202O\251\213\263\235\335\310\366\310\335\323\361\206\243\032{A'c\362\277\222\256\331\223\230\335hV\322i\212\373\220\232\304n\021\325+[\343\226\235D\276To\312\261s\312\256$\003\215\243\324I9\000\365\302\221\254\001k\300\313\177\317\277D@\030\356\352\224xi}\265\337nw{3Y\014\225\361E,\355T^p\364\221\305\352\220\273\022Fw\215\303\374\244\371h[,\007U\376 \341\325\232\336\335\216\216\226\371t\376\326\213\032\323#\232\260\365\226\246\322W\212/\340w\310%\262US\204\250Y>/|rA&\027j8;\323\0038\016\214\212D\212v\225bq8&\007\023\207p\3040\202\015\254\006\242\367\367&\305S,\207\027\0107\\\331&\215\323\326*\326\226\353\025E<\022\322\252C\271c\235\021[\377\000\342\306\244\006a\225\334\011 \214\340|\272\366ux\255j\264\300\244f\015\366\323d\352M3\225\326\376U\375\245u\375\252\326\325\320\316\320\275-D\221U\031(\321\042\223\3141\005\1777\312\303\263\341v\344\025b\241I\311\004\365\341\370\247\005\255_+\3332-\004\310\327i\264z\335?!6:+\027RRV^ \276\352\013]P\222\216Zd\251\251\201\042h\247g\330\0269\313\256D\204\251\221\2606\261\000\346@UA\303\341\030\306S,\303V\035\340H\223q\256\237m\307K\254\272\370bIp\032\256\177\222\276\363p\272Y%\272RR]\2154\304\042\374d\347\314\3118\015\222Wh$\220['\004\216\300\216\276\207\2024\332\013\033`O%\002\0322M\2279\336.`K,U\026\311,\364\202@V9i\312\257\230T\0316\2562\244\355NG\313 \363\327\262`s\200\357I\204\3261\331c4\247\305\361\001\251iR:(j\241\200\312\257O\022\237\274\2000x\300=\227%\033\216\333~c=T<09\304\270\373\262*T\200\221;|\324\277F\352\212zO\204\252\270M u\042E\206`\035\345\007\322\312\244\250*\244(S\337;G\000\236rx\206\016A\015\036\366P\3475\200B\2754\272X\245\276]j\021\353\2761\351\226\235#\253C0H\321\316\013\243&\013`(\001\267m\003\203\316:\362\274B\245L\201\232\001\312\336\307\204*\317vk;@\272o\355\0157\204w\357\021u.\223\360\243H\\\264\336\242\222\351V\264TZ^\341t\276@\2644\300\031j>\026\276/\216C\261e}\245\366\307\030\363\012\2008\330\304\324\250X\320\033\231\255\034\355\244\217\227\256\210\252\360\360\307\022\301'\337\271\\\303Ob\232\305\2435]\306*\333\275M\256\032\243\017\307TZ\346\243\3709e\217\314H%g\334#y\021\221\320\222\240\256p2\3314\016Z\330\226\261\354\202G0g\250\204\3328r\\\003\231e\322\021\375\232>\330\011\246\2505t?c?\264\344\232rkt\367\337\217\377\000\364\372\356)\350m\2610Y\353K\012c\346\042\371\221\235\312I\001\325\211\302\227\352\351\370b\356\023\363\327\337Uf\246\005\204CW6\350\332\333\276\247\325\032SLh\252%\324\327\233\235\\Q\333 \240\227\342*j%\236@\211\004(\030\234\027b\2038\003)\223\200[\245bx\001{H\320\351\310O?\036i\003\207I\223\032/Z\374\034\360\277]\311\251i|\004\361[\302\231\364\227\214V\251\247\200\3305U\252\232\212\243\033\274\310\345\222j\204h\312I\031\223k\306v\310\221o\212f\215r~g\304x6.\226(\321\244\363~Np\036\355\371\272}*\014\210p\361\205\322\276\023\377\000\006\320\255]\245\354\224Z3OZ/\213\014\263\377\000\010\277\311g\214T\026\006\226C\032RyFp\361\304\246\032\370\\\037* D%\222F,\003\361\214'\014\372\201\356;\232\207\3456\035AWKX\326\313m\363W\365\323\301\255\0364e\277[]\376\331\236\014i\235?\035j_.R\307$\325\264\232k\342Zey\002\322\252o\256IR\246\011a\206\030\366\264\210\013F\034\216\256\324\370)\325\200\315\213\222$\3012\004\334\221\007\351c\265\254\2733\300\027O\372[\305?\004\351<+\276x{\341\337\333#T_<y\024\021[\355Zz\355i\271Y\350\353\352\232\260\323U[h\232\272i(.\2212T\3242\010$\363\210\011*\253\273\314\260\372\034g\012,\300>\226\026\261s\300\277\206\342$\333^\252\3152\343\342\2508L\260\351\037\005\356\024~\042jm?k\216\367\016\244\264W\351K|\024\327\226\254\245\271PL\336U\322X\246x\204B\011\341\211\251\262\360N\212\0022\310%\030\034/\214\177\304\212N\25230\264\345\200D_S\244\210\233h\220H\017\312l\254\253\227\212~\036}\2465~\240\360[\306\217\031\364H\027\212\371\351R\345X\336E\332\334\363$\347\342\352\352\352\252\016\372\210*\347\206\243\315\310\222l\306\362y\211O<G\331a\276)ejF\2559k\215\344\215y\\\036j\037F\235a\221\313\313\357\026~\301>7\370O\341\275\263\355\001b\242\263\370\371o\255\232\345bx,Q\327\301p\323\365T\351\024\276ElJ\301'2\303'\304\307\374:Y\325\341\2101R\025\343\353F\217\026k(\323ug\001\230\033;@\350#[\002F\322D\254\214_\005.\031\033\373W\010A\251\352/u\363\334\356\360\275\232\252FXf\232\275\226\241\352$Q\0349\250\025\010\322\251\302\030\360W!\223\225\344\263\371\3760\372\304\212oqs\200\324X\332\343K\036s:\025A\264\373&\345\002\303o}S\375\212\017\016\354\232\226\341W\251|5\242\326v\372\331\352&\222\221\247\224\324M\350V%q\223\035B\226\220`\026UP\240+\214\355\267\301\376#\251J\275:\365\207j\326\300pq\214\303O\335\266\226q\032\223!V\304\322\254\366\313\014}\227\244~\007j\337\263\205\247UiQ\247h\006\214\273\315K\030\266GW;\304'\232m\260\223\301(\307\326\245\234\355\0122\347\000\036\276\357\360\037\304_\015b\370\243qt\250\366\017\015\021'\375\356\322\014\030\042\015\211\326\0110\274\3062\206*\016c\230\314\037\015U\367\342\027\332+\303\211\364e\352\337k\361\042\206J\352\370\305\004\022\333\347Y'\245i7\1771\201\2263\020\001\0332g\321\220\334\340\201\364\177\211~:\340g\006\366\263\020\011ww\273\336 \233i\042\335y\\m)\301\341q-|\226z\252\223\300\257\030\274\025\262\307\246-\225:\327MPjIIj\230\245\230\371\020U<\215\272%\250pc\010\017\000\263\355#$\034\014\014\277\201\2764\340\2640\024p\265\353\201P\311 \314\002I11\026\332M\345v7\001\213}CS$\215>\332.\242\274j\013\036\273\216\325z\264U\320^\255m\220\263\323I\034\250\307?\375\224\234pC`\377\000\225\224\366#\257\260\360\214V\023\033\207\030\214+\305F\035\010\323\303\241\350|t^s\032j\262\241c\304B\315G\005\035\316K,2S\223\024E8\333\300\366\375:\323n\015\241\260U7\343;\366\331O\356\265\360Si\313\224\257\247\244\324\222R\321J\361R%?\230\325$B\343\312Q\337.\030\241\307\371]\273\340\347?\035\205hn`%]\303b\311!\216t/?\254\332\347Yh\335C/\206\032\243\303_\010\374#\213RS\311R\004u\265\363W\311\025T\3654q\305M$h\030\030#\222eI\204,\201<\315\244\263n?=\342\034M\230o\372\034\003C\271r6\371j\275#\013\013{PI\217\252b\361\023\354s\342\226\241\3240\330\364\225\236\337\252u\255\326\241\026\242\032\213\304\026\252\213\243\323Q4\213\025<u\014E%\01544\3134\215\271\245d\2072l\363p\337!\370\277\201p\326b\203]Y\206\004;\274&I\265\232\014r\276\260\275\037\003\304\342\252\034\302\233\200\360\333]\342}!r-\336\324o>\033\370Cp\260\337\374T\276\353\232[\005E\352\341s\226t\212\337@i\336\235\341\026\303\023\357i\042Wi\211HB\027\223cH\354\276\217\237q*\\-\270\032_\241\007\266\023\236F\263\042\004\355\363\352\275\026\023\007\211\250\352\256y\226\0159\365\225s\333\322\337\015\004\232\207S\370\265l\212\3074L\262\2555T\364u\025\325b'U\251\222Uu\223\316\215\337\315\036\202K\240W\016\245\225\276E\303\261\\I\225ra\250\271\316\235/\036q\365\225\253C\202\264\260\227\233s\376\324^\303?\331\343\305\277\021f\242\264\322k\217\032<G\232\003Up\253\270\301S(e\210\252\254\222y\315KO<\205\212aQ\031\211$\372\271=z,G\016\370\216\263I\252\340\301\345$i\022\003\235\364[\030N\037\204\016\024\317\334\376\027X\331\364\335\373G\351\252K\325\277H\325\350]=\347\265\005\042S\374\034!\246\020\371\214\202:Y\230F6\266I }\341\356\335xN=\301\353aX*b\036\034\\cs\3636\362Wk\323\245F\032\303\257O\347\371DB!\250jy\244\247\025(^8\320;\031\025\201$\222v\372\212\214\000q\363\367\357\326\0357\010\031O\222\256+\213\305\312\203\352\357\0144W\212\023\333l\372\272Mg\250mp\312\3251[l\2554kU$a\244\334\360#\240v\2165w\007\324\250\2718\306H\336\341|k\364\271\213c1\213\300'\324\351*\275Jb\247\356\333\317\350\271\366]!\252(u\335\276\357\245\036M+\247\243\377\000\341P\307\247\250\341\232\222\232\215w\262\315pi\343\011+\270\331\224Q)b\027j\2009\364Tx\306\034\323\2203e\271\314n];\001\313\310,\347\341\310x:\017URh\217\262\324m\\\265\027\233\365\036\250\263E4\325r\233[M\003\011w\207;\346\363\013K\221\367\260\252='\030\307Z|O\343\030\223DA<\340\210\360\333\347\346\273\017\200\246L\203*o?\331gJ\321\317s\324\025Z\207\304k\222y\317-5\276\330\360Q\262\306\301\212\304[koA\222A\003~\342~\361<gP\370\302\255g\266\223\232\326\354\\d\371\304\205`\360\352e\245\306|4\362\\\245\256\3566};\255(g\212+\247\20745\001\274\252\003\251hjd\215\343\013\0334\254\222\031by1\275\221\302\222X\225\003$u\355\350`\337[\016A\207\226\332r\272\373\362\215\326Mja\257\226\217p\253\253\236\245\3237mL\372\231\336$\240\27253\317,\225\223\317 m\212\246fv%\3301F\310a\2226\257\261\352\350\303\326e \317\366`#\337\331,\227M\354\024\234\331\251\245\221\353\016\241\254\242g\206(\243eDS\006\322\317\376D\005\301\0078*p\000\347\254\243\304?\327&\222\224\327=\304\203\311.\274\320\327PY\022\212\212J\233\314\263\242\315\022\312c2\0268,\334\340\210\224\0346\011\301c\337\030\001\203\3041\317/=\321\347\267\335I\251|\256\337\337\311ItE!m8,5\360\320\327\302\252\350\253<\346'\201\314\356\333\220\240R\250v\237^8\343 +u\231\304+e\304\232\2540\177\200\252\327\027\005\2527&\230\246\262\371W\3157CS\030t\363\276\022W*\2204@)x\323pgB\314=\0128\033\230\0009:\024\370\203\353\315:\232\215\371\317\335\006\034\347&\332%\332\336\306!\271\351\332\335=p\272\321[f\246x\347H\013#\301<`\342<\266$\014\0026\011S\330d\203\221\321\360\374`,s\036\006`w\353\366\272\261N\203\203An\243U\010\320\323\332\2553j\250M\336\262\271\3574\337\007SS<\312e.\263\245V\025\235K\002\357N\233\360rv\257~GZ\334G\021Z\24325\272\031\362\272\271\372\227\200Dj\235*+\364}\322f\234OIJ#\247\022E$\262\017J\235\362<D\250\030!\221\217\007\374\240\034es\223\206\303b\251\303cS\354\252\371\313^\323\356T\025\351joTT\017OQQ{\242\012b\215\024\204\3031Q\266\025bI\007\177\012Or1\317^\203\017@\261\304\001\004\237~j\313\001.\327\302\311\015\222\305T\227\252\252\011m\265\220|,\017_\0243n\215d\215\212\307\265\007v;\235\201\000\234\021\217\231\035\217\252\326S\314\343\022@>\366Os]\242\352m!S]i\321\221\275U\213PC\011P\220\303\265\3054\364\363\014\031\233\000\272\000\304\222\313\376`W\214\216\276Q\214\3031\370\276\353\304\213\365\266\337!\257\212\2260j\253\232\377\000\0175\005dWE\203O\352Jz\027)\017\235\025\024\352\336S\214\203\312\215\312\000a\273\033N{c\257YK\214\322c\233\230\211\374*\216\240\351\223p\242\227\037\014|G\246\250\265\334\255\272'YV\042\231\022\242Z\273\013\250\235K\020\354e\300c\367\007\033@\301-\331\272\332\247\306\360\220Zj4\023\244\025\315\302\200`\370\251<^\011\352\273\216\222\260\315\247\364f\255\202\347GV\306\010\322\337?\236\254\006\002\272\277\00297\005\306s\2249\343\031\316\037\025Q\247]\342\273\306R9\210\371n\210\264\026\220\321*\030\376\030k{n\245\247\264\352k\014V\273\335e4\202\031kZu\021\260\362\374\242\336R\311\345\340\000\252\314\007u\007\030\333\325\352\377\000\021a\016\034\325\246\374\315\006\360D\372\022'\302\366\272\027S1\007\232\276\364\277\331\327V\323\325\327\233\245\306\323\244\351\235U\243\257\212ikje\223\013\200\260+\254@021\221\233vx\004\002\024\371lW\3068:\224\363\016\361\033DH\361#k{\272K\216^\361\032\362_A\242\325\246\255u\225\267\233\364\027\011.2\307\022A\025mL\2224\220\355c\264\310\364\330n<\262%\365\026^2A\300\374\253O\033\2131\336\347\277\313[\370/jh\321\246\015\244\373\350\231\2577M7vx\250\351\265\004\324\306\012AG\004T\365\265\26054b\250\312)IH\367\000]\332P\205\202\002\002\306\000T\003\320\340\376\042\342\024\236\3275\371\\\004h&.~\\\372\005T\323\242\347wG\327u3\237\304\215Ur\324\024\332\243\370\345\356\273R-\042Y\256\025\264\327$Yn\024\310%T\234\224\205\011\251\013P\350\265\203\371\350\021\343I\025W\035z:_\344\036%M\307;\2010\006\232\201:\200`\033\335\302\011\335W8vf\316\320c\337M\024\225\374d\267S\335#\270\267\200\277e\233n\273\206aT\367\353f\202\216\317s\255\227\012 \235\345\267\313M\346\312\215\345\315\034\262\307\346y\212\031\333nTz\021\376Z\307\265\222Z\313\333C>\271\222\306\034\311\265\222\317\020\374p\324\3361\323\331\255\232\3654\206\243\024v\372\252:Y+,\366\332\312\233\035%D\221\313$4\257<\017$0# eN<\263%N\303\23100\261\337\345<]r3Scb\332L\371\2356\267\212\261\372v\304\306\202}\205N\331mZv];]f\265\0151:T$u\2620\272\305\034\313\014\2614r\322\245k\300j\002\225\205C\323\244\2426pQ\242v\013\322\253|h\352\264\215:\354\2017\214\242t\322\306=n\210\340\303\243.\246\351\\\266\313]\332\216\347Su\323\272b\361\250\346/MKu\251c%@a*I\013\3114\221+E$i\031\201M+A\350gY\042b\373\302\237\361]\021\206}\006\322\357:;\326&\001\223\277\226\202\332\312\006`\035\251\022\244\236\026\\\264\337\202wXu\306\201\373>xe\243\265\216c\022^,1\324D\325\314\250\211-M]\035D\2250\324T\312\350\223\264\207\313@\321\302\3420\300\226\336\301\377\000\226\261-of\352@\021\000\020I\356\216s\255\372\304i\010\277K\225\271\313|\222\357\020<V\233\\\276\276\257\324\042\337k\250\324\325\320^\257KYZc\027\033\254h\261\307[52\267\302y\261\252\371j\005:\002\207k\254\203$\322\342\377\000\344LUP\005*v\261\223{\370\000$}\265@\312\001\332\230>{.S\233\302?\010\352\252n5\264\372?\303zd\2572\211i\250\032;tJ\244\002\042\245\207\3131Q\235\312\205V\225\220\0142\214\2432\265G\377\000\221q\356%\365\042\372\367Z\224\336\032\337v\262Ki\3737xko\273Z\245\215<]\246\323\264\267\025\273\377\000\343\024\232\346\342\2245.\276\260BA8h\201u\214\031\020\011\024\002So\035hp\317\362n\042\223\200\304\261\265\033\244eh3\034\340\351\256\227\262\265K\206\0074\314\355\326\312\013\343\017\330\177\301[\215/\210\261x'\246\265\217\204u\327\006\212H'\277_k\357\223\333gZ\225\222\242\032\210\352\030D\373\374\371\000\233s\2632R\276\042\377\000\344,\236\254\377\000\231\260\230\207\007V\303\235u\004\013y{\266\310kp\013\227o\272\214\350\037\260\365\227N\326]/\032\347\304\275_\343\016\230\2445\0251X\264\325\241,:\206\351R\260\240\246\246Z\273\214\322PS\323\311\262x\245\250&v\205\226?\376+\254\251${T\3762\370o\020r\272\251\246l.\335\365\231\275\247_\355f\273\341\332\237\270\005b\\\177\303\263\303;T\3362\332\251\274q\322\272\272\206\315U\014Z2Z\230k\250\216\252\264TL\202\245_\341`\231\250.\324\312\210\230\250\202Z)ED\222\301)P\214\256\302\374c\300\351\223\223\022\0100D\203\266\243O+J\226|:\360{\315Q\337\022\177\303w\303\373\235\373L\352\177\001~\3237\335%\243\036\343U\374b\317\255h\343\222\371o\245\212gI\003yT\364t\302i\022\022!\245\227ds\244\220\312\225\033\036c\026\365N?\302\252\030\025\030A\260\207\357\267\356\264\317U^\257\004$\350Qw?\360\310\326\032\207\302\353\237\212\032\017\304-\001\342k\332<B\245\323\367;\024\015\025\262\256\253L\317L*\305\352\031\015\\\315B\33054\362\323\325\042C\004\345TT;#/Vp_\361\354iwo\2325\0261kL\036\202\343\353d\221\302\334\035-\3216}\234\276\317?k/\0175\366\274\326\013\340\346\267?g+u\332\256\311Z\222j{K\327\321]\244\247ih\350j\225\314\024\357p\333\360J\260\227\206I>!v;\202\312}\377\000\300\037\0273\205\327n&\223\310\246\343\016m\300u\362\314\0312\014\345&4\211\205\217\306>\025\030\306\221\020\355\217\275\271\257@\364\236\226\361*F\267\301\342\266\207\262\370s\254\347\267KYI\2464\356\250\266\352\335A$\361\021\276\216\242\317G4U\224s\250x\262\365\010\220\356p\255\042\034\221\365j\377\000\347\263K+F\023\265s\235\0042\243FV\377\000\344s\201a\270\022y\002\274\326\037\374m\3328\315v\266\004\335\244\222y\014\273\362\230\026\325[Z\203Ox\255\244\355\372\272\345\374\025-Mi\207s5\356\252+m<23$qy\302Y\021\367;\315\002\254)\231d2*\240;\203\017q\211\377\000$pWR`\030\206\212\217\003\2739\2101$\034\240\351\271\321b\323\370/\036*8\232'+w\210\264\304\337\232\251o\177a-q\341F\224\273\353\337\031\243\322>6\327^\322kd\332\217Gja\\\255z4\322O-\266\011\251]+i\347\022D\360\252\371j\0368\002\305\347.\346\177\234c*|7\304\001v&\254\324 \345\006D\221$E\274\300\344\275E>\035\304\350Uhm0Y#\221\034\217\277E\363\353O\251m\325\027mM4\027a_\256uM\033\320\322\352z*\211\244}5Z\365\3643C]\005J\0035U*\303\035m0*\013I\031pU\244B\315\363\252|7\013E\271-\224h#\326\335W\270\242\334\306r\307+\243|(\276k\232k\276\232\321W\015I\242\365\005v\254\261\337\264\265\246\246\277W$3S\\\256p\232Z\012\352\252\216\364\261\322\324:\325*\252F[a\223\014\256\356YM\224N\302\3759y&T\304\026;(\327\336\372/M\274\013\377\000\017?\265\345\301n\213\377\000\353\337\207\236 \352%\212\220\311GS\342\006\235jJZ6\256E\226\276\012\317\342\020;I\360\353?\225\015bB\246P\241\203+n[\264X\334\301\204\200<~\320\250\214M~\320\346\247\335\330\202'\254\213G\210\225\332\327\377\000\010t\177\200TPI\253\3742\321\272KTZ.!\252/\326\235Cl\324\313\177\242\370\352\224\212\351\276\334'\236\0014t4\363|,\2069)\345\226uh\266M\0161\361\230r\037\0152\015\365\373Yn\341q\000~\353\037\017eyw\343\207\332\247\307;\365V\220\320\332\027Hi\372o\006\244\274Ez\261\325\336\354\263PT\335j*\225\351'\253\251\225\344\206Hi\374\313}dk\004\212\222\001\037\230\252\303$U\307|%\3031xh\306\227f\023f\221\256\321\317n\2103U\251\210m69\240\022.d\001<\355`7\327\242\276\351\254W\232\333O\207\372\222\331c\325\026\372=MoZ\352\021YB)g\232h\310\247\253\213\312\022\226_\042\255*\251\203\026\033\304BM\261\357(\277\235\276!\370u\370\034Y\302\264\346n\240\351#\302H\036\364L\303\274\345\315\033{\272\366\003\354W\366\000\247\361{\3018|l\257\373R\331\374\001\326u\222\334R\337\013\351\251\353o6u\242\254\226\026\226\230GQ\033%Y\232\224I\031\204\307R\023\314\200\211\342\254d\353\350\\\037\374S\205\257\203eLeG\002\366\202Z\005\204\315\214\334\330\334\021\254\020d-\036\033\361-l57\323\303\264\007\276\331\311\320t\032\002o$\222 \301\026\005P^2\377\000\206\031\227\303\217\0175\007\331\377\000\306\313\007\214\264\232\202\236zjz\225\323\361S\322Z\353\326h\022\216\236\244\322\327V\021M3L\020V\323\3055$J\205\234\252\254\262'\250o\370\253\012KN\032\264[\375\205\2172H\323\323k\005\203\304\360\365\360\265\335\206\255\031\201\216\203\225\265\036\213\306\217\027\264\027\332\333\354\231\252g\360\327\306\377\000\262o\210\372W^8\017\035=E\034\356.\310g1\255U%u#IGUNdWa$\022\030\210\364\202\013\014y\236#\376=\252\332\360\347\200\016\207n~\346\374\322\260\270\312\315\031r\252\233W\353\035m\012\245}n\212\361\252\324\341\240\242\376\025Gc\001$\226dR\036y\246\201\246U\012\\\225\214m\345W\033\233='\207|%V\015\042\321:\311'm\200\026\363(\352\342j\270\310\337\337\212\265\364W\206\367\233\307\331\356\243\304\330\374\042\360\373H\351\352+\230\323\365w\012\375Ea\267\2734\254\360@\360Z%D\235\007\233\001\217s\253\011\036h\325\025\227t\205\370\216\005\212\251Q\257\247P\273r3\031;\363\267\257\204'\341\352Ka\355\323\301^\232;\374;4\307\216?g\013\017\210z\347^\353\277\010\255\223_d\222\367j\320\376\037\323j\007\321)\034\321B\222\337w\\ \2269j\221\226\252\030\342\202\012p\354\262?\0251\201\3531X\326a\034\005@\347\365\032^\366\3366&IP\312\006\243 @3\347\354\375\227\222>3\370:\376\006x\225u\322\367\177\021h\357\372)o\222\322\331\3571[&I/t\261\235\321\316\224\362\276\350dx\231\035\340\230\206\215\313D\333\235\011\031\364\370\215,E7~\234f-\327o\265\274\226}Zn\244\351-\363I\225\343\274\317\374:+\3055\306\373T\324\264t\355Q\022\320\261\247\007bSF\342F)\202\357\353\0149\000\234\343\214\202\360\307KZE1~w\353e^\253\015C\001C\242\266\334,\327\313\225\276\213DkZ\371)f\236\216\266:(\353&hb\363Lm\266H\220\340\000\214I\003;\177\373dgV\253[Q\215\250j4f\001\315\222\004\230\233\202}\364H\257\200w\355\012\354\264\370i\254u\226\234\241\240\217\303-e\244\032(\214\224\313xH\351\242b\230\337\267v\0308;\007\253\200\010-\214\260\036J\267\032\303`\3538\232\315y&\371L\353\340\231\206\301b\032\350\324_\242\235\017\001\265\335\372\327\022j\011t\276\237\252\246\251\226\245\246\226\340\254\276\265\333\261D\031\003\261Um\337\346\031\030#9\307\342\3124\336\343JH#\250\320\365\352\254\323\302\324\325\326\376\021\232_\354\217hJ\212x\253\357\267\232k}:\302\311\360\360\306\341B}\335\204;\3478\016\305\310_m\247q=/\031\376G\255~\315\222\343??vL\354\0007S\333\257\331\227\354\357k\266W\303\016\225\325\313\032\346\244\304\227\220\357(1\225h\321\031\024m \236K\017\362\234\341OYxo\2178\255G\266\034$\307\372\365\361\372\005a\364\350j\306\374\324\213N}\233|\000[\034#OxqC\177I6\272G\250%\251\250\221_\323\234\011\033j\237I\311E\347$\000r:\245_\343^/R\244T\255\223\377\000\210\000_\300I\365\224?\365\002\034\320\255kf\234\244\322\320\245\262\305Ae\3224\210\202\003OOGMO\034QFH\030\222%>\206\030\220n\355\222\016\033#\257?\213\306\326\257X\232\265\013\315\357&\363\320\2428\200A Bp\202\363SKS\001\250\324U\264\224\363N!\216h*\304l\262\034\200\010b\006\342v\362y\031\036\370\302\00578\223\011\024\252\220H\231\011\256\242\242\341QZ\312+\357\225nK\002\362U\310\233\225y\016X\262\341\370*B\236q\362#+\245\021\231\267B\036\372\202\347\334\246\312\213|\265\325\325\365\224\365U\022|E>\035\244\226xj\241\365\022\001W\332\004Dn\005I\310$\034\001\203\325\247\327\312\321\233oM5\361I4\\\014k\317\337\275Tn\276\202\343E5\272z\213m]\336\255\222E\376eF\326\204\226\033QX)i\201\345@\017\267\033x \261\016\303b\031P;1\277\206\277\2055\230c-\375\215\324b[\346\225\276\337\277\360H\356\177\370\246\253\250O\213h\232\276\024\370\252H\244\020\311>*\374\245\214\225#\010\333K\225e]\304\022=W\017\340\365\336\321\210$\032b\322l\001\326$\033\307\341Y\245M\316\324\304}\343\354\227\267\2075\026\001YMo\276\233\246\233Q\345\321\372\345\247eU\177It\250e1\253+\356\003n\355\333\263\306\302s\2169\265*\234\303\275\362?/\272UO\335\000\036{\257M#\274\370\210\325r<\021C\015\222\246\230C\0253M\011\216%\216M\333\320\304\021\325H\343&FR\000L\000\2407\306\335F\226@\003t&\367\371\334\205\247Z\275y\220-\363\373\042.\036 j\232k\225\025\015%\252:\353\204\361\207\222\256_9\322\230\017@\306\362\301\237\371\243\034+a\200\031\007\035;\017\207\242)\366\203Y\322\367\237z\302\212\270\312\214f`\333\237/\025\226\375\177\256jn\251\014\223G\034\220\314\263\312\365\022Hi\330\312\\\021#\243\002C\027%\210\031\007i\301\000\236\213\364\355\021;\371\240\303q\012\257wxD~~\351UF\271\221\252i\347\243\274\332\255w\032\231\031$\216\333\\\360,r\026\364\203\033\310\030\020\304\252\234c\221\202{t\241E\220s\215=\233+\215\3068:\001\324z+\026\013\345$\226\270 \272\327R\321\346&\222*\235\323\311T\216\316\301\302\002\241\030\237Qfb\024\204c\216\373\263\232\3269\335\335l\265\303\335\027\200\236\232\355\245i~\036-Kb\360\326\256\3374\361|5e]u-\014\265\361\021&ff$\002\024\004\310\306XJ\254\030\200OM\243A\331I\023:\356Q2\260.\232\240F\332Jm\222\277L\322\321T\245*Z-\267z\330c\235\221)\347\225\245\223qC\345\371r\244r\000\205\330\234\250$\0227\355BZ\336+\210c\307d\357\342>i\025\037G\263$\033\237\277\311;\320\331\364\211ct\202\233I\303q\2369\026x\336\232o5\231\244q\223\021\222e;\302\306U\224+\235\345y\031\352\263quf \356z+\254e<\271\255'\331F\266\226\323U\324Fz{v\226\240\233\310\221\345\370\232Y\321\260\033%x!|\274\224\376b\002N\345a\200\270\005O\027Y\202\036\335\371\373\364GS\015A\342\306\0235g\207\364\377\000\013-\336\236{L\324\002\217\316\313Y\332C;\340'\222\010\010\003\2668f\300\013\237\230\311S\256L\223\365\367\272\250\374\033C\363\015<\021\366\355\027\242U\353-u\353%\025L\2603;D\312\036Q\312\020\212\230de\004>\340\007|\251\312\201\322\216\042\251\202\335\004\035U\201K\010\347\026\023\007\311Lf\247\323Zy\352X\353k\220\241\231V\225)\245\222_\274\013K\032\305+\222\001e\000rK0gS\200\020uT\323s\240\221q\277\260\254\265\364(\313s\353\362\360N\225z\231\042\240\244\266=U\302\266\221i!\247+\025\035>\310\245\010?\364\264\206&\366\014\321\262\002\303\323\270\017PP\303\036\320_\353y\337\305X\251\304\033\222\323\177\004\322\264\367;\334\261\335.V\031\341\235\245X\331\314r\042\323T&\344udY\336\021\206\2167x\307\007v@\301\030\265\231\354m\366U\273F8f;\373\347d\350\324\227mar\245\217N\335\250\352\315<\036]\\\264\365k\023\264*\3732\025\203\310|\262\2456d\023\306\031\203c\256{\200\006G\207\276[\242\251M\365\210-p\353\242d\277\332\3554W\212\241}\325\223\312\221\023M\2242\326\354\2206H\215\266\312cPC\226T\021\343'\322\374d\306!\300\200\330\007\312o\257\271U\352\326\246\302C\252[\327\362\242\215r\322\020\317\025Y\025U\324\202\251\005|\362Z\236eh\201u\204\371\253\032\2729\021\260P\311\235\252\333A*GW\350\343\361T\251\272\244\220-\241:\353\032\252\347\211\341\204\003\364M:;N\370?\241u\235\277\304_\017\207\376\023\252)\352\026\276\232\276\304\215\035DRm\362\300\225\244)\346\002\256Q\324\251G\014\301\201\336\303\253X/\217\270\223j\313*\270\021\2411\257\335Sc\260-&\241\211\277\273\251\035g\210\032CRUE\015L\327Z\313\233W-\354O5$\022\326-\300\223\3460\231\213\3112\206H$W~U\243\005Q\031\003\235o\376\356\342\225\232\3324\3538\365\320\316\367\020`\353\366V(\343(<\306YYG\341\355\346\272\361O\253\264\276\221\243\272\335d\252[\205*P\317\035Q\226\251d\363\225\361\021I*'\334\212\303\314\016\333Y\363\2708#\334p_\210x\256\005\335\243i\366\216\210\2278\370\3507<\371YV\255\204\252\3424\003\337\273\246_\264\210\360k\307\377\000\000\351t\207\215\026\232\255\013\25745\352\226\377\000n\324U\027\212[W\360\270\326&\206\274M1cR\3533-4\202\006\022,MM\031\0146\276\357gG\374\205\215\305S,\303\322-\250\343\020a\303m43\034\222j\360\3669\262,G\227\212\340_\027\276\305z\003\303mXt\315\343Ax\311\240\365\276\231\266,\227\353\2155u}t7\2245\002J;\251\257f\214B\310\323\004\216z}\224\223,\220(M\354|\306\342>/\343\014oz\210in\340\022\007R\011\042\352\206#\007I\244\034\304|\325\225\341\037\212~ \370\004^\353\242|A\361\306\337R\325*\256\327\013\221\272\211\2441\310\233\244y\241\253X\343\036\245m\305\021\014\2521\234\262\344\017\216\270\265\237N\253I\344@\364\023\362\363K\312\320{\244\301V>\251\361\306\233\304\352\270j\274A:oU\235\252\242\342\324\361@dT\014\321\263D\221\004p\2153\256\375\241\312\261\365*\205\001X\277\217x\305C\230\335\315\344\010\264\362\224l\304\321\015\033\017\025_\330\257\236\024]\253(\256\365\036\027\370U\255\253\255T\251M\015mm\005L\217\012$\315W\016<\232\210N\022J\211\244^Sk8a\264\356'+\027\361\247\030eP\367\324=\006\202\3359\253M}\027\000\350\371\237\312\266\265\037\211~\020\352\231jk.?d\037\263\015mt\323\242\327M\025\256\371KQ[(\2028\303\313W\025\333\314\220\371~T[\331\333\214\201\300$\225_\217\361\246\243__+\355\241\032&g\244mLx\245\324\2767\353;&\241\266j\377\000\016\253.\276\034Z-\265fku\206\325q\253\257\263\322\312\011j\267\222:\231\236J\257=\326Fs<\262\030\367b\003\0162u\351\377\000\2271\315\312\300\306\345\210 \317\221\326},UZ\2700nF\263\357\315Lj?\304o\3550i\352-\363k-/\025\360\303'\22355\272QP\213\206]\320\311$\352\004\213\221\207 \205s\222\270\0317+\377\000\224x\221p\354\303X\336`\023\365%f\032\024\301\323U\310\267\017\020n\367\333\315\272\355\255\356\267\035}s\216\236\030h#\326UU7\370\255\361\305\0048J9.\023T\010w\010\243\225\2322\004\217\271\2628\003\027\025\376D\342\325\362\227\274Ztk~v\376\225\326\326c&\002\226Rx\235\015\362\262\221\005\216\335f\274\321N%j\217%\042h\371r\352c\210D\312_z\311\27408\031\317\030\352\265_\362\037\025\246\322\306\021\007x\366,\236\314M7\020C~\251\263V\351M'\255\244\252\270kI\364\375\372\276\2425\215\236\343h\363\247\253\247\215TbRRW\334\250N\007\363\001\331\337\325\205\363l\370\207\036+g\316\377\000#\021\364\001_\304\272\210\026\211\3256S\352y,p\324AM\342n\235\211[\312f1i\346\232*\224U\205\024\316\323B\302eU\202\000\014\252\353\266\030r\027\034i\341>&\342-\250\000q\237\036J\265r\035 \025\001\275\324\301\257g\274\324\370\277\251\354>,\013\375\345.\327\025\272X!\251\250\250\253P\307\342\032Vi$Y\367\031\034\371F5\221]A\\\241=v3\342\014]\033a\036\346\030\222C\265\223\275\206\321i*\237h\010\005\360|\223\365\277Kx\177\245\204\361i\233U\202\305\010\207\311\252\247\267\330\341\205f\210>D%\320\003\311\010\371bF\340rA\347\254\207qLeQ\337\252N\272\270\376aOj\326\270\006\333\310&\352\252\321/\231UNo#\013O\034\202j\212\211c\205\003rDh\354\026F\336\252\012\250?w%\227\265*\204\270\000D\304\350\004\337\231\213\213~.\212\224\346 (\275\326JA\001z\232\246\267@\236t\250\342\217\021\023\274\206`\033vpJ\202\331$\025\355\216\327)\027\030\217I\364Lx\274\305\212\212Chj\372Z\213\325\235.\267\313\015\042\322\311p\251\247O\214\206\331\347\261\012\323\324\003\276\030\245`B\371\273\224>\361\317n\267\031\206\304>\234\206\334[\366\353\350\042\312\236^\356`m\357\335\322\315O<>\022\012:;\275\246\256\233R\324\010\315\236\325T\221\320\327\334$\231\220\301\024qL0\306\\\303\211\010\333\211\001\004\206M\327\270/\303X\214un\314\267.X\314O\372\353\256\236\213\234\331\022u\323\337\252\231\351x\374Y\320\3762\307_[\341\375%6\236\323\365\023\331\2655-E\326$4wO&\011\274\372z\300\311\034a>!\025^gId\363\035\340\215\327s/\326xW\302X\034\005)s\303\252\035\372\036\233N\351\264\250\303\3464V\226\256\251\241\361V\375\243l\332(Kb\361KPVI\177\275WU\213%M\272\216\215\222\031j\354\217$I\004Kt\245\025T\370\222\010\214\3173H\362S\230\334\312\013\023\300\270)\232\265Z\330;\314s\276\272\030\376Q\272\213]a\252\206\370\231M\240\264\376\273\243\321~\033\326\352[\235\222\266E\212\013\243\332.\260CkU\251w\335v\022\323\267\377\000\270\354\236\010%X#H#\362\244h\205A2\310\336\023\214p\356\034i\273\364\317k^\010\377\000q\347i\3445\372\004\025p\254\002Z{\312\274\212\323\252\222\205\247\223F\\n\215\347I\034\202\231\025\304\221\344\0010\363\2263.6\211\012\262\256S\262\235\273[\300=\364\331T\261\265\004\017{N\272}UZXw8\022#\372G\266\231\272LY\247\246\274SA%@\216\244-2\326I\024A\266\026\214y\207tj\244\234\002\254T\214\020\313\216\247\010\372A\360^#\300\307\346v\361\034\220\376\236\2619\331\350\236*t\205\376Ke\024\236D\2252\262\371~u\034\037\315r\310UH\303n\001w\3440\001\201`\336\277z\207\035C9i\210\353\367\346\025\232\030:\300g\177\273,\377\000\305<BY\256\326\353\335\251e\265<\333 \356\225\025a\224\356y\320(Q&\320\254\310\001 \200\240\266K\016v'\016\3234\315\365\270\021\344\235O\015Q\323\002\002\230[\374\010\323\272\246\216\236\327\257o\267\3555j\254\236\030'\232\233F\033\276(\327w\235Q\305e\030i\300P\026\005p\244\310L\222 ]\247_\202q\214%,C]^\251kd\334\002b\326\267S\354j\254\342pA\314\3145\012%\017\205V\021q[.\232\240\243\271X\351\267Q\333\341\254\243\212\236f\242\214\267\303\273,Syp\021\036\025\221\032X\325\266\2421\301w\245\304~\042\025*\276\253\036{\304\334\353\346.>i-\246\312]\367\336\027x\255\035\216\327Ow\027\353\255\246*U\211LF\232u\233\317\230\222O\224\260!WF\330\250$$\004\005rN\342:\371\375#T\262\003\310h\320s\365#}\327b\034\332c\276F\236\366\321A\352\352\310\267Zi\321V\245a\236:\210\251\346j\211\031\031U\223\206R\252C\004\003\004\2259\334G\004\365-m@2\350t:_\177\256\373$?\023\015\016\211\365\376\024\232\216\373k\246\244J*\3129>2H\220\371\357I%b\253\006|\274FQ\2752\244.\0118e$\223\220zO\350\204\313\237\246\200G\273\356\254Q\342\214\020\320#\337T}\373\304V\251\243\272\245\035\262\206\242\262}\224\352^\222(\022uX\343E\036r&\305\003\312\214n\021\344\021\220\271.\335\015^\034\\\343\230\311\361\367\346\023[\305\363\211\015\217$\361\026\261\232Hl\262\324IE-\352\214\225Jd\250w\211\335Y\214g\022\010\324\0052\002\336\200HU\310=\272E\014\006R]\240\362\364\374\177I\325q\356.\006d\243\255\325\224\366\333]Et\232\226\321dq \221)\226\262\030j.lc8*\341\011)\312\355Gp\337\314@\241\217m\021J\236\\\304\315\3643\353\310F\376*)\343\245\335\363\020\262}e\261\355\364\265WKjE\032\317\007\231\042\303\033H\201\313\250\313\250`q\220\270\012\3040\334I\352\221\302\322e\3324\376\023h\342{S\227\237A\350\201S~\270\214\265\036\224\202\256I\310\223\314\243\206\235#\2125\016\306E\311\3066\225bK6v\341A\335\216\257a\260y\341\323o_\037\272\243\210\306\271\263\014\222\230h\357\321[\252jj*\264\364\2245\223\026j\344\266\313\005,\265n\370VyYc \276\322\331,\033!c\343\323\236\213\031]\231CI\234\274\347\356tJn\042\244\347p tDT_\304\354)\351\246\277[#\\+%l\362\002\212\240.\302T!A\271\237$\005\364\355\030\340\003Q\21710>_\222\2621|M\314vQ N\362\223\0335\326\347_Cg\264\265M\316\375P\3028i(\326z\271\352\344#\0424\204\207v~w\000\234\340\023\2028\351\224+5\340\323h.q\330L\371\000\210V\250\326v\201\262P\042\3246jh\326I\257t\254Lm\032\302\021d\001\210\311\362\244\001\033\030\377\000)\007\015\2220@\353\034\342\300\220\001\315\342}\372\245\277\026\362&`\372\371\042\3515\305m\206\206\353E\244u\306\250\323T7\025\221gX.e\340\225_>c\012y\214\221rJ\261;}\\\214\216\010\364\030/\211qb\231eF\002\016\320 \216Z[\311\035Lq\246r\264\333\350\241t:\312\366\010\212mK\247\356\227\326\333\014\223\332\355i\027\304\235\243\237's\25219$+l\0318\000zz\316\342\225\251T\250]M\271gbf<\014\017XV\360\370\247:\314\020\012\223\301\252\252.f\010d\243\326\364\221\340\313(\202\321\035I_^\357\345\240\221\000\3167n\003\010;\203\306\023O\006\312\216 \023\344\256Ud\367\256\004\253*\203\302mUt\240\245\270'\210Zz\301KQ0\247\247\025V\331m\357R\301\013\234\243B]\024&3+m\2144\200\006'\322}-?\203)\271\201\357\254\004\351:\370\353\357e`\360\263\222\032\177\244n\254\323\332\007K\351\270+hu~\244\325:\336\251\346\246\206\006\271Q\320\323QJ\274\226\042\031&\236m\300\206\012\342\235\033\220\031\311!,bx^\002\215 \3203\274\315\311\210\333@O\315U\257\206\024\200\024\314\237\025TX\255\327\253\205\322\206\272\216;\015\306cQ\033\320\321\377\000\020\363!\251M\242VW\211\261\361\012#\336^%e\223\012\337t\251\316&\023\207\021[5*a\304m\022<\306\376\251\014\341U,^\351\361?\322\231i{\376\240\322\361\212\310|?\360\336\277\314\213\341f\236\356\215w\214\266\344e\250F\231\212\305)\362\343up\321\362\244*\347s\037C\303x\223\2502)\323\003\251\033\363\271Z\254od'(\224\273\304O\035\274W\277P\266\240\361\023_X\255v\001\0341\317P\263S+\323A\220\310\276lR\264\221\020X\205\000\243\220\322\016\001\343N\277\021\305\342^\032\3033\312\307YF1\316\246Fx\003\237\262\270;\305\377\000\030\264\235\262\243Q\351\275Ch:\213IT\311O\004\264\264\326\370\240\247\232\226A\201OQK\211'\005\3463H\320\266b`\024\220H\015\327\267\340\037\017b\3529\257\303\022\010\222?\362\236`\370[b\274\3463\213\271\356\313L\310\360\363U~\215\373g\370\205c\323T5\336\024\322j#\244\341\242:XZt\346\241\245\0254v\351\032h\344\243JW2\3235+,\262\223F\016\327i\230:0|\365\354G\010\256*\0345Z\305\256\042Ni\207O9\277\250\363T\235\213\253\233)0\252\272\017\034\364\336\262\231\022\335\342\005^\224\250\370V\212\246\202\031\231%\245\210+.\0269\030:H<\260\233%-\313\272\035\300+$\377\000\300\214$\007\322\220\015\217\317Qb.\263\336\372\200\220n\240GXx\203t\251\217O\332|H\323w\333\225%\032=u\033Qy\016g\021\227z\311\342\021\272;\206T\334#1\363\022\262\206\334\301\364\252\341\360\345\262\352d\002lv\327@g\2279\324\243k\030\001s\204O%+\233\305\255`\232~-Ar\241\320\232V\264\273\325\\+\002A5\003\256\342\361\254\206\042\262,R:\301!\345Lm*\345dI\012\256}>\005\203uGR2\350\266\227\353h7\374\035!-\230\207\007e\023\023\370K\2741\373Ak\313\215\322\351\005\363U\350\330*ay\036ju\022\006\253\211i\361#%^\364D`\035Wlj\340\34576\356\364x\317\3018V\264\006\323&t6\021=.O\211\215\325\332|R\255\042\013t+\253\264w\214\0322\360\261\332\256w\225K\335@\204\304B\263\202\207b\010\374\365\226\\*\222\011$\214\034\023\221\327\312\270\227\303u\360\357\316\321-\032\317N\226\326=\225\265C\2162\243r\270A>J\327\237Hi}J\266\367\216\010\253\177\366G4\223F\314j\031c\033\362\346%\363\011P\2478\311\003\2663\326)\342U\004\201`=\374\225\362\372d\213(\315V\200\323V\346\254\253\362\256\360)9\235\020H\323A ec\345\355`C.7\203\352fe\3320H=2\2262\243\213D\304~\026eLn\035\263\234\023\177|\223\375\276\331Sp\241\200\305g\267]<\231e\252\212\012\225\232\011\042\363=!\214\253\270\207\036Z\027\016\024\276\305\033\207\014%\370\361M\2479\320Z4\235eh\340q\001\320Z\330\236c@\223\335\2744\321\325\327z+\3444\222i\213\244\364\361\027\202\236\273\314\202\272\242\002\014\225&)\325\204E\335\225\2328v\252\036c\012\204\016\217\025\307\252\237\332\314\240r\007\314\317_5\243B\235\042\330y\272l\245\360\177Li\352\012z\312\253\340\231\304\316\264\011\374B\005\2267\332\035\234\242\306\273HT\007\016\330\303\020w`\216\225S\212T\202\347\010\347\257\346\376)\265\030\302\3017\235>\211\265m\266\374\322\305UF\223^c\337\013o\254\006jd\036^\304tE\217y\333\225\016s\215\203\226\0007E\212\306\261\304\027:\3130\341\351\272\321'\334'\032\273U\005R\004\240\232\246\011\200+\034\220R\355!7\002Vg\221\234\006q\271C!R\007um\212\033;\376f\2109^-\343\363\267\276\253A\230zb\341\267\352\230\177\202U]\210\244\026\313\275\332\021\0330\025\325\346\252)\266,n\314\246\030\342\005\007\272\225.v\2203\313\033'\213\006\234\324\340\016\203M|O]w@\\\032!\215\221\272z\266Is\370\261Ke\243\267\331\336fd\250\202\224\235\257Q\274\006l.q\205V%e*\307$(\347=&\246!\357t\274\031U\252Vvmu\010\235\272\342\345w\246Z\223\031\246X\305,\257.@\247\247@6\302%\2227\335\031ff\000\022\2003a\207\253\253n\342-4\240\270\333A}w\264\210\333\257\222\254{Sv\375\223\312Z\365E|\242\032+\244\205T\304\222\307,\255.\372}\300\271@\312\314\002\014\342<(l\017R\205'\254\343\216h\314\034\343\246\334\371k\277;\306\267Via\352\030\344~\311m6\224\324\222\324T*V\334\247tTx\323\342\016\331\266\250\001\203`2\214\243\177-\301\013\237\274@\311\341\213\016t\202g\336\274\374T\273\010\361\335\337\306\351@\262j\211*\252\036\262\246\326-\322\274dM5ne\206UF,bTD\335\206m\274*\356\313\0167\364\307b)D\213\307\317\347\354\2408\027I\016\362J\264\374\264\351l\242\222\232\375Iz\011\004\261=M9\230$r\371\254\240\304\037;rI >\344\001\210'\014\010\243]\321P\214\204A\334\364\220\230\334\001k\003\211\327\363\375%\257_\005\004\2172_\342\214\244.\315(\222%E\2022\2624\222\270\004\240R\216\373\201\310NKm\035M\001Q\316\200\323\177\023s\245\225\203\206\2134\363\345\370@\242\256\235\032\271\2563\307K@\254\004r\326V\206YQ\224\251\222D\331\345\361\346p}A\261\270\367\000\010\355swF\367\267\313[\374\224\202\326\011\361Q\210\322\343n\253\251Z\012\025\256\225\003\254\267Z\232\351'\2228\303\020v\310\024\254l\0131\021g 0\007\000\001\325\262\342\341. \033\300\000\016\232N\237\331QQ\315\006\377\000T\343t\324SV\325J\242\212\276\271\014G\315I\003\000d*\003gaR\013\017V3\222\001\036\300\365T\322k]s\257]\322k\271\304\022\024V\252\377\000o\246\270W\\\032\235\341\255Gx*f,\3554\236\301\012`\223\273#%\012\202B\362\347\201w\263\016gd5\367\344\251\366\347\367\016\212?\254<J\320Z^\226y\265\005\366\325CE;\2424a\334#0\311\332\024\264aPey\031\365/s\326\237\007\340U\261/4\350\2011\255\376\300\237\222\254\352\343\375\204\217\222\353\2714\203[\222\242\232\362\266JJ/66Y-\262\304\325S.\030\310|\271\004\215\022\026\302\220Inrv3+\017#\207\031\230\03453\255\272\013\357>^\011\370\214\026\356\204\011R\242\262\252\226W\245\022\310\264x\222\233\370\014\324\353Pv/\251\231_q\031^r\200\222\\\235\330\000\030\303\271\320\347\020<\376\337T\017\256$\316\236\037t\236\217L\335\352\322\332\237\001Y\014oX)}m\344\371\205\225q\026\342\001$\2509R\001\033[\216\371\253\231\201\371C\244\364\3447\\0\244\306YIm\366\010\257T\002\256\226}O\015ek\374\032\315\005UM36U\231\243\211\330\005U`\023\202\250\010\307\336\015\201j\245sLA\000\221\340\177\264\232\2345\244\23131\272_{\277\015C|\272\316WN\320UT9\250\370\033T\042\232\216\230\020\010\216\236\005]\261G\311\0025\310\004\034{(\241\215\306:\263\335R\000\233\303l\337!\267\202Uw\323\315\224\331Bk)\342\230T@\261U\325\372\326-\273\303y*y\013\312\347\003#\216\000\031\371c\252\207\210\324-\206\266d\254\247aj:r\030\2379\335(\267[a\211jL\365\223Q\354\004\264a\033\371\2520\001\030\300\300\001ya\330{pz\317~\042\251\377\000R\212\215:\301\240\317\277\355:\324TR\323I4\361\312\325\310\307\022\244\310\356\251\376c\220r\017;\260x\3019\357\3213\034\374\242\0026\266\243\035s3{\250\345M\322\362\354\323X\243\267\323\302\340(y\225\\\234\001\202X(\011\2008\333\3338\371\016\206\235gf\357o\325I\305\275\260\326\223\252\310\356\267f\212\0376\353\024\265E\225QR\001\271\217\261l2\223\217H;\263\214|\371\352^\3319\207\314\250v=\305\246M\374\022U\276\336)\345\267==T\360\326\322T\212\3126\243\247u\236*\220AY\242\231\010dq\261Hta\267\036\307=j`\337R\231\016\245\3357\270&|\212\243\213\342\217.\0034\017Os\3155Mq\226\252Jz\223v\252Jf23\357\215\013\231\030\260;YrK\177\3669,I?\234\232\001\240\227\211:\352~\352p\330\356\354\271\337 \245\226\330t\373|<\367\372\253\204\310*S\3710$1\207\210dm\334[1\270 m%J\347\033\224\200T\354p\234V\031\217\016\254\331\000\253'\033E\316\0172zB\236]57\207\014(_Ixyl\262\210\377\000\223$\365\377\000\023+U\250`\3532\243TJ \250\312\230\316\300\320\024l\254\021\270\310\364X\316'\303\235W5:\031zk\034\265\225\257\303x\236\034\030\015\217)RZ\177\023t\205\316y/\332\213\303\235Cy\261,sA\345\303\250\252\351c\243\222H\301\017,\224\321\306\351\206\334\311\271\325\030\357V\016\243h\334\303p\372\030\206\232\306\216cq\252\337\245M\2169\342}\312k\323\325\332\032\337\251\353(|U\360\363V\351t\244\244\222\252\216\350\324oJ\317N\350\214\2170\226\245\242\2302\253I\275\221\021\024`\225%\201\271O\003\206\015\354\037N\015\264\271\367\365\225v\211mG\026\221\021\244\351\020\253\232Kv\261\271W\336(\350\257ZN\331m\226\023_l\216Y\251\343\226Z\031\01327\231\032\237\210\214\3461\272(\327\015\202\312\011\004e\324\340\341\326\246r\201\316<\243\177\025I\342\241y\312@\036\341A-z\232\335~\276\326P^\265\004\027T\243\273\275\272\342\326\345I\352\255\261\225\310v\246\234D\216\333\212\312\021Z5h\330\000\336\220:\241\213\300S\240\340+\271\300\026\222\014jt\221qn\253/\031\217\015t;m\324\202\255\256\320\305Q\005M\272\376ZS-S\2753,\323K\002\251r\321\306\354\032J\205\017#\202T\201\220\304\372\230\204p\267P{\332\300I$\351h\235\244\025z\2453\331g-\203\013\307\337\264\207\333\027\304[\325\316\343\341\247\207\324\377\000\007\246m\365B&\222;t\221\324>\370\225%\311v(w\007V\313}\3570\261\033z\375#\360\237\300\224@\030\252\377\000\271\340\030\020\000\360\201\353\013\316?=Q\337\026\367\340\271o\377\000\366\252\254D\326Jw\274\323!AM-S\326-RU\242\251T\363\213E\346\020\205\3461\274M\033.\345f\3636\014{:\177\014\265\242H\320\315\204G=\343\304\031\034\241 \341\004\031\335Ei>\320\027\033ED\221QZmpAWw\025\267hE<t\346\347\013(\214/\230\230H\230\241.%\211S\022\022\343q;\272n+\341\366\3259\234Ip\020\017#\254\365\023b\014\332\310\006\0171\314N\242\336*]As\262\370\233\254d\251\206\344\266Y\265\0345T\322T\314\257\014\024u\217L\341\253%X\247\211\021\344\302\2633nF\033\331T\222\312)UuL-\017\373\006`\302<bD\013\202l4\320\363;\246\212\016\246F\376\364\376\226\254ZOZ\321j\026\255\245M?\245-\366(\245\247j\213\325L+\034u\0426\224\306\236Y\215\274\251b\250\217\017+\000\303\033dp\212:<N7\014i\200\351qt@\000\233h\016\342\304\035/\320 \252\032\333\201s\357\344\2466\353\036\241\3225\213Md\271\322\333 \042\252\011e\265T\033\214\224r\302d+\034\321J\253\204\220((0\336\212m\253\367\361\326;\261\364+4\275\303\275\003^\354\351pG)\277S%X\243\205\025\245\261\347\344\226jK\0056\256\272P]5\243\305_p\232\357f\260\254\363GP\202\270\254sKUV\036\\4J\355\004j\354\273\031\025\300\303\014\002\234\037\022u:ne\023`\327\273k\\e\026\345=A2\233\210\300v\024\213\264\320\001\317Y\353h\217\252{\320\327\3128\264\305\232\321e\321\325\261\326\325M,v\342\223\264\020\314K:$\362H\344\211#u\221N\370\310\301PH`[8\274f\220\025\337R\255A\015\211\264\362$@\334i\007\344VeL\001\375\332{\371\373\205\354u\233H\\\343\320\232:\341\254\377\000\361[\306\235\274QE\015v\231\323\227?\210\256\240\237sn\244q+S\304\325\212\220\231A\247\223\033pRRr:\370k\351\341\331\212\042\235P\003H9\313I\021\341\023\320\205\277O\015Y\324C\244\026\221\266\277etkm\007\244t\326\260\273\320\351\037\022\356\3760i\211\243\212*[\264\226\352\3327\246\016\252\031E\035Z\011\322X\333|\014\001a\271\013+l@\335fb\262v\271)<\026\333\275\020\015\274\322\351\360\212m$8\227\023;\365\373$\246\345e\263\331cZ\377\000\013<G\254\042X\026\226d\2664\025\004\007dX\335\271\005\200R\240;#\177\351l\256ph\3420n.\216\325\256\215oos\367Z\342\235\026\2002\234\334\322\211\250\005E\035EeU\302\242\216\222I0R\266\011@U!C\022\023n\322\304\256\3427g\013\311\303\003U\230\2270\210\271\032F\212\016\020?\274\343\004\354\232l\2644V;\312\032%\226\024\251\243j\271.V\272\207\214\031w\250\004\235\233\274\341\224\012\354s\350\306\035P\345U1n,\314bA\210 r\327_\033G\232\265H2\233\203I\326S]\\W8U\236\226\216\335\003F\311\207\256\2501DQ\\z\202*\263\034\246\320\026C\337nH\355\322\360\314\246\373\324t[D\207\325{{\255\211\353\342\225|u\302*\250\241\274S\330\342\250\232I\177\225LKm\001\2020VT\364\306q\036\013\374\360pW\245\273\016)\270\271\206\303\2374\3725\236[\377\000lODt\365\363EF\260Q\333\005s\262\022\022\246xi\343\207\3246F\254\035YG8\337\264\355>\331\357\324\017kR\\m\371\376\320\347-d\201'\321B\351\365\326\241E)\251\355\266\332+\354u\222\303\027\360\331\252\247\362\342\334\314\323y\241X+\021\202$,\241[\356\253\017P\334\304\323\241\256\034\227\001\2510/\341m: \253T\010p\021\314\033\375,\232/z\261Z\325\035H\265[\253*|\306z\252\230\351\347\230F\200>\375\210di2\241\200\\\006i\011\003\321\270\262\327\303\360\302\352\205\205\360\010\264\235\366\344#\3509\256\251\304[\224\332<\222\373~\244\261_\350\240\250\251\256\241\271\321\326\253\346\236\272\224fs\020\214ld\221F\365\004yls\236GnqHak6\246`b7\372'\263\022\323\337\002@L\372\216\352*&\261W\332\3544z\205^Y*\326\202\012\270\251\222\200\371e\326AM\022L&d1\266\324\000`\355 \236\011\273\205\301\265\245\315{\356E\240I'\306D\010\324\337\222]\\`le\032\362?d\232\367\256\177\216\374]\033\307\177\247\202Y\312\202\366\371\042\251\224\307#I\345\211\026\234`.A-\032\271 \022YN\355\323O\207\232o\314\330\230\346\010\275\271\353m\364U\353b\336\035;x\035\274\221\027\035Sp\246O:\321U|\252\261o3KR\360M%$.\024\203\261X\020\003\000\243aS\222\203h\3667h\360\366\271\300\230\314mb/$\250\255\212/9/m\342\311E\302\355yK}w\301A\247\265E\342\222B\264\260\327T,\020\315/\230\012\023RRr\042\300\003\315uur\001\013\206\033b\215\026\012\201\256s\230\315\011h\314yXKG\314x\250uRAs\256\222Q\335`Y\243\250\247\206JJ\005\230\254\225\036B\357 es\220\245S\322\240\3623\205\306\3340\035S\024\034\004\023${\367\365*\224\200f=\373\335\006\350a\275SV\315E\177\222\337\023\201Q\015M\015PF\211\014@\356\314\240\007VC\220\343\217R\221\264\220:\234/h+\007\275\222\006\304{\367!Ay\313-\325\025o\265WCk\265<\327\373\205\306\251bf\025\027\031\3154\2210/\036\327y%\225\227'\322\021\210,_q\357\236\247\027M\257\255\332\001\227\240\026\327h\201\327KB.\321\356\260\361\011MM]\242\013\214\026\215K\250\253\332\333\034\376}%>\305\226*\227X\331\263\023\262E\227\033\023\323!`\273\203\025R\244\027R\300\270S\356_\231\037)\366\022\205G\003s\007\337\260\221\313\177\241\216\261\341\270\336\357\365UT\222TQ4\025\321I\034\264\023\253\256w\010B\004\312\356\\2\002\273v\223\226\313;\3765\303\274\032\001\351\363\336Uj\365\336\032r\353\365]\2015\304\012\032\271\345\236\012Eh\276&dH\274\225\246u\200a\346\230\250\312\020\333\213\250b\2439\014~\367\227\303\324x 8Xr\353\310{\011\225\353\264\177\266\262\2324\356\223\254\270^-\327\232\310\343\261\331\236%g[X\225\322:\266\033\232F\250y#WT\363\035\374\243\002\225e\007\323\226\042\325|sC\034\326\011 \352u\216Q\261\3537\321?\017\203\0163\261\033h6\346\244\364\227j{U\266\364\346\222\276\303xzxh\321\342\247\211\260\361I1W\336\354\201\346>s\236\376\202\312T\235\234c\341\262\264\2078H7\345\327\353\267HZU1\024\2510\235\010\376\225yt\274\327T\324\316\030\313Ve\210O$\222\244H@\316I#\357\001\350\316\025{\223\236Nz*\225\251\376\327\037-\376\213\315\272\243\252<4X\217+\373\262nH\305\306\252\030\253\226\242\004\223s\025y\340F\336X\253\242$r3z[#\034\201\352=\363\326^-\324\330{6\237\221\367\371V\350\340\373\340\274[\232[\250\2524]\211M_\376]Ok\365z\226\277(N]B\2170\260\3363\273\007j\217\314\364\214>\016\255h4nc\335\272&bq\370\032G\263.LU\027p\0224\244\257\042\230#I$\324\314\362nV\036\206V\214\366`@\311$\034\367#-\327\177\307\326\246\010t\202\263j\361Z$\305# {\012=\015\341Z\251kM\356\373\003\300\311U$\362Dc1\360\012`\263\023\263\030>\307\226\300\300\345\354\317L\2077m\025\007\274\274X\231\267\256\351-\357Q]o\367\033\256\245\250\3255\332\216\351_Rd\254\250\250\250\333,\323\023\313\202v\307\316\025\311c\226%\275\373\263\025\211uW\232\225\005\315\311\215\367\323\351\011C\014\372\222s\\\244\367z\013\341\206J\353}4\362\005fi\341\255\271\252(\213*\025\227r\224pG\250\015\352\333\262\240g$\316\030R1\332\272<\217\367\362\371*\255\250\360\351m\241f\235z\233\345\003KYn\232\317\002)I$\024\253\034\262\251c\300(\010#\034\343vI\343\271\003\246\325\252\306FB\212\235:\217\356\271\276\036\375\352\244`G@\227\003\007\225\361\013\011\237\314\362B\200=-\307\241N;\003\225\377\0001\3162H\275I\371\231\3356]K\006\347:\030,\212\273\321\323AD+\255\261Gx\206\242=\306u\225\3607\022\204o\000\266\340\000!\3008R\006s\236\2651<\035\315\207\264\313O%\350\270\217\002{\036\307\322 \264\015uQ\211\250\265\027\305|M\312\212\001\013\211\225\344\245\222Y\042P\243x2H\354\245\016\334\345\267\022\000\371z\272Q\244\354\231\257\357\302VV:\216\042FF\202<4\363R\377\000\017\274Z\274\350\373\314\032\216\323\252\354f\261|\271\341[\204\202\246\206\244\006VT\250\247\2204s\306p\252Q\316\\\025\031\007\223w\207qlE\027\346f\277/C\012\277\015\342\230\226T\326\011\333o\252\232\\u\265n\274\212\242\217\\\233\005\247OH\373\236\252\012W\254\331\022\267\362\342)+H\306\025\004\2207\235\240/\251\2621\2748\205LW\376\253\362\270\235G\256\313\3357\020\372\223\234\330\356\235\352<=\360\226\363\246t\325\025\017\212Z\202\303|\246\274\371\224\236m\003\305\004\022H\3466\222\255\003\264\005\320\005d2\031Da\244\313\323\360\017\242\317I\324\005\026\270f\035.o\264\221\033i\257\212\270\332\024\334C\003\200\216\252\226\326\367\3553e\324\232\306\303\036\253\277\337\3655,\236m\306J\372\330\352\352\355{\225IY\025\324F\322!u\000JJ\355u,\033 \365\213W\203\347p\257Q\235\323\240\270\006<\311\216\241gc\250a\245\302\251&7\325U>2xoQ\343\006\236\270\351\233f\260\267\370W\245\244\037\017^\226\233\037\306\334\352*\225\203\356\216\253\317X\327-\021\005QU\317\007v\321\263\253\034\007\342N\035\302\253\012\377\000\247/\252\333\216\364\015\010\322\017;\311\216\204\252\225\361L\254\330\243b\042\320ys\\\325\243\277\303\363F\331&\252\276W\370\243\343\005\346\274S\032XnR[i\240ZI\003F\321\311\010fq\225c*\354f\300YF1\367\217\267?\347lK\243.\025\241\277\374\235\370\003\224\331Tm\034P\007\273<\265\364)\352\305\376\026\036\016\323\334\253\347\324\265\332\363P\324\010\321\221A\026\352I\345\334Kf\010\3438GP\243\313\216\240\000\305\2666\335\200g\361\037\363\317\021x\313\207\246\326_\221q\365$i\377\000\305Y\245\205\304\027\020\366\300\363\363\327\354\246w?\260\017\331\261\256w\333\365\343\370\365\242\252\242\244<bz\370\0040B\254W\313\212\235\311E\210\2149\211\334\230\302\3402\256@M\037\362\347\026\252\326\261\244Xl\014\370\223\317\302\007\232Y\302<\274\231\337\362\207\244\276\304^\001X\250\257\323\315l\324\011Ir4\315O<\232\223\314\362\0350\344\323IO\031\014\003\206\332X8%\230na\220Y\304?\311<Q\331C\340@#\366\353<\3016\345h\365\322\343\030\320o7B\276}\222\276\315\025U\357v\255\260x\245R\3246d\266\306c\275KZc\362i\314^z\273S,\205\333dr\005\016\002\262n@\231`{\013\376@\342\277\372t\303\032\034I\375\274\3111\023\020$\3071\373\246\022q\025\251\335\304\035\200\367\272\275\364\266\236\320:Z\336\221i\217\012t\325\272\256\230\254\264W[\205\025M\306\256d\334vIV\363\324\221\042D\222I\014i\022\253&\356D\214\330\036c\037\307q\030\206\266\215gi#\273\335\231#\247I\277\225\200E\204\342\271Z\177\353\213N\261<\224\251\250\364M\306\337\000\257\320\336\036N \254z\230\376\042\333\004A'h\014R\314\210\042.3\033l/\234\262;g\030\3301\351\361lm<\324\333U\301\244DI;\316\375v\321;\365\271\355Q\252UI_\035-\004\026\233\015\252\337\005\015K\210\037\340\016b\2026\033F\320U=\004\004%\227\007\005I\003\003\2441\205\3071>3\357\252]\\CKa\242\353+nZ\216\266\341\004\262\352\013\374FJ'\267,\014s\031\012O\244\242\253\261b\357+\002y]\305I\306\321\320?\034\314\206\233?h3\342w\344\214\342\253\271\375\235G\367c\371M\2555E<\265B8\222h\314B(\335m\362F\036~\177\223\261r\304\271\016\000#\004\020y\311aZ\203\301l\314{\037eZ\244\265\307!\360\367\342\231\345\324\022\2645\011\0047\232H\311\217\031\243A\345#&\340\273%m\312\006\017\030\343\324}\201\351B\230\017\357:U\206\327q\0217\036\375\372\243f\274I\025\252T\244\251\253\274RK\013Ty\256V6\215\013cj\251\207$#\262\344\266\342\244\260 \343\201\246\300\\A\260\374)~1\320A\271(\307\324\225\342\272zz\203J.I\016)\346\250\001\304\262\035\270\310d\\eY\216w\253p\336\234n\350\2618f\006\220\001\237\222E*\225*T\270\026\326\367\023\350\221U\327V\207\244\370\251\326\231\252f\221cx\347\177!\216\340\276W\362\313\257\377\000f\336\276\234\0007\021\264\012\254\245\230f\334\\\377\000J\313\252\2676W\373\0121_Ss[\205*KI\251\005X\225 g\222V\304\222\251uVh\242\222Ut(\236\211\016w\264\301J\2068\032\015\243T\265\315i\004\0004\036\023\004\200gY\365\321W\305\342\251\015M\366\277\273$4wJ\232CM+\326S\3131\257R\353:\264\260\256\345$o(\006\314.\007#\202\010p\245\201\35150\345\244\263N^\375\332\351\324\341\320I\216~\375\312mj\311\252#\2363j\247\226\315\345\266\352\224\252\330\322/\003\016B\304F\314F\314\207$\2026\260\036\256\256\266\031\016\007\277\244{\237\302\347\323\016=\313\2009\255jY5-\246\266\235E\252j\253ua\334\014m\002\307\016\315\330g\340\251 )\341\216\3562@\317)\247\337as]\365\276\336\312\257V\255F\272\355\327\323\242\207_o\024\3647;5\015k\332))+!3I\347\327\025\231Y\244V\0424\214\367\313\356\033F\325,\000\337\234.\215:e\364\334`\310\351o3\343o\2723^\006`uB\256\270%\302\324jm\332\262\232\2225\250q\005\312\271\215,qT\204p\350\265r\240\311\0146\000\207vIQ\222p\315\302\360\327\265\371\034\323\003mL\033\314uER\263\334G2T\036\332\272\372\333y\255\324Z\243\\\323\323D\324\221\2644\206Z\212X'@\021\352'\023\226\005\245BF\034.\375\315\265\210BTj\3268j\224\362R\244I\004\336\0013x\006\323\034\306\233\2044\253\275\277\274\335N\022\365h\250\271\320\274\365\232gS\\\022X|\352\367\362\376$\2173>H\235\025[\030$\2532\270\354\300\260\031\353?\024\334\214\314\321\224}\371\352}\331[f%\256x\032\216\212?\250\251\256\232~\010)4,6KlFX\367\323\\'Ph\240\000\234\3010\214N\314\305U\225\335\362\245\\\372\202.\313\230LM:\316/\256\011p\026#r#Q1\036\003\322UZ\316-\005\255\323\307\257\262\203Wq\324\266\351.rW\353\335Ua\232\256\247\3145\324\260\323:\254\2631w\211\203\304\261\230\324\206\003\0046IV$\355\314\322\255M\321\226\23004\222\015\267\326d\352cm\265U\353\327s\210\004\301%\027~\272j;\215\256\331Mj\322^\037\370\215\252`\333\035:Tj)i\300\363r<\310\235\242\022*\225\\\230\325\203d\024\301\000\036\273\003G\015\332\221Z\243\251\263\377\000\214\233lE\367\265\354\005\320\376\253/p\017\355,\320\267o\022\353\342k~\247\321\226KT\364,\363R\324Z.\362\032\2317<\212g\215\267\200\307\313\215\270`\356p\253\272A\2023x\325\034=7\001\205\250L\353-\003\221#\327q\343d\306\325\253f4_\337\312\352GN\325\227\313em\015\273MY*\256\341\343\256\206\211i*\252b|\312\321\355,\203*\0250\322\247\016\240\225%\276\357Ms\3510\311q\202zO\314\372\035\372$\032Ot\207j\017\277\345h\331\256\226z\031i\252\264\325\262\3312\325K\276J(#\211dw9\311.\312\020\345%\314\\\234\266y\011\302\353bYQ\303;\211\000|\205\243\303\360\231\251\314\005\271.\335\210Z\005\216\2466\264[\332\346\042qH\364\250 \042\026\362K\227%\211,DJ\245\333\323\222\011L\0347\207\253J\251\254\011p\311k\011\326\015\367\231U\235T>\217d\332p\356g\177\232\215\230\344y\343\257\324V\231h5,Q\254\042:y\202lU\210#o\001\025H \026e\\>J\221\214c\253\256\2434\210d\317\343r5\266\312\330\304Tk\230\\\330\360\353\267+\250\335\372\341\004\225\325uk5DM\346'\304U\031\332\244\261R\341\011hYG\245\224\027\337\031\337\220I\031\317Ixm*r\370\351\035\015\365\371r\344S^s\214\3255'\336\211m\276\337]\0246\373U\\\325\265e\003\006\270U\244\262I-BE\265v\323\204\302\251\307\250#\016\024aw\014u\211\210\342t\036\362\3466\004\330\177$\312\263F\215\042A\003\325J\355utq\315q\222\256\323\246R\326\220\217*\011h\024\311\217N\322B\272m^\301\260\243\2068\365\034\365^\215f\271\347\264l\310\336\377\000\217\252\014Fp2\273D\301v\271iT\256\267yv8\022\3426\005\246X\004+O\034\207\034\031Wq\004`.rX\020\011\316z\320\302p\212\247\277\232ga:\373\353\346\260\277\342\251\207IN\032EuUM\376)\264\227\206\025\332\213R\304\014OMM\247\336\351\002\202\217\036\372\270>\035\343,\252\262\223\033)U*\256\001*1\353\270=\032\375\267\375\024\373B\004~\334\333r2&/\177\020\232\316\035D;3\232\017\210Q:\307\263\326\\c\240\244\322\365\224\027QV\277\023G\025%Md\321\225OO\227JY]\001b0\217\215\301\224s\216\253\277\204=\356%\240\210<\255\364\333\222\262\334%0{\242\002)\254\027\033\275uM\216\013m\336\015J\363\210b\267\333\355\363\315,\322\273e\220S\340\225 +\372U}\235p6\223\325*<\036\255g\021I\245\316\344\004\237\030\012\205~\030\015\331\357\336\212%}\321\272\267D\334j,\332\233J_\264\226\240\246\3011\327$\224\225k\270;\015\324\322,r\020\341$e}\234\343\337\202j\342\370K\260\307-`Z\356N\004}o\346\251W\302>4\266\311\204T\\`\247\251\254\376|RB<\307V\244\001\206=+\202\214\274e\301\334\016}M\362=U\024\032D:\352\253\251\327a\221\240\272q\243\327\025\320EC+GX\367\007\220\357\221+U$m\331\334T\222>\361\034\344\215\3319\007\271s\032\366;;,\254\321\305=\222X\357|\224\202\351\342\025e\352z\332\213\225\272\276\246\257\314S5G\360\350#i[=\312\345p\304\260'\003\360\317\035[\257\213\304<\014\356\230\367\313\344\213\027\305+\271\3049\306\336\210\177\307(\256/n\232\257\342\252*i\342\333O\015B<&\237\223\224F\303\001\351v\0006\342w\002x\034\331\245\304\2534e\314c\306\312F>\276B\326\274\307\217=\321\315%%M}M\306H\042\370\232\231Vi6F\010r91\264h\261\243F\300\020Uv\206\007\346Ny\274E\3159\313C\257pE\274\322*q\007\347\042<e8\323\307j\242\270\007\250\323z~\276\3352\324f\236\031jm\304,\211\264\030\\+\262\354\014\245\021\313!\332C\344\026&\326\013\211\206\2733\351\2029{;-?\371\207\236\343\300\217D\365}\207Ekj\250\357\020h\373g\207\272\236[|Tu\265:j\272\267m\312X\244\223\313\252x\244\250!jDn\361\027L\356;\034\242\2370\277\242\257\361c*Rk\003\000\313\266\327\351\365\346\265Y\304\251>\237d,=\355\036\212\242\321\237e\233m\025\366\232\361\341m\252\232\351\251i\351\222\335n\240\206\347\352\247\023\316O\225\345HcO\210\226B\310&\234\2637\0002\234\347e\274g\033\304\331\3318\202\302A'y\332\372\307Ansd\257\320<\213\276~\251\314X<L\323\227z\313U\306\316\365\250\265\247\311\236\212\006\201'8Eq\360\312<\360\346@\303\312pd\004\272\226`\000\\\334V\023\010\367\006\264\215z\317\317\354\265x\177\015e\023\042\366J\265,W\273U\266\256\353\177\244\274\351h$U\232\0276Z\243\035\316&\177.I\225w1e\036[\022v3e\024r\305\227\253Tx~\035\215\015`\327\235\207Mai\325\000\011f\375\023\327\360Xh\251(4\325&\273\360\253U\317$\315Z\327\033l\265\011\034*Q\344\221d\225\2268S;\213\014\000\011\336F\011*S\214\242\301P7(&&\304\025,\244j\016\316o\357\321D\3514\346\253g\250\275\303Iz\255\3225\016\323%\312\222\346\323B\315\037\231\2765\224\240\000zH\010]\003fE\\yl\012\252\341\303)\2074E\371|\301\337\354\250\326\300\2777\375i\204-\346\232\011\014\267\023\374m\252\342\024\222\327L\310\322\243+4<\241&@\025X\0347\251\224\343\007\324)\327-\355\201\312H:\375\326k\351\274\036g\337\311E\337TU\332\354\365\367\315_]Qj[uU==E\276J5W%O\225\2729I\012\350\030\234H\0126\335\305x\034\350\034\005P\360\3349\027\222.}\203\343m\245.\235`\323\336\325;\235G\246!\270\333\242\232\232\304\227\231\042\013o\226\242\346\377\000\021\024k.Ub\246bAq\032\034*\250\334\012\240\364\222\241@V\0146\2205\220\242\255`\353\001\021\351\321H4\345\366\301vo>\270^)\242Z\371i\343\212\003,\260V\252\310\026G\212g.\361\355*\024\014m\301+\303\257\031X\352\025)\022\303\255\274\246\343\345\356\022k\012n\207<\305\317\277\242&JO\010\355W\013|u\260T\256\255fD\245z\312\346\363\252cb\305\231\004\263o\225\301\231\225QP\2419\306\302\243h\234v<\320s\233!\243X\026\037+i\314\024\232\230\202\033\334q\202w\321:j\333\0256\254\216x.\332\216k\027\305b\225\317\361A\027\306\251O@\334\271\236B}D\253\015\256\006\010\306C\326\341\334g\364\2433i\202|$\016~\005W\354\303\335\235\316\237\350\3026\263O\336j\246\274W\332u\245\362\220L\347e5M\\\323QB\315\3524\361F\345q\036\362$\011\302m\334\2400u\332N\3428z\365K\\\320\006\320/\353}\271\372\245\012Y\230Kdx\033\363RHT\324Lb\251\257\2475\257\002\323\264\221\256\317Y\004y\235\313\005%\271Ry\313\200J\221\214\032\224\251\031}6\300\223\356\336\312\330\242\347\007e\315'\346\203_Qe\215)\177\215[\356\364ut\354\035'}\256&Rv0\030%\221F!]\241\270\345\216@\310fj\242\236V\213\031\262\262D\214\304\000RI\254\326Z\031jk\355\346\336\365\016RA$A\344\235\020\221\3474xr\013\263\242\215\244\036X\343\330\365j\236-\356gfI\276\333N\201\006S\2434>\377\000\244y\260\351?\211\271I2\352\313\015\\\250\351$\351\344\2176/K\005\363\007\033U\224\253\202\006\376\336\246@\375\013\261u(\234\257\022<|\271onq\346\233K\006Ks\311\333\323\226\352\015p\323\2254\225W\333\201\270x}s\250\2520\324G\034\366I\246\206\000\273[\021\326\302\300\253H\032F!T\306\255&\025}#v\376\037\033I\315\202\010#[\200d\316\200\3504\201\254x\333\235\303\250f\016{A3\343\324t\353m\323e\226\316\332~\246\371Wd\264\332\340\267O<\236P\264Q\316\237\015)m\214\360\322\262\011U\316\362\354\310\316\305\303d*\340\364\025\262Wp/'8\213\223\323s:m\265\220\325hd\346\023\277?\345>Gu\267\245D\357Wk\266U@\265\033ci\242\222\027\212 Nbx\260\310\244,r #;\260\001\311$\252*Pi2\011\223\026\352\222\332\362c.\212\267\253\257\236\242\262\231\264\245%\256I\015\306\221\353\214S\313A\346B\343%\225G\227\024\230\016\222\025]\300\000\001\377\0000:\302\225\032t\235\333\230s\201\312lo\313\177]\323\230\352o\020E\224\217R\213|\226He\216\334\365\227(\246\206\224\270\252\215\246\223\374\254w\312\001F;\227\005\262\021\267\003\346\014\003O\012\3675\3433\240\036S\313\220\326=\302f!\2154\316[\205\011\242\320^\030T\352[f\252\251\320\226:\233\25551zsWQ;Nr\370\0022\356\260\355\306\354\025l\344v\000DCO\037\306S\244p\375\241\312L\020\000\002\335u\362\267\235\327Um\027\011h\271\362\376\022{\015\232jz\310\036\216\351/\300 \220\010\251mpE\360\341\337\314\177\375\245\274\265-\3676g\010\221\226$\250\220\263\037\305\232\366\2275\267\266\344\364\233G\234\357;Y\026@@/:\317\360\254K\207\3767c\202\266\025\275\326\302|\307d\250\235\203.\302\3002\260P\034I\350p\254HS\234\222\245\207Y\355ap\021\257-\364\267\277D,\240\333\260\272H\337\337$\331Y\005\035\302:\312)\252\257W\2123\042\264\246\246\004\231\030\222\314\256\010\334$U\330\376\202\274d`\261e=/\016\016`\340c\303\337?aT\305Qn|\200\225\010xe\323\246\3239\217T\335\326)Z\276\030\255\342Z\212\252\204\376[.\325M\217\033dn\011\351S\351e#\2204\351\227Tqh!\244\356l\007;\336\335u\346\251~\232\362I\217\1774\216\367g\265\335\243\250\206\261\344\206\242\2566\270\177\013\274I\004uR\302\310X.'.\211\226H\320Hx\014\252\031\211\344v\023\034\366\230#C\001\355\233s\270\002y\306\260\236\320\306\266I\217\272K\247#\274^m\024uq\370*\250\311\003\306\361S]m\217\344\211[r\355\230.Z0\304\251T\030`G#nI\343\033\207c\334\306\3423^f\035\340,}\350\254\202\302\003\\/\242\232\307Eh\257H\004\366\033-\242\340\317\042H\322\025y\032W-\270\253Fv\251R\312\354=$\234\367f\353*\255w6!\305\321\323m@\276\252 \201\224\357mP\351m\265\321\334\022\235\252&\267\322\030\342\211#\026\363U)\221c\301*\343j\201\210\300\334\301\262A\031\334y\244\312\264\332%\323\042\376\275#\257\222\007\260\227\033D\375\227gj-\027\342_\203\372\326\277Ex\231W_cik`7\032J\223\032H\301\367:\326C6P\313H\315!\225Z\025+*\223\265\233\371g\253O\340\365p\330\202\314[\0152\303\246\306\321h\326u\021\262\312.\252\311ap\361\361U\250\253\252\254\321\364\265T\257\254\3515\261\255\224\310\373m\322\331i\341\010\030<*\341\352\336\255\277\226|\366\302\005\015\351e\330\302\3766\276\001\264\032)\265\331\346\344\233G\206\276*\273\305F\321\214\335\341\347\036~\211\226\035mO\246Sv\244\246\244\236\255\241\024\306\012\230\336\261\024\277\030h\243\215\235r\303\357\037NIn\006\321\327\230\302pGc\337\226\211\265\316\261a\311jp j\275\335\260\223\327\232\042\227\304\325\251\232\255\351\255m\253t\362\254\261TI\005\276U\024g\313/\261\230p\347\005QT\344e\324\205\\\027:8\357\202h\341\351g\250\374\206A\214\302O+km\376\253z\265Jt\216W\330\370\376}\362Vf\223\324V_\374\272\303\027\211\226\211\355\236\036\317\025K\336n6E\217\342(\230+\371qSBD\222;\273\264;\244e\021\252,\2403\273(\014\340\274\027\203\276\247\377\000\223T\267\225\2113\316H\042>~J\211\254\352\207(\322\023\037\215\332\037\303/\017$\262\334<2\322u\276 \350}C\212\252\012\313\206\236{\024\322\010\346\021\316<\311#\377\000\344\272\2611\211!I\244Y&\301\012\024\026\366\217\341\014\030\246Eg:\223\233\042A\0224\201\042\004\353?}sj\275\224\210\2217Z\320\277i\235Yi\321Z\223M\350}S\3437\203\024\316\246\276\246\307a\244IhV\202G\215BK_1z\211*\221\010\1771c\220\307*\310\013\246P\247\256\257\304O\017\246Y\206\254\330s\2444\001\226\372\337S\021\251\271\360L5\303\033\002\304{\372\252\206\363\366\320\325\261i\373\336\232\274\335\274d\3244\372\302\375\035\332\351m\272V\322\312\325\325T\221R\244p\317?\302\012I\251v\305L\336S\235\212\025pY\231\313\\\017\257]\2175\035\334\220l\000\027'\254\315\215\267\215\202W\353\033`\356\227\376\027h}\232<x\360\027M\317n\3264\332\212\256\012K\257\235\005D\327:7\376'g\222\232\340S\312\363\227\342\252\2145\020\0052:2$\021\3727\324\177<\313\352pC\206p\3664S T\042\344\306c\232\014\0226\322\334\241h2\234\214\307\372]\345\3427\332_\354\357\247\354\027m=\250\265\336\224\274\334i\350j*\255TqE\025\316\332\363J\243\024\345\343\017\011I\261\036\030\270\000\042\312}`\007\036)\306\270k\211\245X\007\021\314O\316\016\277\312\207\020\004\270\331yoz\361/\302O\025\265\306\220\321:\033\354\343\255d\3247[\371\242\255\250\263\311=5\276\307F\224\342\252V\251\250\236\031\241\226_ \310\312\2204b2\252\317\350\333\277\314P\370'\202q*}\273GdN\2008I\353\006m6\233\024\247S\2479GY]!o\373\020\351m{U$\036\016x\263$\332\272\216\216;\205}\005tQ\334\251\255\013\270!Z\272\252u&&\336UG\225\034\334\254\230R\021\312\371\334g\370\303)-\245Vz\030\362\323\232f+\202\341\013Z\3743\210x\326@\003^c\356\220V\177\207\327\332\302\223\340\353,\226O\0145-\274\302\325t\365v\255MK3H\024\222V0\313\0219)\205\014\212\233\275;\223\014\027\026\267\370\333\026/\335\237\376_\302\311\255\302*8I>\371*\357H\375\231\374{\3247kM\025o\207^#\330iMl\224\023K%\034\360\001S\345<\304\032\211 x\241\004\024Ps\264\026>\245M\316\271\230o\2011N~W\323\200G\373H\204\314?\014\016\271m\264\327_\306\212\364\266\177\207\357\215wj\370\251\343\325\032&Z\203]-\034\257K{\215\205\024\307\314\006:\237.\026\362\310XH1\226W\015\316\0078\321\037\342\354i\377\000f\006\235.\343\366\272\266\336\014\314\320\025Q\342o\331\017^ix,\024Uw\233|\327;\205mDMG_QUF\042\020\252\273\010\353|\206\206PD\205\222Uf\207b.\367R\304\242\177\3764\256\312\220j\010=\017\317\307\344\270\360\240n\347_\337\315YZs\354\305\025\373\300]I\250\351\374/\324\265\236\042i\232\370\3535N\241\262\352\224\270\332(\250FCn\245\217t\301cE\204\267\362<\305i\027.\201\360\336\207\035\360>\030a\262\323i\314\004\346;\354m7\023\244rW\260\374&\233\032-'\234\356\250+~\252\360\323Eh\315S\247<A\321\024\027?\022^\240\322R^\350j\352\022\220.@*\311;:\310\361\253\010\3323\036\331\006HXpXyl]|\015:.\245F\233\263\013I3}\317M\3744\344\236\322)\266\000\274\251v\235\324\272\013]\315\247\264\315\362\317\2545\016\255\212\242\232\222\221\304P\335\377\000\211\3626\321UC.fd1S\230\025\0421\371q\253\347\321\346?^\203\341\334e\014mL\257\243\231\332\314i\033\371k\313n\212\315\014C\037\014\202\017\262\257\035W\366d\267\370\217\2524\376\260\360\037\304;\006\235\361f*\341q\256\265\333\274<Z9\350\336\231\335\244\246\236\216_\345N\253\000\231\244T\222T\222'\215\232\1775C\313\356\251p\332\016\254k\264I \210#@m#\250\330\350\237O0\2074\307\273y*\033\306\037\016\353\355\372\267L_|5\267k\235:\324b\012\232\272z\232\313|\221j\012\210\246\225^y\226Fz\006\247ug\221\334B`c\022\251(Q\210\314\342xV\264\227a\250\354D\233\337\236\327\352e8\271\355\0031\262\346\013}\005\302\206\035Ij\246\202\256\315\025\300\244\267\032Hk\245h\367\323I#Fj\2412$l\042g\234)\227b\203\221\277=|\351\330\372\231\205*\2726\336\177\3326\342\201\260n\326\367\356\312\263\324:\227S\241\253+u\273\324])\3268~\020@\222@$Y\012\206jU\211dD\0426%\263\264\250d\303\2347V\350\322\243P\303\200\274\317?\017X\331fb{Q\377\000`:}\022\310*\357\032\226\033\256\244\260^k-\225!\322g\370\232\003\013M(G+\033\210\310,\257\264\034\344\225\364\214\014\242t\226\323\244\342(\326\323K\036\273,w\323\252]\234+\227E\370\023\366\211\324\032V\335}\253\320\327k\225\272YL{\350\240y\031\021Fgh\305>\031\212\026uc\270\377\000\353f#\031\306\265\177\207%\304\261\315\213\330\237I\036\027Zt\376\037\306\324hym\275?\264\227Wx\033\251<9\265\333\374C\3246\030.\272\012\236\255,\313s\266\314\325\364\324\267\011!v\212\012\200U\2153\262\253\244+3m\230\243\024!\224\365\203\304\270}p\302Znu\365\362\371\011J\342\034\022\245\020\033\210\260<\264P=#\246-\264\226\226\236\305o\267\330\014\011\346\326R\322\321\323\323nVRHT\215\267\276@c\350\310a\200\001\301=y\334{q5_\236\243\313\242\000$\355\347\367\272\302\250\312naa\023\246\251\372\355\2455\034\367X\256Ms\326V\372\2722\352a\263\321\305\262\2408\365\231\014\351+\310\204\0226\341\016\000<0\014j\377\000\311\262\215\027RsXC\267v\243\224i}\367\337e\317\242\312m,\310\013\211\326\014\204\341Q-\356\242\216\226\236\345\005\306\332\2009%bf\014\011\000d\357*\355\352\001\223\335}Cq;z\301\251\214\244\316\3552\034z*\341\217\0033{\240s\327]}\363H \271Q\305j\254\370\3124\253\2124\337>\301\276h\237nX\252\347\314\306\305#\01420;\034\216\264\260\317\316\356\353\240\253\364Z\354\306yj\214\273\\\256\3512RYm\025&\207\342#+4U\234\323\006\012\256\357\034\205_c\016=#\356p\335\311\351\264\353\341\300\227\325\330\330\217\244y+\255y \000$s\374\250K^\257\227;l\267\345\325\332\266\313DvBL\220E\003\3230`T\273.\360\212\025\377\000\312I;\363\217G;U)5\2652\345\016p\336zr\264\317\275S)=\305\222\323\002\322\2246\242\325zb\323\005\255\365\025EE\256DX\274\352\214\221%K\244f?6B\252w\344\0227\025-\263\000r\244\3030t\361\005\316\002\042\376C\355\344S[\211{\000i\323\352\210\204W\325\217\211J))\246\234\027X\021\247e-\273$)\225\344Vua\264\355fS\264\347%\262V\366\202Li{\375\366]Z\276wgq\312-\357\3111\230`\2432Y\353hV\337n3\3178\216\236c\001\215@PW\022\004\362\323,\007\377\000m\301\001\317\014\315\014:\316gX\036\246-\316\350*\324\003\355\356\023\275-%4s\026J\373]\\bo(GO\024\263\017\206P_\342\346\334\356B\237J\374B;\260 \356E\014rG\016\301\031M\317\277cUZ\276+\263\2278L\244\027\012\371\351\332\216\335,\324\344\371\042*\244j\026j\210%,\333!i\275'\311\302\202\032D\010\333\202\251FV=Xo\015eF\031;\317\347\317\302\375\025Z\230\347\275\2404F\232\364\374\240\325[\005\306\342\363^(*\236\012J\211)\332\032Zi\317\236\254\245\213;I\032\237\271\042\241V \344\037b\2354a\233M\231F\274\312\257\210\3048\233\367`\355\346\177\010\204\232;\275\274\320\333\365<\320\327B\014ITi\204\321\250\210\263\025-\26652\222$\003\010\010\301>\274\225\352\233\351\366onv\310;L_\347o\037P\255\232\316\231a\270\372!I_I\251$\266G]\244\353\2563\311\032\315\020\243\266D\364\222HN\304\200\272\264j\263\344\030\266\276[\016I,\030\356y\303\007\002\030@\277>\223:\035U\246=\317\216\323p\222=\015\262\375`\244\222\336\261\332(\322\011\030\301]j\307\232\301\235\035\034\316\301\267+\263\003\2671\340\362\000l\224\263\021\330W\311R\347\241\372D\353\356\372Xc\032a\335V\355\361\307I=\322\347m\267Yil\213\020\202\236\215\240\376S:\241\001\346\252Y\030o\031\233\024\316\2129$\226m\244\363\332\035\000Nk\336~@@\365\223\340\235\210k\210\317\250),\327K5\\\265\303\370\346\232\246\206\215\226:\265\212\276i\015Dg`*\311\352\332\010V\3307\3559F\301*\000e\\#\332\320H$\237\015`\334y[\234\370\252\257\303\226\2740\336\323\257=\222\311i\332\252\236*8nz~:9\263\034O(E\231\001\010\301\025\317\222\370\345\211e\007-\031<\222\361\204@m\310$\374\272s\351\254r\033\024\252TZ/)\216\341Or\212\361n\270\351zf\277!\257\021T\304\332\255\351\0360BF\342%H\235\034\206V\300>\263\200F=@\273\016h:\221\245\\\344tH\206\002\014i&A\371\037\004\372\224\332H\024\304\217\037Y\331J\351n\366\335e\024\325\027*\233\236\236\276l\010\324\321\306&\227\033e\004>\031\314\251\205n\331eW\031\356\275gU\017\245W\263\002Y\261\270\345\317\221\365\204\332\314nL\303\367\023<\375\351d\215,\327\266\216\226:J\272\312\232\011$h\226\275\342y\322)0\\\306\322E#8\221\300\017\263\013\220\030\362\027\253\202\220\250\354\304\213\353r9\304\3326\352~\252\257j\346\013/s~\337\272\353^\375\245\276\325?g\237\010|\036\360\373\306[\265%>\215\270\315\177\267\315c\251\244\026K\245M}3[d\222q\033\304\224\325\253,\321\251\363\032\004\230n\022E\211\367\376\200\370\353\341J\274K\015\227\016\370\252\317\3324\007RA1c\310\314\002n \310\243V\233_\373\206\213\317\355\177\243\257\366J\233\226\211\324\366j\233.\252\265ISMQ\004\325\012\202\216U\010\214\222D\357\205\331\344\230\321H/\226P8;z\374\253\210\302b)\3244^\330x0G\244\364\364\262\234O\017mL\245\303K\331Qqf\222\371=$w9+\005Af\362\245\200\302\361)b\006dX\362d\302\240\304\222'\247\035\303c\255:t\035N\236h\203\320\217\244\371\331>\226\026\230&\034L\236\232\375S\372Y/5\3251U\335\252`\376\025\034\305E8\243\370\232\252a\267p\022p\312\340\210\330\2360J\215\307\223\326}Z\255p\005\237\273{\217\225\345T\251\303\007i%\321\271\367\340\227\325\332i\245\243\252M-R4\365\276\232VX\236\212\010i\021\021rF6\303$\273\367\005\300\216B\243v\321\356z\257K\216\266\204\222%\307s\252n#\000\307\030\222\017=\322\373\236\270\361Z\347C\247,\036$\353=U\2544\335\236&\246\264Eu\271\324MIJ\030*\266\310f\250!Nwn@\312\010*9S\316\320\370\330\324kC\211xn\215u\300\333m\225:\234(\261\301\3173\034\367H\356\267;}\372Q]\374\027Fi\352\230\351\014A,\266h(\343\222\020\2743S\007T\336\013(*\240\263\006O_\004\234\252\374`\342*v\2045\204\354\321\033\364\262\272i\341\334\327\023\356\025G\254t\375\323QT\371V\331,0[\032\234\254\255SI\025|\263\377\000,\030\344_4\262\200\2220!\302 \000\345\367\016\007\254\341\377\000\021\321\303S\310\011s\265\261#k\203\246\276\252\206\0340\023\377\000\212\226\320X*\254Wk\235\316\301?\305\206\007r\307\014D>\311\006\346]\250\2406?\226X\206\015\204\033\230aB\252qC]\242D}:~Q\326\304\271\200\301\266\377\000\337/\025%\270\\\251\255\217\014Md\263Bg3F\313=*\226\373\343t\201\201]\3220Egu8bG\247\324\241*\264\272\250sf\336\375\375\325:\204>C\205\217/\245\264\325@i\351-\325u7J\312(h\236\256\244E\361\222\310\3574\361\253\005.\210]\274\304\037\312l\000\273Sn\315\240\205^\265\233\210\250\326vnp\015\210\000t\337o\345*\267\020sY\235\266\3616\361\020nU\217K\251\326\033E\201\246\244\260\307\250\251 \362M\306\335B\022\246\244\225\012\322\317 1\257\232B/\363\2224r\241q\300\033Q\212\307\273\264/\303w4\273I\036q\230\375S)q\241\2707\362\366|U\271M\366\271\361\342\331Ii\266\301\342\327\332\026j+|u\020Y\303_j\252V\327\024\273|\325Q#0\0210Q\214s\033\025u\333\267\006\303>1\342\302\032+\230\032L\023\364Z\370n&\327\011\001\336\236\375\312\264\255_n_\264\004Z\216\334\332\232\371j\327\262\322Fb\206\266\347GOGw\244\211e\216V\204\\\350c\246\232'\337\004\014$c2\207\2141\214\355\347W\011\376@\342\025\035\017p\250< \217\002/1\345\342\2650\344:\014+\263\301\317\264%\273H\352*\251\365>\220\232\323m\250\267\035\325v\371\326\246\244\260\251]\336tTT.\314\305\325\343\222\251\224\313'\243l\210\335{\236\021\361\214\222\332\255-h\353'^\203\326V\203\351\2763E\227\2435\372\355\365\025\232\334\366\232\315K\254.w\265T\253\256\242\245\264\\\336\337\014\354\206\232\256\343GY$\0065\252\334\261\307L\312\356\004\252\262$I\266C\356\234C\332]L\216\177\177\017T\000\313`\256S\241\360\237H\370mU\257\246\324>\026xg\242t\215\362p\372\222\345f\322RX\246\236\255$\221\001\273Y\251j\347IG\2270\211$\365\2053\372|\320\010\031\365\252\274\270v\206Ct\351\341\351\265\227gk\001\203\035\022\375I\341ut6\235;\252i\356cIi\233\214kIg\273UKQOq\232\201\245\231\204\023TT.\333\224\016\333Y\326P\365n\264\352\204\262<\221\265\\f\002\233\314\270\\\373\363Mc\300h\313\240\376\027'\370\223\366I\233[\334\264\346\246\320W\033\374w\353_\304WPM\247\357u\023\004\221\307\223T\221\332\243\215\244\017*A\004l\245C\314\317\220\350\263\371f\253\250\326\3031\316\303\001\336\211\210\367\327\256\373%\2348\220\362z\250\344\026\257\027\254\266+L6]\001\343\375u\025\246\332d\211\353n\265U\237\303\236\006\250.\316I>Z\306\3229x\200\217`(\214\214\253\023\267\223\305cq\302\240\250\372N\217]\272\042\375sZ\177i\321:^\374v\325Ml\274i\272\3759w\260\321\313\005LT\266\353\315\024\036L\016\341C$S\252\262\312\3574\017\351xU\343p\273\324\006|2\237\305\265\256\307\264\267\241\037}&~\220\232\372\240\201\232\307\325$\323\276\036i\335\177~\245\273\336\3550k\355YO%5\005u\242\373d\021&\246\210\307\360\352#j[\202J\225\241\266\010\346\214b6u\017\013\243\240\351\364\373\034c\034\367\323/q\230\006fzy\372\350\224\010\006\015\206\236\341s=\357\301\317\027\355\222]j\251\340\324\363[\250\337\311\251\244q\032\311\014\215\346&\307\247\005#IX+\0142\251V\004`0\300\360\357\340\357\004\272\243,I\345o%q\256y\263\027/x\321\250o\036\027[,\224\332\242\267U\322\333o\365\362Y\344\202\236r\265\352\221yn\341bd\013\033\270\250H\320\251`\006\345\345p\017\250\370S\203S\317\372\210\222\301 r\333\351>6\262:\024\342\240\017\262\366\027\354\275g\360\003\3557\341\266\202\326\224\017\253t\345~\233\261RiZ*?\342/\017\360\372\031+\026\206J\230%(\013TS\275M\024\214\277\377\000\021\026m\304\226\332u]\210-{\351\270A\023\371^\362_\331\267)\220\275:\360\247\354\317\241\26557\216\225\036!Zu!\321\272\302\325\177\323\027\233\025\005QJ\265\262I%:\320$@7\233,\270\363k\042\253R\036\007\244\2157+6\306\316\243\216c\001q\271\2613}\364\215\302O\022\303\272\260\024\334%\247\232\370\374\360\347D\325\351J\275Gb\271\352MI\252.4\262V[\344\272^\032(\331\312I\261\300L\022\310B\006]\316\027\326\204\250\014\300\370\217\211\270\353]P\232@0:,\333\217U\361j|?\261..\274\030\367>\022\255\312\235\014\026\242\313QK\346\213\204u\346i\222z\211\227\311\314M\231!\303\372\030\035\200\252\200\262*\345\363\216\274\240\370\201\257\244\341R\307,\013\016c^\237MPv\275\322\330\274\333\371N\367}5\253\356F\333Qn\325?\370\375L\306B\321\323\320G6\345\333\351x\345pq\2142\37318\033\200\312\365C\204\361,\033K\205jA\332nG\216\232\2466\2358!\342A\332o\356\311\302\246\327\377\000\304\243\370\352\332j\212\331\250\304W\022b)\023K\036B9\362d\014\341\207\230G\034n(Kar\367q\032A\304\323\230\002\336\006y\353\267UV\216!\254\021L\3116>\367J\245\272\327Q-\352*jkC\275r12\264DIN\025W\011\023+\256\025\266\250#\036\304\2021\310P\304P'!\042\333\231*\366\033\026\003s=\246}\373\204\311-L\353\034R|\031\222\356g\014\032\256h)\331T+3.N\357A)(b\240\006\364\347\276\343\250\332\264\303\205G:=OI\333\3111\370\321S\377\000LO\215\223\204v\3527\232\236\242\222\357w\206\255`h\\K2\311I\015'\226\212\3022\301bE\001\030\011\033s\242\042\340+\022\347\251c\333U\345\214\246]7\322\366\233\001}y'R\312\016f\352\007\327\301C/vI+\254\2657\033%\263I\352y\353V7\246\206[\317\232\261@\256\233\374\267\215\012\226Q\260l\215s\262Gc\202\002\265\234-?\373\377\000\354\016h\000\314\001\363\345\317\305W\250\366\265\275\233\304\227\021\035\016\250\332K=\014\024\266\252\347\242\251\323r\3713*%!fZ\207<\223\027\237\207\210\026d\334\240\005\372\034\225\352\306w\214\333\314t\222<=\362)\216s\001i\322<\376\251\302\256\226YS}\\W\313;\011\347\241Jj\350cZ\244\224\311\271\311\215\325X\020\317\237C1+\2220@\351\324\232\366\211p\016\360\224\302i\002O?\232\325]uD\026\324\247\253\253\242\253\243Ue\363\343\237\317\2502\022\313#\010\233\014\210\254\016T\023\314\234\006\306\025\370vKAh\344afW\307S$\010\371!\321\336k\305T\027\213[\232\372\310*\042\024\2650\342T\336\261\00424LYLl\241\\6\000m\254\312\271B\275E|=@\3506\347\375\242\030\234\3430\264\375\207\364\230\215\356\361Y5\0240k{\275\265\236W\222\242\201\251\246\206V\220?\362\317\305\231\012\262\024@T\042\260RFv0(&\254\263\377\000Q\262v6\323\3029\373\205\241\206u3LM\314_\307O\226\3529\252\247\247\226)\352L3-T\025\236M]M-Y\234C\346\250\337\215\344\311\352X\262;\005l\343\034\261\257J\243\336\340\330\274L\033{>\266U\015F\007f\235\023\234b\342\362\316\217-\212\351Q\344%$\362\320)UM\262\266\326)\275\212\237\346\042\031\011bw\034\037\273\264qM\001\301\302@\333\236\323q\327\336\252\325\034@n\220G\366\232\326i\255\206)\255t\2679i2*\005\017\303\307[,\373\034\222\250VP\305\224\2509\000\356\330\016\320\304\222\3745&\324$\010\315\317O\262\352\274A\360rj4\367\357\301\042{\325\326JK\375\005\025<\353s\362\347\245\222\352ee\254\212\220\307\211\245)\031g(\026G\033\224\003\266b_\005N\3738p\032\371\016\2026\271\006\361\034\274f\334\245R\304c*\346\004\017\317\217\262\233'\263\330\251o\311\253*n\266\227j\305h\214u\042\015\263\324\215\241\347\223i\363\014\262\004\210\031s\214*(Q\206\337r\2669\357\243\330\324d\304\231\004\310\032\301\332\005\355\002>\210\242\3679\344:\042&I\373)z|T\025\3201\324\026\332\372_\042\005\206\210\212\250]\344%\324\216a!\231\225!\225\031v\355R\252\354\017\247\254B\332!\202\327\023\270=9\370\316\242\340\253o\245Q\316\3139\217\276\177-\221\224\232\222h\246W\376!i\250\267\302\351\034\315#\313P\263\246r\271\336\312ce)\335\327\003\013\377\000\362\225\324\341@\231\023qo\226\232\217D\327ghh\036\375\023$gO\324\323AU=\357N\245\275O\235\011\251\016\362\270\301\033\343(\0302\021*\034\375\345,\343\261=Yh\377\000\260\347\006G!\003\316\372\210@p\327!\277U\356\337\205\377\000\342\347\342\006\261\223\354w\177\262\3707\341o\207\367\335O\342E\302\213\304[\305\336\237\343mzW\303:I\266\334c\370\251\014\015HQ\367VL\262(UAJaII}\277\250\270o\304xj\255c\335b|\365\210\021~\243\334-:\2348\346s[p>k\234>\332\376<xg\366\237\373mx\315x\360\303N\325\330\254\326\272\252M&\2153\306*u\015\316\0123O]]\344\253*\306R\240GK\346\267\023\252@\371\365\021\327\306\277\3114\005L{\252a\205\3642\042\355\261\3616\363Y\265\260@\265\245\306I\364\3504\\\315Y\241\265=e\326\361Ae\322:\320\352\253\004\323Ax\267\307G5$\366q\022\020c\255\206h\274\325$\022\033\1779\211U\237\3241\363\012\274/\020\367<\271\244\306\260\015\274\274\274\026elC\2152\032\302H\345\327\327U^MN\324\225\265\024\332b\033\211fq\004a\225\030\314\221\256w\026y\027l\200\022B*\340\356A\237P#\316bp\370w4\012\304\310\276\221\023\037\302\214\016\042\2210Z@\007\307\361\340\226\326_\355\251UR\324S\334\241\247y\2325J\267W\222F8-\271\020\035\243\015\264\002Kz\227\220q\327\224\305\340\210t\264\312\325\245\214\303g\312\323>iS]k\232\012\205\222i\004R\260GDV~\003\035\2736\034\220C\266\010\356\013\003\273\203\320\266\233\211\312\006\237\332:\224Z\366\333m\222vZ9\341\272\314k\250#\222\001\272hj\353\335HRq\265\042pw\375\357\362\003\200\303=\301\353B\215\012\360\015K7\347\313M\375\225\225W\011U\263\223D\331v\270\351\253\025\276\333YOYO{\2745)z\253}<R+\322Jdt\370x\213\341&,\025eiT/\247*\301Je\267\031\206l\264Su\210\271 \210'c\320s\225\223\210\303\277\375\014\312o\242\254k\344\324Whl\266*,I\034\362\265eK\254\256\036W\316Di\202\244B\274n\330Y\233\000\200:\270\352\335\221 8\337\323\335\316\301eW/i-\006H7\032\217]\372\2444\267\233l\272\202\254=]\222\212\211\251cLS\327\230\331\207\004F\3416\304\002\220v1\330\025\243$\361\270u\240\332\2446\0319\272\215\272o\356\312\325\034I{s9\227\277/wJ\222Z\342\265+K\024\226\274F\350\325\036IEX|\302\362l\031,\\/\251\324\2009|1\332zk\352\006\211.\236Zr\205\325p\254p\357\266\010\367\344\235(\250\357\367\332\231Z\326o\202\272\214\304\222S5$\225\302\004e\333\033.\344\334\313&T\002\273\261\274\014\214\220&\236\006\255N\375&\2229\375\377\000\275S\230\347\324\201@Xy\301\374\251|V\177\031\364\275\216+\345\302\243ZZl\364\365>U=E,\223RO\021'\211T\254\236n\011\177(\311\202\231'\221\330\2167\202\343)0\342\003 H\275\267\347\013w\206U\305\323\275B\340\002J+k\032\241\253+%\206\343u\226i\312\012\330\330=d\216J\312\035\270\336\003(Q\226'=\310\003\035a\366\325i\313\205\243\242\326\025\236\034\\w\335K\247\3617S\333\255\025\024\266;\006\232\246\252\002Y\335\336E\023V\312b\333\274\260,\017\010\243\220x\372q\326\227\011\370\226\243Hn!\307/=V\260\306ehn[i\357\242\350\235\023\343\216\237\320zn\337~5v*\235F_\314\270i\370\350\042\225\3041(\330\224\367\011c\222\225\326}\363\264\250\361\206@Y\201\365l\353\352x/\21208vC\037 \301\215\371r\371+\007\023L\272${\274#\255\3765\217\201\322W\273G\206\366Z=?i\262\325Z\244K\211\242{\233P\313\026\325Z*\270\244\212\242\235\332&*\261\205\251`\314\204\231C\020u\260\377\000\023\2070U\244\001h\223sp4\327S\346\273\376\242s8\306\336>\317\232\276-\377\000k\273U%\276\236\331\341\307\206\372\217J\351zh\352i\353\255T\272\266\235i\252\246\252\202\021$\325\021\302v\250\220\302\345\246e\222]\344\272\314\031\225\206\203\3765\244\326\366\200\007\010\326t\367\371U\336Z-\006<\272^\352\375\321\237h\337\005<`J\326\325t\326M\015\256EdsBf\324\367\010m\327\011i\350\325jR\244H\362\320\264\305i\360\225/#$\302\241\343\226de\042\243S\015\307\360x\212\031\232\340\036N\223\023\353\003\356\245\265!\331\215\202\346\335s\342$\263\\'\032\317\304\273\000\376\014b\252\244\227\342\233\315\274B*\202-=k\300\255\022A,S\324\264s\307\210\226$\217(\201\374\225\363x\2362\032H.\270\320A\337\231\345\374+\201\364\352\036\350\321T\366\257\035m\272n\221-\332U\351\3554\365\023\010j y\351'\212\356\306i%\362j\313la\020W/\264\3413\265\275E\312u\234\3760\326\214\263\003\306T\020\011\202\023\205\273\305\015/EG\252\252c\323\372.\357T*(a\246\251\273|7\221\004\222,\210\262Q\307\346\342(\366(_\215\250pQC&7\304\236b\351\361\032L\246\352\254x \2206\004k\240\345\314\365\321(>\233bF\236\237\225jZ\264\326\241\024\272\362\267R\350\273\354~\026UGoW\255\265]\251 \222\276\346\352'\246\206\234\010\343F2Et\022@\305\202T\307;\042\343\313H\207\242\303a\332\3743\231\212\035\323\004D\011\360)\025*\220\343\220\230\346\274\264\377\000\025\3353\341\325\017\201\336\037]4%\253\305\2353\342\025\227\\U[5\025\266\375k\236\232\246\202*\233r\264rI#\004jy#\226\010B\254\221\304\357\346\357M\312\243\255\317\207i\341\232_N\214\207\200\011\315\343\244\372\333\354\256\340\250T\256\363\222\361\353\026\272\214\177\2077\333\016\365\242\365\216\270\267\320U\324Xm\267\251L\325+#|O\303T\315ML\265\006\030\234\020\257%|&\251\034`\251P\247p'\254\017\211(\265\207;\004\035\372\215\272i\013\334\360\234\371H\177\276k\350\313\354\341\366\317\236\371\341\335\266z\275I\035\346\347\025\352\232hm7\024\301wy\331\246\245\201\2439\220CPe\222\010\244!\223%w\024Q\327\206\304Wt\237\177U\350)`C\234\006\336\376\313\347w\307\033~\232\323\337h?\026t5\247Z\307\255+mw\243\361\042\212\3238\2229\252\212M:\314\261\310\364\312\320T\315-;L\200\247\377\000\021\217\177J\342q^\026iP\025\0045\244\022d\213\351\335\026\2356\233\316\234\376\037\361\245&\340\370\205l\033Nl\216\042y\220o\357\242Gl\273j\032q\033C;D\211M\034\015\034\021\302\340\205;\200\362\317}\317\202X``\355\307\271\361M\251M\322\007?~\372/\034\354}C0\330\323\316\023\325\005\316\032\251\352\042\253\271\324\333$\363V3\022#!\201\037\226q\036\024\000\012J\315\307\033rW\325\226\207p\347Hp2}\362Vp\364X\363\230\037f\377\000t\266\0114\245\362\232D\025:\305]\227bTZj\326)\246\223a\340\030\343\021\231\0300r\243n\012>8=^\245Q\324\\s4\021k\030;\365\277\252\264\334\023\034\003\351\010\037\1774\375@\366\213u3B\037Q\325CH\246r\365\321\274\322Brg\221\352\035\326B\344\015\334 `UU\025\027n\032\246&\263k\324\314\0323XX\000=\007\324\357\272\207\321\312H:\355m4MT\332\333N\334\355vZ\351f\020\311]2\255\244\325SJ\364\227%q\277o\232\321\042gk\2611\011\031\275X\312\223\201\243S\204\326\243z\21405\322G\314\373\322B\272\374\017gG;\316P9\357\277\251\376\022\015Ub\322z\256\335n\266\353\033m\257P,M\361\020GUn\204\010\243\023a\026%\034\306\205\243\012\305\275.\310\001\030#\252\3648\226&\203\263\320\226\2155\351\323r\025F\326\245W\274\315\375\374\323eO\206v9\346\262\303-\035\252:\252\032\202i\252\351i-\242z(\2209;\001\303\015\314\354AVF\332[yC\201\325\374\017\304.iqy\312\035crf\321\314N\237%8\214;\314I\270\367\374|\322\252\275\023] \020Qj\222\217\360\201\226\032\331\252\226\031X\253\006\015\022\304\301\210\303\260\306r\204\266\006\322\242\365\0362\322\034\034\334\335@\023\026\320\223\365W(p\222\371m3\003\370\270B}9Kp\323)t\255x\026\351I;\304\342j\321\0224YVb\026E\363\014`\030\361\215\243\004\014\253\022z\257\207}GU\310$\260\377\000~\272\253'\000\323M\245\261#O\341\006]!q\222\215.Ky\274\351[{F\364pU@a\204W\325\3046\024S(\225\031\203o\214\260\0107(\344\021\260h\376\261\364\210\314\302|A\323\302B\250p\314c4\210\33251\264\252\206\365v\323\226!m\274V\321\253\211d\202\003s\247\240h\346UHP$\363\230B\372\221L\233\203+1;F\321\277\323\251\2045\261M\326 \033m\256\203\237\323uZ\206\042\233\336\030N]\000\220l~\251\316\323\256\354MT\266o?PS\324\304\261\314\246x\252!\240\251\215\262\361\255,\205v\316\2462K\201\271AU\005\267)\214g\342\270uzQR\250l\031\210 \270E\256&\327\322c\237\042i\342\034\374\305\255\275\371\375\271\024\256\033\235\015\332:\232M?Qu\263\327\212\271b\226\230\304\356\320\254L\321\310G\363\026I#\332\0131\000\001\2202rs_\025\206\254\322\016\240\357\343\036\375gEb\235:f\237g7\373\001\356R\012\331\242\252U\271\331.F\331;\306bJJ\3727\330\340\264N\316cB\3621\215\211Ep\340F\204\246=ez`\252\3504\252\264:\372\215f\342\001\322#h\271\012\325*\364\310k\301\021\363\374\250v\237\327\272\342\236\341\256,S^\3746\267\324\320\250\026\372\2139\257\226\261Q$'\315\250\216H\013C\033\000\234$\205\233\3359#\255\354O\017\300\265\224\353S\025\003H3!\240M\343)\004I\007\230\0207)\207\026\010-iR\017\374\216\371WOUo\273\326\333\352\252\330$\362-\262\017=\350a\217\015\003\243\371[\225\371\334Cm\0003',\307~N\037\016\352o\232\015%\274\310\327c:\330\035\347`J\251^\273\334`\304\357\341\357\242\213\305\005\012FZ\032{Y\362\353\\CJt\252\177\017i\037\021\210\321\266M,F2K\310\222\000b\007ra\016[J\270k\234\034\014M\335\337\2779:OH\235cU\232Y\042[rm\377\000\371\374\247J;\306\220\226\242\032\306\323\367w\267\325\311\011\203\317\264\224\211c\311\363da\347l\214+\006\005Xzy\015\352,:\316v\012\2452A#\273\255\375\006\227\345c\267([\270:\215\310\036N\321\021\370MU\2654V[m\302\252\357\002\331Z\262/\201\267\301O|\246H\350\021\2432\042>\020\222\304\310w)<\226\345\217 Z\246\036\347\003Hf\002\372\033\337m\274\304z\245W \367\251\203\257\277U\014\222\013-\246z\312\372\0155\243.\224\322\042\012H\251)\3051\247L\235\352c\223\3141\214\371Y\332\314\305\276\366\001^\266i\324/=\347\026\316\263}\255{\023\277\271Je:\227:{\363\335we\272\033}n\252\254\275x\177\374Iou\364\355b\370\332\261L\265/m\017\353Z\241N\222F\026@ZA\034\233\221\220.J\266\360\336~\206\042\245\012\246\215\032\2164\333\373f\327\261\210\230\326D\215\364\262xys\317f\343\357\242\205]-\207J\337)f\276\015\007n\324\365\263\2547,\314\212\227\351\230\003;\306\302/5c\220H\301\031\213\000bub\322Dwz\274o\035\303\350\312D4\010\234\304\230\271\277Y\345\256\241\015j\302\220\007\177\346\326\346\257\215\007\244</\255\373>]\264\316\273\324\324\324>>\305v\222KM\234=\326\357Iq\240\006\235\243A \246h\352\245f\216\254\247\234\314\264\2150fbWi\265\306\270\377\000\017\305\340\335\025@\252\320\006\220dmi\337\256\206\352\266!\216u<\256\375\336v\235\325E|\243\254\250\241Z:\012\231\251\351dB\262\323T\322<2\300\034+D\222\005%N\003)\356\304a\225\266\025 \374\217\023\210\246 \220\011>zX\377\000\037%\347\177\342\236+\3475\010\007^\261\356\024qm\227:X\322\226{\204\017r\211\323\342#\2021\276\235}l\303 m(\025\201l\020=;\267.8\243Q\324\214\2706E\375\373\224\346a\252\266\032\034H\361\367\347(V\332\371V\235\343\210S\334)\035\347U\250\202\031\222)\241/\265S\010$\015\2638\007q\301#\223\214\214\374^P\351cr\236\260N\233\377\000K\177\015]\364\352\031q#]\005\266)\352\220\006\243o6\270\\\024:\244\364\322I+\252\226q\204\376aa\311\013\234:\220T\216w\214f~\246\243\214\275\273\355\341\363Z\214\254\352\242I\217\345'6\371\246\254\236\272\266\032\032\353\255YTG\226\220;I\020;B\251s\222F\366\003\003 \205##\247\325\254CCo\002V=n\027r[\256\322\226R5\033U\323RM\377\000\216\335\036\223d\320\231\20414\257\271eUX\243D\3300\024\253\260\306\320\300v\301\206c*5\331\240\201\346~g[\375B[\270[\310\227\272\343\312Q\224\324\024W\255\2646\353)\263\211*\004k\024J\025rc\014\042l\277<\261\003\177uQ\273\003\357\\\247\210-9\215\375\375\325\212\030&\346!\027-\206\311-=d\302\346f\245Q(0\317\033H\347n\326\362\374\270\216\350\314\206BY\220\230\316\322\277\344#\253\177\362\217`\356\213\363\367\264\0159\370\240v\034\023\017\320\330\004]\263C\351\331\250'\267\351{<V\325\254\3004q\320;G:\004\012Dq\042\223\3477\224\243(\271\334\033\222\011!\347\214\343*\324\002\251\223\267\327\357\272\177\351D\310\321\006\010\253\242\245\253\243\246\236\212\335K\004D\260WXY\240m\2456\302\214\313,\274\240@\252\035\206\300\304\234\200\367\325yd\216\356\237/|\376KO\017\202l\\\002\231&\273\325E\010\215\042\251\222uv\221\352\247\200\307\034\254xlK\030\303;\205e`\215\277\320\027*A\014\3549\251Pe{\247\226\207\356\233G\016\030L\017\227\2774\360\263\334b\232Z+\334p\212\370\351\247,\042a2S\015\333\244o\346\270 \007U\364\271N\010`2\300\030\251\301\336\000$\030\3509\330\177*q8w9\3205\371%uT\032\352\224\334/\246\236\227\340\343qD\325\276|\361\303N\351\316\302\352F\306wRT3\016\024\203\234.-\341x8\024\363\202`\350vX\365p\317\234\343E\021i\2653\336\305\015m\202\225V\235\213\245@AT\233\330n\334\214\316\025C+?\335 \226\007=\217Z'\2076\214C\301q\324i\352\257T\246Z;\273\354\245\332\303\370\215\366()\253\024\030\036A%E\276\013{\244V\252\2173\325\004r\313<\205\375\013\346\020\252\255\374\306R$$\036\254\342\337A\361N\211\347;\\\307\260\247\023Q\304\206\213\267\335\223`\323\027\373\235\237R^\204F\333\246)$\226\2324\232\227\313z\247\021\222PG'\362\245\000\210~\350-\031R0I\003\251\034\015\306\237j\017\314|\276\376)\014\303\275\256%\306\321os\366Q\312\217\025/\232~\331[o\242:\207O\324\305R%\370km4tiG$\245\221\334$l\245\027\005\377\000\376\030\334\037$d\234\2351]\322_\036\374\020\366\365Z\014{\352\231*\274I\244\254\362\205\317P\321\275\255\330\302\036|F\015F\306\014\220\310\276\255\241\324\362v\200\375\307\244\003\225\214\302\342\015\362w\2651}w\364N8\352\240kn~J\337\360\272\213\304/\022\357u\332;\302\255/x\325\232\255\242\255YlV\357*y\253i\222\011e\250\212\236\003\304\223\010\243i\274\230\201\221\226\232I\002\377\000&V[X\036\001\216\254\322\312\014.\235H\021o\033t]\207\342\016|\262\014}S\276\237\361\213\304\237\015\365\032Zt\205\373Pi\212\273\254M\246\245JJ\305\246\206\340\265f:f\243\235<\303KQ\024\302b\210\244\024\001\330\243)\005\204\360\346\361*%\314\303\273\251\334\013\035I\262\012\224\036\322\326\260\220N\276>\307Do\211^(\370\203\342w\204\272\313\302K\366\272\324\262S\\m\015f4\025\213\034p\304VGx\251\244E\003\316hdtt\363\014\255\010U\362\312\343\213\030/\2128\236\037\021M\325\256\320D\332%\273\372\211Z\374\032\233\250\342\031V\011\2031\353ky\332\353\204>\301>\003K\342\367\332/B\350\200k\276\025\237\313\273\313\032\021Q\024\003\371R\225P@\023.\34098\014\271=\217_d\370\211\201\324K\235\316\336\371/\256p\352y\252\333E\365}\366\247\373\010Z\276\317\337c\337\032\374U\323\366;V\246\327\261\377\000\012\244\265\255\226\336\361A\004r\327RR\315y\362dft\257\232\235\317\234\271t\216B\3466*\340u\362\2567\303k\032.u3\336\332\323>\345X\342\037\020\3428}\023\210\301\300\252\330\3130\3503\310\2100.>b\313\347\216\375\344COU\034\365\320H\211,\325$\327\262\357\225\230\226\237vH\303+<\244\377\000\234\2619\034\344\374\3006\245W\222\371s\211\217\010\361\360\217E\371\353\025\202\257X\227\272\247x\3113\251$\311'\2512S]$\264Wzj\272\364\212\333\005TL\265\022\211QHdrpC:\217[`\220\361\260'<\006\310\306\266\017\203\342\252\003M\214:*\270/\206\353Ti\252n=\335#\321\376!imC-TT\027+]]\3227q59o*\242\015\310\034\305,E\212\243\343\007k\010\303\023\351\316p\025\305\276\036\306a\262\265\354\215\014\354|\367\036\012\263\260.\244\343\323\301\025U]YW5\302J$\226\212\242\2502JR\272e\216UL82FK\026\332\3026\014@d`\010o\273\326m1P4\270\355\340\235S\365-\000\346\261\266\373\351>\005D\240\250\253\241\272--M\362\353A]N\216\036*i\032v\215\202\215\356\2616\\\020\254\331e\033\200\372r\032C\334\320r\333\231\266\373\355\344\243\016\372\254q\017\326<|T\272\207]\335\222\031\322\013\214z\206\216\276UwzH\\B\316\336\242\342,\262\203\264\021\310/\351\356q\236\2022COu\243c\267\277K\331\011\342\231\240\013\373\345\262\220A\253(+&\244\231\242\370\006\215|\340\365%dVP\337\346VF\333!\\\200\300'\261'\214\365f\223\255\220o\257\271T\331\211\000\002\000\314>\376\307\317\242V\265\264\261@i\026*4\334dZZ\230\231O\2246(*\244\037/k2\206r\205\266\225\333\236s\323\235L\265\256\015\001\323\002\363?\213\215\210Z4\337P?;\342\017\277NI\005<\363\371\021FH\271SF\261\311QU$\322C$\013\303\223\023\215\312\262\015\333\275\030 n]\243-\225Ai\220\010:GK\253\254\304\26441\337\273\241\367\242c\254\323z~q\002\334`\267\\\236IPF*\366\227\246\2267-\225R\271E\033\203\007\300m\340\003\270d\033t\370\205v\263\376\253k\350u\323[*\324\332\346\324/{I\367\375\377\000)\331\364\356\222\264\334i\357\020\320i\273=\342\266\232Jttha2F\2440;J\251q\215\205w\256I\331\227\\\002\254\245\304q\265\250\206\275\307+|`O\277\252\276\346=\362_\270Q\017\020\2749\323\267k\305\276\266\354\372\013V^\350\2435t\362IL\363\210\025\324>s+\252\371\251 L\177\371\307\030\307\335^\275\017\013\343\365\350\261\324\351\274\265\217\261\203cn\202n\017\314\252\215\341\341\204\221w~9\2451\330k\250)j\351*$z[H\205\366l\226u2\253\277\335\232\237s\201\014\214\314\353\206\223y\334HM\305z^\042\250\020Xd\333[xA\334\204\366\322pu\355\032\302i\255z\330\341\250\216\323w\226\345<(\217\024RX\312H\363\243d\242s\345\260\003h\017\351\347z\263d\206\015akHi\037\376\332\363\323\256\260~\350jaZ\\s[\313\371J\003,\322\311\035u}=\012\316XPGp\243\232\215fl\340\225v\031f\362\300,\233\233k\354\306x\336\206\270\265\222\340\014k\336\037M\325\237\322S\000\223\246\232Y+\276\331\314\025TQ\275\226\222vjjyfdU\224\277\014\340\025\014\011\3112\220\305\2121 \234\234\250],x{KK\256'\237\313\334\332\025j\230F\306x\261\265\222\024\266\3055\021\254\222\202\253N\305#\245*EB\030\326\324\241 *\264\221,\211 .\214}A\224\042\266X\205\364\315<k\231P\322ox\264\\I\002\302b\373}OP\206\246\024d\226X\223\323O\232a\270[\264\275U\216\30796j\213\25245?\023%\014\305^du\222\005z\210r\004\213\263&^\321\220\312\000 \250\263R\275jU\013_#PE\267\261\020y\362\336z\312'\321\000\202\042\336\366\344\253\377\000\341\227\313BZ.\017v\323O|\251\214\255\322i\215]LU3\226M\236JONe$\254A|\266\001ANK\357Ru\2340\325\213\332\001\312?n\200\332d\03017\326\376\000#\304\226j\012Y{\324\267Y\031\251-\0322\327\253\257\025\0223PWII\025\025\015\034jI\221\032I\246>r(^v\240u0n\334\340\262\365c\206p\312\024\231.\252[\314L\223\345\026\3630|WS\256I$|\264\\\341_\255l\024\332\337Y\3255\213Qi\350fX\236\2525v\246\246\272\325\246\330\203\177&R\355\265\003\025o\346.w\200\027\324S\331T\341\030\227`\351\260=\244\0178\0277\264\0113#_\224\242\225R^\355\327\252RX\255\025\267Z!\035M\246*\307\254\231\215|\265x\256\337\211\030&\042\247]\333#\022\002\312\037r\230\367\226)\207\371%lUGNF\330\304\017d\352~s\0353\261!\215\251\230:\010\004{\270\346\210\363\355\321\334\222\317t\275\322\311\250\355\363\265<\021\230iRZw\334\363\371\020\3038\016&\036d\316\004j\355\206\220\235\2521\327\034-sH\276\010i\361\266\322zi{\004\343E\315`k\216\236\302nj\012[]\267\370\214u;\021$\212\256[|P\243A\023JK\231\220\026\001}8\335(V8\220\000N\341\266\200\254\0110s\021o\177m\021\325\317\220\366.\271\347n\2069'\032cv\266\321S\255\316\343\016\237\201\341\025~E|\224\364iX\313NZA\346\260\012\334 \344\356\333\346\242\367,:\027Rn\245\273\350.nw\035N\223\364T\252ak\324\226\270\200=\374\265M\223\265\330\333\241\206J\213E\024\240\263G]\042$\222H\371\334\207\215\231\211Ye*\301\025\267\223\234\215\2442\213\250\366\207=9\004\033i\244i\027\237UY\270\372d\007\010\221\265\375-\270\037\332_Ys\266\334\022KU\267QR\300\360,e\332\334\263\212\262\2546\264\022\262\306\021\006\3572Eq\345\250\330\331m\3000\253\216\240\0315X\330\004M\304\375o\323~\213Y\265jT\246*S\027\032\373\372\024\313UY\251%\252\212H/\272\205.P\024\333\032\042\310`\217c\002\233\023\013\234\024m\244\362O9\310\317\2365\031\2344\201>\037\317?MV\217\017\252\342;\344yx'\372}\177\025\326\246edzg\2521\244\2253G>*\245\367\223aw\000\340\026!B(]\315\205\003=5\354\252\346\200Z\032\000\333\227Ue\306A|\244\027k\275\242\255\250\326\325\020\222\246\026h\202\254KZ*\242'r\260`\310\020\003&\3573\3341\004\237\362\256\2556\271\247\264\374{\372\252\034F\274\272)\203#K\373\011-]E\346\216\336\013GMVU\322/\207\231\314C\313g%wF\011 \202\304\355U\3632X|\300\252\036\323\231\262@\365\3325>]\007\212Gh\371\314\015\271{\335\037CUz\270\306\3655\025uW9\331^/3\341v\011\031N\340\2618X\310f\330\344\250>\242\231\334x\013`R\244\000\015l\017z\240\253\210/\2712| \016i\302K\314V\353l\364\366\210\247\246\222\030\026Y`\222\230\030\246S\234\356e\310e?t \000\202\212y9=0\341\013\334\003\310\036j\365\032\255\211c\257\341\311\023%T\223\323[\352\322\335\032\324\252\312\321\224\201\204\220\357*\3409I#\221c\301\014wr\241A\035]\302Wd\032\025\234r\364\215\274u\376U\2728\262bwIm\260\232\262\360P\334\356\225\266\305\224\264T\3652\032\272\231\3246\357'1\241\022D\317\264\260\030\014\3622\002\344\016\275>\035\224;Q\331\234\247\224i\345>\372+\024q9\206S\257\257\271W>\235\254\360\311~/\377\0002\271j\353e\336Y\222M\272oJ\212\367\225L\321\231\243\226J\211\002 \215QXo\036\251\042Uly{\272\3654q\270gQuJ\317&\014\332\004\311\322I\367\264\253\256\253\032A\333\346\242\027\233\267\205\326\353\337\223f\212\375eH\242x\245\232:jq\032\273\314\373ii\347\201q2\246d\033\271y\000Lm!@\363\370\356%F\243\233N\214\265\240G\236\347\240\365\233\244>\263u\002=\350\201\005\246\317M\250\251\356W\332\333\236\242\244\251\231\245\212\266\340\317O\013\310\236\277\2108\226\242b[8`\003\225dw\310*\011\352\024\201y.m\257sc\247K\037\244)k/\225\306~\376\011\362\032=\036\264\013C5\342\252\311wf?\013US\004\317%!\022e\234\240m\321@v3\014\202\310JzU\213?L\245\303Y\224\223\241\002\363\3636\363\272\012\255l\345h\205c[\364\013An\202\272\202\216*T\2501\307m|\317P\360\202\315\024\223\275$E\201\216\240\302\301\251\213 \376Vv\034\206\353f\207\010\006\230s\306V\372\300\347\037Uj\225F\201k\370\365P\215_f\322\266k\264\264\332\032\355O\252tm*\3154\267\372\010\322\226\222\256B%1OEO%D9\247\002\005\214\225\365#0F\017\271\035\346\257\011\242\302jRww\250\337\3545\203\311Q\236\360\2007\360\366\022\233~\240\240\245\241\266\317C\240\2749\323\267\032k\214\010\265\326\012\271\344\231\210\013\033\315U:M\031\211ev\306\3271\221\214\254j\034\036\234C\036\032\326e\000u\270\361\276\205Y\004\377\000\254X\302}\253\255\261\324W\322;\\(5\014\220\264W\210+\256\325\201c\244\235j&\362\236\020\325\025x\221bI\023\314,=3\000v\310\012t4x\205<3\303Ep\362w\004\3651kH\267[h\211\220D\236{\333\323\177\3556\337!\323V\332\272\253\336\216\321:b\242\246\252\216\236\212\242\307SxXm\265\2069KO\011\256h]\250\226\246:y\013V\214\371\006p\300\306w\243\330\341\234w\001G\037N\245V5\324sw\301\344D\030\236Z\210\353\002a^\341<La1,\305\206\265\345\262a\300\026\223\004\\\021\006\360o\042@\233+\267\302\235#\245|_\262\323\337\242\322\226\337\016%\206\252\333\015]\252\222\206x\177\203\032\310$\232KELsLc\222\2427\244\252\215+ c\012\026R#\005}\037\241~\022\377\000\012a8\255\017\325\266\270\354\035v\366r\\nG\373H\021\246\363\254,\177\2141\303\204b\373\012\015&\233\332\312\214s\255,\250\300\340H\023\336\022Z`\306f\230%M|8\360\002\345\340\247\211\025\2767}\237<H\262xG\342\366\241\247\244\215&\273\351\032+\275\266\361\042\304d\235d\363\006\372z\2516\035\373!]\315N\344\250!\230}\263\204\177\211x\006\033\0100x\352O\256\033%\256s\310p\344\336\354\002\000\322A\371B\362\203\343\256,\300?OT4DFPg\254\233\314\365]\037\342w\370\207\377\000\210'\205\343I\370_\342f\271\373(\370\215l\326p\336mtT\266\337\010oW\246\252\370Jw\222\256\236\242\202\333\003J\207\341\343\236M\205\034\224\215\310\007\357\013\365\377\000\306_\010H\016\302\325\313\255\236\017\217#\313\252\352\177\026\361z\254\357\326d\233\020sz\352G\224z\355\346w\210\277g\315\177\240\374\027\361\003\355\035\342F\240\360\317\301\035=Ci\245\256\263\351(\350\004\221_g51\277\363i\337\015D\315He\216<\357\250\013\2174w\035x\017\217\277\301_\011\341Z\361\303\003\373Z\2404I\316C\235\027i\334\356I\234\246`\205\354\177\303\3651\234O\211:\216*\2153A\214\252\372\317\042\324\350\265\216\227\233\300\312H\024\346\013\236Z\004\223\013\215\264\256\245\321\276#i\353\026\266\240\264Q\321%]+\271@\302\006\242\250BA\246\220\002Pz\242h\314\333[h\332\341p\303\037\213>!\341x\337\207\361\325\270N*\271\315K\366\230\220\360D\265\303B$_\241\220\260\207\035\042\230p%\272s\327t\341Un\264X\347O\201HbbED\257\024\321\250\250\3320\274\304\236\262\011g\334\371m\304\034\003\221\327\213\306q\314MVvn\271\352/\345&\312jq\\#\232cC\276\206yu\374(\215\\V\247\273\332\256\260=\302\224F\361I\015E%j\3103\271\200uV\217*\303x\375NF\016:\312\025K\030\346:$\373\215W\237\253\215u\262j/\363\364S\212'\010\311%\025\326\246i \251-\0053\042G\360\253\352\001\243\220\3440(]T\215\245U\212\202\003\221\324?\023hq\361\276\267\376\274\320\327\304\324\251p`\354\214\216\201!Zyi\355\365\324\345X\303\004\217\021o8m\0071\202\010\310\036\353\214\256\343\307\265z\244\270KH\353t\276\366l\357\023\324&\270\344\202Ii\367\301\015\004\022+7\232\207\006\022J\363\345\260\336\3540\303\314\317\335#\226\373\335)\356k\004\265\306g\226\334\247\3051\357\005\322\340@\361\330\242\305M}<\025a\2766\262\017\\\0173\316\215 \230r\011\016r\331\300q\351\316\01620I\324\355A\000\264\333d\247\274\344\022LO\270\345de\302\272aQIUm\212\032i\013\225-*\230\342F\334s\302\356 \261\336\000\317\000\177\365\317M\303\345q\035\254\307D\227\342j5\301\264\306\243[\353~H\226\272\335\012\374U\332\265\3553\010\360`YX=*\355\333\036\302\030\243\237X\303\035\313\302\234\2203\325\334^.\203\007g@i\277?}U\254%lC\213\215W[\345\242s\271\321X+`t\275\333\032\355cI\020y\265\201exfu\223iY\237;B\343\225,\305\360\274c\003\25241\265\233\335c\210\235\206\375-\257\331iQ\255P\2608:A1\357\301;\275\332\206*\372\032\013\205\021\230m\362#\251\221\026\233\341RY\001;\245\336\244D[h\005\261\206\371\001\323\013\036Y\377\000Q\215-\324s\362D\336\042\320a\326\204\307?\360\212y\250'5\332\261$dzxe\025\042\242\235\332f,P\200\212\261\0006\200\020\246\013\222K\022\245t\233R\273\333\223#}.5\033\374\365\350\253\177\367\0156\027\013\301\351\327\336\213\015U\232\351#\323\327\013\255y\253\363\034I_L$8q\272B\345\203\221\226\330<\255\304\037.&\007$\247D\366\026\264v@\210\215-\341\357\252\276\356;F\2512F\267\233G\366\227Zf\266\177\033\270\334\255\2656a0\214\265T1!Y\352\203o\037\314\224+\250\227\036\200YA\015\264\014z\217STf\031+[\240>p\245\234I\215i\203\324\370XtQ\353\215H\264\001I[N\267\0129'\2126\222j\251\010R\350V=\312K\020\204\260C\222\330l\003\201\203\323[\205{\313\273\023`'Mc\361\374\251\245\216\317.;z'{\225\225\032\211WN\326Q\350\355E\042\205\216\262\010Q\332\236\235X;0H%\006Zp\361H\017\247'\016\352[\324\202\276\025\346\215@\332\362\341\310\333\346f\367\004\015\025\223Z\235P\035@\210\336\332[\307\354\232\250/W\013-J\301Y;\310\337\004c\202\246\232\212\032\203\020h\304\220\262LY\004`4\205U2\024n\021\276\010(\256\342<3;s\002\004\303\277v\304\350b|\346\014\336\002\263E\354s\2738\222\005\275\372\246z*\373t\364\022-\257H\352\2339\023\311ISKQl\231b\254\0127\042F\330\334]\344\312\347$\034\027R\304\262\015\006\340\231!\246\240s\210\233\020zs\261\267\344B\200\372l\200\346\375\254\251\032\275#\246\357\325GS\330\340\247\323\363T\244\223TUVH\365\206\256dF\216c'\2326f=\314LL\221\201\206`\031\211=z\206qJ\364I\243\211\022\032`D\010\334\013k\342%V\255\304p\355\007+t\327s\350\2435\267O\017,\324\332\266\341y\324\3726\246\337M\360\350\357c\254\2502\324\325\022\210\256\264\024\243\311\363\014d\264\215\274\224,@\001xmL7\014\306\326\250)\320k\232\353\300p\003\273\321\316\274\003 H\270\203\252U*\324\353\260\226\330LO\361\013\321k\3046\015Kt\253\244\213J\333`\212\246X\236wJ/+\342#\341\000\224S\270,6yx_,p\011m\270\311\371=\014UF\021\221\367\032\031\323\302m\317\303a+%\317k\237\332\0212E\272\353\313\3524\204\313S\247\354\265\266\373u\272\343j\244\233\341\256\042\261g\204\024\212\244\200\373\244\330\373L\2620ET\223r\345H\030?t^w\020x\251\332\207\301p\217\343\244r\275\304\251\025\332g\277\336\231\345\345\340\267\036\216\266Z\304\213GEP\360\264O\005\251\245\271\307#\230\014\210\222,l\301B\301\033K ,\244\372\243e\000\002\001\240*\366\257.\027\313\365\326\367\326\311\265(\345\042\245G\010\3266R\032G\267Q\371f\256J\233\245\251\234\324\314\224\222|9\021\274\316\322@Y\033th\352\221n,\312\331\3478 \365N\246%\271K\210\271\211\362\323\336\250Z\354\360\301$\333{\221\274\237M\224Z\371U^\224\221\301A\245\255\227iEIb\277\305\326\026U\334\240K$\262a\213#\223\022\373\242\355R\305\244v1\202\245E\360\352\256\312\005\305\211\274h#h\272\007a\363\013\333\312\337\331\346\267UO\3602\232\373\215\341\253\343\250\204\204\222\033tN\262\001!f\215Q]\306w\254s3`\203\260m#\356\226\266\243H\311O\303y(\351P\252E\235\004\216S\370MRE\024\224rUA=2\320\256\036\025\232$\021\325F\312\013\355\336\0249]\254}\201*\370\316\321\326\026+\016g\274\333\353\366\371\243\177\015\251Hw\237\007i\353t\364+$\024C\342\256T\265m\026\020\275UC\307\374\262\252\301r\243\031l\250\333\220\300q\225\035f>\230\027\202\017\260\266\350\0265\260L\221\037u\251/\225\325\220\030\247J\352\307\023\037\345\3011xh\262Y\267I\021\300bB\025\356\314\012\214\003\317Z\002\003@\312\004\307\211\360:\375<Uz\230\206\271\304tH%\273RI[[\034\325\224\325\256\273\200IK\230\247\376P\003<\341\361\202\274c\214\225\340d\255\230`\326\311\376}\225\217\211{\301\261\356\237\237\277z'\232z\003\025\232\316\324\346X#\205\336*u\247\205\226(\211\364\262\005E\316I;\200a\235\245\263\202\205z'\324\314\331x3\277^\253\235N\255\213\315\216\211\342\212\216\343u\370\307\261Q]*\034\322F\355\007\224\220 \334\250w/\241B)*\313\3067d1\036\221\266\301\240\036\032\302\3357\277\365\012\367\351\313A\201'\362S\250\322\032\222\256\266Y\032\333_\361\311\206\221pcz|\271\336$Y\010\3323\267\017\312\201\042\217\273\270\221v\021\345\266\036\377\000\245ha\303]\027\217\357\356\252+\351\274\330g\244\271\275\242\373p\245b\322C*\217\376<I\237\362H\215\345\023\220\001n\014d\252\355\301\311\267B\233\3305\201\370\371\376Tb\035PA\000\333\337\3259PF\213I\014\2625dWW\246\370c4rm\217qT\364\340\263\030\333\314.\031\261\367@\001A\004\232\225\361\267\210\270&z\217\227\325^\245\210k\204\223c\352\222V[\356qH\221\213]-u}6\311\221^W?\020\247\014\027\210\367\273r\274\345\016C\000NF\327R\304\030\316\345\024\303\263\2274\312\221\33355\310\\\251jM\341i\353\020\262\264u\036e@\221\225T.\327`W\0122v1;\325G#\205\353V\206!\304Hu\365\035}U\247\022\351\314{\303\313\337E=\323z\213R\331\032\255*-\202\353g\232\21614\242:\202\357\010\230,\273\036\020\035b+ g\217q\310_VpA\365\234\012\265P\035\027\007\177\351\005\032/\222u\007\256\311|\272\312\355t\262Z\264\325e\362\276\343g\2204Wq\360T\220\230\341\221\000\337\347\006_2\223\312\2217\011\017\226%E\012C\250c\255U\270\267\201B\233\213A\327\317\257^J\305\335h\323\222b\250\263\042xc\035\351\347\244\236\265\3575\024\325Vk\215\015\302\222\343I\024\022y~lpM\345R\311MR<\260\225q\344\006ePrK\234\376-\302\252a\2502\233\\\034\\\001\261\234\243\256\267\032\024\212\314\252\000\003\237\277\247\3154\320\350\375s\253/\222i]\023\246u\205\312\343\002\301]M\345[\232i\3153G/\256\022\014\215\034[\312\256[\321\273\322J\222G^xp\354]\232Z^\010\034\355}\343\307\334\042{\013\211cJ\244u\015\217Q\336\352\253(-Z\262\354\015:\310\035i\210\210/\001ra\221\374\326V\0218\001\000\364\262\225W*\027\245\341E6\273\263{nw\237\276\220's\351+&\267\017\255U\300\007[S\316\337\225I\353_\030\356^\017\370o}\326\227\010\357\267\241n\246\215\342J\3525O:\254\225H\251dfUw\215\235\362\306&\030R\331\313 C\354~\027\370=\274O\2107\007\224e&\360v\023$r0-:\230#\232\2560\205\202\362\025[\376\036\237\342\263j\360\013O\352\237\014\374x\261j\375]b\271V\327\\\341\274Z\226\232Y\242\253\236d\251\006\246\236b\202H\326qTr\216\033\313\257\252B\033\320W\367\357\302\370\337\370\326v\024if`\210\000\201\021\002\323\264\016s\272\323\3428<7\023\245B\216\042\257b\352r\334\345\245\315\310Iwx7\275-.q\020\014\203\020\042O\244\236.\377\000\215\017\2007\273u\240\370\177\341\267\212\027K\2645\042\340^\242X)\243Z\215\346E*O8\022\005\2239'yr0$e\353\324V\370\203\210\325\377\000\321\303\265\203\233\337>\215h\373\205\243\207\370\037\341\014'{\033\305j\342?\366\341\360\345\263\343S\020\366\001=\030\350\352\270\277\304\177\361q\361\177\304\277\021t.\276\260h\255\013\240\257\232~\353=\362\300\260\326\325\324\245\025|\226\357\341\215R\3203\371sM\360\233\242\014\340\205\334J\200q\205\323\301cq\017\006\256(\267\243\032\321\363vc\347\252e?\211\376\030\301\261\354\302pqZtv\042\275W\230\332YG\261\2473\006\005\255\027\013\221\274\177\373W\375\240>\320\225\021\326x\277\342^\240\325\321\0117\305L\344EN\254\010\303yK\356\010\030\311 \021\221\317=^\303|9\207\303\325\355\356\372\232fy.u\365\202l\321\320\001*\217\035\377\000'\361N!\200\034%\202\236\037\007\230;\261\241M\264i\271\303G<6]Q\315\377\000SQ\357-\3325W\217\330\313\304\310\374\253\277\205\325\322P\300\314\357x\266\3139l\026\364|D\037\213F\276b\373\035\262q\234\036\277,\177\365E\376<\355\030\317\211(\231\014\002\233\307BNG\371\023\220\364-\215\012\361\030<U<\275\213\367\323\305v\335\366\236:\372K\224\342!Y\030\215\332fF\021$\010\255\214\273\035\244\221\346'\000a\260\024\016\375~2\244\327H\003\275\357\344\255\21457A\006\000\351\345\252\253^\322,\357U%$\322\331\324\302\355\024\357\262d\232\042\006\346%Gs\271@=\363\370\021\321\366e\366\042A\372\354\025\014F\015\324\316i\333[\021\251\345\367\335<SS\326\333\253ji\253f\270]\340v\233u<\205\243us\351\007k\203\036pwzy\000\003\301\004\204b0\355p\001\244\016\277?\035R;w1\245\316\022\006\334\216\336\377\000\224j\254\321\262If\241\222\333J\210\032\256\230A\374\311\331Y\300\362\206Hc\264\307\367\275\007\314\214\202w\340?\376#=3y\345\177\017\226\272\\uW\351\327\246\3233\004m\315<Ig\335T\321]j*d\300F\206\221\013<\202L\252lq\2028rO\376\304*0\030g\004O\351\032Z\030\330\233\373\221\357\221\211W\352ch\265\331\037\240\003QyQ\352\372\352Ku=;W\303~\270E\306jf\2328\347t\354\355\034x\307\0046\340K\234\236\012\202OKg\013y\273`F\333{\363\036eV\257\226\253A\246\322\340y\300M\325Z\216\236\206(\351^\032\232\211\251\003|\\MN\212c\210\250%N2\307\033A$\0068eo\362\236\257\320\301\020\354\225\016_\317>]9l\223\211\355\013\262\366v\345\357\245\372\250\345>\255\256\247\252\370\033\225e\0042\274\262\313N\325\025\006)\004\\\253'\250\026)\264\355\316\030\036\330\301*-\273\207\266\243s\323\026\264\305\357\351\317\232,\023\0110\343\373\276\311\352\012\247\2229j\257\232z\267K\304\000y\015D\201\204\341\203\2270TS\256\031dH\303\225!Yv)\334\244\020\021\211\303\020C);8\351<\206\307\224\306\373\354V\223\0158k\206\202\374\307\262\246)m\3243%a\252\263T\313QM6\331TG\271\343\012O\251\203\015\320\340\356\334\2048\000d\374\306K\251:\2319t\042\322-3\246\267\035~H\261t\254j\261\246\336\364G\211\252g\255\362\204w\243Pj\204t\343\315fX\330\0175\201H\300e\335\270\020\307\221\267\322\027\2204\350\321\30404\260\307] \364\353{\370\254\003N\213\245\316\006\375'\363\364\011C\333,\027\031\250%\267\330\236Z\367V\2045JqP\301F\365W\022\266\342\254\016T\035\340\021\224\\\2046Y\207\305\233=\366\345\036\012\266#\027\207\247n\316\011\367\275\277*6\327\253\345\253\341(\2534\347\360\267\220\313\344\300\362V\0072\262\015\262G\271v\230X\042\000@!\266g\007\017\235j\3744\275\203\376\303i\201\003\355\275\221`\370\245<\231\0303M\243\335\271,V\232\356\346\271)\352m\327H\251\345\212\244\210c\250u\344\031#\220\266\012\256$\333\273\031\013\220r\037\214\366=\330jNk\235-\324l\254\320\306\012\217\311\007)0F\3025<\271)F\353\243\\-\251]d\322\325\272y'\201Z\232\236S\034t\221;!\330Y\230\254,v\010\3169\332C.\302\002\365\227K\030\3079\327$\365\336\321\250\274F\234\264\205\275J\213\\\371-\000\036\236\357\370K\354w+\305\025O\361\032\215O\245$\266\021$1<T\353\004\361\24028c\003\027YN\300\340\260\316r\000;Av\260\\\312\320\332MsH\363\036g[\036~'T\314E\042L\263) o\362L\032\216\232\252\347K5m\266\226\256\212\205*\2224w\266\307PQ\302\306\240\025\222P\222G&c\332\007\257\371\247\014v\200\233\330\00748\271\315\270\006\363\374x\252x\326\366\241\254i\347\347\027\333\225\274\325Ek\241\271PVTGIo\245M5U\014\257$qVFb\244\270\027_.\243s\234\237[\300\305N\335\343*\030\030\301;\030\254Nwf\203ci\377\000\306/\362\026#\362\252?\016\032s8\223$\316\211U\227KXg\253\244\265\377\000\340z\012\242e\244\246\234\333k\240\207\341\366\311\033\311\346\002\350O\226Y\235\324\230\3172\037P\334\2529\334G\024\327\000\312\216:\336\377\000\316\321\276\233ZVn!\201\214\206X\236\277?\351u\335\302\312\353\014\255o\262%e\\\202\240S\325|r,\223\005\217\0020\336kla\276\030\274\261\367\206\341\2251\226o\233\340\261\024@\014$\201\340O\261\327M\026\375j\030\202I\237\015\223\015u\266\271j!\275TZ\276\002\3559\333R\264\322\301\232`Q\334\304$\222U*\023k\000\201q\267y\316\361\216\264\035V\233\232e\342/\255\215\272k\177\037\252\257W\014\347R\227:\035\323_?v\361R\032\212\272\312\255;G\035\327J\327\311ni#4Moa\271TE6\014m\235\225(\345!\376B\207;c\222M\350[\326\334?\017kXk4\202M\244\210\3627\264LL&\342\260\347(\251T\0226\333o\234\372\356\241_\304\355!\222\253\343\344\267_\222\030\302MSw\363\015)\012U\030\273\343\320\254@!72\015\243\014r:\006\324\252\322c^\203^\272r\275\371\352\252\341En\325\255\003\272\004\337Q\244\016\273\3357\3527\266\324S\305I]\246*\226\275\347\231\322S1\332)\226\031\002\205\205c\304\233\277\220\273\275\000yeY\217\230\033\255\216\031\303?\352\005\307a\322\373\317\207\337\242\336\246\320\350.\326\372{\337t\337O_KE<\2256\253-\236\266\025\225f\337%l\373\346\225SlA\0365u\363\202?\222\331\332\2140\007\0126\233\270M,\244Tt\021\021m\2754\336\377\000un\246\030Rnv\266/\316\336\212\\,T\0278c\177\374CPT\316\237\023\032\314\025h\242\271\230\310y\037k\203\0218\224\201\0420,X\003\223\214bcpu\262\270\002\000\211\022o\037]|\371n\216\270ms\230X\217wR\332\275\042\364TB(&\206\226g\213\033\022y\012S\310\252Y\216\347,\240+;>1\223\270\200\023\034\371\230qvg\213\237\277\277%\324\360!\355\042w\372\005\024\216\315]T`zJ\250%\242\021HU\277\365\371\237\313\036`U\221K\025`\244\340\003\214)\300\355\323qT\354\001\013\216\004\026\367m\327\327\370JV\314\324Wd\265\313,\323\273\324l\370i*$\203\313Vq\036\321\202Q\334\343\314\364\005eU\344\200\025\212\252`Ae\207N\177\317\332R\353p\306\210\227LsOZzj\232\012\213\265U\273N5\325i#\230\315B%\013\021\014\343u3\220>\361\334N\004\231\005\231\262xa\251\206hq\024\301\363+=\325\373'\334Ho\235\267R\255\014*\265=\276\372\364\025\0244\323\323\263I=\030\272\274\263PBr\345f\020\356\2130\311\021b\264\356\362\015\3100\243pm\274\177\0044\213!\301\301\302m\327Mbg\323XZx1\332\260\324i\267\2129n\220,\024\224T\372\362\246\364\031\244\222&[\224\021\252\355\212b\254\243;|\265\364\2612c(NK3\015\271e\304Ah\203\357\237\202s\351\274\2037\205\001\326\367\032\261v\241\245\222\256\246\342\220\324\042\210\351\252Y\042@\317\0231x\306\023\356\270a\351n\300g\222z\255U\332\276d\037{,\274U\007v\2008\350\240\264\265U\266x\374\330\042\257\024\325\016\263\270\206\000\251\014\256U\021\003\256N\342\336\220\016W\322\205O<T\252\005s\232\356?ml\231J\203\362\346&\336\355\371D%V\267\251\214\177\005\244\257j=\262J\362\234\307$Q\3420\016\341\301\365\272\002Ts\273\034\214\0218:4\305\335g\015\265CV\213\301\206\033\235S\323\331\374Ct\222k\225\312\276\355l\230\250\036a2|6\357\345\210d\210.Q\267&3\267\225n\354\030\023i\355\022\033\012\271\030\226\303\352\031\034\324\312\303x\274\331'\243\271\317Ow\263\3274\253V\221%\261\314\342x\231]3\034h\312\222+\010\202\262\017\274\244\250\3161\177\205\325}'\002\301>\377\000\265\257\2035A\357\373\325t4\027\273\005d6Z\313\315_\211\337\305g\251\245\232\341\212\352jhj\250\343q\024Q|\033\274u\022y\022\234\027\204\356\376h\336v\203\237\254p:\005\324\342\240\357H\233\310\220NQ\245\341h\026\222e\023s\242\263G\035\311j\242:j\234\2445\237\304i\204\266\352z)b\224FR\233|\255!\362\217\234\202I\244Q(\245v \003\216\254b\277N\327\270Vh\016\334\304X\2357\230\344nP\3469\216{\216\277E^\337\364-l\224\367\2714\305\313R\336lu-\025\270@\225\362\245,r\312Fa\024\305\261\345\205r\347\316l2\042\221)\000\223J\277\007\246^Cg/A\033Lyl\254\022\310\314\340\243\023\320X\326\262\321v\271j\035\012#\271\334ki&\251\243\245\232\232\256\307\036\036\025\246w\220\177:C*\005\306\362\253\033n!Y\203\042)\3745A\256\015s\\F\261\032u\000\177*\247\352\234\333\267M<\264^>\177\210O\216V\255Qt\267\370'\245\356\027\013\215\025$\357{\324sT\310\316\302\245\303\032zP\333\310\302+\231\344P6\231^2\241@\332>\373\376\036\370\013\364\216\253\304\252\377\000\270\312\321\255\206\244\365\2359GU\221\305qm$5\213\310w\246\232\334\224\027(\333\314\214\261\000\343\033Y{\203\371s\327\331@u'\007\354\250\331\300\205xX.\020\\m\261M\034\256\276\234\035\270\316\177y\353\332\341^\332\214\016\013\016\260-$\024\356\211\00456\2716\210\234T\025\306\006\012\220=\377\000\025?\257V\330\320\035\230%\022\034 \251\225\362]\242\216\024$\307\302\006=\330\347\036\335\317o\331\352\356&$\016J\2757\314\236j}\340n\264\241\261\370\275\246\256\322K\345\320Pj\012x*\344g\302y\016\255\014\231\333\311@$\311\037B:\371\347\371\033\001\377\000%\360\346;\010\313\271\324\335\036-\031\207\314Y8\341\177\354l\350\275\233\265\\\032\242U4b\276\252\242\2129\251&4\250VFT\336\217\271$\214\020\204\001\377\000\264)\004($\216\377\000\313\372\201\254|\305\265\036by\374\304\370/A\205\341\256\015-\233r\361\361O\027Y\251\346\206\256x'\202\202\246\242-\344\324,\237\021>HT\330\361\234\262\225N\0279;\230\250\301\342\253*\207\021\335\314\337\0359\217T\030\214\031.$X\037v\367u\000\250\236x\253 K\262U12#\042UC g~\352\276q(U\266\311\200[\324=$\260\306\003^\350\031\300\217{s\352\261\350p\3475\262\361#\177KYj*\270 \270,\224\022V,y@\251)\336\321\005VR\007q\225\364\205$2\266G\004\034\012\257|\367M\310\235=\376=U\214E*l\177tX\373\217\013&{\335L\026\304t\254\224J\356\212\354\305XG,\017\217H\340\345\300\316F{\220\006=\330\332\016.\356\033}\0121W+\177h\034\2749'[\035\327\370\275<\277\302`\242\2730\252\022\255M+\227\005\230z<\322\245\206\331\007\033\003\225'\034\006U \351\207\320\226\324l\003c\042\343\303K\217\016\212\336\013\213\0068Q\042\006\266\027\351\252\042\252\373|\216Z8.\372^\033\344qN\311,\017Jah\344M\244(\022\202Sq`\230f=\271\371\033\024\370wmQ\301\257-\235\016\266\347h\373-*X\272\225D\010$\235\017\323\347\362\331A\316\273\261\024k\204~\0316\231\236\331\023U4\3644\276r\3227\000\225X\227rF\024\314\021B\355\364\030\362\376\205>\243\005\360\366-\3564\305N\320\272,LM\367\223\023:\357y\352\216\233^\360Hh\235\374P\254\276-hm]j\263[\250\251t\205\3762\325\025\024\365P\027\246\250\212\261\002\204\002\025\201\031\344X\300\331\346\020\374\270\3568,W\006\305`\303\233Q\256a\0209\330\365\223i\324\200D\033\252\375\253\232\314\205\262T\336\207QS]\257\367\212\370\257\302\212\350E4\327\034\317-T\214\025\2242\310\310\373\367n\334w3\000J\217\277\265\002\343\032U\033K+\301\313~Z\364\221\347\002`\035\244\252\2651\225\034\3474^c\355\354\250\275L\023]\205\262\377\000\246\027MR\0377\341\347\226*\030\332\237`b\333\245`pK\215\245\231\203\2660y\306N\203j\366r\314CL\215\016\363\347\362\363U%\314\031\351\266\344\370t\345\242\263\254:\217I\327\325\317%\371 \253\324\324\242\005\257\236[\202<\320\242\243$R\210\3032\252\2631H\221T\223\367O\005Hu*\265\\\306\274]\246\303\227\204\333E\245\211\256M2*>\303\327Oq\352\242\260|\024\361G\035\266\357_\252\342G4\261\315S&\004j\312\004_\316U\215\002*\007M\2546\220\017\030\355S\211\343j\212\204\202\032H\026\267(>\366\346\274N3\000\326\202\356~\023\2722;m\271.\014!\273V\351\253\222\306*!\021\274\220oD\310\307\223!\220\263F\241\271\004\220v\216\017\245r\261\030\332\316\007\264l\264\333\236\334\304-l<e\275\374?\033\017\302I\374*\336\221\255\336\226\232\353V\042\257\232\230:n\303\034\260 \000s\031!T\025 \243\207*\373@\005\201\225\237&\034\005\206\273\317\257\250\270\332\352\330\305[(\022e8ES\233R\325R])m\321\314M4s\321\243\3032\207EF\216\042\340 `\300\375\320\200\374\233\356\206a\261\025[V\013,.gMu\265\376\252\037\210%\262\343\023\313\371I(V\372\265T\3644\265\024\325\017\014\321\371\020\303\025\010UUS\037\363#H\201I\003\002\333\201]\336\254\207,\331\265\210\342@\234\355m\310\353\367>[\352\255a\361\015p\024\332;\321\023c$&\372\333P\246\324V\006\324\027\033\223\306\246\245\304\3652 \215P\252$\260I\350\363\021\024\266cL\263\022X\343\235\203a\270\327\324\245\377\000S\004\310\026\326o\032\235`_m\020\324x}\352\274\301\023q\266\236\307T\313=\257K]i)l\226\373\215\004\015G10%\302\206Y}\033YLu\030\021\204p\2460^?K4x\301\003wV\351\324\253M\345\365D\317/f|\374z*\330\246a]KH\032M\206\227\360\376\327X\3214\225\260V]\251\2566j\215A\035|\021E\015}t\214\224\365\033N\302f\221\\,\302B\017\225\200\301\330\241_N[\310a\2501\256\200\013`r\032}U\374\015Z\216\314j\334\351\374\377\000(\367\236\246xm\002\246\331IIEW\346;WS5D\222\313\020g\377\000\326\032)\013\310YT\205\227\000\015\276\237S\036\252\220\001$m\247\362GE_\260\246\342\032\362E\216\236\276\177\302]\2544\366\234\270^ Z-=EGG\025\333e\042\334i\253D\322\253\371\312\004\216\315\261\\\306\003+e\177\231\205RF\325\014\341\370\247\366pIp\215\240\033\301\003c\256\242\376\253D\321\000\367`\002L\217~\371$\024qR\351\373e\301\241\273\265cClD\223\317zj\232H]S>u:\272\211\031Sl\231\332\305\330J\013\024\014T\230\3059\347-6\001&w\2316\202\264\013\233E\2004\364\351\356\351\015\306\333-\306\352\272\206\301\005\270\305\031I\032\256\205\312\271\022\026F\370U\010\244\027\021\312\307#\004/ zr\312X\302)\366u\001\027\026\237I\276\306\332\203\242\232!\217\250\342\015\211\371\365\361Rk\034\026\232\212j\312\351\2546;\235^\330ej\332k\234\264\365\020\223\201\024dG\032\232v\005\006\343\264\357\332\271\007h\214ELcX\3265\355pi&f\014\363\213\336:\351\341u\254\326\264\322\015'\274\006\205F*\251\240\270\335\251\314\343Pj\373O\223#\333i)\325i*\004\250\341\203\032\2018\014\020\035\353\264)\0340<\234\\g\020\246\3129)\310q\347p\006\333O;}\221Ts\2473\006\274\223F\260\361y\245MEk\325\037\301n\027J\232\210\276*\342i-+],\242m\213\360u\037\014\223\305\011\225\237y\204\304\330-#\260\021\343\257\242p\201\214\305\341\246\256\\\244\177\3424\330\022\007>W\346\226(>#5\322\0357\256-\264\3117\307\351\233\355\232\314\0327\250\250\205\345\2553K\032\272\206\234\232\226%Awg!\202\264\204\236\374\017'\361\027\004.$\346`\322\000\260\320\023n\272\364M\252\322\030Fk\037eN\242\272\351\253\205\232\222\242\202\242\344\327\263;\307WL\366\246\202\206Z0\356\0368e\223\224P\011,\331\227\261P{\365\344\353p\323@\347s\201\021nz\316\311U\234\307\214\322&\0235\326\346\221QY\352\255\232Z\314\312\225IGQW\035Lp\3234Clq\312\323\260\334\356\315\224h\202;>T+\2719\032\030^\021F\240\042\233\363>\011\274\365\264m\364T\233O51#q'\356\272_\354c\343w\330\216\367r\324z3\307m;_\244547\013\235-u\227U\325S\244q[\343\244\212T\270QFq,\377\000\025,\323\230e\2132E5<1\355-0'\353<3\340\3746\037\004\334C\362\3255\007\356\027\015\377\000\3329\021\023&\016\261d\366a\351\324\004h9}\302\247\253\353\364V\311_KWOCV\355'\304\322\324\311-$\261\307\223\027\223<\022m\2229\035dFu\310\313\276\327\354\251\327\302qTj\012\205\243A\042lo\343\357\242\032\030V\216\355#}\017\321WWj\353\025Qxg\265\012]\260\203\037\227:N\037\235\321\305\032m>\246\\mU8;[\000nQ\322\033\204u7K]3\362\367\177r\255S\245E\215\227\211\233\243\250o\027zJ\206\260\331\253k`\252\235be\245\025R\355$\256\025\314\262\226\033v\202G\227\225Q\205\003#i\255V\011\223\241\233\355\362\373\2565\232[\335n\376\234\377\000\240\225K|\3240\213\214C\342\222\256u2VO-g\231\345\220\312w\001\234\215\254\354A\003 \270\344\006\307W\232\356\320e\032\037\177EL\327'3[c\177~Z\250\2755\312\256\335h\241\245\236:\212\272\205\215\343\025\357H7\300$\215\212\244X\010`t\376c\017,+\226@\330\031\035H\254A9-rb~^}J\251J\275V\203\231-\326\332\276\363\251&\266SS\230*#\206\2569(*k\376 OI\032\371\216\2420&E\334\242f\373\336`\033\273\037H\026\260\374O#L\355\265\265\267\263\021\320\246\276\265O~j\305\320\236*\\\264}5\335n\337\370\233[.\026\361Mv\266\334\250\215U,\316\312C\276\302L1\271D*\031pv\006\036\234\262\237}\360\257\304uh\260\266lN\236\033\373\362R+\026\272\011\211Wf\206\273\337\265\016\250\326\332\236\321\246b\326\372j\341\033\3075%=\334\273P\242A$\320\310\261\315\033SA:\030\202\371\320z\374\262Lm\042\244\222/\270\340\306\255gTx-{L\330\333\355\036\371&\324aq\016\006\336\354\245z\273Gj+}\246\361-\252\301\254\364U\306:h\351\342\277\324\353\010.\024\225wYi\315RS\225\206\226\030\341\215\374\264\211E3\005Rc\334\273\0261&\246/\341\343PK\\[\340A\007\307M/\246\311\324\230\003fd\225\307\232\273\355#j\321\032W^\352;\345\325\355V\373\015\216}E\035\211\357Q\324\\+$jz\250\307\221\347DDfI&\362\337\314\206=\320\317 \\\271\215\315\336\017\300\205j\254\246\351\031\210\002>\336\002N\320\004\354\202\256'(\226\337\305|\271\324\352\033\326\247\324W\275O\252kg\270j\033\265l\367\012\372\251\235\235\352'\222Fy\034\263\022I,\304\362s\375\372\375e\302p\355\243HR\002\000\020<\027\226\304\014\3453\\\240\247\212\323w\202fC\022\260\226&\034\200\344\361\214q\316H?\237\313\242\307S\002\211\007e\024\177xLZF\372\326\273\202A3\342\216V\033\217\377\000S\354z_\005\306\344~Gh\231\215\241\231\2625\012\364\222UX#e*G\232\2142?\376e\357\3700\376\335{F\305\241a\035L\247\373\205EUd\211\034\013\014\223C\003\030\301n\003\355!F~\254T\375zf.\241p\224\272,\213\024\303\341\375\316\012-C\\a\231\262\227%\224\005l\026)2\237\356\247\035d`\213j\322{\007\376\357\272\277]\2078\362_PQR\3314\216\254\272\352k\247\207\226\277\021\364]]=Y\232\312\265\355l\251\362\352] \202\276I\350&\25045\220\247\021\3071\222?5e?\016\352F\357\300\330\036\032(\203\206u&\274\020#\230\363:\022moU\356i\321ni{\277\264\236\353|\360\266\236\315\252(4w\207U\372Z\256k\205q\245\254][S_\032\323M\024\002:IQi#J\247GJ\242\225\011\344\203\025JBPl\022\267\211\342\030\254\035Jg\016\314.W\310\031\244\023ofu\223\005\\\375 \220\373t\361\\\353qj[T\225v\253\205i\222\356\324\362T\210Wd\3152\015\2469\0225$<e\222H\362}1\263\005\371\355\312\177\013\304\366m\223\335\230\360\367o\232\316\255\200iy\352\267Sc\241\243\204\254V\335;YN\261\313\012\322\311\011\224\300\217\033\243\207M\350\3216\016\374\360\336\240@\316\007YT\351\271\2654& \370\373\376\325Z\270V\323\022\306\353\323\242\216\333))\352,\022S\301_L\265\033R\032\013\261\222\032\304\215\221S~\345\357\023yh\020*\346C\274(\021\356!\2552\235JU3\226\376\351\267\323\307\237\345\042\216\004\006\366q\267+\217\304\246k\255\313R\\l\267F\324Zr\361Wu\240\226\001\276\234\361\360\345\337\273H\256%\004`m\2160\210NCD\241\224\353\325\306\321\250d\221/\026\361\323\230\213\365\223\003R\221\214\3034\211sf4\367d\0305\276\243\215)$\242\237\342j\355\360\205i.\323\232y\213yN\265\005\244w\367b\210\252\341\376\352\003\270\020\275\016\034p\367\367j\262\036N\327\032\367d\017S\021=\025\212\030\226\303K[\021\032\255\303[c\253j\333\237\302\334\254\272\220RMS\262*xj\036a4h\240\035\271\334#\362\311\000\207U=\243nz\346\361\234c+\202\310-\006\326\215'\234\030=}Vu\036'Y\365\014\177\254\3754\366\016\3125>\230\240\257\212MCc\262\331/\223\263GUW,4\361\301\035D\207\324\322\211)\342\012\321\310\3613\271\215\2249V\341p\352o?\217\325\254\361K\024\3675\306@\234\307\310\311\261\002\332o \235U\3124\315Q\231\306\034m\006\343\305/\253\246\246\324V\004\255\264Uim;V\001\222\233\370,\302\255\021\344.\004\017\346\026\370r\012F\350am\243\322\011U\221\272\234\036\026*8VawSc\265\300\027 \334\020D\357\252\327\301\265\365\217\375\215\021\033k\244}|\024F\363u\250\322\272\332\237D\352\312k\235e\342\241\343\222*\372\353L4\202dp\0130(\323$\216KJ\010\215\330\355\016B\310\013\036\235\214\370a\356\240q8{0\002#1q\266\307H\022\006\242&$\213,N!\201x|\001rg\337Ei\012\312K\254\262IQhjG\214\010\204\202H&h#\373\2404\321\343,\217\022\263m\300\304\250\303*\371\353\304b(\326\2422\227N\361'n\235g}`\362X\030\3129s6\240\230\344z[\232}\362#\273PT\311M6\330\325\234oXB\313\023\005Ux\331C\0220\316J\223\235\204\262\267\014\017U\\)\207\214\337{\315\375\363Ic\334[\031=\350o\344\220FC\006\013rYh\351\343ezf\302\226v \206\3650A'\257\016\204\014\227f\340\340t\312\216\226\220F\273\364\360\372\036J\266&\226i\312c\317\306=\363Kh/v\242bYk\314C`\370x\336]\2109+\264\034\235\361\344:\270\334\3443\036\027\000\365[.Q%\263\254\375\277>J\325\026Gx\033\237vH&J\350\247\272\264\272\232\202?/,\213Ve\021\027%\362\204<\204!\005\010<\034\360v\343$\334\355i\200\334\300\222m\267\333^\233\042\247R\251q\246\014\210\222~\241\030\201\232\245d\273GJ.\022\030\244Jg\234F\011i2\352J$\207k\003\214)d\316C\014vC+\206\324\031D\211;t\362\367\314\243\243\206\000:\360@\211\372\230\011\015\302\363Ya0\323T\255\312\256\322\244S\304\315R\221\316\264\301\311\033\337sF\304'c\200\017l(\035z\014%*ovjv\337\307\302\303\373R\372\240\260S$\230\337\353\357\232ED\222\327\315+\333\020\333\356\301\345\232\212rd\012K\354;\302\253\371k\230\204\212\302\022\334\230\275\263\213C\034\360\340*\211o+k\276\275y\365\0115\251\232R\300\013\207A\351\374\256\222\270I\251\232\373Qq\216\361\246\026\330*\242\247\232\266g\2067\253\214\243\241\212'pH\220\030\216_j\240H\310\330\252\014\2076\205\012!\242\304\222\014\362\346>V\002M\316\263e\252\352\356y\316\307Z\363a6\320\013\370\364\372\255\323\307z\326\367K\275\336\373\252*\256:\202\031\340\273\275CH\262\334\252dIf\021\312\023\021\042E\225F\363\020\226\010YA\214\377\000,\331wd\3265\315i\357H\270\201\264\3517\035uDi\236\307\264\016.v\277\324zY6Q-\326\010\352ov\015Y=\004\027\032\2407\325\322\231d\245p\306XKI,\333Zd\222\042\305H\332\373\360A\013\206\251^\250{\303r\220[s\007\327n^\302C\316p^\302C\255\341:\177\0357N\325\325\225\027\032\032{%\342\345w\246i$\226zyDi\003G$\221\371\022\027\213iP\240\303\023\011\013\022$]\243h~)P\024EcW)-\213\215D\310\322\372t\265\256S\360\257\251P\226\277V\330\0356\276\374\376i\256{\273\320\203bK\255\316\012\006\246\023|H\012\365\025A]\302\256\352\207\000\222\277\315,~\377\000\230\203+\203\270\231\205\245\237\376\320\005\310#@=\007;GN\242\006\203+\207\235L\011\027\327\326\333\244\037\024*je\226:\367\2269$\314\327\032Xbf`\3221\333\042\375\366\030\234Hx\3441\033G\334L\354@ql\270\310\330\022z\\}#\244\255\272mp\200\363\006\376\237\177{\245\262Qi\251M$s<\354\004\036\230\346\215\034\232\177\345\207f\215\2312\252Y@9\307\014\330oP9\256\342\025\272\030=}\302\265\207\354\3445\244\350-\247\327\232\310\256\006\272\341KSYn6)R'\215j\236\2368\366\253>\341\346\225R\314\341}\031!\217u;@\013\326\346\027\214\326\014\354s\367d\356}\007\214[\344\025\332e\217pk\217\323\307\222EQok]\326\3415\262\321\005\342\2328\377\000\237%<T\353\231\002\254\233\042\252\332\354\204*\241\3022\251e\343\000\001\326\363\361F\2550)<\011\346t'^\233\253\025\273\306\031\004\245\226\317\214\257\216'\233FT\323QN`0\334\042\226h\352\256\016\261\355da\032\005x\377\000\236T\362B\225m\340nB\330\374G\015Q\214\007\264\004\231\267# \022=:H\203}\262)P\250mQ\226\034\317\275>H\315AJ\206\324i\340\322\372r\351G<\255$u3\310\202\242#\042\304w\302\205\313+\217-\024<\235\203>2I=ba\352V\244\362s\034\300DG\257\345\017\351\237\004\001\000\363+*\364}\277PP\255%}bR\333\345\236\031j\347\206v\016\305[z\224et\316\002gi\300\303\021\263\371az\277O\215\342\251\202\006\366\033\373>\033\3577VF\002\260\037\272\007\216\236\302\035x\266Oo*\222\\\352-\264\236U+EN\011\2123*\014;\263+\310\215\222\254U\211\001\327\323\200}U\351T\252\302Xl\347\357\356'\313\352\256\327\240\342\342@\266\275OT\236\345K]5ekZ\264\375D\220\023\346<\220\305\231\252\346Y\000\013' \031yS\234\025;\301\037>\270\321c\345\217t\235\277\276\245E|>Hs\214\204\246\337\2465|\325\224\025\253b\276\323\300\322\224C\035\272W\2060\303j\243\227\014\273\267\220W%\206d8\030\030\352\3230\025\033L\226\266[\316'\330\372\356\271\324\273\0304\367\372\376J|\324\032/QQ\333\315e~\224\272\351K\032\243GY!\247\2268a@\253\353o0`,\213\034\212\230Ep\243\031!NX\302C\013\210\230\373\373\360K\304\322\254\346\313\207\2759*\252\363GOO|u\250\241\252\250\244\215\032\012\212y+\222\2269Wn\360\265Gk4$nF\022\225\001p\303#\374\256\301`_\210\356\260jyL\177\033,\272\270o\373Ff\314{\262\042\307z\265]\350\252 \266\\\346\275\326\315\032\304\261\177\377\000\\r\252\262\205x*\331}l\2465\010\300s\205*\215\277\227W\341U)U\014\252\042\374\371\363\023\367\262h} r\200d\372{\225'\244Zj\332z&:\036k\355\306\242\253m<\224\325s=\300\273\242\271\211\251#\202I\031R5\2341EfR@gU\000\035\3147\002\3048\016\305\271\271E\364\347}:\253n\244\326\266\010\344\272\232\327\243h\355\225\232+XI\341\337\210ZwTO_\025\035\005\212\333][_[\361\221\025\236i\026\235\244\202\255^X\345\300\001\344B\210\353\034^\251\013\375/\204b\015\022\316\322\217x\314\021\256\323 \304\357\257\226\311UZ]\243\277\013\273/\376\037Y\251#\232\334\360\375\2404\306\220\243\323&\226\306\267X\243\246\243\243\246\250\203u\275m\361\230\243\250\250\042\244S\302`w\306\331\\)\\J\037\325\342;\355p\274\015\271\371hgd,\250\015\216\366_9\237\342\221\342e\343@x!j\360.\307\254\254\365\326\335S\252\345\254\256\245\240\226\226If\243\264\264\320)\253hc\312\377\0006\253\313X\203\204_)\327cm\014\236\313\374o\201mZ\216q!\331\015\255\241#\227\207\310\252X\267\000\0175\341m\276\221\326\256\323VcY)\311\011\042\217\362\003\307?.\276\374\312r\346\225\207T\230*+\251\240\222\321U[e\022$\211\347\011\211V'\322A\332\017\377\000\334O?N\260q\322\327\032d\253\324\000#2\216A\003\3248\212\010\367\271\344\001\376\235W\242\302Ou1\3065V\346\212\324\253\042\313f\273\022\263F\247`l\202J\363\203\237pGo\247^\303\205\361\020\361\221\346\341db\360\345\275\366\350\245\243P\323\315\254\340\323\221\312)\342B\302I\261\367g \366\377\000\371x\374[?!\323\3068V\254\352-\330|\341\003\360\371i\207\224\311\242-\317o\257\253\243\234<W\012id\212m\307\377\000\342.G\343\311\031\317\327\245pJz\003\250\261\372)\307>\014\205\365qE|\273\301j\216ye\226hc\2465\261\326\323\314h*\2366\212i%yL\022\301\346G\037\230e\226&u\334\042P\331e\022'\363\324\374H;W1\207B\341\027\334\233H\033h\276\204Z\302;\272\377\000\036\356\240PP[\355z~\357|\271\315\246\232\343D)'\2475wg\247\255\250\221$\204\265`\215d*\262a\231\360\302]\311P\034d\215\375X\241J\233\350\212\254\207\031\231\351'\372\373.?\274\260\033\204\257W]\355\266\253^\241\361&\367o\227QT\326%R[\243mD\237\027\222\024\306\215SRLO\022\210\331\300\251e\023\235\214\025\027f\347\260a\261$\322\326b\363\241\337I\237-t\325&\253\2522\236v\335l\301\241l\376\036h\317\021t\037\210Mr\361E\026\003p\261Ehxg\216\254\304\263S\314\241Q)\334\305S\022\250\220\310\345\031\342h\320\256wEZxl9\3550U\216f\272\3666\360\266\234\301\224\240\347<\027\021n\236\365Q\215[|\237\\\334n\227\213\275\371\357\367z\246\237\342\352\356f4\254\257Dm\220J\300\042\231J\211^\035\215\261\334\021\270\000\200/\216\342\243\022\372\235\255b\001\021\0065\236\263h\327~\205\011\244\352e\331\235\007\237\275\025jmzn\341\247!\244\256\270\326\013\2754\022\232\021=\021\230\306\245|\257)g\215v\310#V\312\011\013\027\005C\356S\031<\312\325\235Zk0C\343M$s\035u1\276\220\226Y-\203w\037\251\374*\276{m\015\025\262\241\251/\327\015\015_\013\265\272xnp\212\246R\215\032\357\362\32420\227\371q\254\261\256\345#,@\336\275\035|\015qT\207\321\025\006\262\323\032\363663\335\277M\002F'\002\352T\235\032^\351\317\377\000\027\252\255\207O\324\033\225\246K\2015q\313,rB\345\243&%\336\007\251\302\357v\005X.Qw\014\343\2577F\250\246\034\367\202\033\0425\326\376\003K\310\237%\347\260\334)\356\220\035.\327\306\302\336\357\325G\251\253\265~\214\324-\251\353\305E\316[y3TE\011\245i)\221\203\3562\026\331$O\210\\\252\310\252\030\221\267,Xu\352]G\365le\032&\362H\327h\203\270\042\374\311\020v\202\235U\257\241\211k\232I \353\352t\272\236\321\335-\015=\273V\333\351/\323QOU$\225\265Z~\032J\2051\205\012\355*J\317'\221\277\324\304\006\030s\264\200\240tc\214Tq4\353\300\250\315\234KO;\030\273\243\303\2575\350\251\361\262\3407v\374\372\373\321$\325\224\2245-G\253\264\265\222\202\013t\224&\236\343\032]*\305\023\21727\201\321wn\202Q\217\375Gdn\014Y\012\023\003\321\267\342<3\350\006U\251\005\267\214\240\273B.7\023\270\235\365\225c\023\211c\277\355h\274o\313oaS\324Z\023Yh\346\274h\252;q\026\311\242\241\256I)\256\302\245\251&vU1\230e\363\\T\235\303\315\247Y\246\216>A\220\235\247\254\317\210+\341j\271\230\240\341.\314\322 _}[\020\005\240\300'\224J\362\270\234\031mX\267xA\023~\237E%\274\326\275\306\262\001\247/\026\372mV\251S\022A{\232\031\350.\254\322\345i\367*\374M,\203\313\230\002\233\306\324\301\215\212n\353\037\207`\030\030F:\231\024\311\022\346H-\264I\037\265\340\332I\213\233\036nn\031\365f\213\255\357\222\225i\013\375C\333n\367+\3755}\016\244\2324\252\370z\224\006*g\\\254\213\004\336\2776-\341\210m\376\202\207z\341\302\214~+\302\232\312\215\243C\2744\004\035yf\033\030>cI\211Y\314\341\031D\026\023kF\226R\212}Cg\274\323H-\022K\346\300\273%\205&\215\315#\306\344\022\011\031YrB3\222G\253\225\340\003\221[\207U\246;\315\326\015\304N\232}G\366\2700\323 \026\221\003_\237\313\330Hm\265\206K\234\3245S\334&x)\215Dfh\004h[\314\\+\272\272\225]\333\211b0\016\322=%\200\012\230F\232d\272\303\244\033\307^\234\257\262]\0125\034\303TX\037rz#\247\274\323\320Z+$\257\244U\202j\217\203\377\000\347\302\236ECH\253(\311PU_\003\2140\000\241\354\030\355V\037\012\347<\226\023 M\265\003O\025\316\303\271\215s\200\220m\316:(\\\332\216\031&\251\206\236\334\220\313\031U\362\320\177>6\214\200\255\345\272\222e \222Y2\011V\301\034\223\260\374%F\200\351\236\273z\215\274n\262)bj\027vd}}\352\245\257v\265\336h%\261\303\014\364\262\371\246Zd\205\343\216\242`\0257H[b\306\362\372\210}\312O \203\337\245Q\244Z\363U\306O\2111\323Y\002\326\272\333\302\227\007\032m\026?\336\276\302\353=\001]\246\353\364\273\275M4V\251.\364\263\323\012\011+\305\024u\365\017,~t\224\325R\003N\323\254t\364\313\036\345R\254Y\2632\3542:\245\0260\345'3\204I\215\006\266\032\363\361\344\042\025\276\035B\223\351\032T\2140\332:\373\201\363P\255R\272\246\265\254\224\024\326\015/l\266R\226[\204\225\227\337\210\251\2360\350\262HdP\031\212\357,\322\263\210\310\223r6\3248\267\203\241\205\002\034\362\034\342\350\356\300\235\201\037H\022 \312:b\233As\317\355\267?\354u\372(\375\025F\254\257\244\254\271\266\235\271\3204\020\321%T)$5\251Fb\2451\253\324\313\032D\316\002\312\245&hH\332\200\024+!N\213\025C\016\301\331\346\220I\203v\346\034\240\315\354df\274\330\252\306\344\271\240\226\015|\177\215\222\252\273\201\227\316\267\255\320\331n\263:\374\037\2250\206\032\330\025ah\221c\334DQ\215\247\313uU%W\005\3206\356\225\203m&\027\032\236'\2413\354\211\042\362\023p\245\305\331\034g\370\367\316\333\204\244GMO\272\360\306\321m\216\210\254\022\245E\315j\026\334\371#\021\3569\227\030a\205\3132\345\225J*\356MZ-sK\030\001<\371\337S:\376uV\036\363\233$\301\036\273\355\367\224Ua\263\\5\042ISIq\250\246\202\011i\361\374I\313\230\243\224\272A\004\221\200\376^\320\254\241\235\200\216U+\267\206\031X\234C\2150\323x:Z&\302~w\360\202\212\273\234j4A-\361\333\227\275\323\275u\326\333\276\345^\366\273\035\276\001\276g\021\371\213<\201\2303\226-\225\217r0\302\256xA\222\304\341\260N\031\316|\260\021;~\022\233\212ac\237\026\037_\317\275S\\\324\264\365\362\324@\225w\021$2\007\250\347\313\216\001\312\231\014\244\375\360\001L\306\001\034\002N\327\3344h\270Y\243Qo\353\222\321\243\215\243\224\261\373G\317\336\326Mi\005\276\301g\222\240[f\257F\036y@\245\343\317\244\371j\042\303D[2\220@n\003\0202x\325eSQ\300\222'O\224\015}\023\252q\001L=\302\006\237-\024V\242\357k\256\246\255f\202\013\032\264;\226\340i\232D\204\241]\341\321YSo\250\035\221\222\347h\312\023\203\323\250Ss\254D\355\037~\177%\314\304\012\2554\234\177p\261N\203M\324\013\2155\027\376eWo\252\202%Y\240\247\241\247?\304\233\377\000lr\011\033\322\250\321\223\275$,T*>T\002\026\311\247\015\202\301\230\235I6\032_\300\336|A\224.\014\017\310\\A\362\366\020\377\000\200\336\252)\236\216\327\252k-v\366\221`\025ki\001X\261*\021\204n\211\275\224)\012\002\022K\234\240#hQ\030y\357\260\220\011\234\267\036S\177Y\264n\014\257\010\352\316\006\304\017v\272_Z\227\377\000\342\327\030\256\225\024\364t\236j\265%rHJI\374\300$\211\331\266\271\224vY@\003j\242\366\035h\326\251\206\020\032\015\271\353\323\244s\036j\350\307\324\244\343\332\332=\354\230u>\24063-^\245\324\325\026\235\364.\320CWJ\345\035^UQH&\201\245>a\001\346\031d\010\203\007h\302\365\255G\012\312\300T\240&7\336\333\307\346=S\037\304\215G\012\2552\337_wS]5\252u%\373\\\274zJ\343\257.\267\031\314\264\264\3644\025\224T\317T\323\312\221K\024-+\253<\223\011V4\0213;\231\3268\313\027\001\3678\036\037\023P\012l0cc\036G\236\237\230V\033\211\243R\013\365\027\367\013\252<<\245\361\216\333,\327+\3445\025\272\016\325r\376\027T\226\232\312\033\225\362\353U-\014\363S\323y\222\307,\024\352\0056\3317I\010\233\326P\263y\306=\321\360\227d\361[\021\021\342\017\260\025\232\330\346\315\215\376\252\257\214F\225O\015D\036\025\337os\334\225\026\232\2728*(fs#\371;\024\325\371k\030m\345&,Y\001gS\023\300\246Z\370w\273\010\343S\017O[\235\343\230\333\356\017\232\257^\236{\023s\327\363\262\253\265\255\277D\\<A\274P\315w\325V\212\353\225RU\335-7*\273eM\276'\362\321U\251\344\362`\233\312h\325\330\306\223n\220\3121\346\025\310W\022\343\215\252C\305\000\037r]\177\246\237.\205y\274a\015\251\0171\034\212\276|5\272OWr\202\363\246\257\365\363[\250\023\340 \271\325j)\210\206\255\304\261\275[=$\236k*\011Y\314Pp\233cT_-\235]\\?\034\035T\366\200Sl^\011\005\263\313y\360\337[-\372r\370\201 n\235\241\270x\222\037\303z\237\0215V\276\212\033eo\304CSz\270\275-e\025=M(\227\317\247\236\237|\361\226\206jw_,\310\245\246\210\307\034\252_\311\364\042\216g\201Y\362@1$\3170}\372%\324-\200\320\255\312\010.t\376\027\333<4\325\036\011Xb\322\266Ya\222\216\233\371\225Twkd\260\231cp\222\314\320\032\332I\225\344\370\237%\326\010%\2266\215\321\274\256\264\335U\364\351\226\325\246LX\021\264\015n\203#r\367E\227\3127\333\367\307+\227\217_i\275cU&\254\277\352\335%\245\301\322\026\012\252\372\310\252\335\351i\245\223\315\225&\2168\325\342\226\245\352eL\217Lm\022\003\2664\003\364\177\301\034\025\230\\\023\000\035\347w\214\231\271\271\277M\007E\211\213\256%E~\314>\004\334\374q\361*\323\246\321g\245\321\264\222SUj;\242\276\310\355V\366\250H\267\031p\312\222\314\356\260E\220G\231 c\350G#K\343?\212\351\360\214\033\253\352\377\000\365\007rt\236C\231\345\326\025|&\027\267|\035<\327.x\237\247\333L\370\231\257\364\301C\013[\357\265\366\375\222U\255I\217\312\251x\302\231\324\005\223\033\000\336\000\015\214\200\001\035+\017X\326cj\035\\\001\365WH\0159T2Jz\253l\321<\261\230\330\341\221\301\312\260\372\037~\256\262\233\251\272H@\342\034,\272\353\354\301\240<1\361g\307\337\002,~'\326W\332\2645\347R\321Y/\262R\324\010\035b\233z\211<\343\377\000\257\014\0203\177\365'\334s\364\017\206\270-<o\020\241N'\2649`\030\222A\213\355x^W\216\361G\3410u\252\223\031\001t\304\300\032\333{IU\275\327E\212\321E\251h\246\236\202\367,1T\316\020e\032R\240\261\003\270$\223\357\371uW\025\301b\247oL\363\372\255\026\343\200\005\206\351E\014\340k*\270*\042&J\230\241\232d\214r\356\320\250m\277RA?\211\372\364\274\035F\212\257\007]|\322\353\227\012m3`\276\223\357\372Z\246\216\311a\246\247\361S\300\237\025++\255\020\335#\253\323U\225\023\324\332\251#\211V1v\241\251\206\231i+\235\334&\305\217f\337=dp7\003\374\376\343X\026a\253\032\264\340\207\354\042\304\272\375m\316M\327\275\303K\201\004\2229r\352\253\273\222\266\254v:~\024\246\212\256\224\324C,\364F\032\275\215\260I4\017LdN\034\302\212\246GB\362\234\215\314z\014+\273\031\246\347\333\226\272\354|\257k\356\256\020\320\353\224\266\315\255\351\042\206[\016\265\323\320\331\253e\211\244\270G\012\311\345\323\224Fe\220D\024\037-\275 L2J\227N@\311\362\270\216\015\214\245[\264\301\222iM\211\345\277\246\372sK\303\271\301\271\205\201FZ\254\2647\204\260\334\351lV[\355\202\226g\246\247\206H\310[k\204Q,T\263\2601G/\226c\363\242.\271\007\205\001\033ibq\230\332Lv\2437B\001\324\311\361\213\035SZA0y\230R\372\210\344\266\326UQ\320]\250Z\211'v\370\307g\331< \312\022Q1/0B\254\315\347\011VVfly\231\303\217\353\234\017\377\000\220sN\200A\216zm\344\002m6\323e\042\001\221\321Tu\026\031,-5\324\327iz\251h\332\032i\246\255UG\267yry\200Hw\253\005gV\217\314c\263\0127\3626\215L>:\273\010\256\004\215@#\177\015\355\313iU\252S,a \377\000\011f\264\243\270\370\227[w\257\267T\333t\305-D\362\326\334\264\3754B\226\333c\217\341\212\2541\323\324\271\223\311\212I\244+\031\235\311\033p\330\010\242)\374MK9\252\372C;\257c\251\235\271zXmr\252\326c\213\006Q0'\337\277\252\252\251huw\206\254\327\215F\217w\321\002\266\254\324On\006IDHB\277\305F\033\324\0122\312\035F\341\265\263\310s\324\361>\031G\030\013\360_\372\220!\247\236\266?.^@FC)\325\246MJB\374\217.\236S\005Zv{\206\227\276\323\322V-r]\022\240-5?\300\322J\265U\220&\365t\200\206\222b\321\274D\360\345\2671\333\352\000\234>\033O\026\332\320\032Am\340\350\011\277(\270\346?\013K\015E\225\351\007\274C\366U]\346k\305-\316\307Mz\261^*(\353\226X\305]<\225\031\025B\0031\206W\234\267\233#\037Q\022\225U20VC\036\321\261\217\341\015{jbC\273\362\011\004\015$_\237\377\000\346I\215\010@\354\020\246\006\367\211\367\364\321.\267j};w\277k;L\020\352\012[\245\030X/T\2654\251\013\254\210\213\351\016\002a\230\015\240\034\0023\202T1\031X\236\005_\016h\271\342\316\375\267\221\276\227\333\324\035`\302Iy\025f\240\217\177^JW>\210\266\335\355\327\012\032\032\233\304\242\031\242\022TZcb\364\365yM\317\020(b\220:B\212\350\3503\267\202\231\015\326\217\013\302S}@j\220v2v\274\015\210\042I\020O\331i\177\306\320{d\377\000:{\321Gu~\232\261Wi\373D\226-Q\250t\266\273\207\342\276\042\325w\205\326\236\2526\033\226@\255*T\031w\224X\344\205\231\035\224&\305*\356\336\213\007\202\242\307;\265h4\355\336\006l5\235\243\235\224c\270V\030R\356\033\356\221h\323\342\235\005\025\234Z5\246\227\261j\030&\216\236:\353xZrXS\207+\\c>tu \254\212<\254\312\314\252\245r\003\017?\216f\022\236(\266\230ph\023\327_\365&\305\242o6\345\254*\017\247Q\356,c\303Z\333\013\017\232]]5\035\376\333g\247\271W]l\025\364\346\242a]\015\006\323D\231\020\207i\037sH\241\025C\203\264\024#\004\002\307\257<\374[\3509\324\251\305V\330\\\334\357h\323\377\000lL\036f\023\036\301\3316\231|\200u\373\353\177p\223A\006\246\263^\032\216\273P\322\352\233-DT\362SNjW\316\243\221\235\303S\315\032\020\333\024l\330\322.\311\025\231Y\201\013\225bi\341ja\331^\220\310\373\2077\240\026\042gS\254A\032\201\022\263\315\020\3731\301\323\321Hb\202\026\250\215\347\240z\024Y\025`\250\243\226\042\261m\211va\374\267%\020\263\015\216Yw4\237u]\211\316w\020sZ(\310sE\364\275\365\345xh\323h\335g\266\236G9\215\267=\257}\321W\013y\222$\210\326\327RUbA*\325S\244\213\303c\022#\200\361\256\024\020\312W!T\035\241\207G\206\305vD\200\320[n{\362\333\326z\022\231N\231p\316wJ\352)ot\3678\245\267\307n\271H]\243\253ZsT$\231\366\234\250q\032\235\312Tn8un\006N\324v\321\303b\030\177\374z\217\203\026\230\210\327S\362\323\352\005j\230w\325\000RtG\277\302\273\350k\342\324\272p\320S\335\256Tw\377\000%\032\256\212Z\201\0228\246\363\377\000\227\346<i\042\037\344\306\311 \022N\373\225Y\331r\262\\\253Q\270p\034\000\203\340y^$\203\256\226\032n\244\234Np\373e\337\323\323\301K\340\265\313q\221(%\242k\275]E\255\022\336a\227\313\202\253\341j$.d,bW!\204\2068\225\035d\222W\037A\227J\240\007;\235\226\367\004s\034\311?[*\330\214 \250\347S\244A\323R@\352m\276\276;\247:MQu\032Pi\313\255e%;\275|s|%]Dt\223V\031\260\251\005Dr\254j_(\211\271\310]\233YK\025\\\347>\205C[\376\260Z\313\305\311\3536\231\215\340H3`\026\246/\030\332tr\275\340\222<\366U&\261\254\254\270\325\321\336\343\223Q\377\000\016\235\210\235\336X^+Vb#\033\366zX\341\003\205Q\030\003\015\274\236\255Rm7\262d\003\347\177\310\213\205\346hq\007\232\216|\367gM}\377\000:'\031\257pI,\025v\331.v\232j\215\262\275\306Z5\217\316\011\214\315\261U7\2539Rc\030\030\332\007ucV\243\3628\011\2216\344:u[L\005\306c+o\357M\315\372&\213\205l\224\264T\013\015\302\344\030\244K1\024~Z\254i!\363\013 ]\3628\021\256\330\230\272\222T\266\002\023\321\323h\252\343\267!\257\205\3547\271\200U\276\312\225&\377\000\330I?As\342\242\211\250ih_\316\246\247\270,\320\206ZY\340Y!V\014\301\032\022\014C'f\320\021\306\325$\234\222\241\272uL;\000\312\3359\237\017}}a)\356\303\207\026\323\324r\337\247\335j{\275\316\266$\206\335w\256\244\271\305\006)i\232 VJ\206g(U7\206S\345\315$l\333J\025U\014P %\364[H\230{G9\034\243{y\354B\255\222\233\233\230\264\203\260\023\354\304{\272r\260O5\346\252\3175]\323\342\252\252D\211I\010\213l\223\314\352\24034\270#nJ\251\000c\220\033\004\003\223\211.i-\002\326\371_O\017(\365Z\034'\013H\222k\310KM\336\322im\325\025\214\364\322y4\365\021\311I\033\322\203\031e\363\036T\\\203\264\256pI\303+n+\320\206\305L\240XO#\341\007\334\354\254\341]K.W\223\335\210\201\247\326m\371(\313\215\026\245\260\326PTX\357v\250\304\342\032\221$\374|r\235\333e\301\332\\\017@\314x!\301\310\306O\\\314cL\274\203bt\332\042\336\365\346\203\027\204{*v\201\322\356\277/\221Se\254\236\252\243\315\245\202\311\252\226(\202U\307\360>Z\311\010t\363i\344p<\240YZ\021\220\273\302gh\001#\306\233\270\323\332\301\332\213\017\317K\364+XqPFH\236ht\327\033\325\326CUWKMIOQM\005\032\3075<2\301_\022\037-\212\005\362cw\365\304Y\260\236c\366\334NV\305N1\206\254\374\265Z\337+\035-\247Pw\352V\225*\214\252\314\325Y\251\262\015\267\315\241\250\244\275\330\353\316\232\270\313,\223\241\250E\314D\246\326\231L\221\324/2lm\246%\333\267\220A\0124\270W\023\303\323q\251M\305\256\036\177\332\206p\312%\245\372\023\267\325K\253\265\206\2677k&\260\217S@\026\212\242x)\351m\326ZKo\301(\222M\352\036(\243\205\203\371\356\012\356\034\243\022W9\351x\2361XT\314\332\220o\314^\333O\317\252\311\257@g\226\223\001J|V\361F\341\343m\247I\311\256\364\255\243Q^\244\266\255\252}D\0143]\353i\213\017\344IX\314\365/\032\2441\210\324\223\352\33672;\247[\025\277\3108\3270\007\006\333[\033\306\226\367\363I\316\340\003\200\237/\242\343\312j*\375\013\342\014\232\277L\332n\272j\353O\004\226\350\042\211\226\246\033]#D\260T\252\333\332&\247r\330\206W\022\357\334UH$\344&\203\2767\305\265\215\312\340\000\022\004\010u\364q7\372G-\315wv\244\227T\260\345\367]\023p\322\236\003\352\335=r\325:\362\365\006\224\361vj\231\014Ib\262\354\267\316#Y\022\010\352\302\315,t\305\333\033\244\247\246T\223'\323\226,\225\261\374k\013^\200yvZ\246g+I\004\332g\257\225\271\302f%\215\317\232dF\277O\024\237\303\353M\277L<1\333^\367\241\352-h\264\265\225t\2279\204ut\273\232GA\033\203\024\331\362\327\0026q\270\222\254\342\\G\347i\325wj\035R\244\222f\004M\371\037(\327\346\026\266\003\022\314\271Co6\327\347\365]\235\244\355\237\306\277\375B\270\370ol\361Z\275\352X4\324T\226I\326\262\245\323\317\232\224Cr\246\227\320\252&- y\241fR\262<\312#1\017\250\360JT\236\327\026\346\222G-4\324\035\206\332\241\304\275\302\304\003\374\373\011\323V\350\335}D5\364\276\021\351\312\017\021\264\245M\004\365\342\377\000[q\245\323\363U\325\005\370\270$1,\2255?\034\223\315#\032I_\342\374\272gFbL\221\257\260\301\273\263\251\015nfL\314\203\312\336zlUv\341{\260l|\027\306o\207\236\005\370\261\257\257\226\335\035\242tF\242\325z\222I\042\210S\320S\231yb\024<\2162\261DK\003\346I\201\317\271!O\337\233\361F\006\235,\375\240\266\333\333\220\334\364\0101?\012\361\012l\355\237H\206\035\035\250\276\227\332v_K?d\017\017/^\001\350\233\037\201\036\025X\265V\221\324w\367\202\243\304\015UWW_k\3765Z\014\361\3742\342\004\037\013\032\020\042\212VIi\302TI\270=D\310~\005\361O\036\255\304\252\016\326\030\307H\207\035\271X\356.M\364\215.\217\015\2024\3046\366\205\363;\366\303\267\334 \373Y\375\247!\270\321\\-\365\207_\337\3440U\310\362\313\0325t\254\233\244p\032L\251R\034\201\270\020p3\327\334\276\037kN\016\210e\300cc\320,\232\375\327\020z\252b\331Y9\210Q\316\301\306@\000\256x\366?\327\257_\205\252\3422D\252uX\006\352ohQI\264\030!\222\042\373\2662\206\035\370 \021\373\317^\203\006\334\200B\312\254I%Y\364\365\337\033\012.\306*{e{~_\257[\006\264\201uO\262\022eI\274\007\360C[\370\357\343\016\266\267\350\210\355\322\323X\255\225\272\212\363<\365*\221\333\255\024\021+TH\331\356\370U\215#\310g\222DU\311n\276A\361'\306\2648X\253Z\263I2@\216w\213\362^\363\001\360\307\352p\356\254^\030\312m\314u'\300\001\251:j\000\324\225\355l3\352k\225z\332[Y\265\273\341\353\341\255\222ijfjJ5\221\331\020H\271\306Lr,2\024\214+\356\215K!\214g\361\367\374\316\026\2450\327\013\011 u\334\201\363\032\363\213\2538j\3276\277/\177E!\273\334n\032N\310\263\351\372[\344:J\252\246G\251\202'\211 \255C,\206%\210\250\013\032\023\037\226\304\0373\371/\301p6\347\360,#q5\235\333\316v\334\016\261\257=>\274\226\207ld\300\271\346\230t\345\233L\335\341G\324\022\3245\214\334\241\2221C_\0255|h!x\344j\012\232\264\042=\362I\001\014\371P\322\024\330\273A;\330\2763C\012\034\034'c\007\254\351\021\316LH\346\227V\243Z\003\\f=\376\025\323=U%d4v\217\374\213Y^l\237\006\353N\367y\241\251\226\010\204d\274{\025\204;$\004\342]\261.^U\333\234\356\3614E,Exl\226\222\042\016\232\363\217p\254L\200\004\037\2274\232\370\226\333\242-6\211\277^\356v\351mU\324\26557\033\012\321\315S\272M\222B)\342\251\221\032#\004\012\003g2\014\226\\\234\235J\034;\013\207\250]A\332\031\031\242l-\350n\272\223Z\332}\221#\337\2775\000\3246[\245\242\337Kk\325t\366zUS\042SI_S\361\022V\322\000\200GO'\245\232Y\225i',\221\226\012\023*\247!\221H\3275\234\334\304\267\312$\365\327xK\302\341H=\335\017\270M\232\177T\350\217\342u\222Eq\270\351\0128#\243\246\244\216\262\245\240\206\341N\321\226c\276U2\210\214\2212\000\027\323\225s\231$(kc\370f\042\220h =\304\033\213^}4\352'\301Cx\215\026\270\323\006\343\373V\245\015\233\303\273\204S\2756\244\323\032\202\356\265\323\371\223\254\320\307=$-\210\336I\042F\223\005L\220\257\230\026=\345\262\245\261\260`3\365\271\363Qin\227\004\355\310\377\000j\363\215\012\242A\277\260\233\265\245\267CR\331j\254U\032\212z[l\327\012\231'\253\324\026H\010\250C*\311\266\236\242\027\335L\221\004\210\345\034HdL\274\204\242\250V\023\031\3040\316.\247H\3705\306\340Z\340\314\223s\241\265\206\253/\260\312r7K*\203P\336\3744\322:6\266ms\341\276\215\361\026\305!6{m\025eu\316\235\241.Y$\250\246\226\011\242\376h2K\271L\254\200\254l\352\303r\217{\360\346/\033V\223\203\032\322H\233\2155\217\264u\262\256\354K\257\274|\312\2515\016\222\360kUY(\345\321~#\370\265\243\265\303\315QOF\363\250\335OF\245]c\330#VJ\230\325[\007\314U\010\245\366\031\034\355\261\204\342\265\230H\304\341\333R\015\347K\330\021s\042M\375$oT\342\033S\366Y\344\200\007\222\257-\336$\334\250\252-\367\330\251\352\365V\236\253\275\177\002\241\324\324\3157\360\252\251\331\006\305\226EUj\026\2269\025\214l\376\275\256\312G\030w\021\370W\266\004PnL\215\314\346\221\016\346`\023\336\026\264id\042\256%\3048\367\2011\240\277\277\262\350\3315\246\233\324VK={\336j\256\3657\010c\252\2345\262Y\015\024\251+4\214Yb\221w\006$,\241Y\031pK\000H\353\311\267\201\325\242\347S\257X4\213~\355\274'\3310\275\005\\F\030\010{\301>\226M\227:\355\033U]A\242\340\216\361`\272\327\327$h\267\233L\042\232\252v\235\004\033\240\217\017NY\217\234\022\003#\002\244n*\301\206\316\033\341\307\276\207\352\032\374\306?\325\306cC<\306\327\333e?\242\302\327\005\264\214O\277\232]\253\364M\035\202%\266\303x\241\267\336\343\267\316+!5+\042P\316\001\376l\361:\027\212\237v\334K\345\251d\177R\261\301\031\370^\002I\214\204\211\3266\345b>\266:\025O\025\301\030\320\003-\036\314\250U\212+\264\366\3757,4\360\233\225o\227MCQOLaz\351d\362\321!\332F\366v \021\264\207`\011(T\227\025*|=U\317t\203\220\033\314\036w\345\370Y\007\203\327kr\201 r\267\246\373\302m\266U\212\233\315\336J\212\330\353\0053T\011\251\342\246jz\210\042\017\273\377\000c R\0034\212\320\310D\201\267\0146\024\365O\213\360\237\3238\323x\203mL\202c\224\315\304\\wb\026X\303\012`\276#{\375\245O\026\276\276\006V\274\313_q\370Vc\024\2651\357\226m\3058-\027b\321\344\226\340\000\240\344\340\003\347jQ\027\310@'\221\344:\365\217\242c\260\003\270\340\353\013\301\360I+\355\025\267)\245\266[5=K[\035\306ET\247lAA( *7\214ou\316\343\350\030=\206M\230\372,oiR\235\372yk6\376S*V\244\332G(\202\350\223+\240n\332\372\321]n\244\273]\332\212*e\231\255\327z*\305\257\251\024\214\324\3417A3\231%\204\023\211\226\241\213\261\000\257,\205V\346*\213\233Y\3042\346\355\210\322g\317\221\026\346\014\025\223\207\3060\274\262\362,A\367;k\026\363Q\210/\327\232K\225\376\226\311WR\326\312*\310n\025\032\204\212I\036\246$FP\361\377\000.6\222X\314\255\374\222\271\316\011\014#,R\312\014\250\032^\331.\027l\220\005\306\2671=\015\374\321\326fZ\331\230\333^v\276\336\250\273\001\251\325\013d\222\232KuU\014\264pVV%\024\3254\242\231\034\377\000.\246_*\023\021<\210\310\340\354\237\320\013\005=\\\253\204m\022C\36607\215ms=A\324\254g\340j\326\226f\260\231&|<:\201\314j\267]-%\302\375p\236\206\206\331p\255\2664\223T\205\005\240\014L\200+\302$>C\002\\\035\373Hm\333S\314\307L\255\303\334\356\340\321\333\372i\003{s<\340Je.\037U\3038\0225=v\347\350\231\022\353b\270UH\224\266i\353\257\023T$\011F\364\352\251XQ\314,\246\235\243\014]\0320\352\314\354\300\246\012\216GY\370\276\031[\016Hp\042&\374\247\256\232\333@\265\033\210\253`\366s\217^^\027K'\241\250\251\376\033\0154Mj\337B\023\015@d\362\230}\320\252AP\301v\014\005\317\000\014o P}X\226\036\365\371\363\346\264\360\254\355$\023\027\364\362Ha\263\334\377\000\207W\\i%\262\327B\353\035\025T\206\216Wv\252i<\330\234\304\330g\302\307\042\2268*\034(\316\345\002\305:4\210\207\223\002\343M9O?d\2535\260\245\242u\267/\277T\340l\325\222Q\333*\252\352<\266D\024\315EQ2\030\031\312\226u\252\302yl\354\343h(Wpw!}J\005O\3240K\000\271'\345\244o\245\357\320x\252\203\032\321\332\270i\327\227\224{(\210\251\331&\245\257\202X\235$\225\032hQ$\206\235\352\306\346\013\022\251R\262\020J\341\201*2xu\004\252\255B\030\\\351\372\333K\372\015\375BMRMSk\357\310\316\312KD\362\013\254\177\026i\342\370\232Yj#\227\014\336eH\373\241\2246Z/P;\206\031\225\216\354\354\030Y\014s$\352\014xxr\323\313h\225\335\215F\220f\355\037>\277$\355[E\012\265\276\232Z)\356\024oN$\255\246\231\3627\020\342C,X\363\002g/\2721\352*\024\260`:\250+\206\264\270M\214\177^|\371\314)\355\252\332\224\314\376TV\335o\276\325]\236\253\377\000!\247\274i\342\261$\024\361\234\012\212m\230W\222H\330\001\226T+\226\310\033\211\007\0076\253U\246Z\032\032C\206\247\227\313k\370\250\243\204\252\367\313\010=:)-\306\246\362\251MOk\243\256\362\344\250\220B\361\2533\301!p\370&^8\000\220\255\033\002q\222yn\210R\246\331 o\353\346\257\276\241\035\307H\350\231\337W\336\032\352)\326\252\265\354\206Q=uB\274-%=:0f1\274\316\245P\215\240\270\012C:\354$\221\213\364\360@\014\354\027\042\326<\376\274\207%q\270\302\015\315\364\373\240\324\325QI2\324R\351\352\272\332w\232)g\212v@\261\042mx%-\264\242\2226\205\332\012\215\316\303\226$\363(\324|\345v\2379\261\372E\374\012\245\3041\345\355h\246\323\036\375\372&\253N\253\232\216\003Gn\241\226;\036e\246\201\344\2164\250\246\225\326l\026^\345\217\253\270\001\030 '.\207\246\325\302W\033\367\255<\266\237N\223e\211\203\343%\306\030a\272\373\372'X/\032N\256\222\3175\266j\254KG\272:{\2042\021V\007\226K\343\313;\217\251\341\000\022\303i'\322\023\252\275\205pK\353~\331:\021o\343~^\013e\370\252@K\367\367d\326\327\012\313\312\333)\254P\313_\3451\010|\250\245\010Q\202\006\363\361\273g\362\306# \375\376\343\033z,=6\346\313W\245\205\274\277\245b\213\331_\270\333[t\367m}Cl1Ob\271jm\007U\3455K\324\322O\344$\222+\357\220=;/\227\015Dn\026\015\352U\312\271BHf\335\352\350q\006\323\014\354i\007\026\222$\233\364\277-c\327U4p\002\225L\316\332|#\362\256\335+\253\357V\333\233k*xm\327\233d\023\310\322U\324R\313D\366\325c*\275;\311\024\255\036'\206@\003\316\334\211^ \205\337/o\206q\232\354\031\3515\316q\201\004\022\321:\301\266\337]\364WH\252\374\320@\374xs\376\327X\370\177\253<0\266\332|MHm\266\230c\274\315\035<Z~\353WvX\374\237>W\251\267-T[\351`\042)\345\215\331\206\330\275^K\304\345|\377\000\240\360>6\362\312\235\243cqo\251\233\306\272\003\321,\2071\306\377\000?\244\375>\252\257\320\260\351--c\323\363\313e\326w\315Co\246\323\266MO\254b\322\214Z\365g\323p\316\326Y\344\240z\274\326L\224\346\216\235\236\242\010\341\254Z\032*\210\177\237$\320>\365J\325q5?QJr\211 F\3463X\221i\270\261:\011\262\364\234K\342&\342p\014\303\021pd\237\013\00076\346ld\201x\023\017\030\374!\325:\313O\326x\265\342\266\222\361\202\327j\240\246Y\237\317\246i#\223\343\012T\251\246\242V\216\222\014\304\277\021-41oO4f5\336\223\014\372t+=\302\257\020nH\320\033\330\371Xi}\005\327\231cf;3\357\362\276W\276\331\332\026\313\250>\323\236?^tuu\276;q\325\267X(\204BV\244\250\243\212\245\342\210F$H\344E\011\022*\345\020\341FQNG_\2528'\015y\302R}#2\321\256\366\006W\221\253\305\032\327\226T\026\004\335q\377\000\376\035\250h\337\314\376\036$\010r\004r\007\014\007r\254>X\306\016\010\352\377\000l\372\016\006\253H\362V\350vU\333\334x\365\001Ki\341\255\245\216#[OID\3057\201=e<e\224\236\030+8$q\337\037\355\326\213x\345\023a'\310\247;\341\372\321\236Z\007\377\0006\376W\253\037f\257\360\323\361w[R\325\370\227\343e\242\351\341\037\203\226\375/Q\256\033\315E\226\355\251\250#P\321Cn\201[\011\347\273B\206i\266\204I7*\273\224\006\377\000\036v2\207\011\304\361\000\302\306\322\246\367\313\204I\015\226\20052b\372G=\027\230\253\304\260,\252\314=:\315\251U\356\002\031.\002M\363:\000\260\330\022OAu\331M\255\357\226i4\367\207\026\352\355C\036\220\232\347n2\350\313d\225pY\332\232\2368\343\214*\303\030\211\344\021 Zz\211\234N]Is$\254\037\257\347\353\270\226#\023K\266\342\017\317n\203\236\326\336f\001\346 J\372\036#\210\342[H\266\243\316KZDG\200\323\362\225U\335\252\336z\246\203Ai;\036\203\254[\205\007\302\336/rT\235?\002F\305#\370\327d\247\252%\212\242\031J\220\374\244m\031VE\014\026\036\241\250\3525\003_x\324\230\267\316\323\274\316\274\362O\031lI1:os\317`\252Kw\210\226j\353\321\202\236\233B\326\326\315J\364wWzxib\216\250\024g}\257\221%F\307V\335\202\304\260\036\240p\331\270\216\011\212\244\003\335Q\320D\336f\016\336\023nK9\370\232\341\345\222c\344\245vMM\037\360\250k*\347\277\\fH\304t\355\247\253\315B<k'\253\314T\2166\363\220(\\.\325\227\322]W\322NF#\206\261\316\322\304\377\000\260\371\353\241\347\264&\340\361\001\355k\2344\367\177p\272\012\303\037\207\324\263Y*\264\366\236\226\325R'\011Q}\232\246pi<\343,\253\272R$Q\023z\224\207c\042\270\304\230\310=d\342]\276\307\224\373\345\262\364\255\251K(\016m\375\373\371)\245\332z=YB\247Ai\373u\262\363ASO\035E=\266\257\313I\024\022\004l\230IB\262\315.\364b]\227 c\227\024\206-\224\342\006\337\300\367\362I\304Vc\301\031nu\376\225%Us\261S\333\350\352i\257\365TS%\\\362MGdV\202(\321\245\042@\222#\341^=\200\002\0241\300`\335\334\327n1\317\234\342-\275\357\032\371\254'c\2511\256iq\315\256\226\345\023\344\242\265\3254WK\255\337\342.R\325I$m;\265\302\004\2169\303\221\276U\2220<\302\340\207,\236\254\312\006\030\236A\365\236\322\001\350-\265\264\326\337\205\237Y\354w}\217'}9{\331\025Gf\212\262\234\313w\212K\355Dum*\307\345\042GL\274\354\314\250\026h\335F\300\254\254X\016N\011l\335\253\305\234\322\0051\224G?`\376v\320+\364*\234\220D\337\344o\353\272\224Q\325\273Z\357\324\025\367=SCJ\243\024\317,\315U\361\313\0361\024\356\340\253\312\233\001*\250\016\314/e`j\324\342O\016\314L\235\014\035<#ey\330\212l\244\366:\301\277\337\273\252\366\377\000\247\251\357\211Sc\243\325\237\037c\234\246\373}\316)\034m \226;$VPbB\347\030-\265K\341w\340l`8\235zw\247 \215H:\001\341{\317\316\353\032\246\024\317iM\320\015\257\247]y%\266\3751\242\364Uu\341\250\240\265P\335\276\023\314\251\222\012yiv@\247\021\315\344\262\266\034ll\215\250\254\007\014J\014\327\257\304\361U2\271\344\233\332`\334\336'\1772bz\255'\324}\031\004\363\272\221\307\2424\235]\225\3556KE\035\252)\353%\257\250\000\025\241\252\226@\205\247\222\020v\227lE\352|\206laT =W\255\361\036>\246\265\\I\021c{m\261\262/\327\227\367I?\233\236^\0129]\341\275\306\212\216;sZh-t\323F\361QC\012\235\342\231ZA\270G\302\302\024(Q#+!\006R@\310r8lc\252=\317\252\013\211\324\236r/;\357\327H\272\3158'\265\331\317\3566\267\275\366P:K~\261\204%\242\357i\267\274)*\244\340\250\250\202\177.!(H\320\202\261\272\230\366\220\000eR0p\331.8\246\341\335\332\341\236d\351\316\347~r\010\216~I\003\211U\314\0136\337\237\236\372x\245\351n\271WPM\247\226\307o\251\242\333$\242\037\205\016\253+\310J\220\322\266Q\213\002U\221\224\257\335\031\001A\277G\342\354U3\332\232\204\237[\001\310\015\276kW\376n\273\300\014t\314\371&i\342Y\247\252\216\272\222\276\266\031\222j\204\232\246\232Xe\200m\013\345\240\021\205G.\216\245\000h\316\3208'\035\025^=\213i5Z\350.\020E\262\231\336\307\224u\225\247C\020^\347\014\323o\302G\3742\256{\205AO\207\276\323\254_\033[\033\357sY:\203\204\365mf\227` \024b\304\356=\206EW\343{W\003Q\320\343`I\320u<\247\230\344\263+\360\267W\254sU\277\217\333u\2528\252\256\360\2644,\366z\235\315\272\033\255\033l\223l`2E \333\270\215\344q\265\211pB\220\011\013\304\262\235\007\202\363\230sk\276d\031\326<-\315\033(\212n4\334\341m\366S8(+\256\223R\320\374\025\216\351X\312'\247J\246\222\027\247\225\220\031#\336\0339\0001\364\266\016X\200\003\201\326e<@h\220Hn\233\\\003c\340z\252U1\224\351<5\260\351?@\254\3528\255u7)M&\266{\206\251\234\322\307\025\033S\371um\021\205\244\215\205Lk\024\220\217\042@|\242]\311P\240\252\211d\353L\276\273\334\035\2222\314\035F\260mp`\215m\251\336\002n\013\007G\0155\230\350}\372\330\365\346-\315\042\267\321X\376*\232\361Wv\254\242\246\245\202\252\335=mi\215fH\374\270\314m\021\215\302:\202f\000(\332\301 !A\330\306\335\034k\236\354\256l\272C\200\032o3\327O\234\315\325J\216\006k\203\336\215\355o\017\251\344\225[\353e\241\220C\025\326\222\265k\253Zf\247\222\215\252\250\252\025\021\232X%\247p\0265\314f\027\332\214dFQ\207\345Z*\345\015#\227\221\004\365\034\265\231\021{\211X\3707Wk\277\356\004\264i\241\023\357\350\217\245\321zSS\315\023\352\253\377\000\360[\243\325\232\004\251)=L\224T~Hv\221\0365\222\004b\037\0042\242\037(\261%\262\207o\015\214\252\306\271\314#.\244\022\042\307{\311\372\375W\265\245A\265!\271\362\211\364\361\200\223\\tn\236\240\273WXh\357Z\257TYc\242hEt\225{\376*\020\370\214TI\042\345\023\371FE\002B\321\206nIb\303\314bx\323\236\374\356\000f\230\216b\362?\021{me\315\302\276\233\300h\226\352OM<!\027-=}\237\311\242\273\334\351\036\275\307\303KVJF\261\323\222\345\245\011\270\273#1\004\217\362+3\006b\2434\336\352$9\315\230:\010\237\237\207\364\002{0\255\015u9\233\350#\252\015dW\013\215\322\205\345\240\251\217u\\\265\042b\004N\273I,#2l\177-v\263\243\343\226\003\271 \225\367{2\006\260\005\371yO8\215a.\231k\036)\314J\255/\265K\035}\035\005\252*[*\211\245\214%B\221P\012\005S\273\012r\2042\251Nr\316\201\003m,th\341\301i&\346\332i\023\343\317\344.\025L6\027\366\206\350g_\224x\251E\272\252\266I*L\021$+\0236\013\3225MY\332\344\006\221\345\010\034D\345\034\234\227\334\312y\013\325\012\224\000\246'R|\007\312|9+\306\203\334\347N\207\325J\342\266\302\221\004\247\245\247\272WCLJ\312\201\341\370\265V\0429\002\250\033\033\314]\252\241\213\022{\016\027\245S\3019\355\223i\347\177\037\035y|\321\323\300\2648\347:\373\323\311\007\377\000 \246\272[(.T\326\212\211\255\322\302f\226\026p\255J\236b\235\216[\001C1\214\225\030,\254\333Nx\025\351`\\\312\256\243R\316\026\235\246\042}\350UqA\300^\016\372\3367\367\272G<\027\242\320Z+\246\252\211\252\204L\362F\200\357Y\025\202H\2427P\211\266G\\+`\024\007\036\263\226\261\214k\2634@\007\330\276\377\000[\240m7S%\317\026\374\\X#i\232\216\262\201k\252V\317M\202\333L\033\343\216X\221\235\320\306\241\231#\337\265\260\304\206\302\014}\303\2335\032s\344\022@\276\326\236v\237\021\327\252\325f+-\3677\347\247\3317Gh\251\251\027\232(\004\313^\313\020\246r\202#[\351\215<\226i\010\007r\274{T\260\033v\035\275\230>\236(\021\255\265\360\337\3730m*\235:Ms\300}\207Q\357k-\377\000\341U\025\264o\247\005<IM%9\225\252\352&l\316\322\304A~$\313>\330d~\303\313\210\034\022\024\250&c\236\177\355\247\251:t\332\306zk\251K\255\202\005\275\233\257\357\337\242\033h\312\003\025-\272\303@\220\\\252\352\252\240JY\304O\011H\3225uh\335\331\031\314\202\042C1\033\333,N\377\000+\255\012n\304\325\252s\030\210\034\273\337(\006O\220\351)\030^\013B\213\313\351\352`k\352#n\252K[A\015\015\234Gy\265W-)\250\211\345!\020\032\232\206\220\251\021\274d\202\331V$`4\217\224]\230\035ML+\213.;\332\017\236\326\372\306\353r\2630\372=\263\365\326|\224j\256\305b\247\3252\213\255L\326\321MW$\022\264\336j-\252Tf\210\231<\262\310\301\230\042\207\311\014\321eK\007\033\261\234\312\341\245\240yk#oK\371[\252\242\306P5r\202@\326\010R\213\265&\242\247\260\317\005\232\272\236\030\246\222\005\226\205\213\310\223H\031_\310M\215\264J\212O\273\242\256@\003$\365c\007\220<\265\363sh\371_\311k<0\264:5\216\251\342\222\017\024\251\245\3257\012\013\246\245\253\246\212\323Qw\270|\026+\347\243\216\024wz\231\2009\364\3067y\244\001\374\255\310\312}Go\207\360\374Ez\235\235\016\361\326gc\357{\312\012\264\377\000\361\320\351\354)u\343U\353\331te\353N_5,T\332~\253\312\265\315o\250\252\246&\252 \2468\333\310\211VI)\231\245P^,F\253:1\300\220\036\265\013x\220-\251X\300\220 \304\330k\036\001W\354\336\350\006\300\247\033\017\332SS\370rm4\236\037\353\233\265\235\345H \026\365X\344\267\371\341N\361\015<\352\251\272\035\254\031\214{Q\213lb\262\344kR\343U0\365\013h\270\305\211\265\205\355\250\213\217\226\246\311\025\036\334\321\027\026R\333.\266\247\032\207S\037\017u\026\247\265xcv\252\244\202\351O}\225\355\324Wp EXk\251(f\226\011\025\0367\304j\012\204_Ly\005:Y\343\357\030\227\345y,\235\367$\015zr\344\231W\014\370/n\302~\253\347v\012\232\335y\342\254u\262Ch\251\271\336\365,\216C\224\212\225\247\253\254c\201\235\250\221\356\230`\034(\\\016=\277\244\237\014\341\313*S\244y5\274\266\000/\212\361\272\240S{\333\264\225\357U?\331\033\302\333\206\225\323Z+\304]\027-\376\216\315CW*=5UM\004\255q\233\313Y$\315;\306\273s\022\250F\004aI\030$\365\365\274_\302\264\361\004v\302r\365\321|\277\017\361\015Zrh\230\315\033j\274\371\377\000\026/\007<#\360\223S}\221|)\360\327\302\337\0174\005\302m)t\324\327\312\233D,\225w\007\226\255ic\025M#\273\224\037\303\246\221w\271\365M.0\006\017\220\343\034\012\2138\215:T\330\000\015$\306\367\264\372\025\355\370\027\024\250xuZ\365\034I\314\000\235\255&=W\274\2362\320T\350\257\263\305\015-9\264\320\245/\205v[l\337\030\305cb\365\264\022I\033c\324_\013\351Q\202\314\252\241\224\234\365\347\277\317-k>\016\305\265\316\312\322\326\013j{\354\265\371\357\322Vo\370\374\012\234b\225\244\202O\205\215\327\230^%\325x\223\024Wi\222j\013\234T\324\221\323-M\005\024\364\364W\211\333q4\346zw\023.\331W\316\015#\217\375\271\354B\217\346\366\013\207P|\006\272D\363\004\213\3626\361\352\277N\361\014\033\215!\220I\367\356\353\315\257\025\274C\3617B\352\373~\232\271h\353\214\266\311\245d\241\272]ie\250\210\251\362\341\014b\210\220\357L\322L\222H\\\341\233h\345A?C\340?\007\340\315\003]\317\001\332\270\010\032N\204\350\014u\362^W\031\302X#=\216\275<\206\312\317\323)|{\375\026\275\275\377\000\343\265\272\242\216\2028b\021I$\263\314r2%2\254e\221R8\3326\003\205W\\\025m\335yN \321\331\2343se$\233\210\210\3225#p\351\361\013\000\341K\200s\314\216\247Au~i\273\326\232\3246\361q\221i\264\225\302\247\320\265\3254\036k\326T(d\010\224\021\207&)F\310\222U}\355\266&\312\242\372\274\2663\204\276\230\354\203\263\364\032\015\365\264\220u\021\002\373\257A_\017O\261\312\010\007A\326:}\325\223c\361\013\303\373\\WJ\013\236\227\255\256\211\250\032\237l\265\317\002\246\325M\301\311't\314\245wm\011\302\3060\006\342q\035\203\253\232*\210$\370\337\231\360\3670\256\263\212\321k{2%\337\307/\17750\322\236&P\324O}\324zr\313Qf\244\212Z\211\253(\352\026R\264\310\356\212\333\247\364\277\220\005Dr\306Q\224\240\331 !\213`1</\263y\314g\224G\271\265\343pvK\247\305\031Q\207#?\217\343\222p\251\236\305\252\215U\316\212\205+\265e<\337\022\322\333\252\301\244h\234\244\202X\347\332%/\346\271(U\034\355HQ\370\373\364\351p\320\302A:\363\036Z\177W\222\026n1\364\252\200\366\231\323ND\336\372\017\232\254\353)\355\026\212\332Z\272\035]O$\314 \230[\036\215a\236\265\251\344;e\223c\024O\272\2622\247\250e\362\312\000$_\301\010i`\270\275\371O\215\342l'e\217L9\205\304\031\313\240\347\177{\371'K\304\325\360T\352\332\032\253d6;\362\342\236Z{\204\312\317FVF\012\255\042\260\334\354\031W;\233h$\005$\0264Y\203- \015/\3633\365\365\320\225\256q\271j\270T\003\227\337\362\236%\222\347q\246\232\212\226\2269\014/\0255s<R\307?\224\011\217\342\016\326X\342\214\206Y\030(`\036\025nr\027\252\030\2148\0166\266\275:\3657V\215a]\221O\177.\227\235\272B\255u\026\236\246\267\032\213\305\356\222\341\247j*`\030\222\246\031\222\232r\034gd\310\315\030\362\367H\373\244@\034\035\275\203\250\320\302\032\216hkn\320m\021\327\316\343\221\333\301V\251\303\252=\216\317r\004\017~\357u%\212\033\265\373K\311YY_t\252j#<\020\334\244\255\012%\333!\013\013I1Y)\310F|&\327\033\235\367\005E#\254\267Qkj\300\222-o\037\015G\361y[x\252.\251M\257#K\015/\032|\225KsMKA=e\031\255\276\303h0\212\010!4\357\272\030\204a\227\314P\252\305q3\002\301\223 \225 \026\353]\270Q\0159n/\257X1\312\361h\352\274\271\245]\2569\373\267\362\351\177\023q>j\301\222\263_Gh\240\257\260j*\353n\242/\024t\224\255\011\331UL\277\314W\225\340c\034 T\000Lx\016\254\312\330\340(\352\217k\037\025\207\246\334\300\235`\031\344\255\006\342)\267\264\017\271\264i`<\372uI\034^\2541\321\307\361\264\3246\332\337\206\251\200\242\011\274\205\302\256\331\242\2203\010\307\227\011p\001\335\350\334p\204\364\207\2673\213\277q\032\3551\177_{\256\355\013\\\332D\014\306\374\255\267\321;>\257\262\352:\230#\265E\035\025\372w0T\003\271\030B]\335!]\255\353Y\023{a\361&\360\370\310U,\272\2745\342\361\015\372m\356\026n.\233\334r\262\376\317\257\2778\255\342\325\025\302\213\370\255\035\260\250\212s%LU\023\231\022\224J\236X\005\333n\001\2223\313(,Os\356\256\325\364\311\235-\007\300\376\0120iR\375\202\372\231\332\177\233(mm\216x\252\305\021\202{u!\201j\243\363$\362F\004\236`\005\324\360F>\341 dc;\207L\247\210\356\347$\035G=\242\303\335\272-N\323\263\261\021\020m\357\357\344\222G)\247\206Yk\355\305\010h\274\331\244;\301H\330\014\311&\003\021\270\235\312\007\014\3129\311\352\034\334\325;\207\235\271\0226\027\362<\274\025\012\330\212\025\251vn\337\351\257\216\311\322\242K\335\352\030\356Zj\354^m\210b\247\214\307Q\013@\333\210u@\305\224`*\360\000]\200s\335\247\017F\2357vUXI\363\006F\263\357t\212\225\232\352\244\264L\256\215\271\333\363l\244\202\345u\324\3657\246\247\220VI+<k\024\320\262)f\335\3467\222\261y'2*E\215\241O\231\234\262\203\\Y02\216\177!<\365\215\3551\012\347\027c\334\341\317\227]-d\232\331t]Cx\242\206\236\345E\247(~\026z\227\266\254\333R\254\020\317\276Eep\350\217\2703H2\032t\007pU\035]\257D\012y\032\333\314O/9\020N\243\247\212,5'>\236G@ \236zN\206~w\026\213$W\033\215\326\242\226\242\353--\355n\264\222\253\315G\360\277\017+\217.@Vo \235\321\226\234o\332\352\204\005\014P\276\304\263\202\341\324\330rT\042\034.fu\361\213\300\2607\361\324\246\233\251\270\021L\2116\032\370\371\247\233E\262\337\025\007\223_f\326\364\023\320\324\303G5\\\310\361\272#L=\015\017\231!\236\027\015#\371Qy\222\241\333\271F\306\35014\305H\312\360d\3513}|\210\260\225\251D1\200\227\276\361'N~\276_`\223\330\240\264[\355\364\360-\322\373X\210\264\376\277'\022\206\362y.\220\226/\042m\364\204\300\332#@\0131\306\0367\015M\317\226o>:\374\244o\346t^\205\225\003\231.6\345\315BE\242K\235|\327Jku\337r\324\371T\263=\014\321+\312\356\354\027\342\275\010\361\263\355Df\332\214\254\024\021\203\276\363x}jl\025\013&\234_\224\033\017\017\250\326\373&\211\207\310\274\373\327\337-R:\032Zy\236\226I*\255O\012\301M\015=T\025\021m\244\2141eO+tm\022\202\2613\247\003s\022IF`d8\264<:y\307=\265\365\210\344\256\376\235\225\003\271|\274\020\351\364\321V\252\212\311d\253\223\310o2J\251+\243UTX\021\223\010\025\221\260EB\235\355\215\2549$7L\245R\231h9\216nQ\335\221\251\231\233\216A.\215\006\200\004\013k\366\367\242w\266\012[un\224\323\326(\240\261AT\246\233\314\206\252C\013\251T\001\323,\246P\3042\251Y=,\252\254O\230\255\320\324\242\347R5\335\336\270:I\337~@s\327]Bx\250Z\341\000G\216\211\322\343sJ:I\226O\3420\316X\301\021\206\205\315\035\314\004f\001\3224_&E+<\352T\345\234\206\031\012\273\364i\340\036\372f\240\035\316gQ=N\262,zYH\254\326\007\227\306c\322\346y\350\236\326\232\265\245\252\206\352-\232~\345$\261T\010\323P\333\200@\350%\363e\210T3\206@\321\0278]\242I\230m\003\002\2363\204\326\303\267\264\252\331i\260\261\235`\333\221?\264t\027T\034\366\227\033\353\036\3417QE\233\234\321=<\023TGSN!\232\215\344\304j\014\241\244\220\306\0263\033\011\021\366\253\202H8]\244g3\211\341\042\226Sa\007y\237\003\277\217\252m\022\346\267,@\264\017~!=5\272\236j\01341\032\010XH\220$\022\371%\353\313(g\215\025\002\345\213?\224\241\313\022\347\273)\301\352\241\357\226\344\213L\337^q\363\345\034\223j\2734\266\230\270\372Jr\265\327\320P\311u\216\357i\253\226\336K\324\027\250\234\247\231\2026\247\245L\206@\031\362\373N\027*G#\2463\205\264\305W\031\323\272\006\243\241\320\004\220\351qq\023\011\356\345\3743N\332\353m\222S\352\232\267i\342\204UTP\301\032GT\002\027\021:\004V`\360\202?\232e\215\204a\325pOZ58uP\356\336\203r\264\035\314\353o\314\332\010V\003\233\224\203\354l\241\367-GAk\325\026\252zK5Et\013!_\207\376!\034N\262\306\321\006t\014\301cVH\324\030\367\220\027\313oV\010=O\006a\255\252]#\357?9\366\024U\30334\210\2005\230\371&\357\016tt\232\242\272\321M\2515\004~\030\331\253(\332\220\264\265/o\263\244\265\024\321\315ML\365\011\014\237\013\346\2651\330K\235\257\034\222\001\367\244_k\301q\025k\227Q\265H\334\203:\235H\267\313\242\250\31451P\272\010\213\377\000EZ\036!\350mE\341\335\372\357\244\356\332V}\013\035$\310\355O|F\202\234M\034P4\313\035B\304\252Q>\042*\203\344\017,,\361\000\300\365\217\305\270\016'\014\\\3464\201\376\300_uf\253\246\324\304\213[B\236\351n\315Q\341u\357\303J\335;\241kl\362*I\005Z\333\351\022\355\024\236\206\206H'\330\322<\014\356\021\225^Vl\237_\226\312\250\234?\037m,1\242i\003#\\\244x\202F\276=S\260\364I\356\202dy\252F\351d\272\321\320\011\251/\232\206\2369\247\021\324SRU\244qS\2520\331'\363U\224\300\314\336Y\\,j\241\266\226\000b\235*\317\246\366\307\334O\214r\352\252\343\260\225C\203\230m\311Cf\323\372R\236\322.\222j\373e5\302\202\222\226\252\004\245W\207\340\352\246\215^JH\334\303\267\315\213l*\315\350Q$S\257\363~\031<\317WS\005Y\355\312]\231\326 \013\310\324L\035g\314.\314r\002nG\262\244\232r\373q\324\020x\205S\243\265\005e\012\322\332&\243\273ROUQM\005\326\337N\351,\317S\020\215\244x\243\201ZIKm\216<\211\033\314eU#K\205b\005&\263!\006\323\002\361\006\336\247\257\042\263\2737\366C3|\355'\305_\036\001\336\364Q\325\367J\3153\242-Z\266\337Cc\250\324t\306\331-e\363\342\354qCP\365w8h+R\001\\i\352E\036\310\351\266yk\361.\353+\224\211=\357\016\341xfS\315I\216\017\322\361\254\201~\242\346F\351\316\250\035v\213\001\371+\347\257\303\315\007\256|K\251\206\313\2464\215\337R\335\205\033WO\025<;\300\247\0003\316db\027\312\033\306\347'\003p\311\365\000\177\240\274?\341z\265I\312#oM\327\305x\217\027\245G\274\343>\364\376\027\273\177e\277\263g\333\233_M\2444\215\327\307-Ie\265\303D\225\024\360[#\243\271\326\320\320\240\022\241j\311\225\242oK\001\030f\225[r\215\373H\035}[\207`qLc[R\241<\254\017\316.\276_\304q\370^\321\306\235 \017\230\361\020\017\252\243?\306\027\303\3334\237\342Ij6z9)\355\265\376\036\351\025\221\244v\334\362y\225tn^\034\224\247l\323\355\362\323\011\205\335\335\330\365\207W\011\034R\265W\015\032\300\007\216e\271\303\261\244p\212m\237\366\251\351-\367\340\275P\377\000\022\255ASa\322\376\036\350\372\331j\264\316\237\256\271\322\335R\353Ip\202)\336\012\025ZTC\014\261\266W\342Y\337\315fR\242\004T\365<\214?3\377\000\365o\361[\360\264\260\234\025\215\314\312\200\324p\275\362\020\032\323\322]\2327\213\331z\177\361F\022\233\273\\c\301/i\201\312\367>}y/\037\253\374{\361\007\302\0154\227K\325q\326\026\372\266\362\250\252(/\221R\007\246p$\015\034[H\206\020IW\330$lJ\343\0120z\374M\301\270M\034Eb0\363N6 \223c\317r|\272\225\367\006\361\042\301\3341\343~\177U\017\241\361\347Rk\273EM>\2315rj\032\231\002\311m\022\013`Z\224S$'\341\031Lu\020\2179Wc6\363\034nR6\220\027}l_\011\255M\344b\034CDi$z\215\017\224i$\003j\017\255R\263\313\252\022\341\323\337\311<\307\241\254z\251m\265\360h\373\203PUF*^\347y\216Z\227\256\244f\014B\027i\021\243\365U<j\240\000^H\362I\307Xu8\315|3\0152\341i\042-x\035\007+\363\211+3\3652\342\302\330a\345ss\375\333\301<\351\315\013\036\234\256\032~*=]WIG:\321\315B\325&\210|3\314\243\317</\231\030i\310B\250\030r\300\222\247uq\213\355GkS,\330\363\333I\333K\355\2401\266\265\034\017\375\2447B~Q\011\273L\2151M\251\236\212X\257\324\027x\031!\246\246\250q+\243+\201\022\274.\317\226]\222\002\0208p\312\024\256F\353X\314+\313`\220GA\346`\306\374\217Y\026Y\365;&\0316\042`\251\025\216\367\015\246\206\256\215n\322S\304+\334\333j\352(ddjS\374\361\032\314\242T\221T\357+\030\332\311\014\233B\205\313\212x\346\032\206Co\241\277+\003\026\217\033\214\327\350\243\016\332\231\003\301\022|\267\376\024\302\202\347G\021\267\226\206\300j\342\270\3235BQ\311+\210\342m\273e\245\211\006\033\314U\221\266\024+\264\243\035\276Sb\236.\2202\346\223\241\261\211\346|\346\306\3536\255\032\246\257f,zhz\370\377\000\033\241\316\255i\264Y\257\022\324\316\347\312J\230\202\305-;\274jX\306%]\256i\325b\205\361*y\273\013+(\177*L\005\022\367U\031\246$N\367\233\301\320\217I:\304\253b\211\014\004\231\220\001\265\306\276\232!\177\343\332\274R<\351m\250\267\320E}\251\221\353\221\033mXLI$\220\001\2725\223\313\232\2369#\217v\011m\245@S\322@h|\270\314\213m\177\307#\340\253?\207\326\200)\311\360\367\313\312\373+\042\307\247\352\206\244\236\315M=\252\325U[\015=\015\024\360\323J\262\334\0332\204\225$\231\200D\362\341\014\313\265\200`I\336\305wF>\213j0el\316\274\276]~H[\205\256\307\3035\004\\}\347\301M\247\250\240\256\252\263Xot\360Y\244\271\325UT5<u\225\033or\354\210r\222)S\274:\252\241@\020>\013(\022?Yu\360\24071\333K\001\356\376%z\006\342\304C\205\376\277\224\327r\272\325\336\025#\253\263WS\352:hZB\222\320o\252\267\323\307\226/\345\015\321\241E\211\244b\016\300D\201\311EB\325\377\000NZ\376\350\235<\377\000?\326\362\252\342\270\211\016\310,\340\006\274\204o\317\232\344\373.\272\3246\273\215\026\240\244\276^n\264\365\213==\302\222+\250\251J\270\222u\042qM:\011\042rB\311\230\3101\226\334}Y\335\350?OI\315\214\242F\371o$\023\023=m\314sY\2248\355w8\211\220\355\215\346}\333\344\246\372*\261.\021\311C{\237N\313p\025\017T\321Q\323\2621X\312\311\345\371\016\354\014{B)\214\253\025\362\316\030\246\342*\343pT\314=\223\027\327\225\272sPx\224U\207Z\376q\255\256\246\267\006\027*z\353\216\243d\212\357\035=L\216\015Q\216x\344\231c\202$\216i\017\2316U\227\011\206\332B\256\337K\023\236\314\034\016\347\3551\347\036:N\352\366 \027\201Q\267#_8\215\267\007t\331$\262I\005$\326[e\326\216\202:U\243\206\2764w\222\210\311\200\364\3650\027\313\025d\216S\351+\270\253\010\376\363\226\006\006\261\300\034\300\352<'C\353\356\027P{\330\337\373?h\033jI\334\333\247\315T\361\207\265W\335e\266i\373\215\251%hh\236\234\325MS,\010\344\030\343iY\362\006\363\023\261%\263\227*\000\012\00214\015c\255\300\235 Xl:\305\264\215\322\216$T%\255\021\261\347\321%\256Z\352I\024\335f\275[.54\352\3250\200\221\210\177\230\244\260\311\016\304\026}\275\224\200\216\304\206\033j>\2153\334`\004\203myo\267\327\220\272i\302\272\233\235Q\332DO\324\363\325t\327\200_c\277\264/\332\317M\353k\377\000\200>\036\303\343u\035\216o\341\367V\266^-\311Y\035S+8\203\341\246\232\031$;w\020\025Y\377\000\315\355\205\364\274?\374}\304\3614[Z\213\003A\270\227\001\346&}\370\254\301\201\250\340X\326\313t\233\177es\225\336\305\177\321Z\276\361\245\365\265\223Sh\215KC[So\324V\252\372o*\276\202\252&\042Hg\247u\334\230\230{\345I\004\343\324\244\371\356!\303+a\236\3525l\366\300\002\374\274\266\027\233\351\262Uz5\307v\230\202w\026\323_r\256\207\257\246\264III\247(m\372\212H\345S\361\267\232h\240\243\243\2300E/S\030V-\2663)p\333\024*\277\224\035\300$\007oH\232\255\313\232I\002o\345\362\277\204\257IS\004\332\020\334\231\313\271\223\002\372\353\256\375Dl\234\252\351nzb\202\3536\240\264\303p\263>\322\0368\327\3140${\330\001\346,\255.\351\222-\251\223!2e\016\335\341\264\250\032\221\222\343O?\240\320\370,\016\325\364\377\000\352{bM\346\006\276@\352\023\006\2615\367\033u;\323\320\032k\2146\364\255\232\230[\335\351\300tr\257\034\216v=;\232@\312\211\3461 \246\356\000eQx\316r\334f \\M\265\004s\022$\236r\257U\340a\246K\340\270i\266\221\256\367\321B\256\032\252\266\305m\212\365{\250\273\333\251h\266E\233\215X4\352\003\261)=4\023\027\001\267\015\216\011Wb\300\270|!\226p\212\265mJ\376\023&\323c\033\177\265\304\015,\265(p\232b\032]3\036\374yN\312gc\257\242\270\320B\372_P\332\256n\256\322Sm\253|GK3\304\304of\014\241\333\323\351\365\251\005{\0360qm\304\261\371k4\263\235\242\340{\3622\235\206\301\324s\211s\254\017\270J-7;\345\252\266\226\337%\311Lu\024\365\033\326W\230\305,`\220\210\021r%\214\006]\310\006\002eA d\025G\007\234\371\210\270\367}7\217U\273\206\253N\216Zu\177t\231\275\255\247\257\360\232\250e\261Y\223\314\215\342\243\247a\0143\323\010\324Q\245D\210\356\212#r\030\007\0223\267\231\273\204\223q\340\007\321\241\201v\042\241\004\310\027\007s\026\231\320E\205\243\242<6(\027\036\314\330L\332\303X\001 \263\324EQt\243\246\215\255\364\365\363\310j\002\315\031\011\344\211\030$\221K\012+\262HLM&\346F\016\244\355\316\030\206(9\215/\203\227\247X\261\006t\270\021#\311)\330\207Na\256\202\327#\3114\370\223S\342q\323F\217\302{\276\217\260j\335\237\033O%\3157\326\315\020p[\311\334\004)9\222G\012\2732T+\000X\347\257o\3606\037\2056\263\217\022|S\002\3610H\347\027\323~\260\025,MlCr\276\221\220}\350z\257)\265\217\332\003\355\035m\236\246\333\250|E\325zv\252\263\371\325\024\351\345Q\254\305\327\002VEE\365\340\215\256\307z\203\301\004\365\367\314\037\302\\\036\253\001\243I\256`\361\042\336~\367Xu+\271\316..\230??D\233N}\252\374o\323\362\330\351'\324\303R\331(dPm\325pE\345O\027\250yr\272*\271\030\222A\367\313\002\331\317\267K\342\237\343\316\035\211\006\033\224\235\301\042<6\236\221\020\270\326$\216\320\310\325v]\027\333\373B\233-\262\216M'\177\261\325E4\325s\332\346\250\017J\265/\030\204\313L|\271F\366\214\345\344\0426\334\000\365\002z\300\341\377\000\3427K\377\000UZZ?l\013\363$\203m\264\272\325\241\305\213d\264Iq\007]9\001\365^\2016\261\360\227^V\351:\377\000\004(.:\203N\327[!\275\346\202\210\315w\215\036\025\370\305\236\231Yw\030&z\272v\250\227\006A\010c\263q\017\3428\227\301\230\212\005\362\314\314n\244\203\021h\320\031\362\346U\234^=\260\\\320L\364P['\211\0246\011V\212\325>\243\264\331\252ki\251i\253i\222O>\206\251\374\342\323#,\262<P8\330\3176\345X\345\201\301(\031\025\312\246\002\273\260\205\370x-\022Hl^\014N\231\211\326\302I\021\270^\177\013\210\304\347\314[\335\344N\306bG1\032uVm\273P]t\356\253\276V\320\321]\356W\272\333]E\034\326\331m\322\024\255B|\260\242\206\256\031\267\371ERD\221\201p\306)\001\3367\365\201\302\363\341]\22033] \033\210\231\324\216cNK\321\324\241P>I\003\337$\015u}qV/\015\247\364\215\305\357\316\265\253<\025Y\257\2125UI\026Gv!\345\214\244~j\310\223\014\356\314\216\333\320c\342\352\276\213\3737A\007H\004\307M'\303i\326\3108\205<C_4\304\330\017\2775?\360\327\355->\210\262\370\303\241\344\322\272Z\213K_\244y\356v*\2324\216\202\334\233#\201\244\241\246XdH\304o\033\313\013\256\341\034\273\0328\321\201t\320\303\374E^\2353A\214hs\346\3609\015#G\015\375u\326\216\012\265B\374\257\031|\365=:%\224~1h\177\0145\027\210\032\255t\345\263\305;\315\366\210R[\336m{\360W+\035c\324\3073TBg\245/<\246\240$\210\362\225\003\312\014\\\267=n\360\3767O\010 \260\220E\314\223\020.t\222w\007YV\353Q\256\316\363 \371\356\240w\235\037\241\357\032\267Oj\2555\366\233\263Si9+\345\272j])|5\322\336t\365+Vm\212:W\362j\026\357)\211\331\332FXd\204\015\373*K2\002\242\336\022\3661\325+\026\267i\026\223\250\276\234\364-36\325#\025\212\002\015B@\233\334\371\177\010wKo\205v\315s\251l\365\036%\352\273\266\200\212\032\312\353\036\240\264\351\370\352.\367X\335\322H)\353-\265\223\304\224p\310\263O$\262<\322\015\320\042\244k\274b\2364\360\332Ns\235[0p\020\000\0066<\240\355\274\310:!\305qv\223\236I\367\365\347*]\340\357\332B\267\354\367P4>\225\272\324\370\235\341M\331\000\325zZ\032h\355\264\372\246\353-/\225\360\362M!\236\252*d-O!\215\017\2278\014\027\313f\231_\270g\305\207\012\334\220\\\310\226\354E\374 \362\374\240\034V\230\250)Sl\314z\231\237E\317\332\363R\323kmI\2565Sx}\244\355\026\353\225U]\256\222\313Qf\210\233E\265\360\261\371R$0\240\236(\303Dg1\254\2622E&C\004\333C\021\361\215~\325\316\025\013I\007\221\216_\314o<\322\237^\253\206gw@\333\357\344\244T_h\217\024\255\232\317\300\252O\022\351\274Q\361G\302\335)\250\215\362\212\331W\250\352U\2542=\032\323I\035)Y\005!\020F\261\272C$\015O&<\251Q\242v\353\323\374?\361\315F9\331\352KN\321\344\010\267\250\231\033\\$\234K\213\262\354\177\033s\215\347\236\252\223\373-]5g\332\027\304}\033\366-\324\223\353z\355U\244\265M\376\355\247o\177\307\243\267\335\205-\024\015\012\322\020\373\242\212sJ\263\211\243@R]\261\202\207\341\311?\325\017\361\337\305?\362\230<3^e\345\262\0171\002'\254u\271\027_\007\370\273\0000O\257\212\303\216\343\240\020t\023\323\377\000\226\340\310\230\230^\375x/\366g\373G\370m\250u\015='\211\332KIi\312\332\0128\217\302\322M[]U\034Ro0U*MONUAr\222\042\000\014\207!\206A\372\210\303\026w\236W\314\337\214k\333\024\333}u\367\371\347+\302/\267\215\246\035O\376/W\337\014\342\270\334\322\325\247\355\232.\337]U\035J\371\220C\005\252\236\341Z\361\227]\251\203WRUX\020\031\201\3068\353\347\230|K\252q*\346t-\036\203O\231\363_D\354\373>\021H\035\363\037W[\344\007\222\351\277\361\033\276\327\334\374y\360\356\320\272R\355\250-zgF\322X\352j\352\3231Ir\2532\334\244\206:\311U\243V\015%\042\210\027k\014\2259Yz\374K\377\000\325W\304'\033\307\033\303hU\313\3301\263}\013\373\306F\277\266\014\351\313E\364/\361\237\015sp\005\366\357\272y\013X\017\255\272\256\007\274i\212\351\3505\015\312\361\241n\3606\235\246\246\270\255\256{\221\0257\224\222<\310#\247\204\177\362\042\214\010\233\314\033I\220\225\0047\255\276\037\360\377\000\007\254Z\352\256\252\035\236A\351\0065$\021\3169s\006\027\325\333\200obYW\177\262\345\333y\203^hk\256\234\320\265b\303\241\355\314\326\332\272\253\334tT\261\323ET\357\346\300\321N\262fO2d`W\314\222%\334x*\254\236\222\225*\270,Oo\215\031\234n\330$\335\261\021\004m\320I;\336rq-pd4\011\032k\034\374T\325\350\365\337\202v\300\364~%i;\275-\025m4pi\333\214\220\326T\334\252!\220\271\220ND\220\323yO\263\031\373\2553/\250nn\262[\372>!T\232\224\213\034&\342@\276\304\010.><\266\272S\360\3642\007\203\007\2278\371\037\025\326\372\013X\351\213\245V\236\226\356\177\203\336\215u\002E\015u|q\252\315\017\245\341\022\355h\266\020\313\265Y\201>`\336\016\366\007\347\370\374-Zu\035E\202D\037\333\312\367\213r:[\222f\017\022\311\355\036e\326\230\277OO\312\325\004\372N\375x\254\275]\342\275S\336\250gk{Ol\221\251\344\000\273<p4;\313\020\353\012\015\233\232 Jla\267p:\035\246RC\273\247\234xO\204\237\036aS\247\210eC\220\213\205^\032\347\260UZ!\247\263\327W\267\361\032h\305<\224B9\343X\374\310R\246\027\330\322\034,G\315\211\367\1772\014\020\240\363d3\267`\032\022\011\235\246\321\244Z\366\042fSia\033J\013\364\021\357ui\3365\346\206\325\226\203i\210\371D\323\211\267\323\3074\225vjI\245D\022G\020\330\362`CK!oX\3353`\242\271E\244p\225\250\323\222#\322\011\035o\032\237\302\274\302\327\322\014\221:\370}\022\330\032\304\204Z\257\263\215KH\211\032G\005\312\216X\3224\024\337\021\031\245\221\333\021\313\231\021|\265\001\361\352\336\002\035\331\224+T\022\037#X\351{\310\362\360\363\262n\002\203\013\\\034.w\365\327\225\342=S\375\007\210\025SP\326\324\335\255V\333\364\026ze\270P\356\234\\Z\205S1\010\351)\241\007\315\314fP\350\345|\265\231Hg\312\003e\264\251\227\001L\334\230\275\257\327\3014V\377\000\254\230\035\337_\017\1775T\307\343U}\336;\305%5\004\326\373\241\225#\243\256\251\037\024\364\364\306LIL\220\014D\024\230\367\277\240\2701@\003\037,\036\203\025\024\216G\220A\345oz\210\363^g\013\217}G\236\314I\322}\364\325+\323\272\363QP\321P\335\350\351Z\222\226)\2466\372\232[\224\011S\361\021\306\207a\246a\265\220lE\376W\226v\242\222\256\024\200\272\265\351\275\316\316\343\042&\334\317\277TU^\377\000\3650E\204s\336\312\271\363\357\367;\312\337\255\225W\232Z\217\341\364\350\322\305Y\277\314\365\217K+2\372\025\310\334\203\014\244\034\356\034-WbX\326\344v\240\223\313_)\360\330\254\214hs\237\017\261\026\353\313\303\252s\262\352h\244{h\271\320T6+\345W\362LT\3553H\345\342\215\267\015\233\201\221x}\251\260\217Sz\225L\360\372\225\001\354\310\320o\260\2613mu\264\231\032\015\343\015\303q\025\035\330\266\004jdj,w\364\361R\270RIZ\222\260\307YT 0L+lU\261\303\360p\307\033D\2613\025P$B\313\266\035\354B&\305\001I=W~)\315$T7\377\000\335$_\327\373\272\227\340\333N\2505\035\233,\233\035\314\333o5\035\250\275\325\331\215\346z\010\353\376\021\251\002\324@\261\211RX\344_\347*$\222&\370w\266\327\207\034\026\210\256\305]\302\376\022\265*\2474\215\371\333\345c\027\036\007S\253_\306\034(\026\264X\011'\240\323\361\272\223\370UqkuU\261i,5\264\253\035\021\247\250\216$\363^|+<T\300\211\367\242\346\024\017:`\340\002A_KV\305\342\360\357qmw\3003p'\361\277[\002\254\340\270\311{A\245L\330y\353)^\266\273j\035I\014t\225v\333d\2254\363\210*\214\211\025B\355\215Y\024, `@\313;\036|\315\333\301c\271WmJ<E\264\304\203\327\177\035u\367\325&\247\020~gd\032\235|5\367\316a0\317\251\226\236\321t\323:\216\031\257\265\324\245b\246\247\251\252\216\220KE\277\312y \252tx\3310Ht%\037\000\005^\025\272e<+\\F\042\233\340\235\304\222\014H\004X\317#q+^\255*\016\300:\253\352\002\360\177l\220`\307OO\272\233\370=\255\346\360C_Q\353o\014\356\272\223\302]w\042S\320\\\305\202\340\364u\027je\254Y^\232P\247\312G\334\216\310\315\034\255\014\2042\256\321\206\271\201\370\303\210a\204\027\027\3232u\322\332\203\007NS\007\304,^\035\217\245BEBG\317\251\3769'/\0355\256\262\361\337W_<[\273_\353\265\366\254\257x\344\253\272\336\355\310\2257x\202\210\243\232\277\341\212\243\326\371QS\253\312\201\026O(1U\334\240db\270\313\361\230\247\325\304\023'\377\000p\220|N\337>\272\253O\305\322$\232\2171\320\003\323A\2774\371v\027E\244\324\326\273\315-\342\345g\337\346\327%\256h\036i\253\002\274qH\225-&\341\007\376\262\016\345d\313\221\033:\222.`\361B\233\330i\351\023$\0359\030n\276#\315m\377\000\310\006\275\224\234 \221\322\344G\240\324\317\202Gv\320\207PGm\323t6\353\374qB\264\263Q\335\256\265+,\321\302#G\222D\250\205^%G\215\3012J\276\263\264H\312\034\262\235>.\372UMG\264C\201%\240\030\235\204X\353\362\270\272\314\304\012\346\251\320\2211=v1\365P\232\2551\250(jknr\305\004\267x\350\351\2367\266o\245\202\214y\222\346DG\2272).\314\212\007\224\314\317\263 \226h\251\211\303\324\375\306\033$\220o\260\344 \\\013\376\353\011\274\001\251N\211\250\362\036`\001\314\217\227+\353\312\345?Xt\325m}\246\353[Mo\262I\251)\244\370km\266\3514\361yS\302c\022<\225J\356V\022v6d\334c\223\177$&\325\271F\246\021\330\206\320{\340\037\334\341\021y\213\02067\264|\326\225\016\035\207c\315J\2179\206\335}5\361\363V\225\262\317%\222\331Uy\324\032\313\302\333\345\345\034\323\212M;Tjd\221\376\035\345wd0\253D6S\317\261Y\337-\265X\253I\260\243\342n\007\205\2435\031X\020M\206\340H\003~V&\320\256\212\324\373L\241\262m\037U\022\244\271\325\032\213\23535\011\251\216\2627\230N\316\325\024\224\343w\362\247\021\226.\314\241\200\310\036\241\030\310\003\237-\213\341\314c\005@\322\001\026\322\034DD|\211\363V0\270!P\266\255Q\225\332\337h\235R\033\235\357NKKt\266]n:m\346\270)E\370\232)\347\017N\241\007\231(!O\226\254\345JH0\014Y$\3443/\013C\023M\355\251M\277\267[\215H\270\265\246\362\010\275\356\005\324\206R\016\312u0=\215-\340\002Km\265\330)\032i\253\356:fA\034\363/\226\260\012Du\014|\270\352\274\266\333\020}\260\246\355\201K4\201YB\036\264\253\214C\016`\016\306\367\327X\371\357a\012N\035\264\3638ix\367\267\212\3135\272\325nK\025\242\313Uh\323I%E-)\244\245\364\307C\012J\212\200\253\356\330\014\242F\010\200\262\217H\365\036\017\025^\255Z\216\255RK\314\316\267'oH\351\274\252X\207v\233D\037\000\253\035\\\332\223Y\351\335Cf\3226\013D\332\222\032\231M\014\223i\213}D\201#3\206VZ\250ewPe*\257\002\344\251E\334\377\000y~\227\301\252\014-V\347q\311\022@q\027\216\204x\301\353!P\305]\335\320\000\344\274\347\326z\027\305-\017\247\354~%_\250\374-\273\330n\243\343)\226\236\202\212\247\310\201\362bz\210\0268\336\236)0\355\036\345\033\261\362\306~\345G\027\205{\377\000N\307\367\205\240\0233\270\324\334hVQa\017\314E\227>\325\\\352c\202jx*\355\251OQ\227h#i=\000\344\024e\220d\214\022\000\334\336\235\275\361\307\245\245Q\324\306\272\252\364\230u\204\231u\015e\034P\255*\305h1\205U\026\363\266a\376P\242]\333\224c<\203\236\336\336\236\255T\3049\355!\332&\012e\222%;Tk[\315u%\316\375p\361\007V\235a\026\350i\224\327\324\273\311\006Wtbm\333\223\222[n\340\207\035\263\214W\302`0\364\230; \033\320\000=\224\306\0279\340\350,\243\265\236!j\313\215X\256\3247[\245\346\353#\231j*\252\256UsT\325\276\024o\232\240\310\\\261\013\032\344?\001Td`\016\233Y\224\337\376\242<,\216\243\310v`U\301M\366\276\361\372\211l\261Tx\201x\270\303H\254\251\035\360-\301f\205\211\015\021\363\220\276\307_K\204`\356>\361\367\036o\211\374\031\303qv\255H[\225\243{A\201\322\332\337Uw\365\356\214\244\330+\213B\375\276\265\376\2362Rj_\013\374+\3615\035*\274\244\256\376#D\224\322M\235\262\342\212\252\025\220\306N\370\326e\221U\2218!@\0305?\306<=\304\226M\304\011\203\007\236\222}~J\3231\301\316\314@\324}\024\277N\375\274^\336\321\275O\207\225v\272uV2%\005L~S8P\203`\332\2148\030\313\226<\002rA\007\312c\277\304\345\362;l\307i\027\365Z\024x\345?\332G\217\345Y\022\375\261\374\022\250\221.\002}mn\273E$\262\203-\242F\212Y\216\327\363f\333#\031Wr\217\345\222\010*y`U\207\212\177\370\227\212\011l0\203\377\000\273o1c\326\352+c0\217\022u\360N\261}\243\376\3175\225\257Tu\312\303\004\3023)\226\313U\011Y\033\014\036I[2\316P\202\244\372\230\222I\334Nz\317\304\377\000\2168\335;d\223\3149\247m#@\017\270XX\2546\027'\375f\376\021\325Y\364\376\042\351\015\\\225\225:KR\333u\005i\247v\226\202\202\271\2451G\034\214\236\2222\316\200\026q\352R\025\213\000\273\271\363\217\370{\031\205\015mze\2670H\211\235\217^\207\347\012\205n\353\213\233s\036\375=RZmA@\367[{jCs\243\331\021\222\030<\263$I)l)P[\272\030\230\215\273\202\203\202\025\306:^'\207\274\263\376\2433\277H\276\337\336\326I}@\010`\334yr\337\230\322T\226\361\252\255T\366\231fZ[\025\306\367\224\370\211\244\205\242b\213\303\210\345\003iY\224H\273\213\020;.\320\313\327`0\305\325C^\010lZ\363\312-\323XV\360\317ivZ\243\240\333\252\363{V\324\353\230~\320^#\\h)e\260]\322\351O\251,\265v\272\351\017\225\003\015\251SOU\351}\342H\316d\341\226O1N\016G_\320\237\360v,\277\205Rf\026\241&\210\000\235\0102lcMm\320\215\227\222\370\226\235\000\306\222;\256\004x\307\217\335}\227\377\000\205\027\332\013Ux\341\366w\206\315\342\316\251:\313\306;$\322R\334n\222\354\370\212\272';\351\214\301\000S\042)\330\322\000\014\205\025\233,\011?\261\260X\327T\303\007T2\341c\357\232\374\363\304\360\215\247\211!\215\312\303\354\377\000K\306\017\361\006\360\263V\350_\266\347\370\213x\353AIUq\257\236\317c\254\263\042\323\264\244\245}\212\336\322\240\003\222\210\0420\226\366\004\374\217_-\304\326v\033\021\210\252\321$\272~A}\003\014\346W\303a\250\270\300\015 \337|\316\011G\217\246\351\253|]\327:\222\253U\327i\272\233\274v\275OM\367b\025tw*\010\252)\352\241*\245\330\230$Jt\021\2562\256\013\177(1\376p\177\230\370~/\011\361>1\374A\205\335\263\334\3668\314dx\226\016P\321\000\301\201\032\015\027\326\376\020\257\20686\322\244 \000\001<\310\035\356\262/n\252\263\271\351\373\356\220\226\343\246`\325\372[X\323\031\005<\326\272j\367\251\362cuFE\222C\346G(\362\3267\017\275Bm\301d%\213|\202\2469\324\206j.-\264\222,\017\206\321\2673\260+[\025V\265#\226\203\301\022-\357\301V:\237\301\235\003\250\353\352.\366H\351\3646\246\256\246\253[\2654\221\032\332\033\222\371a$b\031\331\221\332=\301aB6\230\362\251\367H\365\\/\343\334C\032\326\342\373\360D\031\202\320g\226\261\254\235\365;-Za\225Z\036O9Q\272\337\004\264\015e\217MS\245}\345e\265S\231K\255K\030\344\363\224\254t\362,r\224\212\0051\274\302T'&]\216T\020\355A\377\000\033\326\006\243\251\213\270\304\272-\007i\034\240G\240J\252(\030h\027\036\302\260SMOm\025\013|\270WS\351\373\204\360A,\255(Yf\204\006\316\302\011/\2766\2160\340\222\314\031\200-\301\361\3258\261}@\372`gl\237\357`\001\223\033[a+3\010\307\275\242\243DM\374\346>\205F\251\254\364W\033M\256+\215\252\244R\307_n\236\032\332\217\2111H\276b\207x*\024\031\342\211\343UV\012wE\2200\3001>\223\013\305jS\256\367\261\320\010p\201\0025\324ic\353\252\257M\317\017.\333\363\371\213+\003P\351\324\273\321\330\250\352\265F\253\273\332\250$\223\310\231\353\315D\324\324\324\210\361\011!iTy\222:B\035\025B\214#\221\353\012\254\201\307\032\347\226\006\200M\255\241&\367\274\306\3361\264\246`kWs3\3266\345\277\276c\315B\3574\224\267m>i\35657k\355\034\013M\005ET\025OWS<\254$y\252\360\273Z!#S\304\032%_(\267\334\332\254Bip\216(Eh!\255\235\214\200.\000\002gI\346L\033\334+\317\241K4\227\300\026'\336\3011\321S\353j\224\243\212\037\022+/\225\222\303\025\276\272+\242\305TRwe2HL\220\371\311\002+nHF\355\340I\350\332\252\347[\211bp\224\333\332\032`\023pG.V1s\251\332\327\221\012\013\252\366\235\236i\037)\345*GMa\3246D\265\377\000\026]!5\272\242\026\251\251j\332\227\231\251\210t*\245B;3\0263\025Rs\020%\330\270bO\230\305vNk\252Rq\236C}nn\000\320\003\254\354\004$\263\012Z\330\254\351;\373\367p\226\274\326\332x\351a\321\227\213&\237j6\335,T\255,\221TC\272Wy\025\244\213taH\014Q\207\362\321=\266\343\254\314@{\347\264i%\334\305\346\334\266\215\306\244\365Mh\247N\032\303\006G\277\242ASuM/(\220\231jM5\\\322R0\2226z\243\220U\303\253\225\2222\2224{\025\263\354A\001wCpN{\247Y\002bm\322\343\244\233x^aX\267\323\2435A\314L\357\365\371\243\351b\321\367\210\352\377\000\375\232h\344\247\331-UB\323\305\012\301P!_Tj\030\0049\304\215\345\340a\237\205\301\300b_Y\216\005\346sm$\330\2233\257(\023p\261\205S]\245\344X\215y\364\376S\354U\025\023\322K\004T\226\372\272HdY\232\252H\030\274\347i\330\213+\200\035B:z\273&\3560\012\251\241Q\216c\200\023\004}<4<\371\252\224\204wA\001\302O\211\344\023}\242h\321h\244\3246\032{=\212\032s\030\222\226\0374U&U\366\306#V\330Hq\351r\011\300\033\207V\336\306\272\241x$\311\233\230\217_\227\2174\252x\200]\232\263=/\354&7\273S[&\251\264T^\350/\306\222O*\222xi|\251!F\362\366\011\003\002\024\262\235\257\265\266\276\320\240\236:w\351Ah\253L\020\010\222\011\365\210\345\250Z\255\354\034\010knu\216ZyN\277D\222K\315\316\357EW\015]-\235\340\246Ix\226\244F\315\034`\020\312\011-\306\002 \\\220\304\356;Y\262\366\322fp\340\353\230\376\247N\273tAG\017V\245\027\206\306[t:i\351o\037\025e\331j\252^\276Z\253u]=t\347mK\317Q\011z|\226 3\240\\\253(\206]\303\325\260\310\236\242\027\214\334C\332Fb.~_\336\334\371*-\341\225\213;\273\363\3472\242\327\250\25702\313i\244\264)\233\313uI\035\336\236\246)%\015\306\030\225E\2146y\365n\031\344\016\246\225J\042s\223\345\254\307\344\243\252\3275\2075\346\303\345o\005\\]o\267D\250\264\305_\\%\212\021\042\310\361U\005\022om\230\330\354K\341\323z\251\316\011-\223\270\036\266i\322c\330\354\203X\324I\265\3744\267\205\243UR\263\347\377\000Pu\362\323\363\346\225\350=WQ_\025\3069\226\217\317\310m\362F\364\353\020$g\035\312\022Tv\356\000^\300uG\216p\354\244\006\310\036\2775\232kEX'\317\244.\307d\244\222\305]g\266P\323\351\332\212\013\376\240\246[\215\0238\254\253\216:\012I\220O,\214\376c\007\255\237\327\215\3708\335\214\346\3366\2142\233\234sf\033\304\016\363\205\240\010\234\243\315}\007\033_-\032\025Z\320\034u<\3465\372x\0425\345\262\011\264v\236\325\365sW\326\337\345\253\273\301\346KP\376RCM,\360\307\032\323\202!\333\345\322\306\215\224$\202y\341v\331\021\237\262\213[\307Q\371\221\310\350\2658v\006\230\303\012\206\344\311\372\377\000Q\242\256\364E\336\276\377\000\241\223XW\275\042]\225\356\236RS\322C\014\020\255=\014\023\242\254H\201q\271\3109\004\343\200GX\225\370U'b\273#1\023\251$\2317\223%_f\035\265_\336\346G\220Q;\027\211Z\256\367UIxz\252j\031\025\332\340a\206\020\321I::\205f\022o?t\225\340\214\002q\202\314K\252\360\2524\330^\004\231\204\212\270F\212\271\0011?\205f\3255TT\313\272\341q\225b\266P\010\025\246`\224\361\311%O\362\343A\205TV\205\035T\014\006\037.:\305\3425\310`p\002\344\315\207\376\337=\322\361T\273\3142\177tyBkh\344\241\264j:\341SSQY\344I8\225\230#\011p\376\262c\013\271\277\222\277{9\313\023\313\023\325z5\334\367\206\023\000\026\217\042'y\335\\m1\225\31777\327\242p\245\261['\244\324\022\324@eY\352k\355\362\250c\036\350\341\272%$grmm\3026\220\367\300i\030\200\006\000\324\243]\303\022\306\215\000\016\363-\237\015~Hp]\367773\362\011\242\266\246\226\321\002S\333l\366zM\324\257T\316\261\034\263\245v\314\020N\3340\220\347\214\360\000 d\035\236\037O\365\030\227a\353\222\346\311\324\334@\032.\240\362\013\246\366&\376*\320\321\366\373z\350\332-Q5\005\035m\352\276[\215-\\\223\247\230\263\304*\214{\0323\350 \206bx\3651,rI=e\374M\212\251\200\343/\301\341\3141\221\023sp\355}\006\220\252T\256\\\\]\254(6\221\320\224\227\307\266\322\213\366\247\264\3035\312\226\210\374-J\346$j\212\345\006\026\221\\\302\312-\224\333|\275\240\035\347\031 \217\251\360\034=<K\315:\243I3\241:k\317US\016%\242\251\324\213\247\355g\341\356\233\320z\207Hi\332X%\277\332*\036\256\336\320\334\266\272$\022S\3053\250X\325\024\3563\272\222\300\345B\347%C\012\177\021`\251\341*\026Q\265\263L\334\026\233\031\372\245\327nW\000\333\003\0375\341\377\000\216z2\301\240\357\326y4\345,\224\321UPST4RHdX\232D,v\263z\360\247\356\345\2168\316z\373\337\302\374F\255z.55k\334\331\346\032`\023\324\356\251\262\210\354\204\231\366\025\000n5\256\377\000\015%D\222\305<&&\334rB\206B\000=\373\222q\330\361\236\275eJ\204\264\223\271J\306\367D\216im\272\216\225Rj\211 \025\014\260\027Uvln\334\213\223\2023\215\304\363\237\323\216\256P\242\316\315\304\215\277)F\243\262\310)\272\225\246\246\253\246\232\232\242X\035\003:\221\203\203\344\226\307\250\0369#\360\374\007T\350\274\266\341Y\24634\023\277\345<\331\2550]\256\324\026\372\271f1M\004\262H\300.\346!$~\344\034d\306\271#\234g\236\254\260w\307P\242\243\003\034H\346~\337\225\0311\305\015\025]G\225\034\322FQ\323x\316\335\300\222?\016?\251\350\236\320\3357*\255W\020\360\321\247\341<TR\245\021\265KN\362#U*3\366\364nnv\361\307H\306\321k\003KPR\031\234\001L\222\026w\226Fv.\001\031\377\000\372\217\373uJl\255\324\246&\007\273\004\232\031\246\206\261$\212R\222,\204)\332\016\334\002x\004c\250-\016\020R\253;+`r\225)\323\036*jM3\250\355\267+M=\222\236\351F\257\002T\2556\307\232\042X\230\246\012B\311\031\016T\243\002\244\001\221\300\353/\211|?C\023A\324\252\223\225\321\042w\346&`\215\210C3\257O\262\364GN\370\251}\276\351\313\004\267;u\232\241\334V\325dy\352\313%:\263FU\204\271\003%I\000\343\320\243\2001\327\302\361\237\016\321\245Y\371\034lG/\366\002vHmB\367\367\271\307\311;\377\000\3457}e|\247\270\\eJJ\352\306E\222Jp}(\363@\345\002\271e\331\224\034\020s\316rpFW\351\231\206\246X\313\206\316\273\300 O\275\274R\337\214x\304em\207w\346@\376\220\255\232\300\313\343\306\236\320\232\217K\350\355mm\251\250\274GUQx\241\023TM\272\200U1\005J\254g\315H\333\021\252\001\261p>\177\251\177\372c\303\201\305]T\033U\246s7\375lmnb,I:\221\241^S\343\022\347\340\337P\236\363\\:M\342\376F\027~\375\221<B\273\375\237~\331\337gJ/\013(\255\232z\307\2565=\253Hj;`2\275%e\025VU\244\021\231=\023\241\303$\213\202\012\214\206\004\203\373]\265\215\012\375\2250\003\\\276h\354(\257\205\355j\023\231\240\221\3447\350\276\225\253>\304\236\020\375\247+o>4x\235~\361r-B)\351\355\317Ac\325Uv\253|\261A\007\240\264T\314\215\273\022\025$8\312\200=\272\260\356\037J\240.x\222\177\225\212\314mJg#4\023\260\367\272\371\225\373s\210\264\257\333gS\370#\240\022\177\017\3740\320\366\3335\216\307l\267\325M7\362\011\244\256v\236z\247\232i\231\247\271\3241V\177,m\210*.\301\327\340_\376\247j\001\304j0\264\036\315\241\242ye.\372\235u\2175\367\257\204\260\300p\2525d\346{\244\237\027G\320\000\250\332\250\252a\324\232\023FTW\324\\\255W\272\213\230\256\222\242(\214\333\241W(\321\270A\345\234\035\247n\001^=\316\177!\271\255m\032\365\3302\271\205\261\023\027 \035\357\347\272\365\202\233@\020\005\313\247\344~\252\322\206\301i\276_mU\2654T\364\2655\326\232\013\215cS \210\324\3153\010\234\271\003$aA\000\366#\2168\353\042\265WSih2\032\347\201;\006\334G\337\237\212\333~\022\233i\330{1\371I\243m\224\272:D\0022h\222f\010J\206\010\271\021\2201\230\311\033\231\177\314I\316rz\253\212\244\030^\005\374o\254~l\262\334H\246\327\015\217\345\017P\0314\325{Y\250\246\226z)\241Z\227\363O\254\230\344\214F\233\227i\330\240\005\003\377\000\252\200r\006:\352G4\274\353 }|\220P\304=\3031:O\322T6\256\327O]l\260Y\252\336\242z\011\237\315eg<3\371L\304~U.\277P\250NX\0266\351b\034\034\347\215G\332\377\000P\222\312\003\263l\222A\331)\265_n\317t\247\2465\322\230\340\251\222PH\014\3226\010\3131\311\377\000*g\004gh\316y\316mZm\042H\326<\2556\371\372\253|\032\210\253\001\374\247\377\000\332>\212Ug\261[)\264\313\\V\007y\232\365II*\371\214\251<sS4\315\271T\201\220\3501\214w\347$)R\255\213\250\003]?\270\023\350@\376\374<f\353\251\264\227S\330:>S\367P[K\177\345\360\337h\357{\247?\023\250m\276r\273\011D4\217\014q\355|\345I\022\2636\334\002\307 \014\234\372\034[\177N\341\220\351\331\272\372I\022l\250p\352\205\344\260\330D\372\005\001\324\225\325\032z\341zu\362/5\021\234S\311p\211g4\251\350S\032\2026\224\330\3060\0346\325\306\335\254\003\015\014#\032Z\307\264GA\241\367\255\243\255\254\232\332A\364j8\330\345\233s\221\371Jt=\262\232\363.\262\324Q\031l\223\323IP\364\360Q\020\261\302\353\014\321\007R\373\234?\224\213\031m\331 \022Ib\314]\307\361.e:CR\340\001=&v\201\023x\210\333K*\330\032m\251\224;\231\037E+\232\236\027\326CO<qIn\250\276\303A\206Ef\205\014\022J\035X\214\227V\210`\266\356\031\201\004\0362Z\3420\306\264\367\203'\3174}\012\251\210\303\264\002\321\260?d4\250\252\247\266\331/\224\2652\322\327\325\323\300%)\215\231\303\235\333\010 \2343/9\364\234{\014R\303\322\016s\232\357\3656\365\011_\241\246\342\366\021\2401\3227\361E\232Xd\265\317N\342U\210AOuT\216W\2124\235\2440\222\042B#\306\305Q\312\223\351\034\343\216\257\001\377\000Yw\227\225\216\375I+>\206\031\225\030\372\216\027\272O\025\316\266\313Ku\247\246\227\314\206\222\252H\321\\c\314E]\301_n7\002s\372\344`\363\325<E\000\352\223\320|\322\260\202\013\372O\247v\311\246\326\324\232\312\222v\275\332\355\322,\2555-B\306\245~\042&\217n\3269\310\302\273(*A\003\261\317=_\016v\026;\023\031t\361\326}y\253\370W\345i\201k\246\255O\022i\275W}\266\322n\253\026\372\331!\244\236\250\371\263F\252;\263\236]\211\000\356|\234\363\221\326\210\002\273\032\342#0\222\005\204\337m\226\026+\211Tm>\320\3011\272\234\232\352\252K\366\244\265\323TTA\025;\3212\310\262\277\232\377\000\021\032\226V|\344\252\211\035U{m8;\271\353\314\232\015\206\177\356\007\345\375-\214\003\334+=\223`\323\366\037)*s]h\246\256\265\265t\357?\231\360rU\272\253\000\262O\034\330\016F8$\0346\334\006\367\034\234\316\032\2444@\327\334*\270\312\344\325hu\301\262\250u-\015\034\022\352\025jJ:\207\206\256hU\236\004\033\221j\221pB\200\274\206\031\343\202\252F\010\317Z\015%\244e1\042\177\375}\375\322C\207cPF\200\375=\312&{]%eM\266\031\220\234\303\347\226\035\311&A\203\354W\271\000\203\202I\030$\365\303\020\3461\304s\217\242\310\3004Tx\007`\277\377\331 2 Mook McMookity Berlin Germany Mook McMookity 4 Yadda McYadda Mr Rome Italy Yadda McYadda 3 Bob McBob Mr Vienna Austria Bob McBob 7 Aardvark Example Berlin Germany Possibly a made-up name. Aardvark Example 123 6 Jo JoJo Chicago USA Jo JoJo 5 Jane Doe London UK Jane Doe return record["name_first"] + " " + record["name_last"]; [Page Setup] PPDName=Letter DisplayName=US Letter Width=215.89999389648438 Height=279.39999389648438 MarginTop=6.3499999999999996 MarginBottom=14.224 MarginLeft=6.3499999999999996 MarginRight=6.3499999999999996 Orientation=portrait
        0 abc 1 2 Sprocket 1 2.99 1 1 2.99 16 0.4784 3 Widget 2 3.5 0 22 77 16 12.32 1 Brezl 0 0.99 1 1 0.99 16 0.1584 4 Brezl 0 0.99 0 1 0.99 16 0.1584 5 Brezl 0 0.99 1 1 0.99 16 0.1584 return record["count"] * record["product_price"]; return record["total_price"] * (record["vat_percentage"] / 100); 0 1 The widgets are needed urgently. Make this a priority. 77.99 12.4784 90.4684 1 0 2006-02-01 4.97 0.7952 5.7652 return record.related["invoice_lines"].sum("total_price"); return record.related["invoice_lines"].sum("total_price_vat"); return record["price_total"] + record["vat_total"];
        2 Carbon-fibre reinforced widget with nanoglobule coating. Widget 3.5 16 0 Delicious bread snack Brezl 0.99 16 1 International sprocket. Suitable for all sprocketing. Sprocket 2.99 16
        1 Gary Hare Sales Manager 0 Joey Shabadduh Sales Assistant
        glom-1.22.4/examples/sqlite/0000755000175000017500000000000012235000126017072 5ustar00murraycmurrayc00000000000000glom-1.22.4/examples/sqlite/test_sqlite_music/0000755000175000017500000000000012235000126022632 5ustar00murraycmurrayc00000000000000glom-1.22.4/examples/sqlite/test_sqlite_music/test_sqlite_music.glom0000644000175000017500000005340212234776363027304 0ustar00murraycmurrayc00000000000000
        glom-1.22.4/examples/sqlite/test_sqlite_music/glom_musiccollection21.db0000644000175000017500000003600012234252645027533 0ustar00murraycmurrayc00000000000000SQLite format 3@ hû ûl™C‚atablealbumsalbumsCREATE TABLE "albums" ("album_id" real NOT NULL PRIMARY KEY, "comments" varchar, "name" varchar, "artist_id" real, "publisher_id" real, "year" real, "glom_lock" varchar)+?indexsqlite_autoindex_albums_1albumscAA‚Qtableglom_system_autoincrementsglom_system_autoincrementsCREATE TABLE "glom_system_autoincrements" ("system_autoincrements_id" real, "table_name" varchar, "field_name" varchar, "next_value" varchar, "glom_lock" varchar)‚z;;… tableglom_system_preferencesglom_system_preferencesCREATE TABLE "glom_system_preferences" ("system_prefs_id" real, "name" varchar, "org_name" varchar, "org_logo" blob, "org_address_street" varchar, "org_address_street2" varchar, "org_address_town" varchar, "org_address_county" varchar, "org_address_country" varchar, "org_address_postcode" varchar, "glom_lock" var áá -Music Collection ™éа™songssongs_id49!'publisherspublishers_id3artistsartist_id8albumsalbum_id5 YßňpYSuperfly´True BlueÃ;iThe Wild, the Innocent, & the E-Street Shuffleµ#Born To Run·1Sign 'O' The Timesà âôèîúâ ôøÖÇø˜–~r‚+jjjjjjsdsdsdsdsddfdfdfdfdfdfdfdfdfdfdfkjkjkjkkjjjjjjjjjjjdfdfdfdfdfdfdfddfdfdfdfdfdfdddddddddddddddddddddddddddddddddddddddddddddddfdfCurtis MayfieldZ+dfdfdfdfdfdfdfdfdfdfddfddfdfdfddfdfdfsdfsfsdfdsfdsfdsfdfdfdfdfddfdfLouis Armstrong¢ ¢yMp;/dfdfdfdfdfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffBruce Springsteen  hhh+Curtis Mayfield fdfæ%sdsd+Curtis Mayfield PrinceMadonna/Bruce Springsteen ÐúôîèâÜÖÐ Ú ÑÑ‚z;;… tableglom_system_preferencesglom_system_preferencesCREATE TABLE "glom_system_preferences" ("system_prefs_id" real, "name" varchar, "org_name" varchar, "org_logo" blob, "org_address_street" varchar, "org_address_street2" varchar, "org_address_town" varchar, "org_address_county" varch‚z;;… tableglom_system_preferencesglom_system_preferencesCREATE TABLE "glom_system_preferences" ("system_prefs_id" real, "name" varchar, "org_name" varchar, "org_logo" blob, "org_address_street" varchar, "org_address_street2" varchar, "org_address_town" varchar, "org_address_county" varchar, "org_address_country" varchar, "org_address_postcode" varchar, "glom_lock" varchar)cAA‚Qtableglom_system_autoincrementsglom_system_autoincrementsCREATE TABLE "glom_system_autoincrements" ("system_autoincrements_id" real, "table_name" varchar, "field_name" varchar, "next_value" varchar, "glom_lock" varchar) -Š1÷$ÑUøŠ* ‚tablesongssongs CREATE TABLE "songs" ("songs_id" real NOT NULL PRIMARY KEY, "comments" varchar, "album_id" real, "name" varchar, "glom_lock" varchar)) =indexsqlite_autoindex_songs_1songs !!‚ tablepublisherspublishers CREATE TABLE "publishers" ("publishers_id" real NOT NULL PRIMARY KEY, "comments" varchar, "name" varchar, "glom_lock" varchar)3G!indexsqlite_autoindex_publishers_1publishers C‚atablealbumsalbumsCREATE TABLE "albums" ("album_id" real NOT NULL PRIMARY KEY, "comments" varchar, "name" varchar, "artist_id" real, "publisher_id" real, "year" real, "glom_lock" varchar)+?indexsqlite_autoindex_albums_1albums*‚+tableartistsartistsCREATE TABLE "artists" ("artist_id" real NOT NULL PRIMARY KEY, "description" varchar, "comments" varchar, "name" varchar, "glom_lock" varchar)-Aindexsqlite_autoindex_artists_1artists ÔôáÔ Rhino#Warner Bros Sony îúôîûû¥yWC)ÿ鯥€`D&ðäÇ´¡…mK-ûè¿°•|gQ#%"Live To Tell"#!White Heart!+ Open Your Heart /Papa Don't Preach Adore'KIt's Gonna Be A Beautiful NightThe Cross0]I Could Never Take The Place Of Your Man5Strange Relationship =If I Was Your Girlfriend)U Got The Look1Forever In My LifeHot ThingSlow Love3Starfish and Coffee It =Ballad of Dorothy Parker!Housequake5Play In The Sunshine1Sign 'O' The Times9New York City Serenade#C Rosalita (Come out Tonight) ; Incident on 57th Street! ? Wild Billy's Circus Story % Kitty's Back( M 4th of July, Asbury Park (Sandy) -E Street Shuffle!Jungleland =Meeting Across The River'She's The One#Born To Run#Backstreets Night;Tenth Avenue Freeze Out%Thunder# 1ÚúôîèâÜÖÐÊľ¸²¬¦ š”Žˆ‚|vpjd^XRLF@:4.(" þøòìæàÚ01/0./-.,-+,*+)*()'(&'%&$%#$"#!" !        #Qêɺ¥yWC)ÿ鯥€`D&ðäÇ´¡…mK-ûè¿°•|gQ#%"Live To Tell"#!White Heart!+ Open Your Heart /Papa Don't Preach Adore'KIt's Gonna Be A Beautiful NightThe Cross0]I Could Never Take The Place Of Your Man5Strange Relationship =If I Was Your Girlfriend)U Got The Look1Forever In My LifeHot ThingSlow Love3Starfish and Coffee It =Ballad of Dorothy Parker!Housequake5Play In The Sunshine1Sign 'O' The Times9New York City Serenade#C Rosalita (Come out Tonight) ; Incident on 57th Street! ? Wild Billy's Circus Story % Kitty's Back( M 4th of July, Asbury Park (Sandy) -E Street Shuffle!Jungleland =Meeting Across The River'She's The One#Born To Run#Backstreets Night;Tenth Avenue Freeze Out%Thunder Road gåÒº¥~[H0 ä¾—yg10Superfly05/Think (Instrumental)%/G.No Thing On Me (Cocaine Song)$.E-Eddie You Should Know Better%-G,Give Me Your Love (Love Song)#,C+Junkie Chase (Instrumental)+)*Freddie's Dead*)Pusherman!)?(Little Child Runnin' Wild%(G'Love Makes The World Go Round'#&Jimmy Jimmy&)%La Isla Bonita%$True Blue$/#Where's The Partyglom-1.22.4/examples/example_music_collection.glom0000644000175000017500000015411212234776363023551 0ustar00murraycmurrayc00000000000000 3 Sign 'O' The Times 2 1 1987 0 Born To Run 0 0 1975 2 The Wild, the Innocent, & the E-Street Shuffle 0 0 1973 1 True Blue 1 1 1987 4 Superfly 3 2 1972
        0 Bruce Springsteen 1 Madonna 2 Prince 3 Curtis Mayfield
        0 Sony 1 Warner Bros 2 Rhino
        0 0 Thunder Road 1 0 Tenth Avenue Freeze Out 2 0 Night 3 0 Backstreets 4 0 Born To Run 5 0 She's The One 6 0 Meeting Across The River 7 0 Jungleland 8 2 E Street Shuffle 9 2 4th of July, Asbury Park (Sandy) 10 2 Kitty's Back 11 2 Wild Billy's Circus Story 12 2 Incident on 57th Street 13 2 Rosalita (Come out Tonight) 14 2 New York City Serenade 15 3 Sign 'O' The Times 16 3 Play In The Sunshine 17 3 Housequake 18 3 Ballad of Dorothy Parker 19 3 It 20 3 Starfish and Coffee 21 3 Slow Love 22 3 Hot Thing 23 3 Forever In My Life 24 3 U Got The Look 25 3 If I Was Your Girlfriend 26 3 Strange Relationship 27 3 I Could Never Take The Place Of Your Man 28 3 The Cross 29 3 It's Gonna Be A Beautiful Night 30 3 Adore 31 1 Papa Don't Preach 32 1 Open Your Heart 33 1 White Heart 34 1 Live To Tell 35 1 Where's The Party 36 1 True Blue 37 1 La Isla Bonita 38 1 Jimmy Jimmy 39 1 Love Makes The World Go Round 40 4 Little Child Runnin' Wild 41 4 Pusherman 42 4 Freddie's Dead 43 4 Junkie Chase (Instrumental) 44 4 Give Me Your Love (Love Song) 45 4 Eddie You Should Know Better 46 4 No Thing On Me (Cocaine Song) 47 4 Think (Instrumental) 48 4 Superfly
        glom-1.22.4/examples/README0000644000175000017500000000046412234252645016473 0ustar00murraycmurrayc00000000000000These are examples of databases that could be created with Glom. You might even use an example as a starting point for your own database. When you open these Glom documents, Glom will offer to create the database on your database server. * example_smallbusiness: Staff, Products, Invoices, Purchase Orders glom-1.22.4/Makefile_glom.am0000644000175000017500000004537712234776363017073 0ustar00murraycmurrayc00000000000000## Copyright (c) 2009 Openismus GmbH ## ## This file is part of Glom. ## ## Glom is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published ## by the Free Software Foundation, either version 2 of the License, ## or (at your option) any later version. ## ## Glom is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ## See the GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see . # The location of the gettext catalogs as defined by intltool. glom_localedir = $(prefix)/$(DATADIRNAME)/locale #Let gimpruler build without changing the paths in its source code: glom_includes += -I$(top_srcdir)/glom/utility_widgets/gimpruler bin_PROGRAMS += glom/glom glom_glom_CPPFLAGS = $(glom_includes) $(GLOM_CFLAGS) $(PYTHON_CPPFLAGS) $(BOOST_PYTHON_CFLAGS) $(GCOV_CFLAGS) $(glom_defines) glom_eggspreadtable_files = \ glom/utility_widgets/eggspreadtable/eggmarshalers.c \ glom/utility_widgets/eggspreadtable/eggmarshalers.h \ glom/utility_widgets/eggspreadtable/eggspreadtable.c \ glom/utility_widgets/eggspreadtable/eggspreadtable.h \ glom/utility_widgets/eggspreadtable/eggspreadtablednd.c \ glom/utility_widgets/eggspreadtable/eggspreadtablednd.h \ glom/utility_widgets/eggspreadtable/eggplaceholder.c \ glom/utility_widgets/eggspreadtable/eggplaceholder.h \ glom/utility_widgets/eggspreadtablemm/eggspreadtablemm.cc \ glom/utility_widgets/eggspreadtablemm/eggspreadtablemm.h \ glom/utility_widgets/eggspreadtablemm/eggspreadtabledndmm.cc \ glom/utility_widgets/eggspreadtablemm/eggspreadtabledndmm.h \ glom/utility_widgets/eggspreadtablemm/private/eggspreadtablemm_p.h \ glom/utility_widgets/eggspreadtablemm/private/eggspreadtabledndmm_p.h glom_canvas_files = \ glom/utility_widgets/canvas/canvas_editable.cc \ glom/utility_widgets/canvas/canvas_editable.h \ glom/utility_widgets/canvas/canvas_group_grid.cc \ glom/utility_widgets/canvas/canvas_group_grid.h \ glom/utility_widgets/canvas/canvas_group_movable.cc \ glom/utility_widgets/canvas/canvas_group_movable.h \ glom/utility_widgets/canvas/canvas_group_resizable.cc \ glom/utility_widgets/canvas/canvas_group_resizable.h \ glom/utility_widgets/canvas/canvas_image_movable.cc \ glom/utility_widgets/canvas/canvas_image_movable.h \ glom/utility_widgets/canvas/canvas_item_movable.cc \ glom/utility_widgets/canvas/canvas_item_movable.h \ glom/utility_widgets/canvas/canvas_line_movable.cc \ glom/utility_widgets/canvas/canvas_line_movable.h \ glom/utility_widgets/canvas/canvas_rect_movable.cc \ glom/utility_widgets/canvas/canvas_rect_movable.h \ glom/utility_widgets/canvas/canvas_table_movable.cc \ glom/utility_widgets/canvas/canvas_table_movable.h \ glom/utility_widgets/canvas/canvas_text_movable.cc \ glom/utility_widgets/canvas/canvas_text_movable.h glom_source_files = \ glom/appwindow.cc \ glom/appwindow.h \ glom/base_db.cc \ glom/base_db.h \ glom/base_db_table.cc \ glom/base_db_table.h \ glom/base_db_table_data.cc \ glom/base_db_table_data.h \ glom/base_db_table_data_readonly.cc \ glom/base_db_table_data_readonly.h \ glom/box_db_table.cc \ glom/box_db_table.h \ glom/box_reports.cc \ glom/box_reports.h \ glom/box_withbuttons.cc \ glom/box_withbuttons.h \ glom/dialog_connection.cc \ glom/dialog_connection.h \ glom/dialog_existing_or_new.cc \ glom/dialog_existing_or_new.h \ glom/dialog_invalid_data.cc \ glom/dialog_invalid_data.h \ glom/filechooser_export.cc \ glom/filechooser_export.h \ glom/frame_glom.cc \ glom/frame_glom.h \ glom/glade_utils.cc \ glom/glade_utils.h \ glom/infobar_progress_creating.cc \ glom/infobar_progress_creating.h \ glom/notebook_glom.cc \ glom/notebook_glom.h \ glom/show_progress_message.cc \ glom/show_progress_message.h \ glom/signal_reemitter.h \ glom/utils_ui.cc \ glom/utils_ui.h \ glom/variablesmap.cc \ glom/variablesmap.h \ glom/window_boxholder.cc \ glom/window_boxholder.h \ glom/onlineglom_strings.cc \ glom/bakery/appwindow.cc \ glom/bakery/appwindow.h \ glom/bakery/appwindow_withdoc.cc \ glom/bakery/appwindow_withdoc.h \ glom/bakery/appwindow_withdoc_gtk.cc \ glom/bakery/appwindow_withdoc_gtk.h \ glom/bakery/busy_cursor.cc \ glom/bakery/busy_cursor.h \ glom/bakery/dialog_offersave.cc \ glom/bakery/dialog_offersave.h \ glom/import_csv/dialog_import_csv.cc \ glom/import_csv/dialog_import_csv.h \ glom/import_csv/dialog_import_csv_progress.cc \ glom/import_csv/dialog_import_csv_progress.h \ glom/import_csv/file_encodings.cc \ glom/import_csv/file_encodings.h \ glom/import_csv/csv_parser.cc \ glom/import_csv/csv_parser.h \ glom/mode_data/box_data.cc \ glom/mode_data/box_data.h \ glom/mode_data/box_data_calendar_related.cc \ glom/mode_data/box_data_calendar_related.h \ glom/mode_data/box_data_details.cc \ glom/mode_data/box_data_details.h \ glom/mode_data/box_data_list.cc \ glom/mode_data/box_data_list.h \ glom/mode_data/box_data_list_related.cc \ glom/mode_data/box_data_list_related.h \ glom/mode_data/box_data_manyrecords.cc \ glom/mode_data/box_data_manyrecords.h \ glom/mode_data/box_data_portal.cc \ glom/mode_data/box_data_portal.h \ glom/mode_data/buttonglom.cc \ glom/mode_data/buttonglom.h \ glom/mode_data/db_adddel/db_adddel.cc \ glom/mode_data/db_adddel/db_adddel.h \ glom/mode_data/db_adddel/db_adddel_withbuttons.cc \ glom/mode_data/db_adddel/db_adddel_withbuttons.h \ glom/mode_data/db_adddel/db_treeviewcolumn_glom.cc \ glom/mode_data/db_adddel/db_treeviewcolumn_glom.h \ glom/mode_data/flowtablewithfields.cc \ glom/mode_data/flowtablewithfields.h \ glom/mode_data/notebook_data.cc \ glom/mode_data/notebook_data.h \ glom/mode_data/datawidget/datawidget.cc \ glom/mode_data/datawidget/datawidget.h \ glom/mode_data/datawidget/cellcreation.cc \ glom/mode_data/datawidget/cellcreation.h \ glom/mode_data/datawidget/cellrenderer_buttonimage.cc \ glom/mode_data/datawidget/cellrenderer_buttonimage.h \ glom/mode_data/datawidget/cellrenderer_buttontext.cc \ glom/mode_data/datawidget/cellrenderer_buttontext.h \ glom/mode_data/datawidget/cellrenderer_dblist.cc \ glom/mode_data/datawidget/cellrenderer_dblist.h \ glom/mode_data/datawidget/checkbutton.cc \ glom/mode_data/datawidget/checkbutton.h \ glom/mode_data/datawidget/entry.cc \ glom/mode_data/datawidget/entry.h \ glom/mode_data/datawidget/label.cc \ glom/mode_data/datawidget/label.h \ glom/mode_data/datawidget/textview.cc \ glom/mode_data/datawidget/textview.h \ glom/mode_data/datawidget/dialog_choose_date.cc \ glom/mode_data/datawidget/dialog_choose_date.h \ glom/mode_data/datawidget/dialog_choose_id.cc \ glom/mode_data/datawidget/dialog_choose_id.h \ glom/mode_data/datawidget/dialog_new_record.cc \ glom/mode_data/datawidget/dialog_new_record.h \ glom/mode_data/datawidget/combo.cc \ glom/mode_data/datawidget/combo.h \ glom/mode_data/datawidget/combochoices.cc \ glom/mode_data/datawidget/combochoices.h \ glom/mode_data/datawidget/combochoiceswithtreemodel.cc \ glom/mode_data/datawidget/combochoiceswithtreemodel.h \ glom/mode_data/datawidget/combo_as_radio_buttons.cc \ glom/mode_data/datawidget/combo_as_radio_buttons.h \ glom/mode_data/datawidget/treemodel_db.cc \ glom/mode_data/datawidget/treemodel_db.h \ glom/mode_data/datawidget/treemodel_db_withextratext.cc \ glom/mode_data/datawidget/treemodel_db_withextratext.h \ glom/mode_find/box_data_details_find.cc \ glom/mode_find/box_data_details_find.h \ glom/mode_find/box_data_list_find.cc \ glom/mode_find/box_data_list_find.h \ glom/mode_find/notebook_find.cc \ glom/mode_find/notebook_find.h \ glom/print_layout/canvas_layout_item.cc \ glom/print_layout/canvas_layout_item.h \ glom/print_layout/canvas_print_layout.cc \ glom/print_layout/canvas_print_layout.h \ glom/print_layout/print_layout_utils.cc \ glom/print_layout/print_layout_utils.h \ glom/print_layout/printoperation_printlayout.cc \ glom/print_layout/printoperation_printlayout.h \ glom/python_embed/glom_python.cc \ glom/python_embed/glom_python.h \ glom/python_embed/python_ui_callbacks.cc \ glom/python_embed/python_ui_callbacks.h \ glom/utility_widgets/combo_textglade.cc \ glom/utility_widgets/combo_textglade.h \ glom/utility_widgets/dialog_flowtable.cc \ glom/utility_widgets/dialog_flowtable.h \ glom/utility_widgets/dialog_image_load_progress.cc \ glom/utility_widgets/dialog_image_load_progress.h \ glom/utility_widgets/dialog_image_save_progress.cc \ glom/utility_widgets/dialog_image_save_progress.h \ glom/utility_widgets/dialog_properties.cc \ glom/utility_widgets/dialog_properties.h \ glom/utility_widgets/flowtable.cc \ glom/utility_widgets/flowtable.h \ $(glom_eggspreadtable_files) \ glom/utility_widgets/gimpruler/gimpruler.c \ glom/utility_widgets/gimpruler/gimpruler.h \ glom/utility_widgets/gimpruler/libgimpbase/gimpbase.h \ glom/utility_widgets/gimpruler/libgimpbase/gimpbaseenums.h \ glom/utility_widgets/gimpruler/libgimpbase/gimpbasetypes.h \ glom/utility_widgets/gimpruler/libgimpbase/gimpbase-private.h \ glom/utility_widgets/gimpruler/libgimpbase/gimpbase-private.c \ glom/utility_widgets/gimpruler/libgimpbase/gimpparam.h \ glom/utility_widgets/gimpruler/libgimpbase/gimpunit.c \ glom/utility_widgets/gimpruler/libgimpbase/gimpunit.h \ glom/utility_widgets/gimpruler/libgimpmath/gimpmath.h \ glom/utility_widgets/imageglom.cc \ glom/utility_widgets/imageglom.h \ glom/utility_widgets/layoutwidgetbase.cc \ glom/utility_widgets/layoutwidgetbase.h \ glom/utility_widgets/layoutwidgetfield.cc \ glom/utility_widgets/layoutwidgetfield.h \ glom/utility_widgets/layoutwidgetmenu.cc \ glom/utility_widgets/layoutwidgetmenu.h \ glom/utility_widgets/layoutwidgetutils.cc \ glom/utility_widgets/layoutwidgetutils.h \ glom/utility_widgets/notebookglom.cc \ glom/utility_widgets/notebookglom.h \ glom/utility_widgets/notebook_noframe.cc \ glom/utility_widgets/notebook_noframe.h \ glom/utility_widgets/placeholder.cc \ glom/utility_widgets/placeholder.h \ glom/utility_widgets/adddel/adddel.cc \ glom/utility_widgets/adddel/adddel.h \ glom/utility_widgets/adddel/adddel_withbuttons.cc \ glom/utility_widgets/adddel/adddel_withbuttons.h \ glom/utility_widgets/adddel/treeviewcolumn_glom.cc \ glom/utility_widgets/adddel/treeviewcolumn_glom.h \ $(glom_canvas_files) \ glom/utility_widgets/cellrendererlist.cc \ glom/utility_widgets/cellrendererlist.h if !GLOM_ENABLE_CLIENT_ONLY glom_source_files += \ glom/mode_design/dialog_database_preferences.cc \ glom/mode_design/dialog_database_preferences.h \ glom/mode_design/dialog_initial_password.cc \ glom/mode_design/dialog_initial_password.h \ glom/mode_design/box_db_table_relationships.cc \ glom/mode_design/box_db_table_relationships.h \ glom/mode_design/dialog_add_related_table.cc \ glom/mode_design/dialog_add_related_table.h \ glom/mode_design/dialog_design.cc \ glom/mode_design/dialog_design.h \ glom/mode_design/dialog_fields.cc \ glom/mode_design/dialog_fields.h \ glom/mode_design/dialog_relationships.cc \ glom/mode_design/dialog_relationships.h \ glom/mode_design/iso_codes.cc \ glom/mode_design/iso_codes.h \ glom/mode_design/fields/box_db_table_definition.cc \ glom/mode_design/fields/box_db_table_definition.h \ glom/mode_design/fields/combo_fieldtype.cc \ glom/mode_design/fields/combo_fieldtype.h \ glom/mode_design/fields/dialog_fieldcalculation.cc \ glom/mode_design/fields/dialog_fieldcalculation.h \ glom/mode_design/fields/dialog_fielddefinition.cc \ glom/mode_design/fields/dialog_fielddefinition.h \ glom/mode_design/layout/combobox_fields.cc \ glom/mode_design/layout/combobox_fields.h \ glom/mode_design/layout/combobox_relationship.cc \ glom/mode_design/layout/combobox_relationship.h \ glom/mode_design/layout/dialog_choose_field.cc \ glom/mode_design/layout/dialog_choose_field.h \ glom/mode_design/layout/dialog_choose_relationship.cc \ glom/mode_design/layout/dialog_choose_relationship.h \ glom/mode_design/layout/dialog_layout.cc \ glom/mode_design/layout/dialog_layout.h \ glom/mode_design/layout/dialog_layout_export.cc \ glom/mode_design/layout/dialog_layout_export.h \ glom/mode_design/layout/dialog_layout_calendar_related.cc \ glom/mode_design/layout/dialog_layout_calendar_related.h \ glom/mode_design/layout/dialog_layout_details.cc \ glom/mode_design/layout/dialog_layout_details.h \ glom/mode_design/layout/dialog_layout_list.cc \ glom/mode_design/layout/dialog_layout_list.h \ glom/mode_design/layout/dialog_layout_list_related.cc \ glom/mode_design/layout/dialog_layout_list_related.h \ glom/mode_design/layout/treestore_layout.cc \ glom/mode_design/layout/treestore_layout.h \ glom/mode_design/layout/layout_item_dialogs/box_formatting.cc \ glom/mode_design/layout/layout_item_dialogs/box_formatting.h \ glom/mode_design/layout/layout_item_dialogs/combo_summarytype.cc \ glom/mode_design/layout/layout_item_dialogs/combo_summarytype.h \ glom/mode_design/layout/layout_item_dialogs/comboentry_borderwidth.cc \ glom/mode_design/layout/layout_item_dialogs/comboentry_borderwidth.h \ glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.h \ glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.h \ glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.h \ glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_formatting.h \ glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_group_by.h \ glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.h \ glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.h \ glom/mode_design/layout/layout_item_dialogs/dialog_line.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_line.h \ glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_notebook.h \ glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.h \ glom/mode_design/layout/layout_item_dialogs/dialog_textobject.cc \ glom/mode_design/layout/layout_item_dialogs/dialog_textobject.h \ glom/mode_design/relationships_overview/canvas_group_dbtable.cc \ glom/mode_design/relationships_overview/canvas_group_dbtable.h \ glom/mode_design/relationships_overview/dialog_relationships_overview.cc \ glom/mode_design/relationships_overview/dialog_relationships_overview.h \ glom/mode_design/relationships_overview/printoperation_relationshipsoverview.cc \ glom/mode_design/relationships_overview/printoperation_relationshipsoverview.h \ glom/mode_design/print_layouts/box_print_layouts.cc \ glom/mode_design/print_layouts/box_print_layouts.h \ glom/mode_design/print_layouts/dialog_text_formatting.cc \ glom/mode_design/print_layouts/dialog_text_formatting.h \ glom/mode_design/print_layouts/print_layout_toolbar.cc \ glom/mode_design/print_layouts/print_layout_toolbar.h \ glom/mode_design/print_layouts/print_layout_toolbar_button.cc \ glom/mode_design/print_layouts/print_layout_toolbar_button.h \ glom/mode_design/print_layouts/window_print_layout_edit.cc \ glom/mode_design/print_layouts/window_print_layout_edit.h \ glom/mode_design/report_layout/dialog_layout_report.cc \ glom/mode_design/report_layout/dialog_layout_report.h \ glom/mode_design/report_layout/treestore_report_layout.cc \ glom/mode_design/report_layout/treestore_report_layout.h \ glom/mode_design/script_library/dialog_new_script.cc \ glom/mode_design/script_library/dialog_new_script.h \ glom/mode_design/script_library/dialog_script_library.cc \ glom/mode_design/script_library/dialog_script_library.h \ glom/mode_design/users/dialog_choose_user.cc \ glom/mode_design/users/dialog_choose_user.h \ glom/mode_design/users/dialog_groups_list.cc \ glom/mode_design/users/dialog_groups_list.h \ glom/mode_design/users/dialog_new_group.cc \ glom/mode_design/users/dialog_new_group.h \ glom/mode_design/users/dialog_user.cc \ glom/mode_design/users/dialog_user.h \ glom/mode_design/users/dialog_users_list.cc \ glom/mode_design/users/dialog_users_list.h \ glom/mode_design/comboentry_currency.cc \ glom/mode_design/comboentry_currency.h \ glom/mode_design/translation/combobox_locale.cc \ glom/mode_design/translation/combobox_locale.h \ glom/mode_design/translation/dialog_change_language.cc \ glom/mode_design/translation/dialog_change_language.h \ glom/mode_design/translation/dialog_copy_translation.cc \ glom/mode_design/translation/dialog_copy_translation.h \ glom/mode_design/translation/dialog_identify_original.cc \ glom/mode_design/translation/dialog_identify_original.h \ glom/mode_design/translation/window_translations.cc \ glom/mode_design/translation/window_translations.h \ glom/utility_widgets/filechooserdialog_saveextras.cc \ glom/utility_widgets/filechooserdialog_saveextras.h \ glom/utility_widgets/layouttoolbar.cc \ glom/utility_widgets/layouttoolbar.h \ glom/utility_widgets/layouttoolbarbutton.cc \ glom/utility_widgets/layouttoolbarbutton.h \ glom/utility_widgets/notebooklabelglom.cc \ glom/utility_widgets/notebooklabelglom.h endif glom_source_files += \ glom/navigation/box_tables.cc \ glom/navigation/box_tables.h glom_glom_SOURCES = \ glom/application.cc \ glom/application.h \ glom/main.cc \ glom/main_local_options.cc \ glom/main_local_options.h \ glom/main_remote_options.cc \ glom/main_remote_options.h \ $(glom_source_files) glom_all_libs = $(win_resfile) \ glom/libglom/libglom-$(GLOM_ABI_VERSION).la $(libglom_all_libs) \ $(GLOM_LIBS) $(INTLLIBS) glom_glom_LDADD = $(glom_all_libs) if HOST_WIN32 # Suppress console window glom_glom_LDFLAGS = -mwindows else glom_glom_LDFLAGS = endif glom-1.22.4/COPYING0000644000175000017500000010451312234252645015030 0ustar00murraycmurrayc00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . glom-1.22.4/install-sh0000755000175000017500000003325512234777115016011 0ustar00murraycmurrayc00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: glom-1.22.4/test-driver0000755000175000017500000000761112234777122016176 0ustar00murraycmurrayc00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2012-06-27.10; # UTC # Copyright (C) 2011-2013 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: glom-1.22.4/intltool-merge.in0000644000175000017500000000000012234777073017257 0ustar00murraycmurrayc00000000000000glom-1.22.4/config.sub0000755000175000017500000010535412234777115015770 0ustar00murraycmurrayc00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-08-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: glom-1.22.4/compile0000755000175000017500000001624512234777115015363 0ustar00murraycmurrayc00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: glom-1.22.4/glom.xml0000644000175000017500000000140612234252645015452 0ustar00murraycmurrayc00000000000000 Glom Glom glom-1.22.4/xslt/0000755000175000017500000000000012235000126014745 5ustar00murraycmurrayc00000000000000glom-1.22.4/xslt/print_report_to_html.xsl0000644000175000017500000001566112234776363022011 0ustar00murraycmurrayc00000000000000 <xsl:if test="string(@show_table_title)"> <xsl:if test="string(@table)"> <xsl:value-of select="@table"/>: </xsl:if> </xsl:if> <xsl:value-of select="@title"/>

        :

        :

        0

        0
        right left 0 right left 0 0
        glom-1.22.4/gnome-doc-utils.make0000644000175000017500000006126612234777071017656 0ustar00murraycmurrayc00000000000000# gnome-doc-utils.make - make magic for building documentation # Copyright (C) 2004-2005 Shaun McCance # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. ################################################################################ ## @@ Generating Header Files ## @ DOC_H_FILE ## The name of the header file to generate DOC_H_FILE ?= ## @ DOC_H_DOCS ## The input DocBook files for generating the header file DOC_H_DOCS ?= $(DOC_H_FILE): $(DOC_H_DOCS); @rm -f $@.tmp; touch $@.tmp; echo 'const gchar* documentation_credits[] = {' >> $@.tmp list='$(DOC_H_DOCS)'; for doc in $$list; do \ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ xsltproc --path "$$xmlpath" $(_credits) $$doc; \ done | sort | uniq \ | awk 'BEGIN{s=""}{n=split($$0,w,"<");if(s!=""&&s!=substr(w[1],1,length(w[1])-1)){print s};if(n>1){print $$0;s=""}else{s=$$0}};END{if(s!=""){print s}}' \ | sed -e 's/\\/\\\\/' -e 's/"/\\"/' -e 's/\(.*\)/\t"\1",/' >> $@.tmp echo ' NULL' >> $@.tmp echo '};' >> $@.tmp echo >> $@.tmp list='$(DOC_H_DOCS)'; for doc in $$list; do \ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ docid=`echo "$$doc" | sed -e 's/.*\/\([^/]*\)\.xml/\1/' \ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`; \ echo $$xmlpath; \ ids=`xsltproc --xinclude --path "$$xmlpath" $(_ids) $$doc`; \ for id in $$ids; do \ echo '#define HELP_'`echo $$docid`'_'`echo $$id \ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`' "'$$id'"' >> $@.tmp; \ done; \ echo >> $@.tmp; \ done; cp $@.tmp $@ && rm -f $@.tmp dist-check-gdu: if !HAVE_GNOME_DOC_UTILS @echo "*** GNOME Doc Utils must be installed in order to make dist" @false endif .PHONY: dist-doc-header dist-doc-header: $(DOC_H_FILE) @if test -f "$(DOC_H_FILE)"; then d=; else d="$(srcdir)/"; fi; \ echo "$(INSTALL_DATA) $${d}$(DOC_H_FILE) $(distdir)/$(DOC_H_FILE)"; \ $(INSTALL_DATA) "$${d}$(DOC_H_FILE)" "$(distdir)/$(DOC_H_FILE)"; doc-dist-hook: dist-check-gdu $(if $(DOC_H_FILE),dist-doc-header) .PHONY: clean-doc-header _clean_doc_header = $(if $(DOC_H_FILE),clean-doc-header) clean-local: $(_clean_doc_header) distclean-local: $(_clean_doc_header) mostlyclean-local: $(_clean_doc_header) maintainer-clean-local: $(_clean_doc_header) clean-doc-header: rm -f $(DOC_H_FILE) all: $(DOC_H_FILE) ################################################################################ ## @@ Generating Documentation Files ## @ DOC_MODULE ## The name of the document being built DOC_MODULE ?= ## @ DOC_ID ## The unique identifier for a Mallard document DOC_ID ?= ## @ DOC_PAGES ## Page files in a Mallard document DOC_PAGES ?= ## @ DOC_ENTITIES ## Files included with a SYSTEM entity DOC_ENTITIES ?= ## @ DOC_INCLUDES ## Files included with XInclude DOC_INCLUDES ?= ## @ DOC_FIGURES ## Figures and other external data DOC_FIGURES ?= ## @ DOC_FORMATS ## The default formats to be built and installed DOC_FORMATS ?= docbook _DOC_REAL_FORMATS = $(if $(DOC_USER_FORMATS),$(DOC_USER_FORMATS),$(DOC_FORMATS)) ## @ DOC_LINGUAS ## The languages this document is translated into DOC_LINGUAS ?= _DOC_REAL_LINGUAS = $(if $(filter environment,$(origin LINGUAS)), \ $(filter $(LINGUAS),$(DOC_LINGUAS)), \ $(DOC_LINGUAS)) _DOC_ABS_SRCDIR = @abs_srcdir@ ################################################################################ ## Variables for Bootstrapping _xml2po ?= `which xml2po` _xml2po_mode = $(if $(DOC_ID),mallard,docbook) _db2html ?= `$(PKG_CONFIG) --variable db2html gnome-doc-utils` _db2omf ?= `$(PKG_CONFIG) --variable db2omf gnome-doc-utils` _chunks ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/chunks.xsl _credits ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/credits.xsl _ids ?= $(shell $(PKG_CONFIG) --variable xmldir gnome-doc-utils)/gnome/xslt/docbook/utils/ids.xsl if ENABLE_SK _ENABLE_SK = true _skpkgdatadir ?= `scrollkeeper-config --pkgdatadir` _sklocalstatedir ?= `scrollkeeper-config --pkglocalstatedir` _skcontentslist ?= $(_skpkgdatadir)/Templates/C/scrollkeeper_cl.xml endif ################################################################################ ## Support for automake silent-rules GDU_V_XML2PO=$(GDU__v_XML2PO_$(V)) GDU__v_XML2PO_=$(GDU__v_XML2PO_$(AM_DEFAULT_VERBOSITY)) GDU__v_XML2PO_0=@echo " XML2PO" $@; GDU_V_MSGFMT=$(GDU__v_MSGFMT_$(V)) GDU__v_MSGFMT_=$(GDU__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) GDU__v_MSGFMT_0=@echo " MSGFMT" $@; GDU_V_DB2OMF=$(GDU__v_DB2OMF_$(V)) GDU__v_DB2OMF_=$(GDU__v_DB2OMF_$(AM_DEFAULT_VERBOSITY)) GDU__v_DB2OMF_0=@echo " DB2OMF" $@; GDU_V_DB2HTM=$(GDU__v_DB2HTM_$(V)) GDU__v_DB2HTM_=$(GDU__v_DB2HTM_$(AM_DEFAULT_VERBOSITY)) GDU__v_DB2HTM_0=@echo " DB2HTM" $@; ################################################################################ ## @@ Rules for OMF Files db2omf_args = \ --stringparam db2omf.basename $(DOC_MODULE) \ --stringparam db2omf.format $(3) \ --stringparam db2omf.dtd \ $(shell xmllint --format $(2) | grep -h PUBLIC | head -n 1 \ | sed -e 's/.*PUBLIC \(\"[^\"]*\"\).*/\1/') \ --stringparam db2omf.lang $(notdir $(patsubst %/$(notdir $(2)),%,$(2))) \ --stringparam db2omf.omf_dir "$(OMF_DIR)" \ --stringparam db2omf.help_dir "$(HELP_DIR)" \ --stringparam db2omf.omf_in "$(_DOC_OMF_IN)" \ $(if $(_ENABLE_SK), \ --stringparam db2omf.scrollkeeper_cl "$(_skcontentslist)") \ $(_db2omf) $(2) ## @ _DOC_OMF_IN ## The OMF input file _DOC_OMF_IN = $(if $(DOC_MODULE),$(wildcard $(_DOC_ABS_SRCDIR)/$(DOC_MODULE).omf.in)) ## @ _DOC_OMF_DB ## The OMF files for DocBook output _DOC_OMF_DB = $(if $(_DOC_OMF_IN), \ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-$(lc).omf)) $(_DOC_OMF_DB) : $(_DOC_OMF_IN) $(_DOC_OMF_DB) : $(DOC_MODULE)-%.omf : %/$(DOC_MODULE).xml @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ echo "The file '$(_skcontentslist)' does not exist." >&2; \ echo "Please check your ScrollKeeper installation." >&2; \ exit 1; } $(GDU_V_DB2OMF)xsltproc -o $@ $(call db2omf_args,$@,$<,'docbook') || { rm -f "$@"; exit 1; } ## @ _DOC_OMF_HTML ## The OMF files for HTML output _DOC_OMF_HTML = $(if $(_DOC_OMF_IN), \ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-html-$(lc).omf)) $(_DOC_OMF_HTML) : $(_DOC_OMF_IN) $(_DOC_OMF_HTML) : $(DOC_MODULE)-html-%.omf : %/$(DOC_MODULE).xml if ENABLE_SK @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ echo "The file '$(_skcontentslist)' does not exist" >&2; \ echo "Please check your ScrollKeeper installation." >&2; \ exit 1; } endif $(GDU_V_DB2OMF)xsltproc -o $@ $(call db2omf_args,$@,$<,'xhtml') || { rm -f "$@"; exit 1; } ## @ _DOC_OMF_ALL ## All OMF output files to be built # FIXME _DOC_OMF_ALL = \ $(if $(filter docbook,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_DB)) \ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_HTML)) .PHONY: omf omf: $(_DOC_OMF_ALL) ################################################################################ ## @@ C Locale Documents ## @ _DOC_C_MODULE ## The top-level documentation file in the C locale _DOC_C_MODULE = $(if $(DOC_MODULE),C/$(DOC_MODULE).xml) ## @ _DOC_C_PAGES ## Page files in a Mallard document in the C locale _DOC_C_PAGES = $(foreach page,$(DOC_PAGES),C/$(page)) ## @ _DOC_C_ENTITIES ## Files included with a SYSTEM entity in the C locale _DOC_C_ENTITIES = $(foreach ent,$(DOC_ENTITIES),C/$(ent)) ## @ _DOC_C_XINCLUDES ## Files included with XInclude in the C locale _DOC_C_INCLUDES = $(foreach inc,$(DOC_INCLUDES),C/$(inc)) ## @ _DOC_C_DOCS ## All documentation files in the C locale _DOC_C_DOCS = \ $(_DOC_C_ENTITIES) $(_DOC_C_INCLUDES) \ $(_DOC_C_PAGES) $(_DOC_C_MODULE) ## @ _DOC_C_DOCS_NOENT ## All documentation files in the C locale, ## except files included with a SYSTEM entity _DOC_C_DOCS_NOENT = \ $(_DOC_C_MODULE) $(_DOC_C_INCLUDES) \ $(_DOC_C_PAGES) ## @ _DOC_C_FIGURES ## All figures and other external data in the C locale _DOC_C_FIGURES = $(if $(DOC_FIGURES), \ $(foreach fig,$(DOC_FIGURES),C/$(fig)), \ $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/C/figures/*.png))) ## @ _DOC_C_HTML ## All HTML documentation in the C locale # FIXME: probably have to shell escape to determine the file names _DOC_C_HTML = $(foreach f, \ $(shell xsltproc --xinclude \ --stringparam db.chunk.basename "$(DOC_MODULE)" \ $(_chunks) "C/$(DOC_MODULE).xml"), \ C/$(f).xhtml) ############################################################################### ## @@ Other Locale Documentation ## @ _DOC_POFILES ## The .po files used for translating the document _DOC_POFILES = $(if $(DOC_MODULE)$(DOC_ID), \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(lc).po)) .PHONY: po po: $(_DOC_POFILES) ## @ _DOC_MOFILES ## The .mo files used for translating the document _DOC_MOFILES = $(patsubst %.po,%.mo,$(_DOC_POFILES)) .PHONY: mo mo: $(_DOC_MOFILES) ## @ _DOC_LC_MODULES ## The top-level documentation files in all other locales _DOC_LC_MODULES = $(if $(DOC_MODULE), \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xml)) ## @ _DOC_LC_PAGES ## Page files in a Mallard document in all other locales _DOC_LC_PAGES = \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach page,$(_DOC_C_PAGES), \ $(lc)/$(notdir $(page)) )) ## @ _DOC_LC_XINCLUDES ## Files included with XInclude in all other locales _DOC_LC_INCLUDES = \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach inc,$(_DOC_C_INCLUDES), \ $(lc)/$(notdir $(inc)) )) ## @ _DOC_LC_HTML ## All HTML documentation in all other locales # FIXME: probably have to shell escape to determine the file names _DOC_LC_HTML = \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach doc,$(_DOC_C_HTML), \ $(lc)/$(notdir $(doc)) )) ## @ _DOC_LC_DOCS ## All documentation files in all other locales _DOC_LC_DOCS = \ $(_DOC_LC_MODULES) $(_DOC_LC_INCLUDES) $(_DOC_LC_PAGES) \ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_LC_HTML)) ## @ _DOC_LC_FIGURES ## All figures and other external data in all other locales _DOC_LC_FIGURES = $(foreach lc,$(_DOC_REAL_LINGUAS), \ $(patsubst C/%,$(lc)/%,$(_DOC_C_FIGURES)) ) _DOC_SRC_FIGURES = \ $(foreach fig,$(_DOC_C_FIGURES), $(foreach lc,C $(_DOC_REAL_LINGUAS), \ $(wildcard $(srcdir)/$(lc)/$(patsubst C/%,%,$(fig))) )) $(_DOC_POFILES): @if ! test -d $(dir $@); then \ echo "mkdir $(dir $@)"; \ mkdir "$(dir $@)"; \ fi @if test ! -f $@ -a -f $(srcdir)/$@; then \ echo "cp $(srcdir)/$@ $@"; \ cp "$(srcdir)/$@" "$@"; \ fi; @docs=; \ list='$(_DOC_C_DOCS_NOENT)'; for doc in $$list; do \ docs="$$docs $(_DOC_ABS_SRCDIR)/$$doc"; \ done; \ if ! test -f $@; then \ echo "(cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp)"; \ (cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp); \ else \ echo "(cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs)"; \ (cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs); \ fi $(_DOC_MOFILES): %.mo: %.po $(AM_V_at)if ! test -d $(dir $@); then mkdir "$(dir $@)"; fi $(GDU_V_MSGFMT)msgfmt -o $@ $< # FIXME: fix the dependancy # FIXME: hook xml2po up $(_DOC_LC_DOCS) : $(_DOC_MOFILES) $(_DOC_LC_DOCS) : $(_DOC_C_DOCS) $(AM_V_at)if ! test -d $(dir $@); then mkdir $(dir $@); fi $(GDU_V_XML2PO)if [ -f "C/$(notdir $@)" ]; then d="../"; else d="$(_DOC_ABS_SRCDIR)/"; fi; \ mo="$(dir $@)$(patsubst %/$(notdir $@),%,$@).mo"; \ if [ -f "$${mo}" ]; then mo="../$${mo}"; else mo="$(_DOC_ABS_SRCDIR)/$${mo}"; fi; \ (cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e -t "$${mo}" \ "$${d}C/$(notdir $@)" > $(notdir $@).tmp && \ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp) ## @ _DOC_POT ## A pot file _DOC_POT = $(if $(DOC_MODULE),$(DOC_MODULE).pot,$(if $(DOC_ID),$(DOC_ID).pot)) .PHONY: pot pot: $(_DOC_POT) $(_DOC_POT): $(_DOC_C_DOCS_NOENT) $(GDU_V_XML2PO)$(_xml2po) -m $(_xml2po_mode) -e -o $@ $^ ################################################################################ ## @@ All Documentation ## @ _DOC_HTML_ALL ## All HTML documentation, only if it's built _DOC_HTML_ALL = $(if $(filter html HTML,$(_DOC_REAL_FORMATS)), \ $(_DOC_C_HTML) $(_DOC_LC_HTML)) _DOC_HTML_TOPS = $(foreach lc,C $(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xhtml) $(_DOC_HTML_TOPS): $(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(GDU_V_DB2HTM)xsltproc -o $@ --xinclude --param db.chunk.chunk_top "false()" --stringparam db.chunk.basename "$(DOC_MODULE)" --stringparam db.chunk.extension ".xhtml" $(_db2html) $(patsubst %.xhtml,%.xml,$@) ################################################################################ ## All all: \ $(_DOC_C_DOCS) $(_DOC_LC_DOCS) \ $(_DOC_OMF_ALL) $(_DOC_DSK_ALL) \ $(_DOC_HTML_ALL) $(_DOC_POFILES) ################################################################################ ## Clean .PHONY: clean-doc-omf clean-doc-dsk clean-doc-lc clean-doc-dir clean-doc-omf: ; rm -f $(_DOC_OMF_DB) $(_DOC_OMF_HTML) clean-doc-dsk: ; rm -f $(_DOC_DSK_DB) $(_DOC_DSK_HTML) clean-doc-lc: rm -f $(_DOC_LC_DOCS) rm -f $(_DOC_MOFILES) @list='$(_DOC_POFILES)'; for po in $$list; do \ if ! test "$$po" -ef "$(srcdir)/$$po"; then \ echo "rm -f $$po"; \ rm -f "$$po"; \ fi; \ done # .xml2.po.mo cleaning is obsolete as of 0.18.1 and could be removed in 0.20.x @for lc in C $(_DOC_REAL_LINGUAS); do \ if test -f "$$lc/.xml2po.mo"; then \ echo "rm -f $$lc/.xml2po.mo"; \ rm -f "$$lc/.xml2po.mo"; \ fi; \ done clean-doc-dir: clean-doc-lc @for lc in C $(_DOC_REAL_LINGUAS); do \ for dir in `find $$lc -depth -type d`; do \ if ! test $$dir -ef $(srcdir)/$$dir; then \ echo "rmdir $$dir"; \ rmdir "$$dir"; \ fi; \ done; \ done _clean_omf = $(if $(_DOC_OMF_IN),clean-doc-omf) _clean_dsk = $(if $(_DOC_DSK_IN),clean-doc-dsk) _clean_lc = $(if $(_DOC_REAL_LINGUAS),clean-doc-lc) _clean_dir = $(if $(DOC_MODULE)$(DOC_ID),clean-doc-dir) clean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) distclean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) mostlyclean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) maintainer-clean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) ################################################################################ ## Dist .PHONY: dist-doc-docs dist-doc-pages dist-doc-figs dist-doc-omf dist-doc-dsk doc-dist-hook: \ $(if $(DOC_MODULE)$(DOC_ID),dist-doc-docs) \ $(if $(_DOC_C_FIGURES),dist-doc-figs) \ $(if $(_DOC_OMF_IN),dist-doc-omf) # $(if $(_DOC_DSK_IN),dist-doc-dsk) dist-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES) @for lc in C $(_DOC_REAL_LINGUAS); do \ echo " $(mkinstalldirs) $(distdir)/$$lc"; \ $(mkinstalldirs) "$(distdir)/$$lc"; \ done @list='$(_DOC_C_DOCS)'; \ for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$docdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ $(mkinstalldirs) "$(distdir)/$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ done @list='$(_DOC_LC_DOCS)'; \ for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$docdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ $(mkinstalldirs) "$(distdir)/$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ done @list='$(_DOC_POFILES)'; \ for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$docdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ $(mkinstalldirs) "$(distdir)/$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ done dist-doc-figs: $(_DOC_SRC_FIGURES) @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; \ for fig in $$list; do \ if test -f "$$fig"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$fig"; then \ figdir=`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$figdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$figdir"; \ $(mkinstalldirs) "$(distdir)/$$figdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$fig $(distdir)/$$fig"; \ $(INSTALL_DATA) "$$d$$fig" "$(distdir)/$$fig"; \ fi; \ done; dist-doc-omf: @if test -f "$(_DOC_OMF_IN)"; then d=; else d="$(srcdir)/"; fi; \ echo "$(INSTALL_DATA) $$d$(_DOC_OMF_IN) $(distdir)/$(notdir $(_DOC_OMF_IN))"; \ $(INSTALL_DATA) "$$d$(_DOC_OMF_IN)" "$(distdir)/$(notdir $(_DOC_OMF_IN))" dist-doc-dsk: @if test -f "$(_DOC_DSK_IN)"; then d=; else d="$(srcdir)/"; fi; \ echo "$(INSTALL_DATA) $$d$(_DOC_DSK_IN) $(distdir)/$(notdir $(_DOC_DSK_IN))"; \ $(INSTALL_DATA) "$$d$(_DOC_DSK_IN)" "$(distdir)/$(notdir $(_DOC_DSK_IN))" ################################################################################ ## Check .PHONY: check-doc-docs check-doc-omf check: \ $(if $(DOC_MODULE),check-doc-docs) \ $(if $(DOC_ID),check-doc-pages) \ $(if $(_DOC_OMF_IN),check-doc-omf) check-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) @for lc in C $(_DOC_REAL_LINGUAS); do \ if test -f "$$lc"; \ then d=; \ xmlpath="$$lc"; \ else \ d="$(srcdir)/"; \ xmlpath="$$lc:$(srcdir)/$$lc"; \ fi; \ echo "xmllint --noout --noent --path $$xmlpath --xinclude --postvalid $$d$$lc/$(DOC_MODULE).xml"; \ xmllint --noout --noent --path "$$xmlpath" --xinclude --postvalid "$$d$$lc/$(DOC_MODULE).xml"; \ done check-doc-pages: $(_DOC_C_PAGES) $(_DOC_LC_PAGES) for lc in C $(_DOC_REAL_LINGUAS); do \ if test -f "$$lc"; \ then d=; \ xmlpath="$$lc"; \ else \ d="$(srcdir)/"; \ xmlpath="$$lc:$(srcdir)/$$lc"; \ fi; \ for page in $(DOC_PAGES); do \ echo "xmllint --noout --noent --path $$xmlpath --xinclude $$d$$lc/$$page"; \ xmllint --noout --noent --path "$$xmlpath" --xinclude "$$d$$lc/$$page"; \ done; \ done check-doc-omf: $(_DOC_OMF_ALL) @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ echo "xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf"; \ xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf; \ done ################################################################################ ## Install .PHONY: install-doc-docs install-doc-html install-doc-figs install-doc-omf install-doc-dsk _doc_install_dir = $(if $(DOC_ID),$(DOC_ID),$(DOC_MODULE)) install-data-local: \ $(if $(DOC_MODULE)$(DOC_ID),install-doc-docs) \ $(if $(_DOC_HTML_ALL),install-doc-html) \ $(if $(_DOC_C_FIGURES),install-doc-figs) \ $(if $(_DOC_OMF_IN),install-doc-omf) # $(if $(_DOC_DSK_IN),install-doc-dsk) install-doc-docs: @for lc in C $(_DOC_REAL_LINGUAS); do \ echo "$(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc"; \ $(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc; \ done @list='$(_DOC_C_DOCS)'; for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ if ! test -d "$$docdir"; then \ echo "$(mkinstalldirs) $$docdir"; \ $(mkinstalldirs) "$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ done @list='$(_DOC_LC_DOCS)'; for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ if ! test -d "$$docdir"; then \ echo "$(mkinstalldirs) $$docdir"; \ $(mkinstalldirs) "$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ done install-doc-figs: @list='$(patsubst C/%,%,$(_DOC_C_FIGURES))'; for fig in $$list; do \ for lc in C $(_DOC_REAL_LINGUAS); do \ figsymlink=false; \ if test -f "$$lc/$$fig"; then \ figfile="$$lc/$$fig"; \ elif test -f "$(srcdir)/$$lc/$$fig"; then \ figfile="$(srcdir)/$$lc/$$fig"; \ else \ figsymlink=true; \ fi; \ figdir="$$lc/"`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ figdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$figdir"; \ if ! test -d "$$figdir"; then \ echo "$(mkinstalldirs) $$figdir"; \ $(mkinstalldirs) "$$figdir"; \ fi; \ figbase=`echo $$fig | sed -e 's/^.*\///'`; \ if $$figsymlink; then \ echo "cd $$figdir && $(LN_S) -f $(HELP_DIR)/$(_doc_install_dir)/C/$$fig $$figbase"; \ ( cd "$$figdir" && $(LN_S) -f "$(HELP_DIR)/$(_doc_install_dir)/C/$$fig" "$$figbase" ); \ else \ echo "$(INSTALL_DATA) $$figfile $$figdir$$figbase"; \ $(INSTALL_DATA) "$$figfile" "$$figdir$$figbase"; \ fi; \ done; \ done install-doc-html: echo install-html install-doc-omf: $(mkinstalldirs) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir) @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ echo "$(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ $(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf; \ done @if test "x$(_ENABLE_SK)" = "xtrue"; then \ echo "scrollkeeper-update -p $(DESTDIR)$(_sklocalstatedir) -o $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ scrollkeeper-update -p "$(DESTDIR)$(_sklocalstatedir)" -o "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ fi; install-doc-dsk: echo install-dsk ################################################################################ ## Uninstall .PHONY: uninstall-doc-docs uninstall-doc-html uninstall-doc-figs uninstall-doc-omf uninstall-doc-dsk uninstall-local: \ $(if $(DOC_MODULE)$(DOC_ID),uninstall-doc-docs) \ $(if $(_DOC_HTML_ALL),uninstall-doc-html) \ $(if $(_DOC_C_FIGURES),uninstall-doc-figs) \ $(if $(_DOC_OMF_IN),uninstall-doc-omf) # $(if $(_DOC_DSK_IN),uninstall-doc-dsk) uninstall-doc-docs: @list='$(_DOC_C_DOCS)'; for doc in $$list; do \ echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ done @list='$(_DOC_LC_DOCS)'; for doc in $$list; do \ echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ done uninstall-doc-figs: @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; for fig in $$list; do \ echo "rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ done; uninstall-doc-omf: @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ if test "x$(_ENABLE_SK)" = "xtrue"; then \ echo "scrollkeeper-uninstall -p $(_sklocalstatedir) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ scrollkeeper-uninstall -p "$(_sklocalstatedir)" "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ fi; \ echo "rm -f $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ rm -f "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ done glom-1.22.4/intltool-update.in0000644000175000017500000000000012234777073017442 0ustar00murraycmurrayc00000000000000glom-1.22.4/glom.desktop.in.in0000644000175000017500000000062612234252645017340 0ustar00murraycmurrayc00000000000000[Desktop Entry] _Name=Glom _Comment=A user-friendly database environment. Exec=glom Terminal=false Type=Application Icon=glom Categories=GNOME;Office;GTK;Database; StartupNotify=true MimeType=application/x-glom; X-GNOME-DocPath=glom/index.html X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=glom X-GNOME-Bugzilla-Component=general X-GNOME-Bugzilla-Version=@VERSION@ X-Osso-Service=org.maemo.glom glom-1.22.4/AUTHORS0000644000175000017500000000017612234252645015045 0ustar00murraycmurrayc00000000000000Murray Cumming Please see http://www.glom.org and use the mailing list instead of emailing me directly.glom-1.22.4/ChangeLog0000644000175000017500000520560712235000132015541 0ustar00murraycmurrayc000000000000002013-11-01 Murray Cumming Print Layouts: Avoid crash when opening. * glom/frame_glom.cc: This was another ! error from the commits to avoid clang warnings. 2013-11-01 Murray Cumming More fixes for clang compiler and analyzer warnings. 2013-11-01 Murray Cumming Fix some clang compiler and analyzer warnings. These are mostly checks after getting widgets from glade files. 2013-11-01 Murray Cumming Small Business Example: Restore a Relationship title. * examples/example_small_business.glom: Somehow only the German translation was there. 2013-10-31 Murray Cumming DbAddDel: Replace use of TreeView::remove_all_columns(). * glom/utils_ui.[h|cc]: Add a treeview_delete_all_columns() method to explicitly delete the columns instead of just removing them and sometimes implicitly deleting them with Gtk::TreeView::remove_all_columns(). * glom/mode_data/db_adddel/db_adddel.[h|cc]: * glom/utility_widgets/adddel/adddel.cc: * glom/import_csv/dialog_import_csv.cc: Use it. This seems to fix a crash when switching between Data and Find mode, though that might just have been due to not resetting the pointer to the button column. 2013-09-23 Murray Cumming 1.22.3 2013-09-23 Murray Cumming Tests: Avoid a too-long path with recent PostgreSQL. 2013-09-20 Murray Cumming Move to a generated (in dist) ChangeLog I still do not like not being able to correct the commit messages and I still do not like how it leads us to be lazy when writing the ChangeLog entries, but git still makes it hard to manage branches when using a manually-written ChangeLog. 2013-09-20 Murray Cumming Startup: Do not crash when reporting check problems. * glom/main.c: Instantiate the Application earlier, to ensure that GTK+ is ready for use. Also call gtk_init() explicitly because Gtk::Application needs a fix for this anyway, and it would be nice to use this fix in Glom versions that do not need a newer gtkmm. Bug #680411 (Bjørn Lie, Dominique Leuenberger) 2013-09-20 Murray Cumming Startup: Show check errors on stderr In case the UI is crashing at first use somehow, as it currently seems to be on Fedora. 2013-09-20 Murray Cumming Avoid some compiler warnings 2013-09-11 Murray Cumming Avoid a crash at shutdown. * glom/bakery/appwindow_withdoc.cc: on_menu_file_close(): Close the document after hiding the UI, instead of the other way around because, with Gio::Application, hiding the window can cause it to be deleted, making any further use of it impossible. 2013-07-27 Dimitris Spingos Updated Greek translation 2013-07-22 Murray Cumming 1.22.2 2013-07-22 Murray Cumming Update a test for the newer translations. * tests/test_document_load_translations.cc: Increase the number of expected translation locales and adapt to us having a (mostly useless) en_GB translation. 2013-07-22 Murray Cumming Fix the build on Ubuntu Raring. * macros/macros/mm-python.m4: Also check in /usr/lib/i386-linux-gnu/ because that is where Ubuntu Raring (and maybe Debian) put libpython2.7 there.y 2013-07-22 Murray Cumming Initial dialog: Fix crash with latest libxml. * glom/dialog_existing_or_new.cc: Catch exceptions from xmlpp::SaxParser::parse_chunk() because libxml nows returns an error code from xmlParserChunk when we call xmlStopParser(), which libxml++ then throws as an exception. Maybe libxml++ should not do that for that new error code. This is the libxml commit: https://git.gnome.org/browse/libxml2/commit/?id=e50ba8164eee06461c73cd8abb9b46aa0be81869 2013-07-22 Murray Cumming Initial dialog: Fix the notebook vertical expansion. * ui/operator/dialog_existing_or_new.glade: Set the parent GtkHBox to expand, because there is some change of behaviour with the latest GTK+ from git master. Before this expanded already. 2013-07-22 Murray Cumming Deal with minor TODOs 2013-07-22 Murray Cumming Deal with a TODO 2013-07-22 Murray Cumming Added some std::cerr hints 2013-07-22 Murray Cumming Tests: Use the locally-built glom. * configure.ac: * Makefile_tests.am: * tests/tests_glom_date_in_locales.sh.in: Generate tests/tests_glom_date_in_locales.sh from tests/tests_glom_date_in_locales.sh.in, so it can include the path to the locally-built glom executable. 2013-07-22 Murray Cumming Tests: Use the locally-built python module. * Makefile_tests.am: Set the PYTHONPATH in automake's TESTS_ENVIRONMENT variable to fix make check before make install has run, and generally to be a correct check. 2013-04-21 Rafael Ferreira Updated Brazilian Portuguese translation 2013-04-10 МироÑлав Ðиколић Added Serbian translation 2013-04-10 МироÑлав Ðиколић Added Serbian translation 2013-04-10 МироÑлав Ðиколић Added Serbian translation 2013-04-10 МироÑлав Ðиколић Added Serbian translation 2013-04-10 МироÑлав Ðиколић Added Serbian translation 2013-04-10 МироÑлав Ðиколић Added Serbian translation 2013-03-26 Balázs Úr Initial Hungarian translation 2013-03-26 Balázs Úr Initial Hungarian translation 2013-03-26 Balázs Úr Initial Hungarian translation 2013-03-26 Balázs Úr Initial Hungarian translation 2013-03-26 Balázs Úr Initial Hungarian translation 2013-03-15 Balázs Úr Updated Hungarian translation 2013-01-13 Rafael Ferreira Updated Brazilian Portuguese Translation 2012-11-08 Murray Cumming Import example .po translations into the examples. * examples/example_film_manager.glom: * examples/example_lesson_planner.glom: * examples/example_music_collection.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: There are some new translations for el, id, lv and en_GB, though only a few of the en_GB translated strings are different. 2012-11-07 Murray Cumming 1.22.1 2012-11-02 Murray Cumming Move a test out the ui tests. * Because it uses the glom executable, which needs an X display, even when parsing the command line parameters. I blame GtkApplication. 2012-11-02 Murray Cumming Add --enable-ui-tests. * configure.ac, Makefile_tests.am: Allow the tests that actually instantiate windows to be disabled, for running under headless continuous integration systems. 2012-11-02 Murray Cumming fix 2012-11-02 Murray Cumming Self hosting: Do not allow ident authorization. * glom/libglom/connectionpool_backends/postgres_self.cc: Remove the ident lines from pg_hba.conf. We use trust already, so we do not need both. 2012-10-30 Murray Cumming Fix another typo 2012-10-30 Murray Cumming Fix a typo. 2012-10-29 Murray Cumming Revert "Self hosting: Avoid use of unix-domain sockets." This reverts commit 145bc61b7fde6048884a8e94174ba9b412d3e24e. Conflicts: ChangeLog glom/libglom/connectionpool_backends/postgres_self.cc Bring back unix-domain sockets because TCP connections with trust are not specific to a single user on multiuser systems. 2012-10-29 Murray Cumming Revert "SelfHosting: Do not generate and specify pg_ident.conf" This reverts commit f39fa95fc4881871c2c162dffc63c2d8e45e55f7. Because we probably do need this with unix-socket domains, which I am bringing back. 2012-10-25 Murray Cumming SelfHosting: Do not generate and specify pg_ident.conf * glom/libglom/connectionpool_backends/postgres_self.cc: Do not bother creating and using the pg_ident.conf file because we do not use ident authentication. 2012-10-25 Murray Cumming Self hosting: Only allow attempts from localhost when not shared. * glom/libglom/connectionpool_backends/postgres_self.cc: When the Glom system should not be shared on the network (the default for new files), do not even allow connection attempts from non-localhost. This also removes the use of the deprecated postgres -i option. 2012-10-25 Murray Cumming Self hosting: Avoid use of unix-domain sockets. * glom/libglom/connectionpool_backends/postgres_self.cc: Use -k '' with the postgres executable, and remove any local lines in pg_hba.conf, to (hopefully, presumably) allow only TCP connections and no unix-domain socket connections. This avoids the new restricitons on the characters allowed in the path given to -k (unix_socket_directory or unix_socket_directories in postgresql.conf). Therefore, this fixes the tests on Fedora 17. 2012-10-20 Andika Triwidada Added Indonesian translation of examples 2012-10-06 Andika Triwidada Added Indonesian translation 2012-09-14 Chris Leonard Updated British English translation 2012-09-02 Christian Kirbach Updated German translation 2012-09-01 Murray Cumming Catch exceptions when updating the libgda metastore. * glom/libglom/connectionpool.cc: * glom/libglom/db_utils.cc: Put try/catch around uses of Gda::Connection::update_meta_store_for_table() because it is currently failing in test_selfhosting_new_then_change_columns on my Fedora 17. 2012-08-31 RÅ«dolfs Mazurs Fixing build break by adding some Latvian translations 2012-08-10 Arvis Lacis Updated Latvian translation 2012-08-09 Arvis Lacis Added Latvian translation 2012-08-07 Christian Kirbach Updated German translation 2012-07-22 Tom Tryfonidis Added Greek translation 2012-06-20 Tom Tryfonidis Added greek language to LINGUAS 2012-06-20 Tom Tryfonidis Updated Greek translation 2012-05-31 Daniel Mustieles Updated Spanish translation 2012-05-31 Daniel Mustieles Updated Spanish translation 2012-05-22 Murray Cumming Tiny whitespace fix. 2012-04-24 Marek ÄŒernocký Updated Czech translation 2012-04-22 Bruno Brouard Updated French translation 2012-04-21 Joe Hansen Updated Danish translation 2012-04-21 Matej UrbanÄiÄ Updated Slovenian translation 2012-04-19 Daniel Mustieles Updated Spanish translation 2012-04-19 Murray Cumming Add some translatable strings for Online Glom * glom/onlineglom_strings.cc: Add some strings needed by the new reports feature in gwt-glom. 2012-04-19 Marek ÄŒernocký Updated Czech translation 2012-04-16 Murray Cumming Fix make check. * tests/test_document_load_translations.cc: Update the number of translations. 2012-04-14 Matej UrbanÄiÄ Updated Slovenian translation 2012-04-13 Murray Cumming Film Manager example: Correct the Contacts reports. * examples/example_film_manager.glom: Copy them from the Small Business example. They were missing the Group By fields. 2012-04-13 Murray Cumming Windows build: Fix some typos. * glom/glom_create_from_example.cc: * glom/glom_test_connection.cc: Add closing ). Bug #674009 (alien) 2012-04-12 Daniel Mustieles Updated Spanish translation 2012-04-12 Malcolm Lewis Update the FSF address in comment blocks. Bug #673881 2012-04-12 Antoine Jacoutot build: std:cerr needs This is necessary on OpenBSD. Bug #673914 2012-04-11 Murray Cumming 1.22.0 2012-04-11 Murray Cumming Export all examples .po files. 2012-04-11 Murray Cumming Fix make check. * tests/test_document_load_translations.cc: Increase the number of expected translations. * examples/example_film_manager.glom: Fix an inconsistency in the German translation. 2012-04-11 Murray Cumming Windows build: ifdef out the use of getpass(). * glom/glom_create_from_example.cc: * glom/glom_test_connection.cc: And show a warning on stderr. This is better than disabling all the functionality in this file, and lets us fix it easily if we ever have a getpass() function on Windows. Bug #672881 (alien) 2012-04-11 Murray Cumming Windows build: Add some includes. * glom/dialog_existing_or_new.cc: As suggested by alien in bug #673093 2012-04-11 Murray Cumming Windows build: Add a windows.h include. * glom/utility_widgets/imageglom.cc: As suggested by alien in bug #673096 2012-04-10 Murray Cumming Examples: Import the .po files. 2012-04-09 Rogério Fernandes Pereira Added Brazilian Portuguese translation for example_smallbusiness 2012-04-09 Rogério Fernandes Pereira Added Brazilian Portuguese translation for example_project_manager 2012-04-05 Rogério Fernandes Pereira Added Brazilian Portuguese translation 2012-04-04 Rogério Fernandes Pereira Added Brazilian Portuguese translation 2012-04-04 Rogério Fernandes Pereira Added Brazilian Portuguese translation 2012-03-29 Murray Cumming Fixed some simple warnings found by scan-build. * glom/libglom/report_builder.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/python_embed/glom_python.cc: Mostly variables that were set but then not used. 2012-03-29 Murray Cumming Minor changes. 2012-03-29 Murray Cumming Field: Remove get_holder(). * glom/libglom/data_structure/field.[h|cc]: * glom/libglom/python_embed/py_glom_record.cc: * glom/mode_data/datawidget/treemodel_db.cc: Replace or remove use of Field::get_holder(). 2012-03-29 Murray Cumming ConnectionPool: create_database(): Take a progress slot. * glom/libglom/connectionpool.[h|cc]:: * glom/libglom/connectionpool_backends/backend.h: create_database(): Add a progress_slot parameter, to be emitted. * glom/libglom/connectionpool_backends/postgres.[h|cc]: * glom/libglom/connectionpool_backends/postgres_central.[h|cc]: * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: * glom/libglom/connectionpool_backends/sqlite.[h|cc]: * glom/libglom/db_utils.cc: * glom/appwindow.[h|cc]: Adapt. 2012-03-29 Murray Cumming Rename FieldFormatting to Formatting 2012-03-28 Murray Cumming 1.21.8 2012-03-28 Murray Cumming Fix the build with the latest gtkmm, with --enable-warnings=fatal. * glom/mode_data/box_data.[h|cc]: on_Button_Find(): Let the signal handler do the check and warning about no criteria. * glom/frame_glom.cc: on_notebook_find_criteria(): Check for quickfind criteria here too, so we can use this to do quick finds too, which lets use just use the existing Find button (the window's default activate widget), instead of trying to make the separate quickfind Find button be the default for the entry, but not for other widgets. on_button_quickfind(): Just call on_notebook_find_criteria(), letting it do all the work. Constructor: Call set_activates_default() on the quickfind entry so that the regular Find button will be activated when enter is pressed. 2012-03-28 Murray Cumming Slight code improvement. * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_list_find.cc: Use C++ instead of C to set can_default. 2012-03-28 Murray Cumming Slight code style change. 2012-03-27 Murray Cumming Dialog_Choose_ID: Remove use of a deprecated signal. * glom/mode_data/datawidget/dialog_choose_id.cc: Do not connect to Gtk::Entry::signal_activate(), which is deprecated. It is unnecessary anyway, because the entry already activates the button via the activates-default and can/has-default properties. 2012-03-26 Murray Cumming Dialog_Import_CSV_Progress: Fix a typo. * glom/import_csv/dialog_import_csv_progress.cc: Call get_parser_state() instead of get_state(). It was calling Widget::get_state() and the compiler did not complain that we did not get the enum type that we expected. 2012-03-25 Marek ÄŒernocký Updated Czech translation 2012-03-25 Fran Diéguez Added Galician translations for example_music_collection, example_project_manager and example_smallbusiness Signed-off-by: Fran Diéguez 2012-03-24 Bruno Brouard Updated French translation 2012-03-22 Murray Cumming Tests: Set LC_TIME too. * tests/test_glom_date_in_locales.sh: * tests/test_selfhosting_new_from_example_in_locales.sh: This seems to be necessary in Ubuntu Precise. 2012-03-22 Murray Cumming Improve the command-line parse/print locale warnings. * glom/libglom/data_structure/glomconversions.cc: Mention the locale details when complaining that date parsing or rendering is not working correctly for a locale. 2012-03-16 Murray Cumming Update GimpRuler from the Gimp source code. With the same changes to make it build in Glom. 2012-03-16 Murray Cumming Remove some commented-out includes 2012-03-14 Murray Cumming 1.21.7 2012-03-14 Murray Cumming Fixed the tests build. 2012-03-14 Murray Cumming set_document(), init() methods: Avoid the appearance that these are virtual. * glom/application.cc: * glom/appwindow.[h|cc]: * glom/base_db.h: * glom/base_db_table.h: * glom/import_csv/dialog_import_csv_progress.h: * glom/mode_data/box_data.h: * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_details.[h|cc]: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/datawidget/dialog_choose_id.h: * glom/mode_data/datawidget/dialog_new_record.h: * glom/mode_design/layout/dialog_layout.[h|cc]: * glom/mode_design/layout/dialog_layout_calendar_related.[h|cc]: * glom/mode_design/layout/dialog_layout_details.[h|cc]: * glom/mode_design/layout/dialog_layout_list_related.[h|cc]: * glom/mode_find/box_data_details_find.h: * glom/print_layout/canvas_print_layout.cc: This fixes warnings found by clang++. 2012-03-14 Murray Cumming FlowTable::add(): Rename to add_widgets(). * glom/mode_data/flowtablewithfields.cc: * glom/utility_widgets/flowtable.[h|cc]: This avoids a clash with Gtk::Widget::add(), which is virtual, but takes different parameters. This fixes warnings found by clang++. 2012-03-14 Murray Cumming Dialog_ImportCSVProgress: rename a signal handler. * glom/import_csv/dialog_import_csv_progress[h|cc]: Avoid a clash with a virtual method of the same name in Gtk::Widget. 2012-03-14 Murray Cumming Make sure that get_appwindow() overrides are const. * glom/mode_data/buttonglom.[h|cc]: * glom/mode_data/datawidget/checkbutton.[h|cc]: * glom/mode_data/datawidget/combo.[h|cc]: * glom/mode_data/datawidget/combo_as_radio_buttons.[h|cc]: * glom/mode_data/datawidget/datawidget.[h|cc]: * glom/mode_data/datawidget/entry.[h|cc]: * glom/mode_data/datawidget/label.[h|cc]: * glom/mode_data/datawidget/textview.[h|cc]: * glom/utility_widgets/imageglom.[h|cc]: * glom/utility_widgets/notebookglom.[h|cc]: get_appwindow(): This should be const because the pure virtual function (that it is meant to override) is const. This fixes warnings found by clang++. 2012-03-14 Murray Cumming Fix some simple warnings found by clang++ * glom/appwindow.cc: * glom/dialog_existing_or_new.cc: * glom/frame_glom.cc: * glom/glom_import_po_all.cc: * glom/libglom/data_structure/layout/layoutitem_field.cc: * glom/mode_data/db_adddel/db_adddel.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: * glom/utility_widgets/adddel/adddel.cc: I just did export CXX=clang++ before running autogen.sh. 2012-03-12 Murray Cumming More signal reemitting simplification. 2012-03-12 Murray Cumming Simplify code that just re-emits signals. 2012-03-12 Murray Cumming Reduce use of the derived ComboBoxText. 2012-03-12 Murray Cumming Adjust some comments 2012-03-12 Murray Cumming Remove some unused member variables. * glom/mode_data/box_data_list.[h|cc]: * glom/mode_data/box_data_manyrecords.[h|cc]: Remove m_has_one_or_more_records. * glom/mode_data/box_data_list_related.cc: Adapted. 2012-03-12 Murray Cumming Remove some virtual keywords 2012-03-12 Murray Cumming Document: Move XML utilities into a new file. * glom/libglom/document/document.[h|cc]: Move the static XML utility methods into: * glom/libglom/fileslist.am: * glom/libglom/xml_utils.[h|cc]: New file. * glom/libglom/report_builder.cc: Adapted, removing the need for the friend declaration in Document. 2012-03-12 Murray Cumming Field: Removed deprecated methods. * glom/libglom/data_structure/field.[h.cc]: Removed the sql() overload that takes no connection. sql_find(): Add a connection parameter. * glom/libglom/data_structure/layout/layoutgroup.h: * glom/libglom/utils.cc: * glom/mode_data/box_data.cc: Adapted. 2012-03-12 Murray Cumming LayoutItem_GroupBy: Add get and set methods for members. * glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.[h|cc]: Make the members private, adding getters. With smartpointers, the direct access is not necessary for performance. * glom/libglom/document/document.cc: * glom/libglom/report_builder.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc: Adapted. 2012-03-12 Murray Cumming libglom: LayoutGroup: Remove deprecated remove_field() and has_field(). * glom/libglom/data_structure/layout/layoutgroup.[h|cc]: Remove deprecated method overloads. 2012-03-06 Murray Cumming 1.21.6 2012-03-05 Murray Cumming Utils::get_find_where_clause_quick(): Handle an empty value properly. * glom/libglom/utils.cc: get_find_where_clause_quick(): Handle an empty quick_search value properly, returning an empty where clause. 2012-03-03 Ben Konrath Remove empty group in the Lesson Planner example file. The empty group was at the bottome of the Rooms table details view. https://bugzilla.gnome.org/show_bug.cgi?id=671263 * examples/example_lesson_planner.glom: 2012-03-03 Murray Cumming Remove remaining uses of deprecated Gtk::Main API. 2012-03-02 Daniel Mustieles Updated Spanish translation 2012-03-01 Matej UrbanÄiÄ Updated Slovenian translation 2012-03-01 Murray Cumming Add a unistd.h include to fix the mingw MS Windows build. * glom/glom_create_from_example.cc: include unistd.h for getpass(). Bug #671120 (alien) 2012-03-01 Mario Blättermann [l10n] Updated German translation 2012-03-01 Murray Cumming DbUtils: Update some comments 2012-03-01 Murray Cumming Make auto-increment fields work even if they are not primary keys. * glom/libglom/db_utils.h: get_next_auto_increment_value(): Document that this also increments the value ready for the next call. * glom/base_db_table_data.cc: record_new(): Decide auto-increment values as well as just default values and calculated values. And do this while building the SQL, instead of first setting it in the widget, because we do not always want to use the entered data, so we would then ignore those automatic values accidentally. Bug #661702 2012-03-01 Murray Cumming Make the --debug_sql option work again. * glom/appwindow.cc: set_show_sql_debug(): Set it in the ConnectionPool too. This was broken since the change to Gtk::Application. 2012-03-01 Murray Cumming ConnectionPool::change_columns(): Add/Remove autoincement rows here. * glom/libglom/connectionpool.cc: change_columns(): Add or remove the auto-increment row from the database preferences table. This would be added automatically anyway but this makes sure that it is there for editing as soon as the field is added, and makes sure that it is removed. * tests/test_selfhosting_new_then_change_columns.cc: Try setting a field as auto-increment. 2012-03-01 Murray Cumming Tests: Update the expected number of locales. * tests/test_document_load_translations.cc: There are now 7 locales in the example document. 2012-03-01 Murray Cumming More windows build fixes. * glom/libglom/connectionpool_backends/postgres.cc: Add an include and change the ifdefed code slightly to fix the mingw build on Windows. Bug #670903 (alien) 2012-03-01 Murray Cumming Add a fcntl.h include. * glom/libglom/utils.cc: Include fcntl.h to fix the mingw build on Windows. Bug #670903 (alien) 2012-03-01 Murray Cumming Use Gtk::ApplicationWindow. * glom/bakery/appwindow_withdoc_gtk.[h|cc]: Use Gtk::ApplicationWindow instead of Gtk::Window. 2012-03-01 Murray Cumming Remove now-unnecessary call to init_gtkmm. * glom/application.cc: The latest gtkmm code in git master makes this unnecessary. 2012-03-01 Murray Cumming Application: Do not load documents twice. * glom/application.cc: on_open(): Correct the call to the base class method, to avoid a second attempt to open the same document. 2012-03-01 Murray Cumming Remove use of Gtk::Main functions. * glom/bakery/busy_cursor.cc: * glom/import_csv/dialog_import_csv_progress.cc: Use the C API for events_pending/iteration to avoid a crash. 2012-03-01 Murray Cumming AppWindow: Rename get_application() to get_appwindow(). 2012-03-01 Murray Cumming Do not use Gtk::Main. * glom/application.cc: create(): Call the new init_gtkmm method. * glom/main.cc: Remove the use of Gtk::Main because it is no unnecessary. 2012-03-01 Murray Cumming --debug-date-check: Do not show the window. * glom/main_local_options.[h|cc]: Make the handler function a class method, and make the variables private. Add a get_debug_date_check_result() method. * glom/application.cc: Stop the application, before showing the window, if the --debug-date-check option was given, as before we used GApplication. 2012-03-01 Murray Cumming Move all command-line handling into the remote Application. * glom/main.cc: * glom/application.cc: * glom/main_local_options.[h|cc]: * glom/main_remote_options.[h|cc]: Split the command-line options into two OptionGroups, in their own files, even putting local option handling in its separate file. This lets us handle them properly, despite the lack of GApplication support for separate local/remote GOption handling. ( See https://bugzilla.gnome.org/show_bug.cgi?id=634990#c6 ) thanks to our use of G_APPLICATION_NON_UNIQUE. Having them separate should make it easier to really do it properly if GApplication ever allows it. 2012-03-01 Murray Cumming Use G_APPLICATION_NON_UNIQUE. * glom/application.cc: This is necessary because we use singletons that are really per-AppWindow, to simplify our code. 2012-03-01 Murray Cumming Add a Gtk::Application subclass, used by main(). * Makefile.am: * main.cc: * glom/application.[h|cc]: Use a derived Gtk::Application which instantiates the Glom::AppWindow via its on_open(). Some command-line option handling is temporarily commented out. 2012-02-29 Mario Blättermann [l10n] Updated German translation 2012-02-29 Mario Blättermann [l10n] Updated German translation 2012-02-29 Mario Blättermann [l10n] Updated German translation 2012-02-29 Bruno Brouard Updated French doc translation 2012-02-29 Murray Cumming Examples: .pot/.po files: Slight change of report title. 2012-02-29 Murray Cumming Examples: Import from .po files, adding French. 2012-02-28 Bruno Brouard New French translation : example app 2012-02-24 Murray Cumming Fix a warning 2012-02-24 Murray Cumming Fix a typo in the previous commit. * glom/mode_data/box_data_list_related.cc: Do not use m_found_set where we really mean found_set. 2012-02-24 Murray Cumming Prevent SQL SELECT errors when the user does not have view (SELECT) rights. * glom/libglom/privs.cc: get_current_privs(): Check for an empty table name to avoid SQL errors. * glom/frame_glom.cc: show_table_allow_empty(): * glom/mode_data/box_data_list.cc: fill_from_database(), create_layout(), * glom/mode_data/box_data_list_related.cc: init_db_detail(), create_layout(): * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: set_choices_related(): Set DbAddDel::set_allow_view(), with the discovered view privileges for the current user, to avoid SQL errors when the user does not have SELECT rights. 2012-02-24 Murray Cumming More not hiding the database structure if the user does not have view rights. * glom/mode_data/box_data_list_related.cc: Do not check if the field really exists, because that will fail if the user does not have view (SELECT) rights. 2012-02-23 Murray Cumming Added some TODOs about users without view rights. 2012-02-23 Murray Cumming Do not hide the database structure if the user does not have view rights. * glom/frame_glom.cc: update_table_in_document_from_database(): Warn if we cannot get the fields list from the database and do not then assume that there are no fields. * glom/libglom/db_utils.cc: get_fields_for_table(): Do not get the fields from the database because it is inefficient and we should already have updated the document. * glom/mode_data/box_data_list.cc: create_layout(): Do not (incredibly inefficiently) check that each field exists in the database. We should already have updated the document. This should make the UI faster too. Bug #669299 2012-02-23 Murray Cumming Convert another g_warning() to std::err. 2012-02-23 Murray Cumming Change lots of g_warnings() to std::cerr. 2012-02-23 Murray Cumming FieldTypes: Add defaults. * glom/libglom/data_structure/fieldtypes.[h|cc]: Fallback to a hard-coded map of database types to GType types, for the (so far unexplained) cases where CONNECTION_META_TYPES gives us no rows. 2012-02-22 Murray Cumming List View: Make print layouts grayed-out if no record is selected. * glom/mode_data/db_adddel/db_adddel.[h|cc]: Add signal_record_selection_changed and emit it when the TreeView's selection changes: * glom/mode_data/db_adddel/db_adddel_withbuttons.cc: Make sure that we call the base class. * glom/mode_data/box_data_manyrecords.[h|cc]: Added signal_record_selection_changed. * glom/mode_data/box_data_list.[h|cc]: Handle the AddDel_DB's signal_record_selection_changed, emitting our own signal_record_selection_changed. * glom/mode_data/notebook_data.[h|cc]: Handle the Box_Data_List's signal_record_selection_changed, emitting our own signal_record_selection_changed. I still do not like the repetition that is required here, and elsewhere, when a child widget needs to signal all the way up an ownership hierarchy. * glom/appwindow.[h|cc]: Add enable_menu_print_layouts_details(). * glom/frame_glom.[h|cc]: Handle the Notebook_Data's signal_record_selection_changed(), calling the AppWindow's enable_menu_print_layouts_details(). 2012-02-22 Murray Cumming Fix typo in comment. 2012-02-22 Murray Cumming Allow printing of print layouts from the list view. * glom/appwindow.cc: fill_menu_print_layouts(): Show the print layouts even if the list view is visible. * glom/mode_data/notebook_data.[h|cc]: get_found_set_details(): Replace with get_found_set_selected() which checks the selected record in the list view, if the list view is visible, instead of just the details view. * glom/frame_glom.[h|cc]: Remove get_viewing_details(). do_print_layout(): Use get_found_set_selected() so we can print the print layout for the selected record. This avoids some confusion caused by the print layouts not being available when viewing the list instead of the details. Bug #670462 (alien) 2012-02-19 Kristjan SCHMIDT Updated Esperanto translation 2012-02-19 Kristjan SCHMIDT Add Esperanto translation 2012-02-19 Kristjan SCHMIDT Add Esperanto translation 2012-02-17 Matej UrbanÄiÄ Updated Slovenian translation 2012-02-16 Martin Srebotnjak Updated Slovenian translation 2012-02-16 Mario Blättermann [l10n] Updated German translation 2012-02-16 Marek ÄŒernocký Updated Czech translation 2012-02-13 Daniel Mustieles Updated Spanish translation 2012-02-13 Murray Cumming Users: Warn if we cannot get the list of users. * glom/libglom/privs.[h|cc]: get_database_users(): Add documentation about the case that the result is empty. * glom/mode_design/users/dialog_users_list.cc: on_button_user_add(): If the users list is empty then warn that something is probably wrong with the permissions. I would like to warn much earlier if the user is not a superuser, but I do not know how. Bug #669178 (alien) 2012-02-13 Murray Cumming Add missing files 2012-02-13 Murray Cumming AppWindow: Rename get_application() to get_appwindow(). 2012-02-13 Murray Cumming Rename Application to AppWindow. Rename Application to AppWindow and rename the Bakery::App* classes appropriately too. This is a preparation for using Gtk::Application. 2012-02-09 Murray Cumming Print Layout: Print Preview: Avoid warnings when there are no records yet. * glom/print_layout/canvas_print_layout.cc: fill_with_data(): Do nothing, and hint on stdout, if there are no records yet. This avoids several real warnings later. 2012-02-08 Matej UrbanÄiÄ Updated Slovenian translation 2012-02-08 Murray Cumming Print Layout: Avoid sometimes over-scaled images. * glom/print_layout/canvas_layout_item.[h|cc]: Remove the constructor and create() that take a LayoutItem, because we should put the CanvasItem in a canvas (even indirectly) before creating the child item, to avoid this goocanvas bug: https://bugzilla.gnome.org/show_bug.cgi?id=657592#c16 * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: * glom/print_layout/canvas_print_layout.[h|cc]: Add and use create_canvas_layout_item_and_add() methods which put the new canvas item in the canvas before creating its child items based on the LayoutItem. This fixes bug #668901 (alien) 2012-02-06 Mario Blättermann [l10n] Updated German translation 2012-02-05 Murray Cumming Button scripts and Field Calculations: Test button: Check for pygtk2. * glom/mode_data/box_data.cc: :execute_button_script(): Move the warning UI into * glom/utils_ui.[h|cc]: a new script_check_for_pygtk2_with_warning() method. * glom/mode_design/fields/dialog_fieldcalculation.cc: on_button_test(): * glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc: on_button_test_script(): Use the new function here. 2012-02-03 Marek ÄŒernocký Updated Czech translation 2012-02-03 Daniel Mustieles Updated Spanish translation 2012-02-03 Murray Cumming Button scripts: Check and warn about pygtk2 instead of crashing. * glom/libglom/utils.[h|cc]: Add script_check_for_pygtk(). * Makefile_tests.am: * tests/test_script_check_for_problems.cc: Add a test for the check function. * glom/mode_data/box_data.cc: execute_button_script(): Show a warning dialog, and do not run the script, if it seems to use pygtk. This should help with but #669196 (alien) and ##661766 (Andre Klapper) . 2012-02-03 Murray Cumming Minor formatting changes 2012-02-03 Murray Cumming ReportBuilder: Add error checking. * glom/libglom/report_builder.[h|cc]: Return bool from the private methods and check those results. 2012-02-03 Murray Cumming Reports: Make summary fields work again. * glom/libglom/report_builder.cc: report_build_summary(): Remove any sort clause (ORDER BY) from the FoundSet because that makes no sense for a single row with summary fields. It looks like recent versions of PostgreSQL have become more strict about this, producing this error, for instance: column invoices.invoice_id must appear in the GROUP BY clause or be used in an aggregate function * Makefile_tests.am: * tests/test_selfhosting_new_then_report_summary.cc: Add a test for this. This fixes bug #669281 (alien) 2012-02-03 Murray Cumming Remove debug output. 2012-02-03 Murray Cumming Fix more group privileges 2012-02-03 Murray Cumming Document: Really load the table privileges. * glom/libglom/db_utils.[h|cc]: add_group(): Take a bool superuser parameter. add_groups_from_document(): Use add_group() instead of executing the ADD GROUP query directly, to make sure that we also start with some sane table privileges defaults, in case nothing else sets the privielges. * glom/libglom/document/document.cc: load_after(): Fix a typo so that the group privileges are really loaded (and then saved again instead of being lost). * examples/example_film_manager.glom: * examples/example_smallbusiness.glom: Save these with useful group privileges, so the groups will be allowed to see tables. * tests/test_document_load.cc: Test the loading of the group privileges. Previously the examples were created with groups that could not even view the tables, which meant that they could not even find out about their existence. This deals with the problem found here: https://bugzilla.gnome.org/show_bug.cgi?id=669043#c2 But I would like to show the existence (and structure) of tables even if their data cannot be viewed, so there is more work to do. 2012-02-03 Murray Cumming test_selfhosting_new_empty_then_users: Slight improvement. * tests/test_selfhosting_new_from_example_operator.cc: Check that the group exists before adding a user to it. 2012-02-03 Murray Cumming Add some runtime warnings. * glom/libglom/db_utils.cc: get_table_names_from_database(): Slightly improved error checking. * glom/libglom/privs.cc: set_table_privileges(): Warn if a GRANT fails. 2012-02-03 Kjartan Maraas Updated Norwegian bokmÃ¥l translation 2012-02-02 Matej UrbanÄiÄ Updated Slovenian translation 2012-02-02 Murray Cumming Examples: Import .po files 2012-02-02 Murray Cumming Share on Network: Add reassuring message when user removal fails. * glom/frame_glom.cc: Add a stdout message saying the the default user has been disabled, because the existing message about the failure to remove the user looks at first like a security problem. I still do not know why removal fails, even though we do change the ownership of the database. 2012-02-02 Murray Cumming test_selfhosting_new_empty_then_users: Test user removal. * glom/base_db.[h|cc]: Move remove_user() and remove_user_from_group() to * glom/libglom/db_utils.[h|cc]. * glom/frame_glom.cc: * glom/mode_design/users/dialog_users_list.cc: Adapted. * tests/test_selfhosting_new_empty_then_users.cc: Test these functions. 2012-02-02 Murray Cumming Fix the build. 2012-02-02 Marek ÄŒernocký Updated Czech translation 2012-02-02 Marek ÄŒernocký Updated Czech translation 2012-02-02 Marek ÄŒernocký Updated Czech translation 2012-02-02 Marek ÄŒernocký Updated Czech translation 2012-02-02 Marek ÄŒernocký Updated Czech translation 2012-02-02 Marek ÄŒernocký Updated Czech translation 2012-02-02 Murray Cumming Really prevent changing to developer mode for non-developers. * glom/frame_glom.cc: on_menu_developer_developer(): Actually use the result of Privs::get_user_is_in_group(). * tests/test_selfhosting_new_from_example_operator.cc: Test this same function here, though this test currently fails anyway. Really prevent changing to developer mode for non-developers. This fixes bug #669043 (alien) 2012-02-01 Murray Cumming Allow user and group names to have spaces and other special characters. * glom/libglom/privs.cc: get_table_privileges(): Instead of parsing the relacl.pg_class field, use the PostgreSQL has_table_privilege() function, though it needs some strange quoting (see comments). This code is much simpler now. * tests/test_selfhosting_new_empty_then_users.cc: Add various other table, group, and user names, to excercise the code. This now passes. 2012-02-01 Murray Cumming Fix the build. * glom/mode_design/users/dialog_new_group.cc: * glom/mode_design/users/dialog_user.cc: Add includes to fix the build. 2012-02-01 Murray Cumming test_selfhosting_new_empty_then_users: Show the problem with spaces. * tests/test_selfhosting_new_empty_then_users.cc: Privs::get_table_privileges() must parse a strange format. This test shows that it fails if the group name contains spaces. 2012-02-01 Murray Cumming Fix typos 2012-02-01 Murray Cumming Limit user and group name lengths. * glom/libglom/privs.[h|cc]: Add a MAX_ROLE_SIZE enum constants. I cannot find any PostgreSQL documentation of this 63 character limit. * glom/mode_design/users/dialog_new_group.cc: * glom/mode_design/users/dialog_user.cc: Use it to set maximum characters for the entry boxes. * tests/test_selfhosting_new_empty_then_users.cc: Show that the problem found so far was caused by too-long names, not spaces. I still need to check parsing of table permissions. 2012-02-01 Murray Cumming Fix typo 2012-02-01 Murray Cumming test_selfhosting_new_empty_then_users: Test user adding with all group names. * tests/test_selfhosting_new_empty_then_users.cc: Use for loops to simplify the code and to make sure that we test adding of users with all the group types. This shows a problem: Privs::get_database_groups() does not contain the expected user: group: somegroup with space characters1 user: someuser with space characters1for_somegroup with space characters1 2012-02-01 Murray Cumming test_selfhosting_new_empty_then_users: Improvements. * tests/test_selfhosting_new_empty_then_users.cc: Add tables that will be affected. Test strange characters in group and user names. 2012-02-01 Murray Cumming Add test_selfhosting_new_empty_then_users * glom/mode_design/users/dialog_groups_list.cc: on_button_group_new(): Move the group creation code to: * glom/libglom/db_utils.[h|cc]: * glom/libglom/privs.[h|cc]: set_table_privileges(): Return a bool to report failures. * Makefile_tests.am: * tests/test_selfhosting_new_empty_then_users.cc: Add this test to test simple creation of a group and a user. 2012-02-01 Murray Cumming Add test_selfhosting_new_from_example_operator. * glom/base_db.[h|cc]: Move add_user() to * glom/libglom/db_utils.[h|cc]: * glom/frame_glom.cc: * glom/mode_design/users/dialog_users_list.cc: Adapted. * glom/libglom/connectionpool.cc: invalidate_connection(): Also clear m_pFieldTypes to make sure that we refill it when making a new connection. * glom/libglom/data_structure/fieldtypes.[h|cc]: Add get_types_count(). * tests/test_selfhosting_utils.[h|cc]: Add test_selfhost() to start an already-existing .glom system. * Makefile_tests.am: * tests/test_selfhosting_new_from_example_operator.cc: Add this new test which attempts to re-open a .glom system as a non-developer user. This currently fails to get the list of tables from the database. I must investigate that. 2012-01-30 Murray Cumming Add test_selfhosting_new_empty_change_sysprefs. * Makefile_tests.am: * tests/test_selfhosting_new_empty_change_sysprefs.cc: Add this test to check that the writing and reading of System Preferences works. 2012-01-30 Murray Cumming test_selfhosting_new_empty: Move some code into test_selfhosting_utils * tests/test_selfhosting_utils.[h|cc]: Add functions for self-hosting of an empty new database, used by the existing code too. * Makefile_tests.am: * tests/test_selfhosting_new_empty.cc: Use test_selfhosting_utils to simplify this code, making it easier to create variations of this test. 2012-01-30 Murray Cumming test_selfhosting_new_empty: Simplify the cleanup code. * tests/test_selfhosting_new_empty.cc: Call cleanup if test() returns false, like we in the other tests, to avoid calling it in too many places. 2012-01-30 Daniel Mustieles Updated Spanish translation 2012-01-30 Murray Cumming Require the latest goocanvas because it has fixes that PrintLayout needs. * configure.ac: Require goocanvas 2.0.1. 2012-01-30 Murray Cumming Add translatable strings from OnlineGlom * glom/onlineglom_strings.cc: * Makefile.am: * po/POTFILES.in: Mention the new file. These strings are actually used here: http://gitorious.org/online-glom/gwt-glom/trees/master/src/main/resources/org/glom/web/client/ui and I must manually copy the translations across until I find a better way. 2012-01-30 Murray Cumming Translatable: Remove unimplemented get_title_or_name_original(). * glom/libglom/data_structure/translatable_item.h: This method is not used, of course. 2012-01-29 Murray Cumming TableInfo, Report, PrintLayout: Make member variables private. * glom/libglom/data_structure/print_layout.[h|cc]: * glom/libglom/data_structure/report.[h|cc]: * glom/libglom/data_structure/tableinfo.[h|cc]: Hide the member variables behind getters and setters. * glom/application.cc: * glom/base_db.cc: * glom/libglom/db_utils.cc: * glom/libglom/document/document.cc: * glom/libglom/report_builder.cc: * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/report_layout/dialog_layout_report.cc: * glom/navigation/box_tables.cc: * glom/print_layout/canvas_print_layout.[h|cc]: * glom/print_layout/print_layout_utils.cc: * tests/test_document_load.cc: Adapt. This avoids java-libglom from generating getM_*() and setM_*() methods, as well as being generally correct. 2012-01-29 Murray Cumming Database Preferences: Really store the organization name in the database. * glom/libglom/db_utils.cc: set_database_preferences(): Also UPDATE the organization name. This fixes bug #668836 (alien) 2012-01-29 Murray Cumming Field Formatting: Related Choices: Default to showing the primary key. * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: on_combo_choices_relationship_changed(): By default, automatically choose the related table's primary key as the field to show in the choices. Other fields should then be shown (or looked up) based on the chosen ID. This avoids the confusion noticed here: https://bugzilla.gnome.org/show_bug.cgi?id=668759#c21 2012-01-29 Murray Cumming CellRendererDbList: Do not crash if one of the fields is hidden. * glom/mode_data/datawidget/cellrenderer_dblist.cc: repack_cells_related(): Do not crash if create_cell() returns 0, and add a comment explaining that that is OK. * glom/mode_data/datawidget/cellcreation.cc: Add explanatory comments. This fixes the second crash mentioned in #668759 (alien). 2012-01-29 Murray Cumming Choices: Allow the field to be be other than the primary key. * glom/mode_data/datawidget/treemodel_db.h: Make most methods and members private again, documentation what they *key methods and members really mean. * glom/mode_data/datawidget/treemodel_db_withextratext.[h|cc]: Add m_column_index_first and m_item_first members. Constructor: Set these by looking for the first LayoutItem_Field, because that is what we will want to show in the first cell of a combobox, which is where this model is used. Use these instead of the *key members, which were actually the primary key. We had previously assumed that the first field would always be the primary key, but we should not enforce that. This fixes crashing bug #668759 (alien). 2012-01-28 Murray Cumming ComboChoicesWithTreeModel: Make sure the model always has the primary key. * glom/libglom/data_structure/layout/layoutitem_field.h: predicate_LayoutItem_Field_IsSameField: Let this be used with containers of LayoutItems as well as just LayoutItem_Fields. * glom/libglom/utils.[h|cc]: Add get_layout_items_plus_primary_key(). * glom/mode_data/box_data_list.cc: create_layout(): Simplify code by using get_layout_items_plus_primary_key(). * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: set_choices_related(): Use get_layout_items_plus_primary_key() so the model has the primary key, avoiding a warning and a later crash. 2012-01-27 Murray Cumming Test creation from examples in non-English locales. * Makefile_tests.am: * tests/test_selfhosting_new_from_example_in_locales.sh: Run the test_selfhosting_new_from_example example in various locales, to make sure that the libgda problem (see bug #668346), or something like it, does not come back. * tests/test_selfhosting_new_from_example.cc: Call setlocale(). 2012-01-26 Murray Cumming Examples: Import po files 2012-01-25 Mario Blättermann [l10n] Updated German translation 2012-01-25 Mario Blättermann [l10n] Updated German translation 2012-01-25 Murray Cumming Document: Avoid accumulating old nodes in the XML. * glom/glom_document.dtd: : Port and server should be optional because the document can specify a SQLite file instead. * glom/libglom/document/document.cc: save_before(): Remove all children of the root node before recreating them, to avoid keeping old stuff. 2012-01-25 Murray Cumming Examples: Remove multiple trans_set nodes. * examples/example_film_manager.glom: * examples/example_lesson_planner.glom: * examples/example_music_collection.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: 2012-01-25 Murray Cumming Examples: Imported .po files to the .glom files. 2012-01-25 Daniel Mustieles Updated Spanish translation 2012-01-25 Murray Cumming 1.21.5 2012-01-25 Murray Cumming Fix typo. 2012-01-25 Murray Cumming Depend on libgda 5.0.3 because we need the GdaNumeric corrections. * configure.ac: This avoids errors when creating from examples, when using a non-English locale. This fixes bug #668346 (Janne) 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-24 Murray Cumming Examples: Import the new Slovenian translations 2012-01-24 Murray Cumming examples: Correct the slovenian translation The translations contained %s, but there was no %s in the original messages. 2012-01-24 Murray Cumming Examples: Re-export the .po and .pot files 2012-01-24 Murray Cumming Examples: Import the new Slovenian translations 2012-01-24 Murray Cumming 2.21.4 2012-01-24 Murray Cumming Fix document loading, and make distcheck. * glom/glom_document.dtd: Mention that the database_title attribute is replaced by title. * glom/libglom/document/document.cc: load_after(): Deprecate the database_title attribute, but do load it if it is present and if title is not. get_latest_known_document_format_version(): Increase the version because the deprecated attribute will not be saved. 2012-01-24 Murray Cumming Add missing files. 2012-01-23 Daniel Mustieles Updated Spanish translation 2012-01-23 Murray Cumming libglom: Replace more std::lists with std::vector. * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/data_structure/field.h: * glom/libglom/data_structure/foundset.h: * glom/libglom/data_structure/layout/fieldformatting.h: * glom/libglom/data_structure/layout/layoutgroup.h: * glom/libglom/document/document.h: * glom/libglom/utils.h: * glom/libglom/xsl_utils.h: * glom/mode_data/datawidget/combo_as_radio_buttons.h: This is more consistent. 2012-01-23 Murray Cumming Document: Allow the database title to be translated. * glom/libglom/filelist.am: * glom/libglom/database_title.[h|cc]: Add this new TranslatableItem. * glom/libglom/document/document.[h|cc]: Use DatabaseTitle instead of just a string, and load/save it in the database. get_database_title(): Add a locale parameter and add get_database_title_original(). * glom/application.cc: * glom/libglom/connectionpool.cc: * glom/libglom/data_structure/translatable_item.[h|cc]: * glom/libglom/db_utils.cc: * glom/libglom/example_document_load.cc: * glom/libglom/translations_po.cc: * tests/test_document_autosave.cc: * tests/test_document_change.cc: * tests/test_document_load.cc: * tests/test_document_load_translations.cc: Adapt. 2012-01-23 Murray Cumming Document: load_after_translation(), save_before_translation(): Use sharedptr. * glom/libglom/document/document.[h|cc]: load_after_translation(), save_before_translation(): Take the TranslatableItem parameter as a sharedptr. Any reason not to no longer applies. 2012-01-22 Murray Cumming Document: get_report_names(), get_print_layout_names(): Return a vector. * glom/libglom/document/document.[h|cc]: get_report_names(), get_print_layout_names(): Return a std::vector instead of a std::list, removing the typedefs, to be consistent with get_table_names(). This also helps java-libglom, whose std::list wrapper seems to be useless. * glom/application.cc: * glom/box_reports.cc: * glom/mode_design/print_layouts/box_print_layouts.cc: * tests/test_document_load.cc: Adapted. 2012-01-20 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-20 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-20 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-20 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-20 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-18 Murray Cumming Default to en rather than en_US for the original locale. * glom/application.cc: get_original_locale(): Default to en rather than en_US. * examples/*.glom: Change the original locale from en_US to en. 2012-01-17 Murray Cumming 1.21.3 2012-01-16 Daniel Mustieles Updated Spanish translation 2012-01-16 Kjartan Maraas Updated Norwegian bokmÃ¥l translation 2012-01-16 Murray Cumming Avoid repetitive Application::get_current_locale() calls. * glom/application.[h|cc]: Added item_get_title() and item_get_title_or_name() outside of the class. * glom/libglom/data_structure/translatable_item.h: Removed unused glom_get_sharedptr_title_or_name(). * glom/: Many files: Use the new functions to make the code slighly shorter. 2012-01-16 Murray Cumming TranslatableItems: Make less methods virtual. * glom/libglom/data_structure/translatable_item.[h|cc]: get_title_translation(), get_title_or_name_original(): Make these non-virtual, because nothing needs to override them. * glom/libglom/data_structure/layout/layoutitem_field.[h|cc]: Remove useless get_title_original(), get_title_translation(), and get_title_or_name_original() overrides. Remove useless and unused private get_title_no_custom_original() method. * glom/libglom/document/document.[h|cc]: Add a fill_translatable_layout_items(LayoutItem_Field) method, and use it in fill_translatable_layout_items(LayoutGroup), instead of repeating code. Avoid calling get_title_original() and get_title_translation() on LayoutItem_Field because it does not have its own title. * glom/libglom/example_document_load.cc: * tests/test_document_load_translations.cc: Adapted. 2012-01-16 Marek ÄŒernocký Updated Czech translation 2012-01-16 Murray Cumming TranslatableItem: Require the caller to provide the locale. * glom/libglom/data_structure/translatable_item.[h|cc]: get_current_locale(), set_current_locale(), set_original_locale(), get_current_locale_not_original(): Move to Glom::Application, out of libglom. get_title(), set_title(), get_title_or_name(): Add a ustring locale parameter. Added virtual get_title_original(), get_title_translation(), get_title_or_name_original(), get_title_or_name_translation(). Added set_title_original() and set_title_translation(), though these are private and non-virtual. This let use discover the actual original text and its translations while still using get_title(locale) to just get the title that should be used. Before we could get the exact entered title for a locale just by setting the current locale. * libglom/data_structure/layout/layoutitem_field.[h|cc]: Override the new virtual methods. * Many other files: Adapt. This allows us to use different translatations from Online Glom, which only loads the library once for all Glom files. And this is generally cleaner, even if it requires more repetitive code. 2012-01-16 Murray Cumming translations change in progress More in progress More in progress 2 2012-01-16 Murray Cumming Update .gitignore files 2012-01-16 Murray Cumming Update the DTD, adding a trans_set. 2012-01-16 Murray Cumming test_document_load_translations: Test title_singular too. * examples/example_film_manager.glom: Scenes table: Add a German translation of the singular title. * tests/test_document_load_translations.cc: Test Document::get_table_title_singular() in the original and de locales. 2012-01-15 Funda Wang Updated zh_CN translation. 2012-01-13 Murray Cumming Import .po translations into the .glom example files. * examples/example_film_manager.glom: * examples/example_lesson_planner.glom: * examples/example_music_collection.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: Import some new German, Czech, and Spanish translations. This is wonderful. 2012-01-12 Marek ÄŒernocký Czech translation 2012-01-11 Murray Cumming 1.21.2 2012-01-11 Marek ÄŒernocký Czech translation 2012-01-11 Marek ÄŒernocký Czech translation 2012-01-11 Marek ÄŒernocký Czech translation 2012-01-11 Marek ÄŒernocký Czech translation 2012-01-11 Marek ÄŒernocký Updated Czech translation 2012-01-11 Murray Cumming Fix make distcheck. * Makefile.am: Add messages.mo to CLEANFILES, though I would prefer to not generate it in the first place. This is apparently triggered by the presence of the .po files in examples/po_files/ though these are not part of the build. 2012-01-11 Murray Cumming Add missing file. 2012-01-10 Daniel Mustieles Updated Spanish translation 2012-01-10 Daniel Mustieles Updated Spanish translation 2012-01-10 Daniel Mustieles Updated Spanish translation 2012-01-10 Daniel Mustieles Updated Spanish translation 2012-01-10 Daniel Mustieles Updated Spanish translation 2012-01-10 Daniel Mustieles Updated Spanish translation 2012-01-10 Murray Cumming Allow creation of .pot files for .glom files. * glom/libglom/translations_po.[h|cc]: Added write_pot_file(). * glom/glom_export_po.cc: Add a --template option to genereate .pot files. * Makefile.am: Use this new option to generate .pot files when exporting all .po files. * examples/po_files/*/*.pot: Add these generated files to git, to help translators to start new translations. 2012-01-10 Murray Cumming Add README about examples' .po files. * examples/po_files/README: 2012-01-09 Murray Cumming Export .po files for the example files. * examples/po_files/example_film_manager/de.po: * examples/po_files/example_lesson_planner/de.po: * examples/po_files/example_music_collection/de.po: * examples/po_files/example_project_manager/de.po: * examples/po_files/example_smallbusiness/de.po: Hopefully people will translate these and add more, for me to import back into the .glom files with $ make examples_import_po 2012-01-09 Murray Cumming examples: Remove translations for useless locale. * examples/example_lesson_planner.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: * ldtp/database-templates/PostgresCentral/Test.glom: * ldtp/database-templates/SQLite/Test.glom: For some reason these had translations for de_BE, de_AT, en_GB, and en_US. 2012-01-09 Murray Cumming Remove unused file. 2012-01-09 Murray Cumming Translations: Prefer non-country-specific locales, such as de. * examples/example_film_manager.glom: * examples/example_lesson_planner.glom: * examples/example_music_collection.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: * examples/sqlite/test_sqlite_music/test_sqlite_music.glom: * ldtp/database-templates/PostgresCentral/Test.glom: * ldtp/database-templates/SQLite/Test.glom: * tests/test_document_load_translations.cc: * tests/translations_po/test_document_export_po.cc: * tests/translations_po/test_document_import_po.cc: Replace de_DE with de. 2012-01-09 Murray Cumming Translations: Offer non-country-specific language locales too. * Makefile_tests.am: * glom/libglom/utils.cc: locale_language_id(): Parse language-only locale IDs too. * glom/mode_design/iso_codes.cc: get_locale_name(): Create non-country locale IDs too, though they are not in the iso-codes XML file. * glom/mode_design/translation/window_translations.cc: Show, for instance German (de) as well as the existing German (Germany), German (Austria), etc. 2012-01-09 Murray Cumming Add rules for batch .po import and export for the examples. * Makefile.am: Add examples_export_po and examples_import_po targets that must be run manually. For instance: $ make examples_export_po and $ make examples_import_po * glom/glom_import_po_all.cc: Improve the stdout message. 2012-01-09 Mario Blättermann [l10n] Updated German translation 2012-01-09 Daniel Mustieles Updated Spanish translation 2012-01-09 Murray Cumming Exporting of .po files: Do not lose non-ASCII characters. * glom/libglom/translations_po.cc: write_translations_to_po_file(): Write the file manually instead of using gettext-po.h and its po_file_write(), because that loses non-ASCII characters (see previous commit). make check now works. 2012-01-09 Murray Cumming test_document_export_po: Test a special character. * tests/translations_po/test_document_export_po.cc: Demonstrate that the po file export currently drops non-ASCII characters. Apparently there is no way to tell po_file_write() to use UTF-8 encoding, though that can be affected by code that uses the libgettext-po source code itself, by setting output_format_po.requires_utf8. 2012-01-09 Murray Cumming Add glom_import_po_all command-line utility. * glom/libglom/translations_po.cc: write_translations_to_po_file(): Mark the document as modified so the changes will (or can be) saved. * Makefile_libglom.am: * glom/glom_import_po_all.cc: Add this command-line utility to read all .po files in a directory back into the .glom file. 2012-01-09 Murray Cumming Command-line utilities: Initialize gettext and the locale. * glom/glom_create_from_example.cc: * glom/glom_export_po.cc: * glom/glom_export_po_all.cc: * glom/glom_test_connection.cc: This should make the translations be used. 2012-01-09 Murray Cumming glom_export_po_all: Actually export the translations. * glom/glom_export_po_all.cc: Use the available locale_id, instead of an unset variable that should not be used. 2012-01-09 Murray Cumming export_po_all: Fix some typos. * glom/glom_export_po_all.cc: Fix some typos. 2012-01-09 Murray Cumming test_document_load_translations: Test more fallbacks. * examples/example_film_manager.glom: Remove the useless en_GB translations. * tests/test_document_load_translations.cc: Check that similar locales are used if there is no translation. 2012-01-09 Murray Cumming Added glom_export_po_all command-line too. * Makefile_libglom.am: * glom/glom_export_po_all.cc: This outputs all .po files to a directory. 2012-01-09 Murray Cumming whitespace corrections. 2012-01-08 Murray Cumming test_document_export_po: Use msgfmt -c to test the exported .po file. * configure.ac: Get the path for msgfmt. * tests/translations_po/test_document_export_po.cc: Use msgfmt -c to check the new .po file. 2012-01-08 Murray Cumming glom_export_po: Let the user choose the locale ID. * glom/glom_export_po.cc: Add, and use, a --locale-id (-l) option instead of just hard-coding de_DE. 2012-01-08 Murray Cumming Export to po file: Write a po file header. * glom/libglom/translations_po.[h|cc]: write_translations_to_po_file(): Add an optional locale_name parameter. We cannot discover this inside the function because we only use iso-codes in glom, not libglom, and I would prefer not to move that static data into libglom. * glom/mode_design/translation/window_translations.cc: on_button_export():Pass the extra locale_name parameter. * tests/translations_po/data/test.po: Resave. This makes the written .po file pass validation by msgfmt -c on the command line. 2012-01-08 Murray Cumming Import of po files: Handle empty gettext strings. * glom/libglom/translations_po.cc: Handle empty msgid, msgstr and msgctxt. 2012-01-08 Murray Cumming Hack a gettext header into our test.po, to pass the git.gnome.org translators test. I will make sure they are generated correctly later. 2012-01-08 Murray Cumming Export to po file: Improve the msgtxt hints more. * glom/libglom/document/document.cc: fill_translatable_layout_items(): Mention the parent groups in the hints, t omake them more unique. * tests/translations_po/data/test.po: Resaved. 2012-01-08 Murray Cumming Export to po file: Improve the msgtxt hints. * glom/libglom/data_structure/translatable_item.[h|cc]: get_translatable_item_type(): Make this const. * glom/libglom/document/document.[h|cc]: get_translatable_items(): Now return a list of pairs, so each TranslatableItem also has a hint for the msgtxt for the po (gettext) file, so that each can be identified uniquely and so that the translator has some context. * glom/libglom/translations_po.[h|cc]: Adapt. * glom/mode_design/translation/window_translations.[h|cc]: Adapt, showing the actual hint instead of just the item type. * tests/test_document_load_translations.cc: Adapted. * tests/translations_po/data/test.po: Reexported. 2012-01-07 Murray Cumming Update .gitignore 2012-01-07 Murray Cumming Move po file (gettext) import and export into libglom and test it. * glom/mode_design/translation/window_translations.[h|cc]: load_from_document(), save_to_document(): Move the collecting of translatable items to: * glom/libglom/document/document.[h|cc]: get_translatable_items(); Also move the gettext/po import/export to: * Makefile_libglom.am: * glom/libglom/filelist.am: * glom/libglom/translations_po.[h|cc]: write_translations_to_po_file() and import_translations_from_po_file(). * Makefile_tests.am * tests/translations_po/data/test.po: * tests/translations_po/test_document_export_po.cc: * tests/translations_po/test_document_import_po.cc: Add tests of the new libglom functions. * Makefile_glom.am * glom/glom_export_po.cc: Added a new command-line tool that uses the new libglom API. 2012-01-07 Murray Cumming test_document_load: Fix a typo. * tests/test_document_load.cc: Check the correct variable. 2012-01-07 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-07 Matej UrbanÄiÄ Updated Slovenian translation 2012-01-06 Daniel Mustieles Updated Spanish translation 2012-01-06 Murray Cumming whitespace change 2012-01-06 Murray Cumming Replace most uses of g_object_set() with C++ code. * glom/mode_data/datawidget/cellcreation.cc: * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: * glom/mode_data/db_adddel/db_adddel.cc: * glom/mode_design/layout/dialog_layout_export.cc: * glom/utility_widgets/adddel/adddel.cc: Apart from some uses, due to GTK+ bug #667415 . These were probably using C code due to the reduced API on Maemo, but we remove the Maemo code a while ago. 2012-01-06 Murray Cumming List: Custom choices: Make them work here too. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: Added get_custom_choice_original_for_translated_text() and get_custom_choice_translated() to convert between original and translated choice text. * glom/libglom/data_structure/layout/layoutitem_field.[h|cc]: Add a get_formatting_used_has_translatable_choices() convenience method. * tests/test_document_load_translations.cc: Test these new methods. * glom/mode_data/datawidget/cellcreation.cc: create_cell(): Pass the restricted bool to set_choices_restricted() so that the translations can be used. * glom/mode_data/db_adddel/db_adddel.cc: on_treeview_cell_edited(): store only the original (not translated) text in the database so that other locales can also show their own translations. treeviewcolumn_on_cell_data(): Show the translated text, not the original. 2012-01-05 Murray Cumming DTD: formatting: Mention choices_restricted to fix make check. * glom/glom_document.dtd: Note that this is not a new part of the file format. We just never used it in an example before. 2012-01-05 Murray Cumming Custom Choices: Allow these to be translated when used for text fields. * glom/libglom/filelist.am: * glom/libglom/data_structure/layout/choicevalue.[h|cc]: Add the ChoiceValue translatable item. The translations are only meaningful when this is used for a text field. * glom/libglom/data_structure/translatable_item.[h|cc]: Make get_title_original() virtual, so ChoiceValue can override it, to return a text representation of its Gnome::Gda::Value. Always use get_title_original() instead of the member variable, so that the method override is used when appropriate. * glom/libglom/data_structure/layout/fieldformatting.h: set/get_choices_custom(): Return a list of ChoiceValues instead of Gnome::Gda::Values. * glom/mode_data/datawidget/cellcreation.cc: * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: Adapt. * glom/libglom/document/document.[h|cc]: load_after_layout_item_formatting(), save_before_layout_item_formatting(): Adapt and load/save the ChoiceValue translations too. fill_translatable_layout_items(): Return the ChoiceValue items too. Add a static fill_translatable_custom_choices() helper function. * glom/mode_data/datawidget/combochoices.h: set_choices_fixed(): Add an optional restricted parameter, because the translations are only useful if the choices are restricted. * glom/mode_data/datawidget/cellrenderer_dblist.[h|cc]: * glom/mode_data/datawidget/combo_as_radio_buttons.[h|cc]: * glom/mode_data/datawidget/datawidget.cc:Adapted. * glom/mode_data/datawidget/combochoiceswithtreemodel.[h|cc]: set_choices_fixed(): Use get_title() if the choice could be translated. * glom/mode_data/datawidget/combo.[h|cc]: set_choices_fixed(): Use the (translated) text value if the choice could be translated. * glom/mode_design/translation/window_translations.cc: load_from_document(): For text fields, handle the ChoiceValues too. * tests/test_document_load.cc: Adapt. * tests/test_document_load_translations.cc: Test ChoiceValue translations too. * examples/example_film_manager.glom: Add some translations for the Scene::Day/Night field's choices. Also make the choices for this field restricted, so the translations can be used. * glom/glom_document.dtd: custom_choice: Mention the new trans_set child tags. This fixes bug #666343 2012-01-04 Murray Cumming Add missing code from previous commit, lost during rebase. 2012-01-04 Murray Cumming Details: Make restricted choices work. * glom/mode_data/datawidget/combochoiceswithtreemode.[h|cc]: on_cell_data(): Move some code into set_cell_for_field_value(). * glom/mode_data/datawidget/combo.[h|cc]: on_fixed_cell_data(): Connect a cell_data slot that uses set_cell_for_field_value(), instead of trying to associate a Gnome::Gda::Value with a cell's text property. Without this, the choice combobox's rows were empty when the field's value should be restricted to the available custom (fixed) choices. Conflicts: ChangeLog glom/mode_data/datawidget/combo.cc Conflicts: glom/mode_data/datawidget/combo.cc 2012-01-04 Murray Cumming whitespace change 2011-12-30 Murray Cumming 1.21.1 2011-12-30 Murray Cumming Dialog_NewRecord: Hide the layout toolbar. * glom/mode_data/datawidget/dialog_new_record.cc: setup(): The toolbar is useless here. 2011-12-30 Murray Cumming Update NEWS 2011-12-30 Murray Cumming Cut menu: Prevent cutting from non-editable GtkTextViews. * glom/bakery/app_withdoc_gtk.cc: on_menu_edit_cut_activate(): Pass the extra parameter to cut_clipboard(). 2011-12-30 Murray Cumming Details: Really make non-editable multiline text fields non-editable. * glom/mode_data/datawidget/textview.[h|cc]: Override set_read_only(), so that multiline text fields are really non-editable when the formatting specifies that. 2011-12-29 Murray Cumming App_WithDoc_Gtk: Simple clipboard menu handlers: Handle GtkTextView * glom/bakery/app_withdoc_gtk.cc: Add code to handle cut/copy/paste when GtkTextView is focused. This is tedious - see bug #667008 . 2011-12-29 Murray Cumming App_WithDoc_Gtk: Improve simple clipboard handlers. * glom/bakery/app_withdoc_gtk.cc: Do not use C code. And therefore do not use Glib::wrap() strangely. 2011-12-29 Murray Cumming Document::fill_layout_field_details(): Handle related choices sort fields. * glom/libglom/document/document.[h|cc]: fill_layout_field_details(): Also fill the details of the sort fields for related choices, dealing with those TODO comments. 2011-12-29 Murray Cumming NEWS formatting corrections 2011-12-29 Murray Cumming ChangeLog formatting corrections 2011-12-29 Murray Cumming ChangeLog formatting corrections 2011-12-29 Daniel Mustieles Updated Spanish translation 2011-12-29 Murray Cumming Related Choices: Allow the user to specify a sort order. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: set/get_choices_related(): Added a sort_fields parameter. * glom/libglom/document/document.[h|cc]: fill_layout_field_details(), load_after_layout_item_formatting(), save_before_layout_item_formatting(): Load and save the sort fields for related choices. * glom/libglom/utils.cc: get_choice_values(): Use the sort fields. Added get_list_of_sort_fields_for_display(). * glom/mode_data/datawidget/cellcreation.cc: * glom/mode_data/datawidget/combo_as_radio_buttons.cc: * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: Adapted. * Makefile.am, Makefile_glom.am: * glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.[h|cc]: Rename to: glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.[h|cc]: and rename the class to Dialog_SortFields. * ui/developer/dialog_groupby_sort_fields.glade: Rename to * ui/developer/dialog_sort_fields.glade * ui/developer/box_formatting.glade: * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: Add UI to specify the related choices sort order, using the new dialog, much like the existing extra-fields UI. 2011-12-29 Murray Cumming In progress sortby choices 2011-12-29 Murray Cumming Foreign key ID fields: Add a New Button next to the existing Find button. * glom/mode_data/datawidget/dialog_new_record.[h|cc]: A new dialog to quickly add a new related record. * ui/operator/dialog_new_record.glade: The UI layout for that dialog. * glom/mode_data/datawidget/datawidget: Constructor: Whenever we would add a Find or Open button, also add a New button, so the user does not need to manually go to the other table, add a record, and then come back to the right record. Add offer_related_record_id_new() to implement this. Added signal_choices_changed() which is emitted when this would result in the list of related choices changing. * glom/mode_data/box_data_details.cc: Constructor: Handle the field_choices_changed() signal, calling: * glom/mode_data/flowtablewithfields.cc: a new update_choices() method, to update all affected combo boxes. * tests/test_glade_derived_instantiation.cc: Test the new dialog. This will not quite work properly yet when the related choices should be restricted by an ID value. 2011-12-29 Murray Cumming Revert "New ID in progress" I did not mean to push this yet. This reverts commit e3231b2a09cfe2042296411a882e2fb0fd5d257d. 2011-12-28 Mario Blättermann [l10n] Updated German translation 2011-12-27 David King Add simple clipboard handlers to App_WithDoc_Gtk * glom/bakery/app_withdoc_gtk.[cc|h]: Add simple clipboard handlers to fix bug 518315. 2011-12-26 Matej UrbanÄiÄ Updated Slovenian translation 2011-12-24 Murray Cumming Choices: Make sure related choices are sorted. * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: set_choices_related(): Add a sort clause, though it would be best if the developer could specify this. Note that Utils::get_choice_values(), used for other choices, already does this, and we should reduce the code duplication. 2011-12-24 Marek ÄŒernocký Updated Czech translation 2011-12-23 Daniel Mustieles Updated Spanish translation 2011-12-23 Murray Cumming Document_XML: Remove an unimplemented method. * glom/libglom/document/bakery/document_xml.h: add_indenting_white_space() was never implemented or used. 2011-12-22 Murray Cumming New ID in progress 2011-12-21 Murray Cumming Dialog_ChooseID: Really show the quick find feature. * ui/operator/dialog_find_id.glade: Correct some widget names. We were removing a widget too high in the hierarchy, so we did not show the quick find. This was presumably broken by some conversion to a new version of Glade at some point. 2011-12-21 Murray Cumming Update some .gitignore files. 2011-12-21 Murray Cumming Add comments 2011-12-20 Murray Cumming TranslatableItem::get_title_translation(): Correct fallback code. * glom/libglom/data_structure/translatable_item.cc: This fixes make check, which was broken after the recent change to this class. 2011-12-20 Mario Blättermann [l10n] Updated German translation 2011-12-20 Daniel Mustieles Updated Spanish translation 2011-12-20 Murray Cumming Make this (Glom 1.21/22) parallel installable with glom 1.20. * configure.ac: Increase version to 1.21.1. * docs/pyglom_reference/Makefile.am: * glom/libglom/init.h: * glom/python_embed/python_module/py_glom_module.cc: Change mention of 1.20 or 1_20 to 1.22 or 1_20. 2011-12-20 Murray Cumming TranslatableItem: Improve the API slightly. * glom/libglom/data_structure/translatable_item.[h|cc]: Renamed set/get_translation() to set/get_title_translation() to make it clearer, and to match set/get_title_original(). Add an optional bool fallback parameter, so we can move the fallback code into this method, and simplify get_title(). This lets us easily get the title for a specified locale, with one method, even if that locale is the original/ current locale. Removed get_title(locale), because it is hardly used, because any override of the other (virtual) get_title() method overload would make it hard to call this anyway. And it just forwarded to get_title_translation() anyway. Likewise for set_title(locale). * glom/libglom/document/document.cc: * glom/mode_design/translation/window_translations.cc: Adapted. * tests/test_document_load_translations.cc: Adapted and added some more test lines for get_title_translation() 2011-12-20 Murray Cumming PostgreSQL backend: Comment out the stdout exception information again. * glom/libglom/connectionpool_backends/postgres.cc: This was misleading when trying all ports, when we expect some failures. 2011-12-20 Marek ÄŒernocký Updated Czech translation 2011-12-19 Murray Cumming List: Really store data when the primary key is not auto-incremented. * glom/mode_data/db_adddel/db_adddel.cc: user_added(): Do not use get_value_key_selected() to get the entered field data, because that is only useful after the key has been entered. Instead get the entered data from the cell where it was entered. 2011-12-19 Murray Cumming Update some debug output 2011-12-18 Murray Cumming PostgreSQL: Print stderr message when the connection fails completely. * glom/libglom/connectionpool_backends/postgres.cc: This can provide a clue, for instance when the hostname cannot be resolved. 2011-12-18 Murray Cumming Add the glom_test_connection command-line tool. * Makefile_libglom.am: * glom/glom_test_connection.cc: This is useful for sanity checking of the configuration of central PostgreSQL servers. 2011-12-16 Murray Cumming Film Manager example: Use English for Day/Night choices. * examples/example_film_manager.glom: Use English for the custom choice values. We need to allow these to be translated. See bug #666343 2011-12-14 Murray Cumming Document: Added get_translation_available_locales(). * glom/libglom/document/document.[h|cc]: load_after(), load_after_translations(): Remember any new locales encountered, so that get_translation_available_locales() can later return the list. This could help with OnlineGlom bug #666165 . * tests/test_document_load_translations.cc: Test the new method. 2011-12-13 Murray Cumming Increase version. 2011-12-13 Murray Cumming Correct parsing of example data. * glom/libglom/data_structure/field.[h|cc]: to_file_format(), from_file_format() documentation: Mention that this uses CSV format. from_file_format(): Unescape double quotes, because we escape quotes as that in to_file_format(). This avoids reading them as double quotes when opening an example file. This will also correct the interpretation of text default values. * Makefile_tests.am: * tests/test_field_file_format.cc: Add a test of this for text and image data, checking that what we write is what we read. 2011-12-13 Murray Cumming test_selfhosting_new_then_image: Move some code to test_utils. * Makefile_tests.am: * tests/test_selfhosting_new_then_image.cc: Move the test image-loading code to: * tests/test_utils.[h|cc]: get_value_for_image(). 2011-12-13 Murray Cumming Minor correction to a comment. 2011-12-12 Murray Cumming LayoutGroup: Correct the get_items_recursive_with_groups() implementaiton. * glom/libglom/data_structure/layout/layoutgroup.cc: Call the correct method recursively. This fixes make check. 2011-12-12 Murray Cumming test_document_load: Test LayoutGroup::get_items_recursive(). * tests/test_document_load.cc: And get_items_recursive_with_groups(). 2011-12-12 Murray Cumming Small fix to epository_analyzer_begin_scan example script. * examples/example_scripts/repository_analyzer_begin_scan.py: Remove the global variables, used for debugging, because recent versions of Python do not seem to treat them as global when this script is used as a Button script in python. So it says they are undefined. They are, after all, inside the function that glom defines. Although they would still work in this standalone script, it is nice to have no difference between this file and the one used in this .glom file: https://gitorious.org/debian_repository_analyzer/debian_repository_analyzer 2011-12-12 Murray Cumming List view: Do not show columns twice. * glom/libglom/data_structure/layout/layoutgroup.[h|cc]: Revert the recent change to get_items_recursive() so that it only returns no-groups items, as its documentation says. Add get_items_recursive_with_groups(). * tests/test_document_load.cc: Use the new method. This problem was caused by commit e51bf19e8a595dbc4e34c390ae2194293deb0236 2011-12-09 Murray Cumming Users/Groups UI: Avoid warning about an empty group name. * glom/mode_design/users/dialog_groups_list.cc: on_treeview_groups_selection_changed(): Do not respond if there is no selection, which can happen when clearing the model, just before filling it. When there are items, there is always a selection. 2011-12-09 Murray Cumming Combo_TextGlade: Work around GtkComboBoxText bug #612396. * glom/utility_widgets/combo_textglade.cc: Without setting entry-text-column, which GtkBuilder understandably does not do, and which GtkComboBoxText does not do in this case, the widget just does not work. This fixes the Users/Groups dialogs and the Script Library dialog. 2011-12-09 Murray Cumming Combo_TextGlade: Work around GtkComboBoxText bug #612396. * glom/utility_widgets/combo_textglade.cc: Without setting entry-text-column, which GtkBuilder understandably does not do, and which GtkComboBoxText does not do in this case, the widget just does not work. This fixes the Users/Groups dialogs and the Script Library dialog. 2011-12-09 Murray Cumming test_glade_derived_instantiation: Avoid warnings about no connection. * glom/mode_design/users/dialog_groups_list.cc: Constructor: Do not call fill_groups_list(). This happens already in load_from_document(), where we can expect more to have a connection. * glom/mode_design/users/dialog_users_list.[h|cc]: Make fill_list public and expect the caller of the constructor to call it. 2011-12-08 Murray Cumming tiny const changes. 2011-12-08 Murray Cumming test_fake_connection: Avoid unnecessary warnings about metadata. * glom/libglom/connectionpool.cc: Avoid printing exceptions to stderr about failed attempts to get types and tables metadata, because this is not used by fake connections, for instance by java-libglom. There will be a warning later if it is really used. * glom/libglom/db_utils.cc: Add some comments. 2011-12-08 Murray Cumming Document: Clarify that set_file_uri() does not trigger a save. * glom/libglom/document/document.[h|cc]: set_file_uri(): The check for a changed URI never actually worked here, so set_modified() was never called. That behaviour is actually correct, to avoid saving an empty file over a real file before calling load(), so document that behaviour. * glom/libglom/document/bakery/document_xml.cc: Remove the check for modified so that an explicit save() always saves the document, even if all values are the default. This does not seem to have prevented any unnecessary saves anyway, because we already check for changes before calling set_modified(), so we only trigger autosave when really necessary. 2011-12-07 Murray Cumming Updat .gitignore 2011-12-07 Murray Cumming Test for autosaves without URI and for explicit saves while using autosave. * glom/libglom/document/bakery/document.cc: write_to_disk(): Warn if the URI has not been set, because the caller probably wants either autosave (meaning he should have set a URI first) or explicit save (meaning he should disable autosave). * glom/libglom/document/bakery/document_xml.cc: Warn about an attempt to save when nothing has been modified, because this is usually caused by a previous autosave, and the caller should probably be aware of that. * tests/test_document_autosave.cc: * tests/test_document_change.cc: * tests/test_selfhosting_new_empty.cc: * tests/test_selfhosting_new_then_backup_restore.cc: * tests/test_selfhosting_utils.cc: Disable autosave so we can use a simpler explicit save, avoiding these new warnings. 2011-12-07 Murray Cumming Add a test that resaves (temporarily) all examples and checks the result. * Makefile_tests.am: * tests/test_document_load_and_save.cc: Load a file and save it, then check the saved file against the DTD. * tests/test_document_load_and_save_all.sh: Run that test on all example files. * glom/glom_document.dtd: data_layout_notebook: Mention trans_set, so that this test succeeds. 2011-12-07 Murray Cumming Use EXIT_* instead of 0 and -1. * glom/test_pyembed.cc: * glom/test_pyembed_singleline.cc: * tests/glade_toplevels_instantiation.cc: * tests/test_parsing_time.cc: Use EXIT_SUCCESS and EXIT_FAILURE. 2011-12-07 Murray Cumming Document: Avoid useless autosave during constructor. * glom/libglom/document/document.cc: Constructor: Avoid triggering autosave during the constructor, though this is stopped anyway by the empty filepath. 2011-12-05 Daniel Mustieles Updated Spanish translation 2011-12-05 Murray Cumming Remove unused get_sql_format() methods. * glom/libglom/connectionpool.[h|cc]: * glom/libglom/connectionpool_backends/backend.h: * glom/libglom/connectionpool_backends/postgres.[h|cc]: * glom/libglom/connectionpool_backends/sqlite.[h|cc]: Remove the various unused get_sql_format() methods. 2011-12-05 Murray Cumming Field: Remove unused get_gda_holder_string(). * glom/libglom/data_structure/field.[h|cc]: Remove this unused method. 2011-12-05 Murray Cumming test_selfhosting_new_then_change_columns: Add a column too. * tests/test_selfhosting_new_then_change_columns.cc: 2011-12-05 Murray Cumming Added a test of field choices. * Makefile_tests.am: * tests/test_selfhosting_new_then_choices.cc: Test Utils::get_choice_values_all(). 2011-12-04 Murray Cumming Document DTD: adapt to the format we actually use. * examples/example_film_manager.glom: Resave this. * glom/glom_document.dtd: Change the sequence of child nodes for tables and print_layouts to match what we really write. We do not really care about this but the DTD format forces us to use a sequence. 2011-12-03 Murray Cumming test_document_load: Check reports too. * tests/test_document_load.cc: Check some report names. 2011-12-03 Murray Cumming test_document_load: Check a table title and its singular title. * tests/test_document_load.cc: Also test get_data_layout_groups_have_any_fields(). 2011-12-03 Murray Cumming Add singular table titles to example 2011-12-03 Murray Cumming tests/test_document_load_and_change: Change a relationship name. * Makefile_tests.am: Use the test_utils. * tests/test_document_load_and_change.cc: Also rename a relationship and check that a layout item uses the new relationship name. 2011-12-03 Murray Cumming Tests: Add a shared get_field_on_layout() function. * tests/test_document_load.cc: Move get_field_on_layout() to * Makefile_tests.am: * tests/test_utils.[h|cc]: here. 2011-12-03 Murray Cumming Remove unnecessary stdcerr output. 2011-12-03 Murray Cumming Removed some debug output. 2011-12-02 Murray Cumming Fix the DTD 2011-12-02 Murray Cumming Added test_document_load_translations * tests/test_document_load_translations.cc: Test some translated titles. 2011-12-02 Murray Cumming DbUtils::recreate_database_from_document(): Set table privileges too. * glom/libglom/db_utils.cc: recreate_database_from_document(): Also call set_table_privileges_groups_from_document(). 2011-12-02 Murray Cumming DbUtils::recreate_database_from_document(): Create groups too. * glom/libglom/db_utils.[h|cc]: recreate_database_from_document(): Also call add_groups_from_document(). 2011-12-02 Murray Cumming test_document_load: Move changes into test_document_load_and_change. * tests/test_document_load.cc: * tests/test_document_load_and_change.cc: 2011-12-02 Murray Cumming test_document_load: Test Document's user groups functions too. * tests/test_document_load.cc: Check for expected group names and check that we can remove one. 2011-12-02 Murray Cumming test_document_load: Test some navigation utility functions. * glom/libglom/data_structure/layout/layoutgroup.cc: get_items_recursive(): Return the child groups as well as their items. * tests/test_document_load.cc: Test DbUtils::layout_field_should_have_navigation() and LayoutItem_Portal::get_suitable_table_to_view_details(). 2011-12-02 Murray Cumming test_selfhosting_new_empty(): Also test DbUtils::get_unused_database_name(). * glom/libglom/db_utils.cc: get_unused_database_name(): Remove debug output. * tests/test_selfhosting_new_empty.cc: Excercise DbUtils::get_unused_database_name(), though we do not test it yet when the first choice already exists. 2011-12-02 Murray Cumming Make the version at least as high as the stable one. 2011-12-02 Murray Cumming test_selfhosting_new_empty(): Correct and expand. * tests/test_selfhosting_new_empty.cc: Fix a CENTRAL->SELF typo. This probably only appeared to work before because no database cluster was really being initialized. Also actually create a database in the database cluster and set its system preferences table's record. 2011-12-01 Murray Cumming test_selfhosting_new_then_lookup: Minor improvements. * tests/test_selfhosting_new_then_lookup.cc: Avoid some hard-coding. 2011-12-01 Murray Cumming Moved some lookup functions into DbUtils and added a test for them. * glom/libglom/db_utils.[h|cc]: * glom/base_db.[h|cc]: Moved get_fields_for_table(), get_fields_for_table_one_field(), get_lookup_fields(), and get_lookup_value() to the DbUtils namespace, taking an extra Document parameter. * glom/libglom/document/document.[h|cc]: Moved get_lookup_fields() to DbUtils too. * glom/base_db_table_data.cc * glom/mode_data/box_data.cc * glom/mode_data/box_data_calendar_related.cc * glom/mode_data/box_data_details.cc * glom/mode_data/box_data_list_related.cc * glom/mode_data/db_adddel/db_adddel.cc * glom/mode_design/box_db_table_relationships.cc * glom/mode_design/fields/box_db_table_definition.cc * glom/mode_design/fields/dialog_fielddefinition.cc * glom/mode_design/layout/dialog_layout_list_related.cc * glom/print_layout/canvas_print_layout.cc: Adapted. This shows how often we call this very inefficient function. It would be better to just make sure that the document has up-to-date information from the database and just use the Document's information. * Makefile_tests.am: * tests/test_selfhosting_new_then_lookup.cc: Added a new test of these functions, including retrieval of a lookup value. 2011-11-30 Murray Cumming Remove unused parameternamegenerator source file. * glom/libglom/filelist.am: * glom/libglom/data_structure/parameternamegenerator.[h|cc]: Remove this unused class. * glom/base_db.cc * glom/libglom/db_utils.cc: Do not include it. 2011-11-30 Murray Cumming test_document_load_and_change: Test renaming and removing of tables. * tests/test_document_load_and_change.cc: This also checks that relationships are update when a table is renamed. 2011-11-30 Murray Cumming test_document_load_and_change: Test print layout removal. * tests/test_document_load_and_change.cc: 2011-11-30 Murray Cumming Updated the Document DTD. * glom/glom_document.dtd: This fixes make check with the new save of examples/example_film_manager.glom. 2011-11-30 Murray Cumming self-hosting tests: Avoid some noisy stdout messages. * tests/test_selfhosting_utils.cc: Do not show PostgreSQL startup, etc, progress messages. 2011-11-30 Murray Cumming test_document_load: Test print layout functions. * examples/example_film_manager.glom: Add a contacts print layout and resave this. * tests/test_document_load.cc: Test the print layout data. 2011-11-30 Murray Cumming test_load_and_change(): Test removal of a relationship. * tests/test_document_load_and_change.cc: Test Document::remove_relationship(). 2011-11-30 Murray Cumming test_document_load: Test field formatting. * tests/test_document_load.cc: Also use a different example, to widen the range of examples that we test. 2011-11-29 Murray Cumming Correct NEWS 2011-11-29 Murray Cumming Update NEWS 2011-11-29 Murray Cumming Update .gitignore 2011-11-29 Murray Cumming test_document_change: Test a little more API. * tests/test_document_change.cc: Add a table and test some API that uses it. We could do much more here. 2011-11-29 Murray Cumming test_document_load_and_change: Test Document::remove_field() too. * tests/test_document_load_and_change.cc: Exercise a little more of the API. 2011-11-29 Murray Cumming LayoutGroup: Add a more useful remove_field(). * glom/libglom/data_structure/layout/layoutgroup.[h|cc]: Add a remove_field(parent_table_name, table_name, field_name) method overload, deprecating the existing method overloads. * glom/libglom/document/document.cc: Adapt. * tests/test_document_load_and_change.cc: Test a different example, so we can check for a related field on a layout. 2011-11-29 Murray Cumming LayoutGroup: Deprecate the old has_field() method and do not use it. * glom/libglom/data_structure/layout/layoutgroup.h: * glom/libglom/document/document.cc: * tests/test_document_load.cc: Adapt. 2011-11-29 Murray Cumming test_document_load: Check that a field is on a layout. * glom/libglom/data_structure/layout/layoutgroup.[h|cc]: Added has_field() that can find a related field. * tests/test_document_load.cc: Check that an expected field is found on the layout. 2011-11-29 Murray Cumming Add a test for changing of a field name. * tests/Makefile.am: * tests/test_document_load_and_change.cc: Change a field name and make sure that it has updated throughout the document. However, we still need to check lookups and related fields. 2011-11-28 Murray Cumming Field::set_field_info(): Avoid unnecessary checks (and warnings). * glom/libglom/data_structure/field.cc: If the type is not yet set, don't bother checking that everything else uses that type. This avoids a stderr warning about invalid types being used. 2011-11-28 Murray Cumming Field::set_field_info(): Slight code improvement. * glom/libglom/data_structure/field.cc: Move some duplicated code into a static helper function. 2011-11-28 Murray Cumming whitespace correction 2011-11-28 Murray Cumming Added an extra test for the Document class. * tests/test_document_change.cc: The beginnings of another test, to check that what we set is what we later get. 2011-11-28 Murray Cumming Remove debug output 2011-11-28 Murray Cumming SQLite: Avoid a warning about int types for summary fields. * glom/libglom/data_structure/glomconversions.cc: get_text_for_gda_value(): An int is normal for aggregate fields for SQLite. convert_value(): Make sure that we do a locale-independent conversion, otherwise the above fix will cause us to, for instance, have a comma in large numbers. 2011-11-28 Murray Cumming Minor const addition 2011-11-28 Murray Cumming Revert "SQLite: Avoid a warning about int types for summary fields." This reverts commit 803e2eb5225f7d8d0907e8320296e44deb970027 because it makes make check fail. 2011-11-28 Murray Cumming gcov: Add a legend key to the lcov html. * Makefile.am: Pass --legend to genhtml. 2011-11-25 Murray Cumming Correct a query from UPDATE to SELECT. * glom/libglom/report_builder.cc: Correc the query to get system preferences values. This was apparently not tested yet. 2011-11-25 Murray Cumming SQLite: Avoid a warning about int types for summary fields. * glom/libglom/data_structure/glomconversions.cc: get_text_for_gda_value(): An int is normal for aggregate fields for SQLite. 2011-11-25 Murray Cumming Avoid an uninteresting stdcerr warning. * glom/libglom/connectionpool.cc: It is OK to not know the document sometimes. 2011-11-25 Matej UrbanÄiÄ Updated Slovenian translation 2011-11-25 Murray Cumming gcov: Use lcov instead of my hacky bash script. * configure.ac: Check for lcov and genhtml. * Makefile.am: This generates a nice HTML report. 2011-11-25 Murray Cumming cov: Use AC_PATH_PROG(). * configure.ac: Check for the path to gcov. * Makefile.am: Use it. 2011-11-25 Murray Cumming Added a "make gcov" target to get some test coverage statistics. * configure.ac: Add an --enable-gcov option which add gcc/g++ flags. * Makefile_glom.am: * Makefile_libglom.am: * Makefile.am: Add some cargo-culted and hacked-together bash scripted rules that generate the .gcov files and parse them to give some percentages on stdout. 2011-11-24 Murray Cumming Remove mention of a fixed libgda bug. 2011-11-24 Murray Cumming Fix typo in configure.ac 2011-11-23 Murray Cumming Avoid deprecated glibmm API (from glibmm/thread.h). * configure.ac: Depend on a recent unstable glibmm. * glom/libglom/spawn_with_feedback.cc: Use Glib::Threads::Cond and Glib::Threads::Mutex instead of deprecated Glib::Cond and Glib::Mutex. 2011-11-21 Murray Cumming libglom: Added DbUtils::set_fake_connection(). * glom/libglom/db_utils.[h|cc]: Added DbUtils::set_fake_connection() because ConnectionPool is not public API. * tests/test_fake_connection.cc: Use this function instead of using ConnectionPool's API. 2011-11-21 Murray Cumming NEWS: Mention major 1.20 features. 2011-11-21 Murray Cumming Forgot to commit version change. 2011-11-20 Murray Cumming 1.20.0 2011-11-20 Murray Cumming Details View: Left-align numbers when using automatic alignment. * glom/libglom/data_structure/layout/layoutitem_field.[h|cc]: * glom/libglom/data_structure/layout/layoutitem_withformatting.[h|cc]: get_formatting_used_horizontal_alignment(): Add a for_details_view() and return left-alignment for auto-alignment on a details view. * glom/mode_data/datawidget/entry.cc: * glom/utility_widgets/layoutwidgetbase.cc: Pass true to get that effect. Right-aligned numbers on the detailed view just look sillier now that the entry widgets are full width, and when there are no other numbers above or below them. Note that we probably did not purposefully change it show numbers with full width, but I would still want this alignment change. 2011-11-20 Marek ÄŒernocký Updated Czech translation 2011-11-18 Murray Cumming Recognize GdaBlob as suitable for Image field types. * glom/libglom/data_structure/field.cc: Add to the map, to avoid a warning. 2011-11-18 Mario Blättermann [l10n] Updated German translation 2011-11-18 Murray Cumming Fix the build with latest GTK+ with --enable-warnings=fatal * glom/utility_widgets/eggspreadtable/eggspreadtablednd.c (set_drag_icon): Update from libegg to fix the build with deprecated GTK+ API disabled. 2011-11-18 Murray Cumming Details: Move the checkbutton titles to the left. * glom/mode_data/datawidget/checkbutton.h: Contructor: Allow the title to be empty. * glom/mode_data/datawidget/datawidget.cc: Give the checkbutton a title at the left, like other widgets. This looks consistent. 2011-11-17 Murray Cumming Update an example screenshot. * docs/website/screenshots/glom_example_lessonplanner.png: Update this now that the calendar portal works again. * docs/website/screenshots/glom_select_field.png: Remove this because it is not used. 2011-11-17 Murray Cumming Remove debug output. 2011-11-17 Murray Cumming date test: Set LANGUAGE too, which seems to be necessary on Ubuntu. * tests/test_glom_date_in_locales.sh: Also add some locales that are available on Ubuntu. 2011-11-17 Murray Cumming Remove incorrect README 2011-11-17 Murray Cumming main: Break the date check into two possible error messages. * glom/main.cc: This simplifies debugging a bit. 2011-11-17 Murray Cumming locale test: Add apt-get hint 2011-11-16 Murray Cumming Enable the test for dates in various locales. * Makefile_tests.am: * tests/test_glom_date_in_locales.sh: I don't like requiring installation of these locales during make check, but I see no other way to stop the fixes from being lost by careless translators, at least of the major languages. 2011-11-16 Murray Cumming Correct the date format in the es_ES locale. * es.po: Added a translation for the date format, because the default does not show 4-digit years. This avoids the warning at startup, which asks the translator to deal with it. Note that I have made this correction before: http://git.gnome.org/browse/glom/commit/po/es.po?id=79636cd099b8330339502cebe95fb6e1583d1c20 2011-11-16 Murray Cumming Update NEWS 2011-11-16 Murray Cumming List view: Stop unnecessary saving of column widths. * glom/mode_data/db_adddel/db_adddel.[h|cc]: Do not handle changes of the GtkTreeView column width, because it happens during normal size allocation as well as when the user resizes columns. It is not essential anyway. 2011-11-16 Murray Cumming Make the Calendar portal work again. * glom/mode_data/box_data_calendar_related.[h|cc]: Override create_layout() as a place to call our get_fields_to_show(), like Box_Data_List_Related does. Then fill_from_database() can succeed. 2011-11-14 Murray Cumming Fake connection test: Test for a substring in the generated query. * tests/test_fake_connection.cc: This also fixes the build with -Werror. 2011-11-14 Murray Cumming Correct a comment. 2011-11-13 Murray Cumming Use the new Gnome::Gda::Numeric API. * glom/libglom/data_structure/glomconversions.cc: * glom/libglom/python_embed/pygdavalue_conversions.cc: * tests/python/test_python_execute_func_date.cc: GdaNumeric now has a real API so we can make our code simpler. 2011-11-11 Murray Cumming Fix typo to fix the build. 2011-11-11 Murray Cumming List view and Related Records: Disable buttons when appropriate. * glom/mode_data/db_adddel/db_adddel.[h|cc]: Handle the Gtk::TreeView::Selection::signal_changed() signal and call a new virtual on_selection_changed() method. * glom/mode_data/db_adddel/db_adddel_withbuttons.[h|cc]: Disable the Edit/Open and Delete buttons when there is no selection. Bug #663812 (André Klapper) 2011-11-10 Murray Cumming Correct an error in the previous commit. * glom/libglom/connectionpool.cc: Remove a nonsense line of code that stopped connections from working. 2011-11-10 Murray Cumming Added ConnectionPool::set_fake_connection(). * glom/libglom/connectionpool_backends/backend.h: connect(): * glom/libglom/connectionpool_backends/postgres.[h|cc]: connect(), attempt_connect(): * glom/libglom/connectionpool_backends/postgres_central.[h|cc]: connect(): * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: connect(): * glom/libglom/connectionpool_backends/sqlite.[h|cc]: connect(): Add a bool fake_connection parameter and use Gnome::Gda::create_with_string() instead of open_with_string() if it is true. * glom/libglom/connectionpool.[h|cc]: Add set_fake_connection() to set that bool and other things needed to make it work. * Makefile_tests.am: * tests/test_fake_connection.cc: Added a test that uses this for the intended purpose of getting a suitable SQL query string without an open connection. However, it does not currently work as expected due to: http://mail.gnome.org/archives/gnome-db-list/2011-November/msg00007.html 2011-11-10 Murray Cumming Escape database connection details properly. * glom/libglom/db_utils.[h|cc]: Added gda_cnc_string_encode() for use with GdaConnection's cnc_string and auth_string, for instance to escape the database directory, name, username, and password. * glom/libglom/connectionpool_backends/postgres.cc: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/connectionpool_backends/sqlite.cc: Properly escape the cnc_string and auth_string key values. * tests/test_selfhosting_utils.cc: test_create_and_selfhost_from_example(), test_create_and_selfhost_from_uri(): Add an optional subdirectory parameter that we can use to force weird parts into the path. * Makefile_tests.am: * tests/test_selfhosting_new_from_example_strangepath.cc: Add a test case that uses a path with some weird characters. This now works thanks to the above changes. 2011-11-09 Murray Cumming Add a TODO 2011-11-09 Murray Cumming Use Glib::shell_quote() when spawning tar. * glom/libglom/document/document.cc: Use Glib::shell_quote() when spawning tar, instead of manually adding quotes. 2011-11-09 Murray Cumming PostgreSQL backend: Use g_shell_quote(). * glom/libglom/connectionpool_backends/postgres.[h|cc]: get_path_to_postgres_executable(): Return the already-quoted path to avoid the need for manual quoting by the caller. However, make this optional (but the default) so that the check in * main.cc: can still work. * glom/libglom/connectionpool_backends/postgres_self.cc: Use Glib::shell_quote() instead of manually adding quote characters. Hopefully this also escapes special characters, though we should try to test this somehow. 2011-11-08 Murray Cumming Avoid some repetition of some CREATE GROUP and ALTER GROUP queries. * glom/libglom/db_utils.[h|cc]: Added build_query_create_group() and build_query_add_user_to_group() to avoid repeating the code. * glom/base_db.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: Use them. 2011-11-08 Murray Cumming 1.19.19 2011-11-08 Murray Cumming Use escape_sql_id() for privileges SQL queries. * glom/base_db.cc: * glom/libglom/db_utils.cc: * glom/libglom/privs.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: Use DbUtils::escape_sql_id() instead of manually adding quotes with no escaping. This seems to be the right thing to do for these queries. 2011-11-08 Murray Cumming More use of escape_sql_id(). * glom/base_db.cc: * glom/libglom/db_utils.cc: * glom/libglom/privs.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: Use escape_sql_id() instead of manually adding quotes with no escaping. However, I have not yet done this for group and user names. 2011-11-08 Murray Cumming libglom: Remove LayoutItem_Field::get_sql_name(). * glom/libglom/utils.cc: build_sql_select_add_fields_to_get(): Use SqlBuilder::add_field_id() instead of LayoutItemField::get_sql_name(). * glom/libglom/data_structure/layout/layoutitem_field.[h|cc]: Remove the now unused get_sql_name() method. 2011-11-08 Murray Cumming libglom: Use escape_sql_id() for column add/crop/change. * glom/libglom/connectionpool.cc: add_column(), drop_column(), * glom/libglom/connectionpool_backends/backend.[h|cc]: * glom/libglom/connectionpool_backends/postgres.cc * glom/libglom/connectionpool_backends/sqlite.[h|cc]: add_column(), drop_column(): Return a bool to indicate failure. change_columns(): Report false return values from these. * Makefile_tests.am * tests/test_selfhosting_new_then_change_columns.cc: Add a simple test, though we do not yet test that the expected change really happened. 2011-11-08 Daniel Mustieles Updated Spanish translation 2011-11-08 Murray Cumming Update .gitignore files 2011-11-08 Murray Cumming libglom: Add escape_sql_id() and use it for table add/drop/rename. * glom/libglom/db_utils.[h|cc]: Add escape_sql_id(), using gda_connection_quote_sql_identifier(). create_table(), rename_table(), drop_table(): Use it instead of manually adding quotes with no escaping. * tests/test_selfhosting_new_then_alter_table.cc: Mention that the commented-out test still fails because of libgda bug #663608 . 2011-11-08 Murray Cumming libglom: Add DbUtils::rename_table() and drop_table() and test them. * glom/navigation/box_tables.c: Move query-building code to * glom/libglom/db_utils.[h|cc]: rename_table() and drop_table(). * Makefile_tests.am * tests/test_selfhosting_new_then_alter_table.cc: Add a test of these functions, and of table creation. This shows that we need to escape SQL identifiers to allow characters such as " in table names. 2011-11-07 Marek ÄŒernocký Updated Czech translation 2011-11-07 Murray Cumming Require the latest libgdamm. * configure.ac: We use a new Gnome::Gda::Connection::statement_to_sql() method overload. 2011-11-07 Murray Cumming 1.19.18 2011-11-07 Murray Cumming Add a test of backup and restore. * glom/application.cc: on_menu_developer_export_backup(), do_restore_backup(): Move code into * glom/libglom/document/document.[h|cc]: save_backup() and restore_backup_file() so it is easier to test. * tests/test_selfhosting_new_from_example.cc: Move some testing into: * tests/test_selfhosting_utils.[h|cc]: test_example_musiccollection_data() to avoid repeating code. * Makefile_tests.am: Added a new test: * tests/test_selfhosting_new_then_backup_restore.cc: Test the new Document functions, though the data check currently fails and is commented out. I think it is just a problem in the test because the data is there when using the UI. 2011-11-07 Murray Cumming Rename a test utility function. * tests/test_selfhosting_utils.[h|cc]: Rename test_create_and_selfhost() to test_create_and_selfhost_from_example(). * tests/test_selfhosting_new_from_example.cc: * tests/test_selfhosting_new_then_get_privs.cc: * tests/test_selfhosting_new_then_image.cc: * tests/test_selfhosting_new_then_report.cc: * tests/test_selfhosting_sqlinjection.cc: Adapated. 2011-11-06 Murray Cumming Require libgda 5.0.2 * configure.ac: Require the lastest libgda to avoid several bugs at runtime - See the comments in configure.ac. 2011-11-04 Murray Cumming Creating from examples: Do not create users and groups with SQLite. * glom/libglom/db_utils.cc: add_groups_from_document(), set_table_privileges_groups_from_document(): Do nothing if the database backed doesn't support this feature, to avoid errors when using SQLite. 2011-11-04 Murray Cumming Handle GdaBlob in query results instead of just GdaBinary. * glom/libglom/data_structure/field.cc: to_file_format(): The Value might have a GdaBlob that needs to be read first, to get the GdaBinary. This can happen with SQLite. * glom/libglom/python_embed/pygdavalue_conversions.cc: glom_pygda_value_as_boost_pyobject(): Handle GdaBlob too, though neither this or the GdaBinary case use the data length, so this code is doomed if it is ever used. I need to find out if Python can really represent binary data, or if this should just not be handled here. * glom/utility_widgets/imageglom.cc: get_binary(): Handle GdaBlob too in the original data. * tests/test_selfhosting_new_then_image.cc: Handle GdaBlob in the data that is read back, for SQLite. Uncomment the SQLite test, fixing make check with the latest libgda. 2011-11-04 Murray Cumming 1.19.17 2011-11-04 Murray Cumming Correct the ChangeLog 2011-11-04 Murray Cumming Remove debug output. 2011-11-04 Murray Cumming Handle gdouble results from python functions. * glom/libglom/data_structure/field.cc: Add a mapping instead of ignoring doubles. This avoids a stderr warning and probably makes calculations work. 2011-11-04 Murray Cumming Fix some warnings about invalid field types with choices. * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: set_choices_related(): Set full field details on the layout_choice_extra fields, to avoid invalid field types, and stderr warnings about them. 2011-11-03 Daniel Mustieles Updated Spanish translation 2011-11-03 Murray Cumming Updated examples screenshots. * docs/website/screenshots/glom_example_filmmanager.png: * docs/website/screenshots/glom_example_musiccollection.png: * docs/website/screenshots/glom_example_projectmanager.png: * docs/website/screenshots/glom_example_smallbusiness.png: * docs/website/screenshots/small_glom_data_details.png: Updated. * examples/example_film_manager.glom: * examples/example_music_collection.glom: * examples/example_project_manager.glom: Saved some changes that I made to match the details. 2011-11-03 Murray Cumming Update screenshots for the website. * docs/website/screenshots/*.png: Updated these screenshots, partly by copying some from user_guide/C/figures/. They are used here: http://www.glom.org/wiki/index.php?title=Screenshots after uploading with "make post-html" 2011-11-03 Murray Cumming Updated more screenshots. * C/figures/glom_design_details_layout_toolbar.png: * C/figures/glom_design_print_layout.png: * C/figures/glom_initial_dialog_local_network.png: Updated more screenshots. 2011-11-03 Murray Cumming FlowTable: In developer mode, draw some lines. * glom/utility_widgets/flowtable.[h|cc]: on_draw(): Draw some dashed lines a little like the lines drawn in on_expose_event() in Glom 1.18. This is not very good, but it was not very good before, but I still think we need something to show the boundaries. 2011-11-03 Murray Cumming Updated some more screenshots. * C/figures/glom_data_details.png: * C/figures/glom_design_fields.png: * C/figures/glom_design_layout_details.png: * C/figures/glom_report_result.png: Updated. Only 2 are left. 2011-11-03 Murray Cumming Small Business example: Add a little more data so the report is useful. * examples/example_smallbusiness.glom: Contacts: Add towns and countries. 2011-11-03 Murray Cumming Do not blank the data when showing the field definitions dialog. * glom/frame_glom.cc: do_menu_developer_fields(): Only blank the data view if using SQLite, which requires it, because it looks like a bug to the user. 2011-11-03 Murray Cumming Fix make check. * examples/example_smallbusiness.glom: Resaved with correctly-formatted image data now that libgda works again. * tests/test_selfhosting_new_then_image.cc: Comment out the SQLite test because it fails and we do not care so much about that. Still, I will investigate it. 2011-11-02 Murray Cumming Add and use utility functions for creating temporary files. * glom/libglom/utils.[h|cc]: Added get_temp_file_uri(), get_temp_file_path(), get_temp_directory_uri() and get_temp_directory_path(), using the correct awkward code that avoids overwriting existing files. * glom/application.cc: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/report_builder.cc: * glom/utility_widgets/imageglom.cc: * tests/import/utils.cc: * tests/test_document_autosave.cc: * tests/test_selfhosting_new_empty.cc: * tests/test_selfhosting_utils.cc: Use these functions instead of repeating the same stuff badly. * Makefile_tests.am: Link to libglom so the import tests can use the new utility functions. 2011-11-02 Murray Cumming Make connections to central PostgreSQL servers work again. * glom/libglom/connectionpool_backends/postgres_central.cc: Do not forget a previously-successful connection-but-not-to-the-database. 2011-11-01 Murray Cumming Added test for Glom::Priv getting of group and user names. * tests/test_selfhosting_new_then_get_privs.cc: Added a test of some Glom::Privs functions. * Makefile_tests.am: Mention the new test. 2011-11-01 Daniel Mustieles Updated Spanish translation 2011-10-31 Murray Cumming libglom: Remove an unused Utils::sqlbuilder_get_full_query() overload. * glom/libglom/utils.[h|cc]: Nothing uses the version that takes a string and parameters. 2011-10-31 Murray Cumming libglom: sqlbuilder_get_full_query(): Improve the result. * glom/libglom/utils.cc: Use the GdaConnection's statement_to_sql() instead of just GdaStatement's to_sql() so we a) have correct quoting, and b) use the server's specific SQL dialect. 2011-10-29 Murray Cumming Image fields test: Get and set a value and check that it is the same. * tests/test_image.glom: Added an image file to set and get in the database. * Makefile_tests.am: Disttribute the image file. * tests/test_selfhosting_new_then_image.cc: tests(): Read the data from the file, use it to set the data, and then read that data back. Correct the type check. However, the data equality test fails due to libgda bug #662922 . 2011-10-29 Murray Cumming libglom: Added build_sql_update_with_where_clause(). * glom/libglom/utils.[h|cc]: Added build_sql_update_with_where_clause(). * glom/base_db.cc: set_field_value_in_database(): use it here instead of manually creating a SqlBuilder. 2011-10-28 Murray Cumming Add a test for Image fields. * Makefile_tests.am: * tests/test_selfhosting_new_then_image.cc: Add a test to read an image field value, though this currently fails. I will later add a write-then-read test. 2011-10-28 Murray Cumming Fix make check by correcting the DTD. * glom/glom_document.dtd: Corrections relating to the print layout definitions. 2011-10-28 Murray Cumming Small Business Example: Make the report example more like the one in screenshots. * examples/example_smallbusiness.glom: 2011-10-28 Murray Cumming Updated screenshots for functionality that actually works. * C/figures/start.png: Replace with: * C/figures/start_create.png: * C/figures/start_open.png: and adapted: * docs/user-guide/C/glom.xml and * docs/user-guide/Makefile.am * docs/user-guide/C/figures/glom_design_fields_dialog_calculated.png * docs/user-guide/C/figures/glom_design_layout_details.png * docs/user-guide/C/figures/glom_design_layout_list.png * docs/user-guide/C/figures/glom_design_reports.png * docs/user-guide/C/figures/glom_design_reports_details.png * docs/user-guide/C/figures/glom_design_reports_group_by.png * docs/user-guide/C/figures/glom_design_reports_vertical_group.png * docs/user-guide/C/figures/glom_design_translations.png * docs/user-guide/C/figures/glom_import.png * docs/user-guide/C/figures/glom_tables.png: Updated 2011-10-28 Murray Cumming Minor codestyle changes. 2011-10-28 Murray Cumming Mention the GtkFrame bug in the code comment. 2011-10-28 Murray Cumming Mention the GTK+3 bug in the ChangeLog 2011-10-28 Murray Cumming More fixes for the Frame label issue. * glom/mode_data/box_data_list_related.cc: Only set or unset the Gtk::Frame label if it is or isn't there already, to avoid a warning. * glom/mode_data/box_data_portal.[h|cc]: Remove the unused implementation of one init_db_details() method, making it pure virtual instead. 2011-10-27 Murray Cumming Notebook: Avoid truncating related records buttons. * glom/mode_data/box_data_list_related.cc: Use Gtk::Frame::unset_label() instead of just hiding the frame's label, because that apparently leads to an incorrect allocation, causing the buttons to be cut in half horizontally at the bottom. I will investigate. 2011-10-27 Murray Cumming Mark version in ChangeLog 2011-10-27 Murray Cumming 1.19.16 2011-10-27 Murray Cumming Depend on libgda 5.0.0. * configure.ac: This version of libgda has fixes for: Bug #661655 - data doesn't display when a field is renamed to string with a hyphen. and Bug #661073 - SQL Errors when a relationship name has capital letters. 2011-10-27 Murray Cumming Remove GtkHandleBox from the .glade file too. * ui/developer/window_print_layout_edit.glade: * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Use a GtkBox instead of a GtkHandleBox. 2011-10-26 Murray Cumming Add and move #includes for the latest glibmm. * glom/import_csv/csv_parser.cc: * glom/import_csv/dialog_import_csv_progress.cc: * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/privs.cc: * glom/libglom/spawn_with_feedback.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/db_adddel/db_adddel.cc: * glom/mode_data/notebook_data.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: * glom/utility_widgets/dialog_image_load_progress.cc: * glom/utility_widgets/dialog_image_save_progress.cc: * glom/utils_ui.cc: * tests/import/utils.cc: Add individual glibmm includes now that gmmproc does not include glibmm.h from headers. Always include glibmm/thread.h first to avoid deprecation warnings. 2011-10-26 Murray Cumming Adapt to the latest goocanvasmm API. * glom/main.cc: Pass no arguments to init(), though I think I will add the method overload back to goocanvasmm to avoid annoying people too much. 2011-10-26 Murray Cumming Avoid deprecated Gtk::HandleBox with latest gtkmm. * glom/utility_widgets/sidebar.[h|cc]: Removed, because Gtk::HandleBox is deprecated. * Makefile_glom.am: Remove mention of this file. * glom/utility_widgets/layouttoolbar.[h|cc]: Derive directly from Gtk::ToolPalette instead. * glom/mode_design/print_layouts/print_layout_toolbar.[h|cc]: Adapt. * glom/mode_design/print_layouts/window_print_layout_edit.h: The glade file still has a GtkHandleBox which we should remove, but in the meantime just use it via Gtk::Box. 2011-10-25 Matej UrbanÄiÄ Updated Slovenian translation 2011-10-25 Murray Cumming Change #includes for the latest glibmm. Add individual includes instead of general giomm.h, glibmm.h or gtkmm.h includes. Among other things, this might let us avoid the annoying warning about deprecated GThread functions. 2011-10-25 Murray Cumming Added missing files. 2011-10-24 Mario Blättermann [l10n] Updated German translation 2011-10-24 Daniel Mustieles Updated Spanish translation 2011-10-24 Murray Cumming Main window: Use a smaller default size. * ui/operator/window_main.glade: Request a small enough size to fit small screens. This will then not warn during test_glade_derived_instantiation.cc. However, more space may be requested later. 2011-10-24 Murray Cumming Remove the unnused PlaceholderGlom class. * glom/mode_data/placeholder-glom.[h|cc]: Remove these files. * Makefile_glom.am: Remove mentions of these files. * glom/mode_data/flowtable_withfields.cc: Remove uses of PlaceholderGlom. 2011-10-24 Murray Cumming Do not include gtkmm.h, glibmm.h, giomm.h, or similar in headers. * Many files: Use more specific includes. 2011-10-24 Murray Cumming Remove the mention of window_progress.glade to fix make check. * POTFILES.in: Remove the mention of a file that no longer exists. 2011-10-24 Murray Cumming Progress InfoBar: Block user input during progress. * glom/application.cc: set_progress_message(): Set the main UI elements to insensitive(), because all our current uses of the progess message should block user input, like a modal dialog. * ui/operator/window_main.glade: Move the InfoBar out of the frame, because it should not have the border, and so we can make the frame insensitive without making the InfoBar insensitive. This required adding an extra intermediate GtkBox, because otherwise there is no way to add the menubar at the top, before the InfoBar. This .glade file needed some hand-editing to remove bad tags that glade (from git master) added. 2011-10-24 Murray Cumming Progress InfoBar: Block user input during progress. * glom/application.cc: set_progress_message(): Set the main UI elements to insensitive(), because all our current uses of the progess message should block user input, like a modal dialog. * ui/operator/window_main.glade: Move the InfoBar out of the frame, because it should not have the border, and so we can make the frame insensitive without making the InfoBar insensitive. 2011-10-24 Murray Cumming ShowProgressMessage: Move to its own source files. * Makefile_glom.am: * glom/application.[h|cc]: Move the ShowProgressMessage class to separate .h/.cc files because I generally prefer one .h/.cc per class. 2011-10-24 Murray Cumming ShowProgressMessage: Minor Cleanup. * glom/application.[h|cc]: Move implementation into .cc file. Correct the code style. Make the constructor explicit. 2011-10-24 David King Replace progress dialog with infobar, bug 661051 2011-10-23 Kjartan Maraas Updated Norwegian bokmÃ¥l translation 2011-10-21 Murray Cumming Avoid calling g_thread_init() if possible. * configure.ac: Add a comment about not linking to gthread-2.0 in future. * glom/libglom/init.cc: * tests/import/test_parsing.cc: * tests/import/test_signals.cc: Avoid calls to deprecated Glib::thread_init() if glib is new enough. This is a step to making Glom build against glibmm from git master with --enable-warnings=fatal. 2011-10-20 Murray Cumming Update a comment 2011-10-20 Murray Cumming libglom: Restore the Util::build_sql_select_count_row() API. * glom/libglom/db_utils.cc: move it back to: * glom/libglom/utils.[h|cc]: because it is needed by java-libglom. 2011-10-20 Murray Cumming Fix previous broken commit to fix the build. 2011-10-20 Murray Cumming Self-hosting tests: Test with sqlite too. * tests/test_selfhosting_utils.[h|cc]: test_create_and_selfhost(): Add a hosting_mode parameter so we can test sqlite too. Correct some return values and check that the directory really exists after it should have been created. * tests/test_selfhosting_new_empty.cc: * tests/test_selfhosting_new_from_example.cc: * tests/test_selfhosting_new_then_report.cc: * tests/test_selfhosting_sqlinjection.cc: Restructure so all tests are run twice - once for each backend. 2011-10-20 Murray Cumming SQLite: Avoid reporting failure when recreating databases. * glom/libglom/db_utils.[h|cc]: recreate_database_from_document(): Do not call add_standard_tables() and add_standard_groups() because create_database() (which we call) has already done this. query_execute_string(): Only -1 is an error, though that is odd. See libgda bug #662279 . 2011-10-20 Murray Cumming Improve some stderr output. 2011-10-20 Murray Cumming Replaced Utils::build_sql_select_count_row() with DbUtils::count_rows_returned_by(). * glom/libglom/utils.cc: * glom/base_db.[h|cc]: Moved count_rows_returned_by() to * glom/libglom/db_utils.[h|cc]: and also moved Utils::build_sql_select_count_row() making it static (not API). * glom/frame_glom.cc: * glom/mode_data/datawidget/treemodel_db.cc: Adapted. 2011-10-20 Jasper Lievisse Adriaanse Adjust previous to properly substitute $DL_LIB. 2011-10-19 Murray Cumming SQL Injection Test: Try to avoid quoting by giving a wrong field type. * tests/test_selfhosting_sqlinjection.cc: Try to avoid quoting by saying that a text field is a number but still providing a text value. 2011-10-19 Murray Cumming SQL Injection Test: Try to use (evil and unquoted) text for a number. * tests/test_selfhosting_sqlinjection.cc: This seems to be safe already. 2011-10-19 Murray Cumming SQL Injection Test: Try to use (evil and unquoted) text for a number. * tests/test_selfhosting_sqlinjection.cc: This seems to be safe already. 2011-10-19 Jasper Lievisse Adriaanse Check of libdl instead of unconditionally linking with it. https://bugzilla.gnome.org/show_bug.cgi?id=662143 2011-10-19 Murray Cumming 1.19.15 2011-10-19 Murray Cumming SQL Injection Test: Try both kinds of quote characters. * tests/test_selfhosting_sqlinjection.cc: Instead of assuming that we know what libgda uses. 2011-10-19 Murray Cumming Fix comment typo. 2011-10-19 Murray Cumming Self-hosting: Attempt to avoid failed shutdowns. * glom/libglom/connectionpool.cc: invalidate_connection(): Actually call Gda::Connection::close() instead of relying on the Connection destructor to do that, because maybe it is not closing it if maybe Connection::is_opened() is not working correctly. cleanup(): invalidate the connection before shutting down the server, not after, in case an open connection is stopping the server from closing down. * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: connect(): Remember the connection details so we can use them later to show debug output. Added show_active_connections() to try to get a clue about what is wrong when the shutdown fails, using those connection details. cleanup(): Call it when the shutdown fails. 2011-10-19 Murray Cumming Fix make check. * tests/test_selfhosting_new_from_example.cc: Add some missing !. 2011-10-19 Murray Cumming Do not pygoject_init() the wrong version. * glom/libglom/init.cc: Specify pygobject 3 instead of 2 when calling pygobject_init(). They are parallel-installable and incompatible and it is 3 that we depend on. This recently started failing during "make check", which it should. 2011-10-18 Murray Cumming 1.19.14 2011-10-18 Murray Cumming Add a simple SQL injection test. * tests/test_selfhosting_sqlinjection.cc: Attempt to do bad things that would be possible if our SQL values were not escaped properly in the SQL. (libgda takes care of this.) * Makefile_tests.am: Mention the new test. 2011-10-18 Murray Cumming Self hosting test: Check that other tables exist. * glom/libglom/document/document.[h|cc]: Added get_field_primary_key(), for use by: * tests/test_selfhosting_utils.[h|cc]: Added test_table_exists(). * tests/test_selfhosting_new_from_example.cc: Add quick checks that some other tables exist. 2011-10-18 Murray Cumming Test some query functions. * tests/test_selfhosting_utils.[h|cc]: Added test_model_expected_size(). * tests/test_selfhosting_new_from_example.cc: Test the quick find and the count query. 2011-10-18 Murray Cumming Avoid a compiler warning. * glom/libglom/data_structure/glomconversions.cc: format_time(): Return a result from the catch block. 2011-10-18 Murray Cumming Avoid some copy/pasting of code. * glom/mode_design/print_layouts/print_layout_toolbar_button.cc: * glom/utility_widgets/layouttoolbar.cc: * glom/utility_widgets/layouttoolbarbutton.cc: Moved get_icon_path() to: * glom/utils_ui.[h|cc] 2011-10-18 Murray Cumming Test report contents. * glom/libglom/xsl_utils.[h|cc]: transform(): Return the contents, not a filepath. * glom/libglom/report_builder.[h|cc]: report_build(): return the contents, not the path. Add report_build_and_save() to get a temporary filepath. * glom/mode_data/box_data_manyrecords.cc: * glom/frame_glom.cc: Adapted. * tests/test_selfhosting_new_then_report.cc: Check that some expected text is in the generated HTML. 2011-10-18 Murray Cumming Test report building. * tests/test_selfhosting_new_from_example.cc: Move most code into utility functions in: * tests/test_selfhosting_utils.[h|cc]: * tests/test_selfhosting_new_then_report.cc: Add a new test that also generates a HTML report. * Makefile_tests: Mention the new files. 2011-10-18 Murray Cumming Film Manager example: Change default table. * examples/example_film_manager.glom: Make the Scenes table appear first so people get a better idea of what this is about - managing production of a single film, not managing a collection of films. 2011-10-18 Murray Cumming Add a test for the locale problem and for a missing translated date format. * tests/test_glom_date_in_locales.sh: A new test that sets LANG and then tries to start glom with it's date-checking option, to see if any fail. However, this is not run during "make check", or even distributed, because it depends on you having the locales installed and configured. 2011-10-18 Murray Cumming Correct the date format in the en_CA locale. * en_CA.po: Added a translation for the date format, because the default does not show 4-digit years. This avoids the warning at startup, which asks the translator to deal with it. Note that I used YYYY/MM/DD instead of DD/MM/YYY, because a) It is apparrently the official format for Canada, though the other one is still common, and b) date parsing failed with DD/MM/YY in this locale. 2011-10-18 Murray Cumming Add try/catch around all uses of std::locale(""). * glom/libglom/data_structure/glomconversions.cc: Add try/catch with a warning whenever we use std::locale(""), which means the current locale, because that can throw an exception if the locale is not properly configure. * glom/main.cc: Mention that a non-installed or not-properly-configured locale could be the cause of the problem. However, I would like to know exactly what it means for a locale to be properly configured. 2011-10-18 Murray Cumming Fix typo in previous commit 2011-10-18 Murray Cumming Command line: Correct some exit results. * glom/main.cc: Use EXIT_FAILURE and EXIT_SUCCESS instead of 0 and -1, and use the correct ones. 2011-10-18 Murray Cumming libglom: FieldFomatting: Correct some parameter names. * glom/libglom/data_structure/layout/fieldformatting.h: get_choices_related() Rename relationship_name to relatioship. It was already correct in the .cc file. 2011-10-18 Murray Cumming Correct the pkg-config file. * glom/libglom/glom.pc.in: Depend on libgdamm-5.0, not ligdamm-4.0. And depend on libxslt, because we just moved the xslt stuff into libglom. 2011-10-17 Mario Blättermann [l10n] Updated German translation 2011-10-17 Murray Cumming Move ReportBuilder to libglom, to make testing easier. * glom/report_builder.[h|cc]: * glom/xsl_utils.[h|cc]: Moved to: * glom/libglom/report_builder.[h|cc]: * glom/libglom/xsl_utils.[h|cc]: * Makefile_glom.am, Makefile_libglom.am: Adapted, also adding a -D define for libglom to access the xslt file, though I am not happy about a library needing a file to be installed. 2011-10-17 Murray Cumming ReportBuilder: Do not depend on Base_DB unnecessarily. * glom/report_builder.[h|cc]: Just add get/set_document() instead. 2011-10-17 Murray Cumming Move report building code around. * glom/report_builder.[h|cc]: report_build(): Return the filepath, instead of opening it in the browser. * glom/xsl_utils[h|cc]: transform_and_open(): Rename to transform(), returning the filepath. Also correct some ustring filepath to std::string. * glom/utils_ui[h|cc]: Added show_report_in_browser(). * glom/frame_glom.cc: on_menu_report_selected(): * glom/mode_data/box_data_manyrecords.cc: print_layout: Adapted. 2011-10-17 Murray Cumming Move some XSLT-processing code around. * glom/mode_data/box_data.h: Remove declaration of non-implemented and unused xslt_process() method. * glom/xsl_utils.[h|cc]: Move xslt_process() in to the .cc file as a static function. 2011-10-17 Murray Cumming Move some Report code around. * glom/mode_data/box_data_manyrecords.cc: print_layout(): Move the report creation to ReportBuilder. * glom/report_builder.[h|cc]: Added create_standard_list_report(). * glom/xsl_utils.cc: Do not output all the XSL and HTML to std::cout, but do output the temporary file name of the generated HTML file. 2011-10-17 Murray Cumming XSLT file: Minor fixes. * xslt/print_report_to_html.xsl: Change xsl::version to version, which is apparently more correct. Specify the encoding as UTF-8. 2011-10-17 Murray Cumming Tests: Add general XML validity of XSLT files. * tests/test_xslt_file_validation.sh: New test, based on the other ones. * Makefile_tests.am: Mention the new test. 2011-10-17 Murray Cumming Remove an unused XSL file. * xslt/print_details_to_html.xsl: Remove this because it is no longer used. * Makefile.am: Remove mention of it. 2011-10-17 Murray Cumming List View: Correct the default column widths. * glom/utils_ui.[h|cc]: get_suitable_field_width_for_widget(): Added a for_treeview parameter and adjust the width accordingly. * glom/mode_data/db_adddel/db_adddel.cc: treeview_append_colum(): Replace the overly-generic division-by-3 hack with the new parameter, and add some hard-coded extra space. 2011-10-17 Murray Cumming Examples: Remove all column_width attributes now that defaults are good. * examples/example_film_manager.glom: * examples/example_lesson_planner.glom: * examples/example_music_collection.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: * examples/sqlite/test_sqlite_music/test_sqlite_music.glom: * examples/tests/example_field_formatting_test.glom: * ldtp/database-templates/PostgresCentral/Test.glom: * ldtp/database-templates/SQLite/Test.glom: A simple regexxer replace. 2011-10-17 Matej UrbanÄiÄ Updated Slovenian translation 2011-10-17 Murray Cumming List View: Correct the default column widths. * glom/utils_ui.[h|cc]: get_suitable_field_width_for_widget(): Added a for_treeview parameter and adjust the width accordingly. * glom/mode_data/db_adddel/db_adddel.cc: treeview_append_colum(): Replace the overly-generic division-by-3 hack with the new parameter, and add some hard-coded extra space. 2011-10-17 Murray Cumming Details: Avoid an outdent after group titles * glom/mode_data/flowtablewithfields.cc: add_layout_group(): Work around the GtkFrame bug #644199 2011-10-17 Murray Cumming 1.19.13 2011-10-17 Murray Cumming Print Layout: Print Standard: Avoid page break spaces in the middle of pages. * glom/print_layout/canvas_print_layout.[h|cc]: fill_with_data(): Add an avoid_page_margins parameter, so we can choose to always move items past the margins on to the next page while setting their data. * glom/print_layout/print_layout_utils.[h|cc]: create_standard(): Add an avoid_page_margins parameter, so we can choose to do this later instead when setting the data, to avoid big gaps that are later moved down into the middle of the page. do_print_layout(): Add an avoid_page_margins parameter here too, passing it to fill_with_data(). * glom/mode_data/box_data_details.cc: print_layout(): Do not avoid page margins when creating, because that will happen when expanding items. Avoid the page margins when setting the details. * glom/mode_design/print_layouts/window_print_layout_edit.cc: on_menu_insert_create_standard(): Avoid page margins when creating. However, those gaps could be left in the middle of the page when printing, because some items may be expanded. We need a way to squash that space later when it is unecessary. 2011-10-16 Jasper Lievisse Adriaanse Hide another __libc_freeres on systems which don't have glibc. https://bugzilla.gnome.org/show_bug.cgi?id=660496 2011-10-15 Murray Cumming Fix some ChangeLog formatting 2011-10-14 Murray Cumming Fix DTD to fix make check. * glom/glom_document.dtd: Mention several attributes that were added in the last year or so. The new examples/test/ uses them. 2011-10-14 Murray Cumming Tests: Fix cast error when using dlerror(). * tests/python/test_load_python_library.cc: Noticed on OpenBSD in bug #660495 (Jasper Lievisse Adriaanse). I don't know why this worked on Linux. 2011-10-14 Murray Cumming Examples: Remove other uses of pygtk. * examples/example_lesson_planner.glom: Remove an old button script from the XML though it was not used anymore in the UI. * examples/example_project_manager.glom: Contacts: Remove the Test button. It is in the small business example already instead. 2011-10-14 Murray Cumming Small Business Example: Port pygtk code to PyGObject+Introspection. * examples/example_smallbusiness.glom: This fixes this crash, which apparently happens when trying to use pygtk when pygobject-3 is already loaded: Warning: specified class size for type `PyGtkGenericCellRenderer' is smaller than the parenttype's `GtkCellRenderer' class size Bug #661766 (André Klapper) 2011-10-14 Murray Cumming List: Actually show custom choices, instead of crashing. * glom/mode_data/datawidget/cellcreation.cc: create_cell(): Call set_choices_fixed() if appropriate. * glom/mode_data/datawidget/cellrenderer_dblist.cc: on_editing_started(): Replace a g_assert with a warning to std::cerr, in case this happens again, particularly now that we know when it can happen - if there is no text-column set. Bug #661764 (André Klapper) 2011-10-14 Murray Cumming Print Layout: Avoid grouping items at the tops of pages. * glom/print_layout/print_layout_utils.[h|cc]: move_fully_to_page(): Change this to needs_move_fully_to_page(), so we can decide later how much to move the items. * glom/print_layout/canvas_print_layout.[h|cc]: move_items_below_item(): Rename to move_items_down(), not taking an item, and ignoring the x dimension, moving everything down. Remember the highest item that needs moving down more, because it is in a page margin, then move everything below it down by the same offset. Keep doing that until no items are in margins, gradually adding pages. This is a simple form of pagination, and not a particularly efficient one. 2011-10-14 Daniel Mustieles Updated Spanish translation 2011-10-14 Murray Cumming Print Layout: Another expansion fixes. * glom/print_layout/print_layout_utils.[h|cc]: move_fully_to_page(): Move generic CanvasItemMovables instead of just CanvasLayoutItems. * glom/print_layout/canvas_print_layout.cc: move_items_below_item(): Likewise. 2011-10-14 Murray Cumming Print Layout: Increase page count correctly when expanding portals. * glom/print_layout/canvas_print_layout.cc: move_items_below_item(): Correct an off-by-one error in the calculation of the number of pages needed. 2011-10-14 Murray Cumming Print Layout: Create standard: Use the multiline text formatting. * glom/print_layout/print_layout_utils.cc: create_standard(): Make text fields multiline if they are multiline on the details layout. 2011-10-14 Murray Cumming Print Layout: Small improvement. * glom/print_layout/canvas_print_layout.cc: move_items_below_item(): Check that we don't move the item itself. 2011-10-13 Murray Cumming minor fix of minor fix 2011-10-13 Murray Cumming Minor fix 2011-10-13 Murray Cumming Print Layout: Code improvement. * glom/print_layout/print_layout_utils.[h|cc]: Remove the hacky get_units() function. 2011-10-13 Murray Cumming Print Layout: Create Standard: Move items to the next page when necessary. * glom/libglom/data_structure/layout/layoutitem.[h|cc]: Add set_print_layout_position_y() for convenience. * glom/print_layout/print_layout_utils.cc: create_standard(): Use move_fully_to_page(). 2011-10-13 Murray Cumming Print Layout: Moved some code around. * glom/print_layout/canvas_print_layout.[h|cc]: Moved get_page_for_y() and move_fully_to_page() to: * glom/print_layout/print_layout_utils.[h|cc]: 2011-10-13 Murray Cumming PrintLayout: Standard: Do not move to next page unnecessary. * glom/print_layout/canvas_print_layout.cc: get_page_for_y(): Correct this calculation. 2011-10-13 Murray Cumming About dialog: Show the version number. * glom/application.cc: Use set_version(). 2011-10-13 Murray Cumming Deleting tables: Remove all auto-increment rows. * glom/navigation/box_tables.cc: Remove the autoincrement rows for all autoincrement fields. 2011-10-13 Murray Cumming Deleting tables: Remove the auto-increment too. * glom/libglom/db_utils.[h|cc]: Added remove_auto_increment(). * glom/navigation/box_tables.cc: on_adddel_Delete(): Remove the primary key's autoincrement too. Bug #661653 2011-10-13 Murray Cumming DbUtils: Add some parameter checks to the autoincrement methods. * glom/libglom/db_utils.cc: Otherwise we risk having an empty where clause, and doing unwanted things to the entire table. 2011-10-13 Murray Cumming DbUtils: Avoid some repeated code. * glom/libglom/db_utils.cc: Add a utility function for adding the where clause for the auto-increments table. 2011-10-13 Murray Cumming whitespace change 2011-10-13 Murray Cumming Use Glib::ustring::compose() instead of concatenation for translatable strings. * glom/bakery/dialog_offersave.cc: * glom/import_csv/dialog_import_csv.cc: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/mode_design/layout/combobox_relationship.cc: * glom/mode_design/layout/dialog_layout_details.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc: * glom/navigation/box_tables.cc: * glom/utils_ui.cc: Let translators arrange built strings. 2011-10-13 Ben Konrath Add example document to test field formatting. * examples/tests/example_field_formatting_test.glom: New file. 2011-10-13 Murray Cumming Print/Standard: Do print, not preview. * glom/mode_data/box_data_details.cc: This is now the same as when printing a non-standard print layout. 2011-10-13 Murray Cumming Replace Gtk::Table with Gtk::Grid in the source code. * glom/mode_design/fields/dialog_fielddefinition.h: Use the table (from the .glade file) via Gtk::Widget*. * ui/developer/window_print_layout_edit.glade: Replace the GtkTable with a GtkGrid. * glom/mode_design/print_layouts/window_print_layout_edit.cc: Adapt. There are still GtkTables in the other .glade files, but this at least lets us build with gtkmm 3.3/3.4 even with --enable-warnings=fatal. 2011-10-12 Murray Cumming Print Layout: Avoid some code duplication. * glom/print_layout/print_layout_utils.[h|cc]: moved get_page_height() from CanvasPrintLayout to here. And actually get the margins. * glom/print_layout/canvas_print_layout.cc: get_page_y_start_and_end(): Use it here. get_page_height(): Forward to the PrintLayoutUtils versions, passing the extra parameters. 2011-10-12 Murray Cumming Print Layout: Move items to next page when expanding portals. * glom/print_layout/canvas_print_layout.[h|cc]: move_items_below_item(): Use a new move_fully_to_page() method to make sure that items are never in the margins if that is possible, when expanding related records portals for real data. Also add extra pages when necessary. 2011-10-12 Murray Cumming Print Layout: Related Records: Move others down when expanding. * glom/print_layout/canvas_layout_item.[h|cc]: Added move_items_below_item(). * glom/print_layout/canvas_print_layout.[h|cc]: fill_with_data_portal(): move other items lower when changing the size of the portal's table. 2011-10-12 Murray Cumming Print Layout: Related Records: Expand according to min/max rows count. * glom/print_layout/canvas_layout_item.[h|cc]: Moved get_canvas_table_cell_child() here from CanvasPrintLayout. create_canvas_item_for_layout_item(): Move the table-child creation code into add_portal_rows_if_necessary(). * glom/print_layout/canvas_print_layout.[h|cc]: fill_with_data_portal(): Add rows, up to the maximum, according to the number of database rows. * glom/print_layout/print_layout_utils.cc: create_standard(): Set a simple default height for one row, but set a min of 1 and a max of 100 so it will expand later. 2011-10-11 Murray Cumming Const correction 2011-10-11 Murray Cumming Update the example files for the portal rows count change. * examples/example_film_manager.glom: * examples/example_music_collection.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: Adapt to new document structure. 2011-10-11 Murray Cumming Related Records Portals: Change rows count to min and max counts. * glom/glom_document.dtd: Adapted. * glom/libglom/data_structure/layout/layoutitem_portal.[h|cc]: set_rows_count(): Return a min and max, and change it from double to gulong. * glom/libglom/document/document.cc: load_after(), save_before(): Store it in the document. The old XML attribute was new in Glom 1.19 anyway, so we can change it. * ui/developer/window_data_layout.glade: Add an extra SpinButton, adjust the labels, and add explanatory tooltips. * glom/mode_design/layout/dialog_layout_details.[h|cc]: Adapted. * glom/mode_data/db_adddel/db_adddel.[h|cc]: set_height_rows(): Take the min and max. construct_specified_column(): Increase the size if appropriate when there are more database rows to show. * glom/mode_design/layout/dialog_layout_list_related.cc: * glom/print_layout/print_layout_utils.cc: * glom/libglom/db_utils.cc: * glom/mode_data/box_data_list_related.cc: Adapted. 2011-10-11 Murray Cumming Print Layout: Create Standard: Use the full page width. * glom/print_layout/print_layout_utils.cc: Instead of hard-coding the width. However, the field title widths are still hard-coded. 2011-10-11 Murray Cumming Small fixes to Film Manager example. * examples/example_film_manager.glom: Remove the unused (and hiddent) Teams table. Contacts: Remove the unnecessary groups around the related records portals in the notebook. 2011-10-11 Murray Cumming Tiny improvement 2011-10-11 Murray Cumming CanvasPrintLayout: Wipe empty rows when filling with data. * glom/print_layout/canvas_print_layout.cc: fill_with_data_portal(): Otherwise, the field names appear on the printout, left over from the default non-data preview. 2011-10-11 Murray Cumming TranslatableItem: Make get_title() virtual. * glom/libglom/data_structure/translatable_item.h: Make get_title() virtual, like get_title_or_name() already is, so we can make get_title() useful generically via the base class. * glom/libglom/data_structure/layout/layoutitem_field.[h|cc]: * glom/libglom/data_structure/layout/layoutitem_portal.[h|cc]: * glom/libglom/data_structure/layout/report_parts/layoutitem_fields ummary.[h|cc]: Add get_title() overrides. * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_list_related.cc: * glom/print_layout/print_layout_utils.cc: Use get_title() instead of get_title_or_name(), to avoid showing names of intentionally title-less groups and notebooks. 2011-10-11 Murray Cumming LayoutItem_Portal: Make get_title_or_name() useful. * glom/libglom/data_structure/layout/layoutitem_portal.[h|cc]: Add an override for get_title_or_nam(), so that callers do not need to special-case portals compared to other groups. * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_portal.cc: * glom/mode_data/flowtablewithfields.cc: * glom/print_layout/print_layout_utils.cc: Use get_title_or_name() instead of more complicated code. 2011-10-11 Murray Cumming Print Layout: Standard: Handle related records portals too. * glom/print_layout/print_layout_utils.cc: create_standard(): If the group is a portal, just add that portal item, setting appropriate sizes. 2011-10-11 Murray Cumming Simplify OptionEntry code. * glom/glom_create_from_example.cc: * glom/main.cc: Reuse one OptionEntry instance. 2011-10-11 Murray Cumming Fix typo 2011-10-10 Murray Cumming Updated a TODO 2011-10-10 Murray Cumming Cope with Gnome::Gda::DataModelIter::get_value_at() throwing. * glom/libglom/connectionpool_backends/postgres.cc: Add a catch/try around get_value_at(), because the latest version of libgdamm can throw an exception there. 2011-10-10 Murray Cumming Corrected ChangeLog 2011-10-10 Murray Cumming Added some consts 2011-10-10 Murray Cumming Use gdk_window_get_device_position() instead of gdk_window_get_pointer(). * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/buttonglom.cc: * glom/mode_data/datawidget/checkbutton.cc: * glom/mode_data/datawidget/combo.cc: * glom/mode_data/datawidget/combo_as_radio_buttons.cc: * glom/mode_data/datawidget/datawidget.cc: * glom/mode_data/datawidget/entry.cc: * glom/mode_data/datawidget/label.cc: * glom/mode_data/datawidget/textview.cc: * glom/mode_data/db_adddel/db_adddel.cc: * glom/mode_data/flowtablewithfields.cc: * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/notebooklabelglom.cc: A fairly simple search/replace. 2011-10-10 Murray Cumming 1.19.12 2011-10-10 Murray Cumming Really use the goocanvasmm RGBA properties. * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_line.cc: Use Gtk::ColorButton::get_rgba() instead of get_color. * glom/mode_design/layout/dialog_layout_list_related.[h|cc]: Do not save color details if they are not shown in the UI. 2011-10-10 Murray Cumming Require the latest goocanvasmm. * configure.ac: Require goocanvasmm 1.90.6 because of the new RGBA properties. 2011-10-10 Murray Cumming glom_create_from_example: --help: Add a hint about when self-hosting is used. * glom/glom_create_from_example.cc: Add some text to the --server-hostname option. 2011-10-10 Murray Cumming glom_create_from_example: Support central-hosting too. * glom/glom_create_from_example.cc: Allow a host name, port, and username to be specified, and the password to be entered on stdin. * glom/libglom/db_utils.[h|cc]: Added get_unused_database_name(): * glom/frame_glom.cc: Added a TODO that we should use it here too instead of the similar code that is mixed up with the dialog code. * glom/libglom/connectionpool.h: Remove unused m_host member variable. 2011-10-10 Murray Cumming Fix POTFILES.in 2011-10-10 Murray Cumming Test: Catch an exception. 2011-10-10 Murray Cumming Added the glom_create_from_example command-line utility. * Makefile_libglom.am: * glom/glom_create_from_example.cc: This command-line utility takes an example .glom file, outputs a new non-example .glom file and puts the example data, if any, in the database. Right now, it assumes that you want self-hosting, so it creates the database files locally. This builds when libglom builds. It does not require the glom application. 2011-10-10 Murray Cumming Added Utils::get_file_*_without_extension(). * glom/application.[h|cc]: Moved get_file_uri_without_extension() to * glom/libglom/utils.[h|cc]: And added get_file_path_without_extension(). 2011-10-09 Murray Cumming Fix make check with --enable-warnings=fatal. * glom/utility_widgets/eggspreadtablemm/test_spreadtablednd.cc: drop_possible handlers: Adapt to the new meanin of the return type. 2011-10-09 Murray Cumming Fix the build with --enable-warnings=fatal. * glom/utility_widgets/eggspreadtablemm/eggspreadtabledndmm.cc: Signal callbacks: Actually use drop_possible. 2011-10-09 Daniel Mustieles Updated Spanish translation 2011-10-08 Marek ÄŒernocký Updated Czech translation 2011-10-07 Murray Cumming Fields: Adapt choices fields when changing field names. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: Added change_field_item_name(). * glom/libglom/data_structure/layout/layoutgroup.cc: change_field_item_name(): Change the formatting too, by calling the new method. * glom/libglom/document/document.cc: change_field_name(): Change the default formatting of fields too. Bug #661075 2011-10-06 Mario Blättermann [l10n] Updated German translation 2011-10-06 Murray Cumming Print Layout: Really print additional pages. * glom/print_layout/printoperation_printlayout.cc: on_draw_page(): Use Cairo::Context::translate() before calling Goocanvas::Canvas::render(). Bug #660553 (Thanks to David King and Damon Chaplin) 2011-10-06 Murray Cumming Document: Avoid writing some unnecessary XML nodes. * glom/libglom/document/document.cc: : Do not write the choices_related_show_all attribute if there are no choices. Do not write numeric formatting attributes if the field type is not numeric. * examples/example_film_manager.glom: Resaved. 2011-10-06 Murray Cumming Fix DTD validation. * glom/glom_document.dtd: Change the order of some sub-nodes. Apparently we must specify a sequence, even though we do not really care. * glom/libglom/document/document.cc: load_before(), save_after(): do not save some irrelevant details for calendard portals. Portals assume that no rows count means the default of 6, to make the files less verbose. * examples/example_film_manager.glom: * examples/example_lesson_planner.glom: * examples/sqlite/test_sqlite_music/test_sqlite_music.glom: Resaved/Fixed. 2011-10-06 Matej UrbanÄiÄ Updated Slovenian translation 2011-10-06 Murray Cumming Examples: Details layout: Remove unnecessary "main" groups. * examples/example_lesson_planner.glom: * examples/example_music_collection.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: Move overview and details to top, instead of in a top-level group. * examples/example_film_manager.glom: Remove unnecessary Details titles. These look silly when the first item is a group with its own title. 2011-10-06 Murray Cumming Film Manager example: Scenes: Make the Props and Costume tabs work. * examples/example_film_manager.glom: The relevant tables and relationships did not exist. Also remove all main top-level groups. 2011-10-06 Murray Cumming TreeModelDb: fill_values_if_necessary(): Avoid a crash. * glom/mode_data/datawidget/treemodel_db.cc: Do not try to use a null GdaDataModel, which can happen if a SQL query fails. 2011-10-06 Murray Cumming Document: get_data_layout_groups_default(): Simplify the default structure. * glom/libglom/document/document.cc: Do not create the useless main top-level group for details layouts. 2011-10-06 Ben Konrath Fix small bugs in commented-out debugging print statements. https://bugzilla.gnome.org/show_bug.cgi?id=661009 * glom/libglom/db_utils.cc: Change field to layout_item. Move print statement to be after the assignment to field_used_in_relationship_to_one. 2011-10-06 Murray Cumming Details: Do not enable drag-and-drop by default. * glom/utility_widgets/flowtable.cc: Turn of drag-and-drop by default in the EggSpreadTableDnd * glom/mode_data/flowtablewithfields.[h|cc]: Added set_enable_drag_and_drop(). * glom/mode_data/box_data_details.[h|cc]: Added set_enable_drag_and_drop(), calling the FlowTableWithFields. glom/application.[h|cc]: Rename the Show Layout Toolbar menu item to Drag and Drop Layout, though that is a bad name and I would like a better one. * glom/frame_glom.[h|cc]: show_layout_toolbar(): Rename to set_enable_layout_drag_and_drop(). * glom/mode_data/notebook_data.[h|cc]: Rename show_layout_toolbar() to set_enable_layout_drag_and_drop() and make it enable dnd as well as showing the toolpallette. The toolpalette is then a visual indication that drag-and-drop is possible. * glom/mode_data/test_flowtablewithfields.cc: Add a sub-group and enable drag and drop. 2011-10-06 Murray Cumming Update EggSpreadTable tests. * glom/utility_widgets/eggspreadtablemm/test_spreadtablednd.cc: Fix a crash. * glom/utility_widgets/test_flowtable.cc: * glom/utility_widgets/test_flowtable_dnd.cc: Adapt to the changed API. 2011-10-06 Murray Cumming Update EggSpreadTable * glom/utility_widgets/eggspreadtable/: Update from libegg with Tristan's changes. * glom/utility_widgets/eggspreadtablemm/: Adapt. 2011-10-04 Murray Cumming Added missing files 2011-10-04 Murray Cumming TODO comment 2011-10-04 Murray Cumming Move do_print_layout() to PrintLayoutUtils. * glom/application.[h|cc]: Remove the new print_layout(PrintLayout) override. * glom/frame_glom.[h|cc]: * glom/mode_data/box_data_details.cc: Adapted, using PrintLayoutUtils::do_print_layout() instead. 2011-10-04 Marek ÄŒernocký Updated Czech translation 2011-10-04 Murray Cumming PrintOperation_PrintLayout: Move to print_layout/: * Makefile_glom.am: Mention the changed paths. * glom/frame_glom.cc: Adapted. 2011-10-04 Murray Cumming PrintLayoutUtils: Move to print_layout/ * Makefile_glom.am: Mention the changed paths. * glom/mode_data/box_data_details.cc: * glom/mode_design/print_layouts/window_print_layout_edit.cc: Adapted. 2011-10-04 Murray Cumming Details: Print: Use a standard print layout instead of HTML. * glom/frame_glom.[h|cc]: Add a do_print_layout() that takes a PrintLayout instead of just a print layout name. * glom/application.[h|cc]: Add a do_print_layout() that forwards to Frame_Glom. * glom/mode_data/box_data_details.[h|cc]: print_layout(): Instead of generating HTML and showing it in a browser, create a standard print layout and offer it via a normal printing dialog. This is at least as good (not very good yet) as our generated HTML, but simpler and more normal. Remove any code that used the old XML+XSLT=HTML way for details. We still use the generated HTML for the list view, as if it was just another report. Maybe we can improve that in future too. 2011-10-04 Murray Cumming Fix typo 2011-10-04 Murray Cumming Print Layout: Move create_standard() into a utils file. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Move create_standard to * glom/print_layout_utils.[h|cc] so we can use it elsewhere too. 2011-10-02 Murray Cumming Find: Get criteria even when a field is on the layout twice. * glom/mode_data/flowtablewithfields.cc: get_field_value(): Look at all the widgets for this field, instead of just the first one, and keep looking until we find a non-empty value. This is still rather arbitrary, but this method is only used for find criteria, or should be. 2011-10-02 Murray Cumming Find Mode: Do not show data in related records. * glom/mode_data/box_data_portal.[h|cc]: Add a virtual set_find_mode(). * glom/mode_data/box_data_list_related.h: Add a set_find_mode() override here which calls it on the DbAddDel. * glom/mode_data/db_adddel/db_adddel.h: Document the existing set_find_mode() more. * glom/mode_data/flowtablewithfields.[h|cc]: Add set_find_mode(), which calls it on all child portals and flowtables and calls it later when creating them. * glom/mode_find/box_data_details_find.cc: Call set_find_mode() on the FlowTable. This also affects the Find button next to ID fields. 2011-10-02 Mario Blättermann [l10n] Updated German translation 2011-10-01 Daniel Mustieles Updated Spanish translation 2011-09-30 Murray Cumming Print Layout: Create Standard Layout: Support multiple pages. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: create_standard(): Support multiple pages, trying to keep out of the margins. * glom/print_layout/canvas_print_layout.cc: add_layout_group_children(): Do not add canvas items that were not able to handle the layout item, such as buttons. 2011-09-30 Murray Cumming Fix the DTD. * glom/glom_document.dtd: Fix my typo to fix make check. 2011-09-30 Matej UrbanÄiÄ Updated Slovenian translation 2011-09-30 Murray Cumming Print Layout: Allow multiple pages. * glom/libglom/data_structure/print_layout.[h|cc]: Add get/set_page_count(). * glom/libglom/document/document.cc: load_after(), save_before(): Store the page count in the document. * glom/glom_document.dtd: Mention the new attribute. * glom/print_layout/canvas_print_layout.[h|cc]: Add get/set_page_count() and get_page_bounds(). update_page_bounds(): Move the margin creation into here, and create margins for all pages. * glom/utility_widgets/canvas/canvas_group_grid.[h|cc]: Added update_grid_for_new_size(). * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Add Add Page and Delete Page menu items, though we need to rearrange the menus more sensibly. * glom/printoperation_printlayout.cc: on_begin_print(), on_paginate(): Set the number of pages. on_draw(): Render only the specified page's bounds from the GooCanvas. However, this is not working for any page but the first one. Some cairo transformation might be necessary. 2011-09-30 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2011-09-30 Murray Cumming Instantiation test: warn if the widget is too big for small screens. * tests/test_glade_derived_instantiation.cc: Actually show the window (Is there a way to get the size without showing it) and warn if it is too big, but do not fail yet. Note that this is very dependent on the theme in use, though maybe we can set that at runtime for the test. 2011-09-30 Murray Cumming Field Formatting window: Make it slightly less tall. * ui/developer/dialog_layout_field_properties.glade: Arrange two radio buttons horizontally instead of vertically. But this window is still too tall. See https://bugs.launchpad.net/ubuntu/+source/glom/+bug/863016 2011-09-29 Jasper Lievisse Adriaanse Hide __libc_freeres on system which don't have glibc. https://bugzilla.gnome.org/show_bug.cgi?id=660496 2011-09-29 Murray Cumming Print Layout: Add experimental Create Standard feature. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Add an Insert/Create Standard Layout menu item which creates a layout similar to the details layout. 2011-09-29 Murray Cumming Dialog_Choose_ID: Work around a crash in GTK+. * glom/mode_data/datawidget/dialog_choose_id.cc: Remove the Box_Data_List from the parent container (we added it earlier), to avoid a crash, though it would be good to fix that properly and generically. Bug #660347 2011-09-29 Murray Cumming build_simple_where_expression(): Check input parameters. * glom/libglom/utils.cc: build_simple_where_expression(): Check for an empty key field, which can happen during debugging. 2011-09-29 Murray Cumming Glade utils: Catch generic exceptions. * glom/glade_utils.h: Though this only happens when gtkmm has not been initialized. 2011-09-28 Murray Cumming Related Records: Fix bug with a blank row when there is only one row. * glom/libglom/connectionpool.[h|cc]: Added get_backend_supports_cursor(). * glom/mode_data/datawidget/treemodel_db.cc: refresh_from_database(): Call that method, so we can avoid using GdaDataAccessWrapper unless necessary. That avoids an apparent bug with GdaDataAccessWrapper returned a row of all-nulls if there is only one row. See libgda bug #660344 . This is probably a performance improvement anyway. 2011-09-27 Marek ÄŒernocký Updated Czech translation 2011-09-27 Murray Cumming Require the latest gtkmm. * configure.ac: Require gtkmm 3.2.0 to keep things simple. 2011-09-27 Murray Cumming libglom::LayoutItem_Portal: Added get_suitable_table_to_view_details(). * glom/base_db.[h|cc]: Move the get_portal_navigation_relationship_automatic() and get_suitable_table_to_view_details() utility functions to: * glom/libglom/data_structure/layout/layoutitem_portal.[h|cc]: Also move other privately-used utility functions here too, from Base_DB. * glom/mode_design/layout/dialog_layout_calendar_related.cc: update_ui(): * glom/mode_design/layout/dialog_layout_list_related.cc: update_ui(): * glom/mode_data/box_data_portal.cc: get_has_suitable_record_to_view_details(), get_has_suitable_record_to_view_details(): Adapted. 2011-09-27 Murray Cumming libglom::layout_field_should_have_navigation(): Return Relationship not bool. * glom/libglom/db_utils.[h|cc]: layout_field_should_have_navigation(): Make field_used_in_relationship_to_one() be a Relationship so it can be used for actual navigation. Also require that the LayoutItem_Field has full field information, instead of updating it, so that it can be const. * glom/mode_data/datawidget/datawidget.cc: Constructor: Adapted. * glom/mode_data/box_data_details.cc: on_flowtable_field_open_details_requested(): Use it here instead of the copy/pasted code. 2011-09-27 Murray Cumming Add libglom::layout_field_should_have_navigation(). * glom/mode_data/datawidget/datawidget.cc: Constructor: Moved decision code from here to here: * glom/libglom/db_utils.[h|cc]: Added layout_field_should_have_navigation(). 2011-09-26 Murray Cumming Document: Use CSS3 formatting for colors, via Gdk::RGBA. * glom/mode_design/layout/dialog_layout_list_related.cc: * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_line.cc: * glom/utility_widgets/canvas/canvas_line_movable.[h|cc]: Use Gdk::RGBA instead of Gdk::RGBA everywhere now that goocanvas(mm) supports it. 2011-09-26 Matej UrbanÄiÄ Updated Slovenian translation 2011-09-26 Murray Cumming Fixed the ChangeLog 2011-09-26 Murray Cumming Related Records: Do not try to navigate to an empty record. * glom/mode_data/box_data_list_related.cc: on_adddel_user_requested_edit(): Ignore clicks on the open button of the empty placeholder row, whose primary key is null. 2011-09-22 Murray Cumming Print Layout: Add an Align menu. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Add menu items for align top, bottom, left, and right. I don't much like the copy/pasteness of the code, but it works. 2011-09-22 Murray Cumming Layout window: Correct the vertical order of Add buttons. * ui/developer/window_data_layout.glade: This has been mixed up since some time recently, probably due to Glade changes. 2011-09-21 Murray Cumming Print Layout: Show contents of System Preferences in Fields. * glom/base_db.cc: get_field_value_in_database(): Only complain about a missing key if the relationship needs one. * glom/libglom/document/document.cc: * glom/print_layout/canvas_layout_item.cc: set_db_data(): Show an empty image if there is no pixbuf. * glom/print_layout/canvas_print_layout.[h|cc]: Added fill_with_data_system_preferences() to show details from the system preferences, if appropriate. This is possible because we do not need a specific record to show values from the one record in System Preferences. add_canvas_layout_item(), on_context_menu_edit(): Call it. 2011-09-21 Murray Cumming Details: Avoid warning when using System Preferences fields. * glom/libglom/document/document.cc: get_field_used_in_relationship_to_one(): Do not complain when the system preferences table is not found. 2011-09-21 Murray Cumming Avoid "m_backend is NULL" warning at startup. * glom/libglom/connectionpool.[h|cc]: Added get_instance_is_ready(). * glom/application.cc: update_userlevel_ui(): Use it, because it might not be ready, causing a (harmless) stderr warning. 2011-09-21 Murray Cumming 1.19.11 2011-09-21 Murray Cumming Require latest libgdamm, for the Value::operator=() fix. * configure.ac: This avoids a blank details view when changing to developer mode. 2011-09-20 Murray Cumming Details: Avoid an empty layout when changing to developer mode. * glom/mode_data/box_data_details.cc: on_userlevel_changed(): Recreate and refill the layout, instead of just recreating it. 2011-09-20 Murray Cumming Some checks for GValues with invalid types. * glom/libglom/data_structure/glomconversions.cc: value_is_empty(): Also check for a 0 GType, which now (in libgda-5.0) means invalid, not SQL-null. * glom/mode_data/box_data_details.cc: set_found_set_from_primary_key_value(): Use value_is_empty() instead of checking for a null value. 2011-09-20 Murray Cumming Changelog fixes 2011-09-20 Murray Cumming Print Layout: Use foregroud colors from the text/field formatting. * glom/print_layout/canvas_layout_item.cc: apply_formatting(): Correctly use the foreground color, though the background color is not used yet. 2011-09-20 Murray Cumming Print Layout: Layout: Fix alignment/expansion of the line options. * ui/developer/window_data_layout.glade: Remove some horizontal expand=true. 2011-09-20 Murray Cumming Correct the ChangeLog 2011-09-20 Murray Cumming Print Layout: Related Records: Do not show editing formatting options. * glom/mode_design/layout/dialog_layout.[h|cc]: Add m_editable_layout, defaulting to true. * glom/mode_design/layout/dialog_layout_details.cc: on_button_formatting(): Use m_editable_layout to avoid showing some formatting options. * glom/mode_design/layout/dialog_layout_list_related.cc: set_document(): Set m_editable_layout to false for print layout. 2011-09-19 Murray Cumming Print Layout: Use the correct numeric formatting. * glom/print_layout/canvas_print_layout.cc: set_canvas_item_field_value(): For instance, use the default field formatting. Otherwise numbers tend to have thousands separators and no decimal places by default. 2011-09-19 Mario Blättermann [l10n] Updated German translation 2011-09-19 Murray Cumming Images: Avoid a warning when choosing. * glom/utility_widgets/imageglom.cc: on_menupopup_activate_select_file(): Avoid a warning about reinitializing a GValue when choosing an image file. 2011-09-17 Matej UrbanÄiÄ Updated Slovenian translation 2011-09-15 Martin Srebotnjak Updated Slovenian translation 2011-09-15 dmustieles Updated Spanish translation 2011-09-13 Murray Cumming Remove the Add Related Table feature. * glom/application.cc: init_menus(): * glom/frame_glom.[h|cc]: on_menu_Tables_AddRelatedTable(): Remove the Tables/Add Related Table menu item (and feature) because, though it is useful, it requires explanation and is probably confusing to new users. Of course you can still add tables and then a relationship to them manually. 2011-09-12 Murray Cumming 1.19.10 2011-09-12 Murray Cumming UsesRelationship: Added get_relationship_display_name(). * glom/mode_design/layout/dialog_layout_calendar_related.cc: update_ui(): * glom/mode_design/layout/dialog_layout_list_related.cc: update_ui(): Move some code into * glom/libglom/data_structure/layout/usesrelationship.[h|cc]: get_relationship_display_name() to avoid repetition. 2011-09-12 Murray Cumming Related Records: Correct automatic navigation to related relationships. * glom/base_db.[h|cc]: get_portal_navigation_relationship_automatic(): Remove the unused (well, should have been unused) navigation_main output parameter. Document the method so we know what the parameters and result really mean. In particular, a empty result means that the portal's regular relationship should just be used. * glom/mode_data/box_data_portal.[h|cc]: get_suitable_table_to_view_details(): Document its parameters so we know what table the relationship belongs to, if any relationship is even needed. Use get_navigation_relationship_specific() if specified and correct the logic so that the correct table is always used. get_suitable_record_to_view_details(): Document this too. * glom/mode_design/layout/dialog_layout_calendar_related.cc: update_ui(): * glom/mode_design/layout/dialog_layout_list_related.cc: update_ui(): Adapted. 2011-09-09 Murray Cumming ComboGlom::set_value(): Do not cause a change to be signalled. * glom/mode_data/datawidget/combo.[h|cc]: Prevent unsuitable signal emissions when setting the value programatically. 2011-09-09 Murray Cumming Do not create XML documents containing form feeds. * glom/libglom/utils.[h|cc]: Added string_clean_for_xml(), though it is currently inefficient and copies the whole string even when not changing it. * glom/libglom/document/document.cc: set_child_text_node(), set_node_text_child_as_value(), save_before(): Always use that utility method before giving the child text string to libxml, because libxml will just write it out to the file, creating an invalid XML file that it can't read back in. 2011-09-09 Murray Cumming Related records portals: Allow navigation via read-only relationships. * glom/mode_data/box_data_list_related.cc: on_adddel_user_requested_edit(): Remove the check for a non-editable relationship, because that is about editing, but this is about opening, and we already have the navigation=None option. 2011-09-09 Murray Cumming Improve some stdcerr output. 2011-09-09 Marek ÄŒernocký Updated Czech translation 2011-09-09 Murray Cumming Script Library: Prevent a crash when opening the dialog. * ui/developer/dialog_script_library.glade: Change the GtkComboBox to a GtkComboBoxText as intended, to prevent a crash when it has no model. * glom/utility_widgets/combo_textglade.[h|cc]: Add a check that there is a model. 2011-09-09 Murray Cumming This one actually works, and works around the GdaNumeric problem in pygobject. 2011-09-08 Murray Cumming DataWidget: Do not expand the Open and Find buttons. * glom/mode_data/datawidget/datawidget.cc: Use Gtk::PACK_SHRINK. 2011-09-08 Murray Cumming Print Layout: Do not show the formatting context menu items when it is useless. * glom/print_layout/canvas_print_layout.cc: on_item_show_context_menu(): Disable the formatting context menu item when appropriate. 2011-09-08 Murray Cumming Use pygobject-3.0 * configure.ac: Instead of pygobject-2.0. Because everything else (such as the gi.repository.Gda seems to use it, and initializing pygobject-2.0 breaks that. 2011-09-08 Murray Cumming Remove the Mameo UI. * Makefile.am: * Makefile_glom.am: * configure.ac: * glom/*.[h|cc]: Remove the --enable-maemo option and the ifdefs in the code. Unforunately, the platform is dead so that Hildon API will never be available to us in the real world. 2011-09-08 Murray Cumming startup: Check that the gi.repository python module is available. * glom/main.cc: Actually call check_gir_is_available_with_warning() and do that before checking for Gda inside it. 2011-09-08 Murray Cumming Always escape strings, to fix a libpq hang. 2011-09-07 Murray Cumming Set sourceparts too 2011-09-06 dmustieles Updated Spanish translation 2011-09-05 Murray Cumming Glade files: Alignment corrections. * ui/developer/box_formatting.glade: * ui/developer/dialog_choose_field.glade: * ui/developer/window_groups.glade: * ui/operator/dialog_import_csv.glade: Use fill=true for the packing of labels in GtkTable, so their alignment is actually used. For instance, this makes labels line up to the left or right. * ui/developer/dialog_user.glade: Also use a : at the end of labels, as in other dialogs. 2011-09-02 Murray Cumming Fix expansions in glade files. * ui/developer/*.glade: * ui/operator/*.glade: expand/fill corrections and some alignment corrections. 2011-09-01 Daniel Mustieles Updated Spanish translation 2011-09-01 Murray Cumming Field Definition window: Fix vertical packing. * ui/developer/window_field_definition_edit.glade: Some GtkTable children had vertical expand=true. 2011-09-01 Murray Cumming Replace deprecated Gtk::HBox and Gtk:VBox with Gtk::Box. * glom/*.[h|cc]: HBox and VBox are deprecated. However, these are still used in the .glade files. 2011-09-01 Murray Cumming Alignment corrections. 2011-09-01 Murray Cumming Alignment corrections. 2011-09-01 Murray Cumming Update EggSpreadTableDnd from libegg. * glom/utility_widgets/eggspreadtable/eggspreadtablednd.[h|c]: Updated from libegg. * glom/utility_widgets/eggspreadtablemm/eggspreadtabledndmm.[h|cc]: Wrap the new API to add and remove widgets. Note the extra reference() in remove_child(), like Gtk::Container::remove(). * glom/utility_widgets/eggspreadtablemm/test_spreadtablednd.cc: Adapt. * glom/utility_widgets/flowtable.[h|cc]: Adapt and make several corrections, for instance to really find our intermediate hbox parents. However, there is still a warning (from our code) about trying to remove a hbox that has no parent. * glom/mode_data/flowtablewithfields.[h|cc]: Remove the add_before parameters, always adding at the end, because we do not need the ability to insert anywhere else, and doing so required examining the children, but EggSpreadTableDnd adds internal children that we don't want to care about. 2011-09-01 Mario Blättermann [l10n] Updated German translation 2011-08-31 Murray Cumming Print Layout: Allow the user to choose row and column line widths and color. * glom/libglom/data_structure/layout/layoutitem_portal.[h|cc]: Added get/set_print_layout_row_line_width(), get/set_print_layout_column_line_width(), and get/set_print_layout_line_color(). * glom/libglom/document/document.cc: load_after(), save_before(): Store the new details in the document. * ui/developer/window_data_layout.glade: Added an optional extra section with line details for print layouts. * glom/mode_design/layout/dialog_layout_list_related.[h|cc]: Use the new widgets, hiding them for non-print-layout uses. * glom/mode_design/layout/dialog_layout_details.[h|cc]: Hide the new widgets by default. * glom/utility_widgets/canvas/canvas_table_movable.[h|cc]: Added set_line_details(). * glom/print_layout/canvas_layout_item.cc: create_canvas_item_for_layout_item(): Call set_line_details(). 2011-08-30 Murray Cumming Disable the canvas test. * Makefile_tests.am: Because it doubles the build time. 2011-08-30 Murray Cumming Print Layout: Line editing: Allow decimal places. * ui/developer/dialog_line.glade: Add an outer border, to match the other dialogs. Let the SpinButton show (and allow) 3 decimal places. 2011-08-30 Murray Cumming Print Layout: Slight improvement to image scaling. * glom/utility_widgets/canvas/canvas_image_movable.cc: scale_to_size(): Use the correct size in pixels to scale the image. However, it is still overscaled and cropped due to goocanvas bug #657592 . 2011-08-29 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2011-08-29 Murray Cumming Print Layout: Allow editing of line width and color. * Makefile.am: * Makefile_glom.am: * ui/developer/dialog_line.glade: * glom/mode_design/layout/layout_item_dialogs/dialog_line.[h|cc]: Added a new dialog for editing line details, such as width and color. * tests/test_glade_derived_instantiation.cc: Test new new dialog. * glom/libglom/data_structure/layout/layoutitem_line.[h|cc]: Added get/set_line_width() and get/set_line_color(). * glom/libglom/document/document.cc: load_after(), save_before(): Store these new details in the document. * glom/print_layout/canvas_layout_item.cc: * glom/print_layout/canvas_print_layout.[h|cc]: Allow editing by showing this new dialog. 2011-08-29 Murray Cumming Load whole glade files, to get secondary objects without listing them. * glom/glade_utils.h: helper_get_glade_widget_derived_with_warning(): Add a bool so we can choose to load the whole .glade file. get_glade_widget_derived_with_warning(): Load the whole file. Add get_child_glade_child_widget_derived_with_warning(), which does not load the whole file. * glom/frame_glom.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc: * glom/mode_design/print_layouts/dialog_text_formatting.cc: Use this to load boxes when we do not want the whole window that they are in. This was the main reason for splitting the .glade files up - to work around GtkBuilder's inability to automatically load secondary objects. 2011-08-28 Murray Cumming Remove unused .glade file. * ui/developer/dialog_layoutitem_properties.glade: * Makefile.am: This glade file is not used by any code. 2011-08-27 Murray Cumming Print Layout: Related records portals: Use the normal outline stroke. * glom/utility_widgets/canvas/canvas_group_resizable.[h|cc]: Add a static get_outline_stroke() method. * glom/print_layout/canvas_layout_item.cc: create_canvas_item_for_layout_item(): Use it here. 2011-08-27 Murray Cumming Print Layouts: Default to 12-point text instead of 9. * glom/mode_design/print_layouts/window_print_layout_edit.cc: Use a grid size, and item sizes, suitable for 12 point text. create_empty_item(): Make sure we stop LayoutItem_Field items from using default formatting, which is not for print layouts. Set a default font size for anything that has text formatting. * glom/mode_design/relationships_overview/canvas_group_dbtable.cc: Constructor: Use 12 points instead of 10 points, though this should be configurable anyway. 2011-08-27 Murray Cumming Minor uppercase correction for font names 2011-08-27 Murray Cumming Print Layout: Make item sizes match the grid size by default. * glom/mode_design/print_layouts/window_print_layout_edit.cc: create_empty_item(): Base the default item sizes on the grid gap, so they are more useful. 2011-08-26 Murray Cumming Allow deletion of multiple selected items via the context menu. * glom/print_layout/canvas_print_layout.[h|cc]: on_context_menu_delete(): If the deleted item was selected, delete all selected items. 2011-08-23 Murray Cumming Print Layout: Related records: Corrections for column sizes. * glom/print_layout/canvas_layout_item.cc: create_canvas_item_for_layout_item(): Related records table: Use an extra GooCanvasRect to make sure that the cell size is really what we want, avoiding GooCanvasText's and GooCanvasTable's attempts to be cleverer than we want. Also, make sure that the last column is expanded, regardless of any size specified, if all the other columnd had specified sizes. 2011-08-22 Murray Cumming Print Layout: Related Records: Set the row height. * glom/print_layout/canvas_layout_item.cc: We can do this now that the goocanvas bug has been fixed, though configure should check for it when the tarball version exists. 2011-08-22 Murray Cumming Print Layout / Relationships Overview: Avoid errors with & in the text. * glom/utility_widgets/canvas/canvas_text_movable.cc: reconstruct_markup: Escape the text before using it to build markup. Otherwise pango will complain (correctly) about & in the text. 2011-08-22 Murray Cumming Print Layout: Do not show navigation options for related records portals. * glom/mode_design/layout/dialog_layout_list_related.[h|cc]: set_document(): Add a new bool parametrer that can hide the navigation widgets because they are useless in a print layout. * glom/print_layout/canvas_print_layout.cc: offer_related_records(): Use the new bool parameter. * ui/developer/window_data_layout.glade: Correct some packing options so the right parts expand, without empty space. 2011-08-15 Marek ÄŒernocký Updated Czech translation 2011-08-15 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2011-08-13 Murray Cumming Print Layout: Snap to rules even when the grid is not shown. * glom/utility_widgets/canvas/canvas_group_grid.cc: Don't make snapping to rules dependent on whether the grid is showing. 2011-08-12 Murray Cumming Print Layout: Work around some weirdness in portal tables. * glom/print_layout/canvas_layout_item.cc: create_canvas_item_for_layout_item() Do not set the height of items in tables, because that leads to them disappearing when the table is moved in certain ways. I am still investigating why. We probably really do want to set the height. 2011-08-11 Murray Cumming Fixed canvas test, though it is not normally built 2011-08-11 Murray Cumming Enable the canvas test. 2011-08-11 Murray Cumming Print Layout: Only show grid lines on mouseover. * glom/utility_widgets/canvas/canvas_table_movable.[h|cc]: Add set_lines_visibility(). * glom/utility_widgets/canvas/canvas_group_resizable.cc: position_line_manipulators(): If the child is a table then also show the grid lines. 2011-08-11 Murray Cumming Print Layout: Make the manipulators the same width as the outlines. * glom/utility_widgets/canvas/canvas_group_resizable.cc: Change MANIPULATOR_STROKE_WIDTH to be the same as OUTLINE_STROKE_WIDTH, which is thinner. create_outline_line(): Prevent dragging of the outline, in case it ever gets high enough in the z order to be dragged. create_rect_manipulators(), position_line_manipulators(), create_outline_line(): Always raise the manipulators to the very top, so they are always visible and draggable. Trying to be more precise with raise() can apparently move them lower than other items that we do not mention. 2011-08-11 Murray Cumming Minor code style change. 2011-08-11 Murray Cumming Minor const improvements 2011-08-11 Murray Cumming Fix compiler warning 2011-08-11 Murray Cumming Print Layout: Do not show the rules when they should not be visible. * glom/print_layout/canvas_print_layout.cc: set_print_layout(): Show the grid and rules as per the PrintLayout. 2011-08-11 Murray Cumming Print Layout: Prevent rule line dragging if rules are not shown. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: on_menu_view_show_rules(): If rules are not shown, unset the GimpRulers as drag sources. on_canvas_drag_motion(), on_canvas_drag_data_received(): Prevent showing the temp rule or dropping a real rule too. Also remove the unused (though set) m_dragging_temp_rule variable. 2011-08-11 Murray Cumming Print Layout: Add a Print Preview menu item. * glom/frame_glom.[h|cc]: on_menu_print_layout_selected(): Move this into a do_print_layout() method, with optional preview and transient-for window. * glom/application.[h|cc]: Added do_print_layout() so we can do this from other parts of the code. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Add a Print Preview menu item that calls the method on the application, though transient to this window. It shows data from the currently-selected record, even though that might not be very visible to the user. 2011-08-11 Murray Cumming Print Layout: Make text formatting work for field items. * glom/print_layout/canvas_print_layout.cc: on_context_menu_edit(), on_dialog_format_hide(): Never use default formatting for fields, because that formatting is for regular layouts, and we do not even let the user toggle whether to use it. 2011-08-11 Murray Cumming Print Layout: Don't move fields to 0,0 when choosing the field. * glom/mode_design/layout/dialog_choose_field.cc: get_field(): Preserve the extra details of the start field, such as formatting and print layout position. 2011-08-11 Murray Cumming Print Layout: Actually allow the user to change the text formatting. * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: When used for a print layout, enable the hidden checkboxes, because other code checks for them. * glom/print_layout/canvas_print_layout.cc: on_context_menu_formatting(): Make the dialog transient for the parent window. Also, do not show numeric formatting for text items. 2011-08-11 Daniel Mustieles Updated Spanish translation 2011-08-11 Murray Cumming Print Layout: Correct drag positions when scrolled. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Correct the rule position indicators, the rule drag positions, and item drag positions, when the viewport is scrolled. canvas_convert_from_drag_pixels(): Add a bool adjust_for_scrolling option, because the motion-notify-event signal already takes the scroll offset into account, but the drag-motion signal does not. That does not seem to be documented. 2011-08-10 Murray Cumming Print Layout: Make items transparent. * glom/utility_widgets/canvas/canvas_group_resizable.cc: create_rect_manipulators(): Make items transparent instead of white. 2011-08-10 Murray Cumming Print Layout: Allow rules to be moved. * glom/utility_widgets/canvas/canvas_line_movable.[h|cc]: Added set_hover_color() and make sure that color is used when the mouse is over the line. * glom/utility_widgets/canvas/canvas_group_grid.[h|cc]: Use CanvasLineMovable instead of PolyLine for rules, so it can be moved. Make it appear red when hovering over it. Store the lines instead of just the positions, so we can get the latest positions later. This is rather inefficient, but it works. 2011-08-10 Mario Blättermann [l10n] Updated German translation 2011-08-10 Murray Cumming Print Layout: Save the rules and the various show/hides. * glom/glom_document.dtd: Add the new nodes and attributes. * glom/libglom/document/document.cc: load_after(), save_before(): Load and save these in the document. * glom/mode_design/print_layouts/window_print_layout_edit.cc: set_print_layout(): Set the menu actions from the PrintLayout so, for instance, the grid is shown if it was shown last time. * glom/print_layout/canvas_print_layout.cc: set_print_layout(): Load and save the rules too. * glom/utility_widgets/canvas/canvas_group_grid.[h|cc]: Added remove_rules() and get_horizontal/vertical_rules(). * glom/utility_widgets/canvas/canvas_editable.[h|cc]: Added remove_rules() and get_horizontal/vertical_rules(), calling the same methods in the grid. * glom/libglom/data_structure/print_layout.[h|cc]: Added get/set_grid/rules/outlines() and get_horizontal/vertical_rules(). 2011-08-10 Murray Cumming Print Layout: Allow dragging of rules from the rulers. * glom/utility_widgets/canvas/canvas_group_grid.[h|cc]: Added show_temp_rule(). * glom/utility_widgets/canvas/canvas_editable.[h|cc]: Added show_temp_rule(), calling the one in the grid. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Constructor: Add a special target to the canvas (drag destination). Handle button-press on the rulers to identify the orientation. on_canvas_drag_motion(): Handle the new target, showing the temporary rule line. on_canvas_drag_data_received(): Handle the new target, adding a real rule line. on_canvas_drag_leave(): clean up. The rule lines are not saved to the document yet. 2011-08-10 Murray Cumming Removed unused method. 2011-08-09 Murray Cumming Print Layout: Actually show rules, if there are some. * glom/utility_widgets/canvas/canvas_group_grid.[h|cc]: create_lines(): Split this into two methods, and make sure that the z order is correct, so that we can really show the grid and rules independently, without needing to recreate both at the same time. Added set_rules_visiblity() to do so. add_horizontal_rule(), add_vertical_rule(): Actually create the rules. * glom/utility_widgets/canvas/canvas_editable.[h|cc]: Added set_rules_visibility() which just calls the same method in the grid. * glom/mode_design/print_layouts/window_print_layout_edit.cc: on_action_menu_view_showrules(): Call it. Of course, there is no way to add a rule yet. 2011-08-09 Murray Cumming Print Layout: Make the window bigger by default. 2011-08-09 Murray Cumming Print Layout: Make ruler markers follow moved items. * glom/mode_design/print_layouts/window_print_layout_edit.cc: on_selected_item_moved(): Show the top-left position of the group of items, though maybe we should show just the moved item instead. Inkscape does not do this at all (it just shows the cursor position), so some other example would be nice. 2011-08-09 Murray Cumming Print Layout: Make ruler markers follow the cursor. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Handle motion-notify-event so the rules track the cursor position. This is not very useful, but it feels nice, and is what other apps do. 2011-08-09 Murray Cumming Application: Remove unused member variable. * glom/application.[h|cc]: Remove m_pBoxSidebar. 2011-08-09 Murray Cumming Update the GimpRuler source copy. * glom/utility_widgets/gimpruler/gimpruler.[h|cc]: Updated from gimp's repository, from the gtk3-port branch. 2011-08-08 Murray Cumming Relationships Overview: Make snap to grid work. * glom/utility_widgets/canvas/canvas_editable.[h|cc]: Add associate_with_grid(). * glom/mode_design/relationships_overview/dialog_relationships_over view.cc: draw_tables(): Use it so that the items' snap_position() methods have a grid to snap to. The whole grid association/add idea is generally hacky, but this makes it work. 2011-08-08 Murray Cumming Fix the build. 2011-08-08 Murray Cumming Print Layout: Deselect all items when clicking on the background. * glom/print_layout/canvas_print_layout.[h|cc]: set_page_setup(): Handle button-press-event signals on the background, deselecting any selected items. create_margin_line(): Do the same if the user manages to click on a line instead. 2011-08-08 Murray Cumming Relationships Overview: Correct the packing in the dialog. * ui/developer/dialog_relationships_overview.glade: Let the scrolledwindow expand. This was really silly and must have happened during some edit with a bad version of Glade. 2011-08-08 Murray Cumming Print Layout: Select All: Added ctrl-A keyboard shortcut. * glom/mode_design/print_layouts/window_print_layout_edit.cc: init_menus(): Because it is not part of the stock item, for some reason. 2011-08-08 Murray Cumming Print Layout: Add Select All and Unselect All menu items. * glom/print_layout/canvas_print_layout.[h|cc]: Added select_all(bool) * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: init_menus(): Edit menu: Add Select All and Unselect All menu items, which call that method. 2011-08-08 Murray Cumming Print Layout: Add a Show Outlines menu item * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc] View menu: Add Show Outlines, with a handler, to show the extents of the items. * glom/utility_widgets/canvas/canvas_group_resizable.[h|cc]: Added a new group with lines, in a thinner fainter gray, to indicate the outline. Added set_outline_visible() to show it. Move it whenever the child item moves, like the manipulator lines. * glom/print_layout/canvas_print_layout.[h|cc]: Added set_outlines_visibility() to call this on all items. Store the value as a bool so we can use it again in add_canvas_layout_item(). 2011-08-08 Murray Cumming Print Layout: Allow moving of multiple items via x and y numbers. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: on_canvas_selection_changed(): Move the calculation of the group dimensions into get_dimensions_of_multiple_selected_items(). on_spinbutton_x(), on_spinbutton_y(): Use the new method to get the old dimensions, so we can calculate the offset and then apply it to all items, moving them together. 2011-08-08 Murray Cumming Print Layout: Snap to grid when dragging items from the toolbar. * glom/utility_widgets/canvas/canvas_group_resizable.h: snap_position(): Make this public. * glom/mode_design/print_layouts/window_print_layout_edit.cc: on_canvas_drag_motion(), on_canvas_drag_data_received(): Snap the position to the grid (or rules), like we do when dragging an existing item. 2011-08-07 Murray Cumming Print Layout: Improve the grid appearance. * glom/mode_design/print_layouts/window_print_layout_edit.cc: on_menu_view_show_grid(): Use a smaller grid gap, which seems more useful. * glom/utility_widgets/canvas/canvas_group_grid.cc: create_rule_line(): Make the lines thinner and light blue instead of gray. 2011-08-07 Murray Cumming CanvasGroupGrid: Simplify rule creation. * glom/utility_widgets/canvas/canvas_group_grid.[h|cc]: create_grid_or_rule_line(): Rename to create_rule_line(), removing the bool, because that is what it is used for. 2011-08-07 Murray Cumming Fixed ChangeLog 2011-08-07 Murray Cumming Canvas_PrintLayout: Move all selected items when dragging. * glom/utility_widgets/canvas/canvas_item_movable.[h|cc]: signal_moved(): Send the item (for convenience, to avoid dodgy use of sigc::bind() with RefPtr<>s) and the offset of just the current part of the move. * glom/utility_widgets/canvas/canvas_group_resizable.[h|cc]: * glom/mode_design/relationships_overview/dialog_relationships_over view.[h|cc]: Adapt. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: on_selected_item_moved(): Move all the other selected items by the same amount. 2011-08-07 Murray Cumming Canvas_PrintLayout: Selecting unselects others. Allow shift-clicking. * glom/utility_widgets/canvas/canvas_item_movable.[h|cc]: signal_selected(): Also send the item (this), to avoid the need for awkward (due to keeping a reference) sigc::bind()ing of RefPtr<>s. Send a bool group_select parameter too, so we know if the button press (corresponding to the button release) was with the shift key held down. * glom/utility_widgets/canvas/canvas_editable.[h|cc]: on_item_selected(): Deselect other already-selected items if the select was not with shift held down. 2011-08-07 Murray Cumming Deal with minor TODO 2011-08-07 Murray Cumming CanvasItemMovable: set_selected(): Do not emit the signal here. * glom/utility_widgets/canvas/canvas_item_movable.cc: set_selected(): Do not emit signal_selected here, because it should only be emitted when the user causes it. on_button_release_event(), on_motion_notify_event(): Emit the signal if necessary. 2011-08-07 Murray Cumming Canvas_PrintLayout: Edit menu: Support multiple items. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: on_canvas_selection_changed(): Store all the seleced items in a vector instead of just one. on_menu_edit_copy(): Clone all the selected items in a vector, instead of just one. on_menu_edit_paste(): Paste all the items, instead of just one. on_menu_edit_delete(): Delete all the items, instead of just one. on_spinbutton_*(): Adapt. These still assume that the SpinButtons are only editable when only one item is selected. 2011-08-07 Murray Cumming Canvas_PrintLayout: Update position numbers when moving items. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: on_canvas_selection_changed(): Connect to the item's signal_moved, so we can update the spinbuttons during the move. on_spinbutton_*(): Ignore the spinbutton signals while we are setting them programatically, to avoid an endless loop. * glom/utility_widgets/canvas/canvas_item_movable.cc: set_selected(): Emit the signal here if it has changed, rather than always doing it after the call. on_motion_notify_event(): Mark the item as selected whenever it is moved, therefore emitting the signal. 2011-08-07 Murray Cumming Canvas_PrintLayout: Fix typo to pass the item by reference. * glom/print_layout/canvas_print_layout.[h|cc]: add_canvas_layout_item(): Add a missing & to the parameter. 2011-08-07 Murray Cumming Print Layout: Implement cut/copy/paste/delete. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Implement the edit menu, enabling/disabling the menu items based on whether something has been selected or previously copied. * glom/utility_widgets/canvas/canvas_editable.[h|cc]: Added get_selected_items() here, making it virtual. The override in Canvas_PrintLayout is the only real implementation so far. Added remove_item(). remove_all_items(): Emit signal_selection_changed if something was selected. * glom/print_layout/canvas_print_layout.[h|cc]: Added remove_canvas_layout_item(). Removed update_layout_position_from_canvas(), putting it in Canvas_LayoutItem instead. * glom/print_layout/canvas_layout_item.[h|cc]: Added update_layout_position_from_canvas(). 2011-08-07 Murray Cumming CanvasPrintLayout: Remove unused method overload. * glom/print_layout/canvas_print_layout.[h|cc]: get_selected_items(): The const overload is not used so remove it. 2011-08-07 Murray Cumming Print Layout: Cache the selected item. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Store the selected item, when it changes, instead of repeatedly requesting it, which requires iteration. 2011-08-06 Mario Blättermann [l10n] Updated German translation 2011-08-06 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2011-08-06 Daniel Mustieles Updated Spanish translation 2011-08-06 Murray Cumming Print Layout: Allow editing of positions and size numerically, * ui/developer/window_print_layout_edit.glade: Add a row of SpinButtons at the bottom to show the position and dimensins of the selected item, also letting the user change them by changing the numbers. * glom/utility_widgets/canvas/canvas_item_movable.[h|cc]: Added signal_selected(). * glom/utility_widgets/canvas/canvas_editable.[h|cc]: Added signal_selection_changed(). * glom/print_layout/canvas_print_layout.[h|cc]: Added get_selected_items(). * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Constructor: Get the SpinButton widgets from Gtk::Builder, and set their values when an item is selected. Also change the item when the values in the SpinButtons change. 2011-08-05 Murray Cumming Print Layout: Allow the user to select items with a click. * glom/utility_widgets/canvas/canvas_item_movable.[h|cc]: Added get/set_selected() and a virtual show_selected() which it calls. on_button_release_event(): set the item as - selected if it unselected and the clicked without a move. - unselected if it was selected and clicked without a move. - selected if it was moved. This is roughly like Inkscape's behaviour. * glom/utility_widgets/canvas/canvas_group_resizable.[h|cc]: Split the manipulator group into two groups (edges and corners), so we can (re)use the edges to show selection. Implement show_selected() to show/hide the edges. set_manipulator_visibility(): Make sure that we don't hide the edges that are visible to show selection. This doesn't actuall do anything useful yet, but it will let us do things to the selected item(s), such as editing their position via coordinate numbers, moving them together, or copy/paste/cut/deleting them via the menus. 2011-08-05 Murray Cumming Simplify a line of code 2011-08-05 Murray Cumming Remove debug output 2011-08-05 Murray Cumming Print Layout: Avoid warnings about -1 width. * glom/utility_widgets/canvas/canvas_group_movable.cc: get_width_height(), * glom/utility_widgets/canvas/canvas_group_resizable.cc: get_width_heigh(): Do not return -1, which groups default to, to mean some default size. This was not really used anyway, and was rejected when applied to non-group goocanvas items. 2011-08-05 Murray Cumming Developer menu: Move the Developer item after Operator. * glom/application.cc: When the user changes this, he generally changes from operator to developer, so this feels more natural. 2011-08-05 Murray Cumming Print Layout Window: default to 100% size * glom/mode_design/print_layouts/window_print_layout_edit.cc: init_menu(): Default to 100% instead of fit-to-width, because this seems to give a better idea that it is a page, by being more like applications such as OpenOffice/LibreOffice write. 2011-08-05 Murray Cumming Print Layout Window: Make the top widgets more compact. * ui/developer/window_print_layout_edit.glade: * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Make the table title/name a simple bold label with no Table: label, as now in the main window. Make the other labels non-bold. Make sure that we really show the table title with the name in brackets, by removing an unused (but checked) widget pointer. 2011-08-05 Murray Cumming Print Layout: Correct drag position even when the layout is scrolled. * glom/mode_design/print_layouts/window_print_layout_edit.[h|cc]: Add and use canvas_convert_from_drag_pixels() to avoid the offset when dragging an item from the toolpalette to the canvas when the canvas is scrolled down. 2011-08-04 Murray Cumming Print Layouts: Make corner and edges snap to the grid too. * glom/utility_widgets/canvas/canvas_group_resizable.[h|cc]: Add a set_grid() override(), as in CanvasGroupMovable, so that the manipulator items also know about it, even though the manipulators were created earlier, in the constructor. Previously snapping to the grid only worked while moving whole items. 2011-08-04 Murray Cumming Remove debug output 2011-08-02 Bruno Brouard Updated French translation 2011-08-01 Murray Cumming 1.19.9 2011-07-30 Mario Blättermann [l10n] Updated German translation 2011-07-30 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2011-07-27 Marek ÄŒernocký Updated Czech translation 2011-07-26 Daniel Mustieles Updated Spanish translation 2011-07-25 Murray Cumming Design: Related Records: Allow the developer to specify how many rows to show. * glom/libglom/data_structure/layout/layoutitem_portal.[h|cc]: Add set/get_rows_count() to specify how many rows to show. * glom/libglom/document/document.cc: Load and save that rows count. * ui/developer/window_data_layout.glade: Add a SpinButton to specify the number of rows to show in related records portals. * glom/mode_design/layout/dialog_layout_details.[h|cc]: Get that widget, but hide it in this base class. * glom/mode_design/layout/dialog_layout_list_related.[h|cc]: Constructor: Show and setup the spinbutton. set_document(): Set the spinbuttons's contents. save_to_document(): Save it back to the portal layout item. * glom/mode_data/box_data_list_related.cc: create_layout(): Use DbAddDel::set_height_rows() to try to show the correct number of rows. 2011-07-20 Murray Cumming Removed debug output. 2011-07-20 Murray Cumming ImageGlom: Ignore warning about invalid GdaBinary GValue. * glom/utility_widgets/imageglom.[h|cc]: Add and use get_binary() method, to avoid trying to get a GdaBinary from a null (type) Gnome::Gda::Value. 2011-07-19 Murray Cumming ImageGlom: Add commented-out code to load PDFs from memory. * glom/utility_widgets/imageglom.cc: This needs new API in bug #654832 2011-07-15 Mario Blättermann [l10n] Updated German translation 2011-07-15 Murray Cumming ImageGlom: Save temp files as read-only to avoid unexpected data loss. * glom/utility_widgets/imageglom.cc: save_temp_file(): Set the file permissions. 2011-07-15 Murray Cumming Avoid autoconf warning about datarootdir. * glom/libglom/glom.pc.in: Set datarootdir to avoid this warning: config.status: WARNING: 'glom/libglom/glom.pc.in' seems to ignore the --datarootdir setting as suggested here: http://www.gnu.org/software/hello/manual/autoconf/Changed-Directory-Variables.html 2011-07-15 Murray Cumming ImageGlom: Do not try to get a thumbnail for non-image, non-evince types. * glom/utility_widgets/imageglom.cc: Just use g_content_type_get_icon(), to avoid saving temporary files of huge content, such as video, when just navigating through rows. 2011-07-15 Murray Cumming ImageGlom: Remove unused member variable. * glom/utility_widgets/imageglom.[h|cc]: Also add a comment that gnome_desktop_thumbnail_factory_new() didn't work either when I tried it. 2011-07-15 Murray Cumming 1.19.8 2011-07-14 Murray Cumming ImageGlom: Set an appropriate default file filter. * glom/utility_widgets/imageglom.cc: evince-view sets its own default, but that's not ideal for us. 2011-07-14 Murray Cumming Remove debug output 2011-07-14 Murray Cumming ImageGlom: Use G_FILE_ATTRIBUTE_STANDARD_ICON * glom/utility_widgets/imageglom.cc: If G_FILE_ATTRIBUTE_THUMBNAIL_PATH doesn't work, use the standard icon. This does seem to work. 2011-07-14 Murray Cumming ImageGlom: Try to use G_FILE_ATTRIBUTE_THUMBNAIL_PATH for other file types. * glom/utility_widgets/imageglom.[h|cc]: show_image_data(): Get the mime_types supported by GdkPixbuf and only try to use it if we have a suitable mime type. Otherwise try to get a thumbnail from GFileInfo. That doesn't work now, probably because we should do that async. 2011-07-14 Murray Cumming ImageGlom: Remove some unnecessary code. * glom/utility_widgets/imageglom.cc: get_value(): Don't use the pixbuf just to get the value. 2011-07-14 Murray Cumming Remove debug output 2011-07-14 Murray Cumming ImageGlom: Another scaling fix. * glom/utility_widgets/imageglom.cc: get_scaled_image(): Don't return an empty pixbuf just because the pixbuf doesn't not need to change. 2011-07-14 Murray Cumming Remove debug output. 2011-07-14 Murray Cumming ImageGlom: Remove limits so we always scale, and use on_size_allocate(). * glom/utility_widgets/imageglom.[h|cc]: Use on_size_allocate() instead of on_draw(), which is slightly wiser. Remove the hard-coded checks for minumum and maximum sizes, because we get an initial allocation of 1, and because the max was arbitrarily small. This works now, but we still need to make the window get smaller when the GtkImage requests less space. 2011-07-14 Murray Cumming Fix a typo 2011-07-14 Marek ÄŒernocký Updated Czech translation 2011-07-14 Daniel Mustieles Updated Spanish translation 2011-07-13 Joe Hansen Updated Danish translation 2011-07-13 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2011-07-13 Murray Cumming ImageGlom: Remove hard-coded mentions of PNG file formats. * glom/utility_widgets/imageglom.cc: Open With: Use the actual (sniffed) mime type. Clipboard: Try to use the actual mime type, though this does not seem to work for any mime type now. 2011-07-13 Murray Cumming ImageGlom: Show the missing image icon again. * glom/utility_widgets/imageglom.cc: set_value(): Clear the data, not the pixbuf. show_image_data(): Check for empty data and show the missing icon if so. 2011-07-13 Murray Cumming ImageGlom: Make the context-menu work with the EvView. * glom/utility_widgets/imageglom.cc: Connect to the widget's own signal. 2011-07-13 Murray Cumming ImageGlom: Loading/Saving: Add more FileChooser filters. * glom/utility_widgets/imageglom.cc: set_file_filter_images(): Use ev_document_factory_add_filters(). 2011-07-13 Murray Cumming Image fields: Support PDF (and other types supported by evince) * configure.ac: Depend on evince-view-3.0, which is a library installed by evince. It is packaged separately from evince by distros. * glom/main.cc: Call ev_init(). * glom/utility_widgets/dialog_image_load_progress.[h|cc]: Remove get_pixbuf() and do not use Gdk::PixbufLoader here. * glom/utility_widgets/imageglom.[h|cc]: Create the pixbuf here, from the data from the dialog. Add an EvView, and use that instead of the Gtk::Image when the mime type is supported by EvView. We use g_content_type_guess() to sniff the mime type from the actual data, but this will probably not always work. We should store the mime type (and the filename) too. The context menu doesn't work with the EvView yet. 2011-07-12 Murray Cumming 1.19.7 2011-07-12 Murray Cumming ImageGlom: Saving is now mostly async. * glom/utility_widgets/dialog_image_save_progress.[h|cc]: Doing the actual writing in callbacks, like in the loader. * glom/utility_widgets/imageglom.cc: Show the dialog, so we can use the idle callbacks, and give user feedback. 2011-07-12 Murray Cumming ImageGlom: Allow the user to choose any file. * glom/utility_widgets/imageglom.cc: However, we are still restricted to what GdkPixbuf can load. 2011-07-12 Murray Cumming ImageGlom: Do not transform to PNG output when saving. * glom/utility_widgets/dialog_image_save_progress.[h|cc]: Replace set_pixbuf() with set_image_data(). save(): Save the original data, instead of saving the data from the pixbuf. * glom/utility_widgets/imageglom.cc: Adapt. This means, for instance, that if the user loads the a JPG in then they will get exactly the same JPG out. 2011-07-12 Murray Cumming Some minor signed type corrections. * glom/libglom/connectionpool_backends/postgres.cc: * glom/xsl_utils.cc: Gio::FileOutputStream::write() returns a gssize, not a gsize. 2011-07-12 Murray Cumming Remove debug output. 2011-07-12 Murray Cumming ImageGlom: Size request corrections. * glom/utility_widgets/imageglom.cc: init(): Remove the set_size_request() call which does not seem necessary. Do not call set_image(original) after scale(), because scale() does that, setting the scaled image. This avoids the GtkImage being huge, because GtkImage re-requests the bigger size again when the original is put in it. This is still not ideal. It would be nicer if we could just say "do not make the window bigger than the screen, or do not make this make the window bigger." 2011-07-12 Murray Cumming ImageGlom: Use AppInfo instead of gtk_show_uri() for Open. * glom/utility_widgets/imageglom.cc: For the case that we have no AppInfo (not Open With), use the static AppInfo method, for consistency. This might work on Win32 too. 2011-07-12 Murray Cumming Fix comment typo. 2011-07-12 Murray Cumming Image fields: Add Open, Open With, and Save context menu items. * glom/utility_widgets/dialog_image_save_progress.[h|cc]: * ui/operator/dialog_image_save_progress.glade: Added a progress dialog to do image saving, though it does not yet do async saving so the dialog is never shown. * Makefile.am: * Makefile_glom.am: * po/POTFILES.in: Mention the new files. * glom/utility_widgets/imageglom.[h|cc]: Add the new context menu items, using a temporary file for the Open and Open With features. Open With uses AppChooserDialog to offer a choice to the user. Bug #630057 2011-07-12 Murray Cumming Rename Dialog_Image_Progress to DialogImageLoadProgress * glom/utility_widgets/dialog_image_progress.[h|cc]: Rename to * glom/utility_widgets/dialog_image_load_progress.[h|cc]: * tests/test_glade_derived_instantiation.cc: * ui/operator/dialog_image_progress.glade: Rename to * ui/operator/dialog_image_load_progress.glade: * glom/utility_widgets/imageglom.h: * Makefile.am: * Makefile_glom.am: * po/POTFILES.in: Adapt. I can then add a new dialog for saving. 2011-07-11 Ben Konrath Add PACKAGE_TARNAME variable to pkg-config file. This is needed for the @docdir@ expansion used in the exampledir variable. * glom/libglom/glom.pc.in: 2011-07-11 Ben Konrath Add exampledir variable to pkg-config file. * glom/libglom/glom.pc.in: 2011-07-11 Murray Cumming Removed some tab characters 2011-07-11 Murray Cumming Add translator comments. * glom/libglom/data_structure/field.cc: * glom/libglom/data_structure/layout/*.c: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_manyrecords.cc: * glom/mode_data/notebook_data.cc: * ui/developer/dialog_script_library.glade: Add translator comments. Bug #638996 (Joe Hansen) 2011-07-09 Marek ÄŒernocký Updated Czech translation 2011-07-08 Murray Cumming Related Records: Show enough records. * glom/mode_data/db_adddel/db_adddel.[h|cc]: Added set_height_rows(), so we can set the minimum size based on the number of rows, though this currently hard-codes a size for the non-rows part of the GtkTreeView, such as the column headers. * glom/mode_data/box_data_portal.cc: * glom/mode_data/box_data_list_related.cc: Constructors: Remove unnecessary calls to set_size_request(). Call set_height_rows() instead. The related records Gtk::TreeViews probably became too small since the port to gtkmm3. We now need to use Gtk::ScrolledArea::set_min_content_height(). However, the number of rows should probably be something for the layout to specify per portal. 2011-07-08 Murray Cumming Minor int->guint change. * glom/mode_data/db_adddel/db_adddel.[h|cc]: get_fixed_cell_height(): Return a guint instead of an int. 2011-07-08 Murray Cumming Details: Do not navigate past the last row. * glom/mode_data/datawidget/treemodel_db.[h|cc]: get_last_row(): Document that this never returns the placeholder row, and make sure that it does not. There was a typo that --ed the wrong variable. * glom/mode_data/db_adddel/db_adddel.[h|cc]: get_last_row(): Document that this never returns the placeholder row. get_is_placeholder_row(): Remove an illogical call to is_last_row(). get_count(): Remove an illogical check to see whether the last row is the placeholder row. * glom/utility_widgets/adddel/adddel.h: get_last_row(): Document that this similarly-APIed widget has different behaviour. This stops the user from being taken to an empty record when clicking Last, or when clicking Next to the end. Bug #526115 comment #25 (Michael Hasselmann) 2011-07-08 Murray Cumming DbAddDel: Remove unnecessary virtual keywords. * glom/mode_data/db_adddel/db_adddel.h: These methods are not meant to be overridden by anything. 2011-07-07 Daniel Mustieles Updated Spanish translation 2011-07-07 Mario Blättermann [l10n] Updated German translation 2011-07-07 Murray Cumming 1.19.6 2011-07-07 Murray Cumming About Box: Add a logo. * glom/application.cc: Use set_logo() though this only appears in the title bar for some reason. 2011-07-07 Murray Cumming Really fix the About Box. * glom/application.cc: Add the Help menu itself, and use set_program_name() instead of set_name(). 2011-07-07 Mario Blättermann [l10n] Updated German translation 2011-07-07 Mario Blättermann [l10n] Updated German translation 2011-07-07 Murray Cumming Improve the About box. * glom/application.[h|cc]: * glom/bakery/app.[h|cc]: * glom/bakery/app_withdoc_gtk.[h|cc]: Move the help menu out of the Bakery class, doing it all in our derived Application class, to give us more control over the GtkAboutDialog. We do not need the abstraction any more. This restores the application description, which was probably lost when converting to AboutDialog. 2011-07-06 Murray Cumming Split up the developer .glade files into separate files. * ui/developer/: * glom/glade_utils.h: get_glade_widget_derived_with_warning(): Guess the filename based on the requested ID, for developer UI as we already did for operator UI. This makes it possible to edit these in recent versions of Glade, without Glade silently renaming IDs to make them unique across the whole file. * po/POTFILES.in: * Makefile.am: Mention the new files. 2011-07-06 Murray Cumming Enable silent build rules by default. * configure.ac: This is still only used if the automake version is recent enough. 2011-07-06 Daniel Mustieles Updated Spanish translation 2011-07-05 Marek ÄŒernocký Updated Czech translation 2011-07-05 Murray Cumming Remove debug output 2011-07-05 Murray Cumming ListView: Make the rows high enough. * glom/mode_data/db_adddel/db_adddel.cc: get_fixed_cell_height(): Add the GtkTreeView vertical-separator style property to the height, which might be the right thing to do, and which works here at least. 2011-07-04 Murray Cumming Find: Make searching case-insensitive again. * glom/libglom/connectionpool_backends/postgres.cc: get_string_find_operator(): Use ILIKE, though this requires the lastest libgdamm from git master. Find has been case-sensitive since around glom 1.16, since we started using SqlBuilder. 2011-07-04 Murray Cumming Backends: Slight reorganization. * glom/libglom/connectionpool_backends/backend.h: * glom/libglom/connectionpool_backends/postgres.[h|cc]: * glom/libglom/connectionpool_backends/sqlite.[h|cc]: Move method implementations into the .cc files. 2011-06-26 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2011-06-23 Murray Cumming Field::sql_find(): Do not quote the string. * glom/libglom/data_structure/field.cc: SqlBuilder already takes care of quoting so this just changed the actual value. This makes Quick Find work again. 2011-06-23 Murray Cumming Find: Use backend-specific LIKE or ILIKE operator instead of =. * glom/libglom/connectionpool.[h|cc]: * glom/libglom/connectionpool_backends/backend.h: * glom/libglom/connectionpool_backends/postgres.h: * glom/libglom/connectionpool_backends/sqlite.h: get_string_find_operator(): Return the Gnome::Gda operator enum instead of the operator as a string. * glom/libglom/data_structure/field.[h|cc]: sql_find_operator(): Likewise, return the Gnome::Gda operator enum. * glom/libglom/utils.cc: get_find_where_clause_quick(): * glom/mode_data/box_data.cc: get_find_where_clause(): Use Field::sql_find_operator() and Field::sql_find(), as per the TODO comments. This was code that I forgot to change properly when porting to use Gnome::Gda::SqlBuilder, so this has been broken since Glom 1.16. Find still does not work. 2011-06-23 Murray Cumming Frame: Rename a signal handler. * glom/frame_glom.[h|cc]: Rename on_menu_Mode_Toggle() to on_menu_Edit_Find() because that is what it is now. * glom/application.cc: Adapted. 2011-06-23 Daniel Mustieles Updated Spanish translation 2011-06-23 Murray Cumming Main window: Moved the Records/Found widgets to the top-right. * ui/operator/window_main.glade: Remove the footer row of widgets. * glom/frame_glom.[h|cc]: Instead build them manually and add them (in a box) to the notebook at the right-hand side next to the tabs. 2011-06-23 Murray Cumming Split the operator .glade files up into one file per top-level ID. * ui/operator/: Split the .glade files up, giving them the same names as the top-level (or almost top-level) IDs that the code looks for. * glom/glade_utils.h: get_glade_widget_derived_with_warning(): Guess the filename based on the requested ID. 2011-06-23 Murray Cumming Move .glade files into subdirectories under ui/ 2011-06-23 Murray Cumming Move .glade files into a ui/ directory. * glom/glom.glade: * glom/glom_developer.glade: Moved to * ui/ This will be useful when they are split up more. 2011-06-23 Murray Cumming 1.19.5 2011-06-23 Mario Blättermann [l10n] Updated German translation 2011-06-23 Murray Cumming Main window: Show the table title in find mode too. * glom/frame_glom.[h|cc]: Use an extra label for the find mode. 2011-06-23 Murray Cumming Do not hide table-specific menu items in Operator mode. * glom/application.cc: update_table_sensitive_ui(). 2011-06-22 Murray Cumming Main Window: Combine the top two rows of widgets. * glom/utility_widgets/notebook_noframe.[h|cc]: Add set_action_widget(), as in the GtkNotebook API. * glom/glom.glade: * glom/frame_glom.[h|cc]: Remove the top HBox, instead putting the table name label in the notebook widget, at the left of the tabs. 2011-06-22 Murray Cumming update_table_sensitive_ui 2011-06-22 Murray Cumming Main window: Simplify widgets at top. * glom/glom.glade: * glom/frame_glom.[h|cc]: Remove the Table: label. Make the table name normal sized, but still bold. Remove the mode labels, because there are only two modes now, and it should be obvious when you are in the middle of entering find criteria. 2011-06-22 Murray Cumming glom.glade: Resave with glade. * glom/glom.glade: Resave with glade 3.10, which changes object IDs to be unique across the whole file. Chose human-readable IDs instead of number suffixes. * glom/navigation/box_tables.cc: * glom/frame_glom.cc: Adapted the code. This is rather tedious and just makes code less readable. 2011-06-22 Murray Cumming glom.glade: Reorder top-levels alphabetically. * glom/glom.glade: Glade now does this when saving, so this will make it easier to see what else Glade has changed. 2011-06-21 Murray Cumming 1.19.4 2011-06-21 Murray Cumming Require the latest libgdamm, for the GdaNull changes. * configure.ac: Require libgdamm 4.99.3 2011-06-17 Murray Cumming Fix the tests after the libgdamm Null Value change. * tests/python/test_python_execute_script.cc: Do not try to instantiate a static Value instance because the constructor now needs the GType system to be initialized. 2011-06-17 Murray Cumming More fixes, but it segfaults 2011-06-17 Murray Cumming Details: Make Primary Key ID values visible again. * glom/mode_data/datawidget/entry.cc: Use unset_color() instead of override_color(RGBA()); 2011-06-17 Murray Cumming The result is a GdaNumeric 2011-06-16 Murray Cumming Fix the example script some more. 2011-06-16 Murray Cumming Fix the build with --enable-warnings=fatal with gtkmm 3.1. * glom/mode_data/box_data_details.[h|cc]: * glom/mode_data/db_adddel/db_adddel_withbuttons.[h|cc]: * glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc: * glom/utility_widgets/adddel/adddel_withbuttons.[h|cc]: Fix the build with --enable-warnings=fatal with gtkmm 3.1, by replacing Gtk::HButtonBox with ButtonBox and replacing get_vbox() with get_content_area(). 2011-05-24 Olav Vitters Use tar-ustar instead of tar-pax to ensure OpenBSD compatibility 2011-05-12 Murray Cumming Fix compiler warnings. * glom/mode_data/db_adddel/db_adddel.cc: * glom/mode_design/layout/dialog_layout_details.cc: * glom/report_builder.cc: * glom/utility_widgets/eggspreadtable/eggspreadtablednd.c (get_index_at_position): * tests/test_parsing_time.cc: Remove unused variables noticed by g++ 4.6. 2011-05-12 Murray Cumming Require latest libepc. Because it uses avahi-ui-gtk3, which uses GTK+3. Otherwise we would be indirectl using both GTK+ 2 and GTK+ 3. 2011-05-06 Gabriel Speckhahn Updated Brazilian Portuguese translation 2011-04-19 Murray Cumming Updated .gitignore files. 2011-04-19 Murray Cumming Egg::SpreadTable: Add a test. * Makefile_tests.am: * glom/utility_widgets/eggspreadtablemm/test_preadtablemm.[h|cc]: Add a test based on the C test. It seems to work fine. 2011-04-19 Murray Cumming Egg::SpreadTable: Derive from (and implement) Orientable. * glom/utility_widgets/eggspreadtablemm/eggspreadtablemm.[h|cc]: Use Orientable. 2011-04-18 Murray Cumming Fix the make check build. * Makefile_glom.am: Create a variable for the eggspreadtable file list. * Makefile_tests.am: Use that variable here, so we link against the new files. 2011-04-18 Murray Cumming EggSpreadTableDnd: Wrap the wiget_drop_possible signal. * glom/utility_widgets/eggspreadtablemm/eggspreadtabledndmm.[h|cc]: * glom/utility_widgets/eggspreadtablemm/private/eggspreadtabledndmm _p.h: This is unpleasant without gmmproc. 2011-04-18 Murray Cumming Egg::SpreadTableDnd: Fixt typos. * glom/utility_widgets/eggspreadtablemm/eggspreadtabledndmm.cc: Use the correct GTypes. 2011-04-18 Murray Cumming Use EggSpreadTableDnd. * glom/utility_widgets/eggspreadtable/eggmarshalers.[h|c} * glom/utility_widgets/eggspreadtable/eggplaceholder.[h|c] * glom/utility_widgets/eggspreadtable/eggspreadtablednd.[h|c]: Added these files, copied from libegg. * glom/utility_widgets/eggspreadtablemm/eggspreadtabledndmm.[h|cc]: * glom/utility_widgets/eggspreadtablemm/private/eggspreadtabledndmm _p.h: Created a hand-written C++ wrapper for EggSpreadTableDnd. * glom/Makefile_glom.am: Mention the new files. * glom/utility_widgets/flowtable.h: Use SpreadTableDnd instead of SpreadTable, though we do not use the drag-and-drop functionality yet. 2011-04-15 Murray Cumming Slight speed up 2011-04-15 Murray Cumming Use try around get_value_at(). 2011-04-13 Mario Blättermann [l10n] Updated German translation 2011-04-13 Murray Cumming Use not in python 2011-04-13 Murray Cumming More porting to latest python-apt API. 2011-04-12 Murray Cumming Correct the sizing of the ... date button. * glom/mode_data/datawidget/datawidget.cc: There is a button next to all date fields, for selecting the date. Make sure that it does not expand. Of course, a real date selection widget would be nicer. 2011-04-12 Murray Cumming Update the EggSpreadTable code. * glom/utility_widgets/eggspreadtable/eggspreadtable.[h|cc]: Update this code from libegg/libegg/spreadtable/ 2011-04-12 Murray Cumming Fix distcheck. * Makefile.am: Distribute the .db file for the sqlite example. This fixes the discheck, because we use it in a test. * glom/libglom/connectionpool_backends/sqlite.cc: connect(): Give clues on stderr if the file is missing. * glom/libglom/utils.[h|cc]: Add a file_exists(Gio::File) override for use by those checks. 2011-04-12 Murray Cumming Mostly ported to latest python-apt API. 2011-04-12 Murray Cumming Fixed the script with help from Michael Vogt 2011-04-11 Murray Cumming 1.19.4 2011-04-11 Murray Cumming Fix a test. * tests/python/test_python_execute_func_bad_syntax.cc: Allow the result to be a null Gda::Value, because that is acceptable for a python script with invalid syntax. 2011-04-10 Murray Cumming example script: Update to show the latest version 2011-04-10 Murray Cumming example script: Update to show the latest version 2011-04-10 Murray Cumming example script: Update to show the latest version 2011-04-08 Murray Cumming Port the debian repository analyzer script example to GTK+ 3. * examples/example_scripts/repository_analyzer_begin_scan.py: Use PyGObject+Introspection instead of pygtk, and adapt for a minidom API change. This is also here: https://gitorious.org/debian_repository_analyzer 2011-04-08 Murray Cumming Fix use of bool python return types. * glom/libglom/python_embed/pygdavalue_conversions.cc: glom_pygda_value_from_pyobject(): Use the C Py*_Check() functions because boost::python::extract<>::check() does not really check for the exact type and has no way to do that. Previously we were interpreting bools as ints. Note also that the order fo the Py*_Check() checks is important, because python considers bool to be derived from int. * tests/python/test_python_execute_func_with_record.cc: Uncomment the checks for the return type and value now that it works. 2011-04-07 Murray Cumming Initialize pygobject, to fix the use of the PyRecord API. * configure.ac: Require the latest pygobject with gi.repository support. * glom/libglom/init.cc: Include pygobject.h so we can call pygobject_init() here. * glom/libglom/python_embed/py_glom_record.cc: Define NO_IMPORT_PYGOBJECT so we can still include pygobject.h again here. pygobject.h uses a nasty variable declared in the header. * tests/python/test_python_execute_func_with_record.cc: Fix the python example code. However, this shows a problem with getting bool results from python, apparently because boost::python::extract<>::check() checks that the type is compatible rather than checking that it's the exact type. 2011-04-07 Murray Cumming Added a python function test that uses an actual database connection. * Makefile_tests.am: Mention the new test. * tests/python/test_python_execute_func_with_record.cc: This shows a crash in Glom::PyGlomRecord::get_connection(). 2011-04-07 Murray Cumming Moved the python tests to a sub-directory. * tests/test_load_python_library.cc: * tests/test_python_execute_func.cc: * tests/test_python_execute_func_bad_syntax.cc: * tests/test_python_execute_func_change_result_type.cc: * tests/test_python_execute_func_date.cc: * tests/test_python_execute_script.cc: * tests/test_python_module.cc: Moved to tests/python/ * Makefile_tests.am: Adapted. 2011-04-06 Marek ÄŒernocký Updated Czech translation 2011-04-06 Joe Hansen Updated Danish translation 2011-04-06 Matej UrbanÄiÄ Updated Slovenian translation 2011-04-05 Daniel Mustieles Updated Spanish translation 2011-04-05 Murray Cumming Remove more small traces of pygda. * glom/libglom/python_embed/py_glom_record.cc: * glom/python_embed/glom_python.cc: * glom/python_embed/python_module/py_glom_module.cc: Some last minor renames from pygda to gi.repository.Gda. 2011-04-05 Murray Cumming Python: Use gi.repository.Gda instead of Gda. * configure.ac: Do not require pygda at build time, though we check for it at program startup. There is probably no similar way to check at configure time, and it's debatable that it's appropriate anyway. The pygda check was probably here before in order to use a pygda .h file that we no longer use. * glom/main.cc: Add and call check_gir_is_available_with_warning() to check that gi.repository (gobject intropsection) in general is available. * glom/python_embed/glom_python.[h|cc]: * tests/test_python_module.[h|cc]: Add gir_python_module_is_available() for use by main.cc. gda_python_module_is_available(), glom_python_call(): Use the new python module instead of the old Gda module. 2011-04-05 Murray Cumming Write Python tracebacks to stderr. * glom/application.cc: * glom/mode_data/box_data.cc: * glom/mode_design/dialog_database_preferences.cc: * tests/test_python_execute_script.cc: Output python errors to stderr as a clue when things go wrong. 2011-04-04 Murray Cumming Fix an error found by the gtkmm change to use operator const void*. * glom/utility_widgets/adddel/adddel.cc: There is no TreeNodeChildren::operator[](TreeIter). The compiler was casting the TreeIter to bool and then to (int)0. 2011-04-04 Murray Cumming Require the latest mm-common and dist the mm-common scripts. * configure.ac: Add a MM_CONFIG_DOCTOOL_DIR() call so that the scripts will be distributed with the tarball, avoiding a runtime dependency on mm-common. 2011-04-03 Daniel Mustieles Updated Spanish translation 2011-03-30 Murray Cumming Adapt to the recent gtksourceviewmm API change. * configure.ac: Require the latest gtksourceviewmm. * glom/mode_design/dialog_database_preferences.[h|cc]: * glom/mode_design/fields/dialog_fieldcalculation.[h|cc]: * glom/mode_design/fields/dialog_fielddefinition.h: * glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.[h|cc]: : * glom/mode_design/script_library/dialog_script_library.[h|cc]: Use Gsv::* instead of Gsv::Source*. 2011-03-30 Murray Cumming Remove some stdout debug output. 2011-03-30 Murray Cumming Update the document DTD. * glom/glom_document.dtd: Mention some the new attribute and element for the choices, to fix the DTD test during make check. 2011-03-30 Murray Cumming A simpler way to avoid the PyDateTime_Check() crash. * glom/libglom/init.cc: libglom_init(): Remove the g_assert because this can fail: See bug #644702. * glom/libglom/python_embed/pygdavalue_conversions.cc: glom_pygda_value_as_boost_pyobject(): Check that the local re-import (hopefully cached by Python) succeeded, to avoid a crash in PyDateTime_Check(). 2011-03-30 Murray Cumming Revert "Do not crash if PyDateTime_IMPORT fails." This reverts commit 9718918d098a2a2a83c669ae45fb99d08e9b693c. Conflicts: ChangeLog 2011-03-29 Murray Cumming Depend on libgdamm-5.0 instead of libgdamm-4.0. * configure.ac: This change avoids an indirect dependency on GTK+ 2, needed by the libgda 4 tarball build. 2011-03-23 Murray Cumming libglom: Added utils::build_sql_select_count_rows(). * glom/base_db.[h|cc]: Make count_rows_returned_by() take a const SqlBuilder. * glom/libglom/utils.[h|cc]: Move some of count_rows_returned_by() into a build_sql_select_count_rows() method, for the convenience of UIs such as OnlineGlom. Bug #645110 (Ben Konrath) 2011-03-20 Bruno Brouard Updated French translation 2011-03-14 Murray Cumming Do not crash if PyDateTime_IMPORT fails. * glom/libglom/init.[h|cc]: Added libglom_pydatetime_import() and libglom_pydatetime_imported(). Remove the g_assert() when it fails. * glom/libglom/python_embed/pygdavalue_conversions.cc: Use the new utility function instead of repeating our reimplementation here. There will now just be an error message on stderr. We must fix this properly but in the meantime it is better than requiring the use of a separate glom branch just for OnlineGlom. See https://bugzilla.gnome.org/show_bug.cgi?id=644702 2011-03-14 Murray Cumming Project Manager example: Resave. * examples/example_project_manager.glom: Edit the Teams list layout, so that it actually has a layout in the file, and so that the fields order makes more sense. See http://gitorious.org/online-glom/gwt-glom/commit/1c860b7ad64f55809ecf7e6b340272800d586d35 2011-03-14 Murray Cumming Fix the build. * glom/libglom/init.cc: Add an include so we can use std::cerr. 2011-03-14 Murray Cumming libglom_init(): Show the python exception when PyDateTime_IMPORT fails. * glom/libglom/init.cc: The linker seems to behave differently when this code is run from inside a JVM in OnlineGlom. This gives us a clue. 2011-03-12 Murray Cumming Fix crashes when using choices with fixed lists. * glom/mode_data/datawidget/combochoiceswithtreemodel.[h|cc]: create_model_non_db(): Instead of creating just a text-based treemodel, create a Value-based one with an extra text column at the end. That is what the related-records model has, though it uses a custom TreeModel. The text column is needed for GtkComboBox when it has has-entry=true: (See https://bugzilla.gnome.org/show_bug.cgi?id=631167 ) Add get_fixed_model_text_column() so that other code knows which column that is. * glom/mode_data/datawidget/cellrenderer_dblist.cc: set_choices_fixed(), repack_cells_fixed(): * glom/mode_data/datawidget/combo.cc:set_choices_fixed(): Adapt to use the special column instead of assuming that column 0 is a text column. Previously Glom::Combo::set_value() crashed because we tried to get a Value where there was a Value. 2011-03-08 Murray Cumming Remove some unnecessary padding/borders around the main window. * glom/box_withbuttons.cc: Remove the border, because it is not useful. It would be for the parent widget to decide that. * glom/mode_data/flowtablewithfields.[h|cc]: add_group(): Add a with_indent optional parameter. * glom/mode_data/box_data_details.cc: create_layout(): Have no indent on top-level groups. 2011-03-08 Murray Cumming Use a custom Notebook-like widget instead of Gtk::Notebook. * glom/utility_widgets/notebook_noframe.[h|cc]: A new class with an API that is as much like the Gtk::Notebook API as we need it to be. Unlike GtkNotebook, this has no frame around the page at the bottom. That was wasting space because the extra division was unnecessary when it fills almost the whole window anyway. * Makefile_glom.am: Mention the new files. * glom/mode_data/notebook_data.cc: Derive from the new class instead of Gtk::Notebook. 2011-03-07 Murray Cumming Make a method protected. 2011-02-27 Marek ÄŒernocký Updated Czech translation 2011-02-26 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2011-02-26 Murray Cumming Fix the CSV import test. * tests/import/test_parsing.cc: Correct the number of expected tokens. This was previously just the number that was (incorrectly) parsed before. 2011-02-26 Murray Cumming CSV Import: Fix quoted-newline detection, so we don't drop rows. * glom/import_csv/csv_parser.[h|cc]: on_idle_parse(): Make in_quotes a member variable, initialized in clear(), so we remember it across calls to on_idle_parse(), instead of thinking that we are in quotes just because we are parsing arbitrary chunks of bytes that look that way individually. This fixes bug #637529 (Darmon Xavier), so all rows should be imported instead of dropping some in the middle. 2011-02-26 Daniel Mustieles Updated Spanish translation 2011-02-26 Murray Cumming Some documentation. 2011-02-26 Murray Cumming Dialog_Import_CSV_Progress: Try to really show progress. * glom/import_csv/dialog_import_csv_progress.cc: Try to call Main::events_pending() and iterate() to really show the text in the progress bar, though it does not seem to work. Pulse the progress bar, though we should really set a fraction instead. Pulsing does work, though the text does not display. 2011-02-26 Murray Cumming Correct a (translatable) string. * glom/glom.glade: Correct an English string. A comma is not a full stop. 2011-02-25 Murray Cumming NEWS fixes. 2011-02-25 Murray Cumming Add NEWS entries from the stable branch. 2011-02-25 Murray Cumming Avoid GTK+ warning when clicking on the list button. * glom/mode_data/db_adddel/db_adddel.[h|cc]: on_cell_button_clicked(): Delay the response to the click, to an idle handler, to avoid confusing GtkTreeView, which was showing a warning with GTK+ 3 about a NULL GtkAdjustment. 2011-02-21 Daniel Mustieles Updated Spanish translation 2011-02-21 Daniel Mustieles Updated Spanish translation 2011-02-10 Murray Cumming Use the new Gtk::ComboBox CellArea API to align columns properly. * glom/mode_data/datawidget/combo.cc: Get the CellAreaBox and use its more-useful pack() method instead of the standard one, so that the columns really align. 2011-02-07 Murray Cumming 1.19.3 2011-02-07 Murray Cumming Require the correct gtksourceviewmm version. * configure.ac: Use the gtksourceviewmm version with the API changes to use vector. 2011-01-30 Murray Cumming Adapt to libgdamm API changes. * glom/libglom/connectionpool.cc: * glom/libglom/db_utils.cc: libgdamm now uses std::vector instead of *Handle, like gtkmm. 2011-01-28 Murray Cumming Adapt to the gtkmm 3 change to using vectors. * glom/mode_data/datawidget/cellrenderer_dblist.cc: * glom/mode_data/db_adddel/db_adddel.cc: * glom/mode_design/layout/dialog_choose_field.cc: * glom/mode_design/print_layouts/print_layout_toolbar_button.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/layouttoolbarbutton.cc: Use std::vector instead of std::list. * glom/dialog_existing_or_new.cc: This one even used the intermediate type directly, showing how necessary this API change was. 2011-01-18 Murray Cumming Disable more deprecated API. * configure.ac: Add PANGO, PANGOMM, and CAIRO to the list. 2011-01-16 Joe Hansen Updated Danish translation 2011-01-16 Kenneth Nielsen Added da to list of languages 2011-01-15 Murray Cumming Require the appropriate gtksourceviewmm version. * configure.ac: Use the latest gtksourceviewmm release. Older versions would not build with the newer versions of gtkmm 3, so this is a hint. 2011-01-13 Murray Cumming Require the appropriate goocanvasmm version. * configure.ac: Use the latest goocanvasmm release. The code has already been ported. 2011-01-06 Murray Cumming get_current_locale(): Handle more complex setlocale(NULL) results. * glom/libglom/utils.cc: locale_simplify(): On Ubuntu Natty, setlocale() has started returning a more complex string. Parse it, or the older simpler syntax. 2011-01-06 Murray Cumming tests: Link to all necessary libraries. * Makefile_libglom.am: Define libglom_all_libs to avoid duplication. * Makefile_glom.am: Use libglom_all_libs instead of repeating. * Makefile_tests.am: Use libglom_all_libs to explicitly link against the dependencies of libglom. This seems to have been automatic with the linker in previous versions of Ubuntu, but not with Ubuntu Natty. 2011-01-05 Murray Cumming Use Gdk::Cursor via RefPtr. * glom/bakery/busy_cursor.[h|cc]: * glom/utility_widgets/canvas/canvas_item_movable.[h|cc]: gtkmm 3 now requires Gdk::Cursor to be used via RefPtr. 2011-01-05 Murray Cumming Replace a used of (removed from GTK+) gdk_spawn_*() API. * glom/application.cc: This partially fixes the build. 2010-12-16 Murray Cumming More dealing with cppcheck errors. * glom/libglom/data_structure/layout/layoutitem.cc: operator=(): Check for src=this. * glom/base_db.cc: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/libglom/connectionpool_backends/postgres_central.cc: * glom/libglom/data_structure/foundset.cc: * glom/libglom/data_structure/foundset.h: * glom/libglom/document/bakery/document_xml.cc: * glom/libglom/document/bakery/document_xml.h: * glom/libglom/document/document.cc: * glom/utility_widgets/adddel/adddel.cc: * tests/import/test_parsing.cc: * tests/import/test_signals.cc: Removed unused methods and unused variables. 2010-12-16 Murray Cumming Removed more unused methods. 2010-12-16 Murray Cumming Remove more unnecessary null checks before delete 2010-12-16 Murray Cumming Remove unused methods. * glom/libglom/data_structure/glomconversions.cc: * glom/libglom/document/bakery/document.cc: * glom/libglom/document/bakery/document.h: * glom/libglom/document/bakery/document_xml.cc: * glom/libglom/document/bakery/document_xml.h: * glom/libglom/document/document.cc: * glom/libglom/document/document.h: * glom/utility_widgets/canvas/test_canvas_editable.cc: Remove unused methods, found by cppcheck. Some other methods that cppcheck mentions seem to be virtual methods that are used. 2010-12-16 Murray Cumming Remove unnecessary checks before use of delete. * glom/application.cc: * glom/bakery/app_withdoc.cc: * glom/bakery/app_withdoc_gtk.cc: * glom/frame_glom.cc: * glom/libglom/connectionpool.cc: * glom/libglom/data_structure/layout/layoutitem.cc: * glom/libglom/sharedptr.h: * glom/libglom/test_avahi_publisher.cc: * glom/mode_data/box_data_portal.cc: * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: * glom/mode_data/flowtablewithfields.cc: * glom/mode_data/notebook_data.cc: C++ doesn't mind if we call delete on a null pointer. Found by cppcheck. 2010-12-16 Murray Cumming Eclipse project: Tried to specify executable. 2010-12-16 Ben Konrath Add Eclipse 3.6 / CDT 7.0 configuration files. * .cproject: New file generated by Eclipse. * .project: New file generated by Eclipse. 2010-12-16 Murray Cumming Fix make check when using --enable-glom-ui=no. * Makefile_tests.am: Correct the LDADD flags for the selfhosting tests, so that make check still works when using --enable-glom-ui=no. 2010-12-14 Murray Cumming Build: Reduce some duplication. * Makefile.am: * Makefile_glom.am: * Makefile_libglom.am: * Makefile_tests.am: Use AM_CPPFLAGS and AM_CFLAGS just to hold the (optional) warning flags, as we did previously. 2010-12-14 Murray Cumming Build: Avoid use of non-UI cflags/libs where not necessary. * Makefile.am: Do not use AM_CPPFLAGS, AM_CFLAGS or AM_CXXFLAGS. * Makefile_glom.am: * Makefile_libglom.am: * Makefile_tests.am: Instead use individual variables for each target, making sure that we use only the necessary flags. libglom may have been linking to some unnecessary UI libraries before. * glom/import_csv/csv_parser.h: Avoid unnecessary UI includes. * tests/import/test_parsing.cc: * tests/import/test_signals.cc: Avoid including gtkmm.h. As a side-effect, the build is now longer, because some files are now compiled again separately for the tests, presumably because they now need to be built with different compiler flags. But that is a better test. 2010-12-13 Murray Cumming Correct my previous commit. * configure.ac: Correct the no/yes test for --enable-glom-ui and add a comma so it actually works. * Makefile_tests.am: Restore the source file lists for the python tests. 2010-12-13 Murray Cumming Allow libglom to be built without building the Glom UI code too. * configure.ac: Added an --enable-glom-ui option, defaulting to yes. When using --enable-glom-ui=no then only libglom will be built. This is useful for deployment of libglom to servers where the UI dependencies are not wanted. We still use GLOM_LIBS and GLOM_FLAGS even in libglom, instead of using LIBGLOM_LIBS and LIBGLOM_CFLAGS anywhere, but this does reduce duplication of the flags in glom's UI build. * Makefile.am: Do not include Makefile_glom.am if the UI should not be built. * Makefile_glom.am: Move the bin_programs definition to here. * Makefile_libglom.am: Move the LTLIBRARIES definitions to here. * Makefile_tests.am: Attempt, unsuccessfully, to build and run UI-dependent tests only when the UI was built, when running make check. 2010-12-13 Murray Cumming Fix the build with latest gtkmm. * glom/mode_design/print_layouts/window_print_layout_edit.cc: Use Widget::render_icon_pixbuf() instead of the old render_icon() method. 2010-12-09 Bruno Brouard Updated French doc translation 2010-12-08 Murray Cumming More partial porting 2010-12-08 Murray Cumming Partial port to recent gtkmm API changes from git master. * glom/mode_data/datawidget/datawidget.cc: signal_style_changed was removed though it might come back later. * glom/mode_data/datawidget/entry.cc: Use override_color() instead of modify_text(). * glom/mode_data/placeholder-glom.cc: Use set_source_rgba() instead of set_source_color(). Use get_style_context() instead of get_style(). 2010-12-03 Murray Cumming Fix the build with latest gtksourceviewmm from git master. * glom/main.cc: * glom/mode_design/dialog_database_preferences.cc: * glom/mode_design/dialog_database_preferences.h: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/mode_design/fields/dialog_fieldcalculation.h: * glom/mode_design/fields/dialog_fielddefinition.h: * glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.c c: * glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.h : * glom/mode_design/script_library/dialog_script_library.cc: * glom/mode_design/script_library/dialog_script_library.h: * tests/glade_toplevels_instantiation.cc: * tests/test_glade_derived_instantiation.cc: Change the gtksourceview namespace to Gsv. 2010-12-03 Murray Cumming Fix the build with latest gtkmm from git master. * glom/mode_design/dialog_add_related_table.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/script_library/dialog_script_library.cc: * glom/mode_design/users/dialog_choose_user.cc: * glom/mode_design/users/dialog_users_list.cc: Adapt to the ComoboBoxText append_text() -> append() change. 2010-11-29 Murray Cumming Replaced GtkRuler with GimpRuler because GtkRuler was removed from GTK 3. * glom/utility_widgets/gimpruler/: Added several source files from gimp, with small changes to make it build for us, to provide the GimpRuler widget. * COPYING: Switch to GPL version 3 (instead of 2), because the GIMP source code uses it. * Makefile_glom.am: * glom/glom_developer.glade: * glom/mode_design/print_layouts/window_print_layout_edit.[cc|cc]: Use GimpRuler instead of GtkRuler, creating and adding them in code instead of in the .glade file, to avoid Glade needing to know about that widget. 2010-11-23 Murray Cumming 1.19.2 2010-11-23 Murray Cumming Fix the tests build during distcheck * Makefile_glom.am: Correct eggspreadtablemm.c to eggspreadtablemm.cc. * Makefile.am: * Makefile_tests.am: Distribute the albums.csv test file and put the path to its directory in a define. * tests/import/test_parsing.cc: Use the define here, instead of using get_current_directory, which is not enough when builddir!=srcdir. 2010-11-23 Murray Cumming Correct NEWS 2010-11-17 Javier Jardón Use upstream gettext instead Glib one * configure.ac: Do not use AM_GLIB_GNU_GETTEXT() because it is no longer maintained/recommended. This fixes bug #631367 2010-11-17 Murray Cumming Improved a comment 2010-11-17 Murray Cumming Import tests: Uncomment some tests and make them test what we really want. * tests/import/test_parsing.cc: Check that we do _not_ require ending newlines and check that we do _not_ require quotes around items. 2010-11-15 Murray Cumming Import tests: Disable more tests that do not seem useful. * tests/import/test_parsing.cc: Comment out the non-comma separators test and the ignoring-space-between-quoted-text test, because they don't seem to correspond to any specification. 2010-11-15 Murray Cumming Import tests: Disable tests that check for incorrect or useless behaviour. * tests/import/test_parsing.cc: Comment out the test to ensure that we - Ignore rows with no ending newline. - Ignore field values that are not quoted. because we should not do that. Also add comments explaining the regular expressions. 2010-11-14 Murray Cumming Re-enable the import tests and partially deal with their race condition. * Makefile_tests.am: Re-enable the import tests. * glom/import_csv/csv_parser.[h|cc]: Add ensure_idle_handler_connection(), moving the idle signal handler connection there. Also call it from the beginning and end of on_file_read(), in case it has been disconnected too early. Use a priority less than PRIORITY_DEFAULT_IDLE, so that IO is likely to happen more often than the idle callback. 2010-11-12 Murray Cumming Import tests: Slight code-style change. * tests/import/utils.[h|cc]: Remove the MainLoop typedef because it just obscures things. 2010-11-12 Murray Cumming Remove some debug output. 2010-11-12 Murray Cumming Improved the ChangeLog entry. 2010-11-12 Murray Cumming CSV Import: Actually preview and import the field values. * glom/import_csv/csv_parser.cc: advance_field(): Remove an excess continue, so that we actually add the character to the field's text. This error was probably introduced while removing the non-exceptions ifdefs. We really must fix those import unit tests so that something like this does not happen again. 2010-11-11 Murray Cumming List view: Make the retry option actually work afer entering invalid data. * glom/mode_data/db_adddel/db_adddel.[h|cc]: on_treeview_cell_edited(): If the user chooses to retry the edit, remember what he entered, and restart the editing (in an idle handler, to avoid confusing the treeview), with that text. This fixes bug #167818 2010-11-10 Murray Cumming Update EggSpreadTable from libegg. * glom/utility_widgets/eggspreadtable/eggspreadtable.c: Copy from libegg/libegg/spreadtable/ again, to use Tristan's corrections for the forall() vfunc. 2010-11-08 Murray Cumming Call xmlCleanupParser() because libxml++ does not anywmore. * glom/main.cc: main(): Call xmlCleanupParser() to clean up libxml to help valgrind. 2010-11-08 Murray Cumming FlowTableWithFields: Fix some widget expansion behaviour. * glom/mode_data/datawidget/label.cc: Call Gtk::Label::set_line_wrap() to prevent the label from sometimes making the window insanely wide by demainding too much width for itself. * glom/mode_data/flowtablewithfields.cc: add_field_at_position(): Tell the field's widget to expand, so it uses more space if the user expands the window, instead of just expanding the gap between columns. Note that the old non-EggSpreadTable code only expanded the right-most column, so exanding both is a real improvement. 2010-11-08 Murray Cumming Fix previous commit. 2010-11-08 Murray Cumming EggSpreadTable: forall(): Avoid use of invalid GList items. * glom/utility_widgets/eggspreadtable/eggspreadtable.c (egg_spread_table_forall): Use (and later free) a copy of the list, because the callback could call egg_spread_table_remove() which would change the list, causing us to use a list->next that is no longer valid. This fixes a problem found by valgrind. I don't know why other Gtk containers don't need to do this, though their code seems to do the same thing. 2010-11-08 Murray Cumming Added test_flowtablewithfields. * Makefile_tests.am: * glom/mode_data/test_flowtablewithfields.cc: Added the beginnings of a test of FlowTableWithFields. 2010-11-08 Murray Cumming Slight code formatting improvement 2010-11-08 Murray Cumming test_flowtable: Make less silly 2010-11-08 Murray Cumming test_flowtable: Test removing and re-adding 2010-11-05 Murray Cumming Use EggSpreadTable instead of GtkSpreadTable (not added to GTK+). * glom/utility_widgets/eggspreadtable/eggspreadtable.[h|cc]: * glom/utility_widgets/eggspreadtable/testspreadtable.c * glom/utility_widgets/eggspreadtablemm/eggspreadtablemm.[h|cc]: * glom/utility_widgets/eggspreadtablemm/private/eggspreadtablemm_p. h: New files. * glom/Makefile_glom.am * glom/Makefile_tests.am: Mention the new files. * glom/utility_widgets/flowtable.[h|cc]: Use Egg::SpreadTable instead of Gtk::SpreadTable. 2010-11-04 Murray Cumming Remove the gconfmm dependency, because we don't use it. * configure.ac: Do not check for gconfmm. * glom/bakery/app_withdoc.cc: Do not include gconfmm.h. 2010-11-04 Murray Cumming Mark 1.19.1 in the ChangeLog 2010-11-04 Murray Cumming 1.19.1 2010-11-04 Murray Cumming Add 1.6.1 NEWS 2010-10-30 Carles Ferrando Updated Catalan (Valencian) translation 2010-10-28 Bruno Brouard Updated French translation 2010-10-27 Murray Cumming Fix the build with latest gtkmm 2.91.2 * glom/mode_design/dialog_add_related_table.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/script_library/dialog_script_library.cc: * glom/mode_design/users/dialog_users_list.cc: Use ComboBoxText::remove_all() instead of clear_items(). 2010-10-25 Aron Xu Update Simplified Chinese translation. 2010-10-22 Matej UrbanÄiÄ Added sl for Slovenian translation 2010-10-22 Matej UrbanÄiÄ Updated Slovenian translation 2010-10-19 Murray Cumming libglom: Change the ABI to 1.20, to avoid clashing with 1.16. * configure.ac: * glom/libglom/init.h: * glom/python_embed/python_module/py_glom_module.cc: * tests/test_load_python_library.cc: Change it everywhere, also correcting the python library name, which should have _ instead of . That was broken recently. 2010-10-19 Murray Cumming libglom: Change the ABI to 1.20, to avoid clashing with 1.16. * configure.ac: * glom/libglom/init.h: * glom/python_embed/python_module/py_glom_module.cc: * tests/test_load_python_library.cc: Change it everywhere. 2010-10-19 Murray Cumming distcheck: Remove check for NEWS update. * configure.ac: AM_INIT_AUTOMAKE(): Remove check-news because it is not clever enough and because it prevents checking that distcheck works. 2010-10-19 Murray Cumming Choices Combo: Fix a warning. * glom/mode_data/datawidget/combo.cc: set_choices_fixed(), set_choices_related(): Do not try to re-pack the existing cell. 2010-10-19 Murray Cumming Removed binaries added recently in error. 2010-10-19 Murray Cumming Choices Combo: Fix a segfault. * glom/mode_data/datawidget/combo.cc: set_choices_fixed(), set_choices_related(): Handle the has-entry case better, not calling clear(), because that breaks GtkComboBox, which then tries to use a removed GtkCellRenderer. 2010-10-18 Murray Cumming Details: Let the combo drop-down be wide enough. * glom/mode_data/datawidget/combo.cc: Constructor: Use the new set_popup_fixed_width() method. 2010-10-18 Murray Cumming Fix typos in NEWS 2010-10-18 Murray Cumming Add NEWS entries from 1.16. 2010-10-18 Murray Cumming Tests: Fix a typo to fix make check. * tests/test_load_python_library.cc: Fix a typo to properly load the correct library name. 2010-10-18 Murray Cumming Fix the build with the latest gtkmm. * Makefile_glom.am: * po/POTFILES.in: * glom/mode_data/datawidget/comboentry.[h|cc]: Removed this. * glom/mode_data/datawidget/combo.cc: Add a has_entry parameter to the constructor and handle that in set_choices_related(). 2010-10-14 Murray Cumming Build fixes after recent commits. * glom/libglom/db_utils.cc: * glom/libglom/utils.cc: * glom/mode_data/datawidget/cellrenderer_dblist.cc: Adde back some includes of iostream and fix a size type. 2010-10-14 Murray Cumming FlowTable: More fixes for child HBox memory management. * glom/utility_widgets/flowtable.cc: Added checks and corrections, though there is still an odd warning about a refcount. 2010-10-14 Murray Cumming FlowTable: Fix child HBox memory management. * glom/utility_widgets/flowtable.[h|cc]: insert(), remove_all(), remove(), destructor: Remember the implementation-only Gtk::HBox widgets and delete them when appropriate. A simple Gtk::manage() was not enough for this. 2010-10-12 Murray Cumming FlowTable: Avoid some runtime warnings. * glom/utility_widgets/flowtable.[h|cc]: Re-add remove(). get_column_for_first_widget(): Fix the implementation when it deals with children of the hbox. * glom/mode_data/flowtablewithfields.cc: Destructor: Avoid use of remove(widget), because it is complicated. 2010-10-12 Murray Cumming FlowTable: Implement insert_before(). * glom/utility_widgets/flowtable.[h|cc]: Re-added insert_before() which we will need for drag and drop support. 2010-10-11 Murray Cumming Details: Use of GtkSpreadTable: Remove FlowTable:m_children. * glom/utility_widgets/flowtable.[h|cc]: Remove m_children and remove the remove() override, simplifying things. 2010-10-11 Murray Cumming Details: Use of GtkSpreadTable: Use specified alignement again. * glom/mode_data/flowtablewithfields.cc: * glom/utility_widgets/flowtable.[h|cc]: FlowTableItem: Remove the m_expand_first_full and m_expand_second members, because we no longer need to remember that information. add(): Use set_halign() to specify fill/left depending on the expand choice. 2010-10-11 Murray Cumming Details: Use of GtkSpreadTable: Align widgets again. * glom/mode_data/flowtablewithfields.cc: apply_size_groups_to_labels(): Re-enable the code to align adjacent widgets. * glom/utility_widgets/flowtable.[h|cc]: get_column_for_first_widget(): Bring this code back, this time using the new gtk_spread_table_get_child_line() function. 2010-10-11 David King Change some uses of long to more appropriate types * glom/libglom/python_embed/py_glom_record.[cc|h]: * glom/libglom/python_embed/py_glom_related.[cc|h]: * glom/libglom/python_embed/py_glom_relatedrecord.[cc|h]: * glom/libglom/utils.cc: * glom/utility_widgets/db_addel/glom_db_treemodel.cc: * glom/utils_ui.cc: Use other types than long where appropriate. 2010-10-11 David King Use array notation where appropriate * glom/dialog_connection.[cc|h]: * glom/dialog_existing_or_new.[cc|h]: * glom/dialog_invalid_data.[cc|h]: * glom/libglom/connectionpool_backends/postgres.cc: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/connectionpool_backends/sqlite.cc: * glom/utils_ui.cc: Use array notation when initializing constant character arrays. 2010-10-11 David King Use unsigned integers where appropriate * glom/libglom/connectionpool_backends/postgres.[cc|h]: * glom/libglom/connectionpool_backends/postgres_central.[cc|h]: * glom/libglom/connectionpool_backends/postgres_self.[cc|h]: * glom/libglom/data_structure/glomconversions.[cc|h]: * glom/libglom/document/document.[cc|h]: Use unsigned integers where the variable cannot be negative. 2010-10-09 Petr Kovar Update Czech translation by Marek Cernocky 2010-10-08 David King Remove some unnecessary includes * glom/bakery/app.h: * glom/base_db_table.h: * glom/base_db_table_data.h: * glom/box_db_table.h: * glom/libglom/sharedptr.h: * glom/mode_design/fields/combo_fieldtype.h: * glom/mode_design/relationships_overview/ dialog_relationships_overview.cc: Remove some unnecessary includes. * glom/bakery/app_withdoc_gtk.cc: * glom/base_db_table_data.cc: * glom/glom_privs.cc: * glom/import_csv/csv_parser.cc: * glom/import_csv/dialog_import_csv.cc: * glom/import_csv/dialog_import_csv_progress.cc: * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool_backends/postgres.cc: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/connectionpool_backends/sqlite.cc: * glom/libglom/data_structure/field.cc: * glom/libglom/document/bakery/document.cc: * glom/libglom/document/bakery/document_xml.cc: * glom/libglom/document/document.cc: * glom/libglom/python_embed/py_glom_record.cc: * glom/mode_data/notebook_data.cc: * glom/mode_design/dialog_database_preferences.cc: * glom/mode_design/iso_codes.cc: * glom/mode_design/layout/combobox_fields.cc: * glom/mode_design/layout/dialog_layout_calendar_related.cc: * glom/mode_design/layout/dialog_layout_list_related.cc: * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/translation/combobox_locale.cc: * glom/mode_design/translation/dialog_identify_original.cc: * glom/navigation/box_tables.cc: * glom/print_layout/canvas_layout_item.cc: * glom/python_embed/glom_python.cc: * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/layoutwidgetmenu.cc: * glom/utility_widgets/notebooklabelglom.cc: Add iostream include. 2010-10-08 Murray Cumming Details: FlowTable: Initial use of GtkSpreadTable instead of custom code. * glom/utility_widgets/flowtable.[h|cc]: Derive from GtkSpreadTable, removing API and implementation that is then provided by that base class. * glom/utility_widgets/flowtable_dnd.[h|cc]: Remove FlowTable_DND (and its use for now. We will need to reimplement it somehow with GtkSpreadTable, hopefully in a simpler way. * glom/mode_data/box_data_details.cc * glom/mode_data/flowtablewithfieldse.[h|cc]: * glom/utility_widgets/test_flowtable.cc: Adapted. 2010-10-07 Daniel Mustieles Updated Spanish translation 2010-10-07 Murray Cumming Choices: Do not offer editing formatting features when choosign extra fields. * glom/mode_design/layout/layout_item_dialogs/box_formatting.[h|cc]: Rename the two set_formatting() methods to set_formatting_for_non_field(), without the show_choices option and set_formatting_for_field(). This avoids using the wrong one at the wrong time. set_is_for_print_layout(): Rename to set_is_for_non_editable() and change the implementation to make it more generic. * glom/base_db.[h|cc]: offer_field_formatting(): Rename one overload to offer_non_field_item_formatting() and add a show_editable_options parameter to the field one. * glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.[h|cc]: set_field(): Added a show_editable_options bool parameter. Hide the editable checkbox and tell Box_Formatting not to show editing options. * glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.[h|cc]: * glom/mode_design/layout/layout_item_dialogs/dialog_formatting.[h|cc]: * glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc: * glom/mode_design/print_layouts/dialog_text_formatting.[h|cc]: * glom/mode_design/report_layout/dialog_layout_report.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/layout/dialog_layout_details.cc: * glom/print_layout/canvas_print_layout.cc: Adapted. 2010-10-06 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-10-06 Murray Cumming Avoid SQL errors about invalid ORDER BY fields. * glom/mode_data/box_data_list.cc: create_layout(): * glom/mode_data/box_data_list_related.cc: create_layout(): Don't call set_columns() before set_found_set(), to avoid SQL parsing errors due to using invalid fields for sort (ORDER BY) clauses. 2010-10-06 Murray Cumming Some use of G_STRFUNC 2010-10-05 David King Avoid uninitialized variables in CanvasGroupGrid * glom/utility_widgets/canvas/canvas_group_grid.cc: Initialize variables at declaration. 2010-10-05 Murray Cumming Choices Layout: Fields List: Slight improvement. * glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.[h|cc]: Append new fields to the end instead of the start. 2010-10-04 Mario Blättermann [i18n] Updated German translation 2010-10-04 Murray Cumming Combo Choices: Extra fields dialog: Fix the title. * glom/glom_developer.glade: dialog_fieldslist: Remove the title, which was the old title left over from when this was just for secondary sort fields. * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc: Set the title manually so it is appropriate to each use. 2010-10-04 Murray Cumming CellRendererDbList: Show related choices. * glom/mode_data/datawidget/combochoiceswithtreemodel.[h|cc]: Rename type_model_columns and co with a _fixed suffix, to avoid using them for the related case. * glom/mode_data/datawidget/cellrenderer_dblist.[h|cc]: on_editing_started(): Pack extra cells for the related case too, separating the fixed and related cases into separate methods. 2010-10-04 Murray Cumming ComboEntry: Actually show the text value in the drop-down. * glom/mode_data/datawidget/treemodel_db_withextratext.cc: get_value_vfunc(): Use m_column_index_key instead of get_value_key() because that is not set, because we do not call set_value_key() for each row. I will try to remove that maybe-unused API. * glom/mode_data/datawidget/comboentry.cc: set_choices_related(): Set up a cell_data_func for the automaticaly-added cell when we repack it, because calling clear() (to unpack it) disconnects the model-view association for that cell. 2010-10-04 Murray Cumming TreeModelDbWithExtraText: Fix the use of Glib::Value. * glom/mode_data/datawidget/treemodel_db.cc: Intialize m_column_index_key to -1 so we can really check that it is uninitialized. * glom/mode_data/datawidget/treemodel_db_withextratext.cc: get_value_vfunc(): Initialize both value instances and always set the output value. 2010-10-04 Murray Cumming Fix typo 2010-10-04 Murray Cumming ComboEntry: Fix silly typo. * glom/mode_data/datawidget/comboentry.cc: Remove left-over for() loop. 2010-10-04 Murray Cumming Choices: Fix the custom tree model. * glom/mode_data/datawidget/cellrenderer_dblist.cc: Use the virtual text column here too. * glom/mode_data/datawidget/treemodel_db_withextratext.cc: Call the ObjectBase constructor with a custom typename, as in the base class. This is necessary because ObjectBase is a virtual base class. 2010-10-04 Murray Cumming Fix the previous commit. * glom/mode_data/datawidget/treemodel_db.cc: Constructor: Actually fill m_column_fields so there are some columns in the tree model. 2010-10-04 Murray Cumming Choices combos: Fix ComboBoxEntry by using a virtual text column. * glom/mode_data/datawidget/treemodel_db.[h|cc]: Simplify the create() methods, removing the one that takes TreeModelColumns. * Makefile_glom.am: * glom/mode_data/datawidget/treemodel_db_withextratext.[h|cc]: A derived model (actually always used, but it keeps the code separate) that has an extra virtual text model, because GtkComboBoxEntry requires a text column. ( https://bugzilla.gnome.org/show_bug.cgi?id=631167 ) * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: set_choices_related(): Use the new derived model instead. * glom/mode_data/db_adddel/db_adddel.cc: Adapted. * glom/mode_data/datawidget/comboentry.cc: set_choices_related(): Use the virtual text column. 2010-10-04 Jon Nordby Set programming language for --enable-warnings macros The C++ warnings flags were being checked against the C compiler, which would silently fail if one were to use C++ specific warning flags 2010-10-02 Murray Cumming Choices combos: Reuse the list view implementation. Only works for Combo now. * glom/mode_data/db_adddel/treemodel_db.[h|cc]: Moved to: * glom/mode_data/datawidget/treemodel_db.[h|cc]: so we can use it for the choices combo widgets too. * glom/mode_data/datawidget/combochoices.[h|cc]: set_choices_related(): Make this pure virtual. Remove set_choices_with_second(). * glom/mode_data/datawidget/cellcreation.[h|cc]: create_cell(): Use set_choices_related() instead of getting all rows as a list and using set_choices_with_second(). * glom/datawidget/combochoiceswithtreemodel.[h|cc]: Override set_choices_related() and cell_connect_cell_data_func(). Remove the use_model() pure virtual method. * glom/mode_data/datawidget/cellrenderer_dblist.[h|cc]: * glom/mode_data/datawidget/combo.[h|cc]: * glom/mode_data/datawidget/comboentry.[h|cc]: * glom/mode_data/datawidget/combo_as_radio_buttons.[h|cc]: Adapt, setting up the view in overrides of set_choices_fixed() and set_choices_related() instead of use_model(), and being value-based where possible instead of converting values to and from text. * glom/mode_data/db_adddel/db_adddel.[h|cc]: Move create_model_db() to DbTreeModel::create_from_items() so we can use it for the combo choice widgets too. refresh_cell_choices_data_from_database_with_foreign_key(): Use set_choices_related() instead of getting all rows as a list and using set_choices_with_second(). 2010-10-01 Murray Cumming Fix (unlikely) possible null dereferences shown by cppcheck. * Several files: Check the output parameter when getting widgets from glade. When this fails there is already a stderr warning and we could not recover anyway, but this helps cppcheck or maybe other chekers to only tell us interesting things. 2010-10-01 Murray Cumming DbUtils: Move fill_full_field_details() here from Base_DB. * glom/base_db.[h|cc]: Move fill_full_field_details() from here to: * glom/libglom/db_utils.[h|cc]: here, so it can be used more generally, and because it isn't actually used much now, so it's just making Base_DB look even more complicated than it is. * glom/report_builder.cc: Adapted. 2010-10-01 Murray Cumming Document: fill_layout_field_details(): Handle choices layouts too. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: set_choices_related(): Take non-const parameters. Added a non-const version of get_choices_related() so we can update the full field details later. * glom/libglom/document/document.cc: fill_layout_field_details(): Also try to update the field details in the choices lists. 2010-09-29 Murray Cumming Fix the build with the latest gtkmm 3 API. * glom/application.cc: * glom/dialog_existing_or_new.cc: * glom/frame_glom.cc: * glom/mode_design/translation/window_translations.cc: Use FileFilter via RefPtr. * glom/bakery/app_withdoc_gtk.cc: Use RecentFilter via RefPtr. * glom/mode_data/db_adddel/db_adddel.cc: * glom/mode_data/placeholder-glom[h|cc]: * glom/utility_widgets/flowtable[h|cc]: * glom/utility_widgets/imageglom.[h|cc]: Change use of get_size() to get_preferred_size() and change on_expose_event() to on_draw(). 2010-09-24 Murray Cumming Fix the build. * glom/libglom/document/document.cc: Restore missing tag names mistakenly removed in a previous commit. 2010-09-24 Murray Cumming Const corrections in use of LayoutItem and LayoutItem_Field in vectors. This allows DbTreeModel to take a vector of const items. 2010-09-24 David King Improve use of defines * *.h: Be more consistent with include guards. * glom/dialog_existing_or_new.cc: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/document/document.cc: Convert defines to static const data. 2010-09-23 Murray Cumming DbAddDel: Some code rearrangement. * glom/base_db_table_data_readonly.h: * glom/mode_data/db_adddel/db_adddel.[h|cc]: Split the db treemodel creation up into a separate function, ready for reuse by choices combo widgets. 2010-09-23 Murray Cumming DbAddDel: Replace add_columns() with set_columns(), simplifying the code. * glom/libglom/data_structure/layout/layoutgroup.[h|cc]: Added non-const version of get_items_recursive(). * glom/mode_data/db_adddel/db_adddel.[h|cc]: Remove add_columns() and set_columns_ready(), replacing them with set_columsn() which takes a list of layout items. Remove DbAddDelColumnInfo because we do not use its other member variables, replacing it with the simple list of layout items. * glom/mode_data/db_adddel/treemodel_db.[h|cc]: Improve debug out. * glom/mode_find/box_data_list_find.cc: * glom/mode_data/box_data_list.[h|cc]: * glom/mode_data/box_data_list_related.[h|cc]: Adapted. 2010-09-23 Murray Cumming Added missing files 2010-09-23 Murray Cumming Move code into a create_cell() utility function. * glom/mode_data/db_adddel/cellrenderer*.[h|cc]: Move to * glom/mode_data/datawidget/. * glom/mode_data/db_adddel/db_adddel.[h|cc]: construct_specified_columns_cellrenderer(): Move some code into: * glom/mode_data/datawidget/cellcreation.[h|cc]: Added create_cell(). This is less efficient, because we repeat some dynamic casts, but it makes construct_specified_columns_cellrenderer() less awfully huge by separating the code that supports cell editing. And it makes the code available to ComboChoices widgets later. 2010-09-22 Murray Cumming Fix the build with latest unstable gtkmm 3. * glom/mode_data/db_adddel/db_adddel.cc: Adapt to CellSizeRequest::get_size(). 2010-09-22 Murray Cumming ComboChoices: Renamed set_choices() to set_choices_fixed() * glom/mode_data/datawidget/combochoices.h: Rename set_choices() to set_choices_fixed() to make code clearer. * glom/mode_data/datawidget/combo_as_radio_buttons.[h|cc] * glom/mode_data/datawidget/combochoiceswithtreemodel.[h|cc] * glom/mode_data/datawidget/datawidget.cc: * glom/mode_data/db_adddel/db_adddel.cc: Adapted. 2010-09-18 Mario Blättermann [i18n] Updated German translation 2010-09-18 Murray Cumming Split Base_DB_Table_Data into a read-only base class. * glom/Makefile_glom.am: * po/POTFILES.in: * glom/base_db_table_data_readonly.[h|cc]: Created this new class from parts of: * glom/base_db_table_data.[h|cc]: which now derives from it. This let us use it for classes that do not allow the user to change the data. For instance, choice combo boxes. 2010-09-18 Daniel Mustieles Updated Spanish translation 2010-09-17 Murray Cumming Fix the build with gtkmm 3 from git master. * glom/utility_widgets/flowtable.cc: Use SizeRequest::get_size() instead Gtk::Widget::size_request(), removed in gtkmm 3. 2010-09-15 Murray Cumming Replace use of ALIGN_LEFT/RIGHT/TOP/BOTTOM with START/END. * glom/mode_data/flowtablewithfields.cc: * glom/print_layout/canvas_layout_item.cc: Use only the non-deprecated enum values. 2010-09-14 Bruno Brouard Updated French translation 2010-09-12 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-09-11 Murray Cumming DbAddDel: Cleanup: Rename glom_db_treemodel.[h|cc] to treemodel_db.[h|cc]. * glom/mode_data/db_adddel/glom_db_treemodel.[h|cc]: * glom/mode_data/db_adddel/treemodel_db.[h|cc]: Also rename the class from DbTreeModel to TreeModelDb to match. 2010-09-11 Murray Cumming Remove unused typedef. 2010-09-11 Murray Cumming Choices combo widgets: Improve the API. * glom/mode_data/datawidget/combochoiceswithtreemodel.[h|cc]: Make create_model() non virtual, instead adding a pure virtual use_model(). * glom/mode_data/datawidget/combo.[h|cc]: * glom/mode_data/datawidget/comboentry.[h|cc]: * glom/mode_data/db_adddel/cellrenderer_dblist.[h|cc]: Change the create_model() overrides to use_model() overrides. 2010-09-11 Murray Cumming Choices combo widgets: Initial work to make the model generic. * glom/mode_data/datawidget/combochoiceswithtreemodel.[h|cc]: Change m_refModel to a generic TreeModel, make it private ,and add a get_choices_model() accessor, as a step to optionally using a db-based treemodel like Db_AddDel. * glom/mode_data/datawidget/combo.cc: * glom/mode_data/datawidget/comboentry.cc: * glom/mode_data/db_adddel/cellrenderer_dblist.cc: Adapted. 2010-09-10 Murray Cumming Correct the POTFILES.in file. 2010-09-10 Murray Cumming Moved the Db_AddDel code. * glom/utility_widgets/db_adddel/*.[h|cc]: Moved this to * glom/mode_data/db_adddel/ because that is where it is used. 2010-09-10 Murray Cumming DbUtils: Improve debug output. * glom/libglom/db_utils.cc: query_execute_select(): Try to get more information about a connection timeout error when it happens. 2010-09-10 Murray Cumming Tests: derived instantiation: Test an extra dialog. * glom/mode_design/layout/dialog_layout_calendar_related.h: Correct the name of the header guard, to avoid a clash. * tests/test_glade_derived_instantiation.cc: Enable the test for this dialog. 2010-09-10 David King Make pc.in file unversioned * configure.ac: Additionally specify source file for unversioned glom.pc.in. * glom/libglom/glom-1.16.pc.in: Move to unversioned glom/libglom/glom.pc.in, which will be moved to a versioned file by configure. 2010-09-10 David King Use GLOM_ABI_VERSION in Makefiles and configure.ac * Makefile.am: * Makefile_libglom.am: * configure.ac: Use GLOM_ABI_VERSION to reduce duplication. 2010-09-10 Murray Cumming Use libosso instead of libossomm on Maemo * configure.ac: * glom/main.cc: Use libosso instead of libossomm, because we just use one function. 2010-09-10 Murray Cumming Dialog_Layout_Report: Fix a crash, making all tests pass. * glom/mode_design/report_layout/dialog_layout_report.[h|cc]: Disconnect a signal handler in the destructor to avoid a crash when the GtkNotebook signal handler is called later, though we should fix that in GtkNotebook. 2010-09-09 Murray Cumming Choices drop-downs: More improvement of the column alignment. * glom/mode_data/datawidget/comboentry.cc: create_model(): * glom/utility_widgets/db_adddel/cellrenderer_dblist.[h|cc]: on_editing_started(): Remove (with clear) the automatically-added CellRenderer and re-pack it, so we can specify expand=false. 2010-09-09 David King Initial dialog: Really try to load examples from each path. * glom/dialog_existing_or_new.[h|cc]: list_examples_at_path(): Use synchronous IO rather than asynchronous, to solve bug #626417. This means that we really check the result of trying the first directory, so we can try the other location too. 2010-09-09 Murray Cumming Choices drop-down: Remove hack to fix the list view choices. * glom/utility_widgets/db_adddel/cellrenderer_dblist.cc: Constructor: Remove the hacky call to Glib::ObjectBase(0) because it stopped on_start_editing() from being called, stopping the extra columns from being shown. 2010-09-09 Murray Cumming Choices drop-downs: Improve the column alignment. * glom/mode_data/datawidget/combo.cc: create_model(): * glom/mode_data/datawidget/comboentry.cc: create_model(): * glom/utility_widgets/db_adddel.cc: on_start_editing(): Use expand=false with pack_start() with the first column, plus xalign=0, so we can actually align the columns, though it only really works if the previous columns have values all of a similar width. And this doesn't work with ComboEntry or the cell renderer because GtkComboBoxEntry and GtkCellRendererCombo do the pack_start() of the first column automatically - see the comments. 2010-09-09 Murray Cumming Choices drop-downs: Improve the column alignment. * glom/mode_data/datawidget/combo.cc: create_model(): * glom/mode_data/datawidget/comboentry.cc: create_model(): * glom/utility_widgets/db_adddel.cc: on_start_editing(): Use expand=false with pack_start() with the first column, plus xalign=0, so we can actually align the columns, though it only really works if the previous columns have values all of a similar width. And this doesn't work with ComboEntry or the cell renderer because GtkComboBoxEntry and GtkCellRendererCombo do the pack_start() of the first column automatically - see the comments. 2010-09-09 Murray Cumming Removed some debug output 2010-09-09 Murray Cumming List view: Support multiple extra fields in choices here too. * glom/utility_widgets/cellrendererlist/cellrendererlist.[h|cc]: Split this into: * glom/utility_widgets/cellrendererlist.[h|cc]: with no extra/second-column functionality. It is now just a convenience class for a string-based combo cell. And into this: * glom/utility_widgets/db_adddel/cellrenderer_dblist.[h|cc]: deriving from ComboChoicesWithTreeModel, like the regular combo widgets. Remove non-DB API. * glom/utility_widgets/db_adddel/db_adddel.cc: Adapted. 2010-09-08 Marek ÄŒernocký Updated Czech translation 2010-09-08 Murray Cumming Combo widgets: Support multiple extra fields. * glom/libglom/utils.cc: get_choice_values(): Actually get extra values other than than the first one, by actually using the index instead of just 1. * glom/mode_data/datawidget/combochoiceswithtreemodel.[h|cc]: Added a virtual create_model(), to create model columns dynamically. So far they are just text columns. set_choices_with_second(): Recreate the model here each time. * glom/mode_data/datawidget/combo.[h|cc]: * glom/mode_data/datawidget/comboentry.[h|cc]: Override create_model() to also set up the view columns using the widgets' specific API. * glom/mode_data/datawidget/combochoices.h: set_choices_related(): Stop this from being virtual because we no longer override it. 2010-09-08 Murray Cumming Initial support for multiple show-also fields in related choices. * glom/glom_developer.glade: Formatting box: related choices: Replace the second-field combo with a label and an edit button, to open a layout dialog allowing multiple items (fields). * glom/mode_design/layout/layout_item_dialogs/box_formatting.[h|cc]: Add the code for that. * glom/mode_design/fields/dialog_fielddefinition.cc: Handle changes to the extra layout group in BoxFormatting. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: Added a get_has_related_choices() with a has_second& parameter. Added a get_choices_related_relationship() convenience method. set/get_choices_related(): Change the field_second string parameter to a full LayoutGroup, allowing multiple items (fields). * glom/libglom/data_structure/layout/layoutgroup.[h|cc]: Added a get_items_recursive() convenience method. Adapt to the FieldFormatting change. * glom/libglom/document/document.cc: load_after_layout_item_formatting(), save_before_layout_item_formatting(): For the related choices extra fields, save an entire layout group instead of just a field name, supporting the deprecated way for documents with the old file format version. * glom/libglom/utils.[h|cc]: get_choice_values(): Do not take the first and second fields as parameters. Instead get the information from the layout item. Support multiple fields, via the new layout group. Added get_list_of_layout_items_for_display() to show a preview of the layout group (list of fields) in the label in BoxFormatting. * glom/mode_data/flowtablewithfields.cc: Adapt to the FieldFormatting change. * glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc: update_labels(): Improve this code, using the new Utils::get_list_of_layout_items_for_display() method. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Adapt to these changes. * glom/mode_data/datawidget/combo.[h|cc]: * glom/mode_data/datawidget/combo_as_radio_buttons.cc: * glom/mode_data/datawidget/combochoices.[h|cc]: * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: * glom/mode_data/datawidget/comboentry.[h|cc]: set_choices_related(): Don't take the extra fields as a parameter. Instead discover them from the layout item. set_choices_with_second(): Change the list_value's parameter type to support multiple second values. refresh_data_from_database_with_foreign_key(): Adapt the to the use of a layout group instead of second field name, though this currently only uses the first field. * glom/mode_data/datawidget/datawidget.cc: Adapt to the combo API changes. * glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.cc: Make some code slightly more robust. Not really a related change. 2010-09-08 Murray Cumming Dialog_Properties: Remove the unnecessary virtual keywords. * glom/utility_widgets/dialog_properties.h: Make methods non-virtual because nothing overrides them. 2010-09-07 Murray Cumming Dialog_FieldsList: Fix a crash. * glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.cc: get_fields(): Do not overwrite the vector, fixing a crash. Looking at this code, I think we also ignore reordering of items, so we should fix that later. 2010-09-07 Murray Cumming Add a --stop-auto-server-shutdown command-line option for debugging. * glom/libglom/connectionpool.[h|cc]: Added set_auto_server_shutdown(). startup(): Only handle the linux crash signal if this is set, so we can instead let gdb handle it. * glom/application.[h|cc]: Added set_stop_auto_server_shutdown() which calls it. * glom/main.cc: Add a --stop-auto-server-shutdown command line option that calls that. 2010-09-07 Murray Cumming Renamed Dialog_GroupBy_SecondaryFields to Dialog_FieldsList. * glom/mode_design/layout/layout_item_dialogs/dialog_groupby_second aryfields.[h|cc]: Rename to dialog_fieldslist.[h|cc]: * glom/glom_developer.glade: Renamed the ID too. adapted. * Makefile_glom.am: * glom/mode_design/layout/layout_item_dialogs/dialog_group_by.h: * tests/test_glade_derived_instantiation.cc: Adapted. This lets me use it for other things too. 2010-09-06 Daniel Mustieles Updated Spanish translation 2010-09-06 Murray Cumming Glade files: Remove mention of removed GtkDialog::has-separator property. * glom/glom.glade: * glom/glom_developer.glade: Remove use of the has-separator property, avoiding runtime warnings from GtkBuilder. 2010-09-06 Murray Cumming Fix the build for the latest goocanvasmm and gtkmm API. * glom/mode_design/relationships_overview/canvas_group_dbtable.cc: * glom/mode_design/relationships_overview/dialog_relationships_over view.cc: * glom/print_layout/canvas_print_layout.[h|cc]: * glom/utility_widgets/canvas/canvas_text_movable.[h|cc]: Use Goocanvas::AnchorType instead of (removed) Gtk::AnchorType. 2010-09-02 Murray Cumming Fix the build with latest gtkmm. * glom/utility_widgets/flowtable.[h|cc]: on_expose_event(): Use Cairo for drawing instead of Gdk::GC, which no longer exists. 2010-09-02 Murray Cumming Avoid use of deprecated cairomm API. * configure.ac: Also check for CAIROMM deprecations. * glom/import_csv/dialog_import_csv.cc: Fix a bad git merge. 2010-08-29 Mario Blättermann [i18n] Updated German translation 2010-08-28 Jorge González Updated Spanish translation 2010-08-25 Petr Kovar Update Czech translation by Marek Cernocky 2010-08-20 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-08-20 Gabor Kelemen Fix escaping of UTF-8 character. Fixes bug #626991 2010-08-19 David King Include the correct config.h * glom/application.cc: * glom/bakery/app_withdoc.cc: * glom/bakery/app_withdoc_gtk.cc: * glom/bakery/app_withdoc_gtk.h: * glom/bakery/dialog_offersave.cc: * glom/bakery/dialog_offersave.h: * glom/libglom/connectionpool_backends/postgres.cc: * glom/libglom/document/bakery/document.cc: * glom/libglom/gst-package.c: * glom/main.cc: * glom/mode_design/translation/window_translations.cc: * glom/python_embed/glom_python.cc: * glom/python_embed/python_module/py_glom_module.cc: * glom/utils_ui.cc: Be sure to include the local config.h. 2010-08-16 Daniel Mustieles Updated Spanish translation 2010-08-12 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-08-12 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-08-11 Marek ÄŒernocký Updated Czech translation 2010-08-10 Murray Cumming SpinButtons: Don't have 0 to 0 ranges with only 0 increments possible. * glom/import_csv/dialog_import_csv.cc: (Import dialog) * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: (Multiline text field height) * glom/utility_widgets/dialog_flowtable.cc: (number of columns in a group): Constructors: Set the range and increment manually, because Glade defaults to useless 0 values for these. This problem was introduced when we remove the extra adjustment objects from the .glade files, so we could simplify our use of Glade. It is a side-effect of GtkBuilder bug http://bugzilla.gnome.org/show_bug.cgi?id=575714 This partially fixes bug #625693 (.cvs file import not working). 2010-08-10 Murray Cumming Catch exceptions from std::locale::global(). * glom/main.cc: Put a try/catch around the call to std::locale::global(), because it is throwing on at least one system under apparently normal circumstances. This should fix bug #619445 (teidooricaerak) or at least give us another clue. 2010-08-09 Murray Cumming test_document_autosave: Change the temp filename to avoid a clash. * tests/test_document_autosave.cc: Rename the file because we sometimes seem to clash with a directory of the same name. 2010-08-09 Murray Cumming Self-Hosting: Don't keep trying indefinitely when trying various ports. * glom/libglom/connectionpool_backends/postgres_self.cc: connect(): Fix a logic error introcuced when removing the no-exceptions ifdefs. Now it only retries when a particular type of error happens, and otherwise fails. 2010-08-09 Murray Cumming Fix the tests. * tests/test_selfhosting_new_empty.cc: * tests/test_selfhosting_new_from_example.cc: Adapt to the recent change return type of ConnectionPool::startup(). 2010-08-07 Murray Cumming Fix the tests build after the merge. * tests/test_selfhosting_new_empty.cc: Fix the use of Utils::. 2010-08-07 Murray Cumming Fix the tests. * tests/test_selfhosting_new_empty.cc: * tests/test_selfhosting_new_from_example.cc: Adapt to the recent change return type of ConnectionPool::startup(). 2010-08-06 Christian Kirbach [i18n] Updated German translation 2010-08-06 Murray Cumming 1.15.2 2010-08-06 Murray Cumming FieldFormatting: Default to show-all for related choices. * glom/libglom/data_structure/layout/fieldformatting.cc: 2010-08-06 Murray Cumming FieldFormatting: Default to show-all for related choices. * glom/libglom/data_structure/layout/fieldformatting.cc: 2010-08-06 Murray Cumming Merged the feature_choices_show_all branch. 2010-08-06 Murray Cumming Formatting: Add get_choices_related() overload to reduce copy/pasted code. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: Added a get_choices_related() overload that returns the LayoutItem_Fields instead of just the field names. This reduces the copy/pasted code in the callers, and makes it easier to support related fields in future. * glom/libglom/utils.[h|cc]: * glom/mode_data/datawidget/combochoices.[h|cc]: * glom/utility_widgets/db_adddel/db_adddel.cc: Adapted and made necessary const corrections. 2010-08-06 Murray Cumming Choices: Fix !show-all lists. * glom/mode_data/datawidget/combochoices.[h|cc]: refresh_data_from_database_with_foreign_key(): Add a document parameter, used to update the cached choices information if necessary. * glom/mode_data/flowtablewithfields.cc: set_field_value(): Adapted. 2010-08-06 Murray Cumming Document loading: Show an error dialog even for unexpected errors. * glom/application.cc: on_document_load(): Don't just fail silently when there is an unexpected error, for instance if the postgres data directory is missing. 2010-08-06 Murray Cumming Utils::get_choice_values(): Reduce copy/pasted code. * glom/libglom/utils.[h|cc]: build_sql_select_with_key(): Add a sort_clause parameter. get_choice_values(field): Rename this to get_choice_values_all() and change the implementation to just call the other get_choice_values(). Add a Document* parameter so we can do that. get_choice_values(document, field, ...): Sort the list by the first field. This should probably be an option in the developer-mode UI. * glom/mode_data/datawidget/combo.h: * glom/mode_data/datawidget/combochoices.[h|cc]: * glom/mode_data/datawidget/comboentry.h: * glom/utility_widgets/db_adddel/db_adddel.cc: get_choice_values(): Adapt to the change, by adding a Document* parameter. * glom/base_db.cc: Adapt. 2010-08-06 David King Minor build system cleanup * configure.ac: Drop unnecessary AC_DISABLE_STATIC. Use AS_IF rather than shell if...fi. Add a TODO. * Makefile.am: * Makefile_tests.am: Take advantage of dependencies to reduce duplication of linker flags. 2010-08-06 Murray Cumming DbAddDel: Avoid some copy/pasting of code to append items to choices cells. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Added set_cell_choices(), using it in refresh_cell_choices_data_from_database_with_foreign_key() and construct_specified_columns_cellrenderer(). 2010-08-06 Murray Cumming List: Choices with !show_all: Update the list when the from_field changes. * glom/libglom/utils.[h|cc]: Added a get_choice_values() overload that takes the foreign_key. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Added get_choice_index() to get the affected choice lists when a field value changes. Added refresh_cell_choices_data_from_database_with_foreign_key() to update these lists. set_value(): Use these methods to update choice lists when appropriate, as already happens in the Details view. 2010-08-05 Murray Cumming List view: When a value is edited, update other instances of the same field. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: get_data_model_column_index(): Add a including_specified_field_layout bool parameter, used in a new set_value() method overload that has a set_specified_field_layout bool parameter. user_changed(): Call set_value() to show the new value in any other instances of the same field. The details view already does this. 2010-08-05 Daniel Mustieles Updated Spanish translation 2010-08-04 Murray Cumming Simplified some code. * glom/mode_data/flowtablewithfields.[h|cc]: set_value(), set_other_value(): Avoid copy/pasting of the code. 2010-08-04 Murray Cumming Choices with !show_all: Update the list when the from_field changes. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: Renamed set/get_choices() to set/get_choices_related(). * glom/libglom/utils.cc: * glom/libglom/document/document.cc: * glom/mode_design/layout/layout_item_dialogs/box_formatting.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: Adapted. * glom/mode_data/datawidget/combochoices.[h|cc]: Remove the non-default constructor that took a second field. Move set_choices_with_second() to private. Add set_choices_related() and matching member variables. Add refresh_data_from_database_with_foreign_key(), like the one in Box_Data_RelatedRecords, which gets the related values and calls set_choices_with_second(). * glom/mode_data/datawidget/combo.[h|cc]: * glom/mode_data/datawidget/combo_as_radio_buttons.[h|cc]: * glom/mode_data/datawidget/combochoiceswithtreemodel.[h|cc]: * glom/mode_data/datawidget/comboentry.[h|cc]: Adapt to the changed ComboChoices base API. * glom/mode_data/datawidget/datawidget.cc: create_combo_widget_for_field(): Do not take the second field as a parameter, because that is now specified later. Constructor: Simplify the code now that ComboChoices does more of the work. * glom/mode_data/flowtablewithfields.cc: set_field_value(): Call refresh_data_from_database_with_foreign_key() on the choice widgets as it already does on the portals, to refresh the list of possible values. 2010-08-02 Murray Cumming FlowTableWithFields: Added get_choices_widgets(from_field). * glom/mode_data/datawidget/datawidget.cc: Constructor: Only fill the choices list at this point if show_all is set. * glom/mode_data/flowtablewithfields.[h|cc]: Addef get_choices_widgets(), like the existing get_portals() methods. 2010-08-02 Murray Cumming Minor const changes. 2010-08-02 Murray Cumming Field Formatting: Related Choices: Add a Show All checkbox. * glom/glom_developer.glade: * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: * glom/mode_design/layout/layout_item_dialogs/box_formatting.[h|cc]: Add a Show All checkbox to the Related Choices section, so the developer may choose to restrict the choices depending on the relationship. The default (the previous behaviour) is to show all records from the related table. * glom/libglom/document/document.cc: save_before_layout_item_formatting(), save_after_layout_item_formatting(): Store the new bool in the document. * glom/libglom/utils.cc: * glom/mode_data/datawidget/datawidget.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: Adapt the code to build, though the behaviour has not changed yet. 2010-07-27 Murray Cumming Fix the tests build after the merge. * tests/test_selfhosting_new_empty.cc: Fix the use of Utils::. 2010-07-27 Murray Cumming Fix the tests build after the merge. * tests/test_selfhosting_new_empty.cc: Fix the use of Utils::. 2010-07-27 Murray Cumming Rename libglom-1.14 to libglom-1.16 (parallel-installable) * configure.ac: Change the GLOM_ABI_VERSION number. * Makefile.am: * Makefile_libglom.am: * docs/pyglom_reference/Makefile.am: * docs/pyglom_reference/index.rst.in: * glom/libglom/init.h: * glom/python_embed/python_module/py_glom_module.cc: * tests/test_load_python_library.cc: * win32/build-installer: * win32/glom.iss.in: Change mentions of 1.14 to 1.16. 2010-07-27 Murray Cumming Rename libglom-1.14 to libglom-1.16 (parallel-installable) * configure.ac: Change the GLOM_ABI_VERSION number. * Makefile.am: * Makefile_libglom.am: * docs/pyglom_reference/Makefile.am: * docs/pyglom_reference/index.rst.in: * glom/libglom/init.h: * glom/python_embed/python_module/py_glom_module.cc: * tests/test_load_python_library.cc: * win32/build-installer: * win32/glom.iss.in: Change mentions of 1.14 to 1.16. 2010-07-27 Murray Cumming Rename libglom-1.14 to libglom-1.16 (parallel-installable) * configure.ac: Change the GLOM_ABI_VERSION number. 2010-07-27 Murray Cumming Adapt to recent gtkmm-3.0 API changes. * glom/bakery/app_withdoc_gtk.cc: Remove use of Gtk::RecentManager::set_limit(). * glom/dialog_existing_or_new.[h|cc]: * glom/frame_glom.[h|cc]: * glom/mode_data/notebook_data..[h|cc]: * glom/mode_design/report_layout/dialog_layout_report.[h|cc]: * glom/notebook_glom.[h|cc]: Replace use of GtkNotebookPage with Gtk::Widget* in switch_page signal handlers. 2010-07-25 Murray Cumming 1.14.5 2010-07-25 Murray Cumming Allow unique fields with same name in multiple tables. * glom/libglom/connectionpool_backends/postgres.cc: change_column(): Prefix the table name to the constraint name when setting/removing the unique-key constraint, as libgda (or PostgreSQL) seems to do when creating a field. This prevents a clash when two tables have the same field name, and both should be unique. This is nasty code anyway that I would rather have in libgda. This fixes bug #625192 (fmyhr). 2010-07-22 Murray Cumming 1.14.4 2010-07-22 Murray Cumming Added --restore command-line option. * glom/application.[h|cc]: Added init() with a bool restore option, calling do_backup_restore() if appropriate. * glom/main.cc: Added a --restore command and pass the bool result to Application::init(). This allows the user to restore from a backup without first loading an existing file, though this is so far only possible via the terminal. 2010-07-22 Murray Cumming Added Developer/Restore Backup menu item. * glom/application.[h.cc]: Added a Developer/Restore Backup menu item, which lets the user choose a .tar.gz, untars it in /tmp/ and opens it. * tests/test_selfhosting_new_empty.cc: * glom/libglom/utils.[h|cc]: Move delete_directory() to Utils. Added get_directory_child_with_suffix(), used to find the .glom file inside an untarred directory. 2010-07-22 Murray Cumming DTD: Mention the startup_script node. * glom/glom_document.dtd: Add the startup_script node, so that the examples validate again. * glom/libglom/document/document.cc: set_child_text_node(): Do not add new empty nodes. This keeps the document smaller. 2010-07-22 Murray Cumming Saving from a backup: Now works. * glom/application.[h|cc]: on_document_load(): Simplify the code to create from a backup, modifying the from-example code to handle it too, calling a new recreate_database_from_backup() method. That now creates the database and then adds the groups before trying to restore from the backup file. * glom/libglom/connectionpool_backends/backend.h: convert_backup(): * glom/libglom/connectionpool_backends/postgres.[h|cc]: convert_backup(): * glom/libglom/connectionpool_backends/sqlite.[h|cc]: convert_backup(): Add a database_name_parameter. This now expects the database to exist already, though it should be empty. It should also already have the expected groups. * glom/libglom/connectionpool.[h|cc]: convert_backup(): Supply the database name. Also update the meta data so we know about the new tables. 2010-07-21 Murray Cumming Small Business example: Add table privileges. * examples/example_smallbusiness.glom: Give some privileges to the accounts and personnel groups and resave-as-an-example. These were probably lost some time. 2010-07-21 Murray Cumming Saving as example: Fix this. * glom/libglom/document/document.cc: set_modified(): Actually use m_allow_auto_save so we don't just save every time, overwriting previous saves. For instance, the examples were saved with is_example=false after the document was changed back. 2010-07-21 Murray Cumming Saving from examples: Set the table privileges mentioned in the document. * glom/base_db.[h|cc]: Added set_table_privileges_groups_from_document(). * glom/application.cc: recreate_database_from_example(): call it. 2010-07-21 Murray Cumming Saving from examples: Create the groups mentioned in the document. * glom/base_db.[h|cc]: Added add_groups_from_document(). * glom/application.cc: recreate_database_from_example() call it. 2010-07-20 Murray Cumming Fixed warnings with latest gtkmm-2.24 * glom/mode_data/notebook_data.cc: * glom/mode_find/notebook_find.cc: Use Gtk::Notebook::append_page() instead of Gtk::Notebook::pages().push_back(). 2010-07-13 Murray Cumming Fixed warnings, even with the latest gtkmm-2.24. Many files: Try to include box.h or dialog.h before other treemodel.h. Sometimes just add a gtkmm.h to simplify things. This will not be necessary with gtkmm-3.0 (in glom's master branch). 2010-07-07 Murray Cumming PostgresQL backups: Suggest a dated name. * glom/application.cc: on_menu_developer_export_backup(): Suggest a directory name based on the current name and the date/time. Also use the directory name for the .glom filename, as we usually would do, instead of calling it just backup.glom. 2010-07-07 Murray Cumming PostgreSQL backups: Archive the directory in a .tar.gz.. * configure.ac: Check for the tar and gzip executables. * glom/application.cc: on_menu_developer_export_backup(): Use tar via the command line, to put it all in a .tar.gz, so it is self-contained. 2010-07-07 Murray Cumming PostgreSQL backups: Use .pgpass. * glom/libglom/connectionpool_backends/postgres.[h|cc]: * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: Move create_text_file() from PostgresSelf to Postgres and add an only_for_current_user bool parameter, so we can use it in a new save_password_to_pgpass() method. save_backup(), convert_backup(): Temporarily store the password in ~/.pgpass, so pg_dump and pg_restore actually work. 2010-07-05 Murray Cumming Show progress in the UI during backup saving and restoring. * glom/application.[h|cc]: on_document_load(), on_menu_developer_export_backup(): Show a pulsing progress dialog while waiting for backup exporting and restoring. on_menu_developer_export_backup(): Close the file chooser dialog as soon as we stop using it. 2010-07-04 Murray Cumming Improve backup saving and add backup restoring. * glom/libglom/document/document.[h|cc]: Added get/set_is_backup_file(), saved in the XML document.. on_menu_developer_export_backup(): Mark the .glom file as a backup file. Rename recreate_database() to recreate_database_from_example(). on_document_load(): Handle backup .glom files similarly to examples files, but using the backup file instead of example data. * glom/frame_glom.cc: * glom/libglom/connection_pool.[h|cc]: * glom/libglom/connectionpool_backends/backend.[h|cc]: startup(): Return a StartupErrors enum, to provide more clues, for instance to say that backup data was found. Add get/set_database_directory_uri(), replacing the one in sqlite.[h|cc] and replacing set_self_hosting_data_uri() in postgres_self.[hc|cc]. save_backup(): Don't take a filepath - use get_database_directory_uri() instead. Added convert_backup() to restore from a backup. * glom/libglom/connectionpool_backends/sqlite.[h|cc]: * glom/libglom/connectionpool_backends/postgres.[h|cc]: get_path_to_postgres_executable(): Catch exceptions from Glib::build_filename(). save_backup(): Use --format=c with pg_dump, because the default one can't be used with pg_restore. Implement convert_backup(), using pg_restore. Added get_self_hosting_config_path(), get_self_hosting_data_path() and get_self_hosting_backup_path() to avoid copy/pasting magic paths. * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: Adapted. * glom/application.[h|cc]: * tests/test_selfhosting_new_empty.cc: Adapted to check the enum result from startup(). 2010-07-04 Murray Cumming Document: Avoid a crash when creating the parent directory. * glom/libglom/docment/bakery/document.cc: write_to_disk(): Check the result of Gio::File::get_parent() for null, because that happens if we provide a path instead of a URI. 2010-07-04 Murray Cumming Save as Example: Reset the old file URI and allow auto-saving again. * glom/application.cc: on_menu_file_save_as_example(): reset the old file URI and turn auto-saving back on again, because it makes no sense to leave the user editing an example document. This is really an export anyway. This allows the user to close the window again after saving as an example. 2010-07-04 Murray Cumming Add Save Backup menu item. * glom/libglom/connectionpool_backends/backend.[h|cc]: * glom/libglom/connectionpool_backends/posgres.[h|cc]: * glom/libglom/connectionpool_backends/sqlite.[h|cc]: Added save_backup() virtual method, using pg_dump for PostgreSQL. * glom/libglom/connectionpool.[h|cc]: Add save_backup() here, calling the backend. * glom/application.cc: Add a Developer/Export Backup menu item, to use this feature. This also saves the .glom file. 2010-07-04 Murray Cumming In progress 2010-07-04 Murray Cumming Spawn functions: Catch some exceptions. * glom/libglom/spawn_with_feedback.cc(): execute_command_line(), execute_command_line_and_wait(): Catch exceptions so that these functions don't throw, simplifying caller code. For instance, a command may be malformed and rejected by the shell. 2010-06-29 Murray Cumming Improve stderr message. * glom/libglom/spawn_with_feedback.cc: execute_command_line_and_wait_until_second_command_returns_success(): Correct the error message when a command (such as postgres) fails. As noticed in bug #617504. 2010-06-29 Murray Cumming Improve stderr message. * glom/libglom/spawn_with_feedback.cc: execute_command_line_and_wait_until_second_command_returns_success(): Correct the error message when a command (such as postgres) fails. As noticed in bug #617504. 2010-06-21 Murray Cumming Privs::get_database_users(): Check for an empty DataModel. * glom/libglom/privs.cc: Check that the user (listed in the group) could really be found. 2010-06-21 Murray Cumming Use G_STRFUNC with std::cerr and std::cout. * *.h/cc: Replace hard-coded copy/pastes of method names with G_STRFUNC, with the help of regexxer. 2010-06-21 Murray Cumming Adapt use of Gda::ServerOperation. * glom/libglom/connectionpool_backends/backend.cc: add_column(), * glom/libglom/connectionpool_backends/sqlite.cc: add_column_to_server_operation(): set_value_at() is now templated in libgdamm, so there is no need for the ugly (somebool ? "TRUE" : "FALSE") code. 2010-06-21 David King Explicitly link with libdl for Python module loading test * Makefile_tests.am: Do not rely on libdl being a dependency of a library in LIBGLOM_LIBS, by linking with it explicitly. 2010-06-21 David King Explicitly link with libdl for Python module loading test * Makefile_tests.am: Do not rely on libdl being a dependency of a library in LIBGLOM_LIBS, by linking with it explicitly. 2010-06-20 Murray Cumming Remove ifdefs for the gtkmm reduced-api build. 2010-06-20 Murray Cumming libglom: ConnectionPool: Simplify code. * glom/libglom/connectionpool_backends/backend.[h|cc]: * glom/libglom/connectionpool_backends/postgres.[h|cc]: * glom/libglom/connectionpool_backends/postgres_central.[h|cc]: * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: * glom/libglom/connectionpool_backends/sqlite.[h|cc]: Remove the query_execute(), create_server_operation(), perform_server_operation(), begin_transaction(), commit_transaction() and rollback_transaction() convenience methods, which just hide the no-exceptions ifdefs. But gtkmm-3.0 does not support that anyway, so we don't need it. Just call the libgdamm methods directly. add_column(), drop_column(), change_columns(), connect(): Remove the error output parameters which were there for the same reason. Now they just throw. * glom/libglom/connectionpool.[h|cc]: Adapted code, hopefully making it simpler. 2010-06-19 Murray Cumming Use Gnome::Gda::SqlBuilder::Id * glom/base_db.cc: * glom/libglom/python_embed/py_glom_relatedrecord.cc: * glom/libglom/utils.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Use the typedef instead of guint. It is very lengthy, but it is correct. 2010-06-19 Murray Cumming Use Gnome::Gda::SqlBuilder::Id * glom/base_db.cc: * glom/libglom/python_embed/py_glom_relatedrecord.cc: * glom/libglom/utils.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Use the typedef instead of guint. It is very lengthy, but it is correct. 2010-06-19 Murray Cumming Use SqlBuilder::add_field_id() to avoid ambiguity. * glom/base_db.cc: * glom/base_db_table_data.cc: * glom/libglom/db_utils.cc: * glom/libglom/privs.cc: * glom/libglom/python_embed/py_glom_record.cc: * glom/libglom/python_embed/py_glom_relatedrecord.cc: * glom/libglom/utils.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_portal.cc: * glom/mode_design/dialog_database_preferences.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/report_builder.cc: Replace use of add_id() with the new add_field_id(), which lets us specify the table too. 2010-06-19 Murray Cumming Adapt to latest libgdamm API. * glom/base_db.cc: * glom/libglom/db_utils.cc: * glom/libglom/python_embed/py_glom_relatedrecord.cc: * glom/libglom/utils.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: SqlBuilder::add_field_id() was renamed to add_field_value_id(), though I now notice that no value is involved when it is used for SELECT queries. 2010-06-19 Murray Cumming 1.14.3 2010-06-19 Murray Cumming Revert previous "Fix a crash when using find mode" commit. * glom/application.cc: * glom/application.h: This was apparently only a problem due to a previous UI-changing commit in the glom-1-16 branch. 2010-06-19 Daniel Borgmann Set default icon instead of individual window icons. * glom/application.cc: Set default window icon. * glom/dialog_existing_or_new.cc: * glom/filechooser_export.cc: * glom/frame_glom.cc: * glom/glade_utils.h: * glom/mode_design/script_library/dialog_script_library.cc: * glom/mode_design/translation/window_translations.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/utility_widgets/filechooserdialog_saveextras.cc: * glom/utils_ui.cc: * glom/window_boxholder.cc: Don't call set_icon_name() on individual windows. 2010-06-19 Daniel Borgmann Don't allow deleting placeholder rows. * glom/utility_widgets/db_adddel/db_adddel.cc: Don't allow deleting a placeholder row (which leads to broken behaviour). 2010-06-19 Daniel Borgmann Fix position of "Records / Found" labels. * glom/glom.glade: Make sure "Records: X Found: X" appears in the right order. 2010-06-19 Daniel Borgmann Fix a crash when using find mode. * glom/application.cc: Don't access m_action_mode_data. * glom/application.h: Remove m_action_mode_data. 2010-06-19 Murray Cumming Remove unnecessary gtk C includes. * glom/application.cc: * glom/bakery/app_withdoc_gtk.cc: * glom/libglom/data_structure/print_layout.cc: * glom/libglom/document/document.cc: * glom/libglom/gst-package.c: * glom/mode_design/comboentry_currency.cc: * glom/mode_design/fields/combo_fieldtype.cc: * glom/mode_design/layout/combobox_fields.cc: * glom/mode_design/layout/combobox_relationship.cc: * glom/mode_design/layout/layout_item_dialogs/combo_summarytype.cc: * glom/mode_design/layout/layout_item_dialogs/comboentry_borderwidth.cc: * glom/mode_design/print_layouts/print_layout_toolbar.cc: * glom/mode_design/translation/combobox_locale.cc: * glom/utility_widgets/cellrendererlist/cellrendererlist.cc: * glom/utility_widgets/combo_textglade.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttonimage.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttonimage.h: * glom/utility_widgets/db_adddel/cellrenderer_buttontext.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttontext.h: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/layouttoolbar.cc: * glom/xsl_utils.cc: Remove now-unnecessary gtk+/gtk* includes, replacing some with use of C++ API. These caused warnings due to GSEAL. 2010-06-19 Murray Cumming Configure: Remove checks for libegg dependencies, because we don't use it. * configure.ac: We don't build libegg code here any more. 2010-06-19 Murray Cumming Remove the avahi-ui dependency because we don't use it any more. * configure.ac: Don't check for avahi-ui. * glom/application.cc: Don't include avahi-ui.h This is lucky, because avahi-ui still has no support for GTK+ 3. 2010-06-19 Murray Cumming Remove the avahi-ui dependency because we don't use it any more. * configure.ac: Don't check for avahi-ui. * glom/application.cc: Don't include avahi-ui.h This is lucky, because avahi-ui still has no support for GTK+ 3. 2010-06-15 Murray Cumming Use SqlBuilder::add_field_id() to avoid ambiguity. * glom/base_db.cc: * glom/base_db_table_data.cc: * glom/libglom/db_utils.cc: * glom/libglom/privs.cc: * glom/libglom/python_embed/py_glom_record.cc: * glom/libglom/python_embed/py_glom_relatedrecord.cc: * glom/libglom/utils.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_portal.cc: * glom/mode_design/dialog_database_preferences.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/report_builder.cc: Replace use of add_id() with the new add_field_id(), which lets us specify the table too. 2010-06-15 Murray Cumming Adapt to latest libgdamm API. * glom/base_db.cc: * glom/libglom/db_utils.cc: * glom/libglom/python_embed/py_glom_relatedrecord.cc: * glom/libglom/utils.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: SqlBuilder::add_field_id() was renamed to add_field_value_id(), though I now notice that no value is involved when it is used for SELECT queries. 2010-06-13 Murray Cumming Remove unnecessary gtk C includes. * glom/application.cc: * glom/bakery/app_withdoc_gtk.cc: * glom/libglom/data_structure/print_layout.cc: * glom/libglom/document/document.cc: * glom/libglom/gst-package.c: * glom/mode_design/comboentry_currency.cc: * glom/mode_design/fields/combo_fieldtype.cc: * glom/mode_design/layout/combobox_fields.cc: * glom/mode_design/layout/combobox_relationship.cc: * glom/mode_design/layout/layout_item_dialogs/combo_summarytype.cc: * glom/mode_design/layout/layout_item_dialogs/comboentry_borderwidth.cc: * glom/mode_design/print_layouts/print_layout_toolbar.cc: * glom/mode_design/translation/combobox_locale.cc: * glom/utility_widgets/cellrendererlist/cellrendererlist.cc: * glom/utility_widgets/combo_textglade.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttonimage.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttonimage.h: * glom/utility_widgets/db_adddel/cellrenderer_buttontext.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttontext.h: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/layouttoolbar.cc: * glom/xsl_utils.cc: Remove now-unnecessary gtk+/gtk* includes, replacing some with use of C++ API. These caused warnings due to GSEAL. 2010-06-13 Murray Cumming Depend on avahi-ui-3.0 instead of avahi-ui, though it does not officially exist. * configure.ac: avahi-ui links to gtk-2.0, so depending on avahi-ui-3.0 is better even if it currently only exists via my patch (emailed to d-d-l and Lennart because I can't login to avahi.org's trac). 2010-06-13 Murray Cumming Configure: Remove checks for libegg dependencies, because we don't use it. * configure.ac: We don't build libegg code here any more. 2010-06-13 Murray Cumming Port to gtkmm-3.0 * configure.ac: Use gtkmm-3.0 instead of gtkmm-2.4 * glom/mode_design/print_layouts/window_print_layout_edit.cc: Use get_related_action() instead of get_action(). * glom/utility_widgets/cellrendererlist/cellrendererlist.[h|cc]: Simplify the use of the editing_started signal now that the inheritance is fixed in gtkmm-3.0. * glom/utility_widgets/db_adddel/db_adddel.cc: Use get_first_cell() instead of get_first_cell_renderer(). * glom/utility_widgets/db_adddel/glom_db_treemodel.[h|cc]: iter_is_valid(): This is no longer virtual, and no longer exists in the base class, so don't call the base class implementation. 2010-05-28 Mario Blättermann Updated German translation 2010-05-26 Murray Cumming 1.15.1 2010-05-25 Murray Cumming build_sql_select_with_where_clause(): Fix a crash. 2010-05-25 Murray Cumming libglom: Utils: Avoid SQL strings for extra_join for doubly-related records. * glom/libglom/data_structure/foundset.[h|cc]: Remove the extra_group_by member variable. * glom/base_db.cc: set_found_set_where_clause_for_portal(): Do not create the SQL GROUP BY string here. * glom/libglom/utils.[h|cc]: build_sql_select_with_where_clause(): Remove the extra_group_by parameter, instead grouping by all fields if there is an extra_join_by, because there is a 1-to-1 correlation. Also take extra_join as a Relationship instead of a SQL JOIN string, and reuse the existing code to define a join from a relationship. * glom/frame_glom.cc: * glom/libglom/data_structure/foundset.cc: * glom/libglom/data_structure/foundset.h: * glom/libglom/utils.cc: * glom/libglom/utils.h: * glom/mode_data/box_data_calendar_related.cc: * glom/print_layout/canvas_print_layout.cc: * glom/report_builder.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Adapt. 2010-05-25 Murray Cumming Document: get_field_used_in_relationship_to_one(): const correction. * glom/libglom/document/document.[h|cc]: get_field_used_in_relationship_to_one(): Make the relationship parameter const and adapt other code. 2010-05-25 Murray Cumming libglom: build_sql_select_add_fields_to_get(): Define joins here. * glom/libglom/data_structure/layout/usesrelationship.[h|cc]: Remove add_sql_join_alias_definition(), moving its code into Utils::build_sql_select_add_fields_to_get() because that was the only code that called it. get/set_relationship(), get/set_related_relationship(): const corrections. * several files: Adapt to const corrections. 2010-05-24 Murray Cumming UsesRelationship: Correct use of SqlBuilder for related relationships. * glom/libglom/data_structure/layout/usesrelationship.cc: add_sql_join_alias_definition(): Correct the join definition for related relationships. 2010-05-21 Murray Cumming UsesRelationship: Use SqlBuilder::select_add_target() with the join. * glom/libglom/data_structure/layout/usesrelationship.cc: add_sql_join_alias_definition(): Use select_add_target() instead of add_id() with the join's first target, to avoid the warning about an unknown ID, though we now get a warning about unimplmented code in libgda, which I emailed the gnome-db mailing list about. 2010-05-21 Murray Cumming Really replace the last non-users string-based SQL query. * glom/libglom/db_utils.cc: get_database_preferences(): Add a missing call to select_add_target(). insert_example_data(): Use SqlBuilder. 2010-05-20 Murray Cumming Correct use of SQL functions with SqlBuilder. * glom/base_db.cc: count_rows_returned_by(): Use SqlBuilder::add_field_id() so the function is really used. And add a target alias. This now works. * glom/libglom/python_embed/py_glom_relatedrecord.cc: generic_aggregate() * glom/libglom/utils.cc: build_sql_select_add_fields_to_get(): * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: get_record_counts(): Use add_field_id() when adding a function to SqlBuilder, so it is really used. 2010-05-20 Murray Cumming More use of SqlBuilder. Almost finished. * glom/base_db.cc: * glom/libglom/data_structure/layout/usesrelationship.[h|cc]: Change get_sql_join_alias_definition() to get_sql_join_alias_definition(). * glom/libglom/db_utils.[h|cc]: query_execute_select(): Add an optional use_cursor bool to use the non-random database access. * glom/libglom/utils.[h|cc]: Change build_sql_select_fields_to_get() to build_sql_select_add_fields_to_get(). build_sql_select_with_where_clause(): Use SqlBuilder. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: refresh_from_database(): Use DbUtils::query_execute_select(), to simplify the code. This is possible now that the function is not in BaseDB. 2010-05-17 Christian Kirbach Added German help translation screenshots 2010-05-17 Christian Kirbach Updated German help translation 2010-05-17 Petr Kovar Update Czech translation by Marek Cernocky 2010-05-14 Murray Cumming sqlbuilder_get_full_query(): Remove unused overload. 2010-05-14 Daniel Borgmann Fix position of "Records / Found" labels. * glom/glom.glade: Make sure "Records: X Found: X" appears in the right order. 2010-05-14 Daniel Borgmann Fix a crash when using find mode. * glom/application.cc: Don't access m_action_mode_data. * glom/application.h: Remove m_action_mode_data. 2010-05-13 Murray Cumming DbUtils: Catch SqlError exception. * glom/libglom/db_utils.cc: query_execute_select(), query_execute_select(), sqlbuilder_get_full_query(): Catch SqlError too, as this seems to be thrown too. 2010-05-13 Daniel Mustieles Updated Spanish translation 2010-05-13 Daniel Mustieles Updated Spanish translation 2010-05-13 Daniel Mustieles Updated Spanish translation 2010-05-13 Murray Cumming DbUtils::query_execute(): Remove params parameter. * glom/libglom/db_utils.[h|cc]: query_execute(): Remove the unused params parameter. 2010-05-13 Murray Cumming Use SqlBuilder in all possible remaining places. * glom/libglom/db_utils.[h|cc]: Renamed query_execute(string) to query_execute_string() so we catch uses of it that could use SqlBuilder. * glom/base_db.cc: Replaced some INSERT and DELETE string sql queries with SqlBuilder. * glom/base_db_table_data.cc: * glom/libglom/db_utils.cc: * glom/libglom/db_utils.h: * glom/libglom/privs.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/navigation/box_tables.cc: Adapt. 2010-05-12 Murray Cumming Remove redundant BaseDb::query_execute*() methods. * glom/base_db.[h|cc]: Removed query_execute_select() and query_execute(). The same methods in DbUtils replace them. * glom/libglom/db_utils.h: Removed the query_execute_select(string) override. * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_portal.cc: * glom/mode_design/dialog_database_preferences.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/navigation/box_tables.cc: * glom/print_layout/canvas_print_layout.cc: * glom/report_builder.cc: * glom/base_db_table_data.cc: * glom/frame_glom.cc: * glom/libglom/db_utils.cc: Adapted. 2010-05-12 Daniel Borgmann Don't allow deleting placeholder rows. * glom/utility_widgets/db_adddel/db_adddel.cc: Don't allow deleting a placeholder row (which leads to broken behaviour). 2010-05-12 Murray Cumming Use Gnome::Gda::SqlExpr for where clauses. * glom/libglom/utils.[h|cc]: Added build_simple_where_expression() and build_combined_where_expression() to make it easier to work with Gnome::Gda::SqlExpr. build_sql_select_with_key(): Return a SqlExpr instead of a string. * glom/base_db.[h|cc]: * glom/base_db_table_data.cc: * glom/frame_glom.[h|cc]: * glom/libglom/data_structure/foundset.[h|cc]: * glom/mode_data/box_data.[h|cc]: * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_portal.cc: * glom/mode_data/datawidget/dialog_choose_id..[h|cc]: * glom/mode_find/notebook_find.[h|cc]: * glom/print_layout/canvas_print_layout.cc: * glom/report_builder.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Adapt, using SqlExpr instead of a string for where clauses. 2010-05-11 Daniel Borgmann Don't add a new row when cancelling a placeholder edit. * glom/utility_widgets/db_adddel/db_adddel.cc: Don't add a new row if the edited row was a placeholder and no text was entered. 2010-05-10 Daniel Elstner Move list of libglom sources to separate file * glom/libglom/filelist.am: New Automake include file, defining the lists of source and header files for building libglom. * Makefile_libglom.am: Include glom/libglom/filelist.am for the lists of header and source files, instead of listing them directly. * docs/libglom_reference/Makefile.am: Include the list of libglom source files from glom/libglom/filelist.am. (doc_input): Instead of naming a directory for Doxygen to search, explicitly define the Doxygen input to the list of all public libglom header files. 2010-05-10 Daniel Elstner Update Doxygen configuration for libglom reference * docs/libglom_reference/Doxyfile.in: Correct strip prefixes and include paths. Do include the mm-common stylesheet and reference the external tag files. Also clean some cruft. 2010-05-10 Daniel Elstner Honor --disable-documentation configure option * Makefile.am (gnome_doc_subdirs): Rename from $(doc_subdirs). (doc_subdirs): Conditionally define to the subdirectories of the reference documentation, depending on whether ENABLE_DOCUMENTATION is true. (SUBDIRS): Expand $(doc_subdirs) and $(gnome_doc_subdirs). 2010-05-10 Daniel Borgmann Make Find mode a toggle and move it to the Edit menu. * glom/application.cc: Move Find menu item, remove Mode menu. * glom/frame_glom.cc/h: Replace on_menu_Mode_Find()/Data() with on_menu_Mode_Toggle(). 2010-05-08 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-05-06 Daniel Borgmann Save extras alignment improvements. * glom/utility_widgets/filechooserdialog_saveextras.cc: Adjust alignments and hide extra label if empty (thus not taking up space). 2010-05-06 Murray Cumming Utils::get_choice_values(): Complete the use of SqlBuilder. * glom/libglom/utils.cc: get_choice_values(): Use the new return value from Builder::select_add_field() for the ORDER BY, so we specify the field table too. 2010-05-03 Daniel Borgmann Set default icon instead of individual window icons. * glom/application.cc: Set default window icon. * glom/dialog_existing_or_new.cc: * glom/filechooser_export.cc: * glom/frame_glom.cc: * glom/glade_utils.h: * glom/mode_design/script_library/dialog_script_library.cc: * glom/mode_design/translation/window_translations.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/utility_widgets/filechooserdialog_saveextras.cc: * glom/utils_ui.cc: * glom/window_boxholder.cc: Don't call set_icon_name() on individual windows. 2010-05-03 Murray Cumming Mark the branch in the ChangeLog 2010-05-03 Murray Cumming 1.14.2 2010-05-03 Murray Cumming User Guide: Update the pygda example for pygda 4. * C/glom.xml: using-the-full-pygda-api: Update the example for pygda 4 and its (currently ugly, until I fix it) API. 2010-05-03 Murray Cumming Python calculations: Really convert to expected types. * glom/libglom/data_structure/glomconversions.cc: get_double_for_gda_value_numeric(): Handle all numeric GTypes - not just G_TYPE_INT.. convert_value(): Remove the special case for G_TYPE_INT (now handled in get_double_for_gda_value_numeric instead). Make sure that all numeric GTypes are converted to GDA_TYPE_NUMERIC, making it easier for callers to check. 2010-05-03 Murray Cumming Add test of type conversion after python calculations. * Makefile_tests.am: * tests/test_python_execute_func_change_result_type.cc: Add a test that calls a python function that returns a number, for a text field, to check that the conversion is done. 2010-05-03 Murray Cumming 1.14.2 2010-05-02 Murray Cumming User Guide: Update the pygda example for pygda 4. * C/glom.xml: using-the-full-pygda-api: Update the example for pygda 4 and its (currently ugly, until I fix it) API. 2010-05-02 Murray Cumming Python calculations: Really convert to expected types. * glom/libglom/data_structure/glomconversions.cc: get_double_for_gda_value_numeric(): Handle all numeric GTypes - not just G_TYPE_INT.. convert_value(): Remove the special case for G_TYPE_INT (now handled in get_double_for_gda_value_numeric instead). Make sure that all numeric GTypes are converted to GDA_TYPE_NUMERIC, making it easier for callers to check. 2010-05-02 Murray Cumming Add test of type conversion after python calculations. * Makefile_tests.am: * tests/test_python_execute_func_change_result_type.cc: Add a test that calls a python function that returns a number, for a text field, to check that the conversion is done. 2010-05-02 Petr Kovar Update Czech translation by Marek Cernocky 2010-05-02 Mario Blättermann Updated German translation 2010-05-02 Mario Blättermann Updated German doc translation 2010-05-01 Murray Cumming Python scripts and calcuations: Test buttons now show python errors. * glom/python_embed/glom_python.[h|cc]: glom_execute_python_function_implementation(), glom_evaluate_python_function_implementation(): Add an error_message output parameter, to report syntax errors, for instance. * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc: Show the python error, if any, when pressing the Test button. * Other files: Adapt, ignoring the error message for now. * Makefile_tests.am: * tests/test_python_execute_func_bad_syntax.cc: Added a test of the new error_message parameter. 2010-05-01 Murray Cumming Fix a possible crash when showing choices. * glom/mode_data/datawidget/combo.cc: set_text(): Don't show a warning if "" is not found because it's OK to use that to clear the combo. * glom/mode_data/datawidget/combochoiceswithtreemodel.cc: set_choices_with_second(): Don't dereference a null smartpointer, avoiding a crash with one .glom file that I tried. 2010-05-01 Murray Cumming Python Glom API documentation improvement. * glom/python_embed/python_module/py_glom_module.cc: Turn off auto-writing of the Python signatures in the docstrings, because that is a) crappy and b) confuses the sphinx autodoc module, which adds an invisible ..function reStrucuredText line. Add :param:, :type, and :returns: lines with the necessary indenting and empty lines needed by that invisible ..function line. 2010-05-01 Murray Cumming Move some more methods from Base_DB. * glom/base_db.[h|cc]: Move show_warning_no_records_found() to utils_ui.[h|cc]. get_find_where_clause_quick(): Move to utils.[h|cc]. * glom/frame_glom.cc: Adapted. * glom/mode_design/layout/layout_item_dialogs/box_formatting.h: * glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.[h|cc]: * glom/mode_data/datawidget/dialog_choose_id.[h|cc]: Don't derive from Base_DB because that is no longer necessary after adapting. 2010-05-01 Murray Cumming create_database(): Actually use the progress slot. 2010-05-01 Murray Cumming Fixed merge conflict. 2010-05-01 Murray Cumming Fixed ChangeLog for accidental in-progress commit. 2010-05-01 Murray Cumming Fix document saving (recently broken by me) and add a test for it. * glom/libglom/document/bakery/document.cc: write_to_disk(): Do not fail if the parent directory already exists. * Makefile_tests.am: * tests/test_document_autosave.cc: Added a test of document saving and autosaving. 2010-05-01 Murray Cumming Move tests out of sub-directories, simplifying the build file. * tests/Makefile_test.am: * tests/test_document_load.cc: * tests/test_selfhosting_new_empty.cc: Move out of the sub-directories, because they do not need extra files. 2010-05-01 Murray Cumming In progress 2010-04-27 Murray Cumming PyGlom: Don't use deprecated boost::python::args. * glom/python_embed/python_module/py_glom_module.cc: Use boost::python::arg() instead of boost::python::args(), because I noticed that args is deprecated. 2010-04-27 Murray Cumming Remove unimplemented functions. 2010-04-27 Murray Cumming More use of SqlBuilder. * glom/base_db.[h|cc]: Move sqlbuilder_get_full_query() to Utils so that other code can use it. * glom/libglom/utils.[h|cc]: get_choice_values(): Use SqlBuilder. 2010-04-27 Murray Cumming More use of SqlBuilder. * glom/report_builder.cc: report_build_groupby(): Use the new SqlBuilder::select_group_by() method to replace another SQL string. 2010-04-27 Murray Cumming 1.14.1 2010-04-27 Murray Cumming Make sure all glade-instantiated windows have the Glom icon. * glom/glade_utils.h: helper_get_glade_widget_derived_with_warning(): Call set_icon_name() on windows, fixing my regression. 2010-04-27 Murray Cumming Documentation: Added libglom main page. Installed _sources for pyglom. * docs/pyglom_reference/Makefile.am: Also install html/_sources, used by search. * glom/libglom/init.h: Add a doxygen main page. 2010-04-26 Murray Cumming Fix the build. * Makefile_tests.am: test_selfhosting_new_empty: Link to the Glom sources to fix the unresolved link to Glom::Priv's method. We will use more from the rest of Glom here too. 2010-04-26 Murray Cumming Reenable test_load_document. * Makefile_tests.am: Reenable test_load_document.cc * tests/test_load_document/test_load_document.cc: Restore (rewrite) this missing file. 2010-04-26 Murray Cumming configure.ac: Remove the dist-bzip2 option that was added by mistake. 2010-04-26 Daniel Elstner Use installed mm-common instead of copying it * autogen.sh: Run mm-common-prepare to pull in the mm-common include files for Automake. * docs/libglom_reference/Makefile.am: Set up configuration variables and include doc-reference.am instead of copy'n'pasting its content. * docs/libglom-reference/doxygen_to_devhelp.xsl: Delete file. It is shipped with mm-common and also part of the glibmm installation. 2010-04-26 Murray Cumming Self-Hosting test: Check that cleanup works. * Makefile_tests.am: * glom/libglom/connectionpool.[h|cc]: * glom/libglom/connectionpool_backends/backend.[h|cc]: * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: * tests/test_selfhosting_new_empty/test_selfhosting_new_empty.cc: Make cleanup() return a bool, so we can check it, because this fails sometimes. Use the standard username and password. 2010-04-26 Daniel Elstner Heavily cut the pyglom_reference build magic * docs/pyglom_reference/Makefile.am: Drop the custom installation rules and use the GNU make $(wildcard) function for both distribution and installation of the generated documentation files. Since the files do not undergo translation at install time, it is not necessary to integrate the custom installation tool from mm-common. Pull in a missing GNU make function definition for computing the list of files. 2010-04-26 Daniel Elstner Temporarily disable test_document_load * Makefile_tests.am (check_PROGRAMS), (TESTS): Temporarily remove test_document_load, because the corresponding source file is currently missing from the repository. 2010-04-26 Daniel Elstner List generated documentation files in .gitignore 2010-04-26 Daniel Elstner Enable maintainer-mode build in autogen.sh * autogen.sh: Run configure with --enable-maintainer-mode since the AM_MAINTAINER_MODE macro is now used in configure.ac. 2010-04-26 Murray Cumming Python Glom module: Improved the docstrings, using reStructuredText * glom/python_embed/python_module/py_glom_module.cc: Use more reStructureText (or as much as sphinx allows us to use in a docstring). It's looking quite good. 2010-04-26 Murray Cumming Added missing file. 2010-04-25 Mario Blättermann Updated German translation 2010-04-25 Murray Cumming Simplify test_selfhosting_new_empty. * glom/frame_glom.cc: Move setup_connection_pool_from_document() to: * glom/libglom/connectionpool.[h|cc]: Added setup_from_document(). * tests/test_selfhosting_new_empty/test_selfhosting_new_empty.cc: Use the new function here, removing code to explicitly set the backend. 2010-04-24 Murray Cumming Add a document-loading test and self-hosting test * glom/Makefile_tests.am: Added the tests. * glom/libglom/test_document.cc: Renamed to example_document_load.cc. * tests/test_document_load/test_document_load.cc: Added this new test to load a document, checking some known parts of its structure. * glom/libglom/document/bakery/document.cc: write_to_disk(): Create the parent directory if necessary, instead of failing with a Gio exception. * test/test_selfhosting_newempty/test_selfhosting_newempty.cc: Saves a new file from an example, starts self-hosting of it, and stops self-hosting. This needs work and expansion. 2010-04-24 Murray Cumming Python Glom module: Improve sphinx-generated documentation. * glom/python_embed/python_module/py_glom_module.cc: Added class docstring documentation, based on http://library.gnome.org/users/glom/unstable/sec-calculated-fields.html Use reStructuredText format as expected by sphinx and as apparently now use by Python for docstring text. 2010-04-22 Petr Kovar Update Czech translation by Marek Cernocky 2010-04-20 Murray Cumming Python Glom module: Improve sphinx-generated documentation. * glom/python_embed/python_module/py_glom_module.cc: Added class docstring documentation, based on http://library.gnome.org/users/glom/unstable/sec-calculated-fields.html Use reStructuredText format as expected by sphinx and as apparently now use by Python for docstring text. 2010-04-20 Murray Cumming Fix the python Glom module name. * configure.ac: Fix a recent typo to again use the correct underlined name for the Python Glom module. This was fatal, in tests too. 2010-04-20 David King Relax the autoconf requirement * configure.ac: Relax the autoconf requirement to 2.63, as 2.65 is not required. Something older than 2.63 may even be acceptable, but I do not have an older version to test. 2010-04-20 David King Fix the sphinx-build configure check * configure.ac: Abort configure with an error if sphinx-build could not be found and --enable-documentation was passed to configure. 2010-04-20 Murray Cumming Glom Python API reference: Failed attempt to dist the html files. * docs/pyglom_reference/Makefile.am: Copied some stuff from the mm-common files, but it doesn't work yet. 2010-04-20 Murray Cumming Glom Python API reference: Install the html generated by sphinx. * docs/pyglom_reference/Makefile.am: Add install rules based on awful hacked copies of the mm-common stuff. I believe this could be far simpler. 2010-04-20 Murray Cumming Solve the long-paths problem with the doxygen-generated html files. * configure.ac: Change the AM_INIT_AUTOMAKE() call to be like gtkmm, allowing the tarball to contain long paths - needed for the libglom html documentation. 2010-04-19 Murray Cumming More improved use of sphinx. * docs/pyglom_reference/conf.py.in: Do not generate the module index page because we have only one module. * docs/pyglom_reference/index.rst.in: Add back the link to the general index, which seems to actually be generated. 2010-04-19 Murray Cumming configure.ac: Ran autoupdate to remove use of deprecated macros. 2010-04-19 Murray Cumming Avoid the requierment for sphinx-build if documentation is disabled. * configure.ac: Use AC_PATH_PROG() instead of AC_CHECK_PROG() so we get the path to use. Only check if --enable-documentation was used. * docs/pyglom_reference/Makefile.am: Only build the html if --enable-documentation was used (not yet built by default anyway). 2010-04-19 Murray Cumming Improved use of sphinx. * configure.ac: AC_SUBST() GLOM_ABI_VERSION_UNDERLINED so we can use it in docs/pyglom_reference/Makefile.am. Mention these files that will be genereated form .in files with the ABI and version numbers substituted. Check for sphinx-build, though this should only matter when building docs. * docs/pyglom_reference/conf.py.in: * docs/pyglom_reference/index.rst.in: Use ABI and version variables instead of hard-coding. Add short introductory text with links. 2010-04-19 Murray Cumming Try to use sphinx for pyglom API documentation. * docs/pyglom_reference/Makefile.an: * docs/pyglom_reference/sphinx_sources/: An attempt to use sphinx instead of pydoc. sphinx is used by Python itself. I need to change my Python setup (not have Python in jhbuild) to test this properly, because I can't easily build pydoctor in my separate prefix. 2010-04-18 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-04-18 Bruno Brouard Updated French translation 2010-04-17 Petr Kovar Update Czech translation by Marek Cernocky 2010-04-16 Murray Cumming Python: Really show warnings when modules can't be imported. * glom/python_embed/glom_python.cc: Add and use import_module() to make sure that we catch exceptions from boost::python::import(), so show the intended warnings instead of just crashing with an uncaught exception. Also correct the checks for empty/none boost::python::objects for imported modules. A simple ! is not what it seems. 2010-04-16 Murray Cumming Use mm-common for optional compiler warnings and to build libglom docs. * configure.ac: Use mm-common, removing macros/dk-warn.m4. * docs/libglom_reference/Doxyfile.in: * docs/libglom_reference/doxygen_to_devhelp.xsl: * docs/libglom_reference/Makefile.am: Generate libglom documentation properly using build stuff copied from gtkmm. * docs/pyglom_reference/Makefile.am: A silly little initial attempt to have generated html for the glom python module, using pydoc. 2010-04-15 Murray Cumming Python field calculation: Fix a crash. * glom/libglom/python_embed/pygdavalue_conversions.cc: glom_pygda_value_as_boost_pyobject(): Add a PyDateTimeAPI call, as already done in glom_pygda_value_from_pyobject(), to prevent a crash (and valgrind warning about 0 dereference) when using this (silly, wrong) field calculation, though I can't reproduce it in a unit test: import datetime return (datetime.date.today() - record["date_of_birth"]).days / 365 2010-04-15 Murray Cumming Python module: Improve API documentation. * glom/python_embed/python_module/py_glom_module.cc: Added some options and text for docstrings, to improve the pydoc -w output. 2010-04-14 Daniel Mustieles Updated Spanish translation 2010-04-14 Murray Cumming Updated NEWS 2010-04-14 Murray Cumming 1.14.0 2010-04-14 Murray Cumming Fall back to the uninstalled .glade file to fix make distcheck. * Makefile.am: Define GLOM_PKGDATADIR_NOTINSTALLED as well as the existing GLOM_PKGDATADIR. * glom/glade_utils.h: get_glade_file_path(): Fall back to the uninstalled glade file if the installed one can't be found. This fixes make distcheck. 2010-04-14 Murray Cumming Glade utils: More error-checking. * glom/glade_utils.h: helper_get_glade_widget_derived_with_warning(): Catch the other 2 exception types that we now know that Gtk::Builder::create*() can throw. * glom/frame_glom.cc: create_database(): Use get_glade_widget_with_warning() to simplify the code. Our utility functions are now used everywhere. 2010-04-13 Murray Cumming Remove useless translatable strings. * glom/glom_developer.glade: Remove placeholder text from labels that will actually have their text set at runtime, so there's need actual need to have it in the glade file. They were even marked as translatable. Bug #615656 (Gianluca Ferri) 2010-04-12 Murray Cumming Python calculations and scripts: Fix regression in use of date and time fields. * glom/libglom/python_embed/py_glom_record.[h|cc]: Change PyGlomRecord_SetFields() to a member set_fields() method, and making more of the class private, finishing our conversion to boost::python. * glom/libglom/python_embed/py_glom_related.[h|cc]: Change PyGlomRelated_SetRelationships() to a set_relationships methods. * glom/libglom/python_embed/py_glom_relatedrecord.[h|cc]: Changed PyGlomRelatedRecord_SetRelationship() to a set_relationship() method. * glom/python_embed/glom_python.cc: glom_pygda_value_from_pyobject(): Handle date, time, timestamp, geometric point values, whose code had been commented out since the port to boost::python. This fixes the test added in the previous commit, so glom calculations and scripts can again (it broke in unstable Glom 1.13) use date and time field values from the record. 2010-04-12 Murray Cumming Added test showing problem with date fields in python calculations. * tests/test_python_execute_func_date.cc: Added a test of dates as input values for record fields. This currently fails with this error from python, so I need to fix it in Glom: AttributeError: 'NoneType' object has no attribute 'year' 2010-04-12 Daniel Elstner Further clean up AX_BOOST_PYTHON_MURRAYC * macros/ax_boost_python_murrayc.m4: Simplify the logic of the checks and clean up the Bourne shell code. Also, abort with a fatal error if the boost::python headers or library could not be found. 2010-04-12 Andre Klapper Compile with -DGSEAL_ENABLE. See bug 615477. 2010-04-12 Murray Cumming Fix glade loading. * glom/glade_utils.h: get_glade_widget_derived_with_warning(): Fix silly but fatal typo. 2010-04-12 Murray Cumming Simplify setting of the icon for windows. * glom/glade_utils.h: get_glade_widget_derived_with_warning(): Call set_icon_name() on windows. * Several *.cc files: Don't bother calling set_icon_name() after calling get_glade_widget_derived_with_warning(). 2010-04-12 Murray Cumming Slight AX_BOOST_PYTHON_MURRAYC() cleanup. * macros/ax_boost_python_murrayc.m4: Add necessary quotes, avoid ==, and use AC_LANG_PUSH/AC_LANG_POP instead of deprecated AC_LANG_SAVE/AC_LANG_CPLUSPLUS/AC_LANG_RESTORE. Noticed by Daniel Elstner, though we don't know if this solves any known problems yet. 2010-04-12 Murray Cumming Provide context for translations. * glom/application.cc: * glom/frame_glom.cc: * glom/mode_design/users/dialog_users_list.cc: Use the new (in glib 2.16) C_() macro to provide context for bare uses of "User" and "Developer", providing some explanation and allowing translators to use translate them differently, as may be required by some languages. Fixes bug #606931 (Urmas, André Klapper) 2010-04-11 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-04-11 Daniel Mustieles Updated Spanish translation 2010-04-11 Murray Cumming Added missing file. 2010-04-10 Murray Cumming Fixed build. 2010-04-10 Murray Cumming dialog_run_with_help(): Get the help ID from the class. * glom/utils_ui.h: dialog_run_with_help(): Add a templated version that uses the static glade_id member, to avoid repeating this in the source code. * Several .cc files: Remove the ID parameter from most uses of dialog_run_with_help(). 2010-04-10 Murray Cumming Glade instantiation: Simplify, make more robust, and test. * glom/glade_utils.h: get_glade_widget_derived_with_warning(): Don'te an ID. This requires the class to have a static glade_id member and glade_developer (bool) member, telling us what file and what ID to use. This associates the IDs and filenames with the class, instead of being in other files, to avoid duplication and to avoid using the wrong ones. This allows us to remove get_glade_developer_widget_derived_with_warning(). * Many files: Use these new methods, to avoid mentioning glade IDs. * tests/test_glade_derived_instantiation.cc: Try to instantiate all the known derived glade dialogs. 2010-04-10 Daniel Mustieles Updated Spanish translation 2010-04-10 Murray Cumming Glade files: Move a client-only dialog to the correct file. * glom/glom_developer.glade: * glom/glom.glade: Move dialog_choose_date to glom.glade. * glom/mode_data/datawidget/datawidget.cc: on_button_choose_date(): Adapted. 2010-04-10 Murray Cumming 1.14.0: Application: Forget the global instance when it has been deleted. * glom/application.cc: Destructor: reset the static instance to 0, to avoid anything from retrieving the pointer to the deleted object. 2010-04-10 Murray Cumming Remove some unused code. * glom/base_db.cc: offer_item_formatting(): Remove a useless use of Gtk::Builder. 2010-04-10 Murray Cumming Notebook properties dialog: Fix a probable crash. * glom/base_db.cc: :offer_notebook(): Fix a typo in the glade ID. I'm working on code to prevent these kinds of errors, to apply when we branch. 2010-04-10 Murray Cumming Reports: Fix a crash when opening the secondary fields dialog. * glom/glom_developer.glade: dialog_groupby_secondary_fields: Rename a button to match what the class's constructor expects. 2010-04-09 Mario Blättermann Updated German translation 2010-04-09 Daniel Borgmann Update NEWS file. * NEWS: Add entry. 2010-04-09 Daniel Borgmann Clean up Add Related Table dialog. * glom/glom_developer.glade: (dialog_add_related_table) Remove frame, fix spacings, align form elements in table. * glom/mode_design/dialog_add_related_table.cc: Add window icon. 2010-04-09 Daniel Borgmann Fix changelog. 2010-04-09 Daniel Borgmann Update translation dialogs. * glom/application.cc: * glom/glom_developer.glade: * glom/mode_design/script_library/dialog_script_library.cc: * glom/mode_design/translation/window_translations.cc: * glom/mode_design/users/dialog_groups_list.cc: Translation dialog updates, set missing window icons. 2010-04-09 Daniel Borgmann Update dialogs. * glom/frame_glom.cc: Set window icons. * glom/glom_developer.glade: Update user dialogs. * glom/mode_design/layout/dialog_layout.cc: Set window icons. * glom/mode_design/users/dialog_groups_list.cc: Set window icons. 2010-04-09 Armin Burgmeier Update Windows installer for Glom 1.14 2010-04-09 Armin Burgmeier * win32/build-installer: * win32/glom.iss.in: Update for Glom 1.14. 2010-04-09 Armin Burgmeier Do not install .desktop file on Windows. 2010-04-09 Armin Burgmeier * Makefile.am: Do not install .desktop file on Windows. 2010-04-08 Daniel Borgmann Use buttonbox for details view. * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: Use HButtonBox instead of HBox. 2010-04-08 Daniel Borgmann Use button box for adddel widgets. * glom/utility_widgets/adddel/adddel_withbuttons.cc: * glom/utility_widgets/adddel/adddel_withbuttons.h: * glom/utility_widgets/db_adddel/db_adddel_withbuttons.cc: * glom/utility_widgets/db_adddel/db_adddel_withbuttons.h: Use ButtonBox instead of HBox. 2010-04-08 Daniel Borgmann Use button box for listview buttons. * glom/utility_widgets/db_adddel/db_adddel_withbuttons.cc: * glom/utility_widgets/db_adddel/db_adddel_withbuttons.h: Use ButtonBox instead of HBox to make buttons homogenous. Also change button order to match order used everywhere else (Add/Delete/Open). 2010-04-08 Murray Cumming Update POTFILES.in 2010-04-08 Murray Cumming ImageGlom: Move scale_keeping_ratio() somewhere more sensible. * glom/utility_widgets/imageglom.[h|cc]: Move scale_keeping_ratio() to glom/utils_ui.[h]cc] as Utils::image_scale_keeping_ratio(). * glom/utility_widgets/canvas/canvas_image_movable.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/flowtable_dnd.cc: Adapted. 2010-04-08 Murray Cumming glom/mode_data/datawidget/: Clean up classes, putting them in a namespace. * glom/mode_data/datawidget/: Removed Glom suffixes from class names and filenames, and put classes in a DataWidgetChildren sub-namespace, to make it clearer where we occasionally use these outside of DataWidget. 2010-04-08 Murray Cumming Cleaned glom/utility_widgets/ a little. * glom/utility_widgets/datawidget.[h|cc]: Moved to glom/mode_data/datawidget/ because it is only used by the data-mode flowtable. * glom/utility_widgets/buttonglom.[h|cc] * glom/utility_widgets/checkglom.[h|cc] * glom/utility_widgets/combo_as_radio_buttons.[h|cc] * glom/utility_widgets/combochoices.[h|cc] * glom/utility_widgets/combochoiceswithtreemodel.[h|cc] * glom/utility_widgets/comboentryglom.c[h|cc] * glom/utility_widgets/comboglom.[h|cc] * glom/utility_widgets/dialog_choose_date.[h|cc] * glom/utility_widgets/dialog_choose_id.[h|cc] * glom/utility_widgets/entryglom.[h|cc] * glom/utility_widgets/labelglom.[h|cc] * glom/utility_widgets/textviewglom.[h|cc] * glom/utility_widgets/placeholder-glom.[h|cc]: Also move these to glom/mode_data/datawidget because they are only used by DataWidget. * glom/utility_widgets/alignment_justified.[h|cc]: * glom/utility_widgets/table_columns.[h|cc]: Deleted these unused classes. * Makefile_glom.am: Adapted. 2010-04-08 Daniel Borgmann Text and Image object Dialog adjustments. * glom/glom_developer.glade: Various dialog layout fixes. * glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.h: * glom/mode_design/layout/layout_item_dialogs/dialog_textobject.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_textobject.h: Update box variable name and add window icons. 2010-04-08 David King Update copyright information in about dialog * glom/application.cc: Update copyright year in about dialog. 2010-04-07 Murray Cumming Recent Files: Make sure that we remember these for saved-from-example files. * glom/application.cc: on_document_load(): Add an extra call to document_history_add() after successfully saving from an example. 2010-04-07 Daniel Borgmann Find bar adjustments. * glom/frame_glom.cc: Rename Quick Find to Quick Search and add mneomnic. * glom/glom.glade: Update find id dialog and remove frame. * glom/utility_widgets/datawidget.cc: Add window icon to find id dialog. 2010-04-07 David King Fix boost:python m4 macro with -Wl,--as-needed * macros/ax_boost_python_murrayc.m4: Specify libraries in LIBS, not LDFLAGS. See http://www.gentoo.org/proj/en/qa/asneeded.xml 2010-04-06 Mario Blättermann Updated German translation 2010-04-06 Daniel Borgmann Dialog adjustments. * glom/glom.glade: Spacing adjustments to make dialogs more HIG compliant. 2010-04-06 Daniel Borgmann Initial Password Dialog adjustments. * glom/glom_developer.glade: Initial Password Dialog tweaks. * glom/mode_design/dialog_initial_password.cc: Set window icon. 2010-04-06 Daniel Borgmann CSV Import Dialog adjustments. * glom/glom.glade: Import dialog tweaks. * glom/import_csv/dialog_import_csv.cc: Add window icon, change title order. 2010-04-06 Daniel Borgmann Dialog fixes. * glom/frame_glom.cc: Add window icons and fix capitalisation of primary texts (dialog text uses sentence capitalisation). 2010-04-06 Daniel Borgmann Set Progress Dialog default size. * glom/glom.glade: Set a reasonable default size for the progress dialog, that allows to read the title at least. 2010-04-06 Daniel Borgmann Select Field Dialog adjustments. * glom/glom_developer.glade: Spacing and mnemonic adjustments/fixes, remove frame label. * glom/mode_design/layout/dialog_choose_field.cc: Add window icon. 2010-04-06 Daniel Borgmann Progress dialog adjustments. * glom/dialog_progress_creating.cc: Add window icon. * glom/glom.glade: Center dialog on parent window. 2010-04-03 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-03-31 Daniel Borgmann Don't show error icon for empty recent documents. * glom/dialog_existing_or_new.cc: Also don't show error icon for empty recent documents. 2010-03-31 Daniel Borgmann Welcome Screen adjustments. * glom/dialog_existing_or_new.cc: Fix typo and use of properties, don't show error icon when no network sessions are available. * glom/glom.glade: Hide label and icon, spacing adjustments. 2010-03-31 Daniel Borgmann Improve application title. * glom/application.cc: Don't show colon in application title when table name is empty. 2010-03-31 Daniel Borgmann Remove unneded alert dialogs / TODO items. * glom/frame_glom.cc: No table warnings are not needed anymore for menu items, so remove them. 2010-03-31 Daniel Borgmann Set window icon for OK dialogs. * glom/utils_ui.cc: show_ok_dialog: Set window icon. 2010-03-30 Daniel Mustieles Updated Spanish translation 2010-03-30 Daniel Borgmann Set window icon for welcome screen. * glom/dialog_existing_or_new.cc: Set window icon. 2010-03-30 Daniel Borgmann Disable some menu items when no table is loaded. * glom/application.cc: update_table_sensitive_ui: Function to set sensitivity of menu items depending on whether a table is loaded. init_menus: Add table sensitive menu items to a list. * glom/application.h: Add list to hold table sensitive menu items. * glom/frame_glom.cc: Call update_table_sensitive_ui when needed. 2010-03-30 Murray Cumming Glade instantation test: Make it exit on failure. * tests/test_glade_toplevels_instantiation.sh: Use || exit 1, as in David's commit to the other files. 2010-03-30 David King Make DTD validation tests exit on failure * tests/test_dtd_file_validation.sh: * tests/test_glade_file_validation.sh: Append ‘ || exit 1’ to the xmllint call, to ensure that a validation failure leads to a failing test. 2010-03-30 Daniel Borgmann Capitalisation fixes. * glom/application.cc: Use lower case for short prepositions. 2010-03-30 Daniel Borgmann Fix mnemonics. * glom/application.cc: Add missing mnemonics and change double mnemonics. 2010-03-30 Murray Cumming Update the document DTD, to fix tests. * glom/glom_document.dtd: data_layout_button: Allow this to have a formatting child node, because we now allow this in the UI and save this. 2010-03-30 Murray Cumming Add a test to check instantiation of glade widgets. * Makefile_tests.am * tests/glade_toplevels_instantiation.cc: Added this code for an executable that will try to instantiate all GtkWindow and GtkDialog objects in a specified .glade file. It also checks that they are not visible by default. * tests/test_glade_toplevels_instantiation.sh: Added a tests script, run during make check, to run this executable on all our .glade files. * glom/glom.glade, glom_developer.glom: Fix small problems found by the test, removing an empty textbuffer top-level object and making all top-level objects non-visible by default. 2010-03-30 Mario Blättermann Updated German translation 2010-03-29 Mario Blättermann Updated German translation 2010-03-29 Daniel Borgmann Relationships Overview dialog adjustments. * glom/glom_developer.glade: Remove frame and adjust spacings for Relationships Overview dialog. 2010-03-29 Daniel Borgmann Correct mnemonic widgets. * glom/glom_developer.glade: Actually set the correct mnemonic widgets for Report Layout input labels. 2010-03-29 Daniel Borgmann Remove boldness from input labels. * glom/glom_developer.glade: Remove bold markup for Report Layout input labels. 2010-03-29 Daniel Borgmann Report Layout dialog adjustments. * glom/frame_glom.cc: Set Report Layout dialog window icon. * glom/glom_developer.glade: Report Layout dialog spacing adjustments and mnemonics fix. 2010-03-29 Daniel Borgmann Reports dialog adjustments. * glom/frame_glom.cc: Set Reports dialog window title. * glom/glom_developer.glade: Remove frame from Reports dialog. 2010-03-29 Daniel Borgmann Remove frame label on Fields dialog. * glom/box_reports.cc: Remove references to frame label. * glom/box_reports.h: Remove frame label member. * glom/frame_glom.cc: Set window icon for Fields and Relationships dialogs. * glom/glom_developer.glade: Adjust Fields and Relationships dialogs. * glom/mode_design/dialog_design.cc: Remove references to frame label. * glom/mode_design/dialog_design.h: Remove frame label member. * glom/mode_design/dialog_fields.cc: Remove references to frame label. * glom/mode_design/dialog_relationships.cc: Remove references to frame label. * glom/mode_design/print_layouts/box_print_layouts.cc: Remove references to frame label. * glom/mode_design/print_layouts/box_print_layouts.h: Remove frame label member. * glom/navigation/box_tables.cc: Remove references to frame label. 2010-03-29 Murray Cumming Merged from master, and use SqlBuilder for DISTINCT and LIMIT. 2010-03-29 Mario Blättermann Updated German translation 2010-03-29 Murray Cumming Avoid Operation Not Supported warnings at startup. * glom/application.cc: * glom/bakery/app_withdoc.cc: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/connectionpool_backends/sqlite.cc: * glom/libglom/document/bakery/document.cc: * glom/libglom/utils.cc: * glom/xsl_utils.cc: Avoid creating a Gio::File() from an empty URI, avoiding useless stdout warnings at startup. 2010-03-29 Daniel Borgmann Edit Field Definition Dialog adjustments. * glom/glom_developer.glade: Update alignment and spacings, add mnemonics. * glom/mode_design/fields/box_db_table_definition.cc: Set window icon. 2010-03-29 Bruno Brouard Updated French translation 2010-03-29 Daniel Borgmann Export Format dialog adjustments. * glom/filechooser_export.cc: Set icon name for export format dialog. * glom/glom_developer.glade: (Export Format) Remove frame, move Add button to the start. * glom/mode_design/layout/dialog_layout_export.cc: Rename treeview header to "Fields" to replace the label. 2010-03-29 Daniel Borgmann Print Layouts dialog adjustments. * glom/frame_glom.cc: Set title and transient for Print Layouts dialog. * glom/glom_developer.glade: Remove the frame from Print Layouts dialog. 2010-03-28 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-03-28 Marek ÄŒernocký Update Czech translation 2010-03-27 Marek ÄŒernocký Update Czech translation 2010-03-26 Mario Blättermann Updated German translation 2010-03-26 Bruno Brouard Updated French translation 2010-03-26 Murray Cumming Fix the build. 2010-03-26 Murray Cumming Say when a chosen file doen't exist, and remove it from the history. * glom/libglom/document/bakery/document.[h|cc]: Add an enum for standard failure_codes, including a last enum values that custom codes should start after. read_from_disk(): Set a failure_code output variable here too, so we can detect non-existant files. * glom/libglom/document/document.h: Start the custom code after the last standard one. * glom/bakery/app_withdoc.cc: open_document(): Remove non-existant files from the recent files history. * glom/application.cc: ui_warning_load_failed(): Say if the file could not be found, instead of being mysterious. This happens for me often for recent files that I have deleted. 2010-03-26 Daniel Borgmann Adjust file chooser dialogs. * glom/dialog_existing_or_new.cc: Adjust title of file open dialog, set glom icon. * glom/utility_widgets/filechooserdialog_saveextras.cc: Set glom icon. 2010-03-26 Daniel Borgmann Fix filechooser title label. * glom/utility_widgets/filechooserdialog_saveextras.cc: Add colon and mnemonic to "Title" label. 2010-03-26 Daniel Borgmann Fix column spacing in connection dialog. * glom/glom.glade: Set column spacing in connection dialog to 12px. 2010-03-26 Daniel Borgmann Connection dialog adjustments. * glom/dialog_connection.cc: Add glom icon and remove maemo title hack as primary text does not exist anymore. * glom/glom.glade: Remove double title from connection dialog and make it HIG/GNOME conform. 2010-03-26 Daniel Borgmann Export dialog adjustments. * glom/filechooser_export.cc: Add glom icon and set mnemonic for Export button. 2010-03-26 Daniel Borgmann Adjustments for Import dialog. * glom/frame_glom.cc: Set window icon and update title text. 2010-03-26 Daniel Borgmann Adjustments for Tables dialog. * glom/application.cc: Use gtkmm API to set document icon. * glom/frame_glom.cc: Change Tables dialog title to "Edit Tables" to match the command name. * glom/glom.glade: Remove the frame. * glom/navigation/box_tables.cc: Change column name from Tables to Table. * glom/navigation/box_tables.h: Remove frame member. * glom/window_boxholder.cc: Set icon and default position to center on parent. 2010-03-25 Marek ÄŒernocký Update Czech translation 2010-03-25 Murray Cumming Glade files: Remove adjustment objects, simplifying window instantiation. * glom/glom_developer.glade: Remove useless (default, empty) adjustment objects, so we can load the windows with GtkBuilder without specifying them. Recent versions of Glade no longer seem to create these when they would just have default values. * glom/base_db.cc: * glom/frame_glom.cc: * glom/glom.glade: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.c c: * glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc: * glom/mode_design/print_layouts/dialog_text_formatting.cc: Don't provide the id of the adjustment, removing the silly workaround. 2010-03-24 Mario Blättermann Updated German translation 2010-03-24 Daniel Borgmann Don't show error dialog when user cancels template creation. * glom/application.cc: Display error message when trying to create a document from template in client-only-mode. * glom/bakery/app_withdoc.cc: Don't display error message if the document is rejected, let the application decide about it. 2010-03-23 Bruno Brouard Updated French translation 2010-03-23 Murray Cumming 1.13.9 2010-03-23 Murray Cumming Refactored combo classes. * glom/utility_widgets/comboglomchoicesbase.[h|cc]: Split into combochoices.[h|cc] and combochoiceswithtreemodel.[h|cc] so that combo_as_radio_buttons.[h|cc] doesn't need to have an unused treemodel. 2010-03-23 Murray Cumming Formatting: Choices: Add a Display as radio buttons option. * glom/glom_developer.glade: formatting: choices: Add a Show As Radio Buttons checkbox. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: set/get_choices_restricted(): Add a show_as_radio_buttons output parameter. * glom/libglom/document/document.cc: load_after_layout_item_formatting(), save_after_layout_item_formatting(): load and save the new formatting detail. * glom/mode_design/layout/layout_item_dialogs/box_formatting.[h|cc]: Handle the new checkbox and make sure that it is only sensitive when the choices are restricted, because radio buttons provide no way to enter freeform data. * glom/utility_widgets/comboglomchoicesbase.h: Make set_choices() and set_choices_with_second() virtual. * glom/utility_widgets/combo_as_radio_buttons.[h|cc]: A new widget that is a vbbox of radio buttons, with a combo-like API. * Makefile_glom.am: Mention the new files. * glom/utility_widgets/datawidget.cc: Refactor some repeated code into create_combo_widget_for_field() and create the radiobuttons widget when necessary. 2010-03-23 Murray Cumming Fix the ChangeLog 2010-03-22 Murray Cumming Fix the distcheck. Don't use deprecated gtkmm API. * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/placeholder-glom.cc: Adapt to deprecated gtkmm API. Use get_has_window() and set_has_window() instead of get_flags(), unset_flags() and set_flags(). 2010-03-21 Murray Cumming Small fixes to glade file. * glom/glom_developer.glade: Add some still-missing vbox orientation=vertical lines. 2010-03-21 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-03-20 Mario Blättermann Updated German translation 2010-03-20 Leonid Kanter Update Russian translation 2010-03-20 Fryderyk Dziarmagowski Make Glom build with autoconf 2.65. * configure.ac: Remove brackets to make Glom build with newer autoconf. 2010-03-19 Murray Cumming Added missing file 2010-03-17 Bruno Brouard Updated French translation 2010-03-17 Daniel Mustieles Updated Spanish translation 2010-03-16 David King Fix GtkVBox orientation in GtkBuilder files * glom/glom.glade: * glom/glom_developer.glade: Manually set the orientation of GtkVBox objects specified in the GtkBuilder files to ‘vertical’. See GNOME bug #587256 for details of the issue with Glade. 2010-03-16 Murray Cumming Tests: Check that the .glade files are valid XML. * Makefile_tests.am: * tests/test_glade_file_validation.sh: Add this text that the .glade files are basically valid XML. It would be nice to have a Glade DTD to validate them against too. We should also check that each top-level widget can be instantiated by GtkBuilder. 2010-03-16 Murray Cumming Add a startup script feature. * libglom/document/document.cc: Added get/set_startup_script(). load_after(), save_before(): Load and save the startup script. * glom_developer.glade: * glom/mode_design/dialog_database_preferences.[h|cc]: Add a startup script tab. * libglom/python_embed/py_glom_ui.h: Move PythonUICallbacks into its own py_glom_ui_callbacks.h header. * glom/python_embed/python_ui_callbacks.[h|cc]: Add this derived callbacks class that has handlers that call methods in the application. * glom/mode_data/box_data.cc: execute_button_script(): Use the new callbacks class instead of using member methods here. * glom/application.cc: on_document_load(): Run the startup script, if any, after loading the document, using the new derived callbacks class. * Makefile_glom.am, Makefile_libglom.am: Mention the new files. 2010-03-15 David King Depend on gtkmm >= 2.19.2, fixing GNOME bug #612796 * configure.ac: Bump glom gtkmm version requirement to >= 2.19.2 for Gtk::ToolPalette. Fixes GNOME bug #612796. 2010-03-15 David King Depend on libxml++ >= 2.23.1, fixing GNOME bug #612794 * configure.ac: Bump libglom libxml++ version requirement to >= 2.23.1 for xmlpp::Element::add_child_text_before(). Fixes GNOME bug #612794. 2010-03-09 Murray Cumming Intial Dialog: Do not crash sometimes if cancelling the file chooser. * glom/application.cc: offer_new_or_existing(): Show the dialog again if we get a 0 response, because we cannot (yet) prevent the dialog from doing this when the child file chooser dialog is cancelled. Fixes a crash if pressing the Select button instead of double-clicking on an item. Bug #612303 (David King) 2010-03-08 Murray Cumming 1.13.8 2010-03-08 Murray Cumming Slight update of Small Business example. * examples/example_smallbusiness.glom: Resave, with a new record with a picture of a polar bear for use on the www.glom.org website. The picture is from http://www.flickr.com/photos/mape_s/350700095/ (Creative-Commons licensed, by Marieke IJsendoorn-Kuijpers) 2010-03-08 Murray Cumming Python button scripts: Rename print() to print_layout() and add start_new_record(). * glom/application.[h|cc] * glom/frame_glom.[h|cc] * glom/libglom/python_embed/py_glom_ui.[h|cc] * glom/mode_data/box_data.[h|cc] * glom/mode_data/box_data_details.[h|cc] * glom/mode_data/notebook_data.[h|cc] * glom/python_embed/python_module/py_glom_module.cc: * tests/test_python_execute_script.cc: Add a ui.start_new_record() python method, and rename ui.print() to ui.print_layout() because print seems to be a python keyword that can't be used as a method name, seen when trying to use it in the unit test. 2010-03-08 Peter Penz Fix the build with exceptions disabled. * glom/libglom/document/bakery/document_xml.cc: * glom/mode_design/iso_codes.cc: The exception handling is enabled by the define LIBXMLPP_EXCEPTIONS_ENABLED. But this is a typo, as libxml++ defines LIBXMLCPP_EXCEPTIONS_ENABLED. 2010-03-08 Murray Cumming Python button scripts: Add ui.print() and ui.print_reports(report_name). * glom/application.[h|cc]: Add print() and print_report(), calling methods in the frame widget. * glom/libglom/python_embed/py_glom_ui.[h|cc]: Add new print() and print_report() methods, adding callback slots for use by Glom. * glom/python_embed/python_module/py_glom_module.cc: Register the new Python methods. * glom/mode_data/box_data.[h|cc]: execute_button_script(): Handle the new signals, calling the new methods in Application. 2010-03-07 Murray Cumming Details: Align widgets in other columns too. * glom/utility_widgets/flowtable.[h|cc]: Added get_columns_count(). * glom/mode_data/flowtablewithfields.[h|cc]: apply_size_group_to_label(): Change this to apply_size_groups_to_label(). align_child_group_labels(): Create a size group for each possible column, and call apply_size_groups_to_label() with them. 2010-03-06 Murray Cumming Details: Align widgets in the first columns of neighbouring layout groups. * glom/utility_widgets/flowtable.[h|cc]: Added get_column_for_first_widget(), to discover what column a widget is in, and whether it has even been assigned to a column yet (if the size has been allocated already.) FlowTableItem: Remember whether the item has a column number and what it is. on_size_allocate(): Remember the column numbers of items for later retrieval. * glom/mode_data/flowtablewithfields.[h|cc]: Info, add_field_at_position(): Store the pointer to eventbox too, so we can later discover its column from the base FlowTable. Add align_child_group_labels(), to make all first-level labels in child flowtables share a single Gtk::SizeGroup, making them align. Add apply_size_group_to_labels() to actually add the labels to the size group. add_layout_group_at_position(): Call align_child_group_labels() on new sub-flowtables. on_size_allocate(): After the base class has allocated the spaces for the child widgets, after it therefore knows the column positions for the widgets, call apply_size_group_to_labels() to make them align. * glom/mode_data/box_data_details.cc: create_layout(): Call align_child_group_labels() to align items in top-level groups. 2010-03-06 Murray Cumming Details: Do not make field widgets too wide, so this fits on a laptop screen. * glom/utils_ui.cc: get_suitable_field_width_for_widget(): Do not add 150 to all calculated widths. I don't know why this code ever did that. 2010-03-05 Bruno Brouard Updated French translation 2010-03-05 flip Updated Portuguese translation 2010-03-04 Murray Cumming 1.13.7 2010-03-01 Mario Blättermann Updated German doc translation 2010-02-28 Murray Cumming Python button scripts: Avoid a crash with buttons in lists. * glom/mode_data/box_data_list.[h|cc]: on_adddel_script_button_clicked(): Run the script in the (existing) on_script_button_idle() idle handler because the script can cause the cell (that is emitting the signal) to be destroyed, by navigating to a different table. This fixes that crash. * glom/mode_data/box_data_list_related.cc: Do the same here. * glom/mode_data/notebook_data.cc: on_list_user_requested_details(): Use the same idle handler trick here, just in case. 2010-02-28 Murray Cumming Button scripts: Don't change the table back after the script has shown another. * glom/mode_data/box_data_details.cc: on_flowtable_script_button_clicked(): Avoid refreshing the data if the script changed what table is shown, because that would change it back. 2010-02-28 Murray Cumming Added unit test for the new button script ui python API. * Makefile_tests.am: * tests/test_python_execute_script.cc: Added unit test for the new button script ui python API. 2010-02-28 Murray Cumming PyGlomUI: Simplify the callbacks object. * glom/libglom/python_embed/py_glom_ui.[h|cc]: Use public sigc::slots instead of signals, to simplify this. * glom/mode_data/box_data.cc Box_Data::execute_button_script(): Adapt. 2010-02-28 Murray Cumming 1.13.6: 2010-02-28 Murray Cumming Fix the python function tests. * glom/python_embed/glom_python.cc glom_execute_python_function_implementation, glom_evaluate_python_function_implementation: Import the glom python module before trying to create a boost::python::object(new PyGlomRecord), to avoid an exception in the tests. 2010-02-28 Murray Cumming Correct the ChangeLog 2010-02-28 Murray Cumming Many files: Rename App_Glom to Application (in namespace Glom). 2010-02-28 Murray Cumming Python button scripts: Add show_table_details() and show_table_list(). * Makefile_libglom.am: * glom/python_embed/python_module/py_glom_module.cc: * glom/libglom/python_embed/py_glom_ui.[h|cc]: Added a PyGlomUI object that can be passed to python functions in addition to the record object, with methods to navigate in the UI. So far there is just show_table_details() and show_table_list(). * glom/glom_developer.glade: Script editor window: Mention the extra ui parameter. * glom/python_embed/glom_python.[h|cc]: Add a callback object parameter so scripts can tell the caller to change things in the UI. * glom/frame_glom.h: Made show_table() public so that the Application can call it. * glom/application.[h|cc]: Add show_table_details() and add_show_list() methods for the callbacks to call. * glom/mode_data/box_data.[h|cc]: Handle the callback signals, to actually do the navigation when a python script requests it. * glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc: Adapted. 2010-02-27 Murray Cumming Python: Prevent field calculations from changing the data in other fields. * glom/libglom/python_embed/py_glom_record.[h|cc]: Added set_read_only(). * glom/python_embed/glom_python.[h|cc]: glom_evaluate_python_function_implementation(): Add a bool read_only parameter that defaults to true. glom_execute_python_function_implementation(): Pass read_only=false so scripts can write data to the database via the record object. 2010-02-27 Murray Cumming Use Gnome::Gda::SqlBuilder * several files: Use Gnome::Gda::SqlBuilder to simplify query building and to make it safer. Much of this work was actually by Johannes Schmid for Openismus. 2010-02-27 Murray Cumming Increase required version of libgdamm. * configure.ac: Increase libgdamm dependency to the last one that doesn't need libgda 4.1/4.2. We actually need some API that was not in the older one. 2010-02-27 Murray Cumming Revert use of SqlBuilder because it requires libgda 4.1, which will not be packaged by the upcoming Ubuntu Lucid, which is an important version of an important distro. 2010-02-27 Murray Cumming More uses of SqlBuilder for SELECT and UPDATE statements. This requires the latest libgdamm API. There are several TODOs because I need to find out how to do some things with the GdaSqlBuilder API. 2010-02-27 Murray Cumming Fix runtime problems with the use of SqlBuilder. * glom/base_db.[h|cc]: query_execute_select(), query_execute(): Catch more errors and output better debug and error text. get_database_preferences(): Don't bother catching exceptions already caught by query_execute*(). add_standard_tables(): Fix a typo in the SQL query. insert_example_data(): Work around an inability in GdaSqlBuilder to INSERT a NULL value. I have asked about it on the mailing list. 2010-02-26 Murray Cumming Fixed the tests build. * tests/test_python_execute_func.cc: * tests/test_python_execute_func_date.cc: Updated for the extra parameters for glom_evaluate_python_function_implementation(). 2010-02-25 Murray Cumming Python functions: Allow setting of values in the record via []. * glom/python_embed/python_module/py_glom_module.cc: Specify a setitem(), so python code can use [] syntax to set the record's field values as well as getting them. * glom/libglom/python_embed/py_glom_record.[h|cc]: PyGlomRecord_SetFields(): Take and store the primary key details and value, and use it in setitem() to UPDATE the value in the database. * glom/python_embed/glom_python.[h|cc]: glom_execute_python_function_implementation(), glom_evaluate_python_function_implementation(): Take the primary key field and value. * glom/base_db.cc: * glom/base_db_table_data.cc: * glom/mode_data/box_data.cc: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc: Adapted. 2010-02-23 Kjartan Maraas Updated Norwegian bokmÃ¥l translation 2010-02-22 Murray Cumming Avoid showing %20 in the window title. * glom/libglom/document/bakery/document.cc: get_name(): Use Gio::FileInfo::get_display_name() instead of Glib::filename_display_basename() or Glib::filename_display_name(), to avoid showing %20 in the window title bar when there are spaces in the file name. Noticed by Daniel Borgmann. 2010-02-22 Murray Cumming 1.13.5 2010-02-22 Peter Penz libglom: Fix build issue for Maemo. * glom/libglom/data_structure/glomconversions.cc: get_text_for_gda_value(): Add an ifdef for the disabled-exceptions build. 2010-02-22 Murray Cumming Python functions: Fix regression since the switch to boost::python. * glom/python_embed/python_module/py_glom_module.cc: PyRelatedRecord: Fix a typo on the getitem() and len() declarations so we can really get a related record. 2010-02-22 Murray Cumming Python functions: Avoid a crash. * glom/python_embed/glom_python.cc: glom_evaluate_python_function_implementation(): When calling the function object, catch exceptions instead of crashing. 2010-02-18 Jorge González Deleted duplicated image 2010-02-12 Murray Cumming Glom Python: Minor code improvement. * glom/python_embed/glom_python.cc: glom_evaluate_python_function_implemention(): Use the extra brackets trick to have boost::python::object and handle on one line, so I have to care less about handle<>. 2010-02-12 Murray Cumming Disable broken import tests. * Makefile_tests.am: Comment out the use of the import tests during make check. They hang most of the time, which is just stopping distcheck from working. We need to fix these (and or the importing itself). Then we can reenable them. 2010-02-11 Murray Cumming libglom/python_embed/: get_item(): Pass object by const reference. * glom/libglom/python_embed/py_glom_record.[h|cc]: * glom/libglom/python_embed/py_glom_related.[h|cc]: * glom/libglom/python_embed/py_glom_relatedrecord.[h|cc: getitem(): Pass the object by const &. 2010-02-11 Murray Cumming 1.13.4: Rename boost::python m4 macro. * configure.ac: * macros/ax_boost_python.m4: Rename to ax_boost_python_macro.m4 and rename the defined m4 macro, to avoid confusion with the cleaner (but not working) original. 2010-02-11 Murray Cumming Fix the build, due to file not added to git. * glom/libglom/python_embed/pygdavalue_conversions.cc: Added missing file to git. 2010-02-11 Murray Cumming Fixes for the boost::python configure checks. * configure.ac: AC_SUBST(PYTHON_CPPFLAGS) so our python checks can use it. * macros/ax_boost_python.m4: Use the previously-discovered python CPPFLAGS and LIBS so our checks really work. 2010-02-10 Murray Cumming Use boost::python instead of the Python C API, simplifying the code. * configure.ac: Check for boost::python. * Makefile.am: * Makefile_glom.am: Use boost::python CFLAGS and LIBS. * macros/ax_boost_python.m4: Added this macro from http://www.nongnu.org/autoconf-archive/ax_boost_python.html and hacked it to make it actually work. * glom/python_embed/glom_python.cc: Use BOOST_PYTHON_MODULE() instead of the obscure Python C API structs and fields that were here and in the other .cc files. * glom/main.cc: * glom/libglom/python_embed/py_glom_record.[h|cc] * glom/libglom/python_embed/py_glom_related.[h|cc] * glom/libglom/python_embed/py_glom_relatedrecord.[h|cc] * glom/python_embed/python_module/py_glom_module.[h|cc]: * tests/test_python_execute_func.cc: Use boost::python, for instance via boost::python::object, to simplify memory management. * Makefile_libglom.am: * glom/libglom/python_embed/pygdavalue_conversions.[h|c]: Change this to a .cc file, using C++, using boost::python. 2010-02-08 Peter Penz libglom: Fix build issue for Maemo. * glom/libglom/data_structure/glomconversions.cc: get_text_for_gda_value(): Add an ifdef for the disabled-exceptions build. 2010-02-08 Murray Cumming Trying to please git. 2010-02-08 Murray Cumming 1.13.3 2010-02-08 Murray Cumming Fixed merge conflict. 2010-02-06 Daniel Mustieles Updated Spanish translation 2010-02-04 Mario Blättermann Updated German translation 2010-02-04 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-02-03 Michael Hasselmann Fixed a crash that got uncovered by the previous commit * glom/libglom/utils.cc (build_sql_select_fields_to_get): Warn about layout items that are null and skip them. 2010-02-03 Michael Hasselmann Added a guard clause when adding relationships from fields * glom/libglom/utils.cc (add_to_relationships_list): If an invalid layout item is passed then its relationship cannot be queried. Libglom users can also force layout item fields that are null into this function, hence an additional guard clause was added. 2010-02-02 Murray Cumming Do not include pygtk.h * glom/libglom/python_embed/py_glom_record.h: * glom/libglom/python_embed/py_glom_relatedrecord.h: * glom/python_embed/glom_python.cc: Include pygobject.h instead of pygtk/pygtk.h, because we do not use anything from pygtk, or link to it. 2010-02-02 Marek ÄŒernocký Update Czech translation 2010-01-31 Murray Cumming Command-line parsing: Added some checks. * glom/main.cc: Test the command-line argument filepath for existence and check that it's not a directory, so it fails before even showing UI. 2010-01-31 Murray Cumming Relationships Overview: Avoid GTK+ warnings. * glom/mode_design/relationships_overview/dialog_relationships_overview.cc: Constructor: Call add_accel_group(), which fixes the warnings during destruction mentioned in bug #607938. 2010-01-31 Murray Cumming Relationships Overview: Maybe fix a hang/crash. * glom/mode_design/relationships_overview/dialog_relationships_overview.[h|cc]: Signal handlers: Take sigc::bind() RefPtr parameters by value instead of by const &, to avoid having to use sigc::ref() or worry if it works. Save sigc::connections in a list so we can disconnect signal handlers when deleting items bound with sigc::bind(). Do this in the destructor too, which seems to fix the valgrind errors in bug #594737, though not the "instance of invalid non-instantiatable type" warning. 2010-01-28 Michael Hasselmann Updated ChangeLog 2010-01-27 Michael Hasselmann Import tests: break mainloop on file read errors 2010-01-27 Michael Hasselmann Fixed the parser to perform stateless async file operations * glom/import_csv/csv_parser.[h|cc]: The parser relied on a member variable for its async giomm operations, which was able to cause interleaving state changes to it, corrupting the object in the worst case. This commit uses the source object as a slot parameter to avoid this state problem (working around BGO bug #608269). 2010-01-27 Michael Hasselmann Added a test for BGO bug #607938 * tests/import/data/albums.csv: Real-world example data used for the CSV import. * tests/import/utils.[h|cc]: Add the possibility to feed a filename into the ImportTest directly. * tests/import/test_parsing.cc: Test the CSV import of a whole file. 2010-01-27 Michael Hasselmann Updated ChangeLog 2010-01-27 Michael Hasselmann Added a g_return_if_fail check for invalid URLs * glom/import_csv/csv_parser.cc: Do not start the async reading if the file object is invalid. 2010-01-27 David King Documentation improvements for FieldFormatting and NumericFormatting * glom/libglom/data_structure/layout/fieldformatting.h: * glom/libglom/data_structure/numeric_format.h: Documentation improvements. 2010-01-27 Murray Cumming Update the ChangeLog 2010-01-27 Murray Cumming Cleanups 2010-01-27 Murray Cumming Simplify tool item memory management. 2010-01-27 Murray Cumming Use ToolGroupItem as C++. 2010-01-27 Murray Cumming Partially use Gtk::Toolpalette instead of GtkToolpalette. 2010-01-27 Murray Cumming Use GtkToolPalette instead of EggToolPalette. * Makefile_libegg.am: * glom/utility_widgets/egg/: Removed. * Other files: Use GtkToolPalette instead of EggToolPalette. Seems to work. 2010-01-27 Murray Cumming Merged from glom_1_12 2010-01-27 Murray Cumming libglom: Correct includes. * glom/libglom/*.h: Use the full include libglom/ path for headers, to avoid confusion and make life easier for other users of libglom. * glom/libglom/*.cc: Fixed them here just for consistency. 2010-01-26 Daniel Mustieles Updated Spanish translation 2010-01-25 Marek ÄŒernocký Update Czech translation 2010-01-25 Michael Hasselmann Fixed out-ouf-bounds access during CSV imports * glom/import_csv/dialog_import_csv.cc (get_field_for_column): Added boundary check for direct field access. Fixes bug #607938. 2010-01-25 Murray Cumming numeric_format.h: Remove unnecessary include of privileges.h. 2010-01-25 Murray Cumming Allow new files to have quotes in their titles. * glom/frame_glom.cc: connection_request_password_and_choose_new_database_name(): Remove quotes (and other unusual characters) from the generated database name, to avoid errors from the database backend. Bug #607957 (Michael Hasselmann) 2010-01-25 Murray Cumming numeric_format.h: Remove unnecessary include of privileges.h. 2010-01-25 Murray Cumming Allow new files to have quotes in their titles. * glom/frame_glom.cc: connection_request_password_and_choose_new_database_name(): Remove quotes (and other unusual characters) from the generated database name, to avoid errors from the database backend. Bug #607957 (Michael Hasselmann) 2010-01-24 Murray Cumming Remove commented code. 2010-01-24 Murray Cumming ldtp: Added an example central-info.xml, as mentioned in the README. 2010-01-24 Murray Cumming 1.13.2 2010-01-24 Murray Cumming Details: Buttons: Use horizontal aligment from formatting. * glom/mode_data/flowtablewithfields.cc: add_button_at_position(): Use a Gtk::HBox with either pack_start() or pack_end(), putting it in the FlowTable with expand=true to have alignment in the button's space, if we don't want the FlowTable's default (left) alignment. 2010-01-24 Murray Cumming Details: Static Text items: Use horizontal alignment from formatting. * glom/utility_widgets/labelglom.[h|cc]: Add a constructor that does not take alignment values, like the Gtk::Label base class, so we can easily use the default for vertical alignment. * glom/mode_data/flowtablewithfields.cc: add_textobject_at_position(): Use expand=true when adding the widget to the FlowTable, so that labels can have the full space in which to actually have alignment. * glom/utility_widgets/layoutwidgetbase.cc: apply_formatting: Use appropriate multi-line justification for labels, as a user would expect when setting horizontal alignment. 2010-01-23 Murray Cumming Details: Buttons: Use background color from formatting. * glom/mode_data/flowtablewithfields.cc: add_button_at_position(): Call apply_formatting on the button, not the label, so it has a chance to do the right thing on the right widget. 2010-01-23 Murray Cumming Details: Static Text items: Use background color from formatting. * glom/utility_widgets/labelglom.cc: Do not call set_visible_window(false) because we really need a visible child X window to be able to change the background color. 2010-01-23 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-01-23 Murray Cumming Details: Static Text items and Buttons: Use foreground color from formatting. * glom/utility_widgets/layoutwidgetbase.cc: apply_formatting(): Use the foreground color for labels (static text items and buttons). 2010-01-22 Murray Cumming Details: Static Text items: Use formatting. * glom/utility_widgets/labelglom.[h|cc]: Added get_label(), because this really has a label as a child. * glom/utility_widgets/layoutwidgetbase.cc: apply_formatting(): Use get_label() to make formatting work on static text items too. 2010-01-22 Murray Cumming Fixed compiler warnings. * glom/libglom/data_structure/layout/layoutitem_field.cc: get_formatting_used_horizontal_alignment(): * glom/print_layout/canvas_layout_item.cc: apply_formatting(): Fixed compiler warnings. 2010-01-22 Murray Cumming Make libglom-1.14 install in parallel with libglom-1.12. * glom/libglom/glom-1.12.pc.in: Rename to glom-1.14.pc.in * configure.ac: Change the libglom ABI version variable and specify the changed .pc.in file. * Makefile.am, Makefile_libglom.am: Adapt. * glom/python_embed/python_module/py_glom_module.[h|cc]: Mention 2.14 instead of 2.14. * tests/test_load_python_library.cc: Adapt. * glom/libglom/document/document.cc: get_latest_known_document_format_version(): Increment. 2010-01-22 Murray Cumming Really use formatting for multi-line fields. * glom/utility_widgets/textviewglom.[h|cc]: Added get_textview(). * glom/utility_widgets/layoutwidgetbase.cc: apply_formatting(): Get the appropriate child for buttons and textviews, making this work for textviews (multi line fields), but it still does not work for labels (static text items) and buttons. 2010-01-22 Murray Cumming Allow custom text formatting of Buttons as well as text items and fields. * glom/libglom/data_structure/layout/layoutitem_button.[h|cc]: Derive from LayoutItem_WithFormatting. * glom/libglom/document/document.[h|cc]: Make loading/saving of formatting generic so we get it for free whenever a new class derives from LayoutItem_WithFormatting. * glom/mode_data/flowtablewithfields.cc: on_dnd_add_layout_item_button(): Try to apply the formatting to the button's label, though it doesn't seem to work. 2010-01-22 Murray Cumming Allow editing of formatting for static text items. * glom/mode_design/layout/layout_item_dialogs/dialog_formatting.[h|cc]: Added generic formatting (not choices, not default/custom) dialog for static text items and maybe others. * glom/mode_design/layout/layout_item_dialogs/box_formatting.[h|cc]: set_formatting(): Add optional bool paramters to hide numeric formatting and choices. * glom/base_db.[h|cc]: Added offer_item_formatting() to use this dialog. * glom/mode_design/layout/dialog_layout_details.cc(): Allow editing of the formatting for static text items instead of just fields. * glom/utility_widgets/db_adddel/db_adddel.cc: construct_specified_columns_cellrenderer(): Apply the formatting to any LayoutItem_WithFormatting, not just fields. * glom/mode_data/flowtablewithfields.cc: add_textobject_at_position(): Try to apply the formatting to the label, but it doesn't seem to work. 2010-01-22 Murray Cumming Add LayoutItem_WithFormatting as a Field/StaticText common base class. * glom/libglom/data_structure/layout/layoutitem_withformatting.[h|cc]: Added LayoutItem_WithFormatting. * glom/libglom/data_structure/layout/layoutitem_text.[h|cc]: * glom/libglom/data_structure/layout/layoutitem_field.[h|cc]: Derive from Layout_WithFormatting, so we can use the base class polymorphically, making it easier to support formatting for static text items. * glom/utility_widgets/layoutwidgetbase.[h|cc]: apply_formatting(), * glom/print_layout/canvas_layout_item.[h|cc]: apply_formatting(): Make this generic for LayoutItem_WithFormatting. 2010-01-22 Murray Cumming Show the alternative colors for negatives in fields with choices too. * glom/utility_widgets/comboentryglom.cc: set_value(): * glom/utility_widgets/comboglom.cc: set_value(): Use the alternative negative color feature here too. 2010-01-22 Murray Cumming Field Formatting: Text Formatting: Add horizontal alignment option. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: Added get/set_horizontal_alignment(). * glom/libglom/data_structure/layout/layoutitem_field.[h|cc]: Added get_formatting_used_horizontal_alignment() to interpret the AUTO alignment depending on the fields details. * glom/libglom/document/document.cc: load_after_layout_item_formatting(), save_before_layout_item_formatting(): load/save the new setting. * glom/glom_developer.glade: window_formatting: Added the alignment combo. * glom/mode_design/layout/layout_item_dialogs/box_formatting.[h|cc]: Show/Save the alignment. * glom/utility_widgets/db_adddel/db_adddel.cc: apply_formatting(): * glom/utility_widgets/entryglom.cc: init(): * glom/utility_widgets/comboentryglom.cc: set_layout_item(): Set xalign from get_formatting_used_horizontal_alignment(). 2010-01-21 Marek ÄŒernocký Update Czech translation 2010-01-20 Murray Cumming 1.12.5 2010-01-20 Murray Cumming Fix a crash in previous commit. * glom/utility_widgets/db_adddel/db_adddel.cc: get_fixed_cell_height(): Fixed a null-pointer crash when also checking LayoutItem_Text items, though the UI doesn't actually allow the font to be specified for them yet. 2010-01-20 Murray Cumming List View: Don't chop off the bottom of text when using large fonts. * glom/utility_widgets/db_adddel/db_adddel.cc: get_fixed_cell_height(): Use the font description from the FieldFormatting, to get a more suitable max height for all columns. remove_all_columns(): Set m_fixed_cell_height back to 0 so it will be recalculated for the new columns. Fixes bug #607023 (Michael Hasselmann) 2010-01-19 Daniel Mustieles Updated Spanish translation 2010-01-19 Murray Cumming Update NEWS for a release soon. 2010-01-19 Michael Hasselmann Make the default precision used for stringstreams available for libglom users * glom/libglom/data_structure/glomconversions.[h|cc] (get_stringstream_precision_default): Wrap the constant used into a function and export it in the headers. Users of libglom need it to show the same precision for Glom's numeric type. 2010-01-19 Mario Blättermann Updated German translation 2010-01-19 Michael Hasselmann Add forgotten header to libglom's Makefile * Makefile_libglom.am: libglom_include_HEADERS forgot to mention utils.h although it was mentioned in the *_la_SOURCES. 2010-01-19 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-01-18 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-01-17 Mario Blättermann Updated German translation 2010-01-16 Murray Cumming Field Formatting: Negative values color: Make this just a bool check box. * glom/libglom/data_structure/numeric_format.[h|cc]: Use just a bool to say if negative values should be shown in an alternative color. Add static get_alternative_color_for_negatives() to get that color. * glom/libglom/data_structure/layout/fieldformatting.cc: get_text_format_color_foreground_to_use(): Updated the implementation. * glom/libglom/document/document.cc: load_after_layout_item_formatting(), save_before_layout_item_formatting(): Updated. * glom/glom_developer.glade: window_formatting: Show only a checkbox, not a color too, for the alternative color for negatives. * glom/mode_design/layout/layout_item_dialogs/box_formatting.[h|cc]: Updated. 2010-01-16 Mario Blättermann Updated German translation 2010-01-15 Michael Hasselmann Add forgotten header to libglom's Makefile * Makefile_libglom.am: libglom_include_HEADERS forgot to mention utils.h although it was mentioned in the *_la_SOURCES. 2010-01-15 Michael Hasselmann Updated the comment for NumericFormat's default precision * glom/libglom/data_structure/numeric_format.h (get_default_precision): The precision applies to the decimal places only, not the whole number. Comment updated. 2010-01-15 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2010-01-15 Murray Cumming Field Formatting: Allow an alternative color for negative values. * glom/libglom/data_structure/numeric_format.[h|cc]: Added m_foreground_color_for_negatives. * glom/libglom/data_structure/layout/fieldformatting.[h|cc]: Added get_text_format_color_foreground_to_use(). * glom/libglom/document/document.cc: load_after_layout_item_formatting(), save_before_layout_item_formatting(): load/save the new setting. * glom/glom_developer.glade: window_formatting: Added negatives color and checkbox to the numeric formatting tab. * glom/mode_design/layout/layout_item_dialogs/box_formatting.[h|cc]: Show/Save the color. * glom/utility_widgets/db_adddel/db_adddel.cc: treeviewcolumn_on_cell_data()_ * glom/utility_widgets/entryglom.cc: set_value(): Use the color for negatives if appropriate. * glom/print_layout/canvas_layout_item.cc: Add a TODO to use it here too. 2010-01-14 Murray Cumming libglom: Some API documentation. * glom/libglom/data_structure/layout/layoutitem_field.h: * glom/libglom/data_structure/layout/usesrelationship.h: Added doxygen comments at request of Michael Hasselmann. 2010-01-14 Murray Cumming Rename get_stringstream_precision_default(). * glom/libglom/data_structure/glomconversions.[h|cc]: get_stringstream_precision_default(): Rename this to the slighly-better named (because it's not mentioning implementation) NumericFormat::get_default_precision() in * glom/libglom/data_structure/numeric_format.[h|cc]: and document it vaguely. 2010-01-14 Murray Cumming Minor simplification. * glom/libglom/data_structure/glomconversions.cc: get_stringstream_precision_default(): Simplify this function, for Michael to see. 2010-01-14 Michael Hasselmann Make the default precision used for stringstreams available for libglom users * glom/libglom/data_structure/glomconversions.[h|cc] (get_stringstream_precision_default): Wrap the constant used into a function and export it in the headers. Users of libglom need it to show the same precision for Glom's numeric type. 2010-01-12 Murray Cumming Music Collection Example: Changed a layout. * examples/example_music_collection.glom: Albums: List View: Add some related records to show a problem in Qlom. 2010-01-08 Murray Cumming Correct use of locales when creating text representations. * glom/main.cc: Set std::locale::global() to the user's current locale, forcing us to imbue streams to whatever we actually want. * glom/libglom/connectionpool_backends/postgres_self.cc: startup(): Do not use Utils::string_from_decimal() for the port number, because it is meant to use the user's locale, but we need it in the C locale. * glom/libglom/data_structure/field.cc: to_file_format(): Use std::locale::classic() when we want the C locale, not std::locale(), which means the user's locale, which was previously the C one by chance. * glom/libglom/utils.cc: string_from_decimal(): Imbue the stream as wanted. 2010-01-08 Michael Hasselmann Fix potential encoding error for currency symbols * glom/libglom/data_structure/glomconversions.cc (get_text_for_gda_value): Glom's numeric type can be prefixed with a currency symbol. If the symbol cannot be represented in the user's locale it would hide all data for the column. This is fixed by using a fallback conversion for the symbol. Fixes bug #606349. 2010-01-07 Armin Burgmeier Make Glom on Windows find the correct python module 2010-01-07 Armin Burgmeier * win32/build-installer: * win32/glom.iss.in: Install glom_1_12.pyd instead of glom.pyd. Bug #605593. 2010-01-02 Matej UrbanÄiÄ Added sl for Slovenian translation 2010-01-02 Andrej ŽnidarÅ¡iÄ Updated Slovenian translation 2009-12-31 Murray Cumming 1.12.4 2009-12-30 Murray Cumming Dnd layout: Avoid a crash when dragging to empty space. * glom/utility_widgets/flowtable_dnd.cc: on_drag_data_received(): Avoid dereferencing a null group. Bug #599232 2009-12-30 Murray Cumming Dnd layout: Avoid a crash. * glom/utility_widgets/flowtable_dnd.cc: on_drag_data_received(): Use a dynamic_cast<> to avoid memory corruption with the MI class. 2009-12-17 Armin Burgmeier Add missing libpangoft2-1.0-0.dll to installer 2009-12-16 Armin Burgmeier * win32/build-installer: * win32/glom.iss.in: Add missing libpangoft2-1.0-0.dll. Bug #599966. 2009-12-14 Murray Cumming desktop.in.in: Remove the Application category because krazy2 says it is deprecated. 2009-12-14 Murray Cumming Fix for krazy2 warning: Pre-increment instead of post-increment in for(). 2009-12-14 Murray Cumming Fixes for krazy2 warnings: Use of explicit and a non-const operator. 2009-12-14 Murray Cumming Fixes for krazy2 warnings: Char literals instead of single-char string literals. 2009-12-14 Murray Cumming Fixes for krazy2 warnings: true/false instead of TRUE/FALSE. 2009-12-14 Murray Cumming FlowTableDnd: Some refactoring. * glom/utility_widgets/flowtable_dnd.[h|cc], * glom/mode_data/flowtable_withfields.[h|cc]: Make FlowTableDnd less aware of LayoutItems, though it is still not yet generic enough. * glom/utility_widgets/test_flowtable_dnd.cc: * glom/Makefile_tests.am: Added test_flowtable_dnd. 2009-12-10 Murray Cumming example_film_manager.glom: Added silly example data, fixing bug #600859 (Michael Hasselmann) 2009-12-10 Murray Cumming Tests: Validate all examples against the DTD, and correct the DTD. * tests/dtd/test_example_sqlite: Renamed to test_file_validation.sh. * glom/Makefile_tests.am: Adapted. * glom/libglom/document/document.cc: save_before(): Correct the saving of group privileges so they are really inside the group nodes. Avoid saving unnamed groups, as seen in the example files. * glom/glom_document.dtd: Several corrections to fix the validation of the example files, though I don't like that DTDs don't seem to give us any way to say that the sequence of child elements is irrelevant. I don't like enforcing the sequence. 2009-12-10 Murray Cumming Fix distcheck. * Makefile.am: * Makefile_tests.am: Fix the distcheck by disting the DTD validation test script and the .glom file that it uses. * glom/libglom/init.cc: Redefine Python's PyDateTime_IMPORT macro, to avoid a compiler warning. See http://bugs.python.org/issue7463 * glom/main.cc: Avoid including Python's datetime.h, to avoid the same compiler warning. 2009-12-09 Murray Cumming Tests: Complete the test_python_execute_func_date test. * glom/libglom/python_embed/pygdavalue_conversions.c (glom_pygda_value_from_pyobject): Use g_date_new_dmy() so the GDate is really completely initialized, avoiding errors about invalid dates. * tests/test_python_execute_func_date.cc: Check the return type and value, by comparing the python result with the current date. Bug is now really fixed #603686. (Andrew Ruthven) 2009-12-09 Murray Cumming Fix the crash when calling python functions that return dates. * glom/libglom/python_embed/pygdavalue_conversions.c (glom_pygda_value_from_pyobject): Call the macro PyDateTime_IMPORT here, though it was already called in libglom_init(). I don't know why this fixes the crash, but it does. Bug #603686. (Andrew Ruthven) 2009-12-08 Murray Cumming Tests: Added glom_evaluate_python_function_implementation() tests. * Makefile_tests.am: * tests/test_python_execute_func.cc: * tests/test_python_execute_func_date.cc: Added two unit tests for Glom::glom_evaluate_python_function_implementation(). The date one currently fails, as in bug #603686. 2009-12-07 Murray Cumming Renable the crash handler. I disabled it while debugging. 2009-12-07 Murray Cumming Python: Trying to stop the PyDateTime_Check() crash. * glom/libglom/init.cc: libglom_init(): Call the PyDateTime_IMPORT macro, which is needed to stop PyDateTime_Check() and PyDate_Check() from crashing, at least in my simple test case. It still crashes in Glom though. * glom/main.cc: Do not initialize Python here because Glom::init() already did it, though doing it twice does not seem to be a problem. 2009-12-04 Murray Cumming Rename some functions to avoid fear of linking to the wrong one. * glom/libglom/python_embed/pygdavalue_conversions.[h|cc]: pygda_value_from_pyobject(), pygda_value_as_pyobject(): Add a glom_ prefix so we know we are not using the copy in pygda. * glom/python_embed/glom_python.cc: * glom/libglom/python_embed/py_glom_record.cc: * glom/libglom/python_embed/py_glom_relatedrecord.cc: Adapted. 2009-12-04 Murray Cumming Fix the build. * glom/base_db.cc.[h|cc]: Use the newer simpler SqlBuilder::select_add_target() method. 2009-12-04 Murray Cumming Field Definitions: Default value: Fix crash when selecting a date. * glom/utility_widgets/datawidget.cc: offer_field_list(), offer_field_layout(), offer_related_record_id_find(): Avoid crashes caused by calling set_transient_for() with a null parent window, for instance from the field definitions dialog. 2009-12-04 Murray Cumming Field Definitions: Show default value widget for date fields. * glom/utility_widgets/datawidget.cc: Constructor: show the hbox_parent widget, so the widgets always show up for the default value in the field definitio dialog for date fields. The details view must be doing this via a show_all() somewhere. 2009-12-03 Murray Cumming Removed debug output. 2009-12-03 Murray Cumming Related Records layout: Field formatting: Choices: Fix related choices. * glom/mode_design/layout/dialog_layout_details.[h|cc] * glom/mode_design/layout/dialog_layout_list_related.[h|cc]: Add virtual get_fields_table() and use this in on_button_field_formatting() so that the formatting dialog shows relationships for the to table instead of the parent table, when editing formatting for a field in a related records portal. Bug noticed by Michael Hasselmann and Andrew Ruthven. * glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.c: Removed some debug output. 2009-12-03 Murray Cumming Allow use of example documents that mention an unsupported backend. * glom/application.cc: check_document_hosting_mode_is_supported(): Don't check the backend if it is an example document because the user will choose it when saving anyway. 2009-12-02 Murray Cumming Fix the build. * glom/base_db.[h|cc]: Correct the use of Gda::SqlBuilder for the latest API. 2009-11-17 Murray Cumming tests: dtd: Now passes. * glom/libglom/document/bakery/document_xml.cc: get_node_document(): Added commented-out code to write the DOCTYPE declaration, if we ever want to specify the PUBLIC DTD idenitifier and URI in each document. Let's avoid that for now because we'd have to make sure that it's hosted properly. * tests/dtd/test_example_sqlite: Do not use --valid because that seems to always require a DTD in the document's DOCTYPE declaration. --dtdvalid seems to do the same thing already, but with the specified DTD. 2009-11-17 Murray Cumming glom_document.dtd: Mention the xmlns attribute because DTD validation doesn't know about XML namespaces. 2009-11-17 Murray Cumming Document: Ensure that the xmlns ID is always in saved documents. * glom/libglom/document/bakery/document_xml.cc: get_node_document(): Make sure that the xmlns ID is added, even when the root node already exists, for instance when opening existing documents. * examples/example_film_manager.glom: * examples/example_lesson_planner.glom: * examples/example_music_collection.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: * examples/sqlite/test_sqlite_music/test_sqlite_music.glom: Add the xmnls ID, to help to identify the MIME type of these documents. 2009-11-17 Murray Cumming Document saving: Remove unncessary empty singular_title nodes. * glom/libglom/document/document.cc: save_before_translations(): Do not create empty singular_title nodes. * examples/example_smallbusiness.glom: Resaved. 2009-11-17 Murray Cumming Partly fix the DTD validation test. * glom/glom_document.dtd: table: Correct the syntax for the child elements, to use ?, instead of | because they are all optional, instead of being alternatives for each other. Add the print_layouts element. * Makefile_tests.am: Change the order so the sometimes-hanging import tests are at the end, to make the tests more useful. 2009-11-16 Murray Cumming Added a Doxygen file just for libglom 2009-11-13 David King Fix check for SQLite and libgettextpo * configure.ac: Fix check for SQLite and libgettextpo. 2009-11-12 David King Update glom_document.dtd to more completely validate examples * glom/glom_document.dtd: Update to more completely validate example documents. * Makefile_tests.am: * tests/dtd/test_example_sqlite: Add a test that attempts to validate an example SQLite Glom document against glom_document.dtd. 2009-11-10 David King Fix incorrect conditional for Maemo libgettextpo check * configure.ac: Fix incorrect conditional for Maemo libgettextpo check. 2009-11-06 Murray Cumming Fix a crash when specifying a static image on the layout. * glom/utility_widgets/imageglom.cc: on_menupopup_activate_select_file(): Check for a null parent window pointer to avoid a crash, fixing bug #600954 (Michael Hasselmann). 2009-11-06 David King Do not check for or link to libgettextpo on Maemo * configure.ac: * Makefile_glom.am: Do not link to libgettextpo on Maemo, and additionally do not check for it either. 2009-11-04 Petr Kovar Updated Czech translation by Marek Cernocky 2009-11-04 David King Add Maemo-specific category to MIME-type file * glom.xml: Add Maemo-specific category for classification of .glom files as "documents". 2009-11-04 David King Statically link to libgettextpo on Maemo * Makefile_glom.am: Statically link to libgettextpo on Maemo, as Gettext is available in the SDK and autobuilder but not on the device. 2009-11-02 Murray Cumming Marked the version in the ChangeLog 2009-11-02 Murray Cumming Increased version 2009-11-02 Murray Cumming Remove hard-coded column sizes. 2009-10-30 Murray Cumming List views and related records portals: Enough space for titles. * glom/utils_ui.[h|cc]: get_suitable_field_width_for_widget(): Optionally calculate enough space for the title too, for TreeView columns. * glom/utility_widgets/db_adddel/db_adddel.cc: treeview_append_column(): When choosing a default column width, make sure there's enough for the title too. 2009-10-30 Murray Cumming List views and related records portals: Avoid zero-width columns. * glom/utility_widgets/db_adddel/db_adddel.cc: treeview_append_column(): Except on maemo, don't try to auto-expand a non-rightmost column, because that does not seem to be possible with fixed-height-mode, which we use for performance. 2009-10-30 David King Use libossomm on Maemo, to register a DBus service * configure.ac: * glom/main.cc: Initialize libossomm on Maemo, to register a DBus service. 2009-10-30 Murray Cumming Remove some unnecessary casts. 2009-10-29 David King Add .desktop and DBus .service files for Maemo 5 * configure.ac: * Makefile.am: * glom.desktop.in.in: * glom.service.in: Add DBus service file for Maemo 5, and install to the correct location as determined by the osso-af-settings pkg-config file. Adjust the installation location of the glom.desktop file on Maemo. 2009-10-28 Murray Cumming Trying to ignore unwanted column resize signals. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Removed unused set_column_width(). construct_specified_columns_cellrenderer(): Added an InnerIgnore, though we already use one in construct_specified_columns(). on_treeview_column_resized(): Check if we should ignore signals. Do not cast an int size to a guint, because it could be -1. 2009-10-28 Murray Cumming Avoid runtime warnings about 0 size TreeViewColumn. * glom/utility_widgets/db_adddel/db_adddel.cc: construct_specified_columns(), treeview_append_column(): Avoid calling TreeViewColumn::set_fixed_width() with a 0 size, avoiding a runtime assertion. 2009-10-28 Murray Cumming Fix some warnings. * glom/dialog_existing_or_new.cc: get_service_info(): Replace a 0 with (void*)0 to avoid a warning after my change on 2009-10-13. * glom/libglom/data_structure/has_title_singular.cc(): operator==(): Actually use the src parameter. 2009-10-28 Murray Cumming Do not mark an empty string for translation. * glom/dialog_connection.cc: set_confirm_existing_user_note(): Do not do _(), fixing bug #599868 (André Klapper). 2009-10-28 Marek ÄŒernocký Update Czech translation. 2009-10-27 Murray Cumming treeview_append_column(): Don't try to put -1 in a guint for the column width. 2009-10-25 Murray Cumming Fixed indendation 2009-10-25 Murray Cumming BaseDb::query_execute*(): Const corrections. * glom/base_db.[h|cc]: query_execute(), query_execute_select(): Const corrections and indentation corrections. 2009-10-24 Murray Cumming Ignore ~ backup files. 2009-10-24 Murray Cumming test_sqlite_music: Add singular titles for Maemo. 2009-10-24 Johannes Schmid Converted more query_execute() in base_db.cc to use SqlBuilder 2009-10-22 Armin Burgmeier Fixed the Windows build 2009-10-21 Armin Burgmeier * Makefile_libglom.am: Link against winsock on Windows. * glom/application.cc (constructor): ifdefed out the avahi callbacks setup on Windows. * glom/dialog_existing_or_new.cc (constructor): ifdefed out the code that expands the network item on Windows (because it doesn't exist there). * glom/libglom/connectionpool.h: * glom/libglom/connectionpool.cc: ifdefed out the avahi callback setup function, moved pgwin32_is_admin to main.cc. * glom/main.cc: Moved pgwin32_is_admin from connectionpool.cc. * glom/libglom/spawn_with_feedback.cc: Added include, required for the Windows build. * glom/mode_design/print_layouts/print_layout_toolbar_button.cc: * glom/utility_widgets/layouttoolbar.cc: * glom/utility_widgets/layouttoolbarbutton.cc: * glom/xsl_utils.cc: Fixed the construction to path files relative to the executable on Windows: Glib::build_filename does take only two arguments, not three. * win32/build-installer: * win32/glom.iss.in: Updated. 2009-10-21 Armin Burgmeier Fix python library lookup on Windows 2009-10-21 Armin Burgmeier * macros/mm-python.m4: Fix the python library lookup on Windows: Avoid a python error if get_config_var('LIBS') is None and include $PREFIX/libs and $EXEC_PREFIX/libs in the search path because this is where the official Python installer puts the library in. 2009-10-21 Johannes Schmid Started to port query_execute(_select)() calls in base_db.cc to use SqlBuilder instead of plain-text SQL 2009-10-19 David King Add missing backslash in Makefile_libglom.am * Makefile_libglom.am: Add missing backslash, fixing commit e38fcaab322d4774faae2ecb707cdf67f84dd6ea. 2009-10-19 Murray Cumming Remove unwanted merge change. 2009-10-19 Murray Cumming Remove unwanted merge change. 2009-10-19 Murray Cumming Added a TODO. 2009-10-19 Murray Cumming Maemo: Adapt for latest hildonmm changes. * glom/utility_widgets/comboentryglom.cc: * glom/utility_widgets/comboglom.cc: get/set_active() changed to set_selected() and we now have an iter-base get/set_selected() for the PickerButton so we don't need to get the TouchSelector. 2009-10-18 Mario Blättermann Updated German translation 2009-10-17 Daniel Mustieles Updated Spanish translation 2009-10-16 Murray Cumming Maemo: Fix the build for the latest hildonmm. * glom/navigation/maemo/pickerbutton_table.cc: * glom/utility_widgets/comboentryglom.cc: * glom/utility_widgets/comboglom.cc: Adapt to changed (simpler) TouchSel ector API. 2009-10-16 Murray Cumming Remove unwanted changes from merge. 2009-10-16 Murray Cumming Maemo: Correct x-pad to xpad for cell renderers. 2009-10-16 Murray Cumming Remove some debug output. 2009-10-16 Murray Cumming Maemo: Fix my previous commit. * glom/utility_widgets/datawidget.cc: set_child_size_by_field(): Move the ifdefs around so normal fields get sensible sizes again on Maemo. 2009-10-16 Murray Cumming Maemo: Make TextViews small to begin with. * glom/utility_widgets/datawidget.cc: set_child_size_by_field(): On Maemo, do not increase the height of the TextView, even if specified in the layout, because HildonTextViews expand automatically on Maemo when entering more text. 2009-10-16 Murray Cumming Maemo: When adding related records, show the foreign key value. * glom/mode_data/box_data_portal.cc: on_maemo_appmenubutton_add(): Actually show the field value that links the new related record to the parent record, though this is a bit hacky and will only work for autogenerated keys. 2009-10-16 Murray Cumming Maemo: Actually show new related record in the list. * glom/mode_data/box_data_portal.[h|cc]: on_maemo_appmenubutton_add(): * glom/mode_data/notebook_data.[h|cc]: Constructor: Update the window when the maemo details window is hidden, for instance to show the new related record in the portal. 2009-10-16 Murray Cumming * glom/libglom/document/document.cc: load_after(), save_before(): Avoid crashes when load/saving singular_titles. 2009-10-16 Murray Cumming Fixed main build after merging from the maemo5 branch. 2009-10-16 Murray Cumming Remove unwanted merge change. 2009-10-16 Murray Cumming Maemo: Allow Relationships to have singular titles too. Use them. * glom/libglom/data_structure/has_title_singular.[h|cc]: Added this new base class, to be inherited by any TranslatableItem that could also have a singular form. * glom/libglom/data_structure/table_info.[h|cc]: * glom/libglom/data_structure/relationship.[h|cc]: Derive from HasTitleSingular, instead of just having the methods in TableInfo. * glom/libglom/document/document.[h|cc]: Added get_table_title_singular() to match the existing get_table_title(). * glom/mode_data/box_data_portal.[h|cc]: Added get_title_singular() to match the existing get_title() and use it in the details window title and AppMenu Add Related button. * glom/mode_data/notebook_data.cc: Use the singular table title for the details window title. 2009-10-16 Murray Cumming Maemo: Allow Relationships to have singular titles too. Use them. * glom/libglom/data_structure/has_title_singular.[h|cc]: Added this new base class, to be inherited by any TranslatableItem that could also have a singular form. * glom/libglom/data_structure/table_info.[h|cc]: * glom/libglom/data_structure/relationship.[h|cc]: Derive from HasTitleSingular, instead of just having the methods in TableInfo. * glom/libglom/document/document.[h|cc]: Added get_table_title_singular() to match the existing get_table_title(). * glom/mode_data/box_data_portal.[h|cc]: Added get_title_singular() to match the existing get_title() and use it in the details window title and AppMenu Add Related button. * glom/mode_data/notebook_data.cc: Use the singular table title for the details window title. 2009-10-15 Murray Cumming Maemo: Show a new Details window when adding related records. * glom/mode_data/box_data_portal.[h|cc]: * glom/mode_data/box_data_calendar_related.[h|cc]: * glom/mode_data/box_data_list_related.[h|cc]: Remove the just-added do_add_record() virtual method. Instead add a Box_Data_Details and parent window to Box_Data_Portal, used to show a details window for a new related record in on_maemo_appmenubutton_add(). Move some code from Box_Data_List_Related::on_adddel_record_added() to Box_Data_Portal::make_record_related() to make this easier. 2009-10-15 Murray Cumming Maemo: Details: Show table title in window title. * glom/mode_data/notebook_data.cc: show_details(): On Maemo, mention the table title in the window title, though this again shows that we need to ask the designer for the singular form for the table's items. 2009-10-15 Murray Cumming Maemo: Show Add Related buttons when showing portals on details. * glom/application.[h|cc]: Removed unused on_menu_add_record(). * glom/mode_data/box_data_portal.[h|cc]: On Maemo, add a Hildon::Button to the application's AppMenu on realize, removing it on unrealize. Added a virtual do_add_record() that is called when the button is clicked. * glom/mode_data/box_data_calendar_related.[h|cc]: * glom/mode_data/box_data_list_related.[h|cc]: Added do_add_record() overrides, though they are empty so far. 2009-10-15 Murray Cumming Developer: Tables: Add singular title. * glom/libglom/data_structure/tableinfo.[h|cc]: Add get/set_title_singular(), using a member TranslatableItem, to hold the singular form (such as Album instead of Albums) for use in the UI for users. * glom/libglom/document/document.cc: save_before(), load_after(): Load and save the singular table titles as a new node. * glom/glom_document.dtd: Mentin the new node, though I don't think we document translation nodes properly. * glom/navigation/box_tables.[h|cc]: In developer mode, show the column so the user can enter a singular title. 2009-10-15 Murray Cumming Change some indentation to make a function clearer. 2009-10-13 Murray Cumming Maemo: Add a Add Record to the App Menu and remove it from the List View. * glom/application.cc: init_menus(): Add an Add Record item to the AppMenu on Maemo. * glom/frame_glom.[h|cc]: Added on_menu_add_record() on Maemo, calling Notebook_Data::do_menu_file_add_record(). * glom/mode_data/box_data_details.[h|cc]: Added do_new_record(). * glom/mode_data/notebook_data.[h|cc]: Added do_menu_file_add_record() to call the Box_Data_Details::do_new_record(). * glom/utility_widgets/db_adddel/db_adddel.h: Made start_new_record() public and documented it. * glom/utility_widgets/db_adddel/db_adddel_withbuttons.[h|cc]: Remove the Add button on Maemo. 2009-10-13 Murray Cumming Replace use of NULL with 0, because this is C++. Replace use of != NULL with nothing. 2009-10-12 Murray Cumming Revert unwanted change from merge again. Must learn how to do this properly. 2009-10-12 Murray Cumming Correct non-maemo build problems after merging from the maemo5 branch. 2009-10-12 Murray Cumming Revert unwanted change from merge. 2009-10-12 Murray Cumming Remove unwanted changes from merge. 2009-10-12 Murray Cumming Maemo: Details: Put scrollbar against the right edge, as per spec. * glom/window_boxholder.[h|cc]: On Maemo, use an Alignment with no padding at the right, instead of just a window border, to match the UI spec. 2009-10-12 Murray Cumming Maemo: Details: More correct padding, maybe. * glom/utility_widgets/flowtable.[h|cc]: Change set_padding() to set_column_padding() and set_row_padding(), allowing different padding between rows and between columns, as per Maemo's UI specifications. 2009-10-11 Murray Cumming Slightly better spacing on Maemo. 2009-10-11 Murray Cumming Maemo: Use Hildon buttons for Open, Find and ... buttons. * glom/utility_widgets/datawidget.cc: Constructor: Use Hildon::Buttons. 2009-10-09 Murray Cumming * glom/utility_widgets/comboentryglom.cc: init(): On Maemo, remove the duplicate first column and do not expand the first column. 2009-10-08 Murray Cumming Maemo 5: List view: Subtly improve the separating lines. * glom/utility_widgets/db_adddel/db_adddel.cc: treeview_append_column(): On Maemo, use an x-pad of HILDON_MARGIN_DEFAULT for the cell renderers, because Mathias Hasselmann says that is required for Maemo 5. 2009-10-08 Murray Cumming Maemo: Use a PickerButton with TouchSelector for combo boxes on details views. * glom/utility_widgets/comboentryglom.[h|cc]: * glom/utility_widgets/comboglom.[h|cc]: On Maemo, derive from Hildon::PickerButton instead of Gtk::ComboBox*, with a member TouchSelector/ TouchSelector. However, the ID field seems to be shown twice. Also remove the unused constructors for use with Gtk::Builder. 2009-10-08 Murray Cumming An attempt. Probably wrong. 2009-10-08 Murray Cumming Maemo: Actually show new list views and related records portals. * glom/utility_widgets/db_adddel/db_adddel.cc: construct_specified_columns(): Use while(TouchSelector::remove_column()) to actually remove old view columns, so we actually see an effect when navigating to a new table, and so we don't see old data in related records tables. 2009-10-07 Murray Cumming Fix non-mameo build after merge. 2009-10-07 Murray Cumming Maemo: Added commented-out partial code for an Add button in the AppMenu 2009-10-07 Murray Cumming Tests: Import: Fixed the no-exceptions build. * tests/import/utils.cc: Fixed the no-exceptions build. 2009-10-06 Daniel Elstner Update .gitignore files 2009-10-06 Daniel Elstner Support Automake silent rules * configure.ac: Call the AM_SILENT_RULES macro if it is defined. * Makefile.am (.rc.res): Prefix command with $(AM_V_GEN) to suppress the echoing of the command line if silent rules are enabled. * Makefile_libegg.am (eggmarshalers.h), (eggmarshalers.c): ditto. 2009-10-06 Murray Cumming Added a sqlite example just for testing. 2009-10-06 Murray Cumming Maemo: List: Click to view details. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Connect to TouchSelector::signal_changed to respond to clicks on the list. Note that a drag to pan (scroll) does not cause that signal to be emitted. * glom/utility_widgets/db_adddel/db_adddel_withbuttons.[h|cc]: On Mameo, remove the Delete and Edit buttons because deleting can be done via the details window (viewable on Maemo). The Add button is still there and is ugly. 2009-10-06 Murray Cumming DbAddDel: Expand an appropriate column. * glom/libglom/data_structure/layout/layoutitem.[h|cc]: get_display_width(): Remove the bool return and just return the value, because 0 already means no specified width. * glom/libglom/document/document.cc: * glom/mode_design/layout/dialog_layout_details.cc: * glom/print_layout/canvas_layout_item.cc: Adapt. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Added get_column_to_expand() to choose the last expandable (text, no specified width) column. treeview_append_column(): Add a bool expand property and use it. construct_specified_columns(): Expand the expandable column, to avoid wasting space or expanding an inappropriate column. 2009-10-05 Murray Cumming Maemo: Allow editing of hidden tables (only) via its details window. * glom/mode_data/box_data_list_related.cc: enable_buttons(): Add a maemo ifdef around m_AddDel.set_allow_view_details(). 2009-10-05 Murray Cumming Maemo: List: Use only 2 columns by default, so some have enough space. * glom/libglom/document/document.cc: get_data_layout_groups_plus_new_fields(): Restrict maemo to 2 list columns by default. 2009-10-05 Murray Cumming Maemo: Related Records / AddDel: Use icon-only Hildon buttons. * glom/utility_widgets/db_adddel/db_adddel_withbuttons.[h|cc]: Use Hildon Buttons, with only icons. 2009-10-05 Murray Cumming Maemo: Hide group titles by default. * glom/libglom/data_structure/translatable_item.[h|cc]: Added clear_title_in_all_locales(). * glom/libglom/document/document.cc: maemo_restrict_layouts_to_single_column_group(): Also clear the group titles to make the default maemo layout more compact. 2009-10-05 Murray Cumming 1.12.2 2009-10-05 Murray Cumming Import: Handle large unquoted text (binary image data). * glom/import_csv/csv_parser.cc: on_idle_parse(): When we reach the end of the buffer without finding a newline, store all of the remaining text instead of just since the last quote, so we don't discard parts of large unquoted text, such as parts of binary image data. This seems to break the test_fail_on_non_matching_quotes test, but the tests are too hard to run until we have removed the idle handling (and its timing problems) from CSvParser. * glom/libglom/data_structure/field.cc: to_file_format(): Also escape carriage-returns, just in case. * tests/import/test_parsing.cc: Comment out the test_skip_on_no_ending_newline test, because I see no reason why we would want to ignore last lines with no newline. 2009-10-05 Murray Cumming Revert unwanted merge change. 2009-10-05 Murray Cumming Export: Correct problems in the binary data for images: Escape newlines. * glom/libglom/data_structure/field.cc: to_file_format(): Escape newlines as \012 instead of removing them, because this is probably what gda_binary_to_string() intends. 2009-10-05 Murray Cumming Really correct ChangeLog 2009-10-05 Murray Cumming Correct ChangeLog 2009-10-05 Murray Cumming Export: Correct problems in the binary data for images. * glom/libglom/data_structure/field.cc: to_file_format(): Escape newlines and quotes in binary data text, to workaround libgda bug https://bugzilla.gnome.org/show_bug.cgi?id=597390 * glom/frame_glom.cc: export_data_to_stream(): Double check that image data contains no newlines or quotes. * glom/libglom/utils.cc: string_replace(): Avoid an endless loop when the search_for input parameter is empty. 2009-10-04 Murray Cumming Fix regression: Actually show field choices again in combo boxes. * glom/libglom/utils.cc: get_choice_values(): Move the list_values.push_back() out of the ifdef block so we actually show field choices again in the combo boxes. This was broken by the commit from Johannes on 2009-07-30. Hopefully ldtp tests will avoid this in future. 2009-10-02 Murray Cumming Removed debug output. 2009-10-02 Murray Cumming Maemo: Really fall back to the standard layout if there is no maemo layout. * glom/libglom/document/document.cc: get_data_layout_groups_plus_new_fields(): Really fall back to the standard layout if there is no maemo layout. When creating a default layout, restrict the column count to 1. 2009-10-02 Murray Cumming Reverted unwanted merge change. 2009-10-02 Murray Cumming Maemo: Avoid multi-column details layouts. * glom/libglom/document/document.[h|cc]: Added maemo_restrict_layouts_to_single_column_group(). * glom/application.cc: on_document_load(): On maemo, call it to make the layout more suitable by default, if no custom maemo layout is defined. 2009-10-02 Murray Cumming Maemo: Fix the build. * glom/frame_glom.cc: * glom/import_csv/dialog_import_csv.cc: * glom/import_csv/dialog_import_csv_progress.cc: Added no-exceptions ifdefs, and corrected the hildonmm code. 2009-10-02 Murray Cumming Restored the maemo5 branch version of glom.glade. git merging keeps losing the change. 2009-10-02 Murray Cumming Corrected ChangeLog 2009-10-02 Murray Cumming 1.12.1 2009-10-02 Murray Cumming build_sql_select_fields_to_get(): Removed the unused extra_join parameter. 2009-10-02 Murray Cumming Remove some debug output. 2009-10-02 Murray Cumming Related Records: Fix doubly-related records portals, such as a list of an Artist's publishers (via their albums). * glom/libglom/utils.[h|cc]: build_sql_select_with_where_clause(): Move some code into build_sql_select_fields_to_get(), so we can get the list of fields to get without the rest of the SQL. * glom/base_db.cc: set_found_set_where_clause_for_portal(): Use build_sql_select_fields_to_get() to GROUP BY the full field list instead of just the primary key, as required by recent PostgreSQL, and probably by the SQL specification. We should investigate SELECT DISTINCT again to simplify this. 2009-10-02 Michael Hasselmann Import: Cleanup, added comments 2009-10-02 Michael Hasselmann Import: Made import working again, changed import logic * glom/import_csv/csv_parser.[h|cc] (fetch_next_row): This method allows iterating over the parser's cache without the need for a max row/column count. Potential issue with valid empty rows during import needs to be fixed. * glom/import_csv/dialog_import_csv.[h|cc]: Removed logic based on row counts. It turned out that most places didn't need access to get_row_count() anyway. * glom/import_csv/dialog_import_csv_progess.cc: Switched import to use the parser's new fetch_next_row() API. Not tested for large files yet. 2009-09-29 Murray Cumming Doubly-related Records: Correct the SQL. * glom/base_db.cc: set_found_set_where_clause_for_portal(): For doubly-related records, use the correct relationship for the GROUP BY to avoid a SQL error about a non-existant field. We must have been lucky before. However, we now need to fix the SQL error (maybe new in a recent PostgreSQL version) about not mentioning all viewed fields in the GROUP BY. 2009-09-29 Murray Cumming Design: Related Records Portal: Prevent use of inappropriate relationships. * glom/mode_design/layout/dialog_layout_list_related.cc: on_combo_relationship_changed(): Do not allow the related record to show relationships that would require duplicate values in unique fields to show multiple records. Noticed by Alessio C. 2009-09-29 Murray Cumming Fixed build problems with merge from maemo5 2009-09-29 Murray Cumming LayoutGroup: Added accessors for columns count, hiding the member variable. * glom/libglom/data_structure/layout/layoutgroup.[h|cc]: Made m_columns_count private and added get/set_columns_count() so I can see when this is changing. * glom/libglom/data_structure/layout/layoutgroup.h: * glom/libglom/document/document.cc: * glom/mode_data/flowtablewithfields.cc: * glom/utility_widgets/dialog_flowtable.cc: Adapted. 2009-09-29 Murray Cumming Maemo: Actually allow details to be opened. * glom/utility_widgets/db_adddel/db_adddel.cc: get_item_selected(): Use Hildon::TouchSelector::get_selected() instead of get_active() so it actually works for rows other than the first one. See hildon bug https://bugs.maemo.org/show_bug.cgi?id=4640, though the error might be in our maemomm C++ code to work around that. 2009-09-29 Murray Cumming Fix some indentation. 2009-09-28 Murray Cumming Maemo: Find: Show the quickfind. * glom/frame_glom.cc: Constructor: On Maemo, put the quickfind widgets in the separate find window. 2009-09-28 Murray Cumming Create QuickFind buttons in code, instead of Glade. * glom/frame_glom.cc: * glom/glom.glade: Create the QuickFind widgets in code instead of in Glade so we can adapt them for Maemo and put them in the separate Find window. 2009-09-28 Murray Cumming Maemo: Show the Find UI in a separate window. 2009-09-28 Murray Cumming Maemo: Find: Use only the details view. * glom/mode_find/notebook_find.[h|cc]: Hide the list view (and tabs) on Maemo. This needs to be a separate window too. 2009-09-28 Murray Cumming Maemo: Show the table name in the AppMenu. Added a Find Button. * glom/application.cc: update_window_title(): Update the picker button here too. init_menus(): Add a Find button for the AppMenu. * glom/navigation/maemo/pickerbutton_table.cc: set_table_name(): Actually set the row as active. * glom/dialog_existing_or_new.cc: Make sure the first row is visible, even on Maemo. Otherwise it looks strange. 2009-09-28 Murray Cumming Fix no-exceptions build. 2009-09-28 Murray Cumming Initial dialog: Expand the network item. * glom/dialog_existing_or_new.cc: Constructor: Expand the Network item, because it helps to explain what it is, particularly on Maemo where there are no treeview row arrows. 2009-09-28 Murray Cumming Initial dialog: Expand the network item. * glom/dialog_existing_or_new.cc: Constructor: Expand the Network item, because it helps to explain what it is, particularly on Maemo where there are no treeview row arrows. 2009-09-28 Murray Cumming Fix a crash. * glom/dialog_existing_or_new.cc: Move some assertions so this works again in non-client-only mode. 2009-09-28 Murray Cumming glom.glade: Comment-out cancel buttons in the maemo5 branch. 2009-09-28 Murray Cumming Remove silly != NULLs 2009-09-28 Murray Cumming client-only mode: Ifdef out unused code. * glom/dialog_existing_or_new.[h|cc]: Ifdef out unused code for the new document notebook tab in client-only mode. 2009-09-28 Murray Cumming Maemo: Removed icons from dialogs. * glom/glom.glade: Comment out icons in our maemo5 branch. 2009-09-28 Murray Cumming Client-only mode: Change the initial dialog label. * glom/dialog_existing_or_new.cc: Constructor: Change the label text if in client-only mode, to avoid mentioning creation of documents. 2009-09-28 Murray Cumming glom.glade: Removed Help buttons. 2009-09-28 Murray Cumming glom.glade: Fix a typo. 2009-09-28 Murray Cumming glom.glade: Use a consistent name for help buttons. 2009-09-28 Murray Cumming glom.glade: Comment out the AtkObjects again, after a git merge brought them back again. 2009-09-25 Michael Hasselmann Import: More code cleanup in tests * glom/import_csv/csv_parser.cc (set_file_and_start_parsing): Fail on empty file uri. * tests/import/*: Removed the ugly mainloop singleton, among other cleanups. 2009-09-25 Murray Cumming Cleanup. * glom/glom.glade: Really revert a bad merge from the maemo5 branch. * glom/libglom/connectionpool_backends/postgres_self.cc: Do not have actual newlines in string literals. 2009-09-25 Murray Cumming Revert an unwanted change from the merge. 2009-09-25 Murray Cumming Fix the build with gtkmm < 2.18. * glom/utility_widgets/flowtable.cc: Correct the use of GTKMM_MINOR_VERSION to fix the build with older gtkmm versions. 2009-09-25 Murray Cumming Fix the build with gtkmm < 2.18. * glom/utility_widgets/flowtable.cc: Correct the use of GTKMM_MINOR_VERSION to fix the build with older gtkmm versions. 2009-09-25 Murray Cumming Import tests: Fixed. * tests/import/utils.[h|cc]: run_parser_from_buffer(): Added a version that takes a std::string, to make the common case more robust. * tests/import/test_parsing.cc: * tests/import/test_signals.cc: Fix the tests by not incorrectly taking the length of the raw arrays, which caused the temp files to contain garbage. 2009-09-25 Murray Cumming Import tests: Handle encoding errors. * tests/import/utils.cc: Handle signal_encoding_error too, because this is one way that the parser can stop. Increase the timeout because an infinite loop is unlikely (and not currently happening). 2009-09-25 Murray Cumming More minor cleanup, such as removing non-public functions from the header. 2009-09-25 Murray Cumming Correct the indentation. 2009-09-25 Murray Cumming tests/import/: Small cleanup. * tests/import/test_parsing.cc: * tests/import/utils.[h|cc]: Use a sigc::slot instead of the ugly (because not typedefed) function pointer type. 2009-09-25 Murray Cumming Removed some debug output. * glom/libglom/data_structure/glomconversions.cc: parse_time(): * tests/test_parsing_time.cc: Removed debug output. 2009-09-25 Murray Cumming Maemo: Fix the non-exceptions build again. * glom/print_layout/canvas_print_layout.cc: Added ifdefs around KeyFile calls. I wonder why I only noticed this now. 2009-09-25 Michael Hasselmann Updated ChangeLog 2009-09-25 Michael Hasselmann Import: Changed the signature of line_scanned handler * glom/import_csv/dialog_import_csv.[h|cc]: Changed the signare of on_parser_line_scanned, to use CsvParser::type_row_strings. It does not change anything, as the handler didn't even use the parameters. 2009-09-25 Michael Hasselmann Import: Fixed tests to fit new parser API * glom/import_csv/csv_parser.[h|cc]: Added a finished_parsing signal since the max_row count logic is flawed (https://bugzilla.gnome.org/show_bug.cgi?id=588233#c16). Also moved common parts of on_stream_read(.) (now on_buffer_read(.)) into copy_buffer_and_continue_reading(.), to avoid copy'n'paste bugs. * tests/import/utils.[h|cc]: Added mainloop functionality to trigger the idle parse sequence of the CsvParser for the testcases. * tests/import/test_[parsing,signals].cc: Fixed the tests to fit new parser API. 2009-09-25 Murray Cumming 1.12.0 2009-09-25 Murray Cumming Corrected the ChangeLog 2009-09-25 Murray Cumming Command spawning: Really check the return value. * glom/libglom/spawn_with_feedback.cc: execute_command_line_and_wait_until_second_command_returns_success(): Actually check the return value of the first command, so we can fail immediately (with stderr output) when, for instance, postgresql fails to read the configuration file due to changed options, such as no longer recognizing max_fsm_pages in PostgreSQL 8.4 2009-09-25 Murray Cumming Replace some NULLs with 0 because this is C++, not C. * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/spawn_with_feedback.cc: Replace NULLs with 0. 2009-09-24 Murray Cumming Self-Hosting: Use the new ident configuration for PostgreSQL 8.4. * glom/libglom/spawn_with_feedback.[h|cc]: Added an execute_command_line_and_wait() overload that has an output parameter for the stdout from the command. * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: Added a get_postgresql_utils_version_as_number() utiltity method, and use it in set_network_shared() to use a different syntax for Postgres 8.4, hopefully fixing bug #595608 2009-09-24 Murray Cumming Self-Hosting: Retry the connection just-long-enough. * glom/libglom/connectionpool_backends/postgres.[h|cc]: attempt_connect(): Add a throw() declaration because we know that this really never throws, though other similar methods do. * glom/libglom/connectionpool_backends/postgres_self.cc: connect(): If not network-shared then retry every second when the connection fails, because the (default) password really must be correct. Seems to work, requiring 6 retries on my system. However, we must still wait a hard-coded time to be sure of failure if the password is not the default one, for instance when network sharing. * glom/libglom/spawn_with_feedback.cc: execute_command_line_and_wait_until_second_command_returns_success(): Remove the hacked 8-second wait here. 2009-09-23 Murray Cumming Maemo: Details: Do not show buttons. * glom/mode_data/box_data_details.[h|cc]: ifdef out the buttons for maemo. * glom/glom.glade: Hack a HildonStackableWindow into the maemo5 branch to avoid a warning with our get_widget_derived() call. 2009-09-23 Michael Hasselmann Import: made the tests runnable again. 2009-09-23 Murray Cumming box_data_details.cc: Rename the HBox member variables to make their purposes clearer. 2009-09-23 Murray Cumming Maemo: Use Hildon::StackableWindow. * glom/bakery/app_withdoc_gtk.h: * glom/window_boxholder.h: Use Hildon::StackableWindow instead of just Hildon::Window because this always seems to be the right thing to do. 2009-09-23 Murray Cumming import tests: Fix the no-exceptions build. * tests/import/test_parsing.cc: * tests/import/test_signals.cc: Fix the build without exceptions. 2009-09-23 Michael Hasselmann Import tests: made them quiet * Makefile_tests.am, test/import/utils.[cc|h], tests/import/test_[parsing|signals].cc: Only report on failure. Moved common parts into an utility namespace. 2009-09-23 Murray Cumming Renamed Dialog_Glom to Window_BoxHolder. * glom/dialog_glom.[h|cc]: Renamed to window_boxholder.[h|cc] to make its purpose clearer. * glom/frame_glom.[h|cc]: * glom/mode_data/notebook_data.[h|cc]: * Makefile_glom.am: Adapted. 2009-09-22 Murray Cumming Dialog_Glom: Make this a little less stupid, so we can ifdef for Maemo. * glom/dialog_glom.[h|cc]: Derive from Window, not Dialog. Constructor: Add the provided box instead of requiring us to add it explicitly (to the Dialog's vbox). * glom/frame_glom.cc: * glom/mode_data/notebook_data.cc: Adapt. 2009-09-22 Murray Cumming glom.glade: Fix something lost in the merge. 2009-09-22 Murray Cumming On Maemo, show the details in a separate window. * glom/mode_data/notebook_data.[h|cc]: On maemo, hide the tabs, and don't add the details box to the notebook. Instead add it to a window and show that window instead of switching to a details tab when details are requested. 2009-09-21 Murray Cumming Mention the PYTHON version for maemo builds. 2009-09-21 Murray Cumming import tests: Fix the no-exceptions build. * tests/import/test_parsing.cc: * tests/import/test_signals.cc: Fix the build without exceptions. 2009-09-21 Murray Cumming Updated NEWS and version in anticipation of a release. 2009-09-21 Murray Cumming Revert an unwanted change. 2009-09-21 Johannes Schmid Fixed make dist. The sources of tests/test_python_module weren't given which broke at least with automake-1.10 2009-09-21 Murray Cumming xport: Use .csv file extension to match the filter when importing. * glom/utils_ui.[h]cc]: Added get_filepath_with_extension() to add (if necessary) a specified file extension to a filepath. * glom/frame_glom.cc: on_menu_file_export(): Add a .csv file extension if not already specified, so we automatically see the export file in the file chooser when importing. 2009-09-21 Murray Cumming glom/dialog_import_csv.cc: get_data(): Avoid out-of-bounds crashes when accessing the vector of vectors. Note that this check is already in the appropriate place in the import_csv_refactored branch. This makes bug #593304 slighly clearer, though it is now an endless loop with debug output. 2009-09-21 Murray Cumming Import dialog: Set the number of sample rows to 2 by default. * glom/dialog_import_csv.cc: Set the number of sample rows to 2 by default, not 0. a secondary top-level object (textbuffer). 2009-09-21 Murray Cumming glom-1.0.pc.in: Rename to glom-1.12.pc.in to match the .so name and header install location. Noticed by Chris Coulson. 2009-09-20 Daniel Mustieles Updated Spanish translation 2009-09-19 Mario Blättermann Updated German translation 2009-09-18 Murray Cumming Added missing files. 2009-09-18 Michael Hasselmann Import tests: made them quiet * Makefile_tests.am, test/import/utils.[cc|h], tests/import/test_[parsing|signals].cc: Only report on failure. Moved common parts into an utility namespace. 2009-09-18 Murray Cumming Maemo: Use some Hildon widgets. * glom/utility_widgets/entryglom.[h|cc]: * glom/utility_widgets/textviewglom.h: Use Hildon::TextView and Hildon::Entry. 2009-09-18 Murray Cumming Fix a typo to fix the build on maemo. 2009-09-18 Murray Cumming CsvParser: Make this an actual parser, with a sane API. * glom/dialog_import_csv.[h|cc]: * glom/dialog_import_csv_progress.[h|cc]: Move into glom/import_csv/ * glom/import_csv/: Added file_encodings.[h|cc], moving the encodings list into it. This is similar to mode_design/iso_codes.[h|cc]. * glom/import_csv.[h|cc]: Rename to glom/import_csv/csv_parser.[h|cc] to match the class name. Move actual parsing (and the vector of row/column data) into CsvParser, leaving the dialogs to just respond to signals and get data via get methods. However, this breaks the import tests, because they add data to the parser directly using m_raw. They must be changed to read actual files, or maybe we could add some intermediate level of API that they could test. 2009-09-18 Murray Cumming CsvParser: Made some API private. * glom/dialog_import_csv.[h|cc]: get_field_for_column(): Return a sharedptr, not a silly const sharedptr<>&. * glom/dialog_import_csv_progress.cc: * glom/import_csv.[h|cc]: add get_state() and get_rows_count(). Make some API private to make it clearer what needs to be done to make this a real self-contained class. 2009-09-18 Murray Cumming CSV Import: Minor code style changes. * glom/dialog_import_csv.cc: * glom/dialog_import_csv_progress.cc: * glom/import_csv.[h]cc]: Prefix the state enum with STATE_. Use 0 instead of NULL because this is C++. Remove some debug output. Make signal type and variable names consistent with other code. * tests/import/test_signals.cc: Add a last std::endl. 2009-09-18 Murray Cumming Tests: Stop using valgrind by default. * Makefile_tests.am: Do not run all tests under valgrind. valgrind is for humans to read, and make check has no way to know if the result is appopriate or not. Run things under valgrind when you want to. 2009-09-17 Johannes Schmid Don't link libglom statically on maemo 2009-09-17 Michael Hasselmann Refactoring Dialog_Import_CSV: created testcase for the CsvParser's signal emission * Makefile_tests.am: all tests now run within valgrind by default since mem leaks in testcases are potential mem leaks in the application. Parameters might need tweaking. * glom/import_csv.cc (CsvParser::on_idle_parse): Fixed a missing negation in a conditional, which was wrongfully leading to signal emissions. Found by the import signals testcase. * test/import/test_parsing.cc: Fixed a null byte issue when setting the raw contents of the parser. * test/import/test_signals.cc: This testcase checks the CsvParser's signal emission on varying input. The basic idea was to have on testcase for each code path that leads to a signal emission in glom/import_csv.cc, even if that leads to overlapping code coverage tests with the parser testcase. 2009-09-17 Johannes Schmid Replace a TODO comment with g_assert_val_if_reached() Reaching this branch would mean that the dialog returned an unhandled response. 2009-09-17 Johannes Schmid Added a regression test for the loading of the python modules. Unfortunately this test doesn't trigger the crash bug that happens on exit() on the maemo platform. 2009-09-17 Johannes Schmid Really check if pygda module is available. A typo caused the check for the glom module twice while the gda module wasn't checked at all 2009-09-16 Michael Hasselmann Changed layout of CSV import dialog * glom/glom.glade: The encoding info now has more space for itself and properly expands, whereas the encoding combobox doesn't take up more hspace than needed. 2009-09-14 Johannes Schmid Fixed non-exception build after the CsvParser refactoring 2009-09-14 Murray Cumming Main Window: Correct (again) the order of Records/Found widgets. * glom/glom.glade: main_window: Put the Records:/Found: widgets in sub-hboxes, and change their order by hand in the .glade file because GtkBuilder and Glade do not seem to interpret the file in the same way. 2009-09-14 Claude Paroz Updated French translation 2009-09-14 Claude Paroz Do not mark stock labels as translatable 2009-09-14 Murray Cumming 1.11.2: 2009-09-14 Murray Cumming * glom/frame_glom.cc: * glom/utility_widgets/flowtable.cc: Fixed warnings-as-errors build problems with the latest gtkmm. 2009-09-13 Daniel Mustieles Updated Spanish translation 2009-09-11 Michael Hasselmann Refactoring Dialog_Import_CSV: first parser tests created * Makefile_tests.am, tests/import.sh, tests/import/test_parsing.cc: The first tests for the CsvParser are ready. Basic input is tested but no real world examples yet. Run with 'make check TESTS=tests/import.sh' to run tests with valgrind. Renamed regression_tests folder to tests 2009-09-09 Michael Hasselmann Refactoring Glom::Dialog_Import_CSV * ChangeLog, Makefile_glom.am, glom/dialog_import_csv.[h|cc], glom/import_csv.[h|cc], glom/dialog_import_csv_progress.cc: Moved the inlined Parser class from the Dialog_Import_CSV class to the new CsvParser class. The CsvParser already handles the line scanning and encoding conversion but is supposed to take over the file reading responsibility as well. In order to allow the Dialog_Import_CSV class to parse a scanned line into its tree model the parser emits a lineScanned signal, with the currently scanned line as parameter. 2009-09-08 Johannes Schmid Move common code out of exception-only codepath to fix treemodel on maemo (bgo#594357) 2009-09-08 Johannes Schmid Move common code out of exception-only codepath to fix treemodel on maemo (bgo#594357) 2009-09-07 Murray Cumming Added a Tables PickerButton that seems to work. 2009-09-07 Murray Cumming Added a Hildon::AppMenu 2009-09-07 Murray Cumming Use a HildonWindow in the glade file so that HildonAppMenu actually works. 2009-09-07 Murray Cumming Hide header box (table title and mode) and started to use picker for table navigation 2009-09-07 Murray Cumming DbAddDel use of TouchSelector instead of TreeView almost working. 2009-09-07 Murray Cumming Comment out some save_to_document() methods in client-only mode. 2009-09-07 Murray Cumming Fix tiny typos to fix the non-maemo build. 2009-09-05 Murray Cumming Maemo: ifdef out useless menu code. * glom/application.[h|c]]: Ifdef out any menu-building code because it must be completely replaced by Hildon::AppMenu code on Maemo. * glom/mode_data/notebook_data.cc: Constructor: Hide the notebook tabs, in preparation for just showing the list, with the details in a separate window on Maemo. 2009-09-05 Murray Cumming Revert unwanted hack from maemo5 branch. 2009-09-05 Murray Cumming Fixed the regular build after the merge from maemo5 branch. 2009-09-05 Murray Cumming connection_request_password_and_attempt(): Fix a crash in client-only mode. * glom/frame_glom.[h|cc]: connection_request_password_and_attempt(): Move some decision-making into handle_request_password_connection_error, to allow us to handle the no-exception API better, though this is clearer anyway, or would be without the ifdefs. 2009-09-05 Murray Cumming Reduced some indentation. 2009-09-05 Murray Cumming on_document_load(): Add a ! to really check for unsupported backends. 2009-09-05 Murray Cumming check_document_hosting_mode_is_supported(): Correct and ifdef to an ifndef. 2009-09-05 Murray Cumming Maemo: Use Hildon::FileChooserDialog for opening files. * glom/application.[h|cc]: Remove unused (and unnecessary since the new initial dialog) on_menu_file_open() and on_menu_file_close() overrides and ui_file_select_open_with_browse(). * glom/dialog_existing_or_new.cc: on_select_clicked(): Use Hildon::FileChooserDialog on Maemo. * glom/bakery/app_withdoc_gtk.cc: Remove the uncommented undef of GLOM_ENABLE_MAEMO - no more nasty hacks please. Instead comment-out the set_menu() call with a TODO, leaving the rest of the maemo-specific code working. 2009-09-05 Murray Cumming Check for unsupported hosting modes. * glom/application.[h|cc]: Added check_document_hosting_mode_is_supported() to warn the user if the build cannot use the hosting mode in the file, and call it from on_document_load(). * glom/libglom/document/bakery/document.cc: load(), load_from_data(): Call set_is_new(false) so we can check for this in App/View::on_document_load(), to avoid complaining about an unused default hosting mode. 2009-09-05 Murray Cumming In the client-only build, actually handle the enum for opening an existing file in client mode. 2009-09-05 Murray Cumming offer_new_or_existing(): Add Gtk::Builder error handling . * glom/application.cc: offer_new_or_existing(): Add error handling to show how GtkBuilder complains about Atk objects in .glade files on Maemo, and actually fails. 2009-09-05 Murray Cumming Hacked AtkObject out of glom.glade for Maemo. 2009-09-05 Murray Cumming offer_new_or_existing(): Add Gtk::Builder error handling . * glom/application.cc: offer_new_or_existing(): Add error handling to show how GtkBuilder complains about Atk objects in .glade files on Maemo, and actually fails. 2009-09-05 Murray Cumming Added missing file. 2009-09-05 Murray Cumming Fix the build when -fno-exceptions is used. 2009-09-05 Murray Cumming Added dlopen test of the python library. * glom/libglom/test_connectionpool.cc: * glom/libglom/test_document.cc: Fixed the build without exceptions. * Makefile_tests.am: Added test_load_python_library, using dlopen() to show the numpunct linker error (bug #594142) without actually using python. 2009-09-05 Murray Cumming Avoid compiler warnings. * configure.ac: Add a comment about using the PYTHON environment variable to specify the python version. * glom/dialog_existing_or_new.cc: * glom/dialog_import_csv_progress.cc: * glom/utility_widgets/canvas/canvas_group_resizable.cc: Avoid some compiler warnings, mostly about missing returns in unlikely situations. 2009-09-05 Murray Cumming Mention the failed python module name on stdcerr. * glom/python_embed/glom_python.cc: glom_python_module_is_available(), gda_python_module_is_available(): Output a hint to the command-line too, in case maemo crashes when showing UI as mine does at the moment, and to mention the exact python module name that failed. 2009-09-04 Daniel Elstner Do not try to catch non-existing MetaStructError * glom/base_db.cc (Base_DB::get_fields_for_table_from_database): For now, catch Glib::Error instead of Gnome::Gda::MetaStructError, which does not exist. 2009-09-04 Murray Cumming Fix the client-only non-maemo build on maemo. * configure.ac: Correct the AS_IF() calls so that we really do not need iso-codes in client-only mode. * glom/print_layout/canvas_layout_item.cc: * glom/print_layout/canvas_print_layout.cc: * glom/printoperation_printlayout.cc: Fix the build without exceptions, without properties and without default signal handlers, with ifdefs. * glom/base_db.cc: get_fields_for_table_from_database(): Actually add a no-exceptions ifdef for the use of Gda::MetaStruct::complement() instead of just ifdefing it out for Maemo. * glom/mode_data/notebook_data.cc: * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/entryglom.cc: * glom/utility_widgets/imageglom.cc: Likewise, ifdef the use of get_accessible on GTKMM_ATKMM_ENABLED instead of GLOM_ENABLE_MAEMO, to fix the client-only non-maemo build on Maemo. Again, please stop abusing the MAEMO ifdef for hacks without even a TODO. 2009-09-04 Murray Cumming Removed unnecessary GLOM_ENABLE_CLIENT_ONLY ifndef. 2009-09-04 Murray Cumming Moved more design-only classes to glom/mode_design/ * glom/libglom/data_structure/iso_codes.[h|cc]: * glom/utility_widgets/comboentry_currency.cc * glom/mode_design/translation/: Moved to glom/mode_design/. * glom/Makefile_glom.am, *.[h|cc]: * po/POTFILES.in: Adapted. * configure.ac: Make use of iso-codes dependent on client-only, not maemo, because that actually makes sense. 2009-09-03 Murray Cumming 1.11.1 2009-09-03 Murray Cumming Fixed a tiny typo to fix the tests build. 2009-09-03 Murray Cumming Move some non-layout print_layout code back out of mode_design * glom/mode_design/print_layouts/canvas_layout_item.[h|cc]: * glom/mode_design/print_layouts/canvas_print_layout.[h|cc]: Moved to glom/print_layout/, because they are used by client-only mode too. * glom/Makefile_glom.am, *.[h|cc]: Adapted. * po/POTFILES.in: Update for moved files. 2009-09-03 Murray Cumming Moved many developer-mode files into glom/mode_design/ now that our non-recursive build allows that without linker errors. * glom/combobox_fields.[h|cc]: * glom/combobox_relationship.[h|cc]: * glom/layout_item_dialogs/: * glom/mode_data/dialog_choose_field.[h|cc]: * glom/mode_data/dialog_choose_relationship.[h|cc]: * glom/mode_data/dialog_layout*.[h|cc]: * glom/mode_data/treestore_layout.[h|cc]: * glom/layout_item_dialogs/: Moved to glom/mode_design/layout/ * glom/reports/report_builder.[h|cc]: Moved to glom/ * glom/reports/dialog_layout_report.[h|cc]" * glom/reports/treestore_report_layout.[h|cc]: Moved to glom/mode_design/report_layout/ * glom/database_preferences.[h|cc]: * glom/relationships_overview/: Moved to glom/mode_design/ * glom/glom_developer.glade: * glom/dialog_new_self_hosted_connection.[h|cc]:Rename to glom/mode_design/dialog_initial_password.[h|cc], renaming the class too, because that's what this is now. * glom/utility_widgets/dialog_layoutitem_properties.[h|cc]: Removed this unused class. * glom/Makefile_glom.am, *.[h|cc]: Adapted. 2009-09-03 Murray Cumming libglom: Avoid client-only build changes: partial recommit of revert. * glom/libglom/appstate.cc: * glom/libglom/connectionpool.h: * glom/libglom/connectionpool_backends/backend.h: * glom/libglom/connectionpool_backends/postgres.h: * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/connectionpool_backends/postgres_self.h: * glom/libglom/connectionpool_backends/sqlite.h: * glom/libglom/document/document.h: Remove mention of GLOM_ENABLE_CLIENT_ONLY from comments because we no longer use it in libglom. * glom/libglom/connectionpool_backends/postgres.cc: attempt_connect(): Do not use Gda::CONNECTION_OPTIONS_READ_ONLY just because exceptions are disabled in the build. Please stop using vaguely-related ifdefs to hack changes in. In this case it would be GLOM_ENABLE_CLIENT_ONLY, but we don't want that option in libglom anymore. 2009-09-01 David King Fix GTK+ critical about an unrealized widget that had focus * glom/glom.glade: Fix an interesting warning, where the quickfind Gtk::Entry was described in the glade file as having focus, even though it was set to be not visible, and therefore not realized. 2009-09-01 David King Avoid GTK+ stock-id warnings by using Gtk::StockID constructor * glom/dialog_existing_or_new.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: Use Gtk::StockID constructor with builtin stock items so that GTK+ warnings are not triggered. 2009-09-01 Johannes Schmid Fixed small build problem with disabled exceptions 2009-09-01 Johannes Schmid Remove hacks that are now obsolete with libgda 4.0.4 and libgdamm 3.99.17.1 on maemo 2009-08-31 Daniel Elstner Remove generated config.h.in from the repository 2009-08-31 David King Revert "Really never use config.h in libglom." This reverts commit 8d73f2051fb624e145505b3587a12d89ed3c8326. The change gave no benefits, but did break any project that used libglom and autoheader. 2009-08-31 Johannes Schmid Fix make dist 2009-08-27 Murray Cumming Avoid GTK+ warnings. * glom/glom_developer.glade: Set GtkAdjustment page_size to 0 to avoid new GTK+ warnings. * glom/layout_item_dialogs/dialog_field_layout.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/print_layouts/dialog_text_formatting.cc: More nasty workarounds for GtkBuilder bug #575714, which is still not fixed. 2009-08-27 Murray Cumming Remove a nasty hack that would become a runtime bug. * glom/libglom/connectionpool_backends/sqlite.cc: Revert the previous hack by Johannes, which misused GLIBMM_EXCEPTIONS_ENABLE to avoid use of CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE. We will just update libgdamm on Maemo Fremantle instead. 2009-08-27 Murray Cumming Really never use config.h in libglom. * glom/libglom/*.cc: Remove some remaining includes of config.h instead of libglom_config.h. * glom/libglom/libglom_config.h.in: Add GETTEXT_PACKAGE, PACKAGE_TARNAME, though I suspect that libglom requires different build stuff for translations. Added POSTGRES_UTILS_PATH and EXEEXT. 2009-08-27 Murray Cumming Update NEWS and increase version. * NEWS: * configure.ac: Update in anticipation of a release. * regression_tests/test_signal_reemit.cc: Avoid an unused parameter warning. 2009-08-27 Johannes Schmid Fixed build issues on maemo platform with sqlite 2009-08-26 Murray Cumming Fix a time parsing regression. * glom/libglom/libglom_config.h.in: Moved HAVE_STRPTIME here from config.h (which should maybe not be generated by autoheader), to the test_parsing_time regression. * glom/libglom/data_structure/iso_codes.cc: Include libglom_config.h instead of config.h, after moving ISO_CODES_PREFIX there. 2009-08-26 Murray Cumming Tests: Correct the return values. * regression_tests/test_parsing_time.cc: * regression_tests/test_signal_reemit.cc: Return EXIT_SUCCESS or EXIT_FAILURE properly. 2009-08-26 Murray Cumming Removed some debug output. 2009-08-25 Murray Cumming Comment out use of gda_sql_identifier_remove_quotes(). * glom/base_db.cc: remove_quotes(): Comment out use of gda_sql_identifier_remove_quotes() with a stdcerr warning because it is deprecated and I get a weird undefined reference error and we need to change how we use this anyway. To fix the build. 2009-08-25 Johannes Schmid Fixed remaining maemo build problems 2009-08-24 Michael Hasselmann Updated German translation 2009-08-21 Daniel Elstner Do not use .pyd extension on non-Windows systems * Makefile.am (pymod_ldflags): Set variable conditionally and use the "-shrext .pyd" option only on Windows hosts. 2009-08-21 Michael Hasselmann Fix typos to fix the build. Bug #592576 2009-08-21 Murray Cumming Document::get/set_connection_user(): Don't save this in the document. * glom/libglom/document/document.[h|cc]: get/set_connection_user(): Document these as not being saved in the document, because it makes no sense to save a single user there, because Glom is a multi-user system. * glom/dialog_connection.cc: load_after(), save_before(): Don't save the user in the document. 2009-08-19 Fran Diéguez Updated Galician Translation 2009-08-19 David King Remove some unused files from the repository and fix ChangeLog formatting. * glom.am: * libegg.am: * libglom.am: * tests.am: Remove unused .am files. * glom/libglom/test_document_with_layout.cc: Remove unused file, identical to glom/libglom/test_document.cc. * ChangeLog: Fix some formatting. 2009-08-07 Kjartan Maraas Updated Norwegian bokmÃ¥l translation. 2009-08-04 Murray Cumming ldtp: Changed timeout 2009-08-04 Murray Cumming Rename included .am files. * *.am: Rename to Makefile_*.am so they are grouped together. * Makefile.am: Include the new filenames. 2009-07-31 Johannes Schmid Fix the UI part to build on maemo platform 2009-07-30 Johannes Schmid Last ChangeLog was only committed halfway 2009-07-30 Johannes Schmid Revert "Allow building glom on maemo when --enable-maemo is passed to configure (ChangeLog was incomplete)" This reverts commit efa9de97a92d54ba03e830da7aa181c8cc5f1048. 2009-07-30 Johannes Schmid Allow building glom on maemo when --enable-maemo is passed to configure (ChangeLog was incomplete) 2009-07-30 Johannes Schmid Allow building glom on maemo when --enable-maemo is passed to configure 2009-07-28 Daniel Elstner Add glom.pot to po/.gitignore 2009-07-28 Daniel Elstner Build and run tests on make check * Makefile.am (AM_DEFAULT_SOURCE_EXT): Make use of the Automake default _SOURCES feature for building single-source-file programs. (noinst_PROGRAMS): Move to tests.am. * tests.am (check_PROGRAMS): List all test executables here, so they are only built on make check. (TESTS): List unit test programs from the regression_tests/ directory. 2009-07-28 Daniel Elstner Use deprecated libtool macros for Maemo's sake * configure.ac (LT_PREREQ), (LT_INIT): Comment-out. (AC_PROG_LIBTOOL): Use old-style and deprecated M4 macro to initialize libtool because the Maemo development environment still ships with the ancient libtool 1.4. (AC_DISABLE_STATIC), (AC_LIBTOOL_WIN32_DLL): Call old-style macros to set libtool options, instead of passing flag arguments to LT_INIT(). 2009-07-27 Murray Cumming Added the button script from my debian repository analyzer. 2009-07-27 Murray Cumming ldtp tests: Correct the English in the error messages. * ldtp/common.py: * ldtp/database-creation/create-db.py: * ldtp/fields-edit/fields-edit.py: Correct the English in the error messages. 2009-07-27 Murray Cumming dialog_image_progress.cc: on_stream_read(): Add casts to avoid compiler warnings, to fix distcheck. 2009-07-27 Murray Cumming Add more delay so that self-hosting does not fail sometimes. * glom/libglom/spawn_with_feedback.cc: execute_command_line_and_wait_until_second_command_returns_success(): Wait for extra 8 seconds instead of 3, so that postgresql startup has really finished. The delay was not enough since I removed the debug output, which was probably providing extra delay. This is unpleasant. 2009-07-26 Daniel Elstner Strip -L/usr/lib64 from PYTHON_LIBS * macros/mm-python.m4 (MM_CHECK_MODULE_PYTHON): Do not omit -L from ${PYTHON_LIBS} for the /usr/local/lib directory. However, do strip the flag for /usr/lib64 in addition to /usr/lib. 2009-07-25 Daniel Elstner List auto-generated files in MAINTAINERCLEANFILES * Makefile.am (MAINTAINERCLEANFILES): Clean up the macros/*.m4 files installed by autogen.sh, as well as the eggmarshalers.[ch] files. 2009-07-25 Daniel Elstner Pass --automake option to gnome-doc-prepare * autogen.sh: Invoke gnome-doc-prepare with the --automake option to tell it that Automake will take care of installing its macro files. 2009-07-25 Murray Cumming get_fields_for_table_from_database(): Use gda_meta_store_sql_identifier_quote() as mentioned in bug #589607 to maybe make this work with uppercase in the table name. 2009-07-24 Daniel Elstner Fix dead link to non-recursive make paper 2009-07-24 Daniel Elstner Assign copyright of my work to Openismus GmbH * configure.ac: Reassign the copyright which I had assigned to myself temporarily to Openismus GmbH instead, as I did the work in my position as an employee. * *.am: ditto, * macros/mm-python.m4: ditto. 2009-07-24 Daniel Elstner Split Makefile.am into logically separate parts * glom.am: New file for building the glom binary itself. * libglom.am: New file for building the libglom library. * libegg.am: New file for building the libegg static library. * tests.am: New file for building the test programs. * Makefile.am: Move logical chunks into the separate files listed above, and pull them in as Automake include files. 2009-07-24 Daniel Elstner Invoke gnome-doc-common from autogen.sh * autogen.sh: Execute "gnome-doc-common --copy" to install the files omf.make and xmldocs.make into the source tree. 2009-07-24 Daniel Elstner Make git ignore po/Makefile.in.in 2009-07-24 Daniel Elstner Use G_GSIZE_FORMAT instead of a cast * glom/libglom/python_embed/pygdavalue_conversions.c: Change format specifier for GType to "%" G_GSIZE_FORMAT and remove the explicit cast again. I forgot that this is C code, so GType will always be gsize -- at least with recent versions of GLib. 2009-07-24 Daniel Elstner Use format "%lu" for GType and add cast * glom/libglom/python_embed/pygdavalue_conversions.c: Change format specifier in g_warning() message back from "%u" to "%lu", and add an explicit cast to unsigned long. Looks like GLib silently changed the type of GType from gulong to gsize, except when using a C++ compiler with a 64 bit target. (Yes, really.) 2009-07-24 Daniel Elstner Remove generated files from the repository 2009-07-24 Daniel Elstner Suppress warning for missing field initializers * configure.ac (GLOM_WXXFLAGS): Add -Wno-missing-field-initializers to the warning options at level max or higher, so that the Python module code will build with both Python 2.5 and Python 2.6 without producing warnings. 2009-07-24 Murray Cumming Catch unknown command-line options. * glom/main.cc: Put try/catch around the Gtk::Main instantiation because I noticed that it throws an exception if you provide an unknown option. 2009-07-24 Murray Cumming Use CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE. * glom/libglom/connectionpool_backends/postgres.cc: * glom/libglom/connectionpool_backends/sqlite.cc: When calling Gda::Connection::open_from_string(), use the new CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE option so the libgda API really does what we mean without needing any weird quoting. 2009-07-23 Murray Cumming Fix the build with Python 2.5, bringing back the warnings for others. * glom/libglom/python_embed/py_glom_record.cc: * glom/libglom/python_embed/py_glom_related.cc: * glom/libglom/python_embed/py_glom_relatedrecord.cc: * glom/libglom/python_embed/pygdavalue_conversions.c: Remove the extra struct field initialization to fix the build with Python 2.5. 2009-07-23 Daniel Elstner Add comment about .DELETE_ON_ERROR: special target 2009-07-23 Daniel Elstner Make libegg object files depend on eggmarshalers * Makefile.am ($(*libegg*_a_OBJECTS)): Make all object files of libeggutil.a and libeggtoolpalette.a depend on the generated source files eggmarshalers.[ch]. This ensures that the marshaler files are generated before any of the libegg objects are compiled, but avoids having to resort to BUILT_SOURCES for that purpose. (*_libeggtoolpalette_a_LIBADD): Remove dependency on libeggutil.a again, as it is not required for linking the static library itself. 2009-07-23 Daniel Elstner Add missing _LIBADD variables for libegg * Makefile.am (*_libeggtoolpalette_a_LIBADD): List libeggutil.a as dependency. 2009-07-23 Daniel Elstner Fix build with -Werror * glom/bakery/app_withdoc.cc: Fix build with -Werror. * glom/dialog_import_csv.cc: ditto, * glom/libglom/python_embed/py_glom_record.cc: ditto, * glom/libglom/python_embed/py_glom_related.cc: ditto, * glom/libglom/python_embed/py_glom_relatedrecord.cc: ditto, * glom/libglom/python_embed/pygdavalue_conversions.c: ditto, * glom/mode_design/fields/dialog_fielddefinition.cc: ditto, * glom/utility_widgets/dialog_image_progress.cc: ditto. 2009-07-23 Daniel Elstner Remove INSTALL file and update .gitignore * INSTALL: Remove, as this file is provided by Automake. * win32/glom.iss.in: Remove executable permission. * .gitignore: Update. * macros/.gitignore: Update. 2009-07-23 Daniel Elstner Switch to non-recursive build process * macros/mm-pkg.m4: New file, defining the MM_PKG_CONFIG_SUBST macro. * macros/mm-python.m4: New file, defining the MM_CHECK_MODULE_PYTHON macro to replace the old and messy AM_CHECK_PYTHON_HEADERS. * acinclude.m4: Remove file which defined AM_CHECK_PYTHON_HEADERS. * Makefile.am: Merge the contents of the Makefile.am files from all subdirectories into a single top-level Makefile.am, with the exception of docs/user-guide/Makefile.am. Add the full subdirectory prefix to all listed files and change the Automake variable names accordingly. Get rid of the intermediate static libraries previously created for each source subdirectory, and list the source files directly in the toplevel target's SOURCES variable. Overall, refactor and modernize the build rules and organization. * **/Makefile.am: Except for docs/user-guide/Makefile.am, remove the Makefile.am files recursively from all subdirectories. * config.h.in: Remove file, and use autoheader to generate it. * autogen.sh: Replace with a modern minimalistic script which lets autoreconf do the bulk of the work. * configure.ac: Massive refactoring. Adapt to the new non-recursive build organization. Modernize the M4 and shell code, and make use of newer Autoconf and Automake constructs to simplify many checks. Also make minor corrections to a number of tests and definitions. * glom/application.cc: Remove the need for GLOM_ICON_DIR by setting the window icon by name instead of loading the image file directly. Use PACKAGE_VERSION in place of VERSION. * glom/dialog_existing_or_new.cc: Use a subdirectory of GLOM_DOCDIR in place of GLOM_EXAMPLES_DIR. Remove GLOM_EXAMPLES_DIR_ALTERNATIVE. * glom/utils_ui.cc: Replace DATADIR by GLOM_DATADIR. * glom/libglom/connectionpool.cc: Remove GLOM_SAVE_DATADIR hack, which is not necessary anymore as DATADIR is not globally defined anymore. * glom/libglom/connectionpool_backends/postgres_self.cc: ditto, * glom/libglom/spawn_with_feedback.cc: ditto, * glom/main.cc: ditto. Also replace LOCALEDIR by GLOM_LOCALEDIR, and output PACKAGE_STRING instead of VERSION in response to the --version command-line option. Replace PACKAGE and VERSION by their modern Automake equivalents. * glom/xsl_utils.cc: Remove GLOM_SAVE_DATADIR hack, and replace GLOM_XSLTDIR with a subdirectory of GLOM_PKGDATADIR. * glom/mode_data/box_data_calendar_related.cc: Replace GLOM_GLADEDIR by a combination of GLOM_PKGDATADIR and a subdirectory name. * glom/mode_design/print_layouts/print_layout_toolbar_button.cc: Use a subdirectory of GLOM_PKGDATADIR in place of GLOM_ICON_DIR. * glom/utility_widgets/layouttoolbar.cc: ditto, * glom/utility_widgets/layouttoolbarbutton.cc: ditto. * glom/python_embed/glom_python.cc: Include generated config.h for the definition of GLOM_ABI_VERSION_UNDERLINED. * glom/python_embed/python_module/py_glom_module.cc: ditto. 2009-07-23 Murray Cumming Really make the change from the previous commit, after releasing that git am was misleading me. 2009-07-23 David King Add libxml++ dependency to libglom pkg-config file. * glom/libglom/glom-1.0.pc.in: Add libxml++ dependency, needed for Bakery headers. 2009-07-23 David King Check that GThread is supported before calling Glib::thread_init(). * glom/libglom/init.cc: Check that GThread is supported before calling Glib::thread_init(). This fixes a crash, as otherwise g_thread_init() can be called twice. 2009-07-22 Johannes Schmid Fixed typo with libepc 2009-07-22 Murray Cumming Added DOAP file. 2009-07-21 Murray Cumming Added DOAP file. 2009-07-21 David King Install libglom headers to the correct, ABI-specific directory. * glom/libglom/glom-1.0.pc.in: * glom/libglom/*/Makefile.am: Use GLOM_ABI_VERSION in place of "1.0" so that installed headers go into the correct, ABI-specific directory. 2009-07-21 Murray Cumming glom/libglom/glom-1.0.pc.in: Remove the bakery dependency, because no part of Glom now depends on the bakery shared library. I suspect that libglom should depend on python somehow, but we will see. 2009-07-18 Murray Cumming Added TODOs about places that might need quoting. 2009-07-17 Murray Cumming Use an xmlns ID for the MIME-type registration. * glom/libglom/document/bakery/document_xml.[h|cc]: set_dtd_root_node_name(): Take an optional xmlns ID and write this in the document. * glom/libglom/document/document.cc: Constructor: Specify a http://glom.org/glom_document xmlns ID. I don't think this needs to exist. This will make it easier for the MIME-type system to detect the file's MIME type. * glom.xml: (MIME-type detection rules): Add a root-XML rule, that checks for the xmlns and the root node name. We keep the string check too for legacy. 2009-07-17 Murray Cumming Removed useless old patches directory. 2009-07-11 Daniel Mustieles Updated Spanish translation Author: Daniel Mustieles 2009-07-10 Murray Cumming Export: Don't open the format dialog behind the FileChooser dialog. * glom/frame_glom.cc: on_menu_file_export(): Set the FileChooser dialog as transient so that the other dialog (opened from the FileChooser) is not behind the FileChooser. Ubuntu Launchpad bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/397409 (elmergato) 2009-07-10 Murray Cumming Really save field changes again. * glom/libglom/document/document_glom.cc: set_table_fields(): Avoid the broken attempt at optimization, so that field changes are always saved, for instance when changing them via the Field Definition dialog. Ubuntu Launchpad bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/394507 (elmergato) 2009-07-10 Murray Cumming advance_field(): Do not skip characters after the ". 2009-07-10 Murray Cumming Use show_ok_dialog(). 2009-07-10 Murray Cumming Added .gitattributes 2009-07-10 Murray Cumming Import: Ignore newlines in quotes. * glom/dialog_import_csv.cc: on_idle_parse(): Ignore newlines in quotes when dividing the input into "lines" to give to handle_line(). advance_field(): Do not skip the character after "". 2009-07-10 Murray Cumming Import: Handle "" as ". Fix a crash. * glom/dialog_import_csv.[h|cc]: Use typedefs to simplify code. advance_field(): Handle "" (escaped ") inside quotes. field_data_func(): Avoid a crash if not enough data was found. 2009-07-09 Murray Cumming Import: " is the only quote character, as per the CSV RFC. * glom/dialog_import_csv.cc: advance_field(): Parse only " as start/end quotes, not ', as per the CSV RFC. Part of Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/394894 (elmergato) 2009-07-09 Murray Cumming on_menu_file_import(): Mention adjustment1 to work around GtkBuilder bug #575714. 2009-07-08 Mario Blättermann Updated German translation 2009-07-08 Murray Cumming Correct the export to use the CSV format as per the RFC "specification". * glom/frame_glom.cc: export_data_to_stream(): For text fields, add " as per the CSV RFC. * glom/libglom/data_structure/field.cc: to_file_format(): Escape " as "". Note that we do not try to escape newlines. This is per the CSV RFC. * glom/libglom/utils.cc: string_replace(): In the loop, do not check what has already been processed, to avoid an infinite loop. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/394894 (elmergato) 2009-07-07 Murray Cumming Fixed ChangeLog 2009-07-07 Murray Cumming Catch libgda meta-store exceptions. * glom/base_db.cc: get_table_names_from_database(): * glom/libglom/connectionpool.cc: connect(): Added try/catch around calls to Gda::Connection::update_meta_store_*() because they now throw a MetaStoreError exception, though we do not know why yet. 2009-07-05 Murray Cumming include config.h to avoid a crash with the client-only build due to ABI code-size confusion. 2009-07-05 Murray Cumming init_menus_file(): Initialize m_toggleaction_network_shared to avoid a crash. 2009-07-05 Murray Cumming Remove the toolbar widget because we hide it anyway. 2009-07-05 Murray Cumming update_network_shared_ui(): Un-ifndef this for client-only. 2009-07-05 Murray Cumming Move some ifndefs around to fix the client-only build. 2009-07-05 Daniel Mustieles Updated Spanish translation Signed-off-by: Jorge Gonzalez Author: Daniel Mustieles 2009-07-05 Murray Cumming Remove old code to check for developer mode in client-only builds. 2009-07-04 Murray Cumming Fix loading of the versioned python module. * configure.ac: * glom/Makefile.am: * glom/python_embed/Makefile.am: * glom/python_embed/glom_python.cc: * glom/python_embed/python_module/Makefile.am: * glom/python_embed/python_module/py_glom_module.cc: * glom/python_embed/python_module/py_glom_module.h: Use glom_1_12 instead of glom-1.12 because - and . are not valid in python module names. I wish I knew of any standard way to do parallel install of different versions of python modules. 2009-07-04 Murray Cumming libglom: Remove use of GLOM_ENABLE_MAEMO because it is about UI. * glom/libglom/utils.cc: * glom/libglom/connectionpool.cc: Remove use of GLOM_ENABLE_MAEMO so because there should be no UI-specific login in libglom. * glom/libglom/document/document.[h|cc]: Remove get_active_layout_platform() because we no longer use GLOM_ENABLE_MAEMO. * glom/base_db.[h|cc]: Add a get_active_layout_platform(document) here instead. * glom/libglom/libglom_config.h.in: Moved GLOM_ENABLE_MAEMO to config.h.in because it is now only used in the app, not in libglom. * glom/base_db_table_data.cc: * glom/frame_glom.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/notebook_data.cc: * glom/relationships_overview/dialog_relationships_overview.cc: * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/dialog_choose_id.cc: * glom/utils_ui.h: * glom/xsl_utils.cc: Adapted, using config.h instead of libglom_config.h 2009-07-04 Murray Cumming libglom: Always enable developer-mode (!client-only) API. * glom/libglom/*.[h|cc]: Remove use of ENABLE_CLIENT_ONLY ifdefs, so we can allow parallel install of full and client-only versions. 2009-07-04 Murray Cumming Remove ifdefs from libglom to allow parallel install of full and client-only versions. * glom/libglom/connectionpool_backends/postgres.h: * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/connectionpool_backends/sqlite.h: * glom/libglom/document/document.[h|cc]: * glom/libglom/test_connectionpool.cc: Remove ifdefs that remove PostgreSQL or Sqlite API so that libglom always offers all features and always has the same ABI (ignoring no-exceptions/no-vfuncs alternative-glibmm-api versions). This will allow us to parallel install the full and client-only versions. * glom/libglom/libglom_config.h.in: Move GLOM_ENABLE_POSTGRESQL/SQLITE config.h.in because we now only use it in the application, not in libglom. * glom/application.cc: * glom/dialog_connection.cc: * glom/frame_glom.cc: * glom/utility_widgets/filechooserdialog_saveextras.cc: * glom/utility_widgets/filechooserdialog_saveextras.h: Include config.h to get these definitions. 2009-07-03 Murray Cumming Allow parallel installs of libglom major versions. * configure.ac: Define GLOM_ABI_VERSION as 1.12. * glom/Makefile.am: * glom/libglom/Makefile.am: * glom/python_embed/Makefile.am * glom/python_embed/python_module/Makefile.am: * regression_tests/Makefile.am: Add a 1.12 suffix to the libglom shared library name and the glom python module name. This must be changed in several places when the ABI version changes because we cannot use a variable in most of these places. Define it also as a macro for the .cc files, so Glom can import the correct version of the Glom python module - for instance, import glom-1.12. * glom/python_embed/glom_python.cc: * glom/python_embed/python_module/py_glom_module.cc: Import the correct version in python. 2009-06-30 Armin Burgmeier Added a test which makes sure adding fields in an existing table is working * ldtp/fields-edit/fields-edit.py: Added a new test which tests adding a new field to an existing table. More operations to test, such as changing and removing existing fields, can be added later. * ldtp/fields-edit/postgres-central.xml: * ldtp/fields-edit/postgres-self.xml: * ldtp/fields-edit/sqlite.xml: XML Data files for the new test. * ldtp/test.xml: Added it to the test suite, so that it can be run with ldtprunner. 2009-06-30 Armin Burgmeier Added Database Templates for LDTP to test functionality with * ldtp/database-templates/SQLite: * ldtp/database-templates/PostgresCentral: Added database templates for two of the three backends. These can be copied and then opened to have a database available for LDTP tests to test. * ldtp/common.py: Added create_test_database and delete_test_database functions which create or remove a database to test, from such a template database, respectively. * ldtp/database-creation/create-db.py: Use the delete_test_database function from common on cleanup, remove own delete_database function. 2009-06-30 Armin Burgmeier LDTP: Test tables containing capital letters * ldtp/database-creation/create-db.py: Changed the name of the created database table (for empty databases) to TestTable, so that we test that table names with capital letters work correctly. 2009-06-30 Armin Burgmeier Make querying fields of a database table work if the table name needs quotation * glom/base_db.cc (get_fields_for_table_from_database): Make this work for table names which need quotation, and return unquoted field names. This fixes bug #587051. 2009-06-30 Murray Cumming Remove debug output. 2009-06-30 Murray Cumming get_table_names_from_database(): Remove quotes. * glom/base_db.cc: get_table_names_from_database(): Remove quotes when they are (sometimes) in the meta data. I complained on the gnome-db mailing list about us having to do this. 2009-06-30 Murray Cumming get_table_names_from_database(): Remove quotes. * glom/base_db.cc: get_table_names_from_database(): Remove quotes when they are (sometimes) in the meta data. I complained on the gnome-db mailing list about us having to do this. 2009-06-29 Murray Cumming Allow many fields to be added to layouts (or the export format) at once. * glom/mode_data/dialog_choose_field.[h|cc]: Added get_fields_list() in addition to the existing get_field_list(), and allow multiple selection. * glom/base_db.[h|cc]: offer_field_list(): Rename to offer_field_list_select_one_field(). Added offer_field_list() that returns a list of fields, allowing multiple selection. * *.[h|cc]: Adapted to use the appropriate function, allowing, for instance, the export dialog to use multiple selection to add many fields at once. Ubuntu Launchpad bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/393231 (elmergato) 2009-06-29 Murray Cumming Export: Offer File overwrite confirmation. * glom/frame_glom.cc: on_menu_file_export(): * glom/translation/window_translations.cc: on_button_export(): Call Gtk::FileChooser::set_do_overwrite_confirmation() so the user is warned when overwriting a file. Ubuntu Launchpad bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/393229 (elmergato) 2009-06-29 Murray Cumming ifdef out the debug output. 2009-06-29 Murray Cumming Reduce debug output. * glom/libglom/data_structure/glomconversions.[h|cc]: sanity_check_date_text_representation_uses_4_digit_years(): Make the debug output optional. * glom/main.cc: Added a --debug-date-check option, to avoid the debug out about 4-digit dates normally. * glom/dialog_existing_or_new.cc: list_examples_at_path(): Comment out debug output. * glom/libglom/connectionpool.cc: connect(): Comment out debug output that showed the (previously slow) meta update calls. 2009-06-29 Murray Cumming Reduce debug output. * glom/libglom/data_structure/glomconversions.[h|cc]: sanity_check_date_text_representation_uses_4_digit_years(): Make the debug output optional. * glom/main.cc: Added a --debug-date-check option, to avoid the debug out about 4-digit dates normally. * glom/dialog_existing_or_new.cc: list_examples_at_path(): Comment out debug output. * glom/libglom/connectionpool.cc: connect(): Comment out debug output that showed the (previously slow) meta update calls. 2009-06-28 Armin Burgmeier Removed .cvsignore files, added .gitignore ones 2009-06-28 Murray Cumming rint exception messages to stdout. * ldtp/database-creation/create-db.py: When catching the exception, print it to stdout, because it does not seem to appear in the log file. * ldtp/common.py: Corrected the English of some exception messages. 2009-06-28 Daniel Mustieles Updated Spanish translation Signed-off-by: Jorge Gonzalez Author: Daniel Mustieles 2009-06-28 Daniel Mustieles Updated Spanish translation Signed-off-by: Jorge Gonzalez Author: Daniel Mustieles 2009-06-27 Armin Burgmeier LDTP: Added missing XML data files 2009-06-27 Armin Burgmeier * ldtp/database-creation/postgres-central-empty.xml: * ldtp/database-creation/postgres-self-empty.xml: * ldtp/database-creation/sqlite-empty.xml: Added missing files. * ldtp/database-creation/create-db.py: Allow passing the datafilename as an argument when the script is called directly, not by ldtprunner. * ldtp/README: Updated the section on how to execute a single test script. 2009-06-26 Murray Cumming Fix an error check. * glom/xsl_utils.cc: transform_and_open(): Fix the check for a failed gtk_show_uri(), so we really check. Noticed while stealing this code for vidrot. 2009-06-26 Armin Burgmeier Show correct error message when document could not be loaded from disk * glom/libglom/document/bakery/document.h: Document that failure_code should be >= 1, so that we can detect whether the document could not be opened because it couldn't be read from disk, or a custom error code was set. * glom/libglom/document/document.h: Set the value of LOAD_FAILURE_CODE_FILE_VERSION_TOO_NEW to 1, to honor the requirement explained above. This fixes showing the wrong error message when the document could not be loaded from disk. 2009-06-26 Armin Burgmeier Add newly created documents to the recently used files * glom/application.cc (existing_or_new_new): When the new database could be created successfully, then add the document to the recent files list. 2009-06-26 Armin Burgmeier LDTP: When creating empty documents, call the initial table 'test_table' * glom/frame_glom.cc (connection_request_password_and_choose_new_database_name): Remember the port also for centrally hosted documents when a successful connection could be made. * ldtp/database-creation/create-db.py: For empty documents, call the initial table 'test_table', not 'TestTable', because of bug #587051. 2009-06-26 Armin Burgmeier LDTP: Reopen documents after creation, also test new, empty documents * glom/dialog_glom.h: * glom/dialog_glom.cc: Added an optional second parameter to the constructor, to specify a title name for the dialog. * glom/frame_glom.cc: Set the title of the tables dialog to "Tables", so that it can be accessed via LDTP. * glom/glom.glade: Also change the title of that dialog, even though it's not used, since only the window's child widget is loaded from the glade file. * glom/utility_widgets/adddel/adddel.h: * glom/utility_widgets/adddel/adddel.cc: Added a set_treeview_accessible_name() function, to set the accessible name of the AddDel's TreeView. * glom/navigation/box_tables.cc: Set an accessible name for the TreeView, to be able to access it via LDTP. * glom/utility_widgets/filechooserdialog_saveextras.cc: Set an accessible name for the database title text entry. * ldtp/common.py (select_backend): Added a dialog_title parameter, as the dialog has a different title when creating a new, empty document. (wait_for_database_open): Rely on the database title being 'Test', not 'Small Business Example'. * ldtp/database-creation/create-db.py: Change the database title of the newly created database to 'Test'. Support creating new, empty documents, and reopen the document after it has been closed, to make sure the document has been saved correctly. * ldtp/database-creation/postgres-central-example.xml: * ldtp/database-creation/postgres-self-example.xml: * ldtp/database-creation/sqlite-example.xml: Moved from the files without -example, set the tag to 1. * ldtp/database-creation/postgres-central-example.xml: * ldtp/database-creation/postgres-self-example.xml: * ldtp/database-creation/sqlite-example.xml: Same with set to 0. * ldtp/test.xml: Added the three new files which create an empty document instead of creating one from the Small Business Example. 2009-06-24 Armin Burgmeier LDTP: Delete created centrally hosted database at the end of the test * ldtp/common.py: Work around bug #586291, added a function to enter the connection credentials into the connection dialog if using a centrally hosted database. Added mapping of backend name to button texts in the database creation dialog. * ldtp/database-creation/postgres-central.xml: * ldtp/database-creation/postgres-self.xml: * ldtp/database-creation/sqlite.xml: Removed the button texts from the data XML files. * ldtp/database-creation/create-db.py: Generalized the script so that it also handles central hosting. Delete the newly created centrally hosted database at the end. This requires pygda from git for now. * ldtp/database-creation/create-central-db.py: Removed, as central hosting is also handled by create-db.py now. 2009-06-24 Armin Burgmeier Added a new LDTP test which tests creating a centrally hosted database * glom/glom.glade: Added a title to the connection dialog window, and added accessible names for the entries, to be able to use them via LDTP. * ldtp/README: Describe how to set the login credentials required to test creating a centrally hosted database. * ldtp/common.py: Moved useful code from ldtp/database-creation/create-db.py into functions in this file, so other tests can use them, too. * ldtp/database-creation/create-db.py: Adapt accordingly. * ldtp/database-creation/create-central-db.py: * ldtp/database-creation/postgres-central.xml: Added a new test script and data XML which tests creating a centrally hosted database. * ldtp/test.xml: Added the new script file. 2009-06-24 Armin Burgmeier Fix opening documents using a centrally-hosted database (#586684). * glom/application.cc (on_document_load): Only provide a known user name and password for self-hosted databases, and ask the user for the database password for centrally-hosted ones. * glom/frame_glom.cc (connection_request_password_and_attempt): Show the connection dialog for centrally hosted connections, and fix trying to login with the same (wrong) credentials all the time without giving the user a chance to correct them. This fixes bug #586684. 2009-06-22 Armin Burgmeier Fixed creating a centrally-hosted database from example * glom/application.cc (on_document_load): If we load an example file, set the connection port in the document to 0, and enable trying other ports, instead of using the (arbitrary) values from the example file. This allows trying out various standard ports for postgresql when centrally-hosting the document and fixed creating a centrally-hosted database from an example file. * glom/dialog_connection.cc (connect_to_server_with_connection): On a successful connection, set try other ports to false in the document, as we found a working port and don't need to try all the other ports next time. * glom/frame_glom.cc (connection_request_password_and_choose_new_database_name): When creating a centrally-hosted database, remember the user name in the document, to be able to connect to the database from the saved document later. Actually, we would also need to save the password to do this correctly, though I wonder whether it's a good idea to save the user's database password in the .glom file. 2009-06-22 Armin Burgmeier Avoid a crash when creating a centrally-hosted database * glom/frame_glom.cc: (connection_request_password_and_choose_new_database_name): Fixed a mistyped #ifdef, so that creating a centrally-hosted database does not lead to a crash. 2009-06-20 Armin Burgmeier Use data XML files to specify the backend to test 2009-06-20 Armin Burgmeier * ldtp/database-creation/create-db.py: Read the data what backend to use from the a data XML file, instead of as a function's argument. * ldtp/database-creation/self-hosted.py: * ldtp/database-creation/sqlite.py: So we don't need these anymore. * ldtp/database-creation/postgres-self.xml: * ldtp/database-creation/sqlite.xml: Instead, the data is specified in these data XML files. * ldtp/test.xml: Adapt accordingly. 2009-06-17 Armin Burgmeier Added a README file explaining how to run the tests * ldtp/README: Added a README file explaining how to run the tests. 2009-06-17 Armin Burgmeier Added SQLite database creation test * ldtp/common.py: Added a common function to launch glom and wait for its windows to appear into a new separate python script file. * ldtp/database-creation/create_db.py: Added a function to create a new database, with the backend to use as an argument. This allows to reuse the existing code to test other backends. * ldtp/database-creation/self-hosted.py: Adapted accordingly. * ldtp/database-creation/sqlite.py: Added a test file to check whether SQLite database creation works. * ldty/test.xml: Added the test to create an SQLite database. 2009-06-09 Mario Blättermann Updated German translation 2009-06-08 Armin Burgmeier Added LDTP test to check creation of a new self-hosted postgres database * ldtp/database-creation/self-hosted.py: Added a LDTP test script which checks creation of a new self-hosted database from the Small Business Example file. * ldtp/test.xml: Added an XML file for ldtprunner. Run "ldtprunner test.xml" to execute the test. 2009-06-08 Armin Burgmeier Added accessible names for DbAdddel and layout entries/images * glom/utility_widgets/db_adddel/db_adddel.cc: Added an accessible name for the TreeView. * glom/utility_widgets/imageglom.h: * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/entryglom.h: * glom/utility_widgets/entryglom.cc: Set an accessible name, based on the layout item's name. 2009-06-08 Armin Burgmeier Avoid an uninitialized pointer in client only mode * glom/utility_widgets/layoutwidgetbase.cc: Initialize m_pLayoutItem in client only mode, to avoid an uninitialized pointer in that case. 2009-06-06 Mario Blättermann Updated German translation 2009-06-04 Murray Cumming Show a specific error message when the flie format is too new. * glom/libglom/document/bakery/document.[h|cc]: * glom/libglom/document/bakery/document_xml.[h|cc]: load(), load_after(): Take a int& failure_code output parameter to allow derived document classes to report a custom failure code. * glom/libglom/document/document.[h|cc]: load_after(): Return a custom failure_code for a too-new file version. * glom/bakery/app_withdoc.[h|cc]: Add a virtual ui_warning_load_failed(int failure_code) method that derived classes can override to respond to their own failure codes, with a generic default error message. open_document(), open_document_from_data(): Use the new method instead of hard-coding the error message. * glom/application.[h|cc]: open_browsed_document(), on_menu_developer_changelanguage(): Adapt. Add an override of ui_warning_load_failed() to show our custom error dialog in response to our custom failure code. * glom/libglom/test_document.cc: Apapted. Exceptions might be purer and need less code changes, but they would just be a container for an int failure code and it would be easier to not catch the error. This fixed bug #567102. 2009-06-04 Murray Cumming Corrected ChangeLog 2009-06-04 Murray Cumming 2009-06-04 Murray Cumming * glom/libglom/data_structure/layout/layoutitem_portal.cc: get_navigation_relationship_specific(): Remove unnecessary this-> to be consistent with the rest of the code. 2009-06-04 Murray Cumming Related records portal: Hide the row button when navigation is none. * glom/libglom/data_structure/layout/layoutitem_portal.h: Add documentation for get/set_navigation_relationship_specific(), get/set_navigation_type() and the enum. * glom/mode_data/box_data_list_related.cc: enable_buttons(): Disable editing of details when the portal has NAVIGATION_NONE. * glom/utility_widgets/db_adddel/db_adddel.cc: construct_specified_columns(): Set the button column visibility according to the member variable set in set_allow_view_details(), because the button column often does not exist when that is actually called. This completes bug #574360. 2009-06-04 Murray Cumming pdate the DTD for portal navigation and save space in XML. * glom/glom_document.dtd: Update for the portal navigation changes, as promised in bug #574360 * glom/libglom/document/document.cc: save_before_layout_group(): Do not even create the portal_navigation_relationship node if it is the default (automatic), to save space in the XML file. 2009-06-04 Murray Cumming Clean up the code to load/save portal navigation options. * glom/libglom/document/document.cc: load_after_layout_group(): Loading the portal's navigation options: Use == instead of ustring::compare() because this is not C. Explicitly default to automatic, removing the comment about defaulting to the default in the Portal's class to preserve the deprecated file format. This is more obvious. save_before_layout_group(): Simplify the code. Do not write GLOM_ATTRIBUTE_PORTAL_NAVIGATIONRELATIONSHIP_MAIN because a) It is deprecated (should be read but not written) and b) It is not read or used anywhere else anyway. Use constants for the possible attribute values, instead of copy/pasting the same string constants in several places. 2009-06-04 Murray Cumming Store script module code in child text nodes. * glom/libglom/document/document.cc: load_after(), save_before(): Store the (importable) python script library modules in a child text node instead of an attribute, as we do elsewhere, dealing with a TODO that I found in the DTD. * glom/glom_document.dtd: Update appropriately. 2009-06-04 Murray Cumming Added a little TODO. 2009-06-03 Daniel Mustieles Updated Spanish translation Signed-off-by: Jorge Gonzalez 2009-06-02 Mario Blättermann Updated German translation 2009-06-02 Murray Cumming Correct the ChangeLog 2009-06-01 Murray Cumming Increased version 2009-06-01 Murray Cumming Remove ifdefs for disabled gtkmm vfuncs. * glom/mode_data/flowtablewithfields.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttonimage.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttonimage.h: * glom/utility_widgets/db_adddel/cellrenderer_buttontext.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttontext.h: * glom/utility_widgets/db_adddel/db_adddel_withbuttons.cc: * glom/utility_widgets/db_adddel/db_adddel_withbuttons.h: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: Remove ifdefs for disabled gtkmm vfuncs, because they are no enabled in Maemo 5 (Fremantle). 2009-06-01 Mario Blättermann Updated German translation 2009-05-29 Armin Burgmeier Fixed initial records not being shown when creating from example * glom/libglom/connectionpool.cc: After invalidating a cached connection, disconnect from the cached connection's "finished" signal, to prevent the signal handler from being called later (other code might still have a reference to the connection at the invalidate_connection point). Also added a TODO comment, because this can still happen in rare cases. This fixes initial records not being shown after creating a database from an example file. 2009-05-29 Armin Burgmeier Added an accessible name for the mode_data notebook * glom/mode_data/notebook_data.cc: Added an accessible name for the notebook, so that it can be accessed via LDTP. 2009-05-29 Murray Cumming Remove the mention of the eggcolumnchooser subdirectory, to fix the build. 2009-05-26 Armin Burgmeier Added window title for initial dialog and accessible names for its widgets * glom/glom.glade: Added a window title to the initial dialog, and accessible names for the two tree views in it, so they are easily accessible from LDTP. 2009-05-25 Armin Burgmeier Fixed a crash when Glom was lanuched via LDTP * glom/dialog_existing_or_new.cc (constructor): Create the top level list elements before setting the cell data func, to avoid the cell data func being called before all the list elements have been added. This happended when Glom was launched via LDTP, leading to a crash. 2009-05-20 Armin Burgmeier Speedup initial meta store update by only fetching public tables * glom/libglom/connectionpool_backends/backend.h: * glom/libglom/connectionpool_backends/postgres.h: * glom/libglom/connectionpool_backends/sqlite.h: Added get_public_schema_name() virtual function and implementations for both backends. * glom/libglom/connectionpool.cc: Only update the meta store tables for the public schema of the corresponding backend. This considerably speeds up the initial meta store update. This requires latest libgdamm from git. 2009-05-10 Murray Cumming Disables the Open button next to ID fields if the field is empty. * glom/utility_widgets/datawidget.[h|cc]: Added private update_go_to_details_button_sensitivity() method and called it whenever the value is changed by the user or set via set_value(). Fixes bug #565023. 2009-05-09 Murray Cumming Made fr.po non-executable to allow me to push to git. 2009-05-08 Mario Blättermann Updated German translation 2009-05-08 Jorge Gonzalez Updated Spanish translation by Daniel Mustieles 2009-05-07 Murray Cumming Allow non-network-shared connections when using IPv6. * glom/libglom/connectionpool_backends/postgres_self.cc: DEFAULT_CONFIG_PG_HBA_LOCAL: Add an entry in IPv6 syntax, because something seems to be more IPv6-like in Ubuntu Jaunty. 2009-05-07 Armin Burgmeier Show a progress bar while loading an image * glom/glom.glade: * glom/utility_widgets/dialog_image_progress.h: * glom/utility_widgets/dialog_image_progress.cc: * glom/utility_widgets/Makefile.am: Added a dialog which loads an image and shows progress of the operation. * glom/utility_widgets/imageglom.h: * glom/utility_widgets/imageglom.cc: Use this dialog when the user selects an image to load, to indicate progress for large images. 2009-05-07 Murray Cumming Pass some sharedptr&s as const. * glom/utility_widgets/flowtable_dnd.h: on_dnd_add_layout_item() * glom/mode_data/flowtablewithfields.[h|cc]: on_dnd_add_layout_item(), on_entry_edited(), on_entry_open_details_requested(), on_dnd_add_layout_item(): Pass the sharedptr& as const. 2009-05-07 Murray Cumming Fixed minor compiler warnings and removed some virtuals. * glom/mode_data/flowtablewithfields.h: Made methods non-virtual where the virtual is unnecessary and misleading. * glom/utility_widgets/adddel/eggcolumnchooser/: Removed. * several: Fixed minor compiler warnings. 2009-05-05 Armin Burgmeier Image loading speedup * glom/libglom/sharedptr.h: Added operator!=. * glom/mode_data/flowtablewithfields.h: * glom/mode_data/flowtablewithfields.cc: Added set_other_field_value which is the same as set_field_value except that it does not set the value for widget that belongs to the passed layout item's widget itself. This can be used if that very widget already contains the new value to avoid setting it again. Especially when dealing with large images this brings an essential speedup. * glom/mode_data/box_data_details.cc (on_flowtable_field_edited): Use set_other_field_value, so that we don't set the value for the field which the user already changed again. * glom/utility_widgets/imageglom.h: * glom/utility_widgets/imageglom.cc: Store the original data of the image file, and return it in get_value(), instead of creating a PNG from the raw image data, to speed up loading a large image file. * glom/utils_ui.cc (get_pixbuf_for_gda_value): When loading images from the database, allow all image types, not just PNGs. * glom/xsl_utils.cc: Include gtk/gtk.h to fix the build for me. 2009-04-26 Mario Blättermann Updated German translation 2009-04-25 Jorge Gonzalez Updated Spanish translation by Daniel Mustieles 2009-04-24 Murray Cumming Don't network share new documents from (old) examples. * glom/libglom/document/document.cc: load_after(): Only assume network-sharing for older documents if it's not an example, so we don't have to resave all the examples. 2009-04-23 Murray Cumming Improved older ChangeLog entry. 2009-04-23 Murray Cumming Fix loading of old self-hosted files, broken since defaulting to no sharing. * glom/libglom/document/document.cc: get_latest_known_document_format_version(): Increase the number because we have added nodes/attributes. load_after(): For older document formats, read network_sharing as on if it is false (not mentioned). 2009-04-23 Murray Cumming on_document_load(): Avoid false unexpected error warning. 2009-04-23 Murray Cumming Allow to disable navigation in the related record layout. * glom/libglom/data_structure/layout/layoutitem_portal.[h|cc] ctor(), [set|get]_navigation_relationship_specific(), [set|get]_navigation_type(), set_navigation_type(): Replaced the flag for whether a specific navigation relationship should be used with an enum type, since we now have an additional state (no navigation relationship) in the Glom::LayoutItem_Portal class. Additionally, this internal state no longer needs to be exported so [set|get]_navigation_relationship_specific() can now be called without supplying a boolean output parameter. * glom/libglom/document/document.cc load_after_layout_group(), save_before_layout_group(): Added load and save support for the no-navigation-relationship option. * glom/mode_data/box_data_portal.cc get_suitable_table_to_view_details(): Return an empty table name if the navigation relationship type was set to none. * glom/mode_data/dialog_layout_list_related.[h,cc] ctor(), update_ui(), save_to_document(), glom/glom_developer.glade: Insert a third choice (none) for the navigation radio buttons. * glom/mode_data/dialog_layout_calendar_related.cc update_ui(), save_to_document(): Replaced calls to LayoutItem_Portal::[set|get]_navigation_relationship_specific() that still used a boolean output parameter. 2009-04-19 Murray Cumming Add or check for users when activating or deactivating network sharing. * glom/application.cc: init_menus_file(), update_network_shared_ui(): Make the network-sharing menu item insensitive if not in developer mode. on_document_load(): Some cleanup - mostly indentation changes, I think. * glom/dialog_connection.[h|cc]: Added set_confirm_existing_user_note(): to change the text so we can also use this to check that the user knows a password before switching to network-sharing mode. * glom/glom_developer.glade: dialog_new_self_hosted_connection: Change the text to make it also appropriate for asking for a first password when first switching to network-sharing. * glom/glom_privs.[h|cc]: Added get_default_developer_user_exists(), get_developer_user_exists_with_password() and get_default_developer_user_name(). * glom/libglom/connectionpool.cc: connect(): Catch exceptions from the update_meta_store_*() methods. set_user(), set_password(), set_database(): Completely invalidate the connection when these change, forcing a reconnect later. * glom/mode_design/users/dialog_users_list.cc on_button_user_remove(), on_button_user_delete(), on_button_user_new(): Move SQL into: * glom/base_db.[h|cc]: add_user(), reomve_user(), remove_user_from_group(). Added set_database_owner_user(), Glom.disable_user(): (Glom.type_list_lookups): (Glom.add_standard_groups, * glom/libglom/connectionpool_backends/postgres_self.cc DEFAULT_CONFIG_PG_HBA_LOCAL: For non-network-shared instances, use trust authentication (though we still need to specify a user). * glom/libglom/connectionpool_backends/postgres.cc: create_auth_string(): Avoid an odd auth_string if the username or password are emtpy, though I don't think we actually do this. * glom/frame_glom.[h|cc]: connection_request_initial_password(), Added this, moving some exisiting code here, to avoid duplication. connection_request_password_and_choose_new_database_name(), connection_request_password_and_attempt(): Use the default user/password if we are not network shared. on_menu_file_toggle_share(): Check that we are in developer mode. Before starting network sharing, check that the user knows a current developer password, or ask for a new one. Before stopping network sharing, add/activate the default user. 2009-04-19 Murray Cumming Makes navigation work to alternate specified relationships. * glom/mode_data/flowtablewithfields.cc: on_portal_user_requested_details(): Don't default to navigating to just the immediate related table. Instead, always use the navigation options, by always calling LayoutItem_Portal::get_suitable_record_to_view_details(). Bug #579172 (Michael Hasselmann) 2009-04-18 Jorge Gonzalez Updated Spanish translation by Daniel Mustieles 2009-04-11 Murray Cumming add_standard_groups(): Give the developer group SUPERUSER rights, fixing a 2009-04-11 Murray Cumming * glom/base_db.cc: add_standard_groups(): Give the developer group SUPERUSER rights, fixing a problem in another patch I am working on. I am surprised that this was not a problem before - maybe because the user (instead of the group) always had superuser rights via the command line database initialization. svn path=/trunk/; revision=2056 2009-04-10 Murray Cumming Add a File/Share On Network toggle menu item. Added 2009-04-10 Murray Cumming * glom/application.[h|cc] init_menus_file(): Add a File/Share On Network toggle menu item. Added update_network_shared_ui() to ensure that it is checked when appropriate. open_browsed_document(), on_document_load(): Call update_network_shared_ui(). * glom/frame_glom.[h|cc]: on_menu_file_toggle_share(): Handle the new menu item, to change the configration and restart the server. * glom/libglom/document/document.cc: Added set_network_shared(), get_network_shared(). load_after(), save_before(): Save it in the document. This is the default that will be used when opening a document. It defaults to not shared. * glom/glom_document.dtd: Document the new network_shared XML attribute. * glom/libglom/connectionpool.[h|cc]: get_and_connect(): Only start avahi publishing if we are shared on the network. set_network_shared(): Added this private function to change the configuration. initialize(), startup(): Added network_shared parameter. cleanup(): Call invalidate_connection() to prevent use of a connection to a stopped server., * glom/libglom/connectionpool_backends/backend.[h|cc]: initialize, startup, set_network_shared(): Same change as for ConnectionPool. * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: initialize(): set_network_share(): Move config file writing to set_network_share() and use different pg_hba.conf contents depending on whether we are shared on the network. startup(): Ensure that the configuration is correct. svn path=/trunk/; revision=2055 2009-04-09 Murray Cumming Improved Changelog svn path=/trunk/; revision=2054 2009-04-09 Murray Cumming get_and_connect(): Check that m_backend is not null, to avoid a critical 2009-04-09 Murray Cumming * glom/libglom/connectionpool.cc: get_and_connect(): Check that m_backend is not null, to avoid a critical warning. svn path=/trunk/; revision=2053 2009-04-09 Murray Cumming Added glom_python_module_is_available() and 2009-04-09 Murray Cumming * glom/python_embed/glom_python.[h|cc]: Added glom_python_module_is_available() and gda_python_module_is_available(). * glom/main.cc: Use them to do some extra runtime sanity checking, warning the user if their install is broken. svn path=/trunk/; revision=2052 2009-04-09 Michael Hasselmann Introduced new error code FAILURE_NO_BACKEND which shall be used to detect 2009-04-09 Michael Hasselmann * glom/libglom/connectionpool_backends/backend.h: Introduced new error code FAILURE_NO_BACKEND which shall be used to detect logical errors in the backend implementations. * glom/libglom/connectionpool_backends/postgres_self.cc (connect): Set error correctly if no self-hosted instance is active. * glom/libglom/connectionpool.cc (connect, cleanup): Added a g_return_val_if_fail to check whether there is a backend to connect to. Also reset m_ready_to_connect flag to false during cleanup, which stops Glom from behaving funnily if the user supplies wrong credentials (see bug #577821): - The user enters wrong credentials, gets a 'Connection failed' dialog the first time. Then, enters wrong credentials a second time, gets no dialog (but gets dialog for next try and so on). - Glom would crash if the user tried to open another document, then decides to abort and only opens another document (much) later (which would look like a random crash then). The ConnectionPool class could perhaps be made more robust concerning that flag since it currently allows inconsistent states. svn path=/trunk/; revision=2051 2009-04-05 Philip Withnall Add xgettext:no-c-format to a string used with strftime which gettext is 2009-04-05 Philip Withnall * glom/libglom/data_structure/glomconversions.cc: Add xgettext:no-c-format to a string used with strftime which gettext is erroneously marking as c-format. (Closes: #578013) svn path=/trunk/; revision=2050 2009-04-05 Philip Withnall Updated British English translation by Jen Ockwell 2009-04-05 Philip Withnall * en_GB.po: Updated British English translation by Jen Ockwell . svn path=/trunk/; revision=2049 2009-04-05 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=2048 2009-04-03 Murray Cumming connection_request_password_and_attempt(): When the password fails, just 2009-04-03 Murray Cumming * glom/frame_glom.cc: connection_request_password_and_attempt(): When the password fails, just loop around the while again to ask again, instead of showing a one-off extra dialog. That fixes the problem of being asked twice when the first try failed. Load the document outside of the while() instead of each time we ask for the password. svn path=/trunk/; revision=2047 2009-04-02 Armin Burgmeier Fixed the logic in this function to allow two different glom instances to 2009-04-02 Armin Burgmeier * glom/libglom/connectionpool_backends/postgres_self.cc (discover_first_free_port): Fixed the logic in this function to allow two different glom instances to self-host a database at the same time. svn path=/trunk/; revision=2045 2009-03-31 Murray Cumming get_fields_for_table_from_database(): Use the libgda metastore API (almost 2009-03-31 Murray Cumming * glom/base_db.cc: get_fields_for_table_from_database(): Use the libgda metastore API (almost as nasty as the schema API) to get the primarykeyness, because the schema API does not give us this, for no good reason that I can see. Anyway, it works, allowing us to use pre-existing databases. svn path=/trunk/; revision=2044 2009-03-31 Murray Cumming Update POTFILES.in svn path=/trunk/; revision=2041 2009-03-31 Murray Cumming Renamed to document.[h|cc]: Adapted. 2009-03-31 Murray Cumming * glom/libglom/document/document_glom.[h|cc]: Renamed to document.[h|cc]: * *.[h|cc]: Adapted. svn path=/trunk/; revision=2040 2009-03-31 Murray Cumming Renamed Document_Glom to Document, and type_vec* to type_vec_* in all 2009-03-31 Murray Cumming * Renamed Document_Glom to Document, and type_vec* to type_vec_* in all lower case, to make the API more consistent. svn path=/trunk/; revision=2039 2009-03-31 Murray Cumming Remove definitions that are in glom/libglom/libglom_config_h.in Depend on 2009-03-31 Murray Cumming * config.h.in: Remove definitions that are in glom/libglom/libglom_config_h.in * configure.ac: Depend on pygobject instead of pygtk and remove duplicate dependencies in Glom and libglom. * glom/libglom/document/document_glom.h: Remove SWIG directives because I am now using a separate SWIG .i file. * po/POTFILES.in: Updated. svn path=/trunk/; revision=2038 2009-03-30 Claude Paroz Updated French translation 2009-03-30 Claude Paroz * fr.po: Updated French translation svn path=/trunk/; revision=2037 2009-03-30 Murray Cumming Added this file with libglom_init() and libglom_deinit(), containing some 2009-03-30 Murray Cumming * glom/libglom/Makefile.am: * glom/libglom/init.[h|cc]: Added this file with libglom_init() and libglom_deinit(), containing some code that was in main(). This allows code other than Glom to use libglom. * glom/main.cc: Call the new functions, replacing some code. * glom/libglom/test_document.cc: Call the new functions. svn path=/trunk/; revision=2036 2009-03-30 Murray Cumming Remove the gtkmm dependency from libglom. 2009-03-30 Murray Cumming * configure.ac: Remove the gtkmm dependency from libglom. * glom/libglom/Makefile.am: * glom/bakery/Makefile.am: * glom/libglom/busy_cursor.[h|cc]: Moved this to glom/bakery/. * glom/libglom/data_structure/glomconversions.[h|cc]: Moved get_pixbuf_for_gda_value() to glom/utils_ui.[h|cc]. * glom/libglom/*.[h|cc]: Adapted, and removed any gtkmm or gdkmm headers. svn path=/trunk/; revision=2035 2009-03-30 Murray Cumming Added missing file to fix the build. 2009-03-30 Murray Cumming * glom/glade_utils.cc: Added missing file to fix the build. * glom/Makefile.am: * glom/libglom/Makefile.am: * glom/libglom/utils.cc: * glom/libglom/utils.h: Moved some of these functions to new glom/utils_ui.[h|cc] files to avoid having the UI stuff in libglom. *.cc: Adapted. glom/libglom/connectionpool.[h|cc]: * glom/libglom/connectionpool_backends/backend.[h|cc]: * glom/libglom/connectionpool_backends/postgres.[h|cc]: * glom/libglom/connectionpool_backends/postgres_self.[h|cc]: initialize(): Return an enum instead of a bool, to report errors, instead of showing a UI warning here. Added set_avahi_publish_callbacks() to avoid showing that UI here. * glom/frame_glom.[h|cc]: Adapt to the new API, showing UI here instead of in libglom. * glom/libglom/spawn_with_feedback.cc: Disconnect the progress timeout dlers. * glom/libglom/data_structure/layout/layoutitem_image.[h|cc]: Removed get_image_as_pixbuf() to avoid a gtkmm dependency in libglom. Made m_image public instead, to avoid performance problems with copying lots of binary data via a get*() method. * glom/libglom/document/document_glom.cc: Adapted. * glom/libglom/data_structure/print_layout.[h|cc]: Use a string instead of a Gtk::PrintLayout, using the Glib::KeyFile format, to avoid depending on gtkmm in libglom. * glom/mode_design/print_layouts/canvas_layout_item.cc: * glom/mode_design/print_layouts/canvas_print_layout.cc: Adapted. svn path=/trunk/; revision=2034 2009-03-27 Murray Cumming Added on_document_close() virtual method now that we can break this ABI. 2009-03-27 Murray Cumming * glom/bakery/app_withdoc.[h|cc]: Added on_document_close() virtual method now that we can break this ABI. * glom/application.[h|cc]: Override on_document_close(). * glom/libglom/document/document_glom.cc: Destructor: Don't shutdown the database here. Do in App_Glom::on_document_close() instead. * glom/libglom/Makefile.am: * glom/libglom/spawn_with_feedback.[h|cc]: execute_command_line_and_wait(), execute_command_line_and_wait_until_second_command_returns_success(): Take a SlotProgress callback instead of a parent window, and don't take a human-readable message string to show, allowing the caller to show UI if it wants, removing UI code from this part of libglom. Use a Glib::MainLoop to block instead of using the Gtk::Main in Gtk::Dialog::run(). * glom/libglom/connectionpool.[h|cc]: initialize(), startup, cleanup(): * glom/libglom/connectionpool_backends/backend.[h|cc]: initialize(), startup(), cleanup(): * glom/libglom/connectionpool_backends/postgres_self.cc: initialize(), startup, cleanup(): Take a SlotProgress callback instead of a parent window, allowing the caller to show UI if it wants, removing UI code from this part of libglom. glom/Makefile.am: * glom/libglom/dialog_progress_creating.[h|cc]: moved to * glom/glom/glade_utils.[h|cc]: Moved get_and_show_pulse_dialog() here. * glom/dialog_new_self_hosted_connection.[h|cc]: * glom/frame_glom.[h|cc]: connection_request_password_and_choose_new_database_name(), connection_request_password_and_attempt(): Adapted. svn path=/trunk/; revision=2033 2009-03-27 Murray Cumming Do two separate PKG_CONFIG_MODULE() checks for Glom and libglom to avoid 2009-03-27 Murray Cumming * configure.ac, glom/libglom/*/Makefile.am: Do two separate PKG_CONFIG_MODULE() checks for Glom and libglom to avoid unnecessary dependencies in libglom. * Moved libglom/glade_utils.h to glom/libglom/glade_utils.h. * *.[h|cc]: Some incomplete improvement of includes, to use full paths, to make search/replace refactoring easier. svn path=/trunk/; revision=2032 2009-03-26 Murray Cumming Depend on the latest goocanvasmm for the new API. 2009-03-26 Murray Cumming * configure.ac: Depend on the latest goocanvasmm for the new API. * glom/libglom/document/bakery/Makefile.am: * glom/libglom/document/bakery/view/Makefile.am: Install the headers as in the other directories. * glom/libglom/document/document_glom.h: Tell SWIG to add using Glom because it gets confused about the namespace. svn path=/trunk/; revision=2031 2009-03-26 Murray Cumming Removed this. Added this, which is the updated version. glom/*/*.am Fixed 2009-03-26 Murray Cumming * configure.ac: * macros/macros.m4: Removed this. * macros/dk-warn.m4: Added this, which is the updated version. * glom/*/*.am * glom/*/*.cc: Fixed some warnings. svn path=/trunk/; revision=2030 2009-03-25 Murray Cumming get_xy(), set_xy(): Use the new height property instead of faking it. 2009-03-26 Murray Cumming * glom/utility_widgets/canvas/canvas_table_movable.[h|cc]: get_xy(), set_xy(): Use the new height property instead of faking it. svn path=/trunk/; revision=2029 2009-03-25 Murray Cumming get_xy(), set_xy(), get_width_height(), set_width_height(): Use the new 2009-03-25 Murray Cumming * glom/utility_widgets/canvas/canvas_line_movable.cc: get_xy(), set_xy(), get_width_height(), set_width_height(): * glom/utility_widgets/canvas/canvas_text_movable.cc get_width_height, set_width_height(): Use the new properties instead of our custom implementations. svn path=/trunk/; revision=2028 2009-03-25 Murray Cumming get_xy(), set_xy(), get_width_height(), set_width_height(): Use the new 2009-03-25 Murray Cumming * glom/utility_widgets/canvas/canvas_line_movable.cc: get_xy(), set_xy(), get_width_height(), set_width_height(): * glom/utility_widgets/canvas/canvas_text_movable.cc get_width_height, set_width_height(): Use the new properties instead of our custom implementations. svn path=/trunk/; revision=2027 2009-03-24 Murray Cumming Stop the mainloop when the window is hidden, and then delete it. I think 2009-03-24 Murray Cumming * glom/main.cc: Stop the mainloop when the window is hidden, and then delete it. I think this was done by AppInstanceManager before. svn path=/trunk/; revision=2026 2009-03-24 Murray Cumming Rename the files to make them lower case just because the inconsistency 2009-03-24 Murray Cumming * glom/bakery/: * glom/libglom/document/bakery/: Rename the files to make them lower case just because the inconsistency has always annoyed me. * glom/*.[h|cc]: Adapted. svn path=/trunk/; revision=2025 2009-03-24 Murray Cumming Added a SWIG hint telling it how to include this header. 2009-03-24 Murray Cumming * glom/libglom/document/document_glom.h: Added a SWIG hint telling it how to include this header. svn path=/trunk/; revision=2024 2009-03-24 Murray Cumming Removed more unnecessary virtuals. 2009-03-24 Murray Cumming * glom/libglom/document/bakery/Document.h: * glom/libglom/document/bakery/Document_XML.h: Removed more unnecessary virtuals. svn path=/trunk/; revision=2023 2009-03-24 Murray Cumming Removed more unnecessary virtuals. 2009-03-24 Murray Cumming * glom/libglom/document/bakery/Document.h: Removed more unnecessary virtuals. svn path=/trunk/; revision=2022 2009-03-24 Murray Cumming Remove add_ui_from_string() because it is in App_WithDoc_Gtk too. Make 2009-03-24 Murray Cumming * glom/application.[h|cc]: Remove add_ui_from_string() because it is in App_WithDoc_Gtk too. * glom/bakery/App_WithDoc_Gtk.h: Make init_menus_file_recentfiles() non virtual because nothing overrides it. svn path=/trunk/; revision=2021 2009-03-24 Murray Cumming Remove this, merging it into: allowing us to remove some awkward virtual 2009-03-24 Murray Cumming * glom/bakery/Makefile.am: * glom/bakery/App_WithDoc.h: * glom/bakery/App_Gtk.[h|cc]: Remove this, merging it into: * glom/bakery/App_WithDoc_Gtk.[h|cc]: allowing us to remove some awkward virtual inheritance. * glom/bakery/Dialog_OfferSave.cc: * glom/application.cc: * glom/utility_widgets/adddel/adddel.cc: Adapted. svn path=/trunk/; revision=2020 2009-03-24 Murray Cumming Remove this, moving the code into these functions that previously just 2009-03-24 Murray Cumming * glom/bakery/Makefile.am: * glom/bakery/GtkDialogs.[h|cc]: Remove this, moving the code into these functions that previously just called the same named functions in GtkDialogs, for reasons that are no longer relevant: * glom/bakery/App_WithDoc_Gtk.cc ui_warning(), ui_file_select_open(), uri_is_writable(), ui_file_select_save(), ui_offer_to_save_changes(). svn path=/trunk/; revision=2019 2009-03-23 Murray Cumming Added a load() that just calls the base class, just to make life easier 2009-03-23 Murray Cumming * glom/libglom/document/document_glom.[h|cc]: Added a load() that just calls the base class, just to make life easier for SWIG, so it can ignore the base class for client-only API. svn path=/trunk/; revision=2018 2009-03-23 Mario Blättermann Updated German translation svn path=/trunk/; revision=2017 2009-03-22 Murray Cumming new_instance(): Spawn a new process via a a command line command. 2009-03-22 Murray Cumming * glom/application.[h|cc]: new_instance(): Spawn a new process via a a command line command. * glom/bakery/App.[h|cc]: new_instance(): Take a uri parameter. on_menu_file_new(): * glom/bakery/App_WithDoc.cc: open_document(): new_instance() is now expected to start a new process instead of returning a new C++ instance. This means that File/New and File/Open will start a new independent process. svn path=/trunk/; revision=2016 2009-03-22 Murray Cumming Reverted this change because each instance is now an independent process, 2009-03-22 Murray Cumming Reverted this change because each instance is now an independent process, or soon will be when I have made some more changes: * configure.ac: Depend on libunique-1.0 * glom/bakery/App_WithDoc_Gtk.[h|cc]: Added set_unique_app(), to make the app handle UniqueApp messages, to start new instances or open files. * glom/main.cc: Use set_unique_app() and send messages to the existing instance instead of starting a new instance, if one is already running. svn path=/trunk/; revision=2015 2009-03-22 Murray Cumming Removed this class. 2009-03-19 Murray Cumming * glom/bakery/Makefile.am: * glom/bakery/AppInstanceManager.[h|cc]: Removed this class. * glom/application.cc: * glom/bakery/App.cc: * glom/bakery/App.h: * glom/bakery/App_Gtk.cc: * glom/bakery/App_Gtk.h: * glom/bakery/App_WithDoc.cc: * glom/bakery/App_WithDoc_Gtk.cc: Removed management of multiple instances. Each Glom window is now isolated. That is necessary anyway because we have been storing a global application pointer separately anyway for a while now, which broke this. This would need to use some single-instance DBus thing anyway to make it work properly between processes (started from the Application menu.) That would be nice. Then we could really check if a file is already open, like gedit does. svn path=/trunk/; revision=2014 2009-03-21 Armin Burgmeier Don't run autoheader. 2009-03-21 Armin Burgmeier * autogen.sh: Don't run autoheader. * configure.ac: Prevent execution of autoheader with --enable-maintainer-mode. Copied from glibmm. * glom/libglom/libglom_config.h.in: Added include guards. * config.h.in: Added this file which was previously generated by autoheader. Removed the prefixed definitions from it but include glom/libglom/libglom_config.h instead. This prevents warnings about redefinitions when both config.h and libglom_config.h are included in a translation unit. svn path=/trunk/; revision=2013 2009-03-20 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=2012 2009-03-20 Murray Cumming Really restored files. svn path=/trunk/; revision=2011 2009-03-20 Murray Cumming check_postgres_gda_client_is_available_with_warning(): Avoid a warning 2009-03-20 Murray Cumming * glom/libglom/connectionpool_backends/postgres.cc: check_postgres_gda_client_is_available_with_warning(): Avoid a warning when libgda sometimes gives us a non-string GValue from gda_config_list_providers(), which is a silly API. svn path=/trunk/; revision=2010 2009-03-20 Murray Cumming Remove checks for GTK+ 2.10. We really have it now. 2009-03-20 Murray Cumming * glom/bakery/App_WithDoc_Gtk.cc: Remove checks for GTK+ 2.10. We really have it now. svn path=/trunk/; revision=2009 2009-03-20 Murray Cumming Depend on libunique-1.0 Added set_unique_app(), to make the app handle 2009-03-20 Murray Cumming * configure.ac: Depend on libunique-1.0 * glom/bakery/App_WithDoc_Gtk.[h|cc]: Added set_unique_app(), to make the app handle UniqueApp messages, to start new instances or open files. * glom/main.cc: Use set_unique_app() and send messages to the existing instance instead of starting a new instance, if one is already running. svn path=/trunk/; revision=2008 2009-03-19 Murray Cumming Revert my last change because we really should use a real single instance system so we can still have New and Open menu items. svn path=/trunk/; revision=2007 2009-03-19 Murray Cumming Removed this class. 2009-03-19 Murray Cumming * glom/bakery/Makefile.am: * glom/bakery/AppInstanceManager.[h|cc]: Removed this class. * glom/application.cc: * glom/bakery/App.cc: * glom/bakery/App.h: * glom/bakery/App_Gtk.cc: * glom/bakery/App_Gtk.h: * glom/bakery/App_WithDoc.cc: * glom/bakery/App_WithDoc_Gtk.cc: Removed management of multiple instances. Each Glom window is now isolated. That is necessary anyway because we have been storing a global application pointer separately anyway for a while now, which broke this. This would need to use some single-instance DBus thing anyway to make it work properly between processes (started from the Application menu.) That would be nice. Then we could really check if a file is already open, like gedit does. svn path=/trunk/; revision=2006 2009-03-19 Murray Cumming Fixed compiler warnings. Used GLOM defines instead of BAKERY defines. 2009-03-19 Murray Cumming * glom/bakery/*.[h|cc]: Fixed compiler warnings. Used GLOM defines instead of BAKERY defines. * po/POTFILES.in: Added the bakery files. svn path=/trunk/; revision=2005 2009-03-18 Murray Cumming Correct the libgdamm and libgda versions needed. 2009-03-18 Murray Cumming * configure.ac: Correct the libgdamm and libgda versions needed. svn path=/trunk/; revision=2004 2009-03-18 Murray Cumming Include config.h using <> instead of , to be consistent with elsewhere. 2009-03-18 Murray Cumming * glom/application.cc: * glom/bakery/App_Gtk.cc: * glom/bakery/App_WithDoc.cc: * glom/bakery/App_WithDoc_Gtk.cc: * glom/bakery/Dialog_OfferSave.cc: * glom/bakery/GtkDialogs.cc: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/data_structure/iso_codes.cc: * glom/libglom/document/bakery/Document.cc: * glom/libglom/document/bakery/view/View.h: * glom/main.cc: * glom/translation/window_translations.cc: Include config.h using <> instead of , to be consistent with elsewhere. svn path=/trunk/; revision=2002 2009-03-17 Murray Cumming check_postgres_gda_client_is_available_with_warning(): Actually check. 2009-03-17 Murray Cumming * glom/libglom/connectionpool_backends/postgres.cc: check_postgres_gda_client_is_available_with_warning(): Actually check. This was commented out because the libgda-4.0 API for it is unpleasant. svn path=/trunk/; revision=2000 2009-03-17 Murray Cumming 2009-03-17 Murray Cumming Remove the libglademm dependency. 2009-03-17 Murray Cumming * configure.ac: Remove the libglademm dependency. * glom/glom.glade: * glom/glom_developer.glade: Resaved as GtkBuilder format in glade-3. * glom/Makefile.am: * glom/variablesmap.[h|cc]: Copied this from libglademm and adapted it to Gtk::Builder. * glom/*.[h|cc]: Use Gtk::Builder instead of Gnome::Glade::Xml. The changes are mostly just search/replace. svn path=/trunk/; revision=1998 2009-03-17 Murray Cumming Remove bakery dependency. 2009-03-17 Murray Cumming * configure.ac: Remove bakery dependency. * glom/Makefile.am: * glom/bakery/: Added copies of the Bakery/App files. * glom/libglom/document/bakery/: Added copies of the Bakery Document and View files. This allows us to change the Bakery ABI when we need to. We already do unusually hacky things with Bakery so this is reasonable. svn path=/trunk/; revision=1997 2009-03-17 Murray Cumming Remove the reimplementation of Gtk::ComboBoxText now that we can use gtkmm 2009-03-17 Murray Cumming * glom/utility_widgets/combo_textglade.[h|cc]: Remove the reimplementation of Gtk::ComboBoxText now that we can use gtkmm 2.14. * glom/frame_glom.cc: * glom/libglom/data_structure/glomconversions.cc: * glom/mode_design/dialog_add_related_table.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/script_library/dialog_script_library.cc: * glom/mode_design/users/dialog_users_list.cc: Adapted. * glom/libglom/document/document_glom.cc: save_before: Remove another gtkmm 2.10 workaround. svn path=/trunk/; revision=1996 2009-03-17 Murray Cumming Depend on gtkmm 2.14 rather than gtkmm 2.10. 2009-03-17 Murray Cumming * configure.ac: Depend on gtkmm 2.14 rather than gtkmm 2.10. * glom/Makefile.am: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/calendar/: Remove copy of Gtk::Calendar. * glom/mode_data/box_data_calendar_related.h: Adapted. * glom/application.cc:: init_toolbars(), add_ui_from_string(): * glom/dialog_existing_or_new.cc: constructor, get_uri(), existing_icon_data_func(): * glom/dialog_existing_or_new.h * glom/layout_item_dialogs/box_formatting.cc: get_formatting(): * glom/libglom/data_structure/print_layout.cc: Constructor, operator=(): * glom/mode_design/print_layouts/canvas_print_layout.cc: set_print_layout(): * glom/mode_design/print_layouts/window_print_layout_edit.cc: get_icon_for_toolbar_item(), on_canvas_drag_drop(), on_canvas_drag_motion(): * glom/xsl_utils.cc: transform_and_open(): Remove workarounds for gtkmm 2.10 now that we can depend on gtkmm 2.14. This is not really necessary but it's nice to clean up the code. svn path=/trunk/; revision=1995 2009-03-17 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1994 2009-03-16 Mario Blättermann Updated German translation svn path=/trunk/; revision=1993 2009-03-16 Murray Cumming Increased version svn path=/trunk/; revision=1991 2009-03-16 Murray Cumming Check for GTK+ 2.14, not GTK+ 2.16, because the GtkCalendar details_func 2009-03-16 Murray Cumming * glom/utility_widgets/calendar/glomcalendar.[h|cc]: * glom/utility_widgets/calendar/glomgtkcalendar.[h|c]: Check for GTK+ 2.14, not GTK+ 2.16, because the GtkCalendar details_func API is in 2.14. Correct a typedef to fix the build in that case. svn path=/trunk/; revision=1990 2009-03-16 Armin Burgmeier Converted a C++ comment to a C comment, to avoid a warning. 2009-03-16 Armin Burgmeier * glom/libglom/gst-package.c: Converted a C++ comment to a C comment, to avoid a warning. * glom/main.cc (main): Fixed the build on Linux, which was broken since my last commit. svn path=/trunk/; revision=1989 2009-03-13 Armin Burgmeier svn path=/trunk/; revision=1988 svn path=/trunk/; revision=1988 2009-03-13 Murray Cumming Minor formatting corrections. svn path=/trunk/; revision=1987 2009-03-13 Murray Cumming Do not warn about a false failure. 2009-03-13 Murray Cumming * glom/mode_design/fields/box_db_table_definition. field_has_null_values(): Do not warn about a false failure. svn path=/trunk/; revision=1986 2009-03-13 Murray Cumming connect(): Update the meta store for just the data types and the table 2009-03-13 Murray Cumming * glom/libglom/connectionpool.cc: connect(): Update the meta store for just the data types and the table names, instead of everything. This is slightly faster. This needs libgdamm from svn. More about the libgda meta store speed here: http://bugzilla.gnome.org/show_bug.cgi?id=575235 svn path=/trunk/; revision=1985 2009-03-13 Murray Cumming Avoid an extra update_meta_store() when exceptions are disabled. 2009-03-13 Murray Cumming * glom/libglom/data_structure/fieldtypes.cc: Avoid an extra update_meta_store() when exceptions are disabled. * glom/navigation/box_tables.cc: fill_table_row(): Avoid a crash when the TableInfo is null. svn path=/trunk/; revision=1984 2009-03-13 Murray Cumming Fix the build when GLOM_CONNECTION_DEBUG is defined. 2009-03-13 Murray Cumming * glom/libglom/connectionpool_backends/postgres.cc: Fix the build when GLOM_CONNECTION_DEBUG is defined. svn path=/trunk/; revision=1983 2009-03-13 Andre Klapper Updated Czech translation by Pavel MlÄoch and Lucas Lommer. 2009-03-13 Andre Klapper * cs.po: Updated Czech translation by Pavel MlÄoch and Lucas Lommer. svn path=/trunk/; revision=1982 2009-03-12 Murray Cumming Do not install some headers that are for API that I do not really want 2009-03-12 Murray Cumming * glom/libglom/Makefile.am: Do not install some headers that are for API that I do not really want other people to use. svn path=/trunk/; revision=1981 2009-03-12 Murray Cumming Copy a newer version from libegg, which already fixed the use of 2009-03-12 Murray Cumming * glom/utility_widgets/adddel/eggcolumnchooser/: Copy a newer version from libegg, which already fixed the use of deprecated GTK+ macros. * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: child_type_vfunc(): Use GType instead of deprecated GtkType. This mostly fixes bug #575021 (André Klapper). svn path=/trunk/; revision=1980 2009-03-12 Murray Cumming Rename to configure.ac, because configure.in is deprecated by recent 2009-03-12 Murray Cumming * configure.in: Rename to configure.ac, because configure.in is deprecated by recent autotools. svn path=/trunk/; revision=1979 2009-03-12 Armin Burgmeier Added config.h to AC_CONFIG_FILES, so that we create two config files: 2009-03-12 Armin Burgmeier * configure.in: Added config.h to AC_CONFIG_FILES, so that we create two config files: config.h with all definitions, and libglom_config.h which contains only definitions prefixed with GLOM_ to be installed. This means header files cannot use non-prefixed definitions. * glom/libglom/libglom_config.h.in: New file containing the definitions to be installed. * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/data_structure/iso_codes.cc: * glom/translation/window_translations.cc: * glom/utility_widgets/calendar/glomgtkcalendar.h: * glom/utility_widgets/calendar/glomgtkcalendar.c: * glom/application.cc: * glom/main.cc: Adapt the code by including config.h instead of libglom_config.h. svn path=/trunk/; revision=1978 2009-03-10 Murray Cumming Increased version. svn path=/trunk/; revision=1977 2009-03-10 Armin Burgmeier Only install the postgres and sqlite libgda provider, and not all the 2009-03-10 Armin Burgmeier * win32/build_installer: Only install the postgres and sqlite libgda provider, and not all the others. This prevents libgda from trying to load them, and fail doing so with a user-visible message about some DLLs not being found. svn path=/trunk/; revision=1976 2009-03-10 Armin Burgmeier Made reports work on Windows, by using Glib::get_tmp_dir() instead of 2009-03-10 Armin Burgmeier * glom/xsl_utils.cc: Made reports work on Windows, by using Glib::get_tmp_dir() instead of "/tmp" and ShellExecute instead of g_app_info_launch_default_for_uri(), for which file:// URIs don't seem to be supported on Windows. * win32/build_installer: Don't ship libdb47.dll anymore, as this is no longer required with libgda 3.99.13. svn path=/trunk/; revision=1975 2009-03-09 Claude Paroz Updated French translation by Yannick Tailliez and Stéphane Raimbault. 2009-03-09 Claude Paroz * fr.po: Updated French translation by Yannick Tailliez and Stéphane Raimbault. svn path=/trunk/; revision=1974 2009-03-09 Claude Paroz Add a translator comment. Bug #574672. 2009-03-09 Claude Paroz * glom/mode_data/dialog_layout_details.cc: Add a translator comment. Bug #574672. svn path=/trunk/; revision=1973 2009-03-09 Murray Cumming Require the latest (from svn, not yet in a tarball) version of libgda, 2009-03-09 Murray Cumming * configure.in: Require the latest (from svn, not yet in a tarball) version of libgda, needed by the images in the example files. svn path=/trunk/; revision=1972 2009-03-09 Jonh Wendell Updated Brazilian Portuguese translation by Daniel S. Koda and myself. 2009-03-09 Jonh Wendell * pt_BR.po: Updated Brazilian Portuguese translation by Daniel S. Koda and myself. svn path=/trunk/; revision=1971 2009-03-09 Armin Burgmeier svn path=/trunk/; revision=1970 svn path=/trunk/; revision=1970 2009-03-09 Murray Cumming HostingMode: Declare all enum values regardless of what is enabled, to 2009-03-09 Murray Cumming * glom/libglom/document/document_glom.h: HostingMode: Declare all enum values regardless of what is enabled, to avoid ABI confusion and to maybe allow us to say that some are not supported at runtime. svn path=/trunk/; revision=1969 2009-03-08 Stéphane Raimbault sanity_check_date_text_representation_uses_4_digit_years(): Fix a typo in 2009-03-08 Stéphane Raimbault * glom/libglom/data_structure/glomconversions.cc: sanity_check_date_text_representation_uses_4_digit_years(): Fix a typo in the word representation of the error message. svn path=/trunk/; revision=1968 2009-03-08 Stéphane Raimbault Missing po/LINGUAS file from previous commit. * po/LINGUAS: new file. Fixes #569721 svn path=/trunk/; revision=1967 2009-03-08 Stéphane Raimbault Changes made to reflect new po linguas setup including removing 2009-03-08 Stéphane Raimbault * configure.in: Changes made to reflect new po linguas setup including removing ALL_LINGUAS (now in new file LINGUAS). * po/LINGUAS: new file. Fixes #569721 svn path=/trunk/; revision=1966 2009-03-07 Mario Blättermann Updated German translation svn path=/trunk/; revision=1965 2009-03-06 Murray Cumming load_after(): Added an ifdef to fix the client-only sqlite build. 2009-03-06 Murray Cumming * glom/libglom/document/document_glom.cc: load_after(): Added an ifdef to fix the client-only sqlite build. svn path=/trunk/; revision=1964 2009-03-06 Murray Cumming connection_request_password_and_choose_new_database_name(): Added an ifdef 2009-03-06 Murray Cumming * glom/frame_glom.cc: connection_request_password_and_choose_new_database_name(): Added an ifdef to fix the client-only postgres build. svn path=/trunk/; revision=1963 2009-03-06 Murray Cumming Fix build. svn path=/trunk/; revision=1962 2009-03-06 Murray Cumming get_suitable_record_to_view_details(): Use the correct primary key of the 2009-03-06 Murray Cumming * glom/mode_data/box_data_portal.cc: get_suitable_record_to_view_details(): Use the correct primary key of the related table. This fixes navigation on the Small Business Example, on the invoice lines, which goes to the product record. svn path=/trunk/; revision=1961 2009-03-06 Murray Cumming Resaved these, because libgda corrected the string format for binary data 2009-03-06 Murray Cumming * examples/example_lesson_planner.glom: * examples/example_project_manager.glom: * examples/example_smallbusiness.glom: Resaved these, because libgda corrected the string format for binary data (images). libgda also fixed the crash when parsing that string, as used in from_file_format(). svn path=/trunk/; revision=1960 2009-03-05 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1959 2009-03-05 Murray Cumming from_file_format(): Add some checks. 2009-03-05 Murray Cumming * glom/libglom/data_structure/field.cc: from_file_format(): Add some checks. svn path=/trunk/; revision=1958 2009-03-04 Murray Cumming oops svn path=/trunk/; revision=1957 2009-03-04 Murray Cumming Generate libglom/libglom_config.h instead of config.h, so we can install 2009-03-04 Murray Cumming * configure.in: Generate libglom/libglom_config.h instead of config.h, so we can install it and use it in our public headers. * glom/libglom/Makefile.am: Install libglom_config.h. * glom/libglom/glom-1.0.pc.in: Correct the shared library name. * *.[h|cc]: Include libglom/libglom_config.h instead of config.h. svn path=/trunk/; revision=1956 2009-03-04 Murray Cumming Generate libglom/libglom_config.h instead of config.h, so we can install 2009-03-04 Murray Cumming * configure.in: Generate libglom/libglom_config.h instead of config.h, so we can install it and use it in our public headers. * glom/libglom/Makefile.am: Install libglom_config.h. * glom/libglom/glom-1.0.pc.in: Correct the shared library name. * *.[h|cc]: Include libglom/libglom_config.h instead of config.h. svn path=/trunk/; revision=1955 2009-03-04 Murray Cumming Ran autoupdate on this so it does things as per what is currently correct. 2009-03-04 Murray Cumming * configure.in: Ran autoupdate on this so it does things as per what is currently correct. svn path=/trunk/; revision=1954 2009-03-03 Murray Cumming Link to the correct library name for test_document.cc List the tables in 2009-03-04 Murray Cumming * glom/libglom/Makefile.am: Link to the correct library name for test_document.cc * glom/libglom/test_document.cc: List the tables in the document. svn path=/trunk/; revision=1953 2009-03-03 Armin Burgmeier Fixed another misplaced else which prevented postgresql files from being 2009-03-03 Armin Burgmeier * glom/libglom/document/document_glom.cc (load_after): Fixed another misplaced else which prevented postgresql files from being opened when support for both postgresql and sqlite was enabled. * glom/libglom/document/document_glom.h: Changed DEFAULT_HOSTED to HOSTING_MODE_POSTGRES_SELF if postgresql is enabled. * glom/application.cc (constructor): Use DEFAULT_HOSTED to initialize m_ui_save_extra_newdb_hosting_mode, so that we don't need an #ifdef. svn path=/trunk/; revision=1952 2009-03-03 Murray Cumming Added missing file. svn path=/trunk/; revision=1951 2009-03-03 Murray Cumming Include all libglom headers via libglom/ instead of glom/libglom so it 2009-03-03 Murray Cumming * *.[h|cc]: Include all libglom headers via libglom/ instead of glom/libglom so it works from outside, with the path to the installed headers, from pkg-config. * All Makefile.am files: Add -I@top_srcdir@/glom to AM_CPPFLAGS. The repetition is awful. We should avoid that somehow. svn path=/trunk/; revision=1950 2009-03-03 Murray Cumming Added and installed pkg-config file. 2009-03-03 Murray Cumming * configure.in: * glom/libglom/Makefile.am: * glom/libglom/glom-1.0.pc.in: Added and installed pkg-config file. * glom/Makefile.am: * glom/libglom/data_structure/Makefile.am: * glom/libglom/data_structure/layout/Makefile.am: * glom/libglom/data_structure/layout/report_parts/Makefile.am: * glom/libglom/document/Makefile.am: * glom/python_embed/python_module/Makefile.am: * regression_tests/Makefile.am: Change libglom to libglom-1.0 so we can use proper API versioning. Install the headers. * glom/libglom/document/document_glom.cc: Use std::auto_ptr<> to avoid instantiating Bakery::BusyCursor if no parent window was set, to avoid the need to initialize gtkmm/GTK+. svn path=/trunk/; revision=1949 2009-03-03 Murray Cumming Add some SWIG ifdefs to improve the Java wrapping output with swig. 2009-03-03 Murray Cumming * glom/libglom/document/document_glom.h: Add some SWIG ifdefs to improve the Java wrapping output with swig. svn path=/trunk/; revision=1948 2009-03-03 Murray Cumming Parser::on_start_element(): Call xmlStopParser() to avoid unnecessary 2009-03-03 Murray Cumming * glom/dialog_existing_or_new.cc: Parser::on_start_element(): Call xmlStopParser() to avoid unnecessary extra parsing, fixing a TODO. svn path=/trunk/; revision=1947 2009-03-03 Murray Cumming Renamed the *_HOSTED enum values to use a prefix. Moved the View tyepdefs 2009-03-03 Murray Cumming * glom/libglom/document/Makefile.am: * glom/libglom/document/document_glom.[h|cc]: Renamed the *_HOSTED enum values to use a prefix. Moved the View tyepdefs into a view.h file. * glom/application.cc: * glom/base_db.h: * glom/dialog_connection.cc: * glom/frame_glom.cc: * glom/layout_item_dialogs/dialog_field_layout.h: * glom/mode_design/dialog_design.h: * glom/relationships_overview/dialog_relationships_overview.h: * glom/translation/dialog_identify_original.h: * glom/translation/window_translations.[h|cc]: * glom/utility_widgets/datawidget.h: * glom/utility_widgets/filechooserdialog_saveextras.cc: Adapted. svn path=/trunk/; revision=1946 2009-03-02 Armin Burgmeier Call connectionpool's startup() also if SQLite is disabled. Bug #573799. 2009-03-02 Armin Burgmeier * glom/frame_glom.cc: (connection_request_password_and_choose_new_database_name): Call connectionpool's startup() also if SQLite is disabled. Bug #573799. svn path=/trunk/; revision=1945 2009-03-02 Murray Cumming Changed many protected to private to make the API clearer. This is 2009-03-02 Murray Cumming * Many .h files: Changed many protected to private to make the API clearer. This is particularly important for libglom, as I start thinking of wrapping the API for Java/Web. svn path=/trunk/; revision=1944 2009-03-02 Murray Cumming Added an --enable-postgresql option, so we can have embedded builds that 2009-03-02 Murray Cumming * configure.in: Added an --enable-postgresql option, so we can have embedded builds that only use SQLite. Disable SQLite by default. * glom/utility_widgets/filechooserdialog_saveextras.[h|cc]: Don't mention the backend names if only SQLite is disabled, to avoid confronting people with unnecessary technicalese. * glom/application.cc: * glom/dialog_connection.cc: * glom/frame_glom.cc: * glom/libglom/connectionpool_backends/Makefile.am: * glom/libglom/connectionpool_backends/postgres.h: * glom/libglom/connectionpool_backends/postgres_central.[h|cc]: * glom/libglom/connectionpool_backends/sqlite.h: * glom/libglom/data_structure/glomconversions.h: * glom/libglom/document/document_glom.[h|cc]: * glom/libglom/gst-package.c: * glom/libglom/test_connectionpool.cc: * glom/main.cc: Added ifdefs to allow builds with -enable-postgresql=no. * glom/dialog_import_csv.cc: Replace gettext() with _(). svn path=/trunk/; revision=1943 2009-03-01 Murray Cumming Increased version. svn path=/trunk/; revision=1942 2009-02-27 Armin Burgmeier When creating a new self-hosting postgres database, then store the port it 2009-02-27 Armin Burgmeier * glom/frame_glom.cc: (connection_request_password_and_choose_new_database_name): When creating a new self-hosting postgres database, then store the port it uses within the document, so that remote connections (using browse network) can connect to the newly created database. Bug #572982. svn path=/trunk/; revision=1941 2009-02-27 Armin Burgmeier Add newly added field into document before refreshing m_vecFields, so that 2009-02-27 Armin Burgmeier * glom/mode_design/fields/box_db_table_definition.cc (on_adddel_add): Add newly added field into document before refreshing m_vecFields, so that Base_DB::get_fields_for_table() has an up-to-date document. This fixes changing newly added fields with SQLite. * configure.in: Fixed a typo, which caused libgda-sqlite-4.0 not being required even when SQLite support was enabled. svn path=/trunk/; revision=1940 2009-02-26 Murray Cumming Mark version in ChangeLog. svn path=/trunk/; revision=1939 2009-02-26 Murray Cumming Increase version svn path=/trunk/; revision=1938 2009-02-25 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1937 2009-02-24 Murray Cumming on_size_allocate(): Change an accidental += to the = that it should be, to 2009-02-24 Murray Cumming * glom/utility_widgets/flowtable.cc: on_size_allocate(): Change an accidental += to the = that it should be, to stop columns getting increasingly large amounts of extra width when there are >2 columns. Bug #539369 (maximiliano) svn path=/trunk/; revision=1934 2009-02-24 Armin Burgmeier Only reset m_port to zero if m_try_other_ports is true. Otherwise, a 2009-02-24 Armin Burgmeier * glom/libglom/connectionpool_backends/postgres_central.cc (set_host): Only reset m_port to zero if m_try_other_ports is true. Otherwise, a specific port has already been set by the user. (connect): Compare m_port to 0, not port, which is a Glib::ustring. This fixes a warning about g_utf8_collate's argument being NULL, and fixes connection to a remote postgres server advertized via networked glom. svn path=/trunk/; revision=1933 2009-02-24 Armin Burgmeier Moved the ConnectionPool backend base class into a new file in the 2009-02-24 Armin Burgmeier * glom/libglom/connectionpool_backends/backend.h: * glom/libglom/connectionpool_backends/backend.cc: Moved the ConnectionPool backend base class into a new file in the connectionpool_backends subdirectory. * glom/libglom/connectionpool_backends/Makefile.am: Add it to the build. * glom/libglom/connectionpool_backends/postgres.h: * glom/libglom/connectionpool_backends/sqlite.h: * glom/libglom/connectionpool_backends/sqlite.cc: * glom/libglom/connectionpool.h: * glom/libglom/connectionpool.cc: * glom/libglom/test_connectionpool.cc: * glom/dialog_connection.cc: * glom/frame_glom.cc: Adapt. svn path=/trunk/; revision=1932 2009-02-24 Armin Burgmeier Added a get_string_find_operator() virtual method to 2009-02-24 Armin Burgmeier * glom/libglom/connectionpool.h: * glom/libglom/connectionpool.cc: Added a get_string_find_operator() virtual method to ConnectionPoolBackend, and a similar method to ConnectionPool which simply queries its backend. * glom/libglom/connectionpool_backends/sqlite.h: * glom/libglom/connectionpool_backends/postgres.h: Implement the new virtual method appropriately. * glom/libglom/data_structure/field.cc (sql_find_operator): Use the get_string_find_operator() method of the connectionpool backend in case the field's type is TYPE_TEXT. This fixes Find Mode with SQLite. Bug #570401. I wonder whether libgda can generate a case-insensitive string comparison, which would make this easier for us. svn path=/trunk/; revision=1931 2009-02-24 Armin Burgmeier Added an --enable-sqlite configure option, which is enabled by default. 2009-02-24 Armin Burgmeier * configure.in: Added an --enable-sqlite configure option, which is enabled by default. * glom/libglom/connectionpool_backends/sqlite.h: #error if this file is included with SQLite support disabled. Mostly meant as a debugging aid. * glom/libglom/connectionpool_backends/Makefile.am: Don't build sqlite.cc in case SQLite support is disabled. * glom/libglom/document/document_glom.h: * glom/libglom/document/document_glom.cc: Don't declare SQLITE_HOSTED hosting mode if SQLite support is disabled, and refuse to open files with unknown hosting mode instead of falling back to postgres central. * glom/utility_widgets/filechooserdialog_saveextras.h: * glom/utility_widgets/filechooserdialog_saveextras.cc: Don't show the option to create a SQLite hosted file in the GUI if SQLite support is disabled. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Removed a superfluous include. * glom/frame_glom.cc: * glom/application.cc: #ifdef-out code to create a SQLite connectionpool backend if SQLite support is disabled, as well as a few related checks. svn path=/trunk/; revision=1930 2009-02-24 Armin Burgmeier Keep non-NULL constraint of columns when recreating table. 2009-02-24 Armin Burgmeier * glom/libglom/connectionpool_backends/sqlite.cc: Keep non-NULL constraint of columns when recreating table. svn path=/trunk/; revision=1929 2009-02-23 David King on_menu_file_import(): Add CSV mime-type filter to import dialog. Bug 2009-02-23 David King * glom/frame_glom.cc: on_menu_file_import(): Add CSV mime-type filter to import dialog. Bug #572702 svn path=/trunk/; revision=1928 2009-02-23 Murray Cumming Removed another debug output. svn path=/trunk/; revision=1927 2009-02-23 Armin Burgmeier Clear m_refListStore if in case no column types are set. This allows 2009-02-23 Armin Burgmeier * glom/utility_widgets/db_adddel/db_adddel.cc (construct_specified_columns): Clear m_refListStore if in case no column types are set. This allows dropping the reference to the GDA DataModel by setting an empty table name on the AddDel. * glom/frame_glom.h: * glom/frame_glom.cc: Added show_table_allow_empty() which allows the table name to be empty, in which case no table is shown, and show_no_table() as a shortcut for this case. Show an empty table before opening the fields editing dialog, so that no references to the database are used anymore. SQLite requires this to be able to drop the old table when changing fields. svn path=/trunk/; revision=1926 2009-02-23 Murray Cumming Removed debug output. svn path=/trunk/; revision=1925 2009-02-23 Armin Burgmeier Whitespace corrections svn path=/trunk/; revision=1924 2009-02-22 Murray Cumming offer_notebook(): Move the dialog_notebook window into 2009-02-22 Murray Cumming * glom/glom.glade, glom_developer.glade: * glom/base_db.cc: offer_notebook(): Move the dialog_notebook window into glom_developer.glade because it is only used in developer mode. svn path=/trunk/; revision=1923 2009-02-22 Murray Cumming Various minor fixes to avoid minor compiler warnings. 2009-02-22 Murray Cumming * Various minor fixes to avoid minor compiler warnings. svn path=/trunk/; revision=1922 2009-02-22 Murray Cumming get_text_for_gda_value(): Avoid a warning about no return value. 2009-02-22 Murray Cumming * glom/libglom/data_structure/glomconversions.cc: get_text_for_gda_value(): Avoid a warning about no return value. svn path=/trunk/; revision=1921 2009-02-22 Armin Burgmeier Don't leak the Gtk::EventBox. 2009-02-22 Armin Burgmeier * glom/mode_data/flowtablewithfields.cc (add_field_at_position): Don't leak the Gtk::EventBox. svn path=/trunk/; revision=1920 2009-02-21 Murray Cumming Fixed typo. svn path=/trunk/; revision=1919 2009-02-21 Murray Cumming Resaved with glade-3. Recent versions of glade-3 are much better at 2009-02-21 Murray Cumming * glom/glom_developer.glade: Resaved with glade-3. Recent versions of glade-3 are much better at converting from glade-2. I just had to hand-add the GtkSourceView widgets back. Bug #567470 svn path=/trunk/; revision=1918 2009-02-21 Murray Cumming Resaved with glade-3. Recent versions of glade-3 are much better at 2009-02-21 Murray Cumming * glom/glom_developer.glade: Resaved with glade-3. Recent versions of glade-3 are much better at converting from glade-2. I just had to hand-add the GtkSourceView widgets back. svn path=/trunk/; revision=1917 2009-02-21 Murray Cumming Comment out debug output that is behaving strangely. svn path=/trunk/; revision=1916 2009-02-20 Murray Cumming glom/libglom/connectionpool_backends/postgres_central.cc Added ifdefs to 2009-02-20 Murray Cumming * glom/application.cc: * glom/base_db.[h|cc]: * glom/dialog_connection.cc: * glom/frame_glom.cc: * glom/libglom/connectionpool.[h|cc]: * glom/libglom/connectionpool_backends/postgres_central.cc * glom/navigation/box_tables.[h|cc]: Added ifdefs to fix the build with --enable-client-only. svn path=/trunk/; revision=1915 2009-02-20 Murray Cumming get_current_privs(): Cache the priviliges for each table for 30 seconds, 2009-02-20 Murray Cumming * glom/glom_privs[h|cc]: get_current_privs(): Cache the priviliges for each table for 30 seconds, to avoid unnecessary repetitive groups queries to the database. This seems to avoid about 5 out of 6 requests, so it should be faster. Bug #567473 svn path=/trunk/; revision=1914 2009-02-20 Murray Cumming Removed a generated file svn path=/trunk/; revision=1913 2009-02-20 Murray Cumming Use the postgres executable name instead of the deprecated postmaster 2009-02-20 Murray Cumming * configure.in: * glom/libglom/connectionpool_backends/postgres_self.cc: Use the postgres executable name instead of the deprecated postmaster executable. Everything probably has that now. Bug # 525108 svn path=/trunk/; revision=1912 2009-02-20 Murray Cumming Improved ChangeLog svn path=/trunk/; revision=1911 2009-02-20 Murray Cumming Constructor: Show the Open button, (but not Find) for related fields that 2009-02-20 Murray Cumming * glom/utlity_widgets/datawidget.cc: Constructor: Show the Open button, (but not Find) for related fields that are primary keys, so we can navigate to that record. * glom/mode_data/box_data_details.cc: on_flowtable_field_open_details_requested(): Navigate to the appropriate record in the appropriate table for this type of Open button. * glom/base_db.cc: fill_full_field_details(): Avoid crashes. svn path=/trunk/; revision=1910 2009-02-20 Murray Cumming get_field_used_in_relationship_to_one(): Make this take a LayoutItem_Field 2009-02-20 Murray Cumming * glom/libglom/document/document_glom.[h|cc]: get_field_used_in_relationship_to_one(): Make this take a LayoutItem_Field instead of just a field name. * glom/utlity_widgets/datawidget.cc: Constructor: adapt, so we add Open and Find buttons for related fields too when appropriate. * glom/base_db.cc: Adapt to API change. svn path=/trunk/; revision=1909 2009-02-18 Murray Cumming Added a TODO. svn path=/trunk/; revision=1908 2009-02-18 Murray Cumming from_file_format(): Adjusted for a libgda API change in 2009-02-18 Murray Cumming * glom/libglom/data_structure/field.cc: from_file_format(): Adjusted for a libgda API change in gda_string_to_binary(). svn path=/trunk/; revision=1907 2009-02-18 Armin Burgmeier Reset the default value if the Glom type is changed. The old default value 2009-02-18 Armin Burgmeier * glom/libglom/data_structure/field.cc (set_glom_type): Reset the default value if the Glom type is changed. The old default value probably doesn't make sense for the new type. This fixes a warning when changing a field's type from text to numerical. (set_default_value): Verify that the new default value is compatible with the field's glom type. (set_field_info): Verify that the default value of the new field info is compatible with the field's glom type. * glom/mode_design/fields/box_db_table_definition.cc (get_field_definition): When changing the field info's GType, make sure its default value matches the new GType, or reset it if not. * glom/libglom/document/document_glom.cc (load_after): Set a field's default value after having set the glom type, so that the checks introduced above don't fail. svn path=/trunk/; revision=1906 2009-02-18 Murray Cumming sql(value, format): Replace this with sql(value, connection). Use 2009-02-18 Murray Cumming * glom/libglom/data_structure/field.[h|cc[: sql(value, format): Replace this with sql(value, connection). Use Gda::DataHolder::get_sql_from_value(), using the connection to get the DataHolder. Remove the nasty Postgres escaping code, which is now unnecessary. There is now no code in Glom to do escaping or unescaping - we use libgda functions instead. sql(value): Use the active connection. * glom/libglom/connectionpool_backends/postgres.cc: change_columns(): * glom/libglom/connectionpool_backends/sqlite.cc: recreate_table(): Adapted, though these can probably just call sql(value), using the active connection. * glom/base_db.[h|cc]: get_connection(): Make this static because it can be. svn path=/trunk/; revision=1905 2009-02-17 Murray Cumming Added static versions of from_file_format() and to_file_format(), taking 2009-02-17 Murray Cumming * glom/libglom/data_structure/field.[h|cc]: Added static versions of from_file_format() and to_file_format(), taking the field type, for use in document, though we can probably avoid that. * glom/libglom/data_structure/glomconversions.[h|cc]: * glom/libglom/document/document_glom.[h|cc]: Remove support for the deprecated one-big-string example_rows format. Store the example rows as a vector of vector of Values, instead of strings. This avoids extra string parsing, unescaping, etc. * glom/glom_document.dtd: Documented the change. * glom/frame_glom.[h|cc]: Added export_data_to_vector(). * glom/application.cc: on_menu_file_save_as_example(): Use the vector instead of a string. * glom/base_db.cc: insert_example_data(): Handle the vector instead of doing nasty string parsing. * examples/example_*.glom: Resaved in the new format. svn path=/trunk/; revision=1904 2009-02-16 Murray Cumming get_text_for_gda_value(), parse_value(): Use std::setprecision() to avoid 2009-02-16 Murray Cumming * glom/libglom/data_structure/glomconversions.cc: get_text_for_gda_value(), parse_value(): Use std::setprecision() to avoid showing the awkward scientific e notation, raising the limit from 7 digits to 15. We don't know how to avoid it always. Noticed by Arq. Maximiliano Meilán. svn path=/trunk/; revision=1902 2009-02-16 Armin Burgmeier Fixed various problems with field type changes. Before, often some or all 2009-02-16 Armin Burgmeier * glom/libglom/connectionpool_backends/sqlite.cc: Fixed various problems with field type changes. Before, often some or all of the records have been erased after certain changes (only from the view, not from the database). svn path=/trunk/; revision=1901 2009-02-16 Murray Cumming Renamed from_sql() to from_file_format(), without the sql_format 2009-02-10 Murray Cumming * glom/libglom/data_structure/field.[h|cc]: Renamed from_sql() to from_file_format(), without the sql_format parameter, to make it clearer. Added to_file_format(), which currently just calls sql() with the postgres format. * glom/data_structure/glomconversions.cc: Removed unused unescape_binary_data_sqlite(). * glom/base_db.cc: insert_example_data(): * glom/dialog_import_csv.cc: field_data_func(): * glom/dialog_import_csv_progress.cc: on_idle_import(): Adapt. * glom/frame_glom.cc: export_data_to_string(): Use to_file_format() instead of sql() to make it clearer. svn path=/trunk/; revision=1900 2009-02-16 Murray Cumming Increased version svn path=/trunk/; revision=1899 2009-02-15 Armin Burgmeier Use the GType from m_field_info instead of converting the glom type to a 2009-02-15 Armin Burgmeier * glom/libglom/data_structure/field.cc (get_gda_type_name): Use the GType from m_field_info instead of converting the glom type to a gda type, to take fallback types into account, as used by SQLite for numeric values. (get_holder): Use the passed value's type to initialize the holder type. For binary values, there can be a mismatch between the value type and the field type with SQLite. This is not optimal, but it works for now. svn path=/trunk/; revision=1898 2009-02-15 Armin Burgmeier Revert the changed value if set_field_value_in_database() throws a glib 2009-02-15 Armin Burgmeier * glom/mode_data/box_data_details.cc (on_flowtable_field_edited): Revert the changed value if set_field_value_in_database() throws a glib exception. svn path=/trunk/; revision=1897 2009-02-15 Armin Burgmeier Revert the changed value if set_field_value_in_database() throws an 2009-02-15 Armin Burgmeier * glom/utility_widgets/db_adddel/db_adddel.cc (user_changed): Revert the changed value if set_field_value_in_database() throws an exception. svn path=/trunk/; revision=1896 2009-02-15 Armin Burgmeier Convert existing values explicitely via the date() and time() SQLite 2009-02-15 Armin Burgmeier * glom/libglom/connectionpool_backends/sqlite.cc: Convert existing values explicitely via the date() and time() SQLite functions when converting existing values to date or time. This fixes all rows being erased when changing a column to date or time. svn path=/trunk/; revision=1895 2009-02-14 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1894 2009-02-12 Armin Burgmeier Check field's glom type directly instead of guessing the glom type from 2009-02-12 Armin Burgmeier * glom/mode_design/fields/box_db_table_definition.cc (check_field_change): Check field's glom type directly instead of guessing the glom type from its GType, which might produce a wrong result with some of the fallback types used with SQLite. * glom/libglom/connectionpool_backends/sqlite.cc (recreate_table): Don't crash if transaction rollback fails without the error variable being set. svn path=/trunk/; revision=1893 2009-02-10 Armin Burgmeier Support dropping and changing columns, though changing doesn't yet seem to 2009-02-10 Armin Burgmeier * glom/libglom/connectionpool_backends/sqlite.h: * glom/libglom/connectionpool_backends/sqlite.cc: Support dropping and changing columns, though changing doesn't yet seem to work reliably yet. svn path=/trunk/; revision=1891 2009-02-10 Armin Burgmeier Use get_value_type() to find out a value's not type, not get_g_type() 2009-02-10 Armin Burgmeier * glom/libglom/connectionpool_backends/sqlite.cc (recreate_table): Use get_value_type() to find out a value's not type, not get_g_type() which returns the GType the value stores if it's value type is GType. * glom/mode_design/fields/box_db_table_definition.cc (on_adddel_add): Don't call on_adddel_changed() just to store the field into the document, since on_adddel_changed() does a lot of unnecessary extra stuff such as calling change_columns() on the backend, which forces a whole table recreation with SQLite. svn path=/trunk/; revision=1890 2009-02-10 Murray Cumming insert_example_data(): Fixed my typo to fix the build. Sorry. 2009-02-10 Murray Cumming * glom/base_db.cc: insert_example_data(): Fixed my typo to fix the build. Sorry. svn path=/trunk/; revision=1889 2009-02-09 Murray Cumming get_gda_type(): Renamed to get_gda_type_name(). Removed get_gda_g_type() 2009-02-09 Murray Cumming * glom/libglom/data_structure/field.[h|cc]: get_gda_type(): Renamed to get_gda_type_name(). Removed get_gda_g_type() because we already have a static get_g_type_for_glom_type(). This gets rids of the nasty switch block. * glom/base_db.cc: insert_example_data(), get_lookup_value(), get_primary_key_is_in_foundset(): Adapted. svn path=/trunk/; revision=1888 2009-02-09 Armin Burgmeier Added set_server_operation_value(), create_server_operation() and 2009-02-09 Armin Burgmeier * glom/libglom/connectionpool.h: * glom/libglom/connectionpool.cc: Added set_server_operation_value(), create_server_operation() and perform_server_operation() convenience methods to connectionpool backend base class. * glom/libglom/connectionpool_backends/sqlite.h: * glom libglom/connectionpool_backends/sqlite.cc: Implemented table recreation, required for changing or dropping columns, or adding primary key columns. The glom type of newly added columns doesn't yet seem to be recognized correctly, though. svn path=/trunk/; revision=1887 2009-02-08 Murray Cumming constuctor/create(): Added a bool find_mode parameter and member variable. 2009-02-08 Murray Cumming * glom/utility_widgets/db_adddel/glom_db_treemodel.[h|cc]: constuctor/create(): Added a bool find_mode parameter and member variable. refresh_from_database(): Create a DataModelArray for find mode, with the appropriate column types. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Remove the awkward ListStore alternative model for find mode that I recently introduced, construct_specified_columns(): Instead just specify find_mode=true when creating the tree model. * glom/mode_data/box_data_list.cc: Simplify this code again accordingly. * glom/utility_widgets/db_adddel/Makefile.am: * glom/utility_widgets/db_adddel/treemodel_with_addrow.[h|cc]: * glom/utility_widgets/db_adddel/liststore_with_addrow.[h|cc]: * regression_tests/Makefile.am: * regression_tests/test_treemodel_dynamic_cast.cc: Removed these because they are no longer used. svn path=/trunk/; revision=1886 2009-02-08 Johannes Schmid New class to generate simple unique holder names 2009-02-08 Johannes Schmid * glom/libglom/data_structure/Makefile.am: * glom/libglom/data_structure/parameternamegenerator.cc: * glom/libglom/data_structure/parameternamegenerator.h: New class to generate simple unique holder names * glom/base_db.cc (insert_example_data): Use the new ParameterNameGenerator class svn path=/trunk/; revision=1885 2009-02-07 Murray Cumming Reverted unwanted change. svn path=/trunk/; revision=1884 2009-02-07 Murray Cumming get_field_value_is_unique(): Use the Field::get_holder(value) method 2009-02-07 Murray Cumming * glom/base_db.cc: get_field_value_is_unique(): Use the Field::get_holder(value) method overload instead of get_holder(), avoiding copying the Field and using Field::get_data(). * glom/libglom/data_structure/field.[h|cc]: Removed the get_holder(name) method overload because it is now not used. Removed get/set_data() and the member variable because they are now not used. svn path=/trunk/; revision=1883 2009-02-06 Murray Cumming get_table_names_from_database(): Comment out the checks for internal 2009-02-06 Murray Cumming * glom/base_db.cc: get_table_names_from_database(): Comment out the checks for internal tables, because that is now fixed in libgda. * glom/mode_data/box_data.[h|cc]: * glom/base_db_table_data.[h|cc]: Move refresh_related_fields() (which is virtual) and get_related_fields() down the hierarchy so that the override is also used by DbAddDel, so related fields are updated in the view on list views and related records. This really fixes bug #569722 (Johannes Schmid) svn path=/trunk/; revision=1881 2009-02-05 Murray Cumming Added a TODO_Performance hint for later. svn path=/trunk/; revision=1880 2009-02-05 Armin Burgmeier Added a clarifying comment on why we use a DataAccessWrapper. 2009-02-05 Armin Burgmeier * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Added a clarifying comment on why we use a DataAccessWrapper. svn path=/trunk/; revision=1879 2009-02-04 Armin Burgmeier :fill_values_if_necessary): Use a Gnome::Gda::DataModelWrapper to wrap the 2009-02-04 Armin Burgmeier * glom/utility_widgets/db_adddel/glom_db_treemodel.cc (DbTreeModelRow::fill_values_if_necessary): Use a Gnome::Gda::DataModelWrapper to wrap the resulting cursor-based data model. This avoids a special-case for SQLite. Requires libgda trunk. svn path=/trunk/; revision=1878 2009-02-03 Murray Cumming Mention the new self_hosted attribute. 2009-02-03 Murray Cumming * glom/glom_document.dtd: Mention the new self_hosted attribute. svn path=/trunk/; revision=1877 2009-02-03 Murray Cumming get_table_names_from_database(): Filter out some extra internal table 2009-02-03 Murray Cumming * glom/base_db.cc: get_table_names_from_database(): Filter out some extra internal table names which may be created/reported by newer versions of libgda. svn path=/trunk/; revision=1875 2009-02-02 Murray Cumming Added get_row_selected() virtual function, used in record_new() instead of 2009-02-02 Murray Cumming * glom/base_db_table_data.[h|cc]: Added get_row_selected() virtual function, used in record_new() instead of an always-null TreeModel::iterator. This lets lookups, default values, and calculated values be seen when adding new list records or related records. * glom/mode_data/box_data_list.[h|cc]: * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Added get_row_selected() overrides. This should fix bug #569722 (Johannes Schmid) svn path=/trunk/; revision=1873 2009-02-02 Murray Cumming query_execute_select(), query_execute(): When using --debug_sql, use 2009-02-02 Murray Cumming * glom/base_db.cc: query_execute_select(), query_execute(): When using --debug_sql, use Statement::to_sql() to show the actual SQL with actual values, though this does not seem to work for non-SELECT queries. * glom/mode_data/box_data.cc: refresh_related_fields(): Some extra error checking. svn path=/trunk/; revision=1872 2009-02-02 Murray Cumming 2009-02-02 Murray Cumming > * glom/base_db.cc: :set_field_value_in_database(): Correct a copy/paste typo that was probably introduced when switching to using parameters, so we now actually specify the primary key, so we really change the data in the database. svn path=/trunk/; revision=1871 2009-02-02 Murray Cumming Correct whitespace. svn path=/trunk/; revision=1870 2009-01-31 Johannes Schmid Reinit cancelled state and some more cleanups. Fixes #569721 – Glom 2009-01-31 Johannes Schmid * glom/application.cc (on_document_load()): Reinit cancelled state and some more cleanups. Fixes #569721 – Glom behaves strange when you cancel the new dialog svn path=/trunk/; revision=1869 2009-01-30 Murray Cumming Make the labels FILL and EXPAND so they really align left instead of 2009-01-30 Murray Cumming * glom/glom.glade: Make the labels FILL and EXPAND so they really align left instead of centering. This broke when I resaved with a newer glade-2. svn path=/trunk/; revision=1868 2009-01-30 Murray Cumming Added some TODO comments where we would like to use SQL parameters instead 2009-01-30 Murray Cumming Added some TODO comments where we would like to use SQL parameters instead of Field::sql(), if we can figure out how to do that for fragments of SQL, or how to refactor the code to parse the whole SQL query at once. svn path=/trunk/; revision=1867 2009-01-29 Johannes Schmid Move the rest of queries from sql() to use params where this made sense. 2009-01-29 Johannes Schmid * glom/base_db.cc: * glom/base_db_table_data.cc: * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_list_related.cc: Move the rest of queries from sql() to use params where this made sense. Some methods generate random sql that is executed elsewhere which means that they cannot use parameters themselves. I did not touch those. * glom/libglom/data_structure/field.cc: * glom/libglom/data_structure/field.h: Added get_holder(value, name) to avoid having to use temporary field to be able to use get_holder() and get_gda_holder_string() svn path=/trunk/; revision=1866 2009-01-29 Johannes Schmid Converted more queries to use parameters 2009-01-29 Johannes Schmid * glom/base_db.cc: * glom/base_db_table_data.cc: Converted more queries to use parameters svn path=/trunk/; revision=1865 2009-01-27 Murray Cumming auto_increment_insert_first_if_necessary(), 2009-01-27 Murray Cumming * glom/base_db.cc: auto_increment_insert_first_if_necessary(), get_next_auto_increment_value(), set_database_preferences(): Use the new templated Gda::Set::add_holder(), simplifying the code. svn path=/trunk/; revision=1864 2009-01-27 Murray Cumming Do not pass an empty Set to create_operation() because I added a method 2009-01-27 Murray Cumming * glom/libglom/connectionpool_backends/postgres.cc attempt_create_database(): Do not pass an empty Set to create_operation() because I added a method overload in libgdamm. svn path=/trunk/; revision=1863 2009-01-27 Johannes Schmid Fix updating of fields with was broken due to a stupid mistake 2009-01-27 Johannes Schmid * glom/base_db.cc (set_field_value_in_database): Fix updating of fields with was broken due to a stupid mistake svn path=/trunk/; revision=1862 2009-01-26 Murray Cumming get_fields_for_table_from_database(), 2009-01-26 Murray Cumming * glom/base_db.cc: get_fields_for_table_from_database(), auto_increment_insert_first_if_necessary(), get_next_auto_increment_value(), insert_example_data(): * glom/libglom/data_structure/field.cc: get_holder(): Adapt to my set_value()/set_value_as_value() changes in libgdamm to slightly simply the code. I guess that a better add_param() method could simplify it more. svn path=/trunk/; revision=1861 2009-01-26 Johannes Schmid Ported more queries to use parameters. query_execute_select() now accepts 2009-01-26 Johannes Schmid * glom/base_db.cc: * glom/base_db.h: Ported more queries to use parameters. query_execute_select() now accepts parameters. * glom/base_db_table_data.cc: * glom/dialog_database_preferences.cc: * glom/frame_glom.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_details.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/print_layouts/canvas_print_layout.cc: Removed parent_window argument from query_execute_select() call. * glom/libglom/data_structure/field.cc: * glom/libglom/data_structure/field.h: Added get_holder() und get_gda_holder_string() as conveniece methods svn path=/trunk/; revision=1860 2009-01-25 Johannes Schmid Some cosmetic changes to error messages and removed the reference() call 2009-01-25 Johannes Schmid * glom/base_db.cc: Some cosmetic changes to error messages and removed the reference() call that is obviously caused by a bug in the postgres provider. svn path=/trunk/; revision=1859 2009-01-24 Andre Klapper Updated German translation. 2009-01-24 Andre Klapper * de.po: Updated German translation. svn path=/trunk/; revision=1858 2009-01-24 Armin Burgmeier Added GdaBlob as a fallback type for GdaBinary, so that 2009-01-24 Armin Burgmeier * glom/libglom/data_structure/fieldtypes.cc (constructor): Added GdaBlob as a fallback type for GdaBinary, so that Field::set_field_info() sets the correct glom type if the GType is GDA_TYPE_BLOB. * glom/libglom/data_structure/glomconversions.cc (get_pixbuf_for_gda_value): Allow the value having type GDA_TYPE_BLOB, and handle this appropriately. These changes fix images in SQLite with libgda4, requiring libgda trunk. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc (refresh_from_database): Use STATEMENT_MODEL_RANDOM_ACCESS to create the data model when using SQLite, because of bug #567891. * glom/mode_design/fields/box_db_table_definition.cc (fill_field): Use the field's glom type directly, instead of guessing it from the field's GType. svn path=/trunk/; revision=1857 2009-01-23 Johannes Schmid Refactored query_execute() to be able to use additional parameters. 2009-01-23 Johannes Schmid * glom/base_db.cc: * glom/base_db.h: Refactored query_execute() to be able to use additional parameters. Changed insert_example_data() to use the new method. * glom/libglom/data_structure/field.cc: * glom/libglom/data_structure/field.h: Added get_gda_g_type() and made get_gda_type() should a wrapper around it * glom/base_db_table_data.cc: * glom/dialog_database_preferences.cc: * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/navigation/box_tables.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Removed the unused Gtk::Window* parameter from all query_execute() calls svn path=/trunk/; revision=1856 2009-01-22 Murray Cumming insert_example_data(): Catch exceptions as const. Remove spaces before (, 2009-01-22 Murray Cumming * glom/base_db.cc: insert_example_data(): Catch exceptions as const. Remove spaces before (, again. svn path=/trunk/; revision=1855 2009-01-22 Johannes Schmid Fixed insertion of example data by using variables in the sql statement 2009-01-22 Johannes Schmid * glom/base_db.cc (insert_example_data(), get_connection()): * glom/base_db.h: Fixed insertion of example data by using variables in the sql statement instead of inserting the data directly in the statement (which confuses the GdaSqlParser and is inefficient) * glom/libglom/data_structure/field.cc (get_gda_type()): * glom/libglom/data_structure/field.h: Added a method to get the gda GType of the field. This is necessary to prepare the sql statement so I would rather like to reuse get_sql_type(). Currntly investigating on gnome-db-list. svn path=/trunk/; revision=1854 2009-01-20 Murray Cumming save_changes(): Revert the Johannes change here too, because it is causing 2009-01-20 Murray Cumming * glom/libglom/document/document_glom.cc: save_changes(): Revert the Johannes change here too, because it is causing infinite loops when adding fields, and probably at other times, repeatedly saving the file. The code is not equivalent. svn path=/trunk/; revision=1853 2009-01-19 Murray Cumming document_history_add: Revert the previous, because I removed the new API 2009-01-19 Murray Cumming * glom/application.cc: document_history_add: Revert the previous, because I removed the new API from Bakery and just fixed the existing Bakery method instead. svn path=/trunk/; revision=1852 2009-01-19 Johannes Schmid Avoid a critical warning by adding the recent data instead of letting 2009-01-19 Johannes Schmid * glom/application.cc: Avoid a critical warning by adding the recent data instead of letting Gtk::RecentManager query for non-existing uris which causes a Gtk-Critical. Requires new bakery trunk * glom/libglom/document/document_glom.cc: Don't duplicate code from Bakery. svn path=/trunk/; revision=1851 2009-01-16 Murray Cumming Released. svn path=/trunk/; revision=1850 2009-01-16 Murray Cumming Update the required libgda(mm) versions. 2009-01-16 Murray Cumming * configure.in: Update the required libgda(mm) versions. svn path=/trunk/; revision=1849 2009-01-15 Murray Cumming initial dialog: Correct the button order, which seems to have been broken 2009-01-15 Murray Cumming * glom/glom.glade: initial dialog: Correct the button order, which seems to have been broken when re-saving with glade-2. The other dialogs seem OK. * glom/libglom/data_structure/fieldtypes.cc: Constructor: * glom/mode_design/fields/box_db_table_definition.cc: fill_fields(): Comment out some debug output. svn path=/trunk/; revision=1848 2009-01-14 Armin Burgmeier When changing column types, only attempt to convert data if 2009-01-14 Armin Burgmeier * glom/libglom/connectionpool_backends/postgres.cc (change_columns): When changing column types, only attempt to convert data if Field::get_conversion_possible() returns TRUE, otherwise just change the column type without trying to convert the data. * glom/libglom/connectionpool.cc (change_columns): Added a TODO comment about not failing when data could not be converted to the new column type. * glom/mode_design/fields/box_db_table_definition.cc (get_field_definition): Set the glom type explicitely on the result field, so that we don't have to guess from the GType. svn path=/trunk/; revision=1847 2009-01-13 Armin Burgmeier Don't set the autoincrement field for the newly added column since we do 2009-01-13 Armin Burgmeier * glom/libglom/connectionpool.cc add_column(): Don't set the autoincrement field for the newly added column since we do control this ourselves in Glom. svn path=/trunk/; revision=1846 2009-01-13 Armin Burgmeier Explain that when changing a table's primary key we are changing two 2009-01-13 Armin Burgmeier * glom/libglom/connectionpool.h: * glom/libglom/connectionpool.cc: Explain that when changing a table's primary key we are changing two columns, in response to Murray's previously added TODO comment. Don't compile add_column(), drop_column(), change_columns() in client only mode. * glom/libglom/connectionpool_backends/postgres.h: * glom/libglom/connectionpool_backends/postgres.cc: Added postgres-specific code for changing a column's type, to allow conversions from/to date and time fields. * glom/mode_design/fields/box_db_table_definition.h: * glom/mode_design/fields/box_db_table_definition.cc: Removed commented-out code that did the same before I moved the functionality to the connectionpool backend. svn path=/trunk/; revision=1845 2009-01-13 Murray Cumming change_columns(): Added a TODO comment asking why we would ever want to 2009-01-13 Murray Cumming * glom/libglom/connectionpool.cc: change_columns(): Added a TODO comment asking why we would ever want to change multiple columns. Changing just one columns would make the function simpler. svn path=/trunk/; revision=1844 2009-01-12 Armin Burgmeier Added add_column(), change_column(), drop_column(), using a generic 2009-01-12 Armin Burgmeier * glom/libglom/connectionpool.h: * glom/libglom/connectionpool.cc: Added add_column(), change_column(), drop_column(), using a generic implementation via libgda's DDL API. * glom/libglom/connectionpool_backends/postgres.h: * glom/libglom/connectionpool_backends/postgres.cc: * glom/libglom/connectionpool_backends/Makefile.am: Added a base class for the two postgres backends, implementing the common functionality. * glom/libglom/connectionpool_backends/postgres_self.h: * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/connectionpool_backends/postgres_central.cc: Use the Postgres base class, instead of deriving directly from ConnectionPoolBackend. * glom/mode_design/fields/box_db_table_definition.h: * glom/mode_design/fields/box_db_table_definition.cc: Use the connectionpool add_column(), drop_column() and change_column() functions instead of using postgres-specific code from glom_postgres.cc. There is maybe a drawback concerning data conversion when changing column types, but I'll re-add the relevant code to the postgres connectionpool backend in the near future. * glom/glom_postgres.h: * glom/glom_postgres.cc: Removed postgres_add_column() and postgres_change_column_extras(). * glom/main.cc: Adapt to check_postgres_gda_client_is_available_with_warning() now being in ConnectionPoolBackends::Postgres instead of ConnectionPoolBackends::PostgresCentral. svn path=/trunk/; revision=1843 2009-01-12 Murray Cumming Allowed a recent version of glade-2 to resave this. The changes seem 2009-01-12 Murray Cumming * glom/glom.glade: Allowed a recent version of glade-2 to resave this. The changes seem harmless, just adding things, but we will see. svn path=/trunk/; revision=1842 2009-01-12 Murray Cumming Increase version to 1.9.0, in anticiaption of a first unstable 1.9/1.10 2009-01-12 Murray Cumming * configure.in: Increase version to 1.9.0, in anticiaption of a first unstable 1.9/1.10 release. svn path=/trunk/; revision=1841 2009-01-12 Murray Cumming Some commented-out code showing the meta store problem. svn path=/trunk/; revision=1840 2009-01-12 Murray Cumming Removed some debug output. svn path=/trunk/; revision=1839 2009-01-12 Murray Cumming Main window: Correct the order of the Records: and Found: labels, which 2009-01-12 Murray Cumming * glom/glom.glade: Main window: Correct the order of the Records: and Found: labels, which became confused at some point, maybe during 1.8. svn path=/trunk/; revision=1837 2009-01-12 Murray Cumming fill_from_database(): Call DbAddDel::set_columns_ready() so the treeview 2009-01-12 Murray Cumming * glom/mode_find/box_data_list_find.cc: fill_from_database(): Call DbAddDel::set_columns_ready() so the treeview actually shows some columns. * glom/utility_widgets/db_adddel/Makefile.am: * glom/utility_widgets/db_adddel/treemodel_with_addrow.[h|cc]: A new common MI abstract base class for treemodels that have the extra empty row for adding rows. * glom/utility_widgets/db_adddel/liststore_with_addrow.[h|cc]: A new treemodel derived from ListStore and the new base class, for use with find mode. * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Derive from the new base class. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: construct_specified_columns(): Create the ListStore model for find mode. Use the model via the base class where possible, so we can use the find mode model too. Avoid changing the data in the database when in find mode. This makes find mode work again in the list view, fixing bug #565579. svn path=/trunk/; revision=1836 2009-01-05 Murray Cumming Added update_gda_metastore_for_table(). Call it, but it does not seem to 2009-01-05 Murray Cumming * glom/base_db.[h|cc]: Added update_gda_metastore_for_table(). * glom/mode_design/fields/box_db_table_definition.cc on_adddel_add(), on_adddel_delete(), postgres_change_column(): Call it, but it does not seem to work. New fields are immedietaly reported as not found (on the command line) and field type changes are reverted when reopening the dialog. svn path=/trunk/; revision=1835 2009-01-03 Murray Cumming Removed the encoding line because it is deprecated according to 2009-01-03 Murray Cumming * glom.desktop.in.in: Removed the encoding line because it is deprecated according to http://standards.freedesktop.org/desktop-entry-spec/1.0/apc.html and lintian (debian) complains about it. svn path=/trunk/; revision=1833 2009-01-01 Mario Blättermann Updated German UI and doc translations svn path=/trunk/; revision=1830 2008-12-27 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1829 2008-12-24 Murray Cumming show_tool_pallete(): Make this non-virtual because there are no overrides. 2008-12-24 Murray Cumming * glom/mode_data/box_data_details.h: show_tool_pallete(): Make this non-virtual because there are no overrides. * glom/mode_find/box_data_details_find.cc: constructor, fill_from_database(): Hide the tool palette, because it is useless in Find mode. svn path=/trunk/; revision=1826 2008-12-22 Murray Cumming Documented two methods. on_adddel_changed(): Warn on stdcerr if the 2008-12-22 Murray Cumming * glom/base_db.h: Documented two methods. * glom/mode_design/fields/box_db_table_definition.cc: on_adddel_changed(): Warn on stdcerr if the newly-added field seems unknown to the database, showing that the GdaMetaStore is not being updated automatically. svn path=/trunk/; revision=1825 2008-12-22 Murray Cumming cleanup(): Clear the cached connection, to stop Glom from using a 2008-12-22 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: cleanup(): Clear the cached connection, to stop Glom from using a connection that has been disconnected. svn path=/trunk/; revision=1824 2008-12-21 Murray Cumming get_primary_key_is_in_foundset(): Avoid a crash when (unusually) the 2008-12-21 Murray Cumming * glom/base_db.cc: get_primary_key_is_in_foundset(): Avoid a crash when (unusually) the primary key is not known. svn path=/trunk/; revision=1822 2008-12-21 Murray Cumming Copy constructor and operator=: Copy the underlying text, not just the 2008-12-21 Murray Cumming * glom/libglom/data_structure/layout/layoutitem_text.cc: Copy constructor and operator=: Copy the underlying text, not just the smartpointer to it. This stops us from accidentally changing the empty available template parts in reports. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/309417 (elmergato) svn path=/trunk/; revision=1821 2008-12-21 Murray Cumming Copy constructor and operator=: Copy the underlying text, not just the 2008-12-21 Murray Cumming * glom/libglom/data_structure/layout/layoutitem_text.cc: Copy constructor and operator=: Copy the underlying text, not just the smartpointer to it. This stops us from accidentally changing the empty available template parts in reports. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/309417 (elmergato) svn path=/trunk/; revision=1820 2008-12-19 Murray Cumming Add missing quotes around user and group names in SQL queries. 2008-12-19 Murray Cumming * glom/mode_design/users/dialog_groups_list.cc on_button_group_delete(): * glom/mode_design/users/dialog_users_list.cc on_button_user_delete(), on_button_user_add(), on_button_user_new(), on_button_user_edit(): Add missing quotes around user and group names in SQL queries. svn path=/trunk/; revision=1817 2008-12-19 Murray Cumming Split query_execute() into query_execute() and query_execute_select(), 2008-12-19 Murray Cumming * glom/base_db.[h|cc]: Split query_execute() into query_execute() and query_execute_select(), returning just a bool for query_execute(), as suggested by a TODO because of the changed API in libgda 4.0. * Many files: Call the correct method. svn path=/trunk/; revision=1816 2008-12-18 Murray Cumming query_execute(): Catch ServerProviderError exceptions too. This needs the 2008-12-18 Murray Cumming * glom/base_db.cc: query_execute(): Catch ServerProviderError exceptions too. This needs the latest libgdamm svn path=/trunk/; revision=1815 2008-12-18 Murray Cumming get_field_definition(): Actually store the primary-key and unique details. 2008-12-18 Murray Cumming * glom/mode_design/fields/box_db_table_definition.cc: get_field_definition(): Actually store the primary-key and unique details. This was a regression since the port to libgda 4.0. svn path=/trunk/; revision=1814 2008-12-17 Armin Burgmeier Reverted the previous change. People can choose not to show the "comments" 2008-12-17 Armin Burgmeier * glom/base_db.cc (create_table_with_default_fields): Reverted the previous change. People can choose not to show the "comments" or "description" columns in their layouts. We'll later support removing columns by recreating the whole table. svn path=/trunk/; revision=1813 2008-12-17 Armin Burgmeier Don't create the "comments" and "description" columns if the database 2008-12-17 Armin Burgmeier * glom/base_db.cc (create_table_with_default_fields): Don't create the "comments" and "description" columns if the database system does not support removing columns. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc (fill_values_if_necessary): Adapt to libgdamm API change. Gda::DataModelIter::move_at_row has been renamed to move_to_row. svn path=/trunk/; revision=1812 2008-12-16 Murray Cumming connect(): Store a cache of the connection for 30 seconds, to avoid 2008-12-16 Murray Cumming * glom/libglom/connectionpool.cc: connect(): Store a cache of the connection for 30 seconds, to avoid unnecessary reconnects. Clear the cache when setting the username/password/database, to force a reconnect. svn path=/trunk/; revision=1811 2008-12-16 Murray Cumming Un-uncomment the crash handler. svn path=/trunk/; revision=1810 2008-12-16 Murray Cumming refresh_from_database(): Use STATEMENT_MODEL_CURSOR instead of 2008-12-16 Murray Cumming * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: refresh_from_database(): Use STATEMENT_MODEL_CURSOR instead of ITER_MODEL_ONLY, as needed by libgda-4.0. svn path=/trunk/; revision=1809 2008-12-15 Kjartan Maraas Updated Norwegian bokmÃ¥l translation. 2008-12-15 Kjartan Maraas * nb.po: Updated Norwegian bokmÃ¥l translation. svn path=/trunk/; revision=1808 2008-12-15 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1807 2008-12-15 Armin Burgmeier Fixed logic so that the document is set to be modified when the new fields 2008-12-15 Armin Burgmeier * glom/libglom/document/document_glom.cc (set_table_fields): Fixed logic so that the document is set to be modified when the new fields differ from the old fields, not when they compare equal. * glom/libglom/document/document_glom.h: Also copy the m_info member in DocumentTableInfo's copy constructor and assignment operator. * glom/base_db.cc: Update the libgda meta store after having created a new table, so that get_fields_for_table_from_database works correctly for the new table. These changes fix creating new tables. svn path=/trunk/; revision=1806 2008-12-15 Murray Cumming Avoided compiler warnings, mostly commenting out unused parameters. 2008-12-15 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/connectionpool_backends/sqlite.cc: * glom/libglom/data_structure/glomconversions.cc: * glom/libglom/document/document_glom.cc: * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_portal.cc: * glom/mode_data/flowtablewithfields.cc: * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: * glom/relationships_overview/printoperation_relationshipsoverview.cc: * glom/translation/window_translations.cc: * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/calendar/glomcalendar.cc: * glom/utility_widgets/calendar/glomcalendar.h: * glom/utility_widgets/calendar/glomgtkcalendar.h: * glom/utility_widgets/canvas/canvas_group_resizable.cc: * glom/utility_widgets/canvas/canvas_item_movable.cc: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/egg/toolpalette/eggtoolpalette.h: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/sidebar.cc: Avoided compiler warnings, mostly commenting out unused parameters. svn path=/trunk/; revision=1805 2008-12-15 Johannes Schmid Fixed a warning (actually avoided a sprintf completely...) 2008-12-15 Johannes Schmid * glom/frame_glom.cc: Fixed a warning (actually avoided a sprintf completely...) * glom/libglom/connectionpool_backends/postgres_central.cc: * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/connectionpool_backends/postgres_self.cc: Fixed creating of databases. Database is no created though things break at a latter stage. svn path=/trunk/; revision=1804 2008-12-12 Murray Cumming Remove tabs, and spaces before ( and generally fix some old Johannes-esque 2008-12-12 Murray Cumming * Many files: Remove tabs, and spaces before ( and generally fix some old Johannes-esque formatting. svn path=/trunk/; revision=1803 2008-12-12 Murray Cumming Updated ChangeLog entry because I fixed the crash in libgdamm svn path=/trunk/; revision=1802 2008-12-12 Murray Cumming Store the primary_key and unique_key details as bools in the C++ class, 2008-12-12 Murray Cumming * glom/libglom/data_structure/field.[h|cc]: Store the primary_key and unique_key details as bools in the C++ class, because we cannot easily get that from libgda-4.0, so we at least remember that information from the document. If we can get it from the database somehow then we can do that later. * glom/mode_design/fields/dialog_fielddefinition.cc: get_field(): Store the primary_key and unique_key details in the C++ class. We previously stored them info Gda::Column but that code was commented out during the port to libgda-4.0. There is also a crash workaround in Gda::Holder in libgdamm, but there is still another unsolved crash. svn path=/trunk/; revision=1801 2008-12-12 Murray Cumming connect(): Call update_meta_store() here. Constructor, 2008-12-12 Murray Cumming * glom/libglom/connectionpool.cc: connect(): Call update_meta_store() here. * glom/libglom/data_structure/fieldtypes.cc: Constructor, * glom/base_db.cc: get_fields_for_table_from_database(): Do not call update_meta_store() here, because ConnectionPool::connect() has already called it. This makes things faster but there is still some slowness. svn path=/trunk/; revision=1800 2008-12-12 Murray Cumming Constructor, get_fields_for_table_from_database(): Use the new 2008-12-12 Murray Cumming * glom/libglom/data_structure/fieldtypes.cc: Constructor, * glom/base_db.cc: get_fields_for_table_from_database(): Use the new get_meta_store_data() method overload with no filter parameter to simplify the code slightly. Add debug output to show how often we call update_meta_store() and how awfully slow it is. svn path=/trunk/; revision=1799 2008-12-11 Daniel Nylander sv.po: Updated Swedish translation svn path=/trunk/; revision=1798 2008-12-11 Murray Cumming Also check an alternative directory path for the examples because an 2008-12-11 Murray Cumming * glom/Makefile.am: * glom/dialog_existing_or_new.[h|cc]: Also check an alternative directory path for the examples because an (unofficial) Ubuntu package installs them in an unexpected location. I would rather find out how/why that is happening though. svn path=/trunk/; revision=1797 2008-12-10 Johannes Depend on libgdamm-4.0, libgda-postgres-4.0 and pygda-4.0 2008-12-10 Johannes * configure.in: Depend on libgdamm-4.0, libgda-postgres-4.0 and pygda-4.0 * glom/main.cc: Call Gnome::Gda::Init() without arguments * glom/base_db.cc: * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: * glom/libglom/connectionpool_backends/postgres_central.cc: * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/connectionpool_backends/postgres_self.h: * glom/libglom/connectionpool_backends/sqlite.cc: * glom/libglom/connectionpool_backends/sqlite.h: * glom/libglom/data_structure/field.cc: * glom/libglom/data_structure/fieldtypes.cc: * glom/libglom/python_embed/py_glom_relatedrecord.cc: * glom/libglom/test_connectionpool.cc: * glom/libglom/utils.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * regression_tests/test_parsing_time.cc: Ported gda calls to libgda 4.0. This does mostly involve the removal of Gda::Client and some more API changes (Gda::ParamList => Gda::Set, Gda::Parameter => Gda::Holder). Some bits are still missing which involves creating database for Postgres (sqlite works) and several checks if postgres is installed that have been performed in the past. Also, the set_unique_key() and set_primary_key() methods of Gda::Column have no replacement in 4.0. All things that are not finished are marked with "TODO_gda:". svn path=/trunk/; revision=1794 2008-12-09 Armin Burgmeier Set "Users" mene item in "Developer" menu insensitive when the database 2008-12-09 Armin Burgmeier * glom/application.h: * glom/application.cc: Set "Users" mene item in "Developer" menu insensitive when the database does not support users. * glom/frame_glom.cc: Don't ask for user/password for SQLite connections. * glom/libglom/data_structure/glomconversions.cc (get_text_for_gda_value): Really allow TIME values to be strings. * glom/libglom/connectionpool.h: * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/connectionpool_backends/postgres_self.h: * glom/libglom/connectionpool_backends/sqlite.h: Added a supports_remote_connection() virtual function to the ConnectionPool backends. * glom/libglom/connectionpool.cc: Don't advertize the Glom document via avahi when the database does not support remote connections, such as SQLite. svn path=/trunk/; revision=1793 2008-12-09 Murray Cumming validate_primary_key(): Avoid a null pointer dereference (crash) if there 2008-12-09 Murray Cumming * glom/dialog_import_csv.[h|cc]: validate_primary_key(): Avoid a null pointer dereference (crash) if there is no primary key, though that should never happen now. handle_line(), import(): Use a sorted tree model so the fields list is alphabetically sorted. Ubuntu bug #https://bugs.launchpad.net/ubuntu/+source/glom/+bug/306593 (elmergato) svn path=/trunk/; revision=1791 2008-12-09 Murray Cumming Improve ChangeLog svn path=/trunk/; revision=1790 2008-12-09 Murray Cumming Constructors: Do not enable row drag and drop on the treeviews, because it 2008-12-09 Murray Cumming * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: Constructors: Do not enable row drag and drop on the treeviews, because it is not used and it just confuses users who trigger it accidentally. This was just some left-over code from when these classes were started by copying the layout dialog. svn path=/trunk/; revision=1788 2008-12-09 Murray Cumming Constructor: When the examples directory does not exist, mention the path 2008-12-09 Murray Cumming * glom/dialog_existing_or_new.cc: Constructor: When the examples directory does not exist, mention the path in the stderr message, to help us to debug the problem. svn path=/trunk/; revision=1786 2008-12-08 Murray Cumming Reverted some debug output. svn path=/trunk/; revision=1785 2008-12-08 Murray Cumming cleanup(): Check for a null m_backend, to avoid a crash when quitting Glom 2008-12-08 Murray Cumming * glom/libglom/connectionpool.cc: cleanup(): Check for a null m_backend, to avoid a crash when quitting Glom without opening a file. I added some more checks elsewhere. svn path=/trunk/; revision=1784 2008-12-08 Murray Cumming Improved ChangeLog entry. svn path=/trunk/; revision=1783 2008-12-08 Murray Cumming Do not create a GooCanvasGrid with 0 steps, so Glom works with versions of 2008-12-08 Murray Cumming * glom/utility_widgets/canvas/canvas_group_grid.cc (Glom.create_lines): Do not create a GooCanvasGrid with 0 steps, so Glom works with versions of GooCanvas without the bug fix. svn path=/trunk/; revision=1781 2008-12-06 Murray Cumming on_cell_data_title(): Pass a ustring to set_property() for the (None) 2008-12-06 Murray Cumming * glom/combobox_fields.cc: on_cell_data_title(): Pass a ustring to set_property() for the (None) item, so it really shows up. set_property() cannot handle a char* there, it seems. For instance, this means that the choices fields can be cleared again. This regression probably happened when we first ported Glom to Maemo. Bug found by Arq. Maximiliano Meilán. svn path=/trunk/; revision=1778 2008-12-06 Murray Cumming on_adddel_Add(): Set a default title based on the name, when adding a new 2008-12-06 Murray Cumming * glom/box_reports.cc: on_adddel_Add(): Set a default title based on the name, when adding a new report, as we do for tables, relationships, print layouts, etc.: svn path=/trunk/; revision=1777 2008-12-06 Murray Cumming dialog_import_csv: Set the GtkSpinButton page size to 0 because recent 2008-11-05 Murray Cumming * glom/glom.glade: dialog_import_csv: Set the GtkSpinButton page size to 0 because recent GTK+ warns that no other value is allowed. svn path=/trunk/; revision=1776 2008-12-05 Armin Burgmeier Replaced get_escaped_binary_data by escape_binary_data_postgres() and 2008-12-05 Armin Burgmeier * glom/libglom/data_structure/glomconversions.h: * glom/libglom/data_structure/glomconversions.cc: Replaced get_escaped_binary_data by escape_binary_data_postgres() and escape_binary_data_sqlite(). SQLite uses a different format for binary data. (get_text_for_gda_value): Allow DATE and TIME values to be strings, and parse them always in ISO format. This is used for SQLite within which we store dates and times as ISO-formatted strings. * glom/libglom/data_structure/field.cc (glom_unescape_text): Don't unescape double quotes, as they are not escaped in glom_escape_text either. (sql): Use the escape_binary_data_postgres or escape_binary_data_sqlite functions from glomconversions, depending on the preferred format. (from_sql): Use the unescape_binary_data_postgres or unescape_binary_data_sqlite functions from glomconversions, depending on the preferred format. svn path=/trunk/; revision=1775 2008-12-04 Murray Cumming Added has_no_criteria() to check if it has a sort order or where clause. 2008-12-04 Murray Cumming * glom/libglom/data_structure/foundset.[h|cc]: Added has_no_criteria() to check if it has a sort order or where clause. * glom/libglom/document/document_glom.[h|cc]: Added set_criteria_current(), like set_layout_current(), so we can temporarily remember the sort (and find) for a table while navigating. DocumentTableInfo: Hand-wrote copy constructor and operator=() rather than depend on generated ones. * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Added signal_sort_clause_changed, emitted when the user clicks on the column header, which already caused a refresh with that sort. * glom/mode_data/box_data_list.[h|cc]: Respond to a sort change in the DbAddDel widget, saving it temporarily in the document. * glom/mode_data/frame_glom.cc: show_table(): Use the remembered criteria, from the document, where there is one. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/303422 (elmergato) svn path=/trunk/; revision=1774 2008-12-02 Armin Burgmeier Added a fallback map that specifies types that can be used when the 2008-12-02 Armin Burgmeier * glom/libglom/data_structure/fieldtypes.h: * glom/libglom/data_structure/fieldtypes.cc: Added a fallback map that specifies types that can be used when the database does not support another type natively. * glom/libglom/data_structure/field.cc (set_field_info): Only set glom type of the field based on the GType of the info if it represents a different type. This prevents losing type information of the field when the type for this field used a fallback. * glom/libglom/data_structure/glomconversions.cc (get_text_for_gda_value): Don't complain for numeric types when the gtype is double, because this is used when the database system does not support GdaNumeric natively. svn path=/trunk/; revision=1773 2008-12-01 Murray Cumming Depend on the latest goocanvasmm version. 2008-12-01 Murray Cumming * configure.in: Depend on the latest goocanvasmm version. svn path=/trunk/; revision=1772 2008-11-30 Armin Burgmeier Removed the DISTCHECK_CONFIGURE_FLAGS setting, since the 2008-11-30 Armin Burgmeier * Makefile.am: Removed the DISTCHECK_CONFIGURE_FLAGS setting, since the --disable-scrollkeeper option is already passed to configure during distcheck by other means. This allows setting custom DISTCHECK_CONFIGURE_FLAGS. Bug #562688. svn path=/trunk/; revision=1771 2008-11-30 Armin Burgmeier Added connectionpool_backends/postgres_central.cc and 2008-11-30 Armin Burgmeier * POTFILES.in: Added connectionpool_backends/postgres_central.cc and connectionpool_backends/postgres_self.cc, which contain strings that were in connectionpool.cc formerly. svn path=/trunk/; revision=1770 2008-11-29 Armin Burgmeier Fixed the description of the --with-postgres-utils option to match the 2008-11-29 Armin Burgmeier * configure.in: Fixed the description of the --with-postgres-utils option to match the default. svn path=/trunk/; revision=1769 2008-11-29 Armin Burgmeier Changed DISTCLEAN_FILES to DISTCLEANFILES, to fix make distcheck. 2008-11-29 Armin Burgmeier * Makefile.am: Changed DISTCLEAN_FILES to DISTCLEANFILES, to fix make distcheck. svn path=/trunk/; revision=1768 2008-11-28 Armin Burgmeier Update for Glom 1.8. 2008-11-28 Armin Burgmeier * win32/build-installer: * win32/glom.iss.in: Update for Glom 1.8. svn path=/trunk/; revision=1763 2008-11-28 Armin Burgmeier Added a sql_format enumeration, and added a format paramater to sql() and 2008-11-28 Armin Burgmeier * glom/libglom/data_structure/field.h: * glom/libglom/data_structure/field.cc: Added a sql_format enumeration, and added a format paramater to sql() and from_sql(). This is needed for sqlite because it does not understand the E'binarydata'::bytea representation for binary data, which is a postgres extension. * glom/libglom/connectionpool.h: * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/connectionpool_backends/postgres_self.h: * glom/libglom/connectionpool_backends/sqlite.h: Added a get_sql_format() virtual method that returns the SQL format of the backend. * glom/libglom/data_structure/fieldtypes.cc (get_string_name_for_gdavaluetype): Added some fallbacks for types sqlite does not support. This means we are storing numerics as doubles, and dates and times as strings in sqlite. * glom/libglom/data_structure/glomconversions.cc (get_double_for_gda_value_numeric): Handle the value being a double, since we use this when the database system doesn't has a "numeric" type. * glom/dialog_import_csv.cc: * glom/dialog_import_csv_progress.cc: * glom/frame_glom.cc: Export/Import data always in postgres format, because this is what we used to do. * glom/base_db.cc (add_standard_groups): Make this a no-op in case the database system doesn't support users. (insert_example_data): Convert data from the example file from postgres format to the format the current database backend uses before importing. (count_rows_returned_by): For sqlite the result of the SELECT COUNT query is int, not int64, so handle that case as well. * glom/glom_privs.cc (get_current_privs): Assume we have all possible privileges in case the database system doesn't support users. * glom/utility_widgets/filechooserdialog_saveextras.cc (set_extra_newdb_hosting_mode): Fixed central hosting/self hosting mismatch (the default option in the dialog was wrong). svn path=/trunk/; revision=1762 2008-11-26 Murray Cumming Respond to changes in the scrolledwindow adjustments to increase the 2008-11-26 Murray Cumming * glom/relationships_overview/dialog_relationships_overview.[h|cc]: Respond to changes in the scrolledwindow adjustments to increase the canvas size when the window size changes, so it is always big enough, avoiding dead areas. Bug #559157 (Iain Lane). svn path=/trunk/; revision=1760 2008-11-25 Armin Burgmeier Fixed a crash which was caused by accessing mapGroups[1] in a 2008-11-25 Armin Burgmeier * glom/mode_data/dialog_layout_export.cc (get_layout_groups): Fixed a crash which was caused by accessing mapGroups[1] in a default-constructed vector. Bug #557052. svn path=/trunk/; revision=1756 2008-11-25 Murray Cumming Added a show_ok_dialog() overload that takes the parent_window as a 2008-11-25 Murray Cumming * glom/libglom/utils.[h|cc]: Added a show_ok_dialog() overload that takes the parent_window as a pointer to simplify code by avoiding the need for a null check by callers. * glom/mode_design/fields/box_db_table_definition.cc: check_field_change(): Refuse to leave no primary key set because the rest of Glom expects each table to have one, by refusing to directly unset a primary key. When setting a primary key, ask the user if they really want to _change_ the primary key, and do the suitability checks that were previously in change_definition(). change_definition(): When setting a primary key, unset the previous primary key first. This prevents the table from ever having no primary key. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/299549 (elmergato) Glom bug #562147 svn path=/trunk/; revision=1753 2008-11-24 Murray Cumming set_found_set_from_primary_key_value(): Do not crash if there is no 2008-11-24 Murray Cumming * glom/mode_data/box_data_details.cc: set_found_set_from_primary_key_value(): Do not crash if there is no primary key, though we should not allow tables with no primary keys. svn path=/trunk/; revision=1751 2008-11-24 Murray Cumming update_table_in_document_from_database: Ignore the default_value property 2008-11-24 Murray Cumming * glom/frame_glom.cc: update_table_in_document_from_database: Ignore the default_value property from libgda/database, because we only use it from the document, because libgda returns weird values. This prevents the loss of the default value information when reloading a document. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/299896 (elmergato) svn path=/trunk/; revision=1749 2008-11-24 Murray Cumming Call set_value_key(), like the old code did. Otherwise, each field edit 2008-11-24 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc user_added(): Call set_value_key(), like the old code did. Otherwise, each field edit adds another record, generating a new primary key each time, resulting in duplicate records. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/300819 (elmergato) svn path=/trunk/; revision=1747 2008-11-24 Murray Cumming on_button_group_new(): Put quotes around the group name, to avoid a 2008-11-24 Murray Cumming * glom/mode_design/users/dialog_groups_list.cc: on_button_group_new(): Put quotes around the group name, to avoid a problem when it contains a space. svn path=/trunk/; revision=1745 2008-11-24 Murray Cumming Removed the unused signal_user_requested_delete signal. 2008-11-24 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Removed the unused signal_user_requested_delete signal. on_MenuPopup_activate_Delete() (also called when the button is pressed): Actually call user_requested_delete(), so that the user can delete a list row. I forgot to do this when moving the other stuff down into DbAddDel. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/299853 (elmergato) svn path=/trunk/; revision=1743 2008-11-24 Murray Cumming Add a more specific warning when getting a text representation for a 2008-11-24 Murray Cumming * glom/libglom/data_structure/glomconversions.cc get_text_for_gda_value: Add a more specific warning when getting a text representation for a boolean, as done by the import dialog, though it should not really. Return translated true/false strings in that case. svn path=/trunk/; revision=1742 2008-11-22 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1739 2008-11-22 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1738 2008-11-21 Murray Cumming Corrected a button name to avoid a crash when editing reports. Ubuntu bug 2008-11-21 Murray Cumming * glom/glom_developer.glade: Corrected a button name to avoid a crash when editing reports. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/300054 svn path=/trunk/; revision=1736 2008-11-21 Murray Cumming dialog_import_csv: Added a lable for advice about the expected data 2008-11-21 Murray Cumming * glom/glom.glade: dialog_import_csv: Added a lable for advice about the expected data format. * glom/dialog_import_csv.cc: Constructor: Generate advice text in the label, showing an example of the expected ISO date format. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/299591 svn path=/trunk/; revision=1734 2008-11-21 Murray Cumming on_menu_file_export(): Correct the order of parameters to 2008-11-21 Murray Cumming * glom/frame_glom.cc: on_menu_file_export(): Correct the order of parameters to Document_Glom::get_data_layout_groups_plus_new_fields() so we actually get a sensible default set of fields instead of nothing. This was only a problem since the addition of the active-layout feature on trunk. svn path=/trunk/; revision=1733 2008-11-21 Murray Cumming Mark a tooltip as translatable in the initial dialog. Ubuntu bug 2008-11-21 Murray Cumming * glom/glom.glade: Mark a tooltip as translatable in the initial dialog. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/299556 svn path=/trunk/; revision=1731 2008-11-21 Murray Cumming Removed merge stuff svn path=/trunk/; revision=1728 2008-11-21 Murray Cumming sanity_check_date_text_representation_uses_4_digit_years(): Default to 2008-11-21 Murray Cumming * glom/libglom/data_structure/glomconversions.c: sanity_check_date_text_representation_uses_4_digit_years(): Default to dd/mm/yyyy for dates when the translator has not provided a 4-digit-year date syntax for the locale, printing a warning that the default might not be suitable. This seems better than failing. svn path=/trunk/; revision=1727 2008-11-21 Armin Burgmeier Changed connect() and create_database() functions of Backend to always 2008-11-21 Armin Burgmeier * glom/libglom/connectionpool.h: Changed connect() and create_database() functions of Backend to always take an error parameter as last argument, to save ugly #ifdefs. The ConnectionPool is the only one accessing these functions anyway, so this is not part of "public" API. * glom/libglom/connectionpool_backends/postgres_self.h: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/connectionpool_backends/postgres_central.cc: Adapt. * glom/libglom/connectionpool_backends/sqlite.h: * glom/libglom/connectionpool_backends/sqlite.cc: * glom/libglom/connectionpool_backends/Makefile.am: Added a sqlite for creating and connecting to SQlite databases. * glom/libglom/document/document_glom.h: * glom/libglom/document/document_glom.cc: Replace self_hosted attribute by a hosting_mode one in the document XML, which can be either "postgres_central", "postgres_self" or "sqlite". * glom/utility_widgets/filechooserdialog_saveextras.h: * glom/utility_widgets/filechooserdialog_saveextras.cc: Offer to store the data in a SQlite database. * glom/application.h: * glom/application.cc: * glom/dialog_connection.cc: * glom/frame_glom.cc: Handle the SQlite case, create corresponding ConnectionPool backend. It is possible to create a SQlite database this way, but some initial queries still fail yet because they are specific to postgres. svn path=/trunk/; revision=1726 2008-11-21 Murray Cumming Added sanity_check_date_parsing() and 2008-11-21 Murray Cumming * glom/libglom/data_structure/glomconversions.[h|cc]: Added sanity_check_date_parsing() and sanity_check_date_text_representation_uses_4_digit_years(). * glom/main.cc: Use them to show informative warnings at startup. The translators comment for %x mentions those warnings now too. * po/es.po: Add a translation for %x because the es locales do not use 4-digit years for this. Ubuntu bug https://bugs.launchpad.net/ubuntu/+source/glom/+bug/300057 * glom/test_pyembed.cc: Add a cast to avoid a warning. * glom/utility_widgets/db_adddel/db_adddel.cc: Initialize InnerIgnore members to avoid warnings, though these would always be initialized in real life. svn path=/trunk/; revision=1725 2008-11-17 Armin Burgmeier Removed postgres-specific function, added a common "Backend" interface. 2008-11-17 Armin Burgmeier * glom/libglom/connectionpool.h: Removed postgres-specific function, added a common "Backend" interface. Simplified the code logic in connect(). * glom/libglom/connectionpool_backends/postgres_self.h: * glom/libglom/connectionpool_backends/postgres_self.cc: * glom/libglom/connectionpool_backends/postgres_central.h: * glom/libglom/connectionpool_backends/postgres_central.cc: * glom/libglom/connectionpool_backends/Makefile.am: Added backends for postgres central and self hosting. * glom/libglom/gst-package.c: * glom/libglom/test_connectionpool.cc: * glom/libglom/connectionpool.cc: * glom/libglom/document/document_glom.cc: * glom/main.cc: * glom/frame_glom.cc: * glom/dialog_connection.cc: * glom/application.cc: * glom/dialog_new_self_hosted_connection.cc: Adapt other glom code, instantate the backends appropiately. svn path=/trunk/; revision=1724 2008-11-13 Murray Cumming Use the new Goocanvas::Grid instead of creating lots of lines ourselves. 2008-11-13 Murray Cumming * glom/utility_widgets/canvas/canvas_group_grid.[h|cc]: Use the new Goocanvas::Grid instead of creating lots of lines ourselves. We still need this class to add the rules and do the snapping though. svn path=/trunk/; revision=1723 2008-11-11 Murray Cumming Adapt to goocanvasmm enum name changes. 2008-11-11 Murray Cumming * glom/mode_design/print_layouts/canvas_layout_item.cc: * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/utility_widgets/canvas/canvas_group_resizable.cc: Adapt to goocanvasmm enum name changes. svn path=/trunk/; revision=1721 2008-11-10 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1720 2008-11-07 Leonardo Ferreira Fontenelle Updated Brazilian Portuguese translation by Michel Recondo and Leonardo 2008-11-07 Leonardo Ferreira Fontenelle * pt_BR.po: Updated Brazilian Portuguese translation by Michel Recondo and Leonardo Ferreira Fontenelle. svn path=/trunk/; revision=1719 2008-11-05 Murray Cumming Remove the system name label. It is in the window title and this has 2008-11-05 Murray Cumming * glom/glom.glade: Remove the system name label. It is in the window title and this has always been a little weird. I never found a way to make it pretty without wasting space, so it is now gone. * glom/frame_glom.[h|cc]: Removed show_system_name(). set_databases_selected(), on_menu_developer_database_preferences(): * glom/application.cc: Constructor: Don't call it. svn path=/trunk/; revision=1718 2008-11-05 Murray Cumming init_menus(): Added Developer/ActivePlatform sub menu. 2008-11-05 Murray Cumming * glom/application.[h|cc]: init_menus(): Added Developer/ActivePlatform sub menu. * glom/libglom/document/document_glom.[h|cc]: Added set/get_active_layout_platform(), and set/get_default_layout_platform(). get_data_layout_groups_default(), get_data_layout_groups_plus_new_fields(), set/get_data_layout_groups(), get_data_layout_groups_have_any_fields(): Added a layout_platform parameters. load_after(), save_before(): Save the layout_platform for each layout. * glom/frame_glom.cc: show_table(), on_menu_file_export(): * glom/mode_data/notebook_data.[h|cc]: init_db_details(), on_switch_page_handler(): * glom/mode_data/box_data.[h|cc]: init_db_details(), get_table_fields_to_show(), get_data_layout_groups() * glom/mode_data/box_data_calendar_related.cc: init_db_details(), prepare_layout_dialog(): * glom/mode_data/box_data_details.cc: init_db_details(), create_layout(), on_button_new(), on_flowtable_layout_changed(), print_layout(), prepare_layout_dialog(): * glom/mode_data/box_data_list.cc: on_adddel_user_reordered_columns(), create_layout_get_layout(), prepare_layout_dialog(): * glom/mode_data/box_data_list_related.cc: init_db_details(), prepare_layout_dialog(): * glom/mode_data/box_data_portal.cc: init_db_details(): * glom/mode_data/dialog_layout.[h|cc]: set_document(): * glom/mode_data/dialog_layout_calendar_related.[h|cc]: set_document(): * glom/mode_data/dialog_layout_details.[h|cc]: set_document(), save_to_document(): * glom/mode_data/dialog_layout_list_related.[h|cc]: set_document(): * glom/mode_find/notebook_find.[h|cc]: * glom/mode_find/box_data_details_find.[h|cc]: * glom/mode_find/box_data_list_find.[h|cc] * glom/utility_widgets/datawidget.cc: offer_related_record_id_find(): * glom/utility_widgets/dialog_choose_id.[h|cc]: on_box_find_criteria(), init_db_details(): * glom/utility_widgets/dialog_layoutitem_properties.[h|cc]: Adapted to changed Document_Glom API, taking note of the active platform. This allows people to define a different layout to be used when running on a Maemo platform. * glom/libglom/python_embed/py_glom_record.cc: * glom/libglom/python_embed/py_glom_related.cc: Added some casts to avoid warnings about literal to char* conversions. svn path=/trunk/; revision=1717 2008-11-02 Kjartan Maraas Updated Norwegian bokmÃ¥l translation. 2008-11-02 Kjartan Maraas * nb.po: Updated Norwegian bokmÃ¥l translation. svn path=/trunk/; revision=1716 2008-10-27 Murray Cumming Mark the branch. svn path=/trunk/; revision=1715 2008-10-22 Murray Cumming Increased version svn path=/trunk/; revision=1713 2008-10-22 Murray Cumming Return the portal as the group instead of trying to get the layout via the 2008-10-22 Murray Cumming * glom/mode_data/box_data_list_related.cc create_layout_get_layout(): Return the portal as the group instead of trying to get the layout via the (not meant to be used) list_related layout name. This makes related records portals show the specified fields again, instead of all of them. * glom/mode_data/box_data_manyrecords.cc: * glom/mode_data/box_data_manyrecords.h: Remove the useless create_layout_get_layout() override. svn path=/trunk/; revision=1712 2008-10-21 Koop Mast constructor: Add an ifdef to fix the build in client-only mode. Bug 2008-10-21 Koop Mast * glom/mode_data/notebook_data.cc: constructor: Add an ifdef to fix the build in client-only mode. Bug #557258 svn path=/trunk/; revision=1711 2008-10-21 Murray Cumming Increased version svn path=/trunk/; revision=1710 2008-10-20 Murray Cumming Added new screenshot. 2008-10-20 Murray Cumming * docs/user-guide/C/figures/glom_import.png: * docs/user-guide/Makefile.am: * docs/website/screenshots/glom_import.png: Added new screenshot. * glom/dialog_import_csv.cc: Use a more robust way of creating TreeModel::Paths, to avoid a crash. svn path=/trunk/; revision=1709 2008-10-20 Murray Cumming Updated, ready for a 1.8.0 release. Depend on the latest goocanvasmmm, 2008-10-20 Murray Cumming * NEWS: Updated, ready for a 1.8.0 release. * configure.in: Depend on the latest goocanvasmmm, because of my API change. * glom/dialog_import_csv.cc: * glom/dialog_import_csv.h: Some code syntax changes. svn path=/trunk/; revision=1708 2008-10-18 Kjartan Maraas Updated Norwegian bokmÃ¥l translation. 2008-10-18 Kjartan Maraas * nb.po: Updated Norwegian bokmÃ¥l translation. svn path=/trunk/; revision=1707 2008-10-13 Murray Cumming po/en_GB.po: Restore the date printf format AGAIN that was removed by 2007-04-01 Murray Cumming po/en_GB.po: Restore the date printf format AGAIN that was removed by David Lodge AGAIN. This date format translation corrects the parsing and display of 4-digit dates. Bug #425116 svn path=/trunk/; revision=1706 2008-10-13 Murray Cumming get_canvas_table_cell_child(): Adapted for my 2008-10-13 Murray Cumming * glom/mode_design/print_layouts/canvas_print_layout.cc: get_canvas_table_cell_child(): Adapted for my Goocanvas::Item::get_child_property() API change. svn path=/trunk/; revision=1705 2008-10-10 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1704 2008-10-09 Murray Cumming Increased version svn path=/trunk/; revision=1703 2008-10-08 Murray Cumming Removed some debug output. svn path=/trunk/; revision=1702 2008-10-08 Murray Cumming glom/icons/16x16/glom-line-horizontal.png Incredibly bad initial versions 2008-10-07 Murray Cumming * glom/icons/16x16/glom-line-horizontal.png * glom/icons/16x16/glom-line-vertica.png: Incredibly bad initial versions of these icons, featuring actual lines. svn path=/trunk/; revision=1701 2008-10-08 Murray Cumming on_adddel_user_added(): Set a default title based on the name, when adding 2008-10-07 Murray Cumming * glom/mode_design/print_layouts/box_print_layouts.cc: on_adddel_user_added(): Set a default title based on the name, when adding a print layout. svn path=/trunk/; revision=1700 2008-10-08 Murray Cumming Rename signal handler to make them clearer. 2008-10-07 Murray Cumming * glom/mode_design/print_layouts/box_print_layouts.[h|cc]: Rename signal handler to make them clearer. svn path=/trunk/; revision=1699 2008-10-08 Murray Cumming glom/mode_data/box_data_portal.cc glom/base_db.h Moved code from 2008-10-07 Murray Cumming * glom/mode_data/box_data_portal.cc * glom/base_db.h * glom/base_db.cc: Moved code from Box_Data_Portal::init_db_details() into set_found_set_where_clause_for_portal() so it can be reused. Added get_field_value_in_database() overload that takes a FoundSet. * glom/mode_design/print_layouts/canvas_layout_item.cc * glom/mode_design/print_layouts/canvas_layout_item.h: moved some code into get_rows_count_for_portal() so it can be reused. * glom/frame_glom.cc * glom/mode_design/print_layouts/canvas_print_layout.cc * glom/mode_design/print_layouts/canvas_print_layout.h: fill_with_data(): Added and used some helper functions to fill tables (for portals) with data so that portals actually show field data when printed. svn path=/trunk/; revision=1698 2008-10-03 Murray Cumming Some unfinished stuff so I can get it easily on my laptop. Sorry svn path=/trunk/; revision=1697 2008-09-30 Murray Cumming append_appropriate_row(): Make sure that this returns something even for 2008-09-30 Murray Cumming * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: append_appropriate_row(): Make sure that this returns something even for related records portals, so we can add buttons, text, and images to them again. svn path=/trunk/; revision=1696 2008-09-30 Murray Cumming Also hid Add Group for list layouts. svn path=/trunk/; revision=1695 2008-09-30 Murray Cumming Renamed some widgets to make the code just slightly less weird. 2008-09-30 Murray Cumming * glom/glom_developer.glade: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: * glom/mode_data/dialog_layout_export.cc: * glom/mode_data/dialog_layout_export.h: * glom/mode_data/dialog_layout_list.cc: Renamed some widgets to make the code just slightly less weird. svn path=/trunk/; revision=1694 2008-09-30 Murray Cumming set_layout_item(): Moved some code into a 2008-09-30 Murray Cumming * glom/mode_design/print_layouts/canvas_layout_item.cc: * glom/mode_design/print_layouts/canvas_layout_item.h: set_layout_item(): Moved some code into a create_canvas_item_for_layout_item() function so we can use it to create table cell items, without putting them inside groups (resizables), because goocanvas cannot handle that. svn path=/trunk/; revision=1692 2008-09-30 Murray Cumming set_layout_item(): Moved some code into a 2008-09-30 Murray Cumming * glom/mode_design/print_layouts/canvas_layout_item.cc: * glom/mode_design/print_layouts/canvas_layout_item.h: set_layout_item(): Moved some code into a create_canvas_item_for_layout_item() function so we can use it to create table cell items, without putting them inside groups (resizables), because goocanvas cannot handle that. svn path=/trunk/; revision=1691 2008-09-26 Johannes Schmid Require correct version for bakery and goocanvasmm * configure.in: Require correct version for bakery and goocanvasmm (typo in ChangeLog) svn path=/trunk/; revision=1690 2008-09-26 Johannes Schmid Require correct version for bonobo and goocanvasmm 2008-09-26 Johannes Schmid * configure.in: Require correct version for bonobo and goocanvasmm * glom/mode_data/flowtablewithfields.cc: * glom/mode_data/flowtablewithfields.h: * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/flowtable_dnd.h: * glom/utility_widgets/layouttoolbar.cc: Added support for dragging related records to the layout. See #358092 svn path=/trunk/; revision=1689 2008-09-13 Murray Cumming Increased version svn path=/trunk/; revision=1688 2008-09-13 Murray Cumming Increase the required goocanvasmm version, so we get the grid lines. 2008-09-13 Murray Cumming * configure.in: Increase the required goocanvasmm version, so we get the grid lines. svn path=/trunk/; revision=1687 2008-09-13 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1686 2008-09-12 Murray Cumming Mention a new file. 2008-09-12 Murray Cumming * po/POTFILES.in: Mention a new file. svn path=/trunk/; revision=1685 2008-09-12 Murray Cumming Mention a new file. 2008-09-12 Murray Cumming * po/POTFILES.in: Mention a new file. svn path=/trunk/; revision=1684 2008-09-10 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1683 2008-09-09 Armin Burgmeier Implemented check_user_is_not_root() for Windows, using some code from 2008-09-09 Armin Burgmeier * glom/libglom/connectionpool.cc: Implemented check_user_is_not_root() for Windows, using some code from postgresql. svn path=/trunk/; revision=1682 2008-09-09 Armin Burgmeier Refactored the code, removed all blocking calls and use the 2008-09-09 Armin Burgmeier * glom/libglom/spawn_with_feedback.cc: Refactored the code, removed all blocking calls and use the CreateProcess() API on Windows to hide the console window of child processes. * glom/libglom/connectionpool.cc: Always call the spawn API with double quotes for the path to the executable, because CreateProcess() does not support single quotes. svn path=/trunk/; revision=1681 2008-09-06 Murray Cumming Add a column for the column width, but only show it for the list. Also 2008-09-06 Murray Cumming * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: * glom/mode_data/dialog_layout_list.cc: Add a column for the column width, but only show it for the list. Also hide the columns count column for the list. * glom/libglom/document/document_glom.cc: load_after_layout_group(), Glom.save_before_layout_group(): Save the column widths for items in the document. * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: Remove one set_document() method overload, adding the parent_table to the existing one, to simplify code and to allow us to preserve LayoutItem_Portal details such as print layout positions, even when no relationship is chosen yet. * glom/mode_data/box_data_list_related.cc: Adapted. * glom/mode_design/print_layouts/canvas_print_layout.cc: Adapted. * glom/mode_design/print_layouts/canvas_layout_item.cc: create_item(): For the portal, create a rect cell for each field in the layout. Still not very useful, but gradually becoming more sensible. * glom/utility_widgets/db_adddel/db_adddel.cc: on_treeview_column_resized(): Do not save the column width if it is the last column because that autosizes to take all remaining space. * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: Remove the reset_column_widths stuff, because ignoring the last column is a better fix. svn path=/trunk/; revision=1680 2008-09-04 Murray Cumming Added init_db_details() method overloads that take a parent table instead 2008-09-05 Murray Cumming * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_calendar_related.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: * glom/mode_data/box_data_portal.cc: * glom/mode_data/box_data_portal.h: Added init_db_details() method overloads that take a parent table instead of a portal, to use when no relationship has been chosen yet. * glom/mode_data/dialog_layout_calendar_related.cc: * glom/mode_data/dialog_layout_calendar_related.h: Added set_document() that takes a table instead of a portal, as the other portal layout dialogs do already. * glom/mode_data/flowtablewithfields.cc: Specify a from table name instead of a portal when no relationship has been chosen yet. * glom/mode_data/dialog_layout_list_related.cc: Cope with a a null portal, so the user can choose the relationship on this dialog without choosing the relationship separately first. * glom/mode_data/dialog_layout_details.cc: Do not ask for the relationship whenever adding a portal. * glom/libglom/utils.cc: * glom/libglom/utils.h: Added show_window_until_hide(). * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/mode_design/print_layouts/canvas_print_layout.h: Block when showing the layout dialog for a portal. svn path=/trunk/; revision=1679 2008-09-03 Murray Cumming glom/libglom/data_structure/layout/layoutitem_portal.cc Added 2008-09-03 Murray Cumming * glom/libglom/data_structure/layout/layoutitem_portal.cc * glom/libglom/data_structure/layout/layoutitem_portal.h: Added get/set_print_layout_row_height(). * glom/mode_data/dialog_layout_list_related.cc * glom/mode_data/dialog_layout_list_related.h: Added a set_document() that takes the from_table, instead of an existing portal. * glom/mode_design/print_layouts/canvas_layout_item.cc: set_layout_item(): Slightly more sane code, though I'm still just playing. * glom/mode_design/print_layouts/canvas_print_layout.h: * glom/mode_design/print_layouts/canvas_print_layout.cc Added offer_related_records(), used in on_context_menu_edit(). Still needs to block on the dialog show. svn path=/trunk/; revision=1678 2008-08-28 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1677 2008-08-28 Johannes Schmid Remeber state of layout toolbar when switching modes 2008-08-28 Johannes Schmid * glom/application.cc: Remeber state of layout toolbar when switching modes svn path=/trunk/; revision=1676 2008-08-28 Johannes Schmid Correctly unset the menu item when layout toolbar is shown and don\'t hide 2008-08-28 Johannes Schmid * glom/application.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/notebook_data.cc: Correctly unset the menu item when layout toolbar is shown and don\'t hide layout toolbar when an item is dragged * glom/mode_design/print_layouts/window_print_layout_edit.cc: (on_canvas_drag_drop, on_canvas_drag_motion) Fixed build error with gtkmm 2.12 (const_cast, see comment) svn path=/trunk/; revision=1675 2008-08-27 Murray Cumming Return the initial item if the user cancelled the dialog. 2008-08-27 Murray Cumming * glom/base_db.cc offer_field_list(), offer_field_formatting(), offer_imageobject(), offer_notebook(): Return the initial item if the user cancelled the dialog. svn path=/trunk/; revision=1674 2008-08-27 Murray Cumming Added get_item_type_from_selection_data(). create_empty_item(): Mention 2008-08-27 Murray Cumming * glom/mode_design/print_layouts/print_layout_toolbar_button.cc: * glom/mode_design/print_layouts/print_layout_toolbar_button.h: Added get_item_type_from_selection_data(). * glom/mode_design/print_layouts/window_print_layout_edit.cc: create_empty_item(): Mention unhandled items on std::cerr. on_toolbar_item_drag_data_get(): Get the item type correctly. * glom/mode_design/print_layouts/canvas_layout_item.cc: set_layout_item(): Do not reference an empty layout item. svn path=/trunk/; revision=1673 2008-08-27 Murray Cumming Whitespace correction svn path=/trunk/; revision=1672 2008-08-27 Murray Cumming Removed this. 2008-08-27 Murray Cumming * glom/mode_design/print_layouts/action_layout_item.cc: * glom/mode_design/print_layouts/action_layout_item.h: Removed this. * glom/mode_design/print_layouts/Makefile.am: * glom/mode_design/print_layouts/print_layout_toolbar.cc: * glom/mode_design/print_layouts/print_layout_toolbar.h: * glom/mode_design/print_layouts/print_layout_toolbar_button.cc: * glom/mode_design/print_layouts/print_layout_toolbar_button.h: * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Use a toolbar like the details layout toolbar, which use EggToolPallette. * glom/utility_widgets/layouttoolbar.cc: * glom/utility_widgets/layouttoolbarbutton.cc: * glom/utility_widgets/layouttoolbarbutton.h: Use std::string for filenames and parts of filenames. * icons/16x16/Makefile.am: Added placeholder images for extra items used on print layouts. svn path=/trunk/; revision=1671 2008-08-27 Murray Cumming Change the constructor to take an icon name, to reduce some code 2008-08-27 Murray Cumming * glom/utility_widgets/layouttoolbarbutton.cc: * glom/utility_widgets/layouttoolbarbutton.h: Change the constructor to take an icon name, to reduce some code elsewhere. * glom/utility_widgets/layouttoolbar.cc: Adapted. * glom/mode_data/box_data_details.cc: * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/flowtable_dnd.h: Correct whitespace. svn path=/trunk/; revision=1670 2008-08-27 Murray Cumming Improve the tooltips text. 2008-08-27 Murray Cumming * glom/utility_widgets/layouttoolbar.cc: Improve the tooltips text. * glom/utility_widgets/layouttoolbar.h: * po/POTFILES.in: Mention renamed files. svn path=/trunk/; revision=1669 2008-08-24 Armin Burgmeier Set the encoding of the IO channel to read stderr from the child process 2008-08-24 Armin Burgmeier * glom/libglom/spawn_with_feedback.cc (execute_command_line_and_wait_until_second_command_returns_success): Set the encoding of the IO channel to read stderr from the child process from to "", and set it to be unbuffered. Otherwise, we sometimes receive an IO_IN event on Windows, but when trying to read any data, then the read() call blocks the whole process forever. svn path=/trunk/; revision=1668 2008-08-23 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1667 2008-08-23 Armin Burgmeier Locate images relative to application executable on Windows. 2008-08-23 Armin Burgmeier * glom/utility_widgets/layouttoolbar.cc: Locate images relative to application executable on Windows. * win32/build_installer: * win32/glom.iss.in: Added pixmaps to the installer. svn path=/trunk/; revision=1666 2008-08-22 Johannes Schmid Changed names of DragBar to LayoutToolbar and DragButton to 2008-08-22 Johannes Schmid * glom/mode_data/box_data_details.h: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/dragbar.cc (renamed): * glom/utility_widgets/dragbar.h (renamed): * glom/utility_widgets/dragbutton.cc (renamed): * glom/utility_widgets/dragbutton.h (renamed): * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/layouttoolbar.cc: * glom/utility_widgets/layouttoolbar.h: * glom/utility_widgets/layouttoolbarbutton.cc: * glom/utility_widgets/layouttoolbarbutton.h: Changed names of DragBar to LayoutToolbar and DragButton to LayouttoolbarButton svn path=/trunk/; revision=1665 2008-08-22 Armin Burgmeier Print WinSock error code in case the socket() call fails, since socket 2008-08-22 Armin Burgmeier * glom/libglom/connectionpool.cc (discover_first_free_port): Print WinSock error code in case the socket() call fails, since socket errors are not reported via errno on Windows, so perror does not yield a useful error message. * glom/main.cc: Initialize WinSock at startup, so that discover_first_free_port() can use the socket API. svn path=/trunk/; revision=1664 2008-08-22 Johannes Schmid Added menuitem to hide/show the layout toolbar (default: off) 2008-08-22 Johannes Schmid * glom/application.cc: * glom/application.h: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: Added menuitem to hide/show the layout toolbar (default: off) * glom/utility_widgets/dragbutton.h: Added a comment svn path=/trunk/; revision=1663 2008-08-20 Murray Cumming Whitespace corrections. Pass strings as const&. Added a TODO asking for 2008-08-20 Murray Cumming * glom/utility_widgets/dragbar.cc: * glom/utility_widgets/dragbutton.cc: * glom/utility_widgets/dragbutton.h: Whitespace corrections. Pass strings as const&. Added a TODO asking for explanation. This needs to be renamed to something more layout-editing specific. Maybe LayoutToolbar and LayoutToolbarButton. svn path=/trunk/; revision=1662 2008-08-20 Johannes Schmid Added labels to the toolitems 2008-08-20 Johannes Schmid * glom/utility_widgets/dragbar.cc: * glom/utility_widgets/dragbutton.cc: * glom/utility_widgets/dragbutton.h: Added labels to the toolitems * glom/utility_widgets/egg/toolpalette/eggtoolpalette.c (egg_tool_palette_set_style): Fixed a bug in eggtoolpalette (\"toolbar-style\" vs. \"style). Also fixed in libegg trunk. * glom/utility_widgets/sidebar.cc: Use GTK_TOOLBAR_BOTH_HORIZ as toolbar style. (Does only work with gtk+ >= 2.14) svn path=/trunk/; revision=1661 2008-08-20 Johannes Schmid Added tooltips to toolitems 2008-08-20 Johannes Schmid * glom/utility_widgets/dragbar.cc: * glom/utility_widgets/dragbutton.cc: * glom/utility_widgets/dragbutton.h: Added tooltips to toolitems svn path=/trunk/; revision=1660 2008-08-19 Murray Cumming Updated from libegg. 2008-08-19 Murray Cumming * glom/utility_widgets/egg/toolpalette/eggtoolitemgroup.c: * glom/utility_widgets/egg/toolpalette/eggtoolitemgroup.h: * glom/utility_widgets/egg/toolpalette/eggtoolpalette.c: * glom/utility_widgets/egg/toolpalette/eggtoolpalette.h: * glom/utility_widgets/egg/toolpalette/eggtoolpaletteprivate.h: * glom/utility_widgets/egg/toolpalette/testtoolpalette.c: Updated from libegg. * glom/utility_widgets/sidebar.cc: * glom/utility_widgets/sidebar.h: Fixed the whitespace. set_drag_source(): Added the extra parameter for the call to egg_tool_palette_set_drag_source(). svn path=/trunk/; revision=1659 2008-08-15 Armin Burgmeier We use self-built postgresql binaries again, so we don't need to ship all 2008-08-15 Armin Burgmeier * win32/build_installer: * win32/glom.iss.in: We use self-built postgresql binaries again, so we don't need to ship all the libraries the official ones are built against. svn path=/trunk/; revision=1658 2008-08-12 Armin Burgmeier Take a revision number as argument, producing for instance 2008-08-12 Armin Burgmeier * win32/build_installer: Take a revision number as argument, producing for instance glom-setup-1.7.1-2.exe. * win32/glom.iss.in: Hide the components page, since all components are fixed anyway. * README: Added some general information on how the installer is built. svn path=/trunk/; revision=1657 2008-08-12 Murray Cumming show_help() Add a note that this is a replacement for gnome_help_display() 2008-08-12 Murray Cumming * glom/libglom/utils.cc: * glom/libglom/utils.h: show_help() Add a note that this is a replacement for gnome_help_display() until we have something in GTK+. svn path=/trunk/; revision=1656 2008-08-11 Armin Burgmeier Added libeay32.dll and ssleay32.dll to the installer. These seem to be 2008-08-11 Armin Burgmeier * win32/build_installer: * win32/glom.iss.in: Added libeay32.dll and ssleay32.dll to the installer. These seem to be required for libpq.dll, which is in turn required by the libgda postgres provider. svn path=/trunk/; revision=1655 2008-08-11 Og B. Maciel Updated Brazilian Portuguese translation. svn path=/trunk/; revision=1654 2008-08-05 Armin Burgmeier Updated to fit my new build setup. 2008-08-05 Armin Burgmeier * win32/build-installer: * win32/glom.iss.in: * win32/querymodules.bat: Updated to fit my new build setup. svn path=/trunk/; revision=1653 2008-08-05 Armin Burgmeier Changed the path where the example files are looked up on Windows, to keep 2008-08-05 Armin Burgmeier * glom/dialog_existing_or_new.cc: Changed the path where the example files are looked up on Windows, to keep it consistent with the path to load glade files from. svn path=/trunk/; revision=1652 2008-08-01 Claude Paroz Removed non-existent files. Updated French translation by Bruno Brouard 2008-08-01 Claude Paroz * POTFILES.in: Removed non-existent files. * fr.po: Updated French translation by Bruno Brouard and Claude Paroz. svn path=/trunk/; revision=1651 2008-08-01 Claude Paroz Removed translatable property from stock labels. 2008-08-01 Claude Paroz * glom/glom.glade: Removed translatable property from stock labels. svn path=/trunk/; revision=1650 2008-07-31 Djihed Afifi Updated Arabic Translation by Djihed Afifi. svn path=/trunk/; revision=1649 2008-07-25 Gil Forcada Codinachs Fixed POTFILES.in svn path=/trunk/; revision=1648 2008-07-23 Armin Burgmeier Hide the network item on Windows in the initial dialog. 2008-07-23 Armin Burgmeier * glom/existing_or_new.h: * glom/existing_or_new.cc: Hide the network item on Windows in the initial dialog. svn path=/trunk/; revision=1647 2008-07-23 Armin Burgmeier Removed the image from the Select button in the initial dialog. 2008-07-23 Armin Burgmeier * glom/glom.glade: Removed the image from the Select button in the initial dialog. * glom/dialog_existing_or_new.cc: Add the image in the Code, via Gtk::Button::set_image. This way the image is not shown when the theme doesn't show images on buttons, such as the MS-Windows theme. svn path=/trunk/; revision=1646 2008-07-21 Armin Burgmeier #ifdef out the atexit() call on Windows since __libc_freeres() is not 2008-07-21 Armin Burgmeier * glom/main.cc: #ifdef out the atexit() call on Windows since __libc_freeres() is not available there. svn path=/trunk/; revision=1645 2008-07-20 Armin Burgmeier Fixed the non-client-only build. There was a default: marker in a switch 2008-07-20 Armin Burgmeier * glom/application.cc (offer_new_or_existing): Fixed the non-client-only build. There was a default: marker in a switch statement with no code after it. svn path=/trunk/; revision=1644 2008-07-20 Armin Burgmeier Windows build fix: winsock2.h somehow includes a file that defines a 2008-07-20 Armin Burgmeier * glom/libglom/connectionpool.cc: Windows build fix: winsock2.h somehow includes a file that defines a structure called DATADIR, but DATADIR is a define glom uses, which breaks the build. Fixed by #undefining DATADIR for that include. svn path=/trunk/; revision=1643 2008-07-20 Armin Burgmeier Added glom.rc to the distribution, which is required to build Glom on 2008-07-20 Armin Burgmeier * glom/Makefile.am: Added glom.rc to the distribution, which is required to build Glom on Windows. svn path=/trunk/; revision=1642 2008-07-19 Johannes Schmid Don\'t show \"Create database\" tab for client only mode 2008-07-19 Johannes Schmid * glom/dialog_existing_or_new.cc: * glom/dialog_existing_or_new.h: Don\'t show \"Create database\" tab for client only mode svn path=/trunk/; revision=1641 2008-07-17 Johannes Schmid Fixed build with GLOM_ENABLE_CLIENT_ONLY 2008-07-17 Johannes Schmid * glom/application.cc: * glom/application.h: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/layout_item_dialogs/dialog_buttonscript.h: * glom/mode_data/box_data_calendar_related.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/flowtablewithfields.cc: * glom/mode_data/flowtablewithfields.h: * glom/utility_widgets/buttonglom.cc: * glom/utility_widgets/buttonglom.h: * glom/utility_widgets/labelglom.cc: * glom/utility_widgets/labelglom.h: * glom/utility_widgets/layoutwidgetbase.cc: * glom/utility_widgets/layoutwidgetutils.cc: * glom/utility_widgets/layoutwidgetutils.h: * glom/utility_widgets/notebookglom.cc: Fixed build with GLOM_ENABLE_CLIENT_ONLY * glom/main.cc: Allow to pass arguments to Gtk+ like --g-fatal-warnings. Glom did filter those as invalid arguments before svn path=/trunk/; revision=1640 2008-07-10 Petr Kovář cs.po: Fixed Czech translation, thanks to Lucas Lommer (bug #517967). svn path=/trunk/; revision=1639 2008-07-09 Kjartan Maraas Updated Norwegian bokmÃ¥l translation. 2008-07-09 Kjartan Maraas * nb.po: Updated Norwegian bokmÃ¥l translation. svn path=/trunk/; revision=1638 2008-07-03 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1637 2008-06-27 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1636 2008-06-27 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1635 2008-06-23 Gil Forcada Codinachs Updated Catalan translation svn path=/trunk/; revision=1634 2008-06-23 Murray Cumming Increased version svn path=/trunk/; revision=1633 2008-06-21 Murray Cumming Correct ChangeLog svn path=/trunk/; revision=1632 2008-06-21 Murray Cumming on_idle_import(): Corrected the grammar in two strings. 2008-06-21 Murray Cumming * glom/dialog_import_csv_progress.cc: on_idle_import(): Corrected the grammar in two strings. svn path=/trunk/; revision=1631 2008-06-21 Murray Cumming Made on_switch_page_handler() virtual again, so that the list updates 2008-06-21 Murray Cumming * glom/notebook_glom.h (Notebook_Glom): Made on_switch_page_handler() virtual again, so that the list updates again when moving from the details tab. Fixes bug #532721 (Armin Burgmeier). svn path=/trunk/; revision=1630 2008-06-21 Andre Klapper Updated German translation. 2008-06-21 Andre Klapper * de.po: Updated German translation. svn path=/trunk/; revision=1629 2008-06-16 Johannes Schmid Fixed distcheck 2008-06-16 Johannes Schmid * glom/Makefile.am: * glom/utility_widgets/egg/toolpalette/Makefile.am: * glom/utility_widgets/egg/util/Makefile.am: Fixed distcheck svn path=/trunk/; revision=1628 2008-06-16 Johannes Schmid Fixed distcheck 2008-06-16 Johannes Schmid * glom/utility_widgets/egg/toolpalette/Makefile.am: Fixed distcheck svn path=/trunk/; revision=1627 2008-06-16 Johannes Schmid Really add egg directories svn path=/trunk/; revision=1626 2008-06-16 Johannes Schmid Included eggtoolbar instead of using svn:externals to fix distcheck 2008-06-16 Johannes Schmid * configure.in: * glom/Makefile.am: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/dragbar.cc: * glom/utility_widgets/egg/Makefile.am: * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/sidebar.h: * glom/utility_widgets/egg/*: Included eggtoolbar instead of using svn:externals to fix distcheck (#520741) svn path=/trunk/; revision=1625 2008-06-16 Murray Cumming Added comments for translators. Bug #538480 (Andre Klapper). 2008-06-16 Murray Cumming * glom/dialog_existing_or_new.cc: * glom/glom.glade: * glom/utility_widgets/dragbar.cc: Added comments for translators. Bug #538480 (Andre Klapper). svn path=/trunk/; revision=1624 2008-06-15 Andre Klapper Updated German translation. 2008-06-15 Andre Klapper * de.po: Updated German translation. svn path=/trunk/; revision=1623 2008-06-10 Claude Paroz Added fr to DOC_LINGUAS. Added French translation. Translated screenshots. 2008-06-10 Claude Paroz * Makefile.am: Added fr to DOC_LINGUAS. * fr/fr.po: Added French translation. * fr/figures/*: Translated screenshots. svn path=/trunk/; revision=1622 2008-06-09 Kjartan Maraas Remove executable bit svn path=/trunk/; revision=1621 2008-06-07 Armin Burgmeier Check whether the strptime function is available. 2008-06-07 Armin Burgmeier * configure.in: * config.h.in: Check whether the strptime function is available. * glom/libglom/data_structure/glomconversions.cc (parse_time): Don't fall back to strptime if strptime is not available, such as on Windows (mingw). * glom/dialog_existing_or_new.h: * glom/dialog_existing_or_new.cc: * glom/dialog_import_csv.cc: Windows build fixes, mostly #ifndef/#endif pairs around libepc stuff. We also need to #undef iconv which seems to be a define to libiconv on Windows, in order to use the Glib::Iconv::iconv function. * glom/main.cc: Don include on Windows since it is not available. It doesn't seem to be used anyway. svn path=/trunk/; revision=1620 2008-06-01 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1619 2008-05-25 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles and suggestions from Eloy Alejandro Lautaro svn path=/trunk/; revision=1618 2008-05-23 Armin Burgmeier Added from_sql() to convert a SQL representation to a Gnome::Gda::Value. 2008-05-23 Armin Burgmeier * glom/libglom/data_structure/field.h: * glom/libglom/data_structure/field.cc: Added from_sql() to convert a SQL representation to a Gnome::Gda::Value. This is the reverse to the sql() function. * glom/dialog_import_csv.cc (field_data_func): Remove own unescaping code, use Field::from_sql() for preview instead. * glom/dialog_import_csv_progress.cc (on_idle_import): Use Field::from_sql() to do the actual import. This allows to correctly import files that the Export functionality produces, escpecially dates and images. svn path=/trunk/; revision=1617 2008-05-22 Johannes Schmid Fixed some crashers when starting a drag from no item 2008-05-22 Johannes Schmid * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/flowtable_dnd.h: Fixed some crashers when starting a drag from no item svn path=/trunk/; revision=1616 2008-05-22 Johannes Schmid Add item at the end of the group instead of losing it 2008-05-22 Johannes Schmid * glom/libglom/data_structure/layout/layoutgroup.cc: (add_item) Add item at the end of the group instead of losing it * glom/utility_widgets/flowtable_dnd.cc: (on_child_drag_motion): Fix flickering of placeholder on bigger objects like images or text boxes svn path=/trunk/; revision=1615 2008-05-21 Johannes Schmid Add images as possible drag items to the sidebar and adjust flowtable to 2008-05-21 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: (on_dnd_add_layout_item_image) * glom/mode_data/flowtablewithfields.h: * glom/utility_widgets/dragbar.cc (DragBar): * glom/utility_widgets/flowtable_dnd.cc (on_drag_data_received): * glom/utility_widgets/flowtable_dnd.h (FlowTableDnd): * glom/utility_widgets/layoutwidgetbase.h: Add images as possible drag items to the sidebar and adjust flowtable to accept images. svn path=/trunk/; revision=1614 2008-05-18 Murray Cumming Minor string corrections. 2008-05-18 Murray Cumming * docs/user-guide/C/glom.xml: * glom/dialog_import_csv.cc: Minor string corrections. svn path=/trunk/; revision=1613 2008-05-18 Johannes Schmid Corrected indentation 2008-05-18 Johannes Schmid * glom/Makefile.am: Corrected indentation * glom/mode_data/flowtablewithfields.cc: (add_field_at_position): Put labels for fields into their own EventBox * glom/utility_widgets/flowtable_dnd.cc: (start_dnd), (stop_dnd), (find_current_dnd_item), (on_child_drag_begin) (on_child_drag_data_delete): * glom/utility_widgets/flowtable_dnd.h: Allow moving of items fields through drag and drop svn path=/trunk/; revision=1612 2008-05-16 Armin Burgmeier Added some more encodings, differentiate between encoding name and 2008-05-15 Armin Burgmeier * glom/dialog_import_csv.h: * glom/dialog_import_csv.cc: Added some more encodings, differentiate between encoding name and charset. * glom/application.cc (init_menus_file), (init_menus): Moved the Import menu item from Tables to File menu. * glom/frame_glom.h: * glom/frame_glom.cc: Renamed the function from on_menu_Tables_ImportIntoTable() to on_menu_file_import(). svn path=/trunk/; revision=1611 2008-05-13 Armin Burgmeier Added missing functionality. 2008-05-13 Armin Burgmeier * glom/dialog_import_csv.h: * glom/dialog_import_csv.cc: Added missing functionality. * glom/glom.glade: * glom/dialog_import_csv_progress.h: * glom/dialog_import_csv_progress.cc: * glom/Makefile.am: Dialog showing progress of the import and error messages, performing the actual import. * glom/frame_glom.cc (on_menu_Tables_ImportIntoTable): Show the progress dialog after the user has finished the settings in the "Import from CSV" dialog, refresh display after import so the list and details show the imported values. * docs/user-guide/C/glom.xml: Added an initial explanation for the Import Dialog. svn path=/trunk/; revision=1610 2008-05-09 Gabor Kelemen Remove some duplicates introduced in my previous commit. 2008-05-09 Gabor Kelemen * POTFILES.in: Remove some duplicates introduced in my previous commit. svn path=/trunk/; revision=1609 2008-05-09 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1608 2008-05-09 Gabor Kelemen Updated, fix #530195 2008-05-09 Gabor Kelemen * POTFILES.in: Updated, fix #530195 svn path=/trunk/; revision=1607 2008-05-06 Murray Cumming on_list_user_requested_details(): Improve my fix from 2008-04-30: Call 2008-05-06 Murray Cumming * glom/mode_data/notebook_data.cc: on_list_user_requested_details(): Improve my fix from 2008-04-30: Call refresh_data_from_database_with_primary_key() again, but stop the switch-page handler from running, so that we really see the details for the row when clicking on the record in the list view. svn path=/trunk/; revision=1605 2008-05-06 Murray Cumming init_db_details(): Fix an if to avoid showing the list view when we want 2008-05-06 Murray Cumming * glom/mode_data/notebook_data.cc: init_db_details(): Fix an if to avoid showing the list view when we want the details view, just because the details view is already showing. * glom/mode_data/notebook_data.h * glom/mode_find/notebook_find.h * glom/notebook_glom.h: Removed some unnecessary virtuals. svn path=/trunk/; revision=1604 2008-05-05 Murray Cumming constructor: Use add_view() to give the DbAddDel access to the document, 2008-05-05 Murray Cumming * glom/mode_data/box_data_list_related.cc: constructor: Use add_view() to give the DbAddDel access to the document, to avoid the repeated warning about the unexpected field type svn path=/trunk/; revision=1603 2008-05-04 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1602 2008-05-02 Murray Cumming Get the primary key index (inefficiently) even if the primary key was 2008-05-02 Murray Cumming * glom/mode_data/box_data_details.cc fill_from_database(): Get the primary key index (inefficiently) even if the primary key was already in the list, allowing record editing to work again. Fixes bug #530879 (Armin Burgmeier) svn path=/trunk/; revision=1601 2008-05-02 Johannes Schmid Fixed a stupid bug in the dnd code that caused dropping problems all over. 2008-05-02 Johannes Schmid * glom/utility_widgets/flowtable_dnd.cc (on_child_drag_motion): Fixed a stupid bug in the dnd code that caused dropping problems all over. svn path=/trunk/; revision=1600 2008-04-30 Murray Cumming on_list_user_requested_details(): Do not call 2008-04-30 Murray Cumming * glom/mode_data/notebook_data.cc: on_list_user_requested_details(): Do not call Box_Data_Details::refresh_data_from_database_with_primary_key() because on_switch_page_handler() does it later. This avoids an unnecessary extra refresh of the details view. * glom/libglom/data_structure/layout/layoutitem_field.h: Added predicate_LayoutItem_Field_IsSameField for use with std::find_if(). * glom/mode_data/box_data_details.cc: fill_from_database(): Do not add the primary key to the list twice, to avoid setting it twice, to avoid refreshing portals twice. svn path=/trunk/; revision=1599 2008-04-29 Johannes Schmid glom/mode_data/flowtablewithfields.h (on_dnd_add_layout_item) Added new 2008-04-29 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: * glom/mode_data/flowtablewithfields.h (on_dnd_add_layout_item) Added new method to reparent items from other flowtables. * glom/utility_widgets/flowtable_dnd.cc (start_dnd), (on_drag_motion), (on_drag_data_received), (dnd_item_at_position), (dnd_datawidget_from_item), (find_current_dnd_item), (on_child_drag_motion), (on_child_drag_data_get), (on_child_drag_begin), (on_child_drag_end): * glom/utility_widgets/flowtable_dnd.h Implemented drag sources for LayoutWidgets and allow dragging in and between flowtables. Only works for labels as I didn\'t find out yet how to set other widgets as drag sources. * glom/utility_widgets/layoutwidgetbase.cc (set_dnd_in_progress), (get_dnd_in_progress): * glom/utility_widgets/layoutwidgetbase.h: Added some need methods for drag and drop svn path=/trunk/; revision=1598 2008-04-29 Murray Cumming Large refactoring of the Base_DB_* and Box_DB_* hierarchy to make it 2008-04-29 Murray Cumming Large refactoring of the Base_DB_* and Box_DB_* hierarchy to make it simpler and less hacky. * docs/developer_reference/Doxyfile: Added this, so you can do doxygen Doxyfile to get some HTML to help understand the code. * glom/signal_reemitter.h: Added signal_connect_for_reemit_*args(), to make it easier to just emit a signal in response to another one, for instance to emit up to a parent widget. * regression_tests/Makefile.am: * regression_tests/test_signal_reemit.cc: Added a test for this. * glom/Makefile.am: * glom/base_db.[h|cc]: Split this, to create: * glom/base_db_table.[h|cc] * glom/base_db_table_data.[h|cc]: with some stuff from Box_DB_Table. * glom/box_db.[h|cc]: Renamed to * glom/box_withbuttons.[h|cc] because that's all this is now. * glom/box_db_table.[h|cc]: Derive from Base_DB_Table, instead of implementing so much stuff. * glom/mode_data/Makefile.am: * glom/mode_data/box_data.[h|cc]: Derive from Box_WithButtons, and Base_DB_Table_Data instead of implementing so much stuff. * glom/mode_data/box_data_details.[h|cc] * glom/mode_data/box_data_manyrecords.cc[h|cc]: Added this base class for: * glom/mode_data/box_data_list.[h|cc] and Box_Data_Portal: * glom/mode_data/box_data_portal.cc[h|cc]: Added this base class for * glom/mode_data/box_data_calendar_related.[h|cc] and * glom/mode_data/box_data_list_related.[h|cc] * glom/utility_widgets/db_adddel/db_adddel.[h|cc] Derive from Base_DB_Table_Data, to use its implementation, to move lots of code for record adding, changing, and deleting into this widget instead of having decisions in the parent Box_Data_List_Related and Box_Data_List. This is simpler. svn path=/trunk/; revision=1597 2008-04-29 Murray Cummin Large refactoring of the Base_DB_* and Box_DB_* hierarchy to make it 2008-04-29 Murray Cummin Large refactoring of the Base_DB_* and Box_DB_* hierarchy to make it simpler and less hacky. * docs/developer_reference/Doxyfile: Added this, so you can do doxygen Doxyfile to get some HTML to help understand the code. * glom/signal_reemitter.h: Added signal_connect_for_reemit_*args(), to make it easier to just emit a signal in response to another one, for instance to emit up to a parent widget. * regression_tests/Makefile.am: * regression_tests/test_signal_reemit.cc: Added a test for this. * glom/Makefile.am: * glom/base_db.[h|cc]: Split this, to create: * glom/base_db_table.[h|cc] * glom/base_db_table_data.[h|cc]: with some stuff from Box_DB_Table. * glom/box_db.[h|cc]: Renamed to * glom/box_withbuttons.[h|cc] because that's all this is now. * glom/box_db_table.[h|cc]: Derive from Base_DB_Table, instead of implementing so much stuff. * glom/mode_data/Makefile.am: * glom/mode_data/box_data.[h|cc]: Derive from Box_WithButtons, and Base_DB_Table_Data instead of implementing so much stuff. * glom/mode_data/box_data_details.[h|cc] * glom/mode_data/box_data_manyrecords.cc[h|cc]: Added this base class for: * glom/mode_data/box_data_list.[h|cc] and Box_Data_Portal: * glom/mode_data/box_data_portal.cc[h|cc]: Added this base class for * glom/mode_data/box_data_calendar_related.[h|cc] and * glom/mode_data/box_data_list_related.[h|cc] * glom/utility_widgets/db_adddel/db_adddel.[h|cc] Derive from Base_DB_Table_Data, to use its implementation, to move lots of code for record adding, changing, and deleting into this widget instead of having decisions in the parent Box_Data_List_Related and Box_Data_List. This is simpler. svn path=/trunk/; revision=1596 2008-04-26 Armin Burgmeier Added yet unfinished "Import from CSV" dialog. 2008-04-26 Armin Burgmeier * glom/glom.glade: * glom/dialog_import_csv.h: * glom/dialog_import_csv.cc: * glom/Makefile.am: Added yet unfinished "Import from CSV" dialog. * glom/frame_glom.h: * glom/frame_glom.cc: Added Frame_Glom::on_menu_Tables_ImportIntoTable to launch the import dialog. * glom/application.cc (init_menus): Added an action for the "Import Into Table" menu item. svn path=/trunk/; revision=1595 2008-04-25 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1594 2008-04-25 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1593 2008-04-25 Jeremiah Savage Add includes to fix the build with gcc 4.3. Bug #529530 2008-04-25 Jeremiah Savage * glom/libglom/connectionpool.cc: * glom/libglom/data_structure/glomconversions.cc: * glom/libglom/document/document_glom.h: * glom/libglom/utils.cc: * glom/translation/window_translations.cc: Add includes to fix the build with gcc 4.3. Bug #529530 svn path=/trunk/; revision=1592 2008-04-23 Murray Cumming Use &app; instead of &glom; because &glom; is not defined. 2008-04-24 Murray Cumming * C/glom.xml: Use &app; instead of &glom; because &glom; is not defined. svn path=/trunk/; revision=1589 2008-04-23 Murray Cumming constructor: Added : at the end of labels, as per the GNOME HIG. 2008-04-23 Murray Cumming * glom/glom_developer.glade: * glom/utility_widgets/datawidget.cc: constructor: Added : at the end of labels, as per the GNOME HIG. svn path=/trunk/; revision=1588 2008-04-22 Murray Cumming parse_time(): Fall back to using strptime(), in various formats, so we can 2008-04-22 Murray Cumming * glom/libglom/data_structure/glomconversions.cc: parse_time(): Fall back to using strptime(), in various formats, so we can parse 01:00 PM and 13:00, instead of parsing these as 01:00 AM. * Makefile.am: * configure.in: * regression_tests/Makefile.am: * regression_tests/test_parsing_time.cc: Added a test for this time parsing. svn path=/trunk/; revision=1586 2008-04-22 Johannes Schmid Call FlowTableDnd::set_design_mode() if appropriate 2008-04-22 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: (set_design_mode): Call FlowTableDnd::set_design_mode() if appropriate * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: (forall), (container_forall_callback): Implement forall() with is not implement for Gtk::Container (setup_dnd): Remove this and do all dnd stuff in flowtable_dnd * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/flowtable_dnd.h: (set_design_mode), (start_dnd), (stop_dnd): Override set_design_mode() and call start_dnd() and stop_dnd() there. Preparation for moving items around and setting them as drag source. svn path=/trunk/; revision=1585 2008-04-22 Murray Cumming Added missing files svn path=/trunk/; revision=1584 2008-04-22 Murray Cumming glom/mode_data/box_data_calendar_related.h Update the calendar details 2008-04-22 Murray Cumming * glom/mode_data/box_data_calendar_related.h * glom/mode_data/box_data_calendar_related.cc on_calendar_month_changed(): Update the calendar details when the user navigates to a different month. svn path=/trunk/; revision=1583 2008-04-22 Murray Cumming Added a new example, which uses a calendar. 2008-04-22 Murray Cumming * examples/example_lesson_planner.glom: * examples/Makefile.am: Added a new example, which uses a calendar. * glom/mode_data/box_data_calendar_related.h * glom/mode_data/box_data_calendar_related.cc: fill_from_database(): Do one SQL query for the whole month and store the values. on_calendar_details(): Show the stored values. * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: Removed get_fields_to_show() because it is in the base class. svn path=/trunk/; revision=1582 2008-04-21 Murray Cumming Removed get_has_suitable_record_to_view_details(), 2008-04-21 Murray Cumming * glom/mode_data/box_data_calendar_related.cc (Glom.on_calendar_details): * glom/mode_data/box_data_calendar_related.h (Box_Data_Calendar_Related): * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: Removed get_has_suitable_record_to_view_details(), get_suitable_table_to_view_details() and get_suitable_record_to_view_details() because they are in the base Box_Data_Portal) class. * glom/mode_data/box_data_portal.cc: * glom/mode_data/box_data_portal.h: Removed unused empty create_layout_dialog() and prepare_layout_dialog * glom/mode_data/flowtablewithfields.h: * glom/mode_data/flowtablewithfields.cc: get_portals(): Get a list of Box_Data_Portal instead of Widget, to make this more self-documenting. set_field_value(): Do not dynamic_cast to just Box_Data_List_Related, so that Box_Data_Calendar_Related is updated too, to show just the related records, instead of all. svn path=/trunk/; revision=1581 2008-04-21 Murray Cumming glom/combobox_fields.h Added set_fields() that takes a field type to 2008-04-21 Murray Cumming * glom/Makefile.am: * glom/combobox_fields.h * glom/combobox_fields.cc: Added set_fields() that takes a field type to reduce the list. * glom/glom_developer.glade: window_data_layout(): Added a Add Related Calendar button and added a Date section, which is hidden for the existing layout dialogs. * glom/libglom/data_structure/layout/Makefile.am: Added layoutitem_calendarportal.[h|cc] * glom/libglom/document/document_glom.cc load_after_layout_group(), Glom.save_before_layout_group(): Handle LayoutItem_CalendarPortal items. * glom/mode_data/Makefile.am: * glom/mode_data/box_data_portal.cc * glom/mode_data/box_data_portal.h: Added this new base class for related records widgets, using LayoutItem_Portal as the base class for their layout data. * glom/mode_data/box_data_list_related.cc * glom/mode_data/box_data_list_related.h: Derive from Box_Data_Portal, to which some of the code has moved. * glom/mode_data/box_data_calendar_related.cc * glom/mode_data/box_data_calendar_related.h: Added this new portal, which shows the related records in a calendar. * glom/mode_data/dialog_layout_calendar_related.cc * glom/mode_data/dialog_layout_calendar_related.h: * glom/mode_data/dialog_layout_details.h * glom/mode_data/dialog_layout_details.cc: Allow adding of a related calendar portal. * glom/mode_data/dialog_layout_list.cc (Glom.Dialog_Layout_List): * glom/mode_data/flowtablewithfields.cc * glom/mode_data/flowtablewithfields.h: Handle Box_Data_Portal instead of just Box_Data_List_Related, and handle Box_Data_Calendar_Related specifically where necessary. * glom/utility_widgets/calendar/Makefile.am: Fixed a typo. * glom/utility_widgets/calendar/glomgtkcalendar.c (glom_gtk_calendar_init, glom_gtk_calendar_new): Use the correct GType. svn path=/trunk/; revision=1580 2008-04-21 Murray Cumming Moved dialog_data_invalid_format to the non-developer .glade file, where 2008-04-21 Murray Cumming * glom/glom.glade: * glom/glom_developer.glade: Moved dialog_data_invalid_format to the non-developer .glade file, where the code expects it to be, preventing a crash. svn path=/trunk/; revision=1579 2008-04-21 Murray Cumming Reverted the last change. I did not mean to check that in yet. svn path=/trunk/; revision=1578 2008-04-21 Murray Cumming Moved dialog_data_invalid_format to the non-developer .glade file, where 2008-04-21 Murray Cumming * glom/glom.glade: * glom/glom_developer.glade: Moved dialog_data_invalid_format to the non-developer .glade file, where the code expects it to be, preventing a crash. svn path=/trunk/; revision=1577 2008-04-17 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1576 2008-04-17 Claude Paroz Completed previous uncomplete ChangeLog svn path=/trunk/; revision=1575 2008-04-17 Claude Paroz Removed translatable properties for stock labels. 2008-04-17 Claude Paroz * glom/glom.glade: * glom/glom_developer.glade: Removed translatable properties for stock labels. svn path=/trunk/; revision=1574 2008-04-16 Murray Cumming Remove sentences saying that names should not have spaces or special 2008-04-16 Murray Cumming * docs/user-guide/C/glom.xml: Remove sentences saying that names should not have spaces or special characters, because they can. Bug #528209 (Jean-François Fortin Tam) svn path=/trunk/; revision=1572 2008-04-15 Armin Burgmeier Made the show_layout_dialog() function non-virtual and added two new 2008-04-15 Armin Burgmeier * glom/mode_data/box_data.h: * glom/mode_data/box_data.cc: Made the show_layout_dialog() function non-virtual and added two new (pure) virtual functions called create_layout_dialog() and prepare_layout_dialog(). Create the dialog in show_layout_dialog() if necessary, so the dialog is only created when needed. * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_details.cc: Implement the two new virtual functions. * glom/mode_data/box_data_list_related.h: * glom/mode_data/box_data_calendar_related.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_calendar_related.cc: Removed the m_pLayoutDialogRelated variable, and implement the two new virtual functions instead. Removed the destructor which is no longer required. (on_dialog_layout_hide): Cast m_pDialogLayout to a Dialog_Layout_List_Related before usage. These changes clean up the code in Box_Data_List_Related a bit. svn path=/trunk/; revision=1570 2008-04-15 Murray Cumming glom/mode_data/box_data.cc add_related_record_for_field(): Added a 2008-04-15 Murray Cumming * glom/mode_data/box_data.cc * glom/mode_data/box_data.h: add_related_record_for_field(): Added a primary_key_value_used output parameter so that the caller nows what record was actually created. * glom/mode_data/box_data_details.cc: on_flowtable_field_edited(): * glom/mode_data/box_data_list.cc: on_adddel_user_changed(): Use the new output parameter instead of calling get_entered_field_data(), so that automatically-created related records are really linked from the parent record even when the ID is not on the layout. This fixes bug #526386 (Jani Monoses). svn path=/trunk/; revision=1569 2008-04-15 Murray Cumming get_related_record_exists(): Don't bother looking for a record with the 2008-04-15 Murray Cumming * glom/mode_data/box_data.cc: get_related_record_exists(): Don't bother looking for a record with the key NULL, because that is not something we want to related records by. * glom/mode_data/box_data_list.cc: on_adddel_user_changed(): Get full field details for the related field, to ensure that this works properly. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc fill_values_if_necessary(): Use Conversions::get_empty_value() instead of just creating a Gda::Value of the expected type, so we get a NULL GdaValue initially for appropriate field types. This fixes the automatic creation of related records, at least when the from field is on the layout, partially fixing bug #526386 (Jani Monoses). svn path=/trunk/; revision=1567 2008-04-15 Johannes Schmid Set layout item for notebook and use notebooklabelglom 2008-04-15 Johannes Schmid * glom/mode_data/flowtablewithfields.cc (add_layout_notebook_at_position): Set layout item for notebook and use notebooklabelglom * glom/utility_widgets/notebookglom.cc (delete_from_layout): * glom/utility_widgets/notebookglom.h (GLOM_UTILITY_WIDGETS_NOTEBOOK_GLOM_H): Fixed typo in header and added delete method * glom/utility_widgets/Makefile.am: * glom/utility_widgets/notebooklabelglom.cc: * glom/utility_widgets/notelabelbookglom.h: Added new tab widget for notebook to be able to attach a popupmenu Summary: Added popup-menu to notebook tabs to add new groups and delete the notebook. svn path=/trunk/; revision=1565 2008-04-14 Murray Cumming glom/utility_widgets/adddel/adddel.h Removed unnecessary virtuals on 2008-04-14 Murray Cumming * glom/utility_widgets/adddel/adddel.h * glom/utility_widgets/adddel/adddel_withbuttons.h: Removed unnecessary virtuals on methods. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Removed unused siganl_user_activated (though it is used in AddDel). svn path=/trunk/; revision=1563 2008-04-14 Murray Cumming glom/utility_widgets/adddel/adddel.h Glom.construct_specified_columns(): 2008-04-14 Murray Cumming, * glom/utility_widgets/adddel/adddel.h * glom/utility_widgets/adddel/adddel.cc: Glom.construct_specified_columns(): Connect to the start_editing signal., Glom.on_treeview_cell_edited. Emit user_activated() on that instead of on the TreeView::button-press-event signal, so that any previous editing has already finished. This fixes the relationships window, so that clicking on the To Field combo does not lose the new choice in the Table combo. Bug #526900 (Jani Monoses). svn path=/trunk/; revision=1561 2008-04-13 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1560 2008-04-13 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1559 2008-04-13 Armin Burgmeier Simplified the function, removed the request_password parameter. It was 2008-04-13 Armin Burgmeier * glom/frame_glom.h: * glom/frame_glom.cc (create_database): Simplified the function, removed the request_password parameter. It was never set, and it seemed to be a relict from libgda-1.2. (connection_request_password_and_choose_new_database_name), (connection_request_password_and_attempt): Create the connection dialog when required, instead of loading it in the constructor, to improve startup time. * glom/dialog_existing_or_new.h: Added a comment about bug #527587. * glom/application.cc (recreate_database), (existing_or_new_new): Adapt to changed create_database() function in frame_glom. svn path=/trunk/; revision=1558 2008-04-11 Murray Cumming Remove the ActionGroups before recreating them to avoid warnings, and 2008-04-11 Murray Cumming * glom/application.cc fill_menu_tables(), fill_menu_reports(), fill_menu_print_layouts(): Remove the ActionGroups before recreating them to avoid warnings, and presumably to avoid the changes from being ignored. Maybe GTK+ svn trunk has become less tolerant. * glom/glom_developer.glade: Restored some GtkSourceViews, and put one in a scrolled window as it was before. svn path=/trunk/; revision=1556 2008-04-11 Armin Burgmeier :show_help): Replace gnome_help_display by constructing a path to the help 2008-04-11 Armin Burgmeier * glom/libglom/utils.cc (Utils::show_help): Replace gnome_help_display by constructing a path to the help file, making a ghelp: URI out of it and passing it to g_app_info_launch_default_for_uri(). * glom/xsl_utils.cc (GlomXslUtils::transform_and_open): Replace gnome_url_show by g_app_info_launch_default_for_uri(). * glom/main.cc (main): Don't call gnome_program_init(). * configure.in: Remove the libgnome dependency. svn path=/trunk/; revision=1555 2008-04-11 Johannes Schmid glom/mode_data/box_data_details.h Moved sidebar into \"Details\"-page 2008-04-11 Johannes Schmid * glom/application.cc (update_userlevel_ui): * glom/application.h: * glom/mode_data/box_data_details.cc (create_layout): * glom/mode_data/box_data_details.h Moved sidebar into \"Details\"-page * glom/utility_widgets/sidebar.cc (on_child_detached),(on_child_attached): * glom/utility_widgets/sidebar.h: Made sidebar detachable again and give it a correct size when detached svn path=/trunk/; revision=1554 2008-04-11 Johannes Schmid glom/layout_item_dialogs/dialog_buttonscript.h Added new entry for the 2008-04-11 Johannes Schmid * glom/glom_developer.glade: * glom/layout_item_dialogs/dialog_buttonscript.cc (Dialog_ButtonScript), (set_script), (get_script), (get_script): * glom/layout_item_dialogs/dialog_buttonscript.h Added new entry for the button title to the dialog * glom/mode_data/flowtablewithfields.cc (FlowTableWithFields): * glom/utility_widgets/buttonglom.cc (on_menu_properties_activate): * glom/utility_widgets/buttonglom.h: * glom/utility_widgets/labelglom.cc: * glom/utility_widgets/layoutwidgetutils.cc: * glom/utility_widgets/layoutwidgetutils.h (m_pPopupMenuUtils) (m_refUtilProperties): Removed \"Details\" menu item as ButtonGlom has a dialog for all properties now. svn path=/trunk/; revision=1553 2008-04-10 Murray Cumming Improved the text about the initial dialog. 2008-04-10 Murray Cumming * docs/user-guide/C/glom.xml: Improved the text about the initial dialog. * glom/dialog_existing_or_new.cc: * glom/dialog_existing_or_new.h: Added on_existing_select_func() and on_new_select_func() select_function handlers, to prevent selection of the parent nodes, which would be meaningless. svn path=/trunk/; revision=1552 2008-04-10 Murray Cumming glom/dialog_existing_or_new.cc Removed the second text-button column. I 2008-04-10 Murray Cumming * glom/dialog_existing_or_new.cc * glom/dialog_existing_or_new.h: Removed the second text-button column. I changed my mind about this. It doesn't feel useful - a double-click on the regular title makes more sense. svn path=/trunk/; revision=1551 2008-04-10 Armin Burgmeier Re-set scrolledwindow shadows to IN in initial dialog since this is what 2008-04-10 Armin Burgmeier * glom/glom.glade: Re-set scrolledwindow shadows to IN in initial dialog since this is what other treeviews have. svn path=/trunk/; revision=1550 2008-04-10 Armin Burgmeier Added a help button, reordered Quit/Select buttons, remove mnemonics from 2008-04-10 Armin Burgmeier * glom/glom.glade: Added a help button, reordered Quit/Select buttons, remove mnemonics from the tab labels as suggested by the HIG. Removed the separator and added a tooltip for the select button. * glom/dialog_existing_or_new.h: * glom/dialog_existing_or_new.cc (constructor): Reordered items in existing_model, use a cell data func for the item's title so we can change the color when necessary, expand the recent items by default. Add a dummy item telling that there are no documents in this category if there are none. (on_service_found, on_service_removed): Create/Remove that dummy item accordingly. (on_stream_read): Remove the dummy item for the "New From Template" category, expand the "New From Template" category if this was the first item discovered. * glom/application.cc (offer_new_or_existing): Use Utils::dialog_run_with_help() to make the Help button work. * docs/user-guide/C/glom.xml: Added an initial text for the Help button of the initial dialog. svn path=/trunk/; revision=1549 2008-04-10 Murray Cumming Corrected over-zealous search/replace in ChangeLog svn path=/trunk/; revision=1546 2008-04-10 Murray Cumming Call the previously-set SIGSEGV handler, to hopefully make bug-buddy or 2008-04-10 Murray Cumming * glom/libglom/connectionpool.cc (on_linux_signal): Call the previously-set SIGSEGV handler, to hopefully make bug-buddy or apport catch (and report) crashes again. svn path=/trunk/; revision=1545 2008-04-10 Murray Cumming glom/libglom/spawn_with_feedback.h 2008-04-10 Murray Cumming * glom/libglom/spawn_with_feedback.h * glom/libglom/spawn_with_feedback.cc (get_and_show_pulse_dialog, execute_command_line_and_wait, execute_command_line_and_wait_until_second_command_returns_success): * glom/libglom/connectionpool.h * glom/libglom/connectionpool.cc: start_self_hosting(), stop_self_hosting(), create_self_hosting(): Added parent_window parameter, so that any dialogs can be transient for it. * glom/application.cc on_document_load(), stop_self_hosting_of_document_database(): Call start/stop_self_hosting() with the parent_window parameter. * glom/frame_glom.cc: connection_request_password_and_choose_new_database_name(): * glom/libglom/document/document_glom.cc: Call start/stop_self_hosting() with the parent_window parameter. This should prevent these windows from being system-modal when using the xfwm4 window manager. Bug #525285 (Jani Monoses) svn path=/trunk/; revision=1544 2008-04-09 Murray Cumming Fixed the ChangeLog svn path=/trunk/; revision=1543 2008-04-09 Murray Cumming glom/libglom/data_structure/layout/layoutgroup.cc Added has_any_fields(). 2008-04-09 Murray Cumming * glom/libglom/data_structure/layout/layoutgroup.cc * glom/libglom/data_structure/layout/layoutgroup.h: Added has_any_fields(). * glom/libglom/document/document_glom.cc * glom/libglom/document/document_glom.h Added get_data_layout_groups_have_any_fields(). * glom/mode_data/box_data_details.cc on_button_new(): * glom/mode_data/box_data_list.cc on_adddel_user_requested_add(): Warn the user if the layout has no dialogs, and do not try to add a record, because there would be nothing to see an no way to enter data. svn path=/trunk/; revision=1542 2008-04-09 Johannes Schmid Found one more wrong change 2008-04-09 Johannes Schmid * glom/glom_developer.glade: Found one more wrong change svn path=/trunk/; revision=1541 2008-04-09 Johannes Schmid Fix crasher when opening GlomButton details dialog 2008-04-09 Johannes Schmid * glom/glom_developer.glade: Fix crasher when opening GlomButton details dialog * glom/utility_widgets/Makefile.am: Move flowtable_dnd.[cch] in !GLOM_CLIENT_ONLY section svn path=/trunk/; revision=1539 2008-04-09 Murray Cumming Check that the treemodel is not null before dereferencing it. This fixes a 2008-04-09 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc get_item_placeholder(), Glom.get_item_selected(), on_cell_layout_button_clicked(), remove_item(), on_treeview_cell_edited_bool(), on_treeview_cell_edited(), on_treeview_button_press_event(), get_last_row(), get_last_row, set_value_key(), get_is_placeholder_row,() on_cell_button_clicked(): Check that the treemodel is not null before dereferencing it. This fixes a crash when trying to add a record when there is no primary key. Bug #527007 (Jean-François Fortin Tam) svn path=/trunk/; revision=1538 2008-04-09 Murray Cumming Destructor: Remove my hack to delete child widgets, because it causes 2008-04-09 Murray Cumming * glom/utility_widgets/flowtable.cc: Destructor: Remove my hack to delete child widgets, because it causes double deletes. svn path=/trunk/; revision=1536 2008-04-08 Johannes Schmid Added operator! for convenience 2008-04-08 Johannes Schmid * glom/libglom/sharedptr.h (operator!): Added operator! for convenience * glom/mode_data/flowtablewithfields.cc * glom/mode_data/flowtablewithfields.h: (FlowTableWithFields): Removed setup_menu() (on_menu_delete_activate): Added a confirmation dialog * glom/utility_widgets/Makefile.am: * glom/utility_widgets/layoutwidgetmenu.cc: * glom/utility_widgets/layoutwidgetmenu.h: * glom/utility_widgets/layoutwidgetbase.cc: * glom/utility_widgets/layoutwidgetbase.h: Moved menu code from LayoutWidgetBase into it\'s own class (on_menupopup_activate_delete): Added a menu item to delete fields * glom/utility_widgets/buttonglom.cc: * glom/utility_widgets/buttonglom.h: * glom/utility_widgets/labelglom.cc: * glom/utility_widgets/labelglom.h: Derive from LayoutWidgetUtils, removed setup_menu() call in constructors * glom/utility_widgets/datawidget.h: * glom/utility_widgets/notebookglom.h: * glom/utility_widgets/layoutwidgetfield.h: Derive from LayoutWidgetMenu * glom/utility_widgets/layoutwidgetutils.cc: * glom/utility_widgets/layoutwidgetutils.h: Derive from LayoutWidgetBase (on_menu_delete_activate): Added menu item to delete layout items * glom/utility_widgets/placeholder-glom.cc: Removed setup_menu() call svn path=/trunk/; revision=1535 2008-04-08 Murray Cumming Added this test. 2008-04-08 Murray Cumming * glom/libglom/Makefile.am: * glom/libglom/test_connectionpool.cc: Added this test. * glom/utility_widgets/Makefile.am: * glom/utility_widgets/test_flowtable.cc: Revived this test. svn path=/trunk/; revision=1534 2008-04-07 Murray Cumming Removed some debug output. svn path=/trunk/; revision=1533 2008-04-07 Murray Cumming Refuse to change a field name to one that already exists. 2008-04-07 Murray Cumming * glom/mode_design/fields/box_db_table_definition.cc check_field_change(): Refuse to change a field name to one that already exists. svn path=/trunk/; revision=1532 2008-04-07 Johannes Schmid Really comitted last change (was in conflict) 2008-04-07 Johannes Schmid * glom/utility_widgets/flowtable.cc: Really comitted last change (was in conflict) svn path=/trunk/; revision=1530 2008-04-07 Johannes Schmid Derive from FlowTableDnd if not in CLIENT_ONLY mode 2008-04-07 Johannes Schmid * glom/mode_data/flowtablewithfields.h: Derive from FlowTableDnd if not in CLIENT_ONLY mode * glom/utility_widgets/flowtable.cc: (dnd_*) (on_dnd_*) * glom/utility_widgets/flowtable.h: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/flowtable_dnd.cc: * glom/utility_widgets/flowtable_dnd.h: Moved drag and drop stuff into it\'s own class and some code cleanup svn path=/trunk/; revision=1529 2008-04-07 Murray Cumming Use atexit(__libc_freeres) to maybe help valgrind to detect leaks. 2008-04-07 Murray Cumming * glom/main.cc (Glom.OptionGroup, main): Use atexit(__libc_freeres) to maybe help valgrind to detect leaks. * glom/mode_data/flowtablewithfields.cc Added TODO comments about possible widget leaks. * glom/utility_widgets/adddel/adddel.cc * glom/utility_widgets/adddel/adddel.h: Use UIManager instead of MenuElems, because it seems less leaky. svn path=/trunk/; revision=1528 2008-04-05 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1527 2008-04-04 Murray Cumming construct_specified_columns(): Really delete the temporary 2008-04-04 Murray Cumming * glom/utility_widgets/adddel/adddel.cc: construct_specified_columns(): Really delete the temporary TreeModelColumns to fix a leak. svn path=/trunk/; revision=1525 2008-04-04 Johannes Schmid Added dialog_flowtable 2008-04-04 Johannes Schmid * glom/glom_developer.glade: Added dialog_flowtable * glom/mode_data/flowtablewithfields.cc (Glom.FlowTableWithFields, (add_layout_group_at_position), (on_menu_properties_activate), (on_button_press_event): * glom/mode_data/flowtablewithfields.h Added popup-menu for flowtables * glom/utility_widgets/buttonglom.cc (on_button_press_event): * glom/utility_widgets/labelglom.cc (on_button_press_event): Fixed a crasher when not in developer mode * glom/utility_widgets/Makefile.am: * glom/utility_widgets/dialog_flowtable.cc (Glom, (set_flowtable), (get_title), (get_columns_count): * glom/utility_widgets/dialog_flowtable.h Added configuration dialog for FlowTables * glom/utility_widgets/layoutwidgetutils.h (LayoutWidgetUtils): Do not derive from sigc::trackable as it\'s not necessary. svn path=/trunk/; revision=1524 2008-04-04 Murray Cumming Fix the previous commit: treeviewcolumn_on_cell_data(): Do set the pixbuf 2008-04-04 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: Fix the previous commit: treeviewcolumn_on_cell_data(): Do set the pixbuf property to NULL when it is empty, or images apear repeated on rows. svn path=/trunk/; revision=1522 2008-04-04 Murray Cumming treeviewcolumn_on_cell_data(): Do not try to dereference a null pixbuf 2008-04-04 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: treeviewcolumn_on_cell_data(): Do not try to dereference a null pixbuf refptr. This fixes a crash when adding an image field to the list view if one of the records has no data in that field. Bug #526114 (Jani Monoses). svn path=/trunk/; revision=1521 2008-04-04 Murray Cumming glom/mode_data/box_data_list.cc Override this so we can set a bool and 2008-04-04 Murray Cumming * glom/mode_data/box_data_list.cc * glom/mode_data/box_data_list.h on_dialog_layout_hide(): Override this so we can set a bool and check for this bool in create_layout_add_group(), to reset the column widths after the layout dialog has been closed. Otherwise the new columns are off the right-hand side of the scroll area, making users think that nothing has happened unless they look at the scroll bar. This is not ideal, but drag-and-drop will make this easier anyway. Bug #526046 (Jani Monoses). svn path=/trunk/; revision=1519 2008-04-02 Murray Cumming glom/libglom/connectionpool.cc glom/libglom/connectionpool.h Added 2008-04-02 Murray Cumming * glom/libglom/connectionpool.cc * glom/libglom/connectionpool.h Added delete_instance(). * glom/main.cc (main): Clean up the ConnectionPool singleton at the end, so it is not reported as a leak by valgrind. svn path=/trunk/; revision=1517 2008-04-02 Murray Cumming glom/application.h :App::add_ui_from_string() override, so we can 2008-04-02 Murray Cumming * glom/application.h * glom/application.cc added a Bakery::App::add_ui_from_string() override, so we can workaround a problem with UTF8 in the UI description in gtkmm < 2.12.7. Bug #525718 (Pavel MlÄoch) svn path=/trunk/; revision=1514 2008-04-02 Murray Cumming Removed some debug output. svn path=/trunk/; revision=1513 2008-04-02 Murray Cumming Remove the GlueItem and GlueItemList classes. Store a simple int in 2008-04-02 Murray Cumming * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Remove the GlueItem and GlueItemList classes. Store a simple int in GtkTreeIter::user_data instead of a pointer to an allocated GlueItem instance (which just stored an int now anyway). This should prevent the leak of these instances, which GtkTreeModel really really gives us no way to ever know when to free, other than when the GktTreeModel is destroyed. svn path=/trunk/; revision=1512 2008-04-01 Frederic Peters Added more section IDs so that the Table Of Contents works on 2008-04-01 Frederic Peters * C/glom.xml: Added more section IDs so that the Table Of Contents works on library.gnome.org (it works without them in Glom). svn path=/trunk/; revision=1510 2008-04-01 Murray Cumming Fixed the build (my previous changes did not actually compile). 2008-04-01 Murray Cumming * glom/glom_privs.cc: Fixed the build (my previous changes did not actually compile). svn path=/trunk/; revision=1509 2008-04-01 Murray Cumming Corrected the ChangeLog svn path=/trunk/; revision=1508 2008-04-01 Murray Cumming Added use of BusyCursor because these access the database. 2008-04-01 Murray Cumming * glom/glom_privs.cc (Glom.get_database_users, Glom.get_current_privs): * glom/mode_data/box_data.cc (Glom.record_new, Glom.get_related_record_exists): Added use of BusyCursor because these access the database. svn path=/trunk/; revision=1507 2008-04-01 Murray Cumming on_treeview_column_clicked(): Show the busy cursor because the new SQL 2008-04-01 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: on_treeview_column_clicked(): Show the busy cursor because the new SQL query can take some time. svn path=/trunk/; revision=1506 2008-04-01 Murray Cumming glom/libglom/data_structure/foundset.cc Moved FoundSet into its own file 2008-04-01 Murray Cumming * glom/libglom/data_structure/Makefile.am: * glom/libglom/data_structure/foundset.cc * glom/libglom/data_structure/foundset.h: Moved FoundSet into its own file from base_db.[h|c], because I like that. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc * glom/utility_widgets/db_adddel/glom_db_treemodel.h: * glom/base_db.cc * glom/base_db.h: Moved count_rows_returned_by() to Base_DB so we can use it elsewhere. * glom/frame_glom.cc Glom.show_table(): Count the approximate number of rows expected in the list view, and do not sort them by default if it is more than 10,000. This allows Glom to show 600,000 MusicBrainz album rows now in 1 minute. svn path=/trunk/; revision=1505 2008-04-01 Murray Cumming Glom.refresh_from_database(): Omit the ORDER BY clause when counting the 2008-04-01 Murray Cumming * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Glom.refresh_from_database(): Omit the ORDER BY clause when counting the number of rows from our SQL query. This is much faster. svn path=/trunk/; revision=1504 2008-04-01 Murray Cumming glom/notebook_glom.h constructor, on_show(): Delay the connection of the 2008-04-01 Murray Cumming * glom/notebook_glom.h * glom/notebook_glom.cc: constructor, on_show(): Delay the connection of the switch_page handler because GtkNotebook sometimes emits the signal during show(). Save the sigc::connection so we can block it later. * glom/mode_data/notebook_data.cc init_db_details(), on_switch_page_handler(): Block the handling of this signal during the first initialization, to avoid an unnecessary duplicate SQL query. * glom/utility_widgets/db_adddel/db_adddel.h * glom/utility_widgets/db_adddel/db_adddel.cc on_self_style_changed): Correct the ifndef to an ifdef so this is really only used on Maemo, preventing a third duplicate SQL query. svn path=/trunk/; revision=1503 2008-04-01 Murray Cumming window_data_layout: Change window title from Details Layout to Layout 2008-04-01 Murray Cumming * glom/glom_developer.glade: window_data_layout: Change window title from Details Layout to Layout because it is used for the list and the related records layout too. This string already exists elsewhere, so it should not be a problem for translators. Bug #525449 (Jani Monoses) svn path=/trunk/; revision=1502 2008-03-31 Johannes Schmid Fixed side effect of idle hack that caused that items are always inserted 2008-03-31 Johannes Schmid * glom/utility_widgets/flowtable.cc (on_drag_data_received): Fixed side effect of idle hack that caused that items are always inserted at the end of the flowtable when dropped. * glom/utility_widgets/labelglom.cc (init): set_visible_window (false) for the eventbox to remove ugly label border. svn path=/trunk/; revision=1500 2008-03-31 Murray Cumming constructor: Do not handle style changes, because that currently causes an 2008-03-31 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: constructor: Do not handle style changes, because that currently causes an extra SQL query. It is still enabled for Maemo, which needs it. We should fix this properly. svn path=/trunk/; revision=1499 2008-03-31 Armin Burgmeier Use a notebook for the two treeviews, add a Select button. Removed the 2008-03-31 Armin Burgmeier * glom/glom.glade: * glom/dialog_existing_or_new.h: * glom/dialog_existing_or_new.cc: Use a notebook for the two treeviews, add a Select button. Removed the signals, instead added get_action(), get_uri(), get_service_info() and get_service_name(). This way, the application can hide the dialog before handling the action more easily. * glom/application.h: * glom/application.cc: offer_new_or_existing(): Hide the existing_or_new dialog after having run it. existing_or_new_new(): Removed the signal handlers, but keep the action for creating a new empty document in a separate function since it is still a lot of code. svn path=/trunk/; revision=1498 2008-03-31 Murray Cumming get_record_field_values_for_calculation(): Do not show an error if the 2008-03-31 Murray Cumming * glom/base_db.cc: get_record_field_values_for_calculation(): Do not show an error if the record does not exist yet. That is normal and is already dealt with by the following code. Do show an error if there is an exception. Bug #525096 (Jani Monoses) svn path=/trunk/; revision=1497 2008-03-31 Murray Cumming Make return activate the default buttons when in the last entry in some 2008-03-31 Murray Cumming * glom/glom_developer.glade: Make return activate the default buttons when in the last entry in some dialogs, such as the initial-user/password dialog when self-hosting. Bug #525284 (Jani Monoses) svn path=/trunk/; revision=1494 2008-03-31 Murray Cumming Field::init_map(): Comment out some previously-allowed conversions because 2008-03-31 Murray Cumming * glom/libglom/data_structure/field.cc: Field::init_map(): Comment out some previously-allowed conversions because postgres 8.3 has become less tolerant of conversions that could not produce useful data, such as date-to-number, causing postgres errors at runtime. Bug #525188 (Jani Monoses) svn path=/trunk/; revision=1493 2008-03-31 Murray Cumming Field::init_map(): Comment out some previously-allowed conversions because 2008-03-31 Murray Cumming * glom/libglom/data_structure/field.cc: Field::init_map(): Comment out some previously-allowed conversions because postgres 8.3 has become less tolerant of conversions that could not produce useful data, such as date-to-number, causing postgres errors at runtime. Bug #525188 (Jani Monoses) svn path=/trunk/; revision=1491 2008-03-30 Johannes Schmid Fixed dragging on ComboEntryGlom and added some comments about what 2008-03-30 Johannes Schmid * glom/utility_widgets/flowtable.cc (on_child_drag_motion): Fixed dragging on ComboEntryGlom and added some comments about what happens inside the widget detection. svn path=/trunk/; revision=1489 2008-03-30 Johannes Schmid dnd_remove_placeholder_idle(), dnd_remove_placeholder_real(), 2008-03-30 Johannes Schmid * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: dnd_remove_placeholder_idle(), dnd_remove_placeholder_real(), on_drag_leave(), on_child_drag_motion(): Allow dropping last item when mouse is over an entry or a similar HAS_WINDOW widget. svn path=/trunk/; revision=1488 2008-03-30 Armin Burgmeier Redesigned initial dialog, as described in 2008-03-30 Armin Burgmeier * glom/glom.glade: * glom/dialog_existing_or_new.h: * glom/dialog_existing_or_new.cc: * glom/Makefile.am: Redesigned initial dialog, as described in http://www.murrayc.com/blog/permalink/2007/11/29/gloms-initial-dialog. * glom/application.h: * glom/application.cc: Actually use it. svn path=/trunk/; revision=1487 2008-03-30 Johannes Schmid Fixed dropping on LabelGlom which was broken due to the EventBox 2008-03-30 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/labelglom.cc: Fixed dropping on LabelGlom which was broken due to the EventBox svn path=/trunk/; revision=1486 2008-03-30 Murray Cumming Always create a completely new iterator, instead of trying to return one 2008-03-30 Murray Cumming * glom/utility_widgets/db_adddel/glom_db_treemodel.cc create_iterator(): Always create a completely new iterator, instead of trying to return one with an existing GlueItem. A comment says that this is necessary to make operator=() work (it only compares pointers), but I do not know why a working iterator::operator=() is necessary. I guess we will find out. This was very inefficient. Glom can now show a list of 60,000 records in 5 minutes instead of hours/days. There is still much room for improvement though. svn path=/trunk/; revision=1485 2008-03-29 Murray Cumming fill_from_database(): Do show tables that are in the database but not in 2008-03-29 Murray Cumming * glom/navigation/box_tables.cc: fill_from_database(): Do show tables that are in the database but not in the document (hidden by default), allowing us to adapt to an existing database. on_adddel_Edit(): Do not complain about tables that are not in the document. svn path=/trunk/; revision=1484 2008-03-29 Murray Cumming get_database_preferences(): Try to create the standard tables if the query 2008-03-29 Murray Cumming * glom/base_db.cc: get_database_preferences(): Try to create the standard tables if the query fails, as a small first step in making Glom adapt to existing databases. svn path=/trunk/; revision=1483 2008-03-29 Murray Cumming Mention all the image files. 2008-03-29 Murray Cumming * Makefile.am: Mention all the image files. svn path=/trunk/; revision=1482 2008-03-29 Murray Cumming Added mention of vertical groups to the reports section. 2008-03-29 Murray Cumming * C/glom.xml: Added mention of vertical groups to the reports section. svn path=/trunk/; revision=1479 2008-03-29 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1478 2008-03-28 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1477 2008-03-28 Johannes Schmid Fixed expanding of LabelGlom Fixed dragging on Gtk::TextView 2008-03-28 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: Fixed expanding of LabelGlom * glom/utility_widgets/flowtable.cc: Fixed dragging on Gtk::TextView svn path=/trunk/; revision=1476 2008-03-27 Johannes Schmid Added get_textobject(reference) 2008-03-27 Johannes Schmid * glom/layout_item_dialogs/dialog_textobject.cc: * glom/layout_item_dialogs/dialog_textobject.h: Added get_textobject(reference) * glom/mode_data/flowtablewithfields.cc: * glom/utility_widgets/labelglom.cc: * glom/utility_widgets/labelglom.h: Use the correct dialog for editing textobject (missed that one before...) svn path=/trunk/; revision=1475 2008-03-27 Murray Cumming on_adddel_Delete(): Put quotes around the table name when doing a DROP 2008-03-27 Murray Cumming * glom/navigation/box_tables.cc: on_adddel_Delete(): Put quotes around the table name when doing a DROP TABLE, so we can delete tables that use upper case in their name. Bug #522233 (Pavel MlÄoch). svn path=/trunk/; revision=1474 2008-03-26 Murray Cumming Remove append_newline(). save_before(): Stop using append_newline() - it 2008-03-26 Murray Cumming * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Remove append_newline(). save_before(): Stop using append_newline() - it never worked anyway. Use add_indenting_white_space_to_node() which was just added to Bakery. This makes the .glom files have nice readable indenting again. svn path=/trunk/; revision=1472 2008-03-26 Johannes Schmid Added popup menu for LabelGlom 2008-03-26 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: * glom/utility_widgets/dialog_layoutitem_properties.cc: * glom/utility_widgets/labelglom.cc: * glom/utility_widgets/labelglom.h: Added popup menu for LabelGlom * glom/utility_widgets/dragbutton.h: Make a method const svn path=/trunk/; revision=1471 2008-03-24 Murray Cumming Added images from screenshots on website. Added screenshots and some text. 2008-03-24 Murray Cumming * configure.in: * docs/user-guide/C/figures: Added images from screenshots on website. * docs/user-guide/C/glom.xml: Added screenshots and some text. Added section about translations. svn path=/trunk/; revision=1470 2008-03-24 Johannes Schmid Added missing file svn path=/trunk/; revision=1469 2008-03-22 Murray Cumming Added sections about defining and using reports. Reports list: Corrected 2008-03-22 Murray Cumming * docs/user-guide/C/glom.xml: Added sections about defining and using reports. * glom/glom_developer.glade: Reports list: Corrected packing expanding. Added a tooltip for a checkbox. svn path=/trunk/; revision=1468 2008-03-22 Johannes Schmid Added popup-menu for buttons (and so refactoring to make it easier for 2008-03-22 Johannes Schmid * glom/glom_developer.glade: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/buttonglom.cc: * glom/utility_widgets/buttonglom.h: * glom/utility_widgets/dialog_buttonscript.cc: * glom/utility_widgets/dialog_buttonscript.h: * glom/utility_widgets/dialog_layoutitem_properties.cc: * glom/utility_widgets/dialog_layoutitem_properties.h: * glom/utility_widgets/labelglom.h: * glom/utility_widgets/layoutwidgetutils.h: Added popup-menu for buttons (and so refactoring to make it easier for other widgets) svn path=/trunk/; revision=1467 2008-03-19 Murray Cumming Use a URI for the examples directory instead of a filepath, sot that the 2008-03-19 Murray Cumming * glom/application.cc offer_new_or_existing(): Use a URI for the examples directory instead of a filepath, sot that the examples directory is really opened in the file chooser. gnome-vfs seems to have become less tolerant of URIs without file:// at the start. svn path=/trunk/; revision=1465 2008-03-18 Murray Cumming Hard-code the result for text fields (G_TYPE_STRING) so we always use 2008-03-18 Murray Cumming * glom/libglom/data_structure/fieldtypes.cc get_string_name_for_gdavaluetype(): Hard-code the result for text fields (G_TYPE_STRING) so we always use varchar. Otherwise we mistakenly create fields of type xml because libgda reports many postgres 8.3 fields types as being of type G_TYPE_STRING. svn path=/trunk/; revision=1462 2008-03-18 Murray Cumming Depend on the new unstable bakery-2.6 API. 2008-03-18 Murray Cumming * configure.in: Depend on the new unstable bakery-2.6 API. * glom/application.cc: * glom/base_db.cc: * glom/libglom/connectionpool.cc: * glom/libglom/document/document_glom.cc: * glom/main.cc: * glom/xsl_utils.cc: Use giomm instead of Gnome::Vfs. svn path=/trunk/; revision=1461 2008-03-18 Murray Cumming Added more casts to non-const char* from static strings, to avoid warnings 2008-03-18 Murray Cumming * glom/python_embed/python_module/py_glom_module.cc (initglom): Added more casts to non-const char* from static strings, to avoid warnings with Python. Python should use const char*, of course. svn path=/trunk/; revision=1460 2008-03-14 Andre Klapper Updated German translation. 2008-03-14 Andre Klapper * de.po: Updated German translation. svn path=/trunk/; revision=1459 2008-03-14 Ilkka Tuohela Updated Finnish translation svn path=/trunk/; revision=1458 2008-03-13 Murray Cumming Fixed a typo in my previous commit, to fix the build. 2008-03-13 Murray Cumming * glom/application.cc ui_file_select_open_with_browse(): Fixed a typo in my previous commit, to fix the build. svn path=/trunk/; revision=1457 2008-03-13 Murray Cumming Bug 521992 – Pressing Escape on Initial dialog does not close 2008-03-13 Murray Cumming Bug 521992 – Pressing Escape on Initial dialog does not close application properly. (Pavel MlÄoch) * glom/dialog_database_preferences.cc load_from_document(): Do not crash if the Gda::DataModel is empty. * glom/application.cc ui_file_select_save(), on_document_load(), offer_new_or_existing(): * glom/frame_glom.cc on_menu_file_export(): * glom/utility_widgets/imageglom.cc on_menupopup_activate_select_file(): Check for Gtk::RESPONSE_DELETE_EVENT instead of just Gtk::RESPONSE_CANCEL, so that we treat pressing Escape the same as pressing Cancel. When we just ignore this then we can leave the application in an unexpected state. svn path=/trunk/; revision=1456 2008-03-10 Murray Cumming discover_first_free_port() Reformat the code to make the use of ifdefs for 2008-03-10 Murray Cumming * glom/libglom/connectionpool.cc: discover_first_free_port() Reformat the code to make the use of ifdefs for various platforms clearer. Include errno.h and add a comment about how this is essential to make the code actually work. This stops Glom from starting a postgres instance on the same port that is used by an existing instance. start_self_hosting(): Set the port in the document so it is not incorrectly set again later. This fixes the problem that Glom sometimes started a server and then could not connect to it. svn path=/trunk/; revision=1452 2008-03-09 Armin Burgmeier Don't try to use remembered port when m_port is 0. This broke connections 2008-03-09 Armin Burgmeier * glom/libglom/connectionpool.cc: Don't try to use remembered port when m_port is 0. This broke connections to non-self-hosted database servers since the connection attempt was only performed on port 0. * glom/application.cc: Set "try_other_ports" to TRUE for new documents if the document is not self-hosted. Otherwise, only port 5432 was tried, and not the other ones specefied in the ConnectionPool's constructor. svn path=/trunk/; revision=1451 2008-03-08 Murray Cumming Added get_double_for_gda_value_numeric(). 2008-03-08 Murray Cumming * glom/libglom/data_structure/glomconversions.cc: * glom/libglom/data_structure/glomconversions.h: Added get_double_for_gda_value_numeric(). * glom/base_db.cc: auto_increment_insert_first_if_necessary(), recalculate_next_auto_increment_value(), get_next_auto_increment_value(): Return a GdaNumeric Gda::Value, not a string one, and do the conversion without the locale affecting it. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: fill_values_if_necessary(): Create default values of the correct type. * glom/libglom/utils.cc: * glom/libglom/utils.h: Removed decimal_from_string() because it is no longer used. This avoids a warning about an incorrect type when adding a row in the list view. * examples/example_music_collection.glom: Song table: Added Artists doubly-related fields on details and recreate this example. svn path=/trunk/; revision=1450 2008-03-08 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1449 2008-03-05 Murray Cumming offer_new_or_existing(): Call connection_pool->set_get_document_func() 2008-03-05 Murray Cumming * glom/application.cc: offer_new_or_existing(): Call connection_pool->set_get_document_func() before calling connection_request_password_and_choose_new_database_name() to avoid a (maybe harmless anyway) warning. svn path=/trunk/; revision=1448 2008-03-05 Murray Cumming get_text_for_gda_value(): Improved the warning about the unexpected value 2008-03-05 Murray Cumming * glom/libglom/data_structure/glomconversions.cc: get_text_for_gda_value(): Improved the warning about the unexpected value type, though I have not yet solved this (minor) problem. * glom/utility_widgets/dragbar.cc: Improve the titles in the tool pallete. And please stop using tabs in the source code. svn path=/trunk/; revision=1447 2008-03-05 Murray Cumming get_data_layout_groups_default(): Restored the code that creates the 2008-03-05 Murray Cumming * glom/libglom/document/document_glom.cc: get_data_layout_groups_default(): Restored the code that creates the default layouts, which was lost somehow. Bug #517665 (Johannes Schmid). svn path=/trunk/; revision=1446 2008-03-04 Johannes Schmid Fixed a crasher (probably related to an empty table) 2008-03-04 Johannes Schmid * glom/mode_data/box_data_details.cc: Fixed a crasher (probably related to an empty table) * glom/utility_widgets/Makefile.am: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/checkglom.h: (added) * glom/utility_widgets/checkglom.cc: (added) Add a popup menu to checkbutton fields svn path=/trunk/; revision=1445 2008-02-29 Johannes Schmid Fixed dragging on LabelGlom 2008-02-29 Johannes Schmid * glom/utility_widgets/flowtable.cc: Fixed dragging on LabelGlom svn path=/trunk/; revision=1443 2008-02-28 Johannes Schmid Use EggToolPalette for the developer drag and drop toolbar 2008-02-28 Johannes Schmid * glom/utility_widgets/dragbar.cc: * glom/utility_widgets/dragbutton.cc: * glom/utility_widgets/dragbutton.h: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/sidebar.cc: * glom/utility_widgets/sidebar.h: Use EggToolPalette for the developer drag and drop toolbar svn path=/trunk/; revision=1442 2008-02-25 Johannes Schmid glom/utility_widgets/eggtoolpalette/* (external) 2008-02-25 Johannes Schmid * configure.in: * glom/Makefile.am: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/eggtoolpalette/* (external) * glom/utility_widgets/util/* (external) Integrated eggtoolpalette into the build system (not used yet) svn path=/trunk/; revision=1440 2008-02-25 Johannes Schmid Reverted last commit svn path=/trunk/; revision=1439 2008-02-25 Johannes Schmid Added libegg util directory svn path=/trunk/; revision=1438 2008-02-24 Armin Burgmeier Pass -i instead of -h "*" to postmaster. This is equivalent, but it does 2008-02-24 Armin Burgmeier * glom/libglom/connectionpool.cc: Pass -i instead of -h "*" to postmaster. This is equivalent, but it does not require postgres to be linked against CRT_noglob.o on Windows. svn path=/trunk/; revision=1437 2008-02-23 Armin Burgmeier Add the bin/ subdirectory to the PATH environment variable on Windows. 2008-02-23 Armin Burgmeier * glom/main.cc: Add the bin/ subdirectory to the PATH environment variable on Windows. This is where the gspawn-win32-helper.exe program required for g_spawn* is installed, and g_spawn* requires it to be in somewhere in PATH. This fixes self-hosting on machines where gspawn-win32-helper.exe is not already in the PATH. svn path=/trunk/; revision=1436 2008-02-22 Murray Cumming Put the pygda appendix in its own section, instead of inside the previous 2008-02-22 Murray Cumming * C/glom.xml: Put the pygda appendix in its own section, instead of inside the previous appendix. Update the application version from 0.8 to 1.6. svn path=/trunk/; revision=1435 2008-02-20 Johannes Schmid Properties next try svn path=/trunk/; revision=1432 2008-02-20 Murray Cumming Moved the m_pDrag_Bar declaration to avoid a warning about initialization 2008-02-20 Murray Cumming * glom/application.h: Moved the m_pDrag_Bar declaration to avoid a warning about initialization sequence. * glom/libglom/python_embed/py_glom_relatedrecord.cc: * glom/python_embed/glom_python.cc: Cast some static strings to gchar* because the Python C API does not use const. This avoids some warnings. svn path=/trunk/; revision=1429 2008-02-20 Johannes Schmid Cell set modified, when the document was modified... 2008-02-20 Johannes Schmid * glom/mode_data/box_data_details.cc: Cell set modified, when the document was modified... svn path=/trunk/; revision=1428 2008-02-20 Johannes Schmid Use set_layout_item() on all layout element to allow to adding them at the 2008-02-20 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: Use set_layout_item() on all layout element to allow to adding them at the correct place to a layout_group * glom/utility_widgets/flowtable.cc: Remove some debug messages svn path=/trunk/; revision=1427 2008-02-20 Johannes Schmid Allow dragging at below the last item of a group 2008-02-20 Johannes Schmid * glom/utility_widgets/flowtable.cc: Allow dragging at below the last item of a group svn path=/trunk/; revision=1426 2008-02-19 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1425 2008-02-19 Johannes Schmid Added drag and drop for notebooks 2008-02-19 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: * glom/mode_data/flowtablewithfields.h: * glom/utility_widgets/flowtable.h: Added drag and drop for notebooks svn path=/trunk/; revision=1424 2008-02-19 Johannes Schmid Fixed crasher when using Tables menu 2008-02-19 Johannes Schmid * glom/frame_glom.cc: Fixed crasher when using Tables menu * glom/glom.glade: Removed unused dialog 2008-02-19 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: * glom/mode_data/flowtablewithfields.h: Cleaned up dnd code in FlowTableWithFields svn path=/trunk/; revision=1423 2008-02-19 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1422 2008-02-19 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1421 2008-02-19 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1420 2008-02-19 Johannes Schmid Show drag toolbar when in developer mode 2008-02-19 Johannes Schmid * glom/application.cc: * glom/application.h: * glom/frame_glom.cc: * glom/frame_glom.h: Show drag toolbar when in developer mode * glom/mode_data/box_data_details.cc: Recreate layout when switching to developer mode svn path=/trunk/; revision=1419 2008-02-18 Kjartan Maraas Add missing files. Updated Norwegian bokmÃ¥l translation. 2008-02-19 Kjartan Maraas * POTFILES.in: Add missing files. * nb.po: Updated Norwegian bokmÃ¥l translation. svn path=/trunk/; revision=1418 2008-02-18 Johannes Schmid #ifdef\'d all those annoying avahi debug messages 2008-02-18 Johannes Schmid * glom/libglom/connectionpool.cc: #ifdef\'d all those annoying avahi debug messages * glom/libglom/data_structure/layout/layoutgroup.cc: * glom/libglom/data_structure/layout/layoutgroup.h: Added LayoutGroup::remove_item() * glom/libglom/document/document_glom.cc: * glom/mode_data/dialog_layout_details.cc: Remove default layout creation as it\'s no longer needed when you can create your layout using drag and drop. * glom/mode_data/flowtablewithfields.cc: * glom/mode_data/flowtablewithfields.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: Fixed dragging of groups (mostly) * glom/utility_widgets/dragbar.cc: * glom/utility_widgets/dragbutton.cc: * glom/utility_widgets/dragbutton.h: Use enum instead of string to determine drag type * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: Set default size when in developer mode * icons/16x16/Makefile.am: * icons/16x16/glom-notebook.png Added notebook icon svn path=/trunk/; revision=1417 2008-02-17 Pawan Chitrakar Updated Nepali Translation svn path=/trunk/; revision=1416 2008-02-14 Armin Burgmeier Moved most files into the bin/ subdirectory. This is because both Glom.exe 2008-02-14 Armin Burgmeier * win32/querymodules.bat: * win32/build-installer: * win32/glom.iss.in: Moved most files into the bin/ subdirectory. This is because both Glom.exe and the postgres utilities need libpq.dll, but the postgres utilities need to be in the bin/ subdirectory to find their shared files. With this, the installer also works for me on a machine that does not already have Python, GTK, etc. installed. svn path=/trunk/; revision=1415 2008-02-11 Armin Burgmeier Add all required python files. I would like to put them into a separate 2008-02-11 Armin Burgmeier * win32/build-installer: * win32/glom.iss.in: Add all required python files. I would like to put them into a separate python/ directory, but did not get it to find them there. They are put into the main application directory for now. svn path=/trunk/; revision=1414 2008-02-09 Armin Burgmeier Added some missing DLLs and gda and glom python modules. 2008-02-09 Armin Burgmeier * win32/build-installer: * win32/glom.iss.in: Added some missing DLLs and gda and glom python modules. svn path=/trunk/; revision=1413 2008-02-05 Armin Burgmeier Fixed a 'non-void function does not return a value' warning in 2008-02-05 Armin Burgmeier * glom/libglom/connectionpool.cc: Fixed a 'non-void function does not return a value' warning in ConnectionPool::check_postgres_is_available_with_warning(). * glom/layout_item_dialogs/dialog_buttonscript.cc: Use a monospace font for the python script text field. Coding is much more convenient with a monospace font. svn path=/trunk/; revision=1412 2008-02-04 Armin Burgmeier Try finding postgres binaries in bin/ first. The installer installs them 2008-02-04 Armin Burgmeier * glom/libglom/connectionpool.cc: Try finding postgres binaries in bin/ first. The installer installs them there because they do not find the shared data they need otherwise. * icons/Makefile.am: * icons/win32/Makefile.am: Include the glom.ico in the distribution. * glom/Makefile.am: Link glom.exe with the -mwindows flag on Windows so that starting glom does not start a console window additionally. * win32/glom.iss.in: The script to create the Windows installer with InnoSetup (http://www.innosetup.org). It is a .in files so that configure automatically sets the correct Glom version in it. * win32/querymodules.bat: Batch file the installer uses to register pango modules, gdk pixbuf loaders and GTK+ input methods. * win32/build-installer: Tool I use to gather all files for the installer. It is currently verify specific to my own build setup. * win32/Makefile.am: Include these files with make dist. * Makefile.am: Add win32 to SUBDIRS. * configure.in: Create win32/Makefile, win32/glom.iss and icons/win32/Makfile. svn path=/trunk/; revision=1411 2008-02-03 Armin Burgmeier Adjust paths of glade files and locales to match the path the (yet to 2008-02-03 Armin Burgmeier * glom/libglom/glade_utils.h: * glom/main.cc: Adjust paths of glade files and locales to match the path the (yet to come) installer installs them. * glom/libglom/connectionpool.cc: Pass the -L flag with a path relative to the glom executable (where the installer will install it) to initdb on Windows so that it finds necessary files that are normally available in /usr/share/postgresql/. svn path=/trunk/; revision=1409 2008-02-03 Murray Cumming on_button_field(): Pass the correct parameter to avoid a use of an 2008-02-03 Murray Cumming * glom/layout_item_dialogs/dialog_field_summary.cc: on_button_field(): Pass the correct parameter to avoid a use of an uninitialized value. * glom/libglom/data_structure/layout/report_parts/layoutitem_fields_summary.cc: Constructor: Initialize a member variable to avoid a use of an uninitialized value. This fixed the crashes in bug #513927 (Göran) svn path=/trunk/; revision=1407 2008-02-02 Murray Cumming Corrected ChangeLog svn path=/trunk/; revision=1406 2008-01-31 Armin Burgmeier Added 48x48 glom.ico to be used as icon for glom.exe. Added resource file 2008-01-31 Armin Burgmeier * icons/win32/glom.ico: Added 48x48 glom.ico to be used as icon for glom.exe. * glom/glom.rc: Added resource file containing glom.ico. * glom/Makefile.am: Link resource file into glom.exe. svn path=/trunk/; revision=1405 2008-01-31 Armin Burgmeier Load translations relative to glom.exe on Windows. 2008-01-31 Armin Burgmeier * glom/main.cc: Load translations relative to glom.exe on Windows. svn path=/trunk/; revision=1404 2008-01-29 Murray Cumming on_flowtable_script_button_clicked(): Make sure that we send the primary 2008-01-29 Murray Cumming * glom/mode_data/box_data_details.cc: on_flowtable_script_button_clicked(): Make sure that we send the primary key value when refreshing after a button was clicked. This fixes the bug that most of the fields were blanked after clicking a button. svn path=/trunk/; revision=1402 2008-01-28 Murray Cumming load_after_layout_item_field(): Call set_full_field_details() on the 2008-01-28 Murray Cumming * glom/libglom/document/document_glom.cc: load_after_layout_item_field(): Call set_full_field_details() on the layout item, so we load the correct formatting for that field type. For instance, this means we do not lose the multiline formatting option when loading. Thanks to Göran (TEK-en) for finding this bug. svn path=/trunk/; revision=1400 2008-01-28 Armin Burgmeier Set IOChannel that reads stderr from child process to be nonblocking to 2008-01-28 Armin Burgmeier * glom/libglom/spawn_with_feedback.cc: Set IOChannel that reads stderr from child process to be nonblocking to make sure we don't block the whole process. svn path=/trunk/; revision=1399 2008-01-27 Armin Burgmeier Added Utils::get_glade_file_path() to locate the glade file relative to 2008-01-27 Armin Burgmeier * glom/libglom/glade_utils.h: Added Utils::get_glade_file_path() to locate the glade file relative to the application executable on Windows. * glom/dialog_invalid_data.cc: * glom/libglom/spawn_with_feedback.cc: * glom/utility_widgets/datawidget.cc: * glom/frame_glom.cc: * glom/layout_item_dialogs/dialog_field_layout.cc: * glom/layout_item_dialogs/dialog_group_by.cc: * glom/reports/dialog_layout_report.cc: * glom/translation/window_translations.cc: * glom/base_db.cc: * glom/main.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/flowtablewithfields.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_details.cc: * glom/filechooser_export.cc: * glom/application.cc: * glom/mode_design/script_library/dialog_script_library.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/print_layouts/dialog_text_formatting.cc: * glom/mode_design/print_layouts/canvas_print_layout.cc: Use Utils::get_glade_file_path() to load the glade files. svn path=/trunk/; revision=1398 2008-01-26 Armin Burgmeier Added a run() method so that we can show it without the ugly 2008-01-26 Armin Burgmeier * glom/libglom/dialog_progress_creating.h: * glom/libglom/dialog_progress_creating.cc: Added a run() method so that we can show it without the ugly while(Gtk::Main::events_pending()) Gtk::Main::iteration(). * glom/libglom/spawn_with_feedback.cc: Rewrote execute_command_line_and_wait_until_second_command_returns_success() so that it does not block the UI, does not run into an endless loop if the first command fails, and shows a useful error message in that case. * glom/libglom/connectionpool.cc: Locate postgres executables via Glib::find_program_in_path() on Windows, because hardcoding the path to the postgres utils does not work. Use "postgres.exe" instead of "postmaster.exe" on Windows because the postgres installer does not install postmaster.exe (which is deprecated since postgresql 8.2). svn path=/trunk/; revision=1397 2008-01-25 Johannes Schmid Fixed two crasher related to working with empty layout/empty tables 2008-01-25 Johannes Schmid * glom/mode_data/box_data_details.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: Fixed two crasher related to working with empty layout/empty tables svn path=/trunk/; revision=1396 2008-01-21 Johannes Schmid Fixed crasher in case there is no default layout group 2008-01-21 Johannes Schmid * glom/libglom/document/document_glom.cc: Fixed crasher in case there is no default layout group * glom/utility_widgets/flowtable.cc: Avoid division by zero svn path=/trunk/; revision=1395 2008-01-21 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles svn path=/trunk/; revision=1394 2008-01-21 Stéphane Raimbault Updated French translation by Christophe Benz and Stéphane Raimbault. 2008-01-21 Stéphane Raimbault * fr.po: Updated French translation by Christophe Benz and Stéphane Raimbault. svn path=/trunk/; revision=1393 2008-01-20 Jorge Gonzalez Gonzalez Updated Spanish translation by Daniel Mustieles. svn path=/trunk/; revision=1392 2008-01-20 Stéphane Raimbault Moved flowtablewithfields.cc to glom/mode_data from glom/utility_widgets. 2008-01-20 Stéphane Raimbault * POTFILES.in: Moved flowtablewithfields.cc to glom/mode_data from glom/utility_widgets. svn path=/trunk/; revision=1391 2008-01-18 Murray Cumming Added copied (and renamed) versions of Gtk::Calendar and GtkCalendar with 2008-01-18 Murray Cumming * configure.in: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/calendar/Makefile.am: * glom/utility_widgets/calendar/README: * glom/utility_widgets/calendar/glomcalendar.cc: * glom/utility_widgets/calendar/glomcalendar.h: * glom/utility_widgets/calendar/glomgtkcalendar.c: * glom/utility_widgets/calendar/glomgtkcalendar.h: Added copied (and renamed) versions of Gtk::Calendar and GtkCalendar with the new details callback function, instead of depending on unreleased/unstable GTK+ and gtkmm. svn path=/trunk/; revision=1390 2008-01-17 Johannes Schmid Fixed some odd dragging bug and removed dialogs for new buttons/label. Use 2008-01-17 Johannes Schmid * glom/mode_data/flowtablewithfields.cc: * glom/utility_widgets/flowtable.cc: Fixed some odd dragging bug and removed dialogs for new buttons/label. Use Developers->Layout instead to change the appearance of newly added items. svn path=/trunk/; revision=1389 2008-01-16 Armin Burgmeier Added ConnectionPool::get_try_other_ports(). 2008-01-17 Armin Burgmeier * glom/libglom/connection_pool.h: * glom/libglom/connection_pool.cc: Added ConnectionPool::get_try_other_ports(). * glom/frame_glom.cc: Fixed connection proceduce after creating new self-hosted database by setting port and try_other_ports into in the document. These settings are later used for the connection. If we don't do that, port is 0 and we can't connect. svn path=/trunk/; revision=1388 2008-01-14 Johannes Schmid Setup drag source correctly. 2008-01-14 Johannes Schmid * glom/utility_widgets/dragbutton.cc: Setup drag source correctly. * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: Fixed placeholder expanding Support dragging on child widgets (at least GtkEntry\'s for now svn path=/trunk/; revision=1387 2008-01-13 Armin Burgmeier Disable the --with-postgres-utils options on Windows because it does not 2008-01-13 Armin Burgmeier * configure.in: Disable the --with-postgres-utils options on Windows because it does not make sense to hardcode paths on Windows. We use Glib::find_program_in_path to locate the postgres executables. * glom/libglom/connectionpool.h: * glom/libglom/connectionpool.cc: Severial windows fixes: Don't use libepc, locate postgres programs using Glib::find_program_in_path, quote path to executables, use closesocket() instead of close(). * glom/libglom/spawn_with_feedback.cc: Fixed typo. * glom/Makefile.am: Changed library linking order so linking developer mode on Windows succeeds. svn path=/trunk/; revision=1386 2008-01-10 Murray Cumming Depend on the latest version of libgda, because we use the new 2008-01-10 Murray Cumming * configure.in: Depend on the latest version of libgda, because we use the new Gda::Value::get_ulong() method. Thanks to Rohit Agrawal. svn path=/trunk/; revision=1385 2008-01-04 Johannes Schmid Cleaned-up setup_dnd() code and fix a very stupid bug in column 2008-01-04 Johannes Schmid * glom/utility_widgets/flowtable.cc: Cleaned-up setup_dnd() code and fix a very stupid bug in column calculation svn path=/trunk/; revision=1384 2008-01-03 Armin Burgmeier Fixed date in ChangeLog svn path=/trunk/; revision=1383 2008-01-03 Armin Burgmeier glom/utility_widgets/cellrendererlist/Makefile.am Moved cellrendererlist 2007-12-02 Armin Burgmeier * glom/utility_widgets/cellrendererlist/cellrendererlist.h: * glom/utility_widgets/cellrendererlist/cellrendererlist.cc: * glom/utility_widgets/cellrendererlist/Makefile.am * configure.in: Moved cellrendererlist to this subdirectory. * glom/mode_data/flowtablewithfields.h: * glom/mode_data/flowtablewithfields.cc: Moved the FlowTableWithFields class from utility_widgets to mode_data. mode_data is the only one who uses this, and this way, utility_widgets do no longer depend on mode_data. This is necessary to link libglom dynamically on Windows. * glom/Makefile.am: Added utility_widgets/cellrendererlist/libutility_widgets_cellrendererlist.a to LDADD. * glom/utility_widgets/Makefile.am: * glom/mode_data/Makefile.am: Changed list of source files accordingly. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/adddel/adddel.cc: * glom/mode_data/box_data_details.h: Changed include paths accordingly. * glom/libglom/Makefile.am: Link libglom dynamically on Windows. This requires also the latest versions of libgdamm, gnome-vfsmm, gconfmm and bakery because earlier versions do not create a shared library on Windows, and shared libraries cannot be linked against static ones. * glom/python_embed/python_module/Makefile.am: Rename the python glom module from glom.dll to glom.pyd on Windows when installing because python does not find the module when it does not end on .pyd. These .pyd files are simply renamed DLLs. svn path=/trunk/; revision=1382 2007-12-31 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1381 2007-12-30 Johannes Schmid Allow dragging on child widgets that use their own GdkWindow. This works 007-12-30 Johannes Schmid * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: Allow dragging on child widgets that use their own GdkWindow. This works for GlomImage now but still needs some work for GlomEntrys and other widgets. * glom/utility_widgets/flowtablewithfields.cc: Don\'t put child flowtables into Gtk::EventBox because it\'s useless svn path=/trunk/; revision=1380 2007-12-30 Jorge Gonzalez Gonzalez Updated spanish translation svn path=/trunk/; revision=1379 2007-12-29 Armin Burgmeier Require latest libepc on both maemo and non-maemo. 2007-12-29 Armin Burgmeier * configure.in: Require latest libepc on both maemo and non-maemo. * glom/application.cc: Fixed an #ifdef at the wrong position so the application's menu is fully populated in client-only mode. svn path=/trunk/; revision=1378 2007-12-21 Murray Cumming Several corrections and improvements. This is not quite finished yet. 2007-12-21 Murray Cumming * glom/glom_document.dtd: Several corrections and improvements. This is not quite finished yet. svn path=/trunk/; revision=1377 2007-12-21 Murray Cumming Updated and corrected DTD with documentation comments. This was completed 2007-12-21 Murray Cumming * glom/glom_document.dtd: Updated and corrected DTD with documentation comments. This was completed by novanasa, as a Google Highly-Open Participation (GHOP) task (GNOME GHOP task 49). This is for documentation (or utilities) - we do not actually validate the .xml so that we can be as liberal as possible when loading documents. svn path=/trunk/; revision=1376 2007-12-20 Murray Cumming get_text_for_gda_value(): Return escaped text for images, instead of using 2007-12-20 Murray Cumming * glom/libglom/data_structure/glomconversions.cc: get_text_for_gda_value(): Return escaped text for images, instead of using to_string(). This fixes the loading of images from the document, so they are not lost when closing the document. svn path=/trunk/; revision=1374 2007-12-20 Murray Cumming scale_to_size(): Set the size again after setting the pixbuf, to preserve 2007-12-20 Murray Cumming * glom/utility_widgets/canvas/canvas_image_movable.cc: * glom/utility_widgets/canvas/canvas_item_movable.h: scale_to_size(): Set the size again after setting the pixbuf, to preserve the size. * glom/utility_widgets/canvas/canvas_group_resizable.cc: * glom/utility_widgets/canvas/canvas_group_resizable.h: Added (and emitted) signal_resized(). * glom/mode_design/print_layouts/canvas_layout_item.cc: * glom/mode_design/print_layouts/canvas_layout_item.h: Handle signal_resized() to rescale images when they are resized. svn path=/trunk/; revision=1373 2007-12-20 Murray Cumming Store the original pixbuf and use it in a new scale_to_size() method. 2007-12-20 Murray Cumming * glom/utility_widgets/canvas/canvas_image_movable.cc: * glom/utility_widgets/canvas/canvas_image_movable.h: Store the original pixbuf and use it in a new scale_to_size() method. * glom/mode_design/print_layouts/canvas_layout_item.cc: set_layout_item(): Call scale_to_size() on images, after setting the size. svn path=/trunk/; revision=1372 2007-12-20 Murray Cumming cast_to_movable(), cast_to_item(): Make these handle CanvasGroupResizable 2007-12-20 Murray Cumming * glom/utility_widgets/canvas/canvas_item_movable.cc: cast_to_movable(), cast_to_item(): Make these handle CanvasGroupResizable too, causing snap-to-grid to work again, though it seems to only work for moving, and not for resizing. svn path=/trunk/; revision=1371 2007-12-20 Murray Cumming offer_imageobject(): Add show_title bool, like offer_textobject() alread 2007-12-20 Murray Cumming * glom/base_db.cc: * glom/base_db.h: offer_imageobject(): Add show_title bool, like offer_textobject() alread has. * glom/glom_developer.glade: Correct the title of the choose image dialog. * glom/layout_item_dialogs/dialog_imageobject.cc: * glom/layout_item_dialogs/dialog_imageobject.h: set_layout_item(): Add show_title bool and hide the title if it is true. * glom/libglom/data_structure/layout/layoutitem_image.cc: * glom/libglom/data_structure/layout/layoutitem_image.h: Added get_image_as_pixbuf() for convenience. * glom/mode_design/print_layouts/canvas_layout_item.cc: set_layout_item(): Actually show the image from the layout item. * glom/mode_design/print_layouts/canvas_print_layout.cc: on_context_menu_edit(): Handle image objects. svn path=/trunk/; revision=1370 2007-12-20 Murray Cumming Remove m_drop_x and m_drop_y: They are useless now that we don't use the 2007-12-20 Murray Cumming * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Remove m_drop_x and m_drop_y: They are useless now that we don't use the menu signal handler when dropping. create_empty_item(): Set appropriate sizes for the new items. svn path=/trunk/; revision=1369 2007-12-20 Murray Cumming Added remove_empty_indicators() to remove the missing-image icon from 2007-12-20 Murray Cumming * glom/mode_design/print_layouts/canvas_layout_item.cc: * glom/mode_design/print_layouts/canvas_layout_item.h: Added remove_empty_indicators() to remove the missing-image icon from empty static image items. * glom/mode_design/print_layouts/canvas_print_layout.cc: fill_with_data(): Call remove_empty_indicators() so that the missing-image icons are not seen when printing. svn path=/trunk/; revision=1368 2007-12-20 Murray Cumming Added set_image() and set_image_empty(), which adds a MISSING_IMAGE stock 2007-12-20 Murray Cumming * glom/utility_widgets/canvas/canvas_image_movable.cc: * glom/utility_widgets/canvas/canvas_image_movable.h: Added set_image() and set_image_empty(), which adds a MISSING_IMAGE stock icon. * glom/mode_design/print_layouts/canvas_layout_item.cc: set_layout_item(): Use set_image_empty(). * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: on_canvas_drag_data_received(): After a drop, delete the temporary canvas item shown during drag motion. Added on_canvas_drag_leave(), so we can delete the temporary item when the user drags out of the canvas without doing a drop. svn path=/trunk/; revision=1367 2007-12-19 Murray Cumming Added create_empty_item() to avoid duplicate code for the various ways to 2007-12-19 Murray Cumming * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Added create_empty_item() to avoid duplicate code for the various ways to add new items. For instance, when dragging from the toolbar, actually put some text in the text item so that something is visible. We still need to make empty images and portals visible somehow. svn path=/trunk/; revision=1366 2007-12-18 Murray Cumming Constructor: Do not use the drag_dest_set() default flag values, because 2007-12-18 Murray Cumming,,, * glom/mode_design/print_layouts/window_print_layout_edit.cc: Constructor: Do not use the drag_dest_set() default flag values, because they prevent us from really using our own callbacks, and actually cause a pointer grab when trying to get the data during a drag-motion event. on_canvas_drag_drop(): Call drag_get_data(), because we are no longer using DEST_DEFAULT_DROP (via DEST_DEFAULT_ALL), which previously did this for us. svn path=/trunk/; revision=1365 2007-12-17 Murray Cumming Constructor: Constructor: Added tooltip text for navigation buttons and 2007-12-17 Murray Cumming * glom/mode_data/box_data_details.cc: Constructor: * glom/utility_widgets/datawidget.cc: Constructor: Added tooltip text for navigation buttons and the Open and Find buttons next to IDs. svn path=/trunk/; revision=1364 2007-12-17 Murray Cumming Depend on the latest libepc. Use the new functions to avoid duplicate 2007-12-17 Murray Cumming * configure.in: Depend on the latest libepc. * glom/libglom/connectionpool.cc: Use the new functions to avoid duplicate libepc services. svn path=/trunk/; revision=1363 2007-12-16 Johannes Schmid Forget to save ChangeLog svn path=/trunk/; revision=1362 2007-12-16 Johannes Schmid Fixed drag&drop code to have a much better user-experience. The items 2007-12-16 Johannes Schmid * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: Fixed drag&drop code to have a much better user-experience. The items should now be dropped more accurate at the mouse-pointer position and the placeholder is drawn there, too. * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: * glom/utility_widgets/dragbar.cc: Removed the DragButton for LayoutItem Image because it does not make sense without an associated field. svn path=/trunk/; revision=1361 2007-12-12 Johannes Schmid Rewrote placeholder widget as a custom widget to get a better appearence 2007-12-12 Johannes Schmid * glom/utility_widgets/placeholder-glom.cc: * glom/utility_widgets/placeholder-glom.h: Rewrote placeholder widget as a custom widget to get a better appearence when dragging. svn path=/trunk/; revision=1358 2007-12-11 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1357 2007-12-11 Murray Cumming Constructor: Call drag_dest_set() instead of 2007-12-11 Murray Cumming * glom/mode_design/print_layouts/window_print_layout_edit.cc: Constructor: Call drag_dest_set() instead of m_canvas.drag_dest_set(m_drag_targets), which seems to allow us to call drag_get_data() in our drag_motion signal handler. on_canvas_drag_data_received(): Always call drag_status() when this is during drag_motion, rather than only the first time, so that we keep getting drag_motion signals. svn path=/trunk/; revision=1356 2007-12-10 Johannes Schmid Fixed Bug 502570 – remove gtk-ok gtk-cancel from translation 2007-12-10 Johannes Schmid * glom/glom.glade: Fixed Bug 502570 – remove gtk-ok gtk-cancel from translation * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtablewithfields.cc: Removed some debugging code svn path=/trunk/; revision=1355 2007-12-08 Andre Klapper Update German translation. 2007-12-08 Andre Klapper * de.po: Update German translation. svn path=/trunk/; revision=1354 2007-12-07 Johannes Schmid Added dialog for new fields 2007-12-07 Johannes Schmid * glom/glom.glade: Added dialog for new fields * glom/libglom/data_structure/layout/layoutgroup.cc: add_item() should add before - not after the item, at least for dnd * glom/utility_widgets/dragbar.cc: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: Added drag buttons for text, image and button Fix crasher in dnd code * icons/16x16/Makefile.am: * icons/16x16/glom-button.png: * icons/16x16/glom-text.png: * icons/16x16/glom-image.png: Added new icons (from glade3) svn path=/trunk/; revision=1353 2007-12-07 Johannes Schmid Merged maemo-launcher changes from glom-1.6 branch 2007-12-07 Johannes Schmid * configure.in: * glom/Makefile.am: Merged maemo-launcher changes from glom-1.6 branch svn path=/trunk/; revision=1352 2007-12-06 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1351 2007-12-06 Murray Cumming Fix an ifdef to allow us to go into developer mode again in normal 2007-12-06 Murray Cumming * glom/libglom/appstate.cc: Fix an ifdef to allow us to go into developer mode again in normal not-client-only mode. svn path=/trunk/; revision=1350 2007-12-05 Armin Burgmeier Change the the python library finder so that is also finds 2007-12-04 Armin Burgmeier * acinclude.m4: Change the the python library finder so that is also finds libpythonMAJORMINOR.* instead of libpythonMAJOR.MINOR.*, because the former is used on windows. * configure.in: Don't require avahi, iso-codes and libepc on Windows, made goocanvasmm nonoptional because it is needed for the printing stuff. * glom/frame_glom.h: * glom/libglom/connectionpool.h: * glom/libglom/spawn_with_feedback.cc: * glom/libglom/connectionpool.cc: * glom/utility_widgets/flowtable.h: * glom/utility_widgets/flowtablewithfields.h: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/placeholder-glom.cc: * glom/utility_widgets/Makefile.am: * glom/frame_glom.cc: * glom/application.h: * glom/application.cc: Clientonly and Windows build fixes. * glom/python_embed/python_module/Makefile.am: * glom/libglom/Makefile.am: * glom/Makefile.am: * Makefile.am: Do not link against -lutil on Win32, because there is no such library, and it does not seem to be needed. Link libglom statically on Windows for now. svn path=/trunk/; revision=1347 2007-12-04 Murray Cumming Replace more hard-coded 6 spacing with our constant, so it is less on 2007-12-04 Murray Cumming * glom/mode_data/box_data_list_related.cc: * glom/utility_widgets/filechooserdialog_saveextras.cc: * glom/utility_widgets/flowtablewithfields.cc: Replace more hard-coded 6 spacing with our constant, so it is less on Maemo. svn path=/trunk/; revision=1346 2007-12-04 Murray Cumming on_document_load(): Call set_get_document_func() earlier so that the 2007-12-04 Murray Cumming * glom/application.cc: on_document_load(): Call set_get_document_func() earlier so that the connection pool always has it. * glom/libglom/connectionpool.cc: connect(): Start avahi publihsing here if it has not already been started, so we publish databases that are centrally-hosted too. However, we need to do this only for the first user. on_sharedconnection_finished(): stop avahi svn path=/trunk/; revision=1345 2007-12-04 Murray Cumming create_layout_get_layout(), get_fields_to_show(): update_ui(): Do not try 2007-12-04 Murray Cumming * glom/mode_data/box_data_list_related.cc: create_layout_get_layout(), get_fields_to_show(): * glom/mode_data/dialog_layout_list_related.cc: update_ui(): Do not try to insert at position 0 of an empty std::vector, to prevent crashes. I introduced this problem on 2007-11-17. svn path=/trunk/; revision=1344 2007-12-04 Murray Cumming ui_file_select_open_with_browse(), open_browsed_document(): Remove the 2007-12-04 Murray Cumming * glom/application.cc: * glom/application.h: ui_file_select_open_with_browse(), open_browsed_document(): Remove the BrowsedServer inner class and instead use EpcServiceInfo and a service_name string. This reduces the amount of code. svn path=/trunk/; revision=1343 2007-12-03 Murray Cumming open_browsed_document(): Adapt to the latest libepc API, using the 2007-12-03 Murray Cumming * glom/application.cc: open_browsed_document(): Adapt to the latest libepc API, using the EpcServiceInfo object. svn path=/trunk/; revision=1341 2007-12-03 Murray Cumming Rename --disable-doc to --disable-doc-utils to be clearer, and move the 2007-12-03 Murray Cumming * configure.in: Rename --disable-doc to --disable-doc-utils to be clearer, and move the check lower in configure.ac because it was somehow causing the check for pkg-config to fail. svn path=/trunk/; revision=1338 2007-12-02 Murray Cumming Added --disable-doc configure option, because Maemo has no 2007-12-02 Murray Cumming * configure.in: * Makefile.am: Added --disable-doc configure option, because Maemo has no gnome-doc-utils. This was copied partly from Ekiga. svn path=/trunk/; revision=1336 2007-12-02 Murray Cumming Mention dragbar.h to fix the dist. Dist pixmaps_DATA. 2007-12-02 Murray Cumming * glom/utility_widgets/Makefile.am: Mention dragbar.h to fix the dist. * icons/16x16/Makefile.am: Dist pixmaps_DATA. svn path=/trunk/; revision=1335 2007-12-02 Murray Cumming Added glom/utility_widgets/filechooserdialog_openwithbrowse.cc and 2007-12-02 Murray Cumming * POTFILES.in: Added glom/utility_widgets/filechooserdialog_openwithbrowse.cc and glom/utility_widgets/filechooserdialog_saveextras.cc and removed glom/utility_widgets/filechooserdialog.cc Bug #501024 (Hubert Bielenia) svn path=/trunk/; revision=1334 2007-12-02 Murray Cumming Restored some code that I didn't mean to remove in the last commit svn path=/trunk/; revision=1332 2007-12-02 Murray Cumming Remove dialog_connection_error. 2007-12-02 Murray Cumming * glom/glom.glade: Remove dialog_connection_error. * glom/application.cc: * glom/frame_glom.cc: * glom/frame_glom.h: Replace use of dialog_connection_error with Utils::show_ok_dialog(), so we can use a Hildon::Note on Maemo. svn path=/trunk/; revision=1331 2007-12-01 Murray Cumming Constructor: Make sure that we default to operator mode for client-only 2007-12-01 Murray Cumming * glom/libglom/appstate.cc: Constructor: Make sure that we default to operator mode for client-only mode. * glom/glom.glade: * glom/frame_glom.cc: * glom/frame_glom.h: Hide the footer (user level and found count) in Maemo build. * glom/dialog_glom.cc: * glom/mode_find/box_data_list_find.cc: * glom/utility_widgets/flowtablewithfields.cc: Replace some padding and spacing with the constants, so we save space in the Mameo build. svn path=/trunk/; revision=1330 2007-12-01 Murray Cumming Check for glibmm 2.14.1, because only a libgdamm built with that can 2007-12-01 Murray Cumming * configure.in: Check for glibmm 2.14.1, because only a libgdamm built with that can create the iter-only treemodel. svn path=/trunk/; revision=1328 2007-11-29 Murray Cumming Use epc_shell_set_progress_hooks() to show some UI while generating 2007-11-29 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Use epc_shell_set_progress_hooks() to show some UI while generating certificates during a first run. svn path=/trunk/; revision=1327 2007-11-28 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1326 2007-11-28 Murray Cumming stop_self_hosting(): Use the -m fast option with pg_ctl to avoid waiting 2007-11-28 Murray Cumming * glom/libglom/connectionpool.cc: stop_self_hosting(): Use the -m fast option with pg_ctl to avoid waiting for clients to disconnect first. This seems to fix bug #420962 (Craig Keogh, Denis Leroy, Perriman) svn path=/trunk/; revision=1324 2007-11-28 Murray Cumming Added get/set_try_other_ports(). 2007-11-28 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Added get/set_try_other_ports(). * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added get/set_connection_try_other_ports(), and saved it. * glom/dialog_connection.cc: connect_to_server_with_connection_settings(): Use try_other_ports from the document. * glom/application.cc: open_browsed_document(): Set try_other_ports in the document (It is not really needed in the on-disk XML, but this is the easiest place to pass that information). This should prevent us from opening a different postgres server on the same host when connecting via browse network. svn path=/trunk/; revision=1323 2007-11-27 Murray Cumming on_document_load(): When starting self-hosting, remember the port used and 2007-11-27 Murray Cumming * glom/application.cc: on_document_load(): When starting self-hosting, remember the port used and specify it again when connecting to the self-hosted postgres database, to avoid connecting to another postgres server running on the same machine which happens to have the same database name in it. Confused the hell out of me. svn path=/trunk/; revision=1322 2007-11-27 Murray Cumming open_browsed_document(): Check for SOUP_STATUS_UNAUTHORIZED as well as 2007-11-27 Murray Cumming * glom/application.cc: open_browsed_document(): Check for SOUP_STATUS_UNAUTHORIZED as well as SOUP_STATUS_FORBIDDEN because I have started getting this. * glom/application.h: Remove some unnecessary virtuals from methods. svn path=/trunk/; revision=1321 2007-11-27 Murray Cumming Added get/set_port(). Store the port after it has been used successfully. 2007-11-27 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Added get/set_port(). Store the port after it has been used successfully. * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added get/set_connection_port(), so we can try to use the same port as last time, to save time, and to avoid connecting to some other postgres server on the same host. svn path=/trunk/; revision=1320 2007-11-27 Murray Cumming Added set_connect_to_browsed(), which dims the host name. 2007-11-27 Murray Cumming * glom/dialog_connection.cc: * glom/dialog_connection.h: Added set_connect_to_browsed(), which dims the host name. * glom/application.cc: * glom/application.h: ui_file_select_open_with_browse(): Store the service name (the database name) and show it in the connection dialog in open_browsed_document() svn path=/trunk/; revision=1319 2007-11-27 Murray Cumming open_browsed_document(): Replace the host name if it is localhost, because 2007-11-27 Murray Cumming * glom/application.cc: open_browsed_document(): Replace the host name if it is localhost, because our localhost is not the same as the localhost of the publisher. svn path=/trunk/; revision=1318 2007-11-27 Murray Cumming on_publisher_document_authentication(): Try to connect to the database 2007-11-27 Murray Cumming * glom/libglom/connectionpool.cc: on_publisher_document_authentication(): Try to connect to the database with the username/password, so we know whether they are correct. * glom/dialog_connection.cc: * glom/dialog_connection.h: Added set_username() and set_password(), so we can reuse this code to connect, even without showing the dialog. * glom/application.cc: * glom/application.h: open_browsed_document(): Ask for the usernmame and password before trying to get the document over the network. Store the username and password temporarily so we do not need to ask the user again in on_document_load(). * glom/frame_glom.cc: * glom/frame_glom.h: connection_request_password_and_attempt(): Added known_username and known_password string parameters, and do not show the dialog if they are known already. This seems to work. * glom/libglom/Makefile.am: * glom/libglom/glade_utils.h: Added this and moved the glade_* convenience templates into it. svn path=/trunk/; revision=1317 2007-11-27 Murray Cumming convert_value(): Deal with gint values specially, because we usually 2007-11-27 Murray Cumming * glom/libglom/data_structure/glomconversions.cc: convert_value(): Deal with gint values specially, because we usually really do want to convert gints to GdaNumerics, though we do use gints for some serial keys. (I think, but maybe not anymore.) * glom/python_embed/glom_python.cc: glom_evaluate_python_function_implementation(): Make sure that the we return an appropriate value type, by calling convert_value(), because pygda_value_from_pyobject() would not necessarily return exactly what we want. This seems to fix bug #499459 (Perriman) so that numeric calculations do not cause SQL errors in non-English locales. svn path=/trunk/; revision=1316 2007-11-25 Murray Cumming Connected an authentication handler for the publisher, but it needs the 2007-11-25 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Connected an authentication handler for the publisher, but it needs the full password to try a postgres connection. svn path=/trunk/; revision=1314 2007-11-24 Murray Cumming Removed some debug output. svn path=/trunk/; revision=1313 2007-11-23 Murray Cumming get/set_userlevel(): Do not allow developer mode if the document was 2007-11-23 Murray Cumming * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: get/set_userlevel(): Do not allow developer mode if the document was opened over the network via browse. That would require writing of the original document. That is a feature for the future maybe. * glom/frame_glom.cc: on_menu_userlevel_Developer(): Warn when trying to enter developer mode. * glom/application.cc: When opening from browse, explicitly set the user level to operator and update the UI, though I feel this should be automatic. svn path=/trunk/; revision=1312 2007-11-23 Murray Cumming Added get/set_opened_from_browse(). on_menu_file_open(): Use 2007-11-23 Murray Cumming * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added get/set_opened_from_browse(). * glom/application.cc: on_menu_file_open(): Use set_opened_from_browse(). offer_new_or_existing(): Check get_opened_from_browse() so we don't think it failed just because there is no URI, so we don't offer the window again. svn path=/trunk/; revision=1311 2007-11-23 Murray Cumming Fix the double free, but for some reason it shows the initial dialog 2007-11-23 Murray Cumming * glom/application.cc: Fix the double free, but for some reason it shows the initial dialog again. svn path=/trunk/; revision=1310 2007-11-23 Murray Cumming Added save_and_get_content(), so I can manipulate a temporary copy of the 2007-11-23 Murray Cumming * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added save_and_get_content(), so I can manipulate a temporary copy of the document and then load it properly. * glom/application.cc: on_menu_file_open(): When openeing a browsed document, use a temporary instance of the document class (incredibly inefficiently) to mark the document as not self-hosted. This now actually opens the file, but then it crashes with a double free warning. svn path=/trunk/; revision=1309 2007-11-23 Murray Cumming Don't provide the service type twice to 2007-11-23 Murray Cumming * glom/application.cc: Don't provide the service type twice to aui_service_dialog_set_browse_service_types(), so we don't get an unnecessary type column. * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: avahi_start_publishing(): Mention the document name in the published service name, to make browsing more sensible. svn path=/trunk/; revision=1308 2007-11-22 Murray Cumming Added set_get_document_func(). This avoids us having to link to the 2007-11-22 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Added set_get_document_func(). This avoids us having to link to the application (not in libglom) to get the document from it. avahi_start_publishing(): Publish the document contents via a callback, though this needs a change in libepc to copy the data. * configure.in: Depend on avahi-ui, so we can show the browse dialog. * glom/application.cc: * glom/application.h: Added ui_file_select_open_with_browse() which adds a browse network button to the file chooser dialog and then gets the server details after asking the user to browse. on_menu_file_open(): Use ui_file_select_open_with_browse() instead of regular ui_file_select_open(). Use the new Bakery::App_WithDoc::open_document_from_data() if opening over the network. svn path=/trunk/; revision=1306 2007-11-21 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1305 2007-11-21 Murray Cumming Rearrange code to reduce the number of ifdefs. Do not build 2007-11-21 Murray Cumming * glom/application.cc: * glom/application.h: Rearrange code to reduce the number of ifdefs. * glom/utility_widgets/Makefile.am: Do not build filechooserdialog_saveextras.[h|cc] in client-only mode. svn path=/trunk/; revision=1303 2007-11-21 Murray Cumming Rename this to: 2007-11-21 Murray Cumming * glom/application.cc: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/filechooserdialog.cc: * glom/utility_widgets/filechooserdialog.h: Rename this to: * glom/utility_widgets/filechooserdialog_saveextras.cc: * glom/utility_widgets/filechooserdialog_saveextras.h: because I want to add another custom one for loading. svn path=/trunk/; revision=1302 2007-11-20 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1301 2007-11-20 Murray Cumming Remove this. 2007-11-20 Murray Cumming * configure.in: * glom/libglom/Makefile.am: * glom/libglom/avahi_publisher.cc: * glom/libglom/avahi_publisher.h: Remove this. * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Replace the old AvahiPublisher with use of libepc. As before, it currently just advertizes the service, but soon it will publish the .glom file. svn path=/trunk/; revision=1300 2007-11-20 Andre Klapper Update German translation (again). 2007-11-20 Andre Klapper * de.po: Update German translation (again). svn path=/trunk/; revision=1299 2007-11-20 Andre Klapper Update German translation. 2007-11-20 Andre Klapper * de.po: Update German translation. svn path=/trunk/; revision=1298 2007-11-19 Murray Cumming Use AM_CPPFLAGS instead of the deprecated INCLUDES. 2007-11-19 Murray Cumming * glom/Makefile.am: * glom/layout_item_dialogs/Makefile.am: * glom/libglom/Makefile.am: * glom/libglom/data_structure/Makefile.am: * glom/libglom/data_structure/layout/Makefile.am: * glom/libglom/data_structure/layout/report_parts/Makefile.am: * glom/libglom/document/Makefile.am: * glom/libglom/python_embed/Makefile.am: * glom/mode_data/Makefile.am: * glom/mode_design/Makefile.am: * glom/mode_design/fields/Makefile.am: * glom/mode_design/print_layouts/Makefile.am: * glom/mode_design/script_library/Makefile.am: * glom/mode_design/users/Makefile.am: * glom/mode_find/Makefile.am: * glom/navigation/Makefile.am: * glom/python_embed/Makefile.am: * glom/python_embed/python_module/Makefile.am: * glom/relationships_overview/Makefile.am: * glom/reports/Makefile.am: * glom/translation/Makefile.am: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/adddel/Makefile.am: * glom/utility_widgets/adddel/eggcolumnchooser/Makefile.am: * glom/utility_widgets/canvas/Makefile.am: * glom/utility_widgets/db_adddel/Makefile.am: Use AM_CPPFLAGS instead of the deprecated INCLUDES. svn path=/trunk/; revision=1297 2007-11-19 Murray Cumming Depend on the latest Bakery. 2007-11-19 Murray Cumming * configure.in: Depend on the latest Bakery. svn path=/trunk/; revision=1295 2007-11-17 Murray Cumming Remove add_item(item, sequence). Added add_item(item, item at position); 2007-11-17 Murray Cumming * glom/libglom/data_structure/layout/layoutgroup.cc: * glom/libglom/data_structure/layout/layoutgroup.h: Remove add_item(item, sequence). Added add_item(item, item at position); Removed remove_item(). Removed m_sequence. Use a vector of items instead of a map. * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Do not load or save the layout item sequence number. Just use the sequence in the XML file. * glom/application.cc: * glom/base_db.cc: * glom/base_db.h: * glom/filechooser_export.cc: * glom/filechooser_export.h: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/layout_item_dialogs/dialog_group_by.cc: * glom/layout_item_dialogs/dialog_groupby_secondaryfields.cc: * glom/layout_item_dialogs/dialog_groupby_secondaryfields.h: * glom/layout_item_dialogs/dialog_groupby_sortfields.cc: * glom/layout_item_dialogs/dialog_notebook.cc: * glom/libglom/data_structure/layout/layoutitem.cc: * glom/libglom/data_structure/layout/layoutitem.h: * glom/libglom/data_structure/layout/layoutitem_portal.cc: * glom/libglom/sharedptr.h: * glom/libglom/test_sharedptr_layoutitem.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_export.cc: * glom/mode_data/dialog_layout_export.h: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_user.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/reports/dialog_layout_report.cc: * glom/reports/report_builder.cc: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: Adapt to the new LayoutGroup API. This is now much simpler - we don't have to worry about the sequence number of keeping the two copies of it in sync. svn path=/trunk/; revision=1293 2007-11-16 Murray Cumming on_dnd_add_layout_item(): Copy/adjust lots of already-ugly ugly code from 2007-11-16 Murray Cumming * glom/utility_widgets/flowtablewithfields.cc: on_dnd_add_layout_item(): Copy/adjust lots of already-ugly ugly code from on_datawidget_layout_item_added() to update the group's list of child items, so that the layout is really saved in the document. Both these functions need to be improved and partly combined. svn path=/trunk/; revision=1291 2007-11-16 Murray Cumming More whitespace fixes. 2007-11-16 Murray Cumming * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: * glom/utility_widgets/flowtablewithfields.cc: More whitespace fixes. svn path=/trunk/; revision=1290 2007-11-16 Murray Cumming Corrected inconsistent whitespace. Do not use tabs. 2007-11-16 Murray Cumming * glom/application.cc: * glom/application.h: * glom/utility_widgets/dragbar.cc: * glom/utility_widgets/dragbar.h: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/placeholder-glom.cc: * glom/utility_widgets/placeholder-glom.h: * glom/utility_widgets/sidebar.cc: * glom/utility_widgets/sidebar.h: Corrected inconsistent whitespace. Do not use tabs. svn path=/trunk/; revision=1289 2007-11-16 Johannes Schmid Fixed Makefile to fix build svn path=/trunk/; revision=1288 2007-11-16 Johannes Schmid Commiting files accidently missed out because of conflicts! svn path=/trunk/; revision=1287 2007-11-16 Andre Klapper Added translator comments to fix bug #497188. 2007-11-16 Andre Klapper * glom/box_db_table_relationships.cc: * glom/glom_developer.glade: Added translator comments to fix bug #497188. svn path=/trunk/; revision=1286 2007-11-16 Johannes Schmid Added SideBar API 2007-11-16 Johannes Schmid * glom/application.cc: * glom/application.h: * glom/glom.glade: Added SideBar API * glom/frame_glom.cc: * glom/frame_glom.h: Show drag sidebar when in developer mode * glom/libglom/data_structure/layout/Makefile.am: * glom/libglom/data_structure/layout/layoutitem_placeholder.cc: * glom/libglom/data_structure/layout/layoutitem_placeholder.h: Added Placeholder Layoutitem for use in drag & drop preview code * glom/utility_widgets/sidebar.cc: * glom/utility_widgets/sidebar.h: * glom/utility_widgets/dragbar.cc: * glom/utility_widgets/dragbar.h: * glom/utility_widgets/dragbutton.cc: * glom/utility_widgets/dragbutton.h: Added sidebar base class and sidebar for dnd code * glom/utility_widgets/Makefile.am: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: * glom/utility_widgets/placeholder-glom.cc: * glom/utility_widgets/placeholder-glom.h: * glom/utility_widgets/test_flowtable.cc: Drag & Drop layout (see http://www.glom.org/wiki/index.php?title=Development/Plans/DragAndDropLayout) and #358092) * icons/16x16/Makefile.am: * icons/glom-field.png: * icons/glom-group.png: Added sidebar icons (stolen from glade-3...) svn path=/trunk/; revision=1285 2007-11-16 Murray Cumming Added translator comments and fixed typos from bug #497188. (Andre 2007-11-16 Murray Cumming * glom/glom_developer.glade: * glom/libglom/data_structure/layout/layoutitem_notebook.cc: * glom/libglom/spawn_with_feedback.cc: * glom/main.cc: * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/translation/window_translations.cc: * glom/utility_widgets/flowtablewithfields.cc: Added translator comments and fixed typos from bug #497188. (Andre Klapper) svn path=/trunk/; revision=1284 2007-11-16 Murray Cumming construct_specified_columns(): Use the font, foreground-color, and 2007-11-16 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: construct_specified_columns(): Use the font, foreground-color, and background-color settings for the list view too. svn path=/trunk/; revision=1283 2007-11-16 Murray Cumming apply_formatting(): Use the correct widget color properties to really set 2007-11-16 Murray Cumming * glom/utility_widgets/layoutwidgetbase.cc: apply_formatting(): Use the correct widget color properties to really set the foreground text color and background color. svn path=/trunk/; revision=1282 2007-11-14 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1281 2007-11-13 Murray Cumming Add an extra repeated link line. Remove the horrible extra member variable 2007-11-13 Murray Cumming * glom/Makefile.am: Add an extra repeated link line. * glom/frame_glom.h: Remove the horrible extra member variable hack around that linker strangeness. * glom/utility_widgets/canvas/Makefile.am: Correct some filenames to fix the distcheck. svn path=/trunk/; revision=1279 2007-11-13 Murray Cumming Handle the drag-motion signal to show a temporary canvas item while 2007-11-13 Murray Cumming * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Handle the drag-motion signal to show a temporary canvas item while dragging. But this does not work - the cursor is grabbed and no further motion events occur, so this is partly commented out. svn path=/trunk/; revision=1278 2007-11-13 Murray Cumming Move dialog creation from the constructor to where they are first used. 2007-11-13 Murray Cumming * glom/frame_glom.cc: * glom/frame_glom.h: Move dialog creation from the constructor to where they are first used. This reduces start-up time slightly, and stops wasting memory, at the cost of slightly (impercetible, hopefully) longer time to open menus. svn path=/trunk/; revision=1277 2007-11-12 Murray Cumming set_default_position svn path=/trunk/; revision=1276 2007-11-12 Murray Cumming on_canvas_drag_drop(): Do not call drag_get_data(). It does not seem 2007-11-12 Murray Cumming * glom/mode_design/print_layouts/window_print_layout_edit.cc: on_canvas_drag_drop(): Do not call drag_get_data(). It does not seem necessary - it causes two drops to happen instead of one. svn path=/trunk/; revision=1275 2007-11-12 Murray Cumming on_adddel_changed(); on_adddel_changed(): Fix the rename confirmation 2007-11-12 Murray Cumming * glom/mode_design/print_layouts/box_print_layouts.cc: on_adddel_changed(); * glom/navigation/box_tables.cc: on_adddel_changed(): Fix the rename confirmation dialog to actually have two buttons. svn path=/trunk/; revision=1274 2007-11-12 Murray Cumming fill_with_data(): Do not try to get data for fields that were not yet 2007-11-12 Murray Cumming * glom/mode_design/print_layouts/canvas_print_layout.cc: fill_with_data(): Do not try to get data for fields that were not yet chosen. svn path=/trunk/; revision=1273 2007-11-09 Murray Cumming Added a toolbar whose items can be dragged to the canvas. It is not 2007-11-09 Murray Cumming * glom/mode_design/print_layouts/Makefile.am: * glom/mode_design/print_layouts/action_layout_item.cc: * glom/mode_design/print_layouts/action_layout_item.h: * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Added a toolbar whose items can be dragged to the canvas. It is not working perfectly and it is not pretty, but it is a start. svn path=/trunk/; revision=1272 2007-11-08 Murray Cumming Added an undockable vertical toolbar to replace the Insert menu. It is not 2007-11-08 Murray Cumming * glom/glom_developer.glade: * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Added an undockable vertical toolbar to replace the Insert menu. It is not very attractive, and it needs to work as a drag source, rather than being clickable items. svn path=/trunk/; revision=1271 2007-11-08 Murray Cumming add_layout_group(): added an is_top_level parameter, so we can avoid 2007-11-08 Murray Cumming * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/mode_design/print_layouts/canvas_print_layout.h: add_layout_group(): added an is_top_level parameter, so we can avoid adding a canvas item for the canvas's own layout group. svn path=/trunk/; revision=1270 2007-11-08 Murray Cumming Copy constructor and operator=(): Copy the page_setup. get_print_layout(), 2007-11-08 Murray Cumming * glom/libglom/data_structure/print_layout.cc: Copy constructor and operator=(): Copy the page_setup. * glom/mode_design/print_layouts/canvas_print_layout.cc: get_print_layout(), set_print_layout(): Actually load/save the page setup. svn path=/trunk/; revision=1269 2007-11-08 Murray Cumming fill_with_data(): Don't crash if no fields are on the layout. 2007-11-08 Murray Cumming * glom/mode_design/print_layouts/canvas_print_layout.cc: fill_with_data(): Don't crash if no fields are on the layout. * glom/printoperation_printlayout.cc: * glom/printoperation_printlayout.h: Handle the paginate signal, though this probably requires the GTK+ patch in bug #345345. svn path=/trunk/; revision=1268 2007-11-07 Murray Cumming Some very minor comments next to some maemo-ifdefs. 2007-11-07 Murray Cumming * glom/libglom/utils.cc: * glom/libglom/utils.h: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Some very minor comments next to some maemo-ifdefs. svn path=/trunk/; revision=1265 2007-11-07 Murray Cumming Added get/set_print_layout_split_across_pages() for future use. 2007-11-07 Murray Cumming * glom/libglom/data_structure/layout/layoutitem.cc: * glom/libglom/data_structure/layout/layoutitem.h: Added get/set_print_layout_split_across_pages() for future use. * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: get/set_node_attribute_value_as_decimal(): Added a default parameter, defaulting to 0, so we can use other values as defaults to avoid superfluous attributes. Used this when loading and saving groups, because 1 column is the default, and 0 is meaningless. * glom/utility_widgets/canvas/canvas_group_movable.cc: * glom/utility_widgets/canvas/canvas_group_movable.h: Store the x and y even before there is a child. * glom/utility_widgets/canvas/Makefile.am: * glom/utility_widgets/canvas/canvas_table_movable.cc: * glom/utility_widgets/canvas/canvas_table_movable.h: Added this canvas item. * glom/utility_widgets/canvas/canvas_item_movable.cc: Support the table item in the cast functions. Return false from some signal handlers, so that other objects can handle them too. * glom/mode_design/print_layouts/canvas_layout_item.cc: set_layout_item(): Create a table canvas item for a portal layout item, though it is currently just a useless test table. * glom/mode_design/print_layouts/canvas_print_layout.cc: Handle the loading and saving of the portal layout item. * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Added an Insert Related Records menu item. svn path=/trunk/; revision=1263 2007-11-06 Gabor Kelemen Added missing files. Close #492203 2007-11-06 Gabor Kelemen * POTFILES.in: Added missing files. Close #492203 svn path=/trunk/; revision=1261 2007-11-06 Armin Burgmeier Merged changes from GLOM_CLIENTONLY branch. This polished up the maemo 2007-11-06 Armin Burgmeier * several files: Merged changes from GLOM_CLIENTONLY branch. This polished up the maemo port a bit. svn path=/trunk/; revision=1260 2007-11-04 Gabor Kelemen *glom/glom_developer.glade: Remove translatable property from stock items. 2007-11-04 Gabor Kelemen *glom/glom_developer.glade: Remove translatable property from stock items. Fixes #493202 svn path=/trunk/; revision=1259 2007-11-04 Gabor Kelemen Translation updated 2007-11-05 Gabor Kelemen * hu.po: Translation updated svn path=/trunk/; revision=1258 2007-11-03 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1257 2007-11-02 Murray Cumming Added this new layout item, only for print layouts. load and save the new 2007-11-02 Murray Cumming * glom/libglom/data_structure/layout/Makefile.am: * glom/libglom/data_structure/layout/layoutitem_line.cc: * glom/libglom/data_structure/layout/layoutitem_line.h: Added this new layout item, only for print layouts. * glom/libglom/document/document_glom.cc: load and save the new layout item. * glom/mode_design/print_layouts/canvas_layout_item.cc: set_layout_item(): Handle the new layout item type, creating a canvas line for it. * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Added Insert menu items, to add horizontal and vertical lines. * glom/utility_widgets/canvas/canvas_group_resizable.cc: * glom/utility_widgets/canvas/canvas_group_resizable.h: Create (and handle) different manipulators if the child is a line. * glom/utility_widgets/canvas/canvas_line_movable.cc: set_coordinates(): Set the x/y/width/height too, for generic code svn path=/trunk/; revision=1256 2007-11-01 Murray Cumming Added new files. 2007-11-01 Murray Cumming * po/POTFILES.in: Added new files. svn path=/trunk/; revision=1255 2007-10-30 Murray Cumming Added bool get_viewing_details(). Handled the notebook's page_switch to 2007-10-30 Murray Cumming * glom/frame_glom.cc: * glom/frame_glom.h: Added bool get_viewing_details(). Handled the notebook's page_switch to refresh the print sub-menu. * glom/application.cc: fill_menu_print_layouts(): Do not list print layouts if we are viewing the list, because they are (currently) only for details. svn path=/trunk/; revision=1254 2007-10-30 Murray Cumming Set m_FoundSet whenever the primary key value is set, so we really print 2007-10-30 Murray Cumming * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: Set m_FoundSet whenever the primary key value is set, so we really print the layout for the current record. * glom/mode_design/print_layouts/canvas_layout_item.cc: set_db_data(): Avoid triggering a crash in goocanvas when setting a NULL pixbuf. Patch sent. svn path=/trunk/; revision=1253 2007-10-30 Murray Cumming set_child(): Really remove the old item. 2007-10-30 Murray Cumming * glom/utility_widgets/canvas/canvas_group_resizable.cc: set_child(): Really remove the old item. svn path=/trunk/; revision=1252 2007-10-30 Murray Cumming Re-enable hiding of the corner and edge manipulators when the cursor is 2007-10-30 Murray Cumming * glom/utility_widgets/canvas/canvas_group_resizable.cc: * glom/utility_widgets/canvas/canvas_group_resizable.h: Re-enable hiding of the corner and edge manipulators when the cursor is not over the item. Add a Rect so we can drag and mouse-over the entire area, not just the part occupied by the text. Store and use the position even when there is no child yet. set_child(): Ignore the initial position of the child: set it to that of self. Document that. Put the manipulators in a group, to simplify the code that ensures their z position. I am gradually more certain that I should have just used a GooCanvasTable for this. * glom/utility_widgets/canvas/canvas_editable.cc: * glom/utility_widgets/canvas/canvas_editable.h: * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/mode_design/print_layouts/canvas_print_layout.h: Override set_grid_gap() so we can make sure that it is above our page bounds rect. svn path=/trunk/; revision=1251 2007-10-30 Ilkka Tuohela Updated Finnish translation svn path=/trunk/; revision=1250 2007-10-29 Murray Cumming Added a View/Fit To Page menu item, and defaulted to this, rescaling as 2007-10-29 Murray Cumming * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Added a View/Fit To Page menu item, and defaulted to this, rescaling as the window is resized. svn path=/trunk/; revision=1249 2007-10-28 Murray Cumming Draw lines to indiciate the page margins (the parts on which the printer 2007-10-28 Murray Cumming * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/mode_design/print_layouts/canvas_print_layout.h: Draw lines to indiciate the page margins (the parts on which the printer cannot print). * glom/printoperation_printlayout.cc: Call set_use_full_page(), because we include the margin space our canvas. svn path=/trunk/; revision=1248 2007-10-28 Murray Cumming fill_with_data(): Use the correct field index, so that the field data is 2007-10-28 Murray Cumming * glom/mode_design/print_layouts/canvas_print_layout.cc: fill_with_data(): Use the correct field index, so that the field data is shown correctly. svn path=/trunk/; revision=1247 2007-10-28 Murray Cumming Add the items to a group, so we can remove them without removing other 2007-10-28 Murray Cumming * glom/utility_widgets/canvas/canvas_editable.cc: * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/mode_design/print_layouts/canvas_print_layout.h: Add the items to a group, so we can remove them without removing other canvas items. set_page_setup(): Make the canvas gray and put a white rectangle on the bottom to show the page bounds. svn path=/trunk/; revision=1246 2007-10-28 Murray Cumming offer_textobject(): Return the starting text if cancel was clicked, so 2007-10-28 Murray Cumming * glom/glom_developer.glade: * glom/base_db.cc: offer_textobject(): Return the starting text if cancel was clicked, so that cancel doesn't clear the text. * glom/layout_item_dialogs/box_formatting.cc: * glom/layout_item_dialogs/box_formatting.h: Replaced the 3 hide* functions with set_is_for_print_layout(). Replace the checkboxes with labels in this case. This is still quite unpleasant but we will eventually have an editor on the layout window, when selection is implemented. * glom/mode_design/print_layouts/canvas_layout_item.cc: * glom/mode_design/print_layouts/canvas_layout_item.h: Make sure that layout items have a font_desc set by default. svn path=/trunk/; revision=1245 2007-10-27 Murray Cumming Fix a typo so that the positions really are preserved. 2007-10-28 Murray Cumming * glom/mode_design/print_layouts/canvas_print_layout.cc: Fix a typo so that the positions really are preserved. svn path=/trunk/; revision=1244 2007-10-27 Murray Cumming set_textobject(): Added a bool show_title parameter. 2007-10-28 Murray Cumming * glom/glom_developer.glade: * glom/layout_item_dialogs/dialog_textobject.cc: * glom/layout_item_dialogs/dialog_textobject.h: set_textobject(): Added a bool show_title parameter. * glom/base_db.cc: * glom/base_db.h: offer_textobject(): Added a bool show_title parameter. * glom/mode_design/print_layouts/canvas_print_layout.cc: update the position before showing edit or formatting dialogs, to avoid losing the position when resetting the layout item. * glom/utility_widgets/canvas/canvas_editable.cc: * glom/utility_widgets/canvas/canvas_editable.h: Added an add_item(item, group) overload, so we can group items together instead of putting them directly in the root group. svn path=/trunk/; revision=1243 2007-10-27 Murray Cumming Call set_unit(), because this apparently affects the cairo context that 2007-10-27 Murray Cumming * glom/printoperation_printlayout.cc: Call set_unit(), because this apparently affects the cairo context that will be provided to us. * glom/utility_widgets/canvas/canvas_text_movable.cc: * glom/utility_widgets/canvas/canvas_text_movable.h: Rename set_font() to set_font_points(), and convert from mm to points, using Pango::FontDescription to manipulate the font_desc string. Text is now an appropriate size, though there is plenty of other weirdness still. svn path=/trunk/; revision=1242 2007-10-25 Claude Paroz Updated French translation. 2007-10-25 Claude Paroz * fr.po: Updated French translation. svn path=/trunk/; revision=1241 2007-10-25 Murray Cumming Added rulers around the canvas, which update appropriately, like in 2007-10-25 Murray Cumming * glom/glom_developer.glade: * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: Added rulers around the canvas, which update appropriately, like in Inkscape. * glom/printoperation_printlayout.cc: Do not scale the context. Everything should already be exactly correct on the canvas. svn path=/trunk/; revision=1240 2007-10-25 Murray Cumming Added m_formatting and get_formatting_used() here, as in LayoutItem_Field. 2007-10-25 Murray Cumming * glom/libglom/data_structure/layout/layoutitem_text.cc: * glom/libglom/data_structure/layout/layoutitem_text.h: Added m_formatting and get_formatting_used() here, as in LayoutItem_Field. They should probably share a base class if this gets silly. * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: load and save the formatting for text items as well as just fields. * glom/layout_item_dialogs/box_formatting.cc: * glom/layout_item_dialogs/box_formatting.h: Added default arguments for set_formatting() parameters, so we can ignore stuff that is only relevant to fields. * glom/mode_design/print_layouts/canvas_layout_item.cc: * glom/mode_design/print_layouts/canvas_layout_item.h: set_layout_item(): Use set_text() rather than property_text(), so that the markup is constructed. Use markup for text items as well as fields. * glom/mode_design/print_layouts/canvas_print_layout.cc: on_context_menu(): Show formatting options for text items as well as fields. * glom/utility_widgets/layoutwidgetbase.cc: * glom/utility_widgets/layoutwidgetbase.h: Added the apply_formatting(widget, formatting) convenience method. * glom/utility_widgets/datawidget.cc: Constructor: Use the apply_formatting() convenience method. * glom/utility_widgets/flowtablewithfields.cc: add_textobject(): Use formatting for text items. svn path=/trunk/; revision=1239 2007-10-24 Murray Cumming Save the font and color formatting for all field types, not just text. 2007-10-24 Murray Cumming * glom/libglom/document/document_glom.cc: Save the font and color formatting for all field types, not just text. * glom/layout_item_dialogs/box_formatting.cc: * glom/layout_item_dialogs/box_formatting.h: Added hide_choices(), hide_multiline(), set_force_show_text_formatting(). enforce_constraints(): Show the font and color options for all field types except booleans, not just text. * glom/mode_design/print_layouts/dialog_text_formatting.cc: * glom/mode_design/print_layouts/dialog_text_formatting.h: Use the new functions to show appropriate options for the print layout items. svn path=/trunk/; revision=1237 2007-10-24 Murray Cumming Put the numeric, text, and choices sections in a notebook, to make the 2007-10-24 Murray Cumming * glom/glom_developer.glade: * glom/layout_item_dialogs/box_formatting.cc: * glom/layout_item_dialogs/box_formatting.h: Put the numeric, text, and choices sections in a notebook, to make the dialog smaller and less scary. Add checkboxes so that the user can choose not to use any special font or colors (to get the defaults). svn path=/trunk/; revision=1236 2007-10-24 Murray Cumming Added window_text_format. 2007-10-24 Murray Cumming * glom/glom_developer.glade: Added window_text_format. * glom/layout_item_dialogs/box_formatting.cc: * glom/layout_item_dialogs/box_formatting.h: Added font and color properties. * glom/libglom/data_structure/layout/fieldformatting.cc: * glom/libglom/data_structure/layout/fieldformatting.h: Added get/set for font and foreground/background colors. * glom/libglom/data_structure/layout/layoutitem.cc: * glom/libglom/data_structure/layout/layoutitem.h: Removed get/set_print_layout_text_size() - We use the new stuff in FieldFormatting instead. * glom/libglom/document/document_glom.cc: Load and save the new field formatting. * glom/mode_design/print_layouts/Makefile.am: * glom/mode_design/print_layouts/dialog_text_formatting.cc: * glom/mode_design/print_layouts/dialog_text_formatting.h: Added a dialog for text formatting, containing the same text formatting options as the field properties layout (via box_formatting.[h|cc] and its glade definition. * glom/mode_design/print_layouts/canvas_layout_item.cc: Use the field formatting to change the font and colors. * glom/utility_widgets/canvas/canvas_text_movable.cc: * glom/utility_widgets/canvas/canvas_text_movable.h: Added set_font(), and set_text(), so we can build the pango markup. * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/mode_design/print_layouts/canvas_print_layout.h: on_context_menu_formatting(): Show the font format dialog, though I need to figure out why the inner box is not visible. * glom/utility_widgets/datawidget.cc: Use the formatting font and properties here, so weird styles can be used on the on-screen layout too. svn path=/trunk/; revision=1235 2007-10-23 Murray Cumming Added get_print_layout_text_size(), though we should have this for 2007-10-23 Murray Cumming * glom/libglom/data_structure/layout/layoutitem.cc: * glom/libglom/data_structure/layout/layoutitem.h: Added get_print_layout_text_size(), though we should have this for on-screen text too. * glom/utility_widgets/canvas/canvas_text_movable.cc: * glom/utility_widgets/canvas/canvas_text_movable.h: Added set_text() and set_text_size(), so we can use pango markup. * glom/mode_design/print_layouts/canvas_layout_item.cc: set_layout_item(): Set the text size from the layout item. * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/mode_design/print_layouts/canvas_print_layout.h: Constructor: Set the units to mm, and set the page setup to a default. set_page_setup(): Change the canvas bounds to match the page setup. * glom/mode_design/print_layouts/window_print_layout_edit.cc: * glom/mode_design/print_layouts/window_print_layout_edit.h: init_menu(): Added zoom items to the view menu, and start with 50%. svn path=/trunk/; revision=1234 2007-10-22 Murray Cumming Added an image item. 2007-10-22 Murray Cumming * glom/utility_widgets/canvas/Makefile.am: * glom/utility_widgets/canvas/canvas_image_movable.cc: * glom/utility_widgets/canvas/canvas_image_movable.h: * glom/utility_widgets/canvas/canvas_item_movable.cc: Added an image item. * glom/utility_widgets/canvas/canvas_group_resizable.cc: * glom/utility_widgets/canvas/canvas_group_resizable.h: Added get_child(). * glom/mode_design/print_layouts/canvas_layout_item.cc: * glom/mode_design/print_layouts/canvas_layout_item.h: Create an image item for image fields, and text items for the other field types. Added set_db_data() which changes the item contents to show real data instead of, for instance, a field name. * glom/mode_design/print_layouts/canvas_print_layout.cc: * glom/mode_design/print_layouts/canvas_print_layout.h: Added fill_with_data(). * glom/mode_data/box_data_details.cc: init_db_details(): Set the m_found_set where_clause from the primary key details so we can use it later. * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: Added get_found_set_details(). * glom/frame_glom.cc: on_menu_print_layout_selected(): Fill the canvas with data before printing, from the currently viewed details record. svn path=/trunk/; revision=1233 2007-10-22 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1232 2007-10-22 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1231 2007-10-22 Murray Cumming Merged from the glom-precise-printing branch, because I have made most of 2007-10-23 Murray Cumming * Merged from the glom-precise-printing branch, because I have made most of the large changes, and I want to reduce the number of branches that we are working on. svn path=/trunk/; revision=1230 2007-10-18 Murray Cumming Added check_user_is_not_root(). Do not allow the user to start glom as 2007-10-18 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Added check_user_is_not_root(). * glom/main.cc: Do not allow the user to start glom as root (or sudo) because postgres cannot start as root, and it is generally a bad idea for a networked application. Thanks to Norman for identifying the problem. svn path=/trunk/; revision=1223 2007-10-18 Murray Cumming on_button_test(): Warn if there is no return statement because it is easy 2007-10-18 Murray Cumming * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/mode_design/fields/dialog_fieldcalculation.h: on_button_test(): Warn if there is no return statement because it is easy to forget this for simple calculations. Thanks to Federico Munerotto for showing that this check is helpful. svn path=/trunk/; revision=1221 2007-10-17 Murray Cumming Copy constructor: copy m_field_info instead of sharing one 2007-10-17 Murray Cumming * glom/libglom/data_structure/field.cc: * glom/libglom/data_structure/field.h: Copy constructor: copy m_field_info instead of sharing one reference-counted instance. get_field_info(): Add a const overload and make the existing one non-const. This const correctness should prevent us from using the same instance when we actually want to explicitly take a copy. This errors were probably caused during the port to libgda 3.0, when Gda::Column became a reference-counted object. * glom/mode_design/fields/box_db_table_definition.cc: get_field_definition(): copy the field_info instead of just reusing the existing one, to avoid changing the original field_info accidentally. These changes make field type changes actually work again in 1.6. svn path=/trunk/; revision=1218 2007-10-16 Murray Cumming Use the latest goocanvasmm API, with different pgk-config and include 2007-10-16 Murray Cumming * configure.in: * glom/main.cc: * glom/relationships_overview/dialog_relationships_overview.h: * glom/relationships_overview/printoperation_relationshipsoverview. h: Use the latest goocanvasmm API, with different pgk-config and include path. svn path=/trunk/; revision=1210 2007-10-14 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1203 2007-10-14 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1202 2007-10-12 Armin Burgmeier Fixed #ifdef from last commit, it is supposed to be #ifndef. 2007-10-12 Armin Burgmeier * glom/libglom/connectionpool.cc: Fixed #ifdef from last commit, it is supposed to be #ifndef. svn path=/trunk/; revision=1198 2007-10-11 Armin Burgmeier Don't use deprecated gtkmm API. 2007-10-11 Armin Burgmeier * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/adddel/adddel.cc: Don't use deprecated gtkmm API. * glom/libglom/connectionpool.cc: (ConnectionPool::check_postgres_gda_with_warning): Use Hildon::Note instead of Gtk::MessageDialog in maemo version. svn path=/trunk/; revision=1197 2007-10-11 Murray Cumming Fix the build for the latest goocanvasmm API, though all this code has 2007-10-11 Murray Cumming * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/printoperation_relationshipsoverview. cc: Fix the build for the latest goocanvasmm API, though all this code has been reworked in the glom-precise-printouts branch. svn path=/trunk/; revision=1192 2007-10-08 Gil Forcada Codinachs Updated Catalan translation svn path=/trunk/; revision=1180 2007-10-07 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1174 2007-10-07 MMurray Cumming Get the bounds of the root item rather than of the whole canvas, for more 2007-10-07 MMurray Cumming * glom/relationships_overview/printoperation_relationshipsoverview. cc: Get the bounds of the root item rather than of the whole canvas, for more suitable scaling. svn path=/trunk/; revision=1173 2007-10-05 Murray Cumming scale before printing, because that is how cairo works. 2007-10-05 Murray Cumming * glom/relationships_overview/dialog_relationships_overview.h: * glom/relationships_overview/printoperation_relationshipsoverview. cc: scale before printing, because that is how cairo works. svn path=/trunk/; revision=1170 2007-10-05 Murray Cumming Some basic printing support for the relationships overview (via a menu 2007-10-05 Murray Cumming * glom/glom.glade: * glom/relationships_overview/Makefile.am: * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: * glom/relationships_overview/printoperation_relationshipsoverview. cc: * glom/relationships_overview/printoperation_relationshipsoverview. h: Some basic printing support for the relationships overview (via a menu item in the dialog, which is probably bad UI, but I don't like the idea of extra buttons either). It currently does not scale to fit the page, and does not offer landscape printing. svn path=/trunk/; revision=1168 2007-10-04 Murray Cumming Restored some code that I shouldn't have deleted svn path=/trunk/; revision=1167 2007-10-04 Murray Cumming minor reordering of methods svn path=/trunk/; revision=1166 2007-10-04 Murray Cumming Depend on goocanvasmm. initialize goocanvasmm if not in client-only mode. 2007-10-04 Murray Cumming * configure.in: Depend on goocanvasmm. * glom/main.cc: initialize goocanvasmm if not in client-only mode. * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: Use C++ types as much as possible (often using Glib::wrap() instead of the goocanvasmm constructors, because they are currently broken), and generally clean up this code a bit. svn path=/trunk/; revision=1165 2007-10-03 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1163 2007-10-02 Murray Cumming Added a comment hint about ParentWindow. svn path=/trunk/; revision=1162 2007-10-01 Armin Burgmeier Merged changes from the GLOM_CLIENTONLY branch. This adds an 2007-10-01 Armin Burgmeier * several files: Merged changes from the GLOM_CLIENTONLY branch. This adds an --enable-maemo configure option that builds a clientonly version of glom for the maemo platform. See the ChangeLog in the GLOM_CLIENTONLY branch for a detailed list of changes. svn path=/trunk/; revision=1156 2007-10-01 Murray Cumming get_record_counts(): Return the stored record count (from the extra COUNT 2007-10-01 Murray Cumming * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: get_record_counts(): Return the stored record count (from the extra COUNT query), instead of using DataModel::get_n_rows(), because that returns -1 when using the iter-only model. svn path=/trunk/; revision=1151 2007-09-28 Murray Cumming Added get_sql_name(), to get the fully qualified field name (with the 2007-09-28 Murray Cumming * glom/libglom/data_structure/layout/layoutitem_field.cc: * glom/libglom/data_structure/layout/layoutitem_field.h: Added get_sql_name(), to get the fully qualified field name (with the table name and .). * glom/libglom/utils.cc: build_sql_select_with_where_clause(): Use get_sql_name() instead of building the name here, to simplify that code slightly. * glom/libglom/connectionpool.cc: handle_error(): When getting the text of errors, ignore any events that are not Gnome::Gda::CONNECTION_EVENT_ERROR, to avoid showing other irrelevant warnings. This requires the latest libgdamm. * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Remove the useless m_column_record member variable. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: refresh_from_database(), fill_values_if_necessary(): Create an iter-only model (needs the latest libgda, glibmm, and rebuilt libgdamm), to hopefully only get the data that we actually want. svn path=/trunk/; revision=1149 2007-09-27 Armin Burgmeier Make the entry_quickfind not activate the default button when pressing 2007-09-27 Armin Burgmeier * glom/glom.glade: Make the entry_quickfind not activate the default button when pressing enter because glom already connects signal_activate(). When no find criteria was entered, two error dialogs were shown at the same time. svn path=/trunk/; revision=1148 2007-09-26 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1147 2007-09-20 Armin Burgmeier Load "connection failed" dialog also in client only mode to prevent a 2007-09-20 Armin Burgmeier * glom/frame_glom.cc: Load "connection failed" dialog also in client only mode to prevent a crash when that dialog is supposed to be displayed. * glom/main.cc: Don't include in client only mode. svn path=/trunk/; revision=1146 2007-09-15 Murray Cumming initialize gtksourceviewmm so that the GType is available to libglade, to 2007-09-15 Murray Cumming * glom/main.cc: initialize gtksourceviewmm so that the GType is available to libglade, to avoid a warning (and possibly a crash). svn path=/trunk/; revision=1144 2007-09-15 Murray Cumming create_layout(): Do not try to add the previously-used primary key if 2007-09-15 Murray Cumming * glom/mode_data/box_data_list.cc: create_layout(): Do not try to add the previously-used primary key if there is no primary key in the table (for instance, if there are no fields in the table). This avoids an internal postgres warning about a non-existant field. * glom/utility_widgets/db_adddel/db_adddel.cc: Clear the model if there are no fields. This prevents a crash at startup if a table has no fields. svn path=/trunk/; revision=1143 2007-09-14 Armin Burgmeier Merged changes from the GLOM_CLIENTONLY branch. This adds an 2007-09-14 Armin Burgmeier * several files: Merged changes from the GLOM_CLIENTONLY branch. This adds an --enable-client-only configure option that disables support for developer mode and self-hosting. See the ChangeLog in the GLOM_CLIENTONLY branch for a detailed list of changes. svn path=/trunk/; revision=1142 2007-09-13 Murray Cumming Ported to the latest gtksourceviewmm, using the gtksourceview-2.0 API. 2007-09-13 Murray Cumming * configure.in: * glom/layout_item_dialogs/dialog_buttonscript.cc: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/mode_design/script_library/dialog_script_library.cc: Ported to the latest gtksourceviewmm, using the gtksourceview-2.0 API. This is svn trunk. See also the glom-1-6 branch. svn path=/trunk/; revision=1141 2007-09-12 Murray Cumming Updated NEWS svn path=/trunk/; revision=1139 2007-09-11 Murray Cumming Increased version svn path=/trunk/; revision=1138 2007-09-10 Murray Cumming Increased version svn path=/trunk/; revision=1137 2007-09-10 Murray Cumming Added a handle_error(Glib::Exception) overload. 2007-09-10 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added a handle_error(Glib::Exception) overload. * glom/frame_glom.cc: * glom/main.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/reports/report_builder.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Catch Glib::Exceptions as well as std::exception, hopefully allowing us to catch more errors without crashing. svn path=/trunk/; revision=1136 2007-09-10 Murray Cumming Fix a warning. std::string::find() returns npos, not -1 when it fails. 2007-09-10 Murray Cumming * glom/glom_privs.cc: Fix a warning. std::string::find() returns npos, not -1 when it fails. svn path=/trunk/; revision=1135 2007-09-05 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1134 2007-09-03 Murray Cumming Increased version svn path=/trunk/; revision=1133 2007-09-02 Murray Cumming updating the fields in the document unnecessarily. This avoid a warning 2007-09-03 Murray Cumming updating the fields in the document unnecessarily. This avoid a warning about unsaved changes when closing, even in operator mode. * glom/libglom/document/document_glom.cc: set_modified(): Do nothing if the user is not in developer mode, because there are legitimate times when things can change temporarily in operator mode. svn path=/trunk/; revision=1132 2007-09-02 Murray Cumming When the first postgres shutdown fails (as happens under valgrind, and in 2007-09-03 Murray Cumming * glom/libglom/connectionpool.cc: When the first postgres shutdown fails (as happens under valgrind, and in bug #420962) try again, though that seems to fail too. svn path=/trunk/; revision=1131 2007-09-02 Murray Cumming save_before_layout_item_field_formatting(), 2007-09-02 Murray Cumming * glom/libglom/document/document_glom.cc: save_before_layout_item_field_formatting(), load_after_layout_item_field_formatting(), * glom/utility_widgets/datawidget.cc: constructor: Ignore the multiline formatting options for non-text fields, so that these will not be used for number fields if they were used before changing the field from text to number. Bug #443360 (Harry Mills) svn path=/trunk/; revision=1130 2007-09-01 Murray Cumming start_self_hosting(): Specify a Linux/Unix SIGSEGV signal handler so we 2007-09-02 Murray Cumming * glom/libglom/connectionpool.cc: start_self_hosting(): Specify a Linux/Unix SIGSEGV signal handler so we stop postgres when we crash. I wonder if there is a way to still have bug-buddy's crash reports while doing this. svn path=/trunk/; revision=1129 2007-08-19 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1128 2007-08-18 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1127 2007-08-17 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1126 2007-08-16 Adam Weinberger Sorted and added missing files. 2007-08-15 Adam Weinberger * POTFILES.in: Sorted and added missing files. svn path=/trunk/; revision=1125 2007-07-29 Yannig MARCHEGAY Updated Occitan translation svn path=/trunk/; revision=1124 2007-06-26 Pema Geyleg updated dzongkha translation svn path=/trunk/; revision=1123 2007-06-15 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1122 2007-06-10 Murray Cumming 1.5.2 (unstable): 2007-06-10 Murray Cumming * glom/libglom/spawn_with_feedback.cc: execute_command_line_on_thread_create(): Do not delete the data before using it, to avoid a crash. * configure.ac: Depend on the latest versions of libgdamm and libxml++, which also have fixes for crashes in Glom. svn path=/trunk/; revision=1121 2007-06-07 Claude Paroz Updated French translation. svn path=/trunk/; revision=1119 2007-06-05 Ignacio Casal Quinteiro Added Galician Translation. svn path=/trunk/; revision=1118 2007-05-22 Yselkowitz Increased version and 2007-05-22 Yselkowitz * glom/libglom/Makefile.am: * glom/libglom/connectionpool.cc: Cygwin/Windows fix: Expect the EXEEXT file extension when searching for postmaster. Bug #440335. svn path=/trunk/; revision=1116 2007-05-20 Murray Cumming Check for the pgk-config file of the libgda postgres providers. 2007-05-20 Murray Cumming * configure.in: Check for the pgk-config file of the libgda postgres providers. * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: * glom/main.cc: Added and used check_postgres_gda_client_is_available_with_warning() to do a runtime check for the presence of the libgda postgres provider. svn path=/trunk/; revision=1115 2007-05-16 Johannes Schmid #361171 - Show Python erros in a dialog 2007-05-14 Johannes Schmid * glom/python_embed/glom_python.cc: #361171 - Show Python erros in a dialog svn path=/trunk/; revision=1113 2007-05-16 David Lodge Updated en_GB translation svn path=/trunk/; revision=1112 2007-05-15 Jorge Gonzalez Gonzalez Updated Spanish translation svn path=/trunk/; revision=1111 2007-05-14 Armin Burgmeier Removed these files since they are no longer used. 2007-05-14 Armin Burgmeier * glom/relationships_overview/relationships_canvas.cc: * glom/relationships_overview/relationships_canvas.h: * glom/relationships_overview/relationshipscanvas_tablewidget.cc: * glom/relationships_overview/relationshipscanvas_tablewidget.h: * glom/relationships_overview/table_canvasitem.h: * glom/relationships_overview/table_canvasitem.cc: Removed these files since they are no longer used. * glom/relationships_overview/Makfile.am: Removed aforementioned files from build. * glom/relationships_overview/dialog_relationships_overview.h: * glom/main.cc: Do not initialize/include libgnomecanvasmm anymore. * configure.in: Dropped dependency on libgnomecanvasmm. svn path=/trunk/; revision=1108 2007-05-14 Daniel Nylander sv.po: Updated Swedish translation svn path=/trunk/; revision=1107 2007-05-14 Daniel Nylander sv.po: Updated Swedish translation svn path=/trunk/; revision=1106 2007-05-13 Armin Burgmeier Sort most recently used files first. 2007-05-13 Armin Burgmeier * glom/glom.glade: Sort most recently used files first. * glom/application.h: * glom/appliaction.cc: Added m_example_uri field that stores the URI of the opened example file. This is checked against in document_history_ad() to prevent adding of example files into the recent files list. svn path=/trunk/; revision=1105 2007-05-10 Murray Cumming Require libgda 3.0.1, which is the first version that works enough for 2007-05-10 Murray Cumming * configure.in: Require libgda 3.0.1, which is the first version that works enough for Glom. svn path=/trunk/; revision=1104 2007-05-09 Murray Cumming Override document_history_add from the Bakery App_WithDoc class, to try 2007-05-09 Murray Cumming * glom/application.cc: * glom/application.h: Override document_history_add from the Bakery App_WithDoc class, to try (unsuccessfully so far) to prevent adding of example files to the recent files list. offer_new_or_existing(): Do not shown non-existing recent files. svn path=/trunk/; revision=1103 2007-05-08 Armin Burgmeier Merged changes from the GLOM_LIBGDA3 branch. Glom now builds against the 2007-05-08 Armin Burgmeier * several files: Merged changes from the GLOM_LIBGDA3 branch. Glom now builds against the new libgda and pygda API. See the ChangeLog in that branch for a more detailed view of what has exactly changed. svn path=/trunk/; revision=1102 2007-05-01 Armin Burgmeier Do not leak the file chooser dialog in ui_file_select_save(). 2007-05-01 Armin Burgmeier * glom/application.cc: Do not leak the file chooser dialog in ui_file_select_save(). svn path=/trunk/; revision=1100 2007-04-25 Jorge Gonzalez Gonzalez Updated spanish translation svn path=/trunk/; revision=1099 2007-04-24 Armin Burgmeier Fixed the dialog so that the recent chooser is below the text and in its 2007-04-23 Armin Burgmeier * glom/glade.glom: Fixed the dialog so that the recent chooser is below the text and in its own frame. * glom/application.cc: Hide the recent chooser when they are no recently used items. svn path=/trunk/; revision=1098 2007-04-23 Murray Cumming Used build rules like the ones in totem, to install these icons. 2007-04-23 Murray Cumming * configure.in: * icons/16x16/Makefile.am: * icons/22x22/Makefile.am: * icons/24x24/Makefile.am: * icons/32x32/Makefile.am: * icons/48x48/Makefile.am: * icons/Makefile.am: * icons/scalable/Makefile.am: Used build rules like the ones in totem, to install these icons. svn path=/trunk/; revision=1097 2007-04-23 Murray Cumming Used build rules like the ones in totem, to install these icons. 2007-04-23 Murray Cumming * configure.in: * icons/16x16/Makefile.am: * icons/22x22/Makefile.am: * icons/24x24/Makefile.am: * icons/32x32/Makefile.am: * icons/48x48/Makefile.am: * icons/Makefile.am: * icons/scalable/Makefile.am: Used build rules like the ones in totem, to install these icons. svn path=/trunk/; revision=1096 2007-04-23 Murray Cumming Used build rules like the ones in totem, to install these icons. 2007-04-23 Murray Cumming * configure.in: * icons/16x16/Makefile.am: * icons/22x22/Makefile.am: * icons/24x24/Makefile.am: * icons/32x32/Makefile.am: * icons/48x48/Makefile.am: * icons/Makefile.am: * icons/scalable/Makefile.am: Used build rules like the ones in totem, to install these icons. svn path=/trunk/; revision=1095 2007-04-23 Murray Cumming Used build rules like the ones in totem, to install these icons. 2007-04-23 Murray Cumming * configure.in: * icons/16x16/Makefile.am: * icons/22x22/Makefile.am: * icons/24x24/Makefile.am: * icons/32x32/Makefile.am: * icons/48x48/Makefile.am: * icons/Makefile.am: * icons/scalable/Makefile.am: Used build rules like the ones in totem, to install these icons. svn path=/trunk/; revision=1094 2007-04-23 Andreas Nilsson new application icons svn path=/trunk/; revision=1093 2007-04-23 Armin Burgmeier Added a RecentChooser widget to the initial dialog that allows to open 2007-04-22 Armin Burgmeier * glom/application.cc: * glom/glom.glade: Added a RecentChooser widget to the initial dialog that allows to open quickly a recently used file, as requested in bug #349355. * configure.in: Depend on gtkmm-2.10 to make use of the new RecentChooser API in GTK+. However, this needs some more work to make it look less awkward. murrayc. svn path=/trunk/; revision=1092 2007-04-21 Djihed Afifi Updated Arabic Translation by Djihed Afifi. svn path=/trunk/; revision=1089 2007-04-15 Armin Burgmeier Added support for a new example rows format where the value of each field 2007-04-10 Armin Burgmeier * glom/libglom/document/document_glom.cc: Added support for a new example rows format where the value of each field is identified by the field name rather than the field index, to be more robust against changes. * glom/libglom/utils.cc (string_separate): For each quoted occurence, do no longer put an empty string in the result vector when ignore_quoted_separator is set. svn path=/trunk/; revision=1088 2007-04-14 Djihed Afifi Updated Arabic Translation by Djihed Afifi. svn path=/trunk/; revision=1087 2007-04-01 Murray Cumming po/en_GB.po: Restore the date printf format that was removed by David 2007-04-01 Murray Cumming po/en_GB.po: Restore the date printf format that was removed by David Lodge on 2006-09-12. This date format translation corrects the parsing and display of 4-digit dates. Bug #425116 svn path=/trunk/; revision=1085 2007-03-29 Stéphane Raimbault Updated French by Claude Paroz and Stéphane Raimbault. 2007-03-28 Stéphane Raimbault * fr.po: Updated French by Claude Paroz and Stéphane Raimbault. svn path=/trunk/; revision=1080 2007-03-28 Pema Geyleg svn path=/trunk/; revision=1078 svn path=/trunk/; revision=1078 2007-03-20 Murray Cumming Remove some debug output. svn path=/trunk/; revision=1075 2007-03-20 Murray Cumming Remove some debug output. svn path=/trunk/; revision=1073 2007-03-20 Mathias Hasselmann Modify the default pg_hba.conf to allow TCP/IP connections from any host 2007-03-20 Mathias Hasselmann * glom/libglom/connectionpool.cc: Modify the default pg_hba.conf to allow TCP/IP connections from any host when doing self-hosting. Previously it had mistakenly only allowed connections from 127.0.0.1 (localhost). Interestingly, not all local computers can be identified as 127.0.0.1 either, so the connection was failing for some local computers too. (ChangeLog comments from Murray) svn path=/trunk/; revision=1070 2007-03-20 Murray Cumming Added a show_ok_dialog() method, becasue it is silly to always call the on 2007-03-20 Murray Cumming * glom/libglom/utils.cc: * glom/libglom/utils.h: Added a show_ok_dialog() method, becasue it is silly to always call the on in Frame_Glom. * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: create_self_hosting(): Take a parent window so we can show some warning dialogs if something goes wrong. None of these have actually been experienced though. * glom/application.cc: ui_file_select_save(): If doing self-hosting then check that the directory does not exist already, and warn the user. For instance, you might specify test.glom, which would then creat test/test.glom, so it will warn if test/ already exists. Bug # 420482 (Mathias Hasselmann) svn path=/trunk/; revision=1069 2007-03-20 Murray Cumming connection_request_password_and_choose_new_database_name(): Do not 2007-03-20 Murray Cumming * glom/frame_glom.cc: connection_request_password_and_choose_new_database_name(): Do not redeclare response variable, so we do not mistakenly think we failed later. This is just a fix of the last commit. 2007-03-20 Murray Cumming * glom/dialog_new_self_hosted_connection.cc: * glom/dialog_new_self_hosted_connection.h: * glom/frame_glom.cc: * glom/glom.glade: * glom/mode_design/users/dialog_user.cc: Add a password confirm entry to the dialog, check it, and check that the user name is not empty. As well as being obviously useful, this will make it more obvious that you are entering a new user/password confirmation, instead of an existing one. svn path=/trunk/; revision=1067 2007-03-19 Murray Cumming Removed an unnessary static keyword on a typedef, which broke the build 2007-03-19 Murray Cumming * glom/libglom/utils.cc: Removed an unnessary static keyword on a typedef, which broke the build with some compilers. svn path=/trunk/; revision=1063 2007-03-16 Murray Cumming Enable the Relationships Overview code. 2007-02-16 Murray Cumming * configure.in: * glom/Makefile.am: * glom/frame_glom.cc: Enable the Relationships Overview code. svn path=/trunk/; revision=1061 2007-03-16 Josep Puigdemont i Casamajó Updated Catalan translation by Gil Forcada. svn path=/trunk/; revision=1060 2007-03-15 Murray Cumming Marked 1.4.0 in ChangeLog svn path=/trunk/; revision=1058 2007-03-12 Murray Cumming Preparatins for a 1.4.0 release svn path=/trunk/; revision=1057 2007-03-11 David Lodge Update en_GB translation svn path=/trunk/; revision=1056 2007-03-10 Murray Cumming Added check_password(), which warns about an empty password or a password 2007-03-10 Murray Cumming * glom/mode_design/users/dialog_user.cc: * glom/mode_design/users/dialog_user.h: Added check_password(), which warns about an empty password or a password confirmation failure. * glom/mode_design/users/dialog_users_list.cc: When adding or editing a user, check the password, using check_password(). svn path=/trunk/; revision=1054 2007-03-09 Murray Cumming Increased version svn path=/trunk/; revision=1052 2007-03-09 Murray Cumming Privs::get_table_privileges(): Cope with the changed pg_class.relacl 2007-03-09 Murray Cumming * glom/glom_privs.cc: Privs::get_table_privileges(): Cope with the changed pg_class.relacl format in Postgres 8.x (8.2, maybe >=8.0), which does not have the group prefix, now that users and groups are both just roles to Postgres. The user/group distinction will remain in the Glom UI, because it is a sensible way to organise the access rights. This should still be able to cope with earlier versions of Postgres, such as Postgres 7.4, but I have not tested that myself. * glom/main.cc: Stop when there is a problem parsing the command line options, and give a hint about using --help. svn path=/trunk/; revision=1051 2007-03-07 Murray Cumming Added missing files svn path=/trunk/; revision=1049 2007-03-07 Murray Cumming Commented-out the use of avahi, because our use of it seems to be 2007-03-07 Murray Cumming * glom/libglom/connectionpool.cc: Commented-out the use of avahi, because our use of it seems to be unstable, and it does not do anything useful yet anyway. svn path=/trunk/; revision=1048 2007-03-06 Murray Cumming Moved the avahi code into its own class, to keep the ConnectionPool class 2007-03-06 Murray Cumming * glom/libglom/Makefile.am: * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Moved the avahi code into its own class, to keep the ConnectionPool class simpler. The async stuff might mean that we cannot tie the avahi publishing to an instance lifetime, but lets see. * glom/libglom/test_avahi_publisher.cc: Added a test case for just the avahi utility class. svn path=/trunk/; revision=1047 2007-03-05 Armin Burgmeier Added a signal_script_button_clicked that is emitted when the user clicks 2007-03-04 Armin Burgmeier * glom/utilitiy_widgets/db_adddel/db_adddel.h: * glom/utilitiy_widgets/db_adddel/db_adddel.cc: Added a signal_script_button_clicked that is emitted when the user clicks on a list button. * glom/mode_data/box_data.h: * glom/mode_data/box_data.cc: Added a execute_button_script() function. * glom/mode_data/box_data_details.cc: Make use of it. * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list.cc: Listen on signal_script_button_clicked from m_AddDel and execute the script. Refresh the list because the script may have altered it. This is done in an idle handler because it crashes Glom otherwise. svn path=/trunk/; revision=1044 2007-03-04 Murray Cumming Add a comment about the hope of using just the pg_ctl result code in 2007-03-04 Murray Cumming * glom/libglom/connectionpool.cc: Add a comment about the hope of using just the pg_ctl result code in future. svn path=/trunk/; revision=1043 2007-03-03 Murray Cumming When checking if the postgres instance has finished starting, check for is 2007-03-03 Murray Cumming * glom/libglom/connectionpool.cc: When checking if the postgres instance has finished starting, check for is running rather than postmaster is running, because this message has changed in postgres 8.2. Yes, this is a nasty hack anyway, and we need a better way to programatically know when the local server is running. svn path=/trunk/; revision=1042 2007-03-03 Armin Burgmeier Remove shadow from Viewport that is created by Gtk::ScrolledWindow::add(). 2007-03-02 Armin Burgmeier * glom/mode_data/box_data_details.cc: Remove shadow from Viewport that is created by Gtk::ScrolledWindow::add(). svn path=/trunk/; revision=1041 2007-03-02 Murray Cumming Use --copy with gnome-doc-prepare, because that is what gnome-common does. 2007-03-02 Murray Cumming * autogen.sh: Use --copy with gnome-doc-prepare, because that is what gnome-common does. * configure.in: Specify 0.9.0 to GNOME_DOC_INIT() Change the default postgres tools path to use 8.2, as used on Ubuntu Feisty, to make my life easier. svn path=/trunk/; revision=1040 2007-02-22 Murray Cumming Increased version svn path=/trunk/; revision=1039 2007-02-22 Murray Cumming Add 5434 to the list of ports to try, because this is used in the current 2007-02-22 Murray Cumming * glom/libglom/connectionpool.cc: Add 5434 to the list of ports to try, because this is used in the current Ubuntu Feisty beta for Postgres 8.2, though this might be changed in later Ubuntu Feisty betas. Also added 5435 and 5436 for the future. svn path=/trunk/; revision=1038 2007-02-18 David Lodge Updated en_GB translation svn path=/trunk/; revision=1037 2007-02-17 Murray Cumming Corrected the title of the relationships overview window. 2007-02-17 Murray Cumming * glom/glom.glade: Corrected the title of the relationships overview window. svn path=/trunk/; revision=1036 2007-02-17 Murray Cumming More cleanup. 2007-02-17 Murray Cumming * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: More cleanup. svn path=/trunk/; revision=1035 2007-02-17 Murray Cumming More syntax corrections. 2007-02-17 Murray Cumming,,, * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: More syntax corrections. svn path=/trunk/; revision=1034 2007-02-17 David Lodge Updated (British) English translation svn path=/trunk/; revision=1033 2007-02-16 MMurray Cumming Remeber the windows size between instantiations, temporarily for the 2007-02-16 MMurray Cumming * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: Remeber the windows size between instantiations, temporarily for the lifetime of the application. svn path=/trunk/; revision=1032 2007-02-16 Rasmus Toftdahl Olesen Patch in Bug #408408 to correct the source code formatting. 2007-02-16 Rasmus Toftdahl Olesen * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: Patch in Bug #408408 to correct the source code formatting. svn path=/trunk/; revision=1031 2007-02-16 Murray Cumming fill_from_database() methods: Do not try to open a connection if the 2007-02-16 Murray Cumming * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_list_find.cc: fill_from_database() methods: Do not try to open a connection if the document is NULL, to stop a connection error dialog while closing, after we have stopped self-hosting. svn path=/trunk/; revision=1030 2007-02-16 Murray Cumming When starting self-hosting, double-check that the directory is there so we 2007-02-16 Murray Cumming * glom/application.cc: * glom/frame_glom.cc: * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: When starting self-hosting, double-check that the directory is there so we can fail more pleasantly, in this rare case. svn path=/trunk/; revision=1029 2007-02-16 Murray Cumming Publishers table: Correct the Albums relationship, and add a list of 2007-02-16 Murray Cumming * examples/example_music_collection.glom: Publishers table: Correct the Albums relationship, and add a list of related albums to the details view. svn path=/trunk/; revision=1028 2007-02-16 Murray Cumming Added an override of load_from_document() so that the tables are actually 2007-02-16 Murray Cumming * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: Added an override of load_from_document() so that the tables are actually shown on the canvas. svn path=/trunk/; revision=1027 2007-02-16 Rasmus Toftdahl Olesen Updated for latest goocanvas API. Note that this code is disabled by 2007-02-16 Rasmus Toftdahl Olesen * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: Updated for latest goocanvas API. Note that this code is disabled by default. Bug #408408. svn path=/trunk/; revision=1026 2007-02-16 Murray Cumming Increased version svn path=/trunk/; revision=1025 2007-02-16 Murray Cumming Added check_postgres_is_available_with_warning(), and install_postgress(). 2007-02-16 Murray Cumming * glom/libglom/Makefile.am: * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Added check_postgres_is_available_with_warning(), and install_postgress(). That latter may be patched by distros that choose (wrongly, I believe) not to make Glom depend on Postgres at install-time. There is some commented-out example code, with many helpful comments, implementing the install-at-runtime code for Ubuntu/Debian. * glom/libglom/gst-package.c: * glom/libglom/gst-package.h: ifdefed-out helper code, taken from the Ubuntu/Debian patches for gnome-system-tools. * glom/main.cc: main(): Call check_postgres_is_available_with_warning(). If Postgres is not installed, and cannot be installed, then Glom will quit. svn path=/trunk/; revision=1024 2007-02-13 Murray Cumming Increase version svn path=/trunk/; revision=1023 2007-02-12 Murray Cumming Depend on avahi-glib. 2007-02-12 Murray Cumming * configure.in: Depend on avahi-glib. * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Added avahi_start_publishing() and avahi_stop_publishing() and use them to advertise the database server when self-hosting, with a made-up avahi service type name. This is rough code based on the avahi examples. I want to clean it up and maybe separate it into a separate class. svn path=/trunk/; revision=1022 2007-02-11 Murray Cumming When creating a new database (not from an example) show the extended 2007-02-11 Murray Cumming * glom/application.cc: When creating a new database (not from an example) show the extended FileChooserDialog again, by setting our new boolean. svn path=/trunk/; revision=1021 2007-02-11 Murray Cumming get_connection_self_hosted_directory_uri(): Use just glom_postgres_data 2007-02-11 Murray Cumming * glom/libglom/document/document_glom.cc: get_connection_self_hosted_directory_uri(): Use just glom_postgres_data for the subdirectory name, to create and to look for, for self hosting, instead of prefixing it by the glom file name. This is less ugly, and it should be safe enough because it is all inside the directory. * glom/application.cc: get_file_uri_without_extension(): Do not ignore the return value of Gnome::Vfs::Uri::append_string(). This should not have worked before, and still seems to work now. Odd. svn path=/trunk/; revision=1020 2007-02-11 Murray Cumming Always use a dynamically-found port number when starting self-hosting, 2007-02-11 Murray Cumming * glom/libglom/connectionpool.cc: Always use a dynamically-found port number when starting self-hosting, instead of only determining it when creating the file, by using the -p and -h arguments to postmaster instead of specifying the same information in a postgresql.conf file. svn path=/trunk/; revision=1019 2007-02-11 Murray Cumming Add discover_first_free_port() helper function, based on recommendation 2007-02-11 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Add discover_first_free_port() helper function, based on recommendation from Lennart Poettering. Use it to try a series of ports when deciding what port to use for self-hosting. However, this should be tested every time we start the server, not just when creating the files. svn path=/trunk/; revision=1018 2007-02-11 Murray Cumming Remove the Gtk::Paned parent widget. Its functionality was not used. It 2007-02-11 Murray Cumming * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: Remove the Gtk::Paned parent widget. Its functionality was not used. It was just a relic from a previous nasty UI. Replaced it with a ScrolledWindow that does vertical scrolling when necessary. Hopefully this will prevent the window from sometimes being too high for the screen. Layout is variable height rather than variable width, so this makes sense. I also need to make the window take as much vertical space as it can. svn path=/trunk/; revision=1017 2007-02-11 Murray Cumming Fix a typo. 2007-02-11 Murray Cumming * en_GB.po: Fix a typo. svn path=/trunk/; revision=1016 2007-02-11 Murray Cumming Added unfinished code for Relationships Overview feature, by Rasmus 2007-02-11 Murray Cumming * NEWS: * glom/Makefile.am: * glom/application.cc: * glom/frame_glom.cc: * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: Added unfinished code for Relationships Overview feature, by Rasmus Toftdahl Olesen. (See http://halfdans.net/index.py/89 ) The actual use of goocanvas is disabled in configure.ac, frame_glom.cc, and glom/Makefile.am, because the code must be updated to build against the latest goocanvas API. svn path=/trunk/; revision=1015 2007-02-11 Murray Cumming Added unfinished code for Relationships Overview feature, by Rasmus 2007-02-11 Murray Cumming * NEWS: * glom/Makefile.am: * glom/application.cc: * glom/frame_glom.cc: * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: * glom/relationships_overview/dialog_relationships_overview.cc: * glom/relationships_overview/dialog_relationships_overview.h: Added unfinished code for Relationships Overview feature, by Rasmus Toftdahl Olesen. (See http://halfdans.net/index.py/89 ) The actual use of goocanvas is disabled in configure.ac, frame_glom.cc, and glom/Makefile.am, because the code must be updated to build against the latest goocanvas API. svn path=/trunk/; revision=1014 2007-02-07 Murray Cumming Made the same changes here - see the previous ChangeLog entry. 2007-02-07 Murray Cumming * glom/libglom/python_embed/py_glom_relatedrecord.cc: Made the same changes here - see the previous ChangeLog entry. svn path=/trunk/; revision=1013 2007-02-07 Murray Cumming PyMappingMethods: Remove (inquiry) and (binaryfunc) casts because they 2007-02-07 Murray Cumming * glom/libglom/python_embed/py_glom_record.cc: * glom/libglom/python_embed/py_glom_related.cc: PyMappingMethods: Remove (inquiry) and (binaryfunc) casts because they should no longer be necessary and this might help the build with Python 2.5. svn path=/trunk/; revision=1012 2007-02-07 Murray Cumming ifdef with PY_VERSION_HEX to adapt to the changed function pointer 2007-02-07 Murray Cumming * glom/libglom/python_embed/py_glom_record.cc: * glom/libglom/python_embed/py_glom_related.cc: ifdef with PY_VERSION_HEX to adapt to the changed function pointer signature of the tp_as_mapping_length callbacks for PyMappingMethods in Python 2.5, which now have a Py_ssize_t return type. This broke the build on 64-bit systems. Also, take a PyObject* object instead of our derived struct, and cast inside our functions, to avoid errors from more fussy compiler versions. (Problems found by Daniel Holbach) svn path=/trunk/; revision=1011 2007-02-06 Murray Cumming Add m_ui_save_extra_showextras so we can turn off use of the custom 2007-02-07 Murray Cumming * glom/application.cc: * glom/application.h: Add m_ui_save_extra_showextras so we can turn off use of the custom filechooser dialog completely in on_menu_file_save_as_example(). * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added append_newline() and used it in save_before() to break up the incredibly long lines. This is not as nice as newlines plus indenting, but it is a start. * examples/example_smallbusiness.glom: Resaved this, using the newlines. svn path=/trunk/; revision=1010 2007-01-24 David Lodge Updated (British) English docs translation svn path=/trunk/; revision=1009 2007-01-24 Murray Cumming Increased version svn path=/trunk/; revision=1008 2007-01-24 Murray Cumming Added derived ComboBox for showing a list of fields, with an optional None 2007-01-24 Murray Cumming * glom/Makefile.am: * glom/combobox_fields.cc: * glom/combobox_fields.h: Added derived ComboBox for showing a list of fields, with an optional None item. * po/POTFILES.in: Added the new file. * glom/layout_item_dialogs/box_formatting.cc: * glom/layout_item_dialogs/box_formatting.h: Use ComboBox_Fields instead of Combo_TextGlade for the choices fields combo boxes, so we can show a None item for the Also Show field combo box, so the user can clear it after choosing something and then changing his mind. Bug #365051 from L Davison. svn path=/trunk/; revision=1007 2007-01-23 Murray Cumming execute_command_line_and_wait_until_second_command_returns_success(): When 2007-01-24 Murray Cumming * glom/libglom/spawn_with_feedback.cc: execute_command_line_and_wait_until_second_command_returns_success(): When waiting for the specific text output from a second command, temporarily set the LANG and LANGUAGE environment variables to C, so that we get the same text in all locales. This is not pretty, but neither is this whole command-line spawning idea anyway. Bug #395511 from Aurelien. svn path=/trunk/; revision=1006 2007-01-21 Murray Cumming Actually show fixed text and button items in the list view. This needed us 2007-01-21 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Actually show fixed text and button items in the list view. This needed us to know when the column index was for the view or for the model, to prevent us from trying to get a value for the wrong column. At the moment, nothing happens when you click on a button, and the button appears like text. svn path=/trunk/; revision=1005 2007-01-21 Murray Cumming Use the same layout and code for details, lists, and portals, reusing the 2007-01-21 Murray Cumming * glom/glom.glade: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/dialog_layout.cc: * glom/mode_data/dialog_layout.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list.h: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: Use the same layout and code for details, lists, and portals, reusing the UI and the implementation, just hiding some widgets for some dialogs. svn path=/trunk/; revision=1004 2007-01-21 Murray Cumming Added glom/utility_widgets/filechooserdialog.cc 2007-01-21 Murray Cumming * po/POTFILES.in: Added glom/utility_widgets/filechooserdialog.cc svn path=/trunk/; revision=1003 2007-01-19 Murray Cumming Require libgda 1.2.4, which has a fix for database and table encoding 2007-01-19 Murray Cumming * configure.in: Require libgda 1.2.4, which has a fix for database and table encoding problem. Requiring this should encourage distro packagers to also update libgda, which should fix crashes when creating databases, tables, fields, etc, with unusual characters, which happens quite often. svn path=/trunk/; revision=1002 2007-01-13 Murray Cumming dialog_new_self_hosted_connection: Start with the focus in the user name 2007-01-13 Murray Cumming * glom/glom.glade: dialog_new_self_hosted_connection: Start with the focus in the user name instead of the password, because both are empty to start with. svn path=/trunk/; revision=1001 2007-01-13 Murray Cumming ui_file_select_save(): When self-hosting, create a directory and put the 2007-01-13 Murray Cumming * glom/application.cc: * glom/application.h: ui_file_select_save(): When self-hosting, create a directory and put the file and the data directory inside the directory, so that they are not separated easily. svn path=/trunk/; revision=1000 2007-01-10 Murray Cumming Removed this class and dialog. 2007-01-10 Murray Cumming * glom/Makefile.am: * glom/glom.glade: * glom/dialog_new_database.cc: * glom/dialog_new_database.h: Removed this class and dialog. * glom/utility_widgets/filechooserdialog.cc: * glom/utility_widgets/filechooserdialog.h: Add widgets from the DialogNewDatabase dialog (asking for the title, and whether to self-host). * glom/application.cc: * glom/application.h: Add new m_ui_save_extra member variables for getting the result of the extended save dialog while still using the Bakery file save API. ui_file_select_save(): Set and get the new member variables. on_document_load(): Use the new member variables (with values previously set by the extended save dialog) instead of showing a new dialog to get the information. This removes one dialog, making new file creation simpler. svn path=/trunk/; revision=999 2007-01-10 Pema Geyleg svn path=/trunk/; revision=998 svn path=/trunk/; revision=998 2006-12-28 Murray Cumming Add a derived Gtk::FileChooserDialog, which can show our extra widgets. At 2006-12-28 Murray Cumming * glom/utility_widgets/filechooserdialog.cc: * glom/utility_widgets/filechooserdialog.h: Add a derived Gtk::FileChooserDialog, which can show our extra widgets. At the moment it can just show an extra text message. * glom/application.cc: * glom/application.h: Override Bakery::App_WithDoc::ui_file_select_save(), so we can use our custom file chooser dialog, using member variables to set the title and extra message if necessary. on_document_load(): Set the member variables so that we show the message about saving an example file in the file chooser dialog, instead of in a separate dialog. This removes one of the many dialogs. 2006-12-27 Murray Cumming * glom/libglom/Makefile.am: * glom/python_embed/python_module/Makefile.am: Fix the cygwin (win32) build. Bug #338844 from Yselkowitz. 2006-12-28 Kjartan Maraas Updated Norwegian bokmÃ¥l translation. 2006-12-27 Kjartan Maraas * nb.po: Updated Norwegian bokmÃ¥l translation. 2006-12-27 Murray Cumming Mentioned new file. 2006-12-21 Murray Cumming Added get_translatable_type_name_nontranslated() for in po message context 2006-12-21 Murray Cumming * glom/translation/window_translations.cc: * glom/translation/window_translations.h: Added get_translatable_type_name_nontranslated() for in po message context strings. * glom/libglom/data_structure/translatable_item.cc: * glom/libglom/data_structure/translatable_item.h: on_button_export(): Write context strings to the .po file to distinguish similar strings, and provide hints to translators. on_button_import(): Compare the context strings to more precisely identify the items. 2006-12-21 Murray Cumming Increased version 2006-12-21 Murray Cumming Do an extra sanity check on the postgres utils path, and complain if we 2006-12-21 Murray Cumming * configure.in: Do an extra sanity check on the postgres utils path, and complain if we can't find postmaster. 2006-12-21 Murray Cumming Replaced execute_command_line_and_wait_fixed_seconds() with 2006-12-21 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/spawn_with_feedback.cc: * glom/libglom/spawn_with_feedback.h: Replaced execute_command_line_and_wait_fixed_seconds() with execute_command_line_and_wait_until_second_command_returns_success(), so we can use pg_ctl status to check whether postmaster has started, instead of from pg_ctl, because I think that it always returns a success code, but I am not sure about that anymore. 2006-12-21 Murray Cumming Moved this class here, so we can use it from libglom, add add a 2006-12-21 Murray Cumming * glom/Makefile.am: * glom/glom.glade: * glom/libglom/Makefile.am: * glom/libglom/dialog_progress_creating.cc: * glom/libglom/dialog_progress_creating.h: Moved this class here, so we can use it from libglom, add add a set_message() method, so we can change the text for each use. * glom/libglom/connectionpool.cc: * glom/libglom/spawn_with_feedback.cc: * glom/libglom/spawn_with_feedback.h: Moved the spawn utility functions here from connectionpool.cc. execute_command_line_and_wait(): Added message parameter, shown in a dialog with a pulsing progress bar. The command-line command is run in a separate thread, which signals us with a Glib::Cond condition when it is finished, so we can update the UI in the meantime. * glom/application.cc: * glom/main.cc: Call g_threads_init(), so we can use mutexes. 2006-12-21 Murray Cumming execute_command_line_and_wait(): Take a human-readable message, and show 2006-12-21 Murray Cumming * glom/libglom/connectionpool.cc: execute_command_line_and_wait(): Take a human-readable message, and show it in a dialog while we are waiting. This is not ideal, but better than nothing. What we really need is to do the spawn_command_line_sync() in another thread, and wait for that thread to finish. 2006-12-21 Murray Cumming Added show_dialog_new_database() helper function. on_document_load(): When 2006-12-21 Murray Cumming * glom/dialog_new_database.cc: * glom/dialog_new_database.h: Added show_dialog_new_database() helper function. * glom/application.cc: on_document_load(): When opening from an example, which always requires database creation, show the self-host question dialog. This also allows the user to change the database title, which is OK. 2006-12-20 Murray Cumming Added radio buttons, so the user can choose to self-host the database, or 2006-12-20 Murray Cumming * glom/dialog_new_database.cc: * glom/dialog_new_database.h: Added radio buttons, so the user can choose to self-host the database, or create it on an external server. * glom/Makefile.am: * glom/dialog_new_self_hosted_connection.cc: * glom/dialog_new_self_hosted_connection.h: * glom/glom.glade: Added a new dialog, asking for the name and password for the first super user, when creating a new self-hosted database. * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added set_connection_is_self_hosted(). * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Added create_self_hosting(), which creates the postgres files in a folder. * glom/frame_glom.cc: connection_request_password_and_choose_new_database_name(): If the database should be self-hosted, ask for the initial details, and create it. * glom/dialog_connection.cc: * glom/dialog_connection.h: Added set_self_hosted_user_and_password(), because we currently use the connect_to_server_with_connection_settings() method from this class to actually connect. I should refactor that. 2006-12-16 Murray Cumming load_from_document(): Disable the hostname entry when the document is 2006-12-16 Murray Cumming * glom/dialog_connection.cc: load_from_document(): Disable the hostname entry when the document is marked as being self-hosting. connect_to_server_with_connection_settings(): Always use localhost as the hostname when opening a self-hosted document. 2006-12-16 Murray Cumming Add a --with-postgres-utils option, so we can specify the location of 2006-12-16 Murray Cumming * configure.in: * config.h.in: Add a --with-postgres-utils option, so we can specify the location of postmaster and pg_ctl. * glom/application.cc: * glom/application.h: Added stop_self_hosting_of_document_database(). on_document_load(): Start self-hosting before asking for connection details, if the document is marked as self-hosting. Stop self-hosting if the connection fails. * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: Added set_self_hosting(), start_self_hosting(), stop_self_hosting(); * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added get_connection_is_self_hosted(), and get_connection_self_hosted_directory_uri(). This bool is loaded from and saved to the document, though it is not yet changed to true by anything in the UI. Destructor: Stop self-hosting. 2006-12-16 Murray Cumming Remove unnecessary virtuals. 2006-12-16 Murray Cumming * glom/libglom/document/document_glom.h: Remove unnecessary virtuals. 2006-12-15 Murray Cumming Add text for the help sections for the connection and connection error 2006-12-15 Murray Cumming * docs/user-guide/C/glom.xml: Add text for the help sections for the connection and connection error dialogs, with a link to the web page for setting up Postgres. Otherwise, people who have never seen the Download web page will have no idea what to do. 2006-12-11 Francisco Javier F. Serrador Updated Spanish translation. 2006-12-11 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-12-10 Murray Cumming Increased version 2006-12-10 Murray Cumming For child relationships, add an extra GROUP_BY (on the key of the target 2006-12-10 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/frame_glom.cc: * glom/libglom/utils.cc: * glom/libglom/utils.h: * glom/mode_data/box_data_list_related.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: For child relationships, add an extra GROUP_BY (on the key of the target table) to ensure that we only get distinct records, with no repeats. 2006-12-10 Murray Cumming Hide the title label and entry. They are too confusing here. 2006-12-10 Murray Cumming * glom/glom.glade: * glom/mode_data/dialog_layout_list_related.cc: Hide the title label and entry. They are too confusing here. 2006-12-10 Murray Cumming Add a checkbox that allows us to use child (related) relationships, which 2006-12-10 Murray Cumming * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: * glom/glom.glade: Add a checkbox that allows us to use child (related) relationships, which are then shown in the combobox. * glom/combobox_relationship.cc: * glom/combobox_relationship.h: set_relationships(): Add boolean parameter allowing us to show related relationships without showing the parent table name too. * glom/frame_glom.cc: * glom/libglom/document/document_glom.cc: When saving/loading portals, save/load all levels of relationships, by using the existing utiltity function for saving UsesRelationship objects. * glom/libglom/data_structure/layout/usesrelationship.cc: * glom/libglom/data_structure/layout/usesrelationship.h: Added get_title_used(), get_to_field_used(), get_relationship_name_used(), get_relationship_used_allows_edit(), so we can use this generically, regardless of the level of relationships used by, for instance, a portal or layoutitem_field. * glom/base_db.cc: * glom/base_db.h: Add m_extra_join to FoundSet, for use when viewing records in a related relationship. * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: refresh_data_from_database_with_foreign_key(): When viewing a related relationship, specify an extra SQL join to make that possible, and adjust the WHERE clause too, providing these to the FoundSet object. * glom/libglom/utils.cc: * glom/libglom/utils.h: build_sql_select_with_where_clause(): Add extra_join parameter, specified when doing view of related relationship records. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: refresh_from_database(): Provide the FoundSet extra_join to build_sql_select_with_where_clause(). * glom/reports/report_builder.cc: * glom/utility_widgets/flowtablewithfields.cc: Use the generic UsesRelationship methods rather than extracting the main relationship and using that specifically, so we can adapt to related realationship portals, and even in future support >2 levels of relationships. 2006-12-07 Murray Cumming Increase version 2006-12-07 Murray Cumming get_related_record_exists(): refresh_data_from_database(): In WHERE 2006-12-07 Murray Cumming * glom/mode_data/box_data.cc: get_related_record_exists(): * glom/mode_data/box_data_list_related.cc: refresh_data_from_database(): In WHERE clauses, specify the table name, to avoid ambiguity when two of the tables have the same field names. This avoids a SQL error. 2006-12-05 Francisco Javier F. Serrador Updated Spanish translation. 2006-12-05 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-12-03 Murray Cumming Start dialog: Change the packing options for the Entry, to try to stop the 2006-12-03 Murray Cumming * glom/glom.glade: Start dialog: Change the packing options for the Entry, to try to stop the lines from breaking unnecessarily, but this does not seem to have any effect on it. Bug #369602 from Javier F. Serrador. 2006-12-03 Murray Cumming create_layout_add_group(): Check that fields exist before adding them as 2006-12-03 Murray Cumming * glom/mode_data/box_data_list.cc: create_layout_add_group(): Check that fields exist before adding them as columns, to avoid SQL errors when we have failed (we should not fail) to rename something everywhere. 2006-11-19 Daniel Nylander Updated Swedish translation. 2006-11-19 Daniel Nylander * sv.po: Updated Swedish translation. 2006-11-19 Murray Cumming glom_evaluate_python_function_implementation(): Use Py_CompileString() and 2006-11-19 Murray Cumming * glom/python_embed/glom_python.cc: glom_evaluate_python_function_implementation(): Use Py_CompileString() and PyImport_ExecCodeModule() to make library scripts available for import. It works too. 2006-11-19 Murray Cumming Added new files so they can be translated. 2006-11-19 Murray Cumming * po/POTFILES.in: Added new files so they can be translated. 2006-11-18 Djihed Afifi Updated Arabic 2006-11-18 Murray Cumming Added some commented-out experiments into making the script library 2006-11-18 Murray Cumming * glom/python_embed/glom_python.cc: Added some commented-out experiments into making the script library importable from our Python scripts. 2006-11-18 Murray Cumming The UI for a script library now works, and it is saved and loaded in the 2006-11-18 Murray Cumming * configure.in: * glom/Makefile.am: * glom/frame_glom.cc: * glom/glom.glade: * glom/mode_data/box_data.cc: * glom/mode_design/Makefile.am: * glom/mode_design/script_library/Makefile.am: * glom/mode_design/script_library/dialog_new_script.cc: * glom/mode_design/script_library/dialog_new_script.h: * glom/mode_design/script_library/dialog_script_library.cc: * glom/mode_design/script_library/dialog_script_library.h: The UI for a script library now works, and it is saved and loaded in the document. Now I just need to make the embedded python able to import these modules. 2006-11-18 Murray Cumming Works slightly more. Yes, I shouldn't check stuff in before it is 2006-11-18 Murray Cumming * glom/frame_glom.cc: * glom/glom.glade: * glom/libglom/document/document_glom.cc: * glom/mode_design/dialog_script_library.cc: * glom/mode_design/dialog_script_library.h: Works slightly more. Yes, I shouldn't check stuff in before it is finished. 2006-11-18 Murray Cumming Partial implementation of the UI for a reusable python script library. 2006-11-18 Murray Cumming * glom/application.cc: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/glom.glade: * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: * glom/mode_design/Makefile.am: * glom/mode_design/dialog_script_library.cc: * glom/mode_design/dialog_script_library.h: Partial implementation of the UI for a reusable python script library. 2006-11-17 Murray Cumming Increased version 2006-11-17 Murray Cumming Added get_document_format_version() and 2006-11-17 Murray Cumming * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added get_document_format_version() and get_latest_known_document_format_version(). load_after(): Check the document format version, and fail if it is higher than we know about. save_before(): Save the document format version (as the latest known) when saving changes. * glom/frame_glom.cc: on_menu_userlevel_Developer(): When going into developer mode, warn that you might not be able to open the changed document with older versions of Glom. 2006-11-17 Murray Cumming Increased version 2006-11-17 Murray Cumming connect(): Remember the port after the first successful connection (even 2006-11-17 Murray Cumming * glom/libglom/connectionpool.cc: connect(): Remember the port after the first successful connection (even to the default database), and always try that first when connecting again, only trying the extra ports if it fails or if no port was remembered. This halves the number of connection attempts made. Bug #368787 (Craig Keogh). 2006-11-17 Murray Cumming Fix build. 2006-11-16 Daniel Nylander Added initial Swedish translation. Added sv to DOC_LINGUAS. 2006-11-16 Daniel Nylander * sv/sv.po: Added initial Swedish translation. * Makefile.am: Added sv to DOC_LINGUAS. 2006-11-16 Murray Cumming get_find_where_clause_quick(): get_find_where_clause(): Put quotes around 2006-11-16 Murray Cumming * glom/base_db.cc: get_find_where_clause_quick(): * glom/mode_data/box_data.cc: get_find_where_clause(): Put quotes around the table names and field names, to avoid SQL errors when using names with, for instance, capital letters. Bug #375605 from William Manley. 2006-11-16 Murray Cumming Revert unrelated changes introduced by the patch from Johannes. The 2006-11-16 Murray Cumming * glom/glom.glade: Revert unrelated changes introduced by the patch from Johannes. The left-alignment of labels had been removed. I guess that this might have been caused by glade-3. 2006-11-16 Murray Cumming Translations window: Use a regular HBox instead of a ButtonBox, because 2006-11-16 Murray Cumming * glom/glom.glade: Translations window: Use a regular HBox instead of a ButtonBox, because the ButtonBox leaves lots of empty space so it looks odd. * glom/translation/window_translations.cc: on_button_export(): Append the .po extension if it is not already in the filename. 2006-11-16 Murray Cumming Added an AC_CHECK_MEMBER() check for the latest libggettextpo 2006-11-16 Murray Cumming * configure.in: Added an AC_CHECK_MEMBER() check for the latest libggettextpo error-handling API, defining HAVE_GETTEXTPO_XERROR, so we can build with both the old and new APIs. * config.h.in: Added HAVE_GETTEXTPO_XERROR, defined in configure. * glom/translation/window_translations.cc: Use ifdefs to add alternative code for the older libgettextpo API. 2006-10-26 Johannes Schmid Openismus Gmbh: * glom/Makefile.am: Added -lgettext-po * glom/glom.glade: Added Import/Export buttons to translation_window in a new buttonbox * glom/translation/window_translations.cc: * glom/translation/window_translations.h: on_button_import(), on_button_export() Added the feature to export and import translation in po format using libgettext-po 2006-10-29 Francisco Javier F. Serrador Updated Spanish translations. 2006-10-30 Francisco Javier F. Serrador * es.po: Updated Spanish translations. 2006-10-22 David Lodge Updated English (British) translation 2006-10-22 David Lodge * en_GB.po: Updated English (British) translation 2006-10-22 Ilkka Tuohela Updated Finnish translation 2006-10-20 Murray Cumming create_layout(): Do not call m_AddDel.set_columns_ready() because we do 2006-10-20 Murray Cumming * glom/mode_data/box_data_list.cc: create_layout(): Do not call m_AddDel.set_columns_ready() because we do that in fill_from_database(), and we do not want to do it twice. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Constructor: Call refresh_from_database(), and make refresh_from_database() a protected method, so that model creation is the only time that the SQL query is run. * glom/utility_widgets/db_adddel/db_adddel.cc: refresh_from_database(): Just call construct_specified_columns(), to recreate the model, instead of trying to reuse the existing model via refresh_from_database(), because that was having some strange side-effects and seems complex to fix. 2006-10-20 Murray Cumming Remove (empty) remove_all() method. It does not make sense for a TreeModel 2006-10-20 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Remove (empty) remove_all() method. It does not make sense for a TreeModel that just shows what is in a database result. * glom/mode_data/box_data_list.cc: * glom/mode_find/box_data_list_find.cc: Do not use DbAddDel::remove_all(). 2006-10-19 Murray Cumming Added get_has_script() method for efficient convenience. 2006-10-19 Murray Cumming * glom/libglom/data_structure/layout/layoutitem_button.cc: * glom/libglom/data_structure/layout/layoutitem_button.h: Added get_has_script() method for efficient convenience. * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added set/get_child_text_node() utility methods. load_after(), load_after_layout_group(): Load button scripts, field calculations, and example row data from child text nodes instead of attribute values, to avoid problems with newlines in attributes when using the .glom file with a different XML parser. Fall back to the now-deprecated attribute values if no child text node was found. save_before(), save_before_layout_group(): Save as child text nodes. Bug #357567. 2006-10-19 Johannes Schmid Added --debug_sql argument 2006-10-19 Johannes Schmid * glom/main.cc: Added --debug_sql argument * glom/application.cc: * glom/application.h: Added a global application instance which is available to all modules via the static Application::get_application() method Added get/set_sql_debug() Remove File->Exit, to simplify Glom by not supporting muliple documents per instance. * glom/base_db.cc: * glom/base_db.h: * glom/libglom/python_embed/Makefile.am: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Added debugging code for sql statements. * glom/libglom/python_embed/py_glom_relatedrecord.cc: Added debugging code but commented out for now because of linking issues. The debug flag needs to link against application.lo 2006-10-19 Murray Cumming Check for libgtksourceviewmm-1.0. Initialize gtksourceviewmm. Use a 2006-10-19 Murray Cumming * configure.in: Check for libgtksourceviewmm-1.0. * glom/main.cc: Initialize gtksourceviewmm. * glom/glom.glade: Use a GtkSourceView instead of a TextView for calculated fields and the buttons script. * glom/layout_item_dialogs/dialog_buttonscript.h: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/mode_design/fields/dialog_fieldcalculation.h: * glom/mode_design/fields/dialog_fielddefinition.h: Use a GtkSourceView instead of a TextView for calculated fields and the buttons script, and set the language as python. Patch from bug #346896, with much help from Johannes Schmid and Dodju Seketeli. 2006-10-19 Murray Cumming Marked the branch in the ChangeLog 2006-10-19 Josep Puigdemont i Casamajó Updated Catalan translation. 2006-10-18 Murray Cumming Increase version 2006-10-18 Murray Cumming Mark this as an example, so users are asked to save a copy. I think this 2006-10-18 Murray Cumming * examples/example_film_manager.glom: Mark this as an example, so users are asked to save a copy. I think this had example data once too, but it is gone now. 2006-10-18 Murray Cumming Remove warn_about_images() and don't use it in on_button_add_field() and 2006-10-18 Murray Cumming * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list.h: Remove warn_about_images() and don't use it in on_button_add_field() and on_button_edit_field(). * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Make scale_keeping_ratio() public, so we can use it from elsewhere, and check for null pixbufs. * glom/utility_widgets/db_adddel/db_adddel.cc: treeviewcolumn_on_cell_data(): Show pixbufs too, so that Image fields show up in the list view too. 2006-10-18 Murray Cumming Added field_has_non_unique_values(). change_definition(): If a field is 2006-10-18 Murray Cumming * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/box_db_table_definition.h: Added field_has_non_unique_values(). change_definition(): If a field is being set to primary key, use field_has_non_unique_values() to check and warn, to avoid an error from Postgres. Bug #362895. 2006-10-17 Murray Cumming Added forget_layout_record_viewed(). change_definition(): When changing 2006-10-17 Murray Cumming * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added forget_layout_record_viewed(). * glom/mode_design/fields/box_db_table_definition.cc: change_definition(): When changing whether a field is the primary key, use forget_layout_record_viewed() so that we do not try to use an inappropriate key value with a different field. 2006-10-17 Murray Cumming Added field_has_null_values(). change_definition(): If a field is being 2006-10-17 Murray Cumming * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/box_db_table_definition.h: Added field_has_null_values(). change_definition(): If a field is being set to primary key, use field_has_null_values() to check and warn, to avoid an error from Postgres. Bug #362838. 2006-10-16 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-10-15 Francisco Javier F. Serrador Updated Spanish translation. 2006-10-15 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-10-14 Ilkka Tuohela Updated Finnish translation 2006-10-13 Murray Cumming Increased version 2006-10-13 Murray Cumming on_flowtable_script_button_clicked(): Check whether the current record 2006-10-13 Murray Cumming * glom/mode_data/box_data_details.cc: on_flowtable_script_button_clicked(): Check whether the current record still exists after the script has run, and signal that it was deleted if necessary. 2006-10-13 Murray Cumming load_after_layout_group(): When loading the portal navigation 2006-10-13 Murray Cumming * glom/libglom/document/document_glom.cc: load_after_layout_group(): When loading the portal navigation relationship, create the object before passing it to load_after_layout_item_usesrelationship(). This should have crashed before. Also, pass in the related table name, not the parent table name, so that the relationship can be found. 2006-10-13 Murray Cumming Commented out some debug output. 2006-10-13 Murray Cumming on_adddel_edit(): Make sure that the details dialog is transient for the 2006-10-13 Murray Cumming * glom/mode_design/fields/box_db_table_definition.cc: on_adddel_edit(): Make sure that the details dialog is transient for the current window. * glom/utility_widgets/dialog_properties.cc: Constructor: Call set_modal(), so that these windows are actually usuable when opened from other modal windows, such as dialogs. This was a bug that I introduced when I changed the base class from Dialog to Window. Fixed now. 2006-10-13 Murray Cumming Added MimeType entry, so Glom should really be used to open .glom 2006-10-13 Murray Cumming * glom.desktop.in.in: Added MimeType entry, so Glom should really be used to open .glom documents. Thanks to Denis Leroy. 2006-10-12 Johannes Schmid Fixed gnome_program_init to use PACKAGE and VERSION instead of 2006-10-12 Johannes Schmid * glom/main.cc: Fixed gnome_program_init to use PACKAGE and VERSION instead of PACKAGE_NAME and PACKAGE_VERSION Fixes (#349357) with special thanks to Don Scorgie 2006-10-12 Johannes Schmid For Openismus Gmbh (now that it's finally in place ;-) 2006-10-12 Johannes Schmid For Openismus Gmbh (now that it's finally in place ;-) * docs/user-guide/C/glom.xml: Added ids for all dialogs to be filled with a documentation * docs/user-guide/Makefile.am: * docs/user-guide/glom.omf.in: * docs/user-guide/glom-C.omf.in (removed): Mostly fixed documentation generation. There is still an issue with scrollkeeper but I hope I get this fixed soon. * glom/application.cc: * glom/base_db.cc: * glom/dialog_invalid_data.cc: * glom/frame_glom.cc: * glom/layout_item_dialogs/dialog_group_by.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/translation/window_translations.cc: * glom/utility_widgets/datawidget.cc: Use dialog_run_with_help for all dialogs that contain help buttons. * glom/libglom/utils.h: * glim/libglom/utils.c: Added Utils::show_help which calls gnome_help_display and does some error handling. Added Utils::dialog_run_with_help with runs a dialog and return the Gtk::Reponse. If the user clicked help the dialog is kept up and a help browser is launched. 2006-10-11 Murray Cumming Increased version. 2006-10-10 Murray Cumming Actually implement the record.connection attribute. This is incredibly 2006-10-10 Murray Cumming * glom/libglom/python_embed/py_glom_record.cc: Actually implement the record.connection attribute. This is incredibly easy with pyobject_new(). Added a record.table_name attribute. See http://www.glom.org/wiki/index.php?title=Calculated_Fields_API#Using_the_full_pygda_API to see the wonderful things this makes possible. 2006-10-09 Daniel Holbach Removed the class prefix from the method declaration, to fix the build. 2006-10-09 Daniel Holbach * glom/mode_data/dialog_layout_list_related.h: Removed the class prefix from the method declaration, to fix the build. 2006-10-09 Murray Cumming 2006-10-09 Murray Cumming Added get_primary_key_is_in_foundset(). init_db_details(): Do not bother 2006-10-08 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added get_primary_key_is_in_foundset(). * glom/mode_data/notebook_data.cc: init_db_details(): Do not bother checking whether the found set has changed, because it has always changed when we are navigating to a different table. Therfore, always try to view the last-viewed record for the table. But use get_primary_key_is_in_foundset() to prevent showing a not-found record when doing a find. * glom/reports/report_builder.cc: Put parts of the where clause in brackets, so that the AND has the desired effect, though I do not know of any bug caused by this. 2006-10-08 Murray Cumming glom_execute_python_function_implementation(): Added Gda::Connection 2006-10-08 Murray Cumming * glom/python_embed/glom_python.cc: * glom/python_embed/glom_python.h: glom_execute_python_function_implementation(): Added Gda::Connection parameter, which is passed to PyGlomRecord_SetFields(). * glom/libglom/python_embed/py_glom_record.cc: * glom/libglom/python_embed/py_glom_record.h: Record_getseters(): Added connection attribute to the python object, so that scripts can use the pygda API on the underlying database. BUT: This just returns None at the moment. PyGlomRecord_SetFields(): Take an extra connection parameter. * glom/base_db.cc: calculate_field(): * glom/layout_item_dialogs/dialog_buttonscript.cc: on_button_test(): * glom/mode_data/box_data.cc: set_primary_key_value(): * glom/mode_data/box_data_details.cc: on_flowtable_script_button(): * glom/mode_design/fields/dialog_fieldcalculation.cc: on_button_test(): Pass the extra connection parameter when calling glom_evaluate_python_function_implementation(). 2006-10-08 Murray Cumming on_flowtable_script_button_clicked(): Refresh the view after the script 2006-10-08 Murray Cumming * glom/mode_data/box_data_details.cc: on_flowtable_script_button_clicked(): Refresh the view after the script has run, in case the script changed the data, so we can see the new data. 2006-10-08 Murray Cumming Related Records layout: Add a Navigation frame, allowing the user to 2006-10-08 Murray Cumming * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: * glom/glom.glade: Related Records layout: Add a Navigation frame, allowing the user to choose the default navigation (based on the shown fields and whether their tables are hidden, or manually choosing a relationship. This is needed when the automatic choice is not appropriate, though it often is. * glom/libglom/data_structure/layout/layoutitem_portal.cc: * glom/libglom/data_structure/layout/layoutitem_portal.h: Added set/get_navigation_relationship_specific(). * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Saved the extra portal information. * glom/base_db.cc: * glom/base_db.h: get_field_is_from_non_hidden_related_record(), get_field_identifies_non_hidden_related_record(): Move these here from Box_Data_List_Related. Added get_portal_navigation_relationship_automatic(), * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: get_suitable_record_to_view_details(): Use the specified relationship if appropriate, and reuse the methods used to show the automatic navigation choice in the layout dialog. * glom/mode_data/dialog_layout.cc: * glom/mode_data/dialog_layout.h: Added the make_sensitivity_depend_on_toggle_button() convenience method. 2006-10-06 Murray Cumming Moved value->pixbuf conversion code from here to: 2006-10-06 Murray Cumming * glom/utility_widgets/db_adddel/Makefile.am: * glom/utility_widgets/imageglom.cc: Moved value->pixbuf conversion code from here to: * glom/libglom/data_structure/glomconversions.cc: * glom/libglom/data_structure/glomconversions.h: * glom/utility_widgets/db_adddel/cellrenderer_button.cc: * glom/utility_widgets/db_adddel/cellrenderer_button.h: renamed to * glom/utility_widgets/db_adddel/cellrenderer_buttonimage.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttonimage.h: Added: * glom/utility_widgets/db_adddel/cellrenderer_buttontext.cc: * glom/utility_widgets/db_adddel/cellrenderer_buttontext.h: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: add_column() now take a LayoutItem rather than only a LayoutItem_Field, so that the list can in future show other items, such as buttons. * glom/libglom/data_structure/layout/layoutgroup.cc: * glom/libglom/data_structure/layout/layoutitem.cc: * glom/libglom/data_structure/layout/layoutitem.h: * glom/libglom/data_structure/layout/layoutitem_field.cc: * glom/libglom/data_structure/layout/layoutitem_field.h: * glom/libglom/data_structure/layout/layoutitem_image.h: * glom/libglom/data_structure/layout/layoutitem_portal.cc: * glom/libglom/data_structure/layout/layoutitem_portal.h: * glom/libglom/utils.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: Adapted. 2006-10-06 Murray Cumming append_column(): Use set_fixed_width(), followed by set_resizable(), 2006-10-06 Murray Cumming * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: append_column(): Use set_fixed_width(), followed by set_resizable(), instead of set_min_width, so columns can be made smaller too. 2006-10-06 Murray Cumming build_sql_select_with_where_clause(): Define the first-level relationship 2006-10-06 Murray Cumming * glom/libglom/utils.cc: build_sql_select_with_where_clause(): Define the first-level relationship (via a LEFT OUTER JOIN) of a related relationship, even if no fields from the intermediate relationship are shown, to avoid a SQL error and subsequent crash. 2006-10-05 Murray Cumming Increase version. 2006-10-05 Murray Cumming cast_*(): Make the new sharedptr share the refcount with the original, 2006-10-05 Murray Cumming * glom/libglom/sharedptr.h: cast_*(): Make the new sharedptr share the refcount with the original, avoiding early deletions of the object that they share. That was stupid of me. * glom/libglom/test_sharedptr_layoutitem.cc: More testing. 2006-10-05 Murray Cumming Improve test 2006-10-05 Murray Cumming Added test. 2006-10-05 Murray Cumming * glom/libglom/Makefile.am: * glom/libglom/test_sharedptr_layoutitem.cc: Added test. 2006-10-05 Murray Cumming add_column(): Do an extra, probably unnecessary, check for a null field 2006-10-05 Murray Cumming * glom/libglom/document/document_glom.cc: add_column(): Do an extra, probably unnecessary, check for a null field before dereferencing it. construct_specified_columns(): Do not clone the field - just use it. * glom/utility_widgets/db_adddel/db_adddel.cc: get_data_layout_groups_plus_new_fields(): When building a default layout, because no layout is defined, store that layout in the document (saving it to disk when in developer mode). This fixes a dereference of a deleted field, though that should not be necessary so I suspect a fundamental sharedptr problem. But luckily, this is the correct thing to do anyway, for efficiency, and so that layout data is preserved. 2006-10-04 Francisco Javier F. Serrador Updated Spanish translation. 2006-10-04 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-10-03 Murray Cumming get_table_fields_to_show_for_sequence_add_group(), Do not clone the layout 2006-10-03 Murray Cumming * glom/base_db.cc: * glom/base_db.h: get_table_fields_to_show_for_sequence_add_group(), Do not clone the layout items - just supply the originals, so that we can store some data in them and have that data preserved for next time. This should also be more efficient because it does less object copying and therefore less memory copying. * glom/libglom/data_structure/layout/layoutitem_field.cc: * glom/libglom/data_structure/layout/layoutitem_field.h: Added get/set_display_width() which is not saved in the document for now. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: add_column() Take a non-const layout item, so that we can store the display_width in it, in property changed signal for the ViewColumn width property. Use any previously set display_width when creating the columns. This means that columns widths are remembered when navigating between tables. Bug #358089 from Peter Williams. 2006-10-03 Ilkka Tuohela Updated Finnish translation 2006-10-02 Murray Cumming get_find_where_clause(): When multiple fields are specified in a Find, 2006-10-02 Murray Cumming * glom/mode_data/box_data.cc: get_find_where_clause(): When multiple fields are specified in a Find, join them together in the SQL where clause with AND, instead of just joining them together, because that would be an invalid SQL statement. Obviously. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: refresh_from_database(): When the SQL command fails, output it to stdcerr, to help debugging. 2006-10-02 Murray Cumming Increased version. 2006-10-02 Murray Cumming string_separate(): Correct an if so that we really check for quoted 2006-10-02 Murray Cumming * glom/libglom/utils.cc: string_separate(): Correct an if so that we really check for quoted separators when specified. This fixes a loss of rows when adding example data from an example glom file. 2006-09-30 Murray Cumming Moved get_relationship_exists() here so it can be used from frame_glom.cc. 2006-09-30 Murray Cumming * glom/mode_design/dialog_add_related_table.cc: * glom/mode_design/dialog_add_related_table.h: * glom/base_db.cc: * glom/base_db.h: Moved get_relationship_exists() here so it can be used from frame_glom.cc. * glom/frame_glom.cc: on_dialog_add_related_table_response(): Check the inputs here instead of in on_response() of the dialog, because we can not stop a dialog from finishing. Instead we show it again. * glom/glom.glade: Change the dialog text slightly. * po/POTFILES.in: Mentioned dialog_add_related_table.cc. 2006-09-30 Murray Cumming Derive from Window instead of Dialog, because that is what it is in the 2006-09-30 Murray Cumming * glom/mode_design/dialog_design.cc: * glom/mode_design/dialog_design.h: Derive from Window instead of Dialog, because that is what it is in the .glade file, and that is how it is used. * glom/application.cc: * glom/base_db.cc: * glom/base_db.h: Added create_table_with_default_fields(), moving code from box_tables.cc. * glom/navigation/box_tables.cc: on_adddel_Add(): Call create_table_with_default_fields() to simplify code. * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Added add_table((), so that create_table_with_default_fields() can update the document immediately each time. * glom/libglom/utils.cc: * glom/libglom/utils.h: Added string_remove_prefix(). * glom/frame_glom.cc: * glom/frame_glom.h: Added do_menu_developer_fields() and called it from on_menu_developer_fields(), so we can show the fields dialog from other places. * glom/mode_design/Makefile.am: * glom/glom.glade: * glom/mode_design/dialog_add_related_table.cc: * glom/mode_design/dialog_add_related_table.h: Added Tables/Add-Related-Table menu item, to quickly create a related table and a relationship to it. Bug #355975. 2006-09-25 Francisco Javier F. Serrador Updated Spanish translation. 2006-09-25 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-09-25 Pawan Chitrakar Updated Nepali Translation 2006-09-24 Murray Cumming Increased version 2006-09-23 Murray Cumming get_field_identifies_non_hidden_related_record(): Return the relationship 2006-09-24 Murray Cumming * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: get_field_identifies_non_hidden_related_record(): Return the relationship used by the field, and use this to navigate to the related record even if no doubly-related field is show. For instance, this allows navigation when showing a product id, but not showing the product description. 2006-09-23 Murray Cumming get_suitable_record_to_view_details(): If the ID is invalid, because no 2006-09-24 Murray Cumming * glom/mode_data/box_data_list_related.cc: get_suitable_record_to_view_details(): If the ID is invalid, because no such record exists, warn the user with a dialog. * glom/utility_widgets/flowtablewithfields.cc: on_portal_user_requested_details(): Do not bother signalling further if the primary key is empty. 2006-09-23 Murray Cumming Add show_hints_model(), which shows a single row, with a hint about 2006-09-23 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Add show_hints_model(), which shows a single row, with a hint about editing the layout of the list or related records portal, if no fields have been specified yet. Bug #354073 from Peter Williams. 2006-09-23 Murray Cumming Comment out some debug output. 2006-09-23 Murray Cumming Override set_file_uri() to avoid the call to set_modified() triggering a 2006-09-23 Murray Cumming * glom/libglom/document/document_glom.cc: * glom/libglom/document/document_glom.h: Override set_file_uri() to avoid the call to set_modified() triggering a save of the file to the old filename. This is necessary because we override/hack set_modified(). 2006-09-23 Murray Cumming App_Glom::recreate_database(): Add the standard groups after creating the 2006-09-23 Murray Cumming * glom/application.cc: App_Glom::recreate_database(): Add the standard groups after creating the tables, instead of once for every table. This should be more efficient. 2006-09-20 Murray Cumming Field calculation editor, and button script editor: Mark the label with 3540732006-09-20 Murray Cumming * glom/glom.glade: Field calculation editor, and button script editor: Mark the label with the first part of the calculation as not for translation. Layout editors: Add tooltips to explain what the buttons do. This partly addreses bug #354073 from Peter Williams. 2006-09-17 Murray Cumming Added get_fixed_cell_height(). construct_specified_columns() Use 2006-09-17 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Added get_fixed_cell_height(). construct_specified_columns() Use CellRenderer::set_fixed_size(), using get_fixed_cell_height(), which asks Pango how high some example text should be. This should prevent multiline rows, and might be necessary for optimization 2006-09-17 Murray Cumming Field Formatting: For text fields, added a spin button to specify the 2006-09-17 Murray Cumming * glom/base_db.cc: * glom/glom.glade: Field Formatting: For text fields, added a spin button to specify the number of lines to show. * glom/libglom/data_structure/layout/fieldformatting.cc: * glom/libglom/data_structure/layout/fieldformatting.h: Added get/set_text_format_multiline_height_lines(), which defaults to 6. * glom/layout_item_dialogs/box_formatting.cc: * glom/layout_item_dialogs/box_formatting.h: enforce_constraints(): Only make the new spin button sensitive when the multiline checkbox is checked. get/set_formatting(): get/set the new value to interpret and present it. * glom/libglom/document/document_glom.cc: save_before_layout_item_field_formatting(), load_after_layout_item_field_formatting(): Handle the new option. * glom/utility_widgets/datawidget.cc: Constructor: If the field is multiline text, ask pango how high it should be, based on the new option. * glom/utility_widgets/db_adddel/db_adddel.cc: construct_specified_columns(): Use an ellipsize on text cells when their text is too long. This will be more likely with multiline fields. 2006-09-17 Murray Cumming mark branch. 2006-09-15 Ilkka Tuohela Updated Finnish translation 2006-09-12 David Lodge Updated English (British) translation 2006-09-12 David Lodge * en_GB.po: Updated English (British) translation 2006-09-11 Murray Cumming Updated NEWS 2006-09-11 Murray Cumming Base_DB::create_table(): Quote the field names to avoid a postgres error 2006-09-11 Murray Cumming, * glom/base_db.cc: Base_DB::create_table(): Quote the field names to avoid a postgres error when creating the table with an id field based on a table name with special characters such as -. 2006-09-10 Murray Cumming Fixed some validation problems. Add all example files to EXTRA_DIST, to 2006-09-10 Murray Cumming * docs/user-guide/C/glom.xml: Fixed some validation problems. * examples/Makefile.am: Add all example files to EXTRA_DIST, to fix distcheck. 2006-09-10 Murray Cumming Moved some checks from on_adddel_changed() to check_field_change(), and 2006-09-10 Murray Cumming * glom/mode_design/fields/box_db_table_definition.h: * glom/mode_design/fields/box_db_table_definition.cc: Moved some checks from on_adddel_changed() to check_field_change(), and added a check for an existing primary key, so we can give a nice refusal warning to the user instead of a postgres error. This is then used from on_adddel_changed() and on_Properties_apply(). Bug #350636. 2006-09-10 Murray Cumming Updated version ands NEWS 2006-09-09 Murray Cumming dialog_connection: Use underline mnemonics for the labels and mark them as 2006-09-09 Murray Cumming * glom/glom.glade: dialog_connection: Use underline mnemonics for the labels and mark them as labels for the entries, for accessibility. Also use an underline mnemonic for the Connect button. Bug #349357 from Ryan Paul. 2006-09-09 Fryderyk Dziarmagowski Added update-mime-database configure option which sets/unsets 2006-09-09 Fryderyk Dziarmagowski * configure.in: Added update-mime-database configure option which sets/unsets UPDATE_MIME_DATABASE. * Makefile.am: Do not update the mime database if UPDATE_MIME_DATABASE is not set. This is apparently helpful for distro packagers, and other GNOME source tarballs have the same thing. Bug #351989. 2006-09-09 Murray Cumming insert_example_data(): Use the new ignore_quoted_separators option with 2006-09-09 Murray Cumming * glom/base_db.cc: insert_example_data(): Use the new ignore_quoted_separators option with Utils::string_separate() so we are not confused by nested newlines. And check for newlines in the resulting row so we can ignore those rows as errors. * glom/libglom/utils.cc: string_separate(): More efficient implementation when ignoring quoted separators, doing less memory copying. 2006-09-09 Murray Cumming revert changes that I did not mean to commit yet. 2006-09-09 Johannes Schmid DataWidget::on_button_choose_date(): Fixed #349359 (Dates added with the 2006-09-08 Johannes Schmid * glom/utility_widgets/datawidget.cc: DataWidget::on_button_choose_date(): Fixed #349359 (Dates added with the calendar dialog are not preserved), by emitting the edited signal. 2006-08-17 Murray Cumming separate_strings(): Added optional ignore_quoted_separators bool 2006-08-17 Murray Cumming * glom/libglom/utils.cc: * glom/libglom/utils.h: separate_strings(): Added optional ignore_quoted_separators bool parameter. Added incredibly slow implementation, allowing us to handle example_rows data with newlines in text data. This is necessary because the newlines are also used to separate the field values. This is really slow and must be improved. 2006-08-16 Gabor Kelemen Translation updated. 2006-08-16 Gabor Kelemen * hu.po: Translation updated. 2006-08-15 Murray Cumming on_button_new(): Do not dereference a null field, to avoid crashing when 2006-08-15 Murray Cumming * glom/mode_data/box_data_details.cc: on_button_new(): Do not dereference a null field, to avoid crashing when adding a record when there is no primary key. 2006-08-15 Murray Cumming Frame_Glom::create_database(): When Gda::Connection::create_database() 2006-08-15 Murray Cumming * glom/frame_glom.cc: Frame_Glom::create_database(): When Gda::Connection::create_database() fails, output a more exact error message for debugging. Added comment mentioning that, when this fails, it might be due to installation of the unstable libgda, which might not do a completely parallel install. 2006-08-05 Nguyen Thai Ngoc Duy Fixed spelling 2006-08-03 Kjartan Maraas Updated Norwegian bokmÃ¥l translation. 2006-08-03 Kjartan Maraas * nb.po: Updated Norwegian bokmÃ¥l translation. 2006-07-07 Murray Cumming Added examples screenshots. 2006-07-05 Murray Cumming Put some sample data in this example. 2006-06-25 Murray Cumming App_Glom::App_Glom(): Catch the exception if the icon file is not found, 2006-06-25 Murray Cumming * glom/application.cc: App_Glom::App_Glom(): Catch the exception if the icon file is not found, though it will not happen if Glom is properly installed. * glom/frame_glom.cc: create_database(): Print a debug message if this fails, as well as showing the dialog. * icons/glom_icon_large.png: Updated. 2006-06-22 Murray Cumming Added a new simple example. 2006-06-22 Murray Cumming * examples/Makefile.am: * examples/example_music_collection.glom: Added a new simple example. 2006-06-21 Murray Cumming Added half-done patch. 2006-06-21 Murray Cumming Added screenshots for use in the user guide. Updated. Added Calculated 2006-06-21 Murray Cumming * docs/user-guide/C/figures/glom_design_fields.png: * docs/user-guide/C/figures/glom_design_fields_dialog_calculated.pn g: Added screenshots for use in the user guide. * docs/user-guide/C/figures/start.png: Updated. * docs/user-guide/C/glom.xml: Added Calculated Fields appendix, based on the content in the Wiki. 2006-06-20 Murray Cumming Hmm, now gnome-doc-utils.make _does_ seem to be being autogenerated, by 2006-06-20 Murray Cumming * gnome-doc-utils.make: Hmm, now gnome-doc-utils.make _does_ seem to be being autogenerated, by gnome-doc-prepare --force. So I removed it from cvs again. Bug #345458. 2006-06-20 Murray Cumming Fixed typo to fix the build. Added some tables and relationships and 2006-06-20 Murray Cumming * configure.in: Fixed typo to fix the build. * examples/example_project_manager.glom: Added some tables and relationships and related records portals. 2006-06-19 Murray Cumming Restore this file, because it does not in fact seem to be autogenerated by 2006-06-19 Murray Cumming * gnome-doc-utils.make: Restore this file, because it does not in fact seem to be autogenerated by anything. * configure.in: Added AM_CONDITIONAL for SK_ENABLE, needed by the new (copied from gnome-doc-utls) version of gnome-doc-utils.make. * examples/Makefile.am: * examples/example_film_manager.glom: * examples/example_project_manager.glom: Added new examples. The project manager one is not started yet. 2006-06-15 Murray Cumming Removed old test patch from cvs. Removed generated file from cvs. 2006-06-15 Murray Cumming * add1000.patch: Removed old test patch from cvs. * gnome-doc-utils.make: Removed generated file from cvs. 2006-06-14 Elijah Newren Fix unused variable warnings. #344815 2006-06-14 Elijah Newren * glom/base_db.cc: * glom/combobox_relationship.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_list.cc: * glom/reports/report_builder.cc: * glom/utility_widgets/comboglom.cc: * glom/utility_widgets/flowtablewithfields.cc: Fix unused variable warnings. #344815 2006-06-14 Elijah Newren Don't hardcode for autoheader2.50 and autoconf2.50 especially since it 2006-06-14 Elijah Newren * autogen.sh: Don't hardcode for autoheader2.50 and autoconf2.50 especially since it works with newer versions too. #344807. 2006-06-05 Gabor Kelemen Added hu to ALL_LINGUAS. 2006-06-05 Gabor Kelemen * configure.in: Added hu to ALL_LINGUAS. 2006-06-05 Gabor Kelemen Translation added. 2006-06-05 Gabor Kelemen * hu.po: Translation added. 2006-05-29 Kjartan Maraas Added nb to ALL_LINGUAS. 2006-05-29 Kjartan Maraas * configure.in: Added nb to ALL_LINGUAS. 2006-05-29 Kjartan Maraas Updated Norwegian bokmÃ¥l translation. 2006-05-29 Kjartan Maraas * nb.po: Updated Norwegian bokmÃ¥l translation. 2006-05-27 Murray Cumming GlomUtils to Glom::Utils. GlomConversions to Glom::Conversions. GlomPrivs 2006-05-27 Murray Cumming * Changed namespaces: GlomUtils to Glom::Utils. GlomConversions to Glom::Conversions. GlomPrivs to Glom::Privs. 2006-05-27 Murray Cumming Almost all files: Put everthing in the Glom namespace. 2006-05-27 Murray Cumming Almost all files: Put everthing in the Glom namespace. 2006-05-26 Murray Cumming Moved static methods from Base_DB to GlomPrivs, GlomPostgres and 2006-05-26 Murray Cumming * glom/Makefile.am: * glom/application.cc: * glom/base_db.cc: * glom/base_db.h: * glom/frame_glom.cc: * glom/glom_postgres.cc: * glom/glom_postgres.h: * glom/glom_privs.cc: * glom/glom_privs.h: * glom/libglom/utils.cc: * glom/libglom/utils.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/navigation/box_tables.cc: Moved static methods from Base_DB to GlomPrivs, GlomPostgres and GlomUtils. 2006-05-26 Murray Cumming Moved Base_DB::postgres_*() methods into Glom_Postgres class which has 2006-05-26 Murray Cumming * glom/Makefile.am: * glom/base_db.cc: * glom/base_db.h: * glom/glom_postgres.cc: * glom/glom_postgres.h: * glom/mode_design/fields/box_db_table_definition.cc: Moved Base_DB::postgres_*() methods into Glom_Postgres class which has only static methods. Just to keep things separate. 2006-05-25 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-05-21 Murray Cumming Moved the Base_DB::report_*() methods into a ReportBuilder object and use 2006-05-21 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/frame_glom.cc: * glom/mode_data/box_data_list.cc: * glom/reports/Makefile.am: * glom/reports/report_builder.cc: * glom/reports/report_builder.h: Moved the Base_DB::report_*() methods into a ReportBuilder object and use an instantiation of that object wherever we would call report_builder. This is a start on reducing the insane size of base_db.[h|cc]. 2006-05-21 Murray Cumming Contacts reports: Restore the group-by fields. I wonder why these were 2006-05-21 Murray Cumming * examples/example_smallbusiness.glom: Contacts reports: Restore the group-by fields. I wonder why these were lost. 2006-05-21 Murray Cumming * glom/base_db.cc: report_build(): Try to catch the exception here, but it still crashes if there is a SQL error during report building. 2006-05-21 Murray Cumming report_build_records(): Add a space before LIMIT, to avoid it ever 2006-05-21 Murray Cumming * glom/base_db.cc: report_build_records(): Add a space before LIMIT, to avoid it ever clashing with the ASC before it. 2006-05-21 Murray Cumming Use IT_PROG_INTLTOOL instead of AC_PROG_INTLTOOL for intltool. It is 2006-05-21 Murray Cumming * configure.in: Use IT_PROG_INTLTOOL instead of AC_PROG_INTLTOOL for intltool. It is apparently the new way. 2006-05-21 Murray Cumming Remove the .png extension from the icon name, as advised by 2006-05-21 Murray Cumming * glom.desktop.in.in: Remove the .png extension from the icon name, as advised by http://live.gnome.org/GnomeGoals/AppIcon . * glom/mode_design/fields/dialog_fieldcalculation.cc: Remove the [?] * icons/Makefile.am: Add EXTRA_DIST stuff to fix distcheck from the list of dependent relationships. It looks like an errror. 2006-05-21 Murray Cumming Removed. We use the stuff in icons/ instead. 2006-05-21 Murray Cumming * Makefile.am: * configure.in: * glom.png: Removed. We use the stuff in icons/ instead. * icons/Makefile.am: * icons/glom.png: * icons/glom.svg: * icons/glom_icon_large.png: * logo/glom_icon.png: * logo/glom_icon.svg: * logo/glom_icon.xcf: * logo/glom_icon_large.png: Moved files from logo/ to icons/ and used the Makefile snippet from http://live.gnome.org/GnomeGoals/AppIcon . Among other things, this means that the scalable icon is installed. glom.svg: I increased the size of the window shape and removed the database-cylinder shadow to prevent wasted space. glom.png was regenerated from the svg. 2006-05-21 Murray Cumming Change canvas size to 480x480, so I can use 10px sizes that will be 1px in 2006-05-21 Murray Cumming * logo/glom_icon.svg: Change canvas size to 480x480, so I can use 10px sizes that will be 1px in the 48x48px icon. 2006-05-21 Murray Cumming Use the Tango color palette, though there is surely more to do to make it 2006-05-21 Murray Cumming * logo/glom_icon.svg: Use the Tango color palette, though there is surely more to do to make it a tango icon. 2006-05-20 Murray Cumming refresh_from_database(): Handle Gda exceptions here so we can fail a bit 2006-05-20 Murray Cumming * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: refresh_from_database(): Handle Gda exceptions here so we can fail a bit more gracefully. 2006-05-20 Murray Cumming get_calculation_fields(): Check the relationships used by the calculation. 2006-05-20 Murray Cumming * glom/base_db.cc: get_calculation_fields(): Check the relationships used by the calculation. If a relationship is used, report that the from-field should trigger the calculation. This did not actually need the big changes below, though they might be useful some time. 2006-05-20 Murray Cumming Added predicate_LayoutItemIsEqual class for std::find_if. 2006-05-20 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added predicate_LayoutItemIsEqual class for std::find_if. calculate_field(), set_field_value_in_database(), get_field_value_in_database(), do_calculations(), get_calculated_fields(), get_calculation_fields(), do_lookups(), refresh_related_fields(): Deal in LayoutItem_Field rather than Field, so we can trigger recalculations from related fields. Added LayoutFieldInRecord to replace FieldInRecord in most places. It preserves the parent table information. * glom/libglom/utils.cc: * glom/libglom/utils.h: Added build_sql_select_with_where_clause() and build_sql_select_with_key() that takes lists of non-const LayoutItems. This is annoying, but better than removing const from everywhere else. * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_design/fields/dialog_fieldcalculation.cc: Adapted to API changes. 2006-05-20 Murray Cumming Rename get_record_field_values() to 2006-05-20 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Rename get_record_field_values() to get_record_field_values_for_calculation() to make things clearer. * glom/libglom/python_embed/py_glom_related.cc: Related_tp_as_mapping_getitem(): Leave key_value_sqlized as empty if there is no key value to find related records. * glom/libglom/python_embed/py_glom_relatedrecord.cc: PyGlomRelatedRecord_SetRelationship(): Leave key_value_sqlized as null if there is no key value to find related records. RelatedRecord_generic_aggregate(), RelatedRecord_tp_as_mapping_getitem(): Do not try to get related records if the key is empty. This then returns a Py_None when the python calculation tries to get related records. It could test for it, or just let the error cause an overall Py_None return result. * glom/python_embed/glom_python.cc: glom_execute_python_function_implementation: Check whether the result is Py_None. If it is then return a suitable empty value, instead of converting it to a string. * glom/libglom/data_structure/glomconversions.cc: * glom/libglom/data_structure/glomconversions.h: Remove get_empty_value_suitable_for_python(). * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: Use get_empty_value() instead of get_empty_value_suitable_for_python() because the python calculations (and our code for getting related records from python) do need to know whether non-text fields are empty. 2006-05-19 Murray Cumming Added virtual set_primary_key_value(), so that record_new() can set the 2006-05-19 Murray Cumming * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: Added virtual set_primary_key_value(), so that record_new() can set the primary key as soon as it has been set in the database. record_new(): Take a row iterator, so we can update the list row. After inserting the record, set the primary key value, and do lookups and refresh-related so that the other row fields update. Return the datamodel. * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: Override set_primary_key_value() * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: Override set_primary_key_value(). on_adddel_user_added(): Provide the row iterator to record_new() and to on_record_added(). on_record_added(): Take the row iterator * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: on_record_added(): Take the row iterator, to avoid a slow lookup to discover it. 2006-05-15 Murray Cumming Use specific versions of aclocal, autoheader, autoconf, and automake, 2006-05-15 Murray Cumming * autogen.sh: Use specific versions of aclocal, autoheader, autoconf, and automake, because the default version on Ubuntu Dapper (and probably Debian) does not have AM_PATH_PYTHON(). This should help people not using jhbuild, though I guess it might make life worse for others if those versioned executables are not present. Tell me if it is a problem. 2006-05-07 Murray Cumming connect(): Attempt the connection on both port 5433 and 5432, to make life 2006-05-07 Murray Cumming * glom/libglom/connectionpool.cc: * glom/libglom/connectionpool.h: connect(): Attempt the connection on both port 5433 and 5432, to make life easier for Ubuntu Dapper users, because it defaults postgres 8.1 to port 5433. Bug #340836 from Paul Schulz. 2006-05-07 Murray Cumming Invoices: Mark the invoice lines relationship as allowing editing, so that 2006-05-07 Murray Cumming * examples/example_smallbusiness.glom: Invoices: Mark the invoice lines relationship as allowing editing, so that people can actually edit the invoice lines portal. Bug #340919 from Hendrik Richter. 2006-05-07 Murray Cumming refresh_from_database(): Check for a null m_primary_key_field, to prevent 2006-05-07 Murray Cumming * glom/mode_data/box_data_details.cc: refresh_from_database(): Check for a null m_primary_key_field, to prevent a crash when editing the fields so that no field is a primary key. 2006-05-07 Murray Cumming Added clone() methods, though we do not use them yet. operator==() check 2006-05-07 Murray Cumming * glom/libglom/data_structure/relationship.cc: * glom/libglom/data_structure/relationship.h: Added clone() methods, though we do not use them yet. * glom/libglom/sharedptr.h: operator==() check for equality, though this did not stop the crash. * glom/mode_data/dialog_choose_relationship.cc: select_item(): If the relationship is null, unselect all items. * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: offer_relationship_list(): Optionally take the current relationship as a parameter so that the current one is highlighted in the dialog. Just change the existing portal, instead of setting the portal in the model row, because this causes some kind of memory management confusion that caused a crash, and it is inefficient anyway. Bug #340888 from Hendrik Richter. Call row_changed() to tell the TreeView to update the display. 2006-05-06 Ilkka Tuohela Updated Finnish translation 2006-05-05 Murray Cumming get_fields_for_table_from_database(): Report all primary keys are also 2006-05-05 Murray Cumming * glom/base_db.cc: * glom/base_db.h: get_fields_for_table_from_database(): Report all primary keys are also being unique, because they all must be. postgres_change_column_extras(): When changing whether a field is a primary key, deal with the fact that the uniqueness was a side-effect of it being a primary key, and do not try to add/drop a non-existant uniqueness constraint, or specify uniqueness with both constraints. Also, use the correct postgres SQL syntax for setting/unsetting whether a field is a primary key. It is very postgres specific. Return a modified version of the field definition, so that callers can display the new field definition correctly, so the constraints can be witnessed by the user. * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/box_db_table_definition.h: on_adddel_changed(): Update the row to show any constraints enforced when changing the field definition. This makes primary keys always unique and unchecks unique when it removes primary key, though uniquness can then be specified separately. * glom/mode_data/box_data_list.cc: get_record_counts(): Avoid a segfault when the model is null, which happens at the moment when there is no primary key. 2006-05-05 Murray Cumming postgres_change_column_extras(): Really set/unset the uniqueness 2006-05-05 Murray Cumming * glom/base_db.cc: postgres_change_column_extras(): Really set/unset the uniqueness constraint. This is very Postgres specific. We should do this with libgda one day, if it can do it. 2006-05-05 Murray Cumming Put some stuff in LIBADD instead of LDFLAGS. This seems to work, and seems 2006-05-05 Murray Cumming * glom/python_embed/python_module/Makefile.am: Put some stuff in LIBADD instead of LDFLAGS. This seems to work, and seems to be necessary on cygwin. Bug #338844 from Yselkowitz. 2006-05-05 Murray Cumming Updated NEWS 2006-05-05 Murray Cumming on_button_press_event_Popup(): Do not edit on double-click because it is 2006-05-05 Murray Cumming * glom/utility_widgets/adddel/adddel.cc: on_button_press_event_Popup(): Do not edit on double-click because it is annoying/confusing when the cells are editable on single click as well. This affects the table list, and the field list, all of which have a separate Open/Edit button. 2006-05-05 Murray Cumming * glom/libglom/Makefile.am: Put everything in LIBADD instead of some in LDFLAGS. This seems to work, and seems to be necessary on cygwin. Bug #338844 from Yselkowitz. 2006-05-05 Murray Cumming Define ACLOCAL_AMFLAGS so that autoreconf works. Bug #338844 from 2006-05-05 Murray Cumming * Makefile.am: Define ACLOCAL_AMFLAGS so that autoreconf works. Bug #338844 from Yselkowitz. 2006-05-05 Murray Cumming tiny whitespace change. 2006-05-05 Murray Cumming Do not make notebook tab titles bold. It gets annoying when there are many 2006-05-05 Murray Cumming * glom/utility_widgets/flowtablewithfields.cc: Do not make notebook tab titles bold. It gets annoying when there are many tabs, and is not that helpful, as well as being non-HIG. 2006-05-05 Murray Cumming Do not put the labels in Gtk::Alignments. They are not necessary. This 2006-05-05 Murray Cumming * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: Do not put the labels in Gtk::Alignments. They are not necessary. This should save a little memory and speed. 2006-05-05 Murray Cumming on_size_allocate(): Give the full max first-item width to first items, 2006-05-05 Murray Cumming * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: on_size_allocate(): Give the full max first-item width to first items, instead of just what they request, so that labels can expand and align in the actually-available space, so that xalign is useful. * glom/utility_widgets/flowtablewithfields.cc: add_field_at_position(): Use label xalign and yalign instead of the Gtk::Aligment alignment, because it is not needed. Align labels left, though I previously was trying to align them right. Right alignment is untidy when using groups, because the entries do not line up across groups, and that would be very difficult to implement. The vertical alignment of labels seems to be neater now. 2006-04-30 Murray Cumming show_table(): init_db_details(): Added optional 2006-04-30 Murray Cumming * glom/frame_glom.cc: * glom/frame_glom.h: show_table(): init_db_details(): Added optional primary_key_value_for_details parameter. Pass it to show_table(). on_notebook_data_record_details_requested(): Pass the primary key value to show_table() instead of calling show_details() afterwards, so that Glom does not show intermediate layouts. * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: Added optional primary_key_value_for_details parameter and show the details layout with this record when it is specified. 2006-04-29 Murray Cumming Removed some debug output. 2006-04-29 Murray Cumming Changes select_item() to take a LayoutItem_Field instead of an index, to 2006-04-29 Murray Cumming * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/notebook_data.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utility_widgets/db_adddel/db_adddel_withbuttons.cc: Changes select_item() to take a LayoutItem_Field instead of an index, to simplify things. get_view_column_index(): Take the button column into account, so that, for instance, clicking Add on the list view doesn't sometimes activate the button, taking us to the details view instead. 2006-04-29 Murray Cumming regexxered some method names to all lowercase. 2006-04-29 Murray Cumming * regexxered some method names to all lowercase. 2006-04-29 Murray Cumming Added check_entered_value_for_uniqueness() and get_field_value_is_unique() 2006-04-29 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added check_entered_value_for_uniqueness() and get_field_value_is_unique() and get_field_value_in_database(). set_entered_field_data(): Catch exceptions here, and return false, so that the caller can handle errors more easily and more immediately. * glom/mode_data/box_data_details.cc: on_flowtable_field_edited(): * glom/mode_data/box_data_list.cc: on_adddel_user_added(), on_adddel_user_changed(): Warn the user if the new value would not be unique, if it needs to be. This adds a new translatable string, but the new string replaces an untranslated error message from Postgres. 2006-04-28 Murray Cumming Increased version. 2006-04-28 Murray Cumming on_notebook_find_criteria(): Show a busy cursor while waiting for the 2006-04-28 Murray Cumming * glom/frame_glom.cc: on_notebook_find_criteria(): Show a busy cursor while waiting for the results. on_menu_Mode_Find(): Show a busy cursor while showing the appropriate view, because it takes a long time to do that, unfortunately. 2006-04-28 Murray Cumming add_layout_notebook_at_position(): Use add_layoutwidgetbase(portal) so 2006-04-28 Murray Cumming * glom/utility_widgets/flowtablewithfields.cc: add_layout_notebook_at_position(): Use add_layoutwidgetbase(portal) so that we connect signals, so that we save portal layout changes to the document. 2006-04-28 Murray Cumming handle_error(): handle_error(): Print more detailed information about 2006-04-28 Murray Cumming * glom/base_db.cc: handle_error(): * glom/libglom/connectionpool.cc: handle_error(): Print more detailed information about exceptions to stderr. 2006-04-28 Murray Cumming refresh_from_database(): Return false if the query returns no records, so 2006-04-28 Murray Cumming * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: refresh_from_database(): Return false if the query returns no records, so that on_notebook_find_criteria() can offer a new find if none are found. * glom/application.cc: set_mode_find(): Actually activate the find action, not the data action, so that a second find really works. 2006-04-28 Murray Cumming on_button_field_formatting(): Set m_modified so that the new formatting is 2006-04-28 Murray Cumming * glom/mode_data/dialog_layout_details.cc: on_button_field_formatting(): Set m_modified so that the new formatting is actually used. 2006-04-28 Murray Cumming on_datawidget_layout_item_added(): Add a LayoutItem to the LayoutGroup of 2006-04-28 Murray Cumming * glom/utility_widgets/flowtablewithfields.cc: on_datawidget_layout_item_added(): Add a LayoutItem to the LayoutGroup of the flowtable, which is shared with the document, and just let the parent rebuild the layout, instead of adding the actual widget here, and expecting the parent to read layout from that. This makes right-click adding work again. 2006-04-28 Murray Cumming finally finished. 2006-04-28 Murray Cumming more missing files. 2006-04-28 Murray Cumming Added missing files. 2006-04-28 Murray Cumming Moved data_structure, document, and part of python_embed directories into 2006-04-28 Murray Cumming * configure.in: * glom/Makefile.am: * po/POTFILES.in: * many files: Moved data_structure, document, and part of python_embed directories into libglom, so that the glom python module does not need to use symbols in the glom executable, because this is not allowed in cygwin, using --no-undefined. In future, this can be used as public API to make the document/database structure available to separate utilities and a web UI. 2006-04-28 Murray Cumming restored files. 2006-04-28 Murray Cumming Moved data_structure, document, and part of python_embed directories into 2006-04-28 Murray Cumming * configure.in: * glom/Makefile.am: * po/POTFILES.in: * many files: Moved data_structure, document, and part of python_embed directories into libglom, so that the glom python module does not need to use symbols in the glom executable, because this is not allowed in cygwin, using --no-undefined. In future, this can be used as public API to make the document/database structure available to separate utilities and a web UI. 2006-04-27 Murray Cumming get_type_name_ui(): Actually return the translated string instead of the 2006-04-27 Murray Cumming * glom/data_structure/field.cc: get_type_name_ui(): Actually return the translated string instead of the string for SQL. This prevents an error+crash when adding a field in any locale that has been translated. Kind of important. 2006-04-27 Murray Cumming Moved these dialog classes into the layout_item_dialogs/ directory where 2006-04-27 Murray Cumming * glom/base_db.cc: * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/dialog_buttonscript.cc: * glom/layout_item_dialogs/dialog_buttonscript.h: * glom/layout_item_dialogs/dialog_textobject.cc: * glom/layout_item_dialogs/dialog_textobject.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_design/Makefile.am: * glom/mode_design/dialog_buttonscript.cc: * glom/mode_design/dialog_buttonscript.h: * glom/mode_design/dialog_textobject.cc: * glom/mode_design/dialog_textobject.h: Moved these dialog classes into the layout_item_dialogs/ directory where they belong. 2006-04-26 Murray Cumming on_box_find_criteria: Set the table name in the FoundSet, so that the 2006-04-26 Murray Cumming * glom/utility_widgets/dialog_choose_id.cc: on_box_find_criteria: Set the table name in the FoundSet, so that the init_db_details() can succeed, and not falsely say that there are no results. 2006-04-25 Murray Cumming Use memset to zero the tm structures, to fix a build problem with cygwin. 2006-04-23 Murray Cumming * glom/data_structure/glomconversions.cc: Use memset to zero the tm structures, to fix a build problem with cygwin. Bug #338844 from Yselkowitz. 2006-04-23 Murray Cumming 1.0.2: 2006-04-23 Murray Cumming * glom/utility_widgets/Makefile.am: * glom/glom.glade: * glom/utility_widgets/dialog_choose_date.cc: * glom/utility_widgets/dialog_choose_date.h: New dialog, for choosing a date from a calendar. * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: Constructor: Add a ... button next to dates so people can choose the date from a calendar. This might help to give clues about a strange locale bug that someone is experiencing with date fields. 1.0.1: 2006-04-22 Murray Cumming * glom/base_db.cc: add_standard_groups(): Do not grant developer access to a table if the table does not exist yet. This avoids the failure during the first creation of the first example (though a second try worked.) 2006-04-14 Ilkka Tuohela Updated Finnish translation 2006-04-10 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-04-01 Murray Cumming Added get_table_names(), using get_tables(). 2006-04-01 Murray Cumming * glom/document/document_glom.cc: * glom/document/document_glom.h: Added get_table_names(), using get_tables(). * glom/base_db.cc: * glom/base_db.h: Renamed get_table_names() to get_table_names_from_database(), to be more explicit. * glom/mode_design/box_db_table_relationships.cc: * glom/navigation/box_tables.cc: Call the appropriate get_table_names*(), so we never show table names that are not in the document, because that usually leads to problems later. 2006-04-01 Murray Cumming on_adddel_Add(): If the table exists on the server, then try to reuse it 2006-04-01 Murray Cumming * glom/navigation/box_tables.cc: on_adddel_Add(): If the table exists on the server, then try to reuse it and store it in the document. This should never happen, but it was just useful to me when I lost a more recent copy of my .glom document. It adds a translatable string, but users should never see this dialog anyway. 2006-03-30 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-03-28 Murray Cumming 1.0.0: 2006-03-28 Murray Cumming * glom/mode_data/box_data_list_related.cc: get_fields_to_show() Really make fields non-editable if the relationship does not allow editing. 2006-03-28 Murray Cumming load_from_document(): Use localhost if the host name is empty. 2006-03-28 Murray Cumming * glom/dialog_connection.cc: load_from_document(): Use localhost if the host name is empty. * glom/frame_glom.cc: connection_request_password_and_choose_new_database_name(): Store the successfully-used entered server host name in the document, so it is the default when the document is reopened. 2006-03-28 Murray Cumming Call set_field_value_in_database() with the optional 2006-03-28 Murray Cumming * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: Call set_field_value_in_database() with the optional use_current_calculations value instead of mistakenly casting the window pointer to bool. 2006-03-28 Murray Cumming * glom/glom.glade: window_layout_report: * glom/reports/dialog_layout_report.cc: * glom/reports/dialog_layout_report.h: Add a show_table_title checkbutton, because the table title is sometimes superfluous. * glom/document/document_glom.cc: load_after(), save_before(): load and save the new report property. * glom/base_db.cc: build_report(): Put show_table_title in the xml. * xslt/print_report_to_html.xsl: Interepret show_table_title in the xml. * glom/data_structure/report.cc: * glom/data_structure/report.h: Added get/set_show_table_title(). 2006-03-27 Murray Cumming Use TreeView::set_fixed_height_mode() and 2006-03-27 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: Use TreeView::set_fixed_height_mode() and TreeViewColumn::set_fixed_width(), so that the TreeView does not request values that are not visible in the scrolled window. If libgda does things properly then this should mean that we do not get data from the database that we never see. 2006-03-27 Murray Cumming Added a patch for hacking. 2006-03-27 Murray Cumming Added get_suitable_record_to_view_details() and 2006-03-27 Murray Cumming * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: Added get_suitable_record_to_view_details() and get_has_suitable_record_to_view_details() so that the row button can go to a doubly-related record if the related table is hidden, based on the first related field in the portal. * glom/utility_widgets/flowtablewithfields.cc: on_portal_user_requested_details(): If the related table is hidden, use get_has_suitable_record_to_view_details() instead. 2006-03-27 Murray Cumming create_related(): Connect to signals here, instead of from the caller. 2006-03-27 Murray Cumming * glom/utility_widgets/flowtablewithfields.cc: create_related(): Connect to signals here, instead of from the caller. This makes the row details button work in Notebooks. 2006-03-27 Murray Cumming get_table_fields(): Hide the hidden system field, though it should never 2006-03-27 Murray Cumming * glom/document/document_glom.cc: * glom/document/document_glom.h: get_table_fields(): Hide the hidden system field, though it should never be in the document anyay. Added set_parent_window() so that the load/save methods can show a busy cursor, though this does not work yet. * glom/application.cc: init_create_document(): Call set_parent_window() on the document. * glom/standard_table_prefs_fields.h: Added GLOM_STANDARD_FIELD_LOCK - a hidden system field for each table, not used yet. * glom/base_db.h: get_fields_for_table_from_database(): Optionally hide the hidden system field. * glom/base_db.cc: connect_to_server(), Query_Execute(): Added optional parent_window parameter, so they can show the busy cursor. * glom/box_db_table.cc: * glom/dialog_connection.cc: * glom/dialog_database_preferences.cc: * glom/frame_glom.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/notebook_data.cc: * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/navigation/box_tables.cc: Use the new parameters to show busy cursors. * glom/utility_widgets/db_adddel/db_adddel.cc: treeview_append_column(): Escape underlines in column titles so that they are not interpreted as mnemmonics. * po/POTFILES.in: Added missing file. 2006-03-25 Murray Cumming Depend on latest Bakery, for BusyCursor API addition. 2006-03-25 Murray Cumming * configure.in: Depend on latest Bakery, for BusyCursor API addition. * glom/application.cc: * glom/base_db.cc: * glom/box_reports.cc: * glom/dialog_connection.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_list_find.cc: * glom/navigation/box_tables.cc: Correct the BusyCursor declarations so that they actually instantiate an object, so that they work. 2006-03-25 Francisco Javier F. Serrador Updated Spanish translation. 2006-03-25 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-03-25 Murray Cumming offer_new_or_existing(): If creation of a new database fails, offer again. 2006-03-25 Murray Cumming * glom/application.cc: offer_new_or_existing(): If creation of a new database fails, offer again. * glom/frame_glom.cc: create_database(): Warn the user if creation failed. 2006-03-25 Murray Cumming set_table_privileges(): When granting create privileges, make sure to also 2006-03-25 Murray Cumming * glom/base_db.cc: set_table_privileges(): When granting create privileges, make sure to also grant edit privileges in the hidden autoincrement table. add_standard_groups(): Give them access to the standard prefs table too. auto_increment_insert_first_if_necessary(): Check that the user is allowed to edit the autoincrement table, and warn the user about this serious error if not. get_database_prefefrences(): Check that the user is allowed to view this table. * glom/document/document_glom.cc: * glom/document/document_glom.h: Added create_table_system_preferences() with no arguments. get_tables(): Added optional plus_system_prefs boolean. * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_groups_list.h: Show the table title instead of the name, and show the system prefs table too. on_button_group_new(): Grant access to the autoincrements table too. 2006-03-24 Murray Cumming fill_group_list(): Avoid a warning when using selection on a treeview with 2006-03-24 Murray Cumming * glom/mode_design/users/dialog_groups_list.cc: fill_group_list(): Avoid a warning when using selection on a treeview with no model yet. 2006-03-24 Murray Cumming get_database_users(): 2006-03-24 Murray Cumming * glom/base_db.cc: get_database_users(): * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/utils.cc: build_sql_select_with_where_clause(): Quote the table, group, and user names, because they otherwise fail when using reserved names, such as cast. 2006-03-24 Murray Cumming Pass sort_clause as a list of LayoutItem_Fields, so that 2006-03-24 Murray Cumming * glom/application.cc: * glom/base_db.cc: * glom/base_db.h: * glom/data_structure/layout/report_parts/layoutitem_groupby.h: * glom/frame_glom.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utils.cc: * glom/utils.h: Pass sort_clause as a list of LayoutItem_Fields, so that build_sql_select_with_where_clause() can define the relationships used by the sort clause. * glom/data_structure/layout/usesrelationship.cc: * glom/data_structure/layout/usesrelationship.h: get_sql_join_alias_definition(): Put quotes around the relationship names, in some places where I forgot to do that. 2006-03-24 Peter Williams Remove Frame_Glom:: from the 2006-03-24 Peter Williams * glom/frame_glom.h: Remove Frame_Glom:: from the connection_request_password_and_choose_new_database_name() declaration, to fix the build with g++ 4.1 (in Fedora Core 5). 2006-03-23 Murray Cumming Call set_icon_from_file() so that metacity shows the Glom icon in various 2006-03-23 Murray Cumming * glom/Makefile.am: * glom/application.cc: Call set_icon_from_file() so that metacity shows the Glom icon in various places. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Connect to the clicked signal of the TreeViewColumns, and change the sort order accordingly. 2006-03-23 Murray Cumming Added FoundSet class, instead of passing table_name, where_clause, and 2006-03-23 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added FoundSet class, instead of passing table_name, where_clause, and sort_clause around separately. * glom/application.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_list_find.cc: * glom/mode_find/box_data_list_find.h: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: * glom/utility_widgets/dialog_choose_id.cc: * glom/utils.cc: Use FoundSet instead of separate parameters. * glom/frame_glom.cc: * glom/frame_glom.h: show_table(): Sort the list by primary key by default, so that the order is at least predictable. 2006-03-21 Murray Cumming Increased version. 2006-03-21 Murray Cumming create_table_system_preferences(): Added a logo image field to the system 2006-03-21 Murray Cumming * glom/standard_table_prefs_fields.h: * glom/document/document_glom.cc: create_table_system_preferences(): Added a logo image field to the system preferences table. * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/box_db_table_definition.h: * glom/base_db.cc: * glom/base_db.h: Moved postgres_add_column() and postgres_change_column_extras() to Base_DB. Added create_table_add_missing_fields() and called it from add_standard_tables() to make sure that existing databases get new fields. Added get_field_exists_in_database() get_database_preferences(), set_database_preferences(): Check that the new field is in the database and do not try to use if it is it not there. * glom/data_structure/system_prefs.h: Added logo as a Gda::Value. * glom/glom.glade: * glom/dialog_database_preferences.cc: * glom/dialog_database_preferences.h: Add a new notebook tab for the logo. 2006-03-21 Murray Cumming field: Correct the xpaths to get the correct border-widths. Use more 2006-03-21 Murray Cumming * xslt/print_report_to_html.xsl: field: Correct the xpaths to get the correct border-widths. Use more specific apply-templates pattern, to put the header above the title. 2006-03-21 Murray Cumming report_build_headerfooter(): Handle images, so they appear on 2006-03-21 Murray Cumming * glom/base_db.cc: report_build_headerfooter(): Handle images, so they appear on header/footer parts of reports. * glom/reports/dialog_layout_report.cc: on_button_edit(): Handle images, so they can be edited. * xslt/print_report_to_html.xsl: Use xsl:variable and xsl:copy-of to reduce some copy and paste of node creation. 2006-03-21 Murray Cumming parse_value(): Handle images, assuming that the text is the escaped SQL 2006-03-21 Murray Cumming * glom/data_structure/glomconversions.cc: parse_value(): Handle images, assuming that the text is the escaped SQL image format. This means that the image layout items are actually loaded from the document. * glom/utility_widgets/flowtablewithfields.cc: add_textobject_at_position(), add_imageobject_at_position(): Pass true to add(), so that these widgets take up the full available width when they have no titles. 2006-03-21 Murray Cumming Added new image type, for arbitrary images on layouts and reports. 2006-03-21 Murray Cumming * po/POTFILES.in: * glom/data_structure/layout/Makefile.am: * glom/data_structure/layout/layoutitem_image.cc: * glom/data_structure/layout/layoutitem_image.h: Added new image type, for arbitrary images on layouts and reports. * glom/base_db.cc: * glom/base_db.h: Added build_records_imageobject() and offer_imageobject(). Handle image fields in report_build_records_field(). * glom/glom.glade: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: Added Add Image button and handled it. * glom/document/document_glom.cc: * glom/document/document_glom.h: Load/Save the new layout item. * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/dialog_imageobject.cc: * glom/layout_item_dialogs/dialog_imageobject.h: New dialog for editing the new layout item. * glom/reports/dialog_layout_report.cc: Constructor: Add new image item to available parts. * glom/utils.cc: * glom/utils.h: Added create_local_image_uri(), to save a temporary copy of the image to the filesystem, for use in HTML report. * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Added set_read_only(). * xslt/print_report_to_html.xsl: Handle field nodes that have image_uri instead of value. 2006-03-20 Murray Cumming report_build_records_field(): Handle fields in headers and footers, 2006-03-20 Murray Cumming * glom/base_db.cc: report_build_records_field(): Handle fields in headers and footers, assuming that they are to single records, such as system preferences. 2006-03-20 Murray Cumming report_build_records_text(): Take bool vertical parameter, like 2006-03-20 Murray Cumming * glom/base_db.cc: * glom/base_db.h: report_build_records_text(): Take bool vertical parameter, like report_build_records_field(), so we can handle these properly in vertical groups. * glom/data_structure/layout/report_parts/layoutitem_verticalgroup. cc: Correct node name for XML/XSL reports. * xslt/print_report_to_html.xsl: Handle headers and footers. 2006-03-20 Murray Cumming Added some missing files. 2006-03-20 Murray Cumming * po/POTFILES.in: Added some missing files. 2006-03-20 Murray Cumming Moved this dialog into a sub directory. Show different (less) available 2006-03-20 Murray Cumming * configure.in: * glom/Makefile.am: * glom/reports/Makefile.am: * glom/reports/dialog_layout_report.cc: * glom/reports/dialog_layout_report.h: Moved this dialog into a sub directory. Show different (less) available items for headers and footers, to avoid some confusion. * glom/reports/treestore_report_layout.cc: * glom/reports/treestore_report_layout.h: Added a custom treemodel, so that we can override row_drop_possible_vfunc(), to control what can be dropped where. 2006-03-18 Murray Cumming Put the report parts into a Notebook, with extra tabs, with extra 2006-03-18 Murray Cumming * glom/glom.glade: * glom/dialog_layout_report.cc: * glom/dialog_layout_report.h: Put the report parts into a Notebook, with extra tabs, with extra treeviews for the header and footer, because there is no point in allowing them to be added by the user anywhere but the start and end. * glom/base_db.cc: report_build(): Handle the Header and Footer parts, though it is reusing some datemodel-row-based functions in a hacky way, and it needs to create an equivalent of the HTML table and tr for the header parts. * xslt/print_report_to_html.xsl: Initial handling of header and footer parts. 2006-03-17 Murray Cumming Added virtual get_report_path_id() instead of hard-coding the node IDs in 2006-03-17 Murray Cumming * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: * glom/data_structure/layout/layoutitem.cc: * glom/data_structure/layout/layoutitem.h: * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: * glom/data_structure/layout/layoutitem_text.cc: * glom/data_structure/layout/layoutitem_text.h: * glom/data_structure/layout/report_parts/layoutitem_fieldsummary.c c: * glom/data_structure/layout/report_parts/layoutitem_fieldsummary.h : * glom/data_structure/layout/report_parts/layoutitem_groupby.cc: * glom/data_structure/layout/report_parts/layoutitem_groupby.h: * glom/data_structure/layout/report_parts/layoutitem_summary.cc: * glom/data_structure/layout/report_parts/layoutitem_summary.h: * glom/data_structure/layout/report_parts/layoutitem_verticalgroup. cc: * glom/data_structure/layout/report_parts/layoutitem_verticalgroup. h: Added virtual get_report_path_id() instead of hard-coding the node IDs in build_report() and friends. * glom/dialog_layout_report.cc: * glom/data_structure/layout/report_parts/layoutitem_footer.cc: * glom/data_structure/layout/report_parts/layoutitem_footer.h: * glom/data_structure/layout/report_parts/layoutitem_header.cc: * glom/data_structure/layout/report_parts/layoutitem_header.h: New layout report parts, not used yet. * glom/document/document_glom.cc: Load/Save the new report parts. * xslt/print_report_to_html.xsl: Some XSL to handle headers and footers. Might even work. * glom/base_db.cc: * glom/base_db.h: Added report_build_headerfooter(). Needs work. 2006-03-17 Murray Cumming on_menu_report_selected(): Build the report with the current found set 2006-03-17 Murray Cumming * glom/frame_glom.cc: on_menu_report_selected(): Build the report with the current found set only. 2006-03-17 Murray Cumming Added #includes to fix the build. 2006-03-17 Murray Cumming * glom/utils.cc: Added #includes to fix the build. 2006-03-17 Murray Cumming Add header and footer parts for reports, though they are not used yet. Add 2006-03-17 Murray Cumming * glom/data_structure/layout/report_parts/Makefile.am: * glom/data_structure/layout/report_parts/layoutitem_footer.cc: * glom/data_structure/layout/report_parts/layoutitem_footer.h: * glom/data_structure/layout/report_parts/layoutitem_header.cc: * glom/data_structure/layout/report_parts/layoutitem_header.h: Add header and footer parts for reports, though they are not used yet. * po/POTFILES.in: Add the new files. 2006-03-17 Murray Cumming report_build(): Take extra Gtk::Window* parameter. 2006-03-17 Murray Cumming * glom/base_db.cc: * glom/base_db.h: report_build(): Take extra Gtk::Window* parameter. * glom/frame_glom.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: Call report_build() with extra Gtk::Window* parameter so that the dialog can be transient. * glom/utils.cc: * glom/utils.h: transform_and_open(): Show a dialog to hint to the user that they should look in their open web browser to see the report. * po/POTFILES.in: Added utils.c 2006-03-15 Murray Cumming Increased version. 2006-03-15 Murray Cumming add_standard_groups(): Add the current user to the developer group here, 2006-03-15 Murray Cumming * glom/base_db.cc: add_standard_groups(): Add the current user to the developer group here, rather than expecting the caller to do it (it did not always do it), so that people who create databases successfully are always marked as developers, so they can always change their databases. * glom/applicationcc: recreate_database(): Do not make the user a developer here - let add_standard_groups() do it. 2006-03-15 Murray Cumming check_changes(): Do not allow any changes when the Entry is set to 2006-03-15 Murray Cumming * glom/utility_widgets/comboentryglom.cc: check_changes(): Do not allow any changes when the Entry is set to sensitive, to prevent changes via the combo menu. GtkComboBox has no set_editable() of its own. Show and informative dialog when changing the value back to the original one, so it does not just seem broken. * glom/utility_widgets/datawidget.cc: Do not make read-only comboboxentries insensitive, now that we can make them non-editable instead. 2006-03-14 Hendrik Brandt Updated German translation for 1.0 release. 2006-03-14 Hendrik Brandt * de.po: Updated German translation for 1.0 release. 2006-03-14 Murray Cumming Increased version. 2006-03-14 Murray Cumming record_new(): Do not ignore entered field data for related fields, because 2006-03-14 Murray Cumming * glom/mode_data/box_data.cc: record_new(): Do not ignore entered field data for related fields, because we just calculated them, and they are correct. Somehow or other this fixes the bug that caused calculated field values from the last-shown record to be inserted into new records. 2006-03-14 Murray Cumming set_value(): When clearing the image, also clear m_pixbuf_original, so 2006-03-14 Murray Cumming * glom/utility_widgets/imageglom.cc: set_value(): When clearing the image, also clear m_pixbuf_original, so that it doesn't come back when the image is rescaled. For instance, this makes sure that picture fields are empty when adding new records on the detail view. 2006-03-14 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-03-14 Murray Cumming set_userlevel(): Add some debug output. on_menu_userlevel_Developer(): Add 2006-03-14 Murray Cumming * glom/document/document_glom.cc: set_userlevel(): Add some debug output. * glom/frame_glom.cc: on_menu_userlevel_Developer(): Add some debug output, because someone has reported that they can not go to developer mode. This might help us find out exactly why. * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: init_db(): Add optional show_title parameter. * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: add_layout_notebook_at_position(): Support Related Records portals as direct children of Notebook parts, putting their titles in the tab instead of having an alignment tab, and instead of requiring them to be inside a group. 2006-03-14 Murray Cumming Moved some code into report_build_records_field() and 2006-03-14 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Moved some code into report_build_records_field() and report_build_records_text(). Added report_build_records_verticalgroup(). report_build() and report_build_records(): Handle vertical groups (recursively). * glom/data_structure/layout/report_parts/Makefile.am: * glom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc: * glom/data_structure/layout/report_parts/layoutitem_verticalgroup.h: Added new report part, for stacked rows of fields in one cell of a record, for fitting more stuff into one row of a report. * glom/document/document_glom.cc: Load/Save the new layout item. * glom/dialog_layout_report.cc: * xslt/print_report_to_html.xsl: Handle vertical_group and field_vertical. * glom/utility_widgets/flowtablewithfields.cc: add_layout_notebook_at_position(): Make the notebook tabs bold, so they are as visible as group titles, which is what they are really. Make sure that the notebook pages have border spacing. 2006-03-13 Murray Cumming Update NEWS. 2006-03-13 Murray Cumming Added Notebook part, which has Groups as child items for tabs. 2006-03-13 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/data_structure/layout/Makefile.am: * glom/data_structure/layout/layoutitem_notebook.cc: * glom/data_structure/layout/layoutitem_notebook.h: * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/glom.glade: * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/dialog_notebook.cc: * glom/layout_item_dialogs/dialog_notebook.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: * glom/utility_widgets/layoutwidgetbase.cc: * glom/utility_widgets/layoutwidgetbase.h: * glom/utility_widgets/notebookglom.cc: * glom/utility_widgets/notebookglom.h: * po/POTFILES.in: Added Notebook part, which has Groups as child items for tabs. 2006-03-13 Murray Cumming get_table_fields_to_show_for_sequence_add_group(): When getting full field 2006-03-13 Murray Cumming * glom/base_db.cc: get_table_fields_to_show_for_sequence_add_group(): When getting full field details for related fields, use get_table_used() instead of the single-related to_table, so that this works with doubly-related fields. This makes doubly-related fields work in portals. * glom/mode_data/dialog_layout_list_related.cc: on_button_edit_field(): Show fields to the to_table, not the parent table. * glom/utility_widgets/db_adddel/db_adddel.cc: get_column_index(): Use is_same_field(), so that it works for doubly-related fields too. 2006-03-13 Murray Cumming Added get/set_use_custom_title(). 2006-03-13 Murray Cumming * glom/data_structure/layout/custom_title.cc: * glom/data_structure/layout/custom_title.h: Added get/set_use_custom_title(). * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Added get_title_or_name_no_custom(). get_title_or_name(): Return an empty custom title if use_custom_title is set. * glom/data_structure/translatable_item.cc: * glom/data_structure/translatable_item.h: get_translatable_type_name(): Add a result for custom field titles. * glom/document/document_glom.cc: * glom/document/document_glom.h: load_after_layout_item_field(), save_before_layout_item_field(): Load/Save a bool use_custom_title attribute, to allow for empty custom titles. Added get_translatable_report_items(). get_translatable_layout_items(): Handle GroupBy group-by fields and secondary fields. * glom/layout_item_dialogs/dialog_field_layout.cc: set_field(): Show the non-custom title as the default title, so it does not change if there is a custom title. * glom/translation/window_translations.cc: Use get_translatable_report_items() to get custom titles and GroupBy fields. 2006-03-13 Murray Cumming load_after_layout_group(), save_before_layout_group(): For GroupBy parts, 2006-03-13 Murray Cumming * glom/document/document_glom.cc: load_after_layout_group(), save_before_layout_group(): For GroupBy parts, save a whole LayoutItem node for the group-by field, so we can use related fields and custom formatting for it. * glom/glom.glade: dialog_group_by: Rename the Select button for Sort Fields to Edit, to match the button for secondary fields, which also has more than one field. * glom/layout_item_dialogs/dialog_group_by.cc: * glom/layout_item_dialogs/dialog_group_by.h: Added Formatting button, to allow us, for instance, to change the title of the group-by field. 2006-03-13 Murray Cumming report_build_groupby_children(): In the ORDER BY clause, use the 2006-03-13 Murray Cumming * glom/base_db.cc: report_build_groupby_children(): In the ORDER BY clause, use the relationship alias name, instead of the table name, to avoid getting extra records because we would not be using the join. * glom/data_structure/layout/usesrelationship.cc: * glom/data_structure/layout/usesrelationship.h: Added get_sql_table_or_join_alias_name() for convenience. * glom/utils.cc: build_sql_select_with_where_clause(): Use get_sql_table_or_join_alias_name() to simplify the code. * glom/document/document_glom.cc: load_after_layout_group(): Fill the full field details for secondary fields of GroupBy parts. * glom/layout_item_dialogs/dialog_group_by.cc: update_labels(): Show the list of secondary fields. * xslt/print_report_to_html.xsl: Only indent child group_by divs, to avoid wasting space at the left margin. 2006-03-13 Murray Cumming treeviewcolumn_on_cell_data(): Check the type of the GdaValue before 2006-03-13 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: treeviewcolumn_on_cell_data(): Check the type of the GdaValue before calling get_bool, to avoid warnings about it not being bool. It seems to be null sometimes. Not sure why. 2006-03-13 Murray Cumming report_build_groupby(): Use the border width also when using the group_by 2006-03-13 Murray Cumming * glom/base_db.cc: report_build_groupby(): Use the border width also when using the group_by node for non-grouped records. * glom/layout_item_dialogs/comboentry_borderwidth.cc: Constructor add a 0.05em border width choice, for a finer line. 2006-03-12 Murray Cumming Update NEWS 2006-03-12 Murray Cumming Use a list of sort fields, instead of just one, for multiple sort levels. 2006-03-13 Murray Cumming * glom/data_structure/layout/report_parts/layoutitem_groupby.cc: * glom/data_structure/layout/report_parts/layoutitem_groupby.h: Use a list of sort fields, instead of just one, for multiple sort levels. * glom/base_db.cc: * glom/dialog_layout_report.cc: * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/glom.glade: * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/dialog_group_by.cc: * glom/layout_item_dialogs/dialog_group_by.h: * glom/layout_item_dialogs/dialog_groupby_sortfields.cc: * glom/layout_item_dialogs/dialog_groupby_sortfields.h: * glom/utils.cc: Handle the lsit of sort fields. * glom/data_structure/layout/layoutitem.cc: * glom/data_structure/layout/layoutitem.h: Add get_layout_display_name() as virtual method here, so we can call it polymorphically. 2006-03-12 Murray Cumming More removal of copy/pasted code. Using get_layout_display_name() instead. * glom/layout_item_dialogs/dialog_groupby_secondaryfields.cc: * glom/mode_data/dialog_layout_export.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list_related.cc: More removal of copy/pasted code. Using get_layout_display_name() instead. 2006-03-12 Murray Cumming on_cell_data_name(): Move the code to create the field display name (with 2006-03-12 Murray Cumming * glom/data_structure/layout/layoutitem_field.cc: * glom/mode_data/dialog_layout_details.cc: on_cell_data_name(): Move the code to create the field display name (with the :: separators) into LayoutItem_Field::get_display_name(), to avoid copy/paste wasteage and to make it show up properly in the Reports layout dialog. 2006-03-12 Murray Cumming set_selected_relationship() Fix a crash caused by use of wrong iterator. 2006-03-12 Murray Cumming * glom/combobox_relationship.cc: set_selected_relationship() Fix a crash caused by use of wrong iterator. * glom/mode_data/dialog_choose_field.cc: set_document(): Specify the related_relationship if there is one, and make sure that the full list is visible if it's needed by the current field. 2006-03-12 Murray Cumming Updated NEWS 2006-03-12 Murray Cumming Optionally show related relationships, to allow specifying doubly-related 2006-03-12 Murray Cumming * glom/glom.glade: * glom/combobox_relationship.cc: * glom/combobox_relationship.h: * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_choose_field.h: Optionally show related relationships, to allow specifying doubly-related fields. * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Added get_is_same_field() to check the name, and both relationships easily. * glom/utility_widgets/flowtablewithfields.cc: get_field(): Use get_is_same_field() to handle doubly-related fields. * glom/data_structure/layout/usesrelationship.cc: * glom/data_structure/layout/usesrelationship.h: Added get/set_related_relationship() and associated methods. Added get_sql_join_alias_name() and get_sql_join_alias_definition(), moving SQL generation code from GlomUtils::build_sql_select_with_where_clause(). * glom/utils.cc: GlomUtils::build_sql_select_with_where_clause(): Simplify by using the UsesRelationships methods. This can now support doubly-related fields by creating aliases in terms of other aliases. * glom/document/document_glom.cc: * glom/document/document_glom.h: Load/Save the related_relationship. Load layouts after all other table information has been loaded for all tables, because the layouts need the full information. * glom/data_structure/layout/fieldformatting.cc: * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutitem_portal.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/box_data.cc: Update appropriately. 2006-03-12 Murray Cumming Remove a lot of copying and pasting of near-identical offer_field_list() 2006-03-12 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/layout_item_dialogs/dialog_field_summary.cc: * glom/layout_item_dialogs/dialog_group_by.cc: * glom/layout_item_dialogs/dialog_groupby_secondaryfields.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: * glom/mode_data/dialog_layout_export.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list_related.cc: Remove a lot of copying and pasting of near-identical offer_field_list() and offer_field_formatting() functions. Just use the one in Base_DB. Also made sure that these dialogs are always transient, by adding a Window* parameter. * glom/glom.glade: * glom/dialog_layout_report.cc: * glom/dialog_layout_report.h: Added a Formatting button. For instance, this allows the field titles to be changed (or removed) on reports. 2006-03-11 Murray Cumming Added get/set_border_width() for use when creating reports, for some 2006-03-12 Murray Cumming * glom/base_db.cc: * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: Added get/set_border_width() for use when creating reports, for some slight formatting choice. * glom/document/document_glom.cc: * glom/document/document_glom.h: load_after_layout_group(), save_before_layout_group(): Handle the border_width. * glom/glom.glade: * glom/layout_item_dialogs/dialog_group_by.cc: * glom/layout_item_dialogs/dialog_group_by.h: Allow the user to choose a border width for the rows in the group. * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/comboentry_borderwidth.cc: * glom/layout_item_dialogs/comboentry_borderwidth.h: New widget for choosing the border width. * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: Simplify the if/ifelse blocks that deal with layout parts. * xslt/print_report_to_html.xsl: Reduce copy/paste by using xsl::variables (though those xsl::variable blocks are copy/pasted). Use xsl::variables to apply a border-width style to td and the HTML blocks, depending on the border_width of the group-by. Add a horizontal line after the group-by titles. 2006-03-11 Murray Cumming get_layout_display_name(): Return the name even if the full details cache 2006-03-11 Murray Cumming * glom/data_structure/layout/layoutitem_field.cc: get_layout_display_name(): Return the name even if the full details cache is invalid. * glom/document/document_glom.cc: load_after(): Fill the full field details when loading report items, so that they show up in the report when it is edited. 2006-03-11 Murray Cumming enable_buttons(): Enable the Add button even if the item can not be a 2006-03-11 Murray Cumming * glom/dialog_layout_report.cc: enable_buttons(): Enable the Add button even if the item can not be a parent of the new item, so that the new item can become a sibling instead, if parent would allow that. 2006-03-11 Murray Cumming report_build_records(): Instead of generating different node names for 2006-03-11 Murray Cumming * glom/base_db.cc: report_build_records(): Instead of generating different node names for numeric field headings and field values, just add a field_type attribute. * xslt/print_report_to_html.xsl: In and : Use xls:choose to do align=right if the node has a field_type=numeric attribute. 2006-03-11 Murray Cumming report_build_groupby(): Move child record generation into new 2006-03-11 Murray Cumming * glom/base_db.cc: * glom/base_db.h: report_build_groupby(): Move child record generation into new report_build_groupby_children() method. Output child records even if there is no group_by field in the GroupBy part, so users can use it just to sort records, though that's a bit of a hack. I think adding an explicit SortBy part would confuse things, because it might not be clear what group of records are being sorted. But maybe it would work. * xslt/print_report_to_html.xsl: In : Do not print the group-by field title and value (with the : separator) if there is no group-by field, to avoid a lone :. 2006-03-11 Murray Cumming set_report(), get_report(): Allow non-group LayoutItems at the top level, 2006-03-11 Murray Cumming * glom/dialog_layout_report.cc: set_report(), get_report(): Allow non-group LayoutItems at the top level, instead of putting them inside an automatically-created group. 2006-03-10 Murray Cumming Added data_structure/layout/layoutitem_text.cc 2006-03-10 Murray Cumming * po/POTFILES.in: Added data_structure/layout/layoutitem_text.cc 2006-03-10 Francisco Javier F. Serrador Updated Spanish translation. 2006-03-10 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-03-10 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-03-10 Murray Cumming Update a couple of screenshots. 2006-03-10 Ilkka Tuohela Updated Finnish translation 2006-03-09 Murray Cumming on_adddel_Add(): Set the new report name in the row key, so we know what 2006-03-09 Murray Cumming * glom/box_reports.cc: on_adddel_Add(): Set the new report name in the row key, so we know what row to edit in subsequent steps. 2006-03-09 Murray Cumming Added get_items_count(). get_original_report_name(): Do not crash if there 2006-03-09 Murray Cumming * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: Added get_items_count(). * glom/dialog_layout_report.cc: get_original_report_name(): Do not crash if there are top-level fields. Still need to handle this properly though. * glom/utility_widgets/datawidget.cc: set_editable(): Call set_sensitive() on ComboBoxes, because the menu still changes the value if we just call set_editable on its Entry. 2006-03-09 Murray Cumming report_build_records() takes a vector of LayoutItem instead of 2006-03-09 Murray Cumming * glom/base_db.cc: * glom/base_db.h: report_build_records() takes a vector of LayoutItem instead of LayoutItem_Field, so it can handle text items. So text objects now work on record rows of reports. 2006-03-09 Murray Cumming Added offer_textobject(). 2006-03-09 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added offer_textobject(). * glom/data_structure/layout/Makefile.am: * glom/data_structure/layout/layoutitem_text.cc: * glom/data_structure/layout/layoutitem_text.h: Added Text layout part, for adding arbitrary text or empty text with a title, to a details layout. Does not work on reports yet. * glom/data_structure/translatable_item.cc: * glom/data_structure/translatable_item.h: get_translatable_type_name(): Update. * glom/dialog_layout_report.cc: Constructor: Add the Text object as a possible part to add. * glom/document/document_glom.cc: * glom/document/document_glom.h: load_after_group(), save_before_group(): Handle the text object layout part. * glom/glom.glade: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: Added Add Text button and handled it. * glom/mode_design/Makefile.am: * glom/mode_design/dialog_textobject.h * glom/mode_design/dialog_textobject.cc: New dialog for editing the text object. * glom/utility_widgets/Makefile.am: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: add_layout_item_at_position(): Add a LabelGlom for text objects. * glom/utility_widgets/labelglom.cc: * glom/utility_widgets/labelglom.h: New widget for the text object. 2006-03-08 Murray Cumming Increase version. 2006-03-08 Murray Cumming do_lookups(): Do not pass a instance constructor its own member variables. 2006-03-08 Murray Cumming * glom/base_db.cc: do_lookups(): Do not pass a instance constructor its own member variables. Avoids occasional crash and occasional non-working lookups. 2006-03-08 Murray Cumming get_table_fields_to_show_for_sequence_add_group(): Do not recurse into 2006-03-08 Murray Cumming * glom/base_db.cc: get_table_fields_to_show_for_sequence_add_group(): Do not recurse into portals, to avoid adding their fields to the SQL query for the parent table details view. * glom/document/document_glom.cc: load_after_layout_group(): In portals, load related (related from the related table) fields properly, so we remember the relationship. 2006-03-08 Murray Cumming parse_date(): Fix incorrect sanity check of the month, so that January is 2006-03-08 Murray Cumming * glom/data_structure/glomconversions.cc: parse_date(): Fix incorrect sanity check of the month, so that January is not changed to February. tm.tm_mon _does_ start with 0. 2006-03-08 Murray Cumming parse_value(): If parsing of the time fails, fall back to trying the C 2006-03-08 Murray Cumming * glom/data_structure/glomconversions.cc: parse_value(): If parsing of the time fails, fall back to trying the C locale. This is usually necessary. No idea why. 2006-03-08 Murray Cumming on_cell_button_clicked(): Do not interpret an edit request on a 2006-03-08 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: on_cell_button_clicked(): Do not interpret an edit request on a placeholder row as a request to add. This means that Glom switches to an empty details view instead, as you would expect. 2006-03-08 Murray Cumming refresh_from_database(): If there are no rows it is not an error. There 2006-03-08 Murray Cumming * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: refresh_from_database(): If there are no rows it is not an error. There are just no records in the table yet. 2006-03-07 Murray Cumming get_editable_and_allowed(): Report calculated fields as always 2006-03-07 Murray Cumming * glom/data_structure/layout/layoutitem_field.cc: get_editable_and_allowed(): Report calculated fields as always non-editable. * glom/layout_item_dialogs/dialog_field_layout.cc: set_field(): Do not allow calculated fields to be editable, by graying-out the checkbox. * glom/main.cc: Translate the command-line options, and add a --version option. * glom/utility_widgets/comboglomchoicesbase.cc: set_choices_with_second(): For the optional second column in the popdown, use the correct formatting, instead of reusing the formatting from the first column. * glom/utility_widgets/datawidget.cc: set_editable(): For ComboBoxEntry widgets, set the child entry as non-editable. 2006-03-07 Murray Cumming Call PySys_SetArgv, to prevent use of pygtk from crashing when using pygtk 2006-03-07 Murray Cumming * glom/main.cc: Call PySys_SetArgv, to prevent use of pygtk from crashing when using pygtk 2.9/2.10. * glom/mode_data/dialog_layout_details.cc: on_cell_data_name(): Name buttons as buttons in the name column, instead of leaving it blank. 2006-03-07 Murray Cumming on_document_load(): When saving from an example, temporarily increase the 2006-03-07 Murray Cumming * glom/application.cc: on_document_load(): When saving from an example, temporarily increase the user level, so that save_changes() always saves. * glom/document/document_glom.cc: set_modified(): Save even if modified is already set, because this can happen after unblocking save-on-modified. If there are endless loops then we need to fix them elsewhere instead. load_after(): Block setting of modified state while loading. 2006-03-06 Murray Cumming Prevent crashes when adding reports, or editing them. 2006-03-06 Murray Cumming * glom/box_reports.cc: * glom/data_structure/report.cc: * glom/dialog_layout_report.cc: * glom/document/document_glom.cc: Prevent crashes when adding reports, or editing them. 2006-03-02 Ilkka Tuohela Added Finnish translation 2006-02-28 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-02-24 Murray Cumming Added set_prevent_duplicates() and set_prevent_duplicates_warning(). 2006-02-24 Murray Cumming * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/adddel/adddel.h: Added set_prevent_duplicates() and set_prevent_duplicates_warning(). * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/navigation/box_tables.cc: Use the new AddDel methods to prevent, and warn about, duplicate tables, fields, and relationships, to prevent crashes. 2006-02-24 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-02-23 Murray Cumming postgres_change_column_type(): Data conversion commands: Fix crashes when 2006-02-23 Murray Cumming * glom/mode_design/fields/box_db_table_definition.cc: postgres_change_column_type(): Data conversion commands: Fix crashes when converting from text to boolean, and from boolean to number. Preserve information when converting from anything to boolean. | 2006-02-22 Murray Cumming Increased version. 2006-02-22 Murray Cumming Do not allow people to put image fields on the list view, because it can 2006-02-22 Murray Cumming * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list.h: Do not allow people to put image fields on the list view, because it can not show them yet. * glom/utility_widgets/db_adddel/db_adddel.cc: Some skeleton code to support (very scaled-down) images on the list view. But I have not actually implemented it because I do not want yet more versions of the code that works around the libgda 1.2 binary escaping problem. 2006-02-22 Murray Cumming postgres_change_column_type(): Use textcat() to add a preceding 0 when 2006-02-22 Murray Cumming * glom/mode_design/fields/box_db_table_definition.cc: postgres_change_column_type(): Use textcat() to add a preceding 0 when using to_number(), so that it always succeeds. Now I can not make glom crash or error when converting field types, though the results are a bit strange for text<->to date. 2006-02-22 Murray Cumming Add override of calculate_field_in_all_records() that does not need the 2006-02-22 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Add override of calculate_field_in_all_records() that does not need the primary key spoon-fed to it. Get all the primary key values, not all the calculated field values. * glom/mode_design/fields/box_db_table_definition.cc: on_Properties_apply(): Warn about necessary recalculation and allow the user to cancel the change of field definition. change_definition(): Recalculate all values if necessary. This even works. 2006-02-22 Murray Cumming Move get_calculation_fields() to Base_DB, so it can return a 2006-02-22 Murray Cumming * glom/data_structure/field.cc: * glom/data_structure/field.h: * glom/base_db.cc: * glom/base_db.h: Move get_calculation_fields() to Base_DB, so it can return a LayoutItem_Field, instead of a field name, so it can refer to related fields, though we are not using them yet. * glom/mode_data/box_data_details.cc: * glom/mode_design/fields/dialog_fieldcalculation.cc: Adapt. 2006-02-22 Murray Cumming FieldInRecord: Change primary_key* to key*, so we can use this for foreign 2006-02-22 Murray Cumming * glom/base_db.cc: * glom/base_db.h: FieldInRecord: Change primary_key* to key*, so we can use this for foreign keys for related records. * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: Adapt. * glom/utils.cc: * glom/utils.h: Rename build_sql_select_with_primary_key() to build_sql_select_with_key 2006-02-22 Murray Cumming FieldInRecord: Change primary_key* to key*, so we can use this for foreign 2006-02-22 Murray Cumming * glom/base_db.cc: * glom/base_db.h: FieldInRecord: Change primary_key* to key*, so we can use this for foreign keys for related records. * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: Adapt. * glom/utils.cc: * glom/utils.h: Rename build_sql_select_with_primary_key() to build_sql_select_with_key 2006-02-22 Murray Cumming Added build_sql_select_with_primary_key(). 2006-02-22 Murray Cumming * glom/utils.cc: * glom/utils.h: Added build_sql_select_with_primary_key(). * glom/base_db.cc: * glom/base_db.h: Added FieldInRecord inner class and used it to reduce the number of parameters for do_calculations(), do_lookups(), refresh_related_field(), calculate_field(), set_field_value_in_database(). * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: Change the method overrides and implementations to match. 2006-02-21 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-02-20 Murray Cumming Moved calculate_field(), get_record_field_values(), 2006-02-20 Murray Cumming * glom/box_db_table.cc: * glom/box_db_table.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/base_db.cc: * glom/base_db.h: Moved calculate_field(), get_record_field_values(), set_entered_field_data(), set_field_value_in_database(), build_sql_select(), do_calculations(), get_calculated_fields(), do_lookups(), get_lookup_fields(), get_lookup_value(), and refresh_related_fields() down to the Base_DB class, with extra table_name arguments, so we can recalculate/lookup fields even if they the tables or records are not being shown currently. 2006-02-19 Murray Cumming connect(): Parse the result of SELECT version() and return it from 2006-02-20 Murray Cumming * glom/connectionpool.cc: * glom/connectionpool.h: connect(): Parse the result of SELECT version() and return it from get_postgres_server_version(), so we can optionally use some new features, behind the scenes. 2006-02-19 Murray Cumming set_display_parent_table(): Add a separator after the table title, so that 2006-02-19 Murray Cumming * glom/combobox_relationship.cc: * glom/combobox_relationship.h: set_display_parent_table(): Add a separator after the table title, so that relationships are special. * glom/mode_data/dialog_choose_field.cc: set_document(): Scroll the current field into view, so it is always visible. 2006-02-19 Murray Cumming set_document(): Supply the table title as well as the name, so it shows 2006-02-19 Murray Cumming * glom/mode_data/dialog_choose_field.cc: set_document(): Supply the table title as well as the name, so it shows up. 2006-02-19 Murray Cumming set_field(): Do not show the current table name in the list of 2006-02-19 Murray Cumming * glom/mode_design/fields/dialog_fielddefinition.cc: set_field(): Do not show the current table name in the list of relationships for lookups. 2006-02-19 Murray Cumming Rename the Default Value tab to Value. Use radiobuttons to make the 2006-02-19 Murray Cumming * glom/glom.glade: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/fields/dialog_fielddefinition.h: Rename the Default Value tab to Value. Use radiobuttons to make the calculation and the rest mutually exclusive. 2006-02-19 Murray Cumming Increased version 2006-02-19 Murray Cumming Make on_flowtable_field_edited() virtual again so that the override in 2006-02-19 Murray Cumming * glom/mode_data/box_data_details.h: Make on_flowtable_field_edited() virtual again so that the override in BoxDataDetails_Find works again, to avoid odd regressions when finding. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utils.cc: * glom/base_db.cc: Try to print the SQL command on stdout when there is a problem with it. 2006-02-19 Murray Cumming on_notebook_find_criteria(): Show all records if the find was not 2006-02-19 Murray Cumming * glom/frame_glom.cc: on_notebook_find_criteria(): Show all records if the find was not successful, and the user did not want to try again. 2006-02-19 Murray Cumming on_menu_Mode_Find(): Start the Find mode on the same layout (Details or 2006-02-19 Murray Cumming * glom/frame_glom.cc: on_menu_Mode_Find(): Start the Find mode on the same layout (Details or List) as the Data mode was in. Add a little hack to make sure that we go back into Data mode in List view at first, to make sure that the first result will show up properly in the Details mode. * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: Added set_current_view(). * glom/mode_find/notebook_find.cc: * glom/mode_find/notebook_find.h: Added set_current_view(). 2006-02-19 Murray Cumming scale(): Call Gtk::Image::get_storage_type() before 2006-02-19 Murray Cumming, * glom/utility_widgets/imageglom.cc: scale(): Call Gtk::Image::get_storage_type() before Gtk::Image::get_pixbuf(), to avoid a critical warning. 2006-02-19 Murray Cumming Overried on_expose_event() so we can scale the image when we actually have 2006-02-19 Murray Cumming * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Overried on_expose_event() so we can scale the image when we actually have a real (>1) allocation. scale(): Do not call set_image() if the scaled pixbuf has exactly the same dimensions as the existing image. And do not try to scale the image if the allocation is very small, because this will generally fail. This fixes the disappearing image problem. 2006-02-19 Josep Puigdemont i Casamajó Updated Catalan translation. 2006-02-18 Murray Cumming Added get_has_to_table(), for performance, to avoid string copying. 2006-02-18 Murray Cumming * glom/data_structure/relationship.cc: * glom/data_structure/relationship.h: Added get_has_to_table(), for performance, to avoid string copying. * glom/utils.cc: build_sql_select_with_where_clause(): Add to_table to the FROM list for non-key-linked relationships. libpq adds the implicit FROM if we do not do this, but it prints a warning on stdout. * glom/mode_data/dialog_layout_list_related.cc: on_combo_relationship_changed(): Clear the list of fields when the relationship changes, so that there are no invalid fields. 2006-02-17 Murray Cumming get_translatable_items(): Return the CustomTitles of LayoutItem_Fields. 2006-02-17 Murray Cumming, * glom/document/document_glom.cc: get_translatable_items(): Return the CustomTitles of LayoutItem_Fields. * glom/translation/window_translations.cc: load_from_document(): Do not try to get the custom titles here, because get_translatable_items() gets them instead. 2006-02-17 Murray Cumming New translatable item, for use when layout items can optionally have 2006-02-17 Murray Cumming * glom/data_structure/layout/Makefile.am: * glom/data_structure/layout/custom_title.cc: * glom/data_structure/layout/custom_title.h: New translatable item, for use when layout items can optionally have special titles, when the default (such as Street for contacts::address_street), is not appropriate. * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Add get/set_title_custom(). * glom/data_structure/translatable_item.cc: * glom/data_structure/translatable_item.h: Add new item type and name. * glom/document/document_glom.cc: load_after_layout_item_field(), save_before_layout_item_field(): Load/Save the custom_title of LayoutItem_Field items. * glom/glom.glade: dialog_layout_field_properties. * glom/layout_item_dialogs/dialog_field_layout.cc: * glom/layout_item_dialogs/dialog_field_layout.h: Add widgets to allow a custom title. * glom/translation/window_translations.cc: load_from_document(): Add the custom titles to the list. * glom/utility_widgets/datawidget.cc: on_menupopup_activate_layout(): Save the new field properties, instead of replacing the whole item, so that the document gets the new information. Makes this work again. 2006-02-16 Murray Cumming Do not show the Triggered By information if there are not linking key 2006-02-16 Murray Cumming * glom/combobox_relationship.cc: Do not show the Triggered By information if there are not linking key fields for a relationship. * glom/document/document_glom.cc: * glom/document/document_glom.h: get_relationships(): Optionally also return the extra System Properties relationship. get_relationship(): Return the extra System Properties relationship if it is asked for by name, even though it is not saved in the document. * glom/mode_data/dialog_choose_field.cc: Show the extra System Properties relationship too. * po/POTFILES.in: Added document_glom.cc 2006-02-14 Murray Cumming Added get_has_fields() to identify relationships that actually link fields 2006-02-14 Murray Cumming * glom/data_structure/relationship.cc: * glom/data_structure/relationship.h: Added get_has_fields() to identify relationships that actually link fields in tables. * glom/mode_data/box_data_list_related.cc: init_db_details(), fill_from_database(): Get all rows (with no where clause) if the relationship does not specify linking fields. * glom/mode_design/box_db_table_relationships.cc: * glom/utils.cc: build_sql_select_with_where(): If a related field's relationship doesn't specify linking fields, don't attempt a JOIN. 2006-02-14 Murray Cumming Code style uniformity: Change strTableName to table_name and 2006-02-14 Murray Cumming * glom/base_db.cc: * glom/box_db_table.cc: * glom/box_db_table.h: * glom/box_reports.cc: * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/dialog_design.cc: * glom/mode_design/dialog_design.h: * glom/mode_design/dialog_fields.cc: * glom/mode_design/dialog_fields.h: * glom/mode_design/dialog_relationships.cc: * glom/mode_design/dialog_relationships.h: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_find/box_data_details_find.cc: * glom/mode_find/notebook_find.cc: * glom/mode_find/notebook_find.h: * glom/utils.cc: Code style uniformity: Change strTableName to table_name and strWhereClause to where_clause. 2006-02-14 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-02-13 Murray Cumming Added get_empty_value_suitable_for_python(). get_record_field_values(): 2006-02-13 Murray Cumming * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: Added get_empty_value_suitable_for_python(). * glom/mode_data/box_data.cc: get_record_field_values(): Get full set of suitable empty values if there is no primary key, and replace null values with suitable non-null empty values, with get_empty_value_suitable_for_python(). This avoids warnings on the command line when adding records. 2006-02-13 Murray Cumming Increase version. 2006-02-13 Murray Cumming Update NEWS 2006-02-13 Murray Cumming Added get/set_script(). load_after_layout_group(), 2006-02-13 Murray Cumming * glom/data_structure/layout/layoutitem_button.cc: * glom/data_structure/layout/layoutitem_button.h: Added get/set_script(). * glom/document/document_glom.cc: load_after_layout_group(), save_before_layout_group(): Load/Save the scripts for buttons. * glom/utility_widgets/buttonglom.cc: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: Handle button clicks and run the python code. * glom/glom.glade: Add a script editing dialog. * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: on_button_edit(): Allow editing of buttons and start editing of the title column if the item is a group. * glom/mode_design/Makefile.am: * glom/mode_design/dialog_buttonscript.cc: * glom/mode_design/dialog_buttonscript.h: Added button script editing dialog. * glom/python_embed/glom_python.cc: * glom/python_embed/glom_python.h: Added glom_execute_python_function_implementation() because we buttons do not care about the result. * examples/example_smallbusiness.glom: Add a Test Button to the Contacts layout, with a pygtk hello world script behind it. 2006-02-13 Murray Cumming Give it a translatable item type and name so it shows up properly in the 2006-02-13 Murray Cumming * glom/data_structure/layout/layoutitem_button.cc: * glom/data_structure/translatable_item.cc: * glom/data_structure/translatable_item.h: Give it a translatable item type and name so it shows up properly in the translations list. * glom/document/document_glom.cc: save_before_layout_item_field(): Load the sequence number of child items. It was pure luck that this worked sometimes without this. * glom/document/document_glom.h: * glom/mode_data/dialog_layout_details.cc: on_button_*(): Set m_modified, so that all changes are always saved. I am surprised that this worked before. on_cell_data_name(): Mark buttons as such. on_cell_data_title(): Allow button titles to be edited. * glom/utility_widgets/flowtablewithfields.cc: add_button_at_position(): Set the button title and really show the widget. 2006-02-12 Murray Cumming Add Button layout item. Details Layout: Put the Add buttons vertically at 2006-02-12 Murray Cumming * po/POTFILES.in: * glom/Makefile.am: * glom/data_structure/layout/Makefile.am: * glom/data_structure/layout/layoutitem_button.cc: * glom/data_structure/layout/layoutitem_button.h: Add Button layout item. * glom/glom.glade: Details Layout: Put the Add buttons vertically at the right-hand side Add an Add Button button. * glom/mode_data/treestore_layout.cc: * glom/mode_data/treestore_layout.h: * glom/mode_data/dialog_layout_details.h: * glom/mode_data/dialog_layout_details.cc: Use the LayoutItems only in the model, simplifying this dramatically, and making it easier to add new types of layout items. * glom/utility_widgets/Makefile.am: * glom/utility_widgets/buttonglom.cc: * glom/utility_widgets/buttonglom.h: Add a (non yet useful) button widget. 2006-02-10 Murray Cumming 2006-02-10 Murray Cumming on_document_load(): When saving from an example, do not open the Save As 2006-02-10 Murray Cumming * glom/application.cc: on_document_load(): When saving from an example, do not open the Save As dialog box in the examples directory, because it is usually read-only and it is not a wise place to put your own stuff. Also see the latest Bakery 2.3.17 for fixes to prevent Save As in read-only paths. 2006-02-10 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-02-09 Murray Cumming Increase version. 2006-02-09 Murray Cumming Added remove_relationship(), to remove any child items that use the 2006-02-09 Murray Cumming * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: Added remove_relationship(), to remove any child items that use the relationship. * glom/document/document_glom.cc: remove_relationship(): Also remove any layout or report parts that use the relationship. 2006-02-09 Murray Cumming Added remove_field(). 2006-02-09 Murray Cumming * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: Added remove_field(). * glom/document/document_glom.cc: * glom/document/document_glom.h: Added remove_field(). * glom/mode_design/fields/box_db_table_definition.cc: on_adddel_delete(): Call Document_Glom::remove_field() to prevent a crash when deleting a field that is used on a layout. 2006-02-09 Murray Cumming get_lookup_value(): Convert the key field value, in case the 2006-02-09 Murray Cumming * glom/mode_data/box_data.cc: get_lookup_value(): Convert the key field value, in case the relationship's keys have different types. 2006-02-09 Murray Cumming save_to_document(): Actually add new relationships. 2006-02-09 Murray Cumming, * glom/mode_design/box_db_table_relationships.cc: save_to_document(): Actually add new relationships. 2006-02-08 Murray Cumming Added convert_value(), which attemps to convert between differing value 2006-02-09 Murray Cumming * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: Added convert_value(), which attemps to convert between differing value types if necessary. * glom/mode_data/box_data_details.cc: do_lookups(): * glom/mode_data/box_data_list.cc: do_lookups(): Use convert_value() to avoid errors when looking up a value from a field with a different field type. | 2006-02-08 Murray Cumming Update ChangeLog with version. 2006-02-08 Murray Cumming get_title(): Really fall back to related translations. For instance, if 2006-02-08 Murray Cumming * glom/data_structure/translatable_item.cc: get_title(): Really fall back to related translations. For instance, if you are in the German (Austria) locale, and there is no German (Austria) translation for a title, but there is one for German (Germany), use it. 2006-02-08 Murray Cumming Update screenshot 2006-02-08 Murray Cumming set_translation_original_locale(): Mark the document as modified so that 2006-02-08 Murray Cumming * glom/document/document_glom.cc: set_translation_original_locale(): Mark the document as modified so that this is saved. * glom/glom.glade: Use language everywhere instead of locale. * glom/translation/Makefile.am: * glom/translation/dialog_change_language.h: * glom/translation/dialog_identify_original.cc: * glom/translation/dialog_identify_original.h: Show the locale name, not the ID. * glom/translation/dialog_copy_translation.cc: * glom/translation/dialog_copy_translation.h: * glom/translation/window_translations.cc: * glom/translation/window_translations.h: Implement original locale identification and translation copying. 2006-02-08 Murray Cumming Constructor: Call TranslatableItem::set_original_locale() so that 2006-02-08 Murray Cumming * glom/document/document_glom.cc: Constructor: Call TranslatableItem::set_original_locale() so that TranslatableItem::set_title() does the right thing as early as possible. This means that the automatically-generated table titles will be visible when loading the document. 2006-02-08 Murray Cumming Optimize the operator==() implementations, fixing Field::operator==() 2006-02-08 Murray Cumming * glom/data_structure/field.cc: * glom/data_structure/groupinfo.cc: * glom/data_structure/numeric_format.cc: * glom/data_structure/privileges.cc: * glom/data_structure/relationship.cc: * glom/data_structure/translatable_item.cc: Optimize the operator==() implementations, fixing Field::operator==() along the way, so that entered field titles when in non-original locales are used as translations for that locale. * glom/translation/combobox_locale.cc: Constructor: Hide the locale IDs because they are not human-readable. 2006-02-08 Murray Cumming Added get_locale_name(), moving some of get_list_of_locales() into it. 2006-02-08 Murray Cumming * glom/data_structure/iso_codes.cc: * glom/data_structure/iso_codes.h: Added get_locale_name(), moving some of get_list_of_locales() into it. * glom/data_structure/translatable_item.cc: get_title(): If there is no translation then use the first translation with the same language (ignoring the country). * glom/translation/window_translations.cc: load_from_document(): Use get_locale_name() to show the (believed) locale of the original strings. * glom/utils.cc: * glom/utils.h: Added locale_language_id() so we can reuse the code. 2006-02-08 Murray Cumming Put all field names in quotes too, to avoid crashes when using uppercase 2006-02-08 Murray Cumming * glom/base_db.cc: * glom/dialog_database_preferences.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/python_embed/python_module/py_glom_relatedrecord.cc: * glom/utils.cc: Put all field names in quotes too, to avoid crashes when using uppercase characters in field names. 2006-02-08 Murray Cumming Put all table names in quotes in SQL statements, to avoid errors/crashes 2006-02-08 Murray Cumming * glom/base_db.cc: * glom/connectionpool.cc: * glom/dialog_database_preferences.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/navigation/box_tables.cc: * glom/python_embed/python_module/py_glom_relatedrecord.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utils.cc: Put all table names in quotes in SQL statements, to avoid errors/crashes when using non-lowercase table names, and SQL keywords as table names. 2006-02-08 Murray Cumming get_list_of_locales(): Instead of just listing languages, get the full 2006-02-08 Murray Cumming * glom/data_structure/iso_codes.cc: get_list_of_locales(): Instead of just listing languages, get the full list of locale IDs from /usr/share/i18n/locales/ (hopefully this works everywhere. If not, let's have some configure.in stuff), and build the locale name from the language part and country part. So it now also parses iso_3166.xml from iso-codes to get translated country names. * glom/utils.cc: * glom/utils.h: Added locale_simplify() so we can ignore weird parts of locale IDs. * glom/data_structure/translatable_item.cc: get_current_locale(): Return a locale instead of just a language. * glom/translation/combobox_locale.cc: Try (unsuccessfully) to align the second column. Sort it by name. * glom/translation/window_translations.cc: load_from_document(): Prevent a crash when the document is 0. 2006-02-07 Murray Cumming Use string_escape_underscores when building the reports and tables menus. 2006-02-07 Murray Cumming * glom/application.cc: Use string_escape_underscores when building the reports and tables menus. * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/adddel/adddel.h: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utils.cc: * glom/utils.h: Move string_escape_underscores() to here. 2006-02-01 Clytie Siddall ---------------------------------------------------------------------- * configure.in Added vi in ALL_LINGUAS line. CVS: ---------------------------------------------------------------------- 2006-02-01 Clytie Siddall vi.po: Updated Vietnamese translation. 2006-02-01 Adam Weinberger Updated Canadian English translation. 2006-01-31 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2006-01-27 Francisco Javier F. Serrador Updated Spanish translation. 2006-01-27 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-01-27 Murray Cumming Add German translations. Avoid a null-sharedptr crash when doing a Save As 2006-01-27 Murray Cumming * examples/example_smallbusiness.glom: Add German translations. * glom/navigation/box_tables.cc: Avoid a null-sharedptr crash when doing a Save As Example. 2006-01-27 Murray Cumming Use LayoutItems via sharedptr so we can translate the titles of groups, 2006-01-27 Murray Cumming * Many: Use LayoutItems via sharedptr so we can translate the titles of groups, portals, and report parts. LayoutItems are now created during document loading, and by layout editing dialogs, but then just shared by the various widgets. This means that we no longer need to rebuild the whole layout from the widgets when a widget is changed - it is just shared, so we just mark the document as modified. 2006-01-26 Murray Cumming Use relationship via sharedptr so we can translate its title too. Derive 2006-01-26 Murray Cumming * Many: Use relationship via sharedptr so we can translate its title too. Derive LayoutItem_Field, LayoutItem_Portal, LayoutItem_Group, FieldFormatting from new UsesRelationship class to simplify the code. 2006-01-26 Adam Weinberger Updated Canadian English translation. 2006-01-26 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2006-01-25 Murray Cumming Reuse the Translations window, so it shows the last-used locale when shown 2006-01-25 Murray Cumming * glom/application.cc: Reuse the Translations window, so it shows the last-used locale when shown again. 2006-01-25 Murray Cumming Use Report via sharedptr<> so that Report title translations are used. 2006-01-25 Murray Cumming * glom/application.cc: * glom/base_db.cc: * glom/base_db.h: * glom/box_reports.cc: * glom/box_reports.h: * glom/dialog_layout_report.cc: * glom/dialog_layout_report.h: * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/frame_glom.cc: * glom/mode_data/box_data_list.cc: * glom/translation/window_translations.cc: Use Report via sharedptr<> so that Report title translations are used. 2006-01-25 Murray Cumming Use TableInfo via sharedptr<> so that Table title translations are used. 2006-01-25 Murray Cumming * glom/application.cc: * glom/base_db.cc: * glom/base_db.h: * glom/dialog_database_preferences.cc: * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/glom.glade: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/navigation/box_tables.cc: * glom/navigation/box_tables.h: * glom/relationships_overview/relationships_canvas.cc: * glom/relationships_overview/table_canvasitem.cc: * glom/relationships_overview/table_canvasitem.h: * glom/translation/window_translations.cc: Use TableInfo via sharedptr<> so that Table title translations are used. 2006-01-25 Murray Cumming Copy m_title (the original) in copy constructor and operator=(). This 2006-01-24 Murray Cumming * glom/data_structure/translatable_item.h: Copy m_title (the original) in copy constructor and operator=(). This makes the table titles show up again and be saved. * glom/document/document_glom.cc: * glom/document/document_glom.h: Save/load titles in load_after_translations() and save_before_translations() instead of separately. * glom/sharedptr.h: Added cast_dynamic<>, cast_static<>, and cast_const<>, based on RefPtr. * glom/glom.glade: * glom/translation/Makefile.am: * glom/translation/combobox_locale.cc: * glom/translation/combobox_locale.h: Added set_locale(). * glom/application.cc: * glom/application.h: * glom/translation/dialog_change_language.cc: * glom/translation/dialog_change_language.h: New dialog used to choose a language to test temporarily. * po/POTFILES.in: Added dialog_change_language.cc. 2006-01-24 Murray Cumming Added a new base class for all items that have a non-translated ID name 2006-01-24 Murray Cumming * glom/data_structure/translatable_item.cc: * glom/data_structure/translatable_item.h: Added a new base class for all items that have a non-translated ID name and a translated title. This base class has a map of translated titles for locales. * glom/document/document_glom.cc: * glom/document/document_glom.h: Added load_after_translations() and save_before_translations() and used it for fields, reports, tables, and layout items, so these XML nodes get a translations node if they have any translations. * glom/application.cc: * glom/base_db.cc: * glom/box_reports.cc: * glom/data_structure/Makefile.am: * glom/data_structure/field.cc: * glom/data_structure/field.h: * glom/data_structure/groupinfo.cc: * glom/data_structure/groupinfo.h: * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: * glom/data_structure/layout/layoutitem.cc: * glom/data_structure/layout/layoutitem.h: * glom/data_structure/relationship.cc: * glom/data_structure/relationship.h: * glom/data_structure/report.cc: * glom/data_structure/report.h: * glom/data_structure/tableinfo.cc: * glom/data_structure/tableinfo.h: * glom/dialog_database_preferences.cc: * glom/dialog_layout_report.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/navigation/box_tables.cc: * glom/utility_widgets/flowtablewithfields.cc: Use the base class API, removing superfluous API. * glom/translation/window_translations.cc: * glom/translation/window_translations.h: Store sharedptr in the tree model. * po/POTFILES.in: Added the new files. 2006-01-23 Francisco Javier F. Serrador Updated Spanish translation. 2006-01-23 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-01-23 Murray Cumming Just store a const reference (sharedptr) to the Field, instead of copying 2006-01-23 Murray Cumming * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Just store a const reference (sharedptr) to the Field, instead of copying it. 2006-01-23 Murray Cumming Remove set_full_field_data_empty(). Instead, allow the field cache to be 2006-01-23 Murray Cumming * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Remove set_full_field_data_empty(). Instead, allow the field cache to be null and use m_name when there is no full data. Use a bool to mark when the cache is up-to-date, and do no try to use it when it is not up-to-date. * glom/mode_data/dialog_layout_details.cc: * glom/utils.cc: build_sql_select_with_where_clause(): Cope with fields with no names, in case that happens. * glom/document/document_glom.cc: * glom/document/document_glom.h: load_after_layout_item_field() and load_after_layout_item_field_formatting(): These functions now take the field type, and the table name that can be used to discover the field type if necessary. This is necessary in order to interperet default values and choices. 2006-01-23 Murray Cumming on_adddel_add(): Call on_adddel_changed() to save the guessed title into 2006-01-23 Murray Cumming * glom/mode_design/fields/box_db_table_definition.cc: on_adddel_add(): Call on_adddel_changed() to save the guessed title into the document, even when the title is not edited by the user. 2006-01-23 Murray Cumming Use Field via sharedptr, to avoid unnecessary copying. However, 2006-01-23 Murray Cumming * Many files: Use Field via sharedptr, to avoid unnecessary copying. However, LayoutItem_Field still copies it for now, to avoid conflicts. * glom/sharedptr.h: Various improvements, particularly to the nonconst->const cast, based on Glib::RefPtr. 2006-01-21 Murray Cumming Mention the desktop file. 2006-01-21 Murray Cumming * po/POTFILES.in: Mention the desktop file. 2006-01-21 Murray Cumming Removed Added .in.in file instead, based on the same thing in 2006-01-21 Murray Cumming * configure.in: * glom.desktop: Removed * glom.desktop.in.in: Added .in.in file instead, based on the same thing in gnome-terminal, so that intltool can translate strings prefixed by underscores (_Name and _Comment), and so that configure.in can substitute the VERSION for bug-buddy. * glom.png: * Makefile.am: Actually install the application icon, and correct the install location for the .desktop file. 2006-01-21 Murray Cumming Removed .applications file because it is apparently the old way, for 2006-01-21 Murray Cumming * Makefile.am: * glom.applications: Removed .applications file because it is apparently the old way, for versions of GNOME with which Glom is not likely to work anyway. 2006-01-20 Murray Cumming Added get_list_of_locales(). The names will be translated. 2006-01-20 Murray Cumming * glom/data_structure/iso_codes.cc: * glom/data_structure/iso_codes.h: Added get_list_of_locales(). The names will be translated. * configure.in: * glom/Makefile.am: * glom/application.cc: * glom/application.h: * glom/data_structure/field.h: * glom/data_structure/tableinfo.h: * glom/document/document_glom.cc: * glom/glom.glade: * glom/translation/Makefile.am: * glom/translation/combobox_locale.cc: * glom/translation/combobox_locale.h: * glom/translation/window_translations.cc: * glom/translation/window_translations.h: The beginnings of some UI to allow translation of field titles, table titles, etc. Not yet available via menus. 2006-01-20 Adam Weinberger Updated Canadian English translation. 2006-01-19 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2006-01-18 Murray Cumming Increase version. 2006-01-18 Murray Cumming Use smaller image. 2006-01-18 Murray Cumming Correct my web site address in the example and screenshot. 2006-01-18 Murray Cumming Updated. Added more example data, and added a Position field to the Staff 2006-01-18 Murray Cumming * docs/website/screenshots/glom_data_details.png: * docs/website/screenshots/glom_data_details_related.png: * docs/website/screenshots/glom_data_list.png: Updated. * examples/example_smallbusiness.glom: Added more example data, and added a Position field to the Staff table. 2006-01-18 Murray Cumming init_menu_file(): Make the Save As Example menu item only available in 2006-01-18 Murray Cumming * glom/application.cc: init_menu_file(): Make the Save As Example menu item only available in Developer mode, to avoid confusing operators. 2006-01-18 Murray Cumming Try to show a pulsing progress dialog while recreating the example 2006-01-18 Murray Cumming * glom/Makefile.am: * glom/application.cc: * glom/glom.glade: * glom/dialog_progress_creating.cc: * glom/dialog_progress_creating.h: Try to show a pulsing progress dialog while recreating the example database, but it does not show up until the end. * glom/frame_glom.cc: alert_no_table(): Correct the message. It is about a lack of tables, not of databases, and it is not an error. 2006-01-18 Murray Cumming offer_new_or_existing(): Tell the document and the connection about the 2006-01-18 Murray Cumming * glom/application.cc: offer_new_or_existing(): Tell the document and the connection about the actually-used database name. * glom/base_db.cc: add_standard_tables(): Set the title from the document, if the document already has a database title. * glom/frame_glom.h: * glom/frame_glom.cc: set_databases_selected(): Show the database title when showing a new database. create_database(): Re-connect to the new database, instead of staying in template1, before creating the glom system tables. Set the title as provided in a function parameter. 2006-01-18 Murray Cumming offer_new_or_existing(): When creating a new file, discover and use an 2006-01-18 Murray Cumming * NEWS: * glom/application.cc: offer_new_or_existing(): When creating a new file, discover and use an unused database name, based on the title. * glom/utils.cc: * glom/utils.h: Added create_name_from_title(). * glom/dialog_new_database.cc: * glom/dialog_new_database.h: * glom/glom.glade: When creating a new file/database, do not ask the user for a database name - just guess one based on the human-readable title. 2006-01-18 Adam Weinberger Updated Canadian English translation. 2006-01-17 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2006-01-17 Murray Cumming Make what() const and throw(), so that it really overrides 2006-01-17 Murray Cumming * glom/exception.[h|cc]: Make what() const and throw(), so that it really overrides std::exception::what() so we get real text in the error dialogs. * glom/frame_glom.cc: create_database(): Call add_standard_tables() and add_standard_groups() to avoid the error/crash when adding a record to a new table in a new database. 2006-01-17 Murray Cumming sql(): Move text escaping code into glom_escape_text() so it can be 2006-01-17 Murray Cumming * glom/data_structure/field.cc: sql(): Move text escaping code into glom_escape_text() so it can be reused. For IMAGE fields, assume that get_binary() is already the escaped binary format, but escape it again as text, so we get the \ needed for SQL commands. * glom/data_structure/glomconversions.cc: get_escaped_binary_data(): Use one \, not \ to separate byte numbers, because that's the format used by get/set_binary() in libgda at the moment. * glom/utility_widgets/imageglom.cc: get_value(): Use GlomConversions::get_escaped_binary_data() before set_binary() because Glom must assume elsewhere that it is escaped in all GdaValues. This workaround will all be unnecessary in libgda-2.0, which properly unescapes binary buffers. Images are now saved properly into examples, and inserted properly into the new databases that are created when examples are opened. 2006-01-17 Murray Cumming on_menupopup_activate_clear(): Emit the signal to actually update the 2006-01-17 Murray Cumming * glom/utility_widgets/imageglom.cc: on_menupopup_activate_clear(): Emit the signal to actually update the database. on_menupopup_activate_paste(): Prevent crash when the received pixbuf is NULL. on_menupopup_activate_copy(): Prevent crash when the pixbuf is NULL. 2006-01-17 Murray Cumming export_data_to_*(): Use specified table name, not the current table name, 2006-01-17 Murray Cumming * glom/frame_glom.cc: export_data_to_*(): Use specified table name, not the current table name, so that all tables are properly exported. * glom/base_db.[h|cc]: Add recalculate_next_auto_increment_value(), which does a SELECT MAX() on the table. * glom/application.cc: recreate_database(): Recalculate next auto-increment values, and create glom system tables and groups before adding data. 2006-01-16 Murray Cumming on_menu_file_save_as_example(): Put the example data in a string instead 2006-01-16 Murray Cumming * glom/frame_glom.cc: * glom/frame_glom.h: * glom/application.cc: on_menu_file_save_as_example(): Put the example data in a string instead of a stringstream, because it was somehow truncating the data. * glom/base_db.cc: insert_example_data(): Really return true for success. 2006-01-16 Murray Cumming When opening example documents, always save a copy and always create a 2006-01-16 Murray Cumming * glom/application.cc: * glom/dialog_connection.cc: * glom/dialog_connection.h: * glom/document/document_glom.cc: * glom/frame_glom.cc: * glom/frame_glom.h: When opening example documents, always save a copy and always create a database, choosing a new unused database name. Mark documents explicitly as examples. * glom/glom.glade: Rename Open Example button to New From Example. 2006-01-16 Adam Weinberger Added missing file. Updated Canadian English translation. 2006-01-15 Adam Weinberger * POTFILES.in: Added missing file. * en_CA.po: Updated Canadian English translation. 2006-01-15 Murray Cumming Added half-working File / Save As Example menu item, which stores the data 2006-01-15 Murray Cumming * glom/application.cc: * glom/application.h: * glom/base_db.cc: * glom/base_db.h: * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/frame_glom.cc: * glom/frame_glom.h: Added half-working File / Save As Example menu item, which stores the data in the .glom file, for use when creating the database from an example. 2006-01-15 Murray Cumming Remove formatting button, so we _always_ export in iso format. 2006-01-15 Murray Cumming * glom/mode_data/dialog_layout.cc: * glom/mode_data/dialog_layout_export.cc: * glom/mode_data/dialog_layout_export.h: * glom/glom.glade: Remove formatting button, so we _always_ export in iso format. * glom/filechooser_export.cc: * glom/filechooser_export.h: The Define Data Format button now works, though it opens in the background. It now exports only the requested fields. 2006-01-14 Francisco Javier F. Serrador Updated Spanish translation. 2006-01-14 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2006-01-14 Murray Cumming Add a File/Export menu item, for exporting the found set as 2006-01-14 Murray Cumming * glom/frame_glom.cc: * glom/frame_glom.h: Add a File/Export menu item, for exporting the found set as comma-separated text. * glom/base_db.cc: * glom/base_db.h: * glom/box_db_table.cc: * glom/box_db_table.h: * glom/data_structure/glomconversions.cc: * glom/data_structure/layout/layoutitem_field.h: * glom/filechooser_export.cc: * glom/filechooser_export.h: * glom/mode_data/Makefile.am: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: * glom/base_db.cc: * glom/base_db.h:Moved various folders into Base_DB so that Frame_Glom can use them. * glom/Makefile.am: * glom/mode_data/dialog_layout_export.cc: * glom/mode_data/dialog_layout_export.h: New layout UI for export field sequences, not yet finished or used. 2006-01-13 Murray Cumming Move get_find_where_clause_quick() from Frame_Glom to Base_DB so we can 2006-01-13 Murray Cumming * glom/frame_glom.cc: * glom/frame_glom.h: * glom/base_db.cc: * glom/base_db.h: Move get_find_where_clause_quick() from Frame_Glom to Base_DB so we can use it in Dialog_ChooseID. * glom/glom.glade: * glom/utility_widgets/dialog_choose_id.cc: * glom/utility_widgets/dialog_choose_id.h: Add the Quick Find feature to this dialog too. 2006-01-13 Murray Cumming Contacts: Add the web site field to the layout, and change it to text. 2006-01-13 Murray Cumming * examples/example_smallbusiness.glom: Contacts: Add the web site field to the layout, and change it to text. * glom/mode_data/dialog_layout_details.cc: enable_buttons(): Properly enable/disable Up and Down for the first and last _child_ items. * glom/mode_data/dialog_layout_list.cc: enable_buttons(): Properly enable/disable Up and Down when adding fields. 2006-01-12 Murray Cumming Remove some debug output. 2006-01-12 Murray Cumming Define the placeholder row as the last row, whose existance we cause just 2006-01-12 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Define the placeholder row as the last row, whose existance we cause just by increasing the number of rows, so that iter_next_vfunc() gives one more row, instead of marking a boolean. This simplifies things and prevents extra placeholder rows being generated. * glom/base_db.cc: * glom/frame_glom.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: * glom/mode_data/notebook_data.cc: * glom/mode_find/box_data_list_find.cc: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/imageglom.cc: Adapt to new API. And some changes to ensure that find results are shown in the appropriate view depending on whether there are >1 records found. 2006-01-11 Adam Weinberger Updated Canadian English translation. 2006-01-11 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2006-01-11 Murray Cumming Added widgets at bottom-right to show the number of total and found 2006-01-11 Murray Cumming * glom/frame_glom.cc: * glom/frame_glom.h: * glom/glom.glade: Added widgets at bottom-right to show the number of total and found records, with a Find All button when appropriate. * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: Added get_record_counts(). * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Added get_record_counts(). 2006-01-11 Murray Cumming Connect explicitly to the activate signal of the quick find entry, instead 2006-01-11 Murray Cumming * glom/frame_glom.cc: Connect explicitly to the activate signal of the quick find entry, instead of using default widgets. 2006-01-11 Murray Cumming Add a Quick Find entry and button, only shown when in Find mode. It is 2006-01-11 Murray Cumming * glom/frame_glom.cc: * glom/frame_glom.h: * glom/glom.glade: Add a Quick Find entry and button, only shown when in Find mode. It is probably inefficient, because it just ORs over all the fields. 2006-01-10 Murray Cumming translate 2 strings to prove the concept. 2006-01-10 Murray Cumming Convert to the new gnome-doc-utils (xml2po) system, with a dummy de 2006-01-10 Murray Cumming * .cvsignore: * Makefile.am: * autogen.sh: * configure.in: * docs/user-guide/.cvsignore: * docs/user-guide/C/Makefile.am: * docs/user-guide/C/glom-C.omf: * docs/user-guide/C/glom.xml: * docs/user-guide/Makefile.am: * docs/user-guide/de/de.po: * docs/user-guide/glom-C.omf.in: * gnome-doc-utils.make: Convert to the new gnome-doc-utils (xml2po) system, with a dummy de translation, though I get warnings about the path to the images in figures. 2006-01-10 Murray Cumming Add .cvsignore 2006-01-10 Murray Cumming Increase version 2006-01-10 Murray Cumming Change all instances of can not to cannot. Bug #300139 from Adam 2006-01-10 Murray Cumming * docs/postgres_gda_test.c: (main): * glom/base_db.cc: * glom/document/document_glom.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/navigation/box_tables.cc: * glom/python_embed/python_module/pygdavalue_conversions.c: (pygda_value_from_pyobject): * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/combo_textglade.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utility_widgets/flowtablewithfields.cc: Change all instances of can not to cannot. Bug #300139 from Adam Weinberger. This may or maynot be necessary. 2006-01-10 Murray Cumming Field::sql(): Also escape ; characters, because libgda seems to cause 2006-01-10 Murray Cumming * glom/data_structure/field.cc: Field::sql(): Also escape ; characters, because libgda seems to cause postgres to be confused by these. And allocate a big enough string for PQescapeString(), to avoid crashes. Now bug #323266 seems to really be fixed. * glom/utils.cc: * glom/utils.h: Added inefficient string_replace() for use by Field::sql(). 2006-01-10 Murray Cumming Field::sql(): Also escape ; characters, because libgda seems to cause 2006-01-10 Murray Cumming * glom/data_structure/field.cc: Field::sql(): Also escape ; characters, because libgda seems to cause postgres to be confused by these. And allocate a big enough string for PQescapeString(), to avoid crashes. Now bug #323266 seems to really be fixed. * glom/utils.cc: * glom/utils.h: Added inefficient string_replace() for use by Field::sql(). 2006-01-09 Murray Cumming Add IDs for sections, to make sub-menu links work. Patch from Jorge 2006-01-09 Murray Cumming * docs/user-guide/C/glom.xml: Add IDs for sections, to make sub-menu links work. Patch from Jorge Gonzalez in bug #313107. 2006-01-09 Murray Cumming Field::sql(): Use a copy of the PQescapeString() function from Posrgres, 2006-01-09 Murray Cumming * glom/data_structure/field.cc: Field::sql(): Use a copy of the PQescapeString() function from Posrgres, instead of gda_value_stringify() to really escape text for SQL. This should fix bug #323266 (crash when typing quote) from Nicolas Chevreux. 2006-01-07 Josep Puigdemont i Casamajó Updated Catalan translation. 2005-12-20 Murray Cumming Added glom/connectionpool.cc. 2005-12-20 Murray Cumming * po/POTFILES.in: Added glom/connectionpool.cc. 2005-10-29 Francisco Javier F. Serrador Updated Spanish translation. 2005-10-29 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2005-09-04 Josep Puigdemont i Casamajó Added Catalan translation. 2005-08-24 Pawan Chitrakar Added Nepali Translation 2005-08-17 Murray Cumming Removed new es SUBDIR because it does not have a Makefile.am and that 2005-08-17 Murray Cumming * docs/user-guide/Makefile.am: Removed new es SUBDIR because it does not have a Makefile.am and that breaks the build. This might need changing to the new gnome-doc-utils system anyway. 2005-08-16 Francisco Javier F. Serrador Added Spanish documentation. 2005-08-16 Francisco Javier F. Serrador * es.po: Added Spanish documentation. 2005-08-16 Murray Cumming Added glomconversions.cc, because it now contains translatable strings. 2005-08-16 Murray Cumming * po/POTFILES.in: Added glomconversions.cc, because it now contains translatable strings. 2005-08-09 Hendrik Brandt Updated German translation. 2005-08-09 Hendrik Brandt * de.po: Updated German translation. 2005-08-05 Miloslav Trmac Updated Czech translation. 2005-08-05 Miloslav Trmac * cs.po: Updated Czech translation. 2005-08-04 Francisco Javier F. Serrador Updated Spanish translation. 2005-08-04 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2005-08-02 Murray Cumming Removed some debug output 2005-08-02 Murray Cumming connect(): Reimplement with get_and_connect(). handle_error(): Reimplement 2005-08-02 Murray Cumming * glom/base_db.cc: * glom/base_db.h: connect(): Reimplement with get_and_connect(). handle_error(): Reimplement with ConnectionPool::handle_error(). * glom/connectionpool.cc: * glom/connectionpool.h: Added get_and_connect(). Added handle_error(). * glom/frame_glom.cc: Frame_Glom::create_database(): Do not show the error dialog here because it is already shown by the calling function in application.cc. * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/python_embed/python_module/py_glom_relatedrecord.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Call handle_error() to show a dialog when there is a database error. 2005-08-02 Murray Cumming call get_errors() when database creation fails, so we know why. 2005-08-02 Murray Cumming * docs/postgres_gda_test.c: (main): call get_errors() when database creation fails, so we know why. 2005-08-02 Murray Cumming Try to create a database, because that seems to fail sometimes, possibly 2005-08-02 Murray Cumming * docs/postgres_gda_test.c: (main): Try to create a database, because that seems to fail sometimes, possibly depending on the type of authentication used, and possibly not failing in the psql command-line tool. 2005-07-30 Adam Weinberger Added missing file. Updated Canadian English translation. 2005-07-30 Adam Weinberger * POTFILES.in: Added missing file. * en_CA.po: Updated Canadian English translation. 2005-07-30 Adam Weinberger Updated Canadian English translation. 2005-07-30 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-07-30 Daniel Holbach Changed the gnome_program_init() call again. Apparently it was crashing on 2005-07-30 Daniel Holbach * glom/main.cc: Changed the gnome_program_init() call again. Apparently it was crashing on AMD64, though we do not know why. 2005-07-29 Murray Cumming Updated NEWS 2005-07-29 Murray Cumming show_table_title(): Use pango markup to show a big title. 2005-07-29 Murray Cumming * glom/frame_glom.cc: show_table_title(): Use pango markup to show a big title. * glom/utility_widgets/imageglom.cc: on_menupopup_activate_select_file(): Give the filter a name. 2005-07-29 Murray Cumming Added show_warning_no_records_found(), using the code from 2005-07-29 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added show_warning_no_records_found(), using the code from Frame_Glom::on_notebook_find_criteria(), so it can be reused. * glom/frame_glom.cc: * glom/mode_data/box_data.cc: on_Button_Find(): Warn the user if they have not entered any criteria. * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_details_find.h: Override on_flowtable_field_edited(), to stop it adding new records during finds. * glom/utility_widgets/dialog_choose_id.cc: on_box_find_criteria(): show a warning if no records were found. 2005-07-29 Murray Cumming on_flowtable_field_edited(): Really add a new record when entering data on 2005-07-29 Murray Cumming * glom/mode_data/box_data_details.cc: on_flowtable_field_edited(): Really add a new record when entering data on a blank record. 2005-07-29 Murray Cumming Added confirm_delete_record() based on the code in box_data_list.cc 2005-07-29 Murray Cumming * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: Added confirm_delete_record() based on the code in box_data_list.cc * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: on_button_del(): Use confirm_delete_record(), already used in list view. fill_from_database(): When no primary key value is specified, fill the fields with empty values, instead of preserving whatever was there last time. * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: Use confirm_delete_record() in the base class instead of the existing code. 2005-07-29 Murray Cumming Removed unimplemented get_editable_and_allowed() function. 2005-07-29 Murray Cumming * glom/data_structure/layout/fieldformatting.h: Removed unimplemented get_editable_and_allowed() function. * glom/mode_data/dialog_layout_details.cc: on_button_field_formatting(): get/set the editableness from the specific column, not from the formatting column, so we actually save the change. 2005-07-29 Murray Cumming Added get/set_layout_current() and get/set_layout_record_viewed() for 2005-07-29 Murray Cumming * glom/document/document_glom.cc: * glom/document/document_glom.h: Added get/set_layout_current() and get/set_layout_record_viewed() for remembering (not saving in the document) information about the last-viewed records and layouts. * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: Added get_layout_name(). * glom/mode_data/box_data_details.cc: fill_from_database(): Remember the record. * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: Override on_switch_page_handler() so we can remember the last-viewed layout. init_db_details(): Open the last-viewed record and switch to the last-viewed layout. * glom/notebook_glom.h: Make on_switch_page_handler() virtual. 2005-07-29 Murray Cumming Removed some debug output 2005-07-29 Adam Weinberger Updated Canadian English translation. 2005-07-29 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-07-28 Murray Cumming Added get_primary_key_value_first() init_db_details(): Show the first 2005-07-28 Murray Cumming * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: Added get_primary_key_value_first() * glom/mode_data/notebook_data.cc: init_db_details(): Show the first record from the list in the detauls. * glom/notebook_glom.cc: on_switch_page_handler(): Do not call load_from_document() on the child page. It is superfluous. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: get_key_value(): Retrieve the data from the database if necessary. Previously we always called get_value() first. 2005-07-28 Murray Cumming Added sql_find(), like sql(), but with wildcards. Added a dialog for 2005-07-28 Murray Cumming * glom/data_structure/field.cc: * glom/data_structure/field.h: Added sql_find(), like sql(), but with wildcards. * glom/glom.glade: Added a dialog for finding an ID. * glom/utility_widgets/Makefile.am: * glom/utility_widgets/dialog_choose_id.cc: * glom/utility_widgets/dialog_choose_id.h: Added dialog. * glom/mode_data/box_data.cc: get_find_where_clause(): Use sql_find() to do a substring search. * po/POTFILES.in: Added the new .cc file. * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: Added set_read_only() to prevent editing when the list is only for selection. Added set_open_button_title() which delegates to the DbAddDel. * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_details_find.h: * glom/mode_find/notebook_find.cc: Override init_db_details(), without a primary key parameter. * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: Added offer_related_record_id_find() and a Find button next to fields used in relationships. This opens a secondary dialog with the Find UI. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Added set_open_button_title() so we can use Select instead of Open in the Find ID dialog. * glom/utility_widgets/db_adddel/db_adddel_withbuttons.cc: * glom/utility_widgets/db_adddel/db_adddel_withbuttons.h: Override set_allow_view_details() to show/hide the open button. 2005-07-27 Murray Cumming Added missing files 2005-07-27 Murray Cumming Added missing files 2005-07-26 Murray Cumming Attempt to fix libtool problem by changin PKG_CONFIG_CHECK order 2005-07-26 Murray Cumming Increased version 2005-07-26 Murray Cumming Updated some screenshots 2005-07-26 Murray Cumming Updated some screenshots 2005-07-26 Murray Cumming fill_layout_field_details(): Handle portals, so we do not lose field 2005-07-26 Murray Cumming * glom/document/document_glom.cc: fill_layout_field_details(): Handle portals, so we do not lose field information for portals when editing the whole layout. * glom/mode_data/box_data_list_related.cc: * glom/mode_data/dialog_layout_details.cc: Dialog_Layout_Details::fill_group(): Handle portals. * glom/utility_widgets/flowtablewithfields.cc: 2005-07-25 Murray Cumming Depend on latest libgdamm. 2005-07-25 Murray Cumming * configure.in: Depend on latest libgdamm. * glom/utility_widgets/imageglom.cc: * glom/data_structure/field.cc: Change for latest libgdamm API change. * glom/document/document_glom.cc: * glom/document/document_glom.h: Remove unused set_relationship_data_layout_groups(). * glom/mode_data/box_data_details.cc: on_flowtable_layout_changed(): Actually save the new layout in the document. For instance, really save portal layout changes. 2005-07-25 Murray Cumming signal_clicked(): Add path parameter, so we know what row was clicked. 2005-07-25 Murray Cumming * glom/utility_widgets/db_adddel/cellrenderer_button.cc: * glom/utility_widgets/db_adddel/cellrenderer_button.h: signal_clicked(): Add path parameter, so we know what row was clicked. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Open the clicked row, not just the selected row. * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: Add an Open button next to foreign keys, when a unique non-hidden record is indicated. 2005-07-22 Murray Cumming Added virtual enable_buttons(), and moved some code there to stop the base 2005-07-22 Murray Cumming * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: Added virtual enable_buttons(), and moved some code there to stop the base class from making the Open button visible again for hidden-table related records. * glom/utility_widgets/db_adddel/db_adddel_withbuttons.cc: * glom/utility_widgets/db_adddel/db_adddel_withbuttons.h: Added a show_all_vfunc() implementation in case a show_all() would show the hidden buttons. 2005-07-22 Murray Cumming Constructor: Use the OPEN stock item instead of EDIT for viewing details. 2005-07-22 Murray Cumming * glom/utility_widgets/db_adddel/cellrenderer_button.cc: Constructor: Use the OPEN stock item instead of EDIT for viewing details. Set mode to activatable so it actually responds to clicks. 2005-07-22 Murray Cumming Call DbAddDel::set_allow_view_details() so we get the open button and the 2005-07-22 Murray Cumming * glom/mode_data/box_data_list.cc: Call DbAddDel::set_allow_view_details() so we get the open button and the row open button. * glom/mode_data/box_data_list_related.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Change *use_row_button to *allow_view_details. on_button_press_event_Popup(): Do not handle double-click on the row to open the details, because it is too easy to double-click when single-clicking to edit a cell. * glom/utility_widgets/db_adddel/db_adddel_withbuttons.cc: setup_buttons(): Just hide the buttons when necessary, instead of adding and removing them. 2005-07-21 Murray Cumming Added get_table_is_hidden(). 2005-07-22 Murray Cumming * glom/document/document_glom.cc: * glom/document/document_glom.h: Added get_table_is_hidden(). * glom/frame_glom.cc: * glom/frame_glom.h: Handle signal_record_details_requested on the Notebook_Data, to show a specific record in another table. * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: Added signal_requested_related_details, emitted when a FlowTable emits its own signal_requested_related_details. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Added set_use_row_button(). * glom/mode_data/box_data_list_related.cc: init_db_details(): If the related table is not hidden, then add a button on each row, to navigate to the related record. * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: Catch the signal from Box_Data_Details, and emit signal_details_requested signal_record_details_requested. Added show_details(), so the parent Frame can specify a record. * glom/utility_widgets/db_adddel/Makefile.am: * glom/utility_widgets/db_adddel/cellrenderer_button.cc: * glom/utility_widgets/db_adddel/cellrenderer_button.h: New derived CellRenderer, which is just an icon at the moment. * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: Added signal_requested_related_details. 2005-07-21 Francisco Javier F. Serrador Updated Spanish translation. 2005-07-21 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2005-07-21 Murray Cumming Increased version 2005-07-21 Murray Cumming Added some contacts fields 2005-07-21 Murray Cumming Added change_field_name() and change_relationship_name(), to update 2005-07-21 Murray Cumming * glom/data_structure/layout/fieldformatting.cc: * glom/data_structure/layout/fieldformatting.h: Added change_field_name() and change_relationship_name(), to update choices when these change. * glom/data_structure/layout/layoutgroup.cc: Update field formatting too. * glom/document/document_glom.cc: change_relationship_name(), change_field_name(): Update all the default formatting too. * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: on_adddel_user_requested_add(): Do not try to add related records to portals that have no columns, avoiding a database error. 2005-07-21 Murray Cumming Inherit from LayoutGroup instead of LayoutItem, so we can store the 2005-07-21 Murray Cumming * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: * glom/data_structure/layout/layoutitem_portal.cc: * glom/data_structure/layout/layoutitem_portal.h: Inherit from LayoutGroup instead of LayoutItem, so we can store the related records layout inside it, instead of in a separate hacked-up layout node in the document. * glom/document/document_glom.cc: * glom/document/document_glom.h: Save LayoutItem_Portal layout groups. * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: * glom/mode_data/treestore_layout.h: * glom/utility_widgets/flowtablewithfields.cc: Pass the whole LayoutItem_Portal around instead of just the relationship name, and don't try to store the portal layout separately in the document. 2005-07-21 Murray Cumming Added change_relationship_name() to update the layout when a relationship 2005-07-21 Murray Cumming * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: Added change_relationship_name() to update the layout when a relationship is renamed. * glom/document/document_glom.cc: * glom/document/document_glom.h: Added change_relationship_name(). * glom/mode_design/box_db_table_relationships.cc: save_to_document(): Detect a rename and call Document_Glom::change_relationship_name() so it does not break the layout. 2005-07-20 Murray Cumming Added change_related_field_item_name(). change_field_item_name(): Process 2005-07-21 Murray Cumming * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: Added change_related_field_item_name(). change_field_item_name(): Process child groups and self-related fields. * glom/document/document_glom.cc: change_field_name(): Process all tables, to change related fields in layouts and reports. 2005-07-20 Murray Cumming Constructor: The list is now sorted alphabetically. 2005-07-20 Murray Cumming * glom/mode_data/dialog_choose_field.cc: Constructor: The list is now sorted alphabetically. * glom/utils.cc: build_sql_select_with_where_clause(): Prefix aliases with relationship_ to avoid conflicts with table names. 2005-07-20 Murray Cumming Base_DB::set_database_preferences(): Save the title into the document as 2005-07-20 Murray Cumming * glom/base_db.cc: Base_DB::set_database_preferences(): Save the title into the document as well as the database, for the window title, and for database recreation. 2005-07-20 Murray Cumming Added get/set_allow_edit() get_editable_and_allowed(): Also check the 2005-07-20 Murray Cumming * glom/data_structure/relationship.cc: * glom/data_structure/relationship.h: Added get/set_allow_edit() * glom/data_structure/layout/layoutitem_field.cc: get_editable_and_allowed(): Also check the relationship, if any. * glom/document/document_glom.cc: Load/Save the allow_edit of the relationship. * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/box_db_table_relationships.h: Add a column for allow_edit, so relationships can prevent editing of related fields. 2005-07-20 Murray Cumming fill_layout_field_details(): Get field details from the appropriate table, 2005-07-20 Murray Cumming * glom/document/document_glom.cc: fill_layout_field_details(): Get field details from the appropriate table, even if it is a related field. This stops us losing related fields on layouts. 2005-07-19 Murray Cumming * glom/utils.cc: build_sql_select(): Use AS to create an alias name for the related table, so we can use two relationships to the same table. 2005-07-19 Murray Cumming build_sql_select(): Use AS to create an alias name for the related table, 2005-07-19 Murray Cumming * glom/utils.cc: build_sql_select(): Use AS to create an alias name for the related table, so we can use two relationships to the same table. 2005-07-18 Adam Weinberger Updated Canadian English translation. 2005-07-18 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-07-18 Murray Cumming Increased version 2005-07-18 Adam Weinberger Updated Canadian English translation. 2005-07-18 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-07-17 Murray Cumming Add a suitable capitalized title when adding a relationship name. 2005-07-17 Murray Cumming * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/box_db_table_relationships.h: Add a suitable capitalized title when adding a relationship name. 2005-07-17 Murray Cumming get_data_layout_groups_plus_new_fields(): Create a more useful default 2005-07-17 Murray Cumming * glom/document/document_glom.cc: get_data_layout_groups_plus_new_fields(): Create a more useful default details layout, with overview and details sections. * glom/utility_widgets/flowtable.cc: get_minimum_column_height(): Change a < to <= so we check all widgets, so that multi-column FlowTables work when they have only one item. 2005-07-17 Murray Cumming add_item(): Return a pointer to the added item. on_adddel_Add(): Add a 2005-07-17 Murray Cumming * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: add_item(): Return a pointer to the added item. * glom/navigation/box_tables.cc: on_adddel_Add(): Add a description and comments field as well as an ID field when creating new tables. 2005-07-17 Murray Cumming Prevent items from being dragged directly under themselves, preventing a 2005-07-17 Murray Cumming * glom/mode_data/treestore_layout.cc: Prevent items from being dragged directly under themselves, preventing a crash. 2005-07-16 Murray Cumming get_suitable_width() constructor: Give images the same width as text 2005-07-16 Murray Cumming * glom/mode_data/box_data_details.cc: get_suitable_width() * glom/utility_widgets/datawidget.cc: constructor: Give images the same width as text fields, with an equal height, so they line up more, though this might be too big. 2005-07-16 Murray Cumming Do not crash when reading bad image data from the database. 2005-07-16 Murray Cumming * glom/utility_widgets/imageglom.cc: Do not crash when reading bad image data from the database. 2005-07-15 Murray Cumming 0.8.34: 2005-07-15 Murray Cumming * examples/example_smallbusiness.cc: Contacts table: Made the ID autoincrement again and added choice for Title. This got lost somehow. Changed database name again to avoid clash with already- created examples. * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Added a Clear context menu item. 2005-07-15 Murray Cumming Comment out the debug query output on stdout, because it slows us down 2005-07-15 Murray Cumming * glom/base_db.cc: Comment out the debug query output on stdout, because it slows us down when we use lots of image data. * glom/data_structure/glomconversions.cc: Tried to use PQescapeBytea() instead of my custom (slow) encoding code, without success, so left that code commented-out. * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Implemented copy/paste. 2005-07-15 Murray Cumming Removed some debug warnings 2005-07-14 Murray Cumming Updated screenshot 2005-07-14 Miloslav Trmac Updated Czech translation. 2005-07-14 Miloslav Trmac * cs.po: Updated Czech translation. 2005-07-14 Murray Cumming on_flowtable_field_edited(): Special case to avoid calling set_value() 2005-07-14 Murray Cumming * glom/mode_data/box_data_details.cc:on_flowtable_field_edited(): Special case to avoid calling set_value() with a _correct_ GdaValue, because we expect the current broken binary GdaValue. * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Images show up again after loading, and after retrieval from database. Nifty. 2005-07-14 Murray Cumming Put the Gtk::Image in a Gtk::Frame so we can see it when it is empty. 2005-07-14 Murray Cumming * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Put the Gtk::Image in a Gtk::Frame so we can see it when it is empty. Added a context menu for user mode, and restricted the file chooser to pixbuf types. 2005-07-14 Murray Cumming sql(): Handle TYPE_IMAGE fields. 2005-07-14 Murray Cumming * glom/data_structure/field.cc: sql(): Handle TYPE_IMAGE fields. * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: Add get_escaped_binary_data() and parse_escaped_binary_data(), using a a copy of the PQunescapeBytea() function from Postgres, because gda_value_get_binary() does not unescape the data yet. * glom/utility_widgets/datawidget.cc: Connect to the LayoutWidgetField signals for the ImageGlom widget. * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: set_value(): Use our copy of PQunescapeBytea(). * glom/utility_widgets/layoutwidgetfield.cc: * glom/utility_widgets/layoutwidgetfield.h: Added get_has_original_data() for later optimisation. 2005-07-12 Murray Cumming Document the IMAGE type as always being stored as PNG. 2005-07-12 Murray Cumming * glom/data_structure/field.h: Document the IMAGE type as always being stored as PNG. * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Implement set_value(), though I'm still not sure how to get/set it in SQL. 2005-07-12 Murray Cumming Scale images down to fit the allocated size of the Image widget. 2005-07-12 Murray Cumming * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Scale images down to fit the allocated size of the Image widget. 2005-07-12 Murray Cumming Use a derived Image widget so we can catch button_press_events on it. 2005-07-12 Murray Cumming * glom/utility_widgets/Makefile.am: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/imageglom.cc: * glom/utility_widgets/imageglom.h: Use a derived Image widget so we can catch button_press_events on it. 2005-07-12 Murray Cumming - Added map of possible field conversions, and get_conversion_possible(). 2005-07-12 Murray Cumming * glom/data_structure/field.cc: * glom/data_structure/field.h: - Added map of possible field conversions, and get_conversion_possible(). - Added TYPE_IMAGE, which maps to bytea in SQL and Gnome::Gda::Value::TYPE_BINARY. * glom/mode_design/fields/box_db_table_definition.cc: Don't cast the data if it is not possible. * glom/utility_widgets/datawidget.cc: Constructor: Create a Gtk::Image widget for image fields. 2005-07-11 Murray Cumming More gradual canvas stuff 2005-07-11 Daniel Holbach Pass G_PARAM_NONE to gnome_program_init() to avoid a crash at startup. 2005-07-11 Daniel Holbach * glom/main.cc: Pass G_PARAM_NONE to gnome_program_init() to avoid a crash at startup. 2005-07-10 Hendrik Brandt Updated German translation. 2005-07-10 Hendrik Brandt * de.po: Updated German translation. 2005-07-09 Murray Cumming Increased version 2005-07-09 Murray Cumming on_cell_data_name(): Allow group names to be changed. 2005-07-09 Murray Cumming * glom/mode_data/dialog_layout_details.cc: on_cell_data_name(): Allow group names to be changed. 2005-07-09 Murray Cumming get_table_names(): Added optional bool ignore_system_tables parameter 2005-07-09 Murray Cumming * glom/base_db.cc: * glom/base_db.h: get_table_names(): Added optional bool ignore_system_tables parameter * glom/mode_design/box_db_table_relationships.cc: fill_from_database(): Hide the system tables. 2005-07-09 Adam Weinberger Updated Canadian English translation. 2005-07-09 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-07-09 Murray Cumming reviewed by: 2005-07-09 Murray Cumming reviewed by: * configure.in: Depend on gnome-vfsmm 2.11, instead of just the version that bakery needs, because we need Uri::make_from_shell_arg(). * glom/navigation/box_tables.cc: load_from_document(): Really hide the glom_system_* tables. 2005-07-08 Adam Weinberger Updated Canadian English translation. 2005-07-08 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-07-08 Murray Cumming Added get_first_table(). on_dialog_tables_hide(): If the current table was 2005-07-08 Murray Cumming * glom/document/document_glom.cc: * glom/document/document_glom.h: Added get_first_table(). * glom/frame_glom.cc: on_dialog_tables_hide(): If the current table was deleted, show the default or first table. 2005-07-08 Murray Cumming Increased version 2005-07-08 Murray Cumming Really use GDate to parse dates that the C++ facet can not parse. 2005-07-08 Murray Cumming * glom/data_structure/glomconversions.cc: Really use GDate to parse dates that the C++ facet can not parse. 2005-07-08 Murray Cumming Allow the filename to be specified even without a --file option name. And 2005-07-08 Murray Cumming * glom/main.cc: Allow the filename to be specified even without a --file option name. And convert the filename to a URI so it actually works. 2005-07-08 Murray Cumming remove_table(): Prevent infinite loop. 2005-07-08 Murray Cumming * glom/document/document_glom.cc: remove_table(): Prevent infinite loop. 2005-07-08 Murray Cumming Made fill_tables_menu() public. 2005-07-08 Murray Cumming * glom/application.h: Made fill_tables_menu() public. * glom/frame_glom.cc: * glom/frame_glom.h: When the tables dialog is hidden, in developer mode, update the tables menu, in case the list has changed. 2005-07-08 Murray Cumming Some work in progress 2005-07-08 Murray Cumming Added a libgda test to test whether the installed libgda works. 2005-07-08 Murray Cumming * docs/Makefile.am: * docs/postgres_gda_test.c: Added a libgda test to test whether the installed libgda works. 2005-07-08 Murray Cumming Mention include path on Ubuntu Breezy 2005-07-04 Murray Cumming App_Glom::on_document_load(): Add a Save As button to the dialog that 2005-07-04 Murray Cumming * glom/applications.cc: App_Glom::on_document_load(): Add a Save As button to the dialog that warns when an example is read only. 2005-07-03 Adam Weinberger Updated Canadian English translation. 2005-07-03 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-07-01 Hendrik Brandt Updated German translation. 2005-07-01 Hendrik Brandt * de.po: Updated German translation. 2005-07-01 Murray Cumming Add some unfinished stuff before I wipe out my development checkouts. This shouldn't break the build. 2005-06-26 Hendrik Brandt Updated German translation. 2005-06-26 Hendrik Brandt * de.po: Updated German translation. 2005-06-16 Murray Cumming Increased version 2005-06-16 Murray Cumming Install the examples in /share/glom/doc/, which I guess is 2005-06-16 Murray Cumming * examples/Makefile.am: Install the examples in /share/glom/doc/, which I guess is correct. * glom/Makefile.am: * glom/application.cc: offer_new_or_existing(): * glom/glom.glade: Add an Open Examples button that goes straight to the installed examples. * configure.in: Depend on bakery 2.3.14, to get changed API for this. 2005-06-14 Murray Cumming moved file to wiki 2005-06-01 Hendrik Brandt Updated German translation. 2005-06-01 Hendrik Brandt * de.po: Updated German translation. 2005-05-26 Francisco Javier F. Serrador Updated Spanish translation. 2005-05-26 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2005-05-25 Murray Cumming Commented out a g_warning that was causing a compiler warning. 2005-05-25 Murray Cumming * glom/utility_widgets/flowtable.cc: Commented out a g_warning that was causing a compiler warning. 2005-05-25 Murray Cumming Make Box_Formatting a sub-view so it has access to the document, so we can 2005-05-25 Murray Cumming * glom/layout_item_dialogs/box_formatting.cc: * glom/layout_item_dialogs/dialog_field_layout.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: Make Box_Formatting a sub-view so it has access to the document, so we can use choices from related tables again. 2005-05-25 Murray Cumming Updated screenshots. 2005-05-25 Murray Cumming Updated NEWS 2005-05-25 Murray Cumming increase version 2005-05-19 Adam Weinberger Updated Canadian English translation. 2005-05-19 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-05-18 Murray Cumming set_node_attribute_value_as_bool/as_decimal(): Save lots of space by 2005-05-18 Murray Cumming * glom/document/document_glom.cc: set_node_attribute_value_as_bool/as_decimal(): Save lots of space by writing/interpreting non-existant attributes as false or zero. 2005-05-18 Murray Cumming constructor: Position the available parts hierarchically, to indicate 2005-05-18 Murray Cumming * glom/dialog_layout_report.cc: constructor: Position the available parts hierarchically, to indicate their expected relationship. 2005-05-18 Francisco Javier F. Serrador Updated Spanish translation. 2005-05-18 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2005-05-18 Murray Cumming Add default field formatting, instead of custom formatting. 2005-05-18 Murray Cumming * examples/example_smallbusiness.glom: Add default field formatting, instead of custom formatting. * glom/base_db.cc: * glom/data_structure/field.cc: * glom/data_structure/field.h: Added default_formatting. * glom/data_structure/layout/Makefile.am: * glom/data_structure/layout/fieldformatting.cc: * glom/data_structure/layout/fieldformatting.h: Added FieldFormatting to hold numeric formatting, text formatting, and the various choices. * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Replace individual formatting members with a FieldFormatting, and added boolean to specify use of the default. * glom/document/document_glom.cc: * glom/document/document_glom.h: Save/load the formatting as a whole node, and save Field default formatting. * glom/glom.glade: Move field formatting into a VBox that can be used in both the field definition dialog and the field layout dialog for custom formatting. * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/box_formatting.cc: * glom/layout_item_dialogs/box_formatting.h: Added derived VBox for the formatting. * glom/layout_item_dialogs/dialog_field_layout.cc: * glom/layout_item_dialogs/dialog_field_layout.h: Use Box_Formatting instead of the individual formatting widgets. * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: Use the appropriate formatting, using custom formatting if specified. * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/fields/dialog_fielddefinition.h: Moved Extras tab into the main tab. Added Default Formatting tab. * glom/utility_widgets/comboentryglom.cc: * glom/utility_widgets/comboglom.cc: * glom/utility_widgets/comboglomchoicesbase.cc: * glom/utility_widgets/comboglomchoicesbase.h: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/entryglom.cc: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/textviewglom.cc: * glom/utils.cc: Use the default formatting, if specified. 2005-05-17 Hendrik Brandt Updated German translation. 2005-05-17 Hendrik Brandt * de.po: Updated German translation. 2005-05-16 Murray Cumming Increased version 2005-05-16 Murray Cumming build_report(): Left align most fields and right-align numeric fields, 2005-05-16 Murray Cumming * xslt/print_report_to_html.xsl: * glom/base_db.cc: build_report(): Left align most fields and right-align numeric fields, though this is a bit of a hack. * glom/document/document_glom.cc: * glom/document/document_glom.h: load_after_layout_group(): Corrected loading of groupby secondary fields. update_cached_relationships(): Do not save the document while doing this. 2005-05-16 Murray Cumming Do not call fill_from_database() if the connection is not ready, to 2005-05-16 Murray Cumming * glom/base_db.cc: * glom/box_db_table.cc: * glom/layout_item_dialogs/dialog_group_by.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_design/fields/box_db_table_definition.cc: Do not call fill_from_database() if the connection is not ready, to prevent misleading g_warnings. 2005-05-15 Murray Cumming Added secondary_fields to the GroupBy report part, so we can show, for 2005-05-15 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/data_structure/layout/report_parts/layoutitem_groupby.cc: * glom/data_structure/layout/report_parts/layoutitem_groupby.h: * glom/document/document_glom.cc: * glom/glom.glade: * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/dialog_group_by.cc: * glom/layout_item_dialogs/dialog_group_by.h: * glom/layout_item_dialogs/dialog_groupby_secondaryfields.cc: * glom/layout_item_dialogs/dialog_groupby_secondaryfields.h: * glom/mode_data/dialog_layout.cc: * glom/utility_widgets/comboglomchoicesbase.cc: * xslt/print_report_to_html.xsl: Added secondary_fields to the GroupBy report part, so we can show, for instance, a contact name as well as the contact id that we group by. 2005-05-15 Murray Cumming Mention new files. 2005-05-15 Murray Cumming * po/POTFILES.in: Mention new files. 2005-05-15 Murray Cumming build_report_fields(): For numeric fields create a instead 2005-05-15 Murray Cumming * glom/base_db.cc: build_report_fields(): For numeric fields create a instead of node. * xslt/print_report_to_html.xsl: Handle , like , but with align=right in the HTML . Hopefully there is a better way to do this. 2005-05-14 Murray Cumming report_build_summary(): Implemented, so summary parts show up in reports. 2005-05-15 Murray Cumming * glom/base_db.cc: * glom/base_db.h: report_build_summary(): Implemented, so summary parts show up in reports. * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Added get_title_or_name(), delegating to the member Field. * glom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc: * glom/data_structure/layout/report_parts/layoutitem_fieldsummary.h: Override get_title_or_name() to mention the summary type. Added get_layout_display_name_field() to get just the field part. Corrected the copy constructor and operator== to use the summary type too. * glom/dialog_layout_report.cc: Show the field name and summary type properly. * glom/document/document_glom.cc: Save the summary type of LayoutItem_FieldSummary parts. * glom/layout_item_dialogs/dialog_field_summary.cc: * glom/utils.cc: build_sql_select_with_where_clause(): If the LayoutItem_Field is actually a LayoutItem_FieldSummary, use a summary function instead of just getting the field value. * xslt/print_report_to_html.xsl: Added a block for the summary part. 2005-05-14 Murray Cumming type_vecLayoutItems now stores sharedptrs instead of 2005-05-14 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/data_structure/field.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/dialog_layout.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_list.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: * glom/utils.cc: * glom/utils.h: type_vecLayoutItems now stores sharedptrs instead of by-value copying. This allows us to use the LayoutItem_Field polymorphically as well as improving performance. 2005-05-14 Murray Cumming Updated NEWS 2005-05-14 Murray Cumming Moved report_build_* methods from Frame_Glom to Base_DB, so they can be 2005-05-14 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/frame_glom.cc: * glom/frame_glom.h: Moved report_build_* methods from Frame_Glom to Base_DB, so they can be used in Box_Data_List. * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: Overrode print_layout() and created a non-grouping report on the fly, to implement File/Print for Lists. * xslt/print_report_to_html.xsl: Handle ungrouped_fields, a bit like group_by. 2005-05-13 Murray Cumming Add a LayoutPart for the field summary report parts. 2005-05-14 Murray Cumming * glom/data_structure/layout/report_parts/Makefile.am: * glom/data_structure/layout/report_parts/layoutitem_fieldsummary.c c: * glom/data_structure/layout/report_parts/layoutitem_fieldsummary.h : Add a LayoutPart for the field summary report parts. * glom/dialog_layout_report.cc: * glom/dialog_layout_report.h: Disable the Add button when inappropriate parts are selected. * glom/document/document_glom.cc: * glom/document/document_glom.h: Save/Load the Summary parts. * glom/glom.glade: * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/combo_summarytype.cc: * glom/layout_item_dialogs/combo_summarytype.h: * glom/layout_item_dialogs/dialog_field_summary.cc: * glom/layout_item_dialogs/dialog_field_summary.h: Added UI fo rthe summary parts. * po/POTFILES.in: Mention the new files. 2005-05-12 Murray Cumming Make large logo a bit smaller 2005-05-12 Murray Cumming Added large svg-to-png export 2005-05-12 Murray Cumming Added logo from Luca Cav 2005-05-11 Murray Cumming Use SHADOW_IN for ScrolledWindows. The HIG wants that. 2005-05-11 Murray Cumming * glom/glom.glade: * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/textviewglom.cc: Use SHADOW_IN for ScrolledWindows. The HIG wants that. 2005-05-11 Murray Cumming Increased version 2005-05-11 Murray Cumming Fixed a distcheck problem. 2005-05-11 Murray Cumming * glom/data_structure/layout/report_parts/Makefile.am: Fixed a distcheck problem. * glom/frame_glom.cc: * glom/frame_glom.h: on_menu_report_selected(): Add field headings, and recurse into sub-groupbys. * po/POTFILES.in: Updated. * xslt/print_report_to_html.xsl: Added class names for the various parts, and added a little inline css to use them. Used select with apply-templates to put sub-groupbys in the right place. 2005-05-11 Murray Cumming Updated screenshots and mentioned reports. 2005-05-11 Murray Cumming Moved get_layout_item_table_name() here from box_data. Added 2005-05-11 Murray Cumming * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/base_db.cc: * glom/base_db.h: Moved get_layout_item_table_name() here from box_data. Added fill_full_field_details(). * glom/document/document_glom.cc: update_cached_relationships(): Fill in the relationships in the report layouts too. Also call this at the start of save_before(), to ensure that relationships are always up to date. * glom/frame_glom.cc: on_menu_report_selected(): Do a GROUP BY sql SELECT and then a WHERE sql SELECT for each value, creating nodes for each value. * xslt/print_report_to_html.xsl: Show field headings, and group-by details. 2005-05-11 Murray Cumming Fix various problems with loading/saving report parts. 2005-05-11 Murray Cumming * glom/data_structure/layout/layoutgroup.cc: * glom/dialog_layout_report.cc: * glom/dialog_layout_report.h: * glom/document/document_glom.cc: * glom/frame_glom.cc: * glom/mode_data/dialog_layout.h: Fix various problems with loading/saving report parts. 2005-05-10 Murray Cumming Added offer_field_list(), moved from B 2005-05-10 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added offer_field_list(), moved from B * glom/data_structure/layout/report_parts/layoutitem_groupby.cc: * glom/data_structure/layout/report_parts/layoutitem_groupby.h: Added set_field_group_by() and set_field_sort_by(). * glom/dialog_layout_report.cc: * glom/dialog_layout_report.h: on_button_edit(): show Dialog_GroupBy to change properties. * glom/document/document_glom.cc: load_after_layout_group(), save_before_layout_group(): Handle the GroupBy part so we really save the report items. * glom/glom.glade: * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/dialog_group_by.cc: * glom/layout_item_dialogs/dialog_group_by. 2005-05-10 Murray Cumming Moved dialog_field_layout.[h|cc] from mode_data/ to the new 2005-05-10 Murray Cumming * Makefile.am: * configure.in: * glom/Makefile.am: * glom/dialog_layout_report.cc: * glom/layout_item_dialogs/Makefile.am: * glom/layout_item_dialogs/dialog_field_layout.cc: * glom/layout_item_dialogs/dialog_field_layout.h: * glom/mode_data/Makefile.am: * glom/mode_data/dialog_field_layout.cc: * glom/mode_data/dialog_field_layout.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list_related.cc: * glom/utility_widgets/datawidget.cc: Moved dialog_field_layout.[h|cc] from mode_data/ to the new layout_item_dialogs/ directory. 2005-05-10 Murray Cumming Added utils.[h|cc] with some functions from GlomConversions:: and some 2005-05-10 Murray Cumming,,, * glom/Makefile.am: * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: * glom/utils.cc: * glom/utils.h: Added utils.[h|cc] with some functions from GlomConversions:: and some from xsl stuff from Box_Data. * glom/data_structure/layout/report_parts/layoutitem_groupby.cc: * glom/data_structure/layout/report_parts/layoutitem_groupby.h: Add sort_by field. * glom/frame_glom.cc: on_menu_report_selected(): Beginnings of report generation. * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: Use functions from GlomUtils::. * xslt/Makefile.am: * xslt/print_report_to_html.xsl: Added xsl transformation for reports. 2005-05-09 Murray Cumming fill_menu_tables(), fill_menu_reports(): Use UIManager::remove_ui() to 2005-05-09 Murray Cumming * glom/application.cc: * glom/application.h: fill_menu_tables(), fill_menu_reports(): Use UIManager::remove_ui() to remove the previous tables, so we really lose removed/renamed report names. * glom/box_reports.cc: Handle, and save, title changes. * glom/data_structure/layout/report_parts/layoutitem_groupby.cc: * glom/data_structure/layout/report_parts/layoutitem_groupby.h: * glom/data_structure/layout/report_parts/layoutitem_summary.cc: * glom/data_structure/layout/report_parts/layoutitem_summary.h: Add get_layout_part_name() overrides so they show up in the list of available parts. * glom/dialog_layout_report.cc: * glom/dialog_layout_report.h: Added get_report() and get_original_name(). * glom/frame_glom.cc: * glom/frame_glom.h: Added signal_hide handlers for the report list and report layout dialogs, to rebuild the report menu and save the report details. 2005-05-09 Murray Cumming Set changes in the document. 2005-05-09 Murray Cumming * glom/application.cc: * glom/box_reports.cc: Set changes in the document. * glom/data_structure/report.cc: * glom/data_structure/report.h: Added get_title_or_name(). * glom/data_structure/tableinfo.cc: * glom/data_structure/tableinfo.h: Added get_title_or_name(). * glom/frame_glom.cc: fill_menu_tables(), fill_menu_reports(): Show the name if the title is empty. * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/adddel/adddel.h: Added remove_item_by_key(). 2005-05-08 Murray Cumming Added Reports menu, like the new Tables menu. 2005-05-08 Murray Cumming * glom/application.cc: * glom/application.h: * glom/frame_glom.cc: * glom/frame_glom.h: Added Reports menu, like the new Tables menu. 2005-05-08 Murray Cumming Changed the Navigation menu to a Tables menu, with dynamic menu items for 2005-05-08 Murray Cumming * glom/application.cc: * glom/application.h: * glom/frame_glom.cc: * glom/frame_glom.h: Changed the Navigation menu to a Tables menu, with dynamic menu items for each non-hidden table. The full tables dialog is now only for developers, available from the Edit Tables menu item. 2005-05-08 Murray Cumming Beginnings of UI to add/remove reports, and to edit them. 2005-05-08 Murray Cumming * configure.in: * glom/Makefile.am: * glom/glom.glade: * glom/box_reports.cc: * glom/box_reports.h: * glom/dialog_layout_report.cc: * glom/dialog_layout_report.h: Beginnings of UI to add/remove reports, and to edit them. * glom/data_structure/Makefile.am: * glom/data_structure/layout/Makefile.am: * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/report_parts/Makefile.am: * glom/data_structure/layout/report_parts/layoutitem_groupby.cc: * glom/data_structure/layout/report_parts/layoutitem_groupby.h: * glom/data_structure/layout/report_parts/layoutitem_summary.cc: * glom/data_structure/layout/report_parts/layoutitem_summary.h: * glom/data_structure/report.cc: * glom/data_structure/report.h: Beginnings of data structure for reports and their parts. * glom/document/document_glom.cc: * glom/document/document_glom.h: API to get/set reports, and load/save them. * glom/frame_glom.cc: * glom/frame_glom.h: Use the new UI bits for reports. 2005-05-07 Francisco Javier F. Serrador Updated Spanish translation. 2005-05-07 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2005-05-06 Murray Cumming Removed debug code. 2005-05-06 Murray Cumming Added a Developer/Reports menu item, with non-working beginnings of a 2005-05-06 Murray Cumming * glom/Makefile.am: * glom/application.cc: * glom/data_structure/layout/layoutgroup.cc: * glom/data_structure/layout/layoutgroup.h: * glom/data_structure/layout/layoutitem.h: * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: * glom/data_structure/layout/layoutitem_portal.cc: * glom/data_structure/layout/layoutitem_portal.h: * glom/dialog_layout_report.cc: * glom/dialog_layout_report.h: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/glom.glade: * glom/main.cc: * glom/mode_data/dialog_layout.cc: * glom/mode_data/dialog_layout.h: * glom/utility_widgets/db_adddel/db_adddel.cc: * po/POTFILES.in: Added a Developer/Reports menu item, with non-working beginnings of a simple layout dialog, with available parts on the left, and chosen parts on the right. 2005-05-06 Miloslav Trmac Updated Czech translation. 2005-05-06 Miloslav Trmac * cs.po: Updated Czech translation. 2005-05-04 Murray Cumming Increase version 2005-05-04 Murray Cumming Show the organisation name as well as the system name. Check for 2005-05-04 Murray Cumming * glom/frame_glom.cc: Show the organisation name as well as the system name. * glom/navigation/box_tables.cc: Check for glom_system_* tables and do not show them. 2005-05-04 Murray Cumming Pass the where_clause when calling refresh_from_database() on the model. 2005-05-04 Murray Cumming * glom/mode_data/box_data_list.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: Pass the where_clause when calling refresh_from_database() on the model. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: refresh_from_database(): Take where_clause parameter as well as in the constructor. clear() existing records before getting them again. 2005-05-04 Murray Cumming get_next_autoincrement_value(): Really increment the value. 2005-05-04 Murray Cumming * glom/base_db.cc: get_next_autoincrement_value(): Really increment the value. 2005-05-04 Murray Cumming Added auto_increment_insert_first_if_necessary() by moving some code from 2005-05-04 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added auto_increment_insert_first_if_necessary() by moving some code from get_auto_increment_next_value(). * glom/dialog_database_preferences.cc: * glom/dialog_database_preferences.h: load_from_document(): Iterate over all fields and call auto_increment_insert_first_if_necessary() for all primary keys, so they all show up in the dialog. 2005-05-04 Murray Cumming get_table_privileges(): Reverted a search/replace that broke parsing of 2005-05-04 Murray Cumming * glom/base_db.cc: get_table_privileges(): Reverted a search/replace that broke parsing of user rights. 2005-05-04 Murray Cumming Added missing files 2005-05-04 Adam Weinberger Updated Canadian English translation. 2005-05-04 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-05-03 Murray Cumming Added get_next_auto_increment_value() add_standard_table(): add the 2005-05-03 Murray Cumming * glom/base_db.cc: * glom/base_db.h: Added get_next_auto_increment_value() add_standard_table(): add the glom_system_autoincrements table. * glom/dialog_database_preferences.cc: * glom/dialog_database_preferences.h: Read and write to the autoincrement table. * glom/mode_data/box_data.cc: * glom/standard_table_prefs_fields.h: Added structure for glom_system_autoincrements table. 2005-05-03 Murray Cumming Move Mode label to the bottom of the window. Show the system name at the 2005-05-03 Murray Cumming * glom/application.cc: * glom/application.h: * glom/base_db.cc: * glom/box_db.cc: * glom/box_db.h: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/glom.glade: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_list_find.cc: * glom/notebook_glom.cc: * glom/notebook_glom.h: Move Mode label to the bottom of the window. Show the system name at the top, from the database preferences. Remove crufty hints stuff. 2005-05-03 Murray Cumming Added dialog to show system-wide details and next auto-increment values. 2005-05-03 Murray Cumming * glom/Makefile.am: * glom/dialog_database_preferences.cc: * glom/dialog_database_preferences.h: * glom/glom.glade: Added dialog to show system-wide details and next auto-increment values. * glom/data_structure/Makefile.am: * glom/data_structure/system_prefs.cc: * glom/data_structure/system_prefs.h: New class to hold system-wide preferences. * glom/standard_table_prefs_fields.h: Added list of #defines for the standard table database structure. * glom/application.cc: recreate_database(): Call new add_standard_tables() method to hold system-wide preferences. * glom/base_db.cc: * glom/base_db.h: Move some of recreate_database() into create_table() and reused it in new add_standard_tables() method. * glom/frame_glom.cc: * glom/frame_glom.h: Add Developer/Database Preferences menu item and handle it. 2005-05-02 Murray Cumming Use ScrolledWindow::set_policy(POLICY_AUTOMATIC) so we do not get useless 2005-05-02 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: Use ScrolledWindow::set_policy(POLICY_AUTOMATIC) so we do not get useless scrollbars. 2005-05-02 Murray Cumming Override some signal handlers from the base class, to prevent adding new 2005-05-02 Murray Cumming * glom/mode_find/box_data_list_find.cc: * glom/mode_find/box_data_list_find.h: Override some signal handlers from the base class, to prevent adding new rows to the database. * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: get_value_vfunc(): Check the count of columns, not the count of columns in the data model, so we can show an empty placeholder row without database data, for instance in Find mode. 2005-05-02 Murray Cumming Added set_mode_find(). on_notebook_find_criteria(): Show a dialog when no 2005-05-02 Murray Cumming * glom/application.cc: * glom/application.h: Added set_mode_find(). * glom/frame_glom.cc: on_notebook_find_criteria(): Show a dialog when no records were found, and offer to return to find mode. Show the mode in the Mode menu when programatically changing mode. 2005-05-02 Murray Cumming init_from_database(), fill_from_database(), and refresh_from_database() 2005-05-02 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/box_db_table.cc: * glom/box_db_table.h: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/main.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/box_db_table_relationships.h: * glom/mode_design/dialog_design.cc: * glom/mode_design/dialog_design.h: * glom/mode_design/dialog_fields.cc: * glom/mode_design/dialog_fields.h: * glom/mode_design/dialog_relationships.cc: * glom/mode_design/dialog_relationships.h: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/box_db_table_definition.h: * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_details_find.h: * glom/mode_find/box_data_list_find.cc: * glom/mode_find/box_data_list_find.h: * glom/mode_find/notebook_find.cc: * glom/mode_find/notebook_find.h: * glom/navigation/box_tables.cc: * glom/navigation/box_tables.h: init_from_database(), fill_from_database(), and refresh_from_database() now return a bool. This should let us detect empty results from finds. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Add AddDel::refresh_from_database(), and DbTreeModel::refresh_from_database() so we can build the structure separately and refill it repeatedly with data. 2005-05-01 Murray Cumming Added sql_find_operator() Use it instead of LIKE. 2005-05-01 Murray Cumming * glom/data_structure/field.cc: * glom/data_structure/field.h: Added sql_find_operator() * glom/mode_data/box_data.cc: Use it instead of LIKE. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Fix crash due to use of old key column. 2005-04-30 Francisco Javier F. Serrador Updated Spanish translation. 2005-04-30 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2005-04-29 Murray Cumming Added get_has_calculation() for performance. 2005-04-29 Murray Cumming * glom/data_structure/field.cc: * glom/data_structure/field.h: Added get_has_calculation() for performance. * glom/mode_data/Makefile.am: * glom/mode_data/calcinprogress.cc: * glom/mode_data/calcinprogress.h: Added data structure for fields being calculated. * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: - Added m_FieldsCalculationInProgress, so we can maintain the state of all ongoing calculations when calculating fields. - Added calculate_field() which calculates and sets a calculated field and any calculated fields that it needs. Whenc called recursively, it is aware of existing calculations in m_FieldsCalculationInProgress. - do_calculations(), * glom/mode_data/box_data_details.cc: - recalculate_fields_for_related_records(): Use calculate_field() to simplify the code. 2005-04-26 Murray Cumming construct_columns(): Right-align numeric fields. 2005-04-26 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: construct_columns(): Right-align numeric fields. 2005-04-26 Murray Cumming Right-align number fields. Make set_layout_item() virtual so we can change 2005-04-26 Murray Cumming * glom/utility_widgets/comboentryglom.cc: * glom/utility_widgets/comboentryglom.h: * glom/utility_widgets/entryglom.cc: * glom/utility_widgets/entryglom.h: Right-align number fields. * glom/utility_widgets/layoutwidgetbase.h: Make set_layout_item() virtual so we can change parts of the derived widget according to the layout details. 2005-04-26 Murray Cumming Updated screenshot 2005-04-26 Murray Cumming Make comments multiline formatted on Details views. 2005-04-26 Murray Cumming * examples/example_smallbusiness.glom: Make comments multiline formatted on Details views. * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Added get/set_text_format_multiline(). * glom/document/document_glom.cc: load_after(), save_before(): load/save the multiline text formatting bool. * glom/mode_data/dialog_field_layout.cc: load/save the multiline checkbox setting. * glom/utility_widgets/Makefile.am: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/textviewglom.cc: * glom/utility_widgets/textviewglom.h: Added TextViewGlom which is a TextView in a ScrolledWindow. Use it for multiline text. * glom/utility_widgets/flowtable.cc: Expand the second item to take the remaining columns width, 2005-04-26 Murray Cumming Make comments multiline formatted on Details views. 2005-04-26 Murray Cumming * examples/example_smallbusiness.glom: Make comments multiline formatted on Details views. * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Added get/set_text_format_multiline(). * glom/document/document_glom.cc: load_after(), save_before(): load/save the multiline text formatting bool. * glom/mode_data/dialog_field_layout.cc: load/save the multiline checkbox setting. * glom/utility_widgets/Makefile.am: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/textviewglom.cc: * glom/utility_widgets/textviewglom.h: Added TextViewGlom which is a TextView in a ScrolledWindow. Use it for multiline text. 2005-04-26 Murray Cumming Move get/set_value() and signal_edited() into a new LayoutWidgetField base 2005-04-26 Murray Cumming * glom/utility_widgets/Makefile.am: * glom/utility_widgets/comboentryglom.h: * glom/utility_widgets/comboglomchoicesbase.cc: * glom/utility_widgets/comboglomchoicesbase.h: * glom/utility_widgets/entryglom.cc: * glom/utility_widgets/entryglom.h: * glom/utility_widgets/layoutwidgetfield.cc: * glom/utility_widgets/layoutwidgetfield.h: Move get/set_value() and signal_edited() into a new LayoutWidgetField base class. * glom/utility_widgets/datawidget.cc: Use LayoutWidgetField instances polymorphically via the base class, simplifying the code. 2005-04-25 Murray Cumming Use #defines for XML node and attribute names, to avoid errors when 2005-04-25 Murray Cumming * glom/document/document_glom.cc: Use #defines for XML node and attribute names, to avoid errors when repeating them. 2005-04-25 Murray Cumming Untranslated some pango markup that caused a crash. Do not translate 2005-04-25 Murray Cumming * pt_BR.po: Untranslated some pango markup that caused a crash. Do not translate markup. 2005-04-23 Murray Cumming Increased version again 2005-04-23 Murray Cumming Remove background from screenshot. 2005-04-23 Murray Cumming Remove dot from screenshot. 2005-04-23 Murray Cumming Update screenshot text 2005-04-23 Murray Cumming Updated screenshot. 2005-04-23 Murray Cumming Increased version 2005-04-23 Murray Cumming on_button_add_field(): Make fields editable by default. 2005-04-23 Murray Cumming * glom/mode_data/dialog_layout_details.cc: on_button_add_field(): Make fields editable by default. 2005-04-23 Murray Cumming Rename fill_from_database_layout() to create_layout(), 2005-04-23 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/box_db_table.cc: * glom/box_db_table.h: * glom/dialog_invalid_data.cc: * glom/dialog_invalid_data.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: * glom/mode_data/notebook_data.cc: * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_list_find.cc: * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/comboentryglom.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/entryglom.cc: * glom/utility_widgets/flowtablewithfields.cc: Rename fill_from_database_layout() to create_layout(), refresh_db_details() to refresh_data_from_database() and describe how these and the other 2 methods work together in the class documentation for Box_Data. 2005-04-23 Murray Cumming Remove fill_fields(). It has no use here. Its equivalent is the new 2005-04-23 Murray Cumming * glom/box_db_table.cc: * glom/box_db_table.h: Remove fill_fields(). It has no use here. Its equivalent is the new fill_database_layout() in Box_Data, a derived class. * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: Add virtual fill_database_layout() so the derived implementations can be called from init_db_details(). * glom/mode_data/box_data_details.cc: fill_database_layout() is now called by the base class, at the appropriate time, so we do not need to call it from fill_database(). refresh_db_details(): Call fill_from_database() instead of init_db_details() so we do not unnecessarily rebuild the whole layout UI. * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: fill_fields(): Rename to fill_database_layout(), which is now called from the base class. fill_from_database(): Do not call fill_fields/ fill_database_layout() unnecessarily here. * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: Rename on_Details_user_requested_details() to on_list_user_requested_details() because that it is a signal on list, not details. * glom/mode_design/fields/box_db_table_definition.cc: fill_from_database(): Call fill_fields() because the base class does not call it anymore. * glom/utility_widgets/flowtablewithfields.cc: add_layout_item_at_position(). When adding a Box_Data_List_Related portal, call add_view() before init_db_details() because the latter needs the document. 2005-04-22 Murray Cumming Add the DbAddDel as a view with add_view(), so it has the document. 2005-04-22 Murray Cumming * glom/mode_data/box_data_list.cc: Add the DbAddDel as a view with add_view(), so it has the document. * glom/utility_widgets/cellrendererlist.cc: * glom/utility_widgets/cellrendererlist.h: Handle the editing_started signal to add the second column. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Fill the second choices column of the CellRendererList. 2005-04-22 Murray Cumming Added some warnings for when relationships are unexpectedly empty. 2005-04-22 Murray Cumming * glom/data_structure/glomconversions.cc: Added some warnings for when relationships are unexpectedly empty. * glom/data_structure/layout/layoutitem_field.cc: get_has_choices(). Return false if the choices information is empty, so we have no empty dropdown menus. * glom/data_structure/layout/layoutitem_portal.cc: * glom/data_structure/layout/layoutitem_portal.h: Store the whole Relationship information here. * glom/document/document_glom.cc: * glom/document/document_glom.h: Use a more explicit data structure for layouts, clearly marking related (portal) layouts. update_relationships(): Update related (portal) layouts too. * glom/mode_data/dialog_layout_list_related.cc: on_button_formatting(): Specify the correct table name, so we get choices from the related table, not the parent table. 2005-04-22 Murray Cumming Details Layout: Add a Formatting button, because I can not yet implement a 2005-04-22 Murray Cumming * glom/glom.glade: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: * glom/mode_data/treestore_layout.h: Details Layout: Add a Formatting button, because I can not yet implement a context menu for a GtkComboBox, and because nothing should be available only via a context menu anyway. 2005-04-22 Murray Cumming Move cellrendererlist out of adddel into utlity_widgets, because it is 2005-04-22 Murray Cumming * glom/Makefile.am: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/adddel/Makefile.am: * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/adddel/cellrendererlist.cc: * glom/utility_widgets/adddel/cellrendererlist.h: Move cellrendererlist out of adddel into utlity_widgets, because it is also used by DbAddDel. * glom/utility_widgets/cellrendererlist.cc: * glom/utility_widgets/cellrendererlist.h: * glom/utility_widgets/comboentryglom.cc: * glom/utility_widgets/comboentryglom.h: * glom/utility_widgets/comboglomchoicesbase.cc: * glom/utility_widgets/comboglomchoicesbase.h: Add ComboGlom and ComboGlomChoicesBase which is a base class for ComboGlom and ComboEntryGlom. * glom/utility_widgets/datawidget.cc: Use ComboGlom instead of ComboEntryGlom when the choices should be restricted. * glom/utility_widgets/db_adddel/db_adddel.cc: Restrict the choices when specified, using CellRendererCombo::property_has_entry(). 2005-04-22 Gareth Owen Updated British English translation 2005-04-22 Adam Weinberger Updated Canadian English translation. 2005-04-21 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-04-21 Murray Cumming Updated NEWS 2005-04-21 Murray Cumming Add drop down choices for name_title. 2005-04-21 Murray Cumming * examples/example_smallbusiness.glom: Add drop down choices for name_title. * glom/data_structure/field.h: * glom/data_structure/glomconversions.cc: get_text_for_gda_value(): Prevent use of values that do not have the expected type. * glom/document/document_glom.cc: * glom/document/document_glom.h: Added get/set_attribute_value_as_value() for convenience. load_after(), save_before(): load/save the custom choices. * glom/mode_data/dialog_field_layout.cc: * glom/mode_data/dialog_field_layout.h: Really save/load the custom choices, by storing and using the correct column index. 2005-04-21 Murray Cumming Add get_choice_values(), with code moved from DataWidget. 2005-04-21 Murray Cumming * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: Add get_choice_values(), with code moved from DataWidget. * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: Use a CellRendererCombo on the List view, if the field layout has choices. However, it only shows the first column so far. * glom/base_db.cc: * glom/box_db.cc: * glom/dialog_connection.cc: * glom/dialog_connection.h: * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/frame_glom.cc: * glom/main.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/dialog_field_layout.cc: * glom/mode_data/dialog_layout.cc: * glom/mode_data/dialog_layout.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_design/box_db_table_relationships.cc: * glom/mode_find/box_data_details_find.cc: * glom/navigation/box_tables.cc: Use get_document() from the View base class instead of another member variable. Use add_view() and remove_view() in some more places. 2005-04-21 Murray Cumming Added update_cache_relationship() and call it from set_relationship() and 2005-04-21 Murray Cumming * glom/document/document_glom.cc: * glom/document/document_glom.h: Added update_cache_relationship() and call it from set_relationship() and load_after() instead of filling-in relationship details along the way. * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/utility_widgets/comboentryglom.cc: * glom/utility_widgets/comboentryglom.h: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: * glom/utility_widgets/flowtablewithfields.cc: Show data from the second related field in the drop down choice. 2005-04-21 Murray Cumming Invoice details: Added choice of contacts dropdown. util_trim(): reverse 2005-04-21 Murray Cumming * examples/example_smallbusiness.glom: Invoice details: Added choice of contacts dropdown. * glom/data_structure/glomconversions.cc: util_trim(): reverse iterate from rbegin to rend, not the other way around. This avoids accessing invalid memory too. * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Add members and methods for choices drop-downs. * glom/document/document_glom.cc: Load/Save the choices details for LayoutItem_Fields. * glom/glom.glade: * glom/main.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/dialog_choose_relationship.cc: * glom/mode_data/dialog_choose_relationship.h: * glom/mode_data/dialog_field_layout.cc: * glom/mode_data/dialog_field_layout.h: * glom/mode_data/dialog_layout.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list_related.cc: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/adddel/adddel.h: * glom/utility_widgets/adddel/adddel_withbuttons.cc: * glom/utility_widgets/adddel/adddel_withbuttons.h: * glom/utility_widgets/comboentryglom.cc: * glom/utility_widgets/comboentryglom.h: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: * glom/utility_widgets/entryglom.cc: * glom/utility_widgets/entryglom.h: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/layoutwidgetbase.cc: * glom/utility_widgets/layoutwidgetbase.h: In the Layout Properties dialog, show a second tab for choices, either a custom list or a list from a related record. Only works on Details so far. * glom/frame_glom.cc:on_menu_developer_users(), * glom/mode_data/box_data_list_related.cc: destructor, * glom/mode_data/box_data.cc: destructor, Call remove_view() before deleting the dialog. 2005-04-20 Gareth Owen Updated British English translation 2005-04-19 Murray Cumming Add m_TableFields and fill it in fill_database(), as a cache instead of 2005-04-19 Murray Cumming * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: Add m_TableFields and fill it in fill_database(), as a cache instead of repeatedly getting it from the document. get_lookup_fields(), get_calculated_fields(), * glom/mode_data/box_data_details.cc: recalculate_fields_for_related_records(), Examine all table fields, via m_TableFields, instead of just shown fields. 2005-04-19 Murray Cumming Remove 0 and NULL default values. Save default values with 2005-04-18 Murray Cumming * examples/example_smallbusiness.glom: Remove 0 and NULL default values. * glom/document/document_glom.cc: Save default values with GlomConversions::get_text_for_gda_value(), in iso-format, instead of Gda::Value::to_string(). This stops empty default values being changed to 0s and NULLs. * glom/mode_data/box_data_list.cc: Specify the list row when calling set_field_value_in_database() so that lookups/ calcs actually happen. 2005-04-19 Murray Cumming Add get_primary_key(), get_unique_key(), get_default_value(), etc, so we 2005-04-19 Murray Cumming,,, * glom/data_structure/field.cc: * glom/data_structure/field.h: Add get_primary_key(), get_unique_key(), get_default_value(), etc, so we do not always need to copy the whole FileAttributes member just to get a little information. * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/flowtablewithfields.cc: Use the Field methods instead of getting the FieldAttributes and using its methods. This should be more efficient. 2005-04-18 Murray Cumming Updated NEWS 2005-04-18 Murray Cumming Increased version 2005-04-18 Murray Cumming Remove 0 and NULL default values. Save default values with 2005-04-18 Murray Cumming * examples/example_smallbusiness.glom: Remove 0 and NULL default values. * glom/document/document_glom.cc: Save default values with GlomConversions::get_text_for_gda_value(), in iso-format, instead of Gda::Value::to_string(). This stops empty default values being changed to 0s and NULLs. * glom/mode_data/box_data_list.cc: Specify the list row when calling set_field_value_in_database() so that lookups/ calcs actually happen. 2005-04-18 Murray Cumming product: Add vat_percent field. invoice_lines: Lookup vat_percent along 2005-04-18 Murray Cumming * examples/example_smallbusiness.glom: product: Add vat_percent field. invoice_lines: Lookup vat_percent along with the other product information. * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: Always use set_field_value_in_database() instead of custom UPDATE sql queries, and do all dependent recalcs/lookups/etc in set_field_value_in_database(). 2005-04-18 Murray Cumming Added View_Composite::remove_view() calls before deleting widgets that 2005-04-18 Murray Cumming * glom/mode_data/box_data_details.cc: * glom/mode_data/notebook_data.cc: * glom/mode_design/dialog_fields.cc: * glom/mode_design/dialog_relationships.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_find/notebook_find.cc: Added View_Composite::remove_view() calls before deleting widgets that have been add_view()ed. This fixes a crash when reopening the field definition details dialog. 2005-04-18 Adam Weinberger Updated Canadian English translation. 2005-04-17 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-04-17 Murray Cumming Add VAT fields to invoice_lines and invoices, with calculations. 2005-04-17 Murray Cumming * examples/example_smallbusiness.glom: Add VAT fields to invoice_lines and invoices, with calculations. * glom/data_structure/layout/layoutitem.cc: * glom/data_structure/layout/layoutitem.h: * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Add operator==(). * glom/glom.glade: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: Add a Formatting button, as already in the regular List Layout dialog. * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: do_calculations(), * glom/mode_data/box_data_details.cc: recalculate_fields_for_related_records(): Recalculated fields that depend on the just-recalcualted fields, with some attempt to prevent circular fields. The dependency- sequence needs to be figured out all at once, however - see the TODO> * glom/python_embed/python_module/pygdavalue_conversions.c: (pygda_value_as_pyobject): Return a PyFloat for a GdaNumeric, instead of a PyLong. 2005-04-17 Francisco Javier Fernandez Updated Spanish translation by Gorge Gonzalez. 2005-04-17 Francisco Javier Fernandez * es.po: Updated Spanish translation by Gorge Gonzalez. 2005-04-17 Murray Cumming Emit the signal_record_changed signal when deleting related records, to 2005-04-17 Murray Cumming * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: Emit the signal_record_changed signal when deleting related records, to cause field recalculations. 2005-04-17 Murray Cumming record_new(): Iterate from begin to end, not begin to begin, so we 2005-04-17 Murray Cumming * glom/mode_data/box_data.cc: record_new(): Iterate from begin to end, not begin to begin, so we actually set default values and calculate initial values. * glom/mode_design/fields/dialog_fielddefinition.cc: set_field(): Monitor changes to the dynamically-created default value widget, not just the rest, so that changes to the default value enable the Save button. 2005-04-17 Murray Cumming fill_from_database(): Call DbAddDel::set_where_clause(), so that related 2005-04-17 Murray Cumming * glom/mode_data/box_data_list.cc: fill_from_database(): Call DbAddDel::set_where_clause(), so that related records portals show only the related records instead of all records. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Added set_where_clause(), and used it when creating the treemodel. get_is_placeholder(): Cope with invalid iterators. * po/POTFILES.in: Updated. 2005-04-17 Adam Weinberger Updated Canadian English translation. 2005-04-17 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-04-16 Murray Cumming Updated. 2005-04-17 Murray Cumming * docs/website/index.html: Updated. * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: Add FlowTable::signal_related_record_changed() and Box_Data_List_Related::signal_record_changed() to allow the Box_Data_Details to recalculate fields that use the relationship whose records have changed. 2005-04-16 Murray Cumming Add count and total_price (calculated) fields to invoice_lines. Add 2005-04-16 Murray Cumming * examples/example_smallbusiness.glom: Add count and total_price (calculated) fields to invoice_lines. Add price_total (calculated) field to invoices. * glom/data_structure/field.cc: * glom/data_structure/field.h: Add get_calculation_relationships() to discover what relationships are used by a calculation. * glom/data_structure/glomconversions.cc: Change example value for numbers to 1 from 123, so we are more likely to find related records when testing calculations. * glom/python_embed/python_module/py_glom_record.cc: * glom/python_embed/python_module/py_glom_record.h: Remove the unused m_gda_connection member variable. * glom/python_embed/python_module/py_glom_relatedrecord.cc: Add sum(), count(), min(), and max() python methods. For instance, record[invoice_lines].sum(total_price); 2005-04-16 Murray Cumming Forward get/set_name() to m_field instead of using m_name from the base 2005-04-16 Murray Cumming * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Forward get/set_name() to m_field instead of using m_name from the base class. * glom/document/document_glom.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: Remove set_name() where we also set m_field with an identical name. 2005-04-16 Murray Cumming Fixed a non-US spelling of recognized 2005-04-16 Murray Cumming RelatedRecord_tp_as_mapping_getitem(): Actually execute the SQ so that it 2005-04-16 Murray Cumming * glom/python_embed/python_module/py_glom_relatedrecord.cc: RelatedRecord_tp_as_mapping_getitem(): Actually execute the SQ so that it actually gets the data. And also handle various errors and give interesting warnings. 2005-04-16 Murray Cumming Added record.related[relationship_name][field_name] syntax for calculated 2005-04-16 Murray Cumming * glom/mode_data/box_data.cc: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/python_embed/glom_python.cc: * glom/python_embed/glom_python.h: * glom/python_embed/python_module/Makefile.am: * glom/python_embed/python_module/py_glom_module.cc: * glom/python_embed/python_module/py_glom_module.h: * glom/python_embed/python_module/py_glom_record.cc: * glom/python_embed/python_module/py_glom_record.h: * glom/python_embed/python_module/py_glom_related.cc: * glom/python_embed/python_module/py_glom_related.h: * glom/python_embed/python_module/py_glom_relatedrecord.cc: * glom/python_embed/python_module/py_glom_relatedrecord.h: Added record.related[relationship_name][field_name] syntax for calculated fields, though it is not working yet. * glom/python_embed/python_module/pygdavalue_conversions.c: * glom/utility_widgets/adddel/eggcolumnchooser/eggcolumnchooserdial og.c: * glom/utility_widgets/adddel/eggcolumnchooser/eggcolumnmodel.c: Extra C casts needed for g++ 3.4. 2005-04-16 Murray Cumming Updated dependencies 2005-04-16 Murray Cumming Updated screenshot 2005-04-15 Murray Cumming Access field values via record[] instead of record.fields[].get(). 2005-04-16 Murray Cumming * glom/python_embed/glom_python.cc: * glom/python_embed/python_module/py_glom_record.cc: * glom/python_embed/python_module/py_glom_record.h: Access field values via record[] instead of record.fields[].get(). * glom/data_structure/field.cc: get_calculation_fields(): Revise for the new syntax. * glom/python_embed/python_module/ Added py_glom_related.[h|cc], which will, soon, provide access to related records. Added py_glom_module.[h|cc]: Added, and moved the module init stuff into here. 2005-04-15 Murray Cumming in progress 2005-04-15 Murray Cumming in progress 2005-04-15 Murray Cumming in progress 2005-04-15 Murray Cumming in progress 2005-04-15 Murray Cumming Depend on pygda-1.2 2005-04-15 Murray Cumming Let me use my own data again. 2005-04-15 Murray Cumming some autotool change 2005-04-15 Murray Cumming Addd some checks 2005-04-15 Murray Cumming Increased version in database name, so that it will be recreated. 2005-04-15 Adam Weinberger Updated Canadian English translation. 2005-04-14 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-04-14 Murray Cumming Updated version 2005-04-14 Murray Cumming Invoice details: Show the related, calculated, Full Name instead of the 2005-04-14 Murray Cumming * examples/example_smallbusiness.glom: Invoice details: Show the related, calculated, Full Name instead of the individual name parts, now that calculated fields work. * glom/data_structure/layout/layoutgroup.h: Make the items map public so we can change it more efficiently. * glom/document/document_glom.cc: * glom/document/document_glom.h: Add fill_layout_field_details() to fill layout groups with full field information. * glom/glom.glade: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list.h: Added a Formatting button to show the now-separate formatting dialog. set_document(): Get the full field information from the document. * glom/mode_data/box_data_list.cc: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/entryglom.cc: * glom/utility_widgets/layoutwidgetbase.cc: Move action creation into the base class instead of duplicating it. 2005-04-14 Murray Cumming Updated some screenshots and pictures. 2005-04-14 Murray Cumming * docs/website/screenshots/glom_data_details.png: * docs/website/screenshots/glom_design_layout_field_formatting.png: * docs/website/screenshots/glom_select_field.png: * docs/website/screenshots/index.html: Updated some screenshots and pictures. * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: Added get_record_field_values(), get_calculated_fields(), and do_calculations() which use them. * glom/mode_data/box_data_details.cc: on_flowtable_field_changed(): * glom/mode_data/box_data_list.cc: on_adddel_user_changed(): Call do_calculations() to update calculated field values. 2005-04-14 Adam Weinberger Updated Canadian English translation. 2005-04-13 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-04-13 Murray Cumming Updated the screenshot to show these changes. Added a name_full fields to 2005-04-13 Murray Cumming * docs/website/screenshots/glom_design_fields_dialog_calculated.png : Updated the screenshot to show these changes. * examples/example_smallbusiness.glom: Added a name_full fields to contacts, as a simple calculated-field test. * glom/data_structure/field.cc: * glom/data_structure/field.h: Added get_caculation_fields() - it parses the python code and guesses what fields are used in the calculation. * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: Added get_example_value(), so we have some field values for the calculation test dialog. * glom/glom.glade: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/mode_design/fields/dialog_fieldcalculation.h: * glom/mode_design/fields/dialog_fielddefinition.cc: Show the (according to our parsing) used fields, and show that we import the glom module implicitly. 2005-04-13 Murray Cumming glom_evaluate_python_function_implementation() Correctly check whether the 2005-04-13 Murray Cumming * glom/python_embed/glom_python.cc: glom_evaluate_python_function_implementation() Correctly check whether the result is a gda.Value and process it appropriately. This now works. 2005-04-13 Murray Cumming Link the module to the glom dependencies, to avoid undefined symbols when 2005-04-13 Murray Cumming * glom/python_embed/python_module/Makefile.am: Link the module to the glom dependencies, to avoid undefined symbols when using it from python. 2005-04-13 Murray Cumming Use pyexec_* instead of pkpyexec_* so that the module is not installed in 2005-04-13 Murray Cumming * glom/python_embed/python_module/Makefile.am: Use pyexec_* instead of pkpyexec_* so that the module is not installed in a package sub-directory, so that it can be imported. 2005-04-13 Murray Cumming Add python test script. 2005-04-13 Murray Cumming Create glom.la, not libglom.la. That seems to be what python modules do. 2005-04-13 Murray Cumming * glom/Makefile.am: * glom/python_embed/python_module/Makefile.am: Create glom.la, not libglom.la. That seems to be what python modules do. * glom/python_embed/python_module/py_glom_record.cc: * glom/python_embed/python_module/py_glom_record.h: Rename the initglomRecord() method to initglom(), in case that is what python is looking for. Still does not work though. 2005-04-13 Hendrik Brandt Updated German translation. 2005-04-13 Hendrik Brandt * de.po: Updated German translation. 2005-04-13 Murray Cumming Put the python module in a sub directory, making the build easiert. Rename 2005-04-13 Murray Cumming * configure.in: * glom/Makefile.am: * glom/python_embed/Makefile.am: * glom/python_embed/glom_python.cc: * glom/python_embed/python_module/Makefile.am: * glom/python_embed/python_module/py_glom_record.cc: * glom/python_embed/python_module/py_glom_record.h: Put the python module in a sub directory, making the build easiert. Rename the python module from pyglom to glom, and import that. But python still says that the module does not exist when we import it. 2005-04-13 Murray Cumming record_new(), on_button_test(): Pass some test fields values to 2005-04-13 Murray Cumming * glom/mode_data/box_data.cc: record_new(), * glom/mode_design/fields/dialog_fieldcalculation.cc: on_button_test(): Pass some test fields values to glom_evaluate_python_function_implementation(). * glom/python_embed/Makefile.am: Try to actually build and install the glom python module. * glom/python_embed/glom_python.cc: * glom/python_embed/glom_python.h: glom_evaluate_python_function_implementation() now receives a map of field values to be used by the python function. * glom/python_embed/py_glom_record.cc: Add the fields attribute. 2005-04-12 Murray Cumming Get access to the python gda.Value type and use it instead of the hack. 2005-04-12 Murray Cumming * glom/python_embed/glom_python.cc: Get access to the python gda.Value type and use it instead of the hack. 2005-04-12 Murray Cumming pkg-config check for pygtk-2.0, because we need the header to access the 2005-04-12 Murray Cumming * configure.in: pkg-config check for pygtk-2.0, because we need the header to access the internals of the gda.Value object. * glom/python_embed/glom_python.cc: Handle the result as a gda.Value. 2005-04-10 Adam Weinberger Updated Canadian English translation. 2005-04-10 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-04-10 Murray Cumming on_adddel_user_added(): Call on_adddel_user_changed() to do lookups. 2005-04-10 Murray Cumming * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: on_adddel_user_added(): Call on_adddel_user_changed() to do lookups. * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: DbAddDel::signal_user_added(): Pass the column index of the field that was filled-in to create the new row. 2005-04-10 Murray Cumming Added files that I think Christian Rose removed accidentally. 2005-04-10 Murray Cumming * po/POTFILES.in: Added files that I think Christian Rose removed accidentally. 2005-04-09 Adam Weinberger Updated Canadian English translation. 2005-04-09 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-04-09 Miloslav Trmac Updated Czech translation. 2005-04-09 Miloslav Trmac * cs.po: Updated Czech translation. 2005-04-09 Murray Cumming Add get/set_hidden(), so we can add a hidden list column for keys, without 2005-04-09 Murray Cumming * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Add get/set_hidden(), so we can add a hidden list column for keys, without showing them in the UI. * glom/mode_data/box_data_list.cc: Do not create rows in the AddDel from the database - allow it (the model) to fill itself. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Use the new explicit get_last_row() method of the model instead of iterating back from end(). * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Constructor: create rows from the database automatically, as well as allowing creating of new empty rows. 2005-04-08 Murray Cumming Added Relationship::get_name_not_empty() and used it, for performance, 2005-04-08 Murray Cumming * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: * glom/data_structure/relationship.cc: * glom/data_structure/relationship.h: Added Relationship::get_name_not_empty() and used it, for performance, instead of getting the whole string just to see if it is empty. * glom/glom.glade: * glom/mode_data/Makefile.am: * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_choose_field.h: * glom/mode_data/dialog_field_layout.cc: * glom/mode_data/dialog_field_layout.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: Moved formatting options to their own dialog. * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: * glom/utility_widgets/entryglom.cc: * glom/utility_widgets/entryglom.h: * glom/utility_widgets/layoutwidgetbase.h: Added a context menu item for the new layout properties dialog. 2005-04-07 Murray Cumming increased version 2005-04-07 Murray Cumming Remove the (huge) boost directory. boost::python is not worth the trouble 2005-04-07 Murray Cumming * glom/python_embed/: Remove the (huge) boost directory. boost::python is not worth the trouble for now, so I will use the C API instead. 2005-04-07 Murray Cumming Add set_columns_ready(). Only when this is called will the columns 2005-04-07 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: Add set_columns_ready(). Only when this is called will the columns actually be constructed. This prevents multiple unnecessary data retrievals. * glom/mode_data/box_data_list.cc: fill_column_titles(): Call DbAddDel::set_columns_ready(). * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: create(): Add a where_clause parameter. Add a datamodel member variable and fill it from a SQL SELECT statement. The result is not actually used yet, but could be used to get rows only on demand when iterating. 2005-04-07 Murray Cumming In progress 2005-04-07 Murray Cumming in progress 2005-04-07 Murray Cumming Do not try to build the boost sub-directory. We do not use it anymore. 2005-04-07 Murray Cumming * glom/python_embed/Makefile.am: Do not try to build the boost sub-directory. We do not use it anymore. 2005-04-07 Murray Cumming whitespace changes 2005-04-07 Murray Cumming Added a comment. 2005-04-07 Murray Cumming Depend explicitly on libxslt. Stop using boost::python. 2005-04-07 Murray Cumming * Makefile.am: * configure.in: Depend explicitly on libxslt. Stop using boost::python. * glom/python_embed/py_glom_record.cc: * glom/python_embed/py_glom_record.h: Stop using boost::python, because it is too difficult to build , inside glom, and is huge, and is not really necessary here. Add some more code for the PyGlomRecord object. * glom/python_embed/glom_python.cc: Pass a PyGlomRecord object to the python method. * glom/application.cc: App_Glom::init(): Add a print menu item. It is just a proof of concept at the moment. * glom/mode_data/box_data_details.cc: Added print_layout_group(), which creates an XML format for the data, and then converts it to HTML using an XSLT stylesheet, using libxslt. * xslt/ Added this directory, with .xslt which is installed for use by the application. * glom/base_db.cc: * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: Add util_build_sql_select_with_where_clause(), moved from Box_Data(), so that the Db_AddDel can use it in future, to do on-demand data retrieval. * glom/data_structure/iso_codes.cc: Catch the exception if the iso_codes XML file can not be found, and then just return an empty list. This prevents a crash when iso_codes is not properly installed. For instance, Ubuntu Hoary currently installs an (obviously) incorrect .pc file. * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Cache the whole Relationship details here, instead of just storing the relationship_name. This means that code that uses this does not need to access the document to lookup the full details. * glom/dialog_connection.cc: * glom/document/document_glom.cc: * glom/frame_glom.cc: * glom/frame_glom.h: * glom/glom.glade: Made ScrolledWindows use automatic mode for scrollbars, so they are only shown when necessary. Remove the unused information dialog. * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: * glom/utility_widgets/flowtablewithfields.cc: Make methods const. * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Store LayoutItem_Fields for each column, not just Fields. * glom/main.cc: * glom/mode_data/Makefile.am: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_choose_relationship.cc: * glom/mode_data/dialog_layout.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/notebook_data.cc: * glom/mode_data/notebook_data.h: * glom/mode_data/treestore_layout.h: * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/dialog_design.cc: * glom/mode_design/dialog_fields.cc: * glom/mode_design/dialog_relationships.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/combo_fieldtype.cc: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_user.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_list_find.cc: * glom/mode_find/notebook_find.cc: * glom/navigation/box_tables.cc: * glom/notebook_glom.cc: * glom/notebook_glom.h: * glom/utility_widgets/adddel/adddel.cc: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/entryglom.cc: * glom/data_structure/field.cc: Include glibmm/i18n.h instead of libintl.h in .cc files, so we can use _() instead of gettext(). 2005-04-01 Steven Michael Murphy Added new Language, Kinyarwanda (rw), to this package 2005-03-31 Hendrik Brandt Updated German translation. 2005-03-31 Hendrik Brandt * de.po: Updated German translation. 2005-03-31 Murray Cumming Increased version 2005-03-31 Murray Cumming Added missing files 2005-03-31 Murray Cumming Added screenshot. 2005-03-31 Murray Cumming Mentioned automatic layout and numeric formatting 2005-03-31 Murray Cumming The optional add() expand parameter now works for first items, so related 2005-03-31 Murray Cumming * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: The optional add() expand parameter now works for first items, so related records portals now take up the full column width. 2005-03-31 Miloslav Trmac Updated Czech translation. 2005-03-31 Miloslav Trmac * cs.po: Updated Czech translation. 2005-03-31 Murray Cumming Use the correct name with dgettext(), using a _ instead of a -. CUrrency 2005-03-31 Murray Cumming * glom/data_structure/iso_codes.cc: Use the correct name with dgettext(), using a _ instead of a -. CUrrency names are therefore now translated. * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: * glom/utility_widgets/flowtablewithfields.cc: Add optional expand parameter to FlowTable::add() and use it for portals and groups in FlowTableWithFields. Does not quite work yet though. 2005-03-31 Adam Weinberger Updated Canadian English translation. 2005-03-30 Adam Weinberger * en_CA.po: Updated Canadian English translation. 2005-03-30 Christian Rose Updated Swedish translation. 2005-03-30 Christian Rose * sv.po: Updated Swedish translation. 2005-03-30 Murray Cumming Depend on latest bakery, so we can use util_bold_message(). 2005-03-30 Murray Cumming * configure.in: Depend on latest bakery, so we can use util_bold_message(). * glom/application.cc: * glom/base_db.cc: * glom/frame_glom.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_design/dialog_fields.cc: * glom/mode_design/dialog_relationships.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_users_list.cc: * glom/navigation/box_tables.cc: * glom/utility_widgets/flowtablewithfields.cc: Use util_bold_message() to avoid marking pango markup for translation. 2005-03-30 Christian Rose Removed unnecessary trailing spaces from translateable messages (bug 2005-03-30 Christian Rose * glom/glom.glade: Removed unnecessary trailing spaces from translateable messages (bug #172109). 2005-03-30 Murray Cumming Comment-out the boost python stuff until I can get it to build. 2005-03-30 Murray Cumming * glom/python_embed/py_glom_record.h: Comment-out the boost python stuff until I can get it to build. 2005-03-30 Murray Cumming Added missing files 2005-03-30 Murray Cumming Added boost/, containing lots of the boost files, needed by the 2005-03-30 Murray Cumming * glom/python_embed/: Added boost/, containing lots of the boost files, needed by the boot::python library. We must copy the files instead of depending on a shared library, because the API is unstable. 2005-03-30 Christian Rose Updated Swedish translation. 2005-03-30 Christian Rose * sv.po: Updated Swedish translation. 2005-03-30 Murray Cumming Move glom_python.* to the python_emded subdirectory, where I plan to put 2005-03-30 Murray Cumming * configure.in: * glom/Makefile.am: * glom/box_db_table.cc: * glom/glom_python.cc: * glom/glom_python.h: * glom/mode_data/box_data.cc: * glom/mode_design/fields/dialog_fieldcalculation.cc: * glom/python_embed/Makefile.am: * glom/python_embed/glom_python.cc: * glom/python_embed/glom_python.h: Move glom_python.* to the python_emded subdirectory, where I plan to put more stuff. 2005-03-30 Murray Cumming Updated NEWS 2005-03-30 Murray Cumming Added util_trim_string(). on_treeview_cell_edited(): Use the 2005-03-30 Murray Cumming * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: Added util_trim_string(). * glom/utility_widgets/db_adddel/db_adddel.cc: on_treeview_cell_edited(): Use the numeric_format when parsing. * glom/utility_widgets/entryglom.cc: get_value(), check_for_change(): Use the numeric_format when parsing the value, so that currency symbols can be ignored. 2005-03-30 Murray Cumming Use the currencies iso domain with dgettext. 2005-03-30 Murray Cumming Depend on iso-codes and define the prefix for its files in config.h. 2005-03-30 Murray Cumming * config.h.in: * configure.in: Depend on iso-codes and define the prefix for its files in config.h. * glom/Makefile.am: * glom/data_structure/Makefile.am: * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: * glom/data_structure/iso_codes.cc: * glom/data_structure/iso_codes.h: Added a Currency class, and get_list_of_currency_symbols(). * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_choose_field.h: * glom/utility_widgets/Makefile.am: * glom/utility_widgets/comboentry_currency.cc: * glom/utility_widgets/comboentry_currency.h: Use a ComboBoxEntry for the currencies on the Field Layout dialog. * glom/utility_widgets/entry_numerical.cc: * glom/utility_widgets/entry_numerical.h: Removed this, because it's not used. 2005-03-29 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2005-03-29 Murray Cumming Add a currency_symbol member. Load/Save the currency symbol part of the 2005-03-29 Murray Cumming * examples/example_smallbusiness.glom: * glom/data_structure/numeric_format.cc: * glom/data_structure/numeric_format.h: Add a currency_symbol member. * glom/document/document_glom.cc: Load/Save the currency symbol part of the numeric format. * glom/glom.glade: * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_choose_field.h: Add a currency_symbol ComboBoxEntry. It is not used yet. 2005-03-29 Murray Cumming Allow layout field editing (editable, numeric formatting, etc) of related 2005-03-29 Murray Cumming * examples/example_smallbusiness.glom: * glom/glom.glade: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: Allow layout field editing (editable, numeric formatting, etc) of related records lists, like we already have for normal lists. 2005-03-29 Murray Cumming When creating default related records layouts, get the list of fields from 2005-03-29 Murray Cumming * examples/example_smallbusiness.glom: * glom/base_db.cc: * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: When creating default related records layouts, get the list of fields from the related table, not the parent table. Store the related records layout in the parent table's table part of the document, instead of pretending that it is a special table. 2005-03-29 Murray Cumming get_table_fields_to_show(): When creating default layouts, do not use the 2005-03-29 Murray Cumming * glom/mode_data/box_data.cc: get_table_fields_to_show(): When creating default layouts, do not use the 1000s separator with primary key IDs. 2005-03-29 Murray Cumming get_table_fields_to_show(): When creating default layouts, do not use the 2005-03-29 Murray Cumming * glom/mode_data/box_data.cc: get_table_fields_to_show(): When creating default layouts, do not use the 1000s separator with primary key IDs. 2005-03-29 Murray Cumming New class to represent the numeric format. 2005-03-29 Murray Cumming * glom/data_structure/Makefile.am: * glom/data_structure/numeric_format.cc: * glom/data_structure/numeric_format.h: New class to represent the numeric format. * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: Do special std:: stream stuff to format numbers as needed by the NumericFormat. * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Add a NumericFormat member. * glom/document/document_glom.cc: Load/Save the numeric format information with the LayoutItem. * glom/glom.glade: Add UI for the Numeric Format. * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_choose_field.h: Use the Numeric Format UI. It is only shown for numeric fields. * glom/utility_widgets/db_adddel/db_adddel.cc: Use the Numeric format for the list. * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/entryglom.cc: Use the numeric format for details views. 2005-03-26 Miloslav Trmac Updated Czech translation. 2005-03-26 Miloslav Trmac * cs.po: Updated Czech translation. 2005-03-25 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2005-03-24 Murray Cumming The beginnings of UI for numeric formatting, hidden for now. 2005-03-24 Murray Cumming * glom/glom.glade: * glom/mode_design/users/dialog_users_list.cc: * glom/mode_design/users/dialog_users_list.h: The beginnings of UI for numeric formatting, hidden for now. * glom/utility_widgets/Makefile.am: * glom/utility_widgets/combo_textglade.cc: * glom/utility_widgets/combo_textglade.h: Moved these here from glom/mode_design/fields/. 2005-03-24 Murray Cumming on_button_user_add(): Revoke all user privileges when adding a user to a * glom/mode_design/users/dialog_users_list.cc: on_button_user_add(): Revoke all user privileges when adding a user to a group, so that all the user privileges come from the group. 2005-03-23 Murray Cumming Install the glom file. In 0.8.16 I mistakenly made it not install, when 2005-03-23 Murray Cumming * glom/Makefile.am: Install the glom file. In 0.8.16 I mistakenly made it not install, when preventing the installation of a test. 2005-03-22 Murray Cumming Increased version 2005-03-22 Murray Cumming fill_from_database(): Disable the Add and Delete buttons if the current 2005-03-22 Murray Cumming * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: fill_from_database(): Disable the Add and Delete buttons if the current user does not have those priviliges. 2005-03-22 Murray Cumming Store priv_view when we store priv_edit. 2005-03-22 Murray Cumming * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: Store priv_view when we store priv_edit. * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: Do not get records if the table may not be viewed by the current user. * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: Make field contents non-visible if necessary, though we do not even fill them with data in that case anyway. * glom/mode_design/users/dialog_groups_list.cc: When setting view to false, set everything else to false too, because anything else would be stupid. 2005-03-22 Murray Cumming on_menu_userlevel_Developer(): Prevent developer mode if the user is not 2005-03-22 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/frame_glom.cc: on_menu_userlevel_Developer(): Prevent developer mode if the user is not in the developer group. 2005-03-22 Murray Cumming When editing a user, show the group (though we can not edit it here yet), 2005-03-22 Murray Cumming * glom/mode_design/users/dialog_user.cc: * glom/mode_design/users/dialog_user.h: * glom/mode_design/users/dialog_users_list.cc: When editing a user, show the group (though we can not edit it here yet), and update the password in the connection if it is the current user. 2005-03-22 Murray Cumming Add a description of the special developers group. 2005-03-22 Murray Cumming * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_groups_list.h: Add a description of the special developers group. * glom/mode_design/users/dialog_users_list.cc: * glom/mode_design/users/dialog_users_list.h: Prevent removal of the last developer. 2005-03-22 Murray Cumming Store the privileges in the LayoutItem_Field, filling them in when we get 2005-03-22 Murray Cumming * glom/base_db.cc: * glom/base_db.h: * glom/data_structure/layout/layoutitem.h: * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utility_widgets/flowtablewithfields.cc: Store the privileges in the LayoutItem_Field, filling them in when we get the field information from the database. Make widgets for non-editable fields to non-editable. * glom/frame_glom.cc: Update the layout when the Users window closes, to show changes. 2005-03-22 Miloslav Trmac Updated Czech translation. 2005-03-22 Miloslav Trmac * cs.po: Updated Czech translation. 2005-03-22 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2005-03-22 Murray Cumming Added the table_privs. Do not use an invalid map iterator, to prevent a 2005-03-22 Murray Cumming * examples/example_smallbusiness.glom: Added the table_privs. * glom/document/document_glom.cc: Do not use an invalid map iterator, to prevent a crash. 2005-03-22 Murray Cumming recreate_database(): Add the developer group and make the user a member of 2005-03-22 Murray Cumming * glom/application.cc: recreate_database(): Add the developer group and make the user a member of it. * glom/base_db.cc: * glom/base_db.h: Added get_current_privs(). * glom/data_structure/Makefile.am: * glom/data_structure/groupinfo.cc: * glom/data_structure/groupinfo.h: * glom/document/document_glom.cc: * glom/document/document_glom.h: Moved GroupInfo class out of Document_Glom. * glom/mode_design/users/dialog_groups_list.cc: Set the groups in the document when we get them from the database. But just in case we need to recreate the database from the document. 2005-03-21 Murray Cumming Add API to get/set the groups, and load/save them in the XML. Not used 2005-03-21 Murray Cumming * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/glom_document.dtd: Add API to get/set the groups, and load/save them in the XML. Not used yet. 2005-03-21 Murray Cumming Add a section to show the Groups window. Use SCROLLBARS_AUTOMATIC on some 2005-03-21 Murray Cumming * docs/website/screenshots/glom_design_groups.png: * docs/website/screenshots/index.html: Add a section to show the Groups window. * glom/glom.glade: Use SCROLLBARS_AUTOMATIC on some ScrolledWindows. 2005-03-21 Murray Cumming Remove nonsense table information. 2005-03-21 Murray Cumming * examples/example_smallbusiness.glom: Remove nonsense table information. * glom/base_db.cc: * glom/base_db.h: Add add_standard_groups() - it ensures that there is always a developer group. * glom/mode_design/users/dialog_groups_list.cc: load_from_document(): Call add_standard_groups() to ensure that the developer group always exists. on_button_group_new(): Provide sensible default privilieges for new groups. * glom/document/document_glom.cc: * glom/document/document_glom.h: Add remove_table() and remove_relationship(). * glom/navigation/box_tables.cc: on_adddel_Delete(): Remove tables from the document as well as the database server. 2005-03-21 Murray Cumming User management is now group-based, with users in groups, and permissions 2005-03-21 Murray Cumming * configure.in: * glom/Makefile.am: * glom/application.cc: * glom/base_db.cc: * glom/base_db.h: * glom/box_db.h: * glom/data_structure/Makefile.am: * glom/data_structure/tableinfo.h: * glom/document/document_glom.cc: * glom/document/document_glom.h: * glom/frame_glom.cc: * glom/glom.glade: * glom/mode_design/Makefile.am: * glom/mode_design/dialog_user.cc: * glom/mode_design/dialog_user.h: * glom/mode_design/dialog_users_list.cc: * glom/mode_design/dialog_users_list.h: * glom/mode_design/fields/combo_textglade.cc: * glom/mode_design/fields/combo_textglade.h: * glom/mode_design/users/Makefile.am: * glom/mode_design/users/dialog_choose_user.cc: * glom/mode_design/users/dialog_choose_user.h: * glom/mode_design/users/dialog_groups_list.cc: * glom/mode_design/users/dialog_groups_list.h: * glom/mode_design/users/dialog_new_group.cc: * glom/mode_design/users/dialog_new_group.h: * glom/mode_design/users/dialog_user.cc: * glom/mode_design/users/dialog_user.h: * glom/mode_design/users/dialog_users_list.cc: * glom/mode_design/users/dialog_users_list.h: * glom/navigation/box_tables.cc: * glom/utility_widgets/adddel/adddel.cc: User management is now group-based, with users in groups, and permissions for each group. 2005-03-20 Murray Cumming Fixed postgreSQL typo 2005-03-20 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2005-03-19 Murray Cumming Added very simple user administration, available from the Developer menu. 2005-03-19 Murray Cumming * glom/Makefile.am: * glom/frame_glom.cc: * glom/glom.glade: * glom/mode_data/box_data.cc: * glom/mode_design/Makefile.am: * glom/mode_design/dialog_user.cc: * glom/mode_design/dialog_user.h: * glom/mode_design/dialog_users_list.cc: * glom/mode_design/dialog_users_list.h: Added very simple user administration, available from the Developer menu. 2005-03-18 Murray Cumming Details view: You can now right-click on a Field Entry, to add a field, 2005-03-18 Murray Cumming * examples/example_smallbusiness.glom: * glom/Makefile.am: * glom/data_structure/layout/layoutitem_portal.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/treestore_layout.h: * glom/mode_design/dialog_relationships.cc: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: * glom/utility_widgets/entryglom.cc: * glom/utility_widgets/entryglom.h: * glom/utility_widgets/flowtable.cc: * glom/utility_widgets/flowtable.h: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: * glom/utility_widgets/layoutwidgetbase.cc: * glom/utility_widgets/layoutwidgetbase.h: Details view: You can now right-click on a Field Entry, to add a field, group, or related records portal after the clicked field. 2005-03-17 Murray Cumming Use better NEWS cvs url 2005-03-16 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2005-03-15 Murray Cumming Increased version 2005-03-15 Murray Cumming Moved the related record creation/warning code from 2005-03-15 Murray Cumming * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: Moved the related record creation/warning code from Box_Data_Details::on_flowtable_field_edited() into the base Box_Data class, as Box_Data::add_related_record_for_field(), and used it from Box_Data_List::on_adddell_user_changed(). This means that automatic creation of related records works from the List view too. 2005-03-15 Murray Cumming confirm_discard_unstored_data(): The buttons argument of MessageDialog is 2005-03-15 Murray Cumming * glom/mode_data/box_data.cc: confirm_discard_unstored_data(): The buttons argument of MessageDialog is not a flag - really show both buttons. * glom/mode_data/box_data_details.cc: fill_from_database(): Call set_unstored_data(false) at the end. If there really is some unstored data then it is too late at this point. 2005-03-15 Murray Cumming on_adddel_user_requested_add(): When the primary key value does not exist 2005-03-15 Murray Cumming * glom/mode_data/box_data_list.cc: on_adddel_user_requested_add(): When the primary key value does not exist yet, call on_adddel_user_added() regardless of whether the field is autoincremented. This makes record adding work again if the primary key is not auto-increment. 2005-03-15 Murray Cumming generate_next_auto_increment(): unbreak this, so that adding records works 2005-03-15 Murray Cumming * glom/data_structure/glomconversions.cc: * glom/data_structure/glomconversions.h: * glom/mode_data/box_data.cc: generate_next_auto_increment(): unbreak this, so that adding records works again if the primary key is auto incremented. 2005-03-14 Murray Cumming Glom_Db_TreeModel::on_treeview_cell_edited(): Do not set a bogus key value 2005-03-14 Murray Cumming * glom/document/document_glom.cc: * glom/mode_data/box_data_list.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utility_widgets/db_adddel/glom_db_treemodel.cc: * glom/utility_widgets/db_adddel/glom_db_treemodel.h: Glom_Db_TreeModel::on_treeview_cell_edited(): Do not set a bogus key value when a column is the first to get a value, and do not mark it as no longer a placeholder. This prevents a crash when adding two field values without yet entereing a primary value. But the primary key value is still not used when it is entered. 2005-03-14 Murray Cumming Box_Data_Details::on_flowtable_field_edited(): When it's a related field 2005-03-14 Murray Cumming * examples/example_smallbusiness.glom: * glom/box_db_table.h: * glom/data_structure/field.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: Box_Data_Details::on_flowtable_field_edited(): When it's a related field that was edited, create a related record, where allowed by the relationship, and where possible, with warnings where not. This is quite a lot of code - it should be abstracted so it can be used for the list too. 2005-03-14 Murray Cumming Add get/set_auto_create() to specify whether details and lists view should 2005-03-14 Murray Cumming * examples/example_smallbusiness.glom: * glom/glom_document.dtd: * glom/document/document_glom.cc: * glom/data_structure/relationship.cc: * glom/data_structure/relationship.h: Add get/set_auto_create() to specify whether details and lists view should automatically create related fields when the user enters data into a record that does not yet exist. * glom/mode_design/box_db_table_relationships.cc: * glom/mode_design/box_db_table_relationships.h: on_adddel_user_activated(): Do not clear the to_field when the user clicks on it. * glom/utility_widgets/db_adddel/db_adddel.cc: If allow_add is false, deactivate the Add context menu item, and do not add new-record placeholder rows. * glom/mode_data/box_data_list_related.cc: Set DbAddDel::set_allow_add() according to the relationship. 2005-03-14 Murray Cumming Increased version 2005-03-14 Murray Cumming Box_Data_List::refresh_related_fields(): Now related fields are updated in 2005-03-14 Murray Cumming * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: Box_Data_List::refresh_related_fields(): Now related fields are updated in the details view when the key value changes in the record. Dialog_Layout_List: The edit button now edits the properties of the current layout field. 2005-03-14 Murray Cumming refresh_related_fields(): The list view now updates the displayed value of 2005-03-14 Murray Cumming * glom/mode_data/box_data_list.cc: refresh_related_fields(): The list view now updates the displayed value of related fields when you change the related key value in the current record. 2005-03-14 Murray Cumming Db_AddDel::get_column_index() now returns a list of indexes, so that 2005-03-14 Murray Cumming * glom/mode_data/box_data_list.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Db_AddDel::get_column_index() now returns a list of indexes, so that set_value() updates the value in all columns when a field is present more than once. 2005-03-14 Murray Cumming Db_AddDel::set_value(), and get_value() now identify the column by a 2005-03-14 Murray Cumming * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: Db_AddDel::set_value(), and get_value() now identify the column by a LayoutItem_Field instead of a numerical index, so at least the inefficient index discovery is restricted to one method in Db_AddDel. 2005-03-14 Murray Cumming on_adddel_user_changed(): Editing of related fields in the list view now 2005-03-14 Murray Cumming * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: on_adddel_user_changed(): Editing of related fields in the list view now works, using mostly copy/pasted code from Box_Data_List::on_flowtable_field_edited(). 2005-03-14 Murray Cumming LayoutItem_Field: Add get_has_relationship_name() to reduce unnecessary 2005-03-14 Murray Cumming, * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_design/box_db_table_relationships.cc: LayoutItem_Field: Add get_has_relationship_name() to reduce unnecessary string copying. 2005-03-14 Murray Cumming Editing of related fields on the details view now works. 2005-03-14 Murray Cumming * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/utility_widgets/flowtablewithfields.cc: Editing of related fields on the details view now works. 2005-03-13 Murray Cumming FlowTableWithFields and Db_AddDel: Now identify fields via 2005-03-13 Murray Cumming * glom/box_db_table.cc: * glom/box_db_table.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_details.h: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_design/box_db_table_relationships.cc: * glom/utility_widgets/db_adddel/db_adddel.cc: * glom/utility_widgets/db_adddel/db_adddel.h: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: FlowTableWithFields and Db_AddDel: Now identify fields via LayoutItem_Field rather than just Field, so related fields do not get confused with regular fields. This should allow me to make editing of related fields work soon. 2005-03-13 Murray Cumming build_sql_select_with_where_clause(): Use a LEFT OUTER JOIN for the 2005-03-13 Murray Cumming * examples/example_smallbusiness.glom: * glom/mode_data/box_data.cc: build_sql_select_with_where_clause(): Use a LEFT OUTER JOIN for the related fields, because this does not hide records from the parent table when the key values are bogus, and does not give us duplicate records. 2005-03-13 Murray Cumming Stop storing the table name in the layoutitem, and saving it in the 2005-03-13 Murray Cumming * examples/example_smallbusiness.glom: * glom/data_structure/layout/layoutitem.h: * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: * glom/document/document_glom.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list.h: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: * glom/utility_widgets/flowtablewithfields.cc: * glom/utility_widgets/flowtablewithfields.h: * glom/utility_widgets/layoutwidgetbase.cc: * glom/utility_widgets/layoutwidgetbase.h: Stop storing the table name in the layoutitem, and saving it in the document. It was a nasty hack, and it's better to cache it in the LayoutWidgetBase. It's only needed anyway for right-click layout editing. Moved SQL-building code into a reusable method in Box_Data and used it from both Box_Data_List and Box_Data_Details. This means that the List view can now also show related fields. Editing of related fields does not work yet, and the SELECT statement is not quite right - it sometimes gets duplicate records. 2005-03-13 Murray Cumming get_fields_to_show(): Reduce code duplication by calling the code in 2005-03-13 Murray Cumming,,, * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_list_related.cc: get_fields_to_show(): Reduce code duplication by calling the code in Box_Data. 2005-03-12 Murray Cumming The Field Chooser dialog now offers fields from relationships, and the 2005-03-12 Murray Cumming * examples/example_smallbusiness.glom: * glom/box_db_table.cc: * glom/mode_data/box_data.cc: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_layout_details.cc: * glom/mode_design/fields/dialog_fielddefinition.cc: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: * glom/utility_widgets/flowtablewithfields.cc: The Field Chooser dialog now offers fields from relationships, and the field data will be properly displayed on the details view. Editing of related fields does not work yet, and the list view can not do this yet. 2005-03-12 Murray Cumming Store vector of layouts instead of vector of fields for list and details 2005-03-12 Murray Cumming * glom/box_db.cc: * glom/box_db_table.cc: * glom/box_db_table.h: * glom/mode_data/box_data.cc: * glom/mode_data/box_data.h: * glom/mode_data/box_data_details.cc: * glom/mode_data/box_data_list.cc: * glom/mode_data/box_data_list.h: * glom/mode_data/box_data_list_related.cc: * glom/mode_data/box_data_list_related.h: * glom/mode_data/dialog_layout.cc: * glom/mode_data/dialog_layout.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list.h: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_design/fields/box_db_table_definition.cc: * glom/mode_design/fields/box_db_table_definition.h: * glom/mode_find/box_data_details_find.cc: * glom/mode_find/box_data_list_find.cc: Store vector of layouts instead of vector of fields for list and details views. Field Chooser dialog also uses layout items so it can edit the full field information, including the relationship, and the formatting in future. 2005-03-12 Murray Cumming Changing the selected relationship when choosing a field now changes the 2005-03-12 Murray Cumming * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_choose_field.h: * glom/mode_data/dialog_layout_list_related.cc: Changing the selected relationship when choosing a field now changes the list of available fields. 2005-03-12 Murray Cumming LayoutItem_Fields now contain an optional relationship_name. When choosing 2005-03-12 Murray Cumming * examples/example_smallbusiness.glom: * glom/data_structure/layout/layoutgroup.h: * glom/data_structure/layout/layoutitem_field.cc: * glom/data_structure/layout/layoutitem_field.h: * glom/document/document_glom.cc: * glom/glom.glade: * glom/glom_document.dtd: * glom/mode_data/dialog_choose_field.cc: * glom/mode_data/dialog_choose_field.h: * glom/mode_data/dialog_layout.h: * glom/mode_data/dialog_layout_details.cc: * glom/mode_data/dialog_layout_details.h: * glom/mode_data/dialog_layout_list.cc: * glom/mode_data/dialog_layout_list.h: * glom/mode_data/dialog_layout_list_related.cc: * glom/mode_data/dialog_layout_list_related.h: * glom/mode_data/treestore_layout.h: * glom/mode_design/fields/combo_textglade.cc: * glom/mode_design/fields/combo_textglade.h: * glom/utility_widgets/datawidget.cc: * glom/utility_widgets/datawidget.h: LayoutItem_Fields now contain an optional relationship_name. When choosing fields, you can choose the relationship. 2005-03-11 Murray Cumming :MessageDialog::set_secondary_text() to make dialogs more HIGy, plus use 2005-03-11 Murray Cumming * Lots of use of Gtk::MessageDialog::set_secondary_text() to make dialogs more HIGy, plus use of set_transient_for(). 2005-03-11 Murray Cumming Attempt to use Glib::Option from glibmm 2.6, to provide a --file option, 2005-03-11 Murray Cumming * glom/main.cc: Attempt to use Glib::Option from glibmm 2.6, to provide a --file option, for debugging. But it does not work, probably because of conflicts with the libgnomeui and libgda uses of argc and argv. 2005-03-11 Murray Cumming glom now depends on gtkmm 2.6. Derive from the Gtk::CellRendererCombo in 2005-03-11 Murray Cumming * glom now depends on gtkmm 2.6. * glom/utility_widgets/adddel/cellrendererlist.[h|cc]: Derive from the Gtk::CellRendererCombo in gtkmm 2.6, instead of implementing all this ourselves. 2005-03-11 Miloslav Trmac Updated Czech translation. 2005-03-11 Miloslav Trmac * cs.po: Updated Czech translation. 2005-03-11 Murray Cumming Added screenshot comment 2005-03-11 Murray Cumming Added screenshot comment 2005-03-11 Murray Cumming Added screenshot comment 2005-03-10 Murray Cumming Increased version. 2005-03-10 Murray Cumming get_primary_key(): Return true for success, so that 2005-03-10 Murray Cumming * glom/mode_data/box_data_list.cc: get_primary_key(): Return true for success, so that Box_Data::record_delete() works again, so that deleting records really deletes them from the database again. 2005-03-10 Murray Cumming Redid the screenshots and put them on a page. 2005-03-10 Murray Cumming * docs/website/: Redid the screenshots and put them on a page. 2005-03-10 Murray Cumming Invoices Lines: Lookup up the product name and price from the products 2005-03-10 Murray Cumming * examples/example_small_business.glom: Invoices Lines: Lookup up the product name and price from the products table. 2005-03-10 Murray Cumming Use a list of field info instead of a map, and search through it all 2005-03-10 Murray Cumming * glom/utility_widgets/flowtable_withfields.[h|cc]: Use a list of field info instead of a map, and search through it all instead of using the map key, so we can have the same field more than once in a group. Otherwise, people change a field and see it disappear if it is already there. 2005-03-10 Murray Cumming on_flowtable_layout_changed(): Update the data as well as the structure, 2005-03-10 Murray Cumming * glom/mode_data/box_data_details.cc: on_flowtable_layout_changed(): Update the data as well as the structure, because updating the structure clears the widgets. 2005-03-10 Murray Cumming Show a Choose Field context menu when in developer mode, and signal to the 2005-03-10 Murray Cumming * glom/mode_data/entry_glom.[h|cc]: Show a Choose Field context menu when in developer mode, and signal to the DataWidget when it has been selected. * glom/mode_data/dialog_choose_field.[h|cc]: set_document(): Select the current field at the start. Make double-click choose a field. 2005-03-09 Murray Cumming Added missing files 2005-03-09 Murray Cumming Attempt to add a context menu to choose the field. Not working yet. Some 2005-03-09 Murray Cumming * glom/mode_data/datawidget.[h|cc]: Attempt to add a context menu to choose the field. Not working yet. Some EventBox problem maybe. 2005-03-08 Murray Cumming Invoices table: Make the contact name lookup a name from the contacts 2005-03-08 Murray Cumming * examples/example_small_business.glom: Invoices table: Make the contact name lookup a name from the contacts table. 2005-03-08 Murray Cumming More use of the stored primary key fields instead of getting them from the 2005-03-08 Murray Cumming * glom/mode_data/: More use of the stored primary key fields instead of getting them from the list of fields via their index. This means that the primary key can still be used when it is not shown. * glom/mode_data/box_data_list_related.cc: Set the foreign key value even if it is not shown. This means that related records portals no longer need to show the primary key or the foreign key, both of which are uninteresting to most operators. 2005-03-08 Murray Cumming Remove as_value from method names because they are all by value. Added 2005-03-08 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Remove as_value from method names because they are all by value. Added get/set_key_field() so it is easy to know the primary key for the table. * glom/utility_widgets/db_adddel/glom_db_treemodel.[h|cc]: create() now takes a list of fields - one for each column. This should allow us to construct a SQL query from the model itself in future. * glom/mode_data/box_data_list.[h|cc]: Store the primary key field in the AddDel. * glom/mode_data/box_data_details.[h|cc]: Store the primary key field in a member variable, instead of iterating for it every time. 2005-03-08 Murray Cumming get_portals(): Actually add relevant portals to the list. 2005-03-08 Murray Cumming * glom/utility_widgets/flowtable_withfields.cc: get_portals(): Actually add relevant portals to the list. * glom/mode_data/box_data_list_related.cc: on_record_added(): When the to_field key is not auto-generated, really set it to the foreign key value, not to null. This makes adding of related records work, but so far only when all key fields are shown in the layout. 2005-03-07 Murray Cumming on_treeview_button_press_event(): Test the bool return from 2005-03-07 Murray Cumming * glom/utility_widgets/adddel/adddel.cc, db_adddel/db_adddel.cc: on_treeview_button_press_event(): Test the bool return from TreeView::get_path_at_pos to avoid using an invalid path. This stops the warning when right clicking where there is no row. 2005-03-07 Murray Cumming on_treeview_button_press_event(): Test the bool return from 2005-03-07 Murray Cumming * glom/utility_widgets/adddel/adddel.cc, db_adddel/db_adddel.cc: on_treeview_button_press_event(): Test the bool return from TreeView::get_path_at_pos to avoid using an invalid path. This stops the warning when right clicking where there is no row. 2005-03-07 Murray Cumming Show/edit the relationship titles here too. on_dialog_layout_hide(): 2005-03-07 Murray Cumming * glom/mode_design/box_db_table_relationship.[h|cc]: Show/edit the relationship titles here too. * glom/mode_data/box_data_list_related.cc: on_dialog_layout_hide(): Update the relationship title in case it has changed. 2005-03-07 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2005-03-06 Murray Cumming Constructor: Set a new layout name, so that the portals layouts are not 2005-03-06 Murray Cumming * glom/mode_data/box_data_list_related.cc: Constructor: Set a new layout name, so that the portals layouts are not confused with the standard layouts for those tables in the document. Use the new layout dialog. * glom/mode_data/: Add dialog_layout_list_related.[h|cc]. * glom/glom.glade: Define the new dialog. 2005-03-06 Murray Cumming on_adddel_user_requested_delete(): Ask the user whether he really wants to 2005-03-06 Murray Cumming * glom/mode_data/box_db_list.cc: on_adddel_user_requested_delete(): Ask the user whether he really wants to delete the record. * glom/utilities/db_adddel.[h|cc]: Add a layout item to the right click menu, so that people can right click to edit list layouts and related records layouts. Still need to give related records layouts an id other than their underlying table. 2005-03-06 Murray Cumming on_adddel_user_requested_delete(): Ask the user whether he really wants to 2005-03-06 Murray Cumming * glom/mode_data/box_db_list.cc: on_adddel_user_requested_delete(): Ask the user whether he really wants to delete the record. * glom/utilities/db_adddel.[h|cc]: Add a layout item to the right click menu, so that people can right click to edit list layouts and related records layouts. Still need to give related records layouts an id other than their underlying table. 2005-03-04 Murray Cumming on_document_load(): Warn if the user recreates a database using a 2005-03-04 Murray Cumming * glom/application.cc: on_document_load(): Warn if the user recreates a database using a read-only installed example file. * glom/frame_glom.cc: on_menu_userlevel_Developer(): If developer mode is not possible then warn the user and set it back to operator mode. 2005-02-22 Laurent Dhima Updated Albanian translation. 2005-02-22 Laurent Dhima * sq.po: Updated Albanian translation. 2005-02-19 Murray Cumming Increased version 2005-02-19 Murray Cumming Make this actually work, by calling row_inserted(), row_deleted(), and 2005-02-19 Murray Cumming * glom/utility_widgets/db_addel/glom_db_treemodel.[h|cc]: Make this actually work, by calling row_inserted(), row_deleted(), and row_changed() in the appropriate places. This needs some speed optimisation and probably has some memory leaks of the GlueItems. 2005-02-19 Murray Cumming removed some comments 2005-02-19 Murray Cumming Fixed double-delete. TreeModel still not working fully. 2005-02-19 Murray Cumming custom tree model almost works yet more. 2005-02-19 Murray Cumming custom tree model almost works a bit more. 2005-02-19 Murray Cumming Use the Gda::Value-based treemodel. It almost works. 2005-02-19 Murray Cumming * glom/utility_widgets/db_adddel/db_adddel.[h|cc]: Use the Gda::Value-based treemodel. It almost works. 2005-02-18 Murray Cumming Added a Gda::Value-based custom treemodel, but it's not used yet. 2005-02-18 Murray Cumming * glom/utility_widgets/db_addel/: Added a Gda::Value-based custom treemodel, but it's not used yet. 2005-02-18 Murray Cumming Removed sources that are duplicated in adddel, and just include them from 2005-02-18 Murray Cumming * glom/utility_widgets/db_adddel/: Removed sources that are duplicated in adddel, and just include them from there. We can not using the custom popup cellrenderer anyway when we start using gtkmm 2.6. 2005-02-17 Murray Cumming No longer uses Fields and Gda::Values at all. A version of AddDel that 2005-02-17 Murray Cumming * glom/utility_widgets/adddel/: No longer uses Fields and Gda::Values at all. * glom/utility_widgets/db_addel/: A version of AddDel that deals with Fields and their Gda::Values, and nothing else. * glom/mode_data/box_data_list.[h|cc]: Use DbAddDel instead of AddDel, which deals with Values directly. * glom/data_structure/glomconversions.cc: parse_data() Prevent 0 days and months, to avoid postgres errors. 2005-02-16 Murray Cumming Fixed build 2005-02-16 Murray Cumming Commit half-baked stuff so I can try a clean checkout of it. 2005-02-16 Murray Cumming Increased version 2005-02-16 Murray Cumming init_db_details(): Get shared connection earlier and keep it longer, so 2005-02-16 Murray Cumming * glom/mode_data/box_data_list.cc, box_data_details.cc: init_db_details(): Get shared connection earlier and keep it longer, so that we make fewer individual connections when getting data from the database. This make things faster. 2005-02-16 Murray Cumming get_column_field(): Return the id, which is the field name, not the name, 2005-02-16 Murray Cumming * glom/utility_widgets/addedel/adddel.cc: get_column_field(): Return the id, which is the field name, not the name, which is the field title. This allows data entry in the list view when field titles are not equal to the names. 2005-02-15 Murray Cumming Actually use the host details, so people can connect to postgres servers 2005-02-15 Murray Cumming * glom/connectionpool.cc: Actually use the host details, so people can connect to postgres servers that are not on the local host. 2005-02-13 David Lodge Updated British translation. 2005-02-13 David Lodge * en_GB.po: Updated British translation. 2005-02-10 Murray Cumming Added postgres API test. 2005-02-10 Murray Cumming connect(): Specify the template1 default database when we do not want to 2005-02-10 Murray Cumming * glom/connection_pool.cc: connect(): Specify the template1 default database when we do not want to specify a database, because that seems to fail with newer versions of postgres, or on some systems, though I am not sure where it works and where it does not. Hopefully this template1 name is used on all distros. 2005-02-10 Murray Cumming Commit automatic changes 2005-01-05 Murray Cumming Add intltool-extract.in, intltool-merge.in, intltool-update.in to 2005-01-05 Murray Cumming * Makefile.am: Add intltool-extract.in, intltool-merge.in, intltool-update.in to EXTRA_DIST, possibly fixing the build on some platforms. Bug #162932. 2004-12-26 Murray Cumming Added start of document about postgres setup. 2004-12-26 Murray Cumming constructor: Show the AddDel widget so that it actually appears on the 2004-12-26 Murray Cumming * glom/mode_data/box_data_list_related.cc: constructor: Show the AddDel widget so that it actually appears on the Details layout. Put the AddDel in a HIG-style frame. 2004-12-25 Murray Cumming Added a remove() override, so we remove the widget from the list in 2004-12-25 Murray Cumming * glom/utility_widgets/flowtable.[h|cc]: Added a remove() override, so we remove the widget from the list in flowtable as well as from the base GtkContainer list. Do an extra reference() before calling gtk_widget_parent() if the widget is managed, like Gtk::Container::remove() does, so that this container acts like other gtkmm containers. 2004-12-24 Murray Cumming Keep a list of the portals, so we don't have to dynamic_cast the standard 2004-12-24 Murray Cumming * glom/utility_widgets/flowtable_withfields.[h|cc]: Keep a list of the portals, so we don't have to dynamic_cast the standard children() list so much. Use Bakery::View::remove_view() and delete in remove_all(). 2004-12-24 Murray Cumming #included libintl.h to fix build on some systems. Bug 161936 from Mike 2004-12-24 Murray Cumming * glom/dialog_connection.cc: #included libintl.h to fix build on some systems. Bug 161936 from Mike Castle. 2004-12-23 Murray Cumming init_db_details(): Remove the database_name parameter, because we only 2004-12-22 Murray Cumming * glom/base_db.[h|]cc], and all its derived classes: init_db_details(): Remove the database_name parameter, because we only every use one database now, and it is specified in the connection. Also split init_db_details() into init_db_details() and refresh_init_details(), so we can refresh the data without rebuilding the whole structure. * glom/mode_data/box_data_list_related.[h|cc]: Added get_relationship(). * glom/utility_widgets/flowtable_withfields.[h|cc]: Added protected get_portals() to get all the related records portals whose from_key is the specified field. set_field_value(): Look for portals that should refresh when the field value changes, and refresh them. Make FlowTableWithFields inherit from View_Composite_Glom, so that it can be a sub-view, so that it can access the document, so that it can get the full Relationship details instead of just the relationship name. 2004-12-22 Vincent van Adrighem Translation updated by Tino Meinen. 2004-12-22 Vincent van Adrighem * nl.po: Translation updated by Tino Meinen. 2004-12-21 Hendrik Brandt Updated German translation. 2004-12-21 Hendrik Brandt * de.po: Updated German translation. 2004-12-12 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2004-12-11 Miloslav Trmac Updated Czech translation. 2004-12-11 Miloslav Trmac * cs.po: Updated Czech translation. 2004-12-10 Murray Cumming save_to_document(): Set the sequences of top-level groups, so they do not 2004-12-10 Murray Cumming * glom/mode_data/dialog_layout_details.cc: save_to_document(): Set the sequences of top-level groups, so they do not all get the default zero, so that they all get loaded again, without replacing each other. * glom/glom.glade: dialog_design_layout: Added an Add Related button. Added dialog_choose_relationship. * glom/mode_data/treestore_layout.[h|cc]: Change the is_group model column to a enumed type column, so that items can be 1 of more than 2 things. * glom/mode_data/dialog_layout_details.cc: Use the Add Related button, and the changed model column type. * glom/mode_data/: Added dialog_choose_relationship.[h|cc]. * glom/data_structures/: Added layoutitem_related.[h|cc]. * glom/document/document_glom.[h|cc]: save_before(), load_after(): Load and save the new layout item type. * glom/navigation/box_tables.cc: fill_from_database(): Show the table title instead of the name when in operator mode. 2004-12-09 Hendrik Brandt Updated German translation. 2004-12-09 Hendrik Brandt * de.po: Updated German translation. 2004-12-08 Murray Cumming Upload to my dreamhost account instead of sourceforge, so I can stop using 2004-12-08 Murray Cumming * docs/Makefile: Upload to my dreamhost account instead of sourceforge, so I can stop using sourceforge altogether. 2004-12-08 Christian Krause :wrap() build error with gcc 3.4.3. Bug #160245. 2004-12-08 Christian Krause * Patch to fix Glib::wrap() build error with gcc 3.4.3. Bug #160245. 2004-12-07 Miloslav Trmac Updated Czech translation. 2004-12-07 Miloslav Trmac * cs.po: Updated Czech translation. 2004-12-07 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2004-12-06 Murray Cumming Gave lots of dialogs default buttons. 2004-12-06 Murray Cumming * glom/glom.glade: Gave lots of dialogs default buttons. 2004-12-06 Murray Cumming get_text_for_gda_value(): return empty string instead of NULL, because 2004-12-06 Murray Cumming * glom/data_structure/glom_conversions.cc: get_text_for_gda_value(): return empty string instead of NULL, because this the result is meant for user display, not for SQL. * glom/data_structure/field.cc: sql(): Return NULL for non-text null. 2004-12-06 Murray Cumming load_after_layout_group(): Check for null pointers to avoid crash when 2004-12-06 Murray Cumming * glom/Document/document_glom.cc: load_after_layout_group(): Check for null pointers to avoid crash when opening some documents. 2004-12-06 Murray Cumming offer_new_or_existing(): Remove double delete of the dialog, to stop crash 2004-12-06 Murray Cumming * glom/application.cc: offer_new_or_existing(): Remove double delete of the dialog, to stop crash when creating new documents. 2004-12-06 Funda Wang Added Simplified Chinese translation 2004-12-05 Murray Cumming Added the examples directory 2004-12-05 Murray Cumming Add recreate_database() and use it from on_document_load() instead of 2004-12-05 Murray Cumming * glom/application.[h|cc]: Add recreate_database() and use it from on_document_load() instead of showing the not-yet-implemented dialog. 2004-12-05 Murray Cumming Define ExceptionConnection, derived from std::exception. connect(): When 2004-12-03 Murray Cumming * glom/connection_pool.[h|cc]: Define ExceptionConnection, derived from std::exception. connect(): When attempting to connect to a specific database, try to connect to the server in general. Throw an exception that tells the caller that the connection details are OK, but that the database does not exist yet. * glom/application.cc: on_document_load(): If the connection fails only because the database does not exist yet, then offer to recreate it. Recreation is not actually implemented, however. Return true/false (requires bakery 2.3.11) so that the document will be closed if the user cancels a dialog during loading. 2004-12-04 Funda Wang Added Simplified Chinese translation 2004-12-03 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2004-12-01 Miloslav Trmac Updated Czech translation. 2004-12-01 Miloslav Trmac * cs.po: Updated Czech translation. 2004-11-30 Murray Cumming Updated NEWS 2004-11-30 Murray Cumming offer_new_or_existing(): Respond to cancel of the new-database dialog. 2004-11-30 Murray Cumming * glom/application.cc: offer_new_or_existing(): Respond to cancel of the new-database dialog. * glom/frame_glom.cc: alert_no_table(): Update the message. See the TODO. 2004-11-29 Murray Cumming Show an informative dialog if the connection fails. Add the 2004-11-29 Murray Cumming * glom/frame.cc create_database(): Show an informative dialog if the connection fails. * glom/glom.glade: Add the dialog_error_connection dialog. * glom/mode_data/box_data_list.cc: on_adddel_user_requested_add(): Prevent crash when there is only one field and it is auto-generating. And actually add a row in this case without requiring data entry. 2004-11-28 Murray Cumming connect(): specify the database name in the connection string, when it is 2004-11-28 Murray Cumming * glom/connectoin_pool.cc: connect(): specify the database name in the connection string, when it is wanted, instead of using change_database(), because libgda needs that. 2004-11-28 Murray Cumming Added get/set_database() because postgres seems to need this specified at 2004-11-28 Murray Cumming * glom/data_structure/connection_pool.[h|cc]: Added get/set_database() because postgres seems to need this specified at connection time. * glom/dialog_connection.cc: Use ConnectionPool::set_database(). * Removed several extra ;s that g++ 3.4 complains about. 2004-11-25 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2004-11-24 Miloslav Trmac Updated Czech translation. 2004-11-24 Miloslav Trmac * cs.po: Updated Czech translation. 2004-11-21 David Lodge Updated British translation. 2004-11-21 David Lodge * en_GB.po: Updated British translation. 2004-11-21 Murray Cumming Override Bakery::App::init_menus_file to remove useless Save and Save-As 2004-11-21 Murray Cumming * glom/application.[h|cc]: Override Bakery::App::init_menus_file to remove useless Save and Save-As menu items. offer_new_or_existing(): Prefix new databases with glom_. The whole name could maybe be autogenerated in future. Start with an unprefixed name based on the filename. Offer a database name and title based on the filename. * glom/Document/document_glom.[h|cc]: Added get/set_database_title(), and save/load it in save_before() and load_after(). * configure.in: Depend on bakery 2.3.9 because we need the new behaviour of Bakery::Document::get_name() for the default database name. Increase version. 2004-11-21 Miloslav Trmac Updated Czech translation. 2004-11-21 Miloslav Trmac * cs.po: Updated Czech translation. 2004-11-20 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2004-11-20 Murray Cumming Added dialog_new_database.[h|cc], to request database name and title. 2004-11-19 Murray Cumming * glom/: Added dialog_new_database.[h|cc], to request database name and title. * glom/: Added dialog_connection.[h|cc]: to replace glom/navigation/box_databases.[h|cc]. * glom/frame.[h|cc]: Added create_database(). * glom/application.[h|cc]: Ask for a new database name when creating new documents, and do not allow the user to navigate to a different database. * glom/glom.glade: UI for the 2 new dialogs. 2004-11-17 Murray Cumming Use noinst_PROGRAMS instead of bin_PROGRAMS so that my little test does 2004-11-17 Murray Cumming * utility_widgets/Makefile.am: Use noinst_PROGRAMS instead of bin_PROGRAMS so that my little test does not get installed. 2004-11-14 Murray Cumming Draw some simple dotted lines between the items to make the design mode 2004-11-14 Murray Cumming * utility_widgets/flowtable.[h|cc]: Draw some simple dotted lines between the items to make the design mode look different than the data mode. * mode_data/box_data_details.[h|cc]: Override on_userlevel_changed() to call FlowTable::set_design_mode(), to show or hide the lines. This doesn't quite work - it draws more lines immediately after switching to developer mode, but less when just switching tabs. * Document_Glom::get_table_info_with_add(): Set the table name of the new info when it adds, so that we actually remember new tables. 2004-11-06 Amanpreet Singh Alam add Punjabi 2004-11-06 Amanpreet Singh Alam add pa 2004-10-29 Mike Castle Added lots of libintl.h includes to fix build on some platforms. 2004-10-29 Mike Castle * Added lots of libintl.h includes to fix build on some platforms. 2004-10-17 Baris Cicek Added tr to ALL_LINGUAS 2004-10-17 Baris Cicek Updated Turkish Translation by Evren Alim * tr.po: Updated Turkish Translation by Evren Alim 2004-09-08 David Lodge Updated British translation. 2004-09-08 David Lodge * en_GB.po: Updated British translation. 2004-09-07 Vincent van Adrighem Translation updated by Tino Meinen. 2004-09-08 Vincent van Adrighem * nl.po: Translation updated by Tino Meinen. 2004-08-20 Francisco Javier F. Serrador Updated Spanish translation. 2004-08-20 Francisco Javier F. Serrador * es.po: Updated Spanish translation. 2004-08-20 Laurent Dhima Updated Albanian translation. 2004-08-20 Laurent Dhima * sq.po: Updated Albanian translation. 2004-08-18 Laurent Dhima Updated Albanian translation. 2004-08-18 Laurent Dhima * sq.po: Updated Albanian translation. 2004-08-13 Duarte Loreto Updated Portuguese translation. 2004-08-13 Duarte Loreto * pt.po: Updated Portuguese translation. 2004-08-12 Gustavo Maciel Dias Vieira Updated Brazilian Portuguese translation done by Raphael Higino 2004-08-12 Gustavo Maciel Dias Vieira * pt_BR.po: Updated Brazilian Portuguese translation done by Raphael Higino . 2004-08-11 Ankitkumar Rameshchandra Patel ankit@redhat.com 11/08/2004 * configure.in : Added gu to ALL_LINGUAS 2004-08-11 Ankitkumar Rameshchandra Patel ankit@redhat.com 11/08/2004 * gu.po : Gujarati Translation Added 2004-08-11 Ankitkumar Rameshchandra Patel ankit@redhat.com 11/08/2004 2004-08-10 Miloslav Trmac Updated Czech translation. 2004-08-11 Miloslav Trmac * cs.po: Updated Czech translation. 2004-08-10 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2004-08-09 Murray Cumming 0.8.8: 2004-08-09 Murray Cumming * glom/data_structure/: Added layouts sub-directory, and moved layout classes into it. Created a polymorphic heirarchy of layout items - currently LayoutItem_Field and LayoutGroup for fields and groups of fields. * glom/data_structure/layoutgroup.[h|cc]: Removed m_others. Designers must put fields in a top-level group with no title, and that's the default. * glom/document/document_glom.[h}cc]: Allow nested layout groups. * glom/mode_data/dialog_layout_details.[h|cc]: Use only one TreeView instead of 2, using a TreeStore instead of a ListStore, to show fields inside groups, and with nested groups. Allow the user to specify the number of columns for the groups. * glom/mode_data/: Added treestore_layout.[h|cc], so that we can override the vfunc to control whether items can be dragged into other items. 2004-08-04 Adam Weinberger Updated Canadian English translation. * en_CA.po: Updated Canadian English translation. 2004-07-30 Murray Cumming Explain how to use glom as an Operator and as a Developer. 2004-07-18 Murray Cumming * docs/user-guide/C/glom.xml: Explain how to use glom as an Operator and as a Developer. 2004-07-13 Murray Cumming * glom/data_structure/field.cc: sql(): Create sql text representation depending on the expected value type rather than the actual value type, to prevent SQL errors when using relationships between fields of different types. 2004-07-29 Laurent Dhima Updated Albanian translation. 2004-07-29 Laurent Dhima * sq.po: Updated Albanian translation. 2004-07-28 Laurent Dhima Updated Albanian translation. 2004-07-28 Laurent Dhima * sq.po: Updated Albanian translation. 2004-07-17 David Lodge Updated British translation 2004-07-17 David Lodge * en_GB.po: Updated British translation 2004-07-14 Gustavo Maciel Dias Vieira Updated Brazilian Portuguese translation done by Raphael Higino 2004-07-14 Gustavo Maciel Dias Vieira * pt_BR.po: Updated Brazilian Portuguese translation done by Raphael Higino . 2004-07-13 Murray Cumming Actually delete relationships when the Delete button is pressed. 2004-07-13 Murray Cumming * glom/mode_design/tables_relationships.[h|cc]: Actually delete relationships when the Delete button is pressed. 2004-07-12 Francisco Javier F. Serrador Added Spansih translation by Antonio Ognio. 2004-07-12 Francisco Javier F. Serrador * es.po: Added Spansih translation by Antonio Ognio. 2004-07-12 Murray Cumming Increased version 2004-07-11 Murray Cumming Increased version for a release soon. 2004-07-10 Laurent Dhima Added sq to ALL_LINGUAS. 2004-07-10 Laurent Dhima * configure.in: Added sq to ALL_LINGUAS. 2004-07-10 Laurent Dhima Added Albanian translation. 2004-07-10 Laurent Dhima * sq.po: Added Albanian translation. 2004-07-09 Murray Cumming get_item_max_width(): Don't ignore the vertical padding between widgets, 2004-07-09 Murray Cumming * glom/utility_widgets/flowtable.cc: get_item_max_width(): Don't ignore the vertical padding between widgets, so that this does not incorrectly report that more items could be in the column. on_size_allocate(): Use = instead of += when using the single_items width to get the maximum width, to prevent a big gap between the first and second columns. 2004-07-08 Murray Cumming save_before(): Store the layout item sequence, so that the layout is not 2004-07-09 Murray Cumming * glom/document/document_glom.cc: save_before(): Store the layout item sequence, so that the layout is not lost after a couple of saves. 2004-07-08 Murray Cumming load_after(): Load the field calculation from the field node rather than 2004-07-08 Murray Cumming * glom/document/document_glom.cc: load_after(): Load the field calculation from the field node rather than the lookup node, because that is where we saved it. 2004-07-08 Murray Cumming Make the application quit if the user presses cancel on the 2004-07-08 Murray Cumming * glom/main.cc, application.[h|cc]: Make the application quit if the user presses cancel on the new-or-existing dialog. 2004-07-08 Murray Cumming Make glom_evaluate_python_function_implementation() return a Value instead 2004-07-08 Murray Cumming * glom/glom_python.cc: Make glom_evaluate_python_function_implementation() return a Value instead of a string, and take a field type parameter. * glom/box_db_table.cc: Remove record_new(). * glom/mode_data/box_data.cc: Rename record_new_from_entered() to record_new() with an optional use_entered bool parameter, and use this everywhere instead of record_new_from_entered. This means that the first value entered in a new record in the list view will not be forgotten. Also, this now sets the default value from calculations where that is specified. 2004-07-08 Hendrik Brandt Updated German translation. 2004-07-08 Hendrik Brandt * po/de.po: Updated German translation. 2004-07-08 Murray Cumming Added datawidget.[h|cc]: This widget can hold either an EntryGlom or a 2004-07-08 Murray Cumming * glom/utility_widgets/: Added datawidget.[h|cc]: This widget can hold either an EntryGlom or a checkbox, depending on the field type. Used this in the Field Definition dialog and the FlowTableWithFields for the Details view. 2004-07-08 Murray Cumming parse_value(): Return success when parsing empty date, time, and numbers 2004-07-08 Murray Cumming * glom/data_structure/glomconversions: parse_value(): Return success when parsing empty date, time, and numbers as nulls. * glom/mode_design/fields/dialog_fielddefinition.cc: on_combo_lookup_relationship_changed(): Clear the list of fields before adding more. * glom/utility_widgets/flowtablewithfields.cc: Add a checkbox instead of an entryglom if it is a boolean field. 2004-07-07 Miloslav Trmac Updated Czech translation. 2004-07-07 Miloslav Trmac * cs.po: Updated Czech translation. 2004-07-06 Murray Cumming website updates 2004-07-06 Murray Cumming GLOM_ARG_ENABLE_WARNINGS: Add -Wno-long-long so that the C++ compiler does 2004-07-06 Murray Cumming * Embed python for calculated fields: * scripts/macros.m4: GLOM_ARG_ENABLE_WARNINGS: Add -Wno-long-long so that the C++ compiler does not complain about the long longs in the python headers. * Added acinclude.m4, copied from pygtk, with additions from the version in Plannet. Used the AM_CHECK_PYTHON_INCLUDES macro in configure.in to detect the python headers and libs. * glom/glade.glom: Added widgets for field calculation to the Field Definition dialog. * glom/mode_design/fields/dialog_fielddefinition.[h|cc]: Load and save the field calculation. * glom/mode_design/fields/: Added dialog_fieldcalculation.[h|cc] that can be opened from the Field Definition window to edit and test the python code. * glom/: Added glom_python.[h|cc]: With a function that can evaluate arbitrary python code as if it is a python function definition. * glom/main.cc: Intialize and terminate the python runtime. 2004-07-06 Murray Cumming increased version 2004-07-05 Murray Cumming Accept a URI on the command line, and use it to open an existing document 2004-07-05 Murray Cumming * glom/main.cc: Accept a URI on the command line, and use it to open an existing document if any. * glom/application.[h|cc]: Add URI parameter to init(), and use it. * glom/data_structure/layoutgroup.[h|cc]: Add boolean m_others member variable and use it instead of checking the group name. 2004-07-05 Murray Cumming Use the UNIX user name by default, because it is often the same as the 2004-07-05 Murray Cumming * glom/navigation/box_databases.cc: Use the UNIX user name by default, because it is often the same as the postgres user name. 2004-07-05 Murray Cumming Add intermediate signal handlers for the User Level menu items because use 2004-07-05 Murray Cumming * glom/application.[h|cc]: Add intermediate signal handlers for the User Level menu items because use of sigc::bind with RefPtrs might be causing crashes. 2004-07-05 Murray Cumming In Table Navigation, change Cancel button to a close button, because this 2004-07-05 Murray Cumming * glom/glade.glom: In Table Navigation, change Cancel button to a close button, because this window is opened to edit as well as to navigate. * glom/navigatin/box_tables.cc: Make sure that changes are saved to the document immediately, because we no longer automatically ask all views to save into the document before writing to disk. 2004-07-05 Murray Cumming set_modified(): Call save_before() and write_to_disk() instead of save() 2004-07-05 Murray Cumming * glom/document/Document_Glom.cc: set_modified(): Call save_before() and write_to_disk() instead of save() because that gets all the data from the views again. 2004-07-04 Murray Cumming set_modified(): Do nothing if the modified status is already what it would 2004-07-05 Murray Cumming * glom/document/Document_Glom.cc: set_modified(): Do nothing if the modified status is already what it would be set to, to prevent infinite loops. * glom/application.cc offer_new_or_existing(): Keep offering if the user cancels at some stage. 2004-07-04 Murray Cumming Removed some debug warnings 2004-07-04 Vincent van Adrighem Translation updated by Tino Meinen. 2004-07-04 Vincent van Adrighem * nl.po: Translation updated by Tino Meinen. 2004-07-04 Murray Cumming When in developer mode, save all changes immediately and automatically. 2004-07-04 Murray Cumming * glom/document/Document_Glom.cc: When in developer mode, save all changes immediately and automatically. Lets see how much disk activity this creates. 2004-07-04 Murray Cumming Do not create the toolbar, because it is not useful for this application. 2004-07-04 Murray Cumming * glom/applciation,cc init_layout(): Do not create the toolbar, because it is not useful for this application. 2004-07-03 Murray Cumming save_to_document(): Only save something when something has been modified. 2004-07-04 Murray Cumming * glom/navigation/box_db_tables.cc: save_to_document(): Only save something when something has been modified. 2004-07-03 Christophe Merlet Added French translation. 2004-07-03 Murray Cumming removed crufty file 2004-07-03 Murray Cumming Cache all the data in member variables and only deal with the XML DOM when 2004-07-04 Murray Cumming * glom/document/Document_Glom.[h|cc]: Cache all the data in member variables and only deal with the XML DOM when loading and saving, in overrides of load_before() and save_after(). This makes the code nicer and faster. 2004-07-02 Murray Cumming reversed accidental commit 2004-07-02 Murray Cumming Added missing file 2004-07-02 Murray Cumming Renamed all the ugly on_AddDel_* methods to slightly less ugly on_adddel_* 2004-07-02 Murray Cumming * Renamed all the ugly on_AddDel_* methods to slightly less ugly on_adddel_* methods. 2004-07-02 Murray Cumming Added glom.keys and glom.mime, and added rules in Makefile.am to install 2004-07-02 Murray Cumming * Added glom.keys and glom.mime, and added rules in Makefile.am to install them. This is for the old MIME-type registration system, because GNOME 2.6 seems to need both the old and new systems. 2004-07-02 Murray Cumming Increased version 2004-07-02 Murray Cumming Save the fields into m_Fields, so that get_WhereClause() knows about them. 2004-07-02 Murray Cumming * glom/mode_find/box_data_list_find.cc fill_from_database(): Save the fields into m_Fields, so that get_WhereClause() knows about them. Find in the List view now works. 2004-07-02 Murray Cumming Handle field_edited signal of sub-flowtables so that glom responds to 2004-07-02 Murray Cumming * glom/utility_widgets/flowtablewithfields: Handle field_edited signal of sub-flowtables so that glom responds to editing of a field in a group on the Details view. 2004-07-02 Murray Cumming Change get_Entered_Field to get_entered_field_data() which takes a Field 2004-07-02 Murray Cumming * glom/mode_data/box_data.[h|cc] and derived classes: Change get_Entered_Field to get_entered_field_data() which takes a Field and returns a Gnome::Gda::Value. This makes Find mode work for the Details view at least. 2004-07-02 Murray Cumming Make the find mode show some widgets, by re-activating some old code and 2004-07-02 Murray Cumming * glom/mode_find/: Make the find mode show some widgets, by re-activating some old code and adding the boxes and notebooks to the Bakery composite View so that they know about the document. 2004-07-01 Murray Cumming on_AddDel_changed(): Update the document properly when a table is renamed, 2004-07-01 Murray Cumming * glom/navigation/box_db_tables.cc: on_AddDel_changed(): Update the document properly when a table is renamed, so that glom does not complain that it knows nothing about the table. Also, update the AddDel with the new table name as they key, so that it does not try to operate on the old table name. 2004-06-30 Murray Cumming Removed generated file. 2004-06-30 Murray Cumming Increased version 2004-06-30 Murray Cumming Correct x posititioning of 2nd column when using single items. 2004-06-30 Murray Cumming * glom/utility_widgets/flowtable.cc on_size_allocate(): Correct x posititioning of 2nd column when using single items. get_field(): Put the recursive stuff in the field(sting id) overload, because that's the one that gets called by the field(field) overload. 2004-06-30 Murray Cumming Added add_group() and used it in mode_data/box_table_data.cc 2004-06-30 Murray Cumming * glom/utility_widgets/flowtablewithfields.cc: Added add_group() and used it in mode_data/box_table_data.cc fill_layout(). Layout groups are now shown inside a HIG-style frame. * glom/navigation/box_tables.cc on_AddDel_add(), and glom/mode_design/fields/box_db_tabledefnition.cc on_AddDel_add(): Create a default title for tables and fields. 2004-06-30 Gareth Owen Updated en_GB translations from David Lodge 2004-06-27 Murray Cumming get_minimum_column_height(), get_column_height(): Make single items take 2004-06-27 Murray Cumming * glom/utility_widgets/flowtable.cc: get_minimum_column_height(), get_column_height(): Make single items take up the whole width, instead of affecting the width of the first sub-column. 2004-06-26 Murray Cumming Add get_default_button() virtual method, and add implementation in 2004-06-26 Murray Cumming * glom/box_db.[h|cc]: Add get_default_button() virtual method, and add implementation in glom/navigation/box_databases.cc, and used it in constructor Dialog_Glom, so that the connect button is the default button, so you can just press return in the password box to connect. 2004-06-24 Murray Cumming Removed AC_CONFIG_AUX_DIRS(), which was causing problems. 2004-06-25 Murray Cumming * configure.in: Removed AC_CONFIG_AUX_DIRS(), which was causing problems. 2004-06-24 Murray Cumming Added missing file. 2004-06-24 Gustavo Maciel Dias Vieira Updated Brazilian Portuguese translation done by Raphael Higino 2004-06-24 Gustavo Maciel Dias Vieira * pt_BR.po: Updated Brazilian Portuguese translation done by Raphael Higino . 2004-06-24 Duarte Loreto Added Portuguese (pt) to ALL_LINGUAS. 2004-06-24 Duarte Loreto * configure.in: Added Portuguese (pt) to ALL_LINGUAS. 2004-06-24 Duarte Loreto Added Portuguese translation. 2004-06-24 Duarte Loreto * pt.po: Added Portuguese translation. 2004-06-20 Murray Cumming Increased version 2004-06-20 Murray Cumming Added on override of on_menu_help_init() to merge in a menu item for the 2004-06-20 Murray Cumming * glom/application.[h|cc]: Added on override of on_menu_help_init() to merge in a menu item for the user guide. Called gnome_help_display() in the menu signal handler to show the docs. * glom/main.cc: Call gnome_program_init() so that gnome_help_display() has the information that it needs. Hopefully this coexists with our Gtk::Main initialisation. * configure.in: Depend on libgnome, because that is where gnome_help_display is. That is not good but at least it is not libgnomeui. * Makefile.am: Add some defines needed by gnome_program_init() - see comments in Makefile.am. 2004-06-20 Murray Cumming Added skeleton for the user guide. 2004-06-20 Murray Cumming * configure.in, docs/user-guide: Added skeleton for the user guide. 2004-06-19 Murray Cumming get_field_definition(): Prevent crash - do not try to use a 2004-06-20 Murray Cumming * glom/mode_design/fields/box_db_table_definition.cc: get_field_definition(): Prevent crash - do not try to use a TreeModel::iterator as the index to a vector. 2004-06-19 Murray Cumming Added glom.applications, to register glom as capable of opening glom 2004-06-19 Murray Cumming * Added glom.applications, to register glom as capable of opening glom files. * Makefile.am: Install glom.applications in the applications-registry. * glom/navigation/box_tables.cc: fill_from_database(): Show tables that are in the database, but not in the document, as hidden, if in developer mode. * glom/utility_widgets/adddel/adddel.cc : set_column_choices(): Get the cellrenderer for the view column, not the model column. Among other things, this makes the Relationships dialog work again. * glom/mode_design/dialog_relationships.[h|cc]: Add an on_hide() override to actually save the relationships when the dialog is closed. 2004-06-19 Murray Cumming Increased version 2004-06-18 Murray Cumming Make the column non-editable if it is an auto-increment field, because the 2004-06-18 Murray Cumming * glom/utility_widgets/adddel.cc add_column(Field): Make the column non-editable if it is an auto-increment field, because the user should never change or create those values. * glom/glom.glade: Create a HIG information dialog. Use it in glom/frame_glom.cc show_ok_dialog(). * glom/mode_design/box_db_tabledefinition.cc: on_AddDel_del(): Correct for loop, so that we actually delete the field. * glom/base_db: get_fields_for_table(): Ignore any fields that are no longer in the database. Among other things, this makes the field definition window update correctly after deleting a field. * glom/frame_glom.cc: Update the data view when the fields window is closed, because the structure might have changed. * glom/data_structure/glomconversions.cc: parse_value(): When parsing a string as a number, create a GdaNumeric-based GdaValue instead of a float, because that is the numeric type that we are using eveywhere. Actually, maybe it's not the best type. * All over the place: Fixed lots of primary_key arguments to be Gnome::Gda::Values rather than strings, and therefore made sure that Field::sql() was used with them. 2004-06-18 Miloslav Trmac Updated Czech translation. 2004-06-18 Miloslav Trmac * cs.po: Updated Czech translation. 2004-06-17 Murray Cumming Make the column non-editable if it is an auto-increment field, because the 2004-06-17 Murray Cumming * glom/utility_widgets/adddel.cc add_column(Field): Make the column non-editable if it is an auto-increment field, because the user should never change or create those values. * glom/glom.glade: Create a HIG information dialog. Use it in glom/frame_glom.cc show_ok_dialog(). * glom/mode_design/box_db_tabledefinition.cc: on_AddDel_del(): Correct for loop, so that we actually delete the field. * glom/base_db: get_fields_for_table(): Ignore any fields that are no longer in the database. Among other things, this makes the field definition window update correctly after deleting a field. * glom/frame_glom.cc: Update the data view when the fields window is closed, because the structure might have changed. 2004-06-17 Murray Cumming Added get_default_table(). on_Box_Databases_selected(): open the default 2004-06-17 Murray Cumming * glom/document/document_glom.[h|cc]: Added get_default_table(). * glom/frame_glom.cc: on_Box_Databases_selected(): open the default table instead of showing the list of tables, if there is a default table. 2004-06-17 Murray Cumming Moved Default Value into its own Notebook tab, with new Lookup widgets. 2004-06-17 Murray Cumming * glom/glade.glom, glom/mode_design/fields/dialog_fielddefinition.cc: Moved Default Value into its own Notebook tab, with new Lookup widgets. * glom/mode_data/box_data_list.cc: Make the rows have alternating colors when the theme does that. Among other things, this makes the data list look different to the field list. * The lookup details are not actually used yet to do any lookups. 2004-06-15 Murray Cumming Simplifified the code for the placeholder row a bit. Fixed some odd focus 2004-06-15 Murray Cumming * glom/utility_widgets/adddel/adddel.[h|cc]: Simplifified the code for the placeholder row a bit. * glom/navigation/box_db_tables.cc, glom/mode_design/fields/box_table_field_definitions.cc: Fixed some odd focus errors (hopefully) caused by rebuilding the TreeModel in a CellRenderer signal handler. * glom/mode_design/fields/box_table_field_definitions.cc: get_field_definition(): Store the field title in the result, not in the temporary field instance, so that new titles are really saved. 2004-06-15 Murray Cumming on_AddDel_changed(): Implement renaming of tables. 2004-06-15 Murray Cumming * glom/navigation/box_tables.cc: on_AddDel_changed(): Implement renaming of tables. 2004-06-15 Murray Cumming Corrected problems with the AddDel changes: Adding a record works again, 2004-06-15 Murray Cumming * glom/mode_data/box_data_list.cc: Corrected problems with the AddDel changes: Adding a record works again, and editing a list record shows the correct record in the Details view. 2004-06-15 Murray Cumming unbroke the build 2004-06-15 Murray Cumming add_item(), remove_item(), get_row() now use a key value instead of the 2004-06-15 Murray Cumming * glom/utility_widgets/adddel.[h|cc]: add_item(), remove_item(), get_row() now use a key value instead of the value in the first column. This is a hidden TreeModel column. There is also a bool placeholder column, used to mark the blank row that is for the user to add a new row. This scheme should make it easier to handle reorderered rows, and it allows us to get a uniquq identifier for a changed row even when responding to a change an it is the first row (such as a field name) that has changed. 2004-06-14 Murray Cumming The API now uses Gtk::TreeModel iterators instead of integer indexes. The 2004-06-14 Murray Cumming * glom/utility_widgets/adddel.[h|cc]: The API now uses Gtk::TreeModel iterators instead of integer indexes. The previous API was an abstraction layer that is no longer required now that we have Gtk::TreeView and plan to keep using it. * other files: Adapted accordingly. 2004-06-14 Miloslav Trmac Added cs to ALL_LINGUAS. 2004-06-14 Miloslav Trmac * configure.in: Added cs to ALL_LINGUAS. 2004-06-14 Miloslav Trmac Added Czech translation. 2004-06-14 Miloslav Trmac * cs.po: Added Czech translation. 2004-06-13 Vincent van Adrighem Added nl to ALL_LINGUAS. 2004-06-13 Vincent van Adrighem * configure.in: Added nl to ALL_LINGUAS. 2004-06-13 Vincent van Adrighem Translation added by Tino Meinen. 2004-06-13 Vincent van Adrighem * nl.po: Translation added by Tino Meinen. 2004-06-12 Murray Cumming Increased version 2004-06-12 Murray Cumming show_hint(): Do not show the help hints at the bottom - they are just 2004-06-12 Murray Cumming * glom/application.cc: show_hint(): Do not show the help hints at the bottom - they are just annoying and not really necessary anymore. 2004-06-12 Murray Cumming Simplify the time_get and time_put code by using the default template 2004-06-12 Murray Cumming * glom/data_structure/glomconversions.cc: Simplify the time_get and time_put code by using the default template iterators. 2004-06-12 Murray Cumming Various corrections from Daniel Elstner (king of C++). Also fallback to 2004-06-12 Murray Cumming * glom/data_structure/glomconversions.cc: Various corrections from Daniel Elstner (king of C++). Also fallback to parsing time in the C locale, because parsing in the current locale never seems to work. * glom/utility_widgets/adddel/adddel.cc: on_treeview_celledited(), glom/utility)widgets/entryglom: check_changed(): Update the entry with the text as it would be displayed in the locale, after editing, so that the user gets immediate feedback. 2004-06-12 Murray Cumming Updated the screenshots 2004-06-12 Murray Cumming New dialog to show when the user enters incorrect data, with advice, and 2004-06-12 Murray Cumming * glom/dialog_data_invalid.[h|cc}, glom.glade: New dialog to show when the user enters incorrect data, with advice, and offer to revert. glom/utility_widgets/entryglom.cc: check_for_changes(): Show the new dialog, and put the focus back in the entry if the user tries again. * glom/utility_widgets/adddel/adddel.cc: on_treeview_cell_edited(): Do the same, though the cell is obviously not reactivated properly. 2004-06-12 Murray Cumming check_for_change(): Complain about unparseable data (such as dates and 2004-06-12 Murray Cumming * glom/utility_widgets/entryglom.cc: check_for_change(): Complain about unparseable data (such as dates and times) instead of sending garbage to the database. This dialog should be improved (see comments) and we need the same thing for the List view. 2004-06-12 Murray Cumming Moved generic parse/format routines to 2004-06-12 Murray Cumming * Moved generic parse/format routines to glom/data_structure/glomconversions.[h|cc] from glom/utility_widgets/entryglom.[h|cc]. * glom/utility_widgets/adddel/adddel.[h|cc]: Add add_column() override that takes a Field. Add set_value(Gda::Value) and get_value_as_value() methods that use the glomconversions. * glom/mode_data/box_data_list.cc: fill_from_database(), on_adddel_changed(): Use the GdaValue-based AddDel API so that dates, times, and numbers are shown and parsed as per the locale. 2004-06-12 Murray Cumming Change all parsing to use C++ streams and facets, and rearranged them into 2004-06-12 Murray Cumming * glom/utility_widgets/flowtable_withfields.cc: Change all parsing to use C++ streams and facets, and rearranged them into generic conversion routines that can be used elsewhere and should be moved elsewhere too. Added conversions to ISO formats, fo use in SQL statments. * glom/data_structure/field.cc: sql(): Use these conversion routines to get text representations for SQL. 2004-06-11 Murray Cumming Added to TODO. 2004-06-11 Murray Cumming get_suitable_width(): Use static locale-specific conversion function from 2004-06-11 Murray Cumming * glom/utility_widgets/flowtable_withfields.cc: get_suitable_width(): Use static locale-specific conversion function from EntryGlom to get example text so that the number, date, and time fields have suitable widths in all locales. 2004-06-11 Murray Cumming Update it.po from Albert Paro. Re-enabled it.po now that the invalid 2004-06-11 Murray Cumming * po/: Update it.po from Albert Paro. * configure.in: Re-enabled it.po now that the invalid multibyte sequences are fixed. 2004-06-11 Murray Cumming Do locale-specific display and parsing of dates, times, and numbers in the 2004-06-11 Murray Cumming * Do locale-specific display and parsing of dates, times, and numbers in the Data Details. * glom/utility_widgets/entryglom.[h|cc]: Added Gda::Value-based get_value() and set_value(), which show and parse the text based on the field type and the locale, though there are still some TODOS in the code. * glom/mode_data/box_data_details.cc: Use EntryGlom::set/get_value() instead of set/get_text(), so we delegate parsing/representation to the EntryGlom. 2004-06-11 Adam Weinberger Added en_CA to ALL_LINGUAS. Added Canadian English translation. * configure.in: Added en_CA to ALL_LINGUAS. * po/en_CA.po: Added Canadian English translation. 2004-06-10 Murray Cumming Started to add validation, depending on the field type. 2004-06-11 Murray Cumming * glom/utility_widgets/entryglom.[h|cc]: Started to add validation, depending on the field type. 2004-06-10 Murray Cumming Removed fieldtype.[h|cc] to simplify things, moving some of the static 2004-06-11 Murray Cumming * glom/data_structure/: Removed fieldtype.[h|cc] to simplify things, moving some of the static functions into the Field class. 2004-06-10 Murray Cumming Use PangoLayout to calculate an appropriate width for fields of different 2004-06-10 Murray Cumming * glom/utility_widgets/flowtable_withstyles.[h|cc]: Use PangoLayout to calculate an appropriate width for fields of different types. Need to do locale-specific stuff here though. 2004-06-10 Gustavo Noronha Silva added translation by Joao Paulo Gomes Vanzuita * pt_BR.po: added translation by Joao Paulo Gomes Vanzuita * configure.in: added pt_BR to ALL_LINGUAS 2004-06-10 Murray Cumming Added macros/macros.m4, and used the macro in configure.in, to add 2004-06-10 Murray Cumming * Added macros/macros.m4, and used the macro in configure.in, to add --enable-warnings configure options, and used them by default in autogen.sh. So now it builds with warnings by default. 2004-06-10 Murray Cumming Added missing files. 2004-06-10 Murray Cumming Handle AddDel::signal_user_changed so that changes are saved immediately. 2004-06-10 Murray Cumming * glom/navigation/box_tables.cc: Handle AddDel::signal_user_changed so that changes are saved immediately. It does not update the list of non-hidden tables properly yet though. The AddDel columns are no longer editable when in operator mode. * glom/frame_glom.[h|cc]: Do not allow the user to design fields, relationships, or layouts if no table has been selected. * glom/application.cc, frame_glom.[h|cc]: on_menu_userlevel_*(): Use sigc::bind to send the RadioAction to the signal handler, so we can check if it is active, because the signal seems to be sent both when the menu item is un-activated (as a result of another radioaction being activated) and when it is activated. 2004-06-10 Murray Cumming Move the database stuff into the Base_DB class to make the code a bit 2004-06-10 Murray Cumming * glom/box_db.[h|cc]: Move the database stuff into the Base_DB class to make the code a bit clearer. Connect to the signal of the document in a set_document() override instead of the on_load_document() override. 2004-06-09 Murray Cumming Italian translation from Alberto Paro. Alberto Paro added includes for 2004-06-10 Murray Cumming * po/il.po: Italian translation from Alberto Paro. * various headers: Alberto Paro added includes for libintl.h because he says gettext() is not defined without them. It is strange that it works for me, but they do no harm. I need to look at this properly. 2004-06-09 Murray Cumming German translation from Hendrik Brandt. 2004-06-10 Murray Cumming * po/de.po: German translation from Hendrik Brandt. 2004-06-09 Murray Cumming removed the Design Mode. Added Fields, Relatationships, Users, and Layout, 2004-06-09 Murray Cumming * Mode menu: removed the Design Mode. * Developer menu: Added Fields, Relatationships, Users, and Layout, to show the same functionality in secondary windows. 2004-06-09 Murray Cumming added missing files. 2004-06-09 Christian Rose Added "sv" to ALL_LINGUAS. Removed nonexisting files and added a missing 2004-06-09 Christian Rose * configure.in: Added "sv" to ALL_LINGUAS. * po/POTFILES.in: Removed nonexisting files and added a missing one. * po/.cvsignore: Added this. * po/sv.po: Added Swedish translation. 2004-06-08 Murray Cumming The AppState (User Level) is now dependent on the document so different 2004-06-08 Murray Cumming * glom/application.[h|cc], glom/Document/Document_Glom.[h|cc], and others: The AppState (User Level) is now dependent on the document so different instances (each with 1 document) can have different user levels. And the user level is Operator if the file is read-only. * glom/Navigation/Box_DB_Tables.cc: Enable/Disable the extra UI in fill_from_database() instead of the constructor, so that they are changed when the user level changes. The table title is not yet shown instead of the table name when in operator mode. 2004-06-08 Murray Cumming Changed all source code filenames to lowercase, because it was getting 2004-06-08 Murray Cumming * Changed all source code filenames to lowercase, because it was getting ugly, and imported into GNOME cvs. 2004-06-08 Murray Cumming Importing files from sourceforge cvs. 2004-06-08 Murray Cumming Initial revision glom-1.22.4/po/0000755000175000017500000000000012235000127014372 5ustar00murraycmurrayc00000000000000glom-1.22.4/po/eo.po0000644000175000017500000033346712234252646015373 0ustar00murraycmurrayc00000000000000# Esperanto translation for glom. # Copyright (C) 2012 Free Software Foundation, Inc. # This file is distributed under the same license as the glom package. # Kristjan SCHMIDT , 2012. # msgid "" msgstr "" "Project-Id-Version: glom master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=glom&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2012-02-19 14:51+0000\n" "PO-Revision-Date: 2012-02-19 16:14+0100\n" "Last-Translator: Kristjan SCHMIDT \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "product=glom&keywords=I18N+L10N&component=general\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../glom/appwindow.cc:148 msgid "Glom: Generating Encryption Certificates" msgstr "" #: ../glom/appwindow.cc:149 msgid "" "Please wait while Glom prepares your system for publishing over the network." msgstr "" #: ../glom/appwindow.cc:269 ../glom/bakery/appwindow_withdoc_gtk.cc:228 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:198 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:58 msgid "_File" msgstr "_Doserio" #: ../glom/appwindow.cc:270 ../glom/bakery/appwindow_withdoc_gtk.cc:229 msgid "_Recent Files" msgstr "_Lastaj dosieroj" #: ../glom/appwindow.cc:278 msgid "_Save as Example" msgstr "" #: ../glom/appwindow.cc:285 ../glom/filechooser_export.cc:41 msgid "_Export" msgstr "E_lporti" #: ../glom/appwindow.cc:289 ../ui/operator/dialog_import_csv.glade.h:2 msgid "I_mport" msgstr "E_nporti" #: ../glom/appwindow.cc:294 msgid "S_hared on Network" msgstr "" #: ../glom/appwindow.cc:308 msgid "_Standard" msgstr "" #: ../glom/appwindow.cc:312 msgid "_Edit Print Layouts" msgstr "" #. "Tables" menu: #: ../glom/appwindow.cc:370 msgid "_Tables" msgstr "" #: ../glom/appwindow.cc:380 msgid "_Edit Tables" msgstr "" #. "Reports" menu: #: ../glom/appwindow.cc:394 msgid "_Reports" msgstr "" #: ../glom/appwindow.cc:397 msgid "_Edit Reports" msgstr "" #. We remember this action, so that it can be explicitly activated later. #: ../glom/appwindow.cc:405 ../glom/frame_glom.cc:123 msgid "_Find" msgstr "_Serĉi" #: ../glom/appwindow.cc:411 msgctxt "Developer menu title" msgid "_Developer" msgstr "" #: ../glom/appwindow.cc:417 msgid "_Developer Mode" msgstr "" #: ../glom/appwindow.cc:421 msgid "_Operator Mode" msgstr "" #: ../glom/appwindow.cc:426 msgid "_Database Preferences" msgstr "" #: ../glom/appwindow.cc:431 msgid "_Fields" msgstr "_Kampoj" #: ../glom/appwindow.cc:436 msgid "Relationships _Overview" msgstr "" #: ../glom/appwindow.cc:441 msgid "_Relationships for this Table" msgstr "" #: ../glom/appwindow.cc:446 msgid "_Users" msgstr "_Uzantoj" #: ../glom/appwindow.cc:450 msgid "_Print Layouts" msgstr "" #: ../glom/appwindow.cc:455 msgid "R_eports" msgstr "" #: ../glom/appwindow.cc:460 msgid "Script _Library" msgstr "" #: ../glom/appwindow.cc:465 msgid "_Layout" msgstr "_AranÄo" #: ../glom/appwindow.cc:470 msgid "Test Tra_nslation" msgstr "" #: ../glom/appwindow.cc:474 msgid "_Translations" msgstr "_Tradukoj" #. "Active Platform" menu: #: ../glom/appwindow.cc:480 msgid "_Active Platform" msgstr "" #: ../glom/appwindow.cc:486 msgid "_Normal" msgstr "" #: ../glom/appwindow.cc:486 msgid "The layout to use for normal desktop environments." msgstr "" #: ../glom/appwindow.cc:491 msgid "_Maemo" msgstr "" #: ../glom/appwindow.cc:491 msgid "The layout to use for Maemo devices." msgstr "" #: ../glom/appwindow.cc:496 msgid "_Export Backup" msgstr "" #: ../glom/appwindow.cc:500 msgid "_Restore Backup" msgstr "" #. TODO: Think of a better name for this menu item, #. though it mostly only exists because it is not quite ready to be on by default: #. Note to translators: Drag and Drop is part of the name, not a verb or action: #: ../glom/appwindow.cc:507 msgid "_Drag and Drop Layout" msgstr "" #: ../glom/appwindow.cc:515 msgctxt "Help menu title" msgid "_Help" msgstr "_Helpo" #: ../glom/appwindow.cc:519 msgid "_Help" msgstr "_Helpo" #: ../glom/appwindow.cc:522 msgid "_About" msgstr "_Pri" #: ../glom/appwindow.cc:522 msgid "About the application" msgstr "Pri la aplikaĵo" #: ../glom/appwindow.cc:525 #| msgctxt "Field (comments). Parent table: accommodation" #| msgid "Comments" msgid "_Contents" msgstr "_Enhavo" #: ../glom/appwindow.cc:525 msgid "Help with the application" msgstr "Helpo pri la aplikaĵo" #: ../glom/appwindow.cc:630 msgid "A Database GUI" msgstr "" #: ../glom/appwindow.cc:632 msgid "© 2000-2011 Murray Cumming, Openismus GmbH" msgstr "© 2000-2011 Murray CUMMINGS, Openismus GmbH" #. TODO: Put this in the generic bakery code. #: ../glom/appwindow.cc:716 ../glom/appwindow.cc:725 msgid "Open Failed" msgstr "" #: ../glom/appwindow.cc:717 msgid "The document could not be found." msgstr "" #: ../glom/appwindow.cc:726 msgid "" "The document could not be opened because it was created or modified by a " "newer version of Glom." msgstr "" #. std::cout << " SOUP_STATUS_FORBIDDEN or SOUP_STATUS_UNAUTHORIZED" << std::endl; #. Warn the user, and let him try again: #: ../glom/appwindow.cc:776 ../glom/frame_glom.cc:2045 #: ../glom/frame_glom.cc:2116 msgid "Connection Failed" msgstr "" #: ../glom/appwindow.cc:776 ../glom/frame_glom.cc:2045 #: ../glom/frame_glom.cc:2116 msgid "" "Glom could not connect to the database server. Maybe you entered an " "incorrect user name or password, or maybe the postgres database server is " "not running." msgstr "" #: ../glom/appwindow.cc:945 msgid "" "The file cannot be opened because this version of Glom does not support self-" "hosting of databases." msgstr "" #: ../glom/appwindow.cc:950 ../glom/appwindow.cc:959 msgid "" "The file cannot be opened because this version of Glom does not support " "PostgreSQL databases." msgstr "" #: ../glom/appwindow.cc:967 msgid "" "The file cannot be opened because this version of Glom does not support " "SQLite databases." msgstr "" #. Warn the user. #: ../glom/appwindow.cc:985 msgid "File Uses Unsupported Database Backend" msgstr "" #: ../glom/appwindow.cc:1048 msgid "Creating From Example File" msgstr "" #: ../glom/appwindow.cc:1049 msgid "" "To use this example file you must save an editable copy of the file. A new " "database will also be created on the server." msgstr "" #: ../glom/appwindow.cc:1053 msgid "Creating From Backup File" msgstr "" #: ../glom/appwindow.cc:1054 msgid "" "To use this backup file you must save an editable copy of the file. A new " "database will also be created on the server." msgstr "" #: ../glom/appwindow.cc:1115 msgid "Opening Read-Only File." msgstr "" #: ../glom/appwindow.cc:1116 msgid "" "This file is read only, so you will not be able to enter Developer mode to " "make design changes." msgstr "" #: ../glom/appwindow.cc:1119 msgid "Continue without Developer Mode" msgstr "" #. The connection to the server is OK, but the database is not there yet. #: ../glom/appwindow.cc:1177 msgid "Database Not Found On Server" msgstr "" #: ../glom/appwindow.cc:1177 msgid "" "The database could not be found on the server. Please consult your system " "administrator." msgstr "" #. std::cerr might show some hints, but we don't want to confront the user with them: #. TODO: Actually complain about specific stuff such as missing data, because the user might really play with the file system. #: ../glom/appwindow.cc:1187 msgid "Problem Loading Document" msgstr "" #: ../glom/appwindow.cc:1187 msgid "Glom could not load the document." msgstr "" #: ../glom/appwindow.cc:1617 msgid "Creating Glom database from example file." msgstr "" #: ../glom/appwindow.cc:1796 msgid "Creating Glom database from backup file." msgstr "" #. The save failed. Tell the user and don't do anything else: #: ../glom/appwindow.cc:2269 ../glom/bakery/appwindow_withdoc.cc:237 #: ../glom/bakery/appwindow_withdoc.cc:288 msgid "Save failed." msgstr "Konservo malsukcesis." #: ../glom/appwindow.cc:2269 msgid "There was an error while saving the example file." msgstr "" #: ../glom/appwindow.cc:2310 ../glom/appwindow.cc:2315 #: ../glom/bakery/appwindow_withdoc_gtk.cc:425 msgid "Save Document" msgstr "Konservi dokumenton" #. Warn the user: #: ../glom/appwindow.cc:2402 ../glom/bakery/appwindow_withdoc_gtk.cc:473 msgid "Read-only File." msgstr "Nur-legebla dosiero." #: ../glom/appwindow.cc:2402 ../glom/bakery/appwindow_withdoc_gtk.cc:473 msgid "" "You may not overwrite the existing file, because you do not have sufficient " "access rights." msgstr "" #. Warn the user: #: ../glom/appwindow.cc:2416 ../glom/bakery/appwindow_withdoc_gtk.cc:487 msgid "Read-only Directory." msgstr "Nur-legebla dosierujo." #: ../glom/appwindow.cc:2416 ../glom/bakery/appwindow_withdoc_gtk.cc:487 msgid "" "You may not create a file in this directory, because you do not have " "sufficient access rights." msgstr "" #: ../glom/appwindow.cc:2433 msgid "Database Title missing" msgstr "" #: ../glom/appwindow.cc:2433 msgid "You must specify a title for the new database." msgstr "" #: ../glom/appwindow.cc:2462 ../glom/frame_glom.cc:1805 msgid "Directory Already Exists" msgstr "" #: ../glom/appwindow.cc:2462 ../glom/frame_glom.cc:1806 msgid "" "There is an existing directory with the same name as the directory that " "should be created for the new database files. You should specify a different " "filename to use a new directory instead." msgstr "" #. This actually creates the directory: #: ../glom/appwindow.cc:2601 msgid "Save Backup" msgstr "" #: ../glom/appwindow.cc:2617 msgid "Exporting backup" msgstr "" #: ../glom/appwindow.cc:2623 msgid "Export Backup failed." msgstr "" #: ../glom/appwindow.cc:2623 msgid "There was an error while exporting the backup." msgstr "" #: ../glom/appwindow.cc:2629 msgid "Choose a backup file" msgstr "" #: ../glom/appwindow.cc:2634 msgid ".tar.gz Backup files" msgstr "" #: ../glom/appwindow.cc:2640 msgid "Restore" msgstr "RestaÅ­ri" #: ../glom/appwindow.cc:2665 msgid "Restoring backup" msgstr "" #: ../glom/appwindow.cc:2672 msgid "Restore Backup failed." msgstr "" #: ../glom/appwindow.cc:2672 msgid "There was an error while restoring the backup." msgstr "" #: ../glom/appwindow.cc:2769 ../glom/bakery/appwindow_withdoc_gtk.cc:346 msgid " (read-only)" msgstr "" #: ../glom/appwindow.cc:2817 ../ui/operator/window_main.glade.h:2 msgid "Processing" msgstr "Traktado" #: ../glom/base_db.cc:128 ../glom/base_db.cc:138 msgid "Internal error" msgstr "" #: ../glom/base_db.cc:1461 msgid "Value Is Not Unique" msgstr "" #: ../glom/base_db.cc:1461 msgid "" "The field's value must be unique, but a record with this value already " "exists." msgstr "" #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:262 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the relationship does not allow automatic creation " "of new related records." msgstr "" #: ../glom/base_db_table_data.cc:263 msgid "Related Record Does Not Exist" msgstr "" #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:282 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the key in the related record is auto-generated and " "therefore can not be created with the key value in this record." msgstr "" #: ../glom/base_db_table_data.cc:284 msgid "Related Record Cannot Be Created" msgstr "" #. Ask the user for confirmation: #: ../glom/base_db_table_data.cc:395 msgid "" "Are you sure that you would like to delete this record? The data in this " "record will then be permanently lost." msgstr "" #: ../glom/base_db_table_data.cc:396 msgid "Delete record" msgstr "" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #. Append the View columns: #: ../glom/box_reports.cc:94 #: ../glom/mode_design/box_db_table_relationships.cc:45 #: ../glom/mode_design/fields/box_db_table_definition.cc:54 #: ../glom/mode_design/layout/dialog_choose_field.cc:55 #: ../glom/mode_design/layout/dialog_choose_relationship.cc:55 #: ../glom/mode_design/layout/dialog_layout_details.cc:103 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.cc:53 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:49 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.cc:52 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:94 #: ../glom/mode_design/users/dialog_groups_list.cc:66 #| msgctxt "Field (name). Parent table: accommodation" #| msgid "Name" msgid "Name" msgstr "Nomo" #. Don't allow a relationship to be added twice. #: ../glom/box_reports.cc:96 msgid "This report already exists. Please choose a different report name" msgstr "" #. Title column: #: ../glom/box_reports.cc:98 #: ../glom/mode_design/box_db_table_relationships.cc:49 #: ../glom/mode_design/fields/box_db_table_definition.cc:58 #: ../glom/mode_design/layout/dialog_choose_field.cc:56 #: ../glom/mode_design/layout/dialog_layout_details.cc:116 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:50 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:98 #: ../glom/navigation/box_tables.cc:137 #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:109 #| msgctxt "Field (name_title). Parent table: contacts" #| msgid "Title" msgid "Title" msgstr "Titolo" #: ../glom/box_reports.cc:226 msgid "Are you sure that you want to rename this report?" msgstr "" #. TODO: Show old and new names? #: ../glom/box_reports.cc:227 msgid "Rename Report" msgstr "" #. namespace Glom #: ../glom.desktop.in.in.h:1 ../ui/operator/window_main.glade.h:1 msgid "Glom" msgstr "Glomo" #: ../glom.desktop.in.in.h:2 msgid "A user-friendly database environment." msgstr "" #: ../glom/dialog_connection.cc:203 msgid "Not yet created." msgstr "" #: ../glom/dialog_existing_or_new.cc:49 msgid "No recently used documents available." msgstr "" #: ../glom/dialog_existing_or_new.cc:50 msgid "No sessions found on the local network." msgstr "" #: ../glom/dialog_existing_or_new.cc:53 msgid "No templates available." msgstr "" #: ../glom/dialog_existing_or_new.cc:111 msgid "Open a Document" msgstr "" #: ../glom/dialog_existing_or_new.cc:130 msgid "Select File" msgstr "Elekti dosieron" #: ../glom/dialog_existing_or_new.cc:134 msgid "Local Network" msgstr "Loka reto" #: ../glom/dialog_existing_or_new.cc:138 msgid "Recently Opened" msgstr "" #: ../glom/dialog_existing_or_new.cc:212 msgid "New Empty Document" msgstr "" #: ../glom/dialog_existing_or_new.cc:215 msgid "New From Template" msgstr "" #. Translator hint: This is on (via Network Interface such as eth0). #: ../glom/dialog_existing_or_new.cc:741 #, c-format msgid "%s on %s (via %s)" msgstr "" #: ../glom/filechooser_export.cc:32 msgid "Export to File" msgstr "" #: ../glom/filechooser_export.cc:35 msgid "Define Data _Format" msgstr "" #: ../glom/frame_glom.cc:81 msgid "Find All" msgstr "Serĉi ĉiujn" #: ../glom/frame_glom.cc:102 ../glom/frame_glom.cc:106 msgid "No Table Selected" msgstr "" #: ../glom/frame_glom.cc:113 ../ui/operator/dialog_find_id.glade.h:4 msgid "Quick _search:" msgstr "" #: ../glom/frame_glom.cc:137 msgid "Records:" msgstr "" #: ../glom/frame_glom.cc:140 msgid "Found:" msgstr "" #. TODO: Obviously this document should have been deleted when the database-creation was cancelled. #. Note that "canceled" is the correct US spelling. #: ../glom/frame_glom.cc:324 msgid "No table" msgstr "" #: ../glom/frame_glom.cc:324 msgid "This database has no tables yet." msgstr "" #. TODO: Obviously this could be possible but it would require a network protocol and some work: #: ../glom/frame_glom.cc:491 msgid "Developer mode not available." msgstr "" #: ../glom/frame_glom.cc:492 msgid "" "Developer mode is not available because the file was opened over the network " "from a running Glom. Only the original file may be edited." msgstr "" #: ../glom/frame_glom.cc:498 msgid "Developer mode not available" msgstr "" #: ../glom/frame_glom.cc:499 msgid "" "Developer mode is not available. Check that you have sufficient database " "access rights and that the glom file is not read-only." msgstr "" #: ../glom/frame_glom.cc:506 msgid "Saving in new document format" msgstr "" #: ../glom/frame_glom.cc:507 msgid "" "The document was created by an earlier version of the application. Making " "changes to the document will mean that the document cannot be opened by some " "earlier versions of the application." msgstr "" #: ../glom/frame_glom.cc:510 msgid "Continue" msgstr "DaÅ­rigi" #: ../glom/frame_glom.cc:559 msgid "Export Not Allowed." msgstr "" #: ../glom/frame_glom.cc:559 msgid "" "You do not have permission to view the data in this table, so you may not " "export the data." msgstr "" #: ../glom/frame_glom.cc:590 msgid "Could Not Create File." msgstr "" #: ../glom/frame_glom.cc:590 msgid "Glom could not create the specified file." msgstr "" #: ../glom/frame_glom.cc:741 msgid "No Table" msgstr "" #: ../glom/frame_glom.cc:741 msgid "There is no table in to which data could be imported." msgstr "" #: ../glom/frame_glom.cc:745 msgid "Open CSV Document" msgstr "" #: ../glom/frame_glom.cc:749 msgid "CSV files" msgstr "" #: ../glom/frame_glom.cc:753 msgid "All files" msgstr "Ĉiuj dosieroj" #: ../glom/frame_glom.cc:828 msgid "Share on the network" msgstr "" #: ../glom/frame_glom.cc:829 msgid "This will allow other users on the network to use this database." msgstr "" #: ../glom/frame_glom.cc:832 msgid "_Share" msgstr "" #. TODO: Warn about connected users if possible. #: ../glom/frame_glom.cc:933 msgid "Stop sharing on the network" msgstr "" #: ../glom/frame_glom.cc:934 msgid "This will prevent other users on the network from using this database." msgstr "" #: ../glom/frame_glom.cc:937 msgid "_Stop Sharing" msgstr "" #: ../glom/frame_glom.cc:985 ../glom/frame_glom.cc:2102 msgid "Stopping Database Server" msgstr "" #. Do startup, such as starting the self-hosting database server #: ../glom/frame_glom.cc:988 ../glom/frame_glom.cc:1990 #: ../glom/frame_glom.cc:2148 msgid "Starting Database Server" msgstr "" #: ../glom/frame_glom.cc:1143 msgid "Table Exists Already" msgstr "" #: ../glom/frame_glom.cc:1143 msgid "" "A table with this name already exists in the database. Please choose a " "different table name." msgstr "" #: ../glom/frame_glom.cc:1147 msgid "Relationship Exists Already" msgstr "" #: ../glom/frame_glom.cc:1147 msgid "" "A relationship with this name already exists for this table. Please choose a " "different relationship name." msgstr "" #: ../glom/frame_glom.cc:1151 msgid "More information needed" msgstr "" #: ../glom/frame_glom.cc:1151 msgid "You must specify a field, a table name, and a relationship name." msgstr "" #: ../glom/frame_glom.cc:1205 msgid "Related Table Created" msgstr "" #: ../glom/frame_glom.cc:1205 msgid "The new related table has been created." msgstr "" #. namespace Glom #: ../glom/frame_glom.cc:1234 ../ui/operator/box_navigation_tables.glade.h:1 msgid "Edit Tables" msgstr "" #: ../glom/frame_glom.cc:1307 #: ../glom/mode_data/datawidget/dialog_choose_id.cc:109 msgid "You have not entered any quick find criteria." msgstr "" #: ../glom/frame_glom.cc:1308 msgid "No find criteria" msgstr "" #: ../glom/frame_glom.cc:1663 ../ui/developer/box_reports.glade.h:1 msgid "Reports" msgstr "Raportoj" #: ../glom/frame_glom.cc:1694 ../ui/developer/box_print_layouts.glade.h:1 msgid "Print Layouts" msgstr "" #: ../glom/frame_glom.cc:1810 msgid "Could Not Create Directory" msgstr "" #: ../glom/frame_glom.cc:1811 msgid "" "There was an error when attempting to create the directory for the new " "database files." msgstr "" #: ../glom/frame_glom.cc:1815 msgid "Could Not Start Database Server" msgstr "" #: ../glom/frame_glom.cc:1816 msgid "There was an error when attempting to start the database server." msgstr "" #: ../glom/frame_glom.cc:1921 msgid "Initializing Database Data" msgstr "" #. Show 0 instead of "all" when all of no records are found, to avoid confusion. #: ../glom/frame_glom.cc:2450 msgid "All" msgstr "Ĉio" #: ../glom/utils_ui.cc:142 msgid "No help file available" msgstr "" #: ../glom/utils_ui.cc:160 msgid "Could not display help: %1" msgstr "" #: ../glom/utils_ui.cc:476 msgid "Your find criteria did not match any records in the table." msgstr "" #: ../glom/utils_ui.cc:478 msgid "No Records Found" msgstr "" #: ../glom/utils_ui.cc:483 msgid "New Find" msgstr "" #: ../glom/utils_ui.cc:494 msgid "Report Finished" msgstr "" #: ../glom/utils_ui.cc:494 msgid "The report will now be opened in your web browser." msgstr "" #: ../glom/utils_ui.cc:541 msgid "Script Uses PyGTK 2" msgstr "" #: ../glom/utils_ui.cc:542 msgid "" "Glom cannot run this script because it uses pygtk 2, but Glom uses GTK+ 3, " "and attempting to use pygtk 2 would cause Glom to crash." msgstr "" #. These strings are not actually used by Glom. #. I am putting them here so that GNOME's translators can translate them #. without dealing with the awkward (not gettext) system here: #. http://www.murrayc.com/blog/permalink/2012/01/27/online-glom-more-translation/ #. murrayc #: ../glom/onlineglom_strings.cc:29 msgid "Search" msgstr "Serĉi" #: ../glom/onlineglom_strings.cc:30 msgid "Back to List" msgstr "" #. Translators: This is a noun. It is a notebook tab title. #. Details column: #: ../glom/onlineglom_strings.cc:31 ../glom/libglom/document/document.cc:1552 #: ../glom/mode_data/notebook_data.cc:66 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:215 #: ../glom/mode_find/notebook_find.cc:39 #| msgctxt "Layout Group (details). Parent table: cars" #| msgid "Details" msgid "Details" msgstr "Detaloj" #: ../glom/onlineglom_strings.cc:32 msgid "Open" msgstr "Malfermi" #: ../glom/bakery/appwindow_withdoc_gtk.cc:284 #: ../ui/developer/window_field_definition_edit.glade.h:13 msgid "_Edit" msgstr "R_edakti" #: ../glom/bakery/appwindow_withdoc_gtk.cc:376 msgid "Open Document" msgstr "" #: ../glom/bakery/appwindow_withdoc.cc:237 #: ../glom/bakery/appwindow_withdoc.cc:288 msgid "" "There was an error while saving the file. Your changes have not been saved." msgstr "" #: ../glom/bakery/appwindow_withdoc.cc:493 msgid "Open Failed." msgstr "" #: ../glom/bakery/appwindow_withdoc.cc:493 msgid "The document could not be opened." msgstr "" #: ../glom/bakery/dialog_offersave.cc:31 msgid "This document has unsaved changes. Would you like to save the document?" msgstr "" #: ../glom/bakery/dialog_offersave.cc:35 msgid "" "Document:\n" "%1" msgstr "" "Dokumento:\n" "%1" #: ../glom/bakery/dialog_offersave.cc:47 msgid "Close without Saving" msgstr "" #: ../glom/bakery/dialog_offersave.cc:53 msgid "Discard" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:99 msgid "Auto Detect" msgstr "" #. We mean 22nd November 2008: #. C years start are the AD year - 1900. So, 01 is 1901. #. C months start at 0. #. starts at 1 #. Get the ISO (not current locale) text representation: #. ignored #. iso_format #: ../glom/import_csv/dialog_import_csv.cc:154 msgid "" "Note that the source file should contain numbers and dates in international " "ISO format. For instance, 22nd November 2008 should be %1." msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:183 msgid "No Document Available" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:183 msgid "You need to open a document to import the data into a table." msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:194 msgid "Import From CSV File" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:199 #: ../glom/import_csv/dialog_import_csv.cc:576 msgid "" msgstr "(Neniu)" #: ../glom/import_csv/dialog_import_csv.cc:274 msgid "Error Importing CSV File" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:428 msgid "Encoding detected as: %1" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:467 msgid "Encoding detection failed. Please manually choose one from the box." msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:471 msgid "" "The file contains data not in the specified encoding. Please choose another " "one, or try \"Auto Detect\"." msgstr "" #. Translators: This is the name of a UI element (a layout part name). #. This is a straight line, not a database row. #: ../glom/import_csv/dialog_import_csv.cc:513 #: ../glom/libglom/data_structure/layout/layoutitem_line.cc:91 msgid "Line" msgstr "Linio" #: ../glom/import_csv/dialog_import_csv.cc:556 msgid "Target Field" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:601 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:611 #| msgctxt "Field (picture). Parent table: contacts" #| msgid "Picture" msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:710 msgid "" "One column needs to be assigned the table's primary key (%1) as " "target field before importing" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:738 msgid "Could Not Open file" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:739 msgid "The file at \"%1\" could not be opened: %2" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:745 msgid "Import From CSV File: %1" msgstr "" #: ../glom/import_csv/dialog_import_csv_progress.cc:85 msgid "Parsing CSV file %1" msgstr "" #: ../glom/import_csv/dialog_import_csv_progress.cc:174 msgid "Import complete\n" msgstr "" #: ../glom/import_csv/dialog_import_csv_progress.cc:203 msgid "" "Warning: Importing row %1: The value for field %2 must be unique, but is " "already in use. The value will not be imported.\n" msgstr "" #: ../glom/import_csv/dialog_import_csv_progress.cc:212 msgid "" "Warning: Importing row %1: The value for field %2, \"%3\" could not be " "converted to the field's type. The value will not be imported.\n" msgstr "" #: ../glom/import_csv/dialog_import_csv_progress.cc:237 msgid "" "Error importing row %1: Cannot import the row because the primary key is " "empty.\n" msgstr "" #. TODO: Can we get this from anywhere else, such as iso-codes? murrayc #. TODO: Make this generally more efficient. #: ../glom/import_csv/file_encodings.cc:93 #: ../glom/import_csv/file_encodings.cc:94 #: ../glom/import_csv/file_encodings.cc:95 #: ../glom/import_csv/file_encodings.cc:96 #: ../glom/import_csv/file_encodings.cc:97 #: ../glom/import_csv/file_encodings.cc:98 #: ../glom/import_csv/file_encodings.cc:99 #: ../glom/import_csv/file_encodings.cc:100 msgid "Unicode" msgstr "Unikodo" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:102 #: ../glom/import_csv/file_encodings.cc:115 #: ../glom/import_csv/file_encodings.cc:120 msgid "Western" msgstr "Okcidente" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:103 #: ../glom/import_csv/file_encodings.cc:118 msgid "Central European" msgstr "MezeÅ­rope" #: ../glom/import_csv/file_encodings.cc:104 msgid "South European" msgstr "SudeÅ­rope" #: ../glom/import_csv/file_encodings.cc:105 #: ../glom/import_csv/file_encodings.cc:113 #: ../glom/import_csv/file_encodings.cc:125 msgid "Baltic" msgstr "Balta" #: ../glom/import_csv/file_encodings.cc:106 #: ../glom/import_csv/file_encodings.cc:119 msgid "Cyrillic" msgstr "Cirila" #: ../glom/import_csv/file_encodings.cc:107 #: ../glom/import_csv/file_encodings.cc:124 msgid "Arabic" msgstr "Araba" #: ../glom/import_csv/file_encodings.cc:108 #: ../glom/import_csv/file_encodings.cc:121 msgid "Greek" msgstr "Greka" #: ../glom/import_csv/file_encodings.cc:109 msgid "Hebrew Visual" msgstr "Vidhebrea" #: ../glom/import_csv/file_encodings.cc:110 #: ../glom/import_csv/file_encodings.cc:123 msgid "Hebrew" msgstr "Hebrea" #: ../glom/import_csv/file_encodings.cc:111 #: ../glom/import_csv/file_encodings.cc:122 msgid "Turkish" msgstr "" #: ../glom/import_csv/file_encodings.cc:112 msgid "Nordic" msgstr "Norda" #: ../glom/import_csv/file_encodings.cc:114 msgid "Celtic" msgstr "Kelta" #: ../glom/import_csv/file_encodings.cc:116 msgid "Romanian" msgstr "Rumana" #: ../glom/import_csv/file_encodings.cc:126 msgid "Vietnamese" msgstr "Vjetnama" #. Translators: This means an unknown or unnacceptable value type in a database. #: ../glom/libglom/data_structure/field.cc:691 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:151 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:159 msgid "Invalid" msgstr "Nevalida" #. Translators: This means a numeric value type in a database. #: ../glom/libglom/data_structure/field.cc:694 msgid "Number" msgstr "Nombro" #. Translators: This means a text/string value type in a database. #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/field.cc:697 #: ../glom/libglom/data_structure/layout/layoutitem_text.cc:73 #: ../glom/libglom/data_structure/translatable_item.cc:248 #: ../glom/mode_design/layout/dialog_layout_details.cc:1159 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:36 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:759 msgid "Text" msgstr "Teksto" #. Translators: This means a time value type in a database. #: ../glom/libglom/data_structure/field.cc:700 #| msgctxt "Field (time). Parent table: scenes" #| msgid "Time" msgid "Time" msgstr "Horo" #. Translators: This means a time value type in a database. #: ../glom/libglom/data_structure/field.cc:703 #| msgctxt "Field (date). Parent table: scenes" #| msgid "Date" msgid "Date" msgstr "Dato" #. Translators: This means a true/false value type in a database. #: ../glom/libglom/data_structure/field.cc:706 msgid "Boolean" msgstr "Buleo" #. Translators: This means a picture value type in a database. #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/field.cc:709 #: ../glom/libglom/data_structure/layout/layoutitem_image.cc:70 #: ../glom/libglom/data_structure/translatable_item.cc:250 #: ../glom/mode_design/layout/dialog_layout_details.cc:1166 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:38 #: ../glom/utility_widgets/layouttoolbar.cc:47 msgid "Image" msgstr "Bildo" #. TRANSLATORS: Please only translate this string if you know that strftime() #. * shows only 2 year digits when using format "x". We want to always display #. * 4 year digits. For instance, en_GB should translate it to "%d/%m/%Y". #. * Glom will show a warning in the terminal at startup if this is necessary #. * and default to %d/%m/%Y" if it detects a problem, but that might not be #. * correct for your locale. #. * Thanks. #: ../glom/libglom/data_structure/glomconversions.cc:99 #, no-c-format msgid "%x" msgstr "%x" #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:147 msgid "" "ERROR: sanity_check_date_parsing(): Sanity check failed: Glom could not " "parse a date's text representation that it generated itself, in this locale." msgstr "" #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:181 msgid "" "ERROR: sanity_check_date_text_representation_uses_4_digit_year(): Sanity " "check failed: Glom does not seem to use 4 digits to display years in a " "date's text representation, in this locale. Defaulting to dd/mm/yyyy though " "this might be incorrect for your locale. This needs attention from a " "translator. Please file a bug - see http://www.glom.org" msgstr "" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutgroup.cc:514 #: ../glom/utility_widgets/layouttoolbar.cc:35 #: ../glom/utility_widgets/layouttoolbar.cc:45 #: ../glom/utility_widgets/notebooklabelglom.cc:76 msgid "Group" msgstr "Grupo" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_button.cc:68 #: ../glom/libglom/data_structure/translatable_item.cc:246 #: ../glom/mode_design/layout/dialog_layout_details.cc:1152 #: ../glom/utility_widgets/layouttoolbar.cc:43 msgid "Button" msgstr "Butono" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_calendarportal.cc:58 msgid "Calendar Portal" msgstr "" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_field.cc:229 #: ../glom/libglom/data_structure/translatable_item.cc:228 #: ../glom/mode_design/dialog_database_preferences.cc:62 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:755 #: ../ui/developer/window_field_definition_edit.glade.h:8 msgid "Field" msgstr "Kampo" #. Translators: This is the name of a UI element (a layout part name). #. "Notebook" means a GtkNotebook-type widget. #: ../glom/libglom/data_structure/layout/layoutitem_notebook.cc:57 #: ../glom/utility_widgets/layouttoolbar.cc:37 msgid "Notebook" msgstr "Notaro" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_placeholder.cc:60 msgid "Placeholder" msgstr "" #. TODO: "Portal" probably shouldn't appear in the UI. #. We should use "Related Records instead. #. Translators: This is the name of a UI element (a layout part name). #. It means a list of related records. #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:88 msgid "Portal" msgstr "" #. TODO: This prevents "" as a real title. #. parent table - not relevant #. TODO: This prevents "" as a real title. #. Note to translators: This text is shown instead of a table title, when the table has not yet been chosen. #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:424 #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:433 #: ../glom/mode_data/box_data_portal.cc:116 #: ../glom/mode_data/box_data_portal.cc:128 msgid "Undefined Table" msgstr "" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:79 #: ../ui/developer/dialog_field_summary.glade.h:1 msgid "Field Summary" msgstr "" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:134 msgid "No summary chosen" msgstr "" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:153 msgid "Sum" msgstr "Sumo" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:155 msgid "Average" msgstr "" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:157 #| msgctxt "Field (address_country). Parent table: accommodation" #| msgid "Country" msgid "Count" msgstr "Nombri" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_footer.cc:56 #: ../ui/developer/window_report_layout.glade.h:12 msgid "Footer" msgstr "" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.cc:103 #: ../ui/developer/dialog_group_by.glade.h:1 msgid "Group By" msgstr "" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_header.cc:56 #: ../ui/developer/window_report_layout.glade.h:9 msgid "Header" msgstr "PaÄokapo" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_summary.cc:62 msgid "Summary" msgstr "Resumo" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc:56 msgid "Vertical Group" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:230 msgid "Custom Title" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:232 msgid "Relationship" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:234 msgid "Layout Item" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:236 msgid "Print Layout" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:238 msgid "Report" msgstr "Raporto" #. Tables: #: ../glom/libglom/data_structure/translatable_item.cc:240 #: ../glom/mode_design/box_db_table_relationships.cc:53 #: ../glom/mode_design/dialog_database_preferences.cc:61 #: ../glom/mode_design/users/dialog_groups_list.cc:73 #: ../glom/navigation/box_tables.cc:132 msgid "Table" msgstr "Tabelo" #: ../glom/libglom/data_structure/translatable_item.cc:242 msgid "Layout Group" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:244 #| msgctxt "Field (name_title). Parent table: contacts" #| msgid "Title" msgid "Field Title" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:252 msgid "Field Choice" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:254 msgid "Database Title" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:256 #: ../glom/mode_design/translation/window_translations.cc:217 msgid "Unknown" msgstr "Nekonate" #: ../glom/libglom/document/document.cc:507 #: ../glom/libglom/document/document.cc:525 msgid "System Preferences" msgstr "" #: ../glom/libglom/document/document.cc:538 #| msgctxt "Field (name_last). Parent table: contacts" #| msgid "Last Name" msgid "System Name" msgstr "" #: ../glom/libglom/document/document.cc:544 #| msgctxt "Field (name_last). Parent table: contacts" #| msgid "Last Name" msgid "Organisation Name" msgstr "" #: ../glom/libglom/document/document.cc:550 msgid "Organisation Logo" msgstr "" #: ../glom/libglom/document/document.cc:556 #| msgctxt "Field (address_street). Parent table: accommodation" #| msgid "Street" msgid "Street" msgstr "Strato" #: ../glom/libglom/document/document.cc:562 msgid "Street (line 2)" msgstr "" #: ../glom/libglom/document/document.cc:568 msgid "City" msgstr "Urbo" #: ../glom/libglom/document/document.cc:574 #| msgctxt "Field (address_state). Parent table: contacts" #| msgid "State" msgid "State" msgstr "Åœtato" #: ../glom/libglom/document/document.cc:580 #| msgctxt "Field (address_country). Parent table: accommodation" #| msgid "Country" msgid "Country" msgstr "Lando" #: ../glom/libglom/document/document.cc:586 msgid "Zip Code" msgstr "PoÅtkodo" #: ../glom/libglom/document/document.cc:1546 #| msgctxt "Layout Group (overview). Parent table: accommodation" #| msgid "Overview" msgid "Overview" msgstr "Superrigardo" #: ../glom/libglom/document/bakery/document.cc:413 #| msgctxt "Field (name_title). Parent table: contacts" #| msgid "Title" msgid "Untitled" msgstr "Sentitole" #: ../glom/libglom/gst-package.c:56 msgid "Could not install package" msgstr "" #: ../glom/libglom/gst-package.c:74 msgid "The necessary applications to install the package could not be found." msgstr "" #. Show only debug output #: ../glom/libglom/translations_po.cc:69 msgid "Gettext-Warning: " msgstr "" #: ../glom/libglom/db_utils.cc:503 msgid "System: Auto Increments" msgstr "" #: ../glom/libglom/db_utils.cc:1173 #: ../glom/mode_design/users/dialog_groups_list.cc:70 #| msgctxt "Field (description). Parent table: accommodation" #| msgid "Description" msgid "Description" msgstr "Priskribo" #: ../glom/libglom/db_utils.cc:1180 #| msgctxt "Field (comments). Parent table: accommodation" #| msgid "Comments" msgid "Comments" msgstr "Komentoj" #. Translators: This is a noun. It is the title of a report. #. Add Pages: #. Translators: This is a noun. It is a notebook tab title. #: ../glom/libglom/report_builder.cc:771 ../glom/mode_data/notebook_data.cc:62 #: ../glom/mode_find/notebook_find.cc:31 msgid "List" msgstr "Listo" #: ../glom/glom_create_from_example.cc:63 ../glom/glom_export_po.cc:51 #: ../glom/glom_export_po_all.cc:49 ../glom/glom_import_po_all.cc:50 #: ../glom/glom_test_connection.cc:55 ../glom/main.cc:197 msgid "Glom options" msgstr "" #: ../glom/glom_create_from_example.cc:63 ../glom/glom_export_po.cc:51 #: ../glom/glom_export_po_all.cc:49 ../glom/glom_import_po_all.cc:50 #: ../glom/glom_test_connection.cc:55 msgid "Command-line options" msgstr "" #: ../glom/glom_create_from_example.cc:70 msgid "The example .glom file to open." msgstr "" #: ../glom/glom_create_from_example.cc:75 msgid "" "The directory in which to save the created .glom file, or sub-directory if " "necessary, such as /home/someuser/ ." msgstr "" #: ../glom/glom_create_from_example.cc:80 msgid "The name for the created .glom file, such as something.glom ." msgstr "" #: ../glom/glom_create_from_example.cc:85 ../glom/glom_export_po.cc:72 #: ../glom/glom_export_po_all.cc:60 ../glom/glom_import_po_all.cc:61 #: ../glom/glom_test_connection.cc:63 ../glom/main.cc:212 msgid "The version of this application." msgstr "" #: ../glom/glom_create_from_example.cc:91 msgid "" "The hostname of the PostgreSQL server, such as localhost. If this is not " "specified then a self-hosted database will be created." msgstr "" #: ../glom/glom_create_from_example.cc:96 ../glom/glom_test_connection.cc:73 msgid "The port of the PostgreSQL server, such as 5434." msgstr "" #: ../glom/glom_create_from_example.cc:101 ../glom/glom_test_connection.cc:78 msgid "The username for the PostgreSQL server." msgstr "" #: ../glom/glom_create_from_example.cc:238 ../glom/glom_export_po.cc:112 #: ../glom/glom_export_po_all.cc:100 ../glom/glom_import_po_all.cc:101 #: ../glom/glom_test_connection.cc:131 ../glom/main.cc:486 msgid "Error while parsing command-line options: " msgstr "" #. TODO: How can we just print them out? #: ../glom/glom_create_from_example.cc:239 ../glom/glom_export_po.cc:113 #: ../glom/glom_export_po_all.cc:101 ../glom/glom_import_po_all.cc:102 #: ../glom/glom_test_connection.cc:91 ../glom/main.cc:487 msgid "Use --help to see a list of available command-line options." msgstr "" #: ../glom/glom_create_from_example.cc:273 ../glom/glom_export_po.cc:162 #: ../glom/main.cc:531 msgid "Glom: The file does not exist." msgstr "" #: ../glom/glom_create_from_example.cc:283 ../glom/glom_export_po.cc:172 #: ../glom/main.cc:541 msgid "Glom: The file path is a directory instead of a file." msgstr "" #: ../glom/glom_create_from_example.cc:314 msgid "Glom: The output directory does not exist." msgstr "" #: ../glom/glom_create_from_example.cc:324 msgid "Glom: The output path is not a directory." msgstr "" #: ../glom/glom_create_from_example.cc:422 ../glom/glom_test_connection.cc:166 msgid "Please enter the PostgreSQL server's password for the user %1: " msgstr "" #: ../glom/glom_export_po.cc:57 msgid "" "The path at which to save the created .po file, such as /home/someuser/" "somefile.po ." msgstr "" #: ../glom/glom_export_po.cc:62 msgid "" "The locale whose translations should be written to the .po file, such as " "de_DE." msgstr "" #: ../glom/glom_export_po.cc:67 msgid "Generate a .pot template file instead of a .po file for a locale." msgstr "" #: ../glom/glom_export_po.cc:142 ../glom/glom_export_po_all.cc:130 #: ../glom/glom_import_po_all.cc:131 msgid "Please specify a glom file." msgstr "" #: ../glom/glom_export_po.cc:149 msgid "Please use either the --locale-id option or the --template option." msgstr "" #: ../glom/glom_export_po.cc:180 ../glom/glom_export_po_all.cc:161 msgid "Please specify an output path." msgstr "" #: ../glom/glom_export_po.cc:220 msgid "Pot file creation failed." msgstr "" #: ../glom/glom_export_po.cc:224 msgid "Pot file created at: %1" msgstr "" #: ../glom/glom_export_po.cc:232 ../glom/glom_export_po_all.cc:223 msgid "Po file creation failed." msgstr "" #: ../glom/glom_export_po.cc:236 ../glom/glom_export_po_all.cc:227 msgid "Po file created at: %1" msgstr "" #: ../glom/glom_export_po_all.cc:55 msgid "" "The directory path at which to save the created .po files, such as /home/" "someuser/po_files/ ." msgstr "" #: ../glom/glom_export_po_all.cc:143 ../glom/glom_import_po_all.cc:144 msgid "The Glom file does not exist." msgstr "" #: ../glom/glom_export_po_all.cc:153 ../glom/glom_import_po_all.cc:154 msgid "The Glom file path is a directory instead of a file." msgstr "" #: ../glom/glom_export_po_all.cc:174 msgid "The ouput directory could not be created." msgstr "" #: ../glom/glom_export_po_all.cc:182 msgid "Glom: The output file path is not a directory." msgstr "" #: ../glom/glom_export_po_all.cc:204 msgid "The Glom document has no translations." msgstr "" #: ../glom/glom_import_po_all.cc:56 msgid "" "The path to a directory containing .po files, such as /home/someuser/" "po_files/ ." msgstr "" #: ../glom/glom_import_po_all.cc:162 msgid "Please specify the path to a directory containing po files." msgstr "" #: ../glom/glom_import_po_all.cc:173 msgid "Glom: The po files directory path is not a directory." msgstr "" #: ../glom/glom_import_po_all.cc:213 msgid "Po file import failed for locale: %1" msgstr "" #: ../glom/glom_import_po_all.cc:218 msgid "Po file imported for locale: %1 for file %2" msgstr "" #: ../glom/glom_test_connection.cc:68 msgid "The hostname of the PostgreSQL server, such as localhost." msgstr "" #: ../glom/glom_test_connection.cc:84 msgid "The specific database on the PostgreSQL server (Optional)." msgstr "" #: ../glom/glom_test_connection.cc:156 msgid "Please provide a database username." msgstr "" #: ../glom/glom_test_connection.cc:215 msgid "" "Error: Could not connect to the server even without specifying a database." msgstr "" #: ../glom/glom_test_connection.cc:223 msgid "Error: Could not connect to the specified database." msgstr "" #: ../glom/glom_test_connection.cc:229 msgid "Successful connection." msgstr "" #: ../glom/main.cc:197 msgid "Command-line options for glom" msgstr "" #: ../glom/main.cc:207 msgid "The Filename" msgstr "La dosiernomo" #: ../glom/main.cc:217 msgid "Whether the filename is a .tar.gz backup to be restored." msgstr "" #: ../glom/main.cc:222 msgid "" "Do not automatically stop the database server if Glom quits. This is helpful " "for debugging with gdb." msgstr "" #: ../glom/main.cc:227 msgid "Show the generated SQL queries on stdout, for debugging." msgstr "" #: ../glom/main.cc:232 msgid "Show how Glom outputs a date in this locale, then stop." msgstr "" #: ../glom/main.cc:245 msgid "" "You seem to be running Glom as a user with administrator privileges. Glom " "may not be run with such privileges for security reasons.\n" "Please login to your system as a normal user." msgstr "" #. Warn the user: #: ../glom/main.cc:259 msgid "" "You seem to be running Glom as root. Glom may not be run as root.\n" "Please login to your system as a normal user." msgstr "" #: ../glom/main.cc:265 msgid "Running As Root" msgstr "" #. Show message to the user about the broken installation: #. This is a packaging bug, but it would probably annoy packagers to mention that in the dialog: #. Show message to the user about the broken installation: #: ../glom/main.cc:308 ../glom/main.cc:321 ../glom/main.cc:564 msgid "Incomplete Glom Installation" msgstr "" #. use_markup #. modal #: ../glom/main.cc:309 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "You may now install PostgreSQL to complete the Glom installation." msgstr "" #: ../glom/main.cc:311 msgid "Install PostgreSQL" msgstr "" #. use_markup #. modal #: ../glom/main.cc:322 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:338 msgid "" "Your installation of Glom is not complete, because the Glom Python module is " "not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" #: ../glom/main.cc:340 msgid "Glom Python Module Not Installed" msgstr "" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:353 msgid "" "Your installation of Glom is not complete, because the gi.repository Python " "module is not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" #: ../glom/main.cc:355 msgid "gi.repository Python Module Not Installed" msgstr "" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:368 msgid "" "Your installation of Glom is not complete, because the gi.repository.Gda " "python module is not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" #: ../glom/main.cc:370 msgid "gi.repository.Gda Python Module Not Installed" msgstr "" #. The Postgres provider was not found, so warn the user: #: ../glom/main.cc:562 msgid "" "Your installation of Glom is not complete, because the PostgreSQL libgda " "provider is not available on your system. This provider is needed to access " "Postgres database servers.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" #. Don't add ContextLayout in client only mode because it would never #. be sensitive anyway #: ../glom/mode_data/box_data_calendar_related.cc:512 #: ../glom/mode_data/db_adddel/db_adddel.cc:249 #: ../ui/developer/window_data_layout.glade.h:1 msgid "Layout" msgstr "" #: ../glom/mode_data/box_data.cc:149 msgid "" "You have not entered any find criteria. Try entering information in the " "fields." msgstr "" #: ../glom/mode_data/box_data.cc:151 #: ../glom/mode_data/datawidget/dialog_choose_id.cc:110 msgid "No Find Criteria" msgstr "" #: ../glom/mode_data/box_data.cc:190 msgid "" "This data cannot be stored in the database because you have not provided a " "primary key.\n" "Do you really want to discard this data?" msgstr "" #. Ask user to confirm loss of data: #: ../glom/mode_data/box_data.cc:192 msgid "No primary key value" msgstr "" #: ../glom/mode_data/box_data_details.cc:112 msgid "Create a new record." msgstr "" #: ../glom/mode_data/box_data_details.cc:113 msgid "Remove this record." msgstr "" #: ../glom/mode_data/box_data_details.cc:114 msgid "View the first record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:115 msgid "View the previous record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:116 msgid "View the next record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:117 msgid "View the last record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:417 msgid "Layout Contains No Fields" msgstr "" #: ../glom/mode_data/box_data_details.cc:417 msgid "" "There are no fields on the layout, so there is no way to enter data in a new " "record." msgstr "" #. Tell user that a primary key is needed to delete a record: #: ../glom/mode_data/box_data_details.cc:444 msgid "No primary key value." msgstr "" #: ../glom/mode_data/box_data_details.cc:445 msgid "This record cannot be deleted because there is no primary key." msgstr "" #. Warn user that they can't choose their own primary key: #: ../glom/mode_data/box_data_details.cc:854 msgid "Primary key auto increments" msgstr "" #: ../glom/mode_data/box_data_details.cc:855 msgid "" "The primary key is auto-incremented.\n" " You may not enter your own primary key value." msgstr "" #: ../glom/mode_data/box_data_portal.cc:337 msgid "No Corresponding Record Exists" msgstr "" #: ../glom/mode_data/box_data_portal.cc:337 msgid "" "No record with this value exists. Therefore navigation to the related record " "is not possible." msgstr "" #: ../glom/mode_data/flowtablewithfields.cc:1188 #: ../glom/utility_widgets/notebooklabelglom.cc:75 #: ../glom/utility_widgets/notebooklabelglom.cc:116 msgid "New Group" msgstr "Nova grupo" #: ../glom/mode_data/flowtablewithfields.cc:1194 #: ../glom/mode_design/layout/dialog_layout_details.cc:736 msgid "notebook" msgstr "notaro" #. Note to translators: This is the default name (not seen by most users) for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1200 msgid "tab1" msgstr "" #. Note to translators: This is the default label text for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1203 msgid "Tab One" msgstr "" #: ../glom/mode_data/flowtablewithfields.cc:1216 msgid "button" msgstr "butono" #: ../glom/mode_data/flowtablewithfields.cc:1217 #: ../glom/mode_design/layout/dialog_layout_details.cc:662 msgid "New Button" msgstr "Nova butono" #. Note to translators: This is the default contents of a text item on a print layout: #: ../glom/mode_data/flowtablewithfields.cc:1223 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:457 msgid "text" msgstr "teksto" #: ../glom/mode_data/flowtablewithfields.cc:1224 msgid "New Text" msgstr "Nova teksto" #. TODO: Use a real English sentence here? #: ../glom/mode_data/flowtablewithfields.cc:1392 msgid "Delete whole group \"%1\"?" msgstr "" #. TODO: Use a real English sentence here: #: ../glom/mode_data/flowtablewithfields.cc:1398 msgid "Delete whole group?" msgstr "" #. Translators: This is a title, not an action. #: ../glom/mode_data/notebook_data.cc:72 msgid "List Or Details View" msgstr "" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/box_db_table_relationships.cc:47 msgid "" "This relationship already exists. Please choose a different relationship name" msgstr "" #. Translators: FROM as in SQL's FROM #: ../glom/mode_design/box_db_table_relationships.cc:52 msgid "From Field" msgstr "" #: ../glom/mode_design/box_db_table_relationships.cc:54 msgid "To Field" msgstr "" #: ../glom/mode_design/box_db_table_relationships.cc:55 #: ../ui/developer/dialog_layout_field_properties.glade.h:3 msgid "Allow Editing" msgstr "" #: ../glom/mode_design/box_db_table_relationships.cc:56 msgid "Automatic Creation" msgstr "" #: ../glom/mode_design/box_db_table_relationships.cc:58 #: ../glom/navigation/box_tables.cc:143 msgid "Title (Singular Form)" msgstr "" #: ../glom/mode_design/dialog_database_preferences.cc:63 msgid "Next Value" msgstr "" #: ../glom/mode_design/dialog_design.cc:53 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:640 #: ../ui/developer/window_design.glade.h:3 msgid "None selected" msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:83 msgid "Username Is Empty" msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:83 msgid "Please enter a login name for the new user." msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:88 #: ../glom/mode_design/users/dialog_user.cc:58 msgid "Passwords Do Not Match" msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:88 #: ../glom/mode_design/users/dialog_user.cc:58 msgid "" "The entered password does not match the entered password confirmation. " "Please try again." msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:93 #: ../glom/mode_design/users/dialog_user.cc:63 msgid "Password Is Empty" msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:93 #: ../glom/mode_design/users/dialog_user.cc:63 msgid "Please enter a password for this user." msgstr "" #. Don't allow adding of fields that already exist. #: ../glom/mode_design/fields/box_db_table_definition.cc:56 #: ../glom/mode_design/fields/box_db_table_definition.cc:334 msgid "This field already exists. Please choose a different field name" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:60 msgid "Type" msgstr "Tipo" #. TODO: Only show this when there are > 100 records? #: ../glom/mode_design/fields/box_db_table_definition.cc:264 msgid "Recalculation Required" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:265 msgid "" "You have changed the calculation used by this field so Glom must recalculate " "the value in all records. If the table contains many records then this could " "take a long time." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:270 msgid "Recalculate" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:279 msgid "Invalid database structure" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:280 msgid "" "This database field was created or edited outside of Glom. It has a data " "type that is not supported by Glom. Your system administrator may be able to " "correct this." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:288 msgid "Primary key required" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:289 msgid "" "You may not unset the primary key because the table must have a primary key. " "You may set another field as the primary key instead." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:301 msgid "Field contains empty values." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:301 msgid "" "The field may not yet be used as a primary key because it contains empty " "values." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:310 msgid "Field contains non-unique values." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:310 msgid "" "The field may not yet be used as a primary key because it contains values " "that are not unique." msgstr "" #. Ask the user to confirm this major change: #: ../glom/mode_design/fields/box_db_table_definition.cc:315 msgid "Change primary key" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:316 msgid "" "Are you sure that you wish to set this field as the primary key, instead of " "the existing primary key?" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:321 msgid "Change Primary Key" msgstr "" #. Warn the user and refuse to make the change: #: ../glom/mode_design/fields/box_db_table_definition.cc:333 msgid "Field Name Already Exists" msgstr "" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:103 msgid "Calculation Error" msgstr "" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:103 msgid "The calculation does not have a return statement." msgstr "" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:148 msgid "Calculation result" msgstr "" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:148 msgid "" "The result of the calculation is:\n" "%1" msgstr "" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:150 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc:140 msgid "Calculation failed" msgstr "" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:150 #, c-format msgid "" "The calculation failed with this error:\n" "%s" msgstr "" #: ../glom/mode_design/fields/dialog_fielddefinition.cc:159 msgid "Default Value" msgstr "" #. A special "None" item, allowing the user to do the equivalent of clearing the combobox, #. which is not normally possible with the GtkComboBox UI: #. set_property() does not work with a const gchar*, so we explicitly create a ustring. #. otherwise we get this warning: #. " unable to set property `text' of type `gchararray' from value of type `glibmm__CustomPointer_Pc' " #. TODO: Add a template specialization to Glib::ObjectBase::set_property() to allow this? #: ../glom/mode_design/layout/combobox_fields.cc:216 msgid "(None)" msgstr "(Neniu)" #: ../glom/mode_design/layout/combobox_relationship.cc:268 msgid " Via: %1::%2" msgstr "" #: ../glom/mode_design/layout/combobox_relationship.cc:272 msgid " Via: %1" msgstr "" #: ../glom/mode_design/layout/dialog_layout_calendar_related.cc:239 #: ../glom/mode_design/layout/dialog_layout_list_related.cc:294 msgid "None: No visible tables are specified by the fields." msgstr "" #. Columns-count column: #. Note to translators: This is the number of columns in a group (group being a noun) #: ../glom/mode_design/layout/dialog_layout_details.cc:129 msgid "Group Columns" msgstr "" #. Column-Width column: (only for list views) #. Note to translators: This is a name (the width of a UI element in the display), not an action. #: ../glom/mode_design/layout/dialog_layout_details.cc:142 msgid "Display Width" msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:687 #| msgctxt "Field (name_title). Parent table: contacts" #| msgid "Title" msgid "Text Title" msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:712 #| msgctxt "Field (name_title). Parent table: contacts" #| msgid "Title" msgid "Image Title" msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:867 msgid "group" msgstr "grupo" #: ../glom/mode_design/layout/dialog_layout_details.cc:959 #: ../ui/developer/dialog_notebook.glade.h:1 msgid "Notebook Tabs" msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:959 msgid "Add child groups to the notebook to add tabs." msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:1122 msgid "Related Calendar: %1" msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:1124 msgid "Related List: %1" msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:1141 msgid "Field: %1" msgstr "Kampo: %1" #: ../glom/mode_design/layout/dialog_layout_details.cc:1200 msgid "(Notebook)" msgstr "" #. Append the View columns: #: ../glom/mode_design/layout/dialog_layout_export.cc:55 msgid "Fields" msgstr "Kampoj" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:406 msgid "Invalid Relationship" msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:407 msgid "" "The relationship may not be used to show related records because the " "relationship does not specify a field in the related table." msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:413 msgid "Relationship Uses a Related Primary Key" msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:414 msgid "" "The relationship may not be used to show related records because the " "relationship uses a primary key field in the related table, which must " "contain unique values. This would prevent the relationship from specifying " "multiple related records." msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:420 msgid "Relationship Uses a Related Unique Field" msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:421 msgid "" "The relationship may not be used to show related records because the " "relationship uses a unique-values field in the related table. This would " "prevent the relationship from specifying multiple related records." msgstr "" #. Translators: This is Automatic text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:115 msgid "Automatic" msgstr "" #. Translators: This is Left text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:119 msgid "Left" msgstr "Maldekstre" #. Translators: This is Right text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:123 #| msgctxt "Field Choice. Parent table: scenes, Parent Field: day_or_night" #| msgid "Night" msgid "Right" msgstr "Dekstre" #. Give it access to the document. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:166 msgid "Extra Fields" msgstr "" #. Give it access to the document. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:174 msgid "Sort Order" msgstr "" #. Add labels (because we will hide the checkboxes): #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:201 msgid "Font" msgstr "Tiparo" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:204 msgid "Foreground Color" msgstr "" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:207 msgid "Background Color" msgstr "" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc:140 msgid "" "The calculation failed with this error:\n" "%1" msgstr "" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc:33 #: ../ui/developer/dialog_fieldslist.glade.h:2 #: ../ui/developer/dialog_group_by.glade.h:4 #: ../ui/developer/window_data_layout.glade.h:23 msgid "Formatting" msgstr "" #. Give it access to the document. #: ../glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc:161 msgid "Group By - Secondary Fields" msgstr "" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.cc:59 #| msgctxt "Field Choice. Parent table: scenes, Parent Field: day_or_night" #| msgid "Evening" msgid "Ascending" msgstr "" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #: ../glom/mode_design/report_layout/dialog_layout_report.cc:155 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:206 #| msgctxt "Field (mainpart). Parent table: characters" #| msgid "Main Part" msgid "Part" msgstr "Parto" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/print_layouts/box_print_layouts.cc:96 msgid "This item already exists. Please choose a different item name" msgstr "" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:224 msgid "Are you sure that you want to rename this print layout?" msgstr "" #. TODO: Show old and new names? #: ../glom/mode_design/print_layouts/box_print_layouts.cc:225 msgid "Rename Print Layout" msgstr "" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:227 #: ../glom/navigation/box_tables.cc:403 msgid "Rename" msgstr "Alinomi" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:30 #: ../glom/utility_widgets/layouttoolbar.cc:32 msgid "Items" msgstr "Elementoj" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:31 msgid "Lines" msgstr "Linioj" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:32 msgid "Records" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:34 #: ../glom/utility_widgets/layouttoolbar.cc:39 msgid "Database Field" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:34 #: ../glom/utility_widgets/layouttoolbar.cc:39 msgid "Drag this to the layout to add a new database field." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:36 #: ../glom/utility_widgets/layouttoolbar.cc:45 msgid "Drag this to the layout to add a new static text box." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:38 #: ../glom/utility_widgets/layouttoolbar.cc:47 msgid "Drag this to the layout to add a new static image." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:40 msgid "Horizontal Line" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:40 msgid "Drag this to the layout to add a new horizontal line." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:42 msgid "Vertical Line" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:42 msgid "Drag this to the layout to add a new vertical line." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:44 #: ../glom/utility_widgets/layouttoolbar.cc:41 msgid "Related Records" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:44 msgid "Drag this to the layout to add a new related records portal." msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:229 msgid "Unselect All" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:232 msgid "_Insert" msgstr "Enmet_i" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:233 msgid "Insert _Field" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:235 msgid "Insert _Text" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:237 msgid "Insert _Image" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:239 msgid "Insert _Related Records" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:241 msgid "Insert _Horizontal Line" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:243 msgid "Insert _Vertical Line" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:245 msgid "_Create Standard Layout" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:247 msgid "_Add Page" msgstr "_Aldoni paÄon" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:249 msgid "_Delete Page" msgstr "_Forigi paÄon" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:253 msgid "_Align" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:255 msgid "Align _Top" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:259 msgid "Align _Bottom" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:263 msgid "Align _Left" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:267 msgid "Align _Right" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:272 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:64 msgid "_View" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:273 msgid "Show Grid" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:275 msgid "Show Rules" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:277 msgid "Show Outlines" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:281 msgid "Fit Page _Width" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:285 msgid "Zoom 200%" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:293 msgid "Zoom 50%" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:297 msgid "Zoom 25%" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:753 msgid "Insert" msgstr "Enmeti" #. Ask for confirmation: #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:914 msgid "Create Standard Layout" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:915 msgid "" "This is an experimental feature. It will remove all items from the print " "layout and then try to create a layout similar to the layout of the detail " "view." msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:918 #: ../glom/mode_design/users/dialog_groups_list.cc:82 #| msgctxt "Table (characters)" #| msgid "Characters" msgid "Create" msgstr "Krei" #. Ask the user to confirm: #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:958 msgid "Remove page" msgstr "Forigi paÄon" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:959 msgid "" "Are you sure that you wish to remove the last page and any items on that " "page?" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:962 msgid "Remove Page" msgstr "Forigi la paÄon" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:59 msgid "Page _Setup" msgstr "" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:65 msgid "Show _Grid" msgstr "Montri _kradon" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:475 msgid "Edit _Fields" msgstr "" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:478 msgid "Edit _Relationships" msgstr "" #: ../glom/mode_design/script_library/dialog_script_library.cc:130 msgid "Remove library script" msgstr "" #: ../glom/mode_design/script_library/dialog_script_library.cc:131 msgid "" "Do you really want to delete this script? This data can not be recovered" msgstr "" #: ../glom/mode_design/users/dialog_groups_list.cc:76 msgid "View" msgstr "Vido" #: ../glom/mode_design/users/dialog_groups_list.cc:79 msgid "Edit" msgstr "Redakti" #: ../glom/mode_design/users/dialog_groups_list.cc:85 #: ../glom/utility_widgets/layoutwidgetmenu.cc:47 #: ../glom/utility_widgets/layoutwidgetutils.cc:37 #: ../glom/utility_widgets/notebooklabelglom.cc:117 msgid "Delete" msgstr "Forigi" #. TODO: Prevent deletion of standard groups #: ../glom/mode_design/users/dialog_groups_list.cc:218 msgid "Delete Group" msgstr "" #: ../glom/mode_design/users/dialog_groups_list.cc:219 msgid "Are your sure that you wish to delete this group?" msgstr "" #: ../glom/mode_design/users/dialog_groups_list.cc:361 #| msgctxt "Field (name_full). Parent table: contacts" #| msgid "Full Name" msgid "Full access." msgstr "" #. Append the View columns: #: ../glom/mode_design/users/dialog_users_list.cc:66 msgctxt "Users List" msgid "User" msgstr "Uzanto" #: ../glom/mode_design/users/dialog_users_list.cc:161 msgid "Delete User" msgstr "Forigi uzanton" #: ../glom/mode_design/users/dialog_users_list.cc:162 msgid "Are your sure that you wish to delete this user?" msgstr "" #: ../glom/mode_design/users/dialog_users_list.cc:187 msgid "Error Retrieving the List of Users" msgstr "" #: ../glom/mode_design/users/dialog_users_list.cc:188 msgid "" "Glom could not get the list of users from the database server. You probably " "do not have enough permissions. You should be a superuser." msgstr "" #: ../glom/mode_design/users/dialog_users_list.cc:412 msgid "Developer group may not be empty." msgstr "" #: ../glom/mode_design/users/dialog_users_list.cc:413 msgid "The developer group must contain at least one user." msgstr "" #. Prevent two tables with the same name from being added. #: ../glom/navigation/box_tables.cc:134 msgid "This table already exists. Please choose a different table name" msgstr "" #: ../glom/navigation/box_tables.cc:136 msgid "Hidden" msgstr "KaÅite" #. TODO: This should really be a radio, but the use of AddDel makes it awkward to change that CellRenderer property. #: ../glom/navigation/box_tables.cc:140 msgid "Default" msgstr "DefaÅ­lte" #. Ask the user if they want us to try to cope with this: #: ../glom/navigation/box_tables.cc:236 msgid "Table Already Exists" msgstr "" #: ../glom/navigation/box_tables.cc:237 msgid "" "This table already exists on the database server, though it is not mentioned " "in the .glom file. This should not happen. Would you like Glom to attempt to " "use the existing table?" msgstr "" #. TODO: Do not show tables that are not in the document. #: ../glom/navigation/box_tables.cc:297 msgid "" "You cannot delete this table, because there is no information about this " "table in the document." msgstr "" #. Ask the user to confirm: #: ../glom/navigation/box_tables.cc:304 msgid "" "Are you sure that you want to delete this table?\n" "Table name: %1" msgstr "" #: ../glom/navigation/box_tables.cc:305 msgid "Delete Table" msgstr "" #: ../glom/navigation/box_tables.cc:400 msgid "Are you sure that you want to rename this table?" msgstr "" #. TODO: Show old and new names? #: ../glom/navigation/box_tables.cc:401 msgid "Rename Table" msgstr "" #: ../glom/navigation/box_tables.cc:443 msgid "Unknown Table" msgstr "" #: ../glom/navigation/box_tables.cc:444 msgid "" "You cannot open this table, because there is no information about this table " "in the document." msgstr "" #: ../glom/print_layout/canvas_layout_item.cc:263 #: ../glom/utility_widgets/layoutwidgetmenu.cc:39 msgid "Choose Field" msgstr "" #: ../glom/print_layout/canvas_print_layout.cc:285 msgid "_Formatting" msgstr "" #. Append the View columns: #: ../glom/mode_design/translation/window_translations.cc:66 msgid "Original" msgstr "Originale" #: ../glom/mode_design/translation/window_translations.cc:73 msgid "Translation" msgstr "Traduko" #. This is at the end, because it can contain a long description of the item's context. #: ../glom/mode_design/translation/window_translations.cc:79 msgid "Item" msgstr "Elemento" #. Show the file-chooser dialog, to select an output .po file: #: ../glom/mode_design/translation/window_translations.cc:332 #: ../glom/mode_design/translation/window_translations.cc:372 msgid "Choose .po File Name" msgstr "" #: ../glom/mode_design/translation/window_translations.cc:338 #: ../glom/mode_design/translation/window_translations.cc:377 msgid "Po files" msgstr "" #: ../glom/mode_design/translation/window_translations.cc:343 #: ../ui/developer/window_translations.glade.h:7 msgid "Export" msgstr "Elporti" #. Note to translators: "Import" here is an action verb - it's a button. #: ../glom/mode_design/translation/window_translations.cc:384 #: ../ui/developer/window_translations.glade.h:6 msgid "Import" msgstr "Enporti" #: ../glom/utility_widgets/adddel/adddel.cc:157 msgid "This item already exists. Please try again." msgstr "" #. Something more specific and helpful. #: ../glom/utility_widgets/adddel/adddel.cc:161 #| msgctxt "Field (date). Parent table: scenes" #| msgid "Date" msgid "Duplicate" msgstr "Duobligi" #. Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. #: ../glom/mode_data/datawidget/combochoiceswithtreemodel.cc:474 msgid "Example" msgstr "Ekzemplo" #. The GNOME HIG says that labels should have ":" at the end: #. http://library.gnome.org/devel/hig-book/stable/design-text-labels.html.en #: ../glom/mode_data/datawidget/datawidget.cc:74 msgid "%1:" msgstr "%1:" #. Let the user choose a date from a calendar dialog: #: ../glom/mode_data/datawidget/datawidget.cc:213 msgid "..." msgstr "..." #. TODO: A better label/icon for "Choose Date". #: ../glom/mode_data/datawidget/datawidget.cc:214 msgid "Choose a date from an on-screen calendar." msgstr "" #: ../glom/mode_data/datawidget/datawidget.cc:224 msgid "Open the record identified by this ID, in the other table." msgstr "" #: ../glom/mode_data/datawidget/datawidget.cc:234 msgid "" "Enter search criteria to identify records in the other table, to choose an " "ID for this field." msgstr "" #: ../glom/mode_data/datawidget/datawidget.cc:239 msgid "" "Enter details for a new record in the other table, then use its ID for this " "field." msgstr "" #: ../glom/mode_data/db_adddel/db_adddel.cc:78 msgid "Table Content" msgstr "" #. Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. #: ../glom/mode_data/db_adddel/db_adddel.cc:564 msgid "ExampleEg" msgstr "" #: ../glom/mode_data/db_adddel/db_adddel.cc:2087 msgid "Right-click to layout, to specify the related fields." msgstr "" #. Tell user that they can't do that: #: ../glom/mode_data/db_adddel/db_adddel.cc:2304 msgid "Extra Related Records Not Possible" msgstr "" #: ../glom/mode_data/db_adddel/db_adddel.cc:2305 msgid "" "You attempted to add a new related record, but there can only be one related " "record, because the relationship uses a unique key." msgstr "" #: ../glom/mode_data/datawidget/dialog_choose_id.cc:92 #: ../glom/utility_widgets/imageglom.cc:770 #: ../ui/developer/dialog_choose_relationship.glade.h:4 #: ../ui/developer/dialog_field_summary.glade.h:3 #: ../ui/developer/dialog_group_by.glade.h:3 #| msgctxt "Field (address_street). Parent table: accommodation" #| msgid "Street" msgid "Select" msgstr "Elekti" #: ../glom/utility_widgets/dialog_image_load_progress.cc:105 msgid "Not enough memory available to load the image" msgstr "" #: ../glom/utility_widgets/dialog_image_load_progress.cc:157 msgid "Error loading %1" msgstr "" #: ../glom/utility_widgets/dialog_image_load_progress.cc:158 msgid "Error loading image" msgstr "" #: ../glom/utility_widgets/dialog_image_save_progress.cc:135 msgid "Error Saving" msgstr "" #: ../glom/utility_widgets/dialog_image_save_progress.cc:136 msgid "Error saving image" msgstr "" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:82 msgid "New Database" msgstr "Nova datumbazo" #. For instance, an extra hint when saving from an example, saying that a new file must be saved. #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:99 msgid "" "Please choose a human-readable title for the new database. You can change " "this later in the database properties. It may contain any characters." msgstr "" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:105 #: ../ui/developer/window_field_definition_edit.glade.h:4 #: ../ui/developer/window_report_layout.glade.h:7 #| msgctxt "Field (name_title). Parent table: contacts" #| msgid "Title" msgid "_Title:" msgstr "_Titolo:" #. Use titles that show the distinction between PostgreSQL and SQLite: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:121 msgid "" "Create PostgreSQL database in its own folder, to be hosted by this computer." msgstr "" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:125 msgid "" "Create database on an external PostgreSQL database server, to be specified " "in the next step." msgstr "" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:131 msgid "" "Create SQLite database in its own folder, to be hosted by this computer." msgstr "" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:132 msgid "" "SQLite does not support authentication or remote access but is suitable for " "embedded devices." msgstr "" #. TODO: Hide this because it's the only radio button, so it's not a choice: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:142 msgid "" "Create database in its own folder, to be hosted by this computer, using " "SQLite" msgstr "" #. Only PostgreSQL: #. Use titles that don't mention the boring name of the backend: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:151 msgid "Create database in its own folder, to be hosted by this computer." msgstr "" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:155 msgid "" "Create database on an external database server, to be specified in the next " "step." msgstr "" #: ../glom/utility_widgets/imageglom.cc:655 #| msgctxt "Field (pages). Parent table: scenes" #| msgid "Pages" msgid "Images" msgstr "Bildoj" #: ../glom/utility_widgets/imageglom.cc:676 msgid "Save Image" msgstr "Konservi bildon" #: ../glom/utility_widgets/imageglom.cc:763 msgid "Choose Image" msgstr "" #: ../glom/utility_widgets/imageglom.cc:925 msgid "Open With" msgstr "Malfermi per" #: ../glom/utility_widgets/imageglom.cc:927 msgid "Choose File" msgstr "Elekti dosieron" #: ../glom/utility_widgets/layouttoolbar.cc:33 #| msgctxt "Relationship (contacts). Parent table: accommodation" #| msgid "Contacts" msgid "Containers" msgstr "" #: ../glom/utility_widgets/layouttoolbar.cc:35 msgid "Drag this to the layout to add a new group." msgstr "" #: ../glom/utility_widgets/layouttoolbar.cc:37 msgid "Drag this to the layout to add a new notebook." msgstr "" #: ../glom/utility_widgets/layouttoolbar.cc:41 msgid "Drag this to the layout to add a new Related Record." msgstr "" #: ../glom/utility_widgets/layouttoolbar.cc:43 msgid "Drag this to the layout to add a new button." msgstr "" #: ../glom/utility_widgets/layoutwidgetmenu.cc:40 msgid "Field Layout Properties" msgstr "" #: ../glom/utility_widgets/layoutwidgetmenu.cc:41 #: ../ui/developer/window_data_layout.glade.h:8 msgid "Add Field" msgstr "" #: ../glom/utility_widgets/layoutwidgetmenu.cc:42 #: ../ui/developer/window_data_layout.glade.h:19 msgid "Add Related Records" msgstr "" #: ../glom/utility_widgets/layoutwidgetmenu.cc:43 #: ../ui/developer/window_data_layout.glade.h:17 msgid "Add Notebook" msgstr "" #: ../glom/utility_widgets/layoutwidgetmenu.cc:44 msgid "Add Group" msgstr "Aldoni grupon" #: ../glom/utility_widgets/layoutwidgetmenu.cc:45 #: ../ui/developer/window_data_layout.glade.h:13 msgid "Add Button" msgstr "" #: ../glom/utility_widgets/layoutwidgetmenu.cc:46 #: ../ui/developer/window_data_layout.glade.h:10 msgid "Add Text" msgstr "" #: ../glom/utility_widgets/layoutwidgetutils.cc:36 msgid "Properties" msgstr "" #: ../glom/utility_widgets/notebooklabelglom.cc:90 msgid "Delete whole notebook \"%1\"?" msgstr "" #: ../glom/utility_widgets/notebooklabelglom.cc:95 msgid "Delete whole notebook?" msgstr "" #: ../ui/operator/box_navigation_tables.glade.h:2 msgid "_Show hidden tables" msgstr "" #: ../ui/operator/dialog_choose_date.glade.h:1 msgid "Choose Date" msgstr "" #: ../ui/operator/dialog_choose_date.glade.h:2 msgid "" "Choose Date\n" "\n" "Please select a date to enter in this field." msgstr "" #: ../ui/operator/dialog_connection.glade.h:1 msgid "Connect to Server" msgstr "" #: ../ui/operator/dialog_connection.glade.h:2 msgid "Please enter the connection details for your database server." msgstr "" #: ../ui/operator/dialog_connection.glade.h:3 msgid "Host" msgstr "" #: ../ui/operator/dialog_connection.glade.h:4 msgid "Password" msgstr "Pasvorto" #: ../ui/operator/dialog_connection.glade.h:5 #: ../ui/developer/dialog_choose_user.glade.h:5 #: ../ui/developer/dialog_user.glade.h:1 msgid "User" msgstr "Uzanto" #: ../ui/operator/dialog_connection.glade.h:6 msgid "_Host:" msgstr "" #: ../ui/operator/dialog_connection.glade.h:7 #| msgctxt "Field (date). Parent table: scenes" #| msgid "Date" msgid "Database:" msgstr "Datumbazo:" #: ../ui/operator/dialog_connection.glade.h:8 #: ../ui/developer/dialog_initial_password.glade.h:3 msgid "_User:" msgstr "_Uzanto:" #: ../ui/operator/dialog_connection.glade.h:9 #: ../ui/developer/dialog_initial_password.glade.h:4 msgid "_Password:" msgstr "_Pasvorto:" #: ../ui/operator/dialog_connection.glade.h:10 #| msgctxt "Field (date). Parent table: scenes" #| msgid "Date" msgid "Database" msgstr "Datumbazo" #: ../ui/operator/dialog_data_invalid_format.glade.h:1 msgid "" "Invalid format\n" "\n" "The data in the field was not recognized. Please try to correct the data or " "revert to the previous value. Here is an example of correctly-formatted data " "for this field.\n" msgstr "" #: ../ui/operator/dialog_data_invalid_format.glade.h:5 msgid "example data format" msgstr "" #: ../ui/operator/dialog_existing_or_new.glade.h:1 msgid "Welcome to Glom" msgstr "Bonvenon al Glomo" #: ../ui/operator/dialog_existing_or_new.glade.h:2 #: ../ui/developer/dialog_choose_field.glade.h:2 #| msgctxt "Field (address_street). Parent table: accommodation" #| msgid "Street" msgid "_Select" msgstr "_Elekti" #: ../ui/operator/dialog_existing_or_new.glade.h:3 msgid "Open or create a Document" msgstr "" #: ../ui/operator/dialog_existing_or_new.glade.h:4 msgid "Open or create Document" msgstr "" #: ../ui/operator/dialog_existing_or_new.glade.h:5 msgid "Open Existing Document" msgstr "" #: ../ui/operator/dialog_existing_or_new.glade.h:6 msgid "Create New Document" msgstr "" #: ../ui/operator/dialog_find_id.glade.h:1 #: ../ui/operator/dialog_new_record.glade.h:1 msgid "Find Related Record" msgstr "" #: ../ui/operator/dialog_find_id.glade.h:2 #: ../ui/operator/dialog_new_record.glade.h:2 #: ../ui/developer/window_data_layout_export.glade.h:2 #: ../ui/developer/window_data_layout.glade.h:2 #: ../ui/developer/window_design.glade.h:2 #: ../ui/developer/window_report_layout.glade.h:2 msgid "Table:" msgstr "" #: ../ui/operator/dialog_find_id.glade.h:3 #: ../ui/operator/dialog_new_record.glade.h:3 msgid "table_name" msgstr "" #: ../ui/operator/dialog_image_load_progress.glade.h:1 msgid "Loading image" msgstr "" #: ../ui/operator/dialog_image_save_progress.glade.h:1 msgid "Saving Image" msgstr "" #: ../ui/operator/dialog_import_csv.glade.h:1 msgid "bla.blub - Import from CSV" msgstr "" #: ../ui/operator/dialog_import_csv.glade.h:3 #: ../ui/developer/box_formatting.glade.h:20 msgid "label" msgstr "etikedo" #: ../ui/operator/dialog_import_csv.glade.h:4 msgid "_First line as title" msgstr "" #: ../ui/operator/dialog_import_csv.glade.h:5 msgid "_Encoding:" msgstr "" #: ../ui/operator/dialog_import_csv.glade.h:6 msgid "Import Into _Table:" msgstr "" #: ../ui/operator/dialog_import_csv.glade.h:7 msgid "Encoding detected as: UTF-8" msgstr "" #. Import is a noun here. This is the title for a window showing options for an import operation. #: ../ui/operator/dialog_import_csv.glade.h:9 msgid "Import Options" msgstr "" #: ../ui/operator/dialog_import_csv.glade.h:10 msgid "_Number of sample rows:" msgstr "" #. Import is a noun here. This is the title for a list of fields to import. #: ../ui/operator/dialog_import_csv.glade.h:12 msgid "Import Fields" msgstr "" #. This is a status message for a progress dialog. It says that importing is currently happenning. #: ../ui/operator/dialog_import_csv_progress.glade.h:2 msgid "Importing Data" msgstr "" #: ../ui/operator/dialog_import_csv_progress.glade.h:3 msgid "Please wait while your data is imported." msgstr "" #: ../ui/developer/dialog_add_related_table.glade.h:1 msgid "Add Related Table" msgstr "" #: ../ui/developer/dialog_add_related_table.glade.h:2 msgid "" "This will add a new table and add a relationship that refers to the new " "table, as a convenient alternative to doing this in separate steps.\n" "\n" "If a suitable related table already exists then you should instead cancel " "and just add a relationship." msgstr "" #. Translators: FROM as in SQL's FROM #: ../ui/developer/dialog_add_related_table.glade.h:6 msgid "From field:" msgstr "" #: ../ui/developer/dialog_add_related_table.glade.h:7 msgid "Name of new related table:" msgstr "" #: ../ui/developer/dialog_add_related_table.glade.h:8 msgid "Name of new relationship:" msgstr "" #: ../ui/developer/dialog_change_language.glade.h:1 msgid "Test Translation" msgstr "" #: ../ui/developer/dialog_change_language.glade.h:2 msgid "" "Test Translation\n" "\n" "Choose a language to use temporarily to test the translations. These " "translations are normally used automatically when the application is started " "on a computer that uses the language.\n" "\n" "Note that the standard parts of the Glom user interface, such as menus and " "dialog windows, will only be translated when you start Glom on a computer " "that uses that language." msgstr "" #: ../ui/developer/dialog_change_language.glade.h:7 msgid "Locale:" msgstr "" #: ../ui/developer/dialog_choose_field.glade.h:1 msgid "Select Field" msgstr "" #: ../ui/developer/dialog_choose_field.glade.h:3 msgid "Show _Related Relationships" msgstr "" #: ../ui/developer/dialog_choose_field.glade.h:4 msgid "_Table:" msgstr "" #: ../ui/developer/dialog_choose_relationship.glade.h:1 msgid "Select Relationship" msgstr "" #: ../ui/developer/dialog_choose_relationship.glade.h:2 msgid "Table:" msgstr "" #: ../ui/developer/dialog_choose_relationship.glade.h:3 msgid "Select Relationship" msgstr "" #: ../ui/developer/dialog_choose_user.glade.h:1 msgid "Choose User" msgstr "" #: ../ui/developer/dialog_choose_user.glade.h:2 msgid "" "Add User To Group\n" "\n" "Which user should be added to this group?" msgstr "" #: ../ui/developer/dialog_database_preferences.glade.h:1 msgid "Database Preferences" msgstr "" #: ../ui/developer/dialog_database_preferences.glade.h:2 #| msgctxt "Field (name_last). Parent table: contacts" #| msgid "Last Name" msgid "System Name:" msgstr "" #: ../ui/developer/dialog_database_preferences.glade.h:3 #| msgctxt "Field (name). Parent table: accommodation" #| msgid "Name" msgid "Name:" msgstr "Nomo:" #: ../ui/developer/dialog_database_preferences.glade.h:4 #| msgctxt "Field (address_country). Parent table: accommodation" #| msgid "Country" msgid "Country:" msgstr "Lando:" #: ../ui/developer/dialog_database_preferences.glade.h:5 msgid "Zip/Postal Code:" msgstr "" #: ../ui/developer/dialog_database_preferences.glade.h:6 msgid "State/County:" msgstr "" #: ../ui/developer/dialog_database_preferences.glade.h:7 #| msgctxt "Field (address_town). Parent table: accommodation" #| msgid "Town" msgid "Town:" msgstr "Urbo:" #: ../ui/developer/dialog_database_preferences.glade.h:8 msgid "Street (Line 2):" msgstr "" #: ../ui/developer/dialog_database_preferences.glade.h:9 #| msgctxt "Field (address_street). Parent table: accommodation" #| msgid "Street" msgid "Street:" msgstr "Strato:" #: ../ui/developer/dialog_database_preferences.glade.h:10 #| msgctxt "" #| "Layout Group (address). Parent table: accommodation, Parent Group: details" #| msgid "Address" msgid "Address" msgstr "Addreso" #: ../ui/developer/dialog_database_preferences.glade.h:11 msgid "Organisation" msgstr "" #: ../ui/developer/dialog_database_preferences.glade.h:12 #| msgctxt "Field (logo). Parent table: companies" #| msgid "Logo" msgid "Logo" msgstr "Emblemo" #: ../ui/developer/dialog_database_preferences.glade.h:13 msgid "Auto-increment values" msgstr "" #: ../ui/developer/dialog_database_preferences.glade.h:14 msgid "" "When the database is opened the python function implemented here will run." msgstr "" #: ../ui/developer/dialog_database_preferences.glade.h:15 #: ../ui/developer/window_button_script.glade.h:4 #: ../ui/developer/window_field_calculation.glade.h:3 msgid "Test" msgstr "Testo" #: ../ui/developer/dialog_database_preferences.glade.h:16 msgid "Startup Script" msgstr "" #: ../ui/developer/dialog_error_create_database.glade.h:1 msgid "" "Database creation failed\n" "\n" "Glom could not create the new database. Maybe you do not have the necessary " "access rights. Please contact your system administrator." msgstr "" #: ../ui/developer/dialog_fieldslist.glade.h:1 #: ../ui/developer/dialog_sort_fields.glade.h:2 msgid "Table: " msgstr "" #: ../ui/developer/dialog_fieldslist.glade.h:3 #: ../ui/developer/window_data_layout.glade.h:24 msgid "Fields" msgstr "" #: ../ui/developer/dialog_field_summary.glade.h:2 #: ../ui/developer/dialog_group_by.glade.h:2 #: ../ui/developer/box_formatting.glade.h:22 msgid "Field:" msgstr "Kampo:" #: ../ui/developer/dialog_field_summary.glade.h:4 msgid "Summary Type:" msgstr "" #: ../ui/developer/dialog_field_summary.glade.h:5 msgid "Summary Field" msgstr "" #: ../ui/developer/dialog_flowtable.glade.h:1 msgid "Group Properties" msgstr "" #: ../ui/developer/dialog_flowtable.glade.h:2 #| msgctxt "Field (comments). Parent table: accommodation" #| msgid "Comments" msgid "Columns:" msgstr "Kolumnoj:" #: ../ui/developer/dialog_flowtable.glade.h:3 #: ../ui/developer/window_print_layout_edit.glade.h:4 #| msgctxt "Field (name_title). Parent table: contacts" #| msgid "Title" msgid "Title:" msgstr "Titolo:" #: ../ui/developer/dialog_group_by.glade.h:5 msgid "Sort Fields:" msgstr "" #: ../ui/developer/dialog_group_by.glade.h:6 msgid "Secondary Fields:" msgstr "" #: ../ui/developer/dialog_group_by.glade.h:7 msgid "Border Width (ems)" msgstr "" #: ../ui/developer/dialog_group_by.glade.h:8 msgid "Group By" msgstr "" #: ../ui/developer/dialog_initial_password.glade.h:1 msgid "Database User" msgstr "" #: ../ui/developer/dialog_initial_password.glade.h:2 msgid "" "Please enter the initial connection details for your database. You may add " "additional users later. Remember to keep this password secret because it " "allows access to your data from other computers on the network." msgstr "" #: ../ui/developer/dialog_initial_password.glade.h:5 msgid "_Confirm Password:" msgstr "_Konfirmi pasvorton:" #: ../ui/developer/dialog_initial_password.glade.h:6 #: ../ui/developer/dialog_new_group.glade.h:2 #: ../ui/developer/dialog_new_library_script.glade.h:2 msgid "C_reate" msgstr "K_rei" #: ../ui/developer/dialog_line.glade.h:1 #: ../ui/developer/window_textobject.glade.h:1 msgid "Text Object" msgstr "" #: ../ui/developer/dialog_line.glade.h:2 msgid "Line Width:" msgstr "" #: ../ui/developer/dialog_line.glade.h:3 msgid "Color:" msgstr "Koloro:" #: ../ui/developer/dialog_layout_field_properties.glade.h:1 msgid "Field Layout" msgstr "" #: ../ui/developer/dialog_layout_field_properties.glade.h:2 msgid "Field:" msgstr "" #: ../ui/developer/dialog_layout_field_properties.glade.h:4 msgid "Use default field title: " msgstr "" #: ../ui/developer/dialog_layout_field_properties.glade.h:5 msgid "Use custom title:" msgstr "" #: ../ui/developer/dialog_layout_field_properties.glade.h:6 msgid "Title" msgstr "" #: ../ui/developer/dialog_layout_field_properties.glade.h:7 msgid "Use default formatting" msgstr "" #: ../ui/developer/dialog_layout_field_properties.glade.h:8 msgid "Use custom formatting" msgstr "" #: ../ui/developer/dialog_layout_field_properties.glade.h:9 msgid "Formatting" msgstr "" #: ../ui/developer/dialog_new_group.glade.h:1 #: ../ui/developer/dialog_new_library_script.glade.h:1 msgid "Create Group" msgstr "" #: ../ui/developer/dialog_new_group.glade.h:3 msgid "" "Create Group\n" "\n" "What name should this group have?" msgstr "" #: ../ui/developer/dialog_new_group.glade.h:6 msgid "Group name:" msgstr "" #: ../ui/developer/dialog_new_library_script.glade.h:3 msgid "" "Add Module\n" "\n" "What name should this module have?" msgstr "" #: ../ui/developer/dialog_new_library_script.glade.h:6 msgid "Script name:" msgstr "" #: ../ui/developer/dialog_notebook.glade.h:2 msgid "Notebook Tabs" msgstr "" #: ../ui/developer/dialog_relationships_overview.glade.h:1 msgid "Relationships Overview" msgstr "" #: ../ui/developer/dialog_script_library.glade.h:1 msgid "Script Library" msgstr "" #: ../ui/developer/dialog_script_library.glade.h:2 msgid "" "These modules will be available to your button scripts and field " "calculations via the python import keyword." msgstr "" #: ../ui/developer/dialog_script_library.glade.h:3 msgid "Module name:" msgstr "" #. Translators: This is the verb. It is for checking that a Python script works. #: ../ui/developer/dialog_script_library.glade.h:5 msgid "_Check" msgstr "" #: ../ui/developer/dialog_sort_fields.glade.h:1 msgid "Group By - Sort Fields" msgstr "" #: ../ui/developer/dialog_sort_fields.glade.h:3 msgid "Sort Fields" msgstr "" #: ../ui/developer/dialog_translation_copy.glade.h:1 #: ../ui/developer/dialog_translation_identify_original.glade.h:1 msgid "Identify Original" msgstr "" #: ../ui/developer/dialog_translation_copy.glade.h:2 msgid "" "Copy Translation\n" "\n" "From what language would you like to copy the translations to use as the " "start of the current translation?" msgstr "" #: ../ui/developer/dialog_translation_copy.glade.h:5 #: ../ui/developer/dialog_translation_identify_original.glade.h:7 msgid "Language:" msgstr "Lingvo:" #: ../ui/developer/dialog_translation_identify_original.glade.h:2 msgid "" "Identify Original\n" "\n" "The language of the original text is currently identified as:" msgstr "" #: ../ui/developer/dialog_translation_identify_original.glade.h:5 msgid "English" msgstr "" #: ../ui/developer/dialog_translation_identify_original.glade.h:6 msgid "" "If the text is not actually in this language, please choose the correct " "language." msgstr "" #: ../ui/developer/dialog_user.glade.h:2 msgid "Group:" msgstr "Grupo:" #: ../ui/developer/dialog_user.glade.h:3 msgid "Password:" msgstr "Pasvorto:" #: ../ui/developer/dialog_user.glade.h:4 msgid "Confirm Password:" msgstr "Konfirmi pasvorton:" #: ../ui/developer/dialog_user.glade.h:5 msgid "User:" msgstr "Uzanto:" #: ../ui/developer/dialog_user.glade.h:6 msgid "User" msgstr "Uzanto" #: ../ui/developer/window_button_script.glade.h:1 msgid "Button Script" msgstr "" #: ../ui/developer/window_button_script.glade.h:2 #: ../ui/developer/window_data_layout.glade.h:6 #: ../ui/developer/window_imageobject.glade.h:2 #: ../ui/developer/window_textobject.glade.h:2 msgid "Title:" msgstr "Titolo:" #: ../ui/developer/window_button_script.glade.h:3 msgid "" "When the button is clicked it will run the python function which you " "implement here." msgstr "" #: ../ui/developer/window_data_layout_export.glade.h:1 msgid "Export Format" msgstr "" #: ../ui/developer/window_data_layout.glade.h:3 #: ../ui/developer/window_report_layout.glade.h:3 msgid "table name" msgstr "" #: ../ui/developer/window_data_layout.glade.h:4 msgid "Relationship:" msgstr "" #: ../ui/developer/window_data_layout.glade.h:5 msgid "Show child relationships" msgstr "" #: ../ui/developer/window_data_layout.glade.h:7 msgid "" "Add a layout item that shows the data from a field in the record, and allows " "the user to edit that value." msgstr "" #: ../ui/developer/window_data_layout.glade.h:9 msgid "" "Add text to a layout, such as an explanation or a warning. The text will be " "the same for every record viewed." msgstr "" #: ../ui/developer/window_data_layout.glade.h:11 msgid "" "Add an image to the layout, such as a logo. The image will be the same for " "every record viewed. To show an image field from a record, to show different " "images for each field, use the field layout item." msgstr "" #: ../ui/developer/window_data_layout.glade.h:12 msgid "" "Add a button. Edit the button to define the script that will be run when the " "button is clicked." msgstr "" #: ../ui/developer/window_data_layout.glade.h:14 msgid "" "Add a group which can contain other layout items. Use this to group items " "together, such as fields." msgstr "" #: ../ui/developer/window_data_layout.glade.h:15 msgid "Add _Group" msgstr "" #: ../ui/developer/window_data_layout.glade.h:16 msgid "" "Add a tabbed notebook. Each page of the notebook may contain several other " "layout items, but only one page will be visible at one time." msgstr "" #: ../ui/developer/window_data_layout.glade.h:18 msgid "" "Add a related records portal. This is a list of records in a related table. " "Remember to edit this layout item to specify the relationship to use, and " "the fields to show from the related table." msgstr "" #: ../ui/developer/window_data_layout.glade.h:20 msgid "" "Add a related records calendar portal. This is a calendar showing records " "from a related table. Remember to edit this layout item to specify the " "relationship to use, and the fields to show from the related table." msgstr "" #: ../ui/developer/window_data_layout.glade.h:21 msgid "Add Related Calendar" msgstr "" #: ../ui/developer/window_data_layout.glade.h:22 msgid "" "Remove the item from the layout. If you remove a field layout item, it will " "not remove the field from the table itself. It just will not be seen on the " "layout." msgstr "" #: ../ui/developer/window_data_layout.glade.h:25 msgid "" "Clicking the row button takes the user to the table specified by this " "relationship:" msgstr "" #: ../ui/developer/window_data_layout.glade.h:26 msgid "Automatic:" msgstr "" #: ../ui/developer/window_data_layout.glade.h:27 msgid "None" msgstr "" #: ../ui/developer/window_data_layout.glade.h:28 msgid "Navigation" msgstr "" #: ../ui/developer/window_data_layout.glade.h:29 msgid "Date Field:" msgstr "" #: ../ui/developer/window_data_layout.glade.h:30 msgid "Dates" msgstr "" #: ../ui/developer/window_data_layout.glade.h:31 msgid "Minimum number of rows:" msgstr "" #: ../ui/developer/window_data_layout.glade.h:32 msgid "Show at least this many rows." msgstr "" #: ../ui/developer/window_data_layout.glade.h:33 msgid "Maximum number of rows:" msgstr "" #: ../ui/developer/window_data_layout.glade.h:34 msgid "Show no more than this many rows." msgstr "" #: ../ui/developer/window_data_layout.glade.h:35 msgid "Row Line Width:" msgstr "" #: ../ui/developer/window_data_layout.glade.h:36 msgid "Column Line Width:" msgstr "" #: ../ui/developer/window_data_layout.glade.h:37 msgid "Line Color:\n" msgstr "" #: ../ui/developer/window_data_layout.glade.h:39 msgid "Lines" msgstr "" #: ../ui/developer/window_design.glade.h:1 msgid "Field Definitions" msgstr "" #: ../ui/developer/window_field_calculation.glade.h:1 msgid "Field Calculation" msgstr "" #: ../ui/developer/window_field_calculation.glade.h:2 msgid "" "The field value will be the return value of the python function, which you " "implement here." msgstr "" #: ../ui/developer/window_field_calculation.glade.h:4 msgid "Triggered by:" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:1 msgid "Field Definition" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:2 #| msgctxt "Field (name). Parent table: accommodation" #| msgid "Name" msgid "_Name:" msgstr "_Nomo:" #: ../ui/developer/window_field_definition_edit.glade.h:3 msgid "Typ_e:" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:5 msgid "_Primary Key" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:6 msgid "_Unique" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:7 msgid "_Auto-increment" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:9 msgid "_Lookup value when a field changes." msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:10 msgid "_Relationship:" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:11 msgid "_Field:" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:12 msgid "_User Entry" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:14 msgid "_Calculate Value" msgstr "" #: ../ui/developer/window_field_definition_edit.glade.h:15 msgid "Value" msgstr "Valoro" #: ../ui/developer/window_field_definition_edit.glade.h:16 msgid "Default Formatting" msgstr "" #: ../ui/developer/box_formatting.glade.h:1 msgid "Use 1000s separator" msgstr "" #: ../ui/developer/box_formatting.glade.h:2 msgid "" "If this is not selected then a thousands separator will not be used, even if " "your locale would normally use one. If it is selected then a thousands " "separator will be used only if your locale normally uses one." msgstr "" #: ../ui/developer/box_formatting.glade.h:3 msgid "Decimal Places" msgstr "" #: ../ui/developer/box_formatting.glade.h:4 msgid "Currency Symbol" msgstr "" #: ../ui/developer/box_formatting.glade.h:5 msgid "Alternative Color for Negative Values" msgstr "" #: ../ui/developer/box_formatting.glade.h:6 msgid "" "Click this check box to use a different foreground color to display negative " "values." msgstr "" #: ../ui/developer/box_formatting.glade.h:7 msgid "Numeric Formatting" msgstr "" #: ../ui/developer/box_formatting.glade.h:8 msgid "Horizontal Alignment:" msgstr "" #: ../ui/developer/box_formatting.glade.h:9 msgid "Multi-line" msgstr "" #: ../ui/developer/box_formatting.glade.h:10 msgid "" "If this is selected then the field value will be shown in a multi-line box " "with a scrollbar." msgstr "" #: ../ui/developer/box_formatting.glade.h:11 msgid "Height (lines)" msgstr "" #: ../ui/developer/box_formatting.glade.h:12 msgid "Font:" msgstr "Tiparo:" #: ../ui/developer/box_formatting.glade.h:13 msgid "Click this check box to use a non-standard font." msgstr "" #: ../ui/developer/box_formatting.glade.h:14 msgid "Foreground Color:" msgstr "" #: ../ui/developer/box_formatting.glade.h:15 msgid "Click this check box to use a non-standard foreground color." msgstr "" #: ../ui/developer/box_formatting.glade.h:16 msgid "Background Color:" msgstr "" #: ../ui/developer/box_formatting.glade.h:17 msgid "Click this check box to use a non-standard background color." msgstr "" #: ../ui/developer/box_formatting.glade.h:18 msgid "Text Formatting" msgstr "" #: ../ui/developer/box_formatting.glade.h:19 msgid "No Choices" msgstr "" #: ../ui/developer/box_formatting.glade.h:21 msgid "Relationship:" msgstr "" #: ../ui/developer/box_formatting.glade.h:23 msgid "Also show:" msgstr "" #: ../ui/developer/box_formatting.glade.h:24 msgid "Show all records" msgstr "" #: ../ui/developer/box_formatting.glade.h:25 msgid "" "If this option is selected then the choices will list values from all " "records in the related table. If this option is not selected then the " "choices will list values only from related records." msgstr "" #: ../ui/developer/box_formatting.glade.h:26 msgid "Sort Order:" msgstr "" #: ../ui/developer/box_formatting.glade.h:27 msgid "Choices From Related Records" msgstr "" #: ../ui/developer/box_formatting.glade.h:28 msgid "Custom Choice List" msgstr "" #: ../ui/developer/box_formatting.glade.h:29 msgid "Restrict data to these choices" msgstr "" #: ../ui/developer/box_formatting.glade.h:30 msgid "Display as radio buttons" msgstr "" #: ../ui/developer/box_formatting.glade.h:31 msgid "Choices" msgstr "" #: ../ui/developer/window_groups.glade.h:1 msgid "Groups" msgstr "" #: ../ui/developer/window_groups.glade.h:2 #: ../ui/developer/window_users.glade.h:1 msgid "Users" msgstr "" #: ../ui/developer/window_groups.glade.h:3 msgid "Groups" msgstr "" #: ../ui/developer/window_groups.glade.h:4 msgid "Tables" msgstr "" #: ../ui/developer/window_imageobject.glade.h:1 msgid "Image Object" msgstr "" #: ../ui/developer/window_imageobject.glade.h:3 msgid "Image:" msgstr "" #: ../ui/developer/window_print_layout_edit.glade.h:1 msgid "Print Layout Editor" msgstr "" #: ../ui/developer/window_print_layout_edit.glade.h:2 msgid "Table Name" msgstr "" #: ../ui/developer/window_print_layout_edit.glade.h:3 #| msgctxt "Field (name_last). Parent table: contacts" #| msgid "Last Name" msgid "Layout name:" msgstr "" #: ../ui/developer/window_print_layout_edit.glade.h:5 msgid "X:" msgstr "X:" #: ../ui/developer/window_print_layout_edit.glade.h:6 msgid "Y:" msgstr "Y:" #: ../ui/developer/window_print_layout_edit.glade.h:7 msgid "Width:" msgstr "LarÄo:" #: ../ui/developer/window_print_layout_edit.glade.h:8 #| msgctxt "Field Choice. Parent table: scenes, Parent Field: day_or_night" #| msgid "Night" msgid "Height:" msgstr "Alto:" #: ../ui/developer/window_report_layout.glade.h:1 msgid "Report Layout" msgstr "" #: ../ui/developer/window_report_layout.glade.h:4 msgid "_Show table title" msgstr "" #: ../ui/developer/window_report_layout.glade.h:5 msgid "" "When this is checked the table's title will be shown at the top of the " "report in addition to the report title." msgstr "" #: ../ui/developer/window_report_layout.glade.h:6 msgid "_Report name:" msgstr "" #: ../ui/developer/window_report_layout.glade.h:8 msgid "Available Parts" msgstr "" #. Translators: The Main part of the report (not the footer or header) #: ../ui/developer/window_report_layout.glade.h:11 #| msgctxt "" #| "Field Choice. Parent table: contacts, Parent Field: address_country" #| msgid "Spain" msgid "Main" msgstr "" #: ../ui/developer/window_report_layout.glade.h:13 msgid "Parts" msgstr "" #: ../ui/developer/window_text_format.glade.h:1 msgid "Text Format" msgstr "" #: ../ui/developer/window_textobject.glade.h:3 msgid "Text:" msgstr "" #: ../ui/developer/window_translations.glade.h:1 msgid "Translations" msgstr "Tradukoj" #: ../ui/developer/window_translations.glade.h:2 msgid "Source Language:" msgstr "" #: ../ui/developer/window_translations.glade.h:3 msgid "English" msgstr "Angla" #: ../ui/developer/window_translations.glade.h:4 msgid "Identify Source" msgstr "" #: ../ui/developer/window_translations.glade.h:5 msgid "Target Language:" msgstr "" #: ../ui/developer/window_translations.glade.h:8 msgid "Copy From Existing Translation" msgstr "" #: ../ui/developer/window_translations.glade.h:9 msgid "" "Start a translation for this target locale by copying the strings from " "another target locale." msgstr "" #: ../ui/developer/window_translations.glade.h:10 msgid "Translations" msgstr "Tradukoj" #: ../ui/developer/window_users.glade.h:2 msgid "Group:" msgstr "Grupo:" #: ../ui/developer/window_users.glade.h:3 msgid "Users" msgstr "Uzantoj" glom-1.22.4/po/sl.po0000644000175000017500000041751312234776363015410 0ustar00murraycmurrayc00000000000000# Slovenian translation of glom. # Copyright (C) 2009 glom's COPYRIGHT HOLDER # This file is distributed under the same license as the glom package. # # Andrej ŽnidarÅ¡iÄ , 2009 - 2012. # msgid "" msgstr "" "Project-Id-Version: glom master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glom&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2012-04-19 14:32+0000\n" "PO-Revision-Date: 2012-04-21 12:26+0100\n" "Last-Translator: Matej UrbanÄiÄ \n" "Language-Team: SlovenÅ¡Äina \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-Country: SLOVENIA\n" "X-Poedit-Language: Slovenian\n" "X-Poedit-SourceCharset: utf-8\n" #: ../glom/application.cc:138 #: ../glom/glom_create_from_example.cc:240 #: ../glom/glom_export_po.cc:112 #: ../glom/glom_export_po_all.cc:100 #: ../glom/glom_import_po_all.cc:101 #: ../glom/glom_test_connection.cc:131 msgid "Error while parsing command-line options: " msgstr "Napaka med razÄlenjevanem možnosti ukazne vrstice:" #. TODO: How can we just print them out? #: ../glom/application.cc:139 #: ../glom/glom_create_from_example.cc:241 #: ../glom/glom_export_po.cc:113 #: ../glom/glom_export_po_all.cc:101 #: ../glom/glom_import_po_all.cc:102 #: ../glom/glom_test_connection.cc:91 msgid "Use --help to see a list of available command-line options." msgstr "Uporabite --help za ogled seznama razpoložljivih možnosti ukazne vrstice." #: ../glom/application.cc:180 #: ../glom/glom_create_from_example.cc:275 #: ../glom/glom_export_po.cc:162 msgid "Glom: The file does not exist." msgstr "Glom: Datoteka ne obstaja." #: ../glom/application.cc:190 #: ../glom/glom_create_from_example.cc:285 #: ../glom/glom_export_po.cc:172 msgid "Glom: The file path is a directory instead of a file." msgstr "Glom: Pot datoteke je mapa namesto datoteke." #: ../glom/appwindow.cc:148 msgid "Glom: Generating Encryption Certificates" msgstr "Glom: Ustvarjanje potrdil Å¡ifriranja" #: ../glom/appwindow.cc:149 msgid "Please wait while Glom prepares your system for publishing over the network." msgstr "PoÄakajte, da program Glom pripravi vaÅ¡ sistem na objavljanje preko omrežja." #: ../glom/appwindow.cc:266 #: ../glom/bakery/appwindow_withdoc_gtk.cc:228 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:198 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:58 msgid "_File" msgstr "_Datoteka" #: ../glom/appwindow.cc:267 #: ../glom/bakery/appwindow_withdoc_gtk.cc:229 msgid "_Recent Files" msgstr "N_edavne datoteke" #: ../glom/appwindow.cc:275 msgid "_Save as Example" msgstr "_Shrani kot primer" #: ../glom/appwindow.cc:282 #: ../glom/filechooser_export.cc:41 msgid "_Export" msgstr "_Izvozi" #: ../glom/appwindow.cc:286 #: ../ui/operator/dialog_import_csv.glade.h:2 msgid "I_mport" msgstr "_Uvozi" #: ../glom/appwindow.cc:291 msgid "S_hared on Network" msgstr "So_uporabjeno na omrežju" #: ../glom/appwindow.cc:305 msgid "_Standard" msgstr "O_biÄajno" #: ../glom/appwindow.cc:309 msgid "_Edit Print Layouts" msgstr "_Uredi razporeditve tiskanja" #. "Tables" menu: #: ../glom/appwindow.cc:367 msgid "_Tables" msgstr "_Razpredelnice" #: ../glom/appwindow.cc:377 msgid "_Edit Tables" msgstr "_Uredi razpredelnice" #. "Reports" menu: #: ../glom/appwindow.cc:391 msgid "_Reports" msgstr "_PoroÄila" #: ../glom/appwindow.cc:394 msgid "_Edit Reports" msgstr "_Uredi poroÄila" #. We remember this action, so that it can be explicitly activated later. #: ../glom/appwindow.cc:402 #: ../glom/frame_glom.cc:124 msgid "_Find" msgstr "_Iskanje" #: ../glom/appwindow.cc:408 msgctxt "Developer menu title" msgid "_Developer" msgstr "Ra_zvijalec" #: ../glom/appwindow.cc:414 msgid "_Developer Mode" msgstr "_Razvijalski naÄin" #: ../glom/appwindow.cc:418 msgid "_Operator Mode" msgstr "_Opravilni naÄin" #: ../glom/appwindow.cc:423 msgid "_Database Preferences" msgstr "Možnosti podatkovne _zbirke" #: ../glom/appwindow.cc:428 msgid "_Fields" msgstr "Po_lja" #: ../glom/appwindow.cc:433 msgid "Relationships _Overview" msgstr "Pregled _razmerij" #: ../glom/appwindow.cc:438 msgid "_Relationships for this Table" msgstr "_Razmerja za to razpredelnico" #: ../glom/appwindow.cc:443 msgid "_Users" msgstr "_Uporabniki" #: ../glom/appwindow.cc:447 msgid "_Print Layouts" msgstr "Razporeditve _tiskanja" #: ../glom/appwindow.cc:452 msgid "R_eports" msgstr "P_oroÄila" #: ../glom/appwindow.cc:457 msgid "Script _Library" msgstr "_Knjižnica skriptov" #: ../glom/appwindow.cc:462 msgid "_Layout" msgstr "R_azporeditev" #: ../glom/appwindow.cc:467 msgid "Test Tra_nslation" msgstr "Preizkusi pre_vod" #: ../glom/appwindow.cc:471 msgid "_Translations" msgstr "_Prevodi" #. "Active Platform" menu: #: ../glom/appwindow.cc:477 msgid "_Active Platform" msgstr "_Dejaven sistem" #: ../glom/appwindow.cc:483 msgid "_Normal" msgstr "_ObiÄajno" #: ../glom/appwindow.cc:483 msgid "The layout to use for normal desktop environments." msgstr "Razporeditev za obiÄajna namizna okolja." #: ../glom/appwindow.cc:488 msgid "_Maemo" msgstr "_Maemo" #: ../glom/appwindow.cc:488 msgid "The layout to use for Maemo devices." msgstr "Razporeditev za naprave Maemo." #: ../glom/appwindow.cc:493 msgid "_Export Backup" msgstr "_Izvozi varnostne kopije" #: ../glom/appwindow.cc:497 msgid "_Restore Backup" msgstr "_Obnovi varnostne kopije" #. TODO: Think of a better name for this menu item, #. though it mostly only exists because it is not quite ready to be on by default: #. Note to translators: Drag and Drop is part of the name, not a verb or action: #: ../glom/appwindow.cc:504 msgid "_Drag and Drop Layout" msgstr "_Razporeditev potegni in spusti" #: ../glom/appwindow.cc:512 msgctxt "Help menu title" msgid "_Help" msgstr "Pomo_Ä" #: ../glom/appwindow.cc:516 msgid "_Help" msgstr "Pomo_Ä" #: ../glom/appwindow.cc:519 msgid "_About" msgstr "_O Programu" #: ../glom/appwindow.cc:519 msgid "About the application" msgstr "O programu" #: ../glom/appwindow.cc:522 msgid "_Contents" msgstr "_Vsebina" #: ../glom/appwindow.cc:522 msgid "Help with the application" msgstr "PomoÄ za program" #: ../glom/appwindow.cc:627 msgid "A Database GUI" msgstr "GrafiÄni uporabniÅ¡ki vmesnik podatkovnih zbirk" #: ../glom/appwindow.cc:629 msgid "© 2000-2011 Murray Cumming, Openismus GmbH" msgstr "© 2000-2011 Murray Cumming, Openismus GmbH" #. TODO: Put this in the generic bakery code. #: ../glom/appwindow.cc:713 #: ../glom/appwindow.cc:722 msgid "Open Failed" msgstr "Odpiranje je spodletelo" #: ../glom/appwindow.cc:714 msgid "The document could not be found." msgstr "Dokumenta ni mogoÄe najti." #: ../glom/appwindow.cc:723 msgid "The document could not be opened because it was created or modified by a newer version of Glom." msgstr "Dokumenta ni mogoÄe odpreti, ker je bil ustvarjen ali spremenjen z novejÅ¡o razliÄico Gloma." #. std::cout << " SOUP_STATUS_FORBIDDEN or SOUP_STATUS_UNAUTHORIZED" << std::endl; #. Warn the user, and let him try again: #: ../glom/appwindow.cc:773 #: ../glom/frame_glom.cc:2072 #: ../glom/frame_glom.cc:2143 msgid "Connection Failed" msgstr "Povezava je spodletela" #: ../glom/appwindow.cc:773 #: ../glom/frame_glom.cc:2072 #: ../glom/frame_glom.cc:2143 msgid "Glom could not connect to the database server. Maybe you entered an incorrect user name or password, or maybe the postgres database server is not running." msgstr "Ni se mogoÄe povezati s strežnikom podatkovnih zbirk. Morda ste vnesli napaÄno uporabniÅ¡ko ime ali geslo, ali pa strežnik podatkovne zbirke ni zagnan. " #: ../glom/appwindow.cc:942 msgid "The file cannot be opened because this version of Glom does not support self-hosting of databases." msgstr "Datoteke ni mogoÄe odpreti, ker ta razliÄica programa ne podpira samo-gostujoÄih podatkovnih zbirk." #: ../glom/appwindow.cc:947 #: ../glom/appwindow.cc:956 msgid "The file cannot be opened because this version of Glom does not support PostgreSQL databases." msgstr "Datoteke ni mogoÄe odpreti, ker ta razliÄica programa ne podpira podatkovnih zbirk PostgreSQL." #: ../glom/appwindow.cc:964 msgid "The file cannot be opened because this version of Glom does not support SQLite databases." msgstr "Datoteke ni mogoÄe odpreti, ker ta razliÄica programa ne podpira podatkovnih zbirk SQLite." #. Warn the user. #: ../glom/appwindow.cc:982 msgid "File Uses Unsupported Database Backend" msgstr "Datoteka uporablja nepodprto zaledje podatkovne zbirke" #: ../glom/appwindow.cc:1045 msgid "Creating From Example File" msgstr "Ustvarjanje iz datoteke primera" #: ../glom/appwindow.cc:1046 msgid "To use this example file you must save an editable copy of the file. A new database will also be created on the server." msgstr "Za uporabo te poskusne datoteke je treba shraniti uredljivo kopijo datoteke. Nova podatkovna zbirka bo ustvarjena tudi na strežniku." #: ../glom/appwindow.cc:1050 msgid "Creating From Backup File" msgstr "Ustvarjanje iz datoteke varnostne kopije" #: ../glom/appwindow.cc:1051 msgid "To use this backup file you must save an editable copy of the file. A new database will also be created on the server." msgstr "Za uporabo te datoteke varnostne kopije je treba shraniti uredljivo kopijo datoteke. Nova podatkovna zbirka bo ustvarjena tudi na strežniku." #: ../glom/appwindow.cc:1112 msgid "Opening Read-Only File." msgstr "Odpiranje datoteke le za branje." #: ../glom/appwindow.cc:1113 msgid "This file is read only, so you will not be able to enter Developer mode to make design changes." msgstr "Ta datoteka je le za branje, zato ni mogoÄe vstopiti v razvijalski naÄin za spremembe oblikovanja." #: ../glom/appwindow.cc:1116 msgid "Continue without Developer Mode" msgstr "Nadaljuj brez razvijalskega naÄina" #. The connection to the server is OK, but the database is not there yet. #: ../glom/appwindow.cc:1174 msgid "Database Not Found On Server" msgstr "Podatkovne zbirke ni mogoÄe najti na strežniku" #: ../glom/appwindow.cc:1174 msgid "The database could not be found on the server. Please consult your system administrator." msgstr "Podatkovne zbirke na strežniku ni mogoÄe najti. Posvetujte se s skrbnikom sistema." #. std::cerr might show some hints, but we don't want to confront the user with them: #. TODO: Actually complain about specific stuff such as missing data, because the user might really play with the file system. #: ../glom/appwindow.cc:1184 msgid "Problem Loading Document" msgstr "Težava med nalaganjem dokumenta" #: ../glom/appwindow.cc:1184 msgid "Glom could not load the document." msgstr "Glom ni mogel naložiti dokumenta." #: ../glom/appwindow.cc:1619 msgid "Creating Glom database from example file." msgstr "Ustvarjanje podatkovne zbirke Glom iz poskusne datoteke." #: ../glom/appwindow.cc:1798 msgid "Creating Glom database from backup file." msgstr "Ustvarjanje podatkovne zbirke Glom iz datoteke varnostne kopije." #. The save failed. Tell the user and don't do anything else: #: ../glom/appwindow.cc:2274 #: ../glom/bakery/appwindow_withdoc.cc:237 #: ../glom/bakery/appwindow_withdoc.cc:288 msgid "Save failed." msgstr "Napaka med shranjevanjem." #: ../glom/appwindow.cc:2274 msgid "There was an error while saving the example file." msgstr "PriÅ¡lo je do napake med shranjevanjem datoteke primera." #: ../glom/appwindow.cc:2315 #: ../glom/appwindow.cc:2320 #: ../glom/bakery/appwindow_withdoc_gtk.cc:425 msgid "Save Document" msgstr "Shrani dokument" #. Warn the user: #: ../glom/appwindow.cc:2407 #: ../glom/bakery/appwindow_withdoc_gtk.cc:473 msgid "Read-only File." msgstr "Datoteka le za branje." #: ../glom/appwindow.cc:2407 #: ../glom/bakery/appwindow_withdoc_gtk.cc:473 msgid "You may not overwrite the existing file, because you do not have sufficient access rights." msgstr "ObstojeÄe datoteke ni mogoÄe prepisati, saj nimate ustreznih dovoljenj dostopa." #. Warn the user: #: ../glom/appwindow.cc:2421 #: ../glom/bakery/appwindow_withdoc_gtk.cc:487 msgid "Read-only Directory." msgstr "Mapa le za branje." #: ../glom/appwindow.cc:2421 #: ../glom/bakery/appwindow_withdoc_gtk.cc:487 msgid "You may not create a file in this directory, because you do not have sufficient access rights." msgstr "V tej mapi datoteke ni mogoÄe ustvariti, saj nimate ustreznih dovoljenj dostopa." #: ../glom/appwindow.cc:2438 msgid "Database Title missing" msgstr "Naslov podatkovne zbirke manjka" #: ../glom/appwindow.cc:2438 msgid "You must specify a title for the new database." msgstr "Navesti morate naslov za drugo podatkovno zbirko." #: ../glom/appwindow.cc:2467 #: ../glom/frame_glom.cc:1832 msgid "Directory Already Exists" msgstr "Mapa že obstaja" #: ../glom/appwindow.cc:2467 #: ../glom/frame_glom.cc:1833 msgid "There is an existing directory with the same name as the directory that should be created for the new database files. You should specify a different filename to use a new directory instead." msgstr "Novo ustvarjena mapa za nove datoteke podatkovne zbirke ima enako ime kot obstojeÄa mapa. Navedite drugo ime mape za nove datoteke podatkovne zbirke. " #. This actually creates the directory: #: ../glom/appwindow.cc:2606 msgid "Save Backup" msgstr "Shrani varnostno kopijo" #: ../glom/appwindow.cc:2622 msgid "Exporting backup" msgstr "Izvažanje varnostne kopije" #: ../glom/appwindow.cc:2628 msgid "Export Backup failed." msgstr "Izvoz varnostne kopije je spodletel." #: ../glom/appwindow.cc:2628 msgid "There was an error while exporting the backup." msgstr "PriÅ¡lo je do napake med izvažanjem varnostne kopije." #: ../glom/appwindow.cc:2634 msgid "Choose a backup file" msgstr "Izbor datoteke varnostne kopije" #: ../glom/appwindow.cc:2639 msgid ".tar.gz Backup files" msgstr "Datoteke varnostnih kopij .tar.gz" #: ../glom/appwindow.cc:2645 msgid "Restore" msgstr "Obnovi" #: ../glom/appwindow.cc:2670 msgid "Restoring backup" msgstr "Obnavljanje varnostne kopije" #: ../glom/appwindow.cc:2677 msgid "Restore Backup failed." msgstr "Obnova varnostne kopije je spodletela." #: ../glom/appwindow.cc:2677 msgid "There was an error while restoring the backup." msgstr "PriÅ¡lo je do napake med obnavljanjem varnostne kopije." #: ../glom/appwindow.cc:2774 #: ../glom/bakery/appwindow_withdoc_gtk.cc:346 msgid " (read-only)" msgstr " (le za branje)" #: ../glom/appwindow.cc:2822 #: ../ui/operator/window_main.glade.h:2 msgid "Processing" msgstr "Obdelovanje" #: ../glom/base_db.cc:122 #: ../glom/base_db.cc:132 msgid "Internal error" msgstr "Notranja napaka" #: ../glom/base_db.cc:1455 msgid "Value Is Not Unique" msgstr "Vrednost ni edinstvena" #: ../glom/base_db.cc:1455 msgid "The field's value must be unique, but a record with this value already exists." msgstr "Vrednost polja mora biti edinstvena, toda zapis s to vrednostjo že obstaja." #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:257 msgid "Data may not be entered into this related field, because the related record does not yet exist, and the relationship does not allow automatic creation of new related records." msgstr "Podatkov ni mogoÄe vnesti v to povezano polje, ker povezani zapis Å¡e ne obstaja in razmerje ne dovoli samodejnega ustvarjanja novih povezanih zapisov." #: ../glom/base_db_table_data.cc:258 msgid "Related Record Does Not Exist" msgstr "Povezan zapis ne obstaja" #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:277 msgid "Data may not be entered into this related field, because the related record does not yet exist, and the key in the related record is auto-generated and therefore can not be created with the key value in this record." msgstr "Podatkov ni mogoÄe vnesti v povezano polje, ker povezan zapis Å¡e ne obstaja. KljuÄ in povezan zapis sta ustvarjena samodejno in ju zato v tem zapisu ni mogoÄe ustvariti z vrednostjo kljuÄa. " #: ../glom/base_db_table_data.cc:279 msgid "Related Record Cannot Be Created" msgstr "Povezanega zapisa ni mogoÄe ustvariti" #. Ask the user for confirmation: #: ../glom/base_db_table_data.cc:390 msgid "Are you sure that you would like to delete this record? The data in this record will then be permanently lost." msgstr "Ali ste prepriÄani, da želite izbrisati ta zapis? Podatki v tem zapisu bodo po izbrisu trajno izgubljeni." #: ../glom/base_db_table_data.cc:391 msgid "Delete record" msgstr "IzbriÅ¡i zapis" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #. Append the View columns: #: ../glom/box_reports.cc:96 #: ../glom/mode_design/box_db_table_relationships.cc:45 #: ../glom/mode_design/fields/box_db_table_definition.cc:54 #: ../glom/mode_design/layout/dialog_choose_field.cc:57 #: ../glom/mode_design/layout/dialog_choose_relationship.cc:55 #: ../glom/mode_design/layout/dialog_layout_details.cc:103 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.cc:53 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:49 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.cc:52 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:96 #: ../glom/mode_design/users/dialog_groups_list.cc:66 msgid "Name" msgstr "Ime" #. Don't allow a relationship to be added twice. #: ../glom/box_reports.cc:98 msgid "This report already exists. Please choose a different report name" msgstr "To poroÄilo že obstaja. Izberite drugo ime poroÄila" #. Title column: #: ../glom/box_reports.cc:100 #: ../glom/mode_design/box_db_table_relationships.cc:49 #: ../glom/mode_design/fields/box_db_table_definition.cc:58 #: ../glom/mode_design/layout/dialog_choose_field.cc:58 #: ../glom/mode_design/layout/dialog_layout_details.cc:116 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:50 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:100 #: ../glom/navigation/box_tables.cc:137 #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:109 msgid "Title" msgstr "Naslov" #: ../glom/box_reports.cc:228 msgid "Are you sure that you want to rename this report?" msgstr "Ali ste prepriÄani, da želite preimenovati to poroÄilo?" #. TODO: Show old and new names? #: ../glom/box_reports.cc:229 msgid "Rename Report" msgstr "Preimenuj poroÄilo" #. namespace Glom #: ../glom.desktop.in.in.h:1 #: ../ui/operator/window_main.glade.h:1 msgid "Glom" msgstr "Glom" #: ../glom.desktop.in.in.h:2 msgid "A user-friendly database environment." msgstr "Uporabniku prijazno okolje podatkovnih zbirk." #: ../glom/dialog_connection.cc:205 msgid "Not yet created." msgstr "Å e ni ustvarjeno." #: ../glom/dialog_existing_or_new.cc:50 msgid "No recently used documents available." msgstr "Ni nedavno uporabljenih dokumentov." #: ../glom/dialog_existing_or_new.cc:51 msgid "No sessions found on the local network." msgstr "Na krajevnem omrežju ni najdenih sej." #: ../glom/dialog_existing_or_new.cc:54 msgid "No templates available." msgstr "Ni predlog na voljo." #: ../glom/dialog_existing_or_new.cc:112 msgid "Open a Document" msgstr "Odpriranje dokumenta" #: ../glom/dialog_existing_or_new.cc:131 msgid "Select File" msgstr "Izbor datoteke" #: ../glom/dialog_existing_or_new.cc:135 msgid "Local Network" msgstr "Krajevno omrežje" #: ../glom/dialog_existing_or_new.cc:139 msgid "Recently Opened" msgstr "Nedavno odprti" #: ../glom/dialog_existing_or_new.cc:213 msgid "New Empty Document" msgstr "Nov prazen dokument" #: ../glom/dialog_existing_or_new.cc:216 msgid "New From Template" msgstr "Nov iz predloge" #. Translator hint: This is on (via Network Interface such as eth0). #: ../glom/dialog_existing_or_new.cc:742 #, c-format msgid "%s on %s (via %s)" msgstr "%s na %s (preko %s)" #: ../glom/filechooser_export.cc:32 msgid "Export to File" msgstr "Izvozi v datoteko" #: ../glom/filechooser_export.cc:35 msgid "Define Data _Format" msgstr "DoloÄi _obliko podatkov" #: ../glom/frame_glom.cc:81 msgid "Find All" msgstr "Najdi vse" #: ../glom/frame_glom.cc:102 #: ../glom/frame_glom.cc:106 msgid "No Table Selected" msgstr "Ni izbrane razpredelnice" #: ../glom/frame_glom.cc:113 #: ../ui/operator/dialog_find_id.glade.h:4 msgid "Quick _search:" msgstr "_Hitro iskanje:" #: ../glom/frame_glom.cc:138 msgid "Records:" msgstr "Zapisi:" #: ../glom/frame_glom.cc:141 msgid "Found:" msgstr "Najdeno:" #. TODO: Obviously this document should have been deleted when the database-creation was cancelled. #. Note that "canceled" is the correct US spelling. #: ../glom/frame_glom.cc:326 msgid "No table" msgstr "Ni razpredelnice" #: ../glom/frame_glom.cc:326 msgid "This database has no tables yet." msgstr "Ta podatkovna zbirka Å¡e nima razpredelnic." #. TODO: Obviously this could be possible but it would require a network protocol and some work: #: ../glom/frame_glom.cc:498 msgid "Developer mode not available." msgstr "Razvijalski naÄin ni na voljo." #: ../glom/frame_glom.cc:499 msgid "Developer mode is not available because the file was opened over the network from a running Glom. Only the original file may be edited." msgstr "Razvijalski naÄin in na voljo, ker je bila datoteka odprta preko omrežja iz delujoÄega Gloma. Urejati je mogoÄe le izvirno datoteko." #: ../glom/frame_glom.cc:505 msgid "Developer mode not available" msgstr "Razvijalski naÄin ni na voljo" #: ../glom/frame_glom.cc:506 msgid "Developer mode is not available. Check that you have sufficient database access rights and that the glom file is not read-only." msgstr "Razvijalski naÄin ni na voljo. Preverite, Äe imate zadostne pravice podatkovne zbirke in da datoteka glom ni le za branje." #: ../glom/frame_glom.cc:513 msgid "Saving in new document format" msgstr "Shranjevanje v novi vrsti dokumenta" #: ../glom/frame_glom.cc:514 msgid "The document was created by an earlier version of the application. Making changes to the document will mean that the document cannot be opened by some earlier versions of the application." msgstr "Ta dokument je bil ustvarjen s prejÅ¡njo razliÄico programa. Spremembe dokumenta bodo onemogoÄile odpiranje dokumenta v nekaterih starejÅ¡ih razliÄicah programa." #: ../glom/frame_glom.cc:517 msgid "Continue" msgstr "Nadaljuj" #: ../glom/frame_glom.cc:566 msgid "Export Not Allowed." msgstr "Izvoz ni dovoljen." #: ../glom/frame_glom.cc:566 msgid "You do not have permission to view the data in this table, so you may not export the data." msgstr "Ni ustreznih dovoljenj za ogled podatkov razpredelnice, zato podatkov ni mogoÄe izvoziti." #: ../glom/frame_glom.cc:597 msgid "Could Not Create File." msgstr "Datoteke ni mogoÄe ustvariti." #: ../glom/frame_glom.cc:597 msgid "Glom could not create the specified file." msgstr "Navedene datoteke ni mogoÄe ustvariti." #: ../glom/frame_glom.cc:748 msgid "No Table" msgstr "Ni razpredelnice" #: ../glom/frame_glom.cc:748 msgid "There is no table in to which data could be imported." msgstr "Ni razpredelnice v katero bi lahko bili podatki uvoženi." #: ../glom/frame_glom.cc:752 msgid "Open CSV Document" msgstr "Odpri dokument CSV" #: ../glom/frame_glom.cc:756 msgid "CSV files" msgstr "Datoteke CSV" #: ../glom/frame_glom.cc:760 msgid "All files" msgstr "Vse datoteke" #: ../glom/frame_glom.cc:835 msgid "Share on the network" msgstr "Daj v souporabo na omrežju " #: ../glom/frame_glom.cc:836 msgid "This will allow other users on the network to use this database." msgstr "To bo drugim uporabnikom na omrežju dovolilo uporabo te podatkovne zbirke." #: ../glom/frame_glom.cc:839 msgid "_Share" msgstr "_Souporaba" #. TODO: Warn about connected users if possible. #: ../glom/frame_glom.cc:940 msgid "Stop sharing on the network" msgstr "Zaustavi souporabo na omrežju" #: ../glom/frame_glom.cc:941 msgid "This will prevent other users on the network from using this database." msgstr "To bo drugim uporabnikom na omrežju prepreÄilo uporabo te podatkovne zbirke." #: ../glom/frame_glom.cc:944 msgid "_Stop Sharing" msgstr "_Zaustavi souporabo" #: ../glom/frame_glom.cc:992 #: ../glom/frame_glom.cc:2129 msgid "Stopping Database Server" msgstr "Zaustavljanje strežnika podatkovne zbirke" #. Do startup, such as starting the self-hosting database server #: ../glom/frame_glom.cc:995 #: ../glom/frame_glom.cc:2017 #: ../glom/frame_glom.cc:2175 msgid "Starting Database Server" msgstr "Zaganjanje strežnika podatkovne zbirke" #: ../glom/frame_glom.cc:1150 msgid "Table Exists Already" msgstr "Razpredelnica že obstaja" #: ../glom/frame_glom.cc:1150 msgid "A table with this name already exists in the database. Please choose a different table name." msgstr "Razpredelnica s tem imenom že obstaja v podatkovni zbirki. Izberite drugo ime razpredelnice." #: ../glom/frame_glom.cc:1154 msgid "Relationship Exists Already" msgstr "Razmerje že obstaja" #: ../glom/frame_glom.cc:1154 msgid "A relationship with this name already exists for this table. Please choose a different relationship name." msgstr "Razmerje s tem imenom že obstaja za to razpredelnico. Izberite drugo ime razmerja." #: ../glom/frame_glom.cc:1158 msgid "More information needed" msgstr "Zahtevanih je veÄ podrobnosti" #: ../glom/frame_glom.cc:1158 msgid "You must specify a field, a table name, and a relationship name." msgstr "DoloÄiti morate polje, ime razpredelnice in ime razmerja." #: ../glom/frame_glom.cc:1212 msgid "Related Table Created" msgstr "Ustvarjena je bila povezana razpredelnica" #: ../glom/frame_glom.cc:1212 msgid "The new related table has been created." msgstr "Ustvarjena je bila nova povezana razpredelnica." #. namespace Glom #: ../glom/frame_glom.cc:1241 #: ../ui/operator/box_navigation_tables.glade.h:1 msgid "Edit Tables" msgstr "Uredi razpredelnice" #: ../glom/frame_glom.cc:1336 msgid "You have not entered any find criteria. Try entering information in the fields." msgstr "Niste vnesli kriterijev iskanja. Poskusite vnesti podatke v poljih." #: ../glom/frame_glom.cc:1338 #: ../glom/mode_data/datawidget/dialog_choose_id.cc:108 msgid "No Find Criteria" msgstr "Ni kriterijev iskanja" #: ../glom/frame_glom.cc:1690 #: ../glom/onlineglom_strings.cc:33 #: ../ui/developer/box_reports.glade.h:1 msgid "Reports" msgstr "PoroÄila" #: ../glom/frame_glom.cc:1721 #: ../ui/developer/box_print_layouts.glade.h:1 msgid "Print Layouts" msgstr "Razporeditve tiskanja" #: ../glom/frame_glom.cc:1837 msgid "Could Not Create Directory" msgstr "Mape ni mogoÄe ustvariti" #: ../glom/frame_glom.cc:1838 msgid "There was an error when attempting to create the directory for the new database files." msgstr "Med poskusom ustvarjanja mape za nove datoteke podatkovne zbirke je priÅ¡lo do napake." #: ../glom/frame_glom.cc:1842 msgid "Could Not Start Database Server" msgstr "Strežnika podatkovne zbirke ni mogoÄe zagnati" #: ../glom/frame_glom.cc:1843 msgid "There was an error when attempting to start the database server." msgstr "Med poskusom zaganjanja strežnika podatkovne zbirke je priÅ¡lo do napake." #: ../glom/frame_glom.cc:1948 msgid "Initializing Database Data" msgstr "Zaganjanje podatkov podatkovne zbirke" #. Show 0 instead of "all" when all of no records are found, to avoid confusion. #: ../glom/frame_glom.cc:2489 msgid "All" msgstr "Vse" #: ../glom/utils_ui.cc:142 msgid "No help file available" msgstr "Datoteka pomoÄi ni na voljo" #: ../glom/utils_ui.cc:160 msgid "Could not display help: %1" msgstr "Ni mogoÄe prikazati pomoÄi: %1" #: ../glom/utils_ui.cc:476 msgid "Your find criteria did not match any records in the table." msgstr "VaÅ¡i kriteriji iskanja se ne skladajo z nobenim zapisom v razpredelnici." #: ../glom/utils_ui.cc:478 msgid "No Records Found" msgstr "Zapisov ni mogoÄe najti" #: ../glom/utils_ui.cc:483 msgid "New Find" msgstr "Novo iskanje" #: ../glom/utils_ui.cc:494 msgid "Report Finished" msgstr "PoroÄilo je konÄano" #: ../glom/utils_ui.cc:494 msgid "The report will now be opened in your web browser." msgstr "PoroÄilo bo sedaj odprto v vaÅ¡em spletnem brskalniku." #: ../glom/utils_ui.cc:541 msgid "Script Uses PyGTK 2" msgstr "Skript uporablja PyGTK 2" #: ../glom/utils_ui.cc:542 msgid "Glom cannot run this script because it uses pygtk 2, but Glom uses GTK+ 3, and attempting to use pygtk 2 would cause Glom to crash." msgstr "Program Glom ne podpira izvajanja te vrste skripta, saj uporablja pygtk 2, Glom pa uporablja GTK+ 3. Poskus uporabe pygtk 2 bi povzroÄilo sesutje programa." #. These strings are not actually used by Glom. #. I am putting them here so that GNOME's translators can translate them #. without dealing with the awkward (not gettext) system here: #. http://www.murrayc.com/blog/permalink/2012/01/27/online-glom-more-translation/ #. murrayc #: ../glom/onlineglom_strings.cc:29 msgid "Search" msgstr "PoiÅ¡Äi" #: ../glom/onlineglom_strings.cc:30 msgid "Back to List" msgstr "Nazaj na seznam" #. Translators: This is a noun. It is a notebook tab title. #. Details column: #: ../glom/onlineglom_strings.cc:31 #: ../glom/libglom/document/document.cc:1361 #: ../glom/mode_data/notebook_data.cc:67 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:215 #: ../glom/mode_find/notebook_find.cc:39 msgid "Details" msgstr "Podrobnosti" #: ../glom/onlineglom_strings.cc:32 msgid "Open" msgstr "Odpri" #: ../glom/onlineglom_strings.cc:34 msgid "Generating the report..." msgstr "Poteka ustvarjanje poroÄila ..." #: ../glom/bakery/appwindow_withdoc_gtk.cc:284 #: ../ui/developer/window_field_definition_edit.glade.h:13 msgid "_Edit" msgstr "_Uredi" #: ../glom/bakery/appwindow_withdoc_gtk.cc:376 msgid "Open Document" msgstr "Odpri dokument" #: ../glom/bakery/appwindow_withdoc.cc:237 #: ../glom/bakery/appwindow_withdoc.cc:288 msgid "There was an error while saving the file. Your changes have not been saved." msgstr "PriÅ¡lo je do napake med shranjevanjem datoteke. VaÅ¡e spremembe ne bodo shranjene." #: ../glom/bakery/appwindow_withdoc.cc:493 msgid "Open Failed." msgstr "Napaka med odpiranjem." #: ../glom/bakery/appwindow_withdoc.cc:493 msgid "The document could not be opened." msgstr "Dokumenta ni bilo mogoÄe odpreti." #: ../glom/bakery/dialog_offersave.cc:31 msgid "This document has unsaved changes. Would you like to save the document?" msgstr "Dokument vsebuje neshranjene spremembe. Ali želite dokument shraniti?" #: ../glom/bakery/dialog_offersave.cc:35 msgid "" "Document:\n" "%1" msgstr "" "Dokument:\n" "%1" #: ../glom/bakery/dialog_offersave.cc:47 msgid "Close without Saving" msgstr "Zapri brez shranjevanja" #: ../glom/bakery/dialog_offersave.cc:53 msgid "Discard" msgstr "Zavrzi" #: ../glom/import_csv/dialog_import_csv.cc:99 msgid "Auto Detect" msgstr "Samodejno zaznaj" #. We mean 22nd November 2008: #. C years start are the AD year - 1900. So, 01 is 1901. #. C months start at 0. #. starts at 1 #. Get the ISO (not current locale) text representation: #. ignored #. iso_format #: ../glom/import_csv/dialog_import_csv.cc:154 msgid "Note that the source file should contain numbers and dates in international ISO format. For instance, 22nd November 2008 should be %1." msgstr "Izvorna datoteka naj vsebuje Å¡tevilke in datume v mednarodni obliki ISO. Na primer, dvaindvajseti November 2008 bi moral biti %1." #: ../glom/import_csv/dialog_import_csv.cc:183 msgid "No Document Available" msgstr "Ni dokumentov na voljo" #: ../glom/import_csv/dialog_import_csv.cc:183 msgid "You need to open a document to import the data into a table." msgstr "Za uvažanje podatkov v razpredelnico morate odpreti dokument." #: ../glom/import_csv/dialog_import_csv.cc:194 msgid "Import From CSV File" msgstr "Uvoz iz datoteke CSV" #: ../glom/import_csv/dialog_import_csv.cc:199 #: ../glom/import_csv/dialog_import_csv.cc:576 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:274 msgid "Error Importing CSV File" msgstr "Napaka med uvažanjem datoteke CSV" #: ../glom/import_csv/dialog_import_csv.cc:428 msgid "Encoding detected as: %1" msgstr "Kodiranje je zaznano kot: %1" #: ../glom/import_csv/dialog_import_csv.cc:467 msgid "Encoding detection failed. Please manually choose one from the box." msgstr "Zaznavanje kodiranja je spodletelo. Izberite enega iz okna." #: ../glom/import_csv/dialog_import_csv.cc:471 msgid "The file contains data not in the specified encoding. Please choose another one, or try \"Auto Detect\"." msgstr "Datoteka vsebuje podatke, ki niso v navedenemu kodiranju. Izberite drugega ali poskusite \"Samodejno zaznaj\"." #. Translators: This is the name of a UI element (a layout part name). #. This is a straight line, not a database row. #: ../glom/import_csv/dialog_import_csv.cc:513 #: ../glom/libglom/data_structure/layout/layoutitem_line.cc:91 msgid "Line" msgstr "Vrstica" #: ../glom/import_csv/dialog_import_csv.cc:556 msgid "Target Field" msgstr "Ciljno polje" #: ../glom/import_csv/dialog_import_csv.cc:601 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:611 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:710 msgid "One column needs to be assigned the table's primary key (%1) as target field before importing" msgstr "Pred uvozom je treba osnovnemu kljuÄu razpredelnice (%1) dodeliti en stolpec kot ciljno polje" #: ../glom/import_csv/dialog_import_csv.cc:738 msgid "Could Not Open file" msgstr "Datoteke ni mogoÄe odpreti" #: ../glom/import_csv/dialog_import_csv.cc:739 msgid "The file at \"%1\" could not be opened: %2" msgstr "Datoteke na \"%1\" ni mogoÄe odpreti: %2" #: ../glom/import_csv/dialog_import_csv.cc:745 msgid "Import From CSV File: %1" msgstr "Uvoz iz datoteke CSV: %1" #: ../glom/import_csv/dialog_import_csv_progress.cc:85 msgid "Parsing CSV file %1" msgstr "RazÄlenjevanje CSV datoteke %1" #: ../glom/import_csv/dialog_import_csv_progress.cc:175 msgid "Import complete\n" msgstr "Uvoz je konÄan\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:204 msgid "Warning: Importing row %1: The value for field %2 must be unique, but is already in use. The value will not be imported.\n" msgstr "Opozorilo: Uvažanje vrstice %1: Vrednost polja %2 mora biti edinstvena, toda je že uporabljena. Vrednost ne bo uvožena.\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:213 msgid "Warning: Importing row %1: The value for field %2, \"%3\" could not be converted to the field's type. The value will not be imported.\n" msgstr "Opozorilo: Uvažanje vrstice %1: Vrednosti polja %2 \"%3\" ni mogoÄe pretvoriti v vrsto polja. Vrednost ne bo uvožena.\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:238 msgid "Error importing row %1: Cannot import the row because the primary key is empty.\n" msgstr "Napaka uvažanja vrstice %1: Vrstice ni mogoÄe uvoziti, ker je osnovni kljuÄ prazen.\n" #. TODO: Can we get this from anywhere else, such as iso-codes? murrayc #. TODO: Make this generally more efficient. #: ../glom/import_csv/file_encodings.cc:93 #: ../glom/import_csv/file_encodings.cc:94 #: ../glom/import_csv/file_encodings.cc:95 #: ../glom/import_csv/file_encodings.cc:96 #: ../glom/import_csv/file_encodings.cc:97 #: ../glom/import_csv/file_encodings.cc:98 #: ../glom/import_csv/file_encodings.cc:99 #: ../glom/import_csv/file_encodings.cc:100 msgid "Unicode" msgstr "unicode" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:102 #: ../glom/import_csv/file_encodings.cc:115 #: ../glom/import_csv/file_encodings.cc:120 msgid "Western" msgstr "zahodno" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:103 #: ../glom/import_csv/file_encodings.cc:118 msgid "Central European" msgstr "srednjeevropsko" #: ../glom/import_csv/file_encodings.cc:104 msgid "South European" msgstr "južnoevropsko" #: ../glom/import_csv/file_encodings.cc:105 #: ../glom/import_csv/file_encodings.cc:113 #: ../glom/import_csv/file_encodings.cc:125 msgid "Baltic" msgstr "baltsko" #: ../glom/import_csv/file_encodings.cc:106 #: ../glom/import_csv/file_encodings.cc:119 msgid "Cyrillic" msgstr "cirilica" #: ../glom/import_csv/file_encodings.cc:107 #: ../glom/import_csv/file_encodings.cc:124 msgid "Arabic" msgstr "arabÅ¡Äina" #: ../glom/import_csv/file_encodings.cc:108 #: ../glom/import_csv/file_encodings.cc:121 msgid "Greek" msgstr "grÅ¡Äina" #: ../glom/import_csv/file_encodings.cc:109 msgid "Hebrew Visual" msgstr "vizualna hebrejÅ¡Äina" #: ../glom/import_csv/file_encodings.cc:110 #: ../glom/import_csv/file_encodings.cc:123 msgid "Hebrew" msgstr "hebrejÅ¡Äina" #: ../glom/import_csv/file_encodings.cc:111 #: ../glom/import_csv/file_encodings.cc:122 msgid "Turkish" msgstr "turÅ¡Äina" #: ../glom/import_csv/file_encodings.cc:112 msgid "Nordic" msgstr "nordijsko" #: ../glom/import_csv/file_encodings.cc:114 msgid "Celtic" msgstr "keltsko" #: ../glom/import_csv/file_encodings.cc:116 msgid "Romanian" msgstr "romunÅ¡Äina" #: ../glom/import_csv/file_encodings.cc:126 msgid "Vietnamese" msgstr "vietnamÅ¡Äina" #. Translators: This means an unknown or unnacceptable value type in a database. #: ../glom/libglom/data_structure/field.cc:643 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:151 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:159 msgid "Invalid" msgstr "Neveljavno" #. Translators: This means a numeric value type in a database. #: ../glom/libglom/data_structure/field.cc:646 msgid "Number" msgstr "Å tevilka" #. Translators: This means a text/string value type in a database. #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/field.cc:649 #: ../glom/libglom/data_structure/layout/layoutitem_text.cc:73 #: ../glom/libglom/data_structure/translatable_item.cc:248 #: ../glom/mode_design/layout/dialog_layout_details.cc:1159 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:36 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:759 msgid "Text" msgstr "Besedilo" #. Translators: This means a time value type in a database. #: ../glom/libglom/data_structure/field.cc:652 msgid "Time" msgstr "ÄŒas" #. Translators: This means a time value type in a database. #: ../glom/libglom/data_structure/field.cc:655 msgid "Date" msgstr "Datum" #. Translators: This means a true/false value type in a database. #: ../glom/libglom/data_structure/field.cc:658 msgid "Boolean" msgstr "Boolean" #. Translators: This means a picture value type in a database. #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/field.cc:661 #: ../glom/libglom/data_structure/layout/layoutitem_image.cc:70 #: ../glom/libglom/data_structure/translatable_item.cc:250 #: ../glom/mode_design/layout/dialog_layout_details.cc:1166 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:38 #: ../glom/utility_widgets/layouttoolbar.cc:47 msgid "Image" msgstr "Slika" #. TRANSLATORS: Please only translate this string if you know that strftime() #. * shows only 2 year digits when using format "x". We want to always display #. * 4 year digits. For instance, en_GB should translate it to "%d/%m/%Y". #. * Glom will show a warning in the terminal at startup if this is necessary #. * and default to %d/%m/%Y" if it detects a problem, but that might not be #. * correct for your locale. #. * Thanks. #: ../glom/libglom/data_structure/glomconversions.cc:99 #, no-c-format msgid "%x" msgstr "%d.%m.%Y" #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:147 msgid "ERROR: sanity_check_date_parsing(): Sanity check failed: Glom could not parse a date's text representation that it generated itself, in this locale." msgstr "NAPAKA: sanity_check_date_parsing(): pregled je spodletel: program Glom predstavitve besedila ustvarjenega datuma ne more razÄleniti v tej jezikovni oznaki. " #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:183 msgid "ERROR: sanity_check_date_text_representation_uses_4_digit_year(): Sanity check failed: Glom does not seem to use 4 digits to display years in a date's text representation, in this locale. Defaulting to dd/mm/yyyy though this might be incorrect for your locale. This needs attention from a translator. Please file a bug - see http://www.glom.org" msgstr "NAPAKA: sanity_check_date_text_representation_uses_4_digit_year(): pregled je spodletel. Videti je, da v tej jezikovni oznaki Glom ne uporablja Å¡tirih Å¡tevilk za prikaz let. Uporabljanje privzetega dd/mm/llll, Äeprav je to morda napaÄno za vaÅ¡o jezikovno oznako. To mora videti prevajalec. PoÅ¡ljite poroÄilo o hroÅ¡Äu - oglejte si http://www.glom.org " #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutgroup.cc:422 #: ../glom/utility_widgets/layouttoolbar.cc:35 #: ../glom/utility_widgets/layouttoolbar.cc:45 #: ../glom/utility_widgets/notebooklabelglom.cc:76 msgid "Group" msgstr "Združi" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_button.cc:68 #: ../glom/libglom/data_structure/translatable_item.cc:246 #: ../glom/mode_design/layout/dialog_layout_details.cc:1152 #: ../glom/utility_widgets/layouttoolbar.cc:43 msgid "Button" msgstr "Gumb" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_calendarportal.cc:58 msgid "Calendar Portal" msgstr "Portal koledarja" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_field.cc:229 #: ../glom/libglom/data_structure/translatable_item.cc:228 #: ../glom/mode_design/dialog_database_preferences.cc:62 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:755 #: ../ui/developer/window_field_definition_edit.glade.h:8 msgid "Field" msgstr "Polje" #. Translators: This is the name of a UI element (a layout part name). #. "Notebook" means a GtkNotebook-type widget. #: ../glom/libglom/data_structure/layout/layoutitem_notebook.cc:57 #: ../glom/utility_widgets/layouttoolbar.cc:37 msgid "Notebook" msgstr "Beležka" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_placeholder.cc:60 msgid "Placeholder" msgstr "Vsebnik" #. TODO: "Portal" probably shouldn't appear in the UI. #. We should use "Related Records instead. #. Translators: This is the name of a UI element (a layout part name). #. It means a list of related records. #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:88 msgid "Portal" msgstr "Portal" #. TODO: This prevents "" as a real title. #. parent table - not relevant #. TODO: This prevents "" as a real title. #. Note to translators: This text is shown instead of a table title, when the table has not yet been chosen. #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:424 #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:433 #: ../glom/mode_data/box_data_portal.cc:116 #: ../glom/mode_data/box_data_portal.cc:128 msgid "Undefined Table" msgstr "NedoloÄena razpredelnica" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:79 #: ../ui/developer/dialog_field_summary.glade.h:1 msgid "Field Summary" msgstr "Povzetek polja" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:134 msgid "No summary chosen" msgstr "Povzetek ni na voljo" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:153 msgid "Sum" msgstr "Vsota" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:155 msgid "Average" msgstr "PovpreÄno" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:157 msgid "Count" msgstr "Å tevec" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_footer.cc:56 #: ../ui/developer/window_report_layout.glade.h:12 msgid "Footer" msgstr "Noga" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.cc:103 #: ../ui/developer/dialog_group_by.glade.h:1 msgid "Group By" msgstr "Združi po" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_header.cc:56 #: ../ui/developer/window_report_layout.glade.h:9 msgid "Header" msgstr "Glava" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_summary.cc:62 msgid "Summary" msgstr "Povzetek" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc:56 msgid "Vertical Group" msgstr "NavpiÄna skupina" #: ../glom/libglom/data_structure/translatable_item.cc:230 msgid "Custom Title" msgstr "Naslov po meri" #: ../glom/libglom/data_structure/translatable_item.cc:232 msgid "Relationship" msgstr "Razmerje" #: ../glom/libglom/data_structure/translatable_item.cc:234 msgid "Layout Item" msgstr "Razporeditev predmeta" #: ../glom/libglom/data_structure/translatable_item.cc:236 msgid "Print Layout" msgstr "Postavitev strani" #: ../glom/libglom/data_structure/translatable_item.cc:238 msgid "Report" msgstr "PoroÄilo" #. Tables: #: ../glom/libglom/data_structure/translatable_item.cc:240 #: ../glom/mode_design/box_db_table_relationships.cc:53 #: ../glom/mode_design/dialog_database_preferences.cc:61 #: ../glom/mode_design/users/dialog_groups_list.cc:73 #: ../glom/navigation/box_tables.cc:132 msgid "Table" msgstr "Razpredelnica" #: ../glom/libglom/data_structure/translatable_item.cc:242 msgid "Layout Group" msgstr "Razporeditev skupine" #: ../glom/libglom/data_structure/translatable_item.cc:244 msgid "Field Title" msgstr "Naslov polja" #: ../glom/libglom/data_structure/translatable_item.cc:252 msgid "Field Choice" msgstr "Izbira polja" #: ../glom/libglom/data_structure/translatable_item.cc:254 msgid "Database Title" msgstr "Naslov podatkovne zbirke" #: ../glom/libglom/data_structure/translatable_item.cc:256 #: ../glom/mode_design/translation/window_translations.cc:217 msgid "Unknown" msgstr "Neznano" #: ../glom/libglom/document/document.cc:508 #: ../glom/libglom/document/document.cc:526 msgid "System Preferences" msgstr "Možnosti sistema" #: ../glom/libglom/document/document.cc:539 msgid "System Name" msgstr "Ime sistema" #: ../glom/libglom/document/document.cc:545 msgid "Organisation Name" msgstr "Ime organizacije" #: ../glom/libglom/document/document.cc:551 msgid "Organisation Logo" msgstr "Logotip organizacije" #: ../glom/libglom/document/document.cc:557 msgid "Street" msgstr "Ulica" #: ../glom/libglom/document/document.cc:563 msgid "Street (line 2)" msgstr "Ulica (druga vrstica)" #: ../glom/libglom/document/document.cc:569 msgid "City" msgstr "Mesto" #: ../glom/libglom/document/document.cc:575 msgid "State" msgstr "Regija" #: ../glom/libglom/document/document.cc:581 msgid "Country" msgstr "Država" #: ../glom/libglom/document/document.cc:587 msgid "Zip Code" msgstr "PoÅ¡tna Å¡tevilka" #: ../glom/libglom/document/document.cc:1355 msgid "Overview" msgstr "Pregled" #: ../glom/libglom/document/bakery/document.cc:413 msgid "Untitled" msgstr "Neimenovano" #: ../glom/libglom/gst-package.c:56 msgid "Could not install package" msgstr "Paketa ni mogoÄe namestiti" #: ../glom/libglom/gst-package.c:74 msgid "The necessary applications to install the package could not be found." msgstr "Zahtevanih programov za namestitev paketa ni mogoÄe najti." #. Show only debug output #: ../glom/libglom/translations_po.cc:69 msgid "Gettext-Warning: " msgstr "Opozorilo Gettext:" #: ../glom/libglom/db_utils.cc:503 msgid "System: Auto Increments" msgstr "Sistem: samodejno poveÄanje" #: ../glom/libglom/db_utils.cc:1176 #: ../glom/mode_design/users/dialog_groups_list.cc:70 msgid "Description" msgstr "Opis" #: ../glom/libglom/db_utils.cc:1183 msgid "Comments" msgstr "Opombe" #. Translators: This is a noun. It is the title of a report. #. Add Pages: #. Translators: This is a noun. It is a notebook tab title. #: ../glom/libglom/report_builder.cc:771 #: ../glom/mode_data/notebook_data.cc:63 #: ../glom/mode_find/notebook_find.cc:32 msgid "List" msgstr "Seznam" #: ../glom/glom_create_from_example.cc:65 #: ../glom/glom_export_po.cc:51 #: ../glom/glom_export_po_all.cc:49 #: ../glom/glom_import_po_all.cc:50 #: ../glom/glom_test_connection.cc:55 msgid "Glom options" msgstr "Možnosti glom" #: ../glom/glom_create_from_example.cc:65 #: ../glom/glom_export_po.cc:51 #: ../glom/glom_export_po_all.cc:49 #: ../glom/glom_import_po_all.cc:50 #: ../glom/glom_test_connection.cc:55 msgid "Command-line options" msgstr "Možnosti ukazne vrstice" #: ../glom/glom_create_from_example.cc:72 msgid "The example .glom file to open." msgstr "Odprta je vzorÄna datoteka .glom." #: ../glom/glom_create_from_example.cc:77 msgid "The directory in which to save the created .glom file, or sub-directory if necessary, such as /home/someuser/ ." msgstr "Mapa za shranjevanje ustvarjene datoteke .glom ali pa podrejena mapa, na primer /home/uporabnik/ ." #: ../glom/glom_create_from_example.cc:82 msgid "The name for the created .glom file, such as something.glom ." msgstr "Ime ustvarjene datoteke .glom, na primer imedatoteke.glom ." #: ../glom/glom_create_from_example.cc:87 #: ../glom/glom_export_po.cc:72 #: ../glom/glom_export_po_all.cc:60 #: ../glom/glom_import_po_all.cc:61 #: ../glom/glom_test_connection.cc:63 #: ../glom/main_local_options.cc:47 msgid "The version of this application." msgstr "RazliÄica tega programa." #: ../glom/glom_create_from_example.cc:93 msgid "The hostname of the PostgreSQL server, such as localhost. If this is not specified then a self-hosted database will be created." msgstr "Ime gostitelja strežnika PostgreSQL, na primer localhost. V kolikor možnost ni navedena, bo samodejno ustvarjena podatkovna zbirka z lastnim gostiteljem." #: ../glom/glom_create_from_example.cc:98 #: ../glom/glom_test_connection.cc:73 msgid "The port of the PostgreSQL server, such as 5434." msgstr "Vrata strežnika PostgreSQL, na primer 5434." #: ../glom/glom_create_from_example.cc:103 #: ../glom/glom_test_connection.cc:78 msgid "The username for the PostgreSQL server." msgstr "UporabniÅ¡ko ime za povezavo s strežnikom PostgreSQL." #: ../glom/glom_create_from_example.cc:316 msgid "Glom: The output directory does not exist." msgstr "Glom: odvodna mapa ne obstaja." #: ../glom/glom_create_from_example.cc:326 msgid "Glom: The output path is not a directory." msgstr "Glom: odvodna pot je mapa." #: ../glom/glom_create_from_example.cc:424 #: ../glom/glom_test_connection.cc:166 msgid "Please enter the PostgreSQL server's password for the user %1: " msgstr "Vnesite geslo za povezavo s strežnikom PostgreSQL za uporabnika %1:" #: ../glom/glom_create_from_example.cc:428 #: ../glom/glom_test_connection.cc:170 msgid "Error: getpass() is not implemented in the Windows build. The connection will fail." msgstr "Napaka: getpass() ni vgrajen v izgradnji okna. Povezava bo spodletela." #: ../glom/glom_export_po.cc:57 msgid "The path at which to save the created .po file, such as /home/someuser/somefile.po ." msgstr "Mapa za shranjevanje ustvarjene datoteke .po, na primer /home/uporabnik/ imedatoteke.po." #: ../glom/glom_export_po.cc:62 msgid "The locale whose translations should be written to the .po file, such as de_DE." msgstr "Jezikovni nabor katerega prevodi naj se zapiÅ¡ejo v datoteko .po (primer sl.SI, de_DE ...)." #: ../glom/glom_export_po.cc:67 msgid "Generate a .pot template file instead of a .po file for a locale." msgstr "Ustvari datoteko predloge .pot namesto datoteke .po v iz branem jezikovnem naboru." #: ../glom/glom_export_po.cc:142 #: ../glom/glom_export_po_all.cc:130 #: ../glom/glom_import_po_all.cc:131 msgid "Please specify a glom file." msgstr "DoloÄiti je trema datoteko glom." #: ../glom/glom_export_po.cc:149 msgid "Please use either the --locale-id option or the --template option." msgstr "Uporabiti je treba ali možnost --locale-id ali pa možnost --template." #: ../glom/glom_export_po.cc:180 #: ../glom/glom_export_po_all.cc:161 msgid "Please specify an output path." msgstr "DoloÄiti je treba odvodno pot." #: ../glom/glom_export_po.cc:220 msgid "Pot file creation failed." msgstr "Ustvarjanje datoteke pot je spodletelo." #: ../glom/glom_export_po.cc:224 msgid "Pot file created at: %1" msgstr "Ustvarjena datoteka pot v: %s" #: ../glom/glom_export_po.cc:232 #: ../glom/glom_export_po_all.cc:223 msgid "Po file creation failed." msgstr "Ustvarjanje datoteke po je spodletelo." #: ../glom/glom_export_po.cc:236 #: ../glom/glom_export_po_all.cc:227 msgid "Po file created at: %1" msgstr "Ustvarjena datoteka po v: %s" #: ../glom/glom_export_po_all.cc:55 msgid "The directory path at which to save the created .po files, such as /home/someuser/po_files/ ." msgstr "Mapa za shranjevanje ustvarjenih datotek .po, na primer /home/uporabnik/ po_files/." #: ../glom/glom_export_po_all.cc:143 #: ../glom/glom_import_po_all.cc:144 msgid "The Glom file does not exist." msgstr "Datoteka glom ne obstaja." #: ../glom/glom_export_po_all.cc:153 #: ../glom/glom_import_po_all.cc:154 msgid "The Glom file path is a directory instead of a file." msgstr "Pot datoteke glom je mapa in ne datoteka." #: ../glom/glom_export_po_all.cc:174 msgid "The ouput directory could not be created." msgstr "Odvodne mape ni mogoÄe ustvariti." #: ../glom/glom_export_po_all.cc:182 msgid "Glom: The output file path is not a directory." msgstr "Glom: odvodna pot datoteke ni mapa." #: ../glom/glom_export_po_all.cc:204 msgid "The Glom document has no translations." msgstr "Dokument glom je brez prevoda." #: ../glom/glom_import_po_all.cc:56 msgid "The path to a directory containing .po files, such as /home/someuser/po_files/ ." msgstr "Pot do mape z datotekami .po kot na primer /home/someuser/po_files/." #: ../glom/glom_import_po_all.cc:162 msgid "Please specify the path to a directory containing po files." msgstr "DoloÄite pot do mape z datotekami po." #: ../glom/glom_import_po_all.cc:173 msgid "Glom: The po files directory path is not a directory." msgstr "Glom: pot do mape z datotekami po ni mapa." #: ../glom/glom_import_po_all.cc:213 msgid "Po file import failed for locale: %1" msgstr "Uvažanje datoteke po za jezikovni nabor %1 je spodletelo." #: ../glom/glom_import_po_all.cc:218 msgid "Po file imported for locale: %1 for file %2" msgstr "Datoteka po %2 je uvožena za jezikovni nabor %1." #: ../glom/glom_test_connection.cc:68 msgid "The hostname of the PostgreSQL server, such as localhost." msgstr "Ime gostitelja strežnika PostgreSQL, na primer localhost." #: ../glom/glom_test_connection.cc:84 msgid "The specific database on the PostgreSQL server (Optional)." msgstr "Podatkovna zbirka na strežniku PostgreSQL (izbirno)." #: ../glom/glom_test_connection.cc:156 msgid "Please provide a database username." msgstr "Vnesite uporabniÅ¡ko ime za podatkovno zbirko." #: ../glom/glom_test_connection.cc:220 msgid "Error: Could not connect to the server even without specifying a database." msgstr "Napaka: ni se mogoÄe povezati s strežnikom brez doloÄila podatkovne zbirke." #: ../glom/glom_test_connection.cc:228 msgid "Error: Could not connect to the specified database." msgstr "Napaka: povezava z doloÄeno podatkovno zbirko ni mogoÄa." #: ../glom/glom_test_connection.cc:234 msgid "Successful connection." msgstr "Povezava je uspeÅ¡no vzpostavljena." #: ../glom/main.cc:189 msgid "" "You seem to be running Glom as a user with administrator privileges. Glom may not be run with such privileges for security reasons.\n" "Please login to your system as a normal user." msgstr "" "Videti je, da zaganjate Glom kot uporabnik s skrbniÅ¡kimi pravicami. Gloma ni mogoÄe zagnati s temi pravicami zaradi varnostnih vzrokov.\n" "Prijavite se v svoj sistem kot obiÄajni uporabnik." #. Warn the user: #: ../glom/main.cc:203 msgid "" "You seem to be running Glom as root. Glom may not be run as root.\n" "Please login to your system as a normal user." msgstr "" "Videti je, da zaganjate Glom kot skrbnik. Programa ni mogoÄe uporabljati kot tak skrbnik.\n" "Prijavite se v svoj sistem kot obiÄajen uporabnik." #: ../glom/main.cc:209 msgid "Running As Root" msgstr "Zagnano s skrbniÅ¡kim raÄunom" #. Show message to the user about the broken installation: #. This is a packaging bug, but it would probably annoy packagers to mention that in the dialog: #. Show message to the user about the broken installation: #: ../glom/main.cc:252 #: ../glom/main.cc:265 #: ../glom/main.cc:426 msgid "Incomplete Glom Installation" msgstr "Nepopolna namestitev Gloma" #. use_markup #. modal #: ../glom/main.cc:253 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not available on your system. PostgreSQL is needed for self-hosting of Glom databases.\n" "\n" "You may now install PostgreSQL to complete the Glom installation." msgstr "" "VaÅ¡a namestitev Gloma ni konÄana, ker PostgreSQL na vaÅ¡em sistemu ni na voljo. PostgreSQL je zahtevan za samo-gostovanje podatkovnih zbirk Glom.\n" "\n" "Za konÄanje namestitve Gloma namestite PostgreSQL." #: ../glom/main.cc:255 msgid "Install PostgreSQL" msgstr "Namesti PostgreSQL" #. use_markup #. modal #: ../glom/main.cc:266 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not available on your system. PostgreSQL is needed for self-hosting of Glom databases.\n" "\n" "Please report this bug to your vendor, or your system administrator so it can be corrected." msgstr "" "VaÅ¡a namestitev Gloma ni konÄana, ker PostgreSQL na vaÅ¡em sistemu ni na voljo. PostgreSQL je zahtevan za samo-gostovanje podatkovnih zbirk Glom.\n" "\n" "PoÅ¡ljite poroÄilo o tem hroÅ¡Äu svojemu proizvajalcu ali skrbniku sistema, da bo lahko popravljen." #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:282 msgid "" "Your installation of Glom is not complete, because the Glom Python module is not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it can be corrected." msgstr "" "VaÅ¡a namestitev Gloma ni konÄana, ker modul Glom Python na vaÅ¡em sistemu ni na voljo.\n" "\n" "PoÅ¡ljite poroÄilo o tem hroÅ¡Äu svojemu proizvajalcu ali skrbniku sistema, da bo lahko popravljen." #: ../glom/main.cc:284 msgid "Glom Python Module Not Installed" msgstr "Python module glom ni nameÅ¡Äen" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:297 msgid "" "Your installation of Glom is not complete, because the gi.repository Python module is not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it can be corrected." msgstr "" "Namestitev Gloma ni konÄana, ker modul Python gi.repository na vaÅ¡em sistemu ni na voljo.\n" "\n" "PoÅ¡ljite poroÄilo o tem hroÅ¡Äu skrbniku sistema, da bo lahko popravljen." #: ../glom/main.cc:299 msgid "gi.repository Python Module Not Installed" msgstr "Python modul gi.repository ni nameÅ¡Äen" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:312 msgid "" "Your installation of Glom is not complete, because the gi.repository.Gda python module is not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it can be corrected." msgstr "" "Namestitev Gloma ni konÄana, ker modul Python gi.repository.Gda na vaÅ¡em sistemu ni na voljo.\n" "\n" "PoÅ¡ljite poroÄilo o hroÅ¡Äu skrbniku sistema, da bo lahko popravljen." #: ../glom/main.cc:314 msgid "gi.repository.Gda Python Module Not Installed" msgstr "Python modul gi.repository.Gda ni nameÅ¡Äen" #. The Postgres provider was not found, so warn the user: #: ../glom/main.cc:424 msgid "" "Your installation of Glom is not complete, because the PostgreSQL libgda provider is not available on your system. This provider is needed to access Postgres database servers.\n" "\n" "Please report this bug to your vendor, or your system administrator so it can be corrected." msgstr "" "VaÅ¡a namestitev Gloma ni konÄana, ker ponudnik PostgreSQL libgda na vaÅ¡em sistemu ni na voljo. Ponudnik je zahtevan za dostop do podatkovnih strežnikov Postgres.\n" "\n" "PoÅ¡ljite poroÄilo o tem hroÅ¡Äu svojemu proizvajalcu ali skrbniku sistema, da bo lahko popravljen." #: ../glom/main_local_options.cc:39 msgid "Extra Glom options" msgstr "Dodatne možnosti Glom" #: ../glom/main_local_options.cc:39 msgid "Extra command-line options for glom" msgstr "Dodatne možnosti ukazne vrstice za program glom" #: ../glom/main_local_options.cc:52 msgid "Show how Glom outputs a date in this locale, then stop." msgstr "Pokaži kako Glom izpiÅ¡e datum v tej jezikovni oznaki, nato se zaustavi." #: ../glom/main_remote_options.cc:31 msgid "Main Glom options" msgstr "Glavne možnosti glom" #: ../glom/main_remote_options.cc:31 msgid "Main command-line options for glom" msgstr "Glavne možnosti ukazne vrstice za program glom" #: ../glom/main_remote_options.cc:39 msgid "The Filename" msgstr "Ime datoteke" #: ../glom/main_remote_options.cc:44 msgid "Whether the filename is a .tar.gz backup to be restored." msgstr "Ali je datoteka varnostne kopije .tar.gz za obnovo." #: ../glom/main_remote_options.cc:49 msgid "Do not automatically stop the database server if Glom quits. This is helpful for debugging with gdb." msgstr "Ne zaustavi samodejno strežnika podatkovne zbirke, Äe se opravilo Glom konÄa. To je v pomoÄ pri razhroÅ¡Äevanju z gdb." #: ../glom/main_remote_options.cc:54 msgid "Show the generated SQL queries on stdout, for debugging." msgstr "Pokaži ustvarjene poizvedbe SQL na standardnem izhodu za razhroÅ¡Äevanje." #. Don't add ContextLayout in client only mode because it would never #. be sensitive anyway #: ../glom/mode_data/box_data_calendar_related.cc:512 #: ../glom/mode_data/db_adddel/db_adddel.cc:249 #: ../ui/developer/window_data_layout.glade.h:1 msgid "Layout" msgstr "Razporeditev" #: ../glom/mode_data/box_data.cc:190 msgid "" "This data cannot be stored in the database because you have not provided a primary key.\n" "Do you really want to discard this data?" msgstr "" "Podatkov ni mogoÄe shraniti v podatkovni zbirki, ker niste zagotovili osnovnega kljuÄa.\n" "Ali resniÄno želite zavreÄi te podatke?" #. Ask user to confirm loss of data: #: ../glom/mode_data/box_data.cc:192 msgid "No primary key value" msgstr "Ni vrednosti osnovnega kljuÄa" #: ../glom/mode_data/box_data_details.cc:112 msgid "Create a new record." msgstr "Ustvari nov zapis." #: ../glom/mode_data/box_data_details.cc:113 msgid "Remove this record." msgstr "Odstrani ta zapis." #: ../glom/mode_data/box_data_details.cc:114 msgid "View the first record in the list." msgstr "Ogled prvega zapisa na seznamu." #: ../glom/mode_data/box_data_details.cc:115 msgid "View the previous record in the list." msgstr "Ogled predhodnega zapisa na seznamu." #: ../glom/mode_data/box_data_details.cc:116 msgid "View the next record in the list." msgstr "Ogled naslednjega zapisa na seznamu." #: ../glom/mode_data/box_data_details.cc:117 msgid "View the last record in the list." msgstr "Ogled zadnjega zapisa na seznamu." #: ../glom/mode_data/box_data_details.cc:417 msgid "Layout Contains No Fields" msgstr "Razporeditev ne vsebuje polj" #: ../glom/mode_data/box_data_details.cc:417 msgid "There are no fields on the layout, so there is no way to enter data in a new record." msgstr "Na razporeditvi ni polj, zato ni mogoÄe vnesti podatkov v nov zapis." #. Tell user that a primary key is needed to delete a record: #: ../glom/mode_data/box_data_details.cc:444 msgid "No primary key value." msgstr "Ni vrednosti osnovnega kljuÄa." #: ../glom/mode_data/box_data_details.cc:445 msgid "This record cannot be deleted because there is no primary key." msgstr "Zapisa ni mogoÄe izbrisati, ker ni osnovnega kljuÄa." #. Warn user that they can't choose their own primary key: #: ../glom/mode_data/box_data_details.cc:854 msgid "Primary key auto increments" msgstr "Samodejni prirastki osnovnega kljuÄa" #: ../glom/mode_data/box_data_details.cc:855 msgid "" "The primary key is auto-incremented.\n" " You may not enter your own primary key value." msgstr "" "Osnovni kljuÄ se samodejno poveÄuje.\n" " Svoje vrednosti osnovnega kljuÄa ne morete vnesti." #: ../glom/mode_data/box_data_portal.cc:337 msgid "No Corresponding Record Exists" msgstr "Ustrezni zapis ne obstaja" #: ../glom/mode_data/box_data_portal.cc:337 msgid "No record with this value exists. Therefore navigation to the related record is not possible." msgstr "Zapis s to vrednostjo ne obstaja. Zato krmarjenje na povezan zapis ni mogoÄe." #: ../glom/mode_data/flowtablewithfields.cc:1166 #: ../glom/utility_widgets/notebooklabelglom.cc:75 #: ../glom/utility_widgets/notebooklabelglom.cc:116 msgid "New Group" msgstr "Nova skupina" #: ../glom/mode_data/flowtablewithfields.cc:1172 #: ../glom/mode_design/layout/dialog_layout_details.cc:736 msgid "notebook" msgstr "beležka" #. Note to translators: This is the default name (not seen by most users) for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1178 msgid "tab1" msgstr "zavihek1" #. Note to translators: This is the default label text for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1181 msgid "Tab One" msgstr "Zavihek ena" #: ../glom/mode_data/flowtablewithfields.cc:1194 msgid "button" msgstr "gumb" #: ../glom/mode_data/flowtablewithfields.cc:1195 #: ../glom/mode_design/layout/dialog_layout_details.cc:662 msgid "New Button" msgstr "Nov gumb" #. Note to translators: This is the default contents of a text item on a print layout: #: ../glom/mode_data/flowtablewithfields.cc:1201 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:457 msgid "text" msgstr "besedilo" #: ../glom/mode_data/flowtablewithfields.cc:1202 msgid "New Text" msgstr "Novo besedilo" #. TODO: Use a real English sentence here? #: ../glom/mode_data/flowtablewithfields.cc:1355 msgid "Delete whole group \"%1\"?" msgstr "Ali naj bo izbrisana celotna skupina \"%1\"?" #. TODO: Use a real English sentence here: #: ../glom/mode_data/flowtablewithfields.cc:1361 msgid "Delete whole group?" msgstr "Ali naj bo izbrisana celotna skupina?" #. Translators: This is a title, not an action. #: ../glom/mode_data/notebook_data.cc:73 msgid "List Or Details View" msgstr "Pogled seznama ali podrobnosti" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/box_db_table_relationships.cc:47 msgid "This relationship already exists. Please choose a different relationship name" msgstr "To razmerje že obstaja. Izberite drugo ime razmerja" #. Translators: FROM as in SQL's FROM #: ../glom/mode_design/box_db_table_relationships.cc:52 msgid "From Field" msgstr "Polje od" #: ../glom/mode_design/box_db_table_relationships.cc:54 msgid "To Field" msgstr "Polje za" #: ../glom/mode_design/box_db_table_relationships.cc:55 #: ../ui/developer/dialog_layout_field_properties.glade.h:3 msgid "Allow Editing" msgstr "Dovoli urejanje" #: ../glom/mode_design/box_db_table_relationships.cc:56 msgid "Automatic Creation" msgstr "Samodejno ustvarjanje" #: ../glom/mode_design/box_db_table_relationships.cc:58 #: ../glom/navigation/box_tables.cc:143 msgid "Title (Singular Form)" msgstr "Naslov (edninska oblika)" #: ../glom/mode_design/dialog_database_preferences.cc:63 msgid "Next Value" msgstr "Naslednja vrednost" #: ../glom/mode_design/dialog_design.cc:53 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:640 #: ../ui/developer/window_design.glade.h:3 msgid "None selected" msgstr "Brez izbora" #: ../glom/mode_design/dialog_initial_password.cc:83 msgid "Username Is Empty" msgstr "UporabniÅ¡ko ime je prazno" #: ../glom/mode_design/dialog_initial_password.cc:83 msgid "Please enter a login name for the new user." msgstr "Vnesite prijavno ime za novega uporabnika." #: ../glom/mode_design/dialog_initial_password.cc:88 #: ../glom/mode_design/users/dialog_user.cc:58 msgid "Passwords Do Not Match" msgstr "Gesli se ne ujemata" #: ../glom/mode_design/dialog_initial_password.cc:88 #: ../glom/mode_design/users/dialog_user.cc:58 msgid "The entered password does not match the entered password confirmation. Please try again." msgstr "Vneseno geslo se ne ujema z vnesenim potrditvenim geslom. Poskusite znova." #: ../glom/mode_design/dialog_initial_password.cc:93 #: ../glom/mode_design/users/dialog_user.cc:63 msgid "Password Is Empty" msgstr "Geslo je prazno" #: ../glom/mode_design/dialog_initial_password.cc:93 #: ../glom/mode_design/users/dialog_user.cc:63 msgid "Please enter a password for this user." msgstr "Vnesite geslo za tega uporabnika." #. Don't allow adding of fields that already exist. #: ../glom/mode_design/fields/box_db_table_definition.cc:56 #: ../glom/mode_design/fields/box_db_table_definition.cc:339 msgid "This field already exists. Please choose a different field name" msgstr "To polje že obstaja. Izberite drugo ime polja" #: ../glom/mode_design/fields/box_db_table_definition.cc:60 msgid "Type" msgstr "Vrsta" #. TODO: Only show this when there are > 100 records? #: ../glom/mode_design/fields/box_db_table_definition.cc:269 msgid "Recalculation Required" msgstr "Zahtevan je ponoven izraÄun" #: ../glom/mode_design/fields/box_db_table_definition.cc:270 msgid "You have changed the calculation used by this field so Glom must recalculate the value in all records. If the table contains many records then this could take a long time." msgstr "Spremenili ste izraÄun, ki ga uporablja to polje, zato mora Glom ponovno izraÄunati vrednost v vseh zapisih. V primeru da razpredelnica vsebuje veliko zapisov, lahko to vzame veliko Äasa." #: ../glom/mode_design/fields/box_db_table_definition.cc:275 msgid "Recalculate" msgstr "Ponovno izraÄunaj" #: ../glom/mode_design/fields/box_db_table_definition.cc:284 msgid "Invalid database structure" msgstr "Neveljavna struktura podatkovne zbirke" #: ../glom/mode_design/fields/box_db_table_definition.cc:285 msgid "This database field was created or edited outside of Glom. It has a data type that is not supported by Glom. Your system administrator may be able to correct this." msgstr "Polje podatkovne zbirke je bilo ustvarjeno ali urejeno izven Glom. Vsebuje vrsto podatkov, ki je Glom ne podpira. Morda lahko to popravi skrbnik vaÅ¡ega sistema . " #: ../glom/mode_design/fields/box_db_table_definition.cc:293 msgid "Primary key required" msgstr "Zahtevan je osnovni kljuÄ" #: ../glom/mode_design/fields/box_db_table_definition.cc:294 msgid "You may not unset the primary key because the table must have a primary key. You may set another field as the primary key instead." msgstr "Osnovnega kljuÄa ni mogoÄe odnastaviti, ker razpredelnica mora imeti osnovni kljuÄ. Namesto tega lahko kot osnovni kljuÄ nastavite drugo polje." #: ../glom/mode_design/fields/box_db_table_definition.cc:306 msgid "Field contains empty values." msgstr "Polje vsebuje prazne vrednosti." #: ../glom/mode_design/fields/box_db_table_definition.cc:306 msgid "The field may not yet be used as a primary key because it contains empty values." msgstr "Polja ni mogoÄe uporabiti kot osnovni kljuÄ, ker vsebuje prazne vrednosti." #: ../glom/mode_design/fields/box_db_table_definition.cc:315 msgid "Field contains non-unique values." msgstr "Polje vsebuje ne-edinstvene vrednosti." #: ../glom/mode_design/fields/box_db_table_definition.cc:315 msgid "The field may not yet be used as a primary key because it contains values that are not unique." msgstr "Polja ni mogoÄe uporabiti kot osnovni kljuÄ, ker vsebuje ne-edinstvene vrednosti." #. Ask the user to confirm this major change: #: ../glom/mode_design/fields/box_db_table_definition.cc:320 msgid "Change primary key" msgstr "Spremeni osnovni kljuÄ" #: ../glom/mode_design/fields/box_db_table_definition.cc:321 msgid "Are you sure that you wish to set this field as the primary key, instead of the existing primary key?" msgstr "Ali ste prepriÄani, da želite nastaviti to polje kot osnovni kljuÄ namesto obstojeÄega osnovnega kljuÄa?" #: ../glom/mode_design/fields/box_db_table_definition.cc:326 msgid "Change Primary Key" msgstr "Spremeni osnovni kljuÄ" #. Warn the user and refuse to make the change: #: ../glom/mode_design/fields/box_db_table_definition.cc:338 msgid "Field Name Already Exists" msgstr "Ime polja že obstaja" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:103 msgid "Calculation Error" msgstr "Napaka izraÄuna" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:103 msgid "The calculation does not have a return statement." msgstr "IzraÄun nima vrnjene izjave." #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:148 msgid "Calculation result" msgstr "Rezultat izraÄuna" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:148 msgid "" "The result of the calculation is:\n" "%1" msgstr "" "Rezultat izraÄuna je:\n" "%1" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:150 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc:140 msgid "Calculation failed" msgstr "IzraÄun je spodletel" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:150 #, c-format msgid "" "The calculation failed with this error:\n" "%s" msgstr "" "IzraÄun je spodletel z napako:\n" "%s" #: ../glom/mode_design/fields/dialog_fielddefinition.cc:159 msgid "Default Value" msgstr "Privzeta vrednost" #. A special "None" item, allowing the user to do the equivalent of clearing the combobox, #. which is not normally possible with the GtkComboBox UI: #. set_property() does not work with a const gchar*, so we explicitly create a ustring. #. otherwise we get this warning: #. " unable to set property `text' of type `gchararray' from value of type `glibmm__CustomPointer_Pc' " #. TODO: Add a template specialization to Glib::ObjectBase::set_property() to allow this? #: ../glom/mode_design/layout/combobox_fields.cc:216 msgid "(None)" msgstr "(Brez)" #: ../glom/mode_design/layout/combobox_relationship.cc:268 msgid " Via: %1::%2" msgstr " Preko: %1::%2" #: ../glom/mode_design/layout/combobox_relationship.cc:272 msgid " Via: %1" msgstr " Preko: %1" #: ../glom/mode_design/layout/dialog_layout_calendar_related.cc:239 #: ../glom/mode_design/layout/dialog_layout_list_related.cc:294 msgid "None: No visible tables are specified by the fields." msgstr "Brez: Polja ne navajajo nobenih vidnih razpredelnic." #. Columns-count column: #. Note to translators: This is the number of columns in a group (group being a noun) #: ../glom/mode_design/layout/dialog_layout_details.cc:129 msgid "Group Columns" msgstr "Å tevilo stolpcev" #. Column-Width column: (only for list views) #. Note to translators: This is a name (the width of a UI element in the display), not an action. #: ../glom/mode_design/layout/dialog_layout_details.cc:142 msgid "Display Width" msgstr "Å irina prikaza" #: ../glom/mode_design/layout/dialog_layout_details.cc:687 msgid "Text Title" msgstr "Naslov besedila" #: ../glom/mode_design/layout/dialog_layout_details.cc:712 msgid "Image Title" msgstr "Naslov slike" #: ../glom/mode_design/layout/dialog_layout_details.cc:867 msgid "group" msgstr "skupina" #: ../glom/mode_design/layout/dialog_layout_details.cc:959 #: ../ui/developer/dialog_notebook.glade.h:1 msgid "Notebook Tabs" msgstr "Zavihki beležke" #: ../glom/mode_design/layout/dialog_layout_details.cc:959 msgid "Add child groups to the notebook to add tabs." msgstr "Za dodajanje zavihkov dodajte v beležko podrejene skupine." #: ../glom/mode_design/layout/dialog_layout_details.cc:1122 msgid "Related Calendar: %1" msgstr "Povezan koledar: %1" #: ../glom/mode_design/layout/dialog_layout_details.cc:1124 msgid "Related List: %1" msgstr "Povezan seznam: %1" #: ../glom/mode_design/layout/dialog_layout_details.cc:1141 msgid "Field: %1" msgstr "Polje: %1" #: ../glom/mode_design/layout/dialog_layout_details.cc:1200 msgid "(Notebook)" msgstr "(Beležka)" #. Append the View columns: #: ../glom/mode_design/layout/dialog_layout_export.cc:55 msgid "Fields" msgstr "Polja" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:406 msgid "Invalid Relationship" msgstr "Neveljavno razmerje" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:407 msgid "The relationship may not be used to show related records because the relationship does not specify a field in the related table." msgstr "Razmerja ni mogoÄe uporabiti za prikaz povezanih zapisov, ker razmerje ne doloÄa polja v povezani razpredelnici." #: ../glom/mode_design/layout/dialog_layout_list_related.cc:413 msgid "Relationship Uses a Related Primary Key" msgstr "Razmerje uporablja povezani osnovni kljuÄ" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:414 msgid "The relationship may not be used to show related records because the relationship uses a primary key field in the related table, which must contain unique values. This would prevent the relationship from specifying multiple related records." msgstr "Razmerja ni mogoÄe uporabiti za prikaz povezanih zapisov, ker razmerje v povezani razpredelnici vsebuje polje osnovnega kljuÄa, ki mora vsebovati edinstvene vrednosti. To razmerju prepreÄi doloÄitev veÄ povezanih zapisov." #: ../glom/mode_design/layout/dialog_layout_list_related.cc:420 msgid "Relationship Uses a Related Unique Field" msgstr "Razmerje uporablja edinstveno povezano polje" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:421 msgid "The relationship may not be used to show related records because the relationship uses a unique-values field in the related table. This would prevent the relationship from specifying multiple related records." msgstr "Razmerja ni mogoÄe uporabiti za prikaz povezanih zapisov, ker razmerje v povezani razpredelnici uporablja polje edinstvenih vrednosti. To razmerju prepreÄi doloÄitev veÄ povezanih zapisov. " #. Translators: This is Automatic text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:115 msgid "Automatic" msgstr "Samodejno" #. Translators: This is Left text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:119 msgid "Left" msgstr "Levo" #. Translators: This is Right text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:123 msgid "Right" msgstr "Desno" #. Give it access to the document. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:166 msgid "Extra Fields" msgstr "Dodatna polja" #. Give it access to the document. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:174 msgid "Sort Order" msgstr "Vrstni red" #. Add labels (because we will hide the checkboxes): #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:201 msgid "Font" msgstr "Pisava" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:204 msgid "Foreground Color" msgstr "Barva ospredja" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:207 msgid "Background Color" msgstr "Barva ozadja" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc:140 msgid "" "The calculation failed with this error:\n" "%1" msgstr "" "IzraÄun je spodletel z napako:\n" "%1" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc:33 #: ../ui/developer/dialog_fieldslist.glade.h:2 #: ../ui/developer/dialog_group_by.glade.h:4 #: ../ui/developer/window_data_layout.glade.h:23 msgid "Formatting" msgstr "Oblikovanje" #. Give it access to the document. #: ../glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc:161 msgid "Group By - Secondary Fields" msgstr "Združi po - dodatnih poljih" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.cc:59 msgid "Ascending" msgstr "NaraÅ¡ÄajoÄe" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #: ../glom/mode_design/report_layout/dialog_layout_report.cc:155 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:206 msgid "Part" msgstr "Del" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/print_layouts/box_print_layouts.cc:98 msgid "This item already exists. Please choose a different item name" msgstr "Ta predmet že obstaja. Izberite drugo ime predmeta" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:226 msgid "Are you sure that you want to rename this print layout?" msgstr "Ali ste prepriÄani, da želite preimenovati postavitev tiskanja?" #. TODO: Show old and new names? #: ../glom/mode_design/print_layouts/box_print_layouts.cc:227 msgid "Rename Print Layout" msgstr "Preimenuj postavitev strani" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:229 #: ../glom/navigation/box_tables.cc:403 msgid "Rename" msgstr "Preimenuj" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:30 #: ../glom/utility_widgets/layouttoolbar.cc:32 msgid "Items" msgstr "Predmeti" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:31 msgid "Lines" msgstr "Vrstice" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:32 msgid "Records" msgstr "Zapisi" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:34 #: ../glom/utility_widgets/layouttoolbar.cc:39 msgid "Database Field" msgstr "Polje podatkovne zbirke" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:34 #: ../glom/utility_widgets/layouttoolbar.cc:39 msgid "Drag this to the layout to add a new database field." msgstr "Vleka tega v razporeditev doda novo polje podatkovne zbirke." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:36 #: ../glom/utility_widgets/layouttoolbar.cc:45 msgid "Drag this to the layout to add a new static text box." msgstr "Vleka tega v razporeditev doda novo statiÄno polje z besedilom." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:38 #: ../glom/utility_widgets/layouttoolbar.cc:47 msgid "Drag this to the layout to add a new static image." msgstr "Vleka tega v razporeditev doda novo statiÄno sliko." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:40 msgid "Horizontal Line" msgstr "Vodoravna vrstica" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:40 msgid "Drag this to the layout to add a new horizontal line." msgstr "Vleka tega v razporeditev doda novo vodoravno vrstico." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:42 msgid "Vertical Line" msgstr "NavpiÄna vrstica" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:42 msgid "Drag this to the layout to add a new vertical line." msgstr "Vleka tega v razporeditev doda novo navpiÄno vrstico." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:44 #: ../glom/utility_widgets/layouttoolbar.cc:41 msgid "Related Records" msgstr "Povezani zapisi" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:44 msgid "Drag this to the layout to add a new related records portal." msgstr "Vleka tega v razporeditev doda nov portal povezanih zapisov." #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:229 msgid "Unselect All" msgstr "Odstrani izbiro vsega" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:232 msgid "_Insert" msgstr "_Vstavi" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:233 msgid "Insert _Field" msgstr "Vstavi _polje" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:235 msgid "Insert _Text" msgstr "Vstavi _besedilo" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:237 msgid "Insert _Image" msgstr "Vstavi _sliko" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:239 msgid "Insert _Related Records" msgstr "Vstavi _povezane zapise" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:241 msgid "Insert _Horizontal Line" msgstr "Vstavi _vodoravno Ärto" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:243 msgid "Insert _Vertical Line" msgstr "Vstavi _navpiÄno Ärto" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:245 msgid "_Create Standard Layout" msgstr "_Ustvari standardno razporeditev" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:247 msgid "_Add Page" msgstr "_Dodaj stran" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:249 msgid "_Delete Page" msgstr "_IzbriÅ¡i stran" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:253 msgid "_Align" msgstr "_Poravnaj" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:255 msgid "Align _Top" msgstr "Poravnaj _zgoraj" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:259 msgid "Align _Bottom" msgstr "Poravnaj _spodaj" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:263 msgid "Align _Left" msgstr "Poravnaj _levo" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:267 msgid "Align _Right" msgstr "Poravnaj _desno" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:272 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:64 msgid "_View" msgstr "_Pogled" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:273 msgid "Show Grid" msgstr "Pokaži mrežo" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:275 msgid "Show Rules" msgstr "Pokaži pravila" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:277 msgid "Show Outlines" msgstr "Pokaži obrise" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:281 msgid "Fit Page _Width" msgstr "Prilagodi Å¡irino _strani" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:285 msgid "Zoom 200%" msgstr "Približaj na 200%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:293 msgid "Zoom 50%" msgstr "Približaj na 50%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:297 msgid "Zoom 25%" msgstr "Približaj na 25%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:753 msgid "Insert" msgstr "Vstavi" #. Ask for confirmation: #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:914 msgid "Create Standard Layout" msgstr "Ustvari standardno razporeditev" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:915 msgid "This is an experimental feature. It will remove all items from the print layout and then try to create a layout similar to the layout of the detail view." msgstr "Ta možnost je preizkusna. Odstranjeni bodo vsi predmeti razporeditve tiskanja, nato pa bo ustvarjena razvrstitev, ki je enaka razvrstitvi v podrobnem pogledu." #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:918 #: ../glom/mode_design/users/dialog_groups_list.cc:82 msgid "Create" msgstr "Ustvari" #. Ask the user to confirm: #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:958 msgid "Remove page" msgstr "Odstrani stran" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:959 msgid "Are you sure that you wish to remove the last page and any items on that page?" msgstr "Ali ste prepriÄani, da želite odstraniti zadnjo stran in vse predmete na njej?" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:962 msgid "Remove Page" msgstr "Odstrani stran" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:59 msgid "Page _Setup" msgstr "Nastavitev _strani" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:65 msgid "Show _Grid" msgstr "Pokaži _mrežo" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:475 msgid "Edit _Fields" msgstr "Uredi _polja" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:478 msgid "Edit _Relationships" msgstr "Uredi _razmerja" #: ../glom/mode_design/script_library/dialog_script_library.cc:130 msgid "Remove library script" msgstr "Odstrani skript knjižnice" #: ../glom/mode_design/script_library/dialog_script_library.cc:131 msgid "Do you really want to delete this script? This data can not be recovered" msgstr "Ali resniÄno želite izbrisati ta skript? Teh podatkov ni mogoÄe povrniti" #: ../glom/mode_design/users/dialog_groups_list.cc:76 msgid "View" msgstr "Pogled" #: ../glom/mode_design/users/dialog_groups_list.cc:79 msgid "Edit" msgstr "Uredi" #: ../glom/mode_design/users/dialog_groups_list.cc:85 #: ../glom/utility_widgets/layoutwidgetmenu.cc:47 #: ../glom/utility_widgets/layoutwidgetutils.cc:37 #: ../glom/utility_widgets/notebooklabelglom.cc:117 msgid "Delete" msgstr "IzbriÅ¡i" #. TODO: Prevent deletion of standard groups #: ../glom/mode_design/users/dialog_groups_list.cc:218 msgid "Delete Group" msgstr "IzbriÅ¡i skupino" #: ../glom/mode_design/users/dialog_groups_list.cc:219 msgid "Are your sure that you wish to delete this group?" msgstr "Ali ste prepriÄani, da želite izbrisati to skupino?" #: ../glom/mode_design/users/dialog_groups_list.cc:361 msgid "Full access." msgstr "Polen dostop." #. Append the View columns: #: ../glom/mode_design/users/dialog_users_list.cc:66 msgctxt "Users List" msgid "User" msgstr "Uporabnik" #: ../glom/mode_design/users/dialog_users_list.cc:161 msgid "Delete User" msgstr "IzbriÅ¡i uporabnika" #: ../glom/mode_design/users/dialog_users_list.cc:162 msgid "Are your sure that you wish to delete this user?" msgstr "Ali ste prepriÄani, da želite izbrisati tega uporabnika?" #: ../glom/mode_design/users/dialog_users_list.cc:187 msgid "Error Retrieving the List of Users" msgstr "Napaka med pridobivanjem seznama uporabnikov" #: ../glom/mode_design/users/dialog_users_list.cc:188 msgid "Glom could not get the list of users from the database server. You probably do not have enough permissions. You should be a superuser." msgstr "Ni mogoÄe pridobiti seznama uporabnikov s strežnika. Najverjetneje ni ustreznih dovoljenje za skrbniÅ¡ka opravila." #: ../glom/mode_design/users/dialog_users_list.cc:412 msgid "Developer group may not be empty." msgstr "Skupina razvijalcev ne sme biti prazna." #: ../glom/mode_design/users/dialog_users_list.cc:413 msgid "The developer group must contain at least one user." msgstr "Skupina razvijalcev mora vsebovati vsaj enega uporabnika." #. Prevent two tables with the same name from being added. #: ../glom/navigation/box_tables.cc:134 msgid "This table already exists. Please choose a different table name" msgstr "Ta razpredelnica že obstaja. Izberite drugo ime razpredelnice" #: ../glom/navigation/box_tables.cc:136 msgid "Hidden" msgstr "Skrito" #. TODO: This should really be a radio, but the use of AddDel makes it awkward to change that CellRenderer property. #: ../glom/navigation/box_tables.cc:140 msgid "Default" msgstr "Privzeto" #. Ask the user if they want us to try to cope with this: #: ../glom/navigation/box_tables.cc:236 msgid "Table Already Exists" msgstr "Razpredelnica že obstaja" #: ../glom/navigation/box_tables.cc:237 msgid "This table already exists on the database server, though it is not mentioned in the .glom file. This should not happen. Would you like Glom to attempt to use the existing table?" msgstr "Ta razpredelnica že obstaja na strežniku podatkovne zbirke, Äeprav ni omenjena v datoteki .glom. To se ne bi smelo zgoditi. Ali želite, da program Glom poskusi uporabiti obstojeÄo razpredelnico?" #. TODO: Do not show tables that are not in the document. #: ../glom/navigation/box_tables.cc:297 msgid "You cannot delete this table, because there is no information about this table in the document." msgstr "Te razpredelnice ni mogoÄe izbrisati, ker v dokumentu ni podatkov o tej razpredelnici." #. Ask the user to confirm: #: ../glom/navigation/box_tables.cc:304 msgid "" "Are you sure that you want to delete this table?\n" "Table name: %1" msgstr "" "Ali ste prepriÄani, da želite izbrisati to razpredelnico?\n" "Razpredelnica: %1" #: ../glom/navigation/box_tables.cc:305 msgid "Delete Table" msgstr "IzbriÅ¡i razpredelnico" #: ../glom/navigation/box_tables.cc:400 msgid "Are you sure that you want to rename this table?" msgstr "Ali ste prepriÄani, da želite preimenovati to razpredelnico?" #. TODO: Show old and new names? #: ../glom/navigation/box_tables.cc:401 msgid "Rename Table" msgstr "Preimenuj razpredelnico" #: ../glom/navigation/box_tables.cc:443 msgid "Unknown Table" msgstr "Neznana razpredelnica" #: ../glom/navigation/box_tables.cc:444 msgid "You cannot open this table, because there is no information about this table in the document." msgstr "Te razpredelnice ni mogoÄe odpreti, ker v dokumentu ni podatkov o tej razpredelnici." #: ../glom/print_layout/canvas_layout_item.cc:263 #: ../glom/utility_widgets/layoutwidgetmenu.cc:39 msgid "Choose Field" msgstr "Izbor polja" #: ../glom/print_layout/canvas_print_layout.cc:285 msgid "_Formatting" msgstr "_Oblikovanje" #. Append the View columns: #: ../glom/mode_design/translation/window_translations.cc:66 msgid "Original" msgstr "Izvirnik" #: ../glom/mode_design/translation/window_translations.cc:73 msgid "Translation" msgstr "Prevod" #. This is at the end, because it can contain a long description of the item's context. #: ../glom/mode_design/translation/window_translations.cc:79 msgid "Item" msgstr "Predmet" #. Show the file-chooser dialog, to select an output .po file: #: ../glom/mode_design/translation/window_translations.cc:332 #: ../glom/mode_design/translation/window_translations.cc:372 msgid "Choose .po File Name" msgstr "Izberite ime datoteke .po" #: ../glom/mode_design/translation/window_translations.cc:338 #: ../glom/mode_design/translation/window_translations.cc:377 msgid "Po files" msgstr "Datoteke po" #: ../glom/mode_design/translation/window_translations.cc:343 #: ../ui/developer/window_translations.glade.h:7 msgid "Export" msgstr "Izvozi" #. Note to translators: "Import" here is an action verb - it's a button. #: ../glom/mode_design/translation/window_translations.cc:384 #: ../ui/developer/window_translations.glade.h:6 msgid "Import" msgstr "Uvoz" #: ../glom/utility_widgets/adddel/adddel.cc:157 msgid "This item already exists. Please try again." msgstr "Ta predmet že obstaja. Poskusite znova." #. Something more specific and helpful. #: ../glom/utility_widgets/adddel/adddel.cc:161 msgid "Duplicate" msgstr "Podvoji" #. Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. #: ../glom/mode_data/datawidget/combochoiceswithtreemodel.cc:477 msgid "Example" msgstr "Primer" #. The GNOME HIG says that labels should have ":" at the end: #. http://library.gnome.org/devel/hig-book/stable/design-text-labels.html.en #: ../glom/mode_data/datawidget/datawidget.cc:74 msgid "%1:" msgstr "%1:" #. Let the user choose a date from a calendar dialog: #: ../glom/mode_data/datawidget/datawidget.cc:213 msgid "..." msgstr "..." #. TODO: A better label/icon for "Choose Date". #: ../glom/mode_data/datawidget/datawidget.cc:214 msgid "Choose a date from an on-screen calendar." msgstr "Izbor datuma na zaslonskem koledarju." #: ../glom/mode_data/datawidget/datawidget.cc:224 msgid "Open the record identified by this ID, in the other table." msgstr "Odpre zapis doloÄen s tem ID v drugi razpredelnici." #: ../glom/mode_data/datawidget/datawidget.cc:234 msgid "Enter search criteria to identify records in the other table, to choose an ID for this field." msgstr "Vnesite kriterije iskanja za doloÄitev zapisov v drugi razpredelnici za izbor ID tega polja." #: ../glom/mode_data/datawidget/datawidget.cc:239 msgid "Enter details for a new record in the other table, then use its ID for this field." msgstr "Vnesite podrobnosti novega zapisa v drugi razpredelnici za izbor ID tega polja." #: ../glom/mode_data/db_adddel/db_adddel.cc:78 msgid "Table Content" msgstr "Vsebina razpredelnice" #. Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. #: ../glom/mode_data/db_adddel/db_adddel.cc:564 msgid "ExampleEg" msgstr "Primer" #: ../glom/mode_data/db_adddel/db_adddel.cc:2092 msgid "Right-click to layout, to specify the related fields." msgstr "Za doloÄitev povezanih polj desno kliknite na razporeditev." #. Tell user that they can't do that: #: ../glom/mode_data/db_adddel/db_adddel.cc:2309 msgid "Extra Related Records Not Possible" msgstr "Dodatni povezani zapisi niso mogoÄi" #: ../glom/mode_data/db_adddel/db_adddel.cc:2310 msgid "You attempted to add a new related record, but there can only be one related record, because the relationship uses a unique key." msgstr "Poskusili ste dodati nov povezan zapis, toda obstaja lahko le en povezan zapis, ker razmerje uporablja edinstven kljuÄ." #: ../glom/mode_data/datawidget/dialog_choose_id.cc:90 #: ../glom/utility_widgets/imageglom.cc:774 #: ../ui/developer/dialog_choose_relationship.glade.h:4 #: ../ui/developer/dialog_field_summary.glade.h:3 #: ../ui/developer/dialog_group_by.glade.h:3 msgid "Select" msgstr "Izberi" #: ../glom/mode_data/datawidget/dialog_choose_id.cc:107 msgid "You have not entered any quick find criteria." msgstr "Niste vnesli kriterijev za hitro iskanje." #: ../glom/utility_widgets/dialog_image_load_progress.cc:105 msgid "Not enough memory available to load the image" msgstr "Na voljo ni dovolj pomnilnika za nalaganje slike" #: ../glom/utility_widgets/dialog_image_load_progress.cc:157 msgid "Error loading %1" msgstr "Napaka nalaganja %1" #: ../glom/utility_widgets/dialog_image_load_progress.cc:158 msgid "Error loading image" msgstr "Napaka nalaganja slike" #: ../glom/utility_widgets/dialog_image_save_progress.cc:135 msgid "Error Saving" msgstr "Napaka med shranjevanjem" #: ../glom/utility_widgets/dialog_image_save_progress.cc:136 msgid "Error saving image" msgstr "Napaka med shranjevanjem slike" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:82 msgid "New Database" msgstr "Nova podatkovna zbirka" #. For instance, an extra hint when saving from an example, saying that a new file must be saved. #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:99 msgid "Please choose a human-readable title for the new database. You can change this later in the database properties. It may contain any characters." msgstr "Izberite Äloveku berljiv naslov za novo podatkovno zbirko. To lahko spremenite kasneje v lastnostih podatkovne zbirke. Lahko vsebuje katerekoli znake." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:105 #: ../ui/developer/window_field_definition_edit.glade.h:4 #: ../ui/developer/window_report_layout.glade.h:7 msgid "_Title:" msgstr "_Naslov:" #. Use titles that show the distinction between PostgreSQL and SQLite: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:121 msgid "Create PostgreSQL database in its own folder, to be hosted by this computer." msgstr "Ustvari podatkovno zbirko PostgreSQL v svoji mapi na tem raÄunalniku." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:125 msgid "Create database on an external PostgreSQL database server, to be specified in the next step." msgstr "Ustvari podatkovno zbirko na zunanjem strežniku podatkovne zbirke PostgreSQL, ki bo naveden v naslednjem koraku." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:131 msgid "Create SQLite database in its own folder, to be hosted by this computer." msgstr "Ustvari podatkovno zbirko SQLite v svoji mapi na tem raÄunalniku." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:132 msgid "SQLite does not support authentication or remote access but is suitable for embedded devices." msgstr "SQLite ne podpira overitve ali oddaljenega dostopa, vendar je primeren za vstavljene naprave." #. TODO: Hide this because it's the only radio button, so it's not a choice: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:142 msgid "Create database in its own folder, to be hosted by this computer, using SQLite" msgstr "Ustvari podatkovno zbirko v svoji lastni mapi na tem raÄunalniku z uporabo SQLite" #. Only PostgreSQL: #. Use titles that don't mention the boring name of the backend: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:151 msgid "Create database in its own folder, to be hosted by this computer." msgstr "Ustvari podatkovno zbirko v svoji lastni mapi na tem raÄunalniku." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:155 msgid "Create database on an external database server, to be specified in the next step." msgstr "Ustvari podatkovno zbirko na zunanjem strežniku podatkovne zbirke, ki bo naveden v naslednjem koraku." #: ../glom/utility_widgets/imageglom.cc:659 msgid "Images" msgstr "Slike" #: ../glom/utility_widgets/imageglom.cc:680 msgid "Save Image" msgstr "Shrani sliko" #: ../glom/utility_widgets/imageglom.cc:767 msgid "Choose Image" msgstr "Izbor slike" #: ../glom/utility_widgets/imageglom.cc:929 msgid "Open With" msgstr "Odpri z" #: ../glom/utility_widgets/imageglom.cc:931 msgid "Choose File" msgstr "Izbor datoteke" #: ../glom/utility_widgets/layouttoolbar.cc:33 msgid "Containers" msgstr "Zabojniki" #: ../glom/utility_widgets/layouttoolbar.cc:35 msgid "Drag this to the layout to add a new group." msgstr "Vleka tega v razporeditev doda novo skupino." #: ../glom/utility_widgets/layouttoolbar.cc:37 msgid "Drag this to the layout to add a new notebook." msgstr "Vleka tega v razporeditev doda novo beležko." #: ../glom/utility_widgets/layouttoolbar.cc:41 msgid "Drag this to the layout to add a new Related Record." msgstr "Vleka tega v razporeditev doda nov povezan zapis." #: ../glom/utility_widgets/layouttoolbar.cc:43 msgid "Drag this to the layout to add a new button." msgstr "Vleka tega v razporeditev doda nov gumb." #: ../glom/utility_widgets/layoutwidgetmenu.cc:40 msgid "Field Layout Properties" msgstr "Lastnosti razporeditve polja" #: ../glom/utility_widgets/layoutwidgetmenu.cc:41 #: ../ui/developer/window_data_layout.glade.h:8 msgid "Add Field" msgstr "Dodaj polje" #: ../glom/utility_widgets/layoutwidgetmenu.cc:42 #: ../ui/developer/window_data_layout.glade.h:19 msgid "Add Related Records" msgstr "Dodaj povezane zapise" #: ../glom/utility_widgets/layoutwidgetmenu.cc:43 #: ../ui/developer/window_data_layout.glade.h:17 msgid "Add Notebook" msgstr "Dodaj beležko" #: ../glom/utility_widgets/layoutwidgetmenu.cc:44 msgid "Add Group" msgstr "Dodaj skupino" #: ../glom/utility_widgets/layoutwidgetmenu.cc:45 #: ../ui/developer/window_data_layout.glade.h:13 msgid "Add Button" msgstr "Dodaj gumb" #: ../glom/utility_widgets/layoutwidgetmenu.cc:46 #: ../ui/developer/window_data_layout.glade.h:10 msgid "Add Text" msgstr "Dodaj besedilo" #: ../glom/utility_widgets/layoutwidgetutils.cc:36 msgid "Properties" msgstr "Lastnosti" #: ../glom/utility_widgets/notebooklabelglom.cc:90 msgid "Delete whole notebook \"%1\"?" msgstr "Izbris celotne beležnice \"%1\"?" #: ../glom/utility_widgets/notebooklabelglom.cc:95 msgid "Delete whole notebook?" msgstr "Izbris celotne beležnice?" #: ../ui/operator/box_navigation_tables.glade.h:2 msgid "_Show hidden tables" msgstr "_Pokaži skrite razpredelnice" #: ../ui/operator/dialog_choose_date.glade.h:1 msgid "Choose Date" msgstr "Izbor datuma" #: ../ui/operator/dialog_choose_date.glade.h:2 msgid "" "Choose Date\n" "\n" "Please select a date to enter in this field." msgstr "" "Izbor datuma\n" "\n" "Izberite datum za vnos v to polje." #: ../ui/operator/dialog_connection.glade.h:1 msgid "Connect to Server" msgstr "Poveži se s strežnikom" #: ../ui/operator/dialog_connection.glade.h:2 msgid "Please enter the connection details for your database server." msgstr "Vnesite podrobnosti povezave za vaÅ¡ strežnik podatkovne zbirke." #: ../ui/operator/dialog_connection.glade.h:3 msgid "Host" msgstr "Gostitelj" #: ../ui/operator/dialog_connection.glade.h:4 msgid "Password" msgstr "Geslo" #: ../ui/operator/dialog_connection.glade.h:5 #: ../ui/developer/dialog_choose_user.glade.h:5 #: ../ui/developer/dialog_user.glade.h:1 msgid "User" msgstr "Uporabnik" #: ../ui/operator/dialog_connection.glade.h:6 msgid "_Host:" msgstr "_Gostitelj:" #: ../ui/operator/dialog_connection.glade.h:7 msgid "Database:" msgstr "Podatkovna zbirka:" #: ../ui/operator/dialog_connection.glade.h:8 #: ../ui/developer/dialog_initial_password.glade.h:3 msgid "_User:" msgstr "_Uporabnik:" #: ../ui/operator/dialog_connection.glade.h:9 #: ../ui/developer/dialog_initial_password.glade.h:4 msgid "_Password:" msgstr "_Geslo:" #: ../ui/operator/dialog_connection.glade.h:10 msgid "Database" msgstr "Podatkovna zbirka" #: ../ui/operator/dialog_data_invalid_format.glade.h:1 msgid "" "Invalid format\n" "\n" "The data in the field was not recognized. Please try to correct the data or revert to the previous value. Here is an example of correctly-formatted data for this field.\n" msgstr "" "Neveljavna oblika\n" "\n" "Podatki v polju niso bili prepoznani. Poskusite popraviti podatke ali se povrnite na predhodno vrednost. Tukaj je primer pravilno oblikovanih podatkov za to polje.\n" #: ../ui/operator/dialog_data_invalid_format.glade.h:5 msgid "example data format" msgstr "primer oblike podatkov" #: ../ui/operator/dialog_existing_or_new.glade.h:1 msgid "Welcome to Glom" msgstr "DobrodoÅ¡li v Glom" #: ../ui/operator/dialog_existing_or_new.glade.h:2 #: ../ui/developer/dialog_choose_field.glade.h:2 msgid "_Select" msgstr "_Izberi" #: ../ui/operator/dialog_existing_or_new.glade.h:3 msgid "Open or create a Document" msgstr "Odpiranje ali ustvarjanje dokumenta" #: ../ui/operator/dialog_existing_or_new.glade.h:4 msgid "Open or create Document" msgstr "Odpre ali ustvari dokument" #: ../ui/operator/dialog_existing_or_new.glade.h:5 msgid "Open Existing Document" msgstr "Odpre obstojeÄi dokument" #: ../ui/operator/dialog_existing_or_new.glade.h:6 msgid "Create New Document" msgstr "Ustvari nov dokument" #: ../ui/operator/dialog_find_id.glade.h:1 #: ../ui/operator/dialog_new_record.glade.h:1 msgid "Find Related Record" msgstr "Najdi povezan zapis" #: ../ui/operator/dialog_find_id.glade.h:2 #: ../ui/operator/dialog_new_record.glade.h:2 #: ../ui/developer/window_data_layout_export.glade.h:2 #: ../ui/developer/window_data_layout.glade.h:2 #: ../ui/developer/window_design.glade.h:2 #: ../ui/developer/window_report_layout.glade.h:2 msgid "Table:" msgstr "Razpredelnica:" #: ../ui/operator/dialog_find_id.glade.h:3 #: ../ui/operator/dialog_new_record.glade.h:3 msgid "table_name" msgstr "ime_razpredelnice" #: ../ui/operator/dialog_image_load_progress.glade.h:1 msgid "Loading image" msgstr "Nalaganje slike" #: ../ui/operator/dialog_image_save_progress.glade.h:1 msgid "Saving Image" msgstr "Shranjevanje slike" #: ../ui/operator/dialog_import_csv.glade.h:1 msgid "bla.blub - Import from CSV" msgstr "bla.blub - Izvozi iz CSV" #: ../ui/operator/dialog_import_csv.glade.h:3 #: ../ui/developer/box_formatting.glade.h:20 msgid "label" msgstr "oznaka" #: ../ui/operator/dialog_import_csv.glade.h:4 msgid "_First line as title" msgstr "_Prva vrstica kot naslov" #: ../ui/operator/dialog_import_csv.glade.h:5 msgid "_Encoding:" msgstr "_Kodiranje:" #: ../ui/operator/dialog_import_csv.glade.h:6 msgid "Import Into _Table:" msgstr "Uvozi v _razpredelnico:" #: ../ui/operator/dialog_import_csv.glade.h:7 msgid "Encoding detected as: UTF-8" msgstr "Kodiranje je zaznano kot: UTF-8" #. Import is a noun here. This is the title for a window showing options for an import operation. #: ../ui/operator/dialog_import_csv.glade.h:9 msgid "Import Options" msgstr "Možnosti uvoza" #: ../ui/operator/dialog_import_csv.glade.h:10 msgid "_Number of sample rows:" msgstr "_Å tevilo vrstic vzorca:" #. Import is a noun here. This is the title for a list of fields to import. #: ../ui/operator/dialog_import_csv.glade.h:12 msgid "Import Fields" msgstr "Polja uvoza" #. This is a status message for a progress dialog. It says that importing is currently happenning. #: ../ui/operator/dialog_import_csv_progress.glade.h:2 msgid "Importing Data" msgstr "Uvažanje podatkov" #: ../ui/operator/dialog_import_csv_progress.glade.h:3 msgid "Please wait while your data is imported." msgstr "PoÄakajte, medtem ko se vaÅ¡i podatki uvažajo." #: ../ui/developer/dialog_add_related_table.glade.h:1 msgid "Add Related Table" msgstr "Dodaj povezano razpredelnico" #: ../ui/developer/dialog_add_related_table.glade.h:2 msgid "" "This will add a new table and add a relationship that refers to the new table, as a convenient alternative to doing this in separate steps.\n" "\n" "If a suitable related table already exists then you should instead cancel and just add a relationship." msgstr "" "To bo dodalo novo razpredelnico in dodalo razmerje, ki se nanaÅ¡a na novo razpredelnico, kar je priroÄna dodatna možnost izvedbi tega v veÄ korakih.\n" "\n" "V primeru da primerna povezana razpredelnica že obstaja, prekliÄite dejanje in dodajte le razmerje. " #. Translators: FROM as in SQL's FROM #: ../ui/developer/dialog_add_related_table.glade.h:6 msgid "From field:" msgstr "Polje od:" #: ../ui/developer/dialog_add_related_table.glade.h:7 msgid "Name of new related table:" msgstr "Ime nove povezane razpredelnice:" #: ../ui/developer/dialog_add_related_table.glade.h:8 msgid "Name of new relationship:" msgstr "Ime novega razmerja:" #: ../ui/developer/dialog_change_language.glade.h:1 msgid "Test Translation" msgstr "Preizkus prevoda" #: ../ui/developer/dialog_change_language.glade.h:2 msgid "" "Test Translation\n" "\n" "Choose a language to use temporarily to test the translations. These translations are normally used automatically when the application is started on a computer that uses the language.\n" "\n" "Note that the standard parts of the Glom user interface, such as menus and dialog windows, will only be translated when you start Glom on a computer that uses that language." msgstr "" "Preizkus prevoda\n" "\n" "Izberite zaÄasni jezik za preskus prevodov. Ti prevodi so obiÄajno uporabljeni samodejno, ko je program zagnan na raÄunalniku, ki uporablja ta jezik.\n" "\n" "ObiÄajni deli uporabniÅ¡kega vmesnika Glom, kot so meniji in pogovorna okna bodo prevedeni ob zagonu Gloma na raÄunalniku, ki uporablja ta jezik." #: ../ui/developer/dialog_change_language.glade.h:7 msgid "Locale:" msgstr "Jezikovna oznaka:" #: ../ui/developer/dialog_choose_field.glade.h:1 msgid "Select Field" msgstr "Izberi polje" #: ../ui/developer/dialog_choose_field.glade.h:3 msgid "Show _Related Relationships" msgstr "Pokaži _povezana razmerja" #: ../ui/developer/dialog_choose_field.glade.h:4 msgid "_Table:" msgstr "_Razpredelnica:" #: ../ui/developer/dialog_choose_relationship.glade.h:1 msgid "Select Relationship" msgstr "Izberi razmerje" #: ../ui/developer/dialog_choose_relationship.glade.h:2 msgid "Table:" msgstr "Razpredelnica:" #: ../ui/developer/dialog_choose_relationship.glade.h:3 msgid "Select Relationship" msgstr "Izbor razmerja" #: ../ui/developer/dialog_choose_user.glade.h:1 msgid "Choose User" msgstr "Izbor uporabnika" #: ../ui/developer/dialog_choose_user.glade.h:2 msgid "" "Add User To Group\n" "\n" "Which user should be added to this group?" msgstr "" "Dodajanje uporabnika v skupino\n" "\n" "Kateri uporabnik naj bo dodan v to skupino?" #: ../ui/developer/dialog_database_preferences.glade.h:1 msgid "Database Preferences" msgstr "Možnosti podatkovne zbirke" #: ../ui/developer/dialog_database_preferences.glade.h:2 msgid "System Name:" msgstr "Ime sistema:" #: ../ui/developer/dialog_database_preferences.glade.h:3 msgid "Name:" msgstr "Ime:" #: ../ui/developer/dialog_database_preferences.glade.h:4 msgid "Country:" msgstr "Država:" #: ../ui/developer/dialog_database_preferences.glade.h:5 msgid "Zip/Postal Code:" msgstr "PoÅ¡tna Å¡tevilka: " #: ../ui/developer/dialog_database_preferences.glade.h:6 msgid "State/County:" msgstr "Regija:" #: ../ui/developer/dialog_database_preferences.glade.h:7 msgid "Town:" msgstr "Mesto:" #: ../ui/developer/dialog_database_preferences.glade.h:8 msgid "Street (Line 2):" msgstr "Ulica (druga vrstica):" #: ../ui/developer/dialog_database_preferences.glade.h:9 msgid "Street:" msgstr "Ulica:" #: ../ui/developer/dialog_database_preferences.glade.h:10 msgid "Address" msgstr "Naslov" #: ../ui/developer/dialog_database_preferences.glade.h:11 msgid "Organisation" msgstr "Organizacija" #: ../ui/developer/dialog_database_preferences.glade.h:12 msgid "Logo" msgstr "Logotip" #: ../ui/developer/dialog_database_preferences.glade.h:13 msgid "Auto-increment values" msgstr "Samodejno poveÄujoÄe vrednosti" #: ../ui/developer/dialog_database_preferences.glade.h:14 msgid "When the database is opened the python function implemented here will run." msgstr "Ko bi podatkovna zbirka odprta, bo zagnana tukaj podprta zmožnost python." #: ../ui/developer/dialog_database_preferences.glade.h:15 #: ../ui/developer/window_button_script.glade.h:4 #: ../ui/developer/window_field_calculation.glade.h:3 msgid "Test" msgstr "Preizkus" #: ../ui/developer/dialog_database_preferences.glade.h:16 msgid "Startup Script" msgstr "ZaÄetni skript" #: ../ui/developer/dialog_error_create_database.glade.h:1 msgid "" "Database creation failed\n" "\n" "Glom could not create the new database. Maybe you do not have the necessary access rights. Please contact your system administrator." msgstr "" "Ustvarjanje podatkovne zbirke je spodletelo\n" "\n" "S programom ni mogoÄe ustvariti nove podatkovne zbirke. Morda nimate zahtevanih pravic dostopa. Stopite v stik s skrbnikom sistema." #: ../ui/developer/dialog_fieldslist.glade.h:1 #: ../ui/developer/dialog_sort_fields.glade.h:2 msgid "Table: " msgstr "Razpredelnica: " #: ../ui/developer/dialog_fieldslist.glade.h:3 #: ../ui/developer/window_data_layout.glade.h:24 msgid "Fields" msgstr "Polja" #: ../ui/developer/dialog_field_summary.glade.h:2 #: ../ui/developer/dialog_group_by.glade.h:2 #: ../ui/developer/box_formatting.glade.h:22 msgid "Field:" msgstr "Polje:" #: ../ui/developer/dialog_field_summary.glade.h:4 msgid "Summary Type:" msgstr "Vrsta povzetka:" #: ../ui/developer/dialog_field_summary.glade.h:5 msgid "Summary Field" msgstr "Polje povzetka" #: ../ui/developer/dialog_flowtable.glade.h:1 msgid "Group Properties" msgstr "Lastnosti skupine" #: ../ui/developer/dialog_flowtable.glade.h:2 msgid "Columns:" msgstr "Stolpci:" #: ../ui/developer/dialog_flowtable.glade.h:3 #: ../ui/developer/window_print_layout_edit.glade.h:4 msgid "Title:" msgstr "Naslov:" #: ../ui/developer/dialog_group_by.glade.h:5 msgid "Sort Fields:" msgstr "Razvrsti polja:" #: ../ui/developer/dialog_group_by.glade.h:6 msgid "Secondary Fields:" msgstr "Drugotna polja:" #: ../ui/developer/dialog_group_by.glade.h:7 msgid "Border Width (ems)" msgstr "Å irina robu (ems)" #: ../ui/developer/dialog_group_by.glade.h:8 msgid "Group By" msgstr "Združi po" #: ../ui/developer/dialog_initial_password.glade.h:1 msgid "Database User" msgstr "Uporabnik podatkovne zbirke" #: ../ui/developer/dialog_initial_password.glade.h:2 msgid "Please enter the initial connection details for your database. You may add additional users later. Remember to keep this password secret because it allows access to your data from other computers on the network." msgstr "Vnesite zaÄetne podrobnosti povezave za svojo podatkovno zbirko. Dodatne uporabnike lahko dodate pozneje. Obdržite geslo skrito, saj dovoli dostop do vaÅ¡ih podatkov z ostalih raÄunalnikov na omrežju." #: ../ui/developer/dialog_initial_password.glade.h:5 msgid "_Confirm Password:" msgstr "_Potrdi geslo:" #: ../ui/developer/dialog_initial_password.glade.h:6 #: ../ui/developer/dialog_new_group.glade.h:2 #: ../ui/developer/dialog_new_library_script.glade.h:2 msgid "C_reate" msgstr "U_stvari" #: ../ui/developer/dialog_line.glade.h:1 #: ../ui/developer/window_textobject.glade.h:1 msgid "Text Object" msgstr "Predmet besedila" #: ../ui/developer/dialog_line.glade.h:2 msgid "Line Width:" msgstr "Å irina Ärte:" #: ../ui/developer/dialog_line.glade.h:3 msgid "Color:" msgstr "Barva:" #: ../ui/developer/dialog_layout_field_properties.glade.h:1 msgid "Field Layout" msgstr "Razporeditev polja" #: ../ui/developer/dialog_layout_field_properties.glade.h:2 msgid "Field:" msgstr "Polje:" #: ../ui/developer/dialog_layout_field_properties.glade.h:4 msgid "Use default field title: " msgstr "Uporabi privzet naslov polja:" #: ../ui/developer/dialog_layout_field_properties.glade.h:5 msgid "Use custom title:" msgstr "Uporabi naslov po meri:" #: ../ui/developer/dialog_layout_field_properties.glade.h:6 msgid "Title" msgstr "Naslov" #: ../ui/developer/dialog_layout_field_properties.glade.h:7 msgid "Use default formatting" msgstr "Uporabi privzeto oblikovanje" #: ../ui/developer/dialog_layout_field_properties.glade.h:8 msgid "Use custom formatting" msgstr "Uporabi oblikovanje po meri" #: ../ui/developer/dialog_layout_field_properties.glade.h:9 msgid "Formatting" msgstr "Oblikovanje" #: ../ui/developer/dialog_new_group.glade.h:1 #: ../ui/developer/dialog_new_library_script.glade.h:1 msgid "Create Group" msgstr "Ustvari skupino" #: ../ui/developer/dialog_new_group.glade.h:3 msgid "" "Create Group\n" "\n" "What name should this group have?" msgstr "" "Ustvarjanje skupine\n" "\n" "KakÅ¡no ime naj ima ta skupina?" #: ../ui/developer/dialog_new_group.glade.h:6 msgid "Group name:" msgstr "Ime skupine:" #: ../ui/developer/dialog_new_library_script.glade.h:3 msgid "" "Add Module\n" "\n" "What name should this module have?" msgstr "" "Dodajanje modula\n" "\n" "KakÅ¡no ime naj ima ta modul?" #: ../ui/developer/dialog_new_library_script.glade.h:6 msgid "Script name:" msgstr "Ime skripta:" #: ../ui/developer/dialog_notebook.glade.h:2 msgid "Notebook Tabs" msgstr "Zavihki beležke" #: ../ui/developer/dialog_relationships_overview.glade.h:1 msgid "Relationships Overview" msgstr "Pregled razmerij" #: ../ui/developer/dialog_script_library.glade.h:1 msgid "Script Library" msgstr "Knjižnica skriptov" #: ../ui/developer/dialog_script_library.glade.h:2 msgid "These modules will be available to your button scripts and field calculations via the python import keyword." msgstr "Ti moduli bodo na voljo vaÅ¡im gumbom skript in izraÄunom polja preko uvožene kljuÄne besede pyhton." #: ../ui/developer/dialog_script_library.glade.h:3 msgid "Module name:" msgstr "Ime modula:" #. Translators: This is the verb. It is for checking that a Python script works. #: ../ui/developer/dialog_script_library.glade.h:5 msgid "_Check" msgstr "_Preveri" #: ../ui/developer/dialog_sort_fields.glade.h:1 msgid "Group By - Sort Fields" msgstr "Združi po - poljih razvrÅ¡Äanja" #: ../ui/developer/dialog_sort_fields.glade.h:3 msgid "Sort Fields" msgstr "Razvrsti polja" #: ../ui/developer/dialog_translation_copy.glade.h:1 #: ../ui/developer/dialog_translation_identify_original.glade.h:1 msgid "Identify Original" msgstr "DoloÄi izvirnik" #: ../ui/developer/dialog_translation_copy.glade.h:2 msgid "" "Copy Translation\n" "\n" "From what language would you like to copy the translations to use as the start of the current translation?" msgstr "" "Kopiranje prevoda\n" "\n" "Iz katerega jezika želite kopirati prevode, ki bodo uporabljeni kot zaÄetek trenutnega prevoda?" #: ../ui/developer/dialog_translation_copy.glade.h:5 #: ../ui/developer/dialog_translation_identify_original.glade.h:7 msgid "Language:" msgstr "Jezik:" #: ../ui/developer/dialog_translation_identify_original.glade.h:2 msgid "" "Identify Original\n" "\n" "The language of the original text is currently identified as:" msgstr "" "DoloÄi izvirni jezik\n" "\n" "Jezik izvirnega besedila je trenutno doloÄen kot:" #: ../ui/developer/dialog_translation_identify_original.glade.h:5 msgid "English" msgstr "angleÅ¡Äina" #: ../ui/developer/dialog_translation_identify_original.glade.h:6 msgid "If the text is not actually in this language, please choose the correct language." msgstr "V primeru da besedilo ni v tem jeziku, izberite pravilnega." #: ../ui/developer/dialog_user.glade.h:2 msgid "Group:" msgstr "Skupina:" #: ../ui/developer/dialog_user.glade.h:3 msgid "Password:" msgstr "Geslo:" #: ../ui/developer/dialog_user.glade.h:4 msgid "Confirm Password:" msgstr "Potrdite geslo:" #: ../ui/developer/dialog_user.glade.h:5 msgid "User:" msgstr "Uporabnik:" #: ../ui/developer/dialog_user.glade.h:6 msgid "User" msgstr "Uporabnik" #: ../ui/developer/window_button_script.glade.h:1 msgid "Button Script" msgstr "Skript gumba" #: ../ui/developer/window_button_script.glade.h:2 #: ../ui/developer/window_data_layout.glade.h:6 #: ../ui/developer/window_imageobject.glade.h:2 #: ../ui/developer/window_textobject.glade.h:2 msgid "Title:" msgstr "Naslov:" #: ../ui/developer/window_button_script.glade.h:3 msgid "When the button is clicked it will run the python function which you implement here." msgstr "Ko je gumb kliknjen, zažene tukaj podprto zmožnost python." #: ../ui/developer/window_data_layout_export.glade.h:1 msgid "Export Format" msgstr "Oblika zapisa za izvoz" #: ../ui/developer/window_data_layout.glade.h:3 #: ../ui/developer/window_report_layout.glade.h:3 msgid "table name" msgstr "ime razpredelnice" #: ../ui/developer/window_data_layout.glade.h:4 msgid "Relationship:" msgstr "Razmerje:" #: ../ui/developer/window_data_layout.glade.h:5 msgid "Show child relationships" msgstr "Pokaže podrejena razmerja" #: ../ui/developer/window_data_layout.glade.h:7 msgid "Add a layout item that shows the data from a field in the record, and allows the user to edit that value." msgstr "Dodajanje predmeta razporeditve, ki pokaže podatke iz polja v zapisu in uporabniku dovoli urejanje te vrednosti." #: ../ui/developer/window_data_layout.glade.h:9 msgid "Add text to a layout, such as an explanation or a warning. The text will be the same for every record viewed." msgstr "Doda besedilo v razporeditev, kot sta na primer razlaga ali opozorilo. Besedilo bo enako za vsak ogledan zapis." #: ../ui/developer/window_data_layout.glade.h:11 msgid "Add an image to the layout, such as a logo. The image will be the same for every record viewed. To show an image field from a record, to show different images for each field, use the field layout item." msgstr "Doda sliko razporeditvi, kot je na primer logotip. Ta slika bo enaka za vsak ogledan zapis. Za prikaz polja slike iz zapisa in za prikaz razliÄnih slik za vsako polje uporabite predmet razporeditve polja." #: ../ui/developer/window_data_layout.glade.h:12 msgid "Add a button. Edit the button to define the script that will be run when the button is clicked." msgstr "Dodajanje gumba. Uredite gumb za doloÄitev skripta, ki to tekel ob kliku na gumb." #: ../ui/developer/window_data_layout.glade.h:14 msgid "Add a group which can contain other layout items. Use this to group items together, such as fields." msgstr "Dodajanje skupine, ki lahko vsebuje druge predmete razporeditve. To uporabite za združevanje predmetov, kot so polja, skupaj." #: ../ui/developer/window_data_layout.glade.h:15 msgid "Add _Group" msgstr "Dodaj _skupino" #: ../ui/developer/window_data_layout.glade.h:16 msgid "Add a tabbed notebook. Each page of the notebook may contain several other layout items, but only one page will be visible at one time." msgstr "Doda beležko z zavihki. Vsaka stran beležke lahko vsebuje veÄ drugih predmetov razporeditev, toda naenkrat bo vidna samo ena stran." #: ../ui/developer/window_data_layout.glade.h:18 msgid "Add a related records portal. This is a list of records in a related table. Remember to edit this layout item to specify the relationship to use, and the fields to show from the related table." msgstr "Doda portal povezanih zapisov. To je seznam zapisov v povezani razpredelnici. Ne pozabite urediti tega predmeta razporeditve za doloÄitev razmerja za uporabo, in polj za prikaz iz povezane razpredelnice." #: ../ui/developer/window_data_layout.glade.h:20 msgid "Add a related records calendar portal. This is a calendar showing records from a related table. Remember to edit this layout item to specify the relationship to use, and the fields to show from the related table." msgstr "Doda portal povezanega koledarja. To je koledar, ki prikaže zapise iz povezane razpredelnice. Ne pozabite urediti tega predmeta razporeditve za doloÄitev razmerja za uporabo, in polj za prikaz iz povezane razpredelnice." #: ../ui/developer/window_data_layout.glade.h:21 msgid "Add Related Calendar" msgstr "Dodaj povezan koledar" #: ../ui/developer/window_data_layout.glade.h:22 msgid "Remove the item from the layout. If you remove a field layout item, it will not remove the field from the table itself. It just will not be seen on the layout." msgstr "Odstrani predmet iz razporeditve. V primeru, da odstranite predmet razporeditve polja, polje ne bo odstranjeno iz razpredelnice. Polje samo ne bo prikazano na razporeditvi." #: ../ui/developer/window_data_layout.glade.h:25 msgid "Clicking the row button takes the user to the table specified by this relationship:" msgstr "Klik na gumb vrstice ponese uporabnika v razpredelnico, ki jo poda razmerje:" #: ../ui/developer/window_data_layout.glade.h:26 msgid "Automatic:" msgstr "Samodejno:" #: ../ui/developer/window_data_layout.glade.h:27 msgid "None" msgstr "Brez" #: ../ui/developer/window_data_layout.glade.h:28 msgid "Navigation" msgstr "Krmarjenje" #: ../ui/developer/window_data_layout.glade.h:29 msgid "Date Field:" msgstr "Polje datuma:" #: ../ui/developer/window_data_layout.glade.h:30 msgid "Dates" msgstr "Datumi" #: ../ui/developer/window_data_layout.glade.h:31 msgid "Minimum number of rows:" msgstr "NajmanjÅ¡e Å¡tevilo vrstic:" #: ../ui/developer/window_data_layout.glade.h:32 msgid "Show at least this many rows." msgstr "Pokaži vsaj toliko vrstic." #: ../ui/developer/window_data_layout.glade.h:33 msgid "Maximum number of rows:" msgstr "NajveÄje Å¡tevilo vrstic:" #: ../ui/developer/window_data_layout.glade.h:34 msgid "Show no more than this many rows." msgstr "Ne pokaži veÄ kot toliko vrstic." #: ../ui/developer/window_data_layout.glade.h:35 msgid "Row Line Width:" msgstr "Å irina Ärte vrstice:" #: ../ui/developer/window_data_layout.glade.h:36 msgid "Column Line Width:" msgstr "Å irina Ärte stolpca:" #: ../ui/developer/window_data_layout.glade.h:37 msgid "Line Color:\n" msgstr "Barva Ärte:\n" #: ../ui/developer/window_data_layout.glade.h:39 msgid "Lines" msgstr "ÄŒrte" #: ../ui/developer/window_design.glade.h:1 msgid "Field Definitions" msgstr "Definicije polja" #: ../ui/developer/window_field_calculation.glade.h:1 msgid "Field Calculation" msgstr "IzraÄun polja" #: ../ui/developer/window_field_calculation.glade.h:2 msgid "The field value will be the return value of the python function, which you implement here." msgstr "Vrednost polja bo vrnjena vrednost tukaj podprte zmožnosti python." #: ../ui/developer/window_field_calculation.glade.h:4 msgid "Triggered by:" msgstr "Sprožil:" #: ../ui/developer/window_field_definition_edit.glade.h:1 msgid "Field Definition" msgstr "Definicija polja" #: ../ui/developer/window_field_definition_edit.glade.h:2 msgid "_Name:" msgstr "_Ime:" #: ../ui/developer/window_field_definition_edit.glade.h:3 msgid "Typ_e:" msgstr "V_rsta:" #: ../ui/developer/window_field_definition_edit.glade.h:5 msgid "_Primary Key" msgstr "_Osnovni kljuÄ" #: ../ui/developer/window_field_definition_edit.glade.h:6 msgid "_Unique" msgstr "_Edinstveno" #: ../ui/developer/window_field_definition_edit.glade.h:7 msgid "_Auto-increment" msgstr "S_amodejno poveÄevanje" #: ../ui/developer/window_field_definition_edit.glade.h:9 msgid "_Lookup value when a field changes." msgstr "_Poizvedba vrednosti ob spremembi polja." #: ../ui/developer/window_field_definition_edit.glade.h:10 msgid "_Relationship:" msgstr "_Razmerje:" #: ../ui/developer/window_field_definition_edit.glade.h:11 msgid "_Field:" msgstr "_Polje:" #: ../ui/developer/window_field_definition_edit.glade.h:12 msgid "_User Entry" msgstr "_UporabniÅ¡ki vnos" #: ../ui/developer/window_field_definition_edit.glade.h:14 msgid "_Calculate Value" msgstr "_IzraÄunaj vrednost" #: ../ui/developer/window_field_definition_edit.glade.h:15 msgid "Value" msgstr "Vrednost" #: ../ui/developer/window_field_definition_edit.glade.h:16 msgid "Default Formatting" msgstr "Privzeto oblikovanje" #: ../ui/developer/box_formatting.glade.h:1 msgid "Use 1000s separator" msgstr "Ustvari loÄnico tisoÄic" #: ../ui/developer/box_formatting.glade.h:2 msgid "If this is not selected then a thousands separator will not be used, even if your locale would normally use one. If it is selected then a thousands separator will be used only if your locale normally uses one." msgstr "Neizbrana možnost onemogoÄi uporabo loÄilnika tisoÄic, tudi Äe vaÅ¡e jezikovno doloÄilo obiÄajno uporablja loÄilnik. Izbrana možnost omogoÄi loÄilnik tisoÄic le Äe ga vaÅ¡a jezikovna oznaka obiÄajno uporablja. " #: ../ui/developer/box_formatting.glade.h:3 msgid "Decimal Places" msgstr "Decimalna mesta" #: ../ui/developer/box_formatting.glade.h:4 msgid "Currency Symbol" msgstr "Simbol denarne enote" #: ../ui/developer/box_formatting.glade.h:5 msgid "Alternative Color for Negative Values" msgstr "Dodatna barva za negativne vrednosti" #: ../ui/developer/box_formatting.glade.h:6 msgid "Click this check box to use a different foreground color to display negative values." msgstr "Klik na to potrditveno polje omogoÄi drugo barvo ospredja za prikaz negativnih vrednosti." #: ../ui/developer/box_formatting.glade.h:7 msgid "Numeric Formatting" msgstr "Oblikovanje Å¡tevil" #: ../ui/developer/box_formatting.glade.h:8 msgid "Horizontal Alignment:" msgstr "Vodoravna poravnava:" #: ../ui/developer/box_formatting.glade.h:9 msgid "Multi-line" msgstr "VeÄvrstiÄno" #: ../ui/developer/box_formatting.glade.h:10 msgid "If this is selected then the field value will be shown in a multi-line box with a scrollbar." msgstr "Izbrana možnost omogoÄi prikaz vrednosti polja v veÄ vrstiÄnem oknu z drsnikom." #: ../ui/developer/box_formatting.glade.h:11 msgid "Height (lines)" msgstr "ViÅ¡ina (vrstice)" #: ../ui/developer/box_formatting.glade.h:12 msgid "Font:" msgstr "Pisava:" #: ../ui/developer/box_formatting.glade.h:13 msgid "Click this check box to use a non-standard font." msgstr "Kliknite na to potrditveno polje za uporabo neobiÄajne pisave." #: ../ui/developer/box_formatting.glade.h:14 msgid "Foreground Color:" msgstr "Barva ospredja:" #: ../ui/developer/box_formatting.glade.h:15 msgid "Click this check box to use a non-standard foreground color." msgstr "Kliknite na to potrditveno polje za neobiÄajno barvo ospredja." #: ../ui/developer/box_formatting.glade.h:16 msgid "Background Color:" msgstr "Barva ozadja:" #: ../ui/developer/box_formatting.glade.h:17 msgid "Click this check box to use a non-standard background color." msgstr "Kliknite na to potrditveno polje za uporabo neobiÄajne barve ozadja." #: ../ui/developer/box_formatting.glade.h:18 msgid "Text Formatting" msgstr "Oblikovanje besedila" #: ../ui/developer/box_formatting.glade.h:19 msgid "No Choices" msgstr "Ni izbire" #: ../ui/developer/box_formatting.glade.h:21 msgid "Relationship:" msgstr "Razmerje:" #: ../ui/developer/box_formatting.glade.h:23 msgid "Also show:" msgstr "Prikaži tudi:" #: ../ui/developer/box_formatting.glade.h:24 msgid "Show all records" msgstr "Pokaže vse zapise" #: ../ui/developer/box_formatting.glade.h:25 msgid "If this option is selected then the choices will list values from all records in the related table. If this option is not selected then the choices will list values only from related records." msgstr "V primeru da je ta možnost izbrana bodo izbire izpisale vrednosti iz vseh zapisov v povezani razpredelnici. V primeru da ta možnost ni izbrana, bodo izbire izpisale le vrednosti iz povezanih zapisov." #: ../ui/developer/box_formatting.glade.h:26 msgid "Sort Order:" msgstr "Vrstni red:" #: ../ui/developer/box_formatting.glade.h:27 msgid "Choices From Related Records" msgstr "Izbire iz povezanih zapisov" #: ../ui/developer/box_formatting.glade.h:28 msgid "Custom Choice List" msgstr "Izbirni seznam po meri" #: ../ui/developer/box_formatting.glade.h:29 msgid "Restrict data to these choices" msgstr "Omeji podatkoe na te izbire" #: ../ui/developer/box_formatting.glade.h:30 msgid "Display as radio buttons" msgstr "Prikaži kot radijske gumbe" #: ../ui/developer/box_formatting.glade.h:31 msgid "Choices" msgstr "Izbire" #: ../ui/developer/window_groups.glade.h:1 msgid "Groups" msgstr "Skupine" #: ../ui/developer/window_groups.glade.h:2 #: ../ui/developer/window_users.glade.h:1 msgid "Users" msgstr "Uporabniki" #: ../ui/developer/window_groups.glade.h:3 msgid "Groups" msgstr "Skupine" #: ../ui/developer/window_groups.glade.h:4 msgid "Tables" msgstr "Razpredelnice" #: ../ui/developer/window_imageobject.glade.h:1 msgid "Image Object" msgstr "Slikovni predmet" #: ../ui/developer/window_imageobject.glade.h:3 msgid "Image:" msgstr "Slika:" #: ../ui/developer/window_print_layout_edit.glade.h:1 msgid "Print Layout Editor" msgstr "Urejevalnik razporeditev tiskanja" #: ../ui/developer/window_print_layout_edit.glade.h:2 msgid "Table Name" msgstr "Ime preglednice" #: ../ui/developer/window_print_layout_edit.glade.h:3 msgid "Layout name:" msgstr "Ime razporeditve:" #: ../ui/developer/window_print_layout_edit.glade.h:5 msgid "X:" msgstr "X:" #: ../ui/developer/window_print_layout_edit.glade.h:6 msgid "Y:" msgstr "Y:" #: ../ui/developer/window_print_layout_edit.glade.h:7 msgid "Width:" msgstr "Å irina:" #: ../ui/developer/window_print_layout_edit.glade.h:8 msgid "Height:" msgstr "ViÅ¡ina:" #: ../ui/developer/window_report_layout.glade.h:1 msgid "Report Layout" msgstr "Razporeditev poroÄila" #: ../ui/developer/window_report_layout.glade.h:4 msgid "_Show table title" msgstr "Pokaži naslov p_reglednice" #: ../ui/developer/window_report_layout.glade.h:5 msgid "When this is checked the table's title will be shown at the top of the report in addition to the report title." msgstr "Izbrana možnost omogoÄi prikaz naslova razpredelnice na vrhu poroÄila poleg naslova poroÄila." #: ../ui/developer/window_report_layout.glade.h:6 msgid "_Report name:" msgstr "Ime _poroÄila:" #: ../ui/developer/window_report_layout.glade.h:8 msgid "Available Parts" msgstr "Deli na voljo" #. Translators: The Main part of the report (not the footer or header) #: ../ui/developer/window_report_layout.glade.h:11 msgid "Main" msgstr "Glavni del" #: ../ui/developer/window_report_layout.glade.h:13 msgid "Parts" msgstr "Deli" #: ../ui/developer/window_text_format.glade.h:1 msgid "Text Format" msgstr "Oblika besedila" #: ../ui/developer/window_textobject.glade.h:3 msgid "Text:" msgstr "Besedilo:" #: ../ui/developer/window_translations.glade.h:1 msgid "Translations" msgstr "Prevodi" #: ../ui/developer/window_translations.glade.h:2 msgid "Source Language:" msgstr "Izvirni jezik:" #: ../ui/developer/window_translations.glade.h:3 msgid "English" msgstr "angleÅ¡Äina" #: ../ui/developer/window_translations.glade.h:4 msgid "Identify Source" msgstr "DoloÄi vir" #: ../ui/developer/window_translations.glade.h:5 msgid "Target Language:" msgstr "Ciljni jezik:" #: ../ui/developer/window_translations.glade.h:8 msgid "Copy From Existing Translation" msgstr "Kopiraj iz obstojeÄega prevoda" #: ../ui/developer/window_translations.glade.h:9 msgid "Start a translation for this target locale by copying the strings from another target locale." msgstr "ZaÄnite prevod za to ciljno jezikovno oznako s kopiranjem nizov iz druge ciljne jezikovne oznake." #: ../ui/developer/window_translations.glade.h:10 msgid "Translations" msgstr "Prevodi" #: ../ui/developer/window_users.glade.h:2 msgid "Group:" msgstr "Skupina:" #: ../ui/developer/window_users.glade.h:3 msgid "Users" msgstr "Uporabniki" #~ msgid "No find criteria" #~ msgstr "Ni kriterijev iskanja" #~ msgid "Gettext-Error: " #~ msgstr "Napaka Gettext:" #~ msgid "" #~ "There was an error while restoring the backup. The tar utility failed to " #~ "extract the archive." #~ msgstr "" #~ "PriÅ¡lo je do napake med obnavljanjem varnostne kopije. PripomoÄek tar ni " #~ "uspeÅ¡no razÅ¡iril arhiva." #~ msgid "" #~ "There was an error while restoring the backup. The .glom file could not " #~ "be found." #~ msgstr "" #~ "PriÅ¡lo je do napake med obnavljanjem varnostne kopije. Datoteke .glom ni " #~ "mogoÄe najti." #~ msgid "Creating Glom Database" #~ msgstr "Ustvarjanje podatkovne zbirke Glom" #~ msgid "Number of rows to show:" #~ msgstr "Å tevilo vrstic za prikaz:" #~ msgid "_Show Layout Toolbar" #~ msgstr "P_okaži orodno vrstico razporeditve" glom-1.22.4/po/cs.po0000644000175000017500000042377112234776363015402 0ustar00murraycmurrayc00000000000000# Czech translation of glom. # Copyright (C) 2004, 2005, 2008, 2009 the author(s) of glom. # Copyright (C) 2004, 2005 Miloslav Trmac . # This file is distributed under the same license as the glom package. # # Miloslav Trmac , 2004, 2005. # Petr Kovar , 2009. # Pavel MlÄoch , 2009. # Lucas Lommer , 2009. # Marek ÄŒernocký , 2009, 2010, 2011, 2012. # msgid "" msgstr "" "Project-Id-Version: glom\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=glom&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2012-04-22 13:53+0000\n" "PO-Revision-Date: 2012-04-24 18:36+0200\n" "Last-Translator: Marek ÄŒernocký \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../glom/application.cc:138 ../glom/glom_create_from_example.cc:240 #: ../glom/glom_export_po.cc:112 ../glom/glom_export_po_all.cc:100 #: ../glom/glom_import_po_all.cc:101 ../glom/glom_test_connection.cc:131 msgid "Error while parsing command-line options: " msgstr "Chyba pÅ™i analýze parametrů příkazové řádky: " #. TODO: How can we just print them out? #: ../glom/application.cc:139 ../glom/glom_create_from_example.cc:241 #: ../glom/glom_export_po.cc:113 ../glom/glom_export_po_all.cc:101 #: ../glom/glom_import_po_all.cc:102 ../glom/glom_test_connection.cc:91 msgid "Use --help to see a list of available command-line options." msgstr "Použijte --help pro zobrazení dostupných voleb příkazové řádky." #: ../glom/application.cc:180 ../glom/glom_create_from_example.cc:275 #: ../glom/glom_export_po.cc:162 msgid "Glom: The file does not exist." msgstr "Glom: Soubor neexistuje." #: ../glom/application.cc:190 ../glom/glom_create_from_example.cc:285 #: ../glom/glom_export_po.cc:172 msgid "Glom: The file path is a directory instead of a file." msgstr "Glom: Cesta k souboru je složka namísto souboru." #: ../glom/appwindow.cc:148 msgid "Glom: Generating Encryption Certificates" msgstr "Glom: Generování Å¡ifrovacích certifikátů" #: ../glom/appwindow.cc:149 msgid "" "Please wait while Glom prepares your system for publishing over the network." msgstr "Prosím poÄkejte dokud Glom nepÅ™ipraví váš systém pro sdílení na síti." #: ../glom/appwindow.cc:266 ../glom/bakery/appwindow_withdoc_gtk.cc:228 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:198 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:58 msgid "_File" msgstr "_Soubor" #: ../glom/appwindow.cc:267 ../glom/bakery/appwindow_withdoc_gtk.cc:229 msgid "_Recent Files" msgstr "_Nedávné soubory" #: ../glom/appwindow.cc:275 msgid "_Save as Example" msgstr "_Uložit jako příklad" #: ../glom/appwindow.cc:282 ../glom/filechooser_export.cc:41 msgid "_Export" msgstr "_Export" #: ../glom/appwindow.cc:286 ../ui/operator/dialog_import_csv.glade.h:2 msgid "I_mport" msgstr "I_mport" #: ../glom/appwindow.cc:291 msgid "S_hared on Network" msgstr "_Sdíleno v síti" #: ../glom/appwindow.cc:305 msgid "_Standard" msgstr "_Standardní" #: ../glom/appwindow.cc:309 msgid "_Edit Print Layouts" msgstr "_Upravit rozvržení tisku" #. "Tables" menu: #: ../glom/appwindow.cc:367 msgid "_Tables" msgstr "_Tabulky" #: ../glom/appwindow.cc:377 msgid "_Edit Tables" msgstr "_Upravit tabulky" #. "Reports" menu: #: ../glom/appwindow.cc:391 msgid "_Reports" msgstr "_Sestavy" #: ../glom/appwindow.cc:394 msgid "_Edit Reports" msgstr "_Upravit sestavy" #. We remember this action, so that it can be explicitly activated later. #: ../glom/appwindow.cc:402 ../glom/frame_glom.cc:124 msgid "_Find" msgstr "_Hledat" #: ../glom/appwindow.cc:408 msgctxt "Developer menu title" msgid "_Developer" msgstr "_Vývojář" #: ../glom/appwindow.cc:414 msgid "_Developer Mode" msgstr "_Vývojářský režim" #: ../glom/appwindow.cc:418 msgid "_Operator Mode" msgstr "_OperaÄní režim" #: ../glom/appwindow.cc:423 msgid "_Database Preferences" msgstr "_Nastavení databáze" #: ../glom/appwindow.cc:428 msgid "_Fields" msgstr "_Pole" #: ../glom/appwindow.cc:433 msgid "Relationships _Overview" msgstr "PÅ™ehled _relací" #: ../glom/appwindow.cc:438 msgid "_Relationships for this Table" msgstr "_Relace pro tuto tabulku" #: ../glom/appwindow.cc:443 msgid "_Users" msgstr "_Uživatelé" #: ../glom/appwindow.cc:447 msgid "_Print Layouts" msgstr "Rozvržení _tisku" #: ../glom/appwindow.cc:452 msgid "R_eports" msgstr "_Sestavy" #: ../glom/appwindow.cc:457 msgid "Script _Library" msgstr "K_nihovna skriptů" #: ../glom/appwindow.cc:462 msgid "_Layout" msgstr "_Rozložení" #: ../glom/appwindow.cc:467 msgid "Test Tra_nslation" msgstr "Testová_ní pÅ™ekladu" #: ../glom/appwindow.cc:471 msgid "_Translations" msgstr "_PÅ™eklady" #. "Active Platform" menu: #: ../glom/appwindow.cc:477 msgid "_Active Platform" msgstr "_Aktivní platforma" #: ../glom/appwindow.cc:483 msgid "_Normal" msgstr "_Normální" #: ../glom/appwindow.cc:483 msgid "The layout to use for normal desktop environments." msgstr "Rozvržení, které používat pro běžné pracovní prostÅ™edí." #: ../glom/appwindow.cc:488 msgid "_Maemo" msgstr "_Maemo" #: ../glom/appwindow.cc:488 msgid "The layout to use for Maemo devices." msgstr "Rozvržení, které používat v zařízeních Maemo." #: ../glom/appwindow.cc:493 msgid "_Export Backup" msgstr "_Exportovat zálohu" #: ../glom/appwindow.cc:497 msgid "_Restore Backup" msgstr "_Obnovit zálohu" #. TODO: Think of a better name for this menu item, #. though it mostly only exists because it is not quite ready to be on by default: #. Note to translators: Drag and Drop is part of the name, not a verb or action: #: ../glom/appwindow.cc:504 msgid "_Drag and Drop Layout" msgstr "Rozvržení „tá_hni a pusť“" #: ../glom/appwindow.cc:512 msgctxt "Help menu title" msgid "_Help" msgstr "_NápovÄ›da" #: ../glom/appwindow.cc:516 msgid "_Help" msgstr "_NápovÄ›da" #: ../glom/appwindow.cc:519 msgid "_About" msgstr "O _aplikaci" #: ../glom/appwindow.cc:519 msgid "About the application" msgstr "O aplikaci" #: ../glom/appwindow.cc:522 msgid "_Contents" msgstr "_Obsah" #: ../glom/appwindow.cc:522 msgid "Help with the application" msgstr "Pomoc s aplikací" #: ../glom/appwindow.cc:627 msgid "A Database GUI" msgstr "GUI databáze" #: ../glom/appwindow.cc:629 msgid "© 2000-2011 Murray Cumming, Openismus GmbH" msgstr "© 2000 – 2011 Murray Cumming, Openismus GmbH" #. TODO: Put this in the generic bakery code. #: ../glom/appwindow.cc:713 ../glom/appwindow.cc:722 msgid "Open Failed" msgstr "OtevÅ™ení se nezdaÅ™ilo" #: ../glom/appwindow.cc:714 msgid "The document could not be found." msgstr "Dokument nebyl nalezen." #: ../glom/appwindow.cc:723 msgid "" "The document could not be opened because it was created or modified by a " "newer version of Glom." msgstr "" "Dokument nelze otevřít, protože byl vytvoÅ™en nebo upraven v novÄ›jší verzi " "aplikace Glom." #. std::cout << " SOUP_STATUS_FORBIDDEN or SOUP_STATUS_UNAUTHORIZED" << std::endl; #. Warn the user, and let him try again: #: ../glom/appwindow.cc:773 ../glom/frame_glom.cc:2072 #: ../glom/frame_glom.cc:2143 msgid "Connection Failed" msgstr "PÅ™ipojení selhalo" #: ../glom/appwindow.cc:773 ../glom/frame_glom.cc:2072 #: ../glom/frame_glom.cc:2143 msgid "" "Glom could not connect to the database server. Maybe you entered an " "incorrect user name or password, or maybe the postgres database server is " "not running." msgstr "" "Glom se nemohl pÅ™ipojit k databázovému serveru. Možná jste zadali nesprávné " "jméno uživatele nebo heslo, nebo možná neběží server databáze postgres." #: ../glom/appwindow.cc:942 msgid "" "The file cannot be opened because this version of Glom does not support self-" "hosting of databases." msgstr "" "Soubor nelze otevřít, protože tato verze aplikace Glom nepodporuje vlastní " "hostované databáze." #: ../glom/appwindow.cc:947 ../glom/appwindow.cc:956 msgid "" "The file cannot be opened because this version of Glom does not support " "PostgreSQL databases." msgstr "" "Soubor nelze otevřít, protože tato verze aplikace Glom nepodporuje databáze " "PostgreSQL." #: ../glom/appwindow.cc:964 msgid "" "The file cannot be opened because this version of Glom does not support " "SQLite databases." msgstr "" "Soubor nelze otevřít, protože tato verze aplikace Glom nepodporuje databáze " "SQLite." #. Warn the user. #: ../glom/appwindow.cc:982 msgid "File Uses Unsupported Database Backend" msgstr "Soubor používá nepodporovaný databázový server" #: ../glom/appwindow.cc:1045 msgid "Creating From Example File" msgstr "VytvoÅ™ení ze vzorového souboru" #: ../glom/appwindow.cc:1046 msgid "" "To use this example file you must save an editable copy of the file. A new " "database will also be created on the server." msgstr "" "Pro použití tohoto vzorového souboru musíte uložit jeho zapisovatelnou " "kopii. Na serveru bude také vytvoÅ™ena nová databáze." #: ../glom/appwindow.cc:1050 msgid "Creating From Backup File" msgstr "VytvoÅ™ení ze záložního souboru" #: ../glom/appwindow.cc:1051 msgid "" "To use this backup file you must save an editable copy of the file. A new " "database will also be created on the server." msgstr "" "Abyste mohli použít tento záložní soubor, musíte uložit upravitelnou kopii " "souboru. Na serveru bude rovněž vytvoÅ™ena nová databáze." #: ../glom/appwindow.cc:1112 msgid "Opening Read-Only File." msgstr "Otevírá se soubor jen pro Ätení." #: ../glom/appwindow.cc:1113 msgid "" "This file is read only, so you will not be able to enter Developer mode to " "make design changes." msgstr "" "Tento soubor je jen pro Ätení, takže nebudete moci pÅ™ejít do vývojářského " "režimu a mÄ›nit návrh." #: ../glom/appwindow.cc:1116 msgid "Continue without Developer Mode" msgstr "PokraÄovat bez vývojářského režimu" #. The connection to the server is OK, but the database is not there yet. #: ../glom/appwindow.cc:1174 msgid "Database Not Found On Server" msgstr "Na serveru nebyla databáze nalezena" #: ../glom/appwindow.cc:1174 msgid "" "The database could not be found on the server. Please consult your system " "administrator." msgstr "" "Na serveru nebyla databáze nalezena. Prosím kontaktujte svého správce " "systému." #. std::cerr might show some hints, but we don't want to confront the user with them: #. TODO: Actually complain about specific stuff such as missing data, because the user might really play with the file system. #: ../glom/appwindow.cc:1184 msgid "Problem Loading Document" msgstr "Problém s naÄítáním dokumentu" #: ../glom/appwindow.cc:1184 msgid "Glom could not load the document." msgstr "Glom nemohl naÄíst dokument." #: ../glom/appwindow.cc:1619 msgid "Creating Glom database from example file." msgstr "Ze vzorového souboru se vytváří databáze Glom" #: ../glom/appwindow.cc:1798 msgid "Creating Glom database from backup file." msgstr "VytvoÅ™ení databáze Glom ze záložního souboru." #. The save failed. Tell the user and don't do anything else: #: ../glom/appwindow.cc:2274 ../glom/bakery/appwindow_withdoc.cc:237 #: ../glom/bakery/appwindow_withdoc.cc:288 msgid "Save failed." msgstr "Ukládání selhalo." #: ../glom/appwindow.cc:2274 msgid "There was an error while saving the example file." msgstr "Vyskytla se chyba bÄ›hem ukládání ukázkového souboru." #: ../glom/appwindow.cc:2315 ../glom/appwindow.cc:2320 #: ../glom/bakery/appwindow_withdoc_gtk.cc:425 msgid "Save Document" msgstr "Uložit dokument" #. Warn the user: #: ../glom/appwindow.cc:2407 ../glom/bakery/appwindow_withdoc_gtk.cc:473 msgid "Read-only File." msgstr "Soubor pouze pro Ätení." #: ../glom/appwindow.cc:2407 ../glom/bakery/appwindow_withdoc_gtk.cc:473 msgid "" "You may not overwrite the existing file, because you do not have sufficient " "access rights." msgstr "" "Nemůžete pÅ™epsat existující soubor, protože nemáte potÅ™ebná přístupová práva." #. Warn the user: #: ../glom/appwindow.cc:2421 ../glom/bakery/appwindow_withdoc_gtk.cc:487 msgid "Read-only Directory." msgstr "Adresář pouze pro Ätení." #: ../glom/appwindow.cc:2421 ../glom/bakery/appwindow_withdoc_gtk.cc:487 msgid "" "You may not create a file in this directory, because you do not have " "sufficient access rights." msgstr "" "V tomto adresáři nemůžete soubor vytvoÅ™it, protože nemáte potÅ™ebná " "přístupová práva." #: ../glom/appwindow.cc:2438 msgid "Database Title missing" msgstr "Chybí nadpis databáze" #: ../glom/appwindow.cc:2438 msgid "You must specify a title for the new database." msgstr "Musíte zadat název pro novou databázi." #: ../glom/appwindow.cc:2467 ../glom/frame_glom.cc:1832 msgid "Directory Already Exists" msgstr "Adresář již existuje" #: ../glom/appwindow.cc:2467 ../glom/frame_glom.cc:1833 msgid "" "There is an existing directory with the same name as the directory that " "should be created for the new database files. You should specify a different " "filename to use a new directory instead." msgstr "" "Již existuje adresář stejného názvu, jaký má být vytvoÅ™en pro soubory nové " "databáze. MÄ›li byste místo vybrat jiný název, který bude použit pro " "vytvoÅ™ení nového adresáře." #. This actually creates the directory: #: ../glom/appwindow.cc:2606 msgid "Save Backup" msgstr "Uložit zálohu" #: ../glom/appwindow.cc:2622 msgid "Exporting backup" msgstr "Exportuje se záloha" #: ../glom/appwindow.cc:2628 msgid "Export Backup failed." msgstr "Export zálohy selhal." #: ../glom/appwindow.cc:2628 msgid "There was an error while exporting the backup." msgstr "Vyskytla se chyba bÄ›hem exportu zálohy." #: ../glom/appwindow.cc:2634 msgid "Choose a backup file" msgstr "Volba záložního souboru" #: ../glom/appwindow.cc:2639 msgid ".tar.gz Backup files" msgstr "Záložní soubory .tar.gz" #: ../glom/appwindow.cc:2645 msgid "Restore" msgstr "Obnovit" #: ../glom/appwindow.cc:2670 msgid "Restoring backup" msgstr "Obnovuje se ze zálohy" #: ../glom/appwindow.cc:2677 msgid "Restore Backup failed." msgstr "Obnovení ze zálohy selhalo." #: ../glom/appwindow.cc:2677 msgid "There was an error while restoring the backup." msgstr "Vyskytla se chyba bÄ›hem obnovy ze zálohy." #: ../glom/appwindow.cc:2774 ../glom/bakery/appwindow_withdoc_gtk.cc:346 msgid " (read-only)" msgstr " (pouze Ätení)" #: ../glom/appwindow.cc:2822 ../ui/operator/window_main.glade.h:2 msgid "Processing" msgstr "Zpracování" #: ../glom/base_db.cc:122 ../glom/base_db.cc:132 msgid "Internal error" msgstr "Interní chyba" #: ../glom/base_db.cc:1455 msgid "Value Is Not Unique" msgstr "Hodnota není unikátní" #: ../glom/base_db.cc:1455 msgid "" "The field's value must be unique, but a record with this value already " "exists." msgstr "" "Hodnota pole musí být jedineÄná a záznam s touto hodnotou již existuje." #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:257 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the relationship does not allow automatic creation " "of new related records." msgstr "" "Data jeÅ¡tÄ› nelze vložit do tohoto souvisejícího pole, protože související " "záznam jeÅ¡tÄ› neexistuje, a relace nedovoluje automatické vytváření nových " "souvisejících záznamů." #: ../glom/base_db_table_data.cc:258 msgid "Related Record Does Not Exist" msgstr "Související záznam neexistuje" #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:277 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the key in the related record is auto-generated and " "therefore can not be created with the key value in this record." msgstr "" "Data jeÅ¡tÄ› nelze vložit do tohoto souvisejícího pole, protože související " "záznam jeÅ¡tÄ› neexistuje, a klÃ­Ä v souvisejícím záznamu je automaticky " "generovaný, takže nemůže být vytvoÅ™en s hodnotu klíÄe v tomto záznamu." #: ../glom/base_db_table_data.cc:279 msgid "Related Record Cannot Be Created" msgstr "Nelze vytvoÅ™it související záznam" #. Ask the user for confirmation: #: ../glom/base_db_table_data.cc:390 msgid "" "Are you sure that you would like to delete this record? The data in this " "record will then be permanently lost." msgstr "" "Opravdu chcete odstranit tento záznam? Data v tomto záznamu budou natrvalo " "ztracena." #: ../glom/base_db_table_data.cc:391 msgid "Delete record" msgstr "Odstranit záznam" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #. Append the View columns: #: ../glom/box_reports.cc:96 #: ../glom/mode_design/box_db_table_relationships.cc:45 #: ../glom/mode_design/fields/box_db_table_definition.cc:54 #: ../glom/mode_design/layout/dialog_choose_field.cc:57 #: ../glom/mode_design/layout/dialog_choose_relationship.cc:55 #: ../glom/mode_design/layout/dialog_layout_details.cc:103 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_fieldslist.cc:53 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:49 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.cc:52 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:96 #: ../glom/mode_design/users/dialog_groups_list.cc:66 msgid "Name" msgstr "Název" #. Don't allow a relationship to be added twice. #: ../glom/box_reports.cc:98 msgid "This report already exists. Please choose a different report name" msgstr "Tato sestava již existuje. Zvolte prosím jiný název sestavy" #. Title column: #: ../glom/box_reports.cc:100 #: ../glom/mode_design/box_db_table_relationships.cc:49 #: ../glom/mode_design/fields/box_db_table_definition.cc:58 #: ../glom/mode_design/layout/dialog_choose_field.cc:58 #: ../glom/mode_design/layout/dialog_layout_details.cc:116 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:50 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:100 #: ../glom/navigation/box_tables.cc:137 #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:109 msgid "Title" msgstr "Nadpis" #: ../glom/box_reports.cc:228 msgid "Are you sure that you want to rename this report?" msgstr "Opravdu chcete zmÄ›nit název této sestavy?" #. TODO: Show old and new names? #: ../glom/box_reports.cc:229 msgid "Rename Report" msgstr "ZmÄ›nit název sestavy" #. namespace Glom #: ../glom.desktop.in.in.h:1 ../ui/operator/window_main.glade.h:1 msgid "Glom" msgstr "Glom" #: ../glom.desktop.in.in.h:2 msgid "A user-friendly database environment." msgstr "ProstÅ™edí uživatelsky přívÄ›tivé databáze." #: ../glom/dialog_connection.cc:205 msgid "Not yet created." msgstr "JeÅ¡tÄ› nevytvoÅ™eno." #: ../glom/dialog_existing_or_new.cc:50 msgid "No recently used documents available." msgstr "Nejsou k dispozici nedávno použité dokumenty." #: ../glom/dialog_existing_or_new.cc:51 msgid "No sessions found on the local network." msgstr "Žádná sezení nebyla v místní síti nalezena." #: ../glom/dialog_existing_or_new.cc:54 msgid "No templates available." msgstr "Žádná Å¡ablona není dostupná." #: ../glom/dialog_existing_or_new.cc:112 msgid "Open a Document" msgstr "Otevřít dokument" #: ../glom/dialog_existing_or_new.cc:131 msgid "Select File" msgstr "Vybrat soubor" #: ../glom/dialog_existing_or_new.cc:135 msgid "Local Network" msgstr "Místní síť" #: ../glom/dialog_existing_or_new.cc:139 msgid "Recently Opened" msgstr "Naposledy otevÅ™ené" #: ../glom/dialog_existing_or_new.cc:213 msgid "New Empty Document" msgstr "Nový prázdný dokument" #: ../glom/dialog_existing_or_new.cc:216 msgid "New From Template" msgstr "Nový ze Å¡ablony" #. Translator hint: This is on (via Network Interface such as eth0). #: ../glom/dialog_existing_or_new.cc:742 #, c-format msgid "%s on %s (via %s)" msgstr "%s v %s (pomocí %s)" #: ../glom/filechooser_export.cc:32 msgid "Export to File" msgstr "Export do souboru" #: ../glom/filechooser_export.cc:35 msgid "Define Data _Format" msgstr "Definice _formátu dat" #: ../glom/frame_glom.cc:81 msgid "Find All" msgstr "Hledat vÅ¡ude" #: ../glom/frame_glom.cc:102 ../glom/frame_glom.cc:106 msgid "No Table Selected" msgstr "Není vybrána žádná tabulka" #: ../glom/frame_glom.cc:113 ../ui/operator/dialog_find_id.glade.h:4 msgid "Quick _search:" msgstr "Rychlé _hledání:" #: ../glom/frame_glom.cc:138 msgid "Records:" msgstr "Záznamy:" #: ../glom/frame_glom.cc:141 msgid "Found:" msgstr "Hledat:" #. TODO: Obviously this document should have been deleted when the database-creation was cancelled. #. Note that "canceled" is the correct US spelling. #: ../glom/frame_glom.cc:326 msgid "No table" msgstr "Žádná tabulka" #: ../glom/frame_glom.cc:326 msgid "This database has no tables yet." msgstr "Tato databáze jeÅ¡tÄ› nemá žádné tabulky." #. TODO: Obviously this could be possible but it would require a network protocol and some work: #: ../glom/frame_glom.cc:498 msgid "Developer mode not available." msgstr "Vývojářský režim není k dispozici." #: ../glom/frame_glom.cc:499 msgid "" "Developer mode is not available because the file was opened over the network " "from a running Glom. Only the original file may be edited." msgstr "" "Vývojářský režim není přístupný protože byl soubor otevÅ™en ze sítÄ› do " "běžícího Glomu. Upravován může být pouze originální soubor." #: ../glom/frame_glom.cc:505 msgid "Developer mode not available" msgstr "Vývojářský režim není k dispozici" #: ../glom/frame_glom.cc:506 msgid "" "Developer mode is not available. Check that you have sufficient database " "access rights and that the glom file is not read-only." msgstr "" "Vývojářský režim není k dispozici. Zkontrolujte, že máte dostateÄná " "oprávnÄ›ní k přístupu k databázi a že soubor glom není jen pro Ätení." #: ../glom/frame_glom.cc:513 msgid "Saving in new document format" msgstr "Ukládání v novém formát dokumentu" #: ../glom/frame_glom.cc:514 msgid "" "The document was created by an earlier version of the application. Making " "changes to the document will mean that the document cannot be opened by some " "earlier versions of the application." msgstr "" "Dokument byl vytvoÅ™en ve starší verzi aplikace. ZmÄ›ny provedené v dokumentu " "můžou znamenat, že dokument nebude moci být otevÅ™en v jakékoli starší verzi " "aplikace." #: ../glom/frame_glom.cc:517 msgid "Continue" msgstr "PokraÄovat" #: ../glom/frame_glom.cc:566 msgid "Export Not Allowed." msgstr "Export není dovolen." #: ../glom/frame_glom.cc:566 msgid "" "You do not have permission to view the data in this table, so you may not " "export the data." msgstr "" "Nemáte práva pro zobrazení dat v této tabulce a proto nemůžete data " "exportovat." #: ../glom/frame_glom.cc:597 msgid "Could Not Create File." msgstr "Nelze vytvoÅ™it soubor." #: ../glom/frame_glom.cc:597 msgid "Glom could not create the specified file." msgstr "Glom nemohl vytvoÅ™it urÄený soubor." #: ../glom/frame_glom.cc:748 msgid "No Table" msgstr "Žádná tabulka" #: ../glom/frame_glom.cc:748 msgid "There is no table in to which data could be imported." msgstr "" "Není k dispozici žádná tabulka, do které by mohla být data naimportována." #: ../glom/frame_glom.cc:752 msgid "Open CSV Document" msgstr "Otevřít dokument CSV" #: ../glom/frame_glom.cc:756 msgid "CSV files" msgstr "Soubory CSV" #: ../glom/frame_glom.cc:760 msgid "All files" msgstr "VÅ¡echny soubory" #: ../glom/frame_glom.cc:835 msgid "Share on the network" msgstr "Sdílení v síti" #: ../glom/frame_glom.cc:836 msgid "This will allow other users on the network to use this database." msgstr "Tímto umožníte ostatním uživatelům v síti používat tuto databázi." #: ../glom/frame_glom.cc:839 msgid "_Share" msgstr "_Sdílet" #. TODO: Warn about connected users if possible. #: ../glom/frame_glom.cc:940 msgid "Stop sharing on the network" msgstr "Zastavit sdílení na síti" #: ../glom/frame_glom.cc:941 msgid "This will prevent other users on the network from using this database." msgstr "Tímto zabráníte ostatním uživatelům na síti v používání této databáze." #: ../glom/frame_glom.cc:944 msgid "_Stop Sharing" msgstr "_Zastavit sdílení" #: ../glom/frame_glom.cc:992 ../glom/frame_glom.cc:2129 msgid "Stopping Database Server" msgstr "Zastavuje se databázový server" #. Do startup, such as starting the self-hosting database server #: ../glom/frame_glom.cc:995 ../glom/frame_glom.cc:2017 #: ../glom/frame_glom.cc:2175 msgid "Starting Database Server" msgstr "Startuje se databázový server" #: ../glom/frame_glom.cc:1150 msgid "Table Exists Already" msgstr "Tabulka již existuje" #: ../glom/frame_glom.cc:1150 msgid "" "A table with this name already exists in the database. Please choose a " "different table name." msgstr "" "Tabulka s tímto názvem již v databázi existuje. Zvolte prosím jiný název " "tabulky." #: ../glom/frame_glom.cc:1154 msgid "Relationship Exists Already" msgstr "Relace již existuje" #: ../glom/frame_glom.cc:1154 msgid "" "A relationship with this name already exists for this table. Please choose a " "different relationship name." msgstr "" "Relace s tímto názvem již pro tuto tabulku existuje. Zvolte prosím jiný " "název relace." #: ../glom/frame_glom.cc:1158 msgid "More information needed" msgstr "Jsou vyžadovány další informace" #: ../glom/frame_glom.cc:1158 msgid "You must specify a field, a table name, and a relationship name." msgstr "Musíte urÄit pole, název tabulky a název relace." #: ../glom/frame_glom.cc:1212 msgid "Related Table Created" msgstr "Související záznam byl vytvoÅ™en" #: ../glom/frame_glom.cc:1212 msgid "The new related table has been created." msgstr "Nová související tabulka byla vytvoÅ™ena." #. namespace Glom #: ../glom/frame_glom.cc:1241 ../ui/operator/box_navigation_tables.glade.h:1 msgid "Edit Tables" msgstr "Upravit tabulky" #: ../glom/frame_glom.cc:1336 msgid "" "You have not entered any find criteria. Try entering information in the " "fields." msgstr "Nezadali jste žádná kritéria hledání. Zkuste do polí zadat informace." #: ../glom/frame_glom.cc:1338 #: ../glom/mode_data/datawidget/dialog_choose_id.cc:108 msgid "No Find Criteria" msgstr "Žádná kritéria hledání" #: ../glom/frame_glom.cc:1690 ../glom/onlineglom_strings.cc:33 #: ../ui/developer/box_reports.glade.h:1 msgid "Reports" msgstr "Sestavy" #: ../glom/frame_glom.cc:1721 ../ui/developer/box_print_layouts.glade.h:1 msgid "Print Layouts" msgstr "Rozvržení tisku" #: ../glom/frame_glom.cc:1837 msgid "Could Not Create Directory" msgstr "Nelze vytvoÅ™it adresář" #: ../glom/frame_glom.cc:1838 msgid "" "There was an error when attempting to create the directory for the new " "database files." msgstr "" "Vyskytla se chyba pÅ™i pokusu o vytvoÅ™ení adresáře pro soubory nové databáze." #: ../glom/frame_glom.cc:1842 msgid "Could Not Start Database Server" msgstr "Nelze spustit databázový server" #: ../glom/frame_glom.cc:1843 msgid "There was an error when attempting to start the database server." msgstr "Vyskytla se chyba pÅ™i pokusu o spuÅ¡tÄ›ní databázového serveru." #: ../glom/frame_glom.cc:1948 msgid "Initializing Database Data" msgstr "Inicializují se databázová data" #. Show 0 instead of "all" when all of no records are found, to avoid confusion. #: ../glom/frame_glom.cc:2489 msgid "All" msgstr "VÅ¡e" #: ../glom/utils_ui.cc:142 msgid "No help file available" msgstr "Soubor nápovÄ›dy není dostupný" #: ../glom/utils_ui.cc:160 msgid "Could not display help: %1" msgstr "Nelze zobrazit nápovÄ›du: %1" #: ../glom/utils_ui.cc:476 msgid "Your find criteria did not match any records in the table." msgstr "VaÅ¡e kritéria hledání neodpovídaly žádným záznamům v tabulce." #: ../glom/utils_ui.cc:478 msgid "No Records Found" msgstr "Nenalezeny žádné záznamy" #: ../glom/utils_ui.cc:483 msgid "New Find" msgstr "Nové hledání" #: ../glom/utils_ui.cc:494 msgid "Report Finished" msgstr "Sestava dokonÄena" #: ../glom/utils_ui.cc:494 msgid "The report will now be opened in your web browser." msgstr "Report bude nyní otevÅ™en ve vaÅ¡em prohlížeÄi WWW." #: ../glom/utils_ui.cc:541 msgid "Script Uses PyGTK 2" msgstr "Skript používá PyGTK 2" #: ../glom/utils_ui.cc:542 msgid "" "Glom cannot run this script because it uses pygtk 2, but Glom uses GTK+ 3, " "and attempting to use pygtk 2 would cause Glom to crash." msgstr "" "Glom nemůže spustit tento skript, protože ten používá pygtk 2 a aplikace " "Glom používá GTK+ 3 a pÅ™i pokusu o použití pygtk 2 by se mohla zhroutit." #. These strings are not actually used by Glom. #. I am putting them here so that GNOME's translators can translate them #. without dealing with the awkward (not gettext) system here: #. http://www.murrayc.com/blog/permalink/2012/01/27/online-glom-more-translation/ #. murrayc #: ../glom/onlineglom_strings.cc:29 msgid "Search" msgstr "Hledat" #: ../glom/onlineglom_strings.cc:30 msgid "Back to List" msgstr "ZpÄ›t na seznam" #. Translators: This is a noun. It is a notebook tab title. #. Details column: #: ../glom/onlineglom_strings.cc:31 ../glom/libglom/document/document.cc:1361 #: ../glom/mode_data/notebook_data.cc:67 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:215 #: ../glom/mode_find/notebook_find.cc:39 msgid "Details" msgstr "Podrobnosti" #: ../glom/onlineglom_strings.cc:32 msgid "Open" msgstr "Otevřít" #: ../glom/onlineglom_strings.cc:34 msgid "Generating the report..." msgstr "Generuje se sestava…" #: ../glom/bakery/appwindow_withdoc_gtk.cc:284 #: ../ui/developer/window_field_definition_edit.glade.h:13 msgid "_Edit" msgstr "_Upravit" #: ../glom/bakery/appwindow_withdoc_gtk.cc:376 msgid "Open Document" msgstr "Otevřít dokument" #: ../glom/bakery/appwindow_withdoc.cc:237 #: ../glom/bakery/appwindow_withdoc.cc:288 msgid "" "There was an error while saving the file. Your changes have not been saved." msgstr "PÅ™i ukládání se vyskytla chyba. VaÅ¡e zmÄ›ny nebyly uloženy." #: ../glom/bakery/appwindow_withdoc.cc:493 msgid "Open Failed." msgstr "OtevÅ™ení se nezdaÅ™ilo." #: ../glom/bakery/appwindow_withdoc.cc:493 msgid "The document could not be opened." msgstr "Dokument nelze otevřít." #: ../glom/bakery/dialog_offersave.cc:31 msgid "This document has unsaved changes. Would you like to save the document?" msgstr "Tento dokument obsahuje neuložené zmÄ›ny. PÅ™ejete si dokument uložit?" #: ../glom/bakery/dialog_offersave.cc:35 msgid "" "Document:\n" "%1" msgstr "" "Dokument:\n" "%1" #: ../glom/bakery/dialog_offersave.cc:47 msgid "Close without Saving" msgstr "Zavřít bez ukládání" #: ../glom/bakery/dialog_offersave.cc:53 msgid "Discard" msgstr "Zahodit" #: ../glom/import_csv/dialog_import_csv.cc:99 msgid "Auto Detect" msgstr "Autodetekce" #. We mean 22nd November 2008: #. C years start are the AD year - 1900. So, 01 is 1901. #. C months start at 0. #. starts at 1 #. Get the ISO (not current locale) text representation: #. ignored #. iso_format #: ../glom/import_csv/dialog_import_csv.cc:154 msgid "" "Note that the source file should contain numbers and dates in international " "ISO format. For instance, 22nd November 2008 should be %1." msgstr "" "Nezapomeňte že zdrojový soubor může obsahovat Äísla a data v mezinárodním " "ISO formátu. Například 22. listopad 2008 může být %1." #: ../glom/import_csv/dialog_import_csv.cc:183 msgid "No Document Available" msgstr "Dokument není dostupný" #: ../glom/import_csv/dialog_import_csv.cc:183 msgid "You need to open a document to import the data into a table." msgstr "" "Pokud chcete do tabulky importovat data, musíte otevřít nÄ›jaký dokument." #: ../glom/import_csv/dialog_import_csv.cc:194 msgid "Import From CSV File" msgstr "Importovat ze souboru CSV" #: ../glom/import_csv/dialog_import_csv.cc:199 #: ../glom/import_csv/dialog_import_csv.cc:576 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:274 msgid "Error Importing CSV File" msgstr "Chyba pÅ™i zpracování souboru CSV" #: ../glom/import_csv/dialog_import_csv.cc:428 msgid "Encoding detected as: %1" msgstr "Kódování detekováno jako: %1" #: ../glom/import_csv/dialog_import_csv.cc:467 msgid "Encoding detection failed. Please manually choose one from the box." msgstr "Detekce kódování selhala. Prosím vyberte jej z nabídky." #: ../glom/import_csv/dialog_import_csv.cc:471 msgid "" "The file contains data not in the specified encoding. Please choose another " "one, or try \"Auto Detect\"." msgstr "" "Soubor obsahuje data v jiném, než urÄeném kódování. Prosím vyberte jiné, " "nebo zkuste \"Autodetekci\"." #. Translators: This is the name of a UI element (a layout part name). #. This is a straight line, not a database row. #: ../glom/import_csv/dialog_import_csv.cc:513 #: ../glom/libglom/data_structure/layout/layoutitem_line.cc:91 msgid "Line" msgstr "Řádek" #: ../glom/import_csv/dialog_import_csv.cc:556 msgid "Target Field" msgstr "Cílové pole" #: ../glom/import_csv/dialog_import_csv.cc:601 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:611 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:710 msgid "" "One column needs to be assigned the table's primary key (%1) as " "target field before importing" msgstr "" "Jeden sloupec musí být pÅ™ed importem pÅ™idÄ›len primárnímu klíÄi tabulky (" "%1) jako cílové pole" #: ../glom/import_csv/dialog_import_csv.cc:738 msgid "Could Not Open file" msgstr "Soubor nelze otevřít" #: ../glom/import_csv/dialog_import_csv.cc:739 msgid "The file at \"%1\" could not be opened: %2" msgstr "Soubor „%1“ nelze otevřít: %2" #: ../glom/import_csv/dialog_import_csv.cc:745 msgid "Import From CSV File: %1" msgstr "Importovat ze souboru CSV: %1" #: ../glom/import_csv/dialog_import_csv_progress.cc:85 msgid "Parsing CSV file %1" msgstr "Zpracování souboru CSV %1" #: ../glom/import_csv/dialog_import_csv_progress.cc:175 msgid "Import complete\n" msgstr "Import byl dokonÄen\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:204 msgid "" "Warning: Importing row %1: The value for field %2 must be unique, but is " "already in use. The value will not be imported.\n" msgstr "" "Varování: Import řádku %1: Hodnota pole %2 musí být jedineÄná, ale byla již " "použita. Hodnota nebude importována.\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:213 msgid "" "Warning: Importing row %1: The value for field %2, \"%3\" could not be " "converted to the field's type. The value will not be imported.\n" msgstr "" "Varování: Import řádku %1: Hodnota pole %2, „%3“ nemůže být pÅ™evedena na typ " "pole. Hodnota nebude importována.\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:238 msgid "" "Error importing row %1: Cannot import the row because the primary key is " "empty.\n" msgstr "" "Chyba importu řádku %1: Nemůže být importován, protože je prázdný primární " "klíÄ.\n" #. TODO: Can we get this from anywhere else, such as iso-codes? murrayc #. TODO: Make this generally more efficient. #: ../glom/import_csv/file_encodings.cc:93 #: ../glom/import_csv/file_encodings.cc:94 #: ../glom/import_csv/file_encodings.cc:95 #: ../glom/import_csv/file_encodings.cc:96 #: ../glom/import_csv/file_encodings.cc:97 #: ../glom/import_csv/file_encodings.cc:98 #: ../glom/import_csv/file_encodings.cc:99 #: ../glom/import_csv/file_encodings.cc:100 msgid "Unicode" msgstr "Unicode" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:102 #: ../glom/import_csv/file_encodings.cc:115 #: ../glom/import_csv/file_encodings.cc:120 msgid "Western" msgstr "Západní" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:103 #: ../glom/import_csv/file_encodings.cc:118 msgid "Central European" msgstr "StÅ™edoevropské" #: ../glom/import_csv/file_encodings.cc:104 msgid "South European" msgstr "Jihoevropské" #: ../glom/import_csv/file_encodings.cc:105 #: ../glom/import_csv/file_encodings.cc:113 #: ../glom/import_csv/file_encodings.cc:125 msgid "Baltic" msgstr "Baltské" #: ../glom/import_csv/file_encodings.cc:106 #: ../glom/import_csv/file_encodings.cc:119 msgid "Cyrillic" msgstr "Cirilice" #: ../glom/import_csv/file_encodings.cc:107 #: ../glom/import_csv/file_encodings.cc:124 msgid "Arabic" msgstr "Arabské" #: ../glom/import_csv/file_encodings.cc:108 #: ../glom/import_csv/file_encodings.cc:121 msgid "Greek" msgstr "Řecké" #: ../glom/import_csv/file_encodings.cc:109 msgid "Hebrew Visual" msgstr "Hebrejské vizuální" #: ../glom/import_csv/file_encodings.cc:110 #: ../glom/import_csv/file_encodings.cc:123 msgid "Hebrew" msgstr "Hebrejské" #: ../glom/import_csv/file_encodings.cc:111 #: ../glom/import_csv/file_encodings.cc:122 msgid "Turkish" msgstr "Turecké" #: ../glom/import_csv/file_encodings.cc:112 msgid "Nordic" msgstr "Severské" #: ../glom/import_csv/file_encodings.cc:114 msgid "Celtic" msgstr "Keltské" #: ../glom/import_csv/file_encodings.cc:116 msgid "Romanian" msgstr "Romunské" #: ../glom/import_csv/file_encodings.cc:126 msgid "Vietnamese" msgstr "Vietnamské" #. Translators: This means an unknown or unnacceptable value type in a database. #: ../glom/libglom/data_structure/field.cc:643 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:151 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:159 msgid "Invalid" msgstr "Neplatné" #. Translators: This means a numeric value type in a database. #: ../glom/libglom/data_structure/field.cc:646 msgid "Number" msgstr "Číslo" #. Translators: This means a text/string value type in a database. #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/field.cc:649 #: ../glom/libglom/data_structure/layout/layoutitem_text.cc:73 #: ../glom/libglom/data_structure/translatable_item.cc:248 #: ../glom/mode_design/layout/dialog_layout_details.cc:1159 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:36 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:759 msgid "Text" msgstr "Text" #. Translators: This means a time value type in a database. #: ../glom/libglom/data_structure/field.cc:652 msgid "Time" msgstr "ÄŒas" #. Translators: This means a time value type in a database. #: ../glom/libglom/data_structure/field.cc:655 msgid "Date" msgstr "Datum" #. Translators: This means a true/false value type in a database. #: ../glom/libglom/data_structure/field.cc:658 msgid "Boolean" msgstr "Booleovská hodnota" #. Translators: This means a picture value type in a database. #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/field.cc:661 #: ../glom/libglom/data_structure/layout/layoutitem_image.cc:70 #: ../glom/libglom/data_structure/translatable_item.cc:250 #: ../glom/mode_design/layout/dialog_layout_details.cc:1166 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:38 #: ../glom/utility_widgets/layouttoolbar.cc:47 msgid "Image" msgstr "Obrázek" #. TRANSLATORS: Please only translate this string if you know that strftime() #. * shows only 2 year digits when using format "x". We want to always display #. * 4 year digits. For instance, en_GB should translate it to "%d/%m/%Y". #. * Glom will show a warning in the terminal at startup if this is necessary #. * and default to %d/%m/%Y" if it detects a problem, but that might not be #. * correct for your locale. #. * Thanks. #: ../glom/libglom/data_structure/glomconversions.cc:99 #, no-c-format msgid "%x" msgstr "%x" #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:147 msgid "" "ERROR: sanity_check_date_parsing(): Sanity check failed: Glom could not " "parse a date's text representation that it generated itself, in this locale." msgstr "" "ERROR: sanity_check_date_parsing(): Chyba kontroly správnosti: Glom nemohl " "rozpoznat textový formát data. Proto jej sestavil sám v tomto prostÅ™edí." #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:183 msgid "" "ERROR: sanity_check_date_text_representation_uses_4_digit_year(): Sanity " "check failed: Glom does not seem to use 4 digits to display years in a " "date's text representation, in this locale. Defaulting to dd/mm/yyyy though " "this might be incorrect for your locale. This needs attention from a " "translator. Please file a bug - see http://www.glom.org" msgstr "" "ERROR: sanity_check_date_text_represenation_uses_4_digit_year(): Chyba " "kontroly správnosti: Aplikaci Glom se nezdá použití 4 Äíslic pro zobrazení " "roku v textové podobÄ› data pro toto národní nastavení. Použije se výchozí " "formát dd/mm/yyyy, aÄkoli to nemusí být pro váš jazyk správnÄ›. Toto vyžaduje " "pozornost pÅ™ekladatele. Prosím vyplňte chybové hlášení, viz http://www.glom." "org" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutgroup.cc:422 #: ../glom/utility_widgets/layouttoolbar.cc:35 #: ../glom/utility_widgets/layouttoolbar.cc:45 #: ../glom/utility_widgets/notebooklabelglom.cc:76 msgid "Group" msgstr "Skupina" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_button.cc:68 #: ../glom/libglom/data_structure/translatable_item.cc:246 #: ../glom/mode_design/layout/dialog_layout_details.cc:1152 #: ../glom/utility_widgets/layouttoolbar.cc:43 msgid "Button" msgstr "TlaÄítko" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_calendarportal.cc:58 msgid "Calendar Portal" msgstr "Portál kalendáře" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_field.cc:229 #: ../glom/libglom/data_structure/translatable_item.cc:228 #: ../glom/mode_design/dialog_database_preferences.cc:62 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:755 #: ../ui/developer/window_field_definition_edit.glade.h:8 msgid "Field" msgstr "Pole" #. Translators: This is the name of a UI element (a layout part name). #. "Notebook" means a GtkNotebook-type widget. #: ../glom/libglom/data_structure/layout/layoutitem_notebook.cc:57 #: ../glom/utility_widgets/layouttoolbar.cc:37 msgid "Notebook" msgstr "Poznámkový blok" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/layoutitem_placeholder.cc:60 msgid "Placeholder" msgstr "UmísÅ¥ovaÄ" #. TODO: "Portal" probably shouldn't appear in the UI. #. We should use "Related Records instead. #. Translators: This is the name of a UI element (a layout part name). #. It means a list of related records. #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:88 msgid "Portal" msgstr "Portál" #. TODO: This prevents "" as a real title. #. parent table - not relevant #. TODO: This prevents "" as a real title. #. Note to translators: This text is shown instead of a table title, when the table has not yet been chosen. #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:424 #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:433 #: ../glom/mode_data/box_data_portal.cc:116 #: ../glom/mode_data/box_data_portal.cc:128 msgid "Undefined Table" msgstr "Neznámá tabulka" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:79 #: ../ui/developer/dialog_field_summary.glade.h:1 msgid "Field Summary" msgstr "Souhrn polí" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:134 msgid "No summary chosen" msgstr "Nevybrán žádný sourn" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:153 msgid "Sum" msgstr "SouÄet" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:155 msgid "Average" msgstr "PrůmÄ›r" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:157 msgid "Count" msgstr "PoÄet" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_footer.cc:56 #: ../ui/developer/window_report_layout.glade.h:12 msgid "Footer" msgstr "PatiÄka" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.cc:103 #: ../ui/developer/dialog_group_by.glade.h:1 msgid "Group By" msgstr "Seskupit podle" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_header.cc:56 #: ../ui/developer/window_report_layout.glade.h:9 msgid "Header" msgstr "HlaviÄka" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_summary.cc:62 msgid "Summary" msgstr "Souhrn" #. Translators: This is the name of a UI element (a layout part name). #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc:56 msgid "Vertical Group" msgstr "Svislá skupina" #: ../glom/libglom/data_structure/translatable_item.cc:230 msgid "Custom Title" msgstr "Vlastní nadpis" #: ../glom/libglom/data_structure/translatable_item.cc:232 msgid "Relationship" msgstr "Relace" #: ../glom/libglom/data_structure/translatable_item.cc:234 msgid "Layout Item" msgstr "Rozložení položek" #: ../glom/libglom/data_structure/translatable_item.cc:236 msgid "Print Layout" msgstr "Rozvržení tisku" #: ../glom/libglom/data_structure/translatable_item.cc:238 msgid "Report" msgstr "Sestava" #. Tables: #: ../glom/libglom/data_structure/translatable_item.cc:240 #: ../glom/mode_design/box_db_table_relationships.cc:53 #: ../glom/mode_design/dialog_database_preferences.cc:61 #: ../glom/mode_design/users/dialog_groups_list.cc:73 #: ../glom/navigation/box_tables.cc:132 msgid "Table" msgstr "Tabulka" #: ../glom/libglom/data_structure/translatable_item.cc:242 msgid "Layout Group" msgstr "Skupina sestavy" #: ../glom/libglom/data_structure/translatable_item.cc:244 msgid "Field Title" msgstr "Nadpis pole" #: ../glom/libglom/data_structure/translatable_item.cc:252 msgid "Field Choice" msgstr "Volba pole" #: ../glom/libglom/data_structure/translatable_item.cc:254 msgid "Database Title" msgstr "Název databáze" #: ../glom/libglom/data_structure/translatable_item.cc:256 #: ../glom/mode_design/translation/window_translations.cc:217 msgid "Unknown" msgstr "Neznámé" #: ../glom/libglom/document/document.cc:508 #: ../glom/libglom/document/document.cc:526 msgid "System Preferences" msgstr "Nastavení systému" #: ../glom/libglom/document/document.cc:539 msgid "System Name" msgstr "Název systému" #: ../glom/libglom/document/document.cc:545 msgid "Organisation Name" msgstr "Název organizace" #: ../glom/libglom/document/document.cc:551 msgid "Organisation Logo" msgstr "Logo organizace" #: ../glom/libglom/document/document.cc:557 msgid "Street" msgstr "Ulice" #: ../glom/libglom/document/document.cc:563 msgid "Street (line 2)" msgstr "Ulice (řádek 2)" #: ../glom/libglom/document/document.cc:569 msgid "City" msgstr "MÄ›sto" #: ../glom/libglom/document/document.cc:575 msgid "State" msgstr "Stát" #: ../glom/libglom/document/document.cc:581 msgid "Country" msgstr "ZemÄ›" #: ../glom/libglom/document/document.cc:587 msgid "Zip Code" msgstr "SmÄ›rovací Äíslo" #: ../glom/libglom/document/document.cc:1355 msgid "Overview" msgstr "PÅ™ehled" #: ../glom/libglom/document/bakery/document.cc:413 msgid "Untitled" msgstr "Nepojmenovaný" #: ../glom/libglom/gst-package.c:56 msgid "Could not install package" msgstr "Nelze nainstalovat balíÄek" #: ../glom/libglom/gst-package.c:74 msgid "The necessary applications to install the package could not be found." msgstr "Aplikace důležité pro instalaci balíÄku nebyly nalezeny." #. Show only debug output #: ../glom/libglom/translations_po.cc:69 msgid "Gettext-Warning: " msgstr "Gettext-varování: " #: ../glom/libglom/db_utils.cc:503 msgid "System: Auto Increments" msgstr "Systém: Automatické zvyÅ¡ování" #: ../glom/libglom/db_utils.cc:1176 #: ../glom/mode_design/users/dialog_groups_list.cc:70 msgid "Description" msgstr "Popis" #: ../glom/libglom/db_utils.cc:1183 msgid "Comments" msgstr "Komentáře" #. Translators: This is a noun. It is the title of a report. #. Add Pages: #. Translators: This is a noun. It is a notebook tab title. #: ../glom/libglom/report_builder.cc:771 ../glom/mode_data/notebook_data.cc:63 #: ../glom/mode_find/notebook_find.cc:32 msgid "List" msgstr "Seznam" #: ../glom/glom_create_from_example.cc:65 ../glom/glom_export_po.cc:51 #: ../glom/glom_export_po_all.cc:49 ../glom/glom_import_po_all.cc:50 #: ../glom/glom_test_connection.cc:55 msgid "Glom options" msgstr "Volby programu Glom" #: ../glom/glom_create_from_example.cc:65 ../glom/glom_export_po.cc:51 #: ../glom/glom_export_po_all.cc:49 ../glom/glom_import_po_all.cc:50 #: ../glom/glom_test_connection.cc:55 msgid "Command-line options" msgstr "PÅ™epínaÄe příkazového řádku" #: ../glom/glom_create_from_example.cc:72 msgid "The example .glom file to open." msgstr "Ukázkový soubor .glom, který se má otevřít." #: ../glom/glom_create_from_example.cc:77 msgid "" "The directory in which to save the created .glom file, or sub-directory if " "necessary, such as /home/someuser/ ." msgstr "" "Složka, do které se má uložit vytvoÅ™ený soubor .glom, případnÄ› i podsložka, " "pokud je potÅ™eba. NapÅ™. /home/uzivatel/" #: ../glom/glom_create_from_example.cc:82 msgid "The name for the created .glom file, such as something.glom ." msgstr "Název pro vytvoÅ™ený soubor .glom, napÅ™. nÄ›co.glom" #: ../glom/glom_create_from_example.cc:87 ../glom/glom_export_po.cc:72 #: ../glom/glom_export_po_all.cc:60 ../glom/glom_import_po_all.cc:61 #: ../glom/glom_test_connection.cc:63 ../glom/main_local_options.cc:47 msgid "The version of this application." msgstr "Verze tohoto programu." #: ../glom/glom_create_from_example.cc:93 msgid "" "The hostname of the PostgreSQL server, such as localhost. If this is not " "specified then a self-hosted database will be created." msgstr "" "Hostitel serveru PostgreSQL, napÅ™. localhost. Pokud není uvedeno, vytvoří se " "databáze zde." #: ../glom/glom_create_from_example.cc:98 ../glom/glom_test_connection.cc:73 msgid "The port of the PostgreSQL server, such as 5434." msgstr "Port pro server PostgreSQL, napÅ™. 5434." #: ../glom/glom_create_from_example.cc:103 ../glom/glom_test_connection.cc:78 msgid "The username for the PostgreSQL server." msgstr "Jméno uživatele pro server PostgreSQL." #: ../glom/glom_create_from_example.cc:316 msgid "Glom: The output directory does not exist." msgstr "Glom: Výstupní složka neexistuje." #: ../glom/glom_create_from_example.cc:326 msgid "Glom: The output path is not a directory." msgstr "Glom: Výstupní cesta není složkou." #: ../glom/glom_create_from_example.cc:424 ../glom/glom_test_connection.cc:166 msgid "Please enter the PostgreSQL server's password for the user %1: " msgstr "Zadejte prosím heslo pro uživatele %1 serveru PostgreSQL:" #: ../glom/glom_create_from_example.cc:428 ../glom/glom_test_connection.cc:170 msgid "" "Error: getpass() is not implemented in the Windows build. The connection " "will fail." msgstr "" "Chyba: funkce getpass() není v sestavení pro Windows implementována. " "PÅ™ipojení selže." #: ../glom/glom_export_po.cc:57 msgid "" "The path at which to save the created .po file, such as /home/someuser/" "somefile.po ." msgstr "" "Cesta, kam se má uložit vytvoÅ™ený soubor .po, napÅ™. /home/uzivatel/" "nejakysoubor.po" #: ../glom/glom_export_po.cc:62 msgid "" "The locale whose translations should be written to the .po file, such as " "de_DE." msgstr "" "Národní prostÅ™edí, jehož pÅ™eklad by mÄ›l být zapsán do souboru .po, napÅ™. " "cs_CZ." #: ../glom/glom_export_po.cc:67 msgid "Generate a .pot template file instead of a .po file for a locale." msgstr "" "Generovat soubor se Å¡ablonou .pot místo souboru .po pro národní prostÅ™edí." #: ../glom/glom_export_po.cc:142 ../glom/glom_export_po_all.cc:130 #: ../glom/glom_import_po_all.cc:131 msgid "Please specify a glom file." msgstr "Zadejte prosím soubor glom." #: ../glom/glom_export_po.cc:149 msgid "Please use either the --locale-id option or the --template option." msgstr "Použijte prosím buÄ volbu --locale-id nebo volbu --template." #: ../glom/glom_export_po.cc:180 ../glom/glom_export_po_all.cc:161 msgid "Please specify an output path." msgstr "Zadejte prosím výstupní cestu." #: ../glom/glom_export_po.cc:220 msgid "Pot file creation failed." msgstr "VytvoÅ™ení souboru POT selhalo." #: ../glom/glom_export_po.cc:224 msgid "Pot file created at: %1" msgstr "Soubor POT vytvoÅ™en v: %1" #: ../glom/glom_export_po.cc:232 ../glom/glom_export_po_all.cc:223 msgid "Po file creation failed." msgstr "VytvoÅ™ení souboru PO selhalo." #: ../glom/glom_export_po.cc:236 ../glom/glom_export_po_all.cc:227 msgid "Po file created at: %1" msgstr "Soubor PO vytvoÅ™en v: %1" #: ../glom/glom_export_po_all.cc:55 msgid "" "The directory path at which to save the created .po files, such as /home/" "someuser/po_files/ ." msgstr "" "Složka, do které se mají uložit vytvoÅ™ené soubory .po, napÅ™. /home/uzivatel/" "po_files/" #: ../glom/glom_export_po_all.cc:143 ../glom/glom_import_po_all.cc:144 msgid "The Glom file does not exist." msgstr "Soubor aplikace Glom neexistuje." #: ../glom/glom_export_po_all.cc:153 ../glom/glom_import_po_all.cc:154 msgid "The Glom file path is a directory instead of a file." msgstr "Cesta k souboru Glom je složkou, místo aby se jednalo o soubor." #: ../glom/glom_export_po_all.cc:174 msgid "The ouput directory could not be created." msgstr "Výstupní složku nelze vytvoÅ™it." #: ../glom/glom_export_po_all.cc:182 msgid "Glom: The output file path is not a directory." msgstr "Glom: Cesta k výstupnímu souboru není cesta." #: ../glom/glom_export_po_all.cc:204 msgid "The Glom document has no translations." msgstr "Dokumentace k aplikaci Glom nemá žádné pÅ™eklady." #: ../glom/glom_import_po_all.cc:56 msgid "" "The path to a directory containing .po files, such as /home/someuser/" "po_files/ ." msgstr "Cesta ke složce obsahující soubory .po, napÅ™. /home/uzivatel/po_files/" #: ../glom/glom_import_po_all.cc:162 msgid "Please specify the path to a directory containing po files." msgstr "Zadejte prosím cestu ke složce obsahující soubory PO." #: ../glom/glom_import_po_all.cc:173 msgid "Glom: The po files directory path is not a directory." msgstr "Glom: Složka se soubory PO není složka." #: ../glom/glom_import_po_all.cc:213 msgid "Po file import failed for locale: %1" msgstr "Import souboru PO selhal pro národní prostÅ™edí: %1" #: ../glom/glom_import_po_all.cc:218 msgid "Po file imported for locale: %1 for file %2" msgstr "Soubor PO byl naimportován pro národní prostÅ™edí: %1 pro soubor %2" #: ../glom/glom_test_connection.cc:68 msgid "The hostname of the PostgreSQL server, such as localhost." msgstr "PoÄítaÄ se serverem PostgreSQL, napÅ™. localhost." #: ../glom/glom_test_connection.cc:84 msgid "The specific database on the PostgreSQL server (Optional)." msgstr "Konkrétní databáze na serveru PostgreSQL (volitelné)." #: ../glom/glom_test_connection.cc:156 msgid "Please provide a database username." msgstr "Zadejte prosím uživatelské jméno k databázi." #: ../glom/glom_test_connection.cc:220 msgid "" "Error: Could not connect to the server even without specifying a database." msgstr "Chyba: Nelze se pÅ™ipojit k serveru, ani bez udání databáze." #: ../glom/glom_test_connection.cc:228 msgid "Error: Could not connect to the specified database." msgstr "Chyba: Nelze se pÅ™ipojit k zadané databázi." #: ../glom/glom_test_connection.cc:234 msgid "Successful connection." msgstr "Úspěšné pÅ™ipojení." #: ../glom/main.cc:189 msgid "" "You seem to be running Glom as a user with administrator privileges. Glom " "may not be run with such privileges for security reasons.\n" "Please login to your system as a normal user." msgstr "" "Zdá se, že jste spustili Glom jako uživatel s administrátorskými právy. Glom " "nemůže být z bezpeÄnostních důvodů spuÅ¡tÄ›n s tÄ›mito právy.\n" "Prosím pÅ™ihlaste se do systému jako obyÄejný uživatel." #. Warn the user: #: ../glom/main.cc:203 msgid "" "You seem to be running Glom as root. Glom may not be run as root.\n" "Please login to your system as a normal user." msgstr "" "Zdá se, že Glom běží jako root. Glom nemůže být spuÅ¡tÄ›n jako root.\n" "Prosím pÅ™ihlaÅ¡te se k vaÅ¡emu systému jako běžný uživatel." #: ../glom/main.cc:209 msgid "Running As Root" msgstr "Běžící jako root" #. Show message to the user about the broken installation: #. This is a packaging bug, but it would probably annoy packagers to mention that in the dialog: #. Show message to the user about the broken installation: #: ../glom/main.cc:252 ../glom/main.cc:265 ../glom/main.cc:426 msgid "Incomplete Glom Installation" msgstr "Nekompletní instalace programu Glom" #. use_markup #. modal #: ../glom/main.cc:253 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "You may now install PostgreSQL to complete the Glom installation." msgstr "" "VaÅ¡e instalace Glomu není kompletní, protože PostgreSQL není na vaÅ¡em " "systému dostupná. PostgreSQL je vyžadována pro provoz databází Glomu.\n" "\n" "Nyní můžete nainstalovat PostgreSQL a instalace Glomu bude dokonÄena." #: ../glom/main.cc:255 msgid "Install PostgreSQL" msgstr "Instalovat PostgreSQL" #. use_markup #. modal #: ../glom/main.cc:266 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "VaÅ¡e instalace Glomu není kompletní, protože PostgreSQL není na vaÅ¡em " "systému dostupná. PostgreSQL je nutná pro hostování databází Glomu.\n" "\n" "Prosím nahlaÅ¡te tuto chybu vaÅ¡emu dodavateli nebo správci systému za úÄelem " "nápravy." #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:282 msgid "" "Your installation of Glom is not complete, because the Glom Python module is " "not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "VaÅ¡e instalace aplikace Glom není úplná, protože ve vaÅ¡em systému není " "dostupný modul Glom pro jazyk Python.\n" "\n" "Prosím nahlaste tuto chybu vaÅ¡emu dodavateli nebo správci systému za úÄelem " "nápravy." #: ../glom/main.cc:284 msgid "Glom Python Module Not Installed" msgstr "Modul Glom pro jazyk Python není nainstalovaný" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:297 msgid "" "Your installation of Glom is not complete, because the gi.repository Python " "module is not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "VaÅ¡e instalace aplikace Glom není úplná, protože ve vaÅ¡em systému není " "dostupný modul gi.repository pro jazyk Python.\n" "\n" "Prosím nahlaste tuto chybu vaÅ¡emu dodavateli nebo správci systému za úÄelem " "nápravy." #: ../glom/main.cc:299 msgid "gi.repository Python Module Not Installed" msgstr "Modul gi.repository pro jazyk Python není nainstalovaný" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:312 msgid "" "Your installation of Glom is not complete, because the gi.repository.Gda " "python module is not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "VaÅ¡e instalace aplikace Glom není úplná, protože ve vaÅ¡em systému není " "dostupný modul gi.repository.Gda pro jazyk Python.\n" "\n" "Prosím nahlaste tuto chybu vaÅ¡emu dodavateli nebo správci systému za úÄelem " "nápravy." #: ../glom/main.cc:314 msgid "gi.repository.Gda Python Module Not Installed" msgstr "Modul gi.repository.Gda pro jazyk Python není nainstalovaný" #. The Postgres provider was not found, so warn the user: #: ../glom/main.cc:424 msgid "" "Your installation of Glom is not complete, because the PostgreSQL libgda " "provider is not available on your system. This provider is needed to access " "Postgres database servers.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "VaÅ¡e instalace Glomu není kompletní, protože poskytovatel PostgreSQL libgda " "není na vaÅ¡em systému dostupný. Tento poskytovatel je nutný pro přístup k " "Postgres databázovým serverům.\n" "\n" "Prosím nahlaste chybu vaÅ¡emu dodavateli nebo správci systému za úÄelem " "nápravy." #: ../glom/main_local_options.cc:39 msgid "Extra Glom options" msgstr "Další pÅ™epínaÄe programu Glom" #: ../glom/main_local_options.cc:39 msgid "Extra command-line options for glom" msgstr "Další pÅ™epínaÄe příkazového řádku pro glom" #: ../glom/main_local_options.cc:52 msgid "Show how Glom outputs a date in this locale, then stop." msgstr "" "Ukáže, jak bude vypadat výstupní formám data pro tuto lokalizaci a skonÄí." #: ../glom/main_remote_options.cc:31 msgid "Main Glom options" msgstr "Hlavní pÅ™epínaÄe programu Glom" #: ../glom/main_remote_options.cc:31 msgid "Main command-line options for glom" msgstr "Hlavní pÅ™epínaÄe příkazového řádku pro glom" #: ../glom/main_remote_options.cc:39 msgid "The Filename" msgstr "Název souboru" #: ../glom/main_remote_options.cc:44 msgid "Whether the filename is a .tar.gz backup to be restored." msgstr "Zda je název souboru, který se má obnovit, záloha .tar.gz." #: ../glom/main_remote_options.cc:49 msgid "" "Do not automatically stop the database server if Glom quits. This is helpful " "for debugging with gdb." msgstr "" "Nezastavovat automaticky databázový server, když se ukonÄuje Glom. To je " "užiteÄné pro ladÄ›ní pomocí gdb." #: ../glom/main_remote_options.cc:54 msgid "Show the generated SQL queries on stdout, for debugging." msgstr "Zobrazit vygenerované SQL dotazy na standardním výstupu, pro ladÄ›ní." #. Don't add ContextLayout in client only mode because it would never #. be sensitive anyway #: ../glom/mode_data/box_data_calendar_related.cc:512 #: ../glom/mode_data/db_adddel/db_adddel.cc:249 #: ../ui/developer/window_data_layout.glade.h:1 msgid "Layout" msgstr "Rozložení" #: ../glom/mode_data/box_data.cc:190 msgid "" "This data cannot be stored in the database because you have not provided a " "primary key.\n" "Do you really want to discard this data?" msgstr "" "Tyto data nelze uložit v databázi, protože jste nezadali primární klíÄ.\n" "Opravdu chcete tato data zahodit?" #. Ask user to confirm loss of data: #: ../glom/mode_data/box_data.cc:192 msgid "No primary key value" msgstr "Žádná hodnota primárního klíÄe" #: ../glom/mode_data/box_data_details.cc:112 msgid "Create a new record." msgstr "VytvoÅ™it nový záznam" #: ../glom/mode_data/box_data_details.cc:113 msgid "Remove this record." msgstr "Odstranit tento záznam." #: ../glom/mode_data/box_data_details.cc:114 msgid "View the first record in the list." msgstr "Zobrazí první záznam v seznamu." #: ../glom/mode_data/box_data_details.cc:115 msgid "View the previous record in the list." msgstr "Zobrazí pÅ™edchozí záznam v seznamu." #: ../glom/mode_data/box_data_details.cc:116 msgid "View the next record in the list." msgstr "Zobrazí následující záznam v seznamu." #: ../glom/mode_data/box_data_details.cc:117 msgid "View the last record in the list." msgstr "Zobrazí poslední záznam v seznamu." #: ../glom/mode_data/box_data_details.cc:417 msgid "Layout Contains No Fields" msgstr "Sestava neobsahuje žádná pole" #: ../glom/mode_data/box_data_details.cc:417 msgid "" "There are no fields on the layout, so there is no way to enter data in a new " "record." msgstr "" "Sestava nebosahuje žádná pole, takže není možné zadat data do nového záznamu." #. Tell user that a primary key is needed to delete a record: #: ../glom/mode_data/box_data_details.cc:444 msgid "No primary key value." msgstr "Žádná hodnota primárního klíÄe." #: ../glom/mode_data/box_data_details.cc:445 msgid "This record cannot be deleted because there is no primary key." msgstr "Tento záznam nelze odstranit, protože chybí primární klíÄ." #. Warn user that they can't choose their own primary key: #: ../glom/mode_data/box_data_details.cc:854 msgid "Primary key auto increments" msgstr "Primární klÃ­Ä se automaticky inkrementuje" #: ../glom/mode_data/box_data_details.cc:855 msgid "" "The primary key is auto-incremented.\n" " You may not enter your own primary key value." msgstr "" "Primární klÃ­Ä je automaticky inkrementován.\n" " Nemůžete zadat vaÅ¡i vlastní hodnotu primárního klíÄe." #: ../glom/mode_data/box_data_portal.cc:337 msgid "No Corresponding Record Exists" msgstr "Neexistují žádné odpovídající záznamy" #: ../glom/mode_data/box_data_portal.cc:337 msgid "" "No record with this value exists. Therefore navigation to the related record " "is not possible." msgstr "" "Neexistují záznamy s touto hodnotou a proto není možný pÅ™echod na " "související záznam." #: ../glom/mode_data/flowtablewithfields.cc:1166 #: ../glom/utility_widgets/notebooklabelglom.cc:75 #: ../glom/utility_widgets/notebooklabelglom.cc:116 msgid "New Group" msgstr "Nová skupina" #: ../glom/mode_data/flowtablewithfields.cc:1172 #: ../glom/mode_design/layout/dialog_layout_details.cc:736 msgid "notebook" msgstr "poznámkový blok" #. Note to translators: This is the default name (not seen by most users) for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1178 msgid "tab1" msgstr "tab1" #. Note to translators: This is the default label text for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1181 msgid "Tab One" msgstr "Záložka" #: ../glom/mode_data/flowtablewithfields.cc:1194 msgid "button" msgstr "tlaÄítko" #: ../glom/mode_data/flowtablewithfields.cc:1195 #: ../glom/mode_design/layout/dialog_layout_details.cc:662 msgid "New Button" msgstr "Nové tlaÄítko" #. Note to translators: This is the default contents of a text item on a print layout: #: ../glom/mode_data/flowtablewithfields.cc:1201 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:457 msgid "text" msgstr "text" #: ../glom/mode_data/flowtablewithfields.cc:1202 msgid "New Text" msgstr "Nový text" #. TODO: Use a real English sentence here? #: ../glom/mode_data/flowtablewithfields.cc:1355 msgid "Delete whole group \"%1\"?" msgstr "Odstranit celou skupinu „%1“?" #. TODO: Use a real English sentence here: #: ../glom/mode_data/flowtablewithfields.cc:1361 msgid "Delete whole group?" msgstr "Odstranit celou skupinu?" #. Translators: This is a title, not an action. #: ../glom/mode_data/notebook_data.cc:73 msgid "List Or Details View" msgstr "Zobrazení Seznamu nebo Podrobností" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/box_db_table_relationships.cc:47 msgid "" "This relationship already exists. Please choose a different relationship name" msgstr "Relace již existuje. Prosím zvolte jiný název relace" #. Translators: FROM as in SQL's FROM #: ../glom/mode_design/box_db_table_relationships.cc:52 msgid "From Field" msgstr "Od pole" #: ../glom/mode_design/box_db_table_relationships.cc:54 msgid "To Field" msgstr "Do pole" #: ../glom/mode_design/box_db_table_relationships.cc:55 #: ../ui/developer/dialog_layout_field_properties.glade.h:3 msgid "Allow Editing" msgstr "Povolit úpravy" #: ../glom/mode_design/box_db_table_relationships.cc:56 msgid "Automatic Creation" msgstr "Automatické vytváření" #: ../glom/mode_design/box_db_table_relationships.cc:58 #: ../glom/navigation/box_tables.cc:143 msgid "Title (Singular Form)" msgstr "Název (jednotné Äíslo)" #: ../glom/mode_design/dialog_database_preferences.cc:63 msgid "Next Value" msgstr "Následující hodnota" #: ../glom/mode_design/dialog_design.cc:53 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:640 #: ../ui/developer/window_design.glade.h:3 msgid "None selected" msgstr "Nic nevybráno" #: ../glom/mode_design/dialog_initial_password.cc:83 msgid "Username Is Empty" msgstr "Prázdné uživatelské jméno" #: ../glom/mode_design/dialog_initial_password.cc:83 msgid "Please enter a login name for the new user." msgstr "Prosím zadejte pÅ™ihlaÅ¡ovací jméno nového uživatele." #: ../glom/mode_design/dialog_initial_password.cc:88 #: ../glom/mode_design/users/dialog_user.cc:58 msgid "Passwords Do Not Match" msgstr "Hesla se neshodují" #: ../glom/mode_design/dialog_initial_password.cc:88 #: ../glom/mode_design/users/dialog_user.cc:58 msgid "" "The entered password does not match the entered password confirmation. " "Please try again." msgstr "" "Zadané heslo se neshoduje se zadaným potvrzením hesla. Prosím zadejte jej " "zhovu." #: ../glom/mode_design/dialog_initial_password.cc:93 #: ../glom/mode_design/users/dialog_user.cc:63 msgid "Password Is Empty" msgstr "Heslo je prázdné" #: ../glom/mode_design/dialog_initial_password.cc:93 #: ../glom/mode_design/users/dialog_user.cc:63 msgid "Please enter a password for this user." msgstr "Prosím zadejte heslo pro tohoto uživatele." #. Don't allow adding of fields that already exist. #: ../glom/mode_design/fields/box_db_table_definition.cc:56 #: ../glom/mode_design/fields/box_db_table_definition.cc:339 msgid "This field already exists. Please choose a different field name" msgstr "Toto pole již existuje. Prosím vyberte pro pole jiný název" #: ../glom/mode_design/fields/box_db_table_definition.cc:60 msgid "Type" msgstr "Typ" #. TODO: Only show this when there are > 100 records? #: ../glom/mode_design/fields/box_db_table_definition.cc:269 msgid "Recalculation Required" msgstr "Vyžadováno pÅ™epoÄítání" #: ../glom/mode_design/fields/box_db_table_definition.cc:270 msgid "" "You have changed the calculation used by this field so Glom must recalculate " "the value in all records. If the table contains many records then this could " "take a long time." msgstr "" "ZmÄ›nili jste výpoÄet použitý tímto polem a proto musí Glom pÅ™epoÄítat " "hodnoty ve vÅ¡ech záznamech. Jestliže tabulka obsahuje mnoho záznamů, může " "akce trvat dlouho." #: ../glom/mode_design/fields/box_db_table_definition.cc:275 msgid "Recalculate" msgstr "PÅ™epoÄítat" #: ../glom/mode_design/fields/box_db_table_definition.cc:284 msgid "Invalid database structure" msgstr "Neplatná strutkura databáze" #: ../glom/mode_design/fields/box_db_table_definition.cc:285 msgid "" "This database field was created or edited outside of Glom. It has a data " "type that is not supported by Glom. Your system administrator may be able to " "correct this." msgstr "" "Toto databázové pole bylo vytvoÅ™eno nebo upraveno mimo Glom. Má typ dat, " "který Glom nepodporuje. Váš správce systému to možná bude moci opravit." #: ../glom/mode_design/fields/box_db_table_definition.cc:293 msgid "Primary key required" msgstr "OÄekáván primární klíÄ" #: ../glom/mode_design/fields/box_db_table_definition.cc:294 msgid "" "You may not unset the primary key because the table must have a primary key. " "You may set another field as the primary key instead." msgstr "" "Nemůžete odebrat primární klíÄ, protože tabulka jej musí obsahovat. Místo " "toho můžete jako primární klÃ­Ä použít jiné pole." #: ../glom/mode_design/fields/box_db_table_definition.cc:306 msgid "Field contains empty values." msgstr "Pole obsahuje prázdné hodnoty." #: ../glom/mode_design/fields/box_db_table_definition.cc:306 msgid "" "The field may not yet be used as a primary key because it contains empty " "values." msgstr "" "Pole nemůže být použito jako primární klíÄ, protože obsahuje přázdné hodnoty." #: ../glom/mode_design/fields/box_db_table_definition.cc:315 msgid "Field contains non-unique values." msgstr "Pole obsahuje nejedineÄné hodnoty." #: ../glom/mode_design/fields/box_db_table_definition.cc:315 msgid "" "The field may not yet be used as a primary key because it contains values " "that are not unique." msgstr "" "Tato pole nemůže být použito jako primární klíÄ, protože neobsahuje unikátní " "hodnoty." #. Ask the user to confirm this major change: #: ../glom/mode_design/fields/box_db_table_definition.cc:320 msgid "Change primary key" msgstr "ZmÄ›na primárního klíÄe" #: ../glom/mode_design/fields/box_db_table_definition.cc:321 msgid "" "Are you sure that you wish to set this field as the primary key, instead of " "the existing primary key?" msgstr "" "Opravdu si pÅ™ejete nastavit tuto pole jako primární klÃ­Ä místo souÄasného " "primárního klíÄe?" #: ../glom/mode_design/fields/box_db_table_definition.cc:326 msgid "Change Primary Key" msgstr "ZmÄ›na primárního klíÄe" #. Warn the user and refuse to make the change: #: ../glom/mode_design/fields/box_db_table_definition.cc:338 msgid "Field Name Already Exists" msgstr "Název pole již existuje" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:103 msgid "Calculation Error" msgstr "Chyba výpoÄtu" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:103 msgid "The calculation does not have a return statement." msgstr "VýpoÄet nemá návratovou hodnotu." #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:148 msgid "Calculation result" msgstr "Výsledek výpoÄtu" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:148 msgid "" "The result of the calculation is:\n" "%1" msgstr "" "Výsledek výpoÄtu je:\n" "%1" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:150 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc:140 msgid "Calculation failed" msgstr "VýpoÄet selhal" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:150 #, c-format msgid "" "The calculation failed with this error:\n" "%s" msgstr "" "VýpoÄet selhal s touto chybou:\n" "%s" #: ../glom/mode_design/fields/dialog_fielddefinition.cc:159 msgid "Default Value" msgstr "Výchozí hodnota" #. A special "None" item, allowing the user to do the equivalent of clearing the combobox, #. which is not normally possible with the GtkComboBox UI: #. set_property() does not work with a const gchar*, so we explicitly create a ustring. #. otherwise we get this warning: #. " unable to set property `text' of type `gchararray' from value of type `glibmm__CustomPointer_Pc' " #. TODO: Add a template specialization to Glib::ObjectBase::set_property() to allow this? #: ../glom/mode_design/layout/combobox_fields.cc:216 msgid "(None)" msgstr "(Nic)" #: ../glom/mode_design/layout/combobox_relationship.cc:268 msgid " Via: %1::%2" msgstr " Pomocí: %1::%2" #: ../glom/mode_design/layout/combobox_relationship.cc:272 msgid " Via: %1" msgstr " Pomocí: %1" #: ../glom/mode_design/layout/dialog_layout_calendar_related.cc:239 #: ../glom/mode_design/layout/dialog_layout_list_related.cc:294 msgid "None: No visible tables are specified by the fields." msgstr "None: Žádné viditelné tabulky specifikované poli." #. Columns-count column: #. Note to translators: This is the number of columns in a group (group being a noun) #: ../glom/mode_design/layout/dialog_layout_details.cc:129 msgid "Group Columns" msgstr "Skupina sloupců" #. Column-Width column: (only for list views) #. Note to translators: This is a name (the width of a UI element in the display), not an action. #: ../glom/mode_design/layout/dialog_layout_details.cc:142 msgid "Display Width" msgstr "Šířka zobrazení" #: ../glom/mode_design/layout/dialog_layout_details.cc:687 msgid "Text Title" msgstr "Text nadpisu" #: ../glom/mode_design/layout/dialog_layout_details.cc:712 msgid "Image Title" msgstr "Nadpis obrázku" #: ../glom/mode_design/layout/dialog_layout_details.cc:867 msgid "group" msgstr "skupina" #: ../glom/mode_design/layout/dialog_layout_details.cc:959 #: ../ui/developer/dialog_notebook.glade.h:1 msgid "Notebook Tabs" msgstr "Záložky poznámkového bloku" #: ../glom/mode_design/layout/dialog_layout_details.cc:959 msgid "Add child groups to the notebook to add tabs." msgstr "PÅ™idá do po poznámkového bloku dceÅ™inné skupiny pro pÅ™idání karet." #: ../glom/mode_design/layout/dialog_layout_details.cc:1122 msgid "Related Calendar: %1" msgstr "Související kalendář: %1" #: ../glom/mode_design/layout/dialog_layout_details.cc:1124 msgid "Related List: %1" msgstr "Související seznam: %1" #: ../glom/mode_design/layout/dialog_layout_details.cc:1141 msgid "Field: %1" msgstr "Pole: %1" #: ../glom/mode_design/layout/dialog_layout_details.cc:1200 msgid "(Notebook)" msgstr "(Poznámkový blok)" #. Append the View columns: #: ../glom/mode_design/layout/dialog_layout_export.cc:55 msgid "Fields" msgstr "Pole" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:406 msgid "Invalid Relationship" msgstr "Neplatná relace" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:407 msgid "" "The relationship may not be used to show related records because the " "relationship does not specify a field in the related table." msgstr "" "Vzájemnou relaci nelze použít pro zobrazení odpovídajících záznamů, protože " "relace nemá urÄené pole v odkazované tabulce." #: ../glom/mode_design/layout/dialog_layout_list_related.cc:413 msgid "Relationship Uses a Related Primary Key" msgstr "Relace používající přísluÅ¡ný primární klíÄ" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:414 msgid "" "The relationship may not be used to show related records because the " "relationship uses a primary key field in the related table, which must " "contain unique values. This would prevent the relationship from specifying " "multiple related records." msgstr "" "Vzájemnou relaci nelze použít pro zobrazení odpovídajících záznamů, protože " "relace používá primární klÃ­Ä v odkazované tabulce, který musí obsahovat " "jedineÄné hodnoty. To by mÄ›lo zabrání vzniku vícenásobnému odkazu." #: ../glom/mode_design/layout/dialog_layout_list_related.cc:420 msgid "Relationship Uses a Related Unique Field" msgstr "Relace používající přísluÅ¡ný jednoznaÄné pole" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:421 msgid "" "The relationship may not be used to show related records because the " "relationship uses a unique-values field in the related table. This would " "prevent the relationship from specifying multiple related records." msgstr "" "Vzájemnou relaci nelze použít pro zobrazení odpovídajících záznamů, protože " "relace používá pole s jedineÄnou hodnotou v odkazované tabulce. To by mÄ›lo " "zabrání vzniku vícenásobnému odkazu." #. Translators: This is Automatic text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:115 msgid "Automatic" msgstr "Automaticky" #. Translators: This is Left text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:119 msgid "Left" msgstr "Vlevo" #. Translators: This is Right text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:123 msgid "Right" msgstr "Vpravo" #. Give it access to the document. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:166 msgid "Extra Fields" msgstr "Doplňující pole" #. Give it access to the document. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:174 msgid "Sort Order" msgstr "PoÅ™adí Å™azení" #. Add labels (because we will hide the checkboxes): #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:201 msgid "Font" msgstr "Písmo" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:204 msgid "Foreground Color" msgstr "Barva popÅ™edí" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:207 msgid "Background Color" msgstr "Barva pozadí" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc:140 msgid "" "The calculation failed with this error:\n" "%1" msgstr "" "VýpoÄet selhal s touto chybou:\n" "%1" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc:33 #: ../ui/developer/dialog_fieldslist.glade.h:2 #: ../ui/developer/dialog_group_by.glade.h:4 #: ../ui/developer/window_data_layout.glade.h:23 msgid "Formatting" msgstr "Formátování" #. Give it access to the document. #: ../glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc:161 msgid "Group By - Secondary Fields" msgstr "Seskupovat podle - sekundárních polí" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_sortfields.cc:59 msgid "Ascending" msgstr "VzestupnÄ›" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #: ../glom/mode_design/report_layout/dialog_layout_report.cc:155 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:206 msgid "Part" msgstr "Část" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/print_layouts/box_print_layouts.cc:98 msgid "This item already exists. Please choose a different item name" msgstr "Tato položka již existuje. Prosím zadejte jiný název položky" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:226 msgid "Are you sure that you want to rename this print layout?" msgstr "Opravdu chcete pÅ™ejmenovat tuto sestavu?" #. TODO: Show old and new names? #: ../glom/mode_design/print_layouts/box_print_layouts.cc:227 msgid "Rename Print Layout" msgstr "PÅ™ejmenovat rozvržení tisku" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:229 #: ../glom/navigation/box_tables.cc:403 msgid "Rename" msgstr "PÅ™ejmenovat" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:30 #: ../glom/utility_widgets/layouttoolbar.cc:32 msgid "Items" msgstr "Položky" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:31 msgid "Lines" msgstr "Řady" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:32 msgid "Records" msgstr "Záznamy" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:34 #: ../glom/utility_widgets/layouttoolbar.cc:39 msgid "Database Field" msgstr "Databázové pole" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:34 #: ../glom/utility_widgets/layouttoolbar.cc:39 msgid "Drag this to the layout to add a new database field." msgstr "PÅ™etažením na plochu pÅ™idáte nové databázové pole." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:36 #: ../glom/utility_widgets/layouttoolbar.cc:45 msgid "Drag this to the layout to add a new static text box." msgstr "PÅ™etažením na plochu pÅ™idáte nový textový rámeÄek." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:38 #: ../glom/utility_widgets/layouttoolbar.cc:47 msgid "Drag this to the layout to add a new static image." msgstr "PÅ™etažením na plochu pÅ™idáte nový statický obrázek." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:40 msgid "Horizontal Line" msgstr "Vodorovná Äára" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:40 msgid "Drag this to the layout to add a new horizontal line." msgstr "PÅ™etažením na plochu pÅ™idáte novou vodorovnou Äáru." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:42 msgid "Vertical Line" msgstr "Svislá Äára" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:42 msgid "Drag this to the layout to add a new vertical line." msgstr "PÅ™etažením na plochu pÅ™idáte novou svislou Äáru." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:44 #: ../glom/utility_widgets/layouttoolbar.cc:41 msgid "Related Records" msgstr "Související záznamy" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:44 msgid "Drag this to the layout to add a new related records portal." msgstr "PÅ™etažením na plochu pÅ™idáte nový portál souvisejících záznamů." #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:229 msgid "Unselect All" msgstr "ZruÅ¡it výbÄ›r vÅ¡eho" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:232 msgid "_Insert" msgstr "V_ložit" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:233 msgid "Insert _Field" msgstr "Vložit _pole" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:235 msgid "Insert _Text" msgstr "Vložit _text" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:237 msgid "Insert _Image" msgstr "Vložit _obrázek" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:239 msgid "Insert _Related Records" msgstr "Vložit související _záznamy" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:241 msgid "Insert _Horizontal Line" msgstr "Vložit _vodorovnou Äáru" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:243 msgid "Insert _Vertical Line" msgstr "Vložit _svislou Äáru" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:245 msgid "_Create Standard Layout" msgstr "_VytvoÅ™it standardní rozvržení" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:247 msgid "_Add Page" msgstr "PÅ™id_at stránku" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:249 msgid "_Delete Page" msgstr "O_dstranit stránku" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:253 msgid "_Align" msgstr "Z_arovnat" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:255 msgid "Align _Top" msgstr "Zarovnat na_horu" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:259 msgid "Align _Bottom" msgstr "Zarovnat _dolů" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:263 msgid "Align _Left" msgstr "Zarovnat v_levo" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:267 msgid "Align _Right" msgstr "Zarovnat vp_ravo" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:272 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:64 msgid "_View" msgstr "_Zobrazení" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:273 msgid "Show Grid" msgstr "Zobrazit mřížku" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:275 msgid "Show Rules" msgstr "Zobrazit pravítka" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:277 msgid "Show Outlines" msgstr "Zobrazit osnovu" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:281 msgid "Fit Page _Width" msgstr "ZvÄ›tÅ¡it na šíř_ku stránky" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:285 msgid "Zoom 200%" msgstr "ZvÄ›tÅ¡ení 200%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:293 msgid "Zoom 50%" msgstr "ZvÄ›tÅ¡ení 50%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:297 msgid "Zoom 25%" msgstr "ZvÄ›tÅ¡ení 25%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:753 msgid "Insert" msgstr "Vložit" #. Ask for confirmation: #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:914 msgid "Create Standard Layout" msgstr "VytvoÅ™ení standardního rozvržení" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:915 msgid "" "This is an experimental feature. It will remove all items from the print " "layout and then try to create a layout similar to the layout of the detail " "view." msgstr "" "Jedná se o experimentální funkci. Odstraní vÅ¡echny položky z tiskového " "rozvržení a po té zkusí vytvoÅ™it rozvržení s podobným rozložením jako v " "detailním zobrazení." #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:918 #: ../glom/mode_design/users/dialog_groups_list.cc:82 msgid "Create" msgstr "VytvoÅ™it" #. Ask the user to confirm: #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:958 msgid "Remove page" msgstr "OdstranÄ›ní stránky" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:959 msgid "" "Are you sure that you wish to remove the last page and any items on that " "page?" msgstr "" "Opravdu chcete odstranit poslední stránku a položky, které se na ní nachází?" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:962 msgid "Remove Page" msgstr "Odstranit stránku" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:59 msgid "Page _Setup" msgstr "Nastavení _stránky" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:65 msgid "Show _Grid" msgstr "Zobrazit _mřížku" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:475 msgid "Edit _Fields" msgstr "Upravit _pole" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:478 msgid "Edit _Relationships" msgstr "Up_ravit relace" #: ../glom/mode_design/script_library/dialog_script_library.cc:130 msgid "Remove library script" msgstr "Odstranit skript z knihovny" #: ../glom/mode_design/script_library/dialog_script_library.cc:131 msgid "" "Do you really want to delete this script? This data can not be recovered" msgstr "Opravdu chcete smazat tento skript? Tato data nemohou být vráceny zpÄ›t" #: ../glom/mode_design/users/dialog_groups_list.cc:76 msgid "View" msgstr "Zobrazit" #: ../glom/mode_design/users/dialog_groups_list.cc:79 msgid "Edit" msgstr "Upravit" #: ../glom/mode_design/users/dialog_groups_list.cc:85 #: ../glom/utility_widgets/layoutwidgetmenu.cc:47 #: ../glom/utility_widgets/layoutwidgetutils.cc:37 #: ../glom/utility_widgets/notebooklabelglom.cc:117 msgid "Delete" msgstr "Odstranit" #. TODO: Prevent deletion of standard groups #: ../glom/mode_design/users/dialog_groups_list.cc:218 msgid "Delete Group" msgstr "Odstranit skupinu" #: ../glom/mode_design/users/dialog_groups_list.cc:219 msgid "Are your sure that you wish to delete this group?" msgstr "Opravdu chcete odstranit tuto skupinu?" #: ../glom/mode_design/users/dialog_groups_list.cc:361 msgid "Full access." msgstr "Plný přístup." #. Append the View columns: #: ../glom/mode_design/users/dialog_users_list.cc:66 msgctxt "Users List" msgid "User" msgstr "Uživatel" #: ../glom/mode_design/users/dialog_users_list.cc:161 msgid "Delete User" msgstr "Odstranit uživatele" #: ../glom/mode_design/users/dialog_users_list.cc:162 msgid "Are your sure that you wish to delete this user?" msgstr "Opravdu chcete odstranit tohoto uživatele?" #: ../glom/mode_design/users/dialog_users_list.cc:187 msgid "Error Retrieving the List of Users" msgstr "Chyba pÅ™i získávání seznamu uživatelů" #: ../glom/mode_design/users/dialog_users_list.cc:188 msgid "" "Glom could not get the list of users from the database server. You probably " "do not have enough permissions. You should be a superuser." msgstr "" "Glom nemůže od databázového serveru získat seznam uživatelů. PravdÄ›podobnÄ› k " "tomu nemáte dostateÄná oprávnÄ›ní. MÄ›li byste být superuživateli." #: ../glom/mode_design/users/dialog_users_list.cc:412 msgid "Developer group may not be empty." msgstr "Skupina vývojářů nemůže být prázdná." #: ../glom/mode_design/users/dialog_users_list.cc:413 msgid "The developer group must contain at least one user." msgstr "Skupina vývojářů musí obsahovat alespoň jednoho uživatele." #. Prevent two tables with the same name from being added. #: ../glom/navigation/box_tables.cc:134 msgid "This table already exists. Please choose a different table name" msgstr "Tato tabulka již existuje. Prosím zadejte jiný název tabulky" #: ../glom/navigation/box_tables.cc:136 msgid "Hidden" msgstr "Skryté" #. TODO: This should really be a radio, but the use of AddDel makes it awkward to change that CellRenderer property. #: ../glom/navigation/box_tables.cc:140 msgid "Default" msgstr "Výchozí" #. Ask the user if they want us to try to cope with this: #: ../glom/navigation/box_tables.cc:236 msgid "Table Already Exists" msgstr "Tabulka již existuje" #: ../glom/navigation/box_tables.cc:237 msgid "" "This table already exists on the database server, though it is not mentioned " "in the .glom file. This should not happen. Would you like Glom to attempt to " "use the existing table?" msgstr "" "Tato tabulka již na databázovém serveru existuje a proto není uvedena v " "souboru .glom. Toto by se nemÄ›lo stávat. Chcete aby se Glom pokusil tuto " "tabulku použít?" #. TODO: Do not show tables that are not in the document. #: ../glom/navigation/box_tables.cc:297 msgid "" "You cannot delete this table, because there is no information about this " "table in the document." msgstr "" "Nemůžete odstranit tuto tabulku, protože v dokumentu o této tabulce nejsou " "žádné informace." #. Ask the user to confirm: #: ../glom/navigation/box_tables.cc:304 msgid "" "Are you sure that you want to delete this table?\n" "Table name: %1" msgstr "" "Opravdu chcete odstranit tuto tabulku?\n" "Název tabulky: %1" #: ../glom/navigation/box_tables.cc:305 msgid "Delete Table" msgstr "Odstranit tabulku" #: ../glom/navigation/box_tables.cc:400 msgid "Are you sure that you want to rename this table?" msgstr "Opravdu chcete pÅ™ejmenovat tuto tabulku?" #. TODO: Show old and new names? #: ../glom/navigation/box_tables.cc:401 msgid "Rename Table" msgstr "PÅ™ejmenovat tabulku" #: ../glom/navigation/box_tables.cc:443 msgid "Unknown Table" msgstr "Neznámá tabulka" #: ../glom/navigation/box_tables.cc:444 msgid "" "You cannot open this table, because there is no information about this table " "in the document." msgstr "" "Nemůžete otevřít tuto tabulku, protože o této tabulce v dokumentu nejsou " "žádné informace." #: ../glom/print_layout/canvas_layout_item.cc:263 #: ../glom/utility_widgets/layoutwidgetmenu.cc:39 msgid "Choose Field" msgstr "Zvolte pole" #: ../glom/print_layout/canvas_print_layout.cc:285 msgid "_Formatting" msgstr "_Formátování" #. Append the View columns: #: ../glom/mode_design/translation/window_translations.cc:66 msgid "Original" msgstr "Originál" #: ../glom/mode_design/translation/window_translations.cc:73 msgid "Translation" msgstr "PÅ™eklad" #. This is at the end, because it can contain a long description of the item's context. #: ../glom/mode_design/translation/window_translations.cc:79 msgid "Item" msgstr "Položka" #. Show the file-chooser dialog, to select an output .po file: #: ../glom/mode_design/translation/window_translations.cc:332 #: ../glom/mode_design/translation/window_translations.cc:372 msgid "Choose .po File Name" msgstr "Zvolte název souboru .po" #: ../glom/mode_design/translation/window_translations.cc:338 #: ../glom/mode_design/translation/window_translations.cc:377 msgid "Po files" msgstr "Soubory Po" #: ../glom/mode_design/translation/window_translations.cc:343 #: ../ui/developer/window_translations.glade.h:7 msgid "Export" msgstr "Export" #. Note to translators: "Import" here is an action verb - it's a button. #: ../glom/mode_design/translation/window_translations.cc:384 #: ../ui/developer/window_translations.glade.h:6 msgid "Import" msgstr "Import" #: ../glom/utility_widgets/adddel/adddel.cc:157 msgid "This item already exists. Please try again." msgstr "Tato položka již existuje. Prosím zkuste znovu." #. Something more specific and helpful. #: ../glom/utility_widgets/adddel/adddel.cc:161 msgid "Duplicate" msgstr "Duplicitní" #. Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. #: ../glom/mode_data/datawidget/combochoiceswithtreemodel.cc:477 msgid "Example" msgstr "Příklad" #. The GNOME HIG says that labels should have ":" at the end: #. http://library.gnome.org/devel/hig-book/stable/design-text-labels.html.en #: ../glom/mode_data/datawidget/datawidget.cc:74 msgid "%1:" msgstr "%1:" #. Let the user choose a date from a calendar dialog: #: ../glom/mode_data/datawidget/datawidget.cc:213 msgid "..." msgstr "…" #. TODO: A better label/icon for "Choose Date". #: ../glom/mode_data/datawidget/datawidget.cc:214 msgid "Choose a date from an on-screen calendar." msgstr "Vyberte datum v zobrazeném kalendáři." #: ../glom/mode_data/datawidget/datawidget.cc:224 msgid "Open the record identified by this ID, in the other table." msgstr "Otevřít záznam nalezený podle ID v jiné tabulce." #: ../glom/mode_data/datawidget/datawidget.cc:234 msgid "" "Enter search criteria to identify records in the other table, to choose an " "ID for this field." msgstr "" "Zadejte vyhledávací kritéria pro výbÄ›r záznamů v jiné tabulce, což umožní " "výbÄ›r ID pro toto pole." #: ../glom/mode_data/datawidget/datawidget.cc:239 msgid "" "Enter details for a new record in the other table, then use its ID for this " "field." msgstr "" "Zadejte podrobnosti pro nový záznam v jiné tabulce a pak použijte jeho ID " "pro toto pole." #: ../glom/mode_data/db_adddel/db_adddel.cc:78 msgid "Table Content" msgstr "Obsah tabulky" #. Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. #: ../glom/mode_data/db_adddel/db_adddel.cc:564 msgid "ExampleEg" msgstr "příklad" #: ../glom/mode_data/db_adddel/db_adddel.cc:2092 msgid "Right-click to layout, to specify the related fields." msgstr "" "Pokud chcete vybrat související pole, kliknÄ›te pravým tlaÄítkem na plochu." #. Tell user that they can't do that: #: ../glom/mode_data/db_adddel/db_adddel.cc:2309 msgid "Extra Related Records Not Possible" msgstr "Další související záznamy nejsou možné" #: ../glom/mode_data/db_adddel/db_adddel.cc:2310 msgid "" "You attempted to add a new related record, but there can only be one related " "record, because the relationship uses a unique key." msgstr "" "Pokusili jste se pÅ™idat nový související záznam, ale může být jen jeden " "související záznam, protože relace používá jedineÄný klíÄ." #: ../glom/mode_data/datawidget/dialog_choose_id.cc:90 #: ../glom/utility_widgets/imageglom.cc:774 #: ../ui/developer/dialog_choose_relationship.glade.h:4 #: ../ui/developer/dialog_field_summary.glade.h:3 #: ../ui/developer/dialog_group_by.glade.h:3 msgid "Select" msgstr "Vybrat" #: ../glom/mode_data/datawidget/dialog_choose_id.cc:107 msgid "You have not entered any quick find criteria." msgstr "Nezadali jste žádná kritéria rychlého hledání." #: ../glom/utility_widgets/dialog_image_load_progress.cc:105 msgid "Not enough memory available to load the image" msgstr "Nedostatek dostupné pamÄ›ti pro naÄtení obrázku" #: ../glom/utility_widgets/dialog_image_load_progress.cc:157 msgid "Error loading %1" msgstr "Chyba pÅ™i naÄítání %1" #: ../glom/utility_widgets/dialog_image_load_progress.cc:158 msgid "Error loading image" msgstr "Chyba pÅ™i naÄítání obrázku" #: ../glom/utility_widgets/dialog_image_save_progress.cc:135 msgid "Error Saving" msgstr "Chyba pÅ™i ukládání" #: ../glom/utility_widgets/dialog_image_save_progress.cc:136 msgid "Error saving image" msgstr "Chyba pÅ™i ukládání obrázku" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:82 msgid "New Database" msgstr "Nová databáze" #. For instance, an extra hint when saving from an example, saying that a new file must be saved. #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:99 msgid "" "Please choose a human-readable title for the new database. You can change " "this later in the database properties. It may contain any characters." msgstr "" "Prosím zadejte uživateli srozumitelný název databáze. Ten můžete pozdÄ›ji " "zmÄ›nit ve vlastnostech databáze. Nadpis může obsahovat libovolné znaky." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:105 #: ../ui/developer/window_field_definition_edit.glade.h:4 #: ../ui/developer/window_report_layout.glade.h:7 msgid "_Title:" msgstr "_Nadpis:" #. Use titles that show the distinction between PostgreSQL and SQLite: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:121 msgid "" "Create PostgreSQL database in its own folder, to be hosted by this computer." msgstr "" "VytvoÅ™it databázi PostgreSQL ve vlastní složce, pro provoz na tomto poÄítaÄi." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:125 msgid "" "Create database on an external PostgreSQL database server, to be specified " "in the next step." msgstr "" "VytvoÅ™it databázi na vzdáleném databázovém serveru PostgreSQL, který urÄíte " "v dalším kroku." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:131 msgid "" "Create SQLite database in its own folder, to be hosted by this computer." msgstr "" "VytvoÅ™it databázi SQLite ve vlastní složce, pro provoz na tomto poÄítaÄi." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:132 msgid "" "SQLite does not support authentication or remote access but is suitable for " "embedded devices." msgstr "" "SQLite nepodporuje ověřování a vzdálený přístup, ale je vhodná pro různá " "samostatná zařízení." #. TODO: Hide this because it's the only radio button, so it's not a choice: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:142 msgid "" "Create database in its own folder, to be hosted by this computer, using " "SQLite" msgstr "" "VytvoÅ™it databázi ve vlastní složce, pro provoz na tomto poÄítaÄi, použít " "SQLite." #. Only PostgreSQL: #. Use titles that don't mention the boring name of the backend: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:151 msgid "Create database in its own folder, to be hosted by this computer." msgstr "VytvoÅ™it databázi ve vlastní složce, pro provoz na tomto poÄítaÄi." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:155 msgid "" "Create database on an external database server, to be specified in the next " "step." msgstr "" "VytvoÅ™it databázi na vzdáleném databázovém serveru, který urÄíte v dalším " "kroku." #: ../glom/utility_widgets/imageglom.cc:659 msgid "Images" msgstr "Obrázky" #: ../glom/utility_widgets/imageglom.cc:680 msgid "Save Image" msgstr "Uložení obrázku" #: ../glom/utility_widgets/imageglom.cc:767 msgid "Choose Image" msgstr "Zvolte obrázek" #: ../glom/utility_widgets/imageglom.cc:929 msgid "Open With" msgstr "Otevřít pomocí" #: ../glom/utility_widgets/imageglom.cc:931 msgid "Choose File" msgstr "Zvolte soubor" #: ../glom/utility_widgets/layouttoolbar.cc:33 msgid "Containers" msgstr "Kontejnery" #: ../glom/utility_widgets/layouttoolbar.cc:35 msgid "Drag this to the layout to add a new group." msgstr "PÅ™etažením na plochu pÅ™idáte novou skupinu." #: ../glom/utility_widgets/layouttoolbar.cc:37 msgid "Drag this to the layout to add a new notebook." msgstr "PÅ™etažením na plochu pÅ™idáte nový poznámkový blok." #: ../glom/utility_widgets/layouttoolbar.cc:41 msgid "Drag this to the layout to add a new Related Record." msgstr "PÅ™etažením na plochu pÅ™idáte nový související záznam." #: ../glom/utility_widgets/layouttoolbar.cc:43 msgid "Drag this to the layout to add a new button." msgstr "PÅ™etažením na plochu pÅ™idáte nové tlaÄítko." #: ../glom/utility_widgets/layoutwidgetmenu.cc:40 msgid "Field Layout Properties" msgstr "Vlastnosti rozložení polí" #: ../glom/utility_widgets/layoutwidgetmenu.cc:41 #: ../ui/developer/window_data_layout.glade.h:8 msgid "Add Field" msgstr "PÅ™idat pole" #: ../glom/utility_widgets/layoutwidgetmenu.cc:42 #: ../ui/developer/window_data_layout.glade.h:19 msgid "Add Related Records" msgstr "PÅ™idat související záznamy" #: ../glom/utility_widgets/layoutwidgetmenu.cc:43 #: ../ui/developer/window_data_layout.glade.h:17 msgid "Add Notebook" msgstr "PÅ™idat záložku" #: ../glom/utility_widgets/layoutwidgetmenu.cc:44 msgid "Add Group" msgstr "PÅ™idat skupinu" #: ../glom/utility_widgets/layoutwidgetmenu.cc:45 #: ../ui/developer/window_data_layout.glade.h:13 msgid "Add Button" msgstr "PÅ™idat tlaÄítko" #: ../glom/utility_widgets/layoutwidgetmenu.cc:46 #: ../ui/developer/window_data_layout.glade.h:10 msgid "Add Text" msgstr "PÅ™idat text" #: ../glom/utility_widgets/layoutwidgetutils.cc:36 msgid "Properties" msgstr "Vlastnosti" #: ../glom/utility_widgets/notebooklabelglom.cc:90 msgid "Delete whole notebook \"%1\"?" msgstr "Smazat celý poznámkový blok „%1“?" #: ../glom/utility_widgets/notebooklabelglom.cc:95 msgid "Delete whole notebook?" msgstr "Smazat celý poznámkový blok?" #: ../ui/operator/box_navigation_tables.glade.h:2 msgid "_Show hidden tables" msgstr "Zobrazovat _skryté tabulky" #: ../ui/operator/dialog_choose_date.glade.h:1 msgid "Choose Date" msgstr "Vyberte datum" #: ../ui/operator/dialog_choose_date.glade.h:2 msgid "" "Choose Date\n" "\n" "Please select a date to enter in this field." msgstr "" "Vyberte data\n" "\n" "Zvolte prosím datum, které do tohoto pole vložíte." #: ../ui/operator/dialog_connection.glade.h:1 msgid "Connect to Server" msgstr "PÅ™ipojit k serveru" #: ../ui/operator/dialog_connection.glade.h:2 msgid "Please enter the connection details for your database server." msgstr "Zadejte prosím podrobnosti o pÅ™ipojení k vaÅ¡emu databázovému serveru." #: ../ui/operator/dialog_connection.glade.h:3 msgid "Host" msgstr "Hostitel" #: ../ui/operator/dialog_connection.glade.h:4 msgid "Password" msgstr "Heslo" #: ../ui/operator/dialog_connection.glade.h:5 #: ../ui/developer/dialog_choose_user.glade.h:5 #: ../ui/developer/dialog_user.glade.h:1 msgid "User" msgstr "Uživatel" #: ../ui/operator/dialog_connection.glade.h:6 msgid "_Host:" msgstr "P_oÄítaÄ:" #: ../ui/operator/dialog_connection.glade.h:7 msgid "Database:" msgstr "Databáze:" #: ../ui/operator/dialog_connection.glade.h:8 #: ../ui/developer/dialog_initial_password.glade.h:3 msgid "_User:" msgstr "_Uživatel:" #: ../ui/operator/dialog_connection.glade.h:9 #: ../ui/developer/dialog_initial_password.glade.h:4 msgid "_Password:" msgstr "_Heslo:" #: ../ui/operator/dialog_connection.glade.h:10 msgid "Database" msgstr "Databáze" #: ../ui/operator/dialog_data_invalid_format.glade.h:1 msgid "" "Invalid format\n" "\n" "The data in the field was not recognized. Please try to correct the data or " "revert to the previous value. Here is an example of correctly-formatted data " "for this field.\n" msgstr "" "Neplatný formát\n" "\n" "Data v poli nebyla rozpoznána. Zkuste prosím opravit data nebo se vrátit k " "pÅ™edchozí hodnotÄ›. Zde je příklad správnÄ› formátovaných dat pro toto pole.\n" #: ../ui/operator/dialog_data_invalid_format.glade.h:5 msgid "example data format" msgstr "ukázkový formát data" #: ../ui/operator/dialog_existing_or_new.glade.h:1 msgid "Welcome to Glom" msgstr "Vítejte v aplikaci Glom" #: ../ui/operator/dialog_existing_or_new.glade.h:2 #: ../ui/developer/dialog_choose_field.glade.h:2 msgid "_Select" msgstr "_Vybrat" #: ../ui/operator/dialog_existing_or_new.glade.h:3 msgid "Open or create a Document" msgstr "" "OtevÅ™e nebo vytvoří dokument" #: ../ui/operator/dialog_existing_or_new.glade.h:4 msgid "Open or create Document" msgstr "Otevřít nebo vytvoÅ™it dokument" #: ../ui/operator/dialog_existing_or_new.glade.h:5 msgid "Open Existing Document" msgstr "0tevřít existující dokument" #: ../ui/operator/dialog_existing_or_new.glade.h:6 msgid "Create New Document" msgstr "VytvoÅ™it nový dokument" #: ../ui/operator/dialog_find_id.glade.h:1 #: ../ui/operator/dialog_new_record.glade.h:1 msgid "Find Related Record" msgstr "Hledat související záznam" #: ../ui/operator/dialog_find_id.glade.h:2 #: ../ui/operator/dialog_new_record.glade.h:2 #: ../ui/developer/window_data_layout_export.glade.h:2 #: ../ui/developer/window_data_layout.glade.h:2 #: ../ui/developer/window_design.glade.h:2 #: ../ui/developer/window_report_layout.glade.h:2 msgid "Table:" msgstr "Tabulka:" #: ../ui/operator/dialog_find_id.glade.h:3 #: ../ui/operator/dialog_new_record.glade.h:3 msgid "table_name" msgstr "název_tabulky" #: ../ui/operator/dialog_image_load_progress.glade.h:1 msgid "Loading image" msgstr "NaÄítá se obrázek" #: ../ui/operator/dialog_image_save_progress.glade.h:1 msgid "Saving Image" msgstr "Ukládá se obrázek" #: ../ui/operator/dialog_import_csv.glade.h:1 msgid "bla.blub - Import from CSV" msgstr "bla.blub - Import z CSV" #: ../ui/operator/dialog_import_csv.glade.h:3 #: ../ui/developer/box_formatting.glade.h:20 msgid "label" msgstr "nadpis" #: ../ui/operator/dialog_import_csv.glade.h:4 msgid "_First line as title" msgstr "_Použít první řádek jako nadpis" #: ../ui/operator/dialog_import_csv.glade.h:5 msgid "_Encoding:" msgstr "_Kódování:" #: ../ui/operator/dialog_import_csv.glade.h:6 msgid "Import Into _Table:" msgstr "Import do _tabulky:" #: ../ui/operator/dialog_import_csv.glade.h:7 msgid "Encoding detected as: UTF-8" msgstr "Kódování detekováno jako: UTF-8" #. Import is a noun here. This is the title for a window showing options for an import operation. #: ../ui/operator/dialog_import_csv.glade.h:9 msgid "Import Options" msgstr "Volby importu" #: ../ui/operator/dialog_import_csv.glade.h:10 msgid "_Number of sample rows:" msgstr "P_oÄet vzorových řádků:" #. Import is a noun here. This is the title for a list of fields to import. #: ../ui/operator/dialog_import_csv.glade.h:12 msgid "Import Fields" msgstr "Importovaná pole" #. This is a status message for a progress dialog. It says that importing is currently happenning. #: ../ui/operator/dialog_import_csv_progress.glade.h:2 msgid "Importing Data" msgstr "Import dat" #: ../ui/operator/dialog_import_csv_progress.glade.h:3 msgid "Please wait while your data is imported." msgstr "ÄŒekejte prosím, než se vaÅ¡e data naimportují." #: ../ui/developer/dialog_add_related_table.glade.h:1 msgid "Add Related Table" msgstr "PÅ™idat související tabulku" #: ../ui/developer/dialog_add_related_table.glade.h:2 msgid "" "This will add a new table and add a relationship that refers to the new " "table, as a convenient alternative to doing this in separate steps.\n" "\n" "If a suitable related table already exists then you should instead cancel " "and just add a relationship." msgstr "" "Tato volba pÅ™idá novou tabulku a relace na ni odkazuje. To je snazší volbou " "než nÄ›kolik oddÄ›lených kroků.\n" "\n" "Jestliže již vhodná související tabulka existuje, mÄ›li byste akci zruÅ¡it a " "pÅ™idat jen relaci." #. Translators: FROM as in SQL's FROM #: ../ui/developer/dialog_add_related_table.glade.h:6 msgid "From field:" msgstr "Od pole:" #: ../ui/developer/dialog_add_related_table.glade.h:7 msgid "Name of new related table:" msgstr "Název nové související tabulky:" #: ../ui/developer/dialog_add_related_table.glade.h:8 msgid "Name of new relationship:" msgstr "Název nové relace:" #: ../ui/developer/dialog_change_language.glade.h:1 msgid "Test Translation" msgstr "Testování pÅ™ekladu" #: ../ui/developer/dialog_change_language.glade.h:2 msgid "" "Test Translation\n" "\n" "Choose a language to use temporarily to test the translations. These " "translations are normally used automatically when the application is started " "on a computer that uses the language.\n" "\n" "Note that the standard parts of the Glom user interface, such as menus and " "dialog windows, will only be translated when you start Glom on a computer " "that uses that language." msgstr "" "Test Translation\n" "\n" "Vyberte jazyk pro doÄasné vyzkouÅ¡ení pÅ™ekladů. Tyto pÅ™eklady jsou běžnÄ› " "automaticky používány v případÄ›, že je aplikace spuÅ¡tÄ›na na poÄítaÄi, který " "jazyk používá.\n" "\n" "Upozorňujeme, že standardní souÄásti uživatelského rozhraní Glomu jako jsou " "nabídky a dialogová okna, bývají pÅ™eloženy pouze pokud Glom spustíte na " "poÄítaÄi který tento jazyk používá." #: ../ui/developer/dialog_change_language.glade.h:7 msgid "Locale:" msgstr "UmístÄ›ní:" #: ../ui/developer/dialog_choose_field.glade.h:1 msgid "Select Field" msgstr "Zvolte pole" #: ../ui/developer/dialog_choose_field.glade.h:3 msgid "Show _Related Relationships" msgstr "Zob_razit související relace" #: ../ui/developer/dialog_choose_field.glade.h:4 msgid "_Table:" msgstr "_Tabulka:" #: ../ui/developer/dialog_choose_relationship.glade.h:1 msgid "Select Relationship" msgstr "Zvolte relaci" #: ../ui/developer/dialog_choose_relationship.glade.h:2 msgid "Table:" msgstr "Tabulka:" #: ../ui/developer/dialog_choose_relationship.glade.h:3 msgid "Select Relationship" msgstr "Zvolte relaci" #: ../ui/developer/dialog_choose_user.glade.h:1 msgid "Choose User" msgstr "Zvolte uživatele" #: ../ui/developer/dialog_choose_user.glade.h:2 msgid "" "Add User To Group\n" "\n" "Which user should be added to this group?" msgstr "" "PÅ™idat uživatele do skupiny\n" "\n" "Který uživatel má být pÅ™idán do této skupiny?" #: ../ui/developer/dialog_database_preferences.glade.h:1 msgid "Database Preferences" msgstr "Nastavení databáze" #: ../ui/developer/dialog_database_preferences.glade.h:2 msgid "System Name:" msgstr "Název systému:" #: ../ui/developer/dialog_database_preferences.glade.h:3 msgid "Name:" msgstr "Název:" #: ../ui/developer/dialog_database_preferences.glade.h:4 msgid "Country:" msgstr "ZemÄ›:" #: ../ui/developer/dialog_database_preferences.glade.h:5 msgid "Zip/Postal Code:" msgstr "PSÄŒ:" #: ../ui/developer/dialog_database_preferences.glade.h:6 msgid "State/County:" msgstr "Stát/ZemÄ›:" #: ../ui/developer/dialog_database_preferences.glade.h:7 msgid "Town:" msgstr "MÄ›sto:" #: ../ui/developer/dialog_database_preferences.glade.h:8 msgid "Street (Line 2):" msgstr "Ulice (řádek 2):" #: ../ui/developer/dialog_database_preferences.glade.h:9 msgid "Street:" msgstr "Ulice:" #: ../ui/developer/dialog_database_preferences.glade.h:10 msgid "Address" msgstr "Adresa" #: ../ui/developer/dialog_database_preferences.glade.h:11 msgid "Organisation" msgstr "Organizace" #: ../ui/developer/dialog_database_preferences.glade.h:12 msgid "Logo" msgstr "Logo" #: ../ui/developer/dialog_database_preferences.glade.h:13 msgid "Auto-increment values" msgstr "Automaticky navyÅ¡ované hodnoty" #: ../ui/developer/dialog_database_preferences.glade.h:14 msgid "" "When the database is opened the python function implemented here will run." msgstr "" "Po otevÅ™ení databáze bude spuÅ¡tÄ›na funkce v jazyce python, kterou zde " "implementujete." #: ../ui/developer/dialog_database_preferences.glade.h:15 #: ../ui/developer/window_button_script.glade.h:4 #: ../ui/developer/window_field_calculation.glade.h:3 msgid "Test" msgstr "Test" #: ../ui/developer/dialog_database_preferences.glade.h:16 msgid "Startup Script" msgstr "SpouÅ¡tÄ›cí skript" #: ../ui/developer/dialog_error_create_database.glade.h:1 msgid "" "Database creation failed\n" "\n" "Glom could not create the new database. Maybe you do not have the necessary " "access rights. Please contact your system administrator." msgstr "" "Tvorba databáze selhala\n" "\n" "Glom nemohl vytvoÅ™it novou databázi. Možná nemáte potÅ™ebná oprávnÄ›ní. " "Kontaktujte prosím vaÅ¡eho správce systému." #: ../ui/developer/dialog_fieldslist.glade.h:1 #: ../ui/developer/dialog_sort_fields.glade.h:2 msgid "Table: " msgstr "Tabulka: " #: ../ui/developer/dialog_fieldslist.glade.h:3 #: ../ui/developer/window_data_layout.glade.h:24 msgid "Fields" msgstr "Pole" #: ../ui/developer/dialog_field_summary.glade.h:2 #: ../ui/developer/dialog_group_by.glade.h:2 #: ../ui/developer/box_formatting.glade.h:22 msgid "Field:" msgstr "Pole:" #: ../ui/developer/dialog_field_summary.glade.h:4 msgid "Summary Type:" msgstr "Typ souhrnu:" #: ../ui/developer/dialog_field_summary.glade.h:5 msgid "Summary Field" msgstr "Pole souhrnu" #: ../ui/developer/dialog_flowtable.glade.h:1 msgid "Group Properties" msgstr "Vlastnosti skupiny" #: ../ui/developer/dialog_flowtable.glade.h:2 msgid "Columns:" msgstr "PoÄet sloupců:" #: ../ui/developer/dialog_flowtable.glade.h:3 #: ../ui/developer/window_print_layout_edit.glade.h:4 msgid "Title:" msgstr "Nadpis:" #: ../ui/developer/dialog_group_by.glade.h:5 msgid "Sort Fields:" msgstr "SeÅ™adit pole:" #: ../ui/developer/dialog_group_by.glade.h:6 msgid "Secondary Fields:" msgstr "Sekundární pole:" #: ../ui/developer/dialog_group_by.glade.h:7 msgid "Border Width (ems)" msgstr "Šířka rámeÄku (ems)" #: ../ui/developer/dialog_group_by.glade.h:8 msgid "Group By" msgstr "Seskupovat podle" #: ../ui/developer/dialog_initial_password.glade.h:1 msgid "Database User" msgstr "Databázový uživatel" #: ../ui/developer/dialog_initial_password.glade.h:2 msgid "" "Please enter the initial connection details for your database. You may add " "additional users later. Remember to keep this password secret because it " "allows access to your data from other computers on the network." msgstr "" "Zadejte prosím podrobnosti úvodního pÅ™ipojení k vaší databázi. Další " "uživatele můžete pÅ™idat pozdÄ›ji. Nezapomeňte uchovat heslo utajené, protože " "umožňuje přístup k vaÅ¡im datům z dalších poÄítaÄů v síti." #: ../ui/developer/dialog_initial_password.glade.h:5 msgid "_Confirm Password:" msgstr "_PotvrÄte heslo:" #: ../ui/developer/dialog_initial_password.glade.h:6 #: ../ui/developer/dialog_new_group.glade.h:2 #: ../ui/developer/dialog_new_library_script.glade.h:2 msgid "C_reate" msgstr "_VytvoÅ™it" #: ../ui/developer/dialog_line.glade.h:1 #: ../ui/developer/window_textobject.glade.h:1 msgid "Text Object" msgstr "Textový objekt" #: ../ui/developer/dialog_line.glade.h:2 msgid "Line Width:" msgstr "Tloušťka Äáry:" #: ../ui/developer/dialog_line.glade.h:3 msgid "Color:" msgstr "Barva:" #: ../ui/developer/dialog_layout_field_properties.glade.h:1 msgid "Field Layout" msgstr "Rozložení polí" #: ../ui/developer/dialog_layout_field_properties.glade.h:2 msgid "Field:" msgstr "Pole:" #: ../ui/developer/dialog_layout_field_properties.glade.h:4 msgid "Use default field title: " msgstr "Použít výchozí nadpis pole: " #: ../ui/developer/dialog_layout_field_properties.glade.h:5 msgid "Use custom title:" msgstr "Použít vlastní nadpis:" #: ../ui/developer/dialog_layout_field_properties.glade.h:6 msgid "Title" msgstr "Nadpis" #: ../ui/developer/dialog_layout_field_properties.glade.h:7 msgid "Use default formatting" msgstr "Použít výchozí formátování" #: ../ui/developer/dialog_layout_field_properties.glade.h:8 msgid "Use custom formatting" msgstr "Použít vlastní formátování" #: ../ui/developer/dialog_layout_field_properties.glade.h:9 msgid "Formatting" msgstr "Formátování" #: ../ui/developer/dialog_new_group.glade.h:1 #: ../ui/developer/dialog_new_library_script.glade.h:1 msgid "Create Group" msgstr "VytvoÅ™it skupinu" #: ../ui/developer/dialog_new_group.glade.h:3 msgid "" "Create Group\n" "\n" "What name should this group have?" msgstr "" "VytvoÅ™it skupinu\n" "\n" "Jaký má skupina mít název?" #: ../ui/developer/dialog_new_group.glade.h:6 msgid "Group name:" msgstr "Název skupiny:" #: ../ui/developer/dialog_new_library_script.glade.h:3 msgid "" "Add Module\n" "\n" "What name should this module have?" msgstr "" "PÅ™idat rozšíření\n" "\n" "Jaký má mít rozšíření název?" #: ../ui/developer/dialog_new_library_script.glade.h:6 msgid "Script name:" msgstr "Název skriptu:" #: ../ui/developer/dialog_notebook.glade.h:2 msgid "Notebook Tabs" msgstr "Karty poznámek" #: ../ui/developer/dialog_relationships_overview.glade.h:1 msgid "Relationships Overview" msgstr "PÅ™ehled relací" #: ../ui/developer/dialog_script_library.glade.h:1 msgid "Script Library" msgstr "K_nihovna skriptů" #: ../ui/developer/dialog_script_library.glade.h:2 msgid "" "These modules will be available to your button scripts and field " "calculations via the python import keyword." msgstr "" "Tyto moduly budou zpřístupnÄ›ny vaÅ¡im skriptům pro tlaÄítka a výpoÄty pole " "pomocí klíÄového slova pythonu import." #: ../ui/developer/dialog_script_library.glade.h:3 msgid "Module name:" msgstr "Název modulu:" #. Translators: This is the verb. It is for checking that a Python script works. #: ../ui/developer/dialog_script_library.glade.h:5 msgid "_Check" msgstr "Z_kontrolovat" #: ../ui/developer/dialog_sort_fields.glade.h:1 msgid "Group By - Sort Fields" msgstr "Seskupovat podle - třídících polí" #: ../ui/developer/dialog_sort_fields.glade.h:3 msgid "Sort Fields" msgstr "SeÅ™adit pole" #: ../ui/developer/dialog_translation_copy.glade.h:1 #: ../ui/developer/dialog_translation_identify_original.glade.h:1 msgid "Identify Original" msgstr "Vyberte originál" #: ../ui/developer/dialog_translation_copy.glade.h:2 msgid "" "Copy Translation\n" "\n" "From what language would you like to copy the translations to use as the " "start of the current translation?" msgstr "" "Kopírovat pÅ™eklad\n" "\n" "Ze kterého jazyka chcete kopírovat pÅ™eklad jako zaÄátek tohoto pÅ™ekladu?" #: ../ui/developer/dialog_translation_copy.glade.h:5 #: ../ui/developer/dialog_translation_identify_original.glade.h:7 msgid "Language:" msgstr "Jazyk:" #: ../ui/developer/dialog_translation_identify_original.glade.h:2 msgid "" "Identify Original\n" "\n" "The language of the original text is currently identified as:" msgstr "" "Rozpoznání originálu\n" "\n" "Jazyk originálního textu je momentálnÄ› popsán jako:" #: ../ui/developer/dialog_translation_identify_original.glade.h:5 msgid "English" msgstr "AngliÄtina" #: ../ui/developer/dialog_translation_identify_original.glade.h:6 msgid "" "If the text is not actually in this language, please choose the correct " "language." msgstr "Jestli text není právÄ› v tomto jazyce, prosím vyberte správný jazyk." #: ../ui/developer/dialog_user.glade.h:2 msgid "Group:" msgstr "Skupina:" #: ../ui/developer/dialog_user.glade.h:3 msgid "Password:" msgstr "Heslo:" #: ../ui/developer/dialog_user.glade.h:4 msgid "Confirm Password:" msgstr "Potvrzení hesla:" #: ../ui/developer/dialog_user.glade.h:5 msgid "User:" msgstr "Uživatel:" #: ../ui/developer/dialog_user.glade.h:6 msgid "User" msgstr "Uživatel" #: ../ui/developer/window_button_script.glade.h:1 msgid "Button Script" msgstr "Skript tlaÄítka" #: ../ui/developer/window_button_script.glade.h:2 #: ../ui/developer/window_data_layout.glade.h:6 #: ../ui/developer/window_imageobject.glade.h:2 #: ../ui/developer/window_textobject.glade.h:2 msgid "Title:" msgstr "Nadpis:" #: ../ui/developer/window_button_script.glade.h:3 msgid "" "When the button is clicked it will run the python function which you " "implement here." msgstr "" "Po stisku tlaÄítka bude spuÅ¡tÄ›na funkce v jazyce python, kterou zde " "implementujete." #: ../ui/developer/window_data_layout_export.glade.h:1 msgid "Export Format" msgstr "Formát exportu" #: ../ui/developer/window_data_layout.glade.h:3 #: ../ui/developer/window_report_layout.glade.h:3 msgid "table name" msgstr "název tabulky" #: ../ui/developer/window_data_layout.glade.h:4 msgid "Relationship:" msgstr "Relace:" #: ../ui/developer/window_data_layout.glade.h:5 msgid "Show child relationships" msgstr "Zobrazit zdÄ›dÄ›né relace" #: ../ui/developer/window_data_layout.glade.h:7 msgid "" "Add a layout item that shows the data from a field in the record, and allows " "the user to edit that value." msgstr "" "PÅ™idat položku sestavy, která zobrazí data z pole v záznamu, a umožní " "uživateli upravovat hodnotu." #: ../ui/developer/window_data_layout.glade.h:9 msgid "" "Add text to a layout, such as an explanation or a warning. The text will be " "the same for every record viewed." msgstr "" "PÅ™idejte do sestavy text jako například popis nebo varování. Text bude " "stejný pro vÅ¡echny zobrazené záznamy." #: ../ui/developer/window_data_layout.glade.h:11 msgid "" "Add an image to the layout, such as a logo. The image will be the same for " "every record viewed. To show an image field from a record, to show different " "images for each field, use the field layout item." msgstr "" "PÅ™idá do sestavy obrázek, jako napÅ™. logo. Pro každý záznam bude zobrazen " "stejný. Pro zobrazení obrázku pole ze záznamu, tedy různého obrázku pro " "každé pole, použijte položku sestavy pole." #: ../ui/developer/window_data_layout.glade.h:12 msgid "" "Add a button. Edit the button to define the script that will be run when the " "button is clicked." msgstr "" "PÅ™idá tlaÄítko. Upravením tlaÄítka lze definovat skript, který bude proveden " "pÅ™i stisku tlaÄítka." #: ../ui/developer/window_data_layout.glade.h:14 msgid "" "Add a group which can contain other layout items. Use this to group items " "together, such as fields." msgstr "" "PÅ™idá skupinu, která může obsahovat další položky sestavy. Používá se pro " "seskupování polí dohromady." #: ../ui/developer/window_data_layout.glade.h:15 msgid "Add _Group" msgstr "PÅ™idat _skupinu" #: ../ui/developer/window_data_layout.glade.h:16 msgid "" "Add a tabbed notebook. Each page of the notebook may contain several other " "layout items, but only one page will be visible at one time." msgstr "" "PÅ™idá poznámkový blok s kartami. Každá stránka poznámkového bloku může " "obsahovat nÄ›kolik různých vrstev položek, ale v jednom okamžiku může být " "viditelná pouze jedna stránka." #: ../ui/developer/window_data_layout.glade.h:18 msgid "" "Add a related records portal. This is a list of records in a related table. " "Remember to edit this layout item to specify the relationship to use, and " "the fields to show from the related table." msgstr "" "PÅ™idat portál souvisejících záznamů. Toto je seznam záznamů v související " "tabulce. Nezapomeňte upravit tuto položku sestavy pro urÄení použité relace " "a zobrazovaných polí ze související tabulky." #: ../ui/developer/window_data_layout.glade.h:20 msgid "" "Add a related records calendar portal. This is a calendar showing records " "from a related table. Remember to edit this layout item to specify the " "relationship to use, and the fields to show from the related table." msgstr "" "PÅ™idá související záznamy portálu kalendáře. Tento kalendář zobrazuje " "záznamy z odkazované tabulky. Nezapomeňte upravit tuto položku sestavy pro " "urÄení použité relace a zobrazených polí z odkazované tabulky." #: ../ui/developer/window_data_layout.glade.h:21 msgid "Add Related Calendar" msgstr "PÅ™idat související kalendář" #: ../ui/developer/window_data_layout.glade.h:22 msgid "" "Remove the item from the layout. If you remove a field layout item, it will " "not remove the field from the table itself. It just will not be seen on the " "layout." msgstr "" "Odebere pole z této sestavy. Odebráním pole ze sestavy jej neodstraníte ze " "samotné tabulky nebude odebrána. Jen nebude v sestavÄ› vidÄ›t." #: ../ui/developer/window_data_layout.glade.h:25 msgid "" "Clicking the row button takes the user to the table specified by this " "relationship:" msgstr "" "Kliknutím na tlaÄítko řádku pÅ™enese uživatele do tabulky urÄené touto relací:" #: ../ui/developer/window_data_layout.glade.h:26 msgid "Automatic:" msgstr "Automatické:" #: ../ui/developer/window_data_layout.glade.h:27 msgid "None" msgstr "Nic" #: ../ui/developer/window_data_layout.glade.h:28 msgid "Navigation" msgstr "Navigace" #: ../ui/developer/window_data_layout.glade.h:29 msgid "Date Field:" msgstr "Pole s datem:" #: ../ui/developer/window_data_layout.glade.h:30 msgid "Dates" msgstr "Data" #: ../ui/developer/window_data_layout.glade.h:31 msgid "Minimum number of rows:" msgstr "Minimální poÄet řádků:" #: ../ui/developer/window_data_layout.glade.h:32 msgid "Show at least this many rows." msgstr "Zobrazit nejménÄ› tento poÄet řádků." #: ../ui/developer/window_data_layout.glade.h:33 msgid "Maximum number of rows:" msgstr "Maximální poÄet řádků:" #: ../ui/developer/window_data_layout.glade.h:34 msgid "Show no more than this many rows." msgstr "Nezobrazovat vÄ›tší než tento poÄet řádků." #: ../ui/developer/window_data_layout.glade.h:35 msgid "Row Line Width:" msgstr "Tloušťka Äáry mezi řádky:" #: ../ui/developer/window_data_layout.glade.h:36 msgid "Column Line Width:" msgstr "Tloušťka Äáry mezi sloupci:" #: ../ui/developer/window_data_layout.glade.h:37 msgid "Line Color:\n" msgstr "Barva Äáry:\n" #: ../ui/developer/window_data_layout.glade.h:39 msgid "Lines" msgstr "Čáry" #: ../ui/developer/window_design.glade.h:1 msgid "Field Definitions" msgstr "Definice pole" #: ../ui/developer/window_field_calculation.glade.h:1 msgid "Field Calculation" msgstr "VýpoÄet pole" #: ../ui/developer/window_field_calculation.glade.h:2 msgid "" "The field value will be the return value of the python function, which you " "implement here." msgstr "" "Hodnota tohoto pole bude návratová hodnota funkce v pythonu, kterou zde " "implementujete." #: ../ui/developer/window_field_calculation.glade.h:4 msgid "Triggered by:" msgstr "SpuÅ¡tÄ›no:" #: ../ui/developer/window_field_definition_edit.glade.h:1 msgid "Field Definition" msgstr "Definice pole" #: ../ui/developer/window_field_definition_edit.glade.h:2 msgid "_Name:" msgstr "_Název:" #: ../ui/developer/window_field_definition_edit.glade.h:3 msgid "Typ_e:" msgstr "_Typ:" #: ../ui/developer/window_field_definition_edit.glade.h:5 msgid "_Primary Key" msgstr "_Primární klíÄ" #: ../ui/developer/window_field_definition_edit.glade.h:6 msgid "_Unique" msgstr "_JedineÄný" #: ../ui/developer/window_field_definition_edit.glade.h:7 msgid "_Auto-increment" msgstr "_Automaticky navyÅ¡ovat" #: ../ui/developer/window_field_definition_edit.glade.h:9 msgid "_Lookup value when a field changes." msgstr "Vyh_ledat hodnotu, když se pole zmÄ›ní." #: ../ui/developer/window_field_definition_edit.glade.h:10 msgid "_Relationship:" msgstr "Vzta_h:" #: ../ui/developer/window_field_definition_edit.glade.h:11 msgid "_Field:" msgstr "_Pole:" #: ../ui/developer/window_field_definition_edit.glade.h:12 msgid "_User Entry" msgstr "_Uživatelská položka" #: ../ui/developer/window_field_definition_edit.glade.h:14 msgid "_Calculate Value" msgstr "Vy_poÄítat hodnotu" #: ../ui/developer/window_field_definition_edit.glade.h:15 msgid "Value" msgstr "Hodnota" #: ../ui/developer/window_field_definition_edit.glade.h:16 msgid "Default Formatting" msgstr "Výchozí formátování" #: ../ui/developer/box_formatting.glade.h:1 msgid "Use 1000s separator" msgstr "Používat oddÄ›lovaÄ tisíců" #: ../ui/developer/box_formatting.glade.h:2 msgid "" "If this is not selected then a thousands separator will not be used, even if " "your locale would normally use one. If it is selected then a thousands " "separator will be used only if your locale normally uses one." msgstr "" "Pokud toto není vybráno, nebude používán oddÄ›lovaÄ tisíců, i když by jej " "vaÅ¡e locale normálnÄ› používalo. Je-li toto vybráno, bude používán oddÄ›lovaÄ " "tisíců, jen pokud jej vaÅ¡e locale normálnÄ› používá." #: ../ui/developer/box_formatting.glade.h:3 msgid "Decimal Places" msgstr "Desetinná místa" #: ../ui/developer/box_formatting.glade.h:4 msgid "Currency Symbol" msgstr "Symbol mÄ›ny" #: ../ui/developer/box_formatting.glade.h:5 msgid "Alternative Color for Negative Values" msgstr "Alternativní barva pro záporné hodnoty" #: ../ui/developer/box_formatting.glade.h:6 msgid "" "Click this check box to use a different foreground color to display negative " "values." msgstr "" "Kliknutím na toto zaÅ¡krtávací pole použijete jinou barvu písma pro zobrazení " "záporných hodnot." #: ../ui/developer/box_formatting.glade.h:7 msgid "Numeric Formatting" msgstr "Formátování Äísel" #: ../ui/developer/box_formatting.glade.h:8 msgid "Horizontal Alignment:" msgstr "Vodorovné zarovnání:" #: ../ui/developer/box_formatting.glade.h:9 msgid "Multi-line" msgstr "Více řádků" #: ../ui/developer/box_formatting.glade.h:10 msgid "" "If this is selected then the field value will be shown in a multi-line box " "with a scrollbar." msgstr "" "Pokud je zvoleno, hodnota pole bude zobrazena ve víceřádkovém rámeÄku s " "posuvníkem." #: ../ui/developer/box_formatting.glade.h:11 msgid "Height (lines)" msgstr "Výška (řádků)" #: ../ui/developer/box_formatting.glade.h:12 msgid "Font:" msgstr "Písmo:" #: ../ui/developer/box_formatting.glade.h:13 msgid "Click this check box to use a non-standard font." msgstr "Kliknutím na toto zaÅ¡krtávací pole použijete nestandardní písmo." #: ../ui/developer/box_formatting.glade.h:14 msgid "Foreground Color:" msgstr "Barva popÅ™edí:" #: ../ui/developer/box_formatting.glade.h:15 msgid "Click this check box to use a non-standard foreground color." msgstr "Kliknutím na toto zaÅ¡krtávací pole použijete nestandardní barvu písma." #: ../ui/developer/box_formatting.glade.h:16 msgid "Background Color:" msgstr "Barva pozadí:" #: ../ui/developer/box_formatting.glade.h:17 msgid "Click this check box to use a non-standard background color." msgstr "" "Kliknutím na toto zaÅ¡krtávací pole použijete nestandardní barvu pozadí." #: ../ui/developer/box_formatting.glade.h:18 msgid "Text Formatting" msgstr "Formátování textu" #: ../ui/developer/box_formatting.glade.h:19 msgid "No Choices" msgstr "Žádné možnosti" #: ../ui/developer/box_formatting.glade.h:21 msgid "Relationship:" msgstr "Relace:" #: ../ui/developer/box_formatting.glade.h:23 msgid "Also show:" msgstr "Také zobrazit:" #: ../ui/developer/box_formatting.glade.h:24 msgid "Show all records" msgstr "Zobrazit vÅ¡echny záznamy" #: ../ui/developer/box_formatting.glade.h:25 msgid "" "If this option is selected then the choices will list values from all " "records in the related table. If this option is not selected then the " "choices will list values only from related records." msgstr "" "Pokud je tato volba vybrána, pak budou výbÄ›ry uvádÄ›t hodnoty ze vÅ¡ech " "záznamů v odpovídající tabulce. Pokud tato volba není vybrána, pak budou " "výbÄ›ry uvádÄ›t hodnoty jen z odpovídajících záznamů." #: ../ui/developer/box_formatting.glade.h:26 msgid "Sort Order:" msgstr "SeÅ™adit pole:" #: ../ui/developer/box_formatting.glade.h:27 msgid "Choices From Related Records" msgstr "Možnosti ze souvisejících záznamů" #: ../ui/developer/box_formatting.glade.h:28 msgid "Custom Choice List" msgstr "Vlastní seznam možností" #: ../ui/developer/box_formatting.glade.h:29 msgid "Restrict data to these choices" msgstr "Omezit data na tyto možnosti" #: ../ui/developer/box_formatting.glade.h:30 msgid "Display as radio buttons" msgstr "Zobrazit jako skupinové pÅ™epínaÄe" #: ../ui/developer/box_formatting.glade.h:31 msgid "Choices" msgstr "VýbÄ›ry" #: ../ui/developer/window_groups.glade.h:1 msgid "Groups" msgstr "Skupiny" #: ../ui/developer/window_groups.glade.h:2 #: ../ui/developer/window_users.glade.h:1 msgid "Users" msgstr "Uživatelé" #: ../ui/developer/window_groups.glade.h:3 msgid "Groups" msgstr "Skupiny" #: ../ui/developer/window_groups.glade.h:4 msgid "Tables" msgstr "Tabulky" #: ../ui/developer/window_imageobject.glade.h:1 msgid "Image Object" msgstr "Objekt obrázku" #: ../ui/developer/window_imageobject.glade.h:3 msgid "Image:" msgstr "Obrázek:" #: ../ui/developer/window_print_layout_edit.glade.h:1 msgid "Print Layout Editor" msgstr "Úpravy rozvržení tisku" #: ../ui/developer/window_print_layout_edit.glade.h:2 msgid "Table Name" msgstr "Název tabulky" #: ../ui/developer/window_print_layout_edit.glade.h:3 msgid "Layout name:" msgstr "Název rozvržení:" #: ../ui/developer/window_print_layout_edit.glade.h:5 msgid "X:" msgstr "X:" #: ../ui/developer/window_print_layout_edit.glade.h:6 msgid "Y:" msgstr "Y:" #: ../ui/developer/window_print_layout_edit.glade.h:7 msgid "Width:" msgstr "Šířka:" #: ../ui/developer/window_print_layout_edit.glade.h:8 msgid "Height:" msgstr "Výška:" #: ../ui/developer/window_report_layout.glade.h:1 msgid "Report Layout" msgstr "Rozložení sestavy" #: ../ui/developer/window_report_layout.glade.h:4 msgid "_Show table title" msgstr "_Zobrazit nadpis tabulky" #: ../ui/developer/window_report_layout.glade.h:5 msgid "" "When this is checked the table's title will be shown at the top of the " "report in addition to the report title." msgstr "" "Je-li zvoleno, nadpis tabulky bude navíc zobrazen na zaÄátku reportu spolu s " "názvem reportu." #: ../ui/developer/window_report_layout.glade.h:6 msgid "_Report name:" msgstr "Název _sestavy:" #: ../ui/developer/window_report_layout.glade.h:8 msgid "Available Parts" msgstr "Dostupné Äásti" #. Translators: The Main part of the report (not the footer or header) #: ../ui/developer/window_report_layout.glade.h:11 msgid "Main" msgstr "Hlavní" #: ../ui/developer/window_report_layout.glade.h:13 msgid "Parts" msgstr "Části" #: ../ui/developer/window_text_format.glade.h:1 msgid "Text Format" msgstr "Formát textu" #: ../ui/developer/window_textobject.glade.h:3 msgid "Text:" msgstr "Text:" #: ../ui/developer/window_translations.glade.h:1 msgid "Translations" msgstr "PÅ™eklady" #: ../ui/developer/window_translations.glade.h:2 msgid "Source Language:" msgstr "Zdrojový jazyk:" #: ../ui/developer/window_translations.glade.h:3 msgid "English" msgstr "Anglicky" #: ../ui/developer/window_translations.glade.h:4 msgid "Identify Source" msgstr "Vyberte zdroj" #: ../ui/developer/window_translations.glade.h:5 msgid "Target Language:" msgstr "Cílový jazyk:" #: ../ui/developer/window_translations.glade.h:8 msgid "Copy From Existing Translation" msgstr "Kopírovat z existujícího pÅ™ekladu" #: ../ui/developer/window_translations.glade.h:9 msgid "" "Start a translation for this target locale by copying the strings from " "another target locale." msgstr "" "ZaÄnÄ›te pÅ™eklad tohoto cílového jazyka nakopírováním Å™etÄ›zců z jiného " "cílového jazyka." #: ../ui/developer/window_translations.glade.h:10 msgid "Translations" msgstr "PÅ™eklady" #: ../ui/developer/window_users.glade.h:2 msgid "Group:" msgstr "Skupina:" #: ../ui/developer/window_users.glade.h:3 msgid "Users" msgstr "Uživatelé" glom-1.22.4/po/sq.po0000644000175000017500000001761612234776363015415 0ustar00murraycmurrayc00000000000000# Përkthimi i mesazheve të glom në shqip # This file is distributed under the same license as the glome package. # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # Laurent Dhima , 2004, 2005. # msgid "" msgstr "" "Project-Id-Version: glom HEAD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-02-22 03:20+0100\n" "PO-Revision-Date: 2005-02-22 11:18+0100\n" "Last-Translator: Laurent Dhima \n" "Language-Team: Albanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: glom/glom.glade.h:1 msgid "*" msgstr "*" #: glom/glom.glade.h:2 msgid "Connection" msgstr "Lidhja" #: glom/glom.glade.h:3 msgid "Field Definitions" msgstr "Përcaktimet e Fushës" #: glom/glom.glade.h:4 msgid "Fields" msgstr "Fushat" #: glom/glom.glade.h:5 msgid "Mode: " msgstr "Modaliteti: " #: glom/glom.glade.h:6 msgid "Select Field" msgstr "Zgjidh Fushën" #: glom/glom.glade.h:7 msgid "Select Relationship" msgstr "Zgjidh marëdhënien" #: glom/glom.glade.h:8 msgid "Table: " msgstr "Tabela: " #: glom/glom.glade.h:9 msgid "Tables in database" msgstr "Tabelat në databazë" #: glom/glom.glade.h:10 msgid "Title:" msgstr "Titulli:" #: glom/glom.glade.h:11 msgid "User Level: " msgstr "Niveli i përdoruesit: " #: glom/glom.glade.h:12 msgid "def calculate_field_value():" msgstr "përc calculate_field_value():" #: glom/glom.glade.h:13 msgid "" "Connect to Server\n" "\n" "Please enter the connection details for your database server." msgstr "" "Lidhu tek Serveri\n" "\n" "Shkruaj të dhënat e lidhjes për serverin tuaj të databazës." #: glom/glom.glade.h:16 msgid "" "Connection Failed\n" "\n" "Glom could not connect to the database server. Maybe you entered an " "incorrect user name or password, or maybe the postgres database server is " "not running." msgstr "" "Lidhja Dështoi\n" "\n" "Glom nuk arriti të lidhej me serverin e databazës suaj. Ndoshta keni dhënë " "një emër përdoruesi apo fjalëkalim të gabuar, ose ndoshta serveri postgres " "nuk është në ekzekutim." #: glom/glom.glade.h:19 msgid "" "Database creation failed\n" "\n" "Glom could not create the new database. Maybe you do not have the necessary " "access rights. Please contact your system administrator." msgstr "" "Krijimi i databazës dështoi\n" "\n" "Glom nuk arriti të krijojë databazën e re. Ndoshta të mungojnë të drejtat e duhura " "të hyrjes. Lidhu me administratorin e sistemit tuaj." #: glom/glom.glade.h:22 msgid "" "Database does not exist\n" "\n" "The database does not yet exist on the database server. Would you like to " "create the database with an empty structure?" msgstr "" "Databaza nuk ekziston\n" "\n" "Databaza nuk ekziston në server. Dëshiron të krijosh databazën me një strukturë " "bosh?" #: glom/glom.glade.h:25 msgid "" "Invalid format\n" "\n" "The data in the field was not recognised. Please try to correct the data or " "revert to the previous value. Here is an example of correctly-formatted data " "for this field.\n" msgstr "" "Format i pavlefshëm\n" "\n" "Të dhënat e fushave nuk janë të organizuara. Ju lutem përpiquni të " "korrigjoni të dhënat ose kthehuni tek vlerat e vjetra. Këtu keni një " "shembull me të dhënat e formatuara me korrektësi për këtë fushë.\n" #: glom/glom.glade.h:29 msgid "" "New Database\n" "\n" "Please choose a name and title for the new database. The name should not " "contain any spaces." msgstr "" "Databazë e re\n" "\n" "Zgjidh emrin dhe titullin për databazën e re. Emri nuk duhet të përmbajë " "asnjë lloj hapësire." #: glom/glom.glade.h:32 msgid "" "Open existing document, or create new " "document\n" "\n" "Would you like to open an existing document, to connect to an existing " "database?\n" "\n" "Or would you like to create a new document, to design a new database?\n" msgstr "" "Hap një dokument ekzistues, ose " "krijoni një dokument të ri\n" "\n" "Dëshironi të hapni një dokument ekzistues, për t'u lidhur me një databazë " "ekzistuese?\n" "\n" "Apo dëshironi të krijoni një dokument të ri, për të projektuar një databazë " "të re?\n" #: glom/glom.glade.h:38 msgid "" "Title\n" "\n" "Information text.\n" msgstr "" "Titulli\n" "\n" "Teksti informues.\n" #: glom/glom.glade.h:42 msgid "Add Related" msgstr "Shto relacion" #: glom/glom.glade.h:43 msgid "Add _Group" msgstr "Shto _Grupin" #: glom/glom.glade.h:44 msgid "Auto-increment" msgstr "Auto-increment" #: glom/glom.glade.h:45 msgid "Calculate value" msgstr "Llogarit vlerën" #: glom/glom.glade.h:46 msgid "Connect" msgstr "Lidhu" #: glom/glom.glade.h:47 msgid "Create" msgstr "Krijo" #: glom/glom.glade.h:48 msgid "Data" msgstr "Të dhëna" #: glom/glom.glade.h:49 msgid "Database" msgstr "Databazë" #: glom/glom.glade.h:50 msgid "Default Value" msgstr "Vlera e prezgjedhur" #: glom/glom.glade.h:51 msgid "Details Layout" msgstr "Planimetria e detajeve" #: glom/glom.glade.h:52 msgid "Edit" msgstr "Ndrysho" #: glom/glom.glade.h:53 msgid "Edit Definition" msgstr "Ndrysho përcaktimin" #: glom/glom.glade.h:54 msgid "Extra" msgstr "Shtesë" #: glom/glom.glade.h:55 msgid "Field" msgstr "Fusha" #: glom/glom.glade.h:56 msgid "Field Calculation" msgstr "Llogaritja e fushës" #: glom/glom.glade.h:57 msgid "Field Definition" msgstr "Përcaktimi i fushës" #: glom/glom.glade.h:58 msgid "Field Definitions" msgstr "Përcaktimet e fushës" #: glom/glom.glade.h:59 msgid "Glom" msgstr "Glom" #: glom/glom.glade.h:60 msgid "Host" msgstr "Host" #: glom/glom.glade.h:61 msgid "List Layout" msgstr "Planimetria e listës" #: glom/glom.glade.h:62 msgid "Lookup value when a field changes." msgstr "Kontrollo vlerat kur ndryshon një fushë." #: glom/glom.glade.h:63 msgid "Name" msgstr "Emri" #: glom/glom.glade.h:64 msgid "None selected" msgstr "Asnjë zgjedhje" #: glom/glom.glade.h:65 msgid "Password" msgstr "Fjalëkalimi" #: glom/glom.glade.h:66 msgid "Primary Key" msgstr "Kyçi primar" #: glom/glom.glade.h:67 msgid "Relationship" msgstr "Marrëdhënie" #: glom/glom.glade.h:68 msgid "Revert" msgstr "Rikthe" #: glom/glom.glade.h:69 msgid "Select" msgstr "Zgjidh" #: glom/glom.glade.h:70 msgid "Select Field" msgstr "Zgjidh fushën" #: glom/glom.glade.h:71 msgid "Select Relationship" msgstr "Zgjidh marrëdhëniet" #: glom/glom.glade.h:72 msgid "Show hidden tables" msgstr "Shfaq tabelat e fshehura" #: glom/glom.glade.h:73 msgid "Table:" msgstr "Tabela:" #: glom/glom.glade.h:74 msgid "Test" msgstr "Prova" #: glom/glom.glade.h:75 msgid "" "The field value will be the return value of the python function, which you " "implement here." msgstr "Vlera e fushës do të pasqyrojë vlerën e funksionit python, që plotësuat këtu." #: glom/glom.glade.h:76 msgid "Title" msgstr "Titulli" #: glom/glom.glade.h:77 msgid "Type" msgstr "Lloji" #: glom/glom.glade.h:78 msgid "Unique" msgstr "Unique" #: glom/glom.glade.h:79 msgid "User" msgstr "Përdoruesi" #: glom/glom.glade.h:80 msgid "example data format" msgstr "shembull formatimi të dhënash" #: glom/glom.glade.h:81 msgid "table name" msgstr "emri i tabelës" glom-1.22.4/po/ru.po0000644000175000017500000030252512234252646015405 0ustar00murraycmurrayc00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: glom\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-20 23:30+0200\n" "PO-Revision-Date: 2009-11-14 14:07+0700\n" "Last-Translator: Urmas \n" "Language-Team: None <->\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: n%10==1 && n%100!=11 ?0: n%10>=2 && n%10<=4 && (n%100<10 || n%" "100>=20)?1:2\n" "X-Poedit-Language: Russian\n" "X-Poedit-Country: RUSSIAN FEDERATION\n" "X-Poedit-SourceCharset: utf-8\n" #: ../glom/application.cc:148 msgid "Glom: Generating Encryption Certificates" msgstr "Glom: Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñертификатов шифрованиÑ" #: ../glom/application.cc:149 msgid "" "Please wait while Glom prepares your system for publishing over the network." msgstr "" #: ../glom/application.cc:176 msgid "(C) 2000-2005 Murray Cumming" msgstr "(C) 2000-2005 Мюррей Камминг" #: ../glom/application.cc:176 msgid "A Database GUI" msgstr "" #: ../glom/application.cc:263 ../glom/bakery/app_withdoc_gtk.cc:279 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:122 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:55 msgid "_File" msgstr "_Файл" #: ../glom/application.cc:264 ../glom/bakery/app_withdoc_gtk.cc:280 msgid "_Recent Files" msgstr "Ðе_давние файлы" #: ../glom/application.cc:272 msgid "Save As Example" msgstr "Сохранить как образец" #: ../glom/application.cc:279 msgid "_Export" msgstr "_ЭкÑпорт" #. Note to translators: "Import" here is an action verb - it's a button. #: ../glom/application.cc:282 ../glom/glom_developer.glade.h:151 #: ../glom/mode_design/translation/window_translations.cc:597 msgid "Import" msgstr "Импорт" #: ../glom/application.cc:286 msgid "Shared On Network" msgstr "СовмеÑтный доÑтуп" #: ../glom/application.cc:297 msgid "_Standard" msgstr "" #: ../glom/application.cc:301 msgid "_Edit Print Layouts" msgstr "" #: ../glom/application.cc:385 ../glom/frame_glom.cc:152 #: ../glom/frame_glom.cc:489 ../glom/utility_widgets/datawidget.cc:274 msgid "Find" msgstr "" #: ../glom/application.cc:385 msgid "Search for records in the table" msgstr "" #: ../glom/application.cc:389 msgid "Add Record" msgstr "" #: ../glom/application.cc:389 msgid "Create a new record in the table" msgstr "" #. "Tables" menu: #: ../glom/application.cc:405 msgid "_Tables" msgstr "_Таблицы" #: ../glom/application.cc:415 msgid "_Edit Tables" msgstr "" #: ../glom/application.cc:420 msgid "Add _Related Table" msgstr "" #. "Reports" menu: #: ../glom/application.cc:427 msgid "_Reports" msgstr "От_четы" #: ../glom/application.cc:430 msgid "_Edit Reports" msgstr "" #. "UserLevel" menu: #: ../glom/application.cc:438 msgid "_User Level" msgstr "" #: ../glom/application.cc:441 ../glom/application.cc:465 msgid "_Developer" msgstr "_Разработчик" #: ../glom/application.cc:445 msgid "_Operator" msgstr "_Оператор" #. "Mode" menu: #: ../glom/application.cc:451 msgid "_Mode" msgstr "_Режим" #. We remember this action, so that it can be explicitly activated later. #: ../glom/application.cc:456 msgid "D_ata" msgstr "_Данные" #: ../glom/application.cc:460 ../glom/frame_glom.cc:149 msgid "_Find" msgstr "_ПоиÑк" #: ../glom/application.cc:469 msgid "_Database Preferences" msgstr "" #: ../glom/application.cc:474 msgid "_Fields" msgstr "_ПолÑ" #: ../glom/application.cc:478 msgid "_Relationships Overview" msgstr "" #: ../glom/application.cc:482 msgid "_Relationships for this Table" msgstr "" #: ../glom/application.cc:486 msgid "_Users" msgstr "_Пользователи" #: ../glom/application.cc:490 msgid "_Print Layouts" msgstr "_Макеты печати" #: ../glom/application.cc:494 msgid "R_eports" msgstr "От_четы" #: ../glom/application.cc:498 msgid "Script _Library" msgstr "_Библиотека Ñценариев" #: ../glom/application.cc:503 msgid "_Layout" msgstr "_Макет" #: ../glom/application.cc:507 msgid "_Test Translation" msgstr "Про_верка перевода" #: ../glom/application.cc:511 msgid "_Translations" msgstr "Пере_воды" #. "Active Platform" menu: #: ../glom/application.cc:517 msgid "_Active Platform" msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¿_латформа" #: ../glom/application.cc:522 msgid "_Normal" msgstr "_ОбычнаÑ" #: ../glom/application.cc:522 msgid "The layout to use for normal desktop environments." msgstr "Форма Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ñ… рабочих окружений" #: ../glom/application.cc:527 msgid "_Maemo" msgstr "_Мaemo" #: ../glom/application.cc:527 msgid "The layout to use for Maemo devices." msgstr "Форма, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð½Ð° уÑтройÑтвах Maemo." #: ../glom/application.cc:532 msgid "_Show Layout Toolbar" msgstr "" #: ../glom/application.cc:666 ../glom/bakery/app_withdoc.cc:494 msgid "Open Failed." msgstr "" #: ../glom/application.cc:667 msgid "" "The document could not be opened because it was created or modified by a " "newer version of Glom." msgstr "" #. std::cout << " SOUP_STATUS_FORBIDDEN or SOUP_STATUS_UNAUTHORIZED" << std::endl; #. Warn the user, and let him try again: #: ../glom/application.cc:717 ../glom/frame_glom.cc:2363 #: ../glom/frame_glom.cc:2439 msgid "Connection Failed" msgstr "" #: ../glom/application.cc:717 ../glom/frame_glom.cc:2363 #: ../glom/frame_glom.cc:2439 msgid "" "Glom could not connect to the database server. Maybe you entered an " "incorrect user name or password, or maybe the postgres database server is " "not running." msgstr "" #: ../glom/application.cc:909 msgid "" "The file cannot be opened because this version of Glom does not support self-" "hosting of databases." msgstr "" #: ../glom/application.cc:914 ../glom/application.cc:923 msgid "" "The file cannot be opened because this version of Glom does not support " "PostgreSQL databases." msgstr "" #: ../glom/application.cc:931 msgid "" "The file cannot be opened because this version of Glom does not support " "SQLite databases." msgstr "" #. Warn the user. #: ../glom/application.cc:949 msgid "File Uses Unsupported Database Backend" msgstr "" #: ../glom/application.cc:1009 msgid "Creating From Example File" msgstr "Создание из образца" #: ../glom/application.cc:1010 msgid "" "To use this example file you must save an editable copy of the file. A new " "database will also be created on the server." msgstr "" #: ../glom/application.cc:1066 msgid "Opening Read-Only File." msgstr "Файл только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ" #: ../glom/application.cc:1067 msgid "" "This file is read only, so you will not be able to enter Developer mode to " "make design changes." msgstr "" #: ../glom/application.cc:1070 msgid "Continue without Developer Mode" msgstr "" #. The connection to the server is OK, but the database is not there yet. #: ../glom/application.cc:1128 msgid "Database Not Found On Server" msgstr "" #: ../glom/application.cc:1128 msgid "" "The database could not be found on the server. Please consult your system " "administrator." msgstr "" #: ../glom/application.cc:1527 msgid "_Contents" msgstr "_Содержание" #: ../glom/application.cc:1527 msgid "Help with the application" msgstr "" #: ../glom/application.cc:1625 msgid "Creating Glom Database" msgstr "Создание базы данных Glom" #: ../glom/application.cc:1625 msgid "Creating Glom database from example file." msgstr "" #. The save failed. Tell the user and don't do anything else: #: ../glom/application.cc:2149 ../glom/bakery/app_withdoc.cc:233 #: ../glom/bakery/app_withdoc.cc:284 msgid "Save failed." msgstr "" #: ../glom/application.cc:2149 ../glom/bakery/app_withdoc.cc:233 #: ../glom/bakery/app_withdoc.cc:284 msgid "" "There was an error while saving the file. Your changes have not been saved." msgstr "" #: ../glom/application.cc:2190 ../glom/application.cc:2195 #: ../glom/bakery/app_withdoc_gtk.cc:590 msgid "Save Document" msgstr "Сохранение документа" #. Warn the user: #: ../glom/application.cc:2283 ../glom/bakery/app_withdoc_gtk.cc:639 msgid "Read-only File." msgstr "" #: ../glom/application.cc:2283 ../glom/bakery/app_withdoc_gtk.cc:639 msgid "" "You may not overwrite the existing file, because you do not have sufficient " "access rights." msgstr "" #. Warn the user: #: ../glom/application.cc:2297 ../glom/bakery/app_withdoc_gtk.cc:653 msgid "Read-only Directory." msgstr "" #: ../glom/application.cc:2297 ../glom/bakery/app_withdoc_gtk.cc:653 msgid "" "You may not create a file in this directory, because you do not have " "sufficient access rights." msgstr "" #: ../glom/application.cc:2314 msgid "Database Title missing" msgstr "" #: ../glom/application.cc:2314 msgid "You must specify a title for the new database." msgstr "" #: ../glom/application.cc:2343 ../glom/frame_glom.cc:2088 msgid "Directory Already Exists" msgstr "" #: ../glom/application.cc:2343 ../glom/frame_glom.cc:2089 msgid "" "There is an existing directory with the same name as the directory that " "should be created for the new database files. You should specify a different " "filename to use a new directory instead." msgstr "" #: ../glom/application.cc:2553 ../glom/bakery/app_withdoc_gtk.cc:493 msgid " (read-only)" msgstr " (только чтение)" #: ../glom/base_db.cc:140 ../glom/base_db.cc:153 msgid "Internal error" msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°" #: ../glom/base_db.cc:1371 ../glom/mode_design/users/dialog_groups_list.cc:64 msgid "Description" msgstr "ОпиÑание" #: ../glom/base_db.cc:1378 msgid "Comments" msgstr "ПримечаниÑ" #: ../glom/base_db.cc:2126 msgid "Your find criteria did not match any records in the table." msgstr "" #: ../glom/base_db.cc:2131 msgid "No Records Found" msgstr "ЗапиÑей не найдено" #: ../glom/base_db.cc:2137 msgid "New Find" msgstr "" #: ../glom/base_db.cc:3223 msgid "Value Is Not Unique" msgstr "ПовторÑющееÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ" #: ../glom/base_db.cc:3223 msgid "" "The field's value must be unique, but a record with this value already " "exists." msgstr "" #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:317 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the relationship does not allow automatic creation " "of new related records." msgstr "" #: ../glom/base_db_table_data.cc:322 msgid "Related Record Does Not Exist" msgstr "СвÑÐ·Ð°Ð½Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не ÑущеÑтвует" #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:342 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the key in the related record is auto-generated and " "therefore can not be created with the key value in this record." msgstr "" #: ../glom/base_db_table_data.cc:347 msgid "Related Record Cannot Be Created" msgstr "" #. Ask the user for confirmation: #: ../glom/base_db_table_data.cc:449 msgid "" "Are you sure that you would like to delete this record? The data in this " "record will then be permanently lost." msgstr "" #: ../glom/base_db_table_data.cc:453 msgid "Delete record" msgstr "Удаление запиÑи" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #. Append the View columns: #: ../glom/box_reports.cc:90 ../glom/glom_developer.glade.h:161 #: ../glom/mode_design/box_db_table_relationships.cc:43 #: ../glom/mode_design/fields/box_db_table_definition.cc:53 #: ../glom/mode_design/layout/dialog_choose_field.cc:51 #: ../glom/mode_design/layout/dialog_choose_relationship.cc:52 #: ../glom/mode_design/layout/dialog_layout_details.cc:88 #: ../glom/mode_design/layout/dialog_layout_export.cc:52 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.cc:50 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.cc:49 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:45 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:90 #: ../glom/mode_design/users/dialog_groups_list.cc:60 msgid "Name" msgstr "ИмÑ" #. Don't allow a relationship to be added twice. #: ../glom/box_reports.cc:92 msgid "This report already exists. Please choose a different report name" msgstr "" #. Title column: #: ../glom/box_reports.cc:94 #: ../glom/mode_design/box_db_table_relationships.cc:47 #: ../glom/mode_design/fields/box_db_table_definition.cc:57 #: ../glom/mode_design/layout/dialog_choose_field.cc:52 #: ../glom/mode_design/layout/dialog_layout_details.cc:101 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:46 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:94 #: ../glom/navigation/box_tables.cc:133 #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:95 #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:99 msgid "Title" msgstr "Ðазвание" #: ../glom/box_reports.cc:226 msgid "Are you sure that you want to rename this report?" msgstr "" #. TODO: Show old and new names? #: ../glom/box_reports.cc:227 msgid "Rename Report" msgstr "Переименование" #. namespace Glom #: ../glom.desktop.in.in.h:1 msgid "A user-friendly database environment." msgstr "Ð”Ñ€ÑƒÐ¶ÐµÐ»ÑŽÐ±Ð½Ð°Ñ Ñреда ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ данных." #: ../glom.desktop.in.in.h:2 ../glom/glom.glade.h:25 msgid "Glom" msgstr "Glom" #: ../glom/dialog_connection.cc:224 msgid "Not yet created." msgstr "" #: ../glom/dialog_existing_or_new.cc:52 msgid "No recently used documents available." msgstr "" #: ../glom/dialog_existing_or_new.cc:53 msgid "No sessions found on the local network." msgstr "Ðет доÑтупных ÑеанÑов в локальной Ñети." #: ../glom/dialog_existing_or_new.cc:56 msgid "No templates available." msgstr "Ðет доÑтупных шаблонов" #: ../glom/dialog_existing_or_new.cc:111 msgid "Open a Document" msgstr "Открытие документа" #: ../glom/dialog_existing_or_new.cc:131 msgid "Select File" msgstr "Выбрать файл" #: ../glom/dialog_existing_or_new.cc:135 msgid "Local Network" msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть" #: ../glom/dialog_existing_or_new.cc:139 msgid "Recently Opened" msgstr "Ðедавние документы" #: ../glom/dialog_existing_or_new.cc:232 msgid "New Empty Document" msgstr "Ðовый, пуÑтой документ" #: ../glom/dialog_existing_or_new.cc:235 msgid "New From Template" msgstr "Из шаблона" #. Translator hint: This is on (via Network Interface such as eth0). #: ../glom/dialog_existing_or_new.cc:878 #, c-format msgid "%s on %s (via %s)" msgstr "%s на %s (через %s)" #: ../glom/filechooser_export.cc:32 msgid "Export To File." msgstr "" #: ../glom/filechooser_export.cc:35 msgid "Define Data _Format" msgstr "Задать _формат" #: ../glom/filechooser_export.cc:41 ../glom/glom_developer.glade.h:120 #: ../glom/mode_design/translation/window_translations.cc:518 msgid "Export" msgstr "ЭкÑпорт" #: ../glom/frame_glom.cc:136 ../glom/glom.glade.h:40 msgid "Quick Find" msgstr "" #: ../glom/frame_glom.cc:152 msgid "Search for records" msgstr "" #: ../glom/frame_glom.cc:195 msgid "Glom: Find" msgstr "" #. TODO: Obviously this document should have been deleted when the database-creation was cancelled. #. Note that "canceled" is the correct US spelling. #: ../glom/frame_glom.cc:402 msgid "No table" msgstr "" #: ../glom/frame_glom.cc:402 msgid "This database has no tables yet." msgstr "Ð’ базе данных еще нет таблиц." #: ../glom/frame_glom.cc:438 ../glom/glom.glade.h:19 msgid "Data" msgstr "" #: ../glom/frame_glom.cc:497 #: ../glom/libglom/data_structure/translatable_item.cc:320 #: ../glom/mode_design/translation/window_translations.cc:218 msgid "Unknown" msgstr "" #. TODO: Obviously this could be possible but it would require a network protocol and some work: #: ../glom/frame_glom.cc:570 msgid "Developer Mode Not Available." msgstr "Режим разработки недоÑтупен" #: ../glom/frame_glom.cc:571 msgid "" "Developer mode is not available because the file was opened over the network " "from a running Glom. Only the original file may be edited." msgstr "" #: ../glom/frame_glom.cc:577 msgid "Developer Mode Not Available" msgstr "" #: ../glom/frame_glom.cc:578 msgid "" "Developer mode is not available. Check that you have sufficient database " "access rights and that the glom file is not read-only." msgstr "" #: ../glom/frame_glom.cc:585 msgid "Saving in New Document Format" msgstr "" #: ../glom/frame_glom.cc:586 msgid "" "The document was created by an earlier version of the application. Making " "changes to the document will mean that the document cannot be opened by some " "earlier versions of the application." msgstr "" #: ../glom/frame_glom.cc:589 msgid "Continue" msgstr "Продолжить" #: ../glom/frame_glom.cc:638 msgid "Export Not Allowed." msgstr "" #: ../glom/frame_glom.cc:638 msgid "" "You do not have permission to view the data in this table, so you may not " "export the data." msgstr "" #: ../glom/frame_glom.cc:669 msgid "Could Not Create File." msgstr "" #: ../glom/frame_glom.cc:669 msgid "Glom could not create the specified file." msgstr "" #: ../glom/frame_glom.cc:871 msgid "No Table" msgstr "ОтÑутÑтвуют таблицы" #: ../glom/frame_glom.cc:871 msgid "There is no table in to which data could be imported." msgstr "" #: ../glom/frame_glom.cc:875 msgid "Choose a CSV file to open" msgstr "Выбор файла CSV" #: ../glom/frame_glom.cc:879 msgid "CSV files" msgstr "Файлы CSV" #: ../glom/frame_glom.cc:883 msgid "All files" msgstr "Ð’Ñе файлы" #: ../glom/frame_glom.cc:974 msgid "Share On Network" msgstr "СовмеÑтное иÑпользование" #: ../glom/frame_glom.cc:975 msgid "" "Are you sure that you wish to allow other users on the network to use this " "database?" msgstr "" #: ../glom/frame_glom.cc:978 msgid "_Share" msgstr "Открыть _доÑтуп" #. TODO: Warn about connected users if possible. #: ../glom/frame_glom.cc:1073 msgid "Stop Sharing On Network" msgstr "" #: ../glom/frame_glom.cc:1074 msgid "" "Are you sure that you wish to prevent other users on the network from using " "this database?" msgstr "" #: ../glom/frame_glom.cc:1077 msgid "_Stop Sharing" msgstr "Закрыть _доÑтуп" #: ../glom/frame_glom.cc:1305 msgid "Table Exists Already" msgstr "Таблица уже ÑущеÑтвует" #: ../glom/frame_glom.cc:1305 msgid "" "A table with this name already exists in the database. Please choose a " "different table name." msgstr "" #: ../glom/frame_glom.cc:1309 msgid "Relationship Exists Already" msgstr "" #: ../glom/frame_glom.cc:1309 msgid "" "A relationship with this name already exists for this table. Please choose a " "different relationship name." msgstr "" #: ../glom/frame_glom.cc:1313 msgid "More information needed" msgstr "" #: ../glom/frame_glom.cc:1313 msgid "You must specify a field, a table name, and a relationship name." msgstr "" #: ../glom/frame_glom.cc:1367 msgid "Related Table Created" msgstr "" #: ../glom/frame_glom.cc:1367 msgid "The new related table has been created." msgstr "" #: ../glom/frame_glom.cc:1397 ../glom/glom.glade.h:45 #: ../glom/navigation/box_tables.cc:128 msgid "Tables" msgstr "Таблицы" #: ../glom/frame_glom.cc:1476 ../glom/utility_widgets/dialog_choose_id.cc:105 msgid "You have not entered any quick find criteria." msgstr "" #: ../glom/frame_glom.cc:1481 ../glom/mode_data/box_data.cc:144 #: ../glom/utility_widgets/dialog_choose_id.cc:109 msgid "No Find Criteria" msgstr "" #. show user level: #: ../glom/frame_glom.cc:1541 msgid "Operator" msgstr "Оператор" #: ../glom/frame_glom.cc:1543 msgid "Developer" msgstr "Разработчик" #: ../glom/frame_glom.cc:2057 msgid "Initializing Database Data" msgstr "Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных" #: ../glom/frame_glom.cc:2066 msgid "Starting Database Server" msgstr "ЗапуÑк Ñервера" #: ../glom/frame_glom.cc:2074 msgid "Stopping Database Server" msgstr "ОÑтановка Ñервера" #: ../glom/frame_glom.cc:2093 msgid "Could Not Create Directory" msgstr "" #: ../glom/frame_glom.cc:2094 msgid "" "There was an error when attempting to create the directory for the new " "database files." msgstr "" #: ../glom/frame_glom.cc:2098 msgid "Could Not Start Database Server" msgstr "Ðе удалоÑÑŒ запуÑтить Ñервер" #: ../glom/frame_glom.cc:2099 msgid "There was an error when attempting to start the database server." msgstr "Ð’ процеÑÑе запуÑка Ñервера баз данных произошла ошибка." #. Show 0 instead of "all" when all of no records are found, to avoid confusion. #: ../glom/frame_glom.cc:2911 msgid "All" msgstr "" #. namespace Glom #: ../glom/glom_developer.glade.h:1 msgid "Add Related Table" msgstr "" #: ../glom/glom_developer.glade.h:2 msgid "Address" msgstr "" #: ../glom/glom_developer.glade.h:3 msgid "Available Parts" msgstr "" #: ../glom/glom_developer.glade.h:4 msgid "Choices" msgstr "" #: ../glom/glom_developer.glade.h:5 msgid "Dates" msgstr "" #: ../glom/glom_developer.glade.h:6 msgid "English" msgstr "ÐнглийÑкий" #: ../glom/glom_developer.glade.h:7 msgid "Field Definitions" msgstr "Определение полей" #: ../glom/glom_developer.glade.h:8 msgid "Field:" msgstr "" #: ../glom/glom_developer.glade.h:9 msgid "Fields" msgstr "" #: ../glom/glom_developer.glade.h:10 msgid "Formatting" msgstr "" #: ../glom/glom_developer.glade.h:11 msgid "Group By" msgstr "" #: ../glom/glom_developer.glade.h:12 msgid "Group:" msgstr "Группа:" #: ../glom/glom_developer.glade.h:13 msgid "Groups" msgstr "Группы" #: ../glom/glom_developer.glade.h:14 msgid "Image" msgstr "" #: ../glom/glom_developer.glade.h:15 msgid "Label:" msgstr "" #: ../glom/glom_developer.glade.h:16 msgid "Layout name:" msgstr "" #: ../glom/glom_developer.glade.h:17 msgid "Navigation" msgstr "" #: ../glom/glom_developer.glade.h:18 msgid "Notebook Tabs" msgstr "" #: ../glom/glom_developer.glade.h:19 msgid "Numeric Formatting" msgstr "" #: ../glom/glom_developer.glade.h:20 msgid "Parts" msgstr "" #: ../glom/glom_developer.glade.h:21 msgid "Print Layouts" msgstr "" #: ../glom/glom_developer.glade.h:22 msgid "Relationship:" msgstr "Отношение:" #: ../glom/glom_developer.glade.h:23 msgid "Relationships" msgstr "" #: ../glom/glom_developer.glade.h:24 msgid "Report name:" msgstr "Ð˜Ð¼Ñ Ð¾Ñ‚Ñ‡ÐµÑ‚Ð°:" #: ../glom/glom_developer.glade.h:25 msgid "Reports" msgstr "" #: ../glom/glom_developer.glade.h:26 msgid "Select Field" msgstr "" #: ../glom/glom_developer.glade.h:27 msgid "Select Relationship" msgstr "" #: ../glom/glom_developer.glade.h:28 msgid "Sort Fields" msgstr "" #: ../glom/glom_developer.glade.h:29 msgid "Source Language:" msgstr "Язык оригинала:" #: ../glom/glom_developer.glade.h:30 msgid "Summary Field" msgstr "" #: ../glom/glom_developer.glade.h:31 msgid "Table:" msgstr "Таблица: " #: ../glom/glom_developer.glade.h:32 msgid "Tables" msgstr "Таблицы" #: ../glom/glom_developer.glade.h:33 msgid "Target Language:" msgstr "Язык перевода:" #: ../glom/glom_developer.glade.h:34 msgid "Text Formatting" msgstr "" #: ../glom/glom_developer.glade.h:35 msgid "Text" msgstr "" #: ../glom/glom_developer.glade.h:36 msgid "Title:" msgstr "" #: ../glom/glom_developer.glade.h:37 msgid "Title" msgstr "" #: ../glom/glom_developer.glade.h:38 msgid "Translations" msgstr "Переводы" #: ../glom/glom_developer.glade.h:39 msgid "User" msgstr "" #: ../glom/glom_developer.glade.h:40 msgid "Users" msgstr "Пользователи" #: ../glom/glom_developer.glade.h:41 msgid "" "Add Module\n" "\n" "What name should this module have?" msgstr "" #: ../glom/glom_developer.glade.h:44 msgid "" "Add User To Group\n" "\n" "Which user should be added to this group?" msgstr "" #: ../glom/glom_developer.glade.h:47 msgid "" "Choose Date\n" "\n" "Please select a date to enter in this field." msgstr "" #: ../glom/glom_developer.glade.h:50 msgid "" "Copy Translation\n" "\n" "From what language would you like to copy the translations to use as the " "start of the current translation?" msgstr "" #: ../glom/glom_developer.glade.h:53 msgid "" "Create Group\n" "\n" "What name should this group have?" msgstr "" #: ../glom/glom_developer.glade.h:56 msgid "" "Database creation failed\n" "\n" "Glom could not create the new database. Maybe you do not have the necessary " "access rights. Please contact your system administrator." msgstr "" #: ../glom/glom_developer.glade.h:59 msgid "" "First User\n" "\n" "Please enter the initial connection details for your database. You may add " "additional users later. Remember to keep this password secret because it " "allows access to your data from other computers on the network." msgstr "" #: ../glom/glom_developer.glade.h:62 msgid "" "Identify Original\n" "\n" "The language of the original text is currently identified as:" msgstr "" "Определение оригинала\n" "\n" "Язык текÑта оригинала определен как:" #: ../glom/glom_developer.glade.h:65 msgid "" "Test Translation\n" "\n" "Choose a language to use temporarily to test the translations. These " "translations are normally used automatically when the application is started " "on a computer that uses the language.\n" "\n" "Note that the standard parts of the Glom user interface, such as menus and " "dialog windows, will only be translated when you start Glom on a computer " "that uses that language." msgstr "" "Проверка перевода\n" "\n" "Выберите Ñзык Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ перевода. Перевод будет выбран автоматичеÑки на " "компьютерах, иÑпользующих ÑоответÑтвующий Ñзык.\n" "\n" "Обратите внимание, что Ñлементы интерфейÑа Glom, например меню и диалоги, " "будут переведены только на компьютерах, иÑпользующих ÑоответÑтвующий Ñзык." #: ../glom/glom_developer.glade.h:70 #: ../glom/utility_widgets/layoutwidgetmenu.cc:44 msgid "Add Button" msgstr "Добавить кнопку" #: ../glom/glom_developer.glade.h:71 #: ../glom/utility_widgets/layoutwidgetmenu.cc:42 msgid "Add Notebook" msgstr "Добавить Ñтраницу" #: ../glom/glom_developer.glade.h:72 msgid "Add Related Calendar" msgstr "Добавить календарь" #: ../glom/glom_developer.glade.h:73 #: ../glom/utility_widgets/layoutwidgetmenu.cc:41 msgid "Add Related Records" msgstr "Добавить запиÑи" #: ../glom/glom_developer.glade.h:74 msgid "Add Related Table" msgstr "Добавить таблицу" #: ../glom/glom_developer.glade.h:75 #: ../glom/utility_widgets/layoutwidgetmenu.cc:45 msgid "Add Text" msgstr "" #: ../glom/glom_developer.glade.h:76 msgid "Add _Group" msgstr "" #: ../glom/glom_developer.glade.h:77 msgid "" "Add a button. Edit the button to define the script that will be run when the " "button is clicked." msgstr "" #: ../glom/glom_developer.glade.h:78 msgid "" "Add a group which can contain other layout items. Use this to group items " "together, such as fields." msgstr "" #: ../glom/glom_developer.glade.h:79 msgid "" "Add a layout item that shows the data from a field in the record, and allows " "the user to edit that value." msgstr "" #: ../glom/glom_developer.glade.h:80 msgid "" "Add a related records calendar portal. This is a calendar showing records " "from a related table. Remember to edit this layout item to specify the " "relationship to use, and the fields to show from the related table." msgstr "" #: ../glom/glom_developer.glade.h:81 msgid "" "Add a related records portal. This is a list of records in a related table. " "Remember to edit this layout item to specify the relationship to use, and " "the fields to show from the related table." msgstr "" #: ../glom/glom_developer.glade.h:82 msgid "" "Add a tabbed notebook. Each page of the notebook may contain several other " "layout items, but only one page will be visible at one time." msgstr "" #: ../glom/glom_developer.glade.h:83 msgid "" "Add an image to the layout, such as a logo. The image will be the same for " "every record viewed. To show an image field from a record, to show different " "images for each field, use the field layout item." msgstr "" #: ../glom/glom_developer.glade.h:84 msgid "" "Add text to a layout, such as an explanation or a warning. The text will be " "the same for every record viewed." msgstr "" "Добавить текÑÑ‚ на форму, например поÑÑнение или предупреждение. ТекÑÑ‚ " "одинаков Ð´Ð»Ñ Ð²Ñех проÑматриваемых запиÑей." #: ../glom/glom_developer.glade.h:85 #: ../glom/mode_design/box_db_table_relationships.cc:53 msgid "Allow Editing" msgstr "Разрешить редактирование" #: ../glom/glom_developer.glade.h:86 msgid "Also show:" msgstr "" #: ../glom/glom_developer.glade.h:87 msgid "Alternative Color for Negative Values" msgstr "" #: ../glom/glom_developer.glade.h:88 msgid "Auto-increment" msgstr "Ðвтоувеличение" #: ../glom/glom_developer.glade.h:89 msgid "Auto-increment values" msgstr "" #: ../glom/glom_developer.glade.h:90 msgid "Automatic:" msgstr "" #: ../glom/glom_developer.glade.h:91 msgid "Background Color:" msgstr "" #: ../glom/glom_developer.glade.h:92 msgid "Border Width (ems)" msgstr "" #: ../glom/glom_developer.glade.h:93 msgid "Button Script" msgstr "" #: ../glom/glom_developer.glade.h:94 msgid "C_reate" msgstr "" #: ../glom/glom_developer.glade.h:95 msgid "Calculate Value" msgstr "" #. Translators: This is the verb #: ../glom/glom_developer.glade.h:97 msgid "Check" msgstr "" #: ../glom/glom_developer.glade.h:98 msgid "Choices From Related Records" msgstr "" #: ../glom/glom_developer.glade.h:99 msgid "Choose Date" msgstr "" #: ../glom/glom_developer.glade.h:100 msgid "Choose User" msgstr "" #: ../glom/glom_developer.glade.h:101 msgid "" "Click this check box to use a different foreground color to display negative " "values." msgstr "" #: ../glom/glom_developer.glade.h:102 msgid "Click this check box to use a non-standard background color." msgstr "" #: ../glom/glom_developer.glade.h:103 msgid "Click this check box to use a non-standard font." msgstr "" #: ../glom/glom_developer.glade.h:104 msgid "Click this check box to use a non-standard foreground color." msgstr "" #: ../glom/glom_developer.glade.h:105 msgid "" "Clicking the row button takes the user to the table specified by this " "relationship:" msgstr "" #: ../glom/glom_developer.glade.h:106 msgid "Columns:" msgstr "" #: ../glom/glom_developer.glade.h:107 msgid "Confirm Password" msgstr "" #: ../glom/glom_developer.glade.h:108 msgid "Copy From Existing Translation" msgstr "Скопировать из имеющегоÑÑ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°" #: ../glom/glom_developer.glade.h:109 msgid "Country:" msgstr "Страна:" #: ../glom/glom_developer.glade.h:110 #: ../glom/mode_design/users/dialog_groups_list.cc:76 msgid "Create" msgstr "Создание" #: ../glom/glom_developer.glade.h:111 msgid "Create Group" msgstr "" #: ../glom/glom_developer.glade.h:112 msgid "Currency Symbol" msgstr "Символ валюты" #: ../glom/glom_developer.glade.h:113 msgid "Custom Choice List" msgstr "" #: ../glom/glom_developer.glade.h:114 msgid "Database Preferences" msgstr "" #: ../glom/glom_developer.glade.h:115 msgid "Date Field:" msgstr "" #: ../glom/glom_developer.glade.h:116 msgid "Decimal Places" msgstr "" #: ../glom/glom_developer.glade.h:117 msgid "Default Formatting" msgstr "" #: ../glom/glom_developer.glade.h:118 #: ../glom/mode_design/users/dialog_groups_list.cc:73 msgid "Edit" msgstr "" #: ../glom/glom_developer.glade.h:119 msgid "English" msgstr "ÐнглийÑкий" #: ../glom/glom_developer.glade.h:121 msgid "Export Format" msgstr "" #: ../glom/glom_developer.glade.h:122 #: ../glom/libglom/data_structure/layout/layoutitem_field.cc:193 #: ../glom/libglom/data_structure/translatable_item.cc:296 #: ../glom/mode_design/dialog_database_preferences.cc:56 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:601 msgid "Field" msgstr "" #: ../glom/glom_developer.glade.h:123 msgid "Field Calculation" msgstr "" #: ../glom/glom_developer.glade.h:124 msgid "Field Definition" msgstr "" #: ../glom/glom_developer.glade.h:125 ../glom/mode_design/dialog_fields.cc:36 msgid "Field Definitions" msgstr "" #: ../glom/glom_developer.glade.h:126 msgid "Field Layout" msgstr "" #: ../glom/glom_developer.glade.h:127 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:71 msgid "Field Summary" msgstr "" #: ../glom/glom_developer.glade.h:128 msgid "Field:" msgstr "Поле:" #: ../glom/glom_developer.glade.h:129 msgid "Font:" msgstr "Шрифт:" #: ../glom/glom_developer.glade.h:130 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_footer.cc:55 msgid "Footer" msgstr "" #: ../glom/glom_developer.glade.h:131 msgid "Foreground Color:" msgstr "" #: ../glom/glom_developer.glade.h:132 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc:32 msgid "Formatting" msgstr "Формат" #. Translators: FROM as in SQL's FROM #: ../glom/glom_developer.glade.h:134 msgid "From Field:" msgstr "" #: ../glom/glom_developer.glade.h:135 #: ../glom/libglom/data_structure/layout/layoutgroup.cc:377 #: ../glom/mode_data/flowtablewithfields.cc:1424 #: ../glom/mode_data/flowtablewithfields.cc:1451 #: ../glom/utility_widgets/layouttoolbar.cc:54 #: ../glom/utility_widgets/layouttoolbar.cc:64 #: ../glom/utility_widgets/notebooklabelglom.cc:74 msgid "Group" msgstr "" #: ../glom/glom_developer.glade.h:136 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.cc:102 msgid "Group By" msgstr "" #: ../glom/glom_developer.glade.h:137 msgid "Group By - Secondary Fields" msgstr "" #: ../glom/glom_developer.glade.h:138 msgid "Group By - Sort Fields" msgstr "" #: ../glom/glom_developer.glade.h:139 msgid "Group Name" msgstr "" #: ../glom/glom_developer.glade.h:140 msgid "Group Properties" msgstr "" #: ../glom/glom_developer.glade.h:141 msgid "Groups" msgstr "" #: ../glom/glom_developer.glade.h:142 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_header.cc:55 msgid "Header" msgstr "Заголовок" #: ../glom/glom_developer.glade.h:143 msgid "Height (lines)" msgstr "" #: ../glom/glom_developer.glade.h:144 msgid "Horizontal Alignment:" msgstr "" #: ../glom/glom_developer.glade.h:145 msgid "Identify Original" msgstr "Определить оригинал" #: ../glom/glom_developer.glade.h:146 msgid "Identify Source" msgstr "" #: ../glom/glom_developer.glade.h:147 msgid "" "If the text is not actually in this language, please choose the correct " "language." msgstr "ЕÑли на Ñамом деле текÑÑ‚ не на Ñтом Ñзыке, выберите иÑпользуемый Ñзык." #: ../glom/glom_developer.glade.h:148 msgid "" "If this is not selected then a thousands separator will not be used, even if " "your locale would normally use one. If it is selected then a thousands " "separator will be used only if your locale normally uses one." msgstr "" #: ../glom/glom_developer.glade.h:149 msgid "" "If this is selected then the field value will be shown in a multi-line box " "with a scrollbar." msgstr "" #: ../glom/glom_developer.glade.h:150 msgid "Image Object" msgstr "" #: ../glom/glom_developer.glade.h:152 msgid "Language:" msgstr "Язык:" #. Don't add ContextLayout in client only mode because it would never #. be sensitive anyway #: ../glom/glom_developer.glade.h:153 #: ../glom/mode_data/box_data_calendar_related.cc:501 #: ../glom/utility_widgets/db_adddel/db_adddel.cc:276 msgid "Layout" msgstr "" #: ../glom/glom_developer.glade.h:154 msgid "Locale:" msgstr "" #: ../glom/glom_developer.glade.h:155 msgid "Logo" msgstr "" #: ../glom/glom_developer.glade.h:156 msgid "Lookup value when a field changes." msgstr "" #. Translators: The Main part of the report (not the footer or header) #: ../glom/glom_developer.glade.h:158 msgid "Main" msgstr "" #: ../glom/glom_developer.glade.h:159 msgid "Module name:" msgstr "" #: ../glom/glom_developer.glade.h:160 msgid "Multi-line" msgstr "" #: ../glom/glom_developer.glade.h:162 msgid "Name of new related table:" msgstr "" #: ../glom/glom_developer.glade.h:163 msgid "Name of new relationship:" msgstr "" #: ../glom/glom_developer.glade.h:164 msgid "Name:" msgstr "" #: ../glom/glom_developer.glade.h:165 msgid "No Choices" msgstr "" #: ../glom/glom_developer.glade.h:166 msgid "None" msgstr "" #: ../glom/glom_developer.glade.h:167 ../glom/glom.glade.h:32 #: ../glom/mode_design/dialog_design.cc:54 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:492 msgid "None selected" msgstr "" #: ../glom/glom_developer.glade.h:168 #: ../glom/mode_design/layout/dialog_layout_details.cc:1006 msgid "Notebook Tabs" msgstr "" #: ../glom/glom_developer.glade.h:169 msgid "Organisation" msgstr "" #: ../glom/glom_developer.glade.h:170 ../glom/glom.glade.h:36 msgid "Password" msgstr "Пароль" #: ../glom/glom_developer.glade.h:171 msgid "Primary Key" msgstr "Первичный ключ" #: ../glom/glom_developer.glade.h:172 msgid "Print Layout Editor" msgstr "" #: ../glom/glom_developer.glade.h:173 msgid "Print Layouts" msgstr "" #: ../glom/glom_developer.glade.h:174 #: ../glom/utility_widgets/layoutwidgetutils.cc:37 msgid "Properties" msgstr "СвойÑтва" #: ../glom/glom_developer.glade.h:175 #: ../glom/libglom/data_structure/translatable_item.cc:300 msgid "Relationship" msgstr "" #: ../glom/glom_developer.glade.h:176 msgid "Relationship:" msgstr "" #: ../glom/glom_developer.glade.h:177 msgid "Relationships Overview" msgstr "Схема отношений" #: ../glom/glom_developer.glade.h:178 msgid "" "Remove the item from the layout. If you remove a field layout item, it will " "not remove the field from the table itself. It just will not be seen on the " "layout." msgstr "" #: ../glom/glom_developer.glade.h:179 msgid "Report Layout" msgstr "" #: ../glom/glom_developer.glade.h:180 msgid "Reports" msgstr "Отчеты" #: ../glom/glom_developer.glade.h:181 msgid "Restrict data to these choices" msgstr "Ðе разрешать прочие значениÑ" #: ../glom/glom_developer.glade.h:182 msgid "Script name:" msgstr "Ð˜Ð¼Ñ ÑценариÑ:" #: ../glom/glom_developer.glade.h:183 msgid "Secondary Fields:" msgstr "" #: ../glom/glom_developer.glade.h:184 #: ../glom/utility_widgets/dialog_choose_id.cc:88 #: ../glom/utility_widgets/imageglom.cc:415 msgid "Select" msgstr "" #: ../glom/glom_developer.glade.h:185 msgid "Select Field" msgstr "Выбор полÑ" #: ../glom/glom_developer.glade.h:186 msgid "Select Relationship" msgstr "" #: ../glom/glom_developer.glade.h:187 msgid "Show Related Relationships" msgstr "" #: ../glom/glom_developer.glade.h:188 msgid "Show Table Title" msgstr "" #: ../glom/glom_developer.glade.h:189 msgid "Show child relationships" msgstr "" #: ../glom/glom_developer.glade.h:190 msgid "Sort Fields:" msgstr "" #: ../glom/glom_developer.glade.h:191 msgid "" "Start a translation for this target locale by copying the strings from " "another target locale." msgstr "" #: ../glom/glom_developer.glade.h:192 msgid "Startup Script" msgstr "" #: ../glom/glom_developer.glade.h:193 msgid "State/County:" msgstr "Штат/Ñтрана:" #: ../glom/glom_developer.glade.h:194 msgid "Street (Line 2):" msgstr "" #: ../glom/glom_developer.glade.h:195 msgid "Street:" msgstr "" #: ../glom/glom_developer.glade.h:196 msgid "Summary Type:" msgstr "" #: ../glom/glom_developer.glade.h:197 msgid "System Name:" msgstr "" #: ../glom/glom_developer.glade.h:198 msgid "Table Name" msgstr "" #: ../glom/glom_developer.glade.h:199 ../glom/glom.glade.h:44 msgid "Table:" msgstr "Таблица:" #: ../glom/glom_developer.glade.h:200 msgid "Table: " msgstr "Таблица: " #: ../glom/glom_developer.glade.h:201 msgid "Test" msgstr "" #: ../glom/glom_developer.glade.h:202 msgid "Test Translation" msgstr "Проверка перевода" #: ../glom/glom_developer.glade.h:203 msgid "Text Format" msgstr "" #: ../glom/glom_developer.glade.h:204 msgid "Text Object" msgstr "" #: ../glom/glom_developer.glade.h:205 msgid "" "The field value will be the return value of the python function, which you " "implement here." msgstr "" "Значение Ð¿Ð¾Ð»Ñ Ð±ÑƒÐ´ÐµÑ‚ возвращатьÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ здеÑÑŒ функцией на Ñзыке python." #: ../glom/glom_developer.glade.h:206 msgid "" "These modules will be available to your button scripts and field " "calculations via the python import keyword." msgstr "" #: ../glom/glom_developer.glade.h:207 msgid "" "This field will be used to decide which records to show in the calendar." msgstr "" #: ../glom/glom_developer.glade.h:208 msgid "" "This will add a new table and add a relationship that refers to the new " "table, as a convenient alternative to doing this in separate steps.\n" "\n" "If a suitable related table already exists then you should instead cancel " "and just add a relationship." msgstr "" #: ../glom/glom_developer.glade.h:211 msgid "Title:" msgstr "" #: ../glom/glom_developer.glade.h:212 msgid "Town:" msgstr "Город:" #: ../glom/glom_developer.glade.h:213 msgid "Translations" msgstr "Переводы" #: ../glom/glom_developer.glade.h:214 msgid "Triggered by:" msgstr "" #: ../glom/glom_developer.glade.h:215 msgid "Type:" msgstr "" #: ../glom/glom_developer.glade.h:216 msgid "Unique" msgstr "Уникальное" #: ../glom/glom_developer.glade.h:217 msgid "Use 1000s separator" msgstr "" #: ../glom/glom_developer.glade.h:218 msgid "Use custom formatting" msgstr "" #: ../glom/glom_developer.glade.h:219 msgid "Use custom title:" msgstr "Другой Ñрлык:" #: ../glom/glom_developer.glade.h:220 msgid "Use default field title: " msgstr "Ярлык по умолчанию: " #: ../glom/glom_developer.glade.h:221 msgid "Use default formatting" msgstr "Форматирование по умолчанию" #. Append the View columns: #: ../glom/glom_developer.glade.h:222 ../glom/glom.glade.h:46 #: ../glom/mode_design/users/dialog_users_list.cc:64 msgid "User" msgstr "Пользователь" #: ../glom/glom_developer.glade.h:223 msgid "User Entry" msgstr "" #: ../glom/glom_developer.glade.h:224 msgid "Users" msgstr "" #: ../glom/glom_developer.glade.h:225 msgid "Value" msgstr "Значение" #: ../glom/glom_developer.glade.h:226 msgid "" "When the button is clicked it will run the python function which you " "implement here." msgstr "" #: ../glom/glom_developer.glade.h:227 msgid "" "When the database is opened the python function implemented here will run." msgstr "" #: ../glom/glom_developer.glade.h:228 msgid "" "When this is checked the table's title will be shown at the top of the " "report in addition to the report title." msgstr "" #: ../glom/glom_developer.glade.h:229 msgid "" "When this is selected you will see extra relationships in the Table list, " "allowing you to choose fields from relationships in related tables, instead " "of just regular fields from those related tables." msgstr "" #: ../glom/glom_developer.glade.h:230 msgid "Zip/Postal Code:" msgstr "Почтовый индекÑ:" #: ../glom/glom_developer.glade.h:231 msgid "_Confirm Password" msgstr "" #: ../glom/glom_developer.glade.h:232 ../glom/glom.glade.h:52 msgid "_Password" msgstr "_Пароль" #: ../glom/glom_developer.glade.h:233 ../glom/glom.glade.h:54 msgid "_User" msgstr "_Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" #: ../glom/glom_developer.glade.h:234 msgid "field name" msgstr "" #: ../glom/glom_developer.glade.h:235 msgid "table name" msgstr "" #: ../glom/glom_developer.glade.h:236 msgid "the title" msgstr "" #: ../glom/glom.glade.h:1 msgid "0" msgstr "0" #: ../glom/glom.glade.h:2 msgid "None selected" msgstr "Ðет выделениÑ" #: ../glom/glom.glade.h:3 msgid "Find Related Record" msgstr "" #. Import is a noun here. This is the title for a list of fields to import. #: ../glom/glom.glade.h:5 msgid "Import Fields" msgstr "Импортируемые полÑ" #. Import is a noun here. This is the title for a window showing options for an import operation. #: ../glom/glom.glade.h:7 msgid "Import Options" msgstr "Параметры импорта" #: ../glom/glom.glade.h:8 msgid "Tables in database" msgstr "ИмеющиеÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹" #: ../glom/glom.glade.h:9 msgid "User Level:" msgstr "Уровень пользователÑ:" #: ../glom/glom.glade.h:10 msgid "Connect to Server" msgstr "" #: ../glom/glom.glade.h:11 msgid "" "Invalid format\n" "\n" "The data in the field was not recognized. Please try to correct the data or " "revert to the previous value. Here is an example of correctly-formatted data " "for this field.\n" msgstr "" #: ../glom/glom.glade.h:15 msgid "Open or create a Document" msgstr "" "Откройте или Ñоздайте документ" #: ../glom/glom.glade.h:16 msgid "C_onnect" msgstr "" #: ../glom/glom.glade.h:17 msgid "Connection Details" msgstr "" #: ../glom/glom.glade.h:18 msgid "Create New Document" msgstr "Создать документ" #: ../glom/glom.glade.h:20 msgid "Database" msgstr "База данных" #: ../glom/glom.glade.h:21 msgid "Encoding detected as: UTF-8" msgstr "Кодировка определена как: UTF-8" #: ../glom/glom.glade.h:22 msgid "Find All" msgstr "" #: ../glom/glom.glade.h:23 msgid "Find Related Record" msgstr "" #: ../glom/glom.glade.h:24 msgid "Found:" msgstr "Ðайдено;" #: ../glom/glom.glade.h:26 msgid "Host" msgstr "Сервер" #: ../glom/glom.glade.h:27 msgid "Import Into _Table:" msgstr "Импортировать в _таблицу:" #. This is a status message for a progress dialog. It says that importing is currently happenning. #: ../glom/glom.glade.h:29 msgid "Importing Data" msgstr "" #: ../glom/glom.glade.h:30 msgid "Loading image" msgstr "" #: ../glom/glom.glade.h:31 msgid "Mode:" msgstr "Режим:" #: ../glom/glom.glade.h:33 msgid "Number of sample rows:" msgstr "ЧиÑло Ñтрок в образце:" #: ../glom/glom.glade.h:34 msgid "Open Existing Document" msgstr "Открыть документ" #: ../glom/glom.glade.h:35 msgid "Open or create Document" msgstr "Откройте или Ñоздайте документ" #: ../glom/glom.glade.h:37 msgid "Please enter the connection details for your database server." msgstr "" #: ../glom/glom.glade.h:38 msgid "Please wait, your data is being imported…" msgstr "Идет импорт данных…" #: ../glom/glom.glade.h:39 ../glom/glade_utils.cc:49 msgid "Processing" msgstr "Обработка" #: ../glom/glom.glade.h:41 msgid "Records: " msgstr "ЗапиÑей: " #: ../glom/glom.glade.h:42 msgid "Revert" msgstr "" #: ../glom/glom.glade.h:43 msgid "Show hidden tables" msgstr "Отображать Ñкрытые таблицы" #: ../glom/glom.glade.h:47 msgid "Welcome to Glom" msgstr "Добро пожаловать в Glom" #: ../glom/glom.glade.h:48 msgid "_Encoding:" msgstr "_Кодировка:" #: ../glom/glom.glade.h:49 msgid "_First line as title" msgstr "_Заголовок в первой Ñтроке" #: ../glom/glom.glade.h:50 msgid "_Host" msgstr "_Сервер" #: ../glom/glom.glade.h:51 msgid "_Import" msgstr "_Импорт" #: ../glom/glom.glade.h:53 msgid "_Select" msgstr "_Выбрать" #: ../glom/glom.glade.h:55 msgid "bla.blub - Import from CSV" msgstr "bla.blub - Импорт CSV" #: ../glom/glom.glade.h:56 msgid "example data format" msgstr "" #: ../glom/glom.glade.h:57 msgid "label" msgstr "" #: ../glom/glom.glade.h:58 msgid "table_name" msgstr "" #: ../glom/utils_ui.cc:143 msgid "No help file available" msgstr "ÐедоÑтупен файл Ñправки" #: ../glom/utils_ui.cc:161 msgid "Could not display help: " msgstr "Ðе удалоÑÑŒ отобразить Ñправку: " #: ../glom/bakery/app_withdoc_gtk.cc:343 msgid "_Edit" msgstr "_Правка" #: ../glom/bakery/app_withdoc_gtk.cc:386 msgid "_Help" msgstr "_Справка" #: ../glom/bakery/app_withdoc_gtk.cc:390 msgid "_About" msgstr "_О программе" #: ../glom/bakery/app_withdoc_gtk.cc:390 msgid "About the application" msgstr "" #: ../glom/bakery/app_withdoc_gtk.cc:530 msgid "Open Document" msgstr "" #: ../glom/bakery/app_withdoc.cc:494 msgid "The document could not be opened." msgstr "" #: ../glom/bakery/dialog_offersave.cc:30 msgid "This document has unsaved changes. Would you like to save the document?" msgstr "" #: ../glom/bakery/dialog_offersave.cc:32 msgid "" "\n" "\n" "Document:\n" msgstr "" "\n" "\n" "Документ:\n" #: ../glom/bakery/dialog_offersave.cc:45 msgid "Close without Saving" msgstr "" #: ../glom/bakery/dialog_offersave.cc:54 msgid "Discard" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:85 msgid "Auto Detect" msgstr "Ðвто-определение" #. We mean 22nd November 2008: #. C years start are the AD year - 1900. So, 01 is 1901. #. C months start at 0. #. starts at 1 #. Get the ISO (not current locale) text representation: #. ignored #. iso_format #: ../glom/import_csv/dialog_import_csv.cc:142 msgid "" "Note that the source file should contain numbers and dates in international " "ISO format. For instance, 22nd November 2008 should be %1." msgstr "" "Учтите, что чиÑла и даты должны быть в форматах ISO. Ðапример, 22 ноÑÐ±Ñ€Ñ " "2008 должно быть предÑтавлено как %1." #: ../glom/import_csv/dialog_import_csv.cc:171 msgid "No Document Available" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:171 msgid "You need to open a document to import the data into a table." msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:182 msgid "Import From CSV File" msgstr "Импорт из файла CSV" #: ../glom/import_csv/dialog_import_csv.cc:187 #: ../glom/import_csv/dialog_import_csv.cc:579 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:267 msgid "Error Importing CSV File" msgstr "Ошибка импорта файла CSV" #: ../glom/import_csv/dialog_import_csv.cc:421 msgid "Encoding detected as: %1" msgstr "Кодировка определена как: %1" #: ../glom/import_csv/dialog_import_csv.cc:460 msgid "Encoding detection failed. Please manually choose one from the box." msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:464 msgid "" "The file contains data not in the specified encoding. Please choose another " "one, or try \"Auto Detect\"." msgstr "" #. Note to translators: This is a straight line, not a database row. #: ../glom/import_csv/dialog_import_csv.cc:506 #: ../glom/libglom/data_structure/layout/layoutitem_line.cc:82 msgid "Line" msgstr "ЛиниÑ" #: ../glom/import_csv/dialog_import_csv.cc:557 msgid "Target Field" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:604 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:614 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:713 msgid "" "One column needs to be assigned the table's primary key (%1) as " "target field before importing" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:747 msgid "Could Not Open file" msgstr "Ðе удалоÑÑŒ открыть файл" #: ../glom/import_csv/dialog_import_csv.cc:748 msgid "The file at \"%1\" could not be opened: %2" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:753 msgid " - Import From CSV File" msgstr "" #: ../glom/import_csv/dialog_import_csv_progress.cc:83 msgid "Parsing CSV file %1" msgstr "Разбор файла CSV %1" #: ../glom/import_csv/dialog_import_csv_progress.cc:162 msgid "Import complete\n" msgstr "Импорт завершен\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:191 msgid "" "Warning: Importing row %1: The value for field %2 must be unique, but is " "already in use. The value will not be imported.\n" msgstr "" "Предупреждение: Импорт Ñтроки %1: Значение Ð¿Ð¾Ð»Ñ %2 должно быть уникальным, " "но оно уже иÑпользовано. Значение будет пропущено.\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:200 msgid "" "Warning: Importing row %1: The value for field %2, \"%3\" could not be " "converted to the field's type. The value will not be imported.\n" msgstr "" "Предупреждение: Импорт Ñтроки %1: Значение Ð¿Ð¾Ð»Ñ %2, \"%3\" Ð½ÐµÐ»ÑŒÐ·Ñ " "преобразовать к типу полÑ. Значение будет пропущено.\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:225 msgid "" "Error importing row %1: Cannot import the row because the primary key is " "empty.\n" msgstr "" "Ошибка импорта Ñтроки %1: Ðевозможно импортировать Ñтроку, так как первичный " "ключ пуÑÑ‚.\n" #. TODO: Can we get this from anywhere else, such as iso-codes? murrayc #. TODO: Make this generally more efficient. #: ../glom/import_csv/file_encodings.cc:93 #: ../glom/import_csv/file_encodings.cc:94 #: ../glom/import_csv/file_encodings.cc:95 #: ../glom/import_csv/file_encodings.cc:96 #: ../glom/import_csv/file_encodings.cc:97 #: ../glom/import_csv/file_encodings.cc:98 #: ../glom/import_csv/file_encodings.cc:99 #: ../glom/import_csv/file_encodings.cc:100 msgid "Unicode" msgstr "Юникод" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:102 #: ../glom/import_csv/file_encodings.cc:115 #: ../glom/import_csv/file_encodings.cc:120 msgid "Western" msgstr "Западно-европейÑкаÑ" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:103 #: ../glom/import_csv/file_encodings.cc:118 msgid "Central European" msgstr "Центрально-европейÑкаÑ" #: ../glom/import_csv/file_encodings.cc:104 msgid "South European" msgstr "Южно-европейÑкаÑ" #: ../glom/import_csv/file_encodings.cc:105 #: ../glom/import_csv/file_encodings.cc:113 #: ../glom/import_csv/file_encodings.cc:125 msgid "Baltic" msgstr "Стран Балтии" #: ../glom/import_csv/file_encodings.cc:106 #: ../glom/import_csv/file_encodings.cc:119 msgid "Cyrillic" msgstr "Кириллица" #: ../glom/import_csv/file_encodings.cc:107 #: ../glom/import_csv/file_encodings.cc:124 msgid "Arabic" msgstr "ÐрабÑкаÑ" #: ../glom/import_csv/file_encodings.cc:108 #: ../glom/import_csv/file_encodings.cc:121 msgid "Greek" msgstr "ГречеÑкаÑ" #: ../glom/import_csv/file_encodings.cc:109 msgid "Hebrew Visual" msgstr "Иврит (видимый порÑдок)" #: ../glom/import_csv/file_encodings.cc:110 #: ../glom/import_csv/file_encodings.cc:123 msgid "Hebrew" msgstr "Иврит" #: ../glom/import_csv/file_encodings.cc:111 #: ../glom/import_csv/file_encodings.cc:122 msgid "Turkish" msgstr "ТурецкаÑ" #: ../glom/import_csv/file_encodings.cc:112 msgid "Nordic" msgstr "СкандинавÑкаÑ" #: ../glom/import_csv/file_encodings.cc:114 msgid "Celtic" msgstr "КельтÑкаÑ" #: ../glom/import_csv/file_encodings.cc:116 msgid "Romanian" msgstr "РумынÑкаÑ" #: ../glom/import_csv/file_encodings.cc:126 msgid "Vietnamese" msgstr "ВьетнамÑкаÑ" #: ../glom/libglom/data_structure/field.cc:650 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:143 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:151 msgid "Invalid" msgstr "" #: ../glom/libglom/data_structure/field.cc:651 msgid "Number" msgstr "ЧиÑло" #: ../glom/libglom/data_structure/field.cc:652 #: ../glom/libglom/data_structure/layout/layoutitem_text.cc:72 #: ../glom/libglom/data_structure/translatable_item.cc:316 #: ../glom/mode_design/layout/dialog_layout_details.cc:1206 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:39 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:605 msgid "Text" msgstr "ТекÑÑ‚" #: ../glom/libglom/data_structure/field.cc:653 msgid "Time" msgstr "ВремÑ" #: ../glom/libglom/data_structure/field.cc:654 msgid "Date" msgstr "Дата" #: ../glom/libglom/data_structure/field.cc:655 msgid "Boolean" msgstr "ЛогичеÑкое" #: ../glom/libglom/data_structure/field.cc:656 #: ../glom/libglom/data_structure/layout/layoutitem_image.cc:69 #: ../glom/libglom/data_structure/translatable_item.cc:318 #: ../glom/mode_design/layout/dialog_layout_details.cc:1213 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:41 #: ../glom/utility_widgets/layouttoolbar.cc:66 msgid "Image" msgstr "Изображение" #. TRANSLATORS: Please only translate this string if you know that strftime() #. * shows only 2 year digits when using format "x". We want to always display #. * 4 year digits. For instance, en_GB should translate it to "%d/%m/%Y". #. * Glom will show a warning in the terminal at startup if this is necessary #. * and default to %d/%m/%Y" if it detects a problem, but that might not be #. * correct for your locale. #. * Thanks. #: ../glom/libglom/data_structure/glomconversions.cc:103 #, no-c-format msgid "%x" msgstr "%x" #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:150 msgid "" "ERROR: sanity_check_date_parsing(): Sanity check failed: Glom could not " "parse a date's text representation that it generated itself, in this locale." msgstr "" "ОШИБКÐ: sanity_check_date_parsing(): Ошибка окружениÑ: Glom не Ñмог " "раÑпознать Ñозданное им Ñамим предÑтавление даты при текущих международных " "наÑтройках (locale)." #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:184 msgid "" "ERROR: sanity_check_date_text_representation_uses_4_digit_year(): Sanity " "check failed: Glom does not seem to use 4 digits to display years in a " "date's text representation, in this locale. Defaulting to dd/mm/yyyy though " "this might be incorrect for your locale. This needs attention from a " "translator. Please file a bug - see http://www.glom.org" msgstr "" "ОШИБКÐ: sanity_check_date_text_representation_uses_4_digit_year(): Ошибка " "окружениÑ: При текущих международных наÑтройках Glom не иÑпользует 4 цифры " "Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð¾Ð´Ð° в текÑтовом формате. Выбран формат дд/мм/гггг, " "который не подходит Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… наÑтроек. Обратите внимание переводчика, " "Ñообщив об ошибке (http://www.glom.org)" #: ../glom/libglom/data_structure/layout/layoutitem_button.cc:67 #: ../glom/libglom/data_structure/translatable_item.cc:314 #: ../glom/mode_design/layout/dialog_layout_details.cc:1199 #: ../glom/utility_widgets/layouttoolbar.cc:62 msgid "Button" msgstr "Кнопка" #: ../glom/libglom/data_structure/layout/layoutitem_calendarportal.cc:57 msgid "Calendar Portal" msgstr "" #. Note to translators: "Notebook" means a GtkNotebook-type widget. #: ../glom/libglom/data_structure/layout/layoutitem_notebook.cc:56 #: ../glom/mode_data/flowtablewithfields.cc:1420 #: ../glom/utility_widgets/layouttoolbar.cc:56 msgid "Notebook" msgstr "" #: ../glom/libglom/data_structure/layout/layoutitem_placeholder.cc:59 msgid "Placeholder" msgstr "" #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:68 msgid "Portal" msgstr "" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:126 msgid "No summary chosen" msgstr "" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:145 msgid "Sum" msgstr "Сумма" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:147 msgid "Average" msgstr "Среднее" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:149 msgid "Count" msgstr "Кол-во" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_summary.cc:61 msgid "Summary" msgstr "" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc:55 msgid "Vertical Group" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:298 msgid "Custom Title" msgstr "Ðазвание" #: ../glom/libglom/data_structure/translatable_item.cc:302 msgid "Layout Item" msgstr "Элемент макета" #: ../glom/libglom/data_structure/translatable_item.cc:304 msgid "Print Layout" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:306 msgid "Report" msgstr "Отчет" #. Tables: #: ../glom/libglom/data_structure/translatable_item.cc:308 #: ../glom/mode_design/box_db_table_relationships.cc:51 #: ../glom/mode_design/dialog_database_preferences.cc:55 #: ../glom/mode_design/users/dialog_groups_list.cc:67 #: ../glom/navigation/maemo/pickerbutton_table.cc:37 msgid "Table" msgstr "Таблица" #: ../glom/libglom/data_structure/translatable_item.cc:310 msgid "Layout Group" msgstr "" #: ../glom/libglom/data_structure/translatable_item.cc:312 msgid "Field Title" msgstr "Ярлык полÑ" #: ../glom/libglom/document/document.cc:476 #: ../glom/libglom/document/document.cc:494 msgid "System Preferences" msgstr "" #: ../glom/libglom/document/document.cc:507 msgid "System Name" msgstr "" #: ../glom/libglom/document/document.cc:513 msgid "Organisation Name" msgstr "" #: ../glom/libglom/document/document.cc:519 msgid "Organisation Logo" msgstr "" #: ../glom/libglom/document/document.cc:525 msgid "Street" msgstr "" #: ../glom/libglom/document/document.cc:531 msgid "Street (line 2)" msgstr "" #: ../glom/libglom/document/document.cc:537 msgid "City" msgstr "Город" #: ../glom/libglom/document/document.cc:543 msgid "State" msgstr "Штат" #: ../glom/libglom/document/document.cc:549 msgid "Country" msgstr "Страна" #: ../glom/libglom/document/document.cc:555 msgid "Zip Code" msgstr "" #: ../glom/libglom/document/bakery/document.cc:402 msgid "Untitled" msgstr "БезИмени" #: ../glom/libglom/gst-package.c:57 msgid "Could not install package" msgstr "" #: ../glom/libglom/gst-package.c:75 msgid "The necessary applications to install the package could not be found." msgstr "" #: ../glom/main.cc:194 msgid "Glom options" msgstr "" #: ../glom/main.cc:194 msgid "Command-line options for glom" msgstr "" #: ../glom/main.cc:202 msgid "The Filename" msgstr "" #: ../glom/main.cc:208 msgid "The version of this application." msgstr "ВерÑÐ¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ." #: ../glom/main.cc:213 msgid "Show the generated SQL queries on stdout, for debugging." msgstr "Выводить Ñозданные SQL-запроÑÑ‹ на терминал, Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸." #: ../glom/main.cc:218 msgid "Show how Glom outputs a date in this locale, then stop." msgstr "" #: ../glom/main.cc:231 msgid "" "You seem to be running Glom as a user with administrator privileges. Glom " "may not be run with such privileges for security reasons.\n" "Please login to your system as a normal user." msgstr "" #. Warn the user: #: ../glom/main.cc:245 msgid "" "You seem to be running Glom as root. Glom may not be run as root.\n" "Please login to your system as a normal user." msgstr "" #: ../glom/main.cc:252 msgid "Running As Root" msgstr "Режим ÑуперпользователÑ" #. Show message to the user about the broken installation: #. This is a packaging bug, but it would probably annoy packagers to mention that in the dialog: #. Show message to the user about the broken installation: #: ../glom/main.cc:299 ../glom/main.cc:312 ../glom/main.cc:579 msgid "Incomplete Glom Installation" msgstr "" #. use_markup #. modal #: ../glom/main.cc:300 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "You may now install PostgreSQL to complete the Glom installation." msgstr "" #: ../glom/main.cc:302 msgid "Install PostgreSQL" msgstr "УÑтановка PostgreSQL" #. use_markup #. modal #: ../glom/main.cc:313 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:329 msgid "" "Your installation of Glom is not complete, because the Glom Python module is " "not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" #: ../glom/main.cc:332 msgid "Glom Python Module Not Installed" msgstr "" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:349 msgid "" "Your installation of Glom is not complete, because the gda Python module is " "not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" #: ../glom/main.cc:352 msgid "gda Python Module Not Installed" msgstr "Ðе уÑтановлен модуль Python gda" #: ../glom/main.cc:496 msgid "Error while parsing command-line options: " msgstr "Ошибка разбора параметров командной Ñтроки: " #: ../glom/main.cc:497 msgid "Use --help to see a list of available command-line options." msgstr "" #: ../glom/main.cc:546 msgid "Glom: The file does not exist." msgstr "" #: ../glom/main.cc:555 msgid "Glom: The file path is a directory instead of a file." msgstr "" #. The Postgres provider was not found, so warn the user: #: ../glom/main.cc:576 msgid "" "Your installation of Glom is not complete, because the PostgreSQL libgda " "provider is not available on your system. This provider is needed to access " "Postgres database servers.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" #. Note to translators: This text is shown instead of a table title, when the table has not yet been chosen. #: ../glom/mode_data/box_data_calendar_related.cc:96 #: ../glom/mode_data/box_data_list_related.cc:95 #: ../glom/mode_data/box_data_portal.cc:260 #: ../glom/mode_data/box_data_portal.cc:274 msgid "Undefined Table" msgstr "" #: ../glom/mode_data/box_data.cc:139 msgid "" "You have not entered any find criteria. Try entering information in the " "fields." msgstr "" #: ../glom/mode_data/box_data.cc:183 msgid "" "This data cannot be stored in the database because you have not provided a " "primary key.\n" "Do you really want to discard this data?" msgstr "" #: ../glom/mode_data/box_data.cc:189 msgid "No primary key value" msgstr "ОтÑутÑтвует первичный ключ" #: ../glom/mode_data/box_data_details.cc:119 msgid "Create a new record." msgstr "" #: ../glom/mode_data/box_data_details.cc:120 msgid "Remove this record." msgstr "" #: ../glom/mode_data/box_data_details.cc:121 msgid "View the first record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:122 msgid "View the previous record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:123 msgid "View the next record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:124 msgid "View the last record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:449 msgid "Layout Contains No Fields" msgstr "ОтÑутÑтвуют полÑ" #: ../glom/mode_data/box_data_details.cc:449 msgid "" "There are no fields on the layout, so there is no way to enter data in a new " "record." msgstr "" #. Tell user that a primary key is needed to delete a record: #: ../glom/mode_data/box_data_details.cc:477 msgid "No primary key value." msgstr "ОтÑутÑтвует первичный ключ" #: ../glom/mode_data/box_data_details.cc:478 msgid "This record cannot be deleted because there is no primary key." msgstr "" #. Warn user that they can't choose their own primary key: #: ../glom/mode_data/box_data_details.cc:891 msgid "Primary key auto increments" msgstr "" #: ../glom/mode_data/box_data_details.cc:892 msgid "" "The primary key is auto-incremented.\n" " You may not enter your own primary key value." msgstr "" "Первичный ключ увеличиваетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.\n" "ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ ÑобÑтвенное значение." #. Add Pages: #: ../glom/mode_data/box_data_list.cc:536 #: ../glom/mode_data/box_data_manyrecords.cc:83 #: ../glom/mode_data/notebook_data.cc:40 ../glom/mode_find/notebook_find.cc:32 msgid "List" msgstr "СпиÑок" #. On Maemo, we add the box to m_window_maemo_details instead: #. Details column: #: ../glom/mode_data/box_data_portal.cc:145 #: ../glom/mode_data/notebook_data.cc:44 ../glom/mode_data/notebook_data.cc:48 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:207 #: ../glom/mode_find/notebook_find.cc:41 msgid "Details" msgstr "Форма" #: ../glom/mode_data/box_data_portal.cc:160 msgid "New Related %1" msgstr "" #: ../glom/mode_data/box_data_portal.cc:202 msgid "Add Related %1" msgstr "" #: ../glom/mode_data/box_data_portal.cc:204 msgid "Add related record" msgstr "Добавить ÑвÑзанную запиÑÑŒ" #: ../glom/mode_data/box_data_portal.cc:559 msgid "No Corresponding Record Exists" msgstr "" #: ../glom/mode_data/box_data_portal.cc:559 msgid "" "No record with this value exists. Therefore navigation to the related record " "is not possible." msgstr "" #: ../glom/mode_data/flowtablewithfields.cc:1166 #: ../glom/mode_data/flowtablewithfields.cc:1423 #: ../glom/mode_data/flowtablewithfields.cc:1450 #: ../glom/utility_widgets/notebooklabelglom.cc:73 #: ../glom/utility_widgets/notebooklabelglom.cc:113 msgid "New Group" msgstr "ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°" #: ../glom/mode_data/flowtablewithfields.cc:1172 #: ../glom/mode_design/layout/dialog_layout_details.cc:779 msgid "notebook" msgstr "" #. Note to translators: This is the default name (not seen by most users) for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1178 msgid "tab1" msgstr "" #. Note to translators: This is the default label text for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1181 msgid "Tab One" msgstr "Закладка 1" #: ../glom/mode_data/flowtablewithfields.cc:1194 msgid "button" msgstr "" #: ../glom/mode_data/flowtablewithfields.cc:1195 #: ../glom/mode_data/flowtablewithfields.cc:1464 #: ../glom/mode_design/layout/dialog_layout_details.cc:703 msgid "New Button" msgstr "ÐÐ¾Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°" #. Note to translators: This is the default contents of a text item on a print layout: #: ../glom/mode_data/flowtablewithfields.cc:1201 #: ../glom/mode_data/flowtablewithfields.cc:1476 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:379 msgid "text" msgstr "" #: ../glom/mode_data/flowtablewithfields.cc:1202 #: ../glom/mode_data/flowtablewithfields.cc:1477 msgid "New Text" msgstr "Ðовый текÑÑ‚" #. TODO: Avoid this error message, maybe by adding a group. #. TODO: At least avoid losing the dragged item. #: ../glom/mode_data/flowtablewithfields.cc:1561 msgid "You cannot drop anything here. Try to add a group first" msgstr "" #. TODO: Use a real English sentence here? #: ../glom/mode_data/flowtablewithfields.cc:1622 msgid "Delete whole group \"%1\"?" msgstr "" #. TODO: Use a real English sentence here: #: ../glom/mode_data/flowtablewithfields.cc:1628 msgid "Delete whole group?" msgstr "" #: ../glom/mode_data/notebook_data.cc:66 msgid "List Or Details View" msgstr "ПроÑмотр ÑпиÑка или формы" #: ../glom/mode_data/notebook_data.cc:252 msgid "%1 Details" msgstr "СвойÑтва %1" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/box_db_table_relationships.cc:45 msgid "" "This relationship already exists. Please choose a different relationship name" msgstr "" #. Translators: FROM as in SQL's FROM #: ../glom/mode_design/box_db_table_relationships.cc:50 msgid "From Field" msgstr "" #: ../glom/mode_design/box_db_table_relationships.cc:52 msgid "To Field" msgstr "" #: ../glom/mode_design/box_db_table_relationships.cc:54 msgid "Automatic Creation" msgstr "" #: ../glom/mode_design/box_db_table_relationships.cc:56 #: ../glom/navigation/box_tables.cc:139 msgid "Title (Singular Form)" msgstr "" #: ../glom/mode_design/dialog_database_preferences.cc:57 msgid "Next Value" msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:80 msgid "Username Is Empty" msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:80 msgid "Please enter a login name for the new user." msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:85 #: ../glom/mode_design/users/dialog_user.cc:50 msgid "Passwords Do Not Match" msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:85 #: ../glom/mode_design/users/dialog_user.cc:50 msgid "" "The entered password does not match the entered password confirmation. " "Please try again." msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:90 #: ../glom/mode_design/users/dialog_user.cc:55 msgid "Password Is Empty" msgstr "" #: ../glom/mode_design/dialog_initial_password.cc:90 #: ../glom/mode_design/users/dialog_user.cc:55 msgid "Please enter a password for this user." msgstr "" #: ../glom/mode_design/dialog_relationships.cc:36 msgid "Relationships" msgstr "" #. Don't allow adding of fields that already exist. #: ../glom/mode_design/fields/box_db_table_definition.cc:55 #: ../glom/mode_design/fields/box_db_table_definition.cc:333 msgid "This field already exists. Please choose a different field name" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:59 msgid "Type" msgstr "Тип" #. TODO: Only show this when there are > 100 records? #: ../glom/mode_design/fields/box_db_table_definition.cc:263 msgid "Recalculation Required" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:264 msgid "" "You have changed the calculation used by this field so Glom must recalculate " "the value in all records. If the table contains many records then this could " "take a long time." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:269 msgid "Recalculate" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:278 msgid "Invalid database structure" msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтруктура базы данных" #: ../glom/mode_design/fields/box_db_table_definition.cc:279 msgid "" "This database field was created or edited outside of Glom. It has a data " "type that is not supported by Glom. Your system administrator may be able to " "correct this." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:287 msgid "Primary key required" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:288 msgid "" "You may not unset the primary key because the table must have a primary key. " "You may set another field as the primary key instead." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:300 msgid "Field contains empty values." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:300 msgid "" "The field may not yet be used as a primary key because it contains empty " "values." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:309 msgid "Field contains non-unique values." msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:309 msgid "" "The field may not yet be used as a primary key because it contains values " "that are not unique." msgstr "" #. Ask the user to confirm this major change: #: ../glom/mode_design/fields/box_db_table_definition.cc:314 msgid "Change primary key" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:315 msgid "" "Are you sure that you wish to set this field as the primary key, instead of " "the existing primary key?" msgstr "" #: ../glom/mode_design/fields/box_db_table_definition.cc:320 msgid "Change Primary Key" msgstr "" #. Warn the user and refuse to make the change: #: ../glom/mode_design/fields/box_db_table_definition.cc:332 msgid "Field Name Already Exists" msgstr "" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:98 msgid "Calculation Error" msgstr "Ошибка вычиÑлениÑ" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:98 msgid "The calculation does not have a return statement." msgstr "У функции нет оператора return." #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:137 msgid "Calculation result" msgstr "Результат вычиÑлениÑ" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:137 msgid "The result of the calculation is:\n" msgstr "" #: ../glom/mode_design/fields/dialog_fielddefinition.cc:165 msgid "Default Value" msgstr "" #. A special "None" item, allowing the user to do the equivalent of clearing the combobox, #. which is not normally possible with the GtkComboBox UI: #. set_property() does not work with a const gchar*, so we explicitly create a ustring. #. otherwise we get this warning: #. " unable to set property `text' of type `gchararray' from value of type `glibmm__CustomPointer_Pc' " #. TODO: Add a template specialization to Glib::ObjectBase::set_property() to allow this? #: ../glom/mode_design/layout/combobox_fields.cc:215 msgid "(None)" msgstr "(Ðет)" #: ../glom/mode_design/layout/combobox_relationship.cc:268 #: ../glom/mode_design/layout/combobox_relationship.cc:272 msgid " Via: " msgstr "" #: ../glom/mode_design/layout/dialog_layout_calendar_related.cc:243 #: ../glom/mode_design/layout/dialog_layout_list_related.cc:247 msgid "None: No visible tables are specified by the fields." msgstr "" #. Columns-count column: #. Note to translators: This is the number of columns in a group (group being a noun) #: ../glom/mode_design/layout/dialog_layout_details.cc:114 msgid "Group Columns" msgstr "ЧиÑло колонок" #. Column-Width column: (only for list views) #. Note to translators: This is a name (the width of a UI element in the display), not an action. #: ../glom/mode_design/layout/dialog_layout_details.cc:127 msgid "Display Width" msgstr "Ширина" #: ../glom/mode_design/layout/dialog_layout_details.cc:728 msgid "Text Title" msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:753 msgid "Image Title" msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:914 msgid "group" msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:1006 msgid "Add child groups to the notebook to add tabs." msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:1169 msgid "Related Calendar: " msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:1171 msgid "Related List: " msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:1188 msgid "Field: " msgstr "" #: ../glom/mode_design/layout/dialog_layout_details.cc:1247 msgid "(Notebook)" msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:346 msgid "Invalid Relationship" msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑвÑзь" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:347 msgid "" "The relationship may not be used to show related records because the " "relationship does not specify a field in the related table." msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:353 msgid "Relationship Uses a Related Primary Key" msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:354 msgid "" "The relationship may not be used to show related records because the " "relationship uses a primary key field in the related table, which must " "contain unique values. This would prevent the relationship from specifying " "multiple related records." msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:360 msgid "Relationship Uses a Related Unique Field" msgstr "" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:361 msgid "" "The relationship may not be used to show related records because the " "relationship uses a unique-values field in the related table. This would " "prevent the relationship from specifying multiple related records." msgstr "" #. Translators: This is Automatic text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:90 #, fuzzy msgid "Automatic" msgstr "Ðвто-определение" #. Translators: This is Left text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:94 msgid "Left" msgstr "" #. Translators: This is Right text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:98 msgid "Right" msgstr "" #. Add labels (because we will hide the checkboxes): #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:141 msgid "Font" msgstr "Шрифт" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:144 msgid "Foreground Color" msgstr "" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:147 msgid "Background Color" msgstr "" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.cc:56 msgid "Ascending" msgstr "По возраÑтанию" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #: ../glom/mode_design/report_layout/dialog_layout_report.cc:151 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:198 msgid "Part" msgstr "" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/print_layouts/box_print_layouts.cc:92 msgid "This item already exists. Please choose a different item name" msgstr "" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:224 msgid "Are you sure that you want to rename this print layout?" msgstr "" #. TODO: Show old and new names? #: ../glom/mode_design/print_layouts/box_print_layouts.cc:225 msgid "Rename Print Layout" msgstr "Переименовать формат печати" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:227 #: ../glom/navigation/box_tables.cc:385 msgid "Rename" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:33 #: ../glom/utility_widgets/layouttoolbar.cc:51 msgid "Items" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:34 msgid "Lines" msgstr "Линии" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:35 msgid "Records" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:37 #: ../glom/utility_widgets/layouttoolbar.cc:58 msgid "Database Field" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:37 #: ../glom/utility_widgets/layouttoolbar.cc:58 msgid "Drag this to the layout to add a new database field." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:39 #: ../glom/utility_widgets/layouttoolbar.cc:64 msgid "Drag this to the layout to add a new static text box." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:41 #: ../glom/utility_widgets/layouttoolbar.cc:66 msgid "Drag this to the layout to add a new static image." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:43 msgid "Horizontal Line" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:43 msgid "Drag this to the layout to add a new horizontal line." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:45 msgid "Vertical Line" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:45 msgid "Drag this to the layout to add a new vertical line." msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:47 #: ../glom/utility_widgets/layouttoolbar.cc:60 msgid "Related Records" msgstr "" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:47 msgid "Drag this to the layout to add a new related records portal." msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:123 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:56 msgid "Page _Setup" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:132 msgid "_Insert" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:133 msgid "Insert _Field" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:135 msgid "Insert _Text" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:137 msgid "Insert _Image" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:139 msgid "Insert _Related Records" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:141 msgid "Insert _Horizontal Line" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:143 msgid "Insert _Vertical Line" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:146 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:61 msgid "_View" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:147 msgid "Show Grid" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:149 msgid "Show Rules" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:153 msgid "Fit Page _Width" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:156 msgid "Zoom 200%" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:161 msgid "Zoom 50%" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:166 msgid "Zoom 25%" msgstr "" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:599 msgid "Insert" msgstr "" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:62 msgid "Show _Grid" msgstr "С_етка" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:489 msgid "Edit _Fields" msgstr "" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:492 msgid "Edit _Relationships" msgstr "" #: ../glom/mode_design/script_library/dialog_script_library.cc:133 msgid "Remove library script" msgstr "" #: ../glom/mode_design/script_library/dialog_script_library.cc:134 msgid "" "Do you really want to delete this script? This data can not be recovered" msgstr "" #: ../glom/mode_design/users/dialog_groups_list.cc:70 msgid "View" msgstr "" #: ../glom/mode_design/users/dialog_groups_list.cc:79 #: ../glom/utility_widgets/layoutwidgetmenu.cc:46 #: ../glom/utility_widgets/layoutwidgetutils.cc:38 #: ../glom/utility_widgets/notebooklabelglom.cc:114 msgid "Delete" msgstr "Удалить" #. TODO: Prevent deletion of standard groups #: ../glom/mode_design/users/dialog_groups_list.cc:212 msgid "Delete Group" msgstr "Удаление группы" #: ../glom/mode_design/users/dialog_groups_list.cc:213 msgid "Are your sure that you wish to delete this group?" msgstr "" #: ../glom/mode_design/users/dialog_groups_list.cc:378 msgid "Full access." msgstr "Полный доÑтуп" #: ../glom/mode_design/users/dialog_users_list.cc:159 msgid "Delete User" msgstr "" #: ../glom/mode_design/users/dialog_users_list.cc:160 msgid "Are your sure that you wish to delete this user?" msgstr "" #: ../glom/mode_design/users/dialog_users_list.cc:422 msgid "Developer group may not be empty." msgstr "" #: ../glom/mode_design/users/dialog_users_list.cc:423 msgid "The developer group must contain at least one user." msgstr "" #. Prevent two tables with the same name from being added. #: ../glom/navigation/box_tables.cc:130 msgid "This table already exists. Please choose a different table name" msgstr "" #: ../glom/navigation/box_tables.cc:132 msgid "Hidden" msgstr "" #. TODO: This should really be a radio, but the use of AddDel makes it awkward to change that CellRenderer property. #: ../glom/navigation/box_tables.cc:136 msgid "Default" msgstr "" #. Ask the user if they want us to try to cope with this: #: ../glom/navigation/box_tables.cc:242 msgid "Table Already Exists" msgstr "" #: ../glom/navigation/box_tables.cc:243 msgid "" "This table already exists on the database server, though it is not mentioned " "in the .glom file. This should not happen. Would you like Glom to attempt to " "use the existing table?" msgstr "" #. TODO: Do not show tables that are not in the document. #: ../glom/navigation/box_tables.cc:303 msgid "" "You cannot delete this table, because there is no information about this " "table in the document." msgstr "" #. Ask the user to confirm: #: ../glom/navigation/box_tables.cc:310 msgid "" "Are you sure that you want to delete this table?\n" "Table name: " msgstr "" #: ../glom/navigation/box_tables.cc:311 msgid "Delete Table" msgstr "" #: ../glom/navigation/box_tables.cc:382 msgid "Are you sure that you want to rename this table?" msgstr "" #. TODO: Show old and new names? #: ../glom/navigation/box_tables.cc:383 msgid "Rename Table" msgstr "" #: ../glom/navigation/box_tables.cc:425 msgid "Unknown Table" msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°" #: ../glom/navigation/box_tables.cc:426 msgid "" "You cannot open this table, because there is no information about this table " "in the document." msgstr "" #: ../glom/print_layout/canvas_layout_item.cc:303 #: ../glom/utility_widgets/layoutwidgetmenu.cc:38 msgid "Choose Field" msgstr "" #: ../glom/print_layout/canvas_print_layout.cc:257 msgid "_Formatting" msgstr "" #. Append the View columns: #: ../glom/mode_design/translation/window_translations.cc:66 msgid "Original" msgstr "Оригинал" #: ../glom/mode_design/translation/window_translations.cc:74 msgid "Item" msgstr "Объект" #: ../glom/mode_design/translation/window_translations.cc:82 msgid "Translation" msgstr "Перевод" #. Show only debug output #: ../glom/mode_design/translation/window_translations.cc:435 msgid "Gettext-Warning: " msgstr "Предупреждение Gettext: " #: ../glom/mode_design/translation/window_translations.cc:451 msgid "Gettext-Error: " msgstr "" #. Show the file-chooser dialog, to select an output .po file: #: ../glom/mode_design/translation/window_translations.cc:508 #: ../glom/mode_design/translation/window_translations.cc:586 msgid "Choose .po File Name" msgstr "" #: ../glom/mode_design/translation/window_translations.cc:513 #: ../glom/mode_design/translation/window_translations.cc:590 msgid "Po files" msgstr "" #: ../glom/utility_widgets/adddel/adddel.cc:159 msgid "This item already exists. Please try again." msgstr "" #: ../glom/utility_widgets/adddel/adddel.cc:166 msgid "Duplicate" msgstr "Дубликат" #: ../glom/utility_widgets/comboentryglom.cc:186 msgid "Read-only field." msgstr "Поле только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ." #: ../glom/utility_widgets/comboentryglom.cc:186 msgid "This field may not be edited here." msgstr "" #: ../glom/utility_widgets/datawidget.cc:243 #: ../glom/utility_widgets/datawidget.cc:245 msgid "..." msgstr "..." #: ../glom/utility_widgets/datawidget.cc:247 msgid "Choose a date from an on-screen calendar." msgstr "" #: ../glom/utility_widgets/datawidget.cc:259 msgid "Open" msgstr "" #: ../glom/utility_widgets/datawidget.cc:261 msgid "Open the record identified by this ID, in the other table." msgstr "" #: ../glom/utility_widgets/datawidget.cc:276 msgid "" "Enter search criteria to identify records in the other table, to choose an " "ID for this field." msgstr "" #: ../glom/utility_widgets/db_adddel/db_adddel.cc:106 msgid "Table Content" msgstr "" #. Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. #: ../glom/utility_widgets/db_adddel/db_adddel.cc:683 #, fuzzy msgid "Example" msgstr "Сохранить как образец" #: ../glom/utility_widgets/db_adddel/db_adddel.cc:2399 msgid "Right-click to layout, to specify the related fields." msgstr "" #. Tell user that they can't do that: #: ../glom/utility_widgets/db_adddel/db_adddel.cc:2628 msgid "Extra Related Records Not Possible" msgstr "" #: ../glom/utility_widgets/db_adddel/db_adddel.cc:2629 msgid "" "You attempted to add a new related record, but there can only be one related " "record, because the relationship uses a unique key." msgstr "" #: ../glom/utility_widgets/dialog_image_progress.cc:135 #: ../glom/utility_widgets/dialog_image_progress.cc:156 msgid "Not enough memory available to load the image" msgstr "" #: ../glom/utility_widgets/dialog_image_progress.cc:229 msgid "Error loading %1" msgstr "" #: ../glom/utility_widgets/dialog_image_progress.cc:230 msgid "Error loading image" msgstr "" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:73 msgid "New Database" msgstr "ÐÐ¾Ð²Ð°Ñ Ð±Ð°Ð·Ð° данных" #. For instance, an extra hint when saving from an example, saying that a new file must be saved. #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:90 msgid "" "Please choose a human-readable title for the new database. You can change " "this later in the database properties. It may contain any characters." msgstr "" "Выберите опиÑательное название Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ базы данных. Его можно будет " "изменить позднее в СвойÑтвах базы данных. Ð’Ñ‹ можете иÑпользовать любые " "Ñимволы." #. Use titles that show the distinction between PostgreSQL and SQLite: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:111 msgid "" "Create PostgreSQL database in its own folder, to be hosted by this computer." msgstr "Создать базу данных PostgreSQL в отдельной папке на Ñтом компьютере." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:115 msgid "" "Create database on an external PostgreSQL database server, to be specified " "in the next step." msgstr "" "Создать базу данных PostgreSQL на внешнем Ñервере, который указаваетÑÑ Ð½Ð° " "Ñледующем шаге." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:121 msgid "" "Create SQLite database in its own folder, to be hosted by this computer." msgstr "" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:122 msgid "" "SQLite does not support authentication or remote access but is suitable for " "embedded devices." msgstr "" "SQLite не поддерживает идентификацию пользователей или удаленный доÑтуп, " "однако подходит Ð´Ð»Ñ Ð²Ð½ÐµÐ´Ñ€ÐµÐ½Ð½Ñ‹Ñ… уÑтройÑтв." #. TODO: Hide this because it's the only radio button, so it's not a choice: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:132 msgid "" "Create database in its own folder, to be hosted by this computer, using " "SQLite" msgstr "" #. Only PostgreSQL: #. Use titles that don't mention the boring name of the backend: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:141 msgid "Create database in its own folder, to be hosted by this computer." msgstr "" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:145 msgid "" "Create database on an external database server, to be specified in the next " "step." msgstr "" #. TODO: Use Hildon::FileChooser for Maemo. #: ../glom/utility_widgets/imageglom.cc:406 msgid "Choose Image" msgstr "" #: ../glom/utility_widgets/imageglom.cc:410 msgid "Images" msgstr "" #: ../glom/utility_widgets/imageglom.cc:556 msgid "Choose File" msgstr "" #: ../glom/utility_widgets/layouttoolbar.cc:52 msgid "Containers" msgstr "" #: ../glom/utility_widgets/layouttoolbar.cc:54 msgid "Drag this to the layout to add a new group." msgstr "" #: ../glom/utility_widgets/layouttoolbar.cc:56 msgid "Drag this to the layout to add a new notebook." msgstr "" #: ../glom/utility_widgets/layouttoolbar.cc:60 msgid "Drag this to the layout to add a new Related Record." msgstr "" #: ../glom/utility_widgets/layouttoolbar.cc:62 msgid "Drag this to the layout to add a new button." msgstr "" #: ../glom/utility_widgets/layoutwidgetmenu.cc:39 msgid "Field Layout Properties" msgstr "" #: ../glom/utility_widgets/layoutwidgetmenu.cc:40 msgid "Add Field" msgstr "Добавить поле" #: ../glom/utility_widgets/layoutwidgetmenu.cc:43 msgid "Add Group" msgstr "Добавить группу" #: ../glom/utility_widgets/notebooklabelglom.cc:87 msgid "Delete whole notebook \"%1\"?" msgstr "" #: ../glom/utility_widgets/notebooklabelglom.cc:92 msgid "Delete whole notebook?" msgstr "" #: ../glom/xsl_utils.cc:142 msgid "Report Finished" msgstr "Отчет готов" #: ../glom/xsl_utils.cc:142 msgid "The report will now be opened in your web browser." msgstr "" #~ msgid "Not implemented yet." #~ msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ реализована." #~ msgid "Ellipsize Headers" #~ msgstr "ÐœÐ½Ð¾Ð³Ð¾Ñ‚Ð¾Ñ‡Ð¸Ñ Ð² заголовках" glom-1.22.4/po/pt.po0000644000175000017500000035654112234252646015411 0ustar00murraycmurrayc00000000000000# glom's Portuguese translation. # Copyright © 2004 glom # This file is distributed under the same license as the glom package. # Duarte Loreto , 2004. # flip , 2010. # msgid "" msgstr "" "Project-Id-Version: 2.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-05 01:17+0000\n" "PO-Revision-Date: 2010-02-27 04:50+0000\n" "Last-Translator: flip \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../glom/application.cc:146 msgid "Glom: Generating Encryption Certificates" msgstr "Glom: A gerar certificados de encriptação" #: ../glom/application.cc:147 msgid "" "Please wait while Glom prepares your system for publishing over the network." msgstr "" "Por favor aguarde enquanto o Glom prepara o seu sistema para publicação " "através da rede." #: ../glom/application.cc:174 msgid "(C) 2000-2005 Murray Cumming" msgstr "(C) 2000-2005 Murray Cumming" #: ../glom/application.cc:174 msgid "A Database GUI" msgstr "Uma interface para a base de dados" #: ../glom/application.cc:261 ../glom/bakery/app_withdoc_gtk.cc:279 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:122 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:55 msgid "_File" msgstr "_Ficheiro" #: ../glom/application.cc:262 ../glom/bakery/app_withdoc_gtk.cc:280 msgid "_Recent Files" msgstr "Ficheiros _Recentes" #: ../glom/application.cc:270 msgid "Save As Example" msgstr "Guardar como exemplo" #: ../glom/application.cc:277 msgid "_Export" msgstr "_Exportar" #. Note to translators: "Import" here is an action verb - it's a button. #: ../glom/application.cc:280 ../glom/glom_developer.glade.h:151 #: ../glom/mode_design/translation/window_translations.cc:597 msgid "Import" msgstr "Importar" #: ../glom/application.cc:284 msgid "Shared On Network" msgstr "Partilhado na rede local" #: ../glom/application.cc:295 msgid "_Standard" msgstr "_Padrão" #: ../glom/application.cc:299 msgid "_Edit Print Layouts" msgstr "_Editar Disposição da Lista" #: ../glom/application.cc:383 ../glom/frame_glom.cc:152 #: ../glom/frame_glom.cc:489 ../glom/utility_widgets/datawidget.cc:274 msgid "Find" msgstr "Procurar" #: ../glom/application.cc:383 msgid "Search for records in the table" msgstr "Procurar por registros na tabela" #: ../glom/application.cc:387 msgid "Add Record" msgstr "Adicionar registro" #: ../glom/application.cc:387 msgid "Create a new record in the table" msgstr "Criar um novo registro na tabela" #. "Tables" menu: #: ../glom/application.cc:403 msgid "_Tables" msgstr "_Tabelas" #: ../glom/application.cc:413 msgid "_Edit Tables" msgstr "_Editar tabelas" #: ../glom/application.cc:418 msgid "Add _Related Table" msgstr "Adicionar tabela _relacionada" #. "Reports" menu: #: ../glom/application.cc:425 msgid "_Reports" msgstr "_Relatórios" #: ../glom/application.cc:428 msgid "_Edit Reports" msgstr "_Editar relatórios" #. "UserLevel" menu: #: ../glom/application.cc:436 msgid "_User Level" msgstr "Nível de _Utilizador" #: ../glom/application.cc:439 ../glom/application.cc:463 msgid "_Developer" msgstr "_Programador" #: ../glom/application.cc:443 msgid "_Operator" msgstr "_Operador" #. "Mode" menu: #: ../glom/application.cc:449 msgid "_Mode" msgstr "_Modo" #. We remember this action, so that it can be explicitly activated later. #: ../glom/application.cc:454 msgid "D_ata" msgstr "D_ados" #: ../glom/application.cc:458 ../glom/frame_glom.cc:149 msgid "_Find" msgstr "_Procurar" #: ../glom/application.cc:467 msgid "_Database Preferences" msgstr "_Preferências da base de dados" #: ../glom/application.cc:472 msgid "_Fields" msgstr "_Campos" #: ../glom/application.cc:476 msgid "_Relationships Overview" msgstr "_Visão geral das Relações" #: ../glom/application.cc:480 msgid "_Relationships for this Table" msgstr "_Relações para esta tabela" #: ../glom/application.cc:484 msgid "_Users" msgstr "_Utilizadores" #: ../glom/application.cc:488 msgid "_Print Layouts" msgstr "Disposição de _Impressão" #: ../glom/application.cc:492 msgid "R_eports" msgstr "R_elatórios" #: ../glom/application.cc:496 msgid "Script _Library" msgstr "_Biblioteca de script" #: ../glom/application.cc:501 msgid "_Layout" msgstr "_Disposição" #: ../glom/application.cc:505 msgid "_Test Translation" msgstr "_Testar tradução" #: ../glom/application.cc:509 msgid "_Translations" msgstr "_Traduções" #. "Active Platform" menu: #: ../glom/application.cc:515 msgid "_Active Platform" msgstr "_Plataforma activa" #: ../glom/application.cc:520 msgid "_Normal" msgstr "_Normal" #: ../glom/application.cc:520 msgid "The layout to use for normal desktop environments." msgstr "A disposição a usar para ambientes de trabalho normais." #: ../glom/application.cc:525 msgid "_Maemo" msgstr "_Maemo" #: ../glom/application.cc:525 msgid "The layout to use for Maemo devices." msgstr "A disposição a usar para ambientes Maemo" #: ../glom/application.cc:530 msgid "_Show Layout Toolbar" msgstr "_Mostrar barra de ferramentas de disposição" #: ../glom/application.cc:664 ../glom/bakery/app_withdoc.cc:494 msgid "Open Failed." msgstr "Falha ao abrir" #: ../glom/application.cc:665 msgid "" "The document could not be opened because it was created or modified by a " "newer version of Glom." msgstr "" "Este documento não pode ser aberto porque foi criado ou modificado por uma " "versão mais recente do Glom" #. std::cout << " SOUP_STATUS_FORBIDDEN or SOUP_STATUS_UNAUTHORIZED" << std::endl; #. Warn the user, and let him try again: #: ../glom/application.cc:715 ../glom/frame_glom.cc:2365 #: ../glom/frame_glom.cc:2441 msgid "Connection Failed" msgstr "Falha na ligação" #: ../glom/application.cc:715 ../glom/frame_glom.cc:2365 #: ../glom/frame_glom.cc:2441 msgid "" "Glom could not connect to the database server. Maybe you entered an " "incorrect user name or password, or maybe the postgres database server is " "not running." msgstr "" "O Glom não consegui ligar ao servidor da base de dados. Talvez você tenha " "introduzido um utilizador ou palavra passe incorrecta ou talvez o servidor " "postgres não esteja em execução." #: ../glom/application.cc:907 msgid "" "The file cannot be opened because this version of Glom does not support self-" "hosting of databases." msgstr "" "O ficheiro não pode ser aberto porque esta versão do Glom não suporta bases " "de dados internas." #: ../glom/application.cc:912 ../glom/application.cc:921 msgid "" "The file cannot be opened because this version of Glom does not support " "PostgreSQL databases." msgstr "" "O ficheiro não pode ser aberto porque esta versão do Glom não suporta bases " "de dados PostgreSQL." #: ../glom/application.cc:929 msgid "" "The file cannot be opened because this version of Glom does not support " "SQLite databases." msgstr "" "O ficheiro não pode ser aberto porque esta versão do Glom não suporta bases " "de dados SQLite." #. Warn the user. #: ../glom/application.cc:947 msgid "File Uses Unsupported Database Backend" msgstr "O ficheiro utiliza uma base de dados não suportada." #: ../glom/application.cc:1007 msgid "Creating From Example File" msgstr "A criar pelo ficheiro de exemplo" #: ../glom/application.cc:1008 msgid "" "To use this example file you must save an editable copy of the file. A new " "database will also be created on the server." msgstr "" "Para usar este ficheiro de exemplo você deve guardar uma cópia editável de " "ficheiro. Uma nova base de dados também será criada no servidor." #: ../glom/application.cc:1064 msgid "Opening Read-Only File." msgstr "A abrir um ficheiro apenas de leitura." #: ../glom/application.cc:1065 msgid "" "This file is read only, so you will not be able to enter Developer mode to " "make design changes." msgstr "" "O ficheiro é apenas de leitura, portanto você não será capaz de aceder ao " "modo de desenvolvedor para fazer alterações." #: ../glom/application.cc:1068 msgid "Continue without Developer Mode" msgstr "Continuar sem o modo desenvolvedor" #. The connection to the server is OK, but the database is not there yet. #: ../glom/application.cc:1126 msgid "Database Not Found On Server" msgstr "Base de dados não encontrada no servidor" #: ../glom/application.cc:1126 msgid "" "The database could not be found on the server. Please consult your system " "administrator." msgstr "" "A base de dados não pode ser localizada no servidor. Por favor consulte o " "seu administrador de sistema." #: ../glom/application.cc:1503 msgid "_Contents" msgstr "_Conteúdo" #: ../glom/application.cc:1503 msgid "Help with the application" msgstr "Ajuda com a aplicação" #: ../glom/application.cc:1601 msgid "Creating Glom Database" msgstr "A criar uma base de dados Glom" #: ../glom/application.cc:1601 msgid "Creating Glom database from example file." msgstr "A criar uma base de dados Glom a partir do ficheiro de exemplo." #. The save failed. Tell the user and don't do anything else: #: ../glom/application.cc:2125 ../glom/bakery/app_withdoc.cc:233 #: ../glom/bakery/app_withdoc.cc:284 msgid "Save failed." msgstr "Falha ao guardar." #: ../glom/application.cc:2125 ../glom/bakery/app_withdoc.cc:233 #: ../glom/bakery/app_withdoc.cc:284 msgid "" "There was an error while saving the file. Your changes have not been saved." msgstr "" "Houve um erro ao guardar o ficheiro. As suas alterações não foram guardadas." #: ../glom/application.cc:2166 ../glom/application.cc:2171 #: ../glom/bakery/app_withdoc_gtk.cc:590 msgid "Save Document" msgstr "Guardar documento" #. Warn the user: #: ../glom/application.cc:2259 ../glom/bakery/app_withdoc_gtk.cc:639 msgid "Read-only File." msgstr "Ficheiro apenas de leitura." #: ../glom/application.cc:2259 ../glom/bakery/app_withdoc_gtk.cc:639 msgid "" "You may not overwrite the existing file, because you do not have sufficient " "access rights." msgstr "" "Você não pode sobrescrever o ficheiro existente, porque não tem os direitos " "de acesso necessários." #. Warn the user: #: ../glom/application.cc:2273 ../glom/bakery/app_withdoc_gtk.cc:653 msgid "Read-only Directory." msgstr "Pasta apena de leitura." #: ../glom/application.cc:2273 ../glom/bakery/app_withdoc_gtk.cc:653 msgid "" "You may not create a file in this directory, because you do not have " "sufficient access rights." msgstr "" "Você não pode criar um ficheiro nesta pasta, porque você não tem os direitos " "de acesso necessários." #: ../glom/application.cc:2290 msgid "Database Title missing" msgstr "Falta o título da base de dados" #: ../glom/application.cc:2290 msgid "You must specify a title for the new database." msgstr "Você deve especificar um título para a nova base de dados." #: ../glom/application.cc:2319 ../glom/frame_glom.cc:2090 msgid "Directory Already Exists" msgstr "A pasta já existe" #: ../glom/application.cc:2319 ../glom/frame_glom.cc:2091 msgid "" "There is an existing directory with the same name as the directory that " "should be created for the new database files. You should specify a different " "filename to use a new directory instead." msgstr "" "Há uma pasta com o mesmo nome da pasta que deve ser criada para os ficheiros " "da nova base de dados. Você deve especificar um nome de ficheiro diferente " "para usar uma nova pasta no seu lugar." #: ../glom/application.cc:2529 ../glom/bakery/app_withdoc_gtk.cc:493 msgid " (read-only)" msgstr " (leitura apenas)" #: ../glom/base_db.cc:140 ../glom/base_db.cc:153 msgid "Internal error" msgstr "Erro interno" #: ../glom/base_db.cc:1371 ../glom/mode_design/users/dialog_groups_list.cc:64 msgid "Description" msgstr "Descrição" #: ../glom/base_db.cc:1378 msgid "Comments" msgstr "Comentários" #: ../glom/base_db.cc:2126 msgid "Your find criteria did not match any records in the table." msgstr "A sua pesquisa não encontrou nenhuns resultados na tabela." #: ../glom/base_db.cc:2131 msgid "No Records Found" msgstr "Nenhum registro encontrado." #: ../glom/base_db.cc:2137 msgid "New Find" msgstr "Nova pesquisa" #: ../glom/base_db.cc:3223 msgid "Value Is Not Unique" msgstr "O valor não é único" #: ../glom/base_db.cc:3223 msgid "" "The field's value must be unique, but a record with this value already " "exists." msgstr "" "O valor deste campo deve ser único, mas um registro com este valor já existe." #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:317 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the relationship does not allow automatic creation " "of new related records." msgstr "" "Os dados não podem ser introduzidos dentro do campo relacionado, porque o " "registro relacionado ainda não existe, e o relacionamento não permite a " "criação automática de registros relacionados." #: ../glom/base_db_table_data.cc:322 msgid "Related Record Does Not Exist" msgstr "O registro relacionado não existe" #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/base_db_table_data.cc:342 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the key in the related record is auto-generated and " "therefore can not be created with the key value in this record." msgstr "" "Os dados não podem ser introduzidos dentro deste campo relacionado, porque o " "registro relacionado ainda não existe, e a chave no registro relacionado é " "gerada automaticamente e portanto não pode ser criada com o valor da chave " "neste registro." #: ../glom/base_db_table_data.cc:347 msgid "Related Record Cannot Be Created" msgstr "O registro relacionado não pode ser criado" #. Ask the user for confirmation: #: ../glom/base_db_table_data.cc:449 msgid "" "Are you sure that you would like to delete this record? The data in this " "record will then be permanently lost." msgstr "" "Você tem certeza que gostaria de apagar este registro? Os dados deste " "registro serão perdidos permanentemente." #: ../glom/base_db_table_data.cc:453 msgid "Delete record" msgstr "Apagar registro" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #. Append the View columns: #: ../glom/box_reports.cc:90 ../glom/glom_developer.glade.h:161 #: ../glom/mode_design/box_db_table_relationships.cc:43 #: ../glom/mode_design/fields/box_db_table_definition.cc:53 #: ../glom/mode_design/layout/dialog_choose_field.cc:51 #: ../glom/mode_design/layout/dialog_choose_relationship.cc:52 #: ../glom/mode_design/layout/dialog_layout_details.cc:88 #: ../glom/mode_design/layout/dialog_layout_export.cc:52 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.cc:50 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.cc:49 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:45 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:90 #: ../glom/mode_design/users/dialog_groups_list.cc:60 msgid "Name" msgstr "Nome" #. Don't allow a relationship to be added twice. #: ../glom/box_reports.cc:92 msgid "This report already exists. Please choose a different report name" msgstr "" "Este relatório já existe. Por favor escolha um nome diferente de relatório" #. Title column: #: ../glom/box_reports.cc:94 #: ../glom/mode_design/box_db_table_relationships.cc:47 #: ../glom/mode_design/fields/box_db_table_definition.cc:57 #: ../glom/mode_design/layout/dialog_choose_field.cc:52 #: ../glom/mode_design/layout/dialog_layout_details.cc:101 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc:46 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:94 #: ../glom/navigation/box_tables.cc:133 #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:95 #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:99 msgid "Title" msgstr "Título" #: ../glom/box_reports.cc:226 msgid "Are you sure that you want to rename this report?" msgstr "Você tem certeza que quer renomear este relatório?" #. TODO: Show old and new names? #: ../glom/box_reports.cc:227 msgid "Rename Report" msgstr "Renomear relatório" #. namespace Glom #: ../glom.desktop.in.in.h:1 msgid "A user-friendly database environment." msgstr "Um ambiente de base de dados amigável." #: ../glom.desktop.in.in.h:2 ../glom/glom.glade.h:25 msgid "Glom" msgstr "Glom" #: ../glom/dialog_connection.cc:224 msgid "Not yet created." msgstr "Ainda não criado." #: ../glom/dialog_existing_or_new.cc:52 msgid "No recently used documents available." msgstr "Nenhum documento usado recentemente disponível." #: ../glom/dialog_existing_or_new.cc:53 msgid "No sessions found on the local network." msgstr "Nenhuma sessão encontrada na rede local." #: ../glom/dialog_existing_or_new.cc:56 msgid "No templates available." msgstr "Nenhum modelo disponível." #: ../glom/dialog_existing_or_new.cc:111 msgid "Open a Document" msgstr "Abrir documento" #: ../glom/dialog_existing_or_new.cc:131 msgid "Select File" msgstr "Seleccionar o ficheiro" #: ../glom/dialog_existing_or_new.cc:135 msgid "Local Network" msgstr "Rede local" #: ../glom/dialog_existing_or_new.cc:139 msgid "Recently Opened" msgstr "Aberto recentemente" #: ../glom/dialog_existing_or_new.cc:232 msgid "New Empty Document" msgstr "Novo documento vazio" #: ../glom/dialog_existing_or_new.cc:235 msgid "New From Template" msgstr "Novo a partir de modelo" #. Translator hint: This is on (via Network Interface such as eth0). #: ../glom/dialog_existing_or_new.cc:878 #, c-format msgid "%s on %s (via %s)" msgstr "%s em %s (via %s)" #: ../glom/filechooser_export.cc:32 msgid "Export To File." msgstr "Exportar para ficheiro." #: ../glom/filechooser_export.cc:35 msgid "Define Data _Format" msgstr "Definir _formato de dados" #: ../glom/filechooser_export.cc:41 ../glom/glom_developer.glade.h:120 #: ../glom/mode_design/translation/window_translations.cc:518 msgid "Export" msgstr "Exportar" #: ../glom/frame_glom.cc:136 ../glom/glom.glade.h:40 msgid "Quick Find" msgstr "Procura rápida" #: ../glom/frame_glom.cc:152 msgid "Search for records" msgstr "Procurar por registros" #: ../glom/frame_glom.cc:195 msgid "Glom: Find" msgstr "Glom: Procurar" #. TODO: Obviously this document should have been deleted when the database-creation was cancelled. #. Note that "canceled" is the correct US spelling. #: ../glom/frame_glom.cc:402 msgid "No table" msgstr "Nenhuma tabela" #: ../glom/frame_glom.cc:402 msgid "This database has no tables yet." msgstr "Esta base de dados ainda não tem tabelas." #: ../glom/frame_glom.cc:438 ../glom/glom.glade.h:19 msgid "Data" msgstr "Dados" #: ../glom/frame_glom.cc:497 #: ../glom/libglom/data_structure/translatable_item.cc:320 #: ../glom/mode_design/translation/window_translations.cc:218 msgid "Unknown" msgstr "Desconhecido" #. TODO: Obviously this could be possible but it would require a network protocol and some work: #: ../glom/frame_glom.cc:570 msgid "Developer Mode Not Available." msgstr "Modo desenvolvedor não disponível." #: ../glom/frame_glom.cc:571 msgid "" "Developer mode is not available because the file was opened over the network " "from a running Glom. Only the original file may be edited." msgstr "" "O modo desenvolvedor não está disponível porque o ficheiro foi aberto " "através da rede a partir dum Glom em execução. Apenas o ficheiro original " "pode ser editado." #: ../glom/frame_glom.cc:577 msgid "Developer Mode Not Available" msgstr "Modo desenvolvedor não disponível." #: ../glom/frame_glom.cc:578 msgid "" "Developer mode is not available. Check that you have sufficient database " "access rights and that the glom file is not read-only." msgstr "" "O modo desenvolvedor não está disponível. Verifique se você tem direitos de " "acesso suficientes à base de dados e se o ficheiro do Glom não é apenas de " "leitura." #: ../glom/frame_glom.cc:585 msgid "Saving in New Document Format" msgstr "A gravar num novo formato" #: ../glom/frame_glom.cc:586 msgid "" "The document was created by an earlier version of the application. Making " "changes to the document will mean that the document cannot be opened by some " "earlier versions of the application." msgstr "" "O documento foi criado por uma versão anterior da aplicação. Efectuar " "alterações no documento fará com que o documento não possa ser aberto por " "versões anteriores da aplicação." #: ../glom/frame_glom.cc:589 msgid "Continue" msgstr "Continuar" #: ../glom/frame_glom.cc:638 msgid "Export Not Allowed." msgstr "Exportação não permitida." #: ../glom/frame_glom.cc:638 msgid "" "You do not have permission to view the data in this table, so you may not " "export the data." msgstr "" "Você não tem permissão para ver os dados nesta tabela, portanto você não " "pode exportar os dados." #: ../glom/frame_glom.cc:669 msgid "Could Not Create File." msgstr "Não foi possível criar o ficheiro." #: ../glom/frame_glom.cc:669 msgid "Glom could not create the specified file." msgstr "Glom não pode criar o ficheiro especificado." #: ../glom/frame_glom.cc:871 msgid "No Table" msgstr "Nenhuma Tabela" #: ../glom/frame_glom.cc:871 msgid "There is no table in to which data could be imported." msgstr "Não existe nenhuma tabela para o qual os dados possam ser importados." #: ../glom/frame_glom.cc:875 msgid "Choose a CSV file to open" msgstr "Escolha um ficheiro CSV para abrir" #: ../glom/frame_glom.cc:879 msgid "CSV files" msgstr "Ficheiros CSV" #: ../glom/frame_glom.cc:883 msgid "All files" msgstr "Todos os ficheiros" #: ../glom/frame_glom.cc:974 msgid "Share On Network" msgstr "Partilhar na rede local" #: ../glom/frame_glom.cc:975 msgid "" "Are you sure that you wish to allow other users on the network to use this " "database?" msgstr "" "Você tem a certeza que quer permitir a outros utilizadores na rede local o " "uso desta base de dados?" #: ../glom/frame_glom.cc:978 msgid "_Share" msgstr "_Partilhar" #. TODO: Warn about connected users if possible. #: ../glom/frame_glom.cc:1073 msgid "Stop Sharing On Network" msgstr "Parar de partilhar na rede" #: ../glom/frame_glom.cc:1074 msgid "" "Are you sure that you wish to prevent other users on the network from using " "this database?" msgstr "" "Você tem a certeza que quer bloquear outros utilizadores na rede o uso desta " "base de dados?" #: ../glom/frame_glom.cc:1077 msgid "_Stop Sharing" msgstr "_Parar de partilhar" #: ../glom/frame_glom.cc:1307 msgid "Table Exists Already" msgstr "A tabela já existe" #: ../glom/frame_glom.cc:1307 msgid "" "A table with this name already exists in the database. Please choose a " "different table name." msgstr "" "Uma tabela com este nome já existe na base de dados. Por favor escolha um " "nome de tabela diferente." #: ../glom/frame_glom.cc:1311 msgid "Relationship Exists Already" msgstr "A relação já existe" #: ../glom/frame_glom.cc:1311 msgid "" "A relationship with this name already exists for this table. Please choose a " "different relationship name." msgstr "" "Uma relação com este nome já existe nesta tabela. Por favor escolha um nome " "de relação diferente." #: ../glom/frame_glom.cc:1315 msgid "More information needed" msgstr "Mais informações são necessárias" #: ../glom/frame_glom.cc:1315 msgid "You must specify a field, a table name, and a relationship name." msgstr "" "Você deve especificar um campo, um nome de tabela, e um nome de relação." #: ../glom/frame_glom.cc:1369 msgid "Related Table Created" msgstr "Tabela relacionada criada" #: ../glom/frame_glom.cc:1369 msgid "The new related table has been created." msgstr "A nova tabela relacionada foi criada." #: ../glom/frame_glom.cc:1399 ../glom/glom.glade.h:45 #: ../glom/navigation/box_tables.cc:128 msgid "Tables" msgstr "Tabelas" #: ../glom/frame_glom.cc:1478 ../glom/utility_widgets/dialog_choose_id.cc:105 msgid "You have not entered any quick find criteria." msgstr "Você não introduziu qualquer critério de pesquisa." #: ../glom/frame_glom.cc:1483 ../glom/mode_data/box_data.cc:143 #: ../glom/utility_widgets/dialog_choose_id.cc:109 msgid "No Find Criteria" msgstr "Nenhum critério de pesquisa" #. show user level: #: ../glom/frame_glom.cc:1543 msgid "Operator" msgstr "Operador" #: ../glom/frame_glom.cc:1545 msgid "Developer" msgstr "Desenvolvedor" #: ../glom/frame_glom.cc:2059 msgid "Initializing Database Data" msgstr "A iniciar a base de dados" #: ../glom/frame_glom.cc:2068 msgid "Starting Database Server" msgstr "A iniciar o servidor da base de dados" #: ../glom/frame_glom.cc:2076 msgid "Stopping Database Server" msgstr "A parar o servidor da base de dados" #: ../glom/frame_glom.cc:2095 msgid "Could Not Create Directory" msgstr "Não foi possível criar a pasta" #: ../glom/frame_glom.cc:2096 msgid "" "There was an error when attempting to create the directory for the new " "database files." msgstr "" "Houve um erro ao tentar criar a pasta para os ficheiros da nova base de " "dados." #: ../glom/frame_glom.cc:2100 msgid "Could Not Start Database Server" msgstr "Não foi possível iniciar o servidor da base de dados" #: ../glom/frame_glom.cc:2101 msgid "There was an error when attempting to start the database server." msgstr "Houve um erro ao tentar iniciar o servidor da base de dados" #. Show 0 instead of "all" when all of no records are found, to avoid confusion. #: ../glom/frame_glom.cc:2913 msgid "All" msgstr "Todos" #. namespace Glom #: ../glom/glom_developer.glade.h:1 msgid "Add Related Table" msgstr "Adicionar tabela relacionada" #: ../glom/glom_developer.glade.h:2 msgid "Address" msgstr "Endereços" #: ../glom/glom_developer.glade.h:3 msgid "Available Parts" msgstr "Partes disponíveis" #: ../glom/glom_developer.glade.h:4 msgid "Choices" msgstr "Escolhas" #: ../glom/glom_developer.glade.h:5 msgid "Dates" msgstr "Datas" #: ../glom/glom_developer.glade.h:6 msgid "English" msgstr "Inglês" #: ../glom/glom_developer.glade.h:7 msgid "Field Definitions" msgstr "Definições de campo" #: ../glom/glom_developer.glade.h:8 msgid "Field:" msgstr "Campo:" #: ../glom/glom_developer.glade.h:9 msgid "Fields" msgstr "Campos" #: ../glom/glom_developer.glade.h:10 msgid "Formatting" msgstr "Formatação" #: ../glom/glom_developer.glade.h:11 msgid "Group By" msgstr "Agrupar por" #: ../glom/glom_developer.glade.h:12 msgid "Group:" msgstr "Grupo:" #: ../glom/glom_developer.glade.h:13 msgid "Groups" msgstr "Grupos" #: ../glom/glom_developer.glade.h:14 msgid "Image" msgstr "Imagem" #: ../glom/glom_developer.glade.h:15 msgid "Label:" msgstr "Etiqueta:" #: ../glom/glom_developer.glade.h:16 msgid "Layout name:" msgstr "Nome da disposição:" #: ../glom/glom_developer.glade.h:17 msgid "Navigation" msgstr "Navegação" #: ../glom/glom_developer.glade.h:18 msgid "Notebook Tabs" msgstr "Abas do conjunto de abas" #: ../glom/glom_developer.glade.h:19 msgid "Numeric Formatting" msgstr "Formatação numérica" #: ../glom/glom_developer.glade.h:20 msgid "Parts" msgstr "Partes" #: ../glom/glom_developer.glade.h:21 msgid "Print Layouts" msgstr "Disposição de impressão" #: ../glom/glom_developer.glade.h:22 msgid "Relationship:" msgstr "Relação:" #: ../glom/glom_developer.glade.h:23 msgid "Relationships" msgstr "Relações" #: ../glom/glom_developer.glade.h:24 msgid "Report name:" msgstr "Nome de relatório" #: ../glom/glom_developer.glade.h:25 msgid "Reports" msgstr "Relatórios" #: ../glom/glom_developer.glade.h:26 msgid "Select Field" msgstr "Seleccionar campo" #: ../glom/glom_developer.glade.h:27 msgid "Select Relationship" msgstr "Seleccionar relação" #: ../glom/glom_developer.glade.h:28 msgid "Sort Fields" msgstr "Ordenar campos" #: ../glom/glom_developer.glade.h:29 msgid "Source Language:" msgstr "Idioma de origem:" #: ../glom/glom_developer.glade.h:30 msgid "Summary Field" msgstr "Campo de resumo" #: ../glom/glom_developer.glade.h:31 msgid "Table:" msgstr "Tabela: " #: ../glom/glom_developer.glade.h:32 msgid "Tables" msgstr "Tabelas" #: ../glom/glom_developer.glade.h:33 msgid "Target Language:" msgstr "Idioma alvo:" #: ../glom/glom_developer.glade.h:34 msgid "Text Formatting" msgstr "Formatação de texto" #: ../glom/glom_developer.glade.h:35 msgid "Text" msgstr "Texto" #: ../glom/glom_developer.glade.h:36 msgid "Title:" msgstr "Título:" #: ../glom/glom_developer.glade.h:37 msgid "Title" msgstr "Título" #: ../glom/glom_developer.glade.h:38 msgid "Translations" msgstr "Traduções" #: ../glom/glom_developer.glade.h:39 msgid "User" msgstr "Utilizador" #: ../glom/glom_developer.glade.h:40 msgid "Users" msgstr "Utilizadores" #: ../glom/glom_developer.glade.h:41 msgid "" "Add Module\n" "\n" "What name should this module have?" msgstr "" "Adicionar módulo\n" "\n" "Qual deve ser o nome deste módulo?" #: ../glom/glom_developer.glade.h:44 msgid "" "Add User To Group\n" "\n" "Which user should be added to this group?" msgstr "" "Adicionar utilizador ao grupo\n" "\n" "Qual utilizador deve ser adicionado a este grupo?" #: ../glom/glom_developer.glade.h:47 msgid "" "Choose Date\n" "\n" "Please select a date to enter in this field." msgstr "" "Escolher data\n" "\n" "Por favor seleccione uma data para ser introduzida neste campo." #: ../glom/glom_developer.glade.h:50 msgid "" "Copy Translation\n" "\n" "From what language would you like to copy the translations to use as the " "start of the current translation?" msgstr "" "Copiar tradução\n" "\n" "Qual o idiona que você gostaria de copiar as traduções para usar como início " "da sua tradução actual?" #: ../glom/glom_developer.glade.h:53 msgid "" "Create Group\n" "\n" "What name should this group have?" msgstr "" "Criar grupo\n" "\n" "Qual deve ser o nome deste grupo?" #: ../glom/glom_developer.glade.h:56 msgid "" "Database creation failed\n" "\n" "Glom could not create the new database. Maybe you do not have the necessary " "access rights. Please contact your system administrator." msgstr "" "Falha na criação da base de dados\n" "\n" "Glom não pode criar uma base de dados nova. Talvez você não tenha os " "direitos de acesso necessários. Por favor entre em contacto com o seu " "administrador de sistemas." #: ../glom/glom_developer.glade.h:59 msgid "" "First User\n" "\n" "Please enter the initial connection details for your database. You may add " "additional users later. Remember to keep this password secret because it " "allows access to your data from other computers on the network." msgstr "" "\tPrimeiro utilizador\n" "\n" "Por favor introduza os detalhes da ligação para a sua nova base de dados. " "Você pode adicionar outros utilizadores no futuro. Lembre-se de manter esta " "senha em segredo porque ela permite acesso aos seus dados nos computadores " "na rede." #: ../glom/glom_developer.glade.h:62 msgid "" "Identify Original\n" "\n" "The language of the original text is currently identified as:" msgstr "" "Identificar original\n" "\n" "O idioma do texto original está actualmente identificado como:" #: ../glom/glom_developer.glade.h:65 msgid "" "Test Translation\n" "\n" "Choose a language to use temporarily to test the translations. These " "translations are normally used automatically when the application is started " "on a computer that uses the language.\n" "\n" "Note that the standard parts of the Glom user interface, such as menus and " "dialog windows, will only be translated when you start Glom on a computer " "that uses that language." msgstr "" "Testar tradução\n" "\n" "Escolha o idioma a ser usado temporariamente para testar as traduções. Estas " "traduções são normalmente usadas quando a aplicação é iniciada num " "computador que usa o idioma.\n" "\n" "Observe que as partes padrão da interface do Glom, tais como menus e janelas " "de diálogo, serão traduzidas apenas quando você iniciar o Glom num " "computador que use esse idioma." #: ../glom/glom_developer.glade.h:70 #: ../glom/utility_widgets/layoutwidgetmenu.cc:44 msgid "Add Button" msgstr "Adicionar botão" #: ../glom/glom_developer.glade.h:71 #: ../glom/utility_widgets/layoutwidgetmenu.cc:42 msgid "Add Notebook" msgstr "Adicionar conjunto de abas" #: ../glom/glom_developer.glade.h:72 msgid "Add Related Calendar" msgstr "Adicionar calendário relacionado" #: ../glom/glom_developer.glade.h:73 #: ../glom/utility_widgets/layoutwidgetmenu.cc:41 msgid "Add Related Records" msgstr "Adicionar registros relacionados" #: ../glom/glom_developer.glade.h:74 msgid "Add Related Table" msgstr "Adicionar tabela relacionada" #: ../glom/glom_developer.glade.h:75 #: ../glom/utility_widgets/layoutwidgetmenu.cc:45 msgid "Add Text" msgstr "Adicionar texto" #: ../glom/glom_developer.glade.h:76 msgid "Add _Group" msgstr "Adicionar _Grupo" #: ../glom/glom_developer.glade.h:77 msgid "" "Add a button. Edit the button to define the script that will be run when the " "button is clicked." msgstr "" "Adiciona um botão. Edite o botão para definir o script que será executado " "quando o botão for clicado." #: ../glom/glom_developer.glade.h:78 msgid "" "Add a group which can contain other layout items. Use this to group items " "together, such as fields." msgstr "" "Adiciona um grupo que pode conter outros itens de disposição. Use estes " "itens de grupo juntos, tais como os campos." #: ../glom/glom_developer.glade.h:79 msgid "" "Add a layout item that shows the data from a field in the record, and allows " "the user to edit that value." msgstr "" "Adiciona um item de disposição que mostra os dados de um campo no registro, " "e permite que o utilizador edite aquele valor." #: ../glom/glom_developer.glade.h:80 msgid "" "Add a related records calendar portal. This is a calendar showing records " "from a related table. Remember to edit this layout item to specify the " "relationship to use, and the fields to show from the related table." msgstr "" "Adiciona um portal de calendário de registros relacionados mostrando " "registros de uma tabela relacionada. Lembre-se de editar este item de " "disposição para especificar a relação a ser usada, e os campos a serem " "mostrados a partir da tabela relacionada." #: ../glom/glom_developer.glade.h:81 msgid "" "Add a related records portal. This is a list of records in a related table. " "Remember to edit this layout item to specify the relationship to use, and " "the fields to show from the related table." msgstr "" "Adiciona um portal de registros relacionados. Esta é uma lista de registros " "em uma tabela relacionada. Lembre-se de editar este item de disposição para " "especificar a relação a ser usada, e os campos a serem mostrados a partir da " "tabela relacionada." #: ../glom/glom_developer.glade.h:82 msgid "" "Add a tabbed notebook. Each page of the notebook may contain several other " "layout items, but only one page will be visible at one time." msgstr "" "Adiciona um conjunto de abas. Cada aba pode conter vários itens de " "disposição, mas apenas uma página pode estar visível de cada vez." #: ../glom/glom_developer.glade.h:83 msgid "" "Add an image to the layout, such as a logo. The image will be the same for " "every record viewed. To show an image field from a record, to show different " "images for each field, use the field layout item." msgstr "" "Adiciona uma imagem à disposição, como um logótipo. A imagem será a mesma " "para todos os registros vistos. Para mostrar uma imagem a partir de um " "registro, para mostrar imagens diferentes para cada campo, use o item de " "disposição de campo." #: ../glom/glom_developer.glade.h:84 msgid "" "Add text to a layout, such as an explanation or a warning. The text will be " "the same for every record viewed." msgstr "" "Adiciona texto a uma disposição, como uma explicação ou um aviso. O texto " "será o mesmo para cada registro visto." #: ../glom/glom_developer.glade.h:85 #: ../glom/mode_design/box_db_table_relationships.cc:53 msgid "Allow Editing" msgstr "Permitir edição" #: ../glom/glom_developer.glade.h:86 msgid "Also show:" msgstr "Mostrar também:" #: ../glom/glom_developer.glade.h:87 msgid "Alternative Color for Negative Values" msgstr "Cor alternativa para valores negativos" #: ../glom/glom_developer.glade.h:88 msgid "Auto-increment" msgstr "Incrementar automaticamente" #: ../glom/glom_developer.glade.h:89 msgid "Auto-increment values" msgstr "Valores de incremento automático" #: ../glom/glom_developer.glade.h:90 msgid "Automatic:" msgstr "Automático:" #: ../glom/glom_developer.glade.h:91 msgid "Background Color:" msgstr "Cor de plano de fundo:" #: ../glom/glom_developer.glade.h:92 msgid "Border Width (ems)" msgstr "Largura da borda (ems)" #: ../glom/glom_developer.glade.h:93 msgid "Button Script" msgstr "Script de botão" #: ../glom/glom_developer.glade.h:94 msgid "C_reate" msgstr "C_riar" #: ../glom/glom_developer.glade.h:95 msgid "Calculate Value" msgstr "Calcular valor" #. Translators: This is the verb #: ../glom/glom_developer.glade.h:97 msgid "Check" msgstr "Verificar" #: ../glom/glom_developer.glade.h:98 msgid "Choices From Related Records" msgstr "Escolhas de registros relacionados" #: ../glom/glom_developer.glade.h:99 msgid "Choose Date" msgstr "Escolher data" #: ../glom/glom_developer.glade.h:100 msgid "Choose User" msgstr "Escolher utilizador" #: ../glom/glom_developer.glade.h:101 msgid "" "Click this check box to use a different foreground color to display negative " "values." msgstr "" "Clique nesta caixa para usar uma cor de primeiro plano diferente da padrão." #: ../glom/glom_developer.glade.h:102 msgid "Click this check box to use a non-standard background color." msgstr "Clique nesta caixa para usar uma cor de fundo diferente." #: ../glom/glom_developer.glade.h:103 msgid "Click this check box to use a non-standard font." msgstr "Clique nesta caixa para usar uma fonte diferente." #: ../glom/glom_developer.glade.h:104 msgid "Click this check box to use a non-standard foreground color." msgstr "Clique nesta caixa para usar uma cor de primeiro plano diferente." #: ../glom/glom_developer.glade.h:105 msgid "" "Clicking the row button takes the user to the table specified by this " "relationship:" msgstr "" "Clicar no botão da linha leva o utilizador à tabela especificada por esta " "relação:" #: ../glom/glom_developer.glade.h:106 msgid "Columns:" msgstr "Colunas:" #: ../glom/glom_developer.glade.h:107 msgid "Confirm Password" msgstr "Confirmar senha" #: ../glom/glom_developer.glade.h:108 msgid "Copy From Existing Translation" msgstr "Copiar de tradução existente" #: ../glom/glom_developer.glade.h:109 msgid "Country:" msgstr "País:" #: ../glom/glom_developer.glade.h:110 #: ../glom/mode_design/users/dialog_groups_list.cc:76 msgid "Create" msgstr "Criar" #: ../glom/glom_developer.glade.h:111 msgid "Create Group" msgstr "Criar grupo" #: ../glom/glom_developer.glade.h:112 msgid "Currency Symbol" msgstr "Símbolo da moeda" #: ../glom/glom_developer.glade.h:113 msgid "Custom Choice List" msgstr "Lista de escolhas personalizadas" #: ../glom/glom_developer.glade.h:114 msgid "Database Preferences" msgstr "Preferências da base de dados" #: ../glom/glom_developer.glade.h:115 msgid "Date Field:" msgstr "Campo de data:" #: ../glom/glom_developer.glade.h:116 msgid "Decimal Places" msgstr "Casas decimais" #: ../glom/glom_developer.glade.h:117 msgid "Default Formatting" msgstr "Formatação padrão" #: ../glom/glom_developer.glade.h:118 #: ../glom/mode_design/users/dialog_groups_list.cc:73 msgid "Edit" msgstr "Editar" #: ../glom/glom_developer.glade.h:119 msgid "English" msgstr "Inglês" #: ../glom/glom_developer.glade.h:121 msgid "Export Format" msgstr "Formato de exportação" #: ../glom/glom_developer.glade.h:122 #: ../glom/libglom/data_structure/layout/layoutitem_field.cc:193 #: ../glom/libglom/data_structure/translatable_item.cc:296 #: ../glom/mode_design/dialog_database_preferences.cc:54 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:601 msgid "Field" msgstr "Campo" #: ../glom/glom_developer.glade.h:123 msgid "Field Calculation" msgstr "Cálculos do campo" #: ../glom/glom_developer.glade.h:124 msgid "Field Definition" msgstr "Definição de campo" #: ../glom/glom_developer.glade.h:125 ../glom/mode_design/dialog_fields.cc:36 msgid "Field Definitions" msgstr "Definições de campos" #: ../glom/glom_developer.glade.h:126 msgid "Field Layout" msgstr "Disposição dos campos" #: ../glom/glom_developer.glade.h:127 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:71 msgid "Field Summary" msgstr "Resumo dos campos" #: ../glom/glom_developer.glade.h:128 msgid "Field:" msgstr "Campo:" #: ../glom/glom_developer.glade.h:129 msgid "Font:" msgstr "Fonte:" #: ../glom/glom_developer.glade.h:130 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_footer.cc:55 msgid "Footer" msgstr "Rodapé" #: ../glom/glom_developer.glade.h:131 msgid "Foreground Color:" msgstr "Cor de primeiro plano:" #: ../glom/glom_developer.glade.h:132 #: ../glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc:32 msgid "Formatting" msgstr "Formatação" #. Translators: FROM as in SQL's FROM #: ../glom/glom_developer.glade.h:134 msgid "From Field:" msgstr "Do campo:" #: ../glom/glom_developer.glade.h:135 #: ../glom/libglom/data_structure/layout/layoutgroup.cc:377 #: ../glom/mode_data/flowtablewithfields.cc:1309 #: ../glom/mode_data/flowtablewithfields.cc:1336 #: ../glom/utility_widgets/layouttoolbar.cc:54 #: ../glom/utility_widgets/layouttoolbar.cc:64 #: ../glom/utility_widgets/notebooklabelglom.cc:74 msgid "Group" msgstr "Grupo" #: ../glom/glom_developer.glade.h:136 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.cc:102 msgid "Group By" msgstr "Grupo" #: ../glom/glom_developer.glade.h:137 msgid "Group By - Secondary Fields" msgstr "Grupo por - campos secundários" #: ../glom/glom_developer.glade.h:138 msgid "Group By - Sort Fields" msgstr "Grupo por - campos ordenados" #: ../glom/glom_developer.glade.h:139 msgid "Group Name" msgstr "Nome do grupo" #: ../glom/glom_developer.glade.h:140 msgid "Group Properties" msgstr "Propriedades do grupo" #: ../glom/glom_developer.glade.h:141 msgid "Groups" msgstr "Grupos" #: ../glom/glom_developer.glade.h:142 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_header.cc:55 msgid "Header" msgstr "Cabeçalho" #: ../glom/glom_developer.glade.h:143 msgid "Height (lines)" msgstr "Altura (linhas)" #: ../glom/glom_developer.glade.h:144 msgid "Horizontal Alignment:" msgstr "Alinhamento horizontal" #: ../glom/glom_developer.glade.h:145 msgid "Identify Original" msgstr "Identificar original" #: ../glom/glom_developer.glade.h:146 msgid "Identify Source" msgstr "Identificar origem" #: ../glom/glom_developer.glade.h:147 msgid "" "If the text is not actually in this language, please choose the correct " "language." msgstr "" "Se o texto não estiver realmente neste idioma, por favor escolha o idioma " "correto." #: ../glom/glom_developer.glade.h:148 msgid "" "If this is not selected then a thousands separator will not be used, even if " "your locale would normally use one. If it is selected then a thousands " "separator will be used only if your locale normally uses one." msgstr "" "Se isto não for seleccionado então um separador de milhares não será usado, " "mesmo se a sua localização normalmente usar. Se for seleccionado então um " "separador de milhares será usado apenas se sua localização normalmente usar." #: ../glom/glom_developer.glade.h:149 msgid "" "If this is selected then the field value will be shown in a multi-line box " "with a scrollbar." msgstr "" "Se isto for seleccionado então o valor do campo será mostrado numa caixa de " "linhas múltiplas com uma barra de rolagem." #: ../glom/glom_developer.glade.h:150 msgid "Image Object" msgstr "Objecto de imagem" #: ../glom/glom_developer.glade.h:152 msgid "Language:" msgstr "Idioma:" #. Don't add ContextLayout in client only mode because it would never #. be sensitive anyway #: ../glom/glom_developer.glade.h:153 #: ../glom/mode_data/box_data_calendar_related.cc:501 #: ../glom/utility_widgets/db_adddel/db_adddel.cc:276 msgid "Layout" msgstr "Disposição" #: ../glom/glom_developer.glade.h:154 msgid "Locale:" msgstr "Localização:" #: ../glom/glom_developer.glade.h:155 msgid "Logo" msgstr "Logotipo" #: ../glom/glom_developer.glade.h:156 msgid "Lookup value when a field changes." msgstr "Procurar valor quando um campo for alterado." #. Translators: The Main part of the report (not the footer or header) #: ../glom/glom_developer.glade.h:158 msgid "Main" msgstr "Principal" #: ../glom/glom_developer.glade.h:159 msgid "Module name:" msgstr "Nome do módulo:" #: ../glom/glom_developer.glade.h:160 msgid "Multi-line" msgstr "Linhas múltiplas" #: ../glom/glom_developer.glade.h:162 msgid "Name of new related table:" msgstr "Nome da nova tabela relacionada:" #: ../glom/glom_developer.glade.h:163 msgid "Name of new relationship:" msgstr "Nome da nova relação: " #: ../glom/glom_developer.glade.h:164 msgid "Name:" msgstr "Nome:" #: ../glom/glom_developer.glade.h:165 msgid "No Choices" msgstr "Sem escolhas" #: ../glom/glom_developer.glade.h:166 msgid "None" msgstr "Nenhum" #: ../glom/glom_developer.glade.h:167 ../glom/glom.glade.h:32 #: ../glom/mode_design/dialog_design.cc:54 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:492 msgid "None selected" msgstr "Nenhum seleccionado" #: ../glom/glom_developer.glade.h:168 #: ../glom/mode_design/layout/dialog_layout_details.cc:1006 msgid "Notebook Tabs" msgstr "Conjunto de abas" #: ../glom/glom_developer.glade.h:169 msgid "Organisation" msgstr "Organização" #: ../glom/glom_developer.glade.h:170 ../glom/glom.glade.h:36 msgid "Password" msgstr "Senha" #: ../glom/glom_developer.glade.h:171 msgid "Primary Key" msgstr "Chave primária" #: ../glom/glom_developer.glade.h:172 msgid "Print Layout Editor" msgstr "Editor de disposição de impressão" #: ../glom/glom_developer.glade.h:173 msgid "Print Layouts" msgstr "Disposições de impressão" #: ../glom/glom_developer.glade.h:174 #: ../glom/utility_widgets/layoutwidgetutils.cc:37 msgid "Properties" msgstr "Propriedades" #: ../glom/glom_developer.glade.h:175 #: ../glom/libglom/data_structure/translatable_item.cc:300 msgid "Relationship" msgstr "Relações" #: ../glom/glom_developer.glade.h:176 msgid "Relationship:" msgstr "Relações:" #: ../glom/glom_developer.glade.h:177 msgid "Relationships Overview" msgstr "Visão geral de relações" #: ../glom/glom_developer.glade.h:178 msgid "" "Remove the item from the layout. If you remove a field layout item, it will " "not remove the field from the table itself. It just will not be seen on the " "layout." msgstr "" "Remove o item da disposição. Se você remover um item da disposição, o campo " "não será removido da tabela. Ele apenas não será visto na disposição." #: ../glom/glom_developer.glade.h:179 msgid "Report Layout" msgstr "Disposição de relatório" #: ../glom/glom_developer.glade.h:180 msgid "Reports" msgstr "Relatórios" #: ../glom/glom_developer.glade.h:181 msgid "Restrict data to these choices" msgstr "Dados restritos para estas escolhas" #: ../glom/glom_developer.glade.h:182 msgid "Script name:" msgstr "Nome do script:" #: ../glom/glom_developer.glade.h:183 msgid "Secondary Fields:" msgstr "Campos secundários:" #: ../glom/glom_developer.glade.h:184 #: ../glom/utility_widgets/dialog_choose_id.cc:88 #: ../glom/utility_widgets/imageglom.cc:415 msgid "Select" msgstr "Seleccionar" #: ../glom/glom_developer.glade.h:185 msgid "Select Field" msgstr "Seleccionar campo" #: ../glom/glom_developer.glade.h:186 msgid "Select Relationship" msgstr "Seleccionar relação" #: ../glom/glom_developer.glade.h:187 msgid "Show Related Relationships" msgstr "Mostrar relações relacionadas" #: ../glom/glom_developer.glade.h:188 msgid "Show Table Title" msgstr "Mostrar título da tabela" #: ../glom/glom_developer.glade.h:189 msgid "Show child relationships" msgstr "Mostrar relações filhas" #: ../glom/glom_developer.glade.h:190 msgid "Sort Fields:" msgstr "Campos ordenados:" #: ../glom/glom_developer.glade.h:191 msgid "" "Start a translation for this target locale by copying the strings from " "another target locale." msgstr "" "Inicia uma tradução para esta localização alvo ao copiar as expressões de " "outra localização alvo." #: ../glom/glom_developer.glade.h:192 msgid "State/County:" msgstr "Estado/País:" #: ../glom/glom_developer.glade.h:193 msgid "Street (Line 2):" msgstr "Rua (linha 2):" #: ../glom/glom_developer.glade.h:194 msgid "Street:" msgstr "Rua:" #: ../glom/glom_developer.glade.h:195 msgid "Summary Type:" msgstr "Tipo de resumo:" #: ../glom/glom_developer.glade.h:196 msgid "System Name:" msgstr "Nome do sistema:" #: ../glom/glom_developer.glade.h:197 msgid "Table Name" msgstr "Nome da tabela" #: ../glom/glom_developer.glade.h:198 ../glom/glom.glade.h:44 msgid "Table:" msgstr "Tabela:" #: ../glom/glom_developer.glade.h:199 msgid "Table: " msgstr "Tabela: " #: ../glom/glom_developer.glade.h:200 msgid "Test" msgstr "Testar" #: ../glom/glom_developer.glade.h:201 msgid "Test Translation" msgstr "Testar tradução" #: ../glom/glom_developer.glade.h:202 msgid "Text Format" msgstr "Formato de texto" #: ../glom/glom_developer.glade.h:203 msgid "Text Object" msgstr "Objecto de texto" #: ../glom/glom_developer.glade.h:204 msgid "" "The field value will be the return value of the python function, which you " "implement here." msgstr "" "O valor do campo será o valor de retorno da função em python, que você " "implementar aqui." #: ../glom/glom_developer.glade.h:205 msgid "" "These modules will be available to your button scripts and field " "calculations via the python import keyword." msgstr "" "Estes módulos estarão disponíveis para os seus scripts de botão e cálculo de " "campo pelo teclado de importação em python." #: ../glom/glom_developer.glade.h:206 msgid "" "This field will be used to decide which records to show in the calendar." msgstr "" "Este campo será usado para decidir quais registros a mostrar no calendário." #: ../glom/glom_developer.glade.h:207 msgid "" "This will add a new table and add a relationship that refers to the new " "table, as a convenient alternative to doing this in separate steps.\n" "\n" "If a suitable related table already exists then you should instead cancel " "and just add a relationship." msgstr "" "Isto adicionará uma nova tabela e adicionará uma relação que se refere à " "nova tabela, como uma alternativa conveniente a fazer isso em passos " "separados.\n" "\n" "Se uma tabela relacionada apropriada já existe então você deve cancelar e " "apenas adicionar uma relação." #: ../glom/glom_developer.glade.h:210 msgid "Title:" msgstr "Título:" #: ../glom/glom_developer.glade.h:211 msgid "Town:" msgstr "Cidade:" #: ../glom/glom_developer.glade.h:212 msgid "Translations" msgstr "Traduções" #: ../glom/glom_developer.glade.h:213 msgid "Triggered by:" msgstr "Disparado por:" #: ../glom/glom_developer.glade.h:214 msgid "Type:" msgstr "Tipo:" #: ../glom/glom_developer.glade.h:215 msgid "Unique" msgstr "Único" #: ../glom/glom_developer.glade.h:216 msgid "Use 1000s separator" msgstr "Usar separador de milhares" #: ../glom/glom_developer.glade.h:217 msgid "Use custom formatting" msgstr "Usar formatação personalizada" #: ../glom/glom_developer.glade.h:218 msgid "Use custom title:" msgstr "Usar título personalizado:" #: ../glom/glom_developer.glade.h:219 msgid "Use default field title: " msgstr "Usar título de campo padrão: " #: ../glom/glom_developer.glade.h:220 msgid "Use default formatting" msgstr "Usar formatação padrão" #. Append the View columns: #: ../glom/glom_developer.glade.h:221 ../glom/glom.glade.h:46 #: ../glom/mode_design/users/dialog_users_list.cc:64 msgid "User" msgstr "Utilizador" #: ../glom/glom_developer.glade.h:222 msgid "User Entry" msgstr "Entrada de utilizador" #: ../glom/glom_developer.glade.h:223 msgid "Users" msgstr "Utilizadores" #: ../glom/glom_developer.glade.h:224 msgid "Value" msgstr "Valor" #: ../glom/glom_developer.glade.h:225 msgid "" "When the button is clicked it will run the python function which you " "implement here." msgstr "" "Quando o botão for clicado será executada a função em python que você " "implementar aqui." #: ../glom/glom_developer.glade.h:226 msgid "" "When this is checked the table's title will be shown at the top of the " "report in addition to the report title." msgstr "" "Quando isso for seleccionado o título da tabela será mostrado no topo do " "relatório para além do título do relatório." #: ../glom/glom_developer.glade.h:227 msgid "" "When this is selected you will see extra relationships in the Table list, " "allowing you to choose fields from relationships in related tables, instead " "of just regular fields from those related tables." msgstr "" "Quando isto for seleccionado você verá relações adicionais na lista de " "tabelas, permitindo que escolha os campos das relações nas tabelas " "relacionadas, em vez de apenas campos normais daquelas tabelas relacionadas." #: ../glom/glom_developer.glade.h:228 msgid "Zip/Postal Code:" msgstr "Código postal:" #: ../glom/glom_developer.glade.h:229 msgid "_Confirm Password" msgstr "_Confirmar senha" #: ../glom/glom_developer.glade.h:230 ../glom/glom.glade.h:52 msgid "_Password" msgstr "_Senha" #: ../glom/glom_developer.glade.h:231 ../glom/glom.glade.h:54 msgid "_User" msgstr "_Utilizador" #: ../glom/glom_developer.glade.h:232 msgid "field name" msgstr "nome do campo" #: ../glom/glom_developer.glade.h:233 msgid "table name" msgstr "nome da tabela" #: ../glom/glom_developer.glade.h:234 msgid "the title" msgstr "o título" #: ../glom/glom.glade.h:1 msgid "0" msgstr "0" #: ../glom/glom.glade.h:2 msgid "None selected" msgstr "Nenhum seleccionado" #: ../glom/glom.glade.h:3 msgid "Find Related Record" msgstr "Procurar registro relacionado" #. Import is a noun here. This is the title for a list of fields to import. #: ../glom/glom.glade.h:5 msgid "Import Fields" msgstr "Importar campos" #. Import is a noun here. This is the title for a window showing options for an import operation. #: ../glom/glom.glade.h:7 msgid "Import Options" msgstr "Opções de importação" #: ../glom/glom.glade.h:8 msgid "Tables in database" msgstr "Tabelas na base de dados" #: ../glom/glom.glade.h:9 msgid "User Level:" msgstr "Nível do utilizador:" #: ../glom/glom.glade.h:10 msgid "Connect to Server" msgstr "Ligar ao servidor" #: ../glom/glom.glade.h:11 msgid "" "Invalid format\n" "\n" "The data in the field was not recognized. Please try to correct the data or " "revert to the previous value. Here is an example of correctly-formatted data " "for this field.\n" msgstr "" "Formato inválido\n" "\n" "Os dados no campo não foram reconhecidos. Por favor tente corrigir os dados " "ou reverter para valores anteriores. Aqui está um exemplo de dados " "correctamente formatados para este campo.\n" #: ../glom/glom.glade.h:15 msgid "Open or create a Document" msgstr "" "Abrir ou criar um documento" #: ../glom/glom.glade.h:16 msgid "C_onnect" msgstr "_Ligar" #: ../glom/glom.glade.h:17 msgid "Connection Details" msgstr "Detalhes da ligação" #: ../glom/glom.glade.h:18 msgid "Create New Document" msgstr "Criar novo documento" #: ../glom/glom.glade.h:20 msgid "Database" msgstr "Base de dados" #: ../glom/glom.glade.h:21 msgid "Encoding detected as: UTF-8" msgstr "Codificação detectada como: UTF-8" #: ../glom/glom.glade.h:22 msgid "Find All" msgstr "Procurar todos" #: ../glom/glom.glade.h:23 msgid "Find Related Record" msgstr "Procurar registro relacionado" #: ../glom/glom.glade.h:24 msgid "Found:" msgstr "Encontrado:" #: ../glom/glom.glade.h:26 msgid "Host" msgstr "_Servidor" #: ../glom/glom.glade.h:27 msgid "Import Into _Table:" msgstr "Importar para a _tabela:" #. This is a status message for a progress dialog. It says that importing is currently happenning. #: ../glom/glom.glade.h:29 msgid "Importing Data" msgstr "A importar dados" #: ../glom/glom.glade.h:30 msgid "Loading image" msgstr "A carregar imagem" #: ../glom/glom.glade.h:31 msgid "Mode:" msgstr "Modo:" #: ../glom/glom.glade.h:33 msgid "Number of sample rows:" msgstr "Número de linhas de amostra:" #: ../glom/glom.glade.h:34 msgid "Open Existing Document" msgstr "Abrir documento existente" #: ../glom/glom.glade.h:35 msgid "Open or create Document" msgstr "Abrir ou criar documento" #: ../glom/glom.glade.h:37 msgid "Please enter the connection details for your database server." msgstr "" "Por favor digite os detalhes da ligação para o seu servidor de base de dados." #: ../glom/glom.glade.h:38 msgid "Please wait, your data is being imported…" msgstr "Por favor aguarde, os seus dados estão a ser importados…" #: ../glom/glom.glade.h:39 ../glom/glade_utils.cc:49 msgid "Processing" msgstr "A processar" #: ../glom/glom.glade.h:41 msgid "Records: " msgstr "Registros: " #: ../glom/glom.glade.h:42 msgid "Revert" msgstr "Reverter" #: ../glom/glom.glade.h:43 msgid "Show hidden tables" msgstr "Mostrar tabelas ocultas" #: ../glom/glom.glade.h:47 msgid "Welcome to Glom" msgstr "Bem-vindo ao Glom" #: ../glom/glom.glade.h:48 msgid "_Encoding:" msgstr "_Codificação:" #: ../glom/glom.glade.h:49 msgid "_First line as title" msgstr "_Primeira linha como título" #: ../glom/glom.glade.h:50 msgid "_Host" msgstr "_Servidor" #: ../glom/glom.glade.h:51 msgid "_Import" msgstr "_Importar" #: ../glom/glom.glade.h:53 msgid "_Select" msgstr "_Seleccionar" #: ../glom/glom.glade.h:55 msgid "bla.blub - Import from CSV" msgstr "bla.blub - Importar de CSV" #: ../glom/glom.glade.h:56 msgid "example data format" msgstr "formato de dados de exemplo" #: ../glom/glom.glade.h:57 msgid "label" msgstr "etiqueta" #: ../glom/glom.glade.h:58 msgid "table_name" msgstr "nome_tabela" #: ../glom/utils_ui.cc:143 msgid "No help file available" msgstr "Nenhum ficheiro de ajuda disponível" #: ../glom/utils_ui.cc:161 msgid "Could not display help: " msgstr "Não foi possível exibir a ajuda: " #: ../glom/bakery/app_withdoc_gtk.cc:343 msgid "_Edit" msgstr "_Editar" #: ../glom/bakery/app_withdoc_gtk.cc:386 msgid "_Help" msgstr "Aj_uda" #: ../glom/bakery/app_withdoc_gtk.cc:390 msgid "_About" msgstr "_Acerca" #: ../glom/bakery/app_withdoc_gtk.cc:390 msgid "About the application" msgstr "Acerca da aplicação" #: ../glom/bakery/app_withdoc_gtk.cc:530 msgid "Open Document" msgstr "Abrir documento" #: ../glom/bakery/app_withdoc.cc:494 msgid "The document could not be opened." msgstr "A imagem não pode ser aberta." #: ../glom/bakery/dialog_offersave.cc:30 msgid "This document has unsaved changes. Would you like to save the document?" msgstr "" "Este documento tem alterações não guardadas. Você deseja guardar o documento?" #: ../glom/bakery/dialog_offersave.cc:32 msgid "" "\n" "\n" "Document:\n" msgstr "" "\n" "\n" "Documento:\n" #: ../glom/bakery/dialog_offersave.cc:45 msgid "Close without Saving" msgstr "Fechar sem guardar" #: ../glom/bakery/dialog_offersave.cc:54 msgid "Discard" msgstr "Ignorar" #: ../glom/import_csv/dialog_import_csv.cc:85 msgid "Auto Detect" msgstr "Detectar automaticamente" #. We mean 22nd November 2008: #. C years start are the AD year - 1900. So, 01 is 1901. #. C months start at 0. #. starts at 1 #. Get the ISO (not current locale) text representation: #. ignored #. iso_format #: ../glom/import_csv/dialog_import_csv.cc:142 msgid "" "Note that the source file should contain numbers and dates in international " "ISO format. For instance, 22nd November 2008 should be %1." msgstr "" "Note que o ficheiro fonte deve conter números e datas no formato ISO " "internacional. Por exemplo, 22 de Novembro de 2008 deve ser %1" #: ../glom/import_csv/dialog_import_csv.cc:171 msgid "No Document Available" msgstr "Nenhum documento disponível" #: ../glom/import_csv/dialog_import_csv.cc:171 msgid "You need to open a document to import the data into a table." msgstr "" "Você precisa de abrir um documento para importar os dados para dentro de uma " "tabela." #: ../glom/import_csv/dialog_import_csv.cc:182 msgid "Import From CSV File" msgstr "Importar de ficheiro CSV" #: ../glom/import_csv/dialog_import_csv.cc:187 #: ../glom/import_csv/dialog_import_csv.cc:579 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:267 msgid "Error Importing CSV File" msgstr "Erro ao importar ficheiro CSV" #: ../glom/import_csv/dialog_import_csv.cc:421 msgid "Encoding detected as: %1" msgstr "Codificação detectada como: %1" #: ../glom/import_csv/dialog_import_csv.cc:460 msgid "Encoding detection failed. Please manually choose one from the box." msgstr "" "A detecção de codificação falhou. Por favor escolha manualmente uma da caixa." #: ../glom/import_csv/dialog_import_csv.cc:464 msgid "" "The file contains data not in the specified encoding. Please choose another " "one, or try \"Auto Detect\"." msgstr "" "O ficheiro não contém dados na codificação especificada. Por favor escolha " "outra, ou tente \"Detectar automaticamente\"." #. Note to translators: This is a straight line, not a database row. #: ../glom/import_csv/dialog_import_csv.cc:506 #: ../glom/libglom/data_structure/layout/layoutitem_line.cc:82 msgid "Line" msgstr "Linha" #: ../glom/import_csv/dialog_import_csv.cc:557 msgid "Target Field" msgstr "Campo alvo" #: ../glom/import_csv/dialog_import_csv.cc:604 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:614 msgid "" msgstr "" #: ../glom/import_csv/dialog_import_csv.cc:713 msgid "" "One column needs to be assigned the table's primary key (%1) as " "target field before importing" msgstr "" "Uma coluna precisa ser atribuída à chave primária da tabela(%1) como " "campo alvo antes da importação" #: ../glom/import_csv/dialog_import_csv.cc:747 msgid "Could Not Open file" msgstr "Não foi possível abrir o ficheiro" #: ../glom/import_csv/dialog_import_csv.cc:748 msgid "The file at \"%1\" could not be opened: %2" msgstr "O ficheiro em \"%1\" não pode ser aberto: %2" #: ../glom/import_csv/dialog_import_csv.cc:753 msgid " - Import From CSV File" msgstr " - Importar de ficheiro CSV" #: ../glom/import_csv/dialog_import_csv_progress.cc:83 msgid "Parsing CSV file %1" msgstr "A analisar o ficheiro CSV %1" #: ../glom/import_csv/dialog_import_csv_progress.cc:162 msgid "Import complete\n" msgstr "Importação concluída\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:191 msgid "" "Warning: Importing row %1: The value for field %2 must be unique, but is " "already in use. The value will not be imported.\n" msgstr "" "Aviso: A importar a linha %1: O valor para o campo %2 deve ser único, mas já " "está em uso. O valor não será importado.\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:200 msgid "" "Warning: Importing row %1: The value for field %2, \"%3\" could not be " "converted to the field's type. The value will not be imported.\n" msgstr "" "Aviso: A importar a linha %1: O valor para o campo %2, \"%3\" não pode ser " "convertido para o tipo do campo alvo. O valor não será importado.\n" #: ../glom/import_csv/dialog_import_csv_progress.cc:225 msgid "" "Error importing row %1: Cannot import the row because the primary key is " "empty.\n" msgstr "" "Erro ao importar a linha %1: Não é possível importar a linha pois a chave " "primária está vazia.\n" #. TODO: Can we get this from anywhere else, such as iso-codes? murrayc #. TODO: Make this generally more efficient. #: ../glom/import_csv/file_encodings.cc:93 #: ../glom/import_csv/file_encodings.cc:94 #: ../glom/import_csv/file_encodings.cc:95 #: ../glom/import_csv/file_encodings.cc:96 #: ../glom/import_csv/file_encodings.cc:97 #: ../glom/import_csv/file_encodings.cc:98 #: ../glom/import_csv/file_encodings.cc:99 #: ../glom/import_csv/file_encodings.cc:100 msgid "Unicode" msgstr "Unicode" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:102 #: ../glom/import_csv/file_encodings.cc:115 #: ../glom/import_csv/file_encodings.cc:120 msgid "Western" msgstr "Ocidental" #. This just adds a separator in the combo box #: ../glom/import_csv/file_encodings.cc:103 #: ../glom/import_csv/file_encodings.cc:118 msgid "Central European" msgstr "Centro-europeu" #: ../glom/import_csv/file_encodings.cc:104 msgid "South European" msgstr "Sul-europeu" #: ../glom/import_csv/file_encodings.cc:105 #: ../glom/import_csv/file_encodings.cc:113 #: ../glom/import_csv/file_encodings.cc:125 msgid "Baltic" msgstr "Báltico" #: ../glom/import_csv/file_encodings.cc:106 #: ../glom/import_csv/file_encodings.cc:119 msgid "Cyrillic" msgstr "Cirílico" #: ../glom/import_csv/file_encodings.cc:107 #: ../glom/import_csv/file_encodings.cc:124 msgid "Arabic" msgstr "Ãrabe" #: ../glom/import_csv/file_encodings.cc:108 #: ../glom/import_csv/file_encodings.cc:121 msgid "Greek" msgstr "Grego" #: ../glom/import_csv/file_encodings.cc:109 msgid "Hebrew Visual" msgstr "Hebraico visual" #: ../glom/import_csv/file_encodings.cc:110 #: ../glom/import_csv/file_encodings.cc:123 msgid "Hebrew" msgstr "Hebraico" #: ../glom/import_csv/file_encodings.cc:111 #: ../glom/import_csv/file_encodings.cc:122 msgid "Turkish" msgstr "Turco" #: ../glom/import_csv/file_encodings.cc:112 msgid "Nordic" msgstr "Nórdico" #: ../glom/import_csv/file_encodings.cc:114 msgid "Celtic" msgstr "Celta" #: ../glom/import_csv/file_encodings.cc:116 msgid "Romanian" msgstr "Romeno" #: ../glom/import_csv/file_encodings.cc:126 msgid "Vietnamese" msgstr "Vietnamita" #: ../glom/libglom/data_structure/field.cc:650 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:143 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:151 msgid "Invalid" msgstr "Inválido" #: ../glom/libglom/data_structure/field.cc:651 msgid "Number" msgstr "Número" #: ../glom/libglom/data_structure/field.cc:652 #: ../glom/libglom/data_structure/layout/layoutitem_text.cc:72 #: ../glom/libglom/data_structure/translatable_item.cc:316 #: ../glom/mode_design/layout/dialog_layout_details.cc:1206 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:39 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:605 msgid "Text" msgstr "Texto" #: ../glom/libglom/data_structure/field.cc:653 msgid "Time" msgstr "Tempo" #: ../glom/libglom/data_structure/field.cc:654 msgid "Date" msgstr "Data" #: ../glom/libglom/data_structure/field.cc:655 msgid "Boolean" msgstr "Booleano" #: ../glom/libglom/data_structure/field.cc:656 #: ../glom/libglom/data_structure/layout/layoutitem_image.cc:69 #: ../glom/libglom/data_structure/translatable_item.cc:318 #: ../glom/mode_design/layout/dialog_layout_details.cc:1213 #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:41 #: ../glom/utility_widgets/layouttoolbar.cc:66 msgid "Image" msgstr "Imagem" #. TRANSLATORS: Please only translate this string if you know that strftime() #. * shows only 2 year digits when using format "x". We want to always display #. * 4 year digits. For instance, en_GB should translate it to "%d/%m/%Y". #. * Glom will show a warning in the terminal at startup if this is necessary #. * and default to %d/%m/%Y" if it detects a problem, but that might not be #. * correct for your locale. #. * Thanks. #: ../glom/libglom/data_structure/glomconversions.cc:103 #, no-c-format msgid "%x" msgstr "%x" #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:150 msgid "" "ERROR: sanity_check_date_parsing(): Sanity check failed: Glom could not " "parse a date's text representation that it generated itself, in this locale." msgstr "" "ERRO: sanity_check_date_parsing(): Teste de sanidade falhou: Glom não pode " "analisar a representação do texto de uma data que foi gerada sozinha, neste " "idioma." #. Note to translators: If you see this error in the terminal at startup then you need to translate the %x elsewhere. #: ../glom/libglom/data_structure/glomconversions.cc:184 msgid "" "ERROR: sanity_check_date_text_representation_uses_4_digit_year(): Sanity " "check failed: Glom does not seem to use 4 digits to display years in a " "date's text representation, in this locale. Defaulting to dd/mm/yyyy though " "this might be incorrect for your locale. This needs attention from a " "translator. Please file a bug - see http://www.glom.org" msgstr "" "ERRO: sanity_check_date_text_representation_uses_4_digit_year(): Teste de " "sanidade falhou: Glom parece não usar 4 dígitos para exibir anos em uma " "representação do texto de uma data, neste idioma. Assumindo dd/mm/aaaa, " "porém pode ser incorrecto para seu idioma. Isso necessita da atenção de um " "tradutor. Por favor, relate um erro - veja http://www.glom.org" #: ../glom/libglom/data_structure/layout/layoutitem_button.cc:67 #: ../glom/libglom/data_structure/translatable_item.cc:314 #: ../glom/mode_design/layout/dialog_layout_details.cc:1199 #: ../glom/utility_widgets/layouttoolbar.cc:62 msgid "Button" msgstr "Botão" #: ../glom/libglom/data_structure/layout/layoutitem_calendarportal.cc:57 msgid "Calendar Portal" msgstr "Portal de calendário" #. Note to translators: "Notebook" means a GtkNotebook-type widget. #: ../glom/libglom/data_structure/layout/layoutitem_notebook.cc:56 #: ../glom/mode_data/flowtablewithfields.cc:1305 #: ../glom/utility_widgets/layouttoolbar.cc:56 msgid "Notebook" msgstr "Conjunto de abas" #: ../glom/libglom/data_structure/layout/layoutitem_placeholder.cc:59 msgid "Placeholder" msgstr "Espaço reservado" #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:68 msgid "Portal" msgstr "Portal" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:126 msgid "No summary chosen" msgstr "Nenhum resumo escolhido" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:145 msgid "Sum" msgstr "Soma" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:147 msgid "Average" msgstr "Média" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:149 msgid "Count" msgstr "Contagem" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_summary.cc:61 msgid "Summary" msgstr "Resumo" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc:55 msgid "Vertical Group" msgstr "Grupo vertical" #: ../glom/libglom/data_structure/translatable_item.cc:298 msgid "Custom Title" msgstr "Título personalizado" #: ../glom/libglom/data_structure/translatable_item.cc:302 msgid "Layout Item" msgstr "Item de disposição" #: ../glom/libglom/data_structure/translatable_item.cc:304 msgid "Print Layout" msgstr "Disposição de impressão" #: ../glom/libglom/data_structure/translatable_item.cc:306 msgid "Report" msgstr "Relatório" #. Tables: #: ../glom/libglom/data_structure/translatable_item.cc:308 #: ../glom/mode_design/box_db_table_relationships.cc:51 #: ../glom/mode_design/dialog_database_preferences.cc:53 #: ../glom/mode_design/users/dialog_groups_list.cc:67 #: ../glom/navigation/maemo/pickerbutton_table.cc:37 msgid "Table" msgstr "Tabela" #: ../glom/libglom/data_structure/translatable_item.cc:310 msgid "Layout Group" msgstr "Grupo de disposição" #: ../glom/libglom/data_structure/translatable_item.cc:312 msgid "Field Title" msgstr "Título do campo" #: ../glom/libglom/document/document.cc:475 #: ../glom/libglom/document/document.cc:493 msgid "System Preferences" msgstr "Preferências do sistema" #: ../glom/libglom/document/document.cc:506 msgid "System Name" msgstr "Nome do sistema" #: ../glom/libglom/document/document.cc:512 msgid "Organisation Name" msgstr "Nome da organização" #: ../glom/libglom/document/document.cc:518 msgid "Organisation Logo" msgstr "Logótipo da organização" #: ../glom/libglom/document/document.cc:524 msgid "Street" msgstr "Rua" #: ../glom/libglom/document/document.cc:530 msgid "Street (line 2)" msgstr "Rua (linha 2)" #: ../glom/libglom/document/document.cc:536 msgid "City" msgstr "Cidade" #: ../glom/libglom/document/document.cc:542 msgid "State" msgstr "Estado" #: ../glom/libglom/document/document.cc:548 msgid "Country" msgstr "País" #: ../glom/libglom/document/document.cc:554 msgid "Zip Code" msgstr "Código Postal" #: ../glom/libglom/document/bakery/document.cc:402 msgid "Untitled" msgstr "Sem título" #: ../glom/libglom/gst-package.c:57 msgid "Could not install package" msgstr "Não foi possível instalar o pacote" #: ../glom/libglom/gst-package.c:75 msgid "The necessary applications to install the package could not be found." msgstr "" "As aplicações necessárias para instalar o pacote não foram localizadas." #: ../glom/main.cc:194 msgid "Glom options" msgstr "Opções do Glom" #: ../glom/main.cc:194 msgid "Command-line options for glom" msgstr "Opções da linha de comando para o Glom" #: ../glom/main.cc:202 msgid "The Filename" msgstr "O nome do ficheiro" #: ../glom/main.cc:208 msgid "The version of this application." msgstr "A versão da aplicação." #: ../glom/main.cc:213 msgid "Show the generated SQL queries on stdout, for debugging." msgstr "Mostra as consultas SQL geradas em stdout, para depuração." #: ../glom/main.cc:218 msgid "Show how Glom outputs a date in this locale, then stop." msgstr "Mostra como o Glom formata uma data neste idioma, e depois pára." #: ../glom/main.cc:231 msgid "" "You seem to be running Glom as a user with administrator privileges. Glom " "may not be run with such privileges for security reasons.\n" "Please login to your system as a normal user." msgstr "" "Parece que você está executando o Glom como super-utilizador. O Glom não " "pode ser executado como super-utilizador por razões de segurança.\n" "Por favor inicie o seu sistema como um utilizador normal." #. Warn the user: #: ../glom/main.cc:245 msgid "" "You seem to be running Glom as root. Glom may not be run as root.\n" "Please login to your system as a normal user." msgstr "" "Parece que você está executando o Glom como super-utilizador. O Glom não " "pode ser executado como super-utilizador.\n" "Por favor inicie o seu sistema como um utilizador normal." #: ../glom/main.cc:252 msgid "Running As Root" msgstr "Executando como super-utilizador" #. Show message to the user about the broken installation: #. This is a packaging bug, but it would probably annoy packagers to mention that in the dialog: #. Show message to the user about the broken installation: #: ../glom/main.cc:299 ../glom/main.cc:312 ../glom/main.cc:579 msgid "Incomplete Glom Installation" msgstr "Instalação incompleta do Glom" #. use_markup #. modal #: ../glom/main.cc:300 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "You may now install PostgreSQL to complete the Glom installation." msgstr "" "A instalação do Glom não está completa, porque o PostgreSQL não está " "disponível no seu sistema. PostgreSQL é necessário para a hospedagem local " "da base de dados do Glom.\n" "\n" "Você pode instalar agora o PostgreSQL para completar a instalação do Glom." #: ../glom/main.cc:302 msgid "Install PostgreSQL" msgstr "Instalar PostgreSQL" #. use_markup #. modal #: ../glom/main.cc:313 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "A instalação do Glom não está completa, porque o PostgreSQL não está " "disponível no seu sistema. PostgreSQL é necessário para a hospedagem local " "da base de dados do Glom.\n" "\n" "Por favor relate este erro ao fabricante, ou ao seu administrador de " "sistemas de forma que seja corrigido." #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:329 msgid "" "Your installation of Glom is not complete, because the Glom Python module is " "not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "A instalação do Glom não está completa, porque o PostgreSQL não está " "disponível no seu sistema. PostgreSQL é necessário para a hospedagem local " "da base de dados do Glom.\n" "\n" "Por favor relate este erro ao fabricante, ou ao seu administrador de " "sistemas de forma que seja corrigido." #: ../glom/main.cc:332 msgid "Glom Python Module Not Installed" msgstr "O módulo Python do Glom não está instalado" #. The python module could not be imported by Glom, so warn the user: #: ../glom/main.cc:349 msgid "" "Your installation of Glom is not complete, because the gda Python module is " "not available on your system.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "A instalação do Glom não está completa, porque o PostgreSQL não está " "disponível no seu sistema. PostgreSQL é necessário para a hospedagem local " "da base de dados do Glom..\n" "\n" "Por favor relate este erro ao fabricante, ou ao seu administrador de " "sistemas de forma que seja corrigido." #: ../glom/main.cc:352 msgid "gda Python Module Not Installed" msgstr "O módulo Python gda não está instalado" #: ../glom/main.cc:496 msgid "Error while parsing command-line options: " msgstr "Erro ao analisar as opções de linha de comando: " #: ../glom/main.cc:497 msgid "Use --help to see a list of available command-line options." msgstr "Use --help para ver a lista de opções disponíveis da linha de comando." #: ../glom/main.cc:546 msgid "Glom: The file does not exist." msgstr "Glom: O ficheiro não existe." #: ../glom/main.cc:555 msgid "Glom: The file path is a directory instead of a file." msgstr "Glom: O caminho do ficheiro é uma pasta e não um ficheiro." #. The Postgres provider was not found, so warn the user: #: ../glom/main.cc:576 msgid "" "Your installation of Glom is not complete, because the PostgreSQL libgda " "provider is not available on your system. This provider is needed to access " "Postgres database servers.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "A instalação do Glom não está completa, porque o provedor de PostgreSQL " "libgda não está disponível no seu sistema. Este provedor é necessário para " "aceder aos servidores da base de dados Postgres.\n" "\n" "Por favor relate este erro ao fabricante, ou ao seu administrador de sistema " "de forma que seja corrigido." #. Note to translators: This text is shown instead of a table title, when the table has not yet been chosen. #: ../glom/mode_data/box_data_calendar_related.cc:96 #: ../glom/mode_data/box_data_list_related.cc:95 #: ../glom/mode_data/box_data_portal.cc:260 #: ../glom/mode_data/box_data_portal.cc:274 msgid "Undefined Table" msgstr "Tabela não definida" #: ../glom/mode_data/box_data.cc:138 msgid "" "You have not entered any find criteria. Try entering information in the " "fields." msgstr "" "Você não definiu qualquer critério de localização. Tente introduzir " "informações nos campos." #: ../glom/mode_data/box_data.cc:182 msgid "" "This data cannot be stored in the database because you have not provided a " "primary key.\n" "Do you really want to discard this data?" msgstr "" "Estes dados não podem ser armazenados na base de dados porque você não " "forneceu uma chave primária.\n" "Você quer realmente descartar estes dados?" #: ../glom/mode_data/box_data.cc:188 msgid "No primary key value" msgstr "Nenhum valor de chave primária" #: ../glom/mode_data/box_data_details.cc:119 msgid "Create a new record." msgstr "Criar um novo registro." #: ../glom/mode_data/box_data_details.cc:120 msgid "Remove this record." msgstr "Remover este registro." #: ../glom/mode_data/box_data_details.cc:121 msgid "View the first record in the list." msgstr "Ver o primeiro registro na lista." #: ../glom/mode_data/box_data_details.cc:122 msgid "View the previous record in the list." msgstr "Ver o registro anterior na lista." #: ../glom/mode_data/box_data_details.cc:123 msgid "View the next record in the list." msgstr "Ver o próximo registro na lista." #: ../glom/mode_data/box_data_details.cc:124 msgid "View the last record in the list." msgstr "Ver o último registro na lista." #: ../glom/mode_data/box_data_details.cc:447 msgid "Layout Contains No Fields" msgstr "A disposição não contém campos" #: ../glom/mode_data/box_data_details.cc:447 msgid "" "There are no fields on the layout, so there is no way to enter data in a new " "record." msgstr "" "Não há campos na disposição, portanto não há maneira de introduzir dados num " "novo registro." #. Tell user that a primary key is needed to delete a record: #: ../glom/mode_data/box_data_details.cc:475 msgid "No primary key value." msgstr "Nenhum valor de chave primária." #: ../glom/mode_data/box_data_details.cc:476 msgid "This record cannot be deleted because there is no primary key." msgstr "Este registro não pode ser apagado porque não há chave primária." #. Warn user that they can't choose their own primary key: #: ../glom/mode_data/box_data_details.cc:889 msgid "Primary key auto increments" msgstr "Incrementos automáticos de chave primária" #: ../glom/mode_data/box_data_details.cc:890 msgid "" "The primary key is auto-incremented.\n" " You may not enter your own primary key value." msgstr "" "A chave primária é incrementada automaticamente.\n" "Você não pode definir o valor de sua chave primária." #. Add Pages: #: ../glom/mode_data/box_data_list.cc:536 #: ../glom/mode_data/box_data_manyrecords.cc:83 #: ../glom/mode_data/notebook_data.cc:40 ../glom/mode_find/notebook_find.cc:32 msgid "List" msgstr "Lista" #. On Maemo, we add the box to m_window_maemo_details instead: #. Details column: #: ../glom/mode_data/box_data_portal.cc:145 #: ../glom/mode_data/notebook_data.cc:44 ../glom/mode_data/notebook_data.cc:48 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:207 #: ../glom/mode_find/notebook_find.cc:41 msgid "Details" msgstr "Detalhes" #: ../glom/mode_data/box_data_portal.cc:160 msgid "New Related %1" msgstr "Nova %1 Relacionada" #: ../glom/mode_data/box_data_portal.cc:202 msgid "Add Related %1" msgstr "Adicionar %1 Relacionada" #: ../glom/mode_data/box_data_portal.cc:204 msgid "Add related record" msgstr "Adicionar registros relacionados" #: ../glom/mode_data/box_data_portal.cc:559 msgid "No Corresponding Record Exists" msgstr "Não existe registro correspondente" #: ../glom/mode_data/box_data_portal.cc:559 msgid "" "No record with this value exists. Therefore navigation to the related record " "is not possible." msgstr "" "Não existe registro com este valor. Portanto a navegação para o registro " "relacionado não é possível." #: ../glom/mode_data/flowtablewithfields.cc:1162 #: ../glom/mode_data/flowtablewithfields.cc:1308 #: ../glom/mode_data/flowtablewithfields.cc:1335 #: ../glom/utility_widgets/notebooklabelglom.cc:73 #: ../glom/utility_widgets/notebooklabelglom.cc:113 msgid "New Group" msgstr "Novo grupo" #: ../glom/mode_data/flowtablewithfields.cc:1168 #: ../glom/mode_design/layout/dialog_layout_details.cc:779 msgid "notebook" msgstr "conjunto de abas" #. Note to translators: This is the default name (not seen by most users) for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1174 msgid "tab1" msgstr "aba1" #. Note to translators: This is the default label text for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1177 msgid "Tab One" msgstr "Aba um" #: ../glom/mode_data/flowtablewithfields.cc:1190 msgid "button" msgstr "botão" #: ../glom/mode_data/flowtablewithfields.cc:1191 #: ../glom/mode_data/flowtablewithfields.cc:1349 #: ../glom/mode_design/layout/dialog_layout_details.cc:703 msgid "New Button" msgstr "Novo botão" #. Note to translators: This is the default contents of a text item on a print layout: #: ../glom/mode_data/flowtablewithfields.cc:1197 #: ../glom/mode_data/flowtablewithfields.cc:1361 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:379 msgid "text" msgstr "texto" #: ../glom/mode_data/flowtablewithfields.cc:1198 #: ../glom/mode_data/flowtablewithfields.cc:1362 msgid "New Text" msgstr "Novo texto" #. TODO: Avoid this error message, maybe by adding a group. #. TODO: At least avoid losing the dragged item. #: ../glom/mode_data/flowtablewithfields.cc:1446 msgid "You cannot drop anything here. Try to add a group first" msgstr "Você não pode largar nada aqui. Tente adicionar um grupo primeiro" #. TODO: Use a real English sentence here? #: ../glom/mode_data/flowtablewithfields.cc:1507 msgid "Delete whole group \"%1\"?" msgstr "Apagar grupo inteiro \"%1\"?" #. TODO: Use a real English sentence here: #: ../glom/mode_data/flowtablewithfields.cc:1513 msgid "Delete whole group?" msgstr "Apagar grupo inteiro?" #: ../glom/mode_data/notebook_data.cc:66 msgid "List Or Details View" msgstr "Vista de lista ou detalhes" #: ../glom/mode_data/notebook_data.cc:252 msgid "%1 Details" msgstr "%1 Detalhes" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/box_db_table_relationships.cc:45 msgid "" "This relationship already exists. Please choose a different relationship name" msgstr "" "Esta relação já existe. Por favor escolha um nome de relacionamento diferente" #. Translators: FROM as in SQL's FROM #: ../glom/mode_design/box_db_table_relationships.cc:50 msgid "From Field" msgstr "Do campo" #: ../glom/mode_design/box_db_table_relationships.cc:52 msgid "To Field" msgstr "Para o campo" #: ../glom/mode_design/box_db_table_relationships.cc:54 msgid "Automatic Creation" msgstr "Criação automática" #: ../glom/mode_design/box_db_table_relationships.cc:56 #: ../glom/navigation/box_tables.cc:139 msgid "Title (Singular Form)" msgstr "Título (forma singular)" #: ../glom/mode_design/dialog_database_preferences.cc:55 msgid "Next Value" msgstr "Próximo valor" #: ../glom/mode_design/dialog_initial_password.cc:80 msgid "Username Is Empty" msgstr "O nome de utilizador está vazio" #: ../glom/mode_design/dialog_initial_password.cc:80 msgid "Please enter a login name for the new user." msgstr "Por favor digite um nome de entrada para o novo utilizador." #: ../glom/mode_design/dialog_initial_password.cc:85 #: ../glom/mode_design/users/dialog_user.cc:50 msgid "Passwords Do Not Match" msgstr "As senhas não conferem" #: ../glom/mode_design/dialog_initial_password.cc:85 #: ../glom/mode_design/users/dialog_user.cc:50 msgid "" "The entered password does not match the entered password confirmation. " "Please try again." msgstr "" "A senha digitada não confere com a senha de confirmação digitada. Por favor " "tente novamente." #: ../glom/mode_design/dialog_initial_password.cc:90 #: ../glom/mode_design/users/dialog_user.cc:55 msgid "Password Is Empty" msgstr "A senha está vazia" #: ../glom/mode_design/dialog_initial_password.cc:90 #: ../glom/mode_design/users/dialog_user.cc:55 msgid "Please enter a password for this user." msgstr "Por favor digite uma senha para este utilizador." #: ../glom/mode_design/dialog_relationships.cc:36 msgid "Relationships" msgstr "Relações" #. Don't allow adding of fields that already exist. #: ../glom/mode_design/fields/box_db_table_definition.cc:55 #: ../glom/mode_design/fields/box_db_table_definition.cc:333 msgid "This field already exists. Please choose a different field name" msgstr "Este campo já existe. Por favor escolha um nome de campo diferente" #: ../glom/mode_design/fields/box_db_table_definition.cc:59 msgid "Type" msgstr "Tipo" #. TODO: Only show this when there are > 100 records? #: ../glom/mode_design/fields/box_db_table_definition.cc:263 msgid "Recalculation Required" msgstr "Necessário recalcular" #: ../glom/mode_design/fields/box_db_table_definition.cc:264 msgid "" "You have changed the calculation used by this field so Glom must recalculate " "the value in all records. If the table contains many records then this could " "take a long time." msgstr "" "Você alterou o cálculo usado por este campo de forma que o Glom deve " "recalcular o valor em todos os registros. Se a tabela contém muitos " "registros então isso pode levar muito tempo." #: ../glom/mode_design/fields/box_db_table_definition.cc:269 msgid "Recalculate" msgstr "Recalcular" #: ../glom/mode_design/fields/box_db_table_definition.cc:278 msgid "Invalid database structure" msgstr "Estrutura da base de dados inválida" #: ../glom/mode_design/fields/box_db_table_definition.cc:279 msgid "" "This database field was created or edited outside of Glom. It has a data " "type that is not supported by Glom. Your system administrator may be able to " "correct this." msgstr "" "Esta base de dados foi criada ou editada fora do Glom. Ela tem um tipo de " "dados que não tem suporte pelo Glom. Seu administrador de sistemas deve ser " "capaz de corrigir isso." #: ../glom/mode_design/fields/box_db_table_definition.cc:287 msgid "Primary key required" msgstr "Chave primária necessária" #: ../glom/mode_design/fields/box_db_table_definition.cc:288 msgid "" "You may not unset the primary key because the table must have a primary key. " "You may set another field as the primary key instead." msgstr "" "Você não pode desmarcar a chave primária porque a tabela precisa ter uma " "chave primária.Você pode, no entanto, seleccionar outro campo como a chave " "primária." #: ../glom/mode_design/fields/box_db_table_definition.cc:300 msgid "Field contains empty values." msgstr "O campo contém valores vazios." #: ../glom/mode_design/fields/box_db_table_definition.cc:300 msgid "" "The field may not yet be used as a primary key because it contains empty " "values." msgstr "" "O campo não pode ser usado ainda como uma chave primária porque contém " "valores vazios." #: ../glom/mode_design/fields/box_db_table_definition.cc:309 msgid "Field contains non-unique values." msgstr "Campo contém valores não únicos." #: ../glom/mode_design/fields/box_db_table_definition.cc:309 msgid "" "The field may not yet be used as a primary key because it contains values " "that are not unique." msgstr "" "O campo não pode ser usado ainda como uma chave primária porque contém " "valores que não são únicos." #. Ask the user to confirm this major change: #: ../glom/mode_design/fields/box_db_table_definition.cc:314 msgid "Change primary key" msgstr "Alterar chave primária" #: ../glom/mode_design/fields/box_db_table_definition.cc:315 msgid "" "Are you sure that you wish to set this field as the primary key, instead of " "the existing primary key?" msgstr "" "Tem certeza que você deseja definir este campo como chave primária, ao invés " "da chave actual?" #: ../glom/mode_design/fields/box_db_table_definition.cc:320 msgid "Change Primary Key" msgstr "Alterar chave primária" #. Warn the user and refuse to make the change: #: ../glom/mode_design/fields/box_db_table_definition.cc:332 msgid "Field Name Already Exists" msgstr "O nome do campo já existe" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:98 msgid "Calculation Error" msgstr "Erro de cálculo" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:98 msgid "The calculation does not have a return statement." msgstr "O cálculo não tem uma instrução de retorno." #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:137 msgid "Calculation result" msgstr "Resultado do cálculo" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:137 msgid "The result of the calculation is:\n" msgstr "O resultado do cálculo é:\n" #: ../glom/mode_design/fields/dialog_fielddefinition.cc:165 msgid "Default Value" msgstr "Valor padrão" #. A special "None" item, allowing the user to do the equivalent of clearing the combobox, #. which is not normally possible with the GtkComboBox UI: #. set_property() does not work with a const gchar*, so we explicitly create a ustring. #. otherwise we get this warning: #. " unable to set property `text' of type `gchararray' from value of type `glibmm__CustomPointer_Pc' " #. TODO: Add a template specialization to Glib::ObjectBase::set_property() to allow this? #: ../glom/mode_design/layout/combobox_fields.cc:215 msgid "(None)" msgstr "(Nenhum)" #: ../glom/mode_design/layout/combobox_relationship.cc:268 #: ../glom/mode_design/layout/combobox_relationship.cc:272 msgid " Via: " msgstr " Via: " #: ../glom/mode_design/layout/dialog_layout_calendar_related.cc:243 #: ../glom/mode_design/layout/dialog_layout_list_related.cc:247 msgid "None: No visible tables are specified by the fields." msgstr "Nenhum: nenhuma tabela visível é especificada pelos campos." #. Columns-count column: #. Note to translators: This is the number of columns in a group (group being a noun) #: ../glom/mode_design/layout/dialog_layout_details.cc:114 msgid "Group Columns" msgstr "Colunas no grupo" #. Column-Width column: (only for list views) #. Note to translators: This is a name (the width of a UI element in the display), not an action. #: ../glom/mode_design/layout/dialog_layout_details.cc:127 msgid "Display Width" msgstr "Largura de exibição" #: ../glom/mode_design/layout/dialog_layout_details.cc:728 msgid "Text Title" msgstr "Título do texto" #: ../glom/mode_design/layout/dialog_layout_details.cc:753 msgid "Image Title" msgstr "Título da imagem" #: ../glom/mode_design/layout/dialog_layout_details.cc:914 msgid "group" msgstr "grupo" #: ../glom/mode_design/layout/dialog_layout_details.cc:1006 msgid "Add child groups to the notebook to add tabs." msgstr "Adiciona grupos filhos ao conjunto de abas para adicionar abas." #: ../glom/mode_design/layout/dialog_layout_details.cc:1169 msgid "Related Calendar: " msgstr "Calendário relacionado: " #: ../glom/mode_design/layout/dialog_layout_details.cc:1171 msgid "Related List: " msgstr "Lista relacionada: " #: ../glom/mode_design/layout/dialog_layout_details.cc:1188 msgid "Field: " msgstr "Campo: " #: ../glom/mode_design/layout/dialog_layout_details.cc:1247 msgid "(Notebook)" msgstr "(Conjunto de abas)" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:346 msgid "Invalid Relationship" msgstr "Relacionamento inválido" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:347 msgid "" "The relationship may not be used to show related records because the " "relationship does not specify a field in the related table." msgstr "" "Esta relação não pode ser usada para mostrar campos relacionados porque a " "relação não especifica um campo na tabela relacionada." #: ../glom/mode_design/layout/dialog_layout_list_related.cc:353 msgid "Relationship Uses a Related Primary Key" msgstr "A relação usa um chave primária relacionada" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:354 msgid "" "The relationship may not be used to show related records because the " "relationship uses a primary key field in the related table, which must " "contain unique values. This would prevent the relationship from specifying " "multiple related records." msgstr "" "A relação não pode ser usada para mostrar registros relacionados porque a " "relação usa uma chave primária na tabela relacionada, que têm de conter " "valore únicos. Isto iria prevenir que a relação mostrasse registros " "relacionado múltiplos." #: ../glom/mode_design/layout/dialog_layout_list_related.cc:360 msgid "Relationship Uses a Related Unique Field" msgstr "A relação usa um campo relacionado único" #: ../glom/mode_design/layout/dialog_layout_list_related.cc:361 msgid "" "The relationship may not be used to show related records because the " "relationship uses a unique-values field in the related table. This would " "prevent the relationship from specifying multiple related records." msgstr "" "A relação não pode ser usada para mostrar registros relacionados porque a " "relação usa um campo de valores únicos na tabela relacionada. Isto iria " "prevenir a relação de especificar registros relacionado múltiplos." #. Translators: This is Automatic text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:90 msgid "Automatic" msgstr "Automático" #. Translators: This is Left text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:94 msgid "Left" msgstr "Esquerda" #. Translators: This is Right text alignment. #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:98 msgid "Right" msgstr "Direita" #. Add labels (because we will hide the checkboxes): #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:141 msgid "Font" msgstr "Fonte" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:144 msgid "Foreground Color" msgstr "Cor do primeiro plano" #: ../glom/mode_design/layout/layout_item_dialogs/box_formatting.cc:147 msgid "Background Color" msgstr "Cor do plano de fundo" #: ../glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.cc:56 msgid "Ascending" msgstr "Ascendente" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #: ../glom/mode_design/report_layout/dialog_layout_report.cc:151 #: ../glom/mode_design/report_layout/dialog_layout_report.cc:198 msgid "Part" msgstr "Parte" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/print_layouts/box_print_layouts.cc:92 msgid "This item already exists. Please choose a different item name" msgstr "Este item já existe. Por favor escolha um nome de item diferente" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:224 msgid "Are you sure that you want to rename this print layout?" msgstr "Você tem certeza que quer renomear esta disposição de impressão?" #. TODO: Show old and new names? #: ../glom/mode_design/print_layouts/box_print_layouts.cc:225 msgid "Rename Print Layout" msgstr "Renomear disposição de impressão" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:227 #: ../glom/navigation/box_tables.cc:385 msgid "Rename" msgstr "Renomear" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:33 #: ../glom/utility_widgets/layouttoolbar.cc:51 msgid "Items" msgstr "Itens" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:34 msgid "Lines" msgstr "Linhas" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:35 msgid "Records" msgstr "Registros" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:37 #: ../glom/utility_widgets/layouttoolbar.cc:58 msgid "Database Field" msgstr "Campo da base de dados" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:37 #: ../glom/utility_widgets/layouttoolbar.cc:58 msgid "Drag this to the layout to add a new database field." msgstr "" "Arraste este elemento para a disposição para adicionar um novo campo da base " "de dados." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:39 #: ../glom/utility_widgets/layouttoolbar.cc:64 msgid "Drag this to the layout to add a new static text box." msgstr "" "Arraste este elemento para a disposição para adicionar uma nova caixa de " "texto estático." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:41 #: ../glom/utility_widgets/layouttoolbar.cc:66 msgid "Drag this to the layout to add a new static image." msgstr "" "Arraste este elemento para a disposição para adicionar uma nova imagem " "estática." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:43 msgid "Horizontal Line" msgstr "Linha horizontal" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:43 msgid "Drag this to the layout to add a new horizontal line." msgstr "" "Arraste este elemento para a disposição para adicionar uma nova linha " "horizontal." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:45 msgid "Vertical Line" msgstr "Linha vertical" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:45 msgid "Drag this to the layout to add a new vertical line." msgstr "" "Arraste este elemento para a disposição para adicionar uma nova linha " "vertical." #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:47 #: ../glom/utility_widgets/layouttoolbar.cc:60 msgid "Related Records" msgstr "Registros relacionados" #: ../glom/mode_design/print_layouts/print_layout_toolbar.cc:47 msgid "Drag this to the layout to add a new related records portal." msgstr "" "Arraste este elemento para a disposição para adicionar um novo portal de " "registros relacionados." #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:123 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:56 msgid "Page _Setup" msgstr "_Configurar página" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:132 msgid "_Insert" msgstr "_Inserir" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:133 msgid "Insert _Field" msgstr "Inserir _campo" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:135 msgid "Insert _Text" msgstr "Inserir _texto" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:137 msgid "Insert _Image" msgstr "Inserir _imagem" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:139 msgid "Insert _Related Records" msgstr "Inserir registros _relacionados" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:141 msgid "Insert _Horizontal Line" msgstr "Inserir linha _horizontal" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:143 msgid "Insert _Vertical Line" msgstr "Inserir linha _vertical" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:146 #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:61 msgid "_View" msgstr "_Ver" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:147 msgid "Show Grid" msgstr "Mostrar grelha" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:149 msgid "Show Rules" msgstr "Mostrar réguas" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:153 msgid "Fit Page _Width" msgstr "Ajustar _largura da página" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:156 msgid "Zoom 200%" msgstr "Zoom de 200%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:161 msgid "Zoom 50%" msgstr "Zoom de 50%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:166 msgid "Zoom 25%" msgstr "Zoom de 25%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:599 msgid "Insert" msgstr "Inserir" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:62 msgid "Show _Grid" msgstr "Mostrar _grelha" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:489 msgid "Edit _Fields" msgstr "Editar _campos" #: ../glom/mode_design/relationships_overview/dialog_relationships_overview.cc:492 msgid "Edit _Relationships" msgstr "Editar _relações" #: ../glom/mode_design/script_library/dialog_script_library.cc:133 msgid "Remove library script" msgstr "Remover script da biblioteca" #: ../glom/mode_design/script_library/dialog_script_library.cc:134 msgid "" "Do you really want to delete this script? This data can not be recovered" msgstr "" "Você quer realmente apagar este script? Estes dados não podem ser recuperados" #: ../glom/mode_design/users/dialog_groups_list.cc:70 msgid "View" msgstr "Ver" #: ../glom/mode_design/users/dialog_groups_list.cc:79 #: ../glom/utility_widgets/layoutwidgetmenu.cc:46 #: ../glom/utility_widgets/layoutwidgetutils.cc:38 #: ../glom/utility_widgets/notebooklabelglom.cc:114 msgid "Delete" msgstr "Apagar" #. TODO: Prevent deletion of standard groups #: ../glom/mode_design/users/dialog_groups_list.cc:212 msgid "Delete Group" msgstr "Apagar grupo" #: ../glom/mode_design/users/dialog_groups_list.cc:213 msgid "Are your sure that you wish to delete this group?" msgstr "Você tem certeza que deseja apagar este grupo?" #: ../glom/mode_design/users/dialog_groups_list.cc:378 msgid "Full access." msgstr "Acesso completo." #: ../glom/mode_design/users/dialog_users_list.cc:159 msgid "Delete User" msgstr "Apagar utilizador" #: ../glom/mode_design/users/dialog_users_list.cc:160 msgid "Are your sure that you wish to delete this user?" msgstr "Você tem certeza que deseja apagar este utilizador?" #: ../glom/mode_design/users/dialog_users_list.cc:422 msgid "Developer group may not be empty." msgstr "O grupo de desenvolvedor não pode estar vazio." #: ../glom/mode_design/users/dialog_users_list.cc:423 msgid "The developer group must contain at least one user." msgstr "O grupo de desenvolvedor deve conter pelo menos um utilizador." #. Prevent two tables with the same name from being added. #: ../glom/navigation/box_tables.cc:130 msgid "This table already exists. Please choose a different table name" msgstr "Esta tabela já existe. Por favor escolha um nome de tabela diferente" #: ../glom/navigation/box_tables.cc:132 msgid "Hidden" msgstr "Oculto" #. TODO: This should really be a radio, but the use of AddDel makes it awkward to change that CellRenderer property. #: ../glom/navigation/box_tables.cc:136 msgid "Default" msgstr "Padrão" #. Ask the user if they want us to try to cope with this: #: ../glom/navigation/box_tables.cc:242 msgid "Table Already Exists" msgstr "A tabela já existe" #: ../glom/navigation/box_tables.cc:243 msgid "" "This table already exists on the database server, though it is not mentioned " "in the .glom file. This should not happen. Would you like Glom to attempt to " "use the existing table?" msgstr "" "Esta tabela já existe no servidor da base de dados, apesar de não ser " "mencionada no ficheiro .glom. Isso não deve acontecer. Você gostaria que o " "Glom tentasse usar a tabela existente?" #. TODO: Do not show tables that are not in the document. #: ../glom/navigation/box_tables.cc:303 msgid "" "You cannot delete this table, because there is no information about this " "table in the document." msgstr "" "Você não pode apagar esta tabela, porque não há informações sobre esta " "tabela no documento." #. Ask the user to confirm: #: ../glom/navigation/box_tables.cc:310 msgid "" "Are you sure that you want to delete this table?\n" "Table name: " msgstr "" "Você tem certeza que quer apagar esta tabela?\n" "Nome da tabela: " #: ../glom/navigation/box_tables.cc:311 msgid "Delete Table" msgstr "Apagar tabela" #: ../glom/navigation/box_tables.cc:382 msgid "Are you sure that you want to rename this table?" msgstr "Você tem certeza que quer renomear esta tabela?" #. TODO: Show old and new names? #: ../glom/navigation/box_tables.cc:383 msgid "Rename Table" msgstr "Renomear tabela" #: ../glom/navigation/box_tables.cc:425 msgid "Unknown Table" msgstr "Tabela desconhecida" #: ../glom/navigation/box_tables.cc:426 msgid "" "You cannot open this table, because there is no information about this table " "in the document." msgstr "" "Você não pode abrir esta tabela, porque não há informações sobre esta tabela " "no documento." #: ../glom/print_layout/canvas_layout_item.cc:303 #: ../glom/utility_widgets/layoutwidgetmenu.cc:38 msgid "Choose Field" msgstr "Escolher campo" #: ../glom/print_layout/canvas_print_layout.cc:257 msgid "_Formatting" msgstr "_Formatação" #. Append the View columns: #: ../glom/mode_design/translation/window_translations.cc:66 msgid "Original" msgstr "Original" #: ../glom/mode_design/translation/window_translations.cc:74 msgid "Item" msgstr "Item" #: ../glom/mode_design/translation/window_translations.cc:82 msgid "Translation" msgstr "Tradução" #. Show only debug output #: ../glom/mode_design/translation/window_translations.cc:435 msgid "Gettext-Warning: " msgstr "Aviso de gettext: " #: ../glom/mode_design/translation/window_translations.cc:451 msgid "Gettext-Error: " msgstr "Erro de gettext: " #. Show the file-chooser dialog, to select an output .po file: #: ../glom/mode_design/translation/window_translations.cc:508 #: ../glom/mode_design/translation/window_translations.cc:586 msgid "Choose .po File Name" msgstr "Escolha o nome do ficheiro .po" #: ../glom/mode_design/translation/window_translations.cc:513 #: ../glom/mode_design/translation/window_translations.cc:590 msgid "Po files" msgstr "Ficheiros po" #: ../glom/utility_widgets/adddel/adddel.cc:159 msgid "This item already exists. Please try again." msgstr "Este item já existe. Por favor tente novamente." #: ../glom/utility_widgets/adddel/adddel.cc:166 msgid "Duplicate" msgstr "Duplicar" #: ../glom/utility_widgets/comboentryglom.cc:186 msgid "Read-only field." msgstr "Campo apenas de leitura." #: ../glom/utility_widgets/comboentryglom.cc:186 msgid "This field may not be edited here." msgstr "Este campo não pode ser editado aqui." #: ../glom/utility_widgets/datawidget.cc:243 #: ../glom/utility_widgets/datawidget.cc:245 msgid "..." msgstr "..." #: ../glom/utility_widgets/datawidget.cc:247 msgid "Choose a date from an on-screen calendar." msgstr "Escolha uma data de um calendário no ecran." #: ../glom/utility_widgets/datawidget.cc:259 msgid "Open" msgstr "Abrir" #: ../glom/utility_widgets/datawidget.cc:261 msgid "Open the record identified by this ID, in the other table." msgstr "Abra o registro identificado por este ID, em outra tabela." #: ../glom/utility_widgets/datawidget.cc:276 msgid "" "Enter search criteria to identify records in the other table, to choose an " "ID for this field." msgstr "" "Introduza o critério de pesquisa para identificar registros em outras " "tabelas, para escolher um ID para este campo." #: ../glom/utility_widgets/db_adddel/db_adddel.cc:106 msgid "Table Content" msgstr "Conteúdo da tabela" #. Translators: This is just some example text used to discover an appropriate height for user-entered text in the UI. This text itself is never shown to the user. #: ../glom/utility_widgets/db_adddel/db_adddel.cc:683 msgid "Example" msgstr "Exemplo" #: ../glom/utility_widgets/db_adddel/db_adddel.cc:2399 msgid "Right-click to layout, to specify the related fields." msgstr "" "Clique com o botão direito na disposição, para especificar os campos " "relacionados." #. Tell user that they can't do that: #: ../glom/utility_widgets/db_adddel/db_adddel.cc:2628 msgid "Extra Related Records Not Possible" msgstr "Registros relacionados adicionais não são possíveis" #: ../glom/utility_widgets/db_adddel/db_adddel.cc:2629 msgid "" "You attempted to add a new related record, but there can only be one related " "record, because the relationship uses a unique key." msgstr "" "Você tentou adicionar um novo registro relacionado, mas só pode haver um " "registro relacionado, porque a relação usa uma chave única." #: ../glom/utility_widgets/dialog_image_progress.cc:135 #: ../glom/utility_widgets/dialog_image_progress.cc:156 msgid "Not enough memory available to load the image" msgstr "Sem memória suficiente para abrir imagem" #: ../glom/utility_widgets/dialog_image_progress.cc:229 msgid "Error loading %1" msgstr "Erro a carregar %1" #: ../glom/utility_widgets/dialog_image_progress.cc:230 msgid "Error loading image" msgstr "Erro a carregar imagem" #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:73 msgid "New Database" msgstr "Nova base de dados" #. For instance, an extra hint when saving from an example, saying that a new file must be saved. #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:90 msgid "" "Please choose a human-readable title for the new database. You can change " "this later in the database properties. It may contain any characters." msgstr "" "Por favor escolha um título legível para humanos para a nova base de dados. " "Você pode alterá-lo no futuro nas propriedades da base de dados. Ele pode " "conter qualquer carácter. " #. Use titles that show the distinction between PostgreSQL and SQLite: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:111 msgid "" "Create PostgreSQL database in its own folder, to be hosted by this computer." msgstr "" "Criar base de dados PostgreSQL em pasta própria, a ser hospedado neste " "computador." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:115 msgid "" "Create database on an external PostgreSQL database server, to be specified " "in the next step." msgstr "" "Criar uma base de dados em um servidor PostgreSQL externo, a ser " "especificado no próximo passo." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:121 msgid "" "Create SQLite database in its own folder, to be hosted by this computer." msgstr "" "Criar uma base de dados SQLite em pasta própria, a ser hospedado por este " "computador." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:122 msgid "" "SQLite does not support authentication or remote access but is suitable for " "embedded devices." msgstr "" "SQLite não oferece suporte a autenticação ou acesso remoto, mas é adequado " "para dispositivos embarcados." #. TODO: Hide this because it's the only radio button, so it's not a choice: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:132 msgid "" "Create database in its own folder, to be hosted by this computer, using " "SQLite" msgstr "" "Criar base de dados em pasta própria, a ser hospedado neste computador, " "usando SQLite" #. Only PostgreSQL: #. Use titles that don't mention the boring name of the backend: #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:141 msgid "Create database in its own folder, to be hosted by this computer." msgstr "" "Criar base de dados em pasta própria, a ser hospedado neste computador." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:145 msgid "" "Create database on an external database server, to be specified in the next " "step." msgstr "" "Criar uma base de dados em um servidor externo, a ser especificado no " "próximo passo." #. TODO: Use Hildon::FileChooser for Maemo. #: ../glom/utility_widgets/imageglom.cc:406 msgid "Choose Image" msgstr "Escolher imagem" #: ../glom/utility_widgets/imageglom.cc:410 msgid "Images" msgstr "Imagens" #: ../glom/utility_widgets/imageglom.cc:556 msgid "Choose File" msgstr "Escolher ficheiro" #: ../glom/utility_widgets/layouttoolbar.cc:52 msgid "Containers" msgstr "Recipientes" #: ../glom/utility_widgets/layouttoolbar.cc:54 msgid "Drag this to the layout to add a new group." msgstr "Arraste este elemento para a disposição para adicionar um novo grupo." # "Notebook" aqui é um conjunto de abas. No gtk+-properties está traduzido # como "notebook", mesmo. #: ../glom/utility_widgets/layouttoolbar.cc:56 msgid "Drag this to the layout to add a new notebook." msgstr "" "Arraste este elemento para a disposição para adicionar um novo conjunto de " "abas." #: ../glom/utility_widgets/layouttoolbar.cc:60 msgid "Drag this to the layout to add a new Related Record." msgstr "" "Arraste este elemento para a disposição para adicionar um novo registro " "relacionado." #: ../glom/utility_widgets/layouttoolbar.cc:62 msgid "Drag this to the layout to add a new button." msgstr "Arraste este elemento para a disposição para adicionar um novo botão." #: ../glom/utility_widgets/layoutwidgetmenu.cc:39 msgid "Field Layout Properties" msgstr "Propriedades do campo da disposição" #: ../glom/utility_widgets/layoutwidgetmenu.cc:40 msgid "Add Field" msgstr "Adicionar campo" #: ../glom/utility_widgets/layoutwidgetmenu.cc:43 msgid "Add Group" msgstr "Adicionar grupo" #: ../glom/utility_widgets/notebooklabelglom.cc:87 msgid "Delete whole notebook \"%1\"?" msgstr "Apagar o conjunto de abas \"%1\" inteiro?" #: ../glom/utility_widgets/notebooklabelglom.cc:92 msgid "Delete whole notebook?" msgstr "Apagar conjunto de abas inteiro?" #: ../glom/xsl_utils.cc:142 msgid "Report Finished" msgstr "Relatório finalizado" #: ../glom/xsl_utils.cc:142 msgid "The report will now be opened in your web browser." msgstr "O relatório será aberto agora no seu navegador da Internet." #~ msgid "Choose a running Glom database" #~ msgstr "Escolher um banco de dados do Glom em execução" #~ msgid "Could Not Read File" #~ msgstr "Não foi possível ler o arquivo" #~ msgid "The file at \"%1\" could not be read: %2" #~ msgstr "O arquivo em \"%1\" não pôde ser lido: %2" #~ msgid "%1 / %2" #~ msgstr "%1 / %2" #~ msgid "Detected as: UTF-8" #~ msgstr "Detectado como: UTF-8" #~ msgid "Could Not Create Configuration Directory" #~ msgstr "Não foi possível criar o diretório de configuração" #~ msgid "" #~ "There was an error when attempting to create the configuration directory " #~ "for the new database files." #~ msgstr "" #~ "Houve um erro ao tentar criar o diretório de configuração para os " #~ "arquivos do novo banco de dados." #~ msgid "Stopping Database Server (retrying)" #~ msgstr "Parando servidor de banco de dados (repetindo)" #~ msgid "Python Error: \n" #~ msgstr "Erro de python: \n" #~ msgid "calendar:MY" #~ msgstr "calendar:MY" #~ msgid "calendar:week_start:0" #~ msgstr "calendar:week_start:0" #~ msgid "year measurement template|2000" #~ msgstr "2000" #~ msgid "calendar:day:digits|%d" #~ msgstr "%d" #~ msgid "calendar:week:digits|%d" #~ msgstr "%d" #~ msgid "calendar year format|%Y" #~ msgstr "%Y" #~ msgid "Not implemented yet." #~ msgstr "Ainda não implementado." #~ msgid "Sorry, the '%s' action is not implemented." #~ msgstr "Desculpe, a ação \"%s\" não está implementada." #~ msgid "Stock Icons (A-F)" #~ msgstr "Ãcones predefinidos (A-F)" #~ msgid "Stock Icons (G-N)" #~ msgstr "Ãcones predefinidos (G-N)" #~ msgid "Stock Icons (O-R)" #~ msgstr "Ãcones predefinidos (O-R)" #~ msgid "Stock Icons (S-Z)" #~ msgstr "Ãcones predefinidos (S-Z)" #~ msgid "Radio Item" #~ msgstr "Item de opção" #~ msgid "Advanced Features" #~ msgstr "Recursos avançados" #~ msgid "Icon Size" #~ msgstr "Tamanho do ícone" #~ msgid "Orientation" #~ msgstr "Orientação" #~ msgid "Style" #~ msgstr "Estilo" #~ msgid "Ellipsize Headers" #~ msgstr "Omitir cabeçalhos" #~ msgid "Exclusive Groups" #~ msgstr "Grupos exclusivos" #~ msgid "Expand Groups" #~ msgstr "Expandir grupos" #~ msgid "Image loading failed" #~ msgstr "Falha ao carregar imagem" #~ msgid "%X" #~ msgstr "%X" #~ msgid "You may not specify more than one field as the primary key." #~ msgstr "Você não pode especificar mais que um campo como chave primária." #~ msgid "Columns Count" #~ msgstr "Contagem de colunas" #~ msgid "gtk-cancel" #~ msgstr "gtk-cancel" #~ msgid "gtk-help" #~ msgstr "gtk-help" #~ msgid "gtk-ok" #~ msgstr "gtk-ok" #~ msgid "*" #~ msgstr "*" #~ msgid "Mode: " #~ msgstr "Modo: " #~ msgid "def calculate_field_value():" #~ msgstr "def calculate_field_value():" #~ msgid "" #~ "Open existing document, or create " #~ "new document\n" #~ "\n" #~ "Would you like to open an existing document, to connect to an existing " #~ "database?\n" #~ "\n" #~ "Or would you like to create a new document, to design a new database?\n" #~ msgstr "" #~ "Abrir arquivo existente ou criar " #~ "novo documento\n" #~ "\n" #~ "Gostaria de abrir um documento existente para conectar a um banco de " #~ "dados existente?\n" #~ "\n" #~ "Ou gostaria de criar um novo documento, para desenhar um novo banco de " #~ "dados?\n" #~ msgid "Edit Definition" #~ msgstr "Definição de Edição" #~ msgid "Extra" #~ msgstr "Extra" #~ msgid "Some help text." #~ msgstr "Algum texto de ajuda" glom-1.22.4/po/fi.po0000644000175000017500000025243012234252646015354 0ustar00murraycmurrayc00000000000000# Finnish messages for glom # Copyright (©) 2006 Ilkka Tuohela # # Ilkka Tuohela , 2006. # msgid "" msgstr "" "Project-Id-Version: glom\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-14 09:44+0300\n" "PO-Revision-Date: 2006-10-22 08:26+0300\n" "Last-Translator: Ilkka Tuohela \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../glom.desktop.in.in.h:1 msgid "A user-friendly database environment." msgstr "Käyttäjäystävällinen tietokantaympäristö." #: ../glom.desktop.in.in.h:2 ../glom/glom.glade.h:22 ../glom/main.cc:198 msgid "Glom" msgstr "Glom" #: ../glom/application.cc:168 msgid "(C) 2000-2005 Murray Cumming" msgstr "(©) 2000-2005 Murray Cumming" #: ../glom/application.cc:168 msgid "A Database GUI" msgstr "Tietokantakäyttöliittymä" #: ../glom/application.cc:267 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:125 #: ../glom/relationships_overview/dialog_relationships_overview.cc:53 msgid "_File" msgstr "_Tiedosto" #: ../glom/application.cc:268 msgid "_Recent Files" msgstr "_Viimeisimmät tiedostot" #: ../glom/application.cc:276 msgid "Save As Example" msgstr "Tallenna esimerkkinä" #: ../glom/application.cc:283 msgid "_Export" msgstr "_Tuo" #: ../glom/application.cc:288 msgid "_Standard" msgstr "_Oletus" #: ../glom/application.cc:292 msgid "_Edit Print Layouts" msgstr "_Muokkaa tulostusasetteluja" #. "Tables" menu: #: ../glom/application.cc:357 msgid "_Tables" msgstr "_Taulut" #: ../glom/application.cc:367 msgid "_Edit Tables" msgstr "_Muokkaa tauluja" #: ../glom/application.cc:372 msgid "Add _Related Table" msgstr "Lisää _viitattu taulu" #. "Reports" menu: #: ../glom/application.cc:380 msgid "_Reports" msgstr "_Raportit" #: ../glom/application.cc:383 msgid "_Edit Reports" msgstr "_Muokkaa raportteja" #. "UserLevel" menu: #: ../glom/application.cc:391 msgid "_User Level" msgstr "_Käyttäjätaso" #: ../glom/application.cc:394 ../glom/application.cc:418 msgid "_Developer" msgstr "_Kehittäjä" #: ../glom/application.cc:398 msgid "_Operator" msgstr "_Ylläpitäjä" #. "Mode" menu: #: ../glom/application.cc:404 msgid "_Mode" msgstr "_Tila" #. We remember this action, so that it can be explicitly activated later. #: ../glom/application.cc:409 msgid "D_ata" msgstr "Ti_eto" #: ../glom/application.cc:413 msgid "_Find" msgstr "_Etsi" #: ../glom/application.cc:422 msgid "_Database Preferences" msgstr "_Tietokannan asetukset" #: ../glom/application.cc:427 msgid "_Fields" msgstr "_Kentät" #: ../glom/application.cc:431 msgid "_Relationships Overview" msgstr "Yhteenveto _suhteista" #: ../glom/application.cc:435 msgid "_Relationships for this Table" msgstr "Tämän taulun _suhteet" #: ../glom/application.cc:439 msgid "_Users" msgstr "_Käyttäjät" #: ../glom/application.cc:443 msgid "_Print Layouts" msgstr "_Tulostusasettelut" #: ../glom/application.cc:447 msgid "R_eports" msgstr "_Raportit" #: ../glom/application.cc:451 msgid "Script _Library" msgstr "Skripti_kirjasto" #: ../glom/application.cc:456 msgid "_Layout" msgstr "_Asettelu" #: ../glom/application.cc:460 msgid "_Test Translation" msgstr "_Kokeile käännöstä" #: ../glom/application.cc:464 msgid "_Translations" msgstr "_Käännökset" #. std::cout << " SOUP_STATUS_FORBIDDEN or SOUP_STATUS_UNAUTHORIZED" << std::endl; #. Warn the user, and let him try again: #: ../glom/application.cc:623 ../glom/frame_glom.cc:1641 #: ../glom/frame_glom.cc:1722 msgid "Connection Failed" msgstr "Yhteys epäonnistui" #: ../glom/application.cc:623 ../glom/frame_glom.cc:1641 #: ../glom/frame_glom.cc:1722 #, fuzzy msgid "" "Glom could not connect to the database server. Maybe you entered an " "incorrect user name or password, or maybe the postgres database server is " "not running." msgstr "" "Yhteys epäonnistui\n" "\n" "Glom ei saanut yhteyttä tietokantapalvelimeen. Syötit ehkä käyttäjätunnuksen " "tai salasanan väärin. Voi myös olla ettei postgres-tietokantapalvelin ole " "päällä." #: ../glom/application.cc:863 msgid "Creating From Example File" msgstr "Luodaan esimerkkitiedoston perusteella" #: ../glom/application.cc:864 msgid "" "To use this example file you must save an editable copy of the file. A new " "database will also be created on the server." msgstr "" "Jos haluat käyttää tätä esimerkkitiedostoa, täytyy sinun tallentaa siitä " "muokattavissa oleva kopio. Samalla luodaan uusi tietokanta palvelimelle." #: ../glom/application.cc:899 msgid "Opening Read-Only File." msgstr "Avataan vain-luku -tiedostoa." #: ../glom/application.cc:900 msgid "" "This file is read only, so you will not be able to enter Developer mode to " "make design changes." msgstr "" "Tiedosto on vain luettavissa, joten kehittäjätilaa ei voi käyttää sen " "muokkaamiseen." #: ../glom/application.cc:903 msgid "Continue without Developer Mode" msgstr "Jatka ilman kehittäjätoimintoja" #. The connection to the server is OK, but the database is not there yet. #: ../glom/application.cc:999 msgid "Database Not Found On Server" msgstr "Tietokantaa ei löydy palvelimelta" #: ../glom/application.cc:999 msgid "" "The database could not be found on the server. Please consult your system " "administrator." msgstr "" "Tietokantaa ei löydy tietokantapalvelielta. Ota yhteyttä järjestelmäsi " "ylläpitäjään." #: ../glom/application.cc:1190 msgid "Open existing document\n" msgstr "Avataan asiakirjaa\n" #: ../glom/application.cc:1380 msgid "_Contents" msgstr "_Sisältö" #: ../glom/application.cc:1380 msgid "Help with the application" msgstr "Sovelluksen ohje" #: ../glom/application.cc:1485 msgid "Creating Glom Database" msgstr "Luo Glomin tietokanta" #: ../glom/application.cc:1485 msgid "Creating Glom database from example file." msgstr "Luo Glomin tietokanta esimerkkitiedostosta." #: ../glom/application.cc:1986 msgid "Save failed." msgstr "Tallennus epäonnistui." #: ../glom/application.cc:1986 msgid "" "There was an error while saving the file. Your changes have not been saved." msgstr "Virhe tallennettaessa tiedostoa. Muutoksia ei ole tallennettu." #: ../glom/application.cc:2033 msgid "Open Document" msgstr "Avaa asiakirja" #. Show Avahi's stock dialog for choosing a publisher service: #: ../glom/application.cc:2053 msgid "Choose a running Glom database" msgstr "Valitse käynnissä oleva Glom-tietokanta" #: ../glom/application.cc:2108 ../glom/application.cc:2113 msgid "Save Document" msgstr "Tallenna asiakirja" #. Warn the user: #: ../glom/application.cc:2211 msgid "Read-only File." msgstr "Vain luku -kenttä." #: ../glom/application.cc:2211 msgid "" "You may not overwrite the existing file, because you do not have sufficient " "access rights." msgstr "" "Et voi kirjoittaa olemassaolevan tiedoston päälle, koska oikeutesi eivät " "riitä." #. Warn the user: #: ../glom/application.cc:2225 msgid "Read-only Directory." msgstr "Vain luku -hakemisto." #: ../glom/application.cc:2225 msgid "" "You may not create a file in this directory, because you do not have " "sufficient access rights." msgstr "Et voi luoda tiedostoa tähän kansioon, koska oikeutesi eivät riitä." #: ../glom/application.cc:2242 msgid "Database Title missing" msgstr "Tietokannan nimi puuttuu" #: ../glom/application.cc:2242 msgid "You must specify a title for the new database." msgstr "Uudelle tietokannalle täytyy antaa nimi." #: ../glom/application.cc:2258 ../glom/libglom/connectionpool.cc:961 msgid "Directory Already Exists" msgstr "Hakemisto on jo olemassa" #: ../glom/application.cc:2258 ../glom/libglom/connectionpool.cc:961 msgid "" "There is an existing directory with the same name as the directory that " "should be created for the new database files. You should specify a different " "filename to use a new directory instead." msgstr "" "Samanniminen kansio, joka ollaan luomassa uusille tietokantatiedostoille, on " "jo olemassa. Anna joku muu nimi, jos haluat käyttää toista kansiota." #: ../glom/base_db.cc:180 ../glom/base_db.cc:193 #: ../glom/libglom/connectionpool.cc:738 msgid "Internal error" msgstr "Sisäinen virhe" #: ../glom/base_db.cc:1064 ../glom/mode_design/users/dialog_groups_list.cc:68 msgid "Description" msgstr "Kuvaus" #: ../glom/base_db.cc:1071 msgid "Comments" msgstr "Kommentit" #: ../glom/base_db.cc:1508 msgid "Your find criteria did not match any records in the table." msgstr "Hakuehto ei vastannut yhtäkään tietuetta taulussa." #: ../glom/base_db.cc:1513 msgid "No Records Found" msgstr "Tietueita ei löydy" #: ../glom/base_db.cc:1519 msgid "New Find" msgstr "Uusi haku" #: ../glom/base_db.cc:2489 msgid "Value Is Not Unique" msgstr "Arvo ei ole yksikäsitteinen" #: ../glom/base_db.cc:2489 msgid "" "The field's value must be unique, but a record with this value already " "exists." msgstr "" "Kentän arvon täytyy olla yksikäsitteinen, mutta tämän arvon sisältävä tietue " "on jo olemassa." #. Append the View columns: #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #. Append the View columns: #: ../glom/box_reports.cc:90 ../glom/glom_developer.glade.h:154 #: ../glom/layout_item_dialogs/dialog_groupby_secondaryfields.cc:51 #: ../glom/layout_item_dialogs/dialog_groupby_sortfields.cc:50 #: ../glom/layout_item_dialogs/dialog_notebook.cc:46 #: ../glom/mode_data/dialog_choose_field.cc:51 #: ../glom/mode_data/dialog_choose_relationship.cc:52 #: ../glom/mode_data/dialog_layout_details.cc:81 #: ../glom/mode_data/dialog_layout_export.cc:52 #: ../glom/mode_design/box_db_table_relationships.cc:43 #: ../glom/mode_design/fields/box_db_table_definition.cc:54 #: ../glom/mode_design/users/dialog_groups_list.cc:64 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:90 msgid "Name" msgstr "Nimi" #. Don't allow a relationship to be added twice. #: ../glom/box_reports.cc:92 msgid "This report already exists. Please choose a different report name" msgstr "Raportti on jo olemassa, valitse joku toinen raportin nimi" #. Title column: #: ../glom/box_reports.cc:94 ../glom/glom_developer.glade.h:198 #: ../glom/layout_item_dialogs/dialog_notebook.cc:47 #: ../glom/mode_data/dialog_choose_field.cc:52 #: ../glom/mode_data/dialog_layout_details.cc:94 #: ../glom/mode_design/box_db_table_relationships.cc:47 #: ../glom/mode_design/fields/box_db_table_definition.cc:58 #: ../glom/mode_design/print_layouts/box_print_layouts.cc:94 #: ../glom/navigation/box_tables.cc:119 #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:94 msgid "Title" msgstr "Otsikko" #: ../glom/box_reports.cc:216 msgid "Are you sure that you want to rename this report?" msgstr "Haluatko varmasti nimetä tämän raportin uudelleen?" #. TODO: Show old and new names? #: ../glom/box_reports.cc:217 msgid "Rename Report" msgstr "Nimeä raportti uudelleen" #. A special "None" item, allowing the user to do the equivalent of clearing the combobox, #. which is not normally possible with the GtkComboBox UI: #: ../glom/combobox_fields.cc:175 msgid "(None)" msgstr "(ei mitään)" #: ../glom/combobox_relationship.cc:268 ../glom/combobox_relationship.cc:272 msgid " Via: " msgstr " Kautta: " #: ../glom/dialog_connection.cc:212 msgid "Not yet created." msgstr "Ei vielä luotu." #. Tables: #: ../glom/dialog_database_preferences.cc:54 #: ../glom/libglom/data_structure/translatable_item.cc:294 #: ../glom/mode_design/box_db_table_relationships.cc:51 #: ../glom/mode_design/users/dialog_groups_list.cc:71 msgid "Table" msgstr "Taulu" #: ../glom/dialog_database_preferences.cc:55 #: ../glom/glom_developer.glade.h:118 #: ../glom/libglom/data_structure/layout/layoutitem_field.cc:196 #: ../glom/libglom/data_structure/translatable_item.cc:282 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:229 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:682 msgid "Field" msgstr "Kenttä" #: ../glom/dialog_database_preferences.cc:56 msgid "Next Value" msgstr "Seuraava arvo" #: ../glom/dialog_new_self_hosted_connection.cc:104 msgid "Username Is Empty" msgstr "Käyttäjätunnus on tyhjä" #: ../glom/dialog_new_self_hosted_connection.cc:104 msgid "Please enter a login name for the new user." msgstr "Anna uudelle käyttäjälle kirjautumisnimi." #: ../glom/dialog_new_self_hosted_connection.cc:109 #: ../glom/mode_design/users/dialog_user.cc:50 msgid "Passwords Do Not Match" msgstr "Salasanat eivät täsmää" #: ../glom/dialog_new_self_hosted_connection.cc:109 #: ../glom/mode_design/users/dialog_user.cc:50 msgid "" "The entered password does not match the entered password confirmation. " "Please try again." msgstr "Syötetty salasana ja sen vahvistus eivät täsmää, yritä uudestaan." #: ../glom/dialog_new_self_hosted_connection.cc:114 #: ../glom/mode_design/users/dialog_user.cc:55 msgid "Password Is Empty" msgstr "Salasana on tyhjä" #: ../glom/dialog_new_self_hosted_connection.cc:114 #: ../glom/mode_design/users/dialog_user.cc:55 msgid "Please enter a password for this user." msgstr "Anna käyttäjän salasana." #: ../glom/filechooser_export.cc:32 msgid "Export To File." msgstr "Vie tiedostoon." #: ../glom/filechooser_export.cc:34 msgid "Define Data _Format" msgstr "Määrittele tiedon _muotoilu" #: ../glom/filechooser_export.cc:39 ../glom/glom_developer.glade.h:116 #: ../glom/translation/window_translations.cc:511 msgid "Export" msgstr "Vie" #. TODO: Obviously this document should have been deleted when the database-creation was cancelled. #. Note that "canceled" is the correct US spelling. #: ../glom/frame_glom.cc:338 msgid "No table" msgstr "Ei taulua" #: ../glom/frame_glom.cc:338 msgid "This database has no tables yet." msgstr "Tässä tietokannassa ei ole vielä tauluja." #: ../glom/frame_glom.cc:377 ../glom/glom.glade.h:16 msgid "Data" msgstr "Tiedot" #: ../glom/frame_glom.cc:402 msgid "Find" msgstr "Etsi" #: ../glom/frame_glom.cc:410 #: ../glom/libglom/data_structure/translatable_item.cc:306 #: ../glom/translation/window_translations.cc:214 msgid "Unknown" msgstr "Tuntematon" #. TODO: Obviously this could be possible but it would require a network protocol and some work: #: ../glom/frame_glom.cc:458 msgid "Developer Mode Not Available." msgstr "Kehittäjätila ei ole käytettävissä." #: ../glom/frame_glom.cc:459 msgid "" "Developer mode is not available because the file was opened over the network " "from a running Glom. Only the original file may be edited." msgstr "" #: ../glom/frame_glom.cc:465 msgid "Developer Mode Not Available" msgstr "Kehittäjätila ei ole käytettävissä" #: ../glom/frame_glom.cc:466 msgid "" "Developer mode is not available. Check that you have sufficient database " "access rights and that the glom file is not read-only." msgstr "" "Kehittäjätila ei ole käytettävissä. Tarkista että sinulla on tarvittavat " "tietokannan pääsyoikeudet ja että glom-tiedosto on kirjoitettavissa." #: ../glom/frame_glom.cc:473 msgid "Saving in New Document Format" msgstr "Tallennetaan uudessa asiakirjamuodossa" #: ../glom/frame_glom.cc:474 msgid "" "The document was created by an earlier version of the application. Making " "changes to the document will mean that the document cannot be opened by some " "earlier versions of the application." msgstr "" "Tämä asiakirja on luotu ohjelman aikaisemmalla versiolla. Jos teet muutoksia " "tähän asiakirjaan, sitä ei voida enää avata kaikilla aikaisemmilla ohjelman " "versioilla." #: ../glom/frame_glom.cc:477 msgid "Continue" msgstr "Jatka" #: ../glom/frame_glom.cc:522 msgid "Export Not Allowed." msgstr "Vienti ei ole sallittu." #: ../glom/frame_glom.cc:522 msgid "" "You do not have permission to view the data in this table, so you may not " "export the data." msgstr "" "Et voi katsella tämän taulun tietoja, joten et voi myöskään viedä sen " "tietoja." #: ../glom/frame_glom.cc:548 msgid "Could Not Create File." msgstr "Tiedostoa ei voi luoda." #: ../glom/frame_glom.cc:548 msgid "Glom could not create the specified file." msgstr "Glom ei voinut luoda määriteltyä tiedostoa." #: ../glom/frame_glom.cc:781 msgid "Table Exists Already" msgstr "Taulu on jo olemassa" #: ../glom/frame_glom.cc:781 msgid "" "A table with this name already exists in the database. Please choose a " "different table name." msgstr "Tämänniminen taulu on jo tietokannassa, valitse toinen taulun nimi." #: ../glom/frame_glom.cc:785 msgid "Relationship Exists Already" msgstr "Suhde on jo olemassa" #: ../glom/frame_glom.cc:785 msgid "" "A relationship with this name already exists for this table. Please choose a " "different relationship name." msgstr "" "Tämänniminen suhde on jo olemassa tälle taululle, valitse toinen suhteen " "nimi." #: ../glom/frame_glom.cc:789 msgid "More information needed" msgstr "Tarvitaan lisätietoja" #: ../glom/frame_glom.cc:789 msgid "You must specify a field, a table name, and a relationship name." msgstr "Sinun täytyy antaa kenttä, taulun nimi ja suhteen nimi." #: ../glom/frame_glom.cc:843 msgid "Related Table Created" msgstr "Viitattu taulu luotu" #: ../glom/frame_glom.cc:843 msgid "The new related table has been created." msgstr "Uusi viitattu taulu on luotu." #: ../glom/frame_glom.cc:944 ../glom/utility_widgets/dialog_choose_id.cc:105 msgid "You have not entered any quick find criteria." msgstr "Et antanut pikahaun hakuehtoja." #: ../glom/frame_glom.cc:949 ../glom/mode_data/box_data.cc:141 #: ../glom/utility_widgets/dialog_choose_id.cc:109 msgid "No Find Criteria" msgstr "Ei hakuehtoa" #. show user level: #: ../glom/frame_glom.cc:1009 msgid "Operator" msgstr "Ylläpitäjä" #: ../glom/frame_glom.cc:1011 msgid "Developer" msgstr "Kehittäjä" #. Show 0 instead of "all" when all of no records are found, to avoid confusion. #: ../glom/frame_glom.cc:2102 msgid "All" msgstr "Kaikki" #. namespace Glom #: ../glom/glom.glade.h:1 msgid "0" msgstr "0" #: ../glom/glom.glade.h:2 msgid "None selected" msgstr "Mitään ei ole valittu" #: ../glom/glom.glade.h:3 msgid "Find Related Record" msgstr "Etsi viitattu tietue" #: ../glom/glom.glade.h:4 msgid "Notebook Tabs" msgstr "Lehtiön välilehdet" #: ../glom/glom.glade.h:5 msgid "Recently Opened Files:" msgstr "Äskettäin avatut tiedostot:" #: ../glom/glom.glade.h:6 msgid "Tables in database" msgstr "Tietokannan taulut" #: ../glom/glom.glade.h:7 msgid "User Level:" msgstr "Käyttäjätaso:" #: ../glom/glom.glade.h:8 msgid "Connect to Server" msgstr "Yhdistä palvelimeen" #: ../glom/glom.glade.h:9 msgid "" "Open existing document, or create new " "document\n" "\n" "Would you like to open an existing document, to connect to an existing " "database?\n" "\n" "Or would you like to create a new document, to design a new database?\n" msgstr "" "Avaa olemassaoleva asiakirja ai luo " "uusi \n" "\n" "Haluatko avata olemassaolevan asiakirjan vai luoda uuden?\n" #: ../glom/glom.glade.h:15 msgid "C_onnect" msgstr "_Yhdistä" #: ../glom/glom.glade.h:17 msgid "Database" msgstr "Tietokanta" #. Add new menu items: #: ../glom/glom.glade.h:18 ../glom/glom_developer.glade.h:114 #: ../glom/mode_design/users/dialog_groups_list.cc:77 #: ../glom/utility_widgets/adddel/adddel.cc:245 msgid "Edit" msgstr "Muokkaa" #: ../glom/glom.glade.h:19 msgid "Find All" msgstr "Etsi kaikki" #: ../glom/glom.glade.h:20 msgid "Find Related Record" msgstr "Etsi viitattu tietue" #: ../glom/glom.glade.h:21 msgid "Found:" msgstr "Löytyi:" #: ../glom/glom.glade.h:23 msgid "Mode:" msgstr "Tila:" #: ../glom/glom.glade.h:24 msgid "New From Example" msgstr "Uusi esimerkistä" #: ../glom/glom.glade.h:25 ../glom/glom_developer.glade.h:158 #: ../glom/mode_design/dialog_design.cc:54 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:573 msgid "None selected" msgstr "Ei valittua" #: ../glom/glom.glade.h:26 ../glom/mode_data/dialog_layout_details.cc:918 msgid "Notebook Tabs" msgstr "Lehtiön välilehdet" #: ../glom/glom.glade.h:27 msgid "Please enter the connection details for your database server." msgstr "Syötä tietokantapalvelimen yhteyden yksityiskohdat." #: ../glom/glom.glade.h:28 ../glom/libglom/spawn_with_feedback.cc:150 msgid "Processing" msgstr "Prosessoidaan" #: ../glom/glom.glade.h:29 msgid "Quick Find" msgstr "Pikahaku" #: ../glom/glom.glade.h:30 msgid "Records: " msgstr "Tietueet:" #: ../glom/glom.glade.h:31 msgid "Show hidden tables" msgstr "Näytä piilotetut taulut" #: ../glom/glom.glade.h:32 ../glom/glom_developer.glade.h:187 msgid "Table:" msgstr "Taulu:" #: ../glom/glom.glade.h:33 msgid "_Host" msgstr "_Palvelin" #: ../glom/glom.glade.h:34 ../glom/glom_developer.glade.h:217 msgid "_Password" msgstr "_Salasana" #: ../glom/glom.glade.h:35 ../glom/glom_developer.glade.h:218 msgid "_User" msgstr "_Käyttäjä" #: ../glom/glom.glade.h:36 msgid "table_name" msgstr "taulun_nimi" #: ../glom/glom_developer.glade.h:1 msgid "Add Related Table" msgstr "Lisää viitattu taulu" #: ../glom/glom_developer.glade.h:2 msgid "Address" msgstr "Osoite" #: ../glom/glom_developer.glade.h:3 msgid "Available Parts" msgstr "Käytettävissä olevat osat" #: ../glom/glom_developer.glade.h:4 msgid "Choices" msgstr "Valinnat" #: ../glom/glom_developer.glade.h:5 msgid "English" msgstr "Englanti" #: ../glom/glom_developer.glade.h:6 msgid "Field Definitions" msgstr "Kentän määrittely" #: ../glom/glom_developer.glade.h:7 msgid "Field:" msgstr "Kenttä:" #: ../glom/glom_developer.glade.h:8 msgid "Fields" msgstr "Kentät" #: ../glom/glom_developer.glade.h:9 msgid "Formatting" msgstr "Muotoilu" #: ../glom/glom_developer.glade.h:10 msgid "Group By" msgstr "Ryhmittele" #: ../glom/glom_developer.glade.h:11 msgid "Group:" msgstr "Ryhmä:" #: ../glom/glom_developer.glade.h:12 msgid "Groups" msgstr "Ryhmät" #: ../glom/glom_developer.glade.h:13 msgid "Image" msgstr "Kuva" #: ../glom/glom_developer.glade.h:14 msgid "Layout name:" msgstr "Asettelun nimi:" #: ../glom/glom_developer.glade.h:15 msgid "Navigation" msgstr "Navigointi" #: ../glom/glom_developer.glade.h:16 msgid "Numeric Formatting" msgstr "Numeerinen muotoilu" #: ../glom/glom_developer.glade.h:17 msgid "Parts" msgstr "Osat" #: ../glom/glom_developer.glade.h:18 msgid "Print Layouts" msgstr "Tulostusasettelut" #: ../glom/glom_developer.glade.h:19 msgid "Relationship:" msgstr "Suhde:" #: ../glom/glom_developer.glade.h:20 msgid "Relationships" msgstr "Suhteet" #: ../glom/glom_developer.glade.h:21 msgid "Report name:" msgstr "Raportin nimi:" #: ../glom/glom_developer.glade.h:22 msgid "Reports" msgstr "Raportit" #: ../glom/glom_developer.glade.h:23 msgid "Select Field" msgstr "Valitse kenttä" #: ../glom/glom_developer.glade.h:24 msgid "Select Relationship" msgstr "Valitse suhde" #: ../glom/glom_developer.glade.h:25 msgid "Sort Fields" msgstr "Järjestyskentät" #: ../glom/glom_developer.glade.h:26 msgid "Source Language:" msgstr "Lähdekieli:" #: ../glom/glom_developer.glade.h:27 msgid "Summary Field" msgstr "Yhteenvetokenttä" #: ../glom/glom_developer.glade.h:28 msgid "Table:" msgstr "Taulu:" #: ../glom/glom_developer.glade.h:29 msgid "Tables" msgstr "Taulut" #: ../glom/glom_developer.glade.h:30 msgid "Target Language:" msgstr "Kohdekieli:" #: ../glom/glom_developer.glade.h:31 msgid "Text Formatting" msgstr "Tekstin muotoilu" #: ../glom/glom_developer.glade.h:32 msgid "Text" msgstr "Teksti" #: ../glom/glom_developer.glade.h:33 msgid "Title:" msgstr "Otsikko:" #: ../glom/glom_developer.glade.h:34 msgid "Title" msgstr "Otsikko" #: ../glom/glom_developer.glade.h:35 msgid "Translations" msgstr "Käännökset" #: ../glom/glom_developer.glade.h:36 msgid "User" msgstr "Käyttäjä" #: ../glom/glom_developer.glade.h:37 msgid "Users" msgstr "Käyttäjät" #: ../glom/glom_developer.glade.h:38 msgid "" "Add Module\n" "\n" "What name should this module have?" msgstr "" "Lisää moduli\n" "\n" "Minkä nimisen modulin haluat luoda?" #: ../glom/glom_developer.glade.h:41 msgid "" "Add User To Group\n" "\n" "Which user should be added to this group?" msgstr "" "Lisää käyttäjä ryhmään\n" "\n" "Minkä käyttäjän haluat lisätä tähän ryhmään?" #: ../glom/glom_developer.glade.h:44 msgid "" "Choose Date\n" "\n" "Please select a date to enter in this field." msgstr "" "Valitse päiväys\n" "\n" "Valitse kenttään syötettävä päiväys." #: ../glom/glom_developer.glade.h:47 msgid "" "Copy Translation\n" "\n" "From what language would you like to copy the translations to use as the " "start of the current translation?" msgstr "" "Kopioi käännös\n" "\n" "Mistä kielestä haluaisit kopioida käännöksen uuden käännöksen pohjaksi?" #: ../glom/glom_developer.glade.h:50 msgid "" "Create Group\n" "\n" "What name should this group have?" msgstr "" "Luo ryhmä\n" "\n" "Minkä nimisen ryhmän haluat luoda?" #: ../glom/glom_developer.glade.h:53 msgid "" "Database creation failed\n" "\n" "Glom could not create the new database. Maybe you do not have the necessary " "access rights. Please contact your system administrator." msgstr "" "Tietokannan luonti epäonnistui\n" "\n" "Glom ei voinut luoda uutta tietokantaa. Voi olla ettei sinulla ole " "tarvittavia pääsyoikeuksia. Ota yhteyttä järjestelmäsi ylläpitäjään." #: ../glom/glom_developer.glade.h:56 msgid "" "First User\n" "\n" "Please enter the initial connection details for your new database. You may " "add additional users later. Remember to keep this password secret because it " "allows access to your data from other computers on the network." msgstr "" #: ../glom/glom_developer.glade.h:59 msgid "" "Identify Original\n" "\n" "The language of the original text is currently identified as:" msgstr "" "Tunnista alkuperäinen\n" "\n" "Alkuperäisen tekstin kieleksi on tunnistettu:" #: ../glom/glom_developer.glade.h:62 msgid "" "Invalid format\n" "\n" "The data in the field was not recognized. Please try to correct the data or " "revert to the previous value. Here is an example of correctly-formatted data " "for this field.\n" msgstr "" "Virheellinen muotoilu\n" "\n" "Kentän sisältämää tietoa ei tunnistettu. Korjaa tieto tai palaa edelliseen " "arvoon. Tässä on esimerkki oikein muotoillusta tiedosta tähän kenttään.\n" #: ../glom/glom_developer.glade.h:66 msgid "" "Test Translation\n" "\n" "Choose a language to use temporarily to test the translations. These " "translations are normally used automatically when the application is started " "on a computer that uses the language.\n" "\n" "Note that the standard parts of the Glom user interface, such as menus and " "dialog windows, will only be translated when you start Glom on a computer " "that uses that language." msgstr "" "Kokeile käännöstä\n" "\n" "Valitse kieli jota haluat väliaikaisesti käyttää käännösten kokeiluun. Näitä " "käännöksiä käytetään automaattisesti, kun sovellus käynnistetään " "tietokoneessa, joka käyttää valittua kieltä.\n" "\n" "Ota huomioon, että Glomin käyttöliittymän perusosat, kuten valikot ja " "ikkunat, käännetään vain silloin kun Glom käynnistetään tietokoneessa joka " "käyttää valittua kieltä." #: ../glom/glom_developer.glade.h:71 #: ../glom/utility_widgets/layoutwidgetbase.cc:44 msgid "Add Button" msgstr "Lisää painike" #: ../glom/glom_developer.glade.h:72 #: ../glom/utility_widgets/layoutwidgetbase.cc:42 msgid "Add Notebook" msgstr "Lisää lehtiö" #: ../glom/glom_developer.glade.h:73 #: ../glom/utility_widgets/layoutwidgetbase.cc:41 msgid "Add Related Records" msgstr "Lisää viitattuja tietueita" #: ../glom/glom_developer.glade.h:74 msgid "Add Related Table" msgstr "Lisää viitattu taulu" #: ../glom/glom_developer.glade.h:75 #: ../glom/utility_widgets/layoutwidgetbase.cc:45 msgid "Add Text" msgstr "Lisää teksti" #: ../glom/glom_developer.glade.h:76 msgid "Add _Group" msgstr "Lisää _ryhmä" #: ../glom/glom_developer.glade.h:77 msgid "" "Add a button. Edit the button to define the script that will be run when the " "button is clicked." msgstr "" "Lisää painike ja määrittele painiketta painettaessa suoritettava skripti." #: ../glom/glom_developer.glade.h:78 msgid "" "Add a group which can contain other layout items. Use this to group items " "together, such as fields." msgstr "" "Lisää ryhmä, joka voi sisältää muita asettelukohtia. Tällä voit ryhmitellä " "yhteen esimerkiksi kenttiä." #: ../glom/glom_developer.glade.h:79 msgid "" "Add a layout item that shows the data from a field in the record, and allows " "the user to edit that value." msgstr "" "Lisää asetteluun kohta, joka näyttää tietueen kentän arvon ja mahdollistaa " "arvon muokkaamisen." #: ../glom/glom_developer.glade.h:80 #, fuzzy msgid "" "Add a related records portal. This is a list of records in a related table. " "Remember to edit this layout item to specify the relationship to use, and " "the fields to show from the related table." msgstr "" "Lisää viitattujen tietueiden portaali. Tämä on lista tietueista viitatuissa " "tauluissa. Muista määritellä tähän asetteluun käytettävät suhteet ja " "viitatuista tauluista näytettävät kentät." #: ../glom/glom_developer.glade.h:81 msgid "" "Add a tabbed notebook. Each page of the notebook may contain several other " "layout items, but only one page will be visible at one time." msgstr "" "Lisää muistikirja välilehdillä. Jokainen muistikirjan sivu voi sisältää " "muita asetteluita, mutta vain yksi sivu voi olla näkyvissä kerrallaan." #: ../glom/glom_developer.glade.h:82 msgid "" "Add an image to the layout, such as a logo. The image will be the same for " "every record viewed. To show an image field from a record, to show different " "images for each field, use the field layout item." msgstr "" "Lisää asetteluun kuva. Kuva voi olla sama kaikille näytettäville tietueille. " "Jos haluat näyttää kuvan tietueen kentästä, näyttäen eri kuvan kullekin " "tietueelle, sinun tulee käyttää kenttäasettelua." #: ../glom/glom_developer.glade.h:83 msgid "" "Add text to a layout, such as an explanation or a warning. The text will be " "the same for every record viewed." msgstr "" "Lisää tekstiä, esimerkiksi varoitus tai selitys, asetteluun. Teksti on sama " "jokaiselle näytetylle tietueelle." #: ../glom/glom_developer.glade.h:84 #: ../glom/mode_design/box_db_table_relationships.cc:53 msgid "Allow Editing" msgstr "Salli muokkaus" #: ../glom/glom_developer.glade.h:85 msgid "Also show" msgstr "Näytä myös" #: ../glom/glom_developer.glade.h:86 msgid "Auto-increment" msgstr "Kasvata automaattisesti" #: ../glom/glom_developer.glade.h:87 msgid "Auto-increment values" msgstr "Automaattisen kasvatuksen arvot" #: ../glom/glom_developer.glade.h:88 msgid "Automatic:" msgstr "Automaattinen:" #: ../glom/glom_developer.glade.h:89 #: ../glom/layout_item_dialogs/box_formatting.cc:117 msgid "Background Color" msgstr "Taustaväri" #: ../glom/glom_developer.glade.h:90 msgid "Border Width (ems)" msgstr "Reunan leveys (ems)" #: ../glom/glom_developer.glade.h:91 msgid "Button Script" msgstr "Painikeskripti" #: ../glom/glom_developer.glade.h:92 msgid "C_reate" msgstr "_Luo" #: ../glom/glom_developer.glade.h:93 msgid "Calculate Value" msgstr "Laske arvo" #. Translators: This is the verb #: ../glom/glom_developer.glade.h:95 msgid "Check" msgstr "Tarkista" #: ../glom/glom_developer.glade.h:96 msgid "Choices From Related Records" msgstr "Valinnat viitatuista tietueista" #: ../glom/glom_developer.glade.h:97 msgid "Choose Date" msgstr "Valitse päiväys" #: ../glom/glom_developer.glade.h:98 msgid "Choose User" msgstr "Valitse käyttäjä" #: ../glom/glom_developer.glade.h:99 msgid "Click this check box to use a non-standard background color." msgstr "" #: ../glom/glom_developer.glade.h:100 msgid "Click this check box to use a non-standard font." msgstr "" #: ../glom/glom_developer.glade.h:101 msgid "Click this check box to use a non-standard foreground color." msgstr "" #: ../glom/glom_developer.glade.h:102 msgid "" "Clicking the row button takes the user to the table specified by this " "relationship:" msgstr "" "Rivipainikkeiden painaminen vie käyttäjän tauluun, jonka tämä suhde " "määrittelee:" #: ../glom/glom_developer.glade.h:103 msgid "Confirm Password" msgstr "Vahvista salasana" #: ../glom/glom_developer.glade.h:104 msgid "Copy From Existing Translation" msgstr "Kopioi olemassaolevasta käännöksestä" #: ../glom/glom_developer.glade.h:105 #: ../glom/libglom/document/document_glom.cc:478 msgid "Country" msgstr "Maa" #: ../glom/glom_developer.glade.h:106 #: ../glom/mode_design/users/dialog_groups_list.cc:80 msgid "Create" msgstr "Luo" #: ../glom/glom_developer.glade.h:107 msgid "Create Group" msgstr "Luo ryhmä" #: ../glom/glom_developer.glade.h:108 msgid "Currency Symbol" msgstr "Valuutan merkki" #: ../glom/glom_developer.glade.h:109 msgid "Custom Choice List" msgstr "Lista omista valinnoista" #: ../glom/glom_developer.glade.h:110 msgid "Database Preferences" msgstr "Tietokannan asetukset" #: ../glom/glom_developer.glade.h:111 msgid "Decimal Places" msgstr "Desimaaleja" #: ../glom/glom_developer.glade.h:112 msgid "Default Formatting" msgstr "Oletusmuotoilu" #: ../glom/glom_developer.glade.h:113 msgid "Details Layout" msgstr "Yksityiskohtien asettelu" #: ../glom/glom_developer.glade.h:115 msgid "English" msgstr "English" #: ../glom/glom_developer.glade.h:117 msgid "Export Format" msgstr "Vientimuoto" #: ../glom/glom_developer.glade.h:119 msgid "Field Calculation" msgstr "Kentän laskenta" #: ../glom/glom_developer.glade.h:120 msgid "Field Definition" msgstr "Kentän määrittely" #: ../glom/glom_developer.glade.h:121 ../glom/mode_design/dialog_fields.cc:36 msgid "Field Definitions" msgstr "Kenttien määrittelyt" #: ../glom/glom_developer.glade.h:122 msgid "Field Layout" msgstr "Kentän asettelu" #: ../glom/glom_developer.glade.h:123 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:71 msgid "Field Summary" msgstr "Kentän yhteenveto" #: ../glom/glom_developer.glade.h:124 msgid "Field:" msgstr "Kenttä:" #. Add labels (because we will hide the checkboxes): #: ../glom/glom_developer.glade.h:125 #: ../glom/layout_item_dialogs/box_formatting.cc:111 msgid "Font" msgstr "Kirjasin" #: ../glom/glom_developer.glade.h:126 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_footer.cc:55 msgid "Footer" msgstr "Alaviite" #: ../glom/glom_developer.glade.h:127 #: ../glom/layout_item_dialogs/box_formatting.cc:114 msgid "Foreground Color" msgstr "Edustaväri" #: ../glom/glom_developer.glade.h:128 msgid "Formatting" msgstr "Muotoilu" #. Translators: FROM as in SQL's FROM #: ../glom/glom_developer.glade.h:130 msgid "From Field:" msgstr "Kentästä:" #: ../glom/glom_developer.glade.h:131 #: ../glom/libglom/data_structure/layout/layoutgroup.cc:357 #: ../glom/mode_data/flowtablewithfields.cc:1157 #: ../glom/mode_data/flowtablewithfields.cc:1170 msgid "Group" msgstr "Ryhmä" #: ../glom/glom_developer.glade.h:132 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_groupby.cc:102 msgid "Group By" msgstr "Ryhmittely" #: ../glom/glom_developer.glade.h:133 msgid "Group By - Secondary Fields" msgstr "Ryhmittely - toissijaiset kentät" #: ../glom/glom_developer.glade.h:134 msgid "Group By - Sort Fields" msgstr "Ryhmittely - järjestyskentät" #: ../glom/glom_developer.glade.h:135 msgid "Group Name" msgstr "Ryhmän nimi" #: ../glom/glom_developer.glade.h:136 msgid "Groups" msgstr "Ryhmät" #: ../glom/glom_developer.glade.h:137 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_header.cc:55 msgid "Header" msgstr "Yläviite" #: ../glom/glom_developer.glade.h:138 msgid "Height (lines)" msgstr "Korkeus (rivejä)" #: ../glom/glom_developer.glade.h:139 msgid "Identify Original" msgstr "Tunnista alkuperäinen" #: ../glom/glom_developer.glade.h:140 msgid "Identify Source" msgstr "Tunnista lähde" #: ../glom/glom_developer.glade.h:141 msgid "" "If the text is not actually in this language, please choose the correct " "language." msgstr "Valitse oikea kieli, jos teksti ei ole tunnistetulla kielellä." #: ../glom/glom_developer.glade.h:142 msgid "" "If this is not selected then a thousands separator will not be used, even if " "your locale would normally use one. If it is selected then a thousands " "separator will be used only if your locale normally uses one." msgstr "" "Jos tätä ei ole valittu, ei tuhatlukujen erotinta käytetä, vaikka lokaalisi " "normaalisti käyttäisi sellaista. Jos tämä on valittu, käytetään tuhutlukujen " "erotinta vain, jos lokaalisi käyttää sellaista." #: ../glom/glom_developer.glade.h:143 msgid "" "If this is selected then the field value will be shown in a multi-line box " "with a scrollbar." msgstr "" "Jos tämä on valittu, kentän arvo näytetään monirivisessä laatikossa " "vierityspalkin kanssa." #: ../glom/glom_developer.glade.h:144 msgid "Image Object" msgstr "Kuvaolio" #. Note to translators: "Import" here is an action verb - it's a button. #: ../glom/glom_developer.glade.h:145 #: ../glom/translation/window_translations.cc:590 msgid "Import" msgstr "Tuo" #: ../glom/glom_developer.glade.h:146 msgid "Language" msgstr "Kieli" #: ../glom/glom_developer.glade.h:147 msgid "Locale" msgstr "Lokaali" #: ../glom/glom_developer.glade.h:148 msgid "Logo" msgstr "Logo" #: ../glom/glom_developer.glade.h:149 msgid "Lookup value when a field changes." msgstr "Etsi arvo, kun kenttä vaihtuu." #. Translators: The Main part of the report (not the footer or header) #: ../glom/glom_developer.glade.h:151 msgid "Main" msgstr "Pääikkuna" #: ../glom/glom_developer.glade.h:152 msgid "Module name:" msgstr "Moduulin nimi:" #: ../glom/glom_developer.glade.h:153 msgid "Multi-line" msgstr "Monirivinen" #: ../glom/glom_developer.glade.h:155 msgid "Name of new related table:" msgstr "Uuden viitatun taulun nimi:" #: ../glom/glom_developer.glade.h:156 msgid "Name of new relationship:" msgstr "Uuden suhteen nimi:" #: ../glom/glom_developer.glade.h:157 msgid "No Choices" msgstr "Ei valintoja" #: ../glom/glom_developer.glade.h:159 msgid "Organisation" msgstr "Organisaatio" #: ../glom/glom_developer.glade.h:160 msgid "Password" msgstr "Salasana" #: ../glom/glom_developer.glade.h:161 msgid "Primary Key" msgstr "Pääavain" #: ../glom/glom_developer.glade.h:162 msgid "Print Layout Editor" msgstr "Tulostusasettelu muokkain" #: ../glom/glom_developer.glade.h:163 msgid "Print Layouts" msgstr "Tulostusasettelut" #: ../glom/glom_developer.glade.h:164 #: ../glom/libglom/data_structure/translatable_item.cc:286 msgid "Relationship" msgstr "Suhde" #: ../glom/glom_developer.glade.h:165 msgid "Relationships Overview" msgstr "Yhteenveto suhteista" #: ../glom/glom_developer.glade.h:166 msgid "" "Remove the item from the layout. If you remove a field layout item, it will " "not remove the field from the table itself. It just will not be seen on the " "layout." msgstr "" "Poista kohta asettelusta. Jos poistat kentän asettelusta, ei kenttää " "poisteta kuitenkaan taulusta: sitä ei vaan näytetä enää asettelussa." #: ../glom/glom_developer.glade.h:167 msgid "Report Layout" msgstr "Raportin asettelu" #: ../glom/glom_developer.glade.h:168 msgid "Reports" msgstr "Raportit" #: ../glom/glom_developer.glade.h:169 msgid "Restrict data to these choices" msgstr "Rajoita tieto näihin valintoihin" #: ../glom/glom_developer.glade.h:170 msgid "Revert" msgstr "Peru" #: ../glom/glom_developer.glade.h:171 msgid "Script name:" msgstr "Skriptin nimi:" #: ../glom/glom_developer.glade.h:172 msgid "Secondary Fields:" msgstr "Toissijaiset kentät:" #: ../glom/glom_developer.glade.h:173 #: ../glom/utility_widgets/dialog_choose_id.cc:88 #: ../glom/utility_widgets/imageglom.cc:391 msgid "Select" msgstr "Valitse" #: ../glom/glom_developer.glade.h:174 msgid "Select Field" msgstr "Valitse kenttä" #: ../glom/glom_developer.glade.h:175 msgid "Select Relationship" msgstr "Valitse suhde" #: ../glom/glom_developer.glade.h:176 msgid "Show Related Relationships" msgstr "Näytä viitesuhteet" #: ../glom/glom_developer.glade.h:177 msgid "Show Table Title" msgstr "Näytä taulukon otsikko" #: ../glom/glom_developer.glade.h:178 msgid "Show child relationships" msgstr "Näytä lapsisuhteet" #: ../glom/glom_developer.glade.h:179 msgid "Sort Fields:" msgstr "Järjestä kentät:" #: ../glom/glom_developer.glade.h:180 msgid "" "Start a translation for this target locale by copying the strings from " "another target locale." msgstr "" "Aloita kääntäminen tälle kohdekielelle kopioimalla merkkijonot toisesta " "käännöksestä." #: ../glom/glom_developer.glade.h:181 msgid "State/County" msgstr "Osavaltio/lääni" #: ../glom/glom_developer.glade.h:182 #: ../glom/libglom/document/document_glom.cc:454 msgid "Street" msgstr "Katuosoite" #: ../glom/glom_developer.glade.h:183 msgid "Street (Line 2)" msgstr "Katuosoite (rivi 2)" #: ../glom/glom_developer.glade.h:184 msgid "Summary Type:" msgstr "Yhteenvedon tyyppi:" #: ../glom/glom_developer.glade.h:185 #: ../glom/libglom/document/document_glom.cc:436 msgid "System Name" msgstr "Järjestelmän nimi" #: ../glom/glom_developer.glade.h:186 msgid "Table Name" msgstr "Taulun nimi" #: ../glom/glom_developer.glade.h:188 msgid "Table: " msgstr "Taulu: " #: ../glom/glom_developer.glade.h:189 msgid "Test" msgstr "Testi" #: ../glom/glom_developer.glade.h:190 msgid "Test Translation" msgstr "Testikäännös" #: ../glom/glom_developer.glade.h:191 msgid "Text Format" msgstr "Tekstin muotoilu" #: ../glom/glom_developer.glade.h:192 msgid "Text Object" msgstr "Tekstiolio" #: ../glom/glom_developer.glade.h:193 msgid "" "The field value will be the return value of the python function, which you " "implement here." msgstr "Tämän kentän arvo on toteuttamasi python-funktion paluuarvo." #: ../glom/glom_developer.glade.h:194 msgid "" "These modules will be available to your button scripts and field " "calculations via the python import keyword." msgstr "" #: ../glom/glom_developer.glade.h:195 msgid "" "This will add a new table and add a relationship that refers to the new " "table, as a convenient alternative to doing this in separate steps.\n" "\n" "If a suitable related table already exists then you should instead cancel " "and just add a relationship." msgstr "" "Tämä lisää uuden taulun ja lisää siihen viittaavan suhteen yhdellä " "toimenpiteellä, sen sijaan että samat toimenpiteet tehtäisiin erikseen.\n" "\n" "Jos sopiva viitetaulu on jo olemassa, tulisi sinun keskeyttää tämä toiminto " "ja lisätä pelkkä suhde taulujen välille." #: ../glom/glom_developer.glade.h:199 msgid "Town" msgstr "Kaupunki" #: ../glom/glom_developer.glade.h:200 msgid "Translations" msgstr "Käännökset" #: ../glom/glom_developer.glade.h:201 msgid "Triggered by:" msgstr "Käynnistänyt:" #: ../glom/glom_developer.glade.h:202 #: ../glom/mode_design/fields/box_db_table_definition.cc:60 msgid "Type" msgstr "Tyyppi" #: ../glom/glom_developer.glade.h:203 msgid "Unique" msgstr "Yksilöllinen" #: ../glom/glom_developer.glade.h:204 msgid "Use 1000s separator" msgstr "Käytä 1000-erotinta" #: ../glom/glom_developer.glade.h:205 msgid "Use custom formatting" msgstr "Käytä omaa muotoilua" #: ../glom/glom_developer.glade.h:206 msgid "Use custom title" msgstr "Käytä omaa otsikkoa" #: ../glom/glom_developer.glade.h:207 msgid "Use default field title: " msgstr "Käytä kentän oletusotsikkoa: " #: ../glom/glom_developer.glade.h:208 msgid "Use default formatting" msgstr "Käytä oletusmuotoilua" #. Append the View columns: #: ../glom/glom_developer.glade.h:209 #: ../glom/mode_design/users/dialog_users_list.cc:68 msgid "User" msgstr "Käyttäjä" #: ../glom/glom_developer.glade.h:210 msgid "User Entry" msgstr "Käyttäjäsyöte" #: ../glom/glom_developer.glade.h:211 msgid "Users" msgstr "Käyttäjät" #: ../glom/glom_developer.glade.h:212 msgid "Value" msgstr "Arvo" #: ../glom/glom_developer.glade.h:213 msgid "" "When the button is clicked it will run the python function which you " "implement here." msgstr "Kun painiketta napsautetaan, suoritetaan toteuttamasi python-funktio." #: ../glom/glom_developer.glade.h:214 msgid "" "When this is selected you will see extra relationships in the Table list, " "allowing you to choose fields from relationships in related tables, instead " "of just regular fields from those related tables." msgstr "" "Kun tämä on valittu, näet lisäyhteyksiä taululistassa. Nämä mahdollistavat " "viitatuissa tauluissa olevien suhteiden kenttien valinnan sen sijaan, että " "voisit valita vain tavallisia kenttiä viitatuista tauluista." #: ../glom/glom_developer.glade.h:215 msgid "Zip/Postal Code" msgstr "Postinumero" #: ../glom/glom_developer.glade.h:216 msgid "_Confirm Password" msgstr "_Vahvista salasana" #: ../glom/glom_developer.glade.h:219 msgid "example data format" msgstr "tiedon esimerkkimuotoilu" #: ../glom/glom_developer.glade.h:220 msgid "field name" msgstr "kentän nimi" #: ../glom/glom_developer.glade.h:221 msgid "table name" msgstr "taulun nimi" #: ../glom/glom_developer.glade.h:222 msgid "the title" msgstr "otsikko" #: ../glom/layout_item_dialogs/dialog_groupby_sortfields.cc:57 msgid "Ascending" msgstr "Laskeva" #. For postgres 8.1, this is "postmaster is running". #. For postgres 8.2, this is "server is running". #. This is a big hack that we should avoid. murrayc. #. #. pg_ctl actually seems to return a 0 result code for "is running" and a 1 for not running, at least with Postgres 8.2, #. so maybe we can avoid this in future. #. Please do test it with your postgres version, using "echo $?" to see the result code of the last command. #. TODO: This is not a stable API. Also, watch out for localisation. #. The first command does not return, but the second command can check whether it succeeded: #: ../glom/libglom/connectionpool.cc:865 msgid "Starting Database Server" msgstr "Käynnistetään tietokantapalvelinta" #: ../glom/libglom/connectionpool.cc:924 msgid "Stopping Database Server" msgstr "Pysäyteytään tietokantapalvelinta" #. I've seen it fail when running under valgrind, and there are reports of failures in bug #420962. #. Maybe it will help to try again: #: ../glom/libglom/connectionpool.cc:931 msgid "Stopping Database Server (retrying)" msgstr "Pysäyteytään tietokantapalvelinta (uusi yritys)" #: ../glom/libglom/connectionpool.cc:981 msgid "Could Not Create Directory" msgstr "Hakemistoa ei voitu luoda" #: ../glom/libglom/connectionpool.cc:981 msgid "" "There was an error when attempting to create the directory for the new " "database files." msgstr "" "Tapahtui virhe yritettäessä luoda hakemistoa uusille tietokannan " "tiedostoille." #: ../glom/libglom/connectionpool.cc:994 msgid "Could Not Create Configuration Directory" msgstr "Asetushakemistoa ei voitu luoda" #: ../glom/libglom/connectionpool.cc:994 msgid "" "There was an error when attempting to create the configuration directory for " "the new database files." msgstr "" "Virhe yritettäessä luoda asetuskansiota uusille tietokantatiedostoille." #. Note that --pwfile takes the password from the first line of a file. It's an alternative to supplying it when prompted on stdin. #: ../glom/libglom/connectionpool.cc:1030 msgid "Creating Database Data" msgstr "Luodaan tietokannan tietoja" #. Show message to the user about the broken installation: #. This is a packaging bug, but it would probably annoy packagers to mention that in the dialog: #. Show message to the user about the broken installation: #. The Postgres provider was not found, so warn the user: #: ../glom/libglom/connectionpool.cc:1208 #: ../glom/libglom/connectionpool.cc:1221 #: ../glom/libglom/connectionpool.cc:1289 msgid "Incomplete Glom Installation" msgstr "Glom-asennus ei ole kokonainen" #. use_markup #. modal #: ../glom/libglom/connectionpool.cc:1209 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "You may now install PostgreSQL to complete the Glom installation." msgstr "" "Glom-asennuksesi ei ole täydellinen, koska PostgreSQL ei ole käytettävissä " "tällä tietokoneella. PostgreSQL vaaditaan Glom-tietokantojen sisäiseen " "tallentamiseen.\n" "\n" "Voit viimeistellä Glom-asennuksen asentamalla tästä PostgreSQL-tietokannan." #: ../glom/libglom/connectionpool.cc:1211 msgid "Install PostgreSQL" msgstr "Asenna PostgreSQL" #. use_markup #. modal #: ../glom/libglom/connectionpool.cc:1222 msgid "" "Your installation of Glom is not complete, because PostgreSQL is not " "available on your system. PostgreSQL is needed for self-hosting of Glom " "databases.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "Glom-asennuksesi ei ole täydellinen, koska PostgreSQL ei ole käytettävissä " "tällä tietokoneella. PostgreSQL vaaditaan Glom-tietokantojen sisäiseen " "tallentamiseen.\n" "\n" "Raportoi tämä vika ohjelmistojakelusi valmistajalle, tai pyydä ylläpitäjääsi " "korjaamaan ongelma." #: ../glom/libglom/connectionpool.cc:1286 msgid "" "Your installation of Glom is not complete, because the PostgreSQL libgda " "provider is not available on your system. This provider is needed to access " "Postgres database servers.\n" "\n" "Please report this bug to your vendor, or your system administrator so it " "can be corrected." msgstr "" "Glom-asennuksesi ei ole täydellinen, koska PostgreSQL libgda-tarjoajaa ei " "ole asennettu. Tätä tarjoajaa tarvitaan Postgres-tietokantojen käsittelyyn.\n" "\n" "Raportoi tämä vika ohjelmistojakelusi valmistajalle, tai pyydä ylläpitäjääsi " "korjaamaan ongelma." #. Warn the user: #: ../glom/libglom/connectionpool.cc:1313 msgid "" "You seem to be running Glom as root. Glom may not be run as root.\n" "Please login to your system as a normal user." msgstr "" "Suoritat glomia pääkäyttäjänä, mutta glomia ei voi suorittaa pääkäyttäjänä.\n" "Kirjaudu järjestelmään tavallisena käyttäjänä." #: ../glom/libglom/connectionpool.cc:1315 msgid "Running As Root" msgstr "Suoritettiin pääkäyttäjänä" #: ../glom/libglom/connectionpool.cc:1424 msgid "Glom: Generating Encryption Certificates" msgstr "Glom: luodaan salausvarmenteita" #: ../glom/libglom/connectionpool.cc:1425 msgid "" "Please wait while Glom prepares your system for publishing over the network." msgstr "" "Odota, että glom valmistelee järjestelmääsi verkkojulkaisua varten." #: ../glom/libglom/data_structure/field.cc:562 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:143 #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:151 msgid "Invalid" msgstr "Ei kelvollinen" #: ../glom/libglom/data_structure/field.cc:563 msgid "Number" msgstr "Numero" #: ../glom/libglom/data_structure/field.cc:564 #: ../glom/libglom/data_structure/layout/layoutitem_text.cc:71 #: ../glom/libglom/data_structure/translatable_item.cc:302 #: ../glom/mode_data/dialog_layout_details.cc:1114 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:233 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:686 msgid "Text" msgstr "Teksti" #: ../glom/libglom/data_structure/field.cc:565 msgid "Time" msgstr "Aika" #: ../glom/libglom/data_structure/field.cc:566 msgid "Date" msgstr "Päiväys" #: ../glom/libglom/data_structure/field.cc:567 msgid "Boolean" msgstr "Totuusarvo" #: ../glom/libglom/data_structure/field.cc:568 #: ../glom/libglom/data_structure/layout/layoutitem_image.cc:69 #: ../glom/libglom/data_structure/translatable_item.cc:304 #: ../glom/mode_data/dialog_layout_details.cc:1121 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:237 msgid "Image" msgstr "Kuva" #: ../glom/libglom/data_structure/glomconversions.cc:51 #, c-format msgid "%X" msgstr "%X" #. TRANSLATORS: Please only translate this string if you know that strftime() shows only 2 year digits when using format "x". We want to always display 4 year digits. For instance, en_GB should translate it to "%d/%m/%Y". To discover if your locale has this problem, try the testdateput_allformats.cc test case in http://bugzilla.gnome.org/show_bug.cgi?id=334648. Thanks. #: ../glom/libglom/data_structure/glomconversions.cc:64 #, c-format msgid "%x" msgstr "%x" #: ../glom/libglom/data_structure/layout/layoutitem_button.cc:67 #: ../glom/libglom/data_structure/translatable_item.cc:300 #: ../glom/mode_data/dialog_layout_details.cc:1107 msgid "Button" msgstr "Painike" #. Note to translators: This is a straight line, not a database row. #: ../glom/libglom/data_structure/layout/layoutitem_line.cc:82 msgid "Line" msgstr "Rivi" #. Note to translators: "Notebook" means a GtkNotebook-type widget. #: ../glom/libglom/data_structure/layout/layoutitem_notebook.cc:56 #: ../glom/mode_data/flowtablewithfields.cc:1153 msgid "Notebook" msgstr "Lehtiö" #: ../glom/libglom/data_structure/layout/layoutitem_placeholder.cc:59 msgid "Placeholder" msgstr "Säilö" #: ../glom/libglom/data_structure/layout/layoutitem_portal.cc:63 msgid "Portal" msgstr "Portaali" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:126 msgid "No summary chosen" msgstr "Yhteenvetoa ei ole valittu" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:145 msgid "Sum" msgstr "Summa" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:147 msgid "Average" msgstr "Keskiarvo" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_fieldsummary.cc:149 msgid "Count" msgstr "Lukumäärä" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_summary.cc:61 msgid "Summary" msgstr "Yhteenveto" #: ../glom/libglom/data_structure/layout/report_parts/layoutitem_verticalgroup.cc:55 msgid "Vertical Group" msgstr "Pystysuuntainen ryhmä" #: ../glom/libglom/data_structure/translatable_item.cc:284 msgid "Custom Title" msgstr "Oma otsikko" #: ../glom/libglom/data_structure/translatable_item.cc:288 msgid "Layout Item" msgstr "Asettelun kohta" #: ../glom/libglom/data_structure/translatable_item.cc:290 msgid "Print Layout" msgstr "Tulostusasettelu" #: ../glom/libglom/data_structure/translatable_item.cc:292 msgid "Report" msgstr "Raportti" #: ../glom/libglom/data_structure/translatable_item.cc:296 msgid "Layout Group" msgstr "Asetteluryhmä" #: ../glom/libglom/data_structure/translatable_item.cc:298 msgid "Field Title" msgstr "Kentän otsikko" #: ../glom/libglom/document/document_glom.cc:405 #: ../glom/libglom/document/document_glom.cc:423 msgid "System Preferences" msgstr "Järjestelmän asetukset" #: ../glom/libglom/document/document_glom.cc:442 msgid "Organisation Name" msgstr "Organisaation nimi" #: ../glom/libglom/document/document_glom.cc:448 msgid "Organisation Logo" msgstr "Organisaation logo" #: ../glom/libglom/document/document_glom.cc:460 msgid "Street (line 2)" msgstr "Katuosoite (rivi 2)" #: ../glom/libglom/document/document_glom.cc:466 msgid "City" msgstr "Kaupunki" #: ../glom/libglom/document/document_glom.cc:472 msgid "State" msgstr "Osavaltio" #: ../glom/libglom/document/document_glom.cc:484 msgid "Zip Code" msgstr "Postinumero" #: ../glom/libglom/gst-package.c:55 msgid "Could not install package" msgstr "Pakettia ei voitu asentaa" #: ../glom/libglom/gst-package.c:73 msgid "The necessary applications to install the package could not be found." msgstr "Paketin asentamiseen tarvittavia sovelluksia ei löytynyt." #: ../glom/libglom/utils.cc:822 msgid "Could not display help: " msgstr "Ohjetta ei voi näyttää: " #: ../glom/main.cc:62 msgid "Glom options" msgstr "Glomin valinnat" #: ../glom/main.cc:62 msgid "Command-line options for glom" msgstr "Glomin komentorivivalinna" #: ../glom/main.cc:69 msgid "The Filename" msgstr "Tiedostonimi" #: ../glom/main.cc:75 msgid "The version of this application." msgstr "Tämän sovelluksen versio." #: ../glom/main.cc:80 msgid "Show the generated SQL queries on stdout, for debugging." msgstr "Näytä luodut SQL-kyselyt oletustulosteessa vianetsintää varten." #: ../glom/main.cc:165 msgid "Error while parsing command-line options: " msgstr "Virhe tulkittaessa komentorivivalitsimia: " #: ../glom/main.cc:166 msgid "Use --help to see a list of available command-line options." msgstr "Valitsin --help näyttää luettelon käytettävissä olevista valitsimista." #: ../glom/mode_data/box_data.cc:136 msgid "" "You have not entered any find criteria. Try entering information in the " "fields." msgstr "Et antanut mitään hakuehtoja. Syötä tietoja kenttiin." #: ../glom/mode_data/box_data.cc:368 msgid "" "This data cannot be stored in the database because you have not provided a " "primary key.\n" "Do you really want to discard this data?" msgstr "" "Tietoja ei voida tallentta tietokantaan, koska pääavainta ei ole annettu.\n" "Haluatko varmasti hylätä nämä tiedot?" #: ../glom/mode_data/box_data.cc:374 msgid "No primary key value" msgstr "Pääavaimelle ei ole arvoa" #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/mode_data/box_data.cc:705 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the relationship does not allow automatic creation " "of new related records." msgstr "" "Tietoa ei voi syöttää tässs viitattuun kenttään, koska viitattu tietue ei " "vielä ole olemassa ja suhde ei salli viitattujen tietueiden automaattista " "luontia." #: ../glom/mode_data/box_data.cc:709 msgid "Related Record Does Not Exist" msgstr "Viitattu tietue ei ole olemassa" #. Warn the user: #. TODO: Make the field insensitive until it can receive data, so people never see this dialog. #: ../glom/mode_data/box_data.cc:729 msgid "" "Data may not be entered into this related field, because the related record " "does not yet exist, and the key in the related record is auto-generated and " "therefore can not be created with the key value in this record." msgstr "" "Tietoa ei voida syöttää tässö viitattuun kenttään, koska viitattu tietue ei " "vielä ole olemassa ja viitatun tietueen avain luodaan automaattisesti. Tämän " "takia tietuetta ei voida luoda tässä tietuessa olevalla avainarvolla." #: ../glom/mode_data/box_data.cc:734 msgid "Related Record Cannot Be Created" msgstr "Viitattua tietuetta ei voi luoda" #. Ask the user for confirmation: #: ../glom/mode_data/box_data.cc:829 msgid "" "Are you sure that you would like to delete this record? The data in this " "record will then be permanently lost." msgstr "" "Haluatko varmasti poistaa tämän tietueen? Tietueen sisältämät tiedot " "hukataan pysyvästi." #: ../glom/mode_data/box_data.cc:833 msgid "Delete record" msgstr "Poista tietue" #. Tell user that they can't do that: #: ../glom/mode_data/box_data_calendar_related.cc:358 #: ../glom/mode_data/box_data_list_related.cc:359 msgid "Extra related records not possible." msgstr "Ylimääräiset viitetietueet eivät ole mahdollisia." #: ../glom/mode_data/box_data_calendar_related.cc:359 #: ../glom/mode_data/box_data_list_related.cc:360 msgid "" "You attempted to add a new related record, but there can only be one related " "record, because the relationship uses a unique key." msgstr "" "Yritit lisätä uuden viitetietueen, mutta kussakin kohdassa voi olla vain " "yksi viitetietue, koska suhde käyttää yksikäsitteisiä avaimia." #: ../glom/mode_data/box_data_calendar_related.cc:575 #: ../glom/mode_data/box_data_list_related.cc:576 msgid "No Corresponding Record Exists" msgstr "Vastaavaa tietuetta ei löydy" #: ../glom/mode_data/box_data_calendar_related.cc:575 #: ../glom/mode_data/box_data_list_related.cc:576 msgid "" "No record with this value exists. Therefore navigation to the related record " "is not possible." msgstr "" "Tällä arvolla ei löydy tietuetta, joten siirtyminen siinä viitattuihin " "tietuesiin ei ole mahdollista." #: ../glom/mode_data/box_data_details.cc:53 msgid "Create a new record." msgstr "Luo uusi tietue." #: ../glom/mode_data/box_data_details.cc:54 msgid "Remove this record." msgstr "Poista tämä tietue." #: ../glom/mode_data/box_data_details.cc:55 msgid "View the first record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:56 msgid "View the previous record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:57 msgid "View the next record in the list." msgstr "" #: ../glom/mode_data/box_data_details.cc:58 msgid "View the last record in the list." msgstr "" #. Tell user that a primary key is needed to delete a record: #: ../glom/mode_data/box_data_details.cc:398 msgid "No primary key value." msgstr "Pääavaimella ei ole arvoa." #: ../glom/mode_data/box_data_details.cc:399 msgid "This record cannot be deleted because there is no primary key." msgstr "Tietuetta ei voi poistaa koska pääavainta ei ole määritelty." #. Warn user that they can't choose their own primary key: #: ../glom/mode_data/box_data_details.cc:779 msgid "Primary key auto increments" msgstr "Pääavaimen automaattinen kasvatus" #: ../glom/mode_data/box_data_details.cc:780 msgid "" "The primary key is auto-incremented.\n" " You may not enter your own primary key value." msgstr "" "Pääavaimen arvoa kasvatetaan automaattisesti.\n" "Et voi syöttää omaa pääavaimen arvoa." #. Add Pages: #: ../glom/mode_data/box_data_list.cc:839 #: ../glom/mode_data/notebook_data.cc:31 ../glom/mode_find/notebook_find.cc:32 msgid "List" msgstr "Lista" #. Columns-count column: #: ../glom/mode_data/dialog_layout_details.cc:106 msgid "Columns Count" msgstr "Sarakkeiden lukumäärä" #: ../glom/mode_data/dialog_layout_details.cc:663 #: ../glom/mode_data/flowtablewithfields.cc:1062 #: ../glom/mode_data/flowtablewithfields.cc:1183 msgid "New Button" msgstr "Uusi painike" #: ../glom/mode_data/dialog_layout_details.cc:688 #: ../glom/mode_data/flowtablewithfields.cc:1196 msgid "Text Title" msgstr "Tekstin otsikko" #: ../glom/mode_data/dialog_layout_details.cc:713 msgid "Image Title" msgstr "Kuvan otsikko" #: ../glom/mode_data/dialog_layout_details.cc:739 #: ../glom/mode_data/flowtablewithfields.cc:1007 msgid "notebook" msgstr "lehtiö" #: ../glom/mode_data/dialog_layout_details.cc:838 msgid "group" msgstr "ryhmä" #: ../glom/mode_data/dialog_layout_details.cc:918 msgid "Add child groups to the notebook to add tabs." msgstr "Lisää aliryhmiä lehtiöön, jos haluat lisätä välilehtiä." #: ../glom/mode_data/dialog_layout_details.cc:1079 msgid "Related: " msgstr "Viite: " #: ../glom/mode_data/dialog_layout_details.cc:1096 msgid "Field: " msgstr "Kenttä: " #: ../glom/mode_data/dialog_layout_details.cc:1153 msgid "(Notebook)" msgstr "(Lehtiö)" #: ../glom/mode_data/dialog_layout_list_related.cc:213 msgid "None: No visible tables are specified by the fields." msgstr "Ei mitään: Kentissä ei ole määritelty näkyviä tauluja." #: ../glom/mode_data/flowtablewithfields.cc:1001 #: ../glom/mode_data/flowtablewithfields.cc:1156 #: ../glom/mode_data/flowtablewithfields.cc:1169 msgid "New Group" msgstr "Uusi ryhmä" #. Note to translators: This is the default name (not seen by most users) for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1013 msgid "tab1" msgstr "tab1" #. Note to translators: This is the default label text for a notebook tab. #: ../glom/mode_data/flowtablewithfields.cc:1016 msgid "Tab One" msgstr "Välilehti 1" #: ../glom/mode_data/flowtablewithfields.cc:1061 msgid "button" msgstr "painike" #. Note to translators: This is the default contents of a text item on a print layout: #: ../glom/mode_data/flowtablewithfields.cc:1068 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:466 msgid "text" msgstr "teksti" #: ../glom/mode_data/flowtablewithfields.cc:1069 msgid "New Text" msgstr "Uusi teksti" #. TODO: Avoid this error message #: ../glom/mode_data/flowtablewithfields.cc:1252 msgid "You cannot drop anything here. Try to add a group first" msgstr "Tähän ei voi tiputtaa mitään. Luo ensin uusi ryhmä" #. Details column: #: ../glom/mode_data/notebook_data.cc:34 ../glom/mode_find/notebook_find.cc:35 #: ../glom/reports/dialog_layout_report.cc:207 msgid "Details" msgstr "Yksityiskohdat" #. Don't allow a relationship to be added twice. #: ../glom/mode_design/box_db_table_relationships.cc:45 msgid "" "This relationship already exists. Please choose a different relationship name" msgstr "Suhde on jo olemassa, valitse toinen suhteen nimi" #. Translators: FROM as in SQL's FROM #: ../glom/mode_design/box_db_table_relationships.cc:50 msgid "From Field" msgstr "Lähdekenttä" #: ../glom/mode_design/box_db_table_relationships.cc:52 msgid "To Field" msgstr "Kohdekenttä" #: ../glom/mode_design/box_db_table_relationships.cc:54 msgid "Automatic Creation" msgstr "Automaattinen luonti" #: ../glom/mode_design/dialog_relationships.cc:36 msgid "Relationships" msgstr "Suhteet" #. Don't allow adding of fields that already exist. #: ../glom/mode_design/fields/box_db_table_definition.cc:56 msgid "This field already exists. Please choose a different field name" msgstr "Kenttä on jo olemassa, valitse toinen kentän nimi" #. TODO: Only show this when there are > 100 records? #: ../glom/mode_design/fields/box_db_table_definition.cc:233 msgid "Recalculation Required" msgstr "Uudestaanlaskenta vaaditaan" #: ../glom/mode_design/fields/box_db_table_definition.cc:234 msgid "" "You have changed the calculation used by this field so Glom must recalculate " "the value in all records. If the table contains many records then this could " "take a long time." msgstr "" "Olet muuttanut tässä kentässä käytettyä laskutoimitusta, joten Glomin täytyy " "laskea arvo uudestaan kaikissa tieteissa. Jos taulussa on paljon tietueita " "voi tämä toimenpide kestää pitkään." #: ../glom/mode_design/fields/box_db_table_definition.cc:239 msgid "Recalculate" msgstr "Laske uudestaan" #: ../glom/mode_design/fields/box_db_table_definition.cc:248 msgid "Invalid database structure" msgstr "Virheellinen tietokantarakenne" #: ../glom/mode_design/fields/box_db_table_definition.cc:249 msgid "" "This database field was created or edited outside of Glom. It has a data " "type that is not supported by Glom. Your system administrator may be able to " "correct this." msgstr "" "Tietokannan kenttä on luotu Glomin ulkopuolella ja se sisältää tietotyypin, " "joka ei ole tuettu Glomissa. Järjestelmäsi ylläpitäjä voi ehkä korjata tämän." #. Warn the user and refuse to make the change: #: ../glom/mode_design/fields/box_db_table_definition.cc:268 msgid "Too many primary keys" msgstr "Liian monta pääavainta" #: ../glom/mode_design/fields/box_db_table_definition.cc:269 msgid "You may not specify more than one field as the primary key." msgstr "Voit määrittää vain yhden kentän pääavaimeksi." #: ../glom/mode_design/fields/box_db_table_definition.cc:448 msgid "Field contains empty values." msgstr "Kenttä sisältää tyhjiä arvoja." #: ../glom/mode_design/fields/box_db_table_definition.cc:448 msgid "" "The field may not yet be used as a primary key because it contains empty " "values." msgstr "" "Kenttää ei voi vielä käyttää pääavaimena, sillä se sisältää tyhjiä arvoja." #: ../glom/mode_design/fields/box_db_table_definition.cc:460 msgid "Field contains non-unique values." msgstr "Kenttä sisältää samoja arvoja." #: ../glom/mode_design/fields/box_db_table_definition.cc:460 msgid "" "The field may not yet be used as a primary key because it contains values " "that are not unique." msgstr "" "Kenttää ei voi vielä käyttää pääavaimena, sillä se sisältää arvoja jotka " "eivät ole yksikäsitteisiä." #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:98 msgid "Calculation Error" msgstr "Virhe laskutoimituksessa" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:98 msgid "The calculation does not have a return statement." msgstr "Laskutoimitus ei sisällä paluulauseketta." #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:131 msgid "Calculation result" msgstr "Laskutoimituksen tulos" #: ../glom/mode_design/fields/dialog_fieldcalculation.cc:131 msgid "The result of the calculation is:\n" msgstr "Laskutoimituksen tulos on:\n" #: ../glom/mode_design/fields/dialog_fielddefinition.cc:156 msgid "Default Value" msgstr "Oletusarvo" #: ../glom/mode_design/script_library/dialog_script_library.cc:132 msgid "Remove library script" msgstr "Poista kirjastoskripti" #: ../glom/mode_design/script_library/dialog_script_library.cc:133 msgid "" "Do you really want to delete this script? This data can not be recovered" msgstr "Haluatko varmasti poistaa tämän skriptin? Poistamista ei voi perua" #: ../glom/mode_design/users/dialog_groups_list.cc:74 msgid "View" msgstr "Näytä" #: ../glom/mode_design/users/dialog_groups_list.cc:83 #: ../glom/utility_widgets/adddel/adddel.cc:251 msgid "Delete" msgstr "Poista" #. TODO: Prevent deletion of standard groups #: ../glom/mode_design/users/dialog_groups_list.cc:216 msgid "Delete Group" msgstr "Poista ryhmä" #: ../glom/mode_design/users/dialog_groups_list.cc:217 msgid "Are your sure that you wish to delete this group?" msgstr "Haluatko varmasti poistaa tämän ryhmän?" #: ../glom/mode_design/users/dialog_groups_list.cc:378 msgid "Full access." msgstr "Täydet oikeudet." #: ../glom/mode_design/users/dialog_users_list.cc:164 msgid "Delete User" msgstr "Poista käyttäjä" #: ../glom/mode_design/users/dialog_users_list.cc:165 msgid "Are your sure that you wish to delete this user?" msgstr "Haluatko varmasti poistaa tämän käyttäjän?" #: ../glom/mode_design/users/dialog_users_list.cc:434 msgid "Developer group may not be empty." msgstr "Kehittäjäryhmä ei voi olla tyhjä." #: ../glom/mode_design/users/dialog_users_list.cc:435 msgid "The developer group must contain at least one user." msgstr "Kehittäjäryhmässä täytyy olla vähintään yksi käyttäjä." #. Don't allow a relationship to be added twice. #: ../glom/mode_design/print_layouts/box_print_layouts.cc:92 msgid "This item already exists. Please choose a different item name" msgstr "Kohta on jo olemassa, valitse joku toinen nimi" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:216 msgid "Are you sure that you want to rename this print layout?" msgstr "Haluatko varmasti nimetä tämän tulostusasettelun uudelleen?" #. TODO: Show old and new names? #: ../glom/mode_design/print_layouts/box_print_layouts.cc:217 msgid "Rename Print Layout" msgstr "Nimeä tulostusasettelu uudelleen" #: ../glom/mode_design/print_layouts/box_print_layouts.cc:219 #: ../glom/navigation/box_tables.cc:410 msgid "Rename" msgstr "Nimeä uudelleen" #: ../glom/mode_design/print_layouts/canvas_layout_item.cc:204 #: ../glom/utility_widgets/layoutwidgetbase.cc:38 msgid "Choose Field" msgstr "Valitse kenttä" #: ../glom/mode_design/print_layouts/canvas_print_layout.cc:209 msgid "_Formatting" msgstr "_Muotoilu" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:126 #: ../glom/relationships_overview/dialog_relationships_overview.cc:54 msgid "Page _Setup" msgstr "Sivun _asettelu" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:135 #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:228 msgid "_Insert" msgstr "_Lisää" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:136 msgid "Insert _Field" msgstr "Lisää _kenttä" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:138 msgid "Insert _Text" msgstr "Lisää _teksti" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:140 msgid "Insert _Image" msgstr "Lisää _kuva" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:142 msgid "Insert _Related Records" msgstr "Lisää _viitatut tietueet" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:144 msgid "Insert _Horizontal Line" msgstr "Lisää _vaakaviiva" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:146 msgid "Insert _Vertical Line" msgstr "Lisää _pystyviiva" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:149 #: ../glom/relationships_overview/dialog_relationships_overview.cc:59 msgid "_View" msgstr "_Näytä" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:150 msgid "Show Grid" msgstr "Näytä ruudukko" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:152 msgid "Show Rules" msgstr "Näytä asteikot" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:156 msgid "Fit Page _Width" msgstr "Sovita sivun _leveys" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:159 msgid "Zoom 200%" msgstr "Zoomaus 200%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:164 msgid "Zoom 50%" msgstr "Zoomaus 50%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:169 msgid "Zoom 25%" msgstr "Zoomaus 25%" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:241 msgid "Related Records" msgstr "Viitatut tietueet" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:245 msgid "Horizontal Line" msgstr "Vaakaviiva" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:249 msgid "Vertical Line" msgstr "Pystyviiva" #: ../glom/mode_design/print_layouts/window_print_layout_edit.cc:680 msgid "Insert" msgstr "Lisää" #: ../glom/navigation/box_tables.cc:114 msgid "Tables" msgstr "Taulut" #. Prevent two tables with the same name from being added. #: ../glom/navigation/box_tables.cc:116 msgid "This table already exists. Please choose a different table name" msgstr "Tämä taulu on jo olemassa, valitse toinen taulun nimi" #: ../glom/navigation/box_tables.cc:118 msgid "Hidden" msgstr "Piilotettu" #: ../glom/navigation/box_tables.cc:120 msgid "Default" msgstr "Oletus" #. Ask the user if they want us to try to cope with this: #: ../glom/navigation/box_tables.cc:226 msgid "Table Already Exists" msgstr "Taulu on jo olemassa" #: ../glom/navigation/box_tables.cc:227 msgid "" "This table already exists on the database server, though it is not mentioned " "in the .glom file. This should not happen. Would you like Glom to attempt to " "use the existing table?" msgstr "" "Tämä taulu on jo olemassa tietokantapalvelimella, vaikka sitä ei ole " "mainittu .glom-tiedostossa. Tätä ei tulisi tapahtua: haluatko glomin " "yrittävän käyttää olemassaolevaa taulua?" #. TODO: Do not show tables that are not in the document. #: ../glom/navigation/box_tables.cc:287 msgid "" "You cannot delete this table, because there is no information about this " "table in the document." msgstr "" "Et voi muokata tätä taulua, koska taulusta ei ole tietoja asiakirjassa." #. Ask the user to confirm: #: ../glom/navigation/box_tables.cc:294 msgid "" "Are you sure that you want to delete this table?\n" "Table name: " msgstr "" "Haluatko varmasti poistaa tämän taulun?\n" "Taulun nimi: " #: ../glom/navigation/box_tables.cc:295 msgid "Delete Table" msgstr "Poista taulu" #. TODO: Do not show tables that are not in the document. #: ../glom/navigation/box_tables.cc:332 msgid "Unknown Table" msgstr "Tuntematon taulu" #: ../glom/navigation/box_tables.cc:333 msgid "" "You cannot open this table, because there is no information about this table " "in the document." msgstr "" "Tätä taulua ei voi avata, koska taulusta ei ole mitään tietoja asiakirjassa." #: ../glom/navigation/box_tables.cc:407 msgid "Are you sure that you want to rename this table?" msgstr "Haluatko varmasti nimetä tämän taulun uudelleen?" #. TODO: Show old and new names? #: ../glom/navigation/box_tables.cc:408 msgid "Rename Table" msgstr "Nimeä taulu uudelleen" #: ../glom/python_embed/glom_python.cc:131 msgid "Python Error: \n" msgstr "Python-virhe: \n" #: ../glom/relationships_overview/dialog_relationships_overview.cc:60 msgid "Show _Grid" msgstr "Näytä r_uudukko" #: ../glom/relationships_overview/dialog_relationships_overview.cc:451 msgid "Edit _Fields" msgstr "Muokkaa _kenttiä" #: ../glom/relationships_overview/dialog_relationships_overview.cc:454 msgid "Edit _Relationships" msgstr "Muokkaa _suhteita" #. Append the View columns: #. Use set_cell_data_func() to give more control over the cell attributes depending on the row: #. Name column: #: ../glom/reports/dialog_layout_report.cc:151 #: ../glom/reports/dialog_layout_report.cc:198 msgid "Part" msgstr "Osa" #. Append the View columns: #: ../glom/translation/window_translations.cc:62 msgid "Original" msgstr "Alkuperäinen" #: ../glom/translation/window_translations.cc:70 msgid "Item" msgstr "Kohde" #: ../glom/translation/window_translations.cc:78 msgid "Translation" msgstr "Käännös" #. Show only debug output #: ../glom/translation/window_translations.cc:429 msgid "Gettext-Warning: " msgstr "Gettext-varoitus: " #: ../glom/translation/window_translations.cc:445 msgid "Gettext-Error: " msgstr "Gettext-virhe: " #. Show the file-chooser dialog, to select an output .po file: #: ../glom/translation/window_translations.cc:502 #: ../glom/translation/window_translations.cc:579 msgid "Choose .po File Name" msgstr "Valitse .po-tiedoston nimi" #: ../glom/translation/window_translations.cc:506 #: ../glom/translation/window_translations.cc:583 msgid "Po files" msgstr "Po-tiedostot" #: ../glom/utility_widgets/adddel/adddel.cc:155 msgid "This item already exists. Please try again." msgstr "Kohde on jo olemassa, yritä uudestaan." #: ../glom/utility_widgets/adddel/adddel.cc:162 msgid "Duplicate" msgstr "Kopioi" #: ../glom/utility_widgets/adddel/adddel.cc:258 msgid "Choose columns" msgstr "Valitse sarakkeet" #. Translate to calendar:YM if you want years to be displayed #. * before months; otherwise translate to calendar:MY. #. * Do *not* translate it to anything else, if it #. * it isn't calendar:YM or calendar:MY it will not work. #. * #. * Note that this flipping is in top of the text direction flipping, #. * so if you have a default text direction of RTL and YM, then #. * the year will appear on the right. #. #: ../glom/utility_widgets/calendar/glomgtkcalendar.c:811 msgid "calendar:MY" msgstr "calendar:MY" #. Translate to calendar:week_start:0 if you want Sunday to be the #. * first day of the week to calendar:week_start:1 if you want Monday #. * to be the first day of the week, and so on. #. #: ../glom/utility_widgets/calendar/glomgtkcalendar.c:849 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. Translators: This is a text measurement template. #. * Translate it to the widest year text. #. * #. * Don't include the prefix "year measurement template|" #. * in the translation. #. * #. * If you don't understand this, leave it as "2000" #. #: ../glom/utility_widgets/calendar/glomgtkcalendar.c:1857 msgid "year measurement template|2000" msgstr "2000" #. Translators: this defines whether the day numbers should use #. * localized digits or the ones used in English (0123...). #. * #. * Translate to "%Id" if you want to use localized digits, or #. * translate to "%d" otherwise. Don't include the "calendar:day:digits|" #. * part in the translation. #. * #. * Note that translating this doesn't guarantee that you get localized #. * digits. That needs support from your system and locale definition #. * too. #. #: ../glom/utility_widgets/calendar/glomgtkcalendar.c:1888 #: ../glom/utility_widgets/calendar/glomgtkcalendar.c:2549 #, c-format msgid "calendar:day:digits|%d" msgstr "%Id" #. Translators: this defines whether the week numbers should use #. * localized digits or the ones used in English (0123...). #. * #. * Translate to "%Id" if you want to use localized digits, or #. * translate to "%d" otherwise. Don't include the #. * "calendar:week:digits|" part in the translation. #. * #. * Note that translating this doesn't guarantee that you get localized #. * digits. That needs support from your system and locale definition #. * too. #. #: ../glom/utility_widgets/calendar/glomgtkcalendar.c:1920 #: ../glom/utility_widgets/calendar/glomgtkcalendar.c:2411 #, c-format msgid "calendar:week:digits|%d" msgstr "%Id" #. Translators: This dictates how the year is displayed in #. * gtkcalendar widget. See strftime() manual for the format. #. * Use only ASCII in the translation. #. * #. * Also look for the msgid "year measurement template|2000". #. * Translate that entry to a year with the widest output of this #. * msgid. #. * #. * Don't include the prefix "calendar year format|" in the #. * translation. "%Y" is appropriate for most locales. #. #: ../glom/utility_widgets/calendar/glomgtkcalendar.c:2201 msgid "calendar year format|%Y" msgstr "%Y" #: ../glom/utility_widgets/comboentryglom.cc:134 msgid "Read-only field." msgstr "Vain-luku-kenttä." #: ../glom/utility_widgets/comboentryglom.cc:134 msgid "This field may not be edited here." msgstr "Tätä kenttää ei voi muokata tässä." #. Let the user choose a date from a calendar dialog: #: ../glom/utility_widgets/datawidget.cc:215 msgid "..." msgstr "..." #. TODO: A better label/icon for "Choose Date". #: ../glom/utility_widgets/datawidget.cc:216 msgid "Choose a date from an on-screen calendar." msgstr "Valitse päiväys näytöllä olevasta kalenterista." #: ../glom/utility_widgets/datawidget.cc:226 msgid "Open the record identified by this ID, in the other table." msgstr "" #: ../glom/utility_widgets/datawidget.cc:231 msgid "" "Enter search criteria to identify records in the other table, to choose an " "ID for this field." msgstr "" #. Don't add ContextLayout in client only mode because it would never #. be sensitive anyway #: ../glom/utility_widgets/db_adddel/db_adddel.cc:245 msgid "Layout" msgstr "Asettelu" #: ../glom/utility_widgets/db_adddel/db_adddel.cc:2079 msgid "Right-click to layout, to specify the related fields." msgstr "Määrittele viitatut kentät napsauttamalla asettelua oikealla napilla." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:72 msgid "New Database" msgstr "Uusi tietokanta" #. For instance, an extra hint when saving from an example, saying that a new file must be saved. #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:89 msgid "" "Please choose a human-readable title for the new database. You can change " "this later in the database properties. It may contain any characters." msgstr "" "Valitse uudelle tietokannalle luettavissa oleva otsikko. Voit muuttaa tätä " "myöhemmin tietokannan ominaisuuksista. Nimi voi sisältää mitä tahansa " "merkkejä." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:103 msgid "Create database in its own folder, to be hosted by this computer." msgstr "Luo tietokanta hakemistoon tällä tietokoneella." #: ../glom/utility_widgets/filechooserdialog_saveextras.cc:107 msgid "" "Create database on an external database server, to be specified in the next " "step." msgstr "" "Luo tietokanta verkossa olevalle tietokantapalvelimelle, joka määritellään " "seuraavaksi." #: ../glom/utility_widgets/imageglom.cc:382 msgid "Choose Image" msgstr "Valitse kuva" #: ../glom/utility_widgets/imageglom.cc:386 msgid "Images" msgstr "Kuvat" #: ../glom/utility_widgets/imageglom.cc:437 msgid "Image loading failed" msgstr "Kuvan lataus epäonnistui" #: ../glom/utility_widgets/imageglom.cc:437 msgid "The image file could not be opened:\n" msgstr "Kuvatiedostoa ei voi avata:\n" #: ../glom/utility_widgets/imageglom.cc:532 msgid "Choose File" msgstr "Valitse tiedosto" #: ../glom/utility_widgets/layoutwidgetbase.cc:39 msgid "Field Layout Properties" msgstr "Kentän asettelun ominaisuudet" #: ../glom/utility_widgets/layoutwidgetbase.cc:40 msgid "Add Field" msgstr "Lisää kenttä" #: ../glom/utility_widgets/layoutwidgetbase.cc:43 msgid "Add Group" msgstr "Lisää ryhmä" #: ../glom/xsl_utils.cc:101 msgid "Report Finished" msgstr "Raportti valmistui" #: ../glom/xsl_utils.cc:101 msgid "The report will now be opened in your web browser." msgstr "Raportti avataan nyt www-selaimessasi." #~ msgid "Choose .po file name" #~ msgstr "Valitse .po-tiedoston nimi" #~ msgid "Not Implemented" #~ msgstr "Ei toteutettu" #~ msgid "This feature is not yet available." #~ msgstr "Tässä toiminto ei ole vielä käytettävissä." #~ msgid "Table Name" #~ msgstr "Taulun nimi" #~ msgid "Add Related" #~ msgstr "Lisää viite" #~ msgid "gtk-add" #~ msgstr "gtk-add" #~ msgid "gtk-remove" #~ msgstr "gtk-add" #~ msgid "Related Records Layout" #~ msgstr "Viitattujen tietueiden asettelu" #~ msgid "Images Not Allowed On List View" #~ msgstr "Kuvia ei voi käyttää listanäkymässä" #~ msgid "The list view cannot display image fields." #~ msgstr "Listanäkymä ei voi näyttää kuvakenttiä." #~ msgid "" #~ "import glom\n" #~ "\n" #~ "def calculate_field_value(record):" #~ msgstr "" #~ "import glom\n" #~ "\n" #~ "def calculate_field_value(record):" #~ msgid "" #~ "import glom\n" #~ "\n" #~ "def on_button_clicked(record):" #~ msgstr "" #~ "import glom\n" #~ "\n" #~ "def on_button_clicked(record):" #~ msgid "Connection" #~ msgstr "Yhteys" #~ msgid "Triggered by: " #~ msgstr "Käynnistänyt:" glom-1.22.4/po/rw.po0000644000175000017500000002731012234252646015403 0ustar00murraycmurrayc00000000000000# translation of glom to Kinyarwanda. # Copyright (C) 2005 Free Software Foundation, Inc. # This file is distributed under the same license as the glom package. # Steve Murphy , 2005 # Steve performed initial rough translation from compendium built from translations provided by the following translators: # Philibert Ndandali , 2005. # Viateur MUGENZI , 2005. # Noëlla Mupole , 2005. # Carole Karema , 2005. # JEAN BAPTISTE NGENDAHAYO , 2005. # Augustin KIBERWA , 2005. # Donatien NSENGIYUMVA , 2005.. # msgid "" msgstr "" "Project-Id-Version: glom HEAD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-04-01 13:50-0700\n" "PO-Revision-Date: 2005-03-31 20:55-0700\n" "Last-Translator: Steve Murphy \n" "Language-Team: Kinyarwanda \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "ULL NAME \n" #: glom/glom.glade.h:1 #, fuzzy msgid "Connection" msgstr "Field Definitions" msgstr "Fields" msgstr "Group:" msgstr " Itsinda" #: glom/glom.glade.h:5 #, fuzzy msgid "Groups" msgstr "Mode:" msgstr "Numeric Formatting" msgstr "Relationship:" msgstr "Select Field" msgstr "Select Relationship" msgstr "Table:" msgstr "Tables in database" msgstr "Tables" msgstr "Title:" msgstr "User Level:" msgstr "User" msgstr "Ukoresha" #: glom/glom.glade.h:17 #, fuzzy msgid "Users" msgstr "def calculate_field_value():" msgstr "Add User To Group\n" "\n" "Which user should be added to this group?" msgstr "" "Connect to Server\n" "\n" "Please enter the connection details for your database server." msgstr "" "Connection Failed\n" "\n" "Glom could not connect to the database server. Maybe you entered an " "incorrect user name or password, or maybe the postgres database server is " "not running." msgstr "" "Create Group\n" "\n" "What name should this group have?" msgstr "Database creation failed\n" "\n" "Glom could not create the new database. Maybe you do not have the necessary " "access rights. Please contact your system administrator." msgstr "Database does not exist\n" "\n" "The database does not yet exist on the database server. Would you like to " "create the database with an empty structure?" msgstr "" "Invalid format\n" "\n" "The data in the field was not recognised. Please try to correct the data or " "revert to the previous value. Here is an example of correctly-formatted data " "for this field.\n" msgstr "" "New Database\n" "\n" "Please choose a name and title for the new database. The name should not " "contain any spaces." msgstr "" "Open existing document, or create new " "document\n" "\n" "Would you like to open an existing document, to connect to an existing " "database?\n" "\n" "Or would you like to create a new document, to design a new database?\n" msgstr "" "Title\n" "\n" "Information text.\n" msgstr "

        ÓUÈ»^oæååÅåË—QUõ¶ù"!¥©ìÅ$7ŠšÆþ¯3ÿ€7=g,`|s/tŽo±ªÚ‹œõ mqü:÷fÿ°ãçHWÍ´xa!uD§Æ³wÕ >Xõ+ûcUü#ÛÐgôXú6ð¶w:NÝËän#9ØwË E/õôJúõ^Dø‡ky£a*›g¼ÁÜ_b8}!‘ 7oªEµcÀ3ÃéRËìt‘lU,5hÔ¨!^²-ÚÒÊ'†{_ÝÍÎØ+¤MëËèý]Yºüij¹ËHd3·?}×5dΚ‰4\…“œœLµj!Ž å6¸Ó;Xm*iYø[ô·úT®‰¿EOzFY6ým01·ÅâÉ©S§nõiB¹uûh)³ì‹“h[½Æ“ͼqË åûvg‹ç¯åXåǘ4¶!^J2rDe´R‡£G2d~"má݉˜oæ2}è(Ò–ÌgHM2*ŠÍ†’w8¿ª Ø[‡¶ÿÁ™ L‰{ê ¶­]È›ÿ%qùl3¸¦$$IBR³ˆ?½‡u_Å úÞCC_ ‘÷5ÄmÓvþŒB­`”þùý ºº£¨á!‰à¬JNNÆlö¼-jaò:ŸF€Å m9mÔÈU,nÄÆ§Sµ²Ç­>Îlö$99ùVŸ† ”[N´²Ðt²s×ïü²õçBçâãíÃÀ'†\õþ¬ñG8’¢Ô(³³ªª¼TSxkÚ·ŽÂCÆÞÙ%ñWf-=F@¿ù¼98£,qW‹0Òû fáÜ]<òn[Šïö«‚ ư–´oW¹-wµ«ƒæÑ‘ÌŸ·‡îoµÄÓÙÍgÏ$:´–rö¡*!<:cÍZ´õ ±þ%¾ÛG¯ ´)1l=&S»G$FѬPádff ×»Q&kÏl—ù}íö÷à±Ö•Ñ–b¼˜FˆÛµÌ¬QfT­¤çbbÁ•Êß ‡«e/£ö2«×—ÏZOA¸•œhe¡¿@³¦ÍiÚ¤™Óm×´n§bÖ®ÕlòËäð¼§¾¥1Óç *{Š"IB’r¯EFìßÉ0Ó¨u²lßæJÛFfïý‡ØŒ6x•ød5b’„Æ\›»x°öÐ~.d¶ÀlpRë1œ9/6ÇD&)—þcçúh¢Ç=…õ£ELlRŸ‡ëk˜ôí..vê„÷‰mü“Êcõ-¥zsʆäädL&S™øåTæY~Z±Š?:w¤O«J”æŒ_âS òqGvüíÜ41Ì6ŽŸ½Eôˆ(Œ×Qƒìcàb| ªZº£o¯Š’Êéþâ”)ŠæÕw­(-f³™””  Â5(³!$IB–e§k¡õ %Ð ÎþsŠÔ|3Š«X“ã¸|)‰’L^ð¾ I ¢Úë2$7 d¦e9QÜå¹é4¨ª ««—©Y«&µkGÑôŽN {í5º{Dz~õ~R$ Mº4A÷Ï—üv1•ã?m'.°Í}oŸÖëÛIJJ žžž¨ªêúa»È—C;ÒfäÄY•|ÛOÛöO³æ¬½Œ¹Ÿk~(¨(¥¾ßˉiø{(® -é· ´¹£/oÇVèo*“£‹ž å³üTVÉê e~ÁÁû¯;˜ ð2p9)Í~\åÛ]hugþÇÀõÈRJéZ¦&zÒK|ô[ÖVìOOÑÌ)×êö¹‹›ëóè=ÞüúÍlÖ hÀ È¶E}X»ùסºÛöl?CzÃ<$ 2O±mon¡uÐKH6 A‰ 1§IUkâ^’óÊ<ÃŽ’ÐUÀÏÍUŸ±Ü7¬)Äg¨< ÈÈTjÕŸ,ϰúÛßi»%–jv Ä径ò,%%/¯â&ÿ´÷…´ÉNJ´jÃf³Ýœþk*¥Úy%!…&á¾ÅìÓFâ™KdÚ®ðÍô5ô]2˜Z†ÜZsåâf¦/9BV–S¬¨ª®ø¦F]Uº½:“®’„|5wþ^îüu伋KãÈ·à>Ly¦fMöß°S¨¥TkºEÉýby™Í&®\‰#9ᔹM¯×“˜˜€ÅâºÁ0!!½þ*'?”,´1‘‡vNdö '8اí¢ªQY›Ä߇“Šý ’<[0¢o(}=Ïd÷§éRSâð7sYp:„ÁSZ`‘$ÐÑþþPfÍû€×¢SéVÏÍÙ¹Rànxé§Ì«þ|39´a>ѧ|é=¹™}”¦Ó7|”=za²¥råÌA¶|¾Œ“ƒèÓ)wIc}{Tå‘…ïp,+„‘íƒq+§©…¢%''ÑW4çùìš g›ìÛȺÌîÕ3ùäó¹"ãWûN3ŒNáF4R'¿x…ñÑp.ņÖR•¦]†ñü€føf·Ÿg^à×%2wÃŽ_Ñàñ*ÕQ³¬Rô1”Ël_0ƒOú›ç’HÇD³ñ³y÷¡*è áÄ”T|-ÅÄ|VÏ&€ÎÏS«™ýkWÞ¿Û×ÑÜŸÆþóù] Àƒ$.¦dÏæŸÅ‰µ/2úÓ]œM¶¡õªFón#yñ‰øi%È<ÆÜƒXßr&kF×ÁC½À¦Þ`ÞoG9w1™ ÉD@í6<>a4Ý"Šn2ôóò )9Õž/®òÍ3”ú â“wG’dÏ3%¿>›Å'Ÿmç`¬Š_­–<2|$½êå àŠK£Úÿ}:˜öóí/iøÊg||§ÙZ:y•Íl6súô™"sLçÊ\€Q3’ÿî'##Ãe½Þ@DxÄU#ÓTºƒWþ·¦óæ±fËRÞZO–ªÁX9˜Fmëã«-ªÖÉ@­!Ÿ0×8kÞcÌ¿ˆ–Œš5Žþ‘îØã!aýÞaZÂT>Y;ñÑVdw ~M‰òÖæ|S— Iü¾ôm–ÄÚðmÄcï<ÇÐúF ÇTZ¼ýpûqãF,4xX|©Z¯ G÷§[COLJ²Õ;÷§É¢7Ù1Ane·íZ¸.%ꃖ}óW²ÈÈÈ =Ï>#ËæH¢¢ªiZ<±Ÿ{Ð}ØKŒòOæ÷eñÎó2A‹ž¡±YÆ;êAžžØo£ØÝ«˜¾äMfÔ\Ìk­½ÐƾÙc˜¸N¡Mÿá<®çÒ?YrŒªã¤} }<û~ÞÆ•ú0aD}¼•äp4ä,³¬6¬™x™Šûbf#16µúL¨¹š×>]ÇѶƒ‰0ȨfÖ—ñ4>9ïq99{É$ > :3â¥^ømœÛµœ÷¾ÊûµþÇ[m½ÑªbÖÝ–‘q>è &M¨GÒq6/›Ç´ñZªýï9šš]Omãe2`µf™eE¯+ðñ›oª} .[ö^$ ,£’Á‘%ã¹8‰V†1%\âÈ÷ ùdôxÒæ}Ì5 HR Ò8Žã×u2¯ß_7YÆhD"K!¯ò2™L¢‰S®Q™ Ð*ùT¢eóÖŦ»¶êr ­9‚ÎcߥӘüŸ(’$ÛçA#Œak¶2T’ Íö-i+Ñ´ÿë,髿ìOv ÈI£æžÑÑᙼûw¤Ë²'ôi9ŠOÇÖÁ]– I–g€ìC‡7?cÛ…Þ<²TฆÊT1»Ó¬×TqõuV(×rGp–°ÃõþwéùÐ{ùŸSlJ ûIòéÚÓÔ±ˆá “ * Žß_Áú˜§hÔȈ©Fk:Ôp¼¶veNýô4öœ#£•CâN|K`ÿ9¼üx˜½<7 àø¦?Ù#©%;F]ûÄ­Æ-h×¢NΨé‚%8>) ?‹©¸ša5ƒøøtds0-@Ý XôÇ#¼ÙÚƒc_,áÏNÌo_ï—*üu9 ^ÈȘÃÛrO¸cu}9õÃ|ýÇ92ÚxájB cX Úµªƒ‡ÜŠfÁ±ü>ô'6O£I=£ËfSI’ðó4Ÿ”†¿Ùy¢¦Òíþi¹¿WêÂÜ%émý“OWþ‡¯O˜üXMŒ²DÛ¦ÕI4‚e þ¤Û›­°$Ÿ&»mÂP©5Cps †R“~/•¼Ê+»¬Š‘œ‚põÊ\€7z©„$KEŒ.“5El•dŠØlO#ËE^“dd¦D˽H²Æõ¾Ô4ÎæùÅö沌 9‘aåÌûÑნ£ØÜϧ`Su\ر’™Ë¾gç‘ ¤i<ЦÙÐ&¤cSU2/âT¦…&MÐçüÍJÙ­q¨%9F5û)r:­9iþ‹OJÅÏ«#8•t®¤‚{5† F<Ý~cýÀ™È@|K½§¡¶§•Ýr9 $+ç·-eÆÂoØKªlD›fC—ŽêÍMÊ÷{ö@& ÷*øóç•i ó÷ö !)_oSþà&û}WÀ´ÑM09òMÖûPÝM"óÌ~Že˜¨ß"ÈÞµ UiUßÈò¿›ÑClñi<WWÊÓ­4óª “É$Fr Â5(“šPBY§øüÍ¡,<¦Å¯ag^ÿ`QF±r@EeÁi¦øùÏÛMU©[/*__¦äxO$Rìi¬VÕ@ËqSVÇÜ0NÂÝÏ õôLze)IíŸfÒкTVOñå›ïðsv'&YFƆUQóœSÞÿU°} ­”Xø¼HLNÁ×ËXì5–ÊåTp÷Ò£‘½¶ýÕdøÒŸöfOYgYrr²cŠbæÛ.‘7 È3Fmåp‚u?.ð@u<äüÍUÉûþäˆ5ŒQu¢u’Í“êž[;ÒùFRM¿’½ÛNV¯6²”=sÎ1t•Š>†š)å¼{­›ó·”’œB`€o1oPÒˆOS1˜ôH€[èà j´”—¿»HÈ Whì)#IzLn*É—R±é§vc­É¸!]¹#Ðþ>ÿ²HüTüÑ®‰§gÎ]tKy®FÞÁóMo-ªéWò×γ¤G…Û›”3O³c_2nUkáç&¡ó+> Y<õz% «¢æ (Ò–R^d4šIHH#9á*‰í¦*ºùôÖïO(ËRRR ¬³ÚGž›§óQœö $K u`Äç¯ð¢ÔŸ‡WÁ=ý§«qÿCµ1ø×&å|¶dæ{¢v¿ÈéäÜ9®05bH¯P†,{‰çlÓ­Y0¦´ƒœHÉM#y} ÏìJµðˆÓ¼RS“ññ¬Vü ^É !tzû”’/w š.«ã¹«kuô²h1ºËd$$¡‚¥JAÒBVE¯ÅóþúTõ¸ÀÉä7…§‘˜£Ç çaù€©1ƒ{†ðäŠWyS?kÀ‘‹Xv6˜þ/5Æ\Â4ªÖ—¨p=k6-euíÎÔ Ž$ÿÖÜ[§tòª ³ÙĹsç®ç’ ÂmIh‚PNØGp)qgv{—«m’ºC>àï¹|úíRÞú<«Á›msÇ‘xVëÁ«c.òÁ²%¼±)p3ùQ7Ø„,©€žðþÓ˜i‰f΢².,/ß:´«nD‹ sŒ"Ï5WZJ³©ø‹¤dœSîHfÈÞLš¬"åÔ0kp3ê!6ŽdT®Þ‡·Ÿ»ÀÔѼô]¨*:sõBÌ¥ºB6‹ÙDZJEæÓk¡§æcS™î1‡Ùë>æ…‹*¾áMyê½aôŠ0ääI±i$ ­‡¦ó[óYþödÒ ~4P‹öuBK%¯ 2™Œb$§ \g_GuË—/ϼï¾ûnJuôÆéÝ»·¨ú¾­\¹’Ž;Š2P„ÌÌL¶mÛÆÝw·/ÑuR NšÒU›²&·9\UT%·Æ(wDsám€cÔqÞæ·‚i L.êŠÍ†ZD³¿Õjeã[èÙ£k &еwjWeM‘ó‘©Š E•‘ñ¾Ïœstì3ç þž{\dóÙ¬^ûïn‡N§+|^Îò-oš¼çêdDwÉÒ¨öÉjo8ož^O^¹òÛiÕª•( Øãž>}úôÒ€TÇ#%ÏÏi@º¨A„r wg _ iqÖOHF–É×W d$9ÿ·µÜ×Þ–ûµ§É 4H…ÒçJNNÁbö(áœmñ³Jm¾¹%ISÄÂw÷éì%;n6/O#))©X,V…p™oy•_%M#!Iš|A[Qy^Ò¼rEŒä„«'4A(RRR0™L\MÓRE‘ššŠÙìbΰr*{q‹ÅóVŸÊM‘ÝÌ)Fr BɉMÊÜþgÅ ¨€RRR*l€¦(ÊmÑ´o4IJJ#9á*ˆMÊäädüýýnÎ"çeLJJ*ÁÁÁ·ú4J•ÙlæÔ©øÛ&?M&çÏÇÞêÓ„rE,ÙX–XcÙ4c/ö®>¸mql_1“O·^Äz›|¸ öf¾Üœ·×ÃþÞMªæÅd2‘ššÊ­¾¶7ëa2ïW„’5h7RÆaf==†ŸMeá¨z‹ùd»Â¾Í?±«ClªŠÓõb²Î²yÙ vu{€m|ŲN·‰ŒŒ ~þù—[}·„,˲‰3))‰¸Õ§rÓ¨ªÊ¦M›nõiB©¹Ñ³ˆíz(ùâÉîL9`£à /u^XÇ¢Üñ®J°Ÿ©È!ÿy©ª}Ñ¢Ó(Ž4*ÎgJ*¢GyY¾ý*½EASÁ&d6 tïÞý¶ÌOA¨V­ZuÃ!´ë¢¢ØlتàÝñM1ç,J­Á\Ý ›Žî¯Ï¦›$•`þ&A(š,Ëœ?ž]»v‘––vÛ A¸•ÜÝÝiÖ¬7åx"@+ –06iB¥¼Õd’„”y”Y}Ÿà«V³ù|l]ûZ…Yqì\1é«ãðe þu;0øÙQtp1kyf,[¢ßeæ×»9zYK@d ¸¢¢÷æÛÒîÝ»¹«Ã]ª?– ByñóæŸ©R¥ÊM9–¨_/ ª}VªæÎҮذ)Ù Ó9=Šá‹ÎÓèÉ7˜3}÷k~dÊØ™ü‘d+ܰ©¦²÷㡌_C`ç±L}kýêIW &n¢£µ ­“’’rÓŽ%jÐJþ׸¿Ý빿WîÉâÕcˆ*puÕÄ]Ìúß)êŽYŘÎUÐIÐ ð¿ôZºC#iZ/ˆ¦Äogîºó \Ì[CÂq—%hY…£v±[T Ü–r*A*4 •†ƒ™ñ\sëÂANdyѼyÙ±–ž“u÷„Û‹ÐA*> •SUêÔ‹ÊÓMrDÙ¬(hý‡Œ‰òÈ3þRÂÃß­t9zYƒŒ kÁ!¢ÂmMh‚ ŸÓMÜ®–}çâ:në|k¢MçØQ‰ÀÎ50æS A†}ê3Õf¿þnþu©î¶„?¶'µQ&Qu& þ>AnN41BìÆ}Ú0¬g W>Ç8y0=šáž~‘“‰Õy¸K­'žvnbÛñÚ‡5gä€0úDO`Œò$½Z†`JÛÏñdn›%b„ÂD€&‚Pñ‰&Λʃú#æ1ÇgŸ|9ŸÉ«°|¨yçHÚ?…EÀý£úñß3ã³´šPˆA3Yè5“WEóÒê²4¼ýëÑ!ÜŒVÒ·%EUÄÅBya½È/ ð{`_žy¨*zQt¡DD€v=d?º/ØJWd4Ζqr cØš­ •r·KºJ4ð ûå©ÉÙ.áÝ|Ÿ~95ç9/ê÷|ùÝó®/ !É2Å­%TL7µMIãì8cªCãP£ó¹ú„ŠéZó>ó‹Ÿ}•ߢ^dÆàZxØâÙÿËoì½£Š¢ Š.A( ]'IÖñÁ%!;Y¢F’d\®\#ÉȶI’Œ$C¡MI`ëÔñLÛv « à†¹r ‘­ï¥ç#©ï£»öú¶ô£,}c 1Ý?bfˆ‡øRP,#• kx7½zÝMÝ’–‡kÎ{=•ªXəܩaÇÿ¢…^JFh‚PÎ ÐÔ,/\"+°+/mŒ§’JÜ{øvõ<žßyŠ·ßL‹æÚ‚4UEUTÅqs-7 ÜXyÊà O5À#í2çNå÷ s˜°þ+:½þ6O7òD[\¸Ö¼×Váþg§pŸ$#“? š ”œÐ¡œ) ©ö‡9”¨¨:xi$hÔ”æ52þß/¼”ª÷¥åW™x_ÜD™„bš A(gœhögò÷SÔ¹{ %‹ôtU•°ÔéÈãcÂÛ¨paÏ:f¯|Ÿ95fò|s ["¶îäd¥îŒ|ª%9Ì Q߇žå…{üq“$ÜÜ‘5!e–‹ò ëCxàÉY7îKÖn¿D«‡¼øoåËLúÊNƒÆ3Ä?•?VÍåãW$ªÌzŠúZÕEÞS–TÅfŸ¿1»ySÍ>/U%ëÌzÞþägÜ»>ÉËÍÐ&Ä’\Õ‚V”)AÈGL³!åŒÓM”,²2ÒI±¦w|ß,üž8M$}Ãô€„GhSÚ†Ú_R7‡Ó[Çñã_çÉljÆ *¨ªŠGhcZ5©…AÂ>)_ ‚Á;ˆ°êÁè$û$ÌâK\–§±`“¢[@mB´_rèÈEÒ“þcɺsD ù„}ÑIPÛ7ŽÃ?ãû£UyO1e)@¦¨A³&^$Añ ²a3×1!S›ì‹R%¹D§ ”3N›8þÉÀGg£&Â=¤)ý_Ê=¾ZP³¸°ë ¢WÿÈžãq¤ËîhÒ´‰ØòÖrà¸gß0-Ûñ9 IDATÏç~eµe^ntV¸Ï—ª¢Höÿ3/æt†•s3‡Ñ}–”»]QÐ_Lî¸È{+KT–rDUÍ=}Øôl°èWFrìŽèÒù~Ú†[Šï'·  B9㲉3¤/<Õ“‹—•< he •¬Ó_3åíÕ¤Üñ8cŸ¨…·z†ïÞÿ„m䎮ËÙWÞ›ºªb¿Ÿ+b@y‘·‰³@€–yþ§³T*‡ù µY±a ÉðÉ<ឯO¡¾’ çœæ½õÌÕ–¥}ÐtUé$Oš|Š{?\ÎÚéSÉ4T¦Ñ#á´‰0#ß ÷'\'Uƒ±²7òޝxç¯@v§R@Bš<ÎÝÚS·²Þ1?™ˆþ¯ó†e1K\Ãô¯“P ª5ëGóöá˜t.ò¾ÓU–%¹mtæ·™Y´¡‘wİmíwˆË@EO¥ð û0!:1øDòröX·|ùòÌûî»ï¦ŒæÜ¸q#½{÷#Goc+W®¤cÇŽ¢ !ûïdÕªU´hբеRŠ«%Çr9úe?‘É0U±¡"#Ú‡Š¢d÷%ËŒ•ªbÏk;ûèK{Þ^ÅÕÞÇŒÜü•¤k€$Ɉ?¡<رmGÎgñµÞ·6nÜHŸ>}z`'Ÿêx¤äù9 H5he•’Ê©}{8i®OË0³hNr8­eäœeu\“7Ã|{ËS[&;j@ ïÃþ:©ðk„²I’Ý8œ6!ÚËDÞMÞ2à<ﯾ,I’ìH…“€L”)A(Hh×Êv–ÿ ìÍû1¶¼}róˆdÒ—óè¶N¯é‡˜÷Üó軌af±HµC4 ‚ T|"@»VreÚOü€j‰6 “£+^åƒ1þ•T×ËHO½®qýCE±‰›±Pˆ¢*n¨A*§šÍ¦Üìó($7j7Å€4<6ŽV¡~Ó9CÅ%ëev.žÎôÕ¿qø²ÿºüì(ºF‰ÿéeyi?÷~´˜g›x¢É:΢§²°Òó¬|û~ª8s|N?Z͵ÿÜxÊ·Ìëà%úÿÜæDÐ.‚Pñ9 Ð wœ’²ë1rÿÇÑ_C"ƒÑ£¾Êƒ^£ß`\@2۾˔±2UW>K³;Gó|Û~¼0e>— Ç{ýæœhÌ SîÆ_'A–ýþ=¦0íá@Ü$ S°X Zš Âí@¬Åyƒ¨‰»˜õ¿SÔ³Š1« “ Aà%~鵄u‡FÒ´©/÷L˜Àw}_eò‰˜¶§éóKy Š[¾é Ü}C‰¬Š›$òE°š BÅ'ú Ý ™ös<ÃÊé©=i9-ûYŦà~>Z¿»y~Ì7t{ó{Î×Ç{÷àV ³Ž/8ZJ¸¥¥¦9Ÿ GA¨0D€v£Ø¬(hý‡Œ‰òÈs?•ðð÷±/ ¬$rä#¤+*JÌF¶žëLßjúœ´ö Ì1룸!  ê5µ©‚ ·À¡‡nÚ±D€vƒè|k¢MçØQ‰ÀÎ50湟Úo® W~ûˆW7Z2g*ú‡óÑŸÓzæ£T×K 1àe€”ËiØD„&ä‘^*A¡"«µÜ ²O†õ äšç÷áglüm[\Ïò/þ!Á¦¢&ÿÅìw6aìý"7ŒbÀ+C¨~`Ó¾;O– èhaàâ†h–ÿ°Ÿ¿ÿНöÅcÝA¡ÂÚ ãAýó˜3¼)é¿Îgò„qŒys.ëÿ:M²’IÌÊ÷ø"ë^ž‰Q–ÐW„zz±sæ¶_±¢ÊÞ´;‘ÕbXðòÆN]È÷ûâÈK ‚ B…'š8K…;õ'®g—*!käÜ>dºJ4ð ûå ª$ûz‰ê %ì˜'½äAý1kÙ5:÷9}ð½¼ðé=LÌ^³N–/ß"‚ B…"jÐJ‰$kÐä Îrž—d4MîÃ1‘™³ô…Ÿ“åÜ׊àL„ÂÇö3ùtëE¬®*éK’F„R#jС»|9ŽÃ1‡HÏHw™F¯×Q3’J>•nâ™ åJÖY6/[Á®n0 ¯}”ùµ¤¹])©œÚ·‡“æú´ 3£×F("@„rìpÌ!"#ë`ñ´¸L“˜˜Àвy««ý™y«æ½áO¿@*îøÖ¨O»nOóL·Z˜ËÒÒJ<›_ÂäΑ¦ª€ŒÞ+ˆ¨æ÷Òohî Ô‹±ÐEPU•¢æõ)IšÛRú!æ=÷<ú.cE˜Í­>¡Bš ”cééX<-E^‹EÔ°¹¢¦`ΈaÌ?àN½N]Ú;/%žSÿþÁᄲøá‘Iü鳤V{‚÷'4ÅdM"öèn¾\͸?ãˆ^9†¦ÂÝ¡4(ŠM¬ò!”ª²÷+­§¦±ÁëÌ?àMÏ ßÜ £¶LU{aï)-Ž_ç¾Ãìöqü\骙/,ä£ÎèÔxö®šÁ«~e¬ŠdúŒKßÞö& Ô½Lî6’ƒ}—±ü±PôXO¯¤_ïE„¸–7¦²yÆÌý%†ÓÉpó¦ZT;<3œ.µœ7#©*`©A£F ñ’%hÑ–V>1ÜûênvÆ^!mZ_FïïÊÒåOSË]F"“˜¹ýé»®!sÖL¤q…à²8±f"#çîäl² ­W5Zt†—µÄ/»]23–-Ñï2óëݽ¬% 2 ®¨hòÆÅ¥)*ï­qì\1é«ãðe þu;0øÙQt0£!£ë?âÍùß³ïB:ª!€;GÄ´®Á¸µ­¸ŒQÙ·öC¦¯ú•¿Ï&¡ñ®Ã£S?dt=#òu—Å~xÿ5æüz„s“ÉLÔiËÀgÇÒ½VnÙñ9ýh5×þsã)ß2ïN+Ûæ½[à}Bß]#w [/‡Âõš …¥üͲ/N¢mõO6óÆ-O4”¯¶ÎÏ_?þʱÊ1ilC¼”däˆÊh¥ GdÈüDÚû1ßÌeúÐQ¤-™ÏšdT› Eɨ ŠMA°%qhûœ Ȥ±‘¸§ž`ÛÚ…¼9ð_—Ïæñ0ƒ‹›˜}"_IÍ"þôÖ}ƒê{ }-DÞ×·MÛù3nµ‚ePøç÷3èꎢ†‡TAnŠ|taÔ˽ñ1Ú8·sï,x™w#W3õo4¤²÷㡌_£ÐvàXžŒÐsqß·Dïcö.Ô¤q™÷éŒÅðUôýã’Ù¾ð]¦Œ•©ºòY^^ÅÄ©ßáñè8fÜŒöÊY’B}ÐY'\o+Z&GbÐÜ8Z ÆÛ }‘®Äc Ô#•JYL&fç^ÎbòsµñH:ÎKæðöX-ÕVO¤™#Bóï1…iâ&I˜‚ÍÈÊN®Qu}áöCE/‡Âõr ‰jZA(_vîú_¶þ\èo×ÇÛ‡O ¹êýYãp$E%¨Qæâz<«*¦ðÖ´o…‡Œ}²Ä_™µôýæóæ`û\wµ#½Ï`ÎÝÅ#ï¶Å»Ø³°/sf kIûvuñÛrW»:hÉüy{èþVK<õÛ3‰­¥œ}¨JÎBc³m½h¬‰ïvÇÑ+(mJ [ÉÔŒ’–1×¼ƒŽ5¿FùrrÓc¬ß}–Œ¶^¶3wÝy‚.æ­!á¸Ë´¬ÂÑ »Øí¸J|ñiy¿•Yÿ;EÝ1«Ó¹ : ^â—^KXwh$Qnç¹l3R¯å´j`A#5ÄTƒ-Ñõ¶¢¨‰»˜¹8ÿ¾Ÿ2mhmŒÙåB’ qG)–ÅÜÙº.rkšŸgÇS›ùþXMÃí©Ü}C‰¬Š›äø"“éâyÜåP¸^N4±ŒŒ ”/Íš6§i“fN·Éò5̦£ØÐê 6µdrxÞÓ ßÒ˜éóG•ݶ#Ùo¢ÙŸ±s$ÃL£Ö!xȲ}›{(m™Y¼÷b3ÚàUâ“‘r–·Ò˜kswÖÚυ̘ Nj"†3çÅæ˜È$åÒì\Mô¸§°~´ˆ‰Mêóp} “¾ÝÅÅNð>±2Cy¬¾¥JÌâüoK˜¾àk¶ÇÄ’*ѦÙÐ%¤£Yr"Ë‹æÍƒ08òIΕ$MŽ‚ya?Ç3¬œžÚ“–Ó²©(6÷ó©èîy„Í6óÁ3røÞžô{´k{£ ®·%3v1éfµ®–S޲ݨ²h¨?_r.Á–gkîõ(êanp”Cáz‰&NA¨J{}N­W(nðç?§HU‚ó4qªX“ã¸|)‰,Š®Vð”$ TÇ8@$7 d¦e¡¨jáÄ®ÎM§AUm®çâ2R³VM{4¢hÒ4„+=†±~õ~F5mA“.Mнü%¿]ì@ÝŸ¶x?Í}+ÎGaÖ‰ÕŒ>š¤Ž£yý™úøªÿ±vòëü˜@Ö cêÑRR’4®Ø¬(hý‡Œ‰òÈ7¯£‡¿:w_úÍøŒ6;¾fùÒeL´Œ•OÎfÖÀHŒ†0×ÛŠ1¬ØP‘(ê»Hi—EIk@‡,Ç5²¿D-ÙWÙRáË¡pýÄDµ‚ f®Ï£÷x“úãlÖNuºlQ·n7ÿ:TwKdÏö3¤g7»fžbÛÞ$ÜBë —´‚,—bN“ZÒ8 ó ;þIBW5?7W}urk9$IB²¦Ÿ¡bð4 #S©U°üËêogÓ–Xª=Ø—û*ÒOî"ÆZ“~Ov£]ƒHêÔ«O¸%÷ý¹ù×¥º[l=Nª‹î,%IãŠÎ·!ÚtŽ• «AxìGAf- !iÍToó(/ÎZÁ¬.&þ^µ–ƒ©*j‘Û\só‹$D›Àží§sË[Î{¹Ae1//¤\NÃV¢åø*~9®Ÿ×¡Óëõ$&&`±¸n¤IHˆG¯7\ÝŽ% -FLä¡™=è öéF»¨jTÖ&ñ÷á¤boA’g Fô ¥ï¢ç™ìþ4]jJþf. N‡0xJ ,’º ÚßʬyðZt*Ýêù¡9û/W Ü`/ý´€yÕ ‘o&‡6Ì'ú”/½'7sÔ9{ÃGÙó§&[*WÎdËçËø19ˆ>Âq—$0FÑ·GUYøDzBÙ>·²4ŸÛuÒF$-`åü5xÞ߀c,'“sɳ9#„Ñ'zc”'éÕ2SÚ~Ž';FÁ–0+²O†õ dàÊç'¦G³ ÜÓ/r2±:w‰ÂãÂ/|¶]!4Ü̳ì>š„jòŤë¹-.·EònÍðG‚x|éx&¨ƒéÚ0CêER«wàÞðÒ+‹.éha`ņh–×ëIMõ‰UÚñP­"^_ÁË¡pýD€&åXDÍHü»ŸŒŒ —iôzáWݪ©t¯üo!MçÍcÍ–¥¼µ"ž,Uƒ±r0ÚÖÇW[Ô·}µ†|Â\ãtf¬y1Tü"Z2jÖ8úGºc¿éë÷Ó¦òÉÚiŒ¶"»[ð‹hJ”·6§•I6$ñûÒ·YkÃ;´½óCë)|/Óâè‡Û 7b ÁÃâKÕz]˜8º?Ýz:¦æp£zçþ4Yô&»"Ò!È­B5%¸UïË´ç/ðVô|&mÈUEg ~Höt"Íd¡×L>\ÍK«ÈÒðö¯G‡p3ZI*aW<¨?bs|fðÉ—ó™¼*«Á‡šwޤýÃQèâ²iÑ*ö\ÈÕ€o<ûF?jd2ŠØVtéõ jø\æxÏàã/æð²$C÷LhÂÝá¥V]’½i7v"=^ù„/O ÝÝŸÖƒëro­"sªB—Cáú9+vºåË—gÞwß}7e°ÀÆéÝ»wù˜ \ä‹'»3Eû2ßϺ‡Jb}k²råJ:vìX>ËÀM’ýw²jÕªB/%u}í×VEUT{¿œ|û“íó 9:«’œ³Îl¾W«Jž© $d¹pGsUQ ìß‘.ë(3Àº–søblûHB$$YvœeïËF¡nS’„\ ƒ»šø;¯ô~sÃW0«Sº Vôò_w»Ü<ËM£*y› _Û¢Ó\MÞÙéÏçlÉ›?Em»†÷-Éšœ÷s]eQrö^íÏ‘s EQrk!שÈkTÁËaE´råÊœÏâk½omܸ‘>}úôÒ€TÇ#%ÏÏi@º˜fãºØçαÉâz ·Î l%$Y*b,€„¬)b«$SÄf{Y.z¬$#k4Nop…“j\ïKMãìÁc$( ü¹üm¾3ug~{¿ 9j®D×]’‘®+Í5æ½$#»z™«mÖDN?GŠÍÉ6Iƒ¥jr‘ïûúÊ¢³÷Zð9 ÙÉÉzÝmT…ë#¦Ù(M¶X6¾÷s¶áÜ¥d2ð ¨igú·“Ùñõwl¹ŒT)œ;ú=ÏK½êà©‘(ѬßJû×}Âô•[ùëT<ªÁ›€ºt}ñ5E¸#5k·ÈJA°Ë:Åçoeá1-~ ;óúCˆ2ŠÛË%~ “ŸÊßNG•ê¹kúW¼×Òì²fµLåP(!Ñ­4eÏ6]u0¯¾XCÜ–}°”i»ƒ¸wð^dâÒ/óyÿé\ïL¨ë,3뷔ɑÅ#y|îy÷}Š7û£9·™wßÛȱ™ ŠŠœµ»™§Füá å“[ÃÖle¨‹æ¡«ß_M†/ý™a`o:“ÅM±¼+wbÁÖ]nÏÛ”Yæ‰r(”ÐJ› ưæ´m…‡Ü˜ ó?Ñki(õ~˜6f©‘;l~–í;Ï“Y' ƒTô¬ßîI»˜½$Ÿî³xoD}̲„r1ŽEïo´.qW‘³v7mj*qÿ A([ŠnB»õûn M…É;Q…’Ú ‘=k´•Ã| ã2ñ yJHî¾Tó‚¿ãRPPk1³~ÿÍá4#M;„cÊž[Ê=—YÌ¬Ý &12HAÊ Ý`Z7™Ør^h1è@±ÚG*7ë·j³bCƒÖU”U̬ݢ㩠‚ ”?"@»éòGLÙ³~²íuH6OÂ-›ÛÝ|#¨"%ð÷ž d64a(p囵»s Œy¶‹Á‚ ‚P>‰í+vÖoï– ~Л‘Ñ“xËø†Jœüu=1ŠJCŠŸµÛ"†q ‚ B¹#´[¬ØY¿%OZŽýˆ×ôï3gÞ$¾N3^Ñi$Š›µÛ"ú¢ ‚ B¹#´ë!ûÑ}ÁVºâ˜@SxZSÛÙ¹ dc(µ[(O®ÜÊœ4Ôì:‘èÎÏçÛuÞY¿eS :M˜ÉƒãíõjGæòÈã›óÑÙÓê*ÑlÀk,ìçdÖnAAÊ ]§ü3—;>]höêÂiŠžá:“ã>c§L5_\‰aÓ¢•œ îÅ=!úœ)4J2K¶ ‚S¶8¶¯ZÉ?U{1°­¯óÁE%I#B©ZY§¤pzÿfoø—ó)V$÷ÊÔhÒ—wŸyœ:b‚C¡ô]¾Çá˜C¤g¤»L£×뉨I%ŸJ7ñÌ„&ë,›—­`W·ÐÆEðU’4·Š’Ê©}{8i®OË0±‚ŠP1ˆ­¬“½i;n.ëÇæm¾³O 7Îá˜CDFÖÁâiq™&11ÿ eóVW?Z8ó;VÍ!zß<~TÜñ­QŸvÝžæ™nµ0—¥¦y%žÍ¯ aòçHSU@FïDTó{é7´?wê+Ìß¡ª*؇'©m~5in‰ôCÌ{îyô]ÆŠ0sÑk» B9!´r ØÅ¤¡¥g¤cñ´xY,^dQÃæŠšz€9#†1ÿ€;õ:uehïP¼”xNýû‡ÊâR&ñ§Ï’Zí ޟГ5‰Ø£»ùrq4ãþŒ#zåšÄ—¥²@Ql¨ª³µ:¡|*{Ÿ‡‚ TLjû¼ÎüÞôœ±€ñͽÐ9jËTµ ÙÆØâøuî;ÌþaÇÏ%®šiñÂB>êˆNgïª|°êWöǪøG¶¡Ïè±ômàmoÖJÝËän#9ØwË E/õôJúõ^Dø‡ky£a*›g¼ÁÜ_b8}!‘ 7oªEµcÀ3ÃéRËyÓ˜ª–4jÔ/Y‚miåý¯îfgìÒ¦õeôþ®,]þ4µÜe$2‰™ÛŸ¾ë2gÍDßô.‹k&2rîNÎ&ÛÐzU£E÷gxiPKü²Û%3cÙý.3¿ÞÍÑËZ"kÀMÞø¦¸4Eå“5Ž+¦3}õo¾¬Á¿n?;Š®f4¤qtýG¼9ÿ{ö]HG5pçè˜Ö5·¢¶•à"ŸÓVsí?7žò-ó:x!YfRÙõj†ÿõ ‹WŒ ¶»Œ”²›‰]ÇpâÉU,~$7IáÒ·#xpšo¬y¼ÉÜߎpîb2’‰€:møìXº»(?‚p­D€&ÂÍ‘ò7˾8‰¶Õk<ÙÌ·1äª÷g?‘• F˜‹«jPULá­iß: $Hü•YKÐo>oŽÄ(KÜÕ"Œô>ƒY8w¼ÛïbÏBŒa-iß®.r[îjWÍ£#™?oÝßj‰§³>p{&Ñ¡µ”³U áÑChlÖ¢­÷õ/ñÝî8z M‰aë1™Ú="1Þ’Õ à"Ÿ¶2맨;fc:WA'AƒÀKüÒk ë$Êí<—mFêµ¼ƒV ,h¤Fd¯_lKt½­$Ü}C‰¬Š›cÍb5q{±eÆR·µåwØòoÝ<‰Ûû;±hÈ:ðÇÓÚâ¥=ɯ¥úHc*k³0†µàÎÖuñ[Ó<ø<;žÚÌ÷ÇÒhZßXâs„âˆM§š5mNÓ&Íœn“eW‹ÃA± Õ¬eÈäð¼§¾¥1Óç *»Ã¥d¿1g×®eÄþÍ‘ 3Z‡à!Ëömî¡´mdfñÞˆÍhƒW‰OÆQ#&Ih̵¹»kíçBf Ì'µ^ÙóbsLd’ré?v®&zÜSX?ZÄÄ&õy¸¾†Ißîâb§NxŸØÆ?™¡hDѤiWz cýêýŒjÚ‚&]š {ùK~»Øº?m'.ð~šûޚ׬«ÿ|4IGóú3õñUÿcíä×ù1;¬AƆU)¢C}IÒ¸b³¢` õ 2&Ê#O°+ááïƒÎÝ—~3>£ÍޝY¾t“-c哳™50£!Ìõ¶bF÷Ú³Zu:À´È2£ñ§uû`>øl3G.µâûÚ¾¯ËY»óé6óŸw+&‡èqÖ`-i è°‘u-×JŠp _ƒA®¹>ÞãMê³Ys8›“ûYQ·87ÿ:TwKdÏö3¤g7» çî5 IDATfžbÛÞ$ÜBë —´‚,—bN“ZÒûeævü“„®j~n®úŒåÖ˜H’„dM!>CÅài@F¦R«þ<`ù—ÕßþΦ-±T{°!.÷uc¥ŸÜEŒµ&ýžìF»‘Ô©WŸpKù×¥º[l=Nª‹Q%IãŠÎ·!ÚtŽ• «AxìGAf- !iÍToó(/ÎZÁ¬.&þ^µ–ƒ©*j‘ÛŠ 1àe€”ËiØò¤,Q™AGÈ=‹ßÊÚ¯¾à/ckÚV ¤ÅݜްžÏ¿:†ß½RÓYͪ Ü@¢ívfeÓ'±µê“Lênñ&z½žÄÄ,× † ñèõ†«Û±d¡Åˆ‰<´s"³=ÁÁ>ÝhUÊÚ$þ>œTô <[0¢o(}=Ïd÷§éRSâð7sYp:„ÁSZ`‘$ÐÑþþPfÍû€×¢SéVÏÍÙ¹R ȸôÓæU€F¾™Ú0ŸèS¾ôžÜÌQCæì eÏŸ^˜l©\9s-Ÿ/ãÇä út Ç]’ÀEßUydá;Ë adû`ÜnÑ|núÀ(‚¤¬œ¿ÏûbŒådrn€#y6gä€0úDO`Œò$½Z†`JÛÏñdLjÕ¦qEöiðž \ùãäÁôh„{úEN&Vçá.Qx\ø…϶+„†ûá‘y–ÝG“PM¾˜4`=·Åå¶"éha`ņh–×ëIMõ‰UÚñP½”@Ü5gónôEüû¡º^ÇÿÙ»ïø¨ªôãŸ{gÒ{B( z“"6T\ìĺ"®•µ·µì.ê*v׊?° baí½+ (‚Ò‘:3÷þþ˜Ie!$ø¾_›×âÜ2÷œsçÎ3çžûœè£N íÓO3ÕÊbì?s‰Õà2id Ð"U ÌØåËxú²kù²ÿý¼0®wÈnÿ <ÛYøùÌv>ž=¸$û·¼.ÝX²t1ååå׉‰‰%¯sÞßudÁ?_}Ï=Ç̯¦ðŸW qÙZ´¥ÿá}Èt륈¥ëØ'™˜ð(Í|ˆk·Ø´Ì¸§¯çünqx? Qäž÷vÜÏ“¯Oà†Én̸Zæ ¤Wš³ê7c‹øqÊ}¼¼ÙCZ‡þ\øÀÍ\Þ'Ý?NNR³ZýÙó\Õó€ƒø”LÚõ>[¯9Ÿ3ú%û>›Ñt<õ|¼xsó.fXvt“Ýžˆîx.nÙÂ&OâöÊÁ¶‰JjMŸœÊ®±äyŠRŸâñ“¹ãµ¸±¤µêͰÎI8 #Ìu‰§ÏUÏñlúc<ù¿IÜ9cîØtºy5GŸÒ‹¨‚ßøäÅÌßRv,™=†qÓÝçÑ%Ö¤<Ȳ gš™ÆÐënåÌ>ÉówÝHY\+½¤'ÇöÎ ãœm8êŒ^=f2oþ½;ñþ®@õ}úôé >¼Yž¥òs2cÆŒFù¼„“ð³þÇ`c[¶wŒX­ý™Þð³Žá¨ÛöþʼDêKß±{!õ ³8,a6_½½˜¢Õã(^¬¯·“<ôtú&® Yµ­Ù¸ÿâ ÌvËŒ}xÏž÷WÞ>äÞ¼®§·×ËÚÉÂ×çÑß²hCŽ´œsÿã\Ó;šu¯‡È(H#f}ï~áû¦Dö5×:Þ¼çr^Xé¤e¿SÿÈXz%(YiC³ ¿â΋îg‘ß'%c8êÑ·yhH’z°d¿¢m/)}uT*Ÿ1‹;14ÍìZü6_ïÈà„3z’h”ͪ=(6P6îÍ€¿ÌØØ–UyüñÒ8ÆL,àà ®à¾~™Û IÉŠÁ0ÌŃhĬï"&:—+f~ÃånËíùþºpå”/¹¼·ãLgû‚ÙâdžÿæÄ€Ë Ý^”ýßMΆ+Þg@«÷ßäù…~tv2ÿÍïØ™u6gäÅBÑwA³jìcûÍÆm”xß¡nfl*j½s.O½´œVçþ.ï^ýЀá3,£x|’EFÖw‘†Öз£t{«q8TÏr€ñ i°vøb»œÂY¦óÌôïØ<ôZÎfÚwÅt½üx:Ƙ¸ÖϪmõñ½T'w¥º™±ëªØ¼åeIô?´}U¦ìjÁ3ŠQYßEDD,ºÅ¹·¢ÚsÒ¹}yö?¯ñÑú¿pÌœÌeÿúKQT„Ȫí4Šî:Xfì*–3ï„Ì(Dcf}‘Ú4“À^3iuäy¿’™o|ÎÌKI<ò\ŽháÄ œ¬ÚÈŒ]WtËnä8w0öúêLÙ>¡2Šƒ/`ò—Ò½³¾«ÃVDD¤6õ 5#e=µ%N¿—)ž6\|O’}cÁBeÕN ´Ó@™±»ÖÉm”v(WžÍESnàFûNï—ElI>%‡qTˆŒâ8“ÉJ6Ø2ç¾_•ÃÑ5â6bÖ÷¹ŠÐDDDjQ€Ö âèvöùôœñ0Kú^È™ckyìvîzc5å.ƒžf¿òÿ÷M>n]*#›ÚJš1¿š~‹È~¡|OÿõDF>¾b¿Yèëðlgáç_0w])ž@?T]ø|ê+¼·´èÀüÒ·JX·à;¾[Qä÷á¡FÛg8m{ ·•4kƒ&"Í—•Ï[—ŽàÞ%»OhÞã¶Y¼xB­Ú¶£mËDBå[®dÛU‰`‚¬cùÖ –g?Uö;ÏÝ| KÎÊ+¹I¡2íì»}šáµíÝVÒ¬)@‘fÌ;]˜§ÝäÞ¼®'ñ¦®æ¼ò(¾ö˶9hÕs—Ü4ŽÓóôÜTlæ«ÉòÔ»óX±ÍIën`»#’o™Y;Yøúã<:ã[m(‘փsîœkz'`Ú…,˜ñÌø–Å›mZu;ŒÑ×\ǹ}Ó¼=QžÍ|üпyöÛ?ؘ¿‹r#‘Ö=çâ›®cD×ê:Zõìy2Ñûïƒî}Ÿç†%°îõ[¹zâ6ìòàLmÏÁ#þÎc†ÐÒi?®Nö™xŽÍŠƒ—´VÛ6˶ Lšˆ4 ÿÍñCÇWÿw‹³xéµkéUç gïœËÓ¯®£çµ3¸öÔ6DÐ7k+_|™Y¿_ÍÀÞµ»Z¬ÂÙLœµ‰ì‹_â?c;g0¤ +>˜Ë¼½«fïœËS/-§Õ¹ÿDŽ˻“PýH7ìü§§¬¤õy“¸ç’n$˜GœKÙèKxaâ\Î~ðpÒlHÈ=˜#íI¼y(ƒÛn⇿}ÎG+KØÙ»»¸ÌtëÚèsð&u9‚á]|Ò+“µŸ\È;ó6P~x*qEË( ¼Ïp5Ƕ Fšˆ4.á±›{gð0ÀŒiAçXÃ]{µŠ-‹YUîfýýg1dBå«Þ\~q›J°z×^ßµå7Ö¸R<8›ØÊ~Fd§‹©Ø¼åeIô?´=ñuò–o^ÄåIô?4§j™×Ãû'ñÒ‚_Ù\~©U÷y ÃûÛ&Vü;÷¨ÜͰ­D‚Qšˆ0Ìôøâ¬,.ž~3×›—pæ lâÊòY»³#§œÖ‹g2YÉ[æ|Â÷«r8:w0W_ËèÉ7r­u)#‡äXº˜U» Rc#íP®<;›‹¦ÜÀö%œÞ/‹Ø’|J:ãØÎsÕ¹8÷Å[¸3î2Nëb°ì½‰<¿>‡Kî=˜”pîFµ¦o^,¯|0™i½Ï¢‹½•m†rl›^dÏ3}ÒL’ïKNÂfÖîªî• z\¹þ÷yRïÔ°ó×Éͯ­D‚ñ y</7ŠmÛ X¶üwÊÊË®C^—nd¤g4⑉HóOŸ«žãÙôÇxò“¸sÆܱét9òjŽ>¥)Q­9~Üy|z÷›<öÆ0¹±7ycžâ…Ô§x|Ædîxm.G,i­z3¬sΈàO¯+'òlÚc<ñÖ³Ü6µ+6›¿Ü8€c:gÑuì“LLx”Çf>ĵ[lZæ aÜÓ×s~·¸OM`¦1ôº[9óŸOòü]7R׊C/éɱ£G3á–-ügò$nÿ l›¨¤ÖôÉ©LÍì¸ÚøßgïaßïŒm†m%˜ßÉÒ§NZqüñÇ7Édé?üø=ݺõ %9%à6;wî`ÉÒ% |ȣŮßßãé'§òá/ë)¬ˆ"¥u{z¿”;.;¬:O4:M–š&K̶`µ—Û¶…Us¬RÍå¾e5·±m Ûª9FË;GmXM©[F잣·ö2³Ö }uæ}ª}xÓšTöLyëÂØ½^ñÎÇk©{#Ä>ƒ”0`Û6·¶’æ£1'K÷ÛƒÖ”ÿ²ò2R’S‚CJJ*åAzØü± ¿çžq÷óQÂŒ½f yIä¯YÊïf*ñ‰'Òl¦#ÈÔ@¦c÷¥†aâçåÊbÖYf&FƒÌiÔx‚•1hùýÖYÝ× Ìº•r¿¡Ö©³O÷NÖ®ÚH±¿:†ƒ”v¹dÅû?†æÖV"þ0cÐ*Ö~Ǽq{÷?¸lP’w\ƒ}’ï©"JpçWóÛ¹S™vab p¯ŸÎy£^¤óã¯sw¿b>}øß<ûÍlܺ‹râÉx*ç5ùáÝ™½|FFgŽ8ïîÙƒd‡Q‘{O¶ÁÅš™A²q{ øvâ<óéBVmÜA™ÄÁ·=Éys¯âº%g0eÚet31¨`ùÄó9wV?žy+%šš…NDš «ð+î¼è~ù}*3†£}›‡†„Nf+Ò\0ZT‹N´fóÞýžõ}Ž¥CœéÍ·Sµ†wN¿ZÝó¶…å±°*³k·»„ý£'±ó™úÈ&ÌËæØKÆòï1‰lýz?þZô~•{ÆWgäÞ“m GðlÜžB~ùì[V¶¸Û¯ëGªµ 3/‡žéý‰þt6?Œ¥k[¬üúãŸDõG§ø0žÌ‰ f‹“yþ›.¯yËVd±Úœ¹?òõ7_î6ynzZ:ÿuìïÏ‘u wßþ7Nψo_â°“Ïàœ³OfHN|Û#5Ù¾ìÚƒ9üà^Ä›‘½é FNéÀI£Ná°$£?}~³çl¢¢G.±¾Íöhà š;À¶Iì|(GÚË{{Ö0 þйƒç02»5Îâå|³Ò¤û™ÝHÐx%iv ¡î—ŠìÇ"6@4p0 ò»Ì –1 :ž|;ÓÂ/ÞãÍ7&3nædŒ}‡/îMrØûñæX2ŒhZä¦Cù6 ËÁH60â2iŸ ‹ бjåòÙ“mÜA³qWï²rŸ¾à+©/§ôqpûûsÉ?ùdÒÖ|ϯ¸°O zþADD¤y‰Øáñ†á}²Èß_ýwj•˜ÍÀ“Çrïä™<Q:?Mº—WV•c&Ѩ(ua…™4Ç……§j}'±Q`¹gäµMe6îßrÎaü“yé±ë9¡eãÇÌœ6€¨_ÿÇwù%¬úb6YCœ±1¸ˆˆˆ±Ú¾d&¦#™îG  …½™¥›]àH!;Å`ëòõ”Ô;©a}ºªjo*w`&‡œÏ )Kyíýùä«Í´?q9Ñ&""ÒÜD\÷JLL ;wî %%5à:;v»Gû-]ò<ãg–Òµw'rZ%c®àËi³ÈwöሱÑÙ}|ž~îþ=¹„3z·Ä±a)Û9uLVðlÜA%ôâÜ3Ûqö °Ò•ÃÕG·%Z£hEDDšˆ ÐòºtcÉÒÅ”——\'&&–¼Îy{”¤Öc¦‘´ýs¦=>‚2;:™¶=Oà†ÿ^ΩYQ@îy0aÇý<ùún˜ìÆŒK¡eÞ@z¥9Îí×Т;ž"wЭéxêù xñææ]̰ì賋TDD¤™‹¸-#=ƒ!ƒ ¹Þž%Ó5Iìz:·>r*·Ô»o`Õ´˜¶üåšÿ2ìïµø{³lw⊙ßpy¬Õ‰‡?ΜïÁtøÆˆEwàÒéß0¶rèÜ=߆xºœ~+“O½¥Ny}Ù¸ýì³Öz±-h“Ç ‘GÒ&J½g"""ÍQDv°†ò¯;Å485þjMoâ[Í4k¯ã¨\Ç›I»VPd˜ÞåÕ/ÔY§>ÛTfÚ®}¬f°}Ú¥lX²˜ß~ýžWG0îè–zzSdO¹7óÉc·s׫)4®ÀSÀìWžâÿ¾ÉÇ­I¸›Nݶ §íDš‘ˆ Ðd¹Öñæ=—sþØÛ™º}ãK¯Í Bù2žþ뉌||!Å~3Ò×áÙÎÂÏ¿`îºÒOZ×áÚÀçS_á½¥E Ј]¼œ·þs)';ŒCç¸Û¾b›'DåÖm«pÚN¤‰¸[œRÑ]¸rÊ—\¾žBgr€°òyëÒÜ»ÄCÝø«Çm³xñ„8ZµmGÛ–‰ÞéÝÂ`Û6¡˱mË·ŽMýžÞ–jüþâ?¸÷ÓL.¼~·râŽÏ#9Œœê¶U8m'Ò\ø Ðêfï—HçBh‘ýŸwŠ6O» xð†$9*ÓÊ8Hꘊ#:ŠãŸá ÃÀÔŒ‘ÉSÀü6tômŒ9¡ ¦Aero‘™ß­^c¼DDšJJ.ý £f7™a`T¬àésÿÊÛ‡<Û×õ$Þ4ÀUÀœWåÑ×¾cÙ6­zã’›Æqz^€'¥+6óÕäyêÝy¬Øæ¤u·N°ÝÆ©¿c=›ùø¡óì·°1åF"­{ÎÅ7]Lj®I8 kfÞÊÕç°a—gj{ñwî3„–N£zûoþ`ãÖ]”OöÀS9¨Éï~ÈìåÛ02:sÄy·pÇÈ$WÖy°z ö•â)a[±Má»W1ô=ïŠ9c§2}ôî1ŽßÎÊ´ ;c€{ýtÎõ"»{Ejˆ4 Ýâ‘æÏ¶±, «ê‘l‡ïß¶åÁS5OZ¿MÇ•3âyÍÝ\ßz³_x{¯3i7ý&ÅÔÝo ž¸œfZ~ñu\šCþÂ÷™¼«l{ʳ‹ås°©íî¼¹;ñE«øìåg¹ï:'í_»•AIÒûžÆ¸»F‘žàa㜩<ðü]<Øí5î?" Gåöí.á_ÿèIlÁ|¦>2… ó²9ö’±ü{L"[¿žÄÃÿƒ½_åÆžñ˜FˆzMv„¼œ2ìv½° ±†A\f6ÑÆ,«æ½kÛÂòXµ§½ÙO)@‘æoá¿9~èøêÿnq/½v-½ê\áìsyúÕuô¼vמچ(úfmåë‘/3ë÷«Ø»v¯ŒU8›‰³6‘}ñKüglgâL†´aÅs™É7lHÈ=˜#íI¼y(ƒÛn⇿}ÎG+KØ'¤.G0¼‹oÝ^™¬ýäBÞ™·òÃS‰¯Ú~0‡Ü‹xó ²7}ÁÈ)8iÔ)–dbôã§ÏoböœMTôÈ%¦(D½L yË2*½=]»æW9ÇpÉ>®#‘§MDš¿N—ðØÍƒ½Ë 0cZÐ9ÖÄp×^­bËbV•»YÿY ™Pùªå±ˆÛT‚Õ»öú®-¿±Æ•ÊàÁÙÄV¦å1vOÏ™ªÓŶɣÿcãàbÓw/óèóï2{ùfJÌœ¥¢v”Õé™òŽ3ŒhZä¦Cù6 ËÁH60â2iŸ ‹ б°C×+‰a¤ ðVª†Øˆx)@‘æ/±=z÷ª1-À s‹X½íq®í_+a|«tœÆ¶Úë›L<¸ÃIÑÁ g,QxpY6®5¯qÃ-“)~ ãÿÞ‡L{5¯ß9žÏ‚l ¢Fú '±Q`¹}ÏL†¬×ú´I´*J]X¶M3‰ŠEŒ4Ù„—Ä:*³+9Î2V®0È:µ µž)0 Üؾ\Ñ­zÒ1úe~úf%ý{‘¸ ekç²ÜÝ….=ƒ¡YQžd:§|¾G{©]!ëµ>œ)d§|°|=%vâüE¶ò÷ß"Í™ÕFe1Ù§Ìôøâ¬,¶Ì¼™ëƒ¿ûo>{‡ioýÊ Îd²’ ¶Ìù„ïWíÂJÌÕä²yú\ûØ|üý¾ÿn«vAsÍF“Õ‹lc9Ó'Íä£9‹Y²t)kwí]ö°õZQÙ}|*f?¿'¿Ç³çðýœ¥l¯¬xgJ­¶ò8j·â4iî íKÊb.aâésÕs<{å@ʾÄ7^ϵ÷Lä_ֳ˭9~ÜyTü½±Š2;†¼1Oñ C±¾ŸÌ×_ËUwMaUfowNÂÙ {Ô¢rÏeÂ-'“2w·_ó7.¸äf·¦kN€4#a Q¯õ;RrÏ{€ £:°æõ Üpí5\ÿÄ¢óÒ+͉Q·­ÌVuÚNHiÞü]]¢¦M›VqÜqÇ5Ê`Í?þ˜Q£F5Û¡o]rD,æåüoü=|×óþsNGbC•±|)u1Ÿ3™7ÿÞÝ›³©®²EÜsÆß˜;b*3.É%¶Ö:»~§ŸœÊ‡¿¬§°"Š”Öíé=üRî¸ì0oŽ£4}út†ÞlÏÆPù9™1cF³þ¼ì ¶åÁ¬=?mõR,…mÔ^nÛVíô 5—û–ÕÜÆ¶-l«f/“aš„‘ì¾ ø+³÷5L¦á§üxçöÎùëg{Û»yå,%õ¨×=:ÞK-Ë;­z§ÞÙR vo+?m'Ò¦OŸ^u-®ï÷ÖÇÌèÑ£ÏJñ>¯\×øw)P¦1h{ɲ"'‹¹Uø=÷Œ»ŸŽ`ì5cÈKª ÍR~7S‰W_©ì§ Ó¤çÇÿ,†apò ÃĬ³Ì0LŒf3Y‡¿2×~-hùým¿Ûú{P¯î¬]µ‘b¿·rÒ.—¬ø -hšÛ·n[ùi;‘æJZCˆ,æk¿cÞÎ8޽û\6È—½Û> Ãû˸dwžquàÌÜýŠùôá=Ì ^¯¬ãµ3™_?îª}Ó."Òä¬Â¯¸ó¢ûYäw˜G G=ú6 IŠÐÞH‘¦£­!DHó¨hÍ,æ½û=ëûK‡8Ó(Vï0xfîúd¯WÖñÚ™ÌÿX¾ºAšAD"ÙâdžÿæÄ€Ë ßmW©MZCˆ,æŽzîµ5 IDAT¬S¸ûö߸qÂxF|û‡|çœ}2CrâÃükïqñXßf{´aÖÊdþÇò5á×µˆ43ŽÀ÷SE$h !b²˜ÇÐñäÛ™~ô|ño¾1™q3'3`ìƒ<|qo’Ã.PøÄë·»V&óË.×-N‘š 5„HÊbn˜D%f3ðä± 8ñF=wc&ÝË+G½Äß²÷<3wÈ âõئn&óK ¿|ÂéO.Ç9õ´ˆˆ4´sZ4Þ{)@k‘—ÅÜûÔY2Ý@‹ßeéfä„ÎÌNY÷v›º™Ì_S€¶G<ÖÞ%‘ȧ­UfÛ¾xúÍ\o^™ƒ²‰+ËgíÎŽœrZ/Rje1Ïáè\oóÑ“oäZëRFÉ!±tqÀ,æ¥KžgüÌRºöîDN«dŒÂ|9mùÎ>Ñ!#Ú›™ûéçáß“K8£wKjdæn$ÞLæÏ3}ÒL’ï«`CDD¤hÊ—m;ý1žüß$wl:]޼š£OéEJ”73ö§w¿Éco ã{{³˜§>Åã3&sÇk;p9bIkÕ›a»e1·ð˜i$mÿœiO£ ÌÆŽN¦mϸῗsjVx3s︟'_ŸÀ “ݘq)´¬ÌÌÝHwÍ¢;žË„[¶ðŸÉ“¸ýƒrnPš ‘Z4“À^Ѝ,æ¶e[µ{× ³Îƒ3s×'ƒxý²Ž×¬ƒ™3gj&jÎ$0usAiçµü™Ñç4ÎLÊ/¿— ÓdJo¶íºË½Ù¶Õ5—ænÛ•¯Uý˜bÆ00MG}ïþÔ§aÖyGå:~Ž×0½Ë–©>ÛÔ®‘ˆaFqøm¸¶O4Ñ>Ö¦“þý[0ª£“=mÏ…S¦ý±Ü‘Ju-h²tÙŸ9c8oT.OK|8_t¦ƒné“b¾8šQ2 £3ÍýçN™öÇrï äMV"2¡üz]  1h"ÒœNŽ=»#W¶Úý׿òÏWqóï6;\l*¶ð7¤ÿ}H“Ss•@©tš±pÊ´?–;lÎXFŸÔ†Îó×pí¶ *öñÓMt]  MDš9ÃGávîÿª„]5ÆvîÚîÁr»ùè£u| ìI:AŒ0‚w‘†¢MDš¿²r¯/a‡UûeÛÃyçåð—µë¸â«2ÊlÀá¤oÿL.î›@n¼ÍÖÍ»xíË|>Þ⛓¶.Gƒgr~x:ÄÛlÙROø=rÎ »oþ5$VÑà.s±`Q>OÎ-f[åA‡S¦Pë˜Niɹy±ä$9ˆÆÃ/Ÿ¯eü7.3X›äôlÁUƒ“éžh€ÛÍœoÖóÀbv°eAŠl:9lhkFçÆÐ&Á$ÊãáÏMÅÌú6ŸOj¶«á GßLÆôK / ¶n)áo·ðöŸ_¹‚¼¿oíéÀëC¼³äÕüãºöiÁ˜~‰tK6ñ”–óîûëyqƒ…ò=Ãm=0è4(›ñýlÞÿvÏï4è?¨%Wž¦mf‘»î^MzÞ–ÛûÌ—ÏkùémRÙÊû¨Ud²)ܰ“—?)¤°2sÒ¹|Pkþ¶e5®òà±Ã)SëºuI g×vžúª”¦•ïÁm¯ãßâS¹eX2%óó¿Ê…ç$a»— δÀË‚2tlG«Ûxò«rÊ££8¨wWŠ!qÚ:ÞÜfccÐqP[î;ØÁ¼¹[¹o«MÇî-¸xD[b§¯ez¾#Œ÷Ï_¸‘ K\¸l›’,Û ý l& qòËO<°ÁñŠv„÷žvXçXˆó¶ å“Ü)@‘æ¯M^¸²ÆWTq!7MÉgY®#6 ŠfÙ׫ya± — ¿9t~ÇfæóëÆ:ëÇ'0ºW›æ®á¡9å”ÛÀ79Ýâ©3unD)ÎßÅ·[ñ~koö—ð¶QD­ò`…Q¦pËm%Åü°º”2|ï›´Ž—{¢H6,~[»‹ù<ÞÞÛ»©#6ð²P àt[ ?¬*¥Ì†W–aß–QCâùèƒbŠc8`4ùó×ñðœ2JmøaM91çåpæÁñ¼÷^1åa¼yq«òË©ð½nÄ&pÁÀ æ¯cÂe”ZxXùê"Ô{Å…Ñ¡ÎÛu–´ý4iþ ¸ç‹Š|ùýl·›5.°ëdq‰Jˆ%ÛiÐfX^?Ú÷¢a`PždblÚ}ý,‡‡_Ö¹¨°|_Ô¶ÿ™<"‡A‹Ži\28…þ-œÄY6îhwœ÷ÉÔpÊ´gåöæh¬\¢Ž+–oçõµI\rZ:.+äíù…|·Åƒ(ϼ,<6¶ï8=åå|¿Áâ„ÌXZ8Š©HŠ%Çi±xµ‹²Ê2¹\ÌýÓbDV™ŽbV†ñþvey+ë*1–öQ‹×ÔØoe]$†~ϲÄðÚ#èykXáE±Ò¬(@‘毢‚e›JkAóû}å0p`ñÓçòÒ¦Ú ›ËŠ=x캗Dï—qT3îLM厓2ˆ_¶•G¿)e»ÍñǵæP›ªÄѡ˴åUÇ.7o¿½’ŸÛ§pÚ€4n•ÆÉ?®ãŸsË)qW^VÄíÌê'| oÑv/ie9ƒ½ÿî›z™Àò7Ìã=í0ê:äyd[i¶”bEDö¾[N5{7êrí*ãOINºÍæ‚rÖT°Ú÷·©¬Æ\¾Gõ\Ee¬s;èÕ1šØf¤Å¤ÅÓÞ,çí ™»±ŒåKY]£lá”ioÊNۖźUÛyúÕܵĢk¿4:Eùî Y¶GQôomâ.¬`›§ºL=Ú;«“;¢˜åÀµ½Œ­ß¹èým‹"7ÄÅÕÎMæ**ãOƒž5÷[§ƒ½gXíæy+ûõ ‰ÈÃ.)æ•….&ôËæðÑ:eN'Y±å|¶¸Œ"ËÃæ2›ŒvI H¯`vA1S~ªà±ÁÙÜeðîÚ Jœq´‹©GÀÐH*v–±‰ NœJÑï¥lpE‘Scª¹²Ðe g@BÕqib"'´7X·ÕE©#ŠÞéÌrÅ8’/ GZn£ v²¤Ø c× ÎNuóÞ§%ì´½eš:¿‚Gfs½{+ŸæC‡îœ™âbæ%Ùà öþ¿å[œÚ=ƒÓ6²'‰E»øbS1Sºxp@[þalå“ nÊ£œÄn+âÛ­¡ß3¬öyÞîáI"Í‚49€X,ý~-w”´äÂ^\×ÏÃåfÍÊ­Ì^RF‘ÇÅ×ßnç°á©\Ü»ˆŸ¿*cÕÜuÜRÚ‚‹úepC?NËbçÎRfDfzWÁv&|îäªÁÜØÝÛ×ã*w±´°2Y¯F™ÂY'àuìŽåЩôLôŽ*Ø\Äs²Æ ÑA–…ÓOd¹Mú hÅI;·•ðæ{[xu£§ªL+\Çí-Ó7“; ¶3åÍ|få{Ëôý=Ìùf3›ÉÈ㳉v¹øùÇR¾ÝTÁ2_y/êÉML —‹ï¿*fv;ä{†W×!ÎÛzœ'ù4Yº4¹éÓ§k²ô4Yz`†a`b‡ão¹aÔÎÔnÛv­D¶¦i@×ê®_9n(b“ß`F­³¤nÃ)S¨u‚Õ}°:6ÍÇæ{½rÁ–äˆá‚ Ú3|Í:®øÚ—ïζ±ØýÁÃð%œ °ÿPïoþˬ¼¡ÞÓßöá´GÝ6•}¯1'KWšˆ4k¶mMëo¹mûjør³ê|ë…Z?âØÔHîw•0Êj`ulÛºõr™é +=Š8¿£¦mvUÿÛcÖ«Ž+HÝ;6ðÕ«ŸU‚•7Ô{†Ú~OÖ‘ý‡ß-Ô‰$""ÒXÌøD®?§%y¦á§ïØæ‡wÖ±® ŽKd_ò éV“ˆˆD k×n~zgÀû¶mc¯^δ ·ºEšÝ⑈êÖ£w¿ÈþCyÐDDDD"ŒzÐDš™YWwÑ0‘&0óµŸí½ ‰43ÓP€&"²ŸÓ-N‘£MDDD$Â(@‰0 ÐDDDD"Œ4‘£MDDD$Â(@‰0 ÐDDDD"Œ4‘£MDDD$Âø ÐìÆ> ©â7@Ó,""""MG·8EDDD"Œ4‘£MDDD$Â(@‰0 ÐDDDD"Œ4‘£MDDD$Â(@‰0þg°5—€ˆˆˆHSñ?“€¡¹DDDDšŠnqŠˆˆˆDh""""FšˆˆˆH„Q€&"""a ‰ˆˆˆD¥Ù‰0J³!"""at‹SDDD$Â(@‰0 ÐDDDD"Œ4‘£MDDD$Â(@‰0 ÐDDDD"Œ4‘£MDDD$Âø Ð<«±CDDDD|üh¦©©žDDDDšŠæâ‰0ƒ&"""a ‰ˆˆˆDh""""FšˆˆˆH„Q€&"""a ‰ˆˆˆDh""""FšˆˆˆH„Q€&"""a ‰ˆˆˆDh""""FšˆˆˆH„ñ Ù¶ÝØÇ!"""">~4Ã0û8DDDDÄG·8EDDD"Œ4‘£MDDD$Â(@‰0 ÐDDDD"ŒÒlˆˆˆˆD¥Ù‰0ºÅ)"""a ‰ˆˆˆDh""""FšˆˆˆH„Q€&"""a ‰ˆˆˆDh""""FšˆˆˆH„Q€&"""aüh¶Õȇ!""""•ühšêIDDD¤É¸Å©MDDD¤©¸Åi7òaˆˆˆˆH%¿šei šˆˆˆHSñ ÙºÅ)"""ÒdühºÅ)"""ÒTüh¦©4‘¦ ͆ò׊ˆˆˆ4Eb""""FšˆˆˆH„Q€&"""a ‰ˆˆˆDh""""FšˆˆˆH„ñ?“€æâi2þg0”¨VDDD¤©è§ˆˆˆH„Q€&"""a ‰ˆˆˆDh""""FšˆˆˆH„Qš ‘£4""""F·8EDDD"Œ4‘£MDDD$Â(@‰0 ÐDDDD"Œ4‘£MDDD$Âø Ð,ËÓØÇ!"""">þ{Ð u¬‰ˆˆˆ4¿‘˜©™DDDDšŒºÊDDDD"Œ4‘£MDDD$Â(@‰0 ÐDDDD"Œÿþ{Ðl«‘CDDDD*ùσf:û8DDDDÄGcÐDDDD"Œ4‘£MDDD$Â(@‰0 ÐDDDD"Œ4‘ã7@³•¨VDDD¤Éø Ð ÃhìãÝâ‰0 ÐDDDD"Œ4‘£M¤‰oêC9`5æ5ØÙhï$"{màÀ¼ûî»”””èik‘FÏ€íAJ¿š.ü"‘)++‹6mÚ4õaˆˆ3Ë…ßMi6D"ÏŒ3šúDD„ÆéÈÒ-N‘f`øðáM}""RþîÌR€&Ò ¨W[DäÀ¢§8EDDD"Œ4‘£MDDD$Â(@‰0zH@¤p¹],\´m…Ûšìò:çѾ]û€Ë#áR¨ò6¶ý­~4Úç'ý¡ëÚ M¤˜ÿË|Úç´çˆÃh’':mÛfîÏsÙ°qYm²ü®ÓÔÇØÂ)ocÛŸê÷@s }~Ùê¡1¯ ÐDš;wÐ>§=.·«Ifú0M“>½úðãœi gScC §¼mªßÍöù d¨‡Æ¼6˜êÉÚgo("õcÛ6–Õ4ŸM˲À­)±!…[ÞÆ¶¿Ôïæ@ûü²?ÔCc^ü÷ E`Ô*"M¿¢¢¢HOË «Mö>ùueÛvd_´hÇØœ…ªßÒÒRþøc9k×®¡¼¼<ä¾2Ò3èÓ·ééé }¨Rúüx©¼ I³°qÓÊÊJéÕ£111M}8~•——³rõ*6lü“쬶 ¾ÿ¦¼ha½÷þra ·¼-Týnß¶²ÒRŽ?ö’’’©ü`cãû_åŽ(//gÙòe,[¶”¼.yDíØFéÊUÄwÌ%¾}G ‡cŸ—ç@q }~Ùê¡1¯  -Z´(âÆzHd)ض•^=zÛÔ‡Pll,:æ²hñ¢}Ò‹fÛ¶÷‹¶ XXauë7å16¤pËÛØBÕoyE9Ñ11$&%árW`YVÕ6vå¿}å´i“…ÛífÉ7Ÿ‘ôñGØËWbvèHûn$)¯èºÜ ´ÏO ûC=4æµ!"´H”%r¸\®ˆí9«)&&fŸÝ‚mò_•á^X÷—Ïs#TýÚ¶YT˜¦‰eû¾P ïèfl‹ŠŠ ’’èÝŠUg¾ÚvîÁºù?±êñ‡éõÄD S¹ÌL¤|~Üù|ýüd~Ì:¿ŸÔŽ˜ÆŽÁ›¢<ÛùéÿciÖ)Œ:8çÞ–ù@ Ð*Ù¶M~A>;Švàv»÷h[§ÃIJr ™™†±WûÚŸÕ­§úhÈv’=Ó”Áa‡×^ûK€ny[¨ ¼·aLÓä×E¿â±<5ïmzÿiCEE9í²2ùs΋ôÚææS´jÎ]¥lúôlËjž=hV)–üÊŸ‰=8¨CŽP¯W¬ä¥›þÅw½þÁc—t%ÞÜ7eŽ˜Ï§Å_Ï‚#Fx{XC•7P½ÕS“Ôƒkß¾þ& N8Š3§ã¨Ûæ”íQëÚQÚÖm[q{ÜsÔ1$'%ïÑøÎ¢ü0çò òiÙ¢å^íkV·žê£!ÛIÂôW¥kÓ®¾†×sîdÊmýH¬ºèºøãù«ùû'=¸ò8zÇ›Ôç“``„uË!è1Z;øæþ˜ðýVÜ6àH EV¹ýŽaäÈcè™U¯cÛÂ-oc ÙƒæûÃ401èÞ£[ÕmN¨¾½iY6ëV.á—¢GûLrÝìôØ,œ»ˆí®Rrn¿ ß—¤UÀ7^Ê¿[ÔM|ÐeÜ$=®ÅÞ÷H4¤²L¹û^–ø/OåÄSõQô:1´h݆¬Œ8LöM€QŸŸÊs êvwˆõÖÛžk˜z|>fŸû_ž97‡èºÇè;ç½»n›ïAóÚà7@3̦Z¸³cŽ<†Ô”Ô=Þ6%9…!ƒ†ðé—Ÿ’™‘¹WûÚŸÕ­§ú® ÙN œÃô¢e[Xå»ðV-ÛÇãÁ¶êÛ rùÞ£‹[¶âÊ:ÛþÖ—øÒml\¿‚?x–ßy›“ÇßÇeý“#âË>Üò6¶pnq‚7G“a˜íÂòxªÇ¡ÙÞ<—åE)^ñ=Û&Ò>~3FéVvQHaÿd2þz%Ù§ŽÆöFhÞ/7Oö™Ü~Y’• d’“ŒI_òÉö·óïv¨×m8þ¦{9Î0÷YY"êóSc÷ahê­¦ŸqmZâð׆U/øÊ°[›‡_ÆÆ¼6DTšÛí&99¹ÞÛ§¤¤TÝrÛÛ}íÏjÖS}4d;E»ŒüÕ«)Lè@§–±øuÎ:ûX¨‹–wIÝ_ÅÕÛ¶±Ý[ùö¹ÿ2íÇUl(Ø…+*™ìn3bÌÛ)G€‹{C]X±mHê@ï>½IuÀ‘œxÚpÞ¾ó&þïgèõÄõщaídñ;“™ôö\~ß™]rÚ%c9­G2£”_¹œÛÍ£O_Dç£d!÷ÏúóžäÑ“[eXlûüN.z*šŸ»¦?Á´9kؼ­—Of—AŒ¼b,ÇwJð[ææ U6¼i˜”—xƒóÊA×6”îÊgÃO¯’›î!'©§k¶²¢0ŠŠþgÕ÷0̘øê÷©üÿ¤zöîåk7Ãð}k/À³¹S'2åë%¬Ý²‹ âéõÃüë“Ùgê«Ù¼½q´îóÎb2ÿ“¯øiU!FZ¸œq§tñ}»ùóû¹sê6•X8“²éÒÅü}T2œFÕñ®}y§Mñk¯[^âþƒ¼>xÓ®¾OÜËs—ækðõ³15Øùb³ìÙôö~û³;6™Ìì®;î:ÎÉÝíÎp£~\ÛY0k“ßù‰…2óåœ+þʱ¹ 8ê+6Æú»ÕÛaI˜î ÛíÅç*d=@ÀóѰml×V~xu"/ú « £hÙ9vؘ•½†®5L¹ªf›)c=Û²!DT€ ›W½3ûÎ~U·V)›V¯dk»lr3cñ{Ÿ œuö±°.ZUëUý—¯[ß÷ºg+~ZĦÖg1îo‰-YÏOïÍä‰ëWPôß{8«}ŒÿâVXã.Â"«^40cr8áÒ™uýÿx}öV9)uÓïä–Ww1pÔnÏ5XõÙ+Lºõ.J»ŸÑ¹1tÒóóÅ,+tÓ©¥“Š XºËͶŸÖPrbK’ÍRVÏ[ÕþBºÆ•òÑü%ä·9›¿_Ù™¸]ëø~æ4žú—ƒìg¯ OÂî·}Ã-ocÛ“4€öíÛcÙÕOoºËw±àýè”iÐ!©‚(W·ðëºR:1å©`FÕ~Êv³-ÜžÊÚ2 ¦‰M«B´—áÙÉ’oæ°6cWÿ­)V fnk#«æ/!?k$×ý=˜í‹™õÜ[<½°CGâºÑñlÿa:ÿ7ùÒº=Áßòb1 ƒ”ùèÚ“HK°Ø2ÏL˜g;=Å-ƒSpøŽ7󤛸í/­ˆ6 âZÇUݘò÷ºåñà®ì=ñ{)àùâaÍÌ;¹~j>=OÍgbnùž‰¿aÑ– FvŒÙí\ã~~RY=ý.n;Ž“ÇÜÀØV%ü4c"OüÓ ÍÓ£OLe{Vhåül}g z+cy°í’õþ\íy=ÔXf—²xòmÜýžÍà‘c9§S4Û–|ÁŒß!®æmþšm윩ó&ymˆ¸-”­[)))!§]NSŠø1eÚK´kÛŽ#‡ÝdAœ]¶9ßüÂÖÄî9¸‰áܱçGQwªØv°ëü;àzÞ‹Q\NÜ•Xc CwÁ¼úŸLe1'ÜÜ¿Æøµ¬ðÆæ„¯~¼•Ög?ÌÍç´'Æ4 _KÖ|±…võöµÛÜ÷¦-B³ Ðò·æSX¸ÔT+‹Tm³Û1wÞÜn7Ç ÞAšEÑú?È·P¸‚U;ÚÒ+Ý1ƒÏ÷F½oqÚ5_¯Ý3‚a`&tâ°î±¼¿rù®~$Dï¾ûI0YÕS·—Ï»Ì2¼ÿ_±e)kÊé9 51•çOL{Æóú’ßÙR1Ä”îÚÞ͌٫(ØŽ%?l¡ý™gõÎ×ÌÛPA^ô/ÌßžÉà¾é8Ù¼[™£[v¤…ñ [vºýŽ9i®‰jkõ­½{÷ƶm<7 Þˆv™1tIÞŽQº…µ› ø}«AÏ‘Ùé`œÎèª}øíAk?’».ë[5æÇˆN£}”kcèöJ2w?ïð{>:Ik—ŠQQHa…oYL:Ù)°t{ ËÂ6=äÏ}“ɯ}ÆÏ« (3ãp”Y8w–á®q^TvtW÷"û½FÔà3Ró|qmùÕ¥ñô9$‡¸Êò5wQÿó©a>?ËX_îfãS—sÆÓFõrË"&¿OW_tâ{¯Šüe¬ ¶~gÛo½…ÜÎŽÛíºÛ õÐaÿº²I¾”†3‰¶1îMËY_‘L¿¾-‰ª‘r¦úØkÍ+תsnøqÀ%ª GþÖ|¶oßNjj -22›úp$€£Ž<ÇÍü?4~æÞΊ5%¤v@›?ç±le>]RÛ[óžƒUÊæ?óûú­ì¬0ˆOI®°1ì=\§‘½hÑ$ECÅŽ"\–Mu¼›]ù¥›D´YãË£ÖEÞÆá4Áöà±ü_˜vûÒ®Ï1Ö¸(Öý‚©Ø´„õ.›ÌÜtœ5¾àª¿ìl߯qß¶f܆ÉÍfÕ¶2¾Z•Ê¿JòüY|°`GGÍæÏäþ ÉŠòÿÅfÆàÄÂU•ȵ~åml¡Ç yÿ¯²mÇŽx<Š·®À*ÙL»e].Åë{IDAT¥[X±>ŸeÛÈ>ä 2rãpFWNí:=•ÿŽoCç®y¤VõH†M…m…l/+PpáçuG´ƒ o0f›`;ˆv€íö>ãZÿ.÷Ü÷ÅG\ÄõíFšý'<üß×­»NÛy½ö1?_, 7Fuym»òÏÿ óFýüxÜxˆeÀ•wñ×¼Øc¨ b3’q°½ö¹ëoò[o¡·ÛýZÒ õךÜN«ÏGÃû|eïu°ª-ëÞÖݽÍý•ÑïÛ7ⵡYh………¾ž³2[´Ü¿Æ?íg Ãà˜aØ¿àgÒÒÒ9¨ÿ€Fj3›²ül¢eeÛ’e V²±´ªÆyؾôæ­µÈÌíIçd“ŠÂõ,ßAÜ7á¬Óø‚^´Ìdrrâ±çþÀ’C8$ÍÛkh—®föoŘ­;‘á°Áòs‘wmâçeÅ8[w$Íá?@Ûýözc/ïš_0vù:ÞŸô>[âqÁÁÄÆv¡]Ô,ÏßHy\b\˜·¤˜¨ìÎd8m°d~4íf¾ÏŸäó[|FµiIü¡­xáËÏøµ¤q)9Ñ€g÷2×ïï‚ny[¸cÐ*áv»XôólR¶­a—Ãͪ-›Øfäsø…ĵì‰Ó01|ß°þzZ«Ú ›šÝE¶ ÎŒ0ÚËOTî»îëÕMã;Žª Èûße.dµ§=—Œ:–­œžDÚ'Á÷•miF“%…¥¸- geäèõÝŽ!øùâLëHKãm~_¼WvDש÷½9ŸâóãÌ%ÛQÎÚ56-iG¼iÔêɲ+|˜o0âHëb}ÿõr;?åhðz¨y>ú^w¶È£]Ô,~³–ÒyÞ¼vuÛ§n:7ühÌkƒß-ò~9VV¨¡à¬¨üõò×~C³Jذ²€¨6CÈpš83ri=›Uî¤]—TœØ[ø}})qç ÎI8 »E<;7°µòsÆ:M!x}ÆÐuÄiä~ý*üóIÎ>ñ ÚE²èÓ7øpk:']ÛŸÔ¿ø·Ï~WÛ¥Gº‹•_¿ÆÌ éœtuO’ŒÀŸc·{xŒ•¯ï\ͯ¿$[¾ÍëW0磘¿µ%'Üq)‡¥;0Œ>œwZ6׿ñ DŸÃ_:Àª/§óúÆ,κ¾‰¾÷1[ ḯ0鵟iqêÙ´r=d(­§¾Âÿ<-yM[¢k”¹ú×sÍžÿZ¸åml{r‹ cÇŽlÝü'KþØÈ¶[(ï›FVÑôê~ éízFU=†Yµ»j~¾Üê¼iBxíU· *÷í¯m¨ñZÝ*ªe­ywg¼OâÐndŰ¡Ä»ÛÆvdнc4o9“YyÇÑíìÊÄQ]¼ž¨wÅÿùBr_Î>:™Íx˜§âFqT¶Á†Ÿ>cmÓ}/ϧ†øü˜FFŸØ’[Þy€{³8¾O+bË·±¡¨-Æç‘d&Ð2 ~ù–yëÚ0¤]ˆõÕg×PÛù/oƒÕCÑZ/\Xk̬ÛŠ.{sþí¸næ}Œ·FqRÿ,âË–±®¤FûÖmã€eLöû4jc]üçA‹° (55 —‹ÂÂBZf*Ái$ûü‹OùyþOôëÛ¿{ÏÀ³k=«wÅÑ®ïCåL¡}ÛxÖ¬[ÇŽÜ2œVÙŠ­(Z´HÀá;.èýPf8ë4…P_ÎQíNaüý ¼<å>zá;¶[I´îЗ þu!§v÷=‘äýâ5cŠYðÖDÞÚê!¹mwθe,çt­\g÷}7H‚IÛABFæò·yàî·ÁŒ#£M9.âžÃèÙ"Æ—“(šŽ#ïäxñýIÜSûqÁ¿/âÔܘêc4[0xxg&­(dèáÙDfæ`†µŸÆ îa må}äÞ® 6êôÒÔì©©gy[¸·8+ÍŸ?Ÿ5+~cÛ–u´íõìNÝè2ôâRê¨Võ—Žïž]­[€•¯ù Ч½voƒÊ}ïÖ6UE©ÝƒVY~gÛ“¸é²|žžùY@TB º¶‰÷öÉ ó7Ž{l3½ŸŠ¸ô?»3‡åµóÿzǺÇâ|!¾ßÁ5QÏóê«ðyy<­Û§NsïΧ†ùüÄÒõü»¹;å%¦~:“GÞ-ŠM¡ýàó9xX£28ü‚Sùî©yñƒ!ô›býÀõt;?¹ˆ¦|çÏú·˜0~Víe™§óÈãç{Ö]Ü—<—ß{‡ßÛ‰ÇCr‹®’çÿš`*cÒnOä6æµÁßwNÔ´iÓ*Ž;î¸FùbýøãéÞ½;†aðÛòß9bdÀ÷Ý’¿…ÂÂBÒÒRÉ …~Æ3èÖ¹KÿXt_ºÊzªOýk§/¿ú‚¹ó~¤oŸ~üå˜c1ÌåWóý—,YÂðáÁǪý¼`C ²Ž‡í‹¿ä»µeu¦§±±ÿ¿½{nâ>ðþý­$Ë2ÆOlù… öB0ÆÐ$—w\ބ䮹&nš4Ié͵×éMï2—Iš4Ók;××\“ÌÝLÒkÓ$Ðk“¦›ä ¯2(„ ¯`° c,˲öwhW’¥•%Ù»’¬ý~˜y¿ý­výÕo»+¨ëº]5EP‡ã·ÛûPqÕ èÐ/}‚ý¿Ý¦•¸nn)p1õ8Éî;vî@g‡¹Átë›[±òš•Ž¥xΧŒÞ!<Üâ ¡D«$xÏþÃýx½ó<~o[äj:%vŠÖºrèÈ!,éXb¸né”Qªá~Dºð|„’øTFn½ñjÂb¥Š (JôwR A…GÌ7k©† ¡@‰¼'¡†T@qÞ5<õͶtê÷£' ª!¬\q„ƒªŠ±PÅ Åá€Ó©/UJì~gFFGÐ2§uÜ:Õi¼TÛ+q$y_ߦŽèíO–/ãoÈþ EŸCªß9^ÛEÛÎÆïÇ—!ÏKäáóöý_»ÿmüñw¿»[Ý ŸÓÜí?ˆ9ˆ˜:–á«uc×y¢ñ“Ögªé¬ª‡P´·F,^‘P.„û¨‰˜rmã$ë˜é:¤²eËtwwák‹‡µárÌÏ~#Ó¢š®¦:Üÿlxx8×E¡$N|Ô‡®%Kñ'×Ý4œYbìï`Fk:fGV2€Sï¿‹ã}g¨ò¡¸d¼JÏ\ÄXy9\û–#qr%SÆú)昩ƷX(qà‰fÒÿÆ8aEìÑq,AhëSŠ„‘³˜ß %ñ‘=BÑÚ1Ü%É<3[ßlKV¿RJ„TzÇg!\. nƒ)´æ2(Ñ®<ª„ÔþxGG5¨SƒùM¸½ ¶ñûÚ6ýL$,?~YÑ:ˆL2n?ˆ–Åðýø2Løy âä¶-دÔÂWî†ú°ýÅÿÅéÚ±¼Ö5þôpt)Iê,‘¹ûÏø3bãëG‰{/ÕøÆõ™jºqÅ4­ŒÃ“6¡¶”ÄrÅ'¶qÒu7‡4×`ê¦U@€ê*^Á™Ïîºón䢯àè`/N•¢½¡åãn<ª¢¨¾=öáL M%UøTK)¶õ¼ƒÝ² -U^8Bçq1„èAÕ•Æ89þ¶>Õèsˆô4Êhª”ã™RÆÜË×u˜¨~%$‡‚‘áaøý~x<žH_P}ÔÖ_#û©Fü#ðûýp8P¥„’ËK–ó™:ŒSîį·õ``X…R\ŽÆ+nÂý_X‹¹ÀèÓc·ý'™B¨4š¶ôoeY%G0Ðw!o;jKâ›ú”ÔÖ£ôÈ!ôžñ£¡yfν׸áPïQìé…ª8PT< µ^§öÜ‘Æ8ÙgÊEÎFtÿÇ3¸Ú©4ç>‘3ÅνÓHºë›mÕ¯”^¯C.à7_˸[UUE Îç‹Ì ˆRtÞó0žüBlKvšÑ°%Ë~ûO2…PÙ<6äU@s:œBYYÙ¤¦Šô¯˜ê¼ Yl=M†™ÛÉ¢õËVÃã \O ®]݂ȵ7J*š®Ä§ãç³Û¥3N–™vÐJvªi¢ek§ÀÆB?C5Ÿ¬™Hw}³-Uýz<Ô74`ÄïGH ¥ý]_p(¸‹ÝðxfD–EIh­ãŽIÂ`¿ý'™B¨‡lò* •Í,ÃïvÿË—-ÏøÿÐÐvìÚ²Ò2!¦4¯B_O“aæv2Í„Á)±¯Šñ{“'{ryÐ’Ÿ …B—ÇÖL¤»¾Ù–ª~¼^/¼^ï”—Cæ±Ûþ“L!ÔC6 yЪ+«108€×Þz-òü¸t9N”•–¡ª¢jÊó*dñõ4fn'ÊL.d¸yÊqóôÀš‰LÖ7Û ¡~íÆnûO2…PÙ<6äU@B ¦ªÕ“|”Sl‹ÌTçUȦÚreæv¢ô©jøÖ99p‰ðòSšÎiÍ”æúf[ÁÔ¯ÝØmÿI¦ê!‹Ç†œ}Š‹‹Þ3ó8Àu̪[·ÛèkféLœ=w•å•9+ñÞchð5$ÝîùPF3¥Zßl+´úµ»í?ÉB=dëØó€6þ|ꉈˆÈ&‚cAìÛ¿çΟËuQ¦½öyíhnl¶lþ hDDD6±gï475c劕|¶ñH)±û½Ýø¸ÿcøê|–,ƒˆˆÈ&. ]@sS3‚cAH)s]œiKQ,Z¸;wíD]m%a—ˆˆÈF¤”PU5×ŘÖTU$,m…d@#""²¶ž™Àâ*d@#""²)%𠬮C4"""a@3‡´¸ ˆˆÈF¤”Peû  `ÛO~‚¾Ïákkឆ“ imÁЈˆˆl$ç-h¡óø`ÛÛøýÊ¿‚ªªÊ4Lhû ‘y²Ђƒxï¥g°ñý8râFÌnëÄ Ÿ½w.VµV<©•ÅÚ¢XA@°™Çê€&ýâÙþŽãV­Æ]·6¡Ð{à> ŒdÓ5 IH¶ ‘y, hr‡7üŽV`ÍcßÁºŽ™pi÷ »öOÿR(P‚çõ‘£M›žÆS/ïÆá3@uÛRÜòÅu¸eÁL8Dx¾}[ÿ?Þ° Ï ÝÕX¾î<°ºE@ðüþ¥§ðô¦wÑsÞêökpÇ—ïÁŸ·ÎOo2jnú ñê""¢Âdi@»|/¾ú¸–ÞÛFÃ@=”… ¢•eÇ7>„õ.aéí÷áÁVã¯?§xþ}Ý­n„Nn· %·~ /«…óÂi\j,ƒRptãÃxðåÜtß?aÝìa¼û‹ÿ¿!P÷äßbQ©¦G)Ü´ ñù\DDD…ÉÊ€ºÐ‡¾a‰ÙW4À«$ið‰¼.‡zq/žyáªný.þùöV”(Ë7!ðÕõøå³{±æÁ¥p à‚êÁ§/Ã’^(˜H õÒ^üü¥~´¯{÷þY5\˜_=ˆ]_yÿ×s7.òÀìë„Ê>hDDDd"UU- R AJ@("ÚR–0’–Ñ´ 8:p}/vÕ­7¹}Xz…¿:pgF»ÐÚr#nëØŽ§¿ñU[y#nYûX1¯ NŒÁG1ô?ñeüõ“ÚôÚã¬Ü~„d‰é-hÖ_hÁ€FDDd#V¶ )¥>ÔºöþþÐl8:€Åµ I)¡"|Æ0êdø4¢>Ž»kzKö¼—ý|ÿ_~ƒÍw<ŠGÿf.œ¡1„PŒ®¯<„{ÚKƵ–¹+Ká€ù"d# )–ΈˆˆòŠ”Rµh(™5×–Á¿ýyl>:ŒPÈx<@Ž©ª„³bš\—pà½~ôqýxçÀe¸êç¡Ò!UŠ KÖàïý¾¹ÊƒÃ›_ÅÑaʬøœè•¨nh@cc#š´a¶ÇaÉzêK·[ЈˆˆlÄÚÛlxpe÷—pýžïáùõëqôæUXÖæÃ,åN?‚~ß͸oÅ Ô”ƒ{߯»'ëpuÃ"ܹ¶ÿøâ÷ð÷XÕ ô¾µ/ôûpÛׯ„@ðÌ.¼ºGECSJ‚g°ïÄe¨žrx@”uâs7Ö`ýæÇ¿)·aõ•5(=‡þ‹¸~UJ-¸ŒS»ÜÁôùÆb@#""²«ïƒ¦ÌêÂßÿðÛX¸ñðÊîMøÏMCÁ…2_;®ºi A¥+îZ‹·ŸØ‚Ÿ¾r5±s>û+ù~úÊSøÖ PÑÒÏ?rÖ¶º! 1zî(¶ÿê @ÂÊyWcÝ×oF“ €,Fû翉ÇÊ~†Ÿ¿þKüpóE¨Åeh^v'®º~¼œ+”Ú?+ÅJ×sÏ=7ºzõj^ÍIDDT@¶¾¹+>½Á± åË’ªéW |› ¡„ûˆEžª@Ñ:I©Fî‹&´q#1D?:«¸ßG¦×—' „ˆÌÛlЧ¾ÃÆ’Ž%å¥-[¶ »»û3ü†µárÌÏ~#lA#""²‘¬=‹SÄߺKÆ„,%Rí-x%Ž«?>ÅwþO»<«ÖS… aþÝÕÆa@#""²‘œ?,½@! X„ˆˆÈFdäô"M–RHKO3 Ù [ЦFXºT­«G4"""ÑOË1¤M×£Ói]Œb@#""²‰™¥3qöÜYT–Wæº(ÓÞ±Þchð5XvÇ Ã€ÆTMDDTx:;:±ïý}è9ÖÃ[iM”msÛà«óY¶ ÀfåU DDD”E®"t-îÊu1 B:÷ä©^ žBUÅl4ÖÍñígñ'‘°å,{O# a`ð4jç “ªçÃÒ‰ˆˆˆ,PUQEQPUQ“Q8Ø‚FDDDd‰Æº91-g™%4ã€ÆÖO"""¢ŒÄ÷9;yªoÒ}Ð OqZý|)"""¢BÛçLÊÄÿg‚}ЈˆˆˆLßçŒ}Јˆˆˆr,¾Ï™ù}ЈˆˆˆhB©úœ™Þˆˆˆˆ&–ªÏû eYª>gìƒFDDD”e©úœ±QÖ‰¸–±TÿO_Ò€¶uëÖÉÍ‘ˆˆˆˆ Épg´ €1mPµAjƒa{›€@1€’˜Wýçbí÷.+W€ˆˆˆ¨Œhƒ_Fb^ÉZÐ$ÂI.„pº p è¤ö>¥o á€0ŠhkšÞ’&ãSœzóšªMàÐ&Ž g¡$ÓQrzÃ×(Â!-ötgä4g²¥·ž…`ÎôàFDDDDéÓ³•>è­hzîRôZÐŒÂY¼‡Q¦ô|¥“jA‹ g±}Ò0 eJ¿bSÏT±¯µ é?;0>œMòÎDDDD¶¥çªØ û:a šÄøûqD[Ôb""""JŸŒT$殤!K¤ùJDDDD™‘©^ÿ´ 95µ¥§‰IEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_design_translations.png0000644000175000017500000022740412235000130026404 0ustar00murraycmurrayc00000000000000‰PNG  IHDR5 }˜°sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwxÕÀáß™íé’@ „Ý‚ (V@Að*,€R,`ïõª`W¤( ‚È¥)**Šb¡w¤'´„’JÊfwgÎýc“²itð¼ûDvwæ”-óíwΙEQEQEQEQEQEQEQEQEQJÕÜ_Ý_EQEQ”SAV÷×ìc#±lÙ2Ãívãv»ÉËË#==“É„¦i¾K‘ÒçýŠ¢(Š¢(¾á;?bº®J@@‹‹ÅBûöíð00Êý•¾‚œN'.—‹ÔÔT’’’èܹ3‡£Ò (Š¢(Šòï”’’Â_ýÅå—_~Ââ„ÂÂBöîÝËÎ;©_¿>6› ÀŽ7ˆ1½Ü_ƒÊ25………¤¥¥Ñ³gOJPEQEQÊB ëú jÌf3qqqDDDðçŸàÀÄxJýE% |fjòòòHJJ*Ð(Š¢(Š¢ø"„ÀívŸð³ÙLtt4éééàÍÔxàæèüÞ’!)Ÿ™šÌÌL®ºê*•™QEQ¥ZB<ÏI™¦ή]»À›©qS1 1Šþí;ScµZñóóÃ0Œ^9EQEQÎ-'+SS¼o«Õ Þ ÆDŀƄw8ÊçDa!„PYEQEQjädfj€âÕ×vÊ4:eçÖøÎÔ€wR° lE©5=‹MKgMò¢®éMçH‹:±•¢œãŠƒš“Ì^ô·8 ñÝ4Š‚Ÿ™@ =)Šrlœ;™ñþg,+ äÚö7Ò¹¾¤&?ŒÂlÒöe`ŽŠ#Ü~4 ’y›øüÕQ,8Ô˜¾Ï>F¯X› ’å £iZ•AMñyîÊÇ•Ý_ e7Þ€¦8¨©:S£ÎK£(g(™Í/OdôfƒJ¿ †2ù¿WSÏtê?ÇRÞL¯&Рò:??k O x z·ð}c,%éY›ùcS&¹ú –¦8¹!ÖvRë®(Jí !* L4M£E‹hšÆŽ;ÈÉÉ ((ˆøøx Ã`Æ èº^]1¼ÁŒï<š2 Trò=Pç¤Q”3ZQÀ :F%U³ÉŠÙ¢nÔ(SrBëVB ‘T÷u"¥ŽË00 f3YÒ.SýkqŸ›¿ŽÄÑå⺘…weVå´¨j.®ÛíF×uL&ñññlß¾€øøø’`èDM2®4¨1 £ÒË"(ŠrºqéKÓ¹Ìbâå³üÅþ<»¼ÙúYf½zAšý ¿Lzƒ9ýÃîƒYä{ÀÝ^» }æë¼·x;su°Ýô2nx+—F;Ð\»™÷ñx¾ß°›´Ì<\ÒBPTzâÎËbðÓÍc~dÝžl\º“Ì”õ,øðqž·‡BÉÉiƒ¢(>5Å ŒÊßL& ,@J‰Åb) `,X€ÉdªtûÚÄ#jõ“¢œõ$Æw¤wÈÇáºQãždÇpI,6ˆú sï×på!÷à^}l2Ûö,矼[‰³‚wÀ*„ëÞÏð&‡˜1ü~&¥¤³tÉ>îi‘™Ì~—!3dÔ[ÜmEztL6 we†»¼ß%6š©¼ÌXdÑFQÜöú‡ôµx4<ÊÒûèé0aÞ~tÝF›/ñT¯x²ç=ËЉ[Ø:ýK6^óm9Î68=§vÈNQÎrUejÀ{½âÇKÏÙ «vÛÚ¨rø©8ºRåì&4 éqc…ù9¬™ùïÏ^Gº¤Ä0$’<Òó%š­Üv"„f °;›¬ýÙxL¶ˆóiñ?æ¦îbܰ»ùùânüçæžtŠõóþ5²YûÕû•—éOÑ4?0i7ºô.m(Ïu`)ºDÚÚr˵-5yèt ‰·òs'3á¼Ð“ÐEQ|*©©LHHM›6­°ô»C‡üóÏ?deeº¨L¢œÊ|R‹S¶ås †7{S°þ3Þøz-GdCºÞÑ‹V~)üoì|vêà,Êg}Ž`,ú2öDîþï«ÄΞÅWß®bÛÒ¯xëåìyk$}"+fò×O¬¦L­h‹Ž®{/ãrôë§ìþ¤^*o# Ü£Ôù¸¤ˆãmCc»šS£(5$„@Ó´*W?%$$”<§xªG%slV¬XQ“ÕOÕªô‰aUŽo©›º©Ût+óé=z?î÷½gùÒ€˜®Ü~c®é| KÛ•'ݹdË•w<ŸÏÿËMiìâ·5Y€ÀfÈ%--¿Fe K Á€ƒ¬ßyÃn7†vØ"š-¢p-³¾ÿ‡LW)¿|Ï6)‘¶X’Â-¥&k΀×TÝÔí,¹UΩñxVåL# ̀âa’Nró=H$†¡ap`Ñ4ô‚<œEóQ¤”hf+V«S™^¸ péå¶óèH‹þ6sÑþÝ‚ÝfÁ¤ÌSH· §K÷˜°ÚlX-ž‚< =Qi™Nøì[–¥dáÒì„6¾œá/áb»úÊ\ÖŽ‰7+)ó¨ý|>ô&¦ n“ÞëEC÷V¦}ü%’×úF$92‡MßLd¼¿Ù´ÏI@tS.»i¯jŒ¿IÀñ¶!Ô¬æ)Š¢(J)'uNÐL˜LÞÛÑì…VrŸIßÏâù²aÏaŽj˜…N®'„³ޤr ÀL@ -?ƒäU³yíåYìpJ¤û«–nd×Á &Y@ÆžuÌõ c7äaH02çÍ‘ÓømW:~¡„ ²Ór±[+i²¨¦ÌROµLD=¿’¨Ði gI'ÿLzœc~`ÍîL õÒ“×2çá<:{7N œŒ6(Š¢(Ê¿Øi_ýä×L÷QždGwK¬6 òÁ‰,¼ßEnv¹‡~c䣓ٶg2ûÐ$Ø»ÓýÍ O8ÄŒïgbJ:¿ý¼“Á-[bÎLaŸËÀñ õ7EÛ‘šMCäûª‰–U”Ù¸$»Ém¯èS#4LšwÙ=éKødö<º•6^âéžñdÍ–a·°eêdVw}–æãlÃÉ|QEQå,ä3¨‘5]t Mä™±Ø#›•Óßâ­k8,)1 Iùdp¹íl‘´i»³ÈÚŸ pD^HÇú3ùzÿNÆ ÀâK{pkŸ›¸¬Q%0²YSU™%A@eš* , S×±K—H[[n½¶õ&ê^ݦ“¶²É¹‹õ]\uÚ (Š¢(ÿb>Ç1„8½y€üuãxåËÕ0ruÿa<<¤M•L,6áõÎ{‘†áhÎàwÞbD¯óˆ4aë’éŒö“·T˜è[“2…E%ñxdÕËÀK=VÒ—%}*AúêßZ¶á¬™a­(Š¢(§Æ89C';%…\)!¶ }oìF·k:k¯:Ъ‡¹sÉÑâé1äe&MƒÞõÒØÉ/ËàÆ„Í OjZF ÊÖ`B,ذ+0<Ÿ’-²%±š@®å«ï7“ér’üÓ7l•i¥y˜ïI¾µkƒ¢(Š¢(¥ö95™¨Ó¤)Áì$#ùS†þ…FuœlÏ7jµü»pÇT†=ú-9õ¨çWHjšÄBT\f‹¤(øu››U£†ñŠÿx¯¦L[#.M²²tµ“uoßEϱVt¿«y{ì’Ê•­Õ»Œ{®ŸÉˆ9©¬úôqnùL ¥w9x£[úsA†pgjÑŠ¢(ŠòopfjÀÞ|¯½†õ¬ä§mgãæ=¸l!4lÙšF•Ïe)M—~D‡;pg`ÏÞ,Ìuâé|ç <Ú¡&K}®{øA®kŠ;õ‚-8’ª)ÓJ營¤ÏÑ›u ޏq ܺ…-Žbô€Ëiî@êÑŒ.CG1ú¶x5<‘M•mP3…EQ¥ _‡FË´iÓ\]ºt9¡sk¤¡{ç¯òÞ‹¡{³!B3•9i”FÑéÒµhš†ð±]q&¤dÿR5øhS…&ÐJÍm1 ïã¥÷Qy™ÅÛÈ£©«¨O…6á—#*o{íÛ (Š¢(ç¾~ø>}úÜùE·¼Rÿ_8OÙ(†ÐL˜*Þ‹fªx/€Â÷C>·B£Ì]B U¾ï>´Šû¨ršÏ,‹ïvœü6(Š¢(ŠRìŒ~REQE©-Ô(Š¢(ŠrNPA¢(Š¢(çÔ(Š¢(ŠrNPA¢(Š¢(çÔ(Š¢(ŠrNPA¢(Š¢(çu¶}EQ常=nÖ­_GFVÆé®Šr†Jl’HltìI/G5Š¢(ÊqY½v5±1±\ÚéÒz&zåÜ ¥dùªåìOÝOTdÔI-K5Ê¿‹ç¿~6¿¢ú1¢{4¶Ú|ÿY¬›?›åAÝèyÖmëdÇ73Yw×'ù×ìÒ3Y1wÿDõä¶‹êb>Óëë‹t’¼xÕ½ž›[Ÿù}~ÈÎÉ&6&·Ç}ô22ŠRDÓ4Z·lÍßËþ&²~äI |ÕœåßÅÈfãoKY³ß‰!%¸v2qx_ßL¾QÍ—±'‹óþÇ÷›sÐkøÅíÜ6“WÆ,dc¶§VW™¯Rù:ìß°œeɹøº¾j­xÒøýë¯Y´ýöu¬õ8‘õ/R°ëW>{ã3VæœÀ~Wª$eñõô¤º©[™›a 9%Y¼3"SãÎXËœÉÓøfÙ6öf»°†Óì"n¸ûºÄ9ξÈË•ÌÄa2m¿ATßw{lí2ÿfF:ß{âY¾Ú«£ýR.ÈJeëß’Òï.oGœ…_HR×Ñuƒê~ü+åI¤n 7èÍ CÛPrà×ð‹¬åD¿,Qtâ ®>¯UzÜû~`úGv$Ì,À-1ô£ïó2¤÷ýR£¾:ËÚ[ÇÈÈZÁ;OÀb¿ô½§ñnÒ÷nc»ŒC;¾zœèúkA-¹¹[CæÌcëõÃhé¨&PTŽ[ñ¯òʰ}û6vïN¡°°°Ú}Õ ­Kë6m =ÑUUÎa§=¨qíù•Åûtt#„ë^x‡û.¬ƒ<’Ê–-ÙÄÄYhŒ6}3‘ óþfÓ>'ÑM¹ì¦A ¼ª1þ&‘õ3õ{—MFý?þþq’õï àÑs°v|™éO·#POã§Ï'2ïÏÍì:˜I¾1×ñÚè!´ô+$eñÆýo)ëw¤S`­C‹Oðê€Èl6,˜È¸¹²9ÍMPTs®¼ý^î¾<¿cI#É\ÖŽ‰7ÜÊ\lÁÄ4¿‚¾CúrEŒÍÂìw?æ›uɤfäá’V‚£éÜg(ƒ®ˆ=Z¦žÍúùŸ1ñÛ•ü³7 —°\?šWåÉÛ°g/®¾OD^Õu©A9~B€žUEIr7Láù7æ“Ó›Ÿ¾™Dÿj2Aq´l݆:¥¶ ÐñËÇ£™ü÷.däáþ„'¶ç¶aCèÞÄßû+ßÈeËÂO;ço6îËAÚƒ oДk‡?Îí1å¾t]ÉLö ߟÿ&“7Å. Iþa<ï|ñ ›"mát¼w$Ïu‹ÂZ´IÆO¯Ñ÷‡ r<>Ê.¡shåïìökÇ}‰þÔ*ëZ]Ýåê\´ÙîÉC¸îsoA­ŸšÆ¨NAhžLVÿo,cç.gG–FXÓNÜ>lׯÕ×uˆ?§Ìg?¬eW–‰ˆ&q%}fGÝû—±&ÇÎåO çζþEŸÍ«‘ˆ2Y®Šõp°þ«<õùjRóu,A 9¯û ês>õÌUmWMýqVþZ 1—u"bæ/,Ýã¦E‚­v¯RkÕ5™8 èÖåZƒJ^‰¤è¿âQXXÈÖm[Ùºõ±dgP°s~ãÛa2ôö('Ž@œ²,Þij„#»ÈaëÚHky Bci×A“Nþ™ô8#fíÁ£H 0y-sÞÎæìx§w,V)Ñ¢ìHñÎ ½ô/c÷>Ïÿƒ :lf7¹žÌnvÎx‚¡ŸïÀcH©AÁaÒÍL¢­Sžàá{ðèG€™Œ½køú­'ÈtŒáÉ¡µŸL)Ìp$•f­äge¼j6¯½l#æÃ~41±jéFvèHÍŠ•2ö¬cΨgÐÃÆ2¼•?y¬÷ÌOC×%á‘øg¦‘¾w ¿¯Øó–ì5é“êêbËg}5åø™œlZU’ö÷/¬;œ‹~ègV¤ÿ‡Dke½SªŸDÅ1X=«7p0ª?€ãÈn~ûêsÞÞLà ÐÎ_'yæS<ðù!ZÝØ§Z…£øÆüÊÚC.úDW,Fê:ÅI÷Þ¹¼òþÏøÝ8”WÚ×Çœ}Üè:e2D–˜Î ¼¹%uÜûù}ÆÄRe— Ôd;–í†Ø^Ä:Dí²ÕµÑR¶ÎÅÂz<Íó]"° ¿H4QȶiOñÄ\?zÞóC"rY>ýcÞ}^£ÁØa´ p±áÓÇy~¾A‡Ûî¥_¼•ôM?ñÅðóQ-sháb!k-cÒåDÛ5¼_WeU¬‡ ¤E7>Ò‹ƒ«fñÁô7ø¨Éxží‚©Òíª®‹¬ª_+kdš9f²jSzBäÙ7Œ}–ñ[V~à*tbµÙ Äíqƒ,ÊÔƒQèr…ÇãaÓo?øÃ÷Èm;ÑâûÈ£&6£ÆQªžÉŠ9sø§ÁY<ùý,gPÃ,ô pÚƒKƒ®Üwýbžš—ÂŽ¹orÏ|?â.êJï[o暦Á˜éKødö<º•6^âéžñdÍ–a·°eêdVw}–ö5,Ïû! ¦û¨ O²£»%–Ü%<9mÝDÒ]£yS"8ÉÃŽ-ãÆ|µÞþ_¢™´ožeÀ˜Íü:™m{–±!³M‚‹Ç¦ƒéþæ†'bƃ÷31%ß~ÞÉà–-±þ•q  ë:<ò!Ï_Y‡ÝS†1tFj-‡¼ª®K#­úrŒŒ¥ÕöQL{è—þv¥K¤¥úƒüÆ·¸åúQGÿí¸„7>‚ó,€”øÅžÇ%6Ã..伨ƒ¬|äw~I¾—61ë™4s'!ÝßäÅ»›  Œô ¾üä×õ†qä Ù†?-ÎëÀ-½\QöÀ˜p1Wth†Cƒv©,Ø[vÛ$ÇÑïY=Ÿ´LGl8öcù­¢m›ø~í¡ÑÄÇGcÞ yòÈ &ÎÙOÓ{Çso×p,ZDdð×=3Y¸c ­âV2廃DÞöO÷î 8?‚äŸ×°ÆÇþMõ»ðÔˆ­¼ðáÛÜý÷LÚ_s7ô¼†ó80UQ€€ÆѹqÑšÖeï’ûùaíÜ—l[Ûú7³TóZ™‚‰ † i9xd},*UsRU—©‘R–Êè 4MÃE;¡áI*A¸\.ý‰kÁ®±3= ›$±gõJv½7š–ŒEh5 SÝiü>k6k®½‚ÞíC9îQÀþMØÄyqþG÷çÚɤG_à–Oóî føi™¿‹…ã>æ‹%[8T zÉ|òTBþKòþ-A Z y—i3wþ÷|÷ÛVvý9›Q-â÷ïñB—úè©ëÙ¥K¤­-·^Û‚zu¯îNÓI[ÙäÜÅúƒ..¬[»b…¦aÒÌXìP°m [ÝiiGŸë ¶šø8Sב¬K${˜òp¾€4¼™Žƒ;8ì‘Ô3×ò—¸‘ÍšéoñÖŒ5–@ÑìpIùdp¹zÚ"iÓ,vg‘µ? R7²ÛH[kzuŒÀfÖ1ËOÑjêâÊÝPm9®ý5裈ÜùèEH!j6!·Q?^{ð<5oß s Ñv Q²<Æ»!¶ˆxÂÄ÷Èñà>´™þ´½$MCˆÚ͸·5¹žÛÚþÎ'ÏÜËö˯禺Ó9!¤Ü¯;Q²_[øÑ²Ëùd;%ö@ëq|‰únc¥Ï.Êl7×}x »ö¿?ë>(®—÷õµ*À°½®`Úµ«­¨¯Z?€­D_3‚q—ôaýÒùvÁ4žž?V}_àå>ͬ¤àæàò¯;m+v¢@óÃä4°ä8ˬvªmý-—VóZ™lÛ¡ ÛyÂVU)U«.¨onOÓ46¬ß€nè¥Ç¼ÿ+Áå*$:*Œ}Ë&Ñú²¦°üGve`Î- íÇEHÃðfjŒt¾}d˜bú/õ,g€(þ{œœÛ™òòH¶ÝøÅø•š‹g£^ýH"ëy‡í¥t±ýË×xoI7y–va&tGcüEM'Täíø‰IŸÎæ×ûÉv[ oHÓηóÐR÷, Œ„<5õ=ýA 4;á­º1°eWîº;s_’1krøsÚw$_~'Ñ¥Þ%¨’oL R 4KQcòÉÈ3µè@©»¼Ã3š†¹ÜlQÃãÄ{ ¥Ãµi`?)_ÜZ IDATÀ˜[QÇTË€È_7ŽW¾\M¶Œ¦ë=ií—Âì±óÙ©WÌšp„:€,¤Çƒ!AJ··ÎU„jÒ'ÕÕEžjË©Y ÐjÑW~‘4IH(5§¦è`çãè$L6,踥ÃŽéØ<k7½òíWþÀ׳fñúˆYÌé÷&oÜÖÄçL™²Ë<`'È®\×Ñ*›lÙÁ•sw™§ëäÊ{¶J" JË)~\@…™¶†;í|•{šÙKwG½`Ì4:žÚ¤ö„†Ù?’¶×ô£ÍUÿ¡×”GñÅ;̾ø}î¨ï»î½óxáåiävÄã÷$Q×ØÃ‚7Þæ·ã­¿=´ò×J »9Rö@ûñÿ:WªUm¦¦è¯Ð‚æIÍJ†  ôò_Éž›X»pI±a4ð£KÖ-_O¦»€˜gž„âÀ@Þ¡XÍÀÒ÷dóâû‹~´wP#Á0ŠË+µ?s$×>þÝ„††Dz2ذò ßÏ­W´,š )TRÏrŒì¼÷ôGü⸈>ƒn¡q€›ô½;Ø©a5ÛÇ™¢¨Õ§¤¬ÓÔ¸±lÉ6š· .<‡_áuí@Ò™M¡.±F¶$V[̆µ|õýfzÆ“õÓ7l•i¥y˜ÍZ‡úþ°.'‹õáN ¯q¬á͈âw¶®aÖâdZöhŒ¿p‘› ¶ðæÞÇÈ%?¢·ßØŒ`“Ä™J¦#’ˆZ/ÇÑÉNI!WJˆíBß»Ñ@_ÇÊÉ Ø™WùVå kx3ê³”Î5Ì^œLâU¤r–ݦÚ>Ñɪ¦.–ˆê˱…'UÛGžôå|õÅ/hÐ…;zµ&´&Cv¾æÔTÃR7žm6›7ÆÝÊ›ïÝ"õò ÆK=nö'¦ý ¿à*:4ŒÇçÎgë #hS›O‹ÉŸˆ`ù‡Ò)”` ¡Q¬?òï¥lÌîD§P3;ù}cZdáQ*UÓ²lZ!?«À{þœ¢>3×§¥äd¨ß5¿rA¥”͈µ~ź¿wãlÕÌ;Ệ„S‰ÚPgÆ÷l;äAFù®Gá¾5ìÔ1´_w:Ö7#ô@6q4¨9ÆúC¯•Ÿ@èÙìφàú˜ÕÐÓIW“á'(ÎÈi9’‹¡ë¥²( ¥Aá‘Tòv,¤EÃbý “KY킨{×0ôìƒôF5G'Ëâò÷aþš>–ɋ֜e!¼I,dKL¥35îLÖÌ™À„y+Ø‘e"¬éÅÜ6ônº6öÇdfɘw™º,™´Œ<ܰÄöÜ2´h‚zQ;vO¾ŸžEÛ[>ù9o´Ï`ê}³èü×o"v=ŸÌ<ƒœEÏrÓOÞç5¸ý5î~•‘ÛºòÞÇýˆ· nvMÎýß%ñßñÃhYtJ×¾å¬É±sÙc÷ѯdbþ•Þ‰ùÅýiä°qÞÆÏ[ÎÖƒP/áz º‡ŠOôY°‘QžgÛÞ僛½C»žÔy<8xq#?áÑ$'+¿Ë”%›H9‹ ?Ú=ð6/u‰À"sÙ¼àS&Ì[Î?iyhÁ ô|æE6÷CóTѾ’eef‚Ÿ\§=¨q¥ÌåÝ·çpРdé¶4t u.êDŒM`r\Æ=×ÏdÄœTV}ú8·|&ÒÀ0$néÏABÄÓíâ}ŸAòÄ¡\ÿ¥òók4¿Ä\ÿJî¾rÏü”ÁÊ1Ðë3&tŒ¦#˜þæ•ÜÓíkžXx˜u“ãæÉf,šŽÛ°rñKŸóâUÎWÛ;uݧ•z‚µ=Ï=•@0;ÉHþ”¡ƒ¡Q'ÛóZ½ææúWrç¥3xqIË>~€ÞcDI¿•°W×'&B›4­².æˆêË1E^É=ÝfUÑG6’ç~Âg SÑÙNø…Ð'ÆZuÖ&'™ kƒK-铽>MUï‹àó¹ýª`žúâuÞõëÏÕÑ‚}Ï.CÒÀHý 8¼úW–ïiÀ%‘å² þdÁ ƒ˜Fõp¸ÓXœ‹áWÿÚ®÷þ4iœ±’çå„ú všßzM~ùœ‘O½Íí=/$ƚɺï¾dÞ¡zôz¼=u4á3U%s-ã­Ìþy_7ïAc™Î‘ˆŽ\ݼ=wõ¨Ïð9¯ð¼v;=ÚÖÇ^x˜}9±t¹¶Aíps,C¦½È3Fzßç?ìÎõÝÇέÓ=ßI|³8† r’YúõBÒÍÍémCX|×£sx3"™Îœ/æxe :±/ïøëï8üW•¯•+m [òëqQ‹º*Ss TÔ§Mhäç壗 jP{ˆý+§Ó8T'&°³;ƒý‡³Ø‘eÁÕî?XÚ\‚fó;ZNIyE‹QÀÆ Oòò7’ö· ¢O¼•ôÍ¿0c 8J2+…lŸþOÏó£ÇÀG¹'<•3ÆòÁó‚¨1ƒimÏe×ꌺ…á÷5ÁqdKgMå£4ŽFkÍ[fX÷Çxúš¢‰íõŒ’S6ô îç…ÞqØ4 [ÝoMÂòÛJÖ§ßJãH 9ü³: sâÄØ(É&™êÄN>ë~\ξ旕™˜ïm¿‹]_>ËãÓr¹àÖ<ÓX°ë§/˜ðÄs8ß{ƒ>m)1о¯‹:Yj±ˆÔsØ´d)¡7qÿ½Iëùhë`ÂÅ®™ÏñèÔ,ÚöîÇIõÙÙFX'Ûªê¿@S…ïöÓÔœº(I°7኎‰,Y»½9nÀBPx<ç]Ý›»niKI~´8ŠÑ¡ãûÍr¶¦9 ˆlF‡2¤{<ÍûœÖƒ_æm,ÓÿØÂÞ¬|„ÅŸ:áÑ´mU·êI‚Z0=øÿžÀ¤Ö²m_.K±á.ÈùÃÞgtÃOùlá*¶ìÉÄ©›ŠŒ§¾IÇ šÓ2K½ôAÊãÆÚ|¯1øð«%lJÛÎÆ4‰°…аIkT|Cø®sù€×›Ì`ÁÊt”·É…XüÞy¢ú>±7À«C=|8³’º˜jRNu}d"â‚N4[4ÔèKi[·±ôž™¼ôÌWeï«3Ÿ¼YÕÛ‰@Îò*[Ç0yÊë,rú ,&¦p®Ø›%o/`ÜüN\8ÈQæ³æÉÜÆ’/ç°>½)íÔKìÄ}OÜDc›@¸kòÂ3vþÅD}ú ?o/ mkï²n[loÞz' ŸÎcÁ¸_ÉAD6:¯ÝCï–þÇv®-„ƒ¤Ç›Ÿ1í)t„sáíÍèÜ<–¤£x+dŸ~ÿÿ“ƒn¡qÇ\ÒµA&ñ}^ç½ ‰ŒŸ;ÿÎÍÆm¶\/‰KKO€À@ׂ Èú¯ÇÏ"£°ÙôJ†¼“nõ-QI=þóž{à0ïM›Êë?¹€% œ¤†E'Ú«l»jêo©êµÂÅþ?~gP;:5´ªåܧ@m25±±±òèª'Oa.k¾H|˜ .Ð…ÅNêÁt6ì) I·ç±†€f)[FÉðwzÖ*¦ýp˜ú·Œæñ>±Ø4íÂIùy-늞cä®åó9©$úˆׄaÐ,<¿‡Îæ»wÒ²¹÷yŽ˜6t8¿)vqm"²úñ?ù%ÙIË¢Vö: iÔ¨!Ö¢y`²èû¡dîNQ=Í!Q4jÜ{ñóš]N+ë(~]›I÷ˆ0Ìy;Y–¢‘0¤1ŽRý¤…_Å£ngä˜÷¼ìk.¸º+×w¿’vEóeîZ>Ÿµ›°Þä±ÛãÐÚÅà¼ïqfNYC÷g/$¨¸J •÷•Ü'%~Îãâó›z5<²’É_í¢Þ oðTßâclñc«ªî¿Ö~¾Ç aœ²95¾J±L™:Íum·.§èÂdÞ1Ô²áw-W¾”Ò(z‘І&Ê>G" é=ý}É®¼©No'KŒ¢%áB3UèxYò+ÞTC+zRùÇÊî×W›*;™˜@3iÞ±àâ¶”ª«¦iõ,ÎL!4Lš òÒà®NE »˜ùÄp&lÓ‰¸ù>½»øX]Ÿ”ë× u©i9ÕôQQýeQŸVõΪq*Ów»ü“â~(êoÝ€R¯©,ópïšÂÀ~å²÷ÆpO‚­øõ&¢‰ÑEû+™(]ªJæɲϭ¤ìÆ!>9˜­0ùÅËž“EÊ’ñøŠeÔ¤œJ/õžšVòÙ¨ê}íëñJßÛåë]UÝËÕ£â{¬ügüê_Åk%s×0zðslìþ>cnk„]­ç>©-^ÄU—_…ÛSyä¿;%…ÂB'.ñþ0Y½z5w6žî. sý—ĆÛi˜‰Ù•ÎÞ´C¬KÉ¢iÏ7ˆjv96nÂ5>zl2ÒYøè=|`Á¯]ŠÊîñ3m_û˜[\ ·ðÁ §X{í»|Ü'R¾`ȃ³H-}~¥¢÷R³ŸòÖe¹|qßCüpþëL¸7‡&0Òäáãxú3^n•ÂèϱýÆ÷ù wã׀s§0yX©íôÝeÿ]ü2²YòÂ=¼å¾—ÏF^EÐŽñ |b3½?~“^QåV†JOÁA6þ±˜ï¾]È’’–·=ó·6Å–òC†ÿ@ÒÈ1<ܪø‘“õïÞûòÁ‡}illbÔ€²uõìŸËC¾"nä8kvˆ)÷U¬£k×T† ÿ#ÇðP«²?¶\ÉÕôßU—Í !@Âúë9¯ÍyÇ[üðÃôéÓç& È/ºå•úÿÀyÚ‡Ÿ¼KûjÖ@!4D•ydïeåOhUœ´IT5é¶ÊU!>ÊѪIxWÙ–ŠõB£Ì]F:‹_Ì{Û ,~þŸG¡¡ch͹©K´wynѾªî“júµÆåTÓGB£º.9úTSÕõ­°£Òýåf÷Ï X-¢hXײwñë—sH‹êIç’_ìeû·Ìk%ªzøz]«x¾F绯cú£Ÿ2~e[k_§(³UÝ °êÊ©äñJ:¸º÷nßÛ5Z¹æ»5ùìÖºþ•¾VN¶Íú˜ïõN¼Ð5› hN‰ê' —]ðѪU+ovE÷°æÛQD‡ÙHÊDdwZ:[ ZÜø.aña6[Köá3SS2¼"踣™‰òCTètìœßóÜè(uÀØëaâHÉóK&›¬˜ÑqëÞÀ[À0ÊN<.Ueú¢Ô~D­º´ÆÛ¯ ç‰ùo𪸙nm"°¦“z$š+¯I$°üäãÒ””HS]š7²2ï—™ÌiÚ8™Anx{.o\~»Šû)áH g·Hîÿj»=‘ÜÑ1K¹ ‡sû,>üÖI£¦1DÕ @äìæï¹‹È05å‚„úõjÈC_¿Éh[®ŽƒäÅÓ™•ÅÍ´&¦:tnÈ”ixoF>]š†¢ÜANq[*«cP;ú^Ác³_ãUãf®I ÇV3º#b«é?ËŸ*^žøäQAÍYLhÚ)YÕqªÊ9Qδú ¡Æ?N5Õç§^m†Ÿ5jÄáûØ´=•Œ)lS‡¨¤>´l~¡Ñ­Q’Q(~=eqž¡ÔJÙò­4êýÿ ú‚É ¾bô‚t“ zMé㇉¦ýGòJÈ$¦,šÉèG0ìÁĵïGû+(®©,Ô”Ü'‚¸pà`º¾3•™o¿ŽËQónNà’Få·«¸Ÿ£Ì4¸ª'-¾ú˜õn¤c¸¹ÜГN~Y2wâ\2 Kõ.cà }¸*Ü{èntësŒtLbâ·ã™u·¥ÿKwÑ«±­è|8&¢{>Îã9㘺p,¯ÎÔ1Ù mÔŠ„ íè«R¡Žvú½Â+Á“øü‡é¼õ¿<¤=‚‹µ CLDÕýWÉGïTý¬<& +Š¢(g³E‹qÙ%—U9Qxïž=x§háIqF¨Â>Ë/(½ÀEMl¯¸¯º•”Ÿ»–÷†¿ÍáÛGóâ•õ*^“ªÂÄüâ3™—Í@–žH_| ò‡î²õ‹ö£y‡ã«¬cù>ÒÊ-0©¤ÿÊÓŠ‚ÒÍ[6Ÿž‰Â⦊EQ”³_u™Ã({\iÕª-[´ k÷^˜43šÉ„Ùì=$ŸuWJ0¤Vò+_7t C–=h íèÉèŽÞIÅK¤”Ï–T|ÎÑ ¨â>½×š*½ ¯ôÉA‹î/¿]ùK'wìåˆq„MóDzÄq5¯v¨ã=±®+[FUí(}Y_û‡àK&ûê¿Òû¦b;}>Vùœ òYº“©’á§SWEQåÜPéAMJtÃ(™*„Àb±`õ}Þo¼Ç!‰†,IÌHÛ¹©æì`g.w*?|ô_ï5S·ù ª7‰ŽR“™ÏQ§=¨©v9²¢(Š¢”Rrf`_!ÑLÎü| ðóóCQào_ú¾£×ùg“‚‚Lf†”hâ, ,±ô5‰[åÑ §özœö æÔQXQE9T5ü$¥$ €œìl~^ü#šV»L‹aMU²¿³Vé¹=çx†¦Xñ„NßsjÔaEQ¥ª›SãççGƒ† q zæ0i&lv~~þ%e)gY4„èÑ='½,•©QEQŽ[uAÉd" €€€€ã.G9»H¼CŠº§¶Wë­=Ô(Š¢('„:v(¾Ÿ[èT¼?Ôð“¢(ŠrÜŠ—l«ÀF©@xßÅKöO&uFaEQå¸q8ã0uëÔ=ÝUQÎP;“wÒ0ªáIOš¨ FQE9.íÚ´c݆uìØ¹Ceú• ¤”$Ä'uÒËRA¢(Šr\¬+ç·=ÿtWC9ƒª`×gPSþtÖŠ¢(ŠR•¡Qξπ$Ô…EQE9»œ¥ÐPEQE)K5Š¢(Š¢œ|5&ê(Š¢(Šr–Q«Ÿ”3‚ÛãfÝúuddeœîª(Š¢('Xb“Db£cOz9*¨QΫ׮&6&–K;]ªVQ(Š¢œC¤”,_µœý©ûOú¹jTP£œ²s²‰‰Åíq«Ó¬+Š¢œC4M£uËÖü½ìo"ëGžÔ®*¨©£0›´½‡15hD„]M8:Y¤”êIŠ¢(çÃ0@žšsÞ FfóÓcýyc³QÙóÄùrÔ5Ô3Ÿž! #k1ô{›õzwŒùˆþq6*­‰+™‰ÃdÚ~ƒ¨¾1îöXlj$¥VT–FQåtоÚOû……IC×Ý•5fMœª¾ðM¸ ÃÔ¤W¤®£ëUiJ¥¤”*¨QE9ªïöJ25§èÀ"‚¹âõ¯é,òYöbž]^­ŸaÖ«ÒÏúOgÄ[9«ƒ-˜˜æWÐwH_®ˆq ¹Sùéó‰Ìûs3»f’ïGÌu¼6z-íGØ0ÿ3&~»’öfáv‚ëGÓâê¡ìGc‹çÿÁ† 6³›\O¦|Ö{ˆGæ§¡ë’€ðHü3ÓHß»…ßWìÇyK~&'[§>ÁÃ3öàÑŽ3{×ðõ[OéÓBËœÈÇD Y`«çwlãv U¶å«–ndWŽÔ¬X) cÏ:æŒz=l,Ã[ù£‘ǺjÚe—Ý(Ê—m躎^œBª®.¶Ñ¤ýý ëç¢ú™éÿ!ÑßZi÷H)1¤šSNv.øŠõzÑ#)Ó¿eS:IþùkþªÛƒ›Ûÿ{Ú­(ç8@ÈÓxAË3ëײ–Ndáý.r³sÈ=ô#̶=ËØÙ‡&ÁE¿ð ¦û¨ O²£»%æìEŒXp]wÐá‘yþÊ:ìž2Œ¡3RK††ŒŒ¥Œùj/½!ýßM¿D3iß<Ë€1›ùyÆr_Ø…º%õˆä¶×?ôΩZQÀurÚÁtsÃ1ãÁû™˜’Îo?ïdpË–ØÿʸjÚu"êÒH«¾œšô_L{è—þv¥K¤¥òùH¨LM1ç¶™ŒóMžîÎuRþ{Nû-%»~eÒ„C4s›«|¿(Šr9sjΨó„Ù¬™þoÍXÃa ­‘ä‘‘ïA}ªÐ4Lš‹ ¶ld·!‘¶ÖôêͬW8S²kÿ:’u‰dSîÆ7›qp‡=’У{G˜L˜L¦cÿ¢­m[l‘´i»³ÈÚŸ ©Õ·ëDÔÅ•»á„ô_½ˆÜùèEH!Ъy_Õ8¨q§³jîç|ùÓ¶îNÇ)ì„Æ5£Ãµýxm<þÇpž!Œ ~›8-îåÕ ‚1!‘’s»Í%l$ô¾—ËdÂ÷7кw Ös¡YŠò/'§wNÍ™ôk9Ý8^ùr5Ù2š®wô¤µ_ ³ÇÎg§^uà'¥Û;ô"4*;–'BépmgØEIÀb lE“÷@ì=–K<ïæXc¾Ú·Å„#Ôd!= Y³v ÍRôÂæ“‘g }¤ýª«‹4<'¤ÿ4Q£@°&A,ØÆÔ§žaú6Í®îÆ½hd±ûvå€Vœ¥<{1c•K_iO=SQŸœãm.M¶àÆ®áÜ?g[º¦…£ò9XŠ¢œ$òôfjΜ F';%…\)!¶ }oìF}+'/`g^Õ[ZÛQŸ¥ìt®aöâd¯ í³ÌsláIDñ;ÛÈ%?¢·ßØŒ`“Ä™J¦#’‹@XC±ú6ìÊň·ƒÇfs-‡Ž­-劚´KXëPßÖåd±~ã!ÜIáê’UM],'¦ÿ<éËùê‹_8Р wôjMhKó« j¤“-Óßeú¶ º¿ôƒÚa)î .=¼Ù ¢ýàÎdÍœ |:%;²L„%^Ì­Cï¢kcLF&˧ŽeÊ’Mì>˜‹ ?ÚÝ?š¯Òøsì{Lý;™™ù¸qP¿õÕü§ƒÆêE¿²rW¢NíoÂ×'h€‡}óÿËsS×–o`l@»îwóà­í¨k fÉ'ï2uY 2òp ?Â.ä–¡ƒèï_nÞˆÎÁ•°Ç¯ ƒ›øiœkm†u£†ðÜ–®¼ûQ_âm›]SGðÀwIüwÜP;]LøWKøc‹æMlœI(E9‹¥¦î祿ӮÝù4jܸÂhή;Yµj;^LTƒ†¶70N3gøÉD&M f'ÉŸ2tð/4ªãd{¾QmÐg®%w^:ƒ—ä°ìãè=F ½Ì¼Sä•ÜÓmO,<̺Iqód3MÇmX¹ø¥Ïyñ‚„=ŽK“¬,]ídÝÛwÑs¬ÝïjÞ;„¤*~Eî:ŒîÓJ=jmÏsO%S[jÛ.ìñt»8„EßgZã:˜ŒTv­ÞÄ¡¨[xèÁDl™™3î|¼.‚ËúÜÊC}üÈüëKÆú&uš}À½‰v4!Nº†;Gt§Ž¿ÁÁÕsóåh>‰ÿˆ'ÚcÒó¼ûŒ¼™‡5Á‘»‡?¾ú‚^4Ñà“¡´.½Læ±cùˆ¹žh; %òœkóâ/KÂòëJ6¤ßBãH 9lY•†9ñ¢m`©ßŠDÇ׬ޘ'¾>–ª?Š¢œdBòóóYºô7¤”e›];wòÇ¿cBÓ|‡ No¦æLbo>€W‡zøpæ6¥mgcšDØBh*Çïn IDATؤ5ª˜ß¢…Ðé‘x½É ¬ÜÁAwAyX‘\ˆÅßY"óÿÏÞ™ÇÇtµü{îL’ÉdG‘DDAbK{)ªtEyÑÖÞ·UZkµU]´Šj--ŠŠV©Z«{ßÒêŽZJQUKQ$Ä’uæÞß3I&“I&¶lÎ×'3wî=ûóÜ繓ƒ9!ôŠñ²Ì®x óR&­êÌ’H*3ááuÐ4m[·°uË/¤$'søða4M¥eb+""êŽ;^e·²µ5¶{ÖØ] ¢Ø­sŠÎÁj*ßMû/s©¸= ã ÙªU©O¯®¡lz¢„ɰùq”ª·(œïñs•yB¡Ð¥RçK á°ìøn%_ÜW"ù+ÓòFÕÐùÕ!X—ÍñcþB0Úyˆ´\«!a¯ÀSRôzþ^€yiSµBß³Nî嘹6Cût!!P0{RÛ ¶h–{5‡aZ¯åýžo‡ñ÷VÈ:wl³†±ÊæYàÓänó~…/7ï&~[*5oK$Ho¹œKœNï’Û„D")SÂÃÃBpâÄqBBB©];´’©B¥tk`¯‡FΑ磲áR“ncß «mA âÔ+SÁ)«|•Cù9_ÒíAÜ€átüýu>˜ø4ßÝ™æÑµ¨¦¿ÂŸG3òŸ>Még?ŸÉ«Joîˆ ÀsžÓé¡tì…—–·¼Ð×ÂîzÞë??m6žMÓp ˆ"õ|¾ú+<:Äl8Ç¿¶a8Sƒ¼Ž…=5FÂãCP×ïâŸÌÖøx(ˆªšg÷(îº#ˆë–pÜT“q±Î#ÊMÞË¡+Õ‰¯çkñÔ\Kc’H$7°°Ú„††åOvæ…ˆò=&¡ª ¥Äá—ÊJY嫬˯4ûÔ(¾ñ<>{±«ÖðÕöOyûÓ4Ìèp÷ ¤AB4¾  ˆ~p /û,cù·k™ýy:ªÁ‡ÚÍТc$žäMÄ·Á½®iy?¼à­‰EÓ4ô!=˜ðÈ9Þ^·†Y?äàâQƒz5=¬+“…i7¼‰m,û¾TÑgYUÚS#©\\ÕÙOÖ=Zì…£ðó! ßS`(6{¼Ø>b] Xv·+èg¥`ûüx„ݰœÍ ßA\ÂhQ/„¨Fëþ]Xÿür–ïŽåñf>äÛ5U!ÏZ&ɇOrY½ÌþÏó“±3¯´ô³îŠœÅáO–²ÙœÈSjæGI$’ÊJ9Ï©‘HÊy ¥CÝ^Œ}Hc_Þ|å Iî6-x‰Nê©^ÿ6ž˜Ø‹(÷‚ååJ@3zêNS]ÕË»Dr #„(“EHÒ¨‘T4MCÕªÀÊ»ëE¸R§[?ÂÔ«<}½‚£¥ïŒ$ЬžEX†Ìp%ì¶¾„VÅ|K$·0 šÐJ=½àzF¤B!=5¶TÑá›-{cªh¾%’[ͺ"¡,¶gF¤Âçš”†D"‘T!„E¿ëõ7ßäF¤Bàíå͹óç¨îW½¼“"‘H$’Ì‘cG ¹é«ª«îŽÂ’JEÓÆMÙóÇ9,·H$’*„¦iDÕ"¸fðM«OtÿKÊWWâ›Ä—w2$‰Dr(«ÎªC£Æé¡ŒÉM@zh$‰Dr=(Ž.ʉš‰D"‘H*Ùc–H$‰DRÙž‰D"‘H$UiÔH$‰D"©8œ(\–ÃOçÎãÀdff–Yœ‰D"‘HʃÁ@ýúõñ÷÷¿©ñ”ûæ{ ãíå<‰D"‘H*G½)#6 F7õ}_îFôÐH$‰DRq¸YFGVVÖM ×–r7j@Îá‘H$‰¤¢w̬¦iœM=Ë¥ôK˜L¦« C¯Óããíƒuÿ2‰©Ç$H£F"‘H$’ŠÅ¹óç0™MÜ~Ûíx{y_•q’–žÆ¶íÛ8›z–€71•…qhÔète»£°4j$‰D"© X_ÉÓ.r{‡Ûñõñ½ê |¼}HlžÈ7ßS¦Þ9ü$‘H$‰¤&“ ooïk~ÞÇÇ窇­®iÔH$‰D"qHe[™\!ŒUST®‚sŠé,?.]Êÿ÷牡¸U±ìI$•)“I•§B57ÅS“s„e^ä—Øg™3´Fʼn»Úûa¾È¾aw»ûQUízÓ\j&§öÿÁ¿ž hî<þæje²¸¶s£u…DRIÙµû74M£i“fÆ£S±šÜsüúÉ ÖnÞËÁR1yÑ ‘ž?@»ÚîŽÏxÈÇA5 ®n¹Ï¹átµ÷;AÓÐ4 Õú¿a+#ÔT¾?œ·ô£Y9­¾9‡YþòTõ|“ùaFäû§Œ0'óɘÇXtXÅñZÊHžxo:wúëËÎG›/‹¥”ɬâÚÎ ÖI%dówßðëo;Ñ4óçS¹½S— aØTX£FË8Ȳ‰“X}Ä‹ÆÝï`à}è.ã·M˜6âGvN~'Zø¡/® õ5é6a*w…R(°«½ßi¦l>J£¦ìÐ4T³³°1(UMµ~.ïôÝ*?Z=þÁé& —6Ìæƒ ùïØî„¸ „΋:ÞŠÅÐ(«4iÿ•J&‹k;7ZWH$•Œ<ƒ¦q£&!صû7€ aØTL£FËäÀÊÙ¬9@Ïé¯2°z!nwu`ý¤ ¼7ç=Z/I ¯tv®XÄò÷s<å29i:ò ^ì˜Åª‘ãØ?•Åã1(Ô+üõ¿÷Xòévü›ŽfðÆ¿V=ºŽÃÂ’Yñ¸ÍýZ*?.œÃŠíÿ|þ ¹ÂˆTsú<6Œnu=Ð ÿ~6É+vs&CEïU‹¦=óDߦT× 4ôÔ”)EÊÝòýøû£¸w¹EØb'.cz/Óv¼„¤Ï~åðEþÑ­ùÏcƒèáN=g©ÿÿ;Fò… rq'¨QgîOTصé~=záN‹ž2êî(¼tåßC©Xè©Ku²pÿÙþ ¤^ã&Ę/°ãƒé¼h/·]«“òy re>W²\’Å?›Þå­äÀ¹l47‡½ÈÓwÔĵHÛ( i;-ÎóAݒƾϒXò馀T÷ƽ ¼Ñ œ§[6I%áû¾Ë7h:ßÞ!D¾a£(::ÞÖ©\ ›ŠiÔ\9ÀGÏà–ø4½bò b¨CA·³áÙoYÿÛƒ4ks™ý?mçxõžŒ|¤>jJ„:N¡šÍ˜òzYZ.ÇÖNf슳4¼¯ãû£¤laÑ¢ŸØ›’CŸ­ðýæ+ݵŸ³5à‰‘¸_>Á–µ0ÿEµ>F#Oƒ. Ý?•”]óöª7XXw>[ø ËëÙÉá§²%¿Gm3Ìø÷˜À3q÷ wYZõ<“>uç®!ã˜Á¯«ñÖ ‚š ¡‘ÁZÿÁ}óD4nöññâ ,ØHû~}ÓÏÈ…m«x'é5übÞâ‘hƒÚrІe¯RPÓ9àPnÈ•¹lpá3¦Íû÷û†ó|ó ô—’¹êƒoK¾L–N†‹¶;]¡åptÕd&~x™„¾C˜!8úíJ–<ý<™s¦Ó/ áTŸ(Um©„¤ŠrüÄ?Ä7Kà¶PË$Û;uA§ÓqüÄq,r^ÁŒšòÞQØ|é8'24cC0Š¢¿B,6qêP*¹­]Ñ4 cx3ZÅ×à ! ·°SÓgùº£øÜù “®‡‡"PSϳnñOàPá©hš†{XcãëaÍh”®‰ÛøþX±õÝ1†'Ð6Ü’¦†ÑÕ8ùÓX¾ýý 9 ^¤§¦|°)ëür×ÀàW‹ˆ:!¸XÚÃǧ‰6Á]üqPß?•í#Öóõᇉ­ŸWÿhÞ¤ÑÀä­<þQzt"ÞSA40°÷çWùmW2¹Qa¸–kÆ+2C7ùÞ3«|‘[ 'rU¼\þp,‹(ÎrI5Ó¤9Íx¢Pß®f£G Œš’ãÂaÛÑè–÷×§Æ}3ß7wEØ$Œì‘Y»âwzLJÀÛIºcë»K£XR)xhÀÀ(äBp[‡N€†%Ïv½Ùã©)Û7°½Ñ¢©f4 „†Ãyš&òŸ+øÝê.¶Q`¶Š4÷ìŸË4Ò¨U(îy•!„ÍøzQÅk®k@ÕÅ7¤¤™Ð´\Rvn iÍ·ì:šJ–âŽ.KEŸ–Ùú2µ¼P¥QS¦X4…ê±@ü,u‘sö/Nd›8=ÿ1z.ùϨªŠÛÙLÌ1öõ¯Ç/Ô‘s‘K9Ö8Üü¨å^ÈÀ,W¸•@o\'·˜8»£$¹r,—5Ä7$§™pmr'½o!é…‘iw'÷ÞÓ¶‘>–¹wEd²tqÙ·ìtEÎÙ?ù'Û“†ñA¸åé·`Y·ÿ )9ñx*%§[Î÷’TŠ3Z,FNùë@‡F¢”ï1 Šw(µÜ»œ$£{ÞvΙ§öqZÖñE§]É ¤°ñ`÷rSÍ&LèPD¡dQ®X•]Ñ—a‘pW\P1©*¹'?gê´5\i71ƒêá§ýËÿÞ˜Ç &¨ZFMYâ`øI@¾ç-¿VÌ&̈1™AÑ…{ÉnսБVžµþt®z9˜TMS@Óá¢Õ¤Zë¼LsZ‰°÷žiEä3ï«éßRÊ•\ê­r©¹„pÏäù4Ûµ™O7|Â>áóÿ¼ÄKÔÅh'“¥‘aGmÇ‘á¬b3Ù‡E¿—¬OòÓ-‰ä†àШ)ë%Ššª6ð õ¸«S ¶~µœOî®Gÿhü—Ž–s’Ë6sÁØ‚Gù h— \ÁªbÈûl½®÷ '@¤sðsäÖÅUXãµ6ï³ýwk:óþÏ:¹—cæÚ íÓ…„@=ÂìIm/Ø¢i–¸­yÒLjátIn.jAIkª†&\ñtƒÌ ™˜Ì*zkCÒùÖ!X—ÍñcþB0*…·,4Ä`SïØ\ÃQû‘8ÀƘP ÊΑܖF®Š“KËï #!Ízðh“´Y<Žç?ÿ÷xŒX}a™tW1m§ˆn©I˜ËÇøí4Ùõ#,Ci¹§Ù¹ÿ .µ"©®ÓÀì,ÝZùwr%’JC£¦¬g.5¢ÜiÐo$÷ì}‘µÏNàp®$F »xŒ]ß|ÆÏÇ=i7~Íýt`²z[ì="Záëx7¦÷mÞ¼´f ÜûÒ!DpzçfþÑ4êç÷mÃ)®fõê¸DÈz>_ýb6œãß ›û¼ õ÷_øõdMZ†ÊßÊ„¼6×#ÖU§~W>ûa-×ëF¸vžËþ͹­^SúßÀÄÏgòªÒ›;â0äœçtz(;Gáå¨þó£°B¡pÛ“ØQŒ§ÆÜ:•«äRrS¶³q·JHX5ÜsSØsü ªÑ£ØÉd¼³¸Šk;vºÅ£î©ÅØ^g–Ûè\Ž}¿Šõ§ƒé=&Opšné©‘TDô:=iiiøøø\Óóiiièõe»©bxjÄ'Œõ4}±Ÿ®æ£_¾dÉç1yøS;ª #Gö¦}„§uECÞËÆÞ¨±».¤9ÇÛëÖ0ë‡\^>eê(q“ËŠ+rºuëV& Ù¸q#-[µ,6.Ëxvž°Ì¸öCª ÅÎhpt]Ë¿ä_Í“Om¡õŒ×y¸Ž+hj¡û‹>¯¡šUP,ssÐìçR„¢ÌÏÐ4TMi“Ü<4ÕŒŠ‚Î¶ÞT­  ÙÔ‘£öUlýk*–ê/X~[4.‰#4Õ²³°¢.;GrëL®J”K,2—÷¬e QœL:“ábÚŽCÝ’7÷Fs¯³tËæ#©@¤]´Ì)Ô4³©g¹”~éªOÛÖëõøxùP£Zü¥ßû÷ï§K—kÛ oãÆôëׯ dXÿ®Ø|β*èð“-–e”…Òdß«еgN¡ë¹œüq#{• ‚«áÒ?lÙð%ÉAÝH t±¬r°ÇA¸BQ(p§[¬BÅU¸Çž7S¼¬½_·4B)²}}ÞQì^bví«øúXªß¦ý9ˆKâ!,ǚؕC¹u&W%É%1&J–ÉÒȰƒ¶ã0íöaÙyïœê‰¤b!„  FþÕý¯ùù²¦bn¾w3P38sh;ÿt˜³*ŠÁ—І=˜ðÐ=Ôu§¨¡$‘H$‰¤Ü>¸*„Q£j*ÂáHØ DxÒdàsÌ{8Ïx)ÊB+îÐ=‰D"‘H$•… aÔ”™ëÞêF.ìi–‰D"‘Hªò˜‰D"‘H$’«Å¡Q£Ó•ïŽÂ‰D"‘H$WK…~ÊÌȬGFH$‰DrË£«Ä[ÅV£¦q\ãò]ýoÿw4ß5Á»OÄá! ¬[“œÃ¼=`Ÿ$¾Í†1±¸;:·-û ³úãÛN‹Y7ª>î²­”¥©/‰DrÕüñÇ•v¥B5…÷Ô³lÞ“©úçùzAgªënò›Cg$04ŒÐ@Oôö{âH*>ÜŽ7™m€²!†IŸ,¦g Þ±cPË&qš€âÚuãµ¼ðe[)™ož¹Ÿg¿OƤ¸áT›Æz1øáîÄùê®ÏA[šú’H$·¨)Іj6cVÊÈRt ¥ç”·¹_©+5ŸžEí43Ãá•/2릌{¡uÜ„ΛÈë}‘J®Š´3Éä†àµñ‰x«W8{h k–NcðöÓ,[4Œ†Ь‰Drè[s2gŒ çÝ]i•Øšf­ºÒ}èÖþ™ŽY»Ì¶ÉwмçdªÖåÙ*g6 ¥y§§øþ‚M½Èî_äáû:ßêvº~žå»/`γ™róvŸtŸµŒ¼.¸šÆž5/3¸×$´jMËîØ½çŠ¥‡ž›ÊöeÏѯGGâ[u¦û°WY0Ýž–ÉáOg0øžNÄ'¶¦Ùm=³á$9•Ó“W骟@«–-iÕ2¸ ½&ZZ®%D‘ùéxîîÜŽøÄÖ´ìÖ'o%ÅT¸r.l{‹á=»ßê6ºöǼŸÎ]Rý•Ônq4ŸHš6kJ‹–íèñàæ¾Ø׿?åÓÙ–t•_±²h¹áÜ—ÏrW‡6ÄÒ 8Ñ@Æn&ßÑ–ÞËŽåׯéä*ú¶éƤ—QMNžPÓÙ÷Ñ4†õéNóV­IèØƒ»>Å’ƒ™Îu…³ôI$’«¦‚zjì0_æÐöÝœ Âä§êcL?Ê·ï/dÚ=µ×L¤~ׯ¸lÚÊo©Ã‰ Q@»Ä›ÿF×°±Þ¹Z:’aKÒh;d43£‡¾XÄìGG‘ùþ†E,ÛÜ«fÌù+Ùsø{Ù(†,J¥åC1­‰?âÂE|‚Ý"‹I£±ÚHŸ'_flÐe¶¾;“©cBWM ÉùÕ<=ýÿ3–9íBÐ_8Ezx5\ʱøn)ò÷!*ø¿`"Õß˨çûRÍÃÌéí+xméóÌŒYÃôv~ùSãÌš Ïÿ,|™ÄÒ ‘µxcã<ôJnͽ¥g¨àøè0øVÃ]K'%]Åyù™9\¬,ZJÖµNg°ÕM'øî½ùL«§öê§iîV’Þxšæ:‹GXµ«ÔTT³u3ÎõÎÓ4÷2qxÙH.:C³þðJ³@t§73óõüšœÃhQrÞ Î—^,‰äj©F €-éк!F¥5-Bΰí‘Í|}äIâcï$Þu2M¥o­ téûùòˆÐŸË;yeù‚,á•¡1x(‚ÛZFÕo(ï.ÚÁ3ÛâgUÚæ/;D`ÿw˜ñh}<òN›Ò¶²àÃ4½šÑ÷ÔÄE@ãàsüØç}>>8’X×3œ7{—ØŽV}Љ&ä/$)o¼¢ÚÑ%Êú5ÖŸã›æ³§Ènë‹Ñz¹FÇ¡<ú@,FEбM j¿!¬|w'C^oO5»µ´%¶‡„OY÷¨äf¤“|d;kç~Í·fÜåé%ËS|½ß‹•Ea9XtëУ"hQó_¶ ßÌ×G2IˆÑJЙ$D:KsÉÏÇ×ÙÍÛï¢Zϼþx#¼z6•÷ÞØhyÚYÛhä$}CÍhù„Ó—ÌïÆÜÕHÇä/#µÇxø¿æÔctS_Ì){ù;Û‹¦­Ã0*–ƒî„{8m›z±l÷$g·Á×nõZNòeyÑ´uíügòÈNÙÇÑl'§÷&qFÞUËi»îg2péüƒ›ofÖÿᯮ½ðŸ^t©ïWÙ ºŠ’Ë™_ÞgöÒÏÙz(™ Å}¦—KY…ÉJ~;†Ú´Žóâ½?þälN;üì\59NÚƒ†gÙd­"óû tió¢å³¦¡ïÄè·ÆÓÅ_Oîá’Ë/˧xYÌGØè… ½`sƒC½Qz?Ÿ›¼—¿2=Hè‰gžn±Ù±ÜYÛPݨôI$’<*ÄŽÂׂÐpÁL®ªâKü=MP¦|ʶÔVÔøl;™ Gв†qÙz¿2Âr¦¯Ã¡kÕŒ–w"³=f*Z?3—ѱF÷°ÀX wÌYO›mŸóÁòL²‚UÃßfÁà˜‚^¦¤\Èýg ã&&‘ÞåI¦<Ñíë&Oá['Ï©f3šÐá°úœ´‡›½p¯RPw8o>›ˆwÖ>’ž™Åvÿft¨ç‹^€ÙIùéÿ-APH/8û](¸ê '3×2?§nÛç5³ 3:ôÅ¥ÍYÞDúU§_"‘”L1„Ê&P Õ[ö¥½ûDÖ~þ5~[Ì$NjC€^  l@×÷Ùµõ_²šDcrN°ew:®á rSáÐ\bÓÀ®­'ÉjRÏòŒÿz„é³8rX|OÝB{Úäñ ½uÚü‡g[u§ó|Aê_ IDATk±zúN"Þó¦Û))¬ã;8dŠbÜðûiì‚0{é#Ø\Â3ZÆ!¾Û“¡^ ®‘k5ˆ­39KÓnyÔò|uè$ZîWù¸‹45Å%öîJ!§‰'aÿ»“¶‘sÝ9H$v84j¥òí&(|š2 «/ƒß™‹ês' ›[zÉ»%÷§ÿ{™ìþ_îüõÅ"–ž cèÔ–ø8P’¯5#¨ÅÀå㯠å¾&Á2Î’Q§]#ÛðXï`¯zбÊPz5¯…{ÖYާÕáî{c1¦üÈú­*á‘sN±óp:š§?ž•¯H«nÁ±ÔKYµd-ÞÝæ‘ÌñËE½uWŽîàçm3޳uÝbV§Ôå±Yñx zo‚½)Û7±åh#Jn>ÒUäíE¥àÿÓûÿƒ¾Â‡m2ÈYù•$‹µ¯³óåLÇná,X<‹—’2¸?.Ý©?¹PÊMÇ¿D†v÷cdÒ$^õx„îá‚ã?Æ!U£  Ts’·ëK½D"q€C£¦rî$èNýž÷¶>‰œ½i”ï1PoØ<yÌfÎÚ×¢Ȩcy0ÆÝñFbG,b¡ßÞÚ°gV¤£jÑy|<·GÖ¤Ñã‹YXmó>YÂäÕ—0ªÕa$ïŽÅ%õ›Þ[Í®”lÐ ø7èÄ„—e+Ê×:ý™11…W“–0é«lÐ4\¼‚hæeYù¤ó$*!–?.gÒØLLz_Btàé¤Üim+º ºÀ7/Äœõh5>®Äöà#ÙÂ(Äy†ÞG²xÖ&ºÍ½ËIù• ‹a×›W"¼ÆŒKÓ™·nã’L(î>D'ë§w>%¼Ió&/¹½ÁÂÅ“ø<Ó“Z‘5Œ%çíz“/‘HŠàHl]V®\™Óµk×2qŸoܸ‘¾}û‰KSͨ(èAÞä:Mä}'ÿŠÍ\MÅl+×ÙY+š¦Ú,Ý(…&: ßþ6qÙÿ–§õzþ/B ˆb&8Jn*–Š®À ,Ro€ еb-;ÔÚÖ«ƒúË«c›öRl{¸Å),ÇùW‹È›³òs,‹ÎôBéôF‘:Ï×¥y^CSµüç³ÿ^Ä7ÑùÝ•gYÖS#Û#µJ‘“Ã\ Å0.JøÍqø%?SìoB¡ŽÞUI ·!ëµÛEq~”›ƒ:vî­Š£:p$oNëÅáïÎôBéôFñuîìùŽ~µžíJµý=áÂ!6½·ŠS!}èæ–oŸ·Rê5‰DRj*¬Q#‘H$õ '÷mfÙWræŠ á^ƒºñý™ùÄ@åp³DR84jäª ‰D"q‚âGÛ±‹ølŒÝp¥" ‰¤¼{ÂI$É5RªáJ‰DRfTŽ-%‰D"‘Hœ ‰D"‘H$U‡FMe8&A"‘H$‰Ä‡FN.)”H$‰DRÉÃO‰D"‘HªÒ¨‘H$‰DR%FDR¦d6Í™Äóë‘]Üž”æT¶®œÏ;?Å$÷­,;Ô‹ü¶zó¾>Y|ÝH$’[ iÔdÿÅ‚AÝé3wWT©«4W[׿ ìÙü;Ndb.n§íÜSl^±’/þL—FMYbJeÛšùtïÅâëF"‘ÜRTÌÍ÷Ô³lÞ“©úçùzAgªënòþœŠ;!¡„xrC£²Ï‡¸È7“óì÷)–—ŸÎ‹ ÐP¢š÷`ÐÀ4©á*w"½^òÊ|¿{›¥Á3óÞW_ך¦asDi1÷¨Ö{4Ÿ{ ¢^(ÜÞqÃ7¨6;õbðÃ݉óÕ]wIišF¥°g¤.HÊ„ŠiÔ ¡šÍ˜•2ÒV.¡ôœò6÷ rCˆ°ÏG.igRÈ ÀŒ±Í1fœãßþä‡f2tíjúÌ]Èø¾è¥6»¬eú3Ç%à¥Ö—ƒ¯:¾è\]nR]KŠRÐÞ_Ÿˆ·z…³‡¶°fé4o?ͲEÃhèq«) uDRTŽá's2gŒ çÝ]i•Øšf­ºÒ}èÖþ™ŽY»Ì¶ÉwмçdªÖþ´Ê™ CiÞé)¾¿`FS/²ûÃyø¾ÎÄ·ºîƒŸgùî ˜óôKÎaÞîÓî³ö‘‘×½WÓØ³æe÷ºƒ„V­iÙ}³÷\±ôþsSÙ¾ì9úõèH|«Îtö*름WšøDÒ,!6ï¤Ï Ñ¼µz9cbÍäר|ÖäÄ' )>4‰§E|<Íããiß„˜ê®ˆœ#Eëújë3'™ÞOŸ·ߪ3=›ÇÖ •ÄcPÆäµ÷¦ÍšÒ¢e;z<8¹/¶ÆõïOùôp¦åwgå_¬,Zn8÷å³ÜÕ¡ ñ…ôNô±›Éw´¥÷²‚ùR¦“«èÛ¦“v^F59y@MgßGÓÖ§;Í[µ&¡cîøKfñW6RH$7Ž ê©±Ã|™CÛws&d“Ÿª1ý(ß¾¿icôÔ^3‘ú]ã²i+¿¥'&Dílþ]Ã~ÄzçrhéH†-I£íÑÌŒúb³EæûKe@4ÕŒ9ÏÁþ^6Š!‹RiùÐcLkâ¸pŸ`7„Èâ@Ò(F¬6ÒçÉ—t™­ïÎdê…ÐUhî]—º@a=8T 3FÐ{̬¼’e?¤Ð±w0.²‡v}hªª¢æyc„@gý\¸®Ô§›}¸ì~ëQÆ­Ui;x ãÝ8»çK’öGYå­ÒaÛÞu|«á®¥“’®â´ü½Í.V-õéZ§3?ØŒê¦|÷Þ|¦ÕS{õÓ4w+Io>C­ÁËxuX$Ěþj;e••€JnF:ÉG¶³vî×\pkÆQî^²<Å×û½XY9–Þ1éÖ¡!FEТæ¿l¾™¯d’£• 72Iˆt–æ’Ÿ¯³›·ß?Dµž xýñFx)õl*ï½±ñ:ÊIê‰äz(ÆSSQž½CÍhù„Ó—ÌïÆÜÕHÇä/#µÇxø¿æÔctS_Ì){ù;Û‹¦­Ã0* B€p§mS/–íþƒäì6øÚm œ“¼‡CY^4m];ÿ™<²Söq4ÛÄÉé½Iœ‘wUC5«¸ŸÉ@ÅóÚÆô4¨€¦då¥îPæ<ÕoE€Å­‘a*|[޳úŒ+|nÊþÉõ¥E‹ZòÚ†P®Á½…øýº´yÑòYÓЇwbô[ãéâ¯'÷pÉåŸåS¼,æ#lôBP^°¹Á¡Þ(=ŽŸÏMÞË_™$tŠÄ3O·qýs„¤.H®‡F¢Tüc„Þ€ frU _âïi‚2åS¶¥¶¢ÆgÛÉl8‚–5ôˆËÖûí4PìšÕŒ†@qd˜M¨hýÌ\FÇm˜ÀXíš'öeŸÚÍ1“FPL®ò yýx†Ò .ÖfåœpüBtZŸç ߯èP0c’KÿKOÝá¼ùl"ÞYûHzfÛý›Ñ¡že¬ÙYùÿ[‚,: ^pö»PpÕANf®e~N)äÎöyÍlÂŒý ž™(uDrí8G­ÒÍxT¨Þ²/íÝ÷±öó¯YµÅLbß6è® ¨ã𯮭ÿ’•—¯œlÙŽkx‚ÜŠö¬\bÓ_b×Ö“ÏXqñ¯G˜>‹#‡Áu‰¬›÷A-¯k›¢¤eaݬµœ6¶çáör ý†Pл¶ü9¾«4õ)hÖ™¡® ©ãšÎ¯?%£ÒÉI9áBLýâzòÒ´^øíœÍs«“©iNËß5°xY¼nô>Ôòœ;t’ŒkÚÅ?ššâ{w¥sƒ’&uDr}8| ‹JØ;>MÐÕ—ÁïÌEõ¹“…Í«¡ ¼[òxÿpú¿7‘ÉîÿåÞ(Á__,béÉ0†Nm‰ƒ¼ ¿ÖŒx —c¼6”ûšcÈ8KFNtlÃc½ƒ¼ê)Æ*CéÕ¼îYg9žV‡»ïŧ4›Ÿ\<Äo;|qÏ<Ç¿ÇðÆØv¦&½çL¤K þYâZ1Pª9©O½7ÁÞ‚”í›Ør4ŒŽ-ùPý’Æ3ZNŸÄ0<3÷qô2rõS X KßøÇ˜Þÿÿ´ð>l»ANÊ¿$Y¬}îLÇná,X<‹—’2¸?.Ý©?¹PÊŠTüÚÝ‘I“xÕ㺇 Žÿü‡T&¥MƒÔÉ Å¡QSù<5îÔïy/aë“ÈéÑ›Fžyõ†Íc‘Çlæ¬}Ñ)щŒZ0–cÜQj #±#±ÐoomXÈ3+ÒQ µè<>žÛ#kÒèñÅ,¬6‡yŸ,aòêK˜ Õˆê0’ŽwÇâSâÈïÀê(ß­à©'W€âI@h(‘mF³hà]4 t¿±›ÿIJ±äút ¢Û¨|óòGÌY߉Vããˆ2Ÿw}ç3wuÏ­¹D®Î€_`"½ÐWÂA™¢x;äzoÉâY›è6÷.'òT‚,†]ob\‰ð3.MgÞºŒK2¡¸û@¬ŸÞùh”ð&qÌ›¼äö OâóLOjEÖ\œ ²ÔÉÍÀ‘ظ¬X±"§[·neâ±Ù¸q#}ûö-—¦šQQÐ)‚¼‰ƒšÈûNþ5]a¢©˜­cå:;kEÓT›¥›¥Ð¤CGáÛ?Â&.ûßÅY4Öï…lFëðˆr&J€¢en÷k©êºP}Z³}FÓT4ÕvN–@(J1Fò­‹ãº(ZÎäɱ,:Ó ¥Óšªæïyc ݪJ󼆦jùÏgÿ½ˆn¢ó»+yÒ®Ó$u¤²°wïÞ›âÜØ¿?]ºt¹&ÛbãÆôëׯ dXÿ®Ø|β*ìð“Pt8=ŠÎÞâàšP(r[ÞO%üæ8ü’Ÿ)9<Û$Ùæ£èwɧä2¾úºF(ØÏBAÈŠtŠãº(ZÎäÉñïÎôBéô†P”bÚ‹³çs8úÕz¶+!Ôö÷„ ‡ØôÞ*N…ô¡s˜[ÑÅ RH$7ʱùžD"‘T4Ô+œÜ·™e_ýÉ™+&„{ êÆ÷gæi`¼UŽH*Ò¨‘H$’kAñ£íØE|6ÆvØÌ:tU~©’Hni¤Q#‘H$×HñCW‰¤šÉе«é3w!ã[ø¢—{¯—kÙ†>ÄÌq xéòN<ÖáUÇ« =§¼ÍýB T€ƒ[«6öí<‡“_Laøk{‰û6/t«‰Û ª‚›!Ç¥ WʲDR‘phÔ”ûŽÂZ&û–NaÉú¼ùc|qQ,Z k,§& @½ÈîÕs˜µúgö%kÆ´¡ß“cèߨÏÒ 7'³ñõ—Xøóßœ>{™láIPƒ¶ ž0†žõ¼ò·7?ºp­Y>7›ú%‹;ypbÝÓŒ\´S—Íè}kÓ²ç<7$‘€ÞZ–V„@äfAÿA|Úêm>Ó£" 7•í+g3{Í/üu^G`ÃN 0Šû¢½oŸ“ÌI3™ÿùNŸ×S.hèd7¼r8ùåË ye;QO.`FϺxä Dyʱ jÚnÞ|ä ÖV{œe³úP·Øp¥,K$•b<5嬯ìeņ㸶™ÊÐx?\m^L"¿wÍ_KG2lIm‡Œff´àЋ˜ýè(2ß_°(Šù2‡¶ïæLÈ&?UcúQ¾}!ÓÆè©½æiš[µa`¯©Ì¸;W!ð ñB‚jïeÔó}©æaæôö¼¶ôyfƬaz;?t"‡¿—bÈ¢TZ>ôÓšø#.\Ä'ؼä ³4!¬yèŒôó+¯dÙ)t쌋Ԅ¥CÓPU5¯B„@gý¬©fÌùv{’F1bµ‘>O¾ÌØ Ël}w&SÇ(„®š@s7ûp3ØýÖ£Œ[«Òvð†G»qvÏ—$í²Ê[eCËâŸO_ä©×~£Þèù¼Ö;]cÛ$fcͤ ¬Pïç­—{R× Å…[šLKY–HʇF¢”ï1 ¦‹ó÷à&x3ñAKÛÁ‚åG°„W†Æà¡nkAV¿¡¼»hÌl‹€-éк!F¥5-Bΰí‘Í|}$“„HKXîþáÄÔ ÇUM^Qíèe,ÖŸã›æ³§Ènë‹{úæ/;D`ÿw˜ñhý‚§(P„ŽÂ¼z†&DèWòÇd²µš¸È!“Ò±ç%ºµŸRð½Fo–­M¬]‹×Òv°àÃ4½šÑ÷ÔÄE@ãàsüØç}>>8’„¸Â¾zq+‹>>C­ÁËxuX$Ěþj;eÕ8fï› ß{™ÚC–2½AS¾rlÌKDîiþ÷Ê›¼q¬-¯.AËj.…¼(R–%’ʃC£æfŒM_ªE_ü<æœä½üíEÓÖa!@¸‡Ó¶©ËvÿArv|óm³‚^“¡f4|ÂéKf ~Åbäë˜\Îüò>³—~ÎÖCÉd(è3͸\ÊBr’÷p(Ë‹¦­kçÇmOÑ0¯ äñ¢×@Ý¡ÌyªÞŠŠ[ " ÂnÆgNÊ>Žf›89½7‰3ò®j¨f÷3¨q…ïÏM9À?¹¾´hQ C^Ý Çm@bÅ¿1­]·òóò×x'n&£Zùç{)ÊSŽó8÷Ùó¼b¤ÿ’qÜäVÄ#eY"©<84j®½7rcÐû†SË~ýãjH¡á'{ì“*”´VEè ¸`&׺†Óò¼u „5¬ÜÖ0nbé]ždÊð׎±nò¾Í D5£!Pб¹…y­dŸÚÍ1“FPL®òÍYz¥é ¹Ñ8ÚÀʯ’ø ®7QÚ9Òj¶§KÍXj‰¥¬Z²ïn óHæøå‚^£ðk͈j1pù8ÆkC¹¯I0†Œ³dÔéD×Çaöˆóu¾/ÊÅCü¶Ã÷Ìsü{ì?løˆmgjÒ{ÎDºÊÕ7¥ZëÌàUO1VJ¯æµpÏ:Ëñ´:Ü}o,>zo‚½)Û7±åh#Z0ò¡ú%g´:œ>‰axfîãèe몉c„@ÑÐiü›L>?”—'N"ôÝÙ ˆ¸yrÜÕ‰¤MÁÖƒ—gž`Ðç0áÝ,{¤!žÅ„+eY"©¸TÈá']õv¼ðá»$,^ÌÚ?`ú‡ÉÕ\©V;Žýr1ãF½aóXä1›9k_gtŠF@t"£ŒåÁ÷Ò­PPüh?æiz½0¥Ï'Ë=ÖCÒµ_?fLLáÕ¤%Lú*4 ¯ …å-5;b ýæðÖ†…<³"ÕP‹Îãã¹=²¦ã0ã|ЫÊôxVGùnO=¹OBC‰l3šEï¢Y {©7Š“\-F=¾˜…Õæ0ï“%L^} “¡QFÒñîX|\‚è6jß¼üsÖw¢Õø8¢‡Ìç]ßùÌ]Äsk.‘«3àG§H/ô@v*2Â-”{ž›Â¾‡Ç2ë…Hxgp9Êq~ª¯FC™:l+ý—LåýNKy4º˜p¥,K$GâåòÁäÜqÇebÜlܸ‘¾}û—†¦j¨…ºÀ¡lœ¦i*jþüRhâ®e§&tùÚÑr EgU˜–¥¿yQEAÂ.\ëoBA±Ñ²ö÷'aÊ™jF¥ ]šj¶ÛªÝ:l¢”Âý.)„}ÙÚýê M­Kl·þfûŒ¦©hªm¯_Xëùfä¨òâ¸.¬u€@Ñ)ÊKŽ‹†›'‡R–%·2{÷î½)#6û÷ï§K—.×d[lܸ‘~ýúõ2 ëߛϙ@V…ÝQØ‚E”´À\]±7”"?Ú_—°—®³{‡YèEW(_öß%×NÉeé¨M8©o¡`_B(YaNq\Eë |äØA:ФWʲDR™¨Øg?I$‰D"‘”‡FM¹“ ‘H$‰Dr•84jtÎÆ]$‰D"‘H*røI"‘H$I•@5‰D"‘HªÒ¨‘H$‰DR%FD"‘H$’*4j$‰D"‘T ¤Q#‘H$‰¤J ‰¤$LÉlš3‰ç×#»¸]ÃÍ©l]9Ÿw~:‹Ij)‘H$åFÕ6jÔ Nìþ…_§c–/ @ö_,Ô>s÷pE-E£0_`ÏæïØq"sqg¡äžbóŠ•|ñgº4jnRŽ%I)qxöS¹ï(¬^à›IƒyöûËKBçEPh(QÍ{0h`šÔp-ÝÁpYYüÔDö÷_ÁÊû“y%Uõ,†÷dê~ûC¡Á3óÞàYêÓ’5MÃöèJÇ÷¨Ö{4Ÿ{ "åX"‘”1ÅhYÞÝ¡\ÒΤ:€c›cÌ8Ç¿ÿüÉÍdèÚÕô™»ñ-|Ñ—B#ªªù¦œ6*©¨h¨f3æÐ‡˜9./]ÞÉÈ:¼êø¢su¡ç”·¹_ˆ"§-Kn4RŽ%IÙâШqv*mY i€O$ͨ®@7z÷½—GfÖä×h¶b ]4ޝ}š‘‹¶sê²½omZö|‚ç†$`£).@«E–Ïͦ~ÉâN¾(¦T¶¯œÍì5¿ð×y ;1tÂ(î‹ö*u^Rñ‰ I|¼µíX‘s˜ýñi«·ùhLCŒŠ€ÜÚ‚£°s’ù!i&ó?ßÉáóz‚bê |çá¦ÊqâQ^è9ŠýWðÁÃḠ0\Å€¾ï9w/7¹Â7o¼ÄŸþæô¹Ëdc¤VÂ=<Ø^aÛçÿcë¡óˆê‘´0‘çú4À[ ¾DRéqhÔTœ‘@ËtÆzy€•ƒW²ì‡:ö¢Zã{õ|_ªy˜9½}¯-}ž™1k˜ÞÎ/ÿ…Øk*3îÆUO¾ÌØ Ël}w&SÇ(„®š@so@¨ìhªª¢æyc„@gý¬©fÌù#¬NÚ‚›}¸ì~ëQÆ­Ui;x ãÝ8»çK’öGYå­Òq³äT³ÕvœQSQÍ**€ù2‡¶ïæLèP^|¶!†Ô]¬˜µœ;kÑuè0^âɹ—ðÆÜg©÷!ãQ¤àK$•‡F¨°ny!¤ ú•üq ™l­&^Qíèeý9ÖŸã›æ³§Ènë‹ÑzÙÝ?œ˜zḠKÞ´´-,øð G¯fô=5qÐ8ø?öyŸŽ$!Á“ [’Ò±ç%ºµŸRð½FÓ×Ý IDATo–­M¬]‹×Òv”Üâ øêÅ­,úø µ/ãÕa‘¸+krø«ì”m¦”Ü9&ÃY<hàÑ‚¶-c1*ͨuæ;ú,§Gß»i㥠šºóëæ lÝ~†œdJ$•š î©q€Ó˜s9óËrf/ýœ­‡’ÉP<Ðgšq¹”…íTg–¡«ÂÊIÙÇÑl'§÷&qFAÀªYÅýL*žU|YØ-@Ý¡ÌyªÞŠŠ[ " ÂTø6§m!®ðý¹)ø'×—-jaPK›Š4‚¯– Ç¥ÇòŒ®Ôˆ¨Ù繘 Â[ Üý©í {S¯ ÊIÞI¥§Ò5Ù§vs̤€8¾†q“Hïò$Sžh„¿vŒu“§ð­Íý¨^”b6¡b õ3sk´Qcc`µRM\”TpˆëM”vŽ´šíé׆Çz3xÕSŒU†Ò«y-ܳÎr<­wß‹\qË TsÒôÞ{ R¶obËÑ0:F´`äCôKÏhu8}ÃðÌÜÇÑËÖ•>’¢Ü49¦c·p,žÅKIÜ€îÔŸ\!‘ܲTP£Fw`u”ïVðÔ“+@ñ$ 4”È6£Y4ð.šº[–]×éÏŒ‰)¼š´„I_eƒ¦áâD£0ëR\Åöcž¦× óXúüx²Üi=´!]ã"hôøbV›Ã¼O–0yõ%L†jDuIÇ»cñ)ÿí’2ÃXr[p ¢Û¨|óòGÌY߉Vããˆ2Ÿw}ç3wuÏ­¹D®Î€_`"½ÐKÏ 7[Ž}ˆð3.MgÞºŒK2¡¸û@¬Ÿ^Îs’HnA‰½Ë|sÇw”ÉPÌÿ³wæá5]{~×>ƒ““‘H I)‰˜Å<·¥ÔTc'Ó­5¶´:jõ­¡·Æ&T¡Z·ÕI[¾*墷JÑ"´(‘y:{œ2œ!Q4b½ÏsGÎZ{¯µ~Ãþí5nÛ¶Aƒ•¸—¦ßÖ6œ ˆ"…Ö4µè’N@åÚÚLëÒÞ‚—7¡(×6]+‘W(èäšÎ;Mµ âH–ÖIÀZ1Y;ÕÛo…óhšŠ¦ž‡!lºu+jtçr[ìXU­sj ÝCQ„°#kMÅ¢‚¢Sl÷·¯ÉÝÌáÇoÉÜÚ£GÒ­[·Š-¶mÛÆ!CúYX×>f…¾gÙåó˜@(ºRm‡.„‚ÎiBáp3A×y%w"ÎuG ØºS] ÅUH!uÇ%·ÅŽÅÁ=ìȺÄ}ìëƒD"¹3±»rY'\"‘H$Ɇ܎E"‘H$I…@5‰D"‘H*2¨‘H$‰DR!AD"‘H$’ j$‰D"‘TdP#‘H$‰¤B ƒ‰D"‘H$ÔH$‰D"©Ø jÊÃŽÂI¹ ?¯Ìà¥Í¿“ãh×pK{Ö-â½ï/‘/ÏR”H$’¿ =5Ò3ßVÔLÎÜÍîø4,²éo-9ÇYüx.ð O ÅOIáäÏIʵ¼øŒªZÊE»ßùh¨ –š0wJsd=5Yj ã0/nG4üÃÛ2dÂ$†FùZßÂ- l{ëU–~’ —ÓÉÁLPóÞ<ÜAaïÖ/Ùs"Q%ŒöæñÂÀxéÄåÈKbߺùÌ߸›ãÉ:üvaä3ãéSÏj»æ®“\¸”NŽð  A;†?3‰~õ=¯0|zé0Z/³~o:ës–wñA©`Nÿ¶áJãfͨR¸;FDn<‹‡>Î'­—ðѤ†˜á\vö®›Àw±sY´õñÉzÂëÀ |–9!—sŸ¿Æˆ×÷QwÂbf÷«ƒ{rWx;vçì‡Ó·lçÓ-è}jÓªßÓ¼0"šjz–$v-›Ã’oqúÂU²5OZ=·’wzbö/‘”‰òÙS“q˜5ŸÁØv#›ùb,ô`ºpåp|Å8FŤÒnÄDæÖœølóÇŒ'ëƒFÕ5¡XÒ9±ï kŽä•çbJú‰5óV3û@ÝGŽâÕ\ÞÃÛ Ÿ§jäz¦64ßX‘ͱØñ<gfà„טΞ•s™5I¡æ†gha²]³Æ^|öÌi§ùöƒ¥ük’žÚ§ÓÂæ ýûÏbv¯@ŒBàQÃS4MCUUÔ}í»¦Z°\› ïBv•Š_7“ƒÿÔM*í†Obt½J\:ô9±GÀývÕíNCËæO^áÙ9ÿ£þÄĔ»în²cAå¨ÿÒ *»[¸°o sV¼ÄÜð¼ÙÞ%…Ÿ¿ÝÅ©ª2cRc|Ôt”zUÑKû—HÊL¹ jòSNr2C#°qèõ7¨bh©ûY¼úÃbx}d8S«P²‡Œdå²ý<4·¾¸‡¶¤]«ÌJS‚.î`àê`zêE[OÑÄ·?Þ}ÉmŠéòTJÛÏâõgi81މ½«cx™?`ËoãhÞH³]³Û4Ĭ´¡e‹ìýçv¾:•Eó0kÜü‚ ¯ŒQ”ƒÞ²;C¯r_‡™×ÿ_u«6N$¢˜Æk©.dYÔÔ”=,Ûr‘ á«xcTnŠ€èêıŸRdö9ü£§S{Ä Þ,ÐÜ=vìY·=ÝêÚ*áÇ™¯åÓçÉiçƒ@ÓðkCç6˜¬½Š·K>I¢|?©½ãmtrs2Ç“&mjaV„áL»&ž¬:ø 9mñ¹6v ¬¿ #UC+CN2)9 ¼ÂÍÚ>p8)µÈ$ÏÒçÉM<Âéœ|ν9€èÙù5T‹ŠÛÅLÔF…¯iý˜ª×ßÿp᪥б:3éÍþ:uF²àÙ–x)(•ªfRÅfpº”]dÑôy‰Çø#χ–-ƒ0Ùô¡H™9Ã/Š6Æ=ìZ=‡÷"ç2¾µßµa•»ÃŽó¸¸ûæ¯ØÊž d*îè³,®fSdó QPV©LÉb7¨ù»Ñûd„9K¦Z£ÈðSqŠÛ¿àl­ŠÞh@[hy®“Ôü¿Ç’Љ6Ï-db„¹Ð–Àì_½H+Yn½ òlËŠ­õ°¾ ÊW´›€GMDFšSã Xt)»ä¢é òK³\b¥zw^|û)v½9‰×'?AÚKx¾³‘ù"ÙŽóþØÈ”i±¤u›À̧á§ý·/Îä[Gí%‘Hn˜ò¹£°gƒºW&óÛ%lü-ÓîžFÿ„SùiÏŸd8©Ü³üp0 cp*•¶ûöF"ˆ¢y ~õ©¥ÏæT¼ 0´au >¡y–"nÔ™ð1AFr¹$ø&qýmZ8éý*ì„ͦ„Fÿ†„ÓøñûÓdþÝsÏî:s}^an/ÿ>|KVA=z”nݺÝPl±mÛ6† ÒÈ2mŸŒBß³€ìò9üt kãìmFÃ¥ø%ÒOs#y\•Å^z;÷-/ÇSÜáEçDgÊ*;¬›=W ¡ ¤¸\b_%ePÑí¸Ìõ“H$7Dùœ(,‘H$‰DRFdP#‘H$‰¤B ƒ‰D"‘H$ÔH$‰D"©È F"‘H$I…@5‰D"‘H*2¨‘H$‰DR!°Ô”‡…%‰D"‘HÊ‚ƒžy*‰D"‘H$’; »AÍ]»³m~_/˜ÁK›'GÆu(NX’سnï}‰|©7‰Dò·a7¨¹g>ÜVÔLÎÜÍîø4,e©Šå ‡¶ï`ÿÙ,,7³ r޳øñ \xˆ õoÛ;²Ê¢4:‘wžíkÖñÙ¯i2¨©ܨÿø+H!‘Üìžýt;²tˆå<ë‡âíìÛv83þ³œ~þzÇçWgÿÆòg§qtèÖ…–í$\MÓÐì ¿©WøfÆpžÿ¿DÛƒ«ÞÕjÙéA}´7ͪ—GqÿFMjTó@'Ï«»µ¨—øxt?f-©? žÛÂû÷—]u¢HÕ–FÃþ9±w1¹‰ì[JìÿãØéD2qïN#:ô}‚§ûÖdz¼âøüÇ #}„DrS°Ôü­=5JU:OŸGíT KüºW˜÷K¦¼ÜŸJ BçE˜ÎåcCU-7¹y¤^L$¯æ0æLÆKÍàÒÉÿòѪ·ùçîßY;–>-CMúÍ\B_!äÉÛ· ÕbÁRóæNiާNØd¢Ã3ÄÑ eqÑ2²tì“Äu#ò>ŒŒšÂÙ_äøU¨póý‡ ¤Hn å/¨FîiŽ?Y˜·›ñÕiÔ¼fí*×/`^Ü.Ž$hø‡·eÈ„I ò-ò–szé0Z/³~o:ës–wqçì‡Ó·lçÓ-è}jÓªßÓ¼0"šjz׎DÓï0š4mB€VíèžÍƒã>cӱѴh‘ËîåsYòÍ!N_¸J¶æI«çVòÎ}Y¼7ìq>i½„&5ĬPS9ôáBæÇíâðù4t¾ üæB&Dº£ä'±oÝ|æoÜÍñdþ »0ò™ñô©ç)ßâJ‹w(›5³Ê©!¹ñ,ZLyNÚÛÞµsø.v.‹¶ >YO@x¸¢¡“£EѲ8²b&1G}°`SZú`°õÊhÚ@¬'ZÛäãTYÄú¯Ç|Å¡Äl4S'¼Ãì>50Š<þØäĦ- l{ëU–~’ —ÓÉÁLPóÞ<ÜAaïÖ/Ùs"Q%ŒöæñÂÀxÒ—þ£c.ۼƲ'8—˜JŽÑ—Úxäé§x°¾Í6-IìZ6§¤èˆÁ™]çų¤°^Šl'u¾½b”Hî$Êß𓵶·ëëÿ"B9Ǩ˜TÚ˜ÈÜz‚Ÿ-cþ˜ñd}躦k…üûÏbv¯@ŒBàQÃE*G=Èø—QÙÝÂ…}k˜³â%æ†oäÍö¾¥ìf¶•C@`t÷Ä@™Ù*X®òó·»8UõQfLjŒšŽR¯*zqMµ`¹¶R>—“«Æ3bY­y’5öC\IÁ;°Bds,v>ƒ¾õ«ŒnዱPÀPÔÇ8—Aãä8¦¿ù%æÁ“YÐ>ý• ¤WƀιM[Ò9±ï kŽä•çbJú‰5óV3û@ÝGŽâÕ\ÞÃÛ Ÿ§jäz¦64;öêïü¶çGþ ÎŒIá¸eþÁ®äõá¿’ºv …š–>À…ž™ŠêeÞÎê,‘HQ^{¢¥îgñêS ‹áõ‘á¸+‚N­BÉ2’•ËöóÐÜvøÚÒºù^?£¸îD=ë¶§[][‚?Î|ý(Ÿ8ON;Ì¥)€šGnN6y$žØÃÆo&Q׈ÖwGˆ$Ð4<ÂÚйMf[ï@Ñ0DKÝÏ¢U'ðú³Ç܃»rýÁKê¯?KÉqLì]ƒ€¨ÀËìø[~GóæüÝ1çÁ¡W¹¯ÃÌëÿ¯:€U'QLãµÔýÎÛ;²h÷‹š²‡e[.4|oŒ ÃM]ø/ös@Ê¥ù)'9™¡Ô¤žNº]É Âx‘d‹;‘ÑíiåN4Áúr ¸¶i ÜC[Ò®Uf¥)Aw0pu0=õ¢­§‚hâÆÛŸaϾ‹ä6Åd»T ÿ‘[p­h:whˆYiG§ Ð GÌòŸè÷F4^`×ú½s=kTTÏ,©Îê,‘HqÇ5¹ ‡9™ãI“6µ0+ B€p ¦]OVü…„œ¶øØÒ °õðäÎãâb+{N$©¸£Ï²`¸šM©·<ü:=»Ì²~×4Ì¡íyrþ4zW7 ò nl½§£¯Ü„CœÈö¤I›Ú×êP@NâNçäsîÍDÏ.ø«†jQq»˜‰Š‡Üº4ÔÉ‚g[⥠TªJ˜IAäM–몽#‹¦ÏK<Æy>´l„©@vB‘{¨ô¥Xïb.Ç—?ÁSß5e~ÌX깡ëC o±yOæx÷ ÜŸn÷øÚœWimºÀ&T ­ 9ɤä€ð7?jûÀᤠÔBÂKúÂײ~tž÷po”™;Bbn+< Œ³˜pi׊ÞÁTÏY%‰#îX)îh„€ÂkT¬¿kE£äý±‘)ÓbIë6™O7ÂOû_œÉ·e¹qèpÞz¦~žÞT®âG57tŠB™p¨4нèĒЉ6Ï-db„¹ÐÃ@`ö¯L)¦þH&Áè߀ãü´çO²×Ã,äžå‡ƒiƒPI òLø˜ #9 K!¯”}f?'òë2et_:/¼Û ]_МmNáY›FQ‘TÑÝøÛ¹±Z8µôkùiÏ9²×·ÖÁ†Á¯>µôÙœŠö®ƒ{‘y®Ò™•žÂsŸã²½sŠê„Ñ¿!!ÆøñûÓd6‰ÀCÊÄ1žÜÕ—]Ÿ-aÓ#QŒw/1Ñ]£t:/ôž„´Ìó­{ÐuÎ0žŠûcƒfP¿6íšb…ÒÙ÷vÉý“½¿¤a¨YjF°ØO沎¹%Ëä¨ÎÍ<„œW'‘8ÀnP£Ó•ß……W+Æ fèûÓxÑí ¬+8þÙ2Vœ«ÅÈY­ð DÕ3±î‹XÖF ®v™Ôêè^=‚ ±‚ 1›ðº/ŠZî œI/´‰Þ‹@/A⾯ùát-:‡Ú[mTð°ü uðmÃSñØê)LÕFÒ§q ¦ÌKd†t¡{X[žÈð Ï2YIÿA¸e_âLj½ŒÀ[.º©(•]´w hɸGB;•‰êhF×Â#ë§Óm«ã$×Þ´;žû¦³dÄãÒ—µ©ªOãðñ´kvçJæÄlÞ£V sîyħ¡yøá¡c  ›¾øžõ­W½¼cËC_.¿}CìY?½ØE€ƒ Æ¥žKŸwá;‡u–H$޹‡ŸLÔõ.ËÜç³`Ó[LLÔ¨V/šñ‹'óp¸›uHøÒaÒtú¿ü.+^šJ¶›?mF6¤û!Ìž–ȱ1Ìø"4 ƒgjÙ–îê¸oü0¾yí#lîBë©‘¸ß’7q3O-c©ïþýñRž[“†j ¢ëÔfÜVFc—³´òÞýO /Æ]%ßT™ºÇѹWÞÒ©ÝdÌÎÛÛPR'êXÄJŸE,Œ‹å…WÉÓ™ðõ¤K˜'zÙsS]•ö¼¼~%Í—/gÓw«yc] yš÷ª5hÒ®~zp!CÒ1¾~?ŽŸs@3á×  ϼ6Œº&]ÈPç6}#(üG}ÛϦ4þ»ú_|`Á7¸ Îy–1Ü] A»Ð³b©óœÔYj˜Dâ{öaX·n]n÷îÝoËpǶmÛ4hÃ{iªU(º¢Æ¬i*êµy E)>d]Ò[ðö,Eˆbùl¿ åú~¶ß5¡ +æ¥4Õ‚JÉ¿¹§Eµ“×þß‹—E(ºkޱD9í”Gbçr*,Š´·Ð4MÕŠL+e[u× ¡©ªæÄîp"ƒ‚ö¿ž¥Ðälç6mGÞšŠE¥O±§vüGÞ) ~„-ÑKùxRëÊ·rwä\Ô±x>u–Hn%‡¾%ûÕ=z”nݺÝPl±mÛ6† ÒÈ2mŸŒBß³€ìrßS#Ý7.!œ’ »sºÌ'çé¨,Eîi÷âöÿî¬,®ë'q„s9•]ötB!åSJB.{NÊÀ‰M:Íg»w y—HoO'ìûëåÑ9šùWe-–ÏE%‰}äê`‰D"‘H$‚rßS#‘H$åc(Onúž1r(X")·È F"‘HJ…ó¡%‰¤¢¡i—’.q5í*ùùù®3B¯Óãíå_¿Ûº‰ j$‰D"‘”àròeò-ùÜÛé^¼<½Êœ¤¦¥²wß^.%]¢ZÕj·°”E‘sj$‰D"‘” %5…èÑøxûØV‹R¼½¼‰nÍÕ´«·d%•#dP#‘H$‰¤ùùùxyyÝp~ooï2[ýUdP#‘H$‰Ä.wÚñ<2¨‘H$‰DR!AD"‘H$’ j “ŸÀ× fðÒæßÉ‘‡J t:aIbϺE¼÷ý%ò¥ÞH$ÉßFÅ jÔLÎÜÍîø4,eyÈX®phûöŸÍÂ"\®˜ägñã=¸ðj)d\È;Ïö5ëøì×4ÔTnÔH$’¿ò·Oå<ë‡âíì?s™ñŸåôó×;>­6û7–?;£C×°.´l§õjšFác P¯ðÕ¤~Ì8ñ–m|–¦E×Ì:ü}Ç|Iƒ761·ƒ/:êå/7àuþò4/{ˆZFqsê&qŽz‰G÷cÖÑ’mÜà¹-¼¿þ5jR£šºR6²](‘Fµ¥Ñ°Nì]Ln"{ã–ûÅÿ8v:‘LÜð«Óˆ}Ÿàé¾õñ,o»ó–Ò¤íšB·gÑõ­u¼ÚÚ§˜>årråH†¼âV0¬¦¡ŒZ¡’þÛg,~w _þ|Ž”\Þµ‰ì6šF…ðíèÁÒH$v(AR•ÎÓçQ;Õä¿îæýÒ„)/÷'¤’‚Ðyæ£si¬ªj¹ykãZöi‚aú>>:–&-< –›ÅÑOvhjÅŒ(oÛi½¹œÚò>ÿÍ5¡ù€µÇz0­‘ÊMª›ÄªÅ‚¥æ#ÌÒO°µ§ÏtFýf.¡¯(wجþ;-ó(KÇ>IÌQ7"èØAÁø¨)œýõGŽ_-ÈŠkÿa!õÏKäZ’ÙúvÃÖŒ&ÜíúËŽzé[æ½’¼¼j$¦ç£i†2°­¦üÀëãßä+÷öŒš0‚zž¹\úãW~S|0륑HQþ|Š0pOsüȼ݄ˆ¯N£æ­ˆ0[†Ð®rpýæÅíâH‚†x[†L˜ÄÐ(ß"oK§—£õ2ë÷¦ì³°ö IDAT³>gywÎ~8qËöq>݂ާ6­ú=Í #¢©¦wæ>MÐÖ}ß}r„´æ­ð.ðPGÙ²ó ^úåe}€j釸àËD<=‡._NfÙʽŒzë^üô¥¨›|ÐÞ¼CiܬU +„ˆÜx}œOZ/á£I 1+ò’Ø·n>ó7îæx²ÿ†]ùÌxúÔsð–ž›Àw±sY´õñÉzÂëÀ ª(Š–Å‘3‰9êË€+˜ÒÒƒ­WFÓb= Û&§2È"þÓwx=æ+%f£™è8áf÷©QäñÇ&'6mI`Û[¯²ôû“\¸œNf‚š÷æá {·~ÉžɈ*a´66À«¾”ô>\ïTÊçêŸ)`¨†×Ù8ïêÇü®~XÝH¿¬YÎ^€™4.eX€Lö¿ÒŸ§~îÁªuc¹ÇMAd`zŸ‰ü1:ŽUa*—?KÙFf¼âÏþ«ntíyžháiõkZO4[›yH?"‘Ø¥ü5`}øX¿\û—‚ Éáxì8FŤÒnÄDæÖœølóÇŒ'ëƒFÕ5]›(äß³{bž(BP9êAÆ¿4ˆÊî.ì[Ü/17|#o¶÷u:L%¼£Ôɇí;¶pðj :øZß„Ò|ÂΫU¸¿oC<„T’w¯á[µ=ÿúG"ÚóüZ¶]èÈК[ÕMrÓÐ4TUE-pîB ³}×T µ a6ÇbÇóTœ™^cr@:{VÎeÖ$…šž¡E¥â×Íäà¿Ç0e“J»á“]¯—}Nìp¿]u»SÈ8̚Ϡoý*£[øb,0}è:—Aãä8¦¿ù%æÁ“Yоú+çI ®Œs›¶¤sbßA.ÖÉ+Ï7Ä”ôkæ­fö ºÅ«#<¸¼3†·>OÕÈõLmhvâ? WÎBjb:Zèž­»——}ÄÉv£©ï¦ ]ÚÁ¢-)´7ó’9$§çÞÔíÔÝ—?q4Eå7…œ?÷s8-ŸË{ãɈQdqò‡XꌥIH>ÕŧØúçu'ØM)äqá#%’»—òÔ8AKÝÏâÕ§Ãë#ÃqWZ…’=d$+—í硹íðµ¥uó &¼~0Fq݉zÖmO·º¶~œùúQ>=pžœv>˜ÞÙÈ÷ãÿùGlþ)…v« #•Ÿ>ÚMjàCô­g²v/çŸç‹µ?âÑí]šyëqo9„û|ždý'ñô}²¾µg@rë9ô*÷u˜yýÿU°jãD"Ši¼–ºŸÅëÏÒpb{WÇ *ð2;~À–߯Ñ<²h÷‹š²‡e[.4|oŒ ÃM]ø/ös@жù)'9™¡Ô¤žN&0¹’A„ñ"Éw"£ÛÓ:Êh ÛpŽâÚ¦5pmI»V˜•¦]ÜÁÀÕÁôÔ‹¶ž ¢‰?n†=û.’Û “íRöüÇõBçr%ųÑ?FÄÐVþ8ˆ7Úš‰ßü>¼z±¢Km¾\¥òsr|ðjØ…{”9|÷k}¼H:ø_Бwt7§³Úá£? ~¨)þµüymƯL=“~»VÑö¾ ~è¢k™Ë4GP"¹Û¸ã‚šÜ„ÜÌñ¤I›Z˜!@¸Ó®‰'«þBBN[|liØÞ^ rçqq÷Ì_±•='ÈTÜÑgY0\ÍFµ{·¢˜êöb@ð–lØMB‡^¤ìaíî ê¹Ï:– äœÞJÜÉ@ú¼X7!ÀÎC±yËÇ{tM=å›Ôm¡ÎH<Û/E€¥RUÂL ¢ØŽÝ¹‰G8“Ϲ7=»à¯ªEÅíb&jdÑôy‰Çø#χ–-ƒ0Ùô¡”i¾Ä]ƒj@oPŠé|.Ç—?ÁSß5e~ÌX깡ëC o±yOæx÷ ÜŸn÷øÚœWimÚê„0R5´2ä$“’ÂK Üü¨í‡“2P M/é? ×-‹ä p v§R`žè²‚‰+¾æ\xub?J ò‰Üã™Ï~3¤'ebÑ4 •£¸74Ÿ˜ïâÉlÂÏß] ì±áã¾â‡?shhÜÏÞ$:´¬†A˜y`:ààŽÏøhs,ã7ÅÒlÔ\ÞYd˜L"‘\çŽ j (îh„€ÂkT¬¿kE£äý±‘)ÓbIë6™O7ÂOû_œÉ·¥½©¡6=‡F±ô|u®+÷î‹c?Íx¥k ÛXú±Í[ù3ÿ2ËéÂ{ù4 5™õ??Iã¶ÅWIHn 5iQhNƒ‡“%mž[ÈÄs¡‡¯Àì_½H.š^Ñ¡`!¿4ËÁïrô>Á῜%S­QhøI#?=‰äËiä© ¹ÁÍa 6ÓvïVÖ®^ÃŒkØ0z ‹‡‡c<[v›Ö r -Ñ×c2€šïÜÁ’Ir&¸ù˜Ð /š?6€À‚w=Ù%:³àÞêô—ñ5Cæåt,:Út®Á¼ÍÛ9y¹5_¨Lç ]ñÙ»–÷] §a;¿û¶æÅZ•®õB<‚hþÀ(šõÌ åO0"fë:­âŸuLÈN_‰¤$wÜ>5Fÿ„SùiÏŸd8¥Ü³üp0 cp* „΄ 2’³°zóÊ>³Ÿùu6º/¢ÂiÙˆ0ï¢='B€æps ÿŽÃèh>ŦÍÛÙ÷+‡Ò¾ªu餖vˆ¸o“©ýÈV¾÷«b >sœÉ÷›ö“,7¾¸M?5Ö~*ƒ_}jé³9/ ­CX‚O(AžÖ˜¿°NýbLãÇïO“)÷2rŽg#wõ%óÛ%l:žiwÏÒÈ@ ôž„´Ìó‹×±øAÇ}ȱL­T6íšb©ø"¨Y¤di˜<*!cpoF6Må»/NÔͼ„¨„‡Q#ýr†5¨Á@­®šò=~ò1?»·¡]Í@ZÝȹ/>å£ONQ­{Ꚋû$EçÅ=í›QUKàׄ¼2ÕN"¹›¸ãzj„W+Æ fèûÓxÑí ¬+8þÙ2Vœ«ÅÈY¶UI†¢ê™X÷E,k#PW»Ljõt¯AXÁ†˜MxÝE-÷ΤÚDïE — qß×üpºC=Kôªïf<Þ»n˜ÅjKu†¿ÞÄ:ÄÆÕŸ6³35”öЦQíÂûRäãÙ+”–|È®Ëé ÷(/(•Ûòä€@†ox–ÉÊHú·Â-ûgRCèõ`Þ%t¢%ã eHìT&ª£] ¬#œNãCxÓjìtzî›Î’slH_:DÔ¦ª>ÃÇÓ®Ù+˜w²yJpX5̹ç9Ÿ†æá‡‡Œ.lúFpà?zFêeU³¹š s%ëÖÂÎcÇÐ'.…N}C¨¤@»Y!'åêµÝ¨õ5ºÐ¿îæÆ^Âè(B*0vºŸ‹³F dÔË¡˜„ ëè fnÊ¢~djù{!Râù¿µ[¸¤oDû`“î”HpÇ5`¢þ¨wYæ>Ÿ›Þbb¢FµzÑŒ_<™‡Ãݬ]²Â—“¦ÓÿåwYñÒT²Ýüi3²!݇ aö´DÞˆaÆ9 i<hT˶tWÀ}ã‡ñÍk±`sZOĽ„÷p#ü¡‡i÷6G£¥˜­XMfϦÿ’YçŸt4ÛÅ@N=¨³ø]âv\ çàš¥S*'˜i4v9K+/àÝÿÄðbÜUòM•©Ûq{Eàm(©õF,b¥Ï"ÆÅòÂÆ«äéLøúGÒ%̽|ÚAW¥=/¯_IóåËÙôÝjÞX—Bž¦Ã½j š´k„Ÿ^ \ÈÀtŒ¯ßã§ÄÐLø5èÂ3¯ £®IA2Ô¹Mߊÿé͵Ý_ÔÒsÀäa¼ÖÝmÌ /i¥`‘£{%¸˜Dz>øé]u:õà­]æ¾î!˜„@ ìHï°ÅÌËëÅýµ(BÅ¢øâye;k®%)[C3zQ£áýLyg ½˺‘ŸDr÷`Ï6 ëÖ­ËíÞ½ûmÙë`Û¶m 4Èá½4Õ‚ª ]ÑɆš¦¢^›× P”â“5­Kz Þž…¢ Q,Ÿí7¡\ß/Ãö»&t­5,Š¥±–UAgwÒŒ-¢»ö¶ç¨n’¿†¦ZPq$?ëÔâò-¡…·£𦢩Z‘i¥V»5ºÓÑÐT Usbw8‘AAû_ψRhr¶s›¶#oMÅjŠvgO'ìûÂuR-*Z!{¶[s›OPt…†”4‹ª!Ý5}Ñ,V½–NÓP5µhï_±z½‡ô#’›ÇáÇÑ4c'Ž1°ßÀ¿ ÄmŽ#<,!G¥[·n7t½mÛ¶1dÈþ@iûdúžd—ûž¡èì¾q ¡ sú*&P”’ \æ v²•¸¶ÎÎE•ÕQçé%7Š+9(ödçL/ìè„ B ¯”„"\êºC¸°Iç6mGÞ%ÒÛÓ ûþÃy;©ìé¢ò ]±tB ”RÁ¤‘H®sÇM–H$‰D"±‡ j$‰D"‘TdP#‘H$‰¤B ƒ‰D"‘H$ÔH$‰D"©È F"‘H$I…@5‰D"‘H*2¨‘H$‰DR!AD"‘H$’ j “ŸÀ× fðÒæß¯@wW£¦ð¿¸wy÷«swo{”F',IìY·ˆ÷¾¿DþÝÚN‰DR¨˜AšÉÙƒ»ÙŸ†¥,ËmßÁþ³YXnæ‘Ë9ÇYüx.Nm/û7–?;yß'‘_ÆÛkš†fïêê¾y®-¯•«3{?ÊÓó6sàržóò(nø×¨IjN¿+¹œ\>ˆíŸæëd‹óûWwN¦u›a¼ÿG.Zñò8i/MÓpϨWøjBgš÷x“ÓÕeÉ:ü÷µíÊä﮸všAvÖ²\âã‘öõçáÿ$’/Ê. ‡:Q$jK#Ÿ %ÈMdïꙌÚ‡v­Ûдõ½üãáIÌÚü+iå!È/Î_ÕÁá–øˆRÞ«”õMÛ5…è6=xá‡;vœËɕТÍ#¬9ëÂÚE%ý·O™3~]:´¥it':÷yŒ§í"1çÏ¿þLÜ5”¿-•ªtž>Ú© —øu¯0ï—&Ly¹?!•„΋0ËÓhUÕ‚vS{òH½˜H^ÍaÌ™—šÁ¥“ÿå£UoóÏÝ¿³$v-}ôöËe¨I¿™Kè+D±“~ÿ FªGÖÁ˜û /äp¯¯Ùzzoöo,™ò?F<Ç;O4À¬ — ?Ÿ&ǽ «èí–ç/µ—âCË>M0LßÁÇGÇÒ¤…g¡“„³8úÉM­˜å]ªS¬ÿšì4T‹KÍG˜;¥9ž×NGÖáâƒÎh¸²8BË<ÊÒ±OsÔÈú0fP0>j gý‘ãWË£²róý‡ n‰(ý½\××Bꟗȵ$³õí8†­M¸ÛõSÁÕKß2ïý“äåU#1=M3”8MÜjʼ>þM¾roϨ #¨ç™Ë¥?~å7ųþæ<$wåϧ#÷4Ç€,ÌÛMˆøê4jÞŠ³Õˆ„v•ƒë0/nG4üÃÛ2dÂ$†FùyË9½t­—Y¿7õ9Ë»¸söÃéŒ[¶óéô>µiÕïi^M5½k“Ð4À;Œ&M›PE' U;:†góà¸ÏØtl4-Zä²{ù\–|sˆÓ®’­yÒ깕¼s_ï {œOZ/á£I ­†šÊ¡2?n‡Ï§¡ómÀà72!Ò%?‰}ëæ3ãnŽ'ëðoØ…‘ÏŒ§O=Ï"õs iFm±ƒÃ§ÒP˜Q€ì“[Ùòc< ñŸðë#÷ÐÄC Ô4NND7§¶I rãY<´PyµW;«“»üùó<ðÉe®æ{àß ß™D¿ú…Ë"ði:€¶î{øî“#¤5o…wGË8Ê–WðêЇ(/ ?6¹–AIÙù”* º†w(›5³ÊéZ1íÔ]礽í];7ïbç²hëâ“õ„×+:ùªX-‹#+fsÔ— V0¥¥›5m Ö“°mòq*ƒ,â?}‡×c¾âPb6š)€ŽÞavŸ… }²$°í­WYúýI.\N'3AÍ{óp…½[¿dωdD•0Ú›Æ à¥s¢ƒsÙ¾à5–í<Á¹ÄTrŒ¾ÔŽèÀ#O?Ńö`Ibײ9%}@ï@ Îì:/ž%…õRd;©s¡6¾‘úå»—£ú±¹|®þ™†jxcñ®~Ìïê‡Õd³øeÍröŠÌ¤q)Ãd²ÿ•þ<õsV­Ë=n "ãÓûLäÑq¬z(£P¹üùXzÌ62ãö_u£ûkÏóD [[j=Ñl:âáê™ _P$6Ê_PÖ‡õ˵!‚ŽÇŽcTL*íFLdn=Á‰Ï–1Ìx²>ˆaT]Óµ15ÿþ³˜Ý+£xÔðD‚ÊQ2þ¥ATv·paßæ¬x‰¹áy³½¯ýXÉÂYË! 0º{b Ìl,WùùÛ]œªú(3&5ÆGMG©W½8ƒ¦Z°¨×ÈåäªñŒX–D«Gžä_ýWRð¬„Ù‹ÏSqfNxÉéìY9—Y“jnx†^×ßHßp¢ªÂgûÎ’Õ³ž"‡“_î$©J]*_ÞÉÖãiÜØ‘s–ÿþ®Ø7 OP)VGí•€1¤+cnJ•ü³ìxÿš¬§vÜtZx^SÞQ êäÃö[8xµ|­åL?ò ;¯Váþ¾ ñЕJ%ËR4 UUQ œèlß‹ÖÝE{W*~ÝLþ{ S6©´>‰Ñõ*qéÐçÄ÷2±Â“q˜5ŸAßúUF·ðÅX(`(úr.ƒÆÉqLóK̃'³ } ôWΓ\àRŸ,éœØw‹5GòÊó 1%ýÄšy«™} ˆî#Gñê.ïŒáí…ÏS5r=Sšûõw~Ûó# gƤpÜ2ÿà‡Wòúð_I]»„ÇBMKŠàBÏLEõ2ïgu.Ä Ö¯tö_äF¤&¦£…ŽàÙºxyÙGœl7šún Ú¥,Ú’BËqS0/™Crz>àMÝN Ð}ùGSTîqSÈùs?‡Óò¹¼7žŒE'8¥ÎXš„äS]|Ê­?p®Qw‚Ý”BÏ\<$’ë”Ï Æ Zê~¯>EÀ°^Ž»"èÔ*”ì!#Y¹l?Ím‡¯-­›_0áõƒ1ŠëNÔ³n{ºÕµ%ˆðãÌ×òéóä´ó¹öÆâ5Üœl2ò2H<±‡ÿÞL¢®ÿ¬ïŽI ix„µ¡s›Ì ¶Þ¢f§¥îgѪø}ÙcîÁ]¹þà%u‹×Ÿ¥áÄ8&ö®ŽA@Tàevü€-¿£ysëݺƚ´¨c`ï‡HÌmЇ8Å;¯1âeº}:‘•_œ 3ª1¦Ë¿p$Õú«SÉÉM‰öʵþÝ+¼3÷u´öj´¬þ'?ŒÞÎW§²hÞȽP³;‘îÇÿóØüS í:WAG*?}´›ÔÀ‡è[ÏdK«”JödW&½Ê}f^ÿÕ¬Ú8‘ˆb¯¥îwÞÞ‘E»_Ô”=,Ûr‘ á«xcTnŠ€èêıŸÒ»!?å$'34‚šÔÃÓÉDW2ˆ0^$ÙâNdt{ZGy£±¾\@©ôI÷Ж´kYiJÐÅ \LÏA½hë© š¸ñãögسï"¹ B1Ù.e×4p¦s‡†˜•vtêÐÝàqÄ,ÿ‰~oDãv}©ß;׳FEõÌ’ê¬ÎÅðÆêW§6§år%ųÑ?FÄÐVþ8ˆ7Úš‰ßü>¼z±¢Km¾\¥òsr|ðjØ…{”9|÷k}¼H:ø_Бwt7§³Úá£? ~¨)þµüymƯL=“~»VÑö¾ ~è¢k™Kù²)‘X¹ã‚šÜ„ÜÌñ¤I›Z˜!@¸Ó®‰'«þBBN[|liØ¢ù‚Üy\ÜýóWleω2wôY W³QíÞ͇_§g—YÖ9´=OΟFïêD^Á­÷tô0ÎM8ĉlOš´©}­ä$átN>çÞ@ôì‚¿j¨·‹™¨x\ŸÝ-Ü©] ñÎ>Ž¥=JÀŸ[ùúê=ŒkÛ€æJ=.ý„_ÆERÿø>þub²ï¶WáúX?¦€zøó.\µ”ÈoªÛ‹ÁX²a7 z²‡µ»3¨?æ>ëØ7PZ8,Ki©3’϶ÄK @©T•0“‚(62×U{GMŸ—xŒ?ò|hÙ2Sì„rãå¬È¨VÑ”boÓ¹_þO}×”ù1c©çB†®1¼Åvæ==˜ãÝ0lpºÝãks^¥µé›4R5´2ä$“’ÂK Üü¨í‡“2(<Íݱ^·ç=ÜeæÃߎ˜ÛÊÚZ(_pi׊ÞÁTÏYíQöú•¼‚£újÉàìN¥À&<ÑeW|͹ðêÄ~”@ä¹Ç3ŸýfHOÊÄ¢i*Gqoh>1ßÅ“Ù>„Ÿ¿»@ØcÃ1Æ}ÅæÐиŸ½IþthY ƒ0òÀ 6tÁÁŸñÑæXÆoŠ¥Ù¨¹¼=<²È° DâŒ;.¨) ¸á …רX׬‹Q †íÿØÈ”i±¤u›À̧á§ý·/ÎäÛ²Ü8t8o=Ó ?Oo*Wñ£š:E)Ûðˆj±ÛùÍ’Š‰6Ï-db„¹ÐÃ@`ö¯LÑ©?:Zu¦¦¶žïã/Qùóí¤EN$ºJ%ª´éM÷÷Óh†þpKè#4«ì`"3öÛËn:½ òì­Z1Ô¦çÐ(–¾±‘¯ÎuåÞ}q짯t ÄP”¶,Nñ¨IƒÈˆBsj8k—í\4½¢CÁB~y\µSÎÐûh„ÿýr–LµF¡á'üô$’/§‘§‚æB7?†-ØLÛ½[Y»z 3F¬aÃè%,ŽñlÙmZo4 È-´D_Éj¾sÿáðzšfq¾œß¥ž¥Mo uXgwΦ4õ+ŽËúZ2IÎ7:áEóÇPãáXð®'»DgÜ[ƒþ2¾fȼœŽ@çO›Î5˜·y;'/·æ«•é<¡+>{×òá¾ ô4lçwßÖ¼X«Òµ^7ƒGÍE³ƒ´ü FÄÌb]§Uü³Ž©ìCÐ’»’ò·¤ÛFÿ„SùiÏŸdmîY~8˜†1¸•BgÂÇÉY^ìœ}f?'òë2lt_:D…Ó ²aÞEÇd…ÍÙºcÏÚ4ŠŠ$¢n0AUÜ1èÊÐÆjáÔÒ_å§=ç®×Á†Á¯>µôÙœŠ†Ö!¬NÁ'” Ï’1¨¡F;:VËä[?æýïói= %Uô_[5SÙ»v3ŸìK¥fçVø; a´WÙQðï8ŒŽæSlÚ¼Mq¿âÑq(í«^¦\ÊকåúÛ´pÒãSšö.¬Fÿ†„ÓøñûÓdÞÎÕ1w"žÜÕ—Ìo—°éx¦Ýåü¥‘@è= i;˜ç¯cñƒŽûc™Z©lÚ5ÅR—Esÿdï/ijÖ£šÑñ}Ëj×Îê\v­sÑ¥©¯šEJ–†É£0÷fdÓT¾ûâAý‡ÑÌKAˆJx5Ò/gXƒ Ôêú¡)ßóá'ó³{ÚÕ ¤Õ½œûâS>úäÕº÷ ®©¸VPt^ÜÓ¾Uµ~Mȳ[$É­G¯Ó“ššzÃùSSSÑëooßÉ×S#¼Z1vh0CߟƋnOð`]ÁñÏ–±â\-Fβ­º1UÏĺ/bY9€ºÚeR«w {õ‚Ä 6ÄlÂë¾(j¹'p&½“Ð{è%HÜ÷5?œ®EçPO;{F8H–ª¾mxê¡ [=…©ÚHú4Ä”y‰Ì.tkË“¾áY&+#éß"·ìKœI ¡×ƒx/±6]Zû°fËj.ùô`ySÛŠQ™6ƒÛb˜¼ŽO-~<ÒÆ:Ð.Ú«gýpŸÞÍx¼w5Ý0‹Õ–ê ½‰uÈF¥@2pT–HŸ[²‡RÙE{—Љ–Œ{$”!±S™¨Žf`t-<²Žp:×ûùÜmoZNÏ}ÓY2âqŽ éK‡ˆÚTÕ§qøxÚ5™»’9q'›÷¨‡UÜ{žñih~xèÀèJŸnöpyÇ –‡ÜO¿\~û"†Ø³~ z±>Š€’£²¥ª£w±ôy¾sXç›NilNÍæj6Ì•¬ËÀ…ÇŽ¡O\ ú†PI€w³BNÊÕk»oëkt¡Ý%̽„ÿÐQ„T2`ìt?5/fȨ—C1 AÖÑÌÜ”EýÈ:Ôò÷B¤Äók·pI߈öÁ·Í%·o/oöîßKt‹h¼½‹k©sRSSÙ³oÞžÞ·uuÚÔ€‰ú£Þe™û|lz‹‰‰ÕêE3~ñdw³=Ð}é0i:ý_~—/M%ÛÍŸ6#Ò}ÈfOKäØf|‘š†Á3€FµlKwuÜ7~ß¼ö 6w¡õÔHÜo‰0ÌD<µŒ¥¾ ø÷ÇKynMª)ˆ®S›qoXu]ÎÒÊ x÷?1¼w•|SeêvGç^x—pj&êvÞÀ„h IDATm‰ç–/1Ý×뫼?Ä?*Ë&Kk:×®äØ1(Ú«þÔÍð‡¦aÜÛz”þaE»!CËÀQY"½¹5;Q˜··¡¤NÔ±ˆ•>‹XË ¯’§3áëI—0OôÒûAW¥=/¯_IóåËÙôÝjÞX—Bž¦Ã½j š´k„Ÿ^ \ÈÀtŒ¯ßã§ÄÐLø5èÂ3¯ £®IAçJŸnö ˜RùïêñA‚ßà&<:çYÆ4rwÑcëBÏŠ¥ÎsRç›®a¥±95‡ô0y¯uï›ÃóÂKB)(“£{%¸˜Dz>øé]u:õà­]æ¾î!˜„@ ìHï°ÅÌËëÅýµ(BÅ¢øâye;k®%)[C3zQ£áýLyg ½ r…Óß„_?.%]â›ÿû†üü²mE©×ëñöô¦j媷¨tö±§+†uëÖåvïÞý¶DWÛ¶mcРA數TM è㦩¨×æ5¥ødMë’Þ‚·g¡((BËgûM(×÷˰ý® ]1/¥©TJþ½È=-ª¼öÿ^¼,BÑ]sŒ%Êi§<… †EÕ줱ݗâíg¯<öÚ ûé,ªun‰CõаXT‡ev)²+-ÎåT:Y)»Ð4M-Ü# ®µ™¤8šª¡jÎdîDí=#J¡ÉÙÎõÉŽ¼5« ØD)í!ï‹?–è¥|<©uå[ ¹;ò.êX<Ÿ‹:n۲ׯ´öoÇ—(:§=¦V­ è )ÙüSÿf±Úèµtš†ª©E{;ÔÙÑ3Aró8|øp‘Íot#ÊâÏõ£GÒ­[·Š-¶mÛÆ!CúY@¦í“Qè{]î{j„¢³ûÆ%„‚Î高@QJ&p™O(ØÉæ´,Eîi÷âöÿî¬,®ëW¤`Ò–¥<öÛËn:—蜤¹QÙ•çr*»,ìé„ B®5-%¡—='eàÄ&æ³Ý»„¼K¤/½=\/ÎAÐìÜ>—µX>uvz?—õ+c}汓ʞíÙ©³ÐK'J) ʵ–Ülî¤Í ︉‰D"‘H$ö(÷=5‰DR.0†òä¦ïãl(X"‘ü­È F"‘HJEé†`$É߇~’H$‰DR!AD"‘H$’ j$‰D"‘TdP#‘H$‰¤B ƒ‰D"‘H$ÔH$‰D"©È F")N~_/˜ÁK›¿v0ßšÂÿâÞåݯÎÝYå¾Qî¶úçn¯¿DbÔägñã=¸ðêmô×}%α\áÐöì?›…¥4gž¨™œ=¸›ÝñiX '¿ÝòÍObïÆõ|r8Å~¹+š¾¹ªoE£¸üî¶úK$¥ |n¾§^âãÑý˜¥‰¯w¥Š³ÔnŠþ5jR£š‡ÓÃÚÊŒ«zܪûÞͨWøfÆpžÿ¿Dò5€JøÔ&ªK†?ÚƒHŸÒõ­i…«tJöo,vG‡®a]h¡Ó¡ÿùjš†ÃçÛí.ÏM’…3œÖ·I$å;cøÉ’À¶ÙOѯWwZG·¡iëîô9“M¿¦aÑÒÙûâ?hÑo1DzTÛ»µÊÅGҢ˳üß ššÂÁõ¯ðhŸ®4k}/=†¿ÄêƒW®䯳d`GzÌ;BfA·¼šÊ¡¯1¼ÿ?hÞº ­zŒbþ¡ T øöÎ;<ªâkÀïÜÝl6½@HH€„ @è-tAɧ¢¢€t MAŠ`C¬¨ *ˆŠ€©Òì,?]AªzOBBHÝl¹÷ûcÓ³É&`yŸgŸgwï3s眙{¦[’ÙºäyôèJËv·qçð×ùô@±¡‡òP<Þ2Ÿ37LYqkÙþj:CîéFËØö´¸¥ã??…ù&kÉiàEóÍiÓ¶=OâÝ—Úc8ô_ζ_¯-_û$wßÖ‰–±íi{ûž˜¿‰DkÑ›ÎD»víiÛžá?§¢æ8²+'¶èÌÊ¡ãóß=Ç]]:вxØö–ÈOoáþ{n·ÇÕ¹÷šÎgÿ]‚-_I]”Zµ²Ÿ×Y^fídÊÿu¤Ï’‚¹SÖS«è×áv&oÏ@µ–£<ªéìýì †÷½“ÖíÚÓªkîzè)Ȧøßeç…£zª¬çlj¼òÔ7Éu†‹öÔÖAüÖœ«1”)O5À3ý(?/Ëãõ„¯yšqMqÛ°‰’G]Cí"{~9„®Ñb|-Ä/Íðit:ŽõñßÎcæÈ1d/]ÀðºF@SmØÔ¼ÍZ2†¡ó’iûÀc¼Ñ,q!¿Pw„0±áF­ö¤ïØW™’Á¦Å3xm¼BÍU“hí[±.õ"ñ–ùœÏÐÚÇÌeÄÝ,e5ÏLûÏþ˜Õ©ú gHÄ­R•q½ ÂþFÿ@<´tÓUÀ‰Ý‹ËÒØ´'c^èG —³[—óæ¢˜½†iò‡›‚{¿Æô»C1w ‘\Ì®r8èÌØ@³äÂ:Cál j߯ãƒ[PÅz’_?þ€7&è _ý ­Ý‹Û[:6ýÍé°!LGÖq6®[ÌÔ!ÿ‘¶âCŠ4VR/ÊeèÂׯáRË¢pò¼NÊ“ÎÞ“ªö>4Õ¦¢B9Ê£•ÃKFóмs´øS[£;û 3ÞZÏß f†Öó¨Ü¼0¯§œèÛI}ÑÚèìùn–^4ÉÄõáÔhàÙ–.íá©´§Msl~ä~<2––1wÐÒ0…õ'Ó/,]ú>¾Û1“šâ—±©ËŽ2hS‡Eã¥ni‰iÀ0ÏÛÆý3:P<ª´m|°$žà1}d¼òNäÒ61ç““4·šq÷TÇM@ÓÐóüÞw)_M«VÞ\VÏp©Ï™MËÚÿ”wŒá)6/Çv¢]S?t¢öJô2Òs]£bÉJ'áÈVÖ¾û#Ü[ðu= ݉o¦*øÔíD÷º¹?c‚8±áA¾Þ~†œŽþxæþíAtý ûKË\TŠ–¶9å±Å2l †â:nNqûFwåö.ðTmªŸfã{ØVÑšßxEÆÒµs#<•ŽÜÒ¹!ºþ£Y0½^Å·ÒN£¾4]´¬ÿo©eQ˜Ëñ¼eäe«(gi.;|ËÚ;ùpi<½æðÖãMðQjR2¿½þŠäE«&Ž»OJ{~gõE«&Nò§‰×M\wH®W®§(ÜÊ1V¯G0_rö¢ áÛ”»šè˜òÝ?$÷¸¯ý?ð·¹>ãšûcKÜÍ¡š·¯…§¢ :6÷aÉÎ=$ätÀ¿ØÁ»æ„]Ä›|hÞ>ÄNÏûWCµ©xœËBÅ»Æô?§9¡ì¸Ýn»Ÿ!­á'ús0®ƒú÷¦{ƒ€ëMɕÿ/Ò½ÃKö>¢ãÞ›H÷ =–ÃNtظ¸0 çþZÊÌEß°)>,Å }¶ ·‹& 7šØ_¶¥¼Ì ±EÇ6`lS‹BaC –NÁý:ŸÜÚÔ“uö’hn‹Q\~ký2taò+½,–ÿyçeùqÞ’°›ƒÙ^´ê…wž>…“üº»lRZò?¿³ú¢@ÞåæDâ:\·ï;¡7↠‹ªâOË{š¡¼ò›“ÛQõë­d7EÛªzDFîýÅj! Ôõ-ª âÈ;±YQ1ÒþÙwãY¨x¢¯ä–M‘çt·›Gƒf}J‡Íß°bÙr&]Ϊ2gHtA ÷f¡Îf?‹¯i/ Ÿ}‡­A-èRß½›S¦e9¾†'Ÿ^Hz÷±¼òD‚´c¬›ò ?ºÇn_ö–¯3/ B¶H1p,]ÇΖ½›M³a­¬y—£‹Óe”E8{Þ"×…‚Aæl‹}~N9º% ‡×lVlèÐW¤sYv™^¡ô9¯«JÊ»{‘H\‰ëc¢°Sª´íGg½¬ýæGVm´Û¯ÕôCpCjÒØ±é4¦¼Õ)æ“lÜ™Ž!¢!!î%[V†jÑÔÒ_dǦSarq ªO-½‰#‡¡‘uˆª“÷‰$ÌçÊúˆÎã½µ;ôç¹9+™Óӛݫױ?«Ü‹“o¼kÝ šÆ­zñò½ Ø>“çW&[ÓÊ¥C!@Ë-i:±xk]¸ÎM£iظ Q~…ìFgÄß™)ÙØÊÈéK±Å’\a›O³yO:n5ëQÍP ½4pYº0—^/½a~‚óñ§ÈºÑnAõ¨..²{Gbù'ã_¦]V,}×®®’H®7Œe ¿æ ŠógÈGï¢úÝÁÜÖèß¶<>0‚?ÍGéYWpðÛy,:U‹a¯µÅÏAëL´gÔýa<´ìI&jø·Y(Ƭ$²jw#.ªõ eȪ§˜  £wë0ݤU Oó¶NGóÂ[ç\öˆ½K]Á¿åcL¸…‡çN哎sy8Ò‰õ¾„ú ·n`ãÑZt!L,bÕ‚µøÞÞ”Z^ œÈ(äD¸…дž‘•ß/dEã>ÔÕΓV½3=êÕï¥Øbq,gãóÍ•«ãó¿.b~í;hdæÀ÷ Xx2ˆ~SZã_‰½{—¬‹²Êbøe:9n¡t½=‚9óßáå…YÜ׸º3ÿq¡œÎ“˰;½p2¯{=‚~M¼ªÑìJäEÏY}QQyÉõÀ ãÔ€ zõ¤Ö§ 1÷èCï¼V¦‘úÃßgž×Lf­}‹q‰ÕêÅ2fÎG{à¸Þö$fÔ<æÌâ½ÏçòìòtTc·MlÉ­QÕiòø|æÎâý/0eõE¬Æ@êvM×»cðsôr9¾ŒgÆ//òWã¾bÑm}FÏ2ãvKÞφW³#14#A »1éÕAÔ5Þä«/b†>KŸõ£™ÿÎn÷®²uèÂícñÓ«Ÿ1ëÓn´{rÓŸNäõ… ˜ü}hn>!4©•»Ñž@çñÏÐûÅ÷YôÂDLÁ´Öˆ¸úÅr)¶XKY:¶\böÓÙ²ì –&؈h΃o>ÅÈ&^åJOÅ#« .te”ÅZ—›‘ƒÞdúÅi¼¿n:O.´¢xøQ­^+bôÎG£„/±ãgó²ûÛÌ?™o²½ ‹ª (¸•gwÊæE…Ÿ¯ìúB:5’G%Ïmåʕ游¸ü%“W’õë×Ó¯_¿qiª "țܦ‰¼ßäÿ‡¢+¨|5[îX¹®X¬ij¡¥›¥È¤CGò‹‡Q(®â×Å™ÿŽ~Š(oùž³Ô¸sÿÏ¿"Š(erå LQÛÉÿ·DÞ–©Ã¼¼Ìý¯Ä½€ Ja=©jþî®BQPå°«òØb! ,;³Ÿb×͇ù ÿ|;—ÏÇ7ÄC€ÈO{eP)ºpp]8zgÏ[âz^Õü=or¥çê¤<á54UËŸsh÷?´Û¯dl1Gõòó¢’ë‹òÖ«’›ŽÝ»w—ÜL´Ø·oÝ»w¿$ßbýúõ 0 7 då~2 }ÏL.ÛS#]Ávó]ñ.ÿ …·å]*ãšcùe‡)[^á$~gñ–ï9K[((7éPSaçyòÑ.¤H^:×·@qùµ+ç6P–Ž…ulçögÕ9tÊ/—JÑE©×/åyÄ­(¥”QgáÍýþS¶*5ò† ñløxgjôå¶Zî%'„_v^Tr}QÞzU"¹ŽpY§F"‘H\5“S{aÉ÷ÿq.ÓŠð¨J–™ñÄC4ô¼É‡|%’k„tj$’›C$­ýƒ‘¥ Jœ ÐqÂ<¾_xh'wèêÚ¥J"¹©‘NDrÓ"‡.—Ò‡®$ɵàÙ§F"‘H$ÉÍŽtj$‰D"‘ÜH§F"‘H$É tj$‰D"‘ÜH§F"‘H$É tj$‰D"‘ÜH§F")Ž5 ³&ó§ÇȹžŽ7WSùgõû¼ÿã©ë+Ý× ["fL`âŠÃ•¸D"¹&ÜÜNšÅÉñ×átl•U§] ™’«‹í»~ù•m'³±•çeWšÎs2çá;éûî.2VÉX“Ù¼æ¾Úê8ÝW;=W‹K-s¶tnÞÌ®3ÙŽÏg“eY"¹îpm§ÆœÈ楯0b`O:¶kO‹qÜ5üyæüžˆ¥2*Óæ?õ4ïü‘ŒµÄ]1™’ò£^à§gï¥M»ö´ˆmO‹Ø®t»÷aÆÏþš]©6Êk6𦡕÷îÒt®x\£&5ªySžC›+MÓ(Õ»ÚéQ“ø|X'Z=ºä|¯À̱Ï'pKû<õÝ™ÊéQºœ2§Qº–eY–H®;\vGa-ksGdÁ~OßÕ“GûE¤¤rèß$›/~)¨ª­ÒO#½2%åÅBÚ¹D,5ñæÄX|ÕL’â7²fÑ Ùz–%ó†ÓÈ«ò·±w¨s·šôzåCîÅŽJ¿êéÑPm6lJCsêÛWñænb&|È‹·Wǽ’’q¥Êœ,ËÉõ…k:5Z6{½Â‚ýAôýã[ùã–{6M\ûí§ @MeçêY¼³úOö&hGw`ÀØñ l`o‰ÚXÿÖËÌýóg“2ÈÞ„4ìÈIãéUß'{ó£sÑnžý{‹×¾c~7/N®{†Ñó¶r&ÆÞ?œ¶½žàù¡±TÓçÖÂj»Ö½ËÌÕ²ûL:º€†ôŸö.cë”"³«;G¿™ÍÔ?²+Ñ„f ¡ËØÙL¿·xßÝHhàEóÍ©¢жjçΧ¿â«ÃƒhØØ aMfëÊ™Ì\óSt7êÆ°Ic¸·žƒmï-_ëÄp óŽÉÌô0_µûÏÆ7ÂS•`³Ùþº;ÊMÇùïžã®¯ÎsÑêMpá°–Ã|8°Pz´$~šù*ó~çTb9†Âc:óÀ£èYß§’{sÌœúîU†NÝJݱs˜Þ«^yçM]Ër\5m'³y‚µ³ä¾Ô)U®?JYö£:I¯,ïÉÃ5šÌÝ,ÿü†¯1¬e†Bµ€ÈoaæppÑh†/H£ãÐq̨'ˆÿv3GŽ!{é†×5¢Ø2ˆßº“s5†2å©x¦åç¥syc¼žð5ÏÐ:·6 îýÓïÅ Þ5|P„ °iOƼÐ@/g·.çÍE/0#z Ó: f-ÃÐyÉ´}à1Þh„¸Š_¨;yÉ+.ÓvbÏLûÏþ˜Õ) ý…³¤Gâvusö&B „ȵFÿ@<´tÓUÀÄþ…cµÚ“¾c_eBH›Ïàµñ 5WM¢µ{qYº²í!÷®’v”Œ¦Ú°©yr.ßf›%¯vjG†Ú·ñøàT±žä×?à zÂW?CkwŠ¦Ç–ÎMs:l“ÇGã‘uœë3uȤ­ø‡"•Ó£¥™8þÕK<õæ?Ô÷oö‰ÂKçå¸psޱfò$–«÷ñÞ«½¨cˆ¬Òä:±£“ôúÈ/%’+…K:5ÖÔCÊÔm‰o)Í-ms–!dЦ‹ÆKÜÒ6Ó€a,ž·ûgt$@¯È¶tißO¥=mjœcó#¿ðã‘lZEÙeyE]?ƒ(pš|êv¢{ÝÜÈb‚8±áA¾Þ~†œŽþx¤oãƒ%ñüˆé#´8EAEX\¦éÈ9Rl^4ŽíD»¦~èDsì/Þ+•‹P±d¥“pd+kßý‘ î-ø¿º¾‰9Ÿœ¤Ñ¸ÕŒ»§:nš†žç÷¾KùâÀhZ5.>Ü ”iž¹—°#sQ)•a³18·#ßè®ÜÞÅÞ3Ô¦úi6ŽÈµ÷hÃ(xEÆÒµs#<•ŽÜÒ¹!ºþ£Y0½^Å·2NïÞ=›»3ºˆiEšk[Žóô†å,?LÍÛÇ:òúüQ´ t+ât—«¥m,Û~šhe§·‰—,÷ÉÂ%TоôyÌæ„ÝÊñ¡yûZx* B€ðˆ cs–ìÜCBNüó›b­vcõzó%g/Ú(¸ŠÝ!ɯh,œûk)3}æø²/ôÙ6Ü.šPsÂ.âM>4ožwqŠË4Ö»Ÿ!­á'ús0®ƒú÷¦{ƒUÀ À¿/Ò½ÃKö>¢ãÞ›H÷ =–Ã{9šcåÔ´>ÄNÏ  ¡ÚT<Îe¡6..¬l{È£¤¥2lÖØ¦v$ … )iï%)¸_çÓ€[›z²îÀ^Ímñ1ŠËïUjJ{Ã&þ\ö&5žÁ˜vA¸‰ÊË“‚«T¨çqþë˜j fà‚'¹5Äâ~\q¹æD'öÓ¤|é•H$•K¾Sõþ„àï='ÉRk~*NñˆPÖº¡7↠KîN{øÜ%¹²,Ç×ðäÓ Iï>–WžhBvŒuS^áçdÎ肞IåQg³Ÿ‹Å×´—…ϾÃÖ t©ï^€ÍfEÅHûgße\Œg¡—¶À38½H)"Ê©=PŠÎKá²lÖ½ ;r¶œèÝthš keÍ­Ç”·Gñç´ñLð(é¯Ès]ƒó¸Få8ÏÆÝ‰>ºUo,¤ÓœÇi ÏW¡C½:µŸt§é•H$W×\ÒíÓ”~qdýü!kd9Ü#ÂÜÚ†4vl:]°q–ù$w¦cˆhHˆ{9Z˜:#þFÈLɦðb_Ó‰mÄ[ë2hÄ}tnMÃÆMˆò+g¨M-ýEvl:UrÓ®Rd‚@è}¨Ý¡?ÏÍYÉœžÞì^½ŽýYå^8,©Þ5ˆnMãV½xùÞlŸÉó«“­i¸Õ§–ÞđÂÐÈ:DÕÉûDæc÷ó…-×ðœÙCé:/J¥Øì•¶#ói6ïIÇ­f=ª*¡—γ6÷¾¼€wk|ùÜhÞÚœ‚U»¶å8ϨÞÌøèY:%¯füäÏ8jÒÊ”[û‘H$××,—¶=MÍÏ0wèCìp/†SE—Æé{8Qk îlËã#øñÓLñx”žu¿Ç¢SµöZ[üÊ3híBÓzFV~¿ûPW;OZõÎt¯C˜XĪkñ½½)µ¼8‘QðÒíu-{’‰Ú0îmŠ1+‰¬Ú݈‹t,3®ê¿|±Y%"ªžæ3l?œŽæ„wÉ¥6’JÂÞõ¯àßò1¦ ÜÂÃs§òIǹ<ÙÇú„2dÕSLP†Ñ»u¦$N¤Õæîž1øé} õ$nÝÀÆ£µèZ¶=”fG=êu3„ïåÛ¬åìo|^Évtþ×E̯}̓Ìø~ OÑoJkü+³Q}5ºMœÍ””a¼úôdj.žÉ È+WŽãœ”ã‚´)kõàÕ'yøÑYLZÜ%4»4½6vb?•—k‰¤‚¸¦SèªtâÅOÓjþ|Öþ¾‚iŸ¤bÑ †7¦Ë 6Ü©?ü}æyÍdÖÚ·—¨Q­^,cæL`p´G‰qq‡(tÿ ½_|ŸE/LÄäLûaˆ0€éO'òúÂLþ>4 7ŸšÔÊ[>êĮyÌ ˜Å{ŸÏåÙå鍯0n›Ø’[£ª;”Ù±é~6|¼š‰9  jØI¯¢®Q®„¸â(^Ä }–>ëG3ÿ Üþî]4y|>sgñþ— ˜²ú"Vc u»Œ¦ëÝ1ø¹…pû˜AüôêgÌú´ížtb¥ÙQýâ 1^¶ÍZ’˰#Ë%f1-ËÞ`i‚€ˆæ<øæSŒlâU¾2TA„{Mîyþö>8w^\A«†\ÃrœŸ*@Á§É0^¾‰ ^ci·EŒ¬WŠÜÆ‘eÛOåg›D")'Žª ·•+Wšãââ -Ÿ¾r¬_¿ž~ýú•—†¦j¨Z±a¥`ó0MSQóÇ©J‘‰»öÉ{šPÐå׎öÿPt¹¦†ªªù»° EA¢˜ÜÜkBA)TË¿G”% U-ÔJE8žd,¹<4Õ†Jaƒ#[(¡ãÂv’{-ï~çöàÈŽp`—i³¨eØ‘3{/vÝ|˜ú?À±sù||C<½|)•æÐ”© ŠÎîÔ_›rìÀ&Tªæ¤,;¬{(d?åI¯DâºìÞ½ûŠl:¹oß>ºwï~I¾Åúõë0`@o ÈÊýdúž ˜\¶§ÆŽÝ)«g]]©7”‹ÿ'P”’Ê–ëìG2¢‘\„¢s`3%m¡L ¥ˆ¾œÛƒc;*i—k³Jvä,¬£ëä>«®˜ãQ9TŠ.®X9vŽéu,·lÙåI¯D"¹¸æDa‰D"‘H$’ ââ=5‰äŠaˆä±µ0R’H$’ëéÔH$7-rHD"‘ÜXÈá'‰D"‘H$7Ò©‘H$‰DrC ‰D"‘H$7Ò©‘H$‰DrC ‰D"‘H$7Ò©‘H$‰DrC ‰D"‘H$7Ò©¹\Ô,Nîü‹¿§c«ü£2$7"Òf$‰äŠàš›ï©©üòâp¦üt–lMÜýÈiÇ ‘ƒéê^ñ“­Í‰l^5—…?üÍþ£Id)Þ„6hÃ>ÁˆNÕp»Ô UM˜ÿÔÓ츜 ò¼8 IDAT•‘ÅOÿ•\uÔ ü4yÏý/«àŽH8M»õfȃwÒØ_wíOE—6#‘H$W×tj0“zê YáóöÄVx[ÓI8¼/—,dÂ?É,\5‘fÞJ¹_NZÖ>æŽÉ‚ýž4¾«'ö‹$HIåп;I6;>ª¼"¨ªíŠœh*¹,¤KÄRsoNŒÅWÍ$)~#k½Á­gY2o8¼Êo;W i3‰DRù¸¨SšøÕ¡yófø+Úv¤]`üiGÏ^ĤùÐöÙÅ̾'ôÒ{£®3ì¶EóÍ©¢жjçΧ¿â«ÃƒhØØ a-+ùiæ«Ìû=žS‰iäéÌOŒ¢g}òÔ€êL¿¥èâ6»3ãÐfnI$É•Àe;!B³zj_|tÍ‚üˆþ¿f6lâŸäáÔ¯¡€z‘=[NãÖh u ¢¹ÿ2‰M[Ïan‰{ú6æ|r’FãV3îžê¸ hzžßû.å‹£iÕDMÃ;ª=]ÛÇà©B\óá–kƒŠ%+„#[Yûî\poÁÿÕõ€ôMåÈCðŠŒ¥kçFx*¹¥sCtýG³`þz½‹Oƶrê×.²ì©+n3‰D"¹<\Û©©7Š¹ÏµÁ3™ç±õë…,œðÖÙóLË&ÜÝDÇäï¶‘t×]ßÈs6ñ+Ú+¡ÚPô—¾ÐËXÿ~†´þ…wžèÏÁ¸> êß›î Šdžû +7nsÂnåøÐ¼}-<!@xDб¹Kvî!!§þº‚ÐB€ªFBN ©9 |Â#ˆpØœ‰Š†9q/Gs¬œšÖ‡Øéyá5T›ŠÇ¹,Ô&y"ódÞ¤/Ë_¤{‡—ìß5 }D7ƽ7‘îAz,‡Ë™‡…z{t> ¸µ©'ëì%ÑÜ÷Šè·]·‰D"‘\®íÔx…R·~]ûœbhÙªz?Æ×kö2¦U[Zöl‰Û _òWR7ýº‰äÐÛiTô‘ôþ„àï='ÉRk~ÊG(t`ζ j%Þ2î‘ šõ)6ÊeË™MéHÖϲæ@–ã}Aô~„ù ÎÇŸ"ËáÛH ô>ÔîÐŸçæ¬dNOov¯^Çþ, MgÄß™)ÙØ ½Ê Á ©mHcǦӘòóI6îLÇÑ÷ò ½Ë-¨>µô&Ž„FÖ!ªNÞ'’0×öQ¯*Þ5ˆnMãV½xùÞlŸÉó«“­i—–‡æÓlÞ“Ž[ÍzT3 !—¡ßRlF"‘H$—‡k¿/fÇ?þxÛ²¸pz?¿}¶œŸ3ÂpWB€W {×äþÅorÄR‹Ñ]k`(>ÛRøÒö±§é±ùæ}ˆ}î¥sÃpªèÒ8}`'j d¡t½=‚9óßáå…YÜ׸º3ÿq!÷ee9ûŸoV‰ˆª†§ù Û§£yá­ÜBhZÏÈÊï²¢qêjçI«Þ™ÛòøÀ~ü4S<¥g]ÁÁoç±èT-†½Ö¿KsP;ðXŸP†¬zŠ Ê0z·ÃÔĉ´ÚÜÝ3¿ËÌò »3¬àßò1¦ ÜÂÃs§òIǹ<Y¾<<ÿë"æ×¾ƒæAf|¿€…'ƒè7¥5þŠ@ø^†~Kµ.qÚ—D"‘HpY§Fh5 ?/bÂ㋞~AÔlÜ“gÆæ¾f¾¹•¿Ú÷ ¦åÇSÙVoÝ »žtU:ñâ'‹i5>k_Á´OR±hÃÓe€nDz“é§ñþºé<¹ÐŠâáGµz­ˆ ÐcMÞφW³#14#A »1éÕAÔ5*@çñÏÐûÅ÷YôÂDLÁ´Öˆ¸Æ‘Ôþ>ó¼f2kí[ŒKÔ¨V/–1s&08Úã2VºxÒäñùÌ œÅû_.`Êê‹XÔí2š®wK§Æ!Š1CŸ¥ÏúÑÌg·¿{W¹òP1¦³eÙ,M°Ñœß|Š‘M¼rug¼tý*¥ÙŒ.°5 D"‘\·8ªAÝV®\iŽ‹‹»*“Lׯ_O¿~ýJÄ¥©6Ôâ=óB ¥È<-m /ö{–³£V2ç®2öbÑÐTÍ>g¦@ B(¹5U-q]Q*ªZhžD‰th¨ªJ^P¡(25µÐRñ\y…ÃÙT4¡ Ë{ j*6]Þqî)!È¿îøþ› Mµ¡RüùKæK©yh>Ìýà‹Ø¹|>¾!ŠÀn+J g¥Âú-œžRlF"‘H®%»wï¾"›ƒîÛ·îÝ»_’o±~ýz ÐȲr?™…¾g&í©¡èJß>^ËæÌþ#\T/òÏŠ7øÁ» ºVs²‹Ý)kKz¡(¥\WPÊÜË^ ”rƒ ºRà ”âKÜïàž2å:¾ÿf±í”Ì—²uƒ}cF®Lç°Âú-|­l£’H$IqY§¦L,'ùlêHÑS­Ù=¼òÎpb\`ë{‰D"‘H$׎ëÓ©1ÔeÔ²ÿñ؇‚éÐH*C$­ýƒ‘7ñžD"‘\\ŸNb‘\Q¤}I$Éõˆ‹ïS#‘H$‰DR>\¢§æÞ÷ãÑä’D"‘H$לW:k×í».áÔØTçÛÊK$‰D"‘”…K85‰äÆ¡Iu7·ö ÐC‘‡uJ$ײU–mËf×ËußÁ ‰DR©<Ü· ï’{#k™ûY1ûkt½GÓËëÞ_|’ö=Llý ?øw×=|ÿåçèät‰ b€!±nLø<™+°çÞUE:5‰¤R©îot¸^MKáð¾}(ÝT„8ÉÞ½ˆ0ë0¸nø›Í†Á`NÄe Ä^¥S#‘H$èõzÇûû„ÜÆkº¢Ca4+>£è±j*;¿XË6¿<Ô-ƒ+::j*;>[Åf¿»z[îH£^¯—NDr…‘Kº+ŠÞAý"y¯£OW¬t%®P¨êMË*Ê \øJ+öýìGi)ètÅæÜXSزö¾Ü}ëÕìωgþ#÷1øƒ½d–8p®Ö¶~º†o÷¦bs”F5‹S»6±éH:¶ë¼Å+‘\¸vONOófUèSß“¨*zô& GÏdðÕæþLVQ¯Eš4ä‹ÎeªØ®Eü’²zâî¯Í(õ}šÎEW{±è èQ¨Ç—bÆ\Vútzš5«Jßh¢õQ¹lbËîó,Ù“C¦«=[i˜±hØpVÔ~ƒÏ_j…o~/Ž™sbØwM˜½òišM½úcúŠÕBà òDWžq°²ÒhŠgÑäÉìﻘkû”yÖœD"©|\Ö©#ôªIŸj6víNeù+6/wš7 `â@_š}{œŽÚ®~kÈfæÇO²Jž".q „:­ôþ‚kÂéa02ð¾ô Ö8°/•;̤+zªWó ¶×C­©6lŽ «¦b³]“æIn5èùÂlî¢RöæPU¹I…DrmpQ§F!ºM}ªYøâ³“,=m˯Äü7ûzÕâÁ[ƒØ¼" Kç^ ¾È“+ÎsÄjŸãÔ¸u°2mɶ˜õ4iĦ^DzjœOÈ`Íÿ’XŸ¨¢*zZÅVc`=#µ|t°ñï/§ùªf &—&sy2Q½jq뉓<ö› “èô4u4Ž«ÍË¡iLZžÄ!+hO& #ló1&í²`Ñ  AMÝ¢ñÎ’Sü™uÝÏÓrqaM«óR¬Á°š,ìÜÄûÛ2I±)4»½6/ѽ "6œY1Ù<¿4½ š1´™õ|à|b_ÿ™ÈWy6êæÉø‡ÃˆÚqœñÛ{bô~þ¼ý@N|q”™ öTÔlÁºX»¦÷ýp„çÙ 9É u[‡Ð7ØÆw_ždá +Ö¼K{/ Èu¨Úï ^Ùgłކ—“Î3 í:‡0 Òê^ n6§ÏeòÅŸIlH¼²½¤©[?äñþG8`#°vsî1¡í«̱±¤°}õ{¼÷é&â/è¨Ö  ÅÝu½Ñ©)l\øý²›cgÓ0áCëIóxûNN~?‡i‹bO’ ÍL§ÇßfêÝa,Gøèá|Óv6«Æ4ÄS ¦±çó9Ì^·‘½gÒÑDsÿÔ·x¼®]IÉ?¾H¯o“¹hõ&8ºŽCÏz=3Ç>Â- ìß›½ô¹lI$W ×tjÜ=èã†éðY>;cÃZ¨B°Yrøî¯4zöòã¾ðd¦ÌÆZÏ‹¯dŽ\Ôõê°»À“ ²m¯4ÓøîÏs,J4o]QwÙ ì¶èˆ®ëE­Œ |ð[6iŠ@M2s(«,™PWèò[t‚:­Kãèaj´Qp( ¾žÔw†ðØeÁ‚Bx¸%%™ƒ&éÐ\y4RϤ±tC*©9T+‘­Cx$ñ3ŽÚ8t K=/åé^è¨WË kÂyNX­kðF[Û·çóµTeH¯W`U’½}®oñ N>v5i×Y¦ï³`Ñ4²ÒlE_zîÜã†íø9Öœ´b)fù?…#ûµaÕµÛ\f:…ŽÚá_LáýßrÈ1¸Ñ¢qïçŽ÷Š“|–råú"lYFš ǃUs8ðãÇ,yn ¦ñD#/aâ¿%»ÎƒÞ¿ÀØà 6/Åô§j,OKc*»ý‹£UñÔ˜¦ø«èêVA;¹š)3ÖãÑw,3:„¢¿pŽôðÜòòTµQÐadæðò'yta2­ŽàÕ&AšŠ_u÷ü6Cx7FlFË)þ·|3žÒSkÅDZæN”ªvßKL½£:!ðóá~Wí6”Hn0\Ò©Ñ{¨á&H8mv8o ;%‹3šÕƒt˜·§±ÇVN5u|›fÅf0rKˆàÀoÙ¤»{1¶…ƒ¿cñ^{¯Èþt=­W!.(‰=gìCYÉ™l>– ìo Ké2ÓŠ’ £”ÇÌ„tâÕ`ÚTÓ±>CÅ?Ì“ªh¸{SSŸÉ>Í@ëê §we‘*=š«BfRžÇ®ëaõjÑ­†nGmdžMcµ:kêø.ÍŠÕàNë*pè&²Ü½ÛÊ@ÒŽ“¼½ÕD¶›çà>¨½Ûzòí·™¤•3 9™fŽ&å`ÖJ:²zµ ‚s§rÈpbí×èÍàJH§‚ì”,6ÍÆ¤Á–#&ÔÁ5èëÉßg:MÛ¥R¥ËC ïÕOEÐ¥]=Ô‡F²zé?<øFG2ÿfþš“4½œÑ=BpS=™?¯àëø‘´ˆÑ@ÓðŠŠ¥Kl#<@rö$¢zÑ©MÚ6ñEGSÀñ0 –ö7óV¢Z¿˜:<¯<ÏO„Ùþݧ~gºw´÷ê´¬~†Í£þdž£Ù´ˆ´ßêQ%œúõÂ1{>J$’«ƒK:5y•³:SÐLÙürFc|}Oü÷¥‘ìCŒÞÄâSVtÞFÂô‚êÝ"X×µ " ǧðÊ {«3ò_2U­¨SãæUvœÉfc ô«cÀxÔBƒH7ŽoOÁÚÔ—–þ‚ƒVOš{YÙê E.¹ªÖ`X?šWÕã¡jX «‡@´»îŸŒö$`_i^Ô×›ùô¬ ‘Zz•½Ç,˜Ô\û´XØvZ¥W¨AºLÒË™ -Ïæ&Ñn?ªZüº vÛš¼\'›×Ö&q0¿g¡¨ý¼+/ ¡Ùýl99l<£rG‘ªºL2¬ŽCˆâ/òB½šöùD¢àwÞ …ÿ:EAQx„Ó.Æ›¥{’líˆ÷ùý˱rú­ty» ªMÅ#Á„Ö8O¶=¼’ëxÔëÍC-ãÝ'äÐm÷Ñÿþ{¹5:½ÈMp¡ôY’öpÈäC³Øp¼òVk~8¡ä§Ñ#¤.Á|ù45ÿ„"ŠR$lÑg—H$W—tj¬Ù9œ¶@³P7<þ5c)vÝèçAu ‰6,š]{Mhq~4óÊäBC/Œçγ34•¿9Í’s*j¡% ¦L6­”µ eÉ,^'éœÄaƒ‡, kâC¸W«ÚØüg鵸½¦¿ªÞ„fe²%U•COW½¿?Ï÷¨‚çÁóÌü#› ÂÀíÿBû¼‰ÅšÝ{³±þŸ?­¼38å…ßÅ4vejhþy÷•©QxV²†E77QêDegz¶f™9g…F!n)jÿz£Ž/Åþ2. Q9ét˜6 Tp/_wȹ˜VÌq·‘‘˜‰fôŽŒeBªMµ;:6+ªæA»Io1º‘g¡´ <« ¥ôA¹×¦ÿ[«h·õ;V­ü„ý„µCgóîƒõñ*!š&PÊùBgÄ –Ü1Dûf²4K$××Ü*#'›¯÷[ñˆ ➢ûy½¸Ž~˜Óùâ¤Uƒ‹Ç/°ÅâÎ |¸+B°óßL’5°d˜8mS¨¨‘œÃñd3Çr?çLeW:¥É,Žó84ÎħqÂèÍüh`ÎàïT3;ã­„Dû×Ðäø4ŽYä|š«{€'áJ_mIeÛYñg³9VÌR§ð?“;wF{Ò1RÏ™ýœ±‚%ÝÄI«Ž†áú‚I«:7Z…ê°\0qÞfŸ›qΤPÕ G ÐTÒ­àáQÆ>59Ù|oónUî ªø~6•’NGèÜh¢`M5“R‘åW:êÔöF;ü»Rmùv®eâ»2QÂêbpì\iY‡ømw&ƈúnAõ¨éfâÈAõÚ‘Ô‰,ø„úè)k¡÷&¢Ýý<õîÇ̾ۋ=ë>翬’sƒ Aõ©év‘[Ncª¨s¢sÇÏ2S²ïc#‘H®(.ÙS*{7Ÿå‹5èÛ'‚:ÿ¦²ùœ«§;-cèhã÷ï’Øš™ëädñÕ•ém«¡˜.òüI+ªZV&+wY˜Þ,ŒçHæÇ“Lz=¡Æ~Þk*³ ^+Ef‰ûœÅ¡‚õb:?ž¯Âˆ6^œÿ'™“V Ëዜk_•{ «7˜É‘õ_åâáN“Z*ùhd$es,ÍÄ9ªpWÒdsÆâFhñmaÍ&¾Þe!®u05uf–¶Øç¾˜2Y¾ÃÌÌVaL°žç§$ˆhP…Þ~Ö~ŸEºØ,l:`áØj<ÑVaýY+ª¯¿<Ù6 û“TîiP…žçR9†ïô ~=k+´¢ÈÆÎ üR³:ƒû…µ#•­çÌ\°é¨_Uït9x¥¤3—€È* HNc_¦ vý*ÜïoåÛŸ²H«½zó@êý´€)ã^ç¡Þíˆ0¤°ã›e|–X…Þ/´'PùëÔ³ŽýÍÆ­Ùxfdóg Y›T‡GÞlŽ(íxä¾ê<²v2O)s_«P“ƒÙ*š¦±õ~ˆ ¢ïía,þÙ’ÍŸçlE[53ƒÙ+N°;¶*=ê2ª…=Y™öÉæB‰ù6…©„tæ¥ÃªÐ¬e0÷ùÒR²øìÛD>)―÷Úx®s>ü”Ïßÿ™dÕ°¨V<6s4šzÛçžè¼‰jÙ˜*¬ä…IÙØÜü©Ñ ç>BÏ:¹óSóŽaSáµ[L(âÆsk—[ñ÷÷¿$y/^ä§ÿýDTDBöíÛG÷îÝ/É·X¿~= è dY¹ŸÌBß³“ËöÔäa”âÅC-åÍP– MÓÊÜÕ‘LGaœ¦S£Ä»³¸%—†¦9q5о8óQ¨lÀGèˆiLgs*ϲ”e_ T¶A:»G-Í3w$§ »*ˆ*# aS+ÉñE”ýRŠR®£„Pp,Ê~¾”Á(¥ vÆqŽî-þŸ@)=2‰äºÁjµâëë{Éáýüü*¬­Ý@²+z ±=s"›—½Âˆ÷Úí¿Ý­üßàñ¼ö餗v¦‹QRfŽ}>[Ú÷à©ïÎ9™¼2Ñ4Õ~fÖ ±˜DrmÐëô¤¥¥]rø´´4ôú«;ËÅeçÔhYû˜;j$ ö{Òø®ž<Ú/’ %•Cÿî$Ù|ù+áUÕæô°?Éõ‰ªÚ°¹ðK¿<¶§eícîã±`Ÿﺗ‘ý"ðWS9ùßß¼è·EuaæÔ·¯0âÍÝÄLød¶ÝÇ IDATo¯Ž»kõ\K$’Bøùú±yÛfb[ÇâççW¡°iiilÚº ?¿«:Dåšu£–ÍÞE¯°`}gÄøVþ¸)öL‰ëq¿ýÄÝìL¹o4û.gѸ °žZÅ ~õî:^m¡ãè7³™ºàGv%šÐŒ!t;›é÷ÖÀÍѹƒh7Ïþ½Åkß1¿›?Š–ÊÎÕ³xgõŸìMÐŽîÀ€±ãØ4l ¬ëeæþqˆ³ç3ÈÁ“°V÷0¸³Âæo~`S| ¢J=Íó}â«ËU¦%™­+g2sÍ_LÑܨÃ&áÞz>èÔdþœ÷&þ´‹£g/bÒ|hûìb>¸'EVú•Œ…ãkŸaô¼­œÉ°¡÷§m¯'x~h,Õô™lžÒ›1{ïeÙŠG©ï¡ 0?o0¿hÆÜµÏÐÂ3˲,'vÙÀž ‡¶—§ë<ûß@ŸY‹x²MýkZ_ì§@ °9¶›Ù÷„âæÌŽ¥³Y¿Ìz•y¿Çs*1Cá1yà‰Qô¬ïƒ®ÂviæÔw¯2têVêŽÃô^uðRD9Ò‘ÉOo¿ÌÜ?q6)ƒáMHÃŽ ™4ž^yé0'ðÛÂ|ðÍv§è ‰®4t…ýƲʟ,c‰C‚ª‘”œÄOÿû©Â§mëõzü|ü¨Xõ ¥®”x¯jlå%s7Ë??¡Ãk k€¡P­Sàñi¨6jṦ¢ÚTTÀr|5ÏLûÏþ˜Õ) ý…³¤GâV(šàÞ¯1ýîP Bà]ÃEäppáh†/H£ãÐq̨'ˆÿv3GŽ!{é†×5¢Ø2ˆßº“s5‡ñÒs0&ï`ù;˘¾=Œ¸aÃyy¨7ç_ÀÛï>GÕÆŸ0±‘'Š0±áF­ö¤ïØW™’Á¦Å3xm¼BÍU“hmLåߟÿäHÕ™<¾þjJ½ª¸Øü«M{2æ…~zÙ8»u9o.zÑk˜ÖÉŸ†ÿ× Ã†Mü“<œú5P/²gËiܡާ™øENìÉ]æQÒö ]̵}»—Ѻ4ûlŽíF_;v–N[:6ýÍé°!LGÖq6®[ÌÔ!ÿ‘¶âCŠ4–¿·T3qü«—xêͨ?îÞì…—®|嘼òVc(Sžj€gúQ~^:—7Æë _ó ­½MüûÞHž\«ÒqÈxFÔs'i×w,Ü ^ù”?_Ý5ÞU"qM„T«Z *A—þjsÍ£ÑXâ?kê!ej„6‹,èé¨ ¶´s¤Ø¼hÛ‰vMýЉæ€(â(xE]?ƒ°g¾–¶‰9ËŽ2hS‡Eã¥ni‰iÀ0ÏÛÆý3: Wd:¶ÁSiAع_é»,‚ý‚hîÁß¿LbÓÖs˜Fâž¾9Ÿœ¤Ñ¸ÕŒ»§:nš†žç÷¾KùâÀhZ5Ñ@ÓðŽjO×ö1x*€²¢½"(øÔíD÷º¹?c‚8±áA¾Þ~†œŽþø4¾ƒîÏóÃödú†… ÏŒç# zG㕾½|öQŠÛ^aòì?¬y=|œÙ¿»!íÏJH§–kç±tíÜO¥#·tnˆ®ÿhÌßÁ¯Ç¢+o7âîÙŒØAøÐEL+âД‡¼t´¥KûFx*íiSã›ù…dÓ¢æfæ}qް!Kx}xŠ€Øêþ~Ûs£ÑÒœ”¿VÞ²!‘”Ae9'îîî•"§,¥Ômåʕ游¸«âe%%%ñßÿa2™ Í3ÐPm*(º2‡_T›­Ø=¹át:4l6 ¡SΆ.¶ôx5ՆВ_‰kª Uè º­5{0%7C‹Ëq$·pZÈ”\2ÅõUžû5Qš® ÿ.Ÿ}”m—¥Ù^‘•Ëþóã.a7•“NG²UÕ†VÁ¼Íë„¥¾>4lƒNÑ!„@Áœ%§©SíÿÛ;óø¨ªóÿ¿ï™¬$! „@6"(à†+Š;­ûR±h­±òÓR—ÊWkÝŠÛW[­ˆn¾ÕB±ŠJ«a‘UYBBÈ:sïùý1K&³d&d²ú¼óº¯Éܹ÷,Ï=çžÏ}Îr‡±;f_n[Çð¡£HKMC)…a˜ìûqÛ¶m!?¿°Ë ›HÙ[„È žšŸ.EM[ß|ÃyŠýìÓ=z,‹Ó4]›išÔÖÕòÏ¥ïѽ{*2…/œúŽÍwîúžÔ”T2221¦n¢ëºS¤(Ð4<NÕÕUÔ'$`˜&J)²2³±êV¶nÛLaÁÀ®-6#doA"„TµŸ,ÂSÎ ¿¦¦€í;6»Nj(· Idg÷æÍù/ Çjµ1íÚ ¬FÄÙ²²R2{fRy¬‹ÅŠÕbÅbµb Pl, 𮣙&†iP]]Gl\‡¤ Àqf¦A{ B‡ÄQŠ¿¼ÊWYWs礢;úí3Ì:)tM:¨qG¨«­Ç·Ä–Ö"!¡;¹¹}Q¦‰R&¦©P¦‰©œÞ»ÝΧŸ}̰a'u¾î³†ý›¿e_ü FäÆciòX"ÖÈš¦ItT »öìDtMw ]ósïîÚ½“cÇ*yÑzçäbº<7Šv²·ÐFÔïàõ³ùò„ûyúÆBâô&Zé`e¡9atvŒ#lü|%kÇ]ê¬Ï¡òÚÞ6 ³N ]“€¢¦­=áÜð ‡AyyÕÕÕ”–VSRRrí]×IKK --žúú:ÿ¸ÌR>šq ÏYîbþcãéné€7§Úí¼ñð£|wɳÌíGS÷ -bWMÓÙÝä°;ÈÌÌ$** ‹Å‚ÅbŸ™Néi=HMMÃápP[[Ë~Äá0‹·Í·šø^½^W=Ë S{Õž—¡ì½”5ÿ >ÙÀ¶=eÔZâÈÈ/âŒ+nàêÑiXÛÒ&M\£ü;^ᩳÛ8=Þ´¸üD“Ö3“¬ÔXtBt·- Í£9ùû¯§ñÒÿ¼9éÏÃy=¬m7×ÐUv®ÏPYmk›ùnº&ÂS¡v9J¢¾¾€’’£üõÕ×±Ù¢š<Ï0ÜpÓõÄÅjÎÖõç³išÂì°ÃË”ËåŸúG6'Ô&7MM×q8X,Vç”m¥¡LÿóŽVVb³EawرÛíTWWcÍ}c6 £×eÌúÅP…IÏáæa‰Ø\ÞÒ gžÒttÊ•w9ÜÉþÒcìREñ·ñÀÖsxzîÕô‹Öа³sÞ]Üññ æ¼<ÁqºÓÐä5ÒÀQÆ×lwv6*ÇQÇšY~¦=¾ ¾å'ys{*éìá_þ†e#åå[ ˆÑêØ½ì¯<÷Ö 6®CE÷`Ìͳ¹ïœL¢\qù•…Ñe¼9Ý+ UêÌÓ×»9XV…]‹£Gþ‰L™v3çö‹wæÛ¬bÛǯñʇ_³y_%*&‘½ 9ûŽ_󳼜—ÜJZÿ!¤PKìQ°;ƒÂaã9Ëì›s˜íg÷T-™ÃóÖr ÚĚЋ¢I7pç•E¤Zµ›Kµ!mà¹G*û7W¸6Óµ0êhˆt¨záÖI¡kÒyDa`¯·ûí_½vU“çžyÚ9ØëíX¢¬Eó›«ÂšUì,ÞDIÖ~}gÑåùàå÷y~}¦^ɯ§ÆQþßüï«“<à9n-ˆA7ޱ}õô¼œ;níOLõ^Vÿß"ž»{;•Ï>Âå}¢Ñ¨g炘ùÖ1F]y#³ò4v.ŸÏ+÷=HÍÓs˜šfeÓç_³'õR¦ß:ˆ$³=/ %( Ç¤üvbQšFlÏX4¸‚#8pÕÝýd·;X¼á!Ny:1ѱ¬X÷šß¹ßkK™túål)ÿ‚OÖ¾ÊhnC×ô ¢Æcs¿„it?éz¦x?½€qÏ\KÒ²?3oß~yïXÒ¬ ì]ÌÞU›yïã}ØFÝË•C3|Ío8ù e—XúO„í³Õ|[:…¼L˜GÙºæÖ‚kɉöº6žO‡a`¸;;4 ‹®£‚Ú®Ž!ÓyuÌ» £üÜÖdùqzz¦óšØ÷-æ±?JìÅ·ðà‰=±VäXNV÷=!HYðC¹ó”ywÞÞŸØc?°rÑ›Ìm¡×‹Óo°{ÑÜ=¯„ÁOåžz ZÉK/}ΆCõLéMð‘~n‰†fV²9 Ý5’ÅuwM"9ÞäPñ¼°àI^ì7—™£“°„Hß òÐ6ðtC©q…k³°Êt(»êþÝp2Pø'M§5‡I”ÍѰ‘M`ïñA†Ã ,j”w:œÇÄöʉà ‰Ñ“qð?üò½lΘt#»éhƒbØðÅXS|{~o¢<ç gìèBb´‘œ4º?ÚôÙ,˜ÿ-çÞ[D|õ:þöîÒ.þî¹2X]cÌðÞÔMŸÉ¢yë˜4k‰®pârG0vd!1Χâ@ALr/òúfcÓ44-pŸ´fFxLæSSoÔ±£æ¿ôéVÈ”qwñåÖÑ\·á“O8‹ñ—ñ]Ýrj˜f5µ5Øl¶à¢F›žæç—<Ó°?v ¿z7ÃãS8åÖ[8éŽgøã3LjÿæNøå“LH·¹ÎíZö6*v³»Z‘18›nzàxÔ±ðóÓ¤]œÊ¨'ùt]9çgôÀZµ“¯÷h䟗G,^q»¯Ñæg¸îòg’r|á -m§*¿iF:›QÇ"Z~7ÒŽ£%T˜q ~"#uCg ® îŒ'PY°û6ôî< cÌÈBb´ ëyˆâ™ÿå³]µ 7ÞÙIÒy0ëÚBâu ³´Œw^þ¼…Cã«îÙç)?Áʬ‚¸ÜQŒËu?¸ …½ŸßÍòu¨•@LˆôåÓ” |=5Zˆ¸Â³™YÙœ28ÝCÆúyOí“BפÈšPÊÚ0 ”ß1ÌÅëV‡å©q‡ázèñŠÜë³ÑošM³‘’Ó­þõÎAhZt ½’`Ky ¦©œ£a‰ïϸ1|´ã;Û‹ˆ*ÙÊîºn ™IŒæzºˆîŨÁq¼³i+%õ£HÐýÃñN“æù£I{…ÛȆ²¹ÛSS[[ËuŸ­z–Š¥TæâÄ‚ÉÁ˜’EqõvìùŽ=›Ë|ì°Íåy¹\ãÈ]Ÿ¹W2ûöá$¸îJš5ìhM%õd¦Ýôon}n‡ûß̬qéΆ-à5êäö6]eÛµþO ì®ü nf~|íÒ-n ê<ñÉzÊÏ8ƒÄ½ß°µ>›Ë$:g©x×€>SxðÃ<]@ZT2¹6Íð õÇ•Î0ê˜w˱òãü?:ï<.¶’W7ãÏç¢Éç2®’s t°²à{ P&£ÓóHÓþÅ¡£ŽCÛØUÇб½‰sÙÅóÀåž/Êg `wpP²ê=^]¸œ5;K©Õc±ÔšXÖa„‘¾èá!lÐh /®P6;Þ2íî`vQóӥÈšpÆÔ8K°æ9§ªªŠœ¬>M΀:pàµ5u$%Dc8ŒÐcj(8‡\Ê9ÖãDN+Lôýob†õ¶ìp=5†ÃÒLFÉ(Fºr=4…Væš¡“® ‡†6¶!^‡²ƒ¢iOMå6®_O7¯\É ¯Þ|q%q“~Ï%ò±Ýq+ó6/~:šßMLÇÖåìÇ WÝÊéÅOðæ½÷òÝ䉜ؿÉ–cܱýYrãiáç§)»(¥ 6Ÿ ÏéÉÒEÿËG&׌ÍÀæS_üë…_†Ûî8íÞP¥šn¼¥­…åÇ—ýà×|\¬Èî“BŒýëwWaÆ¥§¼,äùæ!ð}ýÄa\qz³ßþsc¯ä´^ûW/g·R Ò87Üм„I»ÛÒ èÉ;,yût›0€¬ØRöW»Â#}öƒ_±tmèñ¤'@éº/øæ‡LF…Š+L›YñÙçcµpë¤Ð5颼ŸIS¼fçž{>ÉÝS¼ŽòzB©­¦´ì 55UÎ_¼ÄK£Îç¹Ä¤6mÚÂég:Á6 ³‘Âoøhÿ>У«XûþK¼Ø 1{ —Üw3?çt×Eß+àáØ×yí¯ðH)¤öÎ5¿¿ŽÉý¢]Ç ÐuÓ­œóÔ›,zjõ±i]ÑŸS üfL4gá©PO3¦éœùRVVÆð¡EtKHÀfµa³E¹>#·ív»k}šzì;UÇŽQ¼n v»=è:5 `ïûüÏC4þ)}2÷Œ[ÍRãdf]œG¬ZïsøÅ¹Ë¸ï·(>ñvFÅw={ëÉ#™þô†,x›¾^Ì‹ÅÀFR¯F_èÀÍ??yóÓ´]¬ôš8™Aï¼À·}/al†5@ê|ë…nÚ.݃¤3P ^Ǥ-`ù™Ä¯N^Vùq‡\d;_¾ó6•Ö¡ˆ!µÿn¾ûBzGÒ‚”…<ß<4uߥÅ3ìÆYü*ê/¼õÖŸø¤.Žž}R «%P½¯AÓw#kÎ$fÜVÂó òä§Î—þÚâÓ(ÌŠs#n:}MÛ •q×NæË?/åµÇPtÓùMǶ͎·¬xÙ5€Ýdñ½Ÿ6ä¬mþüùõgŸ}v›¬,¼ìߢpÊêþoßX¸à5 ˆ‹‹¢¦¦Ê3~F)å@ˆ[àø|º„LƒÈq~–”æàÁRn¾õNÏë”i`¢cq=ñ)Ó@¡£{ܦ&† º¥aú`£sì{˜wç½,/šÍŸoÌ÷ÌHÐ5Ýo`³{–„R¸ÞxÝø¿¸~q¾úA9噦ëWºu 5زu #†x CÙÜÍgŸ.çÌ3ÎâŸË>fÌè1hšÆ®];Ù±sy}û‘››ëÙ·}Çvòúæ‘›Û€ÿ|õ.82ï¾·ˆóοÀ/Ê4°†¸æ2•s5è{›Î}­‹ÚÛOïr‹+Í ü&òÓ»[dz¿zŠÃWý‘ßxu`ßzè÷À¶;»‡ªcÒv¼åÇ7~¥0•IƒÉ}Ó¸,øæÁß Ó™©†ëç¢aßý6wÎø’S’kó¢ý®‘'Ýøæ%ˆÝ•ïø# M×е0ÒG¸l„ÇfMǮ͜A7·ŽúÛÕ›pê¤ÐùXºt)S§N½ çüÔj×Våõ PÛ!<5M¹æóú `ýúb&œ:÷À²FBE¹žB‰ÏoÎOÓTlÚ´™‹/™Úp 8o„>ß5ïïhèΞ ¼ÏñGÓU>ÿli®ŠKàcüâöúIÓ¼*h °C{_<Ç…Ùýäp88zô¨gߎ;¹ü²+Y¸h¾ÝàÙ饗±xñ‡ôéã:ØíõÁßý¤ ®¿5²·×¾.joW¤gÆøÅÝD~BÙEÕrhû^*ÍJ6-~™±ydL²sa¿`À¶qÿÌvÍ·{ˆ:(mÇ[~ÄïÛú¦7`YðÍC{hºË¬ìì]±” ZO²RâàènV¾ûÌ<1=mžû”V\ 'øØ%°Ý}mîJm8é ˺Wx!â ×fÓºŽ6Ø?­“BפËšþý ùû ‰‹ÕÉÍíèžÊÒXÕ; ¹»uNW˜¦áyÉâÚµˆŠŠ£WvO¼Ê€³ùôs·‘5†ap´¢AÔä’Þ#ƒ¯¿™ººZOÕÕUÎ)ó.*V6t?EÚ ]ÔÞ-OL»ØdéÜÙ¼·×JêÀÓøÕo/£ VkÜ` ­ƒYÍm_ñþŠí”T›è1Éä ¾€{¯›L?çAr "„Xò§M‡5š®sÒ˜Sùdù?øôÓÿàÿ8ãßmÐnã_bãâ9Òe‘oh­9L}öoü —‹µ[Y§c»å…KKK1M‹ÅBE…óUš¦QU]Å¿–/eËÖÍÔÖÖzŽ×uœœÏ÷ŠŠ çkJJJèÑ£GË2æM´wDek¦>ñW®T®§r]M›¡%Ptýƒ<ÛÞ®‡2]C“kQ­“BפCˆÞ0Ùl6ŠŠFѽ{*ååå-Š#))‘~ýúù¦IW|Û¡PfCJÔhšÆÇÿüˆ#G*<û{çäPUUÅІ6:^Ótâãã<îæŠŠ£,Y²‹ÕBYY©©©‘íÛîböŽ¡ìâÝm#iÛâö.{ï“kqšS'…®G‡5M=ÅZ,’S’éÖ­›k Úñ£k:¶(‹¥Ëx…Ó£âÝ𸞃îÝ»c¯·;ÑVñð#4+qñqäö퇮ëtïÞÝgW#Rö!2„['…®I@QÓÖ7_÷ Þ@蚎nÕ±Y¼ø©E‘F6¸…‡|1BhÚæi©i¤¦8ß<`À€ãJ†Û3Ó°”{%ö!‚„Q'…®I‡ðÔ€ îŠ;†aÎ6wùÉ[ÚmÔ•¯mDí-B‹iNºBÔx¯=#´Íi.ÂLg*IDATO«µéK+6boAèX„Y'…®I»_õÄ„D—&59µ½“ÒeرkÙYÙA=,bóÈ"ö„ŽE¨:)t]Šš¶,EÊXÿíz¶ïØ.0(¥Èï—OVfVÐcÄæ‘Cì-‹pê¤ÐuiwOM”-Š‘ÃG¶w2º¡N±yd{ BÇB~º´»¨)€íؼm{ ‚ ´>¾/AA蔈¨A¡K ¢FA„.ˆAAº"jAA舨A¡KÐ!¦t ‚ ͧ²²’Êc•ÔÕ×y^Å!„Õj%ÊE÷î݉‰ zœÝagý†õ”)kÃÔuM úÐ'§O«…/¢F¡RZVÊ‘Š#ò>±`·Û±ÛíÔÔÖÐ+³ÑÑÑ+^WLŸÞ}?n¼¬9Õ”R¬Z³Šý?îoµŸEÔ‚ tBÊÊËPJ‘×7¸ø¸öNNçDÁ¡’C:tˆcUÇ‚ŠšŠ£ôéÝ»Ã."²èºÎÐ!Cùêë¯Èì™Ù*QD B'Ä0 ”RÄÅÅaF{'§S¢iñññ˜ÊÄTMwß)¥¤‹¯…˜¦ ªuWXQ#‚Ð 1 §¨qoÂña*ÓiK3´ ÅΠ•M(¢F¡£QÓ"Â4ˆÇÈÐÚ6Q#‚Ð Q¦OMPJylò8±s‹Q­ìªQ#‚Ð ñ4¡Æƒt %¬øË_ø*ë*Ct†ehha‹•ŸŒ[ Mµîì15‚ oQó“ð GظâKÖŽ¿Ó4QzdG Cx~2vnmdL ‚àK«‰{)k>ø >ÙÀ¶=eÔZâÈÈ/âŒ)7põè4¬íµL‹Ç+åÎs¤‚ φBÔØ³úïóXôɶî.Å‘˜EÞ 1\zíŒïë|E€YÊG÷ÜÂsÖ»˜ÿØxº[4ÀÎÿxŒ_¿°¢»ç·gd!MØ,Üž±ÖDD B'ÄT¦Çé†BÕ|Ǽûîç­ïc(œx×\Ü›*صiåunF;áqDE În¥PÓµÛ[Ԩꭼ>soïH`ØùçpÝÅéXÊw±fÙû…IÏáæa‰Ø\ë‰L8ó|”¦£cgï‡sx`ÞZT›XzQ4éî¼²ˆT«ÆaV¼ø4ó¾ÞÍÁ²*ìZ=òOdÊ´›9·_< 0±yÉ«¼ºø¶¨BOÊgò¬ßqã€8tG9k?x…W¯fû = NægÓ®çì¼x,ž<¶Ž§&ÔZ?í*jT ›ç?ÅÂé\:ç\7(«¦Šs/8•wgÍ൧_ãäç§3:ÑÛNõì_þ,÷<]Lß[å·ç嫵ßÔtSÆÔ‚ þD¼û©j3ï}¼Û¨{¹rHƒ @Ó\O÷IƒÎ⺻&‘or¨ø^Xð$/ö›ËÌÑIXŒ*vo¢$ó î¼½?±Ç~`å¢7™;ÛB¯§14Þ`÷¢™1¯œá—ýœ™ƒR¡¢‚„tPËw dÖ‡±\pão¸9£šÕo¿Äs¿ÓÈ|þV†F»¼D­Ôýd …FàF·]EMÕfÞ[z€è1÷qÙ· ÐÐcú2éú3yÿþå¼»æçŒ˜àr†¨Zö.}Š?<¿~·<Âo'õnWAãJ®xjALÓŒ¨¨1*v³»Z‘18›nz°ÆO#.wãrߤ°÷ó»Y¾îõ£ˆqu‰ÅöƘ‘…Äh#ÖóÅ3ÿ˧»jÜ{#¯/ÚIÚEs¸ïê~ĺvhªr o|ð#7ÿ™ÎêMƒ=Jùúöwùçök2ÀÝ=9Qã0¦iâp8œ nGB{Š£b?T+2†d@˜Äd"K[ÆþïJ±KqÚfËkÜ·¥š^Sgæy@К)cjA„xÏÚ‰DC¡L¥@Óµ&ÆÎ8(Yõ>¯.\NñÎRjõX,µ&Ö£užôh8ÓˆJÏ#Uû‡Ž:¨?´…ݵÝ<2“hoORÔ—lã‡:?ÎÆ¥Ïkžý¦i]RƒQè 2’ž÷¥ÃÑä±nÙx®+­¾©P®.FÂ+e #¢ŠYõÞK¼5à>®‘Ò~ƒ¼]´ÅB‘"jA:!‘S£'dÑÓ¦±aë~jŒ ¬ÿбo >¶ªñ×ñëë IVûøøÉ?³’†YI®Ä5= &ÓDL4—æiÜ8+ÃA #o€ë bÍΉNMÀB¹ûȈŠwCê5 íé©Ñsè­Q¼y/Õç§“èsmjöoäG¥‘Ñ·;÷äôôS˜þÿ®â›eîó86ã!¦MÃ֎¦-DÞª¡ ‚ ­‚ÇScFh‹Ȥ IÔ¬œÏ’ï«1 ÿcj÷n`—чÉSÎbTaýó é“€Ó…â>Ι¸Æçâ\ÙšÜ,K%›Öì§Î4céÞ—,K{v)zdg“““Co×–gqŠ ”ÃŒ\ž½VkJw¤âmîSÈg¤Q»ò þ¾­ªÑµ1k`éëŸP7š‹†&¡{ò¡¡EçpÖ`æ™ð¯'~Ï+«Ë±¸®mµ¹_hÙšˆ§F¡ù)Ýqœ0õN/þ#ógÎäû 'rb~Ýõcܹ³.äç}û“Á{,yû#âO@VÌaöUCƒ÷Ä=eWy¼)Î.#W‰Ã¹êü f¾?‡ÇÌË™8°ѵåÔde\Ÿ"®:/™KžàúåœsB:1õeüX™ÃéóIÐãIO€Òu_²zo&'åÄciaŽÝösÛ2ä±í6&%–AS§3yÃlÝ?ƒí“ÎfL~:–#»(þ×b¾ØÓñ÷\ωÉ—— · k cnšÅ/ÜÏÜÇÿDÏÿ¹ŸÉ½£ƒ jU\ÃÍ[55‚ ÖX|Oï>’_>õC,ä£U‹yqñQ l$e0úZö̸µ”ÞYÈŸ>«ÀŸFaf¼sb‹goQãÝ%CþÕ¿ç¡Ä×ùÛ²üñƒ*TL'ß4˜1½Ó)øùC<œô:o,_ÄSK*1c’èsâÕŒ>½?Ýl©Œ»f2_Î]ÊkÄð› 'lØÁWÖâ ¹~ÎÓ ùðmÞûò¼²äŽøôÉ?‹éÓ/gB^7¬n»;SÜÐMgëÉé·ÿŠïfÌá¯Ï|ȤÇ/ÃÒ«ï¹$x«Æ(W¶ùóçן}öÙhZ;*AòÅ¿@)Åè‘£©«¯‹hØÊ4]FîF\ÓÐ4Ý9ÎE™®ñ3î£54]÷ŒQ¦BG÷4š Ó0A·4£L/Áãs¾ïošÖ–r¿É;üãG×uêêëØ¼e3‰ ‰œ0è„€íÞ²/cÜØqØöÇÙRÙGÓODW¦‰î#\œÝ?ÊoÛ¡kÎ/[¿Ûʈa#š¥1–.]ÊÔ©S/j€j×Våõ P+žA„NH«¾ûIs6’·q5¤Ú#/‘£é.¯MCš4]o| ÎóÂoê7Ÿ°\ cDf|y© ëØvžíÄß>øÎˆÒttüm¤¸6m‰‰t H!¢F¡âY§¦ f”tUÜB%œéÚGÔtn4M ùJŠ– ¢F¡c*ÓÕ%#4…gŒG8¢FìÜ2tt”¦ZµOD B'Ä0Œˆ®SóSD™ ‹Å‚aÔ×ׇ>^ìÜ"”{±Ãkµ5‚ ]×±ÛíTVV’ÐÞÉñ£Ñ(d€ßÛš}û÷a‰ ‰Mçî2aÓ4§­ÖÖ“"jA:!ý ظe#6nhï¤tj”RX­Vòú擘Èá²Ã¤&§¶qêº;ví ;+»ÕfW‹¨Aè„def°}×vjjjÚ95 8gFiþº¹fR¡á·¯­–±YmôÎéM”-*è1EÊXÿíz¶ïØ.K´¥ùýò=e·5Q#‚ÐIÉÊÌ"³gf{'£ÓJ¨DÙ¢9|d¥¦kŽ(Ü{`%¥HKÉ '3— ¯N€ˆA„NŒxÚ±sÛQRzÃ0()=HvÏ\šczy¡¥ ‚ †´”tt]'-%½Y‚ÄS#‚ B"'3×ËCÓ›‰¿V *L´0?AAÚêóÿêTÉhl’ç¹IEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_initial_dialog_local_network.png0000644000175000017500000014272512235000130030227 0ustar00murraycmurrayc00000000000000‰PNG  IHDR”NyêusBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìw|EûÀ¿»×/¹4Ò;=ôÞ‹‚ Ø¥(‚‚Rô‡(нcÅú*¨€¢€ÒP|±+¾vAT@¥÷Né¹¶»¿?îÒïr !`p¾ŸÏ}’Û}æÙ™Ù›gžyf@ @ @ @ #8è¯@ ‚†ƒè¯ÞÇEÒ²eËTUUëU3@ g–Ñ£Gã14@­ôWðeJ=$áà\`ݺuf<†€ (•þªøó„……¡×ë…a Á9Bhh(€!à.÷WòþÕɯÇ@–ea@pŽÐ.ÊbK§|z t:0 @ 8Gðöé<Ae£@õ~÷í1„Ç@ ‚s oAe£@‡gjÁgð¡ð@pnb¦¢Q P1ÖÀ·ÇÀáp@ çv»<†”nïGÆk0øôØívTU†@ ç^ÃÀDE£À…Ç((1 |{ ìÅÅ(Š" @ μ†A ÇWPÁ(?©š&<@ ü ñ»*Ax @ ø÷áÓ0@x @ øâ{U‚Ó)<@ œCxc â;øÐn†@ ç55 äº\, aP'Ã@Ó´ÓªŒ@ ‚†OÃ@L!@ðïħa à߉0 @ ”" @ ¥Ã@ A)Â0@PŠ0 @ ”" @ ¥Ã@ A)Â0@PŠ0 @ ”" @ ¥Ã@ A)Â0@PŠ0 @ ”" @ ¥Ã@ A)úúÎ`ëq3¾9Éž nU«ïì‚ :šDš¸s`mâMHg[!@ ¨õjd¸yä£ã´kM÷66t²øiü{PUÙ<òñqÞ¼.h[½Ûá@Pgêõ—ê×}…$6 "5&IFàß…¬“H !ëd?lÍ Y:D~^ªªžmÕ‚Z#Ë2!!!´hÑ‚°°°³­Ž ñihÚéqù>éà’66†w³ ìÁ¿• Aü²yiI\\,z½ðŠ¢pìØ1þøc=zôÀl6Ÿm•õD½þBeæ»è›fD–†à_Kr#?é¬Ä'$Šé4AƒE§Ó“˜˜Ä±cÇÉÈÈ ))él«$¨'ê×0ȳ“nFà_Mb„™<‡šÆirÆ g°°0²³³Ñ4MLŸ£Ô›aàV5 ‹Ä„šê+  AjÂîpáRTL²X!,hØ„††pèС³­† ©·_©Œ\±¡:ôÂuêÇ.Þ˜p£^û‹Â@Ë8Õ"Žl^ËÚ½ù(å“ÖF† æø+ïSD'KÄ…9‘cGó8ÎG)âЦ_X»'·úÐG|ÎzÚl!ÔýÁüc©7AVƒÄp3§eñ¶óëÞŸÏ¢¯~gÛ¾t\a‰4oÛŸQ7ePcëÙÙ¥IÍà£I×ðì6…Ê}rÒø…,½±1æê“-Ä$$’„.;ξ“·|­×.bqcºS‘Q[Ô“|3í&ý!·èlÄ$&Ò¼ë%Œs1"çîº|å]’™ÈÈ+&±Qq¬ï¬þíû3)’ƒ‰KëÊë&3¡Oúú¨ûNæ?üÛF¾ÍÂÆÁ§Vj&M¾–œ#™5s<Ctem§p=÷ }ô›3x<†újTjß>v3Ó~Ì(mÏщ 4ïr1cÆ ¡C£s»=×¹Ëa2p:˜LÂ#|.Ro†AfžÄFfdIªÓ<”Vø7¯ßz+ïì ¥ËÐ+˜42}önÖ}¶ŒGÆ|ïÏÏå¡>êçG±:$P%ézž¿³ 6äýa‘±ÆÇc*ýîcCŸ˜ÍU’„¨|$É»ÄÍ3§Wš¼62j‹ä&ïx:®¤Ñ<;µ+AE™>°ƒW½ÄÍ+ßçê³¹«[Ø™/÷3¿ò®‰f2r Ñ´ðSº^+Úμ©·óöv m.¾œ #R‰”sØ»e Y MÓЋ9…Œ5TUEÓÔSÏCSQ÷Î%Üýd4o?}9É&©Â9EQQëë4'¹'2p%ŽäéÛ»T”Å‘ƒ;ùé£Lúð†ÿçU¦v =7Ûóé¨ÃJØl6 …apŽRo†AnƒäØpêä2ЊøsÁS¼³3ŽëfÏarûPïÔ„ÆÐCXc8)múqÝ”I\ц®D WÞ{…™¬eW¶Ž˜ÖwÏ­\Ù܆N=Á×/?Å›köp,£‡Ll«>ÜpÏ -/£Æ¸æ*Ìüh@HS:ué⽿‹~Í,»k3û>Πh=’šÃæ¯2ãý5l=®“Ö›‘·ßÁ¨öáee¦æñçÊטùþþ:š.¼#Ÿ™Á”¦»xbÄl¿v!‹Æ¤b’À}x9cF/¢ÙŒå<Ñ¡of<Å›?ïæXf!¬$t¹œÑýd~ýì+ÖíÎFjÔ”¾£îã¡«[R’a]êÙ_yãTgÆbÃÌÌÈCÓTjýLhÅl]ø oodØf1¥s(¯"ÚECA’‘•,ÖÌŸÁ[ßýÉcùØ ¦Û=oðŸKã0¸³Ù¸b³V®c×IÑ­Îã†;'qy³`t’‹ƒNã®ù¿q¬PAšL·+'qÿØîDé%ðv$ûßÏùó<êt|üCfŠ\­Üòú{ƒ.#Ûõû+Ü??…¹7·Ã¦“(í¥¼~j ÀåO®Ì¦gFsÇ–!Ì[x3-Í2Ráï¯:K®š2”åÿ·‚%?epÞÐö/º›ÉïäÑkìdži&±û«¼vû]¿5›KÚóÒ»™4?›n£&òdû(¤œB*µçÒ]Úž5O{Þ°…‰cyäÞV˜²·°ìµ÷xù÷x.¸áLæš…¼:ûq"ۼí,ËÚì•™0†ïl‰¥àß¿;Ÿÿܧ#yÉÝt‘ýÕamb6[0'Oæ V&œ›ÔÛG…ÅD‡Zëd¸sö°¯P#¾cc‚« ×%¬)IâcoÏÄy¾g\Ô¤'ç÷kUîÃyýZ£»îvÌÛÄЧ{`+ØÈëËÑúöw¹ýò8 ´‹ËäÇQ‹ùhçdº´Ó¼2zпWk¬r/º%žà×Iß±z_1]ÚUu+oy‚!ýŸ,ûn=ŸY>Aw[Üu_y’Ǧç´n?]î}‡!qFŸ1JÞ ²Õ ú÷èKÏ¡èèˆçG¬,%2…–-R1JÞÁé»Üüéß9u3o,ÙMÄÐY¼pK;l²„š‘ÅÂ_צZ0't ±þ=þÞžNqÞ^^_²—ØÑoòäø–Éý»7ÁqýM,|s##žïCXþFæ,ÞM̨¹<{sA%¿H’„T(·’:éNŸîm°ÊH8þ=×.Má’k.£·MFêhá÷ïîgÝúã8[7Á”WÇznê§¼ë@t˜•ü‚¢Sråºsö²·P#¶} Á²ŸçÓ;âjÚƒ~=Zc•IBË[ËÜ÷ÑêÖ…ÜzI, ÚÄfñóØ¥|²óf:u&¸I/4ñÊiÉ¡ooæóßbï‚U4°D$ѼyJiY¨y¿”[Úñ”è+éˆês;ÓGÝÆä^ Kó§¹"ÌSýÕüêå>Òò|ZêfòÓŽ|.²‘µy#éȸ¶ÿ¾âžtÐbíŸÅ$í@¸®\Y•–™wÚ¥\šâÛ‘ª_ÁÖ'(ÊÛËÜ÷ö3rÓÆ¶ H–èÛ5û¸[Y<ÿ7†NïEháoÌ]º‡èk^ãÉ -+´gŠ<ååñ’h%ÿzê\Ó¼# kjzvmUî@üñ³,™!Ã.¦§MFêhææ× Çq¦¥b P&Ú–ÈìJŸ­±Ê=è‚õS~àë½Åtjê»ëò;o³Ù8|øÈ)_/øgãÓ0¨ë KQq;„×qg,Í;ö«Ž×ZéXɈ@gKc`{++wþM†³;¦Œ­ìw¸9üÂHú¼Xš ª¢b9^„Ú®ª sls¢ù˜c¹ŠošN`æ=õ–™d!Õê©è¢rïíŸ3â™ÕO»“Çbôs/æ#¸¡ëwÌœz;côÈa J ¯PAžANMæ¼}ëïJÿ‹]ÅAtД`YFòþ@Ôº¶5(qR8OüÍ‡Ž½’°–È´¤Ð§£E›ÿ&ÝÑkúŸì¶ÛèØ+¹4M푼úiÔ$Ùä8@ ‘,Q¤„Á_ÙE¨š†ó4ÕsÍË;0aÁf·§ËÉP;G¦¸ÑY.síWMTþ¸×/¡i8Ò·qÀáæÈKcðrÙyUQ±œ(BÑŒ¤¯[ÆìÅ_òëžtŠe+úb}®¥\çF¯M䕵«š†&Yh3öQ&mº•ÓÿKÛ'SÊÒÔ@®Ö¾ 祺Yøã^ {¦ðçOÇi2úzŒ+¿aÝ­Œ¿ñkv }ºD¢¯0j×*è_¡OT5O{ÖÀy|+{Á´ïž€¥ä™6'ѳ}KþÜÊ GÌ'þb=˜öÝKÓ”¿¯-UÎ0ÐJNW2 5À@Dj8N’ãÐÀ‘ gàVU´@eݦjÝ›bšÍgÏu£©¾ë°.‹• ç0õ2•—_LT˜ ©ŽKõaMH6ï[P8"¡‚  øðfŽhñÍ"0H¾©Þ CÓTO$²âFÅLïûgp{ÛŠÞ Ktz)¿Êõ’ÞŒ—¿å€A‰´LK+cP®#QóØóû쪆ºëk~>v£Rü¼eÏÔ˜Ñ/¯ ÷¯ŸñÞ’wytâ»,Ÿ0›Y7¶$o'u syý5Å‚}—q8Žmæ€[#¦eFïOMåÎS’<£@ @UÐð¹„_’1êÀYìöL'Ô Ö H8QJËCɪۛßi¨çS-oH’DTˆ™œübb"lµºV–L¼þØv„"5PŸÁ.~Pܨš…žw?ÇäÖVÊ›–èp´ÃòдE ¸…GniC¤zUO?Ï÷t§jY[]ŸdjÌÕNbíM¯ó̪±”uD ¹zžýã™õÑìÍêÎÿö„ÓòB7¼ÏªßŽs‘þG…u£¢©ÆãØŸtiÄ´ˆô´gÍÐ3Xòª‚¦Ußž]EµmÏ®ŠíY_©=W[Ög¾=—Š• ç&õ²Ò/·È3P²"á”?¶v\{I Å߽βmE¨åçûùxΧdŸÇu="Kƒ±€²ë]Gùõï| ‰-ˆ6É£Z’¤·³w¯D|“¦4kZöI 1Tð”TÐÃsÀ‡Žžã²,—û”œÓÈùeO~Ê„9s¹­Ùvf=³ŠNÊ®­—Œl¡IŸkypöf_Ì_ï¯d{1 7f†Â“vÔ ºU–Qù{EýQ-ˆ“rùkS®òiÜ_ùc8öñáÌ8fíÇØþ±ǵ!՘ǦuGq”Ètæ—Íù“[k–1E§‘¤ÏeÓº#eiJ>†PB%2w¡˜J:ãïžJÎUNïISçzö[ÞuûÄ„[ÉÍ÷x5´Ú|‚Ú2|`8EßÏgåÎ"Õw: lÔêýè5#Ñ`gß^‰˜”T7N¥‰÷¤Ã~ðwv»›rõ —Ò»MsZ¶nC“ ©Äå. 5AQv‘gôZC¹Uô£D=ïõ óà­í8°t¿9ÕÒ‘u`¹zÎBjî/¬úüSþ êNÏøºžËÑÕ_ðñçû‰x!MUËBóQ>jñ>VÍZÅqkoF÷‰Â“FŠ)ŸÍëb/¹_Ça~ý³crK¢`ˆlN¢!Í딥)ùèlÄ…@֞ÕÔSÙÝû©§²s%ß%­¬¼— >d–ËÇOÖõLaa!‚szñn­» ÉFçÿ›ÆèßocÁÿÝÀök†2 M<úì¬ýø=¾Þcã¢g¦r^”Éå¹$óû·y«ñÅtŠr²ã‹ù,8Å5w%L–#z3ix<–?ÀÝòx†wKÀbÏà`^*—]Ñ–ÐSÑ1w›~ ÃVÎ0ÑYâi•|‚×_øA×ÌalÇ6À7cßâ…¯ÎãÕËã*¸ŽýȇëTR›FaqcãÞ|´à(‚u€!–Íͼ÷åÞm7‚æZ&y±ý¸¤eíFrxÆ_ΔòlÐM\’*qðçOÙ¥jtðwQÎ.þ؆¥8“#û·ñêÿòëñ8†Ï¸A1zd©;“G¥rý™f¹™+›KìüìMÞ>œÌø§º*IHὸeDã–Ü˽Úx®ê‡¹(“¢Ô n–Àù¥òú[3xrACÛE£;º“uÜÔ¹žý•w»0ß+Sjˆ'ΠÐ3r«)˜.î`Ȇ'Xpë$vŒ¸”ÞiIDèò9¶k+‡¯æ¶óË»Ë OïÁ„+c™¼rÉ×seçxÌŽLç¥pñ¥­0ǵ"ž%¬\´ŠAmI´¤s¨°¤3ÓÀM»æ&V|½˜m®¤©–E~lo.j]½ÜŠËÊý-ù_GüES¹õÛ‰¼ø»Rz.¾!: }|?®l:ŸWe}ÍRLzŒý?o>ËÕXÆ>ŒYªX¥ÿçîaóíY;°“Ÿ?ý„ 'b¸ò¹;8?J‡,u榫“™°ôqž2ãÒ¦°{õ;,>’ȘG;"Ö‰WÅ1iÙ#<¬]Ïeíb1gRœr›ÄÒP óÞžÍs‹‹¸¬u$ºã»ÈÑ*ßeýÊŸ¯X^Ë$L¿uZ§ö,V&œ£Ô‹aPTXDb|ôi‘%Û:pÇüet}w. ¿^ÁVdá Ž£y›¡<öèx†´©°)ŠlÎgý’çX|B!<µ#cž¿—ÿkä „²Ò~ò̉x…9ÏgÚŠ\Üæš÷¿•ó/;EÃ`ÿ"î»cqÅcñ#ybàzV¹3ózO°Ôx÷ÿˆ sæ²®ï#ô ®x‰+kÿ[¸‚?Òhš™èÖ¸ç‰Ñ47ËHR8ý¦Þϰ'fóöc÷b·ÄÐk|k·¬¥®R=¦ÎäqÓ æ¾õŸ“Ð,Ë­ø(AOHt#äï—rÿÔ¥ ”DÓÞwðúØKécñþ¨˜i9áU^šÉ«¼ÄéÑ-zpÛ¬;¹.ÍRZîmoy9á¯0{Õ\ZšjNà‚»;3°Yê1‡•S[c‘=Ë‘$Y®²,GÓTÔò1’ì}ë' G+ýNé1d]U9jÕ]½‘% U“ueK¦<éKŽUÊË«“ßû£d“’•=÷UQߚ诡©Zéò@Çî79î\0 ·§UÜÇ êýyÝârՀŊeê™^©Ü|*—»T®L5U­¸d±T†{ÒT<·TR¶¾î»®õ쫼ëöãwìD¿þñƒúv=ÅgËSw•ŸI’=íÍG”^©©eAh๦d/„Jç òýú/‹êäVÈ_UPñ¥›ïç+ \MEQµJmÈ_åÎ×¢=—íU~ýèX]{.•Q“öìYòè«=û.“³Óž³²²Ø¹s]ºt†AaõêÕŒ5j8PŒg MPXîÿbÀ^/{Q¡¶àÀ k$ûZ“ì3!²NWíëm%IFçs_P ¹Ê _ÇJ²ÒU»½hIÒW’+ÉÈÕîU*!ûHPQ·@ú;Ù÷å‡lI‰ ‚œÝ|½p9G¯á‚äªÁZî¯BZ¿eZ³4’,ûÉËÇ=U‘㻎êVϾ˻.„Ú‚).̧ª»·æx:±ª+x:–òß+\'IHU¼BZ5ç*Ê‘«DÚUw­üKë·ê9Þ”+IètR…cÕåQñ|ejR^µK#É’ï’Ÿz’$o;-WÞ>겺2ñ•¾r¹ú«ÃS%88H¬L8G9í†ÛíF§)X¬¾6ËœUÔBŽüõ‹¾ÚÎñB7’%’¦Gñ”±´¶ÖÐðœ2V«¦àr¹0*G™ £Q¼3á\å´EEE„ÚÊV$œ1LM¹eÅLòãJºúÞýßUÉÅYSoŒ Î„…QXXDhè)E´ÿ(JV&ÃàÜ¢^ ›­vë´Oþ]þ‚2ü»Sg‚’—Ï„††œmU‚:S2 V&œ[œC†@ðϧÄ0PUUl ¦¨¨äM;AÃ&88ÈÛžç§Ý0ÈÏÏS l6ùùù¬^ý¿³­Š@pZÐ4¯¿®ÝZucðàÁõ:ø>톢(˜L&á1|`6›6l˜5å@˜åË—×{õ²Á‘$I;vŒ 6P\\\öB@ µÂb±Ð­[7âããÏH~õblܸ‘Ë.»Lx@ ¨#Ÿ~ú)qqqg$¯z3 ŠŠŠÊ^Õ+à”9“Ažõ6Ñ)¦@ 8=œÉ>µÞ<gŠ5¿|ËW_­ÂérT9g±X¹êŠëhßN¼ýK ‚šÐà ƒ/¿ü/ݺõ@§Ó¡ªª÷£ ª*‡ÿ~´˜¨Èâã“ζª@ üãið†AQQ1{önóÐÊ¶Ž±ÙBIHHböÏúuà F.t½{ ¬¯‚û_Ïz•Ÿ’nâáa©˜þiŽ‹º~@ 8£4øÅÔnE!77‡Ý‰ÃîÀápàô~²2ÓQÜ.RS“š’JJr2I‰I$Æ'KlL4!¶ >ÿò¿õ7£œdË·ß±áP1J]óP‹8´i kö䣜ª(ÇNæÜx ×¼²…BU;½ú  ÁÓà=Š[áäÉì҈ͬ¬"22òQUµÚëdÙE©A IDATY&2ÒFddGq5)U v|ÆœYKøróarœBcSh7ø&ù¿>Dë±5MC;[àÚwðæ}÷³uôÞmbóý–D5ƒÿÞ4Œé[ÔJY¶~pï\l!&1‰Äè`tÒiÖO  žo¸Ýn2ÒÓq:=Á‡y¼=!ƒ±ÚëÅ͸ 7bµHÕjÎZžžò_õcâãias’q`;;ä0¬gÁߢªJª((Icxñî®Øtžþ_‡­q:£aO¾ÎPIB™@ ¨Dƒ7 ·BNNNÙwEÅ`0’ŸŸ[mÞUU)**FÖÉø{©óà6æY¸ð©‡ø¿n6Ï([» Yöv¬®,Ö¿;ƒ+Ö°3[GL›L¸w Wµð3ª¯.½¨ylùàf,ÿ™?æ£ o͵ϽÂM=—ï{ã:zÍõüßyúç¼90 ¹rÚ„Ž]ºÐHWî„$!9÷0gô|Üëu>¼³ ÖSÑO ç,> ƒ†äVVU—³êñß6m¨Ö0¸àü‹p9]èŒþí#CdSbYÅÆO×r¸ý…¤ZdO[šÂζùS˜¼ÜÊ5w<Å]±üòö‹L¿S&iÙ½t3U– }ˆÂž…S?7‹cnáÙŽQH's7Q2À>ç/Ç(I'ÚªšæY¡Qr‘$¡óþ¯© Š_'I ýtÛ@ Î]|öˆªÖp~úÝnƒ¾ê¸¼S‡.Õ¾Ù¶ü Åí*A9O=¼{ž’a?/¤ÏeC¹öêËè™lEhy˜óÞ!ÚL]ÎÔ+â0HÐ!>“¯YĪ·Ñµ]E%¥ïÒr3³î"fô[î’'0¼[{ósù•m Õ‡"‘¾þkÖîKf@“éÃ{3ùênX|7÷h¸ªc<æ¢ ŠäÂ&±thaæÝ/æ³´Ýšk™äÅõçÒva§¾Z ¶ú‰e @pNÓ` ƒŸþž /BxXefAY§o·‘•}‚ââBÏ™rš7½÷¯„„F°mÛŽJ¹¨(r8¶“ß²ô•¥dÙ54c‰m.æîW'qE¼I2ÐþÖ7y#b&³>šÇ£Ësq›#h~Þm ¸¼-¡†X†L¹Žÿ=õ!3W¤×=íªO¯³Òvò\ÞŸÉkÿ}ƒ—䣚tO.hGÿ;`øc³X0íì–zOhÃ…íB9嵺ÚêwjÙ aà«71,^ú®óâ‹.<%×ñêÕ«9r$Ë—/gäÈ‘õæ~ž=ûE’’“°X –Æhš†ªz}žÞ¿â_¯1Pf(xþfddròd>>ò,rù ~MCÕÔ ^$ Yª¨iª7ß’42º’ÞsZ¹cÕ¦÷q^’uÞe‰žeˆ%úH²\e£"MUP©(¯ÜYTE­ Ë©è'‚3DzeËJûÖÁƒŸrÿý@pnÒ€ ƒŽ¼óΘM©©)€\lçù”Œè=»zFÙšwy£VújfUUÙ´éOlÁá4kÖRØ à_Oà!Ä—étz.ºè*>ø` ßÿ Uw3ª|eç+oo`³…2fÌÍõ÷†E@ ~v><ÓjÔ“ÉDß¾çGVVV:õððpZµj…Ùl> @Ðððó®„>ƒ¨¨(BCC¾b9²,c4ÑëìÌŠ@ §…Û–tæFcõ¯W@PsĶ÷@ Ji°ƒêP—ËUîˆïÉ‘òG#:±>O ÿr| `Q‚_Ö®[÷ßþ¯l¯Jö0*ìkàÙ¸ð1hÐ`ú÷;_,YÁ¿Ÿ†ACÞàî«Õ_råWbµ†b01M F N§—ˉÓåÄétât:p:8œÅù|þåçôë{ž0 @ð¯¥Á.Wô‡½¸˜[]¯~ƒÑXÚÉË’„¦y¼š&½gÚ@S!¯°€oæÝŠÝn?›ª @pÖiÐ1¾b TUÁî(F¯ÓˆL퀦A¨ÍLLD»Ÿ$¯ÐMëÔ(b¡(N·ÂŸ|ˆ$I¨•^áüÀ}‚¯g½ÊOI7ñð°TLçª3CIçë—Ÿã«ø[yztÌÂk#g…36•ÅÎ];°;üÊM&-š§Ñ(¢Q@yþb L& ïðÇtÄK I ©´HMQI×TŽeÅ ¨àö²,£ü å$[¾ýŽ ¯GÑ4¨¯S-âЖ?8hkOÏ&¶3¿û¥’ÏÎuëØÒs¼Çc%ì@ 8+œ±©„»v–ÖšÐP¿iòòrÙº}+=»÷ 8Ï(–Àérât9p9]Ub >ýâ+ö8£±;ìNÇA’$߆šÁoÆtý4¾š3ˆFga¿hMÓJ_º=ãÍÜÙ7Ó)¤ÜË— ×qç¥÷pü–å,¼&c µí;xó¾ûÙ:z ï6±Uó¦zDk›k Á¹ÌóØvBCB«íðCCÃpTãQ¨ ¯±ªÛ‰Ý-awiØ]ÞU H(ŠJÕ®ICUùŸØeytsïXÈíÓbYúüU¤”Î5x^¥ÔÂÊSUE¼/B þå4Ø Ž<ž‚¢ª„$u&8±#I­zÑµÏ lÉÐE·¥C÷ |1ý¡×ùƒQU­4–àÀæÿqlÛ÷œÜ½‹Éˆ$ydžR·¨æ°é½Ç{Õ ºôº€KÆMcñ¦“(å…©ylYñã†_D×^½éqÉDfl)DÕ\xÿn.Ô.={ÓcÈ(nóÒݵÐ$ª#ÑÿÃ]on&_©æ:Wë>¨KÐ¥× .™ø +wäWÐsß×Ñ«Wo:÷ìÍÄo޲î±!tú[‹½TáFÜ—Q+Žàô¬ó$óó[è~Þ|•© * %‹ŸçÜÏuÃ.¦w¯Þtîy·|tW%ƒDÍÛÄÌkûÓgòrvÛ}úK@P4ØàCEQJƒ]nUNæhfù…NÂB,H’ÌѬBT±k–Þƒ¦h¸Ü.\n'GÅh4"ÕzrÛÁη1q^}ÇOåÅ»>›ËŒIS(^4‰ÍÍÈ’“Ý §0~n=ÆÜ³£NæoB’d":\É”i#‰R8¶~ /,˜Æ‹i+x®_x\úròÕ<u,·>üÓ[½ÃÓDû¨X;ÛæOaòr+×ÜñwÅðËÛ/2ýN™¤e÷ÒÍ{AÌðé<y“¯YĪ·Ñµµ'%*•´–©%OY©m. •ü?lÏghlY›~å:\[×°¯¸/aúƒü¼ÙNêÕiT´”E8€¦ܬ7z·Å*{ËÁé-×1¾|úU^Úß—gÞœLƒ0 à rÆ ƒÆŽ÷{N–k>³¡(Ji° ÍjÁ`Ô£"„^/£*.ÍíâðKз_š7ké tô—$©Ö†óÄŸìvØèÔ;«,#I YRéÛÉÆÂMqÂÑë‰-ì²ÛèÔ;¥4M.ޝYÄŒŸòË®ÉAè‹ ¹vjõÎH9˜öŸæ¶ßÇóâcïÓáùÆõLÿ›}7‡ŸAÏçKŽj¨ŠŠåxjë’ÒÁÓQ{u”#:pA7ó~ØCQ¿ÆlþáÍn‡qùW¬=â që²bèß=íÄçË"¬ÄâÍ£ryg~2§•FÏ»› bM z³-@ hˆœqà6ux 7V“‰}›ÿçw @ûœQ£B,ÁÁ—ðð´‡(*ÎG¯×c6™iœÚ”ؘøSÒ§²=!Iž|=Óð ¾nÝu`wß?ŸüÁwðäíí‰ÒöóÁ£OòÍ©è`jÂèÇnçç1¯ðø7c-oY(nTÌô~𦶵–+- kLzéˆ÷¼KJèbè= ‘—W~ËîÌ^|µ+‚w "lÝR>XŒK ß²?¼&›× ,`m7˜´}_³ìÙùô›s+=ÂõÂc gc`2™9tèÏš€Á`Ä 7 7ÐëôȲg䯪ª¦ ¸• ±’$ñö¢·éÙ«'ýù7W]5ƒ^ÇŽ]Ûˆ‰Ž«•×ÀÓšÆÆEüñËì[`•$pbí¦|Œ©­‰5I£ÓHÖ/å_cïØÒ“Æ‹ýàv¹›s÷MCéo@RBh*ñm¹<$ ´ê‚ ËRbH¾’ÇïúkžC¡¢R2CaˆjI²ÞÎÞ=ñW4%¨Ü-J’3af(Ì.F©`HtMæ¯àƒ³9¨77%ÅtA<3¿ø„ÙKô…÷ÑÜ,aŠ \’»ú;°6΋uåÉ›Ÿã·ãXúòÕ41 Ó@ ÎgÌ00™Läååæ7Mnn&“¹FòFŽŇÿ]IaA á j×¼K%¼PUÕë5PA³ÙLß>}HNM&''—°°p¾üêsÚ¶mCRbŠÿurv±ñW¶Rß¶ŽÐæhу[G§2úûyÔò\Ù\bçgsYp8™ Ó{*IHá½™|u7,¾›{´ \Õ1sQEr~|[¤,›÷>!C:t‚ƒåF×úâC$Ò×ÍÚ}É ¸ùž„KàÎÕ£™¾¡¸ô¨ч[FÄ3nÙ}Ü%O`x·,ö æ5æò+Ûjˆ¥C 3ï~1Ÿ¥íFÐ\Ë$/®?—¶ CŸ8áÍ_çÅùÄŒžHc“ãù“8gKÔx&>æÙ©P \‘dÌÉ—òÔ‹‡¸ñÿfrïÛ­Yxs‚ÏÂþ@ðoäŒ-š§±uûß8¿iL&3-šµ¨Ñˆ½W^ôìÞ³ôûºõ¿°{ÏNÉÉIH’ÄáCGÐéu$&&Ó¾mûR¹ååçäæðÌ3ÓÃÄêW%XÌw.©p¨Ý´YpI-'ÎbnÐ f¾ÿ¦¦kD·èÉ”9wq}šÅ;Gn¥íä¹¼>“×þû.ÉG5'0èž.\pñ(ž¿?gæÏãá/ il±´Oön2¤‹eÈ”ëøßS2så@zÝÓŽ @å£çÊûoá“kgRfXi뛼1“YÍãÑ幸Í4?ï6\Þ–PC8ýï|€áÍbÁ´{°[bè=¡ ¶ E§‹ãü¡mùϳ™ ¹°1fIBŽ?+šÍáe×å\œbôÞ§¹e ±µŸÀô‰¿0zÞt \À¤5½^ uÁ×O­áÝwßu^xá…§ô–ÁÕ«W3räH–/_ÎÈ‘#+È¨Éæ9µÉ³äm‰§ƒûî¿—‡|‡£$ešªɃ<ÀðáÃ$(,(dóæ-ìÞ½§TŸððp^™ñF£Ñg>šªøÞ RÖ•ŽÞ5ME-M$!W 2¬œ$Y‡,U=î)¹¤'ôž×$]¥ÞQSTª/õž”ÓÑ—T©y<,ZÉ)Y*ÓAQµR4Å“·¬«hNU_ž€Çª÷RõxI¹—ÏS þ,[¶¬´o„VŸ—„ì?£*×I:ßyÌÃçɪÇkRî@ 8½4Øàß×þLJj ²NÆír‚$I4j¢(´hÑYÖa·W‰%HINE¯×ŸVCE ‚sk|ñÅçÜß„‡‡NŒXa@P…k yôáZ]~J› @ðo¡Á³^Së7Š%àßNƒ5 D/Áé§^ ƒ«fíBÚ @P'®=À+û+[ì)Ý’y¥¼½ä çÔqu‡¦‘•ëâx¡zj#žŽ#¹&ÍB³=fU%=£ˆï7f°l_ Gw’Tñm“•¿Ÿ*z3£.£Ù˜š]n¤Q×{œq$NS›ï§~Núk3õÉéjï§#?IO¯>áDÎà±ý Ju÷&Ÿ£z*#[|]ÑËš}Üó—·¦²kc:?¶JàÆÖÙüù»ðZVFÕ!Áhð¾FØóQ7Šê¦ ¨MõŒ5ŠìvÜ.ÁÁ6Ün4 $‚Cud=û‡óÑáLöºË¬V9ØÆøn&ô:‘FOcÚ­â䫯±|¿>º:MfFMbdŒÊŽ­9¼»ÉÉIMGr¼•°È«}vu¸gÁ¹Oµ†Ã9Ž>,„‰k>* 3Po߀Ÿ#ÙDßÎ‘ÜØ%ˆ(ö•«pÕ^̪¿ÜÌìN³-'Øæ^ƒòÃÀŠª}2‡ŸþUUÐ4 MÓèб#éééìÚ½Ÿ‚ÂUMCÓT6mù»ÓEúÉ|Ô&7"CüÊ Õ!)n Âø¾IOïr{-w™æÑIuaG&Âè5 Vî¼1fàÎß<®>4Œ—Æ4âàª}Ì8 ‰m"¹µ{­‚%p»YÿÓa^øÛ…S61úºd<Ä-?رk€¤£eûHÆw &-DF)vðéç‡yçhyתLón±\ãæ³U‡XpÈ»äÔ¶$¼?’ŽÖ¢ß1ˆ6ÈL/ⓟÓùøH-æ.uz:tŠb\‡ šX52O°âû V§{õñ§o†çò¤^©|ÐÓóhoýr/íÕ3ÊÇ=W«§¬§ïy±Œnl"&HÆ€JƉBV~ŸÎ—é>\ΧS^IÚ&&b¬ž´'å±jtlm£s¤­ÈÉÆßO0{³|•Àmâ¨LçžÑŒna&Ù¦ÃˆÂæoòävèÐÃÇñ­ Ñíãx¼g1FpÛ]lú3ƒY ÉVd:iÌã1¹Ü½´Ä•Hí™Â̶Å<²è»t´ئJêÛ@÷îQ\ßÚJªU#=݉d¥b{©¶MÈ$ûkï•«Éde܈†gpïÇ9ÀO›Ù­ ¸NûôeTqA2EáÈñBVýœÁ×¾Úˆ?jòÌø}F5â:ø«§€™L’³y'4|Õ+DµKæ­>nž[’E³aÉ\PúI$Ô(o™6æ‰ø<î]’Án7hF+÷ŽK aÝ~îÝâÂ¥Ax«$œ¯ñòÒÌJÓ>ò ølIĶŽfB…/V§“vA4kÚ•Oz×z…KlO{î”G>ðL(„††pÑ!¨Š‚¢*Þé•…K–Ó8%‰ˆÐ`4MÅårãpØ‘T#zÂ’¢1\ʑԑô9Hë +›¹™aLíFê^ÏC)3¦­ž-kÒ)îM˜I*]õ(KRÅøIB'KÈHè#B¹`Edðä>ªEOÐI—·µË²„N*Ë?¥kÏ÷Ô³ù·,^8꫎üÜJ‡ÉÂUm ¸ögÅaw©¬ÒròÊjÜ-‘g{èØ¸!“g35·ŠdܰDÌ˲,£&œDÓn <ÙQãóŸ³ O¢S·h&_G—žàO»Dr}3¶ãù­.\šFQž‚оÊ=ÔSÒ‘šl!*7›×¾s`7èÝ5’IWh^|‚?åG§Y^IÚœl^ùÆŽÃjáÊþáLJvñÓ¯Ù¼²^!¼I#&ô'ûØ>æ×P´ $i̓H.8ÉìŠÉ“%Ô 7FßÇ5œ£y,ú:‡D%G0©[,7§ïçÅ} »wãjD› ,öæj éh‘lÀ}"“ƒ®ÀuT†L뾉<Ü^bÃÆ Vd¨DÄ…rM Õ°Ml³†UÛÞK¥è\vIWÈ9<ñe.Ý€ÁO›Ñ$w\§S,Ääf3ë£ÎíqëHÁKñavÍÚ{àg¦ºg´úzªÞ6išj‚ì\:ACe÷ŽbÜ-‚h[R¯èhÑÔˆrü$;ìмÂs ïÒ›Wٻǎšf¡™vçƒ1ÄJK“DDŠË.dRRŒÈÙYì´CZ=äðÙÒ8òÇ!ÆÿŠÁʃ>*Å•WÄNWãõè2\ Î#RŸÃÀŠª’}’ß~Ûˆ¢(Þéi-‘QQÝìn I–PÜn¯ñàv»(.."4ØÄá‚ãHa}H—±H¨'›6f³ktÓNòÒ>•ä¶´³çðà.ýºB+«„ G":³IeÛÁþ8ê´Õ|»Ç$scºšÈúãϯ³S¬R:_Q>½Þb$Ù(‘~ÄAŸ‡F2q}W#â¥õvŠ5XwÀéºd†÷°òÙg…äÐ]21¦³‘?îçí¿=#‰mùzº]߈ £2ø;Ãê__ï¼£Ðɾ Î’{ÐUÍ£&zJ’Dqv¿î/ÆlÎ5Ðq„þ2øë¨ZZ>§[åÒn8PŒ"NØ‚y­‹“ï6çò›CC;¢Ò¶y“ èO8«ŒŒ}–­$Q”UÈ:oþh éü 3 ø9Óó -’˜hÀ°O¡ðX¹ã蟤ãó<7n£‰n`÷÷vŠLAÜî§ŽdƒŒY.Ù*Lá bT[Ç7à?ëžUÜ$§YiWÃ6±K©A{— œ7(Š a…¼´2‹ÍE;íÊm¦¶uºn_1v ~ÝkG½>‘‘=­|õE¡ßg¥6m1ßTý3Z]=UkÈ2QV(>é¢d]Uáñ<þRâè—¤ã³<7ŠÑÌù±;~(&¯òƒT‹¼ Žç³K¡{´ŽÕ*a V"Ñ0Ä“¤/d«f¤[œÌ‘-Eähr•ߪ@ù|¶4Ê<œ¾PŽCë:\¸ªKû/C>( 64[L´LKótüš‚ª(Y-Hz[¶n'<,Œà t: UÑp¹Ü;8™—Ã醦¾—;"Ë„Áž­âÊÍã½Ý<ÜÍFlº‹«Ûر.‡ÝN‰¶N°ZåEé:2NòÁA®L¥™Ù‹Ñ IDATñÎ>þ#‡5éŠÏÃl&Å ò÷vÕûcêÓ‚ðŒFÕj¬C°™d½ÊßûËÉr¹ØpDeX¼…(]aÀ= AfôqSù`@ż6£=°¾š7ÔßorôÔÊKó„Š8òdJ´YªìqºåU¼OÌÊVÐôzBôš4—›#ÅÐ2¨fm¢ªÌ@Ç%"‡3¡{("õXT ·QÂmñ§š£˜ojÜf%|kyáA´Ô;YyLAgóWG2í.lÂãM$¯Îż´ÊA‚NaÓ!ÎriËë¨M8wnïámâ¸Urññé¬É¯êæ¯Üfj]§^‡ƒµGU.Ž2©+¤ ÚÞ¨fùØý–gàzªI&Ô(á°—jvO½ÞÙÒJØÖ<Šcl´ÕÛyû°U«lÔ­š8°1w‡º„Iìt[éäfý!7.ÍxŠùÔæÙª¬ JžKÃl•}˜?ÿn„aàMSÑétDF6òz=Šâƨ7ü?{gUu=ðï}³Of’LB ‹,ÂŽ‚€Z©Pk]AAÀå¨u‹+j«â‚ZAk(ˆ "q«­¶Zh±U*ZD…€È"…l³¿÷~Ì$f™™L".Àý~>™÷Þ=÷œûî¼{Þ½çÞKª+E©(Çãõãõz üø=Ö„$¢®|(’Lõ?N­ŸTQ2ÁÅä:ƒ¨aNq€€j¤:¶„úJ«ÐÁdвHsÀÏ_ÿúÿËIâ¢A.~3ÞÅùíç·›|ºgÃ(±|€ ÛÇ¡ fš°âìQ×tDh¨ã^øÑ 0 ñÉÚoxá°ÖdV‡·NEMŒ­o\=€íÔSW5‚ŒÍ¯9Öò" ©¡.åo„:~UGQhxûŽY'Úˆ19™{~•Š}gó>ðP)Ìœû‹L†Õ›¤«lÛî!ø‹d;jÙÙ5¤ªj¶Öéè®h÷Hc÷GßðÀg¢Þ(öûh€)–Ò­Õ‰@°Õúî9\ÍnW"œÊ¦7Žði£iiëÌw¨ËAPˆÏa‹'½Î·zŸb¡ëTt,æFÎ¥®²u»}týê¨ì•€õp[ê@o&°MykA6ï 0µ¯“œ7gvPÙ°®–š..Îílâ=ÍA–»ŽŽj-îG{llËo ¡à46u’$!äÞÅ US]×½Uèáï4 +XÌòrºÐ5/‡œìޤ§ºp$Ø1šÌhªFÔ&K($šÀç*ªxå§õ0Sºµ’ϼ¡¼ë‚`O0„Må°WÇÕÁD¤¨]ÓØ¿§’¯Í}ŸkôèïâSËR ÆË7ªÞ9F̱~D>/oïT±wëÀ¯Ò#¿¥j¼ìèÕX–ÁÄà,J/eê·¥ š…×ÔzùFUè’¢SRîco¹Ÿ¯ÃŸÃ^=¶¾ºFMl¶ØoÑmÑ3޵¼ˆ´& Ž:Ñ,.;9Š¿~t”M‡¼òðµ·©G÷Vðo¯…ó ìŒÈ7rð‹Zcשš2›÷ºCŸý>ʪBeW˜gÆ¥þµV' õúî-«âÑWKØ”Ì=¿L¦sýkP”:Óî{j01 S!xÔ3ø¯¡¾Ç‘O¬òŒç>5ί šJ©lNû3«öVòQÀÂy=œŸ+ØòiåŒ7ï:‹«ÙguðËÞIôô×òÉQ?[Šƒd$1º—…òâj¾´|F´-Ÿv¢èhƒš*é4GöDÀïõ£ë:6«=4MQ×ÐÃÿkº†Ñl&ðâó{9tÐÏç§Î]GMM >¯£ÑˆÙe@8ð…Ç<õ >,çŸý ¬ÿÌžS«ã è˜m f5Àú®šÎÍCV ¢%ZI ‹4&:øEŽ`YÁDŸŠ/@]„7ÝSÇŠ­Ô‰»E9kð™ŒX+jXWÖ¸ËUåÓõ‡YÛ%‹Iãrè¶å(KTj iV²«*yî‹:Vlö3op6·ËøçÈí™Êؤ¯¾ãu½j*%^ÔÎN¥øY_Ùì{y+·˜Û?›»)çûxF²¬>þµÝKM,}Ë|qDãž©\tø(_cÄQSË{¥ÍlöÆ¡g8ÖòÚE+u¢­ø«½&•óOK¦f‡‡ƒY–f‹ßË[[Œ>5ƒÎ?+vBcôq×)À[ÇòOüÌ?-›ûD9oïóã6Úèlù¶Q×ݱë„Çáà—­ÖwÿÑ*æ½mâ±±iÜqª—Û7x©S£Ô™ÃñßSW~*Ê«ù¼N×#•Ë’ƒüíŸnªõP Á´Ë2é¾÷ w~à¡®yý/o=ŸXåùQk÷©E~Ë_cÏ×~Ä© t6ÕPé5ʺÏÍ_whÌ’Žâ­âžýÁˆÁxqÕ‘F«jøGY*מ–@ÙÿÊÙÔ ì®âð°\¬(Z^™²™Î·1Ÿö`J´ÓÍdÓ¡`ìµNB¤cƒtæ¡—7bÁÐàU¸¡ý§S[^KºÓŒÙlÂd2áõzŠŽ¦A×0›ÍèŠXC Fð‡{ <%•<³¦Qv@À¯ƒÓˆ] Ugÿÿ¾a®5ƒ+ûf0û4P©(«c§GØ`eØàdz;„Ð(/©añ»GÙ ›5Ecç‡û¸ÇÎÕ}:pÛ ðáêB‘F?­®Ž§_ÚǶ¡øU~ ×0`D§ªÒÃÆ-¯>ÚÏl:Sú¥qCP^ZÇò7Žðæ‘ðI ðþºJ†JfrŸþ÷o‹ï_†õ¹ª0•™ý Aö~UÆúϽÔÄÔ7ÈÆJxwtãÎÍÆð¿<¬;ÒÜæ8ôlÇZ^{ˆ]'Úú¬ ”W2w­‘›NKeVÏлtÀàˣߨtö^ÁöS3és¤‚«ëó‰¿NΞMû¹ÃÓ«û§ò›þŒšFuµ§Q#¦Å¬A{|õ]j–óÄÆ柖É%»öòÒ5r9¬Æ}Oµ BÿA\âTW¸yão¥¼|()Íj˜-¡þ·žOŒòü¢•û!?O£Øˆ#{k98<™³Ò¶¨¿:ÅÛª8Ø7óUìðEŽ4.¨}æãÚ‘Þßr´êZþUÞ)J5ÿ©ŒöŒ¨ä±µFnŒ7Ÿ6#èØ5LOë+Ûþ[9щÔr™V®\é=zt䮨VX½z5ãǧ¨¨ˆ%ÐÓcítòõ 2,nÌf+³ŸÏKM]-u5u¸Ýn|~/vG2§\pfE”¡(t=æ!B ocoVˆðâ,áï¡õB?bEi4Ö–­·&«Ñjsz }š_KxX¥þú&z5Ë;šÍÍ¿·¦O¬óŠhy¼Õò‹ g¤4±îÕ±”×âZ†pðg«÷1Jˆt}49õy*¢iÌB‹û`M`Æéðá^~ûE ÉʗDzNµ&¯-õ]i믉TgòŒvO ®¼2‡Q{÷sÃûáõ1ôƒß8xR¡è7-Æ}ç7Õþ8îSÔz+ŒŒ“ËuÁnx«†2-všHõ²µ¼›æ!Ð4=f=n‘+ù´å·Õ¢ì-v¦_™MÁÖ}ÌÜäûñ÷ÓˆƒIéÿcÂå¡¶uÔ¨QínŸ'L˜0ðšìêýí¼²Ç ±šÊ€ŽN«5Ôk ë*FOhR¡¦q8Ô 'X]QehqLšÕu½…wŠ„Žœ6–̨²ˆð4Š˜>öµ±ôЦ_óïqå弦·<ÞÖò‹–&v¹;y-®Õiñàl«M‘®u(Kz+¤g˜q …28Ó”»v"èwìêTk×´¥¾ëÊ2RiȳÕÕKuT-‚cÕXv+úÆ“OTû£Þ§èù}›6È?¬â²KÓ¸*ÇÍS¦FJ©^Ƴì{ãëU½¹í‘ë_“ü[ɧ-¿­¦ÇºJç碆G¶ûärÈŽA;Ðò/â³ýÿÆUù NkBÃ>¬­vª Éè]/À`:!aÉOƒ‰_œÓ™KS âàQæý¥‚þ¸ÚÉO÷¡rûúijÆ H°ª–¢ÕGÙä–u8Ò1h#äüœJM¥Ü_ þô„ ºÉÁâ@1Z@È ’ÕÇŠ•»X)ˆÚí}R úXñB1+# ÃWhìþô»OÊû¨ñõçe|}RÚÒ1h/B€ÁˆbK[2áÝ[+‰ä{C×÷ÆðØuæ8£-£''³íñ _kÒ)H$ÉñÏ÷Úcðæ´n튜”H$‰Dò-¯¾ò¿,¯ïÕ10(âr t¼^'´ r(BÁn·cµZoû‰D"‘„8!b ªkjøúë=<ø ^¯7®4f³™¬¬lòòòIJlïZq‰D"‘œXœŽÁþýûPÁðá#Bâ,Š`ÿþ}ìÝû5} ûÊ!‰D"‘H8AƒÚÚZì TUWâõzˆgK³É‚"ª««~ %‰D"9>8!ƒú]]®Q¢š,ªÙðïþ}ûâZð¸$XšgžæƒÎ×2{L.Çxÿ‘Ÿ6j9ë‹VñYçqL‘ÿ6¬‰D"ù჊ŠrvïÀë‹`±XèÞ­€Ô”Ôvå᮫Åh¹”W’ÝÌÁ?Œê©"óôiøíÙ'ÎɆwNƒw‹o¿ƒÏ'®`e¾“Æ)Ö÷¤´  ë‹óü»ŸðùW¥’;Ó½ÏYLºþÿ•gÿv縟(º®…m— OI$I[øÁ¯ÏKRbRÌ?))_Œ…Öp&8ÑíŽÇ•`5a°€®Ñ!5E¨«)ŽCj€êÃ¥:Oâ±YCIÔê8Rü!¯<÷“7â…E×Ð;AùQ›MSãØô%~ôºÏøã 7°lG2ƒÇ\Ä—ga¬(fý[+¹kâÖ?¾„{F¤Ê7q‰D"99!b ê©8ZŽÏëmxKV§#‰Dcè»J¶Q}ø3 Úڌ٭ÊÕu ©+ Õ `Èp†w)ã¼;þÊ_wO¢WŸD°œ+ç1ï•ÿ²³Â@Fï‘L½m:wwïkÕl}í)æ­cÛÁ ®^\þèSÜÒ'%VZ­„ÕOÜÏÂu»8t¤ŸpÙk“o›É˜ßöìY8‰Ó…þøÐßY<¼±£Pdž{Ç2}ûÅ,é×ô°)ü/º‚‰oögá«w2Ðvnt7[—Üϲ¹âÙELë—„QÀ¹Œ¹ì—¼xÓþ0çF¾<›3’*ø×¼Yô~1J«ñ™]äžÉ•7ßÈE= k¾ƒ}¢•ôð—ðŸ¥óÇ·?fw…‘Ì‚|¨Ô1œ(ÃE‰DòrB9©)iÞÜC{˜Wí^ËÎBhAtMÅ–Ü‘£ÅkÈ,¼ÏÇ“=OE'ì©ùÄîr-Öêñ0`MNÁ¦×PZ£^¾X:‹ìŒ»åAnͬeý²Çyh¦BçU·qj¢Êî¦3eQ9C®¼Gú§!*’”eAˆVÒZk)Þ¸…æpïí=±×ìá_/.ä‘™Fr^¹“SÞAÆØ‡˜{Af!ptr¢ˆÃt·Óóý1¯YÏÿʯ¡G'´*>ûèL½§sŠ½ÑžçuÛxé¯ß`=ëQ®î›Œ©¡uìÝ7ý|^ºñ-^ü膬fÇúOø&{2³g`sïåÃ×–1gò—T¿ô,Wç[­•Mkö9ý|+½Óǧ¸žß¼ª1bòL®ínáÈÖ¿³t;$£z%‘H$'?¸c°ìù%”•—µ8žâJaòÿ]ód7>t%§PºñO¤t.¤bÏ@Þr µ%_`suÆétbSª©;¸{J~CÑw %_mäÕ§þA¥e ¿èfƒšõ,xy?½g1ãÂŽ˜ôË*ãýq/òæŽi êñ)|¡˜Œ‰bîõ=I¨ ªc§Ü7´XBþÎÖ»2ŒÓ:fÃukùÇWw ‰²¥åRÐ#³ ä¼øë-HìóKZîáÝË—‰±®˜¾Rè9¶€„FÃ;Á£»ùªN'k@>CóØsЙ¿°ÿ‹2üg›Ãº åì3{cWFð³3{a¸|KofÌÃCqÖnúNö Êû_ÌôOùˆEo&{ò <|MWlŠ€¡ÙýÎ&>–C‰DÒf~pÇàꫦD=§(ßmO§æÁ‡º®£=Ø3 ©9ô9ÎÌž˜¤wÿ¡“ر7(Vt=Ž@ÄO˨ΎŒ1w$3þ0‹QiF»·³ÇäÀ£—2tnCîhª†í°_ÒVнN ËÁ®(M&øJc§ÕúÖû¶ÇÂÚ±;ü…CUß.ÿ,„ˆ:ù@8ûqA_³ÿ¾‰#çŸkï‡|æÏ媾IMcÂe=D„5Ô›«×ÍàìÉÏûÙymÇvJýC°|Gûü%±Óû_°7Ìi§ec­/[¡œT“0$‰äXòƒ;ßµñEóàC³É‚@A1˜qebs¤#LVRsŠ Gj.5ãÛ”û”kyúî¡$z·³ô®'Ù˜6³z$c ªA4¬ »ë)fÚ› gØ3R0|£¢#ˆhz+i¢¦Ea´bB%^ƒ!Ôê±ð•$]4Ó}á¿GFÒû½õ”gËiiM«€19Ÿ+løôkê.ËÆÜ¬×À³ tAv·˜"è`4Ðu54‹ã»Ú×ZÙ2  JVVG’] S"MF)]Ϧrß&:ä %X{ÕW šŠPŒ@ºnÄhO‹+¯PW·Bò xtâGüßÂ9¼•‹ûgauÁ7’Ñ][IÛšR¦Lúu·²ò¥¼ÔçRºéeTw<“_õJ$+QPºq îéÂÙùN …Lۙ˖=ÆW.L;»ææ '¯ÿ“>¹‘¥×^É—ãÇpvï,Œ;ùð/+Y½ÛɹÌägiFD ”¤ì½çXœ÷K¤ùÙñΖîOcü½§’¬””ïf_«éOcÚ•ùLX:‹ÚµŒÚ‡g;{j9q±’H$’Ì1èÞ­€Ï¿ÜŽÏç‹zÅb¥{×îmZÜHÓ4Ò:¤QYQÁ;ïü×Û0§_ ÐT¹¾ÔÖ®%+ FWV8]²¯6á5¤‘Ö«m+* N¹‹KWOcñ“k8÷©óé{Ób¦Ì癿,áÞ¢*‚Öº5³/($É`§ðÆE,tÍç^È]+jЬٜ3k?ïÚ1vÚVuqqæÌ;ûÛgxî¾Yxm ›Ú›Ñ}r9wú$þùàÌ}$§ÏêC‚0“wá z~›ºOfd¶™H£г3–½Âà—òüê"/*'àèH·Â1üî·Sùe÷DLŠK±VóÑòGx±DÅ•;€«»ëû&„A²7ûZKo°Ò}ÊY–üGž*ZÊ=¯T0XqeôadW'FÙƒ ‘H$m"ÒSÓ´råKþѣѮÕW¯^Íøñã)**büøñMdijO[óÔ4 ÇCmm-š¦ELïv»ùðƒ·ä,F¸CÁ†ŠÂ!¥€@Ç_ðóS{b6›£æ¡k* †&oס8]|{\×µ¦{/ˆ¦išŸŠ¡aÁèi[æSŒ†ô:š¦5¼! EAÂ2›èXý¿‡n\É‚ó3›4ð-íÖ«'Öë$PöùwóÇ˯äÍ¡ ùóÌ^¡ˆpþÍd}'ûâ+[]kY‰D"9YµjUCÛ:jÔ¨v·Ï&L xwøS×èoàÒcðýYÕ¦=é)ÐÑe;ñ§¶öóÆœëYö•‘ôþòÀ“×Pø#/ã,‘H$’Ÿ&'„cÐ&ƒBßÜ䈓Nx§ÀÜ—ÿ› 4oO@«ró¹áÕ¸^4f‘H$ÉñÊIá@ý@?¶?‘ºëÊr%‰Dòcñý­6$‘H$‰ä¸C:‰D"‘HŽD"‘H$’Nšƒ¶p´ºŽ—þ ¡˜ÚžX2ùüô:%ûäl”H$É …t "ðò;1%¥SV£¶y׈ôd Ëÿö1OÏú^ÖmH$‰äûD:pÚŒ¤¦âUÛ>Òâ´)Ý[qÏ€H$ÉñŒt "0¨{*99°X,ÏkšŽ?žf‹ƒ¢°5±BúßÁÖ<ó4t¾–Ùcr±ÈB–H$’cŽt " „@‚ÊŠ 6nü¨É dÿ}Ølöéêêj<èÔÖc 47û·nfŸ³/Có Û'¾™íÁ·“¿žÁ¿<ʲé}H8– ©•l]û›F^ªë'ÉêT‰DòÃ"ƒ8Nú÷Þ[!´¡P‚#—‹²²2´‡!´yOŠËE lt< Þ,¾ý>Ÿ¸‚•ùÎû0´ƒïCf{PldtêL§tÇ÷✄6u’û)K$É÷…t b!Àd6…wö }T5ˆª©uסkn¯—` €Ãá$ @»Hjš×n“máûÙfLóÀ³\îu‘H$Éñ…t ¢ i••¬[÷~Cƒ«ë:ýú÷§´´”â]_S[W‹ª© ëèºÆ–­Ûðú¸=nÌÉ#5%%f{NâôE¡¿>ôwLF –³qå<æ½ò_vVÈè=’©·MçâîN xØýÖÓÌYò¶–zÑ­™œuËÓ̽¸æh2ÏòñÏßßÏÂvq¨¬v²_Èg*lxû]ÖW R»rƤ;¸g\/ Ü[¸÷’i|1q/]ËXŤñÏÓõ©×xp =oGÑ#°›g'þ=ýYÞ˜Ù»"@«fëkO1¯hÛÖ`põâòGŸâ–> -·EÖjØþæ3Ì[õŸî?Šnu‘Ù¥7ß}?Sr#ݨ£l)šÏ“EëØ^¢“Q0œ ·Ìdb?W¨ÇB-aõm´_"‘HNb¤cúm™“’ùŹ碩*ª¦†‡4^XQD^NgR’èºF Äçó"43F’©ünÎ~àœGÔ|2Æ>ÄÜ ²0 £“Exùbétn,²3î–¹5³–õËç¡™ WÝFÿŠ"î|ô]ì—ßÊü3:a¬v>7k–T3bÊ ï.(þÛ"æ]?Ï‹K¸¦›E­m»ýÒ7H$'1Ò1ˆ‚ªiTVVðÉ'£ªjx8A§{A4´ oP  ¢†‡`0€ÇãÆj1³wß~z÷,ˆºž--—‚¹˜E(àQ¯þ/ï§÷Œ"f\Ø“€~Ye¼?îEÞÜ1Bóa*Ôú =ƒÓû%aýѤm.? CBþiŒRˆ]Höá÷·<—_¿€áN1ÀÆ'kocýÆÃø{åcm­lª[×£½z|¡˜Œ‰bîõ=¿ F¢ÅÌ ½zϾXLʘ´ãã· ª¿t;{|Aº®c³ÚCÓu =ü¿¦kÍf‚/>¿—CÝø|~êÜuÔÔÔàóz0X,1FêM™ôëneå;Ky©Ï¥tÓ˨îx&¿ê3œ.ÍbòªÛ¹U™ÊØS³±y°¯: .*Ä^ú>¯¯×È횎Ýw× ;ÒpbÈìÑŽw`S6gŸ›Ë‚ÅOrÿR7—ôIÇpðK*ÃoàÐøó†(z4C¸†qãeÙ\½ü7ÌÒ§rqÿ,¬î#¸óF2*}_{?ÛN”¥·ôÅéÊÔó\L[:›‡®ã¼\Á¾uoQ¬éô0&‘•((ݸ†÷táìü!Ü41—‰ÏßÁ½¶_sQ7Áο-â¹]˜úÐ’ätI‰D"i3Ò1ˆ@AA/¶~ö)>Ÿ½!2?ü6¬ëx<Ì&3f³ “É„×ëE(:š]Ãl6£(1–R\œ9óNÆþöž»o^[æöftŸ|úÞ´˜…)óyæ/K¸·¨Š 5…ngMãì 1•Ášç‹Ø\êÝJZ¯‘Üöà$ºY„ˆ"³G{JÀDþ¤Ç˜[õ(ϼ6—ß, ¢Ø’Hï>˜B—‘`,=ÍeÙ)¼q ]óùßr׊4k6çÌÄÈ4=«=®y†E ó˜ÿêÌ(ÕIï>”é n力œ] ‘H$í Ò£Ó´råJÿèÑ£Ûµ;àêÕ«?~Ÿ—šºZêjêp»Ýøü^’’\Ü;û>òòr£tTׯ¦ú&¥aA ú¡Š„‚A¡)ƒZ£îz!PD〾H2AS5ôzº†ªbPºé-¯p/Iãr(Š‚ –Qd5³I(éZ]ÓòõíZÄeW¯áœe+¹¥Àš¢éMÒ4•Ö±q™´Ó~‰D"ù©°jÕª†¶uÔ¨QínŸ'L˜0ðîð§®ÑßÀ+{ ¢«ÐI^,&f³ ]W1z@CÓ‚8“\d¤§Å½Q{„P0D:%buDD“©4ÖB¾hy !Ç"rv±ôˆ"+¢Mͯõ³ç×Ù¨t"'Í•Ŭy~;ãœ.õë´Ì;jyEÓ'Nû%‰ädD:íà¦__Ç+oü™;wPí®M' Ál§CF™™™\3e -bô%±Ðê8°}-/¼ó%‡ë‚[N4‘Ço¾š^vE†J$É€t ÚÙlfÒøqŽVUQUU…ßï')9WR6› %žùy’¦(.Fܺˆ·f6F©¾H$Ét Ú‰³ÙLzZi:4“|7¢_H$‰ä‡@:ÇéH$‰äDAöwK$‰D"i@:‰D"‘HC 8Z]ǃKÿ…PL­_Ü=ÈäóÒë”ì˜I$‰DòSD:xù˜’Ò)«iû®éÉ–ÿícžž%c$‰DrÜ!ƒ8mF RSñªmiqÚŒ”î­ûòH$‰ä¸D:Ô=•œœNX,–ˆç5MÇïóµ8n¶˜1( [+N\¿@;Êæ×_æ£ä ™rN6æ¶,aÍ3OóAçk™=&ËñVPÇ»þ‰DÒ Ò1ˆ€E*+*ظñ£&û& 0ýöa³Ù[¤«««að S[-ÐÜìߺ™}ξ Íwb8Ë÷!3ÁrÖ¯ZÁ›§ŸÁU?ÏÂÜÖáµ’­kßcÓÈ+Puã.ãx×_"‘HZAÎJˆÓé¤ÿôï?€¾}ûѧO_ ¤¸\ÔÕÖPSSþTQ]SERR`°ÙÆCðî`ñíwðä啲߇Ì(èºNk&¶š¾ÍÑߣŸ>Ç5#ÏdÒë‡wúK$Ƀì1ˆ…“ÙÞ½/ôQÕ ª¤Ö]‡®i¸½^‚‡“`0@<­¦¦©1wpl߇̵j'«_ZÈüåë) jôÐdI$I4¤cMÓ¨¬¨dݺ÷\]×é׿?¥¥¥ïúšÚºZTM]G×5¶l݆×Àíqó`N©))1óسp§/ ý=ð¡¿³xd2J°œ+ç1ï•ÿ²³Â@Fï‘L½m:wwbÀÃî·žfÎ’°µÔ‹nÍä¬[žfîÅ0G“y¶…=oGI£•°ú‰ûYøÁ.•ÕâÃNöà ¹âL… o¿Ëúâ DjWΘt÷ŒëEb£ñ‰Ê àÚ1»ù²$HjÞ .¼á6®‘ù혻VÍÖמb^Ñ:¶¬ÁàêÅå>Å-Ý#4Ê6‹{_½“i‹6r°VŘœÃ17sÏ”¡¤¨aÖíâБZ|ÂAf¯L¾m&cz„Òx{.¿¿—þöv¶=üå­Þü¶¿ù óV}À§û¢[]dvéÍÅwßÏ”ÜH×eKÑ|ž,ZÇöŒ‚áL¸e&û¹BC:jûËY"‘H~h¤c]×Ñ4•¤¤D~qî¹hªŠª©hš†®k¼°¢ˆ¼œÎ¤$9Ðu@ ˆÏçEhfŒ $;SùÝœ9<üÀ8ލùdŒ}ˆ¹„Æéœ(ÂËK§sc‘q·<È­™µ¬_ö8ÍTè¼ê6úWqç£ïb¿üVæŸÑ cåAjrS0Å©î[=ZKñÆ-î<•ßÝÝkùfV<¹œ¹g3zê5Ü?ÅAÙûKøýSwÓ¡ÏËÌêmo{RÝV^=‹)i^¾øûRž»í¼‹WpkŸág× Ó™²¨œ!WÞÀ#ýÓ•GIʲD˜ÂÛæS ¤ô»ˆé÷'%AåÐÆ<öÜ}<^ð žáÂPoC§)Ü{{Oì5{ø×‹ yd¦‘œWîäT§‰œ ‹x÷rÅ»‰ÛZmsýìzaW/:ÌÀ‰×1g`†Ckyü‰Õ|RâgJNsÇÆÇÎç¦qÍ’jFL™ÁãÝÅ[ļë§ãyq ×t³¢´§œ¥o ‘H~$¤cUÓ¨¬¬à“O>FUÕðp‚N÷‚(hhAÞ @(5D ;Á`ÇÕbfï¾ýôîYu=[Z.=r1‹PÀ£^ý! ^ÞOïE̸°#&ý²ÊxÜ‹¼¹c…æÃT¨ ôz§÷K ú¢Iü[s™Þ¯ZI£CBþiŒRˆ]Höá÷·<—_¿€áN1ÀÆ'kocýÆÃø{åc 'ëpöT®¿¬»"8{xÚ„)¬\ö1Sž8WÝ&þøB1ÿÄÜë{’PßÊ h6™C¯ÞÓæÁƒ8»Á¨ná…iì[so}|߈dì 6 á¬a½±+Ã8­Óa6\·–|åapß„b Uô8õêM<ûb1)cðÄM}q*íH9Ïÿ~uÔë,ÿŠÌIK˜3µ€Eð³!ùx'LeÙ¢M\öø\í)géH$’ éD Ôc aµYèQPjøuMUI°ÛF[?ÿWr2‰Ž ¦êAÜ•Õ5¨A»Ý³1j,×øK·³ÇäÀ£—2tnƒ6hª†í°Ó9—1ùԵ˂É$D“iÍ™¦9F³ ?4/t« ´`ì8|MUÑ…!Ô®©è”xæ¼´b³¾¯ˆßܱ”šQ·ðÀÍ}IÓ¿æµ{à_1D £*vêjÆ6Î×iîü±æ.´·œ%‰äûFNWŒ@}dý´4ðC^ÿV°˜-äåt¡k^9ÙIOuáH°c4™ÑT-z+ÉV¨«ðÐxÑeSZº½|µ[• ]O©ÿä“í4at’7ürî^°’9ØVô_¸uô(2c¦‰«4âè~wóÞV7Ö¼ÒÍsz]ŒUl^o„YB€®êqÙìÝ·‰â`7&]{ gö+ WŸ¾tMŠþÿ]1§u§£¨bÛæRüQ ¨±þæŒ^䙫ټþ›omõïçÃ-5˜s{‘i‰WWÙC ‘H~ȃø}>t]Çfµ‡¦)êzøM×0šÍ^|~/‡ºñùüԹ먩©Áçõ`4±X¬Ñ30eÒ¯»••ï,å¥>—ÒM/£ºã™üªÏpn¸4‹É«nçVe*cOÍÆæ=¾ê<.¸¨{éû¼¾^#·k:vÿA>Þ]ƒîHÃaˆ.st‡OysC”4ߺ=›X·Áݽõ¯-¦¨ônxrN!®aÜxY6W/ÿ ³ô©\Ü? «ûŒÎK$+QPºq îéÂÙù±m¶e’-žcÕ’WI<·]JØW{ìÞªõª ̹ö~¶þ(Koé‹Ó5”©ç¹˜¶t6'\Çy¹‚}ëÞ¢XÓé`Lj¦ÿnš˜ËÄçïà^Û¯¹¨›`çßñÜ.L}hIr$‰Drœ!ƒôbëgŸâóùк£Ã‘®ãñx0›Ì˜Í&L&^¯¡èhjt ³ÙŒ¢Ähygμ“±¿}†çî›…×–Á°©½Ý'Ÿ¾7-faÊ|žùËî-ª"hM¡ÛYÓ8û‚BLå_°æù"6—ú@·’Ök$·=8‰nV!"ËÑ/Fš@; Çà ÛàB:¼¿œÙ·z“éÜë,î\z#—tµ…£éíÞ¸ˆ…®ùüáÏ ¹kE š5›sf âç]38wú$þùàÌ}$§ÏêÓæ¤¼‰Ì½£”‡—.aö;>ÐuLÎLúvqò}›0zx¨(A!:óiî·üž…‹gó¶ÇAv×€‚É ÀÐRÿ×<â„yÌõ f”ê¤wÊô·rEMÎ.H$Ç‘[¦•+WúGÝ®ÝW¯^Íøñã)**büøñÇ탱 zà‘‡©­®Àl¶b1[ðù¼ÔÔÕRWS‡ÛíÆç÷’”äâÞÙ÷‘——¥“XO }Š‚.«ú¡Š„‚A>ÞpFÑ8¸/‚LôiBA~z½|]CÕ@1(a½[^ê=i¬_s=ê˰©B Ç ÔÛÑXf4›#„PPBÂZÚ>F}~Ë\ÕÐC£%£#§×5½ÁFß®E\võÎY¶’[ l¡Y)1õ(J³ûÒŽr–H$’zV­ZÕжŽ5ªÝíó„ ÆÀþÔ5úÛxeAbz¢3‰@À‹ÅdÂl6¡ë*FhhZ‡ÃAb’‹Œô´#Ç"j¯‚ †H§„B¬ŽˆÈ2EŒ4¥yF-ònyP”¸ÞÖÛbGÔk[9цˆÇâ½ÖÏžw^g£Ò‰œ4T³æùUì4ŽsºXÂ}Ûôoo9K$Ét ÚÁM¿¾ŽWÞø3;vî Ú]šN@ƒÙN‡Œ$233¹fÊ"ÅýK~Òhuؾ–Þù’ÃuA„­§ šÈã7_M/»"C%É t ÚÙlfÒøqŽVUQUU…ßï')9WR6› %®¹z’ŸŠ‹·.⭙͆JéH$’“é´!f³™ô´4Ò:th8&9þ‰w¨D"‘HND¤cp D"‘HNd·D"‘H$’¤c ‘H$‰¤9”£Õu<¸ô_ÅÔúÅÍуL> ½NÉŽg3?‰D"‘H~RHÇ /¿³SR:e5j›—ÞMO¶°üoóðô,{ ‘H$’ãéDÀi3RšŠWmûH‹Óf¤to…ÜG"‘H$Ç%Ò1ˆÀ î©äätÂb±D<¯i:~Ÿ¯Åq³ÅŒAQØšXqbúÁÖ<ó4t¾–Ùcr±OF6×]mö]?Êæ×_æ£ä ™rN6æãɶï“ãùžK$’v!ƒ!P„ ²¢‚?j²o€Ù`6›½Eººº:õÄ-P+Ùºö=6¼U×9® m®{óïÁrÖ¯ZÁ›§ŸÁU?ÏÂ|¬móídÁ¯gðï²lzŽ—ýŽç{.‘HÚ…t bàt:éߺ^¿9‘N‚#—‹²²²F …6)Jq¹ƒM7:ÁÐuc·éñKsÝ#~ÿ¾LSldtêL§tG£ œŽŽç{.‘HÚNÇ@>`2›Â;ç…>ªDÕ‚ÔºëÐ5 ·×K0Àáp øþZÉq‹©3cx–K½Q‰DòSEöDAÓ4*+*Y·î}4M ¿MêôëߟÒÒRŠw}Mm]-ª¦‚®£ë[¶nÃëàö¸y0'Ô””èÊÙ¸ró^ù/;+ dôÉÔÛ¦sq÷޾w—ݳÑO¿Àmƒ1öðü¯'³,õV=r.MAö¾z'Ómä`­Š19‡!cnæž)CI7 PKXýÄý,ü`‡Êjña'{ð…\q¦Â†·ße}q"µ+gLºƒ{Æõ"Ñ @-åŸódÑûÅ(­Ægv‘Sx&WÞ|#õpFËjGŒ4º‡Ýo=Íœ%ÿ`k©ÝšÉY·<ÍÜ‹;aÖÚ¡?Øe'•þÀµcvóeIÔ¼A\xÃm\;"34¶îÞ½—L㋉+xéªÐx{ðÀ*&ž®O½Æƒ ìy;ŠMÝ<;ñÿøëéÏòÆÌÞØõÒëvqèH->á ³×&ß6“1õå«l‰Q~±ÎE* ­†ío>üUðéþ£èV™]zsñÝ÷3%7ÒõGÙR4Ÿ'‹Ö±½D'£`8n™ÉÄ~®Þí©‰ä'ƒt ":PIJJäçž‹¦ª¨šNÐxaEy9IIr ë@ŸÏ‹ÐÌHv¦ò»9sxøp:rðòÅÒéÜXdgÜ-rkf-ë—=ÎC3:¯ºSϺ…;FL⮇–0êÅq½õ ÷䮇~N†IRú]ÄôûÆ“’ rhã {î>/x…GÏpaPk)Þ¸…çò»»{c-ßÌŠ'—3÷ãlFO½†û§8({ ¿ên:ôy™Y½í(j ;ÖÂ7Ù“™=³›{/¾¶Œ9“¿¤ú¥g¹:ß! ²; Qƒ0{‹¸óÑw±_~+óÏ脱ò 5¹)˜Ú£¿h¥Lâ¼÷ªÛÊÀ«g1%ÍË_Ês·Ý€wñ ní“€‚ަªhZ£!]CS5´ÖltMEÕê3 ÛØi ÷ÞÞ{ÍþõâB™i$ç•;9ÕéçËeÛ¿"z^­éÑ?»^˜ÆÕ‹3pâu̘áÐZb5Ÿ”ø™’Ó¼÷ËÇÎç¦qÍ’jFL™ÁãÝÅ[ļë§ãyq ×t³¢´ëþÅyƒ$É÷Žt ¢ j••|òÉǨªNÐé^Ð -èÃE ƒ¨aç! àñ¸±ZÌìÝ·ŸÞ= Z¬g WobÁËûé=£ˆvÄ$ _Vï{‘7wLcðà4Ι5‹w'þŽ{¬Æ±~ƒïXÎ/;šÃKU*8»Á¨na…iì[so}|߈dì:$äŸÆˆ!…Ø•d~qËsùÕø îTl|²ö6Öo<Œ¿W>Ö†4C9ûÌÞØ•üìÌ^.ŸÆ’Å›óðP›•Qëv8¢Æª©Õ‡©Pè3ô Nï—„AôÄ·×·UG™ÄA‡³§rýe…ØÁÙà Ð&Laå²™òÄ™Äèÿ‰Ï¦æè?„³†õÆ® ã´N‡ÙpÝZþñ•‡Ayÿ‹Y¶…æèyµE½zϾXLʘ‰aK#'¶•ס5‰)úœ=ùy?;¯íØN©Îf¦ÄcG´• ¬Ý/cò©kyòæËÙ9úR&]>–Q=]Í*d[ôÆY&­ ”û…5‡a}œ<ÿÙ—ñŸjðb`íM-2lÈÏÚ±;ü…CU*þ’Øek:'z^ñ•mˆ@é6vz<²+E —·ˆúð—lc—ÏÉ€a]°×_oËeÄ'/lùŒßp’ºgÚrÿNîgŽDòSBöDA×5 :¤†Ã=ªÄl4‘êJDQG*Êñxýx½^?~E€319ºp5ˆ†•aw=ÅŒB{£G¢Àž‘‚QZ5»>Ù…WÓÑŠWóÁ¡ ™˜cA½¯ð›;–R3긹/iú×¼vïü+†=F³ ?4å,t« ´`ìxs£É€®«#=»ã±#Ö|&ÍáÞæ¥å+˜=e«®}–“ Hh‡þí)“xÐT]Â]Ý fø=ÐÌ“æNŸ¥m65G­˜P hz«ek²¥EÏ+VÙ6ë³×Õ *Œm\Ë«¹éB„ææD«Kí­‰ä‡Gn¢úu ê§ié„zzøïð°‚Ål!/§ ]órÈÉîHzª G‚£ÉŒ¦FO5¥õ ‹ÑËW»Yù§Ðõ”úO>ÙN# Qùß§ùÝê$®Yø'¦Ÿò%O?ø_ûBzy÷m¢8ØI×^™ý èÕ§/]“¢¿åE&Ž«ýß°á³L»“nÉtUÓŽØù £“¼á—s÷‚•,¸ÈÁ¶¢×øÂoCÑTÿxʤ±î‘¾7GwóÞV7Ö¼‚ýÆ$²“eÅpGLö]mú–ÖË6V^ñëaNëNGQŶͥø£(Ù¸œÌ½È3W³yý7xëyÿ~>ÜRƒ9·™–xë¡ì!H~ªÈƒø}>t]Çfµ‡¦)êzøM×0šÍ^|~/‡ºñùüԹ먩©Áçõ`4±X¬Qå+)ùáÒ,&¯º[•©Œ=5›÷ûªó¸à¢B=ŸòìckH¿«û÷ÆôÛkøç‹™ûîÏøÃ…±d’-žcÕ’WI<·]JØW{lÞ¼ÊÞ{ŽÅy¿d@šŸï,aéþ4Æß{*ÉŠc"Y‰‚ÒkøpOÎÎmGRŒhóÀ¡ÿðúzÜ®éØýùxw º# G¼Q‚ÍhµLšëžÓì{çЕu{6±nƒ»{ë_[LQé)Üðä œB€)›³ÏÍeÁâ'¹©›Kú¤c8ø%•á2pè?üyñ±©µ:b/}?jùc”­^µ9×Þ϶Óeé-}qº†2õ<Ó–Îæá„ë8/W°oÝ[k:ýŒIÍîùnš˜ËÄçïà^Û¯¹¨›`çßñÜ.L}hIr*¦DrÜ#ƒôbëgŸâóùÐ"ÐÃŒ®ãñx0›Ì˜Í&L&^¯¡èhjt ³ÙŒ¢Äj ìô½i1 SæóÌ_–poQAk ÝΚÆÙt§dÕü90šùW†º~EÞeÜué›LþãBÖŸq/gäMdî¥<¼t ³ßñ®crfÒ·‹3îèûh(Öj>Zþ/–¨¸rpÕc·s}ß„PWº!“s§O⟾Áü×Grú¬>1ì($)†2ò/Xó|›K} [Ië5’ÛœD7«‚´]oskeÒB÷ÞM¿ÏL§ëàB:¼¿œÙ·z“éÜë,î\z#—tµ…‡LäOzŒ¹UòÌksùÍÒ Š-‰ôîƒ)t S›bÕ‘BL1òòÅÒÆÂ‘%"‘¡3Ÿæ~ËïY¸x6o{dwí(˜  -îykžaQÂ<æ¿ú3JuÒ»eú‚[¹¢À&gH$'‘~Ʀ•+WúGÝ®ÝW¯^Íøñã)**büøñÇíƒzŒEŠxäaj«+0›­XÌ|>/5uµÔÕÔáv»ñù½$%¹¸wö}äååFí4­’h@(®©hº@1( i›k‘BAQõAjzX^XªF#™Í®ñïæ—_É›Cò白°)Eiú°çÛXv4;bpXηʣ%óY;Ÿ÷~>Ÿ™Ýn'-5•Ô””Èg§¯†îÚUX¤«ø´p´C(Bˆ_ Àé!„‡fýÝB!„8‘$0B!D„ %Dq¨¤œ© >BiѪ­“äÆßv£}ëfµ¯ª'„Bœ¢$0ˆâ•ë±%¤q T?æÇ §%:XòÞç<66Sæ!„8íH`…Ûe%·I¼ú±´¸]V ~*”5b„Bœ–$0ˆ¢{N²²šãp8¢n7 ¿ÏWãs»ÃŽEÓØ_(qÁñîcÕ¬çù䬛˜|U6ŽÆ®Ä“¿Bœ$0ˆB)…¦E……¬_ÿï#ÖMèÚµ;wíÀ助q\yy)=ºŸSÿÜ£‚›6°ÃÝ™^­ÜÔ±áÑ;i6vžz›Vÿ“Ï\‡nš4ú$“¿Bœ䮄:¸Ýnòòº’—וλЩSgbãbINJ¢¼¬”ÒҒ𫘒ÒbƒÕ؉Âûóî™Ä³Ÿ$ØP…=iž„V>=…9k¶±g>GFû~Ü8qWµsG£[#Ïóƒ|:o:/|¸‰í{ŠñšnzÞ÷"Ï_žÊî×ïeÌÜõì.Ó±&fÑóª;x`d/Ò¬5»í»V±|£¢ÿ“w1ì¼$¬ª+mµÍ\úÀbþñó¯¸!K±ëÝ'yæãÿé6?öëýbKùêíYÌXþ _î<„éL"£E®¼ #³£íˆù3y6 _í3IÏí˰qÞ%)4t¢‡ëè“mì9P†šõ¸œëúk¬{÷}Ön-D5iÃy#&ñÀöÄ7ÊB? ¢0MÃÐIHˆç¢‹/ÆÐutCÇ0 LÓ`ÑÒ|ZfErB¦iñù¼(ÃŽUƒDwž6Çyw\\­ù¤_ý(O^–‰])⚻є—oŒå¶ü†Œ›Êe¬}q:NÐ8kùDò ó¹÷‰÷‰¹öNfž×kÑnJ³“±Õ™¦Ÿm/eä܃ôüý­<ž—Š*:DB¦UO~ç8ËØº~#{›äÁ{Î&¦t;-žÃã¬d½z/çXjÉÓø‘/?ZÃ)×3yB‰FZN Ve!¹ËŒ}h(ɱ:{Ö/å©…1=÷Už8/©Æóú O!eÄÐ$ÁE)”²ߦ+™,áë½~Ìqd ›Ëû×jhÞϘXo›ëgÛ¢1Ü0w/݆ßÌ´néXö¬fúÓ+ùbŸŸ‘YÕ{|lY8†ÑóKè7r<Ós[ߛˌ[ÆâY<ŸÑmhz¸ŽÎÅÃ÷wÀypKŸ]“Ÿ7cШÑLÇçóÌs÷“Òéîî#‹G !NiÔB7 ŠŠ ùâ‹ÏÑu=<œ`’“Û #èÃT(M¡ƒèáà! àñTàtØùiÇN:œ[ëó \©Ùä¶ËÆ®BÍ’O™ýÊN:ŒÏgüåM±)è’y€‡,æíïÆÐѾ—B=–N½Î£w—,*PGÌ‘«™æ:þ²h+éÃÿÊ“·œMle«¤”¬­3¿M0!¶UOÎïÓ­ç6ß˺›WóÁz´‰ž'~À4‰kÓ‡ út$F å§wÛóØ6\ØŽ©ìXu=ï|¾_¿DªOç´gö s쫬\ú>We]NnBƒ{Šð™J¼zh'Íúø(& š%ŸñÂâ­$_5›§oïŒ[SûòÒ3+kÝö’È1Ÿi£r‰Õ¿êÙ ï°Q¼8÷3®™Þ$×ѹôëÙ‘­Íöþ“!K²¹tèeôuk¨®.¾X=‘µë÷âoß §BˆS˜Q„z œ.írsC ¿©cè:±1.”Õ¦¯¿%)1‘ø¸X,…¡›A*<>ŠJJу:11®:,¡3¼‹¿à+¶û‚ìzb0½žŒ”C7pí­Àvá5ÜxÎjž½ãZ¶ ̈k¯fàÙIG|‰5ÒÜ·‰­^7]ûd£iGÇWO~Fçé*z9›æÎߨS¬×šçá ¡ÏFöþk13¾ËÚ­û¨Ðb±ztlÅ^Œhõ“Л‰S®ã¾Gžáºß<úÐj ‰ôpûº‚ÍlñÄÒc@âÂu¡ÂK4þ}›ÙæsÓµO‹HÝ)W6ýººY´ñ¿ìóõ%1ÒÍQy®vRZ%ƒ¯C>Pñ åJ%+6,'4mR"!Ä©KƒZ˜¦Åb!%¥IhÂa¸G@׃ح6š$Å£iŠý…ñxýx½^?~M;>±ÎôCmeèy¤Ðƒ8ésßsŒïS¥ùPĤ'cs¥2bæô]÷.//YÊä‘KY~Ó Ì¾1—ØÚÒ4tLZ´ûOêÉϪJk–ÛêĆN <É/jžµüô*wMZ@éÀqJA]÷.Xí6þÐ-áópÚÀÊýBˆSŸQTβ¯¼uÍ$ܘá÷áa—ÓAZZ*~€Ò’JJK8T¤ð‚z´ßÀa'‰N(/ô WiQm©íhaõòÃ÷ŠÌË[[¥AªüÕ­¬nZö½–û{_Â…Oà¶ü×ùfèdºÛ¢§iOË¥…õe6¬Ý…7¯1UZ¹zóó×SQµœGm¼;>ck°-wÝô;úgÚPzLÓÄåŒ Ý¦h˜á ÓÀj· xñù½ìÙ]Ïç§¼¢œÒÒR|^V«‡ÃY{¶ ºä8Y¶b/wL[ó%Mûsi§¾Ü:8“—ßÃÚ(®>§.ï~v”´ä²+:Sð1o¬5Èn“FŒ7Ÿ_Š—Jœ¥®4ûpÛ5͸aÉ]ÜmŽâʼLœû©h9€AmêÎ/¡¾Šª-ÏvÑ;2;ÒL-dùü׈¿¸ -b÷±£¬Ê¯hk<™ñŠ‚õ«øt{ .h‹g×7|óÓn¶|þ¯¿þ)?·¾žÙwô á(f÷›Åë˜vÓ6÷~‚ã:ãNêŨK’³`2ÅÞÌ%ÙŠkÞa«a’`M¨–OnžÍð—&ñ ë\ÑV±å½¹,ÜÕ‚Qö$A€$„8I`Enn{6ý÷K|>fä¾øpfšx<ì6;v» ›Í†×ëEi&†ÓÀn·£iÕçØW¡%ѽ\ý§Y,|èn¼®túŒêÀ N­è|û<æ$ÏdÖßæó`~1Ag2mÏ×uÄvðV½”φ˜NRÛ`âÔ´uj(U{šo›Ëœ¤™üù­9Ü·´ÃÙŒ ïîίÛ4­3¿zƒÚΣ]ôÝí-‡óä¤[0ŸÉ+|`šØÜtn¾õÑ’ÁÅcGðáÔ7™ùÆzßÝš/ŸϸuŠŒ¶]è7v¿¿ì2c޶·À …ˆ¤âé5áy¦8žaμɼ뉣Y›@ÃfQ`I¯–'ÚžÅÜØÌ|íiƘ¤åôbìì;¹.×%w!ÎHÑ.m¶eË–ù t\«®\¹’¡C‡’ŸŸÏСCOÛëzhÏ#?FYI!v»‡ÝÏ祴¼ŒòÒr***ðù½$$$ñàä‡hÙ2»–FÌ ßþúKiZ¸®*‡*"”†ESþ<²E)4UuBáѧ©4K¤a«5¿ðDD3ò7‘ψ-O¢WK^€RZ¤0ás k:†Ix"£ŠœOÔúÔ LÍRåÑÌÑËofä锾ms¹æ†U\øâ2ÆåºBwœTÉ¿f™šV­Î«ça„ª¨2€‰V!„8zË—/´­<îöyذaW "ü*¯òÞx¥Ç uUz¼;@À‹ÃfÃn·aš:VF¸¸8â’HOK­ã—­ªµWA) K´MJ£®ŽˆãJ³Îm ­Æ†êŸEϳæqõ—#´Ã‘ç¨4KçÔràQ”ÕÏöo°^kNVjmeÕKËÙÝ|¶p„ûšu\w™£ä[cÿheBˆS“Çáö?ÞÌ«o¾Åw[¾£¤¢ “€{ )é ddd0zäHbccOvQEUF9»¾Z߲͢·<ˆr¥Ðºûp¦ßqízxB!Îl»ÝΈ¡C*.¦¸¸¿ßOBb"I ¸\.´¨÷Š“JK¢ßsygBÕa“ðÐÀÉ+•BœR$08NJ)ìv;i©©¤¦¤D>§6¥iG94!„¿L4 „Bœ)¤¿[!„!„"B†¢8TRÎÔ¡4[ý;Wg¹ñ·ÝhߺÙ1?Ë_!„8Ù$0ˆâ•ë±%¤q T?æEoÒ,yïs›)s„Bœv$0ˆÂí²’Û¤ ^ýØGZÜ.+?ʺ9B!NKDÑ=§ YYÍq8Q·†‰ßç«ñ¹ÝaÇ¢ilŠ/VÍzžOκ‰ÉWeã8š;žcþW'#O!„8I`Eå3ù‹ Y¿þßG¬›Ðµk7vîÚËSã¸òòRzt?çäÎ-0*عi;ÜéÕÊÍQ,BX7½ˆM«ÿÉg®C7MP ³|+o?÷ýðköU˜dÞ°ˆe­gÂí§Å”yLî\ó˜.J9…B; êàv»ÉËëŠiV.dKrRˆ,ÄS¹òbrR`°Êç'÷;æÝ3‰¯‡/eY+wƒ<ÌÇ4M/Ýäç»—îçÑS¹þΧèÕÔILó8Íí4ËjNS· Uã˜Æq2òBˆ3uQ`³Û«ë…^ºD7‚”U”c^/Á@€¸87Á`Nf`†^çêÿý ÖíÆ}Á}ŒüM±š ­|È@þ4ûÂÐ"Hþ“µBˆOƒZ†AQakÖ|ihMÓ¤K^lÝö#eåe膦‰ilÜ´¯?@…§‚©Y-i’œ\G%lzý9fä¯aóîR,Ií¹ö‰ç×)-xõËf0ãÕ±¥ÐBz‡Œš8–+sÜXŒ}¬|z sÖlcÏþ2|*ŽŒöý¸qâ®jw¸‡`ûœôžzßíÑ0ïü ŸÎ›Î nbûžb¼¦›ž÷½Èó—§²ûõ{3w=»Ët¬‰Yô¼êÙ‹4k”îx½‚Âr“CïÞNÿ÷BÛ[Œ^Ê˃þÍÈa/ÒrÆ›<Ö¹ZP¢‡ËüÉ6ö(ÃG Íz\Îuý5Ö½û>k·¢š´á¼“x`H{âkÿ0JùêíYÌXþ _î<„éL"£E®¼ #³£íˆù3y6 _í3IÏí˰qÞ%)4ÄÒPåBˆ3ˆQ„†tâ¹èâ‹1tÝÐÃà ‹–æÓ2ë,’â0Mƒ@ ˆÏçEv¬$º›ðð´i<öÈ#¸ãâ¢äàgÛ¢±Œœ{ž¿¿•ÇóRQE‡HÈt ”—oŒå¶ü†Œ›Êe¬}q:NÐ8kùDÎq–±uýFö6Ƀ÷œMLév>Z<‡Ç'XÉzõ^Î GéW?Ê“—ebWЏæn4ãG¾üh ?¤\Ïä y$eh9)X•…ä.W0ö¡¡$ÇêìY¿”§>ÄôÜWy⼤Z‡"LfÆõmq*…+µö 3TOÑ:*ôp™ÏÅÃ÷wÀypKŸ]“Ÿ7cШÑLÇçóÌs÷“ÒéîîƒV£ ö³mÑn˜»—nÃofZ·t,{V3ýé•|±ÏÏȬêûزp £ç—Ðoäx¦ç(¶¾7—·ŒÅ³x>£Û:Ѥ\Bqf‘À ºaPTTÈ_|Ž®ëáᓜÜvhAÞ Bi =DÁ`§§ÃÎO;vÒáìÜÏ30K>ã/‹¶’>ü¯ã/oŠMA—Ì|Pñ åJ%+6,ÇÀ¤úƒ ›Ù≥ǀ6Ä…ëL…›hüû6³Íç¦kŸ‘:V®lúuu³hãÙçëKb¤;äøË%„g jaš‹…””&¡ ‡á]b·Úh’¦)öÄãõãõz üø=4îøÄÚ7tLZ´ç'éA œô¹ï9ÆwŒ©Ò )bÒ“±ªÒ‡(«:#Ôj«C= õµcŸ^å®I (8ŽGîèLªù#¯?øÕ[Cÿ«Ý†Âºµ0ô NÁè÷˜z Öc|æTõ¸E©Ð=$µMÍ<Ör !Ä™Fƒ(*gôWÞþfnLÌðûð°‚Ëé --¿?@iI %¥%*RøA ½ößÛö´\ZX_fÃÚ]xóÚS¥õ²¥¶£…ÕËß+2/oMl•†-2$P‹“D'”zÐ"2ðîøŒ­Á¶ÜuÓïèŸiCéñ´IP¬®²R`FÝXŠ=»=… þïåBˆ3Qø}>LÓÄåŒ Ý¦h˜á ÓÀj· xñù½ìÙ]Ïç§¼¢œÒÒR|^V«‡ÃYkú*©·]ÓŒ–ÜÅÝæ(®ÌËÄY±ŸŠ–Ô¦/·ÎäÆå÷p§6Š«Ïi†Ë»Ÿ%-¹ìŠŽ$ÔWx[]rœ,[±€—; ¦­y€’¦ý¹´]ôFÚ‘Ù‘fj!Ëç¿FüÅ]h»eU~[ãÉŒW¬_ŧÛ[pÁYGÑØ[Žý˜jÌâuL»i ›{?Á‚qq'õbÔ%IŒY0™Çboæ’lÅŽ5ï°Õ0É‹–g«žÜ><›á/MâA×¹¢­bË{sY¸«£íI‚<I!¢’À ŠÜÜölúï—ø|>Lãȇašx<ì6;v» ›Í†×ëEi&†ÓÀn·£iu=Z(†Ž·ÍeNÒLþüÖî[ZŠálÆ…wwç×mšÒùöyÌIžÉ¬¿ÍçÁüb‚ÎdÚž?† .;ŠÀ@K¢ÿ„{¹úO³XøÐÝx]éôÕAí¢ïno9œ''ðØ‚ùL^áÓÄæÎ s‹ð­– .;‚§¾ÉÌ7ÐûŽÚ¦#Vq<ÇÔ`†‡pB#û¨xzMxž)Žg˜3o2ïzâhÖ&аYXÒÌóîN´=‹¹±3˜ùÚÓŒ/0IËéÅØÙwr]®Kî.BˆZD»<Ú–-[æ4hÐq­¸råJ†J~~>C‡=mW¬ëA<þe%…ØíNv>Ÿ—Òò2ÊKË©¨¨Àç÷’ă“¢eËìZ;£+‡$*)Íi°ªoCiX4EåDD3ò7‘ψ_ù¤ÆÊC54E”ãjÉ PJC‹&´=tlmé˜èºqøê;Æ4Y ×OõóŠ~ž¦aFž,éÛ6—knXÅ…/.c\®+t·H$OåÜÚ“=£äQo¹„¢ñ-_¾<Ò¶8ð¸ÛçaÆ] x€Šð«¼Ê{à•ƒZÔUéñî/› »Ý†iêX=``AâââˆOH"=-µÎj¥4,µt,Ô¾M¡ÕØPý3µÇ¢æqõ—#´ƒFÕ䢧£°Tý¼¾cjäåŽøÛÏöo°^kNVjmeÕKËÙÝ|¶p„û#ó¬ÿÜ¢Ôe½åBˆ3›Çáö?ÞÌ«o¾Åw[¾£¤¢ “€{ )é ddd0zäHbccOvQÏF9»¾Z߲͢·<ˆr¥Ðºûp¦ßqíc4™"(„ Dƒã`·Û1t@€CÅÅã÷ûIHL$)!—Ë…õ^DqÜ´$úÝ9—w&T^  œ¼R !ÄGƒã¤”Ân·“–šJjJJä3qâ(MkÕ"…BÔNƒ Bˆ3…ôw !„"B!„BDÈPB‡JÊ™ºà#”f;öƒÍ 7þ¶í[7‹¶~’BqJ“À ŠWV¬Ç–ÆRý˜ÎIKt°ä½Ïyll¦Ì=BqÚ‘À ·ËJn“&xõciq»¬üT(kï!„8-I`E÷œ&de5ÇápDÝn&~Ÿ¯Æçv‡‹¦±)¾ðÌ ŒClxãþx9#/l†½!N4¸U³žç“³nbòUÙ8ÎØÊBˆSŸQ(¥Ð”¢¨°õëÿ}ĺ ]»vc箸\5*//¥G÷sêŸ[`T°sÓv¸;Ó«•KC4„'"Íh‚Y»|)o÷>뉽!†Kô"6­þ'Ÿ ¸Ý4‘ÉBqòH`P·ÛM^^WL³rQ"“ظX’“’8pà@d1ŸÊ•““’ƒU>¯…÷;æÝ3‰¯‡/eY+wÃ<´çD¤Y Ó4©ï+ÍcžÑ!„¢¡I`P6»-¼B_è¥ëAt#HYE9¦aPáõ ˆ‹s 8šVÓ0ô:Wp<'"M!„¿,ÔÂ0 Š ‹X³æãHƒkš&]òò(((`ë¶)+/C7t0MLÓ`ã¦Íxý*<LÍjI“ää:óØ>g½ç†Þw{ô̈<Èúe3˜ñê¿ØRh!½ÃFMË•9n,xøþç™6ÿ6x1œ?îyž¼²9öÚÒ¼ÀÁöwk9ÆØÇʧ§0ç“mì9P†šõ¸œëúk¬{÷}Ön-D5iÃy#&ñÀöÄWŸ(Z÷gnºê{¾Ý¤IËî\~ëDnê—Qûü£”¯ÞžÅŒåŸðåÎC˜Î$2ZtàÊû§02;Úþ‡Ø˜?“gó×ðÕ>“ôܾ 7á]’BÃ$úñ—]!Dí$0ˆ"4t “ÏE_Œ¡ëè†N0X´4Ÿ–Yg‘œ‡iA|>/ʰcÕ ÑÝ„‡§Mã±GÁWk>éW?Ê“—…Æé㚻є—oŒå¶ü†Œ›Êe¬}q:NÐ8kùDò ó¹÷‰÷‰¹öNfž×kÑnJ³“±Õ‘¦¾cIíÇèel]¿‘½gâáû;à<¸¥Ï.áÉÏ›1hÔh¦ŒŒãÀÇóyæ¹ûIéô wwˆ‰<K¯pÒ톻™êå›,`áÄ[ñÎ[ÊbÑj´Á~¶-à s÷ÒmøÍLë–ŽeÏj¦?½’/öù™U½—ÃÇ–…c=¿„~#Y,.– IDATÇ3=G±õ½¹Ì¸e,žÅóÝÖ‰v¼A…Òz0ˆ‚ÁON‡Ÿvì¤ÃÙ¹µ>ÏÀ•šMn»lì*4áÑ,ù”Ù¯ì¤Ãø|Æ_Þ›‚.™øxÈbÞþn í{)ÔcéÔë.‹Eaè&@ ¢’Rô NLŒ«Îö @n¤ý_±Ýd׃éõd¤4ºko¶ ¯áÆsVóìײeÐ`F\{5ÏN:âK¬ž¦3§þc*¥ì¤´J_!‡| âÊ•JV"l>XŽQur ÒPJ…^Î,útróÒ¿e¿ÿ<’\êˆÛ5›Ù≥ǀ6ÄiZ8/Uë-þ}›ÙæsÓµO b*÷weÓ¯«›EÿË>__#³+¥ì!D}$0¨…iX,RRš„&†{t=ˆÝj£IR<š¦Ø_x××ë%ðã÷xиãëL?Ôp›Ñ^éA œô¹ï9ÆwŒ©ÒŒ)bÒ“±¹R1ó ú®{———,eòÈ¥,¿éfߘKlmi:[ÕyLuV» …?tÛ`èœ60‚uß3`è:¦²Dí®7õ :¬Çø¼¨ê1•R¡û?j+Çñ–]!Äa²ˆR•3û+o¡3 7Hfø}xXÁawÐ2«mZf‘Õ¬)iM’ˆ‹Áj³cèFíXœ$:¡¼ÐCÕ‡.ÛRÛÑÂêå‡ï™­ZÓ¦uå«ÍÜV@¡¬nZö½–ûg/cöqlÎo*LÌZҬ󘣪úe›[ùç¦ œ-sI³×ì °§æÐT³yCþZ2U L=´ÑžÞž–ö6¬ýoe#ïßɧK±g·'ÃQ{oñ–]!Ä‘¤Ç ¿Ï‡iš¸œ1¡ÛM3ü¯aXív‚/>¿—=»+ðùü”W”SZZŠÏëÁjµâp8kÏÀ–A—'ËV,àåNƒik ¤i.íÔ—[grãò{¸SÅÕç4ÃåÝÏŽ’–\vEGb >æµÙmÒˆñïæóïK1ãR‰³Ôžæ ”/y{]-ÇüÊ·ÆšuÄTì`íëóÈ/hÍ­ÏvÇ­fñ:¦Ý4…ͽŸ`Á¸Î¸“z1ê’$Æ,˜Ìc±7sI¶bÇšwØj˜äXÈŒW¬_ŧÛ[pA«žÜ><›á/MâA×¹¢­bË{sY¸«£íI‚<I!N ¢ÈÍmϦÿ~‰ÏçÃ4Ž|ˆ¦‰ÇãÁn³c·Û°Ùlx½^”fbèA0 ìv;šVGË«%ѽ\ý§Y,|èn¼®túŒêÀ N­è|û<æ$ÏdÖßæó`~1Ag2mÏ×uÄvðV½”φ˜NRÛ`âÔ´uj(=Í~]ê8&p•c‰£mޤ|¼„ÉwzZ9«ýùÜ»à6~ׯ…îî ¿„g%¨xzMxž)Žg˜3o2ïzâhÖ&аYXÒ¹xì>œú&3ß@ï»;Ñnô,æÆÎ`ækO3¾À$-§cgßÉu¹.¹»@!N h—XÛ²eËüƒ :®ÕW®\ÉСCÉÏÏgèС§í ƒu=(è‘Ç£¬¤»Ý‰ÃîÀçóRZ^Fyi9øü^’xpòC´l™]K‡våÓC)MC ×UåPE„Ò°h ŸG¶(…¦´*cñQÒĬã˜ÐÄF³2}Ó@7@³hár×Ü'Ô{Rµ|QÊQ=]LLÃŒçÛ6—knXÅ…/.c\®+t§‡a™Ïõ Ð´zò8в !Äéhùòå‘¶uàÀÇÝ>6ìjÀT„_åUÞ{¯ôÔ¢®Jw'xqØlØí6LSÇêÑÃG|Béi©uŒr«Z{”Ò°DÛ¤4êꈈž¦ªã…V=£y×ÜGiZ=\®~ŒŸí+Þ`½Öœ¬Ô8(Úʪ—–³»ù.lá7ö5Ï­ÖzøÊ.„¢n‡Ûÿx3¯¾ùßmùŽ’ŠR0LXì1¤¤'‘‘Áè‘#‰6ïÿÈ(g×W«Y´â[ö–Q®ZwÎô;n }Œ&S…â"Áq°ÛíŒ:„@ À¡âbŠ‹‹ñûý$$&’”€ËåBÓä†-‰~wÎå Õ†4 „âT#ÁqRJa·ÛIKM%5%%ò™ˆ®þá!„§ €B!ÎÒß-„Bˆ „B!C Q*)gê‚Pš­þ«3ƒÜøÛn´oݬ®õ“„BˆS’Q¼²b=¶„4”êǼøNZ¢ƒ%ï}Îcc3eîBˆÓŽQ¸]Vr›4Á«ûH‹Ûe¥à§BY¿G!ÄiIƒ(ºç4!+«9‡#êvÃ0ñû|5>·;ìX4Mñ…à>VÍzžOκ‰ÉWeãhìJ<Ùù !Ä)@ƒ(”RhJQTXÈúõÿ>bÝ„®]»±s×\®˜Ç•——Ò£û9õÏ-0*عi;ÜéÕÊ¥! ‘fc穱iõ?ùlÀuè¦I£OÒ8Ùù !Ä)@ƒ:¸Ýnòòºb𕋙įŒœ”Ī,$Z¤(9)‰@0xäCÑx¿cÞ=“øzøR–µr7̃NDš'!OÓ4©²äFÉf^yz&/¯ù–ý–¦t<ÿ:&¿œvq¡§&ã†ßMçëÊ•R³(<ãqËÕóBˆ_ ê¢Àf·…Wù ½t=ˆn)«(Ç4 *¼^‚qqn‚ÁÔ†¡×¹‚ãñ8ižÔ<ƒ»yãž±<»»/㺕ÿ—,yú)FŒáíéI³*tO1f×L{ˆK2l(@s¥ÒÚ)[Bˆã!A- ਰˆ5k>Ž4~¦iÒ%/‚‚¶nû‘²ò2tCÓÄ4 6nڌנÂSÁÔ¬–4IN®3ísFÐ{nè}·GÿÁ¼‰hÁƒ¬_6ƒ¯þ‹-…Ò; `Ôı\™ãÆ‚‡ïßyžió?`SÓ™ÁùãžçÉ+›c¯+M³„M¯?ÇŒü5lÞ]Š%©=×>ñã:ÅÖŸ±•OOaΚmìÙ_†OőѾ7NœÀUí÷ÔÈóü ŸÎ›Î nbûžb¼¦›ž÷½Èó—§²ûõ{3w=»Ët¬‰Yô¼êÙ‹4kÍf<°kË7*ú?yÃÎKªºÒVÛÌ¥,æ?ÿŠ²ì…”kMèØ¥#S,á`@Õ> `”òÕÛ³˜±ü¾ÜyÓ™DF‹\yÿFfGÛÿógòlþ¾Úg’žÛ—aã&0¼KRhèD×Ñ'ÛØs  14ëq9×õ×X÷îû¬ÝZˆjÒ†óFLâ!í‰o”1!„8~D:ÐIHˆç¢‹/ÆÐutC',ZšOˬ³HNˆÃ4  >ŸeرjènÂÃÓ¦ñØ#àŽ‹«5Ÿô«åÉË2±+E\s7šòòÍ‚±Ü–ÃqS¹3£Œµ/NçÑ g-ŸH^a>÷>ñ>1×ÞÉÌóšc-ÚMiv2¶:Óô³í¥±Œœ{ž¿¿•ÇóRQE‡HÈt êÉïg[×odoó‘ωÑBù)ÀÝö<¶ ¶c*;V]Ï;ŸïÆ×/‘êÓ9í™=èû*+—¾ÏUY—“›äàž"|¦‡¯˜*ñޝydØ%LÅAË_ýž wþž¾i¶C fÉg¼°x+ÉWÍæéÛ;ãÖÆþƒ¼ôÌʨßYò³—ü@ƈùL•K¬¦øUÏVx‡âŹŸqÍô~$A¸ŽÎ¥_ÏŽÄhÝh¶÷Ÿ Y’Í¥C/£¯[CuuñÅꉬ]¿ûV8%0BœÂ$0ˆ¢r²¡Óå ]nn¨á7u ]'6Æ…²ZØôõ·$%&‹Å¢0t“@ H…ÇGQI)zP'&ÆUçÌv¡3¼‹¿à+¶û‚ìzb0½žŒ”C7pí­Àvá5ÜxÎjž½ãZ¶ ̈k¯fàÙIG|‰5ÒÜ·‰­^7]ûd£iGÇWO~Fçé*z9›æÎߨS¬×šçá ¡ÏFöþk13¾ËÚ­û¨Ðb±ztlÅ^Œhõ“Л‰S®ã¾Gžáºß<úÐj ‰ôp[Ebÿ©üýÓ_ÈÖuï0ëñùŒ¿ÇÊò¹¿§µC 6³ÅKmˆ ×…RªÖ¹þ}›ÙæsÓµO‹HÝ)W6ýººY´ñ¿ìóõ%1ÒÍQy®vRZ%ƒ¯C>Pñ åJ%+6,'4ER"!Ä©KƒZ˜¦Åb!%¥IhÂa¸G@׃ح6š$Å£iŠý…ñxýx½^?~M;>±ÎôCmeèy¤Ðƒ8ésßsŒïS¥ùPĤ'cs¥2bæô]÷.//YÊä‘KY~Ó Ì¾1—ØÚÒ4tLZ´.özò³ªÒšå¶:±¡0ÌÚÏ£Ÿ^å®I (8ŽGîèLªù#¯?øÕz„•´¾·ò×7S^¸ŸbÓNáò›øC~szg9ÃykX,€+•Ü_ý©æF.¾ÿ>Ýw-­[ØHÍÔƒèX°ãs«ª§ Œ Üï „8õI`Eå,ûÊ[×L ~Vp9¤¥¥â÷(-)¡¤´„CE  ˆ¡Gû fq’è„òBz•Õ–ÚŽV/?|¯È¼¼5±U¤Ê_ÝÊê¦eßk¹¿÷%\øÔnËo†N¦»-zšö´\ZX_fÃÚ]xóÚS¥•«7?=UËyÔÆ»ã3¶Ûr×M¿£¦ ¥ÇÓ&A±ºÊ>J©Wi>•†fÑp§6źíU¦¾¹—Ä‹î¥WbÍ»”Rhh(Ó@7j6ÁöÔšªb6o(ÀŸµK¿jþöôö´´/fÃÚŸñæå„êο“O7–bÏnO†C¡‚õÔQ(Õ£ÙI!N Dá÷ù0M—3&t›¢i`†ÿ5L«ÝN0àÅç÷²gw>ŸŸòŠrJKKñy=X­VgíØ2è’ãdÙŠ¼Üi0mÍ”4íÏ¥úrëàLn\~wj£¸úœf¸¼ûÙQÒ’Ë®èHLÁǼ±Ö »M1þÝ|þ})f\*q–ºÒìÃm×4ã†%wq·9Š+ó2qV짢嵩;¿„ú*ª¶<ÛEÿ]ìÈìH3µåó_#þâ.´ˆÝÇŽ²*¿¢­ñdÆ+ Ö¯âÓí-¸ U,ž]ßðÍO»Ùòù¼þú§üÜúzfßу‹‚Àϼ¿èe¶¤y²’×ñú_ÿM Ý-ô˰a¯cÚMSØÜû ŒëŒ;©£.IbÌ‚É<{3—d+v¬y‡­†I€5¡Zþ=¹}x6Ã_šÄƒ®?rE[Å–÷æ²pW F=Ú“y’â $A¹¹íÙôß/ñù|˜‘_žáÌ4ñx<Ømvìv6› ¯×‹ÒL =¦ÝnGÓêxÜ–Dÿ ÷rõŸf±ð¡»ñºÒé3ªƒ:µ¢óíó˜“<“Y›ÏƒùÅÉ´= \ÖÛÁoXõR> |`:Im?€‰SGÐÖ©¡Tíiv¼m.s’fòç·æpßÒR g3.¼»;¿nÓ´Îüê j;vÑw··Γ“ xlÁ|&¯ðibsgйEøÖGKÁ‡Sßdæè}wk¾|n<ãÖ)2Úv¡ßØüþ²sȬ|p‘áåÀŸ°tÉ| ¼&öÄLrÏË · ¦SŸ ?üHÅÓkÂóLq<Üy“y×G³6)€†Í¢À’^-ÿN´=‹¹±3˜ùÚÓŒ/0IËéÅØÙwr]®Kî.Bœ‘¢]ÚlË–-ó4è¸V\¹r%C‡%??Ÿ¡C‡ž¶+ ÖõОGŒ²’Bìv'»ŸÏKiyå¥åTTTàó{IHHâÁÉѲev-É•OS ý¥4 -\W•CJâ)Ù¢šª:¡ðèÓTš%Ò°Õš_x"¢ù›ÈgDŽ–'QŽ«%/@) -R˜ð9†5 Ã$<‘QEΧ²,¡žœ#ÓRZå„Âèå7 3òtJß¶¹\sÃ*.|qãr]¡;Nªä_³Ì M«VçÕó0 BU¤ÕQ!„8zË—/´­<îöyذaW "ü*¯òÞx¥Ç uUz¼;@À‹ÃfÃn·aš:VF¸¸8â’HOK­ctYÕÚ« TxB] uuDWšunSh56Tÿ,zž5«¿¡ŽÊEJC#ܨføš×ØW“ÅŸóÜä¿ð®s¹vôZÅ(ܵïµxê(®ç yýo¤ï@ƒº3ª|Sã ½7#Û±ñíù,xç ¾?d!5§CoýµŠÅR=àAÖÌ{ž—ÿ½ÝËØâi–Û“«FþžA­ã¨/m¸Ó“À@ˆ­QÓÃ7Ëgðʶ~÷ÄãÜÐÞU)ÀäâßžÏ÷ßÃK3^¤ç_Æp®ã;žõ'¶þn&ÏnŽ]ApÏßwËdM}»s÷óò˜»XÕýQæÝ”ƒ3|;åŠ%¡‹TÇI‹x¢¯»QzNV`àÿù3¾,qÒÿîÛ¹./6|®`¢B=)Çzý7©{e|óî¼ó9ßî-GKhËå“ÿÄÈìÆù$0¨;£PDføýøª´Ø¾ Q¥,^¶-ˆÉwñÛ‘w1:½‚/òç2ëOŠÌÙ7ÓÙN§²+I/ãû/6³7c0conƒ³b_¼÷¾ó{JŸŸÆà,GÝC vzq¢5j`Pþ-o­Ø£ç$®Ê­ š³%—ÜxoÝ¿š7þsÝz¡1ï*¿>MÃ@׃‘Ï ]'X¹=¼OꥹïÂtìJáÊp¡hœ^ГX’²Hc%›>üœÝgŸGs§(T¤L¾c»þ›õìï6øéµ‡˜¸´ˆ¼«¯cRû&P\Œ;Íi“Nôw AÝ…*ûÛYüaÈ_ªm3ÐlÀÄ(ý’%oï!gô,n˜ŠMÁÙ©YÛ|ðýõtÌ­œ Sù†iš¸ZäÑûÜv8UwzžÛ5æa–/û/ßÓ•¸FÁ%0âÄkÌÀ@/þ‰&éÏ"VÕüÿ¸«y{2Õ‡ìÙvÀ¹„»¹ÍÃ?‚"»W骮:6n‚3©­Z6Ǧ*J'ÊÉ ´´ÜuÇV}áyþøÙtÿõ .»t]›¹°fÙ±]ÿëk/:´þšE¯m'åŠ'¸wDk\•mRà¡Q¾ƒÓ200 £q‡Z\Íý7wÂ]¥Ç bó|Y¦0Mÿþ-ìôÙó—[¹j¶ŠkŽýôvá¤Ì##oP¡ J¡Å¶¦ïÙNVü°…ý|lÜùRGs½:1um£Ù€Ûx¾÷`¾þôÿñÁŠWyø½|:\{? ÉÁ~Œ×ÿúÚ Ÿû[~òÆÑ¡{SU0jÄï 1Ú†Ó»Ç ¶íÎ>ûˆ»Ê¹Qª"´O0ˆŽ“î·=Èr\GŒõ8š¸±PT™à‘e?b–ª‰Åª…&5§NלâÓ˜=š»MíŠMßüŒç’Ô=Þ}ß²ÇT4ÍNÀBV üžºib¥j‡A´ë”î>7~Q“CW: ¡Ã¯~Ë%¯<À½ËÿÂßz>ÅÕzàØ®ÿzÝí…¶/ˆ ÿn¬VÏôœ–=¡Ù±q»âá<*»Ñ"‡ÿ×4L,I-É´øØñ£Iê€æÄhêˆ9¦ß }ÉÁðlR£J]åûÀ^þó]9ÖŒ–$i&q+®Bœxv½pÍe¿Jâß+—òΕ9 isøÖÄÀ>\ü!…ÎîŒÎEYÜdÄÃÇÛ÷PlÝ¢—ÓŒrRvâà)òÔ ¬|¿âQ'¸®•Š¡u$¾¾šï÷ÐZµ:¦ë¿%±žö"¹5™–wøú?»ñÝ gÕ^ƒFúNßÀ 1çñË>²)Rß•á¿IcÒ»ÓyLÌEÒpú ÙSz\Ø·Kš~ù/¾ØÕ”ž&˜P´îu^9«?í“lÿ¿×x}O2—Žé€»‘Æí$0âÄkÜÛ]´v }ù8¯LºíW\D¯œT,E?ñŸUoóÏâè;ö÷œ“h•F¯þÍYúÊBžµ‚í’±ü@IÕ2‡{3MÓÄ´4áì–vÞù¿×x»ÝÅd›…”¥žÃ€vñ¨FˆNVwÛüe…—–9-ÈL‰C•ìàß_E¡¥=2mh Çxýo^Ïþñy ¿$Io=ÁãÆ`.<;‡·OóÞô;«q¾ êÎèpÏ@À Jd“œëajÂ"–|ô3Þ-Åp&uÎν  q¶&ôûýåüë/+yiEOònpaš£‚/ßšÇ[tšŸÍ•“Fqm»˜Sj–¯âÓØÏ1Ðܹé©Çióò2Þûx93ÞòšçŒÖirIDATϨ©WsQn6LLÓBóËîfbÉ_yùý¿òøk:‡›äìN´õ3qýÓâéqãÍ zîe^Ÿñ~g ]¯iïrÜGùÀ¤ÿÍÉ tOLñ:þ¾èïù[mû3ò¡kf¬Çvý•S÷þš“¶#¦ðHü"¯ZÎÓo—c:Óé3ª½Z¤6ÊwÐÿ½F‹cl‹/ö_rÉ%¨c sVýsýz÷# 4Léêa:–ê]6¦n€fÑ"'÷©¬T…R M«2¹Ä4 MßÉËã'ñQÞÃ̺±MèÙÙJ¡)­Q"ïJv›5k×ðëó}Ì߃¢~}½ªÊ4 L‚üüöܱÜÂàïaHÇ$lÕ/e•ãÕ&„®[ ´ÐuÍ4tL´Ã×1ÌÈ­Œ PšÖhO@¬ïzuÂêÚ =àîðÅpU»^õõ?üYûGÛ©ëÿü/mÃÊ•+6lØÕ„¿Ê«¼÷ÞÓ·Ç@i‡bqä´Ð†*Sþ{w°ÓD…qü›)¥Å !ÐVPh0,ܸՅ[^€ÈèB_­1>€ _Âï`bHLtA0!BXKi§ãbæ¶ÃÐÒ)¹étþ¿äf€ÒR†öÜÃé¹·æýãF.uÜþׂç`üÁn—/`úÒ®ô9Ž•õh÷ÞÖ×ïõ½öTÏ_îéíÞ3=ì7SqèFüïÇ(7²^ßܬ‰qéŬ,› °ÇþËÿîÉã’ï¿}ùàçMûoÀK Yº*!‹»‘ãsäDæñjé±v?|Ò«ý?úñó·Z–UMqÿ[²]•P,¹M fî´&±°®ý/ßôZ®Üð}²À˜¾™ˆWŽ«jmG/ÖvìÚ×SZ %lIšd~®ç@.i&µ!%:ói¶žçÙU)Ó0[ç£XM åy^°.4o)ï qW]¯«r¹œõ]æñÊŽ$ñŠsmGZsƒÕÄ Qkè´uªz­.'­·!œC¾|µZ-5ê¬ï 0·ˆWv$‰Wœk;Òš¬&Í­¦ŽŽtøëPívÛæMJ¥RQmµ¦æ“&K)!^Ù‘$^q®íHkn°š”Ü’¶·¶µ½µmóf ‹¤˜â•]wÅ+ε]Óž¬72™È âUz8×é:9;ÖÅå™V–×´QßÔðý ‡Kc·L¢‹Ësyž§‹Ëó‰Wº0gV–W庮V–W'ÞÎ*û€ìlÔ7µ^Û “‚É2r.ÞSprö—Š*ÞS@ï) Ç€‹÷Ðc@Œë) Ç€×S@2®§€ d\Oõö´`–9±JÀ¸Ï“Y1888¸ß-€™ãÍIÝpx’záðÃ1´¾° ©"©*i)r4WÃËËÓü€UImIWáøŽ«È±=ªbà+È <YEGRIƒD¿ò¡« 1hKºÖ z`*¾4ü¥SNè…W(…WŽ&Þˆë€ÙdþÑ¿VD_V远0jr7ÕOÓ“0€|0sº¦j`æûž”¬b0,)èˆ=È3¯›q¯ŠA4)ˆö¸"1 OÌ 3—GU ÌÇ%ÝL Øì€ü0óy4Aˆï¬øº¹®ÑÑ ‚ üØèéö|?rrw@~øãŽÿ˜EªAwšòáIEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_design_layout_details.png0000644000175000017500000043557212235000130026714 0ustar00murraycmurrayc00000000000000‰PNG  IHDRãá£û»sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ  wOýO IDATxÚìÝw|Eûðgfw¯æîÒ !@B „Ð$tQP@)*V}EQ^EQñý‰Eå ‚TŠ])‚(R¤ƒôÐ!õ.¹\Ù2óûã’pIî.!„¼ <ß—or·7»3»™{žÙÙ]Â9„B!„ÐŒb „B!„YB!„B³„B!„f!„B!Ì B!„B˜ „B!„0+@!„BaV€B!„ºâˆÕþ$>þ !„B¡!õfS«Ü—û¦!„BKêEnpç J£ιïgÿWp÷#„B!Ìü¨GéA•ΔË8猱r¹&!„BS‚ÒÿVT—ƒÊÏ”ý¾dÀŸïL B!„¦¥ÿ¥”B¨߯þKÖ³¬ 4Ü÷¥š¦iš¦ªjnnGõ"ð&F!„P ±º³1”R€û!ª¦ánBèÒw\Vyjó¦111¢( ‚ T˜_T·²šÐüþ§TUUUÕãñlÞ¶+±Q_%q¯#„B!TŽ¢(¹¹¹ÇNëÔ®Ñh,Í JO﵀ TVPzïü€ªª^¯wóß;Û·m­×ëêÑ–B!„ª}^¯wÛ®½;¤ët:I’DQ,PT׃ʳ_J (Š,ËYYYŒ±† bJ€B!„P¥Îœ9 4(—Ôµ¬ ’Ëü§ɲ|(ódtt4¦!„BUEttôác§dYVUUÓ4ÿ;yÖ)4D>àŸøÎu‚$I¸wB!„ª I’LzÑëõ*ŠRšÔÁí u® 41ðM"’eY x–!„B¡ T–eÿ¬ >+ðO J/-ÀŠÐå‰sÅëq»]^øÕfã#`Ь²zÛ œ)²ZÃßøxœ TÏ)ŠRnQ]Ë h°dÊN"Ò4 ³„._ªÇår¹½*'~½tÁ“â*Èϳ;=Wt S[­]ØV½Èȼš%pÍUPèt¸^kÄ™Çé(pÖpü^g„PÕþ†ëöEPÅg—>¿ ÷(Bÿë0Mñ¸Ü^UÓ*ˆ¢d0õB-F \ó8.µxN$!„ ’Þh4JBµª£É*ç ˪٠Ôf;j®‚wù˜M ‹°êëqÄÅdÛíU4Æ8'” ’Þh2HÕœøÉ½ö"…S“Íf¬ÞVí¸æ-òh‚Þ ÕàªÓ‰.EQÜnE¦»àg}j²Ûã‘UcIÒz|<Bõ/%𩛉"¿Gøê€{¡ÿiN º Ý¥é9ÓT™kSmÇžL+É8ç\SeW¡ªY¬aÒ‡?DÐ…™¹Ì½®öƒñ Ýq½eJQA¡‡ù%\LõzU£¡Ú÷‡ ý…UÝ4¯[ ’Q_³™bíÕˆêŒz·âa²KÖ$Ã…¤ ö#×T™ £û?„êPËøn-ì•YA½p¦z].·¬qÀ™*» ‹J'h3Æ(%¸¦xœ…µºÜ|£ˆPò^¶ ñ xœEnYcœPB€.ÅW…â)Ûœ3Õã,poW=.¯Ê8!À˜ê)*(RXÐb+]W™Z”)1†EæuzT¦)¨1Ì(’`MWÅ–çLUT_ìé›9åv: _N´²L‘Ιâ•ËÕˆ)n/Áh 3H"%„ ¢N_2{ˆ«®BG‘WaŒçšê)*pø¦O…jó’ö¡”R*”Þ.Èñ£º ìN_d ŒÃùçÚ”)¡òÃ@S‚T¹V,¹>ÔˆPD€)jÕÇÓJö£h´šõ’@)¡Tt†ÀçL*k„ªô¡ê}€Ëår{<¥)AåŸ*éñêlP}311@è‹:³Þ[àÕTÓî!‚No4t¢ÿx31XÃÍTq8œ*ÑnÕ§ÀîÒ¸"«\’Él‹`œq&; Ü*STî‹y/Œæ²ç–vƒTo1TÖ™0Æ8ˆf›Å@ p_t –k¸Ydn‡Ã¥qÙ«™E˜ìr3ÁdµE`ÞÂü"ÕëVL’ž,V ôbÀr;òÜ¥•°E˜Áh6y.Í]è œƒ`´DPIÓUÚò~‹  ¸ ¼šâöhzsù† QYƒÙȼLÐÊ=J’©•t†¥™\äшd²Xô‚æ)p¸5ÍíR ]ˆ6/i£Å}Fà^—G ¢Ñj1 ”sNp-@ •îÂ5„úZ–(™0o=¨(ãL^ÕÙiç÷cé5×T•qB¡üiwkåÇ$BèÂPJM&“/ðÏL&SèDu?–Æë—ªO}‘d¶Fèd×ã‘5Mö8e¯Îl Ó—I €:*ÎE ãÅ£Ò\ñ:ÝþלšCç(¢œ1q`Þ§h 9 \$Á­ij‘ÝîÕ FCð¥ õmvñ% š¢ú2‘‚|—_Å@O{ë*}ÚŽ°²Á²E‘0`²¬/àö:$d›Ï„áe"è Pü5Qî–™J²¿Ên`%M¸äúP#ÎJ/Ê/»aA¿R9õí;¦ÈŒ«ýÐPR½c!t©Õýˆ¯8B¨õ(L–å⛂B}ÑìÜ€3_´+è½^àZW­ì ¢Vù˜"gÅËP„R\Q*ÜÒ3‚Ál ·(h^¥Ê#–T§:ƒÉd2™LƒÁ7k>`±².R±F^—Sf@%‰¨.§W«JÓU1bãÀ@“eˆà?ÿ«¸µƒW–3Ù]ä,òT|<–à»ÊTs_dÊÓTÅ+k¾«MÕíUçªÇ­b%7øñ×Ô’Û…j„â·\²4 XB^|·FÀ’ëC¸o&PZæ#:KDTddñ¿r' ¨Î¨# º ‹¼¾ ¶¾M®înEÕ€Š×ø®1¨ïõÂDÕÌSäô”K¨®ê·o$T h\s9 d0¿‹0IYåJ‘½„[¤²¿ºm¨ærä¹Ï}I/QD0è¨×Ë4·=ÏCÊÜÇQó8 <ŒRJ¸/‘ERÅКz“ÞSàeŠ» ßM|È:K„E"‹­úºü¯+ RX¸ETœ.™5˜ÃLÄe/ðª.§[g5mº Û…Þ‚|oé¾ÓEÀ˵vÐÊ2ËåeÕYþ"‚>Ìäu©\óº ½þ!¨¦£:³ÁãðhŠßœ$ÑhÔ‘ÃÖDÐIDV¸â´ç Do 7 APQç)”™RäÈ+"8Ã"-bÅÄJw ¡’D@㚬q= \²µÔˆ©Š‚x!ó÷©ÎdÒ©E2Ó¼EÞ¢ò¹_Ùã¤Z€ºø¯bÆJS“É%S‰\.—^§«ôÒ‚º Ï TA¯KoBQo´XÍp©0M6³^¤À5UU"H¢@՛͑ T å-—ZÐâ;ÛpÎ9!¾Í°…ùnçHD“%L/QJ€s„RÑw/ PBc'TЛ.èùD2Ù¬&ß—|wöÂC[­uq\u»D2™$BDc˜Žh®"… AšîB÷!%€P*,6ßµÊå[;he©N/R ¢Nªãª·Ú¬fƒT|xB©¨ÓùnãCD£Õfô]—N(õ&«ÕXi.Iuf³QòMŽ'„΃?@uf«Õ¤};žPA¨„ª‚N¢\õ(,HɼÎ׈k^T§#䂽Åf 󿉡‚¤×ø«¬^# „jŒïZ£ÁàË .‡(#à$'ß­H5MSÅãñ¸\®ÂÂB‡Ãár¹ÚµkGNGD¡ Á•B{¡Ì}÷ÆÁ.4t[in‡ÃÅ@0…Û ´>6VñÅ6D ³Yõ8ø†Ðe§O1Û¹s§^¯·Ùl‹Ål6 I’A „Ô¸»+„ªM˜TÚB‚Þ¬'šÛ­ÖÇÉ0œÉn™¦]–(¥å€Š¯ÔGx]B¡:ö+™¬&¢Š†zyS}Bõaîá:#~Ã"„0+@!T&R”,‘Ø Uo/Ñ`ª¿ßO„JFîD„P=ƒg7B!„¬!„B!„YB!„B³„B!„f!„B!Ì ªï´B!„Еž „B!„0+@!„BaV€B!„¬!„B!„YAõ¨Ù¿Í{eÆ·'¼¼Ö+ªåoùzþ§sUþ?mofß¹bÁÇ¿‘y]jT—]¬B!„.‡¬@>2ÿÑ»|Ÿ‹q`Ž=ë7l?ía¼Ö#õìï_}õË!§V~“ܧwoÞ”éÔji3ì[–/ý~C«ØÿÃÆ©½¤¨v[»&·ü²Û;WÂñ†B¡*k.ÈÈýnÒÈ·ö3æ÷Z‹ ¿ÝÇm¢„ðšŽA­·ÑÝïÌž¨/{U^ºjâ·IžÃ §½p`èœ÷ÄjÜvU;ûÍÄÑï.³vH™¸`æÀ1@‘,xÆk%@cöu¯L|ù•€ÎÛ¸uÏÃnï›j.ù}g½×ÚU©‘`މo”Üþº;ï¼.-RW“5âu5|öý ˆ“>Ÿ~uDI³þ1å¶—‹Æ}ðú8‘Ô»!„B¨®g$dФ1­ÑmÏmF}Ë a‰VA§8yÆ„ÒKrV\/55Œ“B¬NŠ÷ß$Î.b´”Fõ?-¡P3¿žùÞ?iã& n¬'D°4³ uõájAVŽ?têØNîÊ9²eÅ’·Ývnök#ZšÈ¥Þæ‹jíÊjôܘ&wîé‡þü~Îc+—yñÕqlâåÿŒ Î5¦Ñ²íÊ™¦1†Q?B!„.IVP)kRZz»ÒK „È™óÇMø©Ó«?ÔÒPna%Û7sç.ß|ØNcZö>îÁ’ÍÕ ¥+®äì?—ÌùèçGíBƒ”$°óâùRræÇe7éø‚17.$þôâ™=­À)¶yz €Ç¸^™q©:¦€zjåÿݳpÛ—&Y:|ð±a¢KâSÇÖ¿ÿè¡,-<±Ý€=|O—˜cÚ<™?¿?kÑÚ½9^®í6úÅçÄWg<œX›µMo!蘑‘7|ÚO?eÞÖ"ÕHÔ@ëe9ëæÎZøçáÓ¹NYgMhÙýöïR2ÞÏ»–Ï›»|Óþ,Ó<ã–Q mc€–ÿ×'ï,ømOæ¹BÌ'¼õÒÕ¼|k÷Ðÿ¥Æj”ÞÎw ô|Ë€ož™øÞôwÒç<Ù;Z$¶¿zÿÓûüwÎ}Í „ËúnÒ=FN?¥»©`{€–/+h•C6TÀ}Ê*´Rÿ9m5>–ü„Þl„BaVP!öªlì‘3Æó8"\Ó4>é=¸øéÉËMCFMÓÀ¹yÉœ7§ÒFsǵ·T7!„øts÷®Ÿœº’u½kôˆd]îÞU‹öƒ©ôͲ›3hÊÔ~ $BM Í|Nƒ”ÔÖ÷Å? ám<0é¦p³–õ÷ÒÙKf¼“òþ³]Ã}¡˜êÖ§ß9nx”÷ÀªÅK^xÒ;ó1©&Z…Æic_>ííÕ¦¡c§eĉŽ,g㈋ ‹[L0X ܙíÔ‚î½óЖgÞ5qLŠÑuró·KfM9Å3ûÍôDsìY·13ꎉcÒµ"š)’œr­­Zz jDCÒà1ƒ¿~ôëÏÿÈé98âh€JmÞ»´v뮼Íã%àÿlȤ­nI S}°üW¢Ê!*XÛVl¥jÕ)Š¢È¬øÃŠÊ*ùCó¯Q¨ÍF!„fÁàö¾~×Íoÿ9hö£[¹ž™nŸ¿ìtËÑïî+hÓ oã¨/~8ü@»v՚Ųçµ;Ï,þÙØcÆÂÉí•-Ÿü˜Õð®ÙSîN2Pd®Þ¾=ȧ ‘““ëH*XU4¬Y—ÞÍ eÔÉuü¼ãœÒÅæË ¢z ÿ×àVFJzd4gc&~óÙŽáÏw ¯Bã´’²Ìܦc׫Ò,B•öGe¤Û™}lÛÊ÷×:té×63€skà’ÊsSb§ž][i—îÝZЇ¦,úd÷À)жü屨¡³¦ O1RÒ£S’wÌÄ%Ÿl2µ‹ 877íܳs+# „¸Ë·¶÷XÍÖè<}ôDñëe{ 3Vjr«¾éÒôµ;í75ŒœûWý©ãÚX‹¶Ï Ö~{'t•ƒ5Tˆ¶-ÓJÕ«ð¾7ïú–~®±f¡þÐRy¹„?àf[(æ!„fÕ4üŇ;„ „P]dS%jà•œýÇ=êé·¸qvqPÂ3d»˜ªs_¤¦#^žÐÑB  ¢¥±jgž”m:Äé©ïU"Ú"Åj°!”¬Í_Î]üË–#Ùnjû õ‡–8ë/·Ù=v’!„fÕ`nÔ"µUÉüþAS2&¼4ª•¡d9bŒ®îµ¡¦†)Í›û¯W&”€¦VárKBª03êBs‚“+ža±³÷ƒOŽjÅN|;ãõÁšAc%e/äÖ8†È[§}”±õ篖.}eâÒe#^qWŠ©z£¹MG¼<¡S˜÷ŸÅ/Íý;*½[²U$ Ý)åIÐ4ÅÓ°HÙÐJߨ¬µuI5V£²äs»O(<&%Z¬Rm? ðúO[ò;Eþò··åÈN‘) ÖùjR¥*Ÿo(­ªm[Ma[§¥•^ZãtX )±ÞüPýBÉfóз@!„f!¢ìÙ!À5bTr#É›™ qý“L´&†éË®WŠi•¨ûrç_Ç=m[…š“$è-:pÙÝçPs' ¼§¶ÑšŽ1°[œH4Ë+Ì ¸ûȆ½.}rJ´ V©qˆhn’qó£Wõíýθ'—¯pÛº7¾·²gçq©­ïŸùZø¼Z4}YfoÖíþý[Y…j•|â‹ÿ{æËó¿ÆÝþÞ»÷¦ {å-ëü÷—/ž¾Ü¡ˆ[të^In1Iû>4aЫ-žñ¯1¶óðV½SmÂEWT—8têøœ7úÊ*™Ha±­Â ˜›¶OúóË—§z4Éß¢ÛøY÷ÝØÔH«Ö8RþÁuŸ-Û•ëåÜÝ¢çÓom¦¿èÔØjØ„Ák§|úÞº>/^ßzd â[PïÜúåÛ_d3[“´ÛŸ{ø_­}¼>eÄË3Móæ®˜ó\N¾êé£oknOVhíŒ65R#ÑA7|õ³_5EÇ7jÚyÔÌ;ûµ‹ñm†1ø‘fh1p@£o)ýµ)>Ada©ÌÞ ]å ¤äKýGGªP£<èf#„BèŠ@>Þ”sÎ9×4MQÇãr¹ ‡ÛíNOO6Aˆ3ʇœ1ÆK_çœ1ÆIñ¯œ3^òÌaBhõuÆ™Váòâø—ï÷­¶Ì&ù~õm¥ÕžÍÄ™v¾b¾UŸ`!´øzçó++ó2T©q| üì…nj™=UfÛ¬WÎü衇èôÚÇcZˆKžßðâÊ–Ùªrí Z ÆjTz ø.š-[Rð#kRf#/\qïT¬rUª|É[é"whù—*©‘z,ôf#„BèbìܹS¯×Ûl6‹Åb6› ƒ$I‚ Ôøín.FMž+ T¾Lý^&e–"¤.)²Þå—ݤò¿ÖÌfBIåÍQasC7 Q׋i±ªíB) ¼©lÀº–ñÒÔ¨ŠG¡ÂG/\qï=ìB6¹€#¢úÕ/ûRUjb³B!tÙ£Ø!„B]ájrº|ÕÀ,l(Ül„BèÊtÅÍ B—qöX#“¬°¡p³B!T7á "„B!„0+@!„BaV€B!„¬!„B!„YB!„B³„B!„f!„B!Ì B!„B˜ „B!„0+@!„BaV€B!„¬!„B!„YB!„B³‚@86B!„BWxV€iB!„BW|V€iB!„BW|V€B!„¬!„B!„YB!„Bèr"^ÐÒxUÁåJQ•»væÙójs¥-RZ$6N¬øº,Ë«~[uöÜÙúuÀe\•ѺUkBN!„ºÌ³t¹Ú¶c[b“Ä^={ÕZPË9ßü÷æÓgNÇ7Œ/÷Ö¿þh0½²·¾4 $JÿøG§Ó¥4KÁÄ!„B˜ zÉQàHl’¨¨ çµ4>O)MOKÿkÓ_ ã– £sór“š&ɲLi½™á¦1Íf>xø`J³<œB!„Yª¯8猱Z[c 8Vç (J½q—UY H!„¬ÕûÄ v×ôêÛ4œú·Å!„B˜ Š)A-g!VGZïÎPÃã!„B˜ Ì .hÁO õnèáx›.„BÕOø¼‚*RNo\³#W®§A÷œÚ¸jgžÊCgŒ³Úü"„ê¡ztm4B!Tž–¿åëùŸnÌU9V-5û·y¯Ìøö„——ý³‚ÚǼŽÓ‡Ÿó°Z/»~>uÚë“ÆÍÞR ñzW#-ûÇÿ<òÜëÏ¿üãéi ¿ ÞÃO¸gÔ¼}E ¼€æ:µkÓ¦£N5d1Á6†Ô¬pïÏË–mÉÕª¼9ø‚B¨¾RÏôÍ[ IDATþþÕW¿rjXµ Q—cÏú ÛO{çe~¾\\ÂD\ÉÞ²üÓÏ×î:|,«P“¬ ›wì}˃wuÓU'xbö5“F¼±Kkpï»ïÜ“¤'µY‚–õË{_Õ´¸ë¶ £5úÕ^„¨N×¶vìüû£›{Nî.àYA…uäþðïQ³Å‰‹_éUösú踆ñQFìòÏáO¦½tpèÛï41l2$Ôu´F¯+àrÞ‰ã¹úÆÉ ô•äÁê¹U,Ù×ô¶û%ˆçäžýGÛvã”Ve¯cV€B¨Ú1ÁºW&¾üGŽÊ@g‹mܺçÀa·÷Mµ µùÕr‘3‰™ëè/ Þ_´f÷i—).µçÝcFökfP–ûݤ‘oí/sßÃ>~»´HêJÕXÞš§˜µ­Éƒó_œà¸ú—ÃùevZåRe¬`Çœ?·ì„ÊŠ÷ƒ–r÷êuíî¾³ku÷'ScŒW\½º%x¯X²Oe´íðÁÉFZƒ¡j­ÕˆÆöºwà'O|“ýûÂÕ÷v¾%!`^8+àœišF8+÷¦ØpÀ/õ'”û›àœ3æûXà÷C]V<+àE»?ÿà‹½…ŒPƒ-*2.¹]¯«Û%ZBö$Þ¬µ‹¿<ÝsôظÊv  ŠŒ²%J) œÒªe8ƒ!„Pu©Y9JüЩc;Y¸+çÈ–KÞ~tÛ¹Ù¯hiª'cN¬`Ë»ÏÍÜœ|Ï#Ó:„eÿñéœ×Ÿ•£ç>z•µb^À¹Æ´F·=?¶]ÉX«–hêP=åc?|ö·¬çû¿øêàuã[›è•1îwi²fß4ïµeÇÇ\}ÿØá½ZFAáÙÌ=éU|)+ØûÝüVüµ÷”'¬qË«o}ð¾ÍÌåØ×oÎùng晼"™ëlñ-zû൉¦óáÖé…coý”$=øñ[7%ˆE;Þÿ¿W=pΩÞÖ$õÚ»ÇÜ}m#îÎ\óɼo6ì:œëÖE´4yÚP IËÝüÅì¾ßtÌ.SCd³kýϘî‘þ!¦râ÷?²Û ìêKb+”üÒým °nרù-7%.ÿèèÁÕÛr‡4j(„–~S9öÉÓ~éôÒ¼Q- Ä{ì—ù³—¬Û—ãåú˜®þç©þ uœÀñ…ãoú„@ÚäÓ{Xüÿ¨0ÂÉ…gÜc/Ô¢ºØL/äåœýgÓlÜÔõ¾‘ƒR‚ÿÑRàœ1¨B|O£3îº/(!ŒBÅs!„.5`mÖ6½m„@ cFFBÞði?ý”y[‹T#Qó·}3wîò͇í4¦eÏáã¼!Ù,V¸wåûsWlÚwÆ)ØZÜüÜ‹£RM”;v-Ÿ7wù¦ýY<¦yÆ-£ÚÆ&-ÿ¯OÞYðÛžÌs…2˜;Nxë¥þq’’ýç’9ý¼ã¨]h’v^žpOæÏïÏZ´voŽ—ëc»~ñ¹ñRáÖYÿž¹¯Ó3³Fš9!Ÿ\·9?~ÈÈ;z&ê ´;´zâ_ÛΩ,Bà¯GkRZz»ˆÒTÀ÷%Ê‚l¼{÷Œû¦úλw4ÖPÏ,7êó¦/}8¹MѺw__ð×ÑsyE21Ƕȸkܘ)fÈ«Æ BÖ·LÑÞ/¾ÍJ5µçª© ?ÛrÏó½"Å+â+þ’d,ó’5ùŒC“ÏO¾­™Q "£6iãÛçÜóÏÇON\zBÕðfîX6ëÑ}ŽwfÝ–hP²ÿÞ°ç¨[ãT§wÞ‰Ëf>£ÅÌ}´­¹´pÉbµˆDm€ˆPxæœ[ ³è\ö¼Ì¿¿~ù}“ÿŽH1(G>Ÿñôu t„㌤ÜYêy‚d%¦†ÉÍS, [ÎÌïÛ/¾o6þöôpJ´ÂCëøîgœ$¼qÚµCúwnd T @²~÷ù_š›<º­>oãgþ|(ÏÃstó.ýoíÓÜ*P³~~óÝ--˜4(Aïü'‚@äs[üú×]Ç2—Â[ú×ÝËwÅG˜!„º8ÅW© K¸;³€÷àâ§'/7 5yLçæ%sÞœJÍ×ÞÂ2¿˜2qa~ÇÛÿõl›hp8¬q:BäËŸž´È™1lÔóÍè‘_Î}rŠgö#šé‰æØ³ncfÔǤ…kE49R÷®Ÿœº’u½kôˆd]îÞU‹öƒÉ7ôwrù´·W›†Ž–':²œ#$\–eY 2AA o ?oÚrò–&ÉF-kχ©y›1èˆgŒ1æ{›ùð’ À˜ÆøùÏjšÆ8­èȶÝYñÃßÜXx|ý— ßž*&|0¾ƒÉ»;HÕ*©EñØöÒõ¬ë³×¶mÛeÑË_­9×mh#éJH .IV dí?Å8‡¨«:ÇhññPä±Üuï}}BÕtíîÿ¿)C’í+Ÿ7ÿþOlëÿlWÑ9Ú¾úÁ£Í³?ŸðÈüc¹ëWy(-ÍP\vû^ùï=IzB¨@ €!mÂü‘Žgöúÿ½àà‰M»ó‡5Ó­oñaUZß7óÅ[[XÀS}QfÅäüc§dÆxò˜™3nmlàªJõe3GÕq"ŸsnhÔØ"°¼@%ç­ªû5’bšÅrNÍ;åÔ <@üÊ œœO *d œsÎÕ‚l3µjß¹cë0 ©@Hñ§8"5kš BÊç@Xµ®+à„¡¥‚@@0ÆuÒuÃì ëö¤w·œY½àƒßõÝÝ9$³õН?&1“†$ „„w»ëžÎ!†(“(KÓ«n¸³›EÏí×/[½teÂÄ»[‡QßYî;­@}.¥”çl\ôõN}¯A÷µŽœùîX‹$”aÀs!„.~dUq;³m[ùþZ‡.ýÚfpn¿ìtËÑïî+hÓ oã¨/~8ü@zòîùŸ¹åõ©÷6/žKnúøËc±CgMžb¤¤G§$K>Ù6djpnnÚ¹gçVF@·¯ÿäǬ†wÍžrw’èÔ sõöí¾(Ìr0s›Ž]¯J³¥ßpÖNO~ô*bž4j۔ƌú«g+ïß›´ÁÏ=Ô%Äu{_¿ëæ7ŠŽ4ûƒÑ-•í¡6>Hnœ›;öèÜÊ@:wŒÏÚ:é÷µ™£Óm V5º žûõë]æ«_igŒnîc}ꛟ3þ+ÅpÌ"º$Yu"€ šií=³ë¨Æ¹¾ý7´‰6 Q× lùñ½ž£»²ä.ñ%%P*è¶ke…ãvûi‡ `( ½AJ2æØ¾äµ×>ßžÃ8gŒq(Ês©ÞœíÎ¥ÃnlaÓ ÌVV ©açnq_|uúȼ±÷¯é5èÎa·^Ý´ÜŸ§;ß Æp£ÞSJvׇ5LÐ\ù.Î9(þ6ƒˆóÀYç\ßì†ÛÚýñáóéuÃMCôL±‰¤xRnérÇÕÉ hqZà7­ÇÓ4VøýÄi§êÉþi}n“!É4*Üûêo›ÎÞØ¼1%ºð c¤’bÍ ­;4€$[ÎÎÙ›8´4«È}…ú’‚ó«·£ˆë“ZµNmf¤A2¼®!„ÐEÙóÚƒgú¾6ÅÆ=zy\ï(QÍÜÜ£ž~ûg£2Æ Ùn¯eßOXÛÎ JK¿“äì}G½–¶¿hHÈH3¶çŸ,¹‹•–Ä %_bJîÁ“²­C‡8½oar¾}Êà»ÚÿþÞ3£]3øÖ›ön.#†8+ΊÎ?íì2àªøì;äC¬Ù~KzŸø`7CIþâÃÂB¨.²©Žª§ƒo|e§ï›Yß 9†üt®@UõA«VY-@>þËŠ£ n|¬™ž0¶< îÛ~ØÇ#éæËðï’dbtJ,!YµyëÙû›'ꚥ‘Uq#s(?Ë\0Fì\UBàªz>¨uíœ7í³mÞ¸ÿ½CÒMǾž»òˆ€«2JE¿Ä.` ĘúЬ×/^üÅX·äÅõï~kæ}Íý®I¥z›Àå-ð2àZ€’ëEˆ\T¤€Þª6cÿÂfYj<ä¹w:n[½â›å¯?±üÛ»þïÿnO6qNx…«”/>+ ¥IAiS €œ<§h¹KgNþªxiƸޮ@_Aéù¡-Ïš¿nýç´ÝK ‚—‰‰*¡„ú²BJÓßúÆ=ú6ß³|Þ§;vïÝ«kû&a3ÊØúóWK—¾2q鲯θ+%ô%·¼àïwf­2ß÷ÎÔÁñ¹õÎëç=ôÌ»ïõîü|FˈÍZ¤¶*¹®€rˆ'D¢ ¸p\³tyA/¦pªj•ðøîç3jÞ‡oû„ø" qû7»ïK˰^ö…/Éè&µ¶é—¦#2¼8sÙ¦ý§íŽÜ“ÿüõÓºcnú†i‰”ïŽ/Ú—/{2W}w€s®KL+LÉðûY.À¹ÝG €©*Íq옓sHìw÷Юï–h(™gß U<âݾtM¦‹pÙY(s­B г€&óÂÇKfÜG8;²vÓ9¥L$o‰³×¹,7ÐÅ(Yª5Rì'ìœsø¨æœsà_I|]á-(~òg¨)¡ãÀ1ÿ÷Æ ×™öûã!cD¦w¾[ÕXÀb õ3Jh°¤¸';ÿŠ–Ÿ™¥ATãH0ºÔ;Æ=ùÄÄÉOLœüÄcOOžt_[«T’A”~„eÿ1ÿãU'c{3þñÑC® '¤¸Lß J…uéâ¯5ùéú4ÎÿëÓ·fÌþå´Ìl~£!„ª>SÔæ)©í>ñÌÀðs_Yžéá F%7’¼™™—˜Ô4)©YRR³¤Ä†a¢ÒH*ؽå´ì7Ä&Å´h¢+ܽõLñ‹Ê©Í{ ¥Æ-btBi)¦U¢Î¹ó¯ãž@ƒtD47ɸùÑéï¾:À¼oùÊžJî©:)24NŠ(¥T´µ¸*Yç>wÎêSeŸ÷jãkC+ä=íªZœºj¡rçžeëòn{îíY¯ÿwÖÿõÆ;³¦Kpÿµr›Cã¾@Žk¬4¨+ýùòpiîA$4è7aäêñs·»N®š÷«çù’=ÎÝ­ížê}õ¨Á_L\væïŸ¼ã#â›&ÓôŽ{®²Râ ^¦!©Wk݆mžoÜ7d®N3]÷ÆÜ1ÍRZÚàH^æ‡cZÛ4ÂsÈUÊ úŒì³ô™Uy[ßÓ{¢k9qÉŒKH9öé¸_`‰Ž6yÏœe¤ø$k™FcÒÓlp,ÿÈÆ#®ë£¬qJ~­W¯Ëûgë)hܹEK+à™»¶›Ì%·³$µJ1ûî+Ê9çJÖæ·±„&‘F%kçñ"fŠ0Q!*µ©nåo_.k9 ‰ç9c:_Ó²ÌhâÖ¤‚ =Wà ÛKæLqùìŸË6äëÓ†¤G¥Æ1º³gil÷Fzÿ³…Š!L²S%õÝ AÎ=tšÅßzCô(‘²°Ì0²ƒR ”*Tð­‹Á÷)!¬QÛk†µÉèøåÌÿ®ÿóô5w¦Ël"Î B!t±!„ÚÒG>;ôï ßüºËŒa‰÷ Š{tÙ´©tø öqoΩ‚Ä~7´²†w9¸áø¥ÿy†ßЦÞënÒ뚦Gm<öó_1Ü; )ùuá’Ó ÃŸêd ô•J,î¿=qÌâÿ<ÃS#³çŸãÎâ8@9÷ç·[X“¦ÑFåì¶L'3E™) }÷)º]çèO–¿÷a›û¯oVøÏüåIÞÚVõ¯Fb ¾ñR\Ï>Mæ/|ïõÅîS£èÙCŽJŠ Zµµà»¿ÛèLº§_§ÔÆ¥—75÷OübÁ·ózÜg…œm¿m>ѨG‚ßωa—Çi„Kõ¼]Âà6ûöÓÏ~Úv8ó´Ý+š#bµ¼ª]8 ¦´f¾ùþÜï68ë kتëÍŒXÙ£hdïÇŸ:öÖ‡ßí8a/Tl ˆ¢!õþ—ƪÿýbÝÞ³‡öœåDž’Þ4L ‚­Ë„·¦7þàãŸw*¥Ëƒ n"'Ö«FŽî÷Ö¢¥³¦Ë†è·§ôhañï8ðYA¨ë  èÌ‘C½\}æÄ® öåGö{{§(I$iC®Žš¹æãyB¿ž-£ô²#«(®k÷D³•’ ­Ýòëšf=ÙÖ1:)~ùí§ æÎÍbõùÙî;‘@¹ße RXŒìvìËjÐFwøÏ}¼A¼M¯æ<ëæ†p“XþB%BqB¡š@­†M¼vʧï­ëóâõ­GÎ|-|Þ‡?-š¾¬@3„7ëvþ­¬‚±ÕÈ×^³Íûà‡…/}éd†¸«ÇµëÕ4.eÄË3Móæ®˜ó\N¾êé£okìBY}ò°WÞ²ÎùâéËŠh°E·î•d”üƒë>[¶+×˹!ºEχ'ßÚLOˆÌ5UÓ´ ßÝÆ–¾4YœûÙ§¯üœç‘lMÚÝñ̨aöœ'}ð—‡>÷\Áì¿=u±&è­ÑÍÚ· ‚O& Z5€àµ`ö-Ëÿv'ÝÓ-NòZ”öè›4ÿ£åÎ]sܵܶîoç­ìÙy\K¿ŸS—E ø>0¾QÓ4EQ<Ëå*,,t8E.Wûvíª<Ú7Ϥd Ä7I»dÒ=gųP!~/ûn<å»OñÕ¶¤4üâ¬tš:!¾Y!çË)I²Kç›s¿gh•.^¾„2Ÿ'„–¹ ¥˜7sÁ#/8Á[Œš÷öÐ Xr]®wlšqïóë „¶O~øâ€î®õËš_zv멨J€½è/°âðW 8Ó8Pê«UÉËTýü¶ùÕ¡´Ç#öÜß±]ÇrGÔüOæ÷êÑ+ðaÆ ·¾ÿêûÛíŒ †ð˜ØF-3ú÷ïÒ"¢øÖQ\+Ø¿êëo6ì?ž]Ät–øv7»§sŒHäìÍŸÏ_±1Ó¡è#ÚÜøÐ˜¾‘Ù¾úô‡¿Ø.#›õ5þ†½zzÙ Ó7´yìÅ;“ô ÷­xï“ßóÓÇMî¼{ÞGkæ+ºðÄô~wÞÞ'±|`wØÏe»áúð„BŠ3•¹1gã%CÀÀ£ìëç_öHh™/eVñÞ;þ%ûÎTÇ"ŒUŽ8cÌ7p´~1IqQUªlÙí °ñ¥àe££r•*Spઅ¬E ó{Ù×2þQ ~;#?;wîÔëõ6›Íb±˜ÍfƒÁ I’ofDÝ .iVpÙ`öÍošúK®¹÷ôþݹN=}¯*´ìoŸ9k¯Öä®YïÜÛ2àÕB¿¬ù¥G׳‚KuäB€8t `VÐûêÞÁ3ÎÊ&)þžxÙ¤ªLJåÿZÙåJäŒñÒÌÆ· !ÀoáÀÂv»ýÌÙ3˜ „B¨>f"î§* á|þÁÈ£©7u´õ/âbú=ý‚뻜Œ»Z„8ÃxÑ%N  |™Ž(ˆAÿHª=wO¨ÑÅ*$)XuB!„ê8Ì ª˜XÚ ½·M½½ù¤.¦Ãíÿªdë9çŒ×^PKrƒz]A]ndN–eü[A!„f—³z>-¤J›_›ç ¸ïAî%\³Að\B!„0+@õ›/¢­½Ä€cL:®–§3ÕHâ%IH!„¬ÕWV‹5'/'*"ª6Wz$óHB|BÅs‘‘‘»÷ìNo›^MÓvíÞ•Ú2%„BaV€ê«í:ìܽóð‘õ6o‡sÞ<¹y|ÃøŠo ¸nÀªßV-ÿv9z3‰ˆq–Ñ)£yrs¼B!„0+@õ•NÒujß©–W,€Öëõ7\CˆgœÕM¦!„¬Õou*¢õ=Íw B!„Pí Ø!„BaV€B!„¬!„B!„YB!„B芅W#„B¡+Ô©S§.òùH —GSไB!t…ªGL½Ôð\B!„ºÒsƒìÜlG¡CUÕÊ£gA´Ym1Q1—ÙsŠ®ˆ¬€í™ÿŸé˲“ïýÏS·&ð6ø!„B¨TN^Žª©}¯ékµX+õ 6nÚ˜›‹YAµBsùÜæo~¶f×Áãy^st“fi}n¿÷ÖN±úK¤«ù{ÖïÉsj¹ë»nI4˜ „B¡ö{ßÞ}ÃmáUYØfµuíÜõ×µ¿^f§ j)+`…;æLznÙ •1ΠàÜ‘YGw®]}ëôY#ÛX.qœ.Åxr¢¼.7±_·pŠ)B!„ò£ªªÕj­úò6›­*s0+¨˜Ø7Í{mÙqEã û<4vXdSÁÁ5‹gôgî‘¥3?ê<û‘4eí³÷ÏØ©{M[ôdû0ª[2~Ô§'YÓ?žuSuìþvþ¼åî;«XãSû =òš$PάZ8ÅŸûŽfå»T06îÖG¿éûCšéê …¼ÔhÑœÏþôZŠÒ¯šØÚH˜=@÷Ó“÷½¾YúMÿt|ñôWcÇ,8ÞzÒg¯ôŽ(\÷ï{^ß©Y¾öÁ„ÖFÌ+B!„.3—ÙEÕP÷ bù›—¬ÎgïyvÒMW%7ˆŒOÉþijCc)ðs?,ÝU¶ö}[c;ÿ<.s®åïøó¤¦iI×tн>üøÜ_vŸ*ÒYÞÉí_½6ù¿òT œZ³òÝ'r ½T$šSK¼ºKà Î9gœð.ØÒº7fLËÛw GcÎC[kšrdë1/÷žÜž©ªª¡M÷&z‚)B!„¬ ”¬ý§çÓ5#Þ@ ñ¥c¦¤žéa„€÷ä¡<…†·¿¾@Hîæ 'e;{ÍaÎyÒu]b…¼ ï~yRÕîyó³e_|¶p\ª…«?ßœ¯qàœs° œ¹x劕?ü÷Îö]ú¥*Dò‹åYÐiL§îñ@àÄÖ#EE‡ÿ<¨q…{¶uŸÛ³Ï\×úšæ&L B!„®v»ÝnÏ¿B*[›÷ "åNÍøÿJ#;öOvî:»þ¯3ƒãWíeœ']Û#V§Ü™©q'>y|Ø"À™Æ8dÎQyti9” T” ºÀ…íüJåÓ;‚ߥWƒÅKÎÞz䨴ÇÍE(g7ï;¿åçbZßVVœ<„B!teÈÎɶÛó9ç²¢ÄÆÄ^öõ­¬@ŠN‰%$²6m9{_J¢Þ÷ªçøŸ» 9©aÓ  ¿ªª¸{׉Õ?ý¹Gå<ùºî±:¢© ²ë ½ŠÓÁÒ6B „UXSBÀ}~¦zƒ(5¹ºKägËs7ýô£Ã› ùÕG;ýé§#'m®Oä!„BèJI òóóÃÃmÄn·ÀeŸÔFV@£2îìn~á÷£ ^œ6~x÷D£óКOÞþò,ãÞ÷–t%$*ã¶žæÝkN­XxŠs©Ý×Äé°ØÖñðûApºô>´•MàJþ™|cÃ%àªâO›´@Ð5íÓ=jÅʬß~ã¼ÁˆîÝö|¼uç;8'i×wŠÀ;š"„B]þrr³íöüðp[Lt¬on‹Ýn'b¢/çÄ€ÖÊJ"{>üx¿ üäÏsž¾ÿž»‡™:÷÷,CüÀI£;X}á6±¦ßÞ/†çl½îè%¡aŸQ" ‘w~üÄí7Ý2pÈMï™0g;ØÓ©âOhØ7Dº¦}¯Ž"À9DuéžÓ¡oKJ€ƒØv@L B!„®.—;<<¢4%ˆ‰ˆˆp¹Ü—w­ií¬Fˆèòï¹ï>?¼W›Fá’¦1}xBë^ÿš:ïýq"ÄÒh[Ÿ2ðææ„ˆxKªÙ7»‡X:{ûõQ}ÓÙMö(`ŽMŽ4tU )“7„,P—tÃõñ„@xç‰z!ºCŸ„CÇ¡WEbR€B!t%hÒ¸ILt™'”ÅDÇ$6I¼¼kMx QwÎ9ç\Ó4EQ<Ëå*,,t8E.Wûvíª}?WÎç%+$„Z¡$ßÅ¿„Pê?‰¿Ü ñ½ë[ÊÎø¯XHù%ƒXüc¼dÑâ¢Ê¯!„BÕ'Ož€}÷Ý1ôŽ q?ÿêóV)­! •.¼sçN½^o³Ù,‹Ùl6 ’$ ‚@©;ÏI¨Í{ ”_„ B•?xá@¯—%Ä–2Ë[B!„B—ŠM€B!„f!„B]¹DA,((¨úò:5Ä IDAT¢(^f€YB!„º¢Ù¬¶›7:Ž*¦núÓf±ÕKj&5Âã!„B]Éb¢b²s³]û«ªª•GÏ¢h³Ø¢#£/³FÀ¬!„B]Ñ!±Ñ±1Q1U_þòkÌ B!„Ðsž›í(tTé\ Ú¬¶˜¨œA„B!„Ðå#'/GÕÔ¾×ôµZ¬•Æú…7mÌÎÍŽŽÅ¬Õ$E‘7ü¹ÖnÏçÀ±5Bþš4NêØ¾Ëeyª{]„PÝéWíö¾½û†Û«R‚ÍjëÚ¹ë¯k½ÌN`Vð¿÷Ç_ë-[Ïî×bS T·GŸ_þwô­ ²aãúÝ{w¤µn‡‰öºa×Z#]kÀ~UUU«ÕZõBl6[UæaV€.LaaA®½)Å»Ä"„ÊkŸÞi÷žíØØë"„.u¿Šƒ/˜üï’$᱈ªH ^±×Ea¿ŠYÁòýDðû !¥D°£Æ^!„ý*fWÄÑIEQÄï'„PÀþÇ´°×Ea¿Z-ƒMPŽNl„P@Á.{]„ö«˜\G'Á½€ ÞM×ȶšýÛ¼Wf|{ÂËËþŒ½nÐòþú|îGrT~!o!„êu¿ŠYÁÿsŸÞ½yS¦SûŸ|üRìLXBÁØš™èÂ{ÖoØ~ÚÃ8/óó•ùÍWã½®rfí’ÏÜ_ ôñVå=8oô-#ÞÙSÄ0•AدbVp)È9[¿|}Ò˜{Ý8èºÁwŽx|úüÕ;ñ^8í…÷þÊת×Y…ø8Ëýî±!ýžø-_ãÀìë^ºoÀÀA×Ý8èºÁw{èñgßý~WžÌ/ÍÁø;|ç±7\7rÙYaBè ÿþ ÔCä~÷Ø~7ºÎï߸CvªÜÿNß–ûÝcCú?üñÎB¿Hеõ¹[†ŒY~Fá—o“2ÇïÓnîÑïßßeo<ïÁï¼öúQ_¬z§Ï9 öL´o•ëõkdKj"40ÆÆ7jc0rBWT¿zÅ«¥«¹ûÀ‚ÉO.:hL½~À¿nIŒ"Ž£{vçËÕ-]ÔWðs®1úÞT ²r”ø¡Ïé`rçž>qèÏïç<¶rù_×Á&Öè±TqÔJ+8øëgüwñ_Y*kqÅŽæ!„Ї´HÐþªÑmÏmF} a‰V¡ú½çSñÌ«±sž½¡±ž”ô—švÙ —éu©­ëƒ÷·];kîâ}½'¤…Q,wÍÜ/ÅÝúá€x©6#‡º³%RÂMSßBÅÀ ]Yý*fµ‘xö/y}ÑÁ¨!/Í|¨½M"®¹n0J sìZ>oîòMû³xLóŒ[F=4´M ZöÚ9¯/øëè¹¼"™˜c[dÜ5nÌÀ³ÇŒ¹q!€ô§Ïìi<½ò¥§n;ãÒ$kBÇ>6¬S´/rg…{W¾?wŦ}gœ‚­ÅÍϽ8ªiÅ[w|ÀÚ,½]»ô|Ë€ož™øÞôwÒçØr¦HmM:ß<î©{3büÆ™ª³%Ü}äû9Óçÿº;Ûà z=üú‹ƒé Ћ$ÈÚµ¼?>|ãýÕ»2ÏxÀÒù‰¹¯_ïž?rÔ·]Þþl|kUƒ|*ë×7_úà#grœ2 kЪ۽¿©dW#TûUÌ .-×Þ/¿?)už2<=\WÒé—ìùð’§'-rf õ|3zä×…sŸœâ™ýƈfz¢Ù¶;+~Øãã› ¯ÿráÛSÅ„Æw 1ƒ¦Lí×@"ÔÔÐL o3àI7…›µ¬¿—Î^2ã”÷Ÿí.åèS&.Ìïxû¿žm ‡5Nç[kÙWžQÁ4xÌà¯ýúó?rzôf²,Ë «ùQ+©É³WÜN©gë”™xˆ"„cZÁ;)ÎcÌ·!¾ùŒù îs¦iZÕÏ8ÒFƒ§ŽyòåWÞlþÖS½¢Ë~C{Z__ÝhøµÔçíZúÞÒÙ;⮽ûî'†™ó6.z÷ý—#SçŽki Ä{pñÓ“—›†Œš<¦só’9oN¥æŽk¼»Óêöºúæw>~ëçÎ^sÍÔf+ßX^Ôý©±W…‹Ä{pÁcãæt¿÷‘Wš“ƒ?~0{üãîæŒL1Ppí˜3þ©oX{Æl®ËÙýÓÇ{Á\ÜæÁß!¢í ±Sn‹4kg·,ycÁ´Y->Ö#Ü/’¾à-ÑŽ/}w<úZx1ÿlab„ z1èÚ5û®5ŽFÝýäøváÌ)4É Î4…ÜfÍyxóÎsÿÏÞyÇGQ´q|fw¯å.¹Kï=¤„1š4)"MÄ‚*¢"¨¼¢X°#‚ i*EPAAD@”^B€H/w¹¶»3ï›\.É]H#ò|?|ô²{3»7»óÌó›gJ࣯¼ë¢Ïøcõâ§s!«¦%k ÀÜævTÁME(ÉÈ0"¿Äê}TŸ¶lí%ŸaŸ¼::JÅà.Éa–‰S׬<:xVG-BˆR—Ðö]Rb•8¥}@Îá÷ìʘÐ6!„”Á‘‘Ár\¦.4»G „ŠñÌÜýÌöcÙ|G-cH[úýEï¡Ïz´•ŠÁåi’×…B(·áôù\ë »¦óE ÛÖÏÁj Ç!„à•¡šVÐ;ùñÈ!sË>{ Z°xBlC/Æz¦N~cÄ‹ÏÏû¤mÔëu• “CKË–Ùêv©íc•8Ñ?gï“kƒû ap屿f:šÍÇ„ÊõiK7fÅLøzB?Fñ¾ûÇÿ°õ¸¤¤äF4§õ¶ºŒ&qüôþ;_ZðÚ;ž'³’¦Íéî-ÃTxÑꋾ#¿xýñ5ƒ»¥„Y›´rÉáas:kK,ÙœðÈ×oŒT1uðOßvøˆ¢.vz !Æ5ªKï(„B­½®ìxrË‘,Kg­‹µ¯ë¨ôÙDÝ­C—ŽmÜX”$õ¹‰Ž:½:BˆRuTj÷Ôx!Œ±ÕþY8O…¨KxJ·Ôx&õ® ìžÞõÛESû5´]ÀímWAÜ\ˆH˜|>÷ÔE‹kbJ ’a0FHÔ!Aý݉Ó9ÖŽneÏ KμÂ7ÒoË.¤)[Û+=>çàÚ…«;”žkb\X3‘•˜E„øÜ“éfMbJPYæÕdb-E!é†mÄ^+ÇwSv4-´\\ãn;a£ß~º†Å!Fî.g°¥á—ti=æ•qÿMýüßã_ ±7Ø-­Í`!„0–{„ºckQ‘aŒ±Ò3X‡N ¥|Þ™Ëf!kþ¸ $sJ !Ê\A.\ã™ÓX]Vwׄ—{í±#3aÊÛü,F–œ,®I©!j–e0B.aÛjV;™ËwVçž¹ÌëRRUÒ)é)aŒ1œŸÂXÈþ{Õüå¿8ŸcdÔœI”•XhÃî$ºÕðÇ’ÿüôÅGÏß3täCzǺs©¢Dˆ¯ñê ÃHãz«´>BmR©ü[ù¢Í×K4XÀmoWAÜÜk¸ÈѱÓY& s8äWò×¢¨Úr ˜UÈÈSZf¯ìâ|æO¯¿¹ÚÐýÉéã[{’+›ßŸûW™/RGñU’×köñ+<õŽò’7ªÍƒW€šú´j08êÀè¸ØòyÒhG,coâ ¥õŽ7byè°iã<½øÃŸÇ¨È,mƒ/ç0²–Y¢œœ•ú…"AÊSÞ«,ÿEXåÕÈ‹74Èê²íûƲ;²»uð•1A¸Z E)B˜e¨(8˜‡ãôyýŒ™Ëô½Ÿž59Ñ‹^úqöœ?Þ_îD>ò£ï:ýóËw«×¼þÔšµOÌÿôѵÂÁAyfí®^¥ó®v÷ŒY¥ ‰<¬d Üvµ%륦¸ˆ&aHñ¯å›.˜ªX ™wtˆ\üð5«Ô„ðWžÐË‚£½kð»Y…«‹Lb¹go¹š–.†3°SëV1q­ÃÝÊ3÷Œ ”•?”eµ×Õ’×j¹ôóW?g»¤>ÔÙ»q›1x5pn Só–[W ~²nþn(ÿb–‘:è¡åCÅí?;DØÿ¥‰ñ—¿_vÔZf¶YÚÚvyFÊ,È/4,<,,",,",Ô_ÃÝšBubuË&h”»ßrŸ¸0EɱYf©½°fî?¦—‡Äù*°Ü·u˜Bdo†±ZS"÷qzÊ|åÐ9!jä÷wm—©ujýk'aÌiÂ:=0ýÓeóïS_÷ãi#¥ŽÖþêõ»g¸sìjK¥I,2Ö´{ü™>‡ß^>uÊ™¡ý;E{°úkçO] öTïöc‡Oúþíw•öG鿯X“4úåd·Ìç)ß°sõú¸A4_ïÛ©»O¬?Z³qÕO®½âƒT¹WKË/«K{Ÿÿ³ëÞx¾7ÞWaÊ7…tëZ5ù=qZ§k&§ÿ—¦Uš ®_9·ï—-‡r|î{ë™»½8Trxnã-š±­ã@æ×µWÈÒ_}¼Ú4 Γ¹~¾¸¬CÄÕÏ åýóà•À.AšŠÏ¡'Ãw8ÿ{ž¸kâ'ie£„侎-mm ®ÃãƒüžÛøÖ,fô ¶~JKÞՒо÷ƺ–iú5ˆjiu±[ÊćB[9s¶êÉû¢ð¹­‹—_ ~|vŠcìvפÑá.{y7¢c°Æt"ÃPã®á”Â?>/_»tƒ[ßÄ`UÎCm{§j¸þú_÷“ÐHoípºª½4,”×ëêõ¾g¸sì*¨‚Æ…uOöÕ§mW~ûÓþ ó7 H¦ Šë­ƒ4,F©bÇ~ø¡vÑâ­+ÞYk J¿»''u ÷­šÇ©œ\ί߳c·MXd–TAè°YÏæÍs`ik‰ªõ}¨[´dÛª÷6–ˆJ]D§'ºô‹umTsÚØVWýÄ'Ÿ©|¶~Þ´êÝaò§SFÅH¦lõؼEÚ…Ÿ¯[öÆú"žUé|zF¸r5žâÂzçÅÜ–-}}›Q$sõM®åRžNïÄœzÇÊui¹fJUÞq=ž}d”’±¤;8ÈÖëêòúß3Ü1vµÅ” u$û)¥”RQyž7›ÍF£Q¯×—m“’ê[””Jm;jbŒËç5QJ()›1À`ÛÌ`J±›¥L‰HÊÿ¢¤|'2Ì0 Æ9 j¹PB)-Ïq˜¼â+]Ãnu?ižXÅW)!DšeÕðgp8íÀÝ]z9*UJDBì/´XŠŠ Ó/žo[ÝDØÛ«j§H%‹Xfù(!„b†ep¥Ï5eXé˜K[ÙVWÎ¥JžvÙv_iNju]©¨ªµ- ¤âG8;UùxÕ6¨>wbÿ°+?Z­ItruJÄ*/C¥#µKUÃûÍÚ®fff"„N;õà°ëäâ~¿þûبXŒqPPÐ ¿üï¿ÿ* ­VëêêªV«•J¥L&cY¶YI”¦Ó‰±cã‡0f°ƒîz\y̰¬“SÎrpvUìl¡Ê×`¯‹q "çoC·@Kè¹Aá:Ç Û¥ÀR;ʰұZÙêʹTɳNùf¶Fu(Sì¼ oÐô°uKRÏ;qX~N Õ鬚oíž;ËBƒÜavµ…#ÚT-Š 9_Àê€*héPJa}R°º  Z.*¥úÔ™ñq‰,LÕ€æëCV=R~¢ê»ƒÕÒPk€rîµZ½Ú`u eØÖ:›V°«  î(ZEFŸO?ûçžPTÁÃÝ3( ʬ.`WA´€gÀÉbZµ†rÀ°„X]À®‚*hAï'„±Àê€*€‚ÃÝĸ…í2µí»^—„¶´µüru~ÿØÇªnmͪ®GÓ\{UàL4\ØgÒ@…ªšB 83: à–·×„BH¼jBˆ-m-¿,AÊÁåÔC ØîÜö'Ƹ TÜD=P¥ÁY§h¸%ˆ¢(yí¢(ÖUHIj© ¤ï‹¢(}¶L©“*°ÿ¦ôYR¶ í`uͪn™$¨2N±Êªn•*¡~ª@„Ú\EBA8޳9ôõP6ïßþƒ½B°×µÏT4²$p¦죇ÎM‰äÓ‹‚Èó|T(ˆ’ày¾6WaYV’<ÏK[(ÚÕ^8Ó ÃØVѵ  àfIÛpC›$°Õ'0€&Fòéy·Z­uK(ð’¨MBžç†±Z­V«U BX–­“$°—öb€aBˆísuIPKaªn–$°ŸQ$éi4¡í8‚ˆÜRÌf3Bˆ·ò&“©N±ÞÊ[,[5#)¹\ÎqÃ0”R)zP›XAõ(}p€a–e™r(¥6yPWaªGØ>WѶyE¶ÿÚƒ*@@S"yö«Åh4ÖIX¬³ÙŒ16™Lµ¹ !D&“IJ€"Ƀ:©{I`ƒeYi$[Ž$ B6a`sQj¾¨h4mPEØO-’¦1IlKTVªš˜ÒÒR„Ùd6 uJh6™F#B¨6 F£\.—ÜtQ¥©µAd¯ lqÖŽã8޳9WáÞKWDµ[ŒT4T T—6¿_(‡çyÉ H"Á^Ø<a·D˜L¦’’’:Å L&“”¶–ª@šÀ ²Z­Ò°ŸÆ ª’B ’ÉdÒ¥p„tiBsaPs¸;tA$çFrbÌf³ÑhÔëõÅÅÅ¥FcÛ¤¤FÜZî0U`"ày^Ò6JKK Cm6 ÉÚqT÷m¿ê”°w ¶ÏG&“ét:www¹\.“ɤÿJ"ã8)’ ©ûe‹œe±hƒR}:"°Z­<Ï[­V‹ÅRXXÚ¹sg¥R Ò€+W®c5—rÿz{ÚòsWþ9^8*J+y]Ú,~Ö÷ÀËOÌ=Æ“VÏ~3¿7¿aê¤ÅúC¦›R’\ ÷~¹6Sƒ™÷ñ˜hîú–ÿ=ñå©ß|*¥¯7Èàæ ûyÒ`>ÛÔi£A8T’•Õj•Ö'µß©™Î+(C:ü•)çžž»g߂ͮwIŠÓÖ|øá÷iy!i$*-0 T[^j #ÓE'û£/#«‰`¥wbœ]*4äꄬYÿfˆ”¢++_µJš±@(ʹ'P/–n¢°©[ݳ_†ÈjµÂð!šb)ɹVÈú…x+¡€f Ã0U´û˜½ÿPýH,‹\.—¶K²ß,ÕÖ;Ys¸à–¬LŠ9ï/¼zêìÌ_Î1ÛD騢·¾;ZLƒû=:¸Ë¥ NQU]êt*Œ0¢"AˆSê”!*Š„""˜„òèxo÷ eÙ/f]ÝY@Ó)©úÙO8æy^R°G´ „Ì^ymc6õúÎCeM[ûiÉßoMYxJôþÞœ°94kÏc\ÝÑg&&&†a˜ŒŒ ½^ruu #„œ>}ZE‡¹IKÙ¶þÊZÞÌ-2˜Õµ}lZ¿ý3~Í/¿S±èò%¥(´ïÃÃúŠÿ^¾9½´†R”ò©8 ði€öœC“o×ÑÃbµ,å ¯ªü}eàŠ7«&ÛjZõˆ¤Ñ¥ŽlP-Ð@ˆ„ˆ„bŽemÚÅ·)­„R‚0Ë⦾8utŠM>äy^ZA(,,ìâÅ‹¡°°0I?Ô05YꎴMq´>TÅcq˜Ã­ëB`\Û=öt¯}oï(–ìë£EéK&=µ+ÜÝ|ÞX7;Æú÷ßÝŒ­yÿ.{é圌y"ï<{Åwi ‹¸Ù­I`¿—™$襉>PVÐR „"„0Âad7¢—O~7oÑž‹y¥"R¸DvòðÔó¾^ZtJTvœöÉSqj†¿¼nÖÿ¶äˆÇæ½r·Sz~çÚï~?röºUÙ±ÿCv ua-Ù7{ê’óÄgè[³‡Ó3‹_š³× kÿÂü§ã](Å!|míKc×c„‚G~4«ô‘@³”c‚ ìܹ³OŸ>,ËFDD”Û²cÇOOOŽãz#¶iÄû%Ôoà›ß‚`Ý;L|:UÍ”Ù)eÜïLêï%7^?âÔ«B”Ð&\ÃÖÖŒa×äÉó?ß;!PËŠV3Ô>‘~¬£¹&¶Ïö ¤ª±hiVaTѶ¯ý˜Á†ì\ç¢QbSqæ‰mŸ/ø5“×Äu £ˆêÏü—O0KNþ—#Ú%É[Á§¯{göªÝ'³ô<±ežÚþÍìw·]µP©+‚B¹‚ÅQ"B0'çTve̹ººiµ^ž®*9 šš§*@vk–Ø`Y!´}ûvBÇqÒÄ€íÛ·#„ì' T TÔÉiÂX<ôñ%?=FfØr!ÀzÞ=scWŠÊŽ©cî{nþÀ)Ô®¨†Á(ù­ ?•Éeà¼M÷R„–Å(òÑÅÛÇTäˆeîIÃ^˜7´üçcŒ1À!šVØë©~Ú¤”´Q€FˆÚ: lmaôc®ÇXK ¥yÏ›ýCzVÚyãý=ZwDÎ=œ7"Hyþp&¢4¸[’;ÎÿóÛmÙ¢(5ý¹þa%ÛÞþÝ… 6ž¹{R<¥ˆb„0”VÚ ”вS¾CfÎy H†0Ã"Áb…‘DЇ±„———­cQžžžÎ¾,Q}àP¥Ù¨„†­~ŒeíƒYG í¾dÿ®œ¼,À­«Ûöõ°Š|‡DÐÒpÐý‰Ÿ/þådaÙj{!c‰2Þ­»F ó®ÿ}$¯—ÿ?é"EÚy²æÓg2EŠ ÷÷ŽÑ±‚KÇî‘ߥŸ·\:SLÕa„QE,ÛKiøÃ)âáa@ó´;ÛÔH«ÕFFFÚ¯[šœœ|þüùââbg¹Ùë‡k’6Ã5ˆàΔÈn ²C…¥-Ë"”7¿¶êo>õÝg[NP@úÅ©2·®Ø~‰ L1fumºEâ‹ç3÷î=èÖ‚P@çd_–˜-wö /ˆDÒ˜RŠæ8„6Å2ƒË5e0F‹D¤0€š¹*`ÆáDáááÒ©ß~ûR*Í1?v옳5ˆPåɺ"UÓú£jƒˆì•€´’”´E—¹èÄf Ä’¬,¢8°Ç*‹šÙ IDAT°{»{›§ýðû%£d4°{Û~íH?tuóÊ«”Ò°~}YQ`½Zàç¬'7ï:x·_ñ¾])Bò hO7OŒ %§Ïä‹!jI`éÒ2µ› #Kþ©Ëâ«"¼€8ØÎš¯0¨îµK –PJwîÜ)i€ß~û­W¯^Ò”âJû­ j?ŽT4¦0p& ³Zbcеõ¯<öc¹C.Oœ4>Dƒ®”d®yeÆÞ Wó%)›~@víßYwdG@߯ƒ+ZÆ=å¡^¿Îù=çøš9Ï}‡¥1Á÷HÔ`béÖNó÷ž’Ìï_»Qͦ «#HŽâŽž´ž^øüøœ ê^Ã@U¬½¦гŠÌÛ-sÝ¢½÷ÐË‹Ã!ÓÉ5KþÁ¾.ÈkBH,Ø·dî×;ÿ˸VbF®)/-üx ‹ 8«iÕõ„¸€¦‘‚ Hš¸µ‚Àq\•Õê ÙrKç”U‘òÿÙyXTE‚l>”÷ Wgõõ•aÆÅ_ÍTªW–s«_™±Éeðø} ×|1o¸pr¢¼Õjåa Žà VSJÃ}>ríÛK6]è26ZÉмÝ_ý\|×Äç\Í-4!$ý÷ÇÞ‹žO6IG l+Ol]-Ü5h€&xÓ!+€f‚T!h €*hL”Á‘‘ÁrŒ0ÆÈj×êÓ–nÌŠ™ðõ„~>2Œâ} öÿaë…qIIÉÓ¿ù"†…@Á tYeU@­EEfFØñ‘1­_¶òȈÙTéWqðUß¾%ÿš BÒòûê¨Ôî©ñ. Œ—€f'A- Ä àÖb6›år¹T%¡4€¦òë0r2ˆèÎQ;VÚ|Þ™Ëf!kþ¸ ÊÚCBˆ2×D ÇÀ†²7Fò*J–˜‹ŒHêªh;¾ÇŠi+vfÅú-ß”“0nDœ«pÄ L"Bå †)ŸüÑâ+aÍ@M© !f³F,À-W2™ $pK„Aýàn‡Ÿ‡³JE‚”¦¼3>VY^ X奅-µW•þFªÔÊYìÖ~ÌÐÀ±ß.øÒuîþQO?—¯sAÆ|ƒ¥Öw ¸yrDQ4›Í¢(‚*€[« \\\X–µÍ9†2š9Í^° W92™D»Ý 0FT$!Î32PfÉÈ@~ýÂ\h,(‰©ØŒ”FH:èñ¤U³·å?þZ;7c¹FNKóŒ  êZªÒŸ0¯håi[ƒbÐL´:t ÍÅÍ»íUç)ß°sõú¸A4_ïÛéžhŸÊ;úçÁ+]B:<>Èï¹oÍbFjë§´ä]- í{o¬kéXƒ¨6Tíº –b3’¹(Œöê>iüàuEwߦ`0BœZÅXŠ‹­`Ünf…€† I@¬šƒ*IܯÃþCíÛ‚f¯ ]êSS}ðÍê÷ß°¨|RFÇv î9nÄî¹›ýÜ5er\ë'>úP·hɶUïm,•ºˆNOtéëŠ(DQ„ªXGŸ•X ¤TË%­àóÀ˯Òò©¬\­@ÙyAÁ@s•+€f¥ PS þ豃ú’ŠÀù¹£ð÷ Œ‹Ml{޾¬RÓ"Š"Ïóf³Ùh4êõúâââR£±mRR£ß%"¡ØnÁ J±[Aˆ’òÌ0Ã0K³Šm)(%¶)þ3 ƒ¥$ÒtXxŸjàpÚ»»ô²{ ”ˆ„2,‹=&é\µ'Ö‚=0©¦H•ÅjµšÍf³Ù\ZZª×ë¥ZS\\ìááÑ¥Kx߀›Š(Š‚ X,“ÉTXX˜šš ªn!ÿý·»»»J¥R(DZìÍ]åðÑ.*—èVqPòÍÞy¨øhØÙ÷þ{Ä]ëS›W®¸¸ØÍÍM«Õº¹¹i4F£R©”J¥\.ç8Žã8†aª®4cG³ˆ`¦J]ÁL¥„ªü‰®”ãêS ª%–|Õ‚«ö(Ÿ«ék@•²…y@Ó‹U˜m ·i)°&ATj,mÛæ.˜Ó|çÓ*îü…3MãEpPÜp3…4µ$ „X,( ¸åªÀRnŠÖ!Žã  ºó`¶ÉĨ‘ÜQÀGhn•± ª$ƘãÀ©» Õ~ü‹½×qÇîbÜT;žk£”¡³ýËlÅ ŽpS‘¢¢(J¸åHõQÒ7» À ¶Ÿºðò×ÉíÖè¼7Ôfƒ:ò13MãE€*O‚Â0ÄFTE‚yÀͯÈöÚ šözàf· fì/A)½ý,EÚÉê>B˜Áµì}P@P)էΜˆKdaöp½ü0Ò¾•6luRú|Óãõóç.\+vKìœàQyGo¢O?zäôÕR¯Ô>)>20³-êµUͪ™¸‘%×§=zúª¡æãÛ¾ƒâé58úMs!P-šV‘ÑçÓÏþ¹gEýÌ=²¶!ŠDxÞZ¶>©Éd6MF£ÑXjl×6ù¦Ü5ãÇEËþµ¨ºuŒwç* ë•m«7þkUuï}—7ºõQ bɽx>GàÂ6}ò&SA@3BL7/Û°·$ä¾§ÆöTR«!?§ˆñðT0væúdž›k|Sß`ìå¥ôæÍgŠ(iúä jC¹¡~¨ù   Z4'‹iÕÊ¡N˜´_ ÒþÒ¶- JJJj—áŸO_[~‘’ê½%¡#ßÚQçh‰²ð´£Bžºð™[/¾ÔóåWý]XÜäÉ[Ø; ªš o|stæCäßô3>q4ÓÜÃõø§³V=½2c@€7ª¹vì8²lL´®O˜"HË*-(4>U¸ýª(ÔõR¬¢W¯ 3×?.æI=n³ÉA4Uê^5p²¡ k˜m\‡|†ku‹Éb|XQJHCš¼&oQÂT4Ÿ‰ÝïùwÒÒ¹+ÃJoJyõ)‚X&ïßÓ·¯½tQÿëY^OY?o¥k½Ç5piXÙ¤!šF@ «öš»žù =E™O,šõåI+Š÷þÓ‰jŒ2Ÿß4ÿã.å ’küÂïºwø½wùÙÂφÃ+Þþ§Ð@Õ>Q<< ÉKîÈ|ˆú {~Ú°ë¿‹ù‚Ú;<¥ÿÐÁÉJ†/üòÕ²Ýy~½Ÿzâž•£4)Mÿkã†?_Ì31šON®d¨áüŸÖÿyâRu‰ï9txÏ ‹ ¯ûvóñ¬übU!ñ}Þ5X% û¹¾yΔ-!Ôjì;SÛ*rw/ùlË™<3áÔ>±]‡<Ü?®,RýŠÕ’'q×l\½õPzOåîm†N~²³7ÌŸ€X4+fŒŽw3¿ÿqçiQcNå#ÎÝòîô_0BCÞ˜ÖÝ·±Ìuµ¿Câ=ûxˆ{veoÊEéØE=FˆP„0í>8ZªFEæÝi»sˆˆbضí=ûÊ=U˜C´0ß´ópÁ¾‚2ã›èÿA"E¥ï»úùêÕÊkB¢ÒS†D‹pæ|Ñ'MÅÒe0ÖJ78Ú%Lƒ‰™ÿkoöÏ…’ûDèŒ×„» $ˆ'Òr–_à…©AR*€Ví˶ŒfË=f†e0B6æå[XµÌ¬/¾vzçÒ¯e~Ó—'4æË8Äë¯Ú±ôcë”Y#"TUó¶\Ú:îöl‘`…Š-É9³sŽâåÇÕùÇ+2’¢ƒ'‹{†¨ªw" Wûüã-úØ{‹Ô!ƒAí)ØÏüõ³O¶ãû „¯زþÓÏ-ÓŸ(ÇÄ”yúBW¿‡ Q–^?úûæï¾b}_{(†A!]·'Ƨzp˜Qz)Œ]#;ÓC£ Oïø~Ûò‚ÿ7.ѕŎ®ˆª&'¹;wPÙkĤxOÖP`òuã@”KXš‹UG”RJ¨T-+*&§V»°X®S:rÂêi®™*³eÊ‘œp-ÿ·œJã…(BáÀxßg˜“'Š–Ñ€pÝà^¾Šm×·RŠ™?…»¡äûCV‹ŒKj­~7Íþ¥à9ãæöxŠÆ|ºðë,(X•¾îƒšZ$U@ŠÈ‘¯/x7JM…GÏÛ|%ûÄ}ÿ`tVÓáé™E˲wþΆŒ‚¿?;`|›Ê5›[÷{ŽH|¼8u@—¿ç‹Ùë.üíä°øT¿®C,ðMMõràWÓÒ3?ÿ–åÞóùñƒ’XÁ•žþù÷k½^x¢°‚ÁI±Öw?Þ¶åL÷ñ „¢Jÿض­Ãä¸u¬wÁ©OÒg ‹B!…Ö7(ÈWVnà\Ú"„ Õfù`ÿ¹!AÃ\[ª&·^+4UdlbëHÁH¸JÚbÐLp¢Ò½ú>3c ¿ a†e0Ç\WYƒˆUp~2\ë]+”÷Æq…§³¿=aµPôß5«ü^¿^ Ê={LÉâ›gY,3pÑ÷¨Ûk /"„ÕÄgò|¹¾1šÒŠ¢ˆ>!~)>wÕJÊq²âÓÙËþ³ZB!Š(W5¹ÜS#rñºñL.!! CDk  (k% g·­X±ýlEeOÈTb¨¦\4È9†Qø·I úñÒe>'³DhãQ)>ïÜ5‘Rtý—¹3·b„(!”¢‚Ì"ê<=’@1f¡èâU‹*ªµœ©8Ï]̲ºTTøÄGª¶§gð j¦¼ƒ !Œ±Ì3Èÿ_*”uOUÚ4O(8ùû†_œÌ,´0JÆJ8ƒ…8¹by¦ÉåÁÝúŤ­ûüí+Éw÷êÑ59Äf!#AͲJ:rà†ul´êm®1Syä>Æ!‡CN¥ðciú5Á*Mׄ“¹´——BÇšJmŸ D)²ù"„Ýå{ ”ÿ“.  t¯‰Ñ± ‚DK™s4ýzyæ•öäÖ"ýŽëêû{\Òï>£?V@„ wÇ! fpSí+ª EÃóÖ½ï***•^/{(ªX R‰( ·añ¶3êÛiP÷VÊk;×ï¾êhæ-%¼@ELõõé¨`BH›Ø¥½·¼Ìð2ê(7c„ãÜS‘:[»Rëƒ*5­”œCDŠ —§\odÿ¹ðë_í‡<6$\K³ÿZ¾êhW¬’ÉzMšjÿŽ;–~¼c×€)Sú+aWLIE‚*€fS+©‚2ÛFE‘RêØ ¶™ë„.í}êb®«Œ -|žˆ¢<9â…jÖWõשÃŒ(!"Â=EÎUódW­òRѪ£=–uêä™$åÁ`¡!ÿswæiM÷8·1}ݺ¿þÕ ^g@¬h öøËÕUÛµsO(ŠzwQJ%= ­Lj±Xª­LªoØuDÃõkFJ‘ê½=;y“s§6ÿuÕT½ñÑŸÛ½÷"HîÆ"ÌÊY„9/ßB#”2/”vÍmû÷ Ó0TÐçé^‹Oü¾õp¾wêÀ­´Õº®8m°7·óüÉ\>2XQn•8]ˆŸì·ó§òøÈ ÆHÈ=yÁÈù†ºË0µW22ë-¤¼%´æž½*ŒÐ5Ñ“ÅD}AŽ:¿bõä!̪üâ{ŒŠë¼ö½OÿüëRQÑÊÝÓó  ªB**$æ4!kÁ…, RQD,Ë81×–:šëªŽ£Õºç2I×uõ0ÿ–_iÕ#ÁhÉÝÂýYY.±P„X.΋ô–"Q§]Ò¤TD E…ò¹)ý0¿é¸ád)¥˜„YhRyæ9Ä5–¹“ä!Jèõ«úµY†´”€‰ÑnAgò¡_lj&@ UÜ|ôú’.©Ý†¢hˆ* QÊ2 eÂ0,ð3vÿX™Y× 0 ºZrmÓ»s¸Z¯˜«,^jØóÙk o%"¡\ÄÀ~‘*ÏotäŠpzå{‹Uÿ{2þ®¡_°¯èÜÏŸÎØÌr ˆ,é©ÙZ˳v­ß´7 +ñÓûùU]ŻƾÛ냋¢þ]"=d–b‹_»ä€Øûzù¾»}É2ÅÀNèê?[~Íóéÿx¬º†_ʺGÉþ8øëŽð®´ØèѦ½{˜Ú¶këŸ.)‘¾ŠÂ\SWô«–\›¾ïõ Ð)„¼3YFªÔª ö #ˆ ù©©…(û[Ð>Böï˹oßx~½Œ(;Á­T,ætÑñÁ×Ï]Í1˜ÍH¡õN¾çþAwùÊ1B¬g—‡G^ûnË߬NÃa¬ˆ{३>›~ÚwúRv‰•°j¯ O–PÄx´nv`wžo»h­ÃûT„ ~nªæÇû¶,ùÝHžíˆnà|ïÓS•?nøsí—ETÔzÈ3Ãz‡(j¿Ã¸&ÙuŦ_—-â•­û‡µïÑóÉ‘Ek~ݺô!Ĺx„ûº0ØÙ=ª$¸rdÛ®óÅVDåºÐ¶<Ö+PïqÙk ªšQ3QÉjÛ?üøµ5›öœ»®7b'D„c®«5唘Lßm½~>Q×5P;<†á5è-ÇÏ`ѫdz?ç=îv§ÂÅ…¦-î*¬qJNÍß—êÞ§“·LN·¤)Y~ˆ}0^÷HF ¼aL½ôïõ/̃¢ÜÅXŽ1ý[,VI~2OѦµk¤ ƈü[M@!0ãž,jºý °ÃX³mÇVi¯V£Ñ¨×ë‹‹‹KƶIIàDÞ1ü²mãû„Ú@U`ÛÛØjµJ{—––––––”ãééÙ©S§Ú—3%¢´ž´mRJ µ CKsÕ¤yh‡1Ƙ±sÍËNÚ²¡Òö™´ò—¥oa†q>\Õ.aù…ío c¦bò%„Pd»sJDRþWÅÍJW«ü£*çâàŠ•“Kp’¶Ü·‘çy£ÑXPP››‹êÓ§Tm¸…lß¾Rêãã­uÓº¨Õr…’eʧ—Ù² ƒÚps}êÌñömSlÎØpM$eÝ+[RJ¥ý Ê×»Äe«˜e€1fËÿf,}!d›Ï,­z!MsÀö]½â¢ÔIr¦’ÅG¡†ûÃì°ê ú̬+!Aa74éû÷ï×ëõ®®®Z­ÖÍÍM£Ñ¨Õj•J¥T*år9ÇqDZ,[ÃF«+hÑ0 Ãq¸ TRí¢”Úª\•pAÅ:S5¾€1ƒY‡ßdز©|ÒñÂ5fQCB'·T%;ûŸâè~ØÚ_±jr¦ÁA˜;õ…$„À°@h”ûú ÃØºl*uÞ4¢¹vÖ”S*-á踓~a±ÒO°›@+çCq2‹ÉáE«$'Æ ÕÖ)h² ´-]@!Àçˆ@!@³Qàû· +hÙò7¶* ¬[{"hø£«m²RÃ)†äyÀlchnÓ¶eXn²K¿;Ôÿ¶+.>tëAs¼)kúÒç~òëSÆÚG—ˆ)ëøÁ2 "<Ò:=þFð×v­ùþ×3z[—×p €FrA oš„&Vé¶!ã,sûýÒbTÉßòüà¾Ýc÷oò¯yRzûx¹Ôaþ åŠ·Þüê@¡H_¥ßÓËþÕÛ‰ ãá׆ž¸éß²[ÏJo)ÞóÖ.}§mÉ©ðÛ-ç–<Ô³Ïøõ™ÖZTåiKµ=@Ã%j¶k‘¢7}³ä,k31BÞ}óË͸±ðІ¥ßîÏohÈM½ÉÛúñÝVªÀV1›X  êÁ­AD©HÄÀ¯OJÒ”ÅXM¨+—œñþ‡rjÈ‹8Ÿô"áÂ3?ðùâ÷+Ê—F!¢ØâgºTŠ0ÚÔ'ŸHÜõÉÂÕ§ºOIÐ0‘ü?®½ä7|IÿÄõàvõdd^8vòÏóÈ‘tç8Ù=]jÔ®õup‹ýôã¶äΣ»û£æ°¼)>ñ×Þ´n#ˆ³ fBÄ”uòx¦&.9LS·‰íÂõ=ë×½·×=¹¦¿IkúÒ—^Û›ð¿ùãb]k@†³Çw3®uÇ©‚&“ …òbÆ…ˆð(VbhÞ}7öÝ8¡Êª'!W23T*—¦‘Í`^[XB›$wÛ.}ckÆÒÉS¶%°ì©%-:°òóåžÈÈÖ[‘ºý”Oßé«»úÛן¬Úu2ÏB>&¼ýZÿ9B¡ËË'XBm^YýQW·J6Ê3Á+í‹×¿ ™?6^SÕxñ™?½óÊŠ£×Œ¢Ì-¨ýÀ'Ÿ•ìÅa$æîúâãåûÓ³ V¤òOê7¼sdûÎCéEÈ=m鯬˜ _Oèç#Ã(Þ·`ÿø¶^—””<ý›ì¶sj–oZµ5ˆMâøéýw¾´àµw«¦ ±­«|3 4½0¨·*¨aOCŽ“qœìÆ-ŠG˜ÞšöÛ?Y­{+Ty8¼,¤û¸Üù¬=ß/?‹ Zül;µ¾æ•W:Œÿz“þûŠ…Ó_5/˜;&BÞ9šÛñßÙbíÃX¯=eòg”òÓaóŃÅбqnÕz\ʪ«tÕ)©!× "ä8–ÛV*=‡áb„PÕ´“Ü4ÖãK¦Ïú™¤Žœ0&RžrǪ3È¥F{q3o2¿"ØŽ¬¯KÁð€Q/<ÛJ¥¿ü×ÚÒI(Øä,ïàñÉìû†ó‡Ž]ó9ub”ʘypóšO¦žÓñþC¡J!Óiž-D€]@Ôu`t\lù¼‚ZxPò°áo}ÓáðöõëÖ½;uÝÆ1¼?2ÊEj|nT÷°É*[ïˆk«Î=ScU jç{íà {veLH ùoÙÚK>Ã>yut”ŠÁ]’Ã,§®Yyt𬎮1ÝZ±Ÿý}¾t€·¦àÄÑ\Ìðg^¶tÔ²Wœ0ßׯÝÁˆC› ¹—Žþüõ®by›žJd8ì8–go—œ‡‹+‡ ©þÃÜïü5Çä‚WS2%ûfìLKsþˆnêM"kE±P}š³âÕ")Þ¾KJ¬§´È9üâž]âÓh|õÇ×6ŠV‘¤.¡É]ScULÇ΢™§^]µòøÀW“åz§y¶úÂUPêØIŒ9uH‡!ÏÝÕ»ûç“§oúùì©IœÂUŽŒE&±†µ¤¶-°ÿKÿ?™Q$’µ\MKÃ'ØÉâë 7ôWJÐ32PfÉÈ@~ýÂn»)WΊ½l–GyQÊ}⫎È2'µrÁY3÷ÓËCâ|XîÛ:L±êÈÞ cÛxMåÜä>NO™¯:'DM}âþ®þ2,ºý«Å» .@ƒià"Îù"N&çXY-²‘÷™º¨Ë¨ÿöþþËæÕ¯þ¼:ñá×ßëjgr0Æ ŸHo¼-»DàsN]´¸&¦*c„”AÔß8cíè¦kÝ-TXµ÷¢¹Cè‰}Ù᎒mÜu0Ë+O;Tè“ÚγêÝœøðÁû>’J îúÔœÉÝ=9!ÃI,7Î>eMábû´³È°Us.Óªm×ÎO!ý ì¼%¸ù7Y)M®óâeÊ»oÂ+|Ëžˆ¢½Óh|õÇç¬UÁ³šè»ã•?Ÿ?“Ç'‡EÖç¯ l ª ñá³ÿÞ|ˆ„„{©øëG3 ÄÅSÍ`Äy'DÊ7ì\½>nPÍ×ûvºÇéÊœÿ=ÏNÜ5ñ“´2‹*÷õGk6®úɵW|*÷jiÝî‡Ñux|ßsߚŌÔÖOiÉ»ZÚ÷ÞX×Ò#Í ¢Zîb†ÝR&>úØÊ™³UOÞ…Ïm]¼üjðã³S´c·»&tÙËÓȸƒ5¦†²u k8¥ðÄË×.ÝàÖ71X•sÅöÙ©»*Õ8‚ˆ“ɸZMxà §öoÛgLRï¡÷¯œ6uÕ':Ï4°RǬB†DžÒ²UP«Å!¢ˆõNéðÕ–½é–?.꺌¿ÛíðúÍG³ûÈödj“»)ªÞiø˜9S’5–Ó«ßYxijM§H7#«ÓXnaE›â<\\5í,·l#‡qÑj4ÁM:x"ŽŠ·ÊWlODê0ïäñÕè^ÈX„D‘"¤táo3”!P€*¸¹…çv·ñ¿| ¥J¯è®OÏ¡ÀëRŸš2èƒoV¿ÿ†Eå“2:¶{œÖé ~ί߳c·MXd–TAè°YÏæÍ[ýí»;¬!™Æ§uPÖ¡Sµ~â£u‹–l[õÞÆQ©‹èôD—~±®ˆŠ‚(ŠÍÚÔ:D£Œ~â“ÏÔ >[?oZõŽî0ùÓ)£bT F)[=6o‘váçë–½±¾ˆgU:Ÿ„ž®\§¸ð‡Þy1÷ƒeK_ßfFÉ\}‚]a"h Y™TÆÉY†uª –åê0KÝÅ©Iîßo;—+Ð'õŽ ‘¯=~øš5!R‰1â¯<¡—G{Ë1F²Àî}B×ü´y[ÎI—”1¾ên~‹vnß‚.yõx:¼š(@.þQ­¢ÜÙÈ—ffNzuá»›ZÏ}0\î,–kE#*TC¸˜­‚v¦46T¾öß—͉±7X2áæßdåâ‘ÿà¸xçÎA4¾xמ.•DzÊFUϳe,.Ñ* -L0^çmº·ú*=òÐÇ—üô˜tÜþ³äƒÇ<òñ²‡i¹ùbÊcµŠ€Ïͽ{ŠÔñÄØ-”æè*²ÀÁŸþ4¨ü˜*üÞgçõ{†¢Ê™V¾´ºÃÛ¿n.ÿCúè×?)ÿ sîmxiþˆ²Š¥ËË’_\¼FšÐ{Û©Mêû»wQ†­pÔ1ë™Ú?¥ÿ¾bMVÐè—“Ý$/Ü¿ë ð埯>è=üáP¹LÖ¥WÀ²eëˆïÃÓBçˆ1ÆŒ¶ÍØÿ ;2eż ßê8–ëÆjüÜPÞÑ?^ ìà,\ì í$7×vO<:qõ3É#÷'ªÍ§/×ÿ¼Ù7IkY¼Žùì¿9\-_k ö®YÒ+Á‹¿°ãÛ5W=ï¾­–ÁŽ#ü-˜W€*¨‹WÊ8Ü‚3«÷Ø.oïÛWí›5]¥Ò1ŒÌÞ(ÃʹTÉ;Hêô~š¿*p\dÎ ÞiÖtª†$@ã ê/¤=sÕà•Ú'ŧj//)Í:{&ãj©ç]£µ¦¹S$jØ~&³ÑE¥vìî[ÌsÃö‚ˆŒVS´gý×ë ,É\ýczM~û±þ~2Ì;{ÇQcæ|ä²háO_¼–G½"ï÷Þ„­”å›ÝûvûÅü‚^݃3¾û…/ýJèÛ;PQ“WɨbGM¹o׫ß~µ»×Û}ZuËu“ùô7b÷ÜÍ‹~îš2ièkÏæ}Z=\ì ê02ìÆ*"G½û©ÛÒ¯7­~oS1Ï)µ^­»…©k²p7ï&#í‡ÕX¼ŽpçkÝ×§0^;ÿ‡\¢ Ix൧k­f0²8̳Ũ‚&Û¯Á-tø¦J/Qyž7›ÍF£Q¯×—m“’`¥Å;†#ÇþéÖ¹'<Ðz;a¶š"U«Õj±XL&Sii©Á`jMII‰N§ëÔ©Sc•35]øiѲ]…Aƒ&<Þ+@á4SóÉ/g~ý¯UÕuêë£"ªzQ¥Ç>ŸþÍYâÞû•Wî VÀp'8f³¹¨¨(+++===$$¤oß¾uzåŒæÒC¡3E1ör÷»ñ2D”ûñqEJ±Û¿…‘Øþ¢”Pi}·ÊqHÛmáÇJɪ~Ëþ8%"¡¸ìˆýMU„2¥Mg1Ã2¸âP•›6¦-ëæ)û%s«òÓ1ÆÕööjª›D•‹ÚYñ:y"eÇkùøìŽ[3¾yêé­É.›£Ä•K€:ÌóÎgûöí:N¥RÕr.Ôýû÷ëõzWWW­Vëææ¦ÑhÔjµJ¥R*•r¹œã8ŽãX–ÅÎòç  ™ÂgýôÞ‡¿æVîL« S£Ò.”˜È‰#™æþŠ:ú‰äg ꬋP„EDÁ£Të=\ÁE©vQªÜÑäÌã«;­M´¶ú‘óHq•ãÕòÇŽnµü;ÎoÀAÈ×ÙOÄ7rv›ì&«üY«`xÅÍ8,cç_®Ìg¦šl«!ÐÜä:D €ÛP-|ÛîÖÜʰ:¨Á sKƒÄ훬”s^--öOmãÊÀ£9"PÐL„:¨Tp;Ù,ˆiÞ$U€o°Ûvmñ¹÷å™ýýʇn`†?ýÕÚíÿZ]ÌQ­GE(0Ñ_ØóÓ†]ÿ]ÌÔÞá)ý‡NP:z¤ÔrmÿÆuÛÒÒ³Kå:­µb0‹OüöÝO{O\ÓóŒ\˜Ÿ~öÏ=; (ê§ PùHnQE‘Ï[y«Õj6›M&³Ñh2ÆRc»¶É ¹PÎÖ÷žûµÌM÷î÷ÒÌ^ÝN´äغßsDâ;àÅ©B¸ü=_Ì^wñào'‡Å§ºWÎD,8´õ_¡êO¼ôH’›ñЂW¾½( 4 ×ryBhÐð©SzûÊ©(b9t÷¨ å<~NÓª5”C½UýD‚ HkvIËv•––êõz½^_RRÒà+ÙæÈdl¥ÐŸ{îšH)ºþËÜ™[±ôMŠ 2‹ª«œ_p9RªˆJÕÉXF¦¬¨û¬WëD¯ßvæ^ýñÝ7µëÚ·_ïvðxTÐ’€©ÆR†7iF„ý¼Ì0Œ¥ÈvŠˆV!„´ ]ÚûÈˮǨ£Üت{—–ÝŠ(Õ¸bEøðžóýõ×ß÷¾|tÛ’£ÇûO›z_ˆâª€æ#;*Ï+°Cîî…Ò® £Å£mÿ^a† ú<½Â˃ÃHdå,BÈœ—o¡JÎ3¹,œýýŸk1Ý+Ç£ ê6|b×é>X°#/óð‰ü{CäPòª€æã•2´óŽûŠÎýüöÎ;>Š¢ãÏìîõKï½÷@B Ez¯‚JS)/¢((Ũ¨`AA± 4)J&RCï5@vÉåÊîÌûÇÝ%wÉ]ÂæûÉ’ÙÝÙ™Ùç7å™o¦lb9óX”ð¿FÇÊçêdzø‹¿ÏZ,û`d\ãþ-·ÏÝWöç6HÄ‚¦Ü‘>{ˬ¹ûKåÎÎR]Þ]L€óðUÐeƒ …B¡<]FÍ ¥ƒ1ÏOß7)ÌSÉb½Ž™«¿‹ °n-‡ lìÄ‚ØYÉ!¤ˆì÷öø¾I!î F_¦ÁHâàã¯`&Ro ¯º{ûŽŠuðoÜsôK ©_R …B¡Pž*èX…b¯ˆ|zMýº'¨4}Hóê—_dð Î9F¶òv;“Gl„bHê—\ðˆ®Nû˜(åHùÍ ¥^|A0Á4(¶À€@&QUð´«š õ÷‹B3RI£1èZ6(”ú!æi&Pª/"uL=WBÁÑõë.úöØÜC¶ƒ„Üÿ~^œêûâøÚ½jBTÔëï ý¢P,TQP(”zaðÑÊJ±3ÝXT.ý—IS÷Ç0oD´œ±4êù[ûÖ®=Ñ­ýóÍÝ*?‰y.:·wÿÉÖÏaB€Î–1ƒŽÔk+.S£X·0ž SCÏëOŸ9_˜Oß0å±T›U;+!Y”žþÂÇi­§?¹©“Ùî­úŒ•þ÷;ýÃÜþ~"„¤Þ¾¾îr«5UÓ3fTó4|÷ï·‡ÏÓõûrÖÐ&¢>6uÈG¹ÃÍïí#z‚,1º¢€¶”'F%š{Ê}bžëÄ©AA­[µ¦å±W±#ÇÜ̹éëã[‹iÒŒ¥Ø´Ð=mc‚*'_'nÿ~}ÿï_Š[}|wïÂ?2xÞ=¯HäÛcÊçÝສû毮zÿ Ït3M9" ~Ò*0+¨¿`‚©D©(€ ?OØ‚ã¢â¢ À =¯§öå±.Æ7 ]ú§0Ç·í:š^.!ÉϽ>¡w¤ƒá2Ön€Q›3ñ« MÞŸ3ªê™¥u»>·t°€baa<¡K !SW-”Ç-¼1R›ÍúRU·É~¾}´˜c²rK¶JïØØ§6»Õ…ÿv_óx¦s¼Se3¬š ¼VÁ‰õëÏztØÊKô¨¯U;&Úc·«XPå–BPï׺Èüöw†Ž|wÿÏ[Š ÜD¡/PóÆÊ#¤ìÌO“§ý‘îÝeôÔ÷^í/Ö”,ª ²@›¶üÝ)+ïÄ¿8å˯¶c÷Îöóé¡RÎ3~½¦Mi£Z;sî¾»|å·Â:Çuñö‡_ÍúpBWçÓ+>ÿîH‘@„ÒôgïøõôñGïáqiÝü…Ä)C&½?yDcÝž?[’¦Å¤š :N§¯Ó+¨×¦’q*9 ÷Ïžøæç›®”bR~°ì⢉gíÎã1TœIž’Ÿ'ZóP(…Ú­Yõå©yA`X¸”U `¬Õ „Ôêóy'wþ{8S-ÜWPUtÙ¿œöÉ_eÕœ-”\=qúÒ-Æw­:.uOÑXÑi¥_“/D]¾òdŸ÷’ä×6ýqÊ¡óÜÖ»VásZl)\pÑÑß·Þñ8ÿ½!ÁRA¯k»Nž¼WÅ5U'Yw3jô£»xŠÄyå§ŽZµåꈄ¹EbÝ’Ç~øÜÛæÎI ŸÞÃÙ–V†6o QnÙ{^ßvê¶¾¹ „ȃ%7Ž–¢>wö\ЩwçfJ5”žÚûÑÑ·õQAb›7ÐdòÏ«0,SwB•ú ªßªÀüOŒ…ì —¸L‘bì!cŒ1P¯4O×XÁ§ ¨c%Š}¶º\ýðDÀZ­PR¦0&@€ÔÈJÁÅG|²ò’wï©ãZ{Ú^‘i¬Þ¤fA¤pÿÜOþ¸n±ÑCà€©o5;»¹{8I°«ÄlS—*PÍm<9EÎÞUÖª‰4P.ñnûr«SWì¹á¹|snÌK½#ÂI)-P –·ÈßMËÖ95jä-a„PÅ äj‚ÌÑç]ÊÔð7çè>Ê-'inye™‘Ǿøîˆ3ã¿ûrcÜÔ@ó4îY½hùö£é¹eŒœÕ`Q±F°ò„Ä®A.HWX¨„’º8Ã…|5&¤šà¶®‡ŠưmîN\¡òl¬ô;<²iZˆ ‡S˜SÚŸ‹7{ï"GÈxÐÐáÎÞ_n¾”§!œÂ#ªUX¸ðøÚå[ÎæÜ-Öð qHjÛ€¹tèø…*äè×î¹ÏñÅ—w¯[·÷b¶Šq lØå¹^Éþ2ª)í¶7ª å‘´ºöà#±ÔÖéù’2=Ác@ k#Ÿs`ÇE½®ïÚ•Õìù©Obú†UMÖzÁ{¶¥_„Ü8ׇ‘y+×âå±)À0èÞ·Wók=…³í¯õKƒ'÷ #¤ÏÚ¶ð»=ÒÖ½_ì몹¸}íÊEÈý~á † J;´W­© OoZÜ©óàg|Ä•^?ÿHv†¡[ÀRì¢÷"¨vë¬}ÊÝmGoî8zCÏ 0! Š4Z¾T­L$;î« ŸA—äàž­B¬úÈ&š«;öæ÷y%áèâ-Û.t™àX>aŸ/<óÏŸ¾|SŹxC a æ8~å.Ý IDAT©6ÈÔȽCÃÃ*V ÐßÜüùœÔ˜×>x6PŒn,R‘ñPƒkÙC©#uý}¼3ˆ4Å*Ä8 ËàøÕŸïºë7xRC%ƒX!†Ò»jÁ2†È#:H¼úô¡LMƒhË?ÕB@ œ[˜ŸH{íxw ¶îë´ÒýºNspÔ¼_Õ6LÒÞ8™.„¼úbo çaï}åø}ÞÀ£-pt” ~›¤Ân"À8Æ÷}¥ý·óþXá?¼…²|°€©ol¢ÁŸ^ Óí“_¹|W£B‘x‡ÇFKP¨[þéÏwy6kÕ,FΠÉ•“?_¼t—ôæÔ—7ïÎ ê;¥wsAˆKáÙY»f÷‹Ò-ìG%ÖÑ@_xtýš­Mšhí]yû—G³3LಛçÏÞPÆ6V°uROZÝZ®³`Ÿª »E¼¿XÌ"£&‡k9Å%eZžoÞ H$f ƹZ£Û²ÿr÷ÁÖz‰êÜîS$nX“Ð@—Ø–ì>–ׯƒC@´éë¿]¼ÄuêÛÙ_Tœ~tÛu¿S¶ƒ,»À€cløü Ä0@€`ŒÂ[ÝXbRÑ¢ÔäZO%w‘¶XœLÌÆ­Õˆ¡§×µè(a'—1ºâb]¥¡‡F¯<4fù‡ïã—ú4ñSh.f–?Õ«ôv„¼ÿÉòk˜4¬§÷›ëfLc÷Lô–jónuîíhsÙ9çÓqܘÝcæœ4*±W´¬X·lƒCû8YîÒû{hÆÙú 8”¯{Dt¬ ^[=4¦’N@ÔùÅWçý¹l_ð0oc¾àüîõÛ_¼Q¤c$Œs¥:\Ñ-‚€@œƒ—èKJ ëëÅžJ¸¦Ò˜‚ÌÛ:!oÕ̉«‘©QÅâ­@¤}öc¯<ØjcáÖ_ãGµª—ŸðñK¾êáamã궉y4‚Çf°þîñu¿­Üuærf¾†•{E4jÿÂð!Iî÷=úª¹úûŒOÓúÍû.Pþ ðCF§Ø=Pí–n»§×ñ:^8|ñ–aY&Ø0­FüáK·„ šßQ!Ñ™WiUîý÷ª¬ÑÿÂdŒ$²ucÅÂ=©9)=üňêâÖÔB·Žã‡vö3‘.9GÓÒBp‰Í b©¥àÚŠé“W8µÿNï`*¦Ì–ÚèÆ &åÌ]ë‰+rö¯ t%:(DËTÞwÂÛåËX±\w Ô¸YÄ‘„ šùã/?®_>k}‘ž“:¹Ç¶6öÍØb=ÛxnÏ×›~ØØªÙؘØW¾úÒù‡ŸþY6k]± uMy¥e—hÇjºw8ï.ã†ÿ3úAõ›6.oîò¥3wê€Hé민WV2«7àDàA¨Ó@Ç êµ*¨Ò‡Eà¼Ú ìyþë+öu‘{UŸ»ï§_¶kõÒ+ÈÜ9¸tÕ)€ŠuÈÆµÀŠXzCw –c€ð†Öš@óüÈžA’r)vV°t{*å éîï­0n-ÇÍðWñºk~µðbüØ·{HbBíÂG_5Æ)K[úÎ{+®H£:vy©o +];¾@û@Ö!ìŸ*ÔRtwíû ²Ïe‘‹YJ¹q)H«4zA&æ$b–1­—Ó Äj7ëȾ×”~b hÕÜõ@jjfûþá2$eÝÑ+¢"]MËMVj‚*}êÀ»Ó¨þƬ"G_A…;Jàmtcá Š~“]Ëþ>ôOº*P4û|ý† §;™u±H§ü±Í4ì§ /›ÎC¬Sl¯7¾îiÊ+„iƒ3ÛAŒs£a³— %ˆaŒKâó“æ=gê&EŒÅiŒ{¹ë»YúùõþfCOÓ1YH·qs»¼NÊkƒ„@lqŸŠ¤O¶n2ý!úã†Ë³v¢&o/^aXLUåþ‹òå4˜÷fƒzŸýrí &>!ºÛWrŸ>›Ç¸±H_“Ã)B—«cD‚ÍæÓ`+&ŒƒŸ«»•C\šyJͦ½QûǾTÁƒÍ B"ψ†Ù^ \óŽiÔ8FŠø?z©êÆ,Ptì§·^ɸrGpJèúòk/5÷WmKllÌòõį.ÞÏ ¨Í‡"šK+殸âÚcƬ‘ Ž"„à™Ý b D(>·ñ§ÅŽ\ºMûŒÙ'Ö‘EBÞž…s—¾~;¿TäÍ^xud×0Kdþ6®Ïïâ§,™ÕR–³iÖÔ¥'o©1çàרÇð742쪸䦟~Úxôâ­RÆ)¢÷ûÓ_ ®½…(kÇ/óWì¹§%䑾ÓÅGL[\»!'çæýû5jjþ)ÌHO?~ühJJ _?‹nLÀµ<ÉÛ^}uhì»ýp/ú„ˆ˜ãži}&#O)—\OÏTk´†:É2¨[‹0°âÏG›¹ÿHžP¼å«¶·0)Ù“Þ-$FA!À<ÓÊ8£çB ¦¹­ KY u r`Ì “!„`¡J7;+XP•wŸ‘]ëñ ѧLbX¶aˆ±t΃Íùø6ƒÅµªIÁÆmU‰ÎZ‹g~Ÿ–©TJÓÚ T~Lª (5U&Ÿj&ó‰qiÚ¯×ɯ×\ Ç8×WصwûYã`IáM… f‰¹FÊeAʨ®-\çïýíÔ!9ÜU¢/ÎS{5M ³´üØ*€76¦ÿŒ¿6féã¬î_3Åçß…ÿøA²³¡‘âË$ Œ즽¼sùŠ'k¿únLL%7nÚ´åïNY/ï=jʯ’#+ÌÆø-›DŸ³ØT¥þÜzCÔtò€x£$0=!D—±rê”%M¼ò~(ÊØ¹|ñ;ÓÊæÎ*ABiƉó¹>Ï¿16\V’u`õ²ï>dý¾Ú!À£Ç¤w;z‰’yË §ØN/ïá¢ÀwN¬û~åì…aßMIrb‘þÚêi“–$öqJ¬9xŠ ™n]¸ñ×ÌowËúŽšÖÌ›+º]àÄQmO „Ôjõþý{ !å #=ýÀ}cÄ0•ßVmo)e·«»&ùwnêWþçsvË¥"‰D,s¥ešo'v(ï352•®5{Oª<Ú½<(ÞÑx")>µâ·½û/«"½¸ÝWÎÝÒ†JU,ŽÂÙ2[ml60nœCKŠn,BG?OVw+\“¼¤fVáKL !lM®õTBgS(õÔ ´Xm\® ŒMãÜìÙ.Gfo2L¦à<[ íW¸fçöeÇôÀÉœƒÜe¨|Ñi ‘É]sŦ4ÅAÝÇŒQnÚ|dÇò½j,QúÄv‹k c¨cwª ö–0ÚÞ˜À­åà—{EËÔ2)ÿ×ÊSƒ§'›oëBjoc[ª@(º~]M¼âü•L»¤äÔok3Ýû~>q@¨ŒAɉÚ×§¬^zªÇûM &„È’›DIQãï;'¦¤î¾¦‰ uñ ñ!ƒ¶ypÓVÁq‘®Ù{ßÚyê–®©ƒD}jÉê ÷>³Þ&3ŽS#(«]{=·Ë£›5ŽU2µBKªÝàéé•Ò¢åÁûØG€„„„^»–qðÀ~ŒqrJ OO¯J¯ áG°®Àþ 0Æ ›:Ìq¬H,‹9À˜×ë°amƒX ±\ HJ¯°Þ]'ÒãÙ¬2¼íón,Ä! ˆèúê{ {ÝÞëZý] Çp+TPc‚Pÿ¤H˜ËƒGñâè^ “Åìçá¬áÆ,¤,}ÿyµ$,Ü]À?øÎ0÷0S¬nO)‹éñŒÓáË7õ‰z!ÜÂÞæ\ÃEëÎÏÑÆ„J€>çèùR‘_¸K@0­ÁÁ„Tü‹ÄJ ””ñæšì3ׄ /tjêÅ!AäL8—P_vÃùã7µ1¡ÒŠõ •£0rÿÆ=Æ$¶iùÃÛÓ6m½ÒãÕx* ìQ#„²²2ýý‚‚‚mM-Ç×îtûôAdˆEœˆxA’¢ÿܸ0Ã2Iœˆ•J¤Ë!±,‹ªü†è*f8 ãÕ–½fÄülU—¾¡SËf:ﳬ&·a­:U”:E&U\¸t..¦ËÒw°§ÇƘa†aÁ¥T¨BgðPÊM– ¿˜µS0ªß˜¥4óä¡ce²²G7þ¾./øå*T“aJך"74ªÝ‰¯–O™r¥WÇf¾ÎLÉíŒË9¾½†·i8¤·ß[~õµd`Ç ¸¶{åÚßç&4PV˜b¤ÂÕ–að€u‹ oüoõº¨®Á$¿Ä£YK/X»é-Š6ѾҼjSµsLÜÝkÊ_³fâç:ÆxH4eþ)­*GoåziûIìè*Óß9YŠå.r†±Ù)A†¶ÚÖ+ªýéöº²•A âa ‹YŒqǦþ-ãË&ˆAR©T.“K$ãB¨.Ç(õª žj"Â"¯¤_þoßNšØÓctSŽAÌóz½N¯Óé4MY™F­.S«ÕêRu£Ä&âêˆPÌ,ŒÜÅÌ–*°µ1 «IŒq;¸ú³iAää™2nΰî!2j´3Œ|Ÿ³T3Ñ‚qnòÚœ™ñ+Wm9²qáÆbDN¾‘I=yžˆ‚_˜:C¶ä×-‹?½ ®! /~8¬w¨UôÏZºÚ"„ ǦÃGwþfÙš9³tR÷Fχ·ìÙcÒè¼ï׬úú?ˆîQ> @ˆ4bÈG;.ùmûʯ֕©W‹qÉ•¢7‰¾r`Í–ówµ$náÍGNè(¢öS=hÒ«³ákUØ­"ƒBaK¥R–cx%‚±+âDˆA bj’i”‡| á¢ÖWqBA¯×k4µZ­R©ŠŠŠJÕêÄ„: ýéi)÷4V 5Ežç õÅPeJKKU*•J¥*..öòòJII©ÅŠ“ššEk"¥Œ±F£)*,º™s3###>6¾sçÎ÷[B°qWC ǤbcÓÆ,ck‡MqpEÄl[/ÓÎ0c\óY¶ÿ»½UJ+=¯¯ö¶1óÉÁƴ˯n˜V\1• ¤â°É%ÁÆuf7KÌVæ˜Ýµa’ÅÉ•¢CEöUºJ}Ä`_J»Ô8¡q kÖ¶mÛŽ?.‘H:uêäêê*“ÉÊçë:z(¡A‚Ž×Õ ˜¯NC€¨Oóº*rÀ „®g]‰Œ©až§¦¦ªT*'''GGG¥R©P(d2™T*‹ÅÇqg˜÷ek"+xêÅ(­Þµ‘‡u¹¢ ¼Ÿ‰N ¢TÖ¨7³Ìʶ*¬ÕÓl{º÷Î0÷½1˽e"‹uð+쑵åñ–‹ê‘Ù¢z³ĸ­²ºF,g$[‹^ùñiL=ÞPûë êG™¨"hQ®£V ¸./JU…R/Ñj´4(& ÆF«Õêt:½^ÿ$}¶ëñDyÒAaŒk±`ÓžÊ=°@U…B¹‘á‘4(檠¬¬,??Ÿc8Zó$B0ÁôS/ 0‘ê'³Q(µÙô•oÍFU…B¹'töż0ÔÁ¼µÇ( è+¦<~€u'¹– &´lSªoÕ1Áuì"’ª …B¡Ø/†9Ôx¢_±Pxéè¥B5.8”YÚÅOLK!…B¡P(TP ÃpGUÁCªÃX!Ä\ ˜<ÒÛÐéµJ…ÒêKT*¬Ž!ØKëãÝvôýáB¿Öœi¤P( …ªÊãT4(¤$m×ê•ÛO\¹­Uø„7ë6`@Ë9*Þÿ夅xiÒÛsÇÄ*pcÃôw×ÝüΞÖÑ›)IÛ¹jÙ¶ãWòôJψ–}=—ì'CøÜkWm?q5;·P-€Ô·q ñÉÝ×±•D&y­û}Ó ­RÝ`D¸ ˆÊJ‚P´gæÄÓ°ò™w¾!ºµåýÖæ„úfJsçÒßÿá‚àÐþý™ÃÃeTWP( …BUåAˆª Ñ^]ýÙÇ›sŒ €îƹí‹?ºªúxZ7ŸØ¡pîbÉÅã7µ±áâ¢óÇsAðO‰wcukg}¼é¦€A*g‹nÛ²pf¡ä³±œXý­;Ž]Ö ˜pb–W ~IϨþ]rÉJ"\.Á˜·Òfüi5AǨÆ>øRVá•ôB>\~ýÌM^à3Ïäh›ËrÎgñ‚ hâ+¥Þý(J=‚ø´+iŪbš”j ôñò¡ªà~Àe7ÏŸÍVÆ4 V²´Ý'v:V MûaÜä= Ÿ,z5VÁPs¯Fœ;öø‰c`æ›ÒÑÑ©w¯¾5…‡—mͰ8æ…ñ¯u *Þ1{ꪫé­=×z\B\«HöÒ…‚ÓGoëB/¥^'„ø·Jtg /Ý|SÀÞÏNÿ o0—·ë«ÉKÓn:58¡µ›qn•C»÷>%BŠy©=¢–^®šyõ¸ð¨­]4õ^™}óæ™Ì²Vòã×0(M;—§qºtED™,£¢€B¡Ô'.]¾äííÝ(±¢­ÅÖ§ȹ‹çrórër˂Ǫ ðÝ¿ßþ ÷ö³žqa´bh¯þ6ããËý, RVNßýûíáótý¾œ5´ƒÉºT›:ä£Üa‹æ÷ö=õ•Ñb2:.Ú÷éËSö†¿·tVwOí󟆎^éøú/ßõó¯»Õ ŒÌÓ×ÏÏCÎÒI!5&6&.6&®º÷[Mº}1K DÛ³m”‹„qnÙ.tuzš6ób¾.1 î™pæâ¥;GOÜéèµÿ &Ä¿EcwNŸq1[ rÖÍ·Æ„ÀÝëúÖ®åg–a9 €Øz"ˆ¯¸ÝÛ z&6u[¿17óLf–(MCXðwN]ÉñÓæõFˆŽ< À»ÿŠhžˆ))B0rnøL${éBÎÁ=ÿ9]æ¶jìÉ!ž×òN‰mš{KŒ½]Œ"ʉs[ßtsÖ³3I5 Š|›7rÚ´½àôžÝ(Ÿôîë¼å‹ûþÛ“)ˆl©¤å„B¡Ô;!˜`š[`À@ ŽG“ìs‘>{çïþv"G-ˆý÷9aPwÑ\Ûöãœe»Ïçi‰Ä3eô'S»úŠ sɘî¿!høîò¯Z9ZX nñî'L_8ox\óÁÆ…„ÜÝ f/IM¿] ÖÌ'¡Kÿæø¶]GÓ Á%$ù¹×'ôŽt0 Lè NüµhÑú#W ¨VƒÇŽì¦`TÇæLüêB“÷猊³sƒ¥’)Éùt™0xí°eßÿÝî "õÙeß‘t5 JÎ \tjÍ·ó×8›xF§¼ðÚ¸ œY@ÊÒ7/˜õËŽ³¹"õjýÚìOzù‰ÁÚA¤Ïüsê„ÅGsJÎ)°Yß±ï Mòàù~úúÇ]g®åkÀ¡Ù¤E³;•ý2|Ô¦æóVŽ‹•3¼XwvÌýtñôœ¼RzE§ 0®éµPî ‰W”sð²îüæ=i!ƒŠü›NùG¸‹!çÄ®ÍÞÚþ×-‚¹ØžÉÖ= ¹FÔeÍzw wd‰®ðv±ÔË]daëWÈk‰˜#®&A´hâ¼}GÞ¡C„xômÜÄ÷òê³ÿ»@ŠlïDß9…B©ŸÂ€PîUDêûT¬s\×o÷qVwޝ™¿âóïÂü Ùg¯Ÿ1o—¼ß«3’¼¹¢;%.åØ=ß›ÖÙK„¹Oå‰èŒ_¯i¯zLþlæÜˆoÞiíÎÕàB¬Pš~âì¿Á“&DIòϬY¸fþ)ïvC†L¤ÈO]öýŸ¹Æ,%e6mù»SÖË{š2Æ«äÈŠs§1~‹Æ&Ñét:}=訲®@1à­þ[Æ/šÿoÛi¡¿^_ÚâW›:sH›¶dÂØ_Š[ }}fJÛºxþ¸·Ê/.2×Lýr›ì…7¿léËÜR¹ˆôÖ°. z¾úÞs® áÖÑ_/™1'r錖άPxæßýnC&KpÆ%l„‡²cþÙŠUrõÈéÛ~Cß}+Z®ºöïòÅ_Næ—Mlòôu‹EâÒÒ¥Ò¡jPI‰J,’Ü[º$ ê¸éãm¹gWÎû2Œ¾ôì×À05GÓ½µkêÖ* (v¦íS0ÊÐæmB Ê-{ÏëÛNÝÖ7wBª;EX×8¹i¼ ÝR×€°°1²6±nÉc?|îí sç$†Oïá|ï ±@ˆ<¨Qrãh)jàsgÿÈÕzwn¦dPC驽=q[$VüeÝͨÑ?Žîâ)B畟:jÕ–«#šLþy†µ{µª"FÙ`Ôä®»&ÍŸú©Ûù› ?kã!BDuì‡å^L¥`PëfÁÚ—_ýý§cý>k!SÝÎÇŠÖI-›7td!ÁðVk‡ð– Ö=kçÈ¿ßÔ¶p’!Šðä6Éqr!¤3Ï7Û±€ÈCšµNŽ“3ÉMýo~m÷öŒ²ÆñЧm’y``pƵt^gM0Hï=¹É"¼ÿžóŠ»Ngäjåža» Ò.PjŒ(jß%øŸĽ}—…a4)â_úð}ïU«vŸÍÈ)ÔaVéìÎb `cÑ¿µD,¨6A‘ÛÖžÿl¸åа©¿„‘ƵEW®ˆã»4p¡¢€B¡ÔWƒªŠ•;AtçÈêEË·MÏ-c䬋Š5€"¼×ÀÄ} ß}¥m¯þ}{´°ÿ§ö IDAT‰p.Ÿ„€ŒØRòØßqfüw_nŒ›xÏ •ÛJ€Ø5Èé u€BR·g¸¯Æ„èó.ejø›óFtŸoxc,Í-à ç˜úáɰ#¯eƱÎMG¿Ó~ÿ”Ùño|ÒÝGÂ"ÐÞ9wUë¨`Yȃ[$*?u>Wß"2¢ÿËMþûæí¡W:>;ðù¾¢]8²H+ô·.›·dó¡+wÔŒ‚+DÅZRqu†acÐQÆ#†[ãkKæá›nãêŠÁ#Wå¯Òïð3þk€“£S|\Ãjî­FÀ9Çvóq7RÉ<"çÕiÆÏ 2²ü0âœbºŽœÞ¥|Qé¹eñø‰Xžl=‘JgÚJ@ÐoæïÏšNukûáÏmª\ò€äåå]¸p¡¬¬Œf…R R©4&&ÆÃ£ÖÂBeÅöw+Ðgo˜þñò’6#'ŠuÃY›>ÿz¯!@ÜÆÏIǶ­]³fæø5ë^üâóárƒ y¯ª…ÄAý&Ž8ôÚâ/7¾(Ã÷ºP¥<stÆÍ„³€Bó¤Io|:*Zj2^Ì݉«?vŠuϤ¬kãÎÑìÎÛ­“¼DL…h5·¿!Ó €,dàW+So^¹|Åôÿ­Xýʼo†F)$Vг×NyÿWU‡×¦màN®ÿõÑgÿÖ¤0dÖ(b¥"ôOë"òZÕ k“`«z]kÃs6Œõª‰T>ÓF‚UOµ~?”ãÂ… í:´£{œSžx2®f<¤!~áÂw÷ÚqC©GƒÛÞüçH¶^8†éÜÌ¿sS_Úbð•>­FÅÄ7sªQ‹ò`±(JÍ¡£”§§å!Ñh4µfòÕ+¶É~®}ôËÝ<Ó8hë¡ë×jê|ñù6Ÿ.äñý=ñ”cÝb&lQÆ©ãJÓQÖ146Ø+ÚV¬[¶Á¡}œ¿,÷F©ñDý탛ŽâÀw™þÖ‰k%Xî¦`pñaâ?w-_Ó3”ÜUy¥tŒ±µþóé8nÌî1sNg ‰m\¨¦ŠÊ9iXOï7×Í˜Æ î™è-ÕæÝ(êÜ-Ú¡ôx}ñATÃ]Ìc³1‚^þýýd#{…£´-‹—ÜöQ3'„ô·ö®KÅAa2}αô¢pW²À[;(ö‰óCKVÿò§cç²;Y%5*ì’ŠE¡Pî×@¡™@yòË9CiϽ›[¤*âyþÞFË99:y¸yÔz׸Ñð«'ð‚À°p)«@"fµzÁ`±Ö^êy'wþ{¹EÓqŽL̓¬Í»võŽ44ÚWÊØq‘}úTAöêO¦­)ÿ+æíßç¶ï7u\Þ7Ë—ÎÜ©#"¥g¬¿’EÀ¤íY¹îÌ]-!R÷ÈV¯Mé*A9'ÿïž_ü¼üóµ2Ïfƒ£ÛÄ8ÙœÔÏyw7üŸÑ?ľ8¨ß´qys«\¨ÆÈb_ùêKç~úgÙ¬uÅ‚Ô94å•–]¢€¼ õ ¶×¸™“F¾2ç[Åüo×Îx‡xD&ýæAQ2æîÅ¿¯9™«!DæÓvÂôáRF›nå 2àÓ·s¿øõ—éÿh€€ÈÁ+>àÞŽDÅ‹B¡PU@¡X%/?øm;8:8Þó#X¬*N=œš{7×Óݳö ¾úS툀µZ¡¤L'`L€©Ñ—]ðÉÊKÞ½§Žkíi{ç#£B"5ÂwwÏžùçª{= œþzK—OâÖeÿ½øç¬¶§x{ÛmÿmÝ·ÌÈê% V½^¯ÑhÔjµJ¥****U«jQ1\y?1İ B0Áf‹Ä dXÎK,“1md†Æ|ö1Á®ì Èâ˜õ ¬8É"•Ji‚Ë?B ãÂÚy=?vòÐ3-Û[y¡ ˜0¬…ù]‘ýæ™_‘÷•ó¯ê›²Ìíò—E°€ 2MGjËÚ«~ôÕµ¼¦*‹N§Ójµeee¥¥¥%%%†ZS\\ìì윒’R‹'55µS§NtZ'¥âÓ‹±Z­.((ÈÊʺ|ù²¯¯oçÎkXB¶mÛÖ¥[Zœ(O<™×2 -#­C›ÎÎÎ5ŒUTT´c÷Žðàp„ÐùóçkÞönÛ¶íøñ㉤S§N®®®2™¬||þÐÑCÉÍ’õ‚¾¾dÝ›ó<Û6útú]…„;~>sÞ„gØesËì™ÛŠKZ½9åù©õo´þÚÊæ_n9éݮޕ…CÕ Âdeä” |Îîeë®…õ{±¥'‡+÷ pªù–«Ú«K>\Õ~ò”Ž^"»lüB@àrÚåèÈè¹ÔÔT•Jåàààäääèè¨T* …L&“J¥b±˜ã8ŽãX–E¶]ô<æ±ݬõ¼`kí¨Ó>¬E°8fýB•´L¥RšÖVVÚ¼{,s5Ï8«ÙoõYmd€ÍÜ®œnÍÞ‘å{°Q6(Š=öHQ( žçïc¡““SMæÝw¥»žA´íèÍGoèy&R‘FË—ªu€‰„cÇ}õ¯Áo&ƒ KrpÏV!V·à%š«;öå÷y%áèâ-Û.t™àXÞÙÈžùçÏ¿_¾©â\¼¡„0`š—TMëæ “œÄ5("2X‚ñÅ—¶¯[·÷b¶Šq lØù¹^)þ’’SËfý–ÙèÕ ýÃå {Ǽ¹ÛŸ›2¬±+¸µé‹·þFþòG¯'Êím*"u­W8Ú@P( U4(Oö02fç>ˆ¶Ínï/³‡ƒ˜Àµœâ’2­NÏ7o$3@¨5º-û/wolm•"QÛ}ŠÄ kèûÏ’ÝÇòãÚöµ'Úôõß.ÞGâ:õíì/*N?ºí:H ð`;ÙW>sÛÂïöH[÷~±¯«æâöµ,Bïô ïÕ?vö’åÿ$Nì¡<ôÇæ;a/ màÌá ¸´:¬¹«!‰›m©* P(”§L°Õ®>J}…ÏÝóóχ|¿Ñ#@B_¬½Jq{Vãz¯ã…ÃoalP˜€Ôˆ?|郌N ­ÅÇÂÝ£ÿ^•5ú_˜Œ‘D¶n¬X¸'5'¥‡¿Q]ÜšZèÖqüÐξb Ò%çhZ!@.±D¬éc§¢¾¼yw^Pß)½›»pB\ ÏÎÚu0»GX„cB¿gã¿XñûŠ2Ù…ÛáÏOhìÊi­‚ØÑÃß׋CÈî:GIþTPm— O\+yX°) ¥& Í„z†.}ɤ÷Ç¿7wD”47ÏŸ½¡Œm¬0Τ ÏíÙ²õ³cB7÷¨'N'„4Jl\7í¶oW€¹˜U ”KÊ=•kõ‚F/ÈÄœDÌ2¦œ^ƒo§*ÏÂß:²/Ç5e ŸˆZ5w=ššÙ¾¸ EYwôЍHWÓ„þòU¢PM|4þËdÞÖ y«fN\Lª ‹ ´˜HY§†Ïõ9úéÇ úŽHtå b©wEoˆ]¾ ª (¡ÌÕÐ?)å~UºÇžÛŠ]~{ðÝ-G}«ë;kæ‹ñ&‹R}üÃ?É}yÁÜÞÞ"Z¢ë áöú ¯.ºŠ«¸[ ãÇqnÞ>¾n2€h®þ>ãÓ´~ó¾ ”›ü/X¸=§Ü“]ÿî8vü(!$?ÿn‡öuâËÁ¾}uhì»ýp/ð†nz1Ç=Ó<úLFžR.¹žž©Öh eŒeP·a`Å%‘6sÿ‘<¡xËWl5–I“’=éÝBbÌc Œ&<VZd€­ *íVyûEÁ‚’˜çGö ’˜l$vV°€Õ7®äè Á7Nœ-hÖÆC„Êcl·oáiݯ€òøI.‹‹iÀÒ¥ºdH•ƒ1f†adpDEUAMžüC«VžðzvD;ŸÊ¶&.:³mÛ¯Ž½]žp_´vð¤ßB° ðW×LûÂcÞû]ü%ÆO³€S#³Ž»\R^›î«âô×ÿšó㥸ÿ½ÕÝ_Œëâà:éÓ®ˆaÀØó·CLf'}a5– B'N€:v¾Ú¸k’ç¦~å¾1g·\*’HÄb1WZ¦ùvb‡r—F׃–ÏB4{Oª<Ú½<(ÞѤT‹O­ømïþ˪ÈGç@/n÷•s·´¡R@S€p¶ƒªä–¹* Œ£Ÿ'«»•®I^R³—GˆPr~㊓²Žc_mX´iåè1­½8ŒH.JËÌÒù“TP ",òJúåÿöí¤YñÀ†”A‚ ˜çõz^§Ói4š²2Z]¦V«Õ¥êF‰MžÆ Òg®þtö±¨×§ —Ùú¾ââ´#GÏ7ë&Uj—ùÜ#[¶žkÛ¢G¢Ë£Õ¬Ds;íÒ-yD?ùƒLµ¨aôjr£Îž´ÆªÀ-ÎíÔ¢—Ì£dLËðŒ]Ïü³¦.=yK9¿F=†¿1 ‘‡@ÈÛ³pîÒC×n¨õ ónØñÙdæÄöÿŽe"—à¤~cÆõŠ0î6¢/8¹nñO]-d="[ |uXçP݇Äê7Ú=<Þ @#Û'†ë^Q ‰ÑRƒ»•ë¿ÿïííM>ýaT¤”Èüm\ŸßÄOY2«6뻨œá^Ö…f¸‰Ýÿýk;t6ôãœ8yœaØvmÛ?Ra`Ï«1Æ o’˜ãX‘X$s€1¯×aÃÚ±„˜J“HéÕƒçʼ;7‹ô(ß@ÀGÚÜëß-ÎÇ7w ïÞÎköŽ_~ÄZE{Hµ™·5Ä “@f3ÈÖjcCN"eT—–®ó÷,ùuH‰p“èŠrÕ^ÍšÊô[Öž’¶Ó.8€ØñôœíkŽÆnîÊ1N!¾¢=ÇvìJñ…bµK\Ó …}Ͷ#P÷˽¨*xº?8œ(*"–æÃƒ·éfûðöÇ¢ùÓ‘Ï‚Ñ éþ„51€0vÍbAàqÅ,!“Þíè%FHæ-C`ÚÅ—B*gø·Ó‘/Íp™Y×›4nÚ¶M{ƒ]Û¡}'–e3³2ë >Ú­* „èy½N§"`ÌqœD̉Eb()Qq‡bYV,‹D"‹gÁªKû.뼻Ĺ˜ïjÀ¸5hâý÷æ}gò›´v÷é8êuå–¿÷î\º¯³b…sPƒ ‘¯Í *·Y^+€ˆƒºã°iË¡Ëöª±Dé×=>ɧpïúT!á•¶~wJ¿”Có7ÿs)îùELŸg“—oݱìW^êÕ1 1H.²§·€Õ} ¡ªài‡Îo©•<|ÊWc¯îo¾+7~¹¯’qíÆ¼Û®>”1BðÃ4¾5ŠÎyÙsnTV±®I#ßï÷Þäùß6 {¯«“Ù` ypÓVÁq‘®Ù{ßÚyê–®©ƒ”`Bˆ,°a³Ä()Šóº}ðµ?ýÛ÷hßDÉ Xé™}Ÿ?q[(*9õûºœÈ‘ßïä!Bãq÷ðصÿ\ßPN—ÅV÷ŠÌ:#*ÞY¹& uñ ñ!„]ÅéXE3¼:^2ÔЊ—·çmÛ´ 1ºÒÙí "Cï»q$ :­èxÁÙA¦Õê–Ñh´R° Ë0LEwAÅGQ™8ò£†Àæ·Uvkõö¬À00òà”~c“¡|XCÉ%ª ²@ôì{_< cª¬2¼Í€×Ÿ1ü…BˆèðƬö†kâ ^“¾è ‹€Î-±ÿk ý '3ÈÞ¼ô …R(ý"cbœ3©¤Ï^ýÁ‡{¼ûåP)BÀÛº|ùö“׋Y·Ðf}†hX¥s]Ÿ|ýo«ö^È.fÝ‚ý ˜zÖIÉ™Ÿ>ùñJÃqÓ…ËÍ­jRš¶cÅòí'¯äªÇ.¯O.C º¼mŲm'¯æ·à„.ƒ†tp`ÎOýý‡µ'³ò ÊtHæšØë¥!탌÷psÍÃÖD¿öÍMe·vÎÿâÏs¹jÌ:øÄ·8²w¼qÊÕ+úWî`Åò×g¯1Ï Oj'ªÀø’E|kèÙ)‹¾þ;ú€òYêøÜ#ý´j牌»FÆj0W¬*ì„â\œ‘®°È`žJ\üœàbZÀ˜ä^ÎÒò9ß½ÚoiÏsŒ%¹e‘QõªÀhªówVn‘!ó—iXI!DG3üÝ:ŒµÎ2T•ŽØmž –eűˆñ/BR”ãŸ÷ñfX&)±R‰”c9Ä"Ã^¹•Ÿ1 XYNm8l:޲ì(!/ÁFP•—G*¿½ŠˆƒÌÎAZôßÙÙëx,僪 …RK ÆÄèÄÎô™ÅåÓŠt뿘µMÚiЫCÜÊNoüí§¯‘×gCcÅæ)h.ÿñÙœ$±÷àgÅiûÖ§ƒ¬Ü¨æuz^°l#õY›¾øxmQ|ç^tAÅ*¥‡>sÝ3Ö•&öôf ÊÚ÷ç²Ï¾Ð~<µo€ ê¬s—ïzö94Dª¾yøï5¿|ÍùÌ˸vûFk!¹—!äÙvÀ¨ÎNRœwnó’õ  ž5.ÑAV¯X5º,*ÏjŸÔTAy'4ˆz¿ùò‘ ¿~³y ÌtXcÓ§3W•¶~y°(rcëìo€ÙJW“•ÊŠ9:cB ¬ˆÌcLx¤MÆN)+ï«–¸9°Ô?j ^‘ùXYnd³ªXml&h†Ûm›iÇ/€A âa ‹YŒqǦþ-ãË&ˆAR©T.“K$dð¬¨wã'ª (Jmpå‡×GýhüݹÃG³‡™õ~“Òskþ¹:hæ 6î@„Gá‰w6í¾> 6¼âCBJάÝ}׳÷G¯õ €îÙÎ_0tç(ãÇ|±€Æx+Ò<¿zS–k×Þè"EÆn(=³zó ·nSÇö –"hï§}oƆµç:ŽOt2ÿøÆ aRÔ0Î3ïì§GÞÐÄúH\|ƒƒ}8Ó y@bów¾uhúžó¹ºD¥ÄÚ‘ÆJô{¶Ÿô±Ù'˜Tôš”Á„°ÞíÇ¿rhÜÂejB0ÑfŸ¹&x¡SS/ Ê 8@`b8ß°ã1¤iúÌ~gC|Ymæ5âÑÞ_nöF ¦VEµ&¤!11f”yn#±Ree¼€9ƒá <¦nߢÀ®_„ –J¥,Ç:ðJb9VĉƒSÿ•(ÿ©* P(õÿ>‡Æ<8 ±s€!¾"ÏO¿¡îü:eØÓGcÉ] 7?'ãïç!1ŒèZ¬Ë°ÆóÓ2µòè©Ù™úü+Y:yTCoãA‰ob´|Ó¥«wu‰JÆ”„Ä=ÈþË+Á¦öÌLzþî©¿—oØ{:3_ÃÈX­À•h‰+Z‹~ª}ÒÇd T]WPÑ+Íz´=|ß[ Ng ‰<#¼`í¦?¶(ÚDûJón¨¡b€À,¢ÅëÑ~Ô ã—h ªÀ¿Ç¤Ñy߯Yõõ:)Ü£|¨ÜL­`ê%–Ó]¤‘/~<ÃiÉï;WÏÙ¤ÂR§ fC’Ú…+énŠÕ¿"Ó&U`–ÛŒcÓá£;³lÍœY:©{£çÃ[Fúµz©÷þï¶ýº¥yâˆHšáæ89:¥IMn–\aP\\|ððA'§Z×îõl‡9T¹í£ã¼Î#‚áºýTPU@¡Pjç£ÍÞrÎ%È›ÕÝÈFmü¥æô€çæ'úûÂÉšè0Y FN9×`ovË¥3·µQARÓùœk¨ŸèïKgîh£¥€@ûôe5çê.ó± X±R eEÚò=t·Îgñ/>Û¶±;Xé¯DGl_±jôÜùý=i]«äÚé³¥Œ^:ŒÇYŸ®Ÿ-ï Ë! ê8ê³#IyסÁ×0xþÒA&o²Æï®ZiŒA8ÿæ.}® cµZ]PP••uùòe__ßÎ;×0ÅmÛ¶5IjBvÊZ¥~ÈΟ?_ó¶wÛ¶mÇ—H$:uruu•Éd†í“àìù³...NŽNô¥PªáÆÍ.Î.žž5· T*•ƒƒƒ“““£££R©T(2™L*•ŠÅbŽã8Ž3ì/aë“CÇ (ÊÃwi0ÈÆadÙóau­®ùQ«¬ ÛiÚhï*%b~וcTc¤[ 2;&”Þº™WVi"(b”^þR¦RnØÏÔÚaI¡Ô%Q‘QiWÓ²odã›í2øx¸{Ôå5íW`Õµ“'.f{·íšàÆ¡Q(ÊãlÆUÇ¿Ÿþë•ÊžàEMßž3>^n·ÝñTP(u‰ˆÅDÆÐ| TOÝwÙ¯*(=óÃ;ŸŸ<žkØ1Á•³ÓÕQ(ÊãlÄ[M_ÜÒZãÎØó ª (”'Þà£PìQà»;'øæ”+ÚL_2±©“­TÆØ¸*YþÕQ(ÊcýÖ3Lýk”ÊÔe´)¥<ñ°ÀÒL PìJè3þþã¤F/(Ú½|×K‰}}EôcD¡P(‘„ÔåÉçìÙ³tXŒB±#U@T§Wlº‰C¸WéÕÛ—VýÑmDDù[%qwÕšû!´¤ÏÙùÛ/^ȸS æAØý³Ùcâ¥Åç6ýòÃúƒné}cÚ=¼m°œþî‘UóÞ|øz¡Ž‘º†¶}óÃ1-\!ßÊAº^B¡<-<¬ $ …B¡ÔêxÇsœxí>!a/Lxµ#·ÿùët‰ÉÀÇ…{gOúêïÓ× õÀinçêÍâÙÒßøwã³Yy*-Ã!¡„wVrÚ´¥SÞZ´ýìR± çgŸ\û唯åópÁ¾/>Y¾7ãn™ÜÕà Ý*‘Šœoå - …B¡üŸ½óŽ¢øø›Ý½~—Þ{OH„z‡DºH¥ùC¥ ‚ˆ”¦Ø)Ré‚Ò»Ô" JÒ ¤]ʕݙßwéw!HH™ï‡æfvgggfgÞ›™÷†B¡Ôjv­@ŸzxÇ=a÷éàÒÅæï]g¶FiÚÕŽCÀ§ßx6_À]g?½µúÄÌ!_ß0ø÷ÌGÁU8X¾1²Ôf IDATºdÕÁRAODy'§mÀ no|ûõˆ.mïÇ£—Ý8¶õÂÿÂ#-³î'ë0&¾ã—,|Í]Jxž‘0Â]tÒŒB¡P(Êó€øøÛñ¹ê\Z”Jðp÷pvt~iµ]âá=÷05ë×–“Y½ÒÍq÷ÖÔK»Î¤uìã&Bº‡q)„Yh÷¦vbŽ‘ÈD%7š*1 Ëp")hn_¹'I¿Mº,`ïdðÄÖ9¼µÓ¶)wW¾3úxû^ƒ‡¾ÖÁD¦) … <>·uË5÷A£ÚÙ×Ý•8ûÒŽÍç­úŒîæ*FÏšÔÅíÎZõé&¡óC5[‰õ§äoÅÝrrrjÖQ3ŠØ›±2Õä‘5©hní;š† ÿ|1¢ï¼"qnÿuôA‘ÞÏëq‰ß|”‰Ž…×ð6­^éè*5n•eU ­YĈüoéb÷M›¶í¿wró¼SQÿ[ò–¿É@]/ P(ЧÛ°éBÿWÞhk^+ÀIW.%ªµòQ±ÕÝs’üø]ß-úåÈõôd×yþæyl*>ƒ|nˆ]­Ûìê".g ¡ûù“N4Y°vbCEÅn½bÎùÇQÛ6ÿÙºÓèWxqm-ª»FªT 娟%_5òòóœœyž'@­Ÿ)¦aãïë-öš­]Ù}ÕœV@ò®ï>™‰ 0*K+1ƒ€y™9Z’¼ÿÐýÁãüÅŽÁ.èï8ýåíGï…õõ)}¯È|TE$Á.p:ò Û dÉ}Vj–ÌÙQ„@¯Îe|{ÿ¼çÈØ•fþžz÷Dtúp/Û¼Šþ^Ú$)”çy~Û–KŽýÇtv.ïŒ ç\=tè¶c·>aÖ,z¹Þ›ë: !˜©Ì´æÖÊg\¶a“ªº]?êný:kþû‘S¶täxy€…™ BÌx—adŽnînJÓ­ÈTÎÍ&U;ò}Ö‘Ù£fxÈVåäîîþê[o¾fWé¢H5׈ùZÀÙÇæŽs$µFbåÚ"røø]$èE/ùçþYL0P(æ>}À@ †W“jL+ ¹×öEå„Lýq~wã”“îæ²·ßß“‘~ü`Ü~ ;Žï¹mêžGÿ®œØg­LÂ;bÍGU„uî2®Çï3ög\ùuúëë8#豸Ígë?m®ÔÝÙðî´}¹*;;¹65 ¹xYw6¼7½| GÛ#…òŒè·ÏÿúŸÀ s‡øÉÌÍsàÜø 1×Ã_€ˆÊõ}ü£ ûÄvjój˜u]ö1N “NlY·ë|Âc X5ïËw›˜[K¿i%oýâ`Xx.ðøRTŠªóG£_ S0è¿ý$rðù²þæ‘{^9¯¾)7í¡Þ}øÂ)áò‚Œäû7ÿÞ¹xÌö­ƒ¾[>­…U%{ºªó½*«]öƒ”Ï·¾žÖ\É«ÓïÄì^·zÊÅÇ«·L S¾è%ÿü{ºP@yR©ajJúÅ9—þú§&´{ ;1gœ:ùGv°ßûGzÖé=7G…6Q5~{é×NkWíû'.9»™µk@3_ !d>ª¢¦TÍÞýþk·Õkö_¼•”¥X g_'VÀ‘»;È.§¤'e‚ÔÆ·mïQZYC¼‰@–n¢PªÚmeŸ7}Í]\ZU÷õõ§m$¶ŽŽŽ6òÊeúJ& ÁPùuØîïùqÍyëW‡O µe©§Â¼ÐZúMëú”¨.ýïÕ‹Ús'“s ò,Â’¢÷Ý>sŠè”<³òl9àýG·r(’L–o½ éü}+»X1üãèMK—n;—É:†t3}b¿ó»Ypöå­ß~³õtl:q j;ôƒÉÃ[³@(ÈÌ'Ù{Þë°€ÇØ [FûHÍx‰ËŠúaÜ€;7Óy[ïf}Þ™>®“èî,öÖŸ­—íœ"'™§W,ZväJBjކ¨Z~´öûn¤|ÎÛÈØ7«×Ÿ9¼Ò1¸Ý¨é“ªjqP ÀÒ¯ióæ¶,è1ppßÍ“F}3gQÓ ŸG8Äj¬‘ÿT „Xú6ifÅ hÙ®µM|ä§1ÑéºÆâäå/xÉ?w*”:¦7Ö”VÀXuüâ÷ö1l©‰4±ÿ˜{FCq°Ø¶ñkS¾P<`"„Œ…"sQ¢f_ìü³\ÂHdÝxÀ”oû]\t-4ráª%)0ˆALR(”ª÷\ÆŽ=?,g #wQ2"®óø:ÿ—ÙÝœsëj†¼ù¨¾m¥^’w%—?u;n7jò¸É£+ûVÇ‚ÂÇÚ4î;ñ“Á6 !5zâ5Ÿ,Ú¶ ½q1Çñµù {»ˆRº©¤¹±zâ»[åƒ>øbŠSÞ¹µ‹çOfÜ·L·0)ãiãÖL»*·ÝèI‹PüÞKÇO,\¿j¬¿Qò´ì2{éH)B2{×JG Ò¦oNm¯¹±oõšéïhVn˜ÒPÁ,†ù#!ûߣ§ïÚœ=9Ì ç1vJ¯óÇ öîöÞˆ¦¶|Òñ_új ç¹uf¸ªvmÍPÑ™ˆ•û œüú¦Q›Öýý°ó@§ê«‘g©„BDŸýàÒ®?ã‰}·0{zIJþy |T+ Ô±Rs;eòU5¿Øh.ÊLÂ&/FˆAl•)ÊS¡t hÐÀ’)%$èlÿøÓ“ ?Z<ÜGŠð9±6m:|ù~.këÞwäàNòò¢…>óâîõÛNÝxËÚz¹A.1|™$ïêêy¿Ün4á“¡þòâgFý¶rÇ夌¬B’Ùù„õ~cxO9ƒøÔ#?,Úû¨³*çÐ.CÆö µf‘ñúKIÙ…::wèÙ„¹zúì•Ä\déÞä•7ÇDxm"MfÕd¿$hr IÞ©…cO#pê÷ÅWÝóVO_t¯Ç¼y¯:‹}üÑ_îÓ½ãû|{÷j\{ÀÙçVìJsµî˱~2A+ç;û/Ä_ŸQù·ð€PûÄÃ#ÿŠIѶ³’€ÌÞ+(ÐKŒ!DrÏþ¼9)dÒÖI}œE»dœ´~×­ Í›++öÌ$÷ÂÏ¿Ýu¾jÞ˜ ƒ:µôÑ ³vÅ…×·³‘g``€ =Aë²ëòì‹»6lþÉÊoþ>R„ÌdUavÂR>zÊ«b„¤Ö"”G0ÆÅƒ=ÁXÀ/–E¡þáûz«-\¥ ƒ@™}Ú™õK×ì9Ÿ^À(¸BA”£Á%c˜aÊ@÷06AË?X0°Õ¢‚°,­ƒ²â\¿.ýêm­ªI9à HæÕ®‰jÝåkéÚ¶Vl™´Ÿ8ùdœQ—z¶i¨úõÚÍGºö&¬RBeEÛÒ9/u BIawjŽP×>7\R#¿UK#fæ>—v‘Âä%7c¾»ûXïã*2—Õ2sÖ œ¥³§—‡Ä 0i^üªdXÞ”GýýmSg¬VG|ðùûìɽßç|~´D–ã&XC) <i›¾›*/ÞÚ)w´©Ä:¶tÝ"ži AlU¶ž”Ïy¹XN*Aë–ô¦M¹|'NA(±škä?Ö‚ÂÅ?ÐߊA¡Íš{d½öÎ_Ûb'6rxùJ¾šµ‚ººVpàƒ׻‰9&éQÞów»5uf˜êK]PßøûÄ=û‘¡–å7VUAð2ï ¢P(/3n}§ Q­€¬Ü%ñ%‘|æÝdðð×o­+1–<Ö`¿Ò×$¤ñª{‰qût™)Åʶ"@Iì?[K¤Ò'ˆ‘/`É×­€†…[IY1«Õ „Tëf'>ãòÑãqmšw ±`ªU?¡Z…By!‘9zûùÙTÿ°@@ÜhÔ´a¾ÒbDjkÁ¢œ’kA‘mâéÌÄ`>íðÒv´:~ˆŸ5I=ºì—h“—s½`ìtY ˜'¤²¬Vqv‡1 ×ðø…•uE‹ oø ]=m7¨•‡²06!Ï8c,q uEk¶¬ÚnÑ£±‡"=1¯HR95nÚ¿zcÃþ$#׹ë Û¾3ÐeÔ–§0c^ w•i%æz÷îkzY´|o˜×°_gÌ‘ý¯¯?ŠÛ»bÍ1ó[Z>¥¢•ŸpátT¼ ñÜï+·>ô}ç›fª'¦P1çuRPËŽ¿xÁJV˜‘|ïÆßìŒJsøíŒGŽäW[¢§¦v`¥›]¨B柜Õ*Â*í•(;)]CÜ%öfÞ´ÜßuiÀèŸÖZýôÝÖÕoËѳRkdž]üTBœ÷°…3~¹zÕìýZ D¤rjä¡b€±î0yæks\óÉ4̱͘Ȇ>Þ[¹ÜæÛw¯š³5‡—ÚøwœÐ¹w¨¥éiàØW(–~»}ɤ‡Ä! ÕÄŸ§ŒzšæY¥óP»“¿ÍžRÈsVîÁg®~·¿_R¨˜óÀºVœ…£-s|ÇlFéàîî×vÒŠ7{5u”± :kä¿Õgåâ >ºfÊ{kX¹¥½{þ3?Ñ?Ì‚å½à%_zAí0Á:=ŸW¨'˜`,Ty;ŸzöÈM½î;–þº·ÔÜ‘ƒF‰×D²¦£Æ Ô:›j å%Ð,ìfÿéÁï¿aúv vê²Òò]ÚwôU² {ÊŠ=%Ù©¹kÈ ž®³v»÷hè$×ÞM)("Lú 2ƒØÎ×ýyp×Eë'YfZáÓ $f³ZE•³oÞÆyûÎ+wk:ûÙ°î©I‘¶Pü¦Î¥ßZ^'¿kÕhàG«B à $÷ï7suŸ¥TCHÜ"?ú¥ÛL€†AD¶áo|¶vxqL%ÛügÛ|Äçë‡Iû¼³ýÔøJï`#f.ï:£T~‘©L¥V!çPúd±úLW`ØZ«&ƦÛW»¢Iiõ»Ô†:¦:kä¿ÔcÓeÞŽ³_”Q…ÿ¢—üóW ê΢C1)Gb’õ¼@ ©H£åó t€‰„c'.9nð’É èÞÊ«W;o“îÍ#§2½úŽn³jÿ¡=Æ6.Yc峯ܹ7:.EÍÙ¸;Aa h_R%QP¤#þG²/îØ´ÿZêã\ ;ÿ2·Î_¼‘¬FÎ!éà.g€ððÔ¯Ë÷ÝÊÐNaخψ@ã²)L<û×®“±  ˆDamïÙjððH71âsãNìÚuêæ5cíѨûÀÞ­Üdµ¾‹ ‘šnýT+ P(5€ÔïõÙ³,6mû{×òCy¼Ä£éàæí}•œ]›Á¯D¯:¶éXó†oøyôñ©jûæÃ»—ÎãY±ÊÆ/ÜMÁŒ,TiåÜz¼ÿf֚ݻ~:£B8…­¿“‚yö¬V5 Îõ•ÞÏûuÛ‘uKw ŒTiãÙÀWÅSúM}K¿µ¬Z7U—œaÎc32í Ú ×±O¸˜ÏMLHÍÊ« –î>.rUÅ}u¥)˜1ü(‚Ég”ÏyÙk̾pÍI•æà™j¤ª©Uv›ù¸¾ä«Y (ûmÖ)D‡b´ u‹Y@Áî¥ææjuz¾eCO‘˜1çÝþ3q=Ûx™2>&êØÿ’·šùxX\wâŸÌŽö¢½»ûÇU§IHD¿H7QîݘC÷AjòÁ|ªPp„R˜r+!Ë>bøQîÝÿ=Þ¦I÷ˆáÝ¥¹Wý±{…ׇ<Å!¥wË^ÃÚ©d8ëæ‰ßnØá6ãÍ%ƒøÔ#˾ٗíÓ©û½­QÖ¿;w\º¥p…¤CË:)mßgD?ÍÍÃ;¶¬@v3ø)˜úfòBµ‚z^¯;sîDvv=Lå?Nõ ÆÆX° ðz=Ïëy­N§Ój5­¦PS¨Ñ::F¼Ì倬;Ï]Õ *Ø‹\.\õZÑ´&â,ƒ{ŽŸûJéÙ\ªóšÑ¿Rùu5§K©)jƒ£2tÜ‚Êû *—¾ªå'kZráÞé­O:¾YJÐA¡r×˦­_[”i‘sÿ¯Võ{RVMP6Mãå"‡C§‡!åž_æMKÿ]oÀÙÏysÁÕò^e$–þ¹¤U•6 ?{ JÝQêÎZ^Çëx!úfÆ­BPâ£o¥1ùMÍdñå†±ëµæTO ¥Ê»Dž= ¥îŒ ug:!r3)K)—œ¤Õ ½ s1kœ.AH/ŒÁ¢BÎù´ §SmZq#±{»–6g£¢»¼æ'CBNÒC½"0ÀFTÜýͬUUz®ü!€8 Gèóòx@ ¶pPÂ=µcFȾ~|×áè›É9:FÂè0—¯Ãø¬{©©C')*å8ŽŸ•”®2¶}5m;*ݱ8K‹‰”­õFBµJ¡Vç¶mÕ‘a¨°gÒ BX†! ƒ†e!¦Ô?*­¼øu­¾¸lËOQ‹šO]:)TNk¸ê²û¬{Bž= ¥Žt+uÈQצ.‡£“x7ÌÇ‹9®CË « J¹äþÝÄÖ0à± z¥/˜pI¤M„âÓ-þö_'% „«ôë4xBGÃE†SAjyAµðtªÔk¢Z…B¡P(µ ‹×kcã"€D,âD¼À ‚Ð"Ðbç_§y3,ÓÂ_ʼnX©Dʱb˲¡ò9G & s Á%ŽƒÊy˜+s6Ÿ¹¨ é¼Ç‘RÄd6*8z#À§_Œºlí-¥—zåØéL»¶ m9€H…lÔvíÔJû¨“Z.L¹~í²A3/%[—Ó|ñ¡k …B¡ÔŽÐWgŒYÄ –°˜ÅwkîÖ6´`‚$•Jå2¹D"AŒAÌFðâšáÍãÄkÇ/>ÈÖ`$±pôi?²W7I½4+®“ZοsdíêßǦäèÅnA‡OÙÂNwgýŸÇ øy¹§²Ú,=´Ï!ÍjQ@¡Pj>ýðߟr7{€—„vB/AuÏmÝrÍ}Шv%Ö¦OŽ¢JA]’E „f°T*e9VÅ+ ˆåX'B bŠ6¼È"´<°÷Ø™½JÉ@£Àº)¡ÕÆ jµ9UŒ³c–ÎúáTÏWÇMóáøÝ­$–2ÃrÆÕ^KÏ#ͺV@¡PjmÜÏoõôÝ•|L@Ⱥrìø…¤BvÊ/GuèSŽmØ´÷¦š'OEƒbùuæBˆa‰X"“Éä2¹L&“ˆ% Ë „ê`nÿÃ?@åªÃ¹->›¡©Íµ}Jôå\i§¼¦`t#Pâý;qÝøžë4úhÓ’Öü… ?¯û;ö^ºZЦï7¿»“ˆÏºôÇŠ»/ÜÉfìÛ {wì+¾ èM…WHsqã¸ï¦}}£Ùì¥ãB”õÕç ]+ ˜¨òÄÆÞIÊ·oÕ¡õóXYÃêøèó×’ÔŽzµvÑ&Xo&!dŽnînÆÕZR§Nv­ËàGŒ0ÿºPú =±¶Œö‘25Q8ãÀ„óÎ{¿ÿÇŠ×=Äf¿WBp‘wHTõ¨zÝÓRw'Ý+1O·ØÔB A®/Zgãå€ö_>ÜÉ]Ê”œt ö½f}é(BŒÜYÁà¤Ø“Q÷lMj%ä3¾6ÒÆoúhÆnyŸq3Æ;æ]Øüó·Ÿ0®+Þ Sñ·M†sÒ@§Óéô¸>·9ºVð››s?ñ¾N¯­%‰=<¼,-,Ÿ*Á‚››.»‰m^iЦ[Ù0Ntê‡iY¬£»Ý“¶Âøíßþ|(ÃóµÉïö°½÷çšÍµŠNa=Z;ˆ¨œP_¹ø|YzðÛÓËX÷7Om®2:~dä®.b¦fªCwwׯçuR»~ãž3)é¹Õ¨P½˜òD,Ô­€uŠühRÜÜ¿u~[‹ˆžýúD4s•›KmÜ}}ÝÅ…U@ˆÂ;¼]x  êókw¥¾ýËÛÝDB3£ÆmÛgL#ß«&ÃTHš}¸f†­ÇõAôp?ñ¾——·R¡¬•ŸŸ—p/!4¤áÓ- Œ1ÆO¼ä€ IDATrÀ@ÔçæMZuK°0ïóþ®âÊŸ dߊ¹•]€³Î'æw·Œ1yªÓèGoZºtÛ™¸LÖ1¤Ë˜éû¨Xœ~hÉgËOÝNÍÈӂܵyŸ˜¨=ÎÅg"[¿öÃg|<(Ø‚EúûÛgNX’'pVž-¼ÿñèVÝeÃÞú³õ²“Cä´„ŸKŸ°fÍl‹×îBBMTÉ»²þ÷´Ð÷u90eÅÚ¨±Kº–èÒÿ^½ø§=1w29§ _È"lñ7m.Jx|zÅ¢eG®$¤æhˆªåGk¿ïã"âM56(¼ó×÷óV¼òPC¤N?ø~a?7±É@ª¥P^V½±øÈ¶z¢ˆÝ#&­l;ôê™#ûölšõצ†Ãç~>4HUÔé•÷*mzÑeÜJÔð)ßéùƒQéÆKj-L‡ãR!MÄ0õÝ‘áD^ºè™•«’†UîoxþÛ´tz­R¡4ù¥Rer ¡zÀ˜ gbV¡£qêôö}t¶kû&VÐ6S·ÑÜX=ñÝ­òA|1Å)ïÜÚÅó'3î[¦‡Kóâ£/§¹ùtVˆôñ¥ ßü¶0Æ5rÌØÏF+3N®úú»Yv 7O ‘3ˆµiÜwâ'ƒmBjô†Ek>Y´mA{kÖ0éiñ>S7SJÕ®êÀ™g6Åí¿êÞ$ԩݪY¥væ.B@ .ÿ0~êvÜnÔäq’GWö­Ž…Q–1%dÿ{ôô]»‘³'‡Yá<&ÀŽC¦æÖ™ ȇLù¶½+—•ªö²èï›|e>L€îÌ¡TúÍc‚Y¶F%ÕÚöLŠNá1¢q×þ}›6iãÒm¾éTþ©`ƒ´ÅûóÇI‹:J$³³äÒÌ„£Ô'§Y/µZ šäSÛ~Û}þvz¾ØÚJ[Æ0«ãnÛxèâí ½ÒÁ¿m¿¡[¹ÊJ¤“´?æŒÿ܆|ýi„[xcËw+NßÍȈÄÂÕ¯U¿áýZ»H‘&a÷o{.j•A Ǹ•{¸ueϯ[ý›¢Ö#‰µG«·&hfE]…Õ^cȽðóæ¤I['õq!hì’qrÐú]·&4oD€€Â§E»–¡r¦©kÚñA¿y½:¸w[ƒšÈþ96ý\tš.ØGŠ•ûµO<<ò¯˜m;+º>ðLü;7¢í§Æ¿åÚýE+ <÷êàSöoüGñc3KNÑbH«w7ÿy§ÿ;ráìs+v¥¹ŽZ÷åX?ƒ •óýb@%Q„(ýÚtn*7ìÎ=e²±…ŠÓ2EÃVí[7¶dQÃìŠk"ðE!Wdçf?íöNJ}#9%ÙÁÞ¡&z8¯!„Xe@«ÆÖ[Æ?≋D%†‚ìB0Sœ­¯«H{ï8u÷’—Ú‰íL‡ƒîÉiÖOM”ˆúÂ/_®ŒÉaÄ$#“/§Mعàó=)©œÍI‹Ý¿ü«lÉ—ï6±,V(Y…JÁØFÆb!/푆U(D…ê¬×üôÄå‹~ž`Ø5db]ä\XñßWu<–ÛÚ‹5Ù $bª¬Ö&º‡± ZþÁ‚­« X–V€•t‰í|l@›™­dÌÞÓ ®>ÎÇ@ø´3ë—®Ùs.>½€Qp…‚(GCWžßqßÏji‰ÈÊ[Î á¹W‡6aÏÖÛ.ýæÊyƒ×ûºîØõÇ‘3šªþáûz«-\¥ ƒ”r•D•ò£ÖLcu{}Tø±oÞ9pø×"XsÒ/(ñwâ$? †UóC3¸»¹ÛÛÙ×ä3kó›ÒÄmþú/o—›½åÞ;³cÿc®A+w Ù‡úŠwÛ´£A/òXíØº›oyY‚±jñV/§v}ñ 3¬W˜“T›‘œëùJ…¹p®|š]Ý⿯÷>ˆèZÁKCìõk/ýSz5̲Oï~U¹Wxtn×ÅL”m&|6¾™¥úÜ‚‰¿Ü6È $;fþ;õŸûq?/.ãØ’7ÄŸÛóï°ÆímŒw;öžñy71c4[”ŽZ²î->?7¯ 3úÇy¿'¤^ŽËéã©4ût>÷Aš^ÀÄsØìzºHˆ 0"ª­Ö*AÚæ£ï&…Ê‹·±Ëm8¤.3xˆEtE¾,9©0O€þþ¶©3V«#>øüýFöäÞïs>?J‹ôÙQº5hPdW€(k‚øª£ðÆŽ=É|ÆÊ7ºüb”Qgnþ÷°¶VÀ° ¼É탕DU¹±‰döÿÝÑ6jÏÆß6̽a˸e? RH}L¾˜Ã·ˆ5h@Û5¥rj~ê¶6µ±TfŸÞñËï™Z‘Ê9°Ë»óÞìá$BȪÕÿÞïµhͦ…ŸjeáÂ:úV4·^²ØjåêƒìʤV>­G·ídÁš •O³ƒ+xAmp”—€à!Á Bþ[ýêßIÇ„H;„Øp,’HKºýÛB u×wAÑ©ïgéÛ[—<„a‹§‰:v÷Š_öÞxŒ Þ–1‚ìBÌkœ}ãfv{÷?LÜòñô¨ð®½úôhéFÕª¼bèÁiîÞA.}|¥¬[AWY_R2Ý“x!ž÷Ÿ:®,ü,Ñ1Óné|ºîºÊ=v5TQ_Ùz4ÓóEs;)#äñÑÏglÞ~!³U7;ÇoñúN%4 U–Í•Ø|ÔS46Ä©¼Û™Õºg·EÃßÝúûÁ³›)S/ê0FÇ_J¤6µ…ï+?ë1¡xv!¦H¶¸túà›ïÄ0 ‚Q«ÿ|«¬¿ ÄY‡½>ýûF[d¸Î|x…4=§®Úl0¸¥Z¥>W%2lªøŠBæµ<€eXÇ–NãI‹Œ"Ð’„ _.}[áM?ì‰ÍÃ.ív ’&Øx$ C哆Hê7lî,ç]»÷œ¸–ýç.>˜;{ —”¶ÍÚ‚±iûÎ@—Q[>œÂŒy-ÜU¦y”˜ëÝ»ohw@K\B]Ñš-«¶[ôhì¡HOÌ3eÎÅY¸X ‡Ñ‡Ï&xtöQQ#’'“sçRŒ•ªh´bå®Á¾äyVɹ´ãd®ÏÛ½[5ò,>T„WõöY¿ì÷Óû9¶˜ð†ÏÐÕÓ&áqƒZy( còŒK•ÈÂlTÕ›üáÉç°—Ÿƒ\—sGM”öJøÔ¿+R(”—D+€Ê<%—wdÒ_¹Ì„W)M*JRêb;Gt>A}ï™ "Ý*D]¸G íÃûôð³`‰.;=Wêh'BˆWYˆ´qIùØS°(/99âÖ¾_ŽNüÍk;Ž&T| +áti°ŸŒå Ôȫˈ©ÄmúdÁþGIQ—3úz¹ŠézA­!oôÞÊå6ßþ¸{Õœ­9¼ÔÆ¿ã„ν«ªˆ½‡-œñðËÕ«fï×!"•S#Uù®–uê1qø‘/v~»£Këi ´#z"÷ÖM}ÉO—‘›×u#ϯ:pæ¹íç |ßîà"*5šŠÜ:õôýùÇ­ÇS_â0ú§µV?}·uõÇÛrô¬ÔÚ±a?‡€Ô|TU›èñÿn½ôP DjÜeúÃý¥ŒÖT m:JuŠ…&½bŽÜA¯×k4š‚‚µZ“““_PÖ¸1%_.þݾMgZ¡ÿ R„ †E§ÓiµÚÂÂÂüüü¼¼<ÃW“››keeÕºuëj,稨¨ˆˆC‚W¯ýëíå£Tª*^–—§®Òy$ÿúú9ó=&À"N" 1û^_~9ÐK\píלÈ$À Är 汨ùäo&5R È>½dƲk¬D.äíæÌáþ`Ý”y'²Éí<ܬt‰·S4Ä¡ïó;Ä-™øÍ%²óœEc½Õ¾˜¹áž@@>iáxÕ~y"Oim#Õ§§g D6ñëéÍ-éhÿT‚PXX˜•••˜˜ïââYÅ&wèСÁƒW8ÊãâUdX§%XÀ­Ù,`(ý£8ªÌ½% ¶åoǘ”ü¤Tòb¡Â‚bXDžgu,`°å×qˆ `( &\z¹¿déÝLTÙ‡VÒØ ù)™çcÓOÃÕ«WŸÑèõë׋ûÞª|Y/^”H$666R©´†½LRêQQQjµZ¥RYZZZXX(•J…B!“ɤR©X,æ8Žã8–e‘)ßÿ8ZˆÊ ‡‡W½»:½‰Mßb‘ÄÃÝãÉR46g–ÃömÇ®&¤ç#µtòõT±€"ôOg;mÛvâZBj¶³J{/;cYµýNòÚ­Çn¤äæ#•=â HüM!¬ßŸq?>ƒ ±…³gEÙµï4ö­äµ;þ¾ÃÙ¨8Bä.öÒØ´ŒÔl[y5ï:ðͦTP¬ý#ÄT`Ê•ùUö‡‰{MÜÎP©ŠuÁ˜–%Ñó¬3ElÙ”k¶ý ¶ª¯b"‡&›m3Ês†jtì§§˜UOVjd–¥…ehH£JòV¥WY÷7·;©Ø0gÙ ÇØ¹ÝKMû5‘mãAS½^jîܧÛè¹]GUha¡ÓV®&EÉÜÚ™Ón41' ˜ùUB$…B©7ð;>WK‹‚R îÎŽÎT+ Ô„êŸô9i•,ÒU{ž«~Xâ]¼ 7™I§¬±O™©@¡Pê·ân9995 k‚¨Åœx$öf죌G5ydÕ ê52©âÆ­Ø éfÇÿ¦Pƒ1f†adØ@[³Z…B¡P^ òòóœœyž'@ýóRLà Æß×ÿZì5;[»$¨VP¯ñ÷ ¸}7îïÓô”¡ÿ¨þ‹1A0Ïëõ:½N§Óh4……š‚‚‚‚‚‚ü‚&aÍhqQ( ¥ô‚ =õ›b ÔðjÕ ê5' ô¦åðŸûôÒ>ˆxž7øì2¸íÊÏÏW«Õjµ:7—î¥P(J…A„.PžÔDjZ,¤e^Ï¡û[ª¥ kË¢€B¡P(/ªÀG•JÓ©V@¡P( …RãÕ (u¬…P­€B¡P( ¥ÆÅ>BÕŠY ºV@¡P( …òò«um±àpLÊÁ ô‚À1Ld¸[dsº¶V›H-<“j …B¡P(5®Ô±µ‚¼Þ%HÌ1Iòœ¿Û­©sužf$¨oü}âž}‡ÈPKU9ª>ƒ¨µ1¥fÑëugÎÈÎ΢Ûÿ›O ä¼AÀ‚Àëõ<¯çµ:N«Õh´šBM¡FëèAK‹ByºÏ+?~×w‹~9r=½€¸¼¹nS÷èÉïýéñÙÊÙáU“pAÒ•K‰ªF­|T/§œ¡ûù“N4Y°vbCSµ7|éË„jÏ/ ·’²$bV«©Ö=N|Æå£ÇãÚ4ïbÁT=ê©ÀÚŒ{wJ}‚\¤Œ¹MÌ Z¥æ8{þ”JeÙ®MgZÿ¹O'„ôƒgR­V[Á3©š–…ò”èný:kþû‘Sµr–ÊÝ<¤$ÁÕÓÍY%ªª4«¹µòÃׇmØä£z±ÏhÄþ7`þu—’‚?Úõë+2G7w7åSÈ÷•” ~ôǸ_ꆭøéí&EIæGM~uZÚ;[× rS-ây|ul:ŽX«ò u‚ÀÆ*U<ÎùyÞ–[N}æLlï`þ5ªA¤jQ$ïòoßýv)SK‰v^AM:÷ìÒÐÖütö®Z“ÔiÚ ''£¦\1äE3¨V@©9Ôêܶ­:2 C‹âY´B€–aÃ`†a†Eˆ)õ¯NwE¹¹9÷ïëôÚŠQb‘ØÃÃËÒÂ’Ö5¥¦_ŠJQuþhô+a B"æþÜ Sõ¡cᥰæ$X÷7Om®b ½ «ò¶bÅ¢Ÿ/ëó4=Œù2!Xø[ëÞÿÄiãÂ~žd”¡Œ:B©f½ n•-&X§çó õŒUü~øÔ³GnêEpÿر¤ð×½¥f>Rb9M$k2ŠÏËÈÔ:t;Ð_Æf¥ÅG9´ò¶zÒGý}Ì=Á˜”J§b…j3 "‘ˆš=£VP|4Ƙ- Ã0,[§g*ï'Þ÷òòV*”£òóóî%„†4¤-¤žIä釖|¶üôíÔGyZ¤t n7júä*éïoŸ9aEtJžÀYy¶ðþÇ£[9pÈxý©Û©yZ»6ï3¢µçÀ¹øLdë×~øŒgŸõ£7-]ºíL\&ëÒeÌô‰ýÌle 2óIöž÷:ìEà1vÃÆÈ󣇮õ^ºó˦š³+/;r%!5GCT-?Zû}oëÄ=ßÏ[uðÊC ‘:uüàû…ýÜİ|xëMçï[ÙÅŠyq²¥OX³f¶Å……ÒÝùyØ[¶^¶srˆœdž^±¨ÊÄ>Ì!fÉ”•Þ¿¾Û¸BÅÔ`íו ÖµÖC1)Gb’õ¼@ ©H£åó t€‰„c'.9npŽÉ èÞÊ«W;o“çìÍ#§2½úŽn³jÿ¡=Æ6.^m>ûêÁ{£ãRÔœ»äŠö%U¥t…‹¯·œA¤LþxCÜ­LÞÛ&iÃË;M›ÞÍA dœ\òÕçwfpHÛ³hÊ^~o~6!¨BH˜œ!ùwOîÞu2ö^&X{wìÛ¯“‚œ}qǦý±is y$µöŽد›¬çM©é/„jõ\+@T+xv­€a†aB†s޹"Šƒºü:½V©PšlJ¥Êäåe× òâ£/§¹žóa¹:áèúå_Mæ<·Í W±6ûNüd°BHÞ°hÍ'‹ƒ¶-hoÍ®wóé¬éãK¾ùmaŒk䘱ŸVfœ\õõw³ìnž"gæÆê‰ïn•úà‹)NyçÖ.ž?™qß2=ܬdhÙeöÒ‘þR„dö®â‚A BοGOßµ9{r˜ÎcìH⦙ ȇLù¶½+—•ªö²¥àøÚü…½]Ä)ÝT z±»Œ16|§Ö l¨²ìj)Æãõ…¯;½7{Öü¿ÎëêPV>¨éÚ¯#ÔºVð M¨›XÌ"B&p/57¯P«Óó-zŠÄŒA8/ÐèöŸ‰ëÙÆËÔhFÔ±'þ%!o5óñ°>¸îÄ?™!í9D{w÷«N“ˆ~‘n¢Ü»1‡îƒÔ0r‚ù(Tª€ŒÊæó3îœJ!–aÞŒÁ–¯hZÁ‚€KÖíF¾ÕÒF„ÄV‚L„è’.ûþ`Apdß1®}`×˵S'vw!\˜r+!Ë®ÛîÒ´ض‚u˜5ÐOV„$ªÔk†á8ŽjϨÖ !¥•ÒË/yA蓬ùíø­¤GY…Z"²tô ï3bHB@ nlùnÅé»ù‘X¸úµê7¼_k)Ò'X³þø¤ÔlR;Ÿ&­’¢Î\NÌe­<GÕÝß(°`uüÑm]¼¡W:ø·í7t`+Wm±Ï½qƒÂ§eÇ6!r¦M ·´¨·¼[ؼ‘Båß>ÂBíü+&EÛÎJn¼¾E»–¡r¦©kÚñA¿y½:¸w[ƒšÈþ96ý\tš.ØG¢¾ðóæ¤I['õq!hì’qrÐú]·&4o®4WŸ"ÏÀÀ„_P*s„(ýÚtn*gÒ^IË [µoÝØ’EMJŸØ.³÷ ô£ÿ÷+Ÿõèð¹ño»ë¶M åÊ÷GÕP&ˆsè0uñˆ·ÇΟ´x€u™á¢†k¿žŒ µÜyëx/DßLÃØ `B*@|ô­4!@,9ãcáqÌñ;²&ÿó•1’€öMËOF¥¶~ÕMŒ€¨oˆÊ¶í6id¤‹˜°N‰'Áyf£HYµ îü6k**Rì;Œ‹ô•!Ðäÿ¢ëI)5‚€ØÂÞÍÅ‘Cˆ¶BH~üÞciVÞá*ePÃ'ý¢Žìk7:XA!Dâäß°—ùÛfÝúþjLŠÖ×[µÑJ jW@©i­€åYá3¯ÅÄ%i‚ÄbÐd¥Þ8¼r1¶ýjt  !òÒiX…BT¨ÎzpíÀOßI\¾èç)d^‹‰OÒ ‰X’ÿðΙwŒvmÚÇ÷¢¶|Î &4V1H›°sÁç{R R9›“»ùWÙ’/ßmB½×ÕÄd@êà»Ss}Ú™õK×ì9Ÿ^À(¸BA”£Áe®„Äv>6 ÍÌÖ²@HfïiWçc º‡± ZþÁ‚­‡p,`YZ%SɰfzdxiÀë£Â}óþ¸ÈǼÑÀš+wÿKÐZ|Ç|ûa Fbç'eÿ|Ê„Q6;oÂÅÑ‹çno¼Ð»´YãµÿòkµnV€¹™”¥”KŒ«P€´zA£dbN"f &+!½ 0#ˆ æÓ.œNµi=ÄUŒÄîíZÚœŠJìòšŸ 9IõŠÀ›"ëà¢FG ’¨Òs.=ßä/C|aÎøèÇWý$üïƒÄx)ueÑÏ’mN¦Bø¬û©:¹o;ã;‹øH&ÜÏÒ+˜âR@ ¶qµBç³óq-VÕ (5Ü#P­€{ýÚÅKÿ”6Dz°°ìÓ»ßÓô\ªÎ-í•ù×gsOΊ>›8,0@’ÀQKÖ½ÅççædFÿ8ï÷„ÔËq9}<•%·Œ²¿¼ðÃU×õØûÍÅsÛé~6gKrÞ•¨šÆA²ì˜ ûRìÔîÇý¼¸ŒcK>ÜnϿ÷·¥jAõœT‚ýýmSg¬VG|ðùûìɽßç|~Ôä "!РƶÄIE€yB@à1HÛ|ôݤPyñîx¹£ ÷ì5)õþ펶Q{6þ¶aöè [Æ-ûyTÂ(h /AcQº7 -jöUÐsž¡LÄgØÜ÷O¿ñݧ¿¿-/üëní¿ÀjAíû êÚÔåpt/ð†iz1Çuht5!C)—Ü¿›X ÑV4X½ÒÆL¸$Ò&ž¹!äî_òñ"uLòNÞ}Å»‚B€y „€q¶ŠÍ~+‰*«Hmœ]]ÀÕÃÏÏ.ï«eѧ{ s èµ<6j ”Q)%ÇW!€‹M› 6~@Šý /!1 „ǸèÊšo „j”…®P 7 nRAi|ªž!–a%Á¾JHÉQ§çò@Ô±»Wü²÷Æclèß0‚ìB”%·p>!öèF è4Ûú)!9§ +OÐ=¼ù@ Rw}1qŒ Ç÷³ôímX jA £I¼ÏûO׿ƒ‹ ~–èXZEñ_"û@Ns÷réã«@ÿ­™o{œÊ»íY­{v[4üÝ­¿ß<»™Hj%…üÌBá%Q P±Wƒç_&HäÑ÷Ó)úêç|û×õÚq•‚ÚßAÔ£…[ds×âŸï/=!—Š$±XÌåj~œÖ•-2=1øº*—a¢I8uYmßùÍ¡¡Æ Iן:§hlaåáȸ›¦õñ*%—Î|T)kc(µ"€€š|=ˆe"`å6 ÈMÎÐ`'ƒHñ"F$ƒF­å 6BXKGîÄÝ[:W àÝH(äìÝ-YB‘¾`Ø‹DJyFª7ŒjS+øcbßew\>ØoÒº%¯Ústȯ™q†¥Z[#µ”ä^À onúaOlvi?°[4ùÀÆ#IÊû9d¥–RV¢*¹óZÀ2¬cK'‰q˜QZR• 6¸„º¢5[Vm·èÑØC‘ž˜÷t%cÓö.£¶|8…óZ¸«Ló(1×»wßj8ËTŸú÷ŽsØËÏA®K‰¹£&J{% rj Ý´õƆýIF®s‡WZÕŸ¦g.ÎõÕ™“ ›¡°Ž×þ ¬Ôö"Œ1ÁDÀÁÆœs+‹Äb0æõ:l°-`KX!egIþs±…N‘áþ%2›³´…ãñg¯ç†¶´öëÙÙñë#kÁí‚ì¥ÚÄtñäO™*mm Ÿz÷ŽB*hó2Äž=qEcÓ>ÜQÌJ6uØw`÷æÃšVžlæƒ<£V`éí":ùÏ‘ž­] ·À:¤¹{…O¿W:9|stýFQdKgHþçБ ûnÃýeeÔBqé ZZ,@P·}aA¨Æg·ø¹›šÐÝÛ¹dùÍÐw§öv— Ī|,èæ€‚®Pžƒ‚QÒa¨““ó1!níûõèèÄß¼¶ãhRAÕo‰¿#ºpÚ‡÷éágÁ]vz®ÔÑND{ˆZ@ä3lጇ_®^5{¿©œy<ÕaòFï­\nóí»WÍÙšÃKmü;NèÜ;Ôò™=÷êß8üëÖKµ@¤öÁ]¦1Ü_Ê dÝaòÌ׿þ¸æ“i™c›1!‘ ë‘:Y e¹ôñÎ_C¾5¨bï:Zû/¶bP«Z!DÏëu: „ ˜`Žã$bN,@^žÚà„eY±X,‰Êd«oŽÓ9u±fKõÛŒm£fNûö¾šÙ¬½s·q”û÷ž:ºát>fÅ +φ΄€ÈÅlTIR k+îʱ5Ë0…®:¼ IDAT…­gËþ}:¶ô‘!GŽÌß¹ïìε‡1#–[¸úy(` úöoµéÀ‘¿òR«ÀnîažŽC\"ƾ#Ùó×™]«²ÁÊ5ðÕÿõêà&B¨XI3›@JU­ ¦€j¾…˜6p.:±UÐëõ†ƒZÕjuNNN^^^“&MªmZÑølMìwc>¸Ðþ‡Uÿk E€HîÕÝ+W쎾õØû·è?îB,YTxyÉè¯uûaŨ ƒ þ÷æœo¬ø¡·³áÌ£3‡ý(žñËDؼtýù„ôÌ|R8´òîøWýŒúŸo¦-¹ÙlöÒq!J†Ê%ü}úÈ+‘}èŠÁŸé)úR ‹á{),,ÌÏÏÏÏÏÏÍÍÍÍÍÍÉɱ¶¶nݺu5–sTTTDDDµ$xõÚ¿Þ^>J¥ªbT^žºJç^]<ñ›K:eç9‹ÆúqI;fôW:ö{gùì–Ò;ë&Ï;‘Hnçáf¥K¼¢!}¿˜7Ø!nIñ-¾šãŸO] 8 üjA/ûÔR·[¢‚«¿~¼àD&!–c0EÍ'3©‘‚¶Ùr‚PXX˜•••˜˜ïââYÅrèСÁƒ—º˜`Äm XÀÀ° 2¸Ç$¥T8†aPùëK.¯˜TÙJ…Wü¼ÊÝ@#†eP…(ƒ—Ââ<•œëU†yaM™5]DÕP&¦žBò¨BÝ=ßÚ^\½zõ÷‚\¿~½ê}ï¡C‡.^¼(‘H"""lll¤Riññ5çcÎ7iÜD/èk±]aëy½N«ãy^À‚N«›¿áúk½Û=TëµZýùsg k •IX†å8N,‹8ÖIÄ›š]$†âÆe<èÓÐæÊ$ʘ>Á%õUtAéÛqñÍ€Š›6ì*9D´bHÑø]”(*y#L±Åe™©ùy[ÄÀ½{÷‚‚ªØä¢¢¢ÔjµJ¥²´´´°°P*• …B&“I¥R±X\ì&!³;Ÿn­ š·V¡"ßËFãwߺ;›>šº1¯ÅÐqs}˜»GÖ¯øp–æ‡oFøH½ÛpG¯ÆåàF—zéFÿ8æ^~/'+¤I¸ xŽj (ØwéÚC—¡S&úËÔ‰§¶¯ÿþÎmÕÄ0 zN§ÇTt(ßæèZA½ÇÃÃ+áÞ]^W1J,’x¸{<‹î!ñ4u„°~ot|Æýø ‚ÄΞ <UžDŠÐ7>í´mÛ‰k ©Ù:Ì*í½ìXŒXZsÏs¶ˆ)sô^ÉOT.Æäõe~•¿¡| |nbBj~¹EhÄZºû¸ÈÙò¡Æ;+d1 kæEöå«SÁÕP&¦ž‚JÂXýµ_ïç•j×ÚØ¸ ‹8/ð‚ ´´Øù×i^À Ë´ðWq"V*‘r,‡Xd%Ëg1 ˜°™6)õÊŒ#¤Œh&ªX¡­03ѤœöPX1¤\XIšÝ‚˜|‘o!µñà:gmLÔ—Ý~ßaÀÒYÃüd jÛÌK;~Òæß.õù¤¥*°½?ûã¹Ûù=í•™±—!Fw!QÛÒ’M>«qïÝÈšÑBäžMÛ†IQxS—‡ÿL=}âÞÛaÁÍ>\³@-ÌLÔõÁ†ú ª÷XZX††4z‚æ^9²Ði+WÍÀûk ~PÜ]Ë}ºžÛuT™BPúY繫:ý({; βA±s»“>åEgÿ=çÍWËÛšH:-ýsI+í°)/µZPûF¬ b‡KXÌbŒ»5wkZH0A ’J¥r™\"‘ ¦d:½YÝÖWêœV t#A« w•Vm¤n-B[bo>Ôµ´° nïÉo<“ iá{6Ý{ÐPÑ®RtAâË1Y­šØŠPZéU‰£¯=:˜žË¿43FÕß#0 ²ªeÆ¥¸Ëý /‚I÷3ç°Ì„M¹É3 Ìì-ç†*Ì&Q^¢.ȮךS=M4):‡C©JAí ÙB3X*•²«â•¯œ,ÇŠ8bPñ~ªÔ|ÕP­ ¤0ÊŠ,€kÞÆeùÞ3w3µÇ¬ÚŽë`ñÏŽ=—Ò#D§X6kç&)W‚ˆ•ˆ@ÐÓv\©V@ B¡Ôb_ÏÒ=%”z¬Ô•ï!†e$Œ„ˆJïû„PÝÉd½k„Ô|ù×9­@dà!ÞûOª.ÔWŠè“/ĪEnöb„@äÚ1ÂsóŸ{>¼.áê¨hï´òØ¡½pß®Ó{Þdâ¬GÊ“:Z …B¡Ô¼ÌWçfß+¬ËÒõÚl!ˆ @X¨Q›Ø:7UŒTMG pOÝ>ï«­ÇÏEÛ¸ð‹Í)nƒÞhfpÎízygÝtAÒ¶½§Xäܶ‹Ë½Ý¿ßµíÖÕCb^À%꘯ß:nŵû鯴À1 ¾|Ã_jÜcÊ:¶é„À©KGw Bœc›îÞ<#»ºJ*Û„Jó‚ P• ‚F× ( …B¡PêšÞX|ªZ RvIƒ'þv¨”OcÄÚ4øáOrŽ–€qì±è@$%s.øs@±s!±ç[«ÿ|³è'²ê¸ô¯öÀ° j6uÕfƒm-mgT+x9˜¶-‰Ð~)ÅãƼ^£ÍÏÎü('-ë½^.´L(”ºýÍ [t(•Jh˜à¶¼ªv]#Ä ¶JW—ÿŘt³M}Q­àeCÀt0¡”‘0L0¡Ì¹? ¥.¢+²s³--,iQP*!9%ÙÁÞ¡&E5Ž:…B¡P(J'þAòºâK1 w7w{;ûš|&Õ ( …ò§þñûSîãfð’¥þF´@hÔ]DÜÿÙ»Îð¨Š.<3÷nßô¶é!Tzè½wD@šRDAT¥ ‚Š €ˆHW‰ DB3áB Ò³›l»wæû±»É&Ù ÒHæ}xxvw&SÎ;sÞ3sÎBƒC©(ÊGõè ¬€Ž9z‹YåȰ,=£EAñ¼ I{W/ûáØµÇ…Ð¹Óâí‹Ú;2–Þ&>ç¿]è<Š'¤ÄçzûêQP…‚‚²Šç\z ¡ñI«ˆ˜ÓŠ*b££ìÃTy»oëõ¥ÎÒ#&$ØÆG©<‘Ês¤ô·®Awsó¼ÅÇ\Ƽ·´¥ËIƒm­ÇŠ Æ¥?×àŒß'^|7¬öÁÞÍý]Yø\Á¿Oü¹nÄúo'5¶51­‚óïö™•>eçOC=…tÆ¢  ¬€¢B"–]¿™I¯}>BUŒ1B!!4üOYÁ ON‚^]#Ÿd¬ùŸNcMÍCÈÏ[ô YR #Cl‚nü•Ê×Þ>Bèì,vÑknæ\¶× Lj9ý­cà³.OµéôÁ¸^Ñ2ë·]•`žç½G/ŸÙ̆1ˆ±i`ÏÀ*»ùÓôùŠ_–ô5-"<ÏóôJ Ê (ê-‚‚o'ßúûôq*Šçc†ÿ1Æ<Ïó<æ8½^§×étF­Öª G7¥â²®31]=^u*qyJÊ…Ô5÷AžŠËÒü4ÅÚš¾kÿ™ FÔ³­³×Íô/óôF}Œ˜õºlj¹ý­<üñ‘ ×¾–¡ÒB¹"¬íØÙïnhÃ@ýýÝs§®OUñ¬½oËÁÓ?ãÊBcþ¸Ûi™*-z6ë?ª=:¿ÿй¤lèØn䜆†MÒú¬øm«Ví:s+›q ï<~ö´Á6–µ[¾0»€äî»ýŸà3aëŽ×òžv}ÄÖ_Æø‰ àî9lsàê=ŸEÔEÖÎ?ºiS§"aA /{O¡:÷ãòÅï"ï³›ÛZUí:¸jLB‰‹§æažÇE£`Ìc\Ÿ¦Œ16Œ &ÿçòyu髊·?œ·8tó¢.®%Uê~ДPÔ„ ¡ô:êQð‚Ðêî<Ѩ̔ÂzõR´LüÅE–À0Á úK<Å$7«ðèÅœóÙe¶6"Ü¡—¿ØCL²³õP  H2¬«“OZÆ×—´ê"Ž˜è&N==…NÈ’“¥>q1ûl6Áº;OŠ; ¯ånÞÎÝuMÇ›ò{ Ä$+½àd*hè/ ±GDÃ]»‘µû–®ÀP_Ešj·H÷e‘|öÑ·˜E½.›šZª¿Åeg¨œK‹+¨,Èü[vh.E­[x¥ŸŸtâp²ºY#™MP»nA"\RŽŽÙ—ªmk/5æoѶe„5ñLÿkèÏ~}†õkcƒ`cÉųÏŧëÂüEÊ k·?Ÿ±sFwQ™§†nÙ{sj³frk/ŠÀÑ·aÃ` BPX¿_ÿölÿ©ñ³óŸv͈xÑi‹um?sù¨I/n²|°C ÊPͺ‚㹤ÛIùJj3¢(>Þ>înî”PPPÔ;0ýÞ á MÇŠ W˜ëä†äÌåÌXlîøj{q0ûv —èí:.^»–s4Û9Ë»9M±þ ÙR‡ñ!òPˆTù;tZfÿJ{òø@ömQf¨þüG©Ô…í+áNƒrR~„yC~eþöxN,êØÄfˆ‚»t5ûUÞÖËn@´K~fêÞL‚­5UkÕ6÷væædŽ#DS€1`Ìz]6µDÌ+ µØÆ>å÷ÜÄÊf»b÷`7›–Ç O?³eÕ¦ýç’"«æy\Ò¡ÐÙßh³sµÚB(qñµW² 0 º'‰wµÜÃ%Cb–™æ±$½¹u7 ÈË„€ñ_½ßÂA9ŠÔ¼p™HÞh¢©ÿŽ[¾`wÔÒf Õÿ ënÞº©P(G7†ô «Æ’x#1#3£:¯, ¬€‚‚¢ÀÙyÁ«&µY­ZýgÎ}3%ŠÄ}BØ”KiÜá8î2á½ícrîdšåKz°Y‰i?'êu€4^á'4Ì­Zõöý!¥#Aµyš«©Z-I*6¸«¬‰]Î ¢ÎQ_΀ͻú(š»²ì#oÊ-M«šl©äýP.!Iu]GH ðv qc™,=ZijºÕ ‡uj}jŽ^oˆÔ›ÊZ•I² t”6¶×Ò*ùÉ@V,¼ýý]3çlTv{çÓé\Ƚ=jÑ!‰ ÐñÆî²bÀ!žÃ@ÜúƒÕ3"¤E§ã¥nŽl•"ˆ„ Щõ¸~Ù”{‡EF˜ü „•#(ò±`úéÑ«?Ù3IjRükøAר Tî wŽãêZÈ,ŠÊ‚(( èjâUg'çj3ŽPV@AAQ —·1AS`pàæù43ý˜•ˆ\èÜÌ}Y³"}è¤%bU²‘ ·szl\fÍÕplÕ;ºB}.€" °÷°.ohψ0à™Ïdžü$/†‘1„@8î‰øJ *§©·¶úÓ¿gJ-UÏcF!AU·vhR.$qA3'jï!€¼m >yïï¡_¬-àqPmxÐõ„L0•…5`€Õ¼›DYE-€^?K[äW@ÊØL@n$<ÙŸY|ŠF§Æ| Ó:!<·=’`ÌÈÀØÈ'´µßÏýå’V ­Z9E ³2Æ„€â£>zLaò¶ÖÔJ×TKVD0ÖëÔù™¸êTb‘G„'Ü´cÃnÛžQ>²Ç)*òLU!Ç6S†xŒÝñþ{hü+Í=%šŒ”üýDØUÐUàÙ©§ßÚïW.ÜX8(Ò•I½‘c¨Ÿµó°…Oâž½ëÓÉ×¶ø³]zSia=ûÌ}÷ȈÅÔµâA×+b@7 (ž6Dª”ÔsMLwæÜÉÜÜ:7=ïŒ^|_ÏcžçôzŽÓsZN§Õj4ZZ£ÖhÝܺQi½È ÉjŸ`…-ɺ£×˜g3L`ò<æm=Â'Öï7¨„¶bÔÇ^U]+ b?-‰z–ÉÚjS­ƒ x AôL©¦þšW„1æôœNW•Z¨ÿˆ¥sž|¾qǵ€¢‘ͳ\t"môö÷ë¿ú&vÃÇ;ó8±cP‡©úEØ1®ä²¥yK¾Ù³tæFIì\ƒ›E8°Qôœ6òØg¿}õkçV³ÂÍ>GÊê¸}ºòÂz ˜3eß𠨬@Ø ft}RøèÂKQËx#eõgÿ‰³±±kÛºÅó¼®Å‘I1Ïs†È¤Z­¶LdR%•Õ‹ŠZ£>”ÄMoè:ä{ÌéÆY¨»¬+À8[KìÝd¡vúÿr5®ëgF¸N„yqéz #rmü–cY£Ê*]°k!/¼§ÍàX—g¼èÕzS-åæ¹»9¤C»YªTÀH rÊMÍ6ïo‰Š4Úþl"P½¸¸…þSvÇM†ˆAºm<Ó A4pîÆþsÌè B–Ê/o»:þ,0~úMÜ7¡¨(SóÑ iz¦ßŸÚcv‘W×wÖtž^|wBBàÐbʱ“ D ‚2³Ïudô#×Á›â =zNX*Pà3tSÜ€¥Õ÷ ë»Y‰Š¢vÊ ê5”Êü61¢‘!^ˆa"a„„‘Ù?ºV‚°ïý—¾VãØ'ÀnD0b8>íQî•»ºžû÷²2*Ʀ_`Á‹ºGׯÑÚ÷mh7*±„¨ ´WòŠãþWP-áòòJ`††ÛöƒNÏÝS=S\|+Mµœ'^Ê:ãЭ•‹€ãn\Õ^Î-75KoÞ_óŠ€Vw/¹ðbåH¢—…¥R,æ/ñ­ô”.ËO¹›VPêúiÈØyû{H-Ö„žò«å/7,Kýb©@h~Ã}å?h +‹…Õ@ºW@Q½c@@ÕÖdE^€c¦$B ]Ÿ"Gþü‘‡ñe]"yýý™~'<¾}#sÍ ãh%¦€BªôÜoÿÈ3Æ"øÞíìooçG4!Äp˜V½óχ”ŒATª|Má×»ÊI½“½&9š=hLJçW§>™½ `ƒg3¯?üçãOkªEè•…{Ž©5Ëi^KÙTyÍ*2øh^6ßEœû÷ǯ/¹RZ@¢Ž«þXcCíËu|©•›GR_x¨çy¡îͽº7ó JB ‘¨“²‚zÎ e/Î B!¡ážcÖ„"b@eõTIòøË;ªæñ…¬æ±d“+U¾Ù5±ÈO€9yJSr±eE¥Q+õYz€Kê¥[UFs°Ø_‚ÉËx 4rî»)®·…©‰9¡¨+H-lØ¡ _í"dу Õ¡’»6q¯ÌEŒW^ÿûä=—öÝËúŸ—“TOU4êmLQÍK2B,ËRVð‚¬À°W@1'æÛTVõýEKGöpð-ý¦‘+?ú1 ×ïØ„n¦QPVP«Àña ìè/CmòÖÏÖ¥tœ5»««>óÔŠ/޹O™7ªö¿ßw¼ú(#Oͱ2W¿ˆÎzÇxIkƒzIuo†Ô,+ÀwŽý¸qÏ_‰©yz¡­«WH‡‘ïiᬻ³å³Oo ^»ÎWþm…sRXpÔ£à¥Å—Ã|èÓ£(Ïójµ:'GúàëV.Cù>E-gµ&Ñ‘„‡­#¼„BšbÝKËW©µ:=×2ÒW DB@¡FwðÌ­Þ­ý,™‰2ñäÿHøMý}Âÿtòbvxˆ69ö› §Ix·Ý½ùÉ Gî±Á«XO*ZÝÔwOœ}„Œìh¢&Ý…pAòåÄt»NÃùˉzÚ  {tø»5‡ úï ÅÚûõ:íÌi=¼Œ±É‚ycL.|xãv–s—ჽ…šÇ×OÛ±òaÁì·º¸ êá[“¬ç&¬š÷õ_Ò˜‘_ ë³&ÝFvã RèŠç¤( ºWð?;HI…ÙLhv;¢ƒ‚¢\u<#+#O™ÇqÜÓ•$†µ³µsqr©ôù¶öxëuœŽãão¤cl`˜,„\üÍt¡á>u[™HgÍù˜ÏJøëޤñ›$ n×D¶îÔù´V}¼„åCçsºÎÓÝCˆvHKHJ"‚UV“Š*Àª´4 q ô KõB{„D†ú‰ €‚ëžH·ï8}T7O1‚‘Á ý²¯¼Õv\˜ Î(™Ê'æÏˆÁ‘á~"î —}äÐíÖcB$5ª"Aë—_>5þr¾¸ãœw^–!èJ,ZÏR~šÜ{ 4ú`ÛŠ¶’Ô}‹?Ør)­Øz5é3áÝך:³sÚ".çÒïë×Ç^¸“‹\¶ñÖ„^2¤¼¸jÖŠëM?\51\N#Þs¾MAAAAAQ_™Éñ\—Ž]lmlŸºæ+óÏÇŸÏÈÊpuv­tVPKÜ $7äÈ¥"ƒ0 €Z=¯Ñó!+2­ B¨çydp…(Ól.ýÂé4ÇVÃ=…¡wÛ–ŽgÏŸOéüJ òyžèe ƒM†w“Ä ('©‚f?r©‡¾ýîJÀ„wúú¢¢ãxr9÷ÓtÒ€Pgcg„®¡þâãwïçèÃdÄT81«¥¸;ÆBÄ;ºðìù\ˆDPó ¶±ÖÑϼ|4>5¬£·.}çÍïî&€Hê.CÚ‡÷?s€½Œò·/ý6ð‡bì 9µIÛ>˜+í?qÎd7Õ…ík¿š<׿ˆN§Óé1ÍA÷ (((j#¸ÇG¿Yç=ñÃÁ~"j» ¨TäæçvéÐÅÞξ"™ílíbšÇ;y¬ò· jM ¢.M<ŽÆ?àxÎ`¦²lû–!WîfÊ¥¢ûÉ)…­ÁžÎ Ø«u°’H›ræB&ŸpÅG‡Œ7Hò˜¨N%÷j*#B€9 ÆûÁ^o Ö’LZŠÌÅ‘…wîgj±‹L¥«•J¥Z1¦?1µŠ\ä³l(B£¬ ,z-gÈaàd„>2BƒàyRÑàKUE jÂó¤&Y£èþÁŒ[ ¾Y9öŸ]-ºõØ¿[SOI‘Ó°ØÑ; À[h:&!÷oÙÁ@C§‡§¦ùßc}K;¦LN¢LøqojÃI?Lêá*€ Ü-ûüÄ]júþ¦]ЫqJY(+   ¨}àsþ;ñׅΣxBÀ3©b¸ðÁ—RlÅøÛPg3*Ë”“ãlmm+žßÎή"g^ Ï"z¶ðêÞ̳èëôU'¥bH$ Ùµæ›Y]Š'ÃqŽRÍ&š»q—•.^-ÂÖ¤·çÿoû–¸3·”ÁQ¶ö>nìÉÛ‰éZ1(6ù@XëIÅ5ˆýÚG˯%<ÝÉ·«—‘`<ûSêcçãÆžL¾™©ó÷¸ŒëwÕ¬‹·C–8Ê@þ£L V,.”,„˺q_Í8yÚ"R¨×¬·±Ð»ÛŒïÛ¼vå̱û·ÍÛ·-rä‚O_ ±1*¬rêŸ\ؽ~ÛÑ„ä 5’2,È×ðŪmqN}æÍ —ºf|ï¯Oc,ÎPc e ST†yé9¢&WÅC°Ôg@iU­î˜ýÏ®—ÜïTÆ/ ç]9rä¶[×þÑT zñœ¾˜š›ß¿?çÚˆ­ÛümêÈŒ3~Ÿ8x1;ÿðÚ®NÏ=”Ë Îø}âàÏu#Ö;©qQÔ˜‚óïö™•>eçOC=…uñõ© Ór-ñ6ÆLxÌÓ=ê„Ç,Ë„¡sz6ø ȆG¤ä)Rpç\¢ZѽyŠWÄ IDAT‹é`7p·pûëÐÙkù-{wrûòØ?ànmC\ÄÚ”ÇbÔÀ%V“Ìlô’ÀÞƒ›%m9¸z̓-Ã}\múþ# !fg° Ÿ¡1{¯Ž®+oùEн¥;xtñȱL—®#ƒ$Æ)²‰ëC±Ûjb|m™ì‡ª¢ç€ò¿ã‡]›øÛqþ=z,Ó¶í0)¬éбX ÷T‡Y±2÷èn£¢º ð󬿬ú­õš1 ``£E¹ôÿXðé6U‡ ïO sÂö/]Wün—È 0‡¸ÅôÅCĦ×JœíXªXaTµú”Ý‹¿¼Øpê‚áV¯ªÁùI®5ïÅ"(5{rJìØºO´CmÖ‰úÁÉ?íýçn–†¸ô]¸¸ÕÕ/—žR¼ùáø°Š9@Í㤛éÒ 0…ˆ“–Ã×-Á<Ï#Reb!˜ç¹›?MŸ¯øeé@_‘éÏóô’*×új^„=§×ét<ÏBxÌc‚Y– Y¡@P©”,ËB† … D³±òæé[:EpÆlžFNš*8}%»i;g÷®§Êþw|ëéÌeö¾‘î"«Ifz¢mÈЙÓŽ9sõïÝ' 0@"[§¡>rXºâ@àÑmÂÑþ}gönÈöž û¼Ù·½—BBrí0fLÁoÎþöãQŒ„R[Ï@ P}ë¯_ÿÊÅr·ÞØÃO a Ï#Àê!µâ¾!däÁ1Q;'epÄCd#…¹ê¢½cí£ËÉ|ƒ)£ú´R°·I´FVÀ”ÎÉ:x ´÷îE?)Äñ2ØK(êý˜ó×¢Ù›’K\óå?öËOZ‹œÜÜÜ¥ÌÓímÖ’°éèn­çúûû¿ÙôCŸ‘Ó#…b7…Ñ7Z!Öf>Ê÷íÞ+Ħà_ƒ¨,è^E­XyŒÝz¿3*Lj46!©‡ ØN“?èT·¹+λy%SÚlì€6 ÅÐÐÕ–“æ¶|¦N‚+ٞī’â/§{ûøýP©òîñ-ë¾x—õÝ5·¹ ã5`ÚüaŽ2>-~ë²Mó—‡ìZÒÎ1ä÷ÿɼpqÖ¥­+^šàÙ}ü„…ãä™§6|¹zžsäöYáR5×7N{k§tè;Ÿ½§Pûqùâw‘÷ŽÙÍmŸªZ®ßß9wÉ!éð÷¾jçÉæ¤)ý‹â…¸½²xi?!„r/›º;ßW¦XÏ«K_U¼ýá¼Å¡›uqe+PQÕ?÷ºÏ jƒ·±q@$°ŽçxžoÑÐö·}§9#µ²aŒX$f2aaéfC„€ÏiÃÏÅ~JEÓ&%ì“V’J[1-dƒZø“’‡£IÉ$s“11/¢¢£<š5É xd'Ï=ýë{²µlÜv~kÑë=ícÞœÞwÙ¦mK?ÑJ\›é0hÐÇÓ2WoÛúÅq@ w ó’3€²9C}ÃÆ­XnÿýÆÃ¿,ٛϋíý[kÓ#Äžãyžî‡–}Ë((jäžÁ¡¡vÈlhêîþè“S‘,é/†py‰‡¶m;zù~>ãäß|À˜a}ÊÜ=©Ïþ7vË®¸ëó'?/O û Dueã¢n7š:ÿµ iјÇÙçþþ×Ë2sÔ:(qöî7zdg_)‚\Ú±¯—ý–˜Qˆ÷ˆÎÃ'ôp` 1ÿ¥™¹j»†µïÝ]9}ö¿”|hçݸ×ëã»50„X¶ÜT‹¯¯ÉWUÜÒ §!@1ð³E1W?ýð÷VL Ñþï·Ÿ÷Ä'¥fª´D1vÁìö¶éq;6î=—”­#"§¦ÃgOëèjPøR÷|4náyÞgø*g9’ù·ìÐ:\ŠZ·ðJ??éÄádu³F2› vÝ‚D¸¤³/!UÛÖ^jÌߢmË)jâ™þ×Пýú ëׯÁÆ’‹'fŸ‹O×…ù‹”Ön>cçŒþî¢<2O ݲ÷æÔfÍäO›‡ÅzQ~z6/‹Œi×*ÊŽÍç3‰‹_HC?a¿Ó£RÅY×ö3—š4añâæ!Ë;<½¢ªîuž€ZrÔ AYHÂ`cܵ™W›5Á"(‹¥©H$‚'DuÍ ×ƒˆ@èýW5É d½¦-ì9µè!@ˆL NäÑñ•í§#ÝDú÷šöU©e³–Í X‡èWg¯R´Ñ„‚@Ðtæ†í÷Zª€QV@QHŒ‰1\¶)6.:V¤»»lÉq·×¦ŒtRÿ·oËÆ•Ðíó1aBó4·v~¾ê‰î?b0'étl2ñN§çJž’æ $ÞÊrí?aLqajüŸ{~\ɺ/y#LÊØw6±»g&ø)vÝ¿%Ó¢m!¿Û€IãüEy7l=°ùšKÌ€oö—æþ»wëöoíöCh¥©2«S¼ù¸÷úø!;¸ 4ó°*éÂåGö}ƶ!jäcOÒ}½ù¬¸û¨™]ØüÌÛ¢éÛ±Ë[SÛ8qZ­N )|’]yÓ„ŠÝƒÝ@lZ€>ýÌ–U›öŸKz\ˆd¬šäi0(eð:û;mv®@[%.¾öàJVD÷$ñ®–{¸dHÌRãÃ<–¤b Ú–¥åz¥Á¯Žm~båôá·º9ü•n¡E19þ×íw¦²Å‚ä&,šúï¸å vG-mðÔŠªþ¹×RP[”P „#,‹–±áä Ã2VD¦Y¹*ÎŒ[ÙŸvÕ²ÞÁš8ûZ£~%·qJ¥¡’!ƒ D©PN+[ÈFAYEmÁíï§NüÁøÙ¾ËÂ%#ÌÞWR¸çðcÿ×¾x­ƒ3 @KûOÞX<ƒÕ•_Of¹ö_øö@o ÒùáÙk× ã\1yÙZRv^ @âÑ$*@ …»f^]œpî‘&,P"õŽné Ð>ýŸ§®eè¢åbcþðèˆ1 qÉL˜{À£m÷öÑRŠn$¬þ/1Kïï)°ÖÔP‰µžµs÷õó!ä5%t©w£fQ†ÃEú¤¬|^Ý(XŽ@Có×WäàáëëªW«sssS*}–`ÅÀë1Ñßß5sÎFe·w>ÞÈ…ÜÛóñ§Ç-vG(€@Ç›ŽñŠs„xqëVψš¥nŽOu¡°Z¯ØäW¿¶9¿ÿ—Ÿ·~8n뎉߭"3^|Cjµ;I¥p‚* ùX0ýôèÕŸì™$ÅO«¨ŠŸ{=!µM%@ !˜ŸûÂÚÖÔªP†j[ !Õ/y–¾–5¯³Æ„ìéPhï-‚Ð,>8—üHÇ?Ù<çŸL³%Æ¢, 4Ïs7³ wAÓùSX „ñH«ÈÙ×ü©ÂpYÿûsÛqÿ¥dk„Ñò¬JKJçØ{Ù]žJ€ B‘ƒBnç©1 V› $L9&!kŸ¸úví~aëòy)1]zõèÒÒ¯8Ä$,ÊZ•Ф\Hâ‚fNÔÞCyÛ@;x¢"Ö.. }XMòèÑ?@Ÿn˜€ž”[/„¬Mƒ6ÃçµêÝuÙÈ·vî¹>ìæ±½d«ùºN ªF,Pà3à“÷þúÅÚÕÄs¯G”€Zjw/sÆŒ¬©™ óÕzý.eµ·vȊ΀y„ÆÎ .Ò+ÄN¶ Ì+΃üóÏŸ¬˜Ã„K?ºêëØÂ–¯Mè@ÒŽ÷C¼Åì, ž7Zqk²ŒZmê ‹HèÙsæò¨+qøváÁÃæÎíï')²W=DžpÓŽ »m{Fùȧ¨žMS@Žm¦ ñ»ãý÷ÐøWš{J4)ù ú ˆ°³(ÖÖÃ>‰?zö®O+õêÓþþõö t•êRî(‰ÜEÎ PD‹·ÜøKä ’™ïÞ¾O¤}]pkÍMJøÇÆä#ÌØEV•XXÏ>sß=2bñu <÷zÆ U¶)žó”PT£Q€ÞbVI2, @MbÏ&E«âb|ŒîÑCèÒÁKlþúb‹2ëà)øóúåGšÉ ‰µé×pÞ£ulâÌ,÷’à hüÓ›Z)"b¤QÝÇ5jÓâ§–9~¯ûøV(už–¯zýBà?béœ'ŸoÜðáA- D`£häóL7…I½ýý:ǯ¾‰ÝðñÎÂCgcùwrÓ÷ú´øbSä +ª&˜aª•@SVP¯!Ë®ßL ¬æaWgU0Æ!„4,˜”T2į~8ÏvÛ®¿÷®;¢âD¶>M†5k g[ë¿áĶÍ"Gú ˜ó‰ÍîíGc¿;ªâ¡c`s/™Á Š1ù -¿¬WÏé¯çlŠÝûí= „•9)dèÅ›úÂԛ˻ûϾ#7²õ€ü›žÒËG!´i2ò.ëwí[¿ZÍÚtÙÿ#TbB(þ K¥XÌ_â[é?(]—Ÿr7­ Ô9dì¼ý=¤Å",×k5„D]‹-aYê•'KÅ@óE¡òŸ{½‡L*ËÍϵ³µ£¢ (R¹º¸V§-òTƒ¢Ãó¼^¯×h4………J¥2//O©T6iÒ„j9u§¿|«P]@Eñ|¬Àð?ƘçyžÇ§×ëô:N£Ñ¨ÕšÂBuaaaaAaã覭ZµªÄçüùóݺu«3o"!˜€²þÀ„`b8¨„s^Ñï†_M_K†œ."e¥‹²T~q+Jyߎiž¿D£+ÖT+]/Ù0C€Va™$óBKœ·"„ŽãÕjunn’’<<<ºwï^ÁräÈ‘aÆÕÈp™ûÆö_r—Z†DWý±"Ɔ”)*W®\!„\Oº>tðÐgð;Ý!¼víZÅçÞ#GŽüûï¿"‘¨[·nŽŽŽb±¸ˆké9}Ò$¥R è §°º4o/ow7÷ŠÕóçÏ+•J;;;[[[¹\.“É$‰X, …,˲,k¸ŠÎšÉ’îÔk°¬ aP•Ãs³‚"þÌó<Çqm ÒJ¥R©TæççSY=Å8´ò3,ñÝÒ,VòW+Þ óR?·ÂÊtY2‰F?­©|Azj¦º´EÉݼ\Ä¥ú^t¹f™6[Ýx‚B„ˆa“êåzôȹ隸ÞºDϘPÔE+R¬ 48”Š…âi‹cuσ”Ð1G×ÞJ!õ( (O!Pþû݂ͷK[ÄÍf®š!­ßÃÒã‹tñ¥ ¨% ¬€‚‚‚¢Š—û¶ 6´±¤ ªPPPPPPV@AAAQ_x¢b(((((j7hHJ Ê (((((((((((ê7è ¢z ½^wæÜÉÜÜzñúó€Šï+àyÌóœ^ÏqzN«Óé´ZF«QkÔ­›[7*- 8žKº”¯¤ê(ʃ·»›;eÕ„³ÿÄÙØØµm݉ŠâyHAqdRÌóœ!2©V«-™TIeEAAAAQ„›·n*ŠÆÑ!½°€ÂšŽHâÄŒÌ gÊ (ªJe~›˜уd/Ä „0„0B B „Èìô)(ª|Ö¹;®zÛÖ……Ö“øÇG¿Yç=ñÃÁ~"HEQ×EQk *P¹+Ü9Ž£õÖ€ ºšxÕÙɹÚ Ê ê5 €ª­/È Š®&À3%¢áØ)(ª Ú[kßœq²ñ’§EÊJEyÒ§žØºí ^£Û”Q…Í“øœÿNüu¡ó(žðRÏ„T/á ‚ ¦r ° 0  šw“(+¨ç¬RVðâ¬!d¸VÖpÏ1kB1 ²ª*ðÙÿìÚqÉmÐøNî‚R£ç]9rä¶[×þÑLà¦nö‰´­Iܼ¼½\å1!˜e–U³$`Øí«Í½TžžÙíýë]Wl[ØÊÞ¬§ºÛ?ŽíðÎÎM#½°šE3~Ÿ8øs݈õßNjlkª³àü»}f¥OÙùÓPO!]U*²ˆÐЧ ‘jeõ!–e)+xAV`Ø+ „˜“óí*«ç>e÷â//6œº`x ÄÚÅùI®5ïÅ"(¥îpJìØºO´S‡EaêfÏúÉ Þƒ?ýnP¿ ŽÏ”¡ã³÷¹säÖ‰!ãFÎ8¾róm½Þõ‰Š#D«[ó>Uųö¾-Oÿh\Œ+ ùãn§eª´@êÙ¬ÿ¨öèüþCç’²¡S`»‘s>f´&ë³â·­ZµëÌ­lÆ-¼óøÙÓÛXÞÉ©`™º;ßxãVßýön¸A {ü÷ÆåßîO¸“Í*B@aФRNR VáV¸¼G¹@àjû`çÚÓƒWu5œR_Ýúýy¨eF¨Q¸D»&¬xïû›ßŠ*“V£ååUø(+ ¨e#„²këbNBìÞý‡·tbë® BÊ (jÁÜÇcìÖûQaRÆ`çDR9°&Ð º—X·j¯JŠ¿œî5îã÷C¥Ê»Ç·¬ûâ]Öw×Üæ6ŒcÔ€ió‡9Êø´ø­Ë6Í_²kI;Æß{ü'óÂÅY—¶®üyi‚g÷ñŽ“gžÚðåêyΑÛg…KÔ\ß8í­Ò¡ï|öžBuîÇå‹ßEÞ;f7·µ¤éU°LƒÉÚp6›^þzòÌݸíØw'‹2þ;°1ÈÀÓ’JàYZX«Qþñ÷~ÐŽë»ÝvbC "}»7·ÅÔ™Òï–e«8c/«]ÈçÕ¥¯*ÞþpÞâÐÍ‹º¸–Ô'ªq´¼¼S¡´€Âº† Ý+x^`u굫å¡Mýä•sZ€K?ý믗zu~µ¥SfNt¯€¢¶@îj‡Š +Ô?ÜýÑ'§"?X>Ò_ !àòmÛvôòý|ÆÉ¿ù€1Ã:úHK_}ö¿±[vÅ]˜Ï8ùy|b˜ ˆêÊÆE?Ün4uþkAÒ"ÅgŸÿùû_/?ÈÌQë ÄÙ?ºßè‘}¥riǾ^ö[bF!flÜ#:ŸÐ?ÂÆü—dæªu@ìÖ¾wctåôÙÿRò¡wã^¯ïÖÀèåi±©u™ –©¸Ç\Vº úܤ¿÷ü~úêäiï¾ ‘Jæß²Cëp)jÝÂ+ýü¤‡“ÕÍÉl‚Úu á’rt̾„Tm[{©1‹¶-#¤¨‰gú_Cöë3¬_K.ž˜}.>]æ/R^X»ýAøŒ3ú» ˆòÈ<5tËÞ›S›5“[&;(Sl.ËÜsë÷¦{Žýéó AŒûƒàS’JT˜ÿŒ-¬&ÍQ››£A6^1o¼1bÇ}ÞFzç×Í ¶ý6uö=ôþ_¶šö¨FDY×ö3—š4añâæ!Ë;”X^ªu´¼œ” šu¾£ ©‡/<Ôó<‹P÷æ^Ý›yP›Kí"5aƒªQU>÷Ô3>?›É€ÐÖÙ3¤u¡C{D9 žyœjïlùìÓ[ƒ×®ó•W–%ÔOgŠÚ3ýŒ‰a@íaá¢cEº»±Ë–w{mÊH'õû¶l\ Ý>&4/Askç竎‘èþ#ùs’NÇ&I‘¶Ìéô\ÉóÎ|áƒÄ[Y®ý'Œi .LÿsÏ+Y÷%o„I»àŽÃ&v·ãÌÄ?Å®Ûâ·dZ´ 2äw0iœ¿(ïæ­6_s‰0ðÍþÒÜ÷nÝþ­}àâÑþb­4Uf‰T°LsQ”ÓM¢MÞÿíîsJ‡ æ2•1=@¡Ø=Ø Ä¦åñèÓÏlYµiÿ¹¤Ç…HƪyAž—œN :û;mv®@[%.¾öàJVD÷$ñ®–{¸dHÌRcs1%é…ÈQ¹ST9e– „O®ß×Û·há)FBÌØ—“dŽçjauؼ² €ÄO&òhüfçM36}â¾ñ·Ç‘o µá.H*«'DPS¢@òFMýwÜò»£–60oEµ–—T¯–qèÂÃW;‡Yô CuèŸä®MÜ+Ó0È+¯ÿ}òžKûîv¥Õ°r’ªüõQÝŽûû†<¦G'A¥TÍç^úuw‚Sß7:» ªº/°ÞysùO2õƒçOijC ³îþûçÎu³.ýŸ§®eè¢åbcþðèˆ1 qÉL˜{À£m÷öÑRŠn$¬þ/1Kïï)°ÖÔP °bj™%¸õn’‚ÄCçsìÛ ïàš‹P¥­W ¯ÇD×Ì9•ÝÞùtz#roÏÇŸ·¸¨èxãtÌŠs„xqëVψš¥nŽ™ë­–Yb:cà9‹®®å$•X…U¾0»HìÅ ´möú¯Q[¾úÆæ4ìôUw›é …™*¾FEEþ#L?=zõ'{&IMŠ ŽÊ ¬ª\<póAŽHÈhõîéaX5S~šÜ{ 4ú`ÛŠ¶¶ˆ(¯íûaýñ×ÓTŒ]ðÀM •"kÅt綯Ýtäws·@?KŠŸ¸>çÒïë×Ç^¸“‹\¶ñÖ„^2¤¼¸jÖŠëM?\51\Ž^ʹŠîPÔx ˜5&Ü`O‡B{o„œÙš’üHÇ?Ù<çŸLë)Æ¢, 4Ïs7³ wn€æ£»œÈ,›%9û:‚¿3U.ënû#î¿”l ’0ZžUiIéü{/; ËSéA(rPÈÁí<5ÄjS„)÷E,§ÌË«õnr9÷2x¹Ÿ=«Î«ŠG¤I¹ÄÍœ8¨½‡ò¶vðD…Œ]F\ú°šä;У€ ¾ÈdùO„ná „[.ÆÝ-lQê”I9IáI¥¶°rê\5ËE¡_ÿñM¶||0Ãgü¦¶B‘\HT™| ‹ ||òÞßC¿X[Àã Ú5Zj3-¨nðX«åUjϳc )ÎOX»hÇMEÿ§µsµn!7²R±$’{æ«E»ô§MíPtÄRscýü 9}çÎjç\Ô=üsægÍQ(ž¢|B0&T¼³"s¤ò |ZmõŒ½ë…Íù\Í IDAT™€pj-€îÎöfþ¢jñÚÄþ(ùØ–õïÏÓ|½r”¿ˆ{ûÙšÒÁS>k¡`󞨼І¨Kßyó»» ’ºËÔßÝ9oÆ–œ&¯¾þQ¸3È˳U!ÔÝÙf¹XÔW6¾?Ž>iT€0ëÚñ_n©±`mÒ¶æÄJûOœ3ÙMuaûÚ¯æ#ÏõoE¢Óétú—øºW@Q[ qkhò+(³úcža£±³Fˆ‹4±“-óÌG3&oËç™ …,À&\úÑU_Ƕ|mòð@’vü»â-fgYô¼q•cD¬ÉÆiµ©h‚µ2K¾´V»ù‚xDžpÓŽ »m{Fùȧ¨žm½BŽm¦ ñ»ãý÷ÐøWš{J4)ù ú ¨´#жÅÔÑþ¯mœ5Oã#W'ÞUCËI¬­‡-|ôì]ŸNþUÛÂçeš< HEB]:½=yàÎÜŽƒˆ€•I‘67OKj\¬gŸ¹ï±ø‚ú¥-µ†T«Î‡ Öé9•ZO0Á˜' ‚…K;{ì†^îŸ8ñ ù« ÄVqãGKÅZN"óޝÛâ0k|+7£&G0ƃ§µŒ è)þ“J#s•[`íB-`X¯×i õ™w/þ±á@&::@ T—6ï¾ï:xÕ¼Û4õÓNž±ýçKýç·+ŸäaYx“˜f6LIýAìèà-„BH”ÿþ¸ó®Ë /ç 2Æw†(ã­k“Ÿðó¡'îÿž7ÒOŒ hêvïÄåˆ'¯¼üãÞÔ†“~˜ÔÃUA¸[öù‰»ÞÕôýM»@ zYç)ƒˆ¢ FhÕÈ:ø*Ý£‡Ð¥ƒ—ØüôÅÖMÖ1ÀSðçõË4!’EªM¿ö€ó5¨cg`¹—^¨@ãŸÞÔgˆeQXï&ëàïÆªoßÎô®’ÕJà?béœ'ŸoÜðáA- D`£häcó,î ÒFo¿Îñ«ob7|¼3;u˜Ú©_„]¥]'!÷íö߮޹ñ£]yzFìàÙ9І…°¼$¤è9mä±Ï~ûê×έfEVq Ÿo‰Ôª´@,&kiÈðæh<"Æe"ž¥â€ ¬iQ°æLÙ7ü+-6¨å£¥VP‚ª¶IH=–ðHÏñ`B€L,Ðh¹‚BÀDÄ2ÓVüe0y#zÄøõmÛÀâ5ºDsçX\¶ß€qQ ¹ÞsBT±‘ƒË½rø·?ão¥*YGoPLç’ÊI2Wªíì’~ÛpÀmF¿R?SNR|*vï©Ä{ÙÀÁ'¬Ã€ýeȤ™§ï_öÞŸøú©ÑRÄåß:¹wo܇JäàÓ¨Ç~1^D@uãÕŸ¥=ÈÆ¶ŠÀ–}^éaoÔ}­•_N’±Â&ÿ±æû36½ßÔΣjœ ©nõ²°‚ë_|eµaH|[¾±pjO7w÷ú]­Mds“G”Ø«E„lGâ'º–ý†GŸ^÷á¤Ûû½2°O‡ {Öl{šöÓõ×’5òÈæ^Æè2¬+ÉJz¨³kÜX!*ëž•y3EÃ¥®ßûë"ŽŠÅj ¤,z¹§(üôÑ‹ë³Eb,õÐcZ•cŽÒÕå“ÃkV¢Ã\źœôväŒÌEsÿùï‘¢™gøÐÞžób¿Zu‹THµÉ©…& •ÅDV tpÞ{LÖ*X!ÉNW?Ûºmµ©•d;€2«Ý„Ò¾ c÷K÷çîñüuý§ìŽ› öèÐmã™.ëGÐÀ¹ûÏ17+ Kå—·]Öd,úMÜ7¡¨(SóÑ i’(´nR©`™¥šÊØ7òÁ†ÁEÌØÀr“C‹)?ÄN&†BP…[Xm·ù6î4AŒQ+qNÒü³Ã !P½¢@®ƒ7Å ,iø Ý7š ¥Õ7Z^RVPõ1ˆŽ$('ÉpŠ`ý㸟6Ä­ÞÝJ!¨;wOÔVà;ü“·š8Ém휜íÄ,B]c„Ðx Oä÷Êg›Z\<òëž=_ÌØ³wÔ²¥Ã¥@Xr?‡ðÄš)Üb±Ak>X˜Ã@Übúâ‰!b“†%ÎvuÀ퉞 ¢xI |õÃy¶Ûvý½wÝ'²õi2¬Y»9ëÜzX¯ø '¶h9:ÐgÀœOlvo?ûÝQÇm›{É`áÃc¾Bú=ëÕsúë9›b÷~{FaeNA zñ¦VÚ«&´ÖM=ºM~£ð—=Ç/ÒþE¨b‹_a©‹ùK|+ý¥KàòS>;oiEÊ´P¾µðKV“ 27ïXécM’ârd–VÝ¢°”óçT飥n¡¼õ:NÇññ7Ò16°lPÅ !3A ØÊD:kÎÇ|VÂ_w$ß Qp»&²u§Î§µêã%„€(o:ŸëÔuƘîB@°CZBR!€¬²šDJ²"mÄÀq¿Y³sWרÖò¢ÍB “þ<‘nßqú¨nžb#ƒúe_;x«í¸0€¡­‹—‡ €€Ü:p2Ówàœþ-X8ä^]râÜÃ> À¶Qמm}Å6 õ$ËÖœ<’Ôu|„\k½|õ$ƒúÏå$lÛ÷ûã°ÑÓzË™*:þ¬—~rï°ðP¦„3 À%ØG¸ëêÅ4]D€B t!Q)ðvB`e>-¾Ó¬K‡oßz?vß­3¢X‘æªyB £\àè)øõjBª."Pl*ºœb®!¾ÂÝÿý“¢‰ )eMd<Ú{÷€¢‡ŸÕ)Ã/5cSÔ‚QèÐiÁ†ŽeC$ <‡,ÝðŠÉ2 Y»°Þ“ô2³oB° òÑÊWŒñ… M`—±w63‚¶mä—|]:Q©òmZÎßÔÂÐ ïŽoÌïðºùk!,•_=k˦F Ü}±aàÓšj,³TS‘…nbÌ ’{5íÕ[îÏ0/Ç=+8÷ï__r¥´9FÔqÕ+blŸ(ê.ªáºÉ9r©Èó@­ž×èy‰ Z„PÏóÈ`ì.Ó.ýÂé4ÇVÃ=…¡wÛ–ŽgÏŸOéüJ òyžèe ƒ‹bÉ›¦9ÊI2ë±%ůû¨¾wÖüöË™o¸“àrî§é¤¡ÎÆÖ ]CýÅÇïÞÏчɈ±;EEq9)u|æ®/fí†&Z…9Zìgš„ ™.!¾âc)ó¸±õòEåT@ùÏ/»ˆ}ûé£ §UHU’zÇ @©h!mšŒì=eç¢/Äcz6ÉǶlOõ1·©-„úÇçö'`ŸÎ}ú¥{*,u’!X—ˆáo'¶ýÚןd)ÝZu m>¶Ÿû´=Ÿ,#z…»‰ÔYjŸvX-Ú4÷ªïämŸ|ˆGhê)ÓÜ(òŽBö-Þè«xgïgóш¾Ñ ±6óQ¾o÷^!6ÿ¾ì1ˆè^Eí˜,¾?¥µi˧ÝJþjÅ;Á¢b^êÇâVX9VW2‰F?­©|Azj¦º´EÉݼ\ĨeZ(¿‘‚*×ùz¶ðêÞ̳èëôU'¥bH$ Ùµæ›Y]ŠÈ·ÁîPª=Ds7î²Ò¥Óë¯EØ3’üÿmßwæ–28ÊÖÞÇ=y;1]ëï#°XA„µždæm Š À8·xmÀÕå{j0q'€ÂØù¸±'“ofêü=E.ãú]5ëâmÇR!Ð(µÁ†3¢ÈÖÓ•Ñ¥§Çnb3͆p&õÞཬMûïžVàéeËÆÞjùå$ž„­ß¸ãëß6lqxoBk… îLâ5Ê sŸ¯b{Y‰áǨ!ï;ØH;‘ÉV&i8úËÍ&ÿ#³ßEßYÙ~ºa_ !!`¢_ýõb*!€•b± ë7}e_Ó¨…š=@Ö!úÕÙkŒE™Ê4¹a»Áe—² «/š}ÛÚXz})(ê)+¨â#Dc‚ y‚³,# „B`ÌéuØà[€ C‘’ÇHÁs‰jE÷æA>.E~”îân:{-?¢¥C`ïNn_ûñÜ­mˆ‹X›òXcô«IæÞÆÅ‚€äØtp¿K+÷Üæ ¿I`¯Ž®+oùEн¥;xtñȱL—®#ƒ$d×ÀCpêⱓ¾­<@~¡Cx3߆=Ú8~}ê§M°K« '‘./£Ð­yK) ÍãÛ×nj…šŒ›gœÎUôë/ œòË«ÚÈe ëÔtÄØŒ5k÷m>æ5½‡·¤*ô@ ¨g1ˆÊw%²ìeÕÿ¨¤Ÿ”õE÷)>X°âIj¤¬€‚‚ÂÒìT«ßµß$@gŠ:ŽOÛ“Zõ"V)+ „è9½N§ãyžÂc̲¬HÈ B€J¥dYBÈ0ŒP(%Úƒ•7OßÒ)z„;0fšrjÔTqàÀé+ÙMÛ9»w8U~ðϸã[O`F(³÷tA@xXM%iÙ%¬C‹Wz^X¾OküQàÑmÂÑþ}gönÈöž û¼Ù·½—BB ,tÀ ˜m‡Žý²™Û7ìêíëæÛ{òdùþƒñÇ~‰+Ä"¹{xïˆÞ(VúÚ%žÜºA‡Y™³Wøà©½b< üòËK2n>Ä~]Gv»µòèž¿"ßîé%¬ô‘¬þÐF,&((((ê9x\7oä¡ ¨µ¨êDÄõŸ`ŒyÌë´:€Žãím$Z­1H£ÑŠ%€A BˆÝÙ[¬“Ê£',lB%NA§¶3—´A@’úµüV (:G!„†oå$ ²™º¨…¡ ӯȹõÔÏcŠCò€ÃÞiO)rÖ2æe¢_y;j0!Å6[FØqØÔƧBˆvу'E 61:d™*´^¾Õ$FÑóýE=‚Àzt¶¬sÉ>Tâ„50+SV@AAAAAAAQݬ J ÁÆM‘PÀ 8žãy¾ECÛßöæxŒÔ"Ȇ0b‘˜eXÈ@†a „¥ÛQÑ•aeE'¹KÅ> æM°–dµü’…ƒÒ±°œ`±1Är+JÖhµ|«I†¨¤D{«âQÖÈ”ÔwÐ[Ì*K†eè- kJ_oÑ!ˆ CÌ`Œ»6ój¡&˜@Åb±T"‰DÐp—)€ &â`RÔ6PV@Í„Æ'­"V`N((((((J’‚*סá>„Åb1Ã26œœdXFÀ ‚ÈtÛ+¥µNµ¨ _/Ê ê5$bÙõ›‰á¡‘48àóª"`ŒB!hPEYEu Ú¶qn–—µöŠNGu*—‡T“~ !b‰ˆÀü¨ €ÖÈ1Š êÕÿ€(+¨× ¾|ëïÓÇ©(žï5ü1æyžç1ÇýŸ½óªèø™{ïöMϦ÷’@(Ð{hŠHE_Q”bA?E±Á«¨ ÒE¤ˆ/¨´PDBéB€@HBBÊnv³åÞ™ïMBÊî&B˜ß“'Orgvæì¹÷Μ33gÆd2šŒF£^¯/-Õët¥:N§ÕµŽmKÕE¡ÔÇŠa<=å^Ýé»—uV’±ÏxÇߺ=ó^5R6"DÙòjÁ4ïIòø÷ =<_ãðC:?ФŸD ,`êPëös¢ðÐTÒ¦BAçy“ɤ×ëõz½N§ÓjµF£Ñ¨Õjª«‡…PplãúÓîC_ìéYý\|>)éª{ŸÄX'=†ò?ém“tô ÏÓ7§”ur·Ø”£Å‚ÅT0¯äkvz`DO˜¤ª¹’ÀðÚœ‚'P!Í«¡Ãô”Ú{ ,P¯€Òˆc´ßhÒˆ‚†Ç”±iÞ×ÿ†¿6wTˆÌš&±:íÄÉ‹q ¢j†ŸwbÇΔÅ:5Ýåq6ä¯Å Ð禥æÈCc¼å jƯUå¾Ñ¸kWf&–R›+˜?ºÿÖ- ¿6ž/ºë–%g „`|Sk,Ø•¹ëIS…òäøe'¦5j¥Ô+ P(¶å+üû“·W\ǸRÛ4ñë;I\ÜÝÝå¶mzsð„`@  ŸÏuŸk 7ÿæÛôþŸÌó–7ü†ëÒÝcL Ä]Áˆçåj7￳óÆ€¼[y~¯p¯79Ÿ÷Ý mPž?Hâ.gD€s3Õ[Ò!¶…]W–èŒ'Oå~V¯1ϳ\«Öª‰­Ar’Ÿ[²q^ÒlcvÜ·cÀoñ.î¼>ç:7z¬_ŸŒÌWþÑëk¦¦Wýd=+jʯG^Ž.€Ñ‡`p6¥fiSM+;î TH3jùpÙTª е‘Lp#‡}R¯€B¡<êÞQÀØ}àϵ—¡ÉȽ”Œˆë9evO:eÝçyXëà'S,úÛ —ˆ:µs’H²~Î=o E·Õkv@åç<%Îã¥;7¾Lsþ¢‚oöê rÙànNSüLÉÇ ¾9.8¹¼ØÅ« ;}YÁ€‚ã¼ÿ/–l?˜³BZǹ½ú4Üþ%÷¼Þê×È;—ýùE“‰ZÀÀ1 ª¼¬jª¨ò¨oEMý^WþMîŨ>± i(äŠ"u‘ƒ½UÅ·nßrS¹5f'H½ …ÒPz‡EF:0•ILY›Þûð@Ìì/ÇI¾8eçºu»ÏÜT³.AqƒÇìáWc˜ÜTpjëšÉ—²Ô¬K€¨‰yŒ…”œ_þÉOW[¾öÁèPyEóŠ Žþ¼tó™ÌüÂR#’¹Å>=nl/9ƒøì=‹¾ø=%O‡Y;Ïè^£&%F;±¨,ÿéÌü¢R#HÝZtØš9ðð¹ 5rðm=àùû*Ì«y,ŠZ{«n¥^bÈJ^¿|Ë‘´#‘¸´õöÔnf‹ïöoïMØ ñŸof·–7¤_€PiîØR=ÀÙbQìp»n.yncm^ÉÁ|+x‡ùõò‰Ò¡<ÿ‰›¥zÐåÚ)µ5þ}¶ø_!·pt¨w_—k4IãÚˆ¯¸±2Åd"pIÃÅ=ç’ Ê»‰­Ù¦­1=Ï`4Á¬ÍÔJ]’Ö»¢æUÈcDxXxÚµ´¬[Y@=(ÖÇ|}|U®ªÆ¬“z ¥I4cb6ÙQùÚ¸bY‘1}ëó“¤}G¿2Ö¥ôÜŸk–/@o!®\‚þʆOî!±‰c†ú‰ Ón½² 7šøª6 ËL¹r×-qÒø@©îöñm¿­\ÀyΟÐBÎ:„õ99ÁAŠóS¶¯ÞºdMÀü©±vŒ9¿ûà—^’§n_»}ÕEUüà!/'Ê‹NmYûë÷Ž!óÆI²"ª¢V¿Àr½8'iѪÃ҄禷Vqê|­—}E«íÜûÕ×»ª8„äî „ÜÀ#€0h ùàà&E€k€Ó‹íZ»r2Lx1âeˆ©žŸÜ-ÇÙs„è˜ø[¥®`‘BêÍ!Ï^¿õ,ó<;!lmÈš”Œ×/õ>*j6ïUÈよE†ER=Pj iä©WðDc2Ù_TTH·B¸ÏNîW Xx“‰çM¼Áh4 z½A_ª/ÕÜÝûRmÕÂÕ¥¯Mþ©ìoÇÞÍ\il˜hS~Û•4ú³ÑÝ]9€PUÑéYí¿9²EȽ疔œß¼ÿ®[âGÿâ+A1®Y‡/^27¬Êè)_ü@bªµ°d>ÑmZKQË(·ü óN¹¥o"“ûÆvð€Çœcs\Ì3Æ*¥eù£b£ƒ¥(B•rÖv¯. ÝbåÂ%—O~s.å®)È[dMÔHYmƒ‚Èb½LÉ]µ ‰‰m¦d ¼r7!qò ðäB‚ð°ö© æq8GÇ÷¹È¯ä/L.-Dâþý<: ß „@…·@Œa@À"ð¿ûn­ÎÁ¸|-µ^+V]Û/Ÿ ÷ª~5—Öˆ*„| õ (ÀácÉvv]:õ¤ª¸ŸnøÞΤXxóΤƒ¡ÆÎ¤ª«Úñö©©DKpòs&¹)]­ãkxɬœ»n%Õ¬‹úUÔL#ª …B½ʃ¡Ñ¨;ÇwgzÐÍy„!,ÆÁ Ã2 ‹Sé‡Õ™{`HHy\A a€¸åÄc‚¥å)HêbÏ¢â{ypÿç½pb0 Ÿ³{᢭º£§Œ q"Ù{ÿtÜbvŽC`ÊL,VÂæ ±%jm>A¶•zÅÞý§Ùê|òŽíÛ¿ÿhÇ®¡³f%È‚FÞ²ÎX¬Ï—§Ú;jRKo›D^’ú=ØD§]wÎôy¬÷¸»+Ó¤ç8/©aoJùöDÕL—òpb¤Ëàœ¢À)5%ß±™š+äꉋ¯][gã‘»õ©¨y@B¡P¨W@y@‘HDÍÖô *Ž&À³Ua¦‘·{ŒFduÜ›sò÷`·²ª»´òL€çì-ÚvéÌ-}D°ì"ø 93yßç†öhãÊVú(щ:_»¨ÖßA³üF«õ"ÄʽZ%¼Ð²sûÕïÍOÚ{#áÅN¬Ci±¡Þ<¦‚ÂÏ÷qÿiï2#’“Át¹¨^çëàˇ3ÞÓ¹vy3–eMüÍëùG.ê-O¥áxrîÎÕˆþÞb“éÔ±Òƒy6SsŒvîë81Fsê}=*j&U…B¡^å 1ê<¸WÀ0 Ã0!ó9Ç\9ŽÕÕƒ>¨ö­†÷Q}¸ëÛÌà^-ܤÆÂ­W×îÁJV¡R Â”cçny´óŽ1Ð{ÎÖÿ~…‡öñ®ßÖ•oæhq"+ˆ]ƒUè][ö(:†yÈ rJë·¸UQ-W’¿•Êr½|þ©}ç±§³”Ï»”¥¹“Œà\ÃüÄ;oÝÒÛi][w l¸=ˆÃÚÕiëʼ ¥šYß—˜wB½‘’;óâTéÀ¤z~í¬aß6² Æ_¾º¡¢(A8*ûSeMNÙÇ­`,Ò,ÞT²¤RÎʵÔL5däÏYyÊDªGE øò¾ô!ˆàŠáªjòB¡P¨W@iP†á8Žzè˜ç !•ÊÓTWŒ4äÙwçØ¯ÛøÏ–%I%¼ÄÞ¯ÍÈv]ƒ•œk§‘Ž/Û·n_»˜q!~ƒg~h·é×Ý[ï.áY±sHœ‚ó4Ž€…:Ù÷œOÿן/\±uË÷‡L@§p õP0.ªÅ"˜Jò?×Ïb½|qú±?“.˜€ˆ‚âÆ½2ÀOŒ²k3vBï7þ±ä¿F‰sË!Aq²†}¶+OÜ;a޶¤Å*ù Tc­V!æ(ý °^Î"Yuå’"C®0©² ¾ºT¤úùÊ'áU¯¨Y48Õ⃟p…<ÖðŸv5M­QSUPlàçëçéîÙ˜5"b¥‰7zšL&sè¤F£)..Öh4mÚ´¡Fd³!iï_CžAoèz‚ ˜_óûRZZªÕjµZ­Z­V«ÕÅÅÅNNN;vl@==z´oß¾ÍæÆ‚ ÔŒ&“Ê•Åp”5]å×Ë=3ó¿æ {™ÊÖvU/ÊRù÷¤¨RѽRªæ¯"tÝDµñ!Ä d¹ÞÊW«,³º—€Â—––fdd\¹rÅÛÛ;!!¡ŽOHRRÒ=Û IDATÚÜÖäQlœÎ(¾˜àVcs¨£[¯vS ëÞ) ˼zÁ¥´K#†Õ¯ãÛ°yCDHBèâÅ‹uo{“’’N:%‘Húöíëää$“É*”¦\JñðððöòFôÀеÎHÊå{…}Ý,8zô¨F£±³³spp°··W*• …B&“I¥R±X\1p‰Ê±0.Fõþ$ƒPC cówö.ùáÏÄ™ƒý%´}£Ü×sˆ¬\FUþ·ÔŠU½j%:Á¢a^íâ=)¬4—UóWº6QmÎíüÒjkð£t÷QIïe­Ë¬KÂc.)~çuÍ/A0¡.¥S¢-ñôðäyžNßP¬š &48ôBÊW×Fk럯—f_¼©Œl ¤QŸÕŸ9‹[°.ëÂÙLetû@»Z¶O ÏïÿçߣB€N;P(5m\Í©ÅsW]­¾”[ÔnúÂiÑò'ü¥Át…;åÉlu~)6ÛFÀ@ ‘g“š€W`Ìÿwëêu{ϦfèY…GhëÞ#&ëàÊ5” ×VüW†ý°Ä_ÉR“µ*Õ½OœÿÇF}ÎÎþó›^Ά´ï¾{iÄÊUvµ{S„ÐŽB±ú¢9v™»¬³¥¡~4…òä:t¢€RÛ#ÒÈ{Ë«“7Î[>3J{`ñ׫¥çhHáÖ~Ô«S…(ÌãÜ«§ \ƒ åìu_uäO¬ýaõ?)7r5FP´yý³agfpeÀ÷?<"EŒ××¼6egÔ :íù`AjÛwNŽR2ͳ¿¬Õ¸ñÓÄËb?üß÷=Yÿ{ÿÍe'³µçà7äÕYãÛ«ªÌéhÿߘ7/>½bÕ‹aRñêò&üÑrÑ/3b›«)”fË êP(mðQ¯€ÒÄžGêè.nÚž%Š›3¦¥£¸Rœ¯ý:{ú/%íGOžÄ\ß³æÇwæè-x.H‚Ì› VhŠ`A0! h¯Ÿ¾pÇkô[SCešŒäMk¾ý€óY6µ5 zjÎ î"ÄÈ= ÎL9pô†ËˆiS¢-ìæ-þçßócC¼D€5—Oe‹Â^o4MÍyÙ_­›fº ýð“žb„”Þv BN1O½2g¸³BÈ9ùë‚Õ/ [ûqgÇJë‹äá}ZJö;swB˜7X}ñÄmQ‹WåÔÜ P( ¥ªÙG—1P¬ƒ=Ys¼úÆ xÄøÕŒf%š3«6Ýt¶pΘƒ:· 0L™öëϧ?èà`Ë­"rÿ6ã"¤(®×§Üã¥Ø ©³op°¯Ø¼=‰€E`\—¸@d½[Š?Ûw¶0ÑÓÓ]?v“ ªtp~gÅF Û|‡¹k݃Hæâæ/.ßÖÅ.¤sïháš¹wÒ¶S· *ž„ì£b%%*xÆËÓ^=”΄WP§€B¡P(”ª.A}m¾Ý'oï:‘eŽaâ|ÚyÑ)¾fýˆ<‚:é\ˆ£Û”w)Ý`ç-e„¤>í£ëS.ß1v°¯Õ¹@I܃UhW®š‡òý¼kìâ‡PÅÔ„2*¡ûÙÞ3}û:d¼hôÕžE¡f¾k‘ùDÞ{z1ÿaÞÛ!@ BLÅŠhSî‘_¾]½ýØÕ;:FÁ• "µTÝV‘±k5(š»ëß»:f»`ð×ÒAÔÜ#*+oý[ío¨Ã2- …B¡<‰^A=ç vžÈz¶W„˜c2óJv»Þ§gC’)h.ý³ÿ†ª[B´Cõ¡ZIõ«¢ðôÖ­TFuq5xÇØPBB“ =ÇàQžºÊÙûz‰!÷òíRk;ÓUÙK•Åæ Ä1`*5ÙŽ F¬D‚‰2[×ö»ÇØÅhÅ]ÞyìniÆ¡Eñ­]¸'Á”³½‚¨šÞL›g¾»ê²ï³,X²ìË×û©,Í¡0ömžn-Jùëp¾îÆ?G ½ºÄ¹Ò31( …B±àÔ ^R3 Œ &Á|fcƒÁçŸÙû÷ñ P¯¤z!”\;}.õŽcyôy×RRn• (ÿ£åÁklËüQ¾Êè!=$­Þ:ÈŽîMoŦ[Pï‘`"`ƒA()5 æMIî+VŸüá“õ©‰ïOíêf}”¾Ì%uK"%§W-\}®ˆ' R:»¶ê”Ð;.ÀÆ&ðæÃçØ’Ü˜µmÙŠÌ3fzxÔ×zh!’÷3ðÿ„yHÙzÂk}ÿýdõ´×¯ íæëÌj²¯^ºå3ìåÞm&ó}eÃ'ŸIÇ÷„ë{ÖüzÛg̬¶öÈ£K/¿•k–|½®t`¤ “sµ¸–¯¨Šÿ¾oÝæÈ§‚È]{Ç>Á–´,ö”פõßß4y¿ÐÕC‚€¨ÿ]0ã«ËÍz"[s"÷–¡ÒõI«ÖG !ùj.½=¢¼ÑêM+·Oˆñ•ÝÉ,)Z9{/{”wrïѾ݃ìXEÔÈ¡>[×,H7ù¾ÒÝ[Ì…D›•’r-S«ŠïéTµA¶‘DibM†ÌÝÇ×ÇÍzªO]úÎÌ‹cÖ® ²£§F6 ¸pÏ»çì¿Ã8¸ùÆô<~|b[W¢·ã±÷ êgóa‚&¾¤ÔD0ÁX PG›‘Ï>¼ç²I7÷íËŒ{6PjÅ¢!e†¨…b-&ñÚÂ"^Õcâ3 ¬/º})9iÓ‚ÔÂé¯÷ó“Ö²pÖ¦ä„`LjÉSwùï_Èõÿ¬)¶ÉñˆWw°Nñ3–|ûóÚ?ŽþþíïÅ<ˆ}"; å1ˆCžûô+ùÒÿøáý|âÜîÅù/ 5?Ê"ÿa￯^´ü¯E¬X‰½kPl„#kc þåןúbźÏ?4ÈÜâÆDt¶ø"Šýú Ù°ðlÐÈ.îb@€`^„æ¼E€­¹Æ©Ëë3†~¼xõÿÍÔËÜã'´è3bļéy_¬Z9w—ˆìÜ£}íXÀ¸÷}uÔ¾O·,ú_oF+qÀS£[ÿ<ÿßÐq=¼¨SÐÔQ«‹ofÜ4š ^ ‘ØÏ/ÀÁÞ¡A*Ò]^÷ùâËØy@d§HG¶Êi6’(M ‘ï°ÿ[<Ôæék tg•ŤιcòûÅŒx{¬Í»zì÷Õ_¿tèÆâåo´w¤·ãñv j½5I'oï9yËÄ 0! Šô^«3&ŽúÕßæÍ+ýâžêhñ\¢¿¶'¹ `ð ­N.Û‘t©ÿ¤Vö~$_t~×ïÛŽ_¹­áœ}= „0fã•ØL‚JV®Ü388ÐŽEÙB¥þ`ù±£Ù=|$ ¯¾²Ë–äËYÆÉ¯e¿áOÇûȘrû! ÜI^µd{j¾žp Ux—ÄQ}ÃXdÎ’ó×omCòüG¯ÅÊ­”ö„ ºôä­[\ºq·”Qúv{ñ¥Ä)C´×lÝr åF8ùµè>xH X}qûïÛN_Ï)(54bä›/Å;sV3fýcîSéE&"vŠòÒ„Ž®"Fiìþð‘¯ùFœ2¸ßË$¼\~Bæó XçVÃßù~XYdS¹Ý“xu›<¯Ë$RaÛ2 ƒ `Âò?ž/^FŽÝþÙÕüŸÄ«Ç º½n;fÁÄåL¨çŒ$Î )3¸³9 Ù·¾ìWsDî“â0ª!?îM,׌ĻÏ;?ôzûžÞPH⌟š^ñº™/ §v/ýðÛd‚Ê•/qõTÊÚ=ÓÍCD ¼¦ÎÍŒ›J…²f’V[’~#=:*¦a¦ Æc‹“¨6’(pgÏÂ<–uGm;ùGw÷ú«ƒÃíX`¼¶xÌ„?:.þýÍ(9ƒ«ÏýöÍ ÏßÖ°N-FÍÿæ`€ô%c;þÐfÞö¥ñés‡M½4fí/ã$ø¬õcG® ùæ·cõ‡—~¹xϹôìb=±ë0{å·‰^"þîñu nµŸaíõ3)9=G R=ò¶cˆþšÁø;VnüWÚcèä.lÉÝR%ÛÄ&šB$¨Õ„k›!†ak¹†–µ–½Ê¿DŸ“vSƒÕç6û·bà‚.Æ–*iÞ^AU­ÕÔ€Õ;bÎHJ³/¥cõ™õ_$)/î¡âhÿÑä1š J…ҢݯTÚYœC 4w¯@“zäß[Þß}3B¦»yø·•ŸL¼¬þeñóARd>!¦ìãÕÕS_øñn‡q¯|«B…E^ósäþ̼ϟö#¤ô±c`AÀ[JŒŒ@(>»÷àu×ñï¾ëˆK˜0Wé/-Ÿúêùˆ7>~Ë£äÈÊ/ç½Éø®;Ξ¢P±½+ìD`Òé1¡·ãñö j3MFÞÈ Ç/ç`lö 0!é<5‡AÈõg¯˃k¼ÎwOþ}MÖúå`# ëÚF±äÀÑ쎃|ĈæòΣE.}¦Oð3aNÙ'ÓÒBp‰Õ$RÕ­B0¯/-ÊI;¸õ´VÜÚKDt©Û÷çû™™ØÁ‰CèTtaþ¾#Yƒ‚H…£KH½ZÄz€ŸCî™'®Ü5E*Ä@@l¯òñr碽b±´@Ï+CÈ Ÿô¿öÜvì>uBŸ²µV@›ºm_Žcןëë-ePL˜‡é‹E{v\éòB !„©WDLd€Ä,°&Åš`‚¶°KÂZDÉd+tzÂâ šüíí Þþ5ƒsê÷ÎGc#d4:ö~1emùlêšœªå ¾˜%§š|B:7Ý¥õßüxðz¾V {ïø!c‡tô’"¢¿•¼ñç­Ç®æjÅNކÊû†YMâóoÞ¸ûôµ¬¼"Rïžo¿÷\¸¤äêÞ¿$ºšoRº…v2zx¼· !¡ðÜ_«6ì;{[cB'¿ø ÓžkëE.RS¦^÷Añ=»EÉ™.=ºµ`G½¶lééaŸÆWÞš¨O|¿:Í}ÌOŸO‰, uEédª€ˆð€²sNtÖë DÒ©g§h9€¨“ø53jÚ†i‰ž"­¼òŒX³%õµví”tw_À&£A¯5iï¤Ù¸hó¶åKá „îÒÛñX{µN"D.g*åed0 z“ s1Ë”o~mƤP£@>çÄÁl玣¼Å@ìÛ¥ƒóá£G3z="CBqæ“"<ÌYTqŠlù³`#©ò#¾îý·5Ö½eâËCcíY!;#×(äoülÆ&Tnšcq¡û—ÇX"]ü{Ëîã—o cĜֈ˿½¥PøBË¥™dEH£âf¶A©’ Ê2ÜÌ6ʃ#]Ë.ŠÝ"ƒ¤{ÓošZ(˜Š{U¶—¨ 퉼;÷ ;·åÇ/n·îܽ[ÇXßZ¢ž©Wð(NøáÏ“Š•H”ûEòòʤ—€jòIÄd¡$'OÏ*¢RMaÖ…ß#ñúxˆ¿¨äÄOŸ.=©aÄ$¿€¯ÔÔi¬&™rïù÷ŠQÀ„³¼Ž·W°†¿Ïÿ¿¿n ¤r¶8'eÇ’ÏŠ$Ÿ¾ÚÚQŸøqÑç<–»¨Äú¢<i§ÙßL‹–W¬(ww¦ ‚&~õv•ƒ³‹ÊÍQÆÖw¡·ãñs j·ùú·÷Ihç]ñïë ÷Ë¥"‰D,sÚRýw3zW„GšWbW+èÓ“ÏhT=Ÿm_–‘¨Ïþº&ùÐMX+{G?wnÿÕ”CŸÐ=+g=©R /:{ûøØ±^£ŸÏûúÇ­?ðÿO/O‘½·kÌÉçöîÒJ½ áËö1'„ï\Í<÷ta‘ ó”ÃY³F‘\ z'ؼ÷c­´‡$¤ƒ{àúå’¥ —W<*¬ÔQ Ú‚R¡Âå¼ÐŽ´, •Ù¬G¤ ÷ãôׯ!¯Ä`ªçCØì±óoÙ*Æ…µºÛ½cçk{ Ƙ`"`ಜDÀÇŠÄ"±˜Œy“›c ÄV`ªõæD{íHJ©GB\¨ß½(?Oi{÷¿w¾¨Žîà2°§û×{Vþ„ûv‰PI ¹ú²sÑ@f5©r o%Û‘õ×ýÊ·;7&GNéåÞ¯³ó¢«W ÞC]$Æâ<{\?9’:É¡8íÌ¥\×Hg?Ø›¼û¼u€«¤(O_n63^¢ÿîÙïßÑ Ô:§¨vþVJ{HB*Ãûwqþæï•+qŸANbC±Þ½e¬gÈ€n ö®ùE”ÐÁný›´'_Õgl¨¬b{Yó´¹^ë‚ñ…)‡S‰»§½˜/¼šSJ¤R¬ž³KÁ·åQ"“*.¥¦DEư,ÝÌú¾Úôr0Æ Ã0 ƒÌ«§7¯àA„,½´nÑ_)%Ø«ëð>Ò[;Ù“‰“ò)V¯¹»oYˆœ¥$ ]#oàb»wð”5’Œ"Ü$ 3wŽç–­í¿~üïNœÊšûîð‹¥Ôž©ù¯X8 µÊ˜ºcÙòLÕÈ÷㕼äÔéÕg½Ÿÿyú òâX/©.OØ+!È£U˜tÝŽå¿Ä %ùjÏnƒb¼zöøaé‚–ë†Æ¸±·/Zéçί ÷š¸þ·˜Ÿ‰ó–éó2ÔOŽv !!÷¬'ÓÛñ8v"6½Bˆ‰7FA!0ÁÇIÄœX$€’ Çq!–eÅb±H$ªR Ö¤¼bôèåTyëvÆ¥e[íÛž/hÛÕÕ³Ïä×”;¶%ï]{P‹Y±ÂÑ?ÆS‚€yYM‚ª7)ûƒûõÖñôO»¶ž‰ÔÎà”)Ê¿vßóK²K”žQ£ÛûÊ8ÇØAÝÎn<úçá˜ðÁÇ/Ü´{÷Ú“&àdŽþ*)B@"rðÐøu;÷ü²Š—:†÷ñõw·\ÚCľ¦LQüµýØ®5ûKAâÜrHHŒ§“WßI¯HþúóЖeEàè>è姺ùˆªpí*G`U0“&ëìÞC׋Œbߘ!c»zˆ¬>º‚ˆÒˆ„‡]½~埃{©*îÏ+0ÿÆ ‚ ˜çM&£Éh4êõúÒR½NWªÓétZ]ëØ¶ÍW ¸äÖ--&ħëþÝ=øË6ïÍÔ™ÇCÝѱtÓÅm‡²"|ª CºZMª‰Ä5Ô¸At¥ª¸Äþ!ö,1媥î®"¼Vƒz=7½ç°´u|¶#/óè™üÁ>Nºš¼Åt¾ >0RͱŸ?[“+8´ÿÅ;SZÖ<}9ÏÈÜÂÚE;q– \yËÿ,]âüßï¶.{C1/uíþZϧ£èE ·ã±Wª%”: X0ŒÀÈ Žv2ƒÁİŒ^oÊ€eX†aÊÉ+ˆ”±“>j ÃTYY„\ºLŸß FÐqØ«ñåÊ|OóBëIeÙÇ¿öIûÊåK‡ÍùdhÙù¨Ê#_ënNB!Ä! íÿÊœ1àÑ~ØkqCË 4oGIÎ%ö™ÿ´fþ yzŒµXy8BsuS+®3FÜ}äÝ!>:!€õèÿÎ'ý€©R±Áľ}_™Ý»Ê5ëÅ=‚=K©WðDÃq¢ðÐTÒ¦BAçy“ɤ×ëõz½N§ÓjµF£Ñ¨Õê¦ü-Ä"±V[¢TÚÕL*)шE’Z­Gû€ È(ÌÚðÞ¬#>ŽÆŒÒ²¨,Ö5~lÏmóöݽ´nPZ±Ñc=ÉBªN£»oŸ¿¿àò¦O_ýåÌcQ»7Lk©0ÞüýýyûK”NÎRSn>& ró±nþþþ§Õ/rÔ%¨'ÎñSz³…ŒAUv½²)yJÅÉ$"—¸q­[Þ«›/û$Ìþ©Ï¬J眀ħÏßöz½ÚI'Á•‹*K¹ÄûhåØŠ³hªŸ*óDúgnÃV$Kª ·ãqW²iõ•MHÄ"NÄ ¼ íÃíÿó /`†eÚ‡Úq"V*‘r,‡XIJ,B¨zæH“𳵿…Fæ8ª:]L*‹`-Érù1ÈZÉ•Ž˜*ÿ·Æ ؽ<¨Æ-—ö„´r½ªÀ•Þ!dAÏ–«¾¿Cžz”F‡®m>¾~~é7®MFKƒÄÏׯÖo! 1ý9aͶãiù7Óò Û{úGú)X@’È1ïÏqÛ´qßùô\u)0RÀh;RXMÂ5õ«ˆ÷á»7]dĬRàÊb ¹—Jš’“Ÿ]bÇ€v½‡?߯Ò-\¤ÆLýk†aÙV`ÕMPõ `qÿË'ÌXZ¸ˆ,_~ÂoËÖ-…ÞŽÇÊ-¨}ßI1ˆC„%,f1Æ}ÚùtŽ.%˜ I¥R¹L.‘HyÉ* xYRšÔ+ Pžh좣Z>ÓˆäA}^˜Û{bu? DN-úOžÛÔLAÖ’¸èK—“ª*ˆsˆì?in?Rm I ¥VšöDBQÊþ?Ö®\»÷–ñþãq°6óüѤ¿¶o± , IDATÏ3Ñ  …B©­ÍÔež9tèšF¨µÅ ÏíûûDf©`=b’hÓþ÷éä½:·ïÒoö?m†) ¥‰Ò´ç W×ÿ÷§Ãzå öÏôô‚ûô«õ—–~0ïˆ^90°W;WuÎ)”æƒPplãúÓîC_ìé)ªöjãâóIIWÝû$Æ:±òÖÛ(§¡ªhjèS—¾3ó☵ë‚ìjÝü‚Ô²éº1uÕœy{Tãßú¼ƒ;ÇËÃìéyÉõ~óþ7yؼ‹®¤æ³·¬Jtã¨.)Êcéâ½oûüÆ5»°××Õ×ÕJó† &|ÔÆcz^…òXaÊØ4ïëÃ_›;*DfÍ›Çê´'/Æ €ˆªEíñy'vìLéÑiP¬Óíëf£œ†ª¢X}nÚ¥›Œ— !V&`,4̆‰ÂÝÓGoÛõœý€Xƒè¢‰û»»Xßq_NogÇšõÇÚ:²T“ ¥¡i¼DˆeK QkBy‚mžÂ¿?ž4nâ c'ÜûyÿŸB$.îîîÎrÛ7±n½‚ȃŸc£œ†ªâA1Üüß·‹6ž-nÀ30Ó—ŒíرS›øN“öa`º{|õ{£õlÛ±ÏÀIŸnNÕÔi) +Ð’¢¿þÓ­s—¶;]~]M77MºO×¶ñ:ôýúÒ#wx€ïî{¯W§¡óOª`L_5±G÷;²éªÏ ‚bÛ¶mß¶m\Û¶qmc#\PU#…Bihk®9ôülswºãŽ{ï„Z¾ûÛ¼x{bXR|aëÊ¥[\Ê1Ù{EöóÒÄr‹‹Ptá/K9M7_ðý_çÓo” HáÕëÙ‰c»øÊîR¼}ö¨<Ø{†w~ö•) óD6V_ܶrÙÇ.ÞÒ+}û=3éÅÞA éæïÿýaÛ¹ÙZ#;x…uýʤžþeRYƒB¡Ü‡Ù-`ì>ðçZȈB¹—’q=§ÌîI‡—ëìº4ìt¨û3ó>ÚKŒÒÇŽAúK˧¾ºA>âßò(9²òËyo2¾ëߎ“ÔÍ íõîÂñ¡R„d*o1Ã:·<õƒ‘Î !ûøÚ/V|ðeÄÆù]\º¿1³ËØÙó–õ]óªÓŸó–Ül3{^ow½õ•n0ÆØü. Ä"ªÆÇ^àÓ®¦©5jª Š ü|ý<Ý=›£W€óùllù²R†eY–Aú+«g¾µ!“LÉdÙüåÌBÙâYñÎ5„Ó_Yk%§)ïÔ‘‹7Jˆł:;íèºÏN¥¼úýçOy‹Ë?Œ DŒøÂ¬”mß¼G<—¾ÕRÉ€þòªw¦ý–É ˜nœÝ²ðKÅß/î/5å:”’n.J 2Ïmùê]Aõã1 Yƒ¶½Êý¡ô‹Œt¨p­B¦¬Mï}x fö—cƒ¤_œ²sݺÝgnªY— ¸ÁãGöð«á‰› Nm]³1ùR–šu ð51Ï3’óË?ùéjË©Œ‘ßó1øì=‹¾ø=%O‡Y;Ïè^£&%F—ÅX)ÇV.>³yÍoÇÓnç—ˆxL/2ûfÀx'%ÝÀgÍÿy™"°€e9:S¿ÂÌ·"çК…+þ:’–«c\© *Öcóýpë=sÚ¶¡Ÿìʉ|ë«1mM+üâßioÏ @ÀH\C¤B.UããL‰¶ÄÓÓçyñH±ƒ˜ÐàÐ )\]\mÎüÑ{ÆÛçn„@æÏoþ™»w®åóĵþ9ð"çÖCl[q]sõbëRžÄ2¬Ô#&ÂnçPöùtIìÈQ®2֥ϠðUW.êÓÏß1vðªT Ä³U„=dÝ.606ÄàèZ 徸ºôµÉ?•ýíØû£ùc‚+ÅmÊo»rƒF6º»+ª*:=ë¯ý7G¶¹×¡’’ó›÷ßuKüè?C|% Æ5ëðÅKæ·X=å‹BL•É}c;ø@ˆcα¹.æc•ë娍€¹oËv­‚¥!О¶(s°è®Z…ÄĶ S2f¶–q‰…‹–‡Q¬ç;zøøHX"h4Åê ³£eã˜AÚiö7Ó¢å¨B{îÎ*¨oɦ›§Ï\®éûÆÿ½ÞREnüöþÿí½÷ÝÔWÿ½ªÇ§íNÎNãO@¨„Ò·EL´KYˆ1â3~©ƒ“¨›ôH!˜`ªŠ50` ÐȳIM`®€×óÎñº{KË:8Ö.ƉEßgNV$!@ ÕâX™“ÏcP¦ˆÊG(ͯ*TýSÎ2€"ó§l‰AŸb åþð‰Q'Ö~9'#¾÷€~½;رb -b#'ªøõ€°RG)h J…r·@¤ ÷ãôׯ!¯Ä`º÷]Á©ÏúŒi|èôÉC»y‰`â€ö•7ð…‡¾ý0ÉaÒ’ù’o^ýöãß;}?*´UŸ­ŠŽª±™8t¢€RÛ#ÒÈ{÷ÂE[uFOâD²÷.þéx­åÔ« +2sÇþÓ¿lu>yÇöíß´c×ÐY³dbo -Ž3XÌY1ºß ˆ˜ñæü•»ÎÝ5¬å–.yµþà²÷g¼5í“ÿ<›U‚XþSǶÑþùßÍéúºµ€âÀ1ŸÏ|ÊáIJwßxiÜ‹ïmÑz„ûÙ±`J[ÿÕÿL P0HøììáŽÇ¿_r¤§Í*Ucs6øÐúcí‡<Šs¶šÀÙÆÈ®í«ß~í³|ÅŽS©™…zµ÷ ö` Àpßzýæ7kv¥r®"„dVs–&wV˜ò‹ÁÞ»uŸç§—/H°^µ<úů¾vþéÇm'®ä蕞ñC^œ2(XV˧ìjƒB¡4d#aßjxÕ‡»¾]À îÕÂMj,ÌÑzuí¬d**L9vî–G;悔çlýïWxhß¹áúm” Z؃H¤ V¡?vmÙ£èæ!+È)÷ë‘Âj96’ê.³´àô¾óØÓÇYÊç]ÊÒÜIÆ€ªæE‹ðsr®a~âíǶíWµfs®]-Bž^¤p‰OÂìŸúÌ"ˆa„@ä7cË¿.bX §ö¯ü´u )û·¦õôʦä)•SyèYËgVòr†A¡/¬9:±<’·œöÛ‰7¬ú„Á¸ [‘<ª*ƒª±y8t4‘b£ãÔønAã{òönN" 9µöÖ‡–¿ !Ä”µj o.è3”g·šÓŒCYËÞˆ”1¨R‚¼íÇ¿ÿQQaÐøeIÏUHäÜêÙ·¿†²ÒÊ—×ò)ÛbP(”†Eòì»sì×mügË’¤^bï×fd»®ÁJεÓÈÇ—í[·¯]̸¿Á3?´Ûôëî­‹w—ð¬ØÎ9$ÎGÁŒ,T9Z]äÝÿõç WlÝòý!Â)\B= €Øz96’ê*3Wœ~ìϤË& b§ ¸q¯ ð#£¥‹ å-æDv­G?ßã‡_wÿrZmâƒÚv}Ю1LõÐT¾½´…Œ¼:ãZ¶¶Ú!jˆuð ò’שœj×,VõäOÕøø»u·ùvŸ¼½ëD–I8†IˆóIhçEry‘GÑÚXtU !„AL&“^¯×ét¦¸¸X£Ñ´iÓ¦)>‹º“{Do7hÁŠ7[È©Ni¤6½üMçyóûb~e´Z­F£Q«ÕjµÚÝݽcÇŽ øâ=z´o߾ͦW ¨L&•72kûžMd¾n¾Zþ/!*g*[T½( VÊm½x *Ì©•/U'[¼h㱫‘SxNWPP˜™™™––æííPÇ'$))iäÈ‘ò8áü?'&Î?«õ&’ ÿø*ÞŽ6È”&Âùóç !—Ò.6¢^ü†Í"B"B/^¬{Û›””têÔ)‰DÒ·o_'''™LÆ–»iÇNëØ¡#/ðu`Æ’ÏöŠsLf^Éþ“׿z%¾!G"Í¥ößPuKˆv¨d#©~UžÞºõ‚jÀ¨.!³ Ù"!„€ÀåÔËau|äŽ=ªÑhììììíí•J¥B¡ÉdR©T,sÇq˲ÈÚjÝ&±‚ˆB¡<Ù d±«±“¨ÅV¬êU+µÅ=ˆÀZ³hÛ2Ð*,ÖZó¢ Í¹_Z}ôQºû¨¤VÔ…†al|©‡ãúÔŠäd¢‹W(”:8øµÂ ÃBjf¡DÌLB•¡‰‡Ï?³÷ï+Úõ޲gêžT?+¹äÚés©±½0&ÄZAØãÚiP„—”i(ù\ÈFéIŒ+hª.ø¡P(”ÇÛbМZ^æ º%‘’Ó«®>WÄ)Ý[uJè dmUe?V%7fm[¶"³ÇŒ™õ5ä¬ÊÏ]þgÛ®W3rÔVêâ×'±”£å#gë"䃋TÏB¨WpŸ}]?I¡Pš ȱËÜe-\·8%A¡PK¿ ®6&ØhâKJMŒu´ùìÃ{.›Dps߾̸g¥V¬í²},k1‰×ñªŸ‰P`}ÑíKÉI›¤N½ŸŸ´–öɦä„`LjÉSù‰!cû¢ïweŠý;tØÃÃJn§§«M•«º!H¤¦]AD¡P(MÑ/ ;P(ÍÛ%°1œtòöž“·L¼@ ©Hoàµ:#`"áØ©_ýmÞØ”AÐ/>à©.OÀ%úk{’ ¿Ðêä²I—úOje_1šÏßõû¶ãWnk8g_(! ”¯K²‘•l]¹gpp ‹ "²…JýÁòcG³{øH^}eÿ–-É—³4Œ“_Ë~ߎ÷‘1åV2B@¸“¼jÉöÔ|=áªð.‰£ú†;°Èœ%ç¯/ÞÚ† äù^‹•[)­B‚ñæ®_weÚwyeê0‡´nß™ †>÷€%ª `±j\tjóº)9w‹Ky$uòkÑwøNµˆdåûbõÅí¿o;}=§ ÔÒˆ‘o¾ï\Í(G¤±{êP( …B¡4®W`s¢¤“Y¢}ÄbÖ¼&p#[]Rj0šø1þ"1c6ÎuzãŽCWv `,¬^'š”ýgIÔ„¶A~N-v­ÞÿoATwó!­Äp}ëwË’¨¾C|Dêë'“n‚ÔéÖ“P%ѫڮ"¹Bº"­Ä˜‘´äûÒ®‰Ï qÖ_Þ½yýÈuÖ°1©øÒ!e`‡§Æt±“áÂËûÛµv³ÏÌ磔 !àÔeü„Î"„$.VJ“›Òk²4}ßá;\‹ñ Áe.@Y/[” iÊ´Xµ¤ôvjz¡kŸQÃ}¥¥9g÷ìÜø#ë6gxˆÔh]$+Õaíõ3)9=G R=ò¶cšÀÄõ ( …B¡PÝ+°nšŒ¼‘Ž_ÎÁØì`BÒ!þxjƒù™–F‚K¬&‘ª ‚y}iQNÚÁ­§µ¢àÖ^"¢Kݾ?ßÈÌÄN‚@§¢ ó÷É@Ê? „€Ô«E¬ùL?‡Ü3 N\¹kŠTˆ€€Ø^åãåÎ!D{ÅbižWj—dgë‰K»Œ± ËJBZ©:8B$¡1‘êR˜úíù“· ªT"Y«Ž"õŠˆ‰ TÝÝBV¶ ¥^…B¡P(J³ò l„ D.g*åó07d0 z“ s1kŽ.B™©8#¹*|ΉƒÙÎGy‹€Ø·KçÃGfôz&D†„âÌ;&Ex˜syøqÅ–Ì`#©’è¾îý·5Ö½eâËCcíY!;#×(äoülÆ¦Š£±¸Ð€ý+ŸÚ+]ü{Ëîã—o cĜֈ˿½¥PøBË¥™duc ²¤dë”ÿX«TÜbgoGt¬H‹‘ ‘l}ߊ¢¬…zS¯€Òx˜LÆCGö ',ÞG£^¶0”‚1,¼ÉÄó&Þ`4 ½Þ /Õ—ê îî}©¶( …RŶ¶Þñönãµûx&/ðæáf1Çuëq>=_)—ܼž¡ÓÌË ‚Áž9†ŒC'òõޝÞÛiN!&%®ŒT@0(³y¡"ÆÖFRU·À#á¥gÃ䦌ݫÿ¸bí#gLX@ù줧ü%åkšØQÁ‚¦lv'yÙÊÝúÖO=÷t€¹sx톳åÝ)Áj!ÖJ+¬]HF¡ráÐÕ›ùìÂUÑâó¬ BZ­t*r#@b1AVE²^©R”%ƒz”Fåð±d;;‡.zRUÜßHOù)fXxó)fƒ¡ò)fF­ÖP]Qš'|îîï¾MöüŠ8\tjÓÚÃŽC&'øHhì4}$jåIz`lÛ|ýÛû$´ó®ø÷õ…ûåR‘D"‹9m©þ»½+va7oKV­(¢OO>£Qõ|~t´}YF¢>ûëšäCW4a­ìýܹýWSr A~R¸7šN€pÖ“*E©³·ë5úù¼¯ÜúóÿÿôòÙ{»±Æœlpnï.­tr á! &„ï\Í<÷ta‘ ó”ÃY³.‘\ z'Ø|`ôÅžžÕÏçÁÅç“’®º÷IŒubä·QNCUÑÔЧ.}gæÅ1k×Ù±uy l®?lZã`'ÿ{±ë<îƒ]?ôq)ÎÔû§öžS2ã·ŸFxq÷Ñnÿ:qä×iBõóô âÝ­K‡¹[¨½ÖG¢íêÓ‰XQ!ÄÄ›ŒF£ „ ˜`Žã$bN,@I‰†ã8„˲b±X$U) kR^1zô‹rb+uïŒK˶Û·<_ж««gŸÉ¯)wlKÞ»ö ³b…£Œ§! ò²šUÝ‚òÿ±_ïaOÿ´kë™ØIíüN™¢ükÇñ=¿$ë°Dé50º½¯ŒsŒÔíìÆ£Ž ÜyüðÂM»w¯=iNæè¯’")"_·sÏ/«x©cxßXwË¥ÕIH@ö#¦O NJ:”r`ó?Z œÒÍ/ª›€ÜºŽ^dA¦’Cü¬T]å ‚JÕY‰uïbùûÖv¦Ôø«»©Wð„{ˆzî0 Ã0 Bˆ"WN…c@uu?˜26Íûúßð×æŽ ‘Y{D±:íÄÉ‹q ¢jc*|Þ‰;Sztëô@n™rªŠú=vúÜ´ÔyhŒ·üág€±@mù¦ÆBu«œf{ñ¡×͸öœµÀ_-¯­ûpÁ…ÖÓç>(akòÿìwXGÀgv¯7Žr½÷ªôfÁKÔÏ®¨1н$ØFMb‰‰FML,ÄÞ±$¢‰Æ“XQTTĈ ‘w”»½ÛÝï£s§Xæ÷ø$Üîô™yß)ïˆq4r4}i@Ù®8±F‘„’€jR,ä*•* Ç %‡ p Ç0¬êx[¡]Ðfì×>Ãj›ßÆ3W„ ƒ€Ï.´ÿäJ“[4Mƒ†^UŠÛ!S—Õ ŸcßþÒ~@3Ü œ:™ÚTlÉb€¦ß¹û¤ùÝÀ Ì‚úO ìGW·Å*Âg·0Å·¿Æ£æH5®54ºñDjÚ/×<°÷'½k;ƒ:PH¨#j`Ö}ÎÒ@•Ÿ)ßz €¦u% °´G‡×ª~3€ï¡FZA«Ã0Í|*ЦhšoŸ¦éšÊ@ÍåTV –cá?Kgo}DÕ{FÿðUÛX*•ñðFkAç+ªò@lZEë çMEñ (ŸüöãOÝ—.³ä½Õ†•±qxè&ð[v<¶“Sç_Ý»fÍ‹ p©g§èÙÓþç"ÔSÊ;>ÿã£yÅjÔ#bôìéý]…8€*º·vuÜ…”lZê>ìóéQ¾†8€Ì>µêëçÓ²òJ”€gÐgD{,á¿.§@c§vÃç~9Ø£â&&•¶$µÂÎì­–$d™¹H œw–ÓÍ}‚½xª ®îh¬Ih ™Ê9³fɦs©ÏsdJ–¡­Wû‘ŸMîëZ]w¯Ó`.¤eå–(¡À¬¦—z±;Ñ ù4ÖT*Ø,&ƒ©&Õ$I¹Š~;vAMRŽ9 LœÃæ0pÄ!ŽãÖ³´1 h9ͬy\mý‚Z]3 º^iB ê ™®vSù³j‰ÔsëyÔZ㉬vUßY À‰ºVNõ,RÑÕªn H+@¼s­âýŽ$EI{~>ƒW±Üñ,“9ñ‹È:½9š¦ÞÁh!°ì»Þ,VB *îm™69Ž7øó%3ÌJ.o[¹l:f½v [¯ Xö]¦Œð3V?ûgû/ßÎ`ØÆÍ ªR·N»Y1&f¥ LýsÓš‰ÓÊwnëÌÁÈ’Ô«7_ZG5ß““Ÿ´{õ®ï®Yv‹ûõAÞ¹Í?ü8ßÄ{ß,OžÎ$‰Z¨^@©‚PVfŽPSUjâ÷]’_`•…Lx£O“Ðá†#pùz¦åèÓݸeO.Ú¶tô}Ùž £°o‘ IDAT8ðµŒÕ˜…sÜyòŒ¿wnüv:ÃöÀ¼@!q¿^ì[–÷À›Ï•átCv'1ˆA¤q§pŠ¢ºX…{•Ó 1Èápx\›Í†˜¦. x&,-’–¨yÿm\÷Ùèyýí8MÿüÕ¹ÿmÝœ`1"¦—õëYT¸}ì·DQ÷‘-XÍo°ªÐ‰ˆ÷ŽÀÒÅÝÝ«1»£z~ð˯Îy±r¸B .NùkïÞÓ7ŸÈpc‡À¾Ÿ éhSo²\Up#~çó÷žËpc;+ £53—tIò–¥¿¦ùL]4Ì™W­c¨³Î¬ûþ·”Ü2 š{u:¶WÅùá4ôŠ*¾yxç¡«©/òJ”4ÏkôâÙí% Rkš•ÏÏïßrärjA³ý‡ÎžÖÑ”©õ¡îãÅ¡/?= nS~ü2@<õÔž'n<ÈV0 Ì­íÍ-šZ!\‰›« !-»´~ß3Ϙ¸˜>æL|-òÎ ÞyäÁÔo½‘[d÷ž< ™g^wöä£rû¤õ»™ ß¼4ÚÁŽÁŠaÑÛ6%Za ß!("Ø‹‡ùY¾ügð.»^Cz‡ 1Ø–{ýììËW_ly¢ö$Z¦™¼´Wä²%ERÎZ–ø^J’–%6Ú$tºñ¡ ø!‘í=yXDÇöøÐ©›c“ú/½~ƒ îæÉ¬^&Œ×x¹Q?vºƒf³ZШÝIFa‡ÃÁ¸P-ÐØÂÄ8“Á„Ä*Gp¤´Hàûh«-R+(I¿~ý®ÿ0úõl Ôë‹SÎ_¼Ùn õšŠ®ýý¤XTófhQ­ šÑ´EÑ•“’í’ªÚVDdÄ¿â§ë°IÃËoÛ¹e5”.ÿăU3ÅøåkÎÐmúDõ³a¦^ˆ¸U¼šP©ëlÍÆ \:×Í€Cå¥ß¿q§ÝŠim„ÐNQòÔÄ›™â^c¢\„t9f#Æ¡ö4»ÈN­Û~‰ÓmÄ̶†,¯ÔBÄ@ýRËÃ0ê<ù³v„<)BÕÓ#ß/ý½Ä³ûÀÑ%wÎ>þWjgŸñM4‹Þ@ä¤d(ÕÏW ù®Z&å¾,£¼õ~ÐÀ1s‘‚ø¬b’x™œ¦¶ ³áa„rí"Ú wܼ“­ ãU~„,# ,(R(‚+±ƒäüR Ð:“-³Ss½jV Aåô}éõ•Ÿÿ Döû)I}š„N7>µš.tïìË;ô %‡bMi0BÈ1¯ô’­%vºùu{ú|=ޱ16ͬ¹I@ÑEC-|T¤éw_ËïS+ÈØ5aÂA“;¿i¯ãÐ’,aѰ¥y#7®bõŠóì (ÎäËßcÆoH§¨º/œbv¬ê%ÑfÏ¡‰j8E5[5íÍ@4Òb§Žûµâoqç¯WD9ÖØ¡L—¦:™í0ìÛaL8KŠ’æýñï“!N5&&K’ÿ›oÚçë)ÿ³fC¼Mž_º{OÓÎ^¿_OWž^«jþ<ë6ÁÖš¯_üòÊâsws‰6¶îpˆBÓQð¬}|9Ai’Ö4;2óe$×É»‹®š¯*Ñò°؆vvæ „téíƒÇ3»/×Ë´¬¨ÐG?{ø lÚ@a¥Ä¢I©¦'ì‹c¼x°ªô¤F XðjÁ28L@ª*oõ¬™GVC ‚¬xÃà0¥¦é†’ÔB?¡­OßjDE”häÊ÷S’ú4 nê^áÂ`â4Mªé7Ð`ª½h‹½¼¬´YÉ|¯ \ÀºZhùZ¤!€Iµ­@ênÃR=¸“­jg€C€2}ûân»}¾l” BT9)ÏR6妱•«IusÄPZPNVªL‰« Cñ(ZôqäÃs JÍ¥?¯,0¥žö¬]I—3m\xâÙ¥›r–‡YízמoMº’Ôb5+Vå“%õ°gí|÷%©O“Ð醨‘™pGδv1eAH¾±£5ö;wî4aºi\­’"[‹VÀ±ñµ‚—î=)¡\8ÊŒÓ'n?É}|2u°³7Bªäɽ<ÌÚך£1_œ»)þêƒZâÔoÜ„þž8€,¼²ë—ÿ¥<Ζ€ï÷ÙË"«¿3J~ç×Y_^÷M{ͱÈ4uö‘€‚{ž ›¹·õsç@T%Ø´)>1½“¸FDMÛÑ_Ï¢BaÒïõÜPyç6­Ùy9ýE~ ÁY¹† ûiw'A•’Qð÷òá§ dj¾©KÐÐÉ{9ñqØ@Žrÿ]ÿÃŽ+Ù¥¬íE[ì˜üúêY«îû/X3ÎSðŠç¨ÐZ¢¹À•Ú;9Už+¨×0)’,ŸÑ³¢«Î Aޱ‡Å5u\HýgUÔY§×¬‹/ 6q¨“!õ÷†_¯6Î+E¡#Í ¶¸ûÌ•¾ÉçO?þË×'Nö›7¯—e©å¡ŽÏj3ZQkµ‰uÁ4óuáì=±e÷@g:OfÞ¾—wø¤£÷Ï™E´ä*rŸÊì{÷õ2`ˆ,D0çêéK6‘¯`ÿO‰²‹Ú>w!wB_gøðÏM[ŸÛD/ 6лGÂŒt$©•ÍíÀ÷T’:}Õj:ÜÈûgk¬}¶âÁ‰Í[žI†, co¬ÁhM¡·#=ćBõ5g­D+ÀÄΞFàLR¦¢‹±ÿ\*4´\>>ÖË‹‰ÌëÏ(i{>éû¾˜¹§$hظÅØ£3;7Í™¯X·z„’Å)玙è%&K1G#̬(PÕ³øo¿>Lõ\>¯g­»×«,*ÀÊB”©{¿˜Ïë3nîDiIâ¾õka–›&·©eQA—›’´k·²Ì‡ÆLtâ–=Oücßš˜Tùúï†ØVHL›у¼ U/.ÄmûiÃjó´¶|õ#9*}”t'ÇbØŒiÎ\ùÓówVzQ¥i‹ÝÐ*‚ T¯³Æ„Ö Íi*T§šÊ0´5ÉÌçPÒÁŠSÓƒªzb’aähÉüóÞÍL…›#WÁ˜xy÷™ÚzD¿Ž~& @ ¬0Q—îp^) iâ< ßnc|ƒv|¹âÔß»E»q¡¶‡ÚâÀY(/VV]ÑÀ0r°dþù09—°6²03›hÓ¤®Ù°ýôyÿ¼uÑ,WíÙÍÛÁgJìF£µ?Ço^W¬æ9w˜ÙÛË€iÖ}Úð3K~[{¸Sè,oþ+\×±?oâ¯Y{pULmê2mýŒnÜW™ÖàiORk»3¾¯’äéÓ$´»Ñ´2ŽìÊ®owf“†vm?ù~ÎD~ƒi~ljI¡—£e3²LJÑmB48(R4õŽ/B}¯§™mí˜GRïæ©|ðÉß—dnÃfu<µpÏÙôIž^¬‚ûä'/)BZ~sûÁ'¦ý×Ìrâb0ÜßN91fß®¤>‹‚ 4Í·ŒtãjÖô ͲzöÙÕ›7< žÿç~bf£-¿¹íÈ ×ñ¿ŽÿÈ” §´ aÜéѾî´^nhšgëâÆÅ‚ÃB]° ó÷ìºÓk¾¿€Ð9,2Ä‹¶Ò¬Äþ}<Þ×&¹áñlýÂÝ80ÐÏ"çúL—ÛÚc÷õŸ³õ °×0¸†l!> Qß]$_üi5Ö·“‡)‡(|YjÑ®ƒ£çKø°0åÊíL³KÏÁ=-çǯ]EõëêmÆS>zQVyu¤6DL‰£=yä ?ÔÅŒ[ð²¼bp†|á4ðJÿ4s ’Î&SæVFuî½çe€gÈÅ™w£þC}¶‰‹ ë¯Kñ'œ:ÛÐE¥&m#œ¼u·˜tÝfØËWTrëôá[rQϦ-°­º}ñk—yš=ë†A˜Æ#¿Þ6¼ÚF7ŽA aФ_ã'ÒPGÿÃr˜tðüÄʷа떋+ú*†qÀˆovFUZíÆ*÷xÕö"ˆøñê¥ÊÞe7nÿù±U¡iOR ¤ÿ–óÿ«ÝË:þœx‰Æp‚wV’\ŸyÇkÔ4Ô§I`ÚÜ`òÙ¯Ó=¸B Ãà›i0µ¼ÔKáݔ沃ˆÏãÉŠ D¨{G4@æ‹LS‰é»ÜÖñ^µȳ÷³„[’–2}qú?™Ë˜`—6˜c쎓÷¢ÝÓ“žC»þ6*÷^†RèhÉÑt« /þþ”û9D°¨jËAím'¿_CIú¯™ÔNÂÒg¤På=xªP¿ø)ºç:ASÅÉ-§ÜõwS1Ù‰ \Ú{rŽ¥=ÈSù a­WlSG <™-S«rÏ‘Æé%WGì€ÇÀ^S•ÔÜÈ‹ö5]¡¯*Æ:´MëÍÀq´`¾hïÿŽl÷]=kÝ—Ë¥¾émÛØ}f cGK¦òñc`ö‘¯æÀNh6.S º©¸*+ñ~)ÓÂј tZT¸Ú°¾RŽÆNÚcÿ ¡­j•ëYÕº®Uû©‰Z« "ÐÀBY’yS£Ðký‡déËyåugß1ÔJÂÑ*†ašmïþ³ÆL>Þz¾§–²j±›zM öž$ð!͇÷}‹Ó*"ÀàЉƒù¢Î«|EŠû1ývŠ4Xa` ýF÷·ž·ô[Î'ÝíÁ£3;÷½°Ššç/jè£Â8–]æ.zñÙìØ¯÷»¬ûĵá£L˜8èÓÍ>?²dõq3Ž2/SfÛ­‡›˜‰@^Ò‰Ï,Ãmt¸Ppqß.›N^&ªô¿wïË4î;½n‹ ¯‘#])–ÞxmDh­hžÐòoO«;ûÎ ˜¹&Æ‹×üÄ ˆã8ª5„ž­C­@Z6Øíýø'Îr:÷r¯é Ð³w¤øüQ2 ܪjk-ÛiÄòU¼ØMG×/Ì£M¢WŒèÌiLÆQó‡_›¸g툵£vÏõ³j¥8vËÉ=+ŽÈHŽØ!tLøGn"¦idôÀs«ÿˆ=8Ù]»Mdì’ë:KØx Z8e”GÃjÈkäH{ …€¦Ô$I¾Î *4W@4S¹I±xs¸¶oC_-@ ÞÊУõ<¾æÊ=’$U*•B¡(++“ËåÅÅÅr¹ÜÏÏï ‹’škÈk-&jy iŠÖ\ !V=4ÒEÕ¶ÀSë MSªMÔ¹vÄ4UuÛ`µYš¦¨j‡ZÜ·N˜rÂåö‰®œŠ»ª¢«“<š"©ª_ú娞—º)¤)ŠÒœ~Õ²¿~óJûðNH7xÍ–[ I’š… ¥RY^^^ZZZRR¢ùjd2™X, }ƒåœÐµkWTqˆ*H’,///,,|úôijjª……E·nÝôl!§N2djNˆOrr2MÓ÷Rï î?ø•|Üá87'7áÝ»wõï{O:uãÆ 6›ÝµkWCCC.—‹–Ôo•„„¹\. D"‘@ àóù\.—Ãá°X,ƒÁ`0p¯i¥Œ÷Ÿ‰FÍ+T=…Ôj ®­ŒZO0A Õ¢‚Ö­ÁulèØnŒa¦Å¢Öy=rÔhìZ¬…è[öH@ @€¶•#@ ­*‚7ËöÓ-GGdn@ ´‚ÖËëïáyÿIG·˜½¡2¬@{´@|  D­š¦!â-ƒš¢e¢Î>½vÁ¢Ã•ô[‹‚*J:¸aãéL‚~ß)ùpyïeØÄ©¢q?ÿ|ò9ª\iˆ·—ÿ÷ …¦i Ñ4jÜ!5ÿEZâƒ"˞ݼx1]Þ¸¹c²ðöÙŸ•“ô[“×Ôù—÷ïþíV¡º~ʇë?í9øÇÛ¥ý.Rò+oï» ›²:?áÀ¾£ÉE¨rˆ· ÚAÔªqvtI{ôð¿ £¢x 4biš¦(Š$I’¤Ôj•ŠP¡P(ÊËeeåeeee¥emÛø£âz+WìO’ö‹Ž4gÖQ¾¨âäS§Ò¤]ú´1Ä›¢—5Î›Š¢¹¡x;gîݨÝ{„¸_ è·ý¡i—1®ÔÊÚÊT€Ãw”’÷…üÂÌ®sîuYµ÷ëPq–F¤m‹ö+ø;;(†EoÛ”8he„!“È艃¼xŒ w£†Ù»íÚ˜UítE(KÔžÚÁ©`ÒÊ¢B&´ ùt”WÔæmׇ,ç¥Þ~MÔ{k'Û¿vP· ÊI †²÷_†:}Õh':ÝøÐ€|‡Èöž<,¢c{|èÔͱIý—‡ˆˆÜ"»wðäa0È<óÒ¸³'•ûÛ'5”eð‚;„yò°° «— ãÏž|TÞ4Ç€@ ­@4sÑÐEWÎ?VˆûTÕ¶""#þû§8]‡Mn\~ûØÎ-«¡tù'¬š!(Æ-_s†nÓ'ªŸ «0õBü#À­æÕ„J]ǦnàÒqȸn*/åøŽø;íVLk#Ä€îpˆ‚”§&ÞÌ÷å"¤Ë11µ§ÙEvjÝöKœn#f¶5eÈrK-D Ô/µ<ÔJ.:ŽæÉÌÍÊÊÌ/lú…Š×m@ rR2”êç+†|WQIq_–QÞú!€eâ`”EJEr%¶bœ_JšÈNNS Û†Ùð0 B¹vm…;nÞÉV†‹5Z¬´ëű ón¿s?—h§ë0‡ÎÔÁit*/(\;>Û¢í„N[c¶ž~îf¾å·lï ƒÝ…êD(É/#išje¨O;Ñ鯧ª©@!.tïìË;ô %‡b5ß@Ž™‹Äg“ÄËÆ²\é‡c^á…#­@Zhæ¤ÅN÷kÅßâÎ_¯ˆr¬!¯Ð¥)‡Nf; ûvXÎ’¢¤yüûdˆ‡S9È’äÃÿæ›öùzÊÿ¬Ùo“ç—îÞÓˆ¯‰ß¯§ë©„<ë6ÁÖœÄ/¯,>w7—h#`ë§(€¦yÖ>¾Ž„ 4Ikš™ù2’ëäÝÆÇE€ÄL•hy¨]DÔí’%6³²bã4)—7U%€E­ò¸©¦'ì‹c¼x°ªô¤F Xðjã ‹ Qi_’Áaª†±ÌšY†Ð@û‰Š$iØà=ò:Sûa~dYAàŠ98Œh5bçÚŸ…`äÚÎæLFž!”å••cù{.C}Ú‰N7òº­…‰Ó4©®—Èà0©¢4çyôÊr /i¨TÄÅËÿ¶T‹~oЕ†ˆ(Š"IŠ$Õ*•Z­R+ ‚P* ¥¢\Q®PJ¥]Qi5‚UßYŸxò1€,±5BuõKuÁ£L‚ÌÙ>÷Ó•8E±ó”SM7/ÕBOO [3Ã]ë°·V+êü[î=zþöÓÆÅ•$£DI7NƒQTÄa…œ®Ò‘fFP—>ž‰»WÎÒ¹ÇGƒí„8,[-µÒ€KXõŸ&‚sÄPZPNVªL‰« Cñ(ZôqäÃê¼%€ÐäëõÕIeI=ìY;“.g*Ú¸ð ijK7å,;³ÚÍ@—¥þs»Œãêfʪûª*%:SûB••ÓÀ²ëí·sá‰\›è¯ýE„l‹.É+%à5ƒ2Ô§ètCÔ‹ÈL¸#gZ»˜² $uD'õ´gíÒ'ËiˆÆ¹tå¼Ph‰Šâu”‚jˤIª5–I•Je=ˤrTVÕÚ;9Už+¨'~P$ X>£gE9rª ޱ‡5&Å1 ­ç&µ£Î:½f]|Yð°‰C 鬿7üzµÑp^) if°ÅÝg®ôM>âøñ_¾>q²ß¼y}ì¸,K-µ aZ]VÍf¾.œ½'¶ìñèLçÉÌÛ÷òŸ4Ðbôþ93°è–\EîS™}ï¾^ ‘…æ\=})Ã&Òáõü@Qð”(»¨ísr'ôu†ÿÜ´õ¹Mô²`ƒÊ(ÍH¼PÆ+{zùPl\Žã¤ÕþÂ:…S+%:Rû6¦Å Àä±1”DN™ø¿¸¢ŽýìÙ€ÁçaÊ¢b% DÍ  1#}Ú‰7òþÙkߣ­„xpbó–g’! Å:´¬±,#¤ ^¹$ˆ›r IDAT\ÒÃÐ×MÒ hÐ4Ža4†Q†c!Vã¢ô’ «fÙµôS†¶f8‘ùJ:XqjzPUÏA2Œ-™Þ»™©psäê1eN¼¼ûLm=¢_G? V˜¨‰Kw8¯…Î4qž…o·1>áA;¾\qêïÇݢݸPÛC­qhsÉ` X@!#(ð&Œ¬`†í§Ï°øç­‹f)¸Ò°hÏnÞ>Sb7­ý9~ó¸b5ÇȹÃÔÈÞ^L³îÓ†ŸYòÛÚÃBgyó_¿©s\Çþ¼‰¿fíÁU19´©KÈ´õ3Fh,óãço“s»Ì(W3ÄÖæm™Üω[w÷ ^+%ÚS‹˜_¥,QŽ€¥é¦ynC¿\DCLS8‹Ï/óKÔ@‚7\†^ï¤ yú´ín4M#»²ëÛÙ¤¡]ÛO¾Ÿ3чßà ÝYF H+@¼º ˜L&[›¨T]M@Q^ ÃpGeÕÔ†*òØEòÕÉŸVc};y˜rˆÂ—¥í:8 p¾„ S®ÜÎ4 °ôÜÓr~üÚUT¿®Þf<å£e“çZm1%Žxôä‘3üP3nÁËòŠíȯ3œ^éŸfNAÒÙdÊÜʈ£Î½÷¼ ð ¹ ónÔ¨µV— Öñ+þ+i‹g§§Bó¦Ù b[uûâ×.óh€†A˜Æ#¿Þ6¼2»Ã14 šôküDºâg=X“žŸXùVñãÕK âËnÜþóc+_A†qÀˆovFU”´&NÀ¥]çmè<·*^ˆUí«xí”`ZSûa"ÿåüÃ+ï ¨¹Ž¸ää5ÃðFËpãÛ)C®Ï¼c‰5ªêÓN´†L€QÈg¿N÷àb± Õ§N+‚†]·\ì\ÑŒteY‡—”;Ý‘Œ@ ­¡K+€H+hºV€a†aBÍ=ÇŒJªTVM†ã4hÁ|ÑÞÿÙxªDÍÙø hç(`˜„ équóÙ½g¼G:Ùôû•ðà¾ÓñN—¨q–ÐÈ)ЊÂFRd­Ã†LËîŸ*Üä—‹*@Ó ¾±³–îpx¥ošÅWŽº_ 4ËÐ!pä¤6,Hh{¨5PµV—PØvبŽë÷Þ“$S1ÄþíšÜ7`^¯»À´h¸‡jÙÓô¬Ò:;= n`í`QóºZ!Ô N{øZ“¢5„Úît…ö!öÓ ä¤Î»w_†õ4ÔN bŽ×S?êæ²V3ÒTC^„Î/ZëÅ •»¥I•J¥Ù$-—Ë‹‹‹år¹ŸŸ"[ >Ú¿ïPT¡MÔ H’Ô|,šï¥¼¼¼´´´´´T&“Éd²ââbCCÃÐÐÐ7XÎ ]»vm1GÓ êŸ¦iŠ®i8¨b·V•, y^¹^£ù©ÙÎUí¨b§nPZ¬áZw8 IQhÞÖ|TµmJëÚ]=—$©.+++((|öìYjjª¥¥e·nÝôl!§N2dHSš•wltŸÉum¼°;®9º*Dˆvt ‡HÿeèÈ#¡±ñ3=yo­Å$''Ó4}/õÞàþƒ_©ÁÇŽssrƒÞ½{Wÿ¾÷Ô©S7nÜ`³Ù]»v544är¹héñVIHHËåB¡ÐÀÀ@$ >ŸÏår9‹Åªš¯¬4ó«¥£µ‚V šÆF4‹É ˆAkYÕÚ‹Õ~ªC¢Öjƒèê–Ì›…ÖXë?$K_¾È+¯;ûŽ ¤VŽŽâ‚kVï^]ÄL>Þz¾§–4}È;wï”Ú{~Ä{á× ¨¢ÛÄß0èÕÞœÕ@O¢Îýoëæ‹1½¬Ùo¶ÃibÈTÑíc¿%ŠºìhÁz=aÕmQ¢YAËolX¼=­îì;3`æš/^ó[%‚hÑÄ&„6ù H+h¢P^t-þÐ_þÁCÚ™:ã$ñhÛì…½¾ü)ÚG§œ¿x³Ý@ЦÁ›N›²ºèÚÑßOú‡Eu0ïcœGkD3‘Ä‹7‡kÕäÑŽ?@´@­ äêâÁߤ¶[¼aN@M;ȪŒýÓ'ì¢ÇÇ®`Éld¤(í& Gbfaa«Þ|¬O‚È—¿ÇŒßNÕ³Hî³cU/‰¶‹香4Еþw#y ùh®z†¶R ¢Õh¤<«€ ‹Noˆ°a¤3»BD¥òÏoŒËP«MòJ›0¹Ï´è5÷»ž¯:°bÆáÓ–XÉÕ[µñ¾×䙽­ÙâBÞò†h´V€@ hZA1Í0fÙžÐë›öÆ PÜ?´ë:0å‚’ü25l Š“ãc7Å_}CKœƒú›Ðß³zm¡øú–c2ÒrH±­o÷QSFKXâñöÉŸôÿ~û׺÷ú¨ “~ß´)>1½“¸FDMÛÑ_i šiêì#÷<<6soëçΨ.J:PÏ—>!Syç6­Ùy9ýE~ ÁY¹† ûiw'AUú þ^>üTLÍ7u :yb/'>ug™Ìýwý;®dd”°¶m±còë«g­ºï¿`Í8O¦åˆ#ú@ ïwª˜”ç–Û>S>â%îü3ƒ i¨ü‹[O·åÏW–©éû¾˜ùk²¸ó¸Å &v7º³iÎü½”UoÔålŸÿM^ôÅøîÒô}ßÌÙ|¯LsB&I’ªÇ2uïs÷çx˜»rɤHüüÚE[o—uÍVšñ€OˆF|52Y’víV–ùÇ1 ¾\<¥¿âŸ51 >UTùeÚtˆž³ð›ÙCÛ(þûiÑæ[eÝ@–ÉÒGIwr,úÌX¼èëéƒ|ʪ¼èÊ­"BEi¯~´V€@ xÏk´²¸X‰ ,ý‡ v¼wÿ;óƒxÿˆ»%ì¶¶õÙTJ¡’Êon?øÄ´ÿšùQN\ †ûÛ)'ÆìÛ•ÔgQ°æŽtãð¨Q½Ý¸ r¦&Æü¾ÿVÔâ±®8å7·yá:þ×ñ™2!ð”$Œ;p"=Ú×·!³:}¹Óz¹¡iž­Dˆ  uÁ&Ìß³ëN¯ùþBBç°È7.ÚJ³g\ø÷ñx_›ä†²LÓ<[¿ð@7 ô³È¹>Sãå¶Ž|ùÏÙz€Úͽ!D@ ˆ÷­PŠ¢2šcÃc›u±oá¾s/œM÷ÏuÙÇ™OÞäÒ¥…e$Tî½ ¥Ð+Ð’£¹ÌœcäÅߟr?‡idZXa¢²­‚Üùûï§æ©B tˆ»ª¼Oê?E÷\§‘åiŠ¢8¹åà5 ëô宿› +ç¸À¥½'çXÚƒ<•¿ÖzÅ6u”À“Ù2µ*§±,W®a°¥•^ruæ‹é4÷ö¾¬›·0j®.Õù mZˆŒ:ûôÏ?·· ¿û4s2çôê'-¦,rà ÏªYf[UtãàîKâÿëfÅF‹@´R­€,/TŽˆC¡ïàÞæSÄn\…aKÚK™Œ.(/(%išQ-W aÐh±ÝC‘8ÎŽ…RS€ôÙ²qnœJq rM  ÷D:}êáFV·Ð™8$IºÎíF8› H]™5=²\í…R½F¾Ð"Q¯»+{v;é©Ð'ÄA؈²ðöÙ; ߸ÑgíÑÉ&$ÜCÑ Ù±Yf[‚:?áÀ¾£¡ÇtµHßC Z©V@+d Àá³ ,뢼~w6ß2j¶ƒÅgÒ‚2®Äņu åzáåȨ2SäL+ BuíðÊ]¼[Ævt2aPû„€&)ÃØÑ’©|ü˜}dÇÓÛð·N_„!µ#Qe%Þ/eZ83$µGÇ”¸Ú°ê“å)tz|¡iì—´´4T}ˆjIž¢ EqqqVVVNN޹¹ù뇥x;gîݨÝ{„^+EÓ4 Þ¡qåwYs€H‹9l—tyüš.FÚu´âs3ºÏËž°oÛ(ÛW¼ ³Â$_ì=ä‡T²î5zÀmA|l©–é¦&¶š¦é–XµB¡ ÔA!V Ï8¦”)ƒË˜qDô'·‡õ´ac‹Å2‚Pè7º¿õ¤¸¥ßr>énÙ¹ï…UÔ<Q¥HTúôæ•ëåÜòÌkÇvɳõµO]c;¸ÀLò’þK|fnôéÇfŸY²‹ú¸G™—)³íÖía»£˜X—/=BPpqß.›N^&ªô¿wïË4î;½­ Ñ,ëŸBaél¡µ‚š–9Š"^_¨zc‚E‘¨u5XæÞŽ,âÎÍ,egC„(l˜¹äº×?Mðàa"ëV†’ßÖÓøŽæ˜Iä¼Õ¶2"}ïW«ï´¹x€=ƒ¸ÈIŒ£ÙioC+ JÀæ35’)×éÓg‚Ê‹;q r ËIp¶Óˆå«x±›Ž®_˜G›8D¯?ЙƒAp¾}wãË—/RL —Ðik>íiÏ­+ê⦑ÑÏ­þ#öXDàdw1«VŠc·œÜ³âˆŒäˆBÇ„ä&jdNŒ«ÝS5},»äúÁŸäR6^ƒNåÁoð"ÝY~Å M©I’Ô>À£Éæ@aQaIY I’ºÄ1\ÀŠ _Õ#¢ùCQ¡$ä%ò¼Ü¼üÂü¦˜±qxè&ð[v<¶“Sç_Ý»fÍ‹ p©g§èÙÓþçÒèJBYâW&ßê¹cïw.K¯Íû_Ì“qq;Y² •w|JÏïXK¯îf$¿·vuÜ…”lZê>ìóéQ¾†8€Ì¿°éû gngd+haðÛ~ê^ÝQ²›?ÿì Ñ”«;¶èC\{[øOò#9åÁÃP¤ýqäzzvúÑû#ÝÛ ¤ä’s ]€­¦¨¢›o¤0!ËÌ=@ å¼³˜nîìÅà P]puGc-A¥­µP9gÖ,Ùt.õyŽLÉ2´õj?ò³É}]«w©åŸÿñѼbµ@ê1zöôþšW:s”}jÕ×/¤eå–(¡À¬¦­±£±hîZ?ð»ø£ÕÖq ¬!õrÚÌ;UùâF¾çüÒŸ¦+œUn‘Á%§}ß~*]%äV¿bÙ~ºå訊 ¸í§?ìø„†ŽA€¶4û§sabÚ®:ãxLÛuªÂ@†V_z„L€Ø?zõDWÔG­Œ°V"wXs¬]Å/]YnÀ‹Ö2ýgnÞ§9WŒ´‚–GQqI‘þ¾ QÇ¥e¥É)É…E…†bÃWòˆhþ$Y^^^XXøìÙ3!_ØôO[:`Ùw½-X ¬„TÜÛ2mroðçKf˜•\Þ¶rÙtÌzÿì@v#­sGü¯¤»E”;Sf&&ËÕy é¥-X°<íR*é8ÅË@•ºuêØÍ²ˆ11+]`ꟛÖLœV¾sóXgFÝúûÂ#“OLo#¦J0|ª —V>>°`önªßº%ý[ú¹cÌÐÍ×üyõYy/S!T¦ýu.ߨÙ(ïÜ©ÓÚ´@å³+)‹~NB  |ø ³Ò:w…î + ú´n8ò—¯gZŽ^0Ý[öäÒ¡mKGß—íÙ0ÊS1¸Ùw™2ÂÏXýìŸí¿|;ƒa7/PØ@ó(I½zó¥Õ˜…sÜyòŒ¿wnüv:ÃöÀ¼@!q_kì"¤ Í\+Ãq=ßAˆA\«3]vj¿µÂƒ°ñ­÷õ§Ý—ž!C Ãê›­“üzAáæ¸ÑØu—Ò >|ä¥ò@¿@¡@¨c_àíá}õúUC±á+yD4ê¿j"\‰›« !-»´~ß3Ϙ¸˜>æL|-òÎ ÞyäÁÔï†wA‘g'wìûÿîËû™‰òo^ɸêîÅŒò1ãé…[ »A~Æe‰+w=2¾yi´ƒƒâ·mJ´2Â@Ó§°È0/„PsFK•õ×ÒŸ~x± é~ñˆ@4 ÔzUæ6’$U*•B¡(++“ËåÅÅÅr¹ÜÏÏ®i1¨Õª´GËÊKQQ¼šo‡¦iŠ¢H’$IJ­V©A …¢¼\QVV^VVVVZÖ¶hhèüpìííŸ=îÙ¥fÈr¹¼¨¨P ˆÅ†Zc<}ö´µ]}ˆš*ˤOŸ>MMMµ°°èÖ­›žõ{êÔ©!C†ÔvLSUaãÃ4¦Íhš¢ªdÆ*£Í‡°ÁsS4ERÕNh’¤†áÕñÕ¹*¶zÞê=¡)’¢l%'¶´äV{¼ñÂÔâS– Å ‘þËБGB6þ>݃‹ÁÚVÁëDBS$UuO¿éòjæ*99™¦é{©÷÷üJ½_Üá87'7áÝ»w»víªÿ—•ššJD×®] ¹\.Žã¨³B¼=är¹P(400‰D€Ïçs¹\‡Ãb± ƒÁÀq¼)K´ƒ¨UÃ`0]=P9¼¶VP¥?“$©V«5Z´F‘.--•Ëår¹\&“½ë„ºÚ| ñZFõ-C­¦¤5Õ²§éY¥uö@ÜÀÚÁ‚‡Õ1ó q-FŸq­V˜ë9¬eˆkM––Üê(µ7]˜Ztël $£âœ#ÝxC·õÈ‘>^Dcb!*‚Ö>ø#ÙñM”aó9Q  Õjµ¼D044DµƒxPEÿ-µ"¹îîvÇ5GW…‘õ5@Zxh”y‰@`(FŠâ­ƒ™|¼õ|O- 32ÈŒ¨‚å0éàù‰¨M H+@ ïZ1€@¡P ¢@¼ Ú0h´‘ m=Ò ÄûP Ð*@Ô—{p†L&300ÐÓ½L&c0°„h ˤ@ Z "ƒ„Ä„ââb=U‚ËW/ Ðö[¢¨ûÈŽÍg B¤ Q ÑBÚƒ¦I|H ƒiÝÿ› ý Ä*Žå¯¢R´XæÞŽ,âÎÍ,egC„(l˜¹äº×?Mðàa"ëV†’ßÖÓ¸I£9Utié´'ùíÆ~>ÆEHä>¹ÿó00TGD+ …ú÷šÅ)ç/Þ|¡ ^¯OT];úûÉ{2²9u©h­@Ô¦,ñ«ýÖÝ-§h@éµy]#†È$h•w|RP‡ÏOæ‘´*ÿêŽ/‡õŠôíÒsìòÃädeÇV˜°n\ÿ®þ¡»EÍüùüK¥æ9]ž~ô»Ñ}:ù‡„ùuì?ý÷ç ‘¾ap‡ž«Sʨ χ‡††ù…„ý»ˆ¢ÐKëkïo s“É)Š´?Ž\O¿ô~M(ù£äh`Ë4TbÚë¥âéÅk2n·yó'ôëÖ¥ëÇâg.í)À ª#¢Uñž× þœÞ÷GÆŒ¸í +—Få—æ\^:yó}ÌowÊ‹|ù{Ìø éU÷…SÌŽU½$Úboâ$ E5·I4ߌ@ êH¡Î=ð¿’îQî\L™™˜,Wç%¤—´`Áò´K©¤ã/âþ–i“ãxƒ?_2ìäò¶•˦cÖûgr€,ãøš5F¢¸w|ËÖÙ“±»gxóÉ'qóVüÅ:cm;+Fá ¹SÓ§R$Y£ –Xö]o „+!÷´Æ"j]ç0C7_ðçÕgå½L…P™ö×¹|cg£¼s¤NkÓF•Ï®<¦,ú9 1€ŽÓ]/XeQ2MÍÀ‘k\zîÓÍŽ‹ÕZ|=}ö”ËåJLª¯/ÈËÏ+++³±¶AÝiïš$I¬¶¨LS$IQï@zƌç-±’« ÿ¶jã}¯É3{[³!Ä…­fÔAk¢Î\ȳ“;öý÷åýÌDù7¯d\u÷bFy„˜ñôÂ-…Ý ?ã²ÄûžyÆÄÅô1gBàk‘wnðÎ#¦øÐ“È艃¼xŒ w£†Ù»íÚ˜Uíy²—$ß;¤]¨¯Ûèš‘àJìÜ\íX@iÙ¥õZc ´®Ù –u #sÿýÛ9„Ÿ>§>Ú IDAT:q®ØkÌâ®Çb¶H-ómÃÉ»“"㺶1gCHË׿b½TUÀ-z/YpoÖwßô¿°#üã~C}bÃÓzx åÕ—Ë)**¤iÚTb ÈÍË-**D·H+h~PÅÉñ±›â¯>È¡%ÎAýÆMèïi€CÈÜ×ÿ°#áQva¸æ¾ Ånœ:{íQ0´8uz—  ªÂ¤ß7mŠOL/Â$®Q“ÇöpäWtƒiêì#÷<<6soëçΨ.J:PÏW´i ™Ê;·iÍÎËé/òK–ÈÊ5lÐØO»; ª”Œ‚¿—?U SóM]‚†NžØË‰ÃƲy%#» ”€µ½h‹“__=kÕ}ÿ›Æyb˜^]2Z+@ u' Œ|;;¨7ÿ—^ÖÎþÖYN£F³âN^ÊTz²ò¥íƒLéœJõóC¾«šË¡¸/Ë(M·‚i9@Žm˜·pûû¹D;—A£Ï®þlèÃn‡ÐÕÝPëØSq0‘“¢= h]“ïbºzOþ‰Y構ݧ†{`.?n|ö0~Až ¿.7rß4Ù•ƒAeêÞ/æÆóúŒ›;QZ’¸oýÚE˜å¦ÉmªŒªUôl•ÿ«øS‡/vÍDërS’víV–ùИ‰Nܲç‰ì[“*_ÿÝ[Ž&F¦M‡èA^†ªâ¶ý´ˆaµyZ[¾úQÃÙ´6cš3WþôüÁ•^TiÚb÷´Š Õ+,´ µQ\iµúðÙ´¼Ð“©F‘Ÿw'ì9t5«óìcÃÐ…6løLMNØ?Æxñ*eJÈ“1 ¼nïN’4Ä1ÇaøÚÃá ìÙµ{Á˜ÝûÇmX?Ú_w’@ZÓ@ꊥÕÕ‡Yp¤5½ï|z®Ññ³rï˜c¶qXÏU?Æ%‹º”J:Œô×” ùêõR«0¦À2àã±þ=‡‰0fó²½wŒ·¡[CiV ŠŠŠ Åb±ÄÄôMM™Éä2Ô£ Vð*Ü[;¼ÿÕ?iФ´üæöƒOLû¯™åÄÅ`¸¿rb̾]I}hšgÛ6ÄϽÍs.Ž=hݵO·@}8·Î}-)[åjË’ßÜvä…ëø_ÇdÊ„ÀSZ0îÀ‰ôh__^ß;­Ë—;­—šæÙúG„¸q±à°PlÂü=»îôšï¯±L&t‹ qãb ­4+qÆ…÷µIn,›~ánèg‘s}¦ÆËmùòŸ³õ 0Ó·;C6ˆ>PhšÎÍˑɊ_ÛŠöÙ[1"‘Ö[MªSÓR[álcmc.5Ó¡2mº|ì°åÀ¡£/oñÃÆY[ð;[¬=qì7ðÈ´ÛgdI\mŠGéТ#¿J„Ô¾?ƒ.KýçvÇÕÍ”!€€!´:?´g—ï‡OŽ;toÈÿš—;á1””“•"'SW,­¦UDÓ-'þø½ð¢:tq1â’ð!þk¾ÞsX%³î,e€†J¬¡zÑ2(@\äÞÎßdû÷³UÀºµÔ‘©Ä”Åd Äo0 „Š(*.²²²BÃiúa;ô«I¾U;ùKooør¨rïe(…^– ƒŽUÊý"XT!Êj&÷YF¶†(*"„rŒ­Åà^AEÓª¼Oê?E÷\W!IQÅÉ-§¯YX§/wýÝ@„¸´÷äK{§òÂZ¯Ø¦Žx2[¦Våè™MÈ–VzÉÕ™/öjV¤57ò¢}DMVRÿï·4Fæåç„ÒÑÁ±UÝšID拹y9¦iW>033kÛ¦-­¨1Ó€N¹Ÿ’›—[ó ä›¬: pÞ°rK®4j¬=›ÉêØÃjýúÝ”ÅØÅ1£ðI-FïŸ3‹hÉUä>•Ù÷îëe éÃ3/$”ñÊž^>—ã8iµ¿BUÖ‡/SvN¦<âŵt9-êôUL3_ÎÞ[öxt¦ódæí{y눥^rƲí*Þ}dW®¸g¬Ÿƒ@£°¡áÌ{‘’‘aw“½F½TÅP~wë7Ë]½m¤"X”þïž#¹ ŸvvœZÝWK¯#±Øð‡)‘HŠeÅÈœ+iz#°öðòª²ATR,‚°T#ìVŠÄ5g hê~] ¢Â¾Í`á€Ò˜ÿ¤Ôà}¶lœ[U×¹&,nêôõÿöÎ;0Žâìÿ3³åúÊz±ª-[.rï½¶)¡†’ðK€$¼ï„~Àï“@B^’@h ä¥7C6ͦ›Ø¸`Œ{‘Ü-¹¨îtº²»3¿?Vw>IwÒIw'|Ï'N·{»;ÏÎì>ß™yži‰`Ÿ®]•¼À!¤( ±Î'ÅœF@ŠÄüʼn ˜ç~B¥þ”+Œ*€60imµ——ˆ¢&¹\#Q“—›[{¨¶ûpA›«-;+[–e†’èíK0)+)Û½g·5ÝãCsÙs/«üÓÃ,.ÒbLræ\\úÔcÒò E‚Bú1?ûû3iùÛ{Ï=ðf«¬M+›óóyË+-œ±lb¥uýË÷ßé–ù”ü‘sî}þöËJu#OÓ¾O^xsûY/bZÛÈùw­¼®LK°\˜ÔÙÿçÞËúÛ?ü•G—9ýæQ‹G‡9K¶xmÙÂɦêµü ²#Ž›Ç]¹$í³UÊ´y…kèᾌy_¯4…¤šZ>õ¯¯6yÍy£.üåã·^œ#À=Š^»¨‚>Ü]H”–1¼@\µgÛ)_e‰c$ÕmÝãòÊm"Æ‘MšàÓKrïÑ£(kÉ0=‰´Ã6ì¯|cÄÚã>O"Úºß%䔤 +¡O'Øú\L>½´å gxhCY–“j”à\{Äp“¦c”Ѥ²E1Ÿá’}É3[–3¬NHäó¯ñëk!˜,!}Ò ÿý¿×ù]žŽý2ÝûÌ‚{_bÒ±øÒºåïþëò½X|Ûª¯oíø-Òä-¾ï ïUûI!£ÐgIF ü|ã, sßšßÛÙ(áïËÓ!ïKàv‡_zïcv{ªUX`ãøŸü ÿ¶7û°öG¡ÃŸ¾ôz}Þµ÷N0GìÈ’”É7.ËúÏê•’k—ËÒzë…‹/ÑsÞÑð¿2f™Qãö¯¶žÈQf„BÍ^¹`~¥U:ôÙ+¯×¥_òÆYFaT6õ¹˜á®Ðäú®¯9ˆ`¬8¯Þ¿I8L¿cÂõøbŽãºö)Žëþ£0³Coèrˆ;…RíP´)ÅÓnš±d„™ëׯ„Œy7_±þ±÷ÿ¾fæ¤Û+Bښ¶m««Z *¯|àg?ièñšûQÌÐWhBŒÊŠÒ—…%a¬8¯üc–l%fÐ }Åb¶lÚºiꤩ‘‡ÃñÍ–o,& ¼.¤èÙ»ÆcŒ)Š"I’Çãioow:­­­N§süøñ1lŒ*´KΜÎ_1F™1ÐiГQJÏ%Ûéò“ÎÇdŒ2ÖQJŒIÈNtFÊ: |†þc”žÛ1Ä>¾£ÿüéÏ>šðè ·×bufTà„¯¹óeFTÌî?éz…ŒRª†Ghÿmßož=c><ìúY{ý(Š¢6ŸÏçõzÝn·ËåjkkS[ÃáHII™6mZ í¼ÿÀÞÑ•£JÆ·k÷Îáå]Œ¹ùÛÍ3¦ÍHªŒLªªgŒíÛ¿oDùJ©Çãiii©«««­­-))Y¼xq„UnݺuW_}5<€óÿé±k—úÐnhjhuF”Ãçy‹ÉbM³ªCë{÷î]´hQä-«¦¶F…éS§§¦¦êt:F¾€x²iÓ&§Ói2™,‹Ùl6ƒA§ÓiµZQyžçyžã¸à´(]+ü ¿Õz 3ªÙy³ËOºŒwâÞ§Þw¿ŒÐ¿ê™aAkJÏV˜eÌç CQÏ b 1†ôÙ¥e¥&#4~æœ)_=ý×w_z»ä®ëªR8Ì\‡×¿W½~ÏÑf”Z0rÎ%—Î-6ä=øêïŸ:<ñÎ{—å {j^øÍ?Î^xϳÒyDß>óÐ[ü ÷_Ö½ñÑžÓM­nkS F.ºâÒéyºècK/§oQ˜o1[lé65è9ò@ÏÕ)NµŒ   ˆ‡.»ìv¯6¯¼ÈˆýôñÚmò¸Ê<Ý •±è§uU‹Y3.›ñåc_}¶k阙¦3kŸ~|mûÈÅ—Üœ‹ê¶|\ýÄ3Þ_þbIž3:Ÿl=|Ü©ä¥qRãÁ£íŠcß)ÏŒTñÖï­§ÙK 5žoi±.¼æŠ|­ûôŽO?~ëY.ã×W”êËUiln”yÁÜf“¹W/ÊátlÚ²©¡©!Úѧ@ÏÕ)Nµt°z+àæCXÄ €þ>>tiiiiV[NiÅÈ,¡íø±ÖAì(f±A=Ô¹£ñéEYq¡3laŽ Äq½€Ät¼Á;å8•šŽœ‘YJ®…cˆúe‚ºR3DŒá”•ÖêovÔµŽø®Þ8zùÃþ¯6hžÈï[·gÓ7ì©ÓnºtŒ™`\vᜌÇ>ùqñ”,T¿mÝg¶…×–êbŒá´ÑS³×VÒš2gaO„ÑãÓ?úø+šºðšLÖRð‡0tWŒ1˜žÈ†Æ»½%%%Z˜äåæoýv‹,Ë æ/J¬×   Ô—¥4©LI)E,ìÈ&r`]Nåhþè±úÓÇ%ÆkŒ)ÃF嚃² Ù^_{ÒËx%oxqi0눅* º3Þ½þ¥çÖ#¢±¤[³F,»uÞÄ’Õ±çs­¸MóþšÕÏÛ‘%·ü¢[–ÏÎ:\{’R9%¿ú¤³j¬M@§Žœ”ýÑeb••ÊŽäŸBÄÎÍTŠÎß`  ZZZRR,Öt4 1™;gž¢ÈÛ¿ÿ!”pÂ@ ä ½g`>HxoÌ*•Y¤‚7 )E•E&ÿ¿xð+[”õ Ç\÷#íTõ+0VÿÛñ±xöUwÌfŒ!Œ1FäÜ&„S&Ýò‡‰ˆ`‚B8}ö+g"Âa„B\Öw¯\‚Qÿ4Œ¹ýáJ„9]I`·Ûíö–”‹Íšž¸]/˜¿!´ýûïRSÓÆWMHê q¨‚8 àŠ †î ·§WqÂxŠ1‰6F“.%꾈Á¹°.ÛTAø’N{ô'Ædˆ´Õª$øÂ@]P/¡Ú¼PIì#P‘âིdk`cÏÌO))©>I²Ûí¡ [T3 aùü‹O¿Û¾mÜØªÄ(PçÞÐt³*-ÛÞ{oÎò«§¤ó8âMÑÆ 'ŠAä†õÿüçæœkïXš¯¤Çcφ6ØPX5½%ÐýägÎ`@0ÁËJ|s±«bÀn·cŒlV@"òåW_lûîÛ±cÆ-\°˜DZˆ zÆ€¡õZ‰ßz0‘Nÿûí}Zã”û´)V+£&‚Aûžõ¾¯sS~õT¥½n×–-GÚäx^´±óX$ܱäú§ct$þR(Ö‘ššÚÞî†J$&ÇO›0~bÂI„šx†Comþòþ_ð“çþ¸,WÄáNOiGJpù¦h]$—¸Úúõ#¿üÃÆF™!Ĭ99Åã\uÕ‚QiîíО=sÏ¡—Wþ®æ?Y G–ùž DÕnyÞçó‰¢&Ù .I>žýÔb´#÷gÉ2Œ)£7©ŸlVH@$.7\÷£„~I¶1LTÁ@ªéØG«¶ûDvàœûÈ0î,cç®"òMQ¹ÇYôý7“g¥œKï»e¬ÞÝ|êä¡Í=ó«5«—ýæáŸV™ÃN‚bÁç M”vH‡xÔ+ˆf³¥®¾>/7WĤ’'ëNšÍ–îï~ƒÞ`wØ-fK²Õ„ºúº d’ŒIâ^ˆTAœTsíYõþ™7ÿzú+_}sÛ˜‘ð‹¥ÆM¯?ûÒ§;ŽÚ…ŒÒÔÊHà"z؈O{Ž+è¯*`ˆ1d6zÌè#4ç¢K­~à®üñéÊ'îœeå±Ôò}õsϯÙvÈÎÙʧ_sÛ‹‹ \°øa…ßçøK¿¸äeŒª¼çÅGf˜ˆjO{ƒÑ`³f44ž­=T+Ër=­xÞl5xùðšC5'ëN¢¤ªq åçåǰŸçx‡Ãa±D*®‡:tÓ×@Õ)NµtpÚ(c„#psPñP´eë»èä{çŒ*·MzýÕ_™|IŽ€B̽çùûV~À&_µâš±yïo@ºŽ«¿)Æ(>cþü§!š‚ ÿã¢ê;ß{û›ÆiKS޾ñàý«uËnúåŠÌömo>ûÄC8û©[Æhع¥T™·6ä>óرB§eVc¬‡M1+èáý7H&8wÆ(Fˆ1ßÙƒ'½ò©'oûÁS¸ã{J5 ne8ꈨfÌ×pðDÈ}J);—G†1†ÂîÉt8Ö •U†5Ön‹|ÿþýú-ìû]K‹Ù¨‚xŒxj?üü´ÜòÚ^ÿ†ê²R…2ûš=×UL41„Rä@àl‡'­Î¾ »i UA fÀwzïI‰Y‹ÓxEVvÂíÜX® tçkÒMj9wÚ°ûœÂud*R÷»g®T ´ZmL¼(ð~€D“±Ån·wi,ª bU@cé2×¾5ÿ¶ç\v×SÒ:&¹³–?ºæƒ­c§§¤—Õ»·w,×cŒÓg(ÂoŠm(,Å#{ƒø¸`æ=ñásÕMúåät _œÃye¶ùyzrî1É| aÄdÊ(ãRŠÂì#5ÈÝâ–ÊŒ »g¿®¼gƒ TTTìÛ·Ïãñ€)€ó›½{÷F©Ÿ+**@ý  ú¥ bÙOÌ{Önuå_=lyN O¿¢[ÿ¯×>ÞÚåÌŸ·°ÌD &Ô´cö“ÙSòÂìÃ¥W‰k¾ZU=ü‚a¬¹Í6iîðp{☀Áf³Y­V°ôþ^I€*|U@íÛ?Üá)¸f’-8A?—5evá+¯~°é윥ÙÃ.àaÓk/}øöc8Nc¶Ÿš¯ÃŒ1$…ÝÓ"#UÀ¬©dÓê?®\ˆ.=+»`ÂW^6o”UCcL[~ýoVZ^|ù³U~ßIµ–ÂI×MžWjÒgÞpñ†'×½ðÑ”q7—‡ÙÇ<ñ'·,þë«oÿùŸÖZueéŒòüÐ{’Øðu€z„tUUVQI’<O{{»Óélmmu:ãÇïõýñÉŸÌœ6S’¥XúÜT¡ˆp]Sátúš1ʘ <Ær.–6ì¦XA0A¨90~lWEiF)í¸Mê1&NTº ²1FEˆ¨†Þ©+=3„0&¤›£²T9?`~EQE–eµ½¨MÆår9N‡Ãáp8233§M›Ž?Eñx<---uuuµµµ%%%‹/†*ƒÈºuëjjjJKKóòòRRRt:ÝÀ¬D$-›6mr:&“Éb±˜Íf£Ñh0t:V«E‘çyžç9ŽÃ~ºaèDcBPˆ ×Î_cŒƒ;½‚wïaSl ¨·¸‚~Ÿ²« è~ùJdôg¸}5#´û}Ù=H†ØÚÆ ƘR ‰Ä @R¨Ê’Ë$ˆ0ÌÂMƒôY‘kjkNG²¼ ¿ ;3{h«9:‰ SÿG$BƒDƒ²²²ªÆU%Õäd†Øžý{lÖX&2Žk'Œ¥”çy0H$ˆ6W[vV¶,ËI•Þ`RVR¶{ÏnkºuHÄÅc3›ÌÍé©éÉVe=œ—“×ý¶Aàq@4$ádlŠ(bhÀ†G⢠ªÆVíܽóÐáCIå2ÆÊJÊr²sÀ ½ ®Eò•yàNU â„q’°²†súÁ ÑúÇ,ÙJ̆¼*w [9ÙÆ 0Â) HxUÀEñŒ+[¶¯^½ÛvÁ533…ÄèËÅ dÎ%PÀPñ+ m‡¾Ûq j¥Œ‘Ä(3Fçà "ˆ¡*ˆ™‹,Û÷ùÁÚ­µÇO;¼œ6=ø¤E_PNY‡ô`ˆá*5¨ð;ȱq‘™÷ø‡O<¹ö„X8eÚEs³,¨­þȇÅú<1+5¨vÖ£÷‘}ÇÖ¾¾ö„yæm¿¸´ÜÀcŒªš<ƒaBdg'QÀ\‡×¿W½~ÏÑf”Z0rÎ%—Î-6„òÚ´ú͵ß±KLL}é-7N³ !ÙqðËêê¯÷Ÿt’Ô‚1K®X>5OýD$Ì ®I–vîÚÙloNÎâ——–æ†Üät:mN¯ÏKi­'Åó¼(ˆ))):­ZÇ ©‚˜L!rù|ãY~ä—tH„Ô‹{ð.IDATL‘ÉÁc KõkŸ~|mûÈÅ—Üœ‹ê¶|\ýÄ3Þ_þbIž@Ϭÿß·¶iç^ö#Ó¹¶&w–‘CŒ!éĺgž\¯uñõ—¦yöòÎÏbë½?(5!”ƒTteûŽí……³fÎJ¼Ҍ±­ßm­?Uß}ʦæ&{«= W’’$I’$·Ç›«Ñh  š*ˆºîѶS§<,½8SGºÍòÿÉb®š>?2÷Žëåj ]ž%ýñ‰O?:8󦑢«¥j‡•Q¬'¨a„cí?ü²±ðÒ{.ž’ÊcT”jßýÈçßœ\ZR¦&‡F8±â Ñ>l´:Z %YJB˜2¦rÌæ-›³³²»øÍ-ÍŒ±â¢b½AŸd):ÛpöìÙ³m®6Pƒvh † ¥ˆ!DpˆC1ÄX‡øZŽžòéK*ÒEµ ˆ¶ŠbígG޵H¹93–ï¬~öuUÓçÌž>.ßÈc$µ?ãSßzøW«°_ÁP±Å«0-U½cm ƒí‚0–T“dPJ Ý'¨P…1¦×ëEI*›`Œ e”2 Mcð¤Y \db°¦ó¸öXƒ‡¦uÝ4TÀ£êbʧdû7 ™³WÜ3âÀÖ¯¾øê•¿~õï%?ýéÂ<ŽÊ ÒT\¹bY¡&K ¦¸è—-ÚcŒ1&„@’J$­ÿEQ˜Ÿ¤KŒ*ŠÂ(ƒv1ˆí1OS4s¼qÏ–ÿ=§pa¾¶“.` aÄŠ(ãÌùYü—Gö7JE¹"BHnÜwÄÍÛò-„!†ÑfŒ˜yyù„±ïþù™¯7ž˜yE±)ׯùNŸb©“2´äœ¤Žö‚J”UÌp„P‰LûL,äü” ÑZæ½xnõIQü¤ !4wü°{¯ŸN¶C]8Oš¤¶tÉe¼üñ㟘=ed̈́ۛë7Úf]ŸÏãñ¸Ýîöööööv—Ë•™™ æPCFX†pdAôûø²BŸ©Þ~ÿsL:­Â°LeÈá–ÿô⺻¯† Ô ¾·›*®¼óç%ë>Ù°wý;ë]ñF[Á¨YŠŒSÇ]4{ǪMk6T–_R˜³hÅmš÷×l¬~ÞŽ,¹åݲ|v®€“'v~¶ñ°Ý‡hɯ¼ôÚÙY Â`ÐïA¬Z$§Í™¸ü† Ëý3|0ƈ„ÄÒ%·Ý·!B0BÈX<ûª;f3ÆÆ#‚B iòÝzï‚Àïß#b,™sÕÏç¨ÇÄc‚£½à~õ>ƒ( DQÔjµjèÏó’$ɲL)…F$­Ç€ücU f¯ãyž¢Jkh0¤eÿ»h¹aý?ŸßœsÝKó5ÑÌ\`=ºe}_úu㮺G_ûæíß]ŽÏe„G>ʼò)È'#O&÷Óä±*õ@¹¤@4Â,vÇøӔK¿@@$èÝñ¹]Σà™nÁÕé˜CîÒû "Uð”Pì{Öoü~Ö(¥,ŠÕ“Â-§ªvó÷I/1†^Y»ûËíÇ]nIýšÞ2$S¤P$S¬Pdw8ý½ñXjê®ß»»Î8rü0Ae 1I D#Ô“Íþ aŒ,óN 0ƺŒ¨-U•’$©=£0P$¹»@ý¨j\ª Ôv”œ™ àöókæÝ÷·ÕÌ[Ì¢ +ùätyD,,(D8  ¨ëÐç/þó__î©wH‚)#oÄìþ×&¥‡ Üìw©=‡^^ù»š<þd¾W5‘´É—ªI&[fX‚ FXVäÁTÁò   Ô?yžAí…éC¨‚.Ó‡¼^¯×ë ¨›ÀV„ª€¹k^¹÷ׯ×j‡/\rÃ¥i¨õèÞ½-Þ8¿5YðÅ÷û¬÷¸‚Ž~º¹íÁç6”å,Ÿ4B¯åBËï^¥nR(»ë‰÷C‡L(¹ëº¹ö¶vì¿lÚúí_ïò+ÝäkV\Ul”šOÖ"fMk¼ö»ÔŒ1êÿˆÀ,ÐÑ“Í2ÙŠËBh *]/ÑÆU ~æ8N–eA’Á ¹=†À "5ÎXžçÕæølI§ ˜çÀëy½6méÊGVŒ5 #„f/¸ˆaBtrõ#¼òýévÊ›r«–þ䎫«ÒyŒ”ÆõÏüå•-ÇÎ4»$¬·•Mºê¶”8ŒmÛ÷þóϯùvÿi±”]|ÿC7йåûêçž_³í³•O¿æ¶8Æbpí½©‚Hâ vÔžýãk[çOSQ’uø¬kt寿º‚'ˆã°È!Àix¢ÓðF†Üât+ %¤#®ÀW·u‡C;ûW?»~œºÌÔ<†0Qý )‚R‡Ü'¤‡1„Ðñ—~qÉË!TyÏ‹Ì0‘ž$@ j“¤IçvªÓ‡T?|0UA°6PçB `”‚UApö!5ÈX}s¨ŠÔq6’K¸öýëã:aâÝWWvHÿ;•1†-#ýø¿–¦èÙíÕO¿ñ?Ï”ñÎ~ê–1w]×N1 Wá ¢ê¯kÞ]è’ESÍÑÓ.CûO´Š<ây¤á±Èa‘C"ò3ÓxמḻZ°?Ú˜K-Ì@ëv~úm}Ŭ<-Q#8cyk{/u˜}L4„cÙ–ÞußÂLc]–‡÷9|†Ø@.,¨ô»Ãn1[’­àuõu¶ŒYˆ†ïU¨¨¾!$&¹Šà¼T¢.\ ø[Àmãýž® ·;ÖÎ2Gå îvb6iÖ0„Båiu_ßùéŽ3ÒD3ÇcLW0nÚ„áZ•%{»›»bH›šW\”'bŒ{Ì#‰fŒÉŠŒQ0ð /^s¨ædÝÉä2>Cùyù6«m`ÎÆ÷º‡sÌ‚t8‚YC¤ +SJÕô\<ϫdžhï¯c­0†0!¡Þ—rÃÖ=ÿÖgßiò硼Ã#Ÿ‹1„±˜QdÅŸœuȾ³ûzŒ£&dk]uŒùžðʧž¼õ²§°ú ¥TÓЮ W]ö¨£{^ŬǸ$SÊÆ’B½ åÂ|J«Kƈñ„鬰V êJ"H«Î49ólfÿ…Üù·?1튽¿øø£7úàQ×ÜÿÀUåb¥g)„ý™(F½¸6j¶Ú McPx¡¢¼" ÞÃ(Á™¦z»½)Å’–i͉‰Th‘šùsAÕÔ9c, Ô¶€dSÄ”›%à]êÝJ&ß9sŽ\÷þo~Ë5ëÇwÞ8"•Õ}ô?Ol vãÙ9‰†GT¢”)2õÏ= \ Sdi'ÜþàåZÿãI$ÑÆ¡«æ–e›Ÿxgãì©ãÊs­;ÚçÉ8Ì,pˆ'˜ç0OÇ!·G>vÚþÖg»]8¹uë±ÇÄP2iTÊÛŸjHIq¯¥k™ôfDD4iP»Ý-SÊ÷˜š”avnö$)–Ô–Ö¦sZ¬ >ò]Á¹€^UÓåO0$*@úÑ×Þ2oû£¯Þ}wÍÅ '•æ¦rmg¬ÏY~CqYzçý7?4Α£kªoG‚à@aõOÆ2W]»4óîwþ=½rÑH›ÆÝìΟ6³°ê‡eܳæ¿ÃW\0&Sëm®wæÍ_Tn"† jÚñïoOdO-0ô;qI¸hÚÈc '–gþnÅôß¾´¥¥µ`Ú¸R„ð¯·K²y‚QŠI›•f\6¥hʨlÎ?ßÊSûÎß>ô /ȱ±ãøæ÷>iæ†Ö%‚Rç‡Ù'¤óÓ+ŠÄÕ_®ª._2 µ´Ù&Ín¹(U H¦5Ç?J€Ã¹ë}rBx°)ÄC'€€äVˆ¤Løù_©|ãͶ¬yfµCA‚%§|òrç-»ë§O­zë¾ô!„ƒux¶Ÿ n¨‚ŽÈWÆ´e×ýæ7æ_^÷ú£Õ.¦Íœ~såÔ‚Œáׯ\iyñ•OW=ö¾“j-…“¯Ÿ2¿Ì(¤Ï¼áâ O®{ᣩU+ÊuýZÞ¸÷UÌ"[¯ ÏfüÓí³}cÛ‡_:.™WE}ë¡e¤ó%ás}+Qª`“¡õ›Õ/¼×âEH0f•;ùÁ.Èàâ#)uè}HH3Ú&ÞtË’¿¼ºêÏøtÖª+Kg”›H¸‚#PÀàKp¦éTȸ‚~;!'Qy ê4SY–Õ¼C^¯×ív»\®¶¶6‡Ãáp8Z[[ ôiÓ@$ñCQÇÓÒÒRWWwèСâââÅ‹C•‹†O¾ødÖôY’íz#ŒR˜£Ž bõÛsè1ÁêTF†ˆßofT¡ˆpÄ4ëŸV¤ŽBvû²ãÐê·;Nßõ &¡ý÷;¾K-Ú°yclÒ„I>Ÿ/£ɔ¾²nÿÖš¦º3-o>x!ÁD ]KYðÂbc„1 î½Ô¡÷ mÆÀÍ8gØ6!ÄëóîÛ¿Ïl2WVTFÒ¸Ö­[WSSSZZš———’’¢Óé,ëa$¥½OH3«—Å  #t‚c ºÇ„ kŒ|èTÄRàP€‰`ˆJ‚äŒ-íU0Ô‹eYñI>Y–eI–dI–åŠ\íí:Z[)¥„ŽçxŽçžçyxç^Å„íMgâ €„ 8– {\A—àÆ. ¡W‡TÄK*VkÀPU,IUA´ÑÆØß¯~@˜\˜aP¨BÁs„Ãû7"Œ±šÓ9a ÑÆÀ .– {\š½ß=’  öJ  TÀ2ª`h©„‘¬ÈaãÞ¢1Æ¢( ‚ Ñh À« †Ô‰CIÂa‚Õ¹C‰lmÀ ¼.A¸Ïª 8W¤O TÄL'$ ª@ 9U€1îa¹®È-£ºû½>ßÎ+a <áb ºÇ¨ñ9ú:ŸTÄL  áUðräˆÏçkhh0&8õ*Ä£Šªñ<‚ ¢ ‚çõª @@T’ xl.xâ:J Š¢,Ëz½Þãñ´··»ÝnÇãõz}>Ÿ$Ið;ˆc¢Ȳìv»NgKK‹ÚÉ DCÕØª»w:|( “ 3ÆÊJÊr²sºoR¿äô!P@4ªÀçóq§F‚‚ÓOCÓEQšÎäe S›`@ QAQºÝ'©¨b x¬ 8Ei°—ªNÄ3ÆTI<%ày^’¤à¹CjFpP@LT!Äëõêt:0 <Ö´Œ†¦ÓÖ´Œ€÷¥ÕjUUÑÆ@¬TB(°`pc`ˆ@¥‹0UÔPU·^•ªvñÕoÔ¬f)U‡TI¬@Ѩ¯×‹r»Ý  `PÈÏæ%èp¿cf³T½³<\œð0  ‚?¨[½–(‚P³« UÇ\üàvˆ%P%A—pP@4ªÀãñ0Æ\.—N§C0ƒ„àX‚“§…Œ+0j"P@”ªÍM|7‚3“ªc‘œTDÕJÉIÕÁý.SÕHƒ@Ò¡€$€ &ª@ 5Öét4 Á±Ýã 9ˆ ƒV«å8,D) º$< ƒÀÊeIjŒ‚ `½ Û]B(¥ÇÆ‚õ¨ &(ŠBñù|Z­VE0 Á±Ýã DQÔjµª0UÄVtI~øwð‡> €*€X¶Õê P''*ía ªˆR`Œ=š€ Cp,A÷¸‚àtò:T½§:G»þá>#ÈAÖJU‡¾‹0P[` þX$IÄV0Æ9éÀ ?ÂÅt+¬>« P@l…꼎Ú)øÜeŸ.GU' ª@A¤~D!ƒ$b® E d£ƒhcˆáb ºÇGªòT'aÐEt‘JPa¬ Ô]ÄH æ508õhˆáb ºÇ¨¡ŸÁm¬ÄV nãÝ·F( @@\„A—ÄDÏ]”H ¶ª Ð% €ø.– {\F£ ^U T'aÐÅéïy+¨¸V½6fˆ!ª*Ðh4z½¬â’õð!„ÔLÁIªüJ ª¥ev‘Áˆ9j® žçu:Édr»ÝŸ|ò ˜ƘÙlÖét‚ ô5A$ô[ôC €*€•Ñ´Rˆ¤²q'Š¢^¯OMMu»ÝõõõÍÍÍmmm’$Or¤u²97CîúA0iiiÙÙÙiiiƒA3Ž05$ b Uðž†<ê@F£1éééc½^Ÿ‘‘áv»eYû€œ€çÞ€Áó¼V«5™L©©©iiiF£Q£Ñ¨‹Î»HôÚ &8?„ ƒc,Š¢Ùlöx<>ŸO]5iý@¶D­V«×ëM&“^¯Wge€!Ðö¡ûà<@]6[–eI’|>Ÿ$I²,ÖÒÎc™N|¢i*ŽãÔèQÕPc5®Œ€*¿TQEoÀ80ª °ž!$Qâ U ¨6èòoE nËH¨˜å  U¨@ªP$#ÿ^µûÙºIEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_design_reports_group_by.png0000644000175000017500000005730712235000130027272 0ustar00murraycmurrayc00000000000000‰PNG  IHDR‡ïÎýsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìw|TÅÚ€Ÿ9[Ò ¤R!„"-ÒÔ+ (ØÀˆ×këgãªWôŠ^Ä ¢‚D ðÒÔ+öN•ÒR$Iv÷œùþØMßݬ@€ytdÏÌμóÎ9óμS( …B¡P( …B¡P( …B¡Pœ8¢žëõý«P(ŠÓYß¿f7?|ðaF£J¦P(ŠSÃðáÃq µþ•îŒaaatïÞ!ÔA¡P(Î$–.] àÓ€^ë_O#‡ððpÌf³2 …Bq†€Ó8ªý+\ÿJ@x9hš¦ŒƒB¡Pœa„‡‡ƒsäàL€ªyäJW“Û‘€ÉdRÆA¡P(Î0\ízN£PÛ0®ïîG€9( Å™KÎQCmÃ`Âéfr;!­F …BqfãOMàSsîÁýÈ¡¼¼\ …â ¤¬¬ œÆª ƒÃõÑp ·#‡²²2 ÃPÆA¡P(Î0\ÆÁš†ÁŽÓ0T÷#‡²²2t]WÆA¡P(Î0\ÆÁ‚Ó(˜qÎ3Ô0 àa F …BqãÑ8¨‘ƒB¡Pœ½¨‘ƒB¡P(ê æ …â,Â5çP/Ê8( ÅY„¯ÆAsw±¼¼¼A…Q( EÓà„Œƒ”ÒÝe…B¡Pœ%¸5 …B¡8»QÆA¡P(uPÆA¡P(uPÆA¡P(uPÆA¡P(upk µXI¡P(ÎjÜM(ë P(g3Ê­¤P(Š:x0êØ …B¡8›Q#…B¡PÔA…B¡PÔÁí©¬'z¶’´ç²â“Y|øÝ¶í>Ì1̄ĤqÎy1¬/­‚MMÏqå8À§Æ1kõ~òŽ90„×2‹¾W庞 ø59¡ …¢qðpðÞñ'h­eê]·ñØÌoX½ó ÅºŽ®—S°ÿw~úb5FmarîØÃá’rt݄բa/9Âîµ_3sÜC<ÿk>µˆK¡Pœ%¸9hÚq6àF˧¿Àü=vtâé{û\ß³%±6ïÞÌÚ¼T:„hû¾ž5ƒ…¿nfWîŽ9 é2þóÒ´(aó§3xká26í+#¸EkÎr·öM#È$0 ¾áÿF¼Ì&#†_{•S$ë'ÝÂC_aíù4sëLˆ¾‡O&Neñú]ìË/EAD§µã¢koæ†Þ-ðäL“)¡åè×yu` &Ç>{ò^Y[À¯_í¤´,û×-<¿ÞAÀùÏ0ûáŽkv¼;š;?:€Ñúnf?ߟs5€ …Bá#_z<GV0çÛ#Ònz‚¯LÆß$@HX4)„ìûøvÑ/l(Õ1°àg¶Sâ'ØTΖ™pÿÜ?pè(ÏYËüI÷±¹p*“®IÆ*%º¡£ëFeƺ®£WìÞ³â·_7‘Sª#5+V½ˆÛ–’=þ76ŽžÊ„A X½µßBäØŠPpÌŽBbC0kat¼¨ríFŠÖ-g¯­­-y¬[q]×I?¿#ÍLÊ0(ŠÓŸ¶çnaŸ!‘DÒ%+?Íi0޲wËÖmØÄÎ"缆$Œ/f³há">õZ’ŠäOþÀ¡[éxË>š?—é·¶Æ„Á–÷ßeu±Ó`ø‚sÞ$ŒÏÏfñ¢ÙL‹å¬}7›Ç¼§³ãõ[0èj®¸éŸ¼»MGF^ÆÃ×µÄ_3Ñ¥/™B /å×6Œâ-üœ#‘2…¾YX”mP(g »Z©r²BC«þŠÑòíÌ|â1|äa¦¬=ZcNCh&ÍŒ¿¿ÛŸëÙ¥K¤_'®¿´‘A¤_<ÖB@Ù.ÖçÚ|65Ò·4§óÕI²x;›òÞ‹OrR"ñΣD}ÎÓ¿ä€M¢5ïB¿ ø~ÙA ~ÿMºD¶8ŸîÑ–¦7Ñ®P(ÇAƒsD*‘B ÈeÕo±W “†aÞÏmªf5*ß_]id$HÐ,._Ø1ò>Ož›,þXttÝûZÿ7¯½:•3ç0ïÉ Õ xù'|½ß†Ô"éÖ?“ìùæ[~øj=åRÒâžÄzõU) ÅéCƒST†tõGØ9ëY¦|¾‘Åv$Ò§¿_\{’5(_ËÇ_l戭Œœ¯?e«”Hk2m¢ÌhÖfİ~㡨.›Mvö-ý–R"­q¤†[¼ "4L&&a§àp6i!ȪÑç]K{>âõŸŠ1dK®¼0^-uU(g :!ÉßŸ¶NâÇü=|6åþ÷ª$†^ÿ|y>#/ÿˆûçà··áºwR†$õº97TCˆtœΗ_ä“3ãN.ÿÀŽó0")âËdžò“?”—9'¬£\GçPáÕý³cÚ]\󾆭¤›4Ð I`Ö@ºGš¿ ëÀõ}›óó¢ÃØ%˜;^AŸXåRR(gö9ÿ‚~st_ž˜þ c÷$3. ³î\Y$š‘ÔþoôNðCxjEE ío}‘—n¹ÖÑH‚c2éw狼44M€¤ÃíOóà¥çjÆ~ôsÍ2éyN–Z‰6ÂqÌÁñtü“niG»¥ºš‘IÑŽc–Pj ,áÜô/¦>ÞŸøJ·QW "Y €îWv%B­RR(g ;r@`I§ßÈqÉHYsN@4¡!Dã>Yˆ„f¢z[-,ÍéxíÃLârE ¢Æ·˜Æ¥÷U§å 4Ms¾_ÄõB(!4„ëšÍfÃßÏ”„Š¿ûËÁÒZ¶Å´~»^y©ª<Ñ=—ï§çùE{(3 ½¿ø9#uª>>×ïñÐôF¶Ìxø ~nÿ/&ßšI`}çm…lüñgÖô¹CJ÷=ÇŸü4o«/½ˆk»G4n¡}ÉëdÊóW1JÙ¿i{ƒÛ•ÜdO õö@T„ W#¶aýtC¯îûpþ)Áf+§E|û–ϤÃù­aÅ!Šwåc.)åϯ¾DFÃôrõ6þð kú v6Ž'r޼«Žö·¥KJP½u$¤oyv:=ÙxÒ»§ë¶¼ûðSüÜþ1^¾µuýmÙqâkýþUN~»däñéƒ7óÊƒÚ ç2îÉä‹ü‰Š'>2Ð÷w%HYïÈJú§¡ð%¯“)Ï_¢|³Æ=ÍÖÁ¯ñFr0MñÕØõõ–*B„&дi›YÙ[…ªÞ–aHþع‰µŸ¿HÛä(Ò‚é’u+ÖsÄ^JÒãÿQÑ0Ýñ ï¾ó ßmÜO‘ÝBHt"™çãþ¿ûðñŠ<+{{' €²¼7îY¶ žÌÔ¤@¯ï+¯î¢*ñNN<>h$SÜ´­îy‹Iý#17¥ûÏ“Þ=Ö‡‘±qÄG Ñ8«Á|­ßãátZ%R7ЮáÉ;;\©IÁÉ¡˜¬VŽ™ÀeuÞ­8Y8}ȧZ ÏÔÛUôr].ââ ]wdgÃ,¥AyñŽîøœv‰Á$D”¦„ :‡ñÑ$\1 élÉ0 WòÊãSù> Co»Ž´`;ù{·³C ÅOøÐØW ?aã ¥³Ž*ÜS^³•øÒvœ "%†®£' áñÛ;Ri`5‚’BÑ8A=54žôîéº9Ž?K¡5ZY|­ßãáÔy4BShß¡#ͪ÷¸„@Ør˜1ú^¾Èzž™··Æ_`?ÂêÿNcÚ‚ì(ЈjÝ›á£oãÒtCjÛ!~óï,YË®1-S @VN°È¢ULzèE6g=Τ‘íª¨ÚØÙ»ðYµšÇt,¡‰txÿ7,‹ÈŠ.M=yùG?²÷¦òî÷É9XŒ ºÜû ÏöÅâðVö2r–¼É¤Ùß±ép9Ò/šž£žá‰ñX½…ù`t÷¼{—ÍrFìðh6/öE“…¬_0i –³%WÕªW¼ÁíÂ0‰RÖ¼x l¸˜)Ón&ÃOC[Ë37=ÁÞ§1åò8, ÿë2üU+cÞ¼æ¼Ì¬e»8˜›":£CGßÁÀ–A^G,õúY«»@„Ʊ£ÇЫ5dH(-9ÄþUsHk®“RŽÙžÏþÃì(°`ë|5–޽Ðü+ó±í[ÁÚ"Îè.Ft ru\þ†DTõ íGX3ÿ-Þ^´Š&¢2Îcèÿ _Z¦Jy«¼Å€QÂæÅoóö¢•üþçQ´°V\ñø“Ü’âLkϬ{¸ò=§¢Úy—çz…ÔéP5”qh V¶–!I´;§=áµÚg£[ÄÆEoóÖÂlÉ…¨Vçrå­·qeÛP§Žô#¬xïý°‰=¹%ؤóÝ/ñT__§½ÂûËr8xävˆíp1W÷ÐXýå÷¬ÚU€h–B·ÁwpÏå­\†ÉÁ¾EÏñÄûkøó˜9$ÎoæÞë;a•òÖÑ{×»å3ûîù2ëY¦ÌÀ_æñÃ/óþòÝÌ?Š]Õª+×ÝyÒ+êü([ÿ7“·.gó¾b¤(Q ­éwÏÿ14Í¿Ž7îÌ4ÒÀ0 ŒŠÒ Éõ·ÔuôÊIør¶e?ʘ\1r wÄ”°bÎk¼$úk8›ÊŠüÊÙþÁX_À [䶘c¬úpSžĽ6Š~>ù ãPOüƒÝåá÷ÐiÈÆ´€ÂBB¢-•nÔ¨óèÅ1X… 6Àé`¨¥C>ù¤O…N+ÝÁÒÀ¡ëèTk 4 ‰]<Á˜9%œ{ý-<ž&Øõu6oýs,¥/?ǰ4?„^Ħ—³'b0wjK˜q -­&ã»VoâPüuüß½øÙÈüéÿåµu1œ?ìzþoX G–~À›o?O³Ì)ŒÊðG‚°¶—pÓýid»z>¯ðo¤OeL·0LÞôîạë8*FúQ§Lq×rïè–”üÁ/ÏfêS&Þ¸“A:»?~‚Þ?D»«†ñÐÍQh¹¿0mڬϵq]ª_D¾ÖïñpêŒÃ¦—zÕĪïÍ1å­QdÖ*½,^ÃŒùûi=êMFõÆ" ]L>KG~Äç;n¥c›š7´Q¸’÷þ—KÜÐ)–m,£Ååh¦9Ïñ LîB¯®™ø‹®t‰ÏeÕƒ?ñ]Î(:µ ð8g)e=½%W˜Ó"X½z5‡Ý^Ê‘õíOjÈQ̶<öþyˆu» h}Åâ2/$oã& Ys‰ )º/Ý»g^ŸÌí+æqnßþ\>ð":'`dÉ:Þ›€ŒÛ¦rË%QX´‰ÊcùèOøbÇMœ“)kÈ'‹½ÇoŸ¾‰Yï"òÊ ).92š³ïÇøjíAìç†b’ôî©>ìTNÒ;§f*dêDÏ¬Öø‹,:Åbõ˜_ù>§œöIyoî.Â.}†ý=“ M`äaîôÁÓÁÇú=NqHÎ3wu&Øäl°4ksR­ÂQ3šýðö”9Ø?ùV.›âº(çÀø*ÅhS3¾#o{mat¦9+Ihµ¦ù²ÇN–ý%+w¢T ÄTf`)*C÷1/ßä©’Ëyo;mõ”ÝÒçr†vú‰7Åö /gÈU¹ U8f~-=‡ùBE#P!§ýÐfv•‡pN×ü+ÊáŸH·öA|°ñwrmÝ oKŸd³ÞEY·d6þrÔë†a™ÿ+öÛÈ´®aå‘hztŽÀ"þt*Q™Ÿ_L:Qâ 9{‘Q~´ =‚(ÍeÏŸyl9,h7øe¢Ò»c6[+Ó¨™‡…„‹F3¥ç5lúå[þ÷ù‡<ùé´ú8O\—õÐVþ(wp`ê\ýZÅ1g]ù:†ÞÚõp»d·Õ¿,äwrÊ‚i—‡_õ›¥Ú|…¨ÔžgvCm‚kVŒ’¯cìí+焵ÉýÀïì.¦]Vl•üâ9·] s7m!×v.!ZÍô*ÝQ²öu3ÍZ„#lØ\a~ÍIƒßC7 ¤¦shÅ'¼ýÑ×ü¶+2-S™¹¨ ‡7½{¼^åJt/“ÀJ¤ø’Ü"öÜ-ä”Ò¡g••êIÔ_:37Á%Ñ&³Úœƒpß` üévﳌÌô¯vÀ” 2 ³8R3¾Ð8‡r'Š}ïBž|:›’ nã‘‘m‰0þ`ñ„‰üøWò:yê+»s†Œ{‡n«–0oî\Æß?—ù#žgÂЖZS<‡Õ3Óïì…zlmjÅ­è²J0EÑõ¼xÞøôgvæ—óí®pz<ŸÐUóX¼ú —X~boX½ýp7†&?,èØë¹Ùë÷WÉ&„ °°]×9zxƱƒ´ˆ,C”æ²cï!¶ "¡çD¤uÃd¶VéXºë‘ L1´¿èzÚ]8ˆsþŘ^e~÷¸F·£ãOÖè±ü#ÿšï_àЉ#.±*\ ïñ:0\ÏDF¡Ògo¸m0jªÂ·uð§D§ÆÑ²uá•ý5›4*ËVUNéj'ª­þª–vU{\÷ºÉjF`s©4a5tRbß»˜gÆÄÑ>7ñÀ?2i&÷ñùKSø¥¶~jëÝËõš2¸‘UóÃŒÝ00t;L˜ªÕ¹kÞ¾æïkTKãís8µ›à*{§ `ŽH'ÁRNNÄ&§š’BZJ i)ÉÄ›+’AêÎùKT&ÉÖÖ-ÛCÙ *­|ßvê© 1žm[ѺM[RC«Â}ÉëDä©¿ìa"©ÛUÜ÷ÜëW?+#µuñ‘Áˆ¢=,[ð%ù¦Öœ›`A ḛ̈ˢ³èyž×0 C þåùì/Nä¢K2Ñ‚ˆ¼µ?±ò8z´¨'~hg†Œá‘ÿŽç?Ƶ\Ò6 ¿Ò|J[ô¤w‹Ú¤ZYøÝÇÌÏèO G(‰êÊ…­CÝ®òòÅŸ R§á«•iPn¸2æ½ÀDëP.N]ß}ÀÜñ\ó@‚+~çJËýÈ¡êzõ†Xʺ†ÅA,sYüágŸŸI|@û9Ñiò ÷V®§Õ–Á½Lz"´#×þ-”§>|‰©×sa‚`ÿª¯Ù-%m<ŒÀ·ú=š¼q€ÚÞò"/„Oçí/fóÜü"tÿpÒzÞB¯þ™„Z¢ùÛ­×ðÃÄÅL_Ô›®£Û>l<¯„ÎàÍÙ<· »ÙŸ°È¶ô©Ü½(Ñ:ºî½y¶&fì=‡y9û}ÆmC–àhÚ&Vlóó!/_â_Ù-G¶ñÃóYŸWŽ”þDfôæ®1CHóؼ„y½•´pzÜ~/ƒž‡ì OQM×á™\Ð&™–#þËә¶ð5ž8,‰L?—[ŸÅ5­ª¹EL1œwY&¯MÎç¢ Zà'ZÌyôOÁŽ~ôMð;áý+¾º@*X½z5»wl&?÷Û_ŒLϤÕù—V£ç(Žœª4*F]„Tø+ g.àH9` &¶ÕùÜ:v}£Í€™Ö#Æ1.ì]Þÿêc&..Æð#¹Ûº_ÔŠ`K½o¼‚Ÿ§.aæç=è|[†÷øš?­nxš§Cßå½%sxaþQ¤ çÝÚžIQœ{Ë(ú¿<›'=‡- ’Î×¶¤WFHW@Cm‚kxR5R»a¯ÄJêuO0.à]f~öÏäADj'nü÷M\‘æçZUalê‡Ú׫™‚JãPÝmeNÈ÷âµ?â¥ïlX‚"iè\•&B=è½…û멵ep#“¬Ò­$ˆŽ7ÿ‹û,ï0gÎD¾)$6¹9 0k^æiäàî1µdggÛúõë×h¯ ”†Žáq¥sR®öJ"Y¹lÎ%¸ÐÐ*Â¥ë7¢ê7µããÚ¼£‰ª< Zžd•®Í-•W„s—¨ð,[ͼ|‰ã¾Ìõ–½¢ÜT¥©ULv{ «×o+òÓ´ÊòÖЇ§4¥nTü®âRí:wWf‰¡ ™</¿ý’>çõÁî°{”þ={0 >½/@ÝnGÝŽI3£™L˜Íý¢êCt‰@°bårÊle¤¦¤Uó—Wínvi!p+T­èÒ¨ÖKuºLkܧ²æ}ç5¾»p­ú=#Ý\¯‰æêµÿ¾õwºtìâö™>e:¥¾¶ ºœ÷ÕYNÔHCºy–ë\wÝ—š©j™tü¥áªçŠTj?ïžôîþzmêÊZ÷ž¯<È}÷‡ÜûÈÏôšðOó«ó¬ùR¿µY²d Æ ‚sÕ1×çhµ¿K²S2ršÉKÙýJ¢Ú7D­@´ZÇ{ïój%W:õDõž×‰Ëãñ·nÊ]o˜£˜}{r9æn‹‡Ð‰O&6@ó(/ú@1³bc IDAThÔκn»+³—òÔÂS/WJ‰îz;–Ó¥!°X,X©½)Æ™§«K‹†¬ì.9w»:òʘ®ù±Z9ÖêñVê |µ®E…‹¥Ž‘q¿nxõN‚p{½–tnÊìžS¡S„æÃѵç%k•UhÕö›x».М™Uë4ÕÎßýhÍ:t¯w·×kËàFVá )íìýa ëµXâ›BÑn~ùäSÆ^JXKM—\U.tvâœn%ECbýÊø{§ð»n¸¹­üèõÌ{<Õ%¨I]âìUyhÈh&²cÇ(--%00йOÃÕ¨Uü¾úµÊZ@Yi¥¥¥˜Ì& )ÑDã=|'_¥Ó&€qŒ?·-ã¿?ìàÐ1Í¿-Ú â‘›® =ÜÕ¦2ŠCk~ “ôõxK /.¦‚7ÿ¸”’àà`Š ùæÛ¯Ð´¿¶ Ï0 „&ˆ‹¯LïtÆéœ8± i¥Ó“„¡ó?ÆòÚMM¾k£ „‡Éh_ë÷xPÆá¬Ãw×MS¥¾ÉÓÀÀ@)+-E7tŸûV0i&üüý ªÌëtFºÜ:ýÄ6*ž$*–öW¿æÁ0€ïõ{<(ã 8í¨¯!3™L|ÂùœîHœnÝ¡{§tzZâkýÊ8(NKT#㓘¾èKéôôã¯Ôï_EÅi‡s²jÌ|B8õUµÌÔ=J§§)>Öïñ Œƒâ´"4$”Ãù‡‰hqªE9mØ™³“ÄøDkà•NOoê«ßãEÅiEçŽY·a;vîh´MšgRJZ¥·">.Þc¥ÓÓ_ê÷xQÆAqZaµXÉê”uªÅ8­¨¯ÁW:=½i,ƒ®Œƒâ´Cõn¥SEmNí‘Ý …B¡h’(ã P(Š:(ã P(Š:(ã P(Š:¨ i…B¡ð€ÝagÝúuääŸjQ<’Ñ2ƒäÉ ž®2 …BáÕkW“œ”LŸÞ}šäŠ.)%+~[Áþû|¯ƒ2 …Bá¢B’“’9\lcÏwï@ñŒ!Áp÷R-Ñ«½BÔV¤DšèоË–/#.6®A ˜2 …Bá)%;ëØuáþÅʧˆ2ìÎsÐ.Vk”Q2 …BQev!4ÎKõo2öá—]eØu ²qÖ)ã P(^Rb8ß+-e“=èH y¾+/(ã P(^p!÷ÍÃ00¼¼ûûDQûNÇ!¾Ÿ>ž ‹ÿ ÜSéGXùÉ Þ_š‡ãTÞ[¾ÈÑTdU(šRJ ©cH£òy'ôqä±ü£7™ùó!ìÆñ§cHCê^'­O„3Ë8¥ìß°‚å9%÷Kól;™qß ÜöæfŽ>hÝ(dã?³f†§¥8þä§yóørû ÈÕø"GS‘Õ Q¿ Å_DJ‰ uÆ8Øðý‡sY²µ‡”Ȳí¼uçuüãõÕ ¤~Œ½ë–²t§+ÜÓGwº–ëM§À­dptÇWÌx{.ßnÜO¡ÝJht"™ÜÀïF¤ézå;˜5îi¶~7’ƒq›”‘ǧÞÌ+[ j{ê2îÉä‹ü‰Š'>2Í×^^^¥i H}‘£©ÈZ_êW¡h`*zéRº¹áŒ<ßw#7¨Ý—Lüû¼}c ~n~&¥sY¬Ðü‰ŽK¨jsʶ3sìSl½vo¦x¾Ï i ÆÉ5²‘&8Œ‚•Lzl ßöà†‘ÃH¶“·wÛµ0`# ﺒHÝ@O¸†'ïìH°V¡yÁÉ¡˜¬VŽ™ÀeBCSO“£þúU(–Š iÃÕc¯h`8 ô„ëø÷]©lÉ5âb1#Ýܯ²"agÇÒÏÀÇ^p¶9¸FF5–¹tC:çA|ñp'}ä`ß¿œ5Eþ\8æ>nêäj€/F"ªzêF!ëLgÚ‚ålÉ•DµêÆÕ#ogp»0§հ콩¼ûýFrc#ˆ.÷¾Â³ç;•´çÝ;¸l–3­fóbïк }h í;t¤Yu³,–ÌÑ÷òEÖó̼½5þšûVÿwÓ¬`GFTëÞ }—¦arWHÛ!~óï,YË®1-S @Vùðd9KÞdÒìïØt¸éMÏQÏðÄ€x,Å«˜ôЋlÎzœI#ÛU3^u4ÉÞ…Ïòè¬Õ8¦c M¤ËÀÛø¿aYDš…orøÇ“®ûÇbqxÓ‹ç2Z½…ù`ÝÖ¯ôvÏ”²æÅ[xdÃÅL™v3~âØZž¹é öÞ8)—Çaù_ÿ“á¯ZóæÝ0çef-ÛÅÁü£ØDÑÝ:ú¶ R#–³ŒŠ iáÆ8¸ïÐdÚwìP·=‘i;Ä/ï¿ÊÛKÖ’sÄDt«(˜\iK[›ÿu}YwfâïJs÷;£è?ÃuŸÿë&ö©ÙŽR¢Ë“=rh”¬\6O!Z|Κ/—³¿í…´ð×Qmu˜såÁÙ%t6’'Ó4v~5‹iÈწxÐ5Å˼ê%Ó⹌^ËïµëW¯ª÷ž i݇V¦WùuûQ.‹ &ãj û–ì)ïN˜iË6–Ñâò4ÓìH) LîB¯®™ø‹®t‰ÏeÕƒ?ñ]Î(:µ   ³£h$ Ã@Òåª;r`Ãó\sé U×z1aö?él[Á¬Ïs‰ö*p=cçF³ë«Õ¬¡jr¹*¹ªïU÷¹pºjå-uÀL Ä)˜¶Òâ’û™ÞkëþŠÏgóØ¢lιáIž–‰ß¡Íì*ᜮ økšó!ôO¤[û >Øø;¹¶î„V6àÎ¥¶. îõNÎ3wu&ØäLC³6'Õª!5£ÙoaO™ƒý“oå²)®‹®a¦ÿ¡RŒ65ã;ò¶±×FçαøUÈ/´²øµ¼œ¡~âÇG±ýÂËrÕ@.hŽÓ$Ð4·ÎªZØÉ]ñ1Ó²¿dåÎC”j˜Ê ,Eeè>ÊáKœjZ­¡k[=z±ôñ\Fï察Úõk÷åž oKŸd³ÞEY·d6þrÔë†a™ÿ+öÛÈ´®aå‘hztŽÀ"þt*Q™Ÿ_L:Qâ 9é#‡²­sxiQé™)$F#ŠrøyÞçä™ÛУ…ZHnÜ‚;?|†ñþg@*ìüjsö'2üŸY„zó™£hŸnå“o²™×fi2☞\Ü&ì¸W˜háÝøÇ Xî›?ޱÚpuŠÅ¿ü0ûŠ’éwi&¡¦`bCáðêïYñG½’:s˵ÉÜ‘ý7reVAe¿³§¤ªá³ü•Å+ ’R# °ÿÉ꜌À‚4,òmµ’5&“8æ0öBB.jGbÀ!ö­ !õËáKœãÕKÀá¥ËèðR~¯x¬_ßîs\o¥¾ËÔìD ¹d«K¯‹ˆŸ9“¹F 7<”„ŸšLPÔBJ‰¡® ãÚO†ëJQë׆Öx^Mþq´ÎèÄÍ×&sgö¿yܸÁõŒmq=cÕÿ«HK"ÍQ´«vŸ§Êl<¯„ÎàÍÙ<· »ÙŸ°È¶ôIq.}µÙÆÌg}^9Rú™Ñ›»Æ !ÍO lÝ¡£ëÞ+Üš<˜±÷æåì÷ÿµ X‚£i›X±iƯ^9|‹s|z±x)£Í[ù½eé±~“}»gL1œwY&¯MÎç¢ Zà'ZÌyôOÁŽ~ôMðS{[u•=|êöÒ+¾ÿñ1ãŸ[3,ö^ýFÒ‡>ˤЙ¼µ`¹ž±6ôNÂä.=-Œ·ßÃÀçg0g¿)ˆâÜa­¹ ³f;& ç§±æÜ= –ììl[¿~ýçÍG®!Z k'Z­‰P)ªáWpç‘û=®°Š© M«³ÓY:†ÇÕ@îÓ–•çªTˆ¬¡U„»&¬¤¨úMíøN–kc]E|·åw†Aµô=PCG΄š¨Q^¯røÇ›®½èÅ[½–¿><ׯ÷{¦âçΠów—jßîÊìì=¢™”9‹øòÛ/éݳ7_m,Æ®›¸"+¼Î=% ½Îîh\Ï‚ó–÷þ†^÷~«¼ÏEûµ‚…« ÐuþíÙº} ]:vñ©Í^²d Æ ”Ç\Ÿ£Õþ.ÊNþ„´>K!„†ðØuõ¶¢§þÕ>B3yé»ÿ½ðÖx f2PüúòwŸŒ7ù ‡Oq¼Ëãñ·ÞÊè)ÌQ̾=¹s×!ñÉÄhåñEÚY׽ܕÙ[)Îd¤k¾Áð0©ì½=qÅ©ç9t{¿ÕÓ†tÎIœ9KY ÷E¿2þÞ)ü®»{£½žy§ºxØÔ¨P4ÒuÌEåßMˆ yŒy©”qP4´æ—0yA_“áB¹t§)%ˆšSÇMêÓØv‡½ÁÓ÷pð^ÓQ€âlB¹nM“Ò.Y¸ªàT‹R‰¡Kü-¹Kºßs¿ZI-çS( Àé²imfÓ>;e6Ïñ4Úqî3iüåQ±Å,ÈŒ³"¥ÙÜðN åVR( „†„r8ÿ0±Í"ˆ µžjqê ìÌÙIb|bƒwê•qP( tîØ™uÖ±cçŽ&éQ‘RÒ*½ñqñ ž¶2 …Bá«ÅJV§¬S-†WËh)ã P(^hŠ#†“Á)=xO¡P(Me …BQe …BQe …BQ÷;¤ ýdË¡P(M»ÃκõëÈ/È?Õ¢x$£eÉ-’<]Çg4x> …BqÚ±zíj’“’éÓ»O“\µ$¥dÅo+Ø`ƒïupo4 …B¡8=),*$9)»ÃÞ$ÏœÓ4í;°lù2âbãÔ€yØçÐô,¤B¡Pœ ¤”r$vC`ÎwH7ƨƽqh‚Ã'…B¡8U4ÅQC%$š:•U¡P(¼ k¿Ö¸‰qRß§lƒB¡P8iòÆ¡‘†n÷9(ÛP ý+?™ÁûKóp4Ý{Ä3ŽC|?}<ÿA¹'ùO÷2*„”C ÷qä±bÞ;¼÷ë!lƉ§×Xn%µ ÎòÓ¼y|¹½„&±Ķ“÷ÝÀmonæ˜/o€2 ÙøãϬÙ_†á©ÔÔʨP4*F ö±ÿÉOs?á«mÅ8¤D–ï`æ½72rúfŽêR?ƾõËY¾«Äîç18§²Ýñ3ޞ˷÷Sh·Hæ7ðÀß»ijšã)OâÛc<>}ðf^ÙbP{Dƽ3™|‘?Q±ñÄG¢ùêôAþ“ZF…â4ÁkläñùC#™âæYM>™×‡'a­ýˆJ‰aHç~2)‘øG|D ËvðÞ¸gÙ6x2S“½¾!N Îã`¬dÒcSø6°7ŒFz°¼½ÛØ®… Æ1.$R7ЮáÉ;;\yw˜NÅdµ2pÌ.Ú_~µ B¡økx5Rbè:z¿½!•[€¸hLȺ›Š+/¸zþæ8<ü,ý…†VqÍ0†¬·Ã&‘'wµRcbß¿œ5Eþ\8æ>nêäjÜ.F"ªzÁö#¬þï4¦-XÁލֽ>ú6.MÂ$£˜M‹ÞdÚÂål>P‚),ƒ«žx†‘mÑd!ëLgÚ‚ålÉ•DµêÆÕ#ogp»0çoõC|÷ÚK¼»lóbADgtcèè;ØÒ•¾í¿Îyw–¬eW‰˜–ÉP «ùàìì]ø,ÎZÍc:–ÐDº ¼ÿ–E¤Y€~„eïMåÝï7’s°At¹w<ƒ×<ÊØ­—2õµ›hé/ØØ9ënîø_;^xë:j5ç{BShß¡#ͪ¦„@Ør˜1ú^¾Èzž™··Æ_Þuæ®"ê+£,#gÉ›Lšý›—#ý¢é9ꞥxz‘ß³gÒÈvÕŒ—BqæQŸq $‰vç´'¼ö³*%Ò~˜¥s¦1뫵äXˆn™…­ÒÍ´›÷îz/³žeúÈ ü]iî™uW¾çL¯ý˜wy®WHΠgÈË~ÌÍSˆŸ³æËåh{!‰þÎÁQålË~”1 ¹bäîˆ)aÅœ×xy¬F´Ñt 1Èùè1îŸu„.×ÞÄ¿ÚEBa!¡±V„°±#ûQœ]B·a#y2McçW³˜öÈc”M™Èˆ4?„~”«7?ŒîiE@ñ~üx“ÇšI|ë:–³áíG»È ÇÐQŒH·’·ékfoÀJM„·À­^IxNîos™2gS[¾É¿z„cÒ ÙøÃRr"®ãþ;Ú®EKO #¼=ÖïW±>ÿZÆ[À(æ÷ß`ɸ…Qw!€40 £Âh Éõ·Ôuôʹ¨ztæW;ÝRÖ×SFûÞŒ›ü ƒïd\·XÌ…¹”´h†EHì66{ÓܤP4$õgˆ›¾”HYÊÆ·eܧ’n×ÝÆÐt+ù›¾åÃ-@Õœ¡ë8Œjó@ÔÀ‡yôâ¬B€p7 œ9#Sl?½+O¾:‘,ûˆn—\ÆUW\BVB&@¯aÆüý´õ&£úGcÐ.&Ÿ¥#?âó·Ò!}3>ÜEÔÕ/1öï­ЪNŠ—3óãÝDžÄcÃ[  ze¥P~ÇýÌyo5WŒíN€”&w¡W×LüEWºÄç²êÁŸø.gVòÞÿr‰:…ÇnHqöʳbÈùf k*K¡œÖ Ò\_[G°÷‡»Y²ö öîaΞº”¥v¥w×L„K¾€¾t°Žç›µG¸".ó±,Û­‘1°Aîæ6½ÄЫ&V}o>ˆ)o"³–û­>ulSóî1 ë/£QœK¡D».=8·}ˆ³LÂeÀB³xäh˜Ô¨Aq†c†wã M/3âêWª®ô`ÜÛÐÁþÙK{í‹<<4? èÅîo×±NÖ4T~$ø7K -5‹á~?ƒ0Π9°Òâ’û™ÞkëþŠÏgóØ¢lιáIž–‰ßá-ì)s°ò­\6Åõ×öuÿC¥ØB6³³,˜sº&â¯i5ödØmfWyí»&T…ù'Ò­}lü\[wB+Vç…øÅ¤%¾à`‘‡ß6öÚÂèÜ9¿Š4„Vkï‡Ü3-ûKVî·¿˜Ísó‹ÐýÃIëy ½úgj óæx!l:o}>‹g?.ÁðåüÑé“KËÿáÅÀéL[øO–D¦ŸË­ÏâšVþ>î ð#}Øx^ Á› ²ynA!v³?a‘mé“â\jNÌØ{óröûŒÿÚ†,ÁÑ´M v?wP+Iý¯áœ'±6ízzÇXฒï:³Dó·[¯á‡‰‹™¾¨7]G·©·Œö#Ûøáƒù¬Ï+GJ"3zsט!¤ù „Mb8tt]!g>>¹•öý— ãæ× ‹º’‰/%uÈŒÉfÖgs™øiºÉÐÈÖôhà\êZ¹UÁe´Pνyý^™ÍÜIÏaó¤óµ-é•RÇÕã21 ]dÀý1J–ììl[¿~ýçtV)1j+[´Z¢•þ6YEC«Öº× ­jC˜”FÕP­NÚΡXÍ•6C7@3ÕL£ZþN÷އ<¨¡b¯†»<ª•­ø7žõ,¹7¿Ás—DU›¨ªÇÐ1<®rŸ¾W¹&¨¥¨ú×2Vħ*¬JçÛ׬…âLãËo¿¤wÏÞØvq¤¡ãvúÎõüUÍT[qT»=1tdç©bµsjºzûVÍ5ùºeÛºtìâ ÇÅcAIDATS›½dɆ 6(޹>G«ý] ”ü i!|:òAÔY!ä{¸Âãbw+mš©æ5Ÿòÿ+yÈ2þܶ›b£ˆuó&ómÐeLìáZýã&Íä~óšÇ2Ô#³ø‹et¿¾üŠ3‘zÏ/òvRA儲sΰfã]½c¦¹ŒHµî¦k®±NÜjÔ?“z|œšÕJg#Žý|6ñaæì1Ù®?üû2´FªV…BÑP4õ#»…ò¦:eN–TþñÚ¹Iâì•kÊ0(§Gv7E44¤^Ý^Ç‹2' åŠQ(NWšêÈ¡âà=éËÑýe … .›&i „S>³¹á›re …¡!¡Î?LD³ˆS-ŠGvæì$1>±ÁW—*ã P(èܱ3ë6¬cÇγ´ÿ‘RÒ*½ñqñ ž¶2 …Bá«ÅJV§¬S-†WËh)ã P(^hŠ#†“z1§B¡P(ê ŒƒB¡P(ê ŒƒB¡P(ê ŒƒB¡P(ê &¤M»ÝÆÏ¿~GAÁ‘F;’X¡8Hj‘B—NÝÕ>ÅÙÁ/Ë~$$$ŒÞçýíT‹¢8k¨}òiõ·¼Õ½æÆ>*Çy sçöÏKdæµ´oÛ±A „2Š&Iqq½z\€¦)ϧBáN²Ø°qMƒ§«Œƒ¢I"X,–³v¹Bá+&“©Q:QÊ8(š$Be Ð4ɤÞSœ%hš†ÙlVÆA¡¨MÓeä ºŠ&‰škP(|C¸Þ1ÝМO ~„•ŸÌàý¥y8N‡U‘¾Êk°nÁ;¼ýí~l>—«ŒŸÎbþÆ"ô“© YFÎ7ïóÁÚBŸòâì¸5І@k„öÙñ:þä§yóør{ ú©–Ŷ“÷ÝÀmon昧·7Õ–×(eÿ†,Ï©%¿£€• ÿË›‹Ð}|IÙ¶÷úçl,tœôÝ¥»¾ç ï°ª¨þ¼ÕÈA¡ð!ÅýzòŸ@£Ÿ&ÜÆ ƒ¸ø²A\|Ù\6t>ŸÍ/–7Zƒ%eCn¥²±ë½ÛéwÅã|_ ×›nÑÒ± 4šöÚŸ¨Øxâ#½Zûò–ï`Ö¸§ycÙ‘º½nÃÀçTùü8c>ÛÝÌm]›a>™î|áÿÿíyxEúÇ?Õ3I&r“„B ረx+‡à± ¬ »¢ º®»+ êOt×XÔõZñ>ðTPw‘XWÑUF¹!œ ¹&ÝõûcŽL’™0õyž~2ÓS]]ývçýVÕ[UMÚØ;¸Ìø/¯h¾¥ãõa7ޱá퇘4z8Ë­YÂÆcÍß…âlæìl” 2þ×<þôN9Yã§ðP7í+ßäÅ?ßOÕ³ÿ`b·„^ÊÆ/¿egÄ8î¹#ƒ0ý8Zr8f*É{õÏÌþÔ`ðS™˜ìOѦU¼SA®W³uÑ}Ì\ĵSfrGt9k/à©Ù_œN¿/y»Ù_ K¡W8¬ÌÝGÕ•t5ìøÏ7íØ•°âÿ‘³í622‚5ûX·Ç zDW¬Žã¥®£މø²%åµ9ê~fÆOhÅZÑD~].aòØ :Ú YóÞë<3ÛLü+¿#Óªá*²<ζïwCâu$ Çþæìpœí¹?s¨ófü!€â<–¼°„g7ÄpÙM71c¼•âoßáù—çÞãE¦§YÐ÷.ã‘gV4zdÅ`.=DyBG—¨úÇö%=ð}~ÜTŒžëµéê©åP[¼‘Ü"3½.N!Ĥ!„FǾ—’ÊÖn=Æ”Ë9DSœ hš‰òòr²W~ŽD’žÖÃåä7䓳r†a4;‡áìj9äÍeÌ(§·”HÙ™ë™@ß&([Çì"jô“Ü?¡;šàÂITßq‹ßÊåÚÙçê8ÎÚuC¥(!%_ñÖ燈½ñYî¿)É^3ÍÎÕëqN0—eëy}i!iS_fê°(üôŠ.æÛ)ï³|Ûdúöó®g~¿82“üXºuGl}è v±ê›c¤¿—K³äÕÛ˜Ö+ÿâÍ”YèžM€‡h”þÐlyXÂHNNÀ_8j 5öü‚S.à²Áéj½Ÿµ\Ã;§Ò¯g`]Í\¯àÀQƒÀÄ(WwVK픘ÉàþéXDob}Ím$pÕµCÔACô±°á«¿ðCîAli‰PvˆRÃJ¯þƒ˜Œ‰¶3… ?8F­ŒÁÏËCíi´Rmé>Jd0}ÃüëÒDm…¼½¥Ød$f5/BÑNˆïÏUW%gå rV® =­[6»„áÊ+†ß9¾Ù¼NÅPÖ¶‡n“˜O&VlTí!7{‹šþèÓÜ’ÏŽê`zêŒEÓìÎOV†•w7næPÍy„¸law?‡9±S¹¥ ¾ÂÖïO\ßUTR´_„¤¥¦“–šîúÞÚã}Mˆƒ™Ð˜Nø¹˜Ù³&C"ˆKÎï¦ÞÀÕÁ˜tŸ8‡Çƒ^âÅOðàI§äLž7•š®@òø¹<ò://[ļe¥ØÌB;õä¢$«Ã!ÒóÖÇy,ì%^]ñó–C·„Ñíü[¹pXkœbÝ.îuùj,WŒ¤G«Wœà^×pYØW|¢äÂx¯C6[T^-ŒÁ·ßͨù¯±èïSÅ  é\’ÜÒW˜‰pq¯þ‹Õ¿TÒ¯!|e‡:jnåËw—’WT”:¥áΙcè ÔPøÍ C2Ò¤M¼=ìþ$›ÇÓ5ñô‡Opßñ¤žÆ‚{¯¦³¿REûæDü©ŠµyÊÑoÑ¢E5C‡=eÁ=iu}Ö΂hˆ•Ò@Îøƒ@«÷»=p*Ñ0yP ) ÇÛ’\'@­ž°4L#„†¦‰fónp1è†Ñ0­ÄÐ $Íä6¤ÔKÞÍ—×qœ³¬šý·ÆyÙÏ‹fj,¢Æa–ϺúÿŽ…_J'G”¸Uvöìë®I:†3tSwÎû&Ë×óÄí²qä3<cW,M´„×­ÿŽ‹/¼Üã3(¥a¸ ¦yïfT(ÎvJJ²}Ç/¤$7ž+á‰ììlÆ?¨*Ûq·Ï•@U›Ä„¦a2™êmšÖx„Žš3M£ßšfòê¼íÎíšÖÈY6L£¹4wƒ‹qäß0­p”]kà¸<çÝ|yEý²Ú‡êxÈË~^E×"¹ä–«‰È}•—ו¸õk•„Öèš„{!êîY½ûVÅÖ% X¡aò°šyòšzÈ…p{~”0(ÎqâDÃM¢ÞçpŽ”vÿ7E²!ð4;U)1ÅfâŒënV]¡8ÃQâp®¡’rÝdRð<—â”!é6tÝN÷y Å ¡Ä᤭ޕÐÚóªIm EÛ¡ÄAqÆ"¥TïuP(Ú%Š3’@‹•ü‚ôêÑ“IMoSœZd½Ñ“n£ãîìßö†ÙìçÛ6À>bÏ@×u¶n+ÀjíàóV¶ÅIJr*¿lßÂ׬jë¢(g4á#ˆëâó|•8(ÎHÌf?ÒRz¶u1Š3Q·(¥/Qâ 8cQÁh…¢íPÑ>…B¡P4B‰ƒB¡P(¡ÄA¡P(Pâ P(ŠF(qP( E#”8( …¢J …BÑâ Æé.‡B¡P(Î <Šƒ8Ñ—Ø+ …â¬À³8¨7µ+ Å9çn%]u+) ŹŒÇµ•Lfµä’âÜÆVkã§¼Ÿ(.)n뢴{R»§’˜Ødš²²2ÊÊ˨®©ÆP1ÏVc6›ñ÷ó',,Œ@K oòô´Su*)Îur7ä’Ø%‘‹†\¤< ¤”¬ýq-…û ‰‹ó˜¦¨¸ˆ’Ò’ïTP´›Í†Íf£²ª’α 8é<=ŠƒºIŠsÒc¥$vIÄVkSÿ'¦iôÉèÃwßGlL¬G¡->ZŒ”’n]»d jƒRžH8tø‡¢üxù©5”U¡°W’TÇÉaȦ—_× )%AAAèº~Kwö „ÀjµbHCúæ™õ(fõZF…P­hŸÐŒ uÝ.ÎMqbÒþÚPiøÆ†*ò¬PxA9+ßÐRJ”½O ›N‰ƒBá%¾A6㵤!UËÁH)]¶ôJ /H)}Ö{ÆS{˜/_{ïâ&p÷È|4@K ²éÌ܅ᜱ·Ÿ‹«… çTMV/aã—_³þ¢_aÒ—«$4cBwq8gì} pÙÐGýKJ /œge+âÇ¥oòîê<¶ì.¦ÊDtJ&—»…›²:an«)®š»ÓIû&[g¶éSŸ!â`;ºeoóÁê< vQG·žƒýÛ±\”h_NÂ(bù½SxÖ|‹æ^D˜I6öü{.x~™÷Ìç¾Ë£i‹ˆ|mC% …|í¬dåVÞžu?‹±vå0~s}Â)eç¦M­vÖúÚ·ûR$²Ù–ƒ! W·­ÄAV°pæ¼·=˜¾Wãæë£0ÝÉ93wú—üðà|îÎêˆYJ ]GN!µ±ÕÓÌx.Ÿ´;ærÏ¥‘|g¿V]ön9_ ¿Vâ PxÁ§â «(Xü‹ gä#ó¸­o~ޱÿ_q5RhhØØûÉ<|{=* ÌÁÉy wÿ:“³ý_¾ðo¿‹ƒÅDZ‰ "S1nÚm O¶b€QNþg¯òê§?°ùÀq´Ð®}à!nMB«=Êú¥¯ðê§ëØVb"2õnœ6‰¡Ý¬˜\×éÛ–ƒÑ☲†ËJò=ÉûÛ£=o7÷ Æ, >ê>|`o<õ,¸‹¬w;ÕP¸êî}*—®Så¾ жþì´£¯æŠ(qP(¼àSq8žÏGŸïÃoàŸùuF0 „£¶)íy7ß3’ŽVƒC¹KyþÝ'x!ù9ff…bÒ³#w‡cÇr÷ôî–ïá›ÞṇMt~a}¬:»>˜ÍŒ·ÒoÌDföŒ€ÒR‚£ü€*¶¾;›> dÔ­â¶è Ö½÷"Ï>$ˆ]0•>ŽV‹»•°ûØ&ión¥ãù|”}€€Á³“îféÊÈIWðñý«øðljô¿Øq9²Š½ÙO2gAÉSþÆ}#»´©0@}qHÄI.„¤ÄA¡ð‚/•^º‹]’è^ñtм9APÒ@†$Ù¿õJ gïWdÕ†Ô Æâè~ ìÒ—ÁÒ°ˆþô9DîÌoùbg½ºldá;ètÝãѹïsü¢›ùä4:Ê}|þÄ?ù†ºQDŽ‚Õ9pÍ? j ©×b ÚQßÉI½ ¦?ȤÔÀz£i"‚1qÔ™²ÍÄ¡­bZH¹ù{©¸:Š÷¦²p#û¥ ºk&ç@Ѩ ¹ëÿ&ðÃóòÜ#P>ã¯L;¿~m$’:qõÕò_ö£P(Üfœúb ìÁÈ‹C©üfŸýR®7NSµ7z"׎»ŠiÝèž’Fb0ö*½3½`õÅ>ËØÜ1™8S›~,¤Ú0ê¥1…u%ÎTÍî’ÈøxèâØ¢ƒLv‡"@Ö¾»fCºÞkÖξ´uk7K£.ïDÕ7o±lËñz÷ƨÚCöÂÕ Êâº>¡h.ñˆ€®º{3¯€•ý…WÖÅæá¾ž–Ímv´ʪPœb|ÛDïñS¸,÷qÍœÉ/×\É ”8´rîØÂþ¸k˜Øµ;Ñ|Ägï-ÇzI:q–#ì«€ºÚ¼sX¨tÕîí]AŽS„ôcÂÕÑÌüxs¸²G$UG©Œ?Ÿ!‰™LÅÌÏcŽvÃzGa©)fY—]™B°f%*Š6|ͺ½±œ—`ÅËo:BíM¦iû¡¬ô׿=Ì÷Ï`ÛÈ¡ N‰ÂT²“Ü•Ÿ²fw.ºwƒ:š­6\­7Ìá žüw–ÜÏsóÿAÌßïçÚ.§ý8Nû9mé ”8(^ðu€T ÀOÎ%ãÝ÷Y¾öS^øô:~„Æ¥’5ª?ŠS‹x~Éûüã¿5øY;‘kµúqMp÷®& )7ý…¿†,äÍœwy|éq¤%š &÷bp—(R'þ•GBòÖªxò³2 K(‰ƒn"ë²îtð‹`Èo®åëç²ycùyô›œZÐ> .¿é4m=Z AiLš÷Ÿ¼ÇG_ÿ›W>+¡ÖIbÊUÜu× \Ü­f§Ýí¥®ë~ó‹á²é¿gëŒy¼þô'Œœ?ÓižWφ>š-ãé üÞzëíš#†«7`)ÎYrþ“Ãó‡`«µùC7@3Õ¥‘†›p48¾áoBÔå%k¹çrhÂÞs]°µ€þ}û{ô)k¾]ƒ”’¬YT×Tûä¼'Š'û­þ Pièh ÀÞ…&í?=hšFuM5ù›ó ¡wÏÞ^ýwvv6ãÇTŽí¸ÛçJ ÊcËÁW†BÑž9e5Yaw6õÿy‚àpHõþÝÄBhŽVD]¹„¦ÕOƒýøºü›ú­A^gî«ë60šo&´êhlŽ`m$<ܛӅ{ÌÁWx~‡´j1(gˆ³jÿ!š\ÒÁ5ÏA½Ïá„q>«¾~­b …¤TKHŸ,RÈuÏùò—ç²î½îâ°÷ÀN Sx4 ±I´ffœ…¢ TMöäÎÉYMŒ½w¾&´ÍÖV: †Äd2¡ë:555®ý‡‹¢ë:‡‹“Dk:…”8(^pv…(‡u»Ífï®FÓ4l6eeeŸÆÂµ WÄAzÙ_g›±¯pº®âÚ×)<ÊÑrˆj•0€qPÿ ŠsàŽ!¢cD[¥Ý³}çvâãâ½Æ2S“SÙ¸y#yóNsÉÎ.¤”˜ÍfR»§ºl›äÖbh:xÝGÓ¯ŠöJfßL~úù'¶mߦhœRJR’Sˆ‹óšÆùÛ¶Û¨¬¬<]Ekû¨1Qï³×Í1Ê A£}§ëùñ3ûÞ)„ ùß»b {ìòmÌÁlR«j(ÎmüýüÐo@[㬠%Î1.6ŽØ˜ØÓPš³›õ›¾¯cP1…â Z §eï“§aŒÁç1…B¡P´?Æ|sP( Å™OÃy c 'sPÁ…B¡h§¸Ç¤lþ{kPâ P(í”NáQhšV/ÆÐÔ÷Ö º• …¢Ò\ŒÁç15j@¡P(Ú Wðmî{ËñÚrÈÉÉ9± …BqÆâXÃÔ:60›ëÝ‚ž4Å  Ðí¯ó³Åñ»ß©¼…B¡Pœl@5PåØ*[•Ûßjo-‰]EtìÊbLÔ‰‰tìW( Eû¢»8T5Ôµ"œ- ž»•œÍ Ãq€Éq°»0è^ŽU( Å™³Â_ƒ] Ü»˜\]KÞ¼³Õ ãYœ¢¡P(Šö…Ó¯;7gëÁéó hYËÁ“0ØPs$ …¢=âôíÎí„ZîÂàƒÐPâ P(íçÈ$§?wÿÛª–ƒó³‰ú &C( EûÃéÓÝEÂýo“-Iý1¯‚º–„û¦P(Šö…l°4öù^¼há_…B¡P´?dsÿsˆîË&bIIEND®B`‚glom-1.22.4/docs/user-guide/C/figures/glom_report_result.png0000644000175000017500000126705512235000130025252 0ustar00murraycmurrayc00000000000000‰PNG  IHDRÈÞˆŸ%sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ  ígœ IDATxÚìw|ÅÀßl»–K%$BB $´Ð{iRD‘¦¢bE±"P~ DAŽbA@ìEéÒ{ rÉÝm›ùý±Éq¹Ü¥ò¾>ávooÊ{³³oß¼™!Œ1@AAAA)ŠAAAAAò‚ŽEAAAAAÊ :AAAA)7èXDAAAA¤Ü cAAAAArƒŽEAAAAAÊ :AAAA)7Â¥ü˜1†DAA’!„ A¹œò:‹_îEAAñoms)¢“AAëÇÔ)‹[ÐçÏa ó‚ ‚ rCÙE½‡žÃ@çAA®I›§do ÷·Æg¯¢ÏI@÷"‚ ‚ r#›×^¾Bã³÷ß⇀îEAA®]˧?`q¢÷‡â'}~… ‚ ‚ 7œy]Ìèý¡øIŸ_!‚ ‚\CܼÅ' ÑÇ¥H)-Á½ˆ¾EAAäÄ'DÑÇ¥Èqœç$cÌÛ«è}X^ÐöFA¤²Ì˜rÿʯ!RÜ«èíO,þ×´oAAÙ'E1ü‰ÅÿúÄ0VÀ ÇÏA©,Æïa© o¯¢Ç‡è®ëÞç}ѲAAAn4£¼xˆ¢Ç“Èó‚ ‚ å7] Ød ƒ2Žw L¯¢®ëš¦yÿ5>x»ýZ6‚ ‚ rãXçÞóy/AÁø@)„‹v¸á[„ÒB|fù ðSJ}‹‚ ‚”Çn1ìŸQϤ (CÜ¢ÈXñØ+ס¦iªªúüõø‹Ç-¢Mƒ ‚ ‚ÜPÖ¹O¬¢Ç“(‚(ŠÆ_J©(І©Ì󼑂·ùî7@Àc]{›èš¦eff9rÄx@E ‚\Íèº^Æ+½Ÿ@Ó4”rù`Œéºž˜˜i˜.†}â3Q: ä3÷ŠŽ‚z» E1þfeeœœœl±XL&“TˆoÑg«èâVºgI"Y–·oß^¯^=I’ÐGAäÒ‘ey÷îÝiiiÅ3ð }‹‚·½âýÙ{iEO¬¢Ûív»ÝìÓ§OPPPñ"‚ ‚ Èõ!D×õйðAˆŠŠÚ¸qcRR’a<“x ìâyyŒsEQÎ;^EAA* “ÉT­ZµŒŒŒ¨¨¨²oáâgÒ„OТ1(jÄ*ºÝ¬ÔÔTWAAA®{!ªª^ŠO„ØØØÌÌÌ*Uªß6šã8Ô…÷«+‰Œ}`P/‚ ‚T"Æв,{ •b«øRJÄ¢gqhÏ‹¢(Z­VJ)ŠAA¹A¸ôˆE#I’dY Ñ4MJ©Ç÷ûCŸéDŠ¢”jå#‚ ‚TŽãE1<Œ¥¬‹P¸`"-Ä±è™ m ¥¢ AA‡J‰X4Œu·Ûmx “]×uímXÚ~sñÞ¼EUUÔ‚ 7 Œ©Š¬QÊIO|¹ ¨ªªiša¢x}ú5QʺƢǷèù ×zö¿~ßvÔQ½ë€ŽÕDâsˆò¹’ÂG(§7o<ŸÔ¦AÄ5)æ>ý×ÆÌ¤öõÂíA® Çb¥$%˲±%´af·Ú},s(:ÚõG Èe}ŒSM^àðYûŸi@u:òÜT´ÚmfNs; #fÑjð9¬¤\Êí£¤Š3ß©h:eÀ‰6{½œÈu„}RòÅ¥¬±è½1´áXäyçA#Èõ‰ûð'oÏûS¶ßÒ¢_ÇhÆ|/ŸÙÿïÂW¦¯9—0äÙ'úÆ™ ?ú*º¡rNú© BõøªfreS`®ƒŸMymű ­Sfol¯4Kí ÕH?ÿÝ” ï섆î·'wª4àÕÚNäF€ã8¿ŽEcJ²·y\üŒ²,›L&ïXoSíÁâÅ\ÊWF¦9wAWLp¸•r}QÜ>)áb!àâ5(ê´h6›KÝjAËŠvaûê%Ÿ®ýëàé\U²GÆ&·è}Ïà.q–K7)£Œ1à@‹z•àì·ÿ{uɶ3\ð–àèÄÆzÝÙ¿Uµ øõì=ü›•§oÙpÌ}[œéÊÉQ=¶è¡Ç>9C‹ö‘ÉÏ{µkø0àPÚå3ìÎo]³ô³õ»Ÿ8çÐ… jÉMÚÝ:üÎól±ìõOœ¹KüÎÌ!5Å+š‚~î繟Õõ¨®½†I¼¦Wʈ֕«Þ¤c2·s×Ömkóh³àò½õ0åÜß«–|¶~÷¡ã™N‚ªÖªßªë ;;'q•ÓN©„â¾BŽãêÕ«ÇqÜ¡C‡rss 88811‘Rºk×®@î?EQ ¯¢·c±“Ý;hÑc¢£FkJõBcŒéšâthº=8H,³õJÕü\‡ûbÃg”j²¬YÌ—c #r9Æî.U$ÐéÿüÅœéš!0ÝåÔLö‚úPÅ%ÓU1(·iMx)ÈÆÊ›¤Êª`1¥r—’ •D[¨Ý„­ÈUÞS(õ tÆÏÛ˜—}RÖˆEïKí mø Ç"êAþ3\<óÒ§tÃ6qe§زùÔÝÃ8¸ä[óâï ïîÃ8ôîœ\‡Odæë”‰3qçeßñË¢ÿœ˜4ã±æ¡å5øè®P79⻵‰ˆ¦Ò+ÕÃ0Fu]׋æg1™J¯p?W‚´Ëž†cûOOYsR§ÚÓsNîþõ÷´ÁƒZV,IÆt…RJV™T8ùКO÷j”«?¸w’™éj%=w®`H•6Cz,Ÿ´:ã÷EëïnÔ«ªP=Ò3=ç̾?~Œî=°K¥´A*èi ¤ø]§ªª±§sbbâÁƒ 11ÑpA–°Ó‹'VÑÇj÷1ÈÁk%£â¾EÔrÍÁ[CBÌêÎÍÉר"ëLÅ‘“§2b ³ @såäºtæ…GW¾›'YmIàꚦO¸"Õd—Ó¥j”Ï›ÌV«I À”œì<­ öÔ¼‡BA²‡‰tw^¾[3,AB8ÞdµY%o3–:s²œÀ[CƒÍ<è²ËéV41ƀ𒠷¥•¼²„@Lö0SÙ•,~ë·úTÎÍÉÓg ³ Lwçä:u!(Ü.‘‚Lb³ ¥Ê¡ ¦KaÄT§Lƒ-ÐÝn•|«3&PMLqdç©E:5Þb]N—Â¥Òâ™êtäÉ:e €ð¢Éb ¸ö"g ±ðœ×OsñQ±ÉlªÆY ÇK›ÕHš¼,¨ùÙò8)8$H$þ+X PÎbÊy9y*ãÍÁ!V=’Èð*fgg3«Õj1›Àåv;N -Á·he|ßð¿y‹ÏlhÏÞÐÆcaiÔ‚ü'È'ûõŒ®³Ð[^xk|ó0š{fÿœ Ž)š||Õ¬9ßí8z2ÛEÁ\%©y—¶áG×­ûûh¶߸÷¨ñ}Rì<–¿ããWgþr0#OSplG lká¼{ Ÿq ŸQ #hŠAÒ³ßéÅ«§×¾øàÛÛ³7ýr\ibÊ^÷ä¨w÷Òè»Þúß]qôßwÆNúÕ!µxvþiAœ~áŸ/f/üvËñ\•˜ÃÚ}zT+óO>üôO%ØQ·ÑñékfÍùv×ñô¬|…‰ÁÕ“Û }O‡šV£ËÑsÿývÁüÕîÍPíÕSnºcÄöqV4?ɆC–Ÿ“^ÏïÂ:Å yïÃÁq…㔄㕃‹Ÿ¿ì ïñÚ[#ëY²~~íá··º#{¾4cDÜáþD§”MòÊñUï~øíîc§³\:±FƧvèw÷ÀÖ5,œ·c±PÚþ+Ëòþ]þÊÿ¾I¯yë¤Çû%Ù¼HYî_ÍXsBÓYdû‘ㆴO'yéGÿ=HšÆš8¦hŒ:ö}»èãµî9-ÛjÔn×÷ža7%Ø8£ðþd^(¡S‹Æö_Bâ†ðz¯ê‚Óûæ:¶~ùÇ«6î:rÁm Kéþès}©ŸDÍ ÈJ„ÊÉß7§LHëÝ*’Ó5•Qß”_¸'%ˆå]Ý5JìݳæšGü¼=»g—ˆ²Úæ…z„ê7ß?æÎÖIÑåü±=;2k5 åIV±vR²ZKm“‚”Ù«è7bQÓ´o¿ý¶W¯^<Ï'''{Œøo¾ù&22Rü¯f½mW±„¡¡h4‚\{·~q„'8QâAÕ˜ªPx¦kªÎx©èT ªÁo¼Å³Ž/H|á Æ4§#§pR*èš;?W¥…Ó˜YÑÛÈùǨªjºÇ“O5w^.‡Ú¼ìÂq€ð†¹EYÕ Œ/™·³´’W¢ü¤Srõ9Aâ@Ó©¦éLàŒDuEc’ i: ¢Ä—Ieð+2ŽÕ]nÝl˜ârë€0J pÕG ü ½,áøò¹(¥GeºêÎs>Ä"’åæ'sÀ4wn®‹BAкæÎÏe\H‘ SB8B€ã XAÁdQsœšœç6…ð®|•g ² W¹B÷·áLôþPÊ¯ŠŽt–ϱf[x¯ç‚Ö ‚ü‡ðæ` €ÜÛ÷œªÓ¼†-*¥QÏ4h™ÛþØsTÖ‘–vÿº¥#îs‡ÿø5¾æ¬Çq„çgÎ:…  Ñ™“ulÛª7¦YâÞ¼3¾Ü½áˆîÎÍ<›™§1{tˆ‰ç c‰êŒ“LqÓu]׉h9–¹aÆ´Oÿ‘uj‹Œ6»2ϺìA&NÆ£Œð¼@3·VÁÖÌ|‰U}{Lª•#îƒËž{ꋺN,A|öÉ+g<Ÿc}û‘f!\ΦâÉ’ìu~ò"ºWÆ<®DŽiªgÙb{»ëÇ^ûöW^ŒûbÎ?N5ê¶'‡¥…›òú]%¯enÛ´÷˜¬3N2éŽôC­˜¾mïý3_ê]lé˜@•µdü¹~W¦CÏüm‡£_mÛEk™fmY±.‡2¨9ô…§Ô™¦ëAAaQÉ„'šN™kÿâIO¬,ˆtUŽí\óî“ûoMíkò*¼Ì=æŽ`¶ œ)2Øj Ð~$õÈçÏOXzX£”1œç³Ìv+ŸQ<¸°¡ÕèÙ»wœgµZ×J™â/eeÿÇW{ª6L‹$ÇÎÙxÈÙ%ÂZ6øPµ†?÷XßšÕtj­V§U5Âóšæ;©²lj-±7À>AÊáX,nó<kÖ¬¹õÖ[%I2œ†kÖ¬1¾ d3{Ç*úlÛRF3­qäZDwfgzÞg9“Ý,'šÐ4ªÈºÅÊiмY,îK' 'ú¤£J¾[ ¢Õn7ñº;7Ç¥ë.§j¶—ai>bµ Ô•“ãÔ™"ë¶‹ãœÅîµÆ"ó¾ž0`@9ÁYZÉ+Q½aª/Š.JU™¨ª’T)ãt•€hâ‰O½üÊ¡ô×ï(˜Ìàrin—j¶R·Â€3YDÅ)3F`Õ$ØBC€©ù¹¹²œd³I)ûfYD´…DPFUòr]U5æßoG]9\…¸%$ĨI*V. À[ƒƒ-PÙ‘•¯É.Õ*^Œ$5Û °TÎ TAÂ[lV9Ç©»9„1à-v3º‘+ÇqV«Õp&z»­Vk©ñ‚e76„R}“>¾EÀ‘Rùo‹Õ»Œî¹~ò×Ç}õƘՖ¸æ]níw{çä`0 ÀB{¾1硨MO|k›J“œ7³‹úåÃcçuüýûIµI‰™RÇÌþj<§ä9ò2Ö¿òÄ‚'þÚ›?0^ºè¥2îrŸÃâ~ÅC³FõzŸc”QV¥×ãw&šˆæöü’øD:2%ëèi…R–0fúýb%¦é¼‰S/\ôS2¯*<œtÇ|,sÃúS÷¦&²Ì?æ®<©ë5†ÎøßÐÚâ™5ÏŒž½ç—Ï·ŽnÖÑâ/ÙüSþòrkÅüŠprñ¸ÞK žía=^™=*ÙbŠ¿í¡Á›]r`Å O ®\=fЃëÛ˜*‹DW6É^öúœ‡ë([ç<>iõ™‹?=Ði|jQië+[ã–{îÊùý|ÍîÝbÌœ.{ê£dì;̓ˆ¦ÍªKTU´Â9)L£4ó¹«Nëº)mää§û&æ¬zvìü}û—-ßÝõ±FPæ|*«zíÝ»ãD š¬ûo?5s7Ìýô°¦s©Ã§¿< ¶¹ò™Õš{À7GViªQ³g3Æ,Õk؉®k™~R6]øöꯑ$CË<ÄZ¦™×…z¬Ò´I”@Uc@§ÍR¹ šIñ|±vR!”Ü&)»oÑïäªU«ç=«GFFºØãXô» :ØÈõ~ñŒR2 rnždâ=N5•Z8U^òÝ…Ãæ×à ܎‚Å$‚Ù"¸ò4 šÎ¤2mÇA8Aà@/X‘”~= P–’W¢½ù—P}A4q.ÕTªƒÆ€`TÕ(¯P"JWV90Å‘ãðLV–ìáA^єİpá%³äv(ªÓébo2‹L0f—XNb8H² Xì6G Ý!SÝŽ<—F½¥RMvܨ˜é†;Vwæf9½Üܼg»“2(‚o²[äl—Nðf›g Wc´WÑ8YúÝU©ÐÞ¿ñŽXôö-¥ÔžEä¿°É‚›Œ|}~Û ß|óýw¿í?ºyÕ;þ²yüëoªê•%Ö¸Ѱí(.qÁɵíp,'ò”ìí+Þ~û‹™ €1JƒüL'ãÊ¿o ®^3Œ×òÏŸÈȇsk§¼™0óñNU_/F5mõåWgŽ|8nÄÏmzÜ~Ç­íâ¬~JÇ1š’l‡ã9Ù§s4žƒôÝÇtÆàÄâGïZJÕ)ƒŒÃY´S°¿dù2çL0žbX°Í"ñ QS\ï C7_xð‚Êj ||HŠ•ª2¥9%‹®É{׎YR{t[³àˆãоR/¨¨w)peCª¶ô`+Ax¦ªÞýã'åÜ“;¯þ)Ø&(Î,õ²nÿ¼zïKÿ(†ŸQjöôǽB \Ì!…+}ʇ–L™ò{>­ûÄÇSÓ*¢Ö’Ú¤†^ )«WÑoÄ"„††Ö©S‡âÙ3ºU«V{÷îÍÎΔš·WÑ'bÑc‡Úu\»ð{ˆ™ªæe;¦º*YxN2 ùš¦ËŠÌ«À›$_—'p¨¢è–rìÓL€O_F’1‡˜`: f» ‡é:0pîš?íóíV£û°¾ ¬Ç¾ü`õa AñîJZcÑ8J2ùž‘<°ìÍoŽ~y}îŸ+ןëÐß&ò/äë>½1×1õ•¸/>[±öŸV¼ñÇ_'Þxù®jE2òúL,!€f¬îªÉ:@xËžkHï[\Hý0‘爿dkù;™`ö·Æâ[Ž•n8ŽèŠ›1 y'g29·ÿÐWÍÂ\;Ë ºÀ’/reD0ñ@è#\Qi—PY¢QTS›IŒ¨UÈ9ÈØòÏÙa±U}la¡ª¦ÓB‡1RdD¸¨ÌÖ¥®ëÌ“F !0M5Ö â9ªj{â0Ææ›˜KS 1INÙ!ëŒrL÷“2½jjžKS°‰'pq®7õÚ6H'’Yâ pÓ"><¾ lÈø{kưØHCÆàE[òº»JB mçRfÇ"Çq~w…NNN6¾Z³f c¬wïÞÆz‹[¶l ´+t Óº\w$޾ȵûºJ <,N,N´HÄ¡è.§¼ÙO¨oˆ¦1Ý•—O¬Q „1ªk”“$žp²šKÖxOÝ. Àjà8À˜ªRVŽ©§Æü@]Óð ÛV†’W¢ôN%U“ÈÉ2UdÎ"I¼æTUYÑ$–cC"Ùï]°."!8“…wçëœd•aD3ÆJ*'£r¾K ’Ín*Éá¦ë ¼ô¨ë  †ÇŽ7YÌ&4Åå.9Ú±=NàAÑ€2N2[(¥ÆÒ›¬\Š`Tvæ)8QUÕœy²bÆP-ä á٭ŃqXÆ Å2Ý+l¿›D'}¶®C䊢žÛòëæ=é9NU£Äb—€¹sUžçßÅÞP=÷ø '£P³ûà~ݺvlVã¢?‡3 —žîdŒ1ŸÃb]ñ%š*»s3NŸ—€ AQB#­½k÷9ÝgO5/â:{úÃ…SûGFü¶-»ÈP¡ß× EÖ‰B ÏYµíÀ»‡>lhß®½ni:õ›¬îï$ø©áx¢+²,˲ìv¹\ŠÎ˜vþ÷9ïü‘KÃ5Ž Ê¶ÙÓ¾>é¦ZΉ¢+“ä=ý*U L>ýçúcÀ˜X­V˜ÀHi‹+«dþ½böÌ÷Wí¼ ÝE4(¥s]‘8ºàå·¾Þº?=Ë‘“yjߟ?m8î¤LªšK‘·öÝÞ,Åuì×ï0ÆLqu«Š$°ÌA²‡H±ó°ƒRFU•²€B"“£ˆ¼íóŸåëŒQ%Ï!3)¨X š·j¸ è`pžÍp2¡ŠŸ”…k¡FjÖ©,Æ ‰²s^Õ37~jñW«Öü°vÍk×|ýB3;w±ò\xÓ>MÌ„À‘_}ÿ‡½g*eúÅéÏEÛIÙÕZB›D¤,@á®Ð>{°¨ªºfÍc‚óš5kEÑu]Ó´@Iù}¤–wB4!î‚\cèΜ YY.då8U@DS÷Œ,WðŒÌ~ÖQ$¼)ÈØ@W—Žìœ¬¬ììì\G^¾Keœd3óLuæfeeå¸t,‰Þ,q »²/de;”²¹ãIÁ¾)j^vfÖ… 9N-°ãÉ·äš+ûÂ…Ì 9®  T\˸ú ˜ ¶Žæ$ω’WDßyЗæ*6úH`@xÉjA*Œ,5JA”PNªäçk ˜šŸ••ë**s^ä ¾w(¬è!pFHƒîÌÉÍÍqä)•7æBx“ÕÄ€êÊͺuáÂ…Ìììü@³=JPUóœ Îl ²™8`š3ÏEqp¹PJ=^E«ÕjµZ=¾ÅÖl)/BÉãŸÞçME¤r‘­ýÞ×Ô˜$eÌ¡‚ð–íbMq•%>$!)ŽfûhÜý?Ç…¸; kbdJ5ØpHûgú¯>óöcõ‹6 *náš=þÎ… ä»F)eÖ¦½[VˆZ«KËà_Ê>:ÜmËÌÄåÉäß>þÜ÷[D„EI?KHÕâÂ$þl#¥h¹«vÖå«ÈÜùñ“ƒÑ5&µœôÁS­Š¿dÙÑÅO*ž§h¾èÉÅãú,õÔÍÜð¡ÏÕß7gΖ|=üÖ'ŸA–Œ}jÍžùï~ßô¥.DW>r˜t×ïfp»uJYdï;Ûå•vZ Ê Ǿž¿ä‡t‰j>ýöhÞ[@ïúÛÄù;œ§~ùèÕ_?* ¤´´ môh㈶Ã{®|jMú?=5l1¦ÞÕºãî¦vB³ÊL±­UŽ* IDAT눛wÈ;ß1`¶¨Y;½üÖÈøBà£: íøÕ”_³þžýð tš<ö£É ЧpÂo3ðRQ¯n9‘uxóQW‡z¢ß”§´¹êkç÷oK€ØÉ6º÷˜6ªÛ­úµJ#Úß;úÏCïnÈ:þÍûÏ};›‚™ðÆMZ¥h;)›Z¹ô×KB!Å×Ò4mñâÅŒ±ÈÈȨ¨(BÈÙ³g,XuêÔE1ÀK8ó±±ýÚ᥽ɣAŽ\37ÇqD§Ìh¶„p/J‹Y,´- o1ñ²K"šÅ‹ä˜‚CxÙír+šNÂ^ ï,Á!$?_V5 Ç‹f«­ ŒV{8ªF)c@8ŽKÕã$›Í’ï”5J! |·/9-\iœTº•!põ€3I¼Û­[@ƒ(  iD´Š•æWd…¾ c°ƒ­Á¢w×é™c¨œÌ“ìóÔWý6›žï”5Âññ>$¼5Äy.YÓ5 á…ÊšhLDkH0Ÿïr«ªÑ~xž'Vo XAÕåTÑj K¤ä*º3_5I¸rÅð^W±ŒC_’cѯÕR|ùET ‚ü0f®Õ¶EòÆ]Oçj’½j|Ó.†ßÑÈΗ×ôå"™‹ÞÁ¦ÚCŸM?úrÿé‡÷¤30…ÖHL‹"Œ¯Úeܘs–ÿ´O¨a7›lEy¦\ œ’"b"-égZ~n.€h NlqsŸ;om]×ÜŠ¹îðgÇ ¾Ø´÷d¶“H¶ðÈØ† "D2³T´ì:“q2ÌáIm{ u(—K½¼@Þ‘UE;°¥œújìò%ßÿ³ïD– ¼=:©ºU ¸ü%Ëv[c"-;}òÒœõôdŒzMVËwsú¾åó6åëæ–£‡Ô·[•ÛF¶þuêÎÛÜö‰!ÏŽ¢óV]Ñb’¼g~¹5ÿaë¡c§³eÁ^5¦vÓ&U$‰#PgèK/G,YøÍ–ýgݶj)­ouïD“ærÒ"ͦHIXÛqœš³ä»í'²óHH´I4IÖdÿ툽É}¯MŽ]ºì§íNå(Bp\´È›"ÛKùmÞª©f«´ ï×åþó펼ºM,þRƒR®ò¹üòõ!JYLÛ¦Q‚®«e}pòUÚ=6³f«•+¾þsÿá“Y2±„×LlØ.ÆD„(ŸvRF!”Ð&ñqŽ —âXäy>55<>ÄêÕ«GFFzŸ)»]Þ"¡^kůh¶‡šKöM©:Îd ìð"œ`¶ÚÍVÿ÷ƒ` ±øwý™lv“?—‘=,ü¢e ‰°xç%YíRѬŠ\¨äÔØÈ„|+Iþg%—P} ‚5$ÂSÎn.»ʤ^¾XšPNÂÈÔû·„7Ù‚M6ÿ‡„7ÙB.~é¿”Öpk)%ô§bBDsh.­j%VP´…F\,'•0¯A*ŽãÂBCÆ‹Ùl’$ï3•ÐÍ{G#û>:dYv¹\N§ÓápäææfgggeeeeeÅÆÆvíÚÕ\y“±)·oQžçŒ-Ë€2M•£”3YDŽÓ]ù.Uç-Af‘'J~¾¬1Ñj3 ‡Þ¶ðf³I(f3¢'5UQµÂ¥è@L¢Às¤`Bª¹ÝŠÎˆh6‰g eªâV4ýb±óœ*ñTÁ­éÞÅ6V„ãDI.¦«Ë.Y£Œó“,õ“—^ÄÅB™hµI>[âqç¡T3O8ŒéŠ»`C_i¬,ÍV“ªÛU´>/ªœ ‰Ïs!€2J5UQuf|g’Džç8JUEVuV´Ù“9cŒM’(p„Â4·KÖ)#þÛOÁÕ¢Àó!„€®¸ÜŠî›‚[ƒRTÊñåO>¹ü«=zÖÔîøMYÕ¯ÞÉç6¾5fÚ®Á½Ü-\qÊå›kÀQ*У÷=Dýµ“Ò„PBo€ŽE) yyy»wï ºô¤Ž=zìØ±°°°°°°ÐÐÐàà`»ÝnµZ-‹ÉdEQžç9ŽóìÃÓu]UU·Ûmç999.—«aÆè^D®q¨âÈqîF'…^;!\þK®ægçÊ”3‡Ù„@‚\ŸìرÃd2…„„Øív›Íf6›EQäyÞ°LŠ_/T Œo@ÿB@×Ýßj/„ã˜ât*…Tv:å‚¢¹=+ÄB˜®Ê.Õ_âT•]ªì÷Ð;' ŠÛ¥”XJUÖÕb§™&ûîÕV¤ØÞŸ}Š]PrM•5Õ'U¿Éú;铱Oò^è.§zñ2¦¸ ÅJÀèÊ*y¯«ÝN_§ ¯´V4Ù©ÉO˜®*ºè;EÖKj6Å L¡šâÖ”¢¢õß~ ®–µâç¼S JQ H±=ï¹éû×~Þ¿ü“=ÇÖ5)_Å5Ò37|±)Ÿ±ø;Fv¬JTg¹W0!ô诔&„RÛ$‚ ¥"W0bƒ H%Á `¿fÂKf›ír¨ù/9ã%‹•è|¹öå¸v…€ bØHéEqî‚ H…zOìHËŽ½á'‡E¤§ÝÞ,¢仮±È:.ü¦ O)ëœm&›T—“¢²äÚÆf³…„„hšV|64‚ ‡pæàPóõSr‰&‹xÃA*æX4v…FÙ!‚”sƒ§.³ÛDŽÓòØ‘–fg[“oé—b2«N—z nœ'DÔïÙ_0s²Ó­QÔ&‚\ûDFF;vÌf³aÐ"‚ ‚ ÈÅŸ ü_†A*á8æÎËs£$Ê(/Tq+×nñ™.»uÔ#‚\„‡‡»\®ôôt«Õ*IºAA bŽE‹Å‚¾EAAäÆAQ”5j„††8p 77·Âé  ‚ ÈõF,"‚ ‚ Hé¸Ýn‹ÅÒºuëKIä“O>AI"‚ rÝ  AA¤,¨ªšr@A1ÀˆEAA¹ö`T\êAAÿŒX¼þ‘$Éd2 ‚p-®2ÎÓ4M–eEQP•‚ ‚ ‚ ‚ WèX¼Î±Z­f³ùÚ-?!DEQ].—ËåB…"‚ ‚ ‚ ‚\%”Û±ˆó-®!$Iº¦½ŠÞX,MÓTUEµ"‚ ‚.O„ ‚ ÈU‡"¸Ž1™L×Su®')‚ ‚ ‚ ‚ Èu:¯gAÀê ‚ ‚ ‚ ‚ —þÅ_ô0Æc”RJ©®ëÆÌSEQdYvš˜˜Xñm@´sëæ¾ýÉ™øæÉ!žU­gmY¹ü眚uc¬Ü8¡›fïXýÉ7éQuãì<¹¼Â±Z­×Sc%„ü—Ë,þ‡Mk„ ‚ × ‡ÊÉɱX,‹Ål6›L&“Éd¬(-ÏóÇqG ñXé”Roã\Ó´ÈÈ*,„zjÕK½w,õ¦†aWnØV;ûë‡3¿ÌNjR+ˆÇvp}ðŸ4¤«Å>³ê™±oHíÖ$âòÒW,£k·ÜÈíA.çÎÁ°R$IòØ'Þ–‰7W$bQ9<ÿá!£çìqR4g÷o¶vÓ+¿(Œ–þûçŸÿp0O÷-’ëô®¿þ<š§_¡bdoùê³µ»sôâø…sÅ ÎÛ6l8äЯ¹*^Ú¹Ú‚ ‚ î]¯ßÒð¦ÿrPzæßkÖn8œG¯¤  žXûþ¬Ï¶çèŒ) Í;ºù‡_öæT¾qèËU%ÿ†Ùe“Ãåû!•ZÁ«J•`Hgïùõ—-Çóõë&£Ji7f䆧R}ú4óëÇFÌÜG©×¹Ú}üvgsdtõêU¬œáÚ¬ô…¦ýå3ä½Ç™ŠúR™'kâU$÷¡…S^ÚßoÖì¸ ¾£@zú—î{ÿP‘Ü i‚é½"ý ,ÑÀžœ+³ 7Íúñ™“~ÍИB£ãÒ:÷1¬gƒPþ²ƒ¹÷}øäÄ/^š`¯ÌÁjš½þµ ¯þq^c¼-²zLb£.v©.Uf®Ú5Ò[@xì“© uèøcÒ€WóÇÍýß­ÑG7qÕwA¹fñÿ×Ó—öm5q›îmš6|}Óª–踄øêvÁ˜¢Ä+˜­téoõ~rLxôÇ&Ô6{ÏbŒRÆ(ÆçU×Îé#Gî¸ÿ§ï’íærÍ*¢çW mýÀ¿·}úÛ´Vö‹¿tþ=©Ýí_¤}¸angï*_ïFúÒ¾­&J3·~zk•Bã+gí ÆäNþ}Õðj¥ÆYQ9TŽ1y~ÍØ^ãמV€\=>!µÝ<8°ET‰¶´wCâJ« weÕQÌZ^;¾ÏC«O¸p¦°¸Æo¿oâØn±fRÑÛ2—÷>¯üŒ´ãõêðân½Ø lƒi›V©QΨJìOJ¾‰j(Xåvh‚”ŸÊ fL§zÌ€Ʀ<ù ¸`^’zMœÖ“p—íY<_ÎZ-Z,!;±ºw‘½„˜-.¢íƒSj84åèÓgï­?î±>±&Bx{B0µN0UsÓ3ÔØ!¯?Þ*˜æŸ;ðǧó^ñ癌®g»ì† ¥úeèòµÜŒójõ~Ïiluež>qpãÚY¬þêÖ—_×øF˜ç˘Nu®¨XÕuŠw‚ rƒÁ¨®i Ì™Ò.¤ÀåC“#IúÞgC€» yñ9[|M©„ŒÄZ^…a´b ÑvHkñ¾µK·=Û²]Háܬü˾N·vz£E('…_¶*–CÑ€CƨqŠ µJ+LEåP9eWsŽŸ–ãÇ|0¥-?ãø¡ß/œÔïã9#ùbDzÍÀK«`©\Þ *YGNä'<4ï•¶v5÷̾ߗ½û¿›2VþòJs;wí ÄGõ˜º(1GcLÙÿáø·¶™<ãžd!,%R$ÿy÷è&ÀÕ›äêä2L…ޝß0­qšñ¯~r˜D”£ßwÛàÙ{ÝÅ•jÖÖO§ŽÒ¿k¯;?:sÍÁüŠÿÉ·A(ʹ &ß;¤_—^w yrÞ–ìBÏK±"_0¦g¯Þ]zö~ô·Üò=щX5¹a³&Mš5i”istjã&Í›4i–VËõÝä»ôíÒ³÷-ƒÆ<³hËyíbº9ôèÈ;ºö¼ýޱ/~´éœâ7G¿Âaî£ß½óð°þ]{öîrûÈç¾9­THbŒ„$5nÒ¸EËö½†>1óÅ6ÒÁU«¹P3ÿ\ðì]½njÚºKÏѯ~¾Ï¡3=ãÇéÞqkÖ­Ú4éÐëöqÓ¾Øë5™fo[öâ°Ûº4m}sÏÏ/Ú–Uð•žùû¬‰CúÝÒ¦u›&­ºýê´Ê™=¤uë6MZµýS6¥®C«¦¸µsÓVmštê÷È—'+V#`Á ÓÒš·½¹ï û^óî˜Ô³«¦¾÷{¦Æü 3ÿïi»œ¿ßm´ šñõ#ÝûMÙ£³²4Kš³óË7Æ¿£kσ~}Å®Ây+úùõ³ž}÷ ž={w¹mðð‰ï~} ïâÏý¦¬gmþøåq#îêÙ³w—žŸü6]­t›²Ô•\lAA®-ÂRZ¶iÛ®­ñ¯Uý(‰({ßèØâù­ù~ ò³¿¿s·&I1±)Íû<¾xg…fãɱuã”SßO½çæÆ 1±)-ûOY—Y˜w±ÂœzSbÍš15bû­¾PæÜIxÛ{:å|¿ôŸÏèªcû²o2C»mÊùVÙO5ó6<Ô0¶åËÛ”€ã·±uãºÍ;*S g?ë—8ø« ­r "Õ«0̹oÙľ-jÇÔˆIj=|ñQ¹0_9èY~0¾wË”˜uš÷|`öæÌ+QËøéµQ·´jP#6¦F½AKwÿ0¦^l›©»\FU•=o´¯™öøÆòÌ:fÀ ¼në¶í;÷0|üäEë~x¡Ù‰ùãž^{Feei$>ÒÖ³ÿùèá¾mëÕ¨ŸÖç¥?Tö¹ @Õò7=Ô ®Ó»Œ×4õè‡]â<¸!—Ò€B+OS[´jÕ¶S÷÷Mž=¹9œùí·S +AÎPâW_ 6½tS­äs÷¹(ÓN¯zj@Ç&ukÕˆ©‘ÒzÐKóçMÑ­I­± MºÝ÷áÖì‚¥š7¬UJ|Lظ†Mÿ%ÝxòÕì Å+r HFìBL1ÚuìØ©S§vc,ÄÛ¤à(­š})¢v©j*í>*­jgV?3ð¦fõkÕˆ©Õ¨Ã€‰KvdãK ‚\nʱXz¬™±û‹1hHO0]×)û¥|`éÓ¿²ÞzïÄ1Qy-›5ãy.æƒqì ôóYH’¹v~ôäó«i«A÷ M”2ÿýiÉ>ðìfâS¤ÈÞ“žï%ÎZ­ü1{¤°¶ÆùÐz=F=Ö7Ô¦güóÙ;˦½—4çÙV¡Æü_Íej8pÜàyÿOK—½ô¤<ý½1©V® ©—ýÕ”·¶ö;¥E´“‘v ƒJžEÁysh¸…92À½ç£Ç}b½óá)FçmœÿÆ+p±ËŸhnvìÛø÷©˜Ï<’bqûã³ù/Ø›»äý{ÌäýóÆž›Ûnä„7j“_ðÖ˜] çŽN6szööŸ~?\eØ34 ¥y\í*9 Qý_™Ö§ºDHP »~|ÑSS¿µztFû!ëŒ#>\¼”]P#›ãûŒéóÅÃ_|òÇùv}ÂŽøæØäŽõÄ_ÿÞyahruXîÞ G¹”ÛSƒÔƒ‹ý5KSÓéв§[’×â®{_Hàÿ¸ðƒ''¹ßysh‚‰èy·l?SmЄ1IçÉ¿Ö,{kÂǬiãÌ$Pƒ7åì^¿éhÄÆÔÕó¹Äð †XRUUU…üXÕh)7šwJ*6‚ ‚ W#þÍrã,¥š¦iF|ážc ¨®i´`V%Îd̵ó­Awͱ {þýçcs×Í|zâÝ$îç×Ú†•Ù 7rdÅN²¼¿&÷ù1íòðKÕ³œûkÅÌm`/œ®X¤0Õï™ýÁ 8‰{œ+ûZ-!͇ß¾víÒ¿²Úw ç @îÖ%ßgW½mhZ@Ñ\üVóÕº·¤ñŸÿ±=Sm`‘äc¿ý“£¥ÿ²7oXM‰äíûñ_š2©qH™‹S yÅåv» 9·J ¾ñ*ŒrpÎýO~n¿÷å]âø ÇIUDÿrpíšyGÿ7³:OxqN]òïŠ7¦ô¿3ÿÛUêZ9=sËêï÷EŸ6¥E¸–ÇÕKH«ÒÒ´ú§g&¤Ö2qzæ?뎉žI¶@ù Ï.ZÔ¼µöÐÉ#çöüà½ïNu¿§ê>¿Äâݼ¥-ï}w`ß72Ú}êýVÕà\fXM€÷îݪƨ®éº^ØN6Ê”þ„V±»…ÊÙG7-Y¶›Eõm%@ r&%”³ðÕ×µþýÃçêý?,ÙL@ÉÙ³~óÉ„ o¾ÑÔrnãœÞ{æ·ø[}ä­ ö³ß¿9yò}U›þ2¹±#\D‹Á“fŽŒ°ë'×Í~î­qÏ6X?»kÞW³UÈó›‘z‰)ês-¼ÙÝÅÅfà¿m—WMo"çŽRÛ¡žýï/{øõ—Xò­[0óÉ^;²ü|L²…÷¹z‹¥ïýïÿÝöfÁçðÞï̽/%@X$sl›¿òtûæÜ×½ªH ^Ô…M÷~úÍ¡QiiÖŠl:½û;ûL/øli;máÄFê–EßfTôΤ!ñfŽ@Ó¨£?oÛà׿ðØÄÄX‰@Å7¼ö… JhÙ1êDœ\?þûígÕ–!†c1¢íà{ú¤X8Ò¶E23áËåÛ¿Ð*´ ÂI3r¨­^“VÍêÛù2é£4_”ÓqöðŸ+f~—ejÒ=Ù޳–¨7á“ ·V ¤U?¿þÎ…+÷oÖ[B«›:Ô³rí:u¨Ë?÷íý^meÏûkÖ¢ÃÑCæ¾<*ÅÆ‘N-ÜwšÿÁ_w¼Ñ.  JjsS›úV€â°DƧԉ7¤í>œ~A·5hÕ¾uZOCåiÀT­~œðÅÞƒçÜŽ£~…91忆âÔ_wd÷­Éçíûi/¤Ž«œ¿mºßf™Ê¼µóñŠcUû½5ip’…#m›ÆËc&,[´õÖç[†cÖ¸¦íZ¥X¸–mZ×æîŸ´dÑ®^“šåhð© ³ÕjÞ®yŠ…\‚öÌÒo¦·‹_§ %Ýh©ÌçAî·Øv|#‚ È5Çß5MšP`RD _½îÅFFnYöo¯p¤Ñ‹ëž½+ÖÄA³˜ô:½·l÷³mÚ—Ï"Ù2>­ÖC¿°ö\òç¬vê¯ÿ[vªæÃß¼÷H] OXÇØ½_ü¾1À¯­ÑÉuë'›ËmŠÛ› ï_}ÅÂE\èÜ+’‡ì?ý”7bH=ß·‰@Õœ‘Ö;ŸôÝÇ]1!›×Ÿ^ÙþãW×Âá·ä' oYÞ·¥¿iYçQrѼ¢:­ëãwÕrNeR{³Ž];¶ ãIKoãÏ[,û—×gí­>fÍ»7°ñ¤{Ç:®›{¿÷ÆoÃçu `Œ§vîqSG€° he³òsÃâkHùÿþ´kðJÃàK²âˆ%¾E²8{ëö3þIÓ€jÚ»»«Ý¿úƒ'ÚøÂ ¥¨:WÍ/ZÎÉ@B+›ïoÏÃIEF-z´eÙ?*LXNiåTN~ùؔɺ½½ò©vñŒ1{r‡.›Ø¸Vq'¿¾ùýäþ#u塵mÓšëÖŸTÕ6.¤n·Þu qô‘ÕÝ?ýý„»K„­˜f äV,£ZQÅÇ*ë¥tQ”Ö¶+á& ÔY5õuNÚkwìÑ­‰ëÒ£[ßyàŒ76þà¦P‚/5rÕ8K'~ðË4â à¤ðZG4ÿªç÷wk§ßÕóÂ>ƒRó9kEfh×úêCMì!D°Çš9=ýÀI%¤qãhgœåJèL ´qv…Q3þZñÁÒ¶>ç⬼›Š¹î‹›y‘‚º‰©F‹TÛò½Ϋ­B¸Ò…#¶ï3¨Ñﳟ¹ï`§>ýoëÕ19´â n¡kÛÄ…øÎÞy¼k¤ Ú}DÖNNÐjÚEï”%ÝI‘oO½9ÍúÙ¾ÝJKÓÙe{ã65­GK|»ÆöÛv•ÛÄgBŠš‰¤ð$˜kß1¢ùÏo>4h·CõïšVi’ê9ÿÂd êu«ËOýiGv—Ζý¿nSïo¢gî÷ß,S½´snÏÙ^¿yŒÙhZæ-êÛ–ïÞ›¡´ æ<‚BT»C=óêƒûΫMM|jáO.Ñ"ˆôâØ4Ïžù;Þv)éFKõ{øÛnÂ~AA®5j?òñkímù8sµ:–€¹rzëA·ztbÛ¤§ –×uj=•¯Cpù ò:-z£cG€ˆáIAœ¶gûa9¬]»83Ï¥-·^ACÈ’z×ÝÉs¦ÏýñL·AÕ²~žó££îÄþI&ß„UZ4ïY[™ùí^g·ä-ßOyàaiÞ¿“™~_—Óµ}ŒTÞ"%?ôÑ+íC<öØÆgï™î›‚¥Þˆñí×LÒqwßá÷Þ;¼wÃÑŸ”Óïw…´¸©–Õ 5¹K‹÷ÿÜzJîÆ{ mvGsþÁ¿gÜ10âÀOÿÈIc›†_êrïÌð‡2åôÖnõXñFÒ”hT[ö:CZÜ”`”Üß«HÑõGŽoÿu¡•™ºO2½C0ÈŽ³6,{kæðÛÕÅ_?_eK ÂØJSÁÙåLÔ«ß»jJ;î¾éEÕŽ÷¹,!ÄR-!¶žsèêéß{iæòuÿžÎçì¢S²œ4ð«iñŒJlE¤½”$ Rƶ}©7QÀΪx;, Ò°g‹ …;·žQ:…˜Ñ³ˆ ×cÑS;5¥pòD‰æÕ(˜[<ôʽ)æÂ눥JE·Ú°VKJNöÎW!]+ÃÒ"„‹V&êÉU/¼´4¯ãè'ï­AO¬™öæoÄ Sž#E£ $sxÿ)óZüýýçŸ}öÚ„ÏV}}Ú $kÅF#ï}{R«`÷îž~óÏÈ&ë„ t]£`nóôÌ õ­…‰kT¸@¾MGäÓ5V0ë­hB€¨19þâê»æ„!3>o»iÍ’E‹Ÿ¹xù½ïÏ‘R)[È(gwPYdR)0y®Qzüÿ¾Û’Õ4ü‡ä:#š†óĨYf«IQ‡0?•D@×€(åÜÊisA±uë×÷Ì[ÊË &$ „|³Jê ‹Ë$#‚ ÈÕI ©ÐÁ iM›V¹hî–ZdsYcæ ¢¥Ó´¥Ï4öØ_œµZ„PöùÈÆuöøú Ó¼s” Ç®ê…ù1Æ.æï]#ZÁ]ÅZýïkñ¿'>Zy´wÏßæn€¶oöŽ bÒ¼r TM:öŒŸ¼põžô›¾ú7ªÇ³½C׿¿dý±þÒš#7u«%Ayå’ܤy‹‹Úf†ä‚Oa̵G-ØÐé×Oç¼?ëÁÞïÏ{ô³¥6 *&ãRø¡pÂj’ðVwµ\úÉ IDATszÏFßü|.¶ÛjåСÇr÷Ö‚ûèæ*T¯-êªî¿‘dø+’®é@xETZ´¬pJ¾LYQšü ­ì®Ó‚VZ3µ^Ý0Ž@ƒ&­Ú$œo?`Åü­ XZš ‚šÝZÿªž|³ó§Ï´76¹)ªÎ$&kº‘’`€ª”2¦œ;rô›Ž¾ÏÏx®Y=¸hü„¯i6PFæKˆó¸4½”$ ðêOÌ•¡¦7ÓuVÚ!ਦQÜ1A.#ÜeI• ¦S"cDùèQˆŽ‹¯ŸŸW-H¨¬|ÅÈ”8)oÇæãî’;Þd—À™íÒ+µ¯‘Om;¬×ê?´WëºÉuRëÖ Ðyºoø×iª™TE,£pl5[ÜöðÔ÷_ïaÛóÕêý;¨FJjJƒfý&¿Ö?lË[Ï~rÈŘY§¦à>|ˆTOHLJ4þ%ÄØ‹)E9µi—CŒ­]U"RtÝZRîÖ§ ¢œøc›CНmò§Þj†ü .Ý{Á^«í I³–Îê´ó“Ïö8+AL>¶zöê³ÖVÛDš#““ mr{+ó¾U?üºò/½ißUxRB³ôhGŒ¬]SrìþûLÁjÊê©¿v;ĵ#‹j«gþÚ›/VOŒA¨P§—áֻ訜ïÅAàb£WAA®AŒIgä`:ebtÃѽÔ¬“RHí¸PñÒs”ª7N’r7ý¸?¿SÜa…¼óyzkÊWë~× } ®]8§½Çý7Wõ¥¸šb­>kgþ°pùâ-AnªסwÍ£_,_²loTß;R+²>)‚KŠpbHR—QS?ýyÉ]!ÿÌ[°ÓÉX19HÕ%I9þz¬ÀÆ–üòWŽ˜Ô¨ºÿ(J.²Ó˜Û·/ø|ýšoÓôN.)>‹¹ö-zqþI[÷±=ªÛªn$… É©ZÃ1{ó¯G½¦”T51<.2þ=šÇÊ ´Ki¥Z^–Ì¡KLã@…1•¦[ʈWNërvÞȱ ºË´UŽqëȆ½zÝQíÒ¼aæÍRÂKQ–¿Œ*E eÕK)¢¸Ø *IMþn"!º|í@>þÛÖ\±VýhÃä2"\é ù è`8¿uÝ_'bÚÖl1¼wôÃ+§<Ï îÝ(Ú,Ÿ?•×í–”àŠEíçݵ=$¨pð‚7G×®Ýxäqc–¾ø ½»oÓ›{ïñ<ýšY?Qúâ祟§öN`™Ž¨Ö]RCøKîx¤¨”j°lå’UöÎõjXÎÊ/òmþñm›ÿvY\§¶¬^´ò|ü=“q¤,±œß´f ­Y«ŠEMßz4Z#.%¸BÚtìÔÁ›‡Ï~yY»ÙÃÚŽP}Äò'åFõocqŸ;ž[«Oßú!pþ—yÖº¥q¤²ï›¹ˆø\óPŽà– ŽüñÄç,÷÷M&û¿þ`ÞÉš£^iâ·÷£Ój›—~óÑ’’ÙùÜjºUÙ¾rOªjUNo9ä`A‘A|Eë“sxç¶³ûBú‰¬ýzKFÕ>SÆw¨"ð$`K#Áõûw ~xñjïüzãPŽ t±·všŒè;ö“—_3ëQ ÿ¸pÙ郟jêY‹è†e‹jv®_E=ôÓâe§"ú>Ò(„#\ ”/ó=Ç…”¡FÕX bc/‰ ‚ ×Ý@hl¤¯_õëþÄu:?~OìmsGæ& nou>’]çÎÁMBËk gíÙôG¸Çràm5ÓÒ:<5®v÷ÇÓdžwL°ço=èðgŠK1Íê™ç~6cnÓá),=·F~åœÃKÂÚŽ»«zŸ9Hcƽ×Òoɹ*«)ÆõRwê o¥W¿ï±d‹(õè7õµõšϨm¹<¾õÄ7‹~eI©Õlò‰û²YP”]ð+‡ŽïOìñÎ臬O ¬Kö¬xý½£‰ÎjÆðë…µ7}w­.o?}P­õd¯øŠø/ü»qC˜-ÿÜñƒÛ~X¼pݩػ½Ú»ºÄ“ÒónH uK":?1¢æ­³†¦µŒµä§ç'÷º5Ñë‚ÐÀUããzÜžüúô矑wWÓjü±™ŒB[²®˜ÐÊKÖÞÍ›Âízþ…cÛ¿_4ëkGÍQSma¦@…)©œzÁÛ”¹ÖÀóŽöðÒ}3õxã2öæcaÆÇ3æ‡ÜÞ"1èôáÜÒ¼oÅ2²œþÖO+º4J¨oI¢ðj7[ÿXº®’KUú]\¬žýfæ[ÉZT“wþ¿wŽT»gz»p_jäºr,V½iÔ€õo®ùpu»æãR뎜þFè‡}·dêÊ\ÝšÐzdÛî)Áó+øtò3+.Fß1ûýaIw½63xþœ¯–Ný*GÌ!Uê¶·ù&Ï…¶ºÿ¡Þ¯Ï[:íEÙRµùà”Ž©!ü%WTŠë÷üƒçg,]üÚO ƒªÖ­ÄÞV«QjÄÆ¯>ïÖÅêµ[?øÖðžµ,\Ù„#fX¿|åÎL™1s•Úí˜Ø?ÁtÉ&g«?òéßÿðÍzÌìÝðg‡Ïx÷«¹Ï}’£™Ã“;Ž¿©Oc‘3;6/zmáY=,¾ñ°×ŸÓÐðjšëŒ~÷Û[3VLŸÁªÖnõà¬G‡¦Øx‹ ëðÈSý_xwÞó»-QmFÕk—¶ç‡?Ùš!3GÖíüÄ”!Éæ x³{d·áó—žý8k•ê1µšß;}`·´H#-Kà–f®Ý«GÌš%j·Þ…Ë|¸X,¢¤¡¯N·~øÁªYÏgU›šz߯rs¦¼¿W¼ýé9R³þÏ=pO][IŸÜ7)CF[XÀb#‚ r5RÒ®ÐÀ|g3‘/øê}'Ý¿öÑÅ//ìÕaJÓ&O}±¼ÊKÓ–¾5á£,ÍQ§Ç³=îl•³ß»Ȭ‹†Cì¸o|¢îƒŸ|þÚ«óg<4ï‚Ê[ÃcšÝRÛÎΦ,( Þåù©C~ííñÃekLÇG÷nZNcÐRoØýæ>¿£Ù¸!u̼¦z{ra¶€Õäcºmòâij}oK2p±Ýï¨óÚmàm‰å™@òžYàÞU–3v|ýμÍg\–¨†½^|ï¾ÿ³wÞñQmfw¯çÒ{'¤Bè¡w¤ (Òõ¤‰tDPAD©š€4¬TDzM€Ð{ ôvI.×vwæýã¸$w— RæKô“ìíÎ>Ïììí³¿™y&R†•®‡ˆZ·lqødöÚCSˆwtûi›?Q[‰ XiJjö§Ù7SŽÕžÐÕŸC2XG_Of÷ÒÑC–!ÆÁ+¸FÔKŸny·S_ ¶kOjÑ>VY˜¤¬ÿþï›]?ûrÓ¼w—çEà˳[t ±´YnÛ5.täªeÙÌ[÷ÁðÅ«pöªÝª¾›Ä”a­Ò*à"ëìï#ݵxø€%¬ÒÅ;¸á Ïg¾3¨±#ȶ1ò²/ ǘ ßMÜßuÑ{+^Þ>9¬Ø¥)Ö&,f KÂF.û"åƒoŽÿÍ@¤Ž~ k82ÄÚ•µq¢QÆó»¾ý± RÔBÁ²…Ê+Sß'zWÍ*»7@yÛ!'Ï=²ìýåɼ[X³Q«¾˜ãP‰ª¡P(,ŸvcQAàyÞh4êõzN—ŸŸŸ——§Ñhrrrrrr;wîl+u"Á"†- Œ1y¸Œ1A…‹L"1L¥” ‚K}.’Jä†,Ëmë–X˜\Vm—ûrX¯¡ª¶İ,SAïÊ} ,j¯ÄfÙ&ŠR®[ÃΉªå¥Ðêù*Z– Uõ2Ù»‰ÊÕ‹þd9úRC¡<)8Z …B¡P(Ê3‡Õ©}!5CEÑJ¾Û·oqÕ¢C<g,óÔOÌ€j4»JÖoošÒwé ΫIÿ…?Nª¯zBó>-yjk»Ì¦ò”[þ„+ä¿­j¸£K/«M¡P?Õ<šòTag*t%bWk“šŸ4v¦B?=A~Õç5S³) …By^©®©Ð‘á¥crA‹ž-Ç=®ñOþŒežú‰PfWÍZó4_¨ôLòª;òÔÖv™Må)·üù»móm=K…B©7nÞú/§BSž_ªg ö QQ KͦP( …òXaÆê€[³=ßè'Æ2OýÄ ¨F³«hí£Hî ºméÈS><ÌNSy1¶ý‡·íã¾£Ã" kµP(O6&¡U@¡P( …B¡P( …B¡P* ±Hy–¨ÖÉÝ”òò,Ì@§P( å…ã^Â] ³ý( …B¡T+óK…EÚ(”²ÛM«J¡P(ÊÓFDd”9I:EL0ÆæÕ hHy@€Ã0 ó0åh5¶öÒ…Ó §P(”‡\º|¥BûSañù„"­Jµ Çq4ä¢P( åi‹÷DQ4™L™™™999z½žö+SžBr¹ÜÅÅÅÃÃC*•rW­½DቄV8…B¡T*,>·&Ïó´(ÕÏóæ hUP( …òô Š¢Ñh¼uëÆ$ªV-™LF«…ò|`45Íõk×4Mhh(BÈÜÚuz}HWyZ»ÁhÔähnß¹““F…E …B© TX|>1÷`Óz T ‚ Ð …B¡yª…E¬»!>Q]·YˆšEOüðç¬6žTX¤P( å)DEÞÄËd2ËÇôå«Öoìêâ €,å|VvÖ¹ ñ¾>~a!tÖ'åYB*• /Š¢Á`”J¥W[PJ‘J¤:ºê…B¡T *,>Ÿ<aÑ”~róòÕŸ¹z7CÇ8øF5yùÍñ#Z{J*š®¯|Ú•A7…¨ÙJ˜QÑñfÿ'Ã?Þ—¢'€‘9ûE7é¸ù €†sþZÙAuÿ·écWÄ&kEÎ9¨ékã?ÖÌ“C8ïÂoKm9z19Ÿu©5àË%j–:¼½ìîÎof¯Ús!Ý@äÞm'|3¯—¿YÖ€SÍ ê;3š¶jîz³ó§§cÓrôóM¸ÜkÃO£" ÓÍCm­¿ü×é Í‚cå¼Öû¸÷Ø«ƒ6þôf° ð`óàþkC—üöyý‚} ÊWm…ã+¿^¶ïÂÝ”\Q7ýà»AqïN¾ÒÛ¦O"˜£Â"…B¡P(Oc¼'ŠBÀRX䈋›³h‹¢(ˆ¢Èäß·þ*ãäáQ×®_qsk]lÐ"ÎÜ1¢ãè?u…kúŽùhüËAŠrƤýKg-üõhüÕ§¬×¡ÿäÏßëV,«úss :7îø¡Hµ¼êc-+ç¬poy‡˜ÅRÊV½Eöü/@JÏÇ‹Š!c åXú\‰ˆñ¹¼XBu·Ñ0]øˆB¡<Ÿ,^¼DÄ⤉KôØÚ^i¨°ø<ÇšÕVVÁÅ&J[Îy»‘‹´¨›¸(5ÞX3vøª¼VÃ&~ŽnîZ±hô8ýúUÃÃ䌨½{.ÕØÇïG)óïþ»~ùÜI\Ð/Ó³^}æÌëé+EÈÁ_Í äZïÕq3û»ªÄ”Ø_­™ùuä/_¶va‘éÖºqÃVd5}ã¹õ=PŽÆÉWf>­åábâ†é_þ­0yqk.'9?ØUbÅ„B„×<ˆßºý&ñèXßÃ)²K}é?'Îf ðgç^:•$©=®¦²(\­œ×@°(>JþB01€ò×N8ÿïÑ;îoΘTßk™ðÀÚ® ¤ûlÛùDÚ) …By ƒ½Ò‹A ‘ª¢ƒ+ﵸ¥¼µa Ä!´EûÑJ!PÚ³“B¡P(Ê ûÂ`MX€“‹Zlå…ÍãE)ÈB5ƒÃöìÝ1.&, àV»y‹–®,‚];x^Šuðàý íüfýÏ=pü£:Jñòœm×¶ØvvI ³G âçœÖ{øŸÿ|ÞÖ] „  ˆe€˜}rÙôVþ}ö>ñkÐyäœy£›¹K@Á±Ñuzwôà„p9ƒø»ß·o¼ öç–5Ïßöþ¨¹{.%¦ä‘: A· æ½UÏÉlèYÍ|f#hþãÍÝù¿˜2÷Ï“×îåÀ©Ý’í£ö|v˜M;KDe•pÉýµõÐ9lS¢«1m;Ä80ᜓߕvS{xT½×N þçħõU Ê?4,ºïíc÷ލ!cpêæu&ÉWœ^Dæ¿;¯´¿4ʳ¼Z0ÆcQ &V”ÂgÒwŦó&„8(8M¾1S£— žõoá£^$€JÏú/q8ÈC/þ½åÉ?mØ8cØÆÍ#–-©*7¨|Ã"œÝ(&0§Ï;;~¹<.¦i£WIfn;–Ñ¡öY¾]›xpUõ1RLz¶CY;µaíûÀÉŽ …B¡P^LÒš/ðàìªEL€R,.3Kaæ}¬p|h¨;2qèèߦ·p–H÷o¥xë÷#io×”j/ï¹ÊÖûº¾cQ Åg^º–G[ÔrfK™§9øÅ’+~ãö­œÚ@Í¢—ÛGéZ¼´xö¡á›º¹Ù}×pŒ|©[ç¦SÛ÷tÙöûU]«h¥oDÝzrsÏ«!޵;÷èãÀ @ر³Zœµn°m7]õ®ÏNùë|ÞÎé'$kŒÿû†®k3îÖžS¡Ã[zq&°êoS:5ŲŽA$D,ÚzåM¼Fk:wó>`dþwñnÃ0 ƒÆ&“Éú¨DB0)ÊóËCmÑ<'zâ„ Õ®*]ýŠRÔõúwvÕý»ì—ë:±øóXêU«†4/þD’Áü 6Ý?~._\Ë[f;båÎr(ÈÖ‹E ‰q7…°Á#z·©Y«NÝP§Âc¥ž‘\nü‰Ë( Ôáqê-|¸tÓÒW.nùíª®tØ€!hŒDî(g€qk>¤›Óµ_þ:õÏ¡´ —;J-Ì®œ×œ“Ÿʼù@WNÞŠ;VîS{vR( …By!ÁX4çž³¤(µ"Ã0ˆaŽe9NÂqN"á$Ž“€ ˜”8ˆžùç¿û÷ïÛ½uÓ’©Ýu+ûw™¶?StjÒ¿)wîçC©&¬»þ÷iCXÏ&® ‡1`9†(a‰!1öŠÎ¹yÇPsw/R†wn椿w߀±y¹ËÓ[ÉéŒäþu|A“˜Íío^’¬(D„€³];«ÅYKs‹ì°ã&¸7{%Òxzçå!óÔÎ{Q“ÞkRp䟻zCâÁýiþ]ÛùJŠõ*[úK)VÙ‹‹¢ 6èÚÈýxÜUMf¦&#]›“Õ¢Ž¿“Z™•šœxûÎÝ·oÝ~¥…?­n^ÛˆV2…ByŽAMš8qò¤I“&Mœ2e2˲åùâ­tÜ¥ ǦïLë~rúòaÿ»2°W›ZAnl^ÒõK‰ƒ&¿ÜôÝAÁƒÖNûX1êÕ0tc׊5ßžÓÔÉŽð%ñ®.ß´{õOuú†‘Ì<Ÿ6}¢ýКͫ~uìZ/P•–¨-lÈȥŘ×ýþ·aÊ{äí^õ}åº ]CJî~~ëIê©4%Ÿ¾O<Jõ™Cîíø³Î¢.'éê¡?6þ«õ]· IDATØ#T¨¢õ xýǯîðcÛûK-{¤+çµÄ¯}×à¥+~¶Z×»Ž'›|-ÇþmYª6ºGXÛߎ …B¡P^H!¥´åyhrrÞÊTh–c=ݽy^°Þ¡é]§Ž+‹·jšÙ°ûæÎÎlÛ¡Õ›m$#ÖïKy¥áŽÒƒ´ñy´V‰Ä-ž{~šµj|Ó)õ‹­x'óo.[râß;úuUáö¾“YxŒŸ !Ñ-Ø ~¿xW‹ë(ËÖ0J7h3´‚ÝìÙY-ÎZÞ› ­Ù{P伕«ºëÐñ½`Ç^ÁŸmùi\õ– !ž¶âraαXZF·¸’´]‚±J)sT+€a[V<)Ê‹Àc’ 5Z¿å„ø /dk²ŸäIÃCÂJo7™Lÿú75-ÕÖôY“É”““Ó¬Y³ê³qêðW&}Ýc¢Åd1ç3dÖúA…£ ™‡ ­HCÞùõÈhĘçÈ¥Óêc/Ã2dþ?ø¡ãtò耰^ÓW¿2Í"8`̽‹HâÖøÏÖ.*q8bX»v[-›è“¯ÞÉŹgšû·Ãk«Ú{ÚXg¹¢^[s¯‚µQlÏòÚI¡P( åÃÚ,N³hèãë ¦Äª+äÑ>ÅãÎ%ÈO¶õ«!¯~ À)]½CÿoÞœñÿkîÌ"… ßrÁØÃuÞë$+!б^ݾ;v°õÜ9«þúnêÒ,dîá»2‰ ¨;mû6õô™?L˜D|ëvúxû—cê90¤c7ý˜=qöªÉC¾8…‹W¶<$6W²cܺÎ]â‡ô “S]±ü`ŒÍ­½<êß«­ƒV¬Ý‰1y¥U SŽZƘJŠ …R%¨°X^rórƒƒxbÝY ÃÔ®{*ö”·O 53+;+¸F°Éd²5œ•aD£ûð÷ÿ˜=úÇ;œgýWf-­zZÓ>+vR( …By‚˜‡n•ÕjµF“ãæænëÀ¼¼\…BUrEHƳçšsI«Š¢\ó$ê $¬ÒÛßYÙfd÷+Yç\gÐÜM¾(i3ãÕjÜê}c1!æI DНÎù£çì‡G˜'¦D}x&ýÄÎðpï³+£°‹€ é;Ïk_™ó2 Ë€åž)a§¨¹}3ϱ^c¿bëÞUÉYP6Y|-ƒ<:7’Øt€ xó¯ôÁÀ˜÷–„Œ9”>ºè/Ùô—bµµRö´åÞ-_mŒ91§ÝW7BèTh …B©*TX¬O8¹/Ƹ09ŽS€çy;Ò!z˜2†b iؘ ß(IR;) …B¡<0 #Šbé¬s;vùnÙ·9ÙÙ楚áá/ÄÙÙõånÝJwN#†åJËhD—xîJŽ˜}ü»‰¿;ÛõªŸÄæ ë9ð`½#ÜÚ!ˆa-_OûHE ËZTlOvj¯zàÛïófN%B¨ª9[ÒJûns¢ä™íøK±|-EQÄ".ç‡ËÜŸˆÓ©Ð …R裫b<éGŽí³!°—0„ ‹åÀöLfj'…B¡P(”§Œqé‹‘‘Q‘eÄå·Öyyñuλù›K™ÞÈáiíã´a§S»çNŠEùÌ~Vœ}ñÍéÏ:b‘B¡Pª+À“ï˲s:†µ7Ù™eÙǺè…B¡P( å¿%//aP‰¯š{—åufMþ€N?~z…6[v"Fª`ž7g_È·°¼¼<@€TÝ: y­g …B©TX¬ðc牞ÑöEÈÎEûŸR( …B¡PžuîÝóõõ{Ì“T¬O~ú¨;Ÿg_8üüüîÝKôòòzïwÞÞ^´†) ¥*Pa±bLžÜPy{cíXdYö•ooÒ«F©:ÓÑ.\ …By‘sNoÛzÍ÷•MÝ8D]³†qhͪ“¾C&v‰¿?ÙêJzpðà7Bt°åù¦]»v7¬óòò¾qíš ÕX²D"ñpw?{æ4Í"E¡P(Q;¹ThÿgLXÄÆÜÔ™¬_ /9óäK¨ØˆEÓuS?=ýáâ·#”VçR`}ò•KIµ«l¦Ð³“cÑî<„ 12) …B¡T!õèï¿ÇwëðzS7Žºf= Ì½|䨹Ö}1!Å~²ÚÄ{SßgY–ªŠ”çBˆŸŸïÔ÷§!€Çs‹ 3½( Å‚³gã+´ÿã  ŸqzÛÆ-/Þ¾—ž/J}¶í=|@3oie¾»±æÀ”! /Š^o.ûþàÊt W±ëÂ"ÎÚýÞˆo¹‰›æ¶vf-‹”¹{ûøº)[© ·7|>çækß|h]xD`¯ÿ™aìåXd†At&…B¡P(ÏXsxîÄ/Žg ¤NžµZuøúKQNì“|ñ­bò¬»ûϺ~:p)Y§ôŽj5xôÐÎ!*+à¬]S†.¹^,eZøøµßtq|#%+êÎ>0ýíEñÃüº§¿ekYΤí1ˆ**R^ ç« U) ¥JHù¨*yý;}6"€àák—¼êÏœÿᳯöÝHÓŠ s Œj?xôàö ˆ>áÀ†•»x;K/u©ÝcÚç¯+%HĬ¸_¾YóWÜ=‰‘»†´›ðéè®VzÊm ‹Ö?äïmxwÊ?æ¬.GÆ{ÿüøíχ¯f‰Ì£ÙðO§wñ‘‰ëǽº@ô´u_¶T[F«°‹¶…EbÐä‹®M_nât6p …B¡Pž9€cHºu\X ›4ñÏôùž= }ãHȉÿsÅŠmq·5ŒGD«Ac†w«©bο²ã‡Ûc¯¦hY§ð^Ï¥dHîÅm+Wl‹½žN<šô1êµÚN,sNmø~Ý¡Ë iù&P5¿dNo Ÿqâç¥köž¿«a½BƒAC #/bHØûâŸ^É4™gó‘³?îê+É?³è½ùWÍX4¢¶Ci¥Íôàp\Žï+Cûµ ’!w¸µâ©ø4¡‘šµ®Œ:G×­çòPM4Ç7؆ñúKóÞúðÆkß/ë E ¤l3bK9«§Õ.8¼lÁºSwÓ² LHåÞdÀ˜ÑÝCU,0YwäÙõ¼OÁ•_v¦G˜Ùêß™ë7Ÿ~ã“Ö®OMÖI„ÐñŠ …B¡Pþk—°ˆsâ~>ƒ ùdZß‹¸ºùÖ.Œ‚ ×Ö¾?ñ·û‚ˆ €1áüÖE®æ~¿¨oœÏ8{ìÒ]½H©ôÙ÷/l?CôX1¡Žêaáµ£šC2w%ˆƒü”4=ç –ê4Ù gÿøb–,ð»!¡rþΖi﬿-`LúÌ,NÁ t·,çýjö¦ÓF;xxËôÙ©Z¹ÔúH{[Â"±ú!!XÍÃ5ù¤s¿;¨è5bfco.7MàÄAáîݧ~ÐÑKŠÂ[Jô=Û YÆÆâ-„e€Ò; Èãš–¶p …B¡PžM “)³rµ³œh3´"€ñ榦mS¾2bÚh/mÜÏKÏdüVŒ©¯Æ ¿|8q}NÃ×ÿ÷QmwÈÍuô–"dº½éƒ)?i› ñIsgßúïhøvás/>™àÖoâèhg±€©éÊþâê÷gîÀÍŒRSšuåߟ®ƒøÛ>ÿf¿òµw>oâÍå¦k\$ˆÉd2ñ6f€pή°7öôƒÞ5búå¹Ê°ÚœÍñ–cŒ±ùc„X„L·¶a<ÆI¤ EbÁøKé¾' Sä'ùuý739ÿUã(—l¸V†XûÛÜì£öu"<›þôÅïÒš¿æ'¡Ó&) …B¡P…~©\>ýz&ÜbûÊ™ÂHò¡†³/ÿã¾ Jë ûìÃWjjv|4æÇë×7®‹ïòQ3ά®9uÿjÕ„°Œ-ãÇþx/ëÈþ;£¢£å…eû ˜ûÝÁ2„–Aòèñ?îkÒææi3ŽÌ~oÝÍû±—r†H,ßt[ÙZoÍŸÝ'\ †Ë J—`ʹ—d˜Ô=^Ÿ9Ff½Ûcl]X|¤,ß^´UÈËÈÅÊÈúÖr` *<Š€ÜÅ/¤†¿!TRV„+•c‘ ˆaiŽE …B¡Pža0¯×fÜ‹ßñÃÁ\iÝö!rОùqkrÄÈFvñ” ¨í•}rÄ/»o¿]·æ¥·Üõè½`æ›a ¦Pžƒüص¿Þó|mчƒB jÙ(Ø8zâÏâ_™ÙÔ QÕhܪq¤ D4G6üî3àÛ˼öŸ;g6"?=«j7l­fsŽÞ_ó s$V:ºôé9eDü‡«F8Õ*Òx6Vìùñ¨¦vrD^Y0 ×ÂÂß]{|»jdΞñÖ!@ˆ2¨aËÆ‘rÔ¸¡oú™)G&Œ¬ëwÚ–kȾ ¤íû㢪ÍÜzjVÑ WÇéîMèþ¿P9C¥E …B¡P(”¢Ðï1•‹8)ÀrŒy˘rñ®Hˆ¬~ÿnµÝ¬[Çîko\1ܽ˜njê[Tð2Ÿz‘ލÑ$皊„E„X–e‹ÂSœ{î篿Þr.“‚1&P­Œ™çnð„H |9ÜIÊ"P9à+%H|7÷þå÷ä;+ßv uþû´©a#bµ3šëÂ"!DÒ­o½ã«?{§u·W_éÚ*Ô‰C…; {—+#,2„^œ¨1>>J_£.> czOS( å9àò×ýzÎ7\@«Q_ŒiëÆ × Bò7o¿ümaì€1–gèê«w uûËæah`ʸzר®Óدp£Ü¿I´jóåk馦ŽLQ8T¤òY7˜œ4ð–™wFÊ‘…öPÿèò#oµëÙ§W÷¶aÎ* Ól[ Ò“®M»Æøfœþ¾aüþín[0uÛΟ}özM%!€”ZôåQ•s¨ÌT߈EÄ6ï8)Œ3k»&ã^þ¶“Ù±yåKÎrõë»÷‹T„ºrrŒÓ3tOgl¾+Õ•ˆ“ìîob¶ÉDþ#gIÏ~ÁÃ=J¯*g\º6qO>ÍD¡P(”ŠPcÈã9¯mš³â¬[Ýæ59&,`7?gD¤¼(@ w'.U$€¬OT°x,¥ä³öDB QÀÖ>’÷ù|M“3{ÿí·¹Û:ä«yBí¯`BòÎ~¿è_Õ[ßÏìé+A}úwZ9jƲåmÒÄÆª,*¿ð¨È¢‹!0Ù1! ¼žÇ#9ës™Dž{®•áÆ®½)Böúwûn@‹˜hþ¼ôVtGöéh&/Nt±eË/¸:º è_Î×Åw—«cyœ¥£[2•êì7û‹ S"€^¯?vìxNNv‡ÜÜܪnX~nîÝ„»q§N¥¥§Q]ƒB©FeÊÓóIÓfuêÕ£÷àózí(V$™ÇuUkwŽ–^¾`HX7{¾|Dߦá>*1/åÖåtï6­ƒd>ÑAÌKÆó¿î¹öJMÍ¿»nB¤AQ%b[>ú‘ÔÙI ¦]º«Å5å À¡Ü{÷´„@PçÁ¯uõ/œY·óN€Ä+ÒŽÞ4žûí@Bt2iµ ”:•*cxmS³ÇèY/¿yyåØé¿¥Ü9›68,XV:z#„”L‹¶LŠé¢¸h*´ùFéß°ûèúm[®œ2sçß·º¿ÍId ÏÑ "æ¬a¶oA6„E(œÅ@5N…FŽNœ"'狃º¹»©:ŸÎðg§oL¿j*#¨ERù Þý½ðõ+šMçL9„ ôU:Ww<^týwÎbáäÁ¤$ À†>o{éVíÍ} ‚ñ==U) …RA”>¡a¡.lÍ©3¼óኹÛj-ìWCêVÓObLHï.ÁJ‹wÄ=ÔOòû¥ÓɦèPyÑf‰Gx ô—KgRLÑ5åŸw9_î!EH(y6‰Gdô× § u"K/=8U`“^b^jûý˜÷·í¸Ñkb=»ëS ¹·ïÈ#ƒ]$ à Æ)<¦¦tWZšŽ€c9äöŒ}áß»É:RC^ŽŠ´ïšˆöòÖÃ9þ}?žÚʵpÑœuxþì?wÄç6jã €?ŒWþþDya" žç›5kæîînµãÜÜŸ\ AB0&"AÀq®^ÈÎÒ4¦šº=å¯1^àë„ø× D @…c0Lc"b>‘œƒ Wæá€¸—É_L2ÞI¸iKÌ/Q†zƒþØñãGŽÑétÓ¨QÇŽ«"/ôú»w?Ó»o?¥RY-×H«ÕJ8Ž~ySžvìÜÙ£{÷оdŠ¢˜ôàþÁƒûÔáá‘‚ ع:бcg_¿êD©,å¼vå-*åŸ?˲/Hí=¶oÖ«óø¡ûÇ­8§{ðïÊÏö¯4÷4¢háXoz3÷6#zþ2qkÊÙÕï÷[ƒÌ3˜kô{#Æ‘AÛeʃÛÔ’7\XøÖ++¤¢²ã£CB#œàNvÂêwF¬áb¸¥+Ôù8¯C;ü6ãßì3ËÆ½ºœcAÄž× t ¡÷6Žyï¯<µ»»Ò˜’Š H|ƒ­Ö‹Í‹ /áâ9¥ªPdÕÁ‘¡*EIùô¸¿ã± «‚O¿X€•.J€u‹ª!Ýqè×­]ƒI¶Ö£q»ˆb=ù±‰°,ksÄ¢y*4[­_OÀ`¼œ¬Ëljç dk»(ë«Yyãà™^¹S~ʼ#Ü,hq´þ£õi— 58&¬±w?/a×ÖûkîÝšW5ȬÇ"¶V=aõUájÈL×í8š¾=I@¢œô–_hü½IgL&œ“ó‚7Ü·Þ]”Ì´hë=¨†ÌKÅHg¤ü~0ýïôÂþë€æÁ¿5#påï;ÞF ›y —ªY)ˆç÷'mðŸaÏΪ;K2Ru™Œ!ƒ+ýAÁuÞ< —­U¿´›L½Î5>óÍ›º1ã–Dªœ:ÔÏïdÂÔ ã~ûôÔ­¶—LŸ¥lÝ®F᯼³eö\ù›]kÀ}ëNö4½‘£µà© {=hô¦Ogà7^mä§2\KÔF<|Ú‰§q` wŸŸ ÅJ7ƒì¯§,q¯×Ø}öå«këám÷ªSÿAµœÊ— µmã%Þ­:þ¸~ù‚Mú—£Ü˜Ô[¹eeÓ5»^¼K»NjƒßèÜ(*àáj-5T]‚~Y·ódvËnnÞŽ(î¾_K‹ßƒžì;D$+^wóÎì¬L7W÷°°H…LþX-EQ§× F©L¦R*«ør%‚³³³———9ú-B²s11a& ²DÁ)vQ/rãÒÎ „rªXääb wŒÄ „!1ˆñ ¼2y°!…*"!’“'’‡*§¥šxA8qâÄÑ£Çt:¯¯oïÞ½Õjõ¡C‡bãâbãâb5êܹSåäE£ÑÛçõþnîî\5©:Î? €Î¤<7¸ººúTBò vusÛó÷_QQµlÍÑ3߃;v®U;ÚA­¦ÂâSBy®]Ù_°&ÓÅË\œã/œŽ®UWþ˜Ÿ¶Ï»° õï9ouÈΛ÷ÄßNHÖ9•‹§_DL=g€”ÑoÏ_àúÊ]q7R >QÍ{ Õ½¦ÂþLƵíäé÷–¬Þuþ¾&ŸwòB¼ò¨asÞ¾ûåð•Ô[—S ’9û‡Ö­áÀ"Ö©éø%_¬Z»÷üÍ$Iâä‰MàÚvÒô{ß+A ÊOŹä´ûÙ w­Ù²çбÍ\¬NÕ±7:iÛü9Ûn »ì‹ðp.´)ûÖñßv_É2¹…6>©g rŒ:²ó’Ÿ~[ô¥IîÞàõЖáj¦X¨Hì‹ör,€.õA¢”Mª9x%@R;);Õ–2Zí•ñöu=®ª­Êº“K±á!-3‘/²[¦è-áRy ð¤DŒj4öŸÛ”=—97“Ôˆrúš¿|sâæ BË‘± bbƒ¹Ùß0d’1î£_!6¤]ÄRæ]áyBty"F²È0U 6çûCú<á Ó-];«Å٢ȱ(·¦¹ [nâ;· 8Rª€[ù uTFÈkTqç ’2ÙY7ŒL'«þéH …Bya`‘Ç÷<øáÆå‡;ÌîTkèü¯W®ÞóÓ—[óD¹sHóa-»D:²ŠÈ¡_í´rÕîõs~Õb¹w›1õZ×ðòÅ|åÊÛ—~œIÜkƼýåȾa¶Ö‘Õ8w‰ã?lÛôå¶\ž“;¹×j¬bøœ›‡7o½˜e$DîÞêÝi}Bd™ˆ(ˆ¢hãq¤ˆ>g·bóƹ{³ §ÀzýfŒXV”WÂÛÆK‚^ûøã¼oWïüvæ&‘•9º‡Ôtfm«6]°íÖœÞvVüFso‰ÅØP‰OË—‚\³íXZ§^Þíßî{xáΕ;Z5añ{”â©Lr­Õœ‰mÕ²­T*»qóê­›×¢k×{¬P®@.S899 ¼••áââZ@”\¢ IDAT‹çy˩ЄKãÍ!ºV§7'"@‚ &Às@Tx€”ËkQŒ&c΀2ç#5+†faQÀ„ÇÀ  ’³€,UEÐêMéyØÄó•vyï?ÿœ:«×ëýüüúõëŽ16½{÷nÓ¦Íbcccãâ:uêØ¶M•JU¡Â1ÆiéiÎ..,ËR=qeu•C¡<=TîK!¾níȶ\h¾½}|©ªø´]ñ2¯]YO[í…Kçš4nîââªÑä;y´Azjµ«t]$®µ{õêÃùÉlÐ$®õ^Ÿú}B pþKaܦlôùÛ €yÍç7WíB ÿz46«ñPsq1 ƒ@ÑsÂ7ÝÇ‹æÀ˜s™ÈÜcú¿ß¨)¶»g©"ßœ·jÈ£¬L±´Þe ‹ÈµÓ_*¾1,ƒœ}»q 0 í7kiߢs"„óЯ£f7IH¡)ÅŸÈÄ®|ıœõo:,S»8±wýö³)äí¾Õy=}}7Ž-ª7dÚ¾-ë’Ä”¼K‚O›ö¯M•»väÙ½ÕõÙºS zÀù\Iý¾ê6n—2Œ¦»F“¹ÖX@é² N&è f©ÏdÏÎjqÖºÁ¶ÝÌOÍ¿‰½šx²{µØÙOéDâåÀ\!ÒÆ>LÒ† ëþ&c¸Q(Êó«$ºw_¼­›ÅRÅŒªÎ¸uÛÆÆB.õ_ŸúMßâ± â\ê¿>õÛÂíE›Y×z}ßÿþµ¢miÐ[«·ÿ¯øjȈuªÕsüÂ1b\Ä Ö.%96š²êgs/§Uä­GÎj5âQèckÇ’ÎZØcÃxù¶1§ÕpR<ð ¶t 9·]´£uá_6\³çãÒaÎïíJÆù½¶rg/ófço-X÷&A Ë …ÅïO§ª²}›Ž*•ƒN§ ©òמ¿¢k?ÞRFƒÑÙÉ™`Âqœ»»gzzš››[¥µEA0ÆEíY•±0Ì»`s sLDlž­LŒEWh^›( ¢ Š".ZåÈ,,‘€ˆ‰ þðX "ÌY@‹þ3 D¯Ó |e²¯[¿áÒ¥KF£ÑÕÕµwïÞQQQfëÖ­nnnJ¥R­V ‚еk×V­Z:thÏž½‡nÓ¦u»¶m+$/bQ,­*fçd]¿q¥@§³xï! ø¹xøº»{Pa‘òtb2™ 00P.ÿïˆq …ò܃UEA„‹ Ì=–˜ÉÏ|£îÔ×já|íé¾½ Äb À6pÑ릨èsPÏoÚŸxæFÖÕûy„@T€cÃp×Á‚ÔJI%®-²²2._»Ú¾m¹\‘ŸŸëèèÔ¡íKÿîÿ'*¢–§§'«¤-ÚTéÌŸY™‹¹¨Ø_`%2µQŽ­Ó—*ÁÎñå­e^ò™)Zü¹„%ŠA’ •,ƒÝ‹¬‹¬SÌèÏk )É)ë’ªõbfd~ü¯N  rÖ«åþzÏɶÄåôû“É”H¥Ë•¼<Ugú=E|¤{!Ä °:wWâ äðåÞ€ÏÇ%á×|lA~™×€0æ3ÁÉS^X ¤pŒ •=Œví¬g¡‚nêõdz¡M©ü."¹w:[¨çØÈÝ” TBì}'ëþ" C) å9¦dìS*4²úü·ºÝf¬em5dë%— Åì”`?6*Ÿ³å 𬜾ĶòTš=/lf±Ùøýi{›ÒÄž9Þ¡]g•ÊA«Íã8IRR’—ÇcÑH$ƒQ*•b,²,çéé•––âææ.‘H*Qš ¢(bŒ†)1\ñaˆ.Š"6RÄ€ 1E"b,ˆD±Paa‘7K WO'æñDÀD‰I$¼€<‘q,˜Bðp!JA$¢`Âb…G,NyoªÁ`pssëß¿ƒ ®]»vþüy©TZ«V­-Z „îß¿âĉôôt…BÑ¡C‡-Z9rd÷î¿<4ï˹úTúÕæòÕ ë7vuqµ×)|VvÖ¹ ñ¾>~¡!aÈö úíMù¯ÈÊÊòöö–J¥YYY~~~Ïœý¢,s¹z«ÀÜ\¿ÚÙ§™.ÌG]Á·y­[°¹ù±L€ —¨RPm±Ä^ÍøhÕé0W·úþn¯D;:rF‘¿™–óÚ'ûg mØ,Ê£Z†ï?Hº?9±ÓK]X–ÉÏÏeY.??×ÁAÝ¥óËÿìÛ£Ókƒƒj”sÈü³v[ÈŠ–„+ Çr¶~$©”“V.n³oº›i¸“n¸x7oãž”=z®C=¹‚ˆ—.ëoçÆ?T唫½Pð(¬tÆ<¼%VºÌ¢i‰šE"!O@")ã'"™—û);!âEÛvV‹³6ÞKl»‰…ø[¼C :H%oã.ž¼©=Ã6 x9øê NiJ*––þR( …B¡²~òµù'Okßö‘ª˜–ž*,4ÌCðÛƒZ“m01‚(0,ëé哞‘aâùJ”f±ˆ16Ë‹–˜·ˆ¢(Š¢ Š‚ ò‚`âE/yÁ` F^oäuF/å?£(¢( ˜"D00#`à1ð"˜bⱑ'› `^qz4*&¢PQOõz}Ïž=gÍšåâârüøñ¬¬,AŒF£¯¯/*"77W¯×§¥¥={611±U«Vÿûßÿ Ê[äææº8»ètyùšlMfFVjJZRzfj^nn§]4šì›·¯Wƒ€($íœ5zò†[Æ %æÄ­_¼üŸF‚–gËc‚Ê8Kå}¤Tübˆb^^žZ­–Ëå:®*knTšŸ6¬%—ÿ[º,¢ \L‰ÊsœFÇm‰»G€QDÕ65o) 3¢ÈDX‚lžV… ĉ½™+þ×¶Æ^I›úݱ־~J}ÞšµËFŽÞw`ÿ©Δê3–Œhòåú¸“—S­Þ¦úê¾zãJzfÚKí:€V›/•Ê FƒT*Ójó Á]:wKMO;ñ¢yà}µüh Î_¸xýÆÝïÙý÷žÓgΤ¥§ŒÆê*Ÿ ‹WXÄ?±s–^°ÞÕÉØ1ˆAáâ’¢Ü1 ãÈ!£€œ{Ù ²—#•­B¸ä«ÚdËor£aç QæÞݳdÿ)Ÿo¸/°µ‚8iá‚7’_–Ï1dŠ@°˜j .îEy­Âù(etÑjìØY-ÎZÕ'í¸ $ùf^¢Ü¡[m§(“öŒÆtî¦àéÔ¹–,ëf^OG%R( …B©K“ñæ}¯ØT胧¯n?tþJB:/¢¢†‘I“ˆŒ"2`àÁ(X¨Š€b$kÈMMº¼O——ZÑ4Œ1ÇqGŽINN&æ. áyþöíÛÙÙÙéééÇŽCñëì®ÝÇîh+¬8ˆ{¿œµü” gʱiïÅî;x-ï±è¥Ï[²ÉVÖÇÇ„áÒ‚ :Ï:og²®ŽóÚm½åi4...æ±´...999ï\ÙY™ß-Y0úí!o î3mòØÕ+—ædgmÚðã?{vá*d«"8Äy:Éž0`d{é®@@@Õ*XG‰&<ó,,4L ™÷3´ÿ±š¯3Mýþ`SOŸ¸Ó§¶ïüµv”ë´É½çÍÓ0`Öß|½hóØ®u?Xv(¯ÀXéS‚p&þ4Ãp­[¶çyÞ`ÐI¥²ë7®îükû•k—YŽË׿é ú—Úwf9tìÄQ¾ ¹w-žPâÅ‹—nß¾­Õ¸ºº ‚púô™µk×ÅÅÆÿÑR¯tm…ÀOî\æ6¾¡l.ÞòðÓjÏò#—ÕòÇ:@NΊ&uœ[ÈLÛ¯˜ ÀdØqïÜØ+€5m¼]"—ŒxþDêþ@ßÁý‚ÂÎibÓøÌxyÈýrsÖ\-ØoZã7YÈÜ—ÁQn}œø_wëò €ÈŸ¸Î¿ÑÌs|SfoŠ€åe¿˜¿š_‰r{5U“œC¾ö@ºµÝJÛÉÉßÐ)-éí¿u¤êÎZýFµí&€›¿'ÓmDUæÙ¬ûáo禶pïÅð[þ1©¬H¡P( ¥¬`Ñyù'OëÔ±«ƒƒºPULK=|ôP»6í]œœŸLï%Çrn®n®nnr¹\Žã|||““xyyWhn ƒ!33377W¡PÈd2‰DbžöûP}3‰ ˆD /A y:£F«ËÒ¤gçé&Bˆ „òÄ`rñvê…;¹üV ·³§³Ò×ÓcìæêbÀȃ/¦0GË ŽeXòSú??c\Ñs•Vyž .nÎfÅVÄæa "“C~ßú«Œ“G„G]»vÙ­E« sß`¼üý¨vyútMë…*¨¦ŠÜ öu’šSEU¢ ŠiûŽg›ߨ¹hM{[Œ—g~qä?…«Ùê^§¨ôy­WïÓó]Áª¼ƒB‚|Õöî:ýåEU¯±Ò…˜n,éÒeEÄÚKÛ8¾Ÿ/}Ñ¡ç/M6YÐL•½ûÝãw§ðdN>5vŒÉ;”óu4P( …Byö•ż‚ü'ŽvîÔMm©*9Ø®m{ '9wâþƒû>Þ¾u¢ë8ªóòóâÏŸ½}÷Np`P£ú1NN̈1.(ÐŒ&™T¢R9°,+Šb~~¾Á`”É¤ŽŽŽîéé®n®r¹Ìd2J¥R_?¿÷x{{I¥Òrž…çyBˆYI4« ,Ë"„,—>Øw6E$˜0ñb^±p*V¦!Ÿ/ÿ/Q0±±n'å&¤d3Wï!"Á@ÄBáˆàÚ5½‡´ ,‘T°œœà Ï*3/ýü0dáú)„˜…TŽãÌz¢ùÿ&“Éh4šßP0Æ•Áf!àò!$+#§Ä˜w/Gµ ‘eÙ{‰ Í›µ*[©ÒcÞwú?{çEñþñ™ÙÝëý’K¯¤‘ „Þ!tDÅŠ]6ì "¢_PQüZÀ†bù***ˆ¢R ½÷’FHé=—»äÚ–ùý±IH' ¢Ìûå /[ffggŸùì3óLû‰›‡©BpÃ;fD¡úq¥»~H”Œúdh“šw‘-/\žˆ‡móíó0w®úñŽ#n5ؓި±vxžçÛlâ À¬¹ Äøè'ËÆé„ú²ô½ëW-™³3óû-/2Р.ñÝ9·|˜$tÛÝ ™èSVV†•8XnúPAÓthh(Ƙã8¡Ùl.))ñõõmžùòåËyžÿÏþÓjMÒŽ¶‹TWW}õÅjNûðÜgüÅEï·mù±¤ WT^Ù-+ÝŠì‚Ú ?ýCSBÖ(L+©UË„{ÆøP}¹ý«7lçƒã($áyAncdÛ¯?\ìÙ…°U)»þ:WMƒÃ"ôR쨫.5»ð¿uë‘3¹F‰ò\ÚÙ‘#|ãb#‚‚‚t:-EQ …<.:|ܸ¢Í¸å†ëŽœÉzìæø6ë^äÞÙŽÝûw9ÖÛË»®Î !€ìܽC"‘Ž1†¦é±#Ç;~dû®íãÆŒsºœå%‘Ñ•f˶Í3§Îìºü‡1Þ·o¯N§“ÉdiiçÒ32âããÇ¿iÓ&ww÷²²²íÛ·[,ƒÁ P(jkkUªÎy­X¹Rà…çž[Ъyt´‹½ŒF­©¬®4êW2Óœ¼_oß¶_? CJjJlLlGÚb/{,bþ🹷þÕ¢qãfQ«1Ç—;…Äĺòö>ŸðNçÎ}E»öµˆR#`0ŸrªdÁé†~“Ð< 6ÇÜ_xèÀ…308¿û&sÀâ‹ Û­/|\'žè2[?ù©îSØp°€Aó#AåDR‰TÈ)åZ¸h_ÚÅ œÛ•{#ÄâgcñíÚáePžš?û,qAMvÓú¬-MÅæ;¼^@ „v©««;|xÿ”É3Ô*¨*––•îÝ»{ü„‰:þȱ£ÁAÁ'LÎÉÍ>“tzÌȱ§OŸ ›1mVFfú±G'Mœ »ã¬TWW'“˵:½Ãá°ÖYuZÕj•+£Ñn·ÕÖÖ “ɽ¬¬Ü`4Èd2§Ó)•J}|} ½½½ºè·Ø´hZÓ:ƒâï&Ÿ;a•á?Ì"©¢Djº7šB)ˆ(ˆˆDbc 1ÆX€èÂZâÍ«Q’ôÙ° œ>}º  À`0h4•J…1–H$M®‹¢+a]]Ëå²Ùl¢Ìʲl§B·Y €V¯æyN}AÑo‘—„°_`è_ÿÁó|Û‘g›0”õUuBõ†Û£‚€ ùo½aß­ ôûæÐªÁ­”ŽòƒŸ¿üú×;ÏVÐÞq3Ÿ\þŸ9QZT»gÑÏ$NøüÇ%CÜܸ’?$ÉF>DÛ¤"vºÅ Yo'„®€€¡ŸþaªcÛËóÞÛ~¶ ÜêJÿQw<4îÛ°ioZr˜øè›oýß-Wòû+ϾÿwJ^™ÅŃMydÉâÛ£µ4ÄVù µ‰ß¿¾|Íö95@nðŽ¿ííŸìת=Õ_³ôõ¯vž)ÂÞ± ,yõÿ†iW¼uiŠÔþSÑq9¹Š]+¿»åxF¡Ù 4£ßÜöÕMõ«¦LÿqÜÏ»^¨J.d U>±“[þêÑZQ*nQc3 ”ÐAÉëÎ9'ù‘í¿?ÖOŠ wþ×MXñíwãÚ$2ù"è#‡áFC0vÒähÛ˜;~ú6iÁȱLÒª§W%ïùnë’ÑFªY“CQÕ‘ÏWs©±]_A^{í5A–.]ÚÔ’—/_þÊ+¯,^¼¸£rþ¸þ;,ð>ò”`ø¤oýeCAnºN«a9ž¾´ð³_ýmé]ƒo¾oÙÄ­§Š‡iBô+v|ùRâ*Üß`àX€P½‚9«8ì>BÔ“ áªSž«–Ÿç)E@p¿ˆ ¦ ;+ÓO$eVÛ°Üà:ppˆ{ãtÿÎv¹j²N%fVY˜’*4îACFE´úD%ØËÏHÊ(2; Üèß?>>è2¸H¶%%#„w ëàÃtîîî:­–aŒ1MÓ&¢ŸþØñ\ ”$gŒ»Y%í\ê„1ÝÝÝ­V EQ§ó¯¿ÿðõñŽoEQÇ<“”¸õ·­“'M¦iº°(ßÛÛgİGŽI˜ÐÅ·-„pøðee¥ƒÒ²ÒÌÌLŽãÆŽ«ÕjSRR …¿¿¿Z­V©TÞÞ^:½®óÔAxûwAxþù…MÍfÅÊ•o¾ùÖ³óç÷¸ª‰°ØUÆ LJIÊÎɆð }™Â‡ö õöòn»kÚ¤i;÷îÜüÛæŽÂF»\®šêàѯ ÓÞJÈä!QC*z ÇX—yqÛÑj¸a^w{Û;ÐFÛÝ…q ÏïæŸÃÜ"ý–G¶_N¹Aî^W»¦¸u©/ùbÛš_&À€o¶«Õvr½@ m9qúx@`°R©²XÌ4Í Dmßù×ðÁà Z=0??oÒÄÉN§ÃänÚö×o£GŽÉÌΜ1c–ÓéðòôÚ´é—„ “ºÕ×u8:½^†aлÃa0AH¤•Ž*q„¯7èËÊÊ‚‡]*•)UÊÒÒR??¿. ‹¹¹¹‹…aq.°ø¯¨/@BˆR€öâ^H¤;ÒϱH"ˆ†ˆ‚ˆF(@A ±€Ðؽ(ZÚ¤u6DËz0ÏIÀcìp8ª««- „o¤É{´™GEQ”Ðð™ú’„E–ãæjK»á/D¯–eŵà/",ÐÍ|gÍã‘r„dÒú½<Ç·é?Û“?¸ã®/”÷.Y½ÄϲïÃ_¼î|cƬËép]¸e\ñöRcž|Á;± [¼ïýdõœ)„* Âåçö- š·âíAòŠÃ_¼²zÉÀYóç½;OSö÷»¯½6×#~×Ë•H¨MÛ{(?à™7—ÅÈ­Ù{×~°xVríß •7(œ-rq¦<çÆ…CZðþK¾Táo¯,Ý|´ÄõD‹A˜ãìªÛo{¯fâ3/ Ó~Z±üÖ9¶?6?Ý_K—ŠÔîÙI9…ªS¿mÏð|ò¿¯5ðVéÁÀœ&A f8ï7bå–Œ?>~ë¥û˜àÝo¤ÛÔì¸äóÏ7M0n~s[&RÙ5åB„•V\uv×üüû\züGOr“¶TWM&SqqqQQ‘——W'ÞUÅÅÅǵ ýÒK/ ‚ðúë¯;ŽeË–!„^}õÕ7ß|sÑ¢EͺÖ*Rê™ à~AÁâþîÛ/ØínÔ×Y-ÇW×Z/ÅnWÚ¤®:üÙÖÄ =Ý9Q`Ö©¥{ÞäõóÈ1,pˆ{x!lEF¶zîï)mšíÞ¬fysÊö=)NÏèøzX›“˜¸c7mZ= ;ÝU{vûÎd›{xìP¬;ædn…]h),ræ”ûÒ™~GÇ©ØÒÔ£'÷BåÌa—_ZäY‡‹uQ´D"“Êdš¡ ge;&|ôCêK#FŽ_¹?CD5ˆj\ÑßÎ*Æ<7¸q™¾.m ÏШ¨P©8ÛƪÐ1 c)ÑpÿÂmS> ½éþ9t®<úûûöº„ÉÀ«ÂÆN4MÛívŠ¢ìv[yy¥·D*íb^âTߦ‰ÀMÁ Bâ`^ç° .ˆ-,`ÇX ¼¸‹eÙ®koÇ1DAHAD#Z":-" Ä ¹°Hµ#,-ì³»jŸ8£Y¡Pdee]°Ñt```VV–Ýnˆˆç€Ûíö²²2qNŸ¸ˆ]·òê x‹8ðĸaM»æÿ@±fÚõXìxÌÒÙÊUr&ÛÁæ½0:ìEQ+x^Õó@Ã4W‹¸‚?<§»h¦IEì–†ü[ Á7Nêæ5.!„rÏ`#8]QÇ·> RÚØCUß%Ÿ)q×Ê l™‹«øÔ¹zõˆij ‰+¬µ½TWñ©L»vèø …xŒ"tâí§ÇO;'é©î©Ã1a›r¢»:?Qæí Ö™›–†ºPc•üâ·½;cçSÏŽˆ\ ¶JeÈÔg¿~ã6?)Ì0”„êh‚ª§§gnn®Ùl6[/VV[[Ëó¼§§gGeh’ä–-[&ÂK/½Ô‰ª (J«ÑVW–7M—mt|뉕nÇà˜+} êánžÅÊ žÀÏèµç¶Õ÷ýùÚö¢}‚L0%4¬úËôøBÄSZx)&ýµ¿ÈcääAºúŠZNâæ­¡Åµ&h­—I’^Qe|éŽw1õfVbòÕ1Bp{7‹¯¯´ð¸îø¦_Ž_0>´Å˜¹ÜúʈØÀ_¶¤uÉ)¶¼ü ƒÁ¨V«uõuyùe§O;‚2‹r¦L †Ý]a€Ø˜˜ÄÄÄìœL–çÔ* €¨Ã(„Å0fß@À!ýBÇŽÕõ·­·µ®Ža˜¢¢¢3gÎøùùÙl¶I“&iµZ…B¡P(*** T9]¬ ðV«5(8è"Ï'B .¼ýö;‚ ,X°`Ñ ‹(š¾‰ƒ‹„KëѶ?køßYÎÊÅ@¸v•E´jíÄ mÿsäð‘^^^%¥EžÞ·ßvÇwë¾¹~ÆõãÇL77(h5º)“§Mž4µiK· ¥×êöB‘(DôF —ËUZVêãíCSŒ­ÞFÓ´Ýf¯¨¬ôñö’J¤]Ï‹ã8¡Ñ'±I^㺂 ƇŲ&å±é_ñG7¢Bó,ÀBˆS¡‘Ñ -†Š6(k`bdí ¥!@´´a¡žnF…5‚æÞO«V­=zôÀ¿úê«´´4qøÄ‰§L™!<}úôªU«xžï•¨ÐsM-Ƕóí¢)“›'Ër ƒ‹zÒ†yäãÞZ÷… ¿HáíF·¬Röü¶ŸÒ•^ؤve „tëR*ØÙ0™2rl»«AšA@h˜FÜ*Ì;Y@1‰á‚qK•­#1¥ËEj_+h^ήƒ¹ðâ¤ó65ÖqÉ!’ÐÀUïÚ‘PZ&‚dZ°W׺5g)µ…NÞ$‡>ý¿×Ç™´7w“QÁˆŽª†?)8z*×öÒ´Eš¦ŠvTU(âJëk¢$ÇóüÒ¥K/ê«sæä‘ÌŒsaáý»¡™vív¼üôø‰£Ü oI3W,H*öì7ÛCã¾é¦•·l\øGÉNQžB'T«Êèú… ©FIŠ* ÔM‘³Öî°7µ³¶áÞ…›-d0€¨óèXÀ€ö’ëvÁE‘VÈÑå÷Úzð–±ßn>¨ç ™äw3ÆŒ.72B¸ïPöÎ=¥*œQtî^™¡[z±{§+‡ž››}Ý´Yµµæƒ‡Ü|ã-%e%î/.) ¬ÑÍ}ÂØ ~¾~Ûþømòä©UU•IIÉ'L¤Õus­×éõ:=à•—_>6c†V«E&&%) ©D‚A­R………7¾.þ*G-|n!À€„ç.¤)ú=§ˆ°H @ üép ×ê¦&LýýÏßGŽéåé•_xÞ×Çÿ®;îù曯n¼~¶››[óÓ›ù”õæT—ËURZêëãÃ0´¸ •Ý^_QYåãí%•J»•—(6^‚UEQÒs×JXlBÜÛõ¸ÉÏ CˆDˆ¢Í0Œ”¦éFg ° † ¤™Ž=1èAThÀ /¼ “É^{íµ7¦§§3 Y__ë­·>øàƒãÆ1bDddä–-[0ƳgϾîºëÖ¬YséQ¡Y–š<ÜðB³hpå"„8–½ô¶!À‚€`ÞãÇOhÙ`pWLYeue```]õ·m[1víÜqÃ7šÜ=Ų²3wïÞu×w•–—÷ Q©T¿ýþìéÛÖÓÓsÆôi2™,/OO¿à`¥R !t8µµµv¯Õ!.|®±Ù\êÛŸ‹@ ¿ ½^?sÚŒM¿m5r´—§Wn^vP@ð½÷ÜÿÅWŸÏ¹åvƒÁí²æÎ²l£ªÈÔÕÕ1 c·‹¾ŠÞR©¬»©5y,6)†MZÆXŒâ²¬Ëåµ9Ñ‘ã8—Ë%no» ÏsX @ŒÞB! !šBˆ¢Å5ëåEÀHdm§j"Ý“¨Ð‚ 4€nú3""B.—¿úê«K—.ŒŒT©TÁÁÁLLLÌÏÏÿí·ß0ÆÝºº†¡g{Q¡U5N—SfÒ4íëë#†m]D/Éc‘ÖùêAé¾-{2úM ŸøÜ}~³¿|èa8ïÎ1 [qnmø­w ÒZö.šÝšËý}c¶&aYœ¦qàìê‰ÏàHÙ—ßÿrÐý¸Ôâ;mvL7îGù¶Þ½e¨§3õ—•åzÝ»b´‚msÆqOÝâvÏ{-V.¼)äî\ã!­¯qÜÂGúÍøè¡yŠ…·E´ŸÞ^×ïÉÇè—,,¶_Ξ ‹ßÖ5ßqÉ©€©³CßY±táûuwÄ{QùIUbh'CüEnzûÉ;æ=ù@Bˆ¤üÈúUß{Þ÷a‚éBQÛ›µ õc^xó¦ý¯˜5=ùá{?{ñ¡Vª™ÃáŸ}@MMMYYÀÝÝÝh4"„DmQ~±@]_Q«Ó?ðÈŸ}üÞ»o¾âåãïíë>7''' 4jôXN)˦¹°-c÷AªCZ°Œ•aYejÅ¡çT×mŠpôT˜jí9<Žá8¶§"õˆP¶'å¯mÕ¡ÞnZtU›ÙQIâÝ_»=uï1z@ Ôæœ9W§í?ÊS;Ý%óî$Û—¼ÿ$ uÅ™µ»T!Žâ¼’`¯Î7*Tµ+}Ï!쩦8[Kì.AWâU8:>ìÓe÷>ýú÷^¡a´*™ BdcÙbsi©µÐSZ‰Xãm7Ïš÷äã_­ýnà øîÞGŽå0 Nñ—›Ü=ÌæjŽc1Æjµê|~Ƙc9 Ïñ=°ÕÍ^|aaÑ™3g"#û4¨é¦Ëåò‹6õKlÿDX¼¦ÙòT(©Â¥sôH%©@ þڢᆙ×oüõ×1£G{yyef¥‡ô »næõ{ö˜}ý —uõðÚÚZo//š¦­V«¨*–WVøzûÈd²¤Öäxˆj«*Š¡].W»Âbâ‹]YŒ !@#šA ¥ bЦš2oÔ¯˜vfBŠ’áî+‹â\oÐèµ'Fn0`„P ó:}úôýû÷~øá£ÑøùçŸ#„Ö¬Y³aÆKEP/oÏ J„"ÐÌŸµ7„Eï^œûdz߾ñíuã^‹´ø×õµî½ykjx¹[ø´—¦Ý6H 0ϳ/\¹[~ÉÕ%,m¦"^| @ÆI/¿u×3o¬zê~§ÂgÜüA×Åtg,¯=ðÉóŸ³ÆÐá~ñßùƒÕ¶— Ôyåû•²%ï¿;÷g›Ú/Â`Ä Ö×5ÿÇÔK—ýÒÿ•`Ïè ‹~xõ¡he¯Ìm·œ=¤m ï¸äLè#_®®~áíµ‹þ€£ä:¨Ñqn€4mÑËÂæþ°Eûæ_­[¶¥œÓùE]´nɃC5-*eš²bû¶‘ï½³öÏñâÛ<¤:BÈ5lg1ÀœÀ²—Ð,µZ­Ã‘Ú\Uì#añß … ©@ „®PTTÔÃuâñõõíke0¸ÝtÃì ?ÿ0nÌxO/ÏÌìsJ…:''ó¢“/k]‡‡G]]ÃТ¯¢¯OUEÐ8º­¯bÓêŠ!‡Ãát:›O…fŨÐpº|yŽÓ hZÆP2)-•R ƒŠB¨¹®ä^7Öz[znA|T˜(ÆQ%àn{Ž‰ŽŠ¡¦»£×ëýýý÷îÝ[^^âÑ·<Òt‰KÒµ¬¥Î‹ÔþÞN9Û©ü[Zî…Æ~ʹNÌ•j]c—( œ¹ôûéKpãBŒ {¥m´.îî7Öß¹4l½åuçæœÛ/º­(Dë¢n}yÍÍKAÛV§P(d2YEE…§§§8!àíím³ÙÊËË%‰R©ìu‰ÊäáyßbÀí;Zö¹6@ê>ÑVó3-Wˆi(áí”Ôk–¨·Ú^T[ •2ˆÀ"–\J^Hb4>`PëK$7EŒNˆhµ\d£ˆŸì|Íé¿ÿ:¯–! Ôsà¸6 å¦þ£'ôo“ãB¨S+æß7uÞ}S¦ü†%úùÎæ©Ô³<¸òŠŠR–ãÀÇr,ûú_çÌqœËåäxÀ²Ü’W—„0&&ö𱓢3-EQ]¹w Ϧ Øl6£Áz6E«Õ””7¼œ0ÎÎÉa]lVVVPPPAÁyŒcŒqNn®N«µÙíJ¥²»s®›JÜ7ŸûkEXÄõ©_½ò榊~÷¾òÂÍ22C˜@ ЖÊêJŽçÆ'hÔš‹Ê…«åȱ#U&7ÓÕèà^d|¡Õh4jµÉÝäpØÎŽã(Š’Êdr™L"‘ „ÀeƒhŠ¢)JÂ0j•ŠçqÂ`£ˆºRìöFé ¥ªØ$,ìv»Ífëh*´(,Œ»˜;Ïq!F"“K¥2#•0 MÑ×X7µŒz'_ÏŽœ) '@½W$­ ¬·9¡9Šˆ>˜4M‹—FQMÓ Ã\¨½F¯F€èöÒ´±ëy!„L&w»Í¦T©Z±ûš/Œ4ú¥ƒ9/6ŸÔÛ•-—DÛyÄ䂌–ý|àÕÆéÀ"ˆz· )Û~ɼ¹Í}…ˆB !ga¯]6¡7ÉÎÊ2y˜žÊŽŸÁâ¢ÂÀ  Øì®¶¾Íö-±-Pæ?uF| 3òϺY¢žØõ{×øúÅ<ÇÙm¶ðˆþ?ýøcM­¹QTÄ`ƒÞµw÷¾_Ý$nÁ`ŒÝŒÆaCG8ìv¹LFõ½éÌ—ôê¿¢WÙñ_×þ°;93¿Ú©tóŽžxë½7Ç›¤—¿íq5©ûS«ëøª}Ù¶Ù2Š˜_@ BÌs¸Vוƒµíð!ÃwìÙqµœ»2d’ɤ2™ô ç+ a½5Ӛ㸸¸8qu ¥æt:KJJš†|MˆáP$I·£B;Ê8sJ…²!(®yØ4ºÕ\Ž€€ÆXÀ@0o¯ÝQA¨««krZF1:Mó­x]MëNŠv=†a† ¶éןo¹ív‰¤wÚÆåZI óI½méå,/²ù2 ?ϦÈìÃ>ÇqÙY™?ÿôã´3;±9â3¸g÷.ƒÑF3Ì?øšÿqRâ¥Ý»¦‹¦(J.—G„†ú¶2€b•Œ Ún—J$ …ý»TEp%…EÁš¸zÁ’Mœ ` °”å$–ç&íÙuó›ï=¥¾ÌRã=íùy®}USFè®ñ:UUUÿ¾%„½…››©@ \ãÃBFÓõãµZm¯Ç%´‚eY‡ÃÑù1ÅÅÅЭ0ÏsYÙç²²Ï]J±{Ðå!;;ûrç%‘JcbãÔjõëו••ö`}Æv ñÜ ü›ÀŸ:~¤»g!„L&i3fFFEÙm¶ÎŸA•Zýç¶ß¿)[#t=VB¯ÓÅ{×üx…B!‘H1ºhE·fš¦ˆ°ØSó±ÏßÙ”ÏòØkâ£Ý1ªŸÂ’¹{ݪ5‡«r6®X3dÕ“Ñìžÿüß[Iœ|Ìkß??@…¸óëŸzø»B!衯߻ÁÕ¦üöÕç›§•²ïþï|äñ [²síW[§å–ר8 ÷1Qzl[¯Û&‘å>߯þá°S];x^¤ ævÕ=ÿÊ4A=åÍ¢‹~lî7ù‘ ~øï8½ußs÷¬LâÕ3ßùâéHù?Zš4Äj@ tÒõ'•ЧزyS¯¤Óõ5­R~ý´—rìÞèqë–ÍWàêÄè+!aá‘Qÿ¾ñ-pu×xí\™ŸÁаðþäü§Ý»æ7Qô('õ®˜°(Ô_¿«FÀ àžÿ,¸!HNAhzçÂÿ˜ç.ø¹¬ìÉ÷FÎ$[’ç»âú35‰‡ yžo¢k=»¡€ã¡\EWžùùE5òO^n Ù¢Ý[¥Øy0Rš­ãÆN­Ý–™Ò^"¥c,8ŽŒïÚMP=ÒOHÍ©N˨äû«²Næó<›sò¼s¬¢ðLÇqò¨‘þRÒÕ$@ ®W~äÖ]AðŸx¥¬Ëź\¤uW ò þ5\¡W&[ž^$` ܇õ–¡Æ5Q£cUgaV5‹t&GQV?XèâÍ)»³1Æ“†™¨êƒŸüTÈñ¾÷¼ÿæXûx Xwm8^Ãc .2´3W¬ÛºeëÝ>`Ø”èöašÉB‡ "÷ø‘Þ‚‚“9õõÙ‡3yŒ5õt©½,5­`IäøPÑ @ ®9Ìf³Ù\Cê@ ¡9WxÁ×ÖÆšÿ‰ ƒ¦ö§’’K÷-™å½ó¬€qà„Q& ›™”Çc ¾}öŽï!Xà ʳ+9Ü´DˆB4#@Ò~"°Ùª®âÄô6ÆcÝú’ì“9¹LªÓ À–O+ô>Q„1¡!Q·@ ®1**+ÌæŒ±‹eMî¦>R*²f6@ „«Î·„Õ ü؉ÒûCb9ò'[1ŒWžéOíO§$ìúëOC*‡q¿I#MÈs çó‘5(‘”:FOAØv¡áö ‡œ³Ãÿ±Ã ?l®:öןT%¾ãNÃÏk’vüõWaÔäh¢+@ \[TTVÔÔÔètZ Ùlôm‘„ã#pµ¹BÂ"2½}¤rÙkî7¯¿§zêΑòº¬Ýß~øS©€.av¬A qè-£•)»‹¶¬-˜‰»m¼§Áé d‚:›Çè;oŠÐR˜­)©‘{y0°ífÕN"Í‘šúw˜ Miܲµ|ï^Œ=î9Ò7õë“I&b £'Çë)¢+@ \;TVU˜Í5:ÖÝÍ$Nµ1›Íw7©@ „+µ,12Œ~âÙ)îà¿W/þ¿{îIA1 IDATºcîÒÏ”óxÏ\ðÈ@¨ØAMì­SÜ!Àí˜ÛF)å5ñái]I_/¼õ†Ù3¯¿aæ=O¯Nµwô¶ÝDšCy%t’ $(a¬ŒqØH_÷ á è˜i‰®H pMa³Ùu:}“ªhr7éõz›ÍNj†@ \É5)ý°ç>ûdøOßmÜŸšUPí”ü‚£&Ü|ÏmÃ|t“`' ™ycè¯ÿËÀ¦™³û+ÅiÊPÿø‡+}¿\óÇ©ô‚Oi¼úyR¼Ð¡,Ú^"ÍéQT—Olÿàö¶·ÞÒII`‹c;Ê‚@ @¸jtÔ¿'@hNiiiRRÒØqãCÆÁ‚€1Æs,'úÖšÍEE…'OžDØ= ‘ú%@ @ þ•œ9}:...:&V"‘`Aç+óçr9N‡ÃáH$§NžÄ…4é",þk!_° @ º MÑ‹¥ëÇ[,š¦I½@賸\®!ÃFˆK¬trXTT4˲ÝMœ‹á"‘š@ ×ZöÈñ#µµµ]9Øb±>vX«Ö’w%@ „> @*•^Ô‘aÜýÄÉ÷U@ ¡w£{EUÅŽ=;8Ž»xOš¦µj­›ÁÔ@ „ãâ¢Bƒ±ú0DX$@ €šÜLîF÷®O*@ Â?ŒqJrRa~ž_@`PPð%¦F„EB/¶MGyvvµª_˜§ŒÌ±'ðíjWTUÔZk»ä±HÑZÖÝèNäE@ ÿ”®NrR¢¹º*4<¢¤¸`t) a‘Ð{¶¢¬ìŠ@¿PÌg÷)6mdWW]UÏL¦uºqŸ,@ „«Jeu%Çs ã4jÍEåB‹ÕräØ‘Šª “›‰T@ „¾OrÒKm͸‰“÷òöI:s*/7/ 0°Ç a±OÀ²®ƒ‡÷˜Í5à^IÐårUUV>¼wʇíyû¶Ÿ6·XèS1!!\CµêoãÆc -S©T øÚ´£GÍ!&ª™6Ç;‹Nì=^l0€’(TnÞAaaþÉå×ú:)¡%;vo3R©„TÅUÄß/pЀaÄ#¦Û^ð/°®f‹9a\‚N«ëÊéZvøá;öì N‹@ þ˜L1qžÇSDz¬D*uØí=K‹}‚CG÷«ÕÚÑ#'ôV‚v»½  °7‹ˆ1V† ‹ukôRÙ™‡TAñ£‚ÖÂÇÖl½]P†5I0k·”åž;³§Â>~L¸¾Ü½óNJEhÁø1Süü| ©Š €nóèt¸«[<²?ålbtd¸öeÛK þq¶­uå8N£Ñt=­VÛ•IÓ@ }O/oAšÔš¦B.§³Ç a±O`µZF ‡P¯­L!êÅÔ¨în²V¢†`+9—|6¿Ââ€r½8qÃnÁ’¶sÏyÑ“c b#«KÛµ9 ܆NãÝÒ#Q¢qs7Ê &OO•ãÏ£çó-!z GEVJrNi­Ê Þá±Ñ:b{QÒé´RsTm𠉎 Ô5&ˆ]UÙÉÉ9e56,×{ô‹Žég”"v”žMJ+®²Ô»xÀ˜ŽéÓ¶T”õ|òéô¢j‡)…WÌÈ¡JŠ´NBQ‘ʸš ˆOI=Cê¡Û^ðï°®ä@ B!ÂbŸBÀ0L/öbiš¦éÞ¿¹´*!W•|àH.ö ‰Ð"GuÁ¹šfM c¡Ù¡ò !Cý•´²5 R†’ÈhPiwaxó¹C²éà˜!1 WYzâéÃP™g¢ÙÚ² ›2|`¬ŽfëÊsÓOï©e'ŽÕPðæôƒûι<"¢‡iAíù´äý‡¸ c"´4Įꢋ¹­Q²Djï˜Q±>rÄ×ÖXx\fûæÆùIcÊÆa£¨489BFçc¤sÍ5vÁDÙ«k9ÆÍCM‹å¡5žF&£Êl<¥°ÅYíBéú…›Š“î¬õ öÕIˆØÐP3%:-’ª¸ºV‚øÔô}ÛK ˆu%@èk¤»‚^þSWŽÄBÐÐnJ;D)è+Ú@)i¥^¯“6óÂVž;à"­R”,yó¹cI27/Àcä1`Tt³0.´L†Û:qp»yA€ÐÕRQê~Ã'{”ågfeß“•ÝÔ¨0=CBßÉÐ÷Ú´½XW@ „KcÖôIc,<XÀN–ÇóÂ…-€cÇŽt7(éHõN-ü§Üˆ2%×k[Yjá:ow–Ѐsu|­Ôëu÷Àø!AÒŠäãÙV$ש‘`±¥Z£Õ4ü§lëDÈ×—W³H­“#ØPžò:^̉¯+«d)µAŽ`K£ö 8zâè¦:;×Ì“ Ñ„>êÇ:®bïçÿ}ë·'nù›ØÞžWiùÎ^Y¶é¼“ áZ¶®@ }»ÃSçäë¼ÕÁ[íœÅÎÕÚXs=k®gkêÙš:Wu«gs¹þ™Â¢`/N9~,¯Ž¿*§_ŽüøTî²VTT”—7üWQcã$¦È0µ-ûÈᔜ²ò²Ò +×îåÉZÊ‘.«¨¬¤à|~µ«½Ñ7JMý‡„(jΞʶò@ê¤pd=’’SXZVRx>+ï™΢ô´Ü¢’’‚s'Ž¥×˃ÂL€Ä¢®Ï8v"£ ¤´ ýıt›*4½ý)ÍmJÅÛJ²óŠË«ÍÕ•VÐ2â®HèC@Ø;3v…ÚÔýÏ;Œ[ü¾6_®½b{ùšä={OÚyL”Eá¶®@ ×$Wv*´«òäæoÖíLLϯvPJÏÐ ·=tÏ07º»Ý9göÚ×–eÜ´úÓÕƒ®`'§ U¿/xàzÁ†7Çêaí¾ÿÎ{ãP%‡ ”îÞ>ýLºýöIцÞ_z¯mV¨Ïþã}µ#¹¸^á5îgÒ£‹íE¬Çe\øS:1¡¿.lÔ8ÉÙÔœôÙ.Q¹ÞGÃ@@ ?@©Wô€ “©é'Žð´Ü#Btp-Œ1|`Pá´ä"¿~†¨1£e)góÒOd»JªñŽòò7HÄ$)®"ët¦ KÔÆ°¡qý¦KSºˆ‘c˜ä”œÄÃv ÓyDŠ ÑuоڔÊÃ`.JÏ®´óP2½WìàP-EF„¾5ømg«hµÒ…æsþÞþúé›VÜLÃmÄ0¡ê÷|èºé7ïQ7ºûÚN.¹ëÕŠû?[u½×¿Ipo]¥‚y×+¼¼¯‚éÖÝ7jìuwÝ5s ñb/ASÌ{^|Ù®; ©Ö;rHœ‡îã%%ˆ@¸šÖ•@ Юœ°ˆíß,zþûLyÿÉÓî›`„µ¹©)5®ž¦&\’‡MǧcÌ <wr–òJÖû¦%s*ìUÅY‡·­ž¿uóõ¯¿ýø@-Ý«]ÐÖ^3‚åèÏ-?öóߢ©Ø÷Õ{o,p¹ûü°«%tAyÀ¸ëÚïˆKAƵéž#MÿÉ×÷oì«#•>ÚvàRn¶…1˜zý€†-2SH¼{HˤxDމi\|±ù€ÉÜCi3VhYž†m­K¥3%‚Œ3}vÜÛA“ĘxŸ[^~,NÕ RªÍ% ŒyËþñ¥·M«ÿ3ݯAÝ‚Àó¿Í#¯Ç"k)«`}ç,Ÿ7T#ÔWfßôýO>ÿá'O ÖÑ—Í °æ¢›ÿÝoÍ‹WrÖ²œS¿}÷Í¢ÓÕŸ~;/V‰ˆ"®žu%@ \œ+%,bGúú•ßg¯_¾âÑZBÀøI³D Ô&oþü³ÍÇÒ˱{èÐÙ?zS”–‚ð{V¯üæhnYu½ *MaCç<>wfˆRŒvœÿÍÜk! vñº£åÅ[—/^{ºÄÆ3ßA3šG|ƒ»Ž`=»õŸm9–VRGiÃn\òúÃAmO×´?zÃh‚cãâô`â¬ÙÓ~}iÞ§o~»úù±’Ä÷Ÿ[‘ÿÒ{G©.yè׺GëÌßuÄì{ó£wO’B®Êø{î¥ìP uµº¾õ¹;Ø×jsG)´ÝÞbK'§Á®eÜéæ–ÉÈ‚Ð×G¿îÓFÇŠ–ªñP{Ê[÷¿˜qÓÇŸÜæ'€+ÙôøÃ‚–¹(¢kâ 1ÚíÌê—¿óÿð¶&Ž-ÜÒž½-ö‘œ²› Ƚâ¦Þ<ú{׉3Ð ¿åÉùׇ©Å²5§ýì³ÍdzÍÈ=|ô?4½ŸYO¾×{FµçUŠÐg  2rt¸ã–ùþ’þ@üP ĵ‰?ZµñÐÙ2lŠqÛOÝ£k#à²ù¿,™ÿʼn’zžÖú¹ññîêNCÀWúòÝÿíJÎ+±8€zÈÂÏVÎlæûÙð®‰Õ!†Œ®Ïºnù©ãelLrÕ'6¬ZõóáÌÊÔÜý󟪢`r!=°®@ „N¹R¢íìOÛ ™!/Þ«“4Ž»q®ìõ‹|_7ôއ_F9;Ö~öü‹ŽUïÞ,…|}Îé”rï;ž}*TnÍßÿÓÚ—Ò¾_<5€ûu/.âÁ@¤ðR"uQÓ\pƒNÉ—ŸÚ¸jý[‡üï?Ãuds|qÞÚšA·Þ÷Ÿ(7P[«ñl˜ÈÜòô‹õ7!R²ÀYsgýòÌ/UŽ'¸\.+ôJõ´öšatF°íðÑüÛC\YršYëÁt«ßKzÉ2èú—Ý‚ÎîAÄ ?AB3C,ð<ßuOoä3kécîÏ¿ñß÷C?xaŒ[ËWÕ¾½-¶Ï ç‡K«“7~ºqU¢ç„»îZx‡²úÈ÷Ÿüï CÿÏ—!èÌ\·xÑfÅõ/šëQw|ýê÷—"ŸÏ¸jmo‹Ê†@‰B-Á¬Í!àÌ\;ÿñ¯,#ï}ò¿¡0óÏ/V=õ¬ý‹Õ„ÈZ&Aéc®{ìÅ[ J¾ôÄúw¿yí½°ï^¥£xsòƻž*N'ÔQ¡F¶—)fk‹·üžÝ&ĹÑ:Î}óì3å7?±ôº#kßëyä»v~¼¦Ç¹„nZW@ B§\!a‘³äåÙ€gŒ¿ºw¶žùú§ó¦›Þ{ñÎ9‚£âsç­ÿöôõK‡i+!ƒCy—Ÿ\p`OÞ#‚@fðë×ÏO$Uð°qÁÂ…ûžü;±Œ¦Eug¾Úë>{åÒ{CBCííœÞE¤^Ñô/ç²*\× ~~Í ª7Qc €†È$Q½U=¡–¥l¥ç‹œn£®î[~à”#}ÿö“sMñéòRþÿîá$,_• 'Õ~uAuÂ8ðÎן¨¢ I A—ž¥"òîÅ&Ïûø­QKü››ívímS{@(1è¡Ëlv!”ýt ­Ú&`ÌV¦ç;¸âœ±J4ªXY…] º÷Œjm¯ø#õÍÙÓß˦õÈÛ ®ó’pÙ©ÙNõ€áþJŠBEàȪoÏV°#õ6{«pe‡¿ÿð›mG³ÊmHIÛyÆâIJ@‰+€´xÀ ôÑU‹«€«¾òü‰ß¿þzÑü»ÿ{J—–çäŠVÜ9neÃHày™CYyws!=³®@ „N¹BÂ"­ñó–€ÄsÅvÁ›i×ñ®õªz¸e\a€””<‹qÃ@¬Ùœ>¶pËËËÖÕ{èù‡#BÁoo½»¿aÆãö\RZÞu\e),vq“ôªÈÒªG‹k½ûÖŸªG¾^~“ι{ƪ{ž}ÿƒIÃÿK¼ „k˜Î´]¥OXÿˆÆ5ÅY¼A€µ³Æ §ö JnzîÁ£O|ñÎÖ»åÂÅìm+³/¡!p5L¾Æ´„?0 p }zùòÆ+‚r7íU™´Û¾štï[ó‡ÕZƒÁÍ]'§B8-+R|UaÜâýÅæÿ¼è¥¯­ O,}<Æ ŸÿõÕ7vw±(JïЂ {Úˆ0?e-ÉJ+ò½éÑ„AÜä÷؆×ÿ+»wZÈÙ±v}±ï/Äk:(ÑîÑý$¿ìZ÷sÿë‚q•ÕcÄ8S„X¿éû-ê‰Q¾òŠ¢úÆluC˜åõÔÆW^wNòÚ«ìþcÆ´>}RÿŽ=ks’ÏheŽêÒ‚ÌCÛ~?QnšõÚ“cÝh`9ùnï0m%2»¯Ùøá'1s§÷WYÏnýèÃï¾}×g R¥P(öíÛWQQÁó|«½¸GÞšÐ÷ìAÊ—OJëõ”/_‚E¹¹¹ùúúRW}ðÛ­ÍxŽžèÿÕÚOW®³ÏèoD¥Yµ 7Uí©•§÷/ð嫺ð;@ÕÁ=¦½&=5wÏÜ÷Î4X‰Gûö¶«æN7ôþë<ŸÙôÚRtçu*tG`Ú.”5CæÞpß·/½*hVÌüã‹oŠüîuˆB@k¼5°âÄÎ#y~#¼¢|à7?}õ‹fJŒŸ¼¼ ®Ë§6'éŒNÉÛjŠÎíß¼~w÷mÓƒ•†°Gf{=òÓKÏ£ûgö–;* ,3fEÉ{œ @¸²o|@ ü?{÷EÕõüœ{g¶¥‡¡“¢4Q@D@ÁŠ¢‚PQìÊ£>رa_ Š(н "båQAª‚ô ÙôÝ™{ÏûÇlB6ô&Î÷ó~ÞG6»3³wîÞùí-Œ±*ïŸë$"S:Þñòóm¦¼ùé¼Ç~Xà€™œ‘}ÊŽOãË}*0þ•O_µƒÒ|õã×^ÔÄ··ûJ‘Üñº›ú>ùúÔ'ˆøk´Õõ‚ FØñüÔ7ûÆ"3¾FóŒx‰àÏÆk!÷7ÅÇì-"$&&r°x,T’¬'fæ…£FŽ›0}Ü}S•ô&¦5l“•,QÖ8ýê‹~|fúøÏNm7¼Y…ÿÎö爫1Ò{üÕµãÃàɼð¾;žÛM{»Ÿü͇<5&yü„¯ÞzüãBåKnØiHç^Y ‡µQ==_Ó!Ͼ7î…ž»cUoÚ~øó7]ÖÌ/@Öúñ¸ºu¸¥ÿèÛ·?ùÆÄû¿ ™P³eÝ„}Ž‘\«ºç»IwÞ< @’Ò2Zô½ã†çµI”' {q\긗?›øàûŽ/¥ñi×wíÓ"©þ%¾ÆØáj]cŒ1ÆX…«)7Ó!""ÒZ+¥DZm;‰„B¡ÒÒÒ¢¢¢ÂÂÂüüü`0 ëÖ­Û«W¯ƒ½#ÒDå9"–Í/O¤IGgOX¾Ð i­+,úBZ鲑ÖÑÉ»P¸s °ËVHQÙÖÅn_¾ócö¡vÜFDÀÒZ»ƒDý4ü¶ðç.»Ç–êÎ#¬pØû_ФÊ#UÓÃ#|² ßw]ùÁÕkV5i”µë‰¨Øjíò'Ó.FÛ?ÒZ )0æ¿÷¶Á˜ÇöÐÞÆ¶Ø±[©´Í ÍrùqÎFõ ÛÞ½fyÉíò%SVÐ(¤¨ôeTþCZU.ç˜RÌǾâÆc6X¶…ƒØ clŸ­ëÆ`ùÊåý/ì@ßzÓ>˜–Õ8 322öùä™3g®[·.%%%%%%999111!!!øý~¯×kš¦aRÊòեܫt¥”mÛápؽ8/((…BݺuãogÆcŒíÓß>÷ì3‹BŽÒ¤µVš´¦°åhMIMðþüóOWtIø}III qqq>ŸÏ4M7Øí…Ç?<­UÅ`n—?ì¦GÆ®¼Œbg·©JÚÓö´WÜӚαûØK7-<Œ«BïîÜÒöÑ0 Ã0øóÃXÕ€€€°ÏVk¿Ú¬ð ÜÍ«w·Á˜Çö«ÅŽÝJ¥mP³|$¿“pÿ s¥UùØ÷X8{Þð>wºëb/Œ±m]ÿÍÂŒjÓþÉ¿ÕþŽZ¾¤Zõ›e·êpFŸ~ýÏïT/p”§¤ð¦_¿úòë~œ=gþò Ûrs üÉuêÕÏ̬—Y¿aV»3Îé{zË^ŽU¹BN…3ÎÏ8ÿ‹Ð!Ÿhx÷¯¿?Ð*À?ò1ÆŽ<1ÆcŒ1V• Ÿ–ìß\ªÉ.*Wþ«/>ÁDr"%!«,@)Î]·ô§õKçÍœ6öîä#^ysô… üG#Ñ‹ßvôcϸ¤Hi¢C„ÏØ±~Eîú¿ÍFÄñÏÞ'ŒÚ'÷í×ïâ‹úݱABÕûU%²øþ6í_U!‹ë0qý÷kÈòÈ!å8ŽsˆÁ¢£¹ bŒ_x<ÆcŒ1ƪoÖ?lÜ‘——·eöíõeìõ~æ?nÜ‘›,,±ìPÞÚùŸØ³Çã‹­IÒ<7WÈÃʛ֠YVv\…CµÍšþʷщ™M³³’+Pц$ƒ/)cÇ!D$w eŒ1n{c쟃(dÒI×ÝzÊ#Wþ¨w¥ÕÓ¿Ýp›¦¾ä·*úíÑó.ž°ÚªÐ)-ýšw§\ß*Ù•Qzªw¹ïƒ—ÿh{íç*r…<2G11ïvBüh}äsÆ;îq°xLðûâ–ÿ¹´Eö ’çÝg옶ëòæ±R…gW~¤Âãp+¤µ^ù÷Ÿqqñ|ùÊm/cÜÀî¥åÖõ`‰„úYi0{KÅÒ+ØR¨þ¡ÝGV¼tÝÿF*u5»>|o·jæž~øAoÃËŸùÜ—ÿ]ªx>;®‡LÉîØzCQƒÌ¸ƒúÉÑHnÖ±M«‚†™þÅ’1v\á`ñ˜Ð¤QÓU«ÿúáßpQ0Æv+5¥ZFíz\Üö2Ƹu=táßK·WÊdk5­n‚³îÅSšÝºp㌜¿ð¡Ö¥óoi~ÚK›b‚¾N“7~{iÍ}ŒÕÛ¦ßûØÂØ3ÌS¯9«Žg¯éŒ·ÉEƒNu×¢=ýÝÉ[4}Ò[Ÿ|óãÜnÜ^l€—Z«q›N§vï;`ÐíjƬ)]üý zOËßeÙ³×G›>é“"œõ/wnzóï»”D£{[pß îÝ’9C›œ1iû.[‘g|°ùóssÿ÷Ú˜qS>ùqÉÚÜR_µfí{]6âîç6K¬0 ¶dîuM»Oܦ´V±ûúyH¦ÿêò›¸3?ÜôYßTØ8¾s“ v==î“‹—~úòs/¼9ó÷•ûË޳ùï®qÿú—ÇPȃsh7zÆÏ”½ü@j`Ñ7—döù¨h÷«Æ4{hÑü‘Ù~÷ˆJ¾¹y×—Ý·Õúéåsnläuÿü¨GíË~ŒùÕñõ+—7eÇ!UHÆÛ'Ó`˜Íš4çr`Œí_äqÛËãÖõðÓù?3OÇ$5‰çÝÚ§¶)HÆ×HOˆß– UzY\rrBÍ$³¬ô„™”^-¾°¤$X_r²?¡ºß=·ôŽïÆÏ(ªµ¼à”êrçÅlxÅÿMôÎÏO8±7¶Ë©µù«Ç®¾öÑY›­£ëJ'Ô®#6o.ضzÁ×k~ŸõÎ ÿ­Öùæ—&>tAÃ@ô•èM­” ¬p0¿4¦‚¨²Þ±(⪧'$ ó íŠÏ¨¸0zRj%'„#‘`~IÅçÒáÕSoí5dê:[Q´wnqβï¦Ü÷ÃÔ·oütÖ˜Þée%)<)µRB+?Xó†IÆÅÇEL©æîAªÝì1²fÚu}¯zc•£´ŽéúëõCäÍ{…DqHCÊ^~À5Px«ÕNJXŸ›W¤vyS‰5vF¡¥‹ßüp£m¹qé‚I_l¸îÆFnõG_Zíø„¼pž[â’“ãÓ“<>Q+9!rH’1Æö‰»i3—µŒ1¶œ*rÛËãÖõpSÅ›~öü°3{?¹Ä©ãÔìýØç¯õ«ãAW|²jë–oT^ï¶Õ¨ÙÖw{óhG*ðµ¾κœ¿ß¿´ºDhõį¶m[ýîyÕ÷ÕÁ æOûɪ”+&7o^MîóÌÈ.>â†+O«Pé’±çžpÎÃ_­·Ü@šølMQ;J7{ÏI&‚ÖJ9Ûf?Ûÿ„3GÿRÖG1®ã³ 6ål[ÿÕµér÷7H2ãòOVmÝüǸv{îÍ8ùñ_6æl[?óúÚ1[Q«^»ì”Aoæf´íyþ9][$GƒP"ÒÊY6îŠÛ¾Üf—ÿ¤GÞ³mÃì»Çî¨Ã+‹·älsåüõFd‰ ë øxÕÖÝìÂËžíåÄ¿,Yó„3Î?ÿÌ6iÑ}Ö1wÓ²‰GèlV yȪÆu~aѦœu_Œ­÷¢Ó3¿mZ÷õð&eïµä)o¡²(›~ŸôÅ;'÷~믭›>×Ù(O›°dó¶sFuêòäüC­Œ1ÆÁ"cŒ1Æc,jÝÓÝ3kÖ¬Q½ZrœéK©ò·Mø­X€·ZÓκêÞñ߬úëÓ»:§•‡u( Ã[÷Ü;/L‰ rÿß„¥Qq} !eÁ/~œ§EçýLÃØw8Ö¦ùËJ+GéÙéÞýÉ…¨x ófÞÒçŽYA»|ìgãÿN}ô¬ÌxÓ0 z·ûÞz¤¥pßiUúÓý}¯ûh³EÑÃ7 Cîí1úŒ½=e[YûÅü&ÿý~Õ²9ÓßûpÖ‚¥ ¨±ó)¤s§=ùé&[Çlc×õ“£»ÊwÒØÝÕœQO/ôŸ>fþ–5¿Îxïý/篜sO )PHoÆ‘:›U B¢ƒ­(¤a¤´Ô;f™iýË”ïw–?T²øÍOv投’E”w|÷æ/šÄ)ƒ{Ôñš†x8*$cŒí ‹Œ1ÆcŒ7TAîŽíÛwä”:Žã(U6äÔ²­PIiQÞ¶¼í’aJ—[×nhÃÏ|Ÿ3y›Ú<}ì—ÅÚßû–>žý¼Ëpò7wYrÇŸäÓ—4ôÇs·¾±±â4sµzžÝ8PžË 7³GïzX!AÙþÞíOüRø¬-1ì¹ÛNIóRJé©Ýóú jT,L½àÓÅEtX‚tµ«Þ{û¦¶)CJ)äö×ßÞ>š»‰#u6«@…<4‡X“ÚUJÕO¿ÙZ¾ªQå\±R²*gÖs‰NƒÏ¨%Å1V!cU‹Œ1ÆcŒ/2ïø%?bÙv¤8˜³fÑ÷ï=ËY $n\>ûýî¹¼SFƒÞ÷}±!+Z]7¢ V =ò?z*¦[“½æÝq?Z:ù‚§×Øï®aªx[ñ.Ky{â½³Pwé¢ñ¯¯ŒYÕCfwo¨¸)_Ã.Íc¶Më§¼ø$‹µÏ럷³ð<5›Ö€ŠÑihÝÊ<çð9‡ÞÔ9ÕØy³'kõ›_MUά7~Òû—+… É«Â8XdŒ1Æcìø¹üwÔzâ’kÔ?¡K¿Ÿþtñ’×.¬!ÐbM+ålþzô¹‡¼³Îª,x^vgOÅÐÃþñé)EÊb”ÈòI/-ÒTûòNIÙÿ5ee|õ¸]´J¬ƒÈ4"«g|›Æ¥%VZªÒH¨æ}$öô?CG:B©Þ8Íó®Óâb‹(,U‡uµÎìÓØÏŠÄFm;thS/N±³Y*ä¡8 50©ÝàJÉâ܉³Üd±ä)Ÿl!× ¹bH¿OþÂMUά‰s•÷#W< ’1V¥¯,¸cŒ1Æ;!¢F\³«^ß/¥B§.Òjó;Ãn*›0zßÞûŽþiCZþâ‹¿G—”ýíå‰k´nzÍ5­ã »¡‘”‘•Ÿ*i8à¨ÏÊY‘C± a Z\¥®j"Wi”uΟ9‘#œ+brí$£â»DQiÝ ¥ó!¤5ŠIŽÊNwùA‘³Y*ä¡85p7Éâßä8%¼ùÉVÒõ‡=s§Š«ú”%‹*ç›7æ*ŸQ{Ÿ¹âQ¨Œ±ªŒƒEÆcŒ1ÆŽg(ktÚ3!¶[N7ckÌ I§Ü|M#Q1ÔØ2åéYÛåÏ;m«Ò' ØÔw 1Ž'ãälåçç¬È±<ÖPŹ%•ò%úd¥›_¢b#;?>ÂëTÓóßuaµÌcï'âœÍ*P!Åa©»&‹s&~³Õ.^4å“­¤ë÷¿ôô󵯸H;Zå|3qŽÒØip}çŠG¡B2ƪ4nQcŒ1Æ;ÎêµÉ¨ÜsPÿ5o]$¦ç ¯ùÕ·Ä„PüéS®·œ­_Žý¬@›Ýo¾ ¾÷€†bRûK;˜•^\º<ïÀ;LÉøÔ@¥‡"E•#C. WZ,ÆLJöíùž¨Ò iRçßЕKæ>ïóÿÙ¬òPž˜ÔnP¯¤J}¿]ýÛäO¶’μøâ섌^WŒ“Å…“?_³aÖÄ9JcÇA=ö=š1Æ÷wcŒ1ÆcÇ74|Æ.*Ë©´¬‰™yÑ}ã+¦zÞ³ÿùáó³Â:¡ÏM½j˜âˆêÝ®íW)ûYòѼÜ},¨¢6¿{UÇZ¶lѢ㵟å8à©™U³RU’[R)T%y¥•FY×Ȫé)ŠØÛ#»$äTü·“¿© ŠŒ=üg³ TÈCpXj @RûA½c’EçãžóáV­3û÷Ïò£‘Ñëªv±ÉâÄ×ßxeŽ£±Ãൠ¾ÁgŒýÓ¸ÝaŒ1Æcì8gmûsÛ.YµižJ±Œ¨~æíÓ+¦o´j܈››¯tõ‹Gt­và«ïŠôsÙRÄD‹Öì _o±÷ßY«¦Œ~ûץ˖-_NmZ¤ð6ìݽF¥XgG‘ûº]G«&wéÓ¬|Ý^H©´²Fi0T±ó¤µmu.T™ÙçÿÙ¬òàŽÔ¾rŸÅ¾Ø®)ó⋳ˆ ëô¾2¶Ïââ§ùÉÒØapÚœ+2Ǝ· cŒ1Æcǵ’¥ÌÈ¡Jƒ6k÷ìUß»Ëüt ín–…çµ+øùÛMš2¯Ö>ñ Fú²o|å¿'_ùæ¿ÏÍßãphµmÆcÏ/u¥\:ê¢zî°ß@›k¯n‚1ÌòïVƬø^ýã²Ø§ë^1¼ÃÎÇS#»6Ƽåœå[­ùVáoo}W¤ÿ‰`QªÅÇ>âD÷È©pᄇï½wÔ˜×òª3û6u/¶÷y=fÔéïo?’Ë{Õ yÐC €¤öƒc“EÒyqÿl7€42z_Ù6&YÔš@t|&犌±£[ÆcŒ1ÆŽc:ÿ§'†[§cc£ãmÃÛìn=]o³«n?ͬø"€–õðä*"±ý½Ÿ¾78³Âäp´áå~WŒ_V¼›ðŠJ½dà[[$ŸûÌèie£]ý­nynpн×6ÏüjuxgŒc¯Ÿõ冊©NÚ%ÏŒìP!}©íÎÎŽͺéÓi òÝ(Qå~ûèíSwü#¹"iM3¼1ÅYšWª€ ²öý'~òñGßZmWžòÀí÷Ù$'qÊ™‰qFÕ­íÐk +©]¥dê]T–+uϺêÄØ°ý ÎcG7=Œ1ÆcŒTñæ?¾gßV]ýÝŠÍË2.}mòð,ßn;|çÝq~̵ N¹ñ’F‡°JšµÏ}iÞ7ö©U¾ ÷Å­[]pïÄY+rÝ5¢Uñ¶¿æLyVó“îü¡Ø!ðž|÷‡¯ ¨_aÝ Y­çs_<ݣ±­|xàgn 8;f?|ù¨eªüú;?òùËç×6+µ§Ñ€Û{ÄäQkŸïÞªSŸþýûœÒ¬A¯1[;u«ùϤUÆÝb#Ε_ý¼ÝPÛ¿qÊjåèš;¦›‡~,û{6¼ ù;Ç&×nUÛ‹U¸B¬C¯®ä]’Åz_’½sÀ´Q÷¬+c“Eì0¸'犌±£ƒÛÆcŒ1ƪ’Èò1]3ÒRSSköô:ÛïkÝS]ê¤UKMMŽ÷™¾”̶}®fÆ»bÇÀ”öCÆÎþuÒý{Êe0µÛmWeTè—åïuÓ9žC»±@³f—;?Z2òÝ´ˆGÒjÍô'®éÝ2=Îc¦/¥N󮃟š¹ÞV”ÚyÄä_g=Ôµz¥PãZŒøäé£zÖqžôÒçû6HH«ß º¿Öé£DßiÚi·ðÇŒÿ´K®¼¶‡QoÀø×fV˜šO«M¿Îxÿý/çý>äÝÙ¯õ¯³ 1¬ݹvZµZ§<º¸T—οë¤ZÕRëtyKL±«o.mT½ZæÅÓs­­ï^Ø ­z³«ç:11×>qjí´jéî[PÌÆCŸ½!³B!ÛßiÚ Yã:}_]¯tÚ€ÿ»·]¼íu©©©™—|Üû˜åý;›T²nù¶ò\1ñÄSêz÷?ÔüWVH/z°Sj©©©5ÛܵXÅ&ŜߠzµÔÔÔºç½[q>ÐC®®ÊÉb½‹ûgWœˆÑ¨wö­+$‹Øawýg…dŒ±=â`‘1ƪkõÄ›^óêòÒ=] êÐæ%óY[¬¸¬c¬ ";sN0?ÌßM( K ‚Á`° $â8Ž£”&#\§ÙÉ]ϹüæG_Ÿ±hó†9ãoè\Ó³×Þ^qm†ÝxBùdrÉç8£æaX}…™zâÀGÞ[¸yÍœ÷þï.éÞ¦AzJÀpÇ …ð$g¶évÑðÇÞš½fíwÏl‘´»Z(|u{ßÿÅß[}ïÉ[öl[?Õ‡NÞúµ;ð&ÕmÝý’G¿9wÓºoŸ¼ QünWö0ë]2á×_&ßÝ¿s£@Rë·ïwÛKÿ›=ö‚L¿¬”§‘..·nZ:’»q{~0—ï_ ƒë·–(P%[6æ ¬ÊOÐ%Á`ÎÆàÎ?ˆÄSŸüßw/ÞÑ¿K‹Œ$H‡7¯ÚèÔiÓûº1ŸÏ^-öºÇ`0¸>'¤÷Uîûq6)ï“çØe;‰ï~ÅÉ2}῵B’Ü”“Ÿ w3&ŸBn oÜZ¢o tßCL²X÷¢þÍcx#³Ï•;“El?¨g]?t8+$cŒíñ뛈€ˆˆHk­”rǶíH$ …JKK‹ŠŠ óóóƒÁ`0¬[·n¯^½ðàzÝ[k'¿iêfhØÿ±§®lž € ~¼»ÿ“K•¿ËSoÜÞ:N ŸÆÛ:ÿÇÇnytî‡À“˜V'ë”^ýû÷jj¢½yúSÏþ’uã=çgúvÛª†–<>èî¿.|ñåþu=Üì2Ælܸ–¯\ÞÿÂþt­;íƒiY³1##cŸOž9sæºuëRRRRRR’““€ßï÷z½¦i†!¥B ""ºWéJ)Û¶Ãá°{q^PP …ºuë¶§ã$­Ôõ3BDDw¯ûóµyêÙ¯ü:¤j Ÿ½blçÄúþ.‘&"" ˜YŠý8H"Mºòq¿^O¤µ¦ò—º/´rv[´BI;jÏ9JCâž^_a+1gRG ¢Ò[([F{ï{,Û類ÍÈŠ§»¶ºë—h²Xï–¹‹Ÿîx@Éâ¿´Bî³tPRö@ªB'ÂÊ£r¡îá {…dŒý[ yðísÏ>³(ä(MZk¥Ik [ŽÖTñ‘ÔïÏ?ÿtE—ô€ß—”””çóùLÓ”RâÚdã~3¤”Rzå;÷®1öÁ³êxÑm•Ršø×Æ;Ná¶ví ï»þ¤*Í]³àói/ß1Øg†¶IªÝgäg£ØË¥ inuc¬ÊB!ôlk²ÖÙw^œúÍ”íªñÕCÛÆîð÷+;Üç&ä!¼XîþÅ{-Zƾ þÀN !÷ñã0œê½ŸÍв—†Žúµ,~ªvÙ³wžœp`'üßZ!­t© 4ŒC-ÔÃ^!cl7Œ£²W¢Ò_Æ=<9ó©!ÍãbÿP¼èÕŸœõWN±oR½ìÓxz=¿°×}øÜ‹Ÿ/ü{C0¬Á_½iÇÞ§¦®ùþ›_VçËjÚ7ô¦ Z$»¿I©ü%Ó'Žÿä§å[íÄÚÙÝ\;¸[ý·•Œ±*‰žÐꄉжC§&‘+ïžõÉÊ+ZŸ°cÒ 7}uÒ“o\×Ì'tѲÏ^}åÓ_–o)–IMÏõÈÐë' ;{2@«»§>uÒú1ƒïùëÂÿ{©]‚³åãáC§5=ad‹ðü7_œôÃÒµ9Eĵ½éùѽÒM'øûG¯¼òÉü¿óEõf§~ÍYâ$ÿžÍcU—¿võ+P·QÝøò¤DE" N¼þŠ,ò—@=›Zñê€îwÍ E;ÏeÝ<õ¹sj™È’1ÆXÔÑ E¢G®ûÑW[¾pcvÅ? E[rBF|‚§4?oí‚}È[ï…Ëëí æ,]R$LCo]ñͤ?ˆ@o[ùý„‡ îk÷¶O”þëÍ‘·MÛà(ôÇy~0fdÐÿÒ:¦üÝ«ª¢=ÒÑã3É E‘RJ»s¬ÛkÞ½ç–ÉÁ¶_õßiPP˜ý\½ï=÷õ¬i¢ÔŠZW¥D:Ú“\.ýqÞÚjýoÖ2Y•ˆF©FVN½{ä's‡ŽV³xþÛ/>wŸ¨óÊð6 -2ÆXUeo˜Ô¯õ]d?¾lÞÍݵvíÕo=üa¾öœqK¿,YeÏ&…·,[ºÃMeËßûüñÕz¬È’1ÆŽ%G§/_½óî’mbî׎›½Í®8Ï×ò¦‰_¾?y⸱žÜ‘6ü²$¨Ü©)’ú<9uú”;ÚššÜøú½rm}D]ôë«CD:oÎKïmtTÆϽóñ»ïLž-¡èÛió÷±cŒý{iÛ¶"¥…¹ëÍ?î‹Föib&÷¦¢…§­©~Á¨û®ìuZ»“OëqF벟Z|©u5jÔ¸Qƒ:q{¨C@× Ý©íNl×éÔ“jz háÄ77:òÚ^íZŸxú [.ÍÌŸýåßXÍcU)ÇQ‹^yíç "?ÿÙÁ÷üêèzÃ>¯¤¬ÂgS¤týÞ£ââO<~þÏœW×wl„v\!cì˜qtz,‚7³ßÝ7­¼á™ÿÍ÷t8aç|¶º`áÛcÆL[¸ƒÊ¦L†’¼R‡’¢G!Ìä¦'Õ‚?ÖƒÒè«~Bv¬ o/r¬Í¬UD°aÊm—½åÎÞ¨ ¶ý½Ã¡4ƒûÃ3ƪ¢åÏ ì÷<‘?³Ã oì]ÓD{gƒgo_¶:B» Ÿ¨<["î÷”èîêÖŽ?ׇÍc¯>{œ{eOZkßöžv‚1ƪ8úë©îS7N(økõ6ÛÑY7¿úŸ“¹ÃzÕ>›×궯þ¾ÖS-Ñ#±ž€\!cìXp”‚E@£z·ÛîYþ×½_¬\.ÏC‹Æ?üÎïT·×•ç¶ ¬ûð•ÏV+¨Ü Fú“ý¤4€áKö)¥ ´vR;œÕ5£lf ™pBŠäT‘1VEe^úÀð¶Õâ“Sª¥%ùŒ]ÒC E€¸K懻H¡)ÀÙšöÞdjGƒ¯ýM£‡fùÊRIô§%ñŒŒ1V…oª÷¸ë¾k?øú‡y‹WoùkéÖ@õfÝûÝ8jÔ5§ÃbÙ‘>›h$ÔHæ ÉclòQÛ3Êä6WÝÑkÞȹe·¶*ýºb"Èì9ðÂÞuÔ¿Mš¾ºdÏ[p_Vá«Ã[£ymøßJ(ÕöéŒ ¯¹àÏ Á°’‰µ¥K¥Ö"5Œ1vôù³“4þµ/'~¯XûÒ» o}Zƒš¯»©ï“¯O}∿F»Y]³ë]8jTḠÓÇÝ7UIobZÃ6YÉ»HÂß|ÈSc’ÇOøê­Ç?.T¾ä††tî••È—÷Œ1ÆcŒ1vœA·û8‘ÖZ)å8ŽmÛ‘H$ •––æççƒÁ`0X·nÝ^½záAö$­5 ¨0ó¯»ÄJÙcDšt…y¿ÐíÓó¤è?„”X¶ÄK…-i*ïˆÈ}âcUi¥Aìn&u·eÜmÈe#…¢ 2 ˆN͸ó¡ŠÍoì¦vmi‘Ç1ƪ„7Àò•Ëû_Øÿ€®u§}0-«q"fddìóÉ3gÎ\·n]JJJJJJrrrbbbBBB ðûý^¯×4MÃ0¤”Bw-÷*])eÛv8v/Î B¡P·nÝGå0Æcl_†<øö¹gŸYr”&­µÒ¤5…-GkªøHj‚÷矺¢KzÀïKJJJHHˆ‹‹óù|¦iJ)÷´ôç?Üc…»>&+<¶‡^í1OªøŒ}yt |‰Å;ìÒþí±±Ý]ø›y÷m´Ø]£Ì--cŒ1ÆcŒ÷xˆ0cŒ1ÆcŒ1Æcì€q°ÈcŒ1ÆcŒ1Æ;`,2ÆcŒ1ö/ã8cŒ1ÆŽ:“KH IDATcŒ1Æû—1 ƒ 1ÆcG‹Œ1ÆcŒ1ÆcŒ±ÆÁ"cŒ1ÆcŒ1Æcì€q°ÈcŒ1ÆcŒ1Æ;`<9Ëñζ­9?}ŸŸ$ . ÆŽ)õêÖoÛ¦"rQ0ÆcŒ1Æ;q°x¼›ûóì„„¤SO9‹‚ˆvóàÎÐîß'!äá9D"" sæÍ^²lQËæ­9[dŒ1ÆcŒ1v â`ñxWTTعcW!xP¡Œ1ÆcŒ1ÆØ1â(‹G<”QäXk?|êå-‡ß~N]/¢LhX­^êÈ'ú @šû&)»ôXTE›s-•ÿåóï_:qp3Ÿ{@ïø~ì›ÛvõíÅ‘ÉYcÿ䋌1ÆcŒ1ÆŽaGyl&­NnÛöä¶m²«{Á—ž}bÛvm۞ܺI5\÷ƵçxyEXGÅõ“†Ý§o³ûÞ6»°rÊh÷ñaûÙçâ·=?}U‰" Âßž¾ö²¡¯,)ÖIîÍ.±…S°9Ìê‰ß?'OE /´ìí ¿`Í”n/U*oîøÿ¾ô¼Ó»žÞ©ë¹7Mßbs13¶gë7¬{ý×V¬X^©³õŸ®x}âkk×­ÙïO(cŒ1ÆcŒ1v¬8Ê=ËnšËþ§Âm4)¥4”ß‚Wï{Ï}=kš(µâbW3ˆ¬œz÷ÈOç9¬fñü·_|î>Qç•á­l˲lÍçxïvÓcq[ 5¸òÖFï=2á“¿;nê´ãÇ—?+8yØÍñÏ‹•¿ø»9kª ¼kDëd],›T38ý`lo4Y\\è) .z°“õÇS$œýr·z_¿©ÃÚíéJ׸c׎-‚{U1¶u2ÎìÑóëY_}=ë+Èj–ýç_+ÜT±Ç=3êdìñÊË+1ÆcŒ1Æ;Výk‚EÄÝ÷ݱwü¹>ìl{õÙã€HkíÛÒ0„ä¼OBˆ˜’ÕáüRðg&xk·Úmò“¿Ýœ•>é“m-¯¾(;ÁY€â¼(›dQQ6&cl¯²³š#â̯g|=ë«Í›7-[¾Tk}f^ͳ[ì)™(xÝvÆcŒ1ÆcǬG°ˆ°§Õ[´£Á×þ¦ÑC³|e7çèOK⑹û©rl¡JóJɗ䑘Øöò ê ~sÜK s±ëS§§›FnrJs‹—cÓŽaV³l˜ùõŒ%KÀÞSÅòWqÑ9ƒïxÚÒ4 a ! eYRJ „ˆ¶r¤aøL“‚”ÂB4¼(ø"š¦©ˆQ"j› B¨-’9Ê!m!9åm¯e9"\R‡@kÃBËÑ`¢Šµvl @“$°€„¦iø<^w;þ@@ÒcBGkDt;÷# ÔZ)D B )J4¤€¦4P"DhG,­µRJY–ˆ†4@i…RJ!%ŽVJ)!„;m‰&à8x¥AÚ!"$5ØÚ&B!„ÖàØš@…C¶RÊQa÷9J)­5€B†áÄy<Ã0ü>¿!LD„ZkR‘ã8ޱ×ãEDS C " !P ÛV@HH)¹|’SHR!@ hmJ”ÂHˆ(¤D@JIZ£RÊHÈB!P mH)„$H‚BkM]çÌýÀ*ED€Z)­hD!$‘6 Û&÷5D DB *ÿ?Ô¤ÊJÖ}>!9Z¢iš  5) EZk­2P [+"pGkíþ‚h BÚ$"i BÒ:DZkÇÑZkÃ0ˆ”i˜¦J+‰Â4M­µašÇFD èÖ €R Rå?OºÅ«ÑÑŠˆ”ã ¢Ž‘Ö¤ô)"²µÒDŽ£Ñ¯G†áhE% !ã8 0âØˆ$¥)…i¸?µ(­‚@DM.‚"Ž2…šÈ¶mp”­µFQÒD$‰ˆÐ#·\RåløòÙ_š>ïU[ -#±vã»wé€KÎéX/pD¶²Ö~ôüä 'vF-Ï-âȦo_~ìÅéó—-_±*§ÔLJϨרu—s/ºô¢>íêÅqÆcŒƒEޔ懔Ýc#) FµFuÌÈÚµÞ«~@ð-øÁ„1ÿÖ¡‚0øâ½àÉì;¨õ[~µ£î Q'& DO¼‡Jv”r°ÈØ¡d‹ˆø÷ß«6h”••½ÜA ÷X<‚”Óãó”R¢&mz‰¨4&ÇcšÂ ^C"¢Ô (å8H… ijÐZi¥ˆH!:ˆZkv4!"( p D4¥! ,åD´£E¬°£•R¶­y )AGƒ­µ£•¥•HEìˆ×ãCÇã5¼^¯7 !¥”†Âˆ¨µ[!b4Í‘(„0<¦a^¯WˆH€€Ý MÓtSBéq‡ˆa )àþø¤H)­”mš&ø Ÿ{l@Z+¥”RD$ÈC”eY $¸G€D$¤iX–¥hÒîñk­½ÂçF ¥;³†BxL!„RšÂ0"’FD´m[“£¼^Ã04”Rk¦@DSH)…!„´¥l¥”D!"!@Ù’nnÈ‹(´!¤›î !ˆ¤pC”Òk˜Dä‰7 íF¥€HHR»¹ ‚Ö$º/7ÙøÑY)òȵöƒÇùéê>WwO÷©«s]ðë × ¼óƒ¿•Úóþ>ïê ébÛŠo߸ÿ–‘_Ùíýœç¥J¾5`Œ1Æ8X0ª·läùðÛ©d÷mH¹E5;õhŸž;~ÿaþ†:ëµÔ7ýæ¾O èÛ&ÝÙ±©0³çYY % ž¹ã©'ÝûìÐñ(HKíFp€‚H)mYŽ”‚$Ú¶¤ ´”#„š”RJ ¢(„pl¥I¹ÃÚ! &"ÒÚQŽí &íØ¶c“@7üÒ¶£Hi‰TÞDKB†"K“%Ñ—”,µ-O NJI("H!I#R 5ÃaÃãqÇëõ¦!„ ($B´»™Ö…„‚„ˆ~GD¤¤”ÒíÄݾ "rãSÐZ€áFlng2ˉHi:¶’ÂR>ŸÏq! wwdJƒˆ„!݈MJih¸©¢išnN*„l"š¦ADˆš*|f¤D)…@T¨ D$R–Mú!Êúסáv4€RJEN´ü5""z¤!¥tSDtSB7Nv!t;Â!‚ÛOS‘tj¥´D´,å>@ŽUJ€Ò„(„0„P¶ýŒkÂhž¨Ý·Y6ý ‘åñøQ "2ÝRvÿj¦Pʲ,rûDºa¨[cÝ–MÕŠH@^‰ˆå½MÝ$$I侄ѧ¡P¶CDDQ²l~"0…DD ·‡&H!¢¹69 Èí\IDà‹î“ÑqܦåNÝL Ü€dt¶]ÖÛQJ¡€´ãÒJ+ ¡É‘B¢{4•Å®=*)I9f”Ö†D¤e¿š -zâÂ+_ÍöÍb €øz§]ûâ縲ùmJéwODúˆîÄÙüîÞw|’g+jóäwïßš;^öÐûM°C§ÇÍ׫Œ1ÆØ?+ýŽ1¹ãu7õ­³zêŒ7í»eA[V?ýê‹Z•~5þ³õùšyjÌ Ö‘_ÞzüûG=;eæ²Í%n G)Å×[èHq|q·fš]üŸ{®éœæŽ,—ž8/”äñXhÆñC·ŸË=óªÐGZ8²ÂPÚ¨¬Hı˶BáH¨4RZ¢"VĉXá æåæåäänØ‘P8vÈq,Û. ‡ŠŠìP(TZRRPPÜQZ 䕿çwäïÈÉ nݾ=gǶœm9·mÛ¸eÛ¦ 96mݲ=/wGAn^Q0X, •ºƒLݡЎ"Òë÷ ÓP@&°…HÈC*).àx½^ÃkjBM‘ÒHiaQ0· w{A޶¼ùyÛƒÁÜüÂ`aqAaa~ضlÛFDí8V8RP,)).*(((È/***(((..vÿ8. •—æååçæææ¸O …BZƒÖZ)å8Nôl;bY˲”ck¥P èdvc<Ó4¥”†aÄÇÇ'''Ç'RSSSSSÓÒÒjÖ¬Q«V͵ªÕ¬–V=¹zäji‰IÉ `z<^¿Ïã3MÇ0MiÒ04‘ÖZ ÓãFÚÑŽ€d9d9Ž¥ìˆv,åX*²ìˆCZcÙ7ÖÚqÛ¶­H$‰„ÃáH(lG,˲Âá°‰X–‰Ø–eÙ¥ápQIIII~~~¸4 YáÒH¸¸$R¶J#Vض#Žc)e;vÄŽ„‘P­m­,U\P˜—“›·m{ÎÖmÛr¶oÝ’³qýÆ-›¶äälÛ–““——W˜Ÿ*) ‡ÃŽVŽV¶r­"–‡mÛ¶ÇVÊÑÚí¸'„ðy<¦i@7Ð4„0„ ²m[)eaJé1¤i¦”nI!„é1qq> ðùýÇçóZ¶c+G9Z¹±i´‘Au´Û$(GÛ–CD–e‚­ÓôhMHè6MÒ%„(ÊÂ0¥Ç49=ÁcšF.(Ñ…³.oœê3M³ËÛ99ë^lïózLÓìøÊo3¸øäÚZVŸ¿É± ¼è¡SšœóN¾ZûL×:iÕRÓÛýçÃ1'GŸ?~á¬Ñ:7Lð˜¦yâUÝêø<¦iš‰µ{¼¸*¢íÕ/õ¬›è1M_Ýþ_÷zZôô=ŸmEàé~ûeMFtØ"Êį=üâSk™åïÛÞúý³ƒ»·®_ÍѤýù÷|øw©&€Ðo·7ôyMWãÿü8÷Å¡g4¯æñ˜5¾kæç÷kW/Þc¦d_øì‚B»à·®î–UÍëKkÖûÞÏ7F¢Zºdüˆó:4®U-%Þ4iu[œ~õÓ_­-Õ`¯|úD·Ü ~ñÈE&{<©M{þç³õ(ýùÆzå‡bšÕ}_¨­ÕcOоªë´mßÔ0Æ;Vïp©lÖ!÷‚¯ì6ÁŽD"¡P¨´´´¨¨¨°°0??? ƒÁºuëöêÕë°ßë’Vš°ÂΤµ®°¦3i­£Ã„ˆî"-å¯ Òe¿—»?Ú£ûwu>Í{ñÛŸ»tî^á„’Vš„ÜíБ ÛåŒ1Æ·ü‚àê5«š4Êâxñ:â)ÀçõzMáØ @k±‹ˆ¥¦×cjDAJk­µ@…(…Ç B†áX6jeØJ™RJŽcI@Ëk­m­”RÚý‰‹È&B_À/@¢BîsH"z3l†¥‰RxMD ‡‹eYVرlr”Ïç3¼ÇÑG ‰ˆ‘H‘$RʉXD†iš^R Ó(ï±eH×4ÝÂÂ4¤DIÂ0¼¦‰e‘Û±üª‘†Ó4 Ã0„šî\ŽãFEîPh7oŠ~IDóG­ÝN¦é•Rú}¥”ašBDiBH2ÚÍ G€m)7V“’›zI©´íØÚ±m¥”rHƒRJ D!„rÈMf¥4°,êBD!Ý^r¦HDîÈ_Dts:EÚíQ(D4,‹vNš­Ê‹BJ ‚@cÙÅhŒFÿÒêQ)$wêL˲,Û¶‹KK¬ˆMDî{½Ó4ããã¥iø<^wpºû®MÓwIí:ŠR !%‚Û3Ô½à!"Ðe#ÜËê°(;_J) ”† `¸=Fi"¥”wÒCm;BÓ45)wÎG=ýÒ°s}YWVD”ÑÕÞ¢eíCj ²£=Oݽ! PJ«ò±üŽãödÔZCÙ´6 µíD"6H("jåõÐÝ‘à8Ž p/M„éq£I·£ªã&°Š@²|†Fán?: ºìí¸ÅFDZÙcî\iÜÆÆ`ùÊåý/ì@ ï´¦e5ÎBÄŒŒŒ}>yæÌ™ëÖ­KIIIIIINNNLLLHH~¿ßÍ@ Ãp?’åWÝSlÛv8v/Îݬ¿[·n»?Îâï/¯ßcªÿÆŸ–?Ó¾òÈÒŠP Êÿ憶g¿wÂØï¦ Éò‡—¿réé·­º|Ö¼§OK‘ Uá·—×ï=—<Ñ6N€²Ö¾rJ“¾I›¾E×,Úÿ´»·œvnß>W î–ºfòC^Ê9É@á`®JJ‹Û¥#Ddñ}­ÚŽ^éh‚ÿY°xt›¸Ø7YþÀÙøæEm†L:7~=ïÁ:Ÿ]Ú~ø¬Ro×±¿>¬AñüÞyç‰[Ç.t4Å·îØ )ûÜÓýó^zù»ê×?Ü}Îýÿ·ÈÑÕ´îxι¿>ûÊO%„é=û7ËÙޤ_{æ‹Âø¾o¯øàâÚ&Òö·»eÞ”öÒÿ&^ÖÈW²d§˜Qõ†ýësÝR¬M¿}?íÎ~wýÒµÛ_qÓMç¥Ì¾÷úWÿ"ôš´â“uL /²C«{—(MÙÿñËÝ-ã%è’ÿi•œ4÷¡¶‰&OÂcìà yðísÏ>³(ä¸s×(MZSØrtÙ¤Þî#© ÞŸþéŠ.é¿/)))!!!..Îçó¹öÔñåX BÊJĬé\éŸó Ä]§WÜå%l·%_¹àv9»ÿÛÞžÆ;<Op‡¨²#Å$(LN¨ D‚„•Í‚XDPêh!$ Bm9¶ -¤é€BIÛA+‚†i ÂT¤å¥•!=–²< À¦ŽÂPRÙŠ Ph"”€†@K+wÅ JD)„&DDz[•ÃV¨$ŒØaŸ/Éåâi Gë@ à8Ž +­T€B¢VÊFDÓTÚ0Ÿ/Ξ²xÑ|>ŸVdˆ¢Ÿ|޲¥i ¢íØZkš´V¤µ–† "åFŸlÛ6 ƒlw ³°ètˆH ¡¡•RîîÉ@I(P“Ç0DZEB€R¤uD+"2ÝšŠh t€Ñ’î ¤…!EAÐ$@(…(Ðq !ÝI ¸q§aš`"jE ˆˆ"†¥MIi¥¥ha«²%qH±Ã†a ¡5 ‰äØ(„)$ "Ô¨€„îD<€]ž "wÈ<*¥Ü_ H¸×?U¶…ÕEkWÔk\ݳë›D7†ÈÒq·¼¶®ÑýŸ^Ñ<Áh¶¼æñ^hûè-¯^7çŽ,¿²â¯Ç(¥”å׌FbF£é„BïÅŒ8§ŽGtª7êÍW/ûþÛõáÓ’Ñ×"JÃ0 eÏb¿Çï½4Ó+:×›œ¼ IBRúàõ_|úÕ¯s.’)ÕïNs.šÐ2Áá?l×þ±Ü_,}­{JlphmYº%Ú£ µ~ª ¸‡÷@ÁYwßöyÐV:¡}Ÿ“ª'%ž7¨í ³~,ùnÔý__4¹oûþW•|2jÜÂ|€âŸùr¯4ÜÖZß¼xÐàSrǼ¸(@fÝûñ»WÕ³f¯y÷Ì·rÕ–™ ®ûý·{[+Œé3úSýðÁÒÒ~µ’$¦ž=iQ—´†µã%‚§õ¥×uº}ƌК ÏÎ}°KŸÔŒ“N=±–!  ä–K3¨Õâg^{ø/Uòý´E%—ÕI‘þ¦—ÞÐ~ÔðyšVL˜²âÖÇOŠá¥S>ó\ònóxƒSEÆcÇ.ƒ‹€1ÆØñ m…R(mYŽåé°EDš@ý?{onÙUÖ ¿ÓZ{ŸsîP·†T¥*CU&2“Ã,š ˆ‚2¨ ‚4­ Ý6úµbkÃ×¢­Øú‰´ ­ˆ ˆ€4‚‘!HHHHÈ!I%uëNgï½Öû¾ßkŸ“ª!y:Möï©§žs÷Ýgk¯{Î>¿ó‰’%®kÃ’üF\$Z¬jpt0¯«^X¢ñPሌ<4`fÏê†DÕŒJ𒇞Øê©*$Ènš•‹øÉÝSR§¶JÉÔ'‹K\UUtÏnÌD ©#!²›Kdfޱ"Ä"+›‰žÌ’–¬ºÀ%šÁŠ&³ª¥˜j®(êÜi+ÁL‹„*Y‹Hª™ÌË&uf&ͺ¦¶ †è¹ëˆsj³¤6›çœÚ£‹‰)H°¤ be˜Òæ” Údâ¼Ñ)lÖÚµ*ÔÚädÚ¦ºiÃÌ Î€¦‰ˆºœÔÌÅŒ:DŒ 3€fF ÌÜÍÚEˆ¨ëAú"¦J°_îÿÔû‚—ž¦$€L5w3AY×umꚦѮm»n³k‘’%H)‰i ¾4UpªªŽCàŽEd4¥Ô1KV'tSuS/Q€e„ÝÍ,©8!÷ÅB!™™z‘…[!û©HPI03×ì¦êêNRb@ð>5Ò}Vœ­„ªJ…˜›1pî®èž3!¡”²qœûPÀKCµ;øDTU•»;C2íºn<SÓ€`n»¯©Ø´°½ãÑBÛuEŽê^šÀ{cû¼ãÛݙŬOJU3.ZWϽ5‡ˆRJtÄ×¢øÍÝê1ï?ÿäã]ÿøî«uÛ÷=êøª¿zõÇ7ù¥·ýõ•k?qúèÞYûwÞŽ@ˆˆ ûö¯ÀÇo:”¿æú'ý›G «ã.þþ}€ˆg~ÿóòk¯~Ã_Üôý/=¹ê>óæ?“gÿÉ)5"ðâqûw-/ž¸=~ÍršÓŠÝç^ûè‡þì•}ºâÃ~óÚË~x¿^ÿ¾ÝeÇž}l…@£]»Ç‡ý®÷ýÅ5[OÞµ4—^,<þ9Ú˜ðاÿ·?~Nÿ®½=çµ#2Á¶½K€w‚W§>ìø3,ïYD€µ[nÛrX è×üáK~èM{åõ·m¸fu€é篺=]ºÂ4ßÑ®³OY Dxì»?ÐÜzóšú £œð´—=é'>ú7[ú…7ýÎÇ~îwÇÿýw->÷/ûñ0`Là" IDATÀ€bqÀ€ x AU³º¸Záj aÑ¥¶+ݸ$„Dj BÀÙÝÔ@EŒ £ƒ9‘{©õ&"4'È ˜ë@îBîÞª!‚91;Ìzc„ˆ„ Í;Î"RÙÈÝuaQbµ¶¹‘º<Ù¶À(¤®ÇDTŒÆ( o6u=v+¾fœ{{#s "+½1PŠžæ>3Ì °ˆ»ÍJD øXs×0fNÉ-'"r×¤ÎØûs QDrÎHâ„f „5wÖnM‹Å#I'Ï‚ jìA$¥”ÛfºÙZ]æ®][Ú±¸±±Ån]êÖoŒª ÐÕ¬ë:DtÍÅ`Û˜ùˆb!“cÞJs6ªtD7©SƒY¹ŠŠ,¶LÉÑDzúbn>Å^£èÈÔtm)ýBGp÷‘?¯Y×uIóúæfÊ­§.¥d)¹;’BN™Íò´ÝÊ–rÎ"’MC1Œ mÛª5s7"2Kî`ÁÜ5Ïój)çL,t‘§ªXËmJL$")%"ŠUèK·ÍºœÕ‹E}ÆÉ "ºa?ÔÑû7œME$Ð…‚Hˆàj½ù½w‘C ­DsEgBȳž–¹È̆jDÔ5­«10—¤¢bá¯ëŠ™SJˆ´°°svÇòZš|T}N,€Þ6 ˆJ¥{‡TUDPUËšßÜQ.´tÂþüÈÁÏL°?~eefºãÚÛw/Éü×¼´{ ìË×Ý™ý¹W´°kAzm5 : ø*Xܽ8“öó¥:õ{èÜW¿òwßúù½êÄO¾ñ/W~à/Tåê„ý/|Ç Ïâ¼wŸ¾pÜáÐM« N€ñÔwÅágýÁãNzÑG³y§éökn/<뵿pþÒÿƒ0#üàΫ¯_×Ç.Í·¹íÄq6…¤e P" €Œ"räÙ[‰9€¯^öª'}÷o!é±Ïû£+_÷]»¯ø¾ŸòŽ õn£³£¾Z,´-ÎNKµ_vÛ?eé½o=¤·ÿéo\öËçŒ~÷}ÇüÀ+öW¯8`À€bqÀCAÄ€œ°qÍHQD§ÓiÛ +8Ñhq©ªªXU†’×38C« 80#E¡âÆíR$ =£„$Ò4 #¢ò.!∙Àœûš]"GÓ*®Í, /Ž—»®ÛÖnÅÝ)Œê…k"ª‚©jgÖŒ+73P#$Æ8wû’pñ ÷eÈnó×üÞÒÝ"Šc6t!”$Ðr´sÉç7'&ç>óqã?ý«ì¶ô°“ª#oòtõÓ¸üöݾ茧ìBøÜmëw—¤èúíë€'¼]Š4— 4Í:C´Y:T÷¼‰ü×Þtþ³%á¤g¼øá¯|ÉïÿÑgŸÿ„ßyß¾ç¿òø¹í‰¿Š¸:íi—îýÏ¿y38Üò±kÖôÜ1Ížp˜ð°ëÔ€7ÃC~áãÿðSgÔGTÙ°0B;§Uƒ|çâ[ŸyË[oÌÙü”¾ü©§m«¶æAñ÷bS³upû·¾ôY»ßö»_Òµw¾þOÞ¶pÙqÏû…âh>`À€Ø;À̵7`À€†W§ûìäêMÓLS΂E¦*,ŒF ‹Õ„„ ‹œQÝÝ™0×#’0÷Æ23 £pŒ1„ÀADDUÇã±ÄHÂCœŒâdģЫ(uÅU]Ç£Éd4™ÔÕ¨UõxTUÕ¨ õ(Ž& £…ÅêñdqçŽ=UœÔõx4šH ¥s¹Ð=êÖ«ÒD¤±P˜‚„BgÇ8‰¹\ !T!TýÙ‰„bŒQB=Šu]û33£­yVBge)ŒÂˆ¬àEÎÆHªê ˆžs—ÕÁÜõ˜=ËÂÞM»¬Ýý{N9°¯mÖŽÛ»#u§zÂIŽ=íÔýË˲}{xÊS/¹øÛ.:çÔ“ë‰=ìÂÓR3õœvìØ1Wãñ˜™ëºŽ1"‹ÄXç¶K)%5$™µ¯»»‚–†œ¢m,íňÈDàP:v€h•Ø'mÚŒÉ*œZŸØX´Š`NÖ÷ÛÚúÑ‹1Æ:„ªìÕLU нÿG!†BUQU…¥UÌ¡”2¸Û”eiíè;‘Ͳjq©w)¥œÕ¬<ÅJÿž¹7mÛ4»ƒ£«å.•-(xiM)½p#îVNÑ1•dna7Cì mŽh~&b,±›ˆ„eï0ûž’™ú¾hæ2ª0ëÀ€œï`‚ûÖÖVJ©t¦ÜeMÚ%MªæÔiÎÍÖ´mšÔvEöXÜý¥~gvTB(¥Ž& RéÕé''0B_=”Rr÷bŸŸþ7-pç·ÿâOž ÿðÚßùÔ¦ÁlùúGñé—¾øOï@¤û¶SñÐÇ?rKêU†íM—jÃÏþös·€,· Ön]-=Ѿyý?~ü^6# C­_{ÙûþñŽôÕŸÈÇ?õG/7¼é¿¾áÿýð)?tɱGp‰6=xûÆWd€Gç¿â?}Ç"!@ûÞ_ÇÍ÷Ðzÿã/\@€Û>{[f»á÷žsñýÙ-é>,Z¶­»6Á 7¼[_m¿ŽÍ,^ø#ÏÛÐþí¿}ÙNzáwìJ[ 0`ÀƒbñÁŽQ=ùì5Ÿ9ëŒsx(cð àÐü àÈOH󬮣~œ-¹W=DÂ}tœVØ„k?Íd²00Œ÷Ô-°Œâ¨c£©°6ˆ(11 adW'bn-µÐ²„™E‘eBw&t$€Üf¬‚ĺ‘^«˜ \3%wëÈÌÖå™ÐLsÎD$ŒÀA ÔÇ (DR¡ scfÕ¨žnn…j”m ‰$Æ„0VUÕ¨ª…¨¤!v9¹{Û¶%Æy³ã°—§Ç1â–¥œ3¨e·fªLD„Öµ`^UqCd*žVwgd2vD߸ý«Ü·û˜öì¾âcŸà1,œ|ò1ßóŒ'nܹñ?ßüÎUÇ3ÏÚ|ÿþcwŸsÁÙ—½ë²'>þ¼C‡ï;v‡Âaðø„‹Î¾áó7\rѹ`Fñß¾äywÞu(L&[ÓO_y1ßúå[Ï»ð[>ôÁ× KnÖ9bdBÄN³™¥¤ÅV æ®!F÷£dn)9 ‚«:!•f7-/3’•Y ÍÊàŽ†…GUÍÌ ë²»º{—¦]×¥ÔŠÌ 'ã™5ªÇ"¡®Gu]//NB‘È$LØt­™•öj!QUÀ>"°n:`Q/6m[JNˆ¨t!pÞLjænªw{‡ šHittº[ÜWÈ%BD%p÷(âPvDT2âJ™L¡ûJew@$ƾtÅÜP»°XÈÍ®ërÖ­é´iUµdmjˆ°mÛ¦iR³Ùµ­Ž…c]¹ªªj$!Œ&cfŽ1""1«‚3 #0’#˜)!’ƒdS'6D !dS3C$7»Gô7á Þ¹¯zûÞüÔ]úÔðÆßzùŧï¬qóú¿ùõ—>ï ò‚?þùÇ,âY/û¯/|ã“_÷so~ú[^xú¨¹úM?óúÏð£ïýáÓŠ¹:ðÄÇnÿÕ¿úý÷|ñ ÏÚ·ñ‘ßûÿ®Mvo÷Ž9}7üÏ«nÞÊû?øßóÎ{ÏǺ竮LÇ^òcOª¿÷-ÿióéoãλ‡Í•¯¾ðá¿rè¹ïþÌï>aÛ=U{áøç¾é¯¾ü‚çþÌÿºñï_ò¤ç·¿ýÓÏxÄ) ×]þæ?¿ÎÜ–÷n¯w~ǯ¼æ[ßõÒ¿›úó_|ÃKÎû‰G®l|ü /ÿ·ôk¿z/ýÞ÷rÀO»ø<~û‡Ô¿ðŽ?zÿó£þÿüál_qYŸù¼Ÿý«?}%˜Á#_ô¤=2Ü 0`À€ûñçoÛMàñ?u |ý8õäÓ®»þs÷¡¿†bÀ€¶¯ì8nï Ã8ÜXàˆA @A!™b(yWD™@0¢d0ï\‰8† U îL(2N– ÉPªlë Й9„àˆ„hfž3 „Ì, `¬¥ËröB$.j3c3 ”’åœs΂™qˆÌ¬š™ÙU«ªµQ¬:ô&u#ÇÀ‘±hë›Y«"×ꥎÌì11dè4âTP$pg›Â²°T™¶® âBµs®&ª*œMÉ‘Rθ»äÛžðÞw¼ ÆK{VvŽÅN=iǯ^\ƒÖvn_‰’+LË£ÉdqûÒ$,Œ—î^^ˆ§Ÿ³WÈVŽYÉÔ'ÞZ:vß±Ìd(mêêEÞ¿}oJÝxÿ1›‡öíÛwÅßËýû>üa‹õEÇ€)ƒ#pTK© ‘„X-eu@²’ÆX¾Q0wÐâ®­z:•‰¨P·îN‚”sàf†È…Ô ˆ^$™œ¼/c)¤Vˆ£*­é*3Sͪ #bW !âɨ®ª*ŽGB¼0™€9"аj"@sD fÌnÄæ"RLë ¨nîè!Jê29˜Yïótsôb….ôY‘L23;‚*03rñª÷a…î^lÑ…y•¾ƒÅͬªz²p¯Š7nŽáî°ND‚Rƒ}!LéT!À¦iUUݶ¶¦D”’ªêÚÚš¥D ªÚ4ë›ë[ëY;TçÅɲMvrÕø6¯°®}äjªJDÌ$ˆ–‰J=4$47'"pwBb hfNÚßî 1«÷:Ðoò8¬<û¿_ñð§½îÕ¯ÿGýÈM‡ðâþGϯ¼ÿžóð]€¶_ü›W¼÷ÔŸüÏ|说Õ±|Õû?üãÝÞSY¸üø_~ÓO}ée?zÆÞŸ?ç‘Oþw¯|ÞCÞþ“ùá³N}Ûo¿ûÿâ©/xÇuÙàÇÏ?çò?ýÐÏáùO|Å»oV}óÓθîïzï¿è)ÏÍKßùc/¹àdâýÏýï»ù‡Ïü¶²þy{éq¯ÿÐ[Ÿ½/Q9½ë ?zéâ»ÿ÷“_ô­Û02óâ vm[:aå+kÇÛýŠ?¿ê™ïý­×üÖ;?ößžÿØWlâò±'œxà1/þ•ç<ï9O¾`ï8 Ä“_ôÎO÷ÚŸ}Í[>øKßûê¥{<꙯}ßÏ<ûÄ*_ûÚ‡Ÿó3W¶êpãyø¶×=þ­·½çiÛíº£—_øÝÿëù¿öy5ØxÛ¥žý¿|ë¾ü£…9üèî?þò÷î ßÿ{¿÷Éçýô¯¸î¿ÿès®}Á+_xÑècïÞt¿þ—.XþÀk^¹úïÿËgºÙÏÎïüú‹>XÒ?õ²ÓvèÝ_xó¿Yfˆ§|ïKõs/¾Ü&—¼ø¢cxà 0`Àý€ïü®ï1ó¦Ëf®ÖWø}ý7óÔö¹ã¦øhÚ¶N§[[[ëëëkkk«««‡:tèÐñÇÉ%— šo&¸û0< ?Âðb{?âg^ó¦œU,+#&P³R"Í,èî@¤%“ÎÍ ¯g‘Y½G`AÄ®ëÌ,i&"'"B€î®n…”qw™£H æœ  zº£"fSuo6Ö™Ù³™ˆ€ô™‰}1.Yÿö,©Yà8wÓÏì¨T2{Ës ‘ܽª* ››…;혃Y&"5 t3(Ƀ±ªLÁ&“1 Z"ìðê”ÅsÒÇ<êœëÿáª5狟pæwܾû˜å«¯>øÞ|ú‘zØBÝ|˹'OïjÞó×9ãQçtâXÂCôÔ±ŠE¨Œ¬HÖ› :Q6E ÍÍ)s¼ëàÆ´ÙPå/}iõ†¯'Žmòö×µ9YCÀfE.D–K ¤™™M§ÓœsÛ¶ÅYUUŸY‹©›»—gÍ=¼$J`f€ÏG®)@1›«[Œ±glg·UåÒ˜™fÂÂHe¿¡*—{Ö“³™u].²Y a3+ç®ZÔ—Zz¢‹¡¡\P&À’ŠXüÂÙTUÁú‚¥OQDbÞ#Ü«UÉÌr—ܽç.™1°€ª±•u…x>µúzæ>ô‹tîÍ/Ï,?`×u)%uË9O·šÕÕUÍycc½k§]×X›šœóáµÕµéÖZ]×!TÇl?vqa×xaqaaa4Uõ¸W% ³÷SŠ)”¾ ¢R S䜅´í9D실S†r]~îÇžJGëàn¹åøìµŸ}Ö3žõ¯º×ý“·ýÉé§œŽˆÇwÜ¿¸ò{Þóžo¼qeeeeeeÛ¶mKKK‹‹‹ãñx4UUB()Ô×m÷UBÅß4M¹9?|øðt:½è¢‹þ¥ãtS›×}ûøQÏ(¿Ÿ½ëÐ=zRÜÔú'"èWEæ2Ës™\ç[Á¾lÅ­_†Ä„w¯?Ë6< éº×=æÒë^û±ßxìÒ¿rSµ¯XÞrÔ!šÝ]h¥oŠðè³,§y÷:³a˜$}l÷XŽÄèG-`‚£žH,„î6"$:òHvôútÔ»í­ßyò÷}ø)yí[¾cÇÀ,0`À€û/ü…?þÎK/^Ÿf-ŸÌ$çK¶/VW\ñ÷ßÿ¸=ãQ½¼¼¼¸¸8™Lêº!Ìo ÿùÆÅâhâ<8cdÈîŽ @€ŠáÔ õÐzV6dfrbr"´ìæœ1˜—>^ Rž<«m@ÂB9øœl²ÒTëFN€)gfÖœcŒf†L®FG—Z âB;Ja ܽdÆp”Š{9žö‘v½@PbóB'13‰QDd.(¢¶íˆ(†`9F#3—Z Ç šLjiš­•mÛÈ ‘·ïXJê‡ï\?çÌ“o¼þ–•+wÝu×Hp÷Ž¥Õ/®»kEÜOÜ¿wå³7îß·'oÝìš¶m_<缇LFäš(X_¢Mn–Ý ‘çm¬h@Hš²»F j>×f¶gÏö¶­ÚΖ–—³oó­_¾³M>\×uE¢ÉܽiÌz„™YU».—w½Íé–e12s¨$pr3w9€Ï; Õ ïVj…‹@Bœ,>«\¸¤Î̂ȳ7Ye#F’PûÙ2gëTÝçõÊêB(„]¹ú`”MÁMD °ÚŒ}ùO™*îÎH†æ`1¹Fµ0qs0˜Y¡˜åËf{Æ %—aVAÝwÝÚÔ‰Ê8»ÌX-ãDD€fF"–sO‚mnn•-ǶR×4 ’%í è`1ʸ™¶õh2/H= õ¸.²Í”Û¨îîyN_ZvÈ ˜Šš2"ƒ¹j.dÜÝgÚ_rãìöàxCúÚY7_û÷HÌw{ƨRa>ê3þó–•£›Wî±þ=n|矵OÿõóŽf¿zyËQ+ÝÃðÕöð•–ßsÁ?"ÞãiG¯AÿÒmýúOݸxÖY»â¶3/Ëq¢â¢-â2(>e売!òLÎæî­*à̤ „LljÉ•ˆ|&aö™µ¹¡#šÙ̘ B¸¤C&FlSB.²²Ùù–#0a&ÍÚ¶&”sn]cU€Ä]§Ó¦®ÇíVbñ‹sÖ—¿ü¥n¸q«‘Í­-â…@|ú)Ç^ݘÔxÂÞF‡Ü€viTu4¡•¥H\N=„@¼oß.b‘7§›ã…q§*QuƒÞö˪©ˆòÜ 1› £ ¨º* b2GÀ$–sôÅÅxþygÉÂè¤ý]:ñøÐpèðÖu×ÝLÄ@ äÅ/‡ )g‰Å×L…Uì‹Pfr3‹“àî®ÆâDbGÜr!"qQÈÃÜRÝÿËE)T5±`Ê™¸—¯æ’¨…ärAq5Õ^Ù‡L)%˜_2".œf#PZ»E¨$‚»«Ï]ðýã#‰¿â•.ö|wgà¬ZF~kÚ€ƒ¹–3pPwt˜YaËô›±çfæ®eÏ…w÷iӔݕ•U5„P¨j×unFˆÌœRGDìÁÀ̳ Ç8^ÈM;’à,ãñ¤®êX…âj Ò@ž5•¢YFðÞXžæâråÿ”±¨ÁÕÌ`àlþσªm£+_~Æ1?{ÜE?ÿ¯=¹~_ÞvÆ9ñ?<ó¤?ŠÇ_ò o{Ù9ãaŽ0`À€ûñsPï·B@üFóñbqÀ€uíÂhò­½àCøÄþã¶sÎÎQÕ]sýêæúôÀ‰{ß»çúÏñ—]ó÷}ôÉ?ò1ȶÏ}ù–›n¾ëàÒò"¹ynš™ <0“#x—G£ñÍ7Þº²ë˜0YÈ9ï>fW\tfàÅìάŒ$ØScÅZ K IDATXz@™‹ã±—ÚÞ,tR‹™ÅÈÀ•‹O Ä‚êd!n_žì\ÙÜ\ß É B03a@(¬wU‹³èa¼l EÆŽp7]8/Éñ£AÀ¥TùîìE5CïtX³g-ùƒ 9gsóâ»Ï¹+|1¸–@Eé‹S`¦–%¹;•R½ï-)¢ZÍ:·ò ?fêÓËY£r_ð¢fÌ,1rP"›åBáQU‰H¡PyÖ£RšN§¥=£PŠ9çb=ž{3sQªjÉ-Üb±—ê›9½¨È,„È€ˆÄ]RflV³b©.ñ 9çù©•­¹{€L½NÓÝ»®ÓÛ+Æmê¾JòøÿeøÔáúúúð ?`À€<qoXE¬Ðî[¤Ô]þ÷X]=Tê ðÀÁ Çï¿à¼G õJ÷ “B€®¸,4G3G0p.ú2T0!*¥"ˆœ=óœ„vó¢sÓ¤}ùHîR×ub ™b]1bQàŠŠö ‹"›N™pN¨ÍÕpÐ;v‰Ü˜Ýp©ËF¥I&ư¹µ9Ž!wI³Q—Å †ãºzÈ=ã…ѧ>úùÔÈÂNh7«O|âú‡<ãü'=ñ¬O}üÖ“O[8ãÀîcwïþèǮپ¼iDç¾÷Ö›¿|ë—6¯ú§[¾åü•³ÏسPËwܾ¼°§nÖã%÷ŒÂˆŽ)I T§ŠUØØXÛÚ\ž„JDjÕDæˆÂ`€LÉ€ˆ ›õ1|D”³"Ǫ4h÷²>‡y Nš9çœsŽ,ÀÅnÞ—ŸT"Ióö퓺òÓNÞû™O߈LÕ¤ÎÉ•ÄsöùÊ0ßÍ©ÄÙŽ ˆ34õõÇ…Oœ¯Y»#)࢒+ÂG7Sµ H`PüéýŸw+£ªg7Wm2("°#€—³/ÍB9¸;Öµˆqι„<Îy½þÔÀ½L¤ÑhT$~Ì<§8 œ”»ÇX©k pÌhL\’ÝÀÍt^äâî©íúèF÷¦i´çœúv\æ»-áª:óq‹ˆ B‰û,ƒÉÌ)‹ªæœÍr‰‰TÕljÖ{»Ë©Í{ {:x¦?>’vT›Õ¼hVÀ6%°ÿÛï{¾Æ'‡{ù¡bÀ€ ðàÄ`…p_âÃW|pqqù±~Â0ü«(©B:|ÅåGðV_yù½Äåùà?]õ©³Ï|èÀ-Þ_o¨¦` %÷Ð\“öú&ATG7õlÈ&,ˆN"¡8*‹åS*)%…¡ŽrΪ9T1wÚuM—¦›k«` $pU¯ÈÎä]¬«rM뺆9Uj%ˆˆƒ8˜ ‰º¹Y&ŠV·BÖˆˆ9)ºk2Uë&ãÔB›v5†xÊ™g--ÖÝZsÛÁC'»o÷îê[ÎÞãŸþÄ-ËÛWvîÚ¶µÕNªúÀCäÊO~qz×ËKé =±ÙR¶­¯=ñ±ÇÆO~â&ÍÛÛµÛO9iÅmåÐÁ[Kn¦è´’¼ÑÂú&ªze›ªŸ¸o³™Ç‹¹i3¡@ŽqŽªYÇ£œ­Á݈)§„È93ÇØT S†„Ù”!²#1»{7mÀJù‹'SU•Þ2Ìn† gs’ ¦nz˾옖G««[š8çìšË7´†èÌHDn¦3% S@ò¢%èõ†}sŽ•úèýÅÌŒänh¦¥ÿÌ‹´Ðf÷j9Y‰¿!(û†™m¹O-D+Ä_ÉŽ$""v‡®ëŠáWÕ˜¹®ëcœª îÞæŽH ” ×8¨ÚE¸{ŒÚ¶¥Ù K‘[…ø SJ Z‡ˆŒˆ Bèm¢œs×´¥Kº]J„˜sžI6û±ªª*[ÎIƒH`)“_DBÙzÞ¶­™1;"!æÎ ˜r6tcæ®ËnÞ×ï´]WˆE™ÈaîÌÌ8•ÐG„žÍT7…~zxJÖ¶ Àf=ê 0`À€¾! ÄâƒëëkyäãúÔ:`À€Î;÷aÿô™OãpÿASvŸÕX¸«»;!¹g0rrïI3#0"ì‹€³æ"!,«``)뻫¡13 ¶¹EÓQU«*`q@‡à³:t"ŽÅìÚo*眳ã'”Zá>§Ái¾ßd¥/ØJ>c¡mÞ½g×ñ{w\ݵ×_wý3ŸñÉ«ÉýÈeø…§ïÜEUU=òá'¾å\vú'ï9!.³ç˜‡=jùÃså…ÝcíúÂÂö;­Å(ëkM ›žÊÚôð(úÚ]G“庮RÛiRér"縰´yÇíºe²¸â¸i×e1Õ"s„ÑhÔi(Ô ¹§R‡2Wº•æ¾qµÑKÙÉJÑÊ,o ˜RBv0$Fd‰è–ú탧Ô&€xï¾mj(ÆõMo ³f3ȹŒ-À,l¯pU…bÙdÒ¬çœÍ UsÎYµ¨‰ÄPœ ›EÿH=C‰D¬ªQÄ]©ë2"2’»ø\6ˆæªêjPŒíàà3ƒ¶ƒeÛ®Kë÷L»Z8oóljP$Žî³ò–¾ÎyfdžY¡ŠO›ÖÝKÏ”éWæ3ö½Òè0W¬RYg'«³ Ò¤ î¥s ?Ô²f®BEDUU€ˆaÎÙÀ¡|Q>ÓŠZÎ¥"©\”¦iD¢» ˜•ëS˜Ó ÀDЦŽÁÜsFD‡ŒˆB}Ï› ˜2`€è€ÃW6 0`À€ß0bñÁD( èÃP ð@C±ãpÿ¡4®€°‚«›e5p(}â("]׉H58«gPt@$C è³ä2TÌIUUC £%·iÚŒ AªZ$VUÅÌ…ˆ$Db&‚âŽ.¯É˜T%H±©.,,ä.ͽ¢b43aVU!Ê]‚àŽäæ ,L&K(±IÝò_ú#?põ5WáêÏ<ä´ý ü½ßý¨/Üx«éBj›CÓôôï|XÓn~ôŠñèsA›mãå§?ç±7]÷¥ÕÛVCµÅ‹Ë®>YªòÚêÖêÍ0ÚnªÓÕuÝl0…ÈWW-.-RÓñh¼²ï¸»n¹yzpv@‘Ü]6f׊£B²”b¬«Q4…ÀŽ`z·ÝÀˆÀ™’%"2ƒÜeW1¥®@@0¦³¹š3•BmÕäYÙ-ÄI j O{Û±±>åŽÙ±|íçoUã›o½=e[_ßdfFˆu€޲B£¹ÏÒ ‰¡ôwmŸ˜³€Ä–™G£ ½¤^–iД‰„ˆ4Í#“„»$"à½÷JϤ‹ì¨讦Ӧ-ì¡™I`®‚ ¦6IfJ]HA!Ï˾|î63€À±°0ãLsÎÂÁTU$ö­5èD@DMÓ¹»åÞ.mæˆÈÅzÌýeÊ9'ÍT¡óÑhÔ4Íd2).lfV³rTAÄ™j ÌXÔ¹t¦«»“pjsצ2žnæîÙ,å ˆŽÔåìHÙò¸ªˆˆ‘rέfWM¹cæœ:Ó(âj €ˆ]N…ˆ,ú_"BÀ BDfÂÌumî¾±±6¼0`À€|ãˆÅ;Šèf  x‚ˇð÷ …’©#d3Fwst4FBð&u¤Ó\sΩŽ-gad GAD4'D“Àˆ Ä›IGµ„Q¬‘Jº"º;H`@p+Ax(Êc)"µÐ·ñ"b@° ânfÝ2înÈÌE8jE§éÖæx´òéÏ\cNO|ôéÇŸ°ƒƒ {ö|àÔã»é¹5íVr‹ãÑ8„+.¿ú1O:Ç)omLWöîlom\s-˜ÕëJֹ궺@k::¸v"b «…¥¬m ‘F {NX¿ýŽjš ;1è²’GÑÎ*3pw7!c£ìæœÌÌ•Ô=‚›«’„äTEÈšÛ¬m$¦ ‚†IF1ODl†Àä„fFÕ.¡$si§É,N;ˆAB¤¥mc aõК;;l¿suóð¡Ã‡›zIT,p ®èh$}„Ÿ»#yÎZˆ933ÕÂŽ˜zJ¸×–uª±¨ª©ªälD¤m¡¢õ#*ÁŽ n¥Ü-€x«‘š°ë2•”A‘àØ‹+ï–IÎô–Ä„ÀÄaÄżÜÓmÜ=;“9¸»&‚’Þ§6#’H1雈D ªšsÇÌ)',î®nÈ€ƒª²HGæl…<„È̪šzy¯†¡t¹XVwœN§9çÑä$"äàŽB&"Ì,ĥƉ£C2pÁ¬ZÏÚÁ1°jÊ9™™‚ª*RÇD"åJˆÜ]XrN!TÃkà€ 0`À7Žá#ëÀ\ˆ Äâ€Ì?ÏA±x¿ÂÀ™Ìˆ% a“³™‰H$*ˆ…ÚãBpdwPÐäÆˆfî 2sð€ R«íÛ½'©1Kiafæ  w\"(RdD‡”#ZQÌ!ÒE•Æì®Õ(&ÍQ¸®ëÅÉÒÆÆÚ¶IõˆG¹|éywݱqûÁÛ8¦«I£Þ5­™©k uÛlŽÆtþ#ÆéÆ*–DjNïÜi]«SMžëñR½]ÚÚ*mÛ6Z\iÌÐy˜ŠŒ)úÄÍ Cª*¢[«kY›œ»å¬aa” H07-¸W£è–›éAB ›› ‹[ U!wêî Öj†¶ÄR£êÞ2cÎy²¸<šŒ“;"vmãÙêqåyš½SM¹ -™cN­Yžý¸Ž"»u¹KÇwÌê¡õm+»«Ñèúë¶ýïü#¦jš§)Q5ÒÀ©WÀDT¢¬€Û®ë+Bfµ̬ÎèDRÂ.)«"‚—«”ÚÔ?ÃÐÝ]=çÄAš.‰åìEÈÌMÓ0s`qr„¦iºN™Ù ½h]'.VeíkaîFoÆ'"0bdG&D'"ËXTU‰Í C©>}Чˆ'Sä )Ý"A¢.' æN$fVÚËÍ•%´Ó©;p¹—@,êBéMДM»®óÞåS›ÊG1››¹ªÖu]üð0)G”€'M¥gŬ/õ9;€™i±¨;¦Ü—$FGÈs»µafÅUâ [k"2w ‘% ·> 0`À€ß8bq`.ÚbÀ€(f1cîè,M¯üO¡ïÉu5!@OÖ # –4»GE¢¦††€H(€¨XJxѹôEsïxEpa.Öæbt…žSt@&Gst"G´Rtë0σ›'åõÕ·È)›;šódaéÜsw¯¯n«…·Öîܱ°ãÄF‡î2ØÚ<$ÝIdªàèfÖ4B@šŽcdjmÙ“ÄqÖf¢MÛ0Žº4¹ó¶;8¯n?iGè¦íÖ¶ªÚœ6ÈlÅ:N.ˆB/LÖV»XÚÍ-Œ‚#QÏÝVÎ9/,MÔš¶©Ü ˜ƒ¹¦,€ˆ˜»$DÞu,+‹'Óº×Õ¨ÓäH9«gs÷”4„)º7 Ø‹‘ •Jß] gL)• ¦ÙœÑvíÚÖ6ÝxÌË‹µ‰^mªÑ˜™cŒª:ª¤d ¬׸0¹ â¦ÑÌ’f?b Y ³þnÍw7YÏ‹ŒUÝÕBà’.ÈH€^v×÷®dUÕÜ¥Æá "a$"⮥)J¾¡ß]\f…” ί!AÎ*Ä6+e.ænGÂâ0F*}Aà%?B¥¾¹oyGăÎB'-[ñwg"B¢2¥‰H¬⹠ aéfÑ”‹Wº˜©Ë:"â@!0̧zï%ï¸dEÎFQÍÜÊ(Éì¢8x‰"å@µ³YÍŽ¹ƒCD/¢Ìœ:b)ý3þ Ö0`À€ €X€x_Ðùö¿}Ão]~Ü ^õ´«A0`À}ÔÄ÷'j%çNDÙKÃ/`½0w%Ù°ïØ…š‚>¥…Lìh €Dˆ˜UˆŠ› ˆØÀA80ÃL‹JÚ%`šñ^˜¯ÂZ‚{—3˜õ ³•ˆAGÍä̤¼‰SÂŒ©knýâ-˧ž¶gqÄÌÞnú¸C-+wm†ŽCBD\ÞUwM+ˆQhs­SK$µ‹×Àê`‘SצnmÁ¼’ñÞ‡^˜¯§v+.-bª7Û,"Ë;·G‰‡ÔN‘Ð .L¶n½cûdåKwÜ´{2^Z\LUš®†ä]ΨlA$§Í×6·r—«¥¥¶5MÙ(D bn[këÐu©9åô‡l5íÁƒ·#qÑê!Í]§¦›S PUU”¨àRŠVDD€[[[Däm“ˆÄ]·m[²¶mÖ›+ÛÏ;ÿŒcöîxßû?$!&ŸŒ&ªJüÿ³÷æ“\eÙ÷½œsªºûÙg2“If2ÙHB !@$|  Š€ˆà‹² A^dUAd“M6AQEVEü@„W!,/»! „$$³=[wWÕ9ç¾ïïÓÏ@’¼æ…úýõLO/ÕÕUÕÕW]÷uÓ›ÞV÷‰”Éh2d›m   †L¥þr60 "‘¤ª³®’lÎ9P‹9`vª³ ÍP˜sŽ9åœÛ¶íºhe†×oCÄR­ŒžÐ€aVƒXê° ´¨~’=QALÈoML‰“LÕÈŠ¹Ï #³­.i"J"ì½™™ˆS‡˜R² ]J‰qõ:Ç¥}SJˆlY$‰$‰1Iʆ³Q çœ÷Þ̈"¦ª"3g©ˆÉ¦ÅÕXæÄ³fÈY¶ÄY)'1[Š-“YŒ‘©AÉfÕíª*šÚ.“÷¾Ò¢ð÷ÇÀžžžžžžžžÂÖ›érÅKßøyäë¿<Õør²6W}á“ÿñõ±ôŸê Ú~(~(Yýü‡þí¢+é/ÿ÷ôü9R"Ñs¡ jD†ªJÎ騘Á˜Ù¶ÚtgÈLßþdÈD°ˆtf† šRJ*F`fFŒ ÈHŽÙ³c$G\LjÎ3˜ÙV'2€ˆ¤.ÆKçn—R¹–¹€Ù›™ód„¢ÒŒ*Ý»{Û­÷77¼æ[ДÉ%µ‘SÛˆ™‡™!.å˜s¾"ÇbÎ ˜— ­$EEƒºŠº¬VUÕ4vanN2%&G@•÷)ÆØµu›ãÔÆ¦i‰çææ@maû 9/Q$C×uÃÑ@<±s.6Óâ"””sN€j&€9çclÛÔŶ›æFãñ´6’s;™‚hnºÜ6šã¸™Nši’TÕµó•Ѫª*U16M3NE$æ¤ ³HJ3µ8Y_s`é裗s3®ØV–ç½#ïHDðZñ¦E…+83‘R‹l[}Ö9gI¶‚2m«â¸l<<‘¡òŽ·”5ÙBrÎ)¥œ5Jù#ç,9ËVïóÌ j6³(yŽ· °G6ÔYŠ!VU5‹)tˆp«n¨H®×>ؘ•mØg«ñˆ²ˆxKg73R13hcS*u+H„³¡#VJ#,žOï=2…êº!8ïK9Nyι‚Û CôÞ{âRS…Ayx©·6f®ªÊ{ÏÌe9‹†ˆˆI…ˆ˜“/k¦¬¥#…íÎ÷~ÈCîuö¶ï·’ú‘¢žžÿ{hÏ—ÊF4ĺj‰˜¹ ‡Š 9&³‰D4@QE5Ik¬àȈ¨sÉDE€YÁt«ÓYUÕbŽÉŒTg×Ð1ÆHDEg,c­„yEô™8õà¤S©ëÁñ{·ÖfeyÁ²Ì/Ôs5H6è<“D@ÊÙDÌL@… Ûéj ¹Ûh¦ä{§Þcj|‡`DžsêÈÓ`¸“”*Ñ.K5T Mª‡§~a©MSjši=ä&3û0l¬¯–FÓéôØGO§ãfs₟[Yž[Ú6iÖ7T}tHÎ4wmŠ)ºz§-¢O¨’Û¦OÁÈÍmÛ1ÖmÓ˜b×tfJÀ¤Î•+U*¤&BD)%ËbŽ©‚w~KD‘ 9‰`7iÁå0š[ô¼:io{»[×VWÇž<µí´ëÌ Ì,'13Íæ<eYˆ8¶ˆ¹®ëÌ@Dœc3›Mc#1K5‰©ˆ023§œÙD ™QtVë¬fˆ¤Y“ïL)”嶪®‰ÈĶ̆E$¥-Šq¯øMɇÄ †deëDDp”53©“3ŸRÔ4sJήe ³š!13¡ªZ&£œ ‘€ˆÍ@‰°Ö"FΗÿ 0QUSÑ,BfÃá0©ä.†àÁQUÈ dX–ðPvÎÌ8xË☳Wv­!"×Ãù.µ Ø¶S‡ˆDnËÿ›rV']=Íü’ Ð"f3c Ñ\òÁ0¥„Ò{zzzzzzz~„E0•cðìÇž97Süxnï‡p¯§½ègf݇?ðs©~qËL4_ò¶ßzñŽ×þöOï™ ëšªˆþ¸«aßåXL×H»ôü'ž» “ƒ—|òÝo~åã>öWýÑãn·äz…£§çÿ°ªØ ‹7íW ’¡yﳪ3°¬BEQG¢ ZR5E3 u-"@DI{Ç`%n¶F8g½[7r|Dú3Àr-Ì@€‰lvu¦¨Eì] —cfï3©ª©‚Z‚à²\zé¥çßéì‘VŽæ‡)µ*‰yæ)+avŽÜætâœ#öª™ÌÀ`kLÙU Ìœ%“ m—h-eºÐ6P QUSÛz_åÜdCô¡jưª*Ii0 "Öv-™A]WmÛ‚™˜VÞ¦“iŒ‰ˆÆÍx0¥Ô1³)zBUÍ%²PT£ ñdcê‚ßVºÉÄETUëºJYBðsÃZSjÇã‚sA Áˆ¦žK`#±ãØD-" xïšvjHÞ{€¥¥¥m£åveþ¨Fÿõƒn²IŽˆHèr΄˜-sëåSÎ1u]*:fa#€¿$bŽ1κžiÒNЉPUñ‘ËqGZ¤‹ ¨„UUq]‰8<2•_(ªâ‘Äò!°cWdo"*Ú#ã)ˆ(*È@bÉf•ò@1SUcf°Ùч™Ë˜6šÍÞ¢+/𩏠SJÌL[_Ùê@­|^D”S""F§Á{ÁrZfš²¨ä”Tµä™BΈHÞ¡ãrBW&¬5©c‘œ3ŠÙ ¦Ó±sζB TTAÅ€bŒ% ÔAƒ'§æ<»œ³ˆ”`žžžžžžžžžÿÿ¿ªnK±püé·>sùˆÏã×ßxáþù¶/þó_»EmkŸøË×¼éß¾øõk6#Œnó„W>ÿKWþËë_þæ}é`gÕŽ;<úy¿óSǸüMù™¿@¸õ3ÞòÒó®£Kn;}ûg_ûì¿:îU;mî;ËtÅß=ÿñ™oMÅ/ì¾Í½ù¤_ºív‡ >ôÚ—½éã—^³:0Øuæ=ïúôû?ø©K×`ù„óðëOúÙSçËb§Õϼëu¯{Ï'/Y££nqþƒ/|äOŸ4¢Í‹^þ›/ýòmëåúîW¼)ßy“,œxÖYg®0Â9w<ÿížô¾w~õa·=wmýsoÿÃW¿ý£_ºÆvì»Ã÷ø_o‰erég¾°ÿØ?åI·¨þíüöWîèÿç!yÊ/üÍôú¬ÜòuÞ¢&ì.~Ë3žöžáÏ>êiÙ9þä[_ûŠgѱ¯»ðL°cLzsÞ¾GÆ"nY¥0 烥i«ÝÅñ¤ ߸qLJþú OÁ‹ß÷†W?þ6oxíÃN®¯û¼|ƽû̬ŒäêO½õÞôÜ—ŸúWϽÓËÚçÿõß/Ûö§>þÌ%ó)ÛzdOÏ÷U{añ¦ý $C”­ôÍ"!•ØD",³RØBŽÄ”»¦-VÄ#N±#~Cf.õ0aˆ·Ú„ `Ë«ˆ€X‚øXAˆPÐ)ÍpÎ!“w|øÌ§ÿã‚;Ÿ¿4}íÒ+×'Íåßœú°ãÖ§ÛltÞ±cQ!s'¡"Ì*bQ5O§‰ Ðq¾ÜžL‘ˆD™Çãz0J©s>Ô0v“thuxÔrΤT×4+]ÃY#iJŒôŸ_þÊQ;·×ÃJÄ@QÐÌdãЪ,­,Ƕ+A'Ý´A .xDDòä¸kšœ³f$v’bR¹&Ç\¬”ëÓ©‰."BJ˜¤i𥥕iŒIr5bB„¨¦¶1Ù`Ü Ê)å.:°Â£#jšB¨œï¤K)¡i‰Û€Ê3@Èjhª9‡àÕ,guµ3Hš»åå…«¯8hÈ%îPDRJ¥œ¤ì˜¥ÔXDbŒ9çÛ.Ŧ™nnn:çrŽÎ…”%T¾ò!Æ("\ËZ¦qËbÌ Á­Œ)ƒˆäC$ä†53#ˆšA]׆hG„C3PED&ge„YÊ71•s((ÎÁoǃnå?ÆœSJhfÎ$+0™d‘ ³jrpÄ¢ZÄijâl gFE515ÃYQ9…P™élôÛ AµtÈdÉÆÎ“Á‘J–r·œsRÕBéY1G\*ÂED™UUM›SJÄNÌ(å)EDÌYs"ɲZÌËxupž™=y •›y™Ë®ªªM–þðÚÓÓÓÓÓÓÓó£",~éeºïÌþ^¹÷«ßðè}ß!v™N8çüsö 1~iÿºŽN»Íy·;}~fÙºc½²ç¤“ö¼>›ò¶ó.üÝ<ùI¯xùY'?û^Kב׿N¼ý'À-¶]ñá_ÿç®I·_d0î=û¼Ûì«ñŒ]ûÿý‘»çî?{sæo]î#ÏùÔg®I·Ø6?ûÆw_u‹G¿þÑ÷ÜáNÛyøãzÛ?]òˆ3ϼíSÿìmÄ7ã„ðëo…Ö»v’'¾öïø£wp§?âÔl~òOÞrÙνöÙ¿z‹áOœs|÷+ýË?½è~/¸ãòuµÊù“ït·“àVÛ¿ùG¾÷ÓWuw\–Ïñäó.8ï´!õF¬žžl%êWÂM‡ÌúCDÊd) ϼ`F(Y ‰$Ï ŠŸ+„ ªE¼öhj{F&rn6¬  %pKé#@ *ÍdȳC1‚ái–š‡€h¦Ô4Í1»ö\qÙ7NÛwÒîG­O7ÿ÷W¾yÍûÏ?s/nO—_yh8q‹KC$ !´íTD¤®*f$#E³Ò27u%ƽcF-2¨ ƒå®ÕÝ`¾^ZÚ8|(lŽ©mF‰‚X£˜w4??ÏÌÓɦ㪹¬"¢ÓÍñ`q®6å3ûõu•¹j4Œ1:Dêj:i ÆSéÚÉdB¡b‰]N):ç'©­æ†¦Ú4Í®]»Ö×7SJ¡Dä˜Æ›ÓÉdqey4?/¦MÓ!{dÎ*)¥D„š% ‡fÖ¦Œb¦&"EN-e)DPB$0uÎ{ $ØÅxÌ®—O§ÍÖjSµÙ¦R>Ç-MÐÊ?ͬë:$²¬iÒXUIUU©3Œ†@h"䂪:æÙÃEU Ñ@$#bUUDDŒ%^3iBC+ÌH[6Ø¢1Æ.•Ij43cšm©„ˆ´µI£A²Ù¦¨bŠªÅw‰)gDÌ€ VúšÍ¬i[WäuDÇÊü¾H"‹€î˜‹,©ªeRjEDr.ëÉJq62!¡™ˆrKÉ ÀL$UD3Ûj-2ÑÔu-³S!DÃY[w1 £ª*‚Ñl¯Ì*kD !(©¤@ÉΉ#õGמžžžžžžžañø?ïqgÏ1"…•a¾>lKŒªN¾ÏƒÎú_ü[þÚ]îsÿûÞë‚S¾þ‡ø_Z|hx«_~Æ#>ÿÄ×¼äïOûã®õiÿ'ÿöuoù—O]z ¡!·ê7ÚkµK—I¢°²wãÚZDÄzÛž%øòᩚ¥ƒ_½¼ÍW½ê?óê™ ªªõFaèèæž ~m;ÃÖjøâïÿüO¿¨¼—á wzô‹Ÿ|ï]!_òÅKºù³Î;nÄL0<þŽgÍýåç¾t ÝqyöðòLùš½ùUoúÇO|mÿ”F®¿ÑÙ·_‚ˆn`vfOÏ+„Ôÿô½Iicç‘UÅ3 @"£­Ì;ɦťEŽÝ 23JYDÐ12¡{ï™a˱ˆ]Š¥ò¶ŒG3s)žF45CC"3U`4S“ŒdflƉgõ/eú0' 5]qùÚÉ»·çɪsÝ»{ßá¡cØ…ìè„ãžb§ˆ¢u=D"ï¨ëºÔµUU±`ÖLŽÝdm*Ò.Pg Ù#S¨ÄŽLT$§Õjyi¸}!äfÊ@Eß™¶ÓÁ`C–ëàŒÜh¾ZXˆ:=¼¶ºmGµ÷¡âisxÿÁÁÞ=³”I"C˜tí’a»Ù,,"$Ëf‹Û·×>\ö•ϓŵCëËÛVØëæú¸ÙWƒ«ÃÞããAqBjW]uµ÷Áy'"5!{Zܾ2¿m9çܶ‘PT³4Më«Pùºôä¨êæúF—"ùàÊoÊQ$w1§4·0RÕœI5‰$“< ÆÐÉúÔ q÷îÝlšÔ¶j ¥ÄŠåpVöl³Ýµm[ç«¶mSÇ#F#r쫪 Eµh|åá屄2’!Ñ€šÉTL‘yVñ#À8‹S, PJÃÛ¦;R ]‰Œek„­…BЭRi@‹mÕR(df¡ªÐ1åœ5)9…™¨—cN)©÷¥z:‰‰1—ÉþR ƒFY$J"P“$†Pl•EŽ,ï±8(Ù9645«,§¨ƒaR1C‰I$7¹EDÍYID¢‰CÊ9²˜UPºª3ª‚s.i"ï\íë$6¬k³¢PIA­p+JRDZ2I }é\OOOOOOOÏŠ°8:öÔ[îÛÊXüœláøû?÷ÏνèýïxûÛ_øÄ·¿û—_ü¢<,šØ÷«&ư÷~¿ùˆO<î /ùû_lÍ(§+þîÙ¿÷–ñ|ê£nµM¿ù/úƒ\ïÊ !Î bÌ•2Q“êsŸðüGí«·–Ûÿ¯õ½~Ùℇ¾èIçl›_\YÙ~ÔÒ $uu`píOË7¸vzºüOû­?ß¼ÛãžuáÛíïzÎ þµßÏzzn,½µ÷¦]½F1f"RÔ2jªˆ5#:ñ" !ÏN$‹çÀÑгC@FUrNU™È…P.°ãá,cæù•í_qøðÚþ»œ»Ç9K)‰¢«…ˆ8eqŽT§”ª&“†ƒå¶Iu]#ZŒ1‹Rša¸°(¦MÓrÎ.xfî°FdcÄò´%öPùjaÉ­¯+¢HĬ¹‹8œ3ë¬É±òuåW¯¼fDZÛƒ s®¼’‡ÃÁÌnÖeDœ_\Ê9£a] Ú.9GΨÞ3/ìÚ{ø[—O÷_½ó¸]·© M»w×.Ø×N05«ÓñÚf½¸ÈÎÅœ]ðŠ»)‚O)IÊŒXU(«+$vì¸J©ËbžƒSTLYÌ „€±MmÛ†@j¹ª+vj.DX˜»Ó/wüŽ£G_ËéŠn¬>Š$3`ôž=€ÅÜ D¢Ô— T„>yf®ë!ŒF#ç\•÷ÞLwdêˆK xVRS`Ç’²ªªJqª:Gfˆ@`˜A-‹wNU#H0Ž&Œ„†’U@s– = —*’˜sq²#h²8çÈKù¸ÙÌíH¨Åº˜5§ÈÌÞ{Äb+Ä#\ÎYͦMSU•Y •ËÖvi¦€{r€ì€°w)•g5´N”Œ$FÇlf’³zp@%4‹„áPcª0d‘F•玲iŒ™PÕ̱'022C%dzt3dFEùzÉ9;ÏГ# L³¾uD4Uçœf1T&B5Ô,ý1°§§§§§§§çGEX„™×íÜÝŽ;÷¾¿q»»]ðš Ÿúž¿ÿÏû>ñLW͘®5b×U¿¾ ìO=å1{Ô«þ|*Z¦Ÿ»+?{©œðØ_¾×Žv(ó_\€Ü •¸í¤c}÷õ¯ÃÑ÷<~Hÿ—É׿Úç÷žvëÓ·ñuÞLØqËã«7öWµgž2D„xÅÇ?·öÞrg…˜LÚo~êâ|òþsçïò( ÿ{?Ôïg==7rÿÂÞ±xÒt÷^L™ƒ¢š¨¡Š ˆdGD¹L4;GŽ‘ˆˆ-«wAÑ<ólöTgŠjV%5`­_Êjh¦ Xòà̘™‘LÍqHªJ N8f{·9>t¨«æxaÞVæ¶›èÁƒÝÂâhÞãh4BA]αÒÙ‡”ua~)k¢ÁÀ̦“Mv¢:¨‡9gdçˆÎסjÛÖDb—Ø;$¥á"–l=HÙDµvD¢ ;WŽ•!g´ãN8auõÚæxieÙ9öè`Û¶mí´3#TƦ™uô.U8tèÀÂÂ(6“–œ§:‡ÊƒOa¸c¨©CN·8í´õÉt´}¥í:7¦P-ŽÍT£sγ[^XŒ’EBuSÕi×:"_…2Ø ²÷¾ª\Jiõðˆ ‡ÃØ4Î9 «ÊkœGÐ,­æ¤€šˆ‚·ÛÜnßÒΣˆà[—ªê޼HËÇŒ1IÎ9HÖ~uu2¬ €çæSŽ–RBÂN%øP³C¦’<˜RBï3#rÑøÊr:çªÊ‹Z@¦ÙÌRVS5#¬ª œ÷žYsö† Îs ¡ª"”YDBSUDQ ˜4#""« ˜™ HíCð>ÆHŒ àˆµÄ\‹¥œ‹æXL‘eÚÀƒAŒ, 8W†÷UµØ €Ø%3 \ÎÙUUÙÈSV2"&)qMÓ9œõ¹0‘03…A€r³¨rŠÎ9DSÕœ"БFb‡ˆ(ªV:‘fOÈHˆ"“¨j×D±Ü¶m‘Mûc`OOOOOOOϰxCH×|ì>¥Ç°}®þÌ×Ç:Ü6"wÔé'…w~ð-ï¸å½O´C›;ïð“·\äëùÜ®Ÿ|üc>ô˜—vv±:ìÜ· Þúî7ÿÝü]OÛ=8påä†--û«÷>ú7ÞýÜgуï}ÖÑuwðʽ÷øé}ó“Oßü[¡¿× åw+½¸pÎc~qï¯üåo=gðÈûœŒÿÓÞtåž_}Î9‹ˆàŽYÀŸúÀÇ¿¾ç»N;ßô·o|çÂ=ÎØ3Øÿͱõ£F==7^Zì‹7íê4@À¬‚Á;6Hª $jŽ0ç\ îÅ«HÄT2íŠLÐÀŠ<“WDc×!#–\Ešý—™š Gp­”ƦÙäª m#à ÷µcX˜vvÆ-OAm«‘«Ô¦“ Œ;眙h™f1"2>¸Ÿ< FC@œ››SÕ%Æ\šsÛ¶eïs1Fï½1YR¤N”‘È•]+ï7µÑD³¨4Í ®Ëi`׿¸°²è™=µí”€5‰ˆ`ìBÍ$æ¬IliiéêýûàŽÓ±* ¨ª¦”Ú¶u¡:vÏUL69 ¦]j/)‡:QU)™1%Ï<1>t™Ø‡œU Edn4*â]p¾ì8V4ãf:ž, æÌA×uÞQ]‡’2齯롦,j1Æ÷uÖªL:¨iôì·-Íí_ ¹všŽ;n{UU_ùêÎ9¤´´4?)9Œ8h]€0«Žµ#.sôIÄ̈Ù3:bö˜,¨)HÑ¿iV,£(‚’sùfnstä² +šˆ”pU•RÌbBfDì—.첕:(â¶¡2²#3Ólˆ¨IfMåeZÙ#B™@K :²sPU•ˆm´T9gfNq¦Ç•TRU-æGºb Ê6_rK  IRçYDÌ™RŽ°è’€3M¶ê­½÷‰$¸Šͤ¼2”GAœ÷¦³Ú¢2-^">‘ÌDfµ7"’³t]bÚ{zzzzzzz~L…żzñ‡ÿúÝŸ?Ô™ÕÛO=ÿqO»ÿ‰".÷kO¸÷‹ÿì-/úÝn°ãœï»à–‹ß3àÐ}ÏÇ?ìŸý'm÷ÞïY?øŠ·üÕ ? ÀÏí¸Õî9¾?ç·zøK_²ô'úÏoþýwoH½tâ~§{,"7kaí†Èõ©ùŽ^ý‡ïxÅoî·£N=÷ÂW>á—n1 àw¿ðA|Á»_ý®»Üþ‰|þ“¼øÏßøìnÁÀÏï<}Ï<÷ÚHOÏÚ={añ&Å{Ÿºä‘ŒM@Š\b†`P/"䜚¡Y žu³*š‘‚€”¶ß"ÄäœÛiã4K†ŒLbâ½W%F,‘…ä<3‹)jÑeHÄ‚e $üßüÖÎ[rÚ¾ÎWž:‚lbõ\Ì/¢÷UÛD0íºÆÌ,[¸Khgò°N1MbdòÈ4 DÄ1zdPCÑÉtRUUiÀ0@U­êˆÌаA!çl†!ÔW_~ùòΣ°®É@4¯¯nÌ- 2Ø`aèâ´ASÑ Æ`±‹T5?"¢ÍÍÍ…Å9"š›_HñðÆáµÅí;Luqey`娅q3!ïÚòÒütÒN6Çayq¸°°vh£O·í\öŒÁW¦` ÀH©i ˆˆaóÐjÑ’DÄ{.:3C沂CÂÜÚd213KÁ‡Œœ%M옡ŒôbŽ‘´N]Þµ³2·cÜäãöS¹éÚZ÷5¤ù…ú¼Ûßêÿü£Ápqq>KÌ‚by’Ë93’‚)BE•IŽ èý¬íBm=l :Ö”³™Cï Œ™ ‘ÐÀЀ½w!0bŒ-Ú–.Í„ˆè´´"Æœ‹¡ÏÌ$›™¡™ê,Íë­ô5§(šsйlÏÄ3Mp«d\½÷9çÁ €œ3!rQ·™êºRUg€""Îy±, b® %{”-gšt­ä(€%€ÈEV0€˜™cG¶Ê´·šsÊà6¦LäT20ó¬É0K•cוaaJ?u칑¤‹_vîÏü¢¨ÀÞßüÏ=ÿ¬awñûàß~?ßç¥ýÊ_<¾ê7°žžžžž—ß­å̬\.gä¥*±ëº¦i¦ÓéæææÆÆÆÚÚÚêêêêêêž={îyÏ{þ뚊^Oo²©êVŸòµÿ.ÿYn™ýò&<2±[®H@9EÅÿòU®s›™šñÖyÒë¾ôuŸå;žÓ¬„•ÏO[K^ÎÆo¶[ÀEŸýÄïtWü>ëêZkíȺ¿ÎšßZ÷HLxÝ•yä³0-wèw¼žž„µõÕK/ûÚ)'íëåÅ›ˆç½êšM‹ák_,dd¨Y’&FòU çRJ@Däœcæ<ëzFÕ¢¹„ÌŒ½×œ›ÉÔ!%$"qTþg©‹ZU5¹ÙŒ)"úbwÄ*[çhP¥ÞqÜqÕÜh©r#ÀÔ¥P‡Ã¡™ºòÅÍA-µ]ù"¾6¡öíxÒ5Ñy?\œ—lUUu]WRüD¬lTYe2™ ‡CP#ÇÈÜ4müµÑ`cmݼêj`wìÉ':‡1Š4­@+){ï°m¦ @"j“ñüÒâ´‹ ¶¼m²åùùùv2lާ“ÉŽ={%·Î…͵õŹºhQ·ïÞCâ¿qÙ×òüÒâÆædÚFIi×±;|E†7™™ÙUƒZ²•Ö˜…ˆ@­xýbŒ£á˜Û˜ˆ-fD$Y;¼ž“ކu¨=úàT@ :UÕ$ÌWÌìAå[‡ÛO>¡ËSìòe—]ý•Ë®¾ãn[Wöñ|Á‡D¶mûÂþýãCk«„~ÚvD€†`ÅîjæóÄÊÌ †9çb¬cf™ÀÇ[3¼f&RŒ{„@äÐ@0kénvD’â·­‚Lˆ ³adD2€2òìœ+‚œ¨‚ˆˆ˜•$›u ¤(9g+æM˜Å2Ñ K:©mé¡Èdˆ¥‚ÙÌT D ʺTUÕ”‰(©m…£¦¬ªQòdÚ‚ ¸­®ª&&"Õ¨3û*½T3³7³²Ò ’ˆve 5U9‰áLV´ ¢¥ñrŽÎ9tþ¿ý°ï˜Û¸âŠ+àËù÷{à :ðþÍ;þfßÉûq÷îÝß÷Îïÿû¿ño,//////---,,ÌÏχÃÁ`PU•÷¾dŽÔëmmRL¾åä|}}½iš»Üå.ÿ _íçžqëÛÿÁeò½<Ÿ»ãc_xñmGÿ­ç{ã<üä»ÿաᄎ_-sÊy?÷¨§>ó‘?qt¸ñKh*ëüå~êoÖÄö>õ¢/¾ðìÅ/>笳ŸûÕ¤xÖ+þóã¿~RÕg™ôôôôôÜlxøsÞú³?s÷Í&‹šªŠšªµ1«ÚµoY™¯>ñ‰ý;=Ô‹‹‹óóó£Ñ¨®ë’ó½Œ/ÿýŽE$æë½ùÛ}Ê×þ{K÷»Þ}÷=ÿ«W¹Îmˆ„üýžðºÏòωøÝñŠßsynFÒòõ,4óuÿï¿î¿çÊdî÷çžž°{B¯(Þ”0³¨‰)¨!CGÛNDÚØ„$‚7(T\ÅE˜ "Ì“®Eƒà\ìʰ³4v:¨Í¬Æ@€©í‚Qœ´ì(¥¤`ä\JÑ™å&Fç\."B%lÅhm3.œ½ca¡FÈŠ­™ v)%µLˆ¥¶fÆÎeS p:Éa´4bæ,¦kë‡UuP¨òÆÆ@e²{qqQÅ|àVsŠ‹ÆœM ˆ²3Ó¥í+u ‡15픑۬  U£Á0Å.æDÊff Fhy¶Õ!3":G IŒ@˜Ñ!XŲ¡–fg"W³h³Òg#D&20Š9)!ÎRMºâû+O˜ÍЧ ˜ 9€!‘3ƒ"‚¹R­¥hek*ùÚÆ0ÜJ]43C@@‡D!˜YŠÁ  2#"’hBGàÌ0JvÎ)»âpT¥ IDATâ.i˜GôW@d`‡„ÆÌ„& ˆÈÁ£ªˆTµSUë2"ùÌ,'…’‘jÆŒª¼%,öÜ8Q­:êøãç‡Þ9GhŽÉ¹’ÝYo;þøt3˜FvŽDñ³-í½ÍýëUýÍ9/¾Dä o~Û>ã6·ý Ÿ¸p‡çìš§làÂÒÀõó9=====?>ôýžžžžžWrf& B`ff6B<9öÞk4•ܶqÚ¤6å.O&“µµõÕÍñFž4¥e"¥”cŒÓ&5mœ4©‹¥J%¥4žNÆÓI¶, ›“Éæd2mÛÒìcÌ98p`s}}<7MsÒ)»ï~Á9¸Û¾_¸óé›W]¸[;|x:Ö•·œ¦ãµÉêj·±Ñln´ãM ä´±±‘E1J!xï£à½ãÙhΙD5‹dSUmšf²9Fƒd–Ñ|]1³tQcfçPr;Þì&c7q}Ü­»ét´m¬—V¢J­’%–—öžrÒÜÊÒòÊŽ+¯Úß6J&“æàÁƒ±™ªÈúêÆÖ××½÷!F󌨪šTSoNÜ¿¾v¸išØåÅååÅ•m\…áh>TH)5Ó®ª*_CbòÁ×IrŒ9Æ(9›æñz3 TSÔÉá<Þ¿zÅ¥ó59ëHÆtvCßíÜ6<çìîzÁ™w¾Óé¿ðó·=yï.TeŒÇîØ~ öÞõ'N=çÌSŽÞ6ϤΑŠ!±C.†C&„ ¦¨Œæf–Bà™ 08OèL Øqp.xïÉ»"ù™¢ ¨8öÞ{$ˆˆ"¢Fˆì 9+H6É–“¦(1IÞš-²]å·fõ‰Ì9Á#3‰‘½DC´k4ш˜2Æ[Tx0*Ohà„0?ƒPWõhèª`LèØUeËw!"pŽFsƒ…ʹ¹¹áp¸07œ çG‹‹£Ñhp„þx#©öýÏ÷¼íQ'Ö×§¹ãúÖ÷<åô!éÁů\pÆ)'Ÿrò)gÜåW_ùуÉ@¯þëŸÛ]ïý`iï/üÃ!1è¾ô¼Ó§<ýÓ5è¾ðÂó™ Þoÿ‰—þﯼæÜº Þûó^wÑû~÷nwÌp°}ß½žókÒ/G$œµö˜][RLWèå»ë™Ço„ÑŽSνï3ßyÉT  ¹èÉ'Ö•/œüôôµºÛ­¶…à·=øërí~ÂtñËήëz°´sçâàÔg~f¢ñâ—]–ß{òSßÿÏ{ÀíO\ aåÔ{<ýï/ïúnÞžžžž^XìùÑ{zzn–ôG§›^WÌ9gG ªÞ{Üúg¥Ä€È•¶âÉÍ¢Y$IêrŽ)uISJIR"5k“eÑ”cÛuÓ¦6]Ót]—R:bŒ1Æ5ç¶mS׉ḦÀ3×!üûÿúø?¾÷ß,ã°ÖŸ¼ëm÷²›Ð$GËR…àˆ90 ¥¶‹M«)ƒäª®‰¨è%9çàˆÑº®I)©”ˆº61{³Y°28çRJ£Á °K]›sîš6ǘbÏ f&êRÓv“©Æ4ÞØ€,¤¡¼©ØvD¨Åü8Ž»f* ÀBèÚIŽ&m6ÆŒNÄv½KQ¿¶¾ZU~iinniÎÌRÛåSêÚ¶]\YÞØX;fÇQ)võÂhyûòêêjJéÊ+¾ÕN;T\=¼>šŸ¯ª*Æ|èÐ![YY^^^Î9瘺¦mÆ›~FKsƒ¹Áha´|ô¶;wîܹs0¬Ìl<¯¯¯ƒóÊ[j,b(•/Þ{"@r¾*^J)§&6Íd#·ÝÆêFù5ËlR”ALò®]Ûçù‘÷D·>c÷Ygì:q÷Î[ßrg…°8ô;¶×ûöíž…Üe3cf>’e‰H[±z%ϳÜî˜  8숨Äa;-led—?f·hñ ¢!Il,æ@7“AŽÜ¡„÷¡H†G }%¶‚SJ­ùìŸD¥`™‰¾¹ƒˆ†ß~È·—aK[Ì6«i>ò^JÌ ’ۚʦ#ÓÌè=—Öì‘)l£™™ŽÄ¡ó¾ò¾"¢cN F¥¥¥‘—˜Hf&ê§vnü™#ñ÷NÌFf‚µ<þÜ»>íÁo½èË_þò§ßò€Ͻ˞ò‘U1:úßñÙ¿½÷ÐŽ~ô?}î-?³1]þoÿj¼ä]igVö´÷¿÷ ·¾à>ùþ'qÒÿxçç?ô¼ÓM¿þ×Ï{ûÜC^ùwï{ýƒÃ¿<ï¡ÏúèúVÔºµ«'?X¿·åÉ5_xÏ žð‡ßPØó ç=æ´AyùŠ¿ú…Óïñ”¿øÐúϽí²ý=ÿ¤¯¼÷Å<ó>üµVýÞ¾ð¥ž*9çkÞ÷´ÇüÜáºóò·ÃÞ·ð'?éSW¿÷þs&9ç¬àvÿâëßõ‚;y•œó%oþ¿ö?ÿÔ§?èDYÿÚÿû’_úµ¿½2öÒbOOOOÏýIU˜Ùw„—÷ôôôüX|ú Ô9.Z"’#dï‚'";U5S ^UE”,FQéD§I‚ËEbRŽÙÔÌ4k”Ü¥hf6¿¸Ô¥Äˆ„<0šÓ™÷ÞÍ,„PDÀ˜óÜÜh°R}êËW°ÛŸÍ›ºªmýÐAûÿØ{ó ÙÒ³¼ó]¾ï;KfVfUݺKßÛ}{‘z‘Z»I–äH`ŒØgÂÃ2¡À3̘m0ë ›%² ‹12‚`•„‘³(Œ4,­nmô~×Zr9Ë÷}ïûΧî•Ô$…h¦…Î/nܨh.ý¤¨²H5ŸsÁÎ9D,JÏÌ ¸9:DÄY=!¢M³Ê]ÚèÚ9BĪª˜9å¾Y7ψ”ȼë6»²&2K¹KÉSÚl6“ù 2ÍX–bk ÁHsíø)·÷˜ÄHÓ HfE(½ôEw?øÐþÛÿü0ð@ ¢FlHf&f9gÈ99bPN db¢}Š&ÇFUTC"P¢õÚ\ÿ ¦‘‚y3ÕëZ ÓÍ6´/#‚"*\:0€¢(sÑïXZÂV3#Ïh‘•DC$ÑÙ¼åu²ùгÇ×àÈÈÈÈÈ(,Ž|ÒS•“{î}×SïzÚ642ò±aöX“Á`ú°›²Ä>üÎ]òW¡ªïyß½“Ét´.>ްót­uêÌrÕ…º½÷«Íz6›‘w¡(êÉì`µ!iÛåK—úÔù’7m_×õfµ\ìíaÛ6óùö{ï½o±{Â׳¸^“s'OŸjš.æÔ¶íb1Óà|Û¶MÛøÂÕu}þ–[–Ë¥÷…ooï¢J#RN'¡ª*æéöL½÷M»6ö 7mºö‘‡ÞÞÙ™L'eðCkpß÷ˆXEU•¤Ú ÁlZ'"reYp@µ”V=ß·-šZN}ê |N‰cÇHä3AMÄ*-ûœZÉ´é#““{30Q#’ 2²¼„}ߣ™‘‰e3“¡0<«‚IʈLÁ#¢jFD349Y4³cÛà1̬C‡2’¢I¶=—Krª×o^ÿŸ™Í@Õ˜i8)]7![¶ǎה`zm®ÙÌ>ôä8h…ˆH„ǦËásÍÁíh6¤  cfÐa <ø0ôJÛE™øX5È(ÌŒ0<$¢œ lCu¡™¹ADUÍ0(ˆ6Ö·<.èþÛóݲøŠçßX ¿À°¼åï=sò}¯ÿ?]~ëáîg~õóÝ×üÒ¯}à_<㎫¿ýKù«¾ïŸþê+¿óuo~øÕ·ßôàoþ:}ákϺýÕwóß{æ®'DÄéÙ›·áäáG<;wóÞ|v~'|”=Z|ùo¼÷§_ÈWÞ÷û?÷Ý_÷í¿ô«?ôå¿öó_ø£¿þóß𔚺÷¿ù¿ì«À™»ÏTíªŽlÿÍ¿|oóù{[×'¦/þÊçïz&<óE?ñ‹¯Àö­õ×ó§öî~Ò¶'Â3wB¼ {ôÁ¥Øö(,ŽŒŒŒŒŒÂâÈ'?O¾íö÷¾ÿ¾·þ—ßÅÈÈíÝs7Ü4‡Ç##b2¼ZÁ;‘,ŽxÐgLÕ›(!39r8›ä>–uU÷Q *±˜qUšã`fíá!ˆ”ˆ\V9GU GÅdRzY¶kQBE´’®ëœsÒGr ŠJžV˸³Wij2—hÄ@ä)J”œ}éC1gM)™Šä”«²šL&qÓ QQÔ Éâ::çZh]ùœ’ %Q“œ=±ˆÔuÝ4µU•›Lòá²ëúzV¥£D1yz“P×g‹ƒK—;sÄ[µ¤\PyptP•!PÙ§¼{êÔÑþAUΰ. Ý ¤®Í¡ÐÕá2”1ÐØ¥¾ï#o8‘›ÎþÑG•õ¥ýýÔ'ÌÐ,W{ó¹.œ¿éܺmöΞÑ,¾Ò÷ýÑzyêô©½S'º&:ç‹EÊ®‘JÊpîIçÕ¬Û4@ Ìœº–ÛØ9t1KûlZUE½5 E±Z­ôHÁ9ç‚¢JZ5j3çýdwWDzBï}Rµªò9çœ E²¡ò)v(jì{í¼!p”‘sæ”™)³å¼]¹ý¦U P#ÂlŠQ;ĬÑtPñއÓ0@mÁ1;'‰ˆ='UIŠˆ’rV‡ ™’%S%¢¤*h9f"Òœ™Ù lˆAD‡^XÌiˆ§dfDŒ9™hplf€„ C=Ëà4T@30Lš¯ÕË€™™ä$Ê„lèÆ1̦ƄƄÇáD4Ø+œª¡ó„Ž’$&D@C06U‘lˆ¨¦`³2:e‡ lŒ`@Ç»‡¨f ªH‚ˆãç©éò{.ÌNm}ÐÓÇ[§¶@/¼÷j¶“iïE_ù\úºÿû·üÖíÿúú£—~ïK^1¹ó;¿ë?¾õâ«^ú¦_ÉŸ÷c7…Óì¦{S7hÀXÔDtЫýͯzÃþüuƒÙÇ3—‹žúyÿôµ?}Ïï~îÏ\’~ùÕÿø?¼ì-ßx[ºtï¥á¿÷|ϳ¶¾ì8nôê»ß¿’n}Pž<¿®v?^E°˜Uƒˆ~mO)~ddddddGþ¼œ¿ãÉOÃÈÈ„qTïq…ÏÔ£Øöý ç=sVÅ!ðnðp™YVAõlf0)‚bV²CDG˜cc3)ËRU“óN‰ rLªê‘¼#r ÄÎ9f1`¯ÈÄV–~R€û£w¾ÿ=³âåŸõlöb˜d6›@Ó4E(ÍlH “ªíc—¥t~vúd#¬›.¥T”… ¡dVÕÍòˆ™E3vëM¡mZ_¸bZkû‡¿³bRÕÓ©š•§ªõÁõÒ¥ù|.m[”eê#™±p¿nk_Q׿zgQô›æì¹s}ŠºjR·œÌöR¨‹õæýï~÷bwï®§>í¾ûÞ{æÔ).ý^=gÂîî{ï½ïÏyF³\6›u}jžT&³é…‡Ï糓óMj‹ººréJ³nˆh:¯‘q½\?ÐEf_–‰Á{j1vu]ïîn7]ÛçÞ9g,纞Š9×ÅT–“®ÙdÉ!¸:”}—MCDU]€Ñòè ª*"rÁ'A_†”!‘/‹bRSÎ1F"3v‰úNÑ£a¯ÊD޽š‘¡&É bH†Eœ³Øµ†Ð玙Ï:±ù‹6&sBŸÙ YÚ."bJ 1ç Ä ˜²¨ù<­k@Ì©WUST@ƒ¤yŒì%33$’HM¤CŽ$±²)‚ q`d%UT#Âab¹ï{U»&üaV¥A–ËCë ™ª]KQT3U13P•¬9%D4ѬbD„`F(jÀD0{D4UBE€åœÑ0åŒfì}Á¢Hd ÃÓ1SSÁ¨if"†nx‹q–l*DôAŸ¹©" ŽºÎã…?ñ¤=„û.®äº]UV—V€·Þ¶38ùôK¿ò™ðê×½ù§ëâ ¾ýöÅmþÜú?ü oyWþOëÿæ‡o)ãü+ó‰ÝÇæƒÈ³Û?ý&üÙË`&÷üþýÝ7Üöž|ð0¸ã{Þñ_ÿù]ÒIƒì¡¿þ+ÃÿþÝ4F,ŽŒŒŒŒŒÂâÈßíb´ùÔ$‰96³(¢ÄˆÌ@8ô±d°:¦:LI›‚©@VÉ9#³‚aç”$#"K63$ò!€çµ3Q%ƒA™òŽ‹¢ˆ1V¥8vÁqUøªò·Þ|¦.½'-¶bŠ8ŒWç”[k YÌØ{çÜ0¾Ú¶íáÁ¡‰Lww•8nz DäNœ˜©j×u}ß÷©sÌÒÇ(R„YŸ‘7«Æyºzpä«Úûb¾X¨ˆBÓ4ªªYAbžVÓ¶í½÷#˜yÐxÿʃ|àìÙ³¢LH õȰïûœ´íd2=±wÄ®ìîìœ4åœ3:l÷÷Ëéì†ó玽キ<ý®ƒG.óÕöÊt¾­•Ÿ»iY„”Óz½¥®ï7M7™L½]×­×ëzzFD@Á{N)••‹}ßµ­Á;N)Î 0kV™©Úp´Í°*'*)G)ŠÂ9×Å^DÄòööö±oްpEŒŒT@EŒÛèÉß öu]ï˜ñæpéœ+g¥©¡ ‡L“!ª)"":E$›ª(€YUF‘s2¥lHâÜqYª2RÎyÐÅbŸ®Ç:fvj×ĉÁÒ¸Y®‡ãª.½÷색™©#µ”ÅDDsΊ`ˆàˆ¯mÁaÓ4ÌcZY†šB¦¡Éìx¦€hØÛã1lÄ{ŠrJ9g$cfç=¡‡¦ 9‚2˜7´!Æt0K^{‹’ "¨ªs!¥„ÄH×ÊjŽÔRJì08g†Ã¼ópÜ€ˆrÎ @"f’†Ú™ñâçñƒvŸó9OÆ·½ãJ/¾‹ú~ïOÖv÷ç>}q,ºsŸýewÃÿüþðÃsð®ËÛ_ñò¿ÿ'þͦýÄ“ªù‡£í•+²}rú±ÛOÛûÿø‘ã÷ÍÏ:["„›_üiÓ}ðìâ=3?Í1Ä÷üäWÝ~ÉÏþÔ+oôãtddddddGFFFFF>&¢¢J˜sFƒÂû£!8çX”Wm¶<èMÃÀ'0sp>õ1÷±3!"òeB@‡ÈÔ¥<ÈCžƒvØ)cÊQºØôsn6ß"¢¾ïrη;óÌ»n½éô"§£¤²˜Í•¨‡ s˘3ºrRjBî51;Ì»¾éÚº®÷ΞV$“o$ºl†y³Ldª ð§¤ªëM_UuŸÚj¶¥ªçvN6Mcû”`Œ‘ç>’˜#2Çš’+« {·¿éŒŠ*œ9{æ–ÛnY¯×ªZùcÚ´›Š­ÝPOØIÍ&vkôa÷ÜùÅÞ¹®ëpÝEçýÖÖboo¦µõ©;ZÎOzðÞ\Љ/gE¹5ïû˜ÚöâáaYM7ËöèhéCm ÎùÅb¾5Ÿ,W«Íf5ŸÏU’Hí¸, Óàb(ŠÅ99g`—Û´tÈFfx°¼\–åb±pÁƒHß'flšæz¼ :c Þ[ŸTDª±3³²žhjŽ뢪'“N:&Ÿ³šŠ"bí«ãD?ØuÉBA€b ]ÎY-'BÍYbNà!bÎ={c43WxU-ŠÔ˜ÙLU¥ËÞ9Ì’a(z&Tƒ¶I´´FrÌ A á¡dDªÚ§,"¨6¼àsΦ EáSopŒˆ`8tfSf&bT€¡ßÙ ­¶ë:UI¬k[ð ˆYœÁ1€OšÀÄŽ+d™E$g#"cÌH9¹ãD[Dd"0ˢ׋b<"ØÐ+ňP³t}4œ³™iRf–‰Èûqúq£xê«ÿõ«þÃçÿ«ÿõç¾èç_ugÕ½ûg¾ýGï»éßô?Ü^\³úóŸ÷¥·ÛwýÒ»¿ì7ž6%„ò®/ù¼SÿúßþÒC_û–»êUWìþô»?íy?xðU¿ù®Ÿzéâ£MC[\^øÀ½þû¿þß]P€³_ó¯¼%â‰ÏûÁxѯÿ“·¶ÿéûÉozæ·~Æöú?ùšïzëÖÿþÃ'Ý(?ŒŒŒŒŒ|TÆ.à‘‘‘‘‘OQbÎ9gÍj"²ÚlúU5ƘÛ^SŽ1§.¥”†Ú DT€¬šU’ä.EŒ9µ]N±Oý¦oƒTÑi–¾kŒ @ˆÀ3{gÇÊ –e¹½½ýÈ£û¯Ãoýâë~­Y«´²õBŠ- j×oV‡YRQœª¡ ż)%DÜ;±7™Lº“H×uM»¾ÖÏkeY†DYš."¹¢ž”u`ìݺÙd•ƒƒƒ¦is›ÍD7«ußnú®é»¦Ûl$¥f½Yî_¹re{w§ª& ¶é»Õ¦;8Z£s¾,—ËeYWe]š¨ÆDŽ7ë*”õ$ö¹iÚårí|ÕÇ\uQW¾)+¢ÂaÛÝÿæ§Om€³K¢`ä±Ë"GGKçBY…[o½uü®î2ûªªÕ{!lmmQÛ¶ªŠ±ï%çØv«Õ cN1FPU_úÙb†ž€´¬*D캮m0³¾ïÑ@RÖ,±ëÍ €D¤,CVY.7‡+IùzÛ² 8WLb@×÷)ç<øûÔ ‹ô]j›¾kLrj;‰É²Ä,}Ì@ÌŠjR…Šªð!Ç#bY׆Ê2”%M§ÓÂûª*˲¨ªÊAqðX7QÄ;f6 œµÏ©K±K1ç¡ëâXþ»fBUQ1±!€²K1©äœµPD®ëwH€t¼˜“ˆ¤˜SJ}Sʹƒ—PD’ä”RÊšRŠ1JL :ü3“¤%§>^ߥaÏ‘Èy*C÷‹äœS1Í93ºc³âñqfÓàK"Ò”ÍðšÄi×7 FÃO-çc³!Õqäcó¯yÖùÏøï½÷{^pþî¯ÿ#^´óÙ?þ¶7ýóúg¾ô·ßþä§éÿ5û¶ÿüû?òâÑéÂm_ðÅ·Àä%_ñì-B¨ïþ²ÏÞÁíÏþ²§M®I„G¿õÕw=ýÿ ë}ó³žöµ¿}åÿî žòY?ú ìÿÜ+îzÑ÷þñFivÓ-{‹ó7mÿeWáúw_uzúäo~Ç0|ø Ÿ³WMwo¼ûs^ýsoßú¼Wü“ó¦ßÿ·_rã™nûº_ý³7|÷+ŸÓû¾ïÅ7líÝøÜoxËÝ?òæŸùÊóE~Ï<ëÄËþãÜÿƸZmœóÍrIDó­ùáÑ!pûÜǘ™½s®WðÄôÀà Ñù[o u(8öíÆ;ªoc¿{úäfµ>Ú?¨gÓÉlÚ¬:2¸zõÂdVåÈÙ`2™)H¨ÜÎÎ61Ç>ö}b¦í­Åý﹉®úªÆ8OeU1sÎYÔ Á3¡UÞ¥¬Îùlº\.¹¾p޹¨B»i$&Ç|xp0Tý&‰ˆØ÷ýáÑaUU)¥+««‹Ù´]÷nVf¦¤9+š¤sçÎÑêê~Ü—Ó§Nû"°§ÜµY®^)¼ßYlg´ýýýPNªÉ¤{´ã†êzA¦ÆÐvñäÙ½$™Ðº®Û,WeY¿ïò{¸ô¾ªî~ò­fÖ.ÓÑ:5ÝÕxµ^,Êí-›|åÊ•§>í)1Ƈþâœs\5Õ¤€œ#˜l-æ›Æ{7)2…ºŠ9WÓ©˜2)šiYLëÓ‡Õj“R¢Ø -|Fpe“tí&v= cYMÖëõl¾c !¨ª‰eç\JIE4K½5ñì»Øg“P4ìº4£ˆ¤ÌÎ+XΊh1KQMT³s˜“¢fíR‡!ðˆÀ9g"7ˆ¿!„œó ÎpªªÇ“Ù`³#@dAïªeËxM.ñÞ+*ÊŽ˜³½?öu ¹“ˆ$’[â`÷E€¢(DD³ˆHá<8Ï•sf–RÊ9 ˜™( öÀA®>¢P0uÎ ‡€ˆs4ãÁ˜9¬‰vò8Ü‚‰mÈq4Ed8n•Q`$:¾/1›ƒ°˜ ÞSƒk.NS¦Ž­ŽFCgõxü„ùkËS˜?ž;#¹Çl ™Ý‡ß~ì õã#;÷q>þ8žáGZþ±,q£Qvddddäø©NJñ÷þà-‡‡6¶ÓŒ<Á¸éÆ›ŸýÌOâ#f©¨cbG D$F(¼G \HÍDŒØ;f6µa Ó»@žsªJÇó¤ b–’82ç£tÒ]×n Ä;$ýƒÍßôöM³:?ã[o˜Þt†–ÔõŒË*¬.?"}wôЈPŸ¿kww·k;F”¾À9çÙl¦ª)¥Øõì¨ðUŽÉX,«xï]Ÿs]OO•¤ŒÄ«ƒ«9FUâ>ÆI=©/ª’œËÞ±÷@D¸sæ4L«ª_®¥m¯ì àbo7Lk$šWtmŒ1I^lO³CÝt;°´á2óå¤(ÊPøM»ºã®§æ,½à‹0Ùª'¶»õºÝ4˜ôòþÕÝ“{æ`qò âå+W\rìy~Ó¹*¥¥rny°:X­n½õÖ÷üù}óùüÄÞ©åjÕg zZO‹¸ªKPd‡‡ûûf¦`¦‚›®*Ënÿ€È=øà%iáÑG¾ðÀ¼æ4ŸÔak{qbïÄÙ½÷àŠP1.«´\.£Bß÷³É4Ç¡íÄBpj2Øèœ÷Á{I¹[®»®+ëº`V# ¦Ðµg—ÕUUeG«• bò…DUl Ê’}ÓwIŽ b ú>™{23$TËž‘¼ïrDQѤƒ¨mªDä˜E„ Î+{r9çÈ `9›HBÓ*QrŒ}JD4Æá¹'ªÓâÞ{6@DËb"0x‰ÈôØÉhH0 ã#bDlƒ QDªP(BQ˜s¤×²sÃàyY–D:ˆ¡DNŽ‹’L$›™c¯ª¨&Hˆê‰T͈ʡÁÆÌQ ŒÍM@Õ@Í̲‘3ÞÌŒU™Ó ͧÀ‘‘‘‘‘‘‘‘OœQXüTç÷ßö»³Ùü…ŸùÒñPŒŒ|\Š|$¿‹}¸lõ‘—ŒüÞþî;ÿüOî~Ê3Æ?€'’©ˆ""ánˆÌÌÌC¨"9ƨ¤¦Y{íÈq’\ÅV=K)ÞÁ`ÅRUÕ~Óʱ1JTM»¾mRJÑD̘™¨<\®³åz:Yœ8qáhýð»ü;?ð5_ø‚¶_¹Éôèè¨,ƒs“òô™Ùlâë­ÁðÅŽ@¬kº!±ÎÌêº.Š¢­ôm(¦L¼3çEÌDШi3“.īӲ¬Ž×~S•~½®ª*„P–eÎyp¢IÓÖÛó.öóÓ'UeûÌé£õªÑf$BïcוuÍ ˆ”>tMûð…GÏœ<¹1ôÕÄÁa6›l6í3‰-—«§OÕó‘AßwÁ¹(®ûlVmÍ'¡”.*à…K—bÌÏ|ö³Þ÷Þ÷N¶&M߸ª°[o¹±m[µœzÑ,’ú~2™2Q¦G7ms¸cá&­Ê™;Ç­Ž9¥H„“I‡dF)°””¼÷Û‹ÅþÕ×)%_B¼¨D<¼E$ö‰¦”ŠªBD ’¬ì°ïRìzO…„Peœ£sޙŔMT˜ˆD¤=‘Ë*ˆ "1%fVÕ£a(56Q1S@4#SÀA­ ! Ú šÙp¶aD着ðL1F#(ŠàˆŽÓo1ϹA.UˆðZ‚!‚€ÀqÃ2\’ç2"‚@éà V–“z°[^ËETDÌùø ¢ŒˆÎ¡ª^ëµV>¶¢C2BUé%² 0£cF<žé¾¶ÍÁ2lÀDfÆrýdKdלž!×ßõ9gÇ!¥Ä8~ž:2222222ò7À(,~ª³Z-_ð/#ÌGFž€<óéÏyç»þx<EQ4]—Sv€9¦b2DÈä² âd“lºjZFšÏçš%¥äØ3Ñ)kÎ  dIS³A=É9çéP÷áÇcêò¹“çnºé&€Î9Ü;r±pwÜ~ór¹ Ý–ãT JÛK¶ÙüLÌš7D&ä>e»>g:øÂÑ9UªÒ1ù¾kœ 9§Pøaˆ 5~R[Œ>”C“LVe"O´½½Ý4ÍÐŒ‘ú^³v›æêÅ«EQ´ëv¹YÞpãÍÙ”™RJPX )­âÑÁaÜž3sìWÒKŒ‰]p«å²ëû;n¿KL/^|´Œygï¤jnÖ›œÒ¦Ù”eùÌ—|æþÁþ¤ª¯8ðऒ2pF•3=¼ryçÄnNÈŒMÓ—e UU™{'"›ÕÚ9gd“ù2å#3I"DD,ERí7kç Pü˜–uèʸ|ùr!”Ep>y¿<\.¶æªv̧ïxÒ^Êïü³{NìíN¦SIÔ&Uí&Ê0«'Mê© y±½>Z"8`T#ÛÞÞ>jÖ¡(Μ;{på Û4À€ˆ!„j>;}ê†+W®‚ä WF¤ ˆRP ¶OŸì¤¯§ï‹óçÏǘ×ëåb±xà/þâÔ©½¼ÿĉ0©ê‹^D´ù¸‘€0¸bê‰sôéŸqñÒ¥¶o|Œm>© s޽ó¥Ÿ"öMß·˜UUS*'U$òÞ·}STeŒ]JI5#™Ï9ŽÅÄ[7m^vË£ØôŽ=õÝ„‹„Õ¤@PFTUñÞ«šÄ¬)ç³¢s$I›¦3 I9jrDT UcVUíûι¡°\à¡é›mP‡³„¨¢ªæH‰Ñ@‘g‚ ;Myp5:çÐÀ…RSfŽ1ªªêõNg Î XÎÙÏÌhÀDj6X'Ír=ØQD²äëîÝaFˆCKP ÕrNDl&1¦jð{ ’ŸHR=~:9gðÞ‹ªcºjD÷" c"SUPBÚlòµóçqŠ¢¨ &Öã–B3£ñÊç`µZadddddä Èß¾ª£°8‚ˆ£°82òÄ„è±Áõ#³X霙eQ쓱K)uÒ!BQsÉÞWäBá‹pœ‡äbІsVÀ˜ ½g_”!"Œ9©j ˆ&ŠH¨úŽ?}×sŸuÇm'}óÐ=d ât²Xˆ™#G‰Ú¶ãª0ª&fvz{Ç$«INÙ;SêúVD qìsnRšô¶GåÎ"I¾¬|¡)›Dç«ûª*RJ«££>åób±Q"&À˜b¡ªª¾ï‹“߬ÖYåλžÜv1¥ÄËš/^¹²˜OÑ»rVêf“5eçg§Oǘƒ/ú÷¯^dWx€ª.º6îÝpúêÕË?jm'“:iÛ´èº"”]”@Ø ¬šõ-·<éá‡Þ9±m ®pëåz½nvvvööŸöÜç]xè‘ùdwÿÊể“\ô;“íÝ;&ÞlÚÓ7œëº.u}L]¶.ÌŠ;ÏÜùd»«Ûtí¦]-û(Ž€½ÓÔ«÷¾Úª}–‡GÚ÷„¶nâ´ž‰šf(Ë2išN§pxpU5öJˆ®ðΫ1oŸ:ùÀþÅØve1år³-rn²5#fKQrŒ¹3S€I<2O'M»ê“š¢±)1“=O>xAÕʪ0ö¢†Ž]Αƒ÷lmdŽªà™Sö^̆QhÔÌŒˆ€ˆdd ­…¢iç̱²kEÍ­ÌÀ #ü&)2²÷Åõêác'¬™s.÷˲„!~‘Ù{¯*j9gd"ÇȤ`È„UU2$Ó¤FD<Ìq£ 9fæBPUP›”3B𔆭!3[/9çLˆÞ90óÇÃÚê#(¢Ë)!bÊÇ…,IÕÐ ‰3äCò¡8•Hr&"5Ë1@Ι™³¤ñøÉõGËÈÈÈÈÈÈÈôÂ`<ŸòÊ9çFaqdä‰ùö‹+1Kû¦i ¹YÙrC.Ûb6'®JU-ª’™c×眓Wß÷9Ç^”'UÅ̘yÐ_`ZO‡S+"朘Ã}÷_}ûÿûèÜó ž1=±K>-¸ô¡,sáƒfSU,†H8Š‚h†EexUø"ø¢èSšL&9&ç\Û¶Ì\ÌjïŠ"ÐÐ1Ò¦„ŽcÛ#¾ªêb2Äa 5g Á1sŠM׬&¾hÛUì6€~2™¤(¨±_7ÅnQ×µ÷Þ !šw¼\õí¦YÌÁûÒ„r¢œ3ª 3.væu9Ùl6ͺuÎ\ÝŸ„Ò9RÜ3î_Þ¯ÐwìÝûî}ÿù'Ýly>=<\Þpà «æ0_ùÉîÙÝ·¿ýí —/^…ø§u]ïžÚ™ÛÜ9·³šý£«>ZU““{§¯^<ºðÈCÁ—®¡¬‰Õ²\¹p…}pe&åNª"˜)ÆE!pp¼Xì0àry²¦®EQ dkc£šëº&´ÜwÉ–›ûzøÔÙ&‹-A<ÿôg¡€ªY¶ìÁZŸz"Br ÍúœÚ½/=››ÍÊœ3—)ìI{éÒáÖÎÖáÁ2¥DÎ Á—ÐÅx\î¬B^Kv "1fB$TcóÞ¥(C¡9îrÆØ ï‡XDS4:ž©E@ëÛÖ˜HC(ßõìÑ|Cx¥=ÆèœË93"" ™™è`M0 4°Œ¤`ÀäŒØ! :£)t]‡Ž»ÍAsJDÔǘrvî¸&[EÛ6M&œRB¢”Ò°ÿ*Y¤¡ëºaÞÙ{VU2@Ç¢ÃSÖ(¢ª1v"@f2L…ŒŒŒŒŒŒŒŒ|‚ŒÂâ¨\Œ²ÅÈÈÄñúx’RJ)A6‰)3:3K¹¾,Š!{ju]û"䜋¢èb&Ç’4çcD癘ŒÐ`Ð;†çÜ æœEt2„D&«¼<ìÞ²3«&[5 BŽ]³vŽ|(À ŽŽ¼?î•QU³ž±%«wœïšVSV熦ÝÉlæÐEÉ›õr)BDuQζ¶bNJÌ„(œr$"ï}¨ª]ש˜ÃâêåÃØg Öƒ£}š/vNž=Óu]ׯ .œØÛIÌÌæóEÓl&Ó©™Å؇Â9çU!% ¡lÛ¶,Ké›v³^óÖ4„2æTU•ÄØ­7«ê{î¹÷¶Ûo÷!ômêº.|¸<*Š Ùî¹ç=M³Þ¬×[‹wÞñÔMnÄÌùÐìί%×u]Ì&÷_xp²=›!Inš¦®ë¢¬sLE¥1%@D‡Ô÷Mªš™/\¸ôðúáÝ!„ùb«ëº²,ƒçódZu]½"b×lB)vÀL°ªªÝS'÷/]\-g³YµwŒêiEÎ0Ƶ'TD%,ë*¥$fˆ „€ Œf™=¡‰iÞ]lÅìÊŸ?ÀÌ9ç©s‚zÜ« 0 â#1&1‰DÀ§(Þ{¹ž8|^¨ª jÀ˜TPÌÌ)!! ‘ç£8æ¾ï¬…CPDJï=’£ê°wƒ0 š‡ö•ã„DUsއ¯sÎö©™‚ªÚ°{dp]s&È’s6῎ãñúÃ×CdéCûA6=>O"˜¡þÅáñ=ÁŽ×sŽCSMÎ1ç!nÒ`”GFFFFFFF>1>ù…E9ø£_~ûoxù—ú®Ã¿ú[rù­ÿþµxÃW¿æóo,ÆkÈU.p”-FFž¸Œ)`+Íj™r\·ëœ•]pÌyŸ$J§UœùÂé ­×kL] PM&óù:I’2‘&‘$ÙbŒ¥öMÓ0P×·h&ÕÙÅü¿ûâÏ-)§î¨ï7Íþ4EQ…e³Ž±?yÃÍ1 µ›u¼cì²Â6'"Y±( Ø,W›Õz:™@p"²˜îaûæèŠwn6­³©wA“–Ó‰“L)¥,ÑR\70ÐÒ—D”úÞDA… bÊݪ‡* SYº¦Yš@ìÛ“{»GGG9gÇ1*ËÖÖVŸº¢(†ˆ¿ÔG34…¶2]¶Mι,ËPÖ—.\îñäé3›¦MË*Ôa^·W›§Ýõ”G.]žÕåýƒ­­­‹—/EqòäIfÚ;µèbã|kgs[bÑvmß§ùÖîáþ2IöU=[ÌgÛÓz^™+x?]µŠˆ‚¹Y]0§6iL*äbŸ›õe"šmU[óÙÖ|GUŽŽú¾ŸT¥÷EJ©ïÛª*ÛMcÉ9gv8 O9Äy>=¹³E’²ÅÌÁ¯Û·À"˜LÕ9€UÛzª²p„ Ö÷=2²©®Ö]ŸâCWÚõ¦;Ø?bfIi¹^‡²ð˜yhG²¢(8‹ª:ÇbC¡²jJi(;Fľm‹¢p…Ë9«B¡ë:眘‘j])%÷ÿ±÷ÞQ³¤WyïÞoªÔáËßÉçLiF!4( t±‹ £@RBc[$ŒI/0¾F†KQŒd„Xˆdƒ@#‚²fFÒä™3'‡/ôסªÞ¸÷ý£Îˆy$–Œ<ˆúýqÖùúí®~»º»ú­§ž½ŸR¡à.è†#QWqÜÅQŒE–q©)!£Ñ?È+ J)]JafÖ{ß¹)™)Q]7ˆ`ºkćŸ/… …º÷ë¾xõÓ_ÌÇhúÉ÷ýå­ÏúZb†þDýá²Eï‡êéyÜòU§ç1"„0_L ¡(J¡•N)1%É`¤’L1ùÀÌéRädZDz,SFsL„]J’ ("*!BŠ)EN”RRJ""3Ýpíy¡ï»÷̉{Oþ™üÐ-O»2í Ð!Ñt2Qs!«¬*)/Íd25ÆdYÖ,jbî>J©Åb¡•J)–ÆBb0îͦJ©¼,—–—B‰!·óÖÁ'”É;fBŒGƒ”’o-§8Ÿ[kD”R q0z Õ` $&`g›Âˆè[ ”ÖÊ%:#[kítoΔèŒlº,1zÛxëcž—Œ µÚwàÀl6÷>M'{KË)ÖQnoíÊjwkw4…ÖV7öïßáÂb FƒáŠÐz:B‚œäó¶™Ï§Ë+ËÊèj8`NÑY!‰,LÚÈ<+™@Ô¶ !i­Á¼žæy–繃c¤!8©”x4Íçóù|î¬][[pRʼ,¤Ô[[:•Jk…ˆ­ÉäÚ‡HDyžƒŒçFHÍ‹|e1€ÎUÅÌÑÙ&‰9ëêÆæyá<Ú(„Ô­Ÿ.u]Ec2dB1CWñÜ¥¯tÖÙ#'~ÈÎÌìœ5ÆHu]ç)WJ¤D]J÷o&…@#"HIÌ ¥”|`fvÖvþZ"B­e×HT)BBd…!"ˆÐ }BÁœR’ˆBtÎu÷ïdÇ®ô™ïöéÐÎ|ç·ü¤ÿêÿÑo|âð!!³ùÈ÷¿ü‡¶¾ù-?õâýú èL¿—-zzúoè?Zdi„Ï$€Ñ¹ÔJKÈ îbq¹µ ­sŽQ(ç™W*Ó:Zk­-Š"xç53-CÛh­µÖ—r¥9I€¨È´”xû­OÑ÷ÿýвdUï¨L5Î#`ˆ>µ¡MÍ©ÌPˆuí‰)Æ”—3£RÁ†½) %F>„¼Ê­³ó‹1f±7ß·Z,BSÅÂ:©T5^€f^+¾žR L)¥ —,•È´Zö”ÅHY^¡Ìöš™fãÑr=mç¦ÞZç#24ÝÚÞYÝ·1^]q{vwww0¬¬¬E)µBÚ: ëbð.Œs†º®íÌe¹)–ãµüäéSÇŽ²Ö*£C ùljLyç'îÊËróÀþóÎVÇs?_Y_–vwf!F"ZZYåÄóÙŽ‚ÄBÎl=a6Ýàª!¢O®uÁùàÑZ…OQ)£ò¢n¬r¼ºB”bŒ‰IgYäƒ,!éã'‹*ÏÊl´4¾pöL ±ªª¢*#Ç ^ƒõ IDATÕõ5j5""jU)&r­5Æhm(&œZ§¬UB%PÆäÞ[Ž P¶ÎQŒÑm;#ó²ŽXjДy;ñ‘C˻㸋JQ¬sRJyž$¥T DÄ)R@%d"`¡Œ€Z °ÞCS· ¸(òÎÁ眗Rª²`à<7ˆ@˜|)“`$"#3+%…RkfÎJ­PQ #I”‘9 ©S¥l[Û4 yïUYåynBRJ` ‰:»¢˜i##*£•ÌcJ‘’”Ê:+µRR&ˆˆ(&  ƒ%F ©˜Rj­E!:•™…J)13I!ÄÄÔY úÐ4MJ‰™°ëê‚!Ê`ÓÓÓÓÓÓÓÓÓó_XLós»>íýñÏþÎ×üì7\•]:‡¦÷ýÜoqm»&f@}àEßýc_B|žN±™Åûßñ½ÿiãg¾ï…ÕN3QJô…v}»w,öô<žUÅ^X|L)óGœRÌœ˜:/[´ŽQúfÑi%Rʲ,ub”Eg$3Æ ”)¥è-Q$"O‘™Ë"“(…@ ÁRg¹€\(ËÁîÎ…{O†ÊEÿ5èéypJ(%sÜÛZ„òª Î{ªÁy‘å1ë}µ:§!A “‹³¨µf„ºVG®µm ›Y™]^¬ìÛÐ&ß»¸›œ;|ÅÕ>Æ6ÄÆ;E1jÌG£”Rl£‘bòÞ#á…SçWÖW4B"jƒ—Á–— (Jff¦¢(cŒçÏ]tÎ %"ˆr'wêµ}ëº0Ãù³ç:|êì¹²,§õü©O¹ywwg6ß“ hšæÚ'ܕŇÞÿ჌ªñloo1ŸWUuÿ½w»ühŒQJŒÑ_¼8ÑZ c&‘eQD©=±1ÆèÜ;Òçlãò¢Ò¥q³Ú˜üìƒg‹¢È2,Ë2ËõæÁ5)õ‡þêýÉÞU1¸¼È³,;þâöööx<$⣵¶ª†Á'©P…((Y¿Èó\eF ˆ@޺䒵Ö(B0Š£‰A03' HM3“RåyB «áxX\yÅæÂ†Öóé Óó§ÎuF?D(“1‘½‰R®M䉅D Rfeˆ2¨®î¾ûTK)…,3CbfD‰(cLš™˜Y)‘eYpž9u’¢QÊY{©þš¹( †ÄÉ[ו|tM3cŒ!Df6Æ‘D6JJ„Ì­uÛ¶‘¥`Ï( Ñff`ô>t—Lbˆ¼g)º@g-dDïœsÎ…è™9Äh²€Œ1 E7U'™ hÛ–€±{ù—º:ú€ˆmÛø`S !„R(•Bgyw·®‚»?öôôôôôôô|A‹[5}é·_þ®ÿÕ?8þôo¸2CÞùË_þŸÓ'¿òÛŠ·þô¤¹t=™»fìÀíÇéM?ð{ôô¯í+®0;w¼ç×ï†òÒ>óÐ#p÷¾í{¾ûwÊ¿æ»_·¹øÐÛæÍ? ¾åõ7 !-Šƒÿô¾mýMÿñGÞ|Õý7ÏZ{äž’KOxÁ«¾ó«–ªtñ£ïü©·ÿØO_ù ß÷ô%™ê>ö‰‹_öÆ7\“í~ü?÷Οºmß—½üåo|iµûþ_ÿÙ_ø+×½åõ×ä}7{ï} ÏçÐ;{zϪb/,>¶?B†ºæk)%ò.Å@ˆœ(DJ]oº"Ϭuaie µ–(¬µJI –º,‹ Û¶î:¸uH)“)“ÐÙ #S²áË^ðI·ðÊ É· db+@!„ˆã¥AÛZÛ:­3­ekm=_d:—¨1b"ïýxÿ†®Êå¬ NÓù|áZ©,K…*PcŠ<:?^1ÚÅtTEf2­Æ£Sr ZlMËr¼¼XÔyYÀÒpä½õ)fZ “yŒÞ:c¦ÌÒÆÊ¢žW–µ2‰É{O>ä&sÎ- cÌt:«ªjcc3„xáâkmž—ÌÌȧÎ}â“®Û¾pa8¦”66××77¤ÔUUNw¶k넦”þâOß·¹¹™éìÄý'¶··%àÂß¿'ÅèCH‡Ž6Æ´Ë Ñ¶-‚RæEa­ëV JÞ ¶±<^Y] Ö³E—ò<¹¸;^î?z¤`)žóüçþÅ{ÿÌî¸Á`ж.„Ô¹www‡Ã¡@¬ªª‹Ã6&#"(X„”ÊgÑ;$.ŠÊÓÖÖ(eÛ9èLkcL®”@5Î}³™èR*qˆyž—míNÛýø'«Ìƒª³þ ÌÈÌB Ö:ùDD w¤”];ÂÎÁ÷PHô%², !0E†Ôy ½÷’ˆ¤B)%…È€¬?”Îܧ¤”ºTJLD 3u£Ÿ±s) ZHO>„ îr¢;Á®ËT‰1:ç“" %dŒÑ#”d¾ÔNчÐõR´®ŒÌLBH)sÎÛÒ%­°­»°š¢(.©ˆDÔ—RŠÎ ‰å§"Yºc”RjÐ1z¥w9ÑÌ™$ î®========_Â"»éÔ‰ÁÁ›ÿùK®yýÛþû­_õoŸV>øû¿qÛðyo~Öá÷¾ƒ>9qðp鋦þµ?¼¸ÿëêß¾üX.nÞ|ð½·Þú· =â9ç·þÊ»Î^óÚ_xíó74Â6wßÿšwüÏû_uãå#™(WŸþú÷µßù†7ÿÄMWþà‹–!Ç .ÿâ/½®Y=ýçÿâÝ·]_<–À\}òÓŸrmŽOÜñ/_ý›‡ÿÉ‹Ÿ÷EOÊo{ß}øcÂ5GÍgœÀÍoúåw0)>‹Ý>º§çq­-öÒÿcÉtw… €BJ‰¤2(DÊäÙFeYnÌp0F¥‰9¥˜Râ,Ë ÏMQmcëÁûJ!Åж™)5&J‰CÀ"ËŠßý­÷ÎæÛ/~ö û6Ç`ªó‹¼oÝŒˆ# ÎL^ç,‘Ñ:µ÷>ÏËz±hšfyue€˜g•oìÙí­¬È³¢*Š2PJeY4È€h†éN‰cŸ(ÎB›eÙúÆzr¾ijNÌÄ‹èÁÑúò²ÖZ)¹X,„cˆ Ôõ ¥€ED©H¤ÑòrVåØÅD>ººÙØX1¶!”ƒQIIµ˜7Î8qðàÁ”Ò‰ã's“]vù‘Ùlvù‘ÃÓÉ^Y”;õD ¥yØ>¿<ÜýÉûݼé)7nïnI»;{×\uÍÙsgÑäúð±°¹ßd2 1zç–FË®[ç÷BMc³<Ž1"W·¶Ó•@àJµ™ &±¨iÌx}U-ÇËãÂöÖ4/K]”êº'?ÅNf'<~ðà~lŒQZK¡mÓä¹1ÆGM1ÚR@JSUâÈZBò„aÑ”E–¼[Z)eɶ>ÆP”Æ{Ÿ¼<Í´Ö.³œì5ÓùνœºRŒGUa ÑXË,‰¼0ÐFD!QWdŒ ¥¤®“ “ ¸T’Ì„À‚()¥é¡«²ÎÕBj ”]Ñ41siŒ÷>Æh[׸V‰„ Tô^㜋1j)»í@ 1ÓJ!\k»úèn›Þ:D„®%€ÑÞÚ¦™#S¤ ´T(JÌL”2­½÷‰Rˆ”˜;;¤ŽRJEV„Èœsƒ1&Ƙ˜ý¥”gÇLRªLcŒÖšˆ¬·Î¹!´!k–’•R@â” -.ÅöôôôôôôôôüƒÉî5œ)³}Ïù¦g¾ýûßþçg¯ÚxÛÿغî^|U•n-¸ž4鑳Œ;÷žöã'?y_&"þM Ëgz8aûî“6žýÉW}ÅOuB#Q¾Õ”Ÿ~/Êë_ñ=¯úø¿þéÿ½'|ÿ‘‡oãâ‡~ó-oûã?°ÕŠRZÒ3û°õiwý߬]F¿·ç1_=¼wî6ÄüY& „ü<¿BˆÞÕÓóøD è=Å)‰(J•RJ) À‘„ˆˆƒÑÐW&gbò¤XÌæEQ”ƒ*…¨r-µhÚYJ¢ λèñLÑÙ&+G‹ÅP"‹œ•Wüœg==k­X$—æ&ÃHL‘¥Èuž/­®Åùb*J!¥P!¶:3‹ÅBI±¾²ÒÄäœõ6p ãÕ1õlÞÔ Õ¥©²QVF)¥pÓ,TBrye\ʼn㧔 Ìio2­ëöIÏ|g ™Û¶åDUUµm;m²!%^‘y!BŠ1ùpñÌÙÑêòÂ;’*7ÙÎÎÎ`i¬µŽ‘bŒHB¤|0œ7‹Q5(²¼mÛ㞇ˆr±·§”2&gжi}ëë…Ž— |„ÅþkÐÓó¸¥ý[(u¥R'i4‚L)y9D¨ƒæP3¤ÙÞ”}´®qóÙ¶Ôj8+2å‰Âç¢Õl²H>™Z®»ê$:|xíšËfZ´vb$«Ì8ïÜB# “Ë ²"£0Æ8¨*Š)F*ó*„ I)1#Ç”B¨m €eži­CRµm”—ˆÁ{;ŽQ˜Ü”…T¦n)xˆ‘cj뵋:¦¤3SŒº(6®¼*ĨrBH1AŠ1„à­&Ó™Ò9ŸlkóL£Û[;Ò»˜E­µãñÒ|:;ûà©”…XÛØp>)¶Î_¨,Ÿ?}j0Tƒb}ßæpTM'{ÎF] ½›•F[O?ëZwã³nIè›Y}âžãmëªñ¸,òS÷Ý{äÊ+3“m¬¯nï^H)em½ˆmóÑ¿þð¾C‡’á§>ã–½Éä̹³µmƒQL3Èu‘‚ˆ‹¹@¬ƒÑx~ì²CË««‹¶ÎË<%7ŸÏG£–ÅöÎŽRj0^²‘P(%EÛ:cL3eYá|Ò’­+F…È #¥d§l½(Š"š"Dl§¨L(í¬n§ó[ï| D)µÉLÉK1)¥º èHä‚o—ˆFé„ѱ5Fw_W¿,¥"O̬ŒêJ}™9SBJÑi…]5taÑ4RJ-…HNçœCDæäƒ3Æ@lÒ:‹ˆ)Dï³ï’Oª¢ô))%°J‰@ V:¥äB@DfB„ªÌ@– ˆëºŽ1†àµ(…RJ)IQë,1Sˆ]«Ç’J›¬ËX7Æxï÷ö&)%bvÎ%~(Á¦“G¥”JHc$Æ’báb’ˆë+«J©îkœGDÂ+„˜ûc`OOOOOOOÏ?xa‘íÌB^D0‡Ÿÿ²~óÇÞ»sðeo|Ò@ šÊ@½Ó|Z¥Š^¿ö¨ùÍÛ?pÒ>ñÚG–.¶!@NjõŠƒÚ=ø ì{þ±Rüígíúà Þøº¿~ÍO¾µIÔU?»3·>.û¶W¼è–} Óð“#xßç´Ó?Ç ô²EOÏ?VYD߬à±DjÅ )%$Šº>t1Æ,31F TŽ ç­­';;>ÅÑhII¬ Y)³F@­ŒÊ|k×F#¥õõO¼æÉOyÂêŠRcíÈ-6%æÓ¹2^ÉL ÒZEGB‚ÌÔh0 Š¢ªbJ]®nJ‘ )&&(cô>„®rs8w¦0%…R¹ÖzoofLB—öæ‹gNå`ßþ ܶm»¨‡ÃQQ;;“j³–.Áxi5Æ(„À@É{Ûe Ç@Z fXÔ‹NlRB6­3Æ,-ë¶•`:nll„ʲ4ÆL&S˜ììøD¹6Þû8>|´YÔ!„¶mQCQ•÷>p|u}ey”#“k} xÏñžøì/*uvÏ­‡YÑÌf_òìgmOv———O;•á­adà3gÎfжÞùÉ»†Ãáx´R–Ådoê¼_]›uÓ”U/üJ±¢sMÀ.ø{ÿê᪪á°*ª2¥|*£èÛ²,ï¹ç¾ƒû7®Š+Ÿø¥ÔÎÖ3VFÎ6)£Ôdg§åƒåqŠl[oLŽ€ÒHD¼xñ¢4+•¾aоi‰0ϵu­m\lZ 1oS¨mÝx9«w6ãÈÓ¾ù+÷ý«wýû/ûÊ›öånûÌìèó^xíH~¦%¦Úÿåßñº?{ÝOÜzIä4›×¿ë×wøÜ'*¶ÎÔŸÛ‹K>aýÑÏ*tïXìéy\K‹ý©ïczTz8 ÀºmˆH(ƒˆ1¦ª!2“ …~îRÈ"ÆØF×¶-.£ÌMA.¸¤rRê2/—GCW/ÕàOþðOnÿЇ_ûª¯–"I•´™–̘gU& –#%­3%t¤v6ÝQB6¶QF1JH ”2R¤ÄÌl­%"J]@0Öu­”`ww—Æ+D …ÜÙ›”ÕðÊË®,ÕîöðÉÛ?±4§þê#|γ¿¬]ÔÑ'QÖ;dRN§SDæ#%ÐZ[Û†(™À5-HÕ.êºnÊÁ¸Y´Ö6&ϦÓiY BŒ]‘,“O··êTG+ó¦n[»ïÀþÝÝí¬,²,³­[ZZr­¥.ÿ†xmc㹇dRÅzNR¬®¬4Þ¥9¼}áâxmy¾˜ !f»ÓåjtêÔ™bPÜöñë«¿íÄ©³yYìï¸ã޵µ5šÇ¼Ì÷ZÇ÷Ý{juuµ®­Tk­Èôt6WËkÃu/À*q”‘¤÷$ ­µÖÇŽÚÝ™HÊ{­õå×^óžßÿ}çÜUKêªæóZ$âéöÞÆþ}‰†=†I= £²jšf¶»…P€¤´¦È!‘6±R*‹fm¨gÍîlw­ óQ‘qž˜@ ÃZ0)Ћ¦€„8(«<¤”¬µ¤1Ê:×å5wNî¹S‰Rw;'–Z)!17"úbŒ‰»ÏQŠ)¦è;Q’BFÉK: bJ‰ˆ„RB€‡BO˜™A!¥”RâCVGDAÀù’˜ç¹1F ”Zƒ–R)•RâN7GN)F)kQ·ÔâRi¶Ò²[œH˜R !t‡Ã®ÐÛ­”À£DD€Ä¥”)ÅNôDÄ”:û&wq.YQ<üµôÇÀžžžžžžžž/aÑ/ãù׎>Ë Sí{þw|˽öçm',ýêøŽí7¿í¿ýÈ{<èÁÆõ‡òs8ý/uCàSJŸ×Òœ^¶èéy<«Šý7ô1eyiE07MÓ4M .Ú•–RÒ”ÒÑ;0j\IDgQ#‚Ì1«ŒñÞ.šù`¼\a¹ïªáó¾üŸ|ßGï¸ãäîìÜ7ÓkËþÉ”K£”ò.´‹E"Ÿˆµu˜é,fTT¡ oê<3m[ †¶]TKk*3!¤H±«î\Z]rΥŢé$<¥”÷%*•+f®ÃÚ¶Y‘K…“í­ÙîVðN€¸â²«öf“£W_»và€¯k¯/k“Íö¦BˆäP+ål°‹Úä™2Æ[G1° Þ9ð)ùµ0 J’A‚E>ªÛZ ÞÙÞŽ!ù–——çóf8Z¡1ð©“6®W—=%“Ý™ •1Rªa•Ï,²jûÄÖwÝóϾò¹gO]\Þ\[^[¶§Ïœ}àA£½»½[¢ùóßýã§=ý–?ùÀ_\wã“KË/xÑWž9ιVH>¾½òªË™cˆn40ç·Î3šá(?þL=·O¸ášÝÝz>»øË¿økÓ½ùË_þ£ÕÁªñòÈ{†ÃŠ€Cµ·ŒX×̓'Ž_}ù•º*<¤/ûŠž?yú¾}i!)DÛØ"„€P 6JJdƶm/ù"¥BdYfŒÉ²Œ™AçµTJ)@”J "b"B€—ì–ˆh”.Š¢ÛÞûâ%Óbìéééééééù»Ÿ·v—»»«Äôв/„àœkÛ¶išù|>›Íööö&“Éd29|øðóŸÿü¿¿ÅS¢Ïƒü°1&¢‡Ç%3ÓC=Ç»“oñ©-|Æ!f"b¼´‘‡ß QˆGÎàѦõˆÛ˜‰éSÝE'‡>ržÜʧmóÑ&ÀD]¨ãço­û‘[?ðìg<·_]4G 0 IDAT÷ô<Ù›N8~ßUW\ÛC#~ìÿýí¦®]SïN¶fõ¼uM $…^Z^WR®-/éª(E6ßݵ¶ŽÊj¸¾¶|Ë—<µiêzáNŸÚò~vnkqã“®ü¦—>÷â¹ÿõ§w;¶~ÅѼifEžg…ÉŠáäÂE%µó\•;E>@,”Ébª¥ÄRŠ^k]×u9(´*RêW`´ ù¼Îs³˜Íqo:ÛÜÜ/• 3YaŠ<„™„’D” ã\«¤(‹Á­Ÿ¸ãš®÷¶FY0(µ´¾ÑÖV+å½Gbï½s¡Þ›‘ƒ¥eâh„Γ à˜ˆ`¶WK¡QæEd*n]'“‰ÑÙd2)CçZ“ëë›.l=xüÔ|:»é)7pâÂùíã'|éË¿~±˜—•Ù·yàøñãùÀ0éÝݺ®Û§~ñ“Ož:îp6|è£{ú=-…( U r”0¼·ZËb4XÌêä,U¦:qò?oW×ׄÑÕp î»ýãõd{}ß¾r<>þ<3¹Rr4^RYn²ìôñ3yžGÈɵm3È”oê¦ÞKFkS ŠÑ*“¬Ì|æÎmM·öf¬2"H""G–R ” Ù/BÐZ@YHd­o]pÎQ@ì €]¬s—Fb­1Å…™V ”âK-#?t}¢+£&à”’ìâ\"ENDœRY–Âh ö>t+C¡ò¥â†º®#¥•ÑXÃÌÈ1ù11i©˜ ˆŠ¢¸T !JÑycbÉÇØ4-ÿMj³³B`ô™:Sb&è$EDü”»°û3RJ)Ù¦ !dÝ•‰ÈÐy-%C¢˜ºRn ó2S×ö1úJ©_üÑõiu§OŸ€;ï½ó%_ý’ÏéÀû¿õ×^y-":tèo½ó»ßýî'N,//////--F£ápX–eQY–i­»ö‘ŸŠ×ëދμi­íçÓé´mÛç<ç9ýDOOOOOOÏßÊ+èí/þŠ2oc"&¢DLÄÖG"~ø-+Ãìøëoxö¾²ÈÇãñp8¬ª*Ïs­uׯæQÿ§‹€â3—¢r+Ÿ¶ÍG›À§¿ÌÏÇЯG{z¯ ô_ÐÇ’ÅÞôâù“1†ÉtwQ7Ñ/¤ÊHê@5q¶qÍM×ÝrÅÁÍ%ƒà½ÝÚ–ƒáh\ bòëÅbyeEJÙìÍ+E_úE+ˆ® –‚µõÅ9$ë(:†ä몦(T¡'H11bY$å#¹XÔB ‰‚[ ¶18»ˆ1J¡—ÆKÎÖÓéôðᣄ|öÂ!ÄeÇ®ØÛTÃKäjd^lµ·_¼ÿÆ[žŒÖη¶³ª8€Ä!º”RS×eVz¼cŽr¼¾/z·7›dynŠ lØfYA(ÅÁêjY‹ºFÄq1T&8×x»±oßm·Ý5ŸÎ76cU S€‹[ÁÙoºa6›Ü~ÛGÿðþÇË^ñò\RÔžßÉ«QQ•§ÏŸ=´yH/Oû’›oûÈíÛ;‹›Ÿ¾ù‰ß}àÐæ¾wòžÛ?pWqhø5/éîöÖ…ógÁ…sçîŽwGHHù¼ç=ïcüðéçV7ƨðÌ™ÓO¾éæ÷þé_®­oÜs߃1¦É||:pè`;k ð{Þóž/Á O0Ëò¥•Ñ…ó[ËË+Ÿ¼óž'\umV¨ñR¥´hëúÈ‘£;»»ˆ‚|¨÷¦ÈWöï¿°uÞÞ}RjåØaéüñ“‹½íõõ¥r¸<^ZŽFí¬Iy•—•©6Wgg/Læ ‰j´²V,­K£Qê)Äh—†Ê¨µñ°œ4VfYD¾xñb4B1Ä¢1fãÌXë»_g‚ècrˆP™Œ„(¢Ì@ !ÆÔ¶6¥”ȇ‹¬RKÃÁ€ IˆBU” Eˆ>«*BŒQ"v µ2,¥‰BuкàéN¬4Æ„cŒeYyï‰È[+P²@ë]×QJéÉuyÍ(å%]ŒyŠJ©SW@­¥°Á& B&¢BkbŒ'fŽÀBc2¥§„(3¥@ D4Æ‘LÑ3WyD·º½ÔARác`"©*è;g¢ƒJg*!4¶Mˆúð–žžžžžžžž¿;ªß=====ÿ8™Ï· b$׺&aT:1*“)%€¸Ì³®¸|©D»·›P ÃæÚjâÈ!v.uŒ”çùîî®RªÊsat9º¶¹‘ˆm³”´1Cf.2D#r O‰cNK#%r­5¢Z¢o›è<¨Lj™IˆDµ”’(¦”677'“I]××_C]ÏÏŸ;רvucbŒj}J{àžúŒ§ùÅ)VËK«ëk…Ç”G>ÒÂ?xòÜt±8rÙÕ,„«½m›åµ}ó¦nmTJ †cï# Ȫ’fóÅp8hÛv±˜gEäÙtÞÌÃþÍA•i©¼‹1%©”:þlYæ7ÜpÃÊÊúîd2Z–©m¥îMׯ»â S9L'“o~ÊéS®»îê»ï}`cßêhX*]|â߸áiO-•wÝ}§`jWOgÖ¹´Ø“(„ÔðGò§§ŽŸ|Ñ‹_ ”ôu8°ÿð+¿ùµoú7o|àÁ3çÏŸ}Ö—>ç¾ûO GÙé“g–FKB«'\y㟼Sj9¯wß{âü¹íµõÕå奋[[:W6Tkµhò¢(êÅ\£t¾µÁgZ:rlëþ{«¢„cpÇ®»âÜI‘“§ØN[V–ÛLB·‹Z”¹uðèÑÍû/\8§PKFˆ¤¥@¤$J™ÌV–sŒÉA¨Ý½¿ºýT,E9Ý«‰] ”˜8"ª ¥c4@ B) šîZ1p—G§µ*ŠÂ{!ˆ£‘g3§D:3Z«Ìб,Ë®ybÔy¥”)#qg”û”EîRÈ s!ÆØµ)DºÞ‚9‘D‘R4Jk­»h—ÎØ%ÃtíR‘¨ûp"" ”‚H!„ðÞKd" ­ugœ(‘„”Zg $rhÆ!¥”bR!•Rš¹q´Ö!o}'qƵVRJ` 1H‘B”¨%Rìéééééééù{ {zzzzþ‘âCh£ˆ¢®$fJQrBb–—_vx¥’¶ÞÉ2åœG†HQh¥Š\€Fë}бPÂ|îm+Ð%׆Y£L1XÝÚdÈóº >zf⤄b÷övSŒÅh tfŒ™Og1y)Që <Í}+µEfVeYôV­µÖZ1¡On{wguyMj5™LbŒË«+Y³ØÞ¾Hë+›÷Ÿ<½ºo}ÿáCƒÌœ>;•aÂÉt>ìÅÉÅé"Mfó‡Ïêv0¨"%¥DèäbÌc´y^J%öö¦£Ñh0 ŠªXk«ª ,¼ŸÌš]ïÚ}û6¦óÙ`0PZû„áè=P^šbPyuáì™cW\¹3ÛJcÎnkw¦Dòº§ôÁÛŽ½ú¸æº«ÛÖ~à¯ÿø‰7ݸ;ÛÚŸ>³}ìØÑcÇÖŸòÅ7#ï½÷ÁýÇ2ópPºÄÃ¥5bÈãÕÕv¶ ç\=[Œ–—¶²ìâdg½^ºš6÷]¦ Pbgë\9·u„Öúf1›nÃpX.//ë,ß:w¶]4¹”U¦mŒng£¥Áp¬´i,îÎãŸÞz×ÝwžXWB‚„L˜ŒŽLÌ<ÎJm2„¤µf&pΣÂ,ËÊ"cfßúcŒ©(ò²,Bt„()A¦2a!„ Ê.ÿ$„À‰¥”Y–u-Q ŸbÛXN‰ˆXkٕܦ”º ç\WX-P)f­U¦•@É̲ªºæÉÇ$±S ³, ! ”,¥""Fìú=J‘ „ YJlB€Âd€ Z阒1¦Ó*‘IÇ%ât±!H­Érw2(Gº””M<(J@¶>À´Y ƒR*צ,K¤N›M½#¼§§§§§§§çïN/,öô===ÿh T‘eE^2%!5p¤Ô±2z8Ö“ÉbÝÔãÁ2`ŠQ†Ä(Bð:ËAz`Š)%çP wžCXL÷LáåhÍ.j ŽR d| ޹™¹(ª’uQ Ìó|º·£•GÈ«¢d•lë•æ 4ÖÍ¢ e.„™"1åyn­eBUUÖÚ²nïî>z$[H¤ÙÅj<ÆLÏÚ½µ•ñîù‹ØúÄœ¡:vÍU*Ë®ߢ¯å©§SJH<¨Šz>‹i‘ ͦÓÃ÷˜ìmŸ„Χևɴ®gó£W\Y×Í»ÞñÎ#Œ×FÈ´y`?F=ŸÕKÃ%¡t5ªÚ¶ý­wþö×}ÝKªñÒÅ ¯¾éúÅÞS*³ü²§»xò\Rü±ÝuóOhêz=_ºâêcßüºoºó£wî5‹y}móûL)»üèÉO¥”¢ÞZW×ÛÛÛ1âbÑl>¤”Ú™ìzgw&õ«_ýêó.d&ßX[¿÷®ãe1¸ÿž{×76ö¦µÑðÀŸ<&ŽÃËõ­ïxæ3Ÿc¬ëÚ¹•Æ}û6b”VyY(!µÖí¢™Í‡/¿ü¾;îȲl<,ww.æe‘+þÿÙ{ïxËÊêþ=u—ÓooÓû003ô¡‰XMŒÑ_LÔDQQ¿öoˆ5Qc¢‰Æ¨±G ‚ÂHQ¢ÀÀ0½ß~îé»?õûÇòâ'çý×½ûžûì}žg}öþìµÖG#•Ï0d¢ &™U–师!µMmalñ™‰Zun¡Ùô|_Ũ–‡8r´Ÿs‹Eþ‚ÓÖZÚ÷½­÷¶‚Ø‚âÌ÷\,ŒBˆëºYƬEÖ B2Æp×é¶cVZƘRêy®ÖÚZ‹´µa‹»5¾Æa!DkMI¥ ̱Hu%EL€PL)7Œ1F*‹1B ¥UJuFQDQFBŒ±Üs¬PÊ`d0¨ë Z„‘H3m ÂHYÃ,FÖ‚µB)‚±6ÝΉFkM1±Ä` ©TVé,M‘5Æ‹Q·qïx„"d5XBY&F4‚Æ8MS¡E*RŸ¥d @l+‰qÎ&BfÖZŒ‰ð}!d5B‘±gc ¼wìÑ£G=zôøÃé ‹=àµK=zôèñÔÂ蜋—år £ÔX¥ŒI’Ì1¶¯RôŠ…´:“‰Ø(kºŠŒL8¾JFµ’Zêz¡B¡ ¥, Ž!‚³$™`Rh7‚îÃÆ÷)&ˆ`ƒ1N¤p—+¬´TJ•{(ƒ–Lk€y®ÉçÊi–ÍA•r· ÔZk¸®;yðp©TZ¾jÕ®½ûV¬\Û ÛVˆ4s}ÅNuæÖënxÉ«_;3y$Í’òàpE"AçòY;–Aôã­· ŽŽŒ¯X)EZž{à¾íýCk׬ª7`׎ƒ#c#cccBHc@iKKE6<2073kzÁ‹^€­ÚþÀž¹éù¼ïEBy…2¦$ˆƒVÐÉ„xîì¼o0´lÉâ(ÚAglp¸“„ÍZzn´V.^d)ˆÐîšÙsâ™g\õµïÎÖë¥RiíšUnŸqÎɇ÷MO™››šìX˜kSÌçª …R9_È fJòùz½qç?'ncjrfph|Çö`¥|ßž*Ë–¬œY˜qœâOn¾çÄʼn›Öˆ¨¹sÛþ|>Ÿ/ùýeßcZ['Yb¡X)Ö5FëûÝܽUë½ÿÞ;¸Çêõk2Hâvàù9×w•4Ft‚$‹ %¨›cæ§z®k²Ähixb|íqF Ç©L[I*;ªSÎ|ÊÜJáí¯¿ØË»„à‡ê‡uؽ«ºPÃHk])ä(¥ù¼/¥D¨ ¥ÔÖRJº~&Y„ F­6]ÛåLJd­R‚j­Âcì¸SjíDˆ1¡¨ÛNÑh‰Œå”@ÚeŒJ)…‰"Ÿ/`°Üõ´Ñˆ`‹cìp×ZË0a„cµ™•BHBˆ‘F*éQn t¥Im-cÌ"ÈÒÔtû‚§"S2MÓ8‰ lAƒÕÀX×uÇ!„*ecÝ,E­5£”†nßIŒ“$£N»ÓŠâ°ÕªqιSàœsÎãÖZÇq´6Ý7˜ i ÊdêP‡BΣ`1Æaèu±íÑ£G=zôøƒé ‹Ou<7·s÷Ǭ;–Ò›=Öþzà Ùh|ݯüúÉ0À³wÿî\.ßK(~â0ÊA*ÍPŒ©ÑJê,SIœf‹Q†uœz˜`@"ÒH‘f:KýBQkm)MT†5„Pn¿¢K d¢ŒvÜ"w\„ ´Ê”¶:“eØ åt‚`båê$êhm’„"Ïõ™ã6«óqú…"Á”Z’eâ,“Šs.²(NRB]×õ“$I’Äñ\!Äøø8c|÷ëïݿՒ‰ ŽhÎQö]·Ü¼ñÌãî=@DV^<Œ!‹X–ÔæŽDí$j…«O8añš•sGygÉò%‹Æ&®¹îzl0—y9Ñ’Åív+ŠÒB¡ 2µÿÀž%K—‹Å0ŽŠy?ŽÃNP£”ŽNÔægnÜzãçœS­V—.0£cqw0 K•âáé©5e·T)‡­6+û,¶)GH!Ì,óüé;PŸï;âù•3ׯÆ–.ê‹#qíu7nXµAËdlhñ—¾ú•K.»ôúüpÉŠ¥•ÁòòÕkZ©ù¹ú÷ïpxžrª5,_¾bjfšbEÑôô´EQ»Z¿ëçÛ—,]<11˜Æ²Ó¨;Ô¡´´â >Þju-8ŽccÁm·ƒáááZµZ.E":QœYuÜæM‡ü}q»®ŒòÊyˆS§4`‘¢@›óUpk±ûÞ{™U}ý^¢" ¸+z„fõ:s¸¦*ϼbÞË” eß»óÈlµK°ãpÞ jJîëëc9§ £n™0¡H° a@`Y0@ˆSªµ%ŒÒ4¶Æq<­­Ô–s’eI·q¡EÈZÛmh-û…©´Õݱ,BÈX¥µBdY¦µ‚ ”Ë1LÔQÓgK1„Œ5ÝZdÀXÆX¥3%­µS!ƘPG)Å]W!„0FRÊLÉ$K…VÒ­µÏ $ËR×u»É•ánê"✧©°öh9vW+̲ !dASJ´Y–êJ‰Œ1I’0Æ…RœR¤5B yŽÇ0ƒnRJ ¥Àö©öøÿ+rïGN>öíhc`É›ïÜö¾cf>vʯnٔý‹‡•öµM\|]ª-°s¿5ýí *¤?=zôè ‹=3«V¬Þw`ÏÍ?ÙÚ›Š=žlôUú'Æ÷æá‰ƒå½N§Ã€Q+Ìš­šH’8‰âö /t© ‚"8I›ˆÕÀ]&8ùžËy:YÜ,:ÍYB(2Lh™¥1¡ØšQ‚Æ„ûÅœ±Š<¿0…A 4ßWiÎÏ2Æ• ÍœV}T´tÈ`Òjâ!Øj-e„ryA(mãŽÊRB‚°1*I³f+èï¯()û‡':Ià¹n§^k¶š]öò#<°÷ô3ϬÇIÚlSDœ\^“thé€EXHÔj‘4’Æ Ld§œqz)—?ë‹uýH—½õ®{ÿn£ÿ[†­¼ügs_¶ì9_ki«Œ}¸-Cç‡/\tÑwcm€žtåm?¸bSá¨z¤}bËÚ7më “äßœ¹æÂ¾ž°ôXy„5E…Ñ5'\ð×ï~×+ÏsГ+VÒs¾5÷‡O>î;´AÚÚÞ¢öèÑ£',öøÝ"€²5«Ö÷æ¡G'#P¯Rï‰Äq½² ÈZÐ1L€3!1bNšªøÇ¾èܧ·|”*q‡PN‰'DÆ ©‡ja‹½BÑZ­¤À˜èT ° 1FJ5ÖÚp×7ÆPJS!}Vç‹Êp^N³(b¾o")‘R‹]Vð:óóÆ%8Éb¬©%†XÇrTcd±Š:m7ïa‚„H1 jµ:0<’ˆHJY Ê’XÍý\mnAÉ1'lê¨ÔJE–£n­Õ,”J™Ô”¢v³“óýCûhcç.sxµÑéëüÉnª·£‰‰Ñï]sÝùçŸ/3Ñn·;îØvÐ’™’™ÐÚ¤i"ºlÙ²å«W6šíf½6èO‚v>°cͱªµ…K/{‰Pa® kE¦[j¡Ð︥ìmÛßþ¡7nÙxü¡ƒ³¹\! Û[¯¹etñâ‰EÃz=²pðÎm÷³qí3Ïy:APß?—†búÐÁ­‡®_ºfM©¯Ÿ Ä(Ùvï½ÅB!”¥ÓA§-„HD¢”b•JEŸ’úü¬iy ²óðþ\¡PJSß÷ ¥R_ß ¡!Ìuýþ~­³ê¡CÉ™¥ë׳|¾]oŒ ô×âÖèØ¢ÙýŒi—è´¾`*ýåEF›N'4*Œ…t‰gáÜÑRŠ:qÇÇ)ºŒ"I2âø”J^(ÖæÃ¹V§¤XÊ{¾€Ò€ hÖ"¥ä/2¥»  ÃŒd4%¤[ßl61ÆÈ 8 …c£sJ)!ÄZÛÍøÓZ#„„BˆnXFQDRJ1Æâ8VÖt>Çq(Æ”R©E†”¦€µÊŠ !ÄÍ97¬5,s¸H…TBk ’Y£•!œ¥”B`´QHQJ§„Æ(Æ !@JÙ=l„R ÀZk„Œ3)¥i7]’B¡˜(d•™†‘f–»!¤­q(ÅaB̃çQ­µ1Æ"Œ1†^2ø“Û¹çßþú¥oúú©Îß'?þâÓWçÛ;®ûÄ{Å%ÿüÞ\{øËÏ,=>’— ~ö™+?ü3mìi^ý§òøeÀüŸžj½óS§¯~ý=ÚØÂ‹®=øÅg<ø†Â[þ|Ãk‹¦ƒ0¡äWÄ¥ßÜò›ŸõõzcׇNÚøî:½ýýíÚ;þãyc ]òšÛ×n½líë–ï®+7yOUüøÕ5-_öƒ½ÿ~ìôu~ÅË>~ïÖÿø›¿Ï·ïüäùÃ=‰bõ7CŠPÚKâîÑ£GOXìñ‡|•ô®­{ôèñ”„8®Q†!PÈZ@LWŒL<Î\îBrù‘C #93µo×ÚeËÚ2çr%’HËÛR4D*•ŒQœ«…6ÚRŠ€d™¢„û…¢¶ÖJÑ CˆrÇ÷ý\±ˆC’忉c\³JKäqYf:ˆk†œ¤ÁP…h¤Êan1B §: DZ,ÛŽ2¦È¼ ´փCãå)ÔI4ÅYª+•éêÂ’õ«”È”2Ö¢œã'‰*ä*A”`Lå2C“ Õ81QÎÝŸÜzçɧž&¬ð$TêO=måòåŸû¯Ï/[±þîŸo_¶tbaá E6è„Ǭ_?=;G©1†8¾Kí}÷ß?5?ûÒ—^6xêKÿôïùŽ×òÅm?þù’•K† -ÌÕÞ·o嚥åá2ðÊáùÆè8Kãd~ª6ºdQ«ÞþÎÕ7”òù©ÝzÊY§œyöÆf%ØÉ•FFÊ[ø£^òüz£ª Ú½ïàU_ÿBlóÆã&–­Ü¹{5ŽŽW IDATÿèDJ)Ù¹sW' ”Rq@ÆÕêB@1ö)Ÿd´NÓT[«Œ–™´Ö"„Ò4ÕZ %•Zkc¬kŒ±Œic˜S2ÃÔ¤iÊ-Šcžó´E2K c”óTˆ’—ÓZcBBÈ—q„2# ½¤œ'#zö¯:÷ò«jRÛÍÿ𣯼amŽ`„O{ùG®h÷üo*cG L×:È6Hü—“Ç.ÞZºøÍnþfÐ;zìüYW7ttç–ºNwÃÐ+nî˜?TXB¬oe€Mn{Û…oøî¬|øãGžŠ_Ÿák®|áI‹óœUÖ½àcwwdûçŸxåÙkûw`ÍsÞqÍTöËñåÜM{Å9—ö{<7´êäç¿ýªý±ù£TÊò—ž¸¤›¼aŽÜ݄ߴ`Zw}úõl\Ôç1æøÅ%›Î¹ô­_ÝŸv9´)í£}FŽþýÎOüÅYk‡}^^¶åÏþ}[ð'ŧÎzõèÑ£',öèÑ£G¿§°(ã®ã[k¥H™5J&Z)J¸C„ñl³¶÷p}¶NW§f«ó„P%…1&Ét&!W®¸åÁbe Ü?20¶´44áæ+”yRÙ(IÃ0’R¥Êô K沦¿¿¿¸_%Æd6H"°a+Ó ‹’v;Jä芕6Ž5!“û‡1ŒˆH†GGû'ÆÃ Éå @ÈÀÀ`¡PH’8ͲúÂt§UNsyOKeYÖ74ÜJ#Ê9¶¥™Åˆ2$©4¶Ø×Wm4!1e…ò@¢u’©4“7ÝxsF÷Þ}oØŽeªçÒjuvïÞëåü½û÷SÎW®\¹qãæ#S3…R%Ÿ/­^¾¬¶-“O>ù¾{·/[2±li}¦&Ò¬8XbZA´+CÃ?½ãç9¿´Cg˜0mÐþ½‡rnn÷ÎCœäç&öMªÎ’&ºê›ßKRJU«í¥Ë–´ÚÉÊe«W®\Ñßßwþyç-,Ô²D()jµÚý÷ß?=5O‰»ñØã†ûµTíV+ì•bI¥™Qj“4ŒZ Â\–¤$Ö °JÛb©B¸G,$aœÆ™Ë=ÆÜb±¬}ßÌôý?ÿÙûwÌ<ÜnÖý|Îñ|‘fY– 0y×óq\wñòåq¢’° ÆAÐß×ƶ«óamŽA±MefC–RîkDÒL6kM™V%*eµé¤6¸6™dÖMœqÚ±›6­È[k t+£¶´Ñ1FÉ4IÓTi†a&Òz½*dŠŒUJ „,¥˜QL2ÆH)µ5Ú¥+í@WC ‚(¢t2)³,‹ã8ÉR0¦˜X{ôfSJa”:šD ’R*£…qw\v]_cŒ1c”R껞ç¸]µWk1ƺè]èD ¡•ÖZ ÆrB)ÂÝã´„ív'(¡¥Ð®ëú¾Ÿssyß/å CýCù\™{¾Ã=F8ÅÄvPÇq%ˆQ„»G„»Ú"fQ„hϳîIG¶ïêïéêã§lø5÷oÓ{n¹ëg10 ß{Õ¦“_ùÏßÛ{ÌîZ¨ß÷/[¦oøÔ_Ÿ¶áeߘèÄ%ŸþÖûOgF+¥öé]_e¿åm—.×í}7üÃe¯þŸia OÿâÌîŸÐ­>õ¿q]{QŽïÿÒÞ6ñ®›η¢êmWnœùñçßrÁ9o½¹«꙯]¶áœ7|æ†ûü?ýÚÎ…ê‘;?ù¬™Ï¾û7Teîì‡ð1'ÿY­´E—ŸõµÙû>¸Þ­”ÒÖ‚ÒG·ßòš1k”RÚØ?rtµ&6O¸ÈþÖ =ÿ­W=çµÿz펑7mê„­©;þõ™oö»‡³G -óÈÑhí3é}ï?çÌË?ÿ“=Õ¡‹ßüöW¬øñ{þu·yèJ<ÅÖ«G=a±G=zôø=  !ÒDvší¹êôl}*JB­¬Ô*‘©Ñšš4±nBN8õ9À¼vÜNU(Uj¤*ø… ÓH¦£Fµ5?5T’dqC$-«"Îp.Wp¼B¾ØG¡Ìãn©¯b0¡ˆû9×Ï—ryGikÒÐÁÜ =¿ó–êü¡ñcž®cB<ßP¼rÝÆBy$BpçLb ¥<ç9ÎùÜ¡½{wlã6¢“Æ™Wèﯴ; êBG˜QRðóýýQ›ªœ_°”rêz¹r‰X\›oONΧBUÆF†Aq–bŒïß¶>tèЮí;ìÙ[©TöíÙóƒë~xãÍ·ìܱg|dlúàä¾}{Izâ–´‘Û·íº÷îûwmÛ¹oûÞ¡òP»^ô’œŸ=ïÅ×›Í}û÷*+‚N´ï>°¸Ô_ùW¯ÒÚRlªS³ùrI*Ñ?6¾÷½óÑü¡ ú䇯 è ,еk7íÙ3mÁ=íô“ w e·bxËig…A³VkBŠ¥ÒÌìÜÝwß3udj¡VèÚ­=ûwMNIÓx ¿¯\)Õ«óA»Ça­¶·YÚÉt\B,tf²¨f‘îú9’i‰µ€3­êÍj’v6ŸpÚ–3žtš ¦h|hD)U肵z½¶°0=5sdoØ®c­ZëåÝ4hgívufº\,û‡sÅ4Q"ËŒTiš i2e3 q¢´‚¨6Átu.ä…ØBSlß9ó³»÷¨XÈ{ž×í{˜di‹$UI*Í ºÐ¬Uëz=J:qYȤ¥Œ¢ Õª ‘b°H+Œ¬H³ Ó‰‚ C-•Õ@Åu5j!Eœ4ëõZ­vøð‘……Z«ÕqÄ•R¦JY„”Ñ™ ­Ñ¶ûs’¥RJ-§I”ÄY–¶ZÍ ³Dhi¬k!ç¹®ïU*}Cýƒcã###ÃÃÃýýý•J¥\.cJã4ÑÚf™Ì¤PFÇiÒh…Ê‚4Úu]—;¥\~ ¯od`°R,-™_²xbp ¯¿¯¯¯Rìì+÷ ö —s…J©$µ Ó,cRÊ|îh)²,Ó4Œã ŠÚívDB()¬ºw|²!f˜9ªœõ-éã¿ÖdaÒÕVlûæw¼ú¿'…2¥ó^ó¼UÅÂò þꢰzþëý¶ê ¼‰ÎØ<ÚõË +^ó÷o¸ôâ?{í¥«Ýôµm‘±ˆPBŽÖ#Lh· õÿùm÷~þe«‹œòÊÆK_½…ƒÕÿóc·µµ­­oýÕ5¡óì÷¼õüåe×;ûò¼xœà‡ðQþç¼A—3æ­ºüž [劥¿Þ>ñq®MÆùcÿök_yÅ"‚lò“·\xù5s¿‘¶øÛ¦yþŸ]¸6ßáµï¸úëyïÿþù ÖÌþðî³?wõ¿½÷ÊþÕjŒÀ7óØX°ÍþϯiJmò'_pÂ`iõóþüx&ºñ]ï¹¾¦ÿ¨”*kE}ÇÕïùË0ÆŒÿÅ^¶œ¿=hm²û;7·•¶yŧ¼¸âü·ÿó/>e¡‡Õßö±¦zÍ»þá>©Œu/øØÇßú¯z翼÷ç!÷Z¯=z<ôz,öèÑ£G§.c£´™Qš1-E)‰1ƆææëÕò@^¹ @û¸¢¤HE+¢Úü¡Á‘A©2«”Èb°:IÒbi”–ËåS¡1ÇgŒ!“ÂfÆJdLª‘ñqmI:yN’PgñäÂü~‹ÜÊÈ™¤¬\ÖA`­I“ søpqÍR9bb¤…âx¡Ól¶jÕXÊŠ2JUúû¹›—R–Ë•…¹ŠçB„cÄ !$‰âR¥Œ0”Ýü¾ƒÓívXê/ W\B÷ï™n̶;a»àær¹B«Õʲ!4;;+•ð·ÝlŸ{î¹Ý¢×FµZéï;29¹orrÃêeå‘‘{/ZõÀý°{vïO‚¨˜€åÓT9Ib™ ÉYaòHuË–ç«Ó«W¯æîvûs<ï®;î¬ ”-ãÇ»îÚëW¬ZÜiFa’Ž-úñOîÌó#£ƒ·ýôÎ÷ýã;¿ö•orêlåê °Å²R©`Œ-BK-=25922’÷ ;wíDr¹ÂÔ‘ÃfMZE²åqÅ"4Mã\€Ìȱ‰qm Å„sZ›™ë4j#ɶA+Îû¼X¨7: U«ÙÉå½8N<ÏÓŒPLâ,¶ @«4 rÅþþ|1h¶»ßó³³£££Y&×ãØ Ž‘Ö’ 3lè(””—X›ÉD„…¾¡Ñ|¡Ì‹(½ÿÐL;V"!cÀ”2M)!!Kös\kd©–2ìt¢0Ie a@¡ÖÚ…”r?W ˆXkµ‘ijµÖG]\0²#‚ân±3@Ey;”(ÀÑBÎ0Æœ2d¬µÖ‚5ÆPLŒÑŒÓ Š¥”J lcŒ ä8Œ±£ÏBP‹£×Z3ÆŒ1`º¹šR*3庮ÖRjÅ9'È`Œ=/×ͬ´ÖbŒ|Ïïf8êîÞ)aŒI™õxQ3†¬õ<Ï0Æâ£=(1ÁQ „”J)—9ZK¥'€I/cñIÍo‘Ò²?ØZ5W »øÐÊA€y°õ›®Ý—>§?уÄ7¬¬0ŒÑèºa„ö¤³“m+$Õanwÿ÷k_õù­÷˜M7 Ù¿£*Ï÷ÜpKÍݼò¨Ÿ2*ý™í[Áw0Àï!U{Ïü×ë?¼¥@ôô/ûÓÿ‹­ éÈ…ÿô÷ï:õÿÜ–sä³—^¶îöï½Ò>橨¸¿œá‘MÇôs‚¡×/€UiÎÍM¯;n‘Y2‘B ¸¹<åÌñ\?ŸSFcÊ™›CÖ„µ„Q DI'VöC³3õ†A4W)Y©d&0 —rLp×èÄñ<„6 D$ÊHæP‹ f¨ ïw]\Œ1Ý*c¥Igi&Sy%\î:23N ‚0!ÄZëû>H…PB DÓ(*¤;ÜM²RjÀšLj­ !]ilŒ‘ï{„×u²,³¬\d#™ IDATÒÆ˜N˜` ÂD”R®¹ïyÂhŒqרZƒÅ`c ÆÀ9'ÄbŒµÈ°ã*k0ÆS%e’$”1Î9B6çú]m­µµÚãÆØô\¡Ÿ„x›ßô¾ ?÷òo·´¸ácß8xñëV=(gÈC_~ã}ýKÞKÀYñ¬§õäP쾪°Çx öÕ,@ù¬sWxñY¢ÎQ•YeÒê…;¾ý£j8Z *U€ÀŠ •=D÷\þŒÓ+;\;}ïþÐlô1€©~ãE§hÝWo¼òøüà ˜œzñÓÆùc:ž_>B¤åECˆÛ©±€ã™ý'¦°ç7½ù¾´ãäK¾4£n§Pyð/&nDðˆSñ{à.}ÚIùO¶ÁÎïœWäXJ€Øû©—ýåí/ü§_²ˆýqKU´ÉWœ÷Ác¾ðÕ?»ä§¿äò+ßòÞãOzÿ^m¢f¤ìÃÅj¼æÌÓ97?Úî¼egmö>9‚]ØÓ}A6»·öâOñõêÑ£GOXìñ»0ÆzùP=z< !„ôDÿ'kŒ5´Á1̧Æ%SV;Ô¡È)J ö¼½Gæ|\ö}×sòFé0n$é,Ó(UBû…¼Ò¦opQ¥/‘¡JT±Pa„ Fkµ­u®Ô¯”,x܉›5‘´ ¡A’e† ŽaFÓLKm¤Œµe©–(¹ùéûW·!ª6â´)&›ÕÙ…SÎ=9Žèh·¯_$)¥aFI‘:}}åúÌ\-êl(æp"âTWõ‘EK-à èDíøÈIÏušÕÚpÿP­VݱwG%y× ÃPh•e™’.H È™Š–RFsI©Tò<ï˜õë”R›7oâ”7­¥K–ݰuk¡\zî¹çA¬”jÔCCCyÎç«SJ‰BÑ9fÙ„à¹ê‘-[N¾õÇ·9:á©§œ,d¢J£ppbŒa¼ÿÐáñe#+V¬">ñ´Ó®ýÎ7fÄ¡Éi­åæã5Æ”Êý„ v+Z³n|òÀ%Þ·¾ùÍÑÑщ‰‰±‰‰cÛPšªxžïyn½^Ïå cã‹'ÆÅ·Þqs>Ÿ¢ˆ`0Æ8Ì¡·ׂúŠ•«×­\‡‚ m¬Â ­I•(‹R™$Jkš‘Y¾Xh¶Ú•¾4 ²$ÆŠå,“@‰ÇòIRÇF§QàäJÌáQ%Aäår"KƒyO ‘&a¡P¤”A‡:<Ÿ+#P8ªŽùþ³N\¦i'ÎW›R€Ö–;޵ÖHD†1¶I¡»I-¬ãxaÂŒNÓ82Rc8f”R rg%”Ƙ4M I“®+†±Vk Ä:Œw›c,FRÈ®¿³*ÉÒXda–• Š}ß'„XЙœ¹ÝóÆØ(¥ŒŒ)wDgIjZ Xk-µâ€e$ g®ë"„º9”R)E–e¾ëÆ¡$IT&!Ƙ$Ë0Ø4ßó´4<çtó»ý (¥„ÖRm4¸Œ k´ÖÝ<Ê®»çyj¦ªÛÒh˜pέµJÉÞ9ðIxc2qég¯åŸ\qõÁŸ]þŒ—ÊO½ãE§­.´¶]õþW_~ÇŠ¿¹öÇù¡ÒÙïÿä%×½ä+sÍïòšÃ[^ÀøéïTÊóÿåCÏ ñš—­© Ÿ.ÌÜ{páÄ;_ûŠÏÿåWm¤×Ü&ì¡«¿ü£?çú ºMýÒUžùºðÚ—»‘^÷w½ñÔ÷œ·í]︱ü§ï^ë#è7¼è֋΃ßõ*»°ùE[èõ7k»ëê­.~æü§>~—x¢Œx¿øß¾óÞ=§½ç.aÒÉ[ý¬Mä[?Ñ?¿ÏŽÎûàÎüþënNšWýݧ^»é§V»?õ†÷Ü\ü‡Ñ?úûG Ú8]ØùÝ·½é³Çþû«Žï×ÍÉÙÀBþé/ÚÇ?\hýôý»ðº?øhÄøQv‡‡ž{å¹öïï×ÍïüãçïXz¾úÆ¿ß6¬J¢X–ŸÚëÕ£Gßù,׽ʴÝK.c´ÖJ))e–eI’ÄqA§ÓiµZÍf³Ùl.Z´èÜsÏíéP4|ÿW?ÿ—ô´G'!õÆÂöî;å¤Ó{ŸÐ'ˆW¼þC ¡µFÈj)1åÌáÅ|s[(æ ÝÒK#sÆX¹’Ï1ÖÇbb‚RÎ1©ZÈ$–Úøÿ½÷Ž×¬ªïýWßíéåôsæÌÌ™^™¡ TÑ$×sc½ÑØbT¢1ÑkÔ˜«W¯Æ4–‰±Fƒ5"2 Ã03L9½=ç黯úû㤘D~A}Þ×~ÖÞëìÕöÚŸý-å‰õ“EÝö*$‘A—'œSJ!)AfmÛ1•ËåT¡ß& [k+gNS·¸ùÉOm¬ÎjÛÙAÃ9ÄNówÝH‰[Y?j³LÒXì,¯?}rÇÞý•Á¡@“¦À²ˆíXÈiûÝB¾†1Ë—-Ï]=~bãy{ó…Ê¿}î³Ìqʕɩ›šBð8ív÷øác\ªc§N©Ú­FÂãf§eSË(ƒ1b¶¥”É—K~ض1‚Jèy^¥T`ÔÛ½{ïÁÛnš™9sõï½:ŒãSÓ§×O¬ët[J©B©2¿°Íeç&†Ç6lªlß¾ïðíwÏÍŸ‚3fmÙ¾%›Ínß±åĉÓgæÖ­›¸óÈñ­»6OŒÎŸ999¶áÖzþï>çãû—ë¿}ýóûìÚµ­ÞðOŸ9Q®äò¹R J)%H‰ôÐÁÛ/ý•_YY^¾óŽ»s…|¥RYk5«Õj­¶µm渖伜/»ëî¥Õ•V朜›Í拹Z­†dãò®|õàÝ'§vyݶ ãÕoúÃçí¯ÐûrEýÖkßþ'ÿïë‡N.¶MvdÃîË_þöw¾ô‚AAqòýçîzó©Ð€ðäk¾ú'‡žýòï÷@„ó¿ù™O]–Çbú_ÿ¢7_{ÃlÒÆ'¿âÃ×^ó¤Î?¾îwÿèïoY¦#»/}ÑžqÛï]ýPˆ0¾äºÕëŸU«7þõ5oÿ›o>±Øe…ñW¾òï~õe£6þ“¼lðÁ¦]Á /žºâSu.z^Î ·¿û®[þpó|MArúóô’7þí÷çäà– þÇ›^š¼íŸW@Lö¾ïØ÷¯üâ…{þøÈý7H.¼ö{Oïeo»ëG>½øíß|ˆþÓ½þ¹ãÏúJÀ…Aoÿó#?zý–{ë4|áó/<çùÿ¸¢&ÞxÛÑwŸå!@|Ï?üá#4Åï~Cû­ï;Êï«nóëÿá¹_yá{sÙËkîµïZ~Éknâ÷¶8xñwîùØ…Yù×÷ÿñ»?}Ñ3k"WYþo¼æo~ÞÎÂÏ·Põp}:õ¶C‡ÞºÓyÐóhƒðÓÿð†?üØ·›kÆœKœØô¤ç^ý¶·¾ø¼*…?´_ùÁ#ÆG­`dý¦ÿûÚ×èk·ÎF¥M—üÎË7}ùõ9¥µ˜l~ëm‡®ÙeÅ¿ýÕ§Ï/-/~ÇgŸõô+üX*m´ÖJ­MÂ¥ÖæGJYë–[nú'¹ŽÏç³Ù¬çy¶mSJ{qivãÑÙùÆ7¿üœ_}^¿Cûôy²V_½ëèçì?¿?C'^òº÷C ’0HÒ(NSBc¶eY™L.㸖åH­‘V@iJ©1&1\Çòœíë‰y´âlÛ¶åxC“B í· 6jc QÀ±(!-ŽTGG!X©nwMvZ¼;µÛ±÷?- «a‹9…¸½La.Lº]ulb*ëDê3‡.¯,îØ}Nb3 bL-F ‚®0)àLê$—r3YeÙPj-g|·ƒ¯éó=ãJ“ÄÈ4™¬7jEKùýÿáìÊŠR¢±¶êÚV»Ûg˜§I§Ó1T«ÕD Ûq@i*”à‹‘B6·}óî;Ü5»<íÙÞ5oyû×ÿíW<í)'OžZ^Xˆã8‚{v3ƺõ¦—ÍìÚ½åß®ÿN.[ÐPoÙ²…1f€ò².%R:46zã·~X¨wœ½ jê½¼Tß¾sÃòbû¶ÛmØ<²¼\ÏårµÕæüÜÒe—_rÇ·cŒ'×O ù4ŠVWÖ,ËÉå2+++Òè\6'µ‘R6-Çq»Ýn¹\‚@[„Ö×Z³³óÔrjKËĶ2¥R©Tj¯­X„BJºÝn¥Z*–‹–kQlb?dw›kåRI+@ ¬Asy¹±´ÈTìûÝÑa£yì7ŠÅ®aÜ­Û±© ! »*NlȪÇv]«<>â:n³V›;qØsì|%g•F²Ù*0,“-âTH§j̱ !‚keÊ£©õá»g:‘ Øsn H’$ B@@J‰b+¥â8Ö (‘B4PÒô;L)•J¶ã1„cB)eOXL’D €vDzÏsŒ1Ýn7 ÃÅÚJo7(¥Dpž$i¬ ÂB\×ÍäòÙl6çäBaˆQ„c€Rê~@Çq-ËBöü!’$I’ Œ–R¥¥”½Ÿzú „¨µîùJk­…ཤ.c/›ÕZ÷l -Êà}h!!„Žãc4©J©$I–eŒBŒ¨J)…1D…]a©ÞÿÖ?Ä*¼/,>ÔE­½÷p¯©ëƒoµWäþ÷eÉèI“êÖu#ó ÷‰3Zi}ÿFЭ{e!D>à¼ûN2ZksïI÷õ@Uô!ü‰;»7Æ_Ç~hAct¯@/°éSÎ@„14ê!÷ƒ¡~ø;|¤ªZ罿=ðð£4B@? :ˆ0|P CŒÀCº€ û[ü¾NëÝúùÁ?]Ÿ>ú íuùýMó??ÂÐzÔÑøhÕ÷„Bs§ÞÿïÿBöWŸ>}añqû®Ð¿ìô-ûôy„ýúx²n|²Óªç/JBŒ”Ò²,Bˆe9„XJj ÔP)iÅl«”-Á‚j¦| X¶U="Š¢fÚQT-—½BI*ÑX[æ<õƒBQÌOUFx¬µŠEê¨Ù –´ßM œÜý4¿¸6´˜½rüGZòÔ*ŒŽ:˜ðXûþìì –)¸y,ËJh4·­RD¡W ÊhæØ-¡”yúÔ©;ï¸ä9ÏKÂð{_¾nïù¿R²¾áßh6›?:uBrQÉf S b;ŒÙ‹ñŠÔ3 hvZ\J…”²JuزXš„\˜áÑ _øê—ŸzùS6…ixûáC[¶l¾ýöÃžç ®ŸX·c¡)•J·ÞpÃôì™=û7¾êÕ/ùÊWÿ]É¥²GQ¾P¨,,ÎMŸÝ¼kÂb¹Örm~aõÀ%goÜ9ò•/ߘËesùâM7ÞýŒg]8;;;2Vòý P­:ŽÕè´ƒ4ÄÏæB,7VJCå$–B—ÙN"ìÁøºñúZ£R.%IbÚµow½¶¶û¬]kõfðN·»yçÎ…ÅE¿Õ_7±V[Éä2%'ï7ë<Š%P®ëvº]渺ъâP)‘j>?;ø³Hu³™b¹2Ül7€‘Ùlv­¾444 ŒÁ-.wZ£ví\¿îô]w3ÛòYj{ù]矯±Z«£f­ÕYƒÖ¤!–ã¸ÅBeàÀÙÛµSÎÖNž5ëqÆa[&G¿þ­[žØŽãy¥$ŸÏ¥…’B%dïKp.Ÿ7Zó8ÑZcŠFFö2#C‡9ÂÞxî%q¦Ú´ÚmaEáDp$hš$\ ®$!$<ˆB€ÑRk ”–Zv¢@ ÉWx>Wp7—)ضM“R áÆµ!„®ëBzɦ)FB µ\)-”“8Œ¢(Žz*!£†ˆa„0fõt#­•mÛ#RʾҲlŒ1ö„¢”2JA…!!y*„1€^ EiŒQJc"BÛq’$IÓTŠ´gÙ[M|?Ñc¦í~ä"aòЇ'AP?øø“ò<ˆèÿ©‡^ð'J`òS¼~Á‡\ˆ<øÿ€?yƒ˜<æ~áѪ~˜ß½)Ðcµð#·ø/Þhý©úô1Æ5|Œ¦yø¡õ¨£ñ1§ÑC«Dè—¢¿úôéó8Ðé7n°/[ôéóÄ¥ÿaøñE©Œëu»mÇñzÖ^ZkÇq,æ(¥0ÁZk!bc4¢Ä@Œ¥Ø)ä=@x‡¤:O ³Üb¶26¾^«t­UGôÄŽrµZ(U‰å„A ”’"`ÔÄÁše’DËqƒv`éG:?8dtš¦mL ““›“´ƒq¤¹| ¨¤B™6ª½V«LNØž !&Z\/Ђ:¢Ã7Ý<ºs˜t¢åÚ™|y@¥©¿¼2µyËÛa*CƒÕå¥×µB!’Ø<Á%ºí€Ú†óDkÀ9·OJDZãf‚ÀØ^¡·ÛQgóÎ=n¡‚D\°‹®ëöì΀Rë7L Î7nÝèyži6ãº.ë´ÃcÇN! BŒ±ÅÅÅíÛ·b »ŸËÊ…’bܦÎò\\*•`ŠêÍ TÊS›Î­¬  úׯ|_k½yËÔüœã8^ÁI'Œ*0!AЬ–}n€­f #!ÌŠ~»%…* 7Ýts¹\’R0›)¬½œƒ!p½R³ÝȲ~»1;s¦Z­ž}úôéÓ§OŸÿ*¿Â¢Ž—î¾k!³mÿd¦ÿMå?,[ôí¡úôyÂò¦æ}~V%cŽã¤‚3@ &J)Áœ1†‚ Œ(D ušÆÙJ5Ÿ¯s˜(¯5}Ú_­Cæd,7•Iv¡q’0+¯©€D*aR¦…|&h×à Ɣf4qmCê¸.Q vVjqÈaŽ£„¶çÅÝÓ8’\(ÐÊÜÂàè(!¬Ùè(Ý!A¼¶Z;ëò§JE¿týç/¿âi.aà{¦§Y3ËiÒY«él.W.`H—WÚ~·T­¸Í' C¡µÄ¦\X”q)€Œ0¤PÜĈ2¨´l6ëB–á–Å––Ï?ðd‚P©Z]m4F³Y`L>_°ljâdafF&þÊêr¥ZÍ0k`xa¯Ñjçr9ÊJéÄÄD·Ûµ,5‚J…:* d’v ÄÅB¾V«ÇÏ™ÖÞäúql‘u#õµv½QËfÎe¡P°Öét”ÐO 1Sj9Ý ¢„¹Ž§ 0С4SȶƒNÎ͌ؖµºº:88äº^û®ëvý„Ùlùä|¥R©–ËÍf3ëeD¹!#8ˆƒÀ÷ã(ˆ»íÁa £P Q,æ/½ôâ™™•æêá\Ž4VÏС)ˆ¼ '+•‚º–uÌÿðo8÷âËÏ¿è¢Ï|ð]Ùl&_¨ Mn–1PaËË•ËJkÁ9BPÂ.Á@ð³ ÁhËÖ©VçÓÿ|ýñã3™Bq˶gŸ}^§ÓYmÖ\×…•ÒPcŒÖ’2lŒá ˆcÃ…RaDbB©RŠKM1ö2J#ro2¨ž;­$ ȳ¨5d˜QjYR§”ßç =7‹µ†@c"€†I’`Œ…VQЄa¢µFQb´Ö„nà#1Fé$I”ÑB ¡d‡Rqxoff m Æzvˆ#aÏ¥Ú²©1DGOcm çc¬€QÆÁÖI’ „ÏÓBh)“$QúÞÜÓ½Œ4B¦JKÀe¨¥D()×Zmx̸o‡Ó§OŸ>}úôéó³à¿[XÔ¯½îEÿ‡¼îsÿûÉEüŸ}NOòzÏs>òÑu™‡^C7¾öº}?ç½ÿûîÊÞT"ºím¿ý޵~ìCϦ¿ôïì•-tû{võŸ~g96dåG¶ŸsÙó^ú[ [}y£OŸÿþÚçg iÂ)± ÀÂ(1%ZŒ±Q RD0¶+“”£ŒÒˆ¯®.µZm¡…ç +ÎÛ=±Y&ßm-Ïß}CJ_#ÇÊT†&¢Ó'O9Å\Ñ͆'‡ŽmÅ2%"S™Ø¼Y)Õæ]ƒÓ3­£‡³&«#Ûb¿pvwW—‰7¨ùšç›ÄʉֺÓq‹9¡V[˜þúoß{þ±#7=íÏ2Øò“È¢Ä)–±K‡Š…C7ÝȬܦ=“²-wW»íàüK/\^X\©­&iºÚhÚ¶-„$Ø0ˆ1& TR Mª¤-Œ¨H„ðø`yó–m³Ós…l½^§´pÑyû¯ÿÖ¿Ýu×]W>åªÐï9qìw÷wFF÷íßµ²²"5ðº^®ÈÕWW‡‡ª_Ù Ž ` =×bŒuºiÎ¡Æ £E­¶¶ëìͳÓ+q 6m­Üvèˆão;\,äW›7O6ê-£L§ég²^½^ 1êQ†1eNJ/çÉ”k-•6ÇN“pp Jr´®­5†*Š/“ìÝsVÐé*¥,Ë2ŒŽä<—sŽ 1ÆŒ V Ùn·k{€ š°1¹wÏÆ-ûnýXš;¡SÕi®Œe"RL¤<á¹ ›˜\O >rÛMŸøËwnÚuö¾s/9sæ8B µ6ïfË£SÛ(!q˜fr9w`Lú>%7ãh˜‘ ˜u˜8wËÄ•—í¿ðIg)>ûµ[‚N”aa[I“J!")ˆ†ió˜GaD¥D+‘Ïd!#m4‚(B!!D1fŒi­"ÅbIJiŒ6ˆ³²y¤ŒÉgs9Q0ƸÓZSj %… Î…6J)¥ Gé¼äœ“$VJ0Q˜Ë&ÊHÎBè^ùR+ i/ƒŠV€`F)EÐX6ÆaJ(&­U·"„cÍ¥”¾ïk­V)¥’+Ibe”Å4C`€Ž¢!¤ŠÓ„ó#D(… ™.¯Ì.,+CcQ›†a$±Ú#cv![è/¯}úôéÓ§OŸ>?ÿÂ"0Fi…Ì1̹/˜íÃ^_žþ§·üÅÀGÞzå¸u_Lç‡uþ%æ',E{q9šxÁ{^³ß“þê™C_ýÔ'Þt{ó£ÿðšÝêoÁûôùÿYUì ‹+Jib£4EÄãËC€ 4€)EÚ„†G<¡¶¥c†¡®äÙ¶[Ë¥ MüµæÉÖÊŠ"ŠB€0N4ÄoÖ5A£Ã#σP˜ñ«Û<… ³¼ºßÚ½gGÊ£°Ó&VváÎ]œ›wŠ•³Ê„¡” â J±ëúµ&åÚË€ÖE¬TdûíÆÝ'O ùÍUÏö´RŽC3ù|«Ù°-:6:ú£oh­5Ü"r©µÜX¹^f 2´¶²Z¨6“˜ÅÝ$‰2‚&Ø2šjS C"dJ‰c[V­VoÔoÞ´isš¦ãÁ‘¡V£ùo_ÿÆÈØèàðÐÝ­úË®~ùæ©©¥…™Õ•…V«5<}úü×yºB‹…/ÿù›?yûr¤hnlß3^úÚßÚ_!˜dæúàÓß»»žkàü—ÿÙÛž6ÒÛÎ}âOÿ$ì~ógÞwaîAXygåðGþäS|ÑŽÌCűG¨H­}ï#ïÿÄÍgV[Îðž§>÷|tèúï<ÓÅõ~ýU¯}ÖælÏËWDµÎbpúu6u¦OŸòòÎE£Qƒ­€ ‚h._à©ä"Á„”J%FìËŸòôr¹œÆ)ç|qqqqqžHþÞ÷¿O*%>ï¢ 2ÅÜêZÍ÷}ÏÉ V‡Vëk„0Çó¦6•‡žûŸüü½»‚ ‹‘Íf3ozzºPÌ6Û>×ðÔÝÇ=ÛÐZ·ÛÍn·-µÒJ „²Ù¼àPk=:Z9z÷=PDI«Õ"Y”©=Û3mŒÒ©"¬‘ª:Z1°ú!(5ÆptdD*ÞéÄ¥bÑŵÒZ0^>ç9V\o6ê5Š!¸X,ò(°ÕžUÎV²™L·¶´6{Bé„âÌÎ]|÷[Ÿ“ #tš/NzY R%¡aÐQ«”'wm¹EG šV»®$\ª-W«ƒB‡qxlˆ•/:~"²^F#Üî&ŽÍ0†‰¥]©ÎÝ^Þ±ù’¿øè—º¶CZ` bÐq,BDD¤<‘2MSF4b •BØx–m[Y)¥m;Q5Â8I¸—q¥”a„%H!B8ŽÓKr"¥„2Ƥ”6³1=«F  Å̲,e4¶l@.ãÅÜãœ#”­’$N’çH’$¥rÁ³æ°^ÚbΣ4M“$8v3Pì}ÅÔZsÊ¥”(!8@$LbŒ±ƒˆRÊ»AùQ̓€ !Œ襥6Æ´ÚkBð(‰ ÂÇ#c–G&øQ$•„`Œ±Í¤”…|cŒ¤FImÔÆh—R†µJ£ Ó_ûôéÓ§OŸ>}~…E\Øñ´—¼îW žªºîCŸ}χ§>þÖ½ð¥w~ð;îs^ùÎs‡H§ŒïªªWýñ5O¤¹Ãµ¬C£Ï¼æ•Õ7¾ëݵéÿüÑEòST„Uxæö»j£ÏÃk·XÍ#×}ôºÝ1téoÿö~ËkÞüéÿ÷ñw•¶}ìê-6‚éÉϼùM_rŸõ²7½b0¸õ³ù«kÐèÇ®Þ çœ ýÄcB¡Å;¾üµÓ¦réž 09þ‰?üƒëœçþþ50ÜüÉ¿zÏÑØ'_»?‡‹»®zåÿzÉS+?û—Ÿxç6ê°jùîÓåß~ã«÷t€7•I_!éÓç?¨*ö…ÅÇYX#BH"„R*IÊCIãAÚæ±ëº.q»žW*ç6®u]·V«Ýpëa—áówM åsœú±¿åü ¶lÝ,® ¶+i§Û–ró¦ýJ&v-|jãF`sù¤HºA«ÛZÕ‰‚Û|à ~*ÂÈ×¢u:8Œ„6ű!ÎòXub¢<4Ú9qz­¶P[®šl}umë®}$ñ×V\‡}÷[ßÞ´is»¾š„ÝP -P&ç)Áóù|3 ¼l#’/WçVü4Îæ I’XÌ®+1b‘š^aÌâ4…SÆFÅ|yïÎ}#ÃÃI’0Æ”RÙlfÝä¸JLHª´äbfffhxÀµí¶†Ó»ŽÛ°eS„##c'Ožò088$Ešñ¥ŒRʃ|>W.§§g$˜DðÕ•v>Ÿýæõ߇ïß¿vfqtt$ ¢F½=8\XYY)äòRDˆãx®m-/,fBâ8.–˃ƒƒ§çfÂ0‘<ív» èŒã !¤”6uB?r3Nµš%¼­ p‡sEQy  ªr‘8”ÖV–—fÏŒ”A*™.<•÷ìÂÐ`suÕs±–ztlêè·Vm·E´œÔ @ƒ¡…´"Pï>ûìééi-£ÂÈ F`yîLFõ¥µòP¾%‘ˆºÍÕÂàx¤5†b˜hN(CÇ„ ò÷Ê};¾üûCÞ‘J JÉ+Å’œ"’HJ ´&c¨]ËrŠ9ˆ‘mYF*cL’*i`'•ÔÐh€å l ”2MÓ$U½…ŶmJi’$}úôéÓçXXD™ ç]¼À–òÂ÷_uý«â¼<ôkííØwàìY dÌc—Æ7ngðá | .¸úí¿þº×þÕöNýÉ3 ]ã®;ëÀ¾­6Ü5\»ñ¥Ÿ¿âYO9'ƒànûŽÞqðöU±eóÿý—¶¼üã/ê…`Ç`óæ—ýÓ×O¿dÏžýoü»2á'¼÷ðÃg…¾ãíW^z¯Û¸Ñã¿ñÞ•Å {ó_ÿÓü¶W}êUÏ¢ìnüàŸþÊÉWìÛ—ÉN]pÙ€í•ùo¿ôk‡–Ò'å]€1ÞÔ‹ìpQßòªOŸÿÔ í§Wz<áœsÎEÊ•R“B&«2†Q[ Á9WJÅZ†‘u;”bBi~d$‰UÆÅì{ò%»™&µ™»_OîÚqÎ@»¶´|ôŽŽ¿"ÂÈÉ®Û{îP 1 Z+µrqtÖÁnX‡<ˆýÅE?Jw\ök…­&é¬v K„ü4òi´Ã޽~£…¡’Û·çÄ7¿»6&öCŽH©äí¦â²~òžƒ7ß`9ö†MS£ãF½4P ·îÜ3sâøÞóÎU!Ÿ™;%R¡1Û³cçô™Ù Ï=wjÃÆÅÅÅ;ŽÜµØŒ9ЙlAII Æ€f«•¡òpÐõ³9ïòK/!„:¬,¯å ¥VÐ:kß.¿Õ„”dh¾6¿0¹~“P¯×3…¢é%W\¶°0‹(jÔWZP`VÈ¥iÌXvzzzÓ¦MƒÃU„@Ëæf—-ÛÞ¿ÿ¬Ûß0ŸX?R¬dçç…Ï9w÷ÚjB¤cœu R+'g N?éûáäúq%T¥Tj4›«K+Bij±3sóã£Ã—ª%ÎS€E&"³¶\kw»{ÎÚ›Ïç§§§ ,g3™|>wç¡;FG‡`±ÀáR®›Ú°uÛæSGŽH•n £(Sðnd»E%S×õÆÖmpψ¤ÕnÖ–ï.V–GF×+a°Åt½V2 SÊ[%hnnjYÎ犥\y`€"«Õé"k•6g2Ù-©—Z‹$!ž )ĉ“úþ9gO¸`ë-G×9ƺÍ2Šà©ˆ‘VØ ¡e±\Ös,Š14P§)´[ J¢8ÖÆLl‚)¥Š#@˜Ä)—Эu¾…@ÇQ '‘h5r¹,„0MS)•1¦ÝíôÒ(SÊr™l±X\´ÑAdÄXJ‰1v‡1fŒI…äœóT/×Öü E¡E,e¹Ú˜žL ‘‘’k-ƒ$¬×kÈÀŒåbËr,!¢1Äzˆfrv³U·,¢”â¯ylŒÑàÇZ´Öœ'aÛ2j!€ÉRJ=æBBƒ‘1&c;’‹˜=Õv<Å´7ýûk`ŸÇ$¸áÅSW|ª¡ BïþÀmï9ø”«>ó ƒ@óã;νôÙ/|Õ+ž³·ÿ5½OŸ>}úô…Åÿ~DíÖÏì3ßüÞ¯ìxÛÄcVtÿK=BVZW„¼ÝæBíòxkFÚQ?1—È¥¾äéºO…ÓÚ^‹5p úùÈ6ˆzPÃõþØô{zÓÙÀÃúìÁ¯]{í›~_ýåÇ_]86“ÊÅ÷=ÿâ÷÷Š­´³šh×núô?ñ¯·œªEÈ#±¢ÝÔüøš!ˆúáûôùOLOˆúyÛW¢(2X–M)…pßw=×@DlÛ#äG12ÆPJµÖù|ž‡Øh4óù¼ç¸@k­õÒÂâY{ö¿çX¹”/ä2A‡Q$ÛzÖY­FýÐệªN–*γn†«´Õˆ ¤B¤žç,-4ÖjM‹¢N½™&f|ý$L —akºS¨fsEP4VÆ]8y*ò›‚iÜeYV­n¬V«߇JGihÚ°âå5FˆY2ò1à Ë]niu3[6ŒŒÎ,Ö;ÍNÒh±Ã,d³m¥”V*%¡ á†Am­©50Ƥiš!¡á4ŠB˜Q1eBhLï9;~;ãfá4Mã8¶mÛ˜,B€lQF)UR"µŠ+´2ÊHeSf”f”r)´¥¤TFC¥Ò@dÙ®RB)…4j €1Ä¢!® †Q¢QF§RZ„bŒ a„0e ÆXhiÀ¥µR!c c @)¥–Ý3¢ì¯}“Ì…_h¿õ£lþƒÛ•6…ߺþÔµ—)6 íkxðoωOþÎßýÑÕºöÐõŸøÀ¥öµÏ¿áÜîï~ûôéÓ§O_Xüo”¾ü'ú™àâ—¾ñeÛËzþ«ïùËz?°Éç¾óïνíú¾îºw¿æº/¾à/Þó¼)·§†=VÈÖ=çõ/¹å÷ÿæ½_y£«¢‡4#ð{ÄÂ0ÐÊ€–Øçþ¯?ÙVû> :•üÏÑWʇ—-¼‘©MSÁ–ûö·Ÿ÷¿¾vݱ—¼Phãœÿ†÷½j‡{¿ éÍüuoz˵þe¿ÍÕ»*fö_Þñ®ïö'VŸ>?#ú–¾+i’Ö" Á.¥išj ³ÀÖJa›ZÌ£Y`é¶ÚÚ(ÅRÆlc §áÜüØà S°‡ÆÇ='eJMi—G•r5N|56ò®»>é¢KÇ<‰ø³qk)°4¾A+fñÔÎP¾<ÝZ8ƒ‡!ˆDÌã00,‹¥@tãsG%B§i¥HTWêý{Ï6¬Öê³êú¹W\Yv0¹ë¶ƒ7ßøƒ—>uóŽ è&IÐ9v¤R©Ÿk·²Å¥u§€I+ÃÇñÍv¾RÞ³ç,-õâê µlitÞË ‡)/æ=ôÁƒ/¹ôâO}æ3{÷žµkWÉ@@,²a| S.—OœÁ„p©n¼ùö© ×#›’ÙéY©R­Y«ÙÙ·×É{fæV*å!¥ Á¶—EûÎÛÞito½åŽDê;޵,#vËMGvîÚ¶cû¶C‡ ž8qbÏž#cee$PìÈÇÝŒ›+d¥‚†K M¹šYY\JŽ  1¦ÍFËv¬f7u¼l¹˜SJ !Ä–ç*‘$¡tòÙ±Œëf¼þû “ë×UÊùZ³U,—¸æ»÷îj,¯-ýnhI1Ò~GK>¹i½Ñúö›oZŽ –“$Û žÉäçƒfmùd§Û.W†11‹ÓÓÔ²ÝlaÖ˜;Ã2™|u˜¹™É]»Eت-œJ£5I¸^†Y.³3NÖÉçò3'Žb¨mBÝBÅf*P,/ÌÕW–·l]·oǺӧç¥Ö€(Æ1DmKÅÆ"$–IEŒÚÍf3Š»óóóaè)eåjCBC? „PÍ9×Zs­ŒÖVHBˆ¢$áRJ›2‘Æ>îB€Ö=?hmW"æ1W)ÆTIIs˜e[! 2Æ(¥¸¡QJ{Y(¥žå9ŽS’UJ™maY,x"¸:I® "ÏÅ”'1p-O¥¥”Q5cŒæ †‘1 AœÇ˜ !ÔAL´Ö–E a@ØÇZKˆ Øa!Lc{®Ž4Å  ¤˜X”aŒ;~»¿öù)Ø|¿Bˆ0ÆAråGw^ü;ïûÆzµçÒÏ5¾ý–g¾rëŸüÕ¡~lñ>}úôéó„"keŒÑZ`´±)2Æ(ýã#ÿ¹@1OPa1]<|F­å žqþ*{4î×û ñ&Î}öœ}Ùžú_úÊ=Ï~ÍbeˆÚ±2<êK8}Ú^qÓË>xm¤ô†Çªè§j¾òÆQšÎÌ€¡§NºèçRx$ÙâÇfŒ2jscçlVÝ2N“3gàðU<øã³ý;ž”S¯yñ¯^8L¡ÊÝ™‡ßëÏ×>}~6ó Ø·X|±-'M 5EP+$7 ‚¨"„yÄÒ0Ƹ’1êºöêjaºÒ\šŸÛ±ÿ¢úr£S_ò['=õª;ö.ÎÏ(™rž`â9=c¹v/A‡1f¥V ãH566ó´t›íÖZ£9>>Ψ;88²B,’ÍdˆÅ „gmß>9>¾V[©Œ ‚ÇÆ4ê-u»Ý®V6MmÐZmÞ¼ù‹_øÂ“λðÎ#‡C¹\îæ›Tª ML8–†¾à¼èTÞ~ld`S"4DÊhcŒä ã²ÛjMJ‘!F*åù…Æl˜ñ[rqa­Pt¯¸äI7ßvt¡Ý6„Øš ¤‘Ä%J‰4N´ÖË+‹©ÓÓ§Ðh‹2D`,›±D‘4M£(‚j­1^61HD‚Ò©Œ¢Dkm<" %TJ)ã1ƤT×N×Z"ÒЈ8á.ÍKž „”Ý Zˆdz(SJaŒmj -Ê<Ç‚ƲÖ &ý¶ÀfÀÉ0 †ÀhƒFˆ`ˆ!µµ1Ò0m$J"¥1ÆX–ØmÛ¶1Æ(` ¤ŒaŒ¡AZkƒŒT‰Ô (¡Ä+`”RXà$ŒŒ–hQÏÖ²× ý5°ÏÏvC ç¾òå[>rÍ1­×>w͵o{Ú·Ù}Ÿ>}úôéóDá‹_ûæOSì?±Gzb‹é;eîËžŒs¶OnŸýâ§¿œý•cÎÚbxoA±zÓWê‰õG¬Ü>h·ì!HuçFö…ï|柷]µÁ4üÁó/ß–ç2|ù«_ñ½W|àð½þ/ì*ú)A…s_xÕÐ|ñ× ç_µwÈNë‹ÝuO¹rk6<ôó’úá-;gî<\ðTÔZ<~×>ûÝ`ä7¯Üà•6¿ü׆_þù·¼½ð×Îq’µùîäÓŸ¹ÃÞ1 ?ñù¿ÿBî)»ÆÚ|Ðߪ÷éó3}Séó¸¡ Éa'À§ˆQ„Ö MËr ÐÊ€@¦¨Œ1PS'cŒ‘ZAµ„ÖTñN;š_hÞSÊìÞº®B!!Ôuaû”XÅ¢ Œ :]ŒM˜„g|*aËo©¹YY® ‡ïùÁw”íæÆM¤]?BÊx*".q*U¿ÕÀ¬ÖëõFãâ­{…äb˜X--§¶l…-Xôø+ÄËfŒYZÕPñ8 Ã(JÚ³³óç_r©ŒÓòȰëXèrµrç­Gs§ãTUJÅñÑ‘uë7Æ)wgxh˜`$ešÉeB—^tA«ÝœÚ¾Qž-ºŠM×i%ffçs¹’ìÁ £«µexÃÆ‰ÿß¿ù_¯zå™é{6MmƒöwÉË~èTýNœÉf¨- 2c•Ñ¿þð_/·ºO¿êéC£CÅ|¾”Ë­ŸÏ²]´-¤Y]kž:u*—ËÙ,[-—KU?j µ®(޹0 »Åb¾Ù ¡Ý0RBÂ0$˜åò®ïû«µz¾äY–Ó¬­NMmø‡Ï}î9ÏzöÈäDci)¢ïû›Â[6¯AX*•0&Rp†`³¶œÏæÂ0ÌvÑì6ºÍB1·e⢻î¾uµ¶Œ™…© ,âå²6í­-Í(bŠ»a×±ó‚+¸mÉn£îG¡ëe††×¥`8cY%Á»q·£¥Òx^žx#Lè׉Å2¥,u‹R@¡<Ã9sÅdqHpÃMzù;]]Y®Í¯u ±!±”Š…VYJBDlªb©bŒÁõ"œDq,Œ\ ׄœs j“F!$ã{£µ(- €qqŒ±„œóJiæŒÒ2äÐÂ,d0MSBH”„ã8Žã41¥"¥5€¨ËcŒYˆ€ËF!D0ÆŒ8c„p’$%·ó”K޼²RP¬5ÐR©0ÆZk-ïuÓ†) Œ“ÍeÒÿ½;š.; Ã~ös÷ÞûÝ¿åýöeöM£m!E`6ÙN0eÀ Ä©à”S•²'Žm;&¡’ØŠAPE0Ù£]šfF³óíÛ»/½wßíìùãdFl¤²Tsõ{êö½Ýç½Ý}îsÏyŒFˆPJ…Ð!Œ1B# !ô+„PJåÂ: 5J©Ùl1Bc¬QN냬‘?,­µÖhPW*ßd|ùÁ3¼4À]øø—÷áô¡*°X©T*•o ï<”Ÿ;wžröµqà7òÜ3Ï ÿÀAÒ·G`qó·ÿÞßù¯ýuæþå/}×ýíŸïÿoýðYé Q÷ìr„!Уk_úØÇ_ç¼öÉGÿúßúáU!¬¿ågÿË÷ÿ£_ýè/þÂï>ð¡Óï8Sû†]Eæßûó鱟ùpyX<üCççû¿ôïèOÍ?ûSÿø©øWûÍøñ©ñê«ÿÔ#ï=g´1æ;`Äúï…-H}¡Ã>ÿëÿÍßøupPk/Ÿ{ÿßüëúÀÝ †àŽ¿òþró—ÿÙ'>òwg¢½Æñ·ýÕw|ÿ¹Ú‘ûŸ¡÷~í#ÿýc%p€ÆsçWâ*«L¥òMùxVÅoq;1ÁÌÚ:À:e²² „3QZàˆQ¥, qÌãbÐ(#L1ž÷—¯ú~'Dzt¸Ðá³þ4uAŒ*ʬp–DIÀ8AbD ÌËõ[6Íͱ© IDAT¼c«ÃýmÉpR›C–ÒûûÓ,o5›Ú9Šº;¿ØÛÞã îîmåiÚžk"芬äÝëíYëFþ*òÛ»<ŒîxèAäLÕ×oß2ÆùÜ»rõb«YôúÍvÇ|ÖÚÕhÔýQq’pÎS¡æuÏó¸ÏÊ2ϳ¬3× ‡uß7R´€Œ±z³QŠX«Õ0&”Ò4j#;µö¨?}û;φZYJB(Š’ñt%ñÍ[7¢ •$Qq­…uò{ßÿžk7Ö=N6×Ö}æ]¼xBxâÌÖh„¶7w6ÖGçï;Nr®l4eR„à›×¢Zg<-­,&õ†Öz2Nî!„ ‚B¥T–e'N1º„[gÊBÄq´³&Ó²PBÎf3ÂP«Û‰bpf¥@Œk)1‚ŒQŒ‘_¯_¾ðj=ŒY"1ÐízMJ¡8yæ®W/¼˜çy³औqÒîïï%¨( „ˆz··?×îò2—ªlyÈ•`ýö•ö "Øa:ÖÃcˆRjŒ‘£_k–Øñ ¤Em‰ 9 •²N[ÊhQ–„b ˜ÖêÔ±îr·3ß\xõºÖd6‘ˆ8ŒqYQî{sÚ „DYJ feYJ+Àœz e”RŠ0ÍÊcx0L1ÆXkRhk-¢B €qÂÊ1;9&!‚¨ÃX%µB¤A4ÆF1ÅR ŒEB¥–"„8ç!c AØç^a (!Øg!ÓÖX¥foBÈ™¯µÎóàœÃ ƒÀƒoEJ)ä#ä ŠŒÀ:`]YæÎ9ÕZ£µ¶RZ£”R”y3Óι*ƒmå[¶Ž4œÜÞõ¾+T?ã•J¥Rù¶¸ð៸Ôö?âÌrtÎ9çRYk­•R¸ó<ŸÍfÓét<F£Ñh´²²òÞ÷¾÷›x­ë¬±¯¿A„ÎÙ?¶ÀB„ÕQÜëÛ^Û}mkˆÐï)gýúê̯k{ãìðßmôº½|Ý>³Î½6]B„ÐkO?¸Øù6?½ž{ñé·?ò]ðëz̽î´úcýüúuÂëûðkÿguð; 4v¥òíi<ݼuýıÓUxñ[ägÿëŒ8#Œؼ„ŒðcL A @MÓ>ƨQoÃWk·IÐryù„˜ &³1 £Öò¡—û· ¤Âçfk4Ü÷ÂQÿÓýf0¨·×ç—š9‹zý]m¬1q¸´xRX{èÈq[H^‹8#½Þþ@—ÒÞõàƒ~¹ûžt8Æ>Ÿî òFãY. Ä¤Ì àâòÊÆÆÖü|7®Å—/]ûîïyûÎÖÆ`{ÇÃöüœçy”ÒñdrôØêh6͆yQHmÜæîÎÉ3§o]»N ¢ðüù3Z§ÐÉpÒͦizöÜ©0 ¯Ý¸I1ŠxÔk)—cH¿øÙ'žüòW¾÷ûßDÞ±cG?òÏ?úÐ#o=s籽ͽiž¾ûx§Oóx¸³¹ŸÍfK‡fi¹¶¶§ pÈ QpN1Æv]Eq „ DÖÚfÍ }Þh4ÆÓt0™tçZÛ·÷šE€ìc»ó®ó+gNŒvúV´±v«ÞhùA4N}pê©ųÑHÊrçæ Œ€³w<°·?Ú ßß¹©µ^>ršª´ „/_»~À|àh:ñ=RDþx<ÄÌkwº+«§‹Òò n7[—ž{Âè´9×GµyL=Œ¨çS! (TÒªyQͪJQ¦C‡‘6Rˆ¨F,Šk1½ýa>˯¼¸‘‚À)vV§…B2Yм(ËÒ!kŒ5JP1DÓ¢ÐÎæ¢D­QÖZ±sŽ{Æ¸î‡ Ó0Œ¬±#uo8:ˆ2ˆ…ÒZ«¤ÖÚ9‡(AÖH¥fEŠôÇ~@‘çs hÔç"Ƹhk!FÆ¡r€`œ„QV«L!…–CàÜ:ˆ˜‡!’R§'“ @) tÖ: žç1BÖ:LÉÁ6Ï3!3g¥,Šþ`_”€ÎZ‹1˜"„ÖZL˜µ6ðüƒAïg~ç#_wÓ~sspéÚ¥ý¡ýúâý­ßý­ÓÇOC———ÿÄ?õ©O­­­5F£Q¯×“$‰ã8ß÷9ç”Òƒ9›_+¯wð1J©²,ç“ɤ(Šw¾óÕÄ·œ^û¿Þrìçž7ÖÕÿügoýú»ê~ƒFŠç~áÌC¿´f,GþÖs¯þý{‚j\©T*•oÿò×~åܹóŒó?qÆâWŸyzùðªçûµZ-Žã0 ®î¿áÀã?ýŒEˆÞømAˆ ~£Öo°9úU˜ßè ¯k{ã}Ý_¿—¯ÛçÅ|¿áëùvßà¥ÿÿhoØ]ß°1®>À•ÊüÇÀj¦Ã·Ô¬1x. ^h0B+#µÓzšÂABèûÐÈ€ù”pkµÈ!èœSJ¥Y>ÚÛÿ_/_¯Õj(É'Ãï^9Õã ”Ö7Ehçeƒë„ñÖüÜ¥ý½bªTow6¿ˆ`‘F¼òÔ³˜¡Ù8MlÐ^nËé(³³ˆžÇ õ9BÚyR ‘Àª0iyQì° |º»»©´XñïÞÜÙÝ»ÖIˆù¹˜A¨„Ö±ï…JR©jIcsg7 ƒ{î?û/~ý7¸û~J,çlõØ¡Qo€9ª5’Û·6×o¯u›5k¬ùÎÚ8‰ò¢0Êìoí¯,/öúcgì[}(›׮ZZf5¯ÈóF£ÙÛÝÞ ó²\^Y¤”ŽÇcy«§öÖÙ¬ß[ý·ÿï'õÎ÷žÛëÏî9t8/Ò·¿ûíq-ÞXß¾}cýìÙÓÅHt›íišM§S/¤AÜ\>´òâ /ÏÍ·Ö·¶î8wþÚµRÏce)£((Ë’rêœcæY™çˆP8Î)Å$̦3©%Ä䎻ÏI!‰v^ì=÷•gby÷ã¨Ñnåã±Å:ˆ)e2?O)÷÷qñò«ï~ë#–v-ü7}î­>¼»³½Ú8µzôèG~åWÞ÷ýß c„æ¾?(¥kkkƒ4Í£(âÆA·7·Ú­Vܬ‡¡WÅÖöž5T¯7¡Ö:ç@.Ê˯Þ&ŒÂ~êßüÆö`ë¡ûßú–‡ïû§ÿäcï}ß[¾øé玮.­žGØÞu÷Ù'¾ðtD±ã…ÌŽŸ:Ê8l¬ÝÆJ¥NŸ\úAàõz#£Y½žh­­µR¥T’PgAQË++»;ݹv…E©šM<ÛÛ,:<ì §Ói”Dõf£œŒT“Á°Õìpß³Ze³Æhwc’ÄqäÕŠ,­µ|K<Œqø“QÏ:¥i\¯K!(¥>÷öv{õ°éQ×­µã~\”2ªÕ9çÓÙDjsß}÷¦ÓE²V÷Æ£±R¶µxX—raù”r:{RqnünSK5Ùëy¾O±¦×æ³¼œåYê'¬Uó…³´_äÆë++í¸[ßÞ»Lk]HÁQR3Æ£eY2À¹±8JJsí,É2! ­5 . (r€1‚¤–ÄÈA‹ ïû“Ñ€s_)ƒ SJIUà´1 HJ‰Jè „ˆ Fá:kµá„cœsãéHKEqÖã„¢”±&{m.žµÊÏó „²RI£ôd:–À–²@h䬵„0gœT¥‚È0Ú<°øî¿h (¶/o]žÎ&ù¤Ÿg ñ˜èœ úPf]<ÄýháH7ö­,lìÞº²ëdaÐ`K‡VÂ0ÜÙÙ*òLª”û­¸A1i2Ê2m·›ÒÝíÍZ­¶y{cqi©Û^Ýêmôz{õd1H¢Y™Õ»m7IŸ9UβРŸþÒiQ¶–aüñýñc§NfÙ,¬'“ÁtûæÆƒoyèÄÉ“Åt´¶¶FÖjµ”RÀ¡Z-±ìlîSÊ…’'â¸V/¾òj­Ç‘Ÿ—b0v:¡e+i'µäúõëÝn7‰xÔˆ®^¸1ößòÎûî»ûgþÕïþÞÊâÙ¿öW?ÔßßsïO?õôË/]zèчš>øÐ]˜á0òF“©’Bº·»ß®×=ÏËŠSrøð©íýÙ(õ<Ï=­d³Õ( †a–ÍcA\¿~£Ýn@D”ÒZ*gm»;?š ›Ý¹ÑxŠPBÕêÍv³áŒI'“ašÄÓÉØ”'8D#×+Ò—_¾\¯…§NÊ%Ã$N²·eβ ãœú> tnáÈx°/sM= œRt—æ­.³lVf©(f~œ` }Fya…áíVFq­žÂsa&qÌ•²D3Ao¯´ò¢TVy„R%jaЙ•¶{#ùëxuRȹùF³YëvD9JƒÒHà 1ZƆÊh€‘sÎY¥Bÿ̳ƒÉxaqùìù;ÖnoÔëõíõÍÍÍ÷}ð†Ãáå^,EÙZê@Ã0TÒäyÎït[»»}‚ÉïÿþïÿôOÿôý?´¿³CBl!@è;%cMå;ƒÍv¯½ôùü·å¿­-¨½ãüƒöZ ®+•J¥òæP+ ªX©TÞœJ‘gE¦´Ã„QìÑÐ9…„¶e1Ì3Dh×=Ïc”0EœçÅQ|÷ù“Ç.4"NÅXuF0IÓ)gxÖß÷6’Û{½°ÖL–Ûaã(T“Í­[˜rË“¹E:AßkÎuÅàú¬?ÎóÔxf2¿víÚ$›Þºq3í÷œ•VäœzDÆÊh#YXÆXQΚõåB ! í¹÷<æy„" Âêbiq©ÈÓáòâñ( ­ØAfgÅõµ‹µV{Üu:­£gŽSÌÆ£ÁñcGûk[“0ž_ZþäÇÿíù»ÏI‘.-.¼úÊË«‡V:­Æ8O9|Pì"Ÿåah­…TóÝ¡œxÞ“O=!à”]xñÕƒ0Ó{ß÷®µ[kívBÈ(Ì3‘©çÕs=}Ç»ýƒß{ìä}Ñxl4xöÙ««Ú\»zëèÒüîæäsRú©OîðÊáÍ]!T\‹â8j¶ZŒ2 ôã?yâä «GgNŸxþå˾~õé—Nœ<ÜéÖÇã±sv}}`쾜Ng³YY–ÍfS ùA‘Oã$ÜßÛë̵‡½¾È‹âFw®‘ÄeYίq…xæé§<‚—»q%Gƒ^= Ãà8¡xgýz³^ïíɥʵWº]N. I¸ç‡a£Ó¾øÒ³ÝÅ•®è4kÃÇïÀ>ÿÔãå$ ~ëúËõ$îtnFµnÜ>Êb¥ŠÃÀi3ÜÚ(ûq-ö¢8iuÒ1CˆANeìcˆâ¹.²n6gR QîíåÄÂ|ý®cËR`ááÑ,½vcÛhÈ1€V@bŒµ¶Œ1Œ±š¥ŒÌBQb­@AƒÀ‡"„¼ÐkV%c‚%@ ³À©­aŒT‘RZkóôµ%ÌÖZ„ ÔJKa„0„ &ÚYˆP‰²”²yNŒçEBã ÖÀ¹­¢`m}Î=Ê€u~À-”RFˆµ6Ó@H 'c ˜çBA,0!ìçyqC„%E6ÕçÅh D)Daµ†¤³1ÆT•Aà‡˜28pWi + éã?uü=¿Ñ—… ÇýžÎoÝõOŸûů~Ïû?úºFœƒáÂÙwü…üäÏýµ¹¯Ë«eЕJ¥RyÓ¨‹ov¾^ºòê¹3wT#ìJåOÇ9÷õ-€?Öèþh»×ýùÇÝŸæ0ÖÚk7®„aTM(þÖADAh3ÊBH …Rh 57¦,Ë’Áð€{ŒùF1A‰)óùv `ÚÒe!Z5»5-§Ó GL±ß ‘K1Xj.4Íþöe `^wiéÖå ˜òBÙf£±±9 ±ÍqÈㆴy^L”R$Qmwëf)…v@j'”4Æ¥Š<‡0/ "濽vãÈê ¡gûÂn»#25èí]½y•Â8KsÖ;s‹Ï>ÿ…»ïz¤·¿ß™ëDµšú™.êÍŽ—Ô•ÐûWn}é ŸûàOÿÜ…W_}Ï»¿{ZŽó"íú"`}ýöÒÜT@ˆííîµ­+—¯=ta ǵzc¿G0tam‚RëÁtÔn·÷vw뵚–òöÍ› Ý…ýÉà̉£Ãþà?ÿ™?wýê°òÚ•é#Þû7~þüùÿâ{ýýÅ¥¹A:<î¤*òõµ}êáÛé¾[GŽ...wxÌÍw¬-…€À!d:Öëk®^º®ôr·»4ž¤a-/-‡}LëÃñ`ð}?Ÿ¥cÎ=ä@‘fÖZcíl6£”fBB£FM‚ÙwÞyùÂ+{Û;Ïó‚@ßA˜t6¢,žL¦ÖZ„PQa Eæy,©Å³t”ßÊÐQ½yØcA>ðèw½øü³;·WVVö·7¯îmÌ/=S_Èû¥€(ÊF»M9•j:-†…Í,6Q}Á8rQî:FžC ½Ð—eɬõ(ËÂô–XŸÎ'èÞµI©”ÆÔ"+JGpÝ9iŒAˆ`F„aB1A„ñkEœøZQ?Î9rP)EÑZ# D!­„ÐçÜA™i¥ÔÁ:eBHY–ÖZ)%Æ`"c„­Ña„°s6ç° ‚žµ!!„qÊpJEc,t€ 1$à ˆQdÕZªÄ@ˆ­¶A@&Ó‘²6ò#J©1Æj-‹£¤”RE1Ž‹¢0¢@C?²Z9ç€ y„ÊYõXùEþß›é‡_×Fn3ýo´9<ÙW¿Û•J¥R©‹•7‘ÇN^¿yõ‹O|¶êŠJåÛM³ÑZ^ðw¼ûÞû¾ò…'>ýôWÓ2?sîØÉ«+ËËb6Ù½þU+s Œ*5n4¯[9´ÅŒÆuh}; çêíN^Èc‡“Më¸%>ârÚß8“¹N÷å6› °f#D‘é@Z©ÈgÜQ j›çå=÷?ê…(ï¥Z%Ñ¢Ô¹KËç.|ê“GO-Ô™öÔÉõÛ—”i–Mg~-)Š< ëÛ½Þ]çï}úñ/?õøã§Îž½ç­<û…O{q¯®¶`ÐÞzÿƒ›Ã^àSx‡ë ,ÕW^x⡇߲³µkŒa1c'3 КÆñh4:sêôæúÚ¡“G嬄¨,…@„d³é=÷Ü=ìu©þð>÷ýxûîÚ™ ÖMûÌ~õ£¿xíʵK/]ûÊWžXZZïí5›MHõÎξîïzçê±¥R¤qfin•;|d)ËÅõk·WŠCÖÛç9,&¢ï¶ÊYž,Š’û<ÏóÕC+/^ÎÒBkŰc„c&ƒ~½Õ!‚0À”ô'#?fI³Žµû›M ÐS_ú4ǰ٬Íf³8.Zvà7æ»;»»Ói%ñ¬ˆkLi™Ž'à÷ýÀ‡ÊRŒ»iš¾òâsœ’£«'OŸ9þà÷}æ±Oûµß‹œ*/¾ðéÎÜ¡äÈ)ÈpØ3´[m©¤Èó™êMƒîÊi„ùx8ãaPoƃz= # ¥Óf¡ ¯ÜÚ¹v™cH”±Â”Æ9î1 !@ä¬sÚ@ç)bˆ@Nj!rÐZ«ŒeŒÖ‚Àó!„˜ pSZ÷}ç„ÌCc¬µBˆƒ”cŒÖ\m­³Ö:cˆP­µQ!l à~€)sô½ÐZ«”&ä °ø>8Ä µÆ¡TÈ9@Qj‰¶ÂpÄ(&XŒ`šOÖZkë\.rccb4˲"O•ÓÙ¬(2+…1l¬ÅiS:i¦{3„`Ö1Æ\…º»<•77ˆÉ]-‘êªR©T*•¯ý,V]ðf?=uâlÕ•Ê·åõ €Uqo¥À€Æh¥-„¤”ZJa(¥P™édDQ©=s|õÑû|æ©gÿàsŸí,,Þuׇv…£]™î<“a@hž–8¡Øè¢ŒQ¦¥OÃi11ˆ!†•bÜ3¬¤.ÆSî@>Kƒ¸-•`9«1p¥Y–; )¢I£ ´ð‰µVF±Ç÷=F²A?í; ǵÓÐk,5ýê/ÿýó÷<Ô\œóöîïy×$KÍÍ_½zõб#R–›‡—W¬6ÆÚv§Æñ`o8Vò¬˜ŸŸMÇoôm›[ë„ãv£9ž xR³¦'Q‘¥“q¿œ q™‹Iž¿üÔÕ;ßrÔ3 åýøö⳯t:<ðÀC=|éÒŠãäöúmYˆÅ••atëöÕ{ï;¯Ï÷Yîz1?úøÅmB< ŒuÐiçŒ1¥tHÓ(„BBƨÖ×V.LK´Ö2Bê)SŒB!và€³J[ˆhÌÁ”@†Y–eŒ1!„µcìœ#„ ‚±ÖZ ÆØZB(¥=ÏCYk8¥„L©1Öçœ3ÖbB „ÖZÝÁF?ðœs €Î9etEƘÞ`@8£¥(•y‘:c!„eYA`hSö÷g”R ”%–"l¹oŒRÚAcdð¦#3`«°b¥R©T*•Ê7#¬TuA¥ZhY©TÞœÒ,%˜Ò<ÓÚ"Ê8bªºÌ8cVª™Ê3™E4~×Ûß5ØÛý­ßýÃNkéÐÒ±F3ìvó5HZŠ«>#ʦÌ2Xðé0˜[æ PF9kôtû–Eh!£FT_XÙ»þl4³ÑÚx2à~Èx”b’ªåÕ–šíª"/r‘¦ñ|#Ñáùs<ˆÅè¦RF(`凵•à°Ôé¬(yÜ-”=yâìÅ^¸¼õÄþÈ_~õÒó‡–æwvv¡F HÃÀgB饹¥ñ¤ßm/Í6w€)XLßýîwÊBU.ÏÏ=þØ§æ› ç¸÷Äâ‘—._zâóŸ«wºI³ù©?üäû>ø}”RçœÑ¦Ýn÷w÷Š\/ÌÏE¦µ½|íjŸÿüç›íÆù;Î û½ZRõÒ•SçOÓ€@Ì q8díž»ÿüÙc§9 ³ñd«ùõiv#g;;£›·6?÷™Ï>òÖr1£­6fww8˜¼÷ýß-…D„¼ð•¢,;Ýù~º·“?¹Po¶T.»s ‡\½ž{åÅ» ‹ÙÆ"h?ˆ|îY¥fYJ)iÕ}BQ·ÛÞÙÙjÏuq;[„Ñv»)e9í×¢ˆ2Vc)Ä«/¿À¡ ²ùîÜ›Wõz3+ c¶ H‘²º,²4M!yF;úø“_äדF½Ñ…Ï/tD²”}ÓOÚͰÙö}XŒS+åÚíF/=µzâ\§»4ç´êͦϽýA¿Ì…1½¸Ë¯­s ÌcÌ`ŒŠR™^À¼s‡âk[g!…@#¨œ„Â…_ã…ÖÚiƒÀA¼RÎsRk÷k­sAƒÖZàœuÎj£­a¡O1±Ö"‡´1!¥q®”RJ©µ>ÈÑLQB"Œ–KOfSè@ÇcBHè{Î9JišçÊ”Ì#Ö:¡ÖÚZ£¬ÃÎrÎ!„Ê !:˜ ©¬¥”Ò ‚QJì0K³lÒíYmÑÖrà„0ò1Ei§ !À ”RŒyBBØÁ9¬œÃS€"„òïô7Ù*+•J¥R©TþÓª‹•J¥Ry“„`D!tŒyÎ ¡”3A‡œ“R€B*ÆÍO?=×h ”^zñ Ç%ßõ}·jѬ·cd.Ťœ¥Dkj-F^ØYÕ[1Õ™*Š (€¨mé\Å‹ !Žùt<)Ó©±tîȱÁ°'³2 b Á$J)ŠR€=ϧÌ'”SÆ &ˆù—$ŽÐNfSëŠÁ 77¿Â£Ú͵[—^.ÞÚºyúôæžÇ½1ñ#™ei.çæoï¬mnÜ™ µµ Z­V#ÜÊâËO}õ¾ûî)¤9u÷ioTó‚Ùl6¿¼òüó/4ZMm ƒ,M§œq!D- òlj­‹Ãèæ`£^¯{”5;­( rÛ¥&“Y!… æææ¶¶o/,/üÚ‡?ü~ú/]¼x%iâ_ù?>þÎxo”„ŸéË…’ׯß\˜›}¿(²þ^7ckmY–¿ûÛÿúÜgPÊhˆàîînFMúÃI¹S,´ÛXcÔl6›_ènllgÓYs¾£­D(eJYPJµÎ9í¬EÐZÛÛÛk¶“Ã+ýýç¡( }-Užçãz­väð¡W/ÆqœæYF½^a%¢”Æ~¸mÄœ”xZkJ©3RF^‘Ïžºô²çyÝF;£ÃGWëõ:£ÞÒ¡ÃÖ¡(jb"€?ñ@>Û½råÕÉp|ê| ¬QÚt:s­î|™:h¤–"ª'á¢,µÖAäCtSŒÁr;覽Ò:œp ±ô` ÆØZ{g<Èú^Kë °gcrÐþÚzdàŒÑΡX'ô(SΔRc Äb ¬ÕJ!k1DGq@„’$A&I!TJˆF“(=Ï3F#)¥žç9ç”R²!HJ tî p©µèµ`¨³–snŒ!Œ3†A”ç¹ÖŠR†„­2AèA­µa€‚Ðc Zw°ìšbæ ÀÆAÕQN½ïøA|µ·R©T*•ʷؤê‚J¥R©¼9YgÆFk çœ@Œ¶Z ¥©Ç-&uÂb/aœ¬®®%ÑÛ8Õ÷Ó-W”û騧ÀcDÍÎæq+-˜9´z[)Ò¾ÊR!©/5‚Øæ9œHÊG3L®»¾Õ|ñÄÂÒáÛ/<Ïò“NkõT›7Óél–´æ#„ûƒq-I0'ÍØßÄC/HAãék)KyäèÓ\dû{ÐÒ\yÛÙÓ£tRrëÕ«BäQÒò9xæêã¼íýZË W.¾í­ï_^KâúíéðGÞ¡µí­ß |ÿ̱ÕÍÛi)=„®ÝÚXªµÎß{~®Ñ™9xâŽÓ#d …È~o0 ÎÍuoݺ=™LºŽÒc< £8PBîììÝy÷]'Ž’qkìõ«—=˜Ùì=ïù€œŽãnÔ[þäÏýåºýÑhw3.ÏËÿîú›k·Ö¿òø /]¸úóÿÕÏ>ù¥/†A] !¬Õæ._º±±¿ÿÀ}ç—æëÈÒþ~ïØ±¹W¯oRNnmî4â8ŽB)gû ó¢Ô>#~6¢z¯×[Zž×Òä“Ùdœq47?7è÷|â¾ø©O¾ïG¼ÝnÏf©P%À*Å)—RYp\[={×xoW*uôè±'¿üå…CÇŒÖišú^  ª( ¡Ç¹Rj–âÇþbø‰Otê-d0ö ¡S@”ÅŸyl~~1Ÿ&Í8I‚Åo&‡E^ŵ‹/ kzq7…áÂQ€™+KUH–Œy¾ï;ç¤Ð”RÀ bµåø¡û>yaå9ñ)FÔHãyžµšlí¿«Ú ¶ÖI)FC†‚ Ïs!ÆRXk•ÑÆXãBBÈÁYé !)¥¤TZ;­sî`óA°X ß9ÀÁ[ÕZYk!„C¥´1F ¤”DÐè ZkBˆ”“©”²˜æãñØÐêtˆÇ=F’F];K1×ÎÆ‘+E*¥DÖ8cÁÎ9‘P æÜw˜Xk¡uÎBб¶ÈÀ™ Vß•J¥R©T*v¨ê‚J¥R©¼9 †û£Ñ(Ͳ¬œ£ pXm’$I’0 !CÊ SjJqw¡ÖéÖŠY9ûû}'M4@Š&ÀëìigÂ#GêÑb:Ú‘ÅX–tŽ$Ýe®J‚нÍæa5‹9÷£Qëð²Í&‘ÇQ˜LÓ¡†f8LÆ%ò;ƒÉØ‹# - ;å&I%fUJY˜¼0Æáao_fSÀ‹¯xèHçûß–ÔÂZ=îÎÍEE¾v6y&hk{sgxúÄi†h³Ûj/w!·J™,f§”e¸Õja†¯Í ArtccC„ñ0Þíïõövvw¶ö÷÷•Ô ˆã$ͦ'Nœ0Æ8g¥”„ LPšN···´:c ‚D1L¿ï}(¥)åÈ’½½½§Ÿyòðá£I\ßÝÝ÷¥ÐZ „Z(YkÔWOœ:zâÄò¡CB)€LÓÁöíÑ`+/&>ÅN‰|–§ã¬È„³!òGµSàt:¦´~øÈ2U©TgNÎ]xÑvŠÖ}ëÆ»?=TfŒÌÍŸrƒÐq½cÇ›8£Cn¥B+)„™1B+$‘ 5ÏÃæJ/VãkæççÖLO¾õ¢óoúÇÏÕÇ'&×mä¬ß²#í¬ô—æÇùÚõw—jåé©ÉB¡°¼¸X™\\\¬Æ«¤Ö#c^\ž©UëzZçŒj×/ËÕß~Íëÿê=o³ú^©4R( ÷?ø`±X9rüåEÏóÜÀ 1”žW,‹ÕúˆƒR¹ÊD@j ì,žéÍŸHòÌ/”ëk¶AÊAic°– ",–\#øÂŠæÖb,֊沈ú±ÒZJ©„„!JÄÈX‘sL1Ä;Äc4`3.„’RJ.²4NÜ4exÄRà8Ž6Y¤´2F®.„<#„×aX=æJ)‡j­]$Y&„Ð\c,°QB´¹ÐZf†j©&áLkm-Ï2cŒÕÆ1ÆU†ÆŒR¸zŒ¢6”RæùBÈ‚çKB¡R+k-„€s¾šüš‚1¶¯¾puI)$øáT˜\Ÿu›H£­Ò@Y#µ‚Æ8Žã8A(I×u¬ÒÒ Q1êv³j=諼2T#Ø:ÌÛÿàL”äk¦ÖÕÇ»íÅB©,…–R‹•ÅÆÒÄt±õ…ƒ±5ÿô…/<ùÊgt»]mx}t4Ob­%s0úô™§ài!ݰ µ¶Ccûý¤=/PJqÎëõ!'t=ä¤B" yžVŠnÜ*µR«ÙIyò‚²ëذ0üŒ«'…•Ÿ¿á†‹~îÒ£GNnÙºáà#—^þBä™#àÒ'\xï{&§Ç’$~þs_tÏÝ÷Gq\©C Œ3gNMO^”óìø±¹³wm®jk(vÚíÈåÄó|ÆÒÅù¹\ð,åµZmey™znÒïû~À0ÆZ­¶ô¨ïzYÔ×y&´q(-”ʙٱÑñ»ï¾k²^[n,­™œL’ÄË9gŒäyžçŠQ˘+´TJl6`5ÁˆÕqÚ i -VD6ªu»n'Ú°n= \ºp×Sîð¦N§Q«”ÛÎ@*¥´XkÓ4ÓZ÷{=c-aŒºBd±BY1”R€ïû”R)µÖZN)E”£1°ŒÎ9@B!´Ör)”ÑHIž!Ÿ9š ­ „PJ‰Ö`!FÌñÒhh¬Õ"„²Ö`‚b„ßËÐÚ€Õ 32×%c]Ï5غÄC -£¹1ÐB (!DJ©µv0¡9ŽÃ³Ö"B1Z[!<"{2v1„A¨€^íÿMƒÀâÀÀÀÀÀϨ‰Ñu„1êxaPÆäi–ǽ4I«-&AP`ÐÖŠÕMÓk.¹ôÜ{÷ï=ÒŽãxy±uîyÛžö‹—æí¦ÉÚ*í¨¤'Ó6tkµM;)i ÞiÎF½åÖ‰3ç?÷ÚþÉ…„æ~/껢ºa7J¢tyqê¬ PÆoo´>þÀEÏu_¿ó¢K¿rê°ÊsZFÐje½ Øk5ü°Z©ÕãNÏ@™›¦i±Zm6Û¨wž»íäÑ(ñ¦7ì4iÿæob®ë¼iÛ† pn¿ýè•Ï|NÖ尿6Ác„a":â¼ÿï:ÿñìÝs?„`íÚ µñ)+âRmXñø{÷\ò´gN¬Û†!rià•B¿pÛ-·nÞuþì©“õñ1­Ì†»Ýƒ¤½ÜH2¬TÊ"ç¥r©Ÿ¦Ì/l9{çÜü™ ÏM“$JóÅ…¦Pn§OŒmùÌuߪßs÷ýÚ ÀSž_«œËöïÙç‡ÞØÄèë^÷[œóóÁæÅ¥ÖìÜR9¬çy>VñÝ`ÿþYÎy.øñ“'Nœ^>ëìÍÖ¨ fÎ,O¯™X³fò¾»¨VGî?Ši..ŽŒÔµVJ)äû–ó‹žtéñÃGvœ³ëо}ó3'¹pt\"ëWËP™Ç]tñ½÷NŒ­f1€*±5ÖZ£…²Àa¡ÚH¯ßÌráUªJi 4Zò´ÕX|ã[Þ~ðàÁ»¾u“Q}¨*¥$Üuç7+åÂ3ŸþRæ‡ +Gó¼·šJ©N§Çh.sÁS=V¯ !k|X€*aTP\ËO4ûõY¤5TÄ%•‰ Ý_4R¥Y¯ubÞA(Šªg¥3+§.{Öµ½å#B)Œ‰´–ðBb-äJ`Æ, Œ±$ˉµ™àUJ„’#cݨ1››mÍÎH¸UåZÕóÜœG—_þ”»ÏþÇ¿ÿØx½kÕo÷ö9T¢ÁÑã³8tç…ZÉ ]@YøQ&÷=ð@se% *Ë\‡rÖq§QœeYžçJ©jµÜj5Ë•bÔèµ–›å¡aŒ#Å}¯Tœ[jÕ’ Ä6mg̱÷Ýwr|j\Àtë9“‹g×­›†·©3\®wZ’º±p¨:ê¬Ùi]ÿ‰¯¤i.¥¾öW^úÕo~edtle™Ÿ>¶TŸ…‚©õ³7¶[I’á€í8{GÔîR†K¥ÒÊRÓažR*Ë2 @X,tWš¥R)‘1óÝñ‘Ñv{©>:"rže©’yfE!¬ò$s˜[ªT¡¶B±±P)e´ÃPre­$„0Ærž–KC„%Ä.8$·.Ì/íÜqÎÊÉùµkÖ.,ÎÂ|—µºÙÜìâÿü…g]8<:à0Û°hGí8в,3i®Â2¥»ÅPÎô‹E­dÒ!AŒ…"ËÝ ¹t]·½0K &•‚cüézµ\œüò3ã,å”’¡¡¡nÔK 9GaJ”1Y–)!1DŒ±Õ³•RJHFˆG˜RJ=<µŒá ÿ#_ª~fÙ~¯Ûn5Ò4‰¢(I’,ˬV”RÆ\JDY@ˆG™ºÕhfIÏ÷˜6Bc"Õœ¸A3,òN–Ä…ÚTjPgeCà8Ž¥Q–§I”´s³Å ä655õÍo| ÛXž]i,ž½ë¬¸7K£Z­â: €( ¬èiN><{ú4óýå••^§†aàùQ7’R¦iþ©Ù3¾Ï:í–‹iÔëc …Òüül—\rñÜÜ\£Õ,” ¾ºÔ¥Ôñ áÜÜÒwÜåy¾" ƒmÛv)åÖ†ÊyÖEŽÖÓk‹›¶ÖŸñ —¼ö®¹æÚ\tñ®g­?sjnïGæ­Y;­µ. ÍfsyieöÌ\ÅJ™f³µºý6å©A’e:2^( [F©CY¡èR¨—çNÜûígNžYš'±Ñ\Ë”@"?)x§ßMx!¬£•R S¤FÑR#úÜõwÌ·³ç:ïœ^íe×>¹§šb©•vu‰e¥T®Uª#!x.x·Ûmw»Y–eYÆ9çRä‚g<BH­•1¹JjÅešó(I“,Ï3Îsa!2@ A¥R¡T* ÕjµZ¥Z*‹a!L«”"ֺ̱ÌYM1B%i.¥\ý Š/IbŒ1„V)¥´PZ0ꮦ¦#„<æPJ¿³µÙh­Ážç…aH)e® €¢@)ež ­¬Ô*ã¹RÊB€²Ö%­ÒVé<Ï#àÀcA¶ö\ÿÖ—?íüÛ¶nÞ°nýŽ'ýê{o™ç?hAlþП]ëçܳÿø¶™ßþæó§žù…dÏ;ß~ëËÿöŠu™Yþêÿß !ôã¯;tóóꌢÿú4"Œu? +öcÕFOŽ9_#N_ÿÖ7ßù+?ÿ+—28˜A <쇾W‹•’‡1ÅRÊ“R¦y®ŒQæáTÚ«Mcaa±È<×qLe癵Z‘¥\J)„xø8E­“4ϹäœgY¶ºÎ8Ïs­ãаPp}¯X,–Ëåb±¸ºÞ–Rêy¥ÔsŒ —*ÉR¡¤1fðrà1a膗¿å×Îr!îÔUôÆ'¢ãó—wô¾ƒŒaaãU;qó“ú©Sâ‘×ñC~ÇÑóÏ „ò£ÜÙûVìÇ©þ®ßÿÒmŸxé÷áèåêšóA¯ø),šÖÍ¿÷ìg]qÕ3žý¶{{úíÖcàßHÑÀÀÀÀÀÀ£™oTŠkÖ­[¿uzÍÆ±Ñ5›Ön¨W†CÇs1EúžCIxþ¹[^óÏ•ýIcÑèP‡Œt]– Ñî7ü V7ø#S 'pIÁ-Lñ0””kˆ“Ûã›8sXujóN XihÁåR©T(Õ'ÖvºKF¦&³¹àR¬ÁÌÌ1Ãü4i1ä\q‘A€€2Y’bÄ”DZËn{…`Èeß*Ù^Y™šÚZ(•gŽ+–†7m?Æ•dŒ·ÛÝúȸ¸Ær£¹8\¯X !R#ìP¤áòì|8:”òÜÃøë7\±uq‘©• B¤a!\˜›ßÿàÞ,Š¡EQ”Ôëõ™™YßǾÖ‡«­foûöížïbB/qb¨V­Oo›®9”RJ‹ãOùÀqnäÉ>uªÈ(u§^ðµŽL2~œ‹òÔW>³'—JëÞ-×}kY Fíÿ@Ö`k\“$'–ôÓvÌ[yš$Y|îÖqµ4¿Øä^X³Édn ’€  ^¹‚ÝJnBÄEv»m•'9âHqæ*žß/IR!ˆì5fö÷“Ô"‹”£²ž” iÔ¯×%Ì@.1¡g–f[¬•FÍËAÅR`Q¢¥ˆ!9@C""AÅu]!d1†„Œ“ÖĺuCÅ•ãûZªB!8xðàâÒR¡\XjΗŠCž[pY À<ôJq7!q+ËCÃ@Ãysa©Z j•ŠÎL'MëæIÒi÷¼¡`lz;´Çõ‘Úüü<"0‰²8î·Úí<ïùf˜¬,w––ržÞvÛmSk§ÓDnß±3KõÒâÉn¯Yªå9v¨Ûožwι3§ÎŒ `núæ÷ß}ôçžtÎÄhu×ù»®xêe墇ÖZúÄáIÂ4M&''ÂbÈê5;a±Ä¥êÄq·)c.˵*¡†`b ¾´0EyÔo;>®I. ´ˆÇõ“86Fw[Qž®ûØbµ…𠡬S†!Bm, !`J´6œ ×u#¾Ï¸È¸”¡•Ö:˲ PÀôû1ȰêתC~0çmmc-$uìºRÊ™§¡#ãÓ›·G&­_$A™"—"FY!Ë„ÑÒj奠8ä²R¯Ûô—1G)–Jm¤ÉVVäYÔm/·(uýWŸóÜ«×Í»ŠHh°y«Û™oÌ/·:ýžô­TÐXH „ZÉ(}Ç¡xX=Ñ9ûn=|à Jxú5ßšYZ^Y8±ÿÄé[~cÌâKßç—_±ÁAtÝ+¾x󟜷ý5ßÞÿɧU™`?öÑ—]01ù¸W~úô:8U{×9®Ã(¥”Òð`2X;ð3éáŒEíýÔ—ç-lIN,ùìWN=ýW6}gy:°ÙÌ7ÿöƒŸºõà\ä U¹~Ä“ù‹äâÍÿèï¨Ö½Ÿ}ßß}õž™®@nuýeÿ÷O_ùø*hŸg7 ü4KÓ”k !ì[`ÌU†sw»}¥Áµ×<ÝkÎÎO­Ÿ¤LN'K'¡¶xíö¢%Y{Ùð´+Sîà<ñœa,—ö¢nuýnÆj0í¥"ãQ»PÉÛ3*ã,¨`Ja¼”K3¾qã™'‰GE,ÖlÝîB˹È$T(qðøaê„Ö×}×É5ã¾….BRȇ÷J)$J©<7„¹ˆ¸BN§5^œÎ²”¹Ž‘ª×ë0Ì 0Åbñ豃€ /¸dÏÞ{Nž={Ûß =×õýBœõ„ÕÑí„°r­ˆÐRæFM¯Ù™F1@½Éõ›µ2åB±‘$gïÞ}òÀ™ó¢åJ% „N§í:¬ÓŒ¦§×öúi/‰!£c#àéµ4Ïsm”ç¸Ý~?I“‰ÉI!ÄÞ‡0dN[d§³,«”Šã#ãJJγÍë68qômo~ÛÈÈÈðððE\°wï^ô®Ý;Ÿ8å:ΑÇ1Æa¡€<~ô˜ë{aZ û­Þé<Íã„RÔn_·nëz’Ë•VwldÈZËóœ Ùhu«¡Ÿe‰ ÉR7ô´ óó%7¬V«½nS‰Df$pæ’$ÂkµTF+«!"Øó<€äÂsD¨4°XªD½~©RM³ hcŒYZXܽû•åÅ^«‘¦ÝåÆâö­Û¶OŒ÷zÑ™Ó'N¿³„¥BÕ麰½à:ıbŠ}ê3?p†G ¢V[Ïó²4Ë’4ÏR×óܰˆ`%Oykåd©¶ZÊõ\Ï£¹. ó\ònona%(ÏÚµû©OçUd{üí{¯?•YgÓ‹~ç%;CéÆ×Ü·´ë—×]ù™®¶jUü‰'›÷|ò­o~ÿ wžisäWF'6ž}ñ.¿òE/½zWCþ}øŸ ›ý¨nôØøÑ™¦}Ïõ·EÖnxÁk~ý‰E–¿ñù½ßýiËto}×kßù•½3] H¾Üø»\$çÿùKwìŸmF¨cU ?ö‰ßÿݸ>ažiÏí¹þ¿ÿ—w·•¦sÛÛß|Ý­§Z™_.ÁÞRì2dÚßçÅÁS5000ðÓ-êu;­vÜ„àQu:žåVÉÀE¿pçèKâtjr\©˜Ú”÷›ˆPᕱ1ËÇ÷ÍŸ>Œ‰;:1 ó>TÂb¨Mã&ÁŠ–ºÍfiùUh”œ€¡eÈ4fO­]¿©×hZh|ßG®_K:çÊÅÓÃחƆA æû>°Èõkç‚RJ*¥ @<—‘^¯‡0#„z”`ŠVϤڸ̱R‡ü P. ÍÍ)—*ý~ßaž1Òh06>R(¨Ã KQ‹G JÅ‘ñi‡Q£…ÐÀ@MNÔJe-µï»\ k ¥ÌòŒ1H’¬P,fYÖjµZk×uµQ®ëCH8ç+++g}V§Ó©×ëQaŒ{öí ðR©4íååæPuxh¨¾Ül}ûÛ·,--2‡ÌÎÎ@`ò$ÍâDõû„9’‹,I±­VgdlB[¬-Òe‚ …ÂÐP­Õj­F‘Êå²*<=!D–åIûó˜‡HÒ>ÏsŒÂ(N ‚ÀH)Öjc Ú‡[$”"¬ž-8<2 !L¢®J³…Ù3i¿wÏÝwçiì{´Rò1KKK ‹­ééÍ—=ùªÍ[w•*uâ×u1r´<B°…ÀC,ô]wqqñäÉ“žçPŠ¥Hã~³ßY²:ã®ï•’X:T2UZRŒÒ¬Ë !fŽüÄâ»ÞõÑë?óh­öË¿xñÆ‘±$ÉýVœGFqŠAž§Bæ! ,ÄT[+”‰Ò$— BL#„0ŠQZKˆ¬:—¢õ»ý¾1Fkm­ÆBV›Ï¥˜„Wÿâ8Îó<Ï„"¼š Ù!Bˆsàœó4ãi¦”¢”– Å Œ1ÖZcLk­”Âkm„PÆ)åjJnáê1‘RrßõÊB}ß ¾RÊqŒñêIšZ[­-0cLF¬VÓ*,ð˜3ëi`²çÝ¿òŽìå{ÿÕ“ì?žÂêåøêípæoüê’’g>û–».yýó¦Ù¿š<šöý_?¬Ëç_<嬿îºKwvß×ööÍPúˆYÔoúù§ÿ•÷†w]³9ÄiÅÎûî­ª?÷ó>yEù_ÝàǶßám¿æ¥[Ìÿï g¤± ?ð‰$/|ÁFwØå§•§}èözhïÞ»ÿáù«•RjüŸ»gÏC{÷î½ý}‡@'¯xö.ÂðqϽd„B€‰îûÈ›Þþ¶·½íÏþn_²Ú!zdüzà'{ïÞúOx¯¾ûðî?øüÞÅvgáÀÍz寣×k÷ïf«G:|Ÿ>ð?ÔIT7ú ,Êůß+-Úõ¬K7í~æåU¢Û?sÏÃkÙÕò?òŽD›â“ÿðc_ù§úÜk·÷!Õ?¸`­µ ôóï¼îK_üÒ×Þÿü5ñüܜғ×üÕ§oøì§?þÛ0ˆ¾õ™{;ÚªÎ̼0Ænxå;?øÿô—ÿá5»C¤»ßçÅÁè0000ðÓ Œ]e„ Ò@›‚_þ¥üâ3¯|ÊâÉÙc§f{½.ÔyÜoZkb¬25šÜðÑ›+C#JâVsÅ(lÖï,j›€UVv¸4¾_ *ãHeY–i€!„Ik±ÛlH!’ÅE¯ðŒWFLjçÉ<£ž“j¾8;´ÅÄwýP§:4Öl-¹žo!0Â(u À!¥”ãyJÏóÒ4G„Y@ A˜ç¹RºßÍf³ßW^Xª—Ââ9»Î…¡ ³Ö` [­‚§Ù·ßÖ“B¥ÂTIÿÔ‰ãåry¨ZIò˜RE‰ï{a¦i²º›”çi),„ÚšÐ+h)gggBRʸI.BqÔ›œ˜h·º¾ëíÝ·¯^ª–Ka!˜Z3™äÙúõk“$ÂÏÎÏie³Œ/-­c¨ëÔGêyžgYf­å<ëõzógf÷ïßÉÏ=>Žû2çJ©,žçÍÎέ4Z™WÑe IDAT”ùc“¥R‘$¥,B06Ïs„ˆp5€å:ÎØÈHÜí¨<ó—1†Ìâ¾\©”BÁUZK€Q¹5ÆZ#„`Œ!JKc u=¥Ôì̘<îU‹Å$îB+O;–§1ÏÓɱÑCö5[ ßúö×—K¿äÊsο<(×ýÒ°_ŠÃÐ õ¥€Ðñ "Y¥·lÙ²fÍšN»cŒÐRJ!0ÚÆ©Re¼PÉsn-0ÖE8D K+JA¸sÛú§=í¼ð„¯ݼ·Ó—ÏÖ“×Ôƒ8j/5f£¸Ýí­¨#@ ¶FXÛÏ'ôýRâ\æi–¦)YÒZ&<éÄÝF¿Õí÷;½^–$Bpk!˜1FQJ)¥¤Viš¦iª¸0R´R%¥Â* !DaŒ­µ«Â9×Ja c×õ@!¡¼F7ÆcBÖZJ©Rjõ)€«1„“Bè3Š1ÆÀÚ,˲,Ëó<Ïs­¥µzõú<ÏB!Œ?!<¶øÉ¸öê¬}÷—Þqå{tógËËÿä™aö•7~ä¾ÛÞý~ñ²ÿû¸Ò¿™ÈƱ #Åïm¤ÂÅ‘"0KÇ[ÊþðÒï,J¿þªßº ½¯¿áw÷ÝÁºb£¸5€«ãOH¿S¿M¿øò³Ážî„°Éž~±òž³ÎÌÒôæm[·mݺum…®nÌw†7lÙºmëÖ­[Ö0ÀâÅ~çr£¹ô/o8çáè€Æ®~ ÙÁâÄŸ:zñ†?xï1©Îþ­?ø¥Ç­*„µÉO{Õ‡¿ôö]>bíªüdu¶õ—*qæÆ/Ÿ6†žóì kÄÛðô§Œ@(¼áö%ebå肵ÖÛù´s‡¡ŽG¿÷‡?¸è{ŸfaD\—ÊŽ§µµ`ö~çEOæó¯ýà!e¬]9ÑT–Œ]pñ(„àäßüúË^õ¶ën[Ðúý^øéFæ‡^xCL 4Ò ]ÁÇ>þé·¿íýÖ:OºhWàæ:^ÑåÀ‡Á°ç†ÁÐÚés¯ •ui¿k‘;¾õüáÉiö¨T&·ùåºÑB*–×"¿(ã¢^qxÜ Ê@ä£i%Þvãí·Ü42\Ã[·n#cS/EÃÅ¡c'O§Ê–*Õ¡Ê0°òÔ©Ck'×ò<†“»Ô…Læ)k)q™ãk­[­¦Ð Ša¹:59^, ¢ÖZLY©< ÁÈÙ¾s÷ÉÙ-È,Ÿ˜˜(” y{1Z{ñÍ=-~hOøAýä?ÕÙ~‹ù‘¯Þ¼d,÷¿é—ካ®~ågöø—nž ¬æü7AÃ\ôï•+¨>îéÏzγáêç<çùϽú…Ï<·‚!ò¶½âÝïxõ/œ;F¢£ßþÔ›ãµ;šY÷û¼8xð~ºikVwMæRpÎ) °©L ÂÊÉõõ¬Õ’²-E'Î9Ä.tK2–ó~l:ËaèyÖ€8ëS¿ê5ˆ=Å£\fZ/°`c ëÚ ¬ßq§×^RJí»çv껚+xØæ™3Kó³Óë—NÍÊõ©é5Žç8Ž#xšç]‡…iÖ“Zkõ6ÖZBˆÐL©0Æ`¦„9®t:,IÂ0Ìs‘gÜs}eU·ÛÛ·ï¡ááQ M¹\=9s’º4ÍÒ,ÎBµRõ¡êòÜB±Xª× e£cu”U:îvân'KSbPÚñX©RŒ“~’äQÔ—R†aØé´„ˆ"ŒaõûX¿~ýìÜÌÖ­›Eåryݺµû÷ïŸ=3xÿ?{çgÉUÝùsSÅW/u I3¡QÄ&˜$L4Æ1ƒYãõŒÁ»cŒ½¬½6/`ŒY‚ " ¡4ÊÒäØñu¿\ù¦³´dl?°ûÑ¢÷ý¯ï½]·ê½ß«ð«sÏ©Ô*5ÆÄYÛ¶ãd||r×öé o´nŸÖ8,Þsì–oöûý¢µ0µë²—¿êòñé 7\÷…3óœWŽŸ¸ï¾»nkLWM&‰%vy¹åVê¸ ºDRhC„”¨Ü4kÍÖÊòÔøl’Å„ ­#¼AmÐoy~5•YµZõ}8‰‡ªZ«­.Ÿ¬ÞØx]a¶´|ºµ|Fe\k9/-­7š7|ãÚ/ùó7íð&ª&§Ïœ>Šn:gwùŒù¡[od“Z)£ƒÀ£Ö™›™êt®0·\S}b&éåqRÔ§¦~âùOÒ/ \²inëâüRà‰n=väø…{.¨EÕ…•Ecõâ™Ó7ßt£ëˆ;î¸ã“ÿüO‰qÏóΜ<Žë®;®»îº­gmž_Y˜™Û@)í÷»y:h­œYk/µV–—ά­.ÄImmM)•giàÐNkåð}‡ÿù3ÿŒÚ ‡£(GGÎôÔìR{õÔâò`ת12¤EZ€TYj‡Ý5öÃ0ôý ”’D+{ÂjD»®U¦Keò<5J !´6ÀÀq9*YÄ1X,”žÚ²³“”ÌpМ˜Ê²¬×]­†®Õò‰O¼bçö=aPðöîyâî]OÈûùÝÜzãW¿{×O»×á•H8ƒ~Ðê´ÀS3žÛ¼×¦I4Þܰu§ë S™çðje\—º½zzmå㌠¿»´Ú]9Ãi17U›­‹?ùÝW}ê¼ëOßüš×<ûy5Qb"ªŒ…AÝsk¾[ñŸ  )AÊ)Xk [$E¶Ö:§ù,HYRE-•µÚØ2͇Ò&ýa«?X]][dŠRô='ò½±Z ”Ñi^¤y®ó2“^¯×ïöq< †Ãaœgƒ4ADm±Ðºßïǽ~ǨQ++¥J£ƒÁ ,KBˆ6ÒC,c€#<×ñcœ±$‹•RÆ`\$«ö½ÇŽ>yr0ˆ‹BZcŠ¢Hã$I’uo1I¢Á¡¬Q­ªBø‘\IN}âÕO½êšm/’þΧ?ú‘øÃþè§¾zÓ‘¾~tŸ{ÅG¾{ý-_|ÓyþCE:ºç½ñ½Wm8üžßÿØáÜ"f?ü–÷Ùô«þË;]J~@ï÷\ µËþàƒoÚvê/¯zÛw•µø¨vìÐ{þàGrDPË_yûïýKðôKªöcçÅä®)X½o>Óí¯^ýÒ7þó¢B:óì×?Ã[þøß°ç5Oƒñ€¦”<‘0ÎØýq²„2Î9(½`ïš·\ýÅž2¶rÉóöMÔv¾ð—.$`ÓoþÁ~­mFÎâcwç+_™ КüÔ ÿø—¿ÿÚ=iÇØìÅ?ÿ¾»ë§ô‡Ò¿äå¿ø‚],l×§?ðGÿù½ýÀkŸ1{à~óK݇Q‚í>’Nàщíñi,âðž/ݘ Òó®~ÿ‡>ùÑ|ò£ùäÇ>øîŒS­o~åHtjÿëž;FHyçßüú•?õÒW¼ã®­Õľë!¼æ™§ÿòO6 ‘w}è·_öÂ=ïÊ>ïçßø×÷æˆPÿØë_ùÒçÿ쫯úw~vÅ"ˆÙ-UsücoxP#ý´FŒ1âÇšõušÚ?pe™–q:z/xÆÅçïŒd|&/c]eeg°Â…r](:k·Þt‹WŸ¨4Æëõ âÎÏeÖjä>eNä{I:0@òtÐmÍ/?Á]ž‡eÙ:~0ÏbU °3çžo¸3>·ijl"-r? jãÍÕ3§üÀ*Õ0-D˱sç®4¢ei‘dÜaZ)c c,-rC(QJåyNùz%J ‚ H37ƒ¨‚Zù¾›ižg®'d™2Æ’8æ\4›cEiªµ&ÎôÌÜêòJ£ZͲL&‰µ…Ìbúͱ1B±Ón†IY*ιÕ& #ÆY’Ä®ëŽ--®1?è¶Û…V”2`|=!L‘ë뮿vl¼Ñív}Ç­xÁm·ètÖcaèi#£(¼çž»¬Õ[·n=rìD¯?Ìdyë·k‚cõfY–a®õºg–;ÜétâxhUÁ¨V2)‹d¥u&IR–”±2MИ2—ÜPŸ{2-n;pÇ™…Õ~¿¯”Z]nƒÝþp=rÍh]­Ö´ÖÖj@%8q£”¹B¢±Za”VJ9žk­åŽçúRR©TŒ1ŽãP `‘ eµaÅO}4¥SS0/³Ðª•P•¹1š–äjzj+¡N©tki9ϲbØ“Iß%vºY/ÒAgyy0èQFÂ(p=Ve½ÕŠG¹G%´ï÷ãÊÄÔøÜVDG+Ë¿Z³h¸ eš•iE¹°Š¡¹þºÛ>ø¡ÏYÎ~öçúYÏzº_.÷€Pm•2ˆd= Œåœ3Æ(w8s¸ €:Í»Ëù•îÊr{©Ók§YŒZqB X£´¶Ñ‚J—J—ÚHcçÔñÜõš<`ATÖX@ \¤œ¯Ç-®µW–W—Ú½N§ÓÉóœ0ºž?±Èó²ÈÖ‹´!„ ¥ÑXƘt‡1¶ž«‘‚ˆÍjÍuƈ1&Nâ8Ž“4M’d=/'0ÆcëU8çëõpÁFçÀ?Òò[Ÿ\­/¿ó¯}Í«_}ÕUW]uÕþ⎮yèœXúôß?ÛŽ—~nñšŸÝ¹å'Þ{(·ÎÔžK/Ü\¡°ýÏ/ßyÖsþnÕØï¼êœÍW¼ã®Ì’æ3ßÓ×~'øðËöîܹãü—}4úÝoÜðîýÍuÿŽ>|¯:ù7ÏÝõ”w3Éç^vÎÅ¿ýÝåïü§_ùûãFÿ‹§nÚ|ÿÔ?üŽý–ûÁ—îݹëìóžñ®ì Ÿþ»ŸÙì’ÇÌ1¾ûš¿½rÇù¯û®¶·þú;®üði‰bû/½ó×.:ô† ·]puÿgßõºs}JÈÄÓ~õ¹4Ÿ÷Ú+š#_qÄMqâšë»ÖÀÌî—õ'¦Àî5Ÿ;œr3>†q¶¿á‹·|ä·^¸·I ®×«Ók·}âê§^ù×G>Þ”Bî7+û_yù˜`TÌüÔ_}ègzwôF ù—Nþºgvpûçäˆt÷³/w0\ýÏzÊÄ?Ûê]ÿ…C¯Úý„hïkÿüÝÓüŸ_:pd±Ÿõs;÷m«2BÈÃw=8€‘Dû^ÿ¾woø»¿ÿ—ÛÏ÷ ê3Û¦™±ƒ“þK­ù.xÍmOzÁ«~í²}ˆÆÑeeĈ#~Ìïüý8O-…MÓ“³Û'D­Ó]ºáæ[ÜÛ"¬GµV¿%󕉺ûóWn¿í–»4Ÿpé%º{¯Wߎá8‹4;b TÄ '„Ó´»ˆ <ædÃ5ׇÍ;·'Ãv¼x:v™å•Êø@A}bëÞóÎïöö/~µ»xôÒ+Ÿï2¾zè(kÖæ¢qß Vוю7 ´"Œ’¢´•zbc Ü 3m•Ö‘­¬µ¥”¥ã^PѨ£z#íǺ,:ÝÁÖÍ[Z '\îv†éÖMÛî±Ò¢ít;”ÒFs6ÍÊ-Û'ÂÐÿô§>uá¾½GŽÓ²,‡YBU£VßûħÌÍmúïúÇ]t¨šŠWmǃÈ3»eÀ¹äº^¶Îœµ¼´ºoßùG®GãÝV·Z i5bÜ…gDÊaw•`ɹ¨•°×]+²!S)ã¼V«i­£ˆëº@‰6b|<’…t]—Zæ¥DEQPÂ2KhPI’dvÓ&]dœù³Ñ+¨r×u+Qdn;{ëŠï|ë«q2hD‡3U–®+¦Æ§ªõ†ï™&\ Æ9¡ªÛéGO]¨W,c.sâÎuƒÚÔfÔÊ Ô›˜Ú>t¬ÍŒÎi*ý Ê% {÷ÎVëçþÍÇ®»éÎß{øÀxu:ª…yÉ}OPJ­6‚{R–±4”8”QΟyÖ‚µÁ "£‹x˜(ãÃ8B w¦ëºX–¹‘išRÎZmeI~t½¬4G£$–ýnÏS­Ö}¿261C pD©2+-s‰g‰4ªâ‡„£õºÑ¹^ ; CÁøzùi0Æhm !VJ)åúšal}ɳçŠF5Zí´RLš'ÆJ©ø"ÖjUJ'ày^¡äè8âG@xùÎäýÏ™ì!£Køæ_úÜá_¸ÿ‘P¶õÀ)á?|þ¿>O>ÐïLïÿÍ|ëjø^󿉢"×+¶¼æóG¯ú7S‘Kïh½÷û§þîØºÝÿ˜:Fò¦Ã¯úÞLœ€™ç¿çÛÏù3ü÷Ÿ‰Î¾lÇY㯽¬:*Û2â‡G­^]Ïá{ôžP};@£ @çЉØ<¹:Zmÿ˜…°ÚîW¾ë3¯xG¾rß×~ã«_üÌ'þá†ED+¿ûOÿå·œëÿ SD}ó˜ó@œ¡i?’ЉGÖI82Zßÿö¼¿ÿJáìxõÇ¿pÕ÷.ÎØÞ—\ý¾ã×B¡ë×£‡ëûÞþOÿûû6LDc~ï‹üÀX¾ëþôþÜ÷¶@ %²qĈ#FüX#Ñ–yîÁ ßï´ÛKk§D½9½)˜âÆ´"ÕôÙOÝ÷Í/Ýtlañ^ó4·¢© Ás¬&ÝCRª(Ú$¯UkÎ’C¬3® Ñ^Pï%ˤ,9ÑRg< óa4kÕjóÈ¡cÄñ‡í…ÝO~ªë‡e/ÌÏ{§/@k£Y–ñJT­×° H·nÝÚé¯*­¹ÔI’æB´¶„RžÆÃZ­f- "¥‚æ8Ü(©ŠRÊÒ+„ÐÚ*¥<ÏkµÚý~Ó¦MݵöØìTÇ'OZ^^ôÑZ§YBözõJÕP²|æÌÌì¬2Ö‚A¯§Á{C µ2ŒlÚ¸±µ¸¼qóÆé ³PÊ|˜Æçf§+axüØé,MŒÖwÞq×–-[ò¾öw£È’?ÈÏஸÿ²ThÖnúÜ7òË^´ïßò¶ì¿¸ò¾ù`ë`K³=œyô?÷Ú_ò‘¿}ùF1ÒÙcÕXÜöáwüÑõ{ž÷ñM B! Â-œå“»Ø|ñ&È£ÔÀ£QÂË~€NØCN´Îylêg‡;bĈ#§ÌLÎLmœßùU×u)5”Âx®4'àx¢Z­[I´‚A·wÑþ+±iFbQ«$ËR&e9´V2ꥹŽ3U™˜žÜ¼UT´RgÕÀ‰&˜ß¤ah)‹óBZ#U §ÚbAtö¾}‡ºÃ·þÕGßüö¿çŸAJšÍú žqŹúõçnÜ8V¹ãZ@BÁa”àLø"ý(ò"ßñ8å\× ¸ë†A5ò£ŠãÖ€ *B¿ÖǪãSÍéZ¥á!¦)•ò¹çy•Àõ ڬM4*cQº®WêµZ '‚±jÃc.gŽÃÝ@øœ;_ã@‡Y«•U¥.4šB«~wý…µ•^2$ÃÞ SêÅ2NS­¥´ÖJIc-B*UÙ ß-Œ"7F[T  S¦€€ª5C ëi“FçÀ#ßP·îßõæs&·¿váßý‹Û¼Q¼âˆ¨™êÖ³`鎓k÷}ø ¯zû·”Q•Œ?ç]ï¼Â£zÿô¶ÜÔ–VwoýÀ›þðÚêÓ/ä#•=–Ak{Ÿù¹çÿÆÿøú}‹ý¢,øÄ[ï ™Åí¿þŽ®—ŒTx4J ¬“ÿÀDFJFŒ1bÄ㔨VKã$ÍóRIJ©ïU­µs9˜ÀCyO|Úªð[߸ã9ÏÛÿ´+.©Ò‚ØTQ¿,Îh8y®ÂŒ1B‰v:@³Ò¥~ÜMÁ@88yTOïW–’$¬¶Ï/£Ùí;¶-¬,OmÙ}à _.)îÝ÷¤Á`Yùüžûn›Þe4 ³hr“ëA¯çP …êÌŒÍqÇñý°^oÞwï»vžÍÑ}ÿŸ½ë5¿øË'Oß0=sÍ—¯mV«Ç—æÉž|é¥i{u¼Þ´Ž)DÈÊ3+G§uzr3J[«Ž#Aâ0‹–;‚ ®d™©œ“ȫշoÞ¼tf¾L‡EYT*çŒÍÒÄGR©DÝv8¡”Y+±Bec¬IÑiÆ\OT˜”ºÔÔ è9»ö®u—;­•'Å`¥Dk²ÁÀ «µúøÖ»‘$'q^”ÖZ‡²úøu<â8®8®/8ÏâDkå:Õ¨õä©á°×.“½ç옞žþÖm§n?¾vËÛþ$íÇÝAÎ<;æ××ó ¥”R\×%„˜B*¤e™1άÙ縔2F…u,!$Íb£u¡J`D[£¬JÓÔ4©ÖZSJ¡ëï÷=ÏKŠœR:ãÎJP®ç1J-ÐA<ÔÂɧ‚«"'Œ­Û‹ÍJÅu}eP)­µÎ ¦Ñ&ù2Â]Ï·h­-ŠÂ Mâ¤, ×óÑæyªd!Ž`ò¸¯â´Õ°f¢ÁyÙ¼ïõ'Þò¡ëNÿÕÓwüö§üÆ{ŸþÅË&ÿó=ß7lÛk¿p÷†wÿ§w~üºwìŸý/ÕñÙ­—¿ìÝ×¼å›Ý‘ÌÃðÙÿåGäg¿ô•o¾û>õ[«ƒX4¹iÇ•¿óÁß|ãO_:~¨iø5ðžýŸn}õ…MFÀyD%+Ó¼”E%ðÚÃ~ÅC^XWÜÝùÄ}K§N57n¼óÛß¶[çxò¼'ô¸p{ÝH­±^?·Ãù“‹—]|ɧÿé3œó^:hw»{÷œ???ßétßs¹‹ˆÆc£„e™B¬µ@‰T" !8¥ˆH,¢6Àˆµ–SjÀZk×/B”.9¡œS× MPv»]Çù×Üpfa!¨ÖRkšÍñ´†ºƒÞ0“Æqž¦Ìue™Ñ€JI‰µÂ¥”ÂúöãÔu³$Í“8¨Öã8žœ™Y[!f€ëÒ4 CP+U:^ Ê\É‚Rðƒ°Ìrd„ ”e8 2LEÚh&¥ÚµëüxvËòü©´½h ZjIÖÆÝá°”“ÓaT©×šõz½(ʤß}×÷´‘R„œó(¬¸›%1 Ä %˜Å½ýûÎM³\Yrû}'–‡yU£hL“BPŸ$)0à€ÜuÖ,d&±.¸ÖÚ¢,×cú|×'g‚#¢ëºÖÚ¼,²"Ïe¹þ E”Xk¡h­e ²,ÑLƒ„3«QYRŸ záúøÜqCÒæ×ߘ¼îû È‚(¶¿ùÖä7ðA=[ú½_Ù{ÖãÆ¡”³’ßzð°pÛóßú‰çþþ÷ >PJGe븞ô3W?ñ§ßŒð½DÌëµ:þíwçü ü›\š„=’¹÷Á=–ߌŒÅ#FŒñx5µŽ‚Às\/!ÕŠG(—¥’R–eYäqèúû÷ïÛ±uÒ§q‘—E>È“%,˜œµ¼@UÒÏ’5aµÑ11¦Ûk×Ç·Ô§¶S¤Œg™JÛ«‹º”é°¯‹¼>5³ã¢‹tš›¶v–²¬;{ÙÅo½þĉ3ÏzñËßzS–R³±I÷î{îݶólÆ`ùL÷ö»¯ó*M)ËÛï:|b~‰qwëÖó—ç ‡0.¨ïpÅ Z©T „EÎXÕX"5Y\Y®×&¥)d–NNL8säðB£:æx~5ªÕjµ••–²úäé““³ˆÈf­%âDV+õ^·½cÇv ¡ŽSñEœ•µ¨ZÅÌÔìñã':<35½|f~÷îsî¹çàYÛw=vlnnõ7|7jL}åë_é¶W/ºìòÏ|öSœ¿ûøñãŒÐM6¯®®ÖN·…ÖRBŒT@0ÎRî8ëf–1f=wžÕ¬¡”Z«1 ™µVÂÈúMZF  J³¡•F}:ªEû.ºü[×ÞP ¼¸» Öæi16>vçñ#Û·lxÚÓöŸøä¢´0 Ž`Œ±$I¤”Žqc¨´µ¶´Š î0nŒÉdN e¾^š9ªTÖCD Z[h‹6KSGx¾ïSΤ„À¨p8§¸ gÂ%Z@­5Ô0Bã‚2‡ ÎýŒ1 ,Îr´@©ƒ:®Ó G0¢5C¬%…ÌQª¤”6jÕJ¥B)ÍóçyO»ê—^|í·nüÊ 7—¥B¤5¨JeL+©¸®‹†`=GøÂÕZK) ]cÊÒ ]æ ÁËŠ’$e”DAHgÂáœ@‡Ê™*±(\×j-«×¡à„Z«¹ãX‹H@)e¬ýÀ÷ý$M€X¸¾¨­©T*J©"—` î n”掂B\— áN™ïzƘ”J©®B ¡”t<ÁSÇAÂ<ÏãLÊŒ’ÆX–(Šl´zĈ#FŒ1â‡gd,Ž1bĈÇ)­“‡3«ˆÃ'šSµ°ºyzZ·ê°KŸ~.OKg,ô‹²o’nÚYs볞ðl­µ”ÑæÃ3ùÂ,l4ÓÖÚÆ-çÖ&¶ÄÃÄñý¼ .!Çî½™&~eïåO-¤6Öz®³rªCˆàÍÆÈÍŸýÇ•ÅÅ—ï¿äÒËÞrsZt‡¥Ú³÷’•ùåZsìðÁÒµµ8íoÙÖ]˜?³²\H] «“õfœõ;UkîÚ¶-gK› — ådJQ«Ë*tú½Z于Sæ9RÊ8YX^¥Üc+®`. eZªRsîQ"¸gúC™®­¡±6Ìi«  ±c‰bÌ *ó'OÌmݱØ]õïÄé婹Ss“ºd­•3ý$u]Oé¢b\@vÍ7¯¹ô¢'·o»çÎaÞ¯…£PÃáp¸´tfl|¼µ¶4@©BkM#h³<µÖ2Æðþ°Df­µ‘QŠ„€CŒA£¥E” - Aê1!\gmõH·ìÚy~­Z‘fn ó'ªS,`†ð»ßsÁžó6s—p…‹>­©dÅ!œªW¥ ¥ÖhÂ)×2§…(ÀJ)ƒ0"“$cŒ AX3@V—WŒÅŸû«»k«_ÿ_ÿkËέY§Ÿh5>=iµRÒŽ5Æ”RZ¥s³wßyg£ÑÈ’!ç|Ó¦-qx¨91^ß¶ýΛî8ÿò‹çÆ'»Ù0/žð‚ à”1Ê“,÷tû£ä;7^wÏ}wî>wïÈ[ü¿ÄX­© €%$pÝÅ´ußmG¾|mþŽ?¹úÏ»|éø 4 õ¨Y©ÒÌû(óxØ#EÍ/ã8[]­LOo¼|ÿ°Ýwƒ€_——çŽOU›>Û %m™ô«•ñ¥#·x"Çæy<\mž»èÒKÎ:kùà=Æ D•îé3ç]pùòÂâ¶sÎn÷–Îëµê`;u€om±ý¬=Sã3LÈîJ{b|<3ƒ4M›M€pG¹¨µ¹¶ÚÚ¸içNÅ« ã¾Ö¤"…,²,kŽc3ï¾ûî-›7EA€vºƒj³ÖëÄaTEÎL"³8ß¹ëœ~¿{ñ%û÷í³v¼¼¼Šss3Ëó§8!Îòüé¿ý‡¿3Û˜r|/<÷ì]2ɲ,¹é– ™5Ê(m-°J* h¬'ò[w‘@k „¥‘Qj­µëc(°(×@Ð4޽Ó^qÙ•Î|»Ý©NO z½;¶9ŽzÕ·ÞqÁEO8[n;ôµ¯ù~€J".|­%¬'—$„X-h¤\Pc,åLZ „ºA¥ÝïwOœ9Ï÷>¬‹|˦­›7m»ð©OÿøŸþñÉÇþ{çgYQçýÊ'Þзûvîžœf`ˆ‚dPD]\Œà¢.`@\D1íâ*b\A]VVôsVQf€&ÇÎáæpRÅçÅEXw‘å~?ó™UçÖ U§NÕ¯ÿá‚×_”¦îìÌxâ¦çV*A&›éê_/Ís.â¸äyž’FËŠÍ ÆÖ=0/ j0ß³r‚íù™Ül¥ ´Ô1Æf*‰Á%MùR$ ;!­u¦# ! ¢;!˜ah’@ð0Ê’Œ3]*°”u䡇íÝ»¯VW:8B IDATŒR cABV b¤ä\ ‘(¥) Ä.µcÈ¢œÇšÇ‰ÒZñ040aŒ©- ‘0Ü… Ëöc$–eQ†!Ô²¥paRK”í<.—ËR¥5²±ÖÚu]cL.›‰¢s^®×”ÍF#åg ‹1d€àÂqŒ±”’*¥äR!°@­%Bˆăxª8f”¶lªA0’ƘF½ÇAE„£t{lÓ¦M›6mÚ´yö´…Å:FýØ£ODµE›6Ï7;tõc[i?‡ç‰2@$\˜$ ÕÒ‹Î9õX[ÊÛ'¾eûB"¸N”äJÔ#‘@ A,x ¨ F]à “0Ƙes¶0=Ù7¶SF"qÁë¾k “<ÒDHk¸Âv½¾e+€H aˆ^(B¢³ÝŠËj³!TJBxcL ¤Y§³7߀J„ÐZÇQ˜m´aŒ£¥V-õÙƒ‘VZ‚)¡$‰?‡©eLD)%Øn4k®ëP ¹1¶m7‰0Ð!Òž‡1‰#ÞŒÌäÔtw¯ïûÅB9ÛÕÉ(åR(È«å²ï{ˆYÝ=}èë®ýÜß½ê%¾ï"3™Ì¶Gka#Èd2®m—ŠÅµk×nÚòcT É âóÈ#d¢$7Æ%1Ðc ah¤y’mÖZcÔ1F)ݺS´1è !0-?X­5„( Ý]¹‰ P,ë•*±l6W(³ÙŽ={ö!,)eJq‹RŒLÂc)åã)kŒbÐêcŒÖ!Â¥†ˆPÛN¸èëÂÄÁ”u¥r“õýû÷íò(—è5o}ûßûîÏò½ž¾ž|‡…o6ÜR©,u’Ïçk%BˆíY©( âˆwäRÅÙš±mQ£Hivo¦c áaШw÷ôç;²ÕfТÞþÁZ¹Rœ™vmÇM÷$¢bY( CCmÎ `®S­VûÒ9J#E™c1Œ‘1¦'ŽÑG.™;¿·ë¦oÜäº Í"PqÊu€Êh€2ˆ@ÔZ cŒ‘J#mÆ"ÀlGk­°Œe4Æ`•2„%2Ѓ ÔZÇIˆ $ ¤âT)Ûu’("„ÇvmDz¬$BI)%„Ð(íû>E+Ùò§¦–!DÚ¤¼0 å§„c‚c %1ƸÞÇ‘ZCŒmÛN¥Rœs ˆ€‰‘¢…Fˆ¤ÙŒtB4@h¤H’$Âň’¸=¶iÓ¦M›6mÚ<{ÚÂâ ¥´mÕ¦ÍóŒq[ôN©×ÊI#„(¥ãžžáѱ½»výG¬:ñ˜#–/ë›õtg·Ð* jDFÑÔl$"d)BsˆM}+=Pž™Lû.u;â° YGÿ¢•’sšj³ !wìÌìäîæLaªš Ír£ñólÈ%¹>¥‘±R¹01º7Í¿øÔWo|à®E‡®i†%Ųñéé¤QfN'%bÉüÕC­QµÖàœ3ÆDZ–Φƒ`aL0Bdjµr&“jéož›"PJ0&bc€Ö°;?Ä9¯ Ƙ1Jˆ8“Î)%!jÙ‚‘„׳£PÂÂ0œ™™@®\±” ig,¬AÐŒ]ž;416öæK.hÔ#£¡ë¤ÆF'J¥Š’À¦iLÙœ¡»Öß×Û×å۾︿¸ó¿ê<’†âÜ#´B”µR ¡4 BH ÚŒ[IZ „c-U+y‹1Ò`ŒAµÒX#„ŒÑiúØB%ó~fv| DZlþ¼á­»ö9Ž75;Ýl6)²{S}½mˆŠ„P„ ˆä’RÚú6RjI.0Æ#L‰ÔÚ²@,Œ€´8["ˆ6ãdÙšÕúôØÎ››U+« /[sÜ™Ô"õÒTõFszª´ò5Íf½Q©ÕªgÑ(Ž3™,çIaºìûéÊL05R@PY³Ò…¾á¹]=ÕJñ¡ïÎ÷öR‹¤ré|>6ƒ°\ÏwçË33ñÔ„‚Ræ2Äv²n:ŽDql/Æ$Ÿ)5ÊõR>€G c¬JLÞñæól×/Œ‡·îºûÁ(Œcn„*¥86Æ„˜GJ)%¥”¢\-a„€Áb{ShBR !ÔÚ Rn!'‚˜ÇŒZ¥H§:×dÌ6RI­jµ„°Ùl2ÆZ?d„uøf1?&6*•z£Q‰‘Òu]Œ1Š'ÜuÝ0‰)¥>cC„R*Ã( AB×u)/-%÷7IÆØ|²(6"JDUZL)„!@ !±­†0 @{ñÓ¦M›6mÚ´ióli ‹/tZ¡£ÚÂb›6ÏC‚·géç¡@Ë’@ÅüÀþ-JAfù¾þÌCÏÿéwî\~ÔâP$FsתÕ2K–Å P*"s+VûX&c’鎓HiF© 7a“„@<[Y)í{ì‘e'Ÿ…(Nba(UØëétÇ·?æ03¶olî¼ùÊñy½¸uãoY»FJ«®µVu!cãd`£fPkÖ˾—6Œ& 0Jµ”6#£T³7ÂÊX'Ÿqäò•s&'Š;öŒoxl«1F"( 4”jŒ±ñIROx•Œ…¢jƒ0sØ0b!c¤ï¤fAAŒ1JK  çuBýj½¦DEˆD)…"@) `ʲéŒM„À÷] ¡Ô¦ QH0QZI]5¹]„…6бmAf±ž®<ç\@#„|f5(„@A=×ò  äÔ2 £ßÄI&(% A¶mÙ®ÛÖÛ´iÓ¦M›6mž=í-k[¹@„¶°Ø¦Íóóõl[,>§ôt÷E:D@‘òe –œ|ÜqÔèOò«sæ÷]ö–W4¦§ BÚÊFiY¹|º£O–öìÞ³±ï°ÇR[Øh­ t‹(H÷tG•Bitÿwüòì /²´Iàvu”&gçÎï+Ìî J³;F§-ZKm$üÙϾ½øðµQ³j’$j4£FÔ—.U¥F™YŽ6<‰ër­è§Ýb©bÙŽÒ:LÂ0¥ÊIJ…Ëc^r˜!ÂFE™t®^«ÂÆgF3~ج7;r(!„”Rkí8^£(cL1£R' !¶,ËÕh4Œ1IÄ­82P,˜·(×ëŒÇff‚ÉIBQ6›9ëÌ32) Õ]“ûGÆ‘˜Û?¼gÛшgêñp_ŸÛU.ÍÞ¿a½å[¡Ñ2"¥DaÆ´% ±[}¤µBR%Á (Ž e-×i€Æ!DclùP#´¦^-6›M­ðƇX¶pY¾¯{äÀ„1`°È“ïM{ÙÎ0ž’c ±´6Æh¥ÆX(I´8Ô–FB£ÐJ bùZÈF=êÈSÊj&\4/*Ƨ&à»Û´háÊ£Nß•IYR4ÆÆFe"`)$Ô²Ù,s×µ½#£ËÏ › †1H{QJ)#“Ä^šîŸn† K,bÔ„aàû© ÒétµZ§”J)eÌ1ÆZËbc@’$NÊ–‰lTgƒ0d–åfsq1ºç®_ý²³¸÷þÞ|þþ?âÐz-ª×éÉ Y=ª¯[»î翾#Jb£åþ‰Žç'IÂ0#µ¾;­L)„0@ȃE)`0j „C€I´Œ•DˆX–à –R&@mD¨HMAµò¯ÄqìØ~OoW³®|7Õ¨4)¢QDI|è¡‹Â$È÷õÕÆG-jSŠ•Â”ac°Ú­´FB´1-íÆE©Å9ˆ%$»ó{vì[søêÛ¶÷Ïd®³T-ß¼eãýÛÉÝè裎íììéciÛ©Ùj”Qfþ¢ùìÓ@EQP.YºÈOe‹•ò£[îqíôðܘxn&E(6*áIbâ Ä2™Dè½£ãÝ~&=·»Zkø®'mÖš~¶×ö7ÛA»ZšL¦G ¶r=ó…ÄŽ¡"Ñ‚KÏO%Ib7âzûöp׬9jÍQp÷îÝÅR5ˆ¨k¥“Dtç „À!´, !Ä9ð‚€IâXkm[¥Ìa–Mí ˜mZ*ÎDˆ`ê94¬WC µ(µrÙ~Æ,jYŒ±ç;˜ó0 µÖR)!#F¬T*•.¥äa ‘’­«B¥Vœ™™„öööaŒ³ÙŒ”Ra 4ÀJ F!m #,ÆP*Á,†çAŒ16ׂf½Ù0À´Ã,¶iÓ¦M› ñæ=õœÏl˜ªÛ/ýÉÈ·NËâö7°ÍŸkÓú<½.M>öà†Mõ!£·üšµÖJ©Ö¥" ÅE"¸2C!ˆ Ä­Ò­µFj¥¸0amlrTH5¼`ž&•J-]ºT*Å¢Z­ ÍaÔJ>îÍZÒdëåk¥-æœK)bF)Ð BGÁääxÚ÷S¶Æ|ñòÅ™iÏÏÎ]°dá¢åݹÜ@~v|û®-ë·?²¾#Ýá;^¾ÛW qþÐ'×¥ÐÿþûÆýMw"Ë rê%_¸wòÙËÁR÷=2g|fÓ¿,1ZI)Õ_·Öûv…ÖÕ‡>sõ ¿r~Í›.Xà‹Òøî=(ã´Ülž½-Í?•§Z,ªúî;¿qÓçn}`VêÅ?0ÓØüŸýiå¨ó¯zMŸÙ÷³¿åßÞe†¿ùîÃÒ©&^ö’K_9”ŠwÞñ…[®}?ÿ?/\`?>ßÙ ^}ݧOã»*ßÿå¹íÀÊ“–¥Ÿáµ®ÞÝ»>ù ÷Ø /{ý"_GwîBÙÖÈÑZðgîæç¢Í6mþU±½õ}n'@×ÁRª5†ÑraC2QnùÂþ¼Mª•‚˱Â%ŒÈ¤9¹½Q­ ŽyýC ôDX®Ì슓¤/×?¾ç£ÿf|ÿþ%ǼäúâìÞ]¼\'(±÷ìÞZ¯^Wwa¤X)•rCKû;¢ öœŽr¥¼î¤ã¦woj$iÍÅæÍWu\owïÌÌ^ÆR‘lg& Íút¥Öè˯<–\3ˆÈw8°pîˆ9”Ðw3œËb±˜ÉdBÑ$Ttyýa||OÚFvg× §¼rffT4KõFÍ’±J*µ™Ê–ÂH=lÏY2<´°·{°XšÍøù|~N­6]œž(—&7Ýw‡Vâ¨ã^Ò™dŒ +„Õ°²TÊÏÔƽ¹ DÒlVKƒÍbЕïAÆh#-\Çq6µPAlx6Lç¨Aíd “É»V#ˆ6=<ûØöý‡2?ŸïÝðà¦ý#£XF,¡¤ŠEP  ƒøñŒ:ØàQ˜ö}ËfaD!„Œ €¦´¯¿?LbÆ6škâX$<åw 4Œ1BmFm˜Y,›ÎÁ•å „!ÔFC†!T# ³Y×µcI"qâXÌ˜ÍæZú/¨ḵšA½+&aL)ÝÊJ&Q³ÙLû)cL"¸j*ËŠ•I‰(0Æ0'cÛvÚ÷ÛÓk›6mÚ¼0ñ»q¼úþ/»ø+mR¯¼cÿ×_œ9¸=mþú•—À†NyÙªO||#:úÇõÐÿåC7ºéÃHisÌÊ·¼n¥žNí#ÃÔ³æí½ýÿýómï?ñ’Öêa²ýÆOì:òpï—!„´½—ÿx'f/øÙî/2ñ_¿èµ×?r×—ßö«Ûþá†?«‡<‹çõ§uß³ÚìïòG¶ IDATáƒ1fþúù ‹brÃ#uûEW½ã ‡yN1àwÎP£_ýdzn€Cß{ë'×É¿þ…¯Þ³õÀLƒö#§÷RYyøû_úÒÜ[Eù%ǽúÒ‹Ï\àa€øcåOió«v}öŸ>µ}õû>ó¦>z¾¢O‘-ÄÄíŸþìo:Ï»úŠ­Ÿøtù‰ÃÒG\õÕ¯!FàÄUΖW¼ó#qXÊJyÑ«[­½0øíúÏ<2‚öûvøÃ†Ί#ß½ü»»_vÝG^>׆èÚ£ßùÜ ß¹oÛŒé^ºîüËÞöªCôð Uøøúuç”^yñꆘ3 €èñNsã/·˜ªÇ µæÊ/}êì>*Ë}󆾻~ww/;ñÂw^ú’E>†ˆ?VþÔ6_”Eí)½Í_æ móçDK¥µÑ@i n,"N;d]µ0Öäm;ÖA‹'hª³;ârwôfúç’ª•ÆTP5Ætår»·<”‹µÉ¶åsúKÃZ³\*XÔU0ÂR±c# ŒNfr]åj¬=wÅaGF&$]¬Ô2¹´Ñ*áq5juÙlÆÌ¶üT&›Î" ¢»N:Š"‘J ÝÎ95Fi-fÌ\6ãØw}DÕ-שÕjI’€€µJ9òa„€1@iÛ²"ž$B`Œ1ÆÄ¶âØcZÖ‚-ÏbŒ1„&ŽC°ï[•ZÙö¼z¥Œ,¶åÁMsç̓Úttd_vêiߺõÛË/Ý?oxÞÔìÌ}÷=°|Ñ|ÐÞ‘Ä¢­ù!$€†k­c-:;·l'!аe™ VJ+…0Jts6( J­¡:hÏ!4JŒ•R­ (›êñü\’pj±R©d\´dáôôôλ8.˜ç@¦xX­W¤–¶ëÛÌŠ#$ÄAkG!FH)å§\„M­:¾'Æ”i©ía|‰§Ü{ï/PSÓ°9.•ΔŠ% `G65œÊäºy…ÕÚ¬¢ÙlB䌎ŽÌÌÌœ|òÙ]]ù™‰H°ígæ-êš™;ßáò£üÜNw­<|µë¹µZM)‘J»-/òÙÙº²aPõE&Óûúº’De³Y­k;™Î®éñ±©é±\G·å¹ÒÄÝ)ÿ¾í“c»fW®X˜I{¾ë” ÜÎz‡¬]Ô=§û7nþù]¿Bôõõwuå“$†q¤”¨5jJ„±çø”2€ BȦ6Ƙ1˶¥”à ÑZcL Æ–”\ -’$Aù¾Ï¹Lw¤c–å0bUk5Œ PZ)Ék69ЪR©(¥‚\¢”禢$‰x$WDcNµV`Û¶)#B  cL© ã¸e¬ŠJ{¾RÚs=!µ˜¢Ñ,7›8 ik%A,‚!ÙöئM›6/Ô6&?±»D“'$;wÞ¹o{KGËô~dýÌ•u˜Î:ä½õ3@­µ6‚}ú»>nÓ«n¾ö3^{Ãq™ÖÀ”ïúØ7úÞùþìûïÞøäƒUñ·7¼ëêÿ¸o"6Ð<öâ~òÒu]OèŸÏ\û»F¦n{ùÑo¾c26¶ßæ×7ÝvVç_“nùHˆÛ{è+?rÓ¦¯ýø^¥F¿òÞ¯ýÓ‹¯Xl?‹}ûÿ¤û^èü…õQ’›Û ÃG~±a’!„èÉ™ òç\}ýgÿí߯¿þ]GxH×·þúþg^þ¡k>úþ·žxŽÀd÷­ï½ê³+_{Õ'>|ÉIøÞûàW67•OWþ”6àœs¡_Ð#à-éðù7üèækþáØ>û÷ÞADm†„BëšõÎé ¶¼Æ „:»ÿ?uמº$õûRÈA««`ëøÂ¶ùo¹î’5ì¾å—~þáŽÓßzí‡ß~Nç£7¼íŠÿÜkž±êñ«ìœß ‚wÜ?‘˜ÖÀAOš2ºÏûç/}éK7ùËï[“Bº¶åW¿Ýßù’+?úñOýë;_sd'ñޝ^ñޝO¯zã?÷ñwœ†ï¾îÝ_|¸¡ xºò§´Ù–zÚü_©Šmañ¹!2H)‰FifÓLgfÞÜá‡Ö?ÐÓÙmÙ8›O @fÐI­`¹=Öàâîyk´TõÒQŸ‰£êäþ]»7ÝûØCwïܽmøÐsÏ¿ìšG~}w£:ClG¡ › P®l¾oý/ü‹#ŽIÊïSÅM[ï?ý˜ê“›´!¥B¡T˜ìÈØ“{6Å!”œÆb uuue}vvtp`؃‰q-àÍÙZµ#—ÊÄZÇ1÷½,1H+õØÖíc“% ¦ ^«ADêAÙ‚„uÏq…HZ¹8lÇP‹0fK)=Ïs]—Q €¦”B•4ÆBÂÆ¶­ûÇ^ùò7ìÙ±ÃóÝþ®ž_Þýk 䶇7y¹ì·nû–"dÙªC{lKÏðÀâËÒ]¹lŽRê{ßËlbÛVʶ|ÇKÌ€AS„ˆÒZH i©‡4Z)!d¢4Z-¡1@k´V‚B@€AZa£’HsÉC ¹–‘22ÒrѲµ«×»wï~£tÆñË¥â}û‡††ÇéîînÖëa"(µÐ'ÕjEpÖPâ$±*ëzŠÃÎŽHáÔÔTG.G-תF£P,¸nÿ Çž“ëèÍwõÞqÇ­I#’J5+%n¢¹KæîÙ¿kÿÈþ™Â,¡N®³gÎðü W¬X¹zñ¢C÷ïÛ72²gÁ¢Ã·cÇŽÕJsμå+Ž<57tHÊK÷¤Ó" &FÇ&§öÀ1µ©åbÚØö,[ò¨VžhÖ¦€¥À,Û;´xå‘®Ÿ x¬ v¬Î(ŠÖ,ò×­êhÖK÷¬øÖÛ7|ï×ã»§K ÇÛwNÞ¿i«Ö`xîܹó稥âÈ@¨g±Žlv``h¨`þàÜ¡þt6mY ã8NÊsI’Ì<Ïs‡1!’Rbˆ(&)Ï÷}Ÿ1[cfˆ¥Îuv¥S9Ûò³©¬g;ÃùÎ\G. ) yR‹‚ €’ #³|*›ïîÆ”L SÅé©raºRœ-MLŒÌg*r3¨!„¢„Ç<áRr¡ƒfT(ã8ŽãC„!2\aˆÂ0D9–íÚŽk¥»;û‡†ä{‡{ú†s©œcy³Ûs`›6mÚ´ùrÿ kûÏ»+sÞ?]2üÿÖ8¶íd{z2Îâ«t´ñ]ómë ·íÂ÷üú¾/¼éÅË;£¯þÅû¿ü޳W åJ-7Ý5ç°“ÿþªoì뿼 {áeImëß0ä0jöÃòÓÇeƒ™c®|÷pú+ÿüý1Ñ:Jìùêµ[ÎxÏ9ý >)Ù˜©Þõ¶µ'¤úêÛ6nß¾}Ó­¯,|øEÇ^yïÁoÏ\ûdpÏéïzÝaK^ñ¥-“³{ÿÊTŧÛ<¹sœÓÚ?éÑMã‰èꣷ\ñÒ£–ô¥ó{yæ[oÜP|".›®>xãÿ°ûdá·Ÿ{Ëi‡Ïï²)Mç—{Þ¥×~gÇãÎÒÏ|:tuÃçÞxÂÒ—eç­{ý—mr}âÑG®;îEk{¨oüò·Æ–]úÁ·ž½îð5§^|ÕëæUîþñîH?Myë´Øf›6ÿ7o(jçmÑF»¾ïyžE¨ëº¶C(Å¥Bù°C–3¢]×åR@Hb­”¸8–×UK>29ž(xØ1ÇîÚ±¹Z˜™<ê˜ãƒâHP ¢J89;5< 81ÞŒêA…aE1ÐjŒi4+år5Žc¥c”àû¾ïzÆRŠ"êX¶)cl¦X3fh(AÆŒ ˆ1†!°m[c9¢$Ž“T& L+¤ ²,»¥'"0-ã/¥6£Ú˜ø ¯½p׎í”X¡l6ƒêïëo†Á¦ ½þ½âÜs·oÝ:69S-W†††¶l¬Ü¨aÈD"¥”Æ@BF"‚6Ù–ÕÊ8ü„†þDDE­µ”š–½$¤˜€t+˜‰6P´©4Æ­•RJ m¤6Ò ZÇ\人æ …î®<¢ŽLfxx¸eŠÖhIëf!Z‰VÖe4e¶1!415²cçæŒŸ©W#×u×38ž›Íæ,Ë!˜íÞùXOW>Éuvuæz¶l~0“ñ 3Sµj£ÖˆV²jμsæÌͦ;(fŒ9Œ:­\(JÈÌô¤ç¦–,XŽ “ºä5~g#NêÕRWg¶¿³?®Å¥™©fµœœR ÄB %¥"2 je¥DEC¶ljS!#!ÆbªµèJwÄ2 ‚raö¿~¹ñßn¾ÍïJ½øÔ—¯\*x(xHr§%"3ÆD³Zv¬ tÊëìììíííéÉg:²c µ1FJ©”‚BÒét:ÎdÒÂ$I’$H­!SŒ1B(Š"Á¡0ëõz3 ªõF- ΛIB H)eŒù®k[®cÛq˜(! Æ„ÏólÛB´œ÷•RQ¶ÒIm,Ê0Æ@„E(!Dkm¤òl/ŸïÉåòÙl®³³Û÷²©T*›ÉuvæÛ)¡Û´iӦ͓1J*!²]±qú§¯ð’RJm sοö“—´’RÎü×UÿøMµîü¿?¡C‹©ï½éÌË>ǶÞwÝ5^oVÇøü)å~åÇ#‰÷¢¯Oî¼~5FpôÍaÜñÒÜ3©wÖ‚×ýË«:ÄÝþÂæ@`j¿ùäÍîe—þûûÏdë —ß4²àò¼nyŠšZyñÇ.›¿ïó—߸+Öæ¿©}ò2¸òÛ¿òm{.üöMoX’¢+>ÖñئуªÁàáƒ64…Ÿ\|ØÚøìOv¯¸öÁBió ë&îüâ%Ǭ|íwƹ@Í|ÿâ3þGݧ'¿yÁÊ“/¿éÎÍîë¾¹½0;ºáßOüʯ½sVô3Ÿ€xóGO>þ_ýÍ®Ùîóþéê‹Üû¡ÏïÔOî9þõ¿[yÚ•·Ü];÷[ûg7~dÁŽŸ~üüU/ùâžøù­-’¿ô°¡S/ÿò±lùí·ÿäÖ«|ë!¯ùÐ5,MÔ¼žj¯áã¾¼¸s4–“×ÿÃY7´¦£µ¶ Q’þãåz±yJ›¡ºHÔ27ü#VQK~¿ÒDû~xÍe7ŒðϽn¡ûxàW˜=úʯŸyì—·üÇ¿^Œè-WŸÐõ{Ñ tå¾®ù)?í_¯8£ßjÍY¼°uo’:ìèacpçs˜ÿµG·Ä1ÞÓWuØO\‹=ï¬÷|íÄ ½çŽþà«W|難_tíuoX‘†„O˜0üBè ¯tRÜ~ ‘Ÿ|õ‰Ÿ:xWZig&N²¼Ü,Øf›6ÿ7¯çã‰YÛÔbNÐÓNJò0h„hÊ $‚@ Ik%®XŽ/ºëWßéé:î´—7«õB¡'<ßÕÛÛÕ—v;Ê»î¹û®á¹CÙÎLœd‡çt—Ç‹Ýr¡Zž¿rugÜ»kkµ:í¸¤幎 4[¬ÕK¹Ôhg÷ܾù«µæ™±={! yr&å<|ï]»¶î‚öôôõÏ7PK$I¤¢ªŸÎ H”P‘ zÌÄÒˆé §½þziVËPI¨ç¦] FV^yÆ‘Ø"[¶Nî™þÑ÷îF˜Tkžž  âJ0JÖF A¹YÇñ׳B@#D¸„q†¡ÔÚf,ŸÏC•RQQ†»²qìÔô4ÀH)5á0N †JH£”…‰Ë¬Ž¡—Bä8$­¿ª°qΆcÁe’$ ¥”E(%" LÆcŒ¤[7í¹ÂŒŸ"Gq,¥ŒWJyŽoYfPJ©,V+®ëäüŒmÛˆ²öئM›6mh|ûÌü÷`k÷GÏl¥C˜à'ïüp×Úóßüð7­ o¼öµóiãž÷½åkc\êì™—ž»(ÂgÿãK»n»izæ[—¼çõ'ýç™öÎÝS“z÷™ê]W¿ãE®´}Ƈ®:k~–¢ì‹Þyíßýç{ÀÔþ›ÓåÊ?ýÀ'6 ©sög®¿ê¥yôÒìúŸ¼úçÑãæ¤¦rç{¯øiE(Z{öê|&}î…G\v篃_}àC¿xå-çt“çmW‘¿ü%@D¼¾ÃN}íªŸwî×þéòÿ÷™ïsýë{„<³+»–Økßþ‘7-µ—¾ Ó•!ÓOS§þû6_ÂâŸ|,ùÑßòÙÑã?ðÙwŸÔÍžô;”XrHÿ’CŽXå¾ì“_¿ûMǾ¢ïwƒ^—ïýÄÇîg~ìíÚÁ€'ë™°Õ=óôU¿?r¨ß¿ú¬‹Ž8ãüWþÇeo¹ùcß<á¦èûFŽ’Ú8ë®üä[W¸ŸºÝdòiÊád{ä´ù‹MmWèç’TÊG)¸.Þ³»´tåðÐâ¹2âűœ•‹»¶î±ì$Pj%’HÉØRpfzW,’Ž4+ËÙ¹'-›·$5w!ˆƒ½þ&–rhÙjÔ«»·Î‹él—!ÎTqH–Ë Ð¥ëŽ¥=¦Vš«–K…ÕÇ¿¸Y.ñ ¾t´Ñä¹üDÔ÷S•FÅu»ƒ 0þ2›%…–*.‡ÙœI³QMe²3ßñƒ(ÊväŠÅâÿgï<ã-«ê»¿úÚõ´{Îmsï™;™¤wPD1±}R”X’Xb,IŒ%–Ä5KLÓXbKlÑ€‚P"3Ì0½ÜzzÙuÕçÅEDÍãÎ÷Åý|ÎZ{¯µï^û¬³Öoÿ €.„pø˜r*˲ÀçJiŒ‰µ†2¢‚D– ¥”X­¬¢ 8µRç˜8”êxÐ?ýô³»­æî]7Sê¨\¹<€¹i.7ÇÃÉ=wï¨x…¿{Km¬õ’ɉ©Cî¸ãÎrÉWy¶zÓV qÁ+Á A VhÊ¡ÖÑĬ¸©P2]±}ƒ£# °hŒ‘:³Ð>c!,B*),B`µ"˜¦y±P+ø…#‡¶š‰±‰ÕS‡*Ž„°þrŸ8ñèxmE*‰)¶¹°Ðh ‘Ñfåý‘RÚˆ0«ÊqÔõ …8êÎïÛɃ‘‰ñUIÞ_˜? ( «&×Ú?¨//§‰ò=žG1òœ8Š=Ï#ÝßXmlËúoZnC”± ícR˜€‡Ù w`áH}y"6>¹PgÕº5*Ï 4½AtâÙçö[»ïXZšw Åb±Œ ÷˜ƒ1–Â0†!Bfp¢RæÆÔqÜ, 2ÀWÑHk‘`ƒô0W0·ÇZ:§œ°jUͽæû…jµÑþ €e„sâb-F؃Њ6'2)Lºb@AÈ)¥XQ4´Ê@ˆ ´JÙ(Š ‚B©uš‡r ´2:Mcq#d4s\mÊ¥µY`icû"v¹ã0Î8]1$ˆPJ50!`,EÈPÊÐÖzžŒ{}!s×u0Æ"œP,åÌá®RJHI . Y–Yk)¥aà+mÖyž¸kŒI£8üY2dÈ!÷ɾî¯Ï±žÿ×üÆnøè‹ò­Ëƒ _xöÅN<ãÃÿ¶æON<}÷AmnÃÉÕ÷|ÉåÏxîÿyá>p~@úg¿¾é%úôw?ÿ«ïøçÛkí‰+ÿí¬"‚éñGÈÆ¾ºáXáÁý6.Œ€YÚßR¶ôk$L%ßxå«›ýÞ7þä=·^úžóÊÿó¥Åîg.ý<´ÖwtÓEOÿÝ·¾å¥ŽSq×5××Ô6Œ9ÀF××X¶õí¯ïÏžrRa²`ü´Ã—üæw›Æ&ž°>\¹m°xÑ?ß}=ð8Êï}Œî¶úö±µ€U§Ì0B¨¸á¤ pÝÁå‰Í~ó¦öJûÛ&8È­yôlû›ÿq_ò´Zá—vkH~I®Bq°ñ¬“ÊŸ¿f_CÙI2tSmª0é#ëVÑüða0~Ùï8Ç]S}är »Í¡lñèØxç?¾öýûÏü“¿û£'Žó‡YîA@”ah3}¼™®éÞüΌ]úÞ—ŸZ9NVd£[ÖðOßuëBvÒB ænÙ1`«·ŒqÈÆµ >Âõ#ˆÃÍçžRùÔU÷Õ%XÅ‹ÄíŸ4Ê´¶qšf‰+f}øàå›ÑG.ùc·9dÈ/æû Z,þq(7ʨK¥’¸k¦gzíc_ýìWN<÷b„Ë÷~cW²“Nó=¦eî`cŒ¹mw9 …4ƶ”Y„>ðÕOÔÛí3Ÿù›iœÏß~]ÔYdœ¶0,LLNÎß·'ú’ßx‘ÏÕá[¾÷®{l±´õŒKTw— GàL<8µzÖsla@©µ¹cÇ—^úŒ,hc––ëBˆâx Ûíõ ¥y.FGüÁ@ú¾ßlµ]×Gq±Lõ9ó! ƒ$®”«ÍV= C‰6‚1GÊœB–‹˜Q']m¡²°Pô}¤ŒìõZSS3cã ÇŽ¨¸Ë¨R®GöíÙyÞ¥O^Xn"ÏÎN¬=vìXC´¯¾ú¦g?ëV;ûiÔæÈLOŒï¾gÇóžó‚3žÿœNÜþÞ-7!)&@e 4fÅÍÙ®äl¡ˆr&²|ÅTP)‰Èýþ@€€@¡ÖZ`ìýþÐÀ"„1€bXØ´yûøªÙ¾õ“¶ŸØn·‹åÊÌÌÌìú Ýn·/"²Éjåȃֲïq%0Ƙ06èõ*ÕjwГ$ ‹"Çõ󥔈VÜöWºÖJæY†² „,Æj ŒE õ³TÄqì8ŽÃ9vè =dÈ!{HivëömE6¼ò“_î¬+<¦Ziõû‘%›¿ý÷ÿö×<÷C;2£ó¹;¯úè¯þØÛÞôŒÜ𯿽þçŠå‹Çžú–ßýÚ_ÿÙ³^8uÉGo]÷°ä#´º¾ÁÞåÁƒAõ >pv]…ÀŸ\û@SÛþð+ßxiôγ.|ÿ‹ßñ¬ÛþH‹¥_ûúþ_TDð~…`ÅÕP,ß»tD¼G€xx&‰¥=K™=sÛ«ÿößøé‡OÔ÷,¯ˆ€~Å{@KC<ø)ºÛÒ:ÔZ9ÝÖ:ÃG IDAT-­X"·ì·‘õûê+ì{û ï„÷»çZ{ôy…_Úá³°˜íýì{¿–­Û¼fªÀþ᛿øõÙrÖ4‡´¶mûÒ Ÿùâ–+fmk0vö“×ýø‹eT:ãEWŒÿþWÞùVôÂ+Nwòæ|õ¥—o.ìÉ)Ÿý²gN¼ìßßô‡èEÏó‚¹CûrdÖ®Þ\,ƒå½·Þr{½]~Îy2Q·µ´´˜‹Ü-– ÌçÌM’c,ݽïöÙÕ'Ê\`Œëe-Á@4ÈãLKs †cœ+‰1–R % b”¤¹ÖA„1£>CaŒQJ’¹B¥”5ìº\@MY–K26:Ýë byÕ踴À$óÜB†áÜуae¼ÛnMLLœp–¯_óí·¾õ­½^羚O£8ÊwºŽãxwݽ«Þn­Y=ûûîR(SF¥(¥B¥…1f%š¡”У­±(%5æGA®1DhW„Åc¼âx !€hk¬µÒhŒˆï„rßîÙµƒ3ÒhÕ¿ÚétjµZ·ß³Z¯_ j4Z“~·£j­b”’¬-ð\ÐÒh„p–k‚‘µÖsœv¿[ª®š™¿ûö;îÛÿogžyºT¤žÇ­ÕR€JµêøAœF®rÏOúY*Uï¹ww¹Z{åRž¥ëÄÂh4:ºý §û;×ènÓ½f͉‘Nw¾×kSON¯ëô;žã Ä<ŸbŒa€´–ÆkÖÚåTkÇ‘çyyš9\¸ŸIGkiò‹…4s”H3«çŽ" ‹)kçUÝw¨yxþP7N´†EZe8g„“,Oò,s]—ab­] ’H'„‘ÇB,×ëI’¸®x^¡Pð<'ÉÄ Ž„­f1Ê ÕÆôû}B1Êqœ,Ëâ4%„AJ…5BmŒ4šŒæ–#„â4]X˜ëGÇqµ} !žç`Œ¥Ñi÷û]a40Ðw£4áÐ#¥² Ïs­u©X$ kµÖB«8K1¡AÇQ”k‰ÖFI%†sà!C† +²„ºÓ§Ÿ7õS,¾1=NE!O{ß–~ÿ–«¿ôå¯þÇ—¾póeÀÜ—þäÏo}þÇ.ð®ËqO|å›/þÀ•×\ù†‹!¡ 9õÒ ðÖ;o™“nÁ½yGd·=åÄzŒÚáÍlŸöKÅ7ÿËk¾záû¯|ç³n{÷yÿÓ÷·cL~úéWm}ñû>äðC_|ÿëë¶¶ñŒßûÛW¿`“‹ ÀÙxå£U­`4*…oößme°Âª-—ýÁ{_rÅ…°|Þ«_ÿÌw~äïø£Ì;ëE'éÌ(Ͳ~·×]Jú)õðHuõÉgl[:r(OclU¦µë‡ß¹ã‡>ek¦¦€…Bè ”Y`Œ¢DkÀ"ˆ0Úxœž››–9PÊ@[­ÖäÄ`°„’kàyÈ2N|m1À2=5›$ÙÞ{­­¾Pˆ4±2«V­*—«“£ãߺêË—?ó71%s Ífëó_ü×~ôSÇŽ6Ï¿àÉßüæµ###JŸ0àÑ…ÅÕë6<ý¢'æ¹¾î›W Ð" ÁŠiûÊ.¥Ì² c €UJ!„VÂ/”ÑæG?BÀ£Ä'Þ#ÃBî‡2ÂCLøÝ»î¬Õj½<—Võ’þ¦õ[|׉³4Jb豉‰ÉF··eÆÁ±íta¹Y‡šŒWíÆòrcl¬&dže „h¤6Á'‰;FI„𪱙~¯[)×FG‚ÊÈ wí¼9j·7mÜZ¯7´N!Ü+÷á©Éq×u£¾E”ܪ%¤ÓînÜ´µ±\/W7öK…¡4Îaù|½°¼èâ+ Û­îÁ£·3ÎnÜ<1=#òÎŽ[¿œ 42RŸœÎ…bÌ¡0ÊBJæÖªAC@"JC+u½Ùeý$¬U]RêK‹7ã„"šFZ¦™TÈ"•u a}Ë-Ê vý…O2æß¯Í„*  Q’bìºîâÒ2¶X,æ9F„å½®Ba¥œU<7KRm-BH)Õjµ²,– % c!D)E@¥iEQ£ÝÐÆ Ê(¥$q!€“‘Ú¥Üs„P­2R.£(b«s•çý4MÓ(Jâxe‰ã8œ»ý¸!B²,ó¸S(|ßO³äÈü¼yè€n¿gŒÍÒ!H³Ò*÷‹ch‡!N† 2dÈÏ·7~äo¸ü/·~òs¿ùüמû¼?xç¾í”ÓßµO›¸+ átå0•K«·þÇ éYϼpûɽU¿öÉïoœ+nÛê>’õßúê÷_ù/Oû›7ýë3>}åf7Ûó‰7~`ïÌï^÷ÒÁǨ}ˆ˜ŠŠg½å_^óµ ßå;žuÛ»Ïý_h:Ã×]ráÈ{×mì¯ »Õ²±¿ € tÁeë\˜þŒÃ—l:ÿœòûŽ4¿ë@dNò¦þ…çœûW[>÷­w>ᱺs×^ð÷# °½+ä‹ûšÇÅ\sÖ\xzðc=`—w/+¼`€Ø÷÷¿þ²[žýÉzÞ4ÆX|düu—¿êíOyåwBï÷^æ“ýþß\ðê•B‚ô«/èø ª”O~î>ðœû׆$×x´ò‡µ¹úuÿüÙ•´ÃÉóaâÛ©ñ,Â÷Ï/Þ)ï¼ê†wüع#xÆ+ßsÚ+aïWí7¾ü37¿ìºEA0rê ÞúÑçÛ‡Ÿ ñ£V@ÁÆ_yý_?ýuøä¬zòþÝ“ÞpÜ“ó²ÏÜðRøÐ'‡VN{á[þé×~tþj­üám2äsÇöyýf±T"ÖêX=zÒ†±7—²¼P•Rvøð\Xð‡h¡„ÊKa)­TŒ[ôt[q*-NÍL ZK½ÆQm4f’0·VÝ·Z³qÛêõ—wïUÔûƒç\ø¤A·“FÝ~aÌûƒ^qd\cìyÎÂÁ†©ÃÈâÒ±3ÏÿUc”TÒZ%„(”Ê»÷³9žÏ¹ë2V X)¥µ–æ8DˆÜsïOŽâ¸?ˆ=×ÉóÜ÷½~¿ YqC&„XË’^d­Eˆ d»ýƸ߉.ì/Šý~ŸRŠ0À˜æYßñ-”jié(0ùÂáC¤TýÖ7¿ýƒï}¯ÛnÍ®Y«µÞ°n}©2rtaAÇÊBà:ÞÁƒûûÝVu||û 'ßµëL@i!†Xk­6@ÑJNgŒ1@k1FJ£-‚Çˈ+Wdwc ‚QL°%ƒ`fŠhÅ”Ò4MK¥"¢(É3ê:Y·Õívƒ°à ÛïÖËKŒ{ز<Ï]×U2B‚—VMNƒN·=èÕ}ÏãÔéˆÞä丅 !Eß-O­šéRØlÎi¥¥Ê½"wêGcÆÆ&&ãvúýCß©”G‹ÅÊv×[»nvÐïk1HUä‹-!!0@w{I æÁb8‘$Ícs{‹År1,ͬ>Áèþr£#(j÷í½‡sJ)-—‹ÀZB°”Vë B˜ 釈¨EÜ•‰n_·+µ1£ "p u`ŒÅQäÄb0Èò¯ÙQ©U¶Ÿ¸qi±§‚r–ç™&ù Ž2-@™r 1ÆÆB)e±X$œi­…Üeœqm-¶p|t4Ïó$Ë!„XƘ”9„0KD.¥PŠRª³ h¥ŒÆdYJ!b„Îâ8æÜˆ\i­Ê4°2Ëó,cœ `´Ö‹‹óI’h%‡sJ0nÀ”4¡Ç0 µÖýA¯Óé ú]eD¿×Æ´¶Ú*ŠA(ô\¥BØ+¤CeqÈ!C†ü×0Yc÷×þøuÛþ/9eDwŽ-ÆX<ñ9ÛQaí¦2ü~€…»5NûÁ+^üñ_¹ùW.˜|Hx-uäcÏxÒ¿{¸]³qÍ™o¾îªWorÙØö3GWò 4¿òüs^~͆6õoYýÁ×^}í·W.ùЭ×mxÝ[ž{Ò_æð‰³þè†ï½ê¼ÊŠ× zôZyèõI|Ý­ö?wËé/ÿòU¿úé—ì€Vúo/šù· ÞñÍ«^½Éý_µÓ…Å‹Þõ‘çãyŸ]ê\ý‘«Žœý,ví?}µn (?ãƒui•Àäg¾ï¿ë}OÿÆ‹þ£}ãó­³þô„P©L)!Ì¥€ÀcD1a ¬uOòìþ?Êô‚1F#0"„0Œ©52 ¶AŒÖÏn5Ï7æ ÅòÆ Û(¢nsdzzßÎ{NÚºåžÝ{Ÿ}ù“Ã÷Þõíj¥Ôé´ ¡ˆA’V‹cŒâÅ¥9m "<‰£40e§A¡ØïöjÕñ±‰YÊ=A–&GïS¢e©æÈºŒ+™pêŒÏ´;Í4M÷ß{ož'¥Ñ?¬"•yžŒñm2îqæSÇŸr]ÞéöãAzLg™_*j­•ÒÂê踚­¥^¯÷¡ñÉ Ï#‡Ž ¥JuÌXÕÄóGû®»qÓzDp©XÉ¥ÕÈÅÜ4{ÌjP Fj–ºs£áí‡Zƒ^ÔŠsÏ¡C2‰Ò$ÊD~lq!I’~¯P:R®ø¾ïú^7ŠÛíN”¥R‰(@k°5Â<„©ëVBRÊ1†ƒ¨Ÿ‰<ÏSJqÅ 0Bˆ1ˆƒq–ç¹’B€µ&—“ A)…sÂ1ÆZ*ÇqÃÍ^'É"‘ —;c!°*Š¢f»›Ùä:ë‘B¡‚’RæyÚîuó$Nâ  ‘”Rj+ežÆ}F醙Üñ°ûößû±€0sss€Ýûv?ïYÏû™&ÞÏñó›×o†NMM=æÁ×^{í‘#GÊår¹\.•J…B! CÏó\×åœSJ !+îç+úÊ*]k½bÛ»²8ïõziš^tÑEÈ!C† ùY‰n¼rý%ÿÚrÅwb‚á q÷­¯Ý¸âz*÷½÷ŒíoÜ™K“ó>þí§¾ûâ·Üý` ºðß—¯ýÕ –>õ†×þÃ7ïÜ}´ ¡p0ºáœgÿÞ[Þ|å™5 ‡>÷ú¿ñã7‰¡[YwÁï|øão½xìÇÍÎŒVæA»ücÒžÕZ?hNó@½5Ç%6x¨Í£×Z£õñ]AûÐÏÿ“TÅGÄõo¹óÎ7o{¨8jeó¶¿íO?òõ;÷Íwm89{â“_ö¶w¾äÜ1A ~öá%bé¦|ëÛþùº»î›ï³Òô¶Ë÷íñª‹W9è1»XÕüþ‡þàõ¼ê¶#IeÃE¿ñ² _}ýßí7ÆBL6¾ùŽ;ߺ§¯~ïŸüŧoÜu°! Õɵg?÷5oã¯m+ýW…ÅO}ü£[·ncœ¯¼Åÿ Üþƒ[§VÏ:®[,Ã0ô}ßqJéJ„ôG\xá´2dÈ!CŸR ' —êW<õi—\üµ«¾vøØ"w§>í²<é]sÓžòì+DÞ•"%–pJ¥yŽS‚(À0™KÛ…Ú$FzÐXP"Â(Ъßl·Ë¥ÑúÒÒª™ Ý^tÕl@wî˜1|añÀ _ü„¥ÍòxÐá®Ój´ËåÉm§Ÿ£b‘¤~«Þë„Ú¢±‰©åfkbbbéÐæŽÎï ‚Ðe.gÄ÷=k­çyÌá óËAmBãSJÍÊkÏ•…ª.w’$q}AÂÊ¥ÒÚXb„T+©SVlµ5Zë<Ï)Å31BÄÃ˲„1— $rå\‰˜BsÃ5WýæK6!D6nÜ(â´Óéïøá]a¶Z­µk×î¸ë®f½ž ¸Áæ¶ìÜ»r÷®»BÖ€À/ˆ,ˆZlµQ@€ ´V½¢B„€µB)%4÷¿øXcBb €1Aëº.„+š£Ê²„"¯Pççmܸe N$YjŒÁ ¡dVŠVÙÍë7ì?¸&uL³Ù(‹R £Z)E0Äƹ0BI!“,eŒXkŠƒA¡PlµšÕÚ$¥K›6o»ý¶o‚u&(UF:ýÏ‘b´6ÄI¼‰!ŠdBlÔÏú{.ÖF*>ccceÇõ Ai*Ò¬‡ˆ6…Z­Z«UG——êÂÒ¥ƒ»}ßïuº˜ £ÇöO®ššm·ZÅr)MÓz³]RFˆlfõZiL”¤¾ëM®Y5Öí4æîw?K{~PrBGKÁY!Iz¥šC™h`´ž k9È…–ÒxžÇ 2.ƸR(Rˆ(„ áb¹äº.ÆÇiœ“,ËRJ#¤’ižFãx”RŒz¤TŽÒd ưTªø¾o„%0TJ‘§Vé$O±Zk‡1ŒîO ͘À'YŠt˜W+Rªßk)¥¬Õ"‹zýá0Žc­5cÌZË vJ¡ï1)ežK!ã„1¬(–YlŒYnw …á8dÈ!O‚óþi.úLJ–¯«Ñõp{ôûÇ™µCŒá ¢×oè~È;6ûëïûÒ íqá5L`kŸÿþëŸû7:R>’v‡0ù i Æ$Ú@ô“Ô¡G©…?Þü‰]ÿÄÊhõôßþÀ^itg=n|~žáãç½â®ý=sÿIÖŸØ’êÙ¯þø¯²Ö®T¿zÕûªíúë®xógžú&{\ûý²¿E ‹C† 2äqŠïk#ãÕÊÈÙç\tËw^ãžj­Â0†¿ï½·íÔSOÚ¶%O[q–Tü@…G 1‡:í4÷¬ÚÆûE1hj™9º0:1ÑnuF*5 ÑÈÄ(|Ñ[sGwï½·ÇcÓ¥å£ûU úÓìõ.¸ôÙ€ð¨¾Ðm-ä"qý€H#T[µÚqh%²ààü²ë†#Ìp1,PŠ“(Êjkûƒ¨êÛ.!ÄZËÓÆFQT+å±ð]!¬”Z Þ‚1n·ëÏÎAJ J©RJ™ Eöú×u;]C‰ãc 1FaJBÆ ‚úÄ-t?ã×~ãë_ÿzÉ/öûý *Œýà¶[Ö®Ù43±j0è‹Å4—GæOؼù‡w܉”Z\œ‚B¡PhwÆ"AH ­‘ÊXkW–LÆZc ‚Сl%´¢5–b @C!Bˆ²@åb%f_žKL‘ã8"Ë¥²÷Þ»kÖ“sÚÍF!mòÖž{§g7,-/oÞ¼Ùí…¹%kRk@±XLbÙ‹zÈ‚,ó9ç%Æ£8‹ãT(£@Š ‚!„0¢•R1NúAXi ªÕ©æòÜX­šË>#–pgt´ÐOzRj­tutlПìõz#>'„‹Þxµ²´ÜìvûhîÅ„JH–e‡çñm'Ÿîx¥‰é5`¹'JÆc”Kyk©ž§`õúÙf³^©!‚Ó8q]—rÇHå@d¤mwzŒa‘ÑI)„Èò,Y¥žã—µtFFCı@+…5˜\:Rò[ÝP ×ë1dbœór±Ä)c££Ê˜0ðîcr©¹àF1é¹4¥Y*²8IŒá–¹ £¤4œ0Fh1,Â(U¬µåbQJ©ŒBP Wœc@CÊ€±# ]®”0B¾çåBPL&F'sVLöâ8Ö6b%Òcè÷ÚѠǸoŒ¡ÄÑFX«9gc-„XI­Œ• 8Ì…2Æ´Öken²á8dÈ!S &?Q õ=Š²Â·" ïøà ?èцèç>ˆèçèî6ÿüðlºqQCaqÈ/çWr˜ bÈ!Kœ¢o n‹äƒŸø$'tdͪÑphtÝ7¾sÁÓŸqþ)³½~¦Räz£§a˜%tÐY²gBΈ½¸¾à¾ûÀ:k·ždsIiˆü9ÃÔ¦ƒ«®þiÈeÏþõÓÎ9þà‘„Ú~£³4¹v«ë‚Æî;ç—çM¤¥ñ ™ç9òŠ2Ë÷­îÙ ˆçEx¤0âs§ßé†ÅB§Óƶ[]Œ°ÃIš¦Vi A·×©VkežãSÂs‘ä™ cŒ]×]Zª×ªe µÒ:Ë©µcDZëºwì¸óÌÓÏ"„"€Óyž ¤”Zk¶Ó¨ßtã·™*VÊD:t8ãÐݾuëÁCsÓÓÓÛO:ñúë¯/+ÐØwíCÿÁûj#5DF]ÇïuºããSQÔ‡S‚ñ`åÇÈ!4ÐŒ¬µÆXc EXkM^qÜ€c,@ŽëXc£¨ïx. TJ ,Dˆpƒ X˜ßŸçÙìšMRj­%c”¶X.|zä®{-È´ÖÜõ–—Š…ÊJj0ðææçƒÐ+„•‚Wæn'áƒ÷b;ÀV+5Ê0 ×môûý ·ö»ñÆ-§œuý{v‚,B^àŽŒŽ+eò< zO8·Û^>zèÒ9c$ £“Så„ÊF„ ÚÀ™ÃH®³,jh•hkgff8çN'Ï3L˜µqw±Ñ¬ŒÔò8Ú0ê‚ûÝn±<u{2IÜ•2ÑYbôÂp¤6k­iÕÌT§Öå{ı†sÛýäöûk•CD¨`Aâb¤­agŒöz=‹±²ÀBD•RÊLªF±5©6:O!0”RmÈ€p‚û}Û !Tkm 2Kb‡:œ¹ckm*3!DkM ©Uȳ0 ƒ0,bŒcã$éô{ƒ4IÒDj «M­µDqB¯èšF¯DÕ&‡Ð*¥(eÀ2—{¿ ¬’Ê@èjy> ±8dÈ!C† òÿ€¡°8Xk¾F2dÈãd‰± M’¨×îäÑû»ûzivÊ ›¦fFjd&á¼ÄˆŠ!NH@8jõîÄÈsŠ£æi'¦ ·›u¢Œá.!l0H™ò°@1‰Úí½w}_bÕš­'žÞih%í? Å`jÍöí§žRßs[}é¨Ì…¥NÞík­‹åJ'ΧVuKÝN1(zŠ_(yA*2îrŒqèù K RÊõ]­3„熨Ûm†aØëv\ÏOÓôÒ‹ŸºØé‚~ÇÄ]€V S,âÜÉó\i(‘R÷£8ŽS‡‡” ‡2èB¯8è÷8eõF#ôîzòëÍöüÜ‘™©ÇææŽv»þäªñóÏò-ß»±ÝéZ •£µ‰‘Êø JMø3íöâܱ£8…B!(”Eœ:.…bŽ1Årl-ÐŽãhc¬J %Y–J)FF*˜`ˆ‰¶8Ió~ž×ë kg-„­F£?ˆKå ÝlB ŽÍ¡ÐJ+ …"00M#Œ1¦D ¦ŠyN®„:´‰Ì%œ™™ºûÞ½Ó£#ŠãDC¨”´pÅÊÕj1N¥LÀ;Œ§i¢µNS´q`µ0æxŽëºc*µ¤‰Ì…2FÊœRFQJöý,Ë€ ¡VŠSêyž£½,‰ͦ”2ð|Jˆç9˜!3)±1†‚(“FFKå&XæˆiàøŒ1)e’Å®ï¶Ûmµ6¡‚jŒ1Ö)sŒ0 NSÆ cd¶9L óB2dÈ!C†ü— ‹w\Çß}ß=[·lÇÿãÌm‡ ùïÁ>l+º’ë!+±=ùÇK c̾÷ù~04(þÅa€dc œ‘1…@*#ˆÜ’PHï¹i ÑIë§J˜·³Ê„±¨Ÿî÷ï‡:(ÎT”Õ­ÃG€É–Ž,EI4sò9:ýVwdzµ&L÷Ò›®ýÂâò!ƒ Ÿúœ³Î»`qa'%N‹$Ë‚ãë¶Í¬¯t—îß¿_Ź¥¼^ŸÏt®”:ºT¿â™Ï«=¼sçŽ~–B,6›OX³}¤Rêæ]Ia¥R©VFZÍ.÷‚4M†!©ã°(Öè,c”am †;Ìh‹1ÆD9ÔWJú~(D' c¬^o–+NY–[%Áá#ÇÎ8m›Ì3 ¡ÌµÕ314VJ¹ëÉ4‡Ž×é´ößu3–Ù §žrj©X¹g×ÝÀr¡Xo·0ƾïMNÜrûmÜ%ÓÓ«[f?J’¨Ë8*áíDmH`.RÒFj !Ö­¬k-"4¥Ô"D(¥Œk­­ÖÌq¡2J)„ ¦¤X(ÅÉa]­heš­úìì–úò" ×í2‡ÝðÝggg7LŽíßA±îCƒ)ÓeBR Xæ{ŒyR™z·W)ÅÑ@fú 'œÒê,/u—1¶{öíðyáìÓ/ö‚Bšõ-­VAãòÂÂÑ¥$¶ž|ZµZýÚ—?cm³Ñªs†V¯žÅx ´iË©›N8ñÎÛn2KÓ[«4³€2„µÂJJiœ$!€c,s ®ë.îÝ·¸0Ï9-–*^id|lU_Œò¬86–¥±ÉEo¬Y³Æõ ßÿÖB×óޱµV$ ¤´è– Z úYR[edŽp„BW“å9xý­;R-Ç ®ï•*倲’„BhêõÑ Á‡g­IÓHKÙÏcBH¡Pò|„ Ë…ˆ:]md2ˆ/.&I‚BCs-D8¡„3 0ÆQbŒQJâØ`Å”æp‡ …VQ³Yo5¡±ÅBa²6˜Óïõ”5áÀ¹³N ‰¤ÐJ[ ¤Ê1£`BˆÌ˜Öš1.„€ "„ÇÁˆ{^`Œ1Æ„”[k@ήC† 2dÈ!ÿU†Ââã ë6î?¸÷;7]?¼C†ü²Q)LMÎ ïÃ/Ž~§M³r¨Ã=2&@Â\¬4šo/þê™g ¬½peއ6@;èÙõ’òšI#uÜlYhúÝùÞêé­q’EîøL:Ëûö,ì¿w¡µ8HôÉç_rÆùgäiÃTKeÒÂŽO­™Ý²©½¸·w숹&Ze‰5 [«qåìsNkÌÍu£¶„0 ~3Ju&j«ª:ϲ~?(• ¦R¥ eêÌq˜µÄR2Mz}‡ò8°J [š á{.!X¤Y†€Á,bJ!Œ1F0ŠB¨4Õ* a UcÐsi)ai"ˆQ,”69<'„Œ‘v§Ã™g­Îd©>çüóæ-6—šBikm÷¦§§™Ÿœì¶ÚÖΕÒÎ{vZ¥]ÇÖ¯·—ãLOMu·kµ4x¾“ç9Æ@ 0@!Œ°<Ï)a‡2 …0IÏó<Â$PA‰ï0lGy»ÛsCR©7NX$ÇYÞíÍ3µÉRÈT„ ñ¼0t¤V FLKÁg˜9ŽwšNNM¢ã4‚–䙜Ÿê´–0#Õ1c@/iVÊ5Æ<ˆH©\ÛµëÖ#‡ïÛ¼õ´ÑêT«µÔj._|ñ³n¿ýú(ª+ öïßWíËJ¥Z*•T7nn4–Ûeâ21çTÊ\À¨g¥5Š£hP,JÉòÒÜôÌìèØL§ÓÎÓÖr½G–4æÆü A– u ŰXqýn’…b±RËò6Ê•^ÀeÅ gŠG0ånÈÕH©XIÚ-Ì]À]„h–`в§]þÄX\w÷=Ò³0ÊYe(g„1„Ϲ2ÚjÃ1Æ bcÌÁ#‹2£¥TZj!„ÖZ[z>EPÉ<R6B=Ï÷@™’©Ì»ýž9EØu`ÄS§â‡!dQšÄÌu´ÖÐØ•,„‰b͵šJ©‰êÀg\AœƒÜ­ u8UpÀ7Ž@é(IÁX0§ÂBH0åÔÁ0æ@- !·€†ºâ!C† 2dÈ¡°ø¸Ý´á„á}2ä—àpãû‹d´ˆ—û½jyd$Í“R¥¼zÍô}÷Ý×n5•V“«Vû^Q+Éò¼à–‚[jC†NOΦQÜë&çŸ{ùM7}“9Xç€Ü(»xp™:n¡RvÜ@E}Ê]¿XI£|û9O[:°O  ö)À˜áL‰¬'”Ð6’Naˆ!÷  Xà±ûÊÞx÷î9·ž?èÅGZ‡±Z­Š81RÅiÖëõ””×uµÖSаçr ÄàRŽ =!d5Ú-!„Y–H-Paâ$IÒtE"Ï¡µ#Î8ç\CŒE¸/VFÇÑZ×jc!kmÔ-DšX„ûý¾çyÚ!@ÐZHÇZ[r iè—¢~«džK±’§ÅåžÕ†ÂgÔ¡”»žËGk¤ùp2dÈ!C† ù + oÁ¡£å!CŸ,,/i£¤Ì]/¤Üaž_¦§¶É±cÇþ“OÞ«$@L$m™¤ÐøNe>èµLÔ#QR\=½ÀÔ{ÂêøÃh÷ÒáôU“ãKGÚœ¹,KòWÊ#i–Xmǹœ«¤”bB¤’b"UŠ$YkF+yuã8%+­9!+é»’4%„!B­µ”bèÁÅæ‘ù…Æ\7Ìò®RPÞ¥B èù¡!!â8^ûà½;ný>s½ÐwŒ’BˆwÝe0`WÇFïÙ¿»41&³ÔÓ¨/k­­µÚX–¥B¥´µ`µa˜XŒ¬µ"¥5ÃDkmµÁB!k¬2†A ¡2ÇCdTÚXct¯wtE'p³,+—k6×i:¨n.8È ¢|†™ŠSD†8Ï¥± Æx'Ä#yšº®1ÖÚâ¨^ô—»ŽÃó,™žš™›?©7— ¡ò­µ!ŸúÐ ‚ iøÁ¢( uÐFç\À=`%EU‰"ø‘ïû>ç<ð}JcLá@ „ÅÊYÃà,‹Šs†±sNa-(Š#D ÃcÎa…´)%@Ç c ÆXÊÊJD…ÑZsæcßgÔCˆt:“~à—Z©¢ei=ÖjµZ­V«ýãÕÁb­V«Õ¾NeÃ~©+ñLgú¶S§ýF°ººúñûoGÏ»åŽÛµ,8›Œ6EQDqÇ++¡Ó>(ªGá…rmµÜÜfS{[qòè½ï¥éAw£è7Üýc?ü]ç.?ñ¬{ž—{ë[ב6&-ò™…=Gî¾óî~:*´¼²q½51hq1í­#€3éfæ»›kœ‡JKä,€ÎÀBˆRA㤠ñ‘éno*-ŒÑã|LÍÆi»å)¥!Bk½+W¯ìݳ¡ÖF橵EU NÆX˜$ɹóžÿô{²b@Y@ˆ¶¤UF(B̳b€E)½, ;×.>yòäIP©RB íM§Nœ¿|e:ŒolÜ8}êæ7®7š­Þ 7ÌFœpg° «ò,/8°¾¶ÂÃE”޳,£‘uŒqkM!*­µÇ9¸2Ò8[U•Ï8Ö:G!°ºª*­…¦£ªÙlV¥ÜÚ\FŸ>~ËýÀ«ó;rdÁóø7¿à%[›iÖÀJòJ5xä Bîy<nn®^œêHö,ì;yëÙ½w»¿2ÛžØ D˜DX*Yõr„¶cÊ«8VaÒivšßþœ;Åj#dá pÎiksᩉÉÝ­ ƒ €Zà€uŒ`ã\¥­Óêœë†R*‡`§Õ „Äq¹×h¶´Æ¢ª<Ï‹C(­ƒ²¨8á„b`,Cxyu !”¦)¥´5AÔã»[=Z¢(YœÝK)ÅŒ}~ŸZç„”Î9i´1ÆZ[U•”Òz1¥œDhƒJ)çœUšRŠ1a1¢R%4xfrªþYµV«Õž’ÆzÙâKÞS w¼éÓÿú[b¼;æëo~ƱÜXÀÏ×úû^ÜÆõtP«ý#ÕÁb­V«Õ¾N…¸ZÓcÇŽwûËŸ}(ŽãÓ§nÞ`ÖÁ1'ØË†=Œ¡ƒ¤ €Èy Ñþöö ¿åOMLj,Ÿ}" Éh4获«±zö‹Ÿù©¾ï™Ïyvo°¡ò•Â`¬ò¼‚BhãÆg¯øW—/‰²j5:+«7§ó3siÚeµ±Ý xpÏé[G£A°¥ñ( {N)UÒÐÚ``X  tB”„q„tÀ 0PF*)¡sBJ©BH©’Q¼Ûây{ggjbrœe>÷rZ"Ð)µuÚYkr"쬵„ ŠUjœº²="„ üÀ^¯·7'µ·:yó-'WW×Ó<+Ó”b4£0 û¾Ïˬ„nílM´;œs„D@ 1"Äj ƒëÌn#0"9±scì,pΫ FB眃ÀA0ZmÒŒ1£4f`}g3Íó(䔳ÈçJÚBV”ë´"ä‡QQd„#$AÞpØ­¤¤Ù±#'†½~.2„P3IšI8Ìú04ÚNMÍXk1ÎÆãñ¹³ïÝ{dïü¾ãÇNÝ÷É{Ë2»íÔ]`¡l%ýët¦)v—®<695Ç p›“Äg[IQl·Ö—Êô¦[V§ŠµÚW@,ÖjµZíëTH/NÁëÝ.³ð¿åyf+ñ©–y*¤U9CÚ ¨<µcLŽª’ãQ¢~¸xä™U±yõ‰ûu•u»;yšeãqaˆ³âù/|ápãBgIHH-+Ê´7ÚJš“Ï}æó?òáwÒÔ´9T¥Î²1ãáv·Û“âö[ï¦F:<þ=/{i¯¿îQß÷ƒñp0»p ‰[Ü÷E%¹,¸Ç¤ 7Ô!%ÖIè€H+U¢y>6s¥Ê¥¢!ΨÉV³›Ž B”ÍFFLeU#Œ r½´7ÑŒË a4Eïûðû:t`~ c+¥zƒ¥Ôóàçyà[¾é¥½þ6Â`g¸ãE hrfƒ~§ñ"Í^¿zM{îÚˆy¶½ƒ¢„EÑZ·Ûmçádœ"YJY)¥4tk­QJkíœ#„h­0£À‚0tÖãœv[B¡ï¹ÀI¨‡ù8Ð~”‡ý¢Æ`]ì\¿29Õ¶á„Jóë3 9ç&š­å¥5‹¢!p¬Ê‡×®<6;sP+Òl·:íÆÆÖjo¹ß÷öáýí$¦o'‹ã~wõòÃýõ¥…=ïyÆ7ô;g/œOâÖ¡C7­o¬zÞ9mtµ5lìlOÆ ¥f>öØwÞÙïnwÖ„E:B˜hèž<ûYF½ýûŽLNN ­¶úÛ­Év³Ýùôùs~èÃÃ9~ø¶}ö¯m¬C`”ŒÐv³99Ѹråüök·¦½Lм )e9Ržjhçyaw"ŒIÔjH!¥…T;ýµZ­Vûú493딡ډ¬Z‰BÌLÍMOÏ „ž©°1Œƒ˜bVôGešBŒˆ`Dw6.-]z¼ÈEž -¤…LÜ~Ç7ÎÎÏ`£6VwŠ‚b‡ãn··ºoßVcþÏÿËÛ>~߃^D1v¢^“`,ª*—ê¦Ã7/ÎÎYà¸PLîºóö­Íµ~¯KbŒAÔHZÀ!£­ˆ`îñІán蓦)!Ø÷CÊ0®,3kí8h°J)­•1†qâœ+óZh B›Ý …Ð †C‚ÙîsDYaF¯_¿nœ³B)¥B–Îç\Q–Iïìì0L ³U^4‚H‹b{{ùò…'rFɼÈâFb!ʈâ(š˜iÇ ŸûÇ€ƒÁ`4)!G£1ªª*kµRj·8ÎZ‹1öC„E%w#„µµS ,ËJ*ì1‹ Ðk§-ȤäA0Œ!ÄT››k•()%qAä{ááÃGæfŒVãñpfvªF$‚øa´±³•U#e²õåÐkî?2ÕiQÌVW®]»~‰’À’<+÷ì9”4æ‡yÿÚòÙõ-Ã$/ÆãÑh~nO6€ÃqÔRWE¡µ„Ôäe0XG“æÄÔÌ‚6¸ï! ²›7.\züÑÇ>{æR»¹Àµ2cÔ6ZÍ'o»íÖ»æf6¶7Ö7vöï;<eËË7>ö‰w¿ÿƒï<{æ\§=77µÐŒ›sgDŒRæv­±±b\9 +QXgœsÆ8Îý0nŸyû-¦¬TýÁÎÎöng!åp8ÜØÚgišg¥¨ŠªŒ†Bá8K£a·ÛÍ‹„bÀ¹ï{!cB8KKàµVJ9γ¢(ÊB´šÍÅùÅ™™™©©©½{ö´ÛmîÑ~¿ßíõ.]¸xùòåµõí^·ª*‡`³ÙŒ¢ˆsîœ#8¥ÓÁ°·¹½½µ5ôó,3VWEÑïw··×7·Ö ‘9`Ji¥T)*禄RJ)•BCÃ0$i-+•çU:ÎuÅb­V«=•AÚ>ÔW~ú'_üÚ÷lüO*Õ‹3ðš—Þuh¶ÓŠ( &ozÞ«~óïo .ÿæ­g»³É¡7|è}ozÙ{"F[ǿ㷫ÑçÞüªçëpoâè·üÌûVÅÿµùñßþþo8½¯ã³pêðßþÓ}µ°õ´S{ʪ+¿Þ)%?õÀLJÃõHW«}mÙ³¸ï¶[îªÛ+}õ,Ìì…ý4õ‡=NÛg{)xë-'Cæ8!8æ a-èMþï` !âe©ýg”- «„Q’s¾eP3Yø¦çÜ7¦úÛýå«O>öðôÜâ‘Ã7Ñ6ÏÆÕÛþüàR™;n} 0±ÁÖêµqÚ/%­éC‡wû[O\¾Ò¦/ý¦—lm, ëæf÷6š­ª¬ææáŒBŒ9&Q$r‚÷ØòÒRúKË׎;UØÒZM(bRO¶B ËTŒBBιï#³&Œ…Z¹²,C/Ð †Ãþ8—:‹ CSJÆOœ¹|ôÈAŒ FRi—÷‚XjÕô:Í$&äÉúê²¶™Cã|½Œãγî¾í¡GýÜgöÍÍ‹q<,+ÁÙÎäÊJªDÕ-FÀÀŒTŒЉ1†10V;g€»ñ®1&‚\Y` ïûJ)Ê}!óC%eè…6´BɉN«Ùl^_[Œy“Qc˜f?úC¯«²aÔh Èʪ"••)JA©Ç0ºtþÉRˆåW¡sÓ ½í­É©ÎÄdËh€(¸|ýÌìÄlú÷êïöí;xÏß²Ù[]]½ÐímŸ»t±Ó™ ‚À1¯Tzßã—._0æÉvg–aÞð«ÍÎög~0r‚OŸˆÇ[«×« ´[Œy×–®`è‰4“ÝìL[›&žj‡a˜Û»ïÝœÅG÷Ó û§¦¦12y•— b¾§¥a”ONNk£‚RVVÇíÖ+½cGoŒ6­)1€axÍ&¡Œ2OÍBd©‚Z pLÙXäýñx íL®\/ÓtjnS&¥ô9÷}_´Ö"„0ƾ{ž§µF …!‚c{J‘ IDATÔ‡!‚eE1ìõ‹"7ÆFA€ò¨ç, ”bF9ç”R¥Ôp8H‹"|Q–ƒ^¿ò˲,1¦ÜóœsÎjD1A¨ª ã ጋ²ÖX«µ‘ë«+B–Œ‡qWB´›†)¤X+“ç„@[ˆ£HˆR‹¢¦Ä”Î(=U½ð©Õjµ§t°Ýõ‹õœ7ÛOÞ_X»ò'¯|ʼnßÿ£'#ôe+k—?ùö?þôÂïÝÿáWôò3ü<ï5o}Ã'?vãÃÿÇç6§¿ùç~sõM¯ýÇ´uWÿôßüÌÓ_ü’¾ðû\üÛ×½è»>{tkçð‹^üŒ‹¿õþËúÕWþðé ïzù…@¯þùËoù÷ô«?|ýæßóŠ;ø?|×G>ó;¾ïßòP½°¯ÕÁbí)çÓŸùd7î¹ûyõ©¨Õþwì6øÿâ÷?>þ¿èS~ò̹Ço>qºÎ¿J„Ó˜/¹,·ÞzËÜôìåë‡÷w|Ρ¡jœL„Ì`ˆì8ŽýÁ‡N¨ ˆx°’êðÉ;öÌ õÒåkGãþÁƒ'Oœ8ÝÝ^ýÄ'Þ7JEü ™nòùù9`ÇIœ,•¹hkЋx¼oÿaQ HpœÝqçÝçÏœEHÍÏÏ~ÈyèD !8çÓápeD¥””:R‰"¢ñx§ª!Ä9ĘG05Nx^À™o"'xŒŽÒ¡ƒÐ9ǘg´¦DL(Ó|B3€ª”4ÊmmwíߜѦdœ+Q91Æe™£N{œ$a¯Ê\Ę̀RŠœ33Ù¸ýæcW¯/7’¤º´•Çy)Æe•cHš !%„:´[œ(„C8mcÒJ8„Ê9—H„aH¶®tÎqÎ!„ã8Ž”1b ¤kk;Î"Î}k­ç{ ܸ~}ïâdšugÙH@à"?HǹÇ)p0ð=JÉäääh0ì´š…Èší ¥ŒR’2uceavqaqq0ìÍÎæ¢œìL9ºokkxâØ­ËËg·{íhJ 4„@­…³8MKΩjbr^iW)¢`ÏüÊðúú2ÆÖ@áÌ?|è¨1fii©,ŃG¤ì?úè£Gžèm®·:‰é¹ÖÄâù3ŸK½|Ðkµš•ð0â;;«UU*!ZÍY¸TU&y”.wÝiÄaˆX5›Dø!  ‚0pÎqÊ£ ñÈÙ'Ò¬hÇ™f“ÅMkm»Ý6Æ¥´ÖRJ ¥”1¦µŽ¢ˆ@$d‰1.ËRI‡) <ìùÔ8E>÷¼i>yíÆ ç¼»½]–¥1F)…âœ`‘sZëJ QVEQXàqŒâBˆ¶VUEVB3Æ´Uã|¬…vñÀOü0!+!J4ë0BDˆ1FK¥„°©sÎùQ€ÒZcŒ)‚¥–J©Àó…PÝñX‹ u²X«ÕjOi(:ùoÿË;.>ý;þdÙØòþ7¼øG<ø»/šý²ü±ýmo}üÙæ" ;ýŠýŒÿàËëüÛŸþ…g¿°}Ó·ÿË¿ógÿÓcCð±ŸùÛ¿üÞ=ò“×ÿòoï™=ò¯ýÜÏÜL.÷~ðMú‰w-^6Û@ÃüÔ½o Œï|áí“ä¥ßwÛ|ä¾ücÿîç?üö¢)R/ëku°X{ªIÓñ3Ÿþ„ê‹âkµ¯9·œºýÌÙÇêóðÕ#‘-ò|}uÅ‹Cì±Þ ¿²²'ÁMÇfqRÍ•Qj H<¡@ì˜ÅX# ´ÈŸ˜›/«tckÛ)Gm·›Ìƒ÷þý{VVÏ9hG#…Pd,8và&Q¶¬(¤”E©8‹î?Þ™™RƒñÒÒÊé[ïPR3ÆÂ( ˆy¦+!¥T°V! TJy“JPJûý¾”Š@‹1€Ð!­µB£Ç}em…ýtìòýPY Ϋ ÅÆhÏó¬µ)Ƹ*«†ùŒï¶éð}C< óéiRÊÖ‹"mœÒUUy–Ie8ó,D˜@ œuêâù3¡:~ðYϼû£Ÿúl³Ù>{ãbwk Ä.ËsàP3i«cBˆ$Œ¬µ((¥û!D¤(cÔãy·!e™1ÆYÅá¹óç§§gûãTk{pß¾îf&Ê‹W®þá[Þát¹¹tÆ‘ ”i¥”­vcgs#IšJÀ ?ÒZ/¯Ýسoÿ#µÚ׌qúU­ž?«¬3:ŠûãF¼Ó™\Ü3…)vZ !ÆJ‰²Ž$”Ãe`±PF©ŠPb ¢N¿ `Ô]¹X¦YšË²ª4  zzI‰Â8¹¾.ƒF“S=ÑjíÛ³_ ^Y¾zcu‡EÁÍO{ÖBÒ©Äø3ß¿¥\£Wç¦;£l|t¢ã3†ŠyÒÛêZ ò¼,ŠQÔlÎÎLÛ± ÃðòåË„Pkð¢[kƒ€¯oG©óB…¼µ3äE˜ pvj–ú¡´¦×MN4ºƒÍñHLMO.­¯§Y¯Åó0ÆUU4”ó'Ï\xÚí·X©Ï×BFµ–¸Õõ Òá¨(Ók×—n½í&² ßߪü1!yö'~êÕü;´±åµ[37v®E˜±ˆw‡£8ibˆ¬°ÐBЍ2–b4ýªª”Aq#iÄØó¸1vØ[§y˜y!sºÄŒSÂÉù‹g‚0vóŽ>’WºÑ™ljøºWÿôÊúyëœìgUº€ÄÜg<,e6Ñin®]ÛÙÊ÷sÆÌÎ-žèœúÄG?pýÊ…»n¿}§»yöìc·œ¾{nþ‚>J7³|›’ðâ¥Ç0ò<þô§}k–^‘ÚVU…iå…€f«ßœ\ „çyŠP™„Í2Ï!ÆaÄz½^Z‘ßN’ÄØb}cK[-®9gaD=Ï#„ieó¢×ï÷}?¾íÔ3úý­„2úÆúeëÜà¡Áþýû¼ûÛ_þÊë×.}æyÎNÍPâ\|v»=±²qµ?Ú>áAν0Š­½ÈvŽ=ëyépg¼}a ÉJ‰LYª”z-L}ÆZeé6·ú˜úe•fùPT†Òh4vËBwÿµÖB Æ „ œUUbW•¿¬ÆI–åý~ÿλ={Ö=Ñl)«­ÒƘÍÍíRTÐY„ ( ιçyP[Ga©ÅÊêj!ª‰0aÌ#eÀ9Æy&ò´„¾êçU¾¼µ¤¤l5; ³é™y>!Ò(¥T)ÃäŒ-ŠÂc­ÕRŒµgE™§R €‘uX®+kµZíëáûntêGßùŽsw~短[Ü÷ú—¼nþMòK®*Þ÷ßø²ß»¡Ìì÷þÅ¿õϦ?óʽ/úÛÌ8™Iû£Ÿ!$  >ƒˆÞ}‚1Ö ¶/nïÎ/—áÖäM|!ª½ ×RsOR/îku°X{ê‹°kµ¯MAŒëQú«¨;ØìscÝñ›N& Ç=N Û\ÝRZžŠ#ÚT+”ÈG1i2`LèEŽÀÊQ6£a/Ë è VŠ0îó@…r³;HSC"pú#9"|Êe6¥õ/ntÎ.Ø¢,EÕµÕDkæYH[ ªÊŸù€PœTÖ:%uembŒ 5ei­B„bÀ«|臊8í€ÆÎ(e¤[Ÿz„X@ØÖ`¸8¿h Œ¸ç€jOMIQ÷³¬ÝndY¶¾Ý=~ø”ˆ´0-KŽ'T†rÆg!ÖZŠh) t‚1¬Šr²Ý³¹©î­EAsN`ÖgÎ_8âà›õ×_û“¯ã¿û•K7–;¼eueޏŸx^QT㌰,Ë(¹¢aÊ@^¤œs«ÄXLŽG­F#Ï+Œ©Î9ã€Ò÷ÃÎä¾^w0“âdr2½>PåXëÔ‘VsâÖ×–â¸1?ЪjgûÆŒ{ )ªg=ç[o\x,«äôžý¢•¦ŸpJµ–æ<Ãqw¸‚S&ýÄÿÍ/xIԘ؋¢ËW4[Y…¦öy<Üîu£0<VV²Ú-“daóÀÞ;ƒ- ¡†9,µpÀR–pŸgGC)EN=ú¼Ó™vBhggç{Ãþx”CŒR“ÓãÑøþ}àÎg>aï±3=éë±°LO<›~³£»ýjå£ U šÂóÝÒÕ³ÉÜ*ZPTÎFa„OC„ˆ…Ö"½²¾Ï-ìÝ?{sšom÷777Gå8`‰çyƒÁc\%bÜ÷ý$I*Y5ãÄh£œ3ª ‚@k3E& 0ýá âÆêRšŽ­µóî÷´Ú ŸR`€ \Ii­<Þ }€pUURVÛ[~OMÏŒ­í¬öz;ƒ-N±,RL¼ÌêVœ4‚h*i·‚C1å™R *‡-²JWJ‡C¸gE¡”’ZKŒ#àcŒ‹²8ç”±Z YåÀÙÐ-¢AKQæé ®X¬Õjµ¯o¼tö%oþ»7]zÆÏ>(¬½ñ‡ßójfÛG>ÿ`qöíï\ÒÚºC?ðÚiò~ÄÿõßžþÛdâ€Nžp8pôyè Ç¿dWEˆëFÔµ:X¬=5“ ´»“Q}*jµ¯Ág]±øUuôÄ]ÖX  ¬5´q'«^wçÔm‡ŒÓ|i¼ƒª'J•†•¨ âÐ5Q ÷ zéò9è”55:EQ8U¦ãþúv¿(•‚°4¥‡™ž™šž¦øØïËó2ìÌ¿ù4´ÅÚÖÕ‡2a3:­(&Ðmmnñ¸Ã©\¥"”ù‘O=Ë<(•c‰>„Aµ³sÝ#B9„8XBÈ(MÁˆL$Œ`KõüD‡yœ„UJuZíñp {e)•V»1÷ççf·GÃþ »gnÆYíû¾ÖZ;çp\¸tifjRUU„ªª0Æa畈ãØó¼sçÎ=|‚1¢…¶ÖrÊV——ŸùÜo~ðã÷ïÿõ{“¿ø+¿'-:{ùlÆÎ9 J­SLIÓÔ9 €çDQZJ…VãØ ˆ LµLóxù!±½É©9léÁ#=FݵЧŒcŒ"c%C뀼zãb§Ó±N:x2ƒ•ÕÃîÆÎê*âs‹Î8ºxd}åJóå—Z­ÖB«‰PëÀ}KËW²"íj?òÈýZÛ8ŒŸö´§¯¬^¯ª"7ùêÎÎD«Ch è÷·ÆIZkÃ0 ÄeÖŒ›Œ1­`À½SÇOKUi ÜíŒbŒÑÚŒ¡!´ÓÝÔZQﱄ1¿RYYæëî»7iNœ8};#ôâ™ÇãåÌŠ°Ý"èmöKÿÖY®TÈtXe£Dˆ\öq<ÿøÙUÿÖ;¦& ) ž+cî…“þù³ëãS™~ok½»e5˜Ÿ_ô©?;9SIÕh5”Ң̷ò”`–SmÍ8YÉ õ|61ÑI¢x1\@)¥Šª´ÖŽÇc†0 £Ô(ÏÖÆkÒ²,…Öš1ÖîL„QD,ª¢Ê«E3§‚ÁRh¨A•æ"+ZSIllmj­Çã!4Bc G„2Ó4õúJeM»ÝÆ”²2J¥e*¤$[© „a£ƒ€Kü&´ÔÚó|Æý:W¬Õjµ¯›UutËëÞùöswþó·¯kFh}á[ôsàºÒ'Ó¡øG½”·ï9wD¿³2nëü–Æ' †ÈËoù?øàËþì¿k‘Ö“O­kOÁä¢> µÚ×& ¬?¡_Mºª´Ö„”Ò ËN'€P¥P¢kU–f™’±ÈjÌ®òýD±«JDpÏX\)ˆ(5RqÎ7V׆£‘³ìsf›˜ìtf¦¦æg!´«×¯r†VÞõôgOOL_>ûЙ³gÇe /äX›tZƒ•îþÉ9Œ\:è/Î,¤Y%„ ÃPT Îü i5­ÖÚí cGB#ÌÖÆŒÓ!¥Ô÷|ÆBŽgÊ’1”1ÀQJ}ß/Æã(ÝP8gœs”Ò²,BH,ÆÈ­BPJw·­“B+£€ÂÝH‘Rª¥Zí^<‹‚¥iÚhÄBBHQVûöÍž{ìá©©™h8õŸßóþcG>ðÀã¡ùÙùKW.qεÖ!k´³ˆ`† À[m,tÎXè`wƒ?ç󸳺”"˜ó}ûöû¾×jMt‡ˆQ–KŠÂî“÷}´Ã …1fÌK !…Ø­®m”zéî;ïØmMhûÀ“yVœ¿øàÊòåþhëàÑc“ɃGn¾vî\à…Z‰Íµ¹é+Ìþ=û¯\¿"+Ùnµ†ã4Å™3O=zdéÆuˆ°*ËÒV§RZCŒ%„ LÑp¼e G?¡”eyᬑ²²Öj­³„­VÖ㉵–Rf( †¼ÛÛÆ”4J£ÆZãáÖê ã^pËé;ã-ÊáÄB3I¢<|u˜ÓÃññ&/«1ä¦Ê³ƒ<ØéB:yôÄiŸy«WïýøÇ `Í (â~âGaÔhÞrêtwõõhU¦JB`#´™$¾Ì­5W¯ß¸~ãÚÑ›Ÿ†B¦Ô;{éÉþ`kvfOÆžçI«¼08t`*Lʈ0ô uq§ã~Àiì{"Œ£2Ve+™ÈÊ\9ë1†´•ØÝ.ƒâ g…©r2Âq–EAàûáÎÎV5–––„¡q––¢ˆ‚FY–q¥é(¯Æ[«Ë.]½ýiw¿ûÎ}‹3{ð!¡‹EUÇ™ƒ€b⌠<\*aø½A¿Ì‹0 ± cLž=ÏG“““RªÃG¤ãBH½¾¾uÇÝÏŠ¹?Ñl=ã9ÏúÐûÿªÅ±‘¥†<#ìqˆÑθËK&:{ÛâÂFè¿t¶(ªöôü±c'ßò¼ƒ•°z¸µ¶tþ‰Ç§ÛSsö åøì¥Ç¹GÖz[SíVÀÂÃŽA°¹³µu„ÝÙ³ço>~r»Û-D6ÊKåÊFsbjjvœæY>Ìó*Ý>AÚÒTe‘n’$ežZm¢€[€ D8«žqä çyÜÊBYk@qÏãkë×´Ñ“v;f”æ£õaOo®]Ÿž›Ýgm~ÃÝáö0—-9xY(®"××–¢°}àÀL¿;Ž'’‰VðÁûÏ÷ý“Ç÷Ÿ<1qèÈì“7®9€|!Òtd•e4hµÚ(VJµM­u«Ñ¬¤@"c\Yæ+K˃"…ÎLMµ›BÈhœåEJ‰¢ˆ"”âÜë4Û»õ­UU óÔ9爂†>&^ès« –qîDˆ¨JH#KQ‚4í4[Ê?¦Úk­…€0Æìl®WUœõƒ@ˆª¬ÒÁ züÜÀ˜ J,paøF˜QX¥‚ÆYe4£T‹ A—„á0WÎ9ÒÚZ ¢„PF!„QVEÉ"/MG“ ûz£®R cìû>pfœ8õvg‚0cLÊj÷ÚØ ò×V7¨v´“ÄIð´ç?óÞ¿ùàÂâZTzªÝ¥tms“1jÅ”*£Ã0´F#„¸ï€0¦RJçÆØE)Áy”@c­1û÷ìm6›­Òá¨züñ€“JXÆ0‚€Pl´XíÝnwsgËÌÜô¨·%ñÄçô±‡ÿÏõºÎlGd­f2ÝœZ*ól˜V{÷_Yºd¬¦ã0`y:®Êq§=±¸°·Ùè0ln.qÎ._»´wï>×5TJÛííí`âû|0P£áˆ1l”®ti•¦AÒaÚˆBˆ¨Æ8ÂEÈi „nD¾’š0Ɖ(œR%&åÆÖF··ÓnucSç µÃ)´•´Z"âB­Š¸gU*ûªÔ¾ïó9¬û¬R ‹æ,²’”•ažßhjÌðÙ‹—n=uˆbpÓá½ÃQÿ’ÊJ-&¼ç\]y–Œ1ì!!ƘY tÆXëÃÌqˆ±:ð¼2¯LlœsJ©4ÍŒÑ3ŒM–eJ‹©‰IŒ±Ï8ü™0R !¬”RÏóêŠ BRVÆê€yVkŒ¶Ú751)¥äœc!„Á4K¥”EQH­Š²0Æ£ŒQ@ŸSèTèÎ9£”¨,°"F Aú~ˆSJikµÖuë–Z­V{JJ^ð—½ì c¡µ¯°²¼vùbgrjïé[*%üìÙS§·föýÕ{>±Ó6ð“8iwâ½Ós8=£«òHZÜ™žÓŨÈ3ä¡çÉ<zYKVy>άRæÓq˜ Ÿ¼}rº1êõ¶×V•¢J˜{¾áé[7οï=÷ )¥!‘Û£üèÁ‰Asaáˆ×ô%@¼ÙD n‚ ­/o¯¯ÊÚsxéú…„L¸€zÉB„-¯\µJwZ8jz~P Åa Ì( gLÚß¡a(5 ™ÄDk]%Œ¹ÀH—xž_)éTQ–éÒj~pßÞˆš0 ã4·ÖFtUùœ‹q²•µµ…Ù­”ÖÚ÷ýRÚš ˆ”R„©°Ô½¥+Œ1EµŽ9 ¿ñ?1=?»¶z±•Lkß´'§zè¡„#2Ýñ<”§ÚšBdùx@æ Q„ÔQäß«A" IDATmì DÎHF¼v§PH>nuöcTù!À«ÑzY¹ž6°0Œˆ§Œ–eÅ|;:F0Ž@Â’íÑFq.KÕ=÷|c¥uY¥+ç?÷ÀVÿ–gÈ‹²,W·Öw£j1…Èa„…@(«¡uFim FÄ1Eh£ g~,„mk-CÄY»Û¡NcœVž_T"B¥uÝH­V«=UИÿÇ D˜|Iµ ù•7ÿ]Aÿï÷¿hÖïD­ÿ'Œ1_Á—ækÞ¸jä¿þ·\¸ù‡üÅ‹BHêvIÿD¾¬bÑ;øÝ¿ö[ß$?ï™þƒð ï¸qóóŽ%ߺðÒŸû—@ˆê÷¸VûÿJë`ñ«ªÝ™i@d!¸pîÌL§ó Ï»‹3~ï‡î+-$ 0ÒiuNÅz9”…ˆúk­ÐÊGQ²,2YeRVBL²>ð™Å&q¸6(fçf•J»kKY:ÌÊêäÍwì¬/ú¡‡ÂÈc3¶=Ýt6…„„‘u‰6‡Aä‡ešZgŒ½~_YÓn´â¨Y”Õ•%=Œ%!@Ã9!on®7›MGÜ !i·Ÿ$‰¥\ 2Æ!xè!bª¼À ¥”Œa‚¶ÀgR„0Ê ±ÛR„sn†¥‘R€b­ëv»I#HÂÖ¸À 1Bð_Ù»ó0K¯º^ôk^ï¼ç𫫇t§;Ý™'HˆdŠ÷0ˆ€¨Œ‚ *zåè¹¢'”s ráˆAÀ@P"3IHH‡ŒÝé¤ÓcU×´kÏï´æûGO‚ÞG8Þ‡¼ŸúݵvíÚÏ^{x÷·×úýPQœûÆ8J©"IcL)A§µ^\\|øä#ÓÓÓÎö7·¶.¸à‚………,Ëôzw2xÊ&Q(„´Úh)­µB¥TÀ©,U§Õ†Œƒ¡Æ“Þ%»ö§Y¯Óhmn¬[#ÃÃá`zv§±ZkEo—ÑÜþ¼£œCŒFE‘û5ò¹[>yà ?ÚívOÿj£î7ã6Ú!¿xË_޶®?ÿü½˜a?ÀQ k=ë –2¼]’røðá}û.h5§Ož>ÑhvÆœÅY6©7 BP~Á8%J ÀcÐ œÇˆÈ8c¥õ"^”¹²”RFXÇ5®=mJ¤¤PkeYàóÀ ÇÆ(ë A쬅(¥am¯1 Bþ=×_­(¥ÌòL(0âA$@c (K“Ôš“Ò%µZ:ÉÏ;›ŽGœó¿ýû¼øÂCµ$I’¦çyŒ1˜1fŽ)¥œsk­µ6+rcÌÖæ&c Æ!D0f¾g!J9ç „BŒ0Æ8Žã²Y–MÆ)ÀZ›Ä!cÌX«µr`;4„œp\žeEQ4µf­Þíö¬µ>óÁcŒÕ&ͲÉf†ð÷<ŽnMµ!cèœVÚ«µ–Z[à´ÖÎXY–BN(Á$ÃíÓ-…çÁ<;碤^½V*•J¥R©ü'‹ßÞo¹S{/ê@鉃Ó3.½ì€ÐïÿÛwÿÉßå¡M×Ù{Õó^ñªç¬aXÜó¶Ÿ|Óß㟼|G0¿÷·~â×V~ìOn¼a–BÛÿ̯¼ôì—ßózðá·ßtÇ©~&a8µïª¿öÕÏ9/D“»þðßvìò7¿ý£*Ðzü EÑŽ /YÜ>g>úów|ê¿üî[Ÿ¿ÓƒØÑ½yǹí膛ÚÿäýÌëøÂú£yã7J¿ò–—¾áèsß÷þŸ>ßCØýÌ þGó­7½ìÁŸ{õ'®þ£¿xýÁ·¸gªø/o¼ñ£_>>ÀS®Ù^{Ãިʛ+OðWhåÛk~vO©„vמãO~âŒ7Ø·§h9¸ËÈK$r@*¥Šb‚ŒXØ]?–“ž* ´sÐã>çaáÀôÌ\YÊÍ­Õ'_ÿŒÑd½nm®¾ïÁG^úòŸ }úöÿûF¿Ö4Æiœ±ÎÛEw‡Q\£Øc„ !;vïe^”N†ÙBæûÓ­©V«A¼çî/hkò¨ïY1&ÍV͸"Œ£$nb̹1Æãzî­7:Jc,ñüSËgEÃÔ–¦•奠Ä'y,V2ÄS Εe¹¾¹qþŽ™ˆŒ§&ÌZWJÝN:ŽV6ŠDÐúÙ^Qíf‹1f´u`dÒ¬BX¡qJÈz½Ž0ô|>ÓéÔ“`x`ï.UNœÎâ×öî@­-Ÿ*¤®×y!'ã@€// p¥ C!e8Žjcg¤VE¶ù 1åÉ#§ZIrRBˆcŒ KÆ£QE‰ç§iZóý …ÐÊá4KBEžv‡CíÜ;ÞóÛ­dêYÏyÑBgö‡ov{W^ú««'{£a£1ÿª×üR™N>ÿ…›…ɲ0Ð Çi–Ÿó¼pi×î¼Ìƒ^»=•¦…T¹Òy=©YÍ0AÝn×£lÏ®óÖVN!«Êb µN2b1'¡B vÊÊ@Ï©,Ë’¸QOZeY–enô(AÀRJ±Æ@Æ}­„”ZQˆ0ã! }BñÌ\[)=Ì”–:M3¥ÁAoxf㡼œL'üé—Ÿo‘Nz=}ÏÃËéX YLFñ4+Ï,÷í=Oª’òÀ9§´&-ÍÌAJ´Öe)€>÷´Ö“Ñh´¾¹ésÞiµíxä JaL1%ÀºzB#$ÄaൌBX« !Êš~¿¯”ç#6=Ÿ×ëIÇ€´(c„ÏóʲLÓÔhíœkDI3©cŒ¥Û+M FBb1BXRk½]~‘!ŒmÖëc!„°È2g]^–‚Ñx¨Ë±rck­Ú%Q©T*•J¥òŸ,~›÷ª>ú¥ùkÿò™ûÙ}SH®Ýý`ª{‡OgÏ©ÃòÔ§ÌÒË„ù'ï~`sî%o|ý^röK}Óý:Yxïë/NI)•­¦üë|cÅíÉpéïùµwÝýª÷¾æÊ&…ˆã7½áµ:¾æÇ_÷Û{áñzï¯cñÞw¾ü<ÁÇ ÷ß…ì3wÜÓ{ùùó¸ñ‘ÏŸÀ~è`ŒŽZcþ©(ýÙî#þ ~æ×n:½ý¦ÿþ»oB 7½áòj)kå –*VÁâwö#+ ˆÀÊú†s DÆ)iÔÜôtÈqN¬æ™².ŠS;[(çF@0™Œ 5E6¶Ng „”3hŒ¦Ñ˜i6›œ<~á%OÚ½wÏ™#÷™´¸íˇS[Íæ_üXÕ¹µ0¡Ð#i>6@ûœCë¸ç…̃ ƒ±Ð\aL¡…i:D„†A<;;ÿÈñ»-@Ì )ó¤ÔŒÐ¼Lg¦æ9q:ˆ˜È÷ÃÉdܨÕ3”q„DØBESj-B0„œó4Ë ¢h !cbÔíõö-N!„œ³Œ!§l4™Áiš&Q téó`8ž0ÆŒs¥”Ah­0B”Ò,ÏóœsZkÆX’$ëëëA”e¹¾¹vÞž}Ÿÿü§=ß ‚k­¥*í´SÐÉÈÇÐÏC÷9DÈ™ÀãÎ tÀ½^·Ç(„:'@3ÆŒRÍZ--°ÖX ššêôz}m\½Ñ*ò4ˆãrgáÊê¹F½I†BÂŒóÍ›>ôžéæôSŸú};B*t6Õ™Wg;SZ©SgO0$a{KL0eZŒ±RR)e´[ZÚ•ç9÷")Ü$Ý¥jÍÆÆJc\.$ó?ˆE™…qbµÑJa 3béÜöG0„HkI(™¤ãíµ /dÆ*Œ±ç1(¥Ä­¾19 ý J £µÑš:=]„MòâØC'V7W»ƒ¾G=ÈÀ©õ5@ëÌŽ…3¡N­6´ÆùÁ–*¥4:¢µîFŃñ¦s¶^¯;·¶¶ceYJ)¥”Ƙí-ÅõzKB„aˆ1–RN†#ÆX£Ñؾ¦s!ÀÃHYú¾Ïƒú¾¯”ÒZ;çœsœs¡´Ji½½æ‘{”1° Žã8Ž·«y"¬yžŽ³T[-„È•0Ö©±£A2æÕãÄYç€Ý>_B BŠ¢˜L&JiŒñp<¤e"U±b¥R©T*•ÊF°ø¿›Üóþ¿>3õü·ÿêKÏó¼öòâÕ?ÿáÜýƒ¿~u|þu{ñ;¾üHöìNÔ?rw"õðgÅÕ5|îŽ#åâ 5rÎK—]{å~^yÙÜæ]¿pËçO¿ò’ .Óÿü+®–+~}rñÍjBØÑï|ˇ{OúÕß}Áy‚¸É]ïþЩé¿ó¿½ìüÁë®Ü)~â5xß]Ïë5õôñ‡=ãö–Oß=xáÜž<ø©£à‚Ÿ¿(#øo?îz÷_-xÝŸ¿î93‚C³½[~ôƒ?þêË.‹ª˜¥òÄz…"T=ß9“ÉÈBg÷RÆ@e(¢@…1&>iß(xþxk“1f•@@D¸G³ÉÐ:xÑî}[ÃUú{÷_šnuµë½Í3ëÃçýÐKßú¹ÞW*zŒC[ ó;-•*!"˜1g4$˜ HqV£&“ç\”am®-ø˜ŠPO©„&yÀ+ËÜXMIà0b,ð}0è7šõÉd À”8‹¬qQ”øÌr/@ˆ@ˆ!ˆÜ(Ë9„ÀGw¿J !ð<ßã„B µ–¸t0¦¸zÌ9)Jkk!Î9cLYžA`­yQ”çùv5Æíš}I’lv×…ÈßË&“Zƒ8g¤”XQfœRalìS­çTçÈ9ƒÀa€°ÓXK)˰9_…³djf†…²Ð"ä€ë«©ÙRÙv;É‹Të‡A³9ÕldE šÔ´ȶµZVÈîßþýŸ~"ú´§>S©Â•rÇÂâ P¥JgfÛãtÓcë0HjÃFÈ:h‡}Ñh6Ž»«^ŸZXXêu·Œ•Œyc‚±’zfnçúÆY¤±%Ò€1F"„¬²F[BH)!Aƒ1ƒR„‹"Ã`!DÆhŒqBΘ¶Êa¬•_ ‹Ö²(Ç£ t´>çE^Šáh,” ½Ð åšž]ÛJwL'¥è£ºëçNœYÁ‡qÇq= €UƒÑ¨7wšÍÐ 1Æ¡Z£àœBŒ1)åf·§”Т„3Æ9¡¸8Œ £u½ÕÚþucÔvÈèûþöƒÂÛ~b8笵BñVo½(²IžYk§g¦êqâûˆ1/"hMšæÎYæ!pgV—•R¥Zk™eFkduRkú~è,€B‚”œs)¥Ô€1.K!”@i­C?ÀK¥ª÷ÀJ¥R©T*•ïÎ`Qu<%âCWÎ{Û“¼…«…q䨦¼:©_pÝ’þà­§Ê«–ŽÜ¶±ëE/¡÷ù;Wå~vÏáÁÔ“.mQ¸þص|zO~jc¬€UÕS¿ „Ð7¬Š²ƒÛn|Ë'ä3~ëÏœãÛKåæ‘"¾øI;ÂíöYÁÎk.‰>pïÑ®º&|ü¡FrÉsáßøÔ݃gý@ðÐ?ß-÷½î²:EãG#Íÿõw¿þXu<-ô¹·½ôú?x4i´Æú¥ƒq,Vž@/OˆP,~' óþh<¢õº¢L뵺†Ø"ò¢xÊõWò™é'õ²cµ&ޏÀô'%G®˜ ±€sßãB©ç×Ò^?Ù¥W>Ûøƒ.2ùœç¿èÜðÕ~îæ›¿òÀ½oûã›Ä°ÿŽk³—bŽ:7YÊë.Ÿ ­³“BLÇMleÞ±8TYÖÏzS>5J8ˆ9FI\£ÔÜ}Ç?{8BAè0Òp¢œ±š^oCàñP@0Ͳ,Žc-K ]–§œS)E$€h<êV´ººÊƒÐ`!ä,0ê1g{BàΕ×̽ë·žì‹Ïª_ûŠïIîúè?ܽñtzËJíò§,pø¯O!æUÑù–Áâ×ýÄö¿ôû¿óð¬ßùÙ'·écNà7LŠsÎÌ7BÉeϽ½õwô¯nòÎâ‚W]Õ$Ðý;Nä¶Îò/½íuƒ¯]SªSxå‰¦Ú ýeDŽ‘+Eך¡C¢ˆt£O}êÕ:d2¼íî;'kk×}ïµZuEY&o­/û+mŒÑÐHCq‘æˆxçï¾Å`4ù n/¦yªÆš¸ø«ÇîÛ¿ïbU½³WHe¡­0Ø9·Ï‚-­“Èå9$*ÊùÍrpR +u'ÞÚÚ¹z}±Ô:ŸŒÀÖ³#Š"PaèE\+]¹4×"¦`ÜY¯Ein!2ÆB`a^ ¿&²ñæÆÚôl"‡”2”-sÔoˆrMXé FÐ0J5 RÛaö(Bˆ"µ’F5iâ€ÕÎ)¥…±@+£5ÃX) ¬Ken¬•Æ"•4! ñ$ͧ€scœ³îk€u²,MR¯B²I×"%´Öà¬)F# 9! !€!‘ÖLOO3ÆÖ6·ZÍÎ%—^µrv™:˜Ž»RʼP0dE> ¸rú‘Ù…ÝAÔ6²ä>›šY¨‡µ=ópµ»:g‹s pÏ'!À®ÔCG΃17[õƧ?ûO×_öžwÐ(ÛÝZõx<•P,t~D‡éF\4ÌËp¬QoeFpØj‚Ó§ïE2ÍÖ áli×Á§ïE˜Bè €Üó(ñdE!ƒ[Ïó”U0%ç!¾]=Pd-0Æ „Œ0­±±Ö9È0G˜i„œ´¢vV*$U:îŸÜZ)Ó,À^èPA åXŒþéõ¬ïå¶ô8WÇc` Fp}Ð%ŒGa=âa„” s›g×¶67ºë (Y”Îh(53Eókm’Ô£Öšl’æ…è‘Q«ÙŠ}j(ÕÎZc7V×V‡ÝRHNÙ|³†a–eJ©^¯—9cL팑ZY` uЭÅzw…`¯ÙlA@11Òë¤3ÜóŒ•ЧmQ¥‘8 p>%0Æ \Q¢ÂY©d!ËÕ­³Ö¨ Z9Š #ØZëxX½½V*•J¥R©|w‹´³oû«#w­ÉC{<:wç‘ ]Ø×a:ýÓ—>ü±øÔæÑàÊŸ¯›y÷goþ8ÓþÞŸÙÅ!ÔÕœþÇb ;¼õÿð³èðªË›‰ÙÔüƒ÷Þ±Z^¼7€È•Ûï°¦9dÓ;l^ù¢§øoþ›O~º~»½ê—ŸÜ!¨¯»À}­àâ¿ÓξEZž< gŸ»ûk'þUÀRy¾>‚ÕŠÅï ™…%ƒ%§Ç£ 9E€ºäâ‹çg¦ßñ®µk-?ˆöîl_õ¬yTö U]¬ÇI«“F2Ù¤4ûµ„³‹MÄ}©ÄàìÚÙ•#çí½â²kžrôþÃY/{äì©7ÿêÿÀÔ9z§I‡¹q-€«Éð{®}–ƒÁ#,ìÖ––.¬7³ÑúÜ¢‡l u^¯E¡W?vò^%€—¥øÖ‚ȯ!€­§Ó2åÜ'B4ŠâÈЍO F•ªœ ºËk§ö쾑ruu5Hrˆ}DðÉ3§LV6›ÍRiÁfokckkRö·úÃé$dÈyú>¥ò½Ë!’ÚŒÇCˆA40Êb„0†…,íØz %´R¡¢((gýÉPHe´Êt¦§Š"{´/3$½­®ïûµ8ñÃH)‘ç©çÊ!ÜæÖÆx~a¾»¹ÙnMI•‡¡O áÌJieËRj­jõØ÷}@(Dh~Çb³=Õ „Ôä1Ì,ÂÒº}{G“‡>ü÷ûÈ+_ý‹õ©†¡Ä©&Ü:¹giç©åå3+Ë{vt{CÆ‘Q:¤Xg´nÆuaµB+Uo…GÝÒiwæ\ΗWNc5ýÔÔ¼vsñä©#“=»å"õeèùƒ••{f¦w´QäZŒÇcçùõ8ê\qÉ3,(²l<­M¶¶êµ¶”BÒÐlÌb@ÕC‚‰µÖ9 !4Ú‚ZkL(B„û¾²!Äc/¨AÀ”vˆ˜8!ÝÞêéå³eÚ+ŠÁØhagþt{Gä%÷Ì¥øÇOöò‹ŵ8fh „…Œ±™¨a,hÄ‰ÇøÂŽ%!Š‘È)åSr¶ „RŠ‚)õƒ¨u¤ÕËy:jMµ§: BÄDY:AFÆX«5tW¦y®ÇP™(‰µ:ç|vv6MÓÉd’¦)@Ì8$5°²tF)cóòñXˆ­Óg©%µ™©ù©™„0”FÈCÂ=¯´e˜ÔbBYÆ“É$Ÿd˜²ˆñV­)ŒRJyAh­ #ß©ÒZà4Îåeᜠøz¬T*•J¥Rùî a|ÙËŸ¿øš¿ü­ßö~ü™»ÀÉOßôáÕ…—þÊå „2û”çîú³?þÐüÈ£ôڧͽÿý±Ó?ò‹;øã'Onrø~ñª®Ðßè_¯XtÙý7½íŸ‡;^p9:yïáS>PțٿÿÊWÿðÒO|àÍ¿áÿô çÁãÿøÞ?;·ø²ß¸²!Lwk¿øûj¯üŸï°ÉÜxEóë{¯d.Ýß¹ýôâõ;s¼ëɯ|Þì+ÿúÍoB/{Þs~Ù]ï|ö kUï–Ê-Z¬õï¤Íîzà7¨G¹G°Ãî¿8ûÉOÝL½ ´æ¼Ýíƒ/Áb’h4è !ê3m¤¬œŒó²4rß³ˆµÚ ãTåÐè•Gׇçžû‚WçÙäøC'U*!p“ñ扳'k@ «^b ­Ñ`?$½AÉ9ßê Æa”‚ÛÎÑ£‡/¡d"a¼, g¬ç¢È “aß@„£ÔÃk+!b¢”ˆPB@Ì"B e&œt…Î"cs mÔ[¥¥eš€m"0rÎDQ d¡-£ )&ZkD1ažr%2À!ëp@ˆι²,8c¶×aâ²”ΙTÚh ÛÚÚŠÃÈY£­ò=^–¹1Ê[«Ç4M'“QR¯a“$Š“dss!!Ün†!€N(â^$UÉ=æ ¥”ú~ Ä‡±—åÊ¥µ3Æqέµg—OvÚ³õhjçNñÈÃÇÅGq257;5·¸¶rÄDao4F”Ö£Ø9Ç<ž§™ïûœz„Q¬õ¤ÔA€µ,c_þòÍW]÷ƒ;÷LGãt1¯ABaðv €uÅqœ•tVWNõIofªQ’çc€(S-€$Jc•ïûQÊR‚¶RJF` !ÔakŒÂøÑ*%”Rk­”Rk­SÒQNÄI’8'ÙÄ/@ØY£”4µF£1v!0NKŽv6Ë2),Ì©2Z”niÏy M¿3=½6ú˜zÄ÷¨§(ÑF>ôÈCÖÚÞ¸Ï9M’*‡Bh ™” IDAT­õ£˜P:Ýl@DÚÍ$K³\ªÑh”…4Ú÷C1rH+A1ÎBB§ÚmÎy-NaJ)k°V«ÅqL)Ž&Økql”²N „e™KUæy®¥èv»B)ÂØÜÌ ¥Ôj!Œâx<Bí¢(‚•yN™ž›E©¢,˲¥ƒSÊ) °ïŒʤ–R &C  sÕ~–J¥R©T*•ïÒ`~Þ¾õmÁ»ÿäcïüµ-×ÞsÅOýÎ+_¸×{4ÄÓ×<{ÿ;ÿ¨ÿ´ë9„húšØõ§ïÒÏø¾yþ­C¬6ÆTçß:¶P+·Ýºa­ýë·þüGóãöóß÷Á×|ùÛßÞøŽþ÷_Üt}W½öÿùÙ—œï#ðöýäã üýÿå†Å¿{¿|Öó. ¿!#ÁÓOí‹?ûÖ¿»ño¿÷ê7\ð˜ãC¾ú76o|×Çÿô7>2Ò^ã¼ë^sýsÖª:™•'ØË³ ¿£:S;ÊäÀQŒð½GŽy> ¢ºV…ë®ÜGÆÃÓgO›ÜFjd´ÚG&­ËðÚÆúâÞ˯1ŸŽ&̰þÊ ¥†—]õ´²ÌnÿÂ?ž¿ï’•••»nÿBg¦±0µxç­/©%u!Óq™_qåµ"ßôqpv|ÚÖnOC “Ø?úÀ}íŹ<Y‡¬*Ç£|c£»´g¿ÈÆ“~ß:´¦âÎ¥…´hª½˜—¢ Ó3¦•!{;öàƒ”¢I!¤‚^¦£IkªsúÜÚÖpbJyhÿR†ª, ãt˜°8<×™¦À"ã‘` ÆZ[£‘³Ä9Ç5!5¦GXçyÁh<ÑÚvZSÖ‚ÓË«»wìÀnôzE‘wÚm)e˜$Rª$Izƒ-ˆà`0h·§¡Ãáû¥8 C­e>sÎûÝõñ` A§µžšžõ3V3Æ!¢JÊH–e~Œ tB/ aÆYŠq\o)!ØsÉRc¼°1œlYƒ¯¸ø)»#÷=¸°´#Jü˯ºöá#w‰"]˜‹ÃäÔéÓ»v*#!¾Bˆ…RaÒ`ÆzSBe @®…¾ïðöÜ{é¥å—S]L&‰£×jáæf¿Ó™Ûì®B€æçD®¾âéy1ò8VÒµ[¡ƒˆp¶ºº<Ζ}ßãÜ‚0ÏJ?äZ9 X½Ñ†‹¡µÜcÚXˆ41¦µÅ˜zœYk-A)m†~\SÊ8êÔ8DÙ¸?N¢ààÎ¥ÍõÓXø<’Ôˆƒ0¢˜7âã‘è¡c'5Žy°o÷Rkça [‹(òb’MJY¥TNšÍv˜$bÏ÷²çR8„@½‘HYzad­jõ<Ý Còpa~W·w–@-TB{^`Œò<“cyQ«5µQ †1¥ˆQ_k]‡‡ÖæYÑh5B "d¬ÑÒ£Ê"íÌ]qp_–¯°èRŠ´‰O)ñ(æ–’Zô&C1)¢J”yYÔâÈ#´'Zk€!@8ŽƒÀ ÍŽÏ=PJiEÃñ$ô|ŒiR«;«•žïÏùawØ·ÊFž†!!ClŒ”9¥1ac”bèÆanÿ‰·16ÀA„Æ£¤Ð !„1¦”&I-ŽY”“•8Z;-JMܵgißyæã•SÇgw,DŸMEá.ºè¢Í­3¥*Ö6ú3SK”¥]˜x°³s;ÅdEKeùùûP-!˜Ö´`Hˆ5côð#Ç®ÛyìáGvïÞçur–&¿ëöûöî>xüôq/ªõû™´éæp¹;Ü" [«‚Q™Òàøéscc“šæ>Óv‚15ÊrÊ ¥!pãIÚi·zýu?Š:­)À8q‚œvÌã£ÉØC:IG§àI‘›-Ég¡…Õü`‡N._rp‰"¸¼1ðü Èrî{ŒânwC)Õjµõ(Í$Ú)ŽR"¤ÀqÎp„{YYpŸeý-ì”PÒó|)rˆ°Œ&µE8·Lu¶zëˆãlØiÏ´­îúr§íÒm­?vïS¯¾öû¯yÊÓî»ëö³§OŒû)¥á¨ÌçgvN&i¥ï…íz¬t~òìC3ÓK\ˆKû¤È³t@£EYô7Ï‚îÁ /ï÷Fœ¼²¸ØÂ„<2ž]]^P‡Q’4[I0-„oŒà #¢$Äø¼q^‚=†¢ˆ5¤qBäiA)UNŽ&[¥(€•œ3Œ±”Šy1¥ (€1ö¯?cjQÊ5‚œÖê8®e£¼·µùàÂ}K.øáüÍgÖ†2Õ…1vº9%L; €³ÚDaÀ‹¢ˆSÊÑZû#ŸFõÆ~ø"dŒq”fE.µvÎeeÑh$Ö˜IšÆ£I.=Fša‚!D„æeY–#ÌÀmµ ¢0ð|5è ! !¶½V³Á9GÜ#¤i¡¡ó)’RB¶ú]çœ(ÙÞ"RÚª7:ÎAˆpÖ"Oó¥(œ´çwµ¤¿qn³?hÖÛ²ó¸VFéµÕM Äh’fãñœ§™çyV+%¤5JÈBè²^¯K¡bJ9p8H!9hÛSíF£ ¢”:g,pwÞ~tx³»:ÎFÃQZ*µ¹¾¶µµ ¡3FóÀG0æYkB£(Ž…"€sŽ‚B(¥!Ö9)%ÆØ§µÞn$‚1qÎI)·×!B}Æ=sJ)C£‘VÎ9&0ÏecL!t@a ƒÐ;s攵B„uPÊ!AJ©sÎ40LœsZ[1c°@k«JáŒÖ!”pÆó¸Ö:ô„H)RçŒ`0G‘Ox<5³›{ó'þÆóüÝçš]Ø•eÙüÔœÈÕjoµV#Îjßcû컸Û[Ýmž^9ç°&»…Å…=ŒøÒ8jXÀˆO-2ɲv×Où ‚ Õœ±À1Nq”¡1Ö ~ÂX­ÙZˆ¢&Bh2Fcß’¤áû1„Ø÷#0!äœ+KA±äY&„0Æ T)ò¢ð}? “<}¥ÄE‡Õâ ð©öT»=†!çœ"Ì)åœ×jõééé™éià$Ëή¬ž;·6šŒ Q:i@¡ø^873¿sÇR§ÓYXXعcÇÜôÌüÜ<ÂDjE ‚ ‰‚0 ƒ ¢Bˆ1‚€sN)…%I²]E!´])’P2ÆÃÑd8JÇYæN›,ËŠ¢Çyš•e œ‘¢P²,òTÊ:;É3„ Æ8¢Z’4’Úììl§Õ®' N=JyשçA4Ý™iÕ›€³gÏž=»ÜïŒq¾†¡ïûÜ÷ý8‰(¥i)FY ©Þ+•J¥òŸÑÝûOžoE”RJ/û½£…ý†êmùWå|Sê×;¿á¶‰uÿnêßâ]ø«Ÿ?öÙ_Úå¬}œ’Åã[ÞxÉâSïH¾ýGäé¿ýý·üѧ×dUœî»RuRU©T*•'¨‡ÞÖ“ ˆ|æSæùA°²¶ÞëöE¹C_¸í¡€±+.¿¸á“¦ckçö]7'ÍV¬‹AV>;zž8Êœ•Q»•Ìœ¹ÿþõåcÜC‚âë®{n6^ën¬ô‡½Wm¤[˜ß î÷†œ{ReQÄ&ŽS8*F0AR¯Ÿ;·1jI[åA` ¿pëç•R?ôü ÇÇ:Fý‹/<þ—¿rxß¾›[ŸyH()2ø=×\{Ï=·bæ´ŒzFÊ8zƒœ²@CdµX¥ÜN×7×´¶Û!¡d<×›õî&h¦1UEÀƒ²Ì1Æá©N{}}£Ñ¨õz£„0G²"¶Ñí-,ÍY{nu} ÂHIW–‚! Ì³ù¹™ áÜì"BP !dÄ£”bm,p€3+çöí|ê[)R¡8çžçÅaØ—c`µÑ‚0ª” ,lµã­­-Ƙ³6ÀÞéîBha~Oàû·~ùSõúü¾½ûÃ(:úÀ=Ÿú§¿¹îûoصïP%çNÛµcïÑ“÷llt¯¼ìêsgÎŒcÄ2Î'ê2ô!0Ò<=½Ôé,ž:õ`Pãy>:zlcff&©RäÒóƒ¨I˜ºϯ¥(Ã'? ”Š¢Tˆ¬V«1ß«Õ;Y¡0aV[íJÏ÷EäUï–)S­! ÏSùSæ#e40ÖAä,`Æ5¥ °Xg¤*a£œSz¾¢œ UÖêá…ûœÝBãZBès®„Ì¥°ÖB¬µÚØ©VpöÜržça#„†½Ï¸ïûõz-Œk-ÀAìœQJ•Ò”ó¢(jœ*%777­µÐ0Ž´µÊhP˜8Œ«2Æ9—¦©çyVk«MéJç'ZkM­ÅŒÆqˆ1,ŠÂH••…ïû„„ b’eiš"´p¯ž4¸ï`µÖF[€ÂØg!$ŒŒV‚"ÌÈÎ/Î/..¦Æ˜B*¡ çÜóX­Æ¬µÎ¹$©WkÂ+•Jå;!ýÒOž÷ô?ï=¶½ÁEoè¶×îæÿñUMnôÕ÷ýÑGOŽï}ÉâÐ7oË:¾ù‹?øñÜ8¹ò7oûÔ/]?º¢NŸ~Ç“÷ÿ½Æ:þ¾®~â†æòb;ï¢_»åÌÏÞüC‹7ü}vÏÛ~ïK?ý¾§ÿ«»d7>ù–wÒ\ó¡?óÂ)F¿>Ø·ñ¦þMaŒ¿Õ„’¨3·0ÓþÚ¤ËÓýßúòO=ç§ž6êòU°Xù.T5ˆ¨T*OLØ´?llÒÐGˆ~ì{ àI®ŠcSÓÁl;u·ŽŸÉ£F<£á`¼©Õ†éÊùšžn5T„ñµ¡ËÝS‰qAêÓ³€^s¸v®9·ÔlL•Gx7­Rd€,Ë‚°6γØK!¤”Ü÷D^ ‡=­1Æ8 ›šY8ýÈ2ÁTJ ±Y«Gٸ٬w:³Ò•sËyY† ÆaàvìØyäáy6r@€[õ€ßb‚{ŒKmÆŸ{ãñ!D1¦”j­ !`„·? µÖY  Åˆ(©ûÃq+j „€Uœz@J)#$%¤çyÆŠ!n2™tm©…CAÞª7Ö7‡˜”Bd¹fnª£µžLF‹;ö=ztnv‡1Î9G1†QÊ„ZkŒ±ps«Ûl¶µµccí ·•MÆ[§5°ÈRˆ‰”sÄõ>ßLÇ#Být’S† aR™F½=¬ßy׿µOzæCäðW¿èß{a´8»8Üêg8âÒ”i^ì?tÑɇ"ܦƒ>ððúpkcЂÐçìÌrxݵϹà‚+çÖ9ç^Àʲ²”P‹¬cQ`’(@D[Ï£Ú”Íf³Ì3mÐPÊÔ÷g×¶â0 ýX”;I€^»,"¡(&cQJ™ÈÒ¼°F3æ)¥ p g­ƒ€À ÑZÂ0â$ŠˆgÃuûçgt4™‰cŒù>gŒAÀü@!µ´ÖB„“4Ë=Ê(gA0¢¥”r ‘c•R„" p–æÂ2/ó<ãÜã„#„J­ ÄR) |‚¨…sÛM¡¨²ÅJ¥Rùv‹žòž•á}×µû~înc]ý%7?òþ§6(ù¶ì•´“ÃïýÍß;l¬»æÐ«~ìPôMo4yú_õúÇ~÷Ê‹ýASÞþæüÙýw¼ûÿ˜£@–^{{ú#ŸyÉþ×íþ‡;óÒ„ýÿ` /D˜` ãóž½ëÄ'?ø}ø¿^ÿš=ÿ«/­xð=¿ÿ𗆟½ "LÈ·¾¿ßÆ›ú .þåßò˜6Î9k«åŠU°Xù®åœC¨Ú_©Tžp uy61FaŠR›“¡¹Q:ª7Ö×\·rúÄ]÷Þ“åúÐþÝWܳqâD(ï;qr$`' Úó¹>"(d:†{W_óTŠüûîþB>I•-/<ÿ)÷|ù¶ƒOzÊÌܼJ{½îšTpfnþþûï&œ„¼Aï4g…Ì„š,,ì±–CèAÆÛag¸5&„@”t‘å³ËI«µº¹ÒímRê½ï«ƒÞ:„8ŽžçmöÖ?wÛ]­fÍG ²Î^|Ñ¥£tÔZY–ùcœ#­À¼wû=ˆ GŒQ!|äÔÉ©N;‰bŒ¡Ï8G– …Q£( \)rŸûÎ!J†P)Õétέ¯RŒÖΘ³`kØ[Z˜íz«g—›ÍzèSŠqYˆ8ñ­Qe zäÌý;Gƒa–¥ó‹‹acG°½ÁÙó¼¼ßFß÷À‘z£ùÌx¦r³ÛãßHjJ)Ìþ_öÞ;Þ²ª¾û_}ízú¹uî Lgf€¤ˆ(–Ø(6ÁŠè£ÆòL¯wn¿÷ô³ëª¿?.(*byb~òó¼_÷Ÿ³×>ßó=ë̬½ög‹‡Z1V›f§Y!ŒÝzî_] n{Ƕ;‹åÊq'<±½0Çín¼úÔ'¼êðÔ¾jXyÎv(%ßüÓï$Iò¼³_ÓïLJ¦÷™º^AICéµq3‡¥¹K;Ýfm¨.²„P’D}¥°A ­^³isš$­¹ƒJ©„±9ýzùH-³^·i1Æ@ …6aÊ#‚™ÖZ+¥s”+SÇq râ$ñ¡)•˜AN¥„AX:87-­û}Bˆnµ=ÏsSl”fŒSJ­5!N©µ#!DBJ)‰RiŒ‰ãX)%”ìõú¡R¡ µr'˲b±X®GÝ~·Û©Õ;ÎÂÜ4¶˜y®ç{ZÊ8N Åb¥\óÜ ‰cŠ0ÀH*Õh59¥¾ã !¢$ÊeVK åLê$I”RRHr\ ŠUãP†Ê…PZ[c¬µRæý8β,iÔíi­ !„„rc¬‘Rf)¦C† 4Æä"x~Éq\Ïõ·7 ðÇÙ`aBðÏe+„1þïëÂi±ÆcSîC<$dZ3ýÅŸ·é¶¾õ˜A°,©¡üSz¸D&Î}ßiw¿èò⎗~ê´âràm]÷‘¯¾ù=¥÷ü䮇Ÿ¬·|ê­ïú­³9´†Ž>îìW¼é­žZ'ð75“Yè¬x«?ô÷¯|ÂßiôFæ¾ö‚S^óÃÙÌ:Áس¿ò³6^yú›¯Ÿé«>{à¦WÖwüíSŸõw·w´ùøéã_`ˆ„Ãnt`¶gpë§䯫_·jæsgžþŽŸÌ§häùß¹ÿkÏ*j6>ÆÈI¿s÷öemqÀ€¿ð׿ò»cÂ<üÏcŒþ]þ”’{÷ïvoPüÇ£¤ÑJÛîR»ß aetx¢Z¨ °%W_sÝ·Ü|Ç]·lß}Çh‘;î¼÷ÐOîº7ïé0y4Y,q 2•i¨`¿¿°@Ž3ºj“uI+nI+%ÒNXˆÛ=DyxŒb¶oïž,˰°´´„ @«ÊX­Ô*(Ô R[ˆH?‰¥”#Œ1„°Ói—J¥]wíþýüÀ ¯ÝY„ ©Õׯ]g¬Þ¾s÷=c†C‹˜ÌÌOcŽã´5¾ãi­Ó(À(¦¡V«U,W]Ï \1FAPJ!„ý~ !‚cBBÆx¹Ç.BÈ÷}„Ã8ÁX)E)7PAˆ9ç˜Ø,˳8ŽÓ,Â"J×7‹E¡ÖZé8 "kfŒ)eÇÆ,Í/lÚ¸QJ$„aõã~+¥ú½ÄÈ´ÖÂ,—ÃC£‡î÷ûœór¡ˆ‰M³ˆ`Çq«…`Xg­›o¸víšÍ˜ÀÀç‹Æü,E´:2T«¬$Wk…]»·tâãÚ&ãÅn”DRD¹lE¢ÛíM|¯¼wÿ6ê‚Õ«×-6g'ˆ“îâÒŒÕY&{JǦÍÖ!!— Sh0DÖXeƒ!„P†©ÃÊ•Êôô\§Óšƒj±PQÆd¹”F§™@˜QâqÇB´Z­ÅÅE‡»`cŒµÚZkíƒË‚²cLBKkŒ…”ò<ŽÃ8£~ø¾ï;®ëº#Æxày¡ç{¥¥!0\‰¨ßkt;‹ýÞbÜoF¶Ê•&à1®,­Ëø€›$üË›ž{òÚÑj9 Ô«Ml~Ê«>öŸ‡óàòÖùÙçÿÏ™ÇNT\J¹W¨­ÚúÔóßñõýYïú †Ö¾áNe,à¶WL¸Œòg\ÙÒ¿a5‡´²¶ 6½õg_ü½9i_gäÞçpF)¥”®}ûµW_zΉ+FËG½àw÷d÷®O¿êɫܩmxÖ»¯žÎa_Îÿä¯|ê±GT]æ­;éyïúýÉo ׃ÅS/yûñpþ²÷}gêAWå¾/~xÛ³ÞyÖ{xõÛ¹îM'=õƒ ¾zçö;¶ßôßþñ·}ì®èð{›zñ×îÚ¹sçÝ_}áÒ¥O~Â%7µ—çôÑG~æ[_¶uÃ9ŸÛ6»¸ÿkg ­zÙU{¶}æD°œõÀyÏM»¾{^¯zóõ“ó ‹³ûØè'¯µøIŸ¾íû¯]Ã=òµW]÷Þ6½ùÆ®xæ@U| 2ˆXüsgÝšõûì¹áæëS1`ÀŸ•ruÅØÊÁ<ü±¤\”ª^¦D•ÑCæ…2Œ¼°V¨Q`;v“Žóý u*–b‡ˆ¶lR™”:Èõ) IDATdiS¤=¦XFQa|EmxiÜ_:¬¤Q—GÖÚÿ€ÄªèEº˜KºbdtòÀÎv»i4,Špd#C-Ò¦`Å í2¸~1Žch2hy¦´°Ùl«qÛ=÷ÖÊŽGÜZXMã.¡$ŽŒ?vúˆ/,ö æº(©ÇݙكݨM"¯TÊY–¹Ô5Æh "i¤FaJ»q?–ùp©R ÔRh­¦ ÚXr©Ç€Èe2Ò¤µÆ !¢^Bˆ!Æ`D–ŸWº” ‡÷’¬—Ƶb¹u9ÅÐ`­sŒe4I2ÏqÓ4)”Šy¦ÃÀy&¥r= €†Y 5T‹Í>ü=ûvŽ®[qÄž½;zíŽ7∖Û+V9JBKa*¬§I›`¾oß¶rµ\*—÷ßqo}hU?kðÀÕÊsâ3¦mOd¼ñ¨SMîmuº{îö õ°PÙ»¯  ïºçî-[ŽŸŸŸ]¹0B$RꜤ¾K''·cˆV¬\»yÓÖ~¿?3½Ëã^'IDÖa¸n­Å )„°»ÄV06ŒJ Æ:m7 ñ6m9ºÙlH´µY •̰Õr­Õ^$„@9sX•çyžÄQ!(ÏSJ¥"_nÅC°ƒ-D„)ÐBcƒ ÁA^®MÏÌ'R¹nh­q™—§ijL/Š\§IʘÓë'Bäc£Ã”Œ1@<îöÒ$ó ´•È\J©”r¹Ã³PJ]×ã®c”Þ»{WÒÇÇÇcQžrD&Ì¡ŽïüÐ!Œ¹žApnzã8"Ítf’¨űëq@.ÅòÓÍL¤‹ÍEÏó|ß'" Dž[Œ …R­\Ñ®ßÑýÀ „F*€ãx#k­ï†1÷Ò4Å¢4« †+‘J-µÕZë,I0#LH*ó]¡e xÌnÀâmW|áÖŸ¹ùG¬qâ¾ð²§¼é‹o¿é¿ýèÎO>¹¿óêg½á»m{Ü¥7Üù–Ëòðµ8çÜ˾÷šwûä¯Ìî~Òikßx—6ö”Ë]þ0Aø7ÆÂàä¿ý÷Ó?}Æ;oNŒ™ºü‚ó7ýôo>ú×Ê2>š3¥ágþÍǦ/½øïUÆîÿ·×½û”³ŸsÖ±»>wÛîï¾í¬óîØ°°´î¬³¿ûã?Ø{íG.xý±»¾}î…@MåÜ­}¿­V¼ñGß?þ½óOzýß÷ãÛÿñž«_·Öy´ØM¾æeïÑÏþú¥ÿ|ÿ ?|B{7ÿýåÞ¾{\0÷ð³òퟺø_'×¼÷ª—o.0ÁèSßöÞg]õïèÿÆÔË6…AºåÕyçÿÐÅŸí-oÛèÊG}Ø1í[>ôÂ7í»ð[ÿúŠ ÁòÏ1ùE˜*\.È„˜B ÜzáKŽø§}þG ç_´ C¨|óê…_Ø’AìÛ@Xðü@è†u›ó0`ÀŸ" z üQ@ W‚  ÆØZ›G‰Özlt%¶@³ù¨µûö,¬?õ$›ã5#`¨ht¼”µ¦LCIÄáØÇåÈ¿íæ«0PÝ^oÃæÇ •ë‡vÝÿ´³_Þ˜Ý)RxtÏ®¬‘Œ9…B­ßkÃAÚK¢¸kÕÒµV)|GdÒ(gÔ¶[ŸùÒ÷*µ’Šl”ân»ÓY¿zÏÝC s'sêW¿ö]K=—rL µcÚOâ Ê…´xžßnw¥åR©×ëö“D*ŠRH„PžæõB!¥  £­!Z¡ÕY{„B•Fý¨‘%XjÀÚZB0ÂÖEˆc¦”ÀH- B. (åŒ1œ Œq/îYk—Çq¬EF[keN±,â°H`ˆ „Òv«14T×V¹®Cž_l«ˆ%ós÷nÝzL±PÅ5Zááá°LÏ,îØµóñ§>q¤ºSj¬i¶âœÿ’\u¶žÖfóѧìÚu÷ÁÝ{V®Ü02±fîîÿÚ|ÌÉyÜ]hdÖ³aýÖïþÇeSSÛOyü˜¥%×XgY¥îÙçÑ›ž0<´bûλº X*)6Re¬ÙCìØu׳ŸñÒÑaŒd„NÍì–žžæaD5D¹”Ú@ÂÕHG(}Ï÷©ÈÚK3€ ½R©Ôn.B"_PƽÈS¯×•RK‹ ZëR¥È¦µZl,@ÄŠÅbàÖZPšÅ”pÌ9B(Ž"LAØ/,æý¬{àдR*˲v·kðÜ!ì8c‚b˜;”—Ç}ÀÄÊU^Ì/µ²,ëF}côüÂã,És`!“$iµZZë ý0$+¥0FkׯïEIš®Ûï÷û:‘RÖ‡'<Ïs/“r±yX[[‹¾ç-·‡¦”J)«Õj¹\\þõ•È1"”R¡UÇ@›8ŽÇÇ'0‚XCPÔO”A¨U,rm–û€£n£+•r=¿T,rîj­!ÄÆ˜ÑR™aͲ,©@Y£µ¶Öú~˜eY§ßJz½Ðó—ˆÁõaÀ€Õõ«rÆï{RmõX€!`ÇžÿÚÇ¿õškÒƒ_øÄ­ïÒ™l÷U7t•¶ºŸæ®9ã]ÿpIr_Bˆ Æ.~aByÔ•Gÿïo|m÷)/¸ü°6éÍo?ûÍëúÏgþÎT6?ïågë=Ÿº·Þøîï~ó+ÅM¿ùô+šzîÚ»_{Ï]ïÞBv‘ï_óݺ÷·'çŒQçÇõ–«ÛR›ð¤3O¨ Ͻðø7üøÆø¿þú½?zá—Îz4—aå©ï¾xÓ7ÞûÏøÁÿùöóå7?ôÓÓÞõ‘U Í?ìÓºëš]ºtþã'øƒS†ÎùÎöç#üK ëïaꂟ›‚ΑOÚêðÛ?¼¿÷–üQG݇ô?Ó¹õÒ3/øTåó¼l}ð{ĺ›^vᆾï³W~Ù×p±ý+ÿNÎÿÆZgpm‹³ÓÁÿÞü9"ö1U¥  !5„ù®Ì…1cX«–9óïÛ¹»R­/µ{¦†J¨®’ ‚ŒyB³Vg>Me©TrZå1U,Ö'Vyhç¶#7åÅÐÀ‚xÜãžxóõ72{ôñIWæq§Õ±:0ÙòÑr)¬Ö›öÈð8óÂéÙ¹~¯=Z_y¨x¿RYßê<ÏÂÏÝ?;ý‰Ïš*qûùD ʲÄZ[*•ï¼ë¦÷4„a/Š&ÆÆ{è÷—ú]áTKAXP*³Ö´–žW8tp 3³~ý« ‚X+È<+¥©U‡•2Öj)ùÂ0 ]ßÉó¼Ûí‹Eˆw£l–Æ!B9ÆÆhŠ„–!„ò<‡B „0çØ`Dœz}8Ïsß÷»ÂÄZb´¥“Ræy^,ÇÅ¢gŒYê4ævïœ[X¤„M ·¢î‚ã8CCÔ’$I¬µõz]JÕîv2‘3B«¥r”ÆÚìðz¹ 9CÖ–jÕ¨—B…VŽã„á8aZÈó+™+i  K­â8VBX­?ìFý8Ž—í(¥FKƒ ÔŠAÌ£Œ¶ÖŒI¡¦©@©€µ®ëc „À¢\jl €Pi !´a‚4BPâpT‡FÈÇúƒ4Ø¿ 0à1»€1»ûËoxõ¯»ÿÀBd€ÕJ[Òý;å« cÀÜyÉÖÚ'¶>ýÙÏ;÷%/¾äŸþ½õŽ‘³?yÕ‡vòW·fƾìü Žúé÷_eggÊúyŸÓ‘­›« #P+Ø–¯;aÂÅGB½é…Ä‚bvàÇ7·ŒŒnå ·>ìе­_¹;9³^xÔÅ›oxõ{Ïþè‹®úÀ¿ÞYo}Z\ôÍSЦ¿´}]Ú»hA8Rx˜B —K‹ü¦†f † ÀÌïk*[zÔчÒäš7¾ii£ß½æ]û3þþ´ß#™¯{Ñ«yß%ŸÿÖþ×¼cÕ½—_U~ùUGr4¸² „Å 0à±´«µp>‹H ~(R&G,ÅS¨T¦U³Ï,Ü ˜O“'d9Ôig‘ú8µSHÐëv¢D×j+î¿}qö°CľC“'œ|v£Ñ\\šzâi/…bijjÞ@cŒFa‰3WX*–·í¸¯R¬­š8Â#3êj- @ÜÅæü7¯¼òFÒÁBg¸Z U­Ö㸟fý•«^j-/4Æj#Œ•Cß æ(EÏ£‚…”AkMÇ™Pˆ`ŒZÊÜ÷]mUš¦”1P$ZçË•—k,j¥ÑX€h5€FcL•ÕV[J òÓkcw‚±Ö⺮ÌrƘTÊZ«”JUZ(%•Q?)•Öì¹n·Ó^—$‘š9Tç2N:BbÅäÁCë6lt¼aN§Ý/–ÂGX„Mî #AX~`~çØø6Ÿ¼oç¶Fc1ÍÒM›Ÿð“ë¾ã¸EÚ7Ï{Îùÿuó÷Sá²4RVõ#þÜ罼њKãvcijÓÆÇíÜþÀØÐh«3—D±Ð{¶ý׳žþü»·mß‘I…rÑs8¥¤à0®3ãWò{ï¿òä“Îëõó³Ãª¯Iã¨Õjµ5W­˜(—KÚHFjt¸b R )ü Lâ,êfŽÃ¦gBB2ÇãÅBÁqÝ4Íã8¥ÌÍ…vG©ÔcÌ0fܡ̱ƒ)¡`h¬ÌÄ"¤”ÎÓÔæ¶ÑêhmÛÝþübÃ(A)=txbtôQ›êõªQºT.lذšRú³»î¼æ†Ÿdy®„Ž¢èÅç»jÃĽ{˜V*%[V»ÝÆcŒÇdY¦DÀfB:<Ù›Ýv Zc”XNÍ ‹õr¥:64Á9wü`¹('²FYc èõz‰È“$"Xk!„žãÄ­F§Óñ}ŸrJ… ”bŒ×͵YX˜Ë“ttdÄ¡ÌÁÐÃ0'„pâ`ŒÆ9çËU=ÏK¥zPi•²Ì™1&ùòWRceCß×¹ܼ 0`Àÿ'ØÎïø‹s>sHêÑW|õþ?øö VõÝH[ œ-ÿûÞp͹Ÿ¾/3:Ÿ¾ûê/ÜóƒËÞ÷îç}æú¯¼j­ó| Žyó·¾¶ã¤~iZ›äÆKžó¶ñK…ýù%éÄe Ã@ˆË bö ¨§µ±ÈÅÝ‹ËE|÷¾ÿ¸Â¥<$U‚æ®}}ZáÑS}ñðý—«¿÷wû‚¯xún_ók¹Ó´¶¶ÁžÅþoYWS ý_MÔýÅ>€«×T|ôÑŸ›Úòöï^ó¿¢KO9ý“¯üÀ ~öûH‹tõ ^{Ò%o¸ì«;/|Êç~<~á%ƒ4èÇî]Õ`  0`ÀŸé%!‡rŒq»ß“ZYU.¢n/Žã8Éæç[­N§ÝFI‘WJNµŒ¤Š‰ãA)å®ï»Œ6[ ý¬_*–™ëÌÏ$Ànß¾}jf6JqÒ^y¤Ch¯Û$Cdz†A1WÚ÷€ÕÊõ]H°µ6Ïs%òåpB%D”ˆþèz©Ñ CÄ8A 1Žã9„+!µÎ a¹GÖ ‘P9DH)eŒÑ˽Y(Íó\)¥”I)“<7À>Øí$˼À‡V`$ã+k¬Bk­”’PŠâœ[k1D@!A#cl†‘!@µ–Æ( ‘6Jk  QJ±‡:sJ9¥ã対„PcÀrÛ#Î)Bˆ3¬¶ÖÌd9ËË­]2™)%¬µRêb,-6U®OÍ„ÅR𦄰©©)±ŠÓ8êpFf&÷OÞ/…ªUJ·Ýv£jhx¼Ñj<¿Ýk}Ôq·þì–¥Ælu ÓÝ^«Z­ Uu!¬mÜpL’$ÕJÍá~§´Úí{®MŒ×9…¾Jaîk­)Ãý^† óÓÛ¯«Œ(`²,5Æ„a9 ËÅReïý»÷ím´:““‡ÛÝ~¥>äE@(÷ƒ~/–ÆËeJy¥V­U* @«Ñ˜ŸŸ›6Fa ¥°µê1–1x>BÈZ›çR)#íF±”¹Qr9.’1F)…è\æqÔiµ“$á”ð\¬`‹GëC£c…B! }ÇqœºòÊ«÷íÙß}ÛÒ8I“¤ßn¨<úÒ_úìg>½4?wÿ=÷nß³«Õh„)&FihA1,¬šX944„B¬_»þ˜M[×±¦V®^¸\1Ë3¥Tš%ÖZN¨ÑK±Ö‚Â0ô×w\‚Řc"²l9BsdhØw¤­•*ϲ~·—e™h36¶btŸÃ=×õ‹Åb¥Rq] Â\'(\߃(#™Ã­µŒ1@’$B k­Ö:éGQ·—Fñr,m!B^à‚A­‰ øµ6Éö+¾5©”±k.ºøìõ%NªÆ·,`‘Ñ3?qÇüÞ¾úÑ7ŸÚJlÑzú?ÞõÁÛ#û‡Õ–…tô9Ÿ¾êÒS8‚ÀšCŸÉ¯i¨‡Lýg~'û?ÿr@ëëjˇ6¼ÿîvœ¤i&–ò^>Nû•Ç=æïyšcª]òä꯫t¨zÂ3ÖÁöÝẅçÃ,}ï5O¿ð›Ó¿Þœæw4õÓiù ©üð-÷Ev˳Ž)¡ß2úÞÊ£'üÒ)ï¹üâÕ“Ÿ¾èÒ[»¿¡—Ä%”¦¿÷Æßµ$-Àgÿåéäà?ùÙOܺöÕÏèŠ]‹ 0àÏ”¤ÓƒQ‹¡Èr-¤1a@€Í³Ì÷B£”ÅPrîÇ—\Û省jÐHdb¤MçgR­›í¥4KŠÎú7zqi¦DèQ‡3^››Ü½03•ç)¥n¦A¹<”ç$IÊ•ú¡ÉÝ©ñUõ‚_8øÀ½Kh£cϧ¼Ò_XüÀ?ÂA5m‡,ç®ÂeH™\i\ £\Š^¦bÙÞ}`¯49°( 8ÄÐ #-h·;õRȰ2˜Q„»Iª¨¥ÂqB­"Œ ‡ !¬ë®ë«2¡B a¥5£”ZhMrÍ(3:geRH­cÁ\e€Ô*t%3—Q¡l,RJ­µƒ)!B¨­ÑÚpÎ¥ŸyØa¹¾ë¥I^.qat¯ÛFœÂr·—‘Ã’Ë‹Ð4 ®Ÿæ™Ö*MSÏóÚíÅ~¿µpwçìçœÓ\ZäÜ=~Ë ×Ýôã“O8•êìÀþíÖo%YšŸZ96zõ÷®¸àE¯š›š\š^ÔüãK®{`òÐñ›¶BMdÖ]ÌZµêŠ£ŽzÜ5W_Q ‹§žzê?ûéÈÐx½>¤tÖiFŒôüBñ¨ ºÔžo·ÛB(F}i eF)ãûæŽ[ÿsÃú;½^œ.å"›@kÐ… Îó ˆ)é' å|æðcÌØèªÀ{qœ¦ #ÁÄR(mD™k¶Ö..Ìùa€°×í§˜ZkŠl­Z°ˆL1&JiF­m’g.tDl]îd$†¡M«F{fhk¥Ve "JIš(‘‹ÕGNTk…ññÑR¥xõ®SRgI𥉄¾ë!„’,­ÕjC•ŠëûX AII) ‚@Á9×B‚bœ$q¯y.”t¯P,k-³1Á€1†" |ßójµŒ ­„PišEcõaB‘1†1Æç@åQRòCÆ%•™ãñÌ(,!‚,˵´y® 0!Ät£î¹’‰‘ H°çyY–¥i†!cŒB,”l%}ì@[0`À€ÿIòÞÒs¦>ôÑv,@e @`E¿ó°~Zé—<û#›¿ôõ—¿è-O8ïÍ—¾ý}ÇŸø¡½ÚÄíXY §Ë§©\Z½tû•×§§<ÿôqö[Vsl}Û·®ØqÒ‹®˜ÕFw3P~hÄ$­ø7;óàqú‰Á?Nu]ع ðÑCÄÞϾô5?=çKŸ?oâ·K‹düü/ݶ~º¸e³ûH™Á|óÿþäE—Ÿùñ¿þês¿ôÊ žšÿÏKßùCïïª?BõÆßÑÔ»¿ò¼+.Úèf»¾øWÿ¸gå_þè­çþ–Ñ_ÒUQñ”¿¾üâïþÉ‹>ð‚Ÿ}ô ¥_1éÐÆaðõS‰:⦷¼ð¯·^{çq5ŠFŸùú¿p^tÅ߯ÏûÎåµA3èÇ0MxÀ€ü™â8œj”è´š"MP€H°µšrç±B€1R« k4’ $Y µ ­s™%½–1¯8422:œ¥i–åÙ‰G"fÊ¥!±ÖRÃj Ò rÎã^¿V«u;m#%w]€ç¹iÔ®!H„Îeûê¯ët“&%ˆŒ1¢ /‡bYk´$Ï,„ý^OJ ­ÁpÎŒ1J4Siš!HŒFZYc€ã8B¥|è ÖÖ,WäaŒaRÁrÒ(°pù¦HJi­µÖºœ[k&.gÆj¥”µSB)ÅBËf!„QI•[ —#(…RJ)† % ¥Ì² B(U®”`„pŠã~›@äz$Ï%@0C¸Üá˜3)årj¶ã:RŠJ¥Ô\jTªeBÐÎ];LJW4[‹““SÅBuÇ®»â¸[*W¥!ç+‡FïÛsÿŠ#W¹a‰{îÌÜl¡TQJ˜<PJaL…ȹÇ%J§?»ó¶±ÑUÍvÚĺµZí%FC¡úC#µ5ë×¶¢ÞB¯9ßoÂ)q¬µèù…éññq`©ë”â¾M’djf¾ÙéæZ*£Ò<Ç”wZK½nË(Õé.µÚ‹hN!„VˆLå¢T*y~Áqà ,—Êu(#„sιãºn–eÝn?ϤµÐk (KÅrÅu<0˜ŠØZ ¬V3)4ËÁŒyžÇq,¥z°æ££cÕ tc€ùNXY1¾rÝÚuŽÞ´áq[«ÕjµZ]½vÍQ›6UªUè;‘È“4ëÆQ#êõD&„èt:l·Ûý~?y.e*s? åRµV+ §ç³X¤lv;JÛ8WY–5›ÍV£ ¬E9Üa®3<6zÄê#ƒb@)%Œ:®ÒÆ`‹4¡ •GY¿—v9'Jkk Bĉ‘Šã8ÎRm•ÒB%ýÉ™Có³‡>03{èðÔ4‹(CÔáB›\Ú(ïÆ¢EÝASå øÇ(­ùº§oÅpè»_½~×W~ôÿ¹Uý¢Ñ½É–v~ïo½ìž¶Xµ§æb,žòÂ-‚¨pä†2€Ù{.íøâ^yé-ý»D2B:þü¾ê}'²eMìçïp×?š3°öì|ø‰‚ ýøìí aTëÎÏ^üÞ O=ù‘:·¨ÉËÎZ³î…WÎüø%ëxÚ'w¥Æ6|ôÉǯ ¶ñÝóÖ¯~öµ¹å•G­zâïO ¬<ýÓ·ÿèmüò»~ã†Íñ‘ä ßú«8üCM½Ýûâ¹Ç®_¿î˜s¿¾ãú[?vzeÙOô›GåÁ9cã“>¼OGWž{Ô‰—Ü6wË»^{Ù~­öÿÓW®zÚÇ~üùç¬;æu·)sç›¶®{Î'…¥k/üð·ë ǯÙú–ÎK>òºM.‚ÀúSþòŒTÎ|Í+]ñ± \Þe.ß0c´ÖJ©åÂÞiš&IÒï÷{½^§Ói·Ûív{llìŒ3δûøÿ RŠ[nûI§Ó¶`°Á0àO‹•G¿õäÁzûÇãmó9•gÀjca4WR¡EÞl6‘bÎŒGmxþ9OÜïÎN+zÚS‡ˆè7f`u;óÍF‹aêUWŒ­\is±ëÎÛì{ ×OV­\[ªÖŽÜT©—;™¹ÉC"Ë´q”W‡F,B¦Ã…™CYš@—o„°§½^c\«”<Ï+K¡^¯+„ð½@Y³´´¤µv9ÓZcê@h1ÆI’h­1aVª¥N#Îh§ldd À97FQÎŒ1V¿àGqÜì4ó4+¸¢B@ –Æfin”ÌÑZçiì0ž '=µÃ˜Özaa.ŽÚÖZ¡´ëÊ¥šã—f¥ ¼ìãoÁè—±OOOvîÝyÞ Îû½ÖÞo|û×n„®X±â·ž|íµ×NNN–Ëår¹\*• …B†žç¹®Ë9§”.w°AAø`]‚åœîe9~ysÞív“8zÊSŸ6¸F 0àO見Ö>ý+ !—“b!&¿Œ¬ÑÅ—^àŸF¯ºäÂw^~û;æ)¯¼äÌ»^ûúkbc!ÂøÉ_½õe7ÿí¿^w÷ÎíT…ƒ¡u§žóú¿~ÏE'×)@üúÛ^ùWÿvÓd ÝÊš'½îŸþíož6üËQ€½kÏ™xÎ÷"!-"xÓ·Ýñ¶ –´bú[žøâ¯Ïë•o¿kû‡ó Ýóå·¼â‘y‡/é¼çï· iáõoûò9߻𣻄²ˆ‹çüÛ‡æ^uñmË'@D†.º~ÏçN mrà{ׇ¯¸iÛ%Y¨ùøs/~ÿ_¿¥ôˆ-¡þ¹” Æ¿Z¸Üüê¸5úçú'„-ý¿6 ú•wý†Qk´~øGAûK¯¡}˜{ˆ`ôð·<Ü5¹ïãO8cßÇîüÔi…²øÇåËÿö…Í›·0ΩÕÏ/qç·¯XµÚqÝb±†¡ïûŽã,¿^Þ™üú[©ÐîÜzûMaX<íÔ§ ¦bÀ€ß‡åG2|ü/ì#ÿ¹å§7=°ã¾-›ŽÜ7þ±~E´‘£8N9°y–$IEQ³Ñ°Ð"—sŒÎyî3VŽóó_?ó¬gÓIú1Ô²Õ\¢ç%Ï/‡FŒ‘¸¿Û^ÔÚ"‚jµ‘T‹°XãF§×cŒfi2:Gˆä*§„‰,ÆûA¨ñ¼:L!ÂA>sxŸÐ(¬‘q0§”Æ aè8à ch€íE]¡5V« p‡ S!„4#îPŒÖ#B+kŒµ@„†Ð@È‚FSÇ…Àh-9wdSŸt;½¡RSƒ±U(%;Qw¸>D^Ö˜¤ÐåÎÆZk-@c¬µ6Æ@`RæRJŒ±1ÊZ¨µÂz.‡r5—šœQ¥ @Ðä™±°Û‹Œ…º@›<ÏEž3B-Q©PZkƒ Àu½$Ie–{^°´8K)ítZ„à¹ÙÙjµ:;37>>Q)×gg¦ÆW®‚”¹~0uøàôô!`­ç±±±±vó0`qq~ó–ã£( ß‚´TíGme3lœ{îýÙNyöî=÷çy^*VEžH ÚQÓsœýS»\Ç[µnÕüœÇít1Æú;9ŽSz1Él«Ónwý¨“%j¥¢‹I·Tpr‘…¡1ñWJ™‹ÔŒ5ÊP—!„Ì(!Ó4[‘ÇŽãDQ1¶\›’sžS¢ ètZžçB ÀJ)Çñ0!ê¡ÕÆsùÊs^X Íf;Žã8Ž„Ì¾såŒTžç¾?ÛXÌ­`œMœÍ3Y¥û®ŒaS„#Ö@cŒOXÉóú2eLLLXkS‘" 8¡åBQa”Žû´ˆag©¶&‹»f¾ïgY¥Ø5Vcûý~–eJ)Â(6C„\X˜÷¸ëº>çœä8Ž1(ÕÏ’™ù)Ê©1*Ž:ù©8‹ã¤S.TV®Ø`!µÀR„)¥œPg„;\+‚ÆXä½Ze˜¢ŒÖZ&I’ô›æ<',)OT 0àApÚç§£ùÍã ^úO7_ð)û (í‹~Þ©bŒ^ø/³öûhÑÏ•3ÀŽ|Ñ'¯;÷ãö¡"¿ªƒ Oÿf3úuý ÙŠs¿<õ‚/ýÒawÝov!ðæüâj†:÷á0ç¿æa—„ ‚økÎzÏWÏx÷C_B„úMz„­¸ Äø‘DˆIúo4õ[Fá¯~ü•׿î|ïää÷ÿ=Þ? ÚA?¶‹îôû½'œr:Bƒ¤øþäØzÌ l¿w0ò˜Ž:Ï€R´ÈJ¨…q®,Fçûwí!.ØxÔ†ŠÊqSNÎ,œÒ¬uÔ–Ò¦L¥±Ô6ãÇ®¥øÈ-§:Žc©.ÜÙ>,U*Ul!¬”ë…RPè@'ÍBÉï%Rd=¥jQ·Z±¡•SûwwÓ”hI,¬+žËç–:Z“cCÆ´Üqó Ó¹¾_ÖZB€VÊ(€‘H2ĈQ#ŒÓÈuk­6ÀhÃ0”bL=„ˆ€Õõj C!273‘Œ\Z£‡…@(•Çñ8°ÆgLXÛO’4ËW¯\i¡I,Î" [ˆ-D!«,el99Z M”åZkkd” ßó…ÊšTÀÐqz¸ÜEÐåŒR\j4–<ÏË…Pí¦_¨#Feš@ˆ}ljUß(ÉÈ )ÅCÕ“,Ë8wÎî¾ûÖO~’–¶³ÔÔ@ë´Jƒ X(÷âàâ–Í›4yvß|{A)sû­×¯X¹fÍú£ìÝUûÙ»ï`Û²»>ðkýVÜáì“n|÷Þ—;¼Ž’ZjE@`°=” cf ›"yŒMÁx`Û5à 6Œ©ÁŒ¡‰hD0Q  V«[j©ãKýÞ»9œ´ÓÊkþxM¦(C—$ØŸ¿WݰÏYkíý­ß^¿Qþ‘Ç~?ïç™;çÕ…û^ræÎW=÷øÏ;GÎm=<>|ä#¿#DúàÝÏ›R;ßê&"„˜&}D™i¡]¸yëúÑÑÕþ0HbH§ÓY8òÞzëò”aŒ)!"bï}ãbð1rÊŒ±Œq ¨mÊ aŸâˆP"¤¬*gãÛ‘n«Ê„±Öš^‘é¦N¨à>¼þ•s™ÜܾÕ4Š á}¬ë– Î(ãRŒ†”0®Úvïà€`¬½§”l¬moˆvûû»i–ݹºìl ¤iVŒ†ÊÚí+Ï‹[gz—î=>9 ÖÍf³¶Õ”RÎ9Æxi¸¶¹rö¥/}!d2„¬V!!,`$“hDã RQ–õõíçÍÚÒÊýw݃1¶VµÆ8ã …F)W/(-´« l#é !!ζÖTÓYKë婱vûÆsŒŠ4-Ãq’ä­n¦M›¥™ÒZz Y/Ÿ—sðg¿öá\2pÚÙðÄGŸüÙkÇMÜ\?ûÀ}÷Tj†¬õIµ”ŠÁxÝ%úãàMsr3¸!‹IZôSŒ±ŽGä¬ ((mi¶N¯^½|¥èg‚ÑÅä`ÿÖIÛ6@ö±( ÕÖ\°¾H ï\@ƒÖZ2‰1!„èa Ô£X·*c9O²‚õ>ãnÛæàä`0\eÚƒ£Ã,ËÀh§[ÂèþþÇã¥<•å‚$ë”®«è§"ŠR$„0çœ÷!Ô´%g ÂÁÓ¶mžgu³è¥¹vš1fŒ†àûý~£­mÄ8Ïrï— ŠG@Öë¶Éú0Xk1ÆE„q¬ë! ”ëlðºeY–!ä{’_Ý>¨ê6ÍŠ"ÏLôLp.™ 4IçæÜØ ’üܹŒb8žN| 1F!ØòúMz•®Êű7•õ¦j<¯¸`buuµß%œ !ò<¯ªJ5Z&²×ëyïcô­v›¢¿ê¬§„yäeÖÇ@ÓN§Óé|Rà¿ø4ÈΧ›.Xì’‹nBw:Ÿª;.¸›¡/&NM"ÁÔzg‚-U/M|ð@Ñáá^ÓLÏŸ½KžFÖFutppswnbzõÖ£¯}ÍÃ+˽ýkû)‹Q 3–ÈLˆ4M%™í^3Mx 4éÉ4­M#]êÀ(¥¬ ˜²õõõ¶*÷vúƒ»œ±óÉaUÎB@„„L‘gÞ«ò±Èc„€1 ÆjÁDC`”2NŒ²­RLÈ,I”±‚Ñí©¥UouDž`ƨôÞÁœ’à"§‰iŒQáœAÞ1 †˜pq{k€£G1"Ä9uë}@>`ï#!‡ˆ`D)¥ÎYŒ1FB4MC)• ';Ø9cdŒyuÛô³œ÷!2J9“ÓÙ‰sfÐ"„½wu݃¾ÒGŒ cBãX¦)BE4›Ï…œ#çœ |6=>{úÒË|øÑÇ;/ú½4[,[g/–Í,x\Œ‡îºëøàdiié#Oý¾ ñ¥~†Ìúe9ã”i¾µ¾yîüÅ÷üίÿAüµ—Þ÷ºËO|hmcyXlÍf‹½ýCêÅ‚ ‡KR¤s4;:9î¹× ›8¤m9c¤/… 1ÎQž'¡TBF1æŒ' )òB TÃ÷Ѧi’kÓjmb­ \)Ï9÷ïz½^Ó´ÖÇc’$&ÄQˆcð.Ìg»hÑFD³ÞRð(‘B`T8ï%çc­5q3fkM[2)O‹«Û7mðƒ¥%‘È‹íí]!Äp° Këœs!„m£æMkc`ˆÜܾA úƒ<φ3›[‹º¹¹³Ÿ±¼²*Ò¤Q­Q:ÆhŒ2ÆÔm-8=!S)“€‘v„HJ>5ZêrãjÍ`PœœL~ŽÁc1€`üvÍc«MDh:›1Æn¿/e‚PLE@ !¸€ÈÞþ¶në±L@ÊœRêœz‰ì !ÛF‡ˆp,Ï‹àüb6ïç½n ìt:N§Óù«ë‚Å¿õÉîb‹NçStÕÄ/&çÁ€•<¢F#Æã¡1j2Ÿ[UcäÎo®‡¬ BÅŠaXôR™x¯¥·ã±ª¬F[“éÑ¢ZhëzYc<šL—Ö/D ˆÒ€P£LÖϵV!Ħ©¤”UUÉ4/Ë’ ðÏæÓå3M«·—Ö6/ž½ôñËOŽú£¥<ýÏ¿ü“/{ÉgLù >U¬moZ“÷å`°|¸w|tt|ç÷_½úT­ZJøËî}õÓןþ¬×½ý‘ÿN¾<~Åë>ãÝï~§jkëÎ7½éïýƯýxÙ\yÍ«?k8Â|л{Ûý¢o¬Ê’œ½÷ÞEˆœK`GK[š$‰÷ÅÈ9],*cU[›Á`4.ÀÉäˆRÖ 0 Ì»PŒ1D­&³i™¦éxy a˜MOŒUi’ç(ÏzJ€RZU PìT¯_P*E½Ø{Ý*|QäÚ*##$¡°º:,úé°ÈÚ¶ÝÙÞûèã6FÇ€Ú¶2Æëé‰L³^VŒãk×®"Âî9Ç ßÜÜŒ(ÖU½³¿×ïóDúà(…,Oª¦üÀ£ï¯ªJk}ÿ÷¤y!Ó$!’1ê=ª+SV:x]UÕ3W®$BIúùoKkšßü±3kçö÷n¼÷7ß³¹uGšf"½¬—di.Äà½gD’*¥aPÂói›,"€¤çÏÝEfLH™†à¼÷Þ­tšä„Ê™‹!„ðÂñ/ÁB¼su l§Óét:Î_Õ§j°Úݧ>¾_zèlNþºFvþÜØ¢«‡êt>eaÜSð¢J0ÍV—F2ýßyÏÞÁ6 AHBVG£•ñhåôÆ{ßý ?ÿÞ_ýÂÏû²Ç}L®®Ý¼õ壭GÿƒùWôÌsO|Ùßÿªg¯>ñüó×Ξ>‡B¤X¬Œ×U & °_ê Në/¹¶··U«QˆM@y’z½BˆD¤J!Y¤­V>LÀ"PJ¼÷·»S&º5°Óét:Nç¯î“,†úê{~ä?þÌ{ŸÜ[^¬lÞýú/ûþáÃKæêþ«ï|îïþÀÿ}&'ñcµþKìü‚‹î"t:Ý ýÛéùËøà/?P\ªEi<# BNå½—¿ñM7®=þÓ?vå™í7¾í«ÿàñG—Î_:œì=üŠ·QI”k<QÈéÑñh|† / §Íâ¸užŠ”x_NHôÕü bxrñÒJ)ÛÚh|?ëg)\?>­žf$j›É$„¢›,šJ)I‚¯µdY6ÓàkÕƒ^–PÂCÖzïmÝ6(àá°ÏÊ2™ .}kç„Éþ²>žÍ0H ˆ`ìÁœaL"%”1ŽÒ!ç‚óT¦S)‰G1’Œ&>:ëZBÅ€ŠaA\¨²ÆØE(pÆ%M3’&)ÛÝ¿))Ëy’$$"« áT ¶˜œ`óÙÉh4ºÝ&Ò¹X×5ôì³O¿â¯^,f³Y9Ÿºò±ûï~@ºÛÅOüÖ¯¾ô¯,(<{íÙ³çï9·yÇcþöpéÔ¥»ïô{·ÊƒD¦©L/_yêôé³gO]Ü>º>*Nݺpöœɰ>qù™ÕÕSÅpiq²w×ÙóÆÅ_~Ï»d_ðö/¾zùiš4 Ï× 'n:ŸÊ%IOçÎé­S0Æ‹rf4[_Ý88Ø£Œ#„BðÇÇÇœC*ûEÞ_[=C(9šœxåž$<‰ˆˆtà‚ªB(âH€@YÍ8—C™†€€2Hâcp>„œÑÈïRÊBˆ} $Fgµ3Èå9%„Yµra6¡” ™:çúY’V[ž0Éî¾ÿ‚jì¯ IDAT7>xTév뎳Èí]Ûêéᤪʳk½"ýÉŸù±ª1ÎÆzÕ}÷ß{ýꓵRÎa<‹ç6ÎÖF_۾ʥ€³"FƒbXÖ•²æäè¸åÕxu…sÁ¿óŽ{¼w„0Öìì>Ï ÏÏi¶±u†K™÷zÎ[*2ŒùPÍæˆÌRDhÓ4ãñ8MÓª*¯íoŸœL66¶ckë›”2))çÒ9C•u[)%’B Œw!Aç\|l£Æ;íŠ]Ñb§Óét:Î_Ñ'9X ³G¿÷Û¾ÿ½é«¾ì_r!·'Û—¯@?„Š!Äø—ú!ù‘OÔU,v:Ÿ²pW±ø"{fû‹Œ4 Å@4 ”D÷Yoúr†¹2ƒ¹.{ƒ¥ª-#JÓS§×–×?þ‘ǵ1¬7º¹}r²»×¹MFz‹Å0v1:Ó¶Mƒ‘ÎOŽöòå~±|û”@cêˆå$âëe9«ëFi‹a˜è{½žvÖyG)ñÑ'‰0Ö7M€”Ò>Jiš/J.SHᜈÒ4åœFä•rMÓ V—GƘÖc|û+%D"EJ1ÎrNgóIˆ:•”Q’$IœLr(€Ç⽡‰P¼½e`‚°ÖšB1ÚZërÞó> c8„x{c!„ÄŠHŒP$„h§ !1`’$‰µVpA j­©À“T9K!²,K’ÄiÃ{)Æ:ƈœsÞ‡“Éñõë——F£«W®1Æ7o^ºpW]U÷Üqçµ§Ÿû‚Ïÿâ¦4Ï=ñqénÀìÙgŸBœ;s·óþhÿ§¨iªyUÇK;{×ö§“a’íÞâxºº¼yÿ}j[®.ŸoæõÖæ„ÉÁ¨_«òòÕ­®¬ííì“LRüæ2¹yóæÙÓg¤HOêz{{g8ŽF£ºÑÖÚ••åÙ|¢­ Áñ{Í„L˜ '“$Kó¼—f²š`Œ.XòÂŽŒÿèjÝí—Þ¹„3BX‘§­ÖB0‚A&Ykt9›óDÚœ7¸CÞ{ß4M·v:N§ÓéüÕ}’ƒE»ûÈGò ßò_ñ’ 0Bè³#Ât¦ØÍÿ÷îb„ÐßúÎï~]²û‹ÿæ[ôñ½Æ³bóeŸ÷UÿôKZ¢îÈÜôñŸûÁüù]Áò]¯ûÒ¯ýª·]È üð÷~ów?ýÐÿø½ï¸7ï:šÿ‰ä¢»N7CÿvÒ­Â7ÎíL<nŒ6<†á`å·ßÿ›‹¦$L_õÀg’(Òbt|°{8ݹ¹³½<ÊVV7άŸ›µxmys^n_xés«j~ýæÕÕå•¶62ÏPÓiufuý‘Gß›—äñÎÕëOn-_xÍKÞÞßiNm䣥ÑÒ™ùôX19:<õò‡ØóW2ÂgóCãÂÒŸW{ÛOܼ÷ÞWxPesrãÖS‰Ì._^DÖÄgÐãƒÑòÒ©—ã(ÏßÝ/Ëét6¹vãæÖÖé4ÍÛVù¶wvœ ƒbÄy¾¾v6Ï—¼÷JÕ‡'Wní^‘‚FKU=·ò<¯¨ð1*SGÛPÄ(§Œ1¯mF‚këYUã^oÙ‹1ÒÞ‹D NB1F£ÛTÊLU–BN)åÜ[#ÓŒDg­eœ+Õ:!N¡®kÎXÐ*†EjQ„•R‹ºJ³ž”b$”Þ¸qëúõë£å1hZA³¥u3oI,çf¹?<v+ôÿýOÿ° èÆ«œ‚ä=ŒYšä/½ÿ¥«ËËÞ.M¦Óü#¡< ˆe–Ç#Fx!í++kÞBD1:S×g$_YÅí´‹ªrÓªœïîÞTÁYk³,ûà#tii)OƒÁ œÍ›²FÖ’c Ü*ÆBÎ"BàcD(îíJ!0@L&ANÒn ìt:N§Óù´éèì þ•üÆ#»÷¼aKBêzùíßöíoYeÒõ 0ÜûÖ¯üggùÃÇ~æûßõ]ÿþâýËW ÈŸ3R_~ç·~Ëϧ_ðŽoùǫՇÞõÿöÛaã¿öA1ƆîSÿ“ºŠÅNçS9Uì‚Å!bÑZ TÈ‚¦|+IbÛ†p¾ÊÖšèVFã‹g/­‚olUy] ‹ÊðÄ« 4&ÕÆÆùV-"10 µ%€”Ömc)K×N "Mzýù|îvÖ&’—ÇgüêòÊlrŒ ˆ*DÂÀÏ„Œ@ F(zÕjJiYÖm£—. 0/+ÎeðÑ[—Žú”¡V‘<ëy]pŒÐ$Iz½gÄ4¥õ‘´´´”ç¹÷¾TUDˆ1ŽP¬Û!T«Ö*-×Zc”P„PÀHYC€B¼u‚2ʉ÷ÞûˆPÀ ÌÓ4],uÛDó˜gY¦tC)ÀË„lêc€]ཧ”Fäc1¢£2:L)µÖRB)ï=ƈÐZ¥"ñÞ‡0¥¡è @„àR««ë·vo„…V·$É3­µØÙ¹õ¦·þƒ¼÷—¯//—O­Öªf&ÞuñÒGý`¼wxðê´'ÒŒOXRÍoR†–³–Œ“€¢µ–³Ä[e õÆŒ$UÝ`ŒŒ2ƈÔy‹b@´Ö"Íæó©L{B ظ@pðe‰$f“ &Ðëõ¼6>F‚ ÞjÝTå`yÓ#DÁÂÖZ–Jï=ä‚GÎúsœ2ôð`OíB€×VÖ^ùÐË?üøãý^º1X:89®›B”žô³AžO>õþèã4ϵnz¡à}[R"µs7®_;8ØÊ×WW­j‡KcJáö?²¿»·¼¼Êãœßþ«æ³Åt6›íà~¯·´²ÚŽÒ^s¥šóÏ"¸! yUVU5Ó3Éøp8Bï8§ºi#ˆƒ¢lZŒq.’Â8ÏHÚ?•K!Z£ë¶á„ç½uÝØét:N§ói,’µ·|ë7=÷ÿ×÷ü÷ü©‡ßü¹_øo~h#ù£,r´uáÂÇ/Ôìäç_ùúó!„îo¿ïë~ý£ö•}ò #cùè¼{÷®¯þ¡¯þœ†Ñ½«“?xÇOýÊÕ¯|ðÁ‡þÅÿTD@ºrÅ?•\tÁb§ó)øÈc¿kÝTep!I„vv^Ö”‚¢KHD¸uÎ% ^” 8uÎ×2†•žêûEÞ*3ŸÏ1¡¡àÑZJa‹Y*­ ™3m@1Ï‹#!Lëöd>O°(ZïcŒq–&ªQ'û·dšŒV7ÂÎØ#²6`œ Z¥c•œ<óìþx¸gœdiOdÉd6«êš4M3EQ,/Gƒ¡  ¬ö¶½võéƒýªQ§Î ûƒ²noíï¬ö³õõucLÓÔÑ{ë}ÓÖ„ÂíãBBò“ùÜãFÃaß8»³½?sáôÖYIÉòéµýã£ß}üQï²>^åœKÆ»5°Óét:NçÓ>XDˆo½ù›þÃk¿äcxÏ/ÿÒ;¿íßyÿ—}Çw~Éݽ2¯?Y¯c?ôÓ?øÎßxôÚQ )Q-”ÿãtìGÚãgo*·û}_ù¹ßB(Æ‚"”ç½<Ú¬´ïb@à‹EÆZ»˜¹ØÃŒ’MðˆPÔËdݺ\¬¬ –$ㆱ#Æ€‘´­öÞkSSJš¦¢D0–$²ðÞ+ÓB&“™’mšê€â H `T;E F9£]¥[J0Á˜0Ɖ1ÆÎYÝ6Ñ{V©LfÕÂz?ì:zLh*x­jŒ ¡t¼²Z–eÓ,0ŽF+.’ÛG^c¨󪄈&!ŒñÚòÊl6+ƃÑò¨*kõsÏ=Óë@²«ÛW&Çm!iN˜$ÂÐÀŒ£Û4e\Ñ~/Uª)Ò,Ò+w89ÆÑWÚLg3åüj±zߥŒ 0,Ñé|®r´NêºõÞƒŒ ãÝÑdÂ9»qcb”f½qÑ/«“A±¾±~‘K¡”ÁïNŽ•R¨"„Pï/lÄÇz>ÛÝÝÉséc°Ú%TúU[¹z29ªªêŽõ k£j[í,çœqÞunét:N§Óù,"„fë/yó—?ø¦/ú;?öÍßôãßûŸ^ó}ÿp aŒÐŸèÉb·á;¾óÕë¿ê_¼ãžq¸õKßõ=¿ûǩ⟉‚ H>ü ÿæwË?ÌËp²Ô§ÝÝã!Xì.B§ó)« ý_TÏ®·–ZëÖ67¢ÃÚ[ã-¥4Ng{»Ï=ysçÞ;. O­ƒE­!I*ó~‘ñ‹cÉ›ú˜0}êÔKŒÑ󯝛Ţ]xã!àèQÀ|eë| ©@ñd^ZêÆ…(žþæÞâø­Ÿù…W·Ÿ®ËjcóŒ7óˆ‚2š `”§,í÷M]/¯¬¯ŒWʲÄ(¥„öÞ{ Ê“¾˜W–ðŒ§cDã´q¡ÖÞ–+++išŸœ Œ±^¯}46@@Diš+÷BcFe¯'Ú¶Í„´&P•RIš„ÊzQ·š¾?=Zô‡Ãáíæ!M£Ò´À˜0žHé) Z+gcUÕ2M)@*ŒBpN&l{ç&ÆãpûUh Ø{ϳ˜::9ê÷{V›Ùl¶¹¹usç è¸,Ǫ%„œ”õ8Âp°:)'yžîî]íç}ÌâÑþÑ™­s¿ø ?¹~êÂ…û/ýóú/?öä÷Þwׯ¾ïWϬœ& ŠŒEä æU=õjœÓÄÛ¨F$©ÌFÖL™Öm›ÉDY³w°Ó.µž –î½'„DDŒ³0Æc‡\㣓IÏGç½#Œik°*cŒÁ“1*1h«]@cL±ŒLkK…a1âKxôN0¡š&b<è‚wuÛ¤IÎYê"Îò%!!xoÿ0˲^1ÒZ—“IŒq¸²˜:eL­d*#oŒ÷À™¨ëZé†댮'y.O¯Ž­F²ŸeòÁö‘EDÑë¦Õ•™Ñ¢‡°9‚N )-râ_7‡Ç³éÉdÖë 6—μô·ֶÎbÏ^~€4U­µc`ù`¨LƒPHIªÁ¶¦±Öœ:ušY4 ìÞ{Ï„H–ç‰>Œ‚ÄjÓëõÆÃá=÷Ü] ÀØSÿøÎΞnU«êTð´—’^@h:rJež*ÕTU5_Ì®_{€†Ë§/œ±ÆOÊI׺Óét:NçoD°ø‡Ϙäw¾êÁáOþÚå#O‰Gͬõ1Þ>wQï|äš?÷O¾üó^½F±ï=Y ‚EògGÒñ… ¦Ÿ­}ÎÙº‡ò.¶èt>}ç'‚î°‚Ó­ýõÁpóÌBæÞÔµÕ¡jÝÉLY?_Ì/^¼°¼rj>/³¬,gG¿÷¾l¬Ž/?[-f¯ýkµò!z‚p°AkÛ¶ £Äz" €™ÈB¤Á58’¢×C‘lOÊhVùîîöé‹!SJ…HVYÚÇ‘&’,3Æ„à¼×óÙ,-VæuýÜsÏÝ÷ƒU; Ñeýǰ¸M˜PJõò¼èåyš"ä à`ÂíjtJùí7Fã|QÍ$g”sÎXŸeY’„jËÛ¥‚­jV–×1&Zko¥4ÆèP€cC¤”"À€!F"„ ŠCðÞ{Œ1Å8zÇ)Ä1ÆU£"^,Æi𩽷F;Æ©”/'Z§cŒ€P`”£#Æ„Ðà=¥!¤u 0HÆ.o&GGËË«óº:Õ[¥„G@k­­E8Î˹düd21F1ɧ‹ù¨?ð΄ßòæ·>ýÜÕµbtõò•å ꢠjåœó(2ÆR‘zïó™rJpÉ)­êš²Ä¯À£[·¶1%ŒÂl6ɲÞDÍ(àvËcŒ1`lLDÆó„ƽ÷>hÚÖxä9¥> ¦iÒÄFÅàƒ3–0n½ ÊÀùè¦\Xcц¼(¼÷8çœJ…TJiçcÓ¦iZ×¥µ6Ïs)SJ©ìö€ÅÉ´ô1!!k-Ž„1†<ÆÁgYÒ4rÿ`‡sž º˜Lë÷Š|¼¶œ7V?ÿü•ÉdâI`…H‡b*¤ާ““\ºˆ²²š!Ÿ"¯8#FÙÓ§Ï%2·Þ–³y¯×³Ö>t`T˘ 1Ÿìî§é`0:¿y÷Â*ç½÷áèø°ÈÓa)‘IŒ±iŒñb± CŒ1çl@!“édº÷¾÷ýúÚÆù=óñÝklÓTÊhD`¥72¥³Ö·º±­šMwoížZîòüp25 K.ަ³Ø6k›ë„Q䪓£°jìOo]–¼.µRI’UºñÞg½|QN(á’"ˆÂ¥n0"Ö»Ceêb8\:uæ©§>º˜Oó»Fiœ!„R ­õ™ì¹àó¢'ÓÌZ}hê&‘IÓ´W®>Óï;e4Á€)žOu«)§ÑÅs§ÇGÉ@uÓbLÒ4‡¬w&Ø£ÈI„Á1.8Î9o‚±ÊZk´Æ!ŽÇcï}Œ1&¹ð1 „œÃ!Fb½“"ÃØ9g-¢@‚óa@(vç’a ! c„)¥®_¿qþü…ÃãápÀ¹Àœ£¦V™F)L<ŠYã¸L•RÈ#Jsc€€pÈë­óÁŒúÃY¹èõXÛXï‘Õv˜õʲFPˆÎ¹¤è[k] ¶©r‘Wmã#5Æ<ñû¸óÒ=ÕIyé{®Þ¸‰Û¶uh,£¡\ÌÖ” ÆÈtvâbD2—”Áª©¼ Ú´”'7¯?ñýftÇâÚ•Õ”®­¯'I¢« cL(ÕP`ÆY&ÅÒh€p(›ª­ÎÄd6¹¾³·º²9­•õ6“´Ö5Æ\pÆ9­ )x ÑÕÖµµ¾ßÞ>Wѹ qÎåyŽJ’,¡@ ¥Ôb1CÑ4%¥„SJšV!ÎZÉŠ8xg1&1FBg„1н#ÀŒ1ã1 Hcšàl–e@ F4w.z}Jc¬‚Æœs“ÉÄ{ß=÷cTk’,]4 ¡ÄZÛ/†‹².«ù`¼@&++ËsÎ{½1jk²^¡¼L(†›·®Îòéï½|õ«MšôòÁ°,çMYûÊ ¡PÕóV·.ø@âGžzl}óÜ3Ï>Å_6Ä''?÷s?þÖ׿½?>5]”Y–!!”õòÆ6ºUÏì.çÃJéÙôˆ ÕÕÕåト"eà­Wº,Òd–äN/¥cÖ:‚±‹BʘD°ÛeŒÆzŠ g©EÖÊBuT2m=£Òk=Γ$aP‚!:Ï8#VBˆÃ0Y”I’aÁyÓ¶ƒÁ!e„j­ aIšÜn½Í95ÆpN9€wêäd¡´M’ ( ÎhetDÀe/ÆØËƒþð‘§?Øj"+êÜG˜6Õçol»?ŸÏæfm¼öÊ×¼ZPÂ7nÜ,Ö8ãíº­LÛl®œ¥î¸ãŽñêZ¿¿zãhû'Þõ“é~.R䉤á ãÕ?zë·þÁÚ_t“½öý¯»ç›¯ñ/=û#Ÿ=ükNæ`åïþäÓ¯ý‰ÏÚúŠæEùžËû¿í·ŸùüïxÉCÿ.tó¨Óétº`ñ“ûë³ oûúÿå­_÷GÆ€_x{YœzÃ7~Ïg~CD! ŸÛ×ÿÛÏùºOú‰#¾ä¿ùçß÷÷ãíüB·œ1… IDAT{èŸý?ïºÝ­¤ûà»`±ÓétÒ\î\‘BŒ×ïÉê*Omʺs–”Õ„ ‚y¼2z‚b¡ È´:ëáL"†Â4D‡)Á!F³À1Q0ᜉÈç ‰mÛN'‡Îĺ¬D&¼È*ÕP‚‚G#JIÄØZ ˜KÉ Ð65BÈz£[U–¥ý¢7–Œ>Djo&ÇS* ˆ>OE?O$b¦Ó¹÷–1BÐV#ÀIšúy"­±Áû<Í BÚ;cŒ1&ËzÖZJ™saÄcŒ:)AÖi1F ”†Bȹˆ‚k!„`p„BEQbBt8BÁxWd¹gÁû”BŒl>Ÿ+¥cÞ{ÅDkM™W¥ aowo`F…Uê…§qï1bGÕ¨~–îî?éŽ{õÌ4uÞ'\ ÊʪY­Õm[§iêBïM&{»õötÿ$[ÏÞðú7U‹æüùó—ŸþXÑ{ï½Ivkg'Ëÿöî;>Š¢oø”ݽ½šK'!$ô@¤IéH"¨ ‚Ò¤# EŠ ÍB‘*½ƒ¥ˆ(Ò{/! ¤×+Ûæýã’@¨êóø}?<ŸÇÜÍÍìÍÎíÍþnŠÁÝÝóFLŒG„;¥¼Õï Dˆ Æ8*ØNUSœ›N§s:×TqEQbŒ1B!$wÿUe„žT•É’“R‘Ìó‚Ý©RU¢‚àp:4MãxcŒ£˜h3†¢!†AÔ4 SÄSÎa³óT0 ’,SJmY¢^ÏózI’x^e9++ËjµªªÊó:„ÇókªªêtH–ÇcLU‰iȵ“vJirJ‚"I½›,%éD½âÔ||¼Ò6ÅaÓ#âo4QÕŸp7%%0Ð/@cÈ)ÉF£QUUÌ4QЉ& æ›Æñ¼Îj´ ¤q:täÏ3×Ï9¥,O‹ÇtóƒÂ!äfµ(ŠämõÌ’$aÆôAÐa«›·NÇgdeºÖ´ºYE^§ÚívŽã²ìN›dÓ4ÂS‘NU˜··‡,©Öžã]#[)ã°À!‚nÇ\OJN²§fò˜3›Íš,qé,n2c™9Í €ˆ1KDïá=ÊèsV`’c7úêVË׬%(]]3ÿ¸,+›fÿ9­^Kï{5xL)ýïy0¡”´'… °ˆ0~ô*ˆ˜äßÄc‚éS¥|DÆ$X ð~<†}þS¾~AY¶Ôø„$§˜åTU+WõúÃÇŽz¸y˜Íæ„d!Õ‘!ª2AzâeB’z;.‰çĶï6ãD£ÙlLŒ¾B˜ 1f˰‰F1==i” d1›Mf·´ôDE“§e ¢Š¦zƒYÒì~&K¦œéíá-;& &UU Az³…ãD½hÒ„ÌÔ»L“oßË@DgÐYÜ}HD‘ &«ázôe²(Èv+ö6áŽh:èC±†˜œ‘–ÅÊsfAÇ˲#X’TI±[,‡C"<":ŠÍáà0æ ÕL„`QTr­Nèp8%Mã8‰+FÓIàu&“(ËNUU ÕK’]ÖGR˜k @QÔÙìés:^ǧã%ŽR£^t8UAeY/ò¢Žó°ºÛívNTQ—–‘®h*ÄL)Õx§d7Œ™™Ø®¥%§&™Ín˜á¬¬,Â!Ua£Ù!91Ïa «H’ª‡Å¬*ÄÃh4ˆÆøøƒI´èøÄÄ»¬I¶N—–žîãã‹1–W…`Ž×¹YÜK–ˆ¼s]gr¯U»á…óW~ûý´ÙìÃ1)+3CUeƒÑ”åp*öðñÓv+öŽ»‡ŸG ÝaKL‹ð/™˜p×(RÂ8‡Í–˜/;%I’T„y†UUQUMÓ˜ª1Æ%Ì©ÈXc‚ „¥œ(º :MSU¦"ÆëD†ˆ¦bQdˆ'Ë’¤2Æs¢Àó!B¥”!Žç¨N4ašý½mwH²ì4L‹Åá°Qªã¨Ž1•ãy†Ôøø»‚À3¦ /ËHÖTA4Ê'V§=‹©œÂ4 œ`p8NUUUÕËÓš’’\ÔìÉ+Î#—ŽyYÂB‚Ã++™f“Óm¶ôÌtw”ìáf½w+9þ^uݹ‘¯e¤– +¡âϘŽrvw›C–Dƒp7îÞ¹‹gÌf3ÊJ×c£À(Ïë4B³°¦ªNÅîHIŒ§ˆà¢ª?o*¦hšŠUŽÐÌÌL… >E‹PL²Ò3³²œvUvÊšŠÉ݄Ĥ„øÀ`“›¨!$I’Åb!1»ftsãu‚SUl¶,E’A°;%UÓ,nÞf“G\\4á0AÔÌ[T¦#ªŽšŒÞVO] ð/ æÈzíÞïZÍ”f“ÎÿF­9¨C˜ðظžãŠŸ<†Ž¨6yÂŽÙ»â›vòç¡=x1ÁM^QN‡F©Þß/Èl¶šÌÖóWÎïýk/êÎ(d82’Mr:ôF‘× /zxx+*±ºû ÉiOINdLÁápˆ¢¨8%UU5Ä0¡aMcUVTI&HEX•§Éd²XLG^4MŒ1Í5Ö¹¸žçÍ‘j𦩒¬îÝønü=Qgæ¨ÞϯHfzªÓfãj³Ù8€bŒFÂNÐ;IU½A'r)<χ;‘¥Ág¼Z8¨¯&Â!N¯OMLºtíœÅbÖñÌl6'¤$¥Ë¡OE¢‰wâã1GšÕoH§+áeuËLM¥LͲ¥Eš•žÉªª²¬8I6º¹;%Å ·pÏT c,èhÒµXN°8Y~>¾i™éÆ^¾AÞ¾þ©÷Ñ0Ó\›hqDgõ#J¸“xúôÙøÔ4£»éÜ«oT®ãÃùÇÆ^K¼aЛ“Ò2³dESU54(ØÓÍjg–Ýæ4˜Ì‚Îà°§Û³ÒìŽL†‰Ñà®ÉšÉdÂK²Ý‘å œ`wf!Š4¤9%!Ì0㩽—1!§“Ù5(NSUƲ7$áy^D„Å¡K ÇqR B:ŽwÈNA™ÊE ËªŠ²S–eBu²,ët"cBˆã ¯aEQuï´;B6§C‘UAÇBô‚˜™™iËrèMFJ¥¼ªHŠêpJYæ ³Ù(I’S–|},LÕE¡TpÊ’$1Œñ˜ËF½Èña^V ©<§cæ(¶Ùl3‡CÒ zÉr–ÝÉÙã’î™-¦¤¤¤«×¯…†"™ÍGfª¢1Åî „:½Å`(g4œN§No¸zãbñðˆ„ÄÛ11—õzC€o轤XJ±äp"„U†TIÖˆJ)uÊ«®øc*c”`ª2ªÓéT•éE£$I„ ÊcÆ0'ˆYR(¢¼(RÂ3ÆT†(¥ª¢Ù6žçEŽçy§ì4ê<Ï;§$sD°XLOS³²2x^ÇqœS’0Aˆ`MѲli”RL˜$Ë‚`@ 3L'(Šªh2¯Ñ2RÓ¬·¬¬¬Ìô”¤§C±kN©t±±wb7l_ãW¤¨·Õ‹ãž#A!¡Lã4†Ö4B)¥åK”tHª’acŒÅ'%&¥$edfœ¿zA0Š)fÐqá!N Ç&Æ'§$’ÌIv9Ñ`2º¹¹c¤Ã”;wýŠlÏÌÈÈÐ4Ì™×¥$ÝA”ØÓSoÞ¸œœ–.k„ç8J©IoPU9##CQTOwOw«Uäƒ1Æ„×ÝMŠËÌÌÌÈH3›Í qq±²Z­jML‰ªHŽ,›ÑÝíjôå#çŽE–~½EÝ:²…%¥e(Šü¢ƒuà Lò¬È’÷~³µ]WÛóñ‹&¦þñÐk=G)Âõëè»yþ›b:÷ ×å qt^]=ó÷Й{Ö½éóÌ3sÞiÔ¬¯û±…M}8ÌíüÓ™×Vv¨5ìÆÊ jE[þþÙoÞž‚R﬎ªÙý÷ÈQ/ô­f¼±ù«¡ÓÏhZ(BÄûíuç÷ ,[sNØŒƒ¿tÒ\¬Ç–ÝYu;$Ìøs|%7éïç)./êÛx`— ׯv]7¿K¸ã`/ð"Ä Ï¯TqÜeõq1Àòß\:ð‘}åäå'îÊÚü¯· ~»w˜Ž°´ã ¿ßmgºâ¼a"˜ï4.²s±·Ö¤ªL¨â LN<¼bÒø™›]ŒIvƒ{‘¢áå«×ªÿV§ÚDºSŒÐÃgÿ?:’ÿYAXÿV6ˆ¼’æÏ…b´‡CîU1{h^îóoýþ¿€çλþÇñ¨k8 sý…1É—»ÿ2œïEùÿ;7Ëy+ÿq/—=\k¨P„Sgøžz¨ˆ‡ê»*cÌžb'W2×ÙÄ¿û^‹§< –?ôk7÷å¡fæ²ü'ñ_ï<öÈ{Ì\áGžjÆPžUîW+¨%°ZOžwúpÅâ<éóXöÙ¿_]÷?ªÙY3Äc®Ov&-ê»bú/.·ÂG½óËôß<»þ^ññ·€,eÿëö­êF0©Ü³[Ø‚‰óÖ^í>¬Œ>ûœ"GþºËâ§§!k…w{VÚiÆþio½íE1g +VÄ€Q n;iDÇ`©´Ôz¼¸Q:=eä¶´Ðßö¯l¤¸\Ç=7.Þu!„¡¦ ]ß 9iÞ¯q> ¡Ë×Ö¬ÖÞY\ÖÌÄ=Oqy>=ZÊ__µësõƒu Þ/i‚˜"xqhȽñÜÍ_U5Qì85î­Î«T†‚zmÜôi ‘àŒ?z4^€â¶Žœ2ù©Ö¶¦/BZÆÑã&U5öFD.&‚&”£°“Ã‹Ž¥îVëÍï.¿?oãÚVå|pZô‘Ÿ¦|6pÚö]Î7šL¯b¸ ³ÿ5ÏÿUAÿ,äš‚õxÕü—>\@°=æ±§ÏüïPôê.ÁŒÿàÿ¿÷Nû+Á‹òàjQØH×V}w²LŸù%ÅÇ´Äß–%¶aÀ!±t×Þ•&öÿqù…~^3ºN*ÅÄ#>›³íDLŠŒ±fO´ÛK^Œ—™'½ÖCTõÆXаKQ¤ÝÞ½7F³vªâ*kD­bè§œôbéΖ8bΆè÷ú—goß].bŒzŽâ0ÆN×›I=0®Y§óÏv)QEð¢áÜ‚K”.åF°=Íwý4¥ó+Yª´ž ôh3E!l©>áà½ÁéØbÕs®6CÓ4Mc°+úKE½»iØ÷Wd¥|ŸaïV+&ŒÌ{ÏÿY=ùíýý?;û/V3ƒpÒ«N//\:çŠ-ž~È7wÌõ/‡–÷Ÿ¦iš¦>Í?E‘¯\»¤ 0 @qE¨‚ÂÆ~fþÜ[5?k$<öKÛ>wÇÞ±µ‹øúøøø­:ꤪF/ýñTVöÍ£tyf›ú=Wº¯:qóî;w®¬me¤ªCÉ¿¨¦Ù×Ìg·Œ1–“n$1döµän/MMÞ¦<]!¬C×Ñé«.;YÆÑùÛ|ºµ~Îâr¶íèÝg75¦í>õPÌÎ/]éǯ-ªk¥ã|Û%ºúöØí­M·|¤Î¬¤E½Õ××M_bø‰,-cO'Ÿð^G]ó¾¨^u4—·÷›®õ#C<õ‚ѧx•Öúfƒ‰Ò…–3æÐu1tåç_/gjÙóˆ.¼ÛòKz”ÒcŒ <ûkvö+&êøì6?ÿóÀì”ñÞ3ê·4UzlxT y¦fV(ÀˆÅW]ñ°W¯_þcÿoP6îžþAP@¡ÇRÿún¥³Å²>·§ÜÚ¼‚ŸrööûABv:-nE£Ð×Î;<¾Z}+Æò­mK8‚‡ ‹ªà­§!Jñ“GÅó!]»—‘{ã©f%f2v?ÔªgíÝ–,=óaƒ9†~8ÊŸ'¡ç+.WÄM;>ÎW­Î·]Ƕ92µ¦;ŒZ/ LáqÏ^'<¼x¢©Þò;—j× ï}LÕXµE7ötôåå(Î|è³»¼}…n¿¤(½wEYôçŽUzNî°ûÐ÷'¶~.´éBˆš‹XŠCY»ûT,2¥ZóVÍ7¨W¿N¥Rµë¸–X1töQêQ4Ýÿû“ŠÆîíú‰[é–:âæÓä[ËÛÕýxÛ#Ú€ú˜ò¨fVh+‹¯:ŽãK/õ@¡ìð CR„Á¼BE‹ÿuúvsçUÝ0®­]!5[RTä¸Ü„~õ¢*áž›~Ø?µN3/Ž©N‰!DHöóZflœã‰g›zWªˆÝSªSV1bÄ œ'‰ÿ[½êßY6iÚñsåúëãÛø|Åå0• 4ZݾXÔoKo»ksdJM+„ÁËÔhñDL¹Üè;&”ã8® &ÏRv°5EV5s•f•¼Ý,­>¨Øk÷ŸY¿½«ÝÒæ>|N ]‰¨žÕ&ö?àÔ4Õ~ãÀú7ÌÄ{TxgÄŒïzUóäpÁgß«J‡÷³6œq2¡ÌØðI;ç4öÂñ‘Zß}ÇFÜ–,«¬ 6ÐŒ{B yšfVxÀTh€0 p‚¨"€Gõß °X˜È7Ö}ówH÷Ëê¿€‰óâŠ5jó7ø¼É¨ƒŽåPÆöÙ{†„ÀF-Ãñõù_o¼fטûó¸ G´'ÏžË6¶‰éòÔ~3ÆÙåŒ+¿óGjþ—aïú=›Y’¶Ì8Sí£šÙñ¿ç,î~¦!âVmä¢~a7ft{&D€BŽë»÷'kBÈ/ÂO‡Ñ{ûB,y÷æK6¸~JBx¯­G–jé1bLÓ4UU•„ã+Ôm9ûŠã‘Æ<›ášêDU÷ä)áýZÏZÜ)åd*chö—«…@`€ …qa…)†pañ¬«•û¶ Õ=f¼¢»´U©_84¦^ý §sWÙrœ_¯î¨SªfÛU²xÛµw¹òÃ7.éUúPŸòÞEKVŽÚT4ª*O®O¬]ºÅ¢Rê¯K—ÿô ¢íSÁ?¬õªÛrÎí'µò¯¹œóZ„x¾þÁư1#«rj@¥ð&s®:5†Âî5?mëüÚ\Õ’{ úÈg/NŽž×´Tí‰WÕÌÍíKW|ðî_Ã{üxMU®}W7(¸Á·í°ŒxÕÉñ—âC¡+_¾fÑ ¼Gãu®°{ÒÅë*TP¡„©[DÔ¤ ÇâÒoܵbúà¨E]!FéàœuלOí³{ 9ã ÕÄǵÇËÕB`*4/Ü Œ(<ÄrcÎÆ1òø°h@—Ÿ®D¹6 4wv¥XnøÞèÏYî}-G1*õíîŽÓËÞF}>šå¼*xÉù;‹ó§ÎAÌe»ÎÝûÁ®×a‚{:>fùK3מ{Ë¡Êå €Ó3LJ|ôó•n,§%RŠ«ž¼÷mž¿a9ðªã½‹{!|1TòËãG†”γª".Ôkå½Â´ä¿fθX`ײ&SÑò :•«ÿNßÑC§Ô¨8â´ª%ßLQž"ÊsOÙ¤£o!/Xhz$ðüðS-«)ç’/ð–½~Vö3!„0&”rÇQJ)ÉyžŒ¦¥Î›Õýלïu¹)8Ž{0ì÷ìÅå=fJðCð2Ü9ïú/Å)35áІ5{oK fCêTvíË~ïÂ=%ûó¡E/ˆjøÑúX†ôFZÚñ%†ŽÝ¯0„0Æ„Pj ©ªÇ¡àÊA"ÂOyöŸ¦ èžÐBž¡ Â‹OD,ÅJºc„ºs2:áü’^]Çý™¬>0M{5™4±–H0JùiìœC‰’¦$Óoô–úUaç–ŠiZʆÎÍ?›ûÛùÛ©GZ챕_|þ‹Mcá}&´òãÈÓžý§iÄûñ-ä * `*ô«N–¥¿îMMMa~8 p ©X¡*ÆÐ÷àߧܘY½ÔÀ“²¤j!tulËøê‹oýU„ÃH¾2­J¹a§*CÅL­bý{Åíß:øTù}ÏëÃï‹™U¿øª°ÚŸ}[k5ŸQgHÖý—3Ó†O\±oBÿ1/ÿbÕÛOÛ=¬c°úö…çßfÆRiã¶_ŸöÞÚAñiNDÍ>AÅ[Y4°ï;U½x×i3>ñìO¯³îÞÎV#á±màñÏ>\Ь¥ÄB; 3ÆBŒ1–»í¢È²ìt:ív»ÍfËÈÈHOOOMMMIIIIIñ÷÷oÚ´)Üè¾4þØÿ›ÉhŠ,Wª€gáºrüøý?XÁ?¥¿þÞçåéQ&.¹ð?‹ºpåB‡6žé»fÚRá¥0ÆOL¼sçΘ˜wwwwww«Õj±XÌf³Á`Ðëõ:Žçùìy¬„¸ö™tõÒUU•eÙáp¸:çiiiv»½nݺðÿ¬S¯©êÛ Ý_ñÁ'sžašªi®ž>Æ„¤˜ 1MÕ˾%À˜Bàª]˜Ó˜Æb¹wqcüàY{ÂÙ`ÍÇ·Ç>û@Aÿp‰e‹–-!èt”ÒǧûPA…᳃xž‡Ÿ»(„\#V ð?ä8=¾aóoßM[þ³¶‘v°ðX|ÕaŒ!°@áD¦®ÒÀKB‰YТöÐ}wÒ &sž•Ö4{nöKôšBÅË ß{±Åè •¾Ó,Âà à–õUGá8‹Î'ŒX^ž[¯àn¿\k»³}`‹ Ö\Yרš³bKÞиÒÚBsœ˜Ðf€ÿ÷o7¨‚W„-(´0Â>¡ÀKÔõ¦¥#„)¥Üýþ­oŒ˜Q´Œ‘Àoý^¸ï6¨‚GRSŽþ´hùßIÊK=châk4Œ&^j¶C½ËÖY¢ÕlQÃÇòµY ‹êžçy·ò¦Å­obx^ï[{êy»¦Äïý¶gó×K•.SªD‰’‘ú/?¦ºîU”˜ÙUDÀó|µ¹Ç¶iWÑÏͯB‹þËÎgÉq¿~Ù¡²¿ÁèWñ½ùg2T†ãÔØ7üÝžwk³zû”¨%}ôzß²mˆv<êÎG‰ß;9ªfDxxñð’¯5ìµäl†Ó¤ —*°¨Ùïœ=røF¦úoe¨Äíß°a×Õ/ÃÂÙ`<…ưLð’cª¢jÈõ•χ~ºãÚ™uÍP{PߊfßVߎkTªí²K7ö (­'Ϋ«gþ:~ÏñÓgÏŸ;´¸ÅùþÍúîHPBˆ+Úù§3{ÇG0-zÍW›­ÌÚ¼þ‹’Çfvk7hôˆŸL¿Û´eJ{«z~¸ðšScbù/ö]ýsH1–¹uЄøö Fß=½°iÂÌŽµúìNRj)»zUm<)µÓªc.œÿëÛ*?y£õÜkˆ-øŸ ­¥þ9±ßW†,^EK½Ñ¸C‡Æ‘ü3ßL;¯-7ör›Ùs‚Mÿ֚nj½üë?¶°šÔ¶ßÎÔ:ã~¡Ÿ IDAT ¥ožÙćÃii§—>t©£Çòù­Šp!&Ý=¸zÖ›þ¸š¢|ÊÖ‰ê׳yi3ÅjêñõsçoÞwêvµ­Ð𽿢/ ˆ©%íê5éHHÏ53Ú 8·aìßsìž»v†":7ÿ2•tü¨S-¿œE®¥„Ãë,ÞuüÒD1ù•|ý­w{v«áÍA¼ÔŸP¼ ì[Zøˆ9 ,jj䬜Î7&T ë:wúºò½?ë¿¡Ö4mÈtaÄ–·ôA"GþºËâ§§!k…w{VÚiÆþio½íE1g +VÄ€Q¦ØadϦþ<®8¦×ì £zyk³@¼>¦ÏëGý|:£Oq‘䬢èÙü«-JZ9ìÞlÔ÷]WÖÿÅò!µú„‹ùï³ÎÏè¿èfÐç›>(cá)öª5pB«ZŽ›üw§9u¬ÐU€WÜÿû‹Jz|¢ìßfÔ§•ÌÌ–}|ëš9ƒŽÜš2ýã nÏ#bl\ö̱(†E}=½‘”]jòßó¾\u#¢^i Åjú•Ý«Ì\y(^ÑJäÔ4Ë8½ð»­)U; }×]ÿõ‡¥ßdAk†T°`¢fÒÒ-z¶ 4;.mŸ½tâç¦ÐÅ„‰®#Eÿ¼ì°$²ó+V_zk`DîÊ2rêí»¶ Î_÷«dT2î]?þËò%CO$ÏYÖ¯¼‘ Û…ýú.º¨/Û¤å‡íB¼HêõÓ§“$8™àeƒaÄ"ðRҷس¶±•b„l‡zWšïû ¡®Ðâ‡õOTÿ[뢺ì;ÅÄ#>›³íDLŠŒ±fO´ÛK^Œ—™'½ŸCHÍrÆ ^á^IÕ"=y‚1|Š{a-éVšÂ¼r’ãâuKš)FalŽx+‚›¿o×%[ïüE-ùèŽKª[Ǻ!Ù]yb)]³[ÿûo1ŽÚnè«À«­lÞ²„–+_ÎbT±jõâÎ÷†íÞ|¥Kd%fig6Ï›»ùð¥xæ]¼ÊÛ÷hSÖb„˜ãÆÎù߬Ø{>ÑÉt>Õ»ù–¿€Bèæ’Oš.Å¡òÃVN­i!,ãüÏóçn9|án&u+ÑzäøKÈ£²EI WÍþqç©èTê‚RÙý¨›œrbãܹ›\K%Þ%kFõü¨I˜‘dûfÐÔ •F|óqYÓ‹¹Øòa b *W!ÐõßΘ ý6]ñiýõ„6!"–on›þÝ~Ï·‡87ezrîË-‡.YFž`„êDêÏ´ýâôɹ‚Ygy½ë€J®Ü«…gýu𛓷l(L|àägž]ñS\Ùž_ÕÝ9dáÒCÝ&ÖóÌ'3„,¡å#Ë[ F•ߨæ~µù„ãGîÉåŠi—~µè¢WÛi³úT´ò#„Ø[m&°Ü5xù@`x)¿á)å\›·X*Oús#ï%äý± ¡]gŽù!bØ…¢Ãªùò9OI—g¶©?øR³™[Ot‰ôàQÆ®ö-Î9-_ÖFo‡0BSŽ dô2eßòQž"¤ªy§&é=¬Âý;C7o#rÄÝJW™GÞ å„« ¥®j¾CÈî˜hÎ4 yÝH”aT¼ò Í®ÐÙs° 7òL±;U„¤k«† \‘Y¥ÓÇ£CÉõÝKçî˜1½s¨N‰Ý<îû=†6ŸŽ«R„K‹Ï tÏ8íÝ|ø¨F¾<&?#Árôšáý–¦Tlÿþe½PZš¥ˆ€±tmeÁÙbd?³pȨŸµj»w’Îÿ¶â2dgì¼²rØÐ͆–ýÄ7óȪÙߎ"EçöŒDL’$IÖ^Üðð‹®@Ë<;äìó¡=|ZÙ“ÇñAfliOˆãØð©ù2àÅœîˆjKLׄ"ÁŒ+ЧfÞü{Ó/7 U>+i~0D¢¥ü½j¯Vs웑e}k,½fW\­wò΂ÇcÌä´Û§¶l½Æ¼êEzq8ëĪ-±Bõ1¼æ.äLz‡à x9ï9`Ä"ðÒ¬¾Þ=踴q³­|°¶oÈgë¯{7X‡’om[rÀal0½¢gx½}C·ÏÖn½Þòã¹¢ScšÔËΊií§t}ÍLÕ;×®e1¿ÈbfèÇ€W†í•€—Ÿýøˆæ“Ê.YÞ)@À!û™ïzýTeþ¶O.½W±Wï>ëj­{7X‡™ê”B$gšŽ–çøg+A±+^µµõ6cŒPÖÅçVöÍ’Æ:ÙÄóõÆ%ð¸SRQ +GBHß>b膓Gׇ%ÎàUW8nY/|ûnÛv-;¾ßíóï~•+}ðå·|y%áB´Ó\®rQ‘Œ1ªD1ã%$„µèXAÞ6¢{ß)+÷\IË»qÎ’Î_w˜ÊUÈÎcŒüèl•¤+±’[¹×Šè²Ó“Üšœxé¦C9÷ý‡M›·hجE“E«·ì„Pú"OÁ%¹•sK=0cìV©Ñ°oùëèCOç¯i×CŽèÍ_öœq«öˆñ] 4;Kb­6xþ÷_ùiS}ã?š¼/IÍ÷2)fûúk~­Z–Ô‚¥Ú¶ð¿»íçK¶<;áï1cÞ¼EófÎüjH×ZÎõC{M?ž®1 !D¸‡ €— Áöm^š#ñÖí41”V¬<틾ŻΙ^OÙ޻Ϻ›N†„ÀF-Ãñõù_o¼fטûó¸ G´¸1³óà”é»b2eÛ­ú.¼ëÝe|çP݃77º2}¾û(ðØØ«¯diŒI '– ìµ<£l 7ø¡€îj¿¡]qÏó•¸!ýûs/§Ç× òÔñ¼[Û_SUX-áÕP8F,wÓ³¢§Ébu÷ôr9B0FÙ[q䟋Cˆ!]HÛq?V9¶sÃúõû­ßÔyò×à ®±ty³c*{Ä€¼‚³E#U)ðËYS4$Vé;áãRbndMïåöü@÷pØBKÞ7eÒo¨É¤¾Õ½žnsn)f˨ßݬ5ò»!õ|ò®CÌEK–ó/Y®b¤éfë©Ë÷~\£­_nÙ/nÚvGIZÐí­…9çKÕRÖžéYݺ1ú‡·ŒJ–­X10µcß­ë/|úy°¿€Nœ‹µiEèË€—L…^JÌ­ëûóF¦ªméP¼ˆþ~9’’‹Ï`eþñqÕ¶K/%«ÖÏxwï{£'´+™¿|PºØü/wíè?|ã’Ìž£ú”÷^¼Fû¨ªüW&Ö.}lúÛ\êVµËÆ+Іú¼V¿}ôK‹vóO)*R¹Ìß+þèû[ë¶sO(*^µÔ¾Yû×wòF!ÃCúmøèn_‘Þè±òω¼8çéñ ›Mÿû¶ª\m_¢l»Õ‡Ö÷h0ãïÝÅ}Ѷü›âpš"ÛÚ:¦kx%ÏÂyeѧQ_ì¤-¦®þî4¡É×gÔ,3(ºÃ/—½éþ/ßóŸ6k.ÔX]/ð}Û²õ­XnøÞ‹-FW¨ôl­ûxiÛ[¼½Ã¡2„ßxãíÍÍÜ_ØøFá,šË”-íNIÞ;hÞ»D°öì±»RD˜ˆ1’o9—Á–ðv-̃ª´þìõufõ²ùçË­ûEr:³€l©v•1×t]Þ3¼(¿áìÑ;RD¸˜“õc²å}J ëNºé(WêÝÍ8ϰ¢¼óÆ T¤qˆ¼T7ú†-´Ô¿fMßCMëQÉã©ÂŠ,ëô¼ß^­:|öÐzEú}Ó•?ኙ#ïRÑ,ãìºß“ƒ¢¾ú¢ŽGvjI¿O±vÃÑ”*õ½Èý—g¡bK•˜h‰9´ý›îû·ÎÛЩ\×RFذ¼Ì0"F,/ .øƒÍ—Þ{Ô­6&”\{îé¸XΟå_JYÄò<]*êÛݧ3†0ÆcôùèÜ´ÁKÎßYœSJê¹5%»,L9ÒøÐÍI÷ÿ¤ØéŠ1˜Ëv›ý뇈1„1!„`ŒÄrÃ÷Fž“»¦gñ¾µú/þ½c ¡ûIÈ+s_·ð†Ë“9J­ØÐ#‡ÞÙ;¡jÌÜn{ôò9óå3ÿü ¢CBà›­#§L>Fªµ­éË?g?WË8º`Ü䣪ÆÞˆèÑ%ÂT`˶4\›”|ñëÊ‘£.¨Ž¿G´ì[êмVþU3ûgwz”ã^’A$\!>6]x篦æÍÝ2{d"ó {ýÃIÝÛ FΔ+®Þt&ÉɘèU¢f¯¡mCuckµ}›Oþqå×cœzŸÊQ¥ê”.ÕuÊ·y ¶/°.S‹ÔîY«X‘Ge‹.¬ÓÄï,‹æo^9isšÌ‰n^ej…¸âiú2ݦN±Î[øëŠI›ÒUÑZ½[ƥ̈©Šª¾È+ä[ȱþº§iÚº¯ú­Ïó°W›…+ú”5:uÞ:rMQ3ìßãÇÜ­¹ß™»¬_Ú½ ;·­ŒIUÞ# tÃ~³>lq¨»–rhÃQ[è‡5ýø<¿uòEk¿:÷‡õÄ5mk´úy ¿/üÙ„¨ÁÍ+ lóA½¢ZU°PŒGKçU\¸ð§ý«§¬IUàT¶vY…ë+x¹À®ÐàÅé¼RŽ»§&”r\ÎÎá†b­úôp÷ÜŠL8xop:¶XõÜsÌaHcš¦iìq“m1årÃ6L‹]Õ¡ÌÁíË› F˜PŽ£$û€ [oÛvjñΠž?Õ]ø¾í–¶ßi×5øþrcJüÞ™c¦.ßs͆T…éCšž:¦S97ŠRbf¿Q²ÿIUc•fŸ0yôŸÜràzëïnoéAlç— ê5qÝßwô¥j¶66ÒUsZ†6•»ürWfHï]gÒŸ[? ¾=·Y¡{ãì¤ÈÛO/«xê‡/Ÿ½8ãýw£Þ]Õ¦Z÷íwL4ù7Y~|USϧÆhlg(R¾Ý„Ç®2ùšªÞüqزA ”ÿÁð¯§jf!ôÿX$^;ÝÜä»*cêÙnȬ69îsvSÑ—ì2mñ»¹£ós×ù×ýlzí¾ !„°kt>ç^¡ýàíòŒÙÇ="[„¦neZôÞœ1–{[Ÿ½íæÜ+´ü}vV9yñ•.X•go¶2r‘ç/¡D•u/ Õý3d¨4qÇFr>ÆŠã¶î[@ê*½§¾Þ‹¡‡Î’ë¼{4š¶ãÍû¹ä4ÇÀw–ýÞJ1ª;fõÞÑù4O˜3oÞwb³>, ð‰À«îsÀósœ[¿ÉÔÃqªzµMhÉvëŽ.j`…µËÁD‰žñF=_ž]7èÓëßTÖ8ïš‚<èð© ¥..[cæ-UC¡à¿- Z6ræOû®¦›Ûm;Ö7ú›q³~:x9.CãõfïÐòÕwŸðeÓ˜®Åš¬Oqmpðý@ýˆ¸bg¶aÌ{„[¯¦ f?ðy‹~%þžÓ²À€¶³ó†ŽX¸ýðÕ¤ŒôLÍ­H±rº}>òÓ†!"_™V¥ÜðsÙ‡Ýëwæ¹cæÿzê.ÖbԊŽîÌ0p榃7pHÝÓŒj3œFŽÛ;sØØÅ¿Ÿº|Ça.ûFûϧ}Ñ:Ôð„»ÖôÃ?z­ç¨"E¸~}7ÏÿaSLç>á¹KŽ9¯®žù{èÌ=ëÞôáYæ™9ï4jÖ×ýØÂ¦>æŠvþéÌk+;Ôvc刵¢Æ-ÿì7ïOA ©wVGÕìþ{ä¨úV3ÞØüÕÐég4-!âýöºó{–­9'lÆÁ_:é.ÖcËfü9¾’›ô÷ó—õm<°K…ëW»®›ß%Üð߯q16„¼Œñu„˜vóx¬“•‘–zjùØ‘³¶9Ä܃JU|«Ç—cºVΞL©¥Y8zÌÌgifjÂ_s¾ørá®ãn¥ V_ÿ•ë7·oŸ6%M£'‡–zxö€A3·½îô­ÔrÀ€ ‡¶Ïy¾fóÿìÿà%~ì®ÊB)¥”æ]Åãìx妾¿^#Æ$OÍöÁô”ææ}*ç L%/r@ëñPyj6¯|Õ@òM—(àç;Uóƒ¹ä>Ls~0ß³Èw¢ *€FA»ðˆ>Ôx^bù/öÝLvH²,¥'\‚¨"ø1UQÆDW|À±¸­mMLUEÑB|p‡‰S{–Cšª(ʽC?Y£Vïб¶»&ßýéã&½fm?_dào±é™©±‡f½™¼ùÇŸcœÆºËï\ú¾’ëž³Ú¢6{Ö£¢Š!lª:~ãäš‚Ón-êÔñû3™l×ʲάXx `äÞè{©YñÆEÞÙ·dH³úCÿHVõmVb©÷6~ôÖ353íΚNõû-Ø}ÚÐeÍ…„ø›‡hxçÇQwÇË !íñÅ!ä8ýUýZý—ì¿ïóö á]ÃöžuIËÛ ž³Ùü¿ƒmà‚ årPˆ*‚ÿDƺ&Þ¢ÀóúâýOd¸&“bB¹|cV¨W•ï·(eÂ!”>iÝœ/G}»lN÷ZܾýiªÊT¬·N°„5þÝàöU½yŒ)G)Æy[òcÛ01•ë»fU×@JböýCZôß'?¤ÁM—œ:¹¤s ‹À î‘{TS£~s MÖ²­ßË9HZjĦµÓÆLßÚ ¦ÝÝy¼îâM³ÇŒ›ôI ‚‘–ñdžs6!–²{Ø€­)²ª™ª4«äíV¢Õ1Ò²~9zWâcVRÓ[–Øú½Æ‰¥»ö®„.ý¸ü‚ýþD=QLÜ1¢UåE½½}||KtÞi·Ç\Œ—ó bmPÕG c]@Ã.-Bø¤c{c4k•Ú!bö kD­b÷žKwþ°,;4gC´¤1d?»xƒøn{×þ·ÏS\îÆ¹ZêqÍš|«>­K Ó}aLJ:¿it÷é×5!T´ÛÄΡ|Æ#z,»%)š[“ž­Š[Ì¡Í>ié…˜zoí§ŸïNR˜ýÒ–?Ò”§of,õ·áŸmJ”TM×hôЦ¡VQï_·ÿÄöE9„biO(N‹ß:rÊiYјØì›ï‡vûè‹cªæÝÿöy›Íÿ?,ðâ…†  …˜þÍY{;vüðσJ9Ç/Ïšâ¦:QÕ=yJx¿Ö³ÖNnîO0Bìèà ^!•[t¿üLààï{G<׌P®H‹o·|U]$1íæ;Í8ûà°E"°KËzÕ/à®ãyÁçív•!d¿v>^f,ÏA©PÖS D°ú[FéŠW ÔSÊ»1c„J½gc9®ïÞŸ¬i!¿?FDïík@±äÝ›/Ù¹”…·}ckñõñññ)ZuÔIU^ú㩬ì—H—g¶©ßsµ¡ûª7ïÞ¹sçÊÚVFª:”üói;f>û;cŒå¤I ™}-¹[™P“·)ϰw!¬C×Ñé«.;YÆÑùÛ|ºµ~Îâr¶íèÝg75¦í>õPÚK]ÙØÇâW¾ÝÔ#œOɺ·çàÌfExéú¯¿ÅkBÈ»¸¯ˆB‚O¸7B±¤½Û¯:µ¸NãÓ63çõÝ&ºNëkáÙ›Œc·º ÎþöqˆŽ8ŸTœ=zïq×™,Z1ÔB ¡nÅ#ýò|›?g³) °²/æ€Â®NàÅÄYCË–‹(Y·÷Òã«Zž´{ 9#ÄŒå>û®Wy‘`¦©ÎØã[ŽîÚ D™Ž ŸwF(6•ï¿nU—¢#¤ÙþÜrÐŽ8é~N,õÏ¡o¶¹|ß%ÔzÉéøÌ{¿´v ±“2¥üA4N/„æŠFˆÓ !„©½iºªj !9þR¼k±Á+_¾fÑ ¼Gãu®àZÒÅëÚtT¹µy?åìí;wï¸Ü½wmqîÞÚy‡ÓCÉ·¶-9àþpXTo}ö€ãW–Ì÷ïâQ潌Üèžš•˜™7LŵêY›»²dé™Ûûçüúá[þÏÖ²œ_³oÇ]ùcå”þkQ¦iªûÓð ‡2ŸsÜæýZÎÜ2®šŽ`Ä´óßí½#QÉÉÊvnźEÑXX·~-JXu|΄möLïöþKxïâ^®‡J~y<%Ëf·;$Y–eYvþñ^Q¾àº®­]!5«WTÌ]¨€üêEUÂÉ›~ØŸ¬2„˜ê”Xž½cµÌØ8Ç+„zWªˆSŽî¿)¹Ò²Œ‹bòmFýßêÕPkÙ¤iSŽ–ëÞÀÇu¶ž¯¸† rFkµ/õ ™ÙmÜÿtÔ"¡”æ®îs¼‚Oi_×Ypf¸Äš3Óá: Ÿ’¾:ü¬ÍLð.éãÊОb(Î÷Äâ8ÏbÙ ²\ ˜b“ò†€Ÿ§Ù@`zÑxáÒ9Æ<•€ùc€Ìõ/‡–÷Ÿ¦iš¦>Í?E‘¯\»¤ a/rˆñ™»³¶Ãƒë¶[‘PãS—ï=wxD J0bY)Y C˜Óñ®dŠSfj¡ köÞ–žµ"¦ ƒÖ­ˆò£!MMË"ÓlÉYˆ!„‡‚0bRFªó½c1¤Ne×dã{î)Ù!/-zATÃÖÇʪóâŠ5jó7ø¼µEýt,‡2¶ÏÞ“¨0$6jޝÏÿzã5»Æ¤ØŸÇM8¢=y §Xþ³±ML—§ö›y0Î.g\Ùøå˜?Ró¿ {×ïÙÌ’´eÆ™jÕÌÙ ç9‹Ël%nÕF.êvcF·±ÓþÇËêÂÖñÄ!”p5^b!9áj"B !kíÆazlÆfvPWë wŒB·O^ËteÕâ×·)^yıLMxRqúbµ_Ó»\v%pÞ½’˜'Âû<ͦpàà*÷Š+VâêõËìÿ ª€ÂÆÃÝ3À?ê¼R4GÂ…Ÿ?øc¹¹UôTSnÝÍBˆ!S½v&‚‰¥XIw|0¡;'£^?Ü«ëâ–µ¬íž¿Ä|Ñ·gosùÑG$ݨ/Ѱݸ_e76­Üó .ýú€òváÅ^M&M¬µ­÷ö”ŸÆÎéUa@5÷̾«,< IDATãsúþÃ2e²Oƒ7ÕØ¥mjõÚ“¥¯Wß¶}׈ò®Eþ§Ç7l6唪i;¢J_=ÿàš¶Ã7.Éì9ªOyïAáÅk´ªÊu`bíÒǦÿ±±Í¥nU»l¼¢h¨Oÿ µ¿ß¿®cö(7. jå_ΟNj2F©Ð°÷˜‘Õš÷þ{@¥ðÍ_íÙÒ=LG0v¯ùi[ïõÛßþ8Ϭu}ä³'GÏkUÿó]1ªrµ}éÊ=6nmµ¢Ç×TEý®nÐÚÚcwoí[ROþ7ã&°[ݯ~xgG‡Uq)Û~ØS½°sþ–xMCî­g|Ýȋögnf¿ú¦ÅŽ6';vŒþ{µÑ5ÉÙ5#Güní2ª”ò„âˆOóqÊnFMÙ2uÉ¡¦ÊúIÛÒ4†bŠ=Ë&[Ÿ±Ù˜1†r†Öhš¦ªª¢(²,;N»Ýn³Ù222ÒÓÓSSSSRRRRRüýý›6m #h^&Œ1¨ åaX›þWbccB®\èЦÃ3õu×lXS*¼Æ8 à‰‰wîÜãîîîîînµZ-‹Ùl6 z½^§Óñ<Ïq¥4w„¼«—®ªª,ˇÃÕ9OKK³ÛíuëÖ…>9 ðÈÜ×-¼áòDIv LÔ£¸Ìij‡”píF,_™V¥Ü°ÓNYC!B¹š‹÷6Ò`äÙû:ëîílåAåk˘»ûø…›ÉvIR¨É§øm{Žü¢[Uo#$E¯ÔuØâ}1YXïVû“Y‹G5ðÍ?S4}gÛÀ–?gJ2#-3áÌáA%]G˜»îƒÊQ«ãÔ !ÇÎM|ÍH0BöË˼ÿù¢Cwyÿòõºnv¬GÏYÄÒ§~1õœ”s%-kûóS.J CaêÖvñWw?ìwЕΧ۞Ëskš™íú¶iÃ'®Øwæz‚lñò/V½}¿/‡uŒ°!bª’]m„Þß9›i®5Qn…"×(ÆPö¼)×BL(%HUU–?už4McÙ¯Ã3õþëpN EÕåò…ýž½¸¼ÇŒ ¥˜åÿû߉*ÔØÂG?þEDþ°%“,3ú‡íǯÜNefÿÐòov3"ÁHzöfæÃIqûç³`×ÉK·Ók`D“O¿œØ§AQ‘<±8„SÎì?hÆÖ#16âu»t/¾eÐ쫚Æ0åJ|qìø¨r:û³4›g°lñ²e#ŽRúø”G õz777³Ùl4EQäyžRú¨» °àŸÉ Žå 8<2L†”b-ß#¹ñ)Æ4Mcy†À`Lpîb1MÕ4׳R@´*ïÁ<ÏÊ~._TiÙ‡‚1É»¹^LPÞ À˜Ð¼O#„)AùÞEnpŽiêý7±kU%h'ÿ“Æ–'evSb·£çkf¹1Ú›ßcŠCùÆc¦=uýošÍX„©Ðøg0å`À„rîòðð#®¤˜<6üá2÷¼SÀsøƒËXäÁ²<êG¼ ò¤ø¯[Þ³@už¯™aB裷+yLq6ЇÚÖ‹Øl`óÀ3ƒÀ"à™A`ðÌ`ÅW,KÜ›ššÂì @áR±BUX˜@áÅWÝCûÌf·šoÔƒªàY0„c?~ÿVðãO鯿÷=*¢L$ÄBX|Õed¤×¨V‡˜@¡S¡|¥³çNB=ü/\¸`·Û¡*x•‰¢Xºtiooo¨ €çÅWƈçy@!D)… ÿäÂ… Í›7‡êlÙ²ÅËË :BÏ‹¯:Œ1(œÁ”ÂUú?a·Û !pé8¨€ÿcï¬ãªX¾~f÷6\J) )  ±0žÏîÀôé³»°»[ìg=û=»ÁE‘Î[»óûãî½€õŸóýøùÈ=sfvgöì93_ yeýÕ¡(ŠÃá·k¡bÞžÿ5—:6ïý“G ºÕëÚèÒWÈô;û"®tÔÒ’ÿ5F&éÌŠE§Ì‡Íó·ü'Ÿ±?W™”kQ‘¬ºøsȈ÷óÞVßŒÉæu@ _ñÞJTð«÷ H TT Tæ*K¾½où¸!ýÚ¶nÛ¼]>cmNVTØ×di쎹s6^Oc*ò‹¼"%zïž#Ó™¯470Y/¢£¼Ïc?«67þÞ•+±Y?XEÒ!Zw_ý §鿬‚? ùûó»?ËRT|iU•_ž†ø¦àœ˜C µökP×Ë÷·)R¿¬#ªwãou[@ *ĨôË[.Ðwëlú½ý7žy'ûâ—EÒ¹u³æ~#ýú×&õzTè–+É òFCø¹žÑ¥:‚á¼ÛÆœ¼å–ܱYÿQã§ŽðojŤÉ*t0ËVÃÂî~ ëyûÔñ*ñ/ð@’œa¿‘þüíÀ%Ï7Mœ´âRŠâ3Ï˺<Î˧õ´«éÅ A²—[ûzøôˆ—ž$”ÐÔÒÊÒD—Fߺ‚À~:Ô°Þà3)Åe͹ÜЧGh¬ô;ÙÐ0f1à/Û¢ý+†Â••½>4¶‰O›‰'ÞkÚT•_ΆøfÈžo›:ÿ,·ÕØÅ!k—Íèã®G}Ñ…5ucŒ‰k @ ?;’óV­Äçrõ»œJgÈÈN€_%šÍK|ò(¾‚ßý(³Å·òXdsÝ×u«o+ÎÿQ¤^?°÷˜gÃ~ÍÌy_%Ǥ=ü÷Âí&=Œá+ãìä‰ÿݾ¥¿weGøi@¨´e °äùžå»b*µŸ¿lp-}.BФy;@…ØŒ‡m ýëÆó$lìP¿Ó Á]õiÀ|ú7dùöè¸i¹2šÕü­‹7uçôù[qé`hëÕuø˜öŽb•7ÈÓî ýëfl:eìäë?tàïÕthöÓ¿!Ë·_õ15G†tLë÷:¤½Žò üvûÖ;Ô˜²{YÞÛ3›Wîú÷I²óM¼ÿ˜7½•97ëöÊñËžÖ ^9ÈU—ú^w¬ß¤¶Ù,€,v÷¬j›ÙÅ–O!ZÏ^Ÿ³÷‡>%X–ù| “ùI=¶<ªwÄ ga¾ÖØOçVl{)—›$e+0æ~Æs”kÕyΆNQß%Ƴ ÃPXSr…1<—ÊÊŽÏ´ä¡ÛØ 3[™iVUþ÷mõ~”r7ú½¸é”ÀßkéPàËJù¢nL ¯‹âMX»F“.½Ï”ðtÅ*ó6/ µ9ö*ª¥ýãßdîSÿ}Önf­º«Y2Ð ¨‹ß;”O»½âßý8ÃEñWä#6÷ Ú|/SE[97&üÖ¬ÿþ÷¥y¼Hb¶¯¹’ª(þ>õµO›o÷^Rà«B üÌw¨*¹OöHàzú×0àQB!DQ…@»gʸÍ š š<¤•ѣЉSwÇI1`râî>J²è8aÎì9£Û??¼vãUžwï ÁƒêÈ.n^°=FÊ–?HcvO™™äÖgÒÒ¹6¥/­š±åA6ƒ•§›·;sÆì1Ýjä^X3#ì~n¾#šqÛ©kV¯Ú°f͸::Ì»¿æ®9Ï61µmãu½[¶š³ï™2¢Sþf߸vÍÖõòñlÕkä¦kIÊŠùxzñÐÎíZz{ùÔ)–_åÉšyoUÏF †F½”`Œób,hïW×˧N“Îc%¨»u¿ÚØÛÛÛ§Ž—ÏÀsé,`Óïí™Õ¯cóºÞÍZÌØyO}8Sd¼K®‰^|TÈåBGÀ¼G›¢Qä|ÊaJ©BÊåI½;ÿîãíSÇë·?ÿz/—ÆnèÞ¸õŠÇù&O¹±}Z¯6Mëz7o=pÁç¥V°ùËB‹Š4[Šþe/lß½M“ºÞÍÛü¹îZšÊˆRŠJµR×’âC™M¯:×I81'pÞ ‡Q!‹;WÓ¡äÞ›þ›o×í¯•®‹Š„È ZßÊfU•/Sù›I:»lD·ö­¼½|ê4jÓiè⃪—Ó¬5™ÙR»“›šƒÓ kÔÀ·®wƒNáqös‚KéÆ4ßV_ß[PɾXEÀãªRw]œô›Ìîpư¹ÁÁS§ÎÙú0[[ Cæé.ú}ÝU]Ÿãõ:?ÿ˜ Õ‘Ô 1òp¬žÜ×–y­£b>|L*àã‹m u+ÎØˆ(š¦Iä+¡xïýáà¼Û'MÜ#¬Þ¢UÿNÖ•PƫǾy(f‰=]3j‹˜eÅ‹ˆqsM·ÎkW5ÿC f†)K…,K,wÂ7¶*–bXTd¾~ UÜ«ŠÕ¾]â¬{Ûö½1é¼rª¿½B êÚH‡ŒÞ³ónûžú€±Èº¶Wgr7Kº2pŸU‹ö-=t)TCpÿÒì[w?ʬùåËÆËº·õð{§?6ÿñ› «ijô ½ÇÕ¬Žc‘uÎäQÇ<éö¸Ëÿ¾þ£–€ÀȪZ5+„ôMR«ãZÇ«ž›˜.´¤êÕ¸e/ЦÐ÷W¯RŨ„ºy¶Í‡õ©SIÿ϶õ Çr¬£&{ˆi£šFÌèa¤Ã$ÞˆX²eÆR罋ÒLvÌ{,§O¬.ÊzunÇÆ…c8Ö{'{ð šCúzoð„¶ÓÚ¹« âuÔäE'E=Ç®jhÁIK̲1âª=»Ì_ÜΜ‡®¥˜BÒáÆeúŽ^êˆbއ®2"oGØ@Šz˜Ì¤ll8Ñ!rfèÁ—¾ƒœ„þôÏúÃéõ‡mX’š­ü裭 é÷Ï]Ž«Ü/xL-6›r¬ÌAo1Ë0ù“ÉÓðC£DÝGÍ[%ûÚÖ¥óÇPV‘<š+ˆ´å×+ïWv-*Ò&†ýëJî¯2në0f#ÿÓƒáA'ÿ Ò[´©Tû!u-±ñš/-Vë¸XòæÈ¬‰Kî8^¿¤«½]4¶²…ïC˜e–À*ʇ¢¿™¬ç×n¿³ã,Ì}suÿÖyÏ2wmèo'ЪsAI™ñÛÝev?}¿à•ý -x”ôEX¹‚JéÆ)Zn+Ù³¯ë-@¨˜èúnNHŸ¶±ã¨» ‹ z~¹­©!—óM RlÖ­°¹Kn1,öqÜ×MWc¡z-ö¦¤>[ìQsÆSFÜ~¤óõM̹8ÖC£³{Ÿëå<ÜîØÍ¹µõxdСhM#€hšæp ¥2ð ^ká¢C‘¡‘@ ‹Z ~_Ê—÷hñ€©/:¯ßÐÝŠ‡@‘xxè (Ûùá“\s.n(_ð·âfDÈö _Ì’N‘ ;ß›2ãÅïëCúÛ YÜŽáCNº.YásvÆŠçß9ï‡[.4¤V®a|gÕ¤-6›þpW·Y€<õVÔÚµ®Å¤Ñ&Õ3´C~ŒùëÍMÂjÍ:´Þ@Ê©™§d(tM½ûÑA=©±6õjøŠÍç¾NÌ”€ØcBèòæªfJùÛƒÓÇ„ÝJÌa8úU=:ܯ¾1“tvÕü°«q‰ÉÙ2Tü*²¤KÛW†ž¸—Æ1u²…tL+ËÃyq'Bm=ûè“ L[>¯<¦ ?Ñš?§b°Û›üÓÓWR±»‡…€¢XÖwÓ‰|ü,Iæ©—?óB€ÏÈÚÉÒÓe€B‚JVð45Wå#BÙäÉÏßJï×µ^ ùö–|Êc««žŽø¦ÕŒÑ©™ å§„Šlx|ûv=k]ÞüÇË&íºtlÓØÁ€ƒQÔ^¸BϹi«Æ®" Õ7{wuÐùSqyõj舶p7ã·gú½õ^êk  :vž}\E”O}ËÑœ?—WÏYéë—xrÞšå¯}lêiÄELæ‡TFÇÝ«¡wM}ÕÖØÈBcg'¥íg^ ÙW¥wؼ g 5ñ´“ô Úz³ÛR_ÃÂ3±4=MB‰-½ôwóÛz»Ç‚¢ØÛnéµÛâg}r;{?5 (íUÀºö>M}ÜDBHV$μ²'ÞutÔèöf\5Í“/vßqøùðz54WPkþzºåŒ«Õ¨¢ÒÄФÿ:VÑ¡‡?Xl_0Ð^H!ð2‹ýûæ-TP#-*5ÈÒzÈPƒ–47}mG,‘c ˆ#ÀÃ5ƒf[nYTdUü²YèØy5mä*¢|›4r¡{Ût·ó/qv)Ê)&³ôAÙÝkdíää(Ìï~—?C!Ú»1È4ßVumï|eo!BEÅÒ]8èQ4M»/ÆX̲,[j|¢9œC&f¶ûww¹ö÷¸b ¢h‡¦ò…¬ÈNîõákž8Ø€O#yìúÖÆ_HR`UqòÒÄw^ÇÞIh#ï¹ÿœë˜uqݬeçcsQ`¡Më Ëfõr×§€âMˆÓ˜{ ‹ë®‹ž™¸08ôL¢i£žãÏëityÁÈi¡Çž`ç.s¶¯tÓÒûsü~_~ëS®°ÝÎHï#óÂÎÞy‹ìõ³q^g[Fm)’þ]1zÚŽ¤@ëÚ6½rQ_W11„þBühÖ/ å`Y¦Èç¹Ð®ÜÁw›ùøbôëJ¿ž9gÁ´áÝk[¸4qã%Þ~¨ äe³žÝIä:zÚ@ñýÃñ~pдÆ"eÕyÞt¿¬ÈK.¨Ç¤Kžm;*âCÍÀë–ŒjIÿ»xâÆBÇr“N³BCC·nÚì!V.ųö2}þ’i}ëJÎ-¸án‹µ•À¤?üçÊ«Jí&,X²|Þ˜Þõ*qнUІîmÿœºhݪE“ÛÞß>wetƒ˜ìØ›>Ztž²`ÁâÉþµs ®‚s˜ñҼ͈¹³Gõ¬Á—°…ÊýÓ—žfýF,]³rÕ”-Ý ¹äI@¨¨VÅR ‹=+s||¦}S^TÂ@©aÛ ƒ À£sx´Ò\ åÍÆ*XÔ¹4týÚM!ë6mXºqš·~ Ç%Dó¹Àä[Z€êx6]ænÙ2³‡Ã§ GŒÙ“[Aö.0 ª8šBVb ÿpeËä Î5ðhùçÎ&'Cª 0+Ì|tƼ3t÷ùãšUá+§WÇn²Ã#{˜~òi:£­é Z_öñáK©¸¶OUE!„(¡om±4îÑG©ŠÙ¼ÔêðÍ[ö£þÙr&!åFøÁîºW‹+‰ ;%—Á¸Œ* „”ޛŅ‘%=~%UÜ_ÔÕ˧A]ï^Ý׿d2â?ä²Z*XzþòÀwÒ ¢²Š-©yÒÓ7rƒÚõ•æu¤ºJa)*-[Û´TâÒY7fvhúÛoMZþ֤Ÿ‹™,ãš>Ô«K6_O–ãoÓ5iqõf5E¹1“d¸ å¨È\žîWØËÕý´t›ÝXÛm%ûøµ½…@ ?-¹6èàioVÉP—ËU¶rm´üÔë‚1€M¿¹yT›šVFB.—/Ò«l]˯ç¤ÈXIæù^&öÃn)X ×ú[ y\~Ë¿´F3#®‘½! œwur»ÑGµ Ä¥#Y^»0rÚ~âéãs»xTÕåq «w^y'Sžq{]PçJ|Ae§VÁÇT6g“øwe€_M›JBžŽ‰CýŽSÆ~öD3 †Í•¹vžŒ}¸¶15?²ŽØ´Ãª¹-»ì|þúüØêBJú2rÝ?vóÎßyðèÉãëÛÚ=ÓfäÉO ‹>þ;Ï ³¯¢üe0`ý_û§9Ý^ØuüÌàƒº}V>²´ñÇ=CƒÂc¥,Ô˜véåʼn¶8ûøøùIݯ½J|ÞúÓºž GœMÑ g6íÌ0Ïߥ÷ÚsûéÓ'WVÕ¿6ħch¬„%ÁŒ¿?ØcñËCù´Üvå ¾Æ:¶¾ÎBe$œ°Y ÞÂó÷ÓÚ›™pr㮿¡Û8èêýÂñ~ô»³&ã2âûŽZè?|È’Åut0PQqæíM{ã«Þ¦ ›YÊå>»ŽÆ ©ã ¬díäh­êž vjÔÂ×ED¡ºfþ{æU^më{šKpÀ±Ž½Wc/×|ßi1k§Ø¾A3{p©nàñ;ï¥>ú",²õhèå*¢¼êY~¼1ìß3¯òjYÞ?öѼïæYÕ„‚úfq§nßALÖÇTV§aýž5ôh¨ù5‹Óßý-e{%]·ŽM ®ÞþWW×Þ"Õ§ר±*oï£Û‰2·j„@þîæã,®•£1!Å·S©šWúú5TùÍF¤º»„LËMEóÅ<ÈMÏSÝ‘ qtªÖï8ª^³Æë‡Nüë苎£kŠ*ÐM‰8.0rËßì7)<«Å¨9#kã×û§Ï9Wj~åO‘{ çWg"†7 æiÈA °ë½ê@ƒèc»vFFDÚà¬Ü‚äo·\Ì Sìo Åí¿Lnj. 4ҫ׿«eŸ«Ö‰/£¦«š™q9Ɇ"ÈMÎfÊY…’0 >SVvHD¦F”¥¹‚Zó—u!VÁ*+Ê× "N©bhÐ?EQÀ(´Ïi5«—CÛet~õAKÖv–c  ªëPçÀ¬åôåC//3oìଦ65å"DñhåÉÙ/Ý ŒÃ¥1f¸Œ6*FYÝï3tUö)%»±†fúâÞB „ŸœópWøUË —Ïôª&ÈyÞ·éˆí/ýóúÌ­UMŒ éÐÀVçáÚs/Üëa({zN—n[Žþ1µ[“ˆ÷ÏùڿͰØkëëó=M9­ÕïézÎÛßx]ëÉ—sY6~k¯ž.Ñ'Ƹ«…#–&Œéo3–'̽枂űۆ{µkß¶æ³ÐkÏoÛý†ÓÇOmÛy?_q"æô¢^Ck>;ÐÍœ‹@‘Ñ­Và±4…åð3¯f[íYè’îg¯¯¹{|ˆ½ ô‘7ïH;“Ï@Ì25×ãÂ7ZP- tžÃG9Ðp9;q/øH'K!‡QÍé§Îؘ i`P«÷к“z­½¼¼U§Ê4âèYV³­"B-è>}hks.ª3kXÈ™[oLzq¼ª7kĆý3Ž>Èá   VQ¬ÔvAp;'2l3cMÀî&›§ELl8Â^PLZ铵c¶¾­:ùð=.*77¿Ã†ös—D÷ÚØØ€¼hÿ"ühŲBùÜ< | –õÝt¤ož%ÉÊ\ÆO5ø.G-ø•˜÷æ/²¥ëÚÒ…Ž9w/•ÁÒ„[OdV¾.z4BEÓÿi^ªÀQ´¸~¢ÅÚ>X1ïÐ+)jPžüôµTñp™ã¦~>Mü÷ e2>J°r•2JéqJ¥üMQÂ*¦ý!“•ÒV*”¨°ˆ¢ #ERôŽéölÙÂϷݨÝï˜ÜL).Ê“–Ð,ÿ*ŠOÏßÊ jyXi:_*¿±…Ž]úו×ïyÛÏ<Ï`PAQÞ Úuºµ oQéÕöÑ#g„í?~áúµËgn[»öì;¹n€ÎV‰ûæ-ŒúçZôù]‹çîyoÙ½O]½o=¶Sõ´­’|tîŒÍÇÿ½~ëÚÅ“û=Í,eýkޱ[5^òùÝ.ÞºúÏÉSO2$®:~åöÓÏݽû:›UÒ¡μ½â^ƒBeW¤/’·7c½ujTÓÙŽ†½~¹´)²ï²tó”†)Qc‚¾’àügGlÛ çÔÝ!tFíš«b¦¡ÈIÍc Æ:ž©‹-/óîµwÊmQ@õ^ÏÆ¥ ©î˜ž‡º|À³iT'óÂßq]z×Õ£âëòpvró¥Uà;UåHâb‘¹]5ûjÊvb޶ –ž_;ŠÔ¸DˆÍô8iPç3‹åšºÙò²n_z•«f+E¥¼*åÐvY·…~µ:^žÊ½€œ óD´È¶ãì°¥íð_S‡/‹NU`޾…>JŽIÈý²n.{ý(‹kåhÂCŸ£óR»Ÿåê~>!”ìÆ_Ö»ð_µÞ~ÿÞö>Žz<ϰfÏÁÞ<ÀÌ«ð•W3Xœ÷üÈ… ƒ$ÔÓáqxzÕZO]=¡›§1¡‚••–6§ŒhfJ×}dÔž+šÀy—'¶süƒšÛbi =׎ýÚ9ë"Ú9øðÞå³ÍëhHfOßi²ípȬ¹‹†8Rج ç²pÚÙ)c§ÉV·~›ºÆúŽÔAÀæü3}æ™ä²öж;œ˜›—————raƒ°¸ ƒgº¢±ìX_‹ÙhââŽü‚•Ž‚ä“Á<-ŒMLLûœÎË{ó,I^l ·ñu7â „¯²}eV^5+q)„ÏÄ¡2bSâ3*k"94qRz€!$vk寇gž—œ¶°©·N>gô½šØä›K)½ê¾¶8éŸso$d›‹_†5çj|h åCˆC¼¬ü¥ßixÞˆký^“³ääõ_ç+7Ó«øÕ®ôK|//Åløv=‚‡^ \?ï`°0*‰Q°Xè=aÙpWçCz_º’­âž ¹„ÍÆiÁ IDATÌR䔿=0)x[V³a3†ºWÆoÍ^ðOéW¡( kôUAÀ·í¹,ÒûƉÈÝ{fÞ³/pÍê~Nd-\Bq•þònè5~ãêZ;#ŽD\s0C\Ëê>,ðìû,X&Úz$dz2®\­^Т?º:¾C7º.[j°)üÔ®E‡3w`ƒßœõ´["½l»dËîų¤Bçú®1#?L‘b,¨ìè;lR;>B2Ì(¦‚m Ë7w³@["Ãö鵪YUçãÛìòÍ•%¨ÚfîÒøƒWMØê²ýW~ÒÅ×X{‘ìý­Ø,¬k¬«ºž$·JMGÁî¿Ãw¹wuÀÉ™fÚ¸{ó·ñß6iºppôâxè–„ªAó=‹YYI†¸">… ã¦Ã†tŒJoÒÉ–O!ŽŽˆ’¦gH1èQ(£v5ˆœ8– êâa!”|z›iÛ®ƒ›¾– êj˯a”Ï{:cknÍnV‚Ô[‘cÁm\Z‘xA]Eeˆ¡.¶^ýá}íz…ÍêîUU7ïñ«ìü1 éiUi)‡>ë¶-Ê^49GÇÄoüšé©As'[m]ÙÛ΢i+›M+f‡çvr7¡ß?K+Gƒ$ÿ³e“íïµeÏÿ 7î1ÝÀBåWŽ\“nK«Ë—)D½;áÏë]dï@øÞDyøùÎa·Ÿ{÷1›Ì( û$IÞÚZÏ\P2°·&Ôª¼²V‹ß;vëí?aMC]…€ùl³C•v«Ž,xæ5媄eßnéÙ«zô± \na TáØ^¥–k%M¹ À|‡ºVBšý*b™ð1ƒ¾$îìåT–373>Jhl*ÈÀ©gÿzžÛƸôÏýˆ¦óÍ¥z‹.âVæQ%L‹ëfmp›òÔbŠ—)·àìźÎ~ž·YwünßšF\È:ÓͪÝc‰¢øò":ƺ¥'Í¡t*ëæ›„h. À0ªïÏB#^‘õu@ò!>“ÁFŦŸ^~¾§³ýI^~¥Xi •_ýò/bX,'e…ò=.ÊgéhÌCˆÑ3׃ó¯Þçb[Ay®¢)øNÃûn½.ÍÄÓŽœ»óáj²E³†æü_bR[ºÙ‚kÕnúÈK½—†æ0¬}A»Xq%qqȬ­R)CÊ×çCNjéJ.µM±“fXÄߊQØìàkÆEŒÞ}ôo©õ♸Úðwß¹ò:·–«Ú ðqtm¼»MôüÍoÅ€‘û=ë:©Y&žPïO Pé~刣[í·Á3ZÆš4( ÐF5»N\ß9ÿÓ U¸ÀÏz@ø‘þžâ:õçÊ_åÌ€8†µºMXÓ5_„”«ä;4^y´¡ò߼ɨF*3S}—oë]¸X[¾œzuÇ…íQz"WœÖàÚù/ž”´ <,øo)`ÌW©QUL—§×š?ðšØü~[úËžžÙu7I X`ìâ7anïb&_ʰјÉ]f®Û2c¼DhêäÚÒÝÎiàºP•«ö-„M½F„Œíã,,¦Vš-nþ¬SäÜsÚ ŒòÕGótøð!%[•m¿¬ ¢Ã6m4Zµî¯°éQ ‘CãáMÛ­JVpˆ£–üêWbTÉ0íä¶y‘¹HdRÍsàÚqí,y(/E£ŠJCcàú­ëWG…OÛ›!§†¦î~öbBí*”­í¯¹§ùVí§ÍyÜo슙»êmpê½dqÆ¢uû WPB}Çzn†-«tAÖõ w|d mj÷[2qH åw±ò*GžRj÷Ó¤Æ/Qˆz7vúÌÞE“€@ þãàô‹“šwÙðZΘõßý`E'Ó뽬ÛÎf°,[Æ‚Àmäêa'»­»/aiÂãáwOl™ÜqÃùˆ {Á\ éÖ³oÏ“ú]w$0lîÅ íÇ[Ì•ár SÌ€"äQ€8<p„<¥™Ž—?t)msò¤çIʯ‹1³këÍEP`ª„”gqYŒ¯^yCGy¦Æj‰’ç‡þÊ­aÍ^š8jßoûz[ó€<þÄö«ë‰Sük iPèÖ©uR‘ÿ¾­•¼ô,yÑ"ãSðM-Å4Õ¥•¸•íd}ºÆ«X„9¢9ä3!1,þ¿^›ukÞâö¼í£G¾èÔÊËÑʈÎJ|ùôeçÁÍêt¶ú3jÞBA¿V¶wvÇž÷–þ“ëê!Ü*¾~U·îظ|w^ëꕨ/3ʨ¥±[5ÞÁó»Tok‡S²L½›WÓd<9wnk>0rý¹E`Ã*|8óöŠñËžý§w….-Ѐcþû„‘gû-ºÍ¼,xÿÑÉì}Á©ê™ %Ÿâ3mZ·sÕçšÖpDžÞéÖÙ'gVñýÝQ‹{‚¶4\\Ï\}ºu.úµ•·™«Ú¾oëA½–îV¤ø²m^½?ýmûm›<ž êêi¥›÷øuv¾ãˆüÃ¥ÃѬu5c¡<ñv\6Ö©¬K^`Ö´X¶Å[uS µúvñ —EkþUÎlÚ$(±­³ê%w|.^˜æ<ßaÉGobT´(ÏîÏ}—†$ ÃáWš)­¢'‡·Ÿ¤ZqŠBÚó멤 œ·ß DÑü±ùР’¶Tø–-§ln>¹ÐöŠp*Õë3g‡?•´bè6Xé2¦ ö^,Ö$B¹§naŠ¢Qyª A ÜJ}goí­²Â…ì4WhÎ_Øä&·\êM!£.SÂ:MÆÅ¤‘«f•CŒbí´A®SÂ:Ž@ÚUªõP™ZR½´¦Ê*hCÏ©‡/MÉ—Þ²ù¨5~#±JϧªVT¬"5>ë ‡j#¯›Ç¸)¤Zr*´ëVc>[!¥ucЪ«Ò{ @ þ‹FE†Á’Ç»ö½Q(Xl8º£?·àñ¯8fmVÞø0*úÄÁCGþ:¸ÿÊ §Î¿ÞcK#/šUsÍÚ¯;2÷…÷´h)˾ÞÜ{85rÌ?˜[º0å*¿°r\c‡Ê€Þ§ÙwnN¬®òïó nyw‚Û.rÝÑË’‡ ïáêaëo>1äy¿:ÆØ×p_ok>ÂŒT†U¾Ë³Ù ¾2Ç\|™ÛÅXŒ@γÓص¹“N Ù©Jõ~sDsï?M‡Ê]¸™¤¿ƒ']m±d¦Ÿ1Y4ùúá(CùÆ·³L‰>¸fÑœió×íºò^&+å pN:2}öú£œ‚-è›ÿakÝyúôŽVñÇÖΘ>}fØ]ž]-gºgD¯Á#ÛZÄí^›ÇbYÂѹóo²_¹\¹ôÚÒgÞdËsãOÏžhÜw^;~Éšï2bõ@«Ûs‚#crXŒeŸîî7,"ËÕ‘¬kò Q–ÇþüP>à›74ßw` /›òß!?2@mÛÄ7ª¢# :40å"@2ïû)㎡çÚ× ×ªË¦s }aרžÿôÍ= ÄÎ|‹æCü&¨(ùÝç¹'4ÛøOÓ÷%تæWJcXïýƒ”¾DöíLJ¶W¯x¶Z¯B¸wž°¡cI_ŽKPÈÞÀRÜ…@øÑo]/·Mq(³r½~3†×Ö%Ö6@ ü‡` ÃwhQ‹þë ƒ_Þ}~Ù±øªÊù¬äÓÓ£“ÇmqX§“Ÿ˜€A·iW7] Qz¶N†èÚ'€÷÷^}ªwcXÀ¶öWÚ72‡2_ë×¢SÈ‘Y/|fÞ”±¸ÈÙHèØ¢}è²a¾ä-»òï‹6<1üB^ÚÁ9‡Õëe˜}gãè™ô–.1ÑìÆ§x³¥£ß”‹¯³öHw‡**ËŽ`IJªÃZ }ag—ÏSƒÉúŸþqæ’kyŠìcªÛnž}æä˜©‡¶g1¢†ñx+{‡Ýü=¹ ®.lTýöŠ ‡:?ôì{(FÁˆÚîWöžx¬]×Í÷ žèá½ëÂÈs»„ÞU0xª§ó¥õ—÷÷2ùLgv` O`tŒÌÒgðî‹ [VæHÌkÑfEô;Fñ²›£k×Èëá~FÍÖFŸu?­KY¹ ‰T·f·ÇguUºW~ Ò˜‡1Ƴ,Ë0ŒB¡ËåR©4///777+++333===-----ÍÜܼuëÖÿ5',ùó&‹Í|p`ÍæWMV¬ ¨.úUæðwîßhèÓ”xEŒŒôØ×1vÎäýæœ>}ºGD±„Š<5a xÆ,Ãb)ü­‰ŒŒlÑ¢…òiOcžvïÜý³žQ¢œíB–––åyþ¼yóÆÐÐÐÐÐÐÀÀ@OOO,‹D"¡PÈçó¹\.‡Ã¡iš¢(¥ßºr–Î0Œ\.—H$ÊÉyFFF^^^“&MÈsŒ@ TL²/Ú·ˆH–É•áÅâ1Ëè÷9·ÞìÈ„“·^Oäš×h0¡ÍíÁCOæ°Q4Ýd÷Õ¾—ç…»óômjžL¦ uM|º >-ÐÓ˜‹d¯"ÇLÙvéMUk4dý¶Í”¾A…džîbÕþh¶LŽ)í2ÿáñNùajX–°o€‡ä¦êÄÛÖÖ¡@Þ‹cûk¦Á éÓ–=–ÉYŠv¿³ËÑKŸÉ­ßeÛ‚Ä Ñ×”Å1 <ÿ"ÔWŒsãN,Ÿºp×¥‡qŸäz•Ím½»ž=¥§›¶ø`–ÑnÍTºúc6{DÑ4 Ãøf)c–e•;Ü"@XÍyMS¸hŸDsJü¤‘ôÑ ÷Z+]½Ý×\ÆÊù…@¡ ùEѨp’‚ \Â(ŠøîT8vn wuuãñù4]Æ’S·n\·´¶…úúúb±XGGG p¹\š¦µEÔqˆ~ïO¬˜°ç-§²ëog÷þv«´@ |HmùQDÑdI`@ üèúnNÈÞTÊ0Gshè³þr¯µ¶(„{îÔŒhšêz°/ÆEÑÊQEßÚx¶=Vë¶¢hï@õ¯nz-ö¦d«,૲ϲÛÎøÎ;Š% ´ CQ0fVÑ‚nª 4=ÿP1 R4‡B:ÕÚNÛÝ:¸(0³ ƒEs¨2'ªYhº¸=)mˆEjÏ‹Š_ i»4R[li“LR~mˆa¸¶BõÇ%VB'A;ŠgÖ­¹d5(¸³ ¿BLʵ¨ÈGVÝ|ÉšÙ@ ~ˆæ”il(a£*n¯B¥ZªJ˜Ð>S ÇP©Â¨íxZÒ¶¦Ù.GÌm„_Ѝ ÿާ4®„þkTž@ THÈ£¹¢Ã¤=8ÿÏÍø<c¾кûê9lØïKþþ|Äîãϲ唥LáÙÜø{W®Äf}§ÍÌpNÌ¡ƒZû5¨ëåûÛ” ©ÿé=Ó@ *0’ûs|l}¼d²ÿêlçÔÿl:™˜Ê‚x,cLQÄÄL ~IdIÑ‘ÃOÞ~úêS.¥k^½~ë~#54á¢R©bh”¨û¨¹c«d_ÛºtþÊ*r‚‡ ;æÆ½–Ó'Ve½:·cãÂ1뽓k¥DM^tRÔs쪆œ´Ä,#.€–BÄÒûk‡ŒÛÇúŒäÈÿôàDøcÐ)!“õüÚíwÁcœ…¹o®îß:/àYæ® ýí¨láL»Ì_ÜΜ‡®¥˜BÀ2 [¸&#fY†e€É¸îr\å~Ácj°Ù”ce޶Š·öéû¯ìç @HhlÁcÔ ‘¾>0,Ó7pôRGshÉÚNr ´Au|GcÑ,ƒQ%Ì’Œ‚ϔգÝD%"‘©e©æB9‹o×{ÕÑÇv파ˆ´!$À™£­DšFÁ~Þæ*.1£Àå!ÀE:DñhåÉYŒ¡t[£ÖŠv“·: »Épx\2&ÿGÀVñ6!@ @6û!Â/‰nÍ-rÏmØû<—)ayk;DéW«ãåééíéé]ÏɃ\òdà™8Wådܽ– Q±hqªr$q±ÈÜ®š}5å?; q)Ÿ÷âˆmôœ²;¤ƒîèýOs1GK!¼*®¶¼¬Û—^å–߆&{ý(‹kåhÂ+fÔ(<Ð䤿1…{šsô-ôQrLBnYüüŠk€gêbË˼{í]¾T²ø«÷²x6.Uø¥5‰—"@ ð}!‹@ø%¡ÄžNj=yc`ÿ'½:6r±®Dg¾{þèmUÿ±­-µ²âZ«8zæz(鯙«¯ª6µ*2°!CŸ¡Ý,úï7u¬e.Èý”kë×Ò¾ÁŸ]Í"'Ž¥‚ºxX%ŸÞfÚ¶ëযE:yâ…CѬ½‰HöþVlÖ5Ö¥2ÒRˆ^ýá}íz…ÍêîUU7ïñ«lÐhcLþgË&ÛßkËžÿoÜcº‡…€2„·«RÓQ°ûïð]î]pr¦Y£6îæM[Ù„lZ1;<·“» ýþYš›¦V™?g§f¤ç9Ì߯Û¤éÂÁЋã¡[ªÍ÷Ô'k@ ?bX$¯ ¢+5œ¹gk½M›ö]ܵhOºóŒ¬Ý÷’3<­‡TV룫´Ñûì܃«øy©”,rºÑpÕÚC§Dd±‹æãë6³7«1lÓF£Uëþ ›•¡94Þ´vÃbÊÓ3Û¢î&I Œ]ü&Ìíí  ˆ4B ×o5X¿:*|ÚÞ 9-04u÷³sÔìn” ëúÎ…;>2†6µû-™8¤†ŽÚvÉš…o4fr—™ë¶Ì/šú¹¶t×·ë½dqÆ¢uû WPB}Çzn†M†>m2Vc œ® ÕY¹jß²ÑIØÄÑkDÈØ>ÎB²×3@ ðƒ_«0Æ€1Ƴ,Ë0ŒB¡ËåR©4///777+++333===-----ÍÜܼuëÖda@ ü¼œ>}ºG!ŒYÌyÛ!Dn}RÊ¡0˲#Ц€eXŒ(ºÀÖ…1Ë,zX˜¬šXŠ‹ŸˆY†Ц€e ¯]üÊš Q!Š*fw“Å®ïÙ÷°×ÆCc\„*ž—Cx\(¢ò7vÁ*2$—,ªt™5^]SJ‰B EPË\ ?¤½A•ÈÈÈ-Z(g¶ ð4æi÷ÎÝ?k®u ÊÙÞ!diiYžçÏ›7o ôôôÄb±H$ …|>ŸËår8š¦)ŠRnµ¤œ¥3 #—Ë%‰rrž‘‘‘——פI2''P&;·…»ººñø|š.ãóþ­×-­íB¡¾¾¾X,ÖÑÑ\.—¦iåÌDýâ±H „_„(Dö¡Â,Uƒ*>H#D©ÚšK$þ,*¹…”S\¥À´š¡ •Cx¤.†$Ð,œ6™µœòY…O-ö«´«@ „¯‡lÞB @ @ >â±H Â/ÏîÏ}—†¸`@ ðí †E@ ~H\0@ @øÆTøPh&ýñ¿G"¶Fœ{'Ã_\›ÿ0úô±ã7>É1is@ ›v'jݺS ÒÿÇÀÀ¦ß?¸)âòû¢QH=åg€I:³tìø]±\qÄ.‡&Ùôÿc[‘„@ ÂÏI…7,J_F®Ú¼5êøýtæËßb$O7͘¿d}Äå$&³z@ €"%zïž#ÕF67þÞ•+±Y Öžò¹°)Ö¯ÚvWÁ§´§ü¿À91‡ jí× ®—_¿q9êì¿ð~‹¤/B´î¾úA«¥ªLÖ‹èèïóØ dW,‡&µµuiÅ~u£Ãok@ á{ó …Æç&ô]ü”Õð6â82rY‹ÊÍ«>±˜Åcøª©=˲,ûµ…á¿ÆXƒ¡Iò|ÓÄIOü#vÛ‰im)Ÿ;}ºzèÇcA ƒ‚õ ÕSþ_Èžo›:ÿ¬q¿±‹½ªxÉ…7ïSõ•ö3Jhjiei¢K—"TJË©IÍm] _ÝèŸ+!@ ð3ò]cÑÃÈÕ ‹ ƒ@ *,Ë”°B©§|LÒ•£ùu×Ð/°,©§ü¿`RîF¿7ø{- BŠ×…¦B®Uç9:!D¡ŸÅö5ùuþÿ@ @øáü ‹H¿éÂ1äÞ˜ÕwÚM)Ô¹#˜ IDATÞ?ßKB€(g<úk릿®=ý ×3¯îçÿG@‘Æ !&ýÑ1M9åo®Xìá«w©y Ò1±sõëÐÛ×JXTHƉ)=ÿV€ž™Sƒnii«£œã³™OŽo ;rýÉ;‰®•S£.ƒšÙéÐäo® 9þàubjŽ óôÍ÷ús`Së|©´‰A „Ÿ‡äSÛIÎP蚺øLÓÙ)ß=íÕÆÞÞ¡uæŸØä¥–ÒXv~ÕÜЋ1 I™Rž¡µ[£¾#‡vpÓpFô¼A³z/ UC¬e˜¤ GŸòë-ª¥bW,H‘ÜœÕuØýÖÛw«.¤PέÉG¿µ½›±É'†µ^¬h_ãõáøö;ö|qÞÜ+ZV.ðAdrSspú±aŽ#¨:0b§ŸŠíL»ÁÀï ǸŠ(læƒý«WF]~ø>‹6té¹hõ(§¢Ìlæ½5ŒÜg4lûŠîÕ¸©WB—l8ûàUb†‹=§l]ÓÞœ‹Š²–,Ç]‡Âé÷¢V­ˆºüø#6unÐkÔÿš†4`>ž^6{㥗‰ÉÙRYÔkß§}ì䵘TTɾaïIÓº»èzTªê–I:»Rs£hmkÀjC½øh•çÅ]3/ìÔƒ$ TiilT¼‚AB]Nj½K'¥ 7Lö2R“Oò"BKNù§;מ¼Îc0Åã1™‰1Ñ»Þyy÷I:[]HIßÝ|˜¥HŽŽÍéjÎCy/¯Æ0Õ†vjéè´¯É0ÌMͤ¥ï¼²Ÿƒ!¡±?³Ø!Ì2 «üSörûˆÀÐϾ.¬eŒÒÒõÍù¨À“K_ï žÁvZ;·s5B²ôûç.ÇUî<¦–›M9ª®n¢±é‹ðáÃ2}G/uD1ÇCW‘·#l ƒ€b²cnÜû`4kª« ånÄŠ‹oY´ 8;P7ùbØòÕS+»ïï*Ê·ÙªêVž¥­Q¶¶Ëc¶hÔ»V™™7Q“õ»ª¡%'í}–W{ë@ ÿ%8A6õʆ} Ʋïªå}9ŽO Üðô|ÔÍÁ-?''Æ@¿Í’°QN²»›ÆO9–xûîÇ~ãjåOæõÛ, å¼oô°ð×iWξêî&H½¸ñ`¼‚áÕ œ=µ}µô£Ó†n}þ?áÚ2¥±PM·ÚEK[×µ½[šÅg^Ó–Y˜ù!•Ñq÷jè]SŸFµTê¯Þú@ Š »+{ÿà5ƒ1ÄïÛë÷vÝ6IUžŽhŠTqwÖ3dÒć¯ŒùµzüîZY¨S­y'„@òêa’¬X|³šÎz€ ý}†ìs&B…å#¨âh Y‰L~rÁ¡¢Œj)…'ÓâêÍjŠrc'É0Då;ã€"ñŸã/E^mÝÅ…¶¦b)”QÍfvЇbs™ôûíûԔܹúN*K¼bÚ¨¾ ¿Ò×fàjª6³þiš?>ˆ‘ˆkûX‹(*¿ž‡’Θw†î>\³*|ª¤> „Ž4–#ûøð¥T\Û§ª2‘ÚøÖKã}”£Ê¢x•íŒ@šš.„[@vJ«\R]·ZEs[Ë>”!†j£—"3ß±[€‡ìðÈžf…Ÿ|šÎÊ¢YB@ á¿CÅðXTHF^¿7¶äO¾i±»!û…9i®€‹Ã0%l}´ÐPX¡`1€Êë†ò?À€QɳŒ„éʳJƒô)@ø Aò÷Cò7?.x¦«§”M¹4ÆŒBíã’üÝ¿Gcu|‡»z¬•L¡M}šZ®8pþe²÷©£¦£šDïÚ#± ÷ükCïéUùˆóÕ¾ldb ˆÒôýQäÞÂùՙȅá C†y–娯½œâæ@À áã‡ÇE còp\` ¾á©ë¶œ¢ÒÖ¸146ºæÌ»Þ«4ˆ>¶kgDp`Dä  !Î:*SBBÓœÌÌL}}ýræÏÌÌäp8Do@ ~M*„Ç"ßÄÅ‚ì\S_ÿ€ !ƒºüÞ¡ƒ‡)âð9›ø!-=g>X&ÃòwÑÿÄaŒyf¶ÜRÞdøfnÖBÒûûN=M“I^Ÿ;þc̳®®Ò\쬲ŠÂÏ -0@NjS¸W²zJ dï¢eq­Mx% Hò„ó'bu½Û»éÚÕR¸U›·µK¿´ÿÈ¡û:>¾VæžÍÌþ>zðHœIËÖ„¾A†r V3ž‰sUNÆÝk 5sŸÈ¾ËÒÍS¦D >øJR†§¾Ærx¦.¶¼Ì»×Þå'Êâ¯ÞËâÙ¸T)à ŠJÕm9¥®©«V1Ô½T™âˆmôœ²;¤ƒîèýOs1.SBBEE_O?úftFFFy2gff^»qM_¬H3@ø%©ßWi3¿A­öOú;ùÁ¶ ݶs¸#gy>³w̪§‹¸¦.æp!F~gÙй:›gÔמ³`‚wfjÏËJ†ÅÆ­º×ÖCH¢õÒTåFƒÚí}8ñNøÄî[Æ,ËbÛî}ëéQ¥œUšÀdVI ?5Ü*5»ÿßåÞÕ'gš5j㪖â„ ùŸ-›l¯m,{þwXx¼qé*¶+´"áÌßoôŒqÕ)dj)K¿.–†2õhËçòšünÁšœi§´ ~e†b"©h:•t!óÙ­çŸÜj›ªºãú ífÑç¸ñ8¨c-sAî§\[¿–ÖQ‚ªmæ.0xÕ„­.ÛÿpÕ-^f±+j,ÇÞs˜¿ÿ¶IÓ…ƒ;8 ÇC·$T šï©_þAT“&µ5 0ZæzÚÅPïîZ3Ë/¸ÆÚØ›ˆdïoÅfa]c]Z«„„Šq%ãO)ŸÎþ{V¡P”=“æpôÅú•*½@ø5©H\wèšå–á[þ¾ó<>MÂÐzfժР@qª´;òÍê§žs*ësjÍYP˜ÈHGžœzµ›÷×ÏU§ô}‘È-hÙr£Í¡Ço¾ø Ñ5söê4¤M5ag‰Ëƒ@ ?%”a£1“»Ì\·eÆx‰ÐÔ'ȵ¥»]É'Jy}çÂC›Úý–LRC‡B€3Œ‚aX ‹?{ü­^à .…+ì©§ÐfM:¹-[˜Üª¥­!ʼq{ûòv¿[óòÇ¢¯Ë *’†êVj4¢ïÉé»g¬¬¹ –j‘ÛÐІ«ÖÚ8%"‹X4_·YÕüQ€×š?ðšØü~[†Ø–([õŠšÊ±7w¸.Tgåª}ËF'aG¯!cû8 Ë¿s²fMjií´Š4tm™%)OÏl‹º›$,0vñ›0··ƒ€’Çi–PñA™T61®d\þüDi@ ~ݹÆ0Æc–e†Q(r¹\*•æåååææfeeeff¦§§§¥¥¥¥¥™››·nÝú+§P˜eX P´i&Æ,Ƹpe#„¨‚ƒ˜eYåzøÊÍ9so÷šyM"n½,lTu¡r‰ø‚"Š]Pé–¨zuŒYÌbœ_¢P¹ÏÒ,0@ *4§OŸîÑ£;f±Êö͘eXÈÿ•?î¢( ¡’)ò¸õ=ûöÚxhŒ‹Ò …(•1‹a1¢hJþb£ÏC57îö+ÊÔRŠ‹EÃð@Qªëö~UÕcÅ󩌲ˆ¢)TòhþاèÔ2(‡IM'–YN‰Ä5k¨‰J³”¦[Yl9E½­µ‰¡±hÉ\”! QiokB#22²E‹Ê™mBBÂW–fiiYžçÏ›7o ôôôÄb±H$ …|>ŸËår8𦩂ýŽ”³t†aär¹D"QNÎ322òòòš4iBÌš@ Êdç¶pWW7ŸOÓté9oݸnim' õõõÅb±ŽŽŽ@ àr¹4M£’[Yæóc<¥¡*E=õì]¾œ¹iºø,¾Ø‘Úå¢]†˜šÏ"s9@øYAMiyæ—w4¥hoŠÊ‘½>yê½Aé.EqÐj)ZÆE¤>àU†âUÓpjaÝJUûŠŒE?Jä+³­‰j5ÑtÁR5YZ£”o|/¥Ñ5gVÏXŠ„@ ¹K ·Gwêd¢A“ÖN¢Ë’z á[é–HH @ ü8ÿªˆêÎ=xD-Àš@ „o ÏîÏ}—†”:Þð†½2T5‹z áËЬÉr4Ê–@ø¦”go@ „ïÍȰZc™@ø8ÿcï®ã¢hÞ€?³{ ÜÑ! ‚€…­¨¯ïk¼ökww¿¶bww`www¼*¶¨Xˆ€- ÇÝíÎW}=>ßÿ°7;;;{·;ûììLÞ$x™ú¾Õ¯Mõ‹Çýx+!„B?¾ Bi->.èàºíÿ|PQÜS„B!„¶ÁÀ"B!¤­ø/WV.Ùü@-fpOB!„BZß¡@!„´uãÐA¥Y^4öîÎÕk^~ð>™•Y—oÐ}L¿?ìuà#tm1ÿ)ǧ÷ô3ýkËžaž: áãl›;ßÍ—Iún5Úý—‡œU¿ÙÞ¡ýš×™‰ üÌ“ëê04Ÿôø’-çïZ°dÇ?Ï£ØRžµ;ÖÔU!…”3מ⨄!„Bý<0°ˆBi'.òú±`q…¹^ú “Ä%²eš nk«ŸúüøòÓGê9íèå$e—ŸBÍZÏðod!$ŒÔÔQÂPEìù»ïê÷¾]†N58´ji¯qÒKšXZü1m•g*@ýñÌìIGäÕì%@T»óIo%Tç›OËÉÇ£/úP}¨eжóz|Ñ9<¿¾™  ræÙSŒ+"„B!ôóÀÀâ¯N¥R^¿y9..–k…v±)mWÞ§2!hù>¸OgN_síÕÇè¤4бªØ´S-&ðøé›!1ÄØ©fÇ1Û”‘³@±oì µ·?$qÛÊ-‡LìQÅL@€‹<¿xúÚ«!ï"ÒD†¶žµ:ÐÌUÆj—êËí‹ï½þ2†5÷¨ÛsÔàæ.åBSC-›±þÌ£H•XÔºlnsk‘&%yåØ3qÅ9>ú aô}{®¤ù6TsN¾z}þƒ7©à$àSb’cOoOOÍ!©ÏwíÖm¸xFïJú¾Šá»&ã·|] ‹©›—‰fËêGÎD{]ÐÁN̤>É?½Í«-ï#:·û!©5wdûš†RΙyÜxâÖ“ïýºÚŠò/'äÙSüf"„B!ôóÀÀâ¯îÆ­k2™~ju°** ”æ¿<ëšÿòbºxíÉÓ Ï2Þ[ü.¸¤Û?•î9e¼‡ä˃틶ͽkõ{Ï^S{èE_]¿péx“²»þöÐakäÝl°[#]îãííó6úÏwÛ;§¦!Ë%¾¸yï½U÷ Ãݤ)7öošÑýyÂŽÕ]$Ï6 °G§ÍÐé#,’nnš?s8Sz÷¨Jò|B‹ªˆ=cçœÖi7bIMkAì‡D;#af?];ò\Re^YÍÛÁ„apI7y£Se„›ŒP'E&¡*)Iil É Pýåɽh¡§Ÿ«\ÀÂùÔsƒ©·^$ôs‘ 5_'šx/`ÍmýV[šØŠRPúÞ:%[ÞÃ)& tŒõÅ,!„°r§r–°íé'%µå[Î|÷!„B!ô³ÀÀâ¯.11¡z•Ú ƒ£å#¤u|¼*< ~ˆõðQÐuð­QÙS‡)oõéR›mvÛ6©.cH9齋£nÞþ¤,ã !ŒÌ¹f}gð4}s®Ë±»Òj褯^¥N-¦†_­2l»Aë×=h9«Š,éΪ]o=†íÖ´”€·eôÕ6[¿T±¢^Þ1—ð)†Ó-[¥fUo}–ødëǧþpåøsi•þ^òŒ%4æìà†S¨8Îè÷é Z PU ‘‹ŸNkßh:ˆíý:ѹº™P÷.ŽÊʈ4k‰©¹.ª[cGö^|ŒÌÚÍËÊÍ«¢,¢ñœ-—úÕlm) „aY©©›_·éôaƒñgn|n×^ßJŸ$}ŠWiV¤ŠèÈd0°6hrS¾9{ÆÏŒXž €ôë-Yõþ§ú$ÇDÅSQÌîÞÝöXWµ•ù”ÓÑF”ïž"„B!„~Ž;)¬‚_>rÁ ,"¤?Oì±øƒdoGönQËRH8¹“>¹˜ïÊ÷O…¥]ÌDDhêj#P¼%–Mu3#‹žf Èì«·_µÑoó:سÿYÛ ôÔï.ž Õ«:Ü3÷ÛÓ„F(b U¨yšë#Byާ¬™gy#å…«!IÕ+È Ä?¹øœ–jã*g5…}wåÂßÑn™¹ LòO/.árðŒÌ´”àÕÞé?ü1¶JΡ³—@UО"„B!„´1ra „´Bðú£‰-=­ÈÆÝë÷ÉxÛè~~“”cΞèK×Ù7,gª|qjý†·¦m'U2`cT½ÿ_–ÝwÁôlUÉJªˆz“`ߤ™§~~ÓB«>^9p“·s2ÓQ~¸šHõLõXå»s§"äÕ‡{èfDÛRžíÜzGloWJŸ‰{}c÷º ÆkHSQ½?½åLœ¥½µ‘0!â¼æ¨2™£òЏÏOOÛ§©qi¯ëÓÔ^L MýúÚömë#Td`éV{ðê~9I"ûö W)g/Ü7wT’̵ÚÀ€±­Ó/BÊßñòòÎ9 TPú’.O Z:lh ±pö®1xqç&•,u|þåT…æÞS„Ð7”ööÔâ©«>zõ)A)[:•ókÖ®CÛ&Ult¾kûO~héÖ·åz÷«Wê»4~ζ*ÝôX G@Piú3£|déÁ3uøŠªn#ƒ4¡;¶Þ'šW£ñ÷7,;–JÅÎíGtõÔcˆ¤ìÔàOµ;Ù7ØÇÑ\}ÿŽÐiøÝOÞß#ç,ú }¾?Ï×kâSŽ'¥ø3@!ôý¿“BïÝ{Z¡=¥¾þ^…¾výaÍ¿ø—›:îîÑCg*TëP»hßöXDH{‚Ã|G"Çþû®õ# ËЫ±ôö HÿGd×{÷µ^éé87»¡é˜l‡…a2:˜U0¼Œ”!9WêäÀÁyÊTPú’-×­6ïô-šþíͶÍ|Ë© ϳ§¡o$-lÏðV}vŠz­]yj[ÙRº ø¸}Z¿ÁÖNixäÝ¡†ß³›2üÀœ7{6îY×Bô=~Ýòú{¿Ä<Ÿ[ÉÛÿ§œÐtˆÛ­uÍ,…¶“:^hï6Èáøéåä¢"w“O¼»~ú¼»O«yöíì©Ç†°Ì÷¨Ÿï—s¶m°6ïBýw~p`1l[ß¾ûL&lVË ÿ«~B ûÑ×,ik]ž´àtܧCÃú¬åùÜ8 Û² ±i~ÃëÓ¯{ÜÇóZû¸°a >!hçÂÅo…$Ë\«µ9¼EyæQããm;f«¢ïö€f@•oî^¹ñð•W±¼Ž™GíÃüé.c wÿÚ€#ׂÞ'³r+Ÿú]FöþÍNš½õ£út~N¯™—d=7méh+"ÀGëÝvÉ3.ã©®q‹€ƒ<¤š6U¼¿¾sóÑÏ_¿“6_¹¼£Mäîn]ׇq9ûL9´ÒÏRBO¬Øtþñ‡d Ú݇öm䤇¯† -‡ÅïZ» Ëäø-àŸÿå΃aÙ|os¯¥Nxö1™Ë}û§_ÚÁR‡ÍuG~ú̃šãËäx;˜0 ›ÿw¤ðÒ°çlÉÒ—`y™çWÎü÷!ô ¤ÍmÙ% ¦ß…sj 5ÏOljöYu‚„”Áñß»]J)å¿çF+È žQþÝ–mÊÜ<5ÒKÆ +°Œ&M±zxÊó¡o91•Vè?qʬéSgÏPUþËš è±È'…^;yý]jVûJõfÿØAA† Nìï'¾µr€ÿé* \BÈ™uã: Ùx?Q©Îh‘ÑÄG–žˆ-ÓfÌä)c[9¾;¹däÊG‰<ÂpI¬{“ÓgNÛÜæõÙcw½Vdµ<ù¸ÀƒçÝJV©3ƒ±\jB 5m9yÙºU«V¯Ú° ½“XsŸ~dJÇÞ+ˆ=›ö5ëïß­„D`^ßé¢UË–¬^¶dõ²…“šXPâRÅNJh­¥ϼ j0|Þêyëðçf\~'Ãö#Òf{,þáã®LêÚ£c·î9þºö^”œëæ;íõ™Ó ü¹þß÷âûuö¡ÿýrvê¢Çªr#ù²}Fd÷פÁ-}ÍÒŸ×sÑ×—t­]ÖÙÉÙɹ¬_·¥7¢U õÞ¸Š2‘Pè8æ~2O!á|''#‰P(¬µë³šª#VùJÄ"¡PXeí½ÓSZW´Ô‘š¸5žz᳊(‚¦Usn²;Ž _TÛÊÄØÈ¢ÒØƒó+¦§_÷ðüÌÕd"¡PX®«Ÿ•D$ …rËßV½JãU¯Wÿ^Z. %¥ÛœŠ-F#œ ÐÔc› ;¦i™æKõéòâîu½íŒ¥"]3gßæã†¦ð ñb{3§w5o%ßìZZ*Š?“}ã\ôÕÙm*;ˆDF.¿=ö&m꽑±PÃiìÕ«z×+c, ;\ˆÏýzrÊ“uƒ›UvCúŽ~ IDAT*el¨'ꘔö¨Ósá™ðT! ËiªN(:>{rÆ_ù—„»½¢G-7s‘}Õ.kƒù\— ;C{—6’ …b¹‰­OÝvcv‡*0’ŠBèøÁ=%6ÞÖ䯳ˆ$ÞE¤…;õ("*üLHç²:„ðIÏ¢™ÒÞéãËóñ¬[{äö‹HjêìÛ¢wß–ú,àbom[¹åJpøçD%è–²tfl×ÙÄ'OÇ$+IÎUòÛ:“xoÑß žW˜°¸·‡^ ß®( lÁÇÞÚ8ÿj늕­¤šœ©/÷î~¦óû¼É=*è³|eƒ÷­&ï8V¯¯3ûþ䢥ÿ·?"xþ¢˜ÌlååÇlÙÆˆ„ ¨í-}Üj⣇Q*™X^±ûˆ š­VqJ¾~sñ÷)à(ÑTíûSfÝò5F´Êÿ^fgÈ”ØdƨŒ·»Gú9éEN ;0mã—æ ×µsÕ’¾\dââi¬YQýéĆó_ÊœÓÖVDÒB.ÆY·êÛ©Ž½˜€«Þ˳ýþ¹ûIå+gñ~i3 ,j/‘Cö7©‹Ä˜ü¹ñZ£|qž Ä®]PìŒb¿Îž"ô_K~¼ïjoU­r©Üo"ãzs6×%,C€Æ]ìÛh_Ùe—îõp“*ž­mWǯzØùÀ…5 ¥ågÞzQ¯“]ƒ@Í“y½-OïU«æ<˜ç)€ÀªÓÁÇåv¶©9.|÷Œý».=:8lë 3ºøû¯®eà5ñÚójìÜìy1hV9]†ahò Ç5v¶©9.|ç„õ5;LßÞõÉâ®ãc›ï»ÔwºW­uÎ+nïh#fˆ}ߣRê´þ¼ôêÌŠú,ªˆýÂé›èÔ‚èUž±¿öŠFcÿIáù·›Ú·+xrxÙ¼maõ»í­}zU[:6ÕêX;ßóÚœ¿µìÁ‰~Nu¶xQ«†Ó {O«l ¿ØÎ\À°–$e¬±mØ‚fmZ´J_túÕùùíûz>?ÒÑZD ÍÖÞ¶ÍìüÜá˪yúùô˜~úîMÛ´#«×ÜËÛ“&?Þ±á†õêεw”$?ÙйÎà-£¯] ?ww‰Ÿ¡uÛ€C0ªÕè+©< Ý1i÷!£ÇšLèð2GIfÕ­95HÅñ6­§¯Ç›¼äE¶£ÜçC½ <KËM¿rwD%CÕ›³ÓZµÞx¬ÏøÖ.!„¾Òî±È8{ÁÛ…]ºkhoóœæ šòý½·¼yY{]ÊÐ]ãF<6¨×{ò„~ Œž¬=~çë4J¸øà«áÆ ‡Mž6kâ 6åŒ2_f¦ª·GfO=À7š2¶‘]ö‰WH&’¾D²sܘݑžÆÌŸÞ¿{m‰ÿÆGI¹ž—¦åŸ†Kzu7èc©?‡M˜8y`K/Å¥ÅÃ&ì{£È\WhS»çèIÓFµóQ\Yæ¿>(…§…íQòëO"-›Ž˜ì?uxk¯”ÌU Ø:P•R©Tñÿæ0Æ"Íù:ˆ:&øÁG-g9Ë"0ôöswBx–n³üè¦i=«—Ê9O#”ˆX†BŸÀ‹,l @2Fâ"|òÛÀÃÇßèøÖwM³_¶sj@tÿ!ÕM…Ù ¥NŽJ!Bub’’fë¿ÅÇ^]¹åYZü‰ íêýѲí¹ûŸ'jUÆMz°iý]y‹¡J‹B[cxóÖ¢úüøYœ®›—™ƒ6H›aE-?>½]Pz6?ùdPÒŒ*DŸþ:ž‚©“©H>?<†@Zðòaë#‡Íì\F&ež½æ tx½rXÀKOsÿ: ˲YÏbrkG{  âÖS7©V¡f‡‰“ê >_¾øFA3×%„Ë3ÒÇ’Vs&´«Sõ÷¾‹·®â#Ó/×½£úZÀ¹Ï¢~½wú¯Îž2 x4µR)+ç^b ~©šÑ+;dÏ®î¥Y€¦þ3ºÉðŸrw[¤±çÇ8«âx=߯Lõ]šu+O€O¾4iò¹hXA枆ò¼?m?xݲ‰£§ÎìaÏÊ'_Þ£éh^h¶`ìÛ¦k7=ôÎiξ5Sý—l[Ó§¾‡aîA—ˆQ£-A·tr‘‹"Cïv}«Š€ra߈çAj]¡F¹Rš›ÖqÀŒaíZtØÎ™È* ybÒüG*5O%/Ó£×ÄåS*‹³½ÔG¯Ä«9Ê©\W$É_:ªueS!žB}‹ÈÞ޾вœ0)äi´ @qáF‚[û>œSn\ UPªŽyþ"Qâäi.&„&>ܼ/¬åÄñ~«^­^ç1þmÍ"vm{ ‰~Qªk_©F¥r•ªÖ¨`."šF”úóÅEV¿­<~f·òE_9iâÃM‡?¸öÓçJÞåêtÖÎ6îکдìã+–†RÛ 5ªT®ñ[«¡3'ÿiºcÛ“¤Œ–̹Z*¾Uk7<¤aÜ­Ëái|Q{¤c[¾z¥JÕêµ:4k•|·² £7îÝ8 ¬^ÉïÏŠ9+´:þ}•YˆÒ×›šëBì»x¥„X¦à¹kÓÂ. ˆpîÖ¿ªAzñhìùáµ~kÚvüîèš#Æþ^JH@¶îUó Ür|HÕ)D&~>«k‹:u´Ÿ´åF”Š€âõ¥'irŸßº»rþ°Æº‹†L9¥ÎÿO Ï@)ÏRbŒÔÔ\hÌù#/RŠ|ØÜ§¬©ˆe¤ÖÞ–„ÅÇ· -2Ûló¯éÕîPÕXÈ2ÂRÍWîšP^7w£™ÑÛÖ-cm( Ef-N§r 5ôi¤ŠfÏÇÔÓÉPÈ0âRîæ„@¶’„]¾ŸL)X•w³ Ãê;{—ÊRÈ-å@èÝQ>&v•šô™±ýqéQËyêà“„BßÀžšèØ—·"¼LnmöáÜ•—•]|Çu[Î<ëéîúà±ki#!TQÏÂÒdž•¬$š–ÄÚ×SwwðóHeeyú}wæÛ°ébÎÌ[Ì›¶\Ü¿¦©¨8—MUô‹7 õ‡e=-×´É(Ïó’¨TÞ½øi!@aõ\jyH޽z­ª #9>›9š’3ŸԪȢ÷H³šØ˜YoŠàÅ <ÍS 2màò·µ&­è줓1M1¨2*`Ùûˆ'·n˜Ñ‹n_Ë(îòÒ±õg´qÓe%Éʉƒš“T§Tûêö‰Õó7š ܶ¢ƒ}ZtT*”®ûgýJÆ,ë´ÀÖsöÝüò‡fêP†ŸØ,­¶¤ª©0½õƧ|ŠxŸfRýÏ*Ö‘ÿÜW¼¸vî^»ò¿[‰±A…´Cœ·!„P‰/r;=­»|:-¨¢B")ÈÌåYèX¹¹øO¯¾¨©™ X $=S=&{"ÖÇ1ý‰Ì\&„Ì#€Ø¹m/¯)£ö…öcûpÓQÃ.GíÓ;Û ízëL‘›‰ž×ð}»žúþµõǧ\Õôo«éÊlÄG¾ˆÔ„ZC¦–“O'”Ss¾<ÈÕÐ-|%úš ¶2§ûâ8¾8ÙÊ3s0°5ev‰Ì³+4îê˜ßZ­Wq¥ºî|´¨…ù­ö¶Nâ¨2I™3Â+–i¦;$õ‘^õ—°/š’H 4)©¡²Ž»ÄsÈÒ§[¯Rð\Ú»û'6<8¹qÊ„æ«/nïé$ÁØ"B¡¯õ£‹ÀšU¨fpøVØÃó×’Êô©d(6¨ô‡ëêu‡wjy'Œ³mí½[Yη™hæ3Ù¼¤ej;¿¹|xéΪsz”+Nß4^̓ÄwÈÌÞn’ŒØ‘šè Hl1Ò$ä®Y! Àqh®¡mX±8Í(y1ö(k^UÀÖ¿¢é™3l!vì¸dMƒ4žûtjÚ¤û¿Í[Ãe¤¦6:iVú$ùs¼*½ ”• V‚ÂÞÓTFõï»ôMÍIKG×1eÛ#³r-kéZ¶¼·Þ›æ ¶_î]µÖ½#·>qCš$@yއuÝ~šut^U}†aY©‰k­Î“iPSÿs‘­ôu% |‰Må `õJYéÑûŸUÔ\@(ßž¿ðQ^íoô·¬Æß^4÷´^ŸÍ3[Z‰H»N–w±déoUfWÕÇ^‹H›á«Ð!„JL׫u-½'nÜý¬ªàã!*÷øòõHój~î&N¦^~NÌô‡KŒLâàh¤iÞ1,œ*ãmN—JAœû*UÒ«Zž%B‡–}}G ܸóY·:kÏ[uU:c¶g +(ÞÓ5",ÕtÅÑé/«N Lãùð€ŽƒD¼‘KÆLM€¼ ®Sïßíž-”FXK¸W/-N¶–y·#,ì†+%xǾµš§N=†5q1§dÄQiqK"0±7ò(¤%kb‘T¢Ìq[RªñâÛŸ†žôUkîh¨©<åûk—>êTúÝE7cïÔq!¯¥¶†"†a[gQÊÇÉ<ž6#À챈B¨¤—“ÓFzÂ…ksN1äêù{QO× lé&ýk ¶,Y³ø†S¯?Je‹%ò©Ñ‘IÅŒû1z>ïÛÑ¡Kx.>Û|ǻڕô€ÏÏ>«5ã> ø°õê÷ÚÿNEÄÂôæbšŠrQ·ì¹ü^Yäž•mqñ)1É@@­PªLŒK+ÙÑ–ØÕ*'%¢^F*)¤} ‰Îv°RnòûkGœuõ¶#l¿|{‚ ˠɱÉjœ!„Ð×Ó‚[V¡uŠú±Wö=Vmî-gcP©…¯ðÙÁ³‘FÕ*YhÆU!²òÝ[–þ¸oÆì=—n^Ü1wú®Öm:W(ô)#±úmŒ+‹'ë¦î~‘Ìqéd |»ýi}lºÀ‰Ë·îÞ¼zzÿñg VÏBÑ®Üy›Lõ H1×wm;qõÆÍóÛæNÝõÞ¸q;ý‚_/ø{TP i½…}Ú÷^›kH™â}ò¼h™íef’õÔµM;·„³fm?{éÔ¦És¯©|:6·/øõ .êÜÚCš7²ŠòüÅËç!áÑiRžï ØqèÜ?·oœÞ³dô¢GLÙ¾&ÜÒÁÁÞÑÁÁÑÁÁÑÁÊP@¤Æ¥íÍuXÕ‡³›¶ì;}åúí§÷-=çŽÊå÷jæB9´hçA.™¶íÒÝû×Ï\÷\þ[×J† šôŽ–ò²–d֥д|Ó¤3ËV |òôñÍýËVÜP”®VÖgÂCÚ~oˆ B•œÔkÌ¡mÝ$«5ñ?þ4ZÁÐä×§g·m¾FÐ}¥u}†ˆ=†,éaýbÑ„í/RyJSžm·ì¥MÿŽ]4¯"‹íëÖ0Jº¸ñì{åb×o)þ4B37sˆ|ú6E}vÄ_C¿/,ÐÆ”úcÀo’;fÜ(ÛËÏ$ëMÅ£)•¬­]û\Œ+^û–­Z¬::¥RúH™ë“†sf×”0bN[s+ZÉ«cî®6ùмne3FnïjH>< ‹zºe`÷éWc¸"c¨Ee[ì#åR߇% üð΋ϟ™?÷†ºd zÆìÏé#<†@ìÑ[n…½ººfÎÉxžU§&§¨ÔЍgÇÆŽÜø –'¬:öíÇd zuþòÔáB}=mè #v¨U^¨i½Æî:éÃõÉ<šÔ10¨XÝ:³ÿžØ©Ó¬ÝÝ"O®š4uå±O®=çÌêì\ä¸ Œ^™ã;Ú¾Ù»dïë´¢®ÒÒ2=Ìïæv{Çœ)“'-Þvöé‡d€5«Óó/¯”3뎽QRIþi4'ÝÛ·ÌÚÊÃoK·ž4·wÝB‹÷/ö¨€åÕÇý›‡Ž„-66]\Ó([»Hd×fÎÒž®ï,·ðx¬wÿUÓY‰ .kÚÛ;¡jîÅÆá}ûvïÕ»[¯ÞÝzü½-T¡N‹ÿüììÚY‡?wç}qýa+g´´Ë5›A]]ØÛùÕÞ':ºyõ¿©æï.W¶ç…è° –ùmÙ[.f{3÷šÓ&óB§n³U|>°¼£Ïˆ¸ŽsÚ¿í]&=½¥có]¹âŒÄ´NÿF20jܧ¦Q¶jX™½©­¡0ÏÎ%œm¥//;18úxSs‰÷¼çŠô6>#+?úÀ¶¶æ¹Æ¹9ö9þøð”6UmBgÖ¶”›–®Øï²çÂó[:ØŠ èV™´l@-;ó~e]çz¦Cç×=QŬÁîXŽ@Ä_ÏQg6×µêxM3„bÐóŽçã9ZH¶ê…åLþÈÊÁ@üÛᎂ*÷ò:{c¬:­_ß§²¥˜¼Z׿Ä{e{øiº¾žY^ßoÁx/ã?Š,‰Ô{Ò…« ;Vu`Ϩ[µÉ¬È?»8†¨/tp¨4ë¥avœžÍüÝN_W¬çÐîx4²æÜæv¥EØÈ@!ô š))¥”Ržç9ŽS«Õ*•*---555%%%111!!!...66666ÖÒÒ²Q£Fßø^—òO0ÙÆfÎgPÊSͨЄ0$sN5Êó<…œ«g[B)Ïó@&o‰òOsn˜ò”¦OM2ס”ç³æ“F¾±ïÀSæoîç*ÑL"C27—«x”çøÌÿŠ·GyVÉ]BÊó¼f"–’Öý½‡·jU¯[̪©ÐÔ&É[— Ë’ìG0ç·aBy>k`ï;VY5”7}¶òä8¼ykV­fåÄ`Ti¹¸øØ×a¯œÝ0¼øÍ={¶mÛ¶X±¡Ý»wׯ__s6x÷îÝWæfmm]œóODD„¡¡¡¡¡¡\.—Éd:::R©T, …B@À²læôzšV:Çq*•J¡Phçñññ©©©~~~EÇ4í±ìíÆœ ¯íµ ," ”2 ¾B!ôÿ 11+!„úý÷QEÀÀ"’JtŸ½öp/Ëâ ÎK¶Y3–@¶…4#]޳-¤ÅÙ Ïó!¡/tuõ°C1B!í¿©@!„Ð/ÚðÀ*øÅ9;º¼zýòÊ?°*Ò6F†ÆÖ–6X!„B!„´ùo€@èê\ë!mD€vWD!„B!¤¥0°ˆ_´D!„B!„B%…Sv „B!„B!„J ‹!„B!„B¡ÃÀ"B!„B?µZ•€B¡‹!„Býd*!„BZÐ&Á*øÅ©TÊë7/ÇÅÅR Xi›Òvå}*ãôJ!„B!„´u7n]“ÉôkT«ƒUPIP 4ÿåYÿÐü—ÓõÀkOžy–ñÆØ"B!„B!-„Å_]bbBõ*µ_ŠGHëøxUxüë!„B!„vÂÀ⯎ …Ø !-IJ,ýB!„Bi- ,þê!XDH;1 aY«Cy>÷Nö,hl*ȧ0ôë‚‚<ÿƒ‚ж@H›á/ô;‘H$X !< „B}¥Xä?Æ(¹¸s«´ZÝÙYœ~͹¶fO˜ZmÌS ÿòÎZhÙxÌÜF„aJ´:c\}ðtëD5€2üà‚5Ï=ŒlRZL+s³ÿ·øØc!­E°Çâwãîî~ôèQ…BAàƒ„Ð&‘HÜÝÝñL‹¾‡´Mý;L<Ë6Y°{i[;æÕBß²ãƒ9ž€íß·ƒfz|X\9ç]¿Š!„~>ÚXŒ§ÙûÛO«e,  x¾Û=0“BÒ—5€€|dÝÚ#·_DRSgß½û¶ôÈêáoÈa¯"9[ï]v®l*"Êð͆œ©0os_×Ü£U±­]{äNhcêZ£Ã€^ uÓs#B3g/S…ôšÂ-ÜË•w— ê¸{ó¬Uœœùè«ko½úáK’R$·v­ÖºW·Nz™å¹0«ãÙ˜µ®™‹o»ý;鲤à]æ¢.¯Z¸åVØç˜d%ɹJ~[gï-ú{Áó ÷öÐËÓ^ÁÆ4BÚ ¡ß‰©©©‰‰ ÖBO³%¦çUyQÇð¹õЛOæUø±12uøŠªn#ƒ4A»|TÙüöR Á÷,bÚ«ó¶?ø¨âæÕbƒÓ𻟼;Ù7ØÇQ5O„y– „B?¥Þ[KŒJÛ¦ÿй³õD˜’RþËõ§âËuïPAW›¢eè®q#Ôë=yB¿FOÖŽ¿óuZfGuªØ«ùÿq}˜‡îš6zý³ÍÕ™rÇCž uZÈÎqcvGzv3zÿ:ìµ%þ%q4{“du"éK”E¬UHÎ\Ò«»AKý9lÂÄÉ[z).-6aßEæºB›Ú=GOš6ªâÊ2ÿõA)<-d—¹äמDZ61ÙêðÖ^)™«´_T¥T*Uù7ÿ°Ç"BÚ|»‹w¼ß»zB¿8<–åEþ÷c’SRSd«Ì IDATSÍp£¼£ÿ½ôƒç–ÓÕ’BêVYzíAPУt÷Žò¤<§V«Õj÷ßÊȾwXTº~so !zUZÕ0BVÀ戶æ]‚BýŒ~tEšŸÆèYUhÛÆuÀÎÝ›÷Õ ?¾'Höû’š¥/îåƒcÓx’øpó¾³–‹Çwp’2¤z»´~Ãvm{ÐÔ¿²>Wï剛”!Õ}ù~Ãíê0¹ŠAAÛL|¸éð×>}þ0ð0 ì½÷ThOooBš—®åN‹•†RÛ 5ª¸I™ÊÕªº0}ÇïØö¤ñø 29W«SÅMÊ@9ówFüs9¼·ÍãÂv™RÛòÕ+¹IH¥ò–‘÷FjVyTÀ~U½q/&ߦ Î V¿0ôBH»®LbS;;™ŽP 0„  Œ@ c;;•øÇË 'Ww7MóWùryÿ¥yž*ÍÙ6ÒKç{Gôˆ¼êÌ›ŸG%¹T€áC„BÿÇ~ô-+¯ˆK¡±…_×äú®«bïï<åÞ¶©³®®‘”&Ǧpª¨gai2ÏJV†!„‰µ¯§nZÄóHeFoDÂh;3bk_wÝ´w!Ñ*(èUô‹7 uð²žþlR¿q“†½6…q‰ï£RùBKZœµŠJCB«çRËC’òúE´*«ñ¡ùHlæhJ’?'¨U‘EírFOJ±yÆ*Qm0 [ÐQ†a°·BÚ‰! ö)F!¤]Än#Žìíí ɯi)°é²ëÈ(O†¾¾¤kí²ÎNÎNÎeýº-½­¢ÀÚÝÌZ" …RÛÖÇ¿pÒžÎð”:½ŸÌSH{2»†¥žH(4©¹àÑó•¾±H(VY{ïô”Ö-u¤&n§^ø¬*ú­aM÷“6ÿfÈjš¹©vúûŸTŽHüo\6c$àã‚¶ŽhZÙµ”L$Ò3wªØpPÀíhu¶ ˜ ál+}‰H˜ÁÕ?(…WE¬J/³P(ŠÄRss}©ËøÉ%xÓYõéòâîu½íŒ¥"]3gßæã†¦à‹Ò!„´Øî±È¥Æ*@"³DæÝ¦I©{×mлMªM¯e.ÄèK!5&™£TIˇ ùyŽ`>äÕ¹ÿ…2TuìõdO©Ç˜³'krØw¬» ùàãò;ÛÔ¾{ÆþÆ]—¶uP]üý‚W×ÒtD¤ŠØ/œ¾‰n>Ù¬2Ò„Àé§l}„ã°™ËÈ„¡Ì³×œ¯W x©à)WéTCüñäñ0PP¿?{8ÎÉ€†8¡¤”¨#N]ÒkQÇJÌ¡ÜÚÑÞB‡@‚¸õ”ÁMªU¨Ùa⤺‚Ï—/¾QP ŠGS+•²rîu!¶È{q\‡…ÏT0j½~M»Œø¿2¡ï¶·J5¯ßp@3g¹Ì¡q¿¦&@¹Ï{û=ÿEM OÃ12¯nC õº‹‘Å“­‡ióî „Â1~"=?nĉXÇëù6®`ªïÒ¬[y|ò¥I“ÏEsØk!„vúÑ=ù´¤"0Æ5zvyt8¾Z#1C:RFŸ ¤@då»·,Ýόْ. ìáõù­»>Xw[AžK~óðÖ½Tiêû»Ç¶޶ë:Õ+÷ôǬž…¢\¹óÖªºo·?-†žîÏtøÓÇB’ý>Áö÷†nr¶°«?cPÐZÅÈb®ïÚfS×ÓDzaû®÷ÆÍ†ûè3¸â EírñK(K¾_È¬ÐØc!m†¡ÿïD¥R^¿y9..–Þ©!ôë²)mWÞ§2ži¿që>æÞéçœAûª¥Åéó JìkùèÎpÍ¡ð.ÝÃÖžÕïtÚUú/¿OªÈ‘šïsÈÔròé€rjŽÀ—篹rì€BH ýèÀ¢n¥¹GŽfÍWLH¶†ÄgÌž³ŸÖÈû¯Ñ+[Ršž,=ú¬©ßàyµeÎh’í#‘m· G»¦ç@ Êu[¸¥ % Ë` }ZZöÕ´a˜|Z$’2ƒ·M_€ò]«9+ *ô\ÔÏUB4Ñ‚Œ æ($ƒÚ‹ÕLÿ¯ ].d•|K(¬0rý.Í4-ùF.ðg€úÕ$&&T¯R»l#ô‹óñªð$ø!Ö÷%4q2%ðòsbÖCm.12ˆƒ£‘¦'"kQ§ƒ Ùsþ‰Å™ÏÕǹ8 [:øÏÛy9X}0©Þ<{I®ÖiAmU°‚‚OãÊÐ Ýû‹Qóà:jût?ãœãŽ‹ÌÜÍáDPHKTò|Z’BSf3Ws1)2l›÷«6²Ï?<°ë–åƒ+¥ºNqÿÛÖµÐÔÙÈ à:õþÑîÙzVÀb›!„VúÑÅB‡Îõ! aóMưeý’#?’§+Iáò_«˜9†a˜<ÏTs?OVl‘{\äÖ ®! ,"¤Å2 úºº%  ñˆÐ/ŽeY|ÀðÍ1Æ~w&·î¾SÕvg H{s=(‰z6ð2H¯luý¶ž0võ¼PqŽ»‘¸4kZzÖÊ¥sãT5W:¿¿ŸÍšéåÓÎU/ë2ìR’šï©;&V5È+&ßÑly¹õ›;8Ô¯m¼0<hÔ«H%õ‚*êU40¨õ‡£”H‹H@€µjÔßOt㼂{±dà(b7q±­è_O²"±«]IoÙÛx ŸŸ}V³e,P†¬éÔ'°ÕÖ€6¥…xÑB!¤…X!„~5„ ,"„†°,6†¿5±Ç%=65^4a{ó=ܤŠç[Æ-{iÓÿ\oqFÈMhÛ°µË˜É‡ž·=UV! qoÕÐ|ÉÚCïz^v×)î©YñhJ%ß9±OÔ1ÈÌKy8·ãø[i—ÁÓ[êGG„IO‘ô2èÁÓRi”èûÍZÝöt›]ŸbO®>Qµ¥èlÀÑHžÃæËçþn" E&Ð|‰,êøCçâÑD.îÙç:[Y ÿ}¨š˜4œ3»æÉAWRcN[3ÐgDäûk†M¾"Ÿ?ÏL€W,„BÚ ÛRÿ‰œ//#„úÑÑF ``!<`Å/ùæ°­¶=ýÄñ0µºíŽÖ{n®ñÓgcTÅ­sÎ#'µöž“FA\ªÊ˜‹7×0Ê9þÙÂ~òò²íËË:žmë­;^¿mÙÌ1ÈãÏtòí|(DÍÃàre¯ïýÇ?¼[Ý¿O¿å¸íÍÜ_ý}òÜÄ22{S¹¡0wɸ˜Û'ƒ¹ô¹¢CV´ðY™ýSÊsnJµØüø†ß”É«O ÷6ìNe–µ{ŽŸ2½Wus͘ŠE& Ƶû5Ö?¾'†“Ôïÿ[)UÈBß²ãi"› | 7_n4¿Þ¤'….ÙñþBÇ>Ç[/?{ǵ™µ-§ÈM,í«¶^x~\;[1^°Bi)¢RJ)åyžã8µZ­R©ÒÒÒRSSSRRâââbccccc---5j„7cÿ7îÝ®U½.P„´P\\lhxˆ³ƒþB¿¹³Ž7oÒ+¡_\ttä“g+–KŸúÝ»w_™¡µµuÑ石g#"" är¹L&ÓÑÑ‘J¥b±X( Í;Úš)¼4­tŽãT*•B¡Ð4ÎãããSSSýüü~èyŒò\FôN34Oö'è”Ïú HÞ§ë”ç8²F¤¼šãsŒ$H9ŽKŸ¤‡–ehÖÖ4Ód‘ïä-<§æ ™Õ'[a)Ïó”fOžgäõ"dM±’UüU„e _ä’ôµ)ÏñÔ ™Îàå !„ÐWÙ¶yƒ‡‡§H,fÙ"¦-¾{û–µ­ƒD*Õ××—Édººº‰D(²,[Ð䢨c¥×#ô+âã?r_ÿ÷µJ‰~±[BrŸôî_¨ß¤ÇoVß¿*øøGÇ›6ü«j©ôñ²ò.ùpQ–-8_ªïä¶yfZøqßé¢k’{xp÷u¬ÿU µéñS~3K#6_s*-lò”ÂÆQÏoeÂre–û=u’{k…l¿Ði]re°_—€°AÑUSœ%Ū:„BH»ZSX¿8©D÷Ù‹`Ml!T $Èy[J5øì<ÏóÆÈ4ñ3FjfieeªÃv¡T›kqk’ò%+÷Wô—PÛê“ÆÝß³.àȵ ÷ɬÜʧ~—‘½³“2ÀGëÝvɳÌ÷9[ìä!eŸ´sá⃷B’e®ÕÚŽÞ¢ŒœU¿ÝÕ­ëú°/‚Ï”C+ý šOz|É–ó‰Oö.Y¹ûÆ‹(Ö£Fû‘ƒ»è1¤àræ{6 ”F}‰ŠOŒW«ÕE·¤Y¾\ßÔØ”!„ú5a`ñ—ÿ„®Îe°ÒFx§jîn#R½xòYUSŸ% -tóä…܆Îìê"%@üV¡ãéjøUçy>îîâñË/éT騻½£žêË»WŒ¾”`-™Ûˆ¤4Ey^»"LE)þø<ÏS …/) .êæÉ§âr³ÊÊ2"Ky—üW¸˜ ÛeµFuùÃK—!@ˆ:\Óß„ÖÍü—5%äç™uì;Öä×ôÿ¢„ß·>™d.‰uo2à¯Ò2Å‹S«¶Î«ç°¹›£„!\jB 5m9yÂæB€‘˜8ˆª7ûÇ øP±ãÀ‰foŽ®[9À_ºk~£Ræõý—–IåÓóÿpnþ´ãò*vRBToöå“ÞR¨Î7Ÿ—“O‡Ç\ö©êÀq½•v.]Ô/FºwV=SAAåÔtXÌ}d£c¢Õœºž_=¹L^d¸0!1!ðv`Ô—(3³_çê$•J‹uE!„Ð,55U ø¯}XD€ÏØúIl¼­ÉgI¼‹„H ;wêQDTø™6Îeuá“"žE3¥½KkF¿SÅ>8´ví‘;¡qŒ©kz5tÔÕô½Š¿·aD°W‘œ­wƒ®;W6ÍÞ¿QõáöÉߘ¡]}4uþF0„€2|ó€!g*ÌÛÜ×Uo¶ôk´•€×¸ jÈu>[dï-þ{Á³ ÷öÐû¡‘•|Ï{_ÎLnyâK¼ZÏÜ­j—მ¹¤wO èî·@ÓµÊ7Ï’šÊË+æløçÕ»¨D¥ÈÀ¦Lúüé"c Є۳ÌzZyÚê‘$.êÚÉç’òÓ½äYqÅŒ%Š{3; j°~k_7 C’ïOj;êM÷më[Z ÿå̰æ Õ=ß}×xÿO òß=÷7£Œ~¥\Jl2?5¬þi¥»mÜà—­:”¯ºõ>^yÙîÁet|â“C+—í¿ü!‘5tk=cÁ@ç¬p Ÿ´rÐ߇ ûÌmå Œ½¹aQÀÅÇá «4jíÂÆÙèË›‡.Cãƒö¯X¾ÿÆÓÏÔÌ­j›ƒÛ–5` y~ÉÌõ×C?~IV‚ŽeùÆík0·O½õ*–:Vo?bL+wyf/ÙìuËE]\>;߃Rà±&|ÅÈû5ð3(°Ì4õõÉUs6¥ óšÎh’1˜cŽs×ToN¾þîÇdN oS©ù€±]|M ßAUÌÝ=Ë—¸Ëš¹×î6|@çz³´Œ¼b÷4?›*NÉ×o.~ø6%|Jl2cTÆÛÝ#ý{EH}¹w÷3ßçMîQAŸå+ü½óŽ¢hãøÌî^Mî.½‘^Zè½IèR•‚Št¤‰ R_Št”Ž4é¡‹"„ÞAH …ôv¹ÛÝyÿØä¸\I$&äù~üàevvv晹™g7%æãYÛ>k=ÒÏÎ?ÈVx2{tã©Ä_üØÛCŒ³ï›ŽïY¬ð¡âS{îà&ßÝ»±C|©{Ýçì8þªÙw±é| ½I3°JJZJëæ­­TVEéLTJUƒz N;U©&-¦§§Ã( å²WAX¨¨PV~6èÔu¬yvöb²µ—UÒ?'#‡ɱ&æÚKÞ±ƒ—Få<Þ1uÊAy—áS>w̸²sÕÿfRUÖŽ‘„›-©Ù{t?ÛœOïØùÝäœE?^M®ýO|ìæÉˆWÕ[¸I)¤·Ÿ$á8Ž;‰Ë¾Ó´™íE˜’;[PØôƒÑh4-ÿß[ÏÔŒE±G«Ïû…Øj£Ïm[»p2ã¾}b !„ºÏþ¾ƒ³cË*¹ò`¾>êñ¥¯\>2&@–õâÒþ­?Žü7í×e¼¤­6G£}»ð“‹ûûÈ#ièü@ÝJX½¹_Ӫ̉[SøªNTΫ«wÓÙÄËO3º;[ãìÈK‘œ×ˆ.ÿþcÎûDd8UŽ([L^ÐÏWбÌÞE’_`\TÆÈmãGnL¬×oøÜšö(%Eå,Ñ5’µoöôßø.Kfuõ–b¬I¹söïg¶ý'lÅgÐ~¶ÌÛGšL'çñæq£MkôÙ—?øáÇÇ7¬øj|ö†Uƒ}¥—yåvœëÀo'W—&ÝÚ¹|Çâë.mþö3‹Ä¿6-ûy–mà–±Õe¹š­¾mµéæ*›«kKí“-f²Œ›ÙÌMBasñË‹þ™wJ‘Ù¨ÄÂ^¸ Ÿ`g´óaœ†¸‰MæSÐIÊ#„Z!½éá,Ë*•Ê¢÷'*•ª²MßûO^Z(§Ž˜ B"r©å):ðøþmMKuúbZÕ¾[„ÏØ~&rT`8éá£t©o£c’~óׯF¬ÑÞA„Q cÒ¥á»E ®†B¶û ì\UFáÆ¡~üçc÷ÿv«ß¬ºiZ´S»©cÿµrÉàË»CÛ†uëÒ¶N™Émæ¤6n>>nbŒ0Æ$ýªé'×™üËn‚(ú¿^j|*4BHЬm“êr ×q~uiô¹“ϲk{#„ÌÖ#ÀßC(Ê2 Ñ „ˆÜ+´yãêrªQ³ÆÕèÏÆmúåV×9¡JeèŒGÖ•—}}áØ#Yèð@ež*§‚Õ[ÐK.ü›ÑÅQ‘tûj<¢´ÿ‰Êndż¼x;Û£G-¯’ªï!Ć1´¼ÈÚÝßßO†ÆX›fÚ\$ýÚÚíOzÿüý°ªÂÌU„1Ö`„ÒÆžüiÕ²¨†s~YÏ:ob"!¾ š7”Sùf‡šL¥G¬Ûṉ̃ϪYƒ,(Ü´žgÎÀQ[7^ë1¿‘5l[·Q½@9â{~ÀN=Ã(("»q~ê嫱Úê^Ó¶5S)f꺖ç­³‘¯ÒIúes‘eéqI¼EÓÐÆõk*i¬W~“9,´h”·qk_„BÕí^žvôú«œF*¹ù*2¯­Ûý²Ú—Û¾ìè$Â(È9ñ¯Û?þ¼vmKãét\qr›|j|×y·´gÝzæOí„Y¨„Í ÉÃù»ý€$žÍú~5¦_C{›“BÁVâܯ›ÄÞÑ݉NÕ{AXd_Ÿ\w*§þ”äFÈ\|µGñÂqãÚ5,öÞy²«{Ç%››’C²ÓÔœ¹| ŠtÒýë¨)2Øvs8 b‚å^µ«à×7þÍä²þ=y>Í?¬¾£|2/žxÅeDވƞõÜ¥#í›G/Ôì½åCÃ:unÛ±s‡a¿>ãÒcò6:ù]S×Ðj9Ñßhõ7“»µ»nçú…Ÿ7¶x°cÚðÁ·?H7u ðÛC²QOÄEÓå`{9ãã½SÈœüQFl/„c c½ÁM† ”{/£¬Úª¦<óɃ7,B˜¢†¡óžÅÅ?) «¡Ì»3mS³•{ïÂÓl>íÎ_±>ÖTß¼ôZËÆ]¿œäؤžƒÔö}#ˆK(Œ±^Y0FúW1ÆX÷‰ZÒÀ¦õOGG%þ1÷ÇÓôÇsƶr’è ª³±Á9ê&ÓÑÆß‹ÌQ7pi¹g£Kõ³û ZÝY!)‰· ÊINÑbŠ¢(™½» e$eñBlk¾RL×µ6®lèWzy–ú}<°Žöð„ÏF|¿ùä£T^Wx³9,¸hlü¥-3Fõi×¶U“Î_ïˆá²ÒrHÔ&`m$—§&Ø2ÿ¢æcʪÁ¤õËš3*ÌæÂ÷Ã\H䯔UÓYûûûÄÞMsû9ÞÜ4iúžgšÜÍañÛº§ò÷ÚçG÷Þ“5êÛÐ^”k ÓñówQ…‡Sªãgöõ½»lH×v[†u›¶'†W8*Dæò‰0¦¸7w¯Ä‘еG,@yf,TPh‡:\Ö¸ü,ÑúÔ…Œê#êYK¬êµX½îÀ=®<ãïcÛš­Ú\]“²a¢ÒÍE–yõYô[È?~Û±sÖÈ{†,_öY€… Ρ¹¢i_ì›2}Szë/fŽ®aG¢öÏ™¶ÐVDZ<‘5œ´èË@¹nA¹ƒ™º‘#·”¢J@ —€µƒ-_t[´íÜðÆ8siõ IDAT;3S4Ì. Ù§³È­.3O^Šïõ‰ÊE…3ãRµ¹¦Êy“‰¬ªX它ּ½ÝÄlÜ?±Þ+;Z­æïÎ¥¤$—Äy—”$înžµCê°"OäÒ ‘ýŽÓ'¥Dpu'Ô¶¢1mÚµæÚE{Zħ¹|TËN„BŒ­OQÎóçÈ©½§œÒKN“/e’ýôïûY_;‘‰gaŒ1méß Øz×‰Ç ,qÑ»FKb”•’Í‘\­ÅìË E]çHKT”™ô¶h&B мº|/]äêg/6¸¬9wâ©eý1Õt+RCDn­Â¼6íÝ$ö޼ÁWg‹–Î+O=€žÙ·ï#Ÿ"£Ñ@là&úíæåu°¿<2Ÿnó'מÿÅ¢I³œ7-è‘·‡¡iL¦#v¨æ)Ù~ëò+u°Ÿc¤‰¾t+]ì^ÍQ‚1[Ä:4¶¤ùJáÌäÍ¡º§d‡élh +½ <#ŒKφ½&×oßjÉ 1{÷?ì9¥¶%[HÍMýòêcÖwì®MœE˜SÞVás¨ŠìýÝDê§O±s'o \h{Ǹ8¹Å#D‰Ä4&jŽ7Ü1…(LxŽG´}õZÖ9gþz’Ѱ¶£Ô{ç§óNCÒÄ\8óZ^w‚¿E^êŒ­éø’b†Ó!LQ4¥°sb"÷þp0Ϊí¤P«|s¤õó‰öõų±ÒÃ…ÐùÙº}³›«[óf-uv<ÿçÙ¨QŸöÿÌä¦ • +;/_P(TMµS@q Èô¬µ|AzÞE¸ÿûÒ…»÷oU6« ˆ\›ÔUí=¶'QÙzQ°’Âa«zÝCE3çl?©ç$ì@FY…êäôõ¹3©~Bœ¤9obÒ<Úu¨*l6—ùâæåkٲ옫‡·xã9pNMýóšÕÿî\|XíSÕÓÕÞ§=ÿ{ß±D¦Zƒ‰oŒ}ø÷3;öUëäMÓ¶©fú‰ŠÌëåäTè‚g,êYر¦Ÿô·ðM¿õð%oÒœšt¨nâOB‰ç7oôlb¯ù÷ᛢízN­cEa’ñÃèy÷ê·æËš 6æô‰ʆ_Wש)£„˜*-ºû®[²é’CŸÁž‘¸Yû*k×îäO÷TÁ÷Œ/KFÅ¥-m-QÚ¿×ÿ}â ?ϺÁÈ.ÃvLù† êì,Íz“åÙ¢»Ðªi©[‡Y󣇹bê–ª†V·4øJè?Ñd:>õ>ïí1pëô9²a}ñãc6Ǹ šSOUtEÚ”%ÍU 2#,b¥ùl7ƒ ³‘µ±\â=|ìeÚ×מf ;KÚl EâXoÞóëïÊv5Üdñ/3òõ:& HY7ÑÝyÄžé“©AÝëºÈÔ /Ó<Ã:ªL ]ÔÜf=ܵýšØÓÃYE¥<»´gãmªÆ¡v Ö¾ ßv2ÕÙÓÅF”ñûÆ+ZÿáEXðIŸªVÏŸï<¢½}ÌU´!ºyI)Œ"™ÏoÅçž®z:·ÌL|q1Ã1Ÿýðá‹WO®Ú·ÿÒkïþËG×VÑ™É'ÒD]8#ì€ ¬×*nW®F°,ÛºU[Œñ™³§®]¿Z»VÝ‚åH€J‹•ôô´Æ šõ€2$¤f»÷n,;x7«mq쌴uÇj¹À°"°sK« ‡¸º]uSædÕ‡,Zhµnã‰í?Hã¤VÞ ‡4n_UI[x…T·ýgÏü™jN¤rñoøÕÒAa^2½î€ç(•eÊ_ûÖïMÊAH¤ph5úû9‰°Vïš²j0rL§¿ìøivŽÌ¡^¿ªÍ«y˜|¢Žå8]Ô‹”u“1»Ï]½ù»)j™cƒAÕÛy†ø#„%͸²}áöxÎÊ3¸ÿü ÃkXPDx–Ê«‰>sì¥²ÑøÝ0ã„¢šu \ºðM»ÖžRŒ)ç¦|Ö.Óvlï.ÉUbß/‚~–LצÉè~'gïúnyð¶ïjêÇ‘Žüy…õŠÕ7ÌØ™ÎK]Z­ÝÒíí}Šƒ¾|ù³_ÚÞbípOƒÄõŸh*gÿ!KWZ¬X¹ï㉽èèecúÈŠ®<›¶¤™J1Ôl6°‰f`.²:ñáé­{o&¨ ‘ÙWk1nV_)¥}f:‡…"öê=oB‚M¿Î:¡F‰ŽAn Bh¦€òŸ¯Za³bÍá_çìMe¥Ö¾MG5ï¨2uè’¶h¹åsRã„ÿ±#*…E2×jmÇþ<´³§£uâÓ¿wìø5AMÄVÎÍF/ÞÝGŠ1{~òã2ÍÂeûOÍ´ôo0jÕİ*b!5MìÝh^YËW©Ÿ!sñ‹žugå¤ ØÑ·F£Q ûw¬ã,qϛΧöé™Ó1–]Ý ®–Í[r{ãæu¡ë¸~ãZpÍ–-ZÁ/!,ìD!„ð<Ïq˲Z­6''';;;+++===---%%%99999ÙÅÅ%,, |©†£Ç÷wêÐ*Ê!)©ÉwîÞhÔ yAßPÂs]€ç8½ã› Ïñy…3.Zþí³5Ÿ>ºr÷×ÕdÂá'oËGxŽ'˜¢)íãõ?=TsÅŽ)uÂEQH¾ Ôå…ðO(ZºÙ{Eп–?ž^EbŠ‹ê_%„'yÍÅ8!<Ï›¼±Ðtîv£vh\”¯X¦m‹æi*Ÿ®ÍeÃl 7YÿK•n²®‹R4l`®·O/¨€†F6ê ò5¶¢æÖtW‘ÿ9ùm¦gŸ<“™l…Æ/N¸Ðý ÇÄäkœOÍãõ?=0æÛƒª ½Att4BèÁãŸôøD¿ „œ>sòÆÍë„àZmZ·3øEv×¾]U}«bŒ]]] íÂÃ㢢¬­­­­­­¬¬”J¥B¡Ëå2™L"‘ˆD"†ahšÖ}$xéÇiµZµZ-8ç©©©ÙÙÙ-Z´€BÙºic``X"¡iºà˜W#.»zxKe2•J¥P(,,,¤R©H$¢iZïœÆ|ÀŒÅÊÆX$W åŠÂ4]X/-œœPXPî»46¾›¢ ë#Ìì‘hp«‰”LÝZøˬë3´6M›±¡qžM•S¦¼ÎKG~òµªñäjo×A…˜©ÀBk¸˜òÍÄ­º²^Ř´ÙÇà·aóÆ4™ŽÁíE,‰yÛ±R )EáM×td㈦sX„¢™7W4u›öòyl¦Á2pL«\½œåt‘rkú›[`îÌÓœÍÆ/N¸ù¸FùÔD…Ÿ|­¬?Ú]Z¤m/[·jkmmC©]«¬óÐÂ"(Ã0 ,@ùüzÂëë‡Aγ“ᱪæ½=±Ä8()ÛBáS/̶ègpT¹´Ù¢½?†æ›1[yZ¦PÒ†_ûHqtQâcŒkתƒŠ¾‘@å„ÅÊÈPnÁcø†–Ä^#vœ^ÀjS„$þŸÿ~v¤~ãàÝ0mÉ"TÊœÃÒouùÆzÛ°õ§?2ÞYÓ8ÊÓ2…’¦e¤?{VÔ¢‚¤` ‹ÅM8ÿˆK.Ævt“¼ƒoɧÜ>üûåGŸ¶p—×c- üBÁ{l)ö~¸„dL3T±£á&à=Ì_žì[*y)n¢EŽ_yZ&¦ QÎvx/@X,|ê½ ßlÚ“'½Ãë(›rõÐþuõkîŒÊX3 ¿÷b˜ SzB À„sL3iii*•ªˆñÓÒÒõÎÁukF<Š'ö~¡Ý‡ì¨¢1B\¹U‹7_z—œ¥A2çàö7¤®‡Ÿ¹ú4Y{5èùå¸.þ AÔ&ߨ¿víÁ+‘)”}@“~£‡uð±ÈU ±ÈÁ¯¦=B©e$è¹SµZµ«I1B³)7vÝe7“)óoþ\»tË?‘¯34b¥k@£^Ã}äk©Ó)“NÏïž”ÆZ8ø‡öýyG_ VÌËÏâ’258ÿ-¦žN¥_[2qÑÃ:Óפжï:ÈPžohi ~Œ(À¯:Ø*}'‹°Ñ&‹c;{[{è¨ ·*¹àµZ­VÃçºeZV·4Y¹sê„í¡}‡Ïò¦žžÚ²vò4õŠ%¼%˜Ë|zãn|•~“ÆH’îì]³wÅ-§–ýûOêk‘tiûêõómª­ ¥pÎãS§”w>åsÇŒ+;Wýo&UeíèEžÐ—ë æý/÷£™»$ú™6'ãÉÕ[¯ûŒýÜW–}åÈÎ¥c§¯ú©·‡Tx¢È½ùÐ^AÖÚWíúuùLÆuÃWµ,اÓ¥ïø¯üdé/.ìÙ’w‹ö‰©§#¢Õh4ÚbL÷„‹P~_xaÆb)›Œtïå5 [ÚB!<ÏsDz¬V«ÍÉÉÉÎÎÎÊÊJOOOKKKIIINNNNNvqq +Ag‹ð(Zz^!<Ï,̾#ÂGá”TÂó[fçéP»U·Þ½{u¨[EVRó!HêõË÷=Ë&¿¾ãYR¸Œ̸0Ä·í¶D³z“×”+7¿ –˜‘︫±Á¼>ڕ–'¦B*$fŒƒÎu:Žš9ch ._õnˆê£ýqׄÖüö>ÇcŽ€¬@å¡´„Å·nx¸{4mÒ´RiJ¹rýʫׯ\œ]À  B½7 ‡§LŒ˜vcÕ¨þvÿ«åìÂæ­^Þ«±¿eêýã+'™Ô{ÙìÇ¢v´QÑ%Ò¨øô«æ.¸Êñ¤QÐÈOƒ,©²JвÉúè”o×4öÿúÇEÏc϶µÎ+SÆŸƒ‚¾(Š…)š¡óibÆ!‘üƱê{âñÚ1Ç °üæéu_ýãÆÁˆÕaŽ .Gõn\74ÃÀr@*#¥%,¦¦¥z¸{hY-©L¿ÖPU3¨æåˆËÎNÎþ4¤R½`ðÁ½7 g`08<¥÷zï°öã~£åH­…gvŽ­jASÛ7¸ø€]jÍnûXž/¹‡Äžçy—P+-j‚˜fZ§ŽR4Í0LîŸr¯®_´vUÞæc`†‘;Õì9oÃõá "9îÅ/S·Nl=Þ_ú j‰×;Ûi—^Ò„žçIe‚çyD9‡ PÞ ƒ€ÃSºdßZòÍþD-G¸Õ¸>~r†Â!„1fZ=²¾Ÿ£,OrâSnmߥ~€³B,¶tô­ÛáËõoX‚áþƒ“Ãÿø¾g}o+±ØÆ¿Ý7‡_ä„J?Ó×Á÷‹«Â’áºÉÄ"I»ƒI\æÝu_u­ïëlkm)ÉíÜ[]|âyÖ[9“Mø{åÈvµ¼í¤"‘ÒÞµjãî£Øû0ƒ7—`‘¥+öÙŠP—î§UÝ'⿲—åf_Üö@—1ÖS*ŸO«l»'b,÷¬ë!|±ø×£sHÁ !ħ\YÿuÇ`7™H$‘+íOÏÊÎ<Öņʺ³}ãE×çžÅ¥dÆ_œüêÂæÉ[M9/(„Ü«]}ƒZÝpê¶üÓ]â_D¬nûê—™?œŠ×Z´0™`qVmŽåÆ”UÛ]¯oÿXð˲!H^oÉÝ?G»žeYŽ'•pžúåõ¹Åv­å*ŤÀ€¸¸ýÃ>úâçc÷&œŽNËH‰¾üs›¤ƒ¿ŽÊ1WM¼ùš%…µ7„úöüVMÇmþëßx‡î§ ö¹0ëçG¼¾jÈFoëÔnÒ–s©]w?‹¿6ÏçáÑŸw^óD Ú" ,Âk˜ÙŸ¬ )¢A@U„á ‡м¾÷*W6³ñ°£ü¢¦hA"©ç§ÜúRÃòª£»ú)Þ?ïb‡·{Ô7§Y$s­Ó¤–³pÆí3úû±}ºöE?ŒŸyn×­Lž „i†¦s'—bŠf„ÕÈØ&ló­››ø+ÅŒØ:¸ÏȆbD¸g—^Lå I9=íëo4/i7kJ˜·•TæÒbܽª0!D™L°pÒ÷t°—ŠE"™ß¸éÂâ\L3Œáö‰4®¬C¯&ñþY#–<åy‚P•!? ð¥ÜHö£CçSYŽpX¦´3b¥OØ´e“zÕ·a“õ^pÍÖÞtÆÂÛZ–'ÒŽK—O2ìÛ³ëKôj$Ÿš:þh²–ã-C;Ö±WùwT#>óìŒY'ßÀ¡Ñ|80¥—tîï·•m4ÿƒ5 â ‹Ð{ƒAÀ `pxÊ€t´œ§'NÇó€eôùHÙÑÞa&„çe-:š9cxs'‘æf! Xé¢Dø â¯N ±[Ò¶C·^ýûMZÞÔ’¡°©jÊ)°fsîò¸ÏÎ]Ï$!T¥¶·’¦(JåìŒN>Íë ÔOOý•$¤ä,Áˆ’Ù;ÊJ%I§>Êêh¯„íø0(]añ¿üñ–K¾vðàC—νëÛžVÀ¥÷õ„0&¸¼„Møó—_.»ôÓÑMò Z bè•o.RùΊ4è¿ùsõÏçœNéáYC^Å3HÉ:N•Ó àð”!b§jŽè@"¥¼HÖ"w‘I}Qw?VЬ¥J …B”D!bÆ>ŒUdù6²D!£BçM ã8ó­’¤ü9¥ÍÇ«Ÿk9ç;n/éîx¹¯G§Ñdhx¤‰'HE6rÝË%±´|¯·0+ïÀA* ù}¹e²’‚ô«>Çžlj¡¢„6)LQ.B¨4fÙÇ{­¼¥æ¹œèëG7Þøã—ÙÓ»­>³m¨¯ÔT‹*°f }\µÄg‰Âí2+¡µQ2k™ž8®/Dx<§–r.FyŠ5J|ø4k¢„3¤ø0øp—BkcÿÚûû©Çél±.•È&;åÄ \ʽ?ÿ¾“]Ðê\V̈ˆglif¾fThʨÓΉÜ4æÓáëdrE>õ¢”ûðr:¾›„͈¼ví~l6Wšg†T$ƒ”¬ãôa¤ô}è-߉_×N®Âä­—RòM-#©WVN™´ £&ý´óâë¾ø9Öÿ)Ÿã»¹ª/7ç'Ý;*»¢oºIç“ß§­—¦ÏÏû"«5a^g%ÒœZº÷YÎÛƒ-´ÏwŒŸ´d’­‚FŸ¶Ím1F%<‰×„6áÉ„BVÍÚûÈŠ¸®3‘ð‰ÍÑ.áò¾]gžÄ Ê«fFD“ž’£§{z·nl1B(æfd†0ï‘ßÛïÞôk<1•à¹M1ÄÛÅ+7AbÌJUó‘¬W‘I°Ì>¯" kÙ“ZôÜžâÚ¸÷øEÛÎÝ‹˜îOS‘ÌäLÖd5ý#iÚÈ|ÍŠ {œÌ«Y-¡Õ%ü+DÈyýø zÛH=›×³Ä!÷ ŽÍUJùgúµ¶7Z Õ ÀCEÜcQulÏ ˜<Ú÷û¿­FW—›^8ûhS™(àÒ{¹À vÞÝ D›ÿFëÒmêˆ`yvÒëèÈËÇÖL<|¨Ów?Œ¬¥4»^‰è?×|žx>W},6;ð¡‹%˜Ïq\•§¬™»¡¢,Ü•”HôѤyí1E] (µ>¼´†3S\Ê«¸lמ3?¯iÁf&DÝ>±ç·9w’®(/κ@áLÞR›7V21WõåD’*ŽwTv-DßtXhìïñM.5Ÿç?qxXöCšÉƸöùåXÜÐ~“<»:®uíšé=ù+Rný>ä¸Ë>__SNa¬j1uïãŸìŒMþcõѨ†=ÄáëÅó<²î¶â§vvEÝáˆRzXãzuóYB݈/o Û1,˜9zQCžØqf˜ÛòÓEö­¸‰­Ûüð¿ÎÇLRÿnÉÙ³šPww͘~ÖêÓ™Uå#lœ`—¿»4sAï°ƒž¢VφÌÉóyxàôÓîmâÖ,¿¢óƒó*¢°¥Nxpø› ¿ÔX;¬¶-—üòu&BY¶ìdIaÊT5ý3içãƒL×,Eò8Ê¡ÓÜñǾ¿Ã%Z´ù²g»÷Ç?Ry‚"lvf–ÖÊ®Ã?4ýãËóÙÉ¿·æ‹ñ ¬3®¯;ë¼rá&,ðáŒâæML—læ½=GâªÖèìÜí»®õÑØF×-kß\Ú¹vË©[ÏSD¾î(•PºLp©äà_ð–Cï*,DRxÖ¨YÊÆ5ëÚöÐŒIë¬Z1¾©ƒµÉ7lØxøZd mïߨϨAí¼-hý7‚ù8/¶|Õu+FMÙüccÅšŠ‰KÞ ‚BHáX#ÈJ×·bŒ4Ï·~1ádyë†ûKIÊ•mk·þyÿE|†Ék}¹xv[Õ«S¿®Øùçƒ79Dbß`ØìoÚ;‹Möá%Ñé–Öpf~€ ¬® 0ªU·–êé€%·nÆi«{R1‡œ±íflÏ(ªÔê8xLïZ¹‹ùŒG6n<|õal&¥òë2}ÖáÅ› B¸´{¿L™ó‡Õ§Kfu*© KÆ æªž§Ý;¼qá+⑽_Ý®C‡u­®¤1B\rþ–ð}»³fÝo¹tÕ@_ ÆY·ò]tÿ•K;9‰0ŸtfÆÀŸÅ7|ãó×™Æv3LjñìvŽ"ö½£²k!ú¦3‘0kº‘uÔɲû¾€ÃS2ÐÖõÇî¹ÛãÔªù«Ž\]3¬Ù7or¤¶ÕšôZÿ÷ø>uì„e£Œs÷Mw.¶˜=kõ±qÁÖƒ‰ÂÅ»ùÐi³çkì(¡öñâÐSoçp!µ(4ˆ=2ëz·„]ínñwüëøó ¡?Ÿ IDATm­U f,ýtê¦ Q?·òÛéÓì럿hßhÀ†G¿ùõò“u£ú=z’ N¾åÀkÿa+·µaTÍ>1bô¾‘ŸUåu7óé·¶šŒã‡ARë*Þ^®"Œ1FfcÖ”¿Ã¯ú ’ ‹¡Ëö\žbÓaÑêÁ´þ¯A¾¥®HÇDÜW»†U·¢(±)»I’âS"ÞÙ;*»bÞ2b²‘à´2ý¾€ÃSÂê"E¿sLÑŒáò e&&ÿ6¸Ùø>LQ´Ùýé4‰fŠðî… Òbòg—‘f>€Ó…‹fœBÚÆMx«©j*°f m’†¤¨Âb|h”¢°Èçî^’h^ž>úܾÝO FDêÖÖñxø‰?dAiŸÄh”ÁÁyla+ZÀ¥ß”ª€$ßÝ ú¿Ó“·}ãY¢š’ÑjžIËáÑ$<ˆR[Öq–`½¢BJ>¹d%o×eÁÐÆv"\ b¦êµ¯FåXÖqÊ-‘Ä¥n |ïýGñš:–”aKÀªª<Ø]ÿ<Ï®ëöàR¼ÇÇ=E‡/\{¥ñß¾‘lW/؆&ÚxSv3nTïã•] )ÀB!6኉ÂÊËöû•™Š5cQýä3±lòޝü&¨^<Ç“”Ã÷úW«« #”·ˆì­ªs#M_*Ka±–Bë% ‰½­%vÞ6 ÇrHZgôŒAþo· ‘Ø*h”üö±fã¼ÆÂ‘¼„ÍÇ|—¼ƒŸ À@©,…–;ûø[åNaÀ监EŒe‘[—?×¾qæÐþƒ‹'<ÒgΜ^>rB úðò>œ™µ†£§—§‚BÈÛ/¨†sꨙ§<îoóbÞ»3›7(ÀšÄ_¼ò""8üWŠK÷IcêÛä¾.ä‹Ë>z+5¸‘•­Ÿ»èÀ݈ÙÕýå#Ý:`žˆÌ_*Ù¶yÌc„KÞ ywé2Lr^þ±áX¼¬Þ„P[ ãíBç¼xNì[¹Êõ6ì ‚0",OxB[y™‰#¶” ìäl–ã #„ÌÆ|§œl€ A gº.Dð[Õ„Ï[ Í¢ÿYw#%w­Ýñóæ×M˜yäø“Ž£‚Ã>¼¼gæ¬!ÈE#„ˆ6;Mƒ$–✘ÛÏ9¡Ÿ´­ëÈ`ÎÒC.‚xÂX{»Ð‡î_•SÍ[ª¦xB’y´Ÿ2:hÅÔuß/°_üm÷’Û¿d b¦ê_wÑ×_çTó–b„´¯¯ÞÏUñµ¥Iî<Ö|-vnÜÂmϱã'ß<Õîíä käøë¹3'Ð ›¦ÃÜEH}Ǥ݌cÚ;BEñŽÊ®…˜q„̶l¿/àðP™©@3IÚ½W2Ýz· öwÉ[µƒ8Yk·ßw¿’ÚÆ¾Fÿînã÷ü8—ïâ,W?~™Er@¶0{©„÷XD˜ RÛc1íù½Û ©:9.æiĉ7Þ8|4}X#šÂµúup˜rdá|ªgûRMÒët·–mü”…ƒ%ÞúûZ´s}W3qhÛj^âÃç÷øÈ“$eØ×k`.&.qƒTJeEãEDè/ó.|Of®¿Á»ºÛÈ´ñ·_dòrk9…‰>\Y"óôJk83gô÷ï*å|vj\ä•ã/f:vjéfiéïˆöÙuÌ¢yU雘¬¼ØÊ~aŽSöÿøß³M5{‰:9Ûµa“*B~±Ø©ùØo^O™±ù§=>?õõ³(!ý¨d b®ê-jöïReüï‹–Hú´ñ@ÏÏý¶ïµKÏq5,s%HÃ'PŽ Ú{îܰûº]—^UD´¸~3§m;rŸŒq•`Ä:ø™´›‰¤ÞÃ;*»’ߺsSžW§´Â³ª‡™ÂjãËôû•™Š#,ò)7þ¸¥vïSÏžÑsi§úÍ<¶m?z)¾yGgÏgü Ø±å½Kަq´DiÐÀM† !HìeöR‰9ï½°„ Bh ;kêÒ¡s!Jfëäì^gàÜî-í$"„Hý|7Wµyëé=K¤óR•G½þ¡-}-E¶M>íò÷ÏᛎÕêo&޲îàí–mß»ôGÔ®V/߯þn¦cR%o€ A©,…6N5·»Ô“€ôâh’ž\Ü{ì~bA[ßúÃÆuv!‚ûpE‰ìà_ZÙ©Nao+úgßüÙû¢e k'ÿÖ#umSÍBŒ:NñfõÞÝKÎkB" »g Œ!R¿þs¾SnÞrò·E2‰Ô±ÑÐÀÎ:‹ayÀÇã{Ý¿gÍóúzKqù1ˆÙ£Å^ŸÌ˜+Û¼éØ†y‰ÈÆ+xÀìA]¼%™h !DÙ…¶ñݙҴ±‹!ʾ^+í¿²-›:‹!Œ«9»'õîÞQÙµ}ÓÅ\4ï.ÌÿËÕó›™.l_Àá 2ƒ‰Þ)”<ÏsDz¬V«ÍÉÉÉÎÎÎÊÊJOOOKKKIIINNNNNvqq øGýäÙ“M6Ѳڒô*yŽGm8û _°°Â'oƒrŒ1E½Ý¦Û쥒‚ÂBèÑãGµƒk˜è= Bx>oé’0ÆT¾è•N¯l„ð„Gˆþ4>w»!Œ)ÊÈŒïe© P!(Ãá ž#º[ï³®?;‚½Lôáåy8+p€†8ŒqÞ3u…®Q&ÇôÜð|LLQ¸œÄ\Õ#ÝÞÄ ~Z‚~By4LÖŒÝL&õnÞQY¶·%Î/Üa¡Ä& [¶ß—â:<áááQQQÖÖÖÖÖÖVVVJ¥R¡PÈår™L&‘HD"Ã04MS%|/ã8­V«V«ç<555==½M›6à_P([7m K$taÕ_¸ìêá-•ÉT*•B¡°°°J¥"‘ˆ¦i=7=êðLQ¦ŽñËœûR¢—‹·Í_*xTØ–CïüHC!Ñ8ûùJ§ïbëýi.ÎÛw8“f|çll€ A™ gSX®ÿÙÄ8@ôµ8£>¼gEàLPé‚R¤o1LQåÒ æªÞ°°zQŒZ‚‰&kÆnf’zï¨L[ˆ®Ä™j'¦ [–ßpx>H2. ñm»-‘Ók%5—^ûéj»N;ò"„HåÚ²Û /?ïb˘oiá»u9œÅ„SoîÅ“Bò6bŸ¯lXuÂ-A?§[ï{u´³ M ¨P¥—4©” „xžƒÅ è½Á `08<• Ë&ë£S.­IxŽeYË^Äf^]£õFƒÀ´„g×O®ùÔáAø¦™ýêtøér gV±V¶Ý˜tc¶?á9V}iz—1‡_ks#3£/eÄéfã5þâ›´# *ˆÒ±È“Êå`Qˆ"˜˜[þ¨ Â"ôÞ`0žÊ¦†ÖÉ{MÓ4…12«ª5ÿtÑq/.¸åÏ/OOï<ªêí-]DØ\šLî´ÂGoî÷IõŽM¨© 0ÂÍ04•û\P€ å•òËX¥û½š Â0H P!€Þ ƒ€Ã˜ 1Æ´U記„OØ5sÓãœ›ÙøZ#ŒɾøMç±o§-uwÝW]ëû:ÛZ[ŠDr;·À–CŸxžÅ#„´×’JÄ"‘H$ùN?:÷ãzî–b‘uµK¯§iS¯­Ú¢ª­DjðÑô£Ñ9oÓׯž[:¸U°§­LláàÚmÚï‘YÐn€r+, ëA*á*†aÀ E1@…zo0 P ×Ðjrᔤ».Æs ‹–õ¿ß¿ ‰œÂˆð/íÛgù âɼ³}ãE×çžÅ¥dÆ_œüêÂæÉ[M9ŸÄÚ±ýÌÅ£ƒϱ,¹éóéW\;t –ð©LìôÉg݆ ›vnh£MzþcßÑs¥K6z[¯ v“¶œKíºûYüµy>.ø$¸óš'jЀ÷ ´ ¥Bù&é­µme3èÓçO]]\ʃÀ— €ŠôÞ`0 PD¶ž6§#‚HÜ“7Zä&*à8ʲƘ];5èñë ŽÏþkrçqþ—VurÎ Û„m¾ÕÌÎÛÅ’ÆHÜgdà Çg?Û¸ôâœfm»}ÖyÏ·+n¦ DW~`÷@wÍ…g»ÛnOä^‡_yãÚô æ!säøw¸ôóûîe}쬢RNM4YËñŠÐŽuìUÊ®ƒjqêÏ̳3fì¹¥“mx7JKX¬\ëöÝÛ‘O#+•ƒEñóñsqvƒj€ ôÞ`0 (m xï`NÿwhþÃS/ªyþÅ/}úV»tdhþ$(1y´õ‹a›Oß~—Á#±A(;ò~¼6ÌZJé8w ´Ó²rQ"œˆˆÄ¯Ž›Œ¦‘ÊIB(-:.‹ •úé©¿’x!ää,Áˆ’Ù;ÊJ%I§>Êêh¯Ux7JKX‹ÄuBêTBƒšs£Á è½Á `0È{:<ѱÏcílÝœ=¿èÄM~‘ŒaÐÑ×NT„zÆ–5ÇíÙy?´ç–hŽÏúsR—‰UæjÞJ‹$åÏ)m>^ý\Ë9Üq{IwÇË}=:Èàˆ&C“ÿl$F&¦B˜Óa„™#„0-¦…Ç„´ñâ…>žSK9£<©%>|šÎ5QRP‹À;QŠ{Á€¢€Þ ƒTrã8ŽKHŒsuòÛ| h^]{˜%¨‚]ÚíXg,rî²òÐÜ~{)‡çŸ¯ïÿ¥˜·ñϽ˜uoûž(–å‰ï±ý­$Y4%$Zô™‘ºL„ÙûÙ!ü0çú•ÉÕ¤”î:¦á jàÝŸ¦ ´°³q (ÊÎÆTÅ–ŒëÖ>äy‚uÏ9ƒüõ4»Â^Å,C&îÙÞÏ™Æñ\ªúí‚j>+)„«fFD“ž’ó^y”z6¯g‰1B(îAK3 Ã0 ÿlC¿¶ÃöFkáôà)HX4øÁc ?A@Ñqsö¬ØÀÝÅK7…ÌØ©»‚ÂgÆ>ü{ç”í–?gy¤jþÝ¡5]EÅ©L,ªÒ}Õ¡ÙõÄ‚©ødþmChŒz~`Ç™‡w.üé"û^‡7c»?þÐTJa”üûwk.¿ÑðlÒÕ5cgW¶ª'·ïAá3GÜ( ѱÏoÜ»ôòõ3„HtlÔÍû—_¾~n°Š|ìòLÆ…!N–~_]çx‚JÙÑÎ^ZwåíSƒ åÖnAÍ®yîÕ|ÀÌ­—˜ÖØÖ¼F—þ±JYãÛ{oŽtq”/x¨Î )EíÉû¶övÌ·™ñølÆõ]$øÉºQý¦_«1¤… c„ÐÓyµU-M«iÛþ·dŽ „¢…ÖžúÛ´ZuŒäx‚Pƾ0¯>ÛW5ó!H‘C=ÝF\HãE>#ŽÜ90û“†î‘óš»(íÝê~~.hñ©Íý<$Ѐw G˜B!<ÏsDz¬V«ÍÉÉQ«ÕYYYéééiii))))))ÉÉÉNNNaaaà€InÜ»Ìq,Eѵëß¼¡ûŒ1ùò¥µµµ••••••R©T(r¹\*•J$‘HÄ0 MÓE /ã8­V«sÎSSSÓÓÓÛ´i>yi‘w²‰ÞkES„ãLÎÄcŠ¢ © ý41EÓú+¦s¯éÂ󂆉1EaÂñoo¦¯7S´þe„0M!ý¿E3¹S"yŽ'ygXcLžkà`ë¦Ab‰„¦é‚c^¸ìêá-•ÉT*•B¡°°°J¥"‘ˆ¦is똓#Òûùçê ÀÎÆ!!1VØWQÿsÞ5L`,_`š1uÈ%Ô|šæ®aLÑŒÞò2&ßR3ÊpáCüwn¢Tao”P<Œ0¬ÿ¯*0€›³gÞÐXÿ³pUçWÈ‹ -P¼zóêuQbBªxx+ñÂtÓ×iø… ŒˆŽ}žkgãèæìeò³ -ê¯t€2`üÄɺ-V/ì‹AX-+üN6lXWÜ”óÍ@Ô÷ltb¢NR€Êã8ŽKHŒ#Äìg_­ó´ FP(Y„%ȹç«ð<ÇqËj4Â+juvvvVVVV&!¤Ø)lû"¬Ô¼æ½¶€;Š¢tû*šü, Ï"‹ ¢AR baZ(4ØWQ§*ŠD"0`n_Eã=uG?ë´EãI‹Ã‹‡A ª"Ã0‚ª(‹Áã#eø!„Äb± - ò¢ªÎ6¥ÇáÇ“’’t¦¦¦?~üV@ë`ô]!!!ãEÐ:UQ,kµÚ“'OBM@q!„NµnÞ¢Á‚hg¶ Ä _°páÞ={ll¬SRRûöíWµjÕ¶mÚ¼s‚ŒÎw!„˜ÜZQø5Up€¤R)˲iiiYYYYYYjµ:''G£Ñ°,˲,Çq<Ÿ{š ÔPy0^ñ#‹%‰T*•Ëår¹ÜÒÒÒÂÂB.— ®µþ¤EƒÍh‹”K—.ýj̘víÛ·k×öĉð:µkÏŸ?¢(žçß-A¦P¯H7cQ"‘pÇqœ  áb±X£ÑhµZAUa¨œ˜t¡…ßæe2™L&“Ëå2™L*•J$ƒaEʆa–ýï_³zõš^½z-\ðÃ0ä]UEdRX4¹Z' &ÆX',jµZ­V«„E ²aàEÓ4-‰„Ÿç¥R©N^„Es«¡ÁŒ”*‚¶Ø°Aƒ.]»04Í¿‡ªˆŒ…E“«¡aQ§꫊æ¦+‚°T*ô½hƒI‹Â¼EÂ(ÌX‰DæÖA€êÛß·í´4âuš´Ë‘¨Ýí¬èÊÛFHväïSû^óÙ¹ûË((ø¶¼ Ãôë×W£Ñ¼§ªˆŠ8c‘çy±Xl *ŠD"ªÈ²,ÏóÂ*i€Jˆ¾8((†Â.Š:mQ"‘s ØcÌXq`ãϯúvöšSQ qDY£×”¦õ®®4#v±Q:7›ráUZBbK…ó9™y•m†Îš?î#/9eþAÒÓÎ=ì<+¤Î2¾ä^²Œòéӳx…s`«Á3|ÓÕ[V¦m1õp{§^gYÎTñ¼&EÜü>DN¡ô»[Æ6í¼:#C+7ˆ©M¼yhýÊu{ÿy‘¡Õä°RÏÖ#gÍÙ¼Š#„Éü÷Ðê›ö¹ŸÌñ9Yjƽհóƶs•À€J⢠”••%“É üáeß¡_dŒ%„P%üKÓ´¾J(8Iú‹ usUQ˜±($5T"¯=ïÐA%¤ó´E¼¨ÿA', w¡¤Sqöýµ=› lýBzcs7g‘© d<†‰ü8¼—[çðÖ»ïioEa.õÖ/ÃÃÆtmñòèÕ•mí³õŽ)š¦©’Í¿‰üõËs{ô˜ßó>qen-‹²œHˆ]û½Wv´};“}±¥gQáŸ.$£0âãŽÏÛm5ýl¸f¸ß§ *ãáò>ý–¹Î?qîË:Ö4ûúøä¶=Úµ~~òâÂf64Flܱ9Ówº-;uiH‚Ò¾úcB«ž:fE\œb“¨ ˆD¢+—/5mÞ¢àh÷î݉DÅP̹D‚¶H´Eá’þ®‹ºc M.‚a¨Tè„EƒѺC¢%Qÿ_ÝtE˜±XÑÐt»I¬üŠø„©TªR© …………T*Ž›3·´ÂìRè\‹çŸ´HQÏó4MózØÂ"P Ñ9Ò&µEs¼Û‘ÐNNŽ ,P²$¼)ÞŒEÃÃ[MÐ@[Ô¹DúKž $EPÀ¤¶¨¿8Úà_cUäB* Œ±'d -êö^Ήæy^w®‹þÒi!2¨Š@%Ç@[DF>ƒª@EÄôRhãy‹(¿ÂˆôôDPÀÀsÖÿ`¬0"SGµ€ª@Å‚1ç é´EAL4V…˜ *ÿoï¸ò8ŽŸÓÝÓ3Ì“º³>`Ð(ĘMŠDˆ‰{±ŒUûöUìZ¶²Uz±‹hdS5‹͈"”Ä 83ÍLO?íE¯½†‚Ô÷sÕÓ2Ý^œÿüæüÏÀ¢õ¢K…‰¤ŠlJ_^íÇãá3Ž'ç,׳m¯b{¦íš–›³ùswxGš /º?߇F×u!D¥R©z‹³Ÿœù­ ­v%䇉‹žÎ)5Šê•€Mf÷îÝíííA§‚çy…’}ïqaÞt’3Wrf {:oWf³UOô77 ¦Ò©3gÎ(ŠráÂ…ü³ü¹:m…•PUÂL]¤–µ°fþõªè~þ¯[·o=üþÉΓÁ»|yõêµ×ÚÞ~÷ôG§)àX7þîÇáÁ·\q&s¥ŠíUl¯TñÊ×u…縵_'•LÅ¢1)e:•®,öÿû«Îì<Ññ «­ÞJˆ<Xµu¨¢GF†Ot½{7kÛö©îSRÊËW¾¸÷à^Çñ÷¿¹1øñ©©äX7¶m;Ž<ô<ϲÃtçMÏ0Ýü¼;k8¹¢“(šÂâçCt*:üÞaÃ0®_¿>55511!¥œššB9r$•JݸycaÈèo‹¢iê¾};’ÉxÕ¿FéáÃlÛY“«Óê}U°‘µµýñîÝl[Û;·¿ê»Ü§H9:6ÚÚúÆ‘ïÚÛߣž`=ÍÌ̘¦©iš?»®[.W¦ Î3ã‘âOs¥™é'ûÔï…8Q•,¶4·455 !¿”Ëåj€—2éÌ‘”Xnß”+}—zΞ«÷ê€MåjÿÕ±ññ#GÛo ÜÜñûÊá;­o½9<4Ѣǎ“-°nÊårUö—J¥J¥Rx8ö¥>wïÞ½±h¬!ÖpñâÅ\.gš¦”rpp0“Éôôô(ŠÒÔÔ4==½ìgXÉÐßsöœ”u/™B°l*7¾¹~²«ó?7wîÜuªû#)¥âÎÈw­o½yí«¯Ž=F°Àº1M³X,†Ï¤Óé¹¹¹ðp,¥´m{ásGïf2Ã0r¹œçyÛ¶móû s¹\6›M&“£÷Gí‰6 ³öp_,–;Oüì·FÃ0Vqu‹À¦r`_ó•+ýmo·uwuûmVv’RøúfsËk¤Š¬§r¹<77WÕ ËåÂ#²®ë‹‹…|¡¯¯OáyÞ®]»öìÙ£(ÊîÝ»?~<00 –Þ¼eìáµ7}îyò¤j;—E[¡E(:, –mI)ó…eöƒî<Ñ±ì§ Þ=耦€X4=$Rà7±uëÓ•ð üôéÓðßLMMe³ÙÚ¯SÈzÿÖ+„0MsÙJ`å/耦Ø@þÞۻ¤/¼O´âì'gVø«øí°ªšVh`cQUuuOüU[ v@Ó lZ42€µ²°:8ðKŽ•Î²äV›Þ•¾K‰D¢ö¨ççLYc¿!Ïó<ÏsDz,Ó4ççç …B>ŸöìY¢Açþ€e½vðP& )•b±°ÔÁ×ñx«ªêO]¬-,½è§Šº®Çb1×u…š¦Y–eÛ¶ëºþ‚ŒÜ.°Š#644Äb1]×ýlÑk¿Á"ð”þ~ݯiš®ë~Œ¨(J$ñ§+úg¸Q Þï(t]F£~°¨iZxÆbx‘`ظå¾çyU üÑÿ`Y–ã8~4Á"¨·Ò𻡃®?^\8cq©l‘`xêþ XôúË!ùs郫+0»ÃE"¿À‹¬±¼À¿‹âù:ë¶mG"‘ UB,€U—Á¢+ês‹Àæ©ûUU /¶È\E°&eF-†-›* ‚E`ã—ûÁ±_å+Šâ…p‹À/,6–"–^`Q!)D€ .(Úƒ®gÚŸÀ 2Ī0±ö¤E‚EàÅ.Ý)ãÀš«Š—m…&X^$ðàWµlžøÿ¿¤.P/…[ ^‹êF° n‹êF° nÿ¼¶ò þ6_IEND®B`‚glom-1.22.4/docs/user-guide/de/0000755000175000017500000000000012235000130017337 5ustar00murraycmurrayc00000000000000glom-1.22.4/docs/user-guide/de/legal.xml0000644000175000017500000000677412235000130021163 0ustar00murraycmurrayc00000000000000 Das vorliegende Dokument kann gemäß den Bedingungen der GNU Free Documentation License (GFDL), Version 1.1 oder jeder späteren, von der Free Software Foundation veröffentlichten Version ohne unveränderbare Abschnitte sowie ohne Texte auf dem vorderen und hinteren Buchdeckel kopiert, verteilt und/oder modifiziert werden. Eine Kopie der GFDL finden Sie unter diesem Link oder in der mit diesem Handbuch gelieferten Datei COPYING-DOCS. Dieses Handbuch ist Teil einer Sammlung von GNOME-Handbüchern, die unter der GFDL veröffentlicht werden. Wenn Sie dieses Handbuch getrennt von der Sammlung weiterverbreiten möchten, können Sie das tun, indem Sie eine Kopie der Lizenz zum Handbuch hinzufügen, wie es in Abschnitt 6 der Lizenz beschrieben ist. Viele der Namen, die von Unternehmen verwendet werden, um ihre Produkte und Dienstleistungen von anderen zu unterscheiden, sind eingetragene Warenzeichen. An den Stellen, an denen diese Namen in einer GNOME-Dokumentation erscheinen, werden die Namen in Großbuchstaben oder mit einem großen Anfangsbuchstaben geschrieben, wenn das GNOME-Dokumentationsprojekt auf diese Warenzeichen hingewiesen wird. DAS DOKUMENT UND VERÄNDERTE FASSUNGEN DES DOKUMENTS WERDEN UNTER DEN BEDINGUNGEN DER GNU FREE DOCUMENTATION LICENSE ZUR VERFÜGUNG GESTELLT MIT DEM WEITERGEHENDEN VERSTÄNDNIS, DASS: DIESES DOKUMENT WIRD »WIE VORLIEGEND« GELIEFERT, OHNE GARANTIEN IRGENDEINER ART, SOWOHL AUSDRÜCKLICH GENANNTE ALS AUCH ANGEDEUTETE. DIES BEZIEHT SICH AUCH OHNE EINSCHRÄNKUNG AUF GARANTIEN, DASS DIESES DOKUMENT ODER VERÄNDERTE FASSUNGEN DIESES DOKUMENTS FREI VON HANDELSDEFEKTEN, FÜR EINEN BESTIMMTEN ZWECK GEEIGNET IST ODER DASS ES KEINE RECHTE DRITTER VERLETZT. DAS VOLLE RISIKO WAS QUALITÄT, GENAUIGKEIT UND LEISTUNG DES DOKUMENTS ODER VERÄNDERTE FASSUNGEN DES DOKUMENTS LIEGT BEI IHNEN. SOLLTE EIN DOKUMENT ODER EINE VERÄNDERTE FASSUNG DAVON FEHLER IRGENDEINER ART BEINHALTEN, TRAGEN SIE (NICHT DER URSPRUNGSAUTOR, DER AUTOR ODER EIN MITWIRKENDER) DIE KOSTEN FÜR NOTWENDIGE DIENSTLEISTUNGEN, REPARATUREN ODER FEHLERKORREKTUREN. DIESER HAFTUNGSAUSSCHLUSS IST EIN ESSENZIELLER TEIL DIESER LIZENZ. DIE VERWENDUNG EINES DOKUMENTS ODER EINER VERÄNDERTEN VERSION DES DOKUMENTS IST NICHT GESTATTET AUßER UNTER BEACHTUNG DIESES HAFTUNGSAUSSCHLUSSES UND UNTER KEINEN UMSTÄNDEN UND AUF BASIS KEINER RECHTSGRUNDLAGE, EGAL OB DURCH UNERLAUBTEN HANDLUNGEN (EINSCHLIEßLICH FAHRLÄSSIGKEIT), VERTRAG ODER ANDERWEITIG KANN DER AUTOR, URSPRUNGSAUTOR, EIN MITWIRKENDER ODER EIN VERTRIEBSPARTNER DIESES DOKUMENTS ODER EINER VERÄNDERTEN FASSUNG DES DOKUMENTS ODER EIN ZULIEFERER EINER DIESER PARTEIEN, HAFTBAR GEMACHT WERDEN FÜR DIREKTE, INDIREKTE, SPEZIELLE, VERSEHENTLICHE ODER FOLGESCHÄDEN JEGLICHER ART, EINSCHLIEßLICH UND OHNE EINSCHRÄNKUNGEN SCHÄDEN DURCH VERLUST VON KULANZ, ARBEITSAUSFALL, COMPUTERVERSAGEN ODER COMPUTERFEHLFUNKTIONEN ODER ALLE ANDEREN SCHÄDEN ODER VERLUSTE, DIE SICH AUS ODER IN VERBINDUNG MIT DER VERWENDUNG DES DOKUMENTS UND VERÄNDERTER FASSUNGEN DES DOKUMENTS ERGEBEN, AUCH WENN DIE OBEN GENANNTEN PARTEIEN ÜBER DIE MÖGLICHKEIT SOLCHER SCHÄDEN INFORMIERT WAREN. glom-1.22.4/docs/user-guide/de/de.po0000644000175000017500000023215212235000130020274 0ustar00murraycmurrayc00000000000000# German translation of the Glom manual. # Mario Blättermann , 2008, 2010. # Christian Kirbach , 2010. # msgid "" msgstr "" "Project-Id-Version: glom master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-23 17:27+0000\n" "PO-Revision-Date: 2012-07-23 17:52+0100\n" "Last-Translator: Christian Kirbach \n" "Language-Team: Deutsch \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" "X-Poedit-Country: GERMANY\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: C/legal.xml:2(para) C/glom.xml:2(para) msgid "" "Permission is granted to copy, distribute and/or modify this document under " "the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any " "later version published by the Free Software Foundation with no Invariant " "Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy " "of the GFDL at this link or " "in the file COPYING-DOCS distributed with this manual." msgstr "" "Das vorliegende Dokument kann gemäß den Bedingungen der GNU Free " "Documentation License (GFDL), Version 1.1 oder jeder späteren, von der Free " "Software Foundation veröffentlichten Version ohne unveränderbare Abschnitte " "sowie ohne Texte auf dem vorderen und hinteren Buchdeckel kopiert, verteilt " "und/oder modifiziert werden. Eine Kopie der GFDL finden Sie unter diesem " "Link oder in der mit diesem " "Handbuch gelieferten Datei COPYING-DOCS." #: C/legal.xml:12(para) C/glom.xml:12(para) msgid "" "This manual is part of a collection of GNOME manuals distributed under the " "GFDL. If you want to distribute this manual separately from the collection, " "you can do so by adding a copy of the license to the manual, as described in " "section 6 of the license." msgstr "" "Dieses Handbuch ist Teil einer Sammlung von GNOME-Handbüchern, die unter der " "GFDL veröffentlicht werden. Wenn Sie dieses Handbuch getrennt von der " "Sammlung weiterverbreiten möchten, können Sie das tun, indem Sie eine Kopie " "der Lizenz zum Handbuch hinzufügen, wie es in Abschnitt 6 der Lizenz " "beschrieben ist." #: C/legal.xml:19(para) C/glom.xml:19(para) msgid "" "Many of the names used by companies to distinguish their products and " "services are claimed as trademarks. Where those names appear in any GNOME " "documentation, and the members of the GNOME Documentation Project are made " "aware of those trademarks, then the names are in capital letters or initial " "capital letters." msgstr "" "Viele der Namen, die von Unternehmen verwendet werden, um ihre Produkte und " "Dienstleistungen von anderen zu unterscheiden, sind eingetragene " "Warenzeichen. An den Stellen, an denen diese Namen in einer GNOME-" "Dokumentation erscheinen, werden die Namen in Großbuchstaben oder mit einem " "großen Anfangsbuchstaben geschrieben, wenn das GNOME-Dokumentationsprojekt " "auf diese Warenzeichen hingewiesen wird." #: C/legal.xml:35(para) C/glom.xml:35(para) msgid "" "DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, " "EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT " "THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS " "MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE " "RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR " "MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR " "MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL " "WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY " "SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN " "ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION " "OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND" msgstr "" "DIESES DOKUMENT WIRD »WIE VORLIEGEND« GELIEFERT, OHNE GARANTIEN IRGENDEINER " "ART, SOWOHL AUSDRÜCKLICH GENANNTE ALS AUCH ANGEDEUTETE. DIES BEZIEHT SICH " "AUCH OHNE EINSCHRÄNKUNG AUF GARANTIEN, DASS DIESES DOKUMENT ODER VERÄNDERTE " "FASSUNGEN DIESES DOKUMENTS FREI VON HANDELSDEFEKTEN, FÜR EINEN BESTIMMTEN " "ZWECK GEEIGNET IST ODER DASS ES KEINE RECHTE DRITTER VERLETZT. DAS VOLLE " "RISIKO WAS QUALITÄT, GENAUIGKEIT UND LEISTUNG DES DOKUMENTS ODER VERÄNDERTE " "FASSUNGEN DES DOKUMENTS LIEGT BEI IHNEN. SOLLTE EIN DOKUMENT ODER EINE " "VERÄNDERTE FASSUNG DAVON FEHLER IRGENDEINER ART BEINHALTEN, TRAGEN SIE " "(NICHT DER URSPRUNGSAUTOR, DER AUTOR ODER EIN MITWIRKENDER) DIE KOSTEN FÜR " "NOTWENDIGE DIENSTLEISTUNGEN, REPARATUREN ODER FEHLERKORREKTUREN. DIESER " "HAFTUNGSAUSSCHLUSS IST EIN ESSENZIELLER TEIL DIESER LIZENZ. DIE VERWENDUNG " "EINES DOKUMENTS ODER EINER VERÄNDERTEN VERSION DES DOKUMENTS IST NICHT " "GESTATTET AUßER UNTER BEACHTUNG DIESES HAFTUNGSAUSSCHLUSSES UND" #: C/legal.xml:55(para) C/glom.xml:55(para) msgid "" "UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING " "NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY " "CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE " "DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON " "FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF " "ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, " "WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES " "OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED " "VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE " "POSSIBILITY OF SUCH DAMAGES." msgstr "" "UNTER KEINEN UMSTÄNDEN UND AUF BASIS KEINER RECHTSGRUNDLAGE, EGAL OB DURCH " "UNERLAUBTEN HANDLUNGEN (EINSCHLIEßLICH FAHRLÄSSIGKEIT), VERTRAG ODER " "ANDERWEITIG KANN DER AUTOR, URSPRUNGSAUTOR, EIN MITWIRKENDER ODER EIN " "VERTRIEBSPARTNER DIESES DOKUMENTS ODER EINER VERÄNDERTEN FASSUNG DES " "DOKUMENTS ODER EIN ZULIEFERER EINER DIESER PARTEIEN, HAFTBAR GEMACHT WERDEN " "FÜR DIREKTE, INDIREKTE, SPEZIELLE, VERSEHENTLICHE ODER FOLGESCHÄDEN " "JEGLICHER ART, EINSCHLIEßLICH UND OHNE EINSCHRÄNKUNGEN SCHÄDEN DURCH VERLUST " "VON KULANZ, ARBEITSAUSFALL, COMPUTERVERSAGEN ODER COMPUTERFEHLFUNKTIONEN " "ODER ALLE ANDEREN SCHÄDEN ODER VERLUSTE, DIE SICH AUS ODER IN VERBINDUNG MIT " "DER VERWENDUNG DES DOKUMENTS UND VERÄNDERTER FASSUNGEN DES DOKUMENTS " "ERGEBEN, AUCH WENN DIE OBEN GENANNTEN PARTEIEN ÜBER DIE MÖGLICHKEIT SOLCHER " "SCHÄDEN INFORMIERT WAREN." #: C/legal.xml:28(para) C/glom.xml:28(para) msgid "" "DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS " "OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: " "" msgstr "" "DAS DOKUMENT UND VERÄNDERTE FASSUNGEN DES DOKUMENTS WERDEN UNTER DEN " "BEDINGUNGEN DER GNU FREE DOCUMENTATION LICENSE ZUR VERFÜGUNG GESTELLT MIT " "DEM WEITERGEHENDEN VERSTÄNDNIS, DASS: " #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:181(None) #, fuzzy #| msgid "@@image: 'figures/start.png'; md5=b8c9acc03f9f1cdb213e37c9da91817a" msgid "@@image: 'figures/start_open.png'; md5=adac27f11f2324c3da2349f72d554994" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:195(None) #, fuzzy #| msgid "@@image: 'figures/start.png'; md5=b8c9acc03f9f1cdb213e37c9da91817a" msgid "" "@@image: 'figures/start_create.png'; md5=f1e4c22fd6811e4ba908e290e76f0474" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:226(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_data_list.png'; " #| "md5=3c43533f6b0ce3e645b29402f59af76f" msgid "" "@@image: 'figures/glom_tables.png'; md5=a61ac5516314b38c6c7a3f3fd534427f" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:252(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_data_list.png'; " #| "md5=3c43533f6b0ce3e645b29402f59af76f" msgid "" "@@image: 'figures/glom_data_list.png'; md5=3b7469ee1de77081b435db5ac2d48953" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:275(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_data_details.png'; " #| "md5=5444ab817d4e4e4da6899abbc5cbfd2f" msgid "" "@@image: 'figures/glom_data_details.png'; " "md5=455bde435350fd53401213dff235bfb3" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:305(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_reports.png'; " #| "md5=74c35ae3dd601490b9f4f2276383a518" msgid "" "@@image: 'figures/glom_report_result.png'; " "md5=2b752779eb0ed68724d094f6e1fef699" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:343(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_fields.png'; " #| "md5=e7137a37c7c74a96a914b0df777f5f6b" msgid "" "@@image: 'figures/glom_design_fields.png'; " "md5=39a13053db33b9c45bc1f61a0f31a199" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:393(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_layout_list.png'; " #| "md5=5c5fc16b70e39173785ef3167d66aceb" msgid "" "@@image: 'figures/glom_design_layout_list.png'; " "md5=213888ef5cd3037b2fa61155b4fe5136" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:412(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_layout_details.png'; " #| "md5=34946df95ce29f04b3d204ba0cbca904" msgid "" "@@image: 'figures/glom_design_layout_details.png'; " "md5=6f1d78f90d6ec0ea338014d2ac697a90" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:458(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_translations.png'; " #| "md5=94376c6bf38d86581d56b3309441a792" msgid "" "@@image: 'figures/glom_design_translations.png'; " "md5=92b8e4905d0b85ef7f7d248420942a97" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:485(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_reports.png'; " #| "md5=74c35ae3dd601490b9f4f2276383a518" msgid "" "@@image: 'figures/glom_design_reports.png'; " "md5=697eb7cc6baebae8b374e474b4fa0899" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:517(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_reports_details.png'; " #| "md5=b75a1a60a48659c6166f4fdd7da6c68c" msgid "" "@@image: 'figures/glom_design_reports_details.png'; " "md5=00ac05c3515a4db2175a47047ec3b98e" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:534(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_reports_group_by.png'; " #| "md5=3d6a191a50ca351183a6690ce0039a9d" msgid "" "@@image: 'figures/glom_design_reports_group_by.png'; " "md5=21168c2a89f9febf6905a59c24a3d6de" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:550(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_reports_vertical_group.png'; " #| "md5=0328958fcf2f55c27045dbc203761214" msgid "" "@@image: 'figures/glom_design_reports_vertical_group.png'; " "md5=001b3021da2dc0de68358b0b41215afb" msgstr "ok" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. #: C/glom.xml:766(None) #, fuzzy #| msgid "" #| "@@image: 'figures/glom_design_reports_vertical_group.png'; " #| "md5=0328958fcf2f55c27045dbc203761214" msgid "" "@@image: 'figures/glom_design_fields_dialog_calculated.png'; " "md5=21b9fc570ff40883d1d283d960e45767" msgstr "ok" #: C/glom.xml:28(title) msgid "Glom User Guide V0.2" msgstr "Glom-Benutzerhandbuch V0.2" #: C/glom.xml:29(subtitle) msgid "for Glom v1.6" msgstr "für glom v1.6" #: C/glom.xml:32(year) msgid "2004" msgstr "2004" #: C/glom.xml:33(holder) C/glom.xml:99(para) C/glom.xml:100(para) msgid "Murray Cumming" msgstr "Murray Cumming" #: C/glom.xml:47(publishername) C/glom.xml:60(orgname) msgid "Glom Development Team" msgstr "Glom Entwickler-Team" #: C/glom.xml:57(firstname) msgid "Murray" msgstr "Murray" #: C/glom.xml:58(surname) msgid "Cumming" msgstr "Cumming" #: C/glom.xml:61(email) msgid "murrayc@murrayc.com" msgstr "murrayc@murrayc.com" #: C/glom.xml:96(revnumber) msgid "Glom 1.6" msgstr "Glom 1.6" #: C/glom.xml:97(date) msgid "20 June 2004" msgstr "20. juni 2004" #: C/glom.xml:105(releaseinfo) msgid "This manual describes version 1.6 of Glom" msgstr "Dieses Handbuch beschreibt Version 1.6 von Glom" #: C/glom.xml:108(title) msgid "Feedback" msgstr "Rückmeldungen" #: C/glom.xml:109(para) msgid "" "To report a bug or make a suggestion regarding the Glom or this manual can " "be submitted to the GNOME Bugzilla , under the Glom product. Please search bugzilla " "before submitting your bug to ensure that yours hasn't already been reported." msgstr "" "Um einen Fehler zu melden oder einen Vorschlag zu Glom oder zu diesem Handbuch zu machen, können Sie das Fehlererfassungssystem von " "GNOME verwenden, in welchem Sie als Produkt Glom auswählen. Bitte durchsuchen Sie zunächst die Fehlerdatenbank, " "um sicher zu gehen, dass über Ihr Anliegen nicht bereits berichtet wurde." #: C/glom.xml:119(para) msgid "User manual for Glom." msgstr "User manual for Glom." #: C/glom.xml:124(primary) msgid "MY-GNOME-APP" msgstr "MY-GNOME-APP" #: C/glom.xml:127(primary) msgid "mygnomeapp" msgstr "mygnomeapp" #: C/glom.xml:135(title) msgid "Introduction" msgstr "Einführung" #: C/glom.xml:136(para) msgid "Glom allows you to design and use database systems." msgstr "Glom erlaubt Ihnen das Erstellen und Benutzen von Datenbanksystemen." #: C/glom.xml:150(title) msgid "Getting Started" msgstr "Erste Schritte" #: C/glom.xml:153(title) msgid "Starting Glom" msgstr "Glom starten" #: C/glom.xml:154(para) msgid "You can start Glom in the following ways:" msgstr "Sie können Glom auf folgende Arten starten:" #: C/glom.xml:158(term) msgid "Applications menu" msgstr "Menü Anwendungen" #: C/glom.xml:160(para) msgid "" "Choose OfficeGlom." msgstr "" "Wählen Sie BüroprogrammeGlom." #: C/glom.xml:171(title) msgid "When You Start Glom" msgstr "Beim Start von Glom" #: C/glom.xml:172(para) msgid "" "When you start Glom, the following window is " "displayed. You may open an existing Glom file or create a new one, possibly " "basing a new Glom file on one of the examples." msgstr "" "Wenn Sie Glom starten, so wird das folgende " "Fenster erscheinen. Sie können nun eine bestehende Glom-Datei öffnen oder " "eine neue Datei erstellen, die gegebenenfalls auf einem der Beispiele " "basiert." #: C/glom.xml:177(title) msgid "Glom Start Up Window, Opening an Existing File" msgstr "Glom-Startfenster, Öffnen einer bestehenden Datei" #: C/glom.xml:184(phrase) msgid "Shows Glom main window used to open an existing Glom file." msgstr "" "Zeigt das Haupfenster von Glom während eine bestehende Glom-Datei geöffnet " "wird." #: C/glom.xml:191(title) msgid "Glom Start Up Window, Creating a New File" msgstr "Glom-Startfenster, Erstellen einer neuen Datei" #: C/glom.xml:198(phrase) msgid "Shows Glom main window used to create a new Glom file." msgstr "" "Zeigt das Glom-Hauptfenster während der Erstellung einer neuen Glom-Datei." #: C/glom.xml:212(title) msgid "Using Glom as an Operator" msgstr "Glom als Operator verwenden" #: C/glom.xml:213(para) msgid "" "To open an existing Glom document, either open that document from the File " "Manager, or choose Glom from the Applications menu, and then choose the " "document when asked. Glom will ask you for a user name and password to " "access the database. Your administrator will provide your user name and " "password." msgstr "" "Um ein vorhandenes Glom-Dokument zu öffnen, können Sie es entweder im " "Dateimanager öffnen oder Sie wählen Glom im Menü " "Anwendungen und öffnen dann das gewünschte Dokument. Glom " "fragt Sie nach dem Benutzernamen und dem Passwort zum Zugriff auf die " "Datenbank. Ihren Benutzernamen und Ihr Passwort stellt Ihnen Ihr " "Systemverwalter zur Verfügung." #: C/glom.xml:215(para) msgid "" "When you open an existing document, Glom will be in Operatoruser level. This user level allows you to find " "and edit records, but does not allow you to change the fundamental structure " "of the database." msgstr "" "Wenn Sie ein vorhandenes Dokument öffnen, befindet sich Glom in der " "Operator-Ebene. Diese Ebene ermöglicht " "Ihnen die Suche und Bearbeitung von Datensätzen, verbietet aber Änderungen " "an der grundlegenden Struktur der Datenbank." #: C/glom.xml:218(title) msgid "Navigation" msgstr "Navigation" #: C/glom.xml:219(para) msgid "" "Each database has several tables. To look at a different table, choose " "Tables from the Navigate menu. Then " "double-click on the table, or select it and click the Open button." msgstr "" "Jede Datenbank besteht aus einer Reihe von Tabellen. Um eine andere Tabelle " "zu betrachten, wählen Sie Tabellen aus dem Menü " "Navigation. Dann führen Sie einen Doppelklick auf die " "Tabelle aus oder wählen Sie diese aus und klicken auf den Knopf " "Öffnen." #: C/glom.xml:222(title) msgid "Navigating to a Table" msgstr "Navigieren zu einer Tabelle" #: C/glom.xml:229(phrase) msgid "Navigating to a Table." msgstr "Navigieren zu einer Tabelle." #: C/glom.xml:238(title) msgid "Viewing and Entering Data" msgstr "Betrachten und Eingeben von Daten" #: C/glom.xml:239(para) msgid "" "When in Data Mode, you can view or enter information in " "either the List or Details view." msgstr "" "Im Datenmodus können Sie Informationen entweder in der " "Listenansicht oder Detailansicht " "eingeben." #: C/glom.xml:242(title) C/glom.xml:248(title) msgid "The List View" msgstr "Die Listenansicht" #: C/glom.xml:243(para) msgid "" "The List view shows many records at once and usually shows only the most " "important fields." msgstr "" "Die Listenansicht zeigt sehr viele Datensätze gleichzeitig und zeigt " "üblicherweise nur die wichtigsten Felder an." #: C/glom.xml:244(para) C/glom.xml:267(para) msgid "" "When you enter data into a field it will be saved into the database " "immediately after you finish editing the field. If it is a date or time " "field then the data format will be checked for you." msgstr "" "Wenn Sie in ein Feld Daten eingeben, werden diese unmittelbar in der " "Datenbank gespeichert, sobald Sie die Eingabe in diesem Feld beendet haben. " "Falls es sich um ein Feld mit Datums-oder Zeitangaben handelt, werden diese " "Daten für Sie überprüft." #: C/glom.xml:245(para) msgid "" "To create a new record just click the New button, or " "start typing into a field in the last empty row. A new record row will be " "created with blank fields for you to fill in." msgstr "" "Um einen neuen Datensatz zu erstellen, klicken Sie auf den Knopf " "Neu, oder beginnen Sie mit der Eingabe in einem Feld in " "der letzten leeren Zeile. Eine Zeile mit leeren Feldern für einen neuen " "Datensatz wird erstellt, die Sie nun ausfüllen können." #: C/glom.xml:255(phrase) msgid "The List View." msgstr "Die Listenansicht." #: C/glom.xml:261(para) msgid "" "To sort the records just click on a column header. For instance, you could " "might click on a date column to list invoices in order of their date, and " "click again to list them in reverse order." msgstr "" "Um die Datensätze zu sortieren, klicken Sie einfach auf den Spaltenkopf. " "Beispielsweise könnten Sie auf eine Datumsspalte klicken, um die Liste der " "Eingänge nach Datum zu sortieren. Wenn Sie anschließend erneut darauf " "klicken, wird die Reihenfolge der Liste umgekehrt." #: C/glom.xml:265(title) C/glom.xml:271(title) msgid "The Details View" msgstr "Die Detailansicht" #: C/glom.xml:266(para) msgid "" "The details view shows only one record and usually shows all the fields " "arranged suitably." msgstr "" "Die Detailansicht zeigt nur einen Datensatz und stellt alle Felder in " "sinnvoller Anordnung dar." #: C/glom.xml:268(para) msgid "" "To create a new record just click the New button. A new " "record will be created with blank fields for you to fill in." msgstr "" "Um einen neuen Datensatz zu erstellen, klicken Sie auf den Knopf " "Neu. Ein neuer Datensatz mit leeren Feldern wird " "angelegt, welche Sie ausfüllen können." #: C/glom.xml:278(phrase) msgid "The Details View." msgstr "Die Detailansicht." #: C/glom.xml:289(title) msgid "Finding Data" msgstr "Daten suchen" #: C/glom.xml:290(para) msgid "" "Choose Find Mode from the Mode menu. The fields in the " "List and Details views will now be empty, and a Find button will appear at " "the bottom of the window." msgstr "" "Wählen Sie den Suchmodus aus dem Menü Modus. Die Felder in der Listen- und Detailansicht werden nun leer sein. " "Außerdem erscheint ein Suchen-Knopf am unteren Rand " "des Fensters." #: C/glom.xml:291(para) msgid "" "Enter information, or part of the information, into a field to find records " "with that information in that field. For instance, enter Jim into a name " "field to find records with \"Jim\" or \"Jimmy\" in the name." msgstr "" "Geben Sie Informationen oder Teile von Informationen in ein Feld ein, um " "Datensätze zu finden, welche die angegebene Information in diesem Feld " "enthalten. Geben Sie beispielsweise »Jim« in einem Namensfeld ein, um " "Datensätze zu finden, die in diesem Feld »Jim« oder »Jimmy« im Namen " "enthalten." #: C/glom.xml:292(para) msgid "" "When you press the Find button, Glom will search for " "records and then display them. If only one record is found then it will show " "you that record in the Details view. If several records are found then it " "will show you those records in the List view." msgstr "" "Wenn Sie auf den Knopf Suchen klicken, sucht Glom " "nach Datensätzen und zeigt diese an. Wenn nur ein Datensatz gefunden wurde, " "wird dieser in der Detailansicht angezeigt. Falls mehrere Datensätze " "gefunden wurden, werden diese in der Listenansicht angezeigt." #: C/glom.xml:297(title) msgid "Printing Reports" msgstr "Drucken von Berichten" #: C/glom.xml:298(para) msgid "" "If your database developer has defined some reports for a table then you " "will seem them listed in the Reports menu. Just choose " "the report from the menu to create the report. If you have previously " "performed a search then the report will contain only the currently-found " "data. Otherwise it will contain all data in the current report. Remember " "that each table has its own reports so you may need to switch to the " "relevant table to use a particular report." msgstr "" "Falls der Entwickler Ihrer Datenbank Berichte für eine Tabelle festgelegt " "hat, dann erscheinen diese möglicherweise im Menü Berichte. Wählen Sie zur Erstellung eines Berichts den gewünschten Eintrag " "im Menü aus. Falls Sie vorher bereits eine Suche ausgeführt haben, dann wird " "der Bericht nur die aktuell gefundenen Daten anzeigen. Anderenfalls werden " "alle Daten im aktuellen Bericht erscheinen. Beachten Sie, dass es für jede " "Tabelle eigene Berichte gibt. Sie werden daher zu der entsprechenden Tabelle " "wechseln müssen, um einen bestimmten Bericht erstellen zu können." #: C/glom.xml:301(title) msgid "A report" msgstr "Ein Bericht" #: C/glom.xml:308(phrase) msgid "A report." msgstr "Ein Bericht." #: C/glom.xml:320(title) msgid "Using Glom as a Developer" msgstr "Glom als Entwickler benutzen" #: C/glom.xml:321(para) msgid "" "When you create a new document, Glom will be in the Developeruser level. You can also change to the Developer " "user level after opening an existing document, with the User Level menu. Glom will only allow this if the administrator has allowed it." msgstr "" "Wenn Sie ein neues Dokument anlegen, befindet sich Glom in der " "Entwickler-Ebene. Sie können nach dem " "Öffnen eines vorhandenen Dokuments mit Hilfe des Menüs " "Benutzerebene in die Entwicklerebene wechseln. Das ist " "Ihnen nur dann gestattet, wenn Ihr Systemverwalter dies erlaubt hat." #: C/glom.xml:324(title) msgid "Adding Tables" msgstr "Tabellen hinzufügen" #: C/glom.xml:325(para) msgid "" "You can see the list of existing tables by choosing Tables from the Navigate menu. You will also see this " "window after connecting to a database server, after creating a new document. " "To create a new table, click the Add button and enter the " "name for the new table. Glom will suggest a human-readable title for this " "table. Operators will see this title instead of the " "actual table name. You can also mark a tables as hidden " "from Operators. For instance, Operators should see \"Invoice Lines\" as " "related records from the \"Invoices\" table, but they should never be able " "to navigate directly to the \"Invoice Lines\" table." msgstr "" "Wenn Sie Tabellen im Menü Navigation " "wählen, wird eine Liste der vorhandenen Tabellen angezeigt. Dieses Fenster " "erscheint auch dann, wenn nach dem Anlegen eines neuen Dokuments eine " "Verbindung zu einem Datenbankserver hergestellt wurde. Um eine neue Tabelle " "anzulegen, klicken Sie auf den Knopf Hinzufügen und " "geben Sie den Namen der neuen Tabelle ein. Glom wird Ihnen einen " "menschenlesbaren Namen für diese Tabelle vorschlagen. Als Operator sehen Sie diesen Namen anstelle des Namens der aktuellen Tabelle. " "Sie können auch Tabellen als verborgen für Operatoren " "markieren. Beispielsweise sollen Operatoren zwar die »Rechnungszeilen« als " "Bezugsdatensätze aus der Tabelle »Rechnungen« sehen können, allerdings " "niemals die Möglichkeit erhalten, direkt zur Tabelle »Rechnungszeilen« zu " "navigieren." #. TODO: screenshot #: C/glom.xml:327(para) msgid "" "You can also specify one table as the default table. This " "table will be shown whenever an operator opens an existing document, without " "asking him to select a table from the list." msgstr "" "Sie können auch eine Tabelle als Vorgabetabelle " "markieren. Diese Tabelle wird immer dann angezeigt, wenn ein Operator ein " "vorhandenes Dokument öffnet, ohne dass er darum gebeten wird, eine Tabelle " "aus einer Liste zu wählen." #: C/glom.xml:328(para) msgid "You can also use this window to rename an existing table." msgstr "" "Sie können dieses Fenster auch dazu verwenden, eine vorhandene Tabelle " "umzubenennen." #: C/glom.xml:329(para) msgid "Click the Open button to look at the selected table." msgstr "" "Klicken Sie auf den Knopf Öffnen, um die ausgewählte " "Tabelle zu betrachten." #: C/glom.xml:333(title) C/glom.xml:339(title) msgid "Editing Fields" msgstr "Bearbeiten von Feldern" #: C/glom.xml:334(para) msgid "" "Choose Fields from the Developer menu. " "This shows the list of fields in the table. New tables automatically have a " "primary key field, but you can change this field if necessary." msgstr "" "Wählen Sie Felder im Menü Entwickler. Daraufhin wird Ihnen eine Liste der Felder in dieser Tabelle " "angezeigt. Neue Tabellen erhalten automatisch ein Feld für den " "Primärschlüssel. Bei Bedarf können Sie dieses Feld ändern." #: C/glom.xml:335(para) msgid "" "Click the Add button to add a new field, then enter the " "name of the new field. Glom will guess an appropriate human-readable title " "for this field, but you can edit this. Operators will see " "this title instead of the actual field name." msgstr "" "Klicken Sie auf den Knopf Hinzufügen, um ein neues " "Feld hinzuzufügen. Glom wird Ihnen einen menschenlesbaren Namen für dieses " "Feld vorschlagen, aber Sie können diesen Namen auch ändern. Als " "Operator sehen Sie diesen Namen anstelle des Namens des " "aktuellen Feldes." #: C/glom.xml:336(para) msgid "" "To specify more field details, select the field and click the " "Details button." msgstr "" "Um für ein Feld weitere Details festzulegen, wählen Sie das Feld aus und " "klicken Sie auf den Knopf Details." #: C/glom.xml:346(phrase) msgid "Editing the table's fields." msgstr "Bearbeiten der Tabellenfelder." #: C/glom.xml:354(title) msgid "Primary Keys" msgstr "Primärschlüssel" #: C/glom.xml:355(para) msgid "" "Each table must have one, and only one, Primary Key. The " "value in this field will be unique, meaning that each value in this field " "will appear in only one record in the table. For instance, each record in a " "\"Customers\" table would have a \"Customer ID\". This value will be used to " "refer to that customer from other tables, such as \"Projects\" and \"Invoices" "\" records. See the Creating " "Relationships section to see how you can relate tables together." msgstr "" "Jede Tabelle muss genau einen Primärschlüssel haben. Der " "Wert in diesem Feld ist eindeutig, was bedeutet, dass der Wert dieses Feldes " "nur in einem Datensatz in der Tabelle erscheinen darf. Beispielsweise hat " "jeder Datensatz in einer »Kunden«-Tabelle eine »Kundennummer«. Dieser Wert " "wird dazu verwendet, um einen Bezug dieses Kunden zu anderen Tabellen " "herzustellen, zum Beispiel zu den Datensätzen »Aufträge« und »Rechnungen«. " "Im Abschnitt Erstellen von " "Beziehungen finden Sie weitere Informationen darüber, wie Sie Bezüge " "von Tabellen zueinander erstellen können." #: C/glom.xml:359(title) msgid "Field Types" msgstr "Feldtypen" #: C/glom.xml:362(simpara) msgid "Number" msgstr "Zahl" #: C/glom.xml:363(simpara) msgid "Text" msgstr "Text" #: C/glom.xml:364(simpara) msgid "Date" msgstr "Datum" #: C/glom.xml:365(simpara) msgid "Time" msgstr "Zeit" #: C/glom.xml:366(simpara) msgid "Boolean - either true or false" msgstr "Boolesche Werte - entweder wahr oder falsch" #: C/glom.xml:367(simpara) msgid "Image" msgstr "Bild" #: C/glom.xml:360(para) msgid "Glom offers a few simple field types: " msgstr "Glom bietet einige einfache Feldtypen: " #: C/glom.xml:373(title) msgid "Calculated Fields" msgstr "Berechnete Felder" #: C/glom.xml:374(para) msgid "" "Field values can be calculated in terms of other fields, using the Python " "programming language. This calculation should be the implementation of a " "python function, which should return a value. The return value will be used " "as the value of the field. This value will be recalculated every time one of " "the source fields changes. TODO: This only works for default values at the " "moment, and you can not use field values in the calculation yet." msgstr "" "Die Werte von Feldern können mit Hilfe der Programmiersprache Python durch " "Ausdrücke in anderen Feldern definiert werden. Die Berechnung sollte die " "Implementation einer Python-Funktion sein, die einen Wert zurückgibt. Der " "Rückgabewert wird dann als Wert für dieses Feld verwendet. Der Wert wird neu " "berechnet, sobald sich eines der Quellfelder ändert. Achtung: Derzeit " "funktioniert dies nur für Vorgabewerte. Sie können in der Berechnung noch " "keine Feldwerte verwenden." #: C/glom.xml:375(para) msgid "" "You can also use calculations to specify a default value for fields, by " "selecting the Default Value tab in the Field " "Details window, clicking on the Calculate Value " "check box, and then entering a Python calculation. You can test this " "calculation in the Edit window." msgstr "" "Sie können auch Berechnungen verwenden, um einen Vorgabewert für ein Feld " "anzugeben. Wählen Sie hierzu den Reiter Vorgabewert im " "Fenster Felddetails. Aktivieren Sie das Ankreuzfeld " "Wert berechnen und geben Sie anschließend eine Python-" "Berechnung ein. Sie können diese Berechnung im Fenster Bearbeiten überprüfen." #: C/glom.xml:381(title) msgid "Arranging Layouts" msgstr "Erzeugung von Layouts" #: C/glom.xml:382(para) msgid "" "Each table has List and Details views, " "and by default these show all fields in the table, in order of creation. You " "can edit the layout by choosing Layout from the " "Developer menu." msgstr "" "Jede Tabelle hat eine Listenansicht und eine " "Detailansicht. Als Vorgabe zeigen diese alle Felder in " "einer Tabelle an, in der Reihenfolge, wie sie angelegt wurden. Sie können " "dieses Layout ändern, indem Sie Layout aus dem Menü " "Entwickler wählen." #: C/glom.xml:385(title) msgid "Arranging the List View" msgstr "Anordnen der Listenansicht" #: C/glom.xml:386(para) msgid "" "For the List view, you can specify the sequence of field " "columns, and whether some fields are hidden." msgstr "" "Für die Listenansicht können Sie die Reihenfolge der " "angezeigten Spalten angeben, sowie ob einige Felder verborgen werden sollen." #: C/glom.xml:389(title) msgid "Editing the List Layout" msgstr "Bearbeiten der Listenansicht" #: C/glom.xml:396(phrase) msgid "Editing the list layout." msgstr "Bearbeiten der Listenansicht." #: C/glom.xml:404(title) msgid "Arranging the Details View" msgstr "Festlegen der Anordnung der Detailansicht" #: C/glom.xml:405(para) msgid "" "For the Details view, you can create groups of fields, " "and give these groups titles. You can then place fields in these groups and " "specify the sequence fo fields in these groups. You can also specify the " "sequence of these groups. For instance, in a \"Contacts\" table, you might " "create a \"Name\" group, and place the \"title\", \"first_name\" and " "\"last_name\" fields in that group. You might have other groups for the " "\"Address\" fields." msgstr "" "Für die Detailansicht können Sie Gruppen von Feldern " "anlegen und diese mit einem Titel versehen. Sie können Felder in diesen " "Gruppen platzieren und die Abfolge der Felder in diesen Gruppen angeben. Sie " "können auch die Reihenfolge dieser Gruppen festlegen. Sie könnten " "beispielsweise in einer Tabelle namens »Kontakte« eine Gruppe »Name« anlegen " "und die Felder »Titel«, »Vorname« und »Nachname« in diese Gruppe einfügen. " "Für die »Adresse«-Felder könnten Sie dann wiederum andere Gruppen verwenden." #: C/glom.xml:408(title) msgid "Editing the details Layout" msgstr "Bearbeiten der Detailansicht" #: C/glom.xml:415(phrase) msgid "Editing the Details Layout." msgstr "Bearbeiten der Detailansicht." #: C/glom.xml:425(title) msgid "Creating Relationships" msgstr "Erstellen von Beziehungen" #: C/glom.xml:426(para) msgid "" "Tables in the Database are often related together. For instance, an " "\"Invoices\" table might have a \"Customer ID\" field. A value in this field " "would specify a record in the \"Customers\" table with the same value. Glom " "can show extra information, such as the customer name, from that related " "record. Or it can show a list of several related records - for instance, " "several related \"Invoice Lines\" that are related to a record in the " "\"Invoice\" record." msgstr "" "Zwischen den Tabellen in einer Datenbank bestehen oft Beziehungen. " "Beispielsweise gibt es in einer »Rechnungen«-Tabelle ein Feld namens " "»Kundennummer«. Der Wert in einem solchen Feld gibt einen Datensatz in der " "Tabelle »Kunden« mit dem gleichen Wert an. Glom kann aus dem Bezugsdatensatz " "weitere Informationen anzeigen, wie den Namen des Kunden. Anzeigbar ist auch " "eine Liste verschiedener Bezugsdatensätze, zum Beispiel »Rechnungszeilen«, " "die einen Bezug zum Datensatz in der Tabelle »Rechnungen« haben." #: C/glom.xml:427(para) msgid "" "To create relationships, choose Relationships from the " "Developer menu. This will show the list of existing " "relationships. Click the Add button to create a new " "relationship, and enter a name for it. You should then choose a field in the " "current table, and a field in another table to which it should be related. " "This relationship will find any records in the other table for which the " "values in both fields are equal." msgstr "" "Um Beziehungen zu erstellen, wählen Sie Beziehungen im " "Menü Entwickler. Daraufhin wird eine Liste der " "vorhandenen Beziehungen angezeigt. Klicken Sie auf den Knopf " "Hinzufügen, um eine neue Beziehung zu erstellen und " "geben Sie einen Namen für die Beziehung ein. Sie sollten dann ein Feld in " "der aktuellen Tabelle wählen und ein Feld in einer weiteren Tabelle, für " "welches die Beziehung erstellt werden soll. Diese Beziehung findet beliebige " "Datensätze in der anderen Tabelle, für die die Werte in beiden Feldern " "gleich sind." #: C/glom.xml:432(simpara) msgid "To show a related field on the List or Details view." msgstr "Anzeige eines Bezugsfeldes in der Listen- oder Detailansicht." #: C/glom.xml:433(simpara) msgid "To show a list of related records on the Details view." msgstr "Anzeige einer Liste von Bezugsdatensätzen in der Detailsansicht." #: C/glom.xml:434(simpara) msgid "" "To lookup a value from a field in a related record. For instance, to copy " "the current price of a \"Product\" into the \"Price\" field of an \"Invoice " "Line\" record." msgstr "" "Nachschlagen eines Wertes für ein Feld in einem Bezugsdatensatz. " "Beispielsweise um den aktuellen Preis eines »Produkts« in einem »Preis«-Feld " "eines »Rechnungszeilen«-Datensatzes zu kopieren." #: C/glom.xml:435(simpara) msgid "To calculate a field value." msgstr "Berechnung eines Feldwertes." #. TODO: screenshot #: C/glom.xml:429(para) msgid "You can use the relationship in the following places. " msgstr "" "Sie können die Beziehung an den folgenden Stellen verwenden. " #: C/glom.xml:441(title) msgid "Users Administration" msgstr "Benutzer-Administration" #: C/glom.xml:442(para) msgid "" "To define the Operators who can use your database, and to " "specify what access they have to the various tables, choose Users from the Developer menu." msgstr "" "Um die Operatoren festzulegen, welche die Datenbank " "nutzen dürfen, und um anzugeben, welche Zugriffsrechte sie zu den " "verschiedenen Tabellen erhalten sollen, wählen Sie Benutzer im Menü Entwickler." #: C/glom.xml:447(title) C/glom.xml:454(title) msgid "Translations" msgstr "Übersetzungen" #: C/glom.xml:448(para) msgid "" "Glom's user interface (and this document) is translated into several " "languages, as you should see already if you are using your computer with a " "non-English user interface. In addition, Glom automatically shows and " "understands numbers and dates according to the current user's local " "conventions. For instance, a user in the USA might enter a price as 1.99 and " "a date as 1/13/2008, but a German user of the same database will later see " "that as 1,99 and 13.1.2008." msgstr "" "Die Benutzeroberfläche von Glom (wie auch dieses Dokument) wurde in " "verschiedene Sprachen übersetzt, wie Sie möglicherweise sehen können, wenn " "Sie Ihren Rechner mit einer nicht-englischen Benutzeroberfläche verwenden. " "Zusätzlich zeigt Glom Daten und Zahlen entsprechend den lokalen Konventionen " "des Benutzers an. Ein Benutzer in den USA würde beispielsweise einen Preis " "als 1.99 und ein Datum als 1/13/2008 angezeigt bekommen, während ein " "deutscher Benutzer der gleichen Datenbank den Preis als 1,99 und das Datum " "als 13.1.2008 sehen würde." #: C/glom.xml:449(para) msgid "" "However, the Glom system that you create also contains text that must be " "translated if it will be used by people who speak different languages. For " "instance, you must provide translations for the titles of your tables, " "fields, and reports. All of these text items can be seen in a list when you " "choose Translations from the Developer " "menu. In this window you can specify the language that you used for the " "original text, and enter translations for each text item for additional " "languages. When the Glom system is opened by a user of that language then " "these text items will be shown in the user interface." msgstr "" "Das von Ihnen erstellte Glom-System wird sicherlich Text enthalten, der " "übersetzt werden muss, sofern es von Benutzern verwendet werden soll, die " "nicht die gleiche Sprache sprechen. Beispielsweise werden Sie übersetzte " "Versionen für die Namen Ihrer Tabellen, die Felder und die Berichte " "benötigen. Alle diese Textobjekte sehen Sie zusammengefasst in einer Liste, " "wenn Sie Übersetzungen im Menü Entwickler wählen. In diesem Fenster können Sie angeben, in welcher Sprache " "der Originaltext verfasst wurde. Außerdem können Sie hier Übersetzungen für " "jedes Textobjekt in weiteren Sprachen einfügen. Wenn das Glom-System von " "einem Benutzer der jeweiligen Sprache geöffnet wird, dann werden diese " "Textobjekte in der Benutzeroberfläche angezeigt." #: C/glom.xml:461(phrase) msgid "Translations." msgstr "Übersetzungen." #: C/glom.xml:467(para) msgid "" "Experienced translators may be more familiar with the .po file format, or " "you might wish to use the many tools that work with the .po file format. By " "using the Export button you can create a .po file to use " "in a separate tool or to send to a translator. You can then import the " "resulting translation by using the Import button." msgstr "" "Erfahrene Übersetzer dürften mit dem .po-Dateiformat keine Schwierigkeiten " "haben. Es gibt verschiedene Werkzeuge, die mit diesem Dateiformat umgehen " "können. Durch Anklicken des Knopfes Exportieren " "erstellen Sie eine .po-Datei, die Sie einem separaten Werkzeug " "weiterbearbeiten oder an einen Übersetzer schicken können. Die resultierende " "Übersetzung können Sie dann mit dem Knopf Importieren " "wieder in das System einfügen." #: C/glom.xml:472(title) msgid "Defining Reports" msgstr "Anfertigen von Berichten" #: C/glom.xml:475(title) msgid "Adding or Editing Reports" msgstr "Hinzufügen oder Bearbeiten von Berichten" #: C/glom.xml:477(para) msgid "" "Glom can produce reports to show specific fields for sets of records, sorted " "and grouped. For instance, a shop might need a report listing all products " "sold in one month, grouped by product type, and sorted by price inside each " "group. Each table has its own reports, which are available to the operator " "from the Reports menu." msgstr "" "Glom kann Berichte erstellen, um spezifische Felder aus einer Reihe von " "Datensätzen sortiert und gruppiert anzuzeigen. Beispielsweise möchte ein " "Händler einen Bericht über alle innerhalb eines Monats verkauften Produkte " "anzeigen, gruppiert nach Produktart und innerhalb jeder Gruppe nach Preisen " "sortiert. Jede Tabelle verfügt über ihre eigenen Berichte, die für den " "Operator im Menü Berichte einsehbar sind." #: C/glom.xml:479(para) msgid "" "To define a report, or to change the definition of an existing report, " "choose Reports from the Developer menu." msgstr "" "Um einen Bericht anzulegen oder die Eigenschaften eines vorhandenen Berichts " "zu ändern, wählen Sie Berichte im Menü " "Entwickler." #: C/glom.xml:481(title) msgid "Creating or Editing Reports" msgstr "Erzeugen oder Bearbeiten von Berichten" #: C/glom.xml:488(phrase) msgid "Creating or editing reports." msgstr "Erstellen oder Bearbeiten von Berichten." #: C/glom.xml:494(para) msgid "" "Notice that each report has an ID as well as a human-readable name. This " "allows your report to have a translated title when used on a computer that " "uses a different language." msgstr "" "Beachten Sie, dass jeder Bericht sowohl eine Kennung als auch einen " "menschenlesbaren Namen hat. Dies ermöglicht die Anzeige eines übersetzten " "Namens, falls der Bericht auf einem Rechner in einer anderen Sprache genutzt " "wird." #: C/glom.xml:499(title) C/glom.xml:513(title) msgid "Editing a Report" msgstr "Bearbeiten eines Berichts" #: C/glom.xml:503(simpara) msgid "The Header, which appears at the start of the report" msgstr "Die Kopfzeile, welche am Beginn des Berichts erscheint." #: C/glom.xml:504(simpara) msgid "" "The Main area, in which the records and summary lines are shown, with the " "actual data from the database." msgstr "" "Der Hauptteil, in welchem die Datensätze und die Zeilen der Zusammenfassung " "erscheinen, mit den aktuellen Daten aus der Datenbank." #: C/glom.xml:505(simpara) msgid "The Footer, which appears at the end of the report." msgstr "Die Fußzeile, welche am Ende des Berichts erscheint." #: C/glom.xml:501(para) msgid "A Glom report has three areas: " msgstr "Ein Glom-Bericht gliedert sich in drei Bereiche: " #: C/glom.xml:509(para) msgid "" "Inside an area, such as the Main part, you may add report Parts, such as fields, text, or images. These will usually appear in a " "row on the printed report, with one row for each record. In the simple case, " "this will look much like Glom's list view. You can add parts to your report " "by selecting them from the Available Parts list and then " "clicking the Add button. The part will then be added to " "the Parts list, in the selected area." msgstr "" "Innerhalb eines Bereiches, wie dem Hauptteil, können Sie Teile einfügen, wie Felder, Text, oder Bilder. Diese erscheinen " "üblicherweise in einer Zeile in dem ausgedruckten Bericht, mit einer Zeile " "für jeden Datensatz. Im einfachsten Fall wird dies der Listenansicht von " "Glom stark ähneln. Sie können Teile zu Ihrem Bericht hinzufügen, indem Sie " "sie aus der Liste Verfügbare Teile auswählen und dann " "auf den Knopf Hinzufügen klicken. Der Teil wird dann " "zur Teileliste im ausgewählten Bereich hinzugefügt." #: C/glom.xml:510(para) msgid "" "To specify details for the parts, such as the text or image to display, or " "to choose the field to display, select the part in the Parts list and click the Edit button. You may also " "specify field formatting by clicking the Formatting " "button, just as you would when defining a details or list layout." msgstr "" "Um Details zu den Teilen anzugeben, wie den Text oder das anzuzeigende Bild, " "oder umdas anzuzeigende Feld auszuwählen, wählen Sie den Teil in der " "Teileliste aus und klicken Sie auf den Knopf " "Hinzufügen. Sie können auch mit dem Knopf " "Formatierung die Feldformatierung anpassen, wenn Sie " "ein Detail- oder Listenlayout angeben wollen." #: C/glom.xml:520(phrase) C/glom.xml:537(phrase) msgid "Editing a report." msgstr "Bearbeiten eines Berichts." #: C/glom.xml:526(para) msgid "" "Some parts may contain other parts and have extra properties to control how " "they present their child parts. For instance, the Group By part groups records together by a field. For instance, a products " "report might group a list of products by product type. You can even add a " "second sub-grouping inside the main Group By part, by " "selecting your top-level Group By part in the " "Parts list while adding a new Group By " "part from the Available Parts list. For instance, you " "might group your products by manufacturer, inside each product type group." msgstr "" "Einige Teile können weitere Teile enthalten sowie Eigenschaften zur " "Steuerung, wie diese Unterteile angezeigt werden. Beispielsweise gruppiert " "der Teil Gruppieren nach die Datensätze anhand der " "Felder. Oder ein Produktbericht gruppiert eine Produktliste nach Produkttyp. " "Sie können sogar eine zweite Untergruppierung innerhalb des Hauptteils " "Gruppieren nach einfügen. Wählen Sie hierzu den " "Gruppieren nach-Hauptteil der obersten Ebene in der " "Teileliste aus und fügen Sie einen neuen " "Gruppieren nach-Teil aus der Liste Verfügbare " "Teil hinzu. Sie könnten so beispielsweise Ihre Produkte innerhalb " "jeder Produkttypgruppe nach Hersteller gruppieren." #: C/glom.xml:527(para) msgid "" "To specify the field by which the records should be grouped, select your " "Group By part in the Parts list and " "click the Edit button. You can then choose the field by " "which the records should be grouped, and select the fields by which these " "records should be sorted within the group. You may also specify some " "additional fields to be displayed in the group's title row. For instance, " "you might want to group products by a manufacturer ID, but also show the " "manufacturer name." msgstr "" "Um das Feld festzulegen, nach dem die Datensätze gruppiert werden sollen, " "wählen Sie Ihren Gruppieren nach-Teil aus der " "Teileliste aus und klicken Sie auf den Knopf " "Bearbeiten. Anschließend können Sie dann das Feld " "auswählen, nach dem die Datensätze gruppiert werden sollen, sowie die " "Felder, nach denen diese Datensätze innerhalb der Gruppe sortiert werden " "sollen. Außerdem können Sie zusätzliche Felder angeben, die in der " "Titelzeile der Gruppe angezeigt werden sollen. Auf diese Weise könnten Sie " "zum Beispiel Produkte anhand der Herstellerkennung gruppieren, aber trotzdem " "den Herstellernamen anzeigen." #: C/glom.xml:530(title) msgid "Editing a Group By Part" msgstr "Bearbeiten eines Gruppieren nach-Teils" #: C/glom.xml:543(para) msgid "" "The Vertical Group part may contain other items. For " "instance, it allows you to arrange fields below each other instead of just " "one after the other in the horizontal row. This is useful for grouping " "related fields such as address lines, or just to squeeze more information " "into the records's row on the report." msgstr "" "Der Teil Vertikale Gruppe kann weitere Objekte " "enthalten. Er erlaubt Ihnen beispielsweise die Anordnung von Feldern " "untereinander anstelle von waagerecht hintereinander in einer Zeile. Dies " "könnte zur Gruppierung von aufeinander bezogenen Feldern nützlich sein, oder " "einfach nur, um mehr Informationen in der Zeile des Datensatzes im Bericht " "anzuzeigen." #: C/glom.xml:546(title) msgid "A Report with Vertical Groups" msgstr "Ein Bericht mit vertikalen Gruppen" #: C/glom.xml:553(phrase) msgid "A Report with Vertical Groups." msgstr "Ein Bericht mit vertikalen Gruppen." #: C/glom.xml:559(para) msgid "" "When you have finished, click the Close button to save " "the report's definition. Your report can then be chosen from the " "Reports menu. See the Printing Reports section for more details." msgstr "" "Wenn Sie dies beendet haben, klicken Sie auf den Gruppieren nach-Knopf, um die Berichtsdefinition zu speichern. Ihr Bericht steht " "dann im Menü Berichte zur Verfügung. Weitere " "Informationen hierzu finden Sie im Abschnitt Drucken von Berichten." #: C/glom.xml:573(title) msgid "Dialogs" msgstr "Dialoge" #: C/glom.xml:576(title) msgid "Dialog: Initial dialog" msgstr "Dialog: Startdialog" #: C/glom.xml:577(para) msgid "" "This dialog allows the user to choose an existing document or create a new " "document. Existing documents may be selecting from the list of recently " "opened documents or by select a file with the file chooser dialog. Documents " "can also be opened via the network if other users are running Glom on the " "local network. Finally, a new document can be created either by opening a " "template file which already contains some initial tables and records, or by " "creating an empty document." msgstr "" "Dieser Dialog ermöglicht dem Benutzer die Auswahl eines vorhandenen oder das " "Anlegen eines neuen Dokuments. Vorhandene Dokumente können Sie aus der Liste " "der kürzlich geöffneten Dokumente auswählen. Alternativ können Sie eine " "Datei im Dateiauswahldialog auswählen. Dokumente können auch über das " "Netzwerk geöffnet werden, falls andere Benutzer Glom im lokalen Netzwerk " "ausführen. Letztendlich kann ein neues Dokument auch entweder durch Öffnen " "einer vorhandenen Vorlagendatei erstellt werden, die bereits einige Tabellen " "und Datensätze enthält, oder durch Erstellen eines leeren Dokuments." #: C/glom.xml:581(title) msgid "Dialog: New database" msgstr "Dialog: Neue Datenbank" #: C/glom.xml:586(title) msgid "Dialog: Create database" msgstr "Dialog: Datenbank anlegen" #: C/glom.xml:591(title) msgid "Dialog: Connection" msgstr "Dialog: Verbindung" #: C/glom.xml:592(para) msgid "" "This dialog requests a user name and password for connection to a database " "server. This is usually not the same username and password combination with " "which you log in to your system. All Glom systems require a database server " "on which the actual data will be stored. If the database server is not " "running on your local computer (\"localhost\"), then you must also provide " "its network hostname, such as \"glomserver.openismus.com\", though your " "hostname will be different." msgstr "" "Dieser Dialog erfragt den Benutzernamen und das Passwort für eine Verbindung " "zu einem Datenbankserver. Dies sind üblicherweise nicht der Benutzername und " "das Passwort, mit dem Sie sich am System anmelden. Alle Glom-Systeme " "benötigen einen Datenbankserver, auf dem die aktuellen Daten gespeichert " "werden. Falls dieser Datenbankserver nicht auf Ihrem lokalen Rechner läuft " "(»localhost«), dann müssen Sie außerdem den Namen des entsprechenden " "Rechners im Netzwerk angeben, wie »glomserver.openismus.com«, als Beispiel." #: C/glom.xml:593(para) msgid "Your system administrator can provide these database login details." msgstr "Ihr Systemverwalter kann die folgenden Anmeldedetails bereitstellen." #: C/glom.xml:594(para) msgid "" "If you are the system administrator, see Glom's Postgres Configuration web page for help with installing and " "configuring a database server." msgstr "" "Falls Sie selbst der Systemverwalter sind, finden Sie auf der Glom-Webseite zur PostgreSQL-Konfiguration Hilfe zur " "Installation und Konfiguration eines Datenbankservers." #: C/glom.xml:598(title) msgid "Dialog: Connection Error" msgstr "Dialog: Verbindungsfehler" #: C/glom.xml:599(para) msgid "" "This dialog is shown when Glom could not connect to the specified database " "server. Either the database server is not running at the specified hostname, " "or the user name and password were not accepted by the database server. See " "the Connection Dialog section for " "more details." msgstr "" "Dieser Dialog wird angezeigt, wenn Glom keine Verbindung zu dem angegebenen " "Datenbankserver aufbauen konnte. Entweder läuft der Datenbankserver auf dem " "Rechner dieses Namens nicht oder der Benutzername und das Passwort wurden " "vom Datenbankserver nicht anerkannt. Weitere Informationen hierzu finden Sie " "im Abschnitt Verbindungsdialog" #: C/glom.xml:605(title) msgid "Dialog: Database preferences" msgstr "Dialog: Datenbankeinstellungen" #: C/glom.xml:610(title) msgid "Dialog: Change language" msgstr "Dialog: Ändern der Spracheinstellungen" #: C/glom.xml:615(title) msgid "Window: Textobject" msgstr "Fenster: Textobjekt" #: C/glom.xml:620(title) msgid "Window: Imageobject" msgstr "Fenster: Bildobjekt" #: C/glom.xml:625(title) msgid "Dialog: Notebook" msgstr "Dialog: Reitermappen" #: C/glom.xml:630(title) msgid "Dialog: Data invalid format" msgstr "Dialog: Ungültige Formatierung" #: C/glom.xml:635(title) msgid "Dialog: Relationship overview" msgstr "Dialog: Überblick über Beziehungen" #: C/glom.xml:640(title) msgid "Window: Groups" msgstr "Fenster: Gruppen" #: C/glom.xml:645(title) msgid "Dialog: Group by sort fields" msgstr "Dialog: Gruppieren nach sortierten Feldern" #: C/glom.xml:650(title) msgid "Dialog: Group by secondary fields" msgstr "Dialog: Gruppieren nach sekundären Feldern" #: C/glom.xml:655(title) msgid "Window: Button script" msgstr "Fenster: Knopfskript" #: C/glom.xml:660(title) msgid "Window: Field calculation" msgstr "Fenster: Feldberechnung" #: C/glom.xml:665(title) msgid "Dialog: New group" msgstr "Dialog: Benutzer wählen" #: C/glom.xml:670(title) msgid "Dialog: Choose user" msgstr "Dialog: Benutzer wählen" #: C/glom.xml:675(title) msgid "Dialog: User" msgstr "Dialog: Benutzer" #: C/glom.xml:680(title) msgid "Dialog: Translation identify original" msgstr "Dialog: Identifizierung der Übersetzung am Original" #: C/glom.xml:685(title) msgid "Dialog: Translation copy" msgstr "Dialog: Übersetzungskopie" #: C/glom.xml:690(title) msgid "Dialog: Choose Date" msgstr "Dialog: Datum wählen" #: C/glom.xml:695(title) msgid "Dialog: Import Into Table" msgstr "Dialog: In Tabelle importieren" #: C/glom.xml:696(para) msgid "" "This dialog allows the user to import a CSV (comma separated value) file " "into the current database table. It shows the first few rows of the file to " "import and allows the user to select the target field in the database for " "each column in the CSV file. For auto-incremented primary keys, the primary " "key field cannot be used as a target field, but otherwise one column must be " "imported into the primary key field." msgstr "" "Dieser Dialog ermöglicht dem Benutzer das Importieren einer CSV-Datei (durch " "Kommata getrennte Werte) in eine Tabelle der aktuellen Datenbank. Es werden " "die ersten fünf Zeilen der zu importierenden Datei angezeigt, woraufhin der " "Benutzer das Zielfeld in der Datenbank für jede Spalte der CSV-Datei angeben " "kann. Für automatisch hochzählende Primärschlüssel kann das " "Primärschlüsselfeld nicht als Zielfeld verwendet werden, aber anderenfalls " "muss eine Spalte in das Primärschlüsselfeld importiert werden." #: C/glom.xml:719(title) msgid "About Glom" msgstr "Über Glom" #: C/glom.xml:720(para) msgid "" "Glom is maintained by Glom and GNOME community volunteers. To find more " "information about Glom, please visit the Glom Web site." msgstr "" "Glom wird von Freiwilligen der Glom- und GNOME-Gemeinschaft betreut. Weitere Informationen über " "Glom finden Sie auf dessen Webseite." #: C/glom.xml:725(para) msgid "" "To report a bug or make a suggestion regarding this application or this " "manual, you can submit them using bugzilla." msgstr "" "Um einen Fehler zu melden oder einen Vorschlag zu dieser Anwendung oder zu " "diesem Handbuch zu machen, benutzen Sie bitte das Fehlererfassungssystem von GNOME." #: C/glom.xml:731(para) msgid "" "Another excellent source of information are the Glom mailing lists." msgstr "" "Eine weitere exzellente Informationsquelle sind die Mailinglisten von Glom." #: C/glom.xml:736(para) msgid "" "This program is distributed under the terms of the GNU General Public " "license as published by the Free Software Foundation; either version 2 of " "the License, or (at your option) any later version. A copy of this license " "can be found at this link, or " "in the file COPYING included with the source code of this program." msgstr "" "Dieses Programm ist freie Software. Sie können es unter den Bedingungen der " "GNU General Public License, wie von der Free Software " "Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß " "Version 2 der Lizenz oder (nach Ihrer Option) jeder späteren Version. Eine " "Kopie der GNU General Public License finden Sie unter " "diesem Link, oder in der " "Datei COPYING, die im Quellcode dieses Programms enthalten ist." #: C/glom.xml:745(title) msgid "Concepts" msgstr "Konzepte" #: C/glom.xml:748(simpara) msgid "" "Database: Each Glom document allows access to one " "database." msgstr "" "Datenbank: Jedes Glom-Dokument ermöglicht den Zugriff auf " "eine Datenbank." #: C/glom.xml:749(simpara) msgid "" "Table: Each database contains several tables, such as " "\"Customers\" and \"Invoices\" tables." msgstr "" "Tabelle: Jede Datenbank enthält verschiedene Tabellen, " "wie z.B. »Kunden« oder »Rechnungen«." #: C/glom.xml:750(simpara) msgid "" "Field: Each table has several fields, such as \"Customer " "ID\", \"First Name\", and \"Date of Birth\" fields. In other documents and " "applications, fields are sometimes called \"Columns\"" msgstr "" "Feld: Jede Tabelle besteht aus verschiedenen Feldern, wie " "z.B. »Kundennummer«, »Vorname« oder »Geburtsdatum«. In anderen Dokumenten " "oder Anwendungen werden diese Felder manchmal »Spalten« genannt." #: C/glom.xml:751(simpara) msgid "" "Records: Each table contains several records, each of " "which has values for each of the fields. For instance, the \"Customers\" " "table will have a record for each customer. In other documents and " "applications, records are sometimes called Rows." msgstr "" "Datensätze: Jede Tabelle enthält verschiedene Datensätze, " "wovon jeder wiederum Werte für jedes der Felder enthält. Beispielsweise " "enthält die »Kunden«-Tabelle einen Datensatz für jeden Kunden. In anderen " "Dokumenten oder Anwendungen werden diese Datensätze manchmal »Zeilen« " "genannt." #: C/glom.xml:752(simpara) msgid "" "Relationships: Each table might be related to other " "tables, via fields in both tables. For instance, a \"Customers\" table could " "have a relationship to the \"Invoices\" table, so that people could see all " "the invoices for that customer. Only developers need to understand this " "concept. In other documents and applications, relationships are sometimes " "called \"Joins\"." msgstr "" "Beziehungen: Jede Tabelle kann über in beiden Tabellen " "gleiche Felder Beziehungen zu anderen Tabellen haben. Beispielsweise kann " "eine »Kunden«-Tabelle einen Bezug zu einer »Rechnungen«-Tabelle haben, so " "dass alle Rechnungen an diesen Kunden angezeigt werden können. Allerdings " "brauchen nur Entwickler dieses Konzept zu verstehen. In anderen Dokumenten " "und Anwendungen werden solche Beziehungen auch »Verknüpfungen« genannt." #: C/glom.xml:746(para) msgid "" "Glom is easy to use, but you must understand the following basic concepts. " "" msgstr "" "Glom ist recht einfach benutzbar, aber Sie sollten zunächst die folgenden " "grundlegenden Konzepte verinnerlichen. " #: C/glom.xml:758(title) msgid "Calculated fields and button scripts" msgstr "Berechnete Felder und Knopfskripte" #: C/glom.xml:759(para) msgid "" "Calculated fields and button scripts use the Python programming language. " "The calculation or script is the implementation of a function whose " "signature is provided for you." msgstr "" "Berechnete Felder und Knopfskripte verwenden die Programmiersprache Python. " "Die Berechnung oder das Skript ist die Implementierung einer Funktion, deren " "Signatur Ihnen zur Verfügung gestellt wird." #: C/glom.xml:762(title) msgid "Editing the definition of a calculated field" msgstr "Bearbeiten der Definition eines berechneten Feldes" #: C/glom.xml:769(phrase) msgid "Editing the definition of a calculated field." msgstr "Bearbeiten der Definition eines berechneten Feldes." #: C/glom.xml:776(title) msgid "Field values" msgstr "Feldwerte" #: C/glom.xml:777(programlisting) #, no-wrap msgid "record[\"name_first\"]" msgstr "record[\"name_first\"]" #: C/glom.xml:777(para) msgid "" "For instance, is the value of the name_first field in the " "current record." msgstr "" "Beispielsweise ist der Wert des Feldes name_first im " "aktuellen Datensatz." #: C/glom.xml:781(title) msgid "Related Records" msgstr "Bezugsdatensätze" #: C/glom.xml:782(programlisting) #, no-wrap msgid "record.related[\"location\"]" msgstr "record.related[\"location\"]" #: C/glom.xml:782(para) msgid "" "For instance, provides the related records for the current " "record." msgstr "" "Beispielsweise stellt die Bezugsdatensätze für den " "aktuellen Datensatz bereit." #: C/glom.xml:785(title) msgid "Single related records" msgstr "Einzelbeziehungen" #: C/glom.xml:786(programlisting) #, no-wrap msgid "record.related[\"location\"][\"name\"]" msgstr "record.related[»Ort«][»Name«]" #: C/glom.xml:786(para) msgid "" "For relationships that specify a single record, you can get the value of a " "field in that record. For instance, is the value of the " "name field in the table indicated by the location relationship (often called " "location::name)." msgstr "" "Für Beziehungen, die einen einzelnen Datensatz angeben, können Sie den Wert " "des Feldes in diesem Datensatz erhalten. Beispielsweise ist " "der Wert des »name«-Feldes in der Tabelle, die durch die Beziehung angegeben " "wird (oft als location::name bezeichnet)." #: C/glom.xml:790(title) msgid "Multiple related records" msgstr "Datensätze mit mehrfachen Bezügen" #: C/glom.xml:791(programlisting) #, no-wrap msgid "record.related[\"invoice_lines\"].sum(\"total_price\")" msgstr "record.related[\"invoice_lines\"].sum(\"total_price\")" #: C/glom.xml:791(para) msgid "" "For relationships that specify multiple records, you can use the aggregate " "functions (sum, count, average) to get overall values. For instance, " "." msgstr "" "Für Beziehungen, die mehrere Datensätze umfassen, können Sie die " "Aggregatfunktionen (sum, count, average) benutzen, um allgemeine Werte zu " "erhalten. Beispielsweise ." #: C/glom.xml:797(title) msgid "Testing for empty values" msgstr "Prüfen auf leere Werte" #: C/glom.xml:798(para) msgid "How you test for empty values depends on the type of field:" msgstr "So überprüfen Sie auf leere Werte, abhängig vom Feldtyp:" #: C/glom.xml:803(title) msgid "Non-text fields" msgstr "Nicht-Text-Felder" #: C/glom.xml:804(para) msgid "" "Non-text fields may be empty, indicating that the user has not entered any " "value in the field. For instance, Glom does not assume that an empty value " "in a numeric field should mean 0." msgstr "" "Nicht-Textfelder dürfen leer sein, was anzeigt, dass der Benutzer noch " "keinerlei Wert in dieses Feld eingegeben hat. Beispielsweise nimmt Glom " "nicht an, dass ein leerer Wert in einem numerischen Feld den Wert 0 hat." #: C/glom.xml:805(para) msgid "" "You can test whether a field is empty by using Python's None. For instance:" msgstr "" "Sie können testen, ob ein Feld leer ist, indem Sie »None« aus Python " "verwenden. Zum Beispiel:" #: C/glom.xml:807(programlisting) #, no-wrap msgid "" "\n" " if(record[\"contact_id\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" "\n" " if(record[\"contact_id\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " #: C/glom.xml:814(para) msgid "" "You might also test whether there are any related records. For instance:" msgstr "" "Sie können auch überprüfen, ob Bezugsdatensätze vorhanden sind. Zum Beispiel:" #: C/glom.xml:816(programlisting) #, no-wrap msgid "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " msgstr "" "\n" " if(record.related[\"contacts\"] == None):\n" " return \"No Contact\"\n" " else:\n" " return record.related[\"contacts\"][\"name_full\"]\n" " " #: C/glom.xml:826(title) msgid "Text fields" msgstr "Textfelder" #: C/glom.xml:827(para) msgid "" "For text fields, you should check for zero-length strings. It is not " "possible in Glom to distinguish between zero-length strings and the absence " "of any string, because there is no advantage to doing so. For instance:" msgstr "" "In Textfeldern sollten Sie prüfen, ob Zeichenketten der Länge Null vorhanden " "sind. Glom kann nicht zwischen Zeichenketten der " "Länge Null und fehlenden Zeichenketten unterscheiden, weil dies keinerlei " "Vorteile hätte. Zum Beispiel:" #: C/glom.xml:829(programlisting) #, no-wrap msgid "" "\n" " if(record[\"name_full\"] == \"\"):\n" " return \"No Name\"\n" " else:\n" " return record[\"name_full\"]\n" " " msgstr "" "\n" " if(record[\"name_full\"] == \"\"):\n" " return \"No Name\"\n" " else:\n" " return record[\"name_full\"]\n" " " #: C/glom.xml:841(title) msgid "Using the full pygda API" msgstr "Benutzung der vollen Pygda-API" #: C/glom.xml:842(para) msgid "" "pygda is a python API for the libgda API. The record's connection attribute provides a gda.connection that can be used to access the " "current database directly. This allows you to run any SQL query, for " "instance to read data from the database with a SELECT, or to change values " "in the database with an UPDATE. Note that the connection is already open so " "you can avoid the difficult work of specifying the connection details." msgstr "" "pygda ist eine Python-API zur libgda-API. Das connection-" "Attribut stellt eine gda.connection bereit, die zum direkten Zugriff auf die " "aktuelle Datenbank genutzt werden kann. Dies ermöglicht Ihnen die Ausführung " "einer SQL-Abfrage, beispielsweise zum Lesen von Daten aus der Datenbank mit " "einer SELECT-Anweisung, oder zum Ändern von Werten in der Datenbank mit " "einer UPDATE-Anweisung. Bedenken Sie, dass die Verbindung bereits offen ist, " "so dass die Eingabe der Verbindungsdetails nicht mehr erforderlich ist." #: C/glom.xml:843(para) msgid "" "The record's table_name attribute also provides the name " "of the current table." msgstr "" "Das Attribut table_name des Datensatzes stellt auch den " "Namen der aktuellen Tabelle zur Verfügung." #: C/glom.xml:844(para) msgid "" "This example reads all data from the current table and prints the values to " "the terminal:" msgstr "" "Dieses Beispiel liest alle Daten aus der aktuellen Tabelle und gibt deren " "Werte im Terminal aus:" #: C/glom.xml:846(programlisting) #, no-wrap msgid "" "\n" "# Use the current database's connection \n" "# to get all the data for the current table.\n" "#\n" "# record.connection is an already-open gda.connection object,\n" "# saving us the bother of opening the connection,\n" "# or even knowing the name of the database.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "data_model = gda.gda_execute_select_command(record.connection, query)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Number of columns: \", columns\n" "\n" "for i in range(columns):\n" " print \" column \", i;\n" " print \" name=\", data_model.get_column_title(i)\n" "\n" " # Find out whether it's the primary key:\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (primary key)\"\n" "\n" " print \"\\n\";\n" " \n" "print \" Number of rows: \", rows\n" "\n" "for row_index in range(rows):\n" " print \" row \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" value=\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n\";\n" " " msgstr "" "\n" "# Die aktuelle Verbindung zur Datenbank zum\n" "# Lesen aller Daten der aktuellen Tabelle verwenden.\n" "#\n" "# record.connection ist eine bereits geöffnetes gda.connection Objekt,\n" "# das uns ein Öffnen einer Verbindung erspart,\n" "# und selbst das Wissen über den Namen der Datenbank.\n" "\n" "query = \"SELECT * FROM %s\" % record.table_name\n" "command = gda.Command(query)\n" "data_model = record.connection.execute_single_command(command)\n" "\n" "rows = data_model.get_n_rows()\n" "columns = data_model.get_n_columns()\n" "print \" Number of columns: \", columns\n" "\n" "for i in range(columns):\n" " print \" column \", i;\n" " print \" name=\", data_model.get_column_title(i)\n" "\n" " # Herausfinden, ob es der Primärschlüssel ist:\n" " field = data_model.describe_column(i)\n" " if field.get_primary_key():\n" " print \" (primary key)\"\n" "\n" " print \"\\n\";\n" " \n" "print \" Number of rows: \", rows\n" "\n" "for row_index in range(rows):\n" " print \" row \", row_index;\n" "\n" " for col_index in range(columns):\n" " print \" value=\", data_model.get_value_at(col_index, row_index).get()\n" "\n" " print \"\\n\";\n" " " #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/glom.xml:0(None) msgid "translator-credits" msgstr "" "Mario Blättermann , 2008, 2010\n" "Christian Kirbach , 2010." #~ msgid "" #~ "@@image: 'figures/glom_tables.png'; md5=e725285aae974272ca99dc991c7ae9ed" #~ msgstr "ok" #~ msgid "" #~ "When you start Glom, the following window is " #~ "displayed." #~ msgstr "" #~ "Wenn Sie Glom starten, wird folgendes Fenster " #~ "angezeigt." #~ msgid "Shows Glom main window." #~ msgstr "Zeigt das Hauptfenster von Glom." #~ msgid "" #~ "(Note that the record.connection and record." #~ "table_name attributes are only available since Glom 1.1.6.)" #~ msgstr "" #~ "(Beachten Sie, dass die Attribute record.connection " #~ "und record.table_name erst seit Glom 1.1.6 verfügbar " #~ "sind.)" glom-1.22.4/docs/user-guide/de/glom.xml0000644000175000017500000014353112235000130021026 0ustar00murraycmurrayc00000000000000 ]>